ZGlmZiAtLWdpdCBhLy5naXRhdHRyaWJ1dGVzIGIvLmdpdGF0dHJpYnV0ZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5YzcxNQotLS0gL2Rldi9udWxsCisrKyBiLy5naXRhdHRyaWJ1dGVzCkBAIC0wLDAgKzEsMiBAQAorKiB3aGl0ZXNwYWNlPSFpbmRlbnQsdHJhaWwsc3BhY2UKKyouW2NoXSB3aGl0ZXNwYWNlCmRpZmYgLS1naXQgYS8uZ2l0aWdub3JlIGIvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmYyZmVjCi0tLSAvZGV2L251bGwKKysrIGIvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDE3MiBAQAorR0lULUJVSUxELU9QVElPTlMKK0dJVC1DRkxBR1MKK0dJVC1HVUktVkFSUworR0lULVZFUlNJT04tRklMRQorZ2l0CitnaXQtYWRkCitnaXQtYWRkLS1pbnRlcmFjdGl2ZQorZ2l0LWFtCitnaXQtYW5ub3RhdGUKK2dpdC1hcHBseQorZ2l0LWFyY2hpbXBvcnQKK2dpdC1hcmNoaXZlCitnaXQtYmlzZWN0CitnaXQtYmxhbWUKK2dpdC1icmFuY2gKK2dpdC1idW5kbGUKK2dpdC1jYXQtZmlsZQorZ2l0LWNoZWNrLWF0dHIKK2dpdC1jaGVjay1yZWYtZm9ybWF0CitnaXQtY2hlY2tvdXQKK2dpdC1jaGVja291dC1pbmRleAorZ2l0LWNoZXJyeQorZ2l0LWNoZXJyeS1waWNrCitnaXQtY2xlYW4KK2dpdC1jbG9uZQorZ2l0LWNvbW1pdAorZ2l0LWNvbW1pdC10cmVlCitnaXQtY29uZmlnCitnaXQtY291bnQtb2JqZWN0cworZ2l0LWN2c2V4cG9ydGNvbW1pdAorZ2l0LWN2c2ltcG9ydAorZ2l0LWN2c3NlcnZlcgorZ2l0LWRhZW1vbgorZ2l0LWRpZmYKK2dpdC1kaWZmLWZpbGVzCitnaXQtZGlmZi1pbmRleAorZ2l0LWRpZmYtdHJlZQorZ2l0LWRlc2NyaWJlCitnaXQtZmFzdC1leHBvcnQKK2dpdC1mYXN0LWltcG9ydAorZ2l0LWZldGNoCitnaXQtZmV0Y2gtLXRvb2wKK2dpdC1mZXRjaC1wYWNrCitnaXQtZmlsdGVyLWJyYW5jaAorZ2l0LWZtdC1tZXJnZS1tc2cKK2dpdC1mb3ItZWFjaC1yZWYKK2dpdC1mb3JtYXQtcGF0Y2gKK2dpdC1mc2NrCitnaXQtZnNjay1vYmplY3RzCitnaXQtZ2MKK2dpdC1nZXQtdGFyLWNvbW1pdC1pZAorZ2l0LWdyZXAKK2dpdC1oYXNoLW9iamVjdAorZ2l0LWh0dHAtZmV0Y2gKK2dpdC1odHRwLXB1c2gKK2dpdC1pbWFwLXNlbmQKK2dpdC1pbmRleC1wYWNrCitnaXQtaW5pdAorZ2l0LWluaXQtZGIKK2dpdC1pbnN0YXdlYgorZ2l0LWxvZworZ2l0LWxvc3QtZm91bmQKK2dpdC1scy1maWxlcworZ2l0LWxzLXJlbW90ZQorZ2l0LWxzLXRyZWUKK2dpdC1tYWlsaW5mbworZ2l0LW1haWxzcGxpdAorZ2l0LW1lcmdlCitnaXQtbWVyZ2UtYmFzZQorZ2l0LW1lcmdlLWluZGV4CitnaXQtbWVyZ2UtZmlsZQorZ2l0LW1lcmdlLXRyZWUKK2dpdC1tZXJnZS1vY3RvcHVzCitnaXQtbWVyZ2Utb25lLWZpbGUKK2dpdC1tZXJnZS1vdXJzCitnaXQtbWVyZ2UtcmVjdXJzaXZlCitnaXQtbWVyZ2UtcmVzb2x2ZQorZ2l0LW1lcmdlLXN0dXBpZAorZ2l0LW1lcmdlLXN1YnRyZWUKK2dpdC1tZXJnZXRvb2wKK2dpdC1ta3RhZworZ2l0LW1rdHJlZQorZ2l0LW5hbWUtcmV2CitnaXQtbXYKK2dpdC1wYWNrLXJlZHVuZGFudAorZ2l0LXBhY2stb2JqZWN0cworZ2l0LXBhY2stcmVmcworZ2l0LXBhcnNlLXJlbW90ZQorZ2l0LXBhdGNoLWlkCitnaXQtcGVlay1yZW1vdGUKK2dpdC1wcnVuZQorZ2l0LXBydW5lLXBhY2tlZAorZ2l0LXB1bGwKK2dpdC1wdXNoCitnaXQtcXVpbHRpbXBvcnQKK2dpdC1yZWFkLXRyZWUKK2dpdC1yZWJhc2UKK2dpdC1yZWJhc2UtLWludGVyYWN0aXZlCitnaXQtcmVjZWl2ZS1wYWNrCitnaXQtcmVmbG9nCitnaXQtcmVsaW5rCitnaXQtcmVtb3RlCitnaXQtcmVwYWNrCitnaXQtcmVwby1jb25maWcKK2dpdC1yZXF1ZXN0LXB1bGwKK2dpdC1yZXJlcmUKK2dpdC1yZXNldAorZ2l0LXJldi1saXN0CitnaXQtcmV2LXBhcnNlCitnaXQtcmV2ZXJ0CitnaXQtcm0KK2dpdC1zZW5kLWVtYWlsCitnaXQtc2VuZC1wYWNrCitnaXQtc2gtc2V0dXAKK2dpdC1zaGVsbAorZ2l0LXNob3J0bG9nCitnaXQtc2hvdworZ2l0LXNob3ctYnJhbmNoCitnaXQtc2hvdy1pbmRleAorZ2l0LXNob3ctcmVmCitnaXQtc3Rhc2gKK2dpdC1zdGF0dXMKK2dpdC1zdHJpcHNwYWNlCitnaXQtc3VibW9kdWxlCitnaXQtc3ZuCitnaXQtc3ltYm9saWMtcmVmCitnaXQtdGFnCitnaXQtdGFyLXRyZWUKK2dpdC11bnBhY2stZmlsZQorZ2l0LXVucGFjay1vYmplY3RzCitnaXQtdXBkYXRlLWluZGV4CitnaXQtdXBkYXRlLXJlZgorZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mbworZ2l0LXVwbG9hZC1hcmNoaXZlCitnaXQtdXBsb2FkLXBhY2sKK2dpdC12YXIKK2dpdC12ZXJpZnktcGFjaworZ2l0LXZlcmlmeS10YWcKK2dpdC13ZWItLWJyb3dzZQorZ2l0LXdoYXRjaGFuZ2VkCitnaXQtd3JpdGUtdHJlZQorZ2l0LWNvcmUtKi8/KgorZ2l0ay13aXNoCitnaXR3ZWIvZ2l0d2ViLmNnaQordGVzdC1hYnNvbHV0ZS1wYXRoCit0ZXN0LWNobXRpbWUKK3Rlc3QtZGF0ZQordGVzdC1kZWx0YQordGVzdC1kdW1wLWNhY2hlLXRyZWUKK3Rlc3QtZ2VucmFuZG9tCit0ZXN0LW1hdGNoLXRyZWVzCit0ZXN0LXBhcnNlLW9wdGlvbnMKK3Rlc3Qtc2hhMQorY29tbW9uLWNtZHMuaAorKi50YXIuZ3oKKyouZHNjCisqLmRlYgorZ2l0LnNwZWMKKyouZXhlCisqLlthb3NdCisqLnB5W2NvXQorY29uZmlnLm1haworYXV0b200dGUuY2FjaGUKK2NvbmZpZy5jYWNoZQorY29uZmlnLmxvZworY29uZmlnLnN0YXR1cworY29uZmlnLm1hay5hdXRvZ2VuCitjb25maWcubWFrLmFwcGVuZAorY29uZmlndXJlCit0YWdzCitUQUdTCitjc2NvcGUqCmRpZmYgLS1naXQgYS8ubWFpbG1hcCBiLy5tYWlsbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OGFlNzcKLS0tIC9kZXYvbnVsbAorKysgYi8ubWFpbG1hcApAQCAtMCwwICsxLDU1IEBACisjCisjIFRoaXMgbGlzdCBpcyB1c2VkIGJ5IGdpdC1zaG9ydGxvZyB0byBmaXggYSBmZXcgYm90Y2hlZCBuYW1lIHRyYW5zbGF0aW9ucworIyBpbiB0aGUgZ2l0IGFyY2hpdmUsIGVpdGhlciBiZWNhdXNlIHRoZSBhdXRob3IncyBmdWxsIG5hbWUgd2FzIG1lc3NlZCB1cAorIyBhbmQvb3Igbm90IGFsd2F5cyB3cml0dGVuIHRoZSBzYW1lIHdheSwgbWFraW5nIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUKKyMgc2FtZSBwZXJzb24gYXBwZWFyaW5nIG5vdCB0byBiZSBzby4KKyMKKworQW5lZXNoIEt1bWFyIEsuViA8YW5lZXNoLmt1bWFyQGdtYWlsLmNvbT4KK0JyaWFuIE0uIENhcmxzb24gPHNhbmRhbHNAY3J1c3R5dG9vdGhwYXN0ZS5hdGguY3g+CitDaHJpcyBTaG9lbWFrZXIgPGMuc2hvZW1ha2VyQGNveC5uZXQ+CitEYW5hIEwuIEhvdyA8ZGFuYWhvd0BnbWFpbC5jb20+CitEYW5hIEwuIEhvdyA8aG93QGRlYXRodmFsbGV5LmNzd2l0Y2guY29tPgorRGFuaWVsIEJhcmthbG93IDxiYXJrYWxvd0BpYWJlcnZvbi5vcmc+CitEYXZpZCBLw6VnZWRhbCA8ZGF2aWRrQGx5c2F0b3IubGl1LnNlPgorRnJlZHJpayBLdWl2aW5lbiA8ZnJla3UwNDVAc3R1ZGVudC5saXUuc2U+CitILiBQZXRlciBBbnZpbiA8aHBhQGJvbmRlLnNjLm9yaW9ubXVsdGkuY29tPgorSC4gUGV0ZXIgQW52aW4gPGhwYUB0YXplbmRhLnNjLm9yaW9ubXVsdGkuY29tPgorSC4gUGV0ZXIgQW52aW4gPGhwYUB0cmFudG9yLmhvcy5hbnZpbi5vcmc+CitIb3JzdCBILiB2b24gQnJhbmQgPHZvbmJyYW5kQGluZi51dGZzbS5jbD4KK0pheSBTb2ZmaWFuIDxqYXlzb2ZmaWFuK2dpdEBnbWFpbC5jb20+CitKb2FjaGltIEJlcmRhbCBIYWdhIDxjamhhZ2FAZnlzLnVpby5ubz4KK0pvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitKb24gU2V5bW91ciA8am9uQGJsYWNrY3ViZXMuZHluZG5zLm9yZz4KK0p1bmlvIEMgSGFtYW5vIDxqdW5pb0B0d2luc3VuLmNvbT4KK0thcmwgSGFzc2Vsc3Ryw7ZtIDxraGFAdHJlc2thbC5jb20+CitLZW50IEVuZ3N0cm9tIDxrZW50QGx5c2F0b3IubGl1LnNlPgorTGFycyBEb2VsbGUgPGxhcnMuZG9lbGxlQG9uLWxpbmUgISBkZT4KK0xhcnMgRG9lbGxlIDxsYXJzLmRvZWxsZUBvbi1saW5lLmRlPgorTGkgSG9uZyA8bGVlaG9uZ0Bwa3UuZWR1LmNuPgorTHVrYXMgU2FuZHN0csO2bSA8bHVrYXNzQGV0ZWsuY2hhbG1lcnMuc2U+CitNYXJ0aW4gTGFuZ2hvZmYgPG1hcnRpbkBjYXRhbHlzdC5uZXQubno+CitNaWNoYWVsIENvbGVtYW4gPHR1dHVmYW5AZ21haWwuY29tPgorTWljaGVsZSBCYWxsYWJpbyA8YmFycmFfY3VkYUBrYXRhbWFpbC5jb20+CitOYW5ha28gU2hpcmFpc2hpIDxuYW5ha28zQGJsdWVib3R0bGUuY29tPgorTmd1eeG7hW4gVGjDoWkgTmfhu41jIER1eSA8cGNsb3Vkc0BnbWFpbC5jb20+CitSYW1zYXkgQWxsYW4gSm9uZXMgPHJhbXNheUByYW1zYXkxLmRlbW9uLmNvLnVrPgorUmVuw6kgU2NoYXJmZSA8cmVuZS5zY2hhcmZlQGxzcmZpcmUuYXRoLmN4PgorUm9iZXJ0IEZpdHpzaW1vbnMgPHJvYmZpdHpAMjczay5uZXQ+CitTYW0gVmlsYWluIDxzYW1AdmlsYWluLm5ldD4KK1NhbnRpIELDqWphciA8c2JlamFyQGdtYWlsLmNvbT4KK1NlYW4gRXN0YWJyb29rcyA8c2VhbmxrbWxAc3ltcGF0aWNvLmNhPgorU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPgorU3RldmVuIEdyaW1tIDxrb3JldGhAbWlkd2ludGVyLmNvbT4KK1RoZW9kb3JlIFRzJ28gPHR5dHNvQG1pdC5lZHU+CitUb255IEx1Y2sgPHRvbnkubHVja0BpbnRlbC5jb20+CitVd2UgS2xlaW5lLUvDtm5pZyA8VXdlX1plaXNiZXJnZXJAZGlnaS5jb20+CitVd2UgS2xlaW5lLUvDtm5pZyA8VXdlLktsZWluZS1Lb2VuaWdAZGlnaS5jb20+CitVd2UgS2xlaW5lLUvDtm5pZyA8dWtsZWluZWtAaW5mb3JtYXRpay51bmktZnJlaWJ1cmcuZGU+CitVd2UgS2xlaW5lLUvDtm5pZyA8dXplaXNiZXJnZXJAaW8uZnNmb3J0aC5kZT4KK1V3ZSBLbGVpbmUtS8O2bmlnIDx6ZWlzYmVyZ0BpbmZvcm1hdGlrLnVuaS1mcmVpYnVyZy5kZT4KK1ZpbGxlIFNreXR0w6QgPHNjb3BAeGVtYWNzLm9yZz4KK1dpbGxpYW0gUHVyc2VsbCA8YmlsbC5wdXJzZWxsQGdtYWlsLmNvbT4KK1lPU0hJRlVKSSBIaWRlYWtpIDx5b3NoZnVqaUBsaW51eC1pcHY2Lm9yZz4KK2Fub255bW91cyA8bGludXhAaG9yaXpvbi5jb20+Cithbm9ueW1vdXMgPGxpbnV4QGhvcml6b24ubmV0PgpkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmODdjNAotLS0gL2Rldi9udWxsCisrKyBiL0NPUFlJTkcKQEAgLTAsMCArMSwzNjEgQEAKKworIE5vdGUgdGhhdCB0aGUgb25seSB2YWxpZCB2ZXJzaW9uIG9mIHRoZSBHUEwgYXMgZmFyIGFzIHRoaXMgcHJvamVjdAorIGlzIGNvbmNlcm5lZCBpcyBfdGhpc18gcGFydGljdWxhciB2ZXJzaW9uIG9mIHRoZSBsaWNlbnNlIChpZSB2Miwgbm90CisgdjIuMiBvciB2My54IG9yIHdoYXRldmVyKSwgdW5sZXNzIGV4cGxpY2l0bHkgb3RoZXJ3aXNlIHN0YXRlZC4KKworIEhPV0VWRVIsIGluIG9yZGVyIHRvIGFsbG93IGEgbWlncmF0aW9uIHRvIEdQTHYzIGlmIHRoYXQgc2VlbXMgbGlrZQorIGEgZ29vZCBpZGVhLCBJIGFsc28gYXNrIHRoYXQgcGVvcGxlIGludm9sdmVkIHdpdGggdGhlIHByb2plY3QgbWFrZQorIHRoZWlyIHByZWZlcmVuY2VzIGtub3duLiBJbiBwYXJ0aWN1bGFyLCBpZiB5b3UgdHJ1c3QgbWUgdG8gbWFrZSB0aGF0CisgZGVjaXNpb24sIHlvdSBtaWdodCBub3RlIHNvIGluIHlvdXIgY29weXJpZ2h0IG1lc3NhZ2UsIGllIHNvbWV0aGluZworIGxpa2UKKworCVRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMIHYyLCBvciBhIGxhdGVyIHZlcnNpb24KKwlhdCB0aGUgZGlzY3JldGlvbiBvZiBMaW51cy4KKworICBtaWdodCBhdm9pZCBpc3N1ZXMuIEJ1dCB3ZSBjYW4gYWxzbyBqdXN0IGRlY2lkZSB0byBzeW5jaHJvbml6ZSBhbmQKKyAgY29udGFjdCBhbGwgY29weXJpZ2h0IGhvbGRlcnMgb24gcmVjb3JkIGlmL3doZW4gdGhlIG9jY2FzaW9uIGFyaXNlcy4KKworCQkJTGludXMgVG9ydmFsZHMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcword2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciBuYW1lIG9mIGF1dGhvcgorICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKK2JlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQorbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQorICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCitwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQorY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCitsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi8uZ2l0YXR0cmlidXRlcyBiL0RvY3VtZW50YXRpb24vLmdpdGF0dHJpYnV0ZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiMDMwMQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vLmdpdGF0dHJpYnV0ZXMKQEAgLTAsMCArMSBAQAorKi50eHQgd2hpdGVzcGFjZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi8uZ2l0aWdub3JlIGIvRG9jdW1lbnRhdGlvbi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmOTM4ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uLy5naXRpZ25vcmUKQEAgLTAsMCArMSw4IEBACisqLnhtbAorKi5odG1sCisqLlsxLThdCisqLm1hZGUKK2dpdC5pbmZvCitob3d0by1pbmRleC50eHQKK2RvYy5kZXAKK2NtZHMtKi50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQ29kaW5nR3VpZGVsaW5lcyBiL0RvY3VtZW50YXRpb24vQ29kaW5nR3VpZGVsaW5lcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTRlYjkxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Db2RpbmdHdWlkZWxpbmVzCkBAIC0wLDAgKzEsMTI0IEBACitMaWtlIG90aGVyIHByb2plY3RzLCB3ZSBhbHNvIGhhdmUgc29tZSBndWlkZWxpbmVzIHRvIGtlZXAgdG8gdGhlCitjb2RlLiAgRm9yIGdpdCBpbiBnZW5lcmFsLCB0aHJlZSByb3VnaCBydWxlcyBhcmU6CisKKyAtIE1vc3QgaW1wb3J0YW50bHksIHdlIG5ldmVyIHNheSAiSXQncyBpbiBQT1NJWDsgd2UnbGwgaGFwcGlseQorICAgaWdub3JlIHlvdXIgbmVlZHMgc2hvdWxkIHlvdXIgc3lzdGVtIG5vdCBjb25mb3JtIHRvIGl0LiIKKyAgIFdlIGxpdmUgaW4gdGhlIHJlYWwgd29ybGQuCisKKyAtIEhvd2V2ZXIsIHdlIG9mdGVuIHNheSAiTGV0J3Mgc3RheSBhd2F5IGZyb20gdGhhdCBjb25zdHJ1Y3QsCisgICBpdCdzIG5vdCBldmVuIGluIFBPU0lYIi4KKworIC0gSW4gc3BpdGUgb2YgdGhlIGFib3ZlIHR3byBydWxlcywgd2Ugc29tZXRpbWVzIHNheSAiQWx0aG91Z2gKKyAgIHRoaXMgaXMgbm90IGluIFBPU0lYLCBpdCAoaXMgc28gY29udmVuaWVudCB8IG1ha2VzIHRoZSBjb2RlCisgICBtdWNoIG1vcmUgcmVhZGFibGUgfCBoYXMgb3RoZXIgZ29vZCBjaGFyYWN0ZXJpc3RpY3MpIGFuZAorICAgcHJhY3RpY2FsbHkgYWxsIHRoZSBwbGF0Zm9ybXMgd2UgY2FyZSBhYm91dCBzdXBwb3J0IGl0LCBzbworICAgbGV0J3MgdXNlIGl0Ii4KKworICAgQWdhaW4sIHdlIGxpdmUgaW4gdGhlIHJlYWwgd29ybGQsIGFuZCBpdCBpcyBzb21ldGltZXMgYQorICAganVkZ2VtZW50IGNhbGwsIHRoZSBkZWNpc2lvbiBiYXNlZCBtb3JlIG9uIHJlYWwgd29ybGQKKyAgIGNvbnN0cmFpbnRzIHBlb3BsZSBmYWNlIHRoYW4gd2hhdCB0aGUgcGFwZXIgc3RhbmRhcmQgc2F5cy4KKworCitBcyBmb3IgbW9yZSBjb25jcmV0ZSBndWlkZWxpbmVzLCBqdXN0IGltaXRhdGUgdGhlIGV4aXN0aW5nIGNvZGUKKyh0aGlzIGlzIGEgZ29vZCBndWlkZWxpbmUsIG5vIG1hdHRlciB3aGljaCBwcm9qZWN0IHlvdSBhcmUKK2NvbnRyaWJ1dGluZyB0bykuICBCdXQgaWYgeW91IG11c3QgaGF2ZSBhIGxpc3Qgb2YgcnVsZXMsCitoZXJlIHRoZXkgYXJlLgorCitGb3Igc2hlbGwgc2NyaXB0cyBzcGVjaWZpY2FsbHkgKG5vdCBleGhhdXN0aXZlKToKKworIC0gV2UgcHJlZmVyICQoIC4uLiApIGZvciBjb21tYW5kIHN1YnN0aXR1dGlvbjsgdW5saWtlIGBgLCBpdAorICAgcHJvcGVybHkgbmVzdHMuICBJdCBzaG91bGQgaGF2ZSBiZWVuIHRoZSB3YXkgQm91cm5lIHNwZWxsZWQKKyAgIGl0IGZyb20gZGF5IG9uZSwgYnV0IHVuZm9ydHVuYXRlbHkgaXNuJ3QuCisKKyAtIFdlIHVzZSAke3BhcmFtZXRlci13b3JkfSBhbmQgaXRzIFstPT8rXSBzaWJsaW5ncywgYW5kIHRoZWlyCisgICBjb2xvbidlZCAidW5zZXQgb3IgbnVsbCIgZm9ybS4KKworIC0gV2UgdXNlICR7cGFyYW1ldGVyI3dvcmR9IGFuZCBpdHMgWyMlXSBzaWJsaW5ncywgYW5kIHRoZWlyCisgICBkb3VibGVkICJsb25nZXN0IG1hdGNoaW5nIiBmb3JtLgorCisgLSBXZSB1c2UgQXJpdGhtZXRpYyBFeHBhbnNpb24gJCgoIC4uLiApKS4KKworIC0gTm8gIlN1YnN0cmluZyBFeHBhbnNpb24iICR7cGFyYW1ldGVyOm9mZnNldDpsZW5ndGh9LgorCisgLSBObyBzaGVsbCBhcnJheXMuCisKKyAtIE5vIHN0cmxlbiAkeyNwYXJhbWV0ZXJ9LgorCisgLSBObyByZWdleHAgJHtwYXJhbWV0ZXIvcGF0dGVybi9zdHJpbmd9LgorCisgLSBXZSBkbyBub3QgdXNlIFByb2Nlc3MgU3Vic3RpdHV0aW9uIDwobGlzdCkgb3IgPihsaXN0KS4KKworIC0gV2UgcHJlZmVyICJ0ZXN0IiBvdmVyICJbIC4uLiBdIi4KKworIC0gV2UgZG8gbm90IHdyaXRlIHRoZSBub2lzZXdvcmQgImZ1bmN0aW9uIiBpbiBmcm9udCBvZiBzaGVsbAorICAgZnVuY3Rpb25zLgorCisgLSBBcyB0byB1c2Ugb2YgZ3JlcCwgc3RpY2sgdG8gYSBzdWJzZXQgb2YgQlJFIChuYW1lbHksIG5vIFx7bSxuXH0sCisgICBbOjpdLCBbPT1dLCBub3IgWy4uXSkgZm9yIHBvcnRhYmlsaXR5LgorCisgICAtIFdlIGRvIG5vdCB1c2UgXHttLG5cfTsKKworICAgLSBXZSBkbyBub3QgdXNlIC1FOworCisgICAtIFdlIGRvIG5vdCB1c2UgPyBub3IgKyAod2hpY2ggYXJlIFx7MCwxXH0gYW5kIFx7MSxcfQorICAgICByZXNwZWN0aXZlbHkgaW4gQlJFKSBidXQgdGhhdCBnb2VzIHdpdGhvdXQgc2F5aW5nIGFzIHRoZXNlCisgICAgIGFyZSBFUkUgZWxlbWVudHMgbm90IEJSRSAobm90ZSB0aGF0IFw/IGFuZCBcKyBhcmUgbm90IGV2ZW4gcGFydAorICAgICBvZiBCUkUgLS0gbWFraW5nIHRoZW0gYWNjZXNzaWJsZSBmcm9tIEJSRSBpcyBhIEdOVSBleHRlbnNpb24pLgorCitGb3IgQyBwcm9ncmFtczoKKworIC0gV2UgdXNlIHRhYnMgdG8gaW5kZW50LCBhbmQgaW50ZXJwcmV0IHRhYnMgYXMgdGFraW5nIHVwIHRvCisgICA4IHNwYWNlcy4KKworIC0gV2UgdHJ5IHRvIGtlZXAgdG8gYXQgbW9zdCA4MCBjaGFyYWN0ZXJzIHBlciBsaW5lLgorCisgLSBXaGVuIGRlY2xhcmluZyBwb2ludGVycywgdGhlIHN0YXIgc2lkZXMgd2l0aCB0aGUgdmFyaWFibGUKKyAgIG5hbWUsIGkuZS4gImNoYXIgKnN0cmluZyIsIG5vdCAiY2hhciogc3RyaW5nIiBvcgorICAgImNoYXIgKiBzdHJpbmciLiAgVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8gdW5kZXJzdGFuZCBjb2RlCisgICBsaWtlICJjaGFyICpzdHJpbmcsIGM7Ii4KKworIC0gV2UgYXZvaWQgdXNpbmcgYnJhY2VzIHVubmVjZXNzYXJpbHkuICBJLmUuCisKKwlpZiAoYmxhKSB7CisJCXggPSAxOworCX0KKworICAgaXMgZnJvd25lZCB1cG9uLiAgQSBncmF5IGFyZWEgaXMgd2hlbiB0aGUgc3RhdGVtZW50IGV4dGVuZHMKKyAgIG92ZXIgYSBmZXcgbGluZXMsIGFuZC9vciB5b3UgaGF2ZSBhIGxlbmd0aHkgY29tbWVudCBhdG9wIG9mCisgICBpdC4gIEFsc28sIGxpa2UgaW4gdGhlIExpbnV4IGtlcm5lbCwgaWYgdGhlcmUgaXMgYSBsb25nIGxpc3QKKyAgIG9mICJlbHNlIGlmIiBzdGF0ZW1lbnRzLCBpdCBjYW4gbWFrZSBzZW5zZSB0byBhZGQgYnJhY2VzIHRvCisgICBzaW5nbGUgbGluZSBibG9ja3MuCisKKyAtIFRyeSB0byBtYWtlIHlvdXIgY29kZSB1bmRlcnN0YW5kYWJsZS4gIFlvdSBtYXkgcHV0IGNvbW1lbnRzCisgICBpbiwgYnV0IGNvbW1lbnRzIGludmFyaWFibHkgdGVuZCB0byBzdGFsZSBvdXQgd2hlbiB0aGUgY29kZQorICAgdGhleSB3ZXJlIGRlc2NyaWJpbmcgY2hhbmdlcy4gIE9mdGVuIHNwbGl0dGluZyBhIGZ1bmN0aW9uCisgICBpbnRvIHR3byBtYWtlcyB0aGUgaW50ZW50aW9uIG9mIHRoZSBjb2RlIG11Y2ggY2xlYXJlci4KKworIC0gRG91YmxlIG5lZ2F0aW9uIGlzIG9mdGVuIGhhcmRlciB0byB1bmRlcnN0YW5kIHRoYW4gbm8gbmVnYXRpb24KKyAgIGF0IGFsbC4KKworIC0gU29tZSBjbGV2ZXIgdHJpY2tzLCBsaWtlIHVzaW5nIHRoZSAhISBvcGVyYXRvciB3aXRoIGFyaXRobWV0aWMKKyAgIGNvbnN0cnVjdHMsIGNhbiBiZSBleHRyZW1lbHkgY29uZnVzaW5nIHRvIG90aGVycy4gIEF2b2lkIHRoZW0sCisgICB1bmxlc3MgdGhlcmUgaXMgYSBjb21wZWxsaW5nIHJlYXNvbiB0byB1c2UgdGhlbS4KKworIC0gVXNlIHRoZSBBUEkuICBObywgcmVhbGx5LiAgV2UgaGF2ZSBhIHN0cmJ1ZiAodmFyaWFibGUgbGVuZ3RoCisgICBzdHJpbmcpLCBzZXZlcmFsIGFycmF5cyB3aXRoIHRoZSBBTExPQ19HUk9XKCkgbWFjcm8sIGEKKyAgIHBhdGhfbGlzdCBmb3Igc29ydGVkIHN0cmluZyBsaXN0cywgYSBoYXNoIG1hcCAobWFwcGluZyBzdHJ1Y3QKKyAgIG9iamVjdHMpIG5hbWVkICJzdHJ1Y3QgZGVjb3JhdGUiLCBhbW9uZ3N0IG90aGVyIHRoaW5ncy4KKworIC0gV2hlbiB5b3UgY29tZSB1cCB3aXRoIGFuIEFQSSwgZG9jdW1lbnQgaXQuCisKKyAtIFRoZSBmaXJzdCAjaW5jbHVkZSBpbiBDIGZpbGVzLCBleGNlcHQgaW4gcGxhdGZvcm0gc3BlY2lmaWMKKyAgIGNvbXBhdC8gaW1wbGVtZW50YXRpb25zLCBzaG91bGQgYmUgZ2l0LWNvbXBhdC11dGlsLmggb3IgYW5vdGhlcgorICAgaGVhZGVyIGZpbGUgdGhhdCBpbmNsdWRlcyBpdCwgc3VjaCBhcyBjYWNoZS5oIG9yIGJ1aWx0aW4uaC4KKworIC0gSWYgeW91IGFyZSBwbGFubmluZyBhIG5ldyBjb21tYW5kLCBjb25zaWRlciB3cml0aW5nIGl0IGluIHNoZWxsCisgICBvciBwZXJsIGZpcnN0LCBzbyB0aGF0IGNoYW5nZXMgaW4gc2VtYW50aWNzIGNhbiBiZSBlYXNpbHkKKyAgIGNoYW5nZWQgYW5kIGRpc2N1c3NlZC4gIE1hbnkgZ2l0IGNvbW1hbmRzIHN0YXJ0ZWQgb3V0IGxpa2UKKyAgIHRoYXQsIGFuZCBhIGZldyBhcmUgc3RpbGwgc2NyaXB0cy4KKworIC0gQXZvaWQgaW50cm9kdWNpbmcgYSBuZXcgZGVwZW5kZW5jeSBpbnRvIGdpdC4gVGhpcyBtZWFucyB5b3UKKyAgIHVzdWFsbHkgc2hvdWxkIHN0YXkgYXdheSBmcm9tIHNjcmlwdGluZyBsYW5ndWFnZXMgbm90IGFscmVhZHkKKyAgIHVzZWQgaW4gdGhlIGdpdCBjb3JlIGNvbW1hbmQgc2V0ICh1bmxlc3MgeW91ciBjb21tYW5kIGlzIGNsZWFybHkKKyAgIHNlcGFyYXRlIGZyb20gaXQsIHN1Y2ggYXMgYW4gaW1wb3J0ZXIgdG8gY29udmVydCByYW5kb20tc2NtLVgKKyAgIHJlcG9zaXRvcmllcyB0byBnaXQpLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9NYWtlZmlsZSBiL0RvY3VtZW50YXRpb24vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3ODFmYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vTWFrZWZpbGUKQEAgLTAsMCArMSwyMzIgQEAKK01BTjFfVFhUPSBcCisJJChmaWx0ZXItb3V0ICQoYWRkc3VmZml4IC50eHQsICQoQVJUSUNMRVMpICQoU1BfQVJUSUNMRVMpKSwgXAorCQkkKHdpbGRjYXJkIGdpdC0qLnR4dCkpIFwKKwlnaXRrLnR4dAorTUFONV9UWFQ9Z2l0YXR0cmlidXRlcy50eHQgZ2l0aWdub3JlLnR4dCBnaXRjbGkudHh0IGdpdG1vZHVsZXMudHh0CitNQU43X1RYVD1naXQudHh0CisKK01BTl9UWFQgPSAkKE1BTjFfVFhUKSAkKE1BTjVfVFhUKSAkKE1BTjdfVFhUKQorTUFOX1hNTD0kKHBhdHN1YnN0ICUudHh0LCUueG1sLCQoTUFOX1RYVCkpCitNQU5fSFRNTD0kKHBhdHN1YnN0ICUudHh0LCUuaHRtbCwkKE1BTl9UWFQpKQorCitET0NfSFRNTD0kKE1BTl9IVE1MKQorCitBUlRJQ0xFUyA9IHR1dG9yaWFsCitBUlRJQ0xFUyArPSB0dXRvcmlhbC0yCitBUlRJQ0xFUyArPSBjb3JlLXR1dG9yaWFsCitBUlRJQ0xFUyArPSBjdnMtbWlncmF0aW9uCitBUlRJQ0xFUyArPSBkaWZmY29yZQorQVJUSUNMRVMgKz0gaG93dG8taW5kZXgKK0FSVElDTEVTICs9IHJlcG9zaXRvcnktbGF5b3V0CitBUlRJQ0xFUyArPSBob29rcworQVJUSUNMRVMgKz0gZXZlcnlkYXkKK0FSVElDTEVTICs9IGdpdC10b29scworQVJUSUNMRVMgKz0gZ2xvc3NhcnkKKyMgd2l0aCB0aGVpciBvd24gZm9ybWF0dGluZyBydWxlcy4KK1NQX0FSVElDTEVTID0gaG93dG8vcmV2ZXJ0LWJyYW5jaC1yZWJhc2UgaG93dG8vdXNpbmctbWVyZ2Utc3VidHJlZSB1c2VyLW1hbnVhbAorQVBJX0RPQ1MgPSAkKHBhdHN1YnN0ICUudHh0LCUsJChmaWx0ZXItb3V0IHRlY2huaWNhbC9hcGktaW5kZXgtc2tlbC50eHQgdGVjaG5pY2FsL2FwaS1pbmRleC50eHQsICQod2lsZGNhcmQgdGVjaG5pY2FsL2FwaS0qLnR4dCkpKQorU1BfQVJUSUNMRVMgKz0gJChBUElfRE9DUykKK1NQX0FSVElDTEVTICs9IHRlY2huaWNhbC9hcGktaW5kZXgKKworRE9DX0hUTUwgKz0gJChwYXRzdWJzdCAlLCUuaHRtbCwkKEFSVElDTEVTKSAkKFNQX0FSVElDTEVTKSkKKworRE9DX01BTjE9JChwYXRzdWJzdCAlLnR4dCwlLjEsJChNQU4xX1RYVCkpCitET0NfTUFONT0kKHBhdHN1YnN0ICUudHh0LCUuNSwkKE1BTjVfVFhUKSkKK0RPQ19NQU43PSQocGF0c3Vic3QgJS50eHQsJS43LCQoTUFON19UWFQpKQorCitwcmVmaXg/PSQoSE9NRSkKK2JpbmRpcj89JChwcmVmaXgpL2JpbgoraHRtbGRpcj89JChwcmVmaXgpL3NoYXJlL2RvYy9naXQtZG9jCittYW5kaXI/PSQocHJlZml4KS9zaGFyZS9tYW4KK21hbjFkaXI9JChtYW5kaXIpL21hbjEKK21hbjVkaXI9JChtYW5kaXIpL21hbjUKK21hbjdkaXI9JChtYW5kaXIpL21hbjcKKyMgREVTVERJUj0KKworQVNDSUlET0M9YXNjaWlkb2MKK0FTQ0lJRE9DX0VYVFJBID0KK01BTlBBR0VfWFNMID0gY2FsbG91dHMueHNsCitJTlNUQUxMPz1pbnN0YWxsCitSTSA/PSBybSAtZgorRE9DX1JFRiA9IG9yaWdpbi9tYW4KKworaW5mb2Rpcj89JChwcmVmaXgpL3NoYXJlL2luZm8KK01BS0VJTkZPPW1ha2VpbmZvCitJTlNUQUxMX0lORk89aW5zdGFsbC1pbmZvCitET0NCT09LMlhfVEVYST1kb2Nib29rMngtdGV4aQoraWZuZGVmIFBFUkxfUEFUSAorCVBFUkxfUEFUSCA9IC91c3IvYmluL3BlcmwKK2VuZGlmCisKKy1pbmNsdWRlIC4uL2NvbmZpZy5tYWsuYXV0b2dlbgorLWluY2x1ZGUgLi4vY29uZmlnLm1haworCitpZmRlZiBBU0NJSURPQzgKK0FTQ0lJRE9DX0VYVFJBICs9IC1hIGFzY2lpZG9jN2NvbXBhdGlibGUKK2VuZGlmCitpZmRlZiBET0NCT09LX1hTTF8xNzIKK0FTQ0lJRE9DX0VYVFJBICs9IC1hIGRvY2Jvb2steHNsLTE3MgorTUFOUEFHRV9YU0wgPSBtYW5wYWdlLTEuNzIueHNsCitlbmRpZgorCisjCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlcmUgaXMgYSBtaW5vciBidWcgaW4gYXNjaWlkb2MuCisjIFRoZSB2ZXJzaW9uIGFmdGVyIDYuMC4zIF93aWxsXyBpbmNsdWRlIHRoZSBwYXRjaCBmb3VuZCBoZXJlOgorIyAgIGh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9Z2l0Jm09MTExNTU4NzU3MjAyMjQzJnc9MgorIworIyBVbnRpbCB0aGF0IHZlcnNpb24gaXMgcmVsZWFzZWQgeW91IG1heSBoYXZlIHRvIGFwcGx5IHRoZSBwYXRjaAorIyB5b3Vyc2VsZiAtIHllcywgYWxsIDYgY2hhcmFjdGVycyBvZiBpdCEKKyMKKworYWxsOiBodG1sIG1hbgorCitodG1sOiAkKERPQ19IVE1MKQorCiskKERPQ19IVE1MKSAkKERPQ19NQU4xKSAkKERPQ19NQU41KSAkKERPQ19NQU43KTogYXNjaWlkb2MuY29uZgorCittYW46IG1hbjEgbWFuNSBtYW43CittYW4xOiAkKERPQ19NQU4xKQorbWFuNTogJChET0NfTUFONSkKK21hbjc6ICQoRE9DX01BTjcpCisKK2luZm86IGdpdC5pbmZvIGdpdG1hbi5pbmZvCisKK2luc3RhbGw6IG1hbgorCSQoSU5TVEFMTCkgLWQgLW0gNzU1ICQoREVTVERJUikkKG1hbjFkaXIpCisJJChJTlNUQUxMKSAtZCAtbSA3NTUgJChERVNURElSKSQobWFuNWRpcikKKwkkKElOU1RBTEwpIC1kIC1tIDc1NSAkKERFU1RESVIpJChtYW43ZGlyKQorCSQoSU5TVEFMTCkgLW0gNjQ0ICQoRE9DX01BTjEpICQoREVTVERJUikkKG1hbjFkaXIpCisJJChJTlNUQUxMKSAtbSA2NDQgJChET0NfTUFONSkgJChERVNURElSKSQobWFuNWRpcikKKwkkKElOU1RBTEwpIC1tIDY0NCAkKERPQ19NQU43KSAkKERFU1RESVIpJChtYW43ZGlyKQorCitpbnN0YWxsLWluZm86IGluZm8KKwkkKElOU1RBTEwpIC1kIC1tIDc1NSAkKERFU1RESVIpJChpbmZvZGlyKQorCSQoSU5TVEFMTCkgLW0gNjQ0IGdpdC5pbmZvIGdpdG1hbi5pbmZvICQoREVTVERJUikkKGluZm9kaXIpCisJaWYgdGVzdCAtciAkKERFU1RESVIpJChpbmZvZGlyKS9kaXI7IHRoZW4gXAorCSAgJChJTlNUQUxMX0lORk8pIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgZ2l0LmluZm8gO1wKKwkgICQoSU5TVEFMTF9JTkZPKSAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpIGdpdG1hbi5pbmZvIDtcCisJZWxzZSBcCisJICBlY2hvICJObyBkaXJlY3RvcnkgZm91bmQgaW4gJChERVNURElSKSQoaW5mb2RpcikiID4mMiA7IFwKKwlmaQorCitpbnN0YWxsLWh0bWw6IGh0bWwKKwlzaCAuL2luc3RhbGwtd2ViZG9jLnNoICQoREVTVERJUikkKGh0bWxkaXIpCisKKy4uL0dJVC1WRVJTSU9OLUZJTEU6IC5GT1JDRS1HSVQtVkVSU0lPTi1GSUxFCisJJChNQUtFKSAtQyAuLi8gR0lULVZFUlNJT04tRklMRQorCistaW5jbHVkZSAuLi9HSVQtVkVSU0lPTi1GSUxFCisKKyMKKyMgRGV0ZXJtaW5lICJpbmNsdWRlOjoiIGZpbGUgcmVmZXJlbmNlcyBpbiBhc2NpaWRvYyBmaWxlcy4KKyMKK2RvYy5kZXAgOiAkKHdpbGRjYXJkICoudHh0KSBidWlsZC1kb2NkZXAucGVybAorCSQoUk0pICRAKyAkQAorCSQoUEVSTF9QQVRIKSAuL2J1aWxkLWRvY2RlcC5wZXJsID4kQCsKKwltdiAkQCsgJEAKKworLWluY2x1ZGUgZG9jLmRlcAorCitjbWRzX3R4dCA9IGNtZHMtYW5jaWxsYXJ5aW50ZXJyb2dhdG9ycy50eHQgXAorCWNtZHMtYW5jaWxsYXJ5bWFuaXB1bGF0b3JzLnR4dCBcCisJY21kcy1tYWlucG9yY2VsYWluLnR4dCBcCisJY21kcy1wbHVtYmluZ2ludGVycm9nYXRvcnMudHh0IFwKKwljbWRzLXBsdW1iaW5nbWFuaXB1bGF0b3JzLnR4dCBcCisJY21kcy1zeW5jaGluZ3JlcG9zaXRvcmllcy50eHQgXAorCWNtZHMtc3luY2hlbHBlcnMudHh0IFwKKwljbWRzLXB1cmVoZWxwZXJzLnR4dCBcCisJY21kcy1mb3JlaWduc2NtaW50ZXJmYWNlLnR4dAorCiskKGNtZHNfdHh0KTogY21kLWxpc3QubWFkZQorCitjbWQtbGlzdC5tYWRlOiBjbWQtbGlzdC5wZXJsIC4uL2NvbW1hbmQtbGlzdC50eHQgJChNQU4xX1RYVCkKKwkkKFJNKSAkQAorCSQoUEVSTF9QQVRIKSAuL2NtZC1saXN0LnBlcmwgLi4vY29tbWFuZC1saXN0LnR4dAorCWRhdGUgPiRACisKK2dpdC43IGdpdC5odG1sOiBnaXQudHh0CisKK2NsZWFuOgorCSQoUk0pICoueG1sICoueG1sKyAqLmh0bWwgKi5odG1sKyAqLjEgKi41ICouNworCSQoUk0pICoudGV4aSAqLnRleGkrIGdpdC5pbmZvIGdpdG1hbi5pbmZvCisJJChSTSkgaG93dG8taW5kZXgudHh0IGhvd3RvLyouaHRtbCBkb2MuZGVwCisJJChSTSkgdGVjaG5pY2FsL2FwaS0qLmh0bWwgdGVjaG5pY2FsL2FwaS1pbmRleC50eHQKKwkkKFJNKSAkKGNtZHNfdHh0KSAqLm1hZGUKKworJChNQU5fSFRNTCk6ICUuaHRtbCA6ICUudHh0CisJJChSTSkgJEArICRACisJJChBU0NJSURPQykgLWIgeGh0bWwxMSAtZCBtYW5wYWdlIC1mIGFzY2lpZG9jLmNvbmYgXAorCQkkKEFTQ0lJRE9DX0VYVFJBKSAtYWdpdF92ZXJzaW9uPSQoR0lUX1ZFUlNJT04pIC1vICRAKyAkPAorCW12ICRAKyAkQAorCislLjEgJS41ICUuNyA6ICUueG1sCisJJChSTSkgJEAKKwl4bWx0byAtbSAkKE1BTlBBR0VfWFNMKSBtYW4gJDwKKworJS54bWwgOiAlLnR4dAorCSQoUk0pICRAKyAkQAorCSQoQVNDSUlET0MpIC1iIGRvY2Jvb2sgLWQgbWFucGFnZSAtZiBhc2NpaWRvYy5jb25mIFwKKwkJJChBU0NJSURPQ19FWFRSQSkgLWFnaXRfdmVyc2lvbj0kKEdJVF9WRVJTSU9OKSAtbyAkQCsgJDwKKwltdiAkQCsgJEAKKwordXNlci1tYW51YWwueG1sOiB1c2VyLW1hbnVhbC50eHQgdXNlci1tYW51YWwuY29uZgorCSQoQVNDSUlET0MpIC1iIGRvY2Jvb2sgLWQgYm9vayAkPAorCit0ZWNobmljYWwvYXBpLWluZGV4LnR4dDogdGVjaG5pY2FsL2FwaS1pbmRleC1za2VsLnR4dCBcCisJdGVjaG5pY2FsL2FwaS1pbmRleC5zaCAkKHBhdHN1YnN0ICUsJS50eHQsJChBUElfRE9DUykpCisJY2QgdGVjaG5pY2FsICYmIHNoIC4vYXBpLWluZGV4LnNoCisKKyQocGF0c3Vic3QgJSwlLmh0bWwsJChBUElfRE9DUykgdGVjaG5pY2FsL2FwaS1pbmRleCk6ICUuaHRtbCA6ICUudHh0CisJJChBU0NJSURPQykgLWIgeGh0bWwxMSAtZiBhc2NpaWRvYy5jb25mIFwKKwkJJChBU0NJSURPQ19FWFRSQSkgLWFnaXRfdmVyc2lvbj0kKEdJVF9WRVJTSU9OKSAkKi50eHQKKworWFNMVCA9IGRvY2Jvb2sueHNsCitYU0xUT1BUUyA9IC0teGluY2x1ZGUgLS1zdHJpbmdwYXJhbSBodG1sLnN0eWxlc2hlZXQgZG9jYm9vay14c2wuY3NzCisKK3VzZXItbWFudWFsLmh0bWw6IHVzZXItbWFudWFsLnhtbAorCXhzbHRwcm9jICQoWFNMVE9QVFMpIC1vICRAICQoWFNMVCkgJDwKKworZ2l0LmluZm86IHVzZXItbWFudWFsLnRleGkKKwkkKE1BS0VJTkZPKSAtLW5vLXNwbGl0IC1vICRAIHVzZXItbWFudWFsLnRleGkKKwordXNlci1tYW51YWwudGV4aTogdXNlci1tYW51YWwueG1sCisJJChSTSkgJEArICRACisJJChET0NCT09LMlhfVEVYSSkgdXNlci1tYW51YWwueG1sIC0tdG8tc3Rkb3V0IHwgJChQRVJMX1BBVEgpIGZpeC10ZXhpLnBlcmwgPiRAKworCW12ICRAKyAkQAorCitnaXRtYW4udGV4aTogJChNQU5fWE1MKSBjYXQtdGV4aS5wZXJsCisJJChSTSkgJEArICRACisJKCQoZm9yZWFjaCB4bWwsJChNQU5fWE1MKSwkKERPQ0JPT0syWF9URVhJKSAtLXRvLXN0ZG91dCAkKHhtbCk7KSkgfCBcCisJJChQRVJMX1BBVEgpIGNhdC10ZXhpLnBlcmwgJEAgPiRAKworCW12ICRAKyAkQAorCitnaXRtYW4uaW5mbzogZ2l0bWFuLnRleGkKKwkkKE1BS0VJTkZPKSAtLW5vLXNwbGl0ICQqLnRleGkKKworJChwYXRzdWJzdCAlLnR4dCwlLnRleGksJChNQU5fVFhUKSk6ICUudGV4aSA6ICUueG1sCisJJChSTSkgJEArICRACisJJChET0NCT09LMlhfVEVYSSkgLS10by1zdGRvdXQgJCoueG1sID4kQCsKKwltdiAkQCsgJEAKKworaG93dG8taW5kZXgudHh0OiBob3d0by1pbmRleC5zaCAkKHdpbGRjYXJkIGhvd3RvLyoudHh0KQorCSQoUk0pICRAKyAkQAorCXNoIC4vaG93dG8taW5kZXguc2ggJCh3aWxkY2FyZCBob3d0by8qLnR4dCkgPiRAKworCW12ICRAKyAkQAorCiskKHBhdHN1YnN0ICUsJS5odG1sLCQoQVJUSUNMRVMpKSA6ICUuaHRtbCA6ICUudHh0CisJJChBU0NJSURPQykgLWIgeGh0bWwxMSAkKi50eHQKKworV0VCRE9DX0RFU1QgPSAvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcworCiskKHBhdHN1YnN0ICUudHh0LCUuaHRtbCwkKHdpbGRjYXJkIGhvd3RvLyoudHh0KSk6ICUuaHRtbCA6ICUudHh0CisJJChSTSkgJEArICRACisJc2VkIC1lICcxLC9eJCQvZCcgJDwgfCAkKEFTQ0lJRE9DKSAtYiB4aHRtbDExIC0gPiRAKworCW12ICRAKyAkQAorCitpbnN0YWxsLXdlYmRvYyA6IGh0bWwKKwlzaCAuL2luc3RhbGwtd2ViZG9jLnNoICQoV0VCRE9DX0RFU1QpCisKK3F1aWNrLWluc3RhbGw6CisJc2ggLi9pbnN0YWxsLWRvYy1xdWljay5zaCAkKERPQ19SRUYpICQoREVTVERJUikkKG1hbmRpcikKKworLlBIT05ZOiAuRk9SQ0UtR0lULVZFUlNJT04tRklMRQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMC4xLnR4dCBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjAuMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVhM2Y5OQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjAuMS50eHQKQEAgLTAsMCArMSw0MiBAQAorR0lUIHYxLjUuMC4xIFJlbGVhc2UgTm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZpeGVzIHNpbmNlIHYxLjUuMAorLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogRG9jdW1lbnRhdGlvbiB1cGRhdGVzCisKKyAgLSBDbGFyaWZpY2F0aW9ucyBhbmQgY29ycmVjdGlvbnMgdG8gMS41LjAgcmVsZWFzZSBub3Rlcy4KKworICAtIFRoZSBtYWluIGRvY3VtZW50YXRpb24gZGlkIG5vdCBsaW5rIHRvIGdpdC1yZW1vdGUgZG9jdW1lbnRhdGlvbi4KKworICAtIENsYXJpZmllZCBpbnRyb2R1Y3RvcnkgdGV4dCBvZiBnaXQtcmViYXNlIGRvY3VtZW50YXRpb24uCisKKyAgLSBDb252ZXJ0ZWQgcmVtYWluaW5nIG1lbnRpb25zIG9mIHVwZGF0ZS1pbmRleCBvbiBQb3JjZWxhaW4KKyAgICBkb2N1bWVudHMgdG8gZ2l0LWFkZC9naXQtcm0uCisKKyAgLSBTb21lIGkxOG4uKiBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyB3ZXJlIGluY29ycmVjdGx5CisgICAgZGVzY3JpYmVkIGFzIGNvcmUuKjsgZml4ZWQuCisKKyogQnVnZml4ZXMKKworICAtIGdpdC1hZGQgYW5kIGdpdC11cGRhdGUtaW5kZXggb24gYSBmaWxlc3lzdGVtIG9uIHdoaWNoCisgICAgZXhlY3V0YWJsZSBiaXRzIGFyZSB1bnJlbGlhYmxlIGluY29ycmVjdGx5IHJldXNlZCBzdF9tb2RlCisgICAgYml0cyBldmVuIHdoZW4gdGhlIHBhdGggY2hhbmdlZCBiZXR3ZWVuIHN5bWxpbmsgYW5kIHJlZ3VsYXIKKyAgICBmaWxlLgorCisgIC0gZ2l0LWRhZW1vbiBtYXJrcyB0aGUgbGlzdGVuaW5nIHNvY2tldHMgd2l0aCBGRF9DTE9FWEVDIHNvCisgICAgdGhhdCBpdCB3b24ndCBiZSBsZWFrZWQgaW50byB0aGUgY2hpbGRyZW4uCisKKyAgLSBzZWdmYXVsdCBmcm9tIGdpdC1ibGFtZSB3aGVuIHRoZSBtYW5kYXRvcnkgcGF0aG5hbWUKKyAgICBwYXJhbWV0ZXIgd2FzIG1pc3Npbmcgd2FzIGZpeGVkOyB1c2FnZSgpIG1lc3NhZ2UgaXMgZ2l2ZW4KKyAgICBpbnN0ZWFkLgorCisgIC0gZ2l0LXJldi1saXN0IGRpZCBub3QgcmVhZCAkR0lUX0RJUi9jb25maWcgZmlsZSwgd2hpY2ggbWVhbnMKKyAgICB0aGF0IGRpZCBub3QgaG9ub3IgaTE4bi5sb2dvdXRwdXRlbmNvZGluZyBjb3JyZWN0bHkuCisKKyogVHdlYWtzCisKKyAgLSBzbGlkaW5nIG1tYXAoKSBpbmVmZmljaWVudGx5IG1tYXBlZCB0aGUgc2FtZSByZWdpb24gb2YgYQorICAgIHBhY2tmaWxlIHdpdGggYW4gYWNjZXNzIHBhdHRlcm4gdGhhdCB1c2VkIG9iamVjdHMgaW4gdGhlCisgICAgcmV2ZXJzZSBvcmRlci4gIFRoaXMgaGFzIGJlZW4gbWFkZSBtb3JlIGVmZmljaWVudC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjAuMi50eHQgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4wLjIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNjFlNTAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4wLjIudHh0CkBAIC0wLDAgKzEsNjUgQEAKK0dJVCB2MS41LjAuMiBSZWxlYXNlIE5vdGVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitGaXhlcyBzaW5jZSB2MS41LjAuMQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBCdWdmaXhlcworCisgIC0gQXV0b21hdGVkIG1lcmdlIGNvbmZsaWN0IGhhbmRsaW5nIHdoZW4gY2hhbmdlcyB0byBzeW1ib2xpYworICAgIGxpbmtzIGNvbmZsaWN0ZWQgd2VyZSBjb21wbGV0ZWx5IGJyb2tlbi4gIFRoZSBtZXJnZS1yZXNvbHZlCisgICAgc3RyYXRlZ3kgY3JlYXRlZCBhIHJlZ3VsYXIgZmlsZSB3aXRoIGNvbmZsaWN0IG1hcmtlcnMgaW4gaXQKKyAgICBpbiBwbGFjZSBvZiB0aGUgc3ltYm9saWMgbGluay4gIFRoZSBkZWZhdWx0IHN0cmF0ZWd5LAorICAgIG1lcmdlLXJlY3Vyc2l2ZSB3YXMgZXZlbiBtb3JlIGJyb2tlbi4gIEl0IHJlbW92ZWQgdGhlIHBhdGgKKyAgICB0aGF0IHdhcyBwb2ludGVkIGF0IGJ5IHRoZSBzeW1ib2xpYyBsaW5rLiAgQm90aCBvZiB0aGVzZQorICAgIHByb2JsZW1zIGhhdmUgYmVlbiBmaXhlZC4KKworICAtICdnaXQgZGlmZiBtYWludCBtYXN0ZXIgbmV4dCcgZGlkIG5vdCBjb3JyZWN0bHkgZ2l2ZSBjb21iaW5lZAorICAgIGRpZmYgYWNyb3NzIHRocmVlIHRyZWVzLgorCisgIC0gJ2dpdCBmYXN0LWltcG9ydCcgcG9ydGFiaWxpdHkgZml4IGZvciBTb2xhcmlzLgorCisgIC0gJ2dpdCBzaG93LXJlZiAtLXZlcmlmeScgd2l0aG91dCBhcmd1bWVudHMgZGlkIG5vdCBlcnJvciBvdXQKKyAgICBidXQgc2VnZmF1bHRlZC4KKworICAtICdnaXQgZGlmZiA6dHJhY2tlZC1maWxlIGBwd2RgL2FuLXVudHJhY2tlZC1maWxlJyBnYXZlIGFuIGV4dHJhCisgICAgc2xhc2hlcyBhZnRlciBhLyBhbmQgYi8uCisKKyAgLSAnZ2l0IGZvcm1hdC1wYXRjaCcgcHJvZHVjZWQgdG9vIGxvbmcgZmlsZW5hbWVzIGlmIHRoZSBjb21taXQKKyAgICBtZXNzYWdlIGhhZCB0b28gbG9uZyBsaW5lIGF0IHRoZSBiZWdpbm5pbmcuCisKKyAgLSBSdW5uaW5nICdtYWtlIGFsbCcgYW5kIHRoZW4gd2l0aG91dCBjaGFuZ2luZyBhbnl0aGluZworICAgIHJ1bm5pbmcgJ21ha2UgaW5zdGFsbCcgc3RpbGwgcmVidWlsdCBzb21lIGZpbGVzLiAgVGhpcworICAgIHdhcyBpbmNvbnZlbmllbnQgd2hlbiBidWlsZGluZyBhcyB5b3Vyc2VsZiBhbmQgdGhlbgorICAgIGluc3RhbGxpbmcgYXMgcm9vdCAoZXNwZWNpYWxseSBwcm9ibGVtYXRpYyB3aGVuIHRoZSBzb3VyY2UKKyAgICBkaXJlY3RvcnkgaXMgb24gTkZTIGFuZCByb290IGlzIG1hcHBlZCB0byBub2JvZHkpLgorCisgIC0gJ2dpdC1yZXJlcmUnIGZhaWxlZCB0byBkZWFsIHdpdGggdHdvIHVuY29uZmxpY3RlZCBwYXRocyB0aGF0CisgICAgc29ydGVkIG5leHQgdG8gZWFjaCBvdGhlci4KKworICAtICdnaXQtcmVyZXJlJyBhdHRlbXB0ZWQgdG8gb3BlbigyKSBhIHN5bWxpbmsgYW5kIGZhaWxlZCBpZgorICAgIHRoZXJlIHdhcyBhIGNvbmZsaWN0LiAgU2luY2UgYSBjb25mbGljdGluZyBjaGFuZ2UgdG8gYQorICAgIHN5bWxpbmsgd291bGQgbm90IGJlbmVmaXQgZnJvbSByZXJlcmUgYW55d2F5LCB0aGUgY29tbWFuZAorICAgIG5vdyBpZ25vcmVzIGNvbmZsaWN0aW5nIGNoYW5nZXMgdG8gc3ltbGlua3MuCisKKyAgLSAnZ2l0LXJlcGFjaycgZGlkIG5vdCBsaWtlIHRvIHBhc3MgbW9yZSB0aGFuIDY0IGFyZ3VtZW50cworICAgIGludGVybmFsbHkgdG8gdW5kZXJseWluZyAncmV2LWxpc3QnIGxvZ2ljLCB3aGljaCBtYWRlIGl0CisgICAgaW1wb3NzaWJsZSB0byByZXBhY2sgYWZ0ZXIgYWNjdW11bGF0aW5nIG1hbnkgKHNtYWxsKSBwYWNrcworICAgIGluIHRoZSByZXBvc2l0b3J5LgorCisgIC0gJ2dpdC1kaWZmJyB0byByZXZpZXcgdGhlIGNvbWJpbmVkIGRpZmYgZHVyaW5nIGEgY29uZmxpY3RlZAorICAgIG1lcmdlIHdlcmUgbm90IHJlYWRpbmcgdGhlIHdvcmtpbmcgdHJlZSB2ZXJzaW9uIGNvcnJlY3RseQorICAgIHdoZW4gY2hhbmdlcyB0byBhIHN5bWJvbGljIGxpbmsgY29uZmxpY3RlZC4gIEl0IHNob3VsZCBoYXZlCisgICAgcmVhZCB0aGUgZGF0YSB1c2luZyByZWFkbGluaygyKSBidXQgcmVhZCBmcm9tIHRoZSByZWd1bGFyCisgICAgZmlsZSB0aGUgc3ltYm9saWMgbGluayBwb2ludGVkIGF0LgorCisgIC0gJ2dpdC1yZW1vdGUnIGRpZCBub3QgbGlrZSBwZXJpb2QgaW4gYSByZW1vdGUncyBuYW1lLgorCisqIERvY3VtZW50YXRpb24gdXBkYXRlcworCisgIC0gYWRkZWQgYW5kIGNsYXJpZmllZCBjb3JlLmJhcmUsIGNvcmUubGVnYWN5aGVhZGVycyBjb25maWd1cmF0aW9ucy4KKworICAtIHVwZGF0ZWQgImdpdC1jbG9uZSAtLWRlcHRoIiBkb2N1bWVudGF0aW9uLgorCisKKyogQXNzb3J0ZWQgZ2l0LWd1aSBmaXhlcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjAuMy50eHQgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4wLjMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNTAwZjkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4wLjMudHh0CkBAIC0wLDAgKzEsNTggQEAKK0dJVCB2MS41LjAuMyBSZWxlYXNlIE5vdGVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitGaXhlcyBzaW5jZSB2MS41LjAuMgorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBCdWdmaXhlcworCisgIC0gJ2dpdC5lbCcgaG9ub3JzIHRoZSBjb21taXQgY29kaW5nIHN5c3RlbSBmcm9tIHRoZSBjb25maWd1cmF0aW9uLgorCisgIC0gJ2JsYW1ldmlldycgaW4gY29udHJpYi8gY29ycmVjdGx5IGRpZ3MgZGVlcGVyIHdoZW4gYSBsaW5lIGlzCisgICAgY2xpY2tlZC4KKworICAtICdodHRwLXB1c2gnIGNvcnJlY3RseSBtYWtlcyBzdXJlIHRoZSByZW1vdGUgc2lkZSBoYXMgbGVhZGluZworICAgIHBhdGguICBFYXJsaWVyIGl0IHN0YXJ0ZWQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcGF0aCwgYW5kCisgICAgaW5jb3JyZWN0bHkuCisKKyAgLSAnZ2l0LW1lcmdlJyBkaWQgbm90IGV4aXQgd2l0aCBub24temVybyBzdGF0dXMgd2hlbiB0aGUKKyAgICB3b3JraW5nIHRyZWUgd2FzIGRpcnR5IGFuZCBjYW5ub3QgZmFzdCBmb3J3YXJkLiAgSXQgZG9lcworICAgIG5vdy4KKworICAtICdjdnNleHBvcnRjb21taXQnIGRvZXMgbm90IGxvc2UgeWV0LXRvLWJlLXVzZWQgbWVzc2FnZSBmaWxlLgorCisgIC0gaW50LXZzLXNpemVfdCB0eXBlZml4IHdoZW4gcnVubmluZyBjb21iaW5lZCBkaWZmIG9uIGZpbGVzCisgICAgb3ZlciAyR0IgbG9uZy4KKworICAtICdnaXQgYXBwbHkgLS13aGl0ZXNwYWNlPXN0cmlwJyBzaG91bGQgbm90IHRvdWNoIHVubW9kaWZpZWQKKyAgICBsaW5lcy4KKworICAtICdnaXQtbWFpbGluZm8nIGNob2tlIHdoZW4gYSBsb2dpY2FsIGhlYWRlciBsaW5lIHdhcyB0b28gbG9uZy4KKworICAtICdnaXQgc2hvdyBBLi5CJyBkaWQgbm90IGVycm9yIG91dC4gIE5lZ2F0aXZlIHJlZiAoIm5vdCBBIiBpbgorICAgIHRoaXMgZXhhbXBsZSkgZG9lcyBub3QgbWFrZSBzZW5zZSBmb3IgdGhlIHB1cnBvc2Ugb2YgdGhlCisgICAgY29tbWFuZCwgc28gbm93IGl0IGVycm9ycyBvdXQuCisKKyAgLSAnZ2l0IGZtdC1tZXJnZS1tc2cgLS1maWxlJyB3aXRob3V0IGZpbGUgcGFyYW1ldGVyIGRpZCBub3QKKyAgICBjb3JyZWN0bHkgZXJyb3Igb3V0LgorCisgIC0gJ2dpdCBhcmNoaW1wb3J0JyBiYXJmZWQgdXBvbiBlbmNvdW50ZXJpbmcgYSBjb21taXQgd2l0aG91dAorICAgIHN1bW1hcnkuCisKKyAgLSAnZ2l0IGluZGV4LXBhY2snIGRpZCBub3QgcHJvdGVjdCBpdHNlbGYgZnJvbSBnZXR0aW5nIGEgc2hvcnQKKyAgICByZWFkIG91dCBvZiBwcmVhZCgyKS4KKworICAtICdnaXQgaHR0cC1wdXNoJyBoYWQgYSBmZXcgYnVmZmVyIG92ZXJydW5zLgorCisgIC0gQnVpbGQgZGVwZW5kZW5jeSBmaXhlcyB0byByZWJ1aWxkIGZldGNoLm8gd2hlbiBvdGhlciBoZWFkZXJzCisgICAgY2hhbmdlLgorCisqIERvY3VtZW50YXRpb24gdXBkYXRlcworCisgIC0gdXNlci1tYW51YWwgdXBkYXRlcy4KKworICAtIE9wdGlvbnMgdG8gJ2dpdCByZW1vdGUgYWRkJyB3ZXJlIGRlc2NyaWJlZCBpbnN1ZmZpY2llbnRseS4KKworICAtIENvbmZpZ3VyYXRpb24gZm9ybWF0LnN1ZmZpeCB3YXMgbm90IGRvY3VtZW50ZWQuCisKKyAgLSBPdGhlciBmb3JtYXR0aW5nIGFuZCBzcGVsbGluZyBmaXhlcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjAuNC50eHQgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4wLjQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZWZhNWQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4wLjQudHh0CkBAIC0wLDAgKzEsMjIgQEAKK0dJVCB2MS41LjAuNCBSZWxlYXNlIE5vdGVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitGaXhlcyBzaW5jZSB2MS41LjAuMworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBCdWdmaXhlcworCisgIC0gZ2l0LmVsIGRvZXMgbm90IGFkZCBkdXBsaWNhdGUgc2lnbi1vZmYgbGluZXMuCisKKyAgLSBnaXQtY29tbWl0IHNob3dzIHRoZSBmdWxsIHN0YXQgb2YgdGhlIHJlc3VsdGluZyBjb21taXQsIG5vdAorICAgIGp1c3QgYWJvdXQgdGhlIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgd2hlbiBydW4gZnJvbQorICAgIGEgc3ViZGlyZWN0b3J5LgorCisgIC0gImdpdC1jaGVja291dCAtbSAnQHs4IGhvdXJzIGFnb30nIiBoYWQgYSBmdW5ueSBmYWlsdXJlIGZyb20KKyAgICBldmFsOyBmaXhlZC4KKworICAtIGdpdC1ndWkgdXBkYXRlcy4KKworKiBEb2N1bWVudGF0aW9uIHVwZGF0ZXMKKworKiBVc2VyIG1hbnVhbCB1cGRhdGVzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4wLjUudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMC41LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWVjM2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMC41LnR4dApAQCAtMCwwICsxLDI2IEBACitHSVQgdjEuNS4wLjUgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS4wLjMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogQnVnZml4ZXMKKworICAtIGdpdC1tZXJnZSAoaGVuY2UgZ2l0LXB1bGwpIGRpZCBub3QgcmVmdXNlIGZhc3QtZm9yd2FyZGluZworICAgIHdoZW4gdGhlIHdvcmtpbmcgdHJlZSBoYWQgbG9jYWwgY2hhbmdlcyB0aGF0IHdvdWxkIGhhdmUKKyAgICBjb25mbGljdGVkIHdpdGggaXQuCisKKyAgLSBnaXQuZWwgZG9lcyBub3QgYWRkIGR1cGxpY2F0ZSBzaWduLW9mZiBsaW5lcy4KKworICAtIGdpdC1jb21taXQgc2hvd3MgdGhlIGZ1bGwgc3RhdCBvZiB0aGUgcmVzdWx0aW5nIGNvbW1pdCwgbm90CisgICAganVzdCBhYm91dCB0aGUgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCB3aGVuIHJ1biBmcm9tCisgICAgYSBzdWJkaXJlY3RvcnkuCisKKyAgLSAiZ2l0LWNoZWNrb3V0IC1tICdAezggaG91cnMgYWdvfSciIGhhZCBhIGZ1bm55IGZhaWx1cmUgZnJvbQorICAgIGV2YWw7IGZpeGVkLgorCisgIC0gZ2l0LWd1aSB1cGRhdGVzLgorCisqIERvY3VtZW50YXRpb24gdXBkYXRlcworCisqIFVzZXIgbWFudWFsIHVwZGF0ZXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjAuNi50eHQgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4wLjYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMjAxNWEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4wLjYudHh0CkBAIC0wLDAgKzEsMjEgQEAKK0dJVCB2MS41LjAuNiBSZWxlYXNlIE5vdGVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitGaXhlcyBzaW5jZSB2MS41LjAuNQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBCdWdmaXhlcworCisgIC0gYSBoYW5kZnVsIHNtYWxsIGZpeGVzIHRvIGdpdHdlYi4KKworICAtIGJ1aWxkIHByb2NlZHVyZSBmb3IgdXNlci1tYW51YWwgaXMgZml4ZWQgbm90IHRvIHJlcXVpcmUgbG9jYWxseQorICAgIGluc3RhbGxlZCBzdHlsZXNoZWV0cy4KKworICAtICJnaXQgY29tbWl0ICRwYXRocyIgb24gcGF0aHMgd2hvc2UgZWFybGllciBjb250ZW50cyB3ZXJlCisgICAgYWxyZWFkeSB1cGRhdGVkIGluIHRoZSBpbmRleCB3ZXJlIGZhaWxpbmcgb3V0LgorCisqIERvY3VtZW50YXRpb24KKworICAtIHVzZXItbWFudWFsIGhhcyBiZXR0ZXIgY3Jvc3MgcmVmZXJlbmNlcy4KKworICAtIGdpdHdlYiBpbnN0YWxsYXRpb24vZGVwbG95bWVudCBwcm9jZWR1cmUgaXMgbm93IGRvY3VtZW50ZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4wLjcudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMC43LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzBhZDMyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMC43LnR4dApAQCAtMCwwICsxLDE4IEBACitHSVQgdjEuNS4wLjcgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS4wLjYKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogQnVnZml4ZXMKKworICAtIGdpdC11cGxvYWQtcGFjayBmYWlsZWQgdG8gY2xvc2UgdW51c2VkIHBpcGUgZW5kcywgcmVzdWx0aW5nCisgICAgaW4gbWFueSB6b21iaWVzIHRvIGhhbmcgYXJvdW5kLgorCisgIC0gZ2l0LXJlcmVyZSB3YXMgcmVjb3JkaW5nIHRoZSBjb250ZW50cyBvZiBlYXJsaWVyIGh1bmtzCisgICAgZHVwbGljYXRlZCBpbiBsYXRlciBodW5rcy4gIFRoaXMgcHJldmVudGVkIHJlc29sdmluZyB0aGUgc2FtZQorICAgIGNvbmZsaWN0IHdoZW4gcGVyZm9ybWluZyB0aGUgc2FtZSBtZXJnZSB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KKworKiBEb2N1bWVudGF0aW9uCisKKyAgLSBhIGZldyBkb2N1bWVudGF0aW9uIGZpeGVzIGZyb20gRGViaWFuIHBhY2thZ2UgbWFpbnRhaW5lci4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjAudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFmNGJkYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjAudHh0CkBAIC0wLDAgKzEsNDY5IEBACitHSVQgdjEuNS4wIFJlbGVhc2UgTm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PQorCitPbGQgbmV3cworLS0tLS0tLS0KKworVGhpcyBzZWN0aW9uIGlzIGZvciBwZW9wbGUgd2hvIGFyZSB1cGdyYWRpbmcgZnJvbSBhbmNpZW50Cit2ZXJzaW9ucyBvZiBnaXQuICBBbHRob3VnaCBhbGwgb2YgdGhlIGNoYW5nZXMgaW4gdGhpcyBzZWN0aW9uCitoYXBwZW5lZCBiZWZvcmUgdGhlIGN1cnJlbnQgdjEuNC40IHJlbGVhc2UsIHRoZXkgYXJlIHN1bW1hcml6ZWQKK2hlcmUgaW4gdGhlIHYxLjUuMCByZWxlYXNlIG5vdGVzIGZvciBwZW9wbGUgd2hvIHNraXBwZWQgZWFybGllcgordmVyc2lvbnMuCisKK0FzIG9mIGdpdCB2MS41LjAgdGhlcmUgYXJlIHNvbWUgb3B0aW9uYWwgZmVhdHVyZXMgdGhhdCBjaGFuZ2VzCit0aGUgcmVwb3NpdG9yeSB0byBhbGxvdyBkYXRhIHRvIGJlIHN0b3JlZCBhbmQgdHJhbnNmZXJyZWQgbW9yZQorZWZmaWNpZW50bHkuICBUaGVzZSBmZWF0dXJlcyBhcmUgbm90IGVuYWJsZWQgYnkgZGVmYXVsdCwgYXMgdGhleQord2lsbCBtYWtlIHRoZSByZXBvc2l0b3J5IHVudXNhYmxlIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgZ2l0LgorU3BlY2lmaWNhbGx5LCB0aGUgYXZhaWxhYmxlIG9wdGlvbnMgYXJlOgorCisgLSBUaGVyZSBpcyBhIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgY29yZS5sZWdhY3loZWFkZXJzIHRoYXQKKyAgIGNoYW5nZXMgdGhlIGZvcm1hdCBvZiBsb29zZSBvYmplY3RzIHNvIHRoYXQgdGhleSBhcmUgbW9yZQorICAgZWZmaWNpZW50IHRvIHBhY2sgYW5kIHRvIHNlbmQgb3V0IG9mIHRoZSByZXBvc2l0b3J5IG92ZXIgZ2l0CisgICBuYXRpdmUgcHJvdG9jb2wsIHNpbmNlIHYxLjQuMi4gIEhvd2V2ZXIsIGxvb3NlIG9iamVjdHMKKyAgIHdyaXR0ZW4gaW4gdGhlIG5ldyBmb3JtYXQgY2Fubm90IGJlIHJlYWQgYnkgZ2l0IG9sZGVyIHRoYW4KKyAgIHRoYXQgdmVyc2lvbjsgcGVvcGxlIGZldGNoaW5nIGZyb20geW91ciByZXBvc2l0b3J5IHVzaW5nCisgICBvbGRlciBjbGllbnRzIG92ZXIgZHVtYiB0cmFuc3BvcnRzIChlLmcuIGh0dHApIHVzaW5nIG9sZGVyCisgICB2ZXJzaW9ucyBvZiBnaXQgd2lsbCBhbHNvIGJlIGFmZmVjdGVkLgorCisgICBUbyBsZXQgZ2l0IHVzZSB0aGUgbmV3IGxvb3NlIG9iamVjdCBmb3JtYXQsIHlvdSBoYXZlIHRvCisgICBzZXQgY29yZS5sZWdhY3loZWFkZXJzIHRvIGZhbHNlLgorCisgLSBTaW5jZSB2MS40LjMsIGNvbmZpZ3VyYXRpb24gcmVwYWNrLnVzZWRlbHRhYmFzZW9mZnNldCBhbGxvd3MKKyAgIHBhY2tmaWxlIHRvIGJlIGNyZWF0ZWQgaW4gbW9yZSBzcGFjZSBlZmZpY2llbnQgZm9ybWF0LCB3aGljaAorICAgY2Fubm90IGJlIHJlYWQgYnkgZ2l0IG9sZGVyIHRoYW4gdGhhdCB2ZXJzaW9uLgorCisgICBUbyBsZXQgZ2l0IHVzZSB0aGUgbmV3IGZvcm1hdCBmb3IgcGFja2ZpbGVzLCB5b3UgaGF2ZSB0bworICAgc2V0IHJlcGFjay51c2VkZWx0YWJhc2VvZmZzZXQgdG8gdHJ1ZS4KKworVGhlIGFib3ZlIHR3byBuZXcgZmVhdHVyZXMgYXJlIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQgYW5kIHlvdQoraGF2ZSB0byBleHBsaWNpdGx5IGFzayBmb3IgdGhlbSwgYmVjYXVzZSB0aGV5IG1ha2UgcmVwb3NpdG9yaWVzCit1bnJlYWRhYmxlIGJ5IG9sZGVyIHZlcnNpb25zIG9mIGdpdCwgYW5kIGluIHYxLjUuMCB3ZSBzdGlsbCBkbworbm90IGVuYWJsZSB0aGVtIGJ5IGRlZmF1bHQgZm9yIHRoZSBzYW1lIHJlYXNvbi4gIFdlIHdpbGwgY2hhbmdlCit0aGlzIGRlZmF1bHQgcHJvYmFibHkgMSB5ZWFyIGFmdGVyIDEuNC4yJ3MgcmVsZWFzZSwgd2hlbiBpdCBpcworcmVhc29uYWJsZSB0byBleHBlY3QgZXZlcnlib2R5IHRvIGhhdmUgbmV3IGVub3VnaCB2ZXJzaW9uIG9mCitnaXQuCisKKyAtICdnaXQgcGFjay1yZWZzJyBhcHBlYXJlZCBpbiB2MS40LjQ7IHRoaXMgY29tbWFuZCBhbGxvd3MgdGFncworICAgdG8gYmUgYWNjZXNzZWQgbXVjaCBtb3JlIGVmZmljaWVudGx5IHRoYW4gdGhlIHRyYWRpdGlvbmFsCisgICAnb25lLWZpbGUtcGVyLXRhZycgZm9ybWF0LiAgT2xkZXIgZ2l0LW5hdGl2ZSBjbGllbnRzIGNhbgorICAgc3RpbGwgZmV0Y2ggZnJvbSBhIHJlcG9zaXRvcnkgdGhhdCBwYWNrZWQgYW5kIHBydW5lZCByZWZzCisgICAodGhlIHNlcnZlciBzaWRlIG5lZWRzIHRvIHJ1biB0aGUgdXAtdG8tZGF0ZSB2ZXJzaW9uIG9mIGdpdCksCisgICBidXQgb2xkZXIgZHVtYiB0cmFuc3BvcnRzIGNhbm5vdC4gIFBhY2tpbmcgb2YgcmVmcyBpcyBkb25lIGJ5CisgICBhbiBleHBsaWNpdCB1c2VyIGFjdGlvbiwgZWl0aGVyIGJ5IHVzZSBvZiAiZ2l0IHBhY2stcmVmcworICAgLS1wcnVuZSIgY29tbWFuZCBvciBieSB1c2Ugb2YgImdpdCBnYyIgY29tbWFuZC4KKworIC0gJ2dpdCAtcCcgdG8gcGFnaW5hdGUgYW55dGhpbmcgLS0gbWFueSBjb21tYW5kcyBkbyBwYWdpbmF0aW9uCisgICBieSBkZWZhdWx0IG9uIGEgdHR5LiAgSW50cm9kdWNlZCBiZXR3ZWVuIHYxLjQuMSBhbmQgdjEuNC4yOworICAgdGhpcyBtYXkgc3VycHJpc2Ugb2xkIHRpbWVycy4KKworIC0gJ2dpdCBhcmNoaXZlJyBzdXBlcnNlZGVkICdnaXQgdGFyLXRyZWUnIGluIHYxLjQuMzsKKworIC0gJ2dpdCBjdnNzZXJ2ZXInIHdhcyBuZXcgaW52ZW50aW9uIGluIHYxLjMuMDsKKworIC0gJ2dpdCByZXBvLWNvbmZpZycsICdnaXQgZ3JlcCcsICdnaXQgcmViYXNlJyBhbmQgJ2dpdGsnIHdlcmUKKyAgIHNlcmlvdXNseSBlbmhhbmNlZCBkdXJpbmcgdjEuNC4wIHRpbWVwZXJpb2QuCisKKyAtICdnaXR3ZWInIGJlY2FtZSBwYXJ0IG9mIGdpdC5naXQgZHVyaW5nIHYxLjQuMCB0aW1lcGVyaW9kIGFuZAorICAgc2VyaW91c2x5IG1vZGlmaWVkIHNpbmNlIHRoZW4uCisKKyAtIHJlZmxvZyBpcyBhbiB2MS40LjAgaW52ZW50aW9uLiAgVGhpcyBhbGxvd3MgeW91IHRvIG5hbWUgYQorICAgcmV2aXNpb24gdGhhdCBhIGJyYW5jaCB1c2VkIHRvIGJlIGF0IChlLmcuICJnaXQgZGlmZgorICAgbWFzdGVyQHt5ZXN0ZXJkYXl9IG1hc3RlciIgYWxsb3dzIHlvdSB0byBzZWUgY2hhbmdlcyBzaW5jZQorICAgeWVzdGVyZGF5J3MgdGlwIG9mIHRoZSBicmFuY2gpLgorCisKK1VwZGF0ZXMgaW4gdjEuNS4wIHNpbmNlIHYxLjQuNCBzZXJpZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBJbmRleCBtYW5pcHVsYXRpb24KKworIC0gZ2l0LWFkZCBpcyB0byBhZGQgY29udGVudHMgdG8gdGhlIGluZGV4IChha2EgInN0YWdpbmcgYXJlYSIKKyAgIGZvciB0aGUgbmV4dCBjb21taXQpLCB3aGV0aGVyIHRoZSBmaWxlIHRoZSBjb250ZW50cyBoYXBwZW4gdG8KKyAgIGJlIGlzIGFuIGV4aXN0aW5nIG9uZSBvciBhIG5ld2x5IGNyZWF0ZWQgb25lLgorCisgLSBnaXQtYWRkIHdpdGhvdXQgYW55IGFyZ3VtZW50IGRvZXMgbm90IGFkZCBldmVyeXRoaW5nCisgICBhbnltb3JlLiAgVXNlICdnaXQtYWRkIC4nIGluc3RlYWQuICBBbHNvIHlvdSBjYW4gYWRkCisgICBvdGhlcndpc2UgaWdub3JlZCBmaWxlcyB3aXRoIGFuIC1mIG9wdGlvbi4KKworIC0gZ2l0LWFkZCB0cmllcyB0byBiZSBtb3JlIGZyaWVuZGx5IHRvIHVzZXJzIGJ5IG9mZmVyaW5nIGFuCisgICBpbnRlcmFjdGl2ZSBtb2RlICgiZ2l0LWFkZCAtaSIpLgorCisgLSBnaXQtY29tbWl0IDxwYXRoPiB1c2VkIHRvIHJlZnVzZSB0byBjb21taXQgaWYgPHBhdGg+IHdhcworICAgZGlmZmVyZW50IGJldHdlZW4gSEVBRCBhbmQgdGhlIGluZGV4IChpLmUuIHVwZGF0ZS1pbmRleCB3YXMKKyAgIHVzZWQgb24gaXQgZWFybGllcikuICBUaGlzIGNoZWNrIHdhcyByZW1vdmVkLgorCisgLSBnaXQtcm0gaXMgbXVjaCBzYW5lciBhbmQgc2FmZXIuICBJdCBpcyB1c2VkIHRvIHJlbW92ZSBwYXRocworICAgZnJvbSBib3RoIHRoZSBpbmRleCBmaWxlIGFuZCB0aGUgd29ya2luZyB0cmVlLCBhbmQgbWFrZXMgc3VyZQorICAgeW91IGFyZSBub3QgbG9zaW5nIGFueSBsb2NhbCBtb2RpZmljYXRpb24gYmVmb3JlIGRvaW5nIHNvLgorCisgLSBnaXQtcmVzZXQgPHRyZWU+IDxwYXRocz4uLi4gY2FuIGJlIHVzZWQgdG8gcmV2ZXJ0IGluZGV4CisgICBlbnRyaWVzIGZvciBzZWxlY3RlZCBwYXRocy4KKworIC0gZ2l0LXVwZGF0ZS1pbmRleCBpcyBtdWNoIGxlc3MgdmlzaWJsZS4gIE1hbnkgc3VnZ2VzdGlvbnMgdG8KKyAgIHVzZSB0aGUgY29tbWFuZCBpbiBnaXQgb3V0cHV0IGFuZCBkb2N1bWVudGF0aW9uIGhhdmUgbm93IGJlZW4KKyAgIHJlcGxhY2VkIGJ5IHNpbXBsZXIgY29tbWFuZHMgc3VjaCBhcyAiZ2l0IGFkZCIgb3IgImdpdCBybSIuCisKKworKiBSZXBvc2l0b3J5IGxheW91dCBhbmQgb2JqZWN0cyB0cmFuc2ZlcgorCisgLSBUaGUgZGF0YSBmb3Igb3JpZ2luIHJlcG9zaXRvcnkgaXMgc3RvcmVkIGluIHRoZSBjb25maWd1cmF0aW9uCisgICBmaWxlICRHSVRfRElSL2NvbmZpZywgbm90IGluICRHSVRfRElSL3JlbW90ZXMvLCBmb3IgbmV3bHkKKyAgIGNyZWF0ZWQgY2xvbmVzLiAgVGhlIGxhdHRlciBpcyBzdGlsbCBzdXBwb3J0ZWQgYW5kIHRoZXJlIGlzCisgICBubyBuZWVkIHRvIGNvbnZlcnQgeW91ciBleGlzdGluZyByZXBvc2l0b3J5IGlmIHlvdSBhcmUKKyAgIGFscmVhZHkgY29tZm9ydGFibGUgd2l0aCB5b3VyIHdvcmtmbG93IHdpdGggdGhlIGxheW91dC4KKworIC0gZ2l0LWNsb25lIGFsd2F5cyB1c2VzIHdoYXQgaXMga25vd24gYXMgInNlcGFyYXRlIHJlbW90ZSIKKyAgIGxheW91dCBmb3IgYSBuZXdseSBjcmVhdGVkIHJlcG9zaXRvcnkgd2l0aCBhIHdvcmtpbmcgdHJlZS4KKworICAgQSByZXBvc2l0b3J5IHdpdGggdGhlIHNlcGFyYXRlIHJlbW90ZSBsYXlvdXQgc3RhcnRzIHdpdGggb25seQorICAgb25lIGRlZmF1bHQgYnJhbmNoLCAnbWFzdGVyJywgdG8gYmUgdXNlZCBmb3IgeW91ciBvd24KKyAgIGRldmVsb3BtZW50LiAgVW5saWtlIHRoZSB0cmFkaXRpb25hbCBsYXlvdXQgdGhhdCBjb3BpZWQgYWxsCisgICB0aGUgdXBzdHJlYW0gYnJhbmNoZXMgaW50byB5b3VyIGJyYW5jaCBuYW1lc3BhY2UgKHdoaWxlCisgICByZW5hbWluZyB0aGVpciAnbWFzdGVyJyB0byB5b3VyICdvcmlnaW4nKSwgdGhlIG5ldyBsYXlvdXQKKyAgIHB1dHMgdXBzdHJlYW0gYnJhbmNoZXMgaW50byBsb2NhbCAicmVtb3RlLXRyYWNraW5nIGJyYW5jaGVzIgorICAgd2l0aCB0aGVpciBvd24gbmFtZXNwYWNlLiBUaGVzZSBjYW4gYmUgcmVmZXJlbmNlZCB3aXRoIG5hbWVzCisgICBzdWNoIGFzICJvcmlnaW4vJHVwc3RyZWFtX2JyYW5jaF9uYW1lIiBhbmQgYXJlIHN0b3JlZCBpbgorICAgLmdpdC9yZWZzL3JlbW90ZXMgcmF0aGVyIHRoYW4gLmdpdC9yZWZzL2hlYWRzIHdoZXJlIG5vcm1hbAorICAgYnJhbmNoZXMgYXJlIHN0b3JlZC4KKworICAgVGhpcyBsYXlvdXQga2VlcHMgeW91ciBvd24gYnJhbmNoIG5hbWVzcGFjZSBsZXNzIGNsdXR0ZXJlZCwKKyAgIGF2b2lkcyBuYW1lIGNvbGxpc2lvbiB3aXRoIHlvdXIgdXBzdHJlYW0sIG1ha2VzIGl0IHBvc3NpYmxlCisgICB0byBhdXRvbWF0aWNhbGx5IHRyYWNrIG5ldyBicmFuY2hlcyBjcmVhdGVkIGF0IHRoZSByZW1vdGUKKyAgIGFmdGVyIHlvdSBjbG9uZSBmcm9tIGl0LCBhbmQgbWFrZXMgaXQgZWFzaWVyIHRvIGludGVyYWN0IHdpdGgKKyAgIG1vcmUgdGhhbiBvbmUgcmVtb3RlIHJlcG9zaXRvcnkgKHlvdSBjYW4gdXNlICJnaXQgcmVtb3RlIiB0bworICAgYWRkIG90aGVyIHJlcG9zaXRvcmllcyB0byB0cmFjaykuICBUaGVyZSBtaWdodCBiZSBzb21lCisgICBzdXJwcmlzZXM6CisKKyAgICogJ2dpdCBicmFuY2gnIGRvZXMgbm90IHNob3cgdGhlIHJlbW90ZSB0cmFja2luZyBicmFuY2hlcy4KKyAgICAgSXQgb25seSBsaXN0cyB5b3VyIG93biBicmFuY2hlcy4gIFVzZSAnLXInIG9wdGlvbiB0byB2aWV3CisgICAgIHRoZSB0cmFja2luZyBicmFuY2hlcy4KKworICAgKiBJZiB5b3UgYXJlIGZvcmtpbmcgb2ZmIG9mIGEgYnJhbmNoIG9idGFpbmVkIGZyb20gdGhlCisgICAgIHVwc3RyZWFtLCB5b3Ugd291bGQgaGF2ZSBkb25lIHNvbWV0aGluZyBsaWtlICdnaXQgYnJhbmNoCisgICAgIG15LW5leHQgbmV4dCcsIGJlY2F1c2UgdHJhZGl0aW9uYWwgbGF5b3V0IGRyb3BwZWQgdGhlCisgICAgIHRyYWNraW5nIGJyYW5jaCAnbmV4dCcgaW50byB5b3VyIG93biBicmFuY2ggbmFtZXNwYWNlLgorICAgICBXaXRoIHRoZSBzZXBhcmF0ZSByZW1vdGUgbGF5b3V0LCB5b3Ugc2F5ICdnaXQgYnJhbmNoIG5leHQKKyAgICAgb3JpZ2luL25leHQnLCB3aGljaCBhbGxvd3MgeW91IHRvIHVzZSB0aGUgbWF0Y2hpbmcgbmFtZQorICAgICAnbmV4dCcgZm9yIHlvdXIgb3duIGJyYW5jaC4gIEl0IGFsc28gYWxsb3dzIHlvdSB0byB0cmFjayBhCisgICAgIHJlbW90ZSBvdGhlciB0aGFuICdvcmlnaW4nIChpLmUuIHdoZXJlIHlvdSBpbml0aWFsbHkgY2xvbmVkCisgICAgIGZyb20pIGFuZCBmb3JrIG9mZiBvZiBhIGJyYW5jaCBmcm9tIHRoZXJlIHRoZSBzYW1lIHdheQorICAgICAoZS5nLiAiZ2l0IGJyYW5jaCBtaW5ndyBqNnQvbWFzdGVyIikuCisKKyAgIFJlcG9zaXRvcmllcyBpbml0aWFsaXplZCB3aXRoIHRoZSB0cmFkaXRpb25hbCBsYXlvdXQgY29udGludWUKKyAgIHRvIHdvcmsuCisKKyAtIE5ldyBicmFuY2hlcyB0aGF0IGFwcGVhciBvbiB0aGUgb3JpZ2luIHNpZGUgYWZ0ZXIgYSBjbG9uZSBpcworICAgbWFkZSBhcmUgYWxzbyB0cmFja2VkIGF1dG9tYXRpY2FsbHkuICBUaGlzIGlzIGRvbmUgd2l0aCBhbgorICAgd2lsZGNhcmQgcmVmc3BlYyAicmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIsIHdoaWNoCisgICBvbGRlciBnaXQgZG9lcyBub3QgdW5kZXJzdGFuZCwgc28gaWYgeW91IGNsb25lIHdpdGggMS41LjAsCisgICB5b3Ugd291bGQgbmVlZCB0byBkb3duZ3JhZGUgcmVtb3RlLiouZmV0Y2ggaW4gdGhlCisgICBjb25maWd1cmF0aW9uIGZpbGUgdG8gc3BlY2lmeSBlYWNoIGJyYW5jaCB5b3UgYXJlIGludGVyZXN0ZWQKKyAgIGluIGluZGl2aWR1YWxseSBpZiB5b3UgcGxhbiB0byBmZXRjaCBpbnRvIHRoZSByZXBvc2l0b3J5IHdpdGgKKyAgIG9sZGVyIHZlcnNpb25zIG9mIGdpdCAoYnV0IHdoeSB3b3VsZCB5b3U/KS4KKworIC0gU2ltaWxhcmx5LCB3aWxkY2FyZCByZWZzcGVjICJyZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL21lLyoiCisgICBjYW4gYmUgZ2l2ZW4gdG8gImdpdC1wdXNoIiBjb21tYW5kIHRvIHVwZGF0ZSB0aGUgdHJhY2tpbmcKKyAgIGJyYW5jaGVzIHRoYXQgaXMgdXNlZCB0byB0cmFjayB0aGUgcmVwb3NpdG9yeSB5b3UgYXJlIHB1c2hpbmcKKyAgIGZyb20gb24gdGhlIHJlbW90ZSBzaWRlLgorCisgLSBnaXQtYnJhbmNoIGFuZCBnaXQtc2hvdy1icmFuY2gga25vdyByZW1vdGUgdHJhY2tpbmcgYnJhbmNoZXMKKyAgICh1c2UgdGhlIGNvbW1hbmQgbGluZSBzd2l0Y2ggIi1yIiB0byBsaXN0IG9ubHkgdHJhY2tlZCBicmFuY2hlcykuCisKKyAtIGdpdC1wdXNoIGNhbiBub3cgYmUgdXNlZCB0byBkZWxldGUgYSByZW1vdGUgYnJhbmNoIG9yIGEgdGFnLgorICAgVGhpcyByZXF1aXJlcyB0aGUgdXBkYXRlZCBnaXQgb24gdGhlIHJlbW90ZSBzaWRlICh1c2UgImdpdAorICAgcHVzaCA8cmVtb3RlPiA6cmVmcy9oZWFkcy88YnJhbmNoPiIgdG8gZGVsZXRlICJicmFuY2giKS4KKworIC0gZ2l0LXB1c2ggbW9yZSBhZ2dyZXNzaXZlbHkga2VlcHMgdGhlIHRyYW5zZmVycmVkIG9iamVjdHMKKyAgIHBhY2tlZC4gIEVhcmxpZXIgd2UgcmVjb21tZW5kZWQgdG8gbW9uaXRvciBhbW91bnQgb2YgbG9vc2UKKyAgIG9iamVjdHMgYW5kIHJlcGFjayByZWd1bGFybHksIGJ1dCB5b3Ugc2hvdWxkIHJlcGFjayB3aGVuIHlvdQorICAgYWNjdW11bGF0ZWQgdG9vIG1hbnkgc21hbGwgcGFja3MgdGhpcyB3YXkgYXMgd2VsbC4gIFVwZGF0ZWQKKyAgIGdpdC1jb3VudC1vYmplY3RzIGhlbHBzIHlvdSB3aXRoIHRoaXMuCisKKyAtIGdpdC1mZXRjaCBhbHNvIG1vcmUgYWdncmVzc2l2ZWx5IGtlZXBzIHRoZSB0cmFuc2ZlcnJlZCBvYmplY3RzCisgICBwYWNrZWQuICBUaGlzIGJlaGF2aW9yIG9mIGdpdC1wdXNoIGFuZCBnaXQtZmV0Y2ggY2FuIGJlCisgICB0d2Vha2VkIHdpdGggYSBzaW5nbGUgY29uZmlndXJhdGlvbiB0cmFuc2Zlci51bnBhY2tsaW1pdCAoYnV0CisgICB1c3VhbGx5IHRoZXJlIHNob3VsZCBub3QgYmUgYW55IG5lZWQgZm9yIGEgdXNlciB0byB0d2VhayBpdCkuCisKKyAtIEEgbmV3IGNvbW1hbmQsIGdpdC1yZW1vdGUsIGNhbiBoZWxwIHlvdSBtYW5hZ2UgeW91ciByZW1vdGUKKyAgIHRyYWNraW5nIGJyYW5jaCBkZWZpbml0aW9ucy4KKworIC0gWW91IG1heSBuZWVkIHRvIHNwZWNpZnkgZXhwbGljaXQgcGF0aHMgZm9yIHVwbG9hZC1wYWNrIGFuZC9vcgorICAgcmVjZWl2ZS1wYWNrIGR1ZSB0byB5b3VyIHNzaCBkYWVtb24gY29uZmlndXJhdGlvbiBvbiB0aGUKKyAgIG90aGVyIGVuZC4gIFRoaXMgY2FuIG5vdyBiZSBkb25lIHZpYSByZW1vdGUuKi51cGxvYWRwYWNrIGFuZAorICAgcmVtb3RlLioucmVjZWl2ZXBhY2sgY29uZmlndXJhdGlvbi4KKworCisqIEJhcmUgcmVwb3NpdG9yaWVzCisKKyAtIENlcnRhaW4gY29tbWFuZHMgY2hhbmdlIHRoZWlyIGJlaGF2aW9yIGluIGEgYmFyZSByZXBvc2l0b3J5CisgICAoaS5lLiBhIHJlcG9zaXRvcnkgd2l0aG91dCBhc3NvY2lhdGVkIHdvcmtpbmcgdHJlZSkuICBXZSB1c2UKKyAgIGEgZmFpcmx5IGNvbnNlcnZhdGl2ZSBoZXVyaXN0aWMgKGlmICRHSVRfRElSIGlzICIuZ2l0Iiwgb3IKKyAgIGVuZHMgd2l0aCAiLy5naXQiLCB0aGUgcmVwb3NpdG9yeSBpcyBub3QgYmFyZSkgdG8gZGVjaWRlIGlmIGEKKyAgIHJlcG9zaXRvcnkgaXMgYmFyZSwgYnV0ICJjb3JlLmJhcmUiIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUKKyAgIGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBoZXVyaXN0aWMgd2hlbiBpdCBtaXNpZGVudGlmaWVzCisgICB5b3VyIHJlcG9zaXRvcnkuCisKKyAtIGdpdC1mZXRjaCB1c2VkIHRvIGNvbXBsYWluIHVwZGF0aW5nIHRoZSBjdXJyZW50IGJyYW5jaCBidXQKKyAgIHRoaXMgaXMgbm93IGFsbG93ZWQgZm9yIGEgYmFyZSByZXBvc2l0b3J5LiAgU28gaXMgdGhlIHVzZSBvZgorICAgJ2dpdC1icmFuY2ggLWYnIHRvIHVwZGF0ZSB0aGUgY3VycmVudCBicmFuY2guCisKKyAtIFBvcmNlbGFpbi1pc2ggY29tbWFuZHMgdGhhdCByZXF1aXJlIGEgd29ya2luZyB0cmVlIHJlZnVzZXMgdG8KKyAgIHdvcmsgaW4gYSBiYXJlIHJlcG9zaXRvcnkuCisKKworKiBSZWZsb2cKKworIC0gUmVmbG9nIHJlY29yZHMgdGhlIGhpc3RvcnkgZnJvbSB0aGUgdmlldyBwb2ludCBvZiB0aGUgbG9jYWwKKyAgIHJlcG9zaXRvcnkuIEluIG90aGVyIHdvcmRzLCByZWdhcmRsZXNzIG9mIHRoZSByZWFsIGhpc3RvcnksCisgICB0aGUgcmVmbG9nIHNob3dzIHRoZSBoaXN0b3J5IGFzIHNlZW4gYnkgb25lIHBhcnRpY3VsYXIKKyAgIHJlcG9zaXRvcnkgKHRoaXMgZW5hYmxlcyB5b3UgdG8gYXNrICJ3aGF0IHdhcyB0aGUgY3VycmVudAorICAgcmV2aXNpb24gaW4gX3RoaXNfIHJlcG9zaXRvcnksIHllc3RlcmRheSBhdCAxcG0/IikuICBUaGlzCisgICBmYWNpbGl0eSBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgZm9yIHJlcG9zaXRvcmllcyB3aXRoIHdvcmtpbmcKKyAgIHRyZWVzLCBhbmQgY2FuIGJlIGFjY2Vzc2VkIHdpdGggdGhlICJicmFuY2hAe3RpbWV9IiBhbmQKKyAgICJicmFuY2hAe050aH0iIG5vdGF0aW9uLgorCisgLSAiZ2l0IHNob3ctYnJhbmNoIiBsZWFybmVkIHNob3dpbmcgdGhlIHJlZmxvZyBkYXRhIHdpdGggdGhlCisgICBuZXcgLWcgb3B0aW9uLiAgImdpdCBsb2ciIGhhcyAtZyBvcHRpb24gdG8gdmlldyByZWZsb2cKKyAgIGVudHJpZXMgaW4gYSBtb3JlIHZlcmJvc2UgbWFubmVyLgorCisgLSBnaXQtYnJhbmNoIGtub3dzIGhvdyB0byByZW5hbWUgYnJhbmNoZXMgYW5kIG1vdmVzIGV4aXN0aW5nCisgICByZWZsb2cgZGF0YSBmcm9tIHRoZSBvbGQgYnJhbmNoIHRvIHRoZSBuZXcgb25lLgorCisgLSBJbiBhZGRpdGlvbiB0byB0aGUgcmVmbG9nIHN1cHBvcnQgaW4gdjEuNC40IHNlcmllcywgSEVBRAorICAgcmVmZXJlbmNlIG1haW50YWlucyBpdHMgb3duIGxvZy4gICJIRUFEQHs1Lm1pbnV0ZXMuYWdvfSIKKyAgIG1lYW5zIHRoZSBjb21taXQgeW91IHdlcmUgYXQgNSBtaW51dGVzIGFnbywgd2hpY2ggdGFrZXMKKyAgIGJyYW5jaCBzd2l0Y2hpbmcgaW50byBhY2NvdW50LiAgSWYgeW91IHdhbnQgdG8ga25vdyB3aGVyZSB0aGUKKyAgIHRpcCBvZiB5b3VyIGN1cnJlbnQgYnJhbmNoIHdhcyBhdCA1IG1pbnV0ZXMgYWdvLCB5b3UgbmVlZCB0bworICAgZXhwbGljaXRseSBzYXkgaXRzIG5hbWUgKGUuZy4gIm1hc3RlckB7NS5taW51dGVzLmFnb30iKSBvcgorICAgb21pdCB0aGUgcmVmbmFtZSBhbHRvZ2V0aGVyIGkuZS4gIkB7NS5taW51dGVzLmFnb30iLgorCisgLSBUaGUgY29tbWl0cyByZWZlcnJlZCB0byBieSByZWZsb2cgZW50cmllcyBhcmUgbm93IHByb3RlY3RlZAorICAgYWdhaW5zdCBwcnVuaW5nLiAgVGhlIG5ldyBjb21tYW5kICJnaXQgcmVmbG9nIGV4cGlyZSIgY2FuIGJlCisgICB1c2VkIHRvIHRydW5jYXRlIG9sZGVyIHJlZmxvZyBlbnRyaWVzIGFuZCBlbnRyaWVzIHRoYXQgcmVmZXIKKyAgIHRvIGNvbW1pdHMgdGhhdCBoYXZlIGJlZW4gcHJ1bmVkIGF3YXkgcHJldmlvdXNseSB3aXRoIG9sZGVyCisgICB2ZXJzaW9ucyBvZiBnaXQuCisKKyAgIEV4aXN0aW5nIHJlcG9zaXRvcmllcyB0aGF0IGhhdmUgYmVlbiB1c2luZyByZWZsb2cgbWF5IGdldAorICAgY29tcGxhaW50cyBmcm9tIGZzY2stb2JqZWN0cyBhbmQgbWF5IG5vdCBiZSBhYmxlIHRvIHJ1bgorICAgZ2l0LXJlcGFjaywgaWYgeW91IGhhZCBydW4gZ2l0LXBydW5lIGZyb20gb2xkZXIgZ2l0OyBwbGVhc2UKKyAgIHJ1biAiZ2l0IHJlZmxvZyBleHBpcmUgLS1zdGFsZS1maXggLS1hbGwiIGZpcnN0IHRvIHJlbW92ZQorICAgcmVmbG9nIGVudHJpZXMgdGhhdCByZWZlciB0byBjb21taXRzIHRoYXQgYXJlIG5vIGxvbmdlciBpbgorICAgdGhlIHJlcG9zaXRvcnkgd2hlbiB0aGF0IGhhcHBlbnMuCisKKworKiBDcnVmdHMgcmVtb3ZhbAorCisgLSBXZSB1c2VkIHRvIHNheSAib2xkIGNvbW1pdHMgYXJlIHJldHJpZXZhYmxlIHVzaW5nIHJlZmxvZyBhbmQKKyAgICdtYXN0ZXJAe3llc3RlcmRheX0nIHN5bnRheCBhcyBsb25nIGFzIHlvdSBoYXZlbid0IHJ1bgorICAgZ2l0LXBydW5lIi4gIFdlIG5vIGxvbmdlciBoYXZlIHRvIHNheSB0aGUgbGF0dGVyIGhhbGYgb2YgdGhlCisgICBhYm92ZSBzZW50ZW5jZSwgYXMgZ2l0LXBydW5lIGRvZXMgbm90IHJlbW92ZSB0aGluZ3MgcmVhY2hhYmxlCisgICBmcm9tIHJlZmxvZyBlbnRyaWVzLgorCisgLSBUaGVyZSBpcyBhIHRvcGxldmVsIGdhcmJhZ2UgY29sbGVjdG9yIHNjcmlwdCwgJ2dpdC1nYycsIHRoYXQKKyAgIHJ1bnMgcGVyaW9kaWMgY2xlYW51cCBmdW5jdGlvbnMsIGluY2x1ZGluZyAnZ2l0LXJlcGFjayAtYSAtZCcsCisgICAnZ2l0LXJlZmxvZyBleHBpcmUnLCAnZ2l0LXBhY2stcmVmcyAtLXBydW5lJywgYW5kICdnaXQtcmVyZXJlCisgICBnYycuCisKKyAtIFRoZSBvdXRwdXQgZnJvbSBmc2NrICgiZnNjay1vYmplY3RzIiBpcyBjYWxsZWQganVzdCAiZnNjayIKKyAgIG5vdywgYnV0IHRoZSBvbGQgbmFtZSBjb250aW51ZXMgdG8gd29yaykgd2FzIG5lZWRsZXNzbHkKKyAgIGFsYXJtaW5nIGluIHRoYXQgaXQgd2FybmVkIG1pc3Npbmcgb2JqZWN0cyB0aGF0IGFyZSByZWFjaGFibGUKKyAgIG9ubHkgZnJvbSBkYW5nbGluZyBvYmplY3RzLiAgVGhpcyBoYXMgYmVlbiBjb3JyZWN0ZWQgYW5kIHRoZQorICAgb3V0cHV0IGlzIG11Y2ggbW9yZSB1c2VmdWwuCisKKworKiBEZXRhY2hlZCBIRUFECisKKyAtIFlvdSBjYW4gdXNlICdnaXQtY2hlY2tvdXQnIHRvIGNoZWNrIG91dCBhbiBhcmJpdHJhcnkgcmV2aXNpb24KKyAgIG9yIGEgdGFnIGFzIHdlbGwsIGluc3RlYWQgb2YgbmFtZWQgYnJhbmNoZXMuICBUaGlzIHdpbGwKKyAgIGRpc3NvY2lhdGUgeW91ciBIRUFEIGZyb20gdGhlIGJyYW5jaCB5b3UgYXJlIGN1cnJlbnRseSBvbi4KKworICAgQSB0eXBpY2FsIHVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgdG8gImxvb2sgYXJvdW5kIi4gIEUuZy4KKworCSQgZ2l0IGNoZWNrb3V0IHYyLjYuMTYKKwkuLi4gY29tcGlsZSwgdGVzdCwgZXRjLgorCSQgZ2l0IGNoZWNrb3V0IHYyLjYuMTcKKwkuLi4gY29tcGlsZSwgdGVzdCwgZXRjLgorCisgLSBBZnRlciBkZXRhY2hpbmcgeW91ciBIRUFELCB5b3UgY2FuIGdvIGJhY2sgdG8gYW4gZXhpc3RpbmcKKyAgIGJyYW5jaCB3aXRoIHVzdWFsICJnaXQgY2hlY2tvdXQgJGJyYW5jaCIuICBBbHNvIHlvdSBjYW4KKyAgIHN0YXJ0IGEgbmV3IGJyYW5jaCB1c2luZyAiZ2l0IGNoZWNrb3V0IC1iICRuZXdicmFuY2giIHRvCisgICBzdGFydCBhIG5ldyBicmFuY2ggYXQgdGhhdCBjb21taXQuCisKKyAtIFlvdSBjYW4gZXZlbiBwdWxsIGZyb20gb3RoZXIgcmVwb3NpdG9yaWVzLCBtYWtlIG1lcmdlcyBhbmQKKyAgIGNvbW1pdHMgd2hpbGUgeW91ciBIRUFEIGlzIGRldGFjaGVkLiAgQWxzbyB5b3UgY2FuIHVzZSAiZ2l0CisgICByZXNldCIgdG8ganVtcCB0byBhcmJpdHJhcnkgY29tbWl0LCB3aGlsZSBzdGlsbCBrZWVwaW5nIHlvdXIKKyAgIEhFQUQgZGV0YWNoZWQuCisKKyAgIFJlbWVtYmVyIHRoYXQgYSBkZXRhY2hlZCBzdGF0ZSBpcyB2b2xhdGlsZSwgaS5lLiBpdCB3aWxsIGJlIGZvcmdvdHRlbgorICAgYXMgc29vbiBhcyB5b3UgbW92ZSBhd2F5IGZyb20gaXQgd2l0aCB0aGUgY2hlY2tvdXQgb3IgcmVzZXQgY29tbWFuZCwKKyAgIHVubGVzcyBhIGJyYW5jaCBpcyBjcmVhdGVkIGZyb20gaXQgYXMgbWVudGlvbmVkIGFib3ZlLiAgSXQgaXMgYWxzbworICAgcG9zc2libGUgdG8gcmVzY3VlIGEgbG9zdCBkZXRhY2hlZCBzdGF0ZSBmcm9tIHRoZSBIRUFEIHJlZmxvZy4KKworCisqIFBhY2tlZCByZWZzCisKKyAtIFJlcG9zaXRvcmllcyB3aXRoIGh1bmRyZWRzIG9mIHRhZ3MgaGF2ZSBiZWVuIHBheWluZyBsYXJnZQorICAgb3ZlcmhlYWQsIGJvdGggaW4gc3RvcmFnZSBhbmQgaW4gcnVudGltZSwgZHVlIHRvIHRoZQorICAgdHJhZGl0aW9uYWwgb25lLXJlZi1wZXItZmlsZSBmb3JtYXQuICBBIG5ldyBjb21tYW5kLAorICAgZ2l0LXBhY2stcmVmcywgY2FuIGJlIHVzZWQgdG8gInBhY2siIHRoZW0gaW4gbW9yZSBlZmZpY2llbnQKKyAgIHJlcHJlc2VudGF0aW9uICh5b3UgY2FuIGxldCBnaXQtZ2MgZG8gdGhpcyBmb3IgeW91KS4KKworIC0gQ2xvbmVzIGFuZCBmZXRjaGVzIG92ZXIgZHVtYiB0cmFuc3BvcnRzIGFyZSBub3cgYXdhcmUgb2YKKyAgIHBhY2tlZCByZWZzIGFuZCBjYW4gZG93bmxvYWQgZnJvbSByZXBvc2l0b3JpZXMgdGhhdCB1c2UKKyAgIHRoZW0uCisKKworKiBDb25maWd1cmF0aW9uCisKKyAtIGNvbmZpZ3VyYXRpb24gcmVsYXRlZCB0byBjb2xvciBzZXR0aW5nIGFyZSBjb25zb2xpZGF0ZWQgdW5kZXIKKyAgIGNvbG9yLiogbmFtZXNwYWNlIChvbGRlciBkaWZmLmNvbG9yLiosIHN0YXR1cy5jb2xvci4qIGFyZQorICAgc3RpbGwgc3VwcG9ydGVkKS4KKworIC0gJ2dpdC1yZXBvLWNvbmZpZycgY29tbWFuZCBpcyBhY2Nlc3NpYmxlIGFzICdnaXQtY29uZmlnJyBub3cuCisKKworKiBVcGRhdGVkIGZlYXR1cmVzCisKKyAtIGdpdC1kZXNjcmliZSB1c2VzIGJldHRlciBjcml0ZXJpYSB0byBwaWNrIGEgYmFzZSByZWYuICBJdAorICAgdXNlZCB0byBwaWNrIHRoZSBvbmUgd2l0aCB0aGUgbmV3ZXN0IHRpbWVzdGFtcCwgYnV0IG5vdyBpdAorICAgcGlja3MgdGhlIG9uZSB0aGF0IGlzIHRvcG9sb2dpY2FsbHkgdGhlIGNsb3Nlc3QgKHRoYXQgaXMsCisgICBhbW9uZyBhbmNlc3RvcnMgb2YgY29tbWl0IEMsIHRoZSByZWYgVCB0aGF0IGhhcyB0aGUgc2hvcnRlc3QKKyAgIG91dHB1dCBmcm9tICJnaXQtcmV2LWxpc3QgVC4uQyIgaXMgY2hvc2VuKS4KKworIC0gZ2l0LWRlc2NyaWJlIGdpdmVzIHRoZSBudW1iZXIgb2YgY29tbWl0cyBzaW5jZSB0aGUgYmFzZSByZWYKKyAgIGJldHdlZW4gdGhlIHJlZm5hbWUgYW5kIHRoZSBoYXNoIHN1ZmZpeC4gIEUuZy4gdGhlIGNvbW1pdCBvbmUKKyAgIGJlZm9yZSB2Mi42LjIwLXJjNiBpbiB0aGUga2VybmVsIHJlcG9zaXRvcnkgaXM6CisKKwl2Mi42LjIwLXJjNS0zMDYtZ2EyMWIwNjkKKworICAgd2hpY2ggdGVsbHMgeW91IHRoYXQgaXRzIG9iamVjdCBuYW1lIGJlZ2lucyB3aXRoIGEyMWIwNjksCisgICB2Mi42LjIwLXJjNSBpcyBhbiBhbmNlc3RvciBvZiBpdCAobWVhbmluZywgdGhlIGNvbW1pdAorICAgY29udGFpbnMgZXZlcnl0aGluZyAtcmM1IGhhcyksIGFuZCB0aGVyZSBhcmUgMzA2IGNvbW1pdHMKKyAgIHNpbmNlIHYyLjYuMjAtcmM1LgorCisgLSBnaXQtZGVzY3JpYmUgd2l0aCAtLWFiYnJldj0wIGNhbiBiZSB1c2VkIHRvIHNob3cgb25seSB0aGUKKyAgIG5hbWUgb2YgdGhlIGJhc2UgcmVmLgorCisgLSBnaXQtYmxhbWUgbGVhcm5lZCBhIG5ldyBvcHRpb24sIC0taW5jcmVtZW50YWwsIHRoYXQgdGVsbHMgaXQKKyAgIHRvIG91dHB1dCB0aGUgYmxhbWVzIGFzIHRoZXkgYXJlIGFzc2lnbmVkLiAgQSBzYW1wbGUgc2NyaXB0CisgICB0byB1c2UgaXQgaXMgYWxzbyBpbmNsdWRlZCBhcyBjb250cmliL2JsYW1ldmlldy4KKworIC0gZ2l0LWJsYW1lIHN0YXJ0cyBhbm5vdGF0aW5nIGZyb20gdGhlIHdvcmtpbmcgdHJlZSBieSBkZWZhdWx0LgorCisKKyogTGVzcyBleHRlcm5hbCBkZXBlbmRlbmN5CisKKyAtIFdlIG5vIGxvbmdlciByZXF1aXJlIHRoZSAibWVyZ2UiIHByb2dyYW0gZnJvbSB0aGUgUkNTIHN1aXRlLgorICAgQWxsIDMtd2F5IGZpbGUtbGV2ZWwgbWVyZ2VzIGFyZSBub3cgZG9uZSBpbnRlcm5hbGx5LgorCisgLSBUaGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gb2YgZ2l0LW1lcmdlLXJlY3Vyc2l2ZSB3aGljaCB3YXMKKyAgIGluIFB5dGhvbiBoYXMgYmVlbiByZW1vdmVkOyB3ZSBoYXZlIGEgQyBpbXBsZW1lbnRhdGlvbiBvZiBpdAorICAgbm93LgorCisgLSBnaXQtc2hvcnRsb2cgaXMgbm8gbG9uZ2VyIGEgUGVybCBzY3JpcHQuICBJdCBubyBsb25nZXIKKyAgIHJlcXVpcmVzIG91dHB1dCBwaXBlZCBmcm9tIGdpdC1sb2c7IGl0IGNhbiBhY2NlcHQgcmV2aXNpb24KKyAgIHBhcmFtZXRlcnMgZGlyZWN0bHkgb24gdGhlIGNvbW1hbmQgbGluZS4KKworCisqIEkxOG4KKworIC0gV2UgaGF2ZSBhbHdheXMgZW5jb3VyYWdlZCB0aGUgY29tbWl0IG1lc3NhZ2UgdG8gYmUgZW5jb2RlZCBpbgorICAgVVRGLTgsIGJ1dCB0aGUgdXNlcnMgYXJlIGFsbG93ZWQgdG8gdXNlIGxlZ2FjeSBlbmNvZGluZyBhcworICAgYXBwcm9wcmlhdGUgZm9yIHRoZWlyIHByb2plY3RzLiAgVGhpcyB3aWxsIGNvbnRpbnVlIHRvIGJlIHRoZQorICAgY2FzZS4gIEhvd2V2ZXIsIGEgbm9uIFVURi04IGNvbW1pdCBlbmNvZGluZyBfbXVzdF8gYmUKKyAgIGV4cGxpY2l0bHkgc2V0IHdpdGggaTE4bi5jb21taXRlbmNvZGluZyBpbiB0aGUgcmVwb3NpdG9yeQorICAgd2hlcmUgYSBjb21taXQgaXMgbWFkZTsgb3RoZXJ3aXNlIGdpdC1jb21taXQtdHJlZSB3aWxsCisgICBjb21wbGFpbiBpZiB0aGUgbG9nIG1lc3NhZ2UgZG9lcyBub3QgbG9vayBsaWtlIGEgdmFsaWQgVVRGLTgKKyAgIHN0cmluZy4KKworIC0gVGhlIHZhbHVlIG9mIGkxOG4uY29tbWl0ZW5jb2RpbmcgaW4gdGhlIG9yaWdpbmF0aW5nCisgICByZXBvc2l0b3J5IGlzIHJlY29yZGVkIGluIHRoZSBjb21taXQgb2JqZWN0IG9uIHRoZSAiZW5jb2RpbmciCisgICBoZWFkZXIsIGlmIGl0IGlzIG5vdCBVVEYtOC4gIGdpdC1sb2cgYW5kIGZyaWVuZHMgbm90aWNlIHRoaXMsCisgICBhbmQgcmVlbmNvZGVzIHRoZSBtZXNzYWdlIHRvIHRoZSBsb2cgb3V0cHV0IGVuY29kaW5nIHdoZW4KKyAgIGRpc3BsYXlpbmcsIGlmIHRoZXkgYXJlIGRpZmZlcmVudC4gIFRoZSBsb2cgb3V0cHV0IGVuY29kaW5nCisgICBpcyBkZXRlcm1pbmVkIGJ5ICJnaXQgbG9nIC0tZW5jb2Rpbmc9PGVuY29kaW5nPiIsCisgICBpMThuLmxvZ291dHB1dGVuY29kaW5nIGNvbmZpZ3VyYXRpb24sIG9yIGkxOG4uY29tbWl0ZW5jb2RpbmcKKyAgIGNvbmZpZ3VyYXRpb24sIGluIHRoZSBkZWNyZWFzaW5nIG9yZGVyIG9mIHByZWZlcmVuY2UsIGFuZAorICAgZGVmYXVsdHMgdG8gVVRGLTguCisKKyAtIFRvb2xzIGZvciBlLW1haWxlZCBwYXRjaCBhcHBsaWNhdGlvbiBub3cgZGVmYXVsdCB0byAtdQorICAgYmVoYXZpb3I7IGkuZS4gaXQgYWx3YXlzIHJlLWNvZGVzIGZyb20gdGhlIGUtbWFpbGVkIGVuY29kaW5nCisgICB0byB0aGUgZW5jb2Rpbmcgc3BlY2lmaWVkIHdpdGggaTE4bi5jb21taXRlbmNvZGluZy4gIFRoaXMKKyAgIHVuZm9ydHVuYXRlbHkgZm9yY2VzIHByb2plY3RzIHRoYXQgaGF2ZSBoYXBwaWx5IGJlZW4gdXNpbmcgYQorICAgbGVnYWN5IGVuY29kaW5nIHdpdGhvdXQgc2V0dGluZyBpMThuLmNvbW1pdGVuY29kaW5nIHRvIHNldAorICAgdGhlIGNvbmZpZ3VyYXRpb24sIGJ1dCB0YWtlbiB3aXRoIG90aGVyIGltcHJvdmVtZW50LCBwbGVhc2UKKyAgIGV4Y3VzZSB1cyBmb3IgdGhpcyB2ZXJ5IG1pbm9yIG9uZS10aW1lIGluY29udmVuaWVuY2UuCisKKworKiBlLW1haWxlZCBwYXRjaGVzCisKKyAtIFNlZSB0aGUgYWJvdmUgSTE4biBzZWN0aW9uLgorCisgLSBnaXQtZm9ybWF0LXBhdGNoIG5vdyBlbmFibGVzIC0tYmluYXJ5IHdpdGhvdXQgYmVpbmcgYXNrZWQuCisgICBnaXQtYW0gZG9lcyBfbm90XyBkZWZhdWx0IHRvIGl0LCBhcyBzZW5kaW5nIGJpbmFyeSBwYXRjaCB2aWEKKyAgIGUtbWFpbCBpcyB1bnVzdWFsIGFuZCBpcyBoYXJkZXIgdG8gcmV2aWV3IHRoYW4gdGV4dHVhbAorICAgcGF0Y2hlcyBhbmQgaXQgaXMgcHJ1ZGVudCB0byByZXF1aXJlIHRoZSBwZXJzb24gd2hvIGlzCisgICBhcHBseWluZyB0aGUgcGF0Y2ggdG8gZXhwbGljaXRseSBhc2sgZm9yIGl0LgorCisgLSBUaGUgZGVmYXVsdCBzdWZmaXggZm9yIGdpdC1mb3JtYXQtcGF0Y2ggb3V0cHV0IGlzIG5vdyAiLnBhdGNoIiwKKyAgIG5vdCAiLnR4dCIuICBUaGlzIGNhbiBiZSBjaGFuZ2VkIHdpdGggLS1zdWZmaXg9LnR4dCBvcHRpb24sCisgICBvciBzZXR0aW5nIHRoZSBjb25maWcgdmFyaWFibGUgImZvcm1hdC5zdWZmaXgiIHRvICIudHh0Ii4KKworCisqIEZvcmVpZ24gU0NNIGludGVyZmFjZXMKKworIC0gZ2l0LXN2biBub3cgcmVxdWlyZXMgdGhlIFBlcmwgU1ZOOjogbGlicmFyaWVzLCB0aGUKKyAgIGNvbW1hbmQtbGluZSBiYWNrZW5kIHdhcyB0b28gc2xvdyBhbmQgbGltaXRlZC4KKworIC0gdGhlICdjb21taXQnIHN1YmNvbW1hbmQgb2YgZ2l0LXN2biBoYXMgYmVlbiByZW5hbWVkIHRvCisgICAnc2V0LXRyZWUnLCBhbmQgJ2Rjb21taXQnIGlzIHRoZSByZWNvbW1lbmRlZCByZXBsYWNlbWVudCBmb3IKKyAgIGRheS10by1kYXkgd29yay4KKworIC0gZ2l0IGZhc3QtaW1wb3J0IGJhY2tlbmQuCisKKworKiBVc2VyIHN1cHBvcnQKKworIC0gUXVpdGUgYSBsb3Qgb2YgZG9jdW1lbnRhdGlvbiB1cGRhdGVzLgorCisgLSBCYXNoIGNvbXBsZXRpb24gc2NyaXB0cyBoYXZlIGJlZW4gdXBkYXRlZCBoZWF2aWx5LgorCisgLSBCZXR0ZXIgZXJyb3IgbWVzc2FnZXMgZm9yIG9mdGVuIHVzZWQgUG9yY2VsYWluaXNoIGNvbW1hbmRzLgorCisgLSBHaXQgR1VJLiAgVGhpcyBpcyBhIHNpbXBsZSBUayBiYXNlZCBncmFwaGljYWwgaW50ZXJmYWNlIGZvcgorICAgY29tbW9uIEdpdCBvcGVyYXRpb25zLgorCisKKyogU2xpZGluZyBtbWFwCisKKyAtIFdlIHVzZWQgdG8gYXNzdW1lIHRoYXQgd2UgY2FuIG1tYXAgdGhlIHdob2xlIHBhY2tmaWxlIHdoaWxlCisgICBpbiB1c2UsIGJ1dCB3aXRoIGEgbGFyZ2UgcHJvamVjdCB0aGlzIGNvbnN1bWVzIGh1Z2UgdmlydHVhbAorICAgbWVtb3J5IHNwYWNlIGFuZCB0cnVseSBodWdlIG9uZXMgd291bGQgbm90IGZpdCBpbiB0aGUKKyAgIHVzZXJsYW5kIGFkZHJlc3Mgc3BhY2Ugb24gMzItYml0IHBsYXRmb3Jtcy4gIFdlIG5vdyBtbWFwIGh1Z2UKKyAgIHBhY2tmaWxlIGluIHBpZWNlcyB0byBhdm9pZCB0aGlzIHByb2JsZW0uCisKKworKiBTaGFsbG93IGNsb25lcworCisgLSBUaGVyZSBpcyBhIHBhcnRpYWwgc3VwcG9ydCBmb3IgJ3NoYWxsb3cnIHJlcG9zaXRvcmllcyB0aGF0CisgICBrZWVwcyBvbmx5IHJlY2VudCBoaXN0b3J5LiAgQSAnc2hhbGxvdyBjbG9uZScgaXMgY3JlYXRlZCBieQorICAgc3BlY2lmeWluZyBob3cgZGVlcCB0aGF0IHRydW5jYXRlZCBoaXN0b3J5IHNob3VsZCBiZQorICAgKGUuZy4gImdpdCBjbG9uZSAtLWRlcHRoIDUgZ2l0Oi8vc29tZS53aGVyZS9yZXBvLmdpdCIpLgorCisgICBDdXJyZW50bHkgYSBzaGFsbG93IHJlcG9zaXRvcnkgaGFzIG51bWJlciBvZiBsaW1pdGF0aW9uczoKKworICAgLSBDbG9uaW5nIGFuZCBmZXRjaGluZyBfZnJvbV8gYSBzaGFsbG93IGNsb25lIGFyZSBub3QKKyAgICAgc3VwcG9ydGVkIChub3IgdGVzdGVkIC0tIHNvIHRoZXkgbWlnaHQgd29yayBieSBhY2NpZGVudCBidXQKKyAgICAgdGhleSBhcmUgbm90IGV4cGVjdGVkIHRvKS4KKworICAgLSBQdXNoaW5nIGZyb20gbm9yIGludG8gYSBzaGFsbG93IGNsb25lIGFyZSBub3QgZXhwZWN0ZWQgdG8KKyAgICAgd29yay4KKworICAgLSBNZXJnaW5nIGluc2lkZSBhIHNoYWxsb3cgcmVwb3NpdG9yeSB3b3VsZCB3b3JrIGFzIGxvbmcgYXMgYQorICAgICBtZXJnZSBiYXNlIGlzIGZvdW5kIGluIHRoZSByZWNlbnQgaGlzdG9yeSwgYnV0IG90aGVyd2lzZSBpdAorICAgICB3aWxsIGJlIGxpa2UgbWVyZ2luZyB1bnJlbGF0ZWQgaGlzdG9yaWVzIGFuZCBtYXkgcmVzdWx0IGluCisgICAgIGh1Z2UgY29uZmxpY3RzLgorCisgICBidXQgdGhpcyB3b3VsZCBiZSBtb3JlIHRoYW4gYWRlcXVhdGUgZm9yIHBlb3BsZSB3aG8gd2FudCB0bworICAgbG9vayBhdCBuZWFyIHRoZSB0aXAgb2YgYSBiaWcgcHJvamVjdCB3aXRoIGEgZGVlcCBoaXN0b3J5IGFuZAorICAgc2VuZCBwYXRjaGVzIGluIGUtbWFpbCBmb3JtYXQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4xLjEudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMS4xLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTQ3MTIxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMS4xLnR4dApAQCAtMCwwICsxLDY1IEBACitHSVQgdjEuNS4xLjEgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS4xCistLS0tLS0tLS0tLS0tLS0tLS0KKworKiBEb2N1bWVudGF0aW9uIHVwZGF0ZXMKKworICAtIFRoZSAtLWxlZnQtcmlnaHQgb3B0aW9uIG9mIHJldi1saXN0IGFuZCBmcmllbmRzIGlzIGRvY3VtZW50ZWQuCisKKyAgLSBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgY3ZzaW1wb3J0IGhhcyBiZWVuIG1ham9ybHkgaW1wcm92ZWQuCisKKyAgLSAiZ2l0LXNob3ctcmVmIC0tZXhjbHVkZS1leGlzdGluZyIgd2FzIGRvY3VtZW50ZWQuCisKKyogQnVnZml4ZXMKKworICAtIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiAtcCBvcHRpb24gaW4gImdpdCBjdnNleHBvcnRjb21taXQiIGhhZAorICAgIHRoZSBtZWFuaW5nIG9mIC1DIChjb250ZXh0IHJlZHVjdGlvbikgb3B0aW9uIHdyb25nLCBhbmQKKyAgICBsb29zZW5lZCB0aGUgY29udGV4dCByZXF1aXJlbWVudHMgd2hlbiBpdCB3YXMgdG9sZCB0byBiZQorICAgIHN0cmljdC4KKworICAtICJnaXQgY3Zzc2VydmVyIiBkaWQgbm90IGJlaGF2ZSBsaWtlIHRoZSByZWFsIGN2c3NlcnZlciB3aGVuCisgICAgY2xpZW50IHNpZGUgcmVtb3ZlZCBhIGZpbGUgZnJvbSB0aGUgd29ya2luZyB0cmVlIHdpdGhvdXQKKyAgICBkb2luZyBhbnl0aGluZyBlbHNlIG9uIHRoZSBwYXRoLiAgSW4gc3VjaCBhIGNhc2UsIGl0IHNob3VsZAorICAgIHJlc3RvcmUgaXQgZnJvbSB0aGUgY2hlY2tlZCBvdXQgcmV2aXNpb24uCisKKyAgLSAiZ2l0IGZzY2siIGlzc3VlZCBhbiBhbGFybWluZyBlcnJvciBtZXNzYWdlIG9uIGRldGFjaGVkCisgICAgSEVBRC4gIEl0IGlzIG5vdCBhbiBlcnJvciBzaW5jZSBhdCBsZWFzdCAxLjUuMC4KKworICAtICJnaXQgc2VuZC1lbWFpbCIgcHJvZHVjZWQgb2YgUmVmZXJlbmNlcyBoZWFkZXIgb2YgdW5ib3VuZGVkIGxlbmd0aDsKKyAgICBmaXhlZCB0aGlzIHdpdGggbGluZS1mb2xkaW5nLgorCisgIC0gImdpdCBhcmNoaXZlIiB0byBkb3dubG9hZCBmcm9tIHJlbW90ZSBzaXRlIHNob3VsZCBub3QKKyAgICByZXF1aXJlIHlvdSB0byBiZSBpbiBhIGdpdCByZXBvc2l0b3J5LCBidXQgaXQgaW5jb3JyZWN0bHkKKyAgICBkaWQuCisKKyAgLSAiZ2l0IGFwcGx5IiBpZ25vcmVkIC1wPG4+IGZvciAiZGlmZiAtLWdpdCIgZm9ybWF0dGVkCisgICAgcGF0Y2hlcy4KKworICAtICJnaXQgcmVyZXJlIiByZWNvcmRlZCBhIGNvbmZsaWN0IHRoYXQgaGFkIG9uZSBzaWRlIGVtcHR5CisgICAgKHRoZSBvdGhlciBzaWRlIGFkZHMpIGluY29ycmVjdGx5OyB0aGlzIG1hZGUgbWVyZ2luZyBpbiB0aGUKKyAgICBvdGhlciBkaXJlY3Rpb24gZmFpbCB0byB1c2UgcHJldmlvdXNseSByZWNvcmRlZCByZXNvbHV0aW9uLgorCisgIC0gdDQyMDAgdGVzdCB3YXMgYnJva2VuIHdoZXJlICJ3YyAtbCIgcGFkcyBpdHMgb3V0cHV0IHdpdGgKKyAgICBzcGFjZXMuCisKKyAgLSAiZ2l0IGJyYW5jaCAtbSBvbGQgbmV3IiB0byByZW5hbWUgYnJhbmNoIGRpZCBub3Qgd29yaworICAgIHdpdGhvdXQgYSBjb25maWd1cmF0aW9uIGZpbGUgaW4gIi5naXQvY29uZmlnIi4KKworICAtIFRoZSBzYW1wbGUgaG9vayBmb3Igbm90aWZpY2F0aW9uIGUtbWFpbCB3YXMgbWlzbmFtZWQuCisKKyAgLSBnaXR3ZWIgZGlkIG5vdCBzaG93IHR5cGUtY2hhbmdpbmcgcGF0Y2ggY29ycmVjdGx5IGluIHRoZQorICAgIGJsb2JkaWZmIHZpZXcuCisKKyAgLSBnaXQtc3ZuIGRpZCBub3QgZXJyb3Igb3V0IHdpdGggaW5jb3JyZWN0IGNvbW1hbmQgbGluZSBvcHRpb25zLgorCisgIC0gZ2l0LXN2biBmZWxsIGludG8gYW4gaW5maW5pdGUgbG9vcCB3aGVuIGluc2FuZWx5IGxvbmcgY29tbWl0CisgICAgbWVzc2FnZSB3YXMgZm91bmQuCisKKyAgLSBnaXQtc3ZuIGRjb21taXQgYW5kIHJlYmFzZSB3YXMgY29uZnVzZWQgYnkgcGF0Y2hlcyB0aGF0IHdlcmUKKyAgICBtZXJnZWQgZnJvbSBhbm90aGVyIGJyYW5jaCB0aGF0IGlzIG1hbmFnZWQgYnkgZ2l0LXN2bi4KKworICAtIGdpdC1zdm4gdXNlZCB0byBnZXQgY29uZnVzZWQgd2hlbiBnbG9iYmluZyByZW1vdGUgYnJhbmNoL3RhZworICAgIHNwZWMgKGUuZy4gImJyYW5jaGVzID0gcHJvai9icmFuY2hlcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpCisgICAgaXMgdXNlZCBhbmQgdGhlcmUgd2FzIGEgcGxhaW4gZmlsZSB0aGF0IG1hdGNoZWQgdGhlIGdsb2IuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4xLjIudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMS4yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODg0NTYzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMS4yLnR4dApAQCAtMCwwICsxLDUwIEBACitHSVQgdjEuNS4xLjIgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS4xLjEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogQnVnZml4ZXMKKworICAtICJnaXQgY2xvbmUiIG92ZXIgaHR0cCBmcm9tIGEgcmVwb3NpdG9yeSB0aGF0IGhhcyBsb3N0IHRoZQorICAgIGxvb3NlIHJlZnMgYnkgcnVubmluZyAiZ2l0IHBhY2stcmVmcyIgd2VyZSBicm9rZW4gKGEgY29kZSB0bworICAgIGRlYWwgd2l0aCB0aGlzIHdhcyBhZGRlZCB0byAiZ2l0IGZldGNoIiBpbiB2MS41LjAsIGJ1dCBpdAorICAgIHdhcyBtaXNzaW5nIGZyb20gImdpdCBjbG9uZSIpLgorCisgIC0gImdpdCBkaWZmIGEvIGIvIiBpbmNvcnJlY3RseSBmZWxsIGluICJkaWZmIGJldHdlZW4gdHdvCisgICAgZmlsZXN5c3RlbSBvYmplY3RzIiBjb2RlcGF0aCwgd2hlbiB0aGUgdXNlciBtb3N0IGxpa2VseQorICAgIHdhbnRlZCB0byBsaW1pdCB0aGUgZXh0ZW50IG9mIG91dHB1dCB0byB0d28gdHJhY2tlZAorICAgIGRpcmVjdG9yaWVzLgorCisgIC0gZ2l0LXF1aWx0aW1wb3J0IGhhZCB0aGUgc2FtZSBidWcgYXMgd2UgZml4ZWQgZm9yCisgICAgZ2l0LWFwcGx5bWJveCBpbiB2MS41LjEuMSAtLSBpdCBnYXZlIGFuIGFsYXJtaW5nICJkaWQgbm90CisgICAgaGF2ZSBhbnkgcGF0Y2giIG1lc3NhZ2UgKGJ1dCBkaWQgbm90IGFjdHVhbGx5IGZhaWwgYW5kIHdhcworICAgIGhhcm1sZXNzKS4KKworICAtIHZhcmlvdXMgZ2l0LXN2biBmaXhlcy4KKworICAtIFNhbXBsZSB1cGRhdGUgaG9vayBpbmNvcnJlY3RseSBhbHdheXMgcmVmdXNlZCByZXF1ZXN0cyB0bworICAgIGRlbGV0ZSBicmFuY2hlcyB0aHJvdWdoIHB1c2guCisKKyAgLSBnaXQtYmxhbWUgb24gYSB2ZXJ5IGxvbmcgd29ya2luZyB0cmVlIHBhdGggaGFkIGJ1ZmZlcgorICAgIG92ZXJydW4gcHJvYmxlbS4KKworICAtIGdpdC1hcHBseSBkaWQgbm90IGxpa2UgdG8gYmUgZmVkIHR3byBwYXRjaGVzIGluIGEgcm93IHRoYXQgY3JlYXRlZAorICAgIGFuZCB0aGVuIG1vZGlmaWVkIHRoZSBzYW1lIGZpbGUuCisKKyAgLSBnaXQtc3ZuIHdhcyBjb25mdXNlZCB3aGVuIGEgbm9uLXByb2plY3Qgd2FzIHN0b3JlZCBkaXJlY3RseSB1bmRlcgorICAgIHRydW5rLywgYnJhbmNoZXMvIGFuZCB0YWdzLy4KKworICAtIGdpdC1zdm4gd2FudHMgdGhlIEVycm9yLnBtIG1vZHVsZSB0aGF0IHdhcyBhdCBsZWFzdCBhcyBuZXcKKyAgICBhcyB3aGF0IHdlIHNoaXAgYXMgcGFydCBvZiBnaXQ7IGluc3RhbGwgb3VycyBpbiBvdXIgcHJpdmF0ZQorICAgIGluc3RhbGxhdGlvbiBsb2NhdGlvbiBpZiB0aGUgb25lIG9uIHRoZSBzeXN0ZW0gaXMgb2xkZXIuCisKKyAgLSBBbiBlYXJsaWVyIHVwZGF0ZSB0byBjb21tYW5kIGxpbmUgaW50ZWdlciBwYXJhbWV0ZXIgcGFyc2VyIHdhcworICAgIGJvdGNoZWQgYW5kIG1hZGUgJ3VwZGF0ZS1pbmRleCAtLWNhY2hlaW5mbycgY29tcGxldGVseSB1c2VsZXNzLgorCisKKyogRG9jdW1lbnRhdGlvbiB1cGRhdGVzCisKKyAgLSBWYXJpb3VzIGRvY3VtZW50YXRpb24gdXBkYXRlcyBmcm9tIEouIEJydWNlIEZpZWxkcywgRnJhbmsKKyAgICBMaWNodGVuaGVsZCwgQWxleCBSaWVzZW4gYW5kIG90aGVycy4gIEFuZHJldyBSdWRlciBzdGFydGVkIGEKKyAgICB3YXIgb24gdW5kb2N1bWVudGVkIG9wdGlvbnMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4xLjMudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMS4zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzY0MDhiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMS4zLnR4dApAQCAtMCwwICsxLDQ1IEBACitHSVQgdjEuNS4xLjMgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS4xLjIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogQnVnZml4ZXMKKworICAtIGdpdC1hZGQgdHJpZWQgdG8gb3B0aW1pemUgYnkgZmluZGluZyBjb21tb24gbGVhZGluZworICAgIGRpcmVjdG9yaWVzIGFjcm9zcyBpdHMgYXJndW1lbnRzIGJ1dCBib3RjaGVkLCBjYXVzaW5nIHZlcnkKKyAgICBjb25mdXNlZCBiZWhhdmlvdXIuCisKKyAgLSB1bm9mZmljaWFsIHJwbS5zcGVjIGZpbGUgc2hpcHBlZCB3aXRoIGdpdCB3YXMgbGV0dGluZworICAgIEVUQ19HSVRDT05GSUcgc2V0IHRvIC91c3IvZXRjL2dpdGNvbmZpZy4gIFR3ZWFrIHRoZSBvZmZpY2lhbAorICAgIE1ha2VmaWxlIHRvIG1ha2UgaXQgaGFyZGVyIGZvciBkaXN0cm8gcGVvcGxlIHRvIG1ha2UgdGhlCisgICAgc2FtZSBtaXN0YWtlLCBieSBzZXR0aW5nIHRoZSB2YXJpYWJsZSB0byAvZXRjL2dpdGNvbmZpZyBpZgorICAgIHByZWZpeCBpcyBzZXQgdG8gL3Vzci4KKworICAtIGdpdC1zdm4gaW5jb25zaXN0ZW50bHkgc3RyaXBwZWQgYXdheSB1c2VybmFtZSBmcm9tIHRoZSBVUkwKKyAgICBvbmx5IHdoZW4gc3Zuc3luY19wcm9wcyB3YXMgaW4gdXNlLgorCisgIC0gZ2l0LXN2biBnb3QgY29uZnVzZWQgd2hlbiBoYW5kbGluZyBzeW1saW5rcyBvbiBNYWMgT1MuCisKKyAgLSBnaXQtc2VuZC1lbWFpbCB3YXMgbm90IHF1b3RpbmcgcmVjaXBpZW50IG5hbWVzIHRoYXQgaGF2ZQorICAgIHBlcmlvZCAnLicgaW4gdGhlbS4gIEFsc28gaXQgZGlkIG5vdCBhbGxvdyBvdmVycmlkaW5nCisgICAgZW52ZWxvcGUgc2VuZGVyLCB3aGljaCBtYWRlIGl0IGltcG9zc2libGUgdG8gc2VuZCBwYXRjaGVzIHRvCisgICAgY2VydGFpbiBzdWJzY3JpYmVyLW9ubHkgbGlzdHMuCisKKyAgLSBidWlsdC1pbiB3cml0ZV90cmVlKCkgcm91dGluZSBoYWQgYSBzZXF1ZW5jZSB0aGF0IHJlbmFtZWQgYQorICAgIGZpbGUgdGhhdCBpcyBzdGlsbCBvcGVuLCB3aGljaCBzb21lIHN5c3RlbXMgZGlkIG5vdCBsaWtlLgorCisgIC0gd2hlbiBtZW1vcnkgaXMgdmVyeSB0aWdodCwgc2xpZGluZyBtbWFwIGNvZGUgdG8gcmVhZAorICAgIHBhY2tmaWxlcyBpbmNvcnJlY3RseSBjbG9zZWQgdGhlIGZkIHRoYXQgd2FzIHN0aWxsIGJlaW5nCisgICAgdXNlZCB0byByZWFkIHRoZSBwYWNrLgorCisgIC0gaW1wb3J0LXRhcnMgY29udHJpYnV0ZWQgZnJvbnQtZW5kIGZvciBmYXN0aW1wb3J0IHdhcyBwYXNzaW5nCisgICAgd3JvbmcgZGlyZWN0b3J5IG1vZGVzIHdpdGhvdXQgY2hlY2tpbmcuCisKKyAgLSBnaXQtZmFzdGltcG9ydCB0cnVzdGVkIGl0cyBpbnB1dCB0b28gbXVjaCBhbmQgYWxsb3dlZCB0bworICAgIGNyZWF0ZSBjb3JydXB0IHRyZWUgb2JqZWN0cyB3aXRoIGVudHJpZXMgd2l0aG91dCBhIG5hbWUuCisKKyAgLSBnaXQtZmV0Y2ggbmVlZGxlc3NseSBiYXJmZWQgd2hlbiB0b28gbG9uZyByZWZsb2cgYWN0aW9uCisgICAgZGVzY3JpcHRpb24gd2FzIGdpdmVuIGJ5IHRoZSBjYWxsZXIuCisKK0Fsc28gY29udGFpbnMgdmFyaW91cyBkb2N1bWVudGF0aW9uIHVwZGF0ZXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4xLjQudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMS40LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjJmNjZjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMS40LnR4dApAQCAtMCwwICsxLDMwIEBACitHSVQgdjEuNS4xLjQgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS4xLjMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogQnVnZml4ZXMKKworICAtICJnaXQtaHR0cC1mZXRjaCIgZGlkIG5vdCB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBsaWJjdXJsCisgICAgZWFybGllciB0aGFuIDcuMTYgKGN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZSgpIHdhcyBicm9rZW4pLgorCisgIC0gImdpdCBjdnNzZXJ2ZXIiIGhhbmRsZXMgYSBmaWxlIHRoYXQgd2FzIG9uY2UgcmVtb3ZlZCBhbmQKKyAgICB0aGVuIGFkZGVkIGFnYWluIGNvcnJlY3RseS4KKworICAtIGltcG9ydC10YXJzIHNjcmlwdCAoaW4gY29udHJpYi8pIGhhbmRsZXMgR05VIHRhciBhcmNoaXZlcworICAgIHRoYXQgY29udGFpbiBwYXRobmFtZXMgbG9uZ2VyIHRoYW4gMTAwIGJ5dGVzIChsb25nLWxpbmsKKyAgICBleHRlbnNpb24pIGNvcnJlY3RseS4KKworICAtIHhkZWx0YSB0ZXN0IHByb2dyYW0gZGlkIG5vdCBidWlsZCBjb3JyZWN0bHkuCisKKyAgLSBnaXR3ZWIgc29tZXRpbWVzIHRyaWVkIGluY29ycmVjdGx5IHRvIGFwcGx5IGZ1bmN0aW9uIHRvCisgICAgZGVjb2RlIHV0ZjggdHdpY2UsIHJlc3VsdGluZyBpbiBjb3JydXB0IG91dHB1dC4KKworICAtICJnaXQgYmxhbWUgLUMiIG1pc2hhbmRsZWQgdGV4dCBhdCB0aGUgZW5kIG9mIGEgZ3JvdXAgb2YKKyAgICBsaW5lcy4KKworICAtICJnaXQgbG9nL3Jldi1saXN0IC0tYm91bmRhcnkiIGRpZCBub3QgcHJvZHVjZSBvdXRwdXQKKyAgICBjb3JyZWN0bHkgd2l0aG91dCAtLWxlZnQtcmlnaHQgb3B0aW9uLgorCisgIC0gTWFueSBkb2N1bWVudGF0aW9uIHVwZGF0ZXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4xLjUudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMS41LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGFiOGViCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMS41LnR4dApAQCAtMCwwICsxLDQyIEBACitHSVQgdjEuNS4xLjUgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS4xLjQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogQnVnZml4ZXMKKworICAtIGdpdC1zZW5kLWVtYWlsIGRpZCBub3QgdW5kZXJzdGFuZCBhbGlhc2VzIGZpbGUgZm9yIG11dHQsIHdoaWNoCisgICAgYWxsb3dzIGxlYWRpbmcgd2hpdGVzcGFjZXMuCisKKyAgLSBnaXQtZm9ybWF0LXBhdGNoIGVtaXR0ZWQgQ29udGVudC1UeXBlIGFuZCBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nCisgICAgaGVhZGVycyBmb3Igbm9uIEFTQ0lJIGNvbnRlbnRzLCBidXQgZmFpbGVkIHRvIGFkZCBNSU1FLVZlcnNpb24uCisKKyAgLSBnaXQtbmFtZS1yZXYgaGFkIGEgYnVmZmVyIG92ZXJydW4gd2l0aCBhIGRlZXAgaGlzdG9yeS4KKworICAtIGNvbnRyaWJ1dGVkIHNjcmlwdCBpbXBvcnQtdGFycyBkaWQgbm90IGdldCB0aGUgZGlyZWN0b3J5IGluCisgICAgdGFyIGFyY2hpdmVzIGludGVycHJldGVkIGNvcnJlY3RseS4KKworICAtIGdpdC1zdm4gd2FzIHJlcG9ydGVkIHRvIHNlZ2ZhdWx0IGZvciBtYW55IHBlb3BsZSBvbiBsaXN0IGFuZAorICAgICNnaXQ7IGhvcGVmdWxseSB0aGlzIGhhcyBiZWVuIGZpeGVkLgorCisgIC0gImdpdC1zdm4gY2xvbmUiIGRvZXMgbm90IHRyeSB0byBtaW5pbWl6ZSB0aGUgVVJMCisgICAgKGkuZS4gY29ubmVjdCB0byBoaWdoZXIgbGV2ZWwgaGllcmFyY2h5KSBieSBkZWZhdWx0LCBhcyB0aGlzCisgICAgY2FuIHByZXZlbnQgY2xvbmUgdG8gZmFpbCBpZiBvbmx5IHBhcnQgb2YgdGhlIHJlcG9zaXRvcnkKKyAgICAoZS5nLiAndHJ1bmsnKSBpcyBvcGVuIHRvIHB1YmxpYy4KKworICAtICJnaXQgY2hlY2tvdXQgYnJhbmNoXjAiIGRpZCBub3QgZGV0YWNoIHRoZSBoZWFkIHdoZW4geW91IGFyZQorICAgIGFscmVhZHkgb24gJ2JyYW5jaCc7IGJhY2twb3J0ZWQgdGhlIGZpeCBmcm9tIHRoZSAnbWFzdGVyJy4KKworICAtICJnaXQtY29uZmlnIHNlY3Rpb24udmFyIiBkaWQgbm90IGNvcnJlY3RseSB3b3JrIHdoZW4KKyAgICBleGlzdGluZyBjb25maWd1cmF0aW9uIGZpbGUgaGFkIGJvdGggW3NlY3Rpb25dIGFuZCBbc2VjdGlvbiAibmFtZSJdCisgICAgbmV4dCB0byBlYWNoIG90aGVyLgorCisgIC0gImdpdCBjbG9uZSAuLi9vdGhlci1kaXJlY3RvcnkiIHdhcyBmb29sZWQgaWYgdGhlIGN1cnJlbnQKKyAgICBkaXJlY3RvcnkgJFBXRCBwb2ludHMgYXQgaXMgYSBzeW1ib2xpYyBsaW5rLgorCisgIC0gKGJ1aWxkKSB0cmVlX2VudHJ5X2V4dHJhY3QoKSBmdW5jdGlvbiB3YXMgYm90aCBzdGF0aWMgaW5saW5lCisgICAgYW5kIGV4dGVybiwgd2hpY2ggY2F1c2VkIHRyb3VibGUgY29tcGlsaW5nIHdpdGggRm9ydGUxMgorICAgIGNvbXBpbGVycyBvbiBTdW4uCisKKyAgLSBNYW55IG1hbnkgZG9jdW1lbnRhdGlvbiBmaXhlcyBhbmQgdXBkYXRlcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjEuNi50eHQgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4xLjYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZjNhYzEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4xLjYudHh0CkBAIC0wLDAgKzEsNDUgQEAKK0dJVCB2MS41LjEuNiBSZWxlYXNlIE5vdGVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitGaXhlcyBzaW5jZSB2MS41LjEuNAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBCdWdmaXhlcworCisgIC0gZ2l0LXNlbmQtZW1haWwgZGlkIG5vdCB1bmRlcnN0YW5kIGFsaWFzZXMgZmlsZSBmb3IgbXV0dCwgd2hpY2gKKyAgICBhbGxvd3MgbGVhZGluZyB3aGl0ZXNwYWNlcy4KKworICAtIGdpdC1mb3JtYXQtcGF0Y2ggZW1pdHRlZCBDb250ZW50LVR5cGUgYW5kIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcKKyAgICBoZWFkZXJzIGZvciBub24gQVNDSUkgY29udGVudHMsIGJ1dCBmYWlsZWQgdG8gYWRkIE1JTUUtVmVyc2lvbi4KKworICAtIGdpdC1uYW1lLXJldiBoYWQgYSBidWZmZXIgb3ZlcnJ1biB3aXRoIGEgZGVlcCBoaXN0b3J5LgorCisgIC0gY29udHJpYnV0ZWQgc2NyaXB0IGltcG9ydC10YXJzIGRpZCBub3QgZ2V0IHRoZSBkaXJlY3RvcnkgaW4KKyAgICB0YXIgYXJjaGl2ZXMgaW50ZXJwcmV0ZWQgY29ycmVjdGx5LgorCisgIC0gZ2l0LXN2biB3YXMgcmVwb3J0ZWQgdG8gc2VnZmF1bHQgZm9yIG1hbnkgcGVvcGxlIG9uIGxpc3QgYW5kCisgICAgI2dpdDsgaG9wZWZ1bGx5IHRoaXMgaGFzIGJlZW4gZml4ZWQuCisKKyAgLSBnaXQtc3ZuIGFsc28gaGFkIGEgYnVnIHRvIGNyYXNoIHN2bnNlcnZlIGJ5IHNlbmRpbmcgYSBiYWQKKyAgICBzZXF1ZW5jZSBvZiByZXF1ZXN0cy4KKworICAtICJnaXQtc3ZuIGNsb25lIiBkb2VzIG5vdCB0cnkgdG8gbWluaW1pemUgdGhlIFVSTAorICAgIChpLmUuIGNvbm5lY3QgdG8gaGlnaGVyIGxldmVsIGhpZXJhcmNoeSkgYnkgZGVmYXVsdCwgYXMgdGhpcworICAgIGNhbiBwcmV2ZW50IGNsb25lIHRvIGZhaWwgaWYgb25seSBwYXJ0IG9mIHRoZSByZXBvc2l0b3J5CisgICAgKGUuZy4gJ3RydW5rJykgaXMgb3BlbiB0byBwdWJsaWMuCisKKyAgLSAiZ2l0IGNoZWNrb3V0IGJyYW5jaF4wIiBkaWQgbm90IGRldGFjaCB0aGUgaGVhZCB3aGVuIHlvdSBhcmUKKyAgICBhbHJlYWR5IG9uICdicmFuY2gnOyBiYWNrcG9ydGVkIHRoZSBmaXggZnJvbSB0aGUgJ21hc3RlcicuCisKKyAgLSAiZ2l0LWNvbmZpZyBzZWN0aW9uLnZhciIgZGlkIG5vdCBjb3JyZWN0bHkgd29yayB3aGVuCisgICAgZXhpc3RpbmcgY29uZmlndXJhdGlvbiBmaWxlIGhhZCBib3RoIFtzZWN0aW9uXSBhbmQgW3NlY3Rpb24gIm5hbWUiXQorICAgIG5leHQgdG8gZWFjaCBvdGhlci4KKworICAtICJnaXQgY2xvbmUgLi4vb3RoZXItZGlyZWN0b3J5IiB3YXMgZm9vbGVkIGlmIHRoZSBjdXJyZW50CisgICAgZGlyZWN0b3J5ICRQV0QgcG9pbnRzIGF0IGlzIGEgc3ltYm9saWMgbGluay4KKworICAtIChidWlsZCkgdHJlZV9lbnRyeV9leHRyYWN0KCkgZnVuY3Rpb24gd2FzIGJvdGggc3RhdGljIGlubGluZQorICAgIGFuZCBleHRlcm4sIHdoaWNoIGNhdXNlZCB0cm91YmxlIGNvbXBpbGluZyB3aXRoIEZvcnRlMTIKKyAgICBjb21waWxlcnMgb24gU3VuLgorCisgIC0gTWFueSBtYW55IGRvY3VtZW50YXRpb24gZml4ZXMgYW5kIHVwZGF0ZXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4xLnR4dCBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZWQzNjcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4xLnR4dApAQCAtMCwwICsxLDM3MSBAQAorR0lUIHYxLjUuMSBSZWxlYXNlIE5vdGVzCis9PT09PT09PT09PT09PT09PT09PT09PT0KKworVXBkYXRlcyBzaW5jZSB2MS41LjAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogRGVwcmVjYXRlZCBjb21tYW5kcyBhbmQgb3B0aW9ucy4KKworICAtIGdpdC1kaWZmLXN0YWdlcyBhbmQgZ2l0LXJlc29sdmUgaGF2ZSBiZWVuIHJlbW92ZWQuCisKKyogTmV3IGNvbW1hbmRzIGFuZCBvcHRpb25zLgorCisgIC0gImdpdCBsb2ciIGFuZCBmcmllbmRzIHRha2UgLS1yZXZlcnNlLCB3aGljaCBpbnN0cnVjdHMgdGhlbQorICAgIHRvIGdpdmUgdGhlaXIgb3V0cHV0IGluIHRoZSBvcmRlciBvcHBvc2l0ZSBmcm9tIHRoZWlyIHVzdWFsLgorICAgIFRoZXkgdHlwaWNhbGx5IG91dHB1dCBmcm9tIG5ldyB0byBvbGQsIGJ1dCB3aXRoIHRoaXMgb3B0aW9uCisgICAgdGhlaXIgb3V0cHV0IHdvdWxkIHJlYWQgZnJvbSBvbGQgdG8gbmV3LiAgImdpdCBzaG9ydGxvZyIKKyAgICB1c3VhbGx5IGxpc3RzIG9sZGVyIGNvbW1pdHMgZmlyc3QsIGJ1dCB3aXRoIHRoaXMgb3B0aW9uLAorICAgIHRoZXkgYXJlIHNob3duIGZyb20gbmV3IHRvIG9sZC4KKworICAtICJnaXQgbG9nIC0tcHJldHR5PWZvcm1hdDo8c3RyaW5nPiIgdG8gYWxsb3cgbW9yZSBmbGV4aWJsZQorICAgIGN1c3RvbSBsb2cgb3V0cHV0LgorCisgIC0gImdpdCBkaWZmIiBsZWFybmVkIC0taWdub3JlLXNwYWNlLWF0LWVvbC4gIFRoaXMgaXMgYSB3ZWFrZXIKKyAgICBmb3JtIG9mIC0taWdub3JlLXNwYWNlLWNoYW5nZS4KKworICAtICJnaXQgZGlmZiAtLW5vLWluZGV4IHBhdGhBIHBhdGhCIiBjYW4gYmUgdXNlZCBhcyBkaWZmCisgICAgcmVwbGFjZW1lbnQgd2l0aCBnaXQgc3BlY2lmaWMgZW5oYW5jZW1lbnRzLgorCisgIC0gImdpdCBkaWZmIC0tbm8taW5kZXgiIGNhbiByZWFkIGZyb20gJy0nIChzdGFuZGFyZCBpbnB1dCkuCisKKyAgLSAiZ2l0IGRpZmYiIGFsc28gbGVhcm5lZCAtLWV4aXQtY29kZSB0byBleGl0IHdpdGggbm9uLXplcm8KKyAgICBzdGF0dXMgd2hlbiBpdCBmb3VuZCBkaWZmZXJlbmNlcy4gIEluIHRoZSBmdXR1cmUgd2UgbWlnaHQKKyAgICB3YW50IHRvIG1ha2UgdGhpcyB0aGUgZGVmYXVsdCBidXQgdGhhdCB3b3VsZCBiZSBhIHJhdGhlciBiaWcKKyAgICBiYWNrd2FyZCBpbmNvbXBhdGlibGUgY2hhbmdlOyBpdCB3aWxsIHN0YXkgYXMgYW4gb3B0aW9uIGZvcgorICAgIG5vdy4KKworICAtICJnaXQgZGlmZiAtLXF1aWV0IiBpcyAtLWV4aXQtY29kZSB3aXRoIG91dHB1dCB0dXJuZWQgb2ZmLAorICAgIG1lYW50IGZvciBzY3JpcHRlZCB1c2UgdG8gcXVpY2tseSBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgYW55CisgICAgdHJlZS1sZXZlbCBkaWZmZXJlbmNlLgorCisgIC0gVGV4dHVhbCBwYXRjaCBnZW5lcmF0aW9uIHdpdGggImdpdCBkaWZmIiB3aXRob3V0IC13Ly1iCisgICAgb3B0aW9uIGhhcyBiZWVuIHNpZ25pZmljYW50bHkgb3B0aW1pemVkLiAgImdpdCBibGFtZSIgZ290CisgICAgZmFzdGVyIGJlY2F1c2Ugb2YgdGhlIHNhbWUgY2hhbmdlLgorCisgIC0gImdpdCBsb2ciIGFuZCAiZ2l0IHJldi1saXN0IiBoYXMgYmVlbiBvcHRpbWl6ZWQKKyAgICBzaWduaWZpY2FudGx5IHdoZW4gdGhleSBhcmUgdXNlZCB3aXRoIHBhdGhzcGVjcy4KKworICAtICJnaXQgYnJhbmNoIC0tdHJhY2siIGNhbiBiZSB1c2VkIHRvIHNldCB1cCBjb25maWd1cmF0aW9uCisgICAgdmFyaWFibGVzIHRvIGhlbHAgaXQgZWFzaWVyIHRvIGJhc2UgeW91ciB3b3JrIG9uIGJyYW5jaGVzCisgICAgeW91IHRyYWNrIGZyb20gYSByZW1vdGUgc2l0ZS4KKworICAtICJnaXQgZm9ybWF0LXBhdGNoIC0tYXR0YWNoIiBub3cgZW1pdHMgYXR0YWNobWVudHMuICBVc2UKKyAgICAtLWlubGluZSB0byBnZXQgYW4gaW5saW5lZCBtdWx0aXBhcnQvbWl4ZWQuCisKKyAgLSAiZ2l0IG5hbWUtcmV2IiBsZWFybmVkIC0tcmVmcz08cGF0dGVybj4sIHRvIGxpbWl0IHRoZSB0YWdzCisgICAgdXNlZCBmb3IgbmFtaW5nIHRoZSBnaXZlbiByZXZpc2lvbnMgb25seSB0byB0aGUgb25lcworICAgIG1hdGNoaW5nIHRoZSBnaXZlbiBwYXR0ZXJuLgorCisgIC0gImdpdCByZW1vdGUgdXBkYXRlIiBpcyB0byBydW4gImdpdCBmZXRjaCIgZm9yIGRlZmluZWQgcmVtb3RlcworICAgIHRvIHVwZGF0ZSB0cmFja2luZyBicmFuY2hlcy4KKworICAtICJnaXQgY3ZzaW1wb3J0IiBjYW4gbm93IHRha2UgJy1kJyB0byB0YWxrIHdpdGggYSBDVlMKKyAgICByZXBvc2l0b3J5IGRpZmZlcmVudCBmcm9tIHdoYXQgYXJlIHJlY29yZGVkIGluIENWUy9Sb290CisgICAgKG92ZXJyaWRpbmcgaXQgd2l0aCBlbnZpcm9ubWVudCBDVlNST09UIGRvZXMgbm90IHdvcmspLgorCisgIC0gImdpdCBidW5kbGUiIGNhbiBoZWxwIHNuZWFrZXItbmV0dGluZyB5b3VyIGNoYW5nZXMgYmV0d2VlbgorICAgIHJlcG9zaXRvcmllcy4KKworICAtICJnaXQgbWVyZ2V0b29sIiBjYW4gaGVscCAzLXdheSBmaWxlLWxldmVsIGNvbmZsaWN0CisgICAgcmVzb2x1dGlvbiB3aXRoIHlvdXIgZmF2b3JpdGUgZ3JhcGhpY2FsIG1lcmdlIHRvb2xzLgorCisgIC0gQSBuZXcgY29uZmlndXJhdGlvbiAiY29yZS5zeW1saW5rcyIgY2FuIGJlIHVzZWQgdG8gZGlzYWJsZQorICAgIHN5bWxpbmtzIG9uIGZpbGVzeXN0ZW1zIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlbTsgdGhleSBhcmUKKyAgICBjaGVja2VkIG91dCBhcyByZWd1bGFyIGZpbGVzIGluc3RlYWQuCisKKyAgLSBZb3UgY2FuIG5hbWUgYSBjb21taXQgb2JqZWN0IHdpdGggaXRzIGZpcnN0IGxpbmUgb2YgdGhlCisgICAgbWVzc2FnZS4gIFRoZSBzeW50YXggdG8gdXNlIGlzICc6L21lc3NhZ2UgdGV4dCcuICBFLmcuCisKKyAgICAkIGdpdCBzaG93ICI6L29iamVjdCBuYW1lOiBpbnRyb2R1Y2UgJzovPG9uZWxpbmUgcHJlZml4Picgbm90YXRpb24iCisKKyAgICBtZWFucyB0aGUgc2FtZSB0aGluZyBhczoKKworICAgICQgZ2l0IHNob3cgMjhhNGQ5NDA0NDM4MDY0MTJlZmZhMjQ2ZWNjNzc2OGEyMTU1M2VjNworCisgIC0gImdpdCBiaXNlY3QiIGxlYXJuZWQgYSBuZXcgY29tbWFuZCAicnVuIiB0aGF0IHRha2VzIGEgc2NyaXB0CisgICAgdG8gcnVuIGFmdGVyIGVhY2ggcmV2aXNpb24gaXMgY2hlY2tlZCBvdXQgdG8gZGV0ZXJtaW5lIGlmIGl0CisgICAgaXMgZ29vZCBvciBiYWQsIHRvIGF1dG9tYXRlIHRoZSBiaXNlY3Rpb24gcHJvY2Vzcy4KKworICAtICJnaXQgbG9nIiBmYW1pbHkgbGVhcm5lZCBhIG5ldyB0cmF2ZXJzYWwgb3B0aW9uIC0tZmlyc3QtcGFyZW50LAorICAgIHdoaWNoIGRvZXMgd2hhdCB0aGUgbmFtZSBzdWdnZXN0cy4KKworCisqIFVwZGF0ZWQgYmVoYXZpb3Igb2YgZXhpc3RpbmcgY29tbWFuZHMuCisKKyAgLSAiZ2l0LW1lcmdlLXJlY3Vyc2l2ZSIgdXNlZCB0byBiYXJmIHdoZW4gdGhlcmUgYXJlIG1vcmUgdGhhbgorICAgIG9uZSBjb21tb24gYW5jZXN0b3JzIGZvciB0aGUgbWVyZ2UsIGFuZCBtZXJnaW5nIHRoZW0gaGFkIGEKKyAgICByZW5hbWUvcmVuYW1lIGNvbmZsaWN0LiAgVGhpcyBoYXMgYmVlbiBmaXhlZC4KKworICAtICJnaXQgZnNjayIgZG9lcyBub3QgYmFyZiBvbiBjb3JydXB0IGxvb3NlIG9iamVjdHMuCisKKyAgLSAiZ2l0IHJtIiBkb2VzIG5vdCByZW1vdmUgbmV3bHkgYWRkZWQgZmlsZXMgd2l0aG91dCAtZi4KKworICAtICJnaXQgYXJjaGltcG9ydCIgYWxsb3dzIHJlbWFwcGluZyB3aGVuIGNvbWluZyB1cCB3aXRoIGdpdAorICAgIGJyYW5jaCBuYW1lcyBmcm9tIGFyY2ggbmFtZXMuCisKKyAgLSBnaXQtc3ZuIGdvdCBhbG1vc3QgYSByZXdyaXRlLgorCisgIC0gY29yZS5hdXRvY3JsZiBjb25maWd1cmF0aW9uLCB3aGVuIHNldCB0byAndHJ1ZScsIG1ha2VzIGdpdAorICAgIHRvIGNvbnZlcnQgQ1JMRiBhdCB0aGUgZW5kIG9mIGxpbmVzIGluIHRleHQgZmlsZXMgdG8gTEYgd2hlbgorICAgIHJlYWRpbmcgZnJvbSB0aGUgZmlsZXN5c3RlbSwgYW5kIGNvbnZlcnQgaW4gcmV2ZXJzZSB3aGVuCisgICAgd3JpdGluZyB0byB0aGUgZmlsZXN5c3RlbS4gIFRoZSB2YXJpYWJsZSBjYW4gYmUgc2V0IHRvCisgICAgJ2lucHV0JywgaW4gd2hpY2ggY2FzZSB0aGUgY29udmVyc2lvbiBoYXBwZW5zIG9ubHkgd2hpbGUKKyAgICByZWFkaW5nIGZyb20gdGhlIGZpbGVzeXN0ZW0gYnV0IGZpbGVzIGFyZSB3cml0dGVuIG91dCB3aXRoCisgICAgTEYgYXQgdGhlIGVuZCBvZiBsaW5lcy4gIEN1cnJlbnRseSwgd2hpY2ggcGF0aHMgdG8gY29uc2lkZXIKKyAgICAndGV4dCcgKGkuZS4gYmUgc3ViamVjdGVkIHRvIHRoZSBhdXRvY3JsZiBtZWNoYW5pc20pIGlzCisgICAgZGVjaWRlZCBwdXJlbHkgYmFzZWQgb24gdGhlIGNvbnRlbnRzLCBidXQgdGhlIHBsYW4gaXMgdG8KKyAgICBhbGxvdyB1c2VycyB0byBleHBsaWNpdGx5IG92ZXJyaWRlIHRoaXMgaGV1cmlzdGljIGJhc2VkIG9uCisgICAgcGF0aHMuCisKKyAgLSBUaGUgYmVoYXZpb3Igb2YgJ2dpdC1hcHBseScsIHdoZW4gcnVuIGluIGEgc3ViZGlyZWN0b3J5LAorICAgIHdpdGhvdXQgLS1pbmRleCBub3IgLS1jYWNoZWQgd2VyZSBpbmNvbnNpc3RlbnQgd2l0aCB0aGF0IG9mCisgICAgdGhlIGNvbW1hbmQgd2l0aCB0aGVzZSBvcHRpb25zLiAgVGhpcyB3YXMgZml4ZWQgdG8gbWF0Y2ggdGhlCisgICAgYmVoYXZpb3Igd2l0aCAtLWluZGV4LiAgQSBwYXRjaCB0aGF0IGlzIG1lYW50IHRvIGJlIGFwcGxpZWQKKyAgICB3aXRoIC1wMSBmcm9tIHRoZSB0b3BsZXZlbCBvZiB0aGUgcHJvamVjdCB0cmVlIGNhbiBiZQorICAgIGFwcGxpZWQgd2l0aCBhbnkgY3VzdG9tIC1wPG4+IG9wdGlvbi4gIEEgcGF0Y2ggdGhhdCBpcyBub3QKKyAgICByZWxhdGl2ZSB0byB0aGUgdG9wbGV2ZWwgbmVlZHMgdG8gYmUgYXBwbGllZCB3aXRoIC1wPG4+CisgICAgb3B0aW9uIHdpdGggb3Igd2l0aG91dCAtLWluZGV4IChvciAtLWNhY2hlZCkuCisKKyAgLSAiZ2l0IGRpZmYiIG91dHB1dHMgYSB0cmFpbGluZyBIVCB3aGVuIHBhdGhuYW1lcyBoYXZlIGVtYmVkZGVkCisgICAgU1Agb24gKysrLy0tLSBoZWFkZXIgbGluZXMsIGluIG9yZGVyIHRvIGhlbHAgIkdOVSBwYXRjaCIgdG8KKyAgICBwYXJzZSBpdHMgb3V0cHV0LiAgImdpdCBhcHBseSIgd2FzIGFscmVhZHkgdXBkYXRlZCB0byBhY2NlcHQKKyAgICB0aGlzIG1vZGlmaWVkIG91dHB1dCBmb3JtYXQgc2luY2UgY2U3NDYxOGQgKFNlcCAyMiwgMjAwNikuCisKKyAgLSAiZ2l0IGN2c3NlcnZlciIgcnVucyBob29rcy91cGRhdGUgYW5kIGhvbm9ycyBpdHMgZXhpdCBzdGF0dXMuCisKKyAgLSAiZ2l0IGN2c3NlcnZlciIgY2FuIGJlIHRvbGQgdG8gc2VuZCBldmVyeXRoaW5nIHdpdGggLWtiLgorCisgIC0gImdpdCBkaWZmIC0tY2hlY2siIGFsc28gaG9ub3JzIHRoZSAtLWNvbG9yIG91dHB1dCBvcHRpb24uCisKKyAgLSAiZ2l0IG5hbWUtcmV2IiB1c2VkIHRvIHN0cmVzcyB0aGUgZmFjdCB0aGF0IGEgcmVmIGlzIGEgdGFnIHRvbworICAgIG11Y2gsIGJ5IHNheWluZyBzb21ldGhpbmcgbGlrZSAidjEuMi4zXjB+MjIiLiAgSXQgbm93IHNheXMKKyAgICAidjEuMi4zfjIyIiBpbiBzdWNoIGEgY2FzZSAoaXQgc3RpbGwgc2F5cyAidjEuMi4zXjAiIGlmIGl0IGRvZXMKKyAgICBub3QgdGFsayBhYm91dCBhbiBhbmNlc3RvciBvZiB0aGUgY29tbWl0IHRoYXQgaXMgdGFnZ2VkLCB3aGljaAorICAgIG1ha2VzIHNlbnNlKS4KKworICAtICJnaXQgcmV2LWxpc3QgLS1ib3VuZGFyeSIgbm93IHNob3dzIGJvdW5kYXJ5IG1hcmtlcnMgZm9yIHRoZQorICAgIGNvbW1pdHMgb21pdHRlZCBieSAtLW1heC1hZ2UgYW5kIC0tbWF4LWNvdW50IGNvbmRpdGlvbi4KKworICAtIFRoZSBjb25maWd1cmF0aW9uIG1lY2hhbmlzbSBub3cgcmVhZHMgJChwcmVmaXgpL2V0Yy9naXRjb25maWcuCisKKyAgLSAiZ2l0IGFwcGx5IC0tdmVyYm9zZSIgc2hvd3Mgd2hhdCBwcmVpbWFnZSBsaW5lcyB3ZXJlIHdhbnRlZAorICAgIHdoZW4gaXQgY291bGRuJ3QgZmluZCB0aGVtLgorCisgIC0gImdpdCBzdGF0dXMiIGluIGEgcmVhZC1vbmx5IHJlcG9zaXRvcnkgZ290IGEgYml0IHNhbmVyLgorCisgIC0gImdpdCBmZXRjaCIgKGhlbmNlICJnaXQgY2xvbmUiIGFuZCAiZ2l0IHB1bGwiKSBhcmUgbGVzcworICAgIG5vaXN5IHdoZW4gdGhlIG91dHB1dCBkb2VzIG5vdCBnbyB0byB0dHkuCisKKyAgLSAiZ2l0IGZldGNoIiBiZXR3ZWVuIHJlcG9zaXRvcmllcyB3aXRoIG1hbnkgcmVmcyB3ZXJlIHNsb3cKKyAgICBldmVuIHdoZW4gdGhlcmUgYXJlIG5vdCBtYW55IGNoYW5nZXMgdGhhdCBuZWVkZWQKKyAgICB0cmFuc2ZlcnJpbmcuICBUaGlzIGhhcyBiZWVuIHNwZWQgdXAgYnkgcGFydGlhbGx5IHJld3JpdGluZworICAgIHRoZSBoZWF2aWVzdCBwYXJ0cyBpbiBDLgorCisgIC0gImdpdCBtYWlsaW5mbyIgd2hpY2ggc3BsaXRzIGFuIGUtbWFpbCBpbnRvIGEgcGF0Y2ggYW5kIHRoZQorICAgIG1ldGEtaW5mb3JtYXRpb24gd2FzIHJld3JpdHRlbiwgdGhhbmtzIHRvIERvbiBaaWNrdXMuICBJdAorICAgIGhhbmRsZXMgbmVzdGVkIG11bHRpcGFydCBiZXR0ZXIuICBUaGUgY29tbWFuZCB3YXMgYnJva2VuIGZvcgorICAgIGEgYnJpZWYgcGVyaW9kIG9uICdtYXN0ZXInIGJyYW5jaCBzaW5jZSAxLjUuMCBidXQgdGhlCisgICAgYnJlYWthZ2UgaXMgZml4ZWQgbm93LgorCisgIC0gc2VuZC1lbWFpbCBsZWFybmVkIGNvbmZpZ3VyYWJsZSBiY2MgYW5kIGNoYWluLXJlcGx5LXRvLgorCisgIC0gImdpdCByZW1vdGUgc2hvdyAkcmVtb3RlIiBhbHNvIHRhbGtzIGFib3V0IGJyYW5jaGVzIHRoYXQKKyAgICB3b3VsZCBiZSBwdXNoZWQgaWYgeW91IHJ1biAiZ2l0IHB1c2ggcmVtb3RlIi4KKworICAtIFVzaW5nIG9iamVjdHMgZnJvbSBwYWNrcyBpcyBub3cgc2VyaW91c2x5IG9wdGltaXplZCBieSBjbGV2ZXIKKyAgICB1c2Ugb2YgYSBjYWNoZS4gIFRoaXMgc2hvdWxkIGJlIG1vc3Qgbm90aWNlYWJsZSBpbiBnaXQtbG9nCisgICAgZmFtaWx5IG9mIGNvbW1hbmRzIHRoYXQgaW52b2x2ZSByZWFkaW5nIG1hbnkgdHJlZSBvYmplY3RzLgorICAgIEluIGFkZGl0aW9uLCB0cmF2ZXJzaW5nIHJldmlzaW9ucyB3aGlsZSBmaWx0ZXJpbmcgY2hhbmdlcworICAgIHdpdGggcGF0aHNwZWNzIGlzIG1hZGUgZmFzdGVyIGJ5IHRlcm1pbmF0aW5nIHRoZSBjb21wYXJpc29uCisgICAgYmV0d2VlbiB0aGUgdHJlZXMgYXMgZWFybHkgYXMgcG9zc2libGUuCisKKworKiBIb29rcworCisgIC0gVGhlIHBhcnQgdG8gc2VuZCBvdXQgbm90aWZpY2F0aW9uIGUtbWFpbHMgd2FzIHJlbW92ZWQgZnJvbQorICAgIHRoZSBzYW1wbGUgdXBkYXRlIGhvb2ssIGFzIGl0IHdhcyBub3QgYW4gYXBwcm9wcmlhdGUgcGxhY2UKKyAgICB0byBkbyBzby4gIFRoZSBwcm9wZXIgcGxhY2UgdG8gZG8gdGhpcyBpcyB0aGUgbmV3IHBvc3QtcmVjZWl2ZQorICAgIGhvb2suICBBbiBleGFtcGxlIGhvb2sgaGFzIGJlZW4gYWRkZWQgdG8gY29udHJpYi9ob29rcy8uCisKKworKiBPdGhlcnMKKworICAtIGdpdC1yZXZlcnQsIGdpdC1nYyBhbmQgZ2l0LWNoZXJyeS1waWNrIGFyZSBub3cgYnVpbHQtaW5zLgorCitGaXhlcyBzaW5jZSB2MS41LjAKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGVzZSBhcmUgYWxsIGluIHYxLjUuMC54IHNlcmllcy4KKworKiBEb2N1bWVudGF0aW9uIHVwZGF0ZXMKKworICAtIENsYXJpZmljYXRpb25zIGFuZCBjb3JyZWN0aW9ucyB0byAxLjUuMCByZWxlYXNlIG5vdGVzLgorCisgIC0gVGhlIG1haW4gZG9jdW1lbnRhdGlvbiBkaWQgbm90IGxpbmsgdG8gZ2l0LXJlbW90ZSBkb2N1bWVudGF0aW9uLgorCisgIC0gQ2xhcmlmaWVkIGludHJvZHVjdG9yeSB0ZXh0IG9mIGdpdC1yZWJhc2UgZG9jdW1lbnRhdGlvbi4KKworICAtIENvbnZlcnRlZCByZW1haW5pbmcgbWVudGlvbnMgb2YgdXBkYXRlLWluZGV4IG9uIFBvcmNlbGFpbgorICAgIGRvY3VtZW50cyB0byBnaXQtYWRkL2dpdC1ybS4KKworICAtIFNvbWUgaTE4bi4qIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIHdlcmUgaW5jb3JyZWN0bHkKKyAgICBkZXNjcmliZWQgYXMgY29yZS4qOyBmaXhlZC4KKworICAtIGFkZGVkIGFuZCBjbGFyaWZpZWQgY29yZS5iYXJlLCBjb3JlLmxlZ2FjeWhlYWRlcnMgY29uZmlndXJhdGlvbnMuCisKKyAgLSB1cGRhdGVkICJnaXQtY2xvbmUgLS1kZXB0aCIgZG9jdW1lbnRhdGlvbi4KKworICAtIHVzZXItbWFudWFsIHVwZGF0ZXMuCisKKyAgLSBPcHRpb25zIHRvICdnaXQgcmVtb3RlIGFkZCcgd2VyZSBkZXNjcmliZWQgaW5zdWZmaWNpZW50bHkuCisKKyAgLSBDb25maWd1cmF0aW9uIGZvcm1hdC5zdWZmaXggd2FzIG5vdCBkb2N1bWVudGVkLgorCisgIC0gT3RoZXIgZm9ybWF0dGluZyBhbmQgc3BlbGxpbmcgZml4ZXMuCisKKyAgLSB1c2VyLW1hbnVhbCBoYXMgYmV0dGVyIGNyb3NzIHJlZmVyZW5jZXMuCisKKyAgLSBnaXR3ZWIgaW5zdGFsbGF0aW9uL2RlcGxveW1lbnQgcHJvY2VkdXJlIGlzIG5vdyBkb2N1bWVudGVkLgorCisKKyogQnVnZml4ZXMKKworICAtIGdpdC11cGxvYWQtcGFjayBjbG9zZXMgdW51c2VkIHBpcGUgZW5kczsgZWFybGllciB0aGlzIGNhdXNlZAorICAgIG1hbnkgem9tYmllcyB0byBoYW5nIGFyb3VuZC4KKworICAtIGdpdC1yZXJlcmUgd2FzIHJlY29yZGluZyB0aGUgY29udGVudHMgb2YgZWFybGllciBodW5rcworICAgIGR1cGxpY2F0ZWQgaW4gbGF0ZXIgaHVua3MuICBUaGlzIHByZXZlbnRlZCByZXNvbHZpbmcgdGhlIHNhbWUKKyAgICBjb25mbGljdCB3aGVuIHBlcmZvcm1pbmcgdGhlIHNhbWUgbWVyZ2UgdGhlIG90aGVyIHdheSBhcm91bmQuCisKKyAgLSBnaXQtYWRkIGFuZCBnaXQtdXBkYXRlLWluZGV4IG9uIGEgZmlsZXN5c3RlbSBvbiB3aGljaAorICAgIGV4ZWN1dGFibGUgYml0cyBhcmUgdW5yZWxpYWJsZSBpbmNvcnJlY3RseSByZXVzZWQgc3RfbW9kZQorICAgIGJpdHMgZXZlbiB3aGVuIHRoZSBwYXRoIGNoYW5nZWQgYmV0d2VlbiBzeW1saW5rIGFuZCByZWd1bGFyCisgICAgZmlsZS4KKworICAtIGdpdC1kYWVtb24gbWFya3MgdGhlIGxpc3RlbmluZyBzb2NrZXRzIHdpdGggRkRfQ0xPRVhFQyBzbworICAgIHRoYXQgaXQgd29uJ3QgYmUgbGVha2VkIGludG8gdGhlIGNoaWxkcmVuLgorCisgIC0gc2VnZmF1bHQgZnJvbSBnaXQtYmxhbWUgd2hlbiB0aGUgbWFuZGF0b3J5IHBhdGhuYW1lCisgICAgcGFyYW1ldGVyIHdhcyBtaXNzaW5nIHdhcyBmaXhlZDsgdXNhZ2UoKSBtZXNzYWdlIGlzIGdpdmVuCisgICAgaW5zdGVhZC4KKworICAtIGdpdC1yZXYtbGlzdCBkaWQgbm90IHJlYWQgJEdJVF9ESVIvY29uZmlnIGZpbGUsIHdoaWNoIG1lYW5zCisgICAgdGhhdCBkaWQgbm90IGhvbm9yIGkxOG4ubG9nb3V0cHV0ZW5jb2RpbmcgY29ycmVjdGx5LgorCisgIC0gQXV0b21hdGVkIG1lcmdlIGNvbmZsaWN0IGhhbmRsaW5nIHdoZW4gY2hhbmdlcyB0byBzeW1ib2xpYworICAgIGxpbmtzIGNvbmZsaWN0ZWQgd2VyZSBjb21wbGV0ZWx5IGJyb2tlbi4gIFRoZSBtZXJnZS1yZXNvbHZlCisgICAgc3RyYXRlZ3kgY3JlYXRlZCBhIHJlZ3VsYXIgZmlsZSB3aXRoIGNvbmZsaWN0IG1hcmtlcnMgaW4gaXQKKyAgICBpbiBwbGFjZSBvZiB0aGUgc3ltYm9saWMgbGluay4gIFRoZSBkZWZhdWx0IHN0cmF0ZWd5LAorICAgIG1lcmdlLXJlY3Vyc2l2ZSB3YXMgZXZlbiBtb3JlIGJyb2tlbi4gIEl0IHJlbW92ZWQgdGhlIHBhdGgKKyAgICB0aGF0IHdhcyBwb2ludGVkIGF0IGJ5IHRoZSBzeW1ib2xpYyBsaW5rLiAgQm90aCBvZiB0aGVzZQorICAgIHByb2JsZW1zIGhhdmUgYmVlbiBmaXhlZC4KKworICAtICdnaXQgZGlmZiBtYWludCBtYXN0ZXIgbmV4dCcgZGlkIG5vdCBjb3JyZWN0bHkgZ2l2ZSBjb21iaW5lZAorICAgIGRpZmYgYWNyb3NzIHRocmVlIHRyZWVzLgorCisgIC0gJ2dpdCBmYXN0LWltcG9ydCcgcG9ydGFiaWxpdHkgZml4IGZvciBTb2xhcmlzLgorCisgIC0gJ2dpdCBzaG93LXJlZiAtLXZlcmlmeScgd2l0aG91dCBhcmd1bWVudHMgZGlkIG5vdCBlcnJvciBvdXQKKyAgICBidXQgc2VnZmF1bHRlZC4KKworICAtICdnaXQgZGlmZiA6dHJhY2tlZC1maWxlIGBwd2RgL2FuLXVudHJhY2tlZC1maWxlJyBnYXZlIGFuIGV4dHJhCisgICAgc2xhc2hlcyBhZnRlciBhLyBhbmQgYi8uCisKKyAgLSAnZ2l0IGZvcm1hdC1wYXRjaCcgcHJvZHVjZWQgdG9vIGxvbmcgZmlsZW5hbWVzIGlmIHRoZSBjb21taXQKKyAgICBtZXNzYWdlIGhhZCB0b28gbG9uZyBsaW5lIGF0IHRoZSBiZWdpbm5pbmcuCisKKyAgLSBSdW5uaW5nICdtYWtlIGFsbCcgYW5kIHRoZW4gd2l0aG91dCBjaGFuZ2luZyBhbnl0aGluZworICAgIHJ1bm5pbmcgJ21ha2UgaW5zdGFsbCcgc3RpbGwgcmVidWlsdCBzb21lIGZpbGVzLiAgVGhpcworICAgIHdhcyBpbmNvbnZlbmllbnQgd2hlbiBidWlsZGluZyBhcyB5b3Vyc2VsZiBhbmQgdGhlbgorICAgIGluc3RhbGxpbmcgYXMgcm9vdCAoZXNwZWNpYWxseSBwcm9ibGVtYXRpYyB3aGVuIHRoZSBzb3VyY2UKKyAgICBkaXJlY3RvcnkgaXMgb24gTkZTIGFuZCByb290IGlzIG1hcHBlZCB0byBub2JvZHkpLgorCisgIC0gJ2dpdC1yZXJlcmUnIGZhaWxlZCB0byBkZWFsIHdpdGggdHdvIHVuY29uZmxpY3RlZCBwYXRocyB0aGF0CisgICAgc29ydGVkIG5leHQgdG8gZWFjaCBvdGhlci4KKworICAtICdnaXQtcmVyZXJlJyBhdHRlbXB0ZWQgdG8gb3BlbigyKSBhIHN5bWxpbmsgYW5kIGZhaWxlZCBpZgorICAgIHRoZXJlIHdhcyBhIGNvbmZsaWN0LiAgU2luY2UgYSBjb25mbGljdGluZyBjaGFuZ2UgdG8gYQorICAgIHN5bWxpbmsgd291bGQgbm90IGJlbmVmaXQgZnJvbSByZXJlcmUgYW55d2F5LCB0aGUgY29tbWFuZAorICAgIG5vdyBpZ25vcmVzIGNvbmZsaWN0aW5nIGNoYW5nZXMgdG8gc3ltbGlua3MuCisKKyAgLSAnZ2l0LXJlcGFjaycgZGlkIG5vdCBsaWtlIHRvIHBhc3MgbW9yZSB0aGFuIDY0IGFyZ3VtZW50cworICAgIGludGVybmFsbHkgdG8gdW5kZXJseWluZyAncmV2LWxpc3QnIGxvZ2ljLCB3aGljaCBtYWRlIGl0CisgICAgaW1wb3NzaWJsZSB0byByZXBhY2sgYWZ0ZXIgYWNjdW11bGF0aW5nIG1hbnkgKHNtYWxsKSBwYWNrcworICAgIGluIHRoZSByZXBvc2l0b3J5LgorCisgIC0gJ2dpdC1kaWZmJyB0byByZXZpZXcgdGhlIGNvbWJpbmVkIGRpZmYgZHVyaW5nIGEgY29uZmxpY3RlZAorICAgIG1lcmdlIHdlcmUgbm90IHJlYWRpbmcgdGhlIHdvcmtpbmcgdHJlZSB2ZXJzaW9uIGNvcnJlY3RseQorICAgIHdoZW4gY2hhbmdlcyB0byBhIHN5bWJvbGljIGxpbmsgY29uZmxpY3RlZC4gIEl0IHNob3VsZCBoYXZlCisgICAgcmVhZCB0aGUgZGF0YSB1c2luZyByZWFkbGluaygyKSBidXQgcmVhZCBmcm9tIHRoZSByZWd1bGFyCisgICAgZmlsZSB0aGUgc3ltYm9saWMgbGluayBwb2ludGVkIGF0LgorCisgIC0gJ2dpdC1yZW1vdGUnIGRpZCBub3QgbGlrZSBwZXJpb2QgaW4gYSByZW1vdGUncyBuYW1lLgorCisgIC0gJ2dpdC5lbCcgaG9ub3JzIHRoZSBjb21taXQgY29kaW5nIHN5c3RlbSBmcm9tIHRoZSBjb25maWd1cmF0aW9uLgorCisgIC0gJ2JsYW1ldmlldycgaW4gY29udHJpYi8gY29ycmVjdGx5IGRpZ3MgZGVlcGVyIHdoZW4gYSBsaW5lIGlzCisgICAgY2xpY2tlZC4KKworICAtICdodHRwLXB1c2gnIGNvcnJlY3RseSBtYWtlcyBzdXJlIHRoZSByZW1vdGUgc2lkZSBoYXMgbGVhZGluZworICAgIHBhdGguICBFYXJsaWVyIGl0IHN0YXJ0ZWQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcGF0aCwgYW5kCisgICAgaW5jb3JyZWN0bHkuCisKKyAgLSAnZ2l0LW1lcmdlJyBkaWQgbm90IGV4aXQgd2l0aCBub24temVybyBzdGF0dXMgd2hlbiB0aGUKKyAgICB3b3JraW5nIHRyZWUgd2FzIGRpcnR5IGFuZCBjYW5ub3QgZmFzdCBmb3J3YXJkLiAgSXQgZG9lcworICAgIG5vdy4KKworICAtICdjdnNleHBvcnRjb21taXQnIGRvZXMgbm90IGxvc2UgeWV0LXRvLWJlLXVzZWQgbWVzc2FnZSBmaWxlLgorCisgIC0gaW50LXZzLXNpemVfdCB0eXBlZml4IHdoZW4gcnVubmluZyBjb21iaW5lZCBkaWZmIG9uIGZpbGVzCisgICAgb3ZlciAyR0IgbG9uZy4KKworICAtICdnaXQgYXBwbHkgLS13aGl0ZXNwYWNlPXN0cmlwJyBzaG91bGQgbm90IHRvdWNoIHVubW9kaWZpZWQKKyAgICBsaW5lcy4KKworICAtICdnaXQtbWFpbGluZm8nIGNob2tlIHdoZW4gYSBsb2dpY2FsIGhlYWRlciBsaW5lIHdhcyB0b28gbG9uZy4KKworICAtICdnaXQgc2hvdyBBLi5CJyBkaWQgbm90IGVycm9yIG91dC4gIE5lZ2F0aXZlIHJlZiAoIm5vdCBBIiBpbgorICAgIHRoaXMgZXhhbXBsZSkgZG9lcyBub3QgbWFrZSBzZW5zZSBmb3IgdGhlIHB1cnBvc2Ugb2YgdGhlCisgICAgY29tbWFuZCwgc28gbm93IGl0IGVycm9ycyBvdXQuCisKKyAgLSAnZ2l0IGZtdC1tZXJnZS1tc2cgLS1maWxlJyB3aXRob3V0IGZpbGUgcGFyYW1ldGVyIGRpZCBub3QKKyAgICBjb3JyZWN0bHkgZXJyb3Igb3V0LgorCisgIC0gJ2dpdCBhcmNoaW1wb3J0JyBiYXJmZWQgdXBvbiBlbmNvdW50ZXJpbmcgYSBjb21taXQgd2l0aG91dAorICAgIHN1bW1hcnkuCisKKyAgLSAnZ2l0IGluZGV4LXBhY2snIGRpZCBub3QgcHJvdGVjdCBpdHNlbGYgZnJvbSBnZXR0aW5nIGEgc2hvcnQKKyAgICByZWFkIG91dCBvZiBwcmVhZCgyKS4KKworICAtICdnaXQgaHR0cC1wdXNoJyBoYWQgYSBmZXcgYnVmZmVyIG92ZXJydW5zLgorCisgIC0gQnVpbGQgZGVwZW5kZW5jeSBmaXhlcyB0byByZWJ1aWxkIGZldGNoLm8gd2hlbiBvdGhlciBoZWFkZXJzCisgICAgY2hhbmdlLgorCisgIC0gZ2l0LmVsIGRvZXMgbm90IGFkZCBkdXBsaWNhdGUgc2lnbi1vZmYgbGluZXMuCisKKyAgLSBnaXQtY29tbWl0IHNob3dzIHRoZSBmdWxsIHN0YXQgb2YgdGhlIHJlc3VsdGluZyBjb21taXQsIG5vdAorICAgIGp1c3QgYWJvdXQgdGhlIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgd2hlbiBydW4gZnJvbQorICAgIGEgc3ViZGlyZWN0b3J5LgorCisgIC0gImdpdC1jaGVja291dCAtbSAnQHs4IGhvdXJzIGFnb30nIiBoYWQgYSBmdW5ueSBmYWlsdXJlIGZyb20KKyAgICBldmFsOyBmaXhlZC4KKworICAtIGdpdC1tZXJnZSAoaGVuY2UgZ2l0LXB1bGwpIGRpZCBub3QgcmVmdXNlIGZhc3QtZm9yd2FyZGluZworICAgIHdoZW4gdGhlIHdvcmtpbmcgdHJlZSBoYWQgbG9jYWwgY2hhbmdlcyB0aGF0IHdvdWxkIGhhdmUKKyAgICBjb25mbGljdGVkIHdpdGggaXQuCisKKyAgLSBhIGhhbmRmdWwgc21hbGwgZml4ZXMgdG8gZ2l0d2ViLgorCisgIC0gYnVpbGQgcHJvY2VkdXJlIGZvciB1c2VyLW1hbnVhbCBpcyBmaXhlZCBub3QgdG8gcmVxdWlyZSBsb2NhbGx5CisgICAgaW5zdGFsbGVkIHN0eWxlc2hlZXRzLgorCisgIC0gImdpdCBjb21taXQgJHBhdGhzIiBvbiBwYXRocyB3aG9zZSBlYXJsaWVyIGNvbnRlbnRzIHdlcmUKKyAgICBhbHJlYWR5IHVwZGF0ZWQgaW4gdGhlIGluZGV4IHdlcmUgZmFpbGluZyBvdXQuCisKKworKiBUd2Vha3MKKworICAtIHNsaWRpbmcgbW1hcCgpIGluZWZmaWNpZW50bHkgbW1hcGVkIHRoZSBzYW1lIHJlZ2lvbiBvZiBhCisgICAgcGFja2ZpbGUgd2l0aCBhbiBhY2Nlc3MgcGF0dGVybiB0aGF0IHVzZWQgb2JqZWN0cyBpbiB0aGUKKyAgICByZXZlcnNlIG9yZGVyLiAgVGhpcyBoYXMgYmVlbiBtYWRlIG1vcmUgZWZmaWNpZW50LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMi4xLnR4dCBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjIuMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJmMjBlMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjIuMS50eHQKQEAgLTAsMCArMSw1MyBAQAorR0lUIHYxLjUuMi4xIFJlbGVhc2UgTm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZpeGVzIHNpbmNlIHYxLjUuMgorLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogQnVnZml4ZXMKKworICAtIFRlbXBvcmFyeSBmaWxlcyB0aGF0IGFyZSB1c2VkIHdoZW4gaW52b2tpbmcgZXh0ZXJuYWwgZGlmZgorICAgIHByb2dyYW1zIGRpZCBub3QgdG9sZXJhdGUgYSBsb25nIFRNUERJUi4KKworICAtIGdpdC1kYWVtb24gZGlkIG5vdCBub3RpY2Ugd2hlbiBpdCBjb3VsZCBub3Qgd3JpdGUgaW50byBpdHMKKyAgICBwaWQgZmlsZS4KKworICAtIGdpdC1zdGF0dXMgZGlkIG5vdCBob25vciBjb3JlLmV4Y2x1ZGVzRmlsZSBjb25maWd1cmF0aW9uIGxpa2UKKyAgICBnaXQtYWRkIGRpZC4KKworICAtIGdpdC1hbm5vdGF0ZSBkaWQgbm90IHdvcmsgZnJvbSBhIHN1YmRpcmVjdG9yeSB3aGlsZQorICAgIGdpdC1ibGFtZSBkaWQuCisKKyAgLSBnaXQtY3Zzc2VydmVyIHNob3VsZCBoYXZlIGRpc2FibGVkIGFjY2VzcyB0byBhIHJlcG9zaXRvcnkKKyAgICB3aXRoICJnaXRjdnMucHNlcnZlci5lbmFibGVkID0gZmFsc2UiIHNldCBldmVuIHdoZW4KKyAgICAiZ2l0Y3ZzLmVuYWJsZWQgPSB0cnVlIiB3YXMgc2V0IGF0IHRoZSBzYW1lIHRpbWUuICBJdAorICAgIGRpZG4ndC4KKworICAtIGdpdC1jdnNpbXBvcnQgZGlkIG5vdCB3b3JrIGNvcnJlY3RseSBpbiBhIHJlcG9zaXRvcnkgd2l0aAorICAgIGl0cyBicmFuY2ggaGVhZHMgd2VyZSBwYWNrZWQgd2l0aCBwYWNrLXJlZnMuCisKKyAgLSBpZGVudCB1bmV4cGFuc2lvbiB0byBzcXVhc2ggIiRJZDogeHh4ICQiIHRoYXQgaXMgaW4gdGhlCisgICAgcmVwb3NpdG9yeSBjb3B5IHJlbW92ZWQgaW5jb3JyZWN0IG51bWJlciBvZiBieXRlcy4KKworICAtIGdpdC1zdm4gbWlzYmVoYXZlZCB3aGVuIHRoZSBzdWJ2ZXJzaW9uIHJlcG9zaXRvcnkgZGlkIG5vdAorICAgIHByb3ZpZGUgTUQ1IGNoZWNrc3VtcyBmb3IgZmlsZXMuCisKKyAgLSBnaXQgcmViYXNlIChhbmQgZ2l0IGFtKSBtaXNiZWhhdmVkIG9uIGNvbW1pdHMgdGhhdCBoYXZlICdcbicKKyAgICAobGl0ZXJhbGx5IGJhY2tzbGFzaCBhbmQgZW4sIG5vdCBhIGxpbmVmZWVkKSBpbiB0aGUgdGl0bGUuCisKKyAgLSBjb2RlIHRvIGRlY29kZSBiYXNlODUgdXNlZCBpbiBiaW5hcnkgcGF0Y2hlcyBoYWQgb25lIGVycm9yCisgICAgcmV0dXJuIGNvZGVwYXRoIHdyb25nLgorCisgIC0gUkZDMjA0NyBRIGVuY29kaW5nIG91dHB1dCBieSBnaXQtZm9ybWF0LXBhdGNoIHVzZWQgJ18nIGZvciBhCisgICAgc3BhY2UsIHdoaWNoIGlzIG5vdCB1bmRlcnN0b29kIGJ5IHNvbWUgcHJvZ3JhbXMuICBJdCB1c2VzID0yMAorICAgIHdoaWNoIGlzIHNhZmVyLgorCisgIC0gZ2l0LWZhc3RpbXBvcnQgLS1pbXBvcnQtbWFya3Mgd2FzIGJyb2tlbjsgZml4ZWQuCisKKyAgLSBBIGxvdCBvZiBkb2N1bWVudGF0aW9uIHVwZGF0ZXMsIGNsYXJpZmljYXRpb25zIGFuZCBmaXhlcy4KKworLS0KK2V4ZWMgPi92YXIvdG1wLzEKK089djEuNS4yLTY1LWc5OTZlMmQ2CitlY2hvIE89YGdpdCBkZXNjcmliZSByZWZzL2hlYWRzL21haW50YAorZ2l0IHNob3J0bG9nIC0tbm8tbWVyZ2VzICRPLi5yZWZzL2hlYWRzL21haW50CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4yLjIudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMi4yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjM5M2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMi4yLnR4dApAQCAtMCwwICsxLDYxIEBACitHSVQgdjEuNS4yLjIgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS4yLjEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogVXNhYmlsaXR5IGZpeAorCisgIC0gZ2l0LWd1aSBpcyBzaGlwcGVkIHdpdGggaXRzIHVwZGF0ZWQgYmxhbWUgaW50ZXJmYWNlLiAgSXQgaXMKKyAgICBydW1vcmVkIHRoYXQgdGhlIG9sZGVyIG9uZSB3YXMgbm90IGp1c3QgdW51c2FibGUgYnV0IHdhcworICAgIGFjdGl2ZSBoZWFsdGggaGF6YXJkLCBidXQgdGhpcyBvbmUgaXMgYWN0dWFsbHkgcHJldHR5LgorICAgIFBsZWFzZSBzZWUgZm9yIHlvdXJzZWxmLgorCisqIEJ1Z2ZpeGVzCisKKyAgLSAiZ2l0IGNoZWNrb3V0IGZ1YmFyIiB3YXMgdXR0ZXJseSBjb25mdXNlZCB3aGVuIHRoZXJlIGlzIGEKKyAgICBicmFuY2ggZnViYXIgYW5kIGEgdGFnIGZ1YmFyIGF0IHRoZSBzYW1lIHRpbWUuICBJdCBjb3JyZWN0bHkKKyAgICBjaGVja3Mgb3V0IHRoZSBicmFuY2ggZnViYXIgbm93LgorCisgIC0gImdpdCBjbG9uZSAvcGF0aC9mb28iIHRvIGNsb25lIGEgbG9jYWwgL3BhdGgvZm9vLmdpdAorICAgIHJlcG9zaXRvcnkgbGVmdCBhbiBpbmNvcnJlY3QgY29uZmlndXJhdGlvbi4KKworICAtICJnaXQgc2VuZC1lbWFpbCIgY29ycmVjdGx5IHVucXVvdGVzIFJGQyAyMDQ3IHF1b3RlZCBuYW1lcyBpbgorICAgIHRoZSBwYXRjaC1lbWFpbCBiZWZvcmUgdXNpbmcgdGhlaXIgdmFsdWVzLgorCisgIC0gV2UgZGlkIG5vdCBhY2NlcHQgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgZXBvY2ggb2xkZXIgdGhhbgorICAgIHllYXIgMjAwMCBhcyBhIHZhbGlkIHRpbWVzdGFtcC4gIFdlIG5vdyBpbnRlcnByZXQgcG9zaXRpdmUKKyAgICBpbnRlZ2VycyBtb3JlIHRoYW4gOCBkaWdpdHMgYXMgc3VjaCwgd2hpY2ggYWxsb3dzIHVzIHRvCisgICAgZXhwcmVzcyB0aW1lc3RhbXBzIG1vcmUgcmVjZW50IHRoYW4gTWFyY2ggMTk3My4KKworICAtIGdpdC1jdnNpbXBvcnQgZGlkIG5vdCB3b3JrIHdoZW4geW91IGhhdmUgR0lUX0RJUiB0byBwb2ludAorICAgIHlvdXIgcmVwb3NpdG9yeSBhdCBhIG5vbnN0YW5kYXJkIGxvY2F0aW9uLgorCisgIC0gU29tZSBzeXN0ZW1zIChub3RhYmx5LCBTb2xhcmlzKSBsYWNrIGhzdHJlcnJvcigpIHRvIG1ha2UKKyAgICBoX2Vycm5vIGh1bWFuIHJlYWRhYmxlOyBwcmVwYXJlIGEgcmVwbGFjZW1lbnQKKyAgICBpbXBsZW1lbnRhdGlvbi4KKworICAtIC5naXRpZ25vcmUgZmlsZSBsaXN0ZWQgZ2l0LWNvcmUuc3BlYyBidXQgd2hhdCB3ZSBnZW5lcmF0ZSBpcworICAgIGdpdC5zcGVjLCBhbmQgbm9ib2R5IG5vdGljZWQgZm9yIGEgbG9uZyB0aW1lLgorCisgIC0gImdpdC1tZXJnZS1yZWN1cnNpdmUiIGRvZXMgbm90IHRyeSB0byBydW4gZmlsZSBsZXZlbCBtZXJnZQorICAgIG9uIGJpbmFyeSBmaWxlcy4KKworICAtICJnaXQtYnJhbmNoIC0tdHJhY2siIGRpZCBub3QgY3JlYXRlIHRyYWNraW5nIGNvbmZpZ3VyYXRpb24KKyAgICBjb3JyZWN0bHkgd2hlbiB0aGUgYnJhbmNoIG5hbWUgaGFkIHNsYXNoIGluIGl0LgorCisgIC0gVGhlIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIHVzZXIgc3BlY2lmaWVkIHdpdGggdXNlci5lbWFpbAorICAgIGNvbmZpZ3VyYXRpb24gd2FzIG92ZXJyaWRlbiBieSBFTUFJTCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworICAtIFRoZSB0cmVlIHBhcnNlciBkaWQgbm90IHdhcm4gYWJvdXQgdHJlZSBlbnRyaWVzIHdpdGgKKyAgICBub25zZW5zZSBmaWxlIG1vZGVzLCBhbmQgYXNzdW1lZCB0aGV5IG11c3QgYmUgYmxvYnMuCisKKyAgLSAiZ2l0IGxvZyAteiIgd2l0aG91dCBhbnkgb3RoZXIgcmVxdWVzdCB0byBnZW5lcmF0ZSBkaWZmIHN0aWxsCisgICAgaW52b2tlZCB0aGUgZGlmZiBtYWNoaW5lcnksIHdhc3RpbmcgY3ljbGVzLgorCisqIERvY3VtZW50YXRpb24KKworICAtIE1hbnkgdXBkYXRlcyB0byBmaXggc3RhbGUgb3IgbWlzc2luZyBkb2N1bWVudGF0aW9uLgorCisgIC0gQWx0aG91Z2ggb3VyIGRvY3VtZW50YXRpb24gd2FzIHByaW1hcmlseSBtZWFudCB0byBiZSBmb3JtYXR0ZWQKKyAgICB3aXRoIEFzY2lpRG9jNywgZm9ybWF0dGluZyB3aXRoIEFzY2lpRG9jOCBpcyBzdXBwb3J0ZWQgYmV0dGVyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMi4zLnR4dCBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjIuMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRkYjIyOQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjIuMy50eHQKQEAgLTAsMCArMSwyNyBAQAorR0lUIHYxLjUuMi4zIFJlbGVhc2UgTm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZpeGVzIHNpbmNlIHYxLjUuMi4yCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiBCdWdmaXhlcworCisgICAtIFZlcnNpb24gMiBwYWNrIGluZGV4IGZvcm1hdCB3YXMgaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDEuNS4yCisgICAgIHRvIHN1cHBvcnQgcGFjayBmaWxlcyB0aGF0IGhhcyBvZmZzZXQgdGhhdCBjYW5ub3QgYmUKKyAgICAgcmVwcmVzZW50ZWQgaW4gMzItYml0LiAgVGhlIHJ1bnRpbWUgY29kZSB0byB2YWxpZGF0ZSBzdWNoCisgICAgIGFuIGluZGV4IG1pc2hhbmRsZWQgc3VjaCBhbiBpbmRleCBmb3IgYW4gZW1wdHkgcGFjay4KKworICAgLSBDb21taXQgd2Fsa2VycyAobW9zdCBub3RhYmx5LCBmZXRjaCBvdmVyIGh0dHAgcHJvdG9jb2wpCisgICAgIHRyaWVkIHRvIHRyYXZlcnNlIGNvbW1pdCBvYmplY3RzIGNvbnRhaW5lZCBpbiB0cmVlcyAoYWthCisgICAgIHN1YnByb2plY3QpOyB0aGV5IHNob3VsZG4ndC4KKworICAgLSBBIGJ1aWxkIG9wdGlvbiBOT19SX1RPX0dDQ19MSU5LRVIgd2FzIG5vdCBleHBsYWluZWQgaW4gTWFrZWZpbGUKKyAgICAgY29tbWVudCBjb3JyZWN0bHkuCisKKyAqIERvY3VtZW50YXRpb24gRml4ZXMgYW5kIFVwZGF0ZXMKKworICAgLSBnaXQtY29uZmlnIC0tcmVnZXhwIHdhcyBub3QgZG9jdW1lbnRlZCBwcm9wZXJseS4KKworICAgLSBnaXQtcmVwYWNrIC1hIHdhcyBub3QgZG9jdW1lbnRlZCBwcm9wZXJseS4KKworICAgLSBnaXQtcmVtb3RlIC1uIHdhcyBub3QgZG9jdW1lbnRlZCBwcm9wZXJseS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjIuNC50eHQgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4yLjQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1Y2ZmNDcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4yLjQudHh0CkBAIC0wLDAgKzEsMjggQEAKK0dJVCB2MS41LjIuNCBSZWxlYXNlIE5vdGVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitGaXhlcyBzaW5jZSB2MS41LjIuMworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICogQnVnZml4ZXMKKworICAgLSAiZ2l0LWd1aSIgYnVnZml4ZXMsIGluY2x1ZGluZyBhIGhhbmRmdWwgZml4ZXMgdG8gcnVuIGl0CisgICAgIGJldHRlciBvbiBDeWd3aW4vTVNZUy4KKworICAgLSAiZ2l0IGNoZWNrb3V0IiBmYWlsZWQgdG8gc3dpdGNoIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4KKyAgICAgYnJhbmNoZXMsIG9uZSBvZiB3aGljaCBoYXMgImZyb3R6IC0+IHh5enp5IiBzeW1saW5rIGFuZAorICAgICBmaWxlICJ4eXp6eS9maWxmcmUiLCB3aGlsZSB0aGUgb3RoZXIgb25lIGhhcyBhIGZpbGUKKyAgICAgImZyb3R6L2ZpbGZyZSIuCisKKyAgIC0gImdpdCBwcnVuZSIgdXNlZCB0byBzZWdmYXVsdCB1cG9uIHNlZWluZyBhIGNvbW1pdCB0aGF0IGlzCisgICAgIHJlZmVycmVkIHRvIGJ5IGEgdHJlZSBvYmplY3QgKGFrYSAic3VicHJvamVjdCIpLgorCisgICAtICJnaXQgZGlmZiAtLW5hbWUtc3RhdHVzIC0tbm8taW5kZXgiIG1pc2hhbmRsZWQgYW4gYWRkZWQgZmlsZS4KKworICAgLSAiZ2l0IGFwcGx5IC0tcmV2ZXJzZSAtLXdoaXRlc3BhY2U9d2FybiIgc3RpbGwgY29tcGxhaW5lZAorICAgICBhYm91dCB3aGl0ZXNwYWNlcyB0aGF0IGEgZm9yd2FyZCBhcHBsaWNhdGlvbiB3b3VsZCBoYXZlCisgICAgIGludHJvZHVjZWQuCisKKyAqIERvY3VtZW50YXRpb24gRml4ZXMgYW5kIFVwZGF0ZXMKKworICAgLSBBIGhhbmRmdWwgZG9jdW1lbnRhdGlvbiB1cGRhdGVzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMi41LnR4dCBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjIuNS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyODFjNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjIuNS50eHQKQEAgLTAsMCArMSwzMCBAQAorR0lUIHYxLjUuMi41IFJlbGVhc2UgTm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZpeGVzIHNpbmNlIHYxLjUuMi40CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiBCdWdmaXhlcworCisgICAtICJnaXQgYWRkIC11IiBoYWQgYSBzZXJpb3VzIGRhdGEgY29ycnVwdGlvbiBwcm9ibGVtIGluIG9uZQorICAgICBzcGVjaWFsIGNhc2UgKHdoZW4gdGhlIGNoYW5nZXMgdG8gYSBzdWJkaXJlY3RvcnkncyBmaWxlcworICAgICBjb25zaXN0IG9ubHkgZGVsZXRpb24gb2YgZmlsZXMpLgorCisgICAtICJnaXQgYWRkIC11IDxwYXRoPiIgZGlkIG5vdCB3b3JrIGZyb20gYSBzdWJkaXJlY3RvcnkuCisKKyAgIC0gImdpdCBhcHBseSIgbGVmdCBhbiBlbXB0eSBkaXJlY3RvcnkgYWZ0ZXIgYWxsIGl0cyBmaWxlcyBhcmUKKyAgICAgcmVuYW1lZCBhd2F5LgorCisgICAtICJnaXQgJGFueWNtZCBmb28vYmFyIiwgd2hlbiB0aGVyZSBpcyBhIGZpbGUgJ2ZvbycgaW4gdGhlCisgICAgIHdvcmtpbmcgdHJlZSwgY29tcGxhaW5lZCB0aGF0ICJnaXQgJGFueWNtZCBmb28vYmFyIC0tIiBmb3JtCisgICAgIHNob3VsZCBiZSB1c2VkIHRvIGRpc2FtYmlndWF0ZSBiZXR3ZWVuIHJldnMgYW5kIGZpbGVzLAorICAgICB3aGljaCB3YXMgY29tcGxldGVseSBib2d1cy4KKworICAgLSAiZ2l0IGNoZWNrb3V0LWluZGV4IiBhbmQgb3RoZXIgY29tbWFuZHMgdGhhdCBjaGVja3Mgb3V0CisgICAgIGZpbGVzIHRvIHRoZSB3b3JrIHRyZWUgdHJpZWQgdW5saW5rKDIpIG9uIGRpcmVjdG9yaWVzLAorICAgICB3aGljaCBpcyBhIHNhbmUgdGhpbmcgdG8gZG8gb24gc2FuZSBzeXN0ZW1zLCBidXQgbm90IG9uCisgICAgIFNvbGFyaXMgd2hlbiB5b3UgYXJlIHJvb3QuCisKKyAqIERvY3VtZW50YXRpb24gRml4ZXMgYW5kIFVwZGF0ZXMKKworICAgLSBBIGhhbmRmdWwgZG9jdW1lbnRhdGlvbiBmaXhlcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjIudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE5NTcxNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjIudHh0CkBAIC0wLDAgKzEsMTk3IEBACitHSVQgdjEuNS4yIFJlbGVhc2UgTm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PQorCitVcGRhdGVzIHNpbmNlIHYxLjUuMQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBQbHVtYmluZyBsZXZlbCBzdXBlcnByb2plY3Qgc3VwcG9ydC4KKworICBZb3UgY2FuIGluY2x1ZGUgYSBzdWJkaXJlY3RvcnkgdGhhdCBoYXMgYW4gaW5kZXBlbmRlbnQgZ2l0CisgIHJlcG9zaXRvcnkgaW4geW91ciBpbmRleCBhbmQgdHJlZSBvYmplY3RzIG9mIHlvdXIgcHJvamVjdAorICAoInN1cGVycHJvamVjdCIpLiAgVGhpcyBwbHVtYmluZyAoaS5lLiAiY29yZSIpIGxldmVsCisgIHN1cGVycHJvamVjdCBzdXBwb3J0IGV4cGxpY2l0bHkgZXhjbHVkZXMgcmVjdXJzaXZlIGJlaGF2aW91ci4KKworICBUaGUgInN1YnByb2plY3QiIGVudHJpZXMgaW4gdGhlIGluZGV4IGFuZCB0cmVlcyBvZiBhIHN1cGVycHJvamVjdAorICBhcmUgaW5jb21wYXRpYmxlIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgZ2l0LiAgRXhwZXJpbWVudGluZyB3aXRoCisgIHRoZSBwbHVtYmluZyBsZXZlbCBzdXBwb3J0IGlzIGVuY291cmFnZWQsIGJ1dCBiZSB3YXJuZWQgdGhhdAorICB1bmxlc3MgZXZlcnlib2R5IGluIHlvdXIgcHJvamVjdCB1cGRhdGVzIHRvIHRoaXMgcmVsZWFzZSBvcgorICBsYXRlciwgdXNpbmcgdGhpcyBmZWF0dXJlIHdvdWxkIG1ha2UgeW91ciBwcm9qZWN0CisgIGluYWNjZXNzaWJsZSBieSBwZW9wbGUgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBnaXQuCisKKyogUGx1bWJpbmcgbGV2ZWwgZ2l0YXR0cmlidXRlcyBzdXBwb3J0LgorCisgIFRoZSBnaXRhdHRyaWJ1dGVzIG1lY2hhbmlzbSBhbGxvd3MgeW91IHRvIGFkZCAnYXR0cmlidXRlcycgdG8KKyAgcGF0aHMgaW4geW91ciBwcm9qZWN0LCBhbmQgYWZmZWN0IHRoZSB3YXkgY2VydGFpbiBnaXQKKyAgb3BlcmF0aW9ucyB3b3JrLiAgQ3VycmVudGx5IHlvdSBjYW4gaW5mbHVlbmNlIGlmIGEgcGF0aCBpcworICBjb25zaWRlcmVkIGEgYmluYXJ5IG9yIHRleHQgKHRoZSBmb3JtZXIgd291bGQgYmUgdHJlYXRlZCBieQorICAnZ2l0IGRpZmYnIG5vdCB0byBwcm9kdWNlIHRleHR1YWwgb3V0cHV0OyB0aGUgbGF0dGVyIGNhbiBnbworICB0aHJvdWdoIHRoZSBsaW5lIGVuZGluZ3MgY29udmVyc2lvbiBwcm9jZXNzIGluIHJlcG9zaXRvcmllcworICB3aXRoIGNvcmUuYXV0b2NybGYgc2V0KSwgZXhwYW5kIGFuZCB1bmV4cGFuZCAnJElkJCcga2V5d29yZAorICB3aXRoIGJsb2Igb2JqZWN0IG5hbWUsIHNwZWNpZnkgYSBjdXN0b20gMy13YXkgbWVyZ2UgZHJpdmVyLAorICBhbmQgc3BlY2lmeSBhIGN1c3RvbSBkaWZmIGRyaXZlci4gIFlvdSBjYW4gYWxzbyBhcHBseQorICBhcmJpdHJhcnkgZmlsdGVyIHRvIGNvbnRlbnRzIG9uIGNoZWNrLWluL2NoZWNrLW91dCBjb2RlcGF0aAorICBidXQgdGhpcyBmZWF0dXJlIGlzIGFuIGV4dHJlbWVseSBzaGFycC1lZGdlZCByYXpvciBhbmQgbmVlZHMKKyAgdG8gYmUgaGFuZGxlZCB3aXRoIGNhdXRpb24gKGRvIG5vdCB1c2UgaXQgdW5sZXNzIHlvdQorICB1bmRlcnN0YW5kIHRoZSBlYXJsaWVyIG1haWxpbmcgbGlzdCBkaXNjdXNzaW9uIG9uIGtleXdvcmQKKyAgZXhwYW5zaW9uKS4gIFRoZXNlIGNvbnZlcnNpb25zIGFwcGx5IHdoZW4gY2hlY2tpbmcgZmlsZXMgaW4KKyAgb3Igb3V0LCBhbmQgZXhwb3J0aW5nIHZpYSBnaXQtYXJjaGl2ZS4KKworKiBUaGUgcGFja2ZpbGUgZm9ybWF0IG5vdyBvcHRpb25hbGx5IHN1cG9ydHMgNjQtYml0IGluZGV4LgorCisgIFRoaXMgcmVsZWFzZSBzdXBwb3J0cyB0aGUgInZlcnNpb24gMiIgZm9ybWF0IG9mIHRoZSAuaWR4CisgIGZpbGUuICBUaGlzIGlzIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCB3aGVuIGEgaHVnZSBwYWNrZmlsZQorICBuZWVkcyBtb3JlIHRoYW4gMzItYml0IHRvIGV4cHJlc3Mgb2Zmc2V0cyBvZiBvYmplY3RzIGluIHRoZQorICBwYWNrLgorCisqIENvbWVzIHdpdGggYW4gdXBkYXRlZCBnaXQtZ3VpIDAuNy4xCisKKyogVXBkYXRlZCBnaXR3ZWI6CisKKyAgLSBjYW4gc2hvdyBjb21iaW5lZCBkaWZmIGZvciBtZXJnZXM7CisgIC0gdXNlcyBmb250IHNpemUgb2YgdXNlcidzIHByZWZlcmVuY2UsIG5vdCBoYXJkY29kZWQgaW4gcGl4ZWxzOworICAtIGNhbiBub3cgJ2dyZXAnOworCisqIE5ldyBjb21tYW5kcyBhbmQgb3B0aW9ucy4KKworICAtICJnaXQgYmlzZWN0IHN0YXJ0IiBjYW4gb3B0aW9uYWxseSB0YWtlIGEgc2luZ2xlIGJhZCBjb21taXQgYW5kCisgICAgemVybyBvciBtb3JlIGdvb2QgY29tbWl0cyBvbiB0aGUgY29tbWFuZCBsaW5lLgorCisgIC0gImdpdCBzaG9ydGxvZyIgY2FuIG9wdGlvbmFsbHkgYmUgdG9sZCB0byB3cmFwIGl0cyBvdXRwdXQuCisKKyAgLSAic3VidHJlZSIgbWVyZ2Ugc3RyYXRlZ3kgYWxsb3dzIGFub3RoZXIgcHJvamVjdCB0byBiZSBtZXJnZWQgaW4gYXMKKyAgICB5b3VyIHN1YmRpcmVjdG9yeS4KKworICAtICJnaXQgZm9ybWF0LXBhdGNoIiBsZWFybmVkIGEgbmV3IC0tc3ViamVjdC1wcmVmaXg9PHN0cmluZz4KKyAgICBvcHRpb24sIHRvIG92ZXJyaWRlIHRoZSBidWlsdC1pbiAiW1BBVENIXSIuCisKKyAgLSAiZ2l0IGFkZCAtdSIgaXMgYSBxdWljayB3YXkgdG8gZG8gdGhlIGZpcnN0IHN0YWdlIG9mICJnaXQKKyAgICBjb21taXQgLWEiIChpLmUuIHVwZGF0ZSB0aGUgaW5kZXggdG8gbWF0Y2ggdGhlIHdvcmtpbmcKKyAgICB0cmVlKTsgaXQgb2J2aW91c2x5IGRvZXMgbm90IG1ha2UgYSBjb21taXQuCisKKyAgLSAiZ2l0IGNsZWFuIiBob25vcnMgYSBuZXcgY29uZmlndXJhdGlvbiwgImNsZWFuLnJlcXVpcmVmb3JjZSIuICBXaGVuCisgICAgc2V0IHRvIHRydWUsIHRoaXMgbWFrZXMgImdpdCBjbGVhbiIgYSBuby1vcCwgcHJldmVudGluZyB5b3UKKyAgICBmcm9tIGxvc2luZyBmaWxlcyBieSB0eXBpbmcgImdpdCBjbGVhbiIgd2hlbiB5b3UgbWVhbnQgdG8KKyAgICBzYXkgIm1ha2UgY2xlYW4iLiAgWW91IGNhbiBzdGlsbCBzYXkgImdpdCBjbGVhbiAtZiIgdG8KKyAgICBvdmVycmlkZSB0aGlzLgorCisgIC0gImdpdCBsb2ciIGZhbWlseSBvZiBjb21tYW5kcyBsZWFybmVkIC0tZGF0ZT17bG9jYWwscmVsYXRpdmUsZGVmYXVsdH0KKyAgICBvcHRpb24uICAtLWRhdGU9cmVsYXRpdmUgaXMgc3lub255bSB0byB0aGUgLS1yZWxhdGl2ZS1kYXRlLgorICAgIC0tZGF0ZT1sb2NhbCBnaXZlcyB0aGUgdGltZXN0YW1wIGluIGxvY2FsIHRpbWV6b25lLgorCisqIFVwZGF0ZWQgYmVoYXZpb3Igb2YgZXhpc3RpbmcgY29tbWFuZHMuCisKKyAgLSBXaGVuICRHSVRfQ09NTUlUVEVSX0VNQUlMIG9yICRHSVRfQVVUSE9SX0VNQUlMIGlzIG5vdCBzZXQKKyAgICBidXQgJEVNQUlMIGlzIHNldCwgdGhlIGxhdHRlciBpcyB1c2VkIGFzIGEgc3Vic3RpdHV0ZS4KKworICAtICJnaXQgZGlmZiAtLXN0YXQiIHNob3dzIHNpemUgb2YgcHJlaW1hZ2UgYW5kIHBvc3RpbWFnZSBibG9icworICAgIGZvciBiaW5hcnkgY29udGVudHMuICBFYXJsaWVyIGl0IG9ubHkgc2FpZCAiQmluIi4KKworICAtICJnaXQgbG9zdC1mb3VuZCIgc2hvd3Mgc3R1ZmYgdGhhdCBhcmUgdW5yZWFjaGFibGUgZXhjZXB0CisgICAgZnJvbSByZWZsb2dzLgorCisgIC0gImdpdCBjaGVja291dCBicmFuY2heMCIgbm93IGRldGFjaGVzIEhFQUQgYXQgdGhlIHRpcCBjb21taXQKKyAgICBvbiB0aGUgbmFtZWQgYnJhbmNoLCBpbnN0ZWFkIG9mIGp1c3Qgc3dpdGNoaW5nIHRvIHRoZQorICAgIGJyYW5jaCAodXNlICJnaXQgY2hlY2tvdXQgYnJhbmNoIiB0byBzd2l0Y2ggdG8gdGhlIGJyYW5jaCwKKyAgICBhcyBiZWZvcmUpLgorCisgIC0gImdpdCBiaXNlY3QgbmV4dCIgY2FuIGJlIHVzZWQgYWZ0ZXIgZ2l2aW5nIG9ubHkgYSBiYWQgY29tbWl0CisgICAgd2l0aG91dCBnaXZpbmcgYSBnb29kIG9uZSAodGhpcyBzdGFydHMgYmlzZWN0aW9uIGhhbGYtd2F5IHRvCisgICAgdGhlIHJvb3QgY29tbWl0KS4gIFdlIHVzZWQgdG8gcmVmdXNlIHRvIG9wZXJhdGUgd2l0aG91dCBhCisgICAgZ29vZCBhbmQgYSBiYWQgY29tbWl0LgorCisgIC0gImdpdCBwdXNoIiwgd2hlbiBwdXNoaW5nIGludG8gbW9yZSB0aGFuIG9uZSByZXBvc2l0b3J5LCBkb2VzCisgICAgbm90IHN0b3AgYXQgdGhlIGZpcnN0IGVycm9yLgorCisgIC0gImdpdCBhcmNoaXZlIiBkb2VzIG5vdCBpbnNpc3QgeW91IHRvIGdpdmUgLS1mb3JtYXQgcGFyYW1ldGVyCisgICAgYW55bW9yZTsgaXQgZGVmYXVsdHMgdG8gInRhciIuCisKKyAgLSAiZ2l0IGN2c3NlcnZlciIgY2FuIHVzZSBiYWNrZW5kcyBvdGhlciB0aGFuIHNxbGl0ZS4KKworICAtICJnaXR2aWV3IiAoaW4gY29udHJpYi8gc2VjdGlvbikgbGVhcm5lZCB0byBiZXR0ZXIgc3VwcG9ydAorICAgICJnaXQtYW5ub3RhdGUiLgorCisgIC0gImdpdCBkaWZmICRjb21taXQxOiRwYXRoMiAkY29tbWl0MjokcGF0aDIiIGNhbiBub3cgcmVwb3J0CisgICAgbW9kZSBjaGFuZ2VzIGJldHdlZW4gdGhlIHR3byBibG9icy4KKworICAtIExvY2FsICJnaXQgZmV0Y2giIGZyb20gYSByZXBvc2l0b3J5IHdob3NlIG9iamVjdCBzdG9yZSBpcworICAgIG9uZSBvZiB0aGUgYWx0ZXJuYXRlcyAoZS5nLiBmZXRjaGluZyBmcm9tIHRoZSBvcmlnaW4gaW4gYQorICAgIHJlcG9zaXRvcnkgY3JlYXRlZCB3aXRoICJnaXQgY2xvbmUgLWwgLXMiKSBhdm9pZHMKKyAgICBkb3dubG9hZGluZyBvYmplY3RzIHVubmVjZXNzYXJpbHkuCisKKyAgLSAiZ2l0IGJsYW1lIiB1c2VzIC5tYWlsbWFwIHRvIGNhbm9uaWNhbGl6ZSB0aGUgYXV0aG9yIG5hbWUKKyAgICBqdXN0IGxpa2UgImdpdCBzaG9ydGxvZyIgZG9lcy4KKworICAtICJnaXQgcGFjay1vYmplY3RzIiBwYXlzIGF0dGVudGlvbiB0byBwYWNrLmRlcHRoCisgICAgY29uZmlndXJhdGlvbiB2YXJpYWJsZS4KKworICAtICJnaXQgY2hlcnJ5LXBpY2siIGFuZCAiZ2l0IHJldmVydCIgZG9lcyBub3QgdXNlIC5tc2cgZmlsZSBpbgorICAgIHRoZSB3b3JraW5nIHRyZWUgdG8gcHJlcGFyZSBjb21taXQgbWVzc2FnZTsgaW5zdGVhZCBpdCB1c2VzCisgICAgJEdJVF9ESVIvTUVSR0VfTVNHIGFzIG90aGVyIGNvbW1hbmRzIGRvLgorCisqIEJ1aWxkcworCisgIC0gZ2l0LXA0aW1wb3J0IGhhcyBuZXZlciBiZWVuIGluc3RhbGxlZDsgbm93IHRoZXJlIGlzIGFuCisgICAgaW5zdGFsbGF0aW9uIG9wdGlvbiB0byBkbyBzby4KKworICAtIGdpdGsgYW5kIGdpdC1ndWkgY2FuIGJlIGNvbmZpZ3VyZWQgb3V0LgorCisgIC0gR2VuZXJhdGVkIGRvY3VtZW50YXRpb24gcGFnZXMgYXV0b21hdGljYWxseSBnZXQgdmVyc2lvbgorICAgIGluZm9ybWF0aW9uIGZyb20gR0lUX1ZFUlNJT04uCisKKyAgLSBQYXJhbGxlbCBidWlsZCB3aXRoICJtYWtlIC1qIiBkZXNjZW5kaW5nIGludG8gc3ViZGlyZWN0b3J5CisgICAgd2FzIGZpeGVkLgorCisqIFBlcmZvcm1hbmNlIFR3ZWFrcworCisgIC0gT3B0aW1pemVkICJnaXQtcmV2LWxpc3QgLS1iaXNlY3QiIChoZW5jZSAiZ2l0LWJpc2VjdCIpLgorCisgIC0gT3B0aW1pemVkICJnaXQtYWRkICRwYXRoIiBpbiBhIGxhcmdlIGRpcmVjdG9yeSwgbW9zdCBvZgorICAgIHdob3NlIGNvbnRlbnRzIGFyZSBpZ25vcmVkLgorCisgIC0gT3B0aW1pemVkICJnaXQtZGlmZi10cmVlIiBmb3IgcmVkdWNlZCBtZW1vcnkgZm9vdHByaW50LgorCisgIC0gVGhlIHJlY3Vyc2l2ZSBtZXJnZSBzdHJhdGVneSB1cGRhdGVkIGEgd29ya3RyZWUgZmlsZSB0aGF0CisgICAgd2FzIGNoYW5nZWQgaWRlbnRpY2FsbHkgaW4gdHdvIGJyYW5jaGVzLCB3aGVuIG9uZSBvZiB0aGVtCisgICAgcmVuYW1lZCBpdC4gIFdlIGRvIG5vdCBkbyB0aGF0IHdoZW4gdGhlcmUgaXMgbm8gcmVuYW1lLCBzbworICAgIG1hdGNoIHRoYXQgYmVoYXZpb3VyLiAgVGhpcyBhdm9pZHMgZXhjZXNzaXZlIHJlYnVpbGRzLgorCisgIC0gVGhlIGRlZmF1bHQgcGFjayBkZXB0aCBoYXMgYmVlbiBpbmNyZWFzZWQgdG8gNTAsIGFzIHRoZQorICAgIHJlY2VudCBhZGRpdGlvbiBvZiBkZWx0YV9iYXNlX2NhY2hlIG1ha2VzIGRlZXBlciBkZWx0YSBjaGFpbnMKKyAgICBtdWNoIGxlc3MgZXhwZW5zaXZlIHRvIGFjY2Vzcy4gIERlcGVuZGluZyBvbiB0aGUgcHJvamVjdCwgaXQgd2FzCisgICAgcmVwb3J0ZWQgdGhhdCB0aGlzIHJlZHVjZXMgdGhlIHJlc3VsdGluZyBwYWNrIGZpbGUgYnkgMTAlCisgICAgb3Igc28uCisKKworRml4ZXMgc2luY2UgdjEuNS4xCistLS0tLS0tLS0tLS0tLS0tLS0KKworQWxsIG9mIHRoZSBmaXhlcyBpbiB2MS41LjEgbWFpbnRlbmFuY2Ugc2VyaWVzIGFyZSBpbmNsdWRlZCBpbgordGhpcyByZWxlYXNlLCB1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkLgorCisqIEJ1Z2ZpeGVzCisKKyAgLSBTd2l0Y2hpbmcgYnJhbmNoZXMgd2l0aCAiZ2l0IGNoZWNrb3V0IiByZWZ1c2VkIHRvIHdvcmsgd2hlbgorICAgIGEgcGF0aCBjaGFuZ2VzIGZyb20gYSBmaWxlIHRvIGEgZGlyZWN0b3J5IGJldHdlZW4gdGhlCisgICAgY3VycmVudCBicmFuY2ggYW5kIHRoZSBuZXcgYnJhbmNoLCBpbiBvcmRlciBub3QgdG8gbG9zZQorICAgIHBvc3NpYmxlIGxvY2FsIGNoYW5nZXMgaW4gdGhlIGRpcmVjdG9yeSB0aGF0IGlzIGJlaW5nIHR1cm5lZAorICAgIGludG8gYSBmaWxlIHdpdGggdGhlIHN3aXRjaC4gIFdlIG5vdyBhbGxvdyBzdWNoIGEgYnJhbmNoCisgICAgc3dpdGNoIGFmdGVyIG1ha2luZyBzdXJlIHRoYXQgdGhlcmUgaXMgbm8gbG9jYWxseSBtb2RpZmllZAorICAgIGZpbGUgbm9yIHVuLWlnbm9yZWQgZmlsZSBpbiB0aGUgZGlyZWN0b3J5LiAgVGhpcyBoYXMgbm90CisgICAgYmVlbiBiYWNrcG9ydGVkIHRvIDEuNS4xLnggc2VyaWVzLCBhcyBpdCBpcyByYXRoZXIgYW4KKyAgICBpbnRydXNpdmUgY2hhbmdlLgorCisgIC0gTWVyZ2luZyBicmFuY2hlcyB0aGF0IGhhdmUgYSBmaWxlIGluIG9uZSBhbmQgYSBkaXJlY3RvcnkgaW4KKyAgICBhbm90aGVyIGF0IHRoZSBzYW1lIHBhdGggdXNlZCB0byBnZXQgcXVpdGUgY29uZnVzZWQuICBXZQorICAgIGhhbmRsZSBzdWNoIGEgY2FzZSBhIGJpdCBtb3JlIGNhcmVmdWxseSwgZXZlbiB0aG91Z2ggdGhhdCBpcworICAgIHN0aWxsIGxlZnQgYXMgYSBjb25mbGljdCBmb3IgdGhlIHVzZXIgdG8gc29ydCBvdXQuICBUaGlzCisgICAgd2lsbCBub3QgYmUgYmFja3BvcnRlZCB0byAxLjUuMS54IHNlcmllcywgYXMgaXQgaXMgcmF0aGVyIGFuCisgICAgaW50cnVzaXZlIGNoYW5nZS4KKworICAtIGdpdC1mZXRjaCBoYWQgdHJvdWJsZSB3aXRoIGEgcmVtb3RlIHdpdGggaW5zYW5lbHkgbGFyZ2UgbnVtYmVyCisgICAgb2YgcmVmcy4KKworICAtICJnaXQgY2xlYW4gLWQgLVgiIG5vdyBkb2VzIG5vdCByZW1vdmUgbm9uLWV4Y2x1ZGVkIGRpcmVjdG9yaWVzLgorCisgIC0gcmViYXNpbmcgKHdpdGhvdXQgLW0pIGEgc2VyaWVzIHRoYXQgY2hhbmdlcyBhIHN5bWxpbmsgdG8gYSBkaXJlY3RvcnkKKyAgICBpbiB0aGUgbWlkZGxlIG9mIGEgcGF0aCBjb25mdXNlZCBnaXQtYXBwbHkgZ3JlYXRseSBhbmQgcmVmdXNlZCB0bworICAgIG9wZXJhdGUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4zLjEudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMy4xLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmY1NDZjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMy4xLnR4dApAQCAtMCwwICsxLDEwIEBACitHSVQgdjEuNS4zLjEgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS4zCistLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBpcyBzb2xlbHkgdG8gZml4IHRoZSBnZW5lcmF0ZWQgUlBNJ3MgZGVwZW5kZW5jaWVzLiAgV2UgdXNlZAordG8gaGF2ZSBnaXQtcDQgcGFja2FnZSBidXQgd2UgZG8gbm90IGFueW1vcmUuICBBcyBzdWdnZXN0ZWQgb24KK3RoZSBtYWlsaW5nIGxpc3QsIHRoaXMgcmVsZWFzZSBtYWtlcyBnaXQtY29yZSAiT2Jzb2xldGUiIGdpdC1wNCwKK3NvIHRoYXQgeXVtIHVwZGF0ZSB3b3VsZCBub3QgY29tcGxhaW4uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4zLjIudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMy4yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmJkZTNjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMy4yLnR4dApAQCAtMCwwICsxLDU4IEBACitHSVQgdjEuNS4zLjIgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS4zLjEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqIGdpdC1wdXNoIHNlbnQgdGhpbiBwYWNrcyBieSBkZWZhdWx0LCB3aGljaCB3YXMgbm90IGdvb2QgZm9yCisgICB0aGUgcHVibGljIGRpc3RyaWJ1dGlvbiBzZXJ2ZXIgKG5vIHBvaW50IGluIHNhdmluZyB0cmFuc2ZlcgorICAgd2hpbGUgcHVzaGluZzsgbm8gcG9pbnQgaW4gbWFraW5nIHRoZSByZXN1bHRpbmcgcGFjayBsZXNzCisgICBvcHRpbXVtKS4KKworICogZ2l0LXN2biBzb21ldGltZXMgdGVybWluYXRlZCB3aXRoICJNYWxmb3JtZWQgbmV0d29yayBkYXRhIiB3aGVuCisgICB0YWxraW5nIG92ZXIgc3ZuOi8vIHByb3RvY29sLgorCisgKiBnaXQtc2VuZC1lbWFpbCByZS1pc3N1ZWQgdGhlIHNhbWUgbWVzc2FnZS1pZCBhYm91dCAxMCUgb2YgdGhlCisgICB0aW1lIGlmIHlvdSBmaXJlZCBvZmYgMzAgbWVzc2FnZXMgd2l0aGluIGEgc2luZ2xlIHNlY29uZC4KKworICogZ2l0LXN0YXNoIHdhcyBub3QgdGVybWluYXRpbmcgdGhlIGxvZyBtZXNzYWdlIG9mIGNvbW1pdHMgaXQKKyAgIGludGVybmFsbHkgY3JlYXRlcyB3aXRoIExGLgorCisgKiBnaXQtYXBwbHkgZmFpbGVkIHRvIGNoZWNrIHRoZSBzaXplIG9mIHRoZSBwYXRjaCBodW5rIHdoZW4gaXRzCisgICBiZWdpbm5pbmcgcGFydCBtYXRjaGVkIHRoZSByZW1haW5kZXIgb2YgdGhlIHByZWltYWdlIGV4YWN0bHksCisgICBldmVuIHRob3VnaCB0aGUgcHJlaW1hZ2UgcmVjb3JkZWQgaW4gdGhlIGh1bmsgd2FzIG11Y2ggbGFyZ2VyCisgICAodGhlcmVmb3JlIHRoZSBwYXRjaCBzaG91bGQgbm90IGhhdmUgYXBwbGllZCksIGxlYWRpbmcgdG8gYQorICAgc2VnZmF1bHQuCisKKyAqICJnaXQgcm0gZm9vICYmIGdpdCBjb21taXQgZm9vIiBjb21wbGFpbmVkIHRoYXQgJ2ZvbycgbmVlZHMgdG8KKyAgIGJlIGFkZGVkIGZpcnN0LCBpbnN0ZWFkIG9mIGNvbW1pdHRpbmcgdGhlIHJlbW92YWwsIHdoaWNoIHdhcyBhCisgICBub25zZW5zZS4KKworICogZ2l0IGdyZXAgLWMgc2FpZCAiL2Rldi9udWxsOiAwIi4KKworICogZ2l0LWFkZCAtdSBmYWlsZWQgdG8gcmVjb2duaXplIGEgYmxvYiB3aG9zZSB0eXBlIGNoYW5nZWQKKyAgIGJldHdlZW4gdGhlIGluZGV4IGFuZCB0aGUgd29yayB0cmVlLgorCisgKiBUaGUgbGltaXQgdG8gcmVuYW1lIGRldGVjdGlvbiBoYXMgYmVlbiB0aWdodGVuZWQgYSBsb3QgdG8KKyAgIHJlZHVjZSBwZXJmb3JtYW5jZSBwcm9ibGVtcyB3aXRoIGEgaHVnZSBjaGFuZ2UuCisKKyAqIGN2c2ltcG9ydCBhbmQgc3ZuaW1wb3J0IGJhcmZlZCB3aGVuIHRoZSBpbnB1dCB0cmllZCB0byBtb3ZlCisgICBhIHRhZy4KKworICogImdpdCBhcHBseSAtcE4iIGRpZCBub3QgY2hvcCB0aGUgcmlnaHQgbnVtYmVyIG9mIGRpcmVjdG9yaWVzLgorCisgKiAiZ2l0IHN2bmltcG9ydCIgZGlkIG5vdCBsaWtlIFNWTiB0YWdzIHdpdGggZnVubnkgY2hhcmFjdGVycyBpbiB0aGVtLgorCisgKiBnaXQtZ3VpIDAuOC4zLCB3aXRoIGFzc29ydGVkIGZpeGVzLCBpbmNsdWRpbmc6CisKKyAgIC0gZm9udC1jaG9vc2VyIG9uIFgxMSB3YXMgdW51c2FibGUgd2l0aCBsYXJnZSBudW1iZXIgb2YgZm9udHM7CisgICAtIGEgZGlmZiB0aGF0IGNvbnRhaW5lZCBhIGRlbGV0ZWQgc3ltbGluayBtYWRlIGl0IGJhcmY7CisgICAtIGFuIHVudHJhY2tlZCBzeW1ib2xpYyBsaW5rIHRvIGEgZGlyZWN0b3J5IG1hZGUgaXQgZmFydDsKKyAgIC0gYSBmaWxlIHdpdGggJSBpbiBpdHMgbmFtZSBtYWRlIGl0IHZvbWl0OworCisKK0RvY3VtZW50YXRpb24gdXBkYXRlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1VzZXIgbWFudWFsIGhhcyBiZWVuIHNvbWV3aGF0IHJlc3RydWN0dXJlZC4gIEkgdGhpbmsgdGhlIG5ldworb3JnYW5pemF0aW9uIGlzIG11Y2ggZWFzaWVyIHRvIHJlYWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4zLjMudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMy4zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjEzODQ2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMy4zLnR4dApAQCAtMCwwICsxLDMxIEBACitHSVQgdjEuNS4zLjMgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS4zLjIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqIGdpdC1xdWlsdGltcG9ydCBkaWQgbm90IGxpa2UgaXQgd2hlbiBhIHBhdGNoIGRlc2NyaWJlZCBpbiB0aGUKKyAgIHNlcmllcyBmaWxlIGRvZXMgbm90IGV4aXN0LgorCisgKiBwNCBpbXBvcnRlciBtaXNzZWQgZXhlY3V0YWJsZSBiaXQgaW4gc29tZSBjYXNlcy4KKworICogVGhlIGRlZmF1bHQgc2hlbGwgb24gc29tZSBGcmVlQlNEIGRpZCBub3QgZXhlY3V0ZSB0aGUKKyAgIGFyZ3VtZW50IHBhcnNpbmcgY29kZSBjb3JyZWN0bHkgYW5kIG1hZGUgZ2l0IHVudXNhYmxlLgorCisgKiBnaXQtc3ZuIGluY29ycmVjdGx5IHNwYXduZWQgcGFnZXIgZXZlbiB3aGVuIHRoZSB1c2VyCisgICBleHBsaWNpdGx5IGFza2VkIG5vdCB0by4KKworICogc2FtcGxlIHBvc3QtcmVjZWl2ZSBob29rIG92ZXJxdW90ZWQgdGhlIGVudmVsb3BlIHNlbmRlcgorICAgdmFsdWUuCisKKyAqIGdpdC1hbSBnb3QgY29uZnVzZWQgd2hlbiB0aGUgcGF0Y2ggY29udGFpbmVkIGEgY2hhbmdlIHRoYXQgaXMKKyAgIG9ubHkgYWJvdXQgdHlwZSBhbmQgbm90IGNvbnRlbnRzLgorCisgKiBnaXQtbWVyZ2V0b29sIGRpZCBub3Qgc2hvdyBvdXIgYW5kIHRoZWlyIHZlcnNpb24gb2YgdGhlCisgICBjb25mbGljdGVkIGZpbGUgd2hlbiBzdGFydGVkIGZyb20gYSBzdWJkaXJlY3Rvcnkgb2YgdGhlCisgICBwcm9qZWN0LgorCisgKiBnaXQtbWVyZ2V0b29sIGRpZCBub3QgcGFzcyBjb3JyZWN0IG9wdGlvbnMgd2hlbiBpbnZva2luZyBkaWZmMy4KKworICogZ2l0LWxvZyBzb21ldGltZXMgaW52b2tlZCB1bmRlcmx5aW5nICJkaWZmIiBtYWNoaW5lcnkKKyAgIHVubmVjZXNzYXJpbHkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4zLjQudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMy40LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDRiM2E0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMy40LnR4dApAQCAtMCwwICsxLDM1IEBACitHSVQgdjEuNS4zLjQgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS4zLjMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqIENoYW5nZSB0byAiZ2l0LWxzLWZpbGVzIiBpbiB2MS41LjMuMyB0aGF0IHdhcyBpbnRyb2R1Y2VkIHRvIHN1cHBvcnQKKyAgIHBhcnRpYWwgY29tbWl0IG9mIHJlbW92YWwgYmV0dGVyIGhhZCBhIHNlZ2ZhdWx0aW5nIGJ1Zywgd2hpY2ggd2FzCisgICBkaWFnbm9zZWQgYW5kIGZpeGVkIGJ5IEtlaXRoIGFuZCBDYXJsLgorCisgKiBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgZm9yIHJlbmFtZSBkZXRlY3Rpb24gaGFzIGJlZW4gYmFja3BvcnRlZAorICAgZnJvbSB0aGUgJ21hc3RlcicgYnJhbmNoLgorCisgKiAiZ2l0LWZvci1lYWNoLXJlZiAtLWZvcm1hdD0nJShudW1wYXJlbnQpJyIgd2FzIG5vdCB3b3JraW5nCisgICBjb3JyZWN0bHkgYXQgYWxsLCBhbmQgLS1mb3JtYXQ9JyUocGFyZW50KScgd2FzIG5vdCB3b3JraW5nIGZvcgorICAgbWVyZ2UgY29tbWl0cy4KKworICogU2FtcGxlICJwb3N0LXJlY2VpdmUtaG9vayIgaW5jb3JyZWN0bHkgc2VudCBvdXQgcHVzaAorICAgbm90aWZpY2F0aW9uIGUtbWFpbHMgbWFya2VkIGFzICJGcm9tOiAiIHRoZSBjb21taXR0ZXIgb2YgdGhlCisgICBjb21taXQgdGhhdCBoYXBwZW5lZCB0byBiZSBhdCB0aGUgdGlwIG9mIHRoZSBicmFuY2ggdGhhdCB3YXMKKyAgIHB1c2hlZCwgbm90IGZyb20gdGhlIHBlcnNvbiB3aG8gcHVzaGVkLgorCisgKiAiZ2l0LXJlbW90ZSIgZGlkIG5vdCBleGl0IG5vbi16ZXJvIHN0YXR1cyB1cG9uIGVycm9yLgorCisgKiAiZ2l0LWFkZCAtaSIgZGlkIG5vdCByZXNwb25kIHZlcnkgd2VsbCB0byBFT0YgZnJvbSB0dHkgbm9yCisgICBib2d1cyBpbnB1dC4KKworICogImdpdC1yZWJhc2UgLWkiIHNxdWFzaCBzdWJjb21tYW5kIGluY29ycmVjdGx5IG1hZGUgdGhlCisgICBhdXRob3Igb2YgbGF0ZXIgY29tbWl0IHRoZSBhdXRob3Igb2YgcmVzdWx0aW5nIGNvbW1pdCwKKyAgIGluc3RlYWQgb2YgdGFraW5nIGZyb20gdGhlIGZpcnN0IG9uZSBpbiB0aGUgc3F1YXNoZWQgc2VyaWVzLgorCisgKiAiZ2l0LXN0YXNoIGFwcGx5IC0taW5kZXgiIHdhcyBub3QgZG9jdW1lbnRlZC4KKworICogYXV0b2NvbmZpZ3VyYXRpb24gbGVhcm5lZCB0aGF0ICJhciIgY29tbWFuZCBpcyBmb3VuZCBhcyAiZ2FzIiBvbgorICAgc29tZSBzeXN0ZW1zLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMy41LnR4dCBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjMuNS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmMWQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjMuNS50eHQKQEAgLTAsMCArMSw5NCBAQAorR0lUIHYxLjUuMy41IFJlbGVhc2UgTm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZpeGVzIHNpbmNlIHYxLjUuMy40CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiBDb21lcyB3aXRoIGdpdC1ndWkgMC44LjQuCisKKyAqICJnaXQtY29uZmlnIiBzaWxlbnRseSBpZ25vcmVkIG9wdGlvbnMgYWZ0ZXIgLS1saXN0OyBub3cgaXQgd2lsbAorICAgZXJyb3Igb3V0IHdpdGggYSB1c2FnZSBtZXNzYWdlLgorCisgKiAiZ2l0LWNvbmZpZyAtLWZpbGUiIGZhaWxlZCBpZiB0aGUgYXJndW1lbnQgdXNlZCBhIHJlbGF0aXZlIHBhdGgKKyAgIGFzIGl0IGNoYW5nZWQgZGlyZWN0b3JpZXMgYmVmb3JlIG9wZW5pbmcgdGhlIGZpbGUuCisKKyAqICJnaXQtY29uZmlnIC0tZmlsZSIgbm93IGRpc3BsYXlzIGEgcHJvcGVyIGVycm9yIG1lc3NhZ2UgaWYgaXQKKyAgIGNhbm5vdCByZWFkIHRoZSBmaWxlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorCisgKiAiZ2l0LWNvbmZpZyIsICJnaXQtZGlmZiIsICJnaXQtYXBwbHkiIGZhaWxlZCBpZiBydW4gZnJvbSBhCisgICBzdWJkaXJlY3Rvcnkgd2l0aCByZWxhdGl2ZSBHSVRfRElSIGFuZCBHSVRfV09SS19UUkVFIHNldC4KKworICogImdpdC1ibGFtZSIgY3Jhc2hlZCBpZiBydW4gZHVyaW5nIGEgbWVyZ2UgY29uZmxpY3QuCisKKyAqICJnaXQtYWRkIC1pIiBkaWQgbm90IGhhbmRsZSBzaW5nbGUgbGluZSBodW5rcyBjb3JyZWN0bHkuCisKKyAqICJnaXQtcmViYXNlIC1pIiBhbmQgImdpdC1zdGFzaCBhcHBseSIgZmFpbGVkIGlmIGV4dGVybmFsIGRpZmYKKyAgIGRyaXZlcnMgd2VyZSB1c2VkIGZvciBvbmUgb3IgbW9yZSBmaWxlcyBpbiBhIGNvbW1pdC4gIFRoZXkgbm93CisgICBhdm9pZCBjYWxsaW5nIHRoZSBleHRlcm5hbCBkaWZmIGRyaXZlcnMuCisKKyAqICJnaXQtbG9nIC0tZm9sbG93IiBkaWQgbm90IHdvcmsgdW5sZXNzIGRpZmYgZ2VuZXJhdGlvbiAoZS5nLiAtcCkKKyAgIHdhcyBhbHNvIHJlcXVlc3RlZC4KKworICogImdpdC1sb2cgLS1mb2xsb3cgLUIiIGRpZCBub3Qgd29yayBhdCBhbGwuICBGaXhlZC4KKworICogImdpdC1sb2cgLU0gLUIiIGRpZCBub3QgY29ycmVjdGx5IGhhbmRsZSBjYXNlcyBvZiB2ZXJ5IGxhcmdlIGZpbGVzCisgICBiZWluZyByZW5hbWVkIGFuZCByZXBsYWNlZCBieSB2ZXJ5IHNtYWxsIGZpbGVzIGluIHRoZSBzYW1lIGNvbW1pdC4KKworICogImdpdC1sb2ciIHByaW50ZWQgZXh0cmEgbmV3bGluZXMgYmV0d2VlbiBjb21taXRzIHdoZW4gYSBkaWZmCisgICB3YXMgZ2VuZXJhdGVkIGludGVybmFsbHkgKGUuZy4gLVMgb3IgLS1mb2xsb3cpIGJ1dCBub3QgZGlzcGxheWVkLgorCisgKiAiZ2l0LXB1c2giIGVycm9yIG1lc3NhZ2UgaXMgbW9yZSBoZWxwZnVsIHdoZW4gcHVzaGluZyB0byBhCisgICByZXBvc2l0b3J5IHdpdGggbm8gbWF0Y2hpbmcgcmVmcyBhbmQgbm9uZSBzcGVjaWZpZWQuCisKKyAqICJnaXQtcHVzaCIgbm93IHJlc3BlY3RzICsgKGZvcmNlIHB1c2gpIG9uIHdpbGRjYXJkIHJlZnNwZWNzLAorICAgbWF0Y2hpbmcgdGhlIGJlaGF2aW9yIG9mIGdpdC1mZXRjaC4KKworICogImdpdC1maWx0ZXItYnJhbmNoIiBub3cgdXBkYXRlcyB0aGUgd29ya2luZyBkaXJlY3Rvcnkgd2hlbiBpdAorICAgaGFzIGZpbmlzaGVkIGZpbHRlcmluZyB0aGUgY3VycmVudCBicmFuY2guCisKKyAqICJnaXQtaW5zdGF3ZWIiIG5vIGxvbmdlciBmYWlscyBvbiBNYWMgT1MgWC4KKworICogImdpdC1jdnNleHBvcnRjb21taXQiIGRpZG4ndCBhbHdheXMgY3JlYXRlIG5ldyBwYXJlbnQgZGlyZWN0b3JpZXMKKyAgIGJlZm9yZSB0cnlpbmcgdG8gY3JlYXRlIG5ldyBjaGlsZCBkaXJlY3Rvcmllcy4gIEZpeGVkLgorCisgKiAiZ2l0LWZldGNoIiBwcmludGVkIGEgc2NhcnkgKGJ1dCBib2d1cykgZXJyb3IgbWVzc2FnZSB3aGlsZQorICAgZmV0Y2hpbmcgYSB0YWcgdGhhdCBwb2ludGVkIHRvIGEgdHJlZSBvciBibG9iLiAgVGhlIGVycm9yIGRpZAorICAgbm90IGltcGFjdCBjb3JyZWN0bmVzcywgb25seSB1c2VyIHBlcmNlcHRpb24uICBUaGUgYm9ndXMgZXJyb3IKKyAgIGlzIG5vIGxvbmdlciBwcmludGVkLgorCisgKiAiZ2l0LWxzLWZpbGVzIC0taWdub3JlZCIgZGlkIG5vdCBwcm9wZXJseSBkZXNjZW5kIGludG8gbm9uLWlnbm9yZWQKKyAgIGRpcmVjdG9yaWVzIHRoYXQgdGhlbXNlbHZlcyBjb250YWluZWQgaWdub3JlZCBmaWxlcyBpZiBkX3R5cGUKKyAgIHdhcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBmaWxlc3lzdGVtLiAgVGhpcyBidWcgaW1wYWN0ZWQgc3lzdGVtcworICAgc3VjaCBhcyBBRlMuICBGaXhlZC4KKworICogR2l0IHNlZ2ZhdWx0ZWQgd2hlbiByZWFkaW5nIGFuIGludmFsaWQgLmdpdGF0dHJpYnV0ZXMgZmlsZS4gIEZpeGVkLgorCisgKiBwb3N0LXJlY2VpdmUtZW1haWwgZXhhbXBsZSBob29rIHdhcyBmaXhlZCBmb3Igbm9uLWZhc3QtZm9yd2FyZAorICAgdXBkYXRlcy4KKworICogRG9jdW1lbnRhdGlvbiB1cGRhdGVzIGZvciBzdXBwb3J0ZWQgKGJ1dCBwcmV2aW91c2x5IHVuZG9jdW1lbnRlZCkKKyAgIG9wdGlvbnMgb2YgImdpdC1hcmNoaXZlIiBhbmQgImdpdC1yZWZsb2ciLgorCisgKiAibWFrZSBjbGVhbiIgbm8gbG9uZ2VyIGRlbGV0ZXMgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdGhhdCBzaGlwcworICAgd2l0aCB0aGUgZ2l0IHRhcmJhbGwsIG1ha2luZyBtdWx0aXBsZSBhcmNoaXRlY3R1cmUgYnVpbGRzIGVhc2llci4KKworICogImdpdC1yZW1vdGUgc2hvdyBvcmlnaW4iIHNwZXdlZCBhIHdhcm5pbmcgbWVzc2FnZSBmcm9tIFBlcmwKKyAgIHdoZW4gbm8gcmVtb3RlIGlzIGRlZmluZWQgZm9yIHRoZSBjdXJyZW50IGJyYW5jaCB2aWEKKyAgIGJyYW5jaC48bmFtZT4ucmVtb3RlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuCisKKyAqIEJ1aWxkaW5nIHdpdGggTk9fUEVSTF9NQUtFTUFLRVIgZXhjZXNzaXZlbHkgcmVidWlsdCBjb250ZW50cworICAgb2YgcGVybC8gc3ViZGlyZWN0b3J5IGJ5IHJld3JpdGluZyBwZXJsLm1hay4KKworICogaHR0cC5zc2xWZXJpZnkgY29uZmlndXJhdGlvbiBzZXR0aW5ncyB3ZXJlIG5vdCB1c2VkIGluIHNjcmlwdGVkCisgICBQb3JjZWxhaW5zLgorCisgKiAiZ2l0LWFkZCIgbGVha2VkIGEgYml0IG9mIG1lbW9yeSB3aGlsZSBzY2FubmluZyBmb3IgZmlsZXMgdG8gYWRkLgorCisgKiBBIGZldyB3b3JrYXJvdW5kcyB0byBzcXVlbGNoIGZhbHNlIHdhcm5pbmdzIGZyb20gcmVjZW50IGdjYyBoYXZlCisgICBiZWVuIGFkZGVkLgorCisgKiAiZ2l0LXNlbmQtcGFjayAkcmVtb3RlIGZyb3R6IiBzZWdmYXVsdGVkIHdoZW4gdGhlcmUgaXMgbm90aGluZworICAgbmFtZWQgJ2Zyb3R6JyBvbiB0aGUgbG9jYWwgZW5kLgorCisgKiAiZ2l0LXJlYmFzZSAtLWludGVyYWN0aXZlIiBkaWQgbm90IGhhbmRsZSBpdHMgIi0tc3RyYXRlZ3kiIG9wdGlvbgorICAgcHJvcGVybHkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS4zLjYudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMy42LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjlhMmIyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMy42LnR4dApAQCAtMCwwICsxLDQ4IEBACitHSVQgdjEuNS4zLjYgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS4zLjUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqIGdpdC1jdnNleHBvcnRjb21taXQgaGFuZGxlcyByb290IGNvbW1pdHMgYmV0dGVyLgorCisgKiBnaXQtc3ZuIGRjb21taXQgdXNlZCB0byBjbG9iYmVyIHdoZW4gc2VuZGluZyBhIHNlcmllcyBvZgorICAgcGF0Y2hlcy4KKworICogZ2l0LXN2biBkY29tbWl0IGZhaWxlZCBhZnRlciBhdHRlbXB0aW5nIHRvIHJlYmFzZSB3aGVuCisgICBzdGFydGVkIHdpdGggYSBkaXJ0eSBpbmRleDsgbm93IGl0IHN0b3BzIHVwZnJvbnQuCisKKyAqIGdpdC1ncmVwIHNvbWV0aW1lcyByZWZ1c2VkIHRvIHdvcmsgd2hlbiB5b3VyIGluZGV4IHdhcworICAgdW5tZXJnZWQuCisKKyAqICJnaXQtZ3JlcCAtQTEgLUIyIiBhY3RlZCBhcyBpZiBpdCB3YXMgdG9sZCB0byBydW4gImdpdCAtQTEgLUIyMSIuCisKKyAqIGdpdC1oYXNoLW9iamVjdCBkaWQgbm90IGhvbm9yIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzLCBzdWNoIGFzCisgICBjb3JlLmNvbXByZXNzaW9uLgorCisgKiBnaXQtaW5kZXgtcGFjayBjaG9rZWQgb24gYSBodWdlIHBhY2sgb24gMzItYml0IG1hY2hpbmVzLCBldmVuIHdoZW4KKyAgIGxhcmdlIGZpbGUgb2Zmc2V0cyBhcmUgc3VwcG9ydGVkLgorCisgKiBhdG9tIGZlZWRzIGZyb20gZ2l0LXdlYiBzYWlkICIxMCIgZm9yIHRoZSBtb250aCBvZiBOb3ZlbWJlci4KKworICogYSBtZW1vcnkgbGVhayBpbiBjb21taXQgd2Fsa2VyIHdhcyBwbHVnZ2VkLgorCisgKiBXaGVuIGdpdC1zZW5kLWVtYWlsIGluc2VydGVkIHRoZSBvcmlnaW5hbCBhdXRob3IncyBGcm9tOgorICAgYWRkcmVzcyBpbiBib2R5LCBpdCBkaWQgbm90IG1hcmsgdGhlIG1lc3NhZ2Ugd2l0aAorICAgQ29udGVudC10eXBlOiBhcyBuZWVkZWQuCisKKyAqIGdpdC1yZXZlcnQgYW5kIGdpdC1jaGVycnktcGljayBpbmNvcnJlY3RseSByZWZ1c2VkIHRvIHN0YXJ0CisgICB3aGVuIHRoZSB3b3JrIHRyZWUgd2FzIGRpcnR5LgorCisgKiBnaXQtY2xlYW4gZGlkIG5vdCBob25vciBjb3JlLmV4Y2x1ZGVzZmlsZSBjb25maWd1cmF0aW9uLgorCisgKiBnaXQtYWRkIG1pc2hhbmRsZWQgIi5naXRpZ25vcmUiIGZpbGVzIHdoZW4gYXBwbHlpbmcgdGhlbSB0bworICAgc3ViZGlyZWN0b3JpZXMuCisKKyAqIFdoaWxlIGltcG9ydGluZyBhIHRvbyBicmFuY2h5IGhpc3RvcnksIGdpdC1mYXN0aW1wb3J0IGRpZCBub3QKKyAgIGhvbm9yIGRlbHRhIGRlcHRoIGxpbWl0IHByb3Blcmx5LgorCisgKiBTdXBwb3J0IGZvciB6bGliIGltcGxlbWVudGF0aW9ucyB0aGF0IGxhY2sgWkxJQl9WRVJOVU0gYW5kIGRlZmluaXRpb24KKyAgIG9mIGRlZmxhdGVCb3VuZCgpIGhhcyBiZWVuIGFkZGVkLgorCisgKiBRdWl0ZSBhIGxvdCBvZiBkb2N1bWVudGF0aW9uIGNsYXJpZmljYXRpb25zLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMy43LnR4dCBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjMuNy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY2OTA2MQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjMuNy50eHQKQEAgLTAsMCArMSw0NSBAQAorR0lUIHYxLjUuMy43IFJlbGVhc2UgTm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZpeGVzIHNpbmNlIHYxLjUuMy42CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiBnaXQtc2VuZC1lbWFpbCBhZGRlZCA4LWJpdCBjb250ZW50cyB0byB0aGUgcGF5bG9hZCB3aXRob3V0CisgICBtYXJraW5nIGl0IGFzIDgtYml0IGluIGEgQ1RFIGhlYWRlci4KKworICogImdpdC1idW5kbGUgY3JlYXRlIGEuYm5kbCBIRUFEIiBkZXJlZmVyZW5jZWQgdGhlIHN5bXJlZiBhbmQKKyAgIGRpZCBub3QgcmVjb3JkIHRoZSByZWYgYXMgJ0hFQUQnOyB0aGlzIHByZXZlbnRlZCBhIGJ1bmRsZQorICAgZnJvbSBiZWluZyB1c2VkIGFzIGEgbm9ybWFsIHNvdXJjZSBvZiBnaXQtY2xvbmUuCisKKyAqIFRoZSBjb2RlIHRvIHJlamVjdCBub25zZW5zZSBjb21tYW5kIGxpbmUgb2YgdGhlIGZvcm0KKyAgICJnaXQtY29tbWl0IC1hIHBhdGhzLi4uIiBhbmQgImdpdC1jb21taXQgLS1pbnRlcmFjdGl2ZQorICAgcGF0aHMuLi4iIHdlcmUgYnJva2VuLgorCisgKiBBZGRpbmcgYSBzaWduYXR1cmUgdGhhdCBpcyBub3QgQVNDSUktb25seSB0byBhbiBvcmlnaW5hbAorICAgY29tbWl0IHRoYXQgaXMgQVNDSUktb25seSB3b3VsZCBtYWtlIHRoZSByZXN1bHQgbm9uLUFTQ0lJLgorICAgImdpdC1mb3JtYXQtcGF0Y2ggLXMiIGRpZCBub3QgbWFyayBzdWNoIGEgbWVzc2FnZSBjb3JyZWN0bHkKKyAgIHdpdGggTUlNRSBlbmNvZGluZyBoZWFkZXIuCisKKyAqIGdpdC1hZGQgc29tZXRpbWVzIGRpZCBub3QgbWFyayB0aGUgcmVzdWx0aW5nIGluZGV4IGVudHJ5CisgICBzdGF0LWNsZWFuLiAgVGhpcyBhZmZlY3RlZCBvbmx5IGNhc2VzIHdoZW4gYWRkaW5nIHRoZQorICAgY29udGVudHMgd2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHByZXZpb3VzbHkgc3RhZ2VkCisgICBjb250ZW50cywgYW5kIHRoZSBwcmV2aW91cyBzdGFnaW5nIG1hZGUgdGhlIGluZGV4IGVudHJ5CisgICAicmFjaWx5IGNsZWFuIi4KKworICogZ2l0LWNvbW1pdCBkaWQgbm90IGhvbm9yIEdJVF9JTkRFWF9GSUxFIHRoZSB1c2VyIGhhZCBpbiB0aGUKKyAgIGVudmlyb25tZW50LgorCisgKiBXaGVuIGNoZWNraW5nIG91dCBhIHJldmlzaW9uLCBnaXQtY2hlY2tvdXQgZGlkIG5vdCByZXBvcnQgd2hlcmUgdGhlCisgICB1cGRhdGVkIEhFQUQgaXMgaWYgeW91IGhhcHBlbmVkIHRvIGhhdmUgYSBmaWxlIGNhbGxlZCBIRUFEIGluIHRoZQorICAgd29yayB0cmVlLgorCisgKiAiZ2l0LXJldi1saXN0IC0tb2JqZWN0cyIgbWlzaGFuZGxlZCBhIHRyZWUgdGhhdCBwb2ludHMgYXQgYQorICAgc3VibW9kdWxlLgorCisgKiAiZ2l0IGN2c2ltcG9ydCIgd2FzIG5vdCByZWFkeSBmb3IgcGFja2VkIHJlZnMgdGhhdCAiZ2l0IGdjIiBjYW4KKyAgIHByb2R1Y2UgYW5kIGdhdmUgaW5jb3JyZWN0IHJlc3VsdHMuCisKKyAqIE1hbnkgc2NyaXB0ZWQgUG9yY2VsYWlucyB3ZXJlIGNvbmZ1c2VkIHdoZW4geW91IGhhcHBlbmVkIHRvIGhhdmUgYQorICAgZmlsZSBjYWxsZWQgIkhFQUQiIGluIHlvdXIgd29yayB0cmVlLgorCitBbHNvIGl0IGNvbnRhaW5zIHVwZGF0ZXMgdG8gdGhlIHVzZXIgbWFudWFsIGFuZCBkb2N1bWVudGF0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMy44LnR4dCBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjMuOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUzZmY1OAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjMuOC50eHQKQEAgLTAsMCArMSwyNSBAQAorR0lUIHYxLjUuMy44IFJlbGVhc2UgTm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZpeGVzIHNpbmNlIHYxLjUuMy43CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiBTb21lIGRvY3VtZW50YXRpb24gdXNlZCAiZW1haWwuY29tIiBhcyBhbiBleGFtcGxlIGRvbWFpbi4KKworICogZ2l0LXN2biBmaXggdG8gaGFuZGxlIGZ1bmt5IGJyYW5jaCBhbmQgcHJvamVjdCBuYW1lcyBnb2luZyBvdmVyCisgICBodHRwL2h0dHBzIGNvcnJlY3RseS4KKworICogZ2l0LXN2biBmaXggdG8gdG9uZSBkb3duIGEgbmVlZGxlc3NseSBhbGFybWluZyB3YXJuaW5nIG1lc3NhZ2UuCisKKyAqIGdpdC1jbG9uZSBkaWQgbm90IGNvcnJlY3RseSByZXBvcnQgZXJyb3JzIHdoaWxlIGZldGNoaW5nIG92ZXIgaHR0cC4KKworICogZ2l0LXNlbmQtZW1haWwgYWRkZWQgcmVkdW5kYW50IE1lc3NhZ2UtSWQ6IGhlYWRlciB0byB0aGUgb3V0Z29pbmcKKyAgIGUtbWFpbCB3aGVuIHRoZSBwYXRjaCB0ZXh0IGFscmVhZHkgaGFkIG9uZS4KKworICogYSByZWFkLWJleW9uZC1lbmQtb2YtYnVmZmVyIGJ1ZyBpbiBjb25maWd1cmF0aW9uIGZpbGUgdXBkYXRlciB3YXMgZml4ZWQuCisKKyAqIGdpdC1ncmVwIHVzZWQgdG8gc2hvdyB0aGUgc2FtZSBoaXQgcmVwZWF0ZWRseSBmb3IgdW5tZXJnZWQgcGF0aHMuCisKKyAqIEFmdGVyIGFtZW5kaW5nIHRoZSBwYXRjaCB0aXRsZSBpbiAiZ2l0LWFtIC1pIiwgdGhlIGNvbW1hbmQgZGlkIG5vdAorICAgcmVwb3J0IHRoZSBwYXRjaCBpdCBhcHBsaWVkIHdpdGggdGhlIHVwZGF0ZWQgdGl0bGUuCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjMudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAzODk0YgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjMudHh0CkBAIC0wLDAgKzEsMzY2IEBACitHSVQgdjEuNS4zIFJlbGVhc2UgTm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PQorCitVcGRhdGVzIHNpbmNlIHYxLjUuMgorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBUaGUgY29tbWl0IHdhbGtlcnMgb3RoZXIgdGhhbiBodHRwIGFyZSBvZmZpY2lhbGx5IGRlcHJlY2F0ZWQsCisgIGJ1dCBzdGlsbCBzdXBwb3J0ZWQgZm9yIG5vdy4KKworKiBUaGUgc3VibW9kdWxlIHN1cHBvcnQgaGFzIFBvcmNlbGFpbiBsYXllci4KKworICBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgc3VibW9kdWxlIHN1cHBvcnQgaXMgbWluaW1hbCBhbmQgdGhpcyBpcworICBkZWxpYmVyYXRlbHkgc28uICBBIGRlc2lnbiBkZWNpc2lvbiB3ZSBtYWRlIGlzIHRoYXQgb3BlcmF0aW9ucworICBhdCB0aGUgc3VwZXJtb2R1bGUgbGV2ZWwgZG8gbm90IHJlY3Vyc2UgaW50byBzdWJtb2R1bGVzIGJ5CisgIGRlZmF1bHQuICBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdCBsYXRlciB3ZSB3b3VsZCBhZGQgYQorICBtZWNoYW5pc20gdG8gdGVsbCBnaXQgd2hpY2ggc3VibW9kdWxlcyB0aGUgdXNlciBpcyBpbnRlcmVzdGVkCisgIGluLCBhbmQgdGhpcyBpbmZvcm1hdGlvbiBtaWdodCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUKKyAgcmVjdXJzaXZlIGJlaGF2aW91ciBvZiBjZXJ0YWluIGNvbW1hbmRzIChlLmcuICJnaXQgY2hlY2tvdXQiCisgIGFuZCAiZ2l0IGRpZmYiKSwgYnV0IGN1cnJlbnRseSB3ZSBoYXZlbid0IGFncmVlZCBvbiB3aGF0IHRoYXQKKyAgbWVjaGFuaXNtIHNob3VsZCBsb29rIGxpa2UuICBUaGVyZWZvcmUsIGlmIHlvdSB1c2Ugc3VibW9kdWxlcywKKyAgeW91IHdvdWxkIHByb2JhYmx5IG5lZWQgImdpdCBzdWJtb2R1bGUgdXBkYXRlIiBvbiB0aGUKKyAgc3VibW9kdWxlcyB5b3UgY2FyZSBhYm91dCBhZnRlciBydW5uaW5nIGEgImdpdCBjaGVja291dCIgYXQKKyAgdGhlIHN1cGVybW9kdWxlIGxldmVsLgorCisqIFRoZXJlIGFyZSBhIGhhbmRmdWwgcGFjay1vYmplY3RzIGNoYW5nZXMgdG8gaGVscCB5b3UgY29wZSBiZXR0ZXIKKyAgd2l0aCByZXBvc2l0b3JpZXMgd2l0aCBwYXRob2xvZ2ljYWxseSBsYXJnZSBibG9icyBpbiB0aGVtLgorCisqIEZvciBwZW9wbGUgd2hvIG5lZWQgdG8gaW1wb3J0IGZyb20gUGVyZm9yY2UsIGEgZnJvbnQtZW5kIGZvcgorICBmYXN0LWltcG9ydCBpcyBpbiBjb250cmliL2Zhc3QtaW1wb3J0Ly4KKworKiBDb21lcyB3aXRoIGdpdC1ndWkgMC44LjIuCisKKyogQ29tZXMgd2l0aCB1cGRhdGVkIGdpdGsuCisKKyogTmV3IGNvbW1hbmRzIGFuZCBvcHRpb25zLgorCisgIC0gImdpdCBsb2cgLS1kYXRlPTxmb3JtYXQ+IiBjYW4gdXNlIG1vcmUgZm9ybWF0czogaXNvODYwMSwgcmZjMjgyMi4KKworICAtIFRoZSBodW5rIGhlYWRlciBvdXRwdXQgZnJvbSAiZ2l0IGRpZmYiIGZhbWlseSBjYW4gYmUgY3VzdG9taXplZAorICAgIHdpdGggdGhlIGF0dHJpYnV0ZXMgbWVjaGFuaXNtLiAgU2VlIGdpdGF0dHJpYnV0ZXMoNSkgZm9yIGRldGFpbHMuCisKKyAgLSAiZ2l0IHN0YXNoIiBhbGxvd3MgeW91IHRvIHF1aWNrbHkgc2F2ZSBhd2F5IHlvdXIgd29yayBpbgorICAgIHByb2dyZXNzIGFuZCByZXBsYXkgaXQgbGF0ZXIgb24gYW4gdXBkYXRlZCBzdGF0ZS4KKworICAtICJnaXQgcmViYXNlIiBsZWFybmVkIGFuICJpbnRlcmFjdGl2ZSIgbW9kZSB0aGF0IGxldCB5b3UKKyAgICBwaWNrIGFuZCByZW9yZGVyIHdoaWNoIGNvbW1pdHMgdG8gcmVidWlsZC4KKworICAtICJnaXQgZnNjayIgY2FuIHNhdmUgaXRzIGZpbmRpbmdzIGluICRHSVRfRElSL2xvc3QtZm91bmQsIHdpdGhvdXQgYQorICAgIHNlcGFyYXRlIGludm9jYXRpb24gb2YgImdpdCBsb3N0LWZvdW5kIiBjb21tYW5kLiAgVGhlIGJsb2JzIHN0b3JlZCBieQorICAgIGxvc3QtZm91bmQgYXJlIHN0b3JlZCBpbiBwbGFpbiBmb3JtYXQgdG8gYWxsb3cgeW91IHRvIGdyZXAgaW4gdGhlbS4KKworICAtICRHSVRfV09SS19UUkVFIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbiBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKKyAgICAkR0lUX0RJUiB0byB3b3JrIGluIGEgc3ViZGlyZWN0b3J5IG9mIGEgd29ya2luZyB0cmVlIHRoYXQgaXMKKyAgICBub3QgbG9jYXRlZCBhdCAiJEdJVF9ESVIvLi4iLgorCisgIC0gR2l2aW5nICItLWZpbGU9PGZpbGU+IiBvcHRpb24gdG8gImdpdCBjb25maWciIGlzIHRoZSBzYW1lIGFzCisgICAgcnVubmluZyB0aGUgY29tbWFuZCB3aXRoIEdJVF9DT05GSUc9PGZpbGU+IGVudmlyb25tZW50LgorCisgIC0gImdpdCBsb2ciIGxlYXJuZWQgYSBuZXcgb3B0aW9uICItLWZvbGxvdyIsIHRvIGZvbGxvdworICAgIHJlbmFtaW5nIGhpc3Rvcnkgb2YgYSBzaW5nbGUgZmlsZS4KKworICAtICJnaXQgZmlsdGVyLWJyYW5jaCIgbGV0cyB5b3UgcmV3cml0ZSB0aGUgcmV2aXNpb24gaGlzdG9yeSBvZgorICAgIHNwZWNpZmllZCBicmFuY2hlcy4gWW91IGNhbiBzcGVjaWZ5IGEgbnVtYmVyIG9mIGZpbHRlcnMgdG8KKyAgICBtb2RpZnkgdGhlIGNvbW1pdHMsIGZpbGVzIGFuZCB0cmVlcy4KKworICAtICJnaXQgY3Zzc2VydmVyIiBsZWFybmVkIG5ldyBvcHRpb25zICgtLWJhc2UtcGF0aCwgLS1leHBvcnQtYWxsLAorICAgIC0tc3RyaWN0LXBhdGhzKSBpbnNwaXJlZCBieSAiZ2l0IGRhZW1vbiIuCisKKyAgLSAiZ2l0IGRhZW1vbiAtLWJhc2UtcGF0aC1yZWxheGVkIiBjYW4gaGVscCBtaWdyYXRpbmcgYSByZXBvc2l0b3J5IFVSTAorICAgIHRoYXQgZGlkIG5vdCB1c2UgdG8gdXNlIC0tYmFzZS1wYXRoIHRvIHVzZSAtLWJhc2UtcGF0aC4KKworICAtICJnaXQgY29tbWl0IiBjYW4gdXNlICItdCB0ZW1wbGF0ZWZpbGUiIG9wdGlvbiBhbmQgY29tbWl0LnRlbXBsYXRlCisgICAgY29uZmlndXJhdGlvbiB2YXJpYWJsZSB0byBwcmltZSB0aGUgY29tbWl0IG1lc3NhZ2UgZ2l2ZW4gdG8geW91IGluIHRoZQorICAgIGVkaXRvci4KKworICAtICJnaXQgc3VibW9kdWxlIiBjb21tYW5kIGhlbHBzIHlvdSBtYW5hZ2UgdGhlIHByb2plY3RzIGZyb20KKyAgICB0aGUgc3VwZXJwcm9qZWN0IHRoYXQgY29udGFpbiB0aGVtLgorCisgIC0gSW4gYWRkaXRpb24gdG8gY29yZS5jb21wcmVzc2lvbiBjb25maWd1cmF0aW9uIG9wdGlvbiwKKyAgICBjb3JlLmxvb3NlY29tcHJlc3Npb24gYW5kIHBhY2suY29tcHJlc3Npb24gb3B0aW9ucyBjYW4KKyAgICBpbmRlcGVuZGVudGx5IHR3ZWFrIHpsaWIgY29tcHJlc3Npb24gbGV2ZWxzIHVzZWQgZm9yIGxvb3NlCisgICAgYW5kIHBhY2tlZCBvYmplY3RzLgorCisgIC0gImdpdCBscy10cmVlIC1sIiBzaG93cyBzaXplIG9mIGJsb2JzIHBvaW50ZWQgYXQgYnkgdGhlCisgICAgdHJlZSBlbnRyaWVzLCBzaW1pbGFyIHRvICIvYmluL2xzIC1sIi4KKworICAtICJnaXQgcmV2LWxpc3QiIGxlYXJuZWQgLS1yZWdleHAtaWdub3JlLWNhc2UgYW5kCisgICAgLS1leHRlbmRlZC1yZWdleHAgb3B0aW9ucyB0byB0d2VhayBpdHMgbWF0Y2hpbmcgbG9naWMgdXNlZAorICAgIGZvciAtLWdyZXAgZml0ZXJpbmcuCisKKyAgLSAiZ2l0IGRlc2NyaWJlIC0tY29udGFpbnMiIGlzIGEgaGFuZGllciB3YXkgdG8gY2FsbCBtb3JlCisgICAgb2JzY3VyZSBjb21tYW5kICJnaXQgbmFtZS1yZXYgLS10YWdzIi4KKworICAtICJnaXQgZ2MgLS1hZ2dyZXNzaXZlIiB0ZWxscyB0aGUgY29tbWFuZCB0byBzcGVuZCBtb3JlIGN5Y2xlcworICAgIHRvIG9wdGltaXplIHRoZSByZXBvc2l0b3J5IGhhcmRlci4KKworICAtICJnaXQgcmVwYWNrIiBsZWFybmVkIGEgIndpbmRvdy1tZW1vcnkiIGxpbWl0IHdoaWNoCisgICAgZHluYW1pY2FsbHkgcmVkdWNlcyB0aGUgd2luZG93IHNpemUgdG8gc3RheSB3aXRoaW4gdGhlCisgICAgc3BlY2lmaWVkIG1lbW9yeSB1c2FnZS4KKworICAtICJnaXQgcmVwYWNrIiBjYW4gYmUgdG9sZCB0byBzcGxpdCByZXN1bHRpbmcgcGFja3MgdG8gYXZvaWQKKyAgICBleGNlZWRpbmcgbGltaXQgc3BlY2lmaWVkIHdpdGggIi0tbWF4LXBhY2stc2l6ZSIuCisKKyAgLSAiZ2l0IGZzY2siIGdhaW5lZCAtLXZlcmJvc2Ugb3B0aW9uLiAgVGhpcyBpcyByZWFsbHkgcmVhbGx5CisgICAgdmVyYm9zZSBidXQgaXQgbWlnaHQgaGVscCB5b3UgaWRlbnRpZnkgZXhhY3QgY29tbWl0IHRoYXQgaXMKKyAgICBjb3JydXB0IGluIHlvdXIgcmVwb3NpdG9yeS4KKworICAtICJnaXQgZm9ybWF0LXBhdGNoIiBsZWFybmVkIC0tbnVtYmVyZWQtZmlsZXMgb3B0aW9uLiAgVGhpcworICAgIG1heSBiZSB1c2VmdWwgZm9yIE1IIHVzZXJzLgorCisgIC0gImdpdCBmb3JtYXQtcGF0Y2giIGxlYXJuZWQgZm9ybWF0LnN1YmplY3RwcmVmaXggY29uZmlndXJhdGlvbgorICAgIHZhcmlhYmxlLCB3aGljaCBzZXJ2ZXMgdGhlIHNhbWUgcHVycG9zZSBhcyAiLS1zdWJqZWN0LXByZWZpeCIKKyAgICBvcHRpb24uCisKKyAgLSAiZ2l0IHRhZyAtbiAtbCIgc2hvd3MgdGFnIGFubm90YXRpb25zIHdoaWxlIGxpc3RpbmcgdGFncy4KKworICAtICJnaXQgY3ZzaW1wb3J0IiBjYW4gb3B0aW9uYWxseSB1c2UgdGhlIHNlcGFyYXRlLXJlbW90ZSBsYXlvdXQuCisKKyAgLSAiZ2l0IGJsYW1lIiBjYW4gYmUgdG9sZCB0byBzZWUgdGhyb3VnaCBjb21taXRzIHRoYXQgY2hhbmdlCisgICAgd2hpdGVzcGFjZXMgYW5kIGluZGVudGF0aW9uIGxldmVscyB3aXRoICItdyIgb3B0aW9uLgorCisgIC0gImdpdCBzZW5kLWVtYWlsIiBjYW4gYmUgdG9sZCBub3QgdG8gdGhyZWFkIHRoZSBtZXNzYWdlcyB3aGVuCisgICAgc2VuZGluZyBvdXQgbW9yZSB0aGFuIG9uZSBwYXRjaGVzLgorCisgIC0gImdpdCBzZW5kLWVtYWlsIiBjYW4gYWxzbyBiZSB0b2xkIGhvdyB0byBmaW5kIHdob20gdG8gY2MgdGhlCisgICAgbWVzc2FnZSB0byBmb3IgZWFjaCBtZXNzYWdlIHZpYSAtLWNjLWNtZC4KKworICAtICJnaXQgY29uZmlnIiBsZWFybmVkIE5VTCB0ZXJtaW5hdGVkIG91dHB1dCBmb3JtYXQgdmlhIC16IHRvCisgICAgaGVscCBzY3JpcHRzLgorCisgIC0gImdpdCBhZGQiIGxlYXJuZWQgIi0tcmVmcmVzaCA8cGF0aHM+Li4uIiBvcHRpb24gdG8gc2VsZWN0aXZlbHkgcmVmcmVzaAorICAgIHRoZSBjYWNoZWQgc3RhdCBpbmZvcm1hdGlvbi4KKworICAtICJnaXQgaW5pdCAtcSIgbWFrZXMgdGhlIGNvbW1hbmQgcXVpZXRlci4KKworICAtICJnaXQgLXAgY29tbWFuZCIgbm93IGhhcyBhIGNvdXNpbiBvZiBvcHBvc2l0ZSBzZXgsICJnaXQgLS1uby1wYWdlcgorICAgIGNvbW1hbmQiLgorCisqIFVwZGF0ZWQgYmVoYXZpb3Igb2YgZXhpc3RpbmcgY29tbWFuZHMuCisKKyAgLSAiZ2l0d2ViIiBjYW4gb2ZmZXIgbXVsdGlwbGUgc25hcHNob3QgZm9ybWF0cy4KKworICAgICoqKk5PVEUqKiogVW5mb3J0dW5hdGVseSwgdGhpcyBjaGFuZ2VzIHRoZSBmb3JtYXQgb2YgdGhlCisgICAgJGZlYXR1cmV7c25hcHNob3R9e2RlZmF1bHR9IGVudHJ5IGluIHRoZSBwZXItc2l0ZQorICAgIGNvbmZpZ3VyYXRpb24gZmlsZSAnZ2l0d2ViX2NvbmZpZy5wZXJsJy4gIEl0IHVzZWQgdG8gYmUgYQorICAgIHRocmVlLWVsZW1lbnQgdHVwbGUgdGhhdCBkZXNjcmliZSBhIHNpbmdsZSBmb3JtYXQ7IHdpdGggdGhlCisgICAgbmV3IGNvbmZpZ3VyYXRpb24gaXRlbSBmb3JtYXQsIHlvdSBvbmx5IGhhdmUgdG8gc2F5IHRoZSBuYW1lCisgICAgb2YgdGhlIGZvcm1hdCAoJ3RneicsICd0YnoyJyBvciAnemlwJykuICBQbGVhc2UgdXBkYXRlIHRoZQorICAgIHlvdXIgY29uZmlndXJhdGlvbiBmaWxlIGFjY29yZGluZ2x5LgorCisgIC0gImdpdCBjbG9uZSIgdXNlcyAtbCAoaGFyZGxpbmsgZmlsZXMgdW5kZXIgLmdpdCkgYnkgZGVmYXVsdCB3aGVuCisgICAgY2xvbmluZyBsb2NhbGx5LgorCisgIC0gVVJMIHVzZWQgZm9yICJnaXQgY2xvbmUiIGFuZCBmcmllbmRzIGNhbiBzcGVjaWZ5IG5vbnN0YW5kYXJkIFNTSCBwb3J0CisgICAgYnkgdXNpbmcgc3NoOi8vaG9zdDpwb3J0L3BhdGgvdG8vcmVwbyBzeW50YXguCisKKyAgLSAiZ2l0IGJ1bmRsZSBjcmVhdGUiIGNhbiBub3cgY3JlYXRlIGEgYnVuZGxlIHdpdGhvdXQgbmVnYXRpdmUgcmVmcywKKyAgICBpLmUuICJldmVyeXRoaW5nIHNpbmNlIHRoZSBiZWdpbm5pbmcgdXAgdG8gY2VydGFpbiBwb2ludHMiLgorCisgIC0gImdpdCBkaWZmIiAoYnV0IG5vdCB0aGUgcGx1bWJpbmcgbGV2ZWwgImdpdCBkaWZmLXRyZWUiKSBub3cKKyAgICByZWN1cnNpdmVseSBkZXNjZW5kcyBpbnRvIHRyZWVzIGJ5IGRlZmF1bHQuCisKKyAgLSAiZ2l0IGRpZmYiIGRvZXMgbm90IHNob3cgZGlmZmVyZW5jZXMgdGhhdCBjb21lIG9ubHkgZnJvbQorICAgIHN0YXQtZGlydGluZXNzIGluIHRoZSBmb3JtIG9mICJkaWZmIC0tZ2l0IiBoZWFkZXIgYW55bW9yZS4KKyAgICBJdCBydW5zICJ1cGRhdGUtaW5kZXggLS1yZWZyZXNoIiBzaWxlbnRseSBhcyBuZWVkZWQuCisKKyAgLSAiZ2l0IHRhZyAtbCIgdXNlZCB0byBtYXRjaCB0YWdzIGJ5IGdsb2JiaW5nIGl0cyBwYXJhbWV0ZXIgYXMgaWYgaXQKKyAgICBoYXMgd2lsZGNhcmQgJyonIG9uIGJvdGggZW5kcywgd2hpY2ggbWFkZSAiZ2l0IHRhZyAtbCBndWkiIHRvIG1hdGNoCisgICAgdGFnICdnaXRndWktMC43LjAnOyB0aGlzIHdhcyB2ZXJ5IGFubm95aW5nLiAgWW91IG5vdyBoYXZlIHRvIGFkZAorICAgIGFzdGVyaXNrIG9uIHRoZSBzaWRlcyB5b3Ugd2FudCB0byB3aWxkY2FyZCB5b3Vyc2VsZi4KKworICAtIFRoZSBlZGl0b3IgdG8gdXNlIHdpdGggbWFueSBpbnRlcmFjdGl2ZSBjb21tYW5kcyBjYW4gYmUKKyAgICBvdmVycmlkZGVuIHdpdGggR0lUX0VESVRPUiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgaWYgaXQKKyAgICBkb2VzIG5vdCBleGlzdCwgd2l0aCBjb3JlLmVkaXRvciBjb25maWd1cmF0aW9uIHZhcmlhYmxlLiAgQXMKKyAgICBiZWZvcmUsIGlmIHlvdSBoYXZlIG5laXRoZXIsIGVudmlyb25tZW50IHZhcmlhYmxlcyBWSVNVQUwKKyAgICBhbmQgRURJVE9SIGFyZSBjb25zdWx0ZWQgaW4gdGhpcyBvcmRlciwgYW5kIHRoZW4gZmluYWxseSB3ZQorICAgIGZhbGwgYmFjayBvbiAidmkiLgorCisgIC0gImdpdCBybSAtLWNhY2hlZCIgZG9lcyBub3QgY29tcGxhaW4gd2hlbiByZW1vdmluZyBhIG5ld2x5CisgICAgYWRkZWQgZmlsZSBmcm9tIHRoZSBpbmRleCBhbnltb3JlLgorCisgIC0gT3B0aW9ucyB0byAiZ2l0IGxvZyIgdG8gYWZmZWN0IGhvdyAtLWdyZXAvLS1hdXRob3Igb3B0aW9ucyBsb29rIGZvcgorICAgIGdpdmVuIHN0cmluZ3Mgbm93IGhhdmUgc2hvcnRlciBhYmJyZXZpYXRpb25zLiAgLWkgaXMgZm9yIGlnbm9yZSBjYXNlLAorICAgIGFuZCAtRSBpcyBmb3IgZXh0ZW5kZWQgcmVnZXhwLgorCisgIC0gImdpdCBsb2ciIGxlYXJuZWQgLS1sb2ctc2l6ZSB0byBzaG93IHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4KKyAgICB0aGUgbG9nIG1lc3NhZ2UgcGFydCBvZiB0aGUgb3V0cHV0IHRvIGhlbHAgcWdpdC4KKworICAtICJnaXQgbG9nIC0tbmFtZS1zdGF0dXMiIGRvZXMgbm90IHJlcXVpcmUgeW91IHRvIGdpdmUgIi1yIiBhbnltb3JlLgorICAgIEFzIGEgZ2VuZXJhbCBydWxlLCBQb3JjZWxhaW4gY29tbWFuZHMgc2hvdWxkIHJlY3Vyc2Ugd2hlbiBzaG93aW5nCisgICAgZGlmZi4KKworICAtICJnaXQgZm9ybWF0LXBhdGNoIC0tcm9vdCBBIiBjYW4gYmUgdXNlZCB0byBmb3JtYXQgZXZlcnl0aGluZworICAgIHNpbmNlIHRoZSBiZWdpbm5pbmcgdXAgdG8gQS4gIFRoaXMgd2FzIHN1cHBvcnRlZCB3aXRoCisgICAgImdpdCBmb3JtYXQtcGF0Y2ggLS1yb290IEEgQSIgZm9yIGEgbG9uZyB0aW1lLCBidXQgd2FzIG5vdAorICAgIHByb3Blcmx5IGRvY3VtZW50ZWQuCisKKyAgLSAiZ2l0IHN2biBkY29tbWl0IiByZXRhaW5zIGxvY2FsIG1lcmdlIGluZm9ybWF0aW9uLgorCisgIC0gImdpdCBzdm5pbXBvcnQiIGFsbG93cyBhbiBlbXB0eSBzdHJpbmcgdG8gYmUgc3BlY2lmaWVkIGFzIHRoZQorICAgIHRydW5rLyBkaXJlY3RvcnkuICBUaGlzIGlzIG5lY2Vzc2FyeSB0byBzdWNrIGRhdGEgZnJvbSBhIFNWTgorICAgIHJlcG9zaXRvcnkgdGhhdCBkb2Ugbm90IGhhdmUgdHJ1bmsvIGJyYW5jaGVzLyBhbmQgdGFncy8gb3JnYW5pemF0aW9uCisgICAgYXQgYWxsLgorCisgIC0gImdpdCBjb25maWciIHRvIHNldCB2YWx1ZXMgYWxzbyBob25vcnMgdHlwZSBmbGFncyBsaWtlIC0tYm9vbAorICAgIGFuZCAtLWludC4KKworICAtIGNvcmUucXVvdGVwYXRoIGNvbmZpZ3VyYXRpb24gY2FuIGJlIHVzZWQgdG8gbWFrZSB0ZXh0dWFsIGdpdAorICAgIG91dHB1dCB0byBlbWl0IG1vc3Qgb2YgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHBhdGggbGl0ZXJhbGx5LgorCisgIC0gImdpdCBtZXJnZXRvb2wiIGNob29zZXMgaXRzIGJhY2tlbmQgbW9yZSB3aXNlbHksIHRha2luZworICAgIG5vdGljZSBvZiBpdHMgZW52aXJvbm1lbnQgc3VjaCBhcyB1c2Ugb2YgWCwgR25vbWUvS0RFLCBldGMuCisKKyAgLSAiZ2l0d2ViIiBzaG93cyBtZXJnZSBjb21taXRzIGEgbG90IG5pY2VyIHRoYW4gYmVmb3JlLiAgVGhlCisgICAgZGVmYXVsdCB2aWV3IHVzZXMgbW9yZSBjb21wYWN0IC0tY2MgZm9ybWF0LCB3aGlsZSB0aGUgVUkKKyAgICBhbGxvd3MgdG8gY2hvb3NlIG5vcm1hbCBkaWZmIHdpdGggYW55IHBhcmVudC4KKworICAtIHNuYXBzaG90IGZpbGVzICJnaXR3ZWIiIGNyZWF0ZXMgZnJvbSBhIHJlcG9zaXRvcnkgYXQKKyAgICAkcGF0aC8kcHJvamVjdC8uZ2l0IGFyZSBtb3JlIHVzZWZ1bC4gIFdlIHVzZSAkcHJvamVjdCBwYXJ0CisgICAgaW4gdGhlIGZpbGVuYW1lLCB3aGljaCB3ZSB1c2VkIHRvIGRpc2NhcmQuCisKKyAgLSAiZ2l0IGN2c2ltcG9ydCIgY3JlYXRlcyBsaWdodHdlaWdodCB0YWdzOyB0aGVyZSBpcyBubworICAgIGludGVyZXN0aW5nIGluZm9ybWF0aW9uIHdlIGNhbiByZWNvcmQgaW4gYW4gYW5ub3RhdGVkIHRhZywKKyAgICBhbmQgdGhlIGhhbmRjcmFmdGVkIG9uZXMgdGhlIG9sZCBjb2RlIGNyZWF0ZWQgd2FzIG5vdAorICAgIHByb3Blcmx5IGZvcm1lZCBhbnl3YXkuCisKKyAgLSAiZ2l0IHB1c2giIHByZXRlbmRzIHRoYXQgeW91IGltbWVkaWF0ZWx5IGZldGNoZWQgYmFjayBmcm9tCisgICAgdGhlIHJlbW90ZSBieSB1cGRhdGluZyBjb3JyZXNwb25kaW5nIHJlbW90ZSB0cmFja2luZworICAgIGJyYW5jaGVzIGlmIHlvdSBoYXZlIGFueS4KKworICAtIFRoZSBkaWZmc3RhdCBnaXZlbiBhZnRlciBhIG1lcmdlIChvciBhIHB1bGwpIGhvbm9ycyB0aGUKKyAgICBjb2xvci5kaWZmIGNvbmZpZ3VyYXRpb24uCisKKyAgLSAiZ2l0IGNvbW1pdCAtLWFtZW5kIiBpcyBub3cgY29tcGF0aWJsZSB3aXRoIHZhcmlvdXMgbWVzc2FnZSBzb3VyY2UKKyAgICBvcHRpb25zIHN1Y2ggYXMgLW0vLUMvLWMvLUYuCisKKyAgLSAiZ2l0IGFwcGx5IC0td2hpdGVzcGFjZT1zdHJpcCIgcmVtb3ZlcyBibGFuayBsaW5lcyBhZGRlZCBhdAorICAgIHRoZSBlbmQgb2YgdGhlIGZpbGUuCisKKyAgLSAiZ2l0IGZldGNoIiBvdmVyIGdpdCBuYXRpdmUgcHJvdG9jb2xzIHdpdGggIi12IiBvcHRpb24gc2hvd3MKKyAgICBjb25uZWN0aW9uIHN0YXR1cywgYW5kIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBvdGhlciBlbmQsIHRvCisgICAgaGVscCBkaWFnbm9zaW5nIHByb2JsZW1zLgorCisgIC0gV2UgdXNlZCB0byBoYXZlIGNvcmUubGVnYWN5aGVhZGVycyBjb25maWd1cmF0aW9uLCB3aGVuCisgICAgc2V0IHRvIGZhbHNlLCBhbGxvd2VkIGdpdCB0byB3cml0ZSBsb29zZSBvYmplY3RzIGluIGEgZm9ybWF0CisgICAgdGhhdCBtaW1pY2tzIHRoZSBmb3JtYXQgdXNlZCBieSBvYmplY3RzIHN0b3JlZCBpbiBwYWNrcy4gIEl0CisgICAgdHVybnMgb3V0IHRoYXQgdGhpcyB3YXMgbm90IHNvIHVzZWZ1bC4gIEFsdGhvdWdoIHdlIHdpbGwKKyAgICBjb250aW51ZSB0byByZWFkIG9iamVjdHMgd3JpdHRlbiBpbiB0aGF0IGZvcm1hdCwgd2UgZG8gbm90CisgICAgaG9ub3IgdGhhdCBjb25maWd1cmF0aW9uIGFueW1vcmUgYW5kIGNyZWF0ZSBsb29zZSBvYmplY3RzIGluCisgICAgdGhlIGxlZ2FjeS90cmFkaXRpb25hbCBmb3JtYXQuCisKKyAgLSAiLS1maW5kLWNvcGllcy1oYXJkZXIiIG9wdGlvbiB0byBkaWZmIGZhbWlseSBjYW4gbm93IGJlCisgICAgc3BlbGxlZCBhcyAiLUMgLUMiIGZvciBicmV2aXR5LgorCisgIC0gImdpdCBtYWlsc3BsaXQiIChoZW5jZSAiZ2l0IGFtIikgY2FuIHJlYWQgZnJvbSBNYWlsZGlyCisgICAgZm9ybWF0dGVkIG1haWxib3hlcy4KKworICAtICJnaXQgY3Zzc2VydmVyIiBkb2VzIG5vdCBiYXJmIHVwb24gc2VlaW5nICJjdnMgbG9naW4iCisgICAgcmVxdWVzdC4KKworICAtICJwYWNrLW9iamVjdHMiIGhvbm9ycyAiZGVsdGEiIGF0dHJpYnV0ZSBzZXQgaW4KKyAgICAuZ2l0YXR0cmlidXRlcy4gIEl0IGRvZXMgbm90IGF0dGVtcHQgdG8gZGVsdGlmeSBibG9icyB0aGF0CisgICAgY29tZSBmcm9tIHBhdGhzIHdpdGggZGVsdGEgYXR0cmlidXRlIHNldCB0byBmYWxzZS4KKworICAtICJuZXctd29ya2RpciIgc2NyaXB0IChpbiBjb250cmliKSBjYW4gbm93IGJlIHVzZWQgd2l0aCBhCisgICAgYmFyZSByZXBvc2l0b3J5LgorCisgIC0gImdpdCBtZXJnZXRvb2wiIGxlYXJuZWQgdG8gdXNlIGd2aW1kaWZmLgorCisgIC0gImdpdHZpZXciIChpbiBjb250cmliKSBoYXMgYSBiZXR0ZXIgYmxhbWUgaW50ZXJmYWNlLgorCisgIC0gImdpdCBsb2ciIGFuZCBmcmllbmRzIGRpZCBub3QgaGFuZGxlIGEgY29tbWl0IGxvZyBtZXNzYWdlCisgICAgdGhhdCBpcyBsYXJnZXIgdGhhbiAxNmtCOyB0aGV5IGRvIG5vdy4KKworICAtICItLXByZXR0eT1vbmVsaW5lIiBvdXRwdXQgZm9ybWF0IGZvciAiZ2l0IGxvZyIgYW5kIGZyaWVuZHMKKyAgICBkZWFscyB3aXRoICJtYWxmb3JtZWQiIGNvbW1pdCBsb2cgbWVzc2FnZXMgdGhhdCBoYXZlIG1vcmUKKyAgICB0aGFuIG9uZSBsaW5lcyBpbiB0aGUgZmlyc3QgcGFyYWdyYXBoIGJldHRlci4gIFdlIHVzZWQgdG8KKyAgICBzaG93IHRoZSBmaXJzdCBsaW5lLCBjdXR0aW5nIHRoZSB0aXRsZSBhdCBtaWQtc2VudGVuY2U7IHdlCisgICAgY29uY2F0ZW5hdGUgdGhlbSBpbnRvIGEgc2luZ2xlIGxpbmUgYW5kIHRyZWF0IHRoZSByZXN1bHQgYXMKKyAgICAib25lbGluZSIuCisKKyAgLSAiZ2l0IHA0aW1wb3J0IiBoYXMgYmVlbiBkZW1vdGVkIHRvIGNvbnRyaWIgc3RhdHVzLiAgRm9yCisgICAgYSBzdXBlcmlvciBvcHRpb24sIGNoZWNrb3V0IHRoZSAiZ2l0IHA0IiBmcm9udCBlbmQgdG8KKyAgICAiZ2l0IGZhc3QtaW1wb3J0IiAoYWxzbyBpbiBjb250cmliKS4gIFRoZSBtYW4gcGFnZSBhbmQgcDQKKyAgICBycG0gaGF2ZSBiZWVuIHJlbW92ZWQgYXMgd2VsbC4KKworICAtICJnaXQgbWFpbGluZm8iIChoZW5jZSAiYW0iKSBub3cgdHJpZXMgdG8gc2VlIGlmIHRoZSBtZXNzYWdlCisgICAgaXMgaW4gdXRmLTggZmlyc3QsIGluc3RlYWQgb2YgYXNzdW1pbmcgaXNvLTg4NTktMSwgaWYKKyAgICBpbmNvbWluZyBlLW1haWwgZG9lcyBub3Qgc2F5IHdoYXQgZW5jb2RpbmcgaXQgaXMgaW4uCisKKyogQnVpbGRzCisKKyAgLSBvbGQtc3R5bGUgZnVuY3Rpb24gZGVmaW5pdGlvbnMgKG1vc3Qgbm90YWJseSwgYSBmdW5jdGlvbgorICAgIHdpdGhvdXQgcGFyYW1ldGVyIGRlZmluZWQgd2l0aCAiZnVuYygpIiwgbm90ICJmdW5jKHZvaWQpIikKKyAgICBoYXZlIGJlZW4gZXJhZGljYXRlZC4KKworICAtICJnaXQgdGFnIiBhbmQgImdpdCB2ZXJpZnktdGFnIiBoYXZlIGJlZW4gcmV3cml0dGVuIGluIEMuCisKKyogUGVyZm9ybWFuY2UgVHdlYWtzCisKKyAgLSAiZ2l0IHBhY2stb2JqZWN0cyIgYXZvaWRzIHJlLWRlbHRpZmljYXRpb24gY29zdCBieSBjYWNoaW5nCisgICAgc21hbGwgZW5vdWdoIGRlbHRhIHJlc3VsdHMgaXQgY3JlYXRlcyB3aGlsZSBsb29raW5nIGZvciB0aGUKKyAgICBiZXN0IGRlbHRhIGNhbmRpZGF0ZXMuCisKKyAgLSAiZ2l0IHBhY2stb2JqZWN0cyIgbGVhcm5lZCBhIG5ldyBoZXVyaXN0Y3MgdG8gcHJlZmVyIGRlbHRhCisgICAgdGhhdCBpcyBzaGFsbG93ZXIgaW4gZGVwdGggb3ZlciB0aGUgc21hbGxlc3QgZGVsdGEKKyAgICBwb3NzaWJsZS4gIFRoaXMgaW1wcm92ZXMgYm90aCBvdmVyYWxsIHBhY2tmaWxlIGFjY2VzcworICAgIHBlcmZvcm1hbmNlIGFuZCBwYWNrZmlsZSBkZW5zaXR5LgorCisgIC0gZGlmZi1kZWx0YSBjb2RlIHRoYXQgaXMgdXNlZCBmb3IgcGFja2luZyBoYXMgYmVlbiBpbXByb3ZlZAorICAgIHRvIHdvcmsgYmV0dGVyIG9uIGJpZyBmaWxlcy4KKworICAtIHdoZW4gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgcGFjayBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSwKKyAgICB0aGUgcnVudGltZSB1c2VkIHRvIHRyeSBmaW5kaW5nIGFuIG9iamVjdCBhbHdheXMgZnJvbSB0aGUKKyAgICBuZXdlc3QgcGFja2ZpbGU7IGl0IG5vdyB0cmllcyB0aGUgc2FtZSBwYWNrZmlsZSBhcyB3ZSBmb3VuZAorICAgIHRoZSBvYmplY3QgcmVxdWVzdGVkIHRoZSBsYXN0IHRpbWUsIHdoaWNoIGV4cGxvaXRzIHRoZQorICAgIGxvY2FsaXR5IG9mIHJlZmVyZW5jZXMuCisKKyAgLSB2ZXJpZnlpbmcgcGFjayBjb250ZW50cyBkb25lIGJ5ICJnaXQgZnNjayAtLWZ1bGwiIGdvdCBib29zdAorICAgIGJ5IGNhcmVmdWxseSBjaG9vc2luZyB0aGUgb3JkZXIgdG8gdmVyaWZ5IG9iamVjdHMgaW4gdGhlbS4KKworICAtICJnaXQgcmVhZC10cmVlIC1tIiB0byByZWFkIGludG8gYW4gYWxyZWFkeSBwb3B1bGF0ZWQgaW5kZXgKKyAgICBoYXMgYmVlbiBvcHRpbWl6ZWQgdmFzdGx5LiAgVGhlIGVmZmVjdCBvZiB0aGlzIGNhbiBiZSBzZWVuCisgICAgd2hlbiBzd2l0Y2hpbmcgYnJhbmNoZXMgdGhhdCBoYXZlIGRpZmZlcmVuY2VzIGluIG9ubHkgYQorICAgIGhhbmRmdWwgcGF0aHMuCisKKyAgLSAiZ2l0IGFkZCBwYXRocy4uLiIgYW5kICJnaXQgY29tbWl0IHBhdGhzLi4uIiBoYXMgYWxzbyBiZWVuCisgICAgaGVhdmlseSBvcHRpbWl6ZWQuCisKK0ZpeGVzIHNpbmNlIHYxLjUuMgorLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FsbCBvZiB0aGUgZml4ZXMgaW4gdjEuNS4yIG1haW50ZW5hbmNlIHNlcmllcyBhcmUgaW5jbHVkZWQgaW4KK3RoaXMgcmVsZWFzZSwgdW5sZXNzIG90aGVyd2lzZSBub3RlZC4KKworKiBCdWdmaXhlcworCisgIC0gImdpdHdlYiIgaGFkIHRyb3VibGUgaGFuZGxpbmcgbm9uIFVURi04IHRleHQgd2l0aCBvbGRlcgorICAgIEVuY29kZS5wbSBQZXJsIG1vZHVsZS4KKworICAtICJnaXQgc3ZuIiBtaXNwYXJzZWQgdGhlIGRhdGEgZnJvbSB0aGUgY29tbWl0cyBpbiB0aGUgcmVwb3NpdG9yeSB3aGVuCisgICAgdGhlIHVzZXIgaGFkICJjb2xvci5kaWZmID0gdHJ1ZSIgaW4gdGhlIGNvbmZpZ3VyYXRpb24uICBUaGlzIGhhcyBiZWVuCisgICAgZml4ZWQuCisKKyAgLSBUaGVyZSB3YXMgYSBjYXNlIHdoZXJlICJnaXQgc3ZuIGRjb21taXQiIGNsb2JiZXJlZCBjaGFuZ2VzIG1hZGUgb24gdGhlCisgICAgU1ZOIHNpZGUgd2hpbGUgY29tbWl0dGluZyBtdWx0aXBsZSBjaGFuZ2VzLgorCisgIC0gImdpdC13cml0ZS10cmVlIiBoYWQgYSBiYWQgaW50ZXJhY3Rpb24gd2l0aCByYWN5LWdpdCBhdm9pZGFuY2UgYW5kCisgICAgZ2l0YXR0cmlidXRlcyBtZWNoYW5pc21zLgorCisgIC0gImdpdCAtLWJhcmUgY29tbWFuZCIgb3ZlcnJvZGUgZXhpc3RpbmcgR0lUX0RJUiBzZXR0aW5nIGFuZCBhbHdheXMKKyAgICBtYWRlIGl0IHRyZWF0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGFzIEdJVF9ESVIuCisKKyAgLSAiZ2l0IGxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCIgZG9lcyBub3QgY29tcGxhaW4gaWYgeW91IGdpdmUgdGhlCisgICAgc2FtZSBwYXRoIHBhdHRlcm4gdHdpY2UgYnkgbWlzdGFrZS4KKworICAtICJnaXQgaW5pdCIgYXV0b2RldGVjdGVkIGNvcmUuZmlsZW1vZGUgYnV0IG5vdCBjb3JlLnN5bWxpbmtzLCB3aGljaAorICAgIG1hZGUgYSBuZXcgZGlyZWN0b3J5IGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSAiZ2l0IGNsb25lIiBjdW1iZXJzb21lCisgICAgdG8gdXNlIG9uIGZpbGVzeXN0ZW1zIHRoYXQgcmVxdWlyZSB0aGVzZSBjb25maWd1cmF0aW9ucyB0byBiZSBzZXQuCisKKyAgLSAiZ2l0IGxvZyIgZmFtaWx5IG9mIGNvbW1hbmRzIGJlaGF2ZWQgZGlmZmVyZW50bHkgd2hlbiBydW4gYXMgImdpdAorICAgIGxvZyIgKG5vIHBhdGhzcGVjKSBhbmQgYXMgImdpdCBsb2cgLS0iIChhZ2Fpbiwgbm8gcGF0aHNwZWMpLiAgVGhpcworICAgIGluY29uc2lzdGVuY3kgd2FzIGludHJvZHVjZWQgc29tZXdoZXJlIGluIHYxLjMuMCBzZXJpZXMgYnV0IG5vdyBoYXMKKyAgICBiZWVuIGNvcnJlY3RlZC4KKworICAtICJnaXQgcmViYXNlIC1tIiBpbmNvcnJlY3RseSBkaXNwbGF5ZWQgY29tbWl0cyB0aGF0IHdlcmUgc2tpcHBlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjQuMS50eHQgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS40LjEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZTQ0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS40LjEudHh0CkBAIC0wLDAgKzEsMTcgQEAKK0dJVCB2MS41LjQuMSBSZWxlYXNlIE5vdGVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitGaXhlcyBzaW5jZSB2MS41LjQKKy0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiAiZ2l0LWNvbW1pdCAtQyAkdGFnIiB1c2VkIHRvIHdvcmsgYnV0IHJld3JpdGUgaW4gQyBkb25lIGluCisgICAxLjUuNCBicm9rZSBpdC4KKworICogQW4gZW50cnkgaW4gdGhlIC5naXRhdHRyaWJ1dGVzIGZpbGUgdGhhdCBuYW1lcyBhIHBhdHRlcm4gaW4gYQorICAgc3ViZGlyZWN0b3J5IG9mIHRoZSBkaXJlY3RvcnkgaXQgaXMgaW4gZGlkIG5vdCBtYXRjaAorICAgY29ycmVjdGx5IChlLmcuIHBhdHRlcm4gImIvKi5jIiBpbiAiYS8uZ2l0YXR0cmlidXRlcyIgc2hvdWxkCisgICBtYXRjaCAiYS9iL2Zvby5jIiBidXQgaXQgZGlkbid0KS4KKworICogQ3VzdG9taXplZCBjb2xvciBzcGVjaWZpY2F0aW9uIHdhcyBwYXJzZWQgaW5jb3JyZWN0bHkgd2hlbgorICAgbnVtZXJpYyBjb2xvciB2YWx1ZXMgYXJlIHVzZWQuICBUaGlzIHdhcyBmaXhlZCBpbiAxLjUuNC4xLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS40LjIudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuNC4yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWQwZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuNC4yLnR4dApAQCAtMCwwICsxLDQzIEBACitHSVQgdjEuNS40LjIgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZXMgc2luY2UgdjEuNS40CistLS0tLS0tLS0tLS0tLS0tLS0KKworICogVGhlIGNvbmZpZ3VyYXRpb24gcGFyc2VyIHdhcyBub3QgcHJlcGFyZWQgdG8gc2VlIHN0cmluZworICAgdmFsdWVkIHZhcmlhYmxlcyBtaXNzcGVsbGVkIGFzIGJvb2xlYW4gYW5kIHNlZ2ZhdWx0ZWQuCisKKyAqIFRlbXBvcmFyeSBmaWxlcyBsZWZ0IGJlaGluZCBkdWUgdG8gaW50ZXJydXB0ZWQgb2JqZWN0CisgICB0cmFuc2ZlcnMgd2VyZSBub3QgY2xlYW5lZCB1cCB3aXRoICJnaXQgcHJ1bmUiLgorCisgKiAiZ2l0IGNvbmZpZyAtLXVuc2V0IiB3YXMgY29uZnVzZWQgd2hlbiB0aGUgdW5zZXQgdmFyaWFibGVzCisgICB3ZXJlIHNwZWxsZWQgd2l0aCBjb250aW51YXRpb24gbGluZXMgaW4gdGhlIGNvbmZpZyBmaWxlLgorCisgKiBUaGUgbWVyZ2UgbWVzc2FnZSBkZXRlY3Rpb24gaW4gImdpdCBjdnNpbXBvcnQiIGRpZCBub3QgY2F0Y2gKKyAgIGEgbWVzc2FnZSB0aGF0IGJlZ2FuIHdpdGggIk1lcmdlLi4uIi4KKworICogImdpdCBzdGF0dXMiIHN1Z2dlc3RzICJnaXQgcm0gLS1jYWNoZWQiIGZvciB1bnN0YWdpbmcgdGhlCisgICBlYXJsaWVyICJnaXQgYWRkIiBiZWZvcmUgdGhlIGluaXRpYWwgY29tbWl0LgorCisgKiAiZ2l0IHN0YXR1cyIgb3V0cHV0IHdhcyBpbmNvcnJlY3QgZHVyaW5nIGEgcGFydGlhbCBjb21taXQuCisKKyAqICJnaXQgYmlzZWN0IiByZWZ1c2VkIHRvIHN0YXJ0IHdoZW4gdGhlIEhFQUQgd2FzIGRldGFjaGVkLgorCisgKiAiZ2l0IGJpc2VjdCIgYWxsb3dlZCBhIHdpbGRjYXJkIGNoYXJhY3RlciBpbiB0aGUgY29tbWl0CisgICBtZXNzYWdlIGV4cGFuZGVkIHdoaWxlIHdyaXRpbmcgaXRzIGxvZyBmaWxlLgorCisgKiBNYW51YWwgcGFnZXMgd2VyZSBub3QgZm9ybWF0dGVkIGNvcnJlY3RseSB3aXRoIGRvY2Jvb2sgeHNsCisgICAxLjcyOyBhZGRlZCBhIHdvcmthcm91bmQuCisKKyAqICJnaXQtY29tbWl0IC1DICR0YWciIHVzZWQgdG8gd29yayBidXQgcmV3cml0ZSBpbiBDIGRvbmUgaW4KKyAgIDEuNS40IGJyb2tlIGl0LiAgVGhpcyB3YXMgZml4ZWQgaW4gMS41LjQuMS4KKworICogQW4gZW50cnkgaW4gdGhlIC5naXRhdHRyaWJ1dGVzIGZpbGUgdGhhdCBuYW1lcyBhIHBhdHRlcm4gaW4gYQorICAgc3ViZGlyZWN0b3J5IG9mIHRoZSBkaXJlY3RvcnkgaXQgaXMgaW4gZGlkIG5vdCBtYXRjaAorICAgY29ycmVjdGx5IChlLmcuIHBhdHRlcm4gImIvKi5jIiBpbiAiYS8uZ2l0YXR0cmlidXRlcyIgc2hvdWxkCisgICBtYXRjaCAiYS9iL2Zvby5jIiBidXQgaXQgZGlkbid0KS4gIFRoaXMgd2FzIGZpeGVkIGluIDEuNS40LjEuCisKKyAqIEN1c3RvbWl6ZWQgY29sb3Igc3BlY2lmaWNhdGlvbiB3YXMgcGFyc2VkIGluY29ycmVjdGx5IHdoZW4KKyAgIG51bWVyaWMgY29sb3IgdmFsdWVzIGFyZSB1c2VkLiAgVGhpcyB3YXMgZml4ZWQgaW4gMS41LjQuMS4KKworICogaHR0cCB0cmFuc3BvcnQgbWlzYmVoYXZlZCB3aGVuIGxpbmtlZCB3aXRoIGN1cmwtZ251dGxzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuNC4zLnR4dCBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjQuMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBmYzY3ZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjQuMy50eHQKQEAgLTAsMCArMSwyNyBAQAorR0lUIHYxLjUuNC4zIFJlbGVhc2UgTm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZpeGVzIHNpbmNlIHYxLjUuNC4yCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiBSUE0gc3BlYyB1c2VkIHRvIHB1bGwgaW4gZXZlcnl0aGluZyB3aXRoICdnaXQnLiAgVGhpcyBoYXMgYmVlbgorICAgY2hhbmdlZCBzbyB0aGF0ICdnaXQnIHBhY2thZ2UgY29udGFpbnMganVzdCB0aGUgY29yZSBwYXJ0cywKKyAgIGFuZCB3ZSBub3cgc3VwcGx5ICdnaXQtYWxsJyBtZXRhcGFja2FnZSB0byBzbHVycCBpbiBldmVyeXRoaW5nLgorICAgVGhpcyBzaG91bGQgbWF0Y2ggZW5kIHVzZXIncyBleHBlY3RhdGlvbiBiZXR0ZXIuCisKKyAqIFdoZW4gc29tZSByZWZzIGZhaWxlZCB0byB1cGRhdGUsIGdpdC1wdXNoIHJlcG9ydGVkICJmYWlsdXJlIgorICAgd2hpY2ggd2FzIHVuY2xlYXIgaWYgc29tZSBvdGhlciByZWZzIHdlcmUgdXBkYXRlZCBvciBhbGwgb2YKKyAgIHRoZW0gZmFpbGVkIGF0b21pY2FsbHkgKHRoZSBhbnN3ZXIgaXMgdGhlIGZvcm1lcikuICBSZXdvcmRlZAorICAgdGhlIG1lc3NhZ2UgdG8gY2xhcmlmeSB0aGlzLgorCisgKiAiZ2l0IGNsb25lIiBmcm9tIGEgcmVwb3NpdG9yeSB3aG9zZSBIRUFEIHdhcyBtaXNjb25maWd1cmVkCisgICBkaWQgbm90IHNldCB1cCB0aGUgcmVtb3RlIHByb3Blcmx5LiAgTm93IGl0IHRyaWVzIHRvIGRvCisgICBiZXR0ZXIuCisKKyAqIFVwZGF0ZWQgZ2l0LXB1c2ggZG9jdW1lbnRhdGlvbiB0byBjbGFyaWZ5IHdoYXQgIm1hdGNoaW5nIgorICAgbWVhbnMsIGluIG9yZGVyIHRvIHJlZHVjZSB1c2VyIGNvbmZ1c2lvbi4KKworICogVXBkYXRlZCBnaXQtYWRkIGRvY3VtZW50YXRpb24gdG8gY2xhcmlmeSAiYWRkIC11IiBvcGVyYXRlcyBpbgorICAgdGhlIGN1cnJlbnQgc3ViZGlyZWN0b3J5IHlvdSBhcmUgaW4sIGp1c3QgbGlrZSBvdGhlciBjb21tYW5kcy4KKworICogZ2l0LWd1aSB1cGRhdGVzIHRvIHdvcmsgb24gT1NYIGFuZCBXaW5kb3dzIGJldHRlci4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjQuNC50eHQgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS40LjQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZmE2ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL1JlbE5vdGVzLTEuNS40LjQudHh0CkBAIC0wLDAgKzEsNjYgQEAKK0dJVCB2MS41LjQuNCBSZWxlYXNlIE5vdGVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitGaXhlcyBzaW5jZSB2MS41LjQuMworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICogQnVpbGRpbmcgYW5kIGluc3RhbGxpbmcgd2l0aCBhbiBvdmVydGlnaHQgdW1hc2sgc3VjaCBhcyAwNzcgbWFkZQorICAgaW5zdGFsbGVkIHRlbXBsYXRlcyB1bnJlYWRhYmxlIGJ5IG90aGVycywgd2hpbGUgdGhlIHJlc3Qgb2YgdGhlIGluc3RhbGwKKyAgIGFyZSBkb25lIGluIGEgd2F5IHRoYXQgaXMgZnJpZW5kbHkgdG8gdW1hc2sgMDIyLgorCisgKiAiZ2l0IGN2c2V4cG9ydGNvbW1pdCAtdyAkY3ZzZGlyIiBtaXNiZWhhdmVkIHdoZW4gR0lUX0RJUiBpcyBzZXQgdG8gYQorICAgcmVsYXRpdmUgZGlyZWN0b3J5LgorCisgKiAiZ2l0IGh0dHAtcHVzaCIgaGFkIGFuIGludmFsaWQgbWVtb3J5IGFjY2VzcyB0aGF0IGNvdWxkIGxlYWQgaXQgdG8KKyAgIHNlZ2ZhdWx0LgorCisgKiBXaGVuICJnaXQgcmViYXNlIC1pIiBnYXZlIGNvbnRyb2wgYmFjayB0byB0aGUgdXNlciBmb3IgYSBjb21taXQgdGhhdCBpcworICAgbWFya2VkIHRvIGJlIGVkaXRlZCwgaXQganVzdCBzYWlkICJtb2RpZnkgaXQgd2l0aCBjb21taXQgLS1hbWVuZCIsCisgICB3aXRob3V0IHNheWluZyB3aGF0IHRvIGRvIHRvIGNvbnRpbnVlIGFmdGVyIG1vZGlmeWluZyBpdC4gIEdpdmUgYW4KKyAgIGV4cGxpY2l0IGluc3RydWN0aW9uIHRvIHJ1biAicmViYXNlIC0tY29udGludWUiIHRvIGJlIG1vcmUgaGVscGZ1bC4KKworICogImdpdCBzZW5kLWVtYWlsIiBpbiAxLjUuNC4zIGlzc3VlZCBhIGJvZ3VzIGVtcHR5IEluLVJlcGx5LVRvOiBoZWFkZXIuCisKKyAqICJnaXQgYmlzZWN0IiBzaG93ZWQgbXlzdGVyaW91cyAid29uJ3QgYmlzZWN0IG9uIHNlZWtlZCB0cmVlIiBlcnJvciBtZXNzYWdlLgorICAgVGhpcyB3YXMgbGVmdG92ZXIgZnJvbSBDb2dpdG8gZGF5cyB0byBwcmV2ZW50ICJiaXNlY3QiIHN0YXJ0aW5nIGZyb20gYQorICAgY2ctc2Vla2VkIHN0YXRlLiAgV2Ugc3RpbGwga2VlcCB0aGUgQ29naXRvIHNhZmV0eSwgYnV0IHJ1bm5pbmcgImdpdCBiaXNlY3QKKyAgIHN0YXJ0IiB3aGVuIGFub3RoZXIgYmlzZWN0IHdhcyBpbiBlZmZlY3Qgd2lsbCBjbGVhbiB1cCBhbmQgc3RhcnQgb3Zlci4KKworICogImdpdCBwdXNoIiB3aXRoIGFuIGV4cGxpY2l0IFBBVEggdG8gcmVjZWl2ZS1wYWNrIGRpZCBub3QgcXVpdGUgd29yayBpZgorICAgcmVjZWl2ZS1wYWNrIHdhcyBub3Qgb24gdXN1YWwgUEFUSC4gIFdlIGVhcmxpZXIgZml4ZWQgdGhlIHNhbWUgaXNzdWUKKyAgIHdpdGggImdpdCBmZXRjaCIgYW5kIHVwbG9hZC1wYWNrLCBidXQgc29tZWhvdyBmb3Jnb3QgdG8gZG8gc28gaW4gdGhlCisgICBvdGhlciBkaXJlY3Rpb24uCisKKyAqIGdpdC1ndWkncyBpbmZvIGRpYWxvZyB3YXMgbm90IGRpc3BsYXllZCBjb3JyZWN0bHkgd2hlbiB0aGUgdXNlciB0cmllcworICAgdG8gY29tbWl0IG5vdGhpbmcgKGkuZS4gd2l0aG91dCBzdGFnaW5nIGFueXRoaW5nKS4KKworICogImdpdCByZXZlcnQiIGRpZCBub3QgcHJvcGVybHkgZmFpbCB3aGVuIGF0dGVtcHRpbmcgdG8gcnVuIHdpdGggYQorICAgZGlydHkgaW5kZXguCisKKyAqICJnaXQgbWVyZ2UgLS1uby1jb21taXQgLS1uby1mZiA8b3RoZXI+IiBpbmNvcnJlY3RseSBtYWRlIGNvbW1pdHMuCisKKyAqICJnaXQgbWVyZ2UgLS1zcXVhc2ggLS1uby1mZiA8b3RoZXI+Iiwgd2hpY2ggaXMgYSBub25zZW5zZSBjb21iaW5hdGlvbgorICAgb2Ygb3B0aW9ucywgd2FzIG5vdCByZWplY3RlZC4KKworICogImdpdCBscy1yZW1vdGUiIGFuZCAiZ2l0IHJlbW90ZSBzaG93IiBhZ2FpbnN0IGFuIGVtcHR5IHJlcG9zaXRvcnkKKyAgIGZhaWxlZCwgaW5zdGVhZCBvZiBqdXN0IGdpdmluZyBhbiBlbXB0eSByZXN1bHQgKHJlZ3Jlc3Npb24pLgorCisgKiAiZ2l0IGZhc3QtaW1wb3J0IiBkaWQgbm90IGhhbmRsZSBhIHJlbmFtZWQgcGF0aCB3aG9zZSBuYW1lIG5lZWRzIHRvIGJlCisgICBxdW90ZWQsIGR1ZSB0byBhIGJ1ZyBpbiB1bnF1b3RlX2Nfc3R5bGUoKSBmdW5jdGlvbi4KKworICogImdpdCBjdnNleHBvcnRjb21taXQiIHdhcyBjb25mdXNlZCB3aGVuIG11bHRpcGxlIGZpbGVzIHdpdGggdGhlIHNhbWUKKyAgIGJhc2VuYW1lIG5lZWRlZCB0byBiZSBwdXNoZWQgb3V0IGluIHRoZSBzYW1lIGNvbW1pdC4KKworICogImdpdCBkYWVtb24iIGRpZCBub3Qgc2VuZCBlYXJseSBlcnJvcnMgdG8gc3lzbG9nLgorCisgKiAiZ2l0IGxvZyAtLW1lcmdlIiBkaWQgbm90IHdvcmsgd2VsbCB3aXRoIC0tbGVmdC1yaWdodCBvcHRpb24uCisKKyAqICJnaXQgc3ZuIiBwcm9tcHJ0ZWQgZm9yIGNsaWVudCBjZXJ0IHBhc3N3b3JkIGV2ZXJ5IHRpbWUgaXQgYWNjZXNzZWQgdGhlCisgICBzZXJ2ZXIuCisKKyAqIFRoZSByZXNldCBjb21tYW5kIGluICJnaXQgZmFzdC1pbXBvcnQiIGRhdGEgc3RyZWFtIHdhcyBkb2N1bWVudGVkIHRvCisgICBlbmQgd2l0aCBhbiBvcHRpb25hbCBMRiwgYnV0IGl0IGFjdHVhbGx5IHJlcXVpcmVkIG9uZS4KKworICogImdpdCBzdm4gZGNvbW1pdC9yZWJhc2UiIGRpZCBub3QgaG9ub3IgLS1yZXdyaXRlLXJvb3Qgb3B0aW9uLgorCitBbHNvIGluY2x1ZGVkIGFyZSBhIGhhbmRmdWwgZG9jdW1lbnRhdGlvbiB1cGRhdGVzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuNC41LnR4dCBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjQuNS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI4MjM0MQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjQuNS50eHQKQEAgLTAsMCArMSw1NiBAQAorR0lUIHYxLjUuNC41IFJlbGVhc2UgTm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZpeGVzIHNpbmNlIHYxLjUuNC40CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiAiZ2l0IGZldGNoIHRoZXJlIiB3aGVuIHRoZSBVUkwgaW5mb3JtYXRpb24gY2FtZSBmcm9tIHRoZSBDb2dpdG8gc3R5bGUKKyAgIGJyYW5jaGVzL3RoZXJlIGZpbGUgZGlkIG5vdCB1cGRhdGUgcmVmcy9oZWFkcy90aGVyZSAocmVncmVzc2lvbiBpbgorICAgMS41LjQpLgorCisgKiBCb2d1cyByZWZzcGVjIGNvbmZpZ3VyYXRpb24gc3VjaCBhcyAicmVtb3RlLnRoZXJlLmZldGNoID0gPSIgd2VyZSBub3QKKyAgIGRldGVjdGVkIGFzIGVycm9ycyAocmVncmVzc2lvbmluIDEuNS40KS4KKworICogWW91IGNvdWxkbid0IHNwZWNpZnkgYSBjdXN0b20gZWRpdG9yIHdob3NlIHBhdGggY29udGFpbnMgYSB3aGl0ZXNwYWNlCisgICB2aWEgR0lUX0VESVRPUiAoYW5kIGNvcmUuZWRpdG9yKS4KKworICogVGhlIHN1YmRpcmVjdG9yeSBmaWx0ZXIgdG8gImdpdCBmaWx0ZXItYnJhbmNoIiBtaXNoYW5kbGVkIGEgaGlzdG9yeQorICAgd2hlcmUgdGhlIHN1YmRpcmVjdG9yeSBiZWNvbWVzIGVtcHR5IGFuZCB0aGVuIGxhdGVyIGJlY29tZXMgbm9uLWVtcHR5LgorCisgKiAiZ2l0IHNob3J0bG9nIiBnYXZlIGFuIGVtcHR5IGxpbmUgaWYgdGhlIG9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIHdhcworICAgbWFsZm9ybWVkIChlLmcuIGEgYm90Y2hlZCBpbXBvcnQgZnJvbSBmb3JlaWduIFNDTSkuICBOb3cgaXQgZmluZHMgdGhlCisgICBmaXJzdCBub24tZW1wdHkgbGluZSBhbmQgdXNlcyBpdCBmb3IgYmV0dGVyIGluZm9ybWF0aW9uLgorCisgKiBXaGVuIHRoZSB1c2VyIGZhaWxzIHRvIGdpdmUgYSByZXZpc2lvbiBwYXJhbWV0ZXIgdG8gImdpdCBzdm4iLCBhbiBlcnJvcgorICAgZnJvbSB0aGUgUGVybCBpbnRlcnByZXRlciB3YXMgaXNzdWVkIGJlY2F1c2UgdGhlIHNjcmlwdCBsYWNrZWQgcHJvcGVyCisgICBlcnJvciBjaGVja2luZy4KKworICogQWZ0ZXIgImdpdCByZWJhc2UiIHN0b3BwZWQgZHVlIHRvIGNvbmZsaWN0cywgaWYgdGhlIHVzZXIgcGxheWVkIHdpdGgKKyAgICJnaXQgcmVzZXQiIGFuZCBmcmllbmRzLCAiZ2l0IHJlYmFzZSAtLWFib3J0IiBmYWlsZWQgdG8gZ28gYmFjayB0byB0aGUKKyAgIGNvcnJlY3QgY29tbWl0LgorCisgKiBBZGRpdGlvbmFsIHdvcmsgdHJlZXMgcHJlcGFyZWQgd2l0aCBnaXQtbmV3LXdvcmtkaXIgKGluIGNvbnRyaWIvKSBkaWQKKyAgIG5vdCBzaGFyZSBnaXQtc3ZuIG1ldGFkYXRhIGRpcmVjdG9yeSAuZ2l0L3N2biB3aXRoIHRoZSBvcmlnaW5hbC4KKworICogImdpdC1tZXJnZS1yZWN1cnNpdmUiIGRpZCBub3QgbWFyayBhZGRpdGlvbiBvZiB0aGUgc2FtZSBwYXRoIHdpdGgKKyAgIGRpZmZlcmVudCBmaWxlbW9kZXMgY29ycmVjdGx5IGFzIGEgY29uZmxpY3QuCisKKyAqICJnaXR3ZWIiIGdhdmUgbWFsZm9ybWVkIFVSTCB3aGVuIHBhdGhpbmZvIHN0eXBlIHBhdGhzIGFyZSBpbiB1c2UuCisKKyAqICItbiIgc3RhbmRzIGZvciAiLS1uby10YWdzIiBhZ2FpbiBmb3IgImdpdCBmZXRjaCIuCisKKyAqICJnaXQgZm9ybWF0LXBhdGNoIiBkaWQgbm90IGRldGVjdCB0aGUgbmVlZCB0byBhZGQgOC1iaXQgTUlNRSBoZWFkZXIKKyAgIHdoZW4gdGhlIHVzZXIgdXNlZCBmb3JtYXQuaGVhZGVyIGNvbmZpZ3VyYXRpb24uCisKKyAqICJyZXZ+IiByZXZpc2lvbiBzcGVjaWZpZXIgdXNlZCB0byBtZWFuICJyZXYiLCB3aGljaCB3YXMgaW5jb25zaXN0ZW50CisgICB3aXRoIGhvdyAicmV2XiIgd29ya2VkLiAgTm93ICJyZXZ+IiBpcyB0aGUgc2FtZSBhcyAicmV2fjEiIChoZW5jZSBpdAorICAgYWxzbyBpcyB0aGUgc2FtZSBhcyAicmV2XjEiKSwgYW5kICJyZXZ+MCIgaXMgdGhlIHNhbWUgYXMgInJldl4wIgorICAgKGkuZS4gaXQgaGFzIHRvIGJlIGEgY29tbWl0KS4KKworICogImdpdCBxdWlsdGltcG9ydCIgZGlkIG5vdCBncm9rIGVtcHR5IGxpbmVzLCBsaW5lcyBpbiAiZmlsZSAtcE5OTiIKKyAgIGZvcm1hdCB0byBzcGVjaWZ5IHRoZSBwcmVmaXggbGV2ZWxzIGFuZCBsaW5lcyB3aXRoIHRyYWlsaW5nIGNvbW1lbnRzLgorCisgKiAiZ2l0IHJlYmFzZSAtbSIgdHJpZ2dlcmVkIHByZS1jb21taXQgdmVyaWZpY2F0aW9uLCB3aGljaCBtYWRlCisgICAicmViYXNlIC0tY29udGludWUiIGltcG9zc2libGUuCisKK0FzIHVzdWFsLCBpdCBhbHNvIGNvbWVzIHdpdGggbWFueSBkb2N1bWVudGF0aW9uIGZpeGVzIGFuZCBjbGFyaWZpY2F0aW9ucy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjQudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuNC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzMjNiNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjQudHh0CkBAIC0wLDAgKzEsMzc3IEBACitHSVQgdjEuNS40IFJlbGVhc2UgTm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PQorCitSZW1vdmFsCistLS0tLS0tCisKKyAqICJnaXQgc3ZuaW1wb3J0IiB3YXMgcmVtb3ZlZCBpbiBmYXZvciBvZiAiZ2l0IHN2biIuICBJdCBpcyBzdGlsbCB0aGVyZQorICAgaW4gdGhlIHNvdXJjZSB0cmVlIChjb250cmliL2V4YW1wbGVzKSBidXQgdW5zdXBwb3J0ZWQuCisKKyAqIEFzIGdpdC1jb21taXQgYW5kIGdpdC1zdGF0dXMgaGF2ZSBiZWVuIHJld3JpdHRlbiwgImdpdCBydW5zdGF0dXMiCisgICBoZWxwZXIgc2NyaXB0IGxvc3QgYWxsIGl0cyB1c2VycyBhbmQgaGFzIGJlZW4gcmVtb3ZlZC4KKworCitUZW1wb3JhcmlseSBkaXNhYmxlZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICogImdpdCBodHRwLXB1c2giIGlzIGtub3duIG5vdCB0byB3b3JrIHdlbGwgd2l0aCBjVVJMIGxpYnJhcnkgb2xkZXIKKyAgIHRoYW4gNy4xNiwgYW5kIHdlIGhhZCByZXBvcnRzIG9mIHJlcG9zaXRvcnkgY29ycnVwdGlvbi4gIEl0IGlzCisgICBkaXNhYmxlZCBvbiBzdWNoIHBsYXRmb3JtcyBmb3Igbm93LiAgVW5mb3J0dW5hdGVseSwgMS41LjMuOCBzaGFyZXMKKyAgIHRoZSBzYW1lIGlzc3VlLiAgSW4gb3RoZXIgd29yZHMsIHRoaXMgZG9lcyBub3QgbWVhbiB5b3Ugd2lsbCBiZQorICAgZmluZSBpZiB5b3Ugc3RpY2sgdG8gYW4gb2xkZXIgZ2l0IHJlbGVhc2UuICBGb3Igbm93LCBwbGVhc2UgZG8gbm90CisgICB1c2UgaHR0cC1wdXNoIGZyb20gb2xkZXIgZ2l0IHdpdGggY1VSTCBvbGRlciB0aGFuIDcuMTYgaWYgeW91CisgICB2YWx1ZSB5b3VyIGRhdGEuIEEgcHJvcGVyIGZpeCB3aWxsIGhvcGVmdWxseSBtYXRlcmlhbGl6ZSBpbgorICAgbGF0ZXIgdmVyc2lvbnMuCisKKworRGVwcmVjYXRpb24gbm90aWNlcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiBGcm9tIHYxLjYuMCwgZ2l0IHdpbGwgYnkgZGVmYXVsdCBpbnN0YWxsIGRhc2hlZCBmb3JtIG9mIGNvbW1hbmRzCisgICAoZS5nLiAiZ2l0LWNvbW1pdCIpIG91dHNpZGUgb2YgdXNlcnMnIG5vcm1hbCAkUEFUSCwgYW5kIHdpbGwgaW5zdGFsbAorICAgb25seSBzZWxlY3RlZCBjb21tYW5kcyAoImdpdCIgaXRzZWxmLCBhbmQgImdpdGsiKSBpbiAkUEFUSC4gIFRoaXMKKyAgIGltcGxpZXM6CisKKyAgIC0gVXNpbmcgZGFzaGVkIGZvcm1zIG9mIGdpdCBjb21tYW5kcyAoZS5nLiAiZ2l0LWNvbW1pdCIpIGZyb20gdGhlCisgICAgIGNvbW1hbmQgbGluZSBoYXMgYmVlbiBpbmZvcm1hbGx5IGRlcHJlY2F0ZWQgc2luY2UgZWFybHkgMjAwNiwgYnV0CisgICAgIG5vdyBpdCBvZmZpY2lhbGx5IGlzLCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuICBVc2UKKyAgICAgZGFzaC1sZXNzIGZvcm1zIChlLmcuICJnaXQgY29tbWl0IikgaW5zdGVhZC4KKworICAgLSBVc2luZyBkYXNoZWQgZm9ybXMgZnJvbSB5b3VyIHNjcmlwdHMsIHdpdGhvdXQgZmlyc3QgcHJlcGVuZGluZyB0aGUKKyAgICAgcmV0dXJuIHZhbHVlIGZyb20gImdpdCAtLWV4ZWMtcGF0aCIgdG8gdGhlIHNjcmlwdHMnIFBBVEgsIGhhcyBiZWVuCisgICAgIGluZm9ybWFsbHkgZGVwcmVjYXRlZCBzaW5jZSBlYXJseSAyMDA2LCBidXQgbm93IGl0IG9mZmljaWFsbHkgaXMuCisKKyAgIC0gVXNlIG9mIGRhc2hlZCBmb3JtcyB3aXRoICJQQVRIPSQoZ2l0IC0tZXhlYy1wYXRoKTokUEFUSDsgZXhwb3J0CisgICAgIFBBVEgiIGVhcmx5IGluIHlvdXIgc2NyaXB0IGlzIG5vdCBkZXByZWNhdGVkIHdpdGggdGhpcyBjaGFuZ2UuCisKKyAgIFVzZXJzIGFyZSBzdHJvbmdseSBlbmNvdXJhZ2VkIHRvIGFkanVzdCB0aGVpciBoYWJpdHMgYW5kIHNjcmlwdHMgbm93CisgICB0byBwcmVwYXJlIGZvciB0aGlzIGNoYW5nZS4KKworICogVGhlIHBvc3QtcmVjZWl2ZSBob29rIHdhcyBpbnRyb2R1Y2VkIGluIE1hcmNoIDIwMDcgdG8gc3VwZXJzZWRlCisgICB0aGUgcG9zdC11cGRhdGUgaG9vaywgcHJpbWFyaWx5IHRvIG92ZXJjb21lIHRoZSBjb21tYW5kIGxpbmUgbGVuZ3RoCisgICBsaW1pdGF0aW9uIG9mIHRoZSBsYXR0ZXIuICBVc2Ugb2YgcG9zdC11cGRhdGUgaG9vayB3aWxsIGJlIGRlcHJlY2F0ZWQKKyAgIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBnaXQsIHN0YXJ0aW5nIGZyb20gdjEuNi4wLgorCisgKiAiZ2l0IGxvc3QtZm91bmQiIHdhcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mICJnaXQgZnNjayIncyAtLWxvc3QtZm91bmQKKyAgIG9wdGlvbiwgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgorCisgKiAiZ2l0IHBlZWstcmVtb3RlIiBpcyBkZXByZWNhdGVkLCBhcyAiZ2l0IGxzLXJlbW90ZSIgd2FzIHdyaXR0ZW4gaW4gQworICAgYW5kIHdvcmtzIGZvciBhbGwgdHJhbnNwb3J0czsgImdpdCBwZWVrLXJlbW90ZSIgd2lsbCBiZSByZW1vdmVkIGluCisgICB0aGUgZnV0dXJlLgorCisgKiAiZ2l0IHJlcG8tY29uZmlnIiB3aGljaCB3YXMgYW4gb2xkIG5hbWUgZm9yICJnaXQgY29uZmlnIiBjb21tYW5kCisgICBoYXMgYmVlbiBzdXBwb3J0ZWQgd2l0aG91dCBiZWluZyBhZHZlcnRpc2VkIGZvciBhIGxvbmcgdGltZS4gIFRoZQorICAgbmV4dCBmZWF0dXJlIHJlbGVhc2Ugd2lsbCByZW1vdmUgaXQuCisKKyAqIEZyb20gdjEuNi4wLCB0aGUgcmVwYWNrLnVzZWRlbHRhYmFzZW9mZnNldCBjb25maWcgb3B0aW9uIHdpbGwgZGVmYXVsdAorICAgdG8gdHJ1ZSwgd2hpY2ggd2lsbCBnaXZlIGRlbnNlciBwYWNrZmlsZXMgKGkuZS4gbW9yZSBlZmZpY2llbnQgc3RvcmFnZSkuCisgICBUaGUgZG93bnNpZGUgaXMgdGhhdCBnaXQgb2xkZXIgdGhhbiB2ZXJzaW9uIDEuNC40IHdpbGwgbm90IGJlIGFibGUKKyAgIHRvIGRpcmVjdGx5IHVzZSBhIHJlcG9zaXRvcnkgcGFja2VkIHVzaW5nIHRoaXMgc2V0dGluZy4KKworICogRnJvbSB2MS42LjAsIHRoZSBwYWNrLmluZGV4dmVyc2lvbiBjb25maWcgb3B0aW9uIHdpbGwgZGVmYXVsdCB0byAyLAorICAgd2hpY2ggaXMgc2xpZ2h0bHkgbW9yZSBlZmZpY2llbnQsIGFuZCBtYWtlcyByZXBhY2tpbmcgbW9yZSBpbW11bmUgdG8KKyAgIGRhdGEgY29ycnVwdGlvbnMuICBHaXQgb2xkZXIgdGhhbiB2ZXJzaW9uIDEuNS4yIG1heSByZXZlcnQgdG8gdmVyc2lvbiAxCisgICBvZiB0aGUgcGFjayBpbmRleCB3aXRoIGEgbWFudWFsICJnaXQgaW5kZXgtcGFjayIgdG8gYmUgYWJsZSB0byBkaXJlY3RseQorICAgYWNjZXNzIGNvcnJlc3BvbmRpbmcgcGFjayBmaWxlcy4KKworCitVcGRhdGVzIHNpbmNlIHYxLjUuMworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICogQ29tZXMgd2l0aCBtdWNoIGltcHJvdmVkIGdpdGssIHdpdGggaTE4bi4KKworICogQ29tZXMgd2l0aCBnaXQtZ3VpIDAuOS4yIHdpdGggaTE4bi4KKworICogZ2l0ayBpcyBub3cgbWVyZ2VkIGFzIGEgc3ViZGlyZWN0b3J5IG9mIGdpdC5naXQgcHJvamVjdCwgaW4KKyAgIHByZXBhcmF0aW9uIGZvciBpdHMgaTE4bi4KKworICogcHJvZ3Jlc3MgZGlzcGxheXMgZnJvbSBtYW55IGNvbW1hbmRzIGFyZSBhIGxvdCBuaWNlciB0byB0aGUgZXllLgorICAgVHJhbnNmZXIgY29tbWFuZHMgc2hvdyB0aHJvdWdocHV0IGRhdGEuCisKKyAqIG1hbnkgY29tbWFuZHMgdGhhdCBwYXkgYXR0ZW50aW9uIHRvIHBlci1kaXJlY3RvcnkgLmdpdGlnbm9yZSBub3cgZG8KKyAgIHNvIGxhemlseSwgd2hpY2ggbWFrZXMgdGhlIHVzdWFsIGNhc2UgZ28gbXVjaCBmYXN0ZXIuCisKKyAqIE91dHB1dCBwcm9jZXNzaW5nIGZvciAnLS1wcmV0dHk9Zm9ybWF0Ojx1c2VyIGZvcm1hdD4nIGhhcyBiZWVuCisgICBvcHRpbWl6ZWQuCisKKyAqIFJlbmFtZSBkZXRlY3Rpb24gb2YgZGlmZiBmYW1pbHkgd2hpbGUgZGV0ZWN0aW5nIGV4YWN0IG1hdGNoZXMgaGFzCisgICBiZWVuIGdyZWF0bHkgb3B0aW1pemVkLgorCisgKiBSZW5hbWUgZGV0ZWN0aW9uIG9mIGRpZmYgZmFtaWx5IHRyaWVzIHRvIG1ha2UgbW9yZSBuYXR1cmFsIGxvb2tpbmcKKyAgIHBhaXJpbmcuICBFYXJsaWVyLCBpZiBtdWx0aXBsZSBpZGVudGljYWwgcmVuYW1lIHNvdXJjZXMgd2VyZQorICAgZm91bmQgaW4gdGhlIHByZWltYWdlLCB0aGUgc291cmNlIHVzZWQgd2FzIHBpY2tlZCBwcmV0dHkgbXVjaCBhdCByYW5kb20uCisKKyAqIFZhbHVlICJ0cnVlIiBmb3IgY29sb3IuZGlmZiBhbmQgY29sb3Iuc3RhdHVzIGNvbmZpZ3VyYXRpb24gdXNlZCB0bworICAgbWVhbiAiYWx3YXlzIiAoZXZlbiB3aGVuIHRoZSBvdXRwdXQgaXMgbm90IGdvaW5nIHRvIGEgdGVybWluYWwpLgorICAgVGhpcyBoYXMgYmVlbiBjb3JyZWN0ZWQgdG8gbWVhbiB0aGUgc2FtZSB0aGluZyBhcyAiYXV0byIuCisKKyAqICJnaXQgZGlmZiIgUG9yY2VsYWluIG5vdyByZXNwZWN0cyBkaWZmLmV4dGVybmFsIGNvbmZpZ3VyYXRpb24sIHdoaWNoCisgICBpcyBhbm90aGVyIHdheSB0byBzcGVjaWZ5IEdJVF9FWFRFUk5BTF9ESUZGLgorCisgKiAiZ2l0IGRpZmYiIGNhbiBiZSB0b2xkIHRvIHVzZSBkaWZmZXJlbnQgcHJlZml4ZXMgb3RoZXIgdGhhbgorICAgImEvIiBhbmQgImIvIiBlLmcuICJnaXQgZGlmZiAtLXNyYy1wcmVmaXg9bC8gLS1kc3QtcHJlZml4PWsvIi4KKworICogImdpdCBkaWZmIiBzb21ldGltZXMgZGlkIG5vdCBxdW90ZSBwYXRocyB3aXRoIGZ1bm55CisgICBjaGFyYWN0ZXJzIHByb3Blcmx5LgorCisgKiAiZ2l0IGxvZyIgKGFuZCBhbnkgcmV2aXNpb24gdHJhdmVyc2FsIGNvbW1hbmRzKSBtaXNiZWhhdmVkCisgICB3aGVuIC0tZGlmZi1maWx0ZXIgaXMgZ2l2ZW4gYnV0IHdhcyBub3QgYXNrZWQgdG8gYWN0dWFsbHkKKyAgIHByb2R1Y2UgZGlmZi4KKworICogSFRUUCBwcm94eSBjYW4gYmUgc3BlY2lmaWVkIHBlciByZW1vdGUgcmVwb3NpdG9yeSB1c2luZworICAgcmVtb3RlLiouaHR0cHByb3h5IGNvbmZpZ3VyYXRpb24sIG9yIGdsb2JhbCBodHRwLnByb3h5IGNvbmZpZ3VyYXRpb24KKyAgIHZhcmlhYmxlLgorCisgKiBWYXJpb3VzIFBlcmZvcmNlIGltcG9ydGVyIHVwZGF0ZXMuCisKKyAqIEV4YW1wbGUgdXBkYXRlIGFuZCBwb3N0LXJlY2VpdmUgaG9va3MgaGF2ZSBiZWVuIGltcHJvdmVkLgorCisgKiBBbnkgY29tbWFuZCB0aGF0IHdhbnRzIHRvIHRha2UgYSBjb21taXQgb2JqZWN0IG5hbWUgY2FuIG5vdyB1c2UKKyAgICI6L3N0cmluZyIgc3ludGF4IHRvIG5hbWUgYSBjb21taXQuCisKKyAqICJnaXQgcmVzZXQiIGlzIG5vdyBidWlsdC1pbiBhbmQgaXRzIG91dHB1dCBjYW4gYmUgc3F1ZWxjaGVkIHdpdGggLXEuCisKKyAqICJnaXQgcmVzZXQgLS1oYXJkIiBkb2VzIG5vdCBtYWtlIGFueSBzZW5zZSBpbiBhIGJhcmUKKyAgIHJlcG9zaXRvcnksIGJ1dCBkaWQgbm90IGVycm9yIG91dDsgZml4ZWQuCisKKyAqICJnaXQgc2VuZC1lbWFpbCIgY2FuIG9wdGlvbmFsbHkgdGFsayBvdmVyIHNzbXRwIGFuZCB1c2UgU01UUC1BVVRILgorCisgKiAiZ2l0IHJlYmFzZSIgbGVhcm5lZCAtLXdoaXRlc3BhY2Ugb3B0aW9uLgorCisgKiBJbiAiZ2l0IHJlYmFzZSIsIHdoZW4geW91IGRlY2lkZSBub3QgdG8gcmVwbGF5IGEgcGFydGljdWxhciBjaGFuZ2UKKyAgIGFmdGVyIHRoZSBjb21tYW5kIHN0b3BwZWQgd2l0aCBhIGNvbmZsaWN0LCB5b3UgY2FuIHNheSAiZ2l0IHJlYmFzZQorICAgLS1za2lwIiB3aXRob3V0IGZpcnN0IHJ1bm5pbmcgImdpdCByZXNldCAtLWhhcmQiLCBhcyB0aGUgY29tbWFuZCBub3cKKyAgIHJ1bnMgaXQgZm9yIHlvdS4KKworICogImdpdCByZWJhc2UgLS1pbnRlcmFjdGl2ZSIgbW9kZSBjYW4gbm93IHdvcmsgb24gZGV0YWNoZWQgSEVBRC4KKworICogT3RoZXIgbWlub3IgdG8gc2VyaW91cyBidWdzIGluICJnaXQgcmViYXNlIC1pIiBoYXZlIGJlZW4gZml4ZWQuCisKKyAqICJnaXQgcmViYXNlIiBub3cgZGV0YWNoZXMgaGVhZCBkdXJpbmcgaXRzIG9wZXJhdGlvbiwgc28gYWZ0ZXIgYQorICAgc3VjY2Vzc2Z1bCAiZ2l0IHJlYmFzZSIgb3BlcmF0aW9uLCB0aGUgcmVmbG9nIGVudHJ5IGJyYW5jaEB7MX0gZm9yCisgICB0aGUgY3VycmVudCBicmFuY2ggcG9pbnRzIGF0IHRoZSBjb21taXQgYmVmb3JlIHRoZSByZWJhc2Ugd2FzCisgICBzdGFydGVkLgorCisgKiAiZ2l0IHJlYmFzZSAtaSIgYWxzbyB0cmlnZ2VycyByZXJlcmUgdG8gaGVscCB5b3VyIHJlcGVhdGVkIG1lcmdlcy4KKworICogImdpdCBtZXJnZSIgY2FuIGNhbGwgdGhlICJwb3N0LW1lcmdlIiBob29rLgorCisgKiAiZ2l0IHBhY2stb2JqZWN0cyIgY2FuIG9wdGlvbmFsbHkgcnVuIGRlbHRpZmljYXRpb24gd2l0aCBtdWx0aXBsZQorICAgdGhyZWFkcy4KKworICogImdpdCBhcmNoaXZlIiBjYW4gb3B0aW9uYWxseSBzdWJzdGl0dXRlIGtleXdvcmRzIGluIGZpbGVzIG1hcmtlZCB3aXRoCisgICBleHBvcnQtc3Vic3QgYXR0cmlidXRlLgorCisgKiAiZ2l0IGNoZXJyeS1waWNrIiBtYWRlIGEgbWlzZ3VpZGVkIGF0dGVtcHQgdG8gcmVwZWF0IHRoZSBvcmlnaW5hbAorICAgY29tbWFuZCBsaW5lIGluIHRoZSBnZW5lcmF0ZWQgbG9nIG1lc3NhZ2UsIHdoZW4gdG9sZCB0byBjaGVycnktcGljayBhCisgICBjb21taXQgYnkgbmFtaW5nIGEgdGFnIHRoYXQgcG9pbnRzIGF0IGl0LiAgSXQgZG9lcyBub3QgYW55bW9yZS4KKworICogImdpdCBmb3ItZWFjaC1yZWYiIGxlYXJuZWQgJSh4eHhkYXRlOjxkYXRlLWZvcm1hdD4pIHN5bnRheCB0byBzaG93IHRoZQorICAgdmFyaW91cyBkYXRlIGZpZWxkcyBpbiBkaWZmZXJlbnQgZm9ybWF0cy4KKworICogImdpdCBnYyAtLWF1dG8iIGlzIGEgbG93LWltcGFjdCB3YXkgdG8gYXV0b21hdGljYWxseSBydW4gYSB2YXJpYW50IG9mCisgICAiZ2l0IHJlcGFjayIgdGhhdCBkb2VzIG5vdCBsb3NlIHVucmVmZXJlbmNlZCBvYmplY3RzIChyZWFkOiBzYWZlcgorICAgdGhhbiB0aGUgdXN1YWwgb25lKSBhZnRlciB0aGUgdXNlciBhY2N1bXVsYXRlcyB0b28gbWFueSBsb29zZQorICAgb2JqZWN0cy4KKworICogImdpdCBjbGVhbiIgaGFzIGJlZW4gcmV3cml0dGVuIGluIEMuCisKKyAqIFlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgc2V0IGNsZWFuLnJlcXVpcmVGb3JjZSB0byAiZmFsc2UiIHRvIGFsbG93CisgICAiZ2l0IGNsZWFuIiB3aXRob3V0IC1mIHRvIGRvIGFueSBkYW1hZ2UgKGxhY2sgb2YgdGhlIGNvbmZpZ3VyYXRpb24KKyAgIHZhcmlhYmxlIHVzZWQgdG8gbWVhbiAiZG8gbm90IHJlcXVpcmUgLWYgb3B0aW9uIHRvIGxvc2UgdW50cmFja2VkCisgICBmaWxlcyIsIGJ1dCB3ZSBub3cgdXNlIHRoZSBzYWZlciBkZWZhdWx0KS4KKworICogVGhlIGtpbmRzIG9mIHdoaXRlc3BhY2UgZXJyb3JzICJnaXQgZGlmZiIgYW5kICJnaXQgYXBwbHkiIG5vdGljZSAoYW5kCisgICBmaXgpIGNhbiBiZSBjb250cm9sbGVkIHZpYSAnY29yZS53aGl0ZXNwYWNlJyBjb25maWd1cmF0aW9uIHZhcmlhYmxlCisgICBhbmQgJ3doaXRlc3BhY2UnIGF0dHJpYnV0ZSBpbiAuZ2l0YXR0cmlidXRlcyBmaWxlLgorCisgKiAiZ2l0IHB1c2giIGxlYXJuZWQgLS1kcnktcnVuIG9wdGlvbiB0byBzaG93IHdoYXQgd291bGQgaGFwcGVuIGlmIGEKKyAgIHB1c2ggaXMgcnVuLgorCisgKiAiZ2l0IHB1c2giIGRvZXMgbm90IHVwZGF0ZSBhIHRyYWNraW5nIHJlZiBvbiB0aGUgbG9jYWwgc2lkZSB3aGVuIHRoZQorICAgcmVtb3RlIHJlZnVzZWQgdG8gdXBkYXRlIHRoZSBjb3JyZXNwb25kaW5nIHJlZi4KKworICogImdpdCBwdXNoIiBsZWFybmVkIC0tbWlycm9yIG9wdGlvbi4gIFRoaXMgaXMgdG8gcHVzaCB0aGUgbG9jYWwgcmVmcworICAgb25lLXRvLW9uZSB0byB0aGUgcmVtb3RlLCBhbmQgZGVsZXRlcyByZWZzIGZyb20gdGhlIHJlbW90ZSB0aGF0IGRvCisgICBub3QgZXhpc3QgYW55bW9yZSBpbiB0aGUgcmVwb3NpdG9yeSBvbiB0aGUgcHVzaGluZyBzaWRlLgorCisgKiAiZ2l0IHB1c2giIGNhbiByZW1vdmUgYSBjb3JydXB0IHJlZiBhdCB0aGUgcmVtb3RlIHNpdGUgd2l0aCB0aGUgdXN1YWwKKyAgICI6cmVmIiByZWZzcGVjLgorCisgKiAiZ2l0IHJlbW90ZSIga25vd3MgLS1taXJyb3IgbW9kZS4gIFRoaXMgaXMgdG8gc2V0IHVwIGNvbmZpZ3VyYXRpb24gdG8KKyAgIHB1c2ggaW50byBhIHJlbW90ZSByZXBvc2l0b3J5IHRvIHN0b3JlIGxvY2FsIGJyYW5jaCBoZWFkcyB0byB0aGUgc2FtZQorICAgYnJhbmNoIG9uIHRoZSByZW1vdGUgc2lkZSwgYW5kIHJlbW92ZSBicmFuY2ggaGVhZHMgbG9jYWxseSByZW1vdmVkCisgICBmcm9tIGxvY2FsIHJlcG9zaXRvcnkgYXQgdGhlIHNhbWUgdGltZS4gIFN1aXRhYmxlIGZvciBwdXNoaW5nIGludG8gYQorICAgYmFjay11cCByZXBvc2l0b3J5LgorCisgKiAiZ2l0IHJlbW90ZSIgbGVhcm5lZCAicm0iIHN1YmNvbW1hbmQuCisKKyAqICJnaXQgY3Zzc2VydmVyIiBjYW4gYmUgcnVuIHZpYSAiZ2l0IHNoZWxsIi4gIEFsc28sICJjdnMiIGlzCisgICByZWNvZ25pemVkIGFzIGEgc3lub255bSBmb3IgImdpdCBjdnNzZXJ2ZXIiLCBzbyB0aGF0IENWUyB1c2VycworICAgY2FuIGJlIHN3aXRjaGVkIHRvIGdpdCBqdXN0IGJ5IGNoYW5naW5nIHRoZWlyIGxvZ2luIHNoZWxsLgorCisgKiAiZ2l0IGN2c3NlcnZlciIgYWN0cyBtb3JlIGxpa2UgcmVjZWl2ZS1wYWNrIGJ5IHJ1bm5pbmcgcG9zdC1yZWNlaXZlCisgICBhbmQgcG9zdC11cGRhdGUgaG9va3MuCisKKyAqICJnaXQgYW0iIGFuZCAiZ2l0IHJlYmFzZSIgYXJlIGZhciBsZXNzIHZlcmJvc2UuCisKKyAqICJnaXQgcHVsbCIgbGVhcm5lZCB0byBwYXNzIC0tW25vLV1mZiBvcHRpb24gdG8gdW5kZXJseWluZyAiZ2l0CisgICBtZXJnZSIuCisKKyAqICJnaXQgcHVsbCAtLXJlYmFzZSIgaXMgYSBkaWZmZXJlbnQgd2F5IHRvIGludGVncmF0ZSB3aGF0IHlvdSBmZXRjaGVkCisgICBpbnRvIHlvdXIgY3VycmVudCBicmFuY2guCisKKyAqICJnaXQgZmFzdC1leHBvcnQiIHByb2R1Y2VzIGRhdGEtc3RyZWFtIHRoYXQgY2FuIGJlIGZlZCB0byBmYXN0LWltcG9ydAorICAgdG8gcmVwcm9kdWNlIHRoZSBoaXN0b3J5IHJlY29yZGVkIGluIGEgZ2l0IHJlcG9zaXRvcnkuCisKKyAqICJnaXQgYWRkIC1pIiB0YWtlcyBwYXRoc3BlY3MgdG8gbGltaXQgdGhlIHNldCBvZiBmaWxlcyB0byB3b3JrIG9uLgorCisgKiAiZ2l0IGFkZCAtcCIgaXMgYSBzaG9ydC1oYW5kIHRvIGdvIGRpcmVjdGx5IHRvIHRoZSBzZWxlY3RpdmUgcGF0Y2gKKyAgIHN1YmNvbW1hbmQgaW4gdGhlIGludGVyYWN0aXZlIGNvbW1hbmQgbG9vcCBhbmQgdG8gZXhpdCB3aGVuIGRvbmUuCisKKyAqICJnaXQgYWRkIC1pIiBVSSBoYXMgYmVlbiBjb2xvcml6ZWQuICBUaGUgaW50ZXJhY3RpdmUgcHJvbXB0CisgICBhbmQgbWVudSBjYW4gYmUgY29sb3JlZCBieSBzZXR0aW5nIGNvbG9yLmludGVyYWN0aXZlCisgICBjb25maWd1cmF0aW9uLiAgVGhlIGRpZmYgb3V0cHV0IChpbmNsdWRpbmcgdGhlIGh1bmsgcGlja2VyKQorICAgYXJlIGNvbG9yZWQgd2l0aCBjb2xvci5kaWZmIGNvbmZpZ3VyYXRpb24uCisKKyAqICJnaXQgY29tbWl0IC0tYWxsb3ctZW1wdHkiIGFsbG93cyB5b3UgdG8gY3JlYXRlIGEgc2luZ2xlLXBhcmVudAorICAgY29tbWl0IHRoYXQgcmVjb3JkcyB0aGUgc2FtZSB0cmVlIGFzIGl0cyBwYXJlbnQsIG92ZXJyaWRpbmcgdGhlIHVzdWFsCisgICBzYWZldHkgdmFsdmUuCisKKyAqICJnaXQgY29tbWl0IC0tYW1lbmQiIGNhbiBhbWVuZCBhIG1lcmdlIHRoYXQgZG9lcyBub3QgY2hhbmdlIHRoZSB0cmVlCisgICBmcm9tIGl0cyBmaXJzdCBwYXJlbnQuCisKKyAqICJnaXQgY29tbWl0IiB1c2VkIHRvIHVuY29uZGl0aW9uYWxseSBzdHJpcCBjb21tZW50IGxpbmVzIHRoYXQKKyAgIGJlZ2FuIHdpdGggJyMnIGFuZCByZW1vdmVkIGV4Y2VzcyBibGFuayBsaW5lcy4gIFRoaXMgYmVoYXZpb3IgaGFzCisgICBiZWVuIG1hZGUgY29uZmlndXJhYmxlLgorCisgKiAiZ2l0IGNvbW1pdCIgaGFzIGJlZW4gcmV3cml0dGVuIGluIEMuCisKKyAqICJnaXQgc3Rhc2ggcmFuZG9tLXRleHQiIGRvZXMgbm90IGNyZWF0ZSBhIG5ldyBzdGFzaCBhbnltb3JlLiAgSXQgd2FzCisgICBhIFVJIG1pc3Rha2UuICBVc2UgImdpdCBzdGFzaCBzYXZlIHJhbmRvbS10ZXh0Iiwgb3IgImdpdCBzdGFzaCIKKyAgICh3aXRob3V0IGV4dHJhIGFyZ3MpIGZvciB0aGF0LgorCisgKiAiZ2l0IHN0YXNoIGNsZWFyIGV4dHJhLXRleHQiIGRvZXMgbm90IGNsZWFyIHRoZSB3aG9sZSBzdGFzaAorICAgYW55bW9yZS4gIEl0IGlzIHRlbXB0aW5nIHRvIGV4cGVjdCAiZ2l0IHN0YXNoIGNsZWFyIHN0YXNoQHsyfSIKKyAgIHRvIGRyb3Agb25seSBhIHNpbmdsZSBuYW1lZCBzdGFzaCBlbnRyeSwgYW5kIGl0IGlzIHJ1ZGUgdG8KKyAgIGRpc2NhcmQgZXZlcnl0aGluZyB3aGVuIHRoYXQgaXMgYXNrZWQgKGJ1dCBub3QgcHJvdmlkZWQpLgorCisgKiAiZ2l0IHBydW5lIC0tZXhwaXJlIDx0aW1lPiIgY2FuIGV4ZW1wdCB5b3VuZyBsb29zZSBvYmplY3RzIGZyb20KKyAgIGdldHRpbmcgcHJ1bmVkLgorCisgKiAiZ2l0IGJyYW5jaCAtLWNvbnRhaW5zIDxjb21taXQ+IiBjYW4gbGlzdCBicmFuY2hlcyB0aGF0IGFyZQorICAgZGVzY2VuZGFudHMgb2YgYSBnaXZlbiBjb21taXQuCisKKyAqICJnaXQgbG9nIiBsZWFybmVkIC0tZWFybHktb3V0cHV0IG9wdGlvbiB0byBoZWxwIGludGVyYWN0aXZlIEdVSQorICAgaW1wbGVtZW50YXRpb25zLgorCisgKiAiZ2l0IGJpc2VjdCIgbGVhcm5lZCAic2tpcCIgYWN0aW9uIHRvIG1hcmsgdW50ZXN0YWJsZSBjb21taXRzLgorCisgKiAiZ2l0IGJpc2VjdCB2aXN1YWxpemUiIGxlYXJuZWQgYSBzaG9ydGVyIHN5bm9ueW0gImdpdCBiaXNlY3QgdmlldyIuCisKKyAqICJnaXQgYmlzZWN0IHZpc3VhbGl6ZSIgcnVucyAiZ2l0IGxvZyIgaW4gYSBub24td2luZG93ZWQKKyAgIGVudmlyb25tZW50cy4gIEl0IGFsc28gY2FuIGJlIHRvbGQgd2hhdCBjb21tYW5kIHRvIHJ1biAoZS5nLiAiZ2l0CisgICBiaXNlY3QgdmlzdWFsaXplIHRpZyIpLgorCisgKiAiZ2l0IGZvcm1hdC1wYXRjaCIgbGVhcm5lZCAiZm9ybWF0Lm51bWJlcmVkIiBjb25maWd1cmF0aW9uIHZhcmlhYmxlCisgICB0byBhdXRvbWF0aWNhbGx5IHR1cm4gLS1udW1iZXJlZCBvcHRpb24gb24gd2hlbiBtb3JlIHRoYW4gb25lIGNvbW1pdHMKKyAgIGFyZSBmb3JtYXR0ZWQuCisKKyAqICJnaXQgbHMtZmlsZXMiIGxlYXJuZWQgIi0tZXhjbHVkZS1zdGFuZGFyZCIgdG8gdXNlIHRoZSBjYW5uZWQgc2V0IG9mCisgICBleGNsdWRlIGZpbGVzLgorCisgKiAiZ2l0IHRhZyAtYSAtZiBleGlzdGluZyIgYmVnaW5zIHRoZSBlZGl0b3Igc2Vzc2lvbiB1c2luZyB0aGUgZXhpc3RpbmcKKyAgIGFubm90YXRpb24gbWVzc2FnZS4KKworICogImdpdCB0YWcgLW0gb25lIC1tIGJhciIgKG11bHRpcGxlIC1tIG9wdGlvbnMpIGJlaGF2ZXMgc2ltaWxhcmx5IHRvCisgICAiZ2l0IGNvbW1pdCI7IHRoZSBwYXJhbWV0ZXJzIHRvIC1tIG9wdGlvbnMgYXJlIGZvcm1hdHRlZCBhcyBzZXBhcmF0ZQorICAgcGFyYWdyYXBocy4KKworICogVGhlIGZvcm1hdCAiZ2l0IHNob3ciIG91dHB1dHMgYW4gYW5ub3RhdGVkIHRhZyBoYXMgYmVlbiB1cGRhdGVkIHRvCisgICBpbmNsdWRlICJUYWdnZXI6ICIgYW5kICJEYXRlOiAiIGxpbmVzIGZyb20gdGhlIHRhZyBpdHNlbGYuICBTdHJpY3RseQorICAgc3BlYWtpbmcgdGhpcyBpcyBhIGJhY2t3YXJkIGluY29tcGF0aWJsZSBjaGFuZ2UsIGJ1dCB0aGlzIGlzIGEKKyAgIHJlYXNvbmFibGUgdXNhYmlsaXR5IGZpeCBhbmQgcGVvcGxlJ3Mgc2NyaXB0cyBzaG91bGRuJ3QgaGF2ZSBiZWVuCisgICByZWx5aW5nIG9uIHRoZSBleGFjdCBvdXRwdXQgZnJvbSAiZ2l0IHNob3ciIFBvcmNlbGFpbiBhbnl3YXkuCisKKyAqICJnaXQgY3ZzaW1wb3J0IiBkaWQgbm90IG5vdGljZSBlcnJvcnMgZnJvbSB1bmRlcmx5aW5nICJjdnNwcyIKKyAgIGFuZCBwcm9kdWNlZCBhIGNvcnJ1cHQgaW1wb3J0IHNpbGVudGx5LgorCisgKiAiZ2l0IGN2c2V4cG9ydGNvbW1pdCIgbGVhcm5lZCAtdyBvcHRpb24gdG8gc3BlY2lmeSBhbmQgc3dpdGNoIHRvIHRoZQorICAgQ1ZTIHdvcmtpbmcgZGlyZWN0b3J5LgorCisgKiAiZ2l0IGNoZWNrb3V0IiBmcm9tIGEgc3ViZGlyZWN0b3J5IGxlYXJuZWQgdG8gdXNlICIuLi9wYXRoIiB0byBhbGxvdworICAgY2hlY2tpbmcgb3V0IGEgcGF0aCBvdXRzaWRlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aXRob3V0IGNkJ2luZyB1cC4KKworICogImdpdCBjaGVja291dCIgZnJvbSBhbmQgdG8gZGV0YWNoZWQgSEVBRCBsZWF2ZXMgYSBiaXQgbW9yZQorICAgaW5mb3JtYXRpb24gaW4gdGhlIHJlZmxvZy4KKworICogImdpdCBzZW5kLWVtYWlsIC0tZHJ5LXJ1biIgc2hvd3MgZnVsbCBoZWFkZXJzIGZvciBlYXNpZXIgZGlhZ25vc2lzLgorCisgKiAiZ2l0IG1lcmdlLW91cnMiIGlzIG5vdyBidWlsdC1pbi4KKworICogImdpdCBzdm4iIGxlYXJuZWQgImluZm8iIGFuZCAic2hvdy1leHRlcm5hbHMiIHN1YmNvbW1hbmRzLgorCisgKiAiZ2l0IHN2biIgcnVuIGZyb20gYSBzdWJkaXJlY3RvcnkgZmFpbGVkIHRvIHJlYWQgc2V0dGluZ3MgZnJvbSB0aGUKKyAgIC5naXQvY29uZmlnLgorCisgKiAiZ2l0IHN2biIgbGVhcm5lZCAtLXVzZS1sb2ctYXV0aG9yIG9wdGlvbiwgd2hpY2ggcGlja3MgdXAgbW9yZQorICAgZGVzY3JpcHRpdmUgbmFtZSBmcm9tIEZyb206IGFuZCBTaWduZWQtb2ZmLWJ5OiBsaW5lcyBpbiB0aGUgY29tbWl0CisgICBtZXNzYWdlLgorCisgKiAiZ2l0IHN2biIgd2FzdGVkIHdheSB0b28gbXVjaCBkaXNrIHRvIHJlY29yZCByZXZpc2lvbiBtYXBwaW5ncworICAgYmV0d2VlbiBzdm4gYW5kIGdpdDsgYSBuZXcgcmVwcmVzZW50YXRpb24gdGhhdCBpcyBtdWNoIG1vcmUgY29tcGFjdAorICAgZm9yIHRoaXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gaW50cm9kdWNlZCB0byBjb3JyZWN0IHRoaXMuCisKKyAqICJnaXQgc3ZuIiBsZWZ0IHRlbXBvcmFyeSBpbmRleCBmaWxlcyBpdCB1c2VkIHdpdGhvdXQgY2xlYW5pbmcgdGhlbQorICAgdXA7IHRoaXMgd2FzIGNvcnJlY3RlZC4KKworICogImdpdCBzdGF0dXMiIGZyb20gYSBzdWJkaXJlY3Rvcnkgbm93IHNob3dzIHJlbGF0aXZlIHBhdGhzLCB3aGljaAorICAgbWFrZXMgY29weS1hbmQtcGFzdGluZyBmb3IgZ2l0LWNoZWNrb3V0L2dpdC1hZGQvZ2l0LXJtIGVhc2llci4gIFRoZQorICAgdHJhZGl0aW9uYWwgYmVoYXZpb3IgdG8gc2hvdyB0aGUgZnVsbCBwYXRoIHJlbGF0aXZlIHRvIHRoZSB0b3Agb2YKKyAgIHRoZSB3b3JrIHRyZWUgY2FuIGJlIGhhZCBieSBzZXR0aW5nIHN0YXR1cy5yZWxhdGl2ZXBhdGhzCisgICBjb25maWd1cmF0aW9uIHZhcmlhYmxlIHRvIGZhbHNlLgorCisgKiAiZ2l0IGJsYW1lIiBrZXB0IHRleHQgZm9yIGVhY2ggYW5ub3RhdGVkIHJldmlzaW9uIGluIGNvcmUgbmVlZGxlc3NseTsKKyAgIHRoaXMgaGFzIGJlZW4gY29ycmVjdGVkLgorCisgKiAiZ2l0IHNob3J0bG9nIiBsZWFybmVkIHRvIGRlZmF1bHQgdG8gSEVBRCB3aGVuIHRoZSBzdGFuZGFyZCBpbnB1dCBpcworICAgYSB0ZXJtaW5hbCBhbmQgdGhlIHVzZXIgZGlkIG5vdCBnaXZlIGFueSByZXZpc2lvbiBwYXJhbWV0ZXIuCisKKyAqICJnaXQgc2hvcnRsb2ciIGxlYXJuZWQgIi1lIiBvcHRpb24gdG8gc2hvdyBlLW1haWwgYWRkcmVzc2VzIGFzIHdlbGwgYXMKKyAgIGF1dGhvcnMnIG5hbWVzLgorCisgKiAiZ2l0IGhlbHAiIGxlYXJuZWQgIi13IiBvcHRpb24gdG8gc2hvdyBkb2N1bWVudGF0aW9uIGluIGJyb3dzZXJzLgorCisgKiBJbiBhZGRpdGlvbiB0aGVyZSBhcmUgcXVpdGUgYSBmZXcgaW50ZXJuYWwgY2xlYW4tdXBzLiBOb3RhYmx5OgorCisgICAtIG1hbnkgZm9yay9leGVjIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIHJ1bi1jb21tYW5kIEFQSSwKKyAgICAgYnJvdWdodCBmcm9tIHRoZSBtc3lzZ2l0IGVmZm9ydC4KKworICAgLSBpbnRyb2R1Y3Rpb24gYW5kIG1vcmUgdXNlIG9mIHRoZSBvcHRpb24gcGFyc2VyIEFQSS4KKworICAgLSBlbmhhbmNlbWVudCBhbmQgbW9yZSB1c2Ugb2YgdGhlIHN0cmJ1ZiBBUEkuCisKKyAqIE1ha2VmaWxlIHR3ZWFrcyB0byBzdXBwb3J0IEhQLVVYIGlzIGluLgorCitGaXhlcyBzaW5jZSB2MS41LjMKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitBbGwgb2YgdGhlIGZpeGVzIGluIHYxLjUuMyBtYWludGVuYW5jZSBzZXJpZXMgYXJlIGluY2x1ZGVkIGluCit0aGlzIHJlbGVhc2UsIHVubGVzcyBvdGhlcndpc2Ugbm90ZWQuCisKK1RoZXNlIGZpeGVzIGFyZSBvbmx5IGluIHYxLjUuNCBhbmQgbm90IGJhY2twb3J0ZWQgdG8gdjEuNS4zIG1haW50ZW5hbmNlCitzZXJpZXMuCisKKyAqIFRoZSB3YXkgImdpdCBkaWZmIC0tY2hlY2siIGJlaGF2ZXMgaXMgbXVjaCBtb3JlIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5CisgICAiZ2l0IGFwcGx5IC0td2hpdGVzcGFjZT13YXJuIiB3b3Jrcy4KKworICogImdpdCBzdm4iIHRhbGtpbmcgd2l0aCB0aGUgU1ZOIG92ZXIgSFRUUCB3aWxsIGNvcnJlY3RseSBxdW90ZSBicmFuY2gKKyAgIGFuZCBwcm9qZWN0IG5hbWVzLgorCisgKiAiZ2l0IGNvbmZpZyIgZGlkIG5vdCB3b3JrIGNvcnJlY3RseSBvbiBwbGF0Zm9ybXMgdGhhdCBkZWZpbmUKKyAgIFJFR19OT01BVENIIHRvIGFuIGV2ZW4gbnVtYmVyLgorCisgKiBSZWNlbnQgdmVyc2lvbnMgb2YgQXNjaWlEb2MgOCBoYXMgYSBjaGFuZ2UgdG8gYnJlYWsgb3VyCisgICBkb2N1bWVudGF0aW9uOyBhIHdvcmthcm91bmQgaGFzIGJlZW4gaW1wbGVtZW50ZWQuCisKKyAqICJnaXQgZGlmZiAtLWNvbG9yLXdvcmRzIiBjb2xvcmVkIGNvbnRleHQgbGluZXMgaW4gYSB3cm9uZyBjb2xvci4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjUudHh0IGIvRG9jdW1lbnRhdGlvbi9SZWxOb3Rlcy0xLjUuNS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhNTJhZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjUudHh0CkBAIC0wLDAgKzEsMjEzIEBACitHSVQgdjEuNS41IFJlbGVhc2UgTm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PQorCitVcGRhdGVzIHNpbmNlIHYxLjUuNAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKHN1YnN5c3RlbXMpCisKKyAqIENvbWVzIHdpdGggZ2l0LWd1aSAwLjEwLjAKKworKHBvcnRhYmlsaXR5KQorCisgKiBXZSBzaG91bGRuJ3QgYXNrIGZvciBCU0QgZ3JvdXAgb3duZXJzaGlwIHNlbWFudGljcyBieSBzZXR0aW5nIGcrcyBiaXQKKyAgIG9uIGRpcmVjdG9yaWVzIG9uIG9sZGVyIEJTRCBzeXN0ZW1zIHRoYXQgcmVmdXNlcyBjaG1vZCgpIGJ5IG5vbiByb290CisgICB1c2Vycy4gIEJTRCBzZW1hbnRpY3MgaXMgdGhlIGRlZmF1bHQgdGhlcmUgYW55d2F5LgorCisgKiBCdW5jaCBvZiBwb3J0YWJpbGl0eSBpbXByb3ZlbWVudCBwYXRjaGVzIGNvbWluZyBmcm9tIGFuIGVmZm9ydCB0byBwb3J0CisgICB0byBTb2xhcmlzIGhhcyBiZWVuIGFwcGxpZWQuCisKKyhwZXJmb3JtYW5jZSkKKworICogT24gcGxhdGZvcm1zIHdpdGggc3Vib3B0aW1hbCBxc29ydCgzKSBpbXBsZW1lbnRhdGlvbiwgdGhlcmUKKyAgIGlzIGFuIG9wdGlvbiB0byB1c2UgbW9yZSByZWFzb25hYmxlIHN1YnN0aXR1dGUgd2Ugc2hpcCB3aXRoCisgICBvdXIgc29mdHdhcmUuCisKKyAqIE5ldyBjb25maWd1cmF0aW9uIHZhcmlhYmxlICJwYWNrLnBhY2tzaXplbGltaXQiIGNhbiBiZSB1c2VkCisgICBpbiBwbGFjZSBvZiBjb21tYW5kIGxpbmUgb3B0aW9uIC0tbWF4LXBhY2stc2l6ZS4KKworICogImdpdCBmZXRjaCIgb3ZlciB0aGUgbmF0aXZlIGdpdCBwcm90b2NvbCB1c2VkIHRvIG1ha2UgYQorICAgY29ubmVjdGlvbiB0byBmaW5kIG91dCB0aGUgc2V0IG9mIGN1cnJlbnQgcmVtb3RlIHJlZnMgYW5kCisgICBhbm90aGVyIHRvIGFjdHVhbGx5IGRvd25sb2FkIHRoZSBwYWNrIGRhdGEuICBXZSBub3cgdXNlIG9ubHkKKyAgIG9uZSBjb25uZWN0aW9uIGZvciB0aGVzZSB0YXNrcy4KKworICogImdpdCBjb21taXQiIGRvZXMgbm90IHJ1biBsc3RhdCgyKSBtb3JlIHRoYW4gbmVjZXNzYXJ5CisgICBhbnltb3JlLgorCisodXNhYmlsaXR5LCBiZWxscyBhbmQgd2hpc3RsZXMpCisKKyAqIEJhc2ggY29tcGxldGlvbiBzY3JpcHQgKGluIGNvbnRyaWIpIGFyZSBhd2FyZSBvZiBtb3JlIGNvbW1hbmRzIGFuZAorICAgb3B0aW9ucy4KKworICogWW91IGNhbiBiZSB3YXJuZWQgd2hlbiBjb3JlLmF1dG9jcmxmIGNvbnZlcnNpb24gaXMgYXBwbGllZCBpbgorICAgc3VjaCBhIHdheSB0aGF0IHJlc3VsdHMgaW4gYW4gaXJyZXZlcnNpYmxlIGNvbnZlcnNpb24uCisKKyAqIEEgY2F0Y2gtYWxsICJjb2xvci51aSIgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBjYW4gYmUgdXNlZCB0bworICAgZW5hYmxlIGNvbG9yaW5nIG9mIGFsbCBjb2xvci1jYXBhYmxlIGNvbW1hbmRzLCBpbnN0ZWFkIG9mCisgICBpbmRpdmlkdWFsIG9uZXMgc3VjaCBhcyAiY29sb3Iuc3RhdHVzIiBhbmQgImNvbG9yLmJyYW5jaCIuCisKKyAqIFRoZSBjb21tYW5kcyByZWZ1c2VkIHRvIHRha2UgYWJzb2x1dGUgcGF0aG5hbWVzIHdoZXJlIHRoZXkKKyAgIHJlcXVpcmUgcGF0aG5hbWVzIHJlbGF0aXZlIHRvIHRoZSB3b3JrIHRyZWUgb3IgdGhlIGN1cnJlbnQKKyAgIHN1YmRpcmVjdG9yeS4gIFRoZXkgbm93IGNhbiB0YWtlIGFic29sdXRlIHBhdGhuYW1lcyBpbiBzdWNoIGEKKyAgIGNhc2UgYXMgbG9uZyBhcyB0aGUgcGF0aG5hbWVzIGRvIG5vdCByZWZlciBvdXRzaWRlIG9mIHRoZQorICAgd29yayB0cmVlLiAgRS5nLiAiZ2l0IGFkZCAkKHB3ZCkvZm9vIiBub3cgd29ya3MuCisKKyAqIEVycm9yIG1lc3NhZ2VzIHVzZWQgdG8gYmUgc2VudCB0byBzdGRlcnIsIG9ubHkgdG8gZ2V0IGhpZGRlbiwKKyAgIHdoZW4gJFBBR0VSIHdhcyBpbiB1c2UuICBUaGV5IG5vdyBhcmUgc2VudCB0byBzdGRvdXQgYWxvbmcKKyAgIHdpdGggdGhlIGNvbW1hbmQgb3V0cHV0IHRvIGJlIHNob3duIGluIHRoZSAkUEFHRVIuCisKKyAqIEEgcGF0dGVybiAiZm9vLyIgaW4gLmdpdGlnbm9yZSBmaWxlIG5vdyBtYXRjaGVzIGEgZGlyZWN0b3J5CisgICAiZm9vIi4gIFBhdHRlcm4gImZvbyIgYWxzbyBtYXRjaGVzIGFzIGJlZm9yZS4KKworICogYmFzaCBjb21wbGV0aW9uJ3MgcHJvbXB0IGhlbHBlciBmdW5jdGlvbiBjYW4gdGFsayBhYm91dAorICAgb3BlcmF0aW9uIGluLXByb2dyZXNzIChlLmcuIG1lcmdlLCByZWJhc2UsIGV0Yy4pLgorCisgKiBDb25maWd1cmF0aW9uIHZhcmlhYmxlcyAidXJsLjx1c2V0aGlzPi5pbnN0ZWFkb2YgPSA8b3RoZXJ1cmw+IiBjYW4gYmUKKyAgIHVzZWQgdG8gdGVsbCAiZ2l0LWZldGNoIiBhbmQgImdpdC1wdXNoIiB0byB1c2UgZGlmZmVyZW50IFVSTCB0aGFuIHdoYXQKKyAgIGlzIGdpdmVuIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KKworICogImdpdCBhZGQgLWkiIGJlaGF2ZXMgYmV0dGVyIGV2ZW4gYmVmb3JlIHlvdSBtYWtlIGFuIGluaXRpYWwgY29tbWl0LgorCisgKiAiZ2l0IGFtIiByZWZ1c2VkIHRvIHJ1biBmcm9tIGEgc3ViZGlyZWN0b3J5IHdpdGhvdXQgYSBnb29kIHJlYXNvbi4KKworICogQWZ0ZXIgImdpdCBhcHBseSAtLXdoaXRlc3BhY2U9Zml4IiBmaXhlcyB3aGl0ZXNwYWNlIGVycm9ycyBpbiBhIHBhdGNoLAorICAgYSBsaW5lIGJlZm9yZSB0aGUgZml4IGNhbiBhcHBlYXIgYXMgYSBjb250ZXh0IG9yIHByZWltYWdlIGxpbmUgaW4gYQorICAgbGF0ZXIgcGF0Y2gsIGNhdXNpbmcgdGhlIHBhdGNoIG5vdCB0byBhcHBseS4gIFRoZSBjb21tYW5kIG5vdyBrbm93cyB0bworICAgc2VlIHRocm91Z2ggd2hpdGVzcGFjZSBmaXhlcyBkb25lIHRvIGNvbnRleHQgbGluZXMgdG8gc3VjY2Vzc2Z1bGx5CisgICBhcHBseSBzdWNoIGEgcGF0Y2ggc2VyaWVzLgorCisgKiAiZ2l0IGJyYW5jaCIgKGFuZCAiZ2l0IGNoZWNrb3V0IC1iIikgdG8gYnJhbmNoIGZyb20gYSBsb2NhbCBicmFuY2ggY2FuCisgICBvcHRpb25hbGx5IHNldCAiYnJhbmNoLjxuYW1lPi5tZXJnZSIgdG8gbWFyayB0aGUgbmV3IGJyYW5jaCB0byBidWlsZCBvbgorICAgdGhlIG90aGVyIGxvY2FsIGJyYW5jaCwgd2hlbiAiYnJhbmNoLmF1dG9zZXR1cG1lcmdlIiBpcyBzZXQgdG8KKyAgICJhbHdheXMiLCBvciB3aGVuIHBhc3NpbmcgdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gIi0tdHJhY2siICh0aGlzIG9wdGlvbgorICAgd2FzIGlnbm9yZWQgd2hlbiBicmFuY2hpbmcgZnJvbSBsb2NhbCBicmFuY2hlcykuICBCeSBkZWZhdWx0LCB0aGlzIGRvZXMKKyAgIG5vdCBoYXBwZW4gd2hlbiBicmFuY2hpbmcgZnJvbSBhIGxvY2FsIGJyYW5jaC4KKworICogImdpdCBjaGVja291dCIgdG8gc3dpdGNoIHRvIGEgYnJhbmNoIHRoYXQgaGFzICJicmFuY2guPG5hbWU+Lm1lcmdlIiBzZXQKKyAgIChpLmUuIG1hcmtlZCB0byBidWlsZCBvbiBhbm90aGVyIGJyYW5jaCkgcmVwb3J0cyBob3cgbXVjaCB0aGUgYnJhbmNoCisgICBhbmQgdGhlIG90aGVyIGJyYW5jaCBkaXZlcmdlZC4KKworICogV2hlbiAiZ2l0IGNoZWNrb3V0IiBoYXMgdG8gdXBkYXRlIGEgbG90IG9mIHBhdGhzLCBpdCB1c2VkIHRvIGJlIHNpbGVudAorICAgZm9yIDQgc2Vjb25kcyBiZWZvcmUgaXQgc2hvd2VkIGFueSBwcm9ncmVzcyByZXBvcnQuICBJdCBpcyBub3cgYSBiaXQKKyAgIG1vcmUgaW1wYXRpZW50IGFuZCBzdGFydHMgc2hvd2luZyBwcm9ncmVzcyByZXBvcnQgZWFybHkuCisKKyAqICJnaXQgY29tbWl0IiBsZWFybmVkIGEgbmV3IGhvb2sgInByZXBhcmUtY29tbWl0LW1zZyIgdGhhdCBjYW4KKyAgIGluc3BlY3Qgd2hhdCBpcyBnb2luZyB0byBiZSBjb21taXR0ZWQgYW5kIHByZXBhcmUgdGhlIGNvbW1pdAorICAgbG9nIG1lc3NhZ2UgdGVtcGxhdGUgdG8gYmUgZWRpdGVkLgorCisgKiAiZ2l0IGN2c2ltcG9ydCIgY2FuIG5vdyB0YWtlIG1vcmUgdGhhbiBvbmUgLU0gb3B0aW9ucy4KKworICogImdpdCBkZXNjcmliZSIgbGVhcm5lZCB0byBsaW1pdCB0aGUgdGFncyB0byBiZSB1c2VkIGZvcgorICAgbmFtaW5nIHdpdGggLS1tYXRjaCBvcHRpb24uCisKKyAqICJnaXQgZGVzY3JpYmUgLS1jb250YWlucyIgbm93IGJhcmZzIHdoZW4gdGhlIG5hbWVkIGNvbW1pdAorICAgY2Fubm90IGJlIGRlc2NyaWJlZC4KKworICogImdpdCBkZXNjcmliZSAtLWV4YWN0LW1hdGNoIiBkZXNjcmliZXMgb25seSBjb21taXRzIHRoYXQgYXJlIHRhZ2dlZC4KKworICogImdpdCBkZXNjcmliZSAtLWxvbmciIGRlc2NyaWJlcyBhIHRhZ2dlZCBjb21taXQgYXMgJHRhZy0wLSRzaGExLAorICAgaW5zdGVhZCBvZiBqdXN0IHNob3dpbmcgdGhlIGV4YWN0IHRhZ25hbWUuCisKKyAqICJnaXQgZGVzY3JpYmUiIHdhcm5zIHdoZW4gdXNpbmcgYSB0YWcgd2hvc2UgbmFtZSBhbmQgcGF0aCBjb250cmFkaWN0CisgICB3aXRoIGVhY2ggb3RoZXIuCisKKyAqICJnaXQgZGlmZiIgbGVhcm5lZCAiLS1yZWxhdGl2ZSIgb3B0aW9uIHRvIGxpbWl0IGFuZCBvdXRwdXQgcGF0aHMKKyAgIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGVuIHdvcmtpbmcgaW4gYSBzdWJkaXJlY3RvcnkuCisKKyAqICJnaXQgZGlmZiIgbGVhcm5lZCAiLS1kaXJzdGF0IiBvcHRpb24gdG8gc2hvdyBiaXJkcy1leWUtc3VtbWFyeSBvZgorICAgY2hhbmdlcyBtb3JlIGNvbmNpc2VseSB0aGFuICItLWRpZmZzdGF0Ii4KKworICogImdpdCBmb3JtYXQtcGF0Y2giIGxlYXJuZWQgLS1jb3Zlci1sZXR0ZXIgb3B0aW9uIHRvIGdlbmVyYXRlIGEgY292ZXIKKyAgIGxldHRlciB0ZW1wbGF0ZS4KKworICogImdpdCBnYyIgbGVhcm5lZCAtLXF1aWV0IG9wdGlvbi4KKworICogImdpdCBnYyIgbm93IGF1dG9tYXRpY2FsbHkgcHJ1bmVzIHVucmVhY2hhYmxlIG9iamVjdHMgdGhhdCBhcmUgdHdvCisgICB3ZWVrcyBvbGQgb3Igb2xkZXIuCisKKyAqICJnaXQgZ2MgLS1hdXRvIiBjYW4gYmUgZGlzYWJsZWQgbW9yZSBlYXNpbHkgYnkganVzdCBzZXR0aW5nIGdjLmF1dG8KKyAgIHRvIHplcm8uICBJdCBhbHNvIHRvbGVyYXRlcyBtb3JlIHBhY2tmaWxlcyBieSBkZWZhdWx0LgorCisgKiAiZ2l0IGdyZXAiIG5vdyBrbm93cyAiLS1uYW1lLW9ubHkiIGlzIGEgc3lub255bSBmb3IgdGhlICItbCIgb3B0aW9uLgorCisgKiAiZ2l0IGhlbHAgPGFsaWFzPiIgbm93IHJlcG9ydHMgIidnaXQgPGFsaWFzPicgaXMgYWxpYXMgdG8gPHdoYXQ+IiwKKyAgIGluc3RlYWQgb2Ygc2F5aW5nICJObyBtYW51YWwgZW50cnkgZm9yIGdpdC08YWxpYXM+Ii4KKworICogImdpdCBoZWxwIiBjYW4gdXNlIGRpZmZlcmVudCBiYWNrZW5kcyB0byBzaG93IG1hbnVhbCBwYWdlcyBhbmQgdGhpcyBjYW4KKyAgIGJlIGNvbmZpZ3VyZWQgdXNpbmcgIm1hbi52aWV3ZXIiIGNvbmZpZ3VyYXRpb24uCisKKyAqICJnaXRrIiBkb2VzIG5vdCByZXN0b3JlIHdpbmRvdyBwb3NpdGlvbiBmcm9tICRIT01FLy5naXRrIGFueW1vcmUgKGl0CisgICBzdGlsbCByZXN0b3JlcyB0aGUgc2l6ZSkuCisKKyAqICJnaXQgbG9nIC0tZ3JlcD08d2hhdD4iIGxlYXJuZWQgIi0tZml4ZWQtc3RyaW5ncyIgb3B0aW9uIHRvIGxvb2sgZm9yCisgICA8d2hhdD4gd2l0aG91dCB0cmVhdGluZyBpdCBhcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKworICogImdpdCBndWkiIGxlYXJuZWQgYW4gYXV0by1zcGVsbCBjaGVja2luZy4KKworICogImdpdCBwdXNoIDxzb21ld2hlcmU+IEhFQUQiIGFuZCAiZ2l0IHB1c2ggPHNvbWV3aGVyZT4gK0hFQUQiIHdvcmtzIGFzCisgICBleHBlY3RlZDsgdGhleSBwdXNoIHRoZSBjdXJyZW50IGJyYW5jaCAoYW5kIG9ubHkgdGhlIGN1cnJlbnQgYnJhbmNoKS4KKyAgIEluIGFkZGl0aW9uLCBIRUFEIGNhbiBiZSB3cml0dGVuIGFzIHRoZSB2YWx1ZSBvZiAicmVtb3RlLjx0aGVyZT4ucHVzaCIKKyAgIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUuCisKKyAqIFdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgInBhY2sudGhyZWFkcyIgaXMgc2V0IHRvIDAsICJnaXQKKyAgIHJlcGFjayIgYXV0byBkZXRlY3RzIHRoZSBudW1iZXIgb2YgQ1BVcyBhbmQgdXNlcyB0aGF0IG1hbnkgdGhyZWFkcy4KKworICogImdpdCBzZW5kLWVtYWlsIiBsZWFybmVkIHRvIHByb21wdCBmb3IgcGFzc3dvcmRzCisgICBpbnRlcmFjdGl2ZWx5LgorCisgKiAiZ2l0IHNlbmQtZW1haWwiIGxlYXJuZWQgYW4gZWFzaWVyIHdheSB0byBzdXBwcmVzcyBDQworICAgcmVjaXBpZW50cy4KKworICogImdpdCBzdGFzaCIgbGVhcm5lZCAicG9wIiBjb21tYW5kLCB0aGF0IGFwcGxpZXMgdGhlIGxhdGVzdCBzdGFzaCBhbmQKKyAgIHJlbW92ZXMgaXQgZnJvbSB0aGUgc3Rhc2gsIGFuZCAiZHJvcCIgY29tbWFuZCB0byBkaXNjYXJkIHRoZSBuYW1lZAorICAgc3Rhc2ggZW50cnkuCisKKyAqICJnaXQgc3VibW9kdWxlIiBsZWFybmVkIGEgbmV3IHN1YmNvbW1hbmQgInN1bW1hcnkiIHRvIHNob3cgdGhlCisgICBzeW1tZXRyaWMgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBIRUFEIHZlcnNpb24gYW5kIHRoZSB3b3JrIHRyZWUgdmVyc2lvbgorICAgb2YgdGhlIHN1Ym1vZHVsZSBjb21taXRzLgorCisgKiBWYXJpb3VzICJnaXQgY3ZzaW1wb3J0IiwgImdpdCBjdnNleHBvcnRjb21taXQiLCAiZ2l0IGN2c3NlcnZlciIsCisgICAiZ2l0IHN2biIgYW5kICJnaXQgcDQiIGltcHJvdmVtZW50cy4KKworKGludGVybmFsKQorCisgKiBEdXBsaWNhdGVkIGNvZGUgYmV0d2VlbiBnaXQtaGVscCBhbmQgZ2l0LWluc3Rhd2ViIHRoYXQKKyAgIGxhdW5jaGVzIHVzZXIncyBwcmVmZXJyZWQgYnJvd3NlciBoYXMgYmVlbiByZWZhY3RvcmVkLgorCisgKiBJdCBpcyBub3cgZWFzaWVyIHRvIHdyaXRlIHRlc3Qgc2NyaXB0cyB0aGF0IHJlY29yZHMga25vd24KKyAgIGJyZWFrYWdlcy4KKworICogImdpdCBjaGVja291dCIgaXMgcmV3cml0dGVuIGluIEMuCisKKyAqICJnaXQgcmVtb3RlIiBpcyByZXdyaXR0ZW4gaW4gQy4KKworICogVHdvIGNvbmZsaWN0IGh1bmtzIHRoYXQgYXJlIHNlcGFyYXRlZCBieSBhIHZlcnkgc2hvcnQgc3BhbiBvZiBjb21tb24KKyAgIGxpbmVzIGFyZSBub3cgY29hbGVzY2VkIGludG8gb25lIGxhcmdlciBodW5rLCB0byBtYWtlIHRoZSByZXN1bHQgZWFzaWVyCisgICB0byByZWFkLgorCisgKiBSdW4tY29tbWFuZCBBUEkncyB1c2Ugb2YgZmlsZSBkZXNjcmlwdG9ycyBpcyBkb2N1bWVudGVkIGNsZWFyZXIgYW5kCisgICBpcyBtb3JlIGNvbnNpc3RlbnQgbm93LgorCisgKiBkaWZmIG91dHB1dCBjYW4gYmUgc2VudCB0byBGSUxFICogdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSBzdGRvdXQuICBUaGlzCisgICB3aWxsIGhlbHAgcmVpbXBsZW1lbnRpbmcgbW9yZSB0aGluZ3MgaW4gQy4KKworRml4ZXMgc2luY2UgdjEuNS40CistLS0tLS0tLS0tLS0tLS0tLS0KKworQWxsIG9mIHRoZSBmaXhlcyBpbiB2MS41LjQgbWFpbnRlbmFuY2Ugc2VyaWVzIGFyZSBpbmNsdWRlZCBpbgordGhpcyByZWxlYXNlLCB1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkLgorCisgKiAiZ2l0LWh0dHAtcHVzaCIgZGlkIG5vdCBhbGxvdyBkZWxldGlvbiBvZiByZW1vdGUgcmVmIHdpdGggdGhlIHVzdWFsCisgICAicHVzaCA8cmVtb3RlPiA6PGJyYW5jaD4iIHN5bnRheC4KKworICogImdpdC1yZWJhc2UgLS1hYm9ydCIgZGlkIG5vdCBnbyBiYWNrIHRvIHRoZSByaWdodCBsb2NhdGlvbiBpZgorICAgImdpdC1yZXNldCIgd2FzIHJ1biBkdXJpbmcgdGhlICJnaXQtcmViYXNlIiBzZXNzaW9uLgorCisgKiAiZ2l0IGltYXAtc2VuZCIgd2l0aG91dCBzZXR0aW5nIGltYXAuaG9zdCBkaWQgbm90IGVycm9yIG91dCBidXQKKyAgIHNlZ2ZhdWx0ZWQuCisKKy0tLQorZXhlYyA+L3Zhci90bXAvMQorTz12MS41LjUtcmMzCitlY2hvIE89YGdpdCBkZXNjcmliZSByZWZzL2hlYWRzL21hc3RlcmAKK2dpdCBzaG9ydGxvZyAtLW5vLW1lcmdlcyAkTy4ucmVmcy9oZWFkcy9tYXN0ZXIgXnJlZnMvaGVhZHMvbWFpbnQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMTU1YzkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzCkBAIC0wLDAgKzEsNDUzIEBACitDaGVja2xpc3QgKGFuZCBhIHNob3J0IHZlcnNpb24gZm9yIHRoZSBpbXBhdGllbnQpOgorCisJQ29tbWl0czoKKworCS0gbWFrZSBjb21taXRzIG9mIGxvZ2ljYWwgdW5pdHMKKwktIGNoZWNrIGZvciB1bm5lY2Vzc2FyeSB3aGl0ZXNwYWNlIHdpdGggImdpdCBkaWZmIC0tY2hlY2siCisJICBiZWZvcmUgY29tbWl0dGluZworCS0gZG8gbm90IGNoZWNrIGluIGNvbW1lbnRlZCBvdXQgY29kZSBvciB1bm5lZWRlZCBmaWxlcworCS0gcHJvdmlkZSBhIG1lYW5pbmdmdWwgY29tbWl0IG1lc3NhZ2UKKwktIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBjb21taXQgbWVzc2FnZSBzaG91bGQgYmUgYSBzaG9ydAorCSAgZGVzY3JpcHRpb24gYW5kIHNob3VsZCBza2lwIHRoZSBmdWxsIHN0b3AKKwktIGlmIHlvdSB3YW50IHlvdXIgd29yayBpbmNsdWRlZCBpbiBnaXQuZ2l0LCBhZGQgYQorCSAgIlNpZ25lZC1vZmYtYnk6IFlvdXIgTmFtZSA8eW91QGV4YW1wbGUuY29tPiIgbGluZSB0byB0aGUKKwkgIGNvbW1pdCBtZXNzYWdlIChvciBqdXN0IHVzZSB0aGUgb3B0aW9uICItcyIgd2hlbgorCSAgY29tbWl0dGluZykgdG8gY29uZmlybSB0aGF0IHlvdSBhZ3JlZSB0byB0aGUgRGV2ZWxvcGVyJ3MKKwkgIENlcnRpZmljYXRlIG9mIE9yaWdpbgorCS0gbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgdGVzdHMgZm9yIHRoZSBidWcgeW91IGFyZSBmaXhpbmcKKwktIG1ha2Ugc3VyZSB0aGF0IHRoZSB0ZXN0IHN1aXRlIHBhc3NlcyBhZnRlciB5b3VyIGNvbW1pdAorCisJUGF0Y2g6CisKKwktIHVzZSAiZ2l0IGZvcm1hdC1wYXRjaCAtTSIgdG8gY3JlYXRlIHRoZSBwYXRjaAorCS0gZG8gbm90IFBHUCBzaWduIHlvdXIgcGF0Y2gKKwktIGRvIG5vdCBhdHRhY2ggeW91ciBwYXRjaCwgYnV0IHJlYWQgaW4gdGhlIG1haWwKKwkgIGJvZHksIHVubGVzcyB5b3UgY2Fubm90IHRlYWNoIHlvdXIgbWFpbGVyIHRvCisJICBsZWF2ZSB0aGUgZm9ybWF0dGluZyBvZiB0aGUgcGF0Y2ggYWxvbmUuCisJLSBiZSBjYXJlZnVsIGRvaW5nIGN1dCAmIHBhc3RlIGludG8geW91ciBtYWlsZXIsIG5vdCB0bworCSAgY29ycnVwdCB3aGl0ZXNwYWNlcy4KKwktIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAod2hpY2ggaXMgdW5zdWl0YWJsZSBmb3IKKwkgIHRoZSBjb21taXQgbWVzc2FnZSkgYmV0d2VlbiB0aGUgIi0tLSIgYW5kIHRoZSBkaWZmc3RhdAorCS0gaWYgeW91IGNoYW5nZSwgYWRkLCBvciByZW1vdmUgYSBjb21tYW5kIGxpbmUgb3B0aW9uIG9yCisJICBtYWtlIHNvbWUgb3RoZXIgdXNlciBpbnRlcmZhY2UgY2hhbmdlLCB0aGUgYXNzb2NpYXRlZAorCSAgZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgdXBkYXRlZCBhcyB3ZWxsLgorCS0gaWYgeW91ciBuYW1lIGlzIG5vdCB3cml0YWJsZSBpbiBBU0NJSSwgbWFrZSBzdXJlIHRoYXQKKwkgIHlvdSBzZW5kIG9mZiBhIG1lc3NhZ2UgaW4gdGhlIGNvcnJlY3QgZW5jb2RpbmcuCisJLSBzZW5kIHRoZSBwYXRjaCB0byB0aGUgbGlzdCAoZ2l0QHZnZXIua2VybmVsLm9yZykgYW5kIHRoZQorCSAgbWFpbnRhaW5lciAoZ2l0c3RlckBwb2JveC5jb20pIGlmIChhbmQgb25seSBpZikgdGhlIHBhdGNoCisJICBpcyByZWFkeSBmb3IgaW5jbHVzaW9uLiBJZiB5b3UgdXNlIGdpdC1zZW5kLWVtYWlsKDEpLAorCSAgcGxlYXNlIHRlc3QgaXQgZmlyc3QgYnkgc2VuZGluZyBlbWFpbCB0byB5b3Vyc2VsZi4KKworTG9uZyB2ZXJzaW9uOgorCitJIHN0YXJ0ZWQgcmVhZGluZyBvdmVyIHRoZSBTdWJtaXR0aW5nUGF0Y2hlcyBkb2N1bWVudCBmb3IgTGludXgKK2tlcm5lbCwgcHJpbWFyaWx5IGJlY2F1c2UgSSB3YW50ZWQgdG8gaGF2ZSBhIGRvY3VtZW50IHNpbWlsYXIgdG8KK2l0IGZvciB0aGUgY29yZSBHSVQgdG8gbWFrZSBzdXJlIHBlb3BsZSB1bmRlcnN0YW5kIHdoYXQgdGhleSBhcmUKK2RvaW5nIHdoZW4gdGhleSB3cml0ZSAiU2lnbmVkLW9mZi1ieSIgbGluZS4KKworQnV0IHRoZSBwYXRjaCBzdWJtaXNzaW9uIHJlcXVpcmVtZW50cyBhcmUgYSBsb3QgbW9yZSByZWxheGVkCitoZXJlIG9uIHRoZSB0ZWNobmljYWwvY29udGVudHMgZnJvbnQsIGJlY2F1c2UgdGhlIGNvcmUgR0lUIGlzCit0aG91c2FuZCB0aW1lcyBzbWFsbGVyIDstKS4gIFNvIGhlcmUgaXMgb25seSB0aGUgcmVsZXZhbnQgYml0cy4KKworCisoMSkgTWFrZSBzZXBhcmF0ZSBjb21taXRzIGZvciBsb2dpY2FsbHkgc2VwYXJhdGUgY2hhbmdlcy4KKworVW5sZXNzIHlvdXIgcGF0Y2ggaXMgcmVhbGx5IHRyaXZpYWwsIHlvdSBzaG91bGQgbm90IGJlIHNlbmRpbmcKK291dCBhIHBhdGNoIHRoYXQgd2FzIGdlbmVyYXRlZCBiZXR3ZWVuIHlvdXIgd29ya2luZyB0cmVlIGFuZAoreW91ciBjb21taXQgaGVhZC4gIEluc3RlYWQsIGFsd2F5cyBtYWtlIGEgY29tbWl0IHdpdGggY29tcGxldGUKK2NvbW1pdCBtZXNzYWdlIGFuZCBnZW5lcmF0ZSBhIHNlcmllcyBvZiBwYXRjaGVzIGZyb20geW91cgorcmVwb3NpdG9yeS4gIEl0IGlzIGEgZ29vZCBkaXNjaXBsaW5lLgorCitEZXNjcmliZSB0aGUgdGVjaG5pY2FsIGRldGFpbCBvZiB0aGUgY2hhbmdlKHMpLgorCitJZiB5b3VyIGRlc2NyaXB0aW9uIHN0YXJ0cyB0byBnZXQgdG9vIGxvbmcsIHRoYXQncyBhIHNpZ24gdGhhdCB5b3UKK3Byb2JhYmx5IG5lZWQgdG8gc3BsaXQgdXAgeW91ciBjb21taXQgdG8gZmluZXIgZ3JhaW5lZCBwaWVjZXMuCisKK09oLCBhbm90aGVyIHRoaW5nLiAgSSBhbSBwaWNreSBhYm91dCB3aGl0ZXNwYWNlcy4gIE1ha2Ugc3VyZSB5b3VyCitjaGFuZ2VzIGRvIG5vdCB0cmlnZ2VyIGVycm9ycyB3aXRoIHRoZSBzYW1wbGUgcHJlLWNvbW1pdCBob29rIHNoaXBwZWQKK2luIHRlbXBsYXRlcy9ob29rcy0tcHJlLWNvbW1pdC4gIFRvIGhlbHAgZW5zdXJlIHRoaXMgZG9lcyBub3QgaGFwcGVuLAorcnVuIGdpdCBkaWZmIC0tY2hlY2sgb24geW91ciBjaGFuZ2VzIGJlZm9yZSB5b3UgY29tbWl0LgorCisKKygxYSkgVHJ5IHRvIGJlIG5pY2UgdG8gb2xkZXIgQyBjb21waWxlcnMKKworV2UgdHJ5IHRvIHN1cHBvcnQgd2lkZSByYW5nZSBvZiBDIGNvbXBpbGVycyB0byBjb21waWxlCitnaXQgd2l0aC4gVGhhdCBtZWFucyB0aGF0IHlvdSBzaG91bGQgbm90IHVzZSBDOTkgaW5pdGlhbGl6ZXJzLCBldmVuCitpZiBhIGxvdCBvZiBjb21waWxlcnMgZ3JvayBpdC4KKworQWxzbywgdmFyaWFibGVzIGhhdmUgdG8gYmUgZGVjbGFyZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYmxvY2sKKyh5b3UgY2FuIGNoZWNrIHRoaXMgd2l0aCBnY2MsIHVzaW5nIHRoZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudAorb3B0aW9uKS4KKworQW5vdGhlciB0aGluZzogTlVMTCBwb2ludGVycyBzaGFsbCBiZSB3cml0dGVuIGFzIE5VTEwsIG5vdCBhcyAwLgorCisKKygyKSBHZW5lcmF0ZSB5b3VyIHBhdGNoIHVzaW5nIGdpdCB0b29scyBvdXQgb2YgeW91ciBjb21taXRzLgorCitnaXQgYmFzZWQgZGlmZiB0b29scyAoZ2l0LCBDb2dpdG8sIGFuZCBTdEdJVCBpbmNsdWRlZCkgZ2VuZXJhdGUKK3VuaWRpZmYgd2hpY2ggaXMgdGhlIHByZWZlcnJlZCBmb3JtYXQuCisKK1lvdSBkbyBub3QgaGF2ZSB0byBiZSBhZnJhaWQgdG8gdXNlIC1NIG9wdGlvbiB0byAiZ2l0IGRpZmYiIG9yCisiZ2l0IGZvcm1hdC1wYXRjaCIsIGlmIHlvdXIgcGF0Y2ggaW52b2x2ZXMgZmlsZSByZW5hbWVzLiAgVGhlCityZWNlaXZpbmcgZW5kIGNhbiBoYW5kbGUgdGhlbSBqdXN0IGZpbmUuCisKK1BsZWFzZSBtYWtlIHN1cmUgeW91ciBwYXRjaCBkb2VzIG5vdCBpbmNsdWRlIGFueSBleHRyYSBmaWxlcword2hpY2ggZG8gbm90IGJlbG9uZyBpbiBhIHBhdGNoIHN1Ym1pc3Npb24uICBNYWtlIHN1cmUgdG8gcmV2aWV3Cit5b3VyIHBhdGNoIGFmdGVyIGdlbmVyYXRpbmcgaXQsIHRvIGVuc3VyZSBhY2N1cmFjeS4gIEJlZm9yZQorc2VuZGluZyBvdXQsIHBsZWFzZSBtYWtlIHN1cmUgaXQgY2xlYW5seSBhcHBsaWVzIHRvIHRoZSAibWFzdGVyIgorYnJhbmNoIGhlYWQuICBJZiB5b3UgYXJlIHByZXBhcmluZyBhIHdvcmsgYmFzZWQgb24gIm5leHQiIGJyYW5jaCwKK3RoYXQgaXMgZmluZSwgYnV0IHBsZWFzZSBtYXJrIGl0IGFzIHN1Y2guCisKKworKDMpIFNlbmRpbmcgeW91ciBwYXRjaGVzLgorCitQZW9wbGUgb24gdGhlIGdpdCBtYWlsaW5nIGxpc3QgbmVlZCB0byBiZSBhYmxlIHRvIHJlYWQgYW5kCitjb21tZW50IG9uIHRoZSBjaGFuZ2VzIHlvdSBhcmUgc3VibWl0dGluZy4gIEl0IGlzIGltcG9ydGFudCBmb3IKK2EgZGV2ZWxvcGVyIHRvIGJlIGFibGUgdG8gInF1b3RlIiB5b3VyIGNoYW5nZXMsIHVzaW5nIHN0YW5kYXJkCitlLW1haWwgdG9vbHMsIHNvIHRoYXQgdGhleSBtYXkgY29tbWVudCBvbiBzcGVjaWZpYyBwb3J0aW9ucyBvZgoreW91ciBjb2RlLiAgRm9yIHRoaXMgcmVhc29uLCBhbGwgcGF0Y2hlcyBzaG91bGQgYmUgc3VibWl0dGVkCisiaW5saW5lIi4gIFdBUk5JTkc6IEJlIHdhcnkgb2YgeW91ciBNVUFzIHdvcmQtd3JhcAorY29ycnVwdGluZyB5b3VyIHBhdGNoLiAgRG8gbm90IGN1dC1uLXBhc3RlIHlvdXIgcGF0Y2g7IHlvdSBjYW4KK2xvc2UgdGFicyB0aGF0IHdheSBpZiB5b3UgYXJlIG5vdCBjYXJlZnVsLgorCitJdCBpcyBhIGNvbW1vbiBjb252ZW50aW9uIHRvIHByZWZpeCB5b3VyIHN1YmplY3QgbGluZSB3aXRoCitbUEFUQ0hdLiAgVGhpcyBsZXRzIHBlb3BsZSBlYXNpbHkgZGlzdGluZ3Vpc2ggcGF0Y2hlcyBmcm9tIG90aGVyCitlLW1haWwgZGlzY3Vzc2lvbnMuICBVc2Ugb2YgYWRkaXRpb25hbCBtYXJrZXJzIGFmdGVyIFBBVENIIGFuZAordGhlIGNsb3NpbmcgYnJhY2tldCB0byBtYXJrIHRoZSBuYXR1cmUgb2YgdGhlIHBhdGNoIGlzIGFsc28KK2VuY291cmFnZWQuICBFLmcuIFtQQVRDSC9SRkNdIGlzIG9mdGVuIHVzZWQgd2hlbiB0aGUgcGF0Y2ggaXMKK25vdCByZWFkeSB0byBiZSBhcHBsaWVkIGJ1dCBpdCBpcyBmb3IgZGlzY3Vzc2lvbiwgW1BBVENIIHYyXSwKK1tQQVRDSCB2M10gZXRjLiBhcmUgb2Z0ZW4gc2VlbiB3aGVuIHlvdSBhcmUgc2VuZGluZyBhbiB1cGRhdGUgdG8KK3doYXQgeW91IGhhdmUgcHJldmlvdXNseSBzZW50LgorCisiZ2l0IGZvcm1hdC1wYXRjaCIgY29tbWFuZCBmb2xsb3dzIHRoZSBiZXN0IGN1cnJlbnQgcHJhY3RpY2UgdG8KK2Zvcm1hdCB0aGUgYm9keSBvZiBhbiBlLW1haWwgbWVzc2FnZS4gIEF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCitwYXRjaCBzaG91bGQgY29tZSB5b3VyIGNvbW1pdCBtZXNzYWdlLCBlbmRpbmcgd2l0aCB0aGUKK1NpZ25lZC1vZmYtYnk6IGxpbmVzLCBhbmQgYSBsaW5lIHRoYXQgY29uc2lzdHMgb2YgdGhyZWUgZGFzaGVzLAorZm9sbG93ZWQgYnkgdGhlIGRpZmZzdGF0IGluZm9ybWF0aW9uIGFuZCB0aGUgcGF0Y2ggaXRzZWxmLiAgSWYKK3lvdSBhcmUgZm9yd2FyZGluZyBhIHBhdGNoIGZyb20gc29tZWJvZHkgZWxzZSwgb3B0aW9uYWxseSwgYXQKK3RoZSBiZWdpbm5pbmcgb2YgdGhlIGUtbWFpbCBtZXNzYWdlIGp1c3QgYmVmb3JlIHRoZSBjb21taXQKK21lc3NhZ2Ugc3RhcnRzLCB5b3UgY2FuIHB1dCBhICJGcm9tOiAiIGxpbmUgdG8gbmFtZSB0aGF0IHBlcnNvbi4KKworWW91IG9mdGVuIHdhbnQgdG8gYWRkIGFkZGl0aW9uYWwgZXhwbGFuYXRpb24gYWJvdXQgdGhlIHBhdGNoLAorb3RoZXIgdGhhbiB0aGUgY29tbWl0IG1lc3NhZ2UgaXRzZWxmLiAgUGxhY2Ugc3VjaCAiY292ZXIgbGV0dGVyIgorbWF0ZXJpYWwgYmV0d2VlbiB0aGUgdGhyZWUgZGFzaCBsaW5lcyBhbmQgdGhlIGRpZmZzdGF0LgorCitEbyBub3QgYXR0YWNoIHRoZSBwYXRjaCBhcyBhIE1JTUUgYXR0YWNobWVudCwgY29tcHJlc3NlZCBvciBub3QuCitEbyBub3QgbGV0IHlvdXIgZS1tYWlsIGNsaWVudCBzZW5kIHF1b3RlZC1wcmludGFibGUuICBEbyBub3QgbGV0Cit5b3VyIGUtbWFpbCBjbGllbnQgc2VuZCBmb3JtYXQ9Zmxvd2VkIHdoaWNoIHdvdWxkIGRlc3Ryb3kKK3doaXRlc3BhY2VzIGluIHlvdXIgcGF0Y2hlcy4gTWFueQorcG9wdWxhciBlLW1haWwgYXBwbGljYXRpb25zIHdpbGwgbm90IGFsd2F5cyB0cmFuc21pdCBhIE1JTUUKK2F0dGFjaG1lbnQgYXMgcGxhaW4gdGV4dCwgbWFraW5nIGl0IGltcG9zc2libGUgdG8gY29tbWVudCBvbgoreW91ciBjb2RlLiAgQSBNSU1FIGF0dGFjaG1lbnQgYWxzbyB0YWtlcyBhIGJpdCBtb3JlIHRpbWUgdG8KK3Byb2Nlc3MuICBUaGlzIGRvZXMgbm90IGRlY3JlYXNlIHRoZSBsaWtlbGlob29kIG9mIHlvdXIKK01JTUUtYXR0YWNoZWQgY2hhbmdlIGJlaW5nIGFjY2VwdGVkLCBidXQgaXQgbWFrZXMgaXQgbW9yZSBsaWtlbHkKK3RoYXQgaXQgd2lsbCBiZSBwb3N0cG9uZWQuCisKK0V4Y2VwdGlvbjogIElmIHlvdXIgbWFpbGVyIGlzIG1hbmdsaW5nIHBhdGNoZXMgdGhlbiBzb21lb25lIG1heSBhc2sKK3lvdSB0byByZS1zZW5kIHRoZW0gdXNpbmcgTUlNRSwgdGhhdCBpcyBPSy4KKworRG8gbm90IFBHUCBzaWduIHlvdXIgcGF0Y2gsIGF0IGxlYXN0IGZvciBub3cuICBNb3N0IGxpa2VseSwgeW91cgorbWFpbnRhaW5lciBvciBvdGhlciBwZW9wbGUgb24gdGhlIGxpc3Qgd291bGQgbm90IGhhdmUgeW91ciBQR1AKK2tleSBhbmQgd291bGQgbm90IGJvdGhlciBvYnRhaW5pbmcgaXQgYW55d2F5LiAgWW91ciBwYXRjaCBpcyBub3QKK2p1ZGdlZCBieSB3aG8geW91IGFyZTsgYSBnb29kIHBhdGNoIGZyb20gYW4gdW5rbm93biBvcmlnaW4gaGFzIGEKK2ZhciBiZXR0ZXIgY2hhbmNlIG9mIGJlaW5nIGFjY2VwdGVkIHRoYW4gYSBwYXRjaCBmcm9tIGEga25vd24sCityZXNwZWN0ZWQgb3JpZ2luIHRoYXQgaXMgZG9uZSBwb29ybHkgb3IgZG9lcyBpbmNvcnJlY3QgdGhpbmdzLgorCitJZiB5b3UgcmVhbGx5IHJlYWxseSByZWFsbHkgcmVhbGx5IHdhbnQgdG8gZG8gYSBQR1Agc2lnbmVkCitwYXRjaCwgZm9ybWF0IGl0IGFzICJtdWx0aXBhcnQvc2lnbmVkIiwgbm90IGEgdGV4dC9wbGFpbiBtZXNzYWdlCit0aGF0IHN0YXJ0cyB3aXRoICctLS0tLUJFR0lOIFBHUCBTSUdORUQgTUVTU0FHRS0tLS0tJy4gIFRoYXQgaXMKK25vdCBhIHRleHQvcGxhaW4sIGl0J3Mgc29tZXRoaW5nIGVsc2UuCisKK05vdGUgdGhhdCB5b3VyIG1haW50YWluZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkgcmVhZCBldmVyeXRoaW5nCitvbiB0aGUgZ2l0IG1haWxpbmcgbGlzdC4gIElmIHlvdXIgcGF0Y2ggaXMgZm9yIGRpc2N1c3Npb24gZmlyc3QsCitzZW5kIGl0ICJUbzoiIHRoZSBtYWlsaW5nIGxpc3QsIGFuZCBvcHRpb25hbGx5ICJjYzoiIGhpbS4gIElmIGl0CitpcyB0cml2aWFsbHkgY29ycmVjdCBvciBhZnRlciB0aGUgbGlzdCByZWFjaGVkIGEgY29uc2Vuc3VzLCBzZW5kCitpdCAiVG86IiB0aGUgbWFpbnRhaW5lciBhbmQgb3B0aW9uYWxseSAiY2M6IiB0aGUgbGlzdCBmb3IKK2luY2x1c2lvbi4KKworQWxzbyBub3RlIHRoYXQgeW91ciBtYWludGFpbmVyIGRvZXMgbm90IGFjdGl2ZWx5IGludm9sdmUgaGltc2VsZiBpbgorbWFpbnRhaW5pbmcgd2hhdCBhcmUgaW4gY29udHJpYi8gaGllcmFyY2h5LiAgV2hlbiB5b3Ugc2VuZCBmaXhlcyBhbmQKK2VuaGFuY2VtZW50cyB0byB0aGVtLCBkbyBub3QgZm9yZ2V0IHRvICJjYzogIiB0aGUgcGVyc29uIHdobyBwcmltYXJpbHkKK3dvcmtlZCBvbiB0aGF0IGhpZXJhcmNoeSBpbiBjb250cmliLy4KKworCisoNCkgU2lnbiB5b3VyIHdvcmsKKworVG8gaW1wcm92ZSB0cmFja2luZyBvZiB3aG8gZGlkIHdoYXQsIHdlJ3ZlIGJvcnJvd2VkIHRoZQorInNpZ24tb2ZmIiBwcm9jZWR1cmUgZnJvbSB0aGUgTGludXgga2VybmVsIHByb2plY3Qgb24gcGF0Y2hlcwordGhhdCBhcmUgYmVpbmcgZW1haWxlZCBhcm91bmQuICBBbHRob3VnaCBjb3JlIEdJVCBpcyBhIGxvdAorc21hbGxlciBwcm9qZWN0IGl0IGlzIGEgZ29vZCBkaXNjaXBsaW5lIHRvIGZvbGxvdyBpdC4KKworVGhlIHNpZ24tb2ZmIGlzIGEgc2ltcGxlIGxpbmUgYXQgdGhlIGVuZCBvZiB0aGUgZXhwbGFuYXRpb24gZm9yCit0aGUgcGF0Y2gsIHdoaWNoIGNlcnRpZmllcyB0aGF0IHlvdSB3cm90ZSBpdCBvciBvdGhlcndpc2UgaGF2ZQordGhlIHJpZ2h0IHRvIHBhc3MgaXQgb24gYXMgYSBvcGVuLXNvdXJjZSBwYXRjaC4gIFRoZSBydWxlcyBhcmUKK3ByZXR0eSBzaW1wbGU6IGlmIHlvdSBjYW4gY2VydGlmeSB0aGUgYmVsb3c6CisKKyAgICAgICAgRGV2ZWxvcGVyJ3MgQ2VydGlmaWNhdGUgb2YgT3JpZ2luIDEuMQorCisgICAgICAgIEJ5IG1ha2luZyBhIGNvbnRyaWJ1dGlvbiB0byB0aGlzIHByb2plY3QsIEkgY2VydGlmeSB0aGF0OgorCisgICAgICAgIChhKSBUaGUgY29udHJpYnV0aW9uIHdhcyBjcmVhdGVkIGluIHdob2xlIG9yIGluIHBhcnQgYnkgbWUgYW5kIEkKKyAgICAgICAgICAgIGhhdmUgdGhlIHJpZ2h0IHRvIHN1Ym1pdCBpdCB1bmRlciB0aGUgb3BlbiBzb3VyY2UgbGljZW5zZQorICAgICAgICAgICAgaW5kaWNhdGVkIGluIHRoZSBmaWxlOyBvcgorCisgICAgICAgIChiKSBUaGUgY29udHJpYnV0aW9uIGlzIGJhc2VkIHVwb24gcHJldmlvdXMgd29yayB0aGF0LCB0byB0aGUgYmVzdAorICAgICAgICAgICAgb2YgbXkga25vd2xlZGdlLCBpcyBjb3ZlcmVkIHVuZGVyIGFuIGFwcHJvcHJpYXRlIG9wZW4gc291cmNlCisgICAgICAgICAgICBsaWNlbnNlIGFuZCBJIGhhdmUgdGhlIHJpZ2h0IHVuZGVyIHRoYXQgbGljZW5zZSB0byBzdWJtaXQgdGhhdAorICAgICAgICAgICAgd29yayB3aXRoIG1vZGlmaWNhdGlvbnMsIHdoZXRoZXIgY3JlYXRlZCBpbiB3aG9sZSBvciBpbiBwYXJ0CisgICAgICAgICAgICBieSBtZSwgdW5kZXIgdGhlIHNhbWUgb3BlbiBzb3VyY2UgbGljZW5zZSAodW5sZXNzIEkgYW0KKyAgICAgICAgICAgIHBlcm1pdHRlZCB0byBzdWJtaXQgdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSksIGFzIGluZGljYXRlZAorICAgICAgICAgICAgaW4gdGhlIGZpbGU7IG9yCisKKyAgICAgICAgKGMpIFRoZSBjb250cmlidXRpb24gd2FzIHByb3ZpZGVkIGRpcmVjdGx5IHRvIG1lIGJ5IHNvbWUgb3RoZXIKKyAgICAgICAgICAgIHBlcnNvbiB3aG8gY2VydGlmaWVkIChhKSwgKGIpIG9yIChjKSBhbmQgSSBoYXZlIG5vdCBtb2RpZmllZAorICAgICAgICAgICAgaXQuCisKKwkoZCkgSSB1bmRlcnN0YW5kIGFuZCBhZ3JlZSB0aGF0IHRoaXMgcHJvamVjdCBhbmQgdGhlIGNvbnRyaWJ1dGlvbgorCSAgICBhcmUgcHVibGljIGFuZCB0aGF0IGEgcmVjb3JkIG9mIHRoZSBjb250cmlidXRpb24gKGluY2x1ZGluZyBhbGwKKwkgICAgcGVyc29uYWwgaW5mb3JtYXRpb24gSSBzdWJtaXQgd2l0aCBpdCwgaW5jbHVkaW5nIG15IHNpZ24tb2ZmKSBpcworCSAgICBtYWludGFpbmVkIGluZGVmaW5pdGVseSBhbmQgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgY29uc2lzdGVudCB3aXRoCisJICAgIHRoaXMgcHJvamVjdCBvciB0aGUgb3BlbiBzb3VyY2UgbGljZW5zZShzKSBpbnZvbHZlZC4KKwordGhlbiB5b3UganVzdCBhZGQgYSBsaW5lIHNheWluZworCisJU2lnbmVkLW9mZi1ieTogUmFuZG9tIEogRGV2ZWxvcGVyIDxyYW5kb21AZGV2ZWxvcGVyLmV4YW1wbGUub3JnPgorCitUaGlzIGxpbmUgY2FuIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgYnkgZ2l0IGlmIHlvdSBydW4gdGhlIGdpdC1jb21taXQKK2NvbW1hbmQgd2l0aCB0aGUgLXMgb3B0aW9uLgorCitOb3RpY2UgdGhhdCB5b3UgY2FuIHBsYWNlIHlvdXIgb3duIFNpZ25lZC1vZmYtYnk6IGxpbmUgd2hlbgorZm9yd2FyZGluZyBzb21lYm9keSBlbHNlJ3MgcGF0Y2ggd2l0aCB0aGUgYWJvdmUgcnVsZXMgZm9yCitELUMtTy4gIEluZGVlZCB5b3UgYXJlIGVuY291cmFnZWQgdG8gZG8gc28uICBEbyBub3QgZm9yZ2V0IHRvCitwbGFjZSBhbiBpbi1ib2R5ICJGcm9tOiAiIGxpbmUgYXQgdGhlIGJlZ2lubmluZyB0byBwcm9wZXJseSBhdHRyaWJ1dGUKK3RoZSBjaGFuZ2UgdG8gaXRzIHRydWUgYXV0aG9yIChzZWUgKDIpIGFib3ZlKS4KKworU29tZSBwZW9wbGUgYWxzbyBwdXQgZXh0cmEgdGFncyBhdCB0aGUgZW5kLgorCisiQWNrZWQtYnk6IiBzYXlzIHRoYXQgdGhlIHBhdGNoIHdhcyByZXZpZXdlZCBieSB0aGUgcGVyc29uIHdobworaXMgbW9yZSBmYW1pbGlhciB3aXRoIHRoZSBpc3N1ZXMgYW5kIHRoZSBhcmVhIHRoZSBwYXRjaCBhdHRlbXB0cwordG8gbW9kaWZ5LiAgIlRlc3RlZC1ieToiIHNheXMgdGhlIHBhdGNoIHdhcyB0ZXN0ZWQgYnkgdGhlIHBlcnNvbgorYW5kIGZvdW5kIHRvIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FuIGlkZWFsIHBhdGNoIGZsb3cKKworSGVyZSBpcyBhbiBpZGVhbCBwYXRjaCBmbG93IGZvciB0aGlzIHByb2plY3QgdGhlIGN1cnJlbnQgbWFpbnRhaW5lcgorc3VnZ2VzdHMgdG8gdGhlIGNvbnRyaWJ1dG9yczoKKworICgwKSBZb3UgY29tZSB1cCB3aXRoIGFuIGl0Y2guICBZb3UgY29kZSBpdCB1cC4KKworICgxKSBTZW5kIGl0IHRvIHRoZSBsaXN0IGFuZCBjYyBwZW9wbGUgd2hvIG1heSBuZWVkIHRvIGtub3cgYWJvdXQKKyAgICAgdGhlIGNoYW5nZS4KKworICAgICBUaGUgcGVvcGxlIHdobyBtYXkgbmVlZCB0byBrbm93IGFyZSB0aGUgb25lcyB3aG9zZSBjb2RlIHlvdQorICAgICBhcmUgYnV0Y2hlcmluZy4gIFRoZXNlIHBlb3BsZSBoYXBwZW4gdG8gYmUgdGhlIG9uZXMgd2hvIGFyZQorICAgICBtb3N0IGxpa2VseSB0byBiZSBrbm93bGVkZ2VhYmxlIGVub3VnaCB0byBoZWxwIHlvdSwgYnV0CisgICAgIHRoZXkgaGF2ZSBubyBvYmxpZ2F0aW9uIHRvIGhlbHAgeW91IChpLmUuIHlvdSBhc2sgZm9yIGhlbHAsCisgICAgIGRvbid0IGRlbWFuZCkuICAiZ2l0IGxvZyAtcCAtLSAkYXJlYV95b3VfYXJlX21vZGlmeWluZyIgd291bGQKKyAgICAgaGVscCB5b3UgZmluZCBvdXQgd2hvIHRoZXkgYXJlLgorCisgKDIpIFlvdSBnZXQgY29tbWVudHMgYW5kIHN1Z2dlc3Rpb25zIGZvciBpbXByb3ZlbWVudHMuICBZb3UgbWF5CisgICAgIGV2ZW4gZ2V0IHRoZW0gaW4gYSAib24gdG9wIG9mIHlvdXIgY2hhbmdlIiBwYXRjaCBmb3JtLgorCisgKDMpIFBvbGlzaCwgcmVmaW5lLCBhbmQgcmUtc2VuZCB0byB0aGUgbGlzdCBhbmQgdGhlIHBlb3BsZSB3aG8KKyAgICAgc3BlbmQgdGhlaXIgdGltZSB0byBpbXByb3ZlIHlvdXIgcGF0Y2guICBHbyBiYWNrIHRvIHN0ZXAgKDIpLgorCisgKDQpIFRoZSBsaXN0IGZvcm1zIGNvbnNlbnN1cyB0aGF0IHRoZSBsYXN0IHJvdW5kIG9mIHlvdXIgcGF0Y2ggaXMKKyAgICAgZ29vZC4gIFNlbmQgaXQgdG8gdGhlIGxpc3QgYW5kIGNjIHRoZSBtYWludGFpbmVyLgorCisgKDUpIEEgdG9waWMgYnJhbmNoIGlzIGNyZWF0ZWQgd2l0aCB0aGUgcGF0Y2ggYW5kIGlzIG1lcmdlZCB0byAnbmV4dCcsCisgICAgIGFuZCBjb29rZWQgZnVydGhlciBhbmQgZXZlbnR1YWxseSBncmFkdWF0ZXMgdG8gJ21hc3RlcicuCisKK0luIGFueSB0aW1lIGJldHdlZW4gdGhlICgyKS0oMykgY3ljbGUsIHRoZSBtYWludGFpbmVyIG1heSBwaWNrIGl0IHVwCitmcm9tIHRoZSBsaXN0IGFuZCBxdWV1ZSBpdCB0byAncHUnLCBpbiBvcmRlciB0byBtYWtlIGl0IGVhc2llciBmb3IKK3Blb3BsZSBwbGF5IHdpdGggaXQgd2l0aG91dCBoYXZpbmcgdG8gcGljayB1cCBhbmQgYXBwbHkgdGhlIHBhdGNoIHRvCit0aGVpciB0cmVlcyB0aGVtc2VsdmVzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01VQSBzcGVjaWZpYyBoaW50cworCitTb21lIG9mIHBhdGNoZXMgSSByZWNlaXZlIG9yIHBpY2sgdXAgZnJvbSB0aGUgbGlzdCBzaGFyZSBjb21tb24KK3BhdHRlcm5zIG9mIGJyZWFrYWdlLiAgUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIE1VQSBpcyBzZXQgdXAKK3Byb3Blcmx5IG5vdCB0byBjb3JydXB0IHdoaXRlc3BhY2VzLiAgSGVyZSBhcmUgdHdvIGNvbW1vbiBvbmVzCitJIGhhdmUgc2VlbjoKKworKiBFbXB0eSBjb250ZXh0IGxpbmVzIHRoYXQgZG8gbm90IGhhdmUgX2FueV8gd2hpdGVzcGFjZS4KKworKiBOb24gZW1wdHkgY29udGV4dCBsaW5lcyB0aGF0IGhhdmUgb25lIGV4dHJhIHdoaXRlc3BhY2UgYXQgdGhlCisgIGJlZ2lubmluZy4KKworT25lIHRlc3QgeW91IGNvdWxkIGRvIHlvdXJzZWxmIGlmIHlvdXIgTVVBIGlzIHNldCB1cCBjb3JyZWN0bHkgaXM6CisKKyogU2VuZCB0aGUgcGF0Y2ggdG8geW91cnNlbGYsIGV4YWN0bHkgdGhlIHdheSB5b3Ugd291bGQsIGV4Y2VwdAorICBUbzogYW5kIENjOiBsaW5lcywgd2hpY2ggd291bGQgbm90IGNvbnRhaW4gdGhlIGxpc3QgYW5kCisgIG1haW50YWluZXIgYWRkcmVzcy4KKworKiBTYXZlIHRoYXQgcGF0Y2ggdG8gYSBmaWxlIGluIFVOSVggbWFpbGJveCBmb3JtYXQuICBDYWxsIGl0IHNheQorICBhLnBhdGNoLgorCisqIFRyeSB0byBhcHBseSB0byB0aGUgdGlwIG9mIHRoZSAibWFzdGVyIiBicmFuY2ggZnJvbSB0aGUKKyAgZ2l0LmdpdCBwdWJsaWMgcmVwb3NpdG9yeToKKworICAgICQgZ2l0IGZldGNoIGh0dHA6Ly9rZXJuZWwub3JnL3B1Yi9zY20vZ2l0L2dpdC5naXQgbWFzdGVyOnRlc3QtYXBwbHkKKyAgICAkIGdpdCBjaGVja291dCB0ZXN0LWFwcGx5CisgICAgJCBnaXQgcmVzZXQgLS1oYXJkCisgICAgJCBnaXQgYW0gYS5wYXRjaAorCitJZiBpdCBkb2VzIG5vdCBhcHBseSBjb3JyZWN0bHksIHRoZXJlIGNhbiBiZSB2YXJpb3VzIHJlYXNvbnMuCisKKyogWW91ciBwYXRjaCBpdHNlbGYgZG9lcyBub3QgYXBwbHkgY2xlYW5seS4gIFRoYXQgaXMgX2JhZF8gYnV0CisgIGRvZXMgbm90IGhhdmUgbXVjaCB0byBkbyB3aXRoIHlvdXIgTVVBLiAgUGxlYXNlIHJlYmFzZSB0aGUKKyAgcGF0Y2ggYXBwcm9wcmlhdGVseS4KKworKiBZb3VyIE1VQSBjb3JydXB0ZWQgeW91ciBwYXRjaDsgImFtIiB3b3VsZCBjb21wbGFpbiB0aGF0CisgIHRoZSBwYXRjaCBkb2VzIG5vdCBhcHBseS4gIExvb2sgYXQgLmRvdGVzdC8gc3ViZGlyZWN0b3J5IGFuZAorICBzZWUgd2hhdCAncGF0Y2gnIGZpbGUgY29udGFpbnMgYW5kIGNoZWNrIGZvciB0aGUgY29tbW9uCisgIGNvcnJ1cHRpb24gcGF0dGVybnMgbWVudGlvbmVkIGFib3ZlLgorCisqIFdoaWxlIHlvdSBhcmUgYXQgaXQsIGNoZWNrIHdoYXQgYXJlIGluICdpbmZvJyBhbmQKKyAgJ2ZpbmFsLWNvbW1pdCcgZmlsZXMgYXMgd2VsbC4gIElmIHdoYXQgaXMgaW4gJ2ZpbmFsLWNvbW1pdCcgaXMKKyAgbm90IGV4YWN0bHkgd2hhdCB5b3Ugd291bGQgd2FudCB0byBzZWUgaW4gdGhlIGNvbW1pdCBsb2cKKyAgbWVzc2FnZSwgaXQgaXMgdmVyeSBsaWtlbHkgdGhhdCB5b3VyIG1haW50YWluZXIgd291bGQgZW5kIHVwCisgIGhhbmQgZWRpdGluZyB0aGUgbG9nIG1lc3NhZ2Ugd2hlbiBoZSBhcHBsaWVzIHlvdXIgcGF0Y2guCisgIFRoaW5ncyBsaWtlICJIaSwgdGhpcyBpcyBteSBmaXJzdCBwYXRjaC5cbiIsIGlmIHlvdSByZWFsbHkKKyAgd2FudCB0byBwdXQgaW4gdGhlIHBhdGNoIGUtbWFpbCwgc2hvdWxkIGNvbWUgYWZ0ZXIgdGhlCisgIHRocmVlLWRhc2ggbGluZSB0aGF0IHNpZ25hbHMgdGhlIGVuZCBvZiB0aGUgY29tbWl0IG1lc3NhZ2UuCisKKworUGluZQorLS0tLQorCisoSm9oYW5uZXMgU2NoaW5kZWxpbikKKworSSBkb24ndCBrbm93IGhvdyBtYW55IHBlb3BsZSBzdGlsbCB1c2UgcGluZSwgYnV0IGZvciB0aG9zZSBwb29yCitzb3VscyBpdCBtYXkgYmUgZ29vZCB0byBtZW50aW9uIHRoYXQgdGhlIHF1ZWxsLWZsb3dlZC10ZXh0IGlzCituZWVkZWQgZm9yIHJlY2VudCB2ZXJzaW9ucy4KKworLi4uIHRoZSAibm8tc3RyaXAtd2hpdGVzcGFjZS1iZWZvcmUtc2VuZCIgb3B0aW9uLCB0b28uIEFGQUlLIGl0Cit3YXMgaW50cm9kdWNlZCBpbiA0LjYwLgorCisoTGludXMgVG9ydmFsZHMpCisKK0FuZCA0LjU4IG5lZWRzIGF0IGxlYXN0IHRoaXMuCisKKy0tLQorZGlmZi10cmVlIDgzMjZkZDgzNTBiZTY0YWM3ZmM4MDVmNjU2M2ExZDYxYWQxMGQzMmMgKGZyb20gZTg4NmE2MWY3NmVkZjU0MTA1NzNlOTJlMzhjZTIyOTc0ZjljNDBmMSkKK0F1dGhvcjogTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQGc1Lm9zZGwub3JnPgorRGF0ZTogICBNb24gQXVnIDE1IDE3OjIzOjUxIDIwMDUgLTA3MDAKKworICAgIEZpeCBwaW5lIHdoaXRlc3BhY2UtY29ycnVwdGlvbiBidWcKKworICAgIFRoZXJlJ3Mgbm8gZXhjdXNlIGZvciB1bmNvbmRpdGlvbmFsbHkgcmVtb3Zpbmcgd2hpdGVzcGFjZSBmcm9tCisgICAgdGhlIHBpY28gYnVmZmVycyBvbiBjbG9zZS4KKworZGlmZiAtLWdpdCBhL3BpY28vcGljby5jIGIvcGljby9waWNvLmMKKy0tLSBhL3BpY28vcGljby5jCisrKysgYi9waWNvL3BpY28uYworQEAgLTIxOSw3ICsyMTksOSBAQCBQSUNPICpwbTsKKwkgICAgc3dpdGNoKHBpY29fYWxsX2RvbmUpewkvKiBwcmVwYXJlIGZvci9oYW5kbGUgZmluYWwgZXZlbnRzICovCisJICAgICAgY2FzZSBDT01QX0VYSVQgOgkJLyogYWxyZWFkeSBjb25maXJtZWQgKi8KKwkJcGFja2hlYWRlcigpOworKyNpZiAwCisJCXN0cmlwd2hpdGVzcGFjZSgpOworKyNlbmRpZgorCQljIHw9IENPTVBfRVhJVDsKKwkJYnJlYWs7CisKKworKERhbmllbCBCYXJrYWxvdykKKworPiBBIHBhdGNoIHRvIFN1Ym1pdHRpbmdQYXRjaGVzLCBNVUEgc3BlY2lmaWMgaGVscCBzZWN0aW9uIGZvcgorPiB1c2VycyBvZiBQaW5lIDQuNjMgd291bGQgYmUgdmVyeSBtdWNoIGFwcHJlY2lhdGVkLgorCitBaCwgaXQgbG9va3MgbGlrZSBhIHJlY2VudCB2ZXJzaW9uIGNoYW5nZWQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgdG8gZG8gdGhlCityaWdodCB0aGluZywgYW5kIGludmVydGVkIHRoZSBzZW5zZSBvZiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb24uIChFaXRoZXIKK3RoYXQgb3IgR2VudG9vIGRpZCBpdC4pIFNvIHlvdSBuZWVkIHRvIHNldCB0aGUKKyJuby1zdHJpcC13aGl0ZXNwYWNlLWJlZm9yZS1zZW5kIiBvcHRpb24sIHVubGVzcyB0aGUgb3B0aW9uIHlvdSBoYXZlIGlzCisic3RyaXAtd2hpdGVzcGFjZS1iZWZvcmUtc2VuZCIsIGluIHdoaWNoIGNhc2UgeW91IHNob3VsZCBhdm9pZCBjaGVja2luZworaXQuCisKKworVGh1bmRlcmJpcmQKKy0tLS0tLS0tLS0tCisKKyhBIExhcmdlIEFuZ3J5IFNDTSkKKworSGVyZSBhcmUgc29tZSBoaW50cyBvbiBob3cgdG8gc3VjY2Vzc2Z1bGx5IHN1Ym1pdCBwYXRjaGVzIGlubGluZSB1c2luZworVGh1bmRlcmJpcmQuCisKK1RoaXMgcmVjaXBlIGFwcGVhcnMgdG8gd29yayB3aXRoIHRoZSBjdXJyZW50IFsqMSpdIFRodW5kZXJiaXJkIGZyb20gU3VzZS4KKworVGhlIGZvbGxvd2luZyBUaHVuZGVyYmlyZCBleHRlbnNpb25zIGFyZSBuZWVkZWQ6CisJQWJvdXRDb25maWcgMC41CisJCWh0dHA6Ly9hYm91dGNvbmZpZy5tb3pkZXYub3JnLworCUV4dGVybmFsIEVkaXRvciAwLjcuMgorCQlodHRwOi8vZ2xvYnMub3JnL2FydGljbGVzLnBocD9sbmc9ZW4mcGc9OAorCisxKSBQcmVwYXJlIHRoZSBwYXRjaCBhcyBhIHRleHQgZmlsZSB1c2luZyB5b3VyIG1ldGhvZCBvZiBjaG9pY2UuCisKKzIpIEJlZm9yZSBvcGVuaW5nIGEgY29tcG9zZSB3aW5kb3csIHVzZSBFZGl0LT5BY2NvdW50IFNldHRpbmdzIHRvCit1bmNoZWNrIHRoZSAiQ29tcG9zZSBtZXNzYWdlcyBpbiBIVE1MIGZvcm1hdCIgc2V0dGluZyBpbiB0aGUKKyJDb21wb3NpdGlvbiAmIEFkZHJlc3NpbmciIHBhbmVsIG9mIHRoZSBhY2NvdW50IHRvIGJlIHVzZWQgdG8gc2VuZCB0aGUKK3BhdGNoLiBbKjIqXQorCiszKSBJbiB0aGUgbWFpbiBUaHVuZGVyYmlyZCB3aW5kb3csIF9iZWZvcmVfIHlvdSBvcGVuIHRoZSBjb21wb3NlIHdpbmRvdworZm9yIHRoZSBwYXRjaCwgdXNlIFRvb2xzLT5hYm91dDpjb25maWcgdG8gc2V0IHRoZSBmb2xsb3dpbmcgdG8gdGhlCitpbmRpY2F0ZWQgdmFsdWVzOgorCW1haWxuZXdzLnNlbmRfcGxhaW50ZXh0X2Zsb3dlZAk9PiBmYWxzZQorCW1haWxuZXdzLndyYXBsZW5ndGgJCT0+IDAKKworNCkgT3BlbiBhIGNvbXBvc2Ugd2luZG93IGFuZCBjbGljayB0aGUgZXh0ZXJuYWwgZWRpdG9yIGljb24uCisKKzUpIEluIHRoZSBleHRlcm5hbCBlZGl0b3Igd2luZG93LCByZWFkIGluIHRoZSBwYXRjaCBmaWxlIGFuZCBleGl0IHRoZQorZWRpdG9yIG5vcm1hbGx5LgorCis2KSBCYWNrIGluIHRoZSBjb21wb3NlIHdpbmRvdzogQWRkIHdoYXRldmVyIG90aGVyIHRleHQgeW91IHdpc2ggdG8gdGhlCittZXNzYWdlLCBjb21wbGV0ZSB0aGUgYWRkcmVzc2luZyBhbmQgc3ViamVjdCBmaWVsZHMsIGFuZCBwcmVzcyBzZW5kLgorCis3KSBPcHRpb25hbGx5LCB1bmRvIHRoZSBhYm91dDpjb25maWcvYWNjb3VudCBzZXR0aW5ncyBjaGFuZ2VzIG1hZGUgaW4KK3N0ZXBzIDIgJiAzLgorCisKK1tGb290bm90ZXNdCisqMSogVmVyc2lvbiAxLjAgKDIwMDQxMjA3KSBmcm9tIHRoZSBNb3ppbGxhVGh1bmRlcmJpcmQtMS4wLTUgcnBtIG9mIFN1c2UKKzkuMyBwcm9mZXNzaW9uYWwgdXBkYXRlcy4KKworKjIqIEl0IG1heSBiZSBwb3NzaWJsZSB0byBkbyB0aGlzIHdpdGggYWJvdXQ6Y29uZmlnIGFuZCB0aGUgZm9sbG93aW5nCitzZXR0aW5ncyBidXQgSSBoYXZlbid0IHRyaWVkLCB5ZXQuCisJbWFpbC5odG1sX2NvbXBvc2UJCQk9PiBmYWxzZQorCW1haWwuaWRlbnRpdHkuZGVmYXVsdC5jb21wb3NlX2h0bWwJPT4gZmFsc2UKKwltYWlsLmlkZW50aXR5LmlkPy5jb21wb3NlX2h0bWwJCT0+IGZhbHNlCisKKworR251cworLS0tLQorCisnfCcgaW4gdGhlICpTdW1tYXJ5KiBidWZmZXIgY2FuIGJlIHVzZWQgdG8gcGlwZSB0aGUgY3VycmVudAorbWVzc2FnZSB0byBhbiBleHRlcm5hbCBwcm9ncmFtLCBhbmQgdGhpcyBpcyBhIGhhbmR5IHdheSB0byBkcml2ZQorImdpdCBhbSIuICBIb3dldmVyLCBpZiB0aGUgbWVzc2FnZSBpcyBNSU1FIGVuY29kZWQsIHdoYXQgaXMKK3BpcGVkIGludG8gdGhlIHByb2dyYW0gaXMgdGhlIHJlcHJlc2VudGF0aW9uIHlvdSBzZWUgaW4geW91cgorKkFydGljbGUqIGJ1ZmZlciBhZnRlciB1bndyYXBwaW5nIE1JTUUuICBUaGlzIGlzIG9mdGVuIG5vdCB3aGF0Cit5b3Ugd291bGQgd2FudCBmb3IgdHdvIHJlYXNvbnMuICBJdCB0ZW5kcyB0byBzY3JldyB1cCBub24gQVNDSUkKK2NoYXJhY3RlcnMgKG1vc3Qgbm90YWJseSBpbiBwZW9wbGUncyBuYW1lcyksIGFuZCBhbHNvCit3aGl0ZXNwYWNlcyAoZmF0YWwgaW4gcGF0Y2hlcykuICBSdW5uaW5nICdDLXUgZycgdG8gZGlzcGxheSB0aGUKK21lc3NhZ2UgaW4gcmF3IGZvcm0gYmVmb3JlIHVzaW5nICd8JyB0byBydW4gdGhlIHBpcGUgY2FuIHdvcmsKK3RoaXMgcHJvYmxlbSBhcm91bmQuCisKKworS01haWwKKy0tLS0tCisKK1RoaXMgc2hvdWxkIGhlbHAgeW91IHRvIHN1Ym1pdCBwYXRjaGVzIGlubGluZSB1c2luZyBLTWFpbC4KKworMSkgUHJlcGFyZSB0aGUgcGF0Y2ggYXMgYSB0ZXh0IGZpbGUuCisKKzIpIENsaWNrIG9uIE5ldyBNYWlsLgorCiszKSBHbyB1bmRlciAiT3B0aW9ucyIgaW4gdGhlIENvbXBvc2VyIHdpbmRvdyBhbmQgYmUgc3VyZSB0aGF0CisiV29yZCB3cmFwIiBpcyBub3Qgc2V0LgorCis0KSBVc2UgTWVzc2FnZSAtPiBJbnNlcnQgZmlsZS4uLiBhbmQgaW5zZXJ0IHRoZSBwYXRjaC4KKworNSkgQmFjayBpbiB0aGUgY29tcG9zZSB3aW5kb3c6IGFkZCB3aGF0ZXZlciBvdGhlciB0ZXh0IHlvdSB3aXNoIHRvIHRoZQorbWVzc2FnZSwgY29tcGxldGUgdGhlIGFkZHJlc3NpbmcgYW5kIHN1YmplY3QgZmllbGRzLCBhbmQgcHJlc3Mgc2VuZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYXNjaWlkb2MuY29uZiBiL0RvY3VtZW50YXRpb24vYXNjaWlkb2MuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGMxYTE1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9hc2NpaWRvYy5jb25mCkBAIC0wLDAgKzEsNjYgQEAKKyMjIGxpbmtnaXQ6IG1hY3JvCisjCisjIFVzYWdlOiBsaW5rZ2l0OmNvbW1hbmRbbWFucGFnZS1zZWN0aW9uXQorIworIyBOb3RlLCB7MH0gaXMgdGhlIG1hbnBhZ2Ugc2VjdGlvbiwgd2hpbGUge3RhcmdldH0gaXMgdGhlIGNvbW1hbmQuCisjCisjIFNob3cgR0lUIGxpbmsgYXM6IDxjb21tYW5kPig8c2VjdGlvbj4pOyBpZiBzZWN0aW9uIGlzIGRlZmluZWQsIGVsc2UganVzdCBzaG93CisjIHRoZSBjb21tYW5kLgorCitbYXR0cmlidXRlc10KK3BsdXM9JiM0MzsKK2NhcmV0PSYjOTQ7CitzdGFydHNiPSYjOTE7CitlbmRzYj0mIzkzOwordGlsZGU9JiMxMjY7CisKK2lmZGVmOjpiYWNrZW5kLWRvY2Jvb2tbXQorW2xpbmtnaXQtaW5saW5lbWFjcm9dCit7MCV7dGFyZ2V0fX0KK3swIzxjaXRlcmVmZW50cnk+fQorezAjPHJlZmVudHJ5dGl0bGU+e3RhcmdldH08L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT57MH08L21hbnZvbG51bT59Cit7MCM8L2NpdGVyZWZlbnRyeT59CitlbmRpZjo6YmFja2VuZC1kb2Nib29rW10KKworaWZkZWY6OmJhY2tlbmQtZG9jYm9va1tdCitpZm5kZWY6OmRvY2Jvb2steHNsLTE3MltdCisjICJ1bmJyZWFrIiBkb2Nib29rLXhzbCB2MS42OCBmb3IgbWFucGFnZXMuIHYxLjY5IHdvcmtzIHdpdGggb3Igd2l0aG91dCB0aGlzLgorIyB2MS43MiBicmVha3Mgd2l0aCB0aGlzIGJlY2F1c2UgaXQgcmVwbGFjZXMgZG90cyBub3QgaW4gcm9mZiByZXF1ZXN0cy4KK1tsaXN0aW5nYmxvY2tdCis8ZXhhbXBsZT48dGl0bGU+e3RpdGxlfTwvdGl0bGU+Cis8bGl0ZXJhbGxheW91dD4KK2lmZGVmOjpkb2N0eXBlLW1hbnBhZ2VbXQorJiMxMDsuZnQgQyYjMTA7CitlbmRpZjo6ZG9jdHlwZS1tYW5wYWdlW10KK3wKK2lmZGVmOjpkb2N0eXBlLW1hbnBhZ2VbXQorJiMxMDsuZnQmIzEwOworZW5kaWY6OmRvY3R5cGUtbWFucGFnZVtdCis8L2xpdGVyYWxsYXlvdXQ+Cit7dGl0bGUjfTwvZXhhbXBsZT4KK2VuZGlmOjpkb2Nib29rLXhzbC0xNzJbXQorZW5kaWY6OmJhY2tlbmQtZG9jYm9va1tdCisKK2lmZGVmOjpkb2N0eXBlLW1hbnBhZ2VbXQoraWZkZWY6OmJhY2tlbmQtZG9jYm9va1tdCitbaGVhZGVyXQordGVtcGxhdGU6OltoZWFkZXItZGVjbGFyYXRpb25zXQorPHJlZmVudHJ5PgorPHJlZm1ldGE+Cis8cmVmZW50cnl0aXRsZT57bWFudGl0bGV9PC9yZWZlbnRyeXRpdGxlPgorPG1hbnZvbG51bT57bWFudm9sbnVtfTwvbWFudm9sbnVtPgorPHJlZm1pc2NpbmZvIGNsYXNzPSJzb3VyY2UiPkdpdDwvcmVmbWlzY2luZm8+Cis8cmVmbWlzY2luZm8gY2xhc3M9InZlcnNpb24iPntnaXRfdmVyc2lvbn08L3JlZm1pc2NpbmZvPgorPHJlZm1pc2NpbmZvIGNsYXNzPSJtYW51YWwiPkdpdCBNYW51YWw8L3JlZm1pc2NpbmZvPgorPC9yZWZtZXRhPgorPHJlZm5hbWVkaXY+CisgIDxyZWZuYW1lPnttYW5uYW1lfTwvcmVmbmFtZT4KKyAgPHJlZnB1cnBvc2U+e21hbnB1cnBvc2V9PC9yZWZwdXJwb3NlPgorPC9yZWZuYW1lZGl2PgorZW5kaWY6OmJhY2tlbmQtZG9jYm9va1tdCitlbmRpZjo6ZG9jdHlwZS1tYW5wYWdlW10KKworaWZkZWY6OmJhY2tlbmQteGh0bWwxMVtdCitbbGlua2dpdC1pbmxpbmVtYWNyb10KKzxhIGhyZWY9Int0YXJnZXR9Lmh0bWwiPnt0YXJnZXR9ezA/KHswfSl9PC9hPgorZW5kaWY6OmJhY2tlbmQteGh0bWwxMVtdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2JsYW1lLW9wdGlvbnMudHh0IGIvRG9jdW1lbnRhdGlvbi9ibGFtZS1vcHRpb25zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTFiYjdkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ibGFtZS1vcHRpb25zLnR4dApAQCAtMCwwICsxLDg3IEBACistYjo6CisJU2hvdyBibGFuayBTSEEtMSBmb3IgYm91bmRhcnkgY29tbWl0cy4gIFRoaXMgY2FuIGFsc28KKwliZSBjb250cm9sbGVkIHZpYSB0aGUgYGJsYW1lLmJsYW5rYm91bmRhcnlgIGNvbmZpZyBvcHRpb24uCisKKy0tcm9vdDo6CisJRG8gbm90IHRyZWF0IHJvb3QgY29tbWl0cyBhcyBib3VuZGFyaWVzLiAgVGhpcyBjYW4gYWxzbyBiZQorCWNvbnRyb2xsZWQgdmlhIHRoZSBgYmxhbWUuc2hvd3Jvb3RgIGNvbmZpZyBvcHRpb24uCisKKy0tc2hvdy1zdGF0czo6CisJSW5jbHVkZSBhZGRpdGlvbmFsIHN0YXRpc3RpY3MgYXQgdGhlIGVuZCBvZiBibGFtZSBvdXRwdXQuCisKKy1MIDxzdGFydD4sPGVuZD46OgorCUFubm90YXRlIG9ubHkgdGhlIGdpdmVuIGxpbmUgcmFuZ2UuICA8c3RhcnQ+IGFuZCA8ZW5kPiBjYW4gdGFrZQorCW9uZSBvZiB0aGVzZSBmb3JtczoKKworCS0gbnVtYmVyCisrCitJZiA8c3RhcnQ+IG9yIDxlbmQ+IGlzIGEgbnVtYmVyLCBpdCBzcGVjaWZpZXMgYW4KK2Fic29sdXRlIGxpbmUgbnVtYmVyIChsaW5lcyBjb3VudCBmcm9tIDEpLgorKworCistIC9yZWdleC8KKysKK1RoaXMgZm9ybSB3aWxsIHVzZSB0aGUgZmlyc3QgbGluZSBtYXRjaGluZyB0aGUgZ2l2ZW4KK1BPU0lYIHJlZ2V4LiAgSWYgPGVuZD4gaXMgYSByZWdleCwgaXQgd2lsbCBzZWFyY2gKK3N0YXJ0aW5nIGF0IHRoZSBsaW5lIGdpdmVuIGJ5IDxzdGFydD4uCisrCisKKy0gK29mZnNldCBvciAtb2Zmc2V0CisrCitUaGlzIGlzIG9ubHkgdmFsaWQgZm9yIDxlbmQ+IGFuZCB3aWxsIHNwZWNpZnkgYSBudW1iZXIKK29mIGxpbmVzIGJlZm9yZSBvciBhZnRlciB0aGUgbGluZSBnaXZlbiBieSA8c3RhcnQ+LgorKworCistbDo6CisJU2hvdyBsb25nIHJldiAoRGVmYXVsdDogb2ZmKS4KKworLXQ6OgorCVNob3cgcmF3IHRpbWVzdGFtcCAoRGVmYXVsdDogb2ZmKS4KKworLVMgPHJldnMtZmlsZT46OgorCVVzZSByZXZzIGZyb20gcmV2cy1maWxlIGluc3RlYWQgb2YgY2FsbGluZyBsaW5rZ2l0OmdpdC1yZXYtbGlzdFsxXS4KKworLXAsIC0tcG9yY2VsYWluOjoKKwlTaG93IGluIGEgZm9ybWF0IGRlc2lnbmVkIGZvciBtYWNoaW5lIGNvbnN1bXB0aW9uLgorCistLWluY3JlbWVudGFsOjoKKwlTaG93IHRoZSByZXN1bHQgaW5jcmVtZW50YWxseSBpbiBhIGZvcm1hdCBkZXNpZ25lZCBmb3IKKwltYWNoaW5lIGNvbnN1bXB0aW9uLgorCistLWNvbnRlbnRzIDxmaWxlPjo6CisJV2hlbiA8cmV2PiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgY29tbWFuZCBhbm5vdGF0ZXMgdGhlCisJY2hhbmdlcyBzdGFydGluZyBiYWNrd2FyZHMgZnJvbSB0aGUgd29ya2luZyB0cmVlIGNvcHkuCisJVGhpcyBmbGFnIG1ha2VzIHRoZSBjb21tYW5kIHByZXRlbmQgYXMgaWYgdGhlIHdvcmtpbmcKKwl0cmVlIGNvcHkgaGFzIHRoZSBjb250ZW50cyBvZiB0aGUgbmFtZWQgZmlsZSAoc3BlY2lmeQorCWAtYCB0byBtYWtlIHRoZSBjb21tYW5kIHJlYWQgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQpLgorCistTXw8bnVtPnw6OgorCURldGVjdCBtb3ZpbmcgbGluZXMgaW4gdGhlIGZpbGUgYXMgd2VsbC4gIFdoZW4gYSBjb21taXQKKwltb3ZlcyBhIGJsb2NrIG9mIGxpbmVzIGluIGEgZmlsZSAoZS5nLiB0aGUgb3JpZ2luYWwgZmlsZQorCWhhcyBBIGFuZCB0aGVuIEIsIGFuZCB0aGUgY29tbWl0IGNoYW5nZXMgaXQgdG8gQiBhbmQKKwl0aGVuIEEpLCB0cmFkaXRpb25hbCAnYmxhbWUnIGFsZ29yaXRobSB0eXBpY2FsbHkgYmxhbWVzCisJdGhlIGxpbmVzIHRoYXQgd2VyZSBtb3ZlZCB1cCAoaS5lLiBCKSB0byB0aGUgcGFyZW50IGFuZAorCWFzc2lnbnMgYmxhbWUgdG8gdGhlIGxpbmVzIHRoYXQgd2VyZSBtb3ZlZCBkb3duIChpLmUuIEEpCisJdG8gdGhlIGNoaWxkIGNvbW1pdC4gIFdpdGggdGhpcyBvcHRpb24sIGJvdGggZ3JvdXBzIG9mIGxpbmVzCisJYXJlIGJsYW1lZCBvbiB0aGUgcGFyZW50LgorKworPG51bT4gaXMgb3B0aW9uYWwgYnV0IGl0IGlzIHRoZSBsb3dlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mCithbHBoYW51bWVyaWMgY2hhcmFjdGVycyB0aGF0IGdpdCBtdXN0IGRldGVjdCBhcyBtb3ZpbmcKK3dpdGhpbiBhIGZpbGUgZm9yIGl0IHRvIGFzc29jaWF0ZSB0aG9zZSBsaW5lcyB3aXRoIHRoZSBwYXJlbnQKK2NvbW1pdC4KKworLUN8PG51bT58OjoKKwlJbiBhZGRpdGlvbiB0byBgLU1gLCBkZXRlY3QgbGluZXMgY29waWVkIGZyb20gb3RoZXIKKwlmaWxlcyB0aGF0IHdlcmUgbW9kaWZpZWQgaW4gdGhlIHNhbWUgY29tbWl0LiAgVGhpcyBpcworCXVzZWZ1bCB3aGVuIHlvdSByZW9yZ2FuaXplIHlvdXIgcHJvZ3JhbSBhbmQgbW92ZSBjb2RlCisJYXJvdW5kIGFjcm9zcyBmaWxlcy4gIFdoZW4gdGhpcyBvcHRpb24gaXMgZ2l2ZW4gdHdpY2UsCisJdGhlIGNvbW1hbmQgbG9va3MgZm9yIGNvcGllcyBmcm9tIGFsbCBvdGhlciBmaWxlcyBpbiB0aGUKKwlwYXJlbnQgZm9yIHRoZSBjb21taXQgdGhhdCBjcmVhdGVzIHRoZSBmaWxlIGluIGFkZGl0aW9uLgorKworPG51bT4gaXMgb3B0aW9uYWwgYnV0IGl0IGlzIHRoZSBsb3dlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mCithbHBoYW51bWVyaWMgY2hhcmFjdGVycyB0aGF0IGdpdCBtdXN0IGRldGVjdCBhcyBtb3ZpbmcKK2JldHdlZW4gZmlsZXMgZm9yIGl0IHRvIGFzc29jaWF0ZSB0aG9zZSBsaW5lcyB3aXRoIHRoZSBwYXJlbnQKK2NvbW1pdC4KKworLWgsIC0taGVscDo6CisJU2hvdyBoZWxwIG1lc3NhZ2UuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2J1aWxkLWRvY2RlcC5wZXJsIGIvRG9jdW1lbnRhdGlvbi9idWlsZC1kb2NkZXAucGVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYTQyMDVlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9idWlsZC1kb2NkZXAucGVybApAQCAtMCwwICsxLDQ2IEBACisjIS91c3IvYmluL3BlcmwKKworbXkgJWluY2x1ZGUgPSAoKTsKK215ICVpbmNsdWRlZCA9ICgpOworCitmb3IgbXkgJHRleHQgKDwqLnR4dD4pIHsKKyAgICBvcGVuIEksICc8JywgJHRleHQgfHwgZGllICJjYW5ub3QgcmVhZDogJHRleHQiOworICAgIHdoaWxlICg8ST4pIHsKKwlpZiAoL15pbmNsdWRlOjovKSB7CisJICAgIGNob21wOworCSAgICBzL15pbmNsdWRlOjpccyovLzsKKwkgICAgcy9cW1xdLy87CisJICAgICRpbmNsdWRleyR0ZXh0fXskX30gPSAxOworCSAgICAkaW5jbHVkZWR7JF99ID0gMTsKKwl9CisgICAgfQorICAgIGNsb3NlIEk7Cit9CisKKyMgRG8gd2UgY2FyZSBhYm91dCBjaGFpbmVkIGluY2x1ZGVzPz8/CitteSAkY2hhbmdlZCA9IDE7Cit3aGlsZSAoJGNoYW5nZWQpIHsKKyAgICAkY2hhbmdlZCA9IDA7CisgICAgd2hpbGUgKG15ICgkdGV4dCwgJGluY2x1ZGVkKSA9IGVhY2ggJWluY2x1ZGUpIHsKKwlmb3IgbXkgJGkgKGtleXMgJSRpbmNsdWRlZCkgeworCSAgICAjICR0ZXh0IGhhcyBpbmNsdWRlOjokaTsgaWYgJGkgaW5jbHVkZXMgJGoKKwkgICAgIyAkdGV4dCBpbmRpcmVjdGx5IGluY2x1ZGVzICRqLgorCSAgICBpZiAoZXhpc3RzICRpbmNsdWRleyRpfSkgeworCQlmb3IgbXkgJGogKGtleXMgJXskaW5jbHVkZXskaX19KSB7CisJCSAgICBpZiAoIWV4aXN0cyAkaW5jbHVkZXskdGV4dH17JGp9KSB7CisJCQkkaW5jbHVkZXskdGV4dH17JGp9ID0gMTsKKwkJCSRpbmNsdWRlZHskan0gPSAxOworCQkJJGNoYW5nZWQgPSAxOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisgICAgfQorfQorCit3aGlsZSAobXkgKCR0ZXh0LCAkaW5jbHVkZWQpID0gZWFjaCAlaW5jbHVkZSkgeworICAgIGlmICghIGV4aXN0cyAkaW5jbHVkZWR7JHRleHR9ICYmCisJKG15ICRiYXNlID0gJHRleHQpID1+IHMvXC50eHQkLy8pIHsKKwlwcmludCAiJGJhc2UuaHRtbCAkYmFzZS54bWwgOiAiLCBqb2luKCIgIiwga2V5cyAlJGluY2x1ZGVkKSwgIlxuIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NhbGxvdXRzLnhzbCBiL0RvY3VtZW50YXRpb24vY2FsbG91dHMueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMzYxYTIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2NhbGxvdXRzLnhzbApAQCAtMCwwICsxLDMwIEBACis8IS0tIGNhbGxvdXQueHNsOiBjb252ZXJ0cyBhc2NpaWRvYyBjYWxsb3V0cyB0byBtYW4gcGFnZSBmb3JtYXQgLS0+Cis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJjbyI+CisJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCgnXGZCKCcsc3Vic3RyaW5nLWFmdGVyKEBpZCwnLScpLCcpXGZSJykiLz4KKzwveHNsOnRlbXBsYXRlPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2FsbG91dGxpc3QiPgorCTx4c2w6dGV4dD4uc3AmIzEwOzwveHNsOnRleHQ+CisJPHhzbDphcHBseS10ZW1wbGF0ZXMvPgorCTx4c2w6dGV4dD4mIzEwOzwveHNsOnRleHQ+Cis8L3hzbDp0ZW1wbGF0ZT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNhbGxvdXQiPgorCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoJ1xmQicsc3Vic3RyaW5nLWFmdGVyKEBhcmVhcmVmcywnLScpLCcuIFxmUicpIi8+CisJPHhzbDphcHBseS10ZW1wbGF0ZXMvPgorCTx4c2w6dGV4dD4uYnImIzEwOzwveHNsOnRleHQ+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSBzb3JyeSwgdGhpcyBpcyBub3QgYWJvdXQgY2FsbG91dHMsIGJ1dCBhdHRlbXB0cyB0byB3b3JrIGFyb3VuZAorIHNwdXJpb3VzIC5zcCBhdCB0aGUgdGFpbCBvZiB0aGUgbGluZSBkb2Nib29rIHN0eWxlc2hlZXRzIHNlZW0gdG8gYWRkIC0tPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic2ltcGFyYSI+CisgIDx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudCI+CisgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgorICA8L3hzbDp2YXJpYWJsZT4KKyAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5vcm1hbGl6ZS1zcGFjZSgkY29udGVudCkiLz4KKyAgPHhzbDppZiB0ZXN0PSJub3QoYW5jZXN0b3I6OmF1dGhvcmJsdXJiKSBhbmQKKyAgICAgICAgICAgICAgICBub3QoYW5jZXN0b3I6OnBlcnNvbmJsdXJiKSI+CisgICAgPHhzbDp0ZXh0PiYjMTA7JiMxMDs8L3hzbDp0ZXh0PgorICA8L3hzbDppZj4KKzwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jYXQtdGV4aS5wZXJsIGIvRG9jdW1lbnRhdGlvbi9jYXQtdGV4aS5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUzZDhlOWYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2NhdC10ZXhpLnBlcmwKQEAgLTAsMCArMSwzOCBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisKK215IEBtZW51ID0gKCk7CitteSAkb3V0cHV0ID0gJEFSR1ZbMF07CisKK29wZW4gVE1QLCAnPicsICIkb3V0cHV0LnRtcCI7CisKK3doaWxlICg8U1RESU4+KSB7CisJbmV4dCBpZiAoL15cXGlucHV0IHRleGluZm8vLi4vXEBub2RlIFRvcC8pOworCW5leHQgaWYgKC9eXEBieWUvIHx8IC9eXC5mdC8pOworCWlmIChzL15cQHRvcCAoLiopL1xAbm9kZSAkMSwsLFRvcC8pIHsKKwkJcHVzaCBAbWVudSwgJDE7CisJfQorCXMvXChcQHB4cmVme1xbVVJMU1xdfVwpLy87CisJcHJpbnQgVE1QOworfQorY2xvc2UgVE1QOworCitwcmludGYgJ1xpbnB1dCB0ZXhpbmZvCitAc2V0ZmlsZW5hbWUgZ2l0bWFuLmluZm8KK0Bkb2N1bWVudGVuY29kaW5nIHVzLWFzY2lpCitAbm9kZSBUb3AsLCVzCitAdG9wIEdpdCBNYW51YWwgUGFnZXMKK0Bkb2N1bWVudGxhbmd1YWdlIGVuCitAbWVudQorJywgJG1lbnVbMF07CisKK2ZvciAoQG1lbnUpIHsKKwlwcmludCAiKiAke199OjpcbiI7Cit9CitwcmludCAiXEBlbmQgbWVudVxuIjsKK29wZW4gVE1QLCAnPCcsICIkb3V0cHV0LnRtcCI7Cit3aGlsZSAoPFRNUD4pIHsKKwlwcmludDsKK30KK2Nsb3NlIFRNUDsKK3ByaW50ICJcQGJ5ZVxuIjsKK3VubGluayAiJG91dHB1dC50bXAiOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jbWQtbGlzdC5wZXJsIGIvRG9jdW1lbnRhdGlvbi9jbWQtbGlzdC5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA0Zjk5NzcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2NtZC1saXN0LnBlcmwKQEAgLTAsMCArMSw3NCBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisKK3VzZSBGaWxlOjpDb21wYXJlIHF3KGNvbXBhcmUpOworCitzdWIgZm9ybWF0X29uZSB7CisJbXkgKCRvdXQsICRuYW1lYXR0cikgPSBAXzsKKwlteSAoJG5hbWUsICRhdHRyKSA9IEAkbmFtZWF0dHI7CisJbXkgKCRzdGF0ZSwgJGRlc2NyaXB0aW9uKTsKKwkkc3RhdGUgPSAwOworCW9wZW4gSSwgJzwnLCAiJG5hbWUudHh0IiBvciBkaWUgIk5vIHN1Y2ggZmlsZSAkbmFtZS50eHQiOworCXdoaWxlICg8ST4pIHsKKwkJaWYgKC9eTkFNRSQvKSB7CisJCQkkc3RhdGUgPSAxOworCQkJbmV4dDsKKwkJfQorCQlpZiAoJHN0YXRlID09IDEgJiYgL14tLS0tJC8pIHsKKwkJCSRzdGF0ZSA9IDI7CisJCQluZXh0OworCQl9CisJCW5leHQgaWYgKCRzdGF0ZSAhPSAyKTsKKwkJY2hvbXA7CisJCSRkZXNjcmlwdGlvbiA9ICRfOworCQlsYXN0OworCX0KKwljbG9zZSBJOworCWlmICghZGVmaW5lZCAkZGVzY3JpcHRpb24pIHsKKwkJZGllICJObyBkZXNjcmlwdGlvbiBmb3VuZCBpbiAkbmFtZS50eHQiOworCX0KKwlpZiAobXkgKCR2ZXJpZnlfbmFtZSwgJHRleHQpID0gKCRkZXNjcmlwdGlvbiA9fiAvXigkbmFtZSkgLSAoLiopLykpIHsKKwkJcHJpbnQgJG91dCAibGlua2dpdDokbmFtZVxbMVxdOjpcblx0IjsKKwkJaWYgKCRhdHRyID1+IC8gZGVwcmVjYXRlZCAvKSB7CisJCQlwcmludCAkb3V0ICIoZGVwcmVjYXRlZCkgIjsKKwkJfQorCQlwcmludCAkb3V0ICIkdGV4dC5cblxuIjsKKwl9CisJZWxzZSB7CisJCWRpZSAiRGVzY3JpcHRpb24gZG9lcyBub3QgbWF0Y2ggJG5hbWU6ICRkZXNjcmlwdGlvbiI7CisJfQorfQorCitteSAlY21kcyA9ICgpOworZm9yIChzb3J0IDw+KSB7CisJbmV4dCBpZiAvXiMvOworCisJY2hvbXA7CisJbXkgKCRuYW1lLCAkY2F0LCAkYXR0cikgPSAvXihcUyspXHMrKC4qPykoPzpccysoLiopKT8kLzsKKwkkYXR0ciA9ICcnIHVubGVzcyBkZWZpbmVkICRhdHRyOworCXB1c2ggQHskY21kc3skY2F0fX0sIFskbmFtZSwgIiAkYXR0ciAiXTsKK30KKworZm9yIG15ICRjYXQgKHF3KGFuY2lsbGFyeWludGVycm9nYXRvcnMKKwkJYW5jaWxsYXJ5bWFuaXB1bGF0b3JzCisJCW1haW5wb3JjZWxhaW4KKwkJcGx1bWJpbmdpbnRlcnJvZ2F0b3JzCisJCXBsdW1iaW5nbWFuaXB1bGF0b3JzCisJCXN5bmNoaW5ncmVwb3NpdG9yaWVzCisJCWZvcmVpZ25zY21pbnRlcmZhY2UKKwkJcHVyZWhlbHBlcnMKKwkJc3luY2hlbHBlcnMpKSB7CisJbXkgJG91dCA9ICJjbWRzLSRjYXQudHh0IjsKKwlvcGVuIE8sICc+JywgIiRvdXQrIiBvciBkaWUgIkNhbm5vdCBvcGVuIG91dHB1dCBmaWxlICRvdXQrIjsKKwlmb3IgKEB7JGNtZHN7JGNhdH19KSB7CisJCWZvcm1hdF9vbmUoXCpPLCAkXyk7CisJfQorCWNsb3NlIE87CisKKwlpZiAoLWYgIiRvdXQiICYmIGNvbXBhcmUoIiRvdXQiLCAiJG91dCsiKSA9PSAwKSB7CisJCXVubGluayAiJG91dCsiOworCX0KKwllbHNlIHsKKwkJcHJpbnQgU1RERVJSICIkb3V0XG4iOworCQlyZW5hbWUgIiRvdXQrIiwgIiRvdXQiOworCX0KK30KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY29uZmlnLnR4dCBiL0RvY3VtZW50YXRpb24vY29uZmlnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGMwMWM1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9jb25maWcudHh0CkBAIC0wLDAgKzEsMTAxOCBAQAorQ09ORklHVVJBVElPTiBGSUxFCistLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGdpdCBjb25maWd1cmF0aW9uIGZpbGUgY29udGFpbnMgYSBudW1iZXIgb2YgdmFyaWFibGVzIHRoYXQgYWZmZWN0Cit0aGUgZ2l0IGNvbW1hbmQncyBiZWhhdmlvci4gYC5naXQvY29uZmlnYCBmaWxlIGZvciBlYWNoIHJlcG9zaXRvcnkKK2lzIHVzZWQgdG8gc3RvcmUgdGhlIGluZm9ybWF0aW9uIGZvciB0aGF0IHJlcG9zaXRvcnksIGFuZAorYCRIT01FLy5naXRjb25maWdgIGlzIHVzZWQgdG8gc3RvcmUgcGVyIHVzZXIgaW5mb3JtYXRpb24gdG8gZ2l2ZQorZmFsbGJhY2sgdmFsdWVzIGZvciBgLmdpdC9jb25maWdgIGZpbGUuIFRoZSBmaWxlIGAvZXRjL2dpdGNvbmZpZ2AKK2NhbiBiZSB1c2VkIHRvIHN0b3JlIHN5c3RlbS13aWRlIGRlZmF1bHRzLgorCitUaGV5IGNhbiBiZSB1c2VkIGJ5IGJvdGggdGhlIGdpdCBwbHVtYmluZworYW5kIHRoZSBwb3JjZWxhaW5zLiBUaGUgdmFyaWFibGVzIGFyZSBkaXZpZGVkIGludG8gc2VjdGlvbnMsIHdoZXJlCitpbiB0aGUgZnVsbHkgcXVhbGlmaWVkIHZhcmlhYmxlIG5hbWUgdGhlIHZhcmlhYmxlIGl0c2VsZiBpcyB0aGUgbGFzdAorZG90LXNlcGFyYXRlZCBzZWdtZW50IGFuZCB0aGUgc2VjdGlvbiBuYW1lIGlzIGV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSBsYXN0Citkb3QuIFRoZSB2YXJpYWJsZSBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgb25seSBhbHBoYW51bWVyaWMKK2NoYXJhY3RlcnMgYXJlIGFsbG93ZWQuIFNvbWUgdmFyaWFibGVzIG1heSBhcHBlYXIgbXVsdGlwbGUgdGltZXMuCisKK1N5bnRheAorfn5+fn5+CisKK1RoZSBzeW50YXggaXMgZmFpcmx5IGZsZXhpYmxlIGFuZCBwZXJtaXNzaXZlOyB3aGl0ZXNwYWNlcyBhcmUgbW9zdGx5CitpZ25vcmVkLiAgVGhlICcjJyBhbmQgJzsnIGNoYXJhY3RlcnMgYmVnaW4gY29tbWVudHMgdG8gdGhlIGVuZCBvZiBsaW5lLAorYmxhbmsgbGluZXMgYXJlIGlnbm9yZWQuCisKK1RoZSBmaWxlIGNvbnNpc3RzIG9mIHNlY3Rpb25zIGFuZCB2YXJpYWJsZXMuICBBIHNlY3Rpb24gYmVnaW5zIHdpdGgKK3RoZSBuYW1lIG9mIHRoZSBzZWN0aW9uIGluIHNxdWFyZSBicmFja2V0cyBhbmQgY29udGludWVzIHVudGlsIHRoZSBuZXh0CitzZWN0aW9uIGJlZ2lucy4gIFNlY3Rpb24gbmFtZXMgYXJlIG5vdCBjYXNlIHNlbnNpdGl2ZS4gIE9ubHkgYWxwaGFudW1lcmljCitjaGFyYWN0ZXJzLCAnYC1gJyBhbmQgJ2AuYCcgYXJlIGFsbG93ZWQgaW4gc2VjdGlvbiBuYW1lcy4gIEVhY2ggdmFyaWFibGUKK211c3QgYmVsb25nIHRvIHNvbWUgc2VjdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCB0aGVyZSBtdXN0IGJlIHNlY3Rpb24KK2hlYWRlciBiZWZvcmUgZmlyc3Qgc2V0dGluZyBvZiBhIHZhcmlhYmxlLgorCitTZWN0aW9ucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3Vic2VjdGlvbnMuICBUbyBiZWdpbiBhIHN1YnNlY3Rpb24KK3B1dCBpdHMgbmFtZSBpbiBkb3VibGUgcXVvdGVzLCBzZXBhcmF0ZWQgYnkgc3BhY2UgZnJvbSB0aGUgc2VjdGlvbiBuYW1lLAoraW4gdGhlIHNlY3Rpb24gaGVhZGVyLCBsaWtlIGluIGV4YW1wbGUgYmVsb3c6CisKKy0tLS0tLS0tCisJW3NlY3Rpb24gInN1YnNlY3Rpb24iXQorCistLS0tLS0tLQorCitTdWJzZWN0aW9uIG5hbWVzIGNhbiBjb250YWluIGFueSBjaGFyYWN0ZXJzIGV4Y2VwdCBuZXdsaW5lIChkb3VibGVxdW90ZQorJ2AiYCcgYW5kIGJhY2tzbGFzaCBoYXZlIHRvIGJlIGVzY2FwZWQgYXMgJ2BcImAnIGFuZCAnYFxcYCcsCityZXNwZWN0aXZlbHkpIGFuZCBhcmUgY2FzZSBzZW5zaXRpdmUuICBTZWN0aW9uIGhlYWRlciBjYW5ub3Qgc3BhbiBtdWx0aXBsZQorbGluZXMuICBWYXJpYWJsZXMgbWF5IGJlbG9uZyBkaXJlY3RseSB0byBhIHNlY3Rpb24gb3IgdG8gYSBnaXZlbiBzdWJzZWN0aW9uLgorWW91IGNhbiBoYXZlIGBbc2VjdGlvbl1gIGlmIHlvdSBoYXZlIGBbc2VjdGlvbiAic3Vic2VjdGlvbiJdYCwgYnV0IHlvdQorZG9uJ3QgbmVlZCB0by4KKworVGhlcmUgaXMgYWxzbyAoY2FzZSBpbnNlbnNpdGl2ZSkgYWx0ZXJuYXRpdmUgYFtzZWN0aW9uLnN1YnNlY3Rpb25dYCBzeW50YXguCitJbiB0aGlzIHN5bnRheCBzdWJzZWN0aW9uIG5hbWVzIGZvbGxvdyB0aGUgc2FtZSByZXN0cmljdGlvbnMgYXMgZm9yIHNlY3Rpb24KK25hbWUuCisKK0FsbCB0aGUgb3RoZXIgbGluZXMgYXJlIHJlY29nbml6ZWQgYXMgc2V0dGluZyB2YXJpYWJsZXMsIGluIHRoZSBmb3JtCisnbmFtZSA9IHZhbHVlJy4gIElmIHRoZXJlIGlzIG5vIGVxdWFsIHNpZ24gb24gdGhlIGxpbmUsIHRoZSBlbnRpcmUgbGluZQoraXMgdGFrZW4gYXMgJ25hbWUnIGFuZCB0aGUgdmFyaWFibGUgaXMgcmVjb2duaXplZCBhcyBib29sZWFuICJ0cnVlIi4KK1RoZSB2YXJpYWJsZSBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgb25seSBhbHBoYW51bWVyaWMKK2NoYXJhY3RlcnMgYW5kICdgLWAnIGFyZSBhbGxvd2VkLiAgVGhlcmUgY2FuIGJlIG1vcmUgdGhhbiBvbmUgdmFsdWUKK2ZvciBhIGdpdmVuIHZhcmlhYmxlOyB3ZSBzYXkgdGhlbiB0aGF0IHZhcmlhYmxlIGlzIG11bHRpdmFsdWVkLgorCitMZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGluIGEgdmFyaWFibGUgdmFsdWUgaXMgZGlzY2FyZGVkLgorSW50ZXJuYWwgd2hpdGVzcGFjZSB3aXRoaW4gYSB2YXJpYWJsZSB2YWx1ZSBpcyByZXRhaW5lZCB2ZXJiYXRpbS4KKworVGhlIHZhbHVlcyBmb2xsb3dpbmcgdGhlIGVxdWFscyBzaWduIGluIHZhcmlhYmxlIGFzc2lnbiBhcmUgYWxsIGVpdGhlcgorYSBzdHJpbmcsIGFuIGludGVnZXIsIG9yIGEgYm9vbGVhbi4gIEJvb2xlYW4gdmFsdWVzIG1heSBiZSBnaXZlbiBhcyB5ZXMvbm8sCiswLzEgb3IgdHJ1ZS9mYWxzZS4gIENhc2UgaXMgbm90IHNpZ25pZmljYW50IGluIGJvb2xlYW4gdmFsdWVzLCB3aGVuCitjb252ZXJ0aW5nIHZhbHVlIHRvIHRoZSBjYW5vbmljYWwgZm9ybSB1c2luZyAnLS1ib29sJyB0eXBlIHNwZWNpZmllcjsKK2BnaXQtY29uZmlnYCB3aWxsIGVuc3VyZSB0aGF0IHRoZSBvdXRwdXQgaXMgInRydWUiIG9yICJmYWxzZSIuCisKK1N0cmluZyB2YWx1ZXMgbWF5IGJlIGVudGlyZWx5IG9yIHBhcnRpYWxseSBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzLgorWW91IG5lZWQgdG8gZW5jbG9zZSB2YXJpYWJsZSB2YWx1ZSBpbiBkb3VibGUgcXVvdGVzIGlmIHlvdSB3YW50IHRvCitwcmVzZXJ2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UsIG9yIGlmIHZhcmlhYmxlIHZhbHVlIGNvbnRhaW5zCitiZWdpbm5pbmcgb2YgY29tbWVudCBjaGFyYWN0ZXJzIChpZiBpdCBjb250YWlucyAnIycgb3IgJzsnKS4KK0RvdWJsZSBxdW90ZSAnYCJgJyBhbmQgYmFja3NsYXNoICdgXGAnIGNoYXJhY3RlcnMgaW4gdmFyaWFibGUgdmFsdWUgbXVzdAorYmUgZXNjYXBlZDogdXNlICdgXCJgJyBmb3IgJ2AiYCcgYW5kICdgXFxgJyBmb3IgJ2BcYCcuCisKK1RoZSBmb2xsb3dpbmcgZXNjYXBlIHNlcXVlbmNlcyAoYmVzaWRlICdgXCJgJyBhbmQgJ2BcXGAnKSBhcmUgcmVjb2duaXplZDoKKydgXG5gJyBmb3IgbmV3bGluZSBjaGFyYWN0ZXIgKE5MKSwgJ2BcdGAnIGZvciBob3Jpem9udGFsIHRhYnVsYXRpb24gKEhULCBUQUIpCithbmQgJ2BcYmAnIGZvciBiYWNrc3BhY2UgKEJTKS4gIE5vIG90aGVyIGNoYXIgZXNjYXBlIHNlcXVlbmNlLCBub3Igb2N0YWwKK2NoYXIgc2VxdWVuY2VzIGFyZSB2YWxpZC4KKworVmFyaWFibGUgdmFsdWUgZW5kaW5nIGluIGEgJ2BcYCcgaXMgY29udGludWVkIG9uIHRoZSBuZXh0IGxpbmUgaW4gdGhlCitjdXN0b21hcnkgVU5JWCBmYXNoaW9uLgorCitTb21lIHZhcmlhYmxlcyBtYXkgcmVxdWlyZSBzcGVjaWFsIHZhbHVlIGZvcm1hdC4KKworRXhhbXBsZQorfn5+fn5+fgorCisJIyBDb3JlIHZhcmlhYmxlcworCVtjb3JlXQorCQk7IERvbid0IHRydXN0IGZpbGUgbW9kZXMKKwkJZmlsZW1vZGUgPSBmYWxzZQorCisJIyBPdXIgZGlmZiBhbGdvcml0aG0KKwlbZGlmZl0KKwkJZXh0ZXJuYWwgPSAiL3Vzci9sb2NhbC9iaW4vZ251LWRpZmYgLXUiCisJCXJlbmFtZXMgPSB0cnVlCisKKwlbYnJhbmNoICJkZXZlbCJdCisJCXJlbW90ZSA9IG9yaWdpbgorCQltZXJnZSA9IHJlZnMvaGVhZHMvZGV2ZWwKKworCSMgUHJveHkgc2V0dGluZ3MKKwlbY29yZV0KKwkJZ2l0UHJveHk9InNzaCIgZm9yICJrZXJuZWwub3JnIgorCQlnaXRQcm94eT1kZWZhdWx0LXByb3h5IDsgZm9yIHRoZSByZXN0CisKK1ZhcmlhYmxlcworfn5+fn5+fn5+CisKK05vdGUgdGhhdCB0aGlzIGxpc3QgaXMgbm9uLWNvbXByZWhlbnNpdmUgYW5kIG5vdCBuZWNlc3NhcmlseSBjb21wbGV0ZS4KK0ZvciBjb21tYW5kLXNwZWNpZmljIHZhcmlhYmxlcywgeW91IHdpbGwgZmluZCBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24KK2luIHRoZSBhcHByb3ByaWF0ZSBtYW51YWwgcGFnZS4gWW91IHdpbGwgZmluZCBhIGRlc2NyaXB0aW9uIG9mIG5vbi1jb3JlCitwb3JjZWxhaW4gY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgaW4gdGhlIHJlc3BlY3RpdmUgcG9yY2VsYWluIGRvY3VtZW50YXRpb24uCisKK2NvcmUuZmlsZU1vZGU6OgorCUlmIGZhbHNlLCB0aGUgZXhlY3V0YWJsZSBiaXQgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgaW5kZXggYW5kCisJdGhlIHdvcmtpbmcgY29weSBhcmUgaWdub3JlZDsgdXNlZnVsIG9uIGJyb2tlbiBmaWxlc3lzdGVtcyBsaWtlIEZBVC4KKwlTZWUgbGlua2dpdDpnaXQtdXBkYXRlLWluZGV4WzFdLiBUcnVlIGJ5IGRlZmF1bHQuCisKK2NvcmUucXVvdGVwYXRoOjoKKwlUaGUgY29tbWFuZHMgdGhhdCBvdXRwdXQgcGF0aHMgKGUuZy4gYGxzLWZpbGVzYCwKKwlgZGlmZmApLCB3aGVuIG5vdCBnaXZlbiB0aGUgYC16YCBvcHRpb24sIHdpbGwgcXVvdGUKKwkidW51c3VhbCIgY2hhcmFjdGVycyBpbiB0aGUgcGF0aG5hbWUgYnkgZW5jbG9zaW5nIHRoZQorCXBhdGhuYW1lIGluIGEgZG91YmxlLXF1b3RlIHBhaXIgYW5kIHdpdGggYmFja3NsYXNoZXMgdGhlCisJc2FtZSB3YXkgc3RyaW5ncyBpbiBDIHNvdXJjZSBjb2RlIGFyZSBxdW90ZWQuICBJZiB0aGlzCisJdmFyaWFibGUgaXMgc2V0IHRvIGZhbHNlLCB0aGUgYnl0ZXMgaGlnaGVyIHRoYW4gMHg4MCBhcmUKKwlub3QgcXVvdGVkIGJ1dCBvdXRwdXQgYXMgdmVyYmF0aW0uICBOb3RlIHRoYXQgZG91YmxlCisJcXVvdGUsIGJhY2tzbGFzaCBhbmQgY29udHJvbCBjaGFyYWN0ZXJzIGFyZSBhbHdheXMKKwlxdW90ZWQgd2l0aG91dCBgLXpgIHJlZ2FyZGxlc3Mgb2YgdGhlIHNldHRpbmcgb2YgdGhpcworCXZhcmlhYmxlLgorCitjb3JlLmF1dG9jcmxmOjoKKwlJZiB0cnVlLCBtYWtlcyBnaXQgY29udmVydCBgQ1JMRmAgYXQgdGhlIGVuZCBvZiBsaW5lcyBpbiB0ZXh0IGZpbGVzIHRvCisJYExGYCB3aGVuIHJlYWRpbmcgZnJvbSB0aGUgZmlsZXN5c3RlbSwgYW5kIGNvbnZlcnQgaW4gcmV2ZXJzZSB3aGVuCisJd3JpdGluZyB0byB0aGUgZmlsZXN5c3RlbS4gIFRoZSB2YXJpYWJsZSBjYW4gYmUgc2V0IHRvCisJJ2lucHV0JywgaW4gd2hpY2ggY2FzZSB0aGUgY29udmVyc2lvbiBoYXBwZW5zIG9ubHkgd2hpbGUKKwlyZWFkaW5nIGZyb20gdGhlIGZpbGVzeXN0ZW0gYnV0IGZpbGVzIGFyZSB3cml0dGVuIG91dCB3aXRoCisJYExGYCBhdCB0aGUgZW5kIG9mIGxpbmVzLiAgQ3VycmVudGx5LCB3aGljaCBwYXRocyB0byBjb25zaWRlcgorCSJ0ZXh0IiAoaS5lLiBiZSBzdWJqZWN0ZWQgdG8gdGhlIGF1dG9jcmxmIG1lY2hhbmlzbSkgaXMKKwlkZWNpZGVkIHB1cmVseSBiYXNlZCBvbiB0aGUgY29udGVudHMuCisKK2NvcmUuc2FmZWNybGY6OgorCUlmIHRydWUsIG1ha2VzIGdpdCBjaGVjayBpZiBjb252ZXJ0aW5nIGBDUkxGYCBhcyBjb250cm9sbGVkIGJ5CisJYGNvcmUuYXV0b2NybGZgIGlzIHJldmVyc2libGUuICBHaXQgd2lsbCB2ZXJpZnkgaWYgYSBjb21tYW5kCisJbW9kaWZpZXMgYSBmaWxlIGluIHRoZSB3b3JrIHRyZWUgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCisJRm9yIGV4YW1wbGUsIGNvbW1pdHRpbmcgYSBmaWxlIGZvbGxvd2VkIGJ5IGNoZWNraW5nIG91dCB0aGUKKwlzYW1lIGZpbGUgc2hvdWxkIHlpZWxkIHRoZSBvcmlnaW5hbCBmaWxlIGluIHRoZSB3b3JrIHRyZWUuICBJZgorCXRoaXMgaXMgbm90IHRoZSBjYXNlIGZvciB0aGUgY3VycmVudCBzZXR0aW5nIG9mCisJYGNvcmUuYXV0b2NybGZgLCBnaXQgd2lsbCByZWplY3QgdGhlIGZpbGUuICBUaGUgdmFyaWFibGUgY2FuCisJYmUgc2V0IHRvICJ3YXJuIiwgaW4gd2hpY2ggY2FzZSBnaXQgd2lsbCBvbmx5IHdhcm4gYWJvdXQgYW4KKwlpcnJldmVyc2libGUgY29udmVyc2lvbiBidXQgY29udGludWUgdGhlIG9wZXJhdGlvbi4KKysKK0NSTEYgY29udmVyc2lvbiBiZWFycyBhIHNsaWdodCBjaGFuY2Ugb2YgY29ycnVwdGluZyBkYXRhLgorYXV0b2NybGY9dHJ1ZSB3aWxsIGNvbnZlcnQgQ1JMRiB0byBMRiBkdXJpbmcgY29tbWl0IGFuZCBMRiB0bworQ1JMRiBkdXJpbmcgY2hlY2tvdXQuICBBIGZpbGUgdGhhdCBjb250YWlucyBhIG1peHR1cmUgb2YgTEYgYW5kCitDUkxGIGJlZm9yZSB0aGUgY29tbWl0IGNhbm5vdCBiZSByZWNyZWF0ZWQgYnkgZ2l0LiAgRm9yIHRleHQKK2ZpbGVzIHRoaXMgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvOiBpdCBjb3JyZWN0cyBsaW5lIGVuZGluZ3MKK3N1Y2ggdGhhdCB3ZSBoYXZlIG9ubHkgTEYgbGluZSBlbmRpbmdzIGluIHRoZSByZXBvc2l0b3J5LgorQnV0IGZvciBiaW5hcnkgZmlsZXMgdGhhdCBhcmUgYWNjaWRlbnRhbGx5IGNsYXNzaWZpZWQgYXMgdGV4dCB0aGUKK2NvbnZlcnNpb24gY2FuIGNvcnJ1cHQgZGF0YS4KKysKK0lmIHlvdSByZWNvZ25pemUgc3VjaCBjb3JydXB0aW9uIGVhcmx5IHlvdSBjYW4gZWFzaWx5IGZpeCBpdCBieQorc2V0dGluZyB0aGUgY29udmVyc2lvbiB0eXBlIGV4cGxpY2l0bHkgaW4gLmdpdGF0dHJpYnV0ZXMuICBSaWdodAorYWZ0ZXIgY29tbWl0dGluZyB5b3Ugc3RpbGwgaGF2ZSB0aGUgb3JpZ2luYWwgZmlsZSBpbiB5b3VyIHdvcmsKK3RyZWUgYW5kIHRoaXMgZmlsZSBpcyBub3QgeWV0IGNvcnJ1cHRlZC4gIFlvdSBjYW4gZXhwbGljaXRseSB0ZWxsCitnaXQgdGhhdCB0aGlzIGZpbGUgaXMgYmluYXJ5IGFuZCBnaXQgd2lsbCBoYW5kbGUgdGhlIGZpbGUKK2FwcHJvcHJpYXRlbHkuCisrCitVbmZvcnR1bmF0ZWx5LCB0aGUgZGVzaXJlZCBlZmZlY3Qgb2YgY2xlYW5pbmcgdXAgdGV4dCBmaWxlcyB3aXRoCittaXhlZCBsaW5lIGVuZGluZ3MgYW5kIHRoZSB1bmRlc2lyZWQgZWZmZWN0IG9mIGNvcnJ1cHRpbmcgYmluYXJ5CitmaWxlcyBjYW5ub3QgYmUgZGlzdGluZ3Vpc2hlZC4gIEluIGJvdGggY2FzZXMgQ1JMRnMgYXJlIHJlbW92ZWQKK2luIGFuIGlycmV2ZXJzaWJsZSB3YXkuICBGb3IgdGV4dCBmaWxlcyB0aGlzIGlzIHRoZSByaWdodCB0aGluZwordG8gZG8gYmVjYXVzZSBDUkxGcyBhcmUgbGluZSBlbmRpbmdzLCB3aGlsZSBmb3IgYmluYXJ5IGZpbGVzCitjb252ZXJ0aW5nIENSTEZzIGNvcnJ1cHRzIGRhdGEuCisrCitOb3RlLCB0aGlzIHNhZmV0eSBjaGVjayBkb2VzIG5vdCBtZWFuIHRoYXQgYSBjaGVja291dCB3aWxsIGdlbmVyYXRlIGEKK2ZpbGUgaWRlbnRpY2FsIHRvIHRoZSBvcmlnaW5hbCBmaWxlIGZvciBhIGRpZmZlcmVudCBzZXR0aW5nIG9mCitgY29yZS5hdXRvY3JsZmAsIGJ1dCBvbmx5IGZvciB0aGUgY3VycmVudCBvbmUuICBGb3IgZXhhbXBsZSwgYSB0ZXh0CitmaWxlIHdpdGggYExGYCB3b3VsZCBiZSBhY2NlcHRlZCB3aXRoIGBjb3JlLmF1dG9jcmxmPWlucHV0YCBhbmQgY291bGQKK2xhdGVyIGJlIGNoZWNrZWQgb3V0IHdpdGggYGNvcmUuYXV0b2NybGY9dHJ1ZWAsIGluIHdoaWNoIGNhc2UgdGhlCityZXN1bHRpbmcgZmlsZSB3b3VsZCBjb250YWluIGBDUkxGYCwgYWx0aG91Z2ggdGhlIG9yaWdpbmFsIGZpbGUKK2NvbnRhaW5lZCBgTEZgLiAgSG93ZXZlciwgaW4gYm90aCB3b3JrIHRyZWVzIHRoZSBsaW5lIGVuZGluZ3Mgd291bGQgYmUKK2NvbnNpc3RlbnQsIHRoYXQgaXMgZWl0aGVyIGFsbCBgTEZgIG9yIGFsbCBgQ1JMRmAsIGJ1dCBuZXZlciBtaXhlZC4gIEEKK2ZpbGUgd2l0aCBtaXhlZCBsaW5lIGVuZGluZ3Mgd291bGQgYmUgcmVwb3J0ZWQgYnkgdGhlIGBjb3JlLnNhZmVjcmxmYAorbWVjaGFuaXNtLgorCitjb3JlLnN5bWxpbmtzOjoKKwlJZiBmYWxzZSwgc3ltYm9saWMgbGlua3MgYXJlIGNoZWNrZWQgb3V0IGFzIHNtYWxsIHBsYWluIGZpbGVzIHRoYXQKKwljb250YWluIHRoZSBsaW5rIHRleHQuIGxpbmtnaXQ6Z2l0LXVwZGF0ZS1pbmRleFsxXSBhbmQKKwlsaW5rZ2l0OmdpdC1hZGRbMV0gd2lsbCBub3QgY2hhbmdlIHRoZSByZWNvcmRlZCB0eXBlIHRvIHJlZ3VsYXIKKwlmaWxlLiBVc2VmdWwgb24gZmlsZXN5c3RlbXMgbGlrZSBGQVQgdGhhdCBkbyBub3Qgc3VwcG9ydAorCXN5bWJvbGljIGxpbmtzLiBUcnVlIGJ5IGRlZmF1bHQuCisKK2NvcmUuZ2l0UHJveHk6OgorCUEgInByb3h5IGNvbW1hbmQiIHRvIGV4ZWN1dGUgKGFzICdjb21tYW5kIGhvc3QgcG9ydCcpIGluc3RlYWQKKwlvZiBlc3RhYmxpc2hpbmcgZGlyZWN0IGNvbm5lY3Rpb24gdG8gdGhlIHJlbW90ZSBzZXJ2ZXIgd2hlbgorCXVzaW5nIHRoZSBnaXQgcHJvdG9jb2wgZm9yIGZldGNoaW5nLiBJZiB0aGUgdmFyaWFibGUgdmFsdWUgaXMKKwlpbiB0aGUgIkNPTU1BTkQgZm9yIERPTUFJTiIgZm9ybWF0LCB0aGUgY29tbWFuZCBpcyBhcHBsaWVkIG9ubHkKKwlvbiBob3N0bmFtZXMgZW5kaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkb21haW4gc3RyaW5nLiBUaGlzIHZhcmlhYmxlCisJbWF5IGJlIHNldCBtdWx0aXBsZSB0aW1lcyBhbmQgaXMgbWF0Y2hlZCBpbiB0aGUgZ2l2ZW4gb3JkZXI7CisJdGhlIGZpcnN0IG1hdGNoIHdpbnMuCisrCitDYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgJ0dJVF9QUk9YWV9DT01NQU5EJyBlbnZpcm9ubWVudCB2YXJpYWJsZQorKHdoaWNoIGFsd2F5cyBhcHBsaWVzIHVuaXZlcnNhbGx5LCB3aXRob3V0IHRoZSBzcGVjaWFsICJmb3IiCitoYW5kbGluZykuCisKK2NvcmUuaWdub3JlU3RhdDo6CisJVGhlIHdvcmtpbmcgY29weSBmaWxlcyBhcmUgYXNzdW1lZCB0byBzdGF5IHVuY2hhbmdlZCB1bnRpbCB5b3UKKwltYXJrIHRoZW0gb3RoZXJ3aXNlIG1hbnVhbGx5IC0gR2l0IHdpbGwgbm90IGRldGVjdCB0aGUgZmlsZSBjaGFuZ2VzCisJYnkgbHN0YXQoKSBjYWxscy4gVGhpcyBpcyB1c2VmdWwgb24gc3lzdGVtcyB3aGVyZSB0aG9zZSBhcmUgdmVyeQorCXNsb3csIHN1Y2ggYXMgTWljcm9zb2Z0IFdpbmRvd3MuICBTZWUgbGlua2dpdDpnaXQtdXBkYXRlLWluZGV4WzFdLgorCUZhbHNlIGJ5IGRlZmF1bHQuCisKK2NvcmUucHJlZmVyU3ltbGlua1JlZnM6OgorCUluc3RlYWQgb2YgdGhlIGRlZmF1bHQgInN5bXJlZiIgZm9ybWF0IGZvciBIRUFECisJYW5kIG90aGVyIHN5bWJvbGljIHJlZmVyZW5jZSBmaWxlcywgdXNlIHN5bWJvbGljIGxpbmtzLgorCVRoaXMgaXMgc29tZXRpbWVzIG5lZWRlZCB0byB3b3JrIHdpdGggb2xkIHNjcmlwdHMgdGhhdAorCWV4cGVjdCBIRUFEIHRvIGJlIGEgc3ltYm9saWMgbGluay4KKworY29yZS5iYXJlOjoKKwlJZiB0cnVlIHRoaXMgcmVwb3NpdG9yeSBpcyBhc3N1bWVkIHRvIGJlICdiYXJlJyBhbmQgaGFzIG5vCisJd29ya2luZyBkaXJlY3RvcnkgYXNzb2NpYXRlZCB3aXRoIGl0LiAgSWYgdGhpcyBpcyB0aGUgY2FzZSBhCisJbnVtYmVyIG9mIGNvbW1hbmRzIHRoYXQgcmVxdWlyZSBhIHdvcmtpbmcgZGlyZWN0b3J5IHdpbGwgYmUKKwlkaXNhYmxlZCwgc3VjaCBhcyBsaW5rZ2l0OmdpdC1hZGRbMV0gb3IgbGlua2dpdDpnaXQtbWVyZ2VbMV0uCisrCitUaGlzIHNldHRpbmcgaXMgYXV0b21hdGljYWxseSBndWVzc2VkIGJ5IGxpbmtnaXQ6Z2l0LWNsb25lWzFdIG9yCitsaW5rZ2l0OmdpdC1pbml0WzFdIHdoZW4gdGhlIHJlcG9zaXRvcnkgd2FzIGNyZWF0ZWQuICBCeSBkZWZhdWx0IGEKK3JlcG9zaXRvcnkgdGhhdCBlbmRzIGluICIvLmdpdCIgaXMgYXNzdW1lZCB0byBiZSBub3QgYmFyZSAoYmFyZSA9CitmYWxzZSksIHdoaWxlIGFsbCBvdGhlciByZXBvc2l0b3JpZXMgYXJlIGFzc3VtZWQgdG8gYmUgYmFyZSAoYmFyZQorPSB0cnVlKS4KKworY29yZS53b3JrdHJlZTo6CisJU2V0IHRoZSBwYXRoIHRvIHRoZSB3b3JraW5nIHRyZWUuICBUaGUgdmFsdWUgd2lsbCBub3QgYmUKKwl1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggcmVwb3NpdG9yaWVzIGZvdW5kIGF1dG9tYXRpY2FsbHkgaW4KKwlhIC5naXQgZGlyZWN0b3J5IChpLmUuICRHSVRfRElSIGlzIG5vdCBzZXQpLgorCVRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIEdJVF9XT1JLX1RSRUUgZW52aXJvbm1lbnQKKwl2YXJpYWJsZSBhbmQgdGhlICctLXdvcmstdHJlZScgY29tbWFuZCBsaW5lIG9wdGlvbi4KKworY29yZS5sb2dBbGxSZWZVcGRhdGVzOjoKKwlFbmFibGUgdGhlIHJlZmxvZy4gVXBkYXRlcyB0byBhIHJlZiA8cmVmPiBpcyBsb2dnZWQgdG8gdGhlIGZpbGUKKwkiJEdJVF9ESVIvbG9ncy88cmVmPiIsIGJ5IGFwcGVuZGluZyB0aGUgbmV3IGFuZCBvbGQKKwlTSEExLCB0aGUgZGF0ZS90aW1lIGFuZCB0aGUgcmVhc29uIG9mIHRoZSB1cGRhdGUsIGJ1dAorCW9ubHkgd2hlbiB0aGUgZmlsZSBleGlzdHMuICBJZiB0aGlzIGNvbmZpZ3VyYXRpb24KKwl2YXJpYWJsZSBpcyBzZXQgdG8gdHJ1ZSwgbWlzc2luZyAiJEdJVF9ESVIvbG9ncy88cmVmPiIKKwlmaWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmb3IgYnJhbmNoIGhlYWRzLgorKworVGhpcyBpbmZvcm1hdGlvbiBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hhdCBjb21taXQKK3dhcyB0aGUgdGlwIG9mIGEgYnJhbmNoICIyIGRheXMgYWdvIi4KKysKK1RoaXMgdmFsdWUgaXMgdHJ1ZSBieSBkZWZhdWx0IGluIGEgcmVwb3NpdG9yeSB0aGF0IGhhcworYSB3b3JraW5nIGRpcmVjdG9yeSBhc3NvY2lhdGVkIHdpdGggaXQsIGFuZCBmYWxzZSBieQorZGVmYXVsdCBpbiBhIGJhcmUgcmVwb3NpdG9yeS4KKworY29yZS5yZXBvc2l0b3J5Rm9ybWF0VmVyc2lvbjo6CisJSW50ZXJuYWwgdmFyaWFibGUgaWRlbnRpZnlpbmcgdGhlIHJlcG9zaXRvcnkgZm9ybWF0IGFuZCBsYXlvdXQKKwl2ZXJzaW9uLgorCitjb3JlLnNoYXJlZFJlcG9zaXRvcnk6OgorCVdoZW4gJ2dyb3VwJyAob3IgJ3RydWUnKSwgdGhlIHJlcG9zaXRvcnkgaXMgbWFkZSBzaGFyZWFibGUgYmV0d2VlbgorCXNldmVyYWwgdXNlcnMgaW4gYSBncm91cCAobWFraW5nIHN1cmUgYWxsIHRoZSBmaWxlcyBhbmQgb2JqZWN0cyBhcmUKKwlncm91cC13cml0YWJsZSkuIFdoZW4gJ2FsbCcgKG9yICd3b3JsZCcgb3IgJ2V2ZXJ5Ym9keScpLCB0aGUKKwlyZXBvc2l0b3J5IHdpbGwgYmUgcmVhZGFibGUgYnkgYWxsIHVzZXJzLCBhZGRpdGlvbmFsbHkgdG8gYmVpbmcKKwlncm91cC1zaGFyZWFibGUuIFdoZW4gJ3VtYXNrJyAob3IgJ2ZhbHNlJyksIGdpdCB3aWxsIHVzZSBwZXJtaXNzaW9ucworCXJlcG9ydGVkIGJ5IHVtYXNrKDIpLiBTZWUgbGlua2dpdDpnaXQtaW5pdFsxXS4gRmFsc2UgYnkgZGVmYXVsdC4KKworY29yZS53YXJuQW1iaWd1b3VzUmVmczo6CisJSWYgdHJ1ZSwgZ2l0IHdpbGwgd2FybiB5b3UgaWYgdGhlIHJlZiBuYW1lIHlvdSBwYXNzZWQgaXQgaXMgYW1iaWd1b3VzCisJYW5kIG1pZ2h0IG1hdGNoIG11bHRpcGxlIHJlZnMgaW4gdGhlIC5naXQvcmVmcy8gdHJlZS4gVHJ1ZSBieSBkZWZhdWx0LgorCitjb3JlLmNvbXByZXNzaW9uOjoKKwlBbiBpbnRlZ2VyIC0xLi45LCBpbmRpY2F0aW5nIGEgZGVmYXVsdCBjb21wcmVzc2lvbiBsZXZlbC4KKwktMSBpcyB0aGUgemxpYiBkZWZhdWx0LiAwIG1lYW5zIG5vIGNvbXByZXNzaW9uLAorCWFuZCAxLi45IGFyZSB2YXJpb3VzIHNwZWVkL3NpemUgdHJhZGVvZmZzLCA5IGJlaW5nIHNsb3dlc3QuCisJSWYgc2V0LCB0aGlzIHByb3ZpZGVzIGEgZGVmYXVsdCB0byBvdGhlciBjb21wcmVzc2lvbiB2YXJpYWJsZXMsCisJc3VjaCBhcyAnY29yZS5sb29zZWNvbXByZXNzaW9uJyBhbmQgJ3BhY2suY29tcHJlc3Npb24nLgorCitjb3JlLmxvb3NlY29tcHJlc3Npb246OgorCUFuIGludGVnZXIgLTEuLjksIGluZGljYXRpbmcgdGhlIGNvbXByZXNzaW9uIGxldmVsIGZvciBvYmplY3RzIHRoYXQKKwlhcmUgbm90IGluIGEgcGFjayBmaWxlLiAtMSBpcyB0aGUgemxpYiBkZWZhdWx0LiAwIG1lYW5zIG5vCisJY29tcHJlc3Npb24sIGFuZCAxLi45IGFyZSB2YXJpb3VzIHNwZWVkL3NpemUgdHJhZGVvZmZzLCA5IGJlaW5nCisJc2xvd2VzdC4gIElmIG5vdCBzZXQsICBkZWZhdWx0cyB0byBjb3JlLmNvbXByZXNzaW9uLiAgSWYgdGhhdCBpcworCW5vdCBzZXQsICBkZWZhdWx0cyB0byAxIChiZXN0IHNwZWVkKS4KKworY29yZS5wYWNrZWRHaXRXaW5kb3dTaXplOjoKKwlOdW1iZXIgb2YgYnl0ZXMgb2YgYSBwYWNrIGZpbGUgdG8gbWFwIGludG8gbWVtb3J5IGluIGEKKwlzaW5nbGUgbWFwcGluZyBvcGVyYXRpb24uICBMYXJnZXIgd2luZG93IHNpemVzIG1heSBhbGxvdworCXlvdXIgc3lzdGVtIHRvIHByb2Nlc3MgYSBzbWFsbGVyIG51bWJlciBvZiBsYXJnZSBwYWNrIGZpbGVzCisJbW9yZSBxdWlja2x5LiAgU21hbGxlciB3aW5kb3cgc2l6ZXMgd2lsbCBuZWdhdGl2ZWx5IGFmZmVjdAorCXBlcmZvcm1hbmNlIGR1ZSB0byBpbmNyZWFzZWQgY2FsbHMgdG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0ncworCW1lbW9yeSBtYW5hZ2VyLCBidXQgbWF5IGltcHJvdmUgcGVyZm9ybWFuY2Ugd2hlbiBhY2Nlc3NpbmcKKwlhIGxhcmdlIG51bWJlciBvZiBsYXJnZSBwYWNrIGZpbGVzLgorKworRGVmYXVsdCBpcyAxIE1pQiBpZiBOT19NTUFQIHdhcyBzZXQgYXQgY29tcGlsZSB0aW1lLCBvdGhlcndpc2UgMzIKK01pQiBvbiAzMiBiaXQgcGxhdGZvcm1zIGFuZCAxIEdpQiBvbiA2NCBiaXQgcGxhdGZvcm1zLiAgVGhpcyBzaG91bGQKK2JlIHJlYXNvbmFibGUgZm9yIGFsbCB1c2Vycy9vcGVyYXRpbmcgc3lzdGVtcy4gIFlvdSBwcm9iYWJseSBkbworbm90IG5lZWQgdG8gYWRqdXN0IHRoaXMgdmFsdWUuCisrCitDb21tb24gdW5pdCBzdWZmaXhlcyBvZiAnaycsICdtJywgb3IgJ2cnIGFyZSBzdXBwb3J0ZWQuCisKK2NvcmUucGFja2VkR2l0TGltaXQ6OgorCU1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIG1hcCBzaW11bHRhbmVvdXNseSBpbnRvIG1lbW9yeQorCWZyb20gcGFjayBmaWxlcy4gIElmIEdpdCBuZWVkcyB0byBhY2Nlc3MgbW9yZSB0aGFuIHRoaXMgbWFueQorCWJ5dGVzIGF0IG9uY2UgdG8gY29tcGxldGUgYW4gb3BlcmF0aW9uIGl0IHdpbGwgdW5tYXAgZXhpc3RpbmcKKwlyZWdpb25zIHRvIHJlY2xhaW0gdmlydHVhbCBhZGRyZXNzIHNwYWNlIHdpdGhpbiB0aGUgcHJvY2Vzcy4KKysKK0RlZmF1bHQgaXMgMjU2IE1pQiBvbiAzMiBiaXQgcGxhdGZvcm1zIGFuZCA4IEdpQiBvbiA2NCBiaXQgcGxhdGZvcm1zLgorVGhpcyBzaG91bGQgYmUgcmVhc29uYWJsZSBmb3IgYWxsIHVzZXJzL29wZXJhdGluZyBzeXN0ZW1zLCBleGNlcHQgb24KK3RoZSBsYXJnZXN0IHByb2plY3RzLiAgWW91IHByb2JhYmx5IGRvIG5vdCBuZWVkIHRvIGFkanVzdCB0aGlzIHZhbHVlLgorKworQ29tbW9uIHVuaXQgc3VmZml4ZXMgb2YgJ2snLCAnbScsIG9yICdnJyBhcmUgc3VwcG9ydGVkLgorCitjb3JlLmRlbHRhQmFzZUNhY2hlTGltaXQ6OgorCU1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlc2VydmUgZm9yIGNhY2hpbmcgYmFzZSBvYmplY3RzCisJdGhhdCBtdWx0aXBsZSBkZWx0YWZpZWQgb2JqZWN0cyByZWZlcmVuY2UuICBCeSBzdG9yaW5nIHRoZQorCWVudGlyZSBkZWNvbXByZXNzZWQgYmFzZSBvYmplY3RzIGluIGEgY2FjaGUgR2l0IGlzIGFibGUKKwl0byBhdm9pZCB1bnBhY2tpbmcgYW5kIGRlY29tcHJlc3NpbmcgZnJlcXVlbnRseSB1c2VkIGJhc2UKKwlvYmplY3RzIG11bHRpcGxlIHRpbWVzLgorKworRGVmYXVsdCBpcyAxNiBNaUIgb24gYWxsIHBsYXRmb3Jtcy4gIFRoaXMgc2hvdWxkIGJlIHJlYXNvbmFibGUKK2ZvciBhbGwgdXNlcnMvb3BlcmF0aW5nIHN5c3RlbXMsIGV4Y2VwdCBvbiB0aGUgbGFyZ2VzdCBwcm9qZWN0cy4KK1lvdSBwcm9iYWJseSBkbyBub3QgbmVlZCB0byBhZGp1c3QgdGhpcyB2YWx1ZS4KKysKK0NvbW1vbiB1bml0IHN1ZmZpeGVzIG9mICdrJywgJ20nLCBvciAnZycgYXJlIHN1cHBvcnRlZC4KKworY29yZS5leGNsdWRlc2ZpbGU6OgorCUluIGFkZGl0aW9uIHRvICcuZ2l0aWdub3JlJyAocGVyLWRpcmVjdG9yeSkgYW5kCisJJy5naXQvaW5mby9leGNsdWRlJywgZ2l0IGxvb2tzIGludG8gdGhpcyBmaWxlIGZvciBwYXR0ZXJucworCW9mIGZpbGVzIHdoaWNoIGFyZSBub3QgbWVhbnQgdG8gYmUgdHJhY2tlZC4gIFNlZQorCWxpbmtnaXQ6Z2l0aWdub3JlWzVdLgorCitjb3JlLmVkaXRvcjo6CisJQ29tbWFuZHMgc3VjaCBhcyBgY29tbWl0YCBhbmQgYHRhZ2AgdGhhdCBsZXRzIHlvdSBlZGl0CisJbWVzc2FnZXMgYnkgbGF1bmNoaW5nIGFuIGVkaXRvciB1c2VzIHRoZSB2YWx1ZSBvZiB0aGlzCisJdmFyaWFibGUgd2hlbiBpdCBpcyBzZXQsIGFuZCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKwlgR0lUX0VESVRPUmAgaXMgbm90IHNldC4gIFRoZSBvcmRlciBvZiBwcmVmZXJlbmNlIGlzCisJYEdJVF9FRElUT1JgIGVudmlyb25tZW50LCBgY29yZS5lZGl0b3JgLCBgVklTVUFMYCBhbmQKKwlgRURJVE9SYCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIHRoZW4gZmluYWxseSBgdmlgLgorCitjb3JlLnBhZ2VyOjoKKwlUaGUgY29tbWFuZCB0aGF0IGdpdCB3aWxsIHVzZSB0byBwYWdpbmF0ZSBvdXRwdXQuICBDYW4gYmUgb3ZlcnJpZGRlbgorCXdpdGggdGhlIGBHSVRfUEFHRVJgIGVudmlyb25tZW50IHZhcmlhYmxlLgorCitjb3JlLndoaXRlc3BhY2U6OgorCUEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgY29tbW9uIHdoaXRlc3BhY2UgcHJvYmxlbXMgdG8KKwlub3RpY2UuICBgZ2l0IGRpZmZgIHdpbGwgdXNlIGBjb2xvci5kaWZmLndoaXRlc3BhY2VgIHRvCisJaGlnaGxpZ2h0IHRoZW0sIGFuZCBgZ2l0IGFwcGx5IC0td2hpdGVzcGFjZT1lcnJvcmAgd2lsbAorCWNvbnNpZGVyIHRoZW0gYXMgZXJyb3JzOgorKworKiBgdHJhaWxpbmctc3BhY2VgIHRyZWF0cyB0cmFpbGluZyB3aGl0ZXNwYWNlcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lCisgIGFzIGFuIGVycm9yIChlbmFibGVkIGJ5IGRlZmF1bHQpLgorKiBgc3BhY2UtYmVmb3JlLXRhYmAgdHJlYXRzIGEgc3BhY2UgY2hhcmFjdGVyIHRoYXQgYXBwZWFycyBpbW1lZGlhdGVseQorICBiZWZvcmUgYSB0YWIgY2hhcmFjdGVyIGluIHRoZSBpbml0aWFsIGluZGVudCBwYXJ0IG9mIHRoZSBsaW5lIGFzIGFuCisgIGVycm9yIChlbmFibGVkIGJ5IGRlZmF1bHQpLgorKiBgaW5kZW50LXdpdGgtbm9uLXRhYmAgdHJlYXRzIGEgbGluZSB0aGF0IGlzIGluZGVudGVkIHdpdGggOCBvciBtb3JlCisgIHNwYWNlIGNoYXJhY3RlcnMgYXMgYW4gZXJyb3IgKG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQpLgorKiBgY3ItYXQtZW9sYCB0cmVhdHMgYSBjYXJyaWFnZS1yZXR1cm4gYXQgdGhlIGVuZCBvZiBsaW5lIGFzCisgIHBhcnQgb2YgdGhlIGxpbmUgdGVybWluYXRvciwgaS5lLiB3aXRoIGl0LCBgdHJhaWxpbmctc3BhY2VgCisgIGRvZXMgbm90IHRyaWdnZXIgaWYgdGhlIGNoYXJhY3RlciBiZWZvcmUgc3VjaCBhIGNhcnJpYWdlLXJldHVybgorICBpcyBub3QgYSB3aGl0ZXNwYWNlIChub3QgZW5hYmxlZCBieSBkZWZhdWx0KS4KKworYWxpYXMuKjo6CisJQ29tbWFuZCBhbGlhc2VzIGZvciB0aGUgbGlua2dpdDpnaXRbMV0gY29tbWFuZCB3cmFwcGVyIC0gZS5nLgorCWFmdGVyIGRlZmluaW5nICJhbGlhcy5sYXN0ID0gY2F0LWZpbGUgY29tbWl0IEhFQUQiLCB0aGUgaW52b2NhdGlvbgorCSJnaXQgbGFzdCIgaXMgZXF1aXZhbGVudCB0byAiZ2l0IGNhdC1maWxlIGNvbW1pdCBIRUFEIi4gVG8gYXZvaWQKKwljb25mdXNpb24gYW5kIHRyb3VibGVzIHdpdGggc2NyaXB0IHVzYWdlLCBhbGlhc2VzIHRoYXQKKwloaWRlIGV4aXN0aW5nIGdpdCBjb21tYW5kcyBhcmUgaWdub3JlZC4gQXJndW1lbnRzIGFyZSBzcGxpdCBieQorCXNwYWNlcywgdGhlIHVzdWFsIHNoZWxsIHF1b3RpbmcgYW5kIGVzY2FwaW5nIGlzIHN1cHBvcnRlZC4KKwlxdW90ZSBwYWlyIGFuZCBhIGJhY2tzbGFzaCBjYW4gYmUgdXNlZCB0byBxdW90ZSB0aGVtLgorKworSWYgdGhlIGFsaWFzIGV4cGFuc2lvbiBpcyBwcmVmaXhlZCB3aXRoIGFuIGV4Y2xhbWF0aW9uIHBvaW50LAoraXQgd2lsbCBiZSB0cmVhdGVkIGFzIGEgc2hlbGwgY29tbWFuZC4gIEZvciBleGFtcGxlLCBkZWZpbmluZworImFsaWFzLm5ldyA9ICFnaXRrIC0tYWxsIC0tbm90IE9SSUdfSEVBRCIsIHRoZSBpbnZvY2F0aW9uCisiZ2l0IG5ldyIgaXMgZXF1aXZhbGVudCB0byBydW5uaW5nIHRoZSBzaGVsbCBjb21tYW5kCisiZ2l0ayAtLWFsbCAtLW5vdCBPUklHX0hFQUQiLgorCithcHBseS53aGl0ZXNwYWNlOjoKKwlUZWxscyBgZ2l0LWFwcGx5YCBob3cgdG8gaGFuZGxlIHdoaXRlc3BhY2VzLCBpbiB0aGUgc2FtZSB3YXkKKwlhcyB0aGUgJy0td2hpdGVzcGFjZScgb3B0aW9uLiBTZWUgbGlua2dpdDpnaXQtYXBwbHlbMV0uCisKK2JyYW5jaC5hdXRvc2V0dXBtZXJnZTo6CisJVGVsbHMgYGdpdC1icmFuY2hgIGFuZCBgZ2l0LWNoZWNrb3V0YCB0byBzZXR1cCBuZXcgYnJhbmNoZXMKKwlzbyB0aGF0IGxpbmtnaXQ6Z2l0LXB1bGxbMV0gd2lsbCBhcHByb3ByaWF0ZWx5IG1lcmdlIGZyb20gdGhlCisJc3RhcnRpbmcgcG9pbnQgYnJhbmNoLiBOb3RlIHRoYXQgZXZlbiBpZiB0aGlzIG9wdGlvbiBpcyBub3Qgc2V0LAorCXRoaXMgYmVoYXZpb3IgY2FuIGJlIGNob3NlbiBwZXItYnJhbmNoIHVzaW5nIHRoZSBgLS10cmFja2AKKwlhbmQgYC0tbm8tdHJhY2tgIG9wdGlvbnMuIFRoZSB2YWxpZCBzZXR0aW5ncyBhcmU6IGBmYWxzZWAgLS0gbm8KKwlhdXRvbWF0aWMgc2V0dXAgaXMgZG9uZTsgYHRydWVgIC0tIGF1dG9tYXRpYyBzZXR1cCBpcyBkb25lIHdoZW4gdGhlCisJc3RhcnRpbmcgcG9pbnQgaXMgYSByZW1vdGUgYnJhbmNoOyBgYWx3YXlzYCAtLSBhdXRvbWF0aWMgc2V0dXAgaXMKKwlkb25lIHdoZW4gdGhlIHN0YXJ0aW5nIHBvaW50IGlzIGVpdGhlciBhIGxvY2FsIGJyYW5jaCBvciByZW1vdGUKKwlicmFuY2guIFRoaXMgb3B0aW9uIGRlZmF1bHRzIHRvIHRydWUuCisKK2JyYW5jaC48bmFtZT4ucmVtb3RlOjoKKwlXaGVuIGluIGJyYW5jaCA8bmFtZT4sIGl0IHRlbGxzIGBnaXQgZmV0Y2hgIHdoaWNoIHJlbW90ZSB0byBmZXRjaC4KKwlJZiB0aGlzIG9wdGlvbiBpcyBub3QgZ2l2ZW4sIGBnaXQgZmV0Y2hgIGRlZmF1bHRzIHRvIHJlbW90ZSAib3JpZ2luIi4KKworYnJhbmNoLjxuYW1lPi5tZXJnZTo6CisJV2hlbiBpbiBicmFuY2ggPG5hbWU+LCBpdCB0ZWxscyBgZ2l0IGZldGNoYCB0aGUgZGVmYXVsdAorCXJlZnNwZWMgdG8gYmUgbWFya2VkIGZvciBtZXJnaW5nIGluIEZFVENIX0hFQUQuIFRoZSB2YWx1ZSBpcworCWhhbmRsZWQgbGlrZSB0aGUgcmVtb3RlIHBhcnQgb2YgYSByZWZzcGVjLCBhbmQgbXVzdCBtYXRjaCBhCisJcmVmIHdoaWNoIGlzIGZldGNoZWQgZnJvbSB0aGUgcmVtb3RlIGdpdmVuIGJ5CisJImJyYW5jaC48bmFtZT4ucmVtb3RlIi4KKwlUaGUgbWVyZ2UgaW5mb3JtYXRpb24gaXMgdXNlZCBieSBgZ2l0IHB1bGxgICh3aGljaCBhdCBmaXJzdCBjYWxscworCWBnaXQgZmV0Y2hgKSB0byBsb29rdXAgdGhlIGRlZmF1bHQgYnJhbmNoIGZvciBtZXJnaW5nLiBXaXRob3V0CisJdGhpcyBvcHRpb24sIGBnaXQgcHVsbGAgZGVmYXVsdHMgdG8gbWVyZ2UgdGhlIGZpcnN0IHJlZnNwZWMgZmV0Y2hlZC4KKwlTcGVjaWZ5IG11bHRpcGxlIHZhbHVlcyB0byBnZXQgYW4gb2N0b3B1cyBtZXJnZS4KKwlJZiB5b3Ugd2lzaCB0byBzZXR1cCBgZ2l0IHB1bGxgIHNvIHRoYXQgaXQgbWVyZ2VzIGludG8gPG5hbWU+IGZyb20KKwlhbm90aGVyIGJyYW5jaCBpbiB0aGUgbG9jYWwgcmVwb3NpdG9yeSwgeW91IGNhbiBwb2ludAorCWJyYW5jaC48bmFtZT4ubWVyZ2UgdG8gdGhlIGRlc2lyZWQgYnJhbmNoLCBhbmQgdXNlIHRoZSBzcGVjaWFsIHNldHRpbmcKKwlgLmAgKGEgcGVyaW9kKSBmb3IgYnJhbmNoLjxuYW1lPi5yZW1vdGUuCisKK2JyYW5jaC48bmFtZT4ubWVyZ2VvcHRpb25zOjoKKwlTZXRzIGRlZmF1bHQgb3B0aW9ucyBmb3IgbWVyZ2luZyBpbnRvIGJyYW5jaCA8bmFtZT4uIFRoZSBzeW50YXggYW5kCisJc3VwcG9ydGVkIG9wdGlvbnMgYXJlIGVxdWFsIHRvIHRoYXQgb2YgbGlua2dpdDpnaXQtbWVyZ2VbMV0sIGJ1dAorCW9wdGlvbiB2YWx1ZXMgY29udGFpbmluZyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgYXJlIGN1cnJlbnRseSBub3QKKwlzdXBwb3J0ZWQuCisKK2JyYW5jaC48bmFtZT4ucmViYXNlOjoKKwlXaGVuIHRydWUsIHJlYmFzZSB0aGUgYnJhbmNoIDxuYW1lPiBvbiB0b3Agb2YgdGhlIGZldGNoZWQgYnJhbmNoLAorCWluc3RlYWQgb2YgbWVyZ2luZyB0aGUgZGVmYXVsdCBicmFuY2ggZnJvbSB0aGUgZGVmYXVsdCByZW1vdGUuCisJKk5PVEUqOiB0aGlzIGlzIGEgcG9zc2libHkgZGFuZ2Vyb3VzIG9wZXJhdGlvbjsgZG8gKm5vdCogdXNlCisJaXQgdW5sZXNzIHlvdSB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgKHNlZSBsaW5rZ2l0OmdpdC1yZWJhc2VbMV0KKwlmb3IgZGV0YWlscykuCisKK2Jyb3dzZXIuPHRvb2w+LmNtZDo6CisJU3BlY2lmeSB0aGUgY29tbWFuZCB0byBpbnZva2UgdGhlIHNwZWNpZmllZCBicm93c2VyLiBUaGUKKwlzcGVjaWZpZWQgY29tbWFuZCBpcyBldmFsdWF0ZWQgaW4gc2hlbGwgd2l0aCB0aGUgVVJMcyBwYXNzZWQKKwlhcyBhcmd1bWVudHMuIChTZWUgbGlua2dpdDpnaXQtd2ViLS1icm93c2VbMV0uKQorCiticm93c2VyLjx0b29sPi5wYXRoOjoKKwlPdmVycmlkZSB0aGUgcGF0aCBmb3IgdGhlIGdpdmVuIHRvb2wgdGhhdCBtYXkgYmUgdXNlZCB0bworCWJyb3dzZSBIVE1MIGhlbHAgKHNlZSAnLXcnIG9wdGlvbiBpbiBsaW5rZ2l0OmdpdC1oZWxwWzFdKSBvciBhCisJd29ya2luZyByZXBvc2l0b3J5IGluIGdpdHdlYiAoc2VlIGxpbmtnaXQ6Z2l0LWluc3Rhd2ViWzFdKS4KKworY2xlYW4ucmVxdWlyZUZvcmNlOjoKKwlBIGJvb2xlYW4gdG8gbWFrZSBnaXQtY2xlYW4gZG8gbm90aGluZyB1bmxlc3MgZ2l2ZW4gLWYKKwlvciAtbi4gICBEZWZhdWx0cyB0byB0cnVlLgorCitjb2xvci5icmFuY2g6OgorCUEgYm9vbGVhbiB0byBlbmFibGUvZGlzYWJsZSBjb2xvciBpbiB0aGUgb3V0cHV0IG9mCisJbGlua2dpdDpnaXQtYnJhbmNoWzFdLiBNYXkgYmUgc2V0IHRvIGBhbHdheXNgLAorCWBmYWxzZWAgKG9yIGBuZXZlcmApIG9yIGBhdXRvYCAob3IgYHRydWVgKSwgaW4gd2hpY2ggY2FzZSBjb2xvcnMgYXJlIHVzZWQKKwlvbmx5IHdoZW4gdGhlIG91dHB1dCBpcyB0byBhIHRlcm1pbmFsLiBEZWZhdWx0cyB0byBmYWxzZS4KKworY29sb3IuYnJhbmNoLjxzbG90Pjo6CisJVXNlIGN1c3RvbWl6ZWQgY29sb3IgZm9yIGJyYW5jaCBjb2xvcmF0aW9uLiBgPHNsb3Q+YCBpcyBvbmUgb2YKKwlgY3VycmVudGAgKHRoZSBjdXJyZW50IGJyYW5jaCksIGBsb2NhbGAgKGEgbG9jYWwgYnJhbmNoKSwKKwlgcmVtb3RlYCAoYSB0cmFja2luZyBicmFuY2ggaW4gcmVmcy9yZW1vdGVzLyksIGBwbGFpbmAgKG90aGVyCisJcmVmcykuCisrCitUaGUgdmFsdWUgZm9yIHRoZXNlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGlzIGEgbGlzdCBvZiBjb2xvcnMgKGF0IG1vc3QKK3R3bykgYW5kIGF0dHJpYnV0ZXMgKGF0IG1vc3Qgb25lKSwgc2VwYXJhdGVkIGJ5IHNwYWNlcy4gIFRoZSBjb2xvcnMKK2FjY2VwdGVkIGFyZSBgbm9ybWFsYCwgYGJsYWNrYCwgYHJlZGAsIGBncmVlbmAsIGB5ZWxsb3dgLCBgYmx1ZWAsCitgbWFnZW50YWAsIGBjeWFuYCBhbmQgYHdoaXRlYDsgdGhlIGF0dHJpYnV0ZXMgYXJlIGBib2xkYCwgYGRpbWAsIGB1bGAsCitgYmxpbmtgIGFuZCBgcmV2ZXJzZWAuICBUaGUgZmlyc3QgY29sb3IgZ2l2ZW4gaXMgdGhlIGZvcmVncm91bmQ7IHRoZQorc2Vjb25kIGlzIHRoZSBiYWNrZ3JvdW5kLiAgVGhlIHBvc2l0aW9uIG9mIHRoZSBhdHRyaWJ1dGUsIGlmIGFueSwKK2RvZXNuJ3QgbWF0dGVyLgorCitjb2xvci5kaWZmOjoKKwlXaGVuIHNldCB0byBgYWx3YXlzYCwgYWx3YXlzIHVzZSBjb2xvcnMgaW4gcGF0Y2guCisJV2hlbiBmYWxzZSAob3IgYG5ldmVyYCksIG5ldmVyLiAgV2hlbiBzZXQgdG8gYHRydWVgIG9yIGBhdXRvYCwgdXNlCisJY29sb3JzIG9ubHkgd2hlbiB0aGUgb3V0cHV0IGlzIHRvIHRoZSB0ZXJtaW5hbC4gRGVmYXVsdHMgdG8gZmFsc2UuCisKK2NvbG9yLmRpZmYuPHNsb3Q+OjoKKwlVc2UgY3VzdG9taXplZCBjb2xvciBmb3IgZGlmZiBjb2xvcml6YXRpb24uICBgPHNsb3Q+YCBzcGVjaWZpZXMKKwl3aGljaCBwYXJ0IG9mIHRoZSBwYXRjaCB0byB1c2UgdGhlIHNwZWNpZmllZCBjb2xvciwgYW5kIGlzIG9uZQorCW9mIGBwbGFpbmAgKGNvbnRleHQgdGV4dCksIGBtZXRhYCAobWV0YWluZm9ybWF0aW9uKSwgYGZyYWdgCisJKGh1bmsgaGVhZGVyKSwgYG9sZGAgKHJlbW92ZWQgbGluZXMpLCBgbmV3YCAoYWRkZWQgbGluZXMpLAorCWBjb21taXRgIChjb21taXQgaGVhZGVycyksIG9yIGB3aGl0ZXNwYWNlYCAoaGlnaGxpZ2h0aW5nCisJd2hpdGVzcGFjZSBlcnJvcnMpLiBUaGUgdmFsdWVzIG9mIHRoZXNlIHZhcmlhYmxlcyBtYXkgYmUgc3BlY2lmaWVkIGFzCisJaW4gY29sb3IuYnJhbmNoLjxzbG90Pi4KKworY29sb3IuaW50ZXJhY3RpdmU6OgorCVdoZW4gc2V0IHRvIGBhbHdheXNgLCBhbHdheXMgdXNlIGNvbG9ycyBmb3IgaW50ZXJhY3RpdmUgcHJvbXB0cworCWFuZCBkaXNwbGF5cyAoc3VjaCBhcyB0aG9zZSB1c2VkIGJ5ICJnaXQgYWRkIC0taW50ZXJhY3RpdmUiKS4KKwlXaGVuIGZhbHNlIChvciBgbmV2ZXJgKSwgbmV2ZXIuICBXaGVuIHNldCB0byBgdHJ1ZWAgb3IgYGF1dG9gLCB1c2UKKwljb2xvcnMgb25seSB3aGVuIHRoZSBvdXRwdXQgaXMgdG8gdGhlIHRlcm1pbmFsLiBEZWZhdWx0cyB0byBmYWxzZS4KKworY29sb3IuaW50ZXJhY3RpdmUuPHNsb3Q+OjoKKwlVc2UgY3VzdG9taXplZCBjb2xvciBmb3IgYGdpdCBhZGQgLS1pbnRlcmFjdGl2ZWAKKwlvdXRwdXQuIGA8c2xvdD5gIG1heSBiZSBgcHJvbXB0YCwgYGhlYWRlcmAsIG9yIGBoZWxwYCwgZm9yCisJdGhyZWUgZGlzdGluY3QgdHlwZXMgb2Ygbm9ybWFsIG91dHB1dCBmcm9tIGludGVyYWN0aXZlCisJcHJvZ3JhbXMuICBUaGUgdmFsdWVzIG9mIHRoZXNlIHZhcmlhYmxlcyBtYXkgYmUgc3BlY2lmaWVkIGFzCisJaW4gY29sb3IuYnJhbmNoLjxzbG90Pi4KKworY29sb3IucGFnZXI6OgorCUEgYm9vbGVhbiB0byBlbmFibGUvZGlzYWJsZSBjb2xvcmVkIG91dHB1dCB3aGVuIHRoZSBwYWdlciBpcyBpbgorCXVzZSAoZGVmYXVsdCBpcyB0cnVlKS4KKworY29sb3Iuc3RhdHVzOjoKKwlBIGJvb2xlYW4gdG8gZW5hYmxlL2Rpc2FibGUgY29sb3IgaW4gdGhlIG91dHB1dCBvZgorCWxpbmtnaXQ6Z2l0LXN0YXR1c1sxXS4gTWF5IGJlIHNldCB0byBgYWx3YXlzYCwKKwlgZmFsc2VgIChvciBgbmV2ZXJgKSBvciBgYXV0b2AgKG9yIGB0cnVlYCksIGluIHdoaWNoIGNhc2UgY29sb3JzIGFyZSB1c2VkCisJb25seSB3aGVuIHRoZSBvdXRwdXQgaXMgdG8gYSB0ZXJtaW5hbC4gRGVmYXVsdHMgdG8gZmFsc2UuCisKK2NvbG9yLnN0YXR1cy48c2xvdD46OgorCVVzZSBjdXN0b21pemVkIGNvbG9yIGZvciBzdGF0dXMgY29sb3JpemF0aW9uLiBgPHNsb3Q+YCBpcworCW9uZSBvZiBgaGVhZGVyYCAodGhlIGhlYWRlciB0ZXh0IG9mIHRoZSBzdGF0dXMgbWVzc2FnZSksCisJYGFkZGVkYCBvciBgdXBkYXRlZGAgKGZpbGVzIHdoaWNoIGFyZSBhZGRlZCBidXQgbm90IGNvbW1pdHRlZCksCisJYGNoYW5nZWRgIChmaWxlcyB3aGljaCBhcmUgY2hhbmdlZCBidXQgbm90IGFkZGVkIGluIHRoZSBpbmRleCksCisJb3IgYHVudHJhY2tlZGAgKGZpbGVzIHdoaWNoIGFyZSBub3QgdHJhY2tlZCBieSBnaXQpLiBUaGUgdmFsdWVzIG9mCisJdGhlc2UgdmFyaWFibGVzIG1heSBiZSBzcGVjaWZpZWQgYXMgaW4gY29sb3IuYnJhbmNoLjxzbG90Pi4KKworY29tbWl0LnRlbXBsYXRlOjoKKwlTcGVjaWZ5IGEgZmlsZSB0byB1c2UgYXMgdGhlIHRlbXBsYXRlIGZvciBuZXcgY29tbWl0IG1lc3NhZ2VzLgorCitjb2xvci51aTo6CisJV2hlbiBzZXQgdG8gYGFsd2F5c2AsIGFsd2F5cyB1c2UgY29sb3JzIGluIGFsbCBnaXQgY29tbWFuZHMgd2hpY2gKKwlhcmUgY2FwYWJsZSBvZiBjb2xvcmVkIG91dHB1dC4gV2hlbiBmYWxzZSAob3IgYG5ldmVyYCksIG5ldmVyLiBXaGVuCisJc2V0IHRvIGB0cnVlYCBvciBgYXV0b2AsIHVzZSBjb2xvcnMgb25seSB3aGVuIHRoZSBvdXRwdXQgaXMgdG8gdGhlCisJdGVybWluYWwuIFdoZW4gbW9yZSBzcGVjaWZpYyB2YXJpYWJsZXMgb2YgY29sb3IuKiBhcmUgc2V0LCB0aGV5IGFsd2F5cworCXRha2UgcHJlY2VkZW5jZSBvdmVyIHRoaXMgc2V0dGluZy4gRGVmYXVsdHMgdG8gZmFsc2UuCisKK2RpZmYuYXV0b3JlZnJlc2hpbmRleDo6CisJV2hlbiB1c2luZyBgZ2l0IGRpZmZgIHRvIGNvbXBhcmUgd2l0aCB3b3JrIHRyZWUKKwlmaWxlcywgZG8gbm90IGNvbnNpZGVyIHN0YXQtb25seSBjaGFuZ2UgYXMgY2hhbmdlZC4KKwlJbnN0ZWFkLCBzaWxlbnRseSBydW4gYGdpdCB1cGRhdGUtaW5kZXggLS1yZWZyZXNoYCB0bworCXVwZGF0ZSB0aGUgY2FjaGVkIHN0YXQgaW5mb3JtYXRpb24gZm9yIHBhdGhzIHdob3NlCisJY29udGVudHMgaW4gdGhlIHdvcmsgdHJlZSBtYXRjaCB0aGUgY29udGVudHMgaW4gdGhlCisJaW5kZXguICBUaGlzIG9wdGlvbiBkZWZhdWx0cyB0byB0cnVlLiAgTm90ZSB0aGF0IHRoaXMKKwlhZmZlY3RzIG9ubHkgYGdpdCBkaWZmYCBQb3JjZWxhaW4sIGFuZCBub3QgbG93ZXIgbGV2ZWwKKwlgZGlmZmAgY29tbWFuZHMsIHN1Y2ggYXMgYGdpdCBkaWZmLWZpbGVzYC4KKworZGlmZi5leHRlcm5hbDo6CisJSWYgdGhpcyBjb25maWcgdmFyaWFibGUgaXMgc2V0LCBkaWZmIGdlbmVyYXRpb24gaXMgbm90CisJcGVyZm9ybWVkIHVzaW5nIHRoZSBpbnRlcm5hbCBkaWZmIG1hY2hpbmVyeSwgYnV0IHVzaW5nIHRoZQorCWdpdmVuIGNvbW1hbmQuICBOb3RlOiBpZiB5b3Ugd2FudCB0byB1c2UgYW4gZXh0ZXJuYWwgZGlmZgorCXByb2dyYW0gb25seSBvbiBhIHN1YnNldCBvZiB5b3VyIGZpbGVzLCB5b3UgbWlnaHQgd2FudCB0bworCXVzZSBsaW5rZ2l0OmdpdGF0dHJpYnV0ZXNbNV0gaW5zdGVhZC4KKworZGlmZi5yZW5hbWVMaW1pdDo6CisJVGhlIG51bWJlciBvZiBmaWxlcyB0byBjb25zaWRlciB3aGVuIHBlcmZvcm1pbmcgdGhlIGNvcHkvcmVuYW1lCisJZGV0ZWN0aW9uOyBlcXVpdmFsZW50IHRvIHRoZSBnaXQgZGlmZiBvcHRpb24gJy1sJy4KKworZGlmZi5yZW5hbWVzOjoKKwlUZWxscyBnaXQgdG8gZGV0ZWN0IHJlbmFtZXMuICBJZiBzZXQgdG8gYW55IGJvb2xlYW4gdmFsdWUsIGl0CisJd2lsbCBlbmFibGUgYmFzaWMgcmVuYW1lIGRldGVjdGlvbi4gIElmIHNldCB0byAiY29waWVzIiBvcgorCSJjb3B5IiwgaXQgd2lsbCBkZXRlY3QgY29waWVzLCBhcyB3ZWxsLgorCitmZXRjaC51bnBhY2tMaW1pdDo6CisJSWYgdGhlIG51bWJlciBvZiBvYmplY3RzIGZldGNoZWQgb3ZlciB0aGUgZ2l0IG5hdGl2ZQorCXRyYW5zZmVyIGlzIGJlbG93IHRoaXMKKwlsaW1pdCwgdGhlbiB0aGUgb2JqZWN0cyB3aWxsIGJlIHVucGFja2VkIGludG8gbG9vc2Ugb2JqZWN0CisJZmlsZXMuIEhvd2V2ZXIgaWYgdGhlIG51bWJlciBvZiByZWNlaXZlZCBvYmplY3RzIGVxdWFscyBvcgorCWV4Y2VlZHMgdGhpcyBsaW1pdCB0aGVuIHRoZSByZWNlaXZlZCBwYWNrIHdpbGwgYmUgc3RvcmVkIGFzCisJYSBwYWNrLCBhZnRlciBhZGRpbmcgYW55IG1pc3NpbmcgZGVsdGEgYmFzZXMuICBTdG9yaW5nIHRoZQorCXBhY2sgZnJvbSBhIHB1c2ggY2FuIG1ha2UgdGhlIHB1c2ggb3BlcmF0aW9uIGNvbXBsZXRlIGZhc3RlciwKKwllc3BlY2lhbGx5IG9uIHNsb3cgZmlsZXN5c3RlbXMuICBJZiBub3Qgc2V0LCB0aGUgdmFsdWUgb2YKKwlgdHJhbnNmZXIudW5wYWNrTGltaXRgIGlzIHVzZWQgaW5zdGVhZC4KKworZm9ybWF0Lm51bWJlcmVkOjoKKwlBIGJvb2xlYW4gd2hpY2ggY2FuIGVuYWJsZSBzZXF1ZW5jZSBudW1iZXJzIGluIHBhdGNoIHN1YmplY3RzLgorCVNldHRpbmcgdGhpcyBvcHRpb24gdG8gImF1dG8iIHdpbGwgZW5hYmxlIGl0IG9ubHkgaWYgdGhlcmUgaXMKKwltb3JlIHRoYW4gb25lIHBhdGNoLiAgU2VlIC0tbnVtYmVyZWQgb3B0aW9uIGluCisJbGlua2dpdDpnaXQtZm9ybWF0LXBhdGNoWzFdLgorCitmb3JtYXQuaGVhZGVyczo6CisJQWRkaXRpb25hbCBlbWFpbCBoZWFkZXJzIHRvIGluY2x1ZGUgaW4gYSBwYXRjaCB0byBiZSBzdWJtaXR0ZWQKKwlieSBtYWlsLiAgU2VlIGxpbmtnaXQ6Z2l0LWZvcm1hdC1wYXRjaFsxXS4KKworZm9ybWF0LnN1ZmZpeDo6CisJVGhlIGRlZmF1bHQgZm9yIGZvcm1hdC1wYXRjaCBpcyB0byBvdXRwdXQgZmlsZXMgd2l0aCB0aGUgc3VmZml4CisJYC5wYXRjaGAuIFVzZSB0aGlzIHZhcmlhYmxlIHRvIGNoYW5nZSB0aGF0IHN1ZmZpeCAobWFrZSBzdXJlIHRvCisJaW5jbHVkZSB0aGUgZG90IGlmIHlvdSB3YW50IGl0KS4KKworZm9ybWF0LnByZXR0eTo6CisJVGhlIGRlZmF1bHQgcHJldHR5IGZvcm1hdCBmb3IgbG9nL3Nob3cvd2hhdGNoYW5nZWQgY29tbWFuZCwKKwlTZWUgbGlua2dpdDpnaXQtbG9nWzFdLCBsaW5rZ2l0OmdpdC1zaG93WzFdLAorCWxpbmtnaXQ6Z2l0LXdoYXRjaGFuZ2VkWzFdLgorCitnYy5hZ2dyZXNzaXZlV2luZG93OjoKKwlUaGUgd2luZG93IHNpemUgcGFyYW1ldGVyIHVzZWQgaW4gdGhlIGRlbHRhIGNvbXByZXNzaW9uCisJYWxnb3JpdGhtIHVzZWQgYnkgJ2dpdCBnYyAtLWFnZ3Jlc3NpdmUnLiAgVGhpcyBkZWZhdWx0cworCXRvIDEwLgorCitnYy5hdXRvOjoKKwlXaGVuIHRoZXJlIGFyZSBhcHByb3hpbWF0ZWx5IG1vcmUgdGhhbiB0aGlzIG1hbnkgbG9vc2UKKwlvYmplY3RzIGluIHRoZSByZXBvc2l0b3J5LCBgZ2l0IGdjIC0tYXV0b2Agd2lsbCBwYWNrIHRoZW0uCisJU29tZSBQb3JjZWxhaW4gY29tbWFuZHMgdXNlIHRoaXMgY29tbWFuZCB0byBwZXJmb3JtIGEKKwlsaWdodC13ZWlnaHQgZ2FyYmFnZSBjb2xsZWN0aW9uIGZyb20gdGltZSB0byB0aW1lLiAgVGhlCisJZGVmYXVsdCB2YWx1ZSBpcyA2NzAwLiAgU2V0dGluZyB0aGlzIHRvIDAgZGlzYWJsZXMgaXQuCisKK2djLmF1dG9wYWNrbGltaXQ6OgorCVdoZW4gdGhlcmUgYXJlIG1vcmUgdGhhbiB0aGlzIG1hbnkgcGFja3MgdGhhdCBhcmUgbm90CisJbWFya2VkIHdpdGggYCoua2VlcGAgZmlsZSBpbiB0aGUgcmVwb3NpdG9yeSwgYGdpdCBnYworCS0tYXV0b2AgY29uc29saWRhdGVzIHRoZW0gaW50byBvbmUgbGFyZ2VyIHBhY2suICBUaGUKKwlkZWZhdWx0CXZhbHVlIGlzIDUwLiAgU2V0dGluZyB0aGlzIHRvIDAgZGlzYWJsZXMgaXQuCisKK2djLnBhY2tyZWZzOjoKKwlgZ2l0IGdjYCBkb2VzIG5vdCBydW4gYGdpdCBwYWNrLXJlZnNgIGluIGEgYmFyZSByZXBvc2l0b3J5IGJ5CisJZGVmYXVsdCBzbyB0aGF0IG9sZGVyIGR1bWItdHJhbnNwb3J0IGNsaWVudHMgY2FuIHN0aWxsIGZldGNoCisJZnJvbSB0aGUgcmVwb3NpdG9yeS4gIFNldHRpbmcgdGhpcyB0byBgdHJ1ZWAgbGV0cyBgZ2l0CisJZ2NgIHRvIHJ1biBgZ2l0IHBhY2stcmVmc2AuICBTZXR0aW5nIHRoaXMgdG8gYGZhbHNlYCB0ZWxscworCWBnaXQgZ2NgIG5ldmVyIHRvIHJ1biBgZ2l0IHBhY2stcmVmc2AuIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMKKwlgbm90YmFyZWAuIEVuYWJsZSBpdCBvbmx5IHdoZW4geW91IGtub3cgeW91IGRvIG5vdCBoYXZlIHRvCisJc3VwcG9ydCBzdWNoIGNsaWVudHMuICBUaGUgZGVmYXVsdCBzZXR0aW5nIHdpbGwgY2hhbmdlIHRvIGB0cnVlYAorCWF0IHNvbWUgc3RhZ2UsIGFuZCBzZXR0aW5nIHRoaXMgdG8gYGZhbHNlYCB3aWxsIGNvbnRpbnVlIHRvCisJcHJldmVudCBgZ2l0IHBhY2stcmVmc2AgZnJvbSBiZWluZyBydW4gZnJvbSBgZ2l0IGdjYC4KKworZ2MucHJ1bmVleHBpcmU6OgorCVdoZW4gYGdpdCBnY2AgaXMgcnVuLCBpdCB3aWxsIGNhbGwgYHBydW5lIC0tZXhwaXJlIDIud2Vla3MuYWdvYC4KKwlPdmVycmlkZSB0aGUgZ3JhY2UgcGVyaW9kIHdpdGggdGhpcyBjb25maWcgdmFyaWFibGUuCisKK2djLnJlZmxvZ2V4cGlyZTo6CisJYGdpdCByZWZsb2cgZXhwaXJlYCByZW1vdmVzIHJlZmxvZyBlbnRyaWVzIG9sZGVyIHRoYW4KKwl0aGlzIHRpbWU7IGRlZmF1bHRzIHRvIDkwIGRheXMuCisKK2djLnJlZmxvZ2V4cGlyZXVucmVhY2hhYmxlOjoKKwlgZ2l0IHJlZmxvZyBleHBpcmVgIHJlbW92ZXMgcmVmbG9nIGVudHJpZXMgb2xkZXIgdGhhbgorCXRoaXMgdGltZSBhbmQgYXJlIG5vdCByZWFjaGFibGUgZnJvbSB0aGUgY3VycmVudCB0aXA7CisJZGVmYXVsdHMgdG8gMzAgZGF5cy4KKworZ2MucmVyZXJlcmVzb2x2ZWQ6OgorCVJlY29yZHMgb2YgY29uZmxpY3RlZCBtZXJnZSB5b3UgcmVzb2x2ZWQgZWFybGllciBhcmUKKwlrZXB0IGZvciB0aGlzIG1hbnkgZGF5cyB3aGVuIGBnaXQgcmVyZXJlIGdjYCBpcyBydW4uCisJVGhlIGRlZmF1bHQgaXMgNjAgZGF5cy4gIFNlZSBsaW5rZ2l0OmdpdC1yZXJlcmVbMV0uCisKK2djLnJlcmVyZXVucmVzb2x2ZWQ6OgorCVJlY29yZHMgb2YgY29uZmxpY3RlZCBtZXJnZSB5b3UgaGF2ZSBub3QgcmVzb2x2ZWQgYXJlCisJa2VwdCBmb3IgdGhpcyBtYW55IGRheXMgd2hlbiBgZ2l0IHJlcmVyZSBnY2AgaXMgcnVuLgorCVRoZSBkZWZhdWx0IGlzIDE1IGRheXMuICBTZWUgbGlua2dpdDpnaXQtcmVyZXJlWzFdLgorCityZXJlcmUuZW5hYmxlZDo6CisJQWN0aXZhdGUgcmVjb3JkaW5nIG9mIHJlc29sdmVkIGNvbmZsaWN0cywgc28gdGhhdCBpZGVudGljYWwKKwljb25mbGljdCBodW5rcyBjYW4gYmUgcmVzb2x2ZWQgYXV0b21hdGljYWxseSwgc2hvdWxkIHRoZXkKKwliZSBlbmNvdW50ZXJlZCBhZ2Fpbi4gIGxpbmtnaXQ6Z2l0LXJlcmVyZVsxXSBjb21tYW5kIGlzIGJ5CisJZGVmYXVsdCBlbmFibGVkIGlmIHlvdSBjcmVhdGUgYHJyLWNhY2hlYCBkaXJlY3RvcnkgdW5kZXIKKwlgJEdJVF9ESVJgLCBidXQgY2FuIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgdGhpcyBvcHRpb24gdG8gZmFsc2UuCisKK2dpdGN2cy5lbmFibGVkOjoKKwlXaGV0aGVyIHRoZSBDVlMgc2VydmVyIGludGVyZmFjZSBpcyBlbmFibGVkIGZvciB0aGlzIHJlcG9zaXRvcnkuCisJU2VlIGxpbmtnaXQ6Z2l0LWN2c3NlcnZlclsxXS4KKworZ2l0Y3ZzLmxvZ2ZpbGU6OgorCVBhdGggdG8gYSBsb2cgZmlsZSB3aGVyZSB0aGUgQ1ZTIHNlcnZlciBpbnRlcmZhY2Ugd2VsbC4uLiBsb2dzCisJdmFyaW91cyBzdHVmZi4gU2VlIGxpbmtnaXQ6Z2l0LWN2c3NlcnZlclsxXS4KKworZ2l0Y3ZzLmFsbGJpbmFyeTo6CisJSWYgdHJ1ZSwgYWxsIGZpbGVzIGFyZSBzZW50IHRvIHRoZSBjbGllbnQgaW4gbW9kZSAnLWtiJy4gVGhpcworCWNhdXNlcyB0aGUgY2xpZW50IHRvIHRyZWF0IGFsbCBmaWxlcyBhcyBiaW5hcnkgZmlsZXMgd2hpY2ggc3VwcHJlc3NlcworCWFueSBuZXdsaW5lIG11bmdpbmcgaXQgb3RoZXJ3aXNlIG1pZ2h0IGRvLiBBIHdvcmstYXJvdW5kIGZvciB0aGUKKwlmYWN0IHRoYXQgdGhlcmUgaXMgbm8gd2F5IHlldCB0byBzZXQgc2luZ2xlIGZpbGVzIHRvIG1vZGUgJy1rYicuCisKK2dpdGN2cy5kYm5hbWU6OgorCURhdGFiYXNlIHVzZWQgYnkgZ2l0LWN2c3NlcnZlciB0byBjYWNoZSByZXZpc2lvbiBpbmZvcm1hdGlvbgorCWRlcml2ZWQgZnJvbSB0aGUgZ2l0IHJlcG9zaXRvcnkuIFRoZSBleGFjdCBtZWFuaW5nIGRlcGVuZHMgb24gdGhlCisJdXNlZCBkYXRhYmFzZSBkcml2ZXIsIGZvciBTUUxpdGUgKHdoaWNoIGlzIHRoZSBkZWZhdWx0IGRyaXZlcikgdGhpcworCWlzIGEgZmlsZW5hbWUuIFN1cHBvcnRzIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiAoc2VlCisJbGlua2dpdDpnaXQtY3Zzc2VydmVyWzFdIGZvciBkZXRhaWxzKS4gTWF5IG5vdCBjb250YWluIHNlbWljb2xvbnMgKGA7YCkuCisJRGVmYXVsdDogJyVHZ2l0Y3ZzLiVtLnNxbGl0ZScKKworZ2l0Y3ZzLmRiZHJpdmVyOjoKKwlVc2VkIFBlcmwgREJJIGRyaXZlci4gWW91IGNhbiBzcGVjaWZ5IGFueSBhdmFpbGFibGUgZHJpdmVyCisgICAgICAgIGZvciB0aGlzIGhlcmUsIGJ1dCBpdCBtaWdodCBub3Qgd29yay4gZ2l0LWN2c3NlcnZlciBpcyB0ZXN0ZWQKKwl3aXRoICdEQkQ6OlNRTGl0ZScsIHJlcG9ydGVkIHRvIHdvcmsgd2l0aCAnREJEOjpQZycsIGFuZAorCXJlcG9ydGVkICpub3QqIHRvIHdvcmsgd2l0aCAnREJEOjpteXNxbCcuIEV4cGVyaW1lbnRhbCBmZWF0dXJlLgorCU1heSBub3QgY29udGFpbiBkb3VibGUgY29sb25zIChgOmApLiBEZWZhdWx0OiAnU1FMaXRlJy4KKwlTZWUgbGlua2dpdDpnaXQtY3Zzc2VydmVyWzFdLgorCitnaXRjdnMuZGJ1c2VyLCBnaXRjdnMuZGJwYXNzOjoKKwlEYXRhYmFzZSB1c2VyIGFuZCBwYXNzd29yZC4gT25seSB1c2VmdWwgaWYgc2V0dGluZyAnZ2l0Y3ZzLmRiZHJpdmVyJywKKwlzaW5jZSBTUUxpdGUgaGFzIG5vIGNvbmNlcHQgb2YgZGF0YWJhc2UgdXNlcnMgYW5kL29yIHBhc3N3b3Jkcy4KKwknZ2l0Y3ZzLmRidXNlcicgc3VwcG9ydHMgdmFyaWFibGUgc3Vic3RpdHV0aW9uIChzZWUKKwlsaW5rZ2l0OmdpdC1jdnNzZXJ2ZXJbMV0gZm9yIGRldGFpbHMpLgorCitnaXRjdnMuZGJUYWJsZU5hbWVQcmVmaXg6OgorCURhdGFiYXNlIHRhYmxlIG5hbWUgcHJlZml4LiAgUHJlcGVuZGVkIHRvIHRoZSBuYW1lcyBvZiBhbnkKKwlkYXRhYmFzZSB0YWJsZXMgdXNlZCwgYWxsb3dpbmcgYSBzaW5nbGUgZGF0YWJhc2UgdG8gYmUgdXNlZAorCWZvciBzZXZlcmFsIHJlcG9zaXRvcmllcy4gIFN1cHBvcnRzIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiAoc2VlCisJbGlua2dpdDpnaXQtY3Zzc2VydmVyWzFdIGZvciBkZXRhaWxzKS4gIEFueSBub24tYWxwaGFiZXRpYworCWNoYXJhY3RlcnMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHVuZGVyc2NvcmVzLgorCitBbGwgZ2l0Y3ZzIHZhcmlhYmxlcyBleGNlcHQgZm9yICdnaXRjdnMuYWxsYmluYXJ5JyBjYW4gYWxzbyBiZQorc3BlY2lmaWVkIGFzICdnaXRjdnMuPGFjY2Vzc19tZXRob2Q+Ljx2YXJuYW1lPicgKHdoZXJlICdhY2Nlc3NfbWV0aG9kJworaXMgb25lIG9mICJleHQiIGFuZCAicHNlcnZlciIpIHRvIG1ha2UgdGhlbSBhcHBseSBvbmx5IGZvciB0aGUgZ2l2ZW4KK2FjY2VzcyBtZXRob2QuCisKK2hlbHAuYnJvd3Nlcjo6CisJU3BlY2lmeSB0aGUgYnJvd3NlciB0aGF0IHdpbGwgYmUgdXNlZCB0byBkaXNwbGF5IGhlbHAgaW4gdGhlCisJJ3dlYicgZm9ybWF0LiBTZWUgbGlua2dpdDpnaXQtaGVscFsxXS4KKworaGVscC5mb3JtYXQ6OgorCU92ZXJyaWRlIHRoZSBkZWZhdWx0IGhlbHAgZm9ybWF0IHVzZWQgYnkgbGlua2dpdDpnaXQtaGVscFsxXS4KKwlWYWx1ZXMgJ21hbicsICdpbmZvJywgJ3dlYicgYW5kICdodG1sJyBhcmUgc3VwcG9ydGVkLiAnbWFuJyBpcworCXRoZSBkZWZhdWx0LiAnd2ViJyBhbmQgJ2h0bWwnIGFyZSB0aGUgc2FtZS4KKworaHR0cC5wcm94eTo6CisJT3ZlcnJpZGUgdGhlIEhUVFAgcHJveHksIG5vcm1hbGx5IGNvbmZpZ3VyZWQgdXNpbmcgdGhlICdodHRwX3Byb3h5JworCWVudmlyb25tZW50IHZhcmlhYmxlIChzZWUgbGlua2dpdDpjdXJsWzFdKS4gIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4KKwlvbiBhIHBlci1yZW1vdGUgYmFzaXM7IHNlZSByZW1vdGUuPG5hbWU+LnByb3h5CisKK2h0dHAuc3NsVmVyaWZ5OjoKKwlXaGV0aGVyIHRvIHZlcmlmeSB0aGUgU1NMIGNlcnRpZmljYXRlIHdoZW4gZmV0Y2hpbmcgb3IgcHVzaGluZworCW92ZXIgSFRUUFMuIENhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSAnR0lUX1NTTF9OT19WRVJJRlknIGVudmlyb25tZW50CisJdmFyaWFibGUuCisKK2h0dHAuc3NsQ2VydDo6CisJRmlsZSBjb250YWluaW5nIHRoZSBTU0wgY2VydGlmaWNhdGUgd2hlbiBmZXRjaGluZyBvciBwdXNoaW5nCisJb3ZlciBIVFRQUy4gQ2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlICdHSVRfU1NMX0NFUlQnIGVudmlyb25tZW50CisJdmFyaWFibGUuCisKK2h0dHAuc3NsS2V5OjoKKwlGaWxlIGNvbnRhaW5pbmcgdGhlIFNTTCBwcml2YXRlIGtleSB3aGVuIGZldGNoaW5nIG9yIHB1c2hpbmcKKwlvdmVyIEhUVFBTLiBDYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgJ0dJVF9TU0xfS0VZJyBlbnZpcm9ubWVudAorCXZhcmlhYmxlLgorCitodHRwLnNzbENBSW5mbzo6CisJRmlsZSBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0ZXMgdG8gdmVyaWZ5IHRoZSBwZWVyIHdpdGggd2hlbgorCWZldGNoaW5nIG9yIHB1c2hpbmcgb3ZlciBIVFRQUy4gQ2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlCisJJ0dJVF9TU0xfQ0FJTkZPJyBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworaHR0cC5zc2xDQVBhdGg6OgorCVBhdGggY29udGFpbmluZyBmaWxlcyB3aXRoIHRoZSBDQSBjZXJ0aWZpY2F0ZXMgdG8gdmVyaWZ5IHRoZSBwZWVyCisJd2l0aCB3aGVuIGZldGNoaW5nIG9yIHB1c2hpbmcgb3ZlciBIVFRQUy4gQ2FuIGJlIG92ZXJyaWRkZW4KKwlieSB0aGUgJ0dJVF9TU0xfQ0FQQVRIJyBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworaHR0cC5tYXhSZXF1ZXN0czo6CisJSG93IG1hbnkgSFRUUCByZXF1ZXN0cyB0byBsYXVuY2ggaW4gcGFyYWxsZWwuIENhbiBiZSBvdmVycmlkZGVuCisJYnkgdGhlICdHSVRfSFRUUF9NQVhfUkVRVUVTVFMnIGVudmlyb25tZW50IHZhcmlhYmxlLiBEZWZhdWx0IGlzIDUuCisKK2h0dHAubG93U3BlZWRMaW1pdCwgaHR0cC5sb3dTcGVlZFRpbWU6OgorCUlmIHRoZSBIVFRQIHRyYW5zZmVyIHNwZWVkIGlzIGxlc3MgdGhhbiAnaHR0cC5sb3dTcGVlZExpbWl0JworCWZvciBsb25nZXIgdGhhbiAnaHR0cC5sb3dTcGVlZFRpbWUnIHNlY29uZHMsIHRoZSB0cmFuc2ZlciBpcyBhYm9ydGVkLgorCUNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSAnR0lUX0hUVFBfTE9XX1NQRUVEX0xJTUlUJyBhbmQKKwknR0lUX0hUVFBfTE9XX1NQRUVEX1RJTUUnIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKworaHR0cC5ub0VQU1Y6OgorCUEgYm9vbGVhbiB3aGljaCBkaXNhYmxlcyB1c2luZyBvZiBFUFNWIGZ0cCBjb21tYW5kIGJ5IGN1cmwuCisJVGhpcyBjYW4gaGVscGZ1bCB3aXRoIHNvbWUgInBvb3IiIGZ0cCBzZXJ2ZXJzIHdoaWNoIGRvbid0CisJc3VwcG9ydCBFUFNWIG1vZGUuIENhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSAnR0lUX0NVUkxfRlRQX05PX0VQU1YnCisJZW52aXJvbm1lbnQgdmFyaWFibGUuIERlZmF1bHQgaXMgZmFsc2UgKGN1cmwgd2lsbCB1c2UgRVBTVikuCisKK2kxOG4uY29tbWl0RW5jb2Rpbmc6OgorCUNoYXJhY3RlciBlbmNvZGluZyB0aGUgY29tbWl0IG1lc3NhZ2VzIGFyZSBzdG9yZWQgaW47IGdpdCBpdHNlbGYKKwlkb2VzIG5vdCBjYXJlIHBlciBzZSwgYnV0IHRoaXMgaW5mb3JtYXRpb24gaXMgbmVjZXNzYXJ5IGUuZy4gd2hlbgorCWltcG9ydGluZyBjb21taXRzIGZyb20gZW1haWxzIG9yIGluIHRoZSBnaXRrIGdyYXBoaWNhbCBoaXN0b3J5CisJYnJvd3NlciAoYW5kIHBvc3NpYmx5IGF0IG90aGVyIHBsYWNlcyBpbiB0aGUgZnV0dXJlIG9yIGluIG90aGVyCisJcG9yY2VsYWlucykuIFNlZSBlLmcuIGxpbmtnaXQ6Z2l0LW1haWxpbmZvWzFdLiBEZWZhdWx0cyB0byAndXRmLTgnLgorCitpMThuLmxvZ091dHB1dEVuY29kaW5nOjoKKwlDaGFyYWN0ZXIgZW5jb2RpbmcgdGhlIGNvbW1pdCBtZXNzYWdlcyBhcmUgY29udmVydGVkIHRvIHdoZW4KKwlydW5uaW5nIGBnaXQtbG9nYCBhbmQgZnJpZW5kcy4KKworaW5zdGF3ZWIuYnJvd3Nlcjo6CisJU3BlY2lmeSB0aGUgcHJvZ3JhbSB0aGF0IHdpbGwgYmUgdXNlZCB0byBicm93c2UgeW91ciB3b3JraW5nCisJcmVwb3NpdG9yeSBpbiBnaXR3ZWIuIFNlZSBsaW5rZ2l0OmdpdC1pbnN0YXdlYlsxXS4KKworaW5zdGF3ZWIuaHR0cGQ6OgorCVRoZSBIVFRQIGRhZW1vbiBjb21tYW5kLWxpbmUgdG8gc3RhcnQgZ2l0d2ViIG9uIHlvdXIgd29ya2luZworCXJlcG9zaXRvcnkuIFNlZSBsaW5rZ2l0OmdpdC1pbnN0YXdlYlsxXS4KKworaW5zdGF3ZWIubG9jYWw6OgorCUlmIHRydWUgdGhlIHdlYiBzZXJ2ZXIgc3RhcnRlZCBieSBsaW5rZ2l0OmdpdC1pbnN0YXdlYlsxXSB3aWxsCisJYmUgYm91bmQgdG8gdGhlIGxvY2FsIElQICgxMjcuMC4wLjEpLgorCitpbnN0YXdlYi5tb2R1bGVwYXRoOjoKKwlUaGUgbW9kdWxlIHBhdGggZm9yIGFuIGFwYWNoZSBodHRwZCB1c2VkIGJ5IGxpbmtnaXQ6Z2l0LWluc3Rhd2ViWzFdLgorCitpbnN0YXdlYi5wb3J0OjoKKwlUaGUgcG9ydCBudW1iZXIgdG8gYmluZCB0aGUgZ2l0d2ViIGh0dHBkIHRvLiBTZWUKKwlsaW5rZ2l0OmdpdC1pbnN0YXdlYlsxXS4KKworbG9nLnNob3dyb290OjoKKwlJZiB0cnVlLCB0aGUgaW5pdGlhbCBjb21taXQgd2lsbCBiZSBzaG93biBhcyBhIGJpZyBjcmVhdGlvbiBldmVudC4KKwlUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYSBkaWZmIGFnYWluc3QgYW4gZW1wdHkgdHJlZS4KKwlUb29scyBsaWtlIGxpbmtnaXQ6Z2l0LWxvZ1sxXSBvciBsaW5rZ2l0OmdpdC13aGF0Y2hhbmdlZFsxXSwgd2hpY2gKKwlub3JtYWxseSBoaWRlIHRoZSByb290IGNvbW1pdCB3aWxsIG5vdyBzaG93IGl0LiBUcnVlIGJ5IGRlZmF1bHQuCisKK21hbi52aWV3ZXI6OgorCVNwZWNpZnkgdGhlIHByb2dyYW1zIHRoYXQgbWF5IGJlIHVzZWQgdG8gZGlzcGxheSBoZWxwIGluIHRoZQorCSdtYW4nIGZvcm1hdC4gU2VlIGxpbmtnaXQ6Z2l0LWhlbHBbMV0uCisKK21lcmdlLnN1bW1hcnk6OgorCVdoZXRoZXIgdG8gaW5jbHVkZSBzdW1tYXJpZXMgb2YgbWVyZ2VkIGNvbW1pdHMgaW4gbmV3bHkgY3JlYXRlZAorCW1lcmdlIGNvbW1pdCBtZXNzYWdlcy4gRmFsc2UgYnkgZGVmYXVsdC4KKworbWVyZ2UudG9vbDo6CisJQ29udHJvbHMgd2hpY2ggbWVyZ2UgcmVzb2x1dGlvbiBwcm9ncmFtIGlzIHVzZWQgYnkKKwlsaW5rZ2l0OmdpdC1tZXJnZXRvb2xbMV0uICBWYWxpZCBidWlsdC1pbiB2YWx1ZXMgYXJlOiAia2RpZmYzIiwKKwkidGtkaWZmIiwgIm1lbGQiLCAieHhkaWZmIiwgImVtZXJnZSIsICJ2aW1kaWZmIiwgImd2aW1kaWZmIiwgYW5kCisJIm9wZW5kaWZmIi4gIEFueSBvdGhlciB2YWx1ZSBpcyB0cmVhdGVkIGlzIGN1c3RvbSBtZXJnZSB0b29sCisJYW5kIHRoZXJlIG11c3QgYmUgYSBjb3JyZXNwb25pbmcgbWVyZ2V0b29sLjx0b29sPi5jbWQgb3B0aW9uLgorCittZXJnZS52ZXJib3NpdHk6OgorCUNvbnRyb2xzIHRoZSBhbW91bnQgb2Ygb3V0cHV0IHNob3duIGJ5IHRoZSByZWN1cnNpdmUgbWVyZ2UKKwlzdHJhdGVneS4gIExldmVsIDAgb3V0cHV0cyBub3RoaW5nIGV4Y2VwdCBhIGZpbmFsIGVycm9yCisJbWVzc2FnZSBpZiBjb25mbGljdHMgd2VyZSBkZXRlY3RlZC4gTGV2ZWwgMSBvdXRwdXRzIG9ubHkKKwljb25mbGljdHMsIDIgb3V0cHV0cyBjb25mbGljdHMgYW5kIGZpbGUgY2hhbmdlcy4gIExldmVsIDUgYW5kCisJYWJvdmUgb3V0cHV0cyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGUgZGVmYXVsdCBpcyBsZXZlbCAyLgorCUNhbiBiZSBvdmVycmlkZGVuIGJ5ICdHSVRfTUVSR0VfVkVSQk9TSVRZJyBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworbWVyZ2UuPGRyaXZlcj4ubmFtZTo6CisJRGVmaW5lcyBhIGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIGEgY3VzdG9tIGxvdy1sZXZlbAorCW1lcmdlIGRyaXZlci4gIFNlZSBsaW5rZ2l0OmdpdGF0dHJpYnV0ZXNbNV0gZm9yIGRldGFpbHMuCisKK21lcmdlLjxkcml2ZXI+LmRyaXZlcjo6CisJRGVmaW5lcyB0aGUgY29tbWFuZCB0aGF0IGltcGxlbWVudHMgYSBjdXN0b20gbG93LWxldmVsCisJbWVyZ2UgZHJpdmVyLiAgU2VlIGxpbmtnaXQ6Z2l0YXR0cmlidXRlc1s1XSBmb3IgZGV0YWlscy4KKworbWVyZ2UuPGRyaXZlcj4ucmVjdXJzaXZlOjoKKwlOYW1lcyBhIGxvdy1sZXZlbCBtZXJnZSBkcml2ZXIgdG8gYmUgdXNlZCB3aGVuCisJcGVyZm9ybWluZyBhbiBpbnRlcm5hbCBtZXJnZSBiZXR3ZWVuIGNvbW1vbiBhbmNlc3RvcnMuCisJU2VlIGxpbmtnaXQ6Z2l0YXR0cmlidXRlc1s1XSBmb3IgZGV0YWlscy4KKworbWVyZ2V0b29sLjx0b29sPi5wYXRoOjoKKwlPdmVycmlkZSB0aGUgcGF0aCBmb3IgdGhlIGdpdmVuIHRvb2wuICBUaGlzIGlzIHVzZWZ1bCBpbiBjYXNlCisJeW91ciB0b29sIGlzIG5vdCBpbiB0aGUgUEFUSC4KKworbWVyZ2V0b29sLjx0b29sPi5jbWQ6OgorCVNwZWNpZnkgdGhlIGNvbW1hbmQgdG8gaW52b2tlIHRoZSBzcGVjaWZpZWQgbWVyZ2UgdG9vbC4gIFRoZQorCXNwZWNpZmllZCBjb21tYW5kIGlzIGV2YWx1YXRlZCBpbiBzaGVsbCB3aXRoIHRoZSBmb2xsb3dpbmcKKwl2YXJpYWJsZXMgYXZhaWxhYmxlOiAnQkFTRScgaXMgdGhlIG5hbWUgb2YgYSB0ZW1wb3JhcnkgZmlsZQorCWNvbnRhaW5pbmcgdGhlIGNvbW1vbiBiYXNlIG9mIHRoZSBmaWxlcyB0byBiZSBtZXJnZWQsIGlmIGF2YWlsYWJsZTsKKwknTE9DQUwnIGlzIHRoZSBuYW1lIG9mIGEgdGVtcG9yYXJ5IGZpbGUgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YKKwl0aGUgZmlsZSBvbiB0aGUgY3VycmVudCBicmFuY2g7ICdSRU1PVEUnIGlzIHRoZSBuYW1lIG9mIGEgdGVtcG9yYXJ5CisJZmlsZSBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBmcm9tIHRoZSBicmFuY2ggYmVpbmcKKwltZXJnZWQ7ICdNRVJHRUQnIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHdoaWNoIHRoZSBtZXJnZQorCXRvb2wgc2hvdWxkIHdyaXRlIHRoZSByZXN1bHRzIG9mIGEgc3VjY2Vzc2Z1bCBtZXJnZS4KKworbWVyZ2V0b29sLjx0b29sPi50cnVzdEV4aXRDb2RlOjoKKwlGb3IgYSBjdXN0b20gbWVyZ2UgY29tbWFuZCwgc3BlY2lmeSB3aGV0aGVyIHRoZSBleGl0IGNvZGUgb2YKKwl0aGUgbWVyZ2UgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgbWVyZ2Ugd2FzCisJc3VjY2Vzc2Z1bC4gIElmIHRoaXMgaXMgbm90IHNldCB0byB0cnVlIHRoZW4gdGhlIG1lcmdlIHRhcmdldCBmaWxlCisJdGltZXN0YW1wIGlzIGNoZWNrZWQgYW5kIHRoZSBtZXJnZSBhc3N1bWVkIHRvIGhhdmUgYmVlbiBzdWNjZXNzZnVsCisJaWYgdGhlIGZpbGUgaGFzIGJlZW4gdXBkYXRlZCwgb3RoZXJ3aXNlIHRoZSB1c2VyIGlzIHByb21wdGVkIHRvCisJaW5kaWNhdGUgdGhlIHN1Y2Nlc3Mgb2YgdGhlIG1lcmdlLgorCittZXJnZXRvb2wua2VlcEJhY2t1cDo6CisJQWZ0ZXIgcGVyZm9ybWluZyBhIG1lcmdlLCB0aGUgb3JpZ2luYWwgZmlsZSB3aXRoIGNvbmZsaWN0IG1hcmtlcnMKKwljYW4gYmUgc2F2ZWQgYXMgYSBmaWxlIHdpdGggYSBgLm9yaWdgIGV4dGVuc2lvbi4gIElmIHRoaXMgdmFyaWFibGUKKwlpcyBzZXQgdG8gYGZhbHNlYCB0aGVuIHRoaXMgZmlsZSBpcyBub3QgcHJlc2VydmVkLiAgRGVmYXVsdHMgdG8KKwlgdHJ1ZWAgKGkuZS4ga2VlcCB0aGUgYmFja3VwIGZpbGVzKS4KKworcGFjay53aW5kb3c6OgorCVRoZSBzaXplIG9mIHRoZSB3aW5kb3cgdXNlZCBieSBsaW5rZ2l0OmdpdC1wYWNrLW9iamVjdHNbMV0gd2hlbiBubworCXdpbmRvdyBzaXplIGlzIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuIERlZmF1bHRzIHRvIDEwLgorCitwYWNrLmRlcHRoOjoKKwlUaGUgbWF4aW11bSBkZWx0YSBkZXB0aCB1c2VkIGJ5IGxpbmtnaXQ6Z2l0LXBhY2stb2JqZWN0c1sxXSB3aGVuIG5vCisJbWF4aW11bSBkZXB0aCBpcyBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLiBEZWZhdWx0cyB0byA1MC4KKworcGFjay53aW5kb3dNZW1vcnk6OgorCVRoZSB3aW5kb3cgbWVtb3J5IHNpemUgbGltaXQgdXNlZCBieSBsaW5rZ2l0OmdpdC1wYWNrLW9iamVjdHNbMV0KKwl3aGVuIG5vIGxpbWl0IGlzIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuICBUaGUgdmFsdWUgY2FuIGJlCisJc3VmZml4ZWQgd2l0aCAiayIsICJtIiwgb3IgImciLiAgRGVmYXVsdHMgdG8gMCwgbWVhbmluZyBubworCWxpbWl0LgorCitwYWNrLmNvbXByZXNzaW9uOjoKKwlBbiBpbnRlZ2VyIC0xLi45LCBpbmRpY2F0aW5nIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBmb3Igb2JqZWN0cworCWluIGEgcGFjayBmaWxlLiAtMSBpcyB0aGUgemxpYiBkZWZhdWx0LiAwIG1lYW5zIG5vCisJY29tcHJlc3Npb24sIGFuZCAxLi45IGFyZSB2YXJpb3VzIHNwZWVkL3NpemUgdHJhZGVvZmZzLCA5IGJlaW5nCisJc2xvd2VzdC4gIElmIG5vdCBzZXQsICBkZWZhdWx0cyB0byBjb3JlLmNvbXByZXNzaW9uLiAgSWYgdGhhdCBpcworCW5vdCBzZXQsICBkZWZhdWx0cyB0byAtMSwgdGhlIHpsaWIgZGVmYXVsdCwgd2hpY2ggaXMgImEgZGVmYXVsdAorCWNvbXByb21pc2UgYmV0d2VlbiBzcGVlZCBhbmQgY29tcHJlc3Npb24gKGN1cnJlbnRseSBlcXVpdmFsZW50CisJdG8gbGV2ZWwgNikuIgorCitwYWNrLmRlbHRhQ2FjaGVTaXplOjoKKwlUaGUgbWF4aW11bSBtZW1vcnkgaW4gYnl0ZXMgdXNlZCBmb3IgY2FjaGluZyBkZWx0YXMgaW4KKwlsaW5rZ2l0OmdpdC1wYWNrLW9iamVjdHNbMV0uCisJQSB2YWx1ZSBvZiAwIG1lYW5zIG5vIGxpbWl0LiBEZWZhdWx0cyB0byAwLgorCitwYWNrLmRlbHRhQ2FjaGVMaW1pdDo6CisJVGhlIG1heGltdW0gc2l6ZSBvZiBhIGRlbHRhLCB0aGF0IGlzIGNhY2hlZCBpbgorCWxpbmtnaXQ6Z2l0LXBhY2stb2JqZWN0c1sxXS4gRGVmYXVsdHMgdG8gMTAwMC4KKworcGFjay50aHJlYWRzOjoKKwlTcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aHJlYWRzIHRvIHNwYXduIHdoZW4gc2VhcmNoaW5nIGZvciBiZXN0CisJZGVsdGEgbWF0Y2hlcy4gIFRoaXMgcmVxdWlyZXMgdGhhdCBsaW5rZ2l0OmdpdC1wYWNrLW9iamVjdHNbMV0KKwliZSBjb21waWxlZCB3aXRoIHB0aHJlYWRzIG90aGVyd2lzZSB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkIHdpdGggYQorCXdhcm5pbmcuIFRoaXMgaXMgbWVhbnQgdG8gcmVkdWNlIHBhY2tpbmcgdGltZSBvbiBtdWx0aXByb2Nlc3NvcgorCW1hY2hpbmVzLiBUaGUgcmVxdWlyZWQgYW1vdW50IG9mIG1lbW9yeSBmb3IgdGhlIGRlbHRhIHNlYXJjaCB3aW5kb3cKKwlpcyBob3dldmVyIG11bHRpcGxpZWQgYnkgdGhlIG51bWJlciBvZiB0aHJlYWRzLgorCVNwZWNpZnlpbmcgMCB3aWxsIGNhdXNlIGdpdCB0byBhdXRvLWRldGVjdCB0aGUgbnVtYmVyIG9mIENQVSdzCisJYW5kIHNldCB0aGUgbnVtYmVyIG9mIHRocmVhZHMgYWNjb3JkaW5nbHkuCisKK3BhY2suaW5kZXhWZXJzaW9uOjoKKwlTcGVjaWZ5IHRoZSBkZWZhdWx0IHBhY2sgaW5kZXggdmVyc2lvbi4gIFZhbGlkIHZhbHVlcyBhcmUgMSBmb3IKKwlsZWdhY3kgcGFjayBpbmRleCB1c2VkIGJ5IEdpdCB2ZXJzaW9ucyBwcmlvciB0byAxLjUuMiwgYW5kIDIgZm9yCisJdGhlIG5ldyBwYWNrIGluZGV4IHdpdGggY2FwYWJpbGl0aWVzIGZvciBwYWNrcyBsYXJnZXIgdGhhbiA0IEdCCisJYXMgd2VsbCBhcyBwcm9wZXIgcHJvdGVjdGlvbiBhZ2FpbnN0IHRoZSByZXBhY2tpbmcgb2YgY29ycnVwdGVkCisJcGFja3MuICBWZXJzaW9uIDIgaXMgc2VsZWN0ZWQgYW5kIHRoaXMgY29uZmlnIG9wdGlvbiBpZ25vcmVkCisJd2hlbmV2ZXIgdGhlIGNvcnJlc3BvbmRpbmcgcGFjayBpcyBsYXJnZXIgdGhhbiAyIEdCLiAgT3RoZXJ3aXNlCisJdGhlIGRlZmF1bHQgaXMgMS4KKworcGFjay5wYWNrU2l6ZUxpbWl0OjoKKwlUaGUgZGVmYXVsdCBtYXhpbXVtIHNpemUgb2YgYSBwYWNrLiAgVGhpcyBzZXR0aW5nIG9ubHkgYWZmZWN0cworCXBhY2tpbmcgdG8gYSBmaWxlLCBpLmUuIHRoZSBnaXQ6Ly8gcHJvdG9jb2wgaXMgdW5hZmZlY3RlZC4gIEl0CisJY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGBcLS1tYXgtcGFjay1zaXplYCBvcHRpb24gb2YKKwlsaW5rZ2l0OmdpdC1yZXBhY2tbMV0uCisKK3B1bGwub2N0b3B1czo6CisJVGhlIGRlZmF1bHQgbWVyZ2Ugc3RyYXRlZ3kgdG8gdXNlIHdoZW4gcHVsbGluZyBtdWx0aXBsZSBicmFuY2hlcworCWF0IG9uY2UuCisKK3B1bGwudHdvaGVhZDo6CisJVGhlIGRlZmF1bHQgbWVyZ2Ugc3RyYXRlZ3kgdG8gdXNlIHdoZW4gcHVsbGluZyBhIHNpbmdsZSBicmFuY2guCisKK3JlbW90ZS48bmFtZT4udXJsOjoKKwlUaGUgVVJMIG9mIGEgcmVtb3RlIHJlcG9zaXRvcnkuICBTZWUgbGlua2dpdDpnaXQtZmV0Y2hbMV0gb3IKKwlsaW5rZ2l0OmdpdC1wdXNoWzFdLgorCityZW1vdGUuPG5hbWU+LnByb3h5OjoKKwlGb3IgcmVtb3RlcyB0aGF0IHJlcXVpcmUgY3VybCAoaHR0cCwgaHR0cHMgYW5kIGZ0cCksIHRoZSBVUkwgdG8KKwl0aGUgcHJveHkgdG8gdXNlIGZvciB0aGF0IHJlbW90ZS4gIFNldCB0byB0aGUgZW1wdHkgc3RyaW5nIHRvCisJZGlzYWJsZSBwcm94eWluZyBmb3IgdGhhdCByZW1vdGUuCisKK3JlbW90ZS48bmFtZT4uZmV0Y2g6OgorCVRoZSBkZWZhdWx0IHNldCBvZiAicmVmc3BlYyIgZm9yIGxpbmtnaXQ6Z2l0LWZldGNoWzFdLiBTZWUKKwlsaW5rZ2l0OmdpdC1mZXRjaFsxXS4KKworcmVtb3RlLjxuYW1lPi5wdXNoOjoKKwlUaGUgZGVmYXVsdCBzZXQgb2YgInJlZnNwZWMiIGZvciBsaW5rZ2l0OmdpdC1wdXNoWzFdLiBTZWUKKwlsaW5rZ2l0OmdpdC1wdXNoWzFdLgorCityZW1vdGUuPG5hbWU+LnNraXBEZWZhdWx0VXBkYXRlOjoKKwlJZiB0cnVlLCB0aGlzIHJlbW90ZSB3aWxsIGJlIHNraXBwZWQgYnkgZGVmYXVsdCB3aGVuIHVwZGF0aW5nCisJdXNpbmcgdGhlIHVwZGF0ZSBzdWJjb21tYW5kIG9mIGxpbmtnaXQ6Z2l0LXJlbW90ZVsxXS4KKworcmVtb3RlLjxuYW1lPi5yZWNlaXZlcGFjazo6CisJVGhlIGRlZmF1bHQgcHJvZ3JhbSB0byBleGVjdXRlIG9uIHRoZSByZW1vdGUgc2lkZSB3aGVuIHB1c2hpbmcuICBTZWUKKwlvcHRpb24gXC0tcmVjZWl2ZS1wYWNrIG9mIGxpbmtnaXQ6Z2l0LXB1c2hbMV0uCisKK3JlbW90ZS48bmFtZT4udXBsb2FkcGFjazo6CisJVGhlIGRlZmF1bHQgcHJvZ3JhbSB0byBleGVjdXRlIG9uIHRoZSByZW1vdGUgc2lkZSB3aGVuIGZldGNoaW5nLiAgU2VlCisJb3B0aW9uIFwtLXVwbG9hZC1wYWNrIG9mIGxpbmtnaXQ6Z2l0LWZldGNoLXBhY2tbMV0uCisKK3JlbW90ZS48bmFtZT4udGFnb3B0OjoKKwlTZXR0aW5nIHRoaXMgdmFsdWUgdG8gXC0tbm8tdGFncyBkaXNhYmxlcyBhdXRvbWF0aWMgdGFnIGZvbGxvd2luZyB3aGVuCisJZmV0Y2hpbmcgZnJvbSByZW1vdGUgPG5hbWU+CisKK3JlbW90ZXMuPGdyb3VwPjo6CisJVGhlIGxpc3Qgb2YgcmVtb3RlcyB3aGljaCBhcmUgZmV0Y2hlZCBieSAiZ2l0IHJlbW90ZSB1cGRhdGUKKwk8Z3JvdXA+Ii4gIFNlZSBsaW5rZ2l0OmdpdC1yZW1vdGVbMV0uCisKK3JlcGFjay51c2VkZWx0YWJhc2VvZmZzZXQ6OgorCUFsbG93IGxpbmtnaXQ6Z2l0LXJlcGFja1sxXSB0byBjcmVhdGUgcGFja3MgdGhhdCB1c2VzCisJZGVsdGEtYmFzZSBvZmZzZXQuICBEZWZhdWx0cyB0byBmYWxzZS4KKworc2hvdy5kaWZmdHJlZTo6CisJVGhlIGRlZmF1bHQgbGlua2dpdDpnaXQtZGlmZi10cmVlWzFdIGFyZ3VtZW50cyB0byBiZSB1c2VkCisJZm9yIGxpbmtnaXQ6Z2l0LXNob3dbMV0uCisKK3Nob3dicmFuY2guZGVmYXVsdDo6CisJVGhlIGRlZmF1bHQgc2V0IG9mIGJyYW5jaGVzIGZvciBsaW5rZ2l0OmdpdC1zaG93LWJyYW5jaFsxXS4KKwlTZWUgbGlua2dpdDpnaXQtc2hvdy1icmFuY2hbMV0uCisKK3N0YXR1cy5yZWxhdGl2ZVBhdGhzOjoKKwlCeSBkZWZhdWx0LCBsaW5rZ2l0OmdpdC1zdGF0dXNbMV0gc2hvd3MgcGF0aHMgcmVsYXRpdmUgdG8gdGhlCisJY3VycmVudCBkaXJlY3RvcnkuIFNldHRpbmcgdGhpcyB2YXJpYWJsZSB0byBgZmFsc2VgIHNob3dzIHBhdGhzCisJcmVsYXRpdmUgdG8gdGhlIHJlcG9zaXRvcnkgcm9vdCAodGhpcyB3YXMgdGhlIGRlZmF1bHQgZm9yIGdpdAorCXByaW9yIHRvIHYxLjUuNCkuCisKK3Rhci51bWFzazo6CisJVGhpcyB2YXJpYWJsZSBjYW4gYmUgdXNlZCB0byByZXN0cmljdCB0aGUgcGVybWlzc2lvbiBiaXRzIG9mCisJdGFyIGFyY2hpdmUgZW50cmllcy4gIFRoZSBkZWZhdWx0IGlzIDAwMDIsIHdoaWNoIHR1cm5zIG9mZiB0aGUKKwl3b3JsZCB3cml0ZSBiaXQuICBUaGUgc3BlY2lhbCB2YWx1ZSAidXNlciIgaW5kaWNhdGVzIHRoYXQgdGhlCisJYXJjaGl2aW5nIHVzZXIncyB1bWFzayB3aWxsIGJlIHVzZWQgaW5zdGVhZC4gIFNlZSB1bWFzaygyKSBhbmQKKwlsaW5rZ2l0OmdpdC1hcmNoaXZlWzFdLgorCit1cmwuPGJhc2U+Lmluc3RlYWRPZjo6CisJQW55IFVSTCB0aGF0IHN0YXJ0cyB3aXRoIHRoaXMgdmFsdWUgd2lsbCBiZSByZXdyaXR0ZW4gdG8KKwlzdGFydCwgaW5zdGVhZCwgd2l0aCA8YmFzZT4uIEluIGNhc2VzIHdoZXJlIHNvbWUgc2l0ZSBzZXJ2ZXMgYQorCWxhcmdlIG51bWJlciBvZiByZXBvc2l0b3JpZXMsIGFuZCBzZXJ2ZXMgdGhlbSB3aXRoIG11bHRpcGxlCisJYWNjZXNzIG1ldGhvZHMsIGFuZCBzb21lIHVzZXJzIG5lZWQgdG8gdXNlIGRpZmZlcmVudCBhY2Nlc3MKKwltZXRob2RzLCB0aGlzIGZlYXR1cmUgYWxsb3dzIHBlb3BsZSB0byBzcGVjaWZ5IGFueSBvZiB0aGUKKwllcXVpdmFsZW50IFVSTHMgYW5kIGhhdmUgZ2l0IGF1dG9tYXRpY2FsbHkgcmV3cml0ZSB0aGUgVVJMIHRvCisJdGhlIGJlc3QgYWx0ZXJuYXRpdmUgZm9yIHRoZSBwYXJ0aWN1bGFyIHVzZXIsIGV2ZW4gZm9yIGEKKwluZXZlci1iZWZvcmUtc2VlbiByZXBvc2l0b3J5IG9uIHRoZSBzaXRlLiAgV2hlbiBtb3JlIHRoYW4gb25lCisJaW5zdGVhZE9mIHN0cmluZ3MgbWF0Y2ggYSBnaXZlbiBVUkwsIHRoZSBsb25nZXN0IG1hdGNoIGlzIHVzZWQuCisKK3VzZXIuZW1haWw6OgorCVlvdXIgZW1haWwgYWRkcmVzcyB0byBiZSByZWNvcmRlZCBpbiBhbnkgbmV3bHkgY3JlYXRlZCBjb21taXRzLgorCUNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSAnR0lUX0FVVEhPUl9FTUFJTCcsICdHSVRfQ09NTUlUVEVSX0VNQUlMJywgYW5kCisJJ0VNQUlMJyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuICBTZWUgbGlua2dpdDpnaXQtY29tbWl0LXRyZWVbMV0uCisKK3VzZXIubmFtZTo6CisJWW91ciBmdWxsIG5hbWUgdG8gYmUgcmVjb3JkZWQgaW4gYW55IG5ld2x5IGNyZWF0ZWQgY29tbWl0cy4KKwlDYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgJ0dJVF9BVVRIT1JfTkFNRScgYW5kICdHSVRfQ09NTUlUVEVSX05BTUUnCisJZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgU2VlIGxpbmtnaXQ6Z2l0LWNvbW1pdC10cmVlWzFdLgorCit1c2VyLnNpZ25pbmdrZXk6OgorCUlmIGxpbmtnaXQ6Z2l0LXRhZ1sxXSBpcyBub3Qgc2VsZWN0aW5nIHRoZSBrZXkgeW91IHdhbnQgaXQgdG8KKwlhdXRvbWF0aWNhbGx5IHdoZW4gY3JlYXRpbmcgYSBzaWduZWQgdGFnLCB5b3UgY2FuIG92ZXJyaWRlIHRoZQorCWRlZmF1bHQgc2VsZWN0aW9uIHdpdGggdGhpcyB2YXJpYWJsZS4gIFRoaXMgb3B0aW9uIGlzIHBhc3NlZAorCXVuY2hhbmdlZCB0byBncGcncyAtLWxvY2FsLXVzZXIgcGFyYW1ldGVyLCBzbyB5b3UgbWF5IHNwZWNpZnkgYSBrZXkKKwl1c2luZyBhbnkgbWV0aG9kIHRoYXQgZ3BnIHN1cHBvcnRzLgorCit3aGF0Y2hhbmdlZC5kaWZmdHJlZTo6CisJVGhlIGRlZmF1bHQgbGlua2dpdDpnaXQtZGlmZi10cmVlWzFdIGFyZ3VtZW50cyB0byBiZSB1c2VkCisJZm9yIGxpbmtnaXQ6Z2l0LXdoYXRjaGFuZ2VkWzFdLgorCitpbWFwOjoKKwlUaGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgaW4gdGhlICdpbWFwJyBzZWN0aW9uIGFyZSBkZXNjcmliZWQKKwlpbiBsaW5rZ2l0OmdpdC1pbWFwLXNlbmRbMV0uCisKK3JlY2VpdmUudW5wYWNrTGltaXQ6OgorCUlmIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyByZWNlaXZlZCBpbiBhIHB1c2ggaXMgYmVsb3cgdGhpcworCWxpbWl0IHRoZW4gdGhlIG9iamVjdHMgd2lsbCBiZSB1bnBhY2tlZCBpbnRvIGxvb3NlIG9iamVjdAorCWZpbGVzLiBIb3dldmVyIGlmIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgb2JqZWN0cyBlcXVhbHMgb3IKKwlleGNlZWRzIHRoaXMgbGltaXQgdGhlbiB0aGUgcmVjZWl2ZWQgcGFjayB3aWxsIGJlIHN0b3JlZCBhcworCWEgcGFjaywgYWZ0ZXIgYWRkaW5nIGFueSBtaXNzaW5nIGRlbHRhIGJhc2VzLiAgU3RvcmluZyB0aGUKKwlwYWNrIGZyb20gYSBwdXNoIGNhbiBtYWtlIHRoZSBwdXNoIG9wZXJhdGlvbiBjb21wbGV0ZSBmYXN0ZXIsCisJZXNwZWNpYWxseSBvbiBzbG93IGZpbGVzeXN0ZW1zLiAgSWYgbm90IHNldCwgdGhlIHZhbHVlIG9mCisJYHRyYW5zZmVyLnVucGFja0xpbWl0YCBpcyB1c2VkIGluc3RlYWQuCisKK3JlY2VpdmUuZGVueU5vbkZhc3RGb3J3YXJkczo6CisJSWYgc2V0IHRvIHRydWUsIGdpdC1yZWNlaXZlLXBhY2sgd2lsbCBkZW55IGEgcmVmIHVwZGF0ZSB3aGljaCBpcworCW5vdCBhIGZhc3QgZm9yd2FyZC4gVXNlIHRoaXMgdG8gcHJldmVudCBzdWNoIGFuIHVwZGF0ZSB2aWEgYSBwdXNoLAorCWV2ZW4gaWYgdGhhdCBwdXNoIGlzIGZvcmNlZC4gVGhpcyBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGlzCisJc2V0IHdoZW4gaW5pdGlhbGl6aW5nIGEgc2hhcmVkIHJlcG9zaXRvcnkuCisKK3RyYW5zZmVyLnVucGFja0xpbWl0OjoKKwlXaGVuIGBmZXRjaC51bnBhY2tMaW1pdGAgb3IgYHJlY2VpdmUudW5wYWNrTGltaXRgIGFyZQorCW5vdCBzZXQsIHRoZSB2YWx1ZSBvZiB0aGlzIHZhcmlhYmxlIGlzIHVzZWQgaW5zdGVhZC4KKwlUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxMDAuCisKK3dlYi5icm93c2VyOjoKKwlTcGVjaWZ5IGEgd2ViIGJyb3dzZXIgdGhhdCBtYXkgYmUgdXNlZCBieSBzb21lIGNvbW1hbmRzLgorCUN1cnJlbnRseSBvbmx5IGxpbmtnaXQ6Z2l0LWluc3Rhd2ViWzFdIGFuZCBsaW5rZ2l0OmdpdC1oZWxwWzFdCisJbWF5IHVzZSBpdC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY29yZS10dXRvcmlhbC50eHQgYi9Eb2N1bWVudGF0aW9uL2NvcmUtdHV0b3JpYWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNDBkZmQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2NvcmUtdHV0b3JpYWwudHh0CkBAIC0wLDAgKzEsMTY4MSBAQAorQSBnaXQgY29yZSB0dXRvcmlhbCBmb3IgZGV2ZWxvcGVycworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJbnRyb2R1Y3Rpb24KKy0tLS0tLS0tLS0tLQorCitUaGlzIHR1dG9yaWFsIGV4cGxhaW5zIGhvdyB0byB1c2UgdGhlICJjb3JlIiBnaXQgcHJvZ3JhbXMgdG8gc2V0IHVwIGFuZAord29yayB3aXRoIGEgZ2l0IHJlcG9zaXRvcnkuCisKK0lmIHlvdSBqdXN0IG5lZWQgdG8gdXNlIGdpdCBhcyBhIHJldmlzaW9uIGNvbnRyb2wgc3lzdGVtIHlvdSBtYXkgcHJlZmVyCit0byBzdGFydCB3aXRoIGxpbms6dHV0b3JpYWwuaHRtbFthIHR1dG9yaWFsIGludHJvZHVjdGlvbiB0byBnaXRdIG9yCitsaW5rOnVzZXItbWFudWFsLmh0bWxbdGhlIGdpdCB1c2VyIG1hbnVhbF0uCisKK0hvd2V2ZXIsIGFuIHVuZGVyc3RhbmRpbmcgb2YgdGhlc2UgbG93LWxldmVsIHRvb2xzIGNhbiBiZSBoZWxwZnVsIGlmCit5b3Ugd2FudCB0byB1bmRlcnN0YW5kIGdpdCdzIGludGVybmFscy4KKworVGhlIGNvcmUgZ2l0IGlzIG9mdGVuIGNhbGxlZCAicGx1bWJpbmciLCB3aXRoIHRoZSBwcmV0dGllciB1c2VyCitpbnRlcmZhY2VzIG9uIHRvcCBvZiBpdCBjYWxsZWQgInBvcmNlbGFpbiIuIFlvdSBtYXkgbm90IHdhbnQgdG8gdXNlIHRoZQorcGx1bWJpbmcgZGlyZWN0bHkgdmVyeSBvZnRlbiwgYnV0IGl0IGNhbiBiZSBnb29kIHRvIGtub3cgd2hhdCB0aGUKK3BsdW1iaW5nIGRvZXMgZm9yIHdoZW4gdGhlIHBvcmNlbGFpbiBpc24ndCBmbHVzaGluZy4KKworW05PVEVdCitEZWVwZXIgdGVjaG5pY2FsIGRldGFpbHMgYXJlIG9mdGVuIG1hcmtlZCBhcyBOb3Rlcywgd2hpY2ggeW91IGNhbgorc2tpcCBvbiB5b3VyIGZpcnN0IHJlYWRpbmcuCisKKworQ3JlYXRpbmcgYSBnaXQgcmVwb3NpdG9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDcmVhdGluZyBhIG5ldyBnaXQgcmVwb3NpdG9yeSBjb3VsZG4ndCBiZSBlYXNpZXI6IGFsbCBnaXQgcmVwb3NpdG9yaWVzIHN0YXJ0CitvdXQgZW1wdHksIGFuZCB0aGUgb25seSB0aGluZyB5b3UgbmVlZCB0byBkbyBpcyBmaW5kIHlvdXJzZWxmIGEKK3N1YmRpcmVjdG9yeSB0aGF0IHlvdSB3YW50IHRvIHVzZSBhcyBhIHdvcmtpbmcgdHJlZSAtIGVpdGhlciBhbiBlbXB0eQorb25lIGZvciBhIHRvdGFsbHkgbmV3IHByb2plY3QsIG9yIGFuIGV4aXN0aW5nIHdvcmtpbmcgdHJlZSB0aGF0IHlvdSB3YW50Cit0byBpbXBvcnQgaW50byBnaXQuCisKK0ZvciBvdXIgZmlyc3QgZXhhbXBsZSwgd2UncmUgZ29pbmcgdG8gc3RhcnQgYSB0b3RhbGx5IG5ldyByZXBvc2l0b3J5IGZyb20KK3NjcmF0Y2gsIHdpdGggbm8gcHJlLWV4aXN0aW5nIGZpbGVzLCBhbmQgd2UnbGwgY2FsbCBpdCBgZ2l0LXR1dG9yaWFsYC4KK1RvIHN0YXJ0IHVwLCBjcmVhdGUgYSBzdWJkaXJlY3RvcnkgZm9yIGl0LCBjaGFuZ2UgaW50byB0aGF0CitzdWJkaXJlY3RvcnksIGFuZCBpbml0aWFsaXplIHRoZSBnaXQgaW5mcmFzdHJ1Y3R1cmUgd2l0aCBgZ2l0LWluaXRgOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgbWtkaXIgZ2l0LXR1dG9yaWFsCiskIGNkIGdpdC10dXRvcmlhbAorJCBnaXQtaW5pdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RvIHdoaWNoIGdpdCB3aWxsIHJlcGx5CisKKy0tLS0tLS0tLS0tLS0tLS0KK0luaXRpYWxpemVkIGVtcHR5IEdpdCByZXBvc2l0b3J5IGluIC5naXQvCistLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIGlzIGp1c3QgZ2l0J3Mgd2F5IG9mIHNheWluZyB0aGF0IHlvdSBoYXZlbid0IGJlZW4gZG9pbmcgYW55dGhpbmcKK3N0cmFuZ2UsIGFuZCB0aGF0IGl0IHdpbGwgaGF2ZSBjcmVhdGVkIGEgbG9jYWwgYC5naXRgIGRpcmVjdG9yeSBzZXR1cCBmb3IKK3lvdXIgbmV3IHByb2plY3QuIFlvdSB3aWxsIG5vdyBoYXZlIGEgYC5naXRgIGRpcmVjdG9yeSwgYW5kIHlvdSBjYW4KK2luc3BlY3QgdGhhdCB3aXRoIGBsc2AuIEZvciB5b3VyIG5ldyBlbXB0eSBwcm9qZWN0LCBpdCBzaG91bGQgc2hvdyB5b3UKK3RocmVlIGVudHJpZXMsIGFtb25nIG90aGVyIHRoaW5nczoKKworIC0gYSBmaWxlIGNhbGxlZCBgSEVBRGAsIHRoYXQgaGFzIGByZWY6IHJlZnMvaGVhZHMvbWFzdGVyYCBpbiBpdC4KKyAgIFRoaXMgaXMgc2ltaWxhciB0byBhIHN5bWJvbGljIGxpbmsgYW5kIHBvaW50cyBhdAorICAgYHJlZnMvaGVhZHMvbWFzdGVyYCByZWxhdGl2ZSB0byB0aGUgYEhFQURgIGZpbGUuCisrCitEb24ndCB3b3JyeSBhYm91dCB0aGUgZmFjdCB0aGF0IHRoZSBmaWxlIHRoYXQgdGhlIGBIRUFEYCBsaW5rIHBvaW50cyB0bworZG9lc24ndCBldmVuIGV4aXN0IHlldCAtLSB5b3UgaGF2ZW4ndCBjcmVhdGVkIHRoZSBjb21taXQgdGhhdCB3aWxsCitzdGFydCB5b3VyIGBIRUFEYCBkZXZlbG9wbWVudCBicmFuY2ggeWV0LgorCisgLSBhIHN1YmRpcmVjdG9yeSBjYWxsZWQgYG9iamVjdHNgLCB3aGljaCB3aWxsIGNvbnRhaW4gYWxsIHRoZQorICAgb2JqZWN0cyBvZiB5b3VyIHByb2plY3QuIFlvdSBzaG91bGQgbmV2ZXIgaGF2ZSBhbnkgcmVhbCByZWFzb24gdG8KKyAgIGxvb2sgYXQgdGhlIG9iamVjdHMgZGlyZWN0bHksIGJ1dCB5b3UgbWlnaHQgd2FudCB0byBrbm93IHRoYXQgdGhlc2UKKyAgIG9iamVjdHMgYXJlIHdoYXQgY29udGFpbnMgYWxsIHRoZSByZWFsICdkYXRhJyBpbiB5b3VyIHJlcG9zaXRvcnkuCisKKyAtIGEgc3ViZGlyZWN0b3J5IGNhbGxlZCBgcmVmc2AsIHdoaWNoIGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gb2JqZWN0cy4KKworSW4gcGFydGljdWxhciwgdGhlIGByZWZzYCBzdWJkaXJlY3Rvcnkgd2lsbCBjb250YWluIHR3byBvdGhlcgorc3ViZGlyZWN0b3JpZXMsIG5hbWVkIGBoZWFkc2AgYW5kIGB0YWdzYCByZXNwZWN0aXZlbHkuIFRoZXkgZG8KK2V4YWN0bHkgd2hhdCB0aGVpciBuYW1lcyBpbXBseTogdGhleSBjb250YWluIHJlZmVyZW5jZXMgdG8gYW55IG51bWJlcgorb2YgZGlmZmVyZW50ICdoZWFkcycgb2YgZGV2ZWxvcG1lbnQgKGFrYSAnYnJhbmNoZXMnKSwgYW5kIHRvIGFueQorJ3RhZ3MnIHRoYXQgeW91IGhhdmUgY3JlYXRlZCB0byBuYW1lIHNwZWNpZmljIHZlcnNpb25zIGluIHlvdXIKK3JlcG9zaXRvcnkuCisKK09uZSBub3RlOiB0aGUgc3BlY2lhbCBgbWFzdGVyYCBoZWFkIGlzIHRoZSBkZWZhdWx0IGJyYW5jaCwgd2hpY2ggaXMKK3doeSB0aGUgYC5naXQvSEVBRGAgZmlsZSB3YXMgY3JlYXRlZCBwb2ludHMgdG8gaXQgZXZlbiBpZiBpdAorZG9lc24ndCB5ZXQgZXhpc3QuIEJhc2ljYWxseSwgdGhlIGBIRUFEYCBsaW5rIGlzIHN1cHBvc2VkIHRvIGFsd2F5cworcG9pbnQgdG8gdGhlIGJyYW5jaCB5b3UgYXJlIHdvcmtpbmcgb24gcmlnaHQgbm93LCBhbmQgeW91IGFsd2F5cworc3RhcnQgb3V0IGV4cGVjdGluZyB0byB3b3JrIG9uIHRoZSBgbWFzdGVyYCBicmFuY2guCisKK0hvd2V2ZXIsIHRoaXMgaXMgb25seSBhIGNvbnZlbnRpb24sIGFuZCB5b3UgY2FuIG5hbWUgeW91ciBicmFuY2hlcworYW55dGhpbmcgeW91IHdhbnQsIGFuZCBkb24ndCBoYXZlIHRvIGV2ZXIgZXZlbiAnaGF2ZScgYSBgbWFzdGVyYAorYnJhbmNoLiBBIG51bWJlciBvZiB0aGUgZ2l0IHRvb2xzIHdpbGwgYXNzdW1lIHRoYXQgYC5naXQvSEVBRGAgaXMKK3ZhbGlkLCB0aG91Z2guCisKK1tOT1RFXQorQW4gJ29iamVjdCcgaXMgaWRlbnRpZmllZCBieSBpdHMgMTYwLWJpdCBTSEExIGhhc2gsIGFrYSAnb2JqZWN0IG5hbWUnLAorYW5kIGEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBpcyBhbHdheXMgdGhlIDQwLWJ5dGUgaGV4CityZXByZXNlbnRhdGlvbiBvZiB0aGF0IFNIQTEgbmFtZS4gVGhlIGZpbGVzIGluIHRoZSBgcmVmc2AKK3N1YmRpcmVjdG9yeSBhcmUgZXhwZWN0ZWQgdG8gY29udGFpbiB0aGVzZSBoZXggcmVmZXJlbmNlcworKHVzdWFsbHkgd2l0aCBhIGZpbmFsIGBcJ1xuXCdgIGF0IHRoZSBlbmQpLCBhbmQgeW91IHNob3VsZCB0aHVzCitleHBlY3QgdG8gc2VlIGEgbnVtYmVyIG9mIDQxLWJ5dGUgZmlsZXMgY29udGFpbmluZyB0aGVzZQorcmVmZXJlbmNlcyBpbiB0aGVzZSBgcmVmc2Agc3ViZGlyZWN0b3JpZXMgd2hlbiB5b3UgYWN0dWFsbHkgc3RhcnQKK3BvcHVsYXRpbmcgeW91ciB0cmVlLgorCitbTk9URV0KK0FuIGFkdmFuY2VkIHVzZXIgbWF5IHdhbnQgdG8gdGFrZSBhIGxvb2sgYXQgdGhlCitsaW5rOnJlcG9zaXRvcnktbGF5b3V0Lmh0bWxbcmVwb3NpdG9yeSBsYXlvdXRdIGRvY3VtZW50CithZnRlciBmaW5pc2hpbmcgdGhpcyB0dXRvcmlhbC4KKworWW91IGhhdmUgbm93IGNyZWF0ZWQgeW91ciBmaXJzdCBnaXQgcmVwb3NpdG9yeS4gT2YgY291cnNlLCBzaW5jZSBpdCdzCitlbXB0eSwgdGhhdCdzIG5vdCB2ZXJ5IHVzZWZ1bCwgc28gbGV0J3Mgc3RhcnQgcG9wdWxhdGluZyBpdCB3aXRoIGRhdGEuCisKKworUG9wdWxhdGluZyBhIGdpdCByZXBvc2l0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2UnbGwga2VlcCB0aGlzIHNpbXBsZSBhbmQgc3R1cGlkLCBzbyB3ZSdsbCBzdGFydCBvZmYgd2l0aCBwb3B1bGF0aW5nIGEKK2ZldyB0cml2aWFsIGZpbGVzIGp1c3QgdG8gZ2V0IGEgZmVlbCBmb3IgaXQuCisKK1N0YXJ0IG9mZiB3aXRoIGp1c3QgY3JlYXRpbmcgYW55IHJhbmRvbSBmaWxlcyB0aGF0IHlvdSB3YW50IHRvIG1haW50YWluCitpbiB5b3VyIGdpdCByZXBvc2l0b3J5LiBXZSdsbCBzdGFydCBvZmYgd2l0aCBhIGZldyBiYWQgZXhhbXBsZXMsIGp1c3QgdG8KK2dldCBhIGZlZWwgZm9yIGhvdyB0aGlzIHdvcmtzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZWNobyAiSGVsbG8gV29ybGQiID5oZWxsbworJCBlY2hvICJTaWxseSBleGFtcGxlIiA+ZXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3lvdSBoYXZlIG5vdyBjcmVhdGVkIHR3byBmaWxlcyBpbiB5b3VyIHdvcmtpbmcgdHJlZSAoYWthICd3b3JraW5nIGRpcmVjdG9yeScpLAorYnV0IHRvIGFjdHVhbGx5IGNoZWNrIGluIHlvdXIgaGFyZCB3b3JrLCB5b3Ugd2lsbCBoYXZlIHRvIGdvIHRocm91Z2ggdHdvIHN0ZXBzOgorCisgLSBmaWxsIGluIHRoZSAnaW5kZXgnIGZpbGUgKGFrYSAnY2FjaGUnKSB3aXRoIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB5b3VyCisgICB3b3JraW5nIHRyZWUgc3RhdGUuCisKKyAtIGNvbW1pdCB0aGF0IGluZGV4IGZpbGUgYXMgYW4gb2JqZWN0LgorCitUaGUgZmlyc3Qgc3RlcCBpcyB0cml2aWFsOiB3aGVuIHlvdSB3YW50IHRvIHRlbGwgZ2l0IGFib3V0IGFueSBjaGFuZ2VzCit0byB5b3VyIHdvcmtpbmcgdHJlZSwgeW91IHVzZSB0aGUgYGdpdC11cGRhdGUtaW5kZXhgIHByb2dyYW0uIFRoYXQKK3Byb2dyYW0gbm9ybWFsbHkganVzdCB0YWtlcyBhIGxpc3Qgb2YgZmlsZW5hbWVzIHlvdSB3YW50IHRvIHVwZGF0ZSwgYnV0Cit0byBhdm9pZCB0cml2aWFsIG1pc3Rha2VzLCBpdCByZWZ1c2VzIHRvIGFkZCBuZXcgZW50cmllcyB0byB0aGUgaW5kZXgKKyhvciByZW1vdmUgZXhpc3Rpbmcgb25lcykgdW5sZXNzIHlvdSBleHBsaWNpdGx5IHRlbGwgaXQgdGhhdCB5b3UncmUKK2FkZGluZyBhIG5ldyBlbnRyeSB3aXRoIHRoZSBgXC0tYWRkYCBmbGFnIChvciByZW1vdmluZyBhbiBlbnRyeSB3aXRoIHRoZQorYFwtLXJlbW92ZWApIGZsYWcuCisKK1NvIHRvIHBvcHVsYXRlIHRoZSBpbmRleCB3aXRoIHRoZSB0d28gZmlsZXMgeW91IGp1c3QgY3JlYXRlZCwgeW91IGNhbiBkbworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBoZWxsbyBleGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIHlvdSBoYXZlIG5vdyB0b2xkIGdpdCB0byB0cmFjayB0aG9zZSB0d28gZmlsZXMuCisKK0luIGZhY3QsIGFzIHlvdSBkaWQgdGhhdCwgaWYgeW91IG5vdyBsb29rIGludG8geW91ciBvYmplY3QgZGlyZWN0b3J5LAoreW91J2xsIG5vdGljZSB0aGF0IGdpdCB3aWxsIGhhdmUgYWRkZWQgdHdvIG5ldyBvYmplY3RzIHRvIHRoZSBvYmplY3QKK2RhdGFiYXNlLiBJZiB5b3UgZGlkIGV4YWN0bHkgdGhlIHN0ZXBzIGFib3ZlLCB5b3Ugc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGRvCisKKworLS0tLS0tLS0tLS0tLS0tLQorJCBscyAuZ2l0L29iamVjdHMvPz8vKgorLS0tLS0tLS0tLS0tLS0tLQorCithbmQgc2VlIHR3byBmaWxlczoKKworLS0tLS0tLS0tLS0tLS0tLQorLmdpdC9vYmplY3RzLzU1LzdkYjAzZGU5OTdjODZhNGEwMjhlMWViZDNhMWNlYjIyNWJlMjM4CisuZ2l0L29iamVjdHMvZjIvNGM3NGEyZTUwMGY1ZWUxMzMyYzg2Yjk0MTk5ZjUyYjFkMWQ5NjIKKy0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggY29ycmVzcG9uZCB3aXRoIHRoZSBvYmplY3RzIHdpdGggbmFtZXMgb2YgYDU1N2RiLi4uYCBhbmQKK2BmMjRjNy4uLmAgcmVzcGVjdGl2ZWx5LgorCitJZiB5b3Ugd2FudCB0bywgeW91IGNhbiB1c2UgYGdpdC1jYXQtZmlsZWAgdG8gbG9vayBhdCB0aG9zZSBvYmplY3RzLCBidXQKK3lvdSdsbCBoYXZlIHRvIHVzZSB0aGUgb2JqZWN0IG5hbWUsIG5vdCB0aGUgZmlsZW5hbWUgb2YgdGhlIG9iamVjdDoKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtY2F0LWZpbGUgLXQgNTU3ZGIwM2RlOTk3Yzg2YTRhMDI4ZTFlYmQzYTFjZWIyMjViZTIzOAorLS0tLS0tLS0tLS0tLS0tLQorCit3aGVyZSB0aGUgYC10YCB0ZWxscyBgZ2l0LWNhdC1maWxlYCB0byB0ZWxsIHlvdSB3aGF0IHRoZSAidHlwZSIgb2YgdGhlCitvYmplY3QgaXMuIGdpdCB3aWxsIHRlbGwgeW91IHRoYXQgeW91IGhhdmUgYSAiYmxvYiIgb2JqZWN0IChpLmUuLCBqdXN0IGEKK3JlZ3VsYXIgZmlsZSksIGFuZCB5b3UgY2FuIHNlZSB0aGUgY29udGVudHMgd2l0aAorCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1jYXQtZmlsZSAiYmxvYiIgNTU3ZGIwMworLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCB3aWxsIHByaW50IG91dCAiSGVsbG8gV29ybGQiLiBUaGUgb2JqZWN0IGA1NTdkYjAzYCBpcyBub3RoaW5nCittb3JlIHRoYW4gdGhlIGNvbnRlbnRzIG9mIHlvdXIgZmlsZSBgaGVsbG9gLgorCitbTk9URV0KK0Rvbid0IGNvbmZ1c2UgdGhhdCBvYmplY3Qgd2l0aCB0aGUgZmlsZSBgaGVsbG9gIGl0c2VsZi4gVGhlCitvYmplY3QgaXMgbGl0ZXJhbGx5IGp1c3QgdGhvc2Ugc3BlY2lmaWMgKmNvbnRlbnRzKiBvZiB0aGUgZmlsZSwgYW5kCitob3dldmVyIG11Y2ggeW91IGxhdGVyIGNoYW5nZSB0aGUgY29udGVudHMgaW4gZmlsZSBgaGVsbG9gLCB0aGUgb2JqZWN0Cit3ZSBqdXN0IGxvb2tlZCBhdCB3aWxsIG5ldmVyIGNoYW5nZS4gT2JqZWN0cyBhcmUgaW1tdXRhYmxlLgorCitbTk9URV0KK1RoZSBzZWNvbmQgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhhdCB5b3UgY2FuCithYmJyZXZpYXRlIHRoZSBvYmplY3QgbmFtZSB0byBvbmx5IHRoZSBmaXJzdCBzZXZlcmFsCitoZXhhZGVjaW1hbCBkaWdpdHMgaW4gbW9zdCBwbGFjZXMuCisKK0FueXdheSwgYXMgd2UgbWVudGlvbmVkIHByZXZpb3VzbHksIHlvdSBub3JtYWxseSBuZXZlciBhY3R1YWxseSB0YWtlIGEKK2xvb2sgYXQgdGhlIG9iamVjdHMgdGhlbXNlbHZlcywgYW5kIHR5cGluZyBsb25nIDQwLWNoYXJhY3RlciBoZXgKK25hbWVzIGlzIG5vdCBzb21ldGhpbmcgeW91J2Qgbm9ybWFsbHkgd2FudCB0byBkby4gVGhlIGFib3ZlIGRpZ3Jlc3Npb24KK3dhcyBqdXN0IHRvIHNob3cgdGhhdCBgZ2l0LXVwZGF0ZS1pbmRleGAgZGlkIHNvbWV0aGluZyBtYWdpY2FsLCBhbmQKK2FjdHVhbGx5IHNhdmVkIGF3YXkgdGhlIGNvbnRlbnRzIG9mIHlvdXIgZmlsZXMgaW50byB0aGUgZ2l0IG9iamVjdAorZGF0YWJhc2UuCisKK1VwZGF0aW5nIHRoZSBpbmRleCBkaWQgc29tZXRoaW5nIGVsc2UgdG9vOiBpdCBjcmVhdGVkIGEgYC5naXQvaW5kZXhgCitmaWxlLiBUaGlzIGlzIHRoZSBpbmRleCB0aGF0IGRlc2NyaWJlcyB5b3VyIGN1cnJlbnQgd29ya2luZyB0cmVlLCBhbmQKK3NvbWV0aGluZyB5b3Ugc2hvdWxkIGJlIHZlcnkgYXdhcmUgb2YuIEFnYWluLCB5b3Ugbm9ybWFsbHkgbmV2ZXIgd29ycnkKK2Fib3V0IHRoZSBpbmRleCBmaWxlIGl0c2VsZiwgYnV0IHlvdSBzaG91bGQgYmUgYXdhcmUgb2YgdGhlIGZhY3QgdGhhdAoreW91IGhhdmUgbm90IGFjdHVhbGx5IHJlYWxseSAiY2hlY2tlZCBpbiIgeW91ciBmaWxlcyBpbnRvIGdpdCBzbyBmYXIsCit5b3UndmUgb25seSAqdG9sZCogZ2l0IGFib3V0IHRoZW0uCisKK0hvd2V2ZXIsIHNpbmNlIGdpdCBrbm93cyBhYm91dCB0aGVtLCB5b3UgY2FuIG5vdyBzdGFydCB1c2luZyBzb21lIG9mIHRoZQorbW9zdCBiYXNpYyBnaXQgY29tbWFuZHMgdG8gbWFuaXB1bGF0ZSB0aGUgZmlsZXMgb3IgbG9vayBhdCB0aGVpciBzdGF0dXMuCisKK0luIHBhcnRpY3VsYXIsIGxldCdzIG5vdCBldmVuIGNoZWNrIGluIHRoZSB0d28gZmlsZXMgaW50byBnaXQgeWV0LCB3ZSdsbAorc3RhcnQgb2ZmIGJ5IGFkZGluZyBhbm90aGVyIGxpbmUgdG8gYGhlbGxvYCBmaXJzdDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGVjaG8gIkl0J3MgYSBuZXcgZGF5IGZvciBnaXQiID4+aGVsbG8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbmQgeW91IGNhbiBub3csIHNpbmNlIHlvdSB0b2xkIGdpdCBhYm91dCB0aGUgcHJldmlvdXMgc3RhdGUgb2YgYGhlbGxvYCwgYXNrCitnaXQgd2hhdCBoYXMgY2hhbmdlZCBpbiB0aGUgdHJlZSBjb21wYXJlZCB0byB5b3VyIG9sZCBpbmRleCwgdXNpbmcgdGhlCitgZ2l0LWRpZmYtZmlsZXNgIGNvbW1hbmQ6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQtZGlmZi1maWxlcworLS0tLS0tLS0tLS0tCisKK09vcHMuIFRoYXQgd2Fzbid0IHZlcnkgcmVhZGFibGUuIEl0IGp1c3Qgc3BpdCBvdXQgaXRzIG93biBpbnRlcm5hbAordmVyc2lvbiBvZiBhIGBkaWZmYCwgYnV0IHRoYXQgaW50ZXJuYWwgdmVyc2lvbiByZWFsbHkganVzdCB0ZWxscyB5b3UKK3RoYXQgaXQgaGFzIG5vdGljZWQgdGhhdCAiaGVsbG8iIGhhcyBiZWVuIG1vZGlmaWVkLCBhbmQgdGhhdCB0aGUgb2xkIG9iamVjdAorY29udGVudHMgaXQgaGFkIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIHNvbWV0aGluZyBlbHNlLgorCitUbyBtYWtlIGl0IHJlYWRhYmxlLCB3ZSBjYW4gdGVsbCBnaXQtZGlmZi1maWxlcyB0byBvdXRwdXQgdGhlCitkaWZmZXJlbmNlcyBhcyBhIHBhdGNoLCB1c2luZyB0aGUgYC1wYCBmbGFnOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0LWRpZmYtZmlsZXMgLXAKK2RpZmYgLS1naXQgYS9oZWxsbyBiL2hlbGxvCitpbmRleCA1NTdkYjAzLi4yNjM0MTRmIDEwMDY0NAorLS0tIGEvaGVsbG8KKysrKyBiL2hlbGxvCitAQCAtMSArMSwyIEBACisgSGVsbG8gV29ybGQKKytJdCdzIGEgbmV3IGRheSBmb3IgZ2l0CistLS0tCisKK2kuZS4gdGhlIGRpZmYgb2YgdGhlIGNoYW5nZSB3ZSBjYXVzZWQgYnkgYWRkaW5nIGFub3RoZXIgbGluZSB0byBgaGVsbG9gLgorCitJbiBvdGhlciB3b3JkcywgYGdpdC1kaWZmLWZpbGVzYCBhbHdheXMgc2hvd3MgdXMgdGhlIGRpZmZlcmVuY2UgYmV0d2Vlbgord2hhdCBpcyByZWNvcmRlZCBpbiB0aGUgaW5kZXgsIGFuZCB3aGF0IGlzIGN1cnJlbnRseSBpbiB0aGUgd29ya2luZwordHJlZS4gVGhhdCdzIHZlcnkgdXNlZnVsLgorCitBIGNvbW1vbiBzaG9ydGhhbmQgZm9yIGBnaXQtZGlmZi1maWxlcyAtcGAgaXMgdG8ganVzdCB3cml0ZSBgZ2l0CitkaWZmYCwgd2hpY2ggd2lsbCBkbyB0aGUgc2FtZSB0aGluZy4KKworLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmCitkaWZmIC0tZ2l0IGEvaGVsbG8gYi9oZWxsbworaW5kZXggNTU3ZGIwMy4uMjYzNDE0ZiAxMDA2NDQKKy0tLSBhL2hlbGxvCisrKysgYi9oZWxsbworQEAgLTEgKzEsMiBAQAorIEhlbGxvIFdvcmxkCisrSXQncyBhIG5ldyBkYXkgZm9yIGdpdAorLS0tLS0tLS0tLS0tCisKKworQ29tbWl0dGluZyBnaXQgc3RhdGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdywgd2Ugd2FudCB0byBnbyB0byB0aGUgbmV4dCBzdGFnZSBpbiBnaXQsIHdoaWNoIGlzIHRvIHRha2UgdGhlIGZpbGVzCit0aGF0IGdpdCBrbm93cyBhYm91dCBpbiB0aGUgaW5kZXgsIGFuZCBjb21taXQgdGhlbSBhcyBhIHJlYWwgdHJlZS4gV2UgZG8KK3RoYXQgaW4gdHdvIHBoYXNlczogY3JlYXRpbmcgYSAndHJlZScgb2JqZWN0LCBhbmQgY29tbWl0dGluZyB0aGF0ICd0cmVlJworb2JqZWN0IGFzIGEgJ2NvbW1pdCcgb2JqZWN0IHRvZ2V0aGVyIHdpdGggYW4gZXhwbGFuYXRpb24gb2Ygd2hhdCB0aGUKK3RyZWUgd2FzIGFsbCBhYm91dCwgYWxvbmcgd2l0aCBpbmZvcm1hdGlvbiBvZiBob3cgd2UgY2FtZSB0byB0aGF0IHN0YXRlLgorCitDcmVhdGluZyBhIHRyZWUgb2JqZWN0IGlzIHRyaXZpYWwsIGFuZCBpcyBkb25lIHdpdGggYGdpdC13cml0ZS10cmVlYC4KK1RoZXJlIGFyZSBubyBvcHRpb25zIG9yIG90aGVyIGlucHV0OiBnaXQtd3JpdGUtdHJlZSB3aWxsIHRha2UgdGhlCitjdXJyZW50IGluZGV4IHN0YXRlLCBhbmQgd3JpdGUgYW4gb2JqZWN0IHRoYXQgZGVzY3JpYmVzIHRoYXQgd2hvbGUKK2luZGV4LiBJbiBvdGhlciB3b3Jkcywgd2UncmUgbm93IHR5aW5nIHRvZ2V0aGVyIGFsbCB0aGUgZGlmZmVyZW50CitmaWxlbmFtZXMgd2l0aCB0aGVpciBjb250ZW50cyAoYW5kIHRoZWlyIHBlcm1pc3Npb25zKSwgYW5kIHdlJ3JlCitjcmVhdGluZyB0aGUgZXF1aXZhbGVudCBvZiBhIGdpdCAiZGlyZWN0b3J5IiBvYmplY3Q6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtd3JpdGUtdHJlZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FuZCB0aGlzIHdpbGwganVzdCBvdXRwdXQgdGhlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyB0cmVlLCBpbiB0aGlzIGNhc2UKKyhpZiB5b3UgaGF2ZSBkb25lIGV4YWN0bHkgYXMgSSd2ZSBkZXNjcmliZWQpIGl0IHNob3VsZCBiZQorCistLS0tLS0tLS0tLS0tLS0tCis4OTg4ZGExNWQwNzdkNDgyOWZjNTFkODU0NGMwOTdkZWY2NjQ0ZGJiCistLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIGlzIGFub3RoZXIgaW5jb21wcmVoZW5zaWJsZSBvYmplY3QgbmFtZS4gQWdhaW4sIGlmIHlvdSB3YW50IHRvLAoreW91IGNhbiB1c2UgYGdpdC1jYXQtZmlsZSAtdCA4OTg4ZFwuLi5gIHRvIHNlZSB0aGF0IHRoaXMgdGltZSB0aGUgb2JqZWN0CitpcyBub3QgYSAiYmxvYiIgb2JqZWN0LCBidXQgYSAidHJlZSIgb2JqZWN0ICh5b3UgY2FuIGFsc28gdXNlCitgZ2l0LWNhdC1maWxlYCB0byBhY3R1YWxseSBvdXRwdXQgdGhlIHJhdyBvYmplY3QgY29udGVudHMsIGJ1dCB5b3UnbGwgc2VlCittYWlubHkgYSBiaW5hcnkgbWVzcywgc28gdGhhdCdzIGxlc3MgaW50ZXJlc3RpbmcpLgorCitIb3dldmVyIC0tIG5vcm1hbGx5IHlvdSdkIG5ldmVyIHVzZSBgZ2l0LXdyaXRlLXRyZWVgIG9uIGl0cyBvd24sIGJlY2F1c2UKK25vcm1hbGx5IHlvdSBhbHdheXMgY29tbWl0IGEgdHJlZSBpbnRvIGEgY29tbWl0IG9iamVjdCB1c2luZyB0aGUKK2BnaXQtY29tbWl0LXRyZWVgIGNvbW1hbmQuIEluIGZhY3QsIGl0J3MgZWFzaWVyIHRvIG5vdCBhY3R1YWxseSB1c2UKK2BnaXQtd3JpdGUtdHJlZWAgb24gaXRzIG93biBhdCBhbGwsIGJ1dCB0byBqdXN0IHBhc3MgaXRzIHJlc3VsdCBpbiBhcyBhbgorYXJndW1lbnQgdG8gYGdpdC1jb21taXQtdHJlZWAuCisKK2BnaXQtY29tbWl0LXRyZWVgIG5vcm1hbGx5IHRha2VzIHNldmVyYWwgYXJndW1lbnRzIC0tIGl0IHdhbnRzIHRvIGtub3cKK3doYXQgdGhlICdwYXJlbnQnIG9mIGEgY29tbWl0IHdhcywgYnV0IHNpbmNlIHRoaXMgaXMgdGhlIGZpcnN0IGNvbW1pdAorZXZlciBpbiB0aGlzIG5ldyByZXBvc2l0b3J5LCBhbmQgaXQgaGFzIG5vIHBhcmVudHMsIHdlIG9ubHkgbmVlZCB0byBwYXNzIGluCit0aGUgb2JqZWN0IG5hbWUgb2YgdGhlIHRyZWUuIEhvd2V2ZXIsIGBnaXQtY29tbWl0LXRyZWVgIGFsc28gd2FudHMgdG8gZ2V0IGEKK2NvbW1pdCBtZXNzYWdlIG9uIGl0cyBzdGFuZGFyZCBpbnB1dCwgYW5kIGl0IHdpbGwgd3JpdGUgb3V0IHRoZSByZXN1bHRpbmcKK29iamVjdCBuYW1lIGZvciB0aGUgY29tbWl0IHRvIGl0cyBzdGFuZGFyZCBvdXRwdXQuCisKK0FuZCB0aGlzIGlzIHdoZXJlIHdlIGNyZWF0ZSB0aGUgYC5naXQvcmVmcy9oZWFkcy9tYXN0ZXJgIGZpbGUKK3doaWNoIGlzIHBvaW50ZWQgYXQgYnkgYEhFQURgLiBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gY29udGFpbgordGhlIHJlZmVyZW5jZSB0byB0aGUgdG9wLW9mLXRyZWUgb2YgdGhlIG1hc3RlciBicmFuY2gsIGFuZCBzaW5jZQordGhhdCdzIGV4YWN0bHkgd2hhdCBgZ2l0LWNvbW1pdC10cmVlYCBzcGl0cyBvdXQsIHdlIGNhbiBkbyB0aGlzCithbGwgd2l0aCBhIHNlcXVlbmNlIG9mIHNpbXBsZSBzaGVsbCBjb21tYW5kczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIHRyZWU9JChnaXQtd3JpdGUtdHJlZSkKKyQgY29tbWl0PSQoZWNobyAnSW5pdGlhbCBjb21taXQnIHwgZ2l0LWNvbW1pdC10cmVlICR0cmVlKQorJCBnaXQtdXBkYXRlLXJlZiBIRUFEICRjb21taXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbiB0aGlzIGNhc2UgdGhpcyBjcmVhdGVzIGEgdG90YWxseSBuZXcgY29tbWl0IHRoYXQgaXMgbm90IHJlbGF0ZWQgdG8KK2FueXRoaW5nIGVsc2UuIE5vcm1hbGx5IHlvdSBkbyB0aGlzIG9ubHkgKm9uY2UqIGZvciBhIHByb2plY3QgZXZlciwgYW5kCithbGwgbGF0ZXIgY29tbWl0cyB3aWxsIGJlIHBhcmVudGVkIG9uIHRvcCBvZiBhbiBlYXJsaWVyIGNvbW1pdC4KKworQWdhaW4sIG5vcm1hbGx5IHlvdSdkIG5ldmVyIGFjdHVhbGx5IGRvIHRoaXMgYnkgaGFuZC4gVGhlcmUgaXMgYQoraGVscGZ1bCBzY3JpcHQgY2FsbGVkIGBnaXQgY29tbWl0YCB0aGF0IHdpbGwgZG8gYWxsIG9mIHRoaXMgZm9yIHlvdS4gU28KK3lvdSBjb3VsZCBoYXZlIGp1c3Qgd3JpdHRlbiBgZ2l0IGNvbW1pdGAKK2luc3RlYWQsIGFuZCBpdCB3b3VsZCBoYXZlIGRvbmUgdGhlIGFib3ZlIG1hZ2ljIHNjcmlwdGluZyBmb3IgeW91LgorCisKK01ha2luZyBhIGNoYW5nZQorLS0tLS0tLS0tLS0tLS0tCisKK1JlbWVtYmVyIGhvdyB3ZSBkaWQgdGhlIGBnaXQtdXBkYXRlLWluZGV4YCBvbiBmaWxlIGBoZWxsb2AgYW5kIHRoZW4gd2UKK2NoYW5nZWQgYGhlbGxvYCBhZnRlcndhcmQsIGFuZCBjb3VsZCBjb21wYXJlIHRoZSBuZXcgc3RhdGUgb2YgYGhlbGxvYCB3aXRoIHRoZQorc3RhdGUgd2Ugc2F2ZWQgaW4gdGhlIGluZGV4IGZpbGU/CisKK0Z1cnRoZXIsIHJlbWVtYmVyIGhvdyBJIHNhaWQgdGhhdCBgZ2l0LXdyaXRlLXRyZWVgIHdyaXRlcyB0aGUgY29udGVudHMKK29mIHRoZSAqaW5kZXgqIGZpbGUgdG8gdGhlIHRyZWUsIGFuZCB0aHVzIHdoYXQgd2UganVzdCBjb21taXR0ZWQgd2FzIGluCitmYWN0IHRoZSAqb3JpZ2luYWwqIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGBoZWxsb2AsIG5vdCB0aGUgbmV3IG9uZXMuIFdlIGRpZAordGhhdCBvbiBwdXJwb3NlLCB0byBzaG93IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGluZGV4IHN0YXRlLCBhbmQgdGhlCitzdGF0ZSBpbiB0aGUgd29ya2luZyB0cmVlLCBhbmQgaG93IHRoZXkgZG9uJ3QgaGF2ZSB0byBtYXRjaCwgZXZlbgord2hlbiB3ZSBjb21taXQgdGhpbmdzLgorCitBcyBiZWZvcmUsIGlmIHdlIGRvIGBnaXQtZGlmZi1maWxlcyAtcGAgaW4gb3VyIGdpdC10dXRvcmlhbCBwcm9qZWN0LAord2UnbGwgc3RpbGwgc2VlIHRoZSBzYW1lIGRpZmZlcmVuY2Ugd2Ugc2F3IGxhc3QgdGltZTogdGhlIGluZGV4IGZpbGUKK2hhc24ndCBjaGFuZ2VkIGJ5IHRoZSBhY3Qgb2YgY29tbWl0dGluZyBhbnl0aGluZy4gSG93ZXZlciwgbm93IHRoYXQgd2UKK2hhdmUgY29tbWl0dGVkIHNvbWV0aGluZywgd2UgY2FuIGFsc28gbGVhcm4gdG8gdXNlIGEgbmV3IGNvbW1hbmQ6CitgZ2l0LWRpZmYtaW5kZXhgLgorCitVbmxpa2UgYGdpdC1kaWZmLWZpbGVzYCwgd2hpY2ggc2hvd2VkIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGluZGV4CitmaWxlIGFuZCB0aGUgd29ya2luZyB0cmVlLCBgZ2l0LWRpZmYtaW5kZXhgIHNob3dzIHRoZSBkaWZmZXJlbmNlcworYmV0d2VlbiBhIGNvbW1pdHRlZCAqdHJlZSogYW5kIGVpdGhlciB0aGUgaW5kZXggZmlsZSBvciB0aGUgd29ya2luZwordHJlZS4gSW4gb3RoZXIgd29yZHMsIGBnaXQtZGlmZi1pbmRleGAgd2FudHMgYSB0cmVlIHRvIGJlIGRpZmZlZAorYWdhaW5zdCwgYW5kIGJlZm9yZSB3ZSBkaWQgdGhlIGNvbW1pdCwgd2UgY291bGRuJ3QgZG8gdGhhdCwgYmVjYXVzZSB3ZQorZGlkbid0IGhhdmUgYW55dGhpbmcgdG8gZGlmZiBhZ2FpbnN0LgorCitCdXQgbm93IHdlIGNhbiBkbworCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1kaWZmLWluZGV4IC1wIEhFQUQKKy0tLS0tLS0tLS0tLS0tLS0KKworKHdoZXJlIGAtcGAgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgaXQgZGlkIGluIGBnaXQtZGlmZi1maWxlc2ApLCBhbmQgaXQKK3dpbGwgc2hvdyB1cyB0aGUgc2FtZSBkaWZmZXJlbmNlLCBidXQgZm9yIGEgdG90YWxseSBkaWZmZXJlbnQgcmVhc29uLgorTm93IHdlJ3JlIGNvbXBhcmluZyB0aGUgd29ya2luZyB0cmVlIG5vdCBhZ2FpbnN0IHRoZSBpbmRleCBmaWxlLAorYnV0IGFnYWluc3QgdGhlIHRyZWUgd2UganVzdCB3cm90ZS4gSXQganVzdCBzbyBoYXBwZW5zIHRoYXQgdGhvc2UgdHdvCithcmUgb2J2aW91c2x5IHRoZSBzYW1lLCBzbyB3ZSBnZXQgdGhlIHNhbWUgcmVzdWx0LgorCitBZ2FpbiwgYmVjYXVzZSB0aGlzIGlzIGEgY29tbW9uIG9wZXJhdGlvbiwgeW91IGNhbiBhbHNvIGp1c3Qgc2hvcnRoYW5kCitpdCB3aXRoCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgSEVBRAorLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCBlbmRzIHVwIGRvaW5nIHRoZSBhYm92ZSBmb3IgeW91LgorCitJbiBvdGhlciB3b3JkcywgYGdpdC1kaWZmLWluZGV4YCBub3JtYWxseSBjb21wYXJlcyBhIHRyZWUgYWdhaW5zdCB0aGUKK3dvcmtpbmcgdHJlZSwgYnV0IHdoZW4gZ2l2ZW4gdGhlIGBcLS1jYWNoZWRgIGZsYWcsIGl0IGlzIHRvbGQgdG8KK2luc3RlYWQgY29tcGFyZSBhZ2FpbnN0IGp1c3QgdGhlIGluZGV4IGNhY2hlIGNvbnRlbnRzLCBhbmQgaWdub3JlIHRoZQorY3VycmVudCB3b3JraW5nIHRyZWUgc3RhdGUgZW50aXJlbHkuIFNpbmNlIHdlIGp1c3Qgd3JvdGUgdGhlIGluZGV4CitmaWxlIHRvIEhFQUQsIGRvaW5nIGBnaXQtZGlmZi1pbmRleCBcLS1jYWNoZWQgLXAgSEVBRGAgc2hvdWxkIHRodXMgcmV0dXJuCithbiBlbXB0eSBzZXQgb2YgZGlmZmVyZW5jZXMsIGFuZCB0aGF0J3MgZXhhY3RseSB3aGF0IGl0IGRvZXMuCisKK1tOT1RFXQorPT09PT09PT09PT09PT09PQorYGdpdC1kaWZmLWluZGV4YCByZWFsbHkgYWx3YXlzIHVzZXMgdGhlIGluZGV4IGZvciBpdHMKK2NvbXBhcmlzb25zLCBhbmQgc2F5aW5nIHRoYXQgaXQgY29tcGFyZXMgYSB0cmVlIGFnYWluc3QgdGhlIHdvcmtpbmcKK3RyZWUgaXMgdGh1cyBub3Qgc3RyaWN0bHkgYWNjdXJhdGUuIEluIHBhcnRpY3VsYXIsIHRoZSBsaXN0IG9mCitmaWxlcyB0byBjb21wYXJlICh0aGUgIm1ldGEtZGF0YSIpICphbHdheXMqIGNvbWVzIGZyb20gdGhlIGluZGV4IGZpbGUsCityZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGBcLS1jYWNoZWRgIGZsYWcgaXMgdXNlZCBvciBub3QuIFRoZSBgXC0tY2FjaGVkYAorZmxhZyByZWFsbHkgb25seSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGZpbGUgKmNvbnRlbnRzKiB0byBiZSBjb21wYXJlZAorY29tZSBmcm9tIHRoZSB3b3JraW5nIHRyZWUgb3Igbm90LgorCitUaGlzIGlzIG5vdCBoYXJkIHRvIHVuZGVyc3RhbmQsIGFzIHNvb24gYXMgeW91IHJlYWxpemUgdGhhdCBnaXQgc2ltcGx5CituZXZlciBrbm93cyAob3IgY2FyZXMpIGFib3V0IGZpbGVzIHRoYXQgaXQgaXMgbm90IHRvbGQgYWJvdXQKK2V4cGxpY2l0bHkuIGdpdCB3aWxsIG5ldmVyIGdvICpsb29raW5nKiBmb3IgZmlsZXMgdG8gY29tcGFyZSwgaXQKK2V4cGVjdHMgeW91IHRvIHRlbGwgaXQgd2hhdCB0aGUgZmlsZXMgYXJlLCBhbmQgdGhhdCdzIHdoYXQgdGhlIGluZGV4CitpcyB0aGVyZSBmb3IuCis9PT09PT09PT09PT09PT09CisKK0hvd2V2ZXIsIG91ciBuZXh0IHN0ZXAgaXMgdG8gY29tbWl0IHRoZSAqY2hhbmdlKiB3ZSBkaWQsIGFuZCBhZ2FpbiwgdG8KK3VuZGVyc3RhbmQgd2hhdCdzIGdvaW5nIG9uLCBrZWVwIGluIG1pbmQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAid29ya2luZwordHJlZSBjb250ZW50cyIsICJpbmRleCBmaWxlIiBhbmQgImNvbW1pdHRlZCB0cmVlIi4gV2UgaGF2ZSBjaGFuZ2VzCitpbiB0aGUgd29ya2luZyB0cmVlIHRoYXQgd2Ugd2FudCB0byBjb21taXQsIGFuZCB3ZSBhbHdheXMgaGF2ZSB0bword29yayB0aHJvdWdoIHRoZSBpbmRleCBmaWxlLCBzbyB0aGUgZmlyc3QgdGhpbmcgd2UgbmVlZCB0byBkbyBpcyB0bwordXBkYXRlIHRoZSBpbmRleCBjYWNoZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdC11cGRhdGUtaW5kZXggaGVsbG8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisobm90ZSBob3cgd2UgZGlkbid0IG5lZWQgdGhlIGBcLS1hZGRgIGZsYWcgdGhpcyB0aW1lLCBzaW5jZSBnaXQga25ldworYWJvdXQgdGhlIGZpbGUgYWxyZWFkeSkuCisKK05vdGUgd2hhdCBoYXBwZW5zIHRvIHRoZSBkaWZmZXJlbnQgYGdpdC1kaWZmLVwqYCB2ZXJzaW9ucyBoZXJlLiBBZnRlcgord2UndmUgdXBkYXRlZCBgaGVsbG9gIGluIHRoZSBpbmRleCwgYGdpdC1kaWZmLWZpbGVzIC1wYCBub3cgc2hvd3Mgbm8KK2RpZmZlcmVuY2VzLCBidXQgYGdpdC1kaWZmLWluZGV4IC1wIEhFQURgIHN0aWxsICpkb2VzKiBzaG93IHRoYXQgdGhlCitjdXJyZW50IHN0YXRlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzdGF0ZSB3ZSBjb21taXR0ZWQuIEluIGZhY3QsIG5vdworYGdpdC1kaWZmLWluZGV4YCBzaG93cyB0aGUgc2FtZSBkaWZmZXJlbmNlIHdoZXRoZXIgd2UgdXNlIHRoZSBgLS1jYWNoZWRgCitmbGFnIG9yIG5vdCwgc2luY2Ugbm93IHRoZSBpbmRleCBpcyBjb2hlcmVudCB3aXRoIHRoZSB3b3JraW5nIHRyZWUuCisKK05vdywgc2luY2Ugd2UndmUgdXBkYXRlZCBgaGVsbG9gIGluIHRoZSBpbmRleCwgd2UgY2FuIGNvbW1pdCB0aGUgbmV3Cit2ZXJzaW9uLiBXZSBjb3VsZCBkbyBpdCBieSB3cml0aW5nIHRoZSB0cmVlIGJ5IGhhbmQgYWdhaW4sIGFuZAorY29tbWl0dGluZyB0aGUgdHJlZSAodGhpcyB0aW1lIHdlJ2QgaGF2ZSB0byB1c2UgdGhlIGAtcCBIRUFEYCBmbGFnIHRvCit0ZWxsIGNvbW1pdCB0aGF0IHRoZSBIRUFEIHdhcyB0aGUgKnBhcmVudCogb2YgdGhlIG5ldyBjb21taXQsIGFuZCB0aGF0Cit0aGlzIHdhc24ndCBhbiBpbml0aWFsIGNvbW1pdCBhbnkgbW9yZSksIGJ1dCB5b3UndmUgZG9uZSB0aGF0IG9uY2UKK2FscmVhZHksIHNvIGxldCdzIGp1c3QgdXNlIHRoZSBoZWxwZnVsIHNjcmlwdCB0aGlzIHRpbWU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY29tbWl0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggc3RhcnRzIGFuIGVkaXRvciBmb3IgeW91IHRvIHdyaXRlIHRoZSBjb21taXQgbWVzc2FnZSBhbmQgdGVsbHMgeW91CithIGJpdCBhYm91dCB3aGF0IHlvdSBoYXZlIGRvbmUuCisKK1dyaXRlIHdoYXRldmVyIG1lc3NhZ2UgeW91IHdhbnQsIGFuZCBhbGwgdGhlIGxpbmVzIHRoYXQgc3RhcnQgd2l0aCAnIycKK3dpbGwgYmUgcHJ1bmVkIG91dCwgYW5kIHRoZSByZXN0IHdpbGwgYmUgdXNlZCBhcyB0aGUgY29tbWl0IG1lc3NhZ2UgZm9yCit0aGUgY2hhbmdlLiBJZiB5b3UgZGVjaWRlIHlvdSBkb24ndCB3YW50IHRvIGNvbW1pdCBhbnl0aGluZyBhZnRlciBhbGwgYXQKK3RoaXMgcG9pbnQgKHlvdSBjYW4gY29udGludWUgdG8gZWRpdCB0aGluZ3MgYW5kIHVwZGF0ZSB0aGUgaW5kZXgpLCB5b3UKK2NhbiBqdXN0IGxlYXZlIGFuIGVtcHR5IG1lc3NhZ2UuIE90aGVyd2lzZSBgZ2l0IGNvbW1pdGAgd2lsbCBjb21taXQKK3RoZSBjaGFuZ2UgZm9yIHlvdS4KKworWW91J3ZlIG5vdyBtYWRlIHlvdXIgZmlyc3QgcmVhbCBnaXQgY29tbWl0LiBBbmQgaWYgeW91J3JlIGludGVyZXN0ZWQgaW4KK2xvb2tpbmcgYXQgd2hhdCBgZ2l0IGNvbW1pdGAgcmVhbGx5IGRvZXMsIGZlZWwgZnJlZSB0byBpbnZlc3RpZ2F0ZToKK2l0J3MgYSBmZXcgdmVyeSBzaW1wbGUgc2hlbGwgc2NyaXB0cyB0byBnZW5lcmF0ZSB0aGUgaGVscGZ1bCAoPykgY29tbWl0CittZXNzYWdlIGhlYWRlcnMsIGFuZCBhIGZldyBvbmUtbGluZXJzIHRoYXQgYWN0dWFsbHkgZG8gdGhlCitjb21taXQgaXRzZWxmIChgZ2l0LWNvbW1pdGApLgorCisKK0luc3BlY3RpbmcgQ2hhbmdlcworLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doaWxlIGNyZWF0aW5nIGNoYW5nZXMgaXMgdXNlZnVsLCBpdCdzIGV2ZW4gbW9yZSB1c2VmdWwgaWYgeW91IGNhbiB0ZWxsCitsYXRlciB3aGF0IGNoYW5nZWQuIFRoZSBtb3N0IHVzZWZ1bCBjb21tYW5kIGZvciB0aGlzIGlzIGFub3RoZXIgb2YgdGhlCitgZGlmZmAgZmFtaWx5LCBuYW1lbHkgYGdpdC1kaWZmLXRyZWVgLgorCitgZ2l0LWRpZmYtdHJlZWAgY2FuIGJlIGdpdmVuIHR3byBhcmJpdHJhcnkgdHJlZXMsIGFuZCBpdCB3aWxsIHRlbGwgeW91IHRoZQorZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGVtLiBQZXJoYXBzIGV2ZW4gbW9yZSBjb21tb25seSwgdGhvdWdoLCB5b3UgY2FuCitnaXZlIGl0IGp1c3QgYSBzaW5nbGUgY29tbWl0IG9iamVjdCwgYW5kIGl0IHdpbGwgZmlndXJlIG91dCB0aGUgcGFyZW50CitvZiB0aGF0IGNvbW1pdCBpdHNlbGYsIGFuZCBzaG93IHRoZSBkaWZmZXJlbmNlIGRpcmVjdGx5LiBUaHVzLCB0byBnZXQKK3RoZSBzYW1lIGRpZmYgdGhhdCB3ZSd2ZSBhbHJlYWR5IHNlZW4gc2V2ZXJhbCB0aW1lcywgd2UgY2FuIG5vdyBkbworCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1kaWZmLXRyZWUgLXAgSEVBRAorLS0tLS0tLS0tLS0tLS0tLQorCisoYWdhaW4sIGAtcGAgbWVhbnMgdG8gc2hvdyB0aGUgZGlmZmVyZW5jZSBhcyBhIGh1bWFuLXJlYWRhYmxlIHBhdGNoKSwKK2FuZCBpdCB3aWxsIHNob3cgd2hhdCB0aGUgbGFzdCBjb21taXQgKGluIGBIRUFEYCkgYWN0dWFsbHkgY2hhbmdlZC4KKworW05PVEVdCis9PT09PT09PT09PT0KK0hlcmUgaXMgYW4gQVNDSUkgYXJ0IGJ5IEpvbiBMb2VsaWdlciB0aGF0IGlsbHVzdHJhdGVzIGhvdwordmFyaW91cyBkaWZmLVwqIGNvbW1hbmRzIGNvbXBhcmUgdGhpbmdzLgorCisgICAgICAgICAgICAgICAgICAgICAgZGlmZi10cmVlCisgICAgICAgICAgICAgICAgICAgICAgICstLS0tKworICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgfCAgICB8CisgICAgICAgICAgICAgICAgICAgICAgIFYgICAgVgorICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgIHwgT2JqZWN0IERCIHwKKyAgICAgICAgICAgICAgICAgICAgfCAgQmFja2luZyAgfAorICAgICAgICAgICAgICAgICAgICB8ICAgU3RvcmUgICB8CisgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICBeICAgIF4KKyAgICAgICAgICAgICAgICAgICAgICB8ICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICB8ICAgIHwgIGRpZmYtaW5kZXggLS1jYWNoZWQKKyAgICAgICAgICAgICAgICAgICAgICB8ICAgIHwKKyAgICAgICAgICBkaWZmLWluZGV4ICB8ICAgIFYKKyAgICAgICAgICAgICAgICAgICAgICB8ICArLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgICAgfCAgfCAgIEluZGV4ICAgfAorICAgICAgICAgICAgICAgICAgICAgIHwgIHwgICJjYWNoZSIgIHwKKyAgICAgICAgICAgICAgICAgICAgICB8ICArLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgICAgfCAgICBeCisgICAgICAgICAgICAgICAgICAgICAgfCAgICB8CisgICAgICAgICAgICAgICAgICAgICAgfCAgICB8ICBkaWZmLWZpbGVzCisgICAgICAgICAgICAgICAgICAgICAgfCAgICB8CisgICAgICAgICAgICAgICAgICAgICAgViAgICBWCisgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgfCAgV29ya2luZyAgfAorICAgICAgICAgICAgICAgICAgICB8IERpcmVjdG9yeSB8CisgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKz09PT09PT09PT09PQorCitNb3JlIGludGVyZXN0aW5nbHksIHlvdSBjYW4gYWxzbyBnaXZlIGBnaXQtZGlmZi10cmVlYCB0aGUgYC0tcHJldHR5YCBmbGFnLAord2hpY2ggdGVsbHMgaXQgdG8gYWxzbyBzaG93IHRoZSBjb21taXQgbWVzc2FnZSBhbmQgYXV0aG9yIGFuZCBkYXRlIG9mIHRoZQorY29tbWl0LCBhbmQgeW91IGNhbiB0ZWxsIGl0IHRvIHNob3cgYSB3aG9sZSBzZXJpZXMgb2YgZGlmZnMuCitBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHRlbGwgaXQgdG8gYmUgInNpbGVudCIsIGFuZCBub3Qgc2hvdyB0aGUgZGlmZnMgYXQKK2FsbCwgYnV0IGp1c3Qgc2hvdyB0aGUgYWN0dWFsIGNvbW1pdCBtZXNzYWdlLgorCitJbiBmYWN0LCB0b2dldGhlciB3aXRoIHRoZSBgZ2l0LXJldi1saXN0YCBwcm9ncmFtICh3aGljaCBnZW5lcmF0ZXMgYQorbGlzdCBvZiByZXZpc2lvbnMpLCBgZ2l0LWRpZmYtdHJlZWAgZW5kcyB1cCBiZWluZyBhIHZlcml0YWJsZSBmb3VudCBvZgorY2hhbmdlcy4gQSB0cml2aWFsIChidXQgdmVyeSB1c2VmdWwpIHNjcmlwdCBjYWxsZWQgYGdpdC13aGF0Y2hhbmdlZGAgaXMKK2luY2x1ZGVkIHdpdGggZ2l0IHdoaWNoIGRvZXMgZXhhY3RseSB0aGlzLCBhbmQgc2hvd3MgYSBsb2cgb2YgcmVjZW50CithY3Rpdml0aWVzLgorCitUbyBzZWUgdGhlIHdob2xlIGhpc3Rvcnkgb2Ygb3VyIHBpdGlmdWwgbGl0dGxlIGdpdC10dXRvcmlhbCBwcm9qZWN0LCB5b3UKK2NhbiBkbworCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBsb2cKKy0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggc2hvd3MganVzdCB0aGUgbG9nIG1lc3NhZ2VzLCBvciBpZiB3ZSB3YW50IHRvIHNlZSB0aGUgbG9nIHRvZ2V0aGVyCit3aXRoIHRoZSBhc3NvY2lhdGVkIHBhdGNoZXMgdXNlIHRoZSBtb3JlIGNvbXBsZXggKGFuZCBtdWNoIG1vcmUKK3Bvd2VyZnVsKQorCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdC13aGF0Y2hhbmdlZCAtcCAtLXJvb3QKKy0tLS0tLS0tLS0tLS0tLS0KKworYW5kIHlvdSB3aWxsIHNlZSBleGFjdGx5IHdoYXQgaGFzIGNoYW5nZWQgaW4gdGhlIHJlcG9zaXRvcnkgb3ZlciBpdHMKK3Nob3J0IGhpc3RvcnkuCisKK1tOT1RFXQorVGhlIGBcLS1yb290YCBmbGFnIGlzIGEgZmxhZyB0byBgZ2l0LWRpZmYtdHJlZWAgdG8gdGVsbCBpdCB0bworc2hvdyB0aGUgaW5pdGlhbCBha2EgJ3Jvb3QnIGNvbW1pdCB0b28uIE5vcm1hbGx5IHlvdSdkIHByb2JhYmx5IG5vdAord2FudCB0byBzZWUgdGhlIGluaXRpYWwgaW1wb3J0IGRpZmYsIGJ1dCBzaW5jZSB0aGUgdHV0b3JpYWwgcHJvamVjdAord2FzIHN0YXJ0ZWQgZnJvbSBzY3JhdGNoIGFuZCBpcyBzbyBzbWFsbCwgd2UgdXNlIGl0IHRvIG1ha2UgdGhlIHJlc3VsdAorYSBiaXQgbW9yZSBpbnRlcmVzdGluZy4KKworV2l0aCB0aGF0LCB5b3Ugc2hvdWxkIG5vdyBiZSBoYXZpbmcgc29tZSBpbmtsaW5nIG9mIHdoYXQgZ2l0IGRvZXMsIGFuZAorY2FuIGV4cGxvcmUgb24geW91ciBvd24uCisKK1tOT1RFXQorTW9zdCBsaWtlbHksIHlvdSBhcmUgbm90IGRpcmVjdGx5IHVzaW5nIHRoZSBjb3JlCitnaXQgUGx1bWJpbmcgY29tbWFuZHMsIGJ1dCB1c2luZyBQb3JjZWxhaW4gc3VjaCBhcyBgZ2l0LWFkZGAsIGBnaXQtcm0nCithbmQgYGdpdC1jb21taXQnLgorCisKK1RhZ2dpbmcgYSB2ZXJzaW9uCistLS0tLS0tLS0tLS0tLS0tLQorCitJbiBnaXQsIHRoZXJlIGFyZSB0d28ga2luZHMgb2YgdGFncywgYSAibGlnaHQiIG9uZSwgYW5kIGFuICJhbm5vdGF0ZWQgdGFnIi4KKworQSAibGlnaHQiIHRhZyBpcyB0ZWNobmljYWxseSBub3RoaW5nIG1vcmUgdGhhbiBhIGJyYW5jaCwgZXhjZXB0IHdlIHB1dAoraXQgaW4gdGhlIGAuZ2l0L3JlZnMvdGFncy9gIHN1YmRpcmVjdG9yeSBpbnN0ZWFkIG9mIGNhbGxpbmcgaXQgYSBgaGVhZGAuCitTbyB0aGUgc2ltcGxlc3QgZm9ybSBvZiB0YWcgaW52b2x2ZXMgbm90aGluZyBtb3JlIHRoYW4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCB0YWcgbXktZmlyc3QtdGFnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2hpY2gganVzdCB3cml0ZXMgdGhlIGN1cnJlbnQgYEhFQURgIGludG8gdGhlIGAuZ2l0L3JlZnMvdGFncy9teS1maXJzdC10YWdgCitmaWxlLCBhZnRlciB3aGljaCBwb2ludCB5b3UgY2FuIHRoZW4gdXNlIHRoaXMgc3ltYm9saWMgbmFtZSBmb3IgdGhhdAorcGFydGljdWxhciBzdGF0ZS4gWW91IGNhbiwgZm9yIGV4YW1wbGUsIGRvCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgbXktZmlyc3QtdGFnCistLS0tLS0tLS0tLS0tLS0tCisKK3RvIGRpZmYgeW91ciBjdXJyZW50IHN0YXRlIGFnYWluc3QgdGhhdCB0YWcgd2hpY2ggYXQgdGhpcyBwb2ludCB3aWxsCitvYnZpb3VzbHkgYmUgYW4gZW1wdHkgZGlmZiwgYnV0IGlmIHlvdSBjb250aW51ZSB0byBkZXZlbG9wIGFuZCBjb21taXQKK3N0dWZmLCB5b3UgY2FuIHVzZSB5b3VyIHRhZyBhcyBhbiAiYW5jaG9yLXBvaW50IiB0byBzZWUgd2hhdCBoYXMgY2hhbmdlZAorc2luY2UgeW91IHRhZ2dlZCBpdC4KKworQW4gImFubm90YXRlZCB0YWciIGlzIGFjdHVhbGx5IGEgcmVhbCBnaXQgb2JqZWN0LCBhbmQgY29udGFpbnMgbm90IG9ubHkgYQorcG9pbnRlciB0byB0aGUgc3RhdGUgeW91IHdhbnQgdG8gdGFnLCBidXQgYWxzbyBhIHNtYWxsIHRhZyBuYW1lIGFuZAorbWVzc2FnZSwgYWxvbmcgd2l0aCBvcHRpb25hbGx5IGEgUEdQIHNpZ25hdHVyZSB0aGF0IHNheXMgdGhhdCB5ZXMsCit5b3UgcmVhbGx5IGRpZAordGhhdCB0YWcuIFlvdSBjcmVhdGUgdGhlc2UgYW5ub3RhdGVkIHRhZ3Mgd2l0aCBlaXRoZXIgdGhlIGAtYWAgb3IKK2Atc2AgZmxhZyB0byBgZ2l0IHRhZ2A6CisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHRhZyAtcyA8dGFnbmFtZT4KKy0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggd2lsbCBzaWduIHRoZSBjdXJyZW50IGBIRUFEYCAoYnV0IHlvdSBjYW4gYWxzbyBnaXZlIGl0IGFub3RoZXIKK2FyZ3VtZW50IHRoYXQgc3BlY2lmaWVzIHRoZSB0aGluZyB0byB0YWcsIGkuZS4sIHlvdSBjb3VsZCBoYXZlIHRhZ2dlZCB0aGUKK2N1cnJlbnQgYG15YnJhbmNoYCBwb2ludCBieSB1c2luZyBgZ2l0IHRhZyA8dGFnbmFtZT4gbXlicmFuY2hgKS4KKworWW91IG5vcm1hbGx5IG9ubHkgZG8gc2lnbmVkIHRhZ3MgZm9yIG1ham9yIHJlbGVhc2VzIG9yIHRoaW5ncworbGlrZSB0aGF0LCB3aGlsZSB0aGUgbGlnaHQtd2VpZ2h0IHRhZ3MgYXJlIHVzZWZ1bCBmb3IgYW55IG1hcmtpbmcgeW91Cit3YW50IHRvIGRvIC0tIGFueSB0aW1lIHlvdSBkZWNpZGUgdGhhdCB5b3Ugd2FudCB0byByZW1lbWJlciBhIGNlcnRhaW4KK3BvaW50LCBqdXN0IGNyZWF0ZSBhIHByaXZhdGUgdGFnIGZvciBpdCwgYW5kIHlvdSBoYXZlIGEgbmljZSBzeW1ib2xpYworbmFtZSBmb3IgdGhlIHN0YXRlIGF0IHRoYXQgcG9pbnQuCisKKworQ29weWluZyByZXBvc2l0b3JpZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2dpdCByZXBvc2l0b3JpZXMgYXJlIG5vcm1hbGx5IHRvdGFsbHkgc2VsZi1zdWZmaWNpZW50IGFuZCByZWxvY2F0YWJsZS4KK1VubGlrZSBDVlMsIGZvciBleGFtcGxlLCB0aGVyZSBpcyBubyBzZXBhcmF0ZSBub3Rpb24gb2YKKyJyZXBvc2l0b3J5IiBhbmQgIndvcmtpbmcgdHJlZSIuIEEgZ2l0IHJlcG9zaXRvcnkgbm9ybWFsbHkgKmlzKiB0aGUKK3dvcmtpbmcgdHJlZSwgd2l0aCB0aGUgbG9jYWwgZ2l0IGluZm9ybWF0aW9uIGhpZGRlbiBpbiB0aGUgYC5naXRgCitzdWJkaXJlY3RvcnkuIFRoZXJlIGlzIG5vdGhpbmcgZWxzZS4gV2hhdCB5b3Ugc2VlIGlzIHdoYXQgeW91IGdvdC4KKworW05PVEVdCitZb3UgY2FuIHRlbGwgZ2l0IHRvIHNwbGl0IHRoZSBnaXQgaW50ZXJuYWwgaW5mb3JtYXRpb24gZnJvbQordGhlIGRpcmVjdG9yeSB0aGF0IGl0IHRyYWNrcywgYnV0IHdlJ2xsIGlnbm9yZSB0aGF0IGZvciBub3c6IGl0J3Mgbm90Citob3cgbm9ybWFsIHByb2plY3RzIHdvcmssIGFuZCBpdCdzIHJlYWxseSBvbmx5IG1lYW50IGZvciBzcGVjaWFsIHVzZXMuCitTbyB0aGUgbWVudGFsIG1vZGVsIG9mICJ0aGUgZ2l0IGluZm9ybWF0aW9uIGlzIGFsd2F5cyB0aWVkIGRpcmVjdGx5IHRvCit0aGUgd29ya2luZyB0cmVlIHRoYXQgaXQgZGVzY3JpYmVzIiBtYXkgbm90IGJlIHRlY2huaWNhbGx5IDEwMCUKK2FjY3VyYXRlLCBidXQgaXQncyBhIGdvb2QgbW9kZWwgZm9yIGFsbCBub3JtYWwgdXNlLgorCitUaGlzIGhhcyB0d28gaW1wbGljYXRpb25zOgorCisgLSBpZiB5b3UgZ3JvdyBib3JlZCB3aXRoIHRoZSB0dXRvcmlhbCByZXBvc2l0b3J5IHlvdSBjcmVhdGVkIChvciB5b3UndmUKKyAgIG1hZGUgYSBtaXN0YWtlIGFuZCB3YW50IHRvIHN0YXJ0IGFsbCBvdmVyKSwgeW91IGNhbiBqdXN0IGRvIHNpbXBsZQorKworLS0tLS0tLS0tLS0tLS0tLQorJCBybSAtcmYgZ2l0LXR1dG9yaWFsCistLS0tLS0tLS0tLS0tLS0tCisrCithbmQgaXQgd2lsbCBiZSBnb25lLiBUaGVyZSdzIG5vIGV4dGVybmFsIHJlcG9zaXRvcnksIGFuZCB0aGVyZSdzIG5vCitoaXN0b3J5IG91dHNpZGUgdGhlIHByb2plY3QgeW91IGNyZWF0ZWQuCisKKyAtIGlmIHlvdSB3YW50IHRvIG1vdmUgb3IgZHVwbGljYXRlIGEgZ2l0IHJlcG9zaXRvcnksIHlvdSBjYW4gZG8gc28uIFRoZXJlCisgICBpcyBgZ2l0IGNsb25lYCBjb21tYW5kLCBidXQgaWYgYWxsIHlvdSB3YW50IHRvIGRvIGlzIGp1c3QgdG8KKyAgIGNyZWF0ZSBhIGNvcHkgb2YgeW91ciByZXBvc2l0b3J5ICh3aXRoIGFsbCB0aGUgZnVsbCBoaXN0b3J5IHRoYXQKKyAgIHdlbnQgYWxvbmcgd2l0aCBpdCksIHlvdSBjYW4gZG8gc28gd2l0aCBhIHJlZ3VsYXIKKyAgIGBjcCAtYSBnaXQtdHV0b3JpYWwgbmV3LWdpdC10dXRvcmlhbGAuCisrCitOb3RlIHRoYXQgd2hlbiB5b3UndmUgbW92ZWQgb3IgY29waWVkIGEgZ2l0IHJlcG9zaXRvcnksIHlvdXIgZ2l0IGluZGV4CitmaWxlICh3aGljaCBjYWNoZXMgdmFyaW91cyBpbmZvcm1hdGlvbiwgbm90YWJseSBzb21lIG9mIHRoZSAic3RhdCIKK2luZm9ybWF0aW9uIGZvciB0aGUgZmlsZXMgaW52b2x2ZWQpIHdpbGwgbGlrZWx5IG5lZWQgdG8gYmUgcmVmcmVzaGVkLgorU28gYWZ0ZXIgeW91IGRvIGEgYGNwIC1hYCB0byBjcmVhdGUgYSBuZXcgY29weSwgeW91J2xsIHdhbnQgdG8gZG8KKysKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2gKKy0tLS0tLS0tLS0tLS0tLS0KKysKK2luIHRoZSBuZXcgcmVwb3NpdG9yeSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgaW5kZXggZmlsZSBpcyB1cC10by1kYXRlLgorCitOb3RlIHRoYXQgdGhlIHNlY29uZCBwb2ludCBpcyB0cnVlIGV2ZW4gYWNyb3NzIG1hY2hpbmVzLiBZb3UgY2FuCitkdXBsaWNhdGUgYSByZW1vdGUgZ2l0IHJlcG9zaXRvcnkgd2l0aCAqYW55KiByZWd1bGFyIGNvcHkgbWVjaGFuaXNtLCBiZSBpdAorYHNjcGAsIGByc3luY2Agb3IgYHdnZXRgLgorCitXaGVuIGNvcHlpbmcgYSByZW1vdGUgcmVwb3NpdG9yeSwgeW91J2xsIHdhbnQgdG8gYXQgYSBtaW5pbXVtIHVwZGF0ZSB0aGUKK2luZGV4IGNhY2hlIHdoZW4geW91IGRvIHRoaXMsIGFuZCBlc3BlY2lhbGx5IHdpdGggb3RoZXIgcGVvcGxlcycKK3JlcG9zaXRvcmllcyB5b3Ugb2Z0ZW4gd2FudCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgaW5kZXggY2FjaGUgaXMgaW4gc29tZQora25vd24gc3RhdGUgKHlvdSBkb24ndCBrbm93ICp3aGF0KiB0aGV5J3ZlIGRvbmUgYW5kIG5vdCB5ZXQgY2hlY2tlZCBpbiksCitzbyB1c3VhbGx5IHlvdSdsbCBwcmVjZWRlIHRoZSBgZ2l0LXVwZGF0ZS1pbmRleGAgd2l0aCBhCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IEhFQUQKKyQgZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2gKKy0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggd2lsbCBmb3JjZSBhIHRvdGFsIGluZGV4IHJlLWJ1aWxkIGZyb20gdGhlIHRyZWUgcG9pbnRlZCB0byBieSBgSEVBRGAuCitJdCByZXNldHMgdGhlIGluZGV4IGNvbnRlbnRzIHRvIGBIRUFEYCwgYW5kIHRoZW4gdGhlIGBnaXQtdXBkYXRlLWluZGV4YAorbWFrZXMgc3VyZSB0byBtYXRjaCB1cCBhbGwgaW5kZXggZW50cmllcyB3aXRoIHRoZSBjaGVja2VkLW91dCBmaWxlcy4KK0lmIHRoZSBvcmlnaW5hbCByZXBvc2l0b3J5IGhhZCB1bmNvbW1pdHRlZCBjaGFuZ2VzIGluIGl0cword29ya2luZyB0cmVlLCBgZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2hgIG5vdGljZXMgdGhlbSBhbmQKK3RlbGxzIHlvdSB0aGV5IG5lZWQgdG8gYmUgdXBkYXRlZC4KKworVGhlIGFib3ZlIGNhbiBhbHNvIGJlIHdyaXR0ZW4gYXMgc2ltcGx5CisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHJlc2V0CistLS0tLS0tLS0tLS0tLS0tCisKK2FuZCBpbiBmYWN0IGEgbG90IG9mIHRoZSBjb21tb24gZ2l0IGNvbW1hbmQgY29tYmluYXRpb25zIGNhbiBiZSBzY3JpcHRlZAord2l0aCB0aGUgYGdpdCB4eXpgIGludGVyZmFjZXMuICBZb3UgY2FuIGxlYXJuIHRoaW5ncyBieSBqdXN0IGxvb2tpbmcKK2F0IHdoYXQgdGhlIHZhcmlvdXMgZ2l0IHNjcmlwdHMgZG8uICBGb3IgZXhhbXBsZSwgYGdpdCByZXNldGAgdXNlZCB0byBiZQordGhlIGFib3ZlIHR3byBsaW5lcyBpbXBsZW1lbnRlZCBpbiBgZ2l0LXJlc2V0YCwgYnV0IHNvbWUgdGhpbmdzIGxpa2UKK2BnaXQgc3RhdHVzYCBhbmQgYGdpdCBjb21taXRgIGFyZSBzbGlnaHRseSBtb3JlIGNvbXBsZXggc2NyaXB0cyBhcm91bmQKK3RoZSBiYXNpYyBnaXQgY29tbWFuZHMuCisKK01hbnkgKG1vc3Q/KSBwdWJsaWMgcmVtb3RlIHJlcG9zaXRvcmllcyB3aWxsIG5vdCBjb250YWluIGFueSBvZgordGhlIGNoZWNrZWQgb3V0IGZpbGVzIG9yIGV2ZW4gYW4gaW5kZXggZmlsZSwgYW5kIHdpbGwgKm9ubHkqIGNvbnRhaW4gdGhlCithY3R1YWwgY29yZSBnaXQgZmlsZXMuIFN1Y2ggYSByZXBvc2l0b3J5IHVzdWFsbHkgZG9lc24ndCBldmVuIGhhdmUgdGhlCitgLmdpdGAgc3ViZGlyZWN0b3J5LCBidXQgaGFzIGFsbCB0aGUgZ2l0IGZpbGVzIGRpcmVjdGx5IGluIHRoZQorcmVwb3NpdG9yeS4KKworVG8gY3JlYXRlIHlvdXIgb3duIGxvY2FsIGxpdmUgY29weSBvZiBzdWNoIGEgInJhdyIgZ2l0IHJlcG9zaXRvcnksIHlvdSdkCitmaXJzdCBjcmVhdGUgeW91ciBvd24gc3ViZGlyZWN0b3J5IGZvciB0aGUgcHJvamVjdCwgYW5kIHRoZW4gY29weSB0aGUKK3JhdyByZXBvc2l0b3J5IGNvbnRlbnRzIGludG8gdGhlIGAuZ2l0YCBkaXJlY3RvcnkuIEZvciBleGFtcGxlLCB0bworY3JlYXRlIHlvdXIgb3duIGNvcHkgb2YgdGhlIGdpdCByZXBvc2l0b3J5LCB5b3UnZCBkbyB0aGUgZm9sbG93aW5nCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgbWtkaXIgbXktZ2l0CiskIGNkIG15LWdpdAorJCByc3luYyAtckwgcnN5bmM6Ly9yc3luYy5rZXJuZWwub3JnL3B1Yi9zY20vZ2l0L2dpdC5naXQvIC5naXQKKy0tLS0tLS0tLS0tLS0tLS0KKworZm9sbG93ZWQgYnkKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtcmVhZC10cmVlIEhFQUQKKy0tLS0tLS0tLS0tLS0tLS0KKwordG8gcG9wdWxhdGUgdGhlIGluZGV4LiBIb3dldmVyLCBub3cgeW91IGhhdmUgcG9wdWxhdGVkIHRoZSBpbmRleCwgYW5kCit5b3UgaGF2ZSBhbGwgdGhlIGdpdCBpbnRlcm5hbCBmaWxlcywgYnV0IHlvdSB3aWxsIG5vdGljZSB0aGF0IHlvdSBkb24ndAorYWN0dWFsbHkgaGF2ZSBhbnkgb2YgdGhlIHdvcmtpbmcgdHJlZSBmaWxlcyB0byB3b3JrIG9uLiBUbyBnZXQKK3Rob3NlLCB5b3UnZCBjaGVjayB0aGVtIG91dCB3aXRoCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWNoZWNrb3V0LWluZGV4IC11IC1hCistLS0tLS0tLS0tLS0tLS0tCisKK3doZXJlIHRoZSBgLXVgIGZsYWcgbWVhbnMgdGhhdCB5b3Ugd2FudCB0aGUgY2hlY2tvdXQgdG8ga2VlcCB0aGUgaW5kZXgKK3VwLXRvLWRhdGUgKHNvIHRoYXQgeW91IGRvbid0IGhhdmUgdG8gcmVmcmVzaCBpdCBhZnRlcndhcmQpLCBhbmQgdGhlCitgLWFgIGZsYWcgbWVhbnMgImNoZWNrIG91dCBhbGwgZmlsZXMiIChpZiB5b3UgaGF2ZSBhIHN0YWxlIGNvcHkgb3IgYW4KK29sZGVyIHZlcnNpb24gb2YgYSBjaGVja2VkIG91dCB0cmVlIHlvdSBtYXkgYWxzbyBuZWVkIHRvIGFkZCB0aGUgYC1mYAorZmxhZyBmaXJzdCwgdG8gdGVsbCBnaXQtY2hlY2tvdXQtaW5kZXggdG8gKmZvcmNlKiBvdmVyd3JpdGluZyBvZiBhbnkgb2xkCitmaWxlcykuCisKK0FnYWluLCB0aGlzIGNhbiBhbGwgYmUgc2ltcGxpZmllZCB3aXRoCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNsb25lIHJzeW5jOi8vcnN5bmMua2VybmVsLm9yZy9wdWIvc2NtL2dpdC9naXQuZ2l0LyBteS1naXQKKyQgY2QgbXktZ2l0CiskIGdpdCBjaGVja291dAorLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCB3aWxsIGVuZCB1cCBkb2luZyBhbGwgb2YgdGhlIGFib3ZlIGZvciB5b3UuCisKK1lvdSBoYXZlIG5vdyBzdWNjZXNzZnVsbHkgY29waWVkIHNvbWVib2R5IGVsc2UncyAobWluZSkgcmVtb3RlCityZXBvc2l0b3J5LCBhbmQgY2hlY2tlZCBpdCBvdXQuCisKKworQ3JlYXRpbmcgYSBuZXcgYnJhbmNoCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQnJhbmNoZXMgaW4gZ2l0IGFyZSByZWFsbHkgbm90aGluZyBtb3JlIHRoYW4gcG9pbnRlcnMgaW50byB0aGUgZ2l0CitvYmplY3QgZGF0YWJhc2UgZnJvbSB3aXRoaW4gdGhlIGAuZ2l0L3JlZnMvYCBzdWJkaXJlY3RvcnksIGFuZCBhcyB3ZQorYWxyZWFkeSBkaXNjdXNzZWQsIHRoZSBgSEVBRGAgYnJhbmNoIGlzIG5vdGhpbmcgYnV0IGEgc3ltbGluayB0byBvbmUgb2YKK3RoZXNlIG9iamVjdCBwb2ludGVycy4KKworWW91IGNhbiBhdCBhbnkgdGltZSBjcmVhdGUgYSBuZXcgYnJhbmNoIGJ5IGp1c3QgcGlja2luZyBhbiBhcmJpdHJhcnkKK3BvaW50IGluIHRoZSBwcm9qZWN0IGhpc3RvcnksIGFuZCBqdXN0IHdyaXRpbmcgdGhlIFNIQTEgbmFtZSBvZiB0aGF0CitvYmplY3QgaW50byBhIGZpbGUgdW5kZXIgYC5naXQvcmVmcy9oZWFkcy9gLiBZb3UgY2FuIHVzZSBhbnkgZmlsZW5hbWUgeW91Cit3YW50IChhbmQgaW5kZWVkLCBzdWJkaXJlY3RvcmllcyksIGJ1dCB0aGUgY29udmVudGlvbiBpcyB0aGF0IHRoZQorIm5vcm1hbCIgYnJhbmNoIGlzIGNhbGxlZCBgbWFzdGVyYC4gVGhhdCdzIGp1c3QgYSBjb252ZW50aW9uLCB0aG91Z2gsCithbmQgbm90aGluZyBlbmZvcmNlcyBpdC4KKworVG8gc2hvdyB0aGF0IGFzIGFuIGV4YW1wbGUsIGxldCdzIGdvIGJhY2sgdG8gdGhlIGdpdC10dXRvcmlhbCByZXBvc2l0b3J5IHdlCit1c2VkIGVhcmxpZXIsIGFuZCBjcmVhdGUgYSBicmFuY2ggaW4gaXQuIFlvdSBkbyB0aGF0IGJ5IHNpbXBseSBqdXN0CitzYXlpbmcgdGhhdCB5b3Ugd2FudCB0byBjaGVjayBvdXQgYSBuZXcgYnJhbmNoOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC1iIG15YnJhbmNoCistLS0tLS0tLS0tLS0KKword2lsbCBjcmVhdGUgYSBuZXcgYnJhbmNoIGJhc2VkIGF0IHRoZSBjdXJyZW50IGBIRUFEYCBwb3NpdGlvbiwgYW5kIHN3aXRjaAordG8gaXQuCisKK1tOT1RFXQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJZiB5b3UgbWFrZSB0aGUgZGVjaXNpb24gdG8gc3RhcnQgeW91ciBuZXcgYnJhbmNoIGF0IHNvbWUKK290aGVyIHBvaW50IGluIHRoZSBoaXN0b3J5IHRoYW4gdGhlIGN1cnJlbnQgYEhFQURgLCB5b3UgY2FuIGRvIHNvIGJ5CitqdXN0IHRlbGxpbmcgYGdpdCBjaGVja291dGAgd2hhdCB0aGUgYmFzZSBvZiB0aGUgY2hlY2tvdXQgd291bGQgYmUuCitJbiBvdGhlciB3b3JkcywgaWYgeW91IGhhdmUgYW4gZWFybGllciB0YWcgb3IgYnJhbmNoLCB5b3UnZCBqdXN0IGRvCisKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgLWIgbXlicmFuY2ggZWFybGllci1jb21taXQKKy0tLS0tLS0tLS0tLQorCithbmQgaXQgd291bGQgY3JlYXRlIHRoZSBuZXcgYnJhbmNoIGBteWJyYW5jaGAgYXQgdGhlIGVhcmxpZXIgY29tbWl0LAorYW5kIGNoZWNrIG91dCB0aGUgc3RhdGUgYXQgdGhhdCB0aW1lLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1lvdSBjYW4gYWx3YXlzIGp1c3QganVtcCBiYWNrIHRvIHlvdXIgb3JpZ2luYWwgYG1hc3RlcmAgYnJhbmNoIGJ5IGRvaW5nCisKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgbWFzdGVyCistLS0tLS0tLS0tLS0KKworKG9yIGFueSBvdGhlciBicmFuY2gtbmFtZSwgZm9yIHRoYXQgbWF0dGVyKSBhbmQgaWYgeW91IGZvcmdldCB3aGljaAorYnJhbmNoIHlvdSBoYXBwZW4gdG8gYmUgb24sIGEgc2ltcGxlCisKKy0tLS0tLS0tLS0tLQorJCBjYXQgLmdpdC9IRUFECistLS0tLS0tLS0tLS0KKword2lsbCB0ZWxsIHlvdSB3aGVyZSBpdCdzIHBvaW50aW5nLiAgVG8gZ2V0IHRoZSBsaXN0IG9mIGJyYW5jaGVzCit5b3UgaGF2ZSwgeW91IGNhbiBzYXkKKworLS0tLS0tLS0tLS0tCiskIGdpdCBicmFuY2gKKy0tLS0tLS0tLS0tLQorCit3aGljaCB1c2VkIHRvIGJlIG5vdGhpbmcgbW9yZSB0aGFuIGEgc2ltcGxlIHNjcmlwdCBhcm91bmQgYGxzIC5naXQvcmVmcy9oZWFkc2AuCitUaGVyZSB3aWxsIGJlIGFuIGFzdGVyaXNrIGluIGZyb250IG9mIHRoZSBicmFuY2ggeW91IGFyZSBjdXJyZW50bHkgb24uCisKK1NvbWV0aW1lcyB5b3UgbWF5IHdpc2ggdG8gY3JlYXRlIGEgbmV3IGJyYW5jaCBfd2l0aG91dF8gYWN0dWFsbHkKK2NoZWNraW5nIGl0IG91dCBhbmQgc3dpdGNoaW5nIHRvIGl0LiBJZiBzbywganVzdCB1c2UgdGhlIGNvbW1hbmQKKworLS0tLS0tLS0tLS0tCiskIGdpdCBicmFuY2ggPGJyYW5jaG5hbWU+IFtzdGFydGluZ3BvaW50XQorLS0tLS0tLS0tLS0tCisKK3doaWNoIHdpbGwgc2ltcGx5IF9jcmVhdGVfIHRoZSBicmFuY2gsIGJ1dCB3aWxsIG5vdCBkbyBhbnl0aGluZyBmdXJ0aGVyLgorWW91IGNhbiB0aGVuIGxhdGVyIC0tIG9uY2UgeW91IGRlY2lkZSB0aGF0IHlvdSB3YW50IHRvIGFjdHVhbGx5IGRldmVsb3AKK29uIHRoYXQgYnJhbmNoIC0tIHN3aXRjaCB0byB0aGF0IGJyYW5jaCB3aXRoIGEgcmVndWxhciBgZ2l0IGNoZWNrb3V0YAord2l0aCB0aGUgYnJhbmNobmFtZSBhcyB0aGUgYXJndW1lbnQuCisKKworTWVyZ2luZyB0d28gYnJhbmNoZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK09uZSBvZiB0aGUgaWRlYXMgb2YgaGF2aW5nIGEgYnJhbmNoIGlzIHRoYXQgeW91IGRvIHNvbWUgKHBvc3NpYmx5CitleHBlcmltZW50YWwpIHdvcmsgaW4gaXQsIGFuZCBldmVudHVhbGx5IG1lcmdlIGl0IGJhY2sgdG8gdGhlIG1haW4KK2JyYW5jaC4gU28gYXNzdW1pbmcgeW91IGNyZWF0ZWQgdGhlIGFib3ZlIGBteWJyYW5jaGAgdGhhdCBzdGFydGVkIG91dAorYmVpbmcgdGhlIHNhbWUgYXMgdGhlIG9yaWdpbmFsIGBtYXN0ZXJgIGJyYW5jaCwgbGV0J3MgbWFrZSBzdXJlIHdlJ3JlIGluCit0aGF0IGJyYW5jaCwgYW5kIGRvIHNvbWUgd29yayB0aGVyZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCBteWJyYW5jaAorJCBlY2hvICJXb3JrLCB3b3JrLCB3b3JrIiA+PmhlbGxvCiskIGdpdCBjb21taXQgLW0gIlNvbWUgd29yay4iIC1pIGhlbGxvCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSGVyZSwgd2UganVzdCBhZGRlZCBhbm90aGVyIGxpbmUgdG8gYGhlbGxvYCwgYW5kIHdlIHVzZWQgYSBzaG9ydGhhbmQgZm9yCitkb2luZyBib3RoIGBnaXQtdXBkYXRlLWluZGV4IGhlbGxvYCBhbmQgYGdpdCBjb21taXRgIGJ5IGp1c3QgZ2l2aW5nIHRoZQorZmlsZW5hbWUgZGlyZWN0bHkgdG8gYGdpdCBjb21taXRgLCB3aXRoIGFuIGAtaWAgZmxhZyAoaXQgdGVsbHMKK2dpdCB0byAnaW5jbHVkZScgdGhhdCBmaWxlIGluIGFkZGl0aW9uIHRvIHdoYXQgeW91IGhhdmUgZG9uZSB0bwordGhlIGluZGV4IGZpbGUgc28gZmFyIHdoZW4gbWFraW5nIHRoZSBjb21taXQpLiAgVGhlIGAtbWAgZmxhZyBpcyB0byBnaXZlIHRoZQorY29tbWl0IGxvZyBtZXNzYWdlIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KKworTm93LCB0byBtYWtlIGl0IGEgYml0IG1vcmUgaW50ZXJlc3RpbmcsIGxldCdzIGFzc3VtZSB0aGF0IHNvbWVib2R5IGVsc2UKK2RvZXMgc29tZSB3b3JrIGluIHRoZSBvcmlnaW5hbCBicmFuY2gsIGFuZCBzaW11bGF0ZSB0aGF0IGJ5IGdvaW5nIGJhY2sKK3RvIHRoZSBtYXN0ZXIgYnJhbmNoLCBhbmQgZWRpdGluZyB0aGUgc2FtZSBmaWxlIGRpZmZlcmVudGx5IHRoZXJlOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IG1hc3RlcgorLS0tLS0tLS0tLS0tCisKK0hlcmUsIHRha2UgYSBtb21lbnQgdG8gbG9vayBhdCB0aGUgY29udGVudHMgb2YgYGhlbGxvYCwgYW5kIG5vdGljZSBob3cgdGhleQorZG9uJ3QgY29udGFpbiB0aGUgd29yayB3ZSBqdXN0IGRpZCBpbiBgbXlicmFuY2hgIC0tIGJlY2F1c2UgdGhhdCB3b3JrCitoYXNuJ3QgaGFwcGVuZWQgaW4gdGhlIGBtYXN0ZXJgIGJyYW5jaCBhdCBhbGwuIFRoZW4gZG8KKworLS0tLS0tLS0tLS0tCiskIGVjaG8gIlBsYXksIHBsYXksIHBsYXkiID4+aGVsbG8KKyQgZWNobyAiTG90cyBvZiBmdW4iID4+ZXhhbXBsZQorJCBnaXQgY29tbWl0IC1tICJTb21lIGZ1bi4iIC1pIGhlbGxvIGV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCitzaW5jZSB0aGUgbWFzdGVyIGJyYW5jaCBpcyBvYnZpb3VzbHkgaW4gYSBtdWNoIGJldHRlciBtb29kLgorCitOb3csIHlvdSd2ZSBnb3QgdHdvIGJyYW5jaGVzLCBhbmQgeW91IGRlY2lkZSB0aGF0IHlvdSB3YW50IHRvIG1lcmdlIHRoZQord29yayBkb25lLiBCZWZvcmUgd2UgZG8gdGhhdCwgbGV0J3MgaW50cm9kdWNlIGEgY29vbCBncmFwaGljYWwgdG9vbCB0aGF0CitoZWxwcyB5b3UgdmlldyB3aGF0J3MgZ29pbmcgb246CisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0ayAtLWFsbAorLS0tLS0tLS0tLS0tLS0tLQorCit3aWxsIHNob3cgeW91IGdyYXBoaWNhbGx5IGJvdGggb2YgeW91ciBicmFuY2hlcyAodGhhdCdzIHdoYXQgdGhlIGBcLS1hbGxgCittZWFuczogbm9ybWFsbHkgaXQgd2lsbCBqdXN0IHNob3cgeW91IHlvdXIgY3VycmVudCBgSEVBRGApIGFuZCB0aGVpcgoraGlzdG9yaWVzLiBZb3UgY2FuIGFsc28gc2VlIGV4YWN0bHkgaG93IHRoZXkgY2FtZSB0byBiZSBmcm9tIGEgY29tbW9uCitzb3VyY2UuCisKK0FueXdheSwgbGV0J3MgZXhpdCBgZ2l0a2AgKGBeUWAgb3IgdGhlIEZpbGUgbWVudSksIGFuZCBkZWNpZGUgdGhhdCB3ZSB3YW50Cit0byBtZXJnZSB0aGUgd29yayB3ZSBkaWQgb24gdGhlIGBteWJyYW5jaGAgYnJhbmNoIGludG8gdGhlIGBtYXN0ZXJgCiticmFuY2ggKHdoaWNoIGlzIGN1cnJlbnRseSBvdXIgYEhFQURgIHRvbykuIFRvIGRvIHRoYXQsIHRoZXJlJ3MgYSBuaWNlCitzY3JpcHQgY2FsbGVkIGBnaXQgbWVyZ2VgLCB3aGljaCB3YW50cyB0byBrbm93IHdoaWNoIGJyYW5jaGVzIHlvdSB3YW50Cit0byByZXNvbHZlIGFuZCB3aGF0IHRoZSBtZXJnZSBpcyBhbGwgYWJvdXQ6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgbWVyZ2UgLW0gIk1lcmdlIHdvcmsgaW4gbXlicmFuY2giIG15YnJhbmNoCistLS0tLS0tLS0tLS0KKword2hlcmUgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGdvaW5nIHRvIGJlIHVzZWQgYXMgdGhlIGNvbW1pdCBtZXNzYWdlIGlmCit0aGUgbWVyZ2UgY2FuIGJlIHJlc29sdmVkIGF1dG9tYXRpY2FsbHkuCisKK05vdywgaW4gdGhpcyBjYXNlIHdlJ3ZlIGludGVudGlvbmFsbHkgY3JlYXRlZCBhIHNpdHVhdGlvbiB3aGVyZSB0aGUKK21lcmdlIHdpbGwgbmVlZCB0byBiZSBmaXhlZCB1cCBieSBoYW5kLCB0aG91Z2gsIHNvIGdpdCB3aWxsIGRvIGFzIG11Y2gKK29mIGl0IGFzIGl0IGNhbiBhdXRvbWF0aWNhbGx5ICh3aGljaCBpbiB0aGlzIGNhc2UgaXMganVzdCBtZXJnZSB0aGUgYGV4YW1wbGVgCitmaWxlLCB3aGljaCBoYWQgbm8gZGlmZmVyZW5jZXMgaW4gdGhlIGBteWJyYW5jaGAgYnJhbmNoKSwgYW5kIHNheToKKworLS0tLS0tLS0tLS0tLS0tLQorCUF1dG8tbWVyZ2luZyBoZWxsbworCUNPTkZMSUNUIChjb250ZW50KTogTWVyZ2UgY29uZmxpY3QgaW4gaGVsbG8KKwlBdXRvbWF0aWMgbWVyZ2UgZmFpbGVkOyBmaXggdXAgYnkgaGFuZAorLS0tLS0tLS0tLS0tLS0tLQorCitJdCB0ZWxscyB5b3UgdGhhdCBpdCBkaWQgYW4gIkF1dG9tYXRpYyBtZXJnZSIsIHdoaWNoCitmYWlsZWQgZHVlIHRvIGNvbmZsaWN0cyBpbiBgaGVsbG9gLgorCitOb3QgdG8gd29ycnkuIEl0IGxlZnQgdGhlICh0cml2aWFsKSBjb25mbGljdCBpbiBgaGVsbG9gIGluIHRoZSBzYW1lIGZvcm0geW91CitzaG91bGQgYWxyZWFkeSBiZSB3ZWxsIHVzZWQgdG8gaWYgeW91J3ZlIGV2ZXIgdXNlZCBDVlMsIHNvIGxldCdzIGp1c3QKK29wZW4gYGhlbGxvYCBpbiBvdXIgZWRpdG9yICh3aGF0ZXZlciB0aGF0IG1heSBiZSksIGFuZCBmaXggaXQgdXAgc29tZWhvdy4KK0knZCBzdWdnZXN0IGp1c3QgbWFraW5nIGl0IHNvIHRoYXQgYGhlbGxvYCBjb250YWlucyBhbGwgZm91ciBsaW5lczoKKworLS0tLS0tLS0tLS0tCitIZWxsbyBXb3JsZAorSXQncyBhIG5ldyBkYXkgZm9yIGdpdAorUGxheSwgcGxheSwgcGxheQorV29yaywgd29yaywgd29yaworLS0tLS0tLS0tLS0tCisKK2FuZCBvbmNlIHlvdSdyZSBoYXBweSB3aXRoIHlvdXIgbWFudWFsIG1lcmdlLCBqdXN0IGRvIGEKKworLS0tLS0tLS0tLS0tCiskIGdpdCBjb21taXQgLWkgaGVsbG8KKy0tLS0tLS0tLS0tLQorCit3aGljaCB3aWxsIHZlcnkgbG91ZGx5IHdhcm4geW91IHRoYXQgeW91J3JlIG5vdyBjb21taXR0aW5nIGEgbWVyZ2UKKyh3aGljaCBpcyBjb3JyZWN0LCBzbyBuZXZlciBtaW5kKSwgYW5kIHlvdSBjYW4gd3JpdGUgYSBzbWFsbCBtZXJnZQorbWVzc2FnZSBhYm91dCB5b3VyIGFkdmVudHVyZXMgaW4gZ2l0LW1lcmdlLWxhbmQuCisKK0FmdGVyIHlvdSdyZSBkb25lLCBzdGFydCB1cCBgZ2l0ayBcLS1hbGxgIHRvIHNlZSBncmFwaGljYWxseSB3aGF0IHRoZQoraGlzdG9yeSBsb29rcyBsaWtlLiBOb3RpY2UgdGhhdCBgbXlicmFuY2hgIHN0aWxsIGV4aXN0cywgYW5kIHlvdSBjYW4KK3N3aXRjaCB0byBpdCwgYW5kIGNvbnRpbnVlIHRvIHdvcmsgd2l0aCBpdCBpZiB5b3Ugd2FudCB0by4gVGhlCitgbXlicmFuY2hgIGJyYW5jaCB3aWxsIG5vdCBjb250YWluIHRoZSBtZXJnZSwgYnV0IG5leHQgdGltZSB5b3UgbWVyZ2UgaXQKK2Zyb20gdGhlIGBtYXN0ZXJgIGJyYW5jaCwgZ2l0IHdpbGwga25vdyBob3cgeW91IG1lcmdlZCBpdCwgc28geW91J2xsIG5vdAoraGF2ZSB0byBkbyBfdGhhdF8gbWVyZ2UgYWdhaW4uCisKK0Fub3RoZXIgdXNlZnVsIHRvb2wsIGVzcGVjaWFsbHkgaWYgeW91IGRvIG5vdCBhbHdheXMgd29yayBpbiBYLVdpbmRvdworZW52aXJvbm1lbnQsIGlzIGBnaXQgc2hvdy1icmFuY2hgLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LXNob3ctYnJhbmNoIC0tdG9wby1vcmRlciAtLW1vcmU9MSBtYXN0ZXIgbXlicmFuY2gKKyogW21hc3Rlcl0gTWVyZ2Ugd29yayBpbiBteWJyYW5jaAorICEgW215YnJhbmNoXSBTb21lIHdvcmsuCistLQorLSAgW21hc3Rlcl0gTWVyZ2Ugd29yayBpbiBteWJyYW5jaAorKisgW215YnJhbmNoXSBTb21lIHdvcmsuCisqICBbbWFzdGVyXl0gU29tZSBmdW4uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGZpcnN0IHR3byBsaW5lcyBpbmRpY2F0ZSB0aGF0IGl0IGlzIHNob3dpbmcgdGhlIHR3byBicmFuY2hlcworYW5kIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBjb21taXQgbG9nIG1lc3NhZ2UgZnJvbSB0aGVpcgordG9wLW9mLXRoZS10cmVlIGNvbW1pdHMsIHlvdSBhcmUgY3VycmVudGx5IG9uIGBtYXN0ZXJgIGJyYW5jaAorKG5vdGljZSB0aGUgYXN0ZXJpc2sgYFwqYCBjaGFyYWN0ZXIpLCBhbmQgdGhlIGZpcnN0IGNvbHVtbiBmb3IKK3RoZSBsYXRlciBvdXRwdXQgbGluZXMgaXMgdXNlZCB0byBzaG93IGNvbW1pdHMgY29udGFpbmVkIGluIHRoZQorYG1hc3RlcmAgYnJhbmNoLCBhbmQgdGhlIHNlY29uZCBjb2x1bW4gZm9yIHRoZSBgbXlicmFuY2hgCiticmFuY2guIFRocmVlIGNvbW1pdHMgYXJlIHNob3duIGFsb25nIHdpdGggdGhlaXIgbG9nIG1lc3NhZ2VzLgorQWxsIG9mIHRoZW0gaGF2ZSBub24gYmxhbmsgY2hhcmFjdGVycyBpbiB0aGUgZmlyc3QgY29sdW1uIChgKmAKK3Nob3dzIGFuIG9yZGluYXJ5IGNvbW1pdCBvbiB0aGUgY3VycmVudCBicmFuY2gsIGAtYCBpcyBhIG1lcmdlIGNvbW1pdCksIHdoaWNoCittZWFucyB0aGV5IGFyZSBub3cgcGFydCBvZiB0aGUgYG1hc3RlcmAgYnJhbmNoLiBPbmx5IHRoZSAiU29tZQord29yayIgY29tbWl0IGhhcyB0aGUgcGx1cyBgK2AgY2hhcmFjdGVyIGluIHRoZSBzZWNvbmQgY29sdW1uLAorYmVjYXVzZSBgbXlicmFuY2hgIGhhcyBub3QgYmVlbiBtZXJnZWQgdG8gaW5jb3Jwb3JhdGUgdGhlc2UKK2NvbW1pdHMgZnJvbSB0aGUgbWFzdGVyIGJyYW5jaC4gIFRoZSBzdHJpbmcgaW5zaWRlIGJyYWNrZXRzCitiZWZvcmUgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZSBpcyBhIHNob3J0IG5hbWUgeW91IGNhbiB1c2UgdG8KK25hbWUgdGhlIGNvbW1pdC4gIEluIHRoZSBhYm92ZSBleGFtcGxlLCAnbWFzdGVyJyBhbmQgJ215YnJhbmNoJworYXJlIGJyYW5jaCBoZWFkcy4gICdtYXN0ZXJeJyBpcyB0aGUgZmlyc3QgcGFyZW50IG9mICdtYXN0ZXInCiticmFuY2ggaGVhZC4gIFBsZWFzZSBzZWUgJ2dpdC1yZXYtcGFyc2UnIGRvY3VtZW50YXRpb24gaWYgeW91CitzZWUgbW9yZSBjb21wbGV4IGNhc2VzLgorCitbTk9URV0KK1dpdGhvdXQgdGhlICctLW1vcmU9MScgb3B0aW9uLCAnZ2l0LXNob3ctYnJhbmNoJyB3b3VsZCBub3Qgb3V0cHV0IHRoZQorJ1ttYXN0ZXJeXScgY29tbWl0LCBhcyAnW215YnJhbmNoXScgY29tbWl0IGlzIGEgY29tbW9uIGFuY2VzdG9yIG9mCitib3RoICdtYXN0ZXInIGFuZCAnbXlicmFuY2gnIHRpcHMuICBQbGVhc2Ugc2VlICdnaXQtc2hvdy1icmFuY2gnCitkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgorCitbTk9URV0KK0lmIHRoZXJlIHdlcmUgbW9yZSBjb21taXRzIG9uIHRoZSAnbWFzdGVyJyBicmFuY2ggYWZ0ZXIgdGhlIG1lcmdlLCB0aGUKK21lcmdlIGNvbW1pdCBpdHNlbGYgd291bGQgbm90IGJlIHNob3duIGJ5ICdnaXQtc2hvdy1icmFuY2gnIGJ5CitkZWZhdWx0LiAgWW91IHdvdWxkIG5lZWQgdG8gcHJvdmlkZSAnLS1zcGFyc2UnIG9wdGlvbiB0byBtYWtlIHRoZQorbWVyZ2UgY29tbWl0IHZpc2libGUgaW4gdGhpcyBjYXNlLgorCitOb3csIGxldCdzIHByZXRlbmQgeW91IGFyZSB0aGUgb25lIHdobyBkaWQgYWxsIHRoZSB3b3JrIGluCitgbXlicmFuY2hgLCBhbmQgdGhlIGZydWl0IG9mIHlvdXIgaGFyZCB3b3JrIGhhcyBmaW5hbGx5IGJlZW4gbWVyZ2VkCit0byB0aGUgYG1hc3RlcmAgYnJhbmNoLiBMZXQncyBnbyBiYWNrIHRvIGBteWJyYW5jaGAsIGFuZCBydW4KK2BnaXQgbWVyZ2VgIHRvIGdldCB0aGUgInVwc3RyZWFtIGNoYW5nZXMiIGJhY2sgdG8geW91ciBicmFuY2guCisKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgbXlicmFuY2gKKyQgZ2l0IG1lcmdlIC1tICJNZXJnZSB1cHN0cmVhbSBjaGFuZ2VzLiIgbWFzdGVyCistLS0tLS0tLS0tLS0KKworVGhpcyBvdXRwdXRzIHNvbWV0aGluZyBsaWtlIHRoaXMgKHRoZSBhY3R1YWwgY29tbWl0IG9iamVjdCBuYW1lcword291bGQgYmUgZGlmZmVyZW50KQorCistLS0tLS0tLS0tLS0tLS0tCitVcGRhdGluZyBmcm9tIGFlM2EyZGEuLi4gdG8gYTgwYjRhYS4uLi4KK0Zhc3QgZm9yd2FyZAorIGV4YW1wbGUgfCAgICAxICsKKyBoZWxsbyAgIHwgICAgMSArCisgMiBmaWxlcyBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCistLS0tLS0tLS0tLS0tLS0tCisKK0JlY2F1c2UgeW91ciBicmFuY2ggZGlkIG5vdCBjb250YWluIGFueXRoaW5nIG1vcmUgdGhhbiB3aGF0IGFyZQorYWxyZWFkeSBtZXJnZWQgaW50byB0aGUgYG1hc3RlcmAgYnJhbmNoLCB0aGUgbWVyZ2Ugb3BlcmF0aW9uIGRpZAorbm90IGFjdHVhbGx5IGRvIGEgbWVyZ2UuIEluc3RlYWQsIGl0IGp1c3QgdXBkYXRlZCB0aGUgdG9wIG9mCit0aGUgdHJlZSBvZiB5b3VyIGJyYW5jaCB0byB0aGF0IG9mIHRoZSBgbWFzdGVyYCBicmFuY2guIFRoaXMgaXMKK29mdGVuIGNhbGxlZCAnZmFzdCBmb3J3YXJkJyBtZXJnZS4KKworWW91IGNhbiBydW4gYGdpdGsgXC0tYWxsYCBhZ2FpbiB0byBzZWUgaG93IHRoZSBjb21taXQgYW5jZXN0cnkKK2xvb2tzIGxpa2UsIG9yIHJ1biBgc2hvdy1icmFuY2hgLCB3aGljaCB0ZWxscyB5b3UgdGhpcy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93LWJyYW5jaCBtYXN0ZXIgbXlicmFuY2gKKyEgW21hc3Rlcl0gTWVyZ2Ugd29yayBpbiBteWJyYW5jaAorICogW215YnJhbmNoXSBNZXJnZSB3b3JrIGluIG15YnJhbmNoCistLQorLS0gW21hc3Rlcl0gTWVyZ2Ugd29yayBpbiBteWJyYW5jaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworTWVyZ2luZyBleHRlcm5hbCB3b3JrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSXQncyB1c3VhbGx5IG11Y2ggbW9yZSBjb21tb24gdGhhdCB5b3UgbWVyZ2Ugd2l0aCBzb21lYm9keSBlbHNlIHRoYW4KK21lcmdpbmcgd2l0aCB5b3VyIG93biBicmFuY2hlcywgc28gaXQncyB3b3J0aCBwb2ludGluZyBvdXQgdGhhdCBnaXQKK21ha2VzIHRoYXQgdmVyeSBlYXN5IHRvbywgYW5kIGluIGZhY3QsIGl0J3Mgbm90IHRoYXQgZGlmZmVyZW50IGZyb20KK2RvaW5nIGEgYGdpdCBtZXJnZWAuIEluIGZhY3QsIGEgcmVtb3RlIG1lcmdlIGVuZHMgdXAgYmVpbmcgbm90aGluZworbW9yZSB0aGFuICJmZXRjaCB0aGUgd29yayBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgaW50byBhIHRlbXBvcmFyeSB0YWciCitmb2xsb3dlZCBieSBhIGBnaXQgbWVyZ2VgLgorCitGZXRjaGluZyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgaXMgZG9uZSBieSwgdW5zdXJwcmlzaW5nbHksCitgZ2l0IGZldGNoYDoKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZmV0Y2ggPHJlbW90ZS1yZXBvc2l0b3J5PgorLS0tLS0tLS0tLS0tLS0tLQorCitPbmUgb2YgdGhlIGZvbGxvd2luZyB0cmFuc3BvcnRzIGNhbiBiZSB1c2VkIHRvIG5hbWUgdGhlCityZXBvc2l0b3J5IHRvIGRvd25sb2FkIGZyb206CisKK1JzeW5jOjoKKwlgcnN5bmM6Ly9yZW1vdGUubWFjaGluZS9wYXRoL3RvL3JlcG8uZ2l0L2AKKysKK1JzeW5jIHRyYW5zcG9ydCBpcyB1c2FibGUgZm9yIGJvdGggdXBsb2FkaW5nIGFuZCBkb3dubG9hZGluZywKK2J1dCBpcyBjb21wbGV0ZWx5IHVuYXdhcmUgb2Ygd2hhdCBnaXQgZG9lcywgYW5kIGNhbiBwcm9kdWNlCit1bmV4cGVjdGVkIHJlc3VsdHMgd2hlbiB5b3UgZG93bmxvYWQgZnJvbSB0aGUgcHVibGljIHJlcG9zaXRvcnkKK3doaWxlIHRoZSByZXBvc2l0b3J5IG93bmVyIGlzIHVwbG9hZGluZyBpbnRvIGl0IHZpYSBgcnN5bmNgCit0cmFuc3BvcnQuICBNb3N0IG5vdGFibHksIGl0IGNvdWxkIHVwZGF0ZSB0aGUgZmlsZXMgdW5kZXIKK2ByZWZzL2Agd2hpY2ggaG9sZHMgdGhlIG9iamVjdCBuYW1lIG9mIHRoZSB0b3Btb3N0IGNvbW1pdHMKK2JlZm9yZSB1cGxvYWRpbmcgdGhlIGZpbGVzIGluIGBvYmplY3RzL2AgLS0gdGhlIGRvd25sb2FkZXIgd291bGQKK29idGFpbiBoZWFkIGNvbW1pdCBvYmplY3QgbmFtZSB3aGlsZSB0aGF0IG9iamVjdCBpdHNlbGYgaXMgc3RpbGwKK25vdCBhdmFpbGFibGUgaW4gdGhlIHJlcG9zaXRvcnkuICBGb3IgdGhpcyByZWFzb24sIGl0IGlzCitjb25zaWRlcmVkIGRlcHJlY2F0ZWQuCisKK1NTSDo6CisJYHJlbW90ZS5tYWNoaW5lOi9wYXRoL3RvL3JlcG8uZ2l0L2Agb3IKKysKK2Bzc2g6Ly9yZW1vdGUubWFjaGluZS9wYXRoL3RvL3JlcG8uZ2l0L2AKKysKK1RoaXMgdHJhbnNwb3J0IGNhbiBiZSB1c2VkIGZvciBib3RoIHVwbG9hZGluZyBhbmQgZG93bmxvYWRpbmcsCithbmQgcmVxdWlyZXMgeW91IHRvIGhhdmUgYSBsb2ctaW4gcHJpdmlsZWdlIG92ZXIgYHNzaGAgdG8gdGhlCityZW1vdGUgbWFjaGluZS4gIEl0IGZpbmRzIG91dCB0aGUgc2V0IG9mIG9iamVjdHMgdGhlIG90aGVyIHNpZGUKK2xhY2tzIGJ5IGV4Y2hhbmdpbmcgdGhlIGhlYWQgY29tbWl0cyBib3RoIGVuZHMgaGF2ZSBhbmQKK3RyYW5zZmVycyAoY2xvc2UgdG8pIG1pbmltdW0gc2V0IG9mIG9iamVjdHMuICBJdCBpcyBieSBmYXIgdGhlCittb3N0IGVmZmljaWVudCB3YXkgdG8gZXhjaGFuZ2UgZ2l0IG9iamVjdHMgYmV0d2VlbiByZXBvc2l0b3JpZXMuCisKK0xvY2FsIGRpcmVjdG9yeTo6CisJYC9wYXRoL3RvL3JlcG8uZ2l0L2AKKysKK1RoaXMgdHJhbnNwb3J0IGlzIHRoZSBzYW1lIGFzIFNTSCB0cmFuc3BvcnQgYnV0IHVzZXMgYHNoYCB0byBydW4KK2JvdGggZW5kcyBvbiB0aGUgbG9jYWwgbWFjaGluZSBpbnN0ZWFkIG9mIHJ1bm5pbmcgb3RoZXIgZW5kIG9uCit0aGUgcmVtb3RlIG1hY2hpbmUgdmlhIGBzc2hgLgorCitnaXQgTmF0aXZlOjoKKwlgZ2l0Oi8vcmVtb3RlLm1hY2hpbmUvcGF0aC90by9yZXBvLmdpdC9gCisrCitUaGlzIHRyYW5zcG9ydCB3YXMgZGVzaWduZWQgZm9yIGFub255bW91cyBkb3dubG9hZGluZy4gIExpa2UgU1NICit0cmFuc3BvcnQsIGl0IGZpbmRzIG91dCB0aGUgc2V0IG9mIG9iamVjdHMgdGhlIGRvd25zdHJlYW0gc2lkZQorbGFja3MgYW5kIHRyYW5zZmVycyAoY2xvc2UgdG8pIG1pbmltdW0gc2V0IG9mIG9iamVjdHMuCisKK0hUVFAoUyk6OgorCWBodHRwOi8vcmVtb3RlLm1hY2hpbmUvcGF0aC90by9yZXBvLmdpdC9gCisrCitEb3dubG9hZGVyIGZyb20gaHR0cCBhbmQgaHR0cHMgVVJMCitmaXJzdCBvYnRhaW5zIHRoZSB0b3Btb3N0IGNvbW1pdCBvYmplY3QgbmFtZSBmcm9tIHRoZSByZW1vdGUgc2l0ZQorYnkgbG9va2luZyBhdCB0aGUgc3BlY2lmaWVkIHJlZm5hbWUgdW5kZXIgYHJlcG8uZ2l0L3JlZnMvYCBkaXJlY3RvcnksCithbmQgdGhlbiB0cmllcyB0byBvYnRhaW4gdGhlCitjb21taXQgb2JqZWN0IGJ5IGRvd25sb2FkaW5nIGZyb20gYHJlcG8uZ2l0L29iamVjdHMveHgveHh4XC4uLmAKK3VzaW5nIHRoZSBvYmplY3QgbmFtZSBvZiB0aGF0IGNvbW1pdCBvYmplY3QuICBUaGVuIGl0IHJlYWRzIHRoZQorY29tbWl0IG9iamVjdCB0byBmaW5kIG91dCBpdHMgcGFyZW50IGNvbW1pdHMgYW5kIHRoZSBhc3NvY2lhdGUKK3RyZWUgb2JqZWN0OyBpdCByZXBlYXRzIHRoaXMgcHJvY2VzcyB1bnRpbCBpdCBnZXRzIGFsbCB0aGUKK25lY2Vzc2FyeSBvYmplY3RzLiAgQmVjYXVzZSBvZiB0aGlzIGJlaGF2aW9yLCB0aGV5IGFyZQorc29tZXRpbWVzIGFsc28gY2FsbGVkICdjb21taXQgd2Fsa2VycycuCisrCitUaGUgJ2NvbW1pdCB3YWxrZXJzJyBhcmUgc29tZXRpbWVzIGFsc28gY2FsbGVkICdkdW1iCit0cmFuc3BvcnRzJywgYmVjYXVzZSB0aGV5IGRvIG5vdCByZXF1aXJlIGFueSBnaXQgYXdhcmUgc21hcnQKK3NlcnZlciBsaWtlIGdpdCBOYXRpdmUgdHJhbnNwb3J0IGRvZXMuICBBbnkgc3RvY2sgSFRUUCBzZXJ2ZXIKK3RoYXQgZG9lcyBub3QgZXZlbiBzdXBwb3J0IGRpcmVjdG9yeSBpbmRleCB3b3VsZCBzdWZmaWNlLiAgQnV0Cit5b3UgbXVzdCBwcmVwYXJlIHlvdXIgcmVwb3NpdG9yeSB3aXRoIGBnaXQtdXBkYXRlLXNlcnZlci1pbmZvYAordG8gaGVscCBkdW1iIHRyYW5zcG9ydCBkb3dubG9hZGVycy4KKworT25jZSB5b3UgZmV0Y2ggZnJvbSB0aGUgcmVtb3RlIHJlcG9zaXRvcnksIHlvdSBgbWVyZ2VgIHRoYXQKK3dpdGggeW91ciBjdXJyZW50IGJyYW5jaC4KKworSG93ZXZlciAtLSBpdCdzIHN1Y2ggYSBjb21tb24gdGhpbmcgdG8gYGZldGNoYCBhbmQgdGhlbgoraW1tZWRpYXRlbHkgYG1lcmdlYCwgdGhhdCBpdCdzIGNhbGxlZCBgZ2l0IHB1bGxgLCBhbmQgeW91IGNhbgorc2ltcGx5IGRvCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHB1bGwgPHJlbW90ZS1yZXBvc2l0b3J5PgorLS0tLS0tLS0tLS0tLS0tLQorCithbmQgb3B0aW9uYWxseSBnaXZlIGEgYnJhbmNoLW5hbWUgZm9yIHRoZSByZW1vdGUgZW5kIGFzIGEgc2Vjb25kCithcmd1bWVudC4KKworW05PVEVdCitZb3UgY291bGQgZG8gd2l0aG91dCB1c2luZyBhbnkgYnJhbmNoZXMgYXQgYWxsLCBieQora2VlcGluZyBhcyBtYW55IGxvY2FsIHJlcG9zaXRvcmllcyBhcyB5b3Ugd291bGQgbGlrZSB0byBoYXZlCiticmFuY2hlcywgYW5kIG1lcmdpbmcgYmV0d2VlbiB0aGVtIHdpdGggYGdpdCBwdWxsYCwganVzdCBsaWtlCit5b3UgbWVyZ2UgYmV0d2VlbiBicmFuY2hlcy4gVGhlIGFkdmFudGFnZSBvZiB0aGlzIGFwcHJvYWNoIGlzCit0aGF0IGl0IGxldHMgeW91IGtlZXAgYSBzZXQgb2YgZmlsZXMgZm9yIGVhY2ggYGJyYW5jaGAgY2hlY2tlZAorb3V0IGFuZCB5b3UgbWF5IGZpbmQgaXQgZWFzaWVyIHRvIHN3aXRjaCBiYWNrIGFuZCBmb3J0aCBpZiB5b3UKK2p1Z2dsZSBtdWx0aXBsZSBsaW5lcyBvZiBkZXZlbG9wbWVudCBzaW11bHRhbmVvdXNseS4gT2YKK2NvdXJzZSwgeW91IHdpbGwgcGF5IHRoZSBwcmljZSBvZiBtb3JlIGRpc2sgdXNhZ2UgdG8gaG9sZAorbXVsdGlwbGUgd29ya2luZyB0cmVlcywgYnV0IGRpc2sgc3BhY2UgaXMgY2hlYXAgdGhlc2UgZGF5cy4KKworSXQgaXMgbGlrZWx5IHRoYXQgeW91IHdpbGwgYmUgcHVsbGluZyBmcm9tIHRoZSBzYW1lIHJlbW90ZQorcmVwb3NpdG9yeSBmcm9tIHRpbWUgdG8gdGltZS4gQXMgYSBzaG9ydCBoYW5kLCB5b3UgY2FuIHN0b3JlCit0aGUgcmVtb3RlIHJlcG9zaXRvcnkgVVJMIGluIHRoZSBsb2NhbCByZXBvc2l0b3J5J3MgY29uZmlnIGZpbGUKK2xpa2UgdGhpczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjb25maWcgcmVtb3RlLmxpbnVzLnVybCBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NjbS9naXQvZ2l0LmdpdC8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbmQgdXNlIHRoZSAibGludXMiIGtleXdvcmQgd2l0aCBgZ2l0IHB1bGxgIGluc3RlYWQgb2YgdGhlIGZ1bGwgVVJMLgorCitFeGFtcGxlcy4KKworLiBgZ2l0IHB1bGwgbGludXNgCisuIGBnaXQgcHVsbCBsaW51cyB0YWcgdjAuOTkuMWAKKwordGhlIGFib3ZlIGFyZSBlcXVpdmFsZW50IHRvOgorCisuIGBnaXQgcHVsbCBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NjbS9naXQvZ2l0LmdpdC8gSEVBRGAKKy4gYGdpdCBwdWxsIGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc2NtL2dpdC9naXQuZ2l0LyB0YWcgdjAuOTkuMWAKKworCitIb3cgZG9lcyB0aGUgbWVyZ2Ugd29yaz8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXZSBzYWlkIHRoaXMgdHV0b3JpYWwgc2hvd3Mgd2hhdCBwbHVtYmluZyBkb2VzIHRvIGhlbHAgeW91IGNvcGUKK3dpdGggdGhlIHBvcmNlbGFpbiB0aGF0IGlzbid0IGZsdXNoaW5nLCBidXQgd2Ugc28gZmFyIGRpZCBub3QKK3RhbGsgYWJvdXQgaG93IHRoZSBtZXJnZSByZWFsbHkgd29ya3MuICBJZiB5b3UgYXJlIGZvbGxvd2luZwordGhpcyB0dXRvcmlhbCB0aGUgZmlyc3QgdGltZSwgSSdkIHN1Z2dlc3QgdG8gc2tpcCB0byAiUHVibGlzaGluZworeW91ciB3b3JrIiBzZWN0aW9uIGFuZCBjb21lIGJhY2sgaGVyZSBsYXRlci4KKworT0ssIHN0aWxsIHdpdGggbWU/ICBUbyBnaXZlIHVzIGFuIGV4YW1wbGUgdG8gbG9vayBhdCwgbGV0J3MgZ28KK2JhY2sgdG8gdGhlIGVhcmxpZXIgcmVwb3NpdG9yeSB3aXRoICJoZWxsbyIgYW5kICJleGFtcGxlIiBmaWxlLAorYW5kIGJyaW5nIG91cnNlbHZlcyBiYWNrIHRvIHRoZSBwcmUtbWVyZ2Ugc3RhdGU6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdy1icmFuY2ggLS1tb3JlPTIgbWFzdGVyIG15YnJhbmNoCishIFttYXN0ZXJdIE1lcmdlIHdvcmsgaW4gbXlicmFuY2gKKyAqIFtteWJyYW5jaF0gTWVyZ2Ugd29yayBpbiBteWJyYW5jaAorLS0KKy0tIFttYXN0ZXJdIE1lcmdlIHdvcmsgaW4gbXlicmFuY2gKKysqIFttYXN0ZXJeMl0gU29tZSB3b3JrLgorKyogW21hc3Rlcl5dIFNvbWUgZnVuLgorLS0tLS0tLS0tLS0tCisKK1JlbWVtYmVyLCBiZWZvcmUgcnVubmluZyBgZ2l0IG1lcmdlYCwgb3VyIGBtYXN0ZXJgIGhlYWQgd2FzIGF0CisiU29tZSBmdW4uIiBjb21taXQsIHdoaWxlIG91ciBgbXlicmFuY2hgIGhlYWQgd2FzIGF0ICJTb21lCit3b3JrLiIgY29tbWl0LgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IG15YnJhbmNoCiskIGdpdCByZXNldCAtLWhhcmQgbWFzdGVyXjIKKyQgZ2l0IGNoZWNrb3V0IG1hc3RlcgorJCBnaXQgcmVzZXQgLS1oYXJkIG1hc3Rlcl4KKy0tLS0tLS0tLS0tLQorCitBZnRlciByZXdpbmRpbmcsIHRoZSBjb21taXQgc3RydWN0dXJlIHNob3VsZCBsb29rIGxpa2UgdGhpczoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93LWJyYW5jaAorKiBbbWFzdGVyXSBTb21lIGZ1bi4KKyAhIFtteWJyYW5jaF0gU29tZSB3b3JrLgorLS0KKyArIFtteWJyYW5jaF0gU29tZSB3b3JrLgorKiAgW21hc3Rlcl0gU29tZSBmdW4uCisqKyBbbXlicmFuY2heXSBOZXcgZGF5LgorLS0tLS0tLS0tLS0tCisKK05vdyB3ZSBhcmUgcmVhZHkgdG8gZXhwZXJpbWVudCB3aXRoIHRoZSBtZXJnZSBieSBoYW5kLgorCitgZ2l0IG1lcmdlYCBjb21tYW5kLCB3aGVuIG1lcmdpbmcgdHdvIGJyYW5jaGVzLCB1c2VzIDMtd2F5IG1lcmdlCithbGdvcml0aG0uICBGaXJzdCwgaXQgZmluZHMgdGhlIGNvbW1vbiBhbmNlc3RvciBiZXR3ZWVuIHRoZW0uCitUaGUgY29tbWFuZCBpdCB1c2VzIGlzIGBnaXQtbWVyZ2UtYmFzZWA6CisKKy0tLS0tLS0tLS0tLQorJCBtYj0kKGdpdC1tZXJnZS1iYXNlIEhFQUQgbXlicmFuY2gpCistLS0tLS0tLS0tLS0KKworVGhlIGNvbW1hbmQgd3JpdGVzIHRoZSBjb21taXQgb2JqZWN0IG5hbWUgb2YgdGhlIGNvbW1vbiBhbmNlc3RvcgordG8gdGhlIHN0YW5kYXJkIG91dHB1dCwgc28gd2UgY2FwdHVyZWQgaXRzIG91dHB1dCB0byBhIHZhcmlhYmxlLAorYmVjYXVzZSB3ZSB3aWxsIGJlIHVzaW5nIGl0IGluIHRoZSBuZXh0IHN0ZXAuICBCeSB0aGUgd2F5LCB0aGUgY29tbW9uCithbmNlc3RvciBjb21taXQgaXMgdGhlICJOZXcgZGF5LiIgY29tbWl0IGluIHRoaXMgY2FzZS4gIFlvdSBjYW4KK3RlbGwgaXQgYnk6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQtbmFtZS1yZXYgJG1iCitteS1maXJzdC10YWcKKy0tLS0tLS0tLS0tLQorCitBZnRlciBmaW5kaW5nIG91dCBhIGNvbW1vbiBhbmNlc3RvciBjb21taXQsIHRoZSBzZWNvbmQgc3RlcCBpcwordGhpczoKKworLS0tLS0tLS0tLS0tCiskIGdpdC1yZWFkLXRyZWUgLW0gLXUgJG1iIEhFQUQgbXlicmFuY2gKKy0tLS0tLS0tLS0tLQorCitUaGlzIGlzIHRoZSBzYW1lIGBnaXQtcmVhZC10cmVlYCBjb21tYW5kIHdlIGhhdmUgYWxyZWFkeSBzZWVuLAorYnV0IGl0IHRha2VzIHRocmVlIHRyZWVzLCB1bmxpa2UgcHJldmlvdXMgZXhhbXBsZXMuICBUaGlzIHJlYWRzCit0aGUgY29udGVudHMgb2YgZWFjaCB0cmVlIGludG8gZGlmZmVyZW50ICdzdGFnZScgaW4gdGhlIGluZGV4CitmaWxlICh0aGUgZmlyc3QgdHJlZSBnb2VzIHRvIHN0YWdlIDEsIHRoZSBzZWNvbmQgdG8gc3RhZ2UgMiwKK2V0Yy4pLiAgQWZ0ZXIgcmVhZGluZyB0aHJlZSB0cmVlcyBpbnRvIHRocmVlIHN0YWdlcywgdGhlIHBhdGhzCit0aGF0IGFyZSB0aGUgc2FtZSBpbiBhbGwgdGhyZWUgc3RhZ2VzIGFyZSAnY29sbGFwc2VkJyBpbnRvIHN0YWdlCiswLiAgQWxzbyBwYXRocyB0aGF0IGFyZSB0aGUgc2FtZSBpbiB0d28gb2YgdGhyZWUgc3RhZ2VzIGFyZQorY29sbGFwc2VkIGludG8gc3RhZ2UgMCwgdGFraW5nIHRoZSBTSEExIGZyb20gZWl0aGVyIHN0YWdlIDIgb3IKK3N0YWdlIDMsIHdoaWNoZXZlciBpcyBkaWZmZXJlbnQgZnJvbSBzdGFnZSAxIChpLmUuIG9ubHkgb25lIHNpZGUKK2NoYW5nZWQgZnJvbSB0aGUgY29tbW9uIGFuY2VzdG9yKS4KKworQWZ0ZXIgJ2NvbGxhcHNpbmcnIG9wZXJhdGlvbiwgcGF0aHMgdGhhdCBhcmUgZGlmZmVyZW50IGluIHRocmVlCit0cmVlcyBhcmUgbGVmdCBpbiBub24temVybyBzdGFnZXMuICBBdCB0aGlzIHBvaW50LCB5b3UgY2FuCitpbnNwZWN0IHRoZSBpbmRleCBmaWxlIHdpdGggdGhpcyBjb21tYW5kOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UKKzEwMDY0NCA3ZjhiMTQxYjY1ZmRjZWU0NzMyMWUzOTlhMjU5OGEyMzVhMDMyNDIyIDAJZXhhbXBsZQorMTAwNjQ0IDI2MzQxNGY0MjNkMGU0ZDcwZGFlOGZlNTNmYTM0NjE0ZmYzZTI4NjAgMQloZWxsbworMTAwNjQ0IDA2ZmE2YTI0MjU2ZGM3ZTU2MGVmYTU2ODdmYTg0YjUxZjAyNjNjM2EgMgloZWxsbworMTAwNjQ0IGNjNDRjNzNlYjc4MzU2NWRhNTgzMWI0ZDgyMGM5NjI5NTQwMTliNjkgMwloZWxsbworLS0tLS0tLS0tLS0tCisKK0luIG91ciBleGFtcGxlIG9mIG9ubHkgdHdvIGZpbGVzLCB3ZSBkaWQgbm90IGhhdmUgdW5jaGFuZ2VkCitmaWxlcyBzbyBvbmx5ICdleGFtcGxlJyByZXN1bHRlZCBpbiBjb2xsYXBzaW5nLCBidXQgaW4gcmVhbC1saWZlCitsYXJnZSBwcm9qZWN0cywgb25seSBzbWFsbCBudW1iZXIgb2YgZmlsZXMgY2hhbmdlIGluIG9uZSBjb21taXQsCithbmQgdGhpcyAnY29sbGFwc2luZycgdGVuZHMgdG8gdHJpdmlhbGx5IG1lcmdlIG1vc3Qgb2YgdGhlIHBhdGhzCitmYWlybHkgcXVpY2tseSwgbGVhdmluZyBvbmx5IGEgaGFuZGZ1bCB0aGUgcmVhbCBjaGFuZ2VzIGluIG5vbi16ZXJvCitzdGFnZXMuCisKK1RvIGxvb2sgYXQgb25seSBub24temVybyBzdGFnZXMsIHVzZSBgXC0tdW5tZXJnZWRgIGZsYWc6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQtbHMtZmlsZXMgLS11bm1lcmdlZAorMTAwNjQ0IDI2MzQxNGY0MjNkMGU0ZDcwZGFlOGZlNTNmYTM0NjE0ZmYzZTI4NjAgMQloZWxsbworMTAwNjQ0IDA2ZmE2YTI0MjU2ZGM3ZTU2MGVmYTU2ODdmYTg0YjUxZjAyNjNjM2EgMgloZWxsbworMTAwNjQ0IGNjNDRjNzNlYjc4MzU2NWRhNTgzMWI0ZDgyMGM5NjI5NTQwMTliNjkgMwloZWxsbworLS0tLS0tLS0tLS0tCisKK1RoZSBuZXh0IHN0ZXAgb2YgbWVyZ2luZyBpcyB0byBtZXJnZSB0aGVzZSB0aHJlZSB2ZXJzaW9ucyBvZiB0aGUKK2ZpbGUsIHVzaW5nIDMtd2F5IG1lcmdlLiAgVGhpcyBpcyBkb25lIGJ5IGdpdmluZworYGdpdC1tZXJnZS1vbmUtZmlsZWAgY29tbWFuZCBhcyBvbmUgb2YgdGhlIGFyZ3VtZW50cyB0bworYGdpdC1tZXJnZS1pbmRleGAgY29tbWFuZDoKKworLS0tLS0tLS0tLS0tCiskIGdpdC1tZXJnZS1pbmRleCBnaXQtbWVyZ2Utb25lLWZpbGUgaGVsbG8KK0F1dG8tbWVyZ2luZyBoZWxsby4KK21lcmdlOiB3YXJuaW5nOiBjb25mbGljdHMgZHVyaW5nIG1lcmdlCitFUlJPUjogTWVyZ2UgY29uZmxpY3QgaW4gaGVsbG8uCitmYXRhbDogbWVyZ2UgcHJvZ3JhbSBmYWlsZWQKKy0tLS0tLS0tLS0tLQorCitgZ2l0LW1lcmdlLW9uZS1maWxlYCBzY3JpcHQgaXMgY2FsbGVkIHdpdGggcGFyYW1ldGVycyB0bworZGVzY3JpYmUgdGhvc2UgdGhyZWUgdmVyc2lvbnMsIGFuZCBpcyByZXNwb25zaWJsZSB0byBsZWF2ZSB0aGUKK21lcmdlIHJlc3VsdHMgaW4gdGhlIHdvcmtpbmcgdHJlZS4KK0l0IGlzIGEgZmFpcmx5IHN0cmFpZ2h0Zm9yd2FyZCBzaGVsbCBzY3JpcHQsIGFuZAorZXZlbnR1YWxseSBjYWxscyBgbWVyZ2VgIHByb2dyYW0gZnJvbSBSQ1Mgc3VpdGUgdG8gcGVyZm9ybSBhCitmaWxlLWxldmVsIDMtd2F5IG1lcmdlLiAgSW4gdGhpcyBjYXNlLCBgbWVyZ2VgIGRldGVjdHMKK2NvbmZsaWN0cywgYW5kIHRoZSBtZXJnZSByZXN1bHQgd2l0aCBjb25mbGljdCBtYXJrcyBpcyBsZWZ0IGluCit0aGUgd29ya2luZyB0cmVlLi4gIFRoaXMgY2FuIGJlIHNlZW4gaWYgeW91IHJ1biBgbHMtZmlsZXMKKy0tc3RhZ2VgIGFnYWluIGF0IHRoaXMgcG9pbnQ6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQtbHMtZmlsZXMgLS1zdGFnZQorMTAwNjQ0IDdmOGIxNDFiNjVmZGNlZTQ3MzIxZTM5OWEyNTk4YTIzNWEwMzI0MjIgMAlleGFtcGxlCisxMDA2NDQgMjYzNDE0ZjQyM2QwZTRkNzBkYWU4ZmU1M2ZhMzQ2MTRmZjNlMjg2MCAxCWhlbGxvCisxMDA2NDQgMDZmYTZhMjQyNTZkYzdlNTYwZWZhNTY4N2ZhODRiNTFmMDI2M2MzYSAyCWhlbGxvCisxMDA2NDQgY2M0NGM3M2ViNzgzNTY1ZGE1ODMxYjRkODIwYzk2Mjk1NDAxOWI2OSAzCWhlbGxvCistLS0tLS0tLS0tLS0KKworVGhpcyBpcyB0aGUgc3RhdGUgb2YgdGhlIGluZGV4IGZpbGUgYW5kIHRoZSB3b3JraW5nIGZpbGUgYWZ0ZXIKK2BnaXQgbWVyZ2VgIHJldHVybnMgY29udHJvbCBiYWNrIHRvIHlvdSwgbGVhdmluZyB0aGUgY29uZmxpY3RpbmcKK21lcmdlIGZvciB5b3UgdG8gcmVzb2x2ZS4gIE5vdGljZSB0aGF0IHRoZSBwYXRoIGBoZWxsb2AgaXMgc3RpbGwKK3VubWVyZ2VkLCBhbmQgd2hhdCB5b3Ugc2VlIHdpdGggYGdpdCBkaWZmYCBhdCB0aGlzIHBvaW50IGlzCitkaWZmZXJlbmNlcyBzaW5jZSBzdGFnZSAyIChpLmUuIHlvdXIgdmVyc2lvbikuCisKKworUHVibGlzaGluZyB5b3VyIHdvcmsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NvLCB3ZSBjYW4gdXNlIHNvbWVib2R5IGVsc2UncyB3b3JrIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeSwgYnV0Citob3cgY2FuICp5b3UqIHByZXBhcmUgYSByZXBvc2l0b3J5IHRvIGxldCBvdGhlciBwZW9wbGUgcHVsbCBmcm9tCitpdD8KKworWW91IGRvIHlvdXIgcmVhbCB3b3JrIGluIHlvdXIgd29ya2luZyB0cmVlIHRoYXQgaGFzIHlvdXIKK3ByaW1hcnkgcmVwb3NpdG9yeSBoYW5naW5nIHVuZGVyIGl0IGFzIGl0cyBgLmdpdGAgc3ViZGlyZWN0b3J5LgorWW91ICpjb3VsZCogbWFrZSB0aGF0IHJlcG9zaXRvcnkgYWNjZXNzaWJsZSByZW1vdGVseSBhbmQgYXNrCitwZW9wbGUgdG8gcHVsbCBmcm9tIGl0LCBidXQgaW4gcHJhY3RpY2UgdGhhdCBpcyBub3QgdGhlIHdheQordGhpbmdzIGFyZSB1c3VhbGx5IGRvbmUuIEEgcmVjb21tZW5kZWQgd2F5IGlzIHRvIGhhdmUgYSBwdWJsaWMKK3JlcG9zaXRvcnksIG1ha2UgaXQgcmVhY2hhYmxlIGJ5IG90aGVyIHBlb3BsZSwgYW5kIHdoZW4gdGhlCitjaGFuZ2VzIHlvdSBtYWRlIGluIHlvdXIgcHJpbWFyeSB3b3JraW5nIHRyZWUgYXJlIGluIGdvb2Qgc2hhcGUsCit1cGRhdGUgdGhlIHB1YmxpYyByZXBvc2l0b3J5IGZyb20gaXQuIFRoaXMgaXMgb2Z0ZW4gY2FsbGVkCisncHVzaGluZycuCisKK1tOT1RFXQorVGhpcyBwdWJsaWMgcmVwb3NpdG9yeSBjb3VsZCBmdXJ0aGVyIGJlIG1pcnJvcmVkLCBhbmQgdGhhdCBpcworaG93IGdpdCByZXBvc2l0b3JpZXMgYXQgYGtlcm5lbC5vcmdgIGFyZSBtYW5hZ2VkLgorCitQdWJsaXNoaW5nIHRoZSBjaGFuZ2VzIGZyb20geW91ciBsb2NhbCAocHJpdmF0ZSkgcmVwb3NpdG9yeSB0bworeW91ciByZW1vdGUgKHB1YmxpYykgcmVwb3NpdG9yeSByZXF1aXJlcyBhIHdyaXRlIHByaXZpbGVnZSBvbgordGhlIHJlbW90ZSBtYWNoaW5lLiBZb3UgbmVlZCB0byBoYXZlIGFuIFNTSCBhY2NvdW50IHRoZXJlIHRvCitydW4gYSBzaW5nbGUgY29tbWFuZCwgYGdpdC1yZWNlaXZlLXBhY2tgLgorCitGaXJzdCwgeW91IG5lZWQgdG8gY3JlYXRlIGFuIGVtcHR5IHJlcG9zaXRvcnkgb24gdGhlIHJlbW90ZQorbWFjaGluZSB0aGF0IHdpbGwgaG91c2UgeW91ciBwdWJsaWMgcmVwb3NpdG9yeS4gVGhpcyBlbXB0eQorcmVwb3NpdG9yeSB3aWxsIGJlIHBvcHVsYXRlZCBhbmQgYmUga2VwdCB1cC10by1kYXRlIGJ5IHB1c2hpbmcKK2ludG8gaXQgbGF0ZXIuIE9idmlvdXNseSwgdGhpcyByZXBvc2l0b3J5IGNyZWF0aW9uIG5lZWRzIHRvIGJlCitkb25lIG9ubHkgb25jZS4KKworW05PVEVdCitgZ2l0IHB1c2hgIHVzZXMgYSBwYWlyIG9mIHByb2dyYW1zLAorYGdpdC1zZW5kLXBhY2tgIG9uIHlvdXIgbG9jYWwgbWFjaGluZSwgYW5kIGBnaXQtcmVjZWl2ZS1wYWNrYAorb24gdGhlIHJlbW90ZSBtYWNoaW5lLiBUaGUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSB0d28gb3ZlcgordGhlIG5ldHdvcmsgaW50ZXJuYWxseSB1c2VzIGFuIFNTSCBjb25uZWN0aW9uLgorCitZb3VyIHByaXZhdGUgcmVwb3NpdG9yeSdzIGdpdCBkaXJlY3RvcnkgaXMgdXN1YWxseSBgLmdpdGAsIGJ1dAoreW91ciBwdWJsaWMgcmVwb3NpdG9yeSBpcyBvZnRlbiBuYW1lZCBhZnRlciB0aGUgcHJvamVjdCBuYW1lLAoraS5lLiBgPHByb2plY3Q+LmdpdGAuIExldCdzIGNyZWF0ZSBzdWNoIGEgcHVibGljIHJlcG9zaXRvcnkgZm9yCitwcm9qZWN0IGBteS1naXRgLiBBZnRlciBsb2dnaW5nIGludG8gdGhlIHJlbW90ZSBtYWNoaW5lLCBjcmVhdGUKK2FuIGVtcHR5IGRpcmVjdG9yeToKKworLS0tLS0tLS0tLS0tCiskIG1rZGlyIG15LWdpdC5naXQKKy0tLS0tLS0tLS0tLQorCitUaGVuLCBtYWtlIHRoYXQgZGlyZWN0b3J5IGludG8gYSBnaXQgcmVwb3NpdG9yeSBieSBydW5uaW5nCitgZ2l0IGluaXRgLCBidXQgdGhpcyB0aW1lLCBzaW5jZSBpdHMgbmFtZSBpcyBub3QgdGhlIHVzdWFsCitgLmdpdGAsIHdlIGRvIHRoaW5ncyBzbGlnaHRseSBkaWZmZXJlbnRseToKKworLS0tLS0tLS0tLS0tCiskIEdJVF9ESVI9bXktZ2l0LmdpdCBnaXQtaW5pdAorLS0tLS0tLS0tLS0tCisKK01ha2Ugc3VyZSB0aGlzIGRpcmVjdG9yeSBpcyBhdmFpbGFibGUgZm9yIG90aGVycyB5b3Ugd2FudCB5b3VyCitjaGFuZ2VzIHRvIGJlIHB1bGxlZCBieSB2aWEgdGhlIHRyYW5zcG9ydCBvZiB5b3VyIGNob2ljZS4gQWxzbworeW91IG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgdGhlIGBnaXQtcmVjZWl2ZS1wYWNrYAorcHJvZ3JhbSBvbiB0aGUgYCRQQVRIYC4KKworW05PVEVdCitNYW55IGluc3RhbGxhdGlvbnMgb2Ygc3NoZCBkbyBub3QgaW52b2tlIHlvdXIgc2hlbGwgYXMgdGhlIGxvZ2luCitzaGVsbCB3aGVuIHlvdSBkaXJlY3RseSBydW4gcHJvZ3JhbXM7IHdoYXQgdGhpcyBtZWFucyBpcyB0aGF0IGlmCit5b3VyIGxvZ2luIHNoZWxsIGlzIGBiYXNoYCwgb25seSBgLmJhc2hyY2AgaXMgcmVhZCBhbmQgbm90CitgLmJhc2hfcHJvZmlsZWAuIEFzIGEgd29ya2Fyb3VuZCwgbWFrZSBzdXJlIGAuYmFzaHJjYCBzZXRzIHVwCitgJFBBVEhgIHNvIHRoYXQgeW91IGNhbiBydW4gYGdpdC1yZWNlaXZlLXBhY2tgIHByb2dyYW0uCisKK1tOT1RFXQorSWYgeW91IHBsYW4gdG8gcHVibGlzaCB0aGlzIHJlcG9zaXRvcnkgdG8gYmUgYWNjZXNzZWQgb3ZlciBodHRwLAoreW91IHNob3VsZCBkbyBgY2htb2QgK3ggbXktZ2l0LmdpdC9ob29rcy9wb3N0LXVwZGF0ZWAgYXQgdGhpcworcG9pbnQuICBUaGlzIG1ha2VzIHN1cmUgdGhhdCBldmVyeSB0aW1lIHlvdSBwdXNoIGludG8gdGhpcworcmVwb3NpdG9yeSwgYGdpdC11cGRhdGUtc2VydmVyLWluZm9gIGlzIHJ1bi4KKworWW91ciAicHVibGljIHJlcG9zaXRvcnkiIGlzIG5vdyByZWFkeSB0byBhY2NlcHQgeW91ciBjaGFuZ2VzLgorQ29tZSBiYWNrIHRvIHRoZSBtYWNoaW5lIHlvdSBoYXZlIHlvdXIgcHJpdmF0ZSByZXBvc2l0b3J5LiBGcm9tCit0aGVyZSwgcnVuIHRoaXMgY29tbWFuZDoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBwdXNoIDxwdWJsaWMtaG9zdD46L3BhdGgvdG8vbXktZ2l0LmdpdCBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCitUaGlzIHN5bmNocm9uaXplcyB5b3VyIHB1YmxpYyByZXBvc2l0b3J5IHRvIG1hdGNoIHRoZSBuYW1lZAorYnJhbmNoIGhlYWQgKGkuZS4gYG1hc3RlcmAgaW4gdGhpcyBjYXNlKSBhbmQgb2JqZWN0cyByZWFjaGFibGUKK2Zyb20gdGhlbSBpbiB5b3VyIGN1cnJlbnQgcmVwb3NpdG9yeS4KKworQXMgYSByZWFsIGV4YW1wbGUsIHRoaXMgaXMgaG93IEkgdXBkYXRlIG15IHB1YmxpYyBnaXQKK3JlcG9zaXRvcnkuIEtlcm5lbC5vcmcgbWlycm9yIG5ldHdvcmsgdGFrZXMgY2FyZSBvZiB0aGUKK3Byb3BhZ2F0aW9uIHRvIG90aGVyIHB1YmxpY2x5IHZpc2libGUgbWFjaGluZXM6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgcHVzaCBtYXN0ZXIua2VybmVsLm9yZzovcHViL3NjbS9naXQvZ2l0LmdpdC8KKy0tLS0tLS0tLS0tLQorCisKK1BhY2tpbmcgeW91ciByZXBvc2l0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFYXJsaWVyLCB3ZSBzYXcgdGhhdCBvbmUgZmlsZSB1bmRlciBgLmdpdC9vYmplY3RzLz8/L2AgZGlyZWN0b3J5CitpcyBzdG9yZWQgZm9yIGVhY2ggZ2l0IG9iamVjdCB5b3UgY3JlYXRlLiBUaGlzIHJlcHJlc2VudGF0aW9uCitpcyBlZmZpY2llbnQgdG8gY3JlYXRlIGF0b21pY2FsbHkgYW5kIHNhZmVseSwgYnV0Citub3Qgc28gY29udmVuaWVudCB0byB0cmFuc3BvcnQgb3ZlciB0aGUgbmV0d29yay4gU2luY2UgZ2l0IG9iamVjdHMgYXJlCitpbW11dGFibGUgb25jZSB0aGV5IGFyZSBjcmVhdGVkLCB0aGVyZSBpcyBhIHdheSB0byBvcHRpbWl6ZSB0aGUKK3N0b3JhZ2UgYnkgInBhY2tpbmcgdGhlbSB0b2dldGhlciIuIFRoZSBjb21tYW5kCisKKy0tLS0tLS0tLS0tLQorJCBnaXQgcmVwYWNrCistLS0tLS0tLS0tLS0KKword2lsbCBkbyBpdCBmb3IgeW91LiBJZiB5b3UgZm9sbG93ZWQgdGhlIHR1dG9yaWFsIGV4YW1wbGVzLCB5b3UKK3dvdWxkIGhhdmUgYWNjdW11bGF0ZWQgYWJvdXQgMTcgb2JqZWN0cyBpbiBgLmdpdC9vYmplY3RzLz8/L2AKK2RpcmVjdG9yaWVzIGJ5IG5vdy4gYGdpdCByZXBhY2tgIHRlbGxzIHlvdSBob3cgbWFueSBvYmplY3RzIGl0CitwYWNrZWQsIGFuZCBzdG9yZXMgdGhlIHBhY2tlZCBmaWxlIGluIGAuZ2l0L29iamVjdHMvcGFja2AKK2RpcmVjdG9yeS4KKworW05PVEVdCitZb3Ugd2lsbCBzZWUgdHdvIGZpbGVzLCBgcGFjay1cKi5wYWNrYCBhbmQgYHBhY2stXCouaWR4YCwKK2luIGAuZ2l0L29iamVjdHMvcGFja2AgZGlyZWN0b3J5LiBUaGV5IGFyZSBjbG9zZWx5IHJlbGF0ZWQgdG8KK2VhY2ggb3RoZXIsIGFuZCBpZiB5b3UgZXZlciBjb3B5IHRoZW0gYnkgaGFuZCB0byBhIGRpZmZlcmVudAorcmVwb3NpdG9yeSBmb3Igd2hhdGV2ZXIgcmVhc29uLCB5b3Ugc2hvdWxkIG1ha2Ugc3VyZSB5b3UgY29weQordGhlbSB0b2dldGhlci4gVGhlIGZvcm1lciBob2xkcyBhbGwgdGhlIGRhdGEgZnJvbSB0aGUgb2JqZWN0cworaW4gdGhlIHBhY2ssIGFuZCB0aGUgbGF0dGVyIGhvbGRzIHRoZSBpbmRleCBmb3IgcmFuZG9tCithY2Nlc3MuCisKK0lmIHlvdSBhcmUgcGFyYW5vaWQsIHJ1bm5pbmcgYGdpdC12ZXJpZnktcGFja2AgY29tbWFuZCB3b3VsZAorZGV0ZWN0IGlmIHlvdSBoYXZlIGEgY29ycnVwdCBwYWNrLCBidXQgZG8gbm90IHdvcnJ5IHRvbyBtdWNoLgorT3VyIHByb2dyYW1zIGFyZSBhbHdheXMgcGVyZmVjdCA7LSkuCisKK09uY2UgeW91IGhhdmUgcGFja2VkIG9iamVjdHMsIHlvdSBkbyBub3QgbmVlZCB0byBsZWF2ZSB0aGUKK3VucGFja2VkIG9iamVjdHMgdGhhdCBhcmUgY29udGFpbmVkIGluIHRoZSBwYWNrIGZpbGUgYW55bW9yZS4KKworLS0tLS0tLS0tLS0tCiskIGdpdCBwcnVuZS1wYWNrZWQKKy0tLS0tLS0tLS0tLQorCit3b3VsZCByZW1vdmUgdGhlbSBmb3IgeW91LgorCitZb3UgY2FuIHRyeSBydW5uaW5nIGBmaW5kIC5naXQvb2JqZWN0cyAtdHlwZSBmYCBiZWZvcmUgYW5kIGFmdGVyCit5b3UgcnVuIGBnaXQgcHJ1bmUtcGFja2VkYCBpZiB5b3UgYXJlIGN1cmlvdXMuICBBbHNvIGBnaXQKK2NvdW50LW9iamVjdHNgIHdvdWxkIHRlbGwgeW91IGhvdyBtYW55IHVucGFja2VkIG9iamVjdHMgYXJlIGluCit5b3VyIHJlcG9zaXRvcnkgYW5kIGhvdyBtdWNoIHNwYWNlIHRoZXkgYXJlIGNvbnN1bWluZy4KKworW05PVEVdCitgZ2l0IHB1bGxgIGlzIHNsaWdodGx5IGN1bWJlcnNvbWUgZm9yIEhUVFAgdHJhbnNwb3J0LCBhcyBhCitwYWNrZWQgcmVwb3NpdG9yeSBtYXkgY29udGFpbiByZWxhdGl2ZWx5IGZldyBvYmplY3RzIGluIGEKK3JlbGF0aXZlbHkgbGFyZ2UgcGFjay4gSWYgeW91IGV4cGVjdCBtYW55IEhUVFAgcHVsbHMgZnJvbSB5b3VyCitwdWJsaWMgcmVwb3NpdG9yeSB5b3UgbWlnaHQgd2FudCB0byByZXBhY2sgJiBwcnVuZSBvZnRlbiwgb3IKK25ldmVyLgorCitJZiB5b3UgcnVuIGBnaXQgcmVwYWNrYCBhZ2FpbiBhdCB0aGlzIHBvaW50LCBpdCB3aWxsIHNheQorIk5vdGhpbmcgdG8gcGFjayIuIE9uY2UgeW91IGNvbnRpbnVlIHlvdXIgZGV2ZWxvcG1lbnQgYW5kCithY2N1bXVsYXRlIHRoZSBjaGFuZ2VzLCBydW5uaW5nIGBnaXQgcmVwYWNrYCBhZ2FpbiB3aWxsIGNyZWF0ZSBhCituZXcgcGFjaywgdGhhdCBjb250YWlucyBvYmplY3RzIGNyZWF0ZWQgc2luY2UgeW91IHBhY2tlZCB5b3VyCityZXBvc2l0b3J5IHRoZSBsYXN0IHRpbWUuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSBwYWNrIHlvdXIgcHJvamVjdAorc29vbiBhZnRlciB0aGUgaW5pdGlhbCBpbXBvcnQgKHVubGVzcyB5b3UgYXJlIHN0YXJ0aW5nIHlvdXIKK3Byb2plY3QgZnJvbSBzY3JhdGNoKSwgYW5kIHRoZW4gcnVuIGBnaXQgcmVwYWNrYCBldmVyeSBvbmNlIGluIGEKK3doaWxlLCBkZXBlbmRpbmcgb24gaG93IGFjdGl2ZSB5b3VyIHByb2plY3QgaXMuCisKK1doZW4gYSByZXBvc2l0b3J5IGlzIHN5bmNocm9uaXplZCB2aWEgYGdpdCBwdXNoYCBhbmQgYGdpdCBwdWxsYAorb2JqZWN0cyBwYWNrZWQgaW4gdGhlIHNvdXJjZSByZXBvc2l0b3J5IGFyZSB1c3VhbGx5IHN0b3JlZAordW5wYWNrZWQgaW4gdGhlIGRlc3RpbmF0aW9uLCB1bmxlc3MgcnN5bmMgdHJhbnNwb3J0IGlzIHVzZWQuCitXaGlsZSB0aGlzIGFsbG93cyB5b3UgdG8gdXNlIGRpZmZlcmVudCBwYWNraW5nIHN0cmF0ZWdpZXMgb24KK2JvdGggZW5kcywgaXQgYWxzbyBtZWFucyB5b3UgbWF5IG5lZWQgdG8gcmVwYWNrIGJvdGgKK3JlcG9zaXRvcmllcyBldmVyeSBvbmNlIGluIGEgd2hpbGUuCisKKworV29ya2luZyB3aXRoIE90aGVycworLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbHRob3VnaCBnaXQgaXMgYSB0cnVseSBkaXN0cmlidXRlZCBzeXN0ZW0sIGl0IGlzIG9mdGVuCitjb252ZW5pZW50IHRvIG9yZ2FuaXplIHlvdXIgcHJvamVjdCB3aXRoIGFuIGluZm9ybWFsIGhpZXJhcmNoeQorb2YgZGV2ZWxvcGVycy4gTGludXgga2VybmVsIGRldmVsb3BtZW50IGlzIHJ1biB0aGlzIHdheS4gVGhlcmUKK2lzIGEgbmljZSBpbGx1c3RyYXRpb24gKHBhZ2UgMTcsICJNZXJnZXMgdG8gTWFpbmxpbmUiKSBpbgorbGluazpodHRwOi8vd3d3Lnhlbm90aW1lLm5ldC9saW51eC9tZW50b3IvbGludXgtbWVudG9yaW5nLTIwMDYucGRmW1JhbmR5IER1bmxhcCdzIHByZXNlbnRhdGlvbl0uCisKK0l0IHNob3VsZCBiZSBzdHJlc3NlZCB0aGF0IHRoaXMgaGllcmFyY2h5IGlzIHB1cmVseSAqaW5mb3JtYWwqLgorVGhlcmUgaXMgbm90aGluZyBmdW5kYW1lbnRhbCBpbiBnaXQgdGhhdCBlbmZvcmNlcyB0aGUgImNoYWluIG9mCitwYXRjaCBmbG93IiB0aGlzIGhpZXJhcmNoeSBpbXBsaWVzLiBZb3UgZG8gbm90IGhhdmUgdG8gcHVsbAorZnJvbSBvbmx5IG9uZSByZW1vdGUgcmVwb3NpdG9yeS4KKworQSByZWNvbW1lbmRlZCB3b3JrZmxvdyBmb3IgYSAicHJvamVjdCBsZWFkIiBnb2VzIGxpa2UgdGhpczoKKworMS4gUHJlcGFyZSB5b3VyIHByaW1hcnkgcmVwb3NpdG9yeSBvbiB5b3VyIGxvY2FsIG1hY2hpbmUuIFlvdXIKKyAgIHdvcmsgaXMgZG9uZSB0aGVyZS4KKworMi4gUHJlcGFyZSBhIHB1YmxpYyByZXBvc2l0b3J5IGFjY2Vzc2libGUgdG8gb3RoZXJzLgorKworSWYgb3RoZXIgcGVvcGxlIGFyZSBwdWxsaW5nIGZyb20geW91ciByZXBvc2l0b3J5IG92ZXIgZHVtYgordHJhbnNwb3J0IHByb3RvY29scyAoSFRUUCksIHlvdSBuZWVkIHRvIGtlZXAgdGhpcyByZXBvc2l0b3J5CisnZHVtYiB0cmFuc3BvcnQgZnJpZW5kbHknLiAgQWZ0ZXIgYGdpdCBpbml0YCwKK2AkR0lUX0RJUi9ob29rcy9wb3N0LXVwZGF0ZWAgY29waWVkIGZyb20gdGhlIHN0YW5kYXJkIHRlbXBsYXRlcword291bGQgY29udGFpbiBhIGNhbGwgdG8gYGdpdC11cGRhdGUtc2VydmVyLWluZm9gIGJ1dCB0aGUKK2Bwb3N0LXVwZGF0ZWAgaG9vayBpdHNlbGYgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCAtLSBlbmFibGUgaXQKK3dpdGggYGNobW9kICt4IHBvc3QtdXBkYXRlYC4gIFRoaXMgbWFrZXMgc3VyZSBgZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mb2AKK2tlZXBzIHRoZSBuZWNlc3NhcnkgZmlsZXMgdXAtdG8tZGF0ZS4KKworMy4gUHVzaCBpbnRvIHRoZSBwdWJsaWMgcmVwb3NpdG9yeSBmcm9tIHlvdXIgcHJpbWFyeQorICAgcmVwb3NpdG9yeS4KKworNC4gYGdpdCByZXBhY2tgIHRoZSBwdWJsaWMgcmVwb3NpdG9yeS4gVGhpcyBlc3RhYmxpc2hlcyBhIGJpZworICAgcGFjayB0aGF0IGNvbnRhaW5zIHRoZSBpbml0aWFsIHNldCBvZiBvYmplY3RzIGFzIHRoZQorICAgYmFzZWxpbmUsIGFuZCBwb3NzaWJseSBgZ2l0IHBydW5lYCBpZiB0aGUgdHJhbnNwb3J0CisgICB1c2VkIGZvciBwdWxsaW5nIGZyb20geW91ciByZXBvc2l0b3J5IHN1cHBvcnRzIHBhY2tlZAorICAgcmVwb3NpdG9yaWVzLgorCis1LiBLZWVwIHdvcmtpbmcgaW4geW91ciBwcmltYXJ5IHJlcG9zaXRvcnkuIFlvdXIgY2hhbmdlcworICAgaW5jbHVkZSBtb2RpZmljYXRpb25zIG9mIHlvdXIgb3duLCBwYXRjaGVzIHlvdSByZWNlaXZlIHZpYQorICAgZS1tYWlscywgYW5kIG1lcmdlcyByZXN1bHRpbmcgZnJvbSBwdWxsaW5nIHRoZSAicHVibGljIgorICAgcmVwb3NpdG9yaWVzIG9mIHlvdXIgInN1YnN5c3RlbSBtYWludGFpbmVycyIuCisrCitZb3UgY2FuIHJlcGFjayB0aGlzIHByaXZhdGUgcmVwb3NpdG9yeSB3aGVuZXZlciB5b3UgZmVlbCBsaWtlLgorCis2LiBQdXNoIHlvdXIgY2hhbmdlcyB0byB0aGUgcHVibGljIHJlcG9zaXRvcnksIGFuZCBhbm5vdW5jZSBpdAorICAgdG8gdGhlIHB1YmxpYy4KKworNy4gRXZlcnkgb25jZSBpbiBhIHdoaWxlLCAiZ2l0IHJlcGFjayIgdGhlIHB1YmxpYyByZXBvc2l0b3J5LgorICAgR28gYmFjayB0byBzdGVwIDUuIGFuZCBjb250aW51ZSB3b3JraW5nLgorCisKK0EgcmVjb21tZW5kZWQgd29yayBjeWNsZSBmb3IgYSAic3Vic3lzdGVtIG1haW50YWluZXIiIHdobyB3b3Jrcworb24gdGhhdCBwcm9qZWN0IGFuZCBoYXMgYW4gb3duICJwdWJsaWMgcmVwb3NpdG9yeSIgZ29lcyBsaWtlIHRoaXM6CisKKzEuIFByZXBhcmUgeW91ciB3b3JrIHJlcG9zaXRvcnksIGJ5IGBnaXQgY2xvbmVgIHRoZSBwdWJsaWMKKyAgIHJlcG9zaXRvcnkgb2YgdGhlICJwcm9qZWN0IGxlYWQiLiBUaGUgVVJMIHVzZWQgZm9yIHRoZQorICAgaW5pdGlhbCBjbG9uaW5nIGlzIHN0b3JlZCBpbiB0aGUgcmVtb3RlLm9yaWdpbi51cmwKKyAgIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUuCisKKzIuIFByZXBhcmUgYSBwdWJsaWMgcmVwb3NpdG9yeSBhY2Nlc3NpYmxlIHRvIG90aGVycywganVzdCBsaWtlCisgICB0aGUgInByb2plY3QgbGVhZCIgcGVyc29uIGRvZXMuCisKKzMuIENvcHkgb3ZlciB0aGUgcGFja2VkIGZpbGVzIGZyb20gInByb2plY3QgbGVhZCIgcHVibGljCisgICByZXBvc2l0b3J5IHRvIHlvdXIgcHVibGljIHJlcG9zaXRvcnksIHVubGVzcyB0aGUgInByb2plY3QKKyAgIGxlYWQiIHJlcG9zaXRvcnkgbGl2ZXMgb24gdGhlIHNhbWUgbWFjaGluZSBhcyB5b3Vycy4gIEluIHRoZQorICAgbGF0dGVyIGNhc2UsIHlvdSBjYW4gdXNlIGBvYmplY3RzL2luZm8vYWx0ZXJuYXRlc2AgZmlsZSB0bworICAgcG9pbnQgYXQgdGhlIHJlcG9zaXRvcnkgeW91IGFyZSBib3Jyb3dpbmcgZnJvbS4KKworNC4gUHVzaCBpbnRvIHRoZSBwdWJsaWMgcmVwb3NpdG9yeSBmcm9tIHlvdXIgcHJpbWFyeQorICAgcmVwb3NpdG9yeS4gUnVuIGBnaXQgcmVwYWNrYCwgYW5kIHBvc3NpYmx5IGBnaXQgcHJ1bmVgIGlmIHRoZQorICAgdHJhbnNwb3J0IHVzZWQgZm9yIHB1bGxpbmcgZnJvbSB5b3VyIHJlcG9zaXRvcnkgc3VwcG9ydHMKKyAgIHBhY2tlZCByZXBvc2l0b3JpZXMuCisKKzUuIEtlZXAgd29ya2luZyBpbiB5b3VyIHByaW1hcnkgcmVwb3NpdG9yeS4gWW91ciBjaGFuZ2VzCisgICBpbmNsdWRlIG1vZGlmaWNhdGlvbnMgb2YgeW91ciBvd24sIHBhdGNoZXMgeW91IHJlY2VpdmUgdmlhCisgICBlLW1haWxzLCBhbmQgbWVyZ2VzIHJlc3VsdGluZyBmcm9tIHB1bGxpbmcgdGhlICJwdWJsaWMiCisgICByZXBvc2l0b3JpZXMgb2YgeW91ciAicHJvamVjdCBsZWFkIiBhbmQgcG9zc2libHkgeW91cgorICAgInN1Yi1zdWJzeXN0ZW0gbWFpbnRhaW5lcnMiLgorKworWW91IGNhbiByZXBhY2sgdGhpcyBwcml2YXRlIHJlcG9zaXRvcnkgd2hlbmV2ZXIgeW91IGZlZWwKK2xpa2UuCisKKzYuIFB1c2ggeW91ciBjaGFuZ2VzIHRvIHlvdXIgcHVibGljIHJlcG9zaXRvcnksIGFuZCBhc2sgeW91cgorICAgInByb2plY3QgbGVhZCIgYW5kIHBvc3NpYmx5IHlvdXIgInN1Yi1zdWJzeXN0ZW0KKyAgIG1haW50YWluZXJzIiB0byBwdWxsIGZyb20gaXQuCisKKzcuIEV2ZXJ5IG9uY2UgaW4gYSB3aGlsZSwgYGdpdCByZXBhY2tgIHRoZSBwdWJsaWMgcmVwb3NpdG9yeS4KKyAgIEdvIGJhY2sgdG8gc3RlcCA1LiBhbmQgY29udGludWUgd29ya2luZy4KKworCitBIHJlY29tbWVuZGVkIHdvcmsgY3ljbGUgZm9yIGFuICJpbmRpdmlkdWFsIGRldmVsb3BlciIgd2hvIGRvZXMKK25vdCBoYXZlIGEgInB1YmxpYyIgcmVwb3NpdG9yeSBpcyBzb21ld2hhdCBkaWZmZXJlbnQuIEl0IGdvZXMKK2xpa2UgdGhpczoKKworMS4gUHJlcGFyZSB5b3VyIHdvcmsgcmVwb3NpdG9yeSwgYnkgYGdpdCBjbG9uZWAgdGhlIHB1YmxpYworICAgcmVwb3NpdG9yeSBvZiB0aGUgInByb2plY3QgbGVhZCIgKG9yIGEgInN1YnN5c3RlbQorICAgbWFpbnRhaW5lciIsIGlmIHlvdSB3b3JrIG9uIGEgc3Vic3lzdGVtKS4gVGhlIFVSTCB1c2VkIGZvcgorICAgdGhlIGluaXRpYWwgY2xvbmluZyBpcyBzdG9yZWQgaW4gdGhlIHJlbW90ZS5vcmlnaW4udXJsCisgICBjb25maWd1cmF0aW9uIHZhcmlhYmxlLgorCisyLiBEbyB5b3VyIHdvcmsgaW4geW91ciByZXBvc2l0b3J5IG9uICdtYXN0ZXInIGJyYW5jaC4KKworMy4gUnVuIGBnaXQgZmV0Y2ggb3JpZ2luYCBmcm9tIHRoZSBwdWJsaWMgcmVwb3NpdG9yeSBvZiB5b3VyCisgICB1cHN0cmVhbSBldmVyeSBvbmNlIGluIGEgd2hpbGUuIFRoaXMgZG9lcyBvbmx5IHRoZSBmaXJzdAorICAgaGFsZiBvZiBgZ2l0IHB1bGxgIGJ1dCBkb2VzIG5vdCBtZXJnZS4gVGhlIGhlYWQgb2YgdGhlCisgICBwdWJsaWMgcmVwb3NpdG9yeSBpcyBzdG9yZWQgaW4gYC5naXQvcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXJgLgorCis0LiBVc2UgYGdpdCBjaGVycnkgb3JpZ2luYCB0byBzZWUgd2hpY2ggb25lcyBvZiB5b3VyIHBhdGNoZXMKKyAgIHdlcmUgYWNjZXB0ZWQsIGFuZC9vciB1c2UgYGdpdCByZWJhc2Ugb3JpZ2luYCB0byBwb3J0IHlvdXIKKyAgIHVubWVyZ2VkIGNoYW5nZXMgZm9yd2FyZCB0byB0aGUgdXBkYXRlZCB1cHN0cmVhbS4KKworNS4gVXNlIGBnaXQgZm9ybWF0LXBhdGNoIG9yaWdpbmAgdG8gcHJlcGFyZSBwYXRjaGVzIGZvciBlLW1haWwKKyAgIHN1Ym1pc3Npb24gdG8geW91ciB1cHN0cmVhbSBhbmQgc2VuZCBpdCBvdXQuIEdvIGJhY2sgdG8KKyAgIHN0ZXAgMi4gYW5kIGNvbnRpbnVlLgorCisKK1dvcmtpbmcgd2l0aCBPdGhlcnMsIFNoYXJlZCBSZXBvc2l0b3J5IFN0eWxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiB5b3UgYXJlIGNvbWluZyBmcm9tIENWUyBiYWNrZ3JvdW5kLCB0aGUgc3R5bGUgb2YgY29vcGVyYXRpb24KK3N1Z2dlc3RlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiBtYXkgYmUgbmV3IHRvIHlvdS4gWW91IGRvIG5vdAoraGF2ZSB0byB3b3JyeS4gZ2l0IHN1cHBvcnRzICJzaGFyZWQgcHVibGljIHJlcG9zaXRvcnkiIHN0eWxlIG9mCitjb29wZXJhdGlvbiB5b3UgYXJlIHByb2JhYmx5IG1vcmUgZmFtaWxpYXIgd2l0aCBhcyB3ZWxsLgorCitTZWUgbGluazpjdnMtbWlncmF0aW9uLmh0bWxbZ2l0IGZvciBDVlMgdXNlcnNdIGZvciB0aGUgZGV0YWlscy4KKworQnVuZGxpbmcgeW91ciB3b3JrIHRvZ2V0aGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSXQgaXMgbGlrZWx5IHRoYXQgeW91IHdpbGwgYmUgd29ya2luZyBvbiBtb3JlIHRoYW4gb25lIHRoaW5nIGF0CithIHRpbWUuICBJdCBpcyBlYXN5IHRvIG1hbmFnZSB0aG9zZSBtb3JlLW9yLWxlc3MgaW5kZXBlbmRlbnQgdGFza3MKK3VzaW5nIGJyYW5jaGVzIHdpdGggZ2l0LgorCitXZSBoYXZlIGFscmVhZHkgc2VlbiBob3cgYnJhbmNoZXMgd29yayBwcmV2aW91c2x5LAord2l0aCAiZnVuIGFuZCB3b3JrIiBleGFtcGxlIHVzaW5nIHR3byBicmFuY2hlcy4gIFRoZSBpZGVhIGlzIHRoZQorc2FtZSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIHR3byBicmFuY2hlcy4gIExldCdzIHNheSB5b3Ugc3RhcnRlZAorb3V0IGZyb20gIm1hc3RlciIgaGVhZCwgYW5kIGhhdmUgc29tZSBuZXcgY29kZSBpbiB0aGUgIm1hc3RlciIKK2JyYW5jaCwgYW5kIHR3byBpbmRlcGVuZGVudCBmaXhlcyBpbiB0aGUgImNvbW1pdC1maXgiIGFuZAorImRpZmYtZml4IiBicmFuY2hlczoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93LWJyYW5jaAorISBbY29tbWl0LWZpeF0gRml4IGNvbW1pdCBtZXNzYWdlIG5vcm1hbGl6YXRpb24uCisgISBbZGlmZi1maXhdIEZpeCByZW5hbWUgZGV0ZWN0aW9uLgorICAqIFttYXN0ZXJdIFJlbGVhc2UgY2FuZGlkYXRlICMxCistLS0KKyArICBbZGlmZi1maXhdIEZpeCByZW5hbWUgZGV0ZWN0aW9uLgorICsgIFtkaWZmLWZpeH4xXSBCZXR0ZXIgY29tbW9uIHN1YnN0cmluZyBhbGdvcml0aG0uCisrICAgW2NvbW1pdC1maXhdIEZpeCBjb21taXQgbWVzc2FnZSBub3JtYWxpemF0aW9uLgorICAqIFttYXN0ZXJdIFJlbGVhc2UgY2FuZGlkYXRlICMxCisrKyogW2RpZmYtZml4fjJdIFByZXR0eS1wcmludCBtZXNzYWdlcy4KKy0tLS0tLS0tLS0tLQorCitCb3RoIGZpeGVzIGFyZSB0ZXN0ZWQgd2VsbCwgYW5kIGF0IHRoaXMgcG9pbnQsIHlvdSB3YW50IHRvIG1lcmdlCitpbiBib3RoIG9mIHRoZW0uICBZb3UgY291bGQgbWVyZ2UgaW4gJ2RpZmYtZml4JyBmaXJzdCBhbmQgdGhlbgorJ2NvbW1pdC1maXgnIG5leHQsIGxpa2UgdGhpczoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBtZXJnZSAtbSAiTWVyZ2UgZml4IGluIGRpZmYtZml4IiBkaWZmLWZpeAorJCBnaXQgbWVyZ2UgLW0gIk1lcmdlIGZpeCBpbiBjb21taXQtZml4IiBjb21taXQtZml4CistLS0tLS0tLS0tLS0KKworV2hpY2ggd291bGQgcmVzdWx0IGluOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3ctYnJhbmNoCishIFtjb21taXQtZml4XSBGaXggY29tbWl0IG1lc3NhZ2Ugbm9ybWFsaXphdGlvbi4KKyAhIFtkaWZmLWZpeF0gRml4IHJlbmFtZSBkZXRlY3Rpb24uCisgICogW21hc3Rlcl0gTWVyZ2UgZml4IGluIGNvbW1pdC1maXgKKy0tLQorICAtIFttYXN0ZXJdIE1lcmdlIGZpeCBpbiBjb21taXQtZml4CisrICogW2NvbW1pdC1maXhdIEZpeCBjb21taXQgbWVzc2FnZSBub3JtYWxpemF0aW9uLgorICAtIFttYXN0ZXJ+MV0gTWVyZ2UgZml4IGluIGRpZmYtZml4CisgKyogW2RpZmYtZml4XSBGaXggcmVuYW1lIGRldGVjdGlvbi4KKyArKiBbZGlmZi1maXh+MV0gQmV0dGVyIGNvbW1vbiBzdWJzdHJpbmcgYWxnb3JpdGhtLgorICAqIFttYXN0ZXJ+Ml0gUmVsZWFzZSBjYW5kaWRhdGUgIzEKKysrKiBbbWFzdGVyfjNdIFByZXR0eS1wcmludCBtZXNzYWdlcy4KKy0tLS0tLS0tLS0tLQorCitIb3dldmVyLCB0aGVyZSBpcyBubyBwYXJ0aWN1bGFyIHJlYXNvbiB0byBtZXJnZSBpbiBvbmUgYnJhbmNoCitmaXJzdCBhbmQgdGhlIG90aGVyIG5leHQsIHdoZW4gd2hhdCB5b3UgaGF2ZSBhcmUgYSBzZXQgb2YgdHJ1bHkKK2luZGVwZW5kZW50IGNoYW5nZXMgKGlmIHRoZSBvcmRlciBtYXR0ZXJlZCwgdGhlbiB0aGV5IGFyZSBub3QKK2luZGVwZW5kZW50IGJ5IGRlZmluaXRpb24pLiAgWW91IGNvdWxkIGluc3RlYWQgbWVyZ2UgdGhvc2UgdHdvCiticmFuY2hlcyBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaCBhdCBvbmNlLiAgRmlyc3QgbGV0J3MgdW5kbyB3aGF0Cit3ZSBqdXN0IGRpZCBhbmQgc3RhcnQgb3Zlci4gIFdlIHdvdWxkIHdhbnQgdG8gZ2V0IHRoZSBtYXN0ZXIKK2JyYW5jaCBiZWZvcmUgdGhlc2UgdHdvIG1lcmdlcyBieSByZXNldHRpbmcgaXQgdG8gJ21hc3Rlcn4yJzoKKworLS0tLS0tLS0tLS0tCiskIGdpdCByZXNldCAtLWhhcmQgbWFzdGVyfjIKKy0tLS0tLS0tLS0tLQorCitZb3UgY2FuIG1ha2Ugc3VyZSAnZ2l0IHNob3ctYnJhbmNoJyBtYXRjaGVzIHRoZSBzdGF0ZSBiZWZvcmUKK3Rob3NlIHR3byAnZ2l0IG1lcmdlJyB5b3UganVzdCBkaWQuICBUaGVuLCBpbnN0ZWFkIG9mIHJ1bm5pbmcKK3R3byAnZ2l0IG1lcmdlJyBjb21tYW5kcyBpbiBhIHJvdywgeW91IHdvdWxkIG1lcmdlIHRoZXNlIHR3bworYnJhbmNoIGhlYWRzICh0aGlzIGlzIGtub3duIGFzICdtYWtpbmcgYW4gT2N0b3B1cycpOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IG1lcmdlIGNvbW1pdC1maXggZGlmZi1maXgKKyQgZ2l0IHNob3ctYnJhbmNoCishIFtjb21taXQtZml4XSBGaXggY29tbWl0IG1lc3NhZ2Ugbm9ybWFsaXphdGlvbi4KKyAhIFtkaWZmLWZpeF0gRml4IHJlbmFtZSBkZXRlY3Rpb24uCisgICogW21hc3Rlcl0gT2N0b3B1cyBtZXJnZSBvZiBicmFuY2hlcyAnZGlmZi1maXgnIGFuZCAnY29tbWl0LWZpeCcKKy0tLQorICAtIFttYXN0ZXJdIE9jdG9wdXMgbWVyZ2Ugb2YgYnJhbmNoZXMgJ2RpZmYtZml4JyBhbmQgJ2NvbW1pdC1maXgnCisrICogW2NvbW1pdC1maXhdIEZpeCBjb21taXQgbWVzc2FnZSBub3JtYWxpemF0aW9uLgorICsqIFtkaWZmLWZpeF0gRml4IHJlbmFtZSBkZXRlY3Rpb24uCisgKyogW2RpZmYtZml4fjFdIEJldHRlciBjb21tb24gc3Vic3RyaW5nIGFsZ29yaXRobS4KKyAgKiBbbWFzdGVyfjFdIFJlbGVhc2UgY2FuZGlkYXRlICMxCisrKyogW21hc3Rlcn4yXSBQcmV0dHktcHJpbnQgbWVzc2FnZXMuCistLS0tLS0tLS0tLS0KKworTm90ZSB0aGF0IHlvdSBzaG91bGQgbm90IGRvIE9jdG9wdXMgYmVjYXVzZSB5b3UgY2FuLiAgQW4gb2N0b3B1cworaXMgYSB2YWxpZCB0aGluZyB0byBkbyBhbmQgb2Z0ZW4gbWFrZXMgaXQgZWFzaWVyIHRvIHZpZXcgdGhlCitjb21taXQgaGlzdG9yeSBpZiB5b3UgYXJlIG1lcmdpbmcgbW9yZSB0aGFuIHR3byBpbmRlcGVuZGVudAorY2hhbmdlcyBhdCB0aGUgc2FtZSB0aW1lLiAgSG93ZXZlciwgaWYgeW91IGhhdmUgbWVyZ2UgY29uZmxpY3RzCit3aXRoIGFueSBvZiB0aGUgYnJhbmNoZXMgeW91IGFyZSBtZXJnaW5nIGluIGFuZCBuZWVkIHRvIGhhbmQKK3Jlc29sdmUsIHRoYXQgaXMgYW4gaW5kaWNhdGlvbiB0aGF0IHRoZSBkZXZlbG9wbWVudCBoYXBwZW5lZCBpbgordGhvc2UgYnJhbmNoZXMgd2VyZSBub3QgaW5kZXBlbmRlbnQgYWZ0ZXIgYWxsLCBhbmQgeW91IHNob3VsZAorbWVyZ2UgdHdvIGF0IGEgdGltZSwgZG9jdW1lbnRpbmcgaG93IHlvdSByZXNvbHZlZCB0aGUgY29uZmxpY3RzLAorYW5kIHRoZSByZWFzb24gd2h5IHlvdSBwcmVmZXJyZWQgY2hhbmdlcyBtYWRlIGluIG9uZSBzaWRlIG92ZXIKK3RoZSBvdGhlci4gIE90aGVyd2lzZSBpdCB3b3VsZCBtYWtlIHRoZSBwcm9qZWN0IGhpc3RvcnkgaGFyZGVyCit0byBmb2xsb3csIG5vdCBlYXNpZXIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2N2cy1taWdyYXRpb24udHh0IGIvRG9jdW1lbnRhdGlvbi9jdnMtbWlncmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTk4OTAwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9jdnMtbWlncmF0aW9uLnR4dApAQCAtMCwwICsxLDE3MSBAQAorZ2l0IGZvciBDVlMgdXNlcnMKKz09PT09PT09PT09PT09PT09CisKK0dpdCBkaWZmZXJzIGZyb20gQ1ZTIGluIHRoYXQgZXZlcnkgd29ya2luZyB0cmVlIGNvbnRhaW5zIGEgcmVwb3NpdG9yeSB3aXRoCithIGZ1bGwgY29weSBvZiB0aGUgcHJvamVjdCBoaXN0b3J5LCBhbmQgbm8gcmVwb3NpdG9yeSBpcyBpbmhlcmVudGx5IG1vcmUKK2ltcG9ydGFudCB0aGFuIGFueSBvdGhlci4gIEhvd2V2ZXIsIHlvdSBjYW4gZW11bGF0ZSB0aGUgQ1ZTIG1vZGVsIGJ5CitkZXNpZ25hdGluZyBhIHNpbmdsZSBzaGFyZWQgcmVwb3NpdG9yeSB3aGljaCBwZW9wbGUgY2FuIHN5bmNocm9uaXplIHdpdGg7Cit0aGlzIGRvY3VtZW50IGV4cGxhaW5zIGhvdyB0byBkbyB0aGF0LgorCitTb21lIGJhc2ljIGZhbWlsaWFyaXR5IHdpdGggZ2l0IGlzIHJlcXVpcmVkLiAgVGhpcworbGluazp0dXRvcmlhbC5odG1sW3R1dG9yaWFsIGludHJvZHVjdGlvbiB0byBnaXRdIHNob3VsZCBiZSBzdWZmaWNpZW50LgorCitEZXZlbG9waW5nIGFnYWluc3QgYSBzaGFyZWQgcmVwb3NpdG9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU3VwcG9zZSBhIHNoYXJlZCByZXBvc2l0b3J5IGlzIHNldCB1cCBpbiAvcHViL3JlcG8uZ2l0IG9uIHRoZSBob3N0Citmb28uY29tLiAgVGhlbiBhcyBhbiBpbmRpdmlkdWFsIGNvbW1pdHRlciB5b3UgY2FuIGNsb25lIHRoZSBzaGFyZWQKK3JlcG9zaXRvcnkgb3ZlciBzc2ggd2l0aDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjbG9uZSBmb28uY29tOi9wdWIvcmVwby5naXQvIG15LXByb2plY3QKKyQgY2QgbXktcHJvamVjdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FuZCBoYWNrIGF3YXkuICBUaGUgZXF1aXZhbGVudCBvZiBgY3ZzIHVwZGF0ZWAgaXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBwdWxsIG9yaWdpbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIG1lcmdlcyBpbiBhbnkgd29yayB0aGF0IG90aGVycyBtaWdodCBoYXZlIGRvbmUgc2luY2UgdGhlIGNsb25lCitvcGVyYXRpb24uICBJZiB0aGVyZSBhcmUgdW5jb21taXR0ZWQgY2hhbmdlcyBpbiB5b3VyIHdvcmtpbmcgdHJlZSwgY29tbWl0Cit0aGVtIGZpcnN0IGJlZm9yZSBydW5uaW5nIGdpdCBwdWxsLgorCitbTk9URV0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaGUgYHB1bGxgIGNvbW1hbmQga25vd3Mgd2hlcmUgdG8gZ2V0IHVwZGF0ZXMgZnJvbSBiZWNhdXNlIG9mIGNlcnRhaW4KK2NvbmZpZ3VyYXRpb24gdmFyaWFibGVzIHRoYXQgd2VyZSBzZXQgYnkgdGhlIGZpcnN0IGBnaXQgY2xvbmVgCitjb21tYW5kOyBzZWUgYGdpdCBjb25maWcgLWxgIGFuZCB0aGUgbGlua2dpdDpnaXQtY29uZmlnWzFdIG1hbgorcGFnZSBmb3IgZGV0YWlscy4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1lvdSBjYW4gdXBkYXRlIHRoZSBzaGFyZWQgcmVwb3NpdG9yeSB3aXRoIHlvdXIgY2hhbmdlcyBieSBmaXJzdCBjb21taXR0aW5nCit5b3VyIGNoYW5nZXMsIGFuZCB0aGVuIHVzaW5nIHRoZSBsaW5rZ2l0OmdpdC1wdXNoWzFdIGNvbW1hbmQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcHVzaCBvcmlnaW4gbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordG8gInB1c2giIHRob3NlIGNvbW1pdHMgdG8gdGhlIHNoYXJlZCByZXBvc2l0b3J5LiAgSWYgc29tZW9uZSBlbHNlIGhhcwordXBkYXRlZCB0aGUgcmVwb3NpdG9yeSBtb3JlIHJlY2VudGx5LCBgZ2l0IHB1c2hgLCBsaWtlIGBjdnMgY29tbWl0YCwgd2lsbAorY29tcGxhaW4sIGluIHdoaWNoIGNhc2UgeW91IG11c3QgcHVsbCBhbnkgY2hhbmdlcyBiZWZvcmUgYXR0ZW1wdGluZyB0aGUKK3B1c2ggYWdhaW4uCisKK0luIHRoZSBgZ2l0IHB1c2hgIGNvbW1hbmQgYWJvdmUgd2Ugc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgcmVtb3RlIGJyYW5jaAordG8gdXBkYXRlIChgbWFzdGVyYCkuICBJZiB3ZSBsZWF2ZSB0aGF0IG91dCwgYGdpdCBwdXNoYCB0cmllcyB0byB1cGRhdGUKK2FueSBicmFuY2hlcyBpbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnkgdGhhdCBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgYSBicmFuY2gKK2luIHRoZSBsb2NhbCByZXBvc2l0b3J5LiAgU28gdGhlIGxhc3QgYHB1c2hgIGNhbiBiZSBkb25lIHdpdGggZWl0aGVyIG9mOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IHB1c2ggb3JpZ2luCiskIGdpdCBwdXNoIGZvby5jb206L3B1Yi9wcm9qZWN0LmdpdC8KKy0tLS0tLS0tLS0tLQorCithcyBsb25nIGFzIHRoZSBzaGFyZWQgcmVwb3NpdG9yeSBkb2VzIG5vdCBoYXZlIGFueSBicmFuY2hlcworb3RoZXIgdGhhbiBgbWFzdGVyYC4KKworU2V0dGluZyBVcCBhIFNoYXJlZCBSZXBvc2l0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2UgYXNzdW1lIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCBhIGdpdCByZXBvc2l0b3J5IGZvciB5b3VyIHByb2plY3QsCitwb3NzaWJseSBjcmVhdGVkIGZyb20gc2NyYXRjaCBvciBmcm9tIGEgdGFyYmFsbCAoc2VlIHRoZQorbGluazp0dXRvcmlhbC5odG1sW3R1dG9yaWFsXSksIG9yIGltcG9ydGVkIGZyb20gYW4gYWxyZWFkeSBleGlzdGluZyBDVlMKK3JlcG9zaXRvcnkgKHNlZSB0aGUgbmV4dCBzZWN0aW9uKS4KKworQXNzdW1lIHlvdXIgZXhpc3RpbmcgcmVwbyBpcyBhdCAvaG9tZS9hbGljZS9teXByb2plY3QuICBDcmVhdGUgYSBuZXcgImJhcmUiCityZXBvc2l0b3J5IChhIHJlcG9zaXRvcnkgd2l0aG91dCBhIHdvcmtpbmcgdHJlZSkgYW5kIGZldGNoIHlvdXIgcHJvamVjdCBpbnRvCitpdDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIG1rZGlyIC9wdWIvbXktcmVwby5naXQKKyQgY2QgL3B1Yi9teS1yZXBvLmdpdAorJCBnaXQgLS1iYXJlIGluaXQgLS1zaGFyZWQKKyQgZ2l0IC0tYmFyZSBmZXRjaCAvaG9tZS9hbGljZS9teXByb2plY3QgbWFzdGVyOm1hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05leHQsIGdpdmUgZXZlcnkgdGVhbSBtZW1iZXIgcmVhZC93cml0ZSBhY2Nlc3MgdG8gdGhpcyByZXBvc2l0b3J5LiAgT25lCitlYXN5IHdheSB0byBkbyB0aGlzIGlzIHRvIGdpdmUgYWxsIHRoZSB0ZWFtIG1lbWJlcnMgc3NoIGFjY2VzcyB0byB0aGUKK21hY2hpbmUgd2hlcmUgdGhlIHJlcG9zaXRvcnkgaXMgaG9zdGVkLiAgSWYgeW91IGRvbid0IHdhbnQgdG8gZ2l2ZSB0aGVtIGEKK2Z1bGwgc2hlbGwgb24gdGhlIG1hY2hpbmUsIHRoZXJlIGlzIGEgcmVzdHJpY3RlZCBzaGVsbCB3aGljaCBvbmx5IGFsbG93cwordXNlcnMgdG8gZG8gZ2l0IHB1c2hlcyBhbmQgcHVsbHM7IHNlZSBsaW5rZ2l0OmdpdC1zaGVsbFsxXS4KKworUHV0IGFsbCB0aGUgY29tbWl0dGVycyBpbiB0aGUgc2FtZSBncm91cCwgYW5kIG1ha2UgdGhlIHJlcG9zaXRvcnkKK3dyaXRhYmxlIGJ5IHRoYXQgZ3JvdXA6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBjaGdycCAtUiAkZ3JvdXAgL3B1Yi9teS1yZXBvLmdpdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01ha2Ugc3VyZSBjb21taXR0ZXJzIGhhdmUgYSB1bWFzayBvZiBhdCBtb3N0IDAyNywgc28gdGhhdCB0aGUgZGlyZWN0b3JpZXMKK3RoZXkgY3JlYXRlIGFyZSB3cml0YWJsZSBhbmQgc2VhcmNoYWJsZSBieSBvdGhlciBncm91cCBtZW1iZXJzLgorCitJbXBvcnRpbmcgYSBDVlMgYXJjaGl2ZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRmlyc3QsIGluc3RhbGwgdmVyc2lvbiAyLjEgb3IgaGlnaGVyIG9mIGN2c3BzIGZyb20KK2xpbms6aHR0cDovL3d3dy5jb2JpdGUuY29tL2N2c3BzL1todHRwOi8vd3d3LmNvYml0ZS5jb20vY3ZzcHMvXSBhbmQgbWFrZQorc3VyZSBpdCBpcyBpbiB5b3VyIHBhdGguICBUaGVuIGNkIHRvIGEgY2hlY2tlZCBvdXQgQ1ZTIHdvcmtpbmcgZGlyZWN0b3J5CitvZiB0aGUgcHJvamVjdCB5b3UgYXJlIGludGVyZXN0ZWQgaW4gYW5kIHJ1biBsaW5rZ2l0OmdpdC1jdnNpbXBvcnRbMV06CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGN2c2ltcG9ydCAtQyA8ZGVzdGluYXRpb24+IDxtb2R1bGU+CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgcHV0cyBhIGdpdCBhcmNoaXZlIG9mIHRoZSBuYW1lZCBDVlMgbW9kdWxlIGluIHRoZSBkaXJlY3RvcnkKKzxkZXN0aW5hdGlvbj4sIHdoaWNoIHdpbGwgYmUgY3JlYXRlZCBpZiBuZWNlc3NhcnkuCisKK1RoZSBpbXBvcnQgY2hlY2tzIG91dCBmcm9tIENWUyBldmVyeSByZXZpc2lvbiBvZiBldmVyeSBmaWxlLiAgUmVwb3J0ZWRseQorY3ZzaW1wb3J0IGNhbiBhdmVyYWdlIHNvbWUgdHdlbnR5IHJldmlzaW9ucyBwZXIgc2Vjb25kLCBzbyBmb3IgYQorbWVkaXVtLXNpemVkIHByb2plY3QgdGhpcyBzaG91bGQgbm90IHRha2UgbW9yZSB0aGFuIGEgY291cGxlIG9mIG1pbnV0ZXMuCitMYXJnZXIgcHJvamVjdHMgb3IgcmVtb3RlIHJlcG9zaXRvcmllcyBtYXkgdGFrZSBsb25nZXIuCisKK1RoZSBtYWluIHRydW5rIGlzIHN0b3JlZCBpbiB0aGUgZ2l0IGJyYW5jaCBuYW1lZCBgb3JpZ2luYCwgYW5kIGFkZGl0aW9uYWwKK0NWUyBicmFuY2hlcyBhcmUgc3RvcmVkIGluIGdpdCBicmFuY2hlcyB3aXRoIHRoZSBzYW1lIG5hbWVzLiAgVGhlIG1vc3QKK3JlY2VudCB2ZXJzaW9uIG9mIHRoZSBtYWluIHRydW5rIGlzIGFsc28gbGVmdCBjaGVja2VkIG91dCBvbiB0aGUgYG1hc3RlcmAKK2JyYW5jaCwgc28geW91IGNhbiBzdGFydCBhZGRpbmcgeW91ciBvd24gY2hhbmdlcyByaWdodCBhd2F5LgorCitUaGUgaW1wb3J0IGlzIGluY3JlbWVudGFsLCBzbyBpZiB5b3UgY2FsbCBpdCBhZ2FpbiBuZXh0IG1vbnRoIGl0IHdpbGwKK2ZldGNoIGFueSBDVlMgdXBkYXRlcyB0aGF0IGhhdmUgYmVlbiBtYWRlIGluIHRoZSBtZWFudGltZS4gIEZvciB0aGlzIHRvCit3b3JrLCB5b3UgbXVzdCBub3QgbW9kaWZ5IHRoZSBpbXBvcnRlZCBicmFuY2hlczsgaW5zdGVhZCwgY3JlYXRlIG5ldworYnJhbmNoZXMgZm9yIHlvdXIgb3duIGNoYW5nZXMsIGFuZCBtZXJnZSBpbiB0aGUgaW1wb3J0ZWQgYnJhbmNoZXMgYXMKK25lY2Vzc2FyeS4KKworQWR2YW5jZWQgU2hhcmVkIFJlcG9zaXRvcnkgTWFuYWdlbWVudAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitHaXQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHNjcmlwdHMgY2FsbGVkICJob29rcyIgdG8gYmUgcnVuIGF0IGNlcnRhaW4KK3BvaW50cy4gIFlvdSBjYW4gdXNlIHRoZXNlLCBmb3IgZXhhbXBsZSwgdG8gc2VuZCBhbGwgY29tbWl0cyB0byB0aGUgc2hhcmVkCityZXBvc2l0b3J5IHRvIGEgbWFpbGluZyBsaXN0LiAgU2VlIGxpbms6aG9va3MuaHRtbFtIb29rcyB1c2VkIGJ5IGdpdF0uCisKK1lvdSBjYW4gZW5mb3JjZSBmaW5lciBncmFpbmVkIHBlcm1pc3Npb25zIHVzaW5nIHVwZGF0ZSBob29rcy4gIFNlZQorbGluazpob3d0by91cGRhdGUtaG9vay1leGFtcGxlLnR4dFtDb250cm9sbGluZyBhY2Nlc3MgdG8gYnJhbmNoZXMgdXNpbmcKK3VwZGF0ZSBob29rc10uCisKK1Byb3ZpZGluZyBDVlMgQWNjZXNzIHRvIGEgZ2l0IFJlcG9zaXRvcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBwcm92aWRlIHRydWUgQ1ZTIGFjY2VzcyB0byBhIGdpdCByZXBvc2l0b3J5LCBzbwordGhhdCBkZXZlbG9wZXJzIGNhbiBzdGlsbCB1c2UgQ1ZTOyBzZWUgbGlua2dpdDpnaXQtY3Zzc2VydmVyWzFdIGZvcgorZGV0YWlscy4KKworQWx0ZXJuYXRpdmUgRGV2ZWxvcG1lbnQgTW9kZWxzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ1ZTIHVzZXJzIGFyZSBhY2N1c3RvbWVkIHRvIGdpdmluZyBhIGdyb3VwIG9mIGRldmVsb3BlcnMgY29tbWl0IGFjY2VzcyB0bworYSBjb21tb24gcmVwb3NpdG9yeS4gIEFzIHdlJ3ZlIHNlZW4sIHRoaXMgaXMgYWxzbyBwb3NzaWJsZSB3aXRoIGdpdC4KK0hvd2V2ZXIsIHRoZSBkaXN0cmlidXRlZCBuYXR1cmUgb2YgZ2l0IGFsbG93cyBvdGhlciBkZXZlbG9wbWVudCBtb2RlbHMsCithbmQgeW91IG1heSB3YW50IHRvIGZpcnN0IGNvbnNpZGVyIHdoZXRoZXIgb25lIG9mIHRoZW0gbWlnaHQgYmUgYSBiZXR0ZXIKK2ZpdCBmb3IgeW91ciBwcm9qZWN0LgorCitGb3IgZXhhbXBsZSwgeW91IGNhbiBjaG9vc2UgYSBzaW5nbGUgcGVyc29uIHRvIG1haW50YWluIHRoZSBwcm9qZWN0J3MKK3ByaW1hcnkgcHVibGljIHJlcG9zaXRvcnkuICBPdGhlciBkZXZlbG9wZXJzIHRoZW4gY2xvbmUgdGhpcyByZXBvc2l0b3J5CithbmQgZWFjaCB3b3JrIGluIHRoZWlyIG93biBjbG9uZS4gIFdoZW4gdGhleSBoYXZlIGEgc2VyaWVzIG9mIGNoYW5nZXMgdGhhdAordGhleSdyZSBoYXBweSB3aXRoLCB0aGV5IGFzayB0aGUgbWFpbnRhaW5lciB0byBwdWxsIGZyb20gdGhlIGJyYW5jaAorY29udGFpbmluZyB0aGUgY2hhbmdlcy4gIFRoZSBtYWludGFpbmVyIHJldmlld3MgdGhlaXIgY2hhbmdlcyBhbmQgcHVsbHMKK3RoZW0gaW50byB0aGUgcHJpbWFyeSByZXBvc2l0b3J5LCB3aGljaCBvdGhlciBkZXZlbG9wZXJzIHB1bGwgZnJvbSBhcworbmVjZXNzYXJ5IHRvIHN0YXkgY29vcmRpbmF0ZWQuICBUaGUgTGludXgga2VybmVsIGFuZCBvdGhlciBwcm9qZWN0cyB1c2UKK3ZhcmlhbnRzIG9mIHRoaXMgbW9kZWwuCisKK1dpdGggYSBzbWFsbCBncm91cCwgZGV2ZWxvcGVycyBtYXkganVzdCBwdWxsIGNoYW5nZXMgZnJvbSBlYWNoIG90aGVyJ3MKK3JlcG9zaXRvcmllcyB3aXRob3V0IHRoZSBuZWVkIGZvciBhIGNlbnRyYWwgbWFpbnRhaW5lci4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGlmZi1mb3JtYXQudHh0IGIvRG9jdW1lbnRhdGlvbi9kaWZmLWZvcm1hdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwY2JiMwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGlmZi1mb3JtYXQudHh0CkBAIC0wLDAgKzEsMTQ3IEBACitUaGUgb3V0cHV0IGZvcm1hdCBmcm9tICJnaXQtZGlmZi1pbmRleCIsICJnaXQtZGlmZi10cmVlIiwKKyJnaXQtZGlmZi1maWxlcyIgYW5kICJnaXQgZGlmZiAtLXJhdyIgYXJlIHZlcnkgc2ltaWxhci4KKworVGhlc2UgY29tbWFuZHMgYWxsIGNvbXBhcmUgdHdvIHNldHMgb2YgdGhpbmdzOyB3aGF0IGlzCitjb21wYXJlZCBkaWZmZXJzOgorCitnaXQtZGlmZi1pbmRleCA8dHJlZS1pc2g+OjoKKyAgICAgICAgY29tcGFyZXMgdGhlIDx0cmVlLWlzaD4gYW5kIHRoZSBmaWxlcyBvbiB0aGUgZmlsZXN5c3RlbS4KKworZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgPHRyZWUtaXNoPjo6CisgICAgICAgIGNvbXBhcmVzIHRoZSA8dHJlZS1pc2g+IGFuZCB0aGUgaW5kZXguCisKK2dpdC1kaWZmLXRyZWUgWy1yXSA8dHJlZS1pc2gtMT4gPHRyZWUtaXNoLTI+IFs8cGF0dGVybj4uLi5dOjoKKyAgICAgICAgY29tcGFyZXMgdGhlIHRyZWVzIG5hbWVkIGJ5IHRoZSB0d28gYXJndW1lbnRzLgorCitnaXQtZGlmZi1maWxlcyBbPHBhdHRlcm4+Li4uXTo6CisgICAgICAgIGNvbXBhcmVzIHRoZSBpbmRleCBhbmQgdGhlIGZpbGVzIG9uIHRoZSBmaWxlc3lzdGVtLgorCisKK0FuIG91dHB1dCBsaW5lIGlzIGZvcm1hdHRlZCB0aGlzIHdheToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbi1wbGFjZSBlZGl0ICA6MTAwNjQ0IDEwMDY0NCBiY2QxMjM0Li4uIDAxMjM0NTYuLi4gTSBmaWxlMAorY29weS1lZGl0ICAgICAgOjEwMDY0NCAxMDA2NDQgYWJjZDEyMy4uLiAxMjM0NTY3Li4uIEM2OCBmaWxlMSBmaWxlMgorcmVuYW1lLWVkaXQgICAgOjEwMDY0NCAxMDA2NDQgYWJjZDEyMy4uLiAxMjM0NTY3Li4uIFI4NiBmaWxlMSBmaWxlMworY3JlYXRlICAgICAgICAgOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiAxMjM0NTY3Li4uIEEgZmlsZTQKK2RlbGV0ZSAgICAgICAgIDoxMDA2NDQgMDAwMDAwIDEyMzQ1NjcuLi4gMDAwMDAwMC4uLiBEIGZpbGU1Cit1bm1lcmdlZCAgICAgICA6MDAwMDAwIDAwMDAwMCAwMDAwMDAwLi4uIDAwMDAwMDAuLi4gVSBmaWxlNgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoYXQgaXMsIGZyb20gdGhlIGxlZnQgdG8gdGhlIHJpZ2h0OgorCisuIGEgY29sb24uCisuIG1vZGUgZm9yICJzcmMiOyAwMDAwMDAgaWYgY3JlYXRpb24gb3IgdW5tZXJnZWQuCisuIGEgc3BhY2UuCisuIG1vZGUgZm9yICJkc3QiOyAwMDAwMDAgaWYgZGVsZXRpb24gb3IgdW5tZXJnZWQuCisuIGEgc3BhY2UuCisuIHNoYTEgZm9yICJzcmMiOyAwXHs0MFx9IGlmIGNyZWF0aW9uIG9yIHVubWVyZ2VkLgorLiBhIHNwYWNlLgorLiBzaGExIGZvciAiZHN0IjsgMFx7NDBcfSBpZiBjcmVhdGlvbiwgdW5tZXJnZWQgb3IgImxvb2sgYXQgd29yayB0cmVlIi4KKy4gYSBzcGFjZS4KKy4gc3RhdHVzLCBmb2xsb3dlZCBieSBvcHRpb25hbCAic2NvcmUiIG51bWJlci4KKy4gYSB0YWIgb3IgYSBOVUwgd2hlbiAnLXonIG9wdGlvbiBpcyB1c2VkLgorLiBwYXRoIGZvciAic3JjIgorLiBhIHRhYiBvciBhIE5VTCB3aGVuICcteicgb3B0aW9uIGlzIHVzZWQ7IG9ubHkgZXhpc3RzIGZvciBDIG9yIFIuCisuIHBhdGggZm9yICJkc3QiOyBvbmx5IGV4aXN0cyBmb3IgQyBvciBSLgorLiBhbiBMRiBvciBhIE5VTCB3aGVuICcteicgb3B0aW9uIGlzIHVzZWQsIHRvIHRlcm1pbmF0ZSB0aGUgcmVjb3JkLgorCis8c2hhMT4gaXMgc2hvd24gYXMgYWxsIDAncyBpZiBhIGZpbGUgaXMgbmV3IG9uIHRoZSBmaWxlc3lzdGVtCithbmQgaXQgaXMgb3V0IG9mIHN5bmMgd2l0aCB0aGUgaW5kZXguCisKK0V4YW1wbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOjEwMDY0NCAxMDA2NDQgNWJlNGE0Li4uLi4uIDAwMDAwMC4uLi4uLiBNIGZpbGUuYworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doZW4gYC16YCBvcHRpb24gaXMgbm90IHVzZWQsIFRBQiwgTEYsIGFuZCBiYWNrc2xhc2ggY2hhcmFjdGVycworaW4gcGF0aG5hbWVzIGFyZSByZXByZXNlbnRlZCBhcyBgXHRgLCBgXG5gLCBhbmQgYFxcYCwKK3Jlc3BlY3RpdmVseS4KKworZGlmZiBmb3JtYXQgZm9yIG1lcmdlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisiZ2l0LWRpZmYtdHJlZSIsICJnaXQtZGlmZi1maWxlcyIgYW5kICJnaXQtZGlmZiAtLXJhdyIKK2NhbiB0YWtlICctYycgb3IgJy0tY2MnIG9wdGlvbgordG8gZ2VuZXJhdGUgZGlmZiBvdXRwdXQgYWxzbyBmb3IgbWVyZ2UgY29tbWl0cy4gIFRoZSBvdXRwdXQgZGlmZmVycworZnJvbSB0aGUgZm9ybWF0IGRlc2NyaWJlZCBhYm92ZSBpbiB0aGUgZm9sbG93aW5nIHdheToKKworLiB0aGVyZSBpcyBhIGNvbG9uIGZvciBlYWNoIHBhcmVudAorLiB0aGVyZSBhcmUgbW9yZSAic3JjIiBtb2RlcyBhbmQgInNyYyIgc2hhMQorLiBzdGF0dXMgaXMgY29uY2F0ZW5hdGVkIHN0YXR1cyBjaGFyYWN0ZXJzIGZvciBlYWNoIHBhcmVudAorLiBubyBvcHRpb25hbCAic2NvcmUiIG51bWJlcgorLiBzaW5nbGUgcGF0aCwgb25seSBmb3IgImRzdCIKKworRXhhbXBsZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis6OjEwMDY0NCAxMDA2NDQgMTAwNjQ0IGZhYmFkYjguLi4gY2M5NWViMC4uLiA0ODY2NTEwLi4uIE1NCWRlc2NyaWJlLmMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3RlIHRoYXQgJ2NvbWJpbmVkIGRpZmYnIGxpc3RzIG9ubHkgZmlsZXMgd2hpY2ggd2VyZSBtb2RpZmllZCBmcm9tCithbGwgcGFyZW50cy4KKworCitpbmNsdWRlOjpkaWZmLWdlbmVyYXRlLXBhdGNoLnR4dFtdCisKKworb3RoZXIgZGlmZiBmb3JtYXRzCistLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGAtLXN1bW1hcnlgIG9wdGlvbiBkZXNjcmliZXMgbmV3bHkgYWRkZWQsIGRlbGV0ZWQsIHJlbmFtZWQgYW5kCitjb3BpZWQgZmlsZXMuICBUaGUgYC0tc3RhdGAgb3B0aW9uIGFkZHMgZGlmZnN0YXQoMSkgZ3JhcGggdG8gdGhlCitvdXRwdXQuICBUaGVzZSBvcHRpb25zIGNhbiBiZSBjb21iaW5lZCB3aXRoIG90aGVyIG9wdGlvbnMsIHN1Y2ggYXMKK2AtcGAsIGFuZCBhcmUgbWVhbnQgZm9yIGh1bWFuIGNvbnN1bXB0aW9uLgorCitXaGVuIHNob3dpbmcgYSBjaGFuZ2UgdGhhdCBpbnZvbHZlcyBhIHJlbmFtZSBvciBhIGNvcHksIGAtLXN0YXRgIG91dHB1dAorZm9ybWF0cyB0aGUgcGF0aG5hbWVzIGNvbXBhY3RseSBieSBjb21iaW5pbmcgY29tbW9uIHByZWZpeCBhbmQgc3VmZml4IG9mCit0aGUgcGF0aG5hbWVzLiAgRm9yIGV4YW1wbGUsIGEgY2hhbmdlIHRoYXQgbW92ZXMgYGFyY2gvaTM4Ni9NYWtlZmlsZWAgdG8KK2BhcmNoL3g4Ni9NYWtlZmlsZWAgd2hpbGUgbW9kaWZ5aW5nIDQgbGluZXMgd2lsbCBiZSBzaG93biBsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorYXJjaC97aTM4NiA9PiB4ODZ9L01ha2VmaWxlICAgIHwgICA0ICstLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBgLS1udW1zdGF0YCBvcHRpb24gZ2l2ZXMgdGhlIGRpZmZzdGF0KDEpIGluZm9ybWF0aW9uIGJ1dCBpcyBkZXNpZ25lZAorZm9yIGVhc2llciBtYWNoaW5lIGNvbnN1bXB0aW9uLiAgQW4gZW50cnkgaW4gYC0tbnVtc3RhdGAgb3V0cHV0IGxvb2tzCitsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzEJMglSRUFETUUKKzMJMQlhcmNoL3tpMzg2ID0+IHg4Nn0vTWFrZWZpbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhhdCBpcywgZnJvbSBsZWZ0IHRvIHJpZ2h0OgorCisuIHRoZSBudW1iZXIgb2YgYWRkZWQgbGluZXM7CisuIGEgdGFiOworLiB0aGUgbnVtYmVyIG9mIGRlbGV0ZWQgbGluZXM7CisuIGEgdGFiOworLiBwYXRobmFtZSAocG9zc2libHkgd2l0aCByZW5hbWUvY29weSBpbmZvcm1hdGlvbik7CisuIGEgbmV3bGluZS4KKworV2hlbiBgLXpgIG91dHB1dCBvcHRpb24gaXMgaW4gZWZmZWN0LCB0aGUgb3V0cHV0IGlzIGZvcm1hdHRlZCB0aGlzIHdheToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMQkyCVJFQURNRSBOVUwKKzMJMQlOVUwgYXJjaC9pMzg2L01ha2VmaWxlIE5VTCBhcmNoL3g4Ni9NYWtlZmlsZSBOVUwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhhdCBpczoKKworLiB0aGUgbnVtYmVyIG9mIGFkZGVkIGxpbmVzOworLiBhIHRhYjsKKy4gdGhlIG51bWJlciBvZiBkZWxldGVkIGxpbmVzOworLiBhIHRhYjsKKy4gYSBOVUwgKG9ubHkgZXhpc3RzIGlmIHJlbmFtZWQvY29waWVkKTsKKy4gcGF0aG5hbWUgaW4gcHJlaW1hZ2U7CisuIGEgTlVMIChvbmx5IGV4aXN0cyBpZiByZW5hbWVkL2NvcGllZCk7CisuIHBhdGhuYW1lIGluIHBvc3RpbWFnZSAob25seSBleGlzdHMgaWYgcmVuYW1lZC9jb3BpZWQpOworLiBhIE5VTC4KKworVGhlIGV4dHJhIGBOVUxgIGJlZm9yZSB0aGUgcHJlaW1hZ2UgcGF0aCBpbiByZW5hbWVkIGNhc2UgaXMgdG8gYWxsb3cKK3NjcmlwdHMgdGhhdCByZWFkIHRoZSBvdXRwdXQgdG8gdGVsbCBpZiB0aGUgY3VycmVudCByZWNvcmQgYmVpbmcgcmVhZCBpcworYSBzaW5nbGUtcGF0aCByZWNvcmQgb3IgYSByZW5hbWUvY29weSByZWNvcmQgd2l0aG91dCByZWFkaW5nIGFoZWFkLgorQWZ0ZXIgcmVhZGluZyBhZGRlZCBhbmQgZGVsZXRlZCBsaW5lcywgcmVhZGluZyB1cCB0byBgTlVMYCB3b3VsZCB5aWVsZAordGhlIHBhdGhuYW1lLCBidXQgaWYgdGhhdCBpcyBgTlVMYCwgdGhlIHJlY29yZCB3aWxsIHNob3cgdHdvIHBhdGhzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kaWZmLWdlbmVyYXRlLXBhdGNoLnR4dCBiL0RvY3VtZW50YXRpb24vZGlmZi1nZW5lcmF0ZS1wYXRjaC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI5YzVmMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGlmZi1nZW5lcmF0ZS1wYXRjaC50eHQKQEAgLTAsMCArMSwxNjEgQEAKK0dlbmVyYXRpbmcgcGF0Y2hlcyB3aXRoIC1wCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGVuICJnaXQtZGlmZi1pbmRleCIsICJnaXQtZGlmZi10cmVlIiwgb3IgImdpdC1kaWZmLWZpbGVzIiBhcmUgcnVuCit3aXRoIGEgJy1wJyBvcHRpb24sICJnaXQgZGlmZiIgd2l0aG91dCB0aGUgJy0tcmF3JyBvcHRpb24sIG9yCisiZ2l0IGxvZyIgd2l0aCB0aGUgIi1wIiBvcHRpb24sIHRoZXkKK2RvIG5vdCBwcm9kdWNlIHRoZSBvdXRwdXQgZGVzY3JpYmVkIGFib3ZlOyBpbnN0ZWFkIHRoZXkgcHJvZHVjZSBhCitwYXRjaCBmaWxlLiAgWW91IGNhbiBjdXN0b21pemUgdGhlIGNyZWF0aW9uIG9mIHN1Y2ggcGF0Y2hlcyB2aWEgdGhlCitHSVRfRVhURVJOQUxfRElGRiBhbmQgdGhlIEdJVF9ESUZGX09QVFMgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCitXaGF0IHRoZSAtcCBvcHRpb24gcHJvZHVjZXMgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IGZyb20gdGhlIHRyYWRpdGlvbmFsCitkaWZmIGZvcm1hdC4KKworMS4gICBJdCBpcyBwcmVjZWRlZCB3aXRoIGEgImdpdCBkaWZmIiBoZWFkZXIsIHRoYXQgbG9va3MgbGlrZQorICAgICB0aGlzOgorCisgICAgICAgZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTIKKysKK1RoZSBgYS9gIGFuZCBgYi9gIGZpbGVuYW1lcyBhcmUgdGhlIHNhbWUgdW5sZXNzIHJlbmFtZS9jb3B5IGlzCitpbnZvbHZlZC4gIEVzcGVjaWFsbHksIGV2ZW4gZm9yIGEgY3JlYXRpb24gb3IgYSBkZWxldGlvbiwKK2AvZGV2L251bGxgIGlzIF9ub3RfIHVzZWQgaW4gcGxhY2Ugb2YgYGEvYCBvciBgYi9gIGZpbGVuYW1lcy4KKysKK1doZW4gcmVuYW1lL2NvcHkgaXMgaW52b2x2ZWQsIGBmaWxlMWAgYW5kIGBmaWxlMmAgc2hvdyB0aGUKK25hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIG9mIHRoZSByZW5hbWUvY29weSBhbmQgdGhlIG5hbWUgb2YKK3RoZSBmaWxlIHRoYXQgcmVuYW1lL2NvcHkgcHJvZHVjZXMsIHJlc3BlY3RpdmVseS4KKworMi4gICBJdCBpcyBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBleHRlbmRlZCBoZWFkZXIgbGluZXM6CisKKyAgICAgICBvbGQgbW9kZSA8bW9kZT4KKyAgICAgICBuZXcgbW9kZSA8bW9kZT4KKyAgICAgICBkZWxldGVkIGZpbGUgbW9kZSA8bW9kZT4KKyAgICAgICBuZXcgZmlsZSBtb2RlIDxtb2RlPgorICAgICAgIGNvcHkgZnJvbSA8cGF0aD4KKyAgICAgICBjb3B5IHRvIDxwYXRoPgorICAgICAgIHJlbmFtZSBmcm9tIDxwYXRoPgorICAgICAgIHJlbmFtZSB0byA8cGF0aD4KKyAgICAgICBzaW1pbGFyaXR5IGluZGV4IDxudW1iZXI+CisgICAgICAgZGlzc2ltaWxhcml0eSBpbmRleCA8bnVtYmVyPgorICAgICAgIGluZGV4IDxoYXNoPi4uPGhhc2g+IDxtb2RlPgorCiszLiAgVEFCLCBMRiwgZG91YmxlIHF1b3RlIGFuZCBiYWNrc2xhc2ggY2hhcmFjdGVycyBpbiBwYXRobmFtZXMKKyAgICBhcmUgcmVwcmVzZW50ZWQgYXMgYFx0YCwgYFxuYCwgYFwiYCBhbmQgYFxcYCwgcmVzcGVjdGl2ZWx5LgorICAgIElmIHRoZXJlIGlzIG5lZWQgZm9yIHN1Y2ggc3Vic3RpdHV0aW9uIHRoZW4gdGhlIHdob2xlCisgICAgcGF0aG5hbWUgaXMgcHV0IGluIGRvdWJsZSBxdW90ZXMuCisKK1RoZSBzaW1pbGFyaXR5IGluZGV4IGlzIHRoZSBwZXJjZW50YWdlIG9mIHVuY2hhbmdlZCBsaW5lcywgYW5kCit0aGUgZGlzc2ltaWxhcml0eSBpbmRleCBpcyB0aGUgcGVyY2VudGFnZSBvZiBjaGFuZ2VkIGxpbmVzLiAgSXQKK2lzIGEgcm91bmRlZCBkb3duIGludGVnZXIsIGZvbGxvd2VkIGJ5IGEgcGVyY2VudCBzaWduLiAgVGhlCitzaW1pbGFyaXR5IGluZGV4IHZhbHVlIG9mIDEwMCUgaXMgdGh1cyByZXNlcnZlZCBmb3IgdHdvIGVxdWFsCitmaWxlcywgd2hpbGUgMTAwJSBkaXNzaW1pbGFyaXR5IG1lYW5zIHRoYXQgbm8gbGluZSBmcm9tIHRoZSBvbGQKK2ZpbGUgbWFkZSBpdCBpbnRvIHRoZSBuZXcgb25lLgorCisKK2NvbWJpbmVkIGRpZmYgZm9ybWF0CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisiZ2l0LWRpZmYtdHJlZSIsICJnaXQtZGlmZi1maWxlcyIgYW5kICJnaXQtZGlmZiIgY2FuIHRha2UgJy1jJyBvcgorJy0tY2MnIG9wdGlvbiB0byBwcm9kdWNlICdjb21iaW5lZCBkaWZmJy4gIEZvciBzaG93aW5nIGEgbWVyZ2UgY29tbWl0Cit3aXRoICJnaXQgbG9nIC1wIiwgdGhpcyBpcyB0aGUgZGVmYXVsdCBmb3JtYXQuCitBICdjb21iaW5lZCBkaWZmJyBmb3JtYXQgbG9va3MgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0KK2RpZmYgLS1jb21iaW5lZCBkZXNjcmliZS5jCitpbmRleCBmYWJhZGI4LGNjOTVlYjAuLjQ4NjY1MTAKKy0tLSBhL2Rlc2NyaWJlLmMKKysrKyBiL2Rlc2NyaWJlLmMKK0BAQCAtOTgsMjAgLTk4LDEyICs5OCwyMCBAQEAKKwlyZXR1cm4gKGFfZGF0ZSA+IGJfZGF0ZSkgPyAtMSA6IChhX2RhdGUgPT0gYl9kYXRlKSA/IDAgOiAxOworICB9CisKKy0gc3RhdGljIHZvaWQgZGVzY3JpYmUoY2hhciAqYXJnKQorIC1zdGF0aWMgdm9pZCBkZXNjcmliZShzdHJ1Y3QgY29tbWl0ICpjbWl0LCBpbnQgbGFzdF9vbmUpCisrK3N0YXRpYyB2b2lkIGRlc2NyaWJlKGNoYXIgKmFyZywgaW50IGxhc3Rfb25lKQorICB7CisgKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworICsJc3RydWN0IGNvbW1pdCAqY21pdDsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3Q7CisJc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisJc3RydWN0IGNvbW1pdF9uYW1lICpuOworCisgKwlpZiAoZ2V0X3NoYTEoYXJnLCBzaGExKSA8IDApCisgKwkJdXNhZ2UoZGVzY3JpYmVfdXNhZ2UpOworICsJY21pdCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKHNoYTEpOworICsJaWYgKCFjbWl0KQorICsJCXVzYWdlKGRlc2NyaWJlX3VzYWdlKTsKKyArCisJaWYgKCFpbml0aWFsaXplZCkgeworCQlpbml0aWFsaXplZCA9IDE7CisJCWZvcl9lYWNoX3JlZihnZXRfbmFtZSk7CistLS0tLS0tLS0tLS0KKworMS4gICBJdCBpcyBwcmVjZWRlZCB3aXRoIGEgImdpdCBkaWZmIiBoZWFkZXIsIHRoYXQgbG9va3MgbGlrZQorICAgICB0aGlzICh3aGVuICctYycgb3B0aW9uIGlzIHVzZWQpOgorCisgICAgICAgZGlmZiAtLWNvbWJpbmVkIGZpbGUKKysKK29yIGxpa2UgdGhpcyAod2hlbiAnLS1jYycgb3B0aW9uIGlzIHVzZWQpOgorCisgICAgICAgZGlmZiAtLWMgZmlsZQorCisyLiAgIEl0IGlzIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGV4dGVuZGVkIGhlYWRlciBsaW5lcworICAgICAodGhpcyBleGFtcGxlIHNob3dzIGEgbWVyZ2Ugd2l0aCB0d28gcGFyZW50cyk6CisKKyAgICAgICBpbmRleCA8aGFzaD4sPGhhc2g+Li48aGFzaD4KKyAgICAgICBtb2RlIDxtb2RlPiw8bW9kZT4uLjxtb2RlPgorICAgICAgIG5ldyBmaWxlIG1vZGUgPG1vZGU+CisgICAgICAgZGVsZXRlZCBmaWxlIG1vZGUgPG1vZGU+LDxtb2RlPgorKworVGhlIGBtb2RlIDxtb2RlPiw8bW9kZT4uLjxtb2RlPmAgbGluZSBhcHBlYXJzIG9ubHkgaWYgYXQgbGVhc3Qgb25lIG9mCit0aGUgPG1vZGU+IGlzIGRpZmZlcmVudCBmcm9tIHRoZSByZXN0LiBFeHRlbmRlZCBoZWFkZXJzIHdpdGgKK2luZm9ybWF0aW9uIGFib3V0IGRldGVjdGVkIGNvbnRlbnRzIG1vdmVtZW50IChyZW5hbWVzIGFuZAorY29weWluZyBkZXRlY3Rpb24pIGFyZSBkZXNpZ25lZCB0byB3b3JrIHdpdGggZGlmZiBvZiB0d28KKzx0cmVlLWlzaD4gYW5kIGFyZSBub3QgdXNlZCBieSBjb21iaW5lZCBkaWZmIGZvcm1hdC4KKworMy4gICBJdCBpcyBmb2xsb3dlZCBieSB0d28tbGluZSBmcm9tLWZpbGUvdG8tZmlsZSBoZWFkZXIKKworICAgICAgIC0tLSBhL2ZpbGUKKyAgICAgICArKysgYi9maWxlCisrCitTaW1pbGFyIHRvIHR3by1saW5lIGhlYWRlciBmb3IgdHJhZGl0aW9uYWwgJ3VuaWZpZWQnIGRpZmYKK2Zvcm1hdCwgYC9kZXYvbnVsbGAgaXMgdXNlZCB0byBzaWduYWwgY3JlYXRlZCBvciBkZWxldGVkCitmaWxlcy4KKworNC4gICBDaHVuayBoZWFkZXIgZm9ybWF0IGlzIG1vZGlmaWVkIHRvIHByZXZlbnQgcGVvcGxlIGZyb20KKyAgICAgYWNjaWRlbnRhbGx5IGZlZWRpbmcgaXQgdG8gYHBhdGNoIC1wMWAuIENvbWJpbmVkIGRpZmYgZm9ybWF0CisgICAgIHdhcyBjcmVhdGVkIGZvciByZXZpZXcgb2YgbWVyZ2UgY29tbWl0IGNoYW5nZXMsIGFuZCB3YXMgbm90CisgICAgIG1lYW50IGZvciBhcHBseS4gVGhlIGNoYW5nZSBpcyBzaW1pbGFyIHRvIHRoZSBjaGFuZ2UgaW4gdGhlCisgICAgIGV4dGVuZGVkICdpbmRleCcgaGVhZGVyOgorCisgICAgICAgQEBAIDxmcm9tLWZpbGUtcmFuZ2U+IDxmcm9tLWZpbGUtcmFuZ2U+IDx0by1maWxlLXJhbmdlPiBAQEAKKysKK1RoZXJlIGFyZSAobnVtYmVyIG9mIHBhcmVudHMgKyAxKSBgQGAgY2hhcmFjdGVycyBpbiB0aGUgY2h1bmsKK2hlYWRlciBmb3IgY29tYmluZWQgZGlmZiBmb3JtYXQuCisKK1VubGlrZSB0aGUgdHJhZGl0aW9uYWwgJ3VuaWZpZWQnIGRpZmYgZm9ybWF0LCB3aGljaCBzaG93cyB0d28KK2ZpbGVzIEEgYW5kIEIgd2l0aCBhIHNpbmdsZSBjb2x1bW4gdGhhdCBoYXMgYC1gIChtaW51cyAtLQorYXBwZWFycyBpbiBBIGJ1dCByZW1vdmVkIGluIEIpLCBgK2AgKHBsdXMgLS0gbWlzc2luZyBpbiBBIGJ1dAorYWRkZWQgdG8gQiksIG9yIGAiICJgIChzcGFjZSAtLSB1bmNoYW5nZWQpIHByZWZpeCwgdGhpcyBmb3JtYXQKK2NvbXBhcmVzIHR3byBvciBtb3JlIGZpbGVzIGZpbGUxLCBmaWxlMiwuLi4gd2l0aCBvbmUgZmlsZSBYLCBhbmQKK3Nob3dzIGhvdyBYIGRpZmZlcnMgZnJvbSBlYWNoIG9mIGZpbGVOLiAgT25lIGNvbHVtbiBmb3IgZWFjaCBvZgorZmlsZU4gaXMgcHJlcGVuZGVkIHRvIHRoZSBvdXRwdXQgbGluZSB0byBub3RlIGhvdyBYJ3MgbGluZSBpcworZGlmZmVyZW50IGZyb20gaXQuCisKK0EgYC1gIGNoYXJhY3RlciBpbiB0aGUgY29sdW1uIE4gbWVhbnMgdGhhdCB0aGUgbGluZSBhcHBlYXJzIGluCitmaWxlTiBidXQgaXQgZG9lcyBub3QgYXBwZWFyIGluIHRoZSByZXN1bHQuICBBIGArYCBjaGFyYWN0ZXIKK2luIHRoZSBjb2x1bW4gTiBtZWFucyB0aGF0IHRoZSBsaW5lIGFwcGVhcnMgaW4gdGhlIGxhc3QgZmlsZSwKK2FuZCBmaWxlTiBkb2VzIG5vdCBoYXZlIHRoYXQgbGluZSAoaW4gb3RoZXIgd29yZHMsIHRoZSBsaW5lIHdhcworYWRkZWQsIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgdGhhdCBwYXJlbnQpLgorCitJbiB0aGUgYWJvdmUgZXhhbXBsZSBvdXRwdXQsIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgd2FzIGNoYW5nZWQKK2Zyb20gYm90aCBmaWxlcyAoaGVuY2UgdHdvIGAtYCByZW1vdmFscyBmcm9tIGJvdGggZmlsZTEgYW5kCitmaWxlMiwgcGx1cyBgKytgIHRvIG1lYW4gb25lIGxpbmUgdGhhdCB3YXMgYWRkZWQgZG9lcyBub3QgYXBwZWFyCitpbiBlaXRoZXIgZmlsZTEgbm9yIGZpbGUyKS4gIEFsc28gdHdvIG90aGVyIGxpbmVzIGFyZSB0aGUgc2FtZQorZnJvbSBmaWxlMSBidXQgZG8gbm90IGFwcGVhciBpbiBmaWxlMiAoaGVuY2UgcHJlZml4ZWQgd2l0aCBgICtgKS4KKworV2hlbiBzaG93biBieSBgZ2l0IGRpZmYtdHJlZSAtY2AsIGl0IGNvbXBhcmVzIHRoZSBwYXJlbnRzIG9mIGEKK21lcmdlIGNvbW1pdCB3aXRoIHRoZSBtZXJnZSByZXN1bHQgKGkuZS4gZmlsZTEuLmZpbGVOIGFyZSB0aGUKK3BhcmVudHMpLiAgV2hlbiBzaG93biBieSBgZ2l0IGRpZmYtZmlsZXMgLWNgLCBpdCBjb21wYXJlcyB0aGUKK3R3byB1bnJlc29sdmVkIG1lcmdlIHBhcmVudHMgd2l0aCB0aGUgd29ya2luZyB0cmVlIGZpbGUKKyhpLmUuIGZpbGUxIGlzIHN0YWdlIDIgYWthICJvdXIgdmVyc2lvbiIsIGZpbGUyIGlzIHN0YWdlIDMgYWthCisidGhlaXIgdmVyc2lvbiIpLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kaWZmLW9wdGlvbnMudHh0IGIvRG9jdW1lbnRhdGlvbi9kaWZmLW9wdGlvbnMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYzViMDAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RpZmYtb3B0aW9ucy50eHQKQEAgLTAsMCArMSwyMzIgQEAKKy8vIFBsZWFzZSBkb24ndCByZW1vdmUgdGhpcyBjb21tZW50IGFzIGFzY2lpZG9jIGJlaGF2ZXMgYmFkbHkgd2hlbgorLy8gdGhlIGZpcnN0IG5vbi1lbXB0eSBsaW5lIGlzIGlmZGVmL2lmbmRlZi4gVGhlIHN5bXB0b20gaXMgdGhhdAorLy8gd2l0aG91dCB0aGlzIGNvbW1lbnQgdGhlIDxnaXQtZGlmZi1jb3JlPiBhdHRyaWJ1dGUgY29uZGl0aW9uYWxseQorLy8gZGVmaW5lZCBiZWxvdyBlbmRzIHVwIGJlaW5nIGRlZmluZWQgdW5jb25kaXRpb25hbGx5LgorLy8gTGFzdCBjaGVja2VkIHdpdGggYXNjaWlkb2MgNy4wLjIuCisKK2lmbmRlZjo6Z2l0LWZvcm1hdC1wYXRjaFtdCitpZm5kZWY6OmdpdC1kaWZmW10KK2lmbmRlZjo6Z2l0LWxvZ1tdCis6Z2l0LWRpZmYtY29yZTogMQorZW5kaWY6OmdpdC1sb2dbXQorZW5kaWY6OmdpdC1kaWZmW10KK2VuZGlmOjpnaXQtZm9ybWF0LXBhdGNoW10KKworaWZkZWY6OmdpdC1mb3JtYXQtcGF0Y2hbXQorLXA6OgorCUdlbmVyYXRlIHBhdGNoZXMgd2l0aG91dCBkaWZmc3RhdC4KK2VuZGlmOjpnaXQtZm9ybWF0LXBhdGNoW10KKworaWZuZGVmOjpnaXQtZm9ybWF0LXBhdGNoW10KKy1wOjoKKwlHZW5lcmF0ZSBwYXRjaCAoc2VlIHNlY3Rpb24gb24gZ2VuZXJhdGluZyBwYXRjaGVzKS4KKwl7Z2l0LWRpZmY/IFRoaXMgaXMgdGhlIGRlZmF1bHQufQorZW5kaWY6OmdpdC1mb3JtYXQtcGF0Y2hbXQorCistdTo6CisJU3lub255bSBmb3IgIi1wIi4KKworLVU8bj46OgorCVNob3J0aGFuZCBmb3IgIi0tdW5pZmllZD08bj4iLgorCistLXVuaWZpZWQ9PG4+OjoKKwlHZW5lcmF0ZSBkaWZmcyB3aXRoIDxuPiBsaW5lcyBvZiBjb250ZXh0IGluc3RlYWQgb2YKKwl0aGUgdXN1YWwgdGhyZWUuIEltcGxpZXMgIi1wIi4KKworLS1yYXc6OgorCUdlbmVyYXRlIHRoZSByYXcgZm9ybWF0LgorCXtnaXQtZGlmZi1jb3JlPyBUaGlzIGlzIHRoZSBkZWZhdWx0Ln0KKworLS1wYXRjaC13aXRoLXJhdzo6CisJU3lub255bSBmb3IgIi1wIC0tcmF3Ii4KKworLS1zdGF0Wz13aWR0aFssbmFtZS13aWR0aF1dOjoKKwlHZW5lcmF0ZSBhIGRpZmZzdGF0LiAgWW91IGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdAorCW91dHB1dCB3aWR0aCBmb3IgODAtY29sdW1uIHRlcm1pbmFsIGJ5ICItLXN0YXQ9d2lkdGgiLgorCVRoZSB3aWR0aCBvZiB0aGUgZmlsZW5hbWUgcGFydCBjYW4gYmUgY29udHJvbGxlZCBieQorCWdpdmluZyBhbm90aGVyIHdpZHRoIHRvIGl0IHNlcGFyYXRlZCBieSBhIGNvbW1hLgorCistLW51bXN0YXQ6OgorCVNpbWlsYXIgdG8gXC0tc3RhdCwgYnV0IHNob3dzIG51bWJlciBvZiBhZGRlZCBhbmQKKwlkZWxldGVkIGxpbmVzIGluIGRlY2ltYWwgbm90YXRpb24gYW5kIHBhdGhuYW1lIHdpdGhvdXQKKwlhYmJyZXZpYXRpb24sIHRvIG1ha2UgaXQgbW9yZSBtYWNoaW5lIGZyaWVuZGx5LiAgRm9yCisJYmluYXJ5IGZpbGVzLCBvdXRwdXRzIHR3byBgLWAgaW5zdGVhZCBvZiBzYXlpbmcKKwlgMCAwYC4KKworLS1zaG9ydHN0YXQ6OgorCU91dHB1dCBvbmx5IHRoZSBsYXN0IGxpbmUgb2YgdGhlIC0tc3RhdCBmb3JtYXQgY29udGFpbmluZyB0b3RhbAorCW51bWJlciBvZiBtb2RpZmllZCBmaWxlcywgYXMgd2VsbCBhcyBudW1iZXIgb2YgYWRkZWQgYW5kIGRlbGV0ZWQKKwlsaW5lcy4KKworLS1zdW1tYXJ5OjoKKwlPdXRwdXQgYSBjb25kZW5zZWQgc3VtbWFyeSBvZiBleHRlbmRlZCBoZWFkZXIgaW5mb3JtYXRpb24KKwlzdWNoIGFzIGNyZWF0aW9ucywgcmVuYW1lcyBhbmQgbW9kZSBjaGFuZ2VzLgorCistLXBhdGNoLXdpdGgtc3RhdDo6CisJU3lub255bSBmb3IgIi1wIC0tc3RhdCIuCisJe2dpdC1mb3JtYXQtcGF0Y2g/IFRoaXMgaXMgdGhlIGRlZmF1bHQufQorCistejo6CisJTlVMLWxpbmUgdGVybWluYXRpb24gb24gb3V0cHV0LiAgVGhpcyBhZmZlY3RzIHRoZSAtLXJhdworCW91dHB1dCBmaWVsZCB0ZXJtaW5hdG9yLiAgQWxzbyBvdXRwdXQgZnJvbSBjb21tYW5kcyBzdWNoCisJYXMgImdpdC1sb2ciIHdpbGwgYmUgZGVsaW1pdGVkIHdpdGggTlVMIGJldHdlZW4gY29tbWl0cy4KKworLS1uYW1lLW9ubHk6OgorCVNob3cgb25seSBuYW1lcyBvZiBjaGFuZ2VkIGZpbGVzLgorCistLW5hbWUtc3RhdHVzOjoKKwlTaG93IG9ubHkgbmFtZXMgYW5kIHN0YXR1cyBvZiBjaGFuZ2VkIGZpbGVzLgorCistLWNvbG9yOjoKKwlTaG93IGNvbG9yZWQgZGlmZi4KKworLS1uby1jb2xvcjo6CisJVHVybiBvZmYgY29sb3JlZCBkaWZmLCBldmVuIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQorCWdpdmVzIHRoZSBkZWZhdWx0IHRvIGNvbG9yIG91dHB1dC4KKworLS1jb2xvci13b3Jkczo6CisJU2hvdyBjb2xvcmVkIHdvcmQgZGlmZiwgaS5lLiBjb2xvciB3b3JkcyB3aGljaCBoYXZlIGNoYW5nZWQuCisKKy0tbm8tcmVuYW1lczo6CisJVHVybiBvZmYgcmVuYW1lIGRldGVjdGlvbiwgZXZlbiB3aGVuIHRoZSBjb25maWd1cmF0aW9uCisJZmlsZSBnaXZlcyB0aGUgZGVmYXVsdCB0byBkbyBzby4KKworLS1jaGVjazo6CisJV2FybiBpZiBjaGFuZ2VzIGludHJvZHVjZSB0cmFpbGluZyB3aGl0ZXNwYWNlCisJb3IgYW4gaW5kZW50IHRoYXQgdXNlcyBhIHNwYWNlIGJlZm9yZSBhIHRhYi4gRXhpdHMgd2l0aAorCW5vbi16ZXJvIHN0YXR1cyBpZiBwcm9ibGVtcyBhcmUgZm91bmQuIE5vdCBjb21wYXRpYmxlIHdpdGgKKwktLWV4aXQtY29kZS4KKworLS1mdWxsLWluZGV4OjoKKwlJbnN0ZWFkIG9mIHRoZSBmaXJzdCBoYW5kZnVsIGNoYXJhY3RlcnMsIHNob3cgZnVsbAorCW9iamVjdCBuYW1lIG9mIHByZS0gYW5kIHBvc3QtaW1hZ2UgYmxvYiBvbiB0aGUgImluZGV4IgorCWxpbmUgd2hlbiBnZW5lcmF0aW5nIGEgcGF0Y2ggZm9ybWF0IG91dHB1dC4KKworLS1iaW5hcnk6OgorCUluIGFkZGl0aW9uIHRvIC0tZnVsbC1pbmRleCwgb3V0cHV0ICJiaW5hcnkgZGlmZiIgdGhhdAorCWNhbiBiZSBhcHBsaWVkIHdpdGggImdpdCBhcHBseSIuCisKKy0tYWJicmV2Wz08bj5dOjoKKwlJbnN0ZWFkIG9mIHNob3dpbmcgdGhlIGZ1bGwgNDAtYnl0ZSBoZXhhZGVjaW1hbCBvYmplY3QKKwluYW1lIGluIGRpZmYtcmF3IGZvcm1hdCBvdXRwdXQgYW5kIGRpZmYtdHJlZSBoZWFkZXIKKwlsaW5lcywgc2hvdyBvbmx5IGhhbmRmdWwgaGV4ZGlnaXRzIHByZWZpeC4gIFRoaXMgaXMKKwlpbmRlcGVuZGVudCBvZiAtLWZ1bGwtaW5kZXggb3B0aW9uIGFib3ZlLCB3aGljaCBjb250cm9scworCXRoZSBkaWZmLXBhdGNoIG91dHB1dCBmb3JtYXQuICBOb24gZGVmYXVsdCBudW1iZXIgb2YKKwlkaWdpdHMgY2FuIGJlIHNwZWNpZmllZCB3aXRoIC0tYWJicmV2PTxuPi4KKworLUI6OgorCUJyZWFrIGNvbXBsZXRlIHJld3JpdGUgY2hhbmdlcyBpbnRvIHBhaXJzIG9mIGRlbGV0ZSBhbmQgY3JlYXRlLgorCistTTo6CisJRGV0ZWN0IHJlbmFtZXMuCisKKy1DOjoKKwlEZXRlY3QgY29waWVzIGFzIHdlbGwgYXMgcmVuYW1lcy4gIFNlZSBhbHNvIGAtLWZpbmQtY29waWVzLWhhcmRlcmAuCisKKy0tZGlmZi1maWx0ZXI9W0FDRE1SVFVYQipdOjoKKwlTZWxlY3Qgb25seSBmaWxlcyB0aGF0IGFyZSBBZGRlZCAoYEFgKSwgQ29waWVkIChgQ2ApLAorCURlbGV0ZWQgKGBEYCksIE1vZGlmaWVkIChgTWApLCBSZW5hbWVkIChgUmApLCBoYXZlIHRoZWlyCisJdHlwZSAobW9kZSkgY2hhbmdlZCAoYFRgKSwgYXJlIFVubWVyZ2VkIChgVWApLCBhcmUKKwlVbmtub3duIChgWGApLCBvciBoYXZlIGhhZCB0aGVpciBwYWlyaW5nIEJyb2tlbiAoYEJgKS4KKwlBbnkgY29tYmluYXRpb24gb2YgdGhlIGZpbHRlciBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkLgorCVdoZW4gYCpgIChBbGwtb3Itbm9uZSkgaXMgYWRkZWQgdG8gdGhlIGNvbWJpbmF0aW9uLCBhbGwKKwlwYXRocyBhcmUgc2VsZWN0ZWQgaWYgdGhlcmUgaXMgYW55IGZpbGUgdGhhdCBtYXRjaGVzCisJb3RoZXIgY3JpdGVyaWEgaW4gdGhlIGNvbXBhcmlzb247IGlmIHRoZXJlIGlzIG5vIGZpbGUKKwl0aGF0IG1hdGNoZXMgb3RoZXIgY3JpdGVyaWEsIG5vdGhpbmcgaXMgc2VsZWN0ZWQuCisKKy0tZmluZC1jb3BpZXMtaGFyZGVyOjoKKwlGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgYnkgZGVmYXVsdCwgYC1DYCBvcHRpb24gZmluZHMgY29waWVzIG9ubHkKKwlpZiB0aGUgb3JpZ2luYWwgZmlsZSBvZiB0aGUgY29weSB3YXMgbW9kaWZpZWQgaW4gdGhlIHNhbWUKKwljaGFuZ2VzZXQuICBUaGlzIGZsYWcgbWFrZXMgdGhlIGNvbW1hbmQKKwlpbnNwZWN0IHVubW9kaWZpZWQgZmlsZXMgYXMgY2FuZGlkYXRlcyBmb3IgdGhlIHNvdXJjZSBvZgorCWNvcHkuICBUaGlzIGlzIGEgdmVyeSBleHBlbnNpdmUgb3BlcmF0aW9uIGZvciBsYXJnZQorCXByb2plY3RzLCBzbyB1c2UgaXQgd2l0aCBjYXV0aW9uLiAgR2l2aW5nIG1vcmUgdGhhbiBvbmUKKwlgLUNgIG9wdGlvbiBoYXMgdGhlIHNhbWUgZWZmZWN0LgorCistbDxudW0+OjoKKwktTSBhbmQgLUMgb3B0aW9ucyByZXF1aXJlIE8obl4yKSBwcm9jZXNzaW5nIHRpbWUgd2hlcmUgbgorCWlzIHRoZSBudW1iZXIgb2YgcG90ZW50aWFsIHJlbmFtZS9jb3B5IHRhcmdldHMuICBUaGlzCisJb3B0aW9uIHByZXZlbnRzIHJlbmFtZS9jb3B5IGRldGVjdGlvbiBmcm9tIHJ1bm5pbmcgaWYKKwl0aGUgbnVtYmVyIG9mIHJlbmFtZS9jb3B5IHRhcmdldHMgZXhjZWVkcyB0aGUgc3BlY2lmaWVkCisJbnVtYmVyLgorCistUzxzdHJpbmc+OjoKKwlMb29rIGZvciBkaWZmZXJlbmNlcyB0aGF0IGNvbnRhaW4gdGhlIGNoYW5nZSBpbiA8c3RyaW5nPi4KKworLS1waWNrYXhlLWFsbDo6CisJV2hlbiAtUyBmaW5kcyBhIGNoYW5nZSwgc2hvdyBhbGwgdGhlIGNoYW5nZXMgaW4gdGhhdAorCWNoYW5nZXNldCwgbm90IGp1c3QgdGhlIGZpbGVzIHRoYXQgY29udGFpbiB0aGUgY2hhbmdlCisJaW4gPHN0cmluZz4uCisKKy0tcGlja2F4ZS1yZWdleDo6CisJTWFrZSB0aGUgPHN0cmluZz4gbm90IGEgcGxhaW4gc3RyaW5nIGJ1dCBhbiBleHRlbmRlZCBQT1NJWAorCXJlZ2V4IHRvIG1hdGNoLgorCistTzxvcmRlcmZpbGU+OjoKKwlPdXRwdXQgdGhlIHBhdGNoIGluIHRoZSBvcmRlciBzcGVjaWZpZWQgaW4gdGhlCisJPG9yZGVyZmlsZT4sIHdoaWNoIGhhcyBvbmUgc2hlbGwgZ2xvYiBwYXR0ZXJuIHBlciBsaW5lLgorCistUjo6CisJU3dhcCB0d28gaW5wdXRzOyB0aGF0IGlzLCBzaG93IGRpZmZlcmVuY2VzIGZyb20gaW5kZXggb3IKKwlvbi1kaXNrIGZpbGUgdG8gdHJlZSBjb250ZW50cy4KKworLS1yZWxhdGl2ZVs9PHBhdGg+XTo6CisJV2hlbiBydW4gZnJvbSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCwgaXQgY2FuIGJlCisJdG9sZCB0byBleGNsdWRlIGNoYW5nZXMgb3V0c2lkZSB0aGUgZGlyZWN0b3J5IGFuZCBzaG93CisJcGF0aG5hbWVzIHJlbGF0aXZlIHRvIGl0IHdpdGggdGhpcyBvcHRpb24uICBXaGVuIHlvdSBhcmUKKwlub3QgaW4gYSBzdWJkaXJlY3RvcnkgKGUuZy4gaW4gYSBiYXJlIHJlcG9zaXRvcnkpLCB5b3UKKwljYW4gbmFtZSB3aGljaCBzdWJkaXJlY3RvcnkgdG8gbWFrZSB0aGUgb3V0cHV0IHJlbGF0aXZlCisJdG8gYnkgZ2l2aW5nIGEgPHBhdGg+IGFzIGFuIGFyZ3VtZW50LgorCistLXRleHQ6OgorCVRyZWF0IGFsbCBmaWxlcyBhcyB0ZXh0LgorCistYTo6CisJU2hvcnRoYW5kIGZvciAiLS10ZXh0Ii4KKworLS1pZ25vcmUtc3BhY2UtYXQtZW9sOjoKKwlJZ25vcmUgY2hhbmdlcyBpbiB3aGl0ZXNwYWNlIGF0IEVPTC4KKworLS1pZ25vcmUtc3BhY2UtY2hhbmdlOjoKKwlJZ25vcmUgY2hhbmdlcyBpbiBhbW91bnQgb2Ygd2hpdGVzcGFjZS4gIFRoaXMgaWdub3JlcyB3aGl0ZXNwYWNlCisJYXQgbGluZSBlbmQsIGFuZCBjb25zaWRlcnMgYWxsIG90aGVyIHNlcXVlbmNlcyBvZiBvbmUgb3IKKwltb3JlIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byBiZSBlcXVpdmFsZW50LgorCistYjo6CisJU2hvcnRoYW5kIGZvciAiLS1pZ25vcmUtc3BhY2UtY2hhbmdlIi4KKworLS1pZ25vcmUtYWxsLXNwYWNlOjoKKwlJZ25vcmUgd2hpdGVzcGFjZSB3aGVuIGNvbXBhcmluZyBsaW5lcy4gIFRoaXMgaWdub3JlcworCWRpZmZlcmVuY2VzIGV2ZW4gaWYgb25lIGxpbmUgaGFzIHdoaXRlc3BhY2Ugd2hlcmUgdGhlIG90aGVyCisJbGluZSBoYXMgbm9uZS4KKworLXc6OgorCVNob3J0aGFuZCBmb3IgIi0taWdub3JlLWFsbC1zcGFjZSIuCisKKy0tZXhpdC1jb2RlOjoKKwlNYWtlIHRoZSBwcm9ncmFtIGV4aXQgd2l0aCBjb2RlcyBzaW1pbGFyIHRvIGRpZmYoMSkuCisJVGhhdCBpcywgaXQgZXhpdHMgd2l0aCAxIGlmIHRoZXJlIHdlcmUgZGlmZmVyZW5jZXMgYW5kCisJMCBtZWFucyBubyBkaWZmZXJlbmNlcy4KKworLS1xdWlldDo6CisJRGlzYWJsZSBhbGwgb3V0cHV0IG9mIHRoZSBwcm9ncmFtLiBJbXBsaWVzIC0tZXhpdC1jb2RlLgorCistLWV4dC1kaWZmOjoKKwlBbGxvdyBhbiBleHRlcm5hbCBkaWZmIGhlbHBlciB0byBiZSBleGVjdXRlZC4gSWYgeW91IHNldCBhbgorCWV4dGVybmFsIGRpZmYgZHJpdmVyIHdpdGggbGlua2dpdDpnaXRhdHRyaWJ1dGVzWzVdLCB5b3UgbmVlZAorCXRvIHVzZSB0aGlzIG9wdGlvbiB3aXRoIGxpbmtnaXQ6Z2l0LWxvZ1sxXSBhbmQgZnJpZW5kcy4KKworLS1uby1leHQtZGlmZjo6CisJRGlzYWxsb3cgZXh0ZXJuYWwgZGlmZiBkcml2ZXJzLgorCistLXNyYy1wcmVmaXg9PHByZWZpeD46OgorCVNob3cgdGhlIGdpdmVuIHNvdXJjZSBwcmVmaXggaW5zdGVhZCBvZiAiYS8iLgorCistLWRzdC1wcmVmaXg9PHByZWZpeD46OgorCVNob3cgdGhlIGdpdmVuIGRlc3RpbmF0aW9uIHByZWZpeCBpbnN0ZWFkIG9mICJiLyIuCisKKy0tbm8tcHJlZml4OjoKKwlEbyBub3Qgc2hvdyBhbnkgc291cmNlIG9yIGRlc3RpbmF0aW9uIHByZWZpeC4KKworRm9yIG1vcmUgZGV0YWlsZWQgZXhwbGFuYXRpb24gb24gdGhlc2UgY29tbW9uIG9wdGlvbnMsIHNlZSBhbHNvCitsaW5rOmRpZmZjb3JlLmh0bWxbZGlmZmNvcmUgZG9jdW1lbnRhdGlvbl0uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RpZmZjb3JlLnR4dCBiL0RvY3VtZW50YXRpb24vZGlmZmNvcmUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YTk4M2EKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RpZmZjb3JlLnR4dApAQCAtMCwwICsxLDI3MSBAQAorVHdlYWtpbmcgZGlmZiBvdXRwdXQKKz09PT09PT09PT09PT09PT09PT09CitKdW5lIDIwMDUKKworCitJbnRyb2R1Y3Rpb24KKy0tLS0tLS0tLS0tLQorCitUaGUgZGlmZiBjb21tYW5kcyBnaXQtZGlmZi1pbmRleCwgZ2l0LWRpZmYtZmlsZXMsIGFuZCBnaXQtZGlmZi10cmVlCitjYW4gYmUgdG9sZCB0byBtYW5pcHVsYXRlIGRpZmZlcmVuY2VzIHRoZXkgZmluZCBpbgordW5jb252ZW50aW9uYWwgd2F5cyBiZWZvcmUgc2hvd2luZyBkaWZmKDEpIG91dHB1dC4gIFRoZSBtYW5pcHVsYXRpb24KK2lzIGNvbGxlY3RpdmVseSBjYWxsZWQgImRpZmZjb3JlIHRyYW5zZm9ybWF0aW9uIi4gIFRoaXMgc2hvcnQgbm90ZQorZGVzY3JpYmVzIHdoYXQgdGhleSBhcmUgYW5kIGhvdyB0byB1c2UgdGhlbSB0byBwcm9kdWNlIGRpZmYgb3V0cHV0cwordGhhdCBhcmUgZWFzaWVyIHRvIHVuZGVyc3RhbmQgdGhhbiB0aGUgY29udmVudGlvbmFsIGtpbmQuCisKKworVGhlIGNoYWluIG9mIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZ2l0LWRpZmYtKiBmYW1pbHkgd29ya3MgYnkgZmlyc3QgY29tcGFyaW5nIHR3byBzZXRzIG9mCitmaWxlczoKKworIC0gZ2l0LWRpZmYtaW5kZXggY29tcGFyZXMgY29udGVudHMgb2YgYSAidHJlZSIgb2JqZWN0IGFuZCB0aGUKKyAgIHdvcmtpbmcgZGlyZWN0b3J5ICh3aGVuICdcLS1jYWNoZWQnIGZsYWcgaXMgbm90IHVzZWQpIG9yIGEKKyAgICJ0cmVlIiBvYmplY3QgYW5kIHRoZSBpbmRleCBmaWxlICh3aGVuICdcLS1jYWNoZWQnIGZsYWcgaXMKKyAgIHVzZWQpOworCisgLSBnaXQtZGlmZi1maWxlcyBjb21wYXJlcyBjb250ZW50cyBvZiB0aGUgaW5kZXggZmlsZSBhbmQgdGhlCisgICB3b3JraW5nIGRpcmVjdG9yeTsKKworIC0gZ2l0LWRpZmYtdHJlZSBjb21wYXJlcyBjb250ZW50cyBvZiB0d28gInRyZWUiIG9iamVjdHM7CisKK0luIGFsbCBvZiB0aGVzZSBjYXNlcywgdGhlIGNvbW1hbmRzIHRoZW1zZWx2ZXMgY29tcGFyZQorY29ycmVzcG9uZGluZyBwYXRocyBpbiB0aGUgdHdvIHNldHMgb2YgZmlsZXMuICBUaGUgcmVzdWx0IG9mCitjb21wYXJpc29uIGlzIHBhc3NlZCBmcm9tIHRoZXNlIGNvbW1hbmRzIHRvIHdoYXQgaXMgaW50ZXJuYWxseQorY2FsbGVkICJkaWZmY29yZSIsIGluIGEgZm9ybWF0IHNpbWlsYXIgdG8gd2hhdCBpcyBvdXRwdXQgd2hlbgordGhlIC1wIG9wdGlvbiBpcyBub3QgdXNlZC4gIEUuZy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbi1wbGFjZSBlZGl0ICA6MTAwNjQ0IDEwMDY0NCBiY2QxMjM0Li4uIDAxMjM0NTYuLi4gTSBmaWxlMAorY3JlYXRlICAgICAgICAgOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiAxMjM0NTY3Li4uIEEgZmlsZTQKK2RlbGV0ZSAgICAgICAgIDoxMDA2NDQgMDAwMDAwIDEyMzQ1NjcuLi4gMDAwMDAwMC4uLiBEIGZpbGU1Cit1bm1lcmdlZCAgICAgICA6MDAwMDAwIDAwMDAwMCAwMDAwMDAwLi4uIDAwMDAwMDAuLi4gVSBmaWxlNgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBkaWZmY29yZSBtZWNoYW5pc20gaXMgZmVkIGEgbGlzdCBvZiBzdWNoIGNvbXBhcmlzb24gcmVzdWx0cworKGVhY2ggb2Ygd2hpY2ggaXMgY2FsbGVkICJmaWxlcGFpciIsIGFsdGhvdWdoIGF0IHRoaXMgcG9pbnQgZWFjaAorb2YgdGhlbSB0YWxrcyBhYm91dCBhIHNpbmdsZSBmaWxlKSwgYW5kIHRyYW5zZm9ybXMgc3VjaCBhIGxpc3QKK2ludG8gYW5vdGhlciBsaXN0LiAgVGhlcmUgYXJlIGN1cnJlbnRseSA2IHN1Y2ggdHJhbnNmb3JtYXRpb25zOgorCistIGRpZmZjb3JlLXBhdGhzcGVjCistIGRpZmZjb3JlLWJyZWFrCistIGRpZmZjb3JlLXJlbmFtZQorLSBkaWZmY29yZS1tZXJnZS1icm9rZW4KKy0gZGlmZmNvcmUtcGlja2F4ZQorLSBkaWZmY29yZS1vcmRlcgorCitUaGVzZSBhcmUgYXBwbGllZCBpbiBzZXF1ZW5jZS4gIFRoZSBzZXQgb2YgZmlsZXBhaXJzIGdpdC1kaWZmLVwqCitjb21tYW5kcyBmaW5kIGFyZSB1c2VkIGFzIHRoZSBpbnB1dCB0byBkaWZmY29yZS1wYXRoc3BlYywgYW5kCit0aGUgb3V0cHV0IGZyb20gZGlmZmNvcmUtcGF0aHNwZWMgaXMgdXNlZCBhcyB0aGUgaW5wdXQgdG8gdGhlCituZXh0IHRyYW5zZm9ybWF0aW9uLiAgVGhlIGZpbmFsIHJlc3VsdCBpcyB0aGVuIHBhc3NlZCB0byB0aGUKK291dHB1dCByb3V0aW5lIGFuZCBnZW5lcmF0ZXMgZWl0aGVyIGRpZmYtcmF3IGZvcm1hdCAoc2VlIE91dHB1dAorZm9ybWF0IHNlY3Rpb25zIG9mIHRoZSBtYW51YWwgZm9yIGdpdC1kaWZmLVwqIGNvbW1hbmRzKSBvcgorZGlmZi1wYXRjaCBmb3JtYXQuCisKKworZGlmZmNvcmUtcGF0aHNwZWM6IEZvciBJZ25vcmluZyBGaWxlcyBPdXRzaWRlIE91ciBDb25zaWRlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGZpcnN0IHRyYW5zZm9ybWF0aW9uIGluIHRoZSBjaGFpbiBpcyBkaWZmY29yZS1wYXRoc3BlYywgYW5kCitpcyBjb250cm9sbGVkIGJ5IGdpdmluZyB0aGUgcGF0aG5hbWUgcGFyYW1ldGVycyB0byB0aGUKK2dpdC1kaWZmLSogY29tbWFuZHMgb24gdGhlIGNvbW1hbmQgbGluZS4gIFRoZSBwYXRoc3BlYyBpcyB1c2VkCit0byBsaW1pdCB0aGUgd29ybGQgZGlmZiBvcGVyYXRlcyBpbi4gIEl0IHJlbW92ZXMgdGhlIGZpbGVwYWlycworb3V0c2lkZSB0aGUgc3BlY2lmaWVkIHNldCBvZiBwYXRobmFtZXMuICBFLmcuIElmIHRoZSBpbnB1dCBzZXQKK29mIGZpbGVwYWlycyBpbmNsdWRlZDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis6MTAwNjQ0IDEwMDY0NCBiY2QxMjM0Li4uIDAxMjM0NTYuLi4gTSBqdW5rZmlsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2J1dCB0aGUgY29tbWFuZCBpbnZvY2F0aW9uIHdhcyAiZ2l0LWRpZmYtZmlsZXMgbXlmaWxlIiwgdGhlbiB0aGUKK2p1bmtmaWxlIGVudHJ5IHdvdWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBiZWNhdXNlIG9ubHkgIm15ZmlsZSIKK2lzIHVuZGVyIGNvbnNpZGVyYXRpb24uCisKK0ltcGxlbWVudGF0aW9uIG5vdGUuICBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgZ2l0LWRpZmYtdHJlZQordXNlcyB0aGUgcGF0aG5hbWUgcGFyYW1ldGVycyBvbiB0aGUgY29tbWFuZCBsaW5lIHRvIGN1bGwgc2V0IG9mCitmaWxlcGFpcnMgaXQgZmVlZHMgdGhlIGRpZmZjb3JlIG1lY2hhbmlzbSBpdHNlbGYsIGFuZCBkb2VzIG5vdAordXNlIGRpZmZjb3JlLXBhdGhzcGVjLCBidXQgdGhlIGVuZCByZXN1bHQgaXMgdGhlIHNhbWUuCisKKworZGlmZmNvcmUtYnJlYWs6IEZvciBTcGxpdHRpbmcgVXAgIkNvbXBsZXRlIFJld3JpdGVzIgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgc2Vjb25kIHRyYW5zZm9ybWF0aW9uIGluIHRoZSBjaGFpbiBpcyBkaWZmY29yZS1icmVhaywgYW5kIGlzCitjb250cm9sbGVkIGJ5IHRoZSAtQiBvcHRpb24gdG8gdGhlIGdpdC1kaWZmLSogY29tbWFuZHMuICBUaGlzIGlzCit1c2VkIHRvIGRldGVjdCBhIGZpbGVwYWlyIHRoYXQgcmVwcmVzZW50cyAiY29tcGxldGUgcmV3cml0ZSIgYW5kCiticmVhayBzdWNoIGZpbGVwYWlyIGludG8gdHdvIGZpbGVwYWlycyB0aGF0IHJlcHJlc2VudCBkZWxldGUgYW5kCitjcmVhdGUuICBFLmcuICBJZiB0aGUgaW5wdXQgY29udGFpbmVkIHRoaXMgZmlsZXBhaXI6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOjEwMDY0NCAxMDA2NDQgYmNkMTIzNC4uLiAwMTIzNDU2Li4uIE0gZmlsZTAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbmQgaWYgaXQgZGV0ZWN0cyB0aGF0IHRoZSBmaWxlICJmaWxlMCIgaXMgY29tcGxldGVseSByZXdyaXR0ZW4sCitpdCBjaGFuZ2VzIGl0IHRvOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzoxMDA2NDQgMDAwMDAwIGJjZDEyMzQuLi4gMDAwMDAwMC4uLiBEIGZpbGUwCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIDAxMjM0NTYuLi4gQSBmaWxlMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZvciB0aGUgcHVycG9zZSBvZiBicmVha2luZyBhIGZpbGVwYWlyLCBkaWZmY29yZS1icmVhayBleGFtaW5lcwordGhlIGV4dGVudCBvZiBjaGFuZ2VzIGJldHdlZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlcyBiZWZvcmUKK2FuZCBhZnRlciBtb2RpZmljYXRpb24gKGkuZS4gdGhlIGNvbnRlbnRzIHRoYXQgaGF2ZSAiYmNkMTIzNC4uLiIKK2FuZCAiMDEyMzQ1Ni4uLiIgYXMgdGhlaXIgU0hBMSBjb250ZW50IElELCBpbiB0aGUgYWJvdmUKK2V4YW1wbGUpLiAgVGhlIGFtb3VudCBvZiBkZWxldGlvbiBvZiBvcmlnaW5hbCBjb250ZW50cyBhbmQKK2luc2VydGlvbiBvZiBuZXcgbWF0ZXJpYWwgYXJlIGFkZGVkIHRvZ2V0aGVyLCBhbmQgaWYgaXQgZXhjZWVkcwordGhlICJicmVhayBzY29yZSIsIHRoZSBmaWxlcGFpciBpcyBicm9rZW4gaW50byB0d28uICBUaGUgYnJlYWsKK3Njb3JlIGRlZmF1bHRzIHRvIDUwJSBvZiB0aGUgc2l6ZSBvZiB0aGUgc21hbGxlciBvZiB0aGUgb3JpZ2luYWwKK2FuZCB0aGUgcmVzdWx0IChpLmUuIGlmIHRoZSBlZGl0IHNocmlua3MgdGhlIGZpbGUsIHRoZSBzaXplIG9mCit0aGUgcmVzdWx0IGlzIHVzZWQ7IGlmIHRoZSBlZGl0IGxlbmd0aGVucyB0aGUgZmlsZSwgdGhlIHNpemUgb2YKK3RoZSBvcmlnaW5hbCBpcyB1c2VkKSwgYW5kIGNhbiBiZSBjdXN0b21pemVkIGJ5IGdpdmluZyBhIG51bWJlcgorYWZ0ZXIgIi1CIiBvcHRpb24gKGUuZy4gIi1CNzUiIHRvIHRlbGwgaXQgdG8gdXNlIDc1JSkuCisKKworZGlmZmNvcmUtcmVuYW1lOiBGb3IgRGV0ZWN0aW9uIFJlbmFtZXMgYW5kIENvcGllcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHRyYW5zZm9ybWF0aW9uIGlzIHVzZWQgdG8gZGV0ZWN0IHJlbmFtZXMgYW5kIGNvcGllcywgYW5kIGlzCitjb250cm9sbGVkIGJ5IHRoZSAtTSBvcHRpb24gKHRvIGRldGVjdCByZW5hbWVzKSBhbmQgdGhlIC1DIG9wdGlvbgorKHRvIGRldGVjdCBjb3BpZXMgYXMgd2VsbCkgdG8gdGhlIGdpdC1kaWZmLSogY29tbWFuZHMuICBJZiB0aGUKK2lucHV0IGNvbnRhaW5lZCB0aGVzZSBmaWxlcGFpcnM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOjEwMDY0NCAwMDAwMDAgMDEyMzQ1Ni4uLiAwMDAwMDAwLi4uIEQgZmlsZVgKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAuLi4gMDEyMzQ1Ni4uLiBBIGZpbGUwCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgZGVsZXRlZCBmaWxlIGZpbGVYIGlzIHNpbWlsYXIgZW5vdWdoIHRvCit0aGUgY29udGVudHMgb2YgdGhlIGNyZWF0ZWQgZmlsZSBmaWxlMCwgdGhlbiByZW5hbWUgZGV0ZWN0aW9uCittZXJnZXMgdGhlc2UgZmlsZXBhaXJzIGFuZCBjcmVhdGVzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzoxMDA2NDQgMTAwNjQ0IDAxMjM0NTYuLi4gMDEyMzQ1Ni4uLiBSMTAwIGZpbGVYIGZpbGUwCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hlbiB0aGUgIi1DIiBvcHRpb24gaXMgdXNlZCwgdGhlIG9yaWdpbmFsIGNvbnRlbnRzIG9mIG1vZGlmaWVkIGZpbGVzLAorYW5kIGRlbGV0ZWQgZmlsZXMgKGFuZCBhbHNvIHVubW9kaWZpZWQgZmlsZXMsIGlmIHRoZQorIlwtLWZpbmQtY29waWVzLWhhcmRlciIgb3B0aW9uIGlzIHVzZWQpIGFyZSBjb25zaWRlcmVkIGFzIGNhbmRpZGF0ZXMKK29mIHRoZSBzb3VyY2UgZmlsZXMgaW4gcmVuYW1lL2NvcHkgb3BlcmF0aW9uLiAgSWYgdGhlIGlucHV0IHdlcmUgbGlrZQordGhlc2UgZmlsZXBhaXJzLCB0aGF0IHRhbGsgYWJvdXQgYSBtb2RpZmllZCBmaWxlIGZpbGVZIGFuZCBhIG5ld2x5CitjcmVhdGVkIGZpbGUgZmlsZTA6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOjEwMDY0NCAxMDA2NDQgMDEyMzQ1Ni4uLiAxMjM0NTY3Li4uIE0gZmlsZVkKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAuLi4gYmNkMzQ1Ni4uLiBBIGZpbGUwCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGhlIG9yaWdpbmFsIGNvbnRlbnRzIG9mIGZpbGVZIGFuZCB0aGUgcmVzdWx0aW5nIGNvbnRlbnRzIG9mCitmaWxlMCBhcmUgY29tcGFyZWQsIGFuZCBpZiB0aGV5IGFyZSBzaW1pbGFyIGVub3VnaCwgdGhleSBhcmUKK2NoYW5nZWQgdG86CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOjEwMDY0NCAxMDA2NDQgMDEyMzQ1Ni4uLiAxMjM0NTY3Li4uIE0gZmlsZVkKKzoxMDA2NDQgMTAwNjQ0IDAxMjM0NTYuLi4gYmNkMzQ1Ni4uLiBDMTAwIGZpbGVZIGZpbGUwCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW4gYm90aCByZW5hbWUgYW5kIGNvcHkgZGV0ZWN0aW9uLCB0aGUgc2FtZSAiZXh0ZW50IG9mIGNoYW5nZXMiCithbGdvcml0aG0gdXNlZCBpbiBkaWZmY29yZS1icmVhayBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB0d28KK2ZpbGVzIGFyZSAic2ltaWxhciBlbm91Z2giLCBhbmQgY2FuIGJlIGN1c3RvbWl6ZWQgdG8gdXNlCithIHNpbWlsYXJpdHkgc2NvcmUgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgb2YgNTAlIGJ5IGdpdmluZyBhCitudW1iZXIgYWZ0ZXIgdGhlICItTSIgb3IgIi1DIiBvcHRpb24gKGUuZy4gIi1NOCIgdG8gdGVsbCBpdCB0byB1c2UKKzgvMTAgPSA4MCUpLgorCitOb3RlLiAgV2hlbiB0aGUgIi1DIiBvcHRpb24gaXMgdXNlZCB3aXRoIGBcLS1maW5kLWNvcGllcy1oYXJkZXJgCitvcHRpb24sIGdpdC1kaWZmLVwqIGNvbW1hbmRzIGZlZWQgdW5tb2RpZmllZCBmaWxlcGFpcnMgdG8KK2RpZmZjb3JlIG1lY2hhbmlzbSBhcyB3ZWxsIGFzIG1vZGlmaWVkIG9uZXMuICBUaGlzIGxldHMgdGhlIGNvcHkKK2RldGVjdG9yIGNvbnNpZGVyIHVubW9kaWZpZWQgZmlsZXMgYXMgY29weSBzb3VyY2UgY2FuZGlkYXRlcyBhdAordGhlIGV4cGVuc2Ugb2YgbWFraW5nIGl0IHNsb3dlci4gIFdpdGhvdXQgYFwtLWZpbmQtY29waWVzLWhhcmRlcmAsCitnaXQtZGlmZi1cKiBjb21tYW5kcyBjYW4gZGV0ZWN0IGNvcGllcyBvbmx5IGlmIHRoZSBmaWxlIHRoYXQgd2FzCitjb3BpZWQgaGFwcGVuZWQgdG8gaGF2ZSBiZWVuIG1vZGlmaWVkIGluIHRoZSBzYW1lIGNoYW5nZXNldC4KKworCitkaWZmY29yZS1tZXJnZS1icm9rZW46IEZvciBQdXR0aW5nICJDb21wbGV0ZSBSZXdyaXRlcyIgQmFjayBUb2dldGhlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyB1c2VkIHRvIG1lcmdlIGZpbGVwYWlycyBicm9rZW4gYnkKK2RpZmZjb3JlLWJyZWFrLCBhbmQgbm90IHRyYW5zZm9ybWVkIGludG8gcmVuYW1lL2NvcHkgYnkKK2RpZmZjb3JlLXJlbmFtZSwgYmFjayBpbnRvIGEgc2luZ2xlIG1vZGlmaWNhdGlvbi4gIFRoaXMgYWx3YXlzCitydW5zIHdoZW4gZGlmZmNvcmUtYnJlYWsgaXMgdXNlZC4KKworRm9yIHRoZSBwdXJwb3NlIG9mIG1lcmdpbmcgYnJva2VuIGZpbGVwYWlycyBiYWNrLCBpdCB1c2VzIGEKK2RpZmZlcmVudCAiZXh0ZW50IG9mIGNoYW5nZXMiIGNvbXB1dGF0aW9uIGZyb20gdGhlIG9uZXMgdXNlZCBieQorZGlmZmNvcmUtYnJlYWsgYW5kIGRpZmZjb3JlLXJlbmFtZS4gIEl0IGNvdW50cyBvbmx5IHRoZSBkZWxldGlvbgorZnJvbSB0aGUgb3JpZ2luYWwsIGFuZCBkb2VzIG5vdCBjb3VudCBpbnNlcnRpb24uICBJZiB5b3UgcmVtb3ZlZAorb25seSAxMCBsaW5lcyBmcm9tIGEgMTAwLWxpbmUgZG9jdW1lbnQsIGV2ZW4gaWYgeW91IGFkZGVkIDkxMAorbmV3IGxpbmVzIHRvIG1ha2UgYSBuZXcgMTAwMC1saW5lIGRvY3VtZW50LCB5b3UgZGlkIG5vdCBkbyBhCitjb21wbGV0ZSByZXdyaXRlLiAgZGlmZmNvcmUtYnJlYWsgYnJlYWtzIHN1Y2ggYSBjYXNlIGluIG9yZGVyIHRvCitoZWxwIGRpZmZjb3JlLXJlbmFtZSB0byBjb25zaWRlciBzdWNoIGZpbGVwYWlycyBhcyBjYW5kaWRhdGUgb2YKK3JlbmFtZS9jb3B5IGRldGVjdGlvbiwgYnV0IGlmIGZpbGVwYWlycyBicm9rZW4gdGhhdCB3YXkgd2VyZSBub3QKK21hdGNoZWQgd2l0aCBvdGhlciBmaWxlcGFpcnMgdG8gY3JlYXRlIHJlbmFtZS9jb3B5LCB0aGVuIHRoaXMKK3RyYW5zZm9ybWF0aW9uIG1lcmdlcyB0aGVtIGJhY2sgaW50byB0aGUgb3JpZ2luYWwKKyJtb2RpZmljYXRpb24iLgorCitUaGUgImV4dGVudCBvZiBjaGFuZ2VzIiBwYXJhbWV0ZXIgY2FuIGJlIHR3ZWFrZWQgZnJvbSB0aGUKK2RlZmF1bHQgODAlICh0aGF0IGlzLCB1bmxlc3MgbW9yZSB0aGFuIDgwJSBvZiB0aGUgb3JpZ2luYWwKK21hdGVyaWFsIGlzIGRlbGV0ZWQsIHRoZSBicm9rZW4gcGFpcnMgYXJlIG1lcmdlZCBiYWNrIGludG8gYQorc2luZ2xlIG1vZGlmaWNhdGlvbikgYnkgZ2l2aW5nIGEgc2Vjb25kIG51bWJlciB0byAtQiBvcHRpb24sCitsaWtlIHRoZXNlOgorCisqIC1CNTAvNjAgKGdpdmUgNTAlICJicmVhayBzY29yZSIgdG8gZGlmZmNvcmUtYnJlYWssIHVzZSA2MCUKKyAgZm9yIGRpZmZjb3JlLW1lcmdlLWJyb2tlbikuCisKKyogLUIvNjAgKHRoZSBzYW1lIGFzIGFib3ZlLCBzaW5jZSBkaWZmY29yZS1icmVhayBkZWZhdWx0cyB0byA1MCUpLgorCitOb3RlIHRoYXQgZWFybGllciBpbXBsZW1lbnRhdGlvbiBsZWZ0IGEgYnJva2VuIHBhaXIgYXMgYSBzZXBhcmF0ZQorY3JlYXRpb24gYW5kIGRlbGV0aW9uIHBhdGNoZXMuICBUaGlzIHdhcyBhbiB1bm5lY2Vzc2FyeSBoYWNrIGFuZAordGhlIGxhdGVzdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgbWVyZ2VzIGFsbCB0aGUgYnJva2VuIHBhaXJzCitiYWNrIGludG8gbW9kaWZpY2F0aW9ucywgYnV0IHRoZSByZXN1bHRpbmcgcGF0Y2ggb3V0cHV0IGlzCitmb3JtYXR0ZWQgZGlmZmVyZW50bHkgZm9yIGVhc2llciByZXZpZXcgaW4gY2FzZSBvZiBzdWNoCithIGNvbXBsZXRlIHJld3JpdGUgYnkgc2hvd2luZyB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIG9sZCB2ZXJzaW9uCitwcmVmaXhlZCB3aXRoICctJywgZm9sbG93ZWQgYnkgdGhlIGVudGlyZSBjb250ZW50cyBvZiBuZXcKK3ZlcnNpb24gcHJlZml4ZWQgd2l0aCAnKycuCisKKworZGlmZmNvcmUtcGlja2F4ZTogRm9yIERldGVjdGluZyBBZGRpdGlvbi9EZWxldGlvbiBvZiBTcGVjaWZpZWQgU3RyaW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyB1c2VkIHRvIGZpbmQgZmlsZXBhaXJzIHRoYXQgcmVwcmVzZW50CitjaGFuZ2VzIHRoYXQgdG91Y2ggYSBzcGVjaWZpZWQgc3RyaW5nLCBhbmQgaXMgY29udHJvbGxlZCBieSB0aGUKKy1TIG9wdGlvbiBhbmQgdGhlIGBcLS1waWNrYXhlLWFsbGAgb3B0aW9uIHRvIHRoZSBnaXQtZGlmZi0qCitjb21tYW5kcy4KKworV2hlbiBkaWZmY29yZS1waWNrYXhlIGlzIGluIHVzZSwgaXQgY2hlY2tzIGlmIHRoZXJlIGFyZQorZmlsZXBhaXJzIHdob3NlICJvcmlnaW5hbCIgc2lkZSBoYXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kCit3aG9zZSAicmVzdWx0IiBzaWRlIGRvZXMgbm90LiAgU3VjaCBhIGZpbGVwYWlyIHJlcHJlc2VudHMgInRoZQorc3RyaW5nIGFwcGVhcmVkIGluIHRoaXMgY2hhbmdlc2V0Ii4gIEl0IGFsc28gY2hlY2tzIGZvciB0aGUKK29wcG9zaXRlIGNhc2UgdGhhdCBsb3NlcyB0aGUgc3BlY2lmaWVkIHN0cmluZy4KKworV2hlbiBgXC0tcGlja2F4ZS1hbGxgIGlzIG5vdCBpbiBlZmZlY3QsIGRpZmZjb3JlLXBpY2theGUgbGVhdmVzCitvbmx5IHN1Y2ggZmlsZXBhaXJzIHRoYXQgdG91Y2ggdGhlIHNwZWNpZmllZCBzdHJpbmcgaW4gaXRzCitvdXRwdXQuICBXaGVuIGBcLS1waWNrYXhlLWFsbGAgaXMgdXNlZCwgZGlmZmNvcmUtcGlja2F4ZSBsZWF2ZXMgYWxsCitmaWxlcGFpcnMgaW50YWN0IGlmIHRoZXJlIGlzIHN1Y2ggYSBmaWxlcGFpciwgb3IgbWFrZXMgdGhlCitvdXRwdXQgZW1wdHkgb3RoZXJ3aXNlLiAgVGhlIGxhdHRlciBiZWhhdmlvdXIgaXMgZGVzaWduZWQgdG8KK21ha2UgcmV2aWV3aW5nIG9mIHRoZSBjaGFuZ2VzIGluIHRoZSBjb250ZXh0IG9mIHRoZSB3aG9sZQorY2hhbmdlc2V0IGVhc2llci4KKworCitkaWZmY29yZS1vcmRlcjogRm9yIFNvcnRpbmcgdGhlIE91dHB1dCBCYXNlZCBvbiBGaWxlbmFtZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGlzIHVzZWQgdG8gcmVvcmRlciB0aGUgZmlsZXBhaXJzIGFjY29yZGluZyB0byB0aGUgdXNlcidzCisob3IgcHJvamVjdCdzKSB0YXN0ZSwgYW5kIGlzIGNvbnRyb2xsZWQgYnkgdGhlIC1PIG9wdGlvbiB0byB0aGUKK2dpdC1kaWZmLSogY29tbWFuZHMuCisKK1RoaXMgdGFrZXMgYSB0ZXh0IGZpbGUgZWFjaCBvZiB3aG9zZSBsaW5lcyBpcyBhIHNoZWxsIGdsb2IKK3BhdHRlcm4uICBGaWxlcGFpcnMgdGhhdCBtYXRjaCBhIGdsb2IgcGF0dGVybiBvbiBhbiBlYXJsaWVyIGxpbmUKK2luIHRoZSBmaWxlIGFyZSBvdXRwdXQgYmVmb3JlIG9uZXMgdGhhdCBtYXRjaCBhIGxhdGVyIGxpbmUsIGFuZAorZmlsZXBhaXJzIHRoYXQgZG8gbm90IG1hdGNoIGFueSBnbG9iIHBhdHRlcm4gYXJlIG91dHB1dCBsYXN0LgorCitBcyBhbiBleGFtcGxlLCBhIHR5cGljYWwgb3JkZXJmaWxlIGZvciB0aGUgY29yZSBnaXQgcHJvYmFibHkKK3dvdWxkIGxvb2sgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JFQURNRQorTWFrZWZpbGUKK0RvY3VtZW50YXRpb24KKyouaAorKi5jCit0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZG9jYm9vay14c2wuY3NzIGIvRG9jdW1lbnRhdGlvbi9kb2Nib29rLXhzbC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg3OGIzOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZG9jYm9vay14c2wuY3NzCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICBDU1Mgc3R5bGVzaGVldCBmb3IgWEhUTUwgcHJvZHVjZWQgYnkgRG9jQm9vayBYU0wgc3R5bGVzaGVldHMuCisgIFRlc3RlZCB3aXRoIFhTTCBzdHlsZXNoZWV0cyAxLjYxLjIsIDEuNjcuMgorKi8KKworc3Bhbi5zdHJvbmcgeworICBmb250LXdlaWdodDogYm9sZDsKK30KKworYm9keSBibG9ja3F1b3RlIHsKKyAgbWFyZ2luLXRvcDogLjc1ZW07CisgIGxpbmUtaGVpZ2h0OiAxLjU7CisgIG1hcmdpbi1ib3R0b206IC43NWVtOworfQorCitodG1sIGJvZHkgeworICBtYXJnaW46IDFlbSA1JSAxZW0gNSU7CisgIGxpbmUtaGVpZ2h0OiAxLjI7Cit9CisKK2JvZHkgZGl2IHsKKyAgbWFyZ2luOiAwOworfQorCitoMSwgaDIsIGgzLCBoNCwgaDUsIGg2LAorZGl2LnRvYyBwIGIsCitkaXYubGlzdC1vZi1maWd1cmVzIHAgYiwKK2Rpdi5saXN0LW9mLXRhYmxlcyBwIGIsCitkaXYuYWJzdHJhY3QgcC50aXRsZQoreworICBjb2xvcjogIzUyN2JiZDsKKyAgZm9udC1mYW1pbHk6IHRhaG9tYSwgdmVyZGFuYSwgc2Fucy1zZXJpZjsKK30KKworZGl2LnRvYyBwOmZpcnN0LWNoaWxkLAorZGl2Lmxpc3Qtb2YtZmlndXJlcyBwOmZpcnN0LWNoaWxkLAorZGl2Lmxpc3Qtb2YtdGFibGVzIHA6Zmlyc3QtY2hpbGQsCitkaXYuZXhhbXBsZSBwLnRpdGxlCit7CisgIG1hcmdpbi1ib3R0b206IDAuMmVtOworfQorCitib2R5IGgxIHsKKyAgbWFyZ2luOiAuMGVtIDAgMCAtNCU7CisgIGxpbmUtaGVpZ2h0OiAxLjM7CisgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCBzaWx2ZXI7Cit9CisKK2JvZHkgaDIgeworICBtYXJnaW46IDAuNWVtIDAgMCAtNCU7CisgIGxpbmUtaGVpZ2h0OiAxLjM7CisgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCBzaWx2ZXI7Cit9CisKK2JvZHkgaDMgeworICBtYXJnaW46IC44ZW0gMCAwIC0zJTsKKyAgbGluZS1oZWlnaHQ6IDEuMzsKK30KKworYm9keSBoNCB7CisgIG1hcmdpbjogLjhlbSAwIDAgLTMlOworICBsaW5lLWhlaWdodDogMS4zOworfQorCitib2R5IGg1IHsKKyAgbWFyZ2luOiAuOGVtIDAgMCAtMiU7CisgIGxpbmUtaGVpZ2h0OiAxLjM7Cit9CisKK2JvZHkgaDYgeworICBtYXJnaW46IC44ZW0gMCAwIC0xJTsKKyAgbGluZS1oZWlnaHQ6IDEuMzsKK30KKworYm9keSBociB7CisgIGJvcmRlcjogbm9uZTsgLyogQnJva2VuIG9uIElFNiAqLworfQorZGl2LmZvb3Rub3RlcyBociB7CisgIGJvcmRlcjogMXB4IHNvbGlkIHNpbHZlcjsKK30KKworZGl2Lm5hdmhlYWRlciB0aCwgZGl2Lm5hdmhlYWRlciB0ZCwgZGl2Lm5hdmZvb3RlciB0ZCB7CisgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOworICBmb250LXNpemU6IDAuOWVtOworICBmb250LXdlaWdodDogYm9sZDsKKyAgY29sb3I6ICM1MjdiYmQ7Cit9CitkaXYubmF2aGVhZGVyIGltZywgZGl2Lm5hdmZvb3RlciBpbWcgeworICBib3JkZXItc3R5bGU6IG5vbmU7Cit9CitkaXYubmF2aGVhZGVyIGEsIGRpdi5uYXZmb290ZXIgYSB7CisgIGZvbnQtd2VpZ2h0OiBub3JtYWw7Cit9CitkaXYubmF2Zm9vdGVyIGhyIHsKKyAgYm9yZGVyOiAxcHggc29saWQgc2lsdmVyOworfQorCitib2R5IHRkIHsKKyAgbGluZS1oZWlnaHQ6IDEuMgorfQorCitib2R5IHRoIHsKKyAgbGluZS1oZWlnaHQ6IDEuMjsKK30KKworb2wgeworICBsaW5lLWhlaWdodDogMS4yOworfQorCit1bCwgYm9keSBkaXIsIGJvZHkgbWVudSB7CisgIGxpbmUtaGVpZ2h0OiAxLjI7Cit9CisKK2h0bWwgeworICBtYXJnaW46IDA7CisgIHBhZGRpbmc6IDA7Cit9CisKK2JvZHkgaDEsIGJvZHkgaDIsIGJvZHkgaDMsIGJvZHkgaDQsIGJvZHkgaDUsIGJvZHkgaDYgeworICBtYXJnaW4tbGVmdDogMAorfQorCitib2R5IHByZSB7CisgIG1hcmdpbjogMC41ZW0gMTAlIDAuNWVtIDFlbTsKKyAgbGluZS1oZWlnaHQ6IDEuMDsKKyAgY29sb3I6IG5hdnk7Cit9CisKK3R0LmxpdGVyYWwsIGNvZGUubGl0ZXJhbCB7CisgIGNvbG9yOiBuYXZ5OworfQorCitkaXYubGl0ZXJhbGxheW91dCBwIHsKKyAgcGFkZGluZzogMGVtOworICBtYXJnaW46IDBlbTsKK30KKworZGl2LmxpdGVyYWxsYXlvdXQgeworICBmb250LWZhbWlseTogbW9ub3NwYWNlOworIyAgbWFyZ2luOiAwLjVlbSAxMCUgMC41ZW0gMWVtOworICBtYXJnaW46IDBlbTsKKyAgY29sb3I6IG5hdnk7CisgIGJvcmRlcjogMXB4IHNvbGlkIHNpbHZlcjsKKyAgYmFja2dyb3VuZDogI2Y0ZjRmNDsKKyAgcGFkZGluZzogMC41ZW07Cit9CisKKy5wcm9ncmFtbGlzdGluZywgLnNjcmVlbiB7CisgIGJvcmRlcjogMXB4IHNvbGlkIHNpbHZlcjsKKyAgYmFja2dyb3VuZDogI2Y0ZjRmNDsKKyAgbWFyZ2luOiAwLjVlbSAxMCUgMC41ZW0gMDsKKyAgcGFkZGluZzogMC41ZW0gMWVtOworfQorCitkaXYuc2lkZWJhciB7CisgIGJhY2tncm91bmQ6ICNmZmZmZWU7CisgIG1hcmdpbjogMS4wZW0gMTAlIDAuNWVtIDA7CisgIHBhZGRpbmc6IDAuNWVtIDFlbTsKKyAgYm9yZGVyOiAxcHggc29saWQgc2lsdmVyOworfQorZGl2LnNpZGViYXIgKiB7IHBhZGRpbmc6IDA7IH0KK2Rpdi5zaWRlYmFyIGRpdiB7IG1hcmdpbjogMDsgfQorZGl2LnNpZGViYXIgcC50aXRsZSB7CisgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOworICBtYXJnaW4tdG9wOiAwLjVlbTsKKyAgbWFyZ2luLWJvdHRvbTogMC4yZW07Cit9CisKK2Rpdi5iaWJsaW9taXhlZCB7CisgIG1hcmdpbjogMC41ZW0gNSUgMC41ZW0gMWVtOworfQorCitkaXYuZ2xvc3NhcnkgZHQgeworICBmb250LXdlaWdodDogYm9sZDsKK30KK2Rpdi5nbG9zc2FyeSBkZCBwIHsKKyAgbWFyZ2luLXRvcDogMC4yZW07Cit9CisKK2RsIHsKKyAgbWFyZ2luOiAuOGVtIDA7CisgIGxpbmUtaGVpZ2h0OiAxLjI7Cit9CisKK2R0IHsKKyAgbWFyZ2luLXRvcDogMC41ZW07Cit9CisKK2R0IHNwYW4udGVybSB7CisgIGZvbnQtc3R5bGU6IGl0YWxpYzsKK30KKworZGl2LnZhcmlhYmxlbGlzdCBkZCBwIHsKKyAgbWFyZ2luLXRvcDogMDsKK30KKworZGl2Lml0ZW1pemVkbGlzdCBsaSwgZGl2Lm9yZGVyZWRsaXN0IGxpIHsKKyAgbWFyZ2luLWxlZnQ6IC0wLjhlbTsKKyAgbWFyZ2luLXRvcDogMC41ZW07Cit9CisKK3VsLCBvbCB7CisgICAgbGlzdC1zdHlsZS1wb3NpdGlvbjogb3V0c2lkZTsKK30KKworZGl2LnNpZGViYXIgdWwsIGRpdi5zaWRlYmFyIG9sIHsKKyAgICBtYXJnaW4tbGVmdDogMi44ZW07Cit9CisKK2Rpdi5pdGVtaXplZGxpc3QgcC50aXRsZSwKK2Rpdi5vcmRlcmVkbGlzdCBwLnRpdGxlLAorZGl2LnZhcmlhYmxlbGlzdCBwLnRpdGxlCit7CisgIG1hcmdpbi1ib3R0b206IC0wLjhlbTsKK30KKworZGl2LnJldmhpc3RvcnkgdGFibGUgeworICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICBib3JkZXI6IG5vbmU7Cit9CitkaXYucmV2aGlzdG9yeSB0aCB7CisgIGJvcmRlcjogbm9uZTsKKyAgY29sb3I6ICM1MjdiYmQ7CisgIGZvbnQtZmFtaWx5OiB0YWhvbWEsIHZlcmRhbmEsIHNhbnMtc2VyaWY7Cit9CitkaXYucmV2aGlzdG9yeSB0ZCB7CisgIGJvcmRlcjogMXB4IHNvbGlkIHNpbHZlcjsKK30KKworLyogS2VlcCBUT0MgYW5kIGluZGV4IGxpbmVzIGNsb3NlIHRvZ2V0aGVyLiAqLworZGl2LnRvYyBkbCwgZGl2LnRvYyBkdCwKK2Rpdi5saXN0LW9mLWZpZ3VyZXMgZGwsIGRpdi5saXN0LW9mLWZpZ3VyZXMgZHQsCitkaXYubGlzdC1vZi10YWJsZXMgZGwsIGRpdi5saXN0LW9mLXRhYmxlcyBkdCwKK2Rpdi5pbmRleGRpdiBkbCwgZGl2LmluZGV4ZGl2IGR0Cit7CisgIGxpbmUtaGVpZ2h0OiBub3JtYWw7CisgIG1hcmdpbi10b3A6IDA7CisgIG1hcmdpbi1ib3R0b206IDA7Cit9CisKKy8qCisgIFRhYmxlIHN0eWxpbmcgZG9lcyBub3Qgd29yayBiZWNhdXNlIG9mIG92ZXJyaWRpbmcgYXR0cmlidXRlcyBpbgorICBnZW5lcmF0ZWQgSFRNTC4KKyovCitkaXYudGFibGUgdGFibGUsCitkaXYuaW5mb3JtYWx0YWJsZSB0YWJsZQoreworICAgIG1hcmdpbi1sZWZ0OiAwOworICAgIG1hcmdpbi1yaWdodDogNSU7CisgICAgbWFyZ2luLWJvdHRvbTogMC44ZW07Cit9CitkaXYuaW5mb3JtYWx0YWJsZSB0YWJsZQoreworICAgIG1hcmdpbi10b3A6IDAuNGVtCit9CitkaXYudGFibGUgdGhlYWQsCitkaXYudGFibGUgdGZvb3QsCitkaXYudGFibGUgdGJvZHksCitkaXYuaW5mb3JtYWx0YWJsZSB0aGVhZCwKK2Rpdi5pbmZvcm1hbHRhYmxlIHRmb290LAorZGl2LmluZm9ybWFsdGFibGUgdGJvZHkKK3sKKyAgICAvKiBObyBlZmZlY3QgaW4gSUU2LiAqLworICAgIGJvcmRlci10b3A6IDJweCBzb2xpZCAjNTI3YmJkOworICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjNTI3YmJkOworfQorZGl2LnRhYmxlIHRoZWFkLCBkaXYudGFibGUgdGZvb3QsCitkaXYuaW5mb3JtYWx0YWJsZSB0aGVhZCwgZGl2LmluZm9ybWFsdGFibGUgdGZvb3QKK3sKKyAgICBmb250LXdlaWdodDogYm9sZDsKK30KKworZGl2Lm1lZGlhb2JqZWN0IGltZyB7CisgICAgYm9yZGVyOiAxcHggc29saWQgc2lsdmVyOworICAgIG1hcmdpbi1ib3R0b206IDAuOGVtOworfQorZGl2LmZpZ3VyZSBwLnRpdGxlLAorZGl2LnRhYmxlIHAudGl0bGUKK3sKKyAgbWFyZ2luLXRvcDogMWVtOworICBtYXJnaW4tYm90dG9tOiAwLjRlbTsKK30KKworQG1lZGlhIHByaW50IHsKKyAgZGl2Lm5hdmhlYWRlciwgZGl2Lm5hdmZvb3RlciB7IGRpc3BsYXk6IG5vbmU7IH0KK30KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZG9jYm9vay54c2wgYi9Eb2N1bWVudGF0aW9uL2RvY2Jvb2sueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNjkxMmMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RvY2Jvb2sueHNsCkBAIC0wLDAgKzEsNSBAQAorPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgorCQl2ZXJzaW9uPScxLjAnPgorIDx4c2w6aW1wb3J0IGhyZWY9Imh0dHA6Ly9kb2Nib29rLnNvdXJjZWZvcmdlLm5ldC9yZWxlYXNlL3hzbC9jdXJyZW50L2h0bWwvZG9jYm9vay54c2wiLz4KKyA8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGVuY29kaW5nPSJVVEYtOCIgaW5kZW50PSJubyIgLz4KKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2V2ZXJ5ZGF5LnR4dCBiL0RvY3VtZW50YXRpb24vZXZlcnlkYXkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYmQxNWEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2V2ZXJ5ZGF5LnR4dApAQCAtMCwwICsxLDQ1OCBAQAorRXZlcnlkYXkgR0lUIFdpdGggMjAgQ29tbWFuZHMgT3IgU28KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzw8QmFzaWMgUmVwb3NpdG9yeT4+IGNvbW1hbmRzIGFyZSBuZWVkZWQgYnkgcGVvcGxlIHdobyBoYXZlIGEKK3JlcG9zaXRvcnkgLS0tIHRoYXQgaXMgZXZlcnlib2R5LCBiZWNhdXNlIGV2ZXJ5IHdvcmtpbmcgdHJlZSBvZgorZ2l0IGlzIGEgcmVwb3NpdG9yeS4KKworSW4gYWRkaXRpb24sIDw8SW5kaXZpZHVhbCBEZXZlbG9wZXIgKFN0YW5kYWxvbmUpPj4gY29tbWFuZHMgYXJlCitlc3NlbnRpYWwgZm9yIGFueWJvZHkgd2hvIG1ha2VzIGEgY29tbWl0LCBldmVuIGZvciBzb21lYm9keSB3aG8KK3dvcmtzIGFsb25lLgorCitJZiB5b3Ugd29yayB3aXRoIG90aGVyIHBlb3BsZSwgeW91IHdpbGwgbmVlZCBjb21tYW5kcyBsaXN0ZWQgaW4KK3RoZSA8PEluZGl2aWR1YWwgRGV2ZWxvcGVyIChQYXJ0aWNpcGFudCk+PiBzZWN0aW9uIGFzIHdlbGwuCisKK1Blb3BsZSB3aG8gcGxheSB0aGUgPDxJbnRlZ3JhdG9yPj4gcm9sZSBuZWVkIHRvIGxlYXJuIHNvbWUgbW9yZQorY29tbWFuZHMgaW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlLgorCis8PFJlcG9zaXRvcnkgQWRtaW5pc3RyYXRpb24+PiBjb21tYW5kcyBhcmUgZm9yIHN5c3RlbQorYWRtaW5pc3RyYXRvcnMgd2hvIGFyZSByZXNwb25zaWJsZSBmb3IgdGhlIGNhcmUgYW5kIGZlZWRpbmcKK29mIGdpdCByZXBvc2l0b3JpZXMuCisKKworQmFzaWMgUmVwb3NpdG9yeVtbQmFzaWMgUmVwb3NpdG9yeV1dCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRXZlcnlib2R5IHVzZXMgdGhlc2UgY29tbWFuZHMgdG8gbWFpbnRhaW4gZ2l0IHJlcG9zaXRvcmllcy4KKworICAqIGxpbmtnaXQ6Z2l0LWluaXRbMV0gb3IgbGlua2dpdDpnaXQtY2xvbmVbMV0gdG8gY3JlYXRlIGEKKyAgICBuZXcgcmVwb3NpdG9yeS4KKworICAqIGxpbmtnaXQ6Z2l0LWZzY2tbMV0gdG8gY2hlY2sgdGhlIHJlcG9zaXRvcnkgZm9yIGVycm9ycy4KKworICAqIGxpbmtnaXQ6Z2l0LWdjWzFdIHRvIGRvIGNvbW1vbiBob3VzZWtlZXBpbmcgdGFza3Mgc3VjaCBhcworICAgIHJlcGFjayBhbmQgcHJ1bmUuCisKK0V4YW1wbGVzCit+fn5+fn5+fgorCitDaGVjayBoZWFsdGggYW5kIHJlbW92ZSBjcnVmdC46OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBmc2NrIDwxPgorJCBnaXQgY291bnQtb2JqZWN0cyA8Mj4KKyQgZ2l0IGdjIDwzPgorLS0tLS0tLS0tLS0tCisrCis8MT4gcnVubmluZyB3aXRob3V0IGBcLS1mdWxsYCBpcyB1c3VhbGx5IGNoZWFwIGFuZCBhc3N1cmVzIHRoZQorcmVwb3NpdG9yeSBoZWFsdGggcmVhc29uYWJseSB3ZWxsLgorPDI+IGNoZWNrIGhvdyBtYW55IGxvb3NlIG9iamVjdHMgdGhlcmUgYXJlIGFuZCBob3cgbXVjaAorZGlzayBzcGFjZSBpcyB3YXN0ZWQgYnkgbm90IHJlcGFja2luZy4KKzwzPiByZXBhY2tzIHRoZSBsb2NhbCByZXBvc2l0b3J5IGFuZCBwZXJmb3JtcyBvdGhlciBob3VzZWtlZXBpbmcgdGFza3MuIFJ1bm5pbmcKK3dpdGhvdXQgYC0tcHJ1bmVgIGlzIGEgc2FmZSBvcGVyYXRpb24gZXZlbiB3aGlsZSBvdGhlciBvbmVzIGFyZSBpbiBwcm9ncmVzcy4KKworUmVwYWNrIGEgc21hbGwgcHJvamVjdCBpbnRvIHNpbmdsZSBwYWNrLjo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGdjIDwxPgorJCBnaXQgZ2MgLS1wcnVuZQorLS0tLS0tLS0tLS0tCisrCis8MT4gcGFjayBhbGwgdGhlIG9iamVjdHMgcmVhY2hhYmxlIGZyb20gdGhlIHJlZnMgaW50byBvbmUgcGFjaywKK3RoZW4gcmVtb3ZlIHRoZSBvdGhlciBwYWNrcy4KKworCitJbmRpdmlkdWFsIERldmVsb3BlciAoU3RhbmRhbG9uZSlbW0luZGl2aWR1YWwgRGV2ZWxvcGVyIChTdGFuZGFsb25lKV1dCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Egc3RhbmRhbG9uZSBpbmRpdmlkdWFsIGRldmVsb3BlciBkb2VzIG5vdCBleGNoYW5nZSBwYXRjaGVzIHdpdGgKK290aGVyIHBlb3BsZSwgYW5kIHdvcmtzIGFsb25lIGluIGEgc2luZ2xlIHJlcG9zaXRvcnksIHVzaW5nIHRoZQorZm9sbG93aW5nIGNvbW1hbmRzLgorCisgICogbGlua2dpdDpnaXQtc2hvdy1icmFuY2hbMV0gdG8gc2VlIHdoZXJlIHlvdSBhcmUuCisKKyAgKiBsaW5rZ2l0OmdpdC1sb2dbMV0gdG8gc2VlIHdoYXQgaGFwcGVuZWQuCisKKyAgKiBsaW5rZ2l0OmdpdC1jaGVja291dFsxXSBhbmQgbGlua2dpdDpnaXQtYnJhbmNoWzFdIHRvIHN3aXRjaAorICAgIGJyYW5jaGVzLgorCisgICogbGlua2dpdDpnaXQtYWRkWzFdIHRvIG1hbmFnZSB0aGUgaW5kZXggZmlsZS4KKworICAqIGxpbmtnaXQ6Z2l0LWRpZmZbMV0gYW5kIGxpbmtnaXQ6Z2l0LXN0YXR1c1sxXSB0byBzZWUgd2hhdAorICAgIHlvdSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBkb2luZy4KKworICAqIGxpbmtnaXQ6Z2l0LWNvbW1pdFsxXSB0byBhZHZhbmNlIHRoZSBjdXJyZW50IGJyYW5jaC4KKworICAqIGxpbmtnaXQ6Z2l0LXJlc2V0WzFdIGFuZCBsaW5rZ2l0OmdpdC1jaGVja291dFsxXSAod2l0aAorICAgIHBhdGhuYW1lIHBhcmFtZXRlcnMpIHRvIHVuZG8gY2hhbmdlcy4KKworICAqIGxpbmtnaXQ6Z2l0LW1lcmdlWzFdIHRvIG1lcmdlIGJldHdlZW4gbG9jYWwgYnJhbmNoZXMuCisKKyAgKiBsaW5rZ2l0OmdpdC1yZWJhc2VbMV0gdG8gbWFpbnRhaW4gdG9waWMgYnJhbmNoZXMuCisKKyAgKiBsaW5rZ2l0OmdpdC10YWdbMV0gdG8gbWFyayBrbm93biBwb2ludC4KKworRXhhbXBsZXMKK35+fn5+fn5+CisKK1VzZSBhIHRhcmJhbGwgYXMgYSBzdGFydGluZyBwb2ludCBmb3IgYSBuZXcgcmVwb3NpdG9yeS46OgorKworLS0tLS0tLS0tLS0tCiskIHRhciB6eGYgZnJvdHoudGFyLmd6CiskIGNkIGZyb3R6CiskIGdpdC1pbml0CiskIGdpdCBhZGQgLiA8MT4KKyQgZ2l0IGNvbW1pdCAtbSAiaW1wb3J0IG9mIGZyb3R6IHNvdXJjZSB0cmVlLiIKKyQgZ2l0IHRhZyB2Mi40MyA8Mj4KKy0tLS0tLS0tLS0tLQorKworPDE+IGFkZCBldmVyeXRoaW5nIHVuZGVyIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKzwyPiBtYWtlIGEgbGlnaHR3ZWlnaHQsIHVuYW5ub3RhdGVkIHRhZy4KKworQ3JlYXRlIGEgdG9waWMgYnJhbmNoIGFuZCBkZXZlbG9wLjo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC1iIGFsc2EtYXVkaW8gPDE+CiskIGVkaXQvY29tcGlsZS90ZXN0CiskIGdpdCBjaGVja291dCAtLSBjdXJzZXMvdXhfYXVkaW9fb3NzLmMgPDI+CiskIGdpdCBhZGQgY3Vyc2VzL3V4X2F1ZGlvX2Fsc2EuYyA8Mz4KKyQgZWRpdC9jb21waWxlL3Rlc3QKKyQgZ2l0IGRpZmYgSEVBRCA8ND4KKyQgZ2l0IGNvbW1pdCAtYSAtcyA8NT4KKyQgZWRpdC9jb21waWxlL3Rlc3QKKyQgZ2l0IHJlc2V0IC0tc29mdCBIRUFEXiA8Nj4KKyQgZWRpdC9jb21waWxlL3Rlc3QKKyQgZ2l0IGRpZmYgT1JJR19IRUFEIDw3PgorJCBnaXQgY29tbWl0IC1hIC1jIE9SSUdfSEVBRCA8OD4KKyQgZ2l0IGNoZWNrb3V0IG1hc3RlciA8OT4KKyQgZ2l0IG1lcmdlIGFsc2EtYXVkaW8gPDEwPgorJCBnaXQgbG9nIC0tc2luY2U9JzMgZGF5cyBhZ28nIDwxMT4KKyQgZ2l0IGxvZyB2Mi40My4uIGN1cnNlcy8gPDEyPgorLS0tLS0tLS0tLS0tCisrCis8MT4gY3JlYXRlIGEgbmV3IHRvcGljIGJyYW5jaC4KKzwyPiByZXZlcnQgeW91ciBib3RjaGVkIGNoYW5nZXMgaW4gYGN1cnNlcy91eF9hdWRpb19vc3MuY2AuCis8Mz4geW91IG5lZWQgdG8gdGVsbCBnaXQgaWYgeW91IGFkZGVkIGEgbmV3IGZpbGU7IHJlbW92YWwgYW5kCittb2RpZmljYXRpb24gd2lsbCBiZSBjYXVnaHQgaWYgeW91IGRvIGBnaXQgY29tbWl0IC1hYCBsYXRlci4KKzw0PiB0byBzZWUgd2hhdCBjaGFuZ2VzIHlvdSBhcmUgY29tbWl0dGluZy4KKzw1PiBjb21taXQgZXZlcnl0aGluZyBhcyB5b3UgaGF2ZSB0ZXN0ZWQsIHdpdGggeW91ciBzaWduLW9mZi4KKzw2PiB0YWtlIHRoZSBsYXN0IGNvbW1pdCBiYWNrLCBrZWVwaW5nIHdoYXQgaXMgaW4gdGhlIHdvcmtpbmcgdHJlZS4KKzw3PiBsb29rIGF0IHRoZSBjaGFuZ2VzIHNpbmNlIHRoZSBwcmVtYXR1cmUgY29tbWl0IHdlIHRvb2sgYmFjay4KKzw4PiByZWRvIHRoZSBjb21taXQgdW5kb25lIGluIHRoZSBwcmV2aW91cyBzdGVwLCB1c2luZyB0aGUgbWVzc2FnZQoreW91IG9yaWdpbmFsbHkgd3JvdGUuCis8OT4gc3dpdGNoIHRvIHRoZSBtYXN0ZXIgYnJhbmNoLgorPDEwPiBtZXJnZSBhIHRvcGljIGJyYW5jaCBpbnRvIHlvdXIgbWFzdGVyIGJyYW5jaC4KKzwxMT4gcmV2aWV3IGNvbW1pdCBsb2dzOyBvdGhlciBmb3JtcyB0byBsaW1pdCBvdXRwdXQgY2FuIGJlCitjb21iaW5lZCBhbmQgaW5jbHVkZSBgXC0tbWF4LWNvdW50PTEwYCAoc2hvdyAxMCBjb21taXRzKSwKK2BcLS11bnRpbD0yMDA1LTEyLTEwYCwgZXRjLgorPDEyPiB2aWV3IG9ubHkgdGhlIGNoYW5nZXMgdGhhdCB0b3VjaCB3aGF0J3MgaW4gYGN1cnNlcy9gCitkaXJlY3RvcnksIHNpbmNlIGB2Mi40M2AgdGFnLgorCisKK0luZGl2aWR1YWwgRGV2ZWxvcGVyIChQYXJ0aWNpcGFudClbW0luZGl2aWR1YWwgRGV2ZWxvcGVyIChQYXJ0aWNpcGFudCldXQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgZGV2ZWxvcGVyIHdvcmtpbmcgYXMgYSBwYXJ0aWNpcGFudCBpbiBhIGdyb3VwIHByb2plY3QgbmVlZHMgdG8KK2xlYXJuIGhvdyB0byBjb21tdW5pY2F0ZSB3aXRoIG90aGVycywgYW5kIHVzZXMgdGhlc2UgY29tbWFuZHMgaW4KK2FkZGl0aW9uIHRvIHRoZSBvbmVzIG5lZWRlZCBieSBhIHN0YW5kYWxvbmUgZGV2ZWxvcGVyLgorCisgICogbGlua2dpdDpnaXQtY2xvbmVbMV0gZnJvbSB0aGUgdXBzdHJlYW0gdG8gcHJpbWUgeW91ciBsb2NhbAorICAgIHJlcG9zaXRvcnkuCisKKyAgKiBsaW5rZ2l0OmdpdC1wdWxsWzFdIGFuZCBsaW5rZ2l0OmdpdC1mZXRjaFsxXSBmcm9tICJvcmlnaW4iCisgICAgdG8ga2VlcCB1cC10by1kYXRlIHdpdGggdGhlIHVwc3RyZWFtLgorCisgICogbGlua2dpdDpnaXQtcHVzaFsxXSB0byBzaGFyZWQgcmVwb3NpdG9yeSwgaWYgeW91IGFkb3B0IENWUworICAgIHN0eWxlIHNoYXJlZCByZXBvc2l0b3J5IHdvcmtmbG93LgorCisgICogbGlua2dpdDpnaXQtZm9ybWF0LXBhdGNoWzFdIHRvIHByZXBhcmUgZS1tYWlsIHN1Ym1pc3Npb24sIGlmCisgICAgeW91IGFkb3B0IExpbnV4IGtlcm5lbC1zdHlsZSBwdWJsaWMgZm9ydW0gd29ya2Zsb3cuCisKK0V4YW1wbGVzCit+fn5+fn5+fgorCitDbG9uZSB0aGUgdXBzdHJlYW0gYW5kIHdvcmsgb24gaXQuICBGZWVkIGNoYW5nZXMgdG8gdXBzdHJlYW0uOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2xvbmUgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS8uLi4vdG9ydmFsZHMvbGludXgtMi42IG15Mi42CiskIGNkIG15Mi42CiskIGVkaXQvY29tcGlsZS90ZXN0OyBnaXQgY29tbWl0IC1hIC1zIDwxPgorJCBnaXQgZm9ybWF0LXBhdGNoIG9yaWdpbiA8Mj4KKyQgZ2l0IHB1bGwgPDM+CiskIGdpdCBsb2cgLXAgT1JJR19IRUFELi4gYXJjaC9pMzg2IGluY2x1ZGUvYXNtLWkzODYgPDQ+CiskIGdpdCBwdWxsIGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi8uLi4vamdhcnppay9saWJhdGEtZGV2LmdpdCBBTEwgPDU+CiskIGdpdCByZXNldCAtLWhhcmQgT1JJR19IRUFEIDw2PgorJCBnaXQgZ2MgLS1wcnVuZSA8Nz4KKyQgZ2l0IGZldGNoIC0tdGFncyA8OD4KKy0tLS0tLS0tLS0tLQorKworPDE+IHJlcGVhdCBhcyBuZWVkZWQuCis8Mj4gZXh0cmFjdCBwYXRjaGVzIGZyb20geW91ciBicmFuY2ggZm9yIGUtbWFpbCBzdWJtaXNzaW9uLgorPDM+IGBnaXQgcHVsbGAgZmV0Y2hlcyBmcm9tIGBvcmlnaW5gIGJ5IGRlZmF1bHQgYW5kIG1lcmdlcyBpbnRvIHRoZQorY3VycmVudCBicmFuY2guCis8ND4gaW1tZWRpYXRlbHkgYWZ0ZXIgcHVsbGluZywgbG9vayBhdCB0aGUgY2hhbmdlcyBkb25lIHVwc3RyZWFtCitzaW5jZSBsYXN0IHRpbWUgd2UgY2hlY2tlZCwgb25seSBpbiB0aGUKK2FyZWEgd2UgYXJlIGludGVyZXN0ZWQgaW4uCis8NT4gZmV0Y2ggZnJvbSBhIHNwZWNpZmljIGJyYW5jaCBmcm9tIGEgc3BlY2lmaWMgcmVwb3NpdG9yeSBhbmQgbWVyZ2UuCis8Nj4gcmV2ZXJ0IHRoZSBwdWxsLgorPDc+IGdhcmJhZ2UgY29sbGVjdCBsZWZ0b3ZlciBvYmplY3RzIGZyb20gcmV2ZXJ0ZWQgcHVsbC4KKzw4PiBmcm9tIHRpbWUgdG8gdGltZSwgb2J0YWluIG9mZmljaWFsIHRhZ3MgZnJvbSB0aGUgYG9yaWdpbmAKK2FuZCBzdG9yZSB0aGVtIHVuZGVyIGAuZ2l0L3JlZnMvdGFncy9gLgorCisKK1B1c2ggaW50byBhbm90aGVyIHJlcG9zaXRvcnkuOjoKKysKKy0tLS0tLS0tLS0tLQorc2F0ZWxsaXRlJCBnaXQgY2xvbmUgbW90aGVyc2hpcDpmcm90eiBmcm90eiA8MT4KK3NhdGVsbGl0ZSQgY2QgZnJvdHoKK3NhdGVsbGl0ZSQgZ2l0IGNvbmZpZyAtLWdldC1yZWdleHAgJ14ocmVtb3RlfGJyYW5jaClcLicgPDI+CityZW1vdGUub3JpZ2luLnVybCBtb3RoZXJzaGlwOmZyb3R6CityZW1vdGUub3JpZ2luLmZldGNoIHJlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoKK2JyYW5jaC5tYXN0ZXIucmVtb3RlIG9yaWdpbgorYnJhbmNoLm1hc3Rlci5tZXJnZSByZWZzL2hlYWRzL21hc3Rlcgorc2F0ZWxsaXRlJCBnaXQgY29uZmlnIHJlbW90ZS5vcmlnaW4ucHVzaCBcCisgICAgICAgICAgIG1hc3RlcjpyZWZzL3JlbW90ZXMvc2F0ZWxsaXRlL21hc3RlciA8Mz4KK3NhdGVsbGl0ZSQgZWRpdC9jb21waWxlL3Rlc3QvY29tbWl0CitzYXRlbGxpdGUkIGdpdCBwdXNoIG9yaWdpbiA8ND4KKworbW90aGVyc2hpcCQgY2QgZnJvdHoKK21vdGhlcnNoaXAkIGdpdCBjaGVja291dCBtYXN0ZXIKK21vdGhlcnNoaXAkIGdpdCBtZXJnZSBzYXRlbGxpdGUvbWFzdGVyIDw1PgorLS0tLS0tLS0tLS0tCisrCis8MT4gbW90aGVyc2hpcCBtYWNoaW5lIGhhcyBhIGZyb3R6IHJlcG9zaXRvcnkgdW5kZXIgeW91ciBob21lCitkaXJlY3Rvcnk7IGNsb25lIGZyb20gaXQgdG8gc3RhcnQgYSByZXBvc2l0b3J5IG9uIHRoZSBzYXRlbGxpdGUKK21hY2hpbmUuCis8Mj4gY2xvbmUgc2V0cyB0aGVzZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBieSBkZWZhdWx0LgorSXQgYXJyYW5nZXMgYGdpdCBwdWxsYCB0byBmZXRjaCBhbmQgc3RvcmUgdGhlIGJyYW5jaGVzIG9mIG1vdGhlcnNoaXAKK21hY2hpbmUgdG8gbG9jYWwgYHJlbW90ZXMvb3JpZ2luLypgIHRyYWNraW5nIGJyYW5jaGVzLgorPDM+IGFycmFuZ2UgYGdpdCBwdXNoYCB0byBwdXNoIGxvY2FsIGBtYXN0ZXJgIGJyYW5jaCB0bworYHJlbW90ZXMvc2F0ZWxsaXRlL21hc3RlcmAgYnJhbmNoIG9mIHRoZSBtb3RoZXJzaGlwIG1hY2hpbmUuCis8ND4gcHVzaCB3aWxsIHN0YXNoIG91ciB3b3JrIGF3YXkgb24gYHJlbW90ZXMvc2F0ZWxsaXRlL21hc3RlcmAKK3RyYWNraW5nIGJyYW5jaCBvbiB0aGUgbW90aGVyc2hpcCBtYWNoaW5lLiAgWW91IGNvdWxkIHVzZSB0aGlzIGFzCithIGJhY2stdXAgbWV0aG9kLgorPDU+IG9uIG1vdGhlcnNoaXAgbWFjaGluZSwgbWVyZ2UgdGhlIHdvcmsgZG9uZSBvbiB0aGUgc2F0ZWxsaXRlCittYWNoaW5lIGludG8gdGhlIG1hc3RlciBicmFuY2guCisKK0JyYW5jaCBvZmYgb2YgYSBzcGVjaWZpYyB0YWcuOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgLWIgcHJpdmF0ZTIuNi4xNCB2Mi42LjE0IDwxPgorJCBlZGl0L2NvbXBpbGUvdGVzdDsgZ2l0IGNvbW1pdCAtYQorJCBnaXQgY2hlY2tvdXQgbWFzdGVyCiskIGdpdCBmb3JtYXQtcGF0Y2ggLWsgLW0gLS1zdGRvdXQgdjIuNi4xNC4ucHJpdmF0ZTIuNi4xNCB8CisgIGdpdCBhbSAtMyAtayA8Mj4KKy0tLS0tLS0tLS0tLQorKworPDE+IGNyZWF0ZSBhIHByaXZhdGUgYnJhbmNoIGJhc2VkIG9uIGEgd2VsbCBrbm93biAoYnV0IHNvbWV3aGF0IGJlaGluZCkKK3RhZy4KKzwyPiBmb3J3YXJkIHBvcnQgYWxsIGNoYW5nZXMgaW4gYHByaXZhdGUyLjYuMTRgIGJyYW5jaCB0byBgbWFzdGVyYCBicmFuY2gKK3dpdGhvdXQgYSBmb3JtYWwgIm1lcmdpbmciLgorCisKK0ludGVncmF0b3JbW0ludGVncmF0b3JdXQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgZmFpcmx5IGNlbnRyYWwgcGVyc29uIGFjdGluZyBhcyB0aGUgaW50ZWdyYXRvciBpbiBhIGdyb3VwCitwcm9qZWN0IHJlY2VpdmVzIGNoYW5nZXMgbWFkZSBieSBvdGhlcnMsIHJldmlld3MgYW5kIGludGVncmF0ZXMKK3RoZW0gYW5kIHB1Ymxpc2hlcyB0aGUgcmVzdWx0IGZvciBvdGhlcnMgdG8gdXNlLCB1c2luZyB0aGVzZQorY29tbWFuZHMgaW4gYWRkaXRpb24gdG8gdGhlIG9uZXMgbmVlZGVkIGJ5IHBhcnRpY2lwYW50cy4KKworICAqIGxpbmtnaXQ6Z2l0LWFtWzFdIHRvIGFwcGx5IHBhdGNoZXMgZS1tYWlsZWQgaW4gZnJvbSB5b3VyCisgICAgY29udHJpYnV0b3JzLgorCisgICogbGlua2dpdDpnaXQtcHVsbFsxXSB0byBtZXJnZSBmcm9tIHlvdXIgdHJ1c3RlZCBsaWV1dGVuYW50cy4KKworICAqIGxpbmtnaXQ6Z2l0LWZvcm1hdC1wYXRjaFsxXSB0byBwcmVwYXJlIGFuZCBzZW5kIHN1Z2dlc3RlZAorICAgIGFsdGVybmF0aXZlIHRvIGNvbnRyaWJ1dG9ycy4KKworICAqIGxpbmtnaXQ6Z2l0LXJldmVydFsxXSB0byB1bmRvIGJvdGNoZWQgY29tbWl0cy4KKworICAqIGxpbmtnaXQ6Z2l0LXB1c2hbMV0gdG8gcHVibGlzaCB0aGUgYmxlZWRpbmcgZWRnZS4KKworCitFeGFtcGxlcworfn5+fn5+fn4KKworTXkgdHlwaWNhbCBHSVQgZGF5Ljo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IHN0YXR1cyA8MT4KKyQgZ2l0IHNob3ctYnJhbmNoIDwyPgorJCBtYWlseCA8Mz4KKyYgcyAyIDMgNCA1IC4vK3RvLWFwcGx5CismIHMgNyA4IC4vK2hvbGQtbGludXMKKyYgcQorJCBnaXQgY2hlY2tvdXQgLWIgdG9waWMvb25lIG1hc3RlcgorJCBnaXQgYW0gLTMgLWkgLXMgLXUgLi8rdG8tYXBwbHkgPDQ+CiskIGNvbXBpbGUvdGVzdAorJCBnaXQgY2hlY2tvdXQgLWIgaG9sZC9saW51cyAmJiBnaXQgYW0gLTMgLWkgLXMgLXUgLi8raG9sZC1saW51cyA8NT4KKyQgZ2l0IGNoZWNrb3V0IHRvcGljL29uZSAmJiBnaXQgcmViYXNlIG1hc3RlciA8Nj4KKyQgZ2l0IGNoZWNrb3V0IHB1ICYmIGdpdCByZXNldCAtLWhhcmQgbmV4dCA8Nz4KKyQgZ2l0IG1lcmdlIHRvcGljL29uZSB0b3BpYy90d28gJiYgZ2l0IG1lcmdlIGhvbGQvbGludXMgPDg+CiskIGdpdCBjaGVja291dCBtYWludAorJCBnaXQgY2hlcnJ5LXBpY2sgbWFzdGVyfjQgPDk+CiskIGNvbXBpbGUvdGVzdAorJCBnaXQgdGFnIC1zIC1tICJHSVQgMC45OS45eCIgdjAuOTkuOXggPDEwPgorJCBnaXQgZmV0Y2gga28gJiYgZ2l0IHNob3ctYnJhbmNoIG1hc3RlciBtYWludCAndGFncy9rby0qJyA8MTE+CiskIGdpdCBwdXNoIGtvIDwxMj4KKyQgZ2l0IHB1c2gga28gdjAuOTkuOXggPDEzPgorLS0tLS0tLS0tLS0tCisrCis8MT4gc2VlIHdoYXQgSSB3YXMgaW4gdGhlIG1pZGRsZSBvZiBkb2luZywgaWYgYW55LgorPDI+IHNlZSB3aGF0IHRvcGljIGJyYW5jaGVzIEkgaGF2ZSBhbmQgdGhpbmsgYWJvdXQgaG93IHJlYWR5Cit0aGV5IGFyZS4KKzwzPiByZWFkIG1haWxzLCBzYXZlIG9uZXMgdGhhdCBhcmUgYXBwbGljYWJsZSwgYW5kIHNhdmUgb3RoZXJzCit0aGF0IGFyZSBub3QgcXVpdGUgcmVhZHkuCis8ND4gYXBwbHkgdGhlbSwgaW50ZXJhY3RpdmVseSwgd2l0aCBteSBzaWduLW9mZnMuCis8NT4gY3JlYXRlIHRvcGljIGJyYW5jaCBhcyBuZWVkZWQgYW5kIGFwcGx5LCBhZ2FpbiB3aXRoIG15CitzaWduLW9mZnMuCis8Nj4gcmViYXNlIGludGVybmFsIHRvcGljIGJyYW5jaCB0aGF0IGhhcyBub3QgYmVlbiBtZXJnZWQgdG8gdGhlCittYXN0ZXIsIG5vciBleHBvc2VkIGFzIGEgcGFydCBvZiBhIHN0YWJsZSBicmFuY2guCis8Nz4gcmVzdGFydCBgcHVgIGV2ZXJ5IHRpbWUgZnJvbSB0aGUgbmV4dC4KKzw4PiBhbmQgYnVuZGxlIHRvcGljIGJyYW5jaGVzIHN0aWxsIGNvb2tpbmcuCis8OT4gYmFja3BvcnQgYSBjcml0aWNhbCBmaXguCis8MTA+IGNyZWF0ZSBhIHNpZ25lZCB0YWcuCis8MTE+IG1ha2Ugc3VyZSBJIGRpZCBub3QgYWNjaWRlbnRhbGx5IHJld2luZCBtYXN0ZXIgYmV5b25kIHdoYXQgSQorYWxyZWFkeSBwdXNoZWQgb3V0LiAgYGtvYCBzaG9ydGhhbmQgcG9pbnRzIGF0IHRoZSByZXBvc2l0b3J5IEkgaGF2ZQorYXQga2VybmVsLm9yZywgYW5kIGxvb2tzIGxpa2UgdGhpczoKKysKKy0tLS0tLS0tLS0tLQorJCBjYXQgLmdpdC9yZW1vdGVzL2tvCitVUkw6IGtlcm5lbC5vcmc6L3B1Yi9zY20vZ2l0L2dpdC5naXQKK1B1bGw6IG1hc3RlcjpyZWZzL3RhZ3Mva28tbWFzdGVyCitQdWxsOiBuZXh0OnJlZnMvdGFncy9rby1uZXh0CitQdWxsOiBtYWludDpyZWZzL3RhZ3Mva28tbWFpbnQKK1B1c2g6IG1hc3RlcgorUHVzaDogbmV4dAorUHVzaDogK3B1CitQdXNoOiBtYWludAorLS0tLS0tLS0tLS0tCisrCitJbiB0aGUgb3V0cHV0IGZyb20gYGdpdCBzaG93LWJyYW5jaGAsIGBtYXN0ZXJgIHNob3VsZCBoYXZlCitldmVyeXRoaW5nIGBrby1tYXN0ZXJgIGhhcywgYW5kIGBuZXh0YCBzaG91bGQgaGF2ZQorZXZlcnl0aGluZyBga28tbmV4dGAgaGFzLgorCis8MTI+IHB1c2ggb3V0IHRoZSBibGVlZGluZyBlZGdlLgorPDEzPiBwdXNoIHRoZSB0YWcgb3V0LCB0b28uCisKKworUmVwb3NpdG9yeSBBZG1pbmlzdHJhdGlvbltbUmVwb3NpdG9yeSBBZG1pbmlzdHJhdGlvbl1dCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSByZXBvc2l0b3J5IGFkbWluaXN0cmF0b3IgdXNlcyB0aGUgZm9sbG93aW5nIHRvb2xzIHRvIHNldCB1cAorYW5kIG1haW50YWluIGFjY2VzcyB0byB0aGUgcmVwb3NpdG9yeSBieSBkZXZlbG9wZXJzLgorCisgICogbGlua2dpdDpnaXQtZGFlbW9uWzFdIHRvIGFsbG93IGFub255bW91cyBkb3dubG9hZCBmcm9tCisgICAgcmVwb3NpdG9yeS4KKworICAqIGxpbmtnaXQ6Z2l0LXNoZWxsWzFdIGNhbiBiZSB1c2VkIGFzIGEgJ3Jlc3RyaWN0ZWQgbG9naW4gc2hlbGwnCisgICAgZm9yIHNoYXJlZCBjZW50cmFsIHJlcG9zaXRvcnkgdXNlcnMuCisKK2xpbms6aG93dG8vdXBkYXRlLWhvb2stZXhhbXBsZS50eHRbdXBkYXRlIGhvb2sgaG93dG9dIGhhcyBhIGdvb2QKK2V4YW1wbGUgb2YgbWFuYWdpbmcgYSBzaGFyZWQgY2VudHJhbCByZXBvc2l0b3J5LgorCisKK0V4YW1wbGVzCit+fn5+fn5+fgorV2UgYXNzdW1lIHRoZSBmb2xsb3dpbmcgaW4gL2V0Yy9zZXJ2aWNlczo6CisrCistLS0tLS0tLS0tLS0KKyQgZ3JlcCA5NDE4IC9ldGMvc2VydmljZXMKK2dpdAkJOTQxOC90Y3AJCSMgR2l0IFZlcnNpb24gQ29udHJvbCBTeXN0ZW0KKy0tLS0tLS0tLS0tLQorCitSdW4gZ2l0LWRhZW1vbiB0byBzZXJ2ZSAvcHViL3NjbSBmcm9tIGluZXRkLjo6CisrCistLS0tLS0tLS0tLS0KKyQgZ3JlcCBnaXQgL2V0Yy9pbmV0ZC5jb25mCitnaXQJc3RyZWFtCXRjcAlub3dhaXQJbm9ib2R5IFwKKyAgL3Vzci9iaW4vZ2l0LWRhZW1vbiBnaXQtZGFlbW9uIC0taW5ldGQgLS1leHBvcnQtYWxsIC9wdWIvc2NtCistLS0tLS0tLS0tLS0KKysKK1RoZSBhY3R1YWwgY29uZmlndXJhdGlvbiBsaW5lIHNob3VsZCBiZSBvbiBvbmUgbGluZS4KKworUnVuIGdpdC1kYWVtb24gdG8gc2VydmUgL3B1Yi9zY20gZnJvbSB4aW5ldGQuOjoKKysKKy0tLS0tLS0tLS0tLQorJCBjYXQgL2V0Yy94aW5ldGQuZC9naXQtZGFlbW9uCisjIGRlZmF1bHQ6IG9mZgorIyBkZXNjcmlwdGlvbjogVGhlIGdpdCBzZXJ2ZXIgb2ZmZXJzIGFjY2VzcyB0byBnaXQgcmVwb3NpdG9yaWVzCitzZXJ2aWNlIGdpdAoreworICAgICAgICBkaXNhYmxlID0gbm8KKyAgICAgICAgdHlwZSAgICAgICAgICAgID0gVU5MSVNURUQKKyAgICAgICAgcG9ydCAgICAgICAgICAgID0gOTQxOAorICAgICAgICBzb2NrZXRfdHlwZSAgICAgPSBzdHJlYW0KKyAgICAgICAgd2FpdCAgICAgICAgICAgID0gbm8KKyAgICAgICAgdXNlciAgICAgICAgICAgID0gbm9ib2R5CisgICAgICAgIHNlcnZlciAgICAgICAgICA9IC91c3IvYmluL2dpdC1kYWVtb24KKyAgICAgICAgc2VydmVyX2FyZ3MgICAgID0gLS1pbmV0ZCAtLWV4cG9ydC1hbGwgLS1iYXNlLXBhdGg9L3B1Yi9zY20KKyAgICAgICAgbG9nX29uX2ZhaWx1cmUgICs9IFVTRVJJRAorfQorLS0tLS0tLS0tLS0tCisrCitDaGVjayB5b3VyIHhpbmV0ZCg4KSBkb2N1bWVudGF0aW9uIGFuZCBzZXR1cCwgdGhpcyBpcyBmcm9tIGEgRmVkb3JhIHN5c3RlbS4KK090aGVycyBtaWdodCBiZSBkaWZmZXJlbnQuCisKK0dpdmUgcHVzaC9wdWxsIG9ubHkgYWNjZXNzIHRvIGRldmVsb3BlcnMuOjoKKysKKy0tLS0tLS0tLS0tLQorJCBncmVwIGdpdCAvZXRjL3Bhc3N3ZCA8MT4KK2FsaWNlOng6MTAwMDoxMDAwOjovaG9tZS9hbGljZTovdXNyL2Jpbi9naXQtc2hlbGwKK2JvYjp4OjEwMDE6MTAwMTo6L2hvbWUvYm9iOi91c3IvYmluL2dpdC1zaGVsbAorY2luZHk6eDoxMDAyOjEwMDI6Oi9ob21lL2NpbmR5Oi91c3IvYmluL2dpdC1zaGVsbAorZGF2aWQ6eDoxMDAzOjEwMDM6Oi9ob21lL2RhdmlkOi91c3IvYmluL2dpdC1zaGVsbAorJCBncmVwIGdpdCAvZXRjL3NoZWxscyA8Mj4KKy91c3IvYmluL2dpdC1zaGVsbAorLS0tLS0tLS0tLS0tCisrCis8MT4gbG9nLWluIHNoZWxsIGlzIHNldCB0byAvdXNyL2Jpbi9naXQtc2hlbGwsIHdoaWNoIGRvZXMgbm90CithbGxvdyBhbnl0aGluZyBidXQgYGdpdCBwdXNoYCBhbmQgYGdpdCBwdWxsYC4gIFRoZSB1c2VycyBzaG91bGQKK2dldCBhbiBzc2ggYWNjZXNzIHRvIHRoZSBtYWNoaW5lLgorPDI+IGluIG1hbnkgZGlzdHJpYnV0aW9ucyAvZXRjL3NoZWxscyBuZWVkcyB0byBsaXN0IHdoYXQgaXMgdXNlZAorYXMgdGhlIGxvZ2luIHNoZWxsLgorCitDVlMtc3R5bGUgc2hhcmVkIHJlcG9zaXRvcnkuOjoKKysKKy0tLS0tLS0tLS0tLQorJCBncmVwIGdpdCAvZXRjL2dyb3VwIDwxPgorZ2l0Ong6OTQxODphbGljZSxib2IsY2luZHksZGF2aWQKKyQgY2QgL2hvbWUvZGV2by5naXQKKyQgbHMgLWwgPDI+CisgIGxyd3hyd3hyd3ggICAxIGRhdmlkIGdpdCAgICAxNyBEZWMgIDQgMjI6NDAgSEVBRCAtPiByZWZzL2hlYWRzL21hc3RlcgorICBkcnd4cndzci14ICAgMiBkYXZpZCBnaXQgIDQwOTYgRGVjICA0IDIyOjQwIGJyYW5jaGVzCisgIC1ydy1ydy1yLS0gICAxIGRhdmlkIGdpdCAgICA4NCBEZWMgIDQgMjI6NDAgY29uZmlnCisgIC1ydy1ydy1yLS0gICAxIGRhdmlkIGdpdCAgICA1OCBEZWMgIDQgMjI6NDAgZGVzY3JpcHRpb24KKyAgZHJ3eHJ3c3IteCAgIDIgZGF2aWQgZ2l0ICA0MDk2IERlYyAgNCAyMjo0MCBob29rcworICAtcnctcnctci0tICAgMSBkYXZpZCBnaXQgMzc1MDQgRGVjICA0IDIyOjQwIGluZGV4CisgIGRyd3hyd3NyLXggICAyIGRhdmlkIGdpdCAgNDA5NiBEZWMgIDQgMjI6NDAgaW5mbworICBkcnd4cndzci14ICAgNCBkYXZpZCBnaXQgIDQwOTYgRGVjICA0IDIyOjQwIG9iamVjdHMKKyAgZHJ3eHJ3c3IteCAgIDQgZGF2aWQgZ2l0ICA0MDk2IE5vdiAgNyAxNDo1OCByZWZzCisgIGRyd3hyd3NyLXggICAyIGRhdmlkIGdpdCAgNDA5NiBEZWMgIDQgMjI6NDAgcmVtb3RlcworJCBscyAtbCBob29rcy91cGRhdGUgPDM+CisgIC1yLXhyLXhyLXggICAxIGRhdmlkIGdpdCAgMzUzNiBEZWMgIDQgMjI6NDAgdXBkYXRlCiskIGNhdCBpbmZvL2FsbG93ZWQtdXNlcnMgPDQ+CityZWZzL2hlYWRzL21hc3RlcglhbGljZVx8Y2luZHkKK3JlZnMvaGVhZHMvZG9jLXVwZGF0ZQlib2IKK3JlZnMvdGFncy92WzAtOV0qCWRhdmlkCistLS0tLS0tLS0tLS0KKysKKzwxPiBwbGFjZSB0aGUgZGV2ZWxvcGVycyBpbnRvIHRoZSBzYW1lIGdpdCBncm91cC4KKzwyPiBhbmQgbWFrZSB0aGUgc2hhcmVkIHJlcG9zaXRvcnkgd3JpdGFibGUgYnkgdGhlIGdyb3VwLgorPDM+IHVzZSB1cGRhdGUtaG9vayBleGFtcGxlIGJ5IENhcmwgZnJvbSBEb2N1bWVudGF0aW9uL2hvd3RvLworZm9yIGJyYW5jaCBwb2xpY3kgY29udHJvbC4KKzw0PiBhbGljZSBhbmQgY2luZHkgY2FuIHB1c2ggaW50byBtYXN0ZXIsIG9ubHkgYm9iIGNhbiBwdXNoIGludG8gZG9jLXVwZGF0ZS4KK2RhdmlkIGlzIHRoZSByZWxlYXNlIG1hbmFnZXIgYW5kIGlzIHRoZSBvbmx5IHBlcnNvbiB3aG8gY2FuCitjcmVhdGUgYW5kIHB1c2ggdmVyc2lvbiB0YWdzLgorCitIVFRQIHNlcnZlciB0byBzdXBwb3J0IGR1bWIgcHJvdG9jb2wgdHJhbnNmZXIuOjoKKysKKy0tLS0tLS0tLS0tLQorZGV2JCBnaXQgdXBkYXRlLXNlcnZlci1pbmZvIDwxPgorZGV2JCBmdHAgdXNlckBpc3AuZXhhbXBsZS5jb20gPDI+CitmdHA+IGNwIC1yIC5naXQgL2hvbWUvdXNlci9teXByb2plY3QuZ2l0CistLS0tLS0tLS0tLS0KKysKKzwxPiBtYWtlIHN1cmUgeW91ciBpbmZvL3JlZnMgYW5kIG9iamVjdHMvaW5mby9wYWNrcyBhcmUgdXAtdG8tZGF0ZQorPDI+IHVwbG9hZCB0byBwdWJsaWMgSFRUUCBzZXJ2ZXIgaG9zdGVkIGJ5IHlvdXIgSVNQLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mZXRjaC1vcHRpb25zLnR4dCBiL0RvY3VtZW50YXRpb24vZmV0Y2gtb3B0aW9ucy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY3NTkxMQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZmV0Y2gtb3B0aW9ucy50eHQKQEAgLTAsMCArMSw1OCBAQAorLXEsIFwtLXF1aWV0OjoKKwlQYXNzIC0tcXVpZXQgdG8gZ2l0LWZldGNoLXBhY2sgYW5kIHNpbGVuY2UgYW55IG90aGVyIGludGVybmFsbHkKKwl1c2VkIHByb2dyYW1zLgorCistdiwgXC0tdmVyYm9zZTo6CisJQmUgdmVyYm9zZS4KKworLWEsIFwtLWFwcGVuZDo6CisJQXBwZW5kIHJlZiBuYW1lcyBhbmQgb2JqZWN0IG5hbWVzIG9mIGZldGNoZWQgcmVmcyB0byB0aGUKKwlleGlzdGluZyBjb250ZW50cyBvZiBgLmdpdC9GRVRDSF9IRUFEYC4gIFdpdGhvdXQgdGhpcworCW9wdGlvbiBvbGQgZGF0YSBpbiBgLmdpdC9GRVRDSF9IRUFEYCB3aWxsIGJlIG92ZXJ3cml0dGVuLgorCitcLS11cGxvYWQtcGFjayA8dXBsb2FkLXBhY2s+OjoKKwlXaGVuIGdpdmVuLCBhbmQgdGhlIHJlcG9zaXRvcnkgdG8gZmV0Y2ggZnJvbSBpcyBoYW5kbGVkCisJYnkgJ2dpdC1mZXRjaC1wYWNrJywgJy0tZXhlYz08dXBsb2FkLXBhY2s+JyBpcyBwYXNzZWQgdG8KKwl0aGUgY29tbWFuZCB0byBzcGVjaWZ5IG5vbi1kZWZhdWx0IHBhdGggZm9yIHRoZSBjb21tYW5kCisJcnVuIG9uIHRoZSBvdGhlciBlbmQuCisKKy1mLCBcLS1mb3JjZTo6CisJV2hlbiBgZ2l0LWZldGNoYCBpcyB1c2VkIHdpdGggYDxyYnJhbmNoPjo8bGJyYW5jaD5gCisJcmVmc3BlYywgaXQgcmVmdXNlcyB0byB1cGRhdGUgdGhlIGxvY2FsIGJyYW5jaAorCWA8bGJyYW5jaD5gIHVubGVzcyB0aGUgcmVtb3RlIGJyYW5jaCBgPHJicmFuY2g+YCBpdAorCWZldGNoZXMgaXMgYSBkZXNjZW5kYW50IG9mIGA8bGJyYW5jaD5gLiAgVGhpcyBvcHRpb24KKwlvdmVycmlkZXMgdGhhdCBjaGVjay4KKworaWZkZWY6OmdpdC1wdWxsW10KK1wtLW5vLXRhZ3M6OgorZW5kaWY6OmdpdC1wdWxsW10KK2lmbmRlZjo6Z2l0LXB1bGxbXQorLW4sIFwtLW5vLXRhZ3M6OgorZW5kaWY6OmdpdC1wdWxsW10KKwlCeSBkZWZhdWx0LCB0YWdzIHRoYXQgcG9pbnQgYXQgb2JqZWN0cyB0aGF0IGFyZSBkb3dubG9hZGVkCisJZnJvbSB0aGUgcmVtb3RlIHJlcG9zaXRvcnkgYXJlIGZldGNoZWQgYW5kIHN0b3JlZCBsb2NhbGx5LgorCVRoaXMgb3B0aW9uIGRpc2FibGVzIHRoaXMgYXV0b21hdGljIHRhZyBmb2xsb3dpbmcuCisKKy10LCBcLS10YWdzOjoKKwlNb3N0IG9mIHRoZSB0YWdzIGFyZSBmZXRjaGVkIGF1dG9tYXRpY2FsbHkgYXMgYnJhbmNoCisJaGVhZHMgYXJlIGRvd25sb2FkZWQsIGJ1dCB0YWdzIHRoYXQgZG8gbm90IHBvaW50IGF0CisJb2JqZWN0cyByZWFjaGFibGUgZnJvbSB0aGUgYnJhbmNoIGhlYWRzIHRoYXQgYXJlIGJlaW5nCisJdHJhY2tlZCB3aWxsIG5vdCBiZSBmZXRjaGVkIGJ5IHRoaXMgbWVjaGFuaXNtLiAgVGhpcworCWZsYWcgbGV0cyBhbGwgdGFncyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBvYmplY3RzIGJlCisJZG93bmxvYWRlZC4KKworLWssIFwtLWtlZXA6OgorCUtlZXAgZG93bmxvYWRlZCBwYWNrLgorCistdSwgXC0tdXBkYXRlLWhlYWQtb2s6OgorCUJ5IGRlZmF1bHQgYGdpdC1mZXRjaGAgcmVmdXNlcyB0byB1cGRhdGUgdGhlIGhlYWQgd2hpY2gKKwljb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBicmFuY2guICBUaGlzIGZsYWcgZGlzYWJsZXMgdGhlCisJY2hlY2suICBUaGlzIGlzIHB1cmVseSBmb3IgdGhlIGludGVybmFsIHVzZSBmb3IgYGdpdC1wdWxsYAorCXRvIGNvbW11bmljYXRlIHdpdGggYGdpdC1mZXRjaGAsIGFuZCB1bmxlc3MgeW91IGFyZQorCWltcGxlbWVudGluZyB5b3VyIG93biBQb3JjZWxhaW4geW91IGFyZSBub3Qgc3VwcG9zZWQgdG8KKwl1c2UgaXQuCisKK1wtLWRlcHRoPTxkZXB0aD46OgorCURlZXBlbiB0aGUgaGlzdG9yeSBvZiBhICdzaGFsbG93JyByZXBvc2l0b3J5IGNyZWF0ZWQgYnkKKwlgZ2l0IGNsb25lYCB3aXRoIGAtLWRlcHRoPTxkZXB0aD5gIG9wdGlvbiAoc2VlIGxpbmtnaXQ6Z2l0LWNsb25lWzFdKQorCWJ5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNvbW1pdHMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpeC10ZXhpLnBlcmwgYi9Eb2N1bWVudGF0aW9uL2ZpeC10ZXhpLnBlcmwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmY3ZDc4ZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZml4LXRleGkucGVybApAQCAtMCwwICsxLDE1IEBACisjIS91c3IvYmluL3BlcmwgLXcKKword2hpbGUgKDw+KSB7CisJaWYgKC9eXEBzZXRmaWxlbmFtZS8pIHsKKwkJJF8gPSAiXEBzZXRmaWxlbmFtZSBnaXQuaW5mb1xuIjsKKwl9IGVsc2lmICgvXlxAZGlyZW50cnkvKSB7CisJCXByaW50ICdAZGlyY2F0ZWdvcnkgRGV2ZWxvcG1lbnQKK0BkaXJlbnRyeQorKiBHaXQ6IChnaXQpLiAgICAgICAgICAgQSBmYXN0IGRpc3RyaWJ1dGVkIHJldmlzaW9uIGNvbnRyb2wgc3lzdGVtCitAZW5kIGRpcmVudHJ5CisnOwl9CisJdW5sZXNzICgvXlxAZGlyZW50cnkvLi4vXlxAZW5kIGRpcmVudHJ5LykgeworCQlwcmludDsKKwl9Cit9CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1hZGQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtYWRkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWU2N2EwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtYWRkLnR4dApAQCAtMCwwICsxLDI1NSBAQAorZ2l0LWFkZCgxKQorPT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtYWRkIC0gQWRkIGZpbGUgY29udGVudHMgdG8gdGhlIGluZGV4CisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1hZGQnIFstbl0gWy12XSBbLWZdIFstLWludGVyYWN0aXZlIHwgLWldIFstLXBhdGNoIHwgLXBdIFstdV0gWy0tcmVmcmVzaF0KKyAgICAgICAgICBbLS1dIDxmaWxlcGF0dGVybj4uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIGNvbW1hbmQgYWRkcyB0aGUgY3VycmVudCBjb250ZW50IG9mIG5ldyBvciBtb2RpZmllZCBmaWxlcyB0byB0aGUKK2luZGV4LCB0aHVzIHN0YWdpbmcgdGhhdCBjb250ZW50IGZvciBpbmNsdXNpb24gaW4gdGhlIG5leHQgY29tbWl0LgorCitUaGUgImluZGV4IiBob2xkcyBhIHNuYXBzaG90IG9mIHRoZSBjb250ZW50IG9mIHRoZSB3b3JraW5nIHRyZWUsIGFuZCBpdAoraXMgdGhpcyBzbmFwc2hvdCB0aGF0IGlzIHRha2VuIGFzIHRoZSBjb250ZW50cyBvZiB0aGUgbmV4dCBjb21taXQuICBUaHVzCithZnRlciBtYWtpbmcgYW55IGNoYW5nZXMgdG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgYmVmb3JlIHJ1bm5pbmcKK3RoZSBjb21taXQgY29tbWFuZCwgeW91IG11c3QgdXNlIHRoZSAnYWRkJyBjb21tYW5kIHRvIGFkZCBhbnkgbmV3IG9yCittb2RpZmllZCBmaWxlcyB0byB0aGUgaW5kZXguCisKK1RoaXMgY29tbWFuZCBjYW4gYmUgcGVyZm9ybWVkIG11bHRpcGxlIHRpbWVzIGJlZm9yZSBhIGNvbW1pdC4gIEl0IG9ubHkKK2FkZHMgdGhlIGNvbnRlbnQgb2YgdGhlIHNwZWNpZmllZCBmaWxlKHMpIGF0IHRoZSB0aW1lIHRoZSBhZGQgY29tbWFuZCBpcworcnVuOyBpZiB5b3Ugd2FudCBzdWJzZXF1ZW50IGNoYW5nZXMgaW5jbHVkZWQgaW4gdGhlIG5leHQgY29tbWl0LCB0aGVuCit5b3UgbXVzdCBydW4gJ2dpdCBhZGQnIGFnYWluIHRvIGFkZCB0aGUgbmV3IGNvbnRlbnQgdG8gdGhlIGluZGV4LgorCitUaGUgJ2dpdCBzdGF0dXMnIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gb2J0YWluIGEgc3VtbWFyeSBvZiB3aGljaAorZmlsZXMgaGF2ZSBjaGFuZ2VzIHRoYXQgYXJlIHN0YWdlZCBmb3IgdGhlIG5leHQgY29tbWl0LgorCitUaGUgJ2dpdCBhZGQnIGNvbW1hbmQgd2lsbCBub3QgYWRkIGlnbm9yZWQgZmlsZXMgYnkgZGVmYXVsdC4gIElmIGFueQoraWdub3JlZCBmaWxlcyB3ZXJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsICdnaXQgYWRkJword2lsbCBmYWlsIHdpdGggYSBsaXN0IG9mIGlnbm9yZWQgZmlsZXMuICBJZ25vcmVkIGZpbGVzIHJlYWNoZWQgYnkKK2RpcmVjdG9yeSByZWN1cnNpb24gb3IgZmlsZW5hbWUgZ2xvYmJpbmcgcGVyZm9ybWVkIGJ5IEdpdCAocXVvdGUgeW91cgorZ2xvYnMgYmVmb3JlIHRoZSBzaGVsbCkgd2lsbCBiZSBzaWxlbnRseSBpZ25vcmVkLiAgVGhlICdhZGQnIGNvbW1hbmQgY2FuCitiZSB1c2VkIHRvIGFkZCBpZ25vcmVkIGZpbGVzIHdpdGggdGhlIGAtZmAgKGZvcmNlKSBvcHRpb24uCisKK1BsZWFzZSBzZWUgbGlua2dpdDpnaXQtY29tbWl0WzFdIGZvciBhbHRlcm5hdGl2ZSB3YXlzIHRvIGFkZCBjb250ZW50IHRvIGEKK2NvbW1pdC4KKworCitPUFRJT05TCistLS0tLS0tCis8ZmlsZXBhdHRlcm4+Li4uOjoKKwlGaWxlcyB0byBhZGQgY29udGVudCBmcm9tLiAgRmlsZWdsb2JzIChlLmcuIGAqLmNgKSBjYW4KKwliZSBnaXZlbiB0byBhZGQgYWxsIG1hdGNoaW5nIGZpbGVzLiAgQWxzbyBhCisJbGVhZGluZyBkaXJlY3RvcnkgbmFtZSAoZS5nLiBgZGlyYCB0byBhZGQgYGRpci9maWxlMWAKKwlhbmQgYGRpci9maWxlMmApIGNhbiBiZSBnaXZlbiB0byBhZGQgYWxsIGZpbGVzIGluIHRoZQorCWRpcmVjdG9yeSwgcmVjdXJzaXZlbHkuCisKKy1uLCBcLS1kcnktcnVuOjoKKyAgICAgICAgRG9uJ3QgYWN0dWFsbHkgYWRkIHRoZSBmaWxlKHMpLCBqdXN0IHNob3cgaWYgdGhleSBleGlzdC4KKworLXYsIFwtLXZlcmJvc2U6OgorICAgICAgICBCZSB2ZXJib3NlLgorCistZjo6CisJQWxsb3cgYWRkaW5nIG90aGVyd2lzZSBpZ25vcmVkIGZpbGVzLgorCistaSwgXC0taW50ZXJhY3RpdmU6OgorCUFkZCBtb2RpZmllZCBjb250ZW50cyBpbiB0aGUgd29ya2luZyB0cmVlIGludGVyYWN0aXZlbHkgdG8KKwl0aGUgaW5kZXguIE9wdGlvbmFsIHBhdGggYXJndW1lbnRzIG1heSBiZSBzdXBwbGllZCB0byBsaW1pdAorCW9wZXJhdGlvbiB0byBhIHN1YnNldCBvZiB0aGUgd29ya2luZyB0cmVlLiBTZWUgYGBJbnRlcmFjdGl2ZQorCW1vZGUnJyBmb3IgZGV0YWlscy4KKworLXAsIFwtLXBhdGNoOjoKKwlTaW1pbGFyIHRvIEludGVyYWN0aXZlIG1vZGUgYnV0IHRoZSBpbml0aWFsIGNvbW1hbmQgbG9vcCBpcworCWJ5cGFzc2VkIGFuZCB0aGUgJ3BhdGNoJyBzdWJjb21tYW5kIGlzIGludm9rZWQgdXNpbmcgZWFjaCBvZgorCXRoZSBzcGVjaWZpZWQgZmlsZXBhdHRlcm5zIGJlZm9yZSBleGl0aW5nLgorCistdTo6CisJVXBkYXRlIG9ubHkgZmlsZXMgdGhhdCBnaXQgYWxyZWFkeSBrbm93cyBhYm91dC4gVGhpcyBpcyBzaW1pbGFyCisJdG8gd2hhdCAiZ2l0IGNvbW1pdCAtYSIgZG9lcyBpbiBwcmVwYXJhdGlvbiBmb3IgbWFraW5nIGEgY29tbWl0LAorCWV4Y2VwdCB0aGF0IHRoZSB1cGRhdGUgaXMgbGltaXRlZCB0byBwYXRocyBzcGVjaWZpZWQgb24gdGhlCisJY29tbWFuZCBsaW5lLiBJZiBubyBwYXRocyBhcmUgc3BlY2lmaWVkLCBhbGwgdHJhY2tlZCBmaWxlcyBpbiB0aGUKKwljdXJyZW50IGRpcmVjdG9yeSBhbmQgaXRzIHN1YmRpcmVjdG9yaWVzIGFyZSB1cGRhdGVkLgorCitcLS1yZWZyZXNoOjoKKwlEb24ndCBhZGQgdGhlIGZpbGUocyksIGJ1dCBvbmx5IHJlZnJlc2ggdGhlaXIgc3RhdCgpCisJaW5mb3JtYXRpb24gaW4gdGhlIGluZGV4LgorCitcLS06OgorCVRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIGNvbW1hbmQtbGluZSBvcHRpb25zIGZyb20KKwl0aGUgbGlzdCBvZiBmaWxlcywgKHVzZWZ1bCB3aGVuIGZpbGVuYW1lcyBtaWdodCBiZSBtaXN0YWtlbgorCWZvciBjb21tYW5kLWxpbmUgb3B0aW9ucykuCisKKworQ29uZmlndXJhdGlvbgorLS0tLS0tLS0tLS0tLQorCitUaGUgb3B0aW9uYWwgY29uZmlndXJhdGlvbiB2YXJpYWJsZSAnY29yZS5leGNsdWRlc2ZpbGUnIGluZGljYXRlcyBhIHBhdGggdG8gYQorZmlsZSBjb250YWluaW5nIHBhdHRlcm5zIG9mIGZpbGUgbmFtZXMgdG8gZXhjbHVkZSBmcm9tIGdpdC1hZGQsIHNpbWlsYXIgdG8KKyRHSVRfRElSL2luZm8vZXhjbHVkZS4gIFBhdHRlcm5zIGluIHRoZSBleGNsdWRlIGZpbGUgYXJlIHVzZWQgaW4gYWRkaXRpb24gdG8KK3Rob3NlIGluIGluZm8vZXhjbHVkZS4gIFNlZSBsaW5rOnJlcG9zaXRvcnktbGF5b3V0Lmh0bWxbcmVwb3NpdG9yeSBsYXlvdXRdLgorCisKK0VYQU1QTEVTCistLS0tLS0tLQorZ2l0LWFkZCBEb2N1bWVudGF0aW9uL1xcKi50eHQ6OgorCisJQWRkcyBjb250ZW50IGZyb20gYWxsIGBcKi50eHRgIGZpbGVzIHVuZGVyIGBEb2N1bWVudGF0aW9uYAorCWRpcmVjdG9yeSBhbmQgaXRzIHN1YmRpcmVjdG9yaWVzLgorKworTm90ZSB0aGF0IHRoZSBhc3RlcmlzayBgXCpgIGlzIHF1b3RlZCBmcm9tIHRoZSBzaGVsbCBpbiB0aGlzCitleGFtcGxlOyB0aGlzIGxldHMgdGhlIGNvbW1hbmQgdG8gaW5jbHVkZSB0aGUgZmlsZXMgZnJvbQorc3ViZGlyZWN0b3JpZXMgb2YgYERvY3VtZW50YXRpb24vYCBkaXJlY3RvcnkuCisKK2dpdC1hZGQgZ2l0LSouc2g6OgorCisJQ29uc2lkZXJzIGFkZGluZyBjb250ZW50IGZyb20gYWxsIGdpdC0qLnNoIHNjcmlwdHMuCisJQmVjYXVzZSB0aGlzIGV4YW1wbGUgbGV0cyBzaGVsbCBleHBhbmQgdGhlIGFzdGVyaXNrCisJKGkuZS4geW91IGFyZSBsaXN0aW5nIHRoZSBmaWxlcyBleHBsaWNpdGx5KSwgaXQgZG9lcyBub3QKKwljb25zaWRlciBgc3ViZGlyL2dpdC1mb28uc2hgLgorCitJbnRlcmFjdGl2ZSBtb2RlCistLS0tLS0tLS0tLS0tLS0tCitXaGVuIHRoZSBjb21tYW5kIGVudGVycyB0aGUgaW50ZXJhY3RpdmUgbW9kZSwgaXQgc2hvd3MgdGhlCitvdXRwdXQgb2YgdGhlICdzdGF0dXMnIHN1YmNvbW1hbmQsIGFuZCB0aGVuIGdvZXMgaW50byBpdHMKK2ludGVyYWN0aXZlIGNvbW1hbmQgbG9vcC4KKworVGhlIGNvbW1hbmQgbG9vcCBzaG93cyB0aGUgbGlzdCBvZiBzdWJjb21tYW5kcyBhdmFpbGFibGUsIGFuZAorZ2l2ZXMgYSBwcm9tcHQgIldoYXQgbm93PiAiLiAgSW4gZ2VuZXJhbCwgd2hlbiB0aGUgcHJvbXB0IGVuZHMKK3dpdGggYSBzaW5nbGUgJz4nLCB5b3UgY2FuIHBpY2sgb25seSBvbmUgb2YgdGhlIGNob2ljZXMgZ2l2ZW4KK2FuZCB0eXBlIHJldHVybiwgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0KKyAgICAqKiogQ29tbWFuZHMgKioqCisgICAgICAxOiBzdGF0dXMgICAgICAgMjogdXBkYXRlICAgICAgIDM6IHJldmVydCAgICAgICA0OiBhZGQgdW50cmFja2VkCisgICAgICA1OiBwYXRjaCAgICAgICAgNjogZGlmZiAgICAgICAgIDc6IHF1aXQgICAgICAgICA4OiBoZWxwCisgICAgV2hhdCBub3c+IDEKKy0tLS0tLS0tLS0tLQorCitZb3UgYWxzbyBjb3VsZCBzYXkgInMiIG9yICJzdGEiIG9yICJzdGF0dXMiIGFib3ZlIGFzIGxvbmcgYXMgdGhlCitjaG9pY2UgaXMgdW5pcXVlLgorCitUaGUgbWFpbiBjb21tYW5kIGxvb3AgaGFzIDYgc3ViY29tbWFuZHMgKHBsdXMgaGVscCBhbmQgcXVpdCkuCisKK3N0YXR1czo6CisKKyAgIFRoaXMgc2hvd3MgdGhlIGNoYW5nZSBiZXR3ZWVuIEhFQUQgYW5kIGluZGV4IChpLmUuIHdoYXQgd2lsbCBiZQorICAgY29tbWl0dGVkIGlmIHlvdSBzYXkgImdpdCBjb21taXQiKSwgYW5kIGJldHdlZW4gaW5kZXggYW5kCisgICB3b3JraW5nIHRyZWUgZmlsZXMgKGkuZS4gd2hhdCB5b3UgY291bGQgc3RhZ2UgZnVydGhlciBiZWZvcmUKKyAgICJnaXQgY29tbWl0IiB1c2luZyAiZ2l0LWFkZCIpIGZvciBlYWNoIHBhdGguICBBIHNhbXBsZSBvdXRwdXQKKyAgIGxvb2tzIGxpa2UgdGhpczoKKysKKy0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICBzdGFnZWQgICAgIHVuc3RhZ2VkIHBhdGgKKyAgICAgMTogICAgICAgYmluYXJ5ICAgICAgbm90aGluZyBmb28ucG5nCisgICAgIDI6ICAgICArNDAzLy0zNSAgICAgICAgKzEvLTEgZ2l0LWFkZC0taW50ZXJhY3RpdmUucGVybAorLS0tLS0tLS0tLS0tCisrCitJdCBzaG93cyB0aGF0IGZvby5wbmcgaGFzIGRpZmZlcmVuY2VzIGZyb20gSEVBRCAoYnV0IHRoYXQgaXMKK2JpbmFyeSBzbyBsaW5lIGNvdW50IGNhbm5vdCBiZSBzaG93bikgYW5kIHRoZXJlIGlzIG5vCitkaWZmZXJlbmNlIGJldHdlZW4gaW5kZXhlZCBjb3B5IGFuZCB0aGUgd29ya2luZyB0cmVlCit2ZXJzaW9uIChpZiB0aGUgd29ya2luZyB0cmVlIHZlcnNpb24gd2VyZSBhbHNvIGRpZmZlcmVudCwKKydiaW5hcnknIHdvdWxkIGhhdmUgYmVlbiBzaG93biBpbiBwbGFjZSBvZiAnbm90aGluZycpLiAgVGhlCitvdGhlciBmaWxlLCBnaXQtYWRkLS1pbnRlcmFjdGl2ZS5wZXJsLCBoYXMgNDAzIGxpbmVzIGFkZGVkCithbmQgMzUgbGluZXMgZGVsZXRlZCBpZiB5b3UgY29tbWl0IHdoYXQgaXMgaW4gdGhlIGluZGV4LCBidXQKK3dvcmtpbmcgdHJlZSBmaWxlIGhhcyBmdXJ0aGVyIG1vZGlmaWNhdGlvbnMgKG9uZSBhZGRpdGlvbiBhbmQKK29uZSBkZWxldGlvbikuCisKK3VwZGF0ZTo6CisKKyAgIFRoaXMgc2hvd3MgdGhlIHN0YXR1cyBpbmZvcm1hdGlvbiBhbmQgZ2l2ZXMgcHJvbXB0CisgICAiVXBkYXRlPj4iLiAgV2hlbiB0aGUgcHJvbXB0IGVuZHMgd2l0aCBkb3VibGUgJz4+JywgeW91IGNhbgorICAgbWFrZSBtb3JlIHRoYW4gb25lIHNlbGVjdGlvbiwgY29uY2F0ZW5hdGVkIHdpdGggd2hpdGVzcGFjZSBvcgorICAgY29tbWEuICBBbHNvIHlvdSBjYW4gc2F5IHJhbmdlcy4gIEUuZy4gIjItNSA3LDkiIHRvIGNob29zZQorICAgMiwzLDQsNSw3LDkgZnJvbSB0aGUgbGlzdC4gIFlvdSBjYW4gc2F5ICcqJyB0byBjaG9vc2UKKyAgIGV2ZXJ5dGhpbmcuCisrCitXaGF0IHlvdSBjaG9zZSBhcmUgdGhlbiBoaWdobGlnaHRlZCB3aXRoICcqJywKK2xpa2UgdGhpczoKKysKKy0tLS0tLS0tLS0tLQorICAgICAgICAgICBzdGFnZWQgICAgIHVuc3RhZ2VkIHBhdGgKKyAgMTogICAgICAgYmluYXJ5ICAgICAgbm90aGluZyBmb28ucG5nCisqIDI6ICAgICArNDAzLy0zNSAgICAgICAgKzEvLTEgZ2l0LWFkZC0taW50ZXJhY3RpdmUucGVybAorLS0tLS0tLS0tLS0tCisrCitUbyByZW1vdmUgc2VsZWN0aW9uLCBwcmVmaXggdGhlIGlucHV0IHdpdGggYC1gCitsaWtlIHRoaXM6CisrCistLS0tLS0tLS0tLS0KK1VwZGF0ZT4+IC0yCistLS0tLS0tLS0tLS0KKysKK0FmdGVyIG1ha2luZyB0aGUgc2VsZWN0aW9uLCBhbnN3ZXIgd2l0aCBhbiBlbXB0eSBsaW5lIHRvIHN0YWdlIHRoZQorY29udGVudHMgb2Ygd29ya2luZyB0cmVlIGZpbGVzIGZvciBzZWxlY3RlZCBwYXRocyBpbiB0aGUgaW5kZXguCisKK3JldmVydDo6CisKKyAgVGhpcyBoYXMgYSB2ZXJ5IHNpbWlsYXIgVUkgdG8gJ3VwZGF0ZScsIGFuZCB0aGUgc3RhZ2VkCisgIGluZm9ybWF0aW9uIGZvciBzZWxlY3RlZCBwYXRocyBhcmUgcmV2ZXJ0ZWQgdG8gdGhhdCBvZiB0aGUKKyAgSEVBRCB2ZXJzaW9uLiAgUmV2ZXJ0aW5nIG5ldyBwYXRocyBtYWtlcyB0aGVtIHVudHJhY2tlZC4KKworYWRkIHVudHJhY2tlZDo6CisKKyAgVGhpcyBoYXMgYSB2ZXJ5IHNpbWlsYXIgVUkgdG8gJ3VwZGF0ZScgYW5kCisgICdyZXZlcnQnLCBhbmQgbGV0cyB5b3UgYWRkIHVudHJhY2tlZCBwYXRocyB0byB0aGUgaW5kZXguCisKK3BhdGNoOjoKKworICBUaGlzIGxldHMgeW91IGNob29zZSBvbmUgcGF0aCBvdXQgb2YgJ3N0YXR1cycgbGlrZSBzZWxlY3Rpb24uCisgIEFmdGVyIGNob29zaW5nIHRoZSBwYXRoLCBpdCBwcmVzZW50cyBkaWZmIGJldHdlZW4gdGhlIGluZGV4CisgIGFuZCB0aGUgd29ya2luZyB0cmVlIGZpbGUgYW5kIGFza3MgeW91IGlmIHlvdSB3YW50IHRvIHN0YWdlCisgIHRoZSBjaGFuZ2Ugb2YgZWFjaCBodW5rLiAgWW91IGNhbiBzYXk6CisKKyAgICAgICB5IC0gc3RhZ2UgdGhpcyBodW5rCisgICAgICAgbiAtIGRvIG5vdCBzdGFnZSB0aGlzIGh1bmsKKyAgICAgICBhIC0gc3RhZ2UgdGhpcyBhbmQgYWxsIHRoZSByZW1haW5pbmcgaHVua3MgaW4gdGhlIGZpbGUKKyAgICAgICBkIC0gZG8gbm90IHN0YWdlIHRoaXMgaHVuayBub3IgYW55IG9mIHRoZSByZW1haW5pbmcgaHVua3MgaW4gdGhlIGZpbGUKKyAgICAgICBqIC0gbGVhdmUgdGhpcyBodW5rIHVuZGVjaWRlZCwgc2VlIG5leHQgdW5kZWNpZGVkIGh1bmsKKyAgICAgICBKIC0gbGVhdmUgdGhpcyBodW5rIHVuZGVjaWRlZCwgc2VlIG5leHQgaHVuaworICAgICAgIGsgLSBsZWF2ZSB0aGlzIGh1bmsgdW5kZWNpZGVkLCBzZWUgcHJldmlvdXMgdW5kZWNpZGVkIGh1bmsKKyAgICAgICBLIC0gbGVhdmUgdGhpcyBodW5rIHVuZGVjaWRlZCwgc2VlIHByZXZpb3VzIGh1bmsKKyAgICAgICBzIC0gc3BsaXQgdGhlIGN1cnJlbnQgaHVuayBpbnRvIHNtYWxsZXIgaHVua3MKKyAgICAgICA/IC0gcHJpbnQgaGVscAorKworQWZ0ZXIgZGVjaWRpbmcgdGhlIGZhdGUgZm9yIGFsbCBodW5rcywgaWYgdGhlcmUgaXMgYW55IGh1bmsKK3RoYXQgd2FzIGNob3NlbiwgdGhlIGluZGV4IGlzIHVwZGF0ZWQgd2l0aCB0aGUgc2VsZWN0ZWQgaHVua3MuCisKK2RpZmY6OgorCisgIFRoaXMgbGV0cyB5b3UgcmV2aWV3IHdoYXQgd2lsbCBiZSBjb21taXR0ZWQgKGkuZS4gYmV0d2VlbgorICBIRUFEIGFuZCBpbmRleCkuCisKK0J1Z3MKKy0tLS0KK1RoZSBpbnRlcmFjdGl2ZSBtb2RlIGRvZXMgbm90IHdvcmsgd2l0aCBmaWxlcyB3aG9zZSBuYW1lcyBjb250YWluCitjaGFyYWN0ZXJzIHRoYXQgbmVlZCBDLXF1b3RpbmcuICBgY29yZS5xdW90ZXBhdGhgIGNvbmZpZ3VyYXRpb24gY2FuIGJlCit1c2VkIHRvIHdvcmsgdGhpcyBsaW1pdGF0aW9uIGFyb3VuZCB0byBzb21lIGRlZ3JlZSwgYnV0IGJhY2tzbGFzaCwKK2RvdWJsZS1xdW90ZSBhbmQgY29udHJvbCBjaGFyYWN0ZXJzIHdpbGwgc3RpbGwgaGF2ZSBwcm9ibGVtcy4KKworU2VlIEFsc28KKy0tLS0tLS0tCitsaW5rZ2l0OmdpdC1zdGF0dXNbMV0KK2xpbmtnaXQ6Z2l0LXJtWzFdCitsaW5rZ2l0OmdpdC1yZXNldFsxXQorbGlua2dpdDpnaXQtbXZbMV0KK2xpbmtnaXQ6Z2l0LWNvbW1pdFsxXQorbGlua2dpdDpnaXQtdXBkYXRlLWluZGV4WzFdCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtYW0udHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtYW0udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzODdhOGQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1hbS50eHQKQEAgLTAsMCArMSwxNTYgQEAKK2dpdC1hbSgxKQorPT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1hbSAtIEFwcGx5IGEgc2VyaWVzIG9mIHBhdGNoZXMgZnJvbSBhIG1haWxib3gKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtYW0nIFstLXNpZ25vZmZdIFstLWtlZXBdIFstLXV0ZjggfCAtLW5vLXV0ZjhdCisgICAgICAgICBbLS0zd2F5XSBbLS1pbnRlcmFjdGl2ZV0gWy0tYmluYXJ5XQorICAgICAgICAgWy0td2hpdGVzcGFjZT08b3B0aW9uPl0gWy1DPG4+XSBbLXA8bj5dCisgICAgICAgICA8bWJveD58PE1haWxkaXI+Li4uCisnZ2l0LWFtJyBbLS1za2lwIHwgLS1yZXNvbHZlZF0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitTcGxpdHMgbWFpbCBtZXNzYWdlcyBpbiBhIG1haWxib3ggaW50byBjb21taXQgbG9nIG1lc3NhZ2UsCithdXRob3JzaGlwIGluZm9ybWF0aW9uIGFuZCBwYXRjaGVzLCBhbmQgYXBwbGllcyB0aGVtIHRvIHRoZQorY3VycmVudCBicmFuY2guCisKK09QVElPTlMKKy0tLS0tLS0KKzxtYm94Pnw8TWFpbGRpcj4uLi46OgorCVRoZSBsaXN0IG9mIG1haWxib3ggZmlsZXMgdG8gcmVhZCBwYXRjaGVzIGZyb20uIElmIHlvdSBkbyBub3QKKwlzdXBwbHkgdGhpcyBhcmd1bWVudCwgcmVhZHMgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQuIElmIHlvdSBzdXBwbHkKKwlkaXJlY3RvcmllcywgdGhleSdsbCBiZSB0cmVhdGVkIGFzIE1haWxkaXJzLgorCistcywgLS1zaWdub2ZmOjoKKwlBZGQgYFNpZ25lZC1vZmYtYnk6YCBsaW5lIHRvIHRoZSBjb21taXQgbWVzc2FnZSwgdXNpbmcKKwl0aGUgY29tbWl0dGVyIGlkZW50aXR5IG9mIHlvdXJzZWxmLgorCistaywgLS1rZWVwOjoKKwlQYXNzIGAta2AgZmxhZyB0byBgZ2l0LW1haWxpbmZvYCAoc2VlIGxpbmtnaXQ6Z2l0LW1haWxpbmZvWzFdKS4KKworLXUsIC0tdXRmODo6CisJUGFzcyBgLXVgIGZsYWcgdG8gYGdpdC1tYWlsaW5mb2AgKHNlZSBsaW5rZ2l0OmdpdC1tYWlsaW5mb1sxXSkuCisJVGhlIHByb3Bvc2VkIGNvbW1pdCBsb2cgbWVzc2FnZSB0YWtlbiBmcm9tIHRoZSBlLW1haWwKKwlpcyByZS1jb2RlZCBpbnRvIFVURi04IGVuY29kaW5nIChjb25maWd1cmF0aW9uIHZhcmlhYmxlCisJYGkxOG4uY29tbWl0ZW5jb2RpbmdgIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgcHJvamVjdCdzCisJcHJlZmVycmVkIGVuY29kaW5nIGlmIGl0IGlzIG5vdCBVVEYtOCkuCisrCitUaGlzIHdhcyBvcHRpb25hbCBpbiBwcmlvciB2ZXJzaW9ucyBvZiBnaXQsIGJ1dCBub3cgaXQgaXMgdGhlCitkZWZhdWx0LiAgIFlvdSBjb3VsZCB1c2UgYC0tbm8tdXRmOGAgdG8gb3ZlcnJpZGUgdGhpcy4KKworLS1uby11dGY4OjoKKwlQYXNzIGAtbmAgZmxhZyB0byBgZ2l0LW1haWxpbmZvYCAoc2VlCisJbGlua2dpdDpnaXQtbWFpbGluZm9bMV0pLgorCistMywgLS0zd2F5OjoKKwlXaGVuIHRoZSBwYXRjaCBkb2VzIG5vdCBhcHBseSBjbGVhbmx5LCBmYWxsIGJhY2sgb24KKwkzLXdheSBtZXJnZSwgaWYgdGhlIHBhdGNoIHJlY29yZHMgdGhlIGlkZW50aXR5IG9mIGJsb2JzCisJaXQgaXMgc3VwcG9zZWQgdG8gYXBwbHkgdG8sIGFuZCB3ZSBoYXZlIHRob3NlIGJsb2JzCisJYXZhaWxhYmxlIGxvY2FsbHkuCisKKy1iLCAtLWJpbmFyeTo6CisJUGFzcyBgLS1hbGxvdy1iaW5hcnktcmVwbGFjZW1lbnRgIGZsYWcgdG8gYGdpdC1hcHBseWAKKwkoc2VlIGxpbmtnaXQ6Z2l0LWFwcGx5WzFdKS4KKworLS13aGl0ZXNwYWNlPTxvcHRpb24+OjoKKwlUaGlzIGZsYWcgaXMgcGFzc2VkIHRvIHRoZSBgZ2l0LWFwcGx5YCAoc2VlIGxpbmtnaXQ6Z2l0LWFwcGx5WzFdKQorCXByb2dyYW0gdGhhdCBhcHBsaWVzCisJdGhlIHBhdGNoLgorCistQzxuPiwgLXA8bj46OgorCVRoZXNlIGZsYWdzIGFyZSBwYXNzZWQgdG8gdGhlIGBnaXQtYXBwbHlgIChzZWUgbGlua2dpdDpnaXQtYXBwbHlbMV0pCisJcHJvZ3JhbSB0aGF0IGFwcGxpZXMKKwl0aGUgcGF0Y2guCisKKy1pLCAtLWludGVyYWN0aXZlOjoKKwlSdW4gaW50ZXJhY3RpdmVseS4KKworLS1za2lwOjoKKwlTa2lwIHRoZSBjdXJyZW50IHBhdGNoLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbgorCXJlc3RhcnRpbmcgYW4gYWJvcnRlZCBwYXRjaC4KKworLXIsIC0tcmVzb2x2ZWQ6OgorCUFmdGVyIGEgcGF0Y2ggZmFpbHVyZSAoZS5nLiBhdHRlbXB0aW5nIHRvIGFwcGx5CisJY29uZmxpY3RpbmcgcGF0Y2gpLCB0aGUgdXNlciBoYXMgYXBwbGllZCBpdCBieSBoYW5kIGFuZAorCXRoZSBpbmRleCBmaWxlIHN0b3JlcyB0aGUgcmVzdWx0IG9mIHRoZSBhcHBsaWNhdGlvbi4KKwlNYWtlIGEgY29tbWl0IHVzaW5nIHRoZSBhdXRob3JzaGlwIGFuZCBjb21taXQgbG9nCisJZXh0cmFjdGVkIGZyb20gdGhlIGUtbWFpbCBtZXNzYWdlIGFuZCB0aGUgY3VycmVudCBpbmRleAorCWZpbGUsIGFuZCBjb250aW51ZS4KKworLS1yZXNvbHZlbXNnPTxtc2c+OjoKKwlXaGVuIGEgcGF0Y2ggZmFpbHVyZSBvY2N1cnMsIDxtc2c+IHdpbGwgYmUgcHJpbnRlZAorCXRvIHRoZSBzY3JlZW4gYmVmb3JlIGV4aXRpbmcuICBUaGlzIG92ZXJyaWRlcyB0aGUKKwlzdGFuZGFyZCBtZXNzYWdlIGluZm9ybWluZyB5b3UgdG8gdXNlIGAtLXJlc29sdmVkYAorCW9yIGAtLXNraXBgIHRvIGhhbmRsZSB0aGUgZmFpbHVyZS4gIFRoaXMgaXMgc29sZWx5CisJZm9yIGludGVybmFsIHVzZSBiZXR3ZWVuIGBnaXQtcmViYXNlYCBhbmQgYGdpdC1hbWAuCisKK0RJU0NVU1NJT04KKy0tLS0tLS0tLS0KKworVGhlIGNvbW1pdCBhdXRob3IgbmFtZSBpcyB0YWtlbiBmcm9tIHRoZSAiRnJvbTogIiBsaW5lIG9mIHRoZQorbWVzc2FnZSwgYW5kIGNvbW1pdCBhdXRob3IgdGltZSBpcyB0YWtlbiBmcm9tIHRoZSAiRGF0ZTogIiBsaW5lCitvZiB0aGUgbWVzc2FnZS4gIFRoZSAiU3ViamVjdDogIiBsaW5lIGlzIHVzZWQgYXMgdGhlIHRpdGxlIG9mCit0aGUgY29tbWl0LCBhZnRlciBzdHJpcHBpbmcgY29tbW9uIHByZWZpeCAiW1BBVENIIDxhbnl0aGluZz5dIi4KK0l0IGlzIHN1cHBvc2VkIHRvIGRlc2NyaWJlIHdoYXQgdGhlIGNvbW1pdCBpcyBhYm91dCBjb25jaXNlbHkgYXMKK2Egb25lIGxpbmUgdGV4dC4KKworVGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UgKGlvdywgYWZ0ZXIgYSBibGFuayBsaW5lIHRoYXQgdGVybWluYXRlcworUkZDMjgyMiBoZWFkZXJzKSBjYW4gYmVnaW4gd2l0aCAiU3ViamVjdDogIiBhbmQgIkZyb206ICIgbGluZXMKK3RoYXQgYXJlIGRpZmZlcmVudCBmcm9tIHRob3NlIG9mIHRoZSBtYWlsIGhlYWRlciwgdG8gb3ZlcnJpZGUKK3RoZSB2YWx1ZXMgb2YgdGhlc2UgZmllbGRzLgorCitUaGUgY29tbWl0IG1lc3NhZ2UgaXMgZm9ybWVkIGJ5IHRoZSB0aXRsZSB0YWtlbiBmcm9tIHRoZQorIlN1YmplY3Q6ICIsIGEgYmxhbmsgbGluZSBhbmQgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UgdXAgdG8KK3doZXJlIHRoZSBwYXRjaCBiZWdpbnMuICBFeGNlc3Mgd2hpdGVzcGFjZXMgYXQgdGhlIGVuZCBvZiB0aGUKK2xpbmVzIGFyZSBhdXRvbWF0aWNhbGx5IHN0cmlwcGVkLgorCitUaGUgcGF0Y2ggaXMgZXhwZWN0ZWQgdG8gYmUgaW5saW5lLCBkaXJlY3RseSBmb2xsb3dpbmcgdGhlCittZXNzYWdlLiAgQW55IGxpbmUgdGhhdCBpcyBvZiBmb3JtOgorCisqIHRocmVlLWRhc2hlcyBhbmQgZW5kLW9mLWxpbmUsIG9yCisqIGEgbGluZSB0aGF0IGJlZ2lucyB3aXRoICJkaWZmIC0iLCBvcgorKiBhIGxpbmUgdGhhdCBiZWdpbnMgd2l0aCAiSW5kZXg6ICIKKworaXMgdGFrZW4gYXMgdGhlIGJlZ2lubmluZyBvZiBhIHBhdGNoLCBhbmQgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZQoraXMgdGVybWluYXRlZCBiZWZvcmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2Ygc3VjaCBhIGxpbmUuCisKK1doZW4gaW5pdGlhbGx5IGludm9raW5nIGl0LCB5b3UgZ2l2ZSBpdCBuYW1lcyBvZiB0aGUgbWFpbGJveGVzCit0byBjcnVuY2guICBVcG9uIHNlZWluZyB0aGUgZmlyc3QgcGF0Y2ggdGhhdCBkb2VzIG5vdCBhcHBseSwgaXQKK2Fib3J0cyBpbiB0aGUgbWlkZGxlLC4gIFlvdSBjYW4gcmVjb3ZlciBmcm9tIHRoaXMgaW4gb25lIG9mIHR3byB3YXlzOgorCisuIHNraXAgdGhlIGN1cnJlbnQgcGF0Y2ggYnkgcmUtcnVubmluZyB0aGUgY29tbWFuZCB3aXRoICctLXNraXAnCisgIG9wdGlvbi4KKworLiBoYW5kIHJlc29sdmUgdGhlIGNvbmZsaWN0IGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIHVwZGF0ZQorICB0aGUgaW5kZXggZmlsZSB0byBicmluZyBpdCBpbiBhIHN0YXRlIHRoYXQgdGhlIHBhdGNoIHNob3VsZAorICBoYXZlIHByb2R1Y2VkLiAgVGhlbiBydW4gdGhlIGNvbW1hbmQgd2l0aCAnLS1yZXNvbHZlZCcgb3B0aW9uLgorCitUaGUgY29tbWFuZCByZWZ1c2VzIHRvIHByb2Nlc3MgbmV3IG1haWxib3hlcyB3aGlsZSBgLmRvdGVzdGAKK2RpcmVjdG9yeSBleGlzdHMsIHNvIGlmIHlvdSBkZWNpZGUgdG8gc3RhcnQgb3ZlciBmcm9tIHNjcmF0Y2gsCitydW4gYHJtIC1mIC1yIC5kb3Rlc3RgIGJlZm9yZSBydW5uaW5nIHRoZSBjb21tYW5kIHdpdGggbWFpbGJveAorbmFtZXMuCisKKworU0VFIEFMU08KKy0tLS0tLS0tCitsaW5rZ2l0OmdpdC1hcHBseVsxXS4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IFBldHIgQmF1ZGlzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1hbm5vdGF0ZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1hbm5vdGF0ZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVhNmE3MgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWFubm90YXRlLnR4dApAQCAtMCwwICsxLDMxIEBACitnaXQtYW5ub3RhdGUoMSkKKz09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtYW5ub3RhdGUgLSBBbm5vdGF0ZSBmaWxlIGxpbmVzIHdpdGggY29tbWl0IGluZm8KKworU1lOT1BTSVMKKy0tLS0tLS0tCitnaXQtYW5ub3RhdGUgW29wdGlvbnNdIGZpbGUgW3JldmlzaW9uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0Fubm90YXRlcyBlYWNoIGxpbmUgaW4gdGhlIGdpdmVuIGZpbGUgd2l0aCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjb21taXQKK3doaWNoIGludHJvZHVjZWQgdGhlIGxpbmUuIE9wdGlvbmFsbHkgYW5ub3RhdGUgZnJvbSBhIGdpdmVuIHJldmlzaW9uLgorCitPUFRJT05TCistLS0tLS0tCitpbmNsdWRlOjpibGFtZS1vcHRpb25zLnR4dFtdCisKK1NFRSBBTFNPCistLS0tLS0tLQorbGlua2dpdDpnaXQtYmxhbWVbMV0KKworQVVUSE9SCistLS0tLS0KK1dyaXR0ZW4gYnkgUnlhbiBBbmRlcnNvbiA8cnlhbkBtaWNob25saW5lLmNvbT4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtYXBwbHkudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtYXBwbHkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZWMyZWMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1hcHBseS50eHQKQEAgLTAsMCArMSwyMDkgQEAKK2dpdC1hcHBseSgxKQorPT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1hcHBseSAtIEFwcGx5IGEgcGF0Y2ggb24gYSBnaXQgaW5kZXggZmlsZSBhbmQgYSB3b3JraW5nIHRyZWUKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtYXBwbHknIFstLXN0YXRdIFstLW51bXN0YXRdIFstLXN1bW1hcnldIFstLWNoZWNrXSBbLS1pbmRleF0KKwkgIFstLWFwcGx5XSBbLS1uby1hZGRdIFstLWJ1aWxkLWZha2UtYW5jZXN0b3IgPGZpbGU+XSBbLVIgfCAtLXJldmVyc2VdCisJICBbLS1hbGxvdy1iaW5hcnktcmVwbGFjZW1lbnQgfCAtLWJpbmFyeV0gWy0tcmVqZWN0XSBbLXpdCisJICBbLXBOVU1dIFstQ05VTV0gWy0taW5hY2N1cmF0ZS1lb2ZdIFstLWNhY2hlZF0KKwkgIFstLXdoaXRlc3BhY2U9PG5vd2Fybnx3YXJufGZpeHxlcnJvcnxlcnJvci1hbGw+XQorCSAgWy0tZXhjbHVkZT1QQVRIXSBbLS12ZXJib3NlXSBbPHBhdGNoPi4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitSZWFkcyBzdXBwbGllZCBkaWZmIG91dHB1dCBhbmQgYXBwbGllcyBpdCBvbiBhIGdpdCBpbmRleCBmaWxlCithbmQgYSB3b3JrIHRyZWUuCisKK09QVElPTlMKKy0tLS0tLS0KKzxwYXRjaD4uLi46OgorCVRoZSBmaWxlcyB0byByZWFkIHBhdGNoIGZyb20uICAnLScgY2FuIGJlIHVzZWQgdG8gcmVhZAorCWZyb20gdGhlIHN0YW5kYXJkIGlucHV0LgorCistLXN0YXQ6OgorCUluc3RlYWQgb2YgYXBwbHlpbmcgdGhlIHBhdGNoLCBvdXRwdXQgZGlmZnN0YXQgZm9yIHRoZQorCWlucHV0LiAgVHVybnMgb2ZmICJhcHBseSIuCisKKy0tbnVtc3RhdDo6CisJU2ltaWxhciB0byBcLS1zdGF0LCBidXQgc2hvd3MgbnVtYmVyIG9mIGFkZGVkIGFuZAorCWRlbGV0ZWQgbGluZXMgaW4gZGVjaW1hbCBub3RhdGlvbiBhbmQgcGF0aG5hbWUgd2l0aG91dAorCWFiYnJldmlhdGlvbiwgdG8gbWFrZSBpdCBtb3JlIG1hY2hpbmUgZnJpZW5kbHkuICBGb3IKKwliaW5hcnkgZmlsZXMsIG91dHB1dHMgdHdvIGAtYCBpbnN0ZWFkIG9mIHNheWluZworCWAwIDBgLiAgVHVybnMgb2ZmICJhcHBseSIuCisKKy0tc3VtbWFyeTo6CisJSW5zdGVhZCBvZiBhcHBseWluZyB0aGUgcGF0Y2gsIG91dHB1dCBhIGNvbmRlbnNlZAorCXN1bW1hcnkgb2YgaW5mb3JtYXRpb24gb2J0YWluZWQgZnJvbSBnaXQgZGlmZiBleHRlbmRlZAorCWhlYWRlcnMsIHN1Y2ggYXMgY3JlYXRpb25zLCByZW5hbWVzIGFuZCBtb2RlIGNoYW5nZXMuCisJVHVybnMgb2ZmICJhcHBseSIuCisKKy0tY2hlY2s6OgorCUluc3RlYWQgb2YgYXBwbHlpbmcgdGhlIHBhdGNoLCBzZWUgaWYgdGhlIHBhdGNoIGlzCisJYXBwbGljYWJsZSB0byB0aGUgY3VycmVudCB3b3JrIHRyZWUgYW5kL29yIHRoZSBpbmRleAorCWZpbGUgYW5kIGRldGVjdHMgZXJyb3JzLiAgVHVybnMgb2ZmICJhcHBseSIuCisKKy0taW5kZXg6OgorCVdoZW4gLS1jaGVjayBpcyBpbiBlZmZlY3QsIG9yIHdoZW4gYXBwbHlpbmcgdGhlIHBhdGNoCisJKHdoaWNoIGlzIHRoZSBkZWZhdWx0IHdoZW4gbm9uZSBvZiB0aGUgb3B0aW9ucyB0aGF0CisJZGlzYWJsZXMgaXQgaXMgaW4gZWZmZWN0KSwgbWFrZSBzdXJlIHRoZSBwYXRjaCBpcworCWFwcGxpY2FibGUgdG8gd2hhdCB0aGUgY3VycmVudCBpbmRleCBmaWxlIHJlY29yZHMuICBJZgorCXRoZSBmaWxlIHRvIGJlIHBhdGNoZWQgaW4gdGhlIHdvcmsgdHJlZSBpcyBub3QKKwl1cC10by1kYXRlLCBpdCBpcyBmbGFnZ2VkIGFzIGFuIGVycm9yLiAgVGhpcyBmbGFnIGFsc28KKwljYXVzZXMgdGhlIGluZGV4IGZpbGUgdG8gYmUgdXBkYXRlZC4KKworLS1jYWNoZWQ6OgorCUFwcGx5IGEgcGF0Y2ggd2l0aG91dCB0b3VjaGluZyB0aGUgd29ya2luZyB0cmVlLiBJbnN0ZWFkLCB0YWtlIHRoZQorCWNhY2hlZCBkYXRhLCBhcHBseSB0aGUgcGF0Y2gsIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIHRoZSBpbmRleCwKKwl3aXRob3V0IHVzaW5nIHRoZSB3b3JraW5nIHRyZWUuIFRoaXMgaW1wbGllcyAnLS1pbmRleCcuCisKKy0tYnVpbGQtZmFrZS1hbmNlc3RvciA8ZmlsZT46OgorCU5ld2VyIGdpdC1kaWZmIG91dHB1dCBoYXMgZW1iZWRkZWQgJ2luZGV4IGluZm9ybWF0aW9uJworCWZvciBlYWNoIGJsb2IgdG8gaGVscCBpZGVudGlmeSB0aGUgb3JpZ2luYWwgdmVyc2lvbiB0aGF0CisJdGhlIHBhdGNoIGFwcGxpZXMgdG8uICBXaGVuIHRoaXMgZmxhZyBpcyBnaXZlbiwgYW5kIGlmCisJdGhlIG9yaWdpbmFsIHZlcnNpb25zIG9mIHRoZSBibG9icyBpcyBhdmFpbGFibGUgbG9jYWxseSwKKwlidWlsZHMgYSB0ZW1wb3JhcnkgaW5kZXggY29udGFpbmluZyB0aG9zZSBibG9icy4KKysKK1doZW4gYSBwdXJlIG1vZGUgY2hhbmdlIGlzIGVuY291bnRlcmVkICh3aGljaCBoYXMgbm8gaW5kZXggaW5mb3JtYXRpb24pLAordGhlIGluZm9ybWF0aW9uIGlzIHJlYWQgZnJvbSB0aGUgY3VycmVudCBpbmRleCBpbnN0ZWFkLgorCistUiwgLS1yZXZlcnNlOjoKKwlBcHBseSB0aGUgcGF0Y2ggaW4gcmV2ZXJzZS4KKworLS1yZWplY3Q6OgorCUZvciBhdG9taWNpdHksIGxpbmtnaXQ6Z2l0LWFwcGx5WzFdIGJ5IGRlZmF1bHQgZmFpbHMgdGhlIHdob2xlIHBhdGNoIGFuZAorCWRvZXMgbm90IHRvdWNoIHRoZSB3b3JraW5nIHRyZWUgd2hlbiBzb21lIG9mIHRoZSBodW5rcworCWRvIG5vdCBhcHBseS4gIFRoaXMgb3B0aW9uIG1ha2VzIGl0IGFwcGx5CisJdGhlIHBhcnRzIG9mIHRoZSBwYXRjaCB0aGF0IGFyZSBhcHBsaWNhYmxlLCBhbmQgbGVhdmUgdGhlCisJcmVqZWN0ZWQgaHVua3MgaW4gY29ycmVzcG9uZGluZyAqLnJlaiBmaWxlcy4KKworLXo6OgorCVdoZW4gc2hvd2luZyB0aGUgaW5kZXggaW5mb3JtYXRpb24sIGRvIG5vdCBtdW5nZSBwYXRocywKKwlidXQgdXNlIE5VTCB0ZXJtaW5hdGVkIG1hY2hpbmUgcmVhZGFibGUgZm9ybWF0LiAgV2l0aG91dAorCXRoaXMgZmxhZywgdGhlIHBhdGhuYW1lcyBvdXRwdXQgd2lsbCBoYXZlIFRBQiwgTEYsIGFuZAorCWJhY2tzbGFzaCBjaGFyYWN0ZXJzIHJlcGxhY2VkIHdpdGggYFx0YCwgYFxuYCwgYW5kIGBcXGAsCisJcmVzcGVjdGl2ZWx5LgorCistcDxuPjo6CisJUmVtb3ZlIDxuPiBsZWFkaW5nIHNsYXNoZXMgZnJvbSB0cmFkaXRpb25hbCBkaWZmIHBhdGhzLiBUaGUKKwlkZWZhdWx0IGlzIDEuCisKKy1DPG4+OjoKKwlFbnN1cmUgYXQgbGVhc3QgPG4+IGxpbmVzIG9mIHN1cnJvdW5kaW5nIGNvbnRleHQgbWF0Y2ggYmVmb3JlCisJYW5kIGFmdGVyIGVhY2ggY2hhbmdlLiAgV2hlbiBmZXdlciBsaW5lcyBvZiBzdXJyb3VuZGluZworCWNvbnRleHQgZXhpc3QgdGhleSBhbGwgbXVzdCBtYXRjaC4gIEJ5IGRlZmF1bHQgbm8gY29udGV4dCBpcworCWV2ZXIgaWdub3JlZC4KKworLS11bmlkaWZmLXplcm86OgorCUJ5IGRlZmF1bHQsIGxpbmtnaXQ6Z2l0LWFwcGx5WzFdIGV4cGVjdHMgdGhhdCB0aGUgcGF0Y2ggYmVpbmcKKwlhcHBsaWVkIGlzIGEgdW5pZmllZCBkaWZmIHdpdGggYXQgbGVhc3Qgb25lIGxpbmUgb2YgY29udGV4dC4KKwlUaGlzIHByb3ZpZGVzIGdvb2Qgc2FmZXR5IG1lYXN1cmVzLCBidXQgYnJlYWtzIGRvd24gd2hlbgorCWFwcGx5aW5nIGEgZGlmZiBnZW5lcmF0ZWQgd2l0aCAtLXVuaWZpZWQ9MC4gVG8gYnlwYXNzIHRoZXNlCisJY2hlY2tzIHVzZSAnLS11bmlkaWZmLXplcm8nLgorKworTm90ZSwgZm9yIHRoZSByZWFzb25zIHN0YXRlZCBhYm92ZSB1c2FnZSBvZiBjb250ZXh0LWZyZWUgcGF0Y2hlcyBhcmUKK2Rpc2NvdXJhZ2VkLgorCistLWFwcGx5OjoKKwlJZiB5b3UgdXNlIGFueSBvZiB0aGUgb3B0aW9ucyBtYXJrZWQgIlR1cm5zIG9mZgorCSdhcHBseSciIGFib3ZlLCBsaW5rZ2l0OmdpdC1hcHBseVsxXSByZWFkcyBhbmQgb3V0cHV0cyB0aGUKKwlpbmZvcm1hdGlvbiB5b3UgYXNrZWQgd2l0aG91dCBhY3R1YWxseSBhcHBseWluZyB0aGUKKwlwYXRjaC4gIEdpdmUgdGhpcyBmbGFnIGFmdGVyIHRob3NlIGZsYWdzIHRvIGFsc28gYXBwbHkKKwl0aGUgcGF0Y2guCisKKy0tbm8tYWRkOjoKKwlXaGVuIGFwcGx5aW5nIGEgcGF0Y2gsIGlnbm9yZSBhZGRpdGlvbnMgbWFkZSBieSB0aGUKKwlwYXRjaC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gZXh0cmFjdCB0aGUgY29tbW9uIHBhcnQgYmV0d2VlbgorCXR3byBmaWxlcyBieSBmaXJzdCBydW5uaW5nIGBkaWZmYCBvbiB0aGVtIGFuZCBhcHBseWluZworCXRoZSByZXN1bHQgd2l0aCB0aGlzIG9wdGlvbiwgd2hpY2ggd291bGQgYXBwbHkgdGhlCisJZGVsZXRpb24gcGFydCBidXQgbm90IGFkZGl0aW9uIHBhcnQuCisKKy0tYWxsb3ctYmluYXJ5LXJlcGxhY2VtZW50LCAtLWJpbmFyeTo6CisJSGlzdG9yaWNhbGx5IHdlIGRpZCBub3QgYWxsb3cgYmluYXJ5IHBhdGNoIGFwcGxpZWQKKwl3aXRob3V0IGFuIGV4cGxpY2l0IHBlcm1pc3Npb24gZnJvbSB0aGUgdXNlciwgYW5kIHRoaXMKKwlmbGFnIHdhcyB0aGUgd2F5IHRvIGRvIHNvLiAgQ3VycmVudGx5IHdlIGFsd2F5cyBhbGxvdyBiaW5hcnkKKwlwYXRjaCBhcHBsaWNhdGlvbiwgc28gdGhpcyBpcyBhIG5vLW9wLgorCistLWV4Y2x1ZGU9PHBhdGgtcGF0dGVybj46OgorCURvbid0IGFwcGx5IGNoYW5nZXMgdG8gZmlsZXMgbWF0Y2hpbmcgdGhlIGdpdmVuIHBhdGggcGF0dGVybi4gVGhpcyBjYW4KKwliZSB1c2VmdWwgd2hlbiBpbXBvcnRpbmcgcGF0Y2hzZXRzLCB3aGVyZSB5b3Ugd2FudCB0byBleGNsdWRlIGNlcnRhaW4KKwlmaWxlcyBvciBkaXJlY3Rvcmllcy4KKworLS13aGl0ZXNwYWNlPTxhY3Rpb24+OjoKKwlXaGVuIGFwcGx5aW5nIGEgcGF0Y2gsIGRldGVjdCBhIG5ldyBvciBtb2RpZmllZCBsaW5lIHRoYXQgaGFzCisJd2hpdGVzcGFjZSBlcnJvcnMuICBXaGF0IGFyZSBjb25zaWRlcmVkIHdoaXRlc3BhY2UgZXJyb3JzIGlzCisJY29udHJvbGxlZCBieSBgY29yZS53aGl0ZXNwYWNlYCBjb25maWd1cmF0aW9uLiAgQnkgZGVmYXVsdCwKKwl0cmFpbGluZyB3aGl0ZXNwYWNlcyAoaW5jbHVkaW5nIGxpbmVzIHRoYXQgc29sZWx5IGNvbnNpc3Qgb2YKKwl3aGl0ZXNwYWNlcykgYW5kIGEgc3BhY2UgY2hhcmFjdGVyIHRoYXQgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQKKwlieSBhIHRhYiBjaGFyYWN0ZXIgaW5zaWRlIHRoZSBpbml0aWFsIGluZGVudCBvZiB0aGUgbGluZSBhcmUKKwljb25zaWRlcmVkIHdoaXRlc3BhY2UgZXJyb3JzLgorKworQnkgZGVmYXVsdCwgdGhlIGNvbW1hbmQgb3V0cHV0cyB3YXJuaW5nIG1lc3NhZ2VzIGJ1dCBhcHBsaWVzIHRoZSBwYXRjaC4KK1doZW4gbGlua2dpdDpnaXQtYXBwbHlbMV0gaXMgdXNlZCBmb3Igc3RhdGlzdGljcyBhbmQgbm90IGFwcGx5aW5nIGEKK3BhdGNoLCBpdCBkZWZhdWx0cyB0byBgbm93YXJuYC4KKysKK1lvdSBjYW4gdXNlIGRpZmZlcmVudCBgPGFjdGlvbj5gIHRvIGNvbnRyb2wgdGhpcworYmVoYXZpb3I6CisrCisqIGBub3dhcm5gIHR1cm5zIG9mZiB0aGUgdHJhaWxpbmcgd2hpdGVzcGFjZSB3YXJuaW5nLgorKiBgd2FybmAgb3V0cHV0cyB3YXJuaW5ncyBmb3IgYSBmZXcgc3VjaCBlcnJvcnMsIGJ1dCBhcHBsaWVzIHRoZQorICBwYXRjaCBhcy1pcyAoZGVmYXVsdCkuCisqIGBmaXhgIG91dHB1dHMgd2FybmluZ3MgZm9yIGEgZmV3IHN1Y2ggZXJyb3JzLCBhbmQgYXBwbGllcyB0aGUKKyAgcGF0Y2ggYWZ0ZXIgZml4aW5nIHRoZW0gKGBzdHJpcGAgaXMgYSBzeW5vbnltIC0tLSB0aGUgdG9vbAorICB1c2VkIHRvIGNvbnNpZGVyIG9ubHkgdHJhaWxpbmcgd2hpdGVzcGFjZXMgYXMgZXJyb3JzLCBhbmQgdGhlCisgIGZpeCBpbnZvbHZlZCAnc3RyaXBwaW5nJyB0aGVtLCBidXQgbW9kZXJuIGdpdHMgZG8gbW9yZSkuCisqIGBlcnJvcmAgb3V0cHV0cyB3YXJuaW5ncyBmb3IgYSBmZXcgc3VjaCBlcnJvcnMsIGFuZCByZWZ1c2VzCisgIHRvIGFwcGx5IHRoZSBwYXRjaC4KKyogYGVycm9yLWFsbGAgaXMgc2ltaWxhciB0byBgZXJyb3JgIGJ1dCBzaG93cyBhbGwgZXJyb3JzLgorCistLWluYWNjdXJhdGUtZW9mOjoKKwlVbmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHNvbWUgdmVyc2lvbnMgb2YgZGlmZiBkbyBub3QgY29ycmVjdGx5CisJZGV0ZWN0IGEgbWlzc2luZyBuZXctbGluZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBBcyBhIHJlc3VsdCwgcGF0Y2hlcworCWNyZWF0ZWQgYnkgc3VjaCBkaWZmIHByb2dyYW1zIGRvIG5vdCByZWNvcmQgaW5jb21wbGV0ZSBsaW5lcworCWNvcnJlY3RseS4gVGhpcyBvcHRpb24gYWRkcyBzdXBwb3J0IGZvciBhcHBseWluZyBzdWNoIHBhdGNoZXMgYnkKKwl3b3JraW5nIGFyb3VuZCB0aGlzIGJ1Zy4KKworLXYsIC0tdmVyYm9zZTo6CisJUmVwb3J0IHByb2dyZXNzIHRvIHN0ZGVyci4gQnkgZGVmYXVsdCwgb25seSBhIG1lc3NhZ2UgYWJvdXQgdGhlCisJY3VycmVudCBwYXRjaCBiZWluZyBhcHBsaWVkIHdpbGwgYmUgcHJpbnRlZC4gVGhpcyBvcHRpb24gd2lsbCBjYXVzZQorCWFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gYmUgcmVwb3J0ZWQuCisKK0NvbmZpZ3VyYXRpb24KKy0tLS0tLS0tLS0tLS0KKworYXBwbHkud2hpdGVzcGFjZTo6CisJV2hlbiBubyBgLS13aGl0ZXNwYWNlYCBmbGFnIGlzIGdpdmVuIGZyb20gdGhlIGNvbW1hbmQKKwlsaW5lLCB0aGlzIGNvbmZpZ3VyYXRpb24gaXRlbSBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0LgorCitTdWJtb2R1bGVzCistLS0tLS0tLS0tCitJZiB0aGUgcGF0Y2ggY29udGFpbnMgYW55IGNoYW5nZXMgdG8gc3VibW9kdWxlcyB0aGVuIGxpbmtnaXQ6Z2l0LWFwcGx5WzFdCit0cmVhdHMgdGhlc2UgY2hhbmdlcyBhcyBmb2xsb3dzLgorCitJZiAtLWluZGV4IGlzIHNwZWNpZmllZCAoZXhwbGljaXRseSBvciBpbXBsaWNpdGx5KSwgdGhlbiB0aGUgc3VibW9kdWxlCitjb21taXRzIG11c3QgbWF0Y2ggdGhlIGluZGV4IGV4YWN0bHkgZm9yIHRoZSBwYXRjaCB0byBhcHBseS4gIElmIGFueQorb2YgdGhlIHN1Ym1vZHVsZXMgYXJlIGNoZWNrZWQtb3V0LCB0aGVuIHRoZXNlIGNoZWNrLW91dHMgYXJlIGNvbXBsZXRlbHkKK2lnbm9yZWQsIGkuZS4sIHRoZXkgYXJlIG5vdCByZXF1aXJlZCB0byBiZSB1cC10by1kYXRlIG9yIGNsZWFuIGFuZCB0aGV5CithcmUgbm90IHVwZGF0ZWQuCisKK0lmIC0taW5kZXggaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0aGUgc3VibW9kdWxlIGNvbW1pdHMgaW4gdGhlIHBhdGNoCithcmUgaWdub3JlZCBhbmQgb25seSB0aGUgYWJzZW5jZSBvZiBwcmVzZW5jZSBvZiB0aGUgY29ycmVzcG9uZGluZworc3ViZGlyZWN0b3J5IGlzIGNoZWNrZWQgYW5kIChpZiBwb3NzaWJsZSkgdXBkYXRlZC4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWFyY2hpbXBvcnQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtYXJjaGltcG9ydC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQyMGZkOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWFyY2hpbXBvcnQudHh0CkBAIC0wLDAgKzEsMTIwIEBACitnaXQtYXJjaGltcG9ydCgxKQorPT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWFyY2hpbXBvcnQgLSBJbXBvcnQgYW4gQXJjaCByZXBvc2l0b3J5IGludG8gZ2l0CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWFyY2hpbXBvcnQnIFstaF0gWy12XSBbLW9dIFstYV0gWy1mXSBbLVRdIFstRCBkZXB0aF0gWy10IHRlbXBkaXJdCisgICAgICAgICAgICAgICA8YXJjaGl2ZS9icmFuY2g+Wzo8Z2l0LWJyYW5jaD5dIC4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0ltcG9ydHMgYSBwcm9qZWN0IGZyb20gb25lIG9yIG1vcmUgQXJjaCByZXBvc2l0b3JpZXMuIEl0IHdpbGwgZm9sbG93IGJyYW5jaGVzCithbmQgcmVwb3NpdG9yaWVzIHdpdGhpbiB0aGUgbmFtZXNwYWNlcyBkZWZpbmVkIGJ5IHRoZSA8YXJjaGl2ZS9icmFuY2g+CitwYXJhbWV0ZXJzIHN1cHBsaWVkLiBJZiBpdCBjYW5ub3QgZmluZCB0aGUgcmVtb3RlIGJyYW5jaCBhIG1lcmdlIGNvbWVzIGZyb20KK2l0IHdpbGwganVzdCBpbXBvcnQgaXQgYXMgYSByZWd1bGFyIGNvbW1pdC4gSWYgaXQgY2FuIGZpbmQgaXQsIGl0IHdpbGwgbWFyayBpdAorYXMgYSBtZXJnZSB3aGVuZXZlciBwb3NzaWJsZSAoc2VlIGRpc2N1c3Npb24gYmVsb3cpLgorCitUaGUgc2NyaXB0IGV4cGVjdHMgeW91IHRvIHByb3ZpZGUgdGhlIGtleSByb290cyB3aGVyZSBpdCBjYW4gc3RhcnQgdGhlIGltcG9ydAorZnJvbSBhbiAnaW5pdGlhbCBpbXBvcnQnIG9yICd0YWcnIHR5cGUgb2YgQXJjaCBjb21taXQuIEl0IHdpbGwgZm9sbG93IGFuZAoraW1wb3J0IG5ldyBicmFuY2hlcyB3aXRoaW4gdGhlIHByb3ZpZGVkIHJvb3RzLgorCitJdCBleHBlY3RzIHRvIGJlIGRlYWxpbmcgd2l0aCBvbmUgcHJvamVjdCBvbmx5LiBJZiBpdCBzZWVzCiticmFuY2hlcyB0aGF0IGhhdmUgZGlmZmVyZW50IHJvb3RzLCBpdCB3aWxsIHJlZnVzZSB0byBydW4uIEluIHRoYXQgY2FzZSwKK2VkaXQgeW91ciA8YXJjaGl2ZS9icmFuY2g+IHBhcmFtZXRlcnMgdG8gZGVmaW5lIGNsZWFybHkgdGhlIHNjb3BlIG9mIHRoZQoraW1wb3J0LgorCitgZ2l0LWFyY2hpbXBvcnRgIHVzZXMgYHRsYWAgZXh0ZW5zaXZlbHkgaW4gdGhlIGJhY2tncm91bmQgdG8gYWNjZXNzIHRoZQorQXJjaCByZXBvc2l0b3J5LgorTWFrZSBzdXJlIHlvdSBoYXZlIGEgcmVjZW50IHZlcnNpb24gb2YgYHRsYWAgYXZhaWxhYmxlIGluIHRoZSBwYXRoLiBgdGxhYCBtdXN0Citrbm93IGFib3V0IHRoZSByZXBvc2l0b3JpZXMgeW91IHBhc3MgdG8gYGdpdC1hcmNoaW1wb3J0YC4KKworRm9yIHRoZSBpbml0aWFsIGltcG9ydCBgZ2l0LWFyY2hpbXBvcnRgIGV4cGVjdHMgdG8gZmluZCBpdHNlbGYgaW4gYW4gZW1wdHkKK2RpcmVjdG9yeS4gVG8gZm9sbG93IHRoZSBkZXZlbG9wbWVudCBvZiBhIHByb2plY3QgdGhhdCB1c2VzIEFyY2gsIHJlcnVuCitgZ2l0LWFyY2hpbXBvcnRgIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycyBhcyB0aGUgaW5pdGlhbCBpbXBvcnQgdG8gcGVyZm9ybQoraW5jcmVtZW50YWwgaW1wb3J0cy4KKworV2hpbGUgZ2l0LWFyY2hpbXBvcnQgd2lsbCB0cnkgdG8gY3JlYXRlIHNlbnNpYmxlIGJyYW5jaCBuYW1lcyBmb3IgdGhlCithcmNoaXZlcyB0aGF0IGl0IGltcG9ydHMsIGl0IGlzIGFsc28gcG9zc2libGUgdG8gc3BlY2lmeSBnaXQgYnJhbmNoIG5hbWVzCittYW51YWxseS4gIFRvIGRvIHNvLCB3cml0ZSBhIGdpdCBicmFuY2ggbmFtZSBhZnRlciBlYWNoIDxhcmNoaXZlL2JyYW5jaD4KK3BhcmFtZXRlciwgc2VwYXJhdGVkIGJ5IGEgY29sb24uICBUaGlzIHdheSwgeW91IGNhbiBzaG9ydGVuIHRoZSBBcmNoCiticmFuY2ggbmFtZXMgYW5kIGNvbnZlcnQgQXJjaCBqYXJnb24gdG8gZ2l0IGphcmdvbiwgZm9yIGV4YW1wbGUgbWFwcGluZyBhCisiUFJPSkVDVC0tZGV2by0tVkVSU0lPTiIgYnJhbmNoIHRvICJtYXN0ZXIiLgorCitBc3NvY2lhdGluZyBtdWx0aXBsZSBBcmNoIGJyYW5jaGVzIHRvIG9uZSBnaXQgYnJhbmNoIGlzIHBvc3NpYmxlOyB0aGUKK3Jlc3VsdCB3aWxsIG1ha2UgdGhlIG1vc3Qgc2Vuc2Ugb25seSBpZiBubyBjb21taXRzIGFyZSBtYWRlIHRvIHRoZSBmaXJzdAorYnJhbmNoLCBhZnRlciB0aGUgc2Vjb25kIGJyYW5jaCBpcyBjcmVhdGVkLiAgU3RpbGwsIHRoaXMgaXMgdXNlZnVsIHRvCitjb252ZXJ0IEFyY2ggcmVwb3NpdG9yaWVzIHRoYXQgaGFkIGJlZW4gcm90YXRlZCBwZXJpb2RpY2FsbHkuCisKKworTUVSR0VTCistLS0tLS0KK1BhdGNoIG1lcmdlIGRhdGEgZnJvbSBBcmNoIGlzIHVzZWQgdG8gbWFyayBtZXJnZXMgaW4gZ2l0IGFzIHdlbGwuIGdpdAorZG9lcyBub3QgY2FyZSBtdWNoIGFib3V0IHRyYWNraW5nIHBhdGNoZXMsIGFuZCBvbmx5IGNvbnNpZGVycyBhIG1lcmdlIHdoZW4gYQorYnJhbmNoIGluY29ycG9yYXRlcyBhbGwgdGhlIGNvbW1pdHMgc2luY2UgdGhlIHBvaW50IHRoZXkgZm9ya2VkLiBUaGUgZW5kIHJlc3VsdAoraXMgdGhhdCBnaXQgd2lsbCBoYXZlIGEgZ29vZCBpZGVhIG9mIGhvdyBmYXIgYnJhbmNoZXMgaGF2ZSBkaXZlcmdlZC4gU28gdGhlCitpbXBvcnQgcHJvY2VzcyBkb2VzIGxvc2Ugc29tZSBwYXRjaC10cmFkaW5nIG1ldGFkYXRhLgorCitGb3J0dW5hdGVseSwgd2hlbiB5b3UgdHJ5IGFuZCBtZXJnZSBicmFuY2hlcyBpbXBvcnRlZCBmcm9tIEFyY2gsCitnaXQgd2lsbCBmaW5kIGEgZ29vZCBtZXJnZSBiYXNlLCBhbmQgaXQgaGFzIGEgZ29vZCBjaGFuY2Ugb2YgaWRlbnRpZnlpbmcKK3BhdGNoZXMgdGhhdCBoYXZlIGJlZW4gdHJhZGVkIG91dC1vZi1zZXF1ZW5jZSBiZXR3ZWVuIHRoZSBicmFuY2hlcy4KKworT1BUSU9OUworLS0tLS0tLQorCistaDo6CisJRGlzcGxheSB1c2FnZS4KKworLXY6OgorCVZlcmJvc2Ugb3V0cHV0LgorCistVDo6CisJTWFueSB0YWdzLiBXaWxsIGNyZWF0ZSBhIHRhZyBmb3IgZXZlcnkgY29tbWl0LCByZWZsZWN0aW5nIHRoZSBjb21taXQKKwluYW1lIGluIHRoZSBBcmNoIHJlcG9zaXRvcnkuCisKKy1mOjoKKwlVc2UgdGhlIGZhc3QgcGF0Y2hzZXQgaW1wb3J0IHN0cmF0ZWd5LiAgVGhpcyBjYW4gYmUgc2lnbmlmaWNhbnRseQorCWZhc3RlciBmb3IgbGFyZ2UgdHJlZXMsIGJ1dCBjYW5ub3QgaGFuZGxlIGRpcmVjdG9yeSByZW5hbWVzIG9yCisJcGVybWlzc2lvbnMgY2hhbmdlcy4gIFRoZSBkZWZhdWx0IHN0cmF0ZWd5IGlzIHNsb3cgYW5kIHNhZmUuCisKKy1vOjoKKwlVc2UgdGhpcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZC1zdHlsZSBicmFuY2ggbmFtZXMgdXNlZCBieQorCWVhcmxpZXIgdmVyc2lvbnMgb2YgZ2l0LWFyY2hpbXBvcnQuICBPbGQtc3R5bGUgYnJhbmNoIG5hbWVzCisJd2VyZSBjYXRlZ29yeS0tYnJhbmNoLCB3aGVyZWFzIG5ldy1zdHlsZSBicmFuY2ggbmFtZXMgYXJlCisJYXJjaGl2ZSxjYXRlZ29yeS0tYnJhbmNoLS12ZXJzaW9uLiAgSW4gYm90aCBjYXNlcywgbmFtZXMgZ2l2ZW4KKwlvbiB0aGUgY29tbWFuZC1saW5lIHdpbGwgb3ZlcnJpZGUgdGhlIGF1dG9tYXRpY2FsbHktZ2VuZXJhdGVkCisJb25lcy4KKworLUQgPGRlcHRoPjo6CisJRm9sbG93IG1lcmdlIGFuY2VzdHJ5IGFuZCBhdHRlbXB0IHRvIGltcG9ydCB0cmVlcyB0aGF0IGhhdmUgYmVlbgorCW1lcmdlZCBmcm9tLiAgU3BlY2lmeSBhIGRlcHRoIGdyZWF0ZXIgdGhhbiAxIGlmIHBhdGNoIGxvZ3MgaGF2ZSBiZWVuCisJcHJ1bmVkLgorCistYTo6CisJQXR0ZW1wdCB0byBhdXRvLXJlZ2lzdGVyIGFyY2hpdmVzIGF0IGh0dHA6Ly9taXJyb3JzLnNvdXJjZWNvbnRyb2wubmV0CisJVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdpdGggdGhlIC1EIG9wdGlvbi4KKworLXQgPHRtcGRpcj46OgorCU92ZXJyaWRlIHRoZSBkZWZhdWx0IHRlbXBkaXIuCisKKworPGFyY2hpdmUvYnJhbmNoPjo6CisJQXJjaGl2ZS9icmFuY2ggaWRlbnRpZmllciBpbiBhIGZvcm1hdCB0aGF0IGB0bGEgbG9nYCB1bmRlcnN0YW5kcy4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBNYXJ0aW4gTGFuZ2hvZmYgPG1hcnRpbkBjYXRhbHlzdC5uZXQubno+LgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubywgTWFydGluIExhbmdob2ZmIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWFyY2hpdmUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtYXJjaGl2ZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNlYWExNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWFyY2hpdmUudHh0CkBAIC0wLDAgKzEsMTIxIEBACitnaXQtYXJjaGl2ZSgxKQorPT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWFyY2hpdmUgLSBDcmVhdGUgYW4gYXJjaGl2ZSBvZiBmaWxlcyBmcm9tIGEgbmFtZWQgdHJlZQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1hcmNoaXZlJyAtLWZvcm1hdD08Zm10PiBbLS1saXN0XSBbLS1wcmVmaXg9PHByZWZpeD4vXSBbPGV4dHJhPl0KKwkgICAgICBbLS1yZW1vdGU9PHJlcG8+IFstLWV4ZWM9PGdpdC11cGxvYWQtYXJjaGl2ZT5dXSA8dHJlZS1pc2g+CisJICAgICAgW3BhdGguLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQ3JlYXRlcyBhbiBhcmNoaXZlIG9mIHRoZSBzcGVjaWZpZWQgZm9ybWF0IGNvbnRhaW5pbmcgdGhlIHRyZWUKK3N0cnVjdHVyZSBmb3IgdGhlIG5hbWVkIHRyZWUsIGFuZCB3cml0ZXMgaXQgb3V0IHRvIHRoZSBzdGFuZGFyZAorb3V0cHV0LiAgSWYgPHByZWZpeD4gaXMgc3BlY2lmaWVkIGl0IGlzCitwcmVwZW5kZWQgdG8gdGhlIGZpbGVuYW1lcyBpbiB0aGUgYXJjaGl2ZS4KKworJ2dpdC1hcmNoaXZlJyBiZWhhdmVzIGRpZmZlcmVudGx5IHdoZW4gZ2l2ZW4gYSB0cmVlIElEIHZlcnN1cyB3aGVuCitnaXZlbiBhIGNvbW1pdCBJRCBvciB0YWcgSUQuICBJbiB0aGUgZmlyc3QgY2FzZSB0aGUgY3VycmVudCB0aW1lIGlzCit1c2VkIGFzIG1vZGlmaWNhdGlvbiB0aW1lIG9mIGVhY2ggZmlsZSBpbiB0aGUgYXJjaGl2ZS4gIEluIHRoZSBsYXR0ZXIKK2Nhc2UgdGhlIGNvbW1pdCB0aW1lIGFzIHJlY29yZGVkIGluIHRoZSByZWZlcmVuY2VkIGNvbW1pdCBvYmplY3QgaXMKK3VzZWQgaW5zdGVhZC4gIEFkZGl0aW9uYWxseSB0aGUgY29tbWl0IElEIGlzIHN0b3JlZCBpbiBhIGdsb2JhbAorZXh0ZW5kZWQgcGF4IGhlYWRlciBpZiB0aGUgdGFyIGZvcm1hdCBpcyB1c2VkOyBpdCBjYW4gYmUgZXh0cmFjdGVkCit1c2luZyAnZ2l0LWdldC10YXItY29tbWl0LWlkJy4gSW4gWklQIGZpbGVzIGl0IGlzIHN0b3JlZCBhcyBhIGZpbGUKK2NvbW1lbnQuCisKK09QVElPTlMKKy0tLS0tLS0KKworLS1mb3JtYXQ9PGZtdD46OgorCUZvcm1hdCBvZiB0aGUgcmVzdWx0aW5nIGFyY2hpdmU6ICd0YXInIG9yICd6aXAnLiAgVGhlIGRlZmF1bHQKKwlpcyAndGFyJy4KKworLS1saXN0LCAtbDo6CisJU2hvdyBhbGwgYXZhaWxhYmxlIGZvcm1hdHMuCisKKy0tdmVyYm9zZSwgLXY6OgorCVJlcG9ydCBwcm9ncmVzcyB0byBzdGRlcnIuCisKKy0tcHJlZml4PTxwcmVmaXg+Lzo6CisJUHJlcGVuZCA8cHJlZml4Pi8gdG8gZWFjaCBmaWxlbmFtZSBpbiB0aGUgYXJjaGl2ZS4KKworPGV4dHJhPjo6CisJVGhpcyBjYW4gYmUgYW55IG9wdGlvbnMgdGhhdCB0aGUgYXJjaGl2ZXIgYmFja2VuZCB1bmRlcnN0YW5kLgorCVNlZSBuZXh0IHNlY3Rpb24uCisKKy0tcmVtb3RlPTxyZXBvPjo6CisJSW5zdGVhZCBvZiBtYWtpbmcgYSB0YXIgYXJjaGl2ZSBmcm9tIGxvY2FsIHJlcG9zaXRvcnksCisJcmV0cmlldmUgYSB0YXIgYXJjaGl2ZSBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkuCisKKy0tZXhlYz08Z2l0LXVwbG9hZC1hcmNoaXZlPjo6CisJVXNlZCB3aXRoIC0tcmVtb3RlIHRvIHNwZWNpZnkgdGhlIHBhdGggdG8gdGhlCisJZ2l0LXVwbG9hZC1hcmNoaXZlIGV4ZWN1dGFibGUgb24gdGhlIHJlbW90ZSBzaWRlLgorCis8dHJlZS1pc2g+OjoKKwlUaGUgdHJlZSBvciBjb21taXQgdG8gcHJvZHVjZSBhbiBhcmNoaXZlIGZvci4KKworcGF0aDo6CisJSWYgb25lIG9yIG1vcmUgcGF0aHMgYXJlIHNwZWNpZmllZCwgaW5jbHVkZSBvbmx5IHRoZXNlIGluIHRoZQorCWFyY2hpdmUsIG90aGVyd2lzZSBpbmNsdWRlIGFsbCBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMuCisKK0JBQ0tFTkQgRVhUUkEgT1BUSU9OUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ppcAorfn5+CistMDo6CisJU3RvcmUgdGhlIGZpbGVzIGluc3RlYWQgb2YgZGVmbGF0aW5nIHRoZW0uCistOTo6CisJSGlnaGVzdCBhbmQgc2xvd2VzdCBjb21wcmVzc2lvbiBsZXZlbC4gIFlvdSBjYW4gc3BlY2lmeSBhbnkKKwludW1iZXIgZnJvbSAxIHRvIDkgdG8gYWRqdXN0IGNvbXByZXNzaW9uIHNwZWVkIGFuZCByYXRpby4KKworCitDT05GSUdVUkFUSU9OCistLS0tLS0tLS0tLS0tCisKK3Rhci51bWFzazo6CisJVGhpcyB2YXJpYWJsZSBjYW4gYmUgdXNlZCB0byByZXN0cmljdCB0aGUgcGVybWlzc2lvbiBiaXRzIG9mCisJdGFyIGFyY2hpdmUgZW50cmllcy4gIFRoZSBkZWZhdWx0IGlzIDAwMDIsIHdoaWNoIHR1cm5zIG9mZiB0aGUKKwl3b3JsZCB3cml0ZSBiaXQuICBUaGUgc3BlY2lhbCB2YWx1ZSAidXNlciIgaW5kaWNhdGVzIHRoYXQgdGhlCisJYXJjaGl2aW5nIHVzZXIncyB1bWFzayB3aWxsIGJlIHVzZWQgaW5zdGVhZC4gIFNlZSB1bWFzaygyKSBmb3IKKwlkZXRhaWxzLgorCitFWEFNUExFUworLS0tLS0tLS0KK2dpdCBhcmNoaXZlIC0tZm9ybWF0PXRhciAtLXByZWZpeD1qdW5rLyBIRUFEIHwgKGNkIC92YXIvdG1wLyAmJiB0YXIgeGYgLSk6OgorCisJQ3JlYXRlIGEgdGFyIGFyY2hpdmUgdGhhdCBjb250YWlucyB0aGUgY29udGVudHMgb2YgdGhlCisJbGF0ZXN0IGNvbW1pdCBvbiB0aGUgY3VycmVudCBicmFuY2gsIGFuZCBleHRyYWN0cyBpdCBpbgorCWAvdmFyL3RtcC9qdW5rYCBkaXJlY3RvcnkuCisKK2dpdCBhcmNoaXZlIC0tZm9ybWF0PXRhciAtLXByZWZpeD1naXQtMS40LjAvIHYxLjQuMCB8IGd6aXAgPmdpdC0xLjQuMC50YXIuZ3o6OgorCisJQ3JlYXRlIGEgY29tcHJlc3NlZCB0YXJiYWxsIGZvciB2MS40LjAgcmVsZWFzZS4KKworZ2l0IGFyY2hpdmUgLS1mb3JtYXQ9dGFyIC0tcHJlZml4PWdpdC0xLjQuMC8gdjEuNC4we2NhcmV0fVx7dHJlZVx9IHwgZ3ppcCA+Z2l0LTEuNC4wLnRhci5nejo6CisKKwlDcmVhdGUgYSBjb21wcmVzc2VkIHRhcmJhbGwgZm9yIHYxLjQuMCByZWxlYXNlLCBidXQgd2l0aG91dCBhCisJZ2xvYmFsIGV4dGVuZGVkIHBheCBoZWFkZXIuCisKK2dpdCBhcmNoaXZlIC0tZm9ybWF0PXppcCAtLXByZWZpeD1naXQtZG9jcy8gSEVBRDpEb2N1bWVudGF0aW9uLyA+IGdpdC0xLjQuMC1kb2NzLnppcDo6CisKKwlQdXQgZXZlcnl0aGluZyBpbiB0aGUgY3VycmVudCBoZWFkJ3MgRG9jdW1lbnRhdGlvbi8gZGlyZWN0b3J5CisJaW50byAnZ2l0LTEuNC4wLWRvY3MuemlwJywgd2l0aCB0aGUgcHJlZml4ICdnaXQtZG9jcy8nLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBGcmFuY2sgQnVpLUh1dSBhbmQgUmVuZSBTY2hhcmZlLgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1iaXNlY3QudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtYmlzZWN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjU4NWFlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtYmlzZWN0LnR4dApAQCAtMCwwICsxLDIzMCBAQAorZ2l0LWJpc2VjdCgxKQorPT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtYmlzZWN0IC0gRmluZCB0aGUgY2hhbmdlIHRoYXQgaW50cm9kdWNlZCBhIGJ1ZyBieSBiaW5hcnkgc2VhcmNoCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0IGJpc2VjdCcgPHN1YmNvbW1hbmQ+IDxvcHRpb25zPgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoZSBjb21tYW5kIHRha2VzIHZhcmlvdXMgc3ViY29tbWFuZHMsIGFuZCBkaWZmZXJlbnQgb3B0aW9ucyBkZXBlbmRpbmcKK29uIHRoZSBzdWJjb21tYW5kOgorCisgZ2l0IGJpc2VjdCBzdGFydCBbPGJhZD4gWzxnb29kPi4uLl1dIFstLV0gWzxwYXRocz4uLi5dCisgZ2l0IGJpc2VjdCBiYWQgWzxyZXY+XQorIGdpdCBiaXNlY3QgZ29vZCBbPHJldj4uLi5dCisgZ2l0IGJpc2VjdCBza2lwIFs8cmV2Pi4uLl0KKyBnaXQgYmlzZWN0IHJlc2V0IFs8YnJhbmNoPl0KKyBnaXQgYmlzZWN0IHZpc3VhbGl6ZQorIGdpdCBiaXNlY3QgcmVwbGF5IDxsb2dmaWxlPgorIGdpdCBiaXNlY3QgbG9nCisgZ2l0IGJpc2VjdCBydW4gPGNtZD4uLi4KKworVGhpcyBjb21tYW5kIHVzZXMgJ2dpdC1yZXYtbGlzdCAtLWJpc2VjdCcgb3B0aW9uIHRvIGhlbHAgZHJpdmUgdGhlCitiaW5hcnkgc2VhcmNoIHByb2Nlc3MgdG8gZmluZCB3aGljaCBjaGFuZ2UgaW50cm9kdWNlZCBhIGJ1ZywgZ2l2ZW4gYW4KK29sZCAiZ29vZCIgY29tbWl0IG9iamVjdCBuYW1lIGFuZCBhIGxhdGVyICJiYWQiIGNvbW1pdCBvYmplY3QgbmFtZS4KKworQmFzaWMgYmlzZWN0IGNvbW1hbmRzOiBzdGFydCwgYmFkLCBnb29kCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIHdheSB5b3UgdXNlIGl0IGlzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGJpc2VjdCBzdGFydAorJCBnaXQgYmlzZWN0IGJhZCAgICAgICAgICAgICAgICAgIyBDdXJyZW50IHZlcnNpb24gaXMgYmFkCiskIGdpdCBiaXNlY3QgZ29vZCB2Mi42LjEzLXJjMiAgICAjIHYyLjYuMTMtcmMyIHdhcyB0aGUgbGFzdCB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRlc3RlZCB0aGF0IHdhcyBnb29kCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hlbiB5b3UgZ2l2ZSBhdCBsZWFzdCBvbmUgYmFkIGFuZCBvbmUgZ29vZCB2ZXJzaW9ucywgaXQgd2lsbCBiaXNlY3QKK3RoZSByZXZpc2lvbiB0cmVlIGFuZCBzYXkgc29tZXRoaW5nIGxpa2U6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQmlzZWN0aW5nOiA2NzUgcmV2aXNpb25zIGxlZnQgdG8gdGVzdCBhZnRlciB0aGlzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIGNoZWNrIG91dCB0aGUgc3RhdGUgaW4gdGhlIG1pZGRsZS4gTm93LCBjb21waWxlIHRoYXQga2VybmVsLCBhbmQKK2Jvb3QgaXQuIE5vdywgbGV0J3Mgc2F5IHRoYXQgdGhpcyBib290ZWQga2VybmVsIHdvcmtzIGZpbmUsIHRoZW4ganVzdAorZG8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBiaXNlY3QgZ29vZAkJCSMgdGhpcyBvbmUgaXMgZ29vZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIHdpbGwgbm93IHNheQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0Jpc2VjdGluZzogMzM3IHJldmlzaW9ucyBsZWZ0IHRvIHRlc3QgYWZ0ZXIgdGhpcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FuZCB5b3UgY29udGludWUgYWxvbmcsIGNvbXBpbGluZyB0aGF0IG9uZSwgdGVzdGluZyBpdCwgYW5kIGRlcGVuZGluZworb24gd2hldGhlciBpdCBpcyBnb29kIG9yIGJhZCwgeW91IHNheSAiZ2l0IGJpc2VjdCBnb29kIiBvciAiZ2l0IGJpc2VjdAorYmFkIiwgYW5kIGFzayBmb3IgdGhlIG5leHQgYmlzZWN0aW9uLgorCitVbnRpbCB5b3UgaGF2ZSBubyBtb3JlIGxlZnQsIGFuZCB5b3UnbGwgaGF2ZSBiZWVuIGxlZnQgd2l0aCB0aGUgZmlyc3QKK2JhZCBrZXJuZWwgcmV2IGluICJyZWZzL2Jpc2VjdC9iYWQiLgorCitCaXNlY3QgcmVzZXQKK35+fn5+fn5+fn5+fgorCitPaCwgYW5kIHRoZW4gYWZ0ZXIgeW91IHdhbnQgdG8gcmVzZXQgdG8gdGhlIG9yaWdpbmFsIGhlYWQsIGRvIGEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBiaXNlY3QgcmVzZXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0byBnZXQgYmFjayB0byB0aGUgbWFzdGVyIGJyYW5jaCwgaW5zdGVhZCBvZiBiZWluZyBpbiBvbmUgb2YgdGhlCitiaXNlY3Rpb24gYnJhbmNoZXMgKCJnaXQgYmlzZWN0IHN0YXJ0IiB3aWxsIGRvIHRoYXQgZm9yIHlvdSB0b28sCithY3R1YWxseTogaXQgd2lsbCByZXNldCB0aGUgYmlzZWN0aW9uIHN0YXRlLCBhbmQgYmVmb3JlIGl0IGRvZXMgdGhhdAoraXQgY2hlY2tzIHRoYXQgeW91J3JlIG5vdCB1c2luZyBzb21lIG9sZCBiaXNlY3Rpb24gYnJhbmNoKS4KKworQmlzZWN0IHZpc3VhbGl6ZQorfn5+fn5+fn5+fn5+fn5+fgorCitEdXJpbmcgdGhlIGJpc2VjdGlvbiBwcm9jZXNzLCB5b3UgY2FuIHNheQorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGJpc2VjdCB2aXN1YWxpemUKKy0tLS0tLS0tLS0tLQorCit0byBzZWUgdGhlIGN1cnJlbnRseSByZW1haW5pbmcgc3VzcGVjdHMgaW4gYGdpdGtgLiAgYHZpc3VhbGl6ZWAgaXMgYSBiaXQKK3RvbyBsb25nIHRvIHR5cGUgYW5kIGB2aWV3YCBpcyBwcm92aWRlZCBhcyBhIHN5bm9ueW0uCisKK0lmIGBESVNQTEFZYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0LCBgZ2l0IGxvZ2AgaXMgdXNlZAoraW5zdGVhZC4gIFlvdSBjYW4gZXZlbiBnaXZlIGNvbW1hbmQgbGluZSBvcHRpb25zIHN1Y2ggYXMgYC1wYCBhbmQKK2AtLXN0YXRgLgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGJpc2VjdCB2aWV3IC0tc3RhdAorLS0tLS0tLS0tLS0tCisKK0Jpc2VjdCBsb2cgYW5kIGJpc2VjdCByZXBsYXkKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIGdvb2QvYmFkIGlucHV0IGlzIGxvZ2dlZCwgYW5kCisKKy0tLS0tLS0tLS0tLQorJCBnaXQgYmlzZWN0IGxvZworLS0tLS0tLS0tLS0tCisKK3Nob3dzIHdoYXQgeW91IGhhdmUgZG9uZSBzbyBmYXIuIFlvdSBjYW4gdHJ1bmNhdGUgaXRzIG91dHB1dCBzb21ld2hlcmUKK2FuZCBzYXZlIGl0IGluIGEgZmlsZSwgYW5kIHJ1bgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGJpc2VjdCByZXBsYXkgdGhhdC1maWxlCistLS0tLS0tLS0tLS0KKworaWYgeW91IGZpbmQgbGF0ZXIgeW91IG1hZGUgYSBtaXN0YWtlIHRlbGxpbmcgZ29vZC9iYWQgYWJvdXQgYQorcmV2aXNpb24uCisKK0F2b2lkaW5nIHRvIHRlc3QgYSBjb21taXQKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworSWYgaW4gYSBtaWRkbGUgb2YgYmlzZWN0IHNlc3Npb24sIHlvdSBrbm93IHdoYXQgdGhlIGJpc2VjdCBzdWdnZXN0ZWQKK3RvIHRyeSBuZXh0IGlzIG5vdCBhIGdvb2Qgb25lIHRvIHRlc3QgKGUuZy4gdGhlIGNoYW5nZSB0aGUgY29tbWl0CitpbnRyb2R1Y2VzIGlzIGtub3duIG5vdCB0byB3b3JrIGluIHlvdXIgZW52aXJvbm1lbnQgYW5kIHlvdSBrbm93IGl0Citkb2VzIG5vdCBoYXZlIGFueXRoaW5nIHRvIGRvIHdpdGggdGhlIGJ1ZyB5b3UgYXJlIGNoYXNpbmcpLCB5b3UgbWF5Cit3YW50IHRvIGZpbmQgYSBuZWFyLWJ5IGNvbW1pdCBhbmQgdHJ5IHRoYXQgaW5zdGVhZC4KKworSXQgZ29lcyBzb21ldGhpbmcgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGJpc2VjdCBnb29kL2JhZAkJCSMgcHJldmlvdXMgcm91bmQgd2FzIGdvb2QvYmFkLgorQmlzZWN0aW5nOiAzMzcgcmV2aXNpb25zIGxlZnQgdG8gdGVzdCBhZnRlciB0aGlzCiskIGdpdCBiaXNlY3QgdmlzdWFsaXplCQkJIyBvb3BzLCB0aGF0IGlzIHVuaW50ZXJlc3RpbmcuCiskIGdpdCByZXNldCAtLWhhcmQgSEVBRH4zCQkjIHRyeSAzIHJldnMgYmVmb3JlIHdoYXQKKwkJCQkJIyB3YXMgc3VnZ2VzdGVkCistLS0tLS0tLS0tLS0KKworVGhlbiBjb21waWxlIGFuZCB0ZXN0IHRoZSBvbmUgeW91IGNob3NlIHRvIHRyeS4gQWZ0ZXIgdGhhdCwgdGVsbAorYmlzZWN0IHdoYXQgdGhlIHJlc3VsdCB3YXMgYXMgdXN1YWwuCisKK0Jpc2VjdCBza2lwCit+fn5+fn5+fn5+fn4KKworSW5zdGVhZCBvZiBjaG9vc2luZyBieSB5b3Vyc2VsZiBhIG5lYXJieSBjb21taXQsIHlvdSBtYXkganVzdCB3YW50IGdpdAordG8gZG8gaXQgZm9yIHlvdSB1c2luZzoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBiaXNlY3Qgc2tpcCAgICAgICAgICAgICAgICAgIyBDdXJyZW50IHZlcnNpb24gY2Fubm90IGJlIHRlc3RlZAorLS0tLS0tLS0tLS0tCisKK0J1dCBjb21wdXRpbmcgdGhlIGNvbW1pdCB0byB0ZXN0IG1heSBiZSBzbG93ZXIgYWZ0ZXJ3YXJkcyBhbmQgZ2l0IG1heQorZXZlbnR1YWxseSBub3QgYmUgYWJsZSB0byB0ZWxsIHRoZSBmaXJzdCBiYWQgYW1vbmcgYSBiYWQgYW5kIG9uZSBvcgorbW9yZSAic2tpcCJwZWQgY29tbWl0cy4KKworQ3V0dGluZyBkb3duIGJpc2VjdGlvbiBieSBnaXZpbmcgbW9yZSBwYXJhbWV0ZXJzIHRvIGJpc2VjdCBzdGFydAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitZb3UgY2FuIGZ1cnRoZXIgY3V0IGRvd24gdGhlIG51bWJlciBvZiB0cmlhbHMgaWYgeW91IGtub3cgd2hhdCBwYXJ0IG9mCit0aGUgdHJlZSBpcyBpbnZvbHZlZCBpbiB0aGUgcHJvYmxlbSB5b3UgYXJlIHRyYWNraW5nIGRvd24sIGJ5IGdpdmluZworcGF0aHMgcGFyYW1ldGVycyB3aGVuIHlvdSBzYXkgYGJpc2VjdCBzdGFydGAsIGxpa2UgdGhpczoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBiaXNlY3Qgc3RhcnQgLS0gYXJjaC9pMzg2IGluY2x1ZGUvYXNtLWkzODYKKy0tLS0tLS0tLS0tLQorCitJZiB5b3Uga25vdyBiZWZvcmVoYW5kIG1vcmUgdGhhbiBvbmUgZ29vZCBjb21taXRzLCB5b3UgY2FuIG5hcnJvdyB0aGUKK2Jpc2VjdCBzcGFjZSBkb3duIHdpdGhvdXQgZG9pbmcgdGhlIHdob2xlIHRyZWUgY2hlY2tvdXQgZXZlcnkgdGltZSB5b3UKK2dpdmUgZ29vZCBjb21taXRzLiBZb3UgZ2l2ZSB0aGUgYmFkIHJldmlzaW9uIGltbWVkaWF0ZWx5IGFmdGVyIGBzdGFydGAKK2FuZCB0aGVuIHlvdSBnaXZlIGFsbCB0aGUgZ29vZCByZXZpc2lvbnMgeW91IGhhdmU6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgYmlzZWN0IHN0YXJ0IHYyLjYuMjAtcmM2IHYyLjYuMjAtcmM0IHYyLjYuMjAtcmMxIC0tCisgICAgICAgICAgICAgICAgICAgIyB2Mi42LjIwLXJjNiBpcyBiYWQKKyAgICAgICAgICAgICAgICAgICAjIHYyLjYuMjAtcmM0IGFuZCB2Mi42LjIwLXJjMSBhcmUgZ29vZAorLS0tLS0tLS0tLS0tCisKK0Jpc2VjdCBydW4KK35+fn5+fn5+fn4KKworSWYgeW91IGhhdmUgYSBzY3JpcHQgdGhhdCBjYW4gdGVsbCBpZiB0aGUgY3VycmVudCBzb3VyY2UgY29kZSBpcyBnb29kCitvciBiYWQsIHlvdSBjYW4gYXV0b21hdGljYWxseSBiaXNlY3QgdXNpbmc6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgYmlzZWN0IHJ1biBteV9zY3JpcHQKKy0tLS0tLS0tLS0tLQorCitOb3RlIHRoYXQgdGhlICJydW4iIHNjcmlwdCAoYG15X3NjcmlwdGAgaW4gdGhlIGFib3ZlIGV4YW1wbGUpIHNob3VsZAorZXhpdCB3aXRoIGNvZGUgMCBpbiBjYXNlIHRoZSBjdXJyZW50IHNvdXJjZSBjb2RlIGlzIGdvb2QuICBFeGl0IHdpdGggYQorY29kZSBiZXR3ZWVuIDEgYW5kIDEyNyAoaW5jbHVzaXZlKSwgZXhjZXB0IDEyNSwgaWYgdGhlIGN1cnJlbnQKK3NvdXJjZSBjb2RlIGlzIGJhZC4KKworQW55IG90aGVyIGV4aXQgY29kZSB3aWxsIGFib3J0IHRoZSBhdXRvbWF0aWMgYmlzZWN0IHByb2Nlc3MuIChBCitwcm9ncmFtIHRoYXQgZG9lcyAiZXhpdCgtMSkiIGxlYXZlcyAkPyA9IDI1NSwgc2VlIGV4aXQoMykgbWFudWFsIHBhZ2UsCit0aGUgdmFsdWUgaXMgY2hvcHBlZCB3aXRoICImIDAzNzciLikKKworVGhlIHNwZWNpYWwgZXhpdCBjb2RlIDEyNSBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSBjdXJyZW50IHNvdXJjZSBjb2RlCitjYW5ub3QgYmUgdGVzdGVkLiBJZiB0aGUgInJ1biIgc2NyaXB0IGV4aXRzIHdpdGggdGhpcyBjb2RlLCB0aGUgY3VycmVudAorcmV2aXNpb24gd2lsbCBiZSBza2lwcGVkLCBzZWUgYGdpdCBiaXNlY3Qgc2tpcGAgYWJvdmUuCisKK1lvdSBtYXkgb2Z0ZW4gZmluZCB0aGF0IGR1cmluZyBiaXNlY3QgeW91IHdhbnQgdG8gaGF2ZSBuZWFyLWNvbnN0YW50Cit0d2Vha3MgKGUuZy4sIHMvI2RlZmluZSBERUJVRyAwLyNkZWZpbmUgREVCVUcgMS8gaW4gYSBoZWFkZXIgZmlsZSwgb3IKKyJyZXZpc2lvbiB0aGF0IGRvZXMgbm90IGhhdmUgdGhpcyBjb21taXQgbmVlZHMgdGhpcyBwYXRjaCBhcHBsaWVkIHRvCit3b3JrIGFyb3VuZCBvdGhlciBwcm9ibGVtIHRoaXMgYmlzZWN0aW9uIGlzIG5vdCBpbnRlcmVzdGVkIGluIikKK2FwcGxpZWQgdG8gdGhlIHJldmlzaW9uIGJlaW5nIHRlc3RlZC4KKworVG8gY29wZSB3aXRoIHN1Y2ggYSBzaXR1YXRpb24sIGFmdGVyIHRoZSBpbm5lciBnaXQtYmlzZWN0IGZpbmRzIHRoZQorbmV4dCByZXZpc2lvbiB0byB0ZXN0LCB3aXRoIHRoZSAicnVuIiBzY3JpcHQsIHlvdSBjYW4gYXBwbHkgdGhhdCB0d2VhaworYmVmb3JlIGNvbXBpbGluZywgcnVuIHRoZSByZWFsIHRlc3QsIGFuZCBhZnRlciB0aGUgdGVzdCBkZWNpZGVzIGlmIHRoZQorcmV2aXNpb24gKHBvc3NpYmx5IHdpdGggdGhlIG5lZWRlZCB0d2Vha3MpIHBhc3NlZCB0aGUgdGVzdCwgcmV3aW5kIHRoZQordHJlZSB0byB0aGUgcHJpc3RpbmUgc3RhdGUuICBGaW5hbGx5IHRoZSAicnVuIiBzY3JpcHQgY2FuIGV4aXQgd2l0aAordGhlIHN0YXR1cyBvZiB0aGUgcmVhbCB0ZXN0IHRvIGxldCAiZ2l0IGJpc2VjdCBydW4iIGNvbW1hbmQgbG9vcCB0bwora25vdyB0aGUgb3V0Y29tZS4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWJsYW1lLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWJsYW1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDE2M2I2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtYmxhbWUudHh0CkBAIC0wLDAgKzEsMTk1IEBACitnaXQtYmxhbWUoMSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtYmxhbWUgLSBTaG93IHdoYXQgcmV2aXNpb24gYW5kIGF1dGhvciBsYXN0IG1vZGlmaWVkIGVhY2ggbGluZSBvZiBhIGZpbGUKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWJsYW1lJyBbLWNdIFstYl0gWy1sXSBbLS1yb290XSBbLXRdIFstZl0gWy1uXSBbLXNdIFstcF0gWy13XSBbLS1pbmNyZW1lbnRhbF0gWy1MIG4sbV0KKyAgICAgICAgICAgIFstUyA8cmV2cy1maWxlPl0gWy1NXSBbLUNdIFstQ10gWy0tc2luY2U9PGRhdGU+XQorICAgICAgICAgICAgWzxyZXY+IHwgLS1jb250ZW50cyA8ZmlsZT5dIFstLV0gPGZpbGU+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitBbm5vdGF0ZXMgZWFjaCBsaW5lIGluIHRoZSBnaXZlbiBmaWxlIHdpdGggaW5mb3JtYXRpb24gZnJvbSB0aGUgcmV2aXNpb24gd2hpY2gKK2xhc3QgbW9kaWZpZWQgdGhlIGxpbmUuIE9wdGlvbmFsbHksIHN0YXJ0IGFubm90YXRpbmcgZnJvbSB0aGUgZ2l2ZW4gcmV2aXNpb24uCisKK0Fsc28gaXQgY2FuIGxpbWl0IHRoZSByYW5nZSBvZiBsaW5lcyBhbm5vdGF0ZWQuCisKK1RoaXMgcmVwb3J0IGRvZXNuJ3QgdGVsbCB5b3UgYW55dGhpbmcgYWJvdXQgbGluZXMgd2hpY2ggaGF2ZSBiZWVuIGRlbGV0ZWQgb3IKK3JlcGxhY2VkOyB5b3UgbmVlZCB0byB1c2UgYSB0b29sIHN1Y2ggYXMgbGlua2dpdDpnaXQtZGlmZlsxXSBvciB0aGUgInBpY2theGUiCitpbnRlcmZhY2UgYnJpZWZseSBtZW50aW9uZWQgaW4gdGhlIGZvbGxvd2luZyBwYXJhZ3JhcGguCisKK0FwYXJ0IGZyb20gc3VwcG9ydGluZyBmaWxlIGFubm90YXRpb24sIGdpdCBhbHNvIHN1cHBvcnRzIHNlYXJjaGluZyB0aGUKK2RldmVsb3BtZW50IGhpc3RvcnkgZm9yIHdoZW4gYSBjb2RlIHNuaXBwZXQgb2NjdXJyZWQgaW4gYSBjaGFuZ2UuIFRoaXMgbWFrZXMgaXQKK3Bvc3NpYmxlIHRvIHRyYWNrIHdoZW4gYSBjb2RlIHNuaXBwZXQgd2FzIGFkZGVkIHRvIGEgZmlsZSwgbW92ZWQgb3IgY29waWVkCitiZXR3ZWVuIGZpbGVzLCBhbmQgZXZlbnR1YWxseSBkZWxldGVkIG9yIHJlcGxhY2VkLiBJdCB3b3JrcyBieSBzZWFyY2hpbmcgZm9yCithIHRleHQgc3RyaW5nIGluIHRoZSBkaWZmLiBBIHNtYWxsIGV4YW1wbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBsb2cgLS1wcmV0dHk9b25lbGluZSAtUydibGFtZV91c2FnZScKKzUwNDBmMTdlYmExNTUwNGJhZDY2YjE0YTY0NWJkZGQ5YjAxNWViYjcgYmxhbWUgLVMgPGFuY2VzdHJ5LWZpbGU+CitlYTRjN2Y5YmY2OWU3ODFkZDBjZDg4ZDJiY2NiMmJmNWNjMTVjOWE3IGdpdC1ibGFtZTogTWFrZSB0aGUgb3V0cHV0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitPUFRJT05TCistLS0tLS0tCitpbmNsdWRlOjpibGFtZS1vcHRpb25zLnR4dFtdCisKKy1jOjoKKwlVc2UgdGhlIHNhbWUgb3V0cHV0IG1vZGUgYXMgbGlua2dpdDpnaXQtYW5ub3RhdGVbMV0gKERlZmF1bHQ6IG9mZikuCisKKy0tc2NvcmUtZGVidWc6OgorCUluY2x1ZGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIG1vdmVtZW50IG9mCisJbGluZXMgYmV0d2VlbiBmaWxlcyAoc2VlIGAtQ2ApIGFuZCBsaW5lcyBtb3ZlZCB3aXRoaW4gYQorCWZpbGUgKHNlZSBgLU1gKS4gIFRoZSBmaXJzdCBudW1iZXIgbGlzdGVkIGlzIHRoZSBzY29yZS4KKwlUaGlzIGlzIHRoZSBudW1iZXIgb2YgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgZGV0ZWN0ZWQKKwl0byBiZSBtb3ZlZCBiZXR3ZWVuIG9yIHdpdGhpbiBmaWxlcy4gIFRoaXMgbXVzdCBiZSBhYm92ZQorCWEgY2VydGFpbiB0aHJlc2hvbGQgZm9yIGdpdC1ibGFtZSB0byBjb25zaWRlciB0aG9zZSBsaW5lcworCW9mIGNvZGUgdG8gaGF2ZSBiZWVuIG1vdmVkLgorCistZiwgLS1zaG93LW5hbWU6OgorCVNob3cgZmlsZW5hbWUgaW4gdGhlIG9yaWdpbmFsIGNvbW1pdC4gIEJ5IGRlZmF1bHQKKwlmaWxlbmFtZSBpcyBzaG93biBpZiB0aGVyZSBpcyBhbnkgbGluZSB0aGF0IGNhbWUgZnJvbSBhCisJZmlsZSB3aXRoIGRpZmZlcmVudCBuYW1lLCBkdWUgdG8gcmVuYW1lIGRldGVjdGlvbi4KKworLW4sIC0tc2hvdy1udW1iZXI6OgorCVNob3cgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIGNvbW1pdCAoRGVmYXVsdDogb2ZmKS4KKworLXM6OgorCVN1cHByZXNzIGF1dGhvciBuYW1lIGFuZCB0aW1lc3RhbXAgZnJvbSB0aGUgb3V0cHV0LgorCistdzo6CisJSWdub3JlIHdoaXRlc3BhY2Ugd2hlbiBjb21wYXJpbmcgcGFyZW50J3MgdmVyc2lvbiBhbmQKKwljaGlsZCdzIHRvIGZpbmQgd2hlcmUgdGhlIGxpbmVzIGNhbWUgZnJvbS4KKworCitUSEUgUE9SQ0VMQUlOIEZPUk1BVAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW4gdGhpcyBmb3JtYXQsIGVhY2ggbGluZSBpcyBvdXRwdXQgYWZ0ZXIgYSBoZWFkZXI7IHRoZQoraGVhZGVyIGF0IHRoZSBtaW5pbXVtIGhhcyB0aGUgZmlyc3QgbGluZSB3aGljaCBoYXM6CisKKy0gNDAtYnl0ZSBTSEEtMSBvZiB0aGUgY29tbWl0IHRoZSBsaW5lIGlzIGF0dHJpYnV0ZWQgdG87CistIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgbGluZSBpbiB0aGUgb3JpZ2luYWwgZmlsZTsKKy0gdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBsaW5lIGluIHRoZSBmaW5hbCBmaWxlOworLSBvbiBhIGxpbmUgdGhhdCBzdGFydHMgYSBncm91cCBvZiBsaW5lIGZyb20gYSBkaWZmZXJlbnQKKyAgY29tbWl0IHRoYW4gdGhlIHByZXZpb3VzIG9uZSwgdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGlzCisgIGdyb3VwLiAgT24gc3Vic2VxdWVudCBsaW5lcyB0aGlzIGZpZWxkIGlzIGFic2VudC4KKworVGhpcyBoZWFkZXIgbGluZSBpcyBmb2xsb3dlZCBieSB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uCithdCBsZWFzdCBvbmNlIGZvciBlYWNoIGNvbW1pdDoKKworLSBhdXRob3IgbmFtZSAoImF1dGhvciIpLCBlbWFpbCAoImF1dGhvci1tYWlsIiksIHRpbWUKKyAgKCJhdXRob3ItdGltZSIpLCBhbmQgdGltZXpvbmUgKCJhdXRob3ItdHoiKTsgc2ltaWxhcmx5CisgIGZvciBjb21taXR0ZXIuCistIGZpbGVuYW1lIGluIHRoZSBjb21taXQgdGhlIGxpbmUgaXMgYXR0cmlidXRlZCB0by4KKy0gdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZSAoInN1bW1hcnkiKS4KKworVGhlIGNvbnRlbnRzIG9mIHRoZSBhY3R1YWwgbGluZSBpcyBvdXRwdXQgYWZ0ZXIgdGhlIGFib3ZlCitoZWFkZXIsIHByZWZpeGVkIGJ5IGEgVEFCLiBUaGlzIGlzIHRvIGFsbG93IGFkZGluZyBtb3JlCitoZWFkZXIgZWxlbWVudHMgbGF0ZXIuCisKKworU1BFQ0lGWUlORyBSQU5HRVMKKy0tLS0tLS0tLS0tLS0tLS0tCisKK1VubGlrZSBgZ2l0LWJsYW1lYCBhbmQgYGdpdC1hbm5vdGF0ZWAgaW4gb2xkZXIgZ2l0LCB0aGUgZXh0ZW50CitvZiBhbm5vdGF0aW9uIGNhbiBiZSBsaW1pdGVkIHRvIGJvdGggbGluZSByYW5nZXMgYW5kIHJldmlzaW9uCityYW5nZXMuICBXaGVuIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBmaW5kaW5nIHRoZSBvcmlnaW4gZm9yCitsbC4gNDAtNjAgZm9yIGZpbGUgYGZvb2AsIHlvdSBjYW4gdXNlIGAtTGAgb3B0aW9uIGxpa2UgdGhlc2UKKyh0aGV5IG1lYW4gdGhlIHNhbWUgdGhpbmcgLS0gYm90aCBhc2sgZm9yIDIxIGxpbmVzIHN0YXJ0aW5nIGF0CitsaW5lIDQwKToKKworCWdpdCBibGFtZSAtTCA0MCw2MCBmb28KKwlnaXQgYmxhbWUgLUwgNDAsKzIxIGZvbworCitBbHNvIHlvdSBjYW4gdXNlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzcGVjaWZ5IHRoZSBsaW5lIHJhbmdlLgorCisJZ2l0IGJsYW1lIC1MICcvXnN1YiBoZWxsbyB7LywvXn0kLycgZm9vCisKK3dvdWxkIGxpbWl0IHRoZSBhbm5vdGF0aW9uIHRvIHRoZSBib2R5IG9mIGBoZWxsb2Agc3Vicm91dGluZS4KKworV2hlbiB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIGNoYW5nZXMgb2xkZXIgdGhhbiB0aGUgdmVyc2lvbgordjIuNi4xOCwgb3IgY2hhbmdlcyBvbGRlciB0aGFuIDMgd2Vla3MsIHlvdSBjYW4gdXNlIHJldmlzaW9uCityYW5nZSBzcGVjaWZpZXJzICBzaW1pbGFyIHRvIGBnaXQtcmV2LWxpc3RgOgorCisJZ2l0IGJsYW1lIHYyLjYuMTguLiAtLSBmb28KKwlnaXQgYmxhbWUgLS1zaW5jZT0zLndlZWtzIC0tIGZvbworCitXaGVuIHJldmlzaW9uIHJhbmdlIHNwZWNpZmllcnMgYXJlIHVzZWQgdG8gbGltaXQgdGhlIGFubm90YXRpb24sCitsaW5lcyB0aGF0IGhhdmUgbm90IGNoYW5nZWQgc2luY2UgdGhlIHJhbmdlIGJvdW5kYXJ5IChlaXRoZXIgdGhlCitjb21taXQgdjIuNi4xOCBvciB0aGUgbW9zdCByZWNlbnQgY29tbWl0IHRoYXQgaXMgbW9yZSB0aGFuIDMKK3dlZWtzIG9sZCBpbiB0aGUgYWJvdmUgZXhhbXBsZSkgYXJlIGJsYW1lZCBmb3IgdGhhdCByYW5nZQorYm91bmRhcnkgY29tbWl0LgorCitBIHBhcnRpY3VsYXJseSB1c2VmdWwgd2F5IGlzIHRvIHNlZSBpZiBhbiBhZGRlZCBmaWxlIGhhdmUgbGluZXMKK2NyZWF0ZWQgYnkgY29weS1hbmQtcGFzdGUgZnJvbSBleGlzdGluZyBmaWxlcy4gIFNvbWV0aW1lcyB0aGlzCitpbmRpY2F0ZXMgdGhhdCB0aGUgZGV2ZWxvcGVyIHdhcyBiZWluZyBzbG9wcHkgYW5kIGRpZCBub3QKK3JlZmFjdG9yIHRoZSBjb2RlIHByb3Blcmx5LiAgWW91IGNhbiBmaXJzdCBmaW5kIHRoZSBjb21taXQgdGhhdAoraW50cm9kdWNlZCB0aGUgZmlsZSB3aXRoOgorCisJZ2l0IGxvZyAtLWRpZmYtZmlsdGVyPUEgLS1wcmV0dHk9c2hvcnQgLS0gZm9vCisKK2FuZCB0aGVuIGFubm90YXRlIHRoZSBjaGFuZ2UgYmV0d2VlbiB0aGUgY29tbWl0IGFuZCBpdHMKK3BhcmVudHMsIHVzaW5nIGBjb21taXR7Y2FyZXR9IWAgbm90YXRpb246CisKKwlnaXQgYmxhbWUgLUMgLUMgLWYgJGNvbW1pdF4hIC0tIGZvbworCisKK0lOQ1JFTUVOVEFMIE9VVFBVVAorLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doZW4gY2FsbGVkIHdpdGggYC0taW5jcmVtZW50YWxgIG9wdGlvbiwgdGhlIGNvbW1hbmQgb3V0cHV0cyB0aGUKK3Jlc3VsdCBhcyBpdCBpcyBidWlsdC4gIFRoZSBvdXRwdXQgZ2VuZXJhbGx5IHdpbGwgdGFsayBhYm91dAorbGluZXMgdG91Y2hlZCBieSBtb3JlIHJlY2VudCBjb21taXRzIGZpcnN0IChpLmUuIHRoZSBsaW5lcyB3aWxsCitiZSBhbm5vdGF0ZWQgb3V0IG9mIG9yZGVyKSBhbmQgaXMgbWVhbnQgdG8gYmUgdXNlZCBieQoraW50ZXJhY3RpdmUgdmlld2Vycy4KKworVGhlIG91dHB1dCBmb3JtYXQgaXMgc2ltaWxhciB0byB0aGUgUG9yY2VsYWluIGZvcm1hdCwgYnV0IGl0Citkb2VzIG5vdCBjb250YWluIHRoZSBhY3R1YWwgbGluZXMgZnJvbSB0aGUgZmlsZSB0aGF0IGlzIGJlaW5nCithbm5vdGF0ZWQuCisKKy4gRWFjaCBibGFtZSBlbnRyeSBhbHdheXMgc3RhcnRzIHdpdGggYSBsaW5lIG9mOgorCisJPDQwLWJ5dGUgaGV4IHNoYTE+IDxzb3VyY2VsaW5lPiA8cmVzdWx0bGluZT4gPG51bV9saW5lcz4KKysKK0xpbmUgbnVtYmVycyBjb3VudCBmcm9tIDEuCisKKy4gVGhlIGZpcnN0IHRpbWUgdGhhdCBjb21taXQgc2hvd3MgdXAgaW4gdGhlIHN0cmVhbSwgaXQgaGFzIHZhcmlvdXMKKyAgb3RoZXIgaW5mb3JtYXRpb24gYWJvdXQgaXQgcHJpbnRlZCBvdXQgd2l0aCBhIG9uZS13b3JkIHRhZyBhdCB0aGUKKyAgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSBhYm91dCB0aGF0ICJleHRlbmRlZCBjb21taXQgaW5mbyIgKGF1dGhvciwKKyAgZW1haWwsIGNvbW1pdHRlciwgZGF0ZXMsIHN1bW1hcnkgZXRjKS4KKworLiBVbmxpa2UgUG9yY2VsYWluIGZvcm1hdCwgdGhlIGZpbGVuYW1lIGluZm9ybWF0aW9uIGlzIGFsd2F5cworICBnaXZlbiBhbmQgdGVybWluYXRlcyB0aGUgZW50cnk6CisKKwkiZmlsZW5hbWUiIDx3aGl0ZXNwYWNlLXF1b3RlZC1maWxlbmFtZS1nb2VzLWhlcmU+CisrCithbmQgdGh1cyBpdCdzIHJlYWxseSBxdWl0ZSBlYXN5IHRvIHBhcnNlIGZvciBzb21lIGxpbmUtIGFuZCB3b3JkLW9yaWVudGVkCitwYXJzZXIgKHdoaWNoIHNob3VsZCBiZSBxdWl0ZSBuYXR1cmFsIGZvciBtb3N0IHNjcmlwdGluZyBsYW5ndWFnZXMpLgorKworW05PVEVdCitGb3IgcGVvcGxlIHdobyBkbyBwYXJzaW5nOiB0byBtYWtlIGl0IG1vcmUgcm9idXN0LCBqdXN0IGlnbm9yZSBhbnkKK2xpbmVzIGluIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBsYXN0IG9uZSAoIjxzaGExPiIgYW5kICJmaWxlbmFtZSIgbGluZXMpCit3aGVyZSB5b3UgZG9uJ3QgcmVjb2duaXplIHRoZSB0YWctd29yZHMgKG9yIGNhcmUgYWJvdXQgdGhhdCBwYXJ0aWN1bGFyCitvbmUpIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlICJleHRlbmRlZCBpbmZvcm1hdGlvbiIgbGluZXMuIFRoYXQgd2F5LCBpZgordGhlcmUgaXMgZXZlciBhZGRlZCBpbmZvcm1hdGlvbiAobGlrZSB0aGUgY29tbWl0IGVuY29kaW5nIG9yIGV4dGVuZGVkCitjb21taXQgY29tbWVudGFyeSksIGEgYmxhbWUgdmlld2VyIHdvbid0IGV2ZXIgY2FyZS4KKworCitTRUUgQUxTTworLS0tLS0tLS0KK2xpbmtnaXQ6Z2l0LWFubm90YXRlWzFdCisKK0FVVEhPUgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1icmFuY2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtYnJhbmNoLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjA3YTE3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtYnJhbmNoLnR4dApAQCAtMCwwICsxLDE4OSBAQAorZ2l0LWJyYW5jaCgxKQorPT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtYnJhbmNoIC0gTGlzdCwgY3JlYXRlLCBvciBkZWxldGUgYnJhbmNoZXMKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWJyYW5jaCcgWy0tY29sb3IgfCAtLW5vLWNvbG9yXSBbLXIgfCAtYV0KKwkgICBbLXYgWy0tYWJicmV2PTxsZW5ndGg+IHwgLS1uby1hYmJyZXZdXQorCSAgIFstLWNvbnRhaW5zIDxjb21taXQ+XQorJ2dpdC1icmFuY2gnIFstLXRyYWNrIHwgLS1uby10cmFja10gWy1sXSBbLWZdIDxicmFuY2huYW1lPiBbPHN0YXJ0LXBvaW50Pl0KKydnaXQtYnJhbmNoJyAoLW0gfCAtTSkgWzxvbGRicmFuY2g+XSA8bmV3YnJhbmNoPgorJ2dpdC1icmFuY2gnICgtZCB8IC1EKSBbLXJdIDxicmFuY2huYW1lPi4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1dpdGggbm8gYXJndW1lbnRzIGdpdmVuIGEgbGlzdCBvZiBleGlzdGluZyBicmFuY2hlcword2lsbCBiZSBzaG93biwgdGhlIGN1cnJlbnQgYnJhbmNoIHdpbGwgYmUgaGlnaGxpZ2h0ZWQgd2l0aCBhbiBhc3Rlcmlzay4KK09wdGlvbiBgLXJgIGNhdXNlcyB0aGUgcmVtb3RlLXRyYWNraW5nIGJyYW5jaGVzIHRvIGJlIGxpc3RlZCwKK2FuZCBvcHRpb24gYC1hYCBzaG93cyBib3RoLgorV2l0aCBgLS1jb250YWlucyA8Y29tbWl0PmAsIHNob3dzIG9ubHkgdGhlIGJyYW5jaGVzIHRoYXQKK2NvbnRhaW5zIHRoZSBuYW1lZCBjb21taXQgKGluIG90aGVyIHdvcmRzLCB0aGUgYnJhbmNoZXMgd2hvc2UKK3RpcCBjb21taXRzIGFyZSBkZXNjZW5kYW50IG9mIHRoZSBuYW1lZCBjb21taXQpLgorCitJbiBpdHMgc2Vjb25kIGZvcm0sIGEgbmV3IGJyYW5jaCBuYW1lZCA8YnJhbmNobmFtZT4gd2lsbCBiZSBjcmVhdGVkLgorSXQgd2lsbCBzdGFydCBvdXQgd2l0aCBhIGhlYWQgZXF1YWwgdG8gdGhlIG9uZSBnaXZlbiBhcyA8c3RhcnQtcG9pbnQ+LgorSWYgbm8gPHN0YXJ0LXBvaW50PiBpcyBnaXZlbiwgdGhlIGJyYW5jaCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCBhIGhlYWQKK2VxdWFsIHRvIHRoYXQgb2YgdGhlIGN1cnJlbnRseSBjaGVja2VkIG91dCBicmFuY2guCisKK05vdGUgdGhhdCB0aGlzIHdpbGwgY3JlYXRlIHRoZSBuZXcgYnJhbmNoLCBidXQgaXQgd2lsbCBub3Qgc3dpdGNoIHRoZQord29ya2luZyB0cmVlIHRvIGl0OyB1c2UgImdpdCBjaGVja291dCA8bmV3YnJhbmNoPiIgdG8gc3dpdGNoIHRvIHRoZQorbmV3IGJyYW5jaC4KKworV2hlbiBhIGxvY2FsIGJyYW5jaCBpcyBzdGFydGVkIG9mZiBhIHJlbW90ZSBicmFuY2gsIGdpdCBzZXRzIHVwIHRoZQorYnJhbmNoIHNvIHRoYXQgbGlua2dpdDpnaXQtcHVsbFsxXSB3aWxsIGFwcHJvcHJpYXRlbHkgbWVyZ2UgZnJvbQordGhlIHJlbW90ZSBicmFuY2guIFRoaXMgYmVoYXZpb3IgbWF5IGJlIGNoYW5nZWQgdmlhIHRoZSBnbG9iYWwKK2BicmFuY2guYXV0b3NldHVwbWVyZ2VgIGNvbmZpZ3VyYXRpb24gZmxhZy4gVGhhdCBzZXR0aW5nIGNhbiBiZQorb3ZlcnJpZGRlbiBieSB1c2luZyB0aGUgYC0tdHJhY2tgIGFuZCBgLS1uby10cmFja2Agb3B0aW9ucy4KKworV2l0aCBhICctbScgb3IgJy1NJyBvcHRpb24sIDxvbGRicmFuY2g+IHdpbGwgYmUgcmVuYW1lZCB0byA8bmV3YnJhbmNoPi4KK0lmIDxvbGRicmFuY2g+IGhhZCBhIGNvcnJlc3BvbmRpbmcgcmVmbG9nLCBpdCBpcyByZW5hbWVkIHRvIG1hdGNoCis8bmV3YnJhbmNoPiwgYW5kIGEgcmVmbG9nIGVudHJ5IGlzIGNyZWF0ZWQgdG8gcmVtZW1iZXIgdGhlIGJyYW5jaAorcmVuYW1pbmcuIElmIDxuZXdicmFuY2g+IGV4aXN0cywgLU0gbXVzdCBiZSB1c2VkIHRvIGZvcmNlIHRoZSByZW5hbWUKK3RvIGhhcHBlbi4KKworV2l0aCBhIGAtZGAgb3IgYC1EYCBvcHRpb24sIGA8YnJhbmNobmFtZT5gIHdpbGwgYmUgZGVsZXRlZC4gIFlvdSBtYXkKK3NwZWNpZnkgbW9yZSB0aGFuIG9uZSBicmFuY2ggZm9yIGRlbGV0aW9uLiAgSWYgdGhlIGJyYW5jaCBjdXJyZW50bHkKK2hhcyBhIHJlZmxvZyB0aGVuIHRoZSByZWZsb2cgd2lsbCBhbHNvIGJlIGRlbGV0ZWQuCisKK1VzZSAtciB0b2dldGhlciB3aXRoIC1kIHRvIGRlbGV0ZSByZW1vdGUtdHJhY2tpbmcgYnJhbmNoZXMuIE5vdGUsIHRoYXQgaXQKK29ubHkgbWFrZXMgc2Vuc2UgdG8gZGVsZXRlIHJlbW90ZS10cmFja2luZyBicmFuY2hlcyBpZiB0aGV5IG5vIGxvbmdlciBleGlzdAoraW4gcmVtb3RlIHJlcG9zaXRvcnkgb3IgaWYgbGlua2dpdDpnaXQtZmV0Y2hbMV0gd2FzIGNvbmZpZ3VyZWQgbm90IHRvIGZldGNoCit0aGVtIGFnYWluLiBTZWUgYWxzbyAncHJ1bmUnIHN1YmNvbW1hbmQgb2YgbGlua2dpdDpnaXQtcmVtb3RlWzFdIGZvciB3YXkgdG8KK2NsZWFuIHVwIGFsbCBvYnNvbGV0ZSByZW1vdGUtdHJhY2tpbmcgYnJhbmNoZXMuCisKKworT1BUSU9OUworLS0tLS0tLQorLWQ6OgorCURlbGV0ZSBhIGJyYW5jaC4gVGhlIGJyYW5jaCBtdXN0IGJlIGZ1bGx5IG1lcmdlZCBpbiBIRUFELgorCistRDo6CisJRGVsZXRlIGEgYnJhbmNoIGlycmVzcGVjdGl2ZSBvZiBpdHMgbWVyZ2VkIHN0YXR1cy4KKworLWw6OgorCUNyZWF0ZSB0aGUgYnJhbmNoJ3MgcmVmbG9nLiAgVGhpcyBhY3RpdmF0ZXMgcmVjb3JkaW5nIG9mCisJYWxsIGNoYW5nZXMgbWFkZSB0byB0aGUgYnJhbmNoIHJlZiwgZW5hYmxpbmcgdXNlIG9mIGRhdGUKKwliYXNlZCBzaGExIGV4cHJlc3Npb25zIHN1Y2ggYXMgIjxicmFuY2huYW1lPkBce3llc3RlcmRheX0iLgorCistZjo6CisJRm9yY2UgdGhlIGNyZWF0aW9uIG9mIGEgbmV3IGJyYW5jaCBldmVuIGlmIGl0IG1lYW5zIGRlbGV0aW5nCisJYSBicmFuY2ggdGhhdCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBzYW1lIG5hbWUuCisKKy1tOjoKKwlNb3ZlL3JlbmFtZSBhIGJyYW5jaCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgcmVmbG9nLgorCistTTo6CisJTW92ZS9yZW5hbWUgYSBicmFuY2ggZXZlbiBpZiB0aGUgbmV3IGJyYW5jaG5hbWUgYWxyZWFkeSBleGlzdHMuCisKKy0tY29sb3I6OgorCUNvbG9yIGJyYW5jaGVzIHRvIGhpZ2hsaWdodCBjdXJyZW50LCBsb2NhbCwgYW5kIHJlbW90ZSBicmFuY2hlcy4KKworLS1uby1jb2xvcjo6CisJVHVybiBvZmYgYnJhbmNoIGNvbG9ycywgZXZlbiB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgZ2l2ZXMgdGhlCisJZGVmYXVsdCB0byBjb2xvciBvdXRwdXQuCisKKy1yOjoKKwlMaXN0IG9yIGRlbGV0ZSAoaWYgdXNlZCB3aXRoIC1kKSB0aGUgcmVtb3RlLXRyYWNraW5nIGJyYW5jaGVzLgorCistYTo6CisJTGlzdCBib3RoIHJlbW90ZS10cmFja2luZyBicmFuY2hlcyBhbmQgbG9jYWwgYnJhbmNoZXMuCisKKy12LCAtLXZlcmJvc2U6OgorCVNob3cgc2hhMSBhbmQgY29tbWl0IHN1YmplY3QgbGluZSBmb3IgZWFjaCBoZWFkLgorCistLWFiYnJldj08bGVuZ3RoPjo6CisJQWx0ZXIgbWluaW11bSBkaXNwbGF5IGxlbmd0aCBmb3Igc2hhMSBpbiBvdXRwdXQgbGlzdGluZywKKwlkZWZhdWx0IHZhbHVlIGlzIDcuCisKKy0tbm8tYWJicmV2OjoKKwlEaXNwbGF5IHRoZSBmdWxsIHNoYTFzIGluIG91dHB1dCBsaXN0aW5nIHJhdGhlciB0aGFuIGFiYnJldmlhdGluZyB0aGVtLgorCistLXRyYWNrOjoKKwlXaGVuIGNyZWF0aW5nIGEgbmV3IGJyYW5jaCwgc2V0IHVwIGNvbmZpZ3VyYXRpb24gc28gdGhhdCBnaXQtcHVsbAorCXdpbGwgYXV0b21hdGljYWxseSByZXRyaWV2ZSBkYXRhIGZyb20gdGhlIHN0YXJ0IHBvaW50LCB3aGljaCBtdXN0IGJlCisJYSBicmFuY2guIFVzZSB0aGlzIGlmIHlvdSBhbHdheXMgcHVsbCBmcm9tIHRoZSBzYW1lIHVwc3RyZWFtIGJyYW5jaAorCWludG8gdGhlIG5ldyBicmFuY2gsIGFuZCBpZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgImdpdCBwdWxsCisJPHJlcG9zaXRvcnk+IDxyZWZzcGVjPiIgZXhwbGljaXRseS4gVGhpcyBiZWhhdmlvciBpcyB0aGUgZGVmYXVsdAorCXdoZW4gdGhlIHN0YXJ0IHBvaW50IGlzIGEgcmVtb3RlIGJyYW5jaC4gU2V0IHRoZQorCWJyYW5jaC5hdXRvc2V0dXBtZXJnZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIHRvIGBmYWxzZWAgaWYgeW91IHdhbnQKKwlnaXQtY2hlY2tvdXQgYW5kIGdpdC1icmFuY2ggdG8gYWx3YXlzIGJlaGF2ZSBhcyBpZiAnLS1uby10cmFjaycgd2VyZQorCWdpdmVuLiBTZXQgaXQgdG8gYGFsd2F5c2AgaWYgeW91IHdhbnQgdGhpcyBiZWhhdmlvciB3aGVuIHRoZQorCXN0YXJ0LXBvaW50IGlzIGVpdGhlciBhIGxvY2FsIG9yIHJlbW90ZSBicmFuY2guCisKKy0tbm8tdHJhY2s6OgorCUlnbm9yZSB0aGUgYnJhbmNoLmF1dG9zZXR1cG1lcmdlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUuCisKKzxicmFuY2huYW1lPjo6CisJVGhlIG5hbWUgb2YgdGhlIGJyYW5jaCB0byBjcmVhdGUgb3IgZGVsZXRlLgorCVRoZSBuZXcgYnJhbmNoIG5hbWUgbXVzdCBwYXNzIGFsbCBjaGVja3MgZGVmaW5lZCBieQorCWxpbmtnaXQ6Z2l0LWNoZWNrLXJlZi1mb3JtYXRbMV0uICBTb21lIG9mIHRoZXNlIGNoZWNrcworCW1heSByZXN0cmljdCB0aGUgY2hhcmFjdGVycyBhbGxvd2VkIGluIGEgYnJhbmNoIG5hbWUuCisKKzxzdGFydC1wb2ludD46OgorCVRoZSBuZXcgYnJhbmNoIHdpbGwgYmUgY3JlYXRlZCB3aXRoIGEgSEVBRCBlcXVhbCB0byB0aGlzLiAgSXQgbWF5CisJYmUgZ2l2ZW4gYXMgYSBicmFuY2ggbmFtZSwgYSBjb21taXQtaWQsIG9yIGEgdGFnLiAgSWYgdGhpcyBvcHRpb24KKwlpcyBvbWl0dGVkLCB0aGUgY3VycmVudCBicmFuY2ggaXMgYXNzdW1lZC4KKworPG9sZGJyYW5jaD46OgorCVRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGJyYW5jaCB0byByZW5hbWUuCisKKzxuZXdicmFuY2g+OjoKKwlUaGUgbmV3IG5hbWUgZm9yIGFuIGV4aXN0aW5nIGJyYW5jaC4gVGhlIHNhbWUgcmVzdHJpY3Rpb25zIGFzIGZvcgorCTxicmFuY2huYW1lPiBhcHBsaWVzLgorCisKK0V4YW1wbGVzCistLS0tLS0tLQorCitTdGFydCBkZXZlbG9wbWVudCBvZmYgb2YgYSBrbm93biB0YWc6OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBjbG9uZSBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtLy4uLi9saW51eC0yLjYgbXkyLjYKKyQgY2QgbXkyLjYKKyQgZ2l0IGJyYW5jaCBteTIuNi4xNCB2Mi42LjE0ICAgPDE+CiskIGdpdCBjaGVja291dCBteTIuNi4xNAorLS0tLS0tLS0tLS0tCisrCis8MT4gVGhpcyBzdGVwIGFuZCB0aGUgbmV4dCBvbmUgY291bGQgYmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBzdGVwIHdpdGgKKyJjaGVja291dCAtYiBteTIuNi4xNCB2Mi42LjE0Ii4KKworRGVsZXRlIHVubmVlZGVkIGJyYW5jaDo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNsb25lIGdpdDovL2dpdC5rZXJuZWwub3JnLy4uLi9naXQuZ2l0IG15LmdpdAorJCBjZCBteS5naXQKKyQgZ2l0IGJyYW5jaCAtZCAtciBvcmlnaW4vdG9kbyBvcmlnaW4vaHRtbCBvcmlnaW4vbWFuICAgPDE+CiskIGdpdCBicmFuY2ggLUQgdGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwyPgorLS0tLS0tLS0tLS0tCisrCis8MT4gRGVsZXRlIHJlbW90ZS10cmFja2luZyBicmFuY2hlcyAidG9kbyIsICJodG1sIiwgIm1hbiIuIE5leHQgJ2ZldGNoJyBvcgorJ3B1bGwnIHdpbGwgY3JlYXRlIHRoZW0gYWdhaW4gdW5sZXNzIHlvdSBjb25maWd1cmUgdGhlbSBub3QgdG8uIFNlZQorbGlua2dpdDpnaXQtZmV0Y2hbMV0uCis8Mj4gRGVsZXRlICJ0ZXN0IiBicmFuY2ggZXZlbiBpZiB0aGUgIm1hc3RlciIgYnJhbmNoIChvciB3aGljaGV2ZXIgYnJhbmNoIGlzCitjdXJyZW50bHkgY2hlY2tlZCBvdXQpIGRvZXMgbm90IGhhdmUgYWxsIGNvbW1pdHMgZnJvbSB0ZXN0IGJyYW5jaC4KKworCitOb3RlcworLS0tLS0KKworSWYgeW91IGFyZSBjcmVhdGluZyBhIGJyYW5jaCB0aGF0IHlvdSB3YW50IHRvIGltbWVkaWF0ZWx5IGNoZWNrb3V0LCBpdCdzCitlYXNpZXIgdG8gdXNlIHRoZSBnaXQgY2hlY2tvdXQgY29tbWFuZCB3aXRoIGl0cyBgLWJgIG9wdGlvbiB0byBjcmVhdGUKK2EgYnJhbmNoIGFuZCBjaGVjayBpdCBvdXQgd2l0aCBhIHNpbmdsZSBjb21tYW5kLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4gYW5kIEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtYnVuZGxlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWJ1bmRsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA1YWMwNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWJ1bmRsZS50eHQKQEAgLTAsMCArMSwxNzQgQEAKK2dpdC1idW5kbGUoMSkKKz09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWJ1bmRsZSAtIE1vdmUgb2JqZWN0cyBhbmQgcmVmcyBieSBhcmNoaXZlCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWJ1bmRsZScgY3JlYXRlIDxmaWxlPiBbZ2l0LXJldi1saXN0IGFyZ3NdCisnZ2l0LWJ1bmRsZScgdmVyaWZ5IDxmaWxlPgorJ2dpdC1idW5kbGUnIGxpc3QtaGVhZHMgPGZpbGU+IFtyZWZuYW1lLi4uXQorJ2dpdC1idW5kbGUnIHVuYnVuZGxlIDxmaWxlPiBbcmVmbmFtZS4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK1NvbWUgd29ya2Zsb3dzIHJlcXVpcmUgdGhhdCBvbmUgb3IgbW9yZSBicmFuY2hlcyBvZiBkZXZlbG9wbWVudCBvbiBvbmUKK21hY2hpbmUgYmUgcmVwbGljYXRlZCBvbiBhbm90aGVyIG1hY2hpbmUsIGJ1dCB0aGUgdHdvIG1hY2hpbmVzIGNhbm5vdAorYmUgZGlyZWN0bHkgY29ubmVjdGVkIHNvIHRoZSBpbnRlcmFjdGl2ZSBnaXQgcHJvdG9jb2xzIChnaXQsIHNzaCwKK3JzeW5jLCBodHRwKSBjYW5ub3QgYmUgdXNlZC4gIFRoaXMgY29tbWFuZCBwcm92aWRlcyBzdXBwb3J0IGZvcgorZ2l0LWZldGNoIGFuZCBnaXQtcHVsbCB0byBvcGVyYXRlIGJ5IHBhY2thZ2luZyBvYmplY3RzIGFuZCByZWZlcmVuY2VzCitpbiBhbiBhcmNoaXZlIGF0IHRoZSBvcmlnaW5hdGluZyBtYWNoaW5lLCB0aGVuIGltcG9ydGluZyB0aG9zZSBpbnRvCithbm90aGVyIHJlcG9zaXRvcnkgdXNpbmcgbGlua2dpdDpnaXQtZmV0Y2hbMV0gYW5kIGxpbmtnaXQ6Z2l0LXB1bGxbMV0KK2FmdGVyIG1vdmluZyB0aGUgYXJjaGl2ZSBieSBzb21lIG1lYW5zIChpLmUuLCBieSBzbmVha2VybmV0KS4gIEFzIG5vCitkaXJlY3QgY29ubmVjdGlvbiBiZXR3ZWVuIHJlcG9zaXRvcmllcyBleGlzdHMsIHRoZSB1c2VyIG11c3Qgc3BlY2lmeSBhCitiYXNpcyBmb3IgdGhlIGJ1bmRsZSB0aGF0IGlzIGhlbGQgYnkgdGhlIGRlc3RpbmF0aW9uIHJlcG9zaXRvcnk6IHRoZQorYnVuZGxlIGFzc3VtZXMgdGhhdCBhbGwgb2JqZWN0cyBpbiB0aGUgYmFzaXMgYXJlIGFscmVhZHkgaW4gdGhlCitkZXN0aW5hdGlvbiByZXBvc2l0b3J5LgorCitPUFRJT05TCistLS0tLS0tCisKK2NyZWF0ZSA8ZmlsZT46OgorICAgICAgIFVzZWQgdG8gY3JlYXRlIGEgYnVuZGxlIG5hbWVkICdmaWxlJy4gIFRoaXMgcmVxdWlyZXMgdGhlCisgICAgICAgZ2l0LXJldi1saXN0IGFyZ3VtZW50cyB0byBkZWZpbmUgdGhlIGJ1bmRsZSBjb250ZW50cy4KKwordmVyaWZ5IDxmaWxlPjo6CisgICAgICAgVXNlZCB0byBjaGVjayB0aGF0IGEgYnVuZGxlIGZpbGUgaXMgdmFsaWQgYW5kIHdpbGwgYXBwbHkKKyAgICAgICBjbGVhbmx5IHRvIHRoZSBjdXJyZW50IHJlcG9zaXRvcnkuICBUaGlzIGluY2x1ZGVzIGNoZWNrcyBvbiB0aGUKKyAgICAgICBidW5kbGUgZm9ybWF0IGl0c2VsZiBhcyB3ZWxsIGFzIGNoZWNraW5nIHRoYXQgdGhlIHByZXJlcXVpc2l0ZQorICAgICAgIGNvbW1pdHMgZXhpc3QgYW5kIGFyZSBmdWxseSBsaW5rZWQgaW4gdGhlIGN1cnJlbnQgcmVwb3NpdG9yeS4KKyAgICAgICBnaXQtYnVuZGxlIHByaW50cyBhIGxpc3Qgb2YgbWlzc2luZyBjb21taXRzLCBpZiBhbnksIGFuZCBleGl0cworICAgICAgIHdpdGggbm9uLXplcm8gc3RhdHVzLgorCitsaXN0LWhlYWRzIDxmaWxlPjo6CisgICAgICAgTGlzdHMgdGhlIHJlZmVyZW5jZXMgZGVmaW5lZCBpbiB0aGUgYnVuZGxlLiAgSWYgZm9sbG93ZWQgYnkgYQorICAgICAgIGxpc3Qgb2YgcmVmZXJlbmNlcywgb25seSByZWZlcmVuY2VzIG1hdGNoaW5nIHRob3NlIGdpdmVuIGFyZQorICAgICAgIHByaW50ZWQgb3V0LgorCit1bmJ1bmRsZSA8ZmlsZT46OgorICAgICAgIFBhc3NlcyB0aGUgb2JqZWN0cyBpbiB0aGUgYnVuZGxlIHRvIGxpbmtnaXQ6Z2l0LWluZGV4LXBhY2tbMV0KKyAgICAgICBmb3Igc3RvcmFnZSBpbiB0aGUgcmVwb3NpdG9yeSwgdGhlbiBwcmludHMgdGhlIG5hbWVzIG9mIGFsbAorICAgICAgIGRlZmluZWQgcmVmZXJlbmNlcy4gSWYgYSByZWZsaXN0IGlzIGdpdmVuLCBvbmx5IHJlZmVyZW5jZXMKKyAgICAgICBtYXRjaGluZyB0aG9zZSBpbiB0aGUgZ2l2ZW4gbGlzdCBhcmUgcHJpbnRlZC4gVGhpcyBjb21tYW5kIGlzCisgICAgICAgcmVhbGx5IHBsdW1iaW5nLCBpbnRlbmRlZCB0byBiZSBjYWxsZWQgb25seSBieQorICAgICAgIGxpbmtnaXQ6Z2l0LWZldGNoWzFdLgorCitbZ2l0LXJldi1saXN0LWFyZ3MuLi5dOjoKKyAgICAgICBBIGxpc3Qgb2YgYXJndW1lbnRzLCBhY2NlcHRhYmxlIHRvIGdpdC1yZXYtcGFyc2UgYW5kCisgICAgICAgZ2l0LXJldi1saXN0LCB0aGF0IHNwZWNpZnkgdGhlIHNwZWNpZmljIG9iamVjdHMgYW5kIHJlZmVyZW5jZXMKKyAgICAgICB0byB0cmFuc3BvcnQuICBGb3IgZXhhbXBsZSwgIm1hc3Rlcn4xMC4ubWFzdGVyIiBjYXVzZXMgdGhlCisgICAgICAgY3VycmVudCBtYXN0ZXIgcmVmZXJlbmNlIHRvIGJlIHBhY2thZ2VkIGFsb25nIHdpdGggYWxsIG9iamVjdHMKKyAgICAgICBhZGRlZCBzaW5jZSBpdHMgMTB0aCBhbmNlc3RvciBjb21taXQuICBUaGVyZSBpcyBubyBleHBsaWNpdAorICAgICAgIGxpbWl0IHRvIHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlcyBhbmQgb2JqZWN0cyB0aGF0IG1heSBiZQorICAgICAgIHBhY2thZ2VkLgorCisKK1tyZWZuYW1lLi4uXTo6CisgICAgICAgQSBsaXN0IG9mIHJlZmVyZW5jZXMgdXNlZCB0byBsaW1pdCB0aGUgcmVmZXJlbmNlcyByZXBvcnRlZCBhcworICAgICAgIGF2YWlsYWJsZS4gVGhpcyBpcyBwcmluY2lwYWxseSBvZiB1c2UgdG8gZ2l0LWZldGNoLCB3aGljaAorICAgICAgIGV4cGVjdHMgdG8gcmVjZWl2ZSBvbmx5IHRob3NlIHJlZmVyZW5jZXMgYXNrZWQgZm9yIGFuZCBub3QKKyAgICAgICBuZWNlc3NhcmlseSBldmVyeXRoaW5nIGluIHRoZSBwYWNrIChpbiB0aGlzIGNhc2UsIGdpdC1idW5kbGUgaXMKKyAgICAgICBhY3RpbmcgbGlrZSBsaW5rZ2l0OmdpdC1mZXRjaC1wYWNrWzFdKS4KKworU1BFQ0lGWUlORyBSRUZFUkVOQ0VTCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZ2l0LWJ1bmRsZSB3aWxsIG9ubHkgcGFja2FnZSByZWZlcmVuY2VzIHRoYXQgYXJlIHNob3duIGJ5CitnaXQtc2hvdy1yZWY6IHRoaXMgaW5jbHVkZXMgaGVhZHMsIHRhZ3MsIGFuZCByZW1vdGUgaGVhZHMuICBSZWZlcmVuY2VzCitzdWNoIGFzIG1hc3Rlcn4xIGNhbm5vdCBiZSBwYWNrYWdlZCwgYnV0IGFyZSBwZXJmZWN0bHkgc3VpdGFibGUgZm9yCitkZWZpbmluZyB0aGUgYmFzaXMuICBNb3JlIHRoYW4gb25lIHJlZmVyZW5jZSBtYXkgYmUgcGFja2FnZWQsIGFuZCBtb3JlCit0aGFuIG9uZSBiYXNpcyBjYW4gYmUgc3BlY2lmaWVkLiAgVGhlIG9iamVjdHMgcGFja2FnZWQgYXJlIHRob3NlIG5vdAorY29udGFpbmVkIGluIHRoZSB1bmlvbiBvZiB0aGUgZ2l2ZW4gYmFzZXMuICBFYWNoIGJhc2lzIGNhbiBiZQorc3BlY2lmaWVkIGV4cGxpY2l0bHkgKGUuZy4sIF5tYXN0ZXJ+MTApLCBvciBpbXBsaWNpdGx5IChlLmcuLAorbWFzdGVyfjEwLi5tYXN0ZXIsIG1hc3RlciAtLXNpbmNlPTEwLmRheXMuYWdvKS4KKworSXQgaXMgdmVyeSBpbXBvcnRhbnQgdGhhdCB0aGUgYmFzaXMgdXNlZCBiZSBoZWxkIGJ5IHRoZSBkZXN0aW5hdGlvbi4KK0l0IGlzIG9rYXkgdG8gZXJyIG9uIHRoZSBzaWRlIG9mIGNvbnNlcnZhdGlzbSwgY2F1c2luZyB0aGUgYnVuZGxlIGZpbGUKK3RvIGNvbnRhaW4gb2JqZWN0cyBhbHJlYWR5IGluIHRoZSBkZXN0aW5hdGlvbiBhcyB0aGVzZSBhcmUgaWdub3JlZAord2hlbiB1bnBhY2tpbmcgYXQgdGhlIGRlc3RpbmF0aW9uLgorCitFWEFNUExFCistLS0tLS0tCisKK0Fzc3VtZSB0d28gcmVwb3NpdG9yaWVzIGV4aXN0IGFzIFIxIG9uIG1hY2hpbmUgQSwgYW5kIFIyIG9uIG1hY2hpbmUgQi4KK0ZvciB3aGF0ZXZlciByZWFzb24sIGRpcmVjdCBjb25uZWN0aW9uIGJldHdlZW4gQSBhbmQgQiBpcyBub3QgYWxsb3dlZCwKK2J1dCB3ZSBjYW4gbW92ZSBkYXRhIGZyb20gQSB0byBCIHZpYSBzb21lIG1lY2hhbmlzbSAoQ0QsIGVtYWlsLCBldGMpLgorV2Ugd2FudCB0byB1cGRhdGUgUjIgd2l0aCBkZXZlbG9wbWVudHMgbWFkZSBvbiBicmFuY2ggbWFzdGVyIGluIFIxLgorCitUbyBjcmVhdGUgdGhlIGJ1bmRsZSB5b3UgaGF2ZSB0byBzcGVjaWZ5IHRoZSBiYXNpcy4gWW91IGhhdmUgc29tZSBvcHRpb25zOgorCistIFdpdGhvdXQgYmFzaXMuCisrCitUaGlzIGlzIHVzZWZ1bCB3aGVuIHNlbmRpbmcgdGhlIHdob2xlIGhpc3RvcnkuCisKKy0tLS0tLS0tLS0tLQorJCBnaXQgYnVuZGxlIGNyZWF0ZSBteWJ1bmRsZSBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCistIFVzaW5nIHRlbXBvcmFsbHkgdGFncy4KKysKK1dlIHNldCBhIHRhZyBpbiBSMSAobGFzdFIyYnVuZGxlKSBhZnRlciB0aGUgcHJldmlvdXMgc3VjaCB0cmFuc3BvcnQsCithbmQgbW92ZSBpdCBhZnRlcndhcmRzIHRvIGhlbHAgYnVpbGQgdGhlIGJ1bmRsZS4KKworLS0tLS0tLS0tLS0tCiskIGdpdC1idW5kbGUgY3JlYXRlIG15YnVuZGxlIG1hc3RlciBebGFzdFIyYnVuZGxlCiskIGdpdCB0YWcgLWYgbGFzdFIyYnVuZGxlIG1hc3RlcgorLS0tLS0tLS0tLS0tCisKKy0gVXNpbmcgYSB0YWcgcHJlc2VudCBpbiBib3RoIHJlcG9zaXRvcmllcworCistLS0tLS0tLS0tLS0KKyQgZ2l0IGJ1bmRsZSBjcmVhdGUgbXlidW5kbGUgbWFzdGVyIF52MS4wLjAKKy0tLS0tLS0tLS0tLQorCistIEEgYmFzaXMgYmFzZWQgb24gdGltZS4KKworLS0tLS0tLS0tLS0tCiskIGdpdCBidW5kbGUgY3JlYXRlIG15YnVuZGxlIG1hc3RlciAtLXNpbmNlPTEwLmRheXMuYWdvCistLS0tLS0tLS0tLS0KKworLSBXaXRoIGEgbGltaXQgb24gdGhlIG51bWJlciBvZiBjb21taXRzCisKKy0tLS0tLS0tLS0tLQorJCBnaXQgYnVuZGxlIGNyZWF0ZSBteWJ1bmRsZSBtYXN0ZXIgLW4gMTAKKy0tLS0tLS0tLS0tLQorCitUaGVuIHlvdSBtb3ZlIG15YnVuZGxlIGZyb20gQSB0byBCLCBhbmQgaW4gUjIgb24gQjoKKworLS0tLS0tLS0tLS0tCiskIGdpdC1idW5kbGUgdmVyaWZ5IG15YnVuZGxlCiskIGdpdC1mZXRjaCBteWJ1bmRsZSBtYXN0ZXI6bG9jYWxSZWYKKy0tLS0tLS0tLS0tLQorCitXaXRoIHNvbWV0aGluZyBsaWtlIHRoaXMgaW4gdGhlIGNvbmZpZyBpbiBSMjoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbcmVtb3RlICJidW5kbGUiXQorICAgIHVybCA9IC9ob21lL21lL3RtcC9maWxlLmJkbAorICAgIGZldGNoID0gcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1lvdSBjYW4gZmlyc3Qgc25lYWtlcm5ldCB0aGUgYnVuZGxlIGZpbGUgdG8gfi90bXAvZmlsZS5iZGwgYW5kCit0aGVuIHRoZXNlIGNvbW1hbmRzIG9uIG1hY2hpbmUgQjoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBscy1yZW1vdGUgYnVuZGxlCiskIGdpdCBmZXRjaCBidW5kbGUKKyQgZ2l0IHB1bGwgYnVuZGxlCistLS0tLS0tLS0tLS0KKword291bGQgdHJlYXQgaXQgYXMgaWYgaXQgaXMgdGFsa2luZyB3aXRoIGEgcmVtb3RlIHNpZGUgb3ZlciB0aGUKK25ldHdvcmsuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IE1hcmsgTGV2ZWRhaGwgPG1kbDEyM0B2ZXJpem9uLm5ldD4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jYXQtZmlsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jYXQtZmlsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0MmNiMQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWNhdC1maWxlLnR4dApAQCAtMCwwICsxLDczIEBACitnaXQtY2F0LWZpbGUoMSkKKz09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtY2F0LWZpbGUgLSBQcm92aWRlIGNvbnRlbnQgb3IgdHlwZS9zaXplIGluZm9ybWF0aW9uIGZvciByZXBvc2l0b3J5IG9iamVjdHMKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtY2F0LWZpbGUnIFstdCB8IC1zIHwgLWUgfCAtcCB8IDx0eXBlPl0gPG9iamVjdD4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitQcm92aWRlcyBjb250ZW50IG9yIHR5cGUgb2Ygb2JqZWN0cyBpbiB0aGUgcmVwb3NpdG9yeS4gVGhlIHR5cGUKK2lzIHJlcXVpcmVkIHVubGVzcyAnLXQnIG9yICctcCcgaXMgdXNlZCB0byBmaW5kIHRoZSBvYmplY3QgdHlwZSwKK29yICctcycgaXMgdXNlZCB0byBmaW5kIHRoZSBvYmplY3Qgc2l6ZS4KKworT1BUSU9OUworLS0tLS0tLQorPG9iamVjdD46OgorCVRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdG8gc2hvdy4KKwlGb3IgYSBtb3JlIGNvbXBsZXRlIGxpc3Qgb2Ygd2F5cyB0byBzcGVsbCBvYmplY3QgbmFtZXMsIHNlZQorCSJTUEVDSUZZSU5HIFJFVklTSU9OUyIgc2VjdGlvbiBpbiBsaW5rZ2l0OmdpdC1yZXYtcGFyc2VbMV0uCisKKy10OjoKKwlJbnN0ZWFkIG9mIHRoZSBjb250ZW50LCBzaG93IHRoZSBvYmplY3QgdHlwZSBpZGVudGlmaWVkIGJ5CisJPG9iamVjdD4uCisKKy1zOjoKKwlJbnN0ZWFkIG9mIHRoZSBjb250ZW50LCBzaG93IHRoZSBvYmplY3Qgc2l6ZSBpZGVudGlmaWVkIGJ5CisJPG9iamVjdD4uCisKKy1lOjoKKwlTdXBwcmVzcyBhbGwgb3V0cHV0OyBpbnN0ZWFkIGV4aXQgd2l0aCB6ZXJvIHN0YXR1cyBpZiA8b2JqZWN0PgorCWV4aXN0cyBhbmQgaXMgYSB2YWxpZCBvYmplY3QuCisKKy1wOjoKKwlQcmV0dHktcHJpbnQgdGhlIGNvbnRlbnRzIG9mIDxvYmplY3Q+IGJhc2VkIG9uIGl0cyB0eXBlLgorCis8dHlwZT46OgorCVR5cGljYWxseSB0aGlzIG1hdGNoZXMgdGhlIHJlYWwgdHlwZSBvZiA8b2JqZWN0PiBidXQgYXNraW5nCisJZm9yIGEgdHlwZSB0aGF0IGNhbiB0cml2aWFsbHkgYmUgZGVyZWZlcmVuY2VkIGZyb20gdGhlIGdpdmVuCisJPG9iamVjdD4gaXMgYWxzbyBwZXJtaXR0ZWQuICBBbiBleGFtcGxlIGlzIHRvIGFzayBmb3IgYQorCSJ0cmVlIiB3aXRoIDxvYmplY3Q+IGJlaW5nIGEgY29tbWl0IG9iamVjdCB0aGF0IGNvbnRhaW5zIGl0LAorCW9yIHRvIGFzayBmb3IgYSAiYmxvYiIgd2l0aCA8b2JqZWN0PiBiZWluZyBhIHRhZyBvYmplY3QgdGhhdAorCXBvaW50cyBhdCBpdC4KKworT1VUUFVUCistLS0tLS0KK0lmICctdCcgaXMgc3BlY2lmaWVkLCBvbmUgb2YgdGhlIDx0eXBlPi4KKworSWYgJy1zJyBpcyBzcGVjaWZpZWQsIHRoZSBzaXplIG9mIHRoZSA8b2JqZWN0PiBpbiBieXRlcy4KKworSWYgJy1lJyBpcyBzcGVjaWZpZWQsIG5vIG91dHB1dC4KKworSWYgJy1wJyBpcyBzcGVjaWZpZWQsIHRoZSBjb250ZW50cyBvZiA8b2JqZWN0PiBhcmUgcHJldHR5LXByaW50ZWQuCisKK090aGVyd2lzZSB0aGUgcmF3ICh0aG91Z2ggdW5jb21wcmVzc2VkKSBjb250ZW50cyBvZiB0aGUgPG9iamVjdD4gd2lsbAorYmUgcmV0dXJuZWQuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jaGVjay1hdHRyLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWNoZWNrLWF0dHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MGYxMGYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1jaGVjay1hdHRyLnR4dApAQCAtMCwwICsxLDQxIEBACitnaXQtY2hlY2stYXR0cigxKQorPT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWNoZWNrLWF0dHIgLSBEaXNwbGF5IGdpdGF0dHJpYnV0ZXMgaW5mb3JtYXRpb24uCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWNoZWNrLWF0dHInIGF0dHIuLi4gWy0tXSBwYXRobmFtZS4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0ZvciBldmVyeSBwYXRobmFtZSwgdGhpcyBjb21tYW5kIHdpbGwgbGlzdCBpZiBlYWNoIGF0dHIgaXMgJ3Vuc3BlY2lmaWVkJywKKydzZXQnLCBvciAndW5zZXQnIGFzIGEgZ2l0YXR0cmlidXRlIG9uIHRoYXQgcGF0aG5hbWUuCisKK09QVElPTlMKKy0tLS0tLS0KK1wtLTo6CisJSW50ZXJwcmV0IGFsbCBwcmVjZWRpbmcgYXJndW1lbnRzIGFzIGF0dHJpYnV0ZXMsIGFuZCBhbGwgZm9sbG93aW5nCisJYXJndW1lbnRzIGFzIHBhdGggbmFtZXMuIElmIG5vdCBzdXBwbGllZCwgb25seSB0aGUgZmlyc3QgYXJndW1lbnQgd2lsbAorCWJlIHRyZWF0ZWQgYXMgYW4gYXR0cmlidXRlLgorCisKK1NFRSBBTFNPCistLS0tLS0tLQorbGlua2dpdDpnaXRhdHRyaWJ1dGVzWzVdLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSmFtZXMgQm93ZXMuCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY2hlY2stcmVmLWZvcm1hdC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jaGVjay1yZWYtZm9ybWF0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjc2ODgwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY2hlY2stcmVmLWZvcm1hdC50eHQKQEAgLTAsMCArMSw1NSBAQAorZ2l0LWNoZWNrLXJlZi1mb3JtYXQoMSkKKz09PT09PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jaGVjay1yZWYtZm9ybWF0IC0gTWFrZSBzdXJlIHJlZiBuYW1lIGlzIHdlbGwgZm9ybWVkCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1jaGVjay1yZWYtZm9ybWF0JyA8cmVmbmFtZT4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitDaGVja3MgaWYgYSBnaXZlbiAncmVmbmFtZScgaXMgYWNjZXB0YWJsZSwgYW5kIGV4aXRzIG5vbi16ZXJvIGlmCitpdCBpcyBub3QuCisKK0EgcmVmZXJlbmNlIGlzIHVzZWQgaW4gZ2l0IHRvIHNwZWNpZnkgYnJhbmNoZXMgYW5kIHRhZ3MuICBBCiticmFuY2ggaGVhZCBpcyBzdG9yZWQgdW5kZXIgYCRHSVRfRElSL3JlZnMvaGVhZHNgIGRpcmVjdG9yeSwgYW5kCithIHRhZyBpcyBzdG9yZWQgdW5kZXIgYCRHSVRfRElSL3JlZnMvdGFnc2AgZGlyZWN0b3J5LiAgZ2l0CitpbXBvc2VzIHRoZSBmb2xsb3dpbmcgcnVsZXMgb24gaG93IHJlZnMgYXJlIG5hbWVkOgorCisuIEl0IGNhbiBpbmNsdWRlIHNsYXNoIGAvYCBmb3IgaGllcmFyY2hpY2FsIChkaXJlY3RvcnkpCisgIGdyb3VwaW5nLCBidXQgbm8gc2xhc2gtc2VwYXJhdGVkIGNvbXBvbmVudCBjYW4gYmVnaW4gd2l0aCBhCisgIGRvdCBgLmA7CisKKy4gSXQgY2Fubm90IGhhdmUgdHdvIGNvbnNlY3V0aXZlIGRvdHMgYC4uYCBhbnl3aGVyZTsKKworLiBJdCBjYW5ub3QgaGF2ZSBBU0NJSSBjb250cm9sIGNoYXJhY3RlciAoaS5lLiBieXRlcyB3aG9zZQorICB2YWx1ZXMgYXJlIGxvd2VyIHRoYW4gXDA0MCwgb3IgXDE3NyBgREVMYCksIHNwYWNlLCB0aWxkZSBgfmAsCisgIGNhcmV0IGB7Y2FyZXR9YCwgY29sb24gYDpgLCBxdWVzdGlvbi1tYXJrIGA/YCwgYXN0ZXJpc2sgYCpgLAorICBvciBvcGVuIGJyYWNrZXQgYFtgIGFueXdoZXJlOworCisuIEl0IGNhbm5vdCBlbmQgd2l0aCBhIHNsYXNoIGAvYC4KKworVGhlc2UgcnVsZXMgbWFrZXMgaXQgZWFzeSBmb3Igc2hlbGwgc2NyaXB0IGJhc2VkIHRvb2xzIHRvIHBhcnNlCityZWZuYW1lcywgcGF0aG5hbWUgZXhwYW5zaW9uIGJ5IHRoZSBzaGVsbCB3aGVuIGEgcmVmbmFtZSBpcyB1c2VkCit1bnF1b3RlZCAoYnkgbWlzdGFrZSksIGFuZCBhbHNvIGF2b2lkcyBhbWJpZ3VpdGllcyBpbiBjZXJ0YWluCityZWZuYW1lIGV4cHJlc3Npb25zIChzZWUgbGlua2dpdDpnaXQtcmV2LXBhcnNlWzFdKS4gIE5hbWVseToKKworLiBkb3VibGUtZG90IGAuLmAgYXJlIG9mdGVuIHVzZWQgYXMgaW4gYHJlZjEuLnJlZjJgLCBhbmQgaW4gc29tZQorICBjb250ZXh0IHRoaXMgbm90YXRpb24gbWVhbnMgYHtjYXJldH1yZWYxIHJlZjJgIChpLmUuIG5vdCBpbgorICByZWYxIGFuZCBpbiByZWYyKS4KKworLiB0aWxkZSBgfmAgYW5kIGNhcmV0IGB7Y2FyZXR9YCBhcmUgdXNlZCB0byBpbnRyb2R1Y2UgcG9zdGZpeAorICAnbnRoIHBhcmVudCcgYW5kICdwZWVsIG9uaW9uJyBvcGVyYXRpb24uCisKKy4gY29sb24gYDpgIGlzIHVzZWQgYXMgaW4gYHNyY3JlZjpkc3RyZWZgIHRvIG1lYW4gInVzZSBzcmNyZWZcJ3MKKyAgdmFsdWUgYW5kIHN0b3JlIGl0IGluIGRzdHJlZiIgaW4gZmV0Y2ggYW5kIHB1c2ggb3BlcmF0aW9ucy4KKyAgSXQgbWF5IGFsc28gYmUgdXNlZCB0byBzZWxlY3QgYSBzcGVjaWZpYyBvYmplY3Qgc3VjaCBhcyB3aXRoCisgIGxpbmtnaXQ6Z2l0LWNhdC1maWxlWzFdICJnaXQtY2F0LWZpbGUgYmxvYiB2MS4zLjM6cmVmcy5jIi4KKworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWNoZWNrb3V0LWluZGV4LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWNoZWNrb3V0LWluZGV4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmJiMGI1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY2hlY2tvdXQtaW5kZXgudHh0CkBAIC0wLDAgKzEsMTg0IEBACitnaXQtY2hlY2tvdXQtaW5kZXgoMSkKKz09PT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtY2hlY2tvdXQtaW5kZXggLSBDb3B5IGZpbGVzIGZyb20gdGhlIGluZGV4IHRvIHRoZSB3b3JraW5nIHRyZWUKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtY2hlY2tvdXQtaW5kZXgnIFstdV0gWy1xXSBbLWFdIFstZl0gWy1uXSBbLS1wcmVmaXg9PHN0cmluZz5dCisJCSAgIFstLXN0YWdlPTxudW1iZXI+fGFsbF0KKwkJICAgWy0tdGVtcF0KKwkJICAgWy16XSBbLS1zdGRpbl0KKwkJICAgWy0tXSBbPGZpbGU+XVwqCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorV2lsbCBjb3B5IGFsbCBmaWxlcyBsaXN0ZWQgZnJvbSB0aGUgaW5kZXggdG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5Cisobm90IG92ZXJ3cml0aW5nIGV4aXN0aW5nIGZpbGVzKS4KKworT1BUSU9OUworLS0tLS0tLQorLXV8LS1pbmRleDo6CisJdXBkYXRlIHN0YXQgaW5mb3JtYXRpb24gZm9yIHRoZSBjaGVja2VkIG91dCBlbnRyaWVzIGluCisJdGhlIGluZGV4IGZpbGUuCisKKy1xfC0tcXVpZXQ6OgorCWJlIHF1aWV0IGlmIGZpbGVzIGV4aXN0IG9yIGFyZSBub3QgaW4gdGhlIGluZGV4CisKKy1mfC0tZm9yY2U6OgorCWZvcmNlcyBvdmVyd3JpdGUgb2YgZXhpc3RpbmcgZmlsZXMKKworLWF8LS1hbGw6OgorCWNoZWNrcyBvdXQgYWxsIGZpbGVzIGluIHRoZSBpbmRleC4gIENhbm5vdCBiZSB1c2VkCisJdG9nZXRoZXIgd2l0aCBleHBsaWNpdCBmaWxlbmFtZXMuCisKKy1ufC0tbm8tY3JlYXRlOjoKKwlEb24ndCBjaGVja291dCBuZXcgZmlsZXMsIG9ubHkgcmVmcmVzaCBmaWxlcyBhbHJlYWR5IGNoZWNrZWQKKwlvdXQuCisKKy0tcHJlZml4PTxzdHJpbmc+OjoKKwlXaGVuIGNyZWF0aW5nIGZpbGVzLCBwcmVwZW5kIDxzdHJpbmc+ICh1c3VhbGx5IGEgZGlyZWN0b3J5CisJaW5jbHVkaW5nIGEgdHJhaWxpbmcgLykKKworLS1zdGFnZT08bnVtYmVyPnxhbGw6OgorCUluc3RlYWQgb2YgY2hlY2tpbmcgb3V0IHVubWVyZ2VkIGVudHJpZXMsIGNvcHkgb3V0IHRoZQorCWZpbGVzIGZyb20gbmFtZWQgc3RhZ2UuICA8bnVtYmVyPiBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMy4KKwlOb3RlOiAtLXN0YWdlPWFsbCBhdXRvbWF0aWNhbGx5IGltcGxpZXMgLS10ZW1wLgorCistLXRlbXA6OgorCUluc3RlYWQgb2YgY29weWluZyB0aGUgZmlsZXMgdG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5CisJd3JpdGUgdGhlIGNvbnRlbnQgdG8gdGVtcG9yYXJ5IGZpbGVzLiAgVGhlIHRlbXBvcmFyeSBuYW1lCisJYXNzb2NpYXRpb25zIHdpbGwgYmUgd3JpdHRlbiB0byBzdGRvdXQuCisKKy0tc3RkaW46OgorCUluc3RlYWQgb2YgdGFraW5nIGxpc3Qgb2YgcGF0aHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLAorCXJlYWQgbGlzdCBvZiBwYXRocyBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dC4gIFBhdGhzIGFyZQorCXNlcGFyYXRlZCBieSBMRiAoaS5lLiBvbmUgcGF0aCBwZXIgbGluZSkgYnkgZGVmYXVsdC4KKworLXo6OgorCU9ubHkgbWVhbmluZ2Z1bCB3aXRoIGAtLXN0ZGluYDsgcGF0aHMgYXJlIHNlcGFyYXRlZCB3aXRoCisJTlVMIGNoYXJhY3RlciBpbnN0ZWFkIG9mIExGLgorCitcLS06OgorCURvIG5vdCBpbnRlcnByZXQgYW55IG1vcmUgYXJndW1lbnRzIGFzIG9wdGlvbnMuCisKK1RoZSBvcmRlciBvZiB0aGUgZmxhZ3MgdXNlZCB0byBtYXR0ZXIsIGJ1dCBub3QgYW55bW9yZS4KKworSnVzdCBkb2luZyBgZ2l0LWNoZWNrb3V0LWluZGV4YCBkb2VzIG5vdGhpbmcuIFlvdSBwcm9iYWJseSBtZWFudAorYGdpdC1jaGVja291dC1pbmRleCAtYWAuIEFuZCBpZiB5b3Ugd2FudCB0byBmb3JjZSBpdCwgeW91IHdhbnQKK2BnaXQtY2hlY2tvdXQtaW5kZXggLWYgLWFgLgorCitJbnR1aXRpdmVuZXNzIGlzIG5vdCB0aGUgZ29hbCBoZXJlLiBSZXBlYXRhYmlsaXR5IGlzLiBUaGUgcmVhc29uIGZvcgordGhlICJubyBhcmd1bWVudHMgbWVhbnMgbm8gd29yayIgYmVoYXZpb3IgaXMgdGhhdCBmcm9tIHNjcmlwdHMgeW91IGFyZQorc3VwcG9zZWQgdG8gYmUgYWJsZSB0byBkbzoKKworLS0tLS0tLS0tLS0tLS0tLQorJCBmaW5kIC4gLW5hbWUgJyouaCcgLXByaW50MCB8IHhhcmdzIC0wIGdpdC1jaGVja291dC1pbmRleCAtZiAtLQorLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCB3aWxsIGZvcmNlIGFsbCBleGlzdGluZyBgKi5oYCBmaWxlcyB0byBiZSByZXBsYWNlZCB3aXRoIHRoZWlyCitjYWNoZWQgY29waWVzLiBJZiBhbiBlbXB0eSBjb21tYW5kIGxpbmUgaW1wbGllZCAiYWxsIiwgdGhlbiB0aGlzIHdvdWxkCitmb3JjZS1yZWZyZXNoIGV2ZXJ5dGhpbmcgaW4gdGhlIGluZGV4LCB3aGljaCB3YXMgbm90IHRoZSBwb2ludC4gIEJ1dAorc2luY2UgZ2l0LWNoZWNrb3V0LWluZGV4IGFjY2VwdHMgLS1zdGRpbiBpdCB3b3VsZCBiZSBmYXN0ZXIgdG8gdXNlOgorCistLS0tLS0tLS0tLS0tLS0tCiskIGZpbmQgLiAtbmFtZSAnKi5oJyAtcHJpbnQwIHwgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC16IC0tc3RkaW4KKy0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGAtLWAgaXMganVzdCBhIGdvb2QgaWRlYSB3aGVuIHlvdSBrbm93IHRoZSByZXN0IHdpbGwgYmUgZmlsZW5hbWVzOworaXQgd2lsbCBwcmV2ZW50IHByb2JsZW1zIHdpdGggYSBmaWxlbmFtZSBvZiwgZm9yIGV4YW1wbGUsICBgLWFgLgorVXNpbmcgYC0tYCBpcyBwcm9iYWJseSBhIGdvb2QgcG9saWN5IGluIHNjcmlwdHMuCisKKworVXNpbmcgLS10ZW1wIG9yIC0tc3RhZ2U9YWxsCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1doZW4gYC0tdGVtcGAgaXMgdXNlZCAob3IgaW1wbGllZCBieSBgLS1zdGFnZT1hbGxgKQorYGdpdC1jaGVja291dC1pbmRleGAgd2lsbCBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSBmb3IgZWFjaCBpbmRleAorZW50cnkgYmVpbmcgY2hlY2tlZCBvdXQuICBUaGUgaW5kZXggd2lsbCBub3QgYmUgdXBkYXRlZCB3aXRoIHN0YXQKK2luZm9ybWF0aW9uLiAgVGhlc2Ugb3B0aW9ucyBjYW4gYmUgdXNlZnVsIGlmIHRoZSBjYWxsZXIgbmVlZHMgYWxsCitzdGFnZXMgb2YgYWxsIHVubWVyZ2VkIGVudHJpZXMgc28gdGhhdCB0aGUgdW5tZXJnZWQgZmlsZXMgY2FuIGJlCitwcm9jZXNzZWQgYnkgYW4gZXh0ZXJuYWwgbWVyZ2UgdG9vbC4KKworQSBsaXN0aW5nIHdpbGwgYmUgd3JpdHRlbiB0byBzdGRvdXQgcHJvdmlkaW5nIHRoZSBhc3NvY2lhdGlvbiBvZgordGVtcG9yYXJ5IGZpbGUgbmFtZXMgdG8gdHJhY2tlZCBwYXRoIG5hbWVzLiAgVGhlIGxpc3RpbmcgZm9ybWF0CitoYXMgdHdvIHZhcmlhdGlvbnM6CisKKyAgICAuIHRlbXBuYW1lIFRBQiBwYXRoIFJTCisrCitUaGUgZmlyc3QgZm9ybWF0IGlzIHdoYXQgZ2V0cyB1c2VkIHdoZW4gYC0tc3RhZ2VgIGlzIG9taXR0ZWQgb3IKK2lzIG5vdCBgLS1zdGFnZT1hbGxgLiBUaGUgZmllbGQgdGVtcG5hbWUgaXMgdGhlIHRlbXBvcmFyeSBmaWxlCituYW1lIGhvbGRpbmcgdGhlIGZpbGUgY29udGVudCBhbmQgcGF0aCBpcyB0aGUgdHJhY2tlZCBwYXRoIG5hbWUgaW4KK3RoZSBpbmRleC4gIE9ubHkgdGhlIHJlcXVlc3RlZCBlbnRyaWVzIGFyZSBvdXRwdXQuCisKKyAgICAuIHN0YWdlMXRlbXAgU1Agc3RhZ2UydGVtcCBTUCBzdGFnZTN0bXAgVEFCIHBhdGggUlMKKysKK1RoZSBzZWNvbmQgZm9ybWF0IGlzIHdoYXQgZ2V0cyB1c2VkIHdoZW4gYC0tc3RhZ2U9YWxsYC4gIFRoZSB0aHJlZQorc3RhZ2UgdGVtcG9yYXJ5IGZpZWxkcyAoc3RhZ2UxdGVtcCwgc3RhZ2UydGVtcCwgc3RhZ2UzdGVtcCkgbGlzdCB0aGUKK25hbWUgb2YgdGhlIHRlbXBvcmFyeSBmaWxlIGlmIHRoZXJlIGlzIGEgc3RhZ2UgZW50cnkgaW4gdGhlIGluZGV4CitvciBgLmAgaWYgdGhlcmUgaXMgbm8gc3RhZ2UgZW50cnkuICBQYXRocyB3aGljaCBvbmx5IGhhdmUgYSBzdGFnZSAwCitlbnRyeSB3aWxsIGFsd2F5cyBiZSBvbWl0dGVkIGZyb20gdGhlIG91dHB1dC4KKworSW4gYm90aCBmb3JtYXRzIFJTICh0aGUgcmVjb3JkIHNlcGFyYXRvcikgaXMgbmV3bGluZSBieSBkZWZhdWx0CitidXQgd2lsbCBiZSB0aGUgbnVsbCBieXRlIGlmIC16IHdhcyBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KK1RoZSB0ZW1wb3JhcnkgZmlsZSBuYW1lcyBhcmUgYWx3YXlzIHNhZmUgc3RyaW5nczsgdGhleSB3aWxsIG5ldmVyCitjb250YWluIGRpcmVjdG9yeSBzZXBhcmF0b3JzIG9yIHdoaXRlc3BhY2UgY2hhcmFjdGVycy4gIFRoZSBwYXRoCitmaWVsZCBpcyBhbHdheXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCB0aGUgdGVtcG9yYXJ5CitmaWxlIG5hbWVzIGFyZSBhbHdheXMgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkuCisKK0lmIHRoZSBvYmplY3QgYmVpbmcgY29waWVkIG91dCB0byBhIHRlbXBvcmFyeSBmaWxlIGlzIGEgc3ltYm9saWMKK2xpbmsgdGhlIGNvbnRlbnQgb2YgdGhlIGxpbmsgd2lsbCBiZSB3cml0dGVuIHRvIGEgbm9ybWFsIGZpbGUuICBJdCBpcwordXAgdG8gdGhlIGVuZC11c2VyIG9yIHRoZSBQb3JjZWxhaW4gdG8gbWFrZSB1c2Ugb2YgdGhpcyBpbmZvcm1hdGlvbi4KKworCitFWEFNUExFUworLS0tLS0tLS0KK1RvIHVwZGF0ZSBhbmQgcmVmcmVzaCBvbmx5IHRoZSBmaWxlcyBhbHJlYWR5IGNoZWNrZWQgb3V0OjoKKysKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWNoZWNrb3V0LWluZGV4IC1uIC1mIC1hICYmIGdpdC11cGRhdGUtaW5kZXggLS1pZ25vcmUtbWlzc2luZyAtLXJlZnJlc2gKKy0tLS0tLS0tLS0tLS0tLS0KKworVXNpbmcgYGdpdC1jaGVja291dC1pbmRleGAgdG8gImV4cG9ydCBhbiBlbnRpcmUgdHJlZSI6OgorCVRoZSBwcmVmaXggYWJpbGl0eSBiYXNpY2FsbHkgbWFrZXMgaXQgdHJpdmlhbCB0byB1c2UKKwlgZ2l0LWNoZWNrb3V0LWluZGV4YCBhcyBhbiAiZXhwb3J0IGFzIHRyZWUiIGZ1bmN0aW9uLgorCUp1c3QgcmVhZCB0aGUgZGVzaXJlZCB0cmVlIGludG8gdGhlIGluZGV4LCBhbmQgZG86CisrCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1jaGVja291dC1pbmRleCAtLXByZWZpeD1naXQtZXhwb3J0LWRpci8gLWEKKy0tLS0tLS0tLS0tLS0tLS0KKysKK2BnaXQtY2hlY2tvdXQtaW5kZXhgIHdpbGwgImV4cG9ydCIgdGhlIGluZGV4IGludG8gdGhlIHNwZWNpZmllZAorZGlyZWN0b3J5LgorKworVGhlIGZpbmFsICIvIiBpcyBpbXBvcnRhbnQuIFRoZSBleHBvcnRlZCBuYW1lIGlzIGxpdGVyYWxseSBqdXN0CitwcmVmaXhlZCB3aXRoIHRoZSBzcGVjaWZpZWQgc3RyaW5nLiAgQ29udHJhc3QgdGhpcyB3aXRoIHRoZQorZm9sbG93aW5nIGV4YW1wbGUuCisKK0V4cG9ydCBmaWxlcyB3aXRoIGEgcHJlZml4OjoKKysKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWNoZWNrb3V0LWluZGV4IC0tcHJlZml4PS5tZXJnZWQtIE1ha2VmaWxlCistLS0tLS0tLS0tLS0tLS0tCisrCitUaGlzIHdpbGwgY2hlY2sgb3V0IHRoZSBjdXJyZW50bHkgY2FjaGVkIGNvcHkgb2YgYE1ha2VmaWxlYAoraW50byB0aGUgZmlsZSBgLm1lcmdlZC1NYWtlZmlsZWAuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsCitKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWNoZWNrb3V0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWNoZWNrb3V0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTFjZGRiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY2hlY2tvdXQudHh0CkBAIC0wLDAgKzEsMjE4IEBACitnaXQtY2hlY2tvdXQoMSkKKz09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtY2hlY2tvdXQgLSBDaGVja291dCBhIGJyYW5jaCBvciBwYXRocyB0byB0aGUgd29ya2luZyB0cmVlCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1jaGVja291dCcgWy1xXSBbLWZdIFtbLS10cmFjayB8IC0tbm8tdHJhY2tdIC1iIDxuZXdfYnJhbmNoPiBbLWxdXSBbLW1dIFs8YnJhbmNoPl0KKydnaXQtY2hlY2tvdXQnIFs8dHJlZS1pc2g+XSA8cGF0aHM+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitXaGVuIDxwYXRocz4gYXJlIG5vdCBnaXZlbiwgdGhpcyBjb21tYW5kIHN3aXRjaGVzIGJyYW5jaGVzIGJ5Cit1cGRhdGluZyB0aGUgaW5kZXggYW5kIHdvcmtpbmcgdHJlZSB0byByZWZsZWN0IHRoZSBzcGVjaWZpZWQKK2JyYW5jaCwgPGJyYW5jaD4sIGFuZCB1cGRhdGluZyBIRUFEIHRvIGJlIDxicmFuY2g+IG9yLCBpZgorc3BlY2lmaWVkLCA8bmV3X2JyYW5jaD4uICBVc2luZyAtYiB3aWxsIGNhdXNlIDxuZXdfYnJhbmNoPiB0bworYmUgY3JlYXRlZDsgaW4gdGhpcyBjYXNlIHlvdSBjYW4gdXNlIHRoZSAtLXRyYWNrIG9yIC0tbm8tdHJhY2sKK29wdGlvbnMsIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGBnaXQgYnJhbmNoYC4KKworV2hlbiA8cGF0aHM+IGFyZSBnaXZlbiwgdGhpcyBjb21tYW5kIGRvZXMgKm5vdCogc3dpdGNoCiticmFuY2hlcy4gIEl0IHVwZGF0ZXMgdGhlIG5hbWVkIHBhdGhzIGluIHRoZSB3b3JraW5nIHRyZWUgZnJvbQordGhlIGluZGV4IGZpbGUgKGkuZS4gaXQgcnVucyBgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC11YCksIG9yCitmcm9tIGEgbmFtZWQgY29tbWl0LiAgSW4KK3RoaXMgY2FzZSwgdGhlIGAtZmAgYW5kIGAtYmAgb3B0aW9ucyBhcmUgbWVhbmluZ2xlc3MgYW5kIGdpdmluZworZWl0aGVyIG9mIHRoZW0gcmVzdWx0cyBpbiBhbiBlcnJvci4gIDx0cmVlLWlzaD4gYXJndW1lbnQgY2FuIGJlCit1c2VkIHRvIHNwZWNpZnkgYSBzcGVjaWZpYyB0cmVlLWlzaCAoaS5lLiBjb21taXQsIHRhZyBvciB0cmVlKQordG8gdXBkYXRlIHRoZSBpbmRleCBmb3IgdGhlIGdpdmVuIHBhdGhzIGJlZm9yZSB1cGRhdGluZyB0aGUKK3dvcmtpbmcgdHJlZS4KKworCitPUFRJT05TCistLS0tLS0tCistcTo6CisJUXVpZXQsIHN1cHByZXNzIGZlZWRiYWNrIG1lc3NhZ2VzLgorCistZjo6CisJUHJvY2VlZCBldmVuIGlmIHRoZSBpbmRleCBvciB0aGUgd29ya2luZyB0cmVlIGRpZmZlcnMKKwlmcm9tIEhFQUQuICBUaGlzIGlzIHVzZWQgdG8gdGhyb3cgYXdheSBsb2NhbCBjaGFuZ2VzLgorCistYjo6CisJQ3JlYXRlIGEgbmV3IGJyYW5jaCBuYW1lZCA8bmV3X2JyYW5jaD4gYW5kIHN0YXJ0IGl0IGF0CisJPGJyYW5jaD4uICBUaGUgbmV3IGJyYW5jaCBuYW1lIG11c3QgcGFzcyBhbGwgY2hlY2tzIGRlZmluZWQKKwlieSBsaW5rZ2l0OmdpdC1jaGVjay1yZWYtZm9ybWF0WzFdLiAgU29tZSBvZiB0aGVzZSBjaGVja3MKKwltYXkgcmVzdHJpY3QgdGhlIGNoYXJhY3RlcnMgYWxsb3dlZCBpbiBhIGJyYW5jaCBuYW1lLgorCistLXRyYWNrOjoKKwlXaGVuIGNyZWF0aW5nIGEgbmV3IGJyYW5jaCwgc2V0IHVwIGNvbmZpZ3VyYXRpb24gc28gdGhhdCBnaXQtcHVsbAorCXdpbGwgYXV0b21hdGljYWxseSByZXRyaWV2ZSBkYXRhIGZyb20gdGhlIHN0YXJ0IHBvaW50LCB3aGljaCBtdXN0IGJlCisJYSBicmFuY2guIFVzZSB0aGlzIGlmIHlvdSBhbHdheXMgcHVsbCBmcm9tIHRoZSBzYW1lIHVwc3RyZWFtIGJyYW5jaAorCWludG8gdGhlIG5ldyBicmFuY2gsIGFuZCBpZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgImdpdCBwdWxsCisJPHJlcG9zaXRvcnk+IDxyZWZzcGVjPiIgZXhwbGljaXRseS4gVGhpcyBiZWhhdmlvciBpcyB0aGUgZGVmYXVsdAorCXdoZW4gdGhlIHN0YXJ0IHBvaW50IGlzIGEgcmVtb3RlIGJyYW5jaC4gU2V0IHRoZQorCWJyYW5jaC5hdXRvc2V0dXBtZXJnZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIHRvIGBmYWxzZWAgaWYgeW91IHdhbnQKKwlnaXQtY2hlY2tvdXQgYW5kIGdpdC1icmFuY2ggdG8gYWx3YXlzIGJlaGF2ZSBhcyBpZiAnLS1uby10cmFjaycgd2VyZQorCWdpdmVuLiBTZXQgaXQgdG8gYGFsd2F5c2AgaWYgeW91IHdhbnQgdGhpcyBiZWhhdmlvciB3aGVuIHRoZQorCXN0YXJ0LXBvaW50IGlzIGVpdGhlciBhIGxvY2FsIG9yIHJlbW90ZSBicmFuY2guCisKKy0tbm8tdHJhY2s6OgorCUlnbm9yZSB0aGUgYnJhbmNoLmF1dG9zZXR1cG1lcmdlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUuCisKKy1sOjoKKwlDcmVhdGUgdGhlIG5ldyBicmFuY2gncyByZWZsb2cuICBUaGlzIGFjdGl2YXRlcyByZWNvcmRpbmcgb2YKKwlhbGwgY2hhbmdlcyBtYWRlIHRvIHRoZSBicmFuY2ggcmVmLCBlbmFibGluZyB1c2Ugb2YgZGF0ZQorCWJhc2VkIHNoYTEgZXhwcmVzc2lvbnMgc3VjaCBhcyAiPGJyYW5jaG5hbWU+QFx7eWVzdGVyZGF5fSIuCisKKy1tOjoKKwlJZiB5b3UgaGF2ZSBsb2NhbCBtb2RpZmljYXRpb25zIHRvIG9uZSBvciBtb3JlIGZpbGVzIHRoYXQKKwlhcmUgZGlmZmVyZW50IGJldHdlZW4gdGhlIGN1cnJlbnQgYnJhbmNoIGFuZCB0aGUgYnJhbmNoIHRvCisJd2hpY2ggeW91IGFyZSBzd2l0Y2hpbmcsIHRoZSBjb21tYW5kIHJlZnVzZXMgdG8gc3dpdGNoCisJYnJhbmNoZXMgaW4gb3JkZXIgdG8gcHJlc2VydmUgeW91ciBtb2RpZmljYXRpb25zIGluIGNvbnRleHQuCisJSG93ZXZlciwgd2l0aCB0aGlzIG9wdGlvbiwgYSB0aHJlZS13YXkgbWVyZ2UgYmV0d2VlbiB0aGUgY3VycmVudAorCWJyYW5jaCwgeW91ciB3b3JraW5nIHRyZWUgY29udGVudHMsIGFuZCB0aGUgbmV3IGJyYW5jaAorCWlzIGRvbmUsIGFuZCB5b3Ugd2lsbCBiZSBvbiB0aGUgbmV3IGJyYW5jaC4KKysKK1doZW4gYSBtZXJnZSBjb25mbGljdCBoYXBwZW5zLCB0aGUgaW5kZXggZW50cmllcyBmb3IgY29uZmxpY3RpbmcKK3BhdGhzIGFyZSBsZWZ0IHVubWVyZ2VkLCBhbmQgeW91IG5lZWQgdG8gcmVzb2x2ZSB0aGUgY29uZmxpY3RzCithbmQgbWFyayB0aGUgcmVzb2x2ZWQgcGF0aHMgd2l0aCBgZ2l0IGFkZGAgKG9yIGBnaXQgcm1gIGlmIHRoZSBtZXJnZQorc2hvdWxkIHJlc3VsdCBpbiBkZWxldGlvbiBvZiB0aGUgcGF0aCkuCisKKzxuZXdfYnJhbmNoPjo6CisJTmFtZSBmb3IgdGhlIG5ldyBicmFuY2guCisKKzxicmFuY2g+OjoKKwlCcmFuY2ggdG8gY2hlY2tvdXQ7IG1heSBiZSBhbnkgb2JqZWN0IElEIHRoYXQgcmVzb2x2ZXMgdG8gYQorCWNvbW1pdC4gIERlZmF1bHRzIHRvIEhFQUQuCisrCitXaGVuIHRoaXMgcGFyYW1ldGVyIG5hbWVzIGEgbm9uLWJyYW5jaCAoYnV0IHN0aWxsIGEgdmFsaWQgY29tbWl0IG9iamVjdCksCit5b3VyIEhFQUQgYmVjb21lcyAnZGV0YWNoZWQnLgorCisKK0RldGFjaGVkIEhFQUQKKy0tLS0tLS0tLS0tLS0KKworSXQgaXMgc29tZXRpbWVzIHVzZWZ1bCB0byBiZSBhYmxlIHRvICdjaGVja291dCcgYSBjb21taXQgdGhhdCBpcworbm90IGF0IHRoZSB0aXAgb2Ygb25lIG9mIHlvdXIgYnJhbmNoZXMuICBUaGUgbW9zdCBvYnZpb3VzCitleGFtcGxlIGlzIHRvIGNoZWNrIG91dCB0aGUgY29tbWl0IGF0IGEgdGFnZ2VkIG9mZmljaWFsIHJlbGVhc2UKK3BvaW50LCBsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgdjIuNi4xOAorLS0tLS0tLS0tLS0tCisKK0VhcmxpZXIgdmVyc2lvbnMgb2YgZ2l0IGRpZCBub3QgYWxsb3cgdGhpcyBhbmQgYXNrZWQgeW91IHRvCitjcmVhdGUgYSB0ZW1wb3JhcnkgYnJhbmNoIHVzaW5nIGAtYmAgb3B0aW9uLCBidXQgc3RhcnRpbmcgZnJvbQordmVyc2lvbiAxLjUuMCwgdGhlIGFib3ZlIGNvbW1hbmQgJ2RldGFjaGVzJyB5b3VyIEhFQUQgZnJvbSB0aGUKK2N1cnJlbnQgYnJhbmNoIGFuZCBkaXJlY3RseSBwb2ludCBhdCB0aGUgY29tbWl0IG5hbWVkIGJ5IHRoZSB0YWcKKyhgdjIuNi4xOGAgaW4gdGhlIGFib3ZlIGV4YW1wbGUpLgorCitZb3UgY2FuIHVzZSB1c3VhbCBnaXQgY29tbWFuZHMgd2hpbGUgaW4gdGhpcyBzdGF0ZS4gIFlvdSBjYW4gdXNlCitgZ2l0LXJlc2V0IC0taGFyZCAkb3RoZXJjb21taXRgIHRvIGZ1cnRoZXIgbW92ZSBhcm91bmQsIGZvcgorZXhhbXBsZS4gIFlvdSBjYW4gbWFrZSBjaGFuZ2VzIGFuZCBjcmVhdGUgYSBuZXcgY29tbWl0IG9uIHRvcCBvZgorYSBkZXRhY2hlZCBIRUFELiAgWW91IGNhbiBldmVuIGNyZWF0ZSBhIG1lcmdlIGJ5IHVzaW5nIGBnaXQKK21lcmdlICRvdGhlcmNvbW1pdGAuCisKK1RoZSBzdGF0ZSB5b3UgYXJlIGluIHdoaWxlIHlvdXIgSEVBRCBpcyBkZXRhY2hlZCBpcyBub3QgcmVjb3JkZWQKK2J5IGFueSBicmFuY2ggKHdoaWNoIGlzIG5hdHVyYWwgLS0tIHlvdSBhcmUgbm90IG9uIGFueSBicmFuY2gpLgorV2hhdCB0aGlzIG1lYW5zIGlzIHRoYXQgeW91IGNhbiBkaXNjYXJkIHlvdXIgdGVtcG9yYXJ5IGNvbW1pdHMKK2FuZCBtZXJnZXMgYnkgc3dpdGNoaW5nIGJhY2sgdG8gYW4gZXhpc3RpbmcgYnJhbmNoIChlLmcuIGBnaXQKK2NoZWNrb3V0IG1hc3RlcmApLCBhbmQgYSBsYXRlciBgZ2l0IHBydW5lYCBvciBgZ2l0IGdjYCB3b3VsZAorZ2FyYmFnZS1jb2xsZWN0IHRoZW0uICBJZiB5b3UgZGlkIHRoaXMgYnkgbWlzdGFrZSwgeW91IGNhbiBhc2sKK3RoZSByZWZsb2cgZm9yIEhFQUQgd2hlcmUgeW91IHdlcmUsIGUuZy4KKworLS0tLS0tLS0tLS0tCiskIGdpdCBsb2cgLWcgLTIgSEVBRAorLS0tLS0tLS0tLS0tCisKKworRVhBTVBMRVMKKy0tLS0tLS0tCisKKy4gVGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBjaGVja3Mgb3V0IHRoZSBgbWFzdGVyYCBicmFuY2gsIHJldmVydHMKK3RoZSBgTWFrZWZpbGVgIHRvIHR3byByZXZpc2lvbnMgYmFjaywgZGVsZXRlcyBoZWxsby5jIGJ5CittaXN0YWtlLCBhbmQgZ2V0cyBpdCBiYWNrIGZyb20gdGhlIGluZGV4LgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCBtYXN0ZXIgICAgICAgICAgICAgPDE+CiskIGdpdCBjaGVja291dCBtYXN0ZXJ+MiBNYWtlZmlsZSAgPDI+CiskIHJtIC1mIGhlbGxvLmMKKyQgZ2l0IGNoZWNrb3V0IGhlbGxvLmMgICAgICAgICAgICA8Mz4KKy0tLS0tLS0tLS0tLQorKworPDE+IHN3aXRjaCBicmFuY2gKKzwyPiB0YWtlIG91dCBhIGZpbGUgb3V0IG9mIG90aGVyIGNvbW1pdAorPDM+IHJlc3RvcmUgaGVsbG8uYyBmcm9tIEhFQUQgb2YgY3VycmVudCBicmFuY2gKKysKK0lmIHlvdSBoYXZlIGFuIHVuZm9ydHVuYXRlIGJyYW5jaCB0aGF0IGlzIG5hbWVkIGBoZWxsby5jYCwgdGhpcworc3RlcCB3b3VsZCBiZSBjb25mdXNlZCBhcyBhbiBpbnN0cnVjdGlvbiB0byBzd2l0Y2ggdG8gdGhhdCBicmFuY2guCitZb3Ugc2hvdWxkIGluc3RlYWQgd3JpdGU6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC0tIGhlbGxvLmMKKy0tLS0tLS0tLS0tLQorCisuIEFmdGVyIHdvcmtpbmcgaW4gYSB3cm9uZyBicmFuY2gsIHN3aXRjaGluZyB0byB0aGUgY29ycmVjdAorYnJhbmNoIHdvdWxkIGJlIGRvbmUgdXNpbmc6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IG15dG9waWMKKy0tLS0tLS0tLS0tLQorKworSG93ZXZlciwgeW91ciAid3JvbmciIGJyYW5jaCBhbmQgY29ycmVjdCAibXl0b3BpYyIgYnJhbmNoIG1heQorZGlmZmVyIGluIGZpbGVzIHRoYXQgeW91IGhhdmUgbG9jYWxseSBtb2RpZmllZCwgaW4gd2hpY2ggY2FzZSwKK3RoZSBhYm92ZSBjaGVja291dCB3b3VsZCBmYWlsIGxpa2UgdGhpczoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgbXl0b3BpYworZmF0YWw6IEVudHJ5ICdmcm90eicgbm90IHVwdG9kYXRlLiBDYW5ub3QgbWVyZ2UuCistLS0tLS0tLS0tLS0KKysKK1lvdSBjYW4gZ2l2ZSB0aGUgYC1tYCBmbGFnIHRvIHRoZSBjb21tYW5kLCB3aGljaCB3b3VsZCB0cnkgYQordGhyZWUtd2F5IG1lcmdlOgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCAtbSBteXRvcGljCitBdXRvLW1lcmdpbmcgZnJvdHoKKy0tLS0tLS0tLS0tLQorKworQWZ0ZXIgdGhpcyB0aHJlZS13YXkgbWVyZ2UsIHRoZSBsb2NhbCBtb2RpZmljYXRpb25zIGFyZSBfbm90XworcmVnaXN0ZXJlZCBpbiB5b3VyIGluZGV4IGZpbGUsIHNvIGBnaXQgZGlmZmAgd291bGQgc2hvdyB5b3Ugd2hhdAorY2hhbmdlcyB5b3UgbWFkZSBzaW5jZSB0aGUgdGlwIG9mIHRoZSBuZXcgYnJhbmNoLgorCisuIFdoZW4gYSBtZXJnZSBjb25mbGljdCBoYXBwZW5zIGR1cmluZyBzd2l0Y2hpbmcgYnJhbmNoZXMgd2l0aAordGhlIGAtbWAgb3B0aW9uLCB5b3Ugd291bGQgc2VlIHNvbWV0aGluZyBsaWtlIHRoaXM6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC1tIG15dG9waWMKK0F1dG8tbWVyZ2luZyBmcm90egorbWVyZ2U6IHdhcm5pbmc6IGNvbmZsaWN0cyBkdXJpbmcgbWVyZ2UKK0VSUk9SOiBNZXJnZSBjb25mbGljdCBpbiBmcm90egorZmF0YWw6IG1lcmdlIHByb2dyYW0gZmFpbGVkCistLS0tLS0tLS0tLS0KKysKK0F0IHRoaXMgcG9pbnQsIGBnaXQgZGlmZmAgc2hvd3MgdGhlIGNoYW5nZXMgY2xlYW5seSBtZXJnZWQgYXMgaW4KK3RoZSBwcmV2aW91cyBleGFtcGxlLCBhcyB3ZWxsIGFzIHRoZSBjaGFuZ2VzIGluIHRoZSBjb25mbGljdGVkCitmaWxlcy4gIEVkaXQgYW5kIHJlc29sdmUgdGhlIGNvbmZsaWN0IGFuZCBtYXJrIGl0IHJlc29sdmVkIHdpdGgKK2BnaXQgYWRkYCBhcyB1c3VhbDoKKysKKy0tLS0tLS0tLS0tLQorJCBlZGl0IGZyb3R6CiskIGdpdCBhZGQgZnJvdHoKKy0tLS0tLS0tLS0tLQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY2hlcnJ5LXBpY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtY2hlcnJ5LXBpY2sudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYmViNDEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1jaGVycnktcGljay50eHQKQEAgLTAsMCArMSw3OCBAQAorZ2l0LWNoZXJyeS1waWNrKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWNoZXJyeS1waWNrIC0gQXBwbHkgdGhlIGNoYW5nZSBpbnRyb2R1Y2VkIGJ5IGFuIGV4aXN0aW5nIGNvbW1pdAorCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtY2hlcnJ5LXBpY2snIFstLWVkaXRdIFstbl0gWy1tIHBhcmVudC1udW1iZXJdIFsteF0gPGNvbW1pdD4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitHaXZlbiBvbmUgZXhpc3RpbmcgY29tbWl0LCBhcHBseSB0aGUgY2hhbmdlIHRoZSBwYXRjaCBpbnRyb2R1Y2VzLCBhbmQgcmVjb3JkIGEKK25ldyBjb21taXQgdGhhdCByZWNvcmRzIGl0LiAgVGhpcyByZXF1aXJlcyB5b3VyIHdvcmtpbmcgdHJlZSB0byBiZSBjbGVhbiAobm8KK21vZGlmaWNhdGlvbnMgZnJvbSB0aGUgSEVBRCBjb21taXQpLgorCitPUFRJT05TCistLS0tLS0tCis8Y29tbWl0Pjo6CisJQ29tbWl0IHRvIGNoZXJyeS1waWNrLgorCUZvciBhIG1vcmUgY29tcGxldGUgbGlzdCBvZiB3YXlzIHRvIHNwZWxsIGNvbW1pdHMsIHNlZQorCSJTUEVDSUZZSU5HIFJFVklTSU9OUyIgc2VjdGlvbiBpbiBsaW5rZ2l0OmdpdC1yZXYtcGFyc2VbMV0uCisKKy1lfC0tZWRpdDo6CisJV2l0aCB0aGlzIG9wdGlvbiwgYGdpdC1jaGVycnktcGlja2Agd2lsbCBsZXQgeW91IGVkaXQgdGhlIGNvbW1pdAorCW1lc3NhZ2UgcHJpb3IgdG8gY29tbWl0dGluZy4KKworLXg6OgorCVdoZW4gcmVjb3JkaW5nIHRoZSBjb21taXQsIGFwcGVuZCB0byB0aGUgb3JpZ2luYWwgY29tbWl0CisJbWVzc2FnZSBhIG5vdGUgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggY29tbWl0IHRoaXMgY2hhbmdlCisJd2FzIGNoZXJyeS1waWNrZWQgZnJvbS4gIEFwcGVuZCB0aGUgbm90ZSBvbmx5IGZvciBjaGVycnkKKwlwaWNrcyB3aXRob3V0IGNvbmZsaWN0cy4gIERvIG5vdCB1c2UgdGhpcyBvcHRpb24gaWYKKwl5b3UgYXJlIGNoZXJyeS1waWNraW5nIGZyb20geW91ciBwcml2YXRlIGJyYW5jaCBiZWNhdXNlCisJdGhlIGluZm9ybWF0aW9uIGlzIHVzZWxlc3MgdG8gdGhlIHJlY2lwaWVudC4gIElmIG9uIHRoZQorCW90aGVyIGhhbmQgeW91IGFyZSBjaGVycnktcGlja2luZyBiZXR3ZWVuIHR3byBwdWJsaWNseQorCXZpc2libGUgYnJhbmNoZXMgKGUuZy4gYmFja3BvcnRpbmcgYSBmaXggdG8gYQorCW1haW50ZW5hbmNlIGJyYW5jaCBmb3IgYW4gb2xkZXIgcmVsZWFzZSBmcm9tIGEKKwlkZXZlbG9wbWVudCBicmFuY2gpLCBhZGRpbmcgdGhpcyBpbmZvcm1hdGlvbiBjYW4gYmUKKwl1c2VmdWwuCisKKy1yOjoKKwlJdCB1c2VkIHRvIGJlIHRoYXQgdGhlIGNvbW1hbmQgZGVmYXVsdGVkIHRvIGRvIGAteGAKKwlkZXNjcmliZWQgYWJvdmUsIGFuZCBgLXJgIHdhcyB0byBkaXNhYmxlIGl0LiAgTm93IHRoZQorCWRlZmF1bHQgaXMgbm90IHRvIGRvIGAteGAgc28gdGhpcyBvcHRpb24gaXMgYSBuby1vcC4KKworLW0gcGFyZW50LW51bWJlcnwtLW1haW5saW5lIHBhcmVudC1udW1iZXI6OgorCVVzdWFsbHkgeW91IGNhbm5vdCBjaGVycnktcGljayBhIG1lcmdlIGJlY2F1c2UgeW91IGRvIG5vdCBrbm93IHdoaWNoCisJc2lkZSBvZiB0aGUgbWVyZ2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQgdGhlIG1haW5saW5lLiAgVGhpcworCW9wdGlvbiBzcGVjaWZpZXMgdGhlIHBhcmVudCBudW1iZXIgKHN0YXJ0aW5nIGZyb20gMSkgb2YKKwl0aGUgbWFpbmxpbmUgYW5kIGFsbG93cyBjaGVycnktcGljayB0byByZXBsYXkgdGhlIGNoYW5nZQorCXJlbGF0aXZlIHRvIHRoZSBzcGVjaWZpZWQgcGFyZW50LgorCistbnwtLW5vLWNvbW1pdDo6CisJVXN1YWxseSB0aGUgY29tbWFuZCBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYSBjb21taXQgd2l0aAorCWEgY29tbWl0IGxvZyBtZXNzYWdlIHN0YXRpbmcgd2hpY2ggY29tbWl0IHdhcworCWNoZXJyeS1waWNrZWQuICBUaGlzIGZsYWcgYXBwbGllcyB0aGUgY2hhbmdlIG5lY2Vzc2FyeQorCXRvIGNoZXJyeS1waWNrIHRoZSBuYW1lZCBjb21taXQgdG8geW91ciB3b3JraW5nIHRyZWUsCisJYnV0IGRvZXMgbm90IG1ha2UgdGhlIGNvbW1pdC4gIEluIGFkZGl0aW9uLCB3aGVuIHRoaXMKKwlvcHRpb24gaXMgdXNlZCwgeW91ciB3b3JraW5nIHRyZWUgZG9lcyBub3QgaGF2ZSB0byBtYXRjaAorCXRoZSBIRUFEIGNvbW1pdC4gIFRoZSBjaGVycnktcGljayBpcyBkb25lIGFnYWluc3QgdGhlCisJYmVnaW5uaW5nIHN0YXRlIG9mIHlvdXIgd29ya2luZyB0cmVlLgorKworVGhpcyBpcyB1c2VmdWwgd2hlbiBjaGVycnktcGlja2luZyBtb3JlIHRoYW4gb25lIGNvbW1pdHMnCitlZmZlY3QgdG8geW91ciB3b3JraW5nIHRyZWUgaW4gYSByb3cuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jaGVycnkudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtY2hlcnJ5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDQ2OGFhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY2hlcnJ5LnR4dApAQCAtMCwwICsxLDY5IEBACitnaXQtY2hlcnJ5KDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jaGVycnkgLSBGaW5kIGNvbW1pdHMgbm90IG1lcmdlZCB1cHN0cmVhbQorCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtY2hlcnJ5JyBbLXZdIDx1cHN0cmVhbT4gWzxoZWFkPl0gWzxsaW1pdD5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhlIGNoYW5nZXNldCAob3IgImRpZmYiKSBvZiBlYWNoIGNvbW1pdCBiZXR3ZWVuIHRoZSBmb3JrLXBvaW50IGFuZCA8aGVhZD4KK2lzIGNvbXBhcmVkIGFnYWluc3QgZWFjaCBjb21taXQgYmV0d2VlbiB0aGUgZm9yay1wb2ludCBhbmQgPHVwc3RyZWFtPi4KKworRXZlcnkgY29tbWl0IHRoYXQgZG9lc24ndCBleGlzdCBpbiB0aGUgPHVwc3RyZWFtPiBicmFuY2gKK2hhcyBpdHMgaWQgKHNoYTEpIHJlcG9ydGVkLCBwcmVmaXhlZCBieSBhIHN5bWJvbC4gIFRoZSBvbmVzIHRoYXQgaGF2ZQorZXF1aXZhbGVudCBjaGFuZ2UgYWxyZWFkeQoraW4gdGhlIDx1cHN0cmVhbT4gYnJhbmNoIGFyZSBwcmVmaXhlZCB3aXRoIGEgbWludXMgKC0pIHNpZ24sIGFuZCB0aG9zZQordGhhdCBvbmx5IGV4aXN0IGluIHRoZSA8aGVhZD4gYnJhbmNoIGFyZSBwcmVmaXhlZCB3aXRoIGEgcGx1cyAoKykgc3ltYm9sOgorCisgICAgICAgICAgICAgICBfXypfXypfXypfXypfXz4gPHVwc3RyZWFtPgorICAgICAgICAgICAgICAvCisgICAgZm9yay1wb2ludAorICAgICAgICAgICAgICBcX18rX18rX18tX18rX18rX18tX18rX18+IDxoZWFkPgorCisKK0lmIGEgPGxpbWl0PiBoYXMgYmVlbiBnaXZlbiB0aGVuIHRoZSBjb21taXRzIGFsb25nIHRoZSA8aGVhZD4gYnJhbmNoIHVwCit0byBhbmQgaW5jbHVkaW5nIDxsaW1pdD4gYXJlIG5vdCByZXBvcnRlZDoKKworICAgICAgICAgICAgICAgX18qX18qX18qX18qX18+IDx1cHN0cmVhbT4KKyAgICAgICAgICAgICAgLworICAgIGZvcmstcG9pbnQKKyAgICAgICAgICAgICAgXF9fKl9fKl9fPGxpbWl0Pl9fLV9fK19fPiA8aGVhZD4KKworCitCZWNhdXNlIGdpdC1jaGVycnkgY29tcGFyZXMgdGhlIGNoYW5nZXNldCByYXRoZXIgdGhhbiB0aGUgY29tbWl0IGlkCisoc2hhMSksIHlvdSBjYW4gdXNlIGdpdC1jaGVycnkgdG8gZmluZCBvdXQgaWYgYSBjb21taXQgeW91IG1hZGUgbG9jYWxseQoraGFzIGJlZW4gYXBwbGllZCA8dXBzdHJlYW0+IHVuZGVyIGEgZGlmZmVyZW50IGNvbW1pdCBpZC4gIEZvciBleGFtcGxlLAordGhpcyB3aWxsIGhhcHBlbiBpZiB5b3UncmUgZmVlZGluZyBwYXRjaGVzIDx1cHN0cmVhbT4gdmlhIGVtYWlsIHJhdGhlcgordGhhbiBwdXNoaW5nIG9yIHB1bGxpbmcgY29tbWl0cyBkaXJlY3RseS4KKworCitPUFRJT05TCistLS0tLS0tCistdjo6CisJVmVyYm9zZS4KKworPHVwc3RyZWFtPjo6CisJVXBzdHJlYW0gYnJhbmNoIHRvIGNvbXBhcmUgYWdhaW5zdC4KKworPGhlYWQ+OjoKKwlXb3JraW5nIGJyYW5jaDsgZGVmYXVsdHMgdG8gSEVBRC4KKworPGxpbWl0Pjo6CisJRG8gbm90IHJlcG9ydCBjb21taXRzIHVwIHRvIChhbmQgaW5jbHVkaW5nKSBsaW1pdC4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jaXRvb2wudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtY2l0b29sLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2ExZDc1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY2l0b29sLnR4dApAQCAtMCwwICsxLDMyIEBACitnaXQtY2l0b29sKDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jaXRvb2wgLSBHcmFwaGljYWwgYWx0ZXJuYXRpdmUgdG8gZ2l0LWNvbW1pdAorCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQgY2l0b29sJworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0EgVGNsL1RrIGJhc2VkIGdyYXBoaWNhbCBpbnRlcmZhY2UgdG8gcmV2aWV3IG1vZGlmaWVkIGZpbGVzLCBzdGFnZQordGhlbSBpbnRvIHRoZSBpbmRleCwgZW50ZXIgYSBjb21taXQgbWVzc2FnZSBhbmQgcmVjb3JkIHRoZSBuZXcKK2NvbW1pdCBvbnRvIHRoZSBjdXJyZW50IGJyYW5jaC4gIFRoaXMgaW50ZXJmYWNlIGlzIGFuIGFsdGVybmF0aXZlCit0byB0aGUgbGVzcyBpbnRlcmFjdGl2ZSBsaW5rZ2l0OmdpdC1jb21taXRbMV0gcHJvZ3JhbS4KKworZ2l0LWNpdG9vbCBpcyBhY3R1YWxseSBhIHN0YW5kYXJkIGFsaWFzIGZvciAnZ2l0IGd1aSBjaXRvb2wnLgorU2VlIGxpbmtnaXQ6Z2l0LWd1aVsxXSBmb3IgbW9yZSBkZXRhaWxzLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBTaGF3biBPLiBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+LgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBTaGF3biBPLiBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWNsZWFuLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWNsZWFuLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTlkYTAzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY2xlYW4udHh0CkBAIC0wLDAgKzEsNTcgQEAKK2dpdC1jbGVhbigxKQorPT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jbGVhbiAtIFJlbW92ZSB1bnRyYWNrZWQgZmlsZXMgZnJvbSB0aGUgd29ya2luZyB0cmVlCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1jbGVhbicgWy1kXSBbLWZdIFstbl0gWy1xXSBbLXggfCAtWF0gWy0tXSA8cGF0aHM+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUmVtb3ZlcyBmaWxlcyB1bmtub3duIHRvIGdpdC4gIFRoaXMgYWxsb3dzIHRvIGNsZWFuIHRoZSB3b3JraW5nIHRyZWUKK2Zyb20gZmlsZXMgdGhhdCBhcmUgbm90IHVuZGVyIHZlcnNpb24gY29udHJvbC4gIElmIHRoZSAnLXgnIG9wdGlvbiBpcworc3BlY2lmaWVkLCBpZ25vcmVkIGZpbGVzIGFyZSBhbHNvIHJlbW92ZWQsIGFsbG93aW5nIHRvIHJlbW92ZSBhbGwKK2J1aWxkIHByb2R1Y3RzLgorV2hlbiBvcHRpb25hbCBgPHBhdGhzPi4uLmAgYXJndW1lbnRzIGFyZSBnaXZlbiwgdGhlIHBhdGhzCithZmZlY3RlZCBhcmUgZnVydGhlciBsaW1pdGVkIHRvIHRob3NlIHRoYXQgbWF0Y2ggdGhlbS4KKworCitPUFRJT05TCistLS0tLS0tCistZDo6CisJUmVtb3ZlIHVudHJhY2tlZCBkaXJlY3RvcmllcyBpbiBhZGRpdGlvbiB0byB1bnRyYWNrZWQgZmlsZXMuCisKKy1mOjoKKwlJZiB0aGUgZ2l0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVzIGNsZWFuLnJlcXVpcmVGb3JjZSBhcyB0cnVlLAorCWdpdC1jbGVhbiB3aWxsIHJlZnVzZSB0byBydW4gdW5sZXNzIGdpdmVuIC1mIG9yIC1uLgorCistbjo6CisJRG9uJ3QgYWN0dWFsbHkgcmVtb3ZlIGFueXRoaW5nLCBqdXN0IHNob3cgd2hhdCB3b3VsZCBiZSBkb25lLgorCistcTo6CisJQmUgcXVpZXQsIG9ubHkgcmVwb3J0IGVycm9ycywgYnV0IG5vdCB0aGUgZmlsZXMgdGhhdCBhcmUKKwlzdWNjZXNzZnVsbHkgcmVtb3ZlZC4KKworLXg6OgorCURvbid0IHVzZSB0aGUgaWdub3JlIHJ1bGVzLiAgVGhpcyBhbGxvd3MgcmVtb3ZpbmcgYWxsIHVudHJhY2tlZAorCWZpbGVzLCBpbmNsdWRpbmcgYnVpbGQgcHJvZHVjdHMuICBUaGlzIGNhbiBiZSB1c2VkIChwb3NzaWJseSBpbgorCWNvbmp1bmN0aW9uIHdpdGggbGlua2dpdDpnaXQtcmVzZXRbMV0pIHRvIGNyZWF0ZSBhIHByaXN0aW5lCisJd29ya2luZyBkaXJlY3RvcnkgdG8gdGVzdCBhIGNsZWFuIGJ1aWxkLgorCistWDo6CisJUmVtb3ZlIG9ubHkgZmlsZXMgaWdub3JlZCBieSBnaXQuICBUaGlzIG1heSBiZSB1c2VmdWwgdG8gcmVidWlsZAorCWV2ZXJ5dGhpbmcgZnJvbSBzY3JhdGNoLCBidXQga2VlcCBtYW51YWxseSBjcmVhdGVkIGZpbGVzLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IFBhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+CisKKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jbG9uZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jbG9uZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc1ODI0MwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWNsb25lLnR4dApAQCAtMCwwICsxLDIwMyBAQAorZ2l0LWNsb25lKDEpCis9PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWNsb25lIC0gQ2xvbmUgYSByZXBvc2l0b3J5IGludG8gYSBuZXcgZGlyZWN0b3J5CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWNsb25lJyBbLS10ZW1wbGF0ZT08dGVtcGxhdGVfZGlyZWN0b3J5Pl0KKwkgIFstbF0gWy1zXSBbLS1uby1oYXJkbGlua3NdIFstcV0gWy1uXSBbLS1iYXJlXQorCSAgWy1vIDxuYW1lPl0gWy11IDx1cGxvYWQtcGFjaz5dIFstLXJlZmVyZW5jZSA8cmVwb3NpdG9yeT5dCisJICBbLS1kZXB0aCA8ZGVwdGg+XSBbLS1dIDxyZXBvc2l0b3J5PiBbPGRpcmVjdG9yeT5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitDbG9uZXMgYSByZXBvc2l0b3J5IGludG8gYSBuZXdseSBjcmVhdGVkIGRpcmVjdG9yeSwgY3JlYXRlcworcmVtb3RlLXRyYWNraW5nIGJyYW5jaGVzIGZvciBlYWNoIGJyYW5jaCBpbiB0aGUgY2xvbmVkIHJlcG9zaXRvcnkKKyh2aXNpYmxlIHVzaW5nIGBnaXQgYnJhbmNoIC1yYCksIGFuZCBjcmVhdGVzIGFuZCBjaGVja3Mgb3V0IGFuIGluaXRpYWwKK2JyYW5jaCBlcXVhbCB0byB0aGUgY2xvbmVkIHJlcG9zaXRvcnkncyBjdXJyZW50bHkgYWN0aXZlIGJyYW5jaC4KKworQWZ0ZXIgdGhlIGNsb25lLCBhIHBsYWluIGBnaXQgZmV0Y2hgIHdpdGhvdXQgYXJndW1lbnRzIHdpbGwgdXBkYXRlCithbGwgdGhlIHJlbW90ZS10cmFja2luZyBicmFuY2hlcywgYW5kIGEgYGdpdCBwdWxsYCB3aXRob3V0Cithcmd1bWVudHMgd2lsbCBpbiBhZGRpdGlvbiBtZXJnZSB0aGUgcmVtb3RlIG1hc3RlciBicmFuY2ggaW50byB0aGUKK2N1cnJlbnQgbWFzdGVyIGJyYW5jaCwgaWYgYW55LgorCitUaGlzIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpcyBhY2hpZXZlZCBieSBjcmVhdGluZyByZWZlcmVuY2VzIHRvCit0aGUgcmVtb3RlIGJyYW5jaCBoZWFkcyB1bmRlciBgJEdJVF9ESVIvcmVmcy9yZW1vdGVzL29yaWdpbmAgYW5kCitieSBpbml0aWFsaXppbmcgYHJlbW90ZS5vcmlnaW4udXJsYCBhbmQgYHJlbW90ZS5vcmlnaW4uZmV0Y2hgCitjb25maWd1cmF0aW9uIHZhcmlhYmxlcy4KKworCitPUFRJT05TCistLS0tLS0tCistLWxvY2FsOjoKKy1sOjoKKwlXaGVuIHRoZSByZXBvc2l0b3J5IHRvIGNsb25lIGZyb20gaXMgb24gYSBsb2NhbCBtYWNoaW5lLAorCXRoaXMgZmxhZyBieXBhc3NlcyBub3JtYWwgImdpdCBhd2FyZSIgdHJhbnNwb3J0CisJbWVjaGFuaXNtIGFuZCBjbG9uZXMgdGhlIHJlcG9zaXRvcnkgYnkgbWFraW5nIGEgY29weSBvZgorCUhFQUQgYW5kIGV2ZXJ5dGhpbmcgdW5kZXIgb2JqZWN0cyBhbmQgcmVmcyBkaXJlY3Rvcmllcy4KKwlUaGUgZmlsZXMgdW5kZXIgYC5naXQvb2JqZWN0cy9gIGRpcmVjdG9yeSBhcmUgaGFyZGxpbmtlZAorCXRvIHNhdmUgc3BhY2Ugd2hlbiBwb3NzaWJsZS4gIFRoaXMgaXMgbm93IHRoZSBkZWZhdWx0IHdoZW4KKwl0aGUgc291cmNlIHJlcG9zaXRvcnkgaXMgc3BlY2lmaWVkIHdpdGggYC9wYXRoL3RvL3JlcG9gCisJc3ludGF4LCBzbyBpdCBlc3NlbnRpYWxseSBpcyBhIG5vLW9wIG9wdGlvbi4gIFRvIGZvcmNlCisJY29weWluZyBpbnN0ZWFkIG9mIGhhcmRsaW5raW5nICh3aGljaCBtYXkgYmUgZGVzaXJhYmxlCisJaWYgeW91IGFyZSB0cnlpbmcgdG8gbWFrZSBhIGJhY2stdXAgb2YgeW91ciByZXBvc2l0b3J5KSwKKwlidXQgc3RpbGwgYXZvaWQgdGhlIHVzdWFsICJnaXQgYXdhcmUiIHRyYW5zcG9ydAorCW1lY2hhbmlzbSwgYC0tbm8taGFyZGxpbmtzYCBjYW4gYmUgdXNlZC4KKworLS1uby1oYXJkbGlua3M6OgorCU9wdGltaXplIHRoZSBjbG9uaW5nIHByb2Nlc3MgZnJvbSBhIHJlcG9zaXRvcnkgb24gYQorCWxvY2FsIGZpbGVzeXN0ZW0gYnkgY29weWluZyBmaWxlcyB1bmRlciBgLmdpdC9vYmplY3RzYAorCWRpcmVjdG9yeS4KKworLS1zaGFyZWQ6OgorLXM6OgorCVdoZW4gdGhlIHJlcG9zaXRvcnkgdG8gY2xvbmUgaXMgb24gdGhlIGxvY2FsIG1hY2hpbmUsCisJaW5zdGVhZCBvZiB1c2luZyBoYXJkIGxpbmtzLCBhdXRvbWF0aWNhbGx5IHNldHVwCisJLmdpdC9vYmplY3RzL2luZm8vYWx0ZXJuYXRlcyB0byBzaGFyZSB0aGUgb2JqZWN0cworCXdpdGggdGhlIHNvdXJjZSByZXBvc2l0b3J5LiAgVGhlIHJlc3VsdGluZyByZXBvc2l0b3J5CisJc3RhcnRzIG91dCB3aXRob3V0IGFueSBvYmplY3Qgb2YgaXRzIG93bi4KKysKKypOT1RFKjogdGhpcyBpcyBhIHBvc3NpYmx5IGRhbmdlcm91cyBvcGVyYXRpb247IGRvICpub3QqIHVzZQoraXQgdW5sZXNzIHlvdSB1bmRlcnN0YW5kIHdoYXQgaXQgZG9lcy4gSWYgeW91IGNsb25lIHlvdXIKK3JlcG9zaXRvcnkgdXNpbmcgdGhpcyBvcHRpb24sIHRoZW4gZGVsZXRlIGJyYW5jaGVzIGluIHRoZQorc291cmNlIHJlcG9zaXRvcnkgYW5kIHRoZW4gcnVuIGxpbmtnaXQ6Z2l0LWdjWzFdIHVzaW5nIHRoZQorJy0tcHJ1bmUnIG9wdGlvbiBpbiB0aGUgc291cmNlIHJlcG9zaXRvcnksIGl0IG1heSByZW1vdmUKK29iamVjdHMgd2hpY2ggYXJlIHJlZmVyZW5jZWQgYnkgdGhlIGNsb25lZCByZXBvc2l0b3J5LgorCisKKworLS1yZWZlcmVuY2UgPHJlcG9zaXRvcnk+OjoKKwlJZiB0aGUgcmVmZXJlbmNlIHJlcG9zaXRvcnkgaXMgb24gdGhlIGxvY2FsIG1hY2hpbmUKKwlhdXRvbWF0aWNhbGx5IHNldHVwIC5naXQvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXMgdG8KKwlvYnRhaW4gb2JqZWN0cyBmcm9tIHRoZSByZWZlcmVuY2UgcmVwb3NpdG9yeS4gIFVzaW5nCisJYW4gYWxyZWFkeSBleGlzdGluZyByZXBvc2l0b3J5IGFzIGFuIGFsdGVybmF0ZSB3aWxsCisJcmVxdWlyZSBmZXdlciBvYmplY3RzIHRvIGJlIGNvcGllZCBmcm9tIHRoZSByZXBvc2l0b3J5CisJYmVpbmcgY2xvbmVkLCByZWR1Y2luZyBuZXR3b3JrIGFuZCBsb2NhbCBzdG9yYWdlIGNvc3RzLgorCistLXF1aWV0OjoKKy1xOjoKKwlPcGVyYXRlIHF1aWV0bHkuICBUaGlzIGZsYWcgaXMgcGFzc2VkIHRvICJyc3luYyIgYW5kCisJImdpdC1mZXRjaC1wYWNrIiBjb21tYW5kcyB3aGVuIGdpdmVuLgorCistLW5vLWNoZWNrb3V0OjoKKy1uOjoKKwlObyBjaGVja291dCBvZiBIRUFEIGlzIHBlcmZvcm1lZCBhZnRlciB0aGUgY2xvbmUgaXMgY29tcGxldGUuCisKKy0tYmFyZTo6CisJTWFrZSBhICdiYXJlJyBHSVQgcmVwb3NpdG9yeS4gIFRoYXQgaXMsIGluc3RlYWQgb2YKKwljcmVhdGluZyBgPGRpcmVjdG9yeT5gIGFuZCBwbGFjaW5nIHRoZSBhZG1pbmlzdHJhdGl2ZQorCWZpbGVzIGluIGA8ZGlyZWN0b3J5Pi8uZ2l0YCwgbWFrZSB0aGUgYDxkaXJlY3Rvcnk+YAorCWl0c2VsZiB0aGUgYCRHSVRfRElSYC4gVGhpcyBvYnZpb3VzbHkgaW1wbGllcyB0aGUgYC1uYAorCWJlY2F1c2UgdGhlcmUgaXMgbm93aGVyZSB0byBjaGVjayBvdXQgdGhlIHdvcmtpbmcgdHJlZS4KKwlBbHNvIHRoZSBicmFuY2ggaGVhZHMgYXQgdGhlIHJlbW90ZSBhcmUgY29waWVkIGRpcmVjdGx5CisJdG8gY29ycmVzcG9uZGluZyBsb2NhbCBicmFuY2ggaGVhZHMsIHdpdGhvdXQgbWFwcGluZworCXRoZW0gdG8gYHJlZnMvcmVtb3Rlcy9vcmlnaW4vYC4gIFdoZW4gdGhpcyBvcHRpb24gaXMKKwl1c2VkLCBuZWl0aGVyIHJlbW90ZS10cmFja2luZyBicmFuY2hlcyBub3IgdGhlIHJlbGF0ZWQKKwljb25maWd1cmF0aW9uIHZhcmlhYmxlcyBhcmUgY3JlYXRlZC4KKworLS1vcmlnaW4gPG5hbWU+OjoKKy1vIDxuYW1lPjo6CisJSW5zdGVhZCBvZiB1c2luZyB0aGUgcmVtb3RlIG5hbWUgJ29yaWdpbicgdG8ga2VlcCB0cmFjaworCW9mIHRoZSB1cHN0cmVhbSByZXBvc2l0b3J5LCB1c2UgPG5hbWU+IGluc3RlYWQuCisKKy0tdXBsb2FkLXBhY2sgPHVwbG9hZC1wYWNrPjo6CistdSA8dXBsb2FkLXBhY2s+OjoKKwlXaGVuIGdpdmVuLCBhbmQgdGhlIHJlcG9zaXRvcnkgdG8gY2xvbmUgZnJvbSBpcyBoYW5kbGVkCisJYnkgJ2dpdC1mZXRjaC1wYWNrJywgJy0tZXhlYz08dXBsb2FkLXBhY2s+JyBpcyBwYXNzZWQgdG8KKwl0aGUgY29tbWFuZCB0byBzcGVjaWZ5IG5vbi1kZWZhdWx0IHBhdGggZm9yIHRoZSBjb21tYW5kCisJcnVuIG9uIHRoZSBvdGhlciBlbmQuCisKKy0tdGVtcGxhdGU9PHRlbXBsYXRlX2RpcmVjdG9yeT46OgorCVNwZWNpZnkgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHRlbXBsYXRlcyB3aWxsIGJlIHVzZWQ7CisJaWYgdW5zZXQgdGhlIHRlbXBsYXRlcyBhcmUgdGFrZW4gZnJvbSB0aGUgaW5zdGFsbGF0aW9uCisJZGVmaW5lZCBkZWZhdWx0LCB0eXBpY2FsbHkgYC91c3Ivc2hhcmUvZ2l0LWNvcmUvdGVtcGxhdGVzYC4KKworLS1kZXB0aCA8ZGVwdGg+OjoKKwlDcmVhdGUgYSAnc2hhbGxvdycgY2xvbmUgd2l0aCBhIGhpc3RvcnkgdHJ1bmNhdGVkIHRvIHRoZQorCXNwZWNpZmllZCBudW1iZXIgb2YgcmV2aXNpb25zLiAgQSBzaGFsbG93IHJlcG9zaXRvcnkgaGFzIGEKKwludW1iZXIgb2YgbGltaXRhdGlvbnMgKHlvdSBjYW5ub3QgY2xvbmUgb3IgZmV0Y2ggZnJvbQorCWl0LCBub3IgcHVzaCBmcm9tIG5vciBpbnRvIGl0KSwgYnV0IGlzIGFkZXF1YXRlIGlmIHlvdQorCWFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIHJlY2VudCBoaXN0b3J5IG9mIGEgbGFyZ2UgcHJvamVjdAorCXdpdGggYSBsb25nIGhpc3RvcnksIGFuZCB3b3VsZCB3YW50IHRvIHNlbmQgaW4gZml4ZXMKKwlhcyBwYXRjaGVzLgorCis8cmVwb3NpdG9yeT46OgorCVRoZSAocG9zc2libHkgcmVtb3RlKSByZXBvc2l0b3J5IHRvIGNsb25lIGZyb20uICBTZWUgdGhlCisJPDxVUkxTLFVSTFM+PiBzZWN0aW9uIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHNwZWNpZnlpbmcKKwlyZXBvc2l0b3JpZXMuCisKKzxkaXJlY3Rvcnk+OjoKKwlUaGUgbmFtZSBvZiBhIG5ldyBkaXJlY3RvcnkgdG8gY2xvbmUgaW50by4gIFRoZSAiaHVtYW5pc2giCisJcGFydCBvZiB0aGUgc291cmNlIHJlcG9zaXRvcnkgaXMgdXNlZCBpZiBubyBkaXJlY3RvcnkgaXMKKwlleHBsaWNpdGx5IGdpdmVuICgicmVwbyIgZm9yICIvcGF0aC90by9yZXBvLmdpdCIgYW5kICJmb28iCisJZm9yICJob3N0Lnh6OmZvby8uZ2l0IikuICBDbG9uaW5nIGludG8gYW4gZXhpc3RpbmcgZGlyZWN0b3J5CisJaXMgbm90IGFsbG93ZWQuCisKKzpnaXQtY2xvbmU6IDEKK2luY2x1ZGU6OnVybHMudHh0W10KKworRXhhbXBsZXMKKy0tLS0tLS0tCisKK0Nsb25lIGZyb20gdXBzdHJlYW06OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBjbG9uZSBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtLy4uLi9saW51eC0yLjYgbXkyLjYKKyQgY2QgbXkyLjYKKyQgbWFrZQorLS0tLS0tLS0tLS0tCisKKworTWFrZSBhIGxvY2FsIGNsb25lIHRoYXQgYm9ycm93cyBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgd2l0aG91dCBjaGVja2luZyB0aGluZ3Mgb3V0OjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2xvbmUgLWwgLXMgLW4gLiAuLi9jb3B5CiskIGNkIC4uL2NvcHkKKyQgZ2l0IHNob3ctYnJhbmNoCistLS0tLS0tLS0tLS0KKworCitDbG9uZSBmcm9tIHVwc3RyZWFtIHdoaWxlIGJvcnJvd2luZyBmcm9tIGFuIGV4aXN0aW5nIGxvY2FsIGRpcmVjdG9yeTo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNsb25lIC0tcmVmZXJlbmNlIG15Mi42IFwKKwlnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtLy4uLi9saW51eC0yLjcgXAorCW15Mi43CiskIGNkIG15Mi43CistLS0tLS0tLS0tLS0KKworCitDcmVhdGUgYSBiYXJlIHJlcG9zaXRvcnkgdG8gcHVibGlzaCB5b3VyIGNoYW5nZXMgdG8gdGhlIHB1YmxpYzo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNsb25lIC0tYmFyZSAtbCAvaG9tZS9wcm9qLy5naXQgL3B1Yi9zY20vcHJvai5naXQKKy0tLS0tLS0tLS0tLQorCisKK0NyZWF0ZSBhIHJlcG9zaXRvcnkgb24gdGhlIGtlcm5lbC5vcmcgbWFjaGluZSB0aGF0IGJvcnJvd3MgZnJvbSBMaW51czo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNsb25lIC0tYmFyZSAtbCAtcyAvcHViL3NjbS8uLi4vdG9ydmFsZHMvbGludXgtMi42LmdpdCBcCisgICAgL3B1Yi9zY20vLi4uL21lL3N1YnN5cy0yLjYuZ2l0CistLS0tLS0tLS0tLS0KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jb21taXQtdHJlZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jb21taXQtdHJlZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwODAzYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWNvbW1pdC10cmVlLnR4dApAQCAtMCwwICsxLDEwNiBAQAorZ2l0LWNvbW1pdC10cmVlKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWNvbW1pdC10cmVlIC0gQ3JlYXRlIGEgbmV3IGNvbW1pdCBvYmplY3QKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtY29tbWl0LXRyZWUnIDx0cmVlPiBbLXAgPHBhcmVudCBjb21taXQ+XVwqIDwgY2hhbmdlbG9nCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhpcyBpcyB1c3VhbGx5IG5vdCB3aGF0IGFuIGVuZCB1c2VyIHdhbnRzIHRvIHJ1biBkaXJlY3RseS4gIFNlZQorbGlua2dpdDpnaXQtY29tbWl0WzFdIGluc3RlYWQuCisKK0NyZWF0ZXMgYSBuZXcgY29tbWl0IG9iamVjdCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgdHJlZSBvYmplY3QgYW5kCitlbWl0cyB0aGUgbmV3IGNvbW1pdCBvYmplY3QgaWQgb24gc3Rkb3V0LiBJZiBubyBwYXJlbnQgaXMgZ2l2ZW4gdGhlbgoraXQgaXMgY29uc2lkZXJlZCB0byBiZSBhbiBpbml0aWFsIHRyZWUuCisKK0EgY29tbWl0IG9iamVjdCB1c3VhbGx5IGhhcyAxIHBhcmVudCAoYSBjb21taXQgYWZ0ZXIgYSBjaGFuZ2UpIG9yIHVwCit0byAxNiBwYXJlbnRzLiAgTW9yZSB0aGFuIG9uZSBwYXJlbnQgcmVwcmVzZW50cyBhIG1lcmdlIG9mIGJyYW5jaGVzCit0aGF0IGxlZCB0byB0aGVtLgorCitXaGlsZSBhIHRyZWUgcmVwcmVzZW50cyBhIHBhcnRpY3VsYXIgZGlyZWN0b3J5IHN0YXRlIG9mIGEgd29ya2luZworZGlyZWN0b3J5LCBhIGNvbW1pdCByZXByZXNlbnRzIHRoYXQgc3RhdGUgaW4gInRpbWUiLCBhbmQgZXhwbGFpbnMgaG93Cit0byBnZXQgdGhlcmUuCisKK05vcm1hbGx5IGEgY29tbWl0IHdvdWxkIGlkZW50aWZ5IGEgbmV3ICJIRUFEIiBzdGF0ZSwgYW5kIHdoaWxlIGdpdAorZG9lc24ndCBjYXJlIHdoZXJlIHlvdSBzYXZlIHRoZSBub3RlIGFib3V0IHRoYXQgc3RhdGUsIGluIHByYWN0aWNlIHdlCit0ZW5kIHRvIGp1c3Qgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgZmlsZSB0aGF0IGlzIHBvaW50ZWQgYXQgYnkKK2AuZ2l0L0hFQURgLCBzbyB0aGF0IHdlIGNhbiBhbHdheXMgc2VlIHdoYXQgdGhlIGxhc3QgY29tbWl0dGVkCitzdGF0ZSB3YXMuCisKK09QVElPTlMKKy0tLS0tLS0KKzx0cmVlPjo6CisJQW4gZXhpc3RpbmcgdHJlZSBvYmplY3QKKworLXAgPHBhcmVudCBjb21taXQ+OjoKKwlFYWNoICctcCcgaW5kaWNhdGVzIHRoZSBpZCBvZiBhIHBhcmVudCBjb21taXQgb2JqZWN0LgorCisKK0NvbW1pdCBJbmZvcm1hdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgY29tbWl0IGVuY2Fwc3VsYXRlczoKKworLSBhbGwgcGFyZW50IG9iamVjdCBpZHMKKy0gYXV0aG9yIG5hbWUsIGVtYWlsIGFuZCBkYXRlCistIGNvbW1pdHRlciBuYW1lIGFuZCBlbWFpbCBhbmQgdGhlIGNvbW1pdCB0aW1lLgorCitXaGlsZSBwYXJlbnQgb2JqZWN0IGlkcyBhcmUgcHJvdmlkZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgYXV0aG9yIGFuZAorY29tbWl0dGVyIGluZm9ybWF0aW9uIGlzIHRha2VuIGZyb20gdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMsCitpZiBzZXQ6CisKKwlHSVRfQVVUSE9SX05BTUUKKwlHSVRfQVVUSE9SX0VNQUlMCisJR0lUX0FVVEhPUl9EQVRFCisJR0lUX0NPTU1JVFRFUl9OQU1FCisJR0lUX0NPTU1JVFRFUl9FTUFJTAorCUdJVF9DT01NSVRURVJfREFURQorCUVNQUlMCisKKyhuYiAiPCIsICI+IiBhbmQgIlxuInMgYXJlIHN0cmlwcGVkKQorCitJbiBjYXNlIChzb21lIG9mKSB0aGVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIG5vdCBzZXQsIHRoZSBpbmZvcm1hdGlvbgoraXMgdGFrZW4gZnJvbSB0aGUgY29uZmlndXJhdGlvbiBpdGVtcyB1c2VyLm5hbWUgYW5kIHVzZXIuZW1haWwsIG9yLCBpZiBub3QKK3ByZXNlbnQsIHN5c3RlbSB1c2VyIG5hbWUgYW5kIGZ1bGx5IHF1YWxpZmllZCBob3N0bmFtZS4KKworQSBjb21taXQgY29tbWVudCBpcyByZWFkIGZyb20gc3RkaW4uIElmIGEgY2hhbmdlbG9nCitlbnRyeSBpcyBub3QgcHJvdmlkZWQgdmlhICI8IiByZWRpcmVjdGlvbiwgImdpdC1jb21taXQtdHJlZSIgd2lsbCBqdXN0IHdhaXQKK2ZvciBvbmUgdG8gYmUgZW50ZXJlZCBhbmQgdGVybWluYXRlZCB3aXRoIF5ELgorCisKK0RpYWdub3N0aWNzCistLS0tLS0tLS0tLQorWW91IGRvbid0IGV4aXN0LiBHbyBhd2F5ITo6CisgICAgVGhlIHBhc3N3ZCg1KSBnZWNvcyBmaWVsZCBjb3VsZG4ndCBiZSByZWFkCitZb3VyIHBhcmVudHMgbXVzdCBoYXZlIGhhdGVkIHlvdSE6OgorICAgIFRoZSBwYXNzd29yZCg1KSBnZWNvcyBmaWVsZCBpcyBsb25nZXIgdGhhbiBhIGdpYW50IHN0YXRpYyBidWZmZXIuCitZb3VyIHN5c2FkbWluIG11c3QgaGF0ZSB5b3UhOjoKKyAgICBUaGUgcGFzc3dvcmQoNSkgbmFtZSBmaWVsZCBpcyBsb25nZXIgdGhhbiBhIGdpYW50IHN0YXRpYyBidWZmZXIuCisKK0Rpc2N1c3Npb24KKy0tLS0tLS0tLS0KKworaW5jbHVkZTo6aTE4bi50eHRbXQorCitTZWUgQWxzbworLS0tLS0tLS0KK2xpbmtnaXQ6Z2l0LXdyaXRlLXRyZWVbMV0KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWNvbW1pdC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jb21taXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YWU2MWYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1jb21taXQudHh0CkBAIC0wLDAgKzEsMzA0IEBACitnaXQtY29tbWl0KDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jb21taXQgLSBSZWNvcmQgY2hhbmdlcyB0byB0aGUgcmVwb3NpdG9yeQorCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtY29tbWl0JyBbLWEgfCAtLWludGVyYWN0aXZlXSBbLXNdIFstdl0gWy11XQorCSAgIFsoLWMgfCAtQykgPGNvbW1pdD4gfCAtRiA8ZmlsZT4gfCAtbSA8bXNnPiB8IC0tYW1lbmRdCisJICAgWy0tYWxsb3ctZW1wdHldIFstLW5vLXZlcmlmeV0gWy1lXSBbLS1hdXRob3IgPGF1dGhvcj5dCisJICAgWy0tY2xlYW51cD08bW9kZT5dIFstLV0gW1staSB8IC1vIF08ZmlsZT4uLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVXNlICdnaXQgY29tbWl0JyB0byBzdG9yZSB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgaW5kZXggaW4gYSBuZXcKK2NvbW1pdCBhbG9uZyB3aXRoIGEgbG9nIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgY2hhbmdlcyB5b3UgaGF2ZSBtYWRlLgorCitUaGUgY29udGVudCB0byBiZSBhZGRlZCBjYW4gYmUgc3BlY2lmaWVkIGluIHNldmVyYWwgd2F5czoKKworMS4gYnkgdXNpbmcgbGlua2dpdDpnaXQtYWRkWzFdIHRvIGluY3JlbWVudGFsbHkgImFkZCIgY2hhbmdlcyB0byB0aGUKKyAgIGluZGV4IGJlZm9yZSB1c2luZyB0aGUgJ2NvbW1pdCcgY29tbWFuZCAoTm90ZTogZXZlbiBtb2RpZmllZAorICAgZmlsZXMgbXVzdCBiZSAiYWRkZWQiKTsKKworMi4gYnkgdXNpbmcgbGlua2dpdDpnaXQtcm1bMV0gdG8gcmVtb3ZlIGZpbGVzIGZyb20gdGhlIHdvcmtpbmcgdHJlZQorICAgYW5kIHRoZSBpbmRleCwgYWdhaW4gYmVmb3JlIHVzaW5nIHRoZSAnY29tbWl0JyBjb21tYW5kOworCiszLiBieSBsaXN0aW5nIGZpbGVzIGFzIGFyZ3VtZW50cyB0byB0aGUgJ2NvbW1pdCcgY29tbWFuZCwgaW4gd2hpY2gKKyAgIGNhc2UgdGhlIGNvbW1pdCB3aWxsIGlnbm9yZSBjaGFuZ2VzIHN0YWdlZCBpbiB0aGUgaW5kZXgsIGFuZCBpbnN0ZWFkCisgICByZWNvcmQgdGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgbGlzdGVkIGZpbGVzOworCis0LiBieSB1c2luZyB0aGUgLWEgc3dpdGNoIHdpdGggdGhlICdjb21taXQnIGNvbW1hbmQgdG8gYXV0b21hdGljYWxseQorICAgImFkZCIgY2hhbmdlcyBmcm9tIGFsbCBrbm93biBmaWxlcyAoaS5lLiBhbGwgZmlsZXMgdGhhdCBhcmUgYWxyZWFkeQorICAgbGlzdGVkIGluIHRoZSBpbmRleCkgYW5kIHRvIGF1dG9tYXRpY2FsbHkgInJtIiBmaWxlcyBpbiB0aGUgaW5kZXgKKyAgIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya2luZyB0cmVlLCBhbmQgdGhlbiBwZXJmb3JtIHRoZQorICAgYWN0dWFsIGNvbW1pdDsKKworNS4gYnkgdXNpbmcgdGhlIC0taW50ZXJhY3RpdmUgc3dpdGNoIHdpdGggdGhlICdjb21taXQnIGNvbW1hbmQgdG8gZGVjaWRlIG9uZQorICAgYnkgb25lIHdoaWNoIGZpbGVzIHNob3VsZCBiZSBwYXJ0IG9mIHRoZSBjb21taXQsIGJlZm9yZSBmaW5hbGl6aW5nIHRoZQorICAgb3BlcmF0aW9uLiAgQ3VycmVudGx5LCB0aGlzIGlzIGRvbmUgYnkgaW52b2tpbmcgYGdpdC1hZGQgLS1pbnRlcmFjdGl2ZWAuCisKK1RoZSBsaW5rZ2l0OmdpdC1zdGF0dXNbMV0gY29tbWFuZCBjYW4gYmUgdXNlZCB0byBvYnRhaW4gYQorc3VtbWFyeSBvZiB3aGF0IGlzIGluY2x1ZGVkIGJ5IGFueSBvZiB0aGUgYWJvdmUgZm9yIHRoZSBuZXh0Citjb21taXQgYnkgZ2l2aW5nIHRoZSBzYW1lIHNldCBvZiBwYXJhbWV0ZXJzIHlvdSB3b3VsZCBnaXZlIHRvCit0aGlzIGNvbW1hbmQuCisKK0lmIHlvdSBtYWtlIGEgY29tbWl0IGFuZCB0aGVuIGZvdW5kIGEgbWlzdGFrZSBpbW1lZGlhdGVseSBhZnRlcgordGhhdCwgeW91IGNhbiByZWNvdmVyIGZyb20gaXQgd2l0aCBsaW5rZ2l0OmdpdC1yZXNldFsxXS4KKworCitPUFRJT05TCistLS0tLS0tCistYXwtLWFsbDo6CisJVGVsbCB0aGUgY29tbWFuZCB0byBhdXRvbWF0aWNhbGx5IHN0YWdlIGZpbGVzIHRoYXQgaGF2ZQorCWJlZW4gbW9kaWZpZWQgYW5kIGRlbGV0ZWQsIGJ1dCBuZXcgZmlsZXMgeW91IGhhdmUgbm90CisJdG9sZCBnaXQgYWJvdXQgYXJlIG5vdCBhZmZlY3RlZC4KKworLWMgb3IgLUMgPGNvbW1pdD46OgorCVRha2UgZXhpc3RpbmcgY29tbWl0IG9iamVjdCwgYW5kIHJldXNlIHRoZSBsb2cgbWVzc2FnZQorCWFuZCB0aGUgYXV0aG9yc2hpcCBpbmZvcm1hdGlvbiAoaW5jbHVkaW5nIHRoZSB0aW1lc3RhbXApCisJd2hlbiBjcmVhdGluZyB0aGUgY29tbWl0LiAgV2l0aCAnLUMnLCB0aGUgZWRpdG9yIGlzIG5vdAorCWludm9rZWQ7IHdpdGggJy1jJyB0aGUgdXNlciBjYW4gZnVydGhlciBlZGl0IHRoZSBjb21taXQKKwltZXNzYWdlLgorCistRiA8ZmlsZT46OgorCVRha2UgdGhlIGNvbW1pdCBtZXNzYWdlIGZyb20gdGhlIGdpdmVuIGZpbGUuICBVc2UgJy0nIHRvCisJcmVhZCB0aGUgbWVzc2FnZSBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dC4KKworLS1hdXRob3IgPGF1dGhvcj46OgorCU92ZXJyaWRlIHRoZSBhdXRob3IgbmFtZSB1c2VkIGluIHRoZSBjb21taXQuICBVc2UKKwlgQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT5gIGZvcm1hdC4KKworLW0gPG1zZz58LS1tZXNzYWdlPTxtc2c+OjoKKwlVc2UgdGhlIGdpdmVuIDxtc2c+IGFzIHRoZSBjb21taXQgbWVzc2FnZS4KKworLXQgPGZpbGU+fC0tdGVtcGxhdGU9PGZpbGU+OjoKKwlVc2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBmaWxlIGFzIHRoZSBpbml0aWFsIHZlcnNpb24KKwlvZiB0aGUgY29tbWl0IG1lc3NhZ2UuIFRoZSBlZGl0b3IgaXMgaW52b2tlZCBhbmQgeW91IGNhbgorCW1ha2Ugc3Vic2VxdWVudCBjaGFuZ2VzLiBJZiBhIG1lc3NhZ2UgaXMgc3BlY2lmaWVkIHVzaW5nCisJdGhlIGAtbWAgb3IgYC1GYCBvcHRpb25zLCB0aGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0LiBUaGlzCisJb3ZlcnJpZGVzIHRoZSBgY29tbWl0LnRlbXBsYXRlYCBjb25maWd1cmF0aW9uIHZhcmlhYmxlLgorCistc3wtLXNpZ25vZmY6OgorCUFkZCBTaWduZWQtb2ZmLWJ5IGxpbmUgYXQgdGhlIGVuZCBvZiB0aGUgY29tbWl0IG1lc3NhZ2UuCisKKy0tbm8tdmVyaWZ5OjoKKwlUaGlzIG9wdGlvbiBieXBhc3NlcyB0aGUgcHJlLWNvbW1pdCBhbmQgY29tbWl0LW1zZyBob29rcy4KKwlTZWUgYWxzbyBsaW5rOmhvb2tzLmh0bWxbaG9va3NdLgorCistLWFsbG93LWVtcHR5OjoKKwlVc3VhbGx5IHJlY29yZGluZyBhIGNvbW1pdCB0aGF0IGhhcyB0aGUgZXhhY3Qgc2FtZSB0cmVlIGFzIGl0cworCXNvbGUgcGFyZW50IGNvbW1pdCBpcyBhIG1pc3Rha2UsIGFuZCB0aGUgY29tbWFuZCBwcmV2ZW50cyB5b3UKKwlmcm9tIG1ha2luZyBzdWNoIGEgY29tbWl0LiAgVGhpcyBvcHRpb24gYnlwYXNzZXMgdGhlIHNhZmV0eSwgYW5kCisJaXMgcHJpbWFyaWx5IGZvciB1c2UgYnkgZm9yZWlnbiBzY20gaW50ZXJmYWNlIHNjcmlwdHMuCisKKy0tY2xlYW51cD08bW9kZT46OgorCVRoaXMgb3B0aW9uIHNldHMgaG93IHRoZSBjb21taXQgbWVzc2FnZSBpcyBjbGVhbmVkIHVwLgorCVRoZSAgJzxtb2RlPicgY2FuIGJlIG9uZSBvZiAndmVyYmF0aW0nLCAnd2hpdGVzcGFjZScsICdzdHJpcCcsCisJYW5kICdkZWZhdWx0Jy4gVGhlICdkZWZhdWx0JyBtb2RlIHdpbGwgc3RyaXAgbGVhZGluZyBhbmQKKwl0cmFpbGluZyBlbXB0eSBsaW5lcyBhbmQgI2NvbW1lbnRhcnkgZnJvbSB0aGUgY29tbWl0IG1lc3NhZ2UKKwlvbmx5IGlmIHRoZSBtZXNzYWdlIGlzIHRvIGJlIGVkaXRlZC4gT3RoZXJ3aXNlIG9ubHkgd2hpdGVzcGFjZQorCXJlbW92ZWQuIFRoZSAndmVyYmF0aW0nIG1vZGUgZG9lcyBub3QgY2hhbmdlIG1lc3NhZ2UgYXQgYWxsLAorCSd3aGl0ZXNwYWNlJyByZW1vdmVzIGp1c3QgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIGxpbmVzCisJYW5kICdzdHJpcCcgcmVtb3ZlcyBib3RoIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRhcnkuCisKKy1lfC0tZWRpdDo6CisJVGhlIG1lc3NhZ2UgdGFrZW4gZnJvbSBmaWxlIHdpdGggYC1GYCwgY29tbWFuZCBsaW5lIHdpdGgKKwlgLW1gLCBhbmQgZnJvbSBmaWxlIHdpdGggYC1DYCBhcmUgdXN1YWxseSB1c2VkIGFzIHRoZQorCWNvbW1pdCBsb2cgbWVzc2FnZSB1bm1vZGlmaWVkLiAgVGhpcyBvcHRpb24gbGV0cyB5b3UKKwlmdXJ0aGVyIGVkaXQgdGhlIG1lc3NhZ2UgdGFrZW4gZnJvbSB0aGVzZSBzb3VyY2VzLgorCistLWFtZW5kOjoKKworCVVzZWQgdG8gYW1lbmQgdGhlIHRpcCBvZiB0aGUgY3VycmVudCBicmFuY2guIFByZXBhcmUgdGhlIHRyZWUKKwlvYmplY3QgeW91IHdvdWxkIHdhbnQgdG8gcmVwbGFjZSB0aGUgbGF0ZXN0IGNvbW1pdCBhcyB1c3VhbAorCSh0aGlzIGluY2x1ZGVzIHRoZSB1c3VhbCAtaS8tbyBhbmQgZXhwbGljaXQgcGF0aHMpLCBhbmQgdGhlCisJY29tbWl0IGxvZyBlZGl0b3IgaXMgc2VlZGVkIHdpdGggdGhlIGNvbW1pdCBtZXNzYWdlIGZyb20gdGhlCisJdGlwIG9mIHRoZSBjdXJyZW50IGJyYW5jaC4gVGhlIGNvbW1pdCB5b3UgY3JlYXRlIHJlcGxhY2VzIHRoZQorCWN1cnJlbnQgdGlwIC0tIGlmIGl0IHdhcyBhIG1lcmdlLCBpdCB3aWxsIGhhdmUgdGhlIHBhcmVudHMgb2YKKwl0aGUgY3VycmVudCB0aXAgYXMgcGFyZW50cyAtLSBzbyB0aGUgY3VycmVudCB0b3AgY29tbWl0IGlzCisJZGlzY2FyZGVkLgorKworLS0KK0l0IGlzIGEgcm91Z2ggZXF1aXZhbGVudCBmb3I6CistLS0tLS0KKwkkIGdpdCByZXNldCAtLXNvZnQgSEVBRF4KKwkkIC4uLiBkbyBzb21ldGhpbmcgZWxzZSB0byBjb21lIHVwIHdpdGggdGhlIHJpZ2h0IHRyZWUgLi4uCisJJCBnaXQgY29tbWl0IC1jIE9SSUdfSEVBRAorCistLS0tLS0KK2J1dCBjYW4gYmUgdXNlZCB0byBhbWVuZCBhIG1lcmdlIGNvbW1pdC4KKy0tCisKKy1pfC0taW5jbHVkZTo6CisJQmVmb3JlIG1ha2luZyBhIGNvbW1pdCBvdXQgb2Ygc3RhZ2VkIGNvbnRlbnRzIHNvIGZhciwKKwlzdGFnZSB0aGUgY29udGVudHMgb2YgcGF0aHMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZQorCWFzIHdlbGwuICBUaGlzIGlzIHVzdWFsbHkgbm90IHdoYXQgeW91IHdhbnQgdW5sZXNzIHlvdQorCWFyZSBjb25jbHVkaW5nIGEgY29uZmxpY3RlZCBtZXJnZS4KKworLXV8LS11bnRyYWNrZWQtZmlsZXM6OgorCVNob3cgYWxsIHVudHJhY2tlZCBmaWxlcywgYWxzbyB0aG9zZSBpbiB1bmludGVyZXN0aW5nCisJZGlyZWN0b3JpZXMsIGluIHRoZSAiVW50cmFja2VkIGZpbGVzOiIgc2VjdGlvbiBvZiBjb21taXQKKwltZXNzYWdlIHRlbXBsYXRlLiAgV2l0aG91dCB0aGlzIG9wdGlvbiBvbmx5IGl0cyBuYW1lIGFuZAorCWEgdHJhaWxpbmcgc2xhc2ggYXJlIGRpc3BsYXllZCBmb3IgZWFjaCB1bnRyYWNrZWQKKwlkaXJlY3RvcnkuCisKKy12fC0tdmVyYm9zZTo6CisJU2hvdyB1bmlmaWVkIGRpZmYgYmV0d2VlbiB0aGUgSEVBRCBjb21taXQgYW5kIHdoYXQKKwl3b3VsZCBiZSBjb21taXR0ZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgY29tbWl0IG1lc3NhZ2UKKwl0ZW1wbGF0ZS4gIE5vdGUgdGhhdCB0aGlzIGRpZmYgb3V0cHV0IGRvZXNuJ3QgaGF2ZSBpdHMKKwlsaW5lcyBwcmVmaXhlZCB3aXRoICcjJy4KKworLXF8LS1xdWlldDo6CisJU3VwcHJlc3MgY29tbWl0IHN1bW1hcnkgbWVzc2FnZS4KKworXC0tOjoKKwlEbyBub3QgaW50ZXJwcmV0IGFueSBtb3JlIGFyZ3VtZW50cyBhcyBvcHRpb25zLgorCis8ZmlsZT4uLi46OgorCVdoZW4gZmlsZXMgYXJlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZSBjb21tYW5kCisJY29tbWl0cyB0aGUgY29udGVudHMgb2YgdGhlIG5hbWVkIGZpbGVzLCB3aXRob3V0CisJcmVjb3JkaW5nIHRoZSBjaGFuZ2VzIGFscmVhZHkgc3RhZ2VkLiAgVGhlIGNvbnRlbnRzIG9mCisJdGhlc2UgZmlsZXMgYXJlIGFsc28gc3RhZ2VkIGZvciB0aGUgbmV4dCBjb21taXQgb24gdG9wCisJb2Ygd2hhdCBoYXZlIGJlZW4gc3RhZ2VkIGJlZm9yZS4KKworCitFWEFNUExFUworLS0tLS0tLS0KK1doZW4gcmVjb3JkaW5nIHlvdXIgb3duIHdvcmssIHRoZSBjb250ZW50cyBvZiBtb2RpZmllZCBmaWxlcyBpbgoreW91ciB3b3JraW5nIHRyZWUgYXJlIHRlbXBvcmFyaWx5IHN0b3JlZCB0byBhIHN0YWdpbmcgYXJlYQorY2FsbGVkIHRoZSAiaW5kZXgiIHdpdGggbGlua2dpdDpnaXQtYWRkWzFdLiAgQSBmaWxlIGNhbiBiZQorcmV2ZXJ0ZWQgYmFjaywgb25seSBpbiB0aGUgaW5kZXggYnV0IG5vdCBpbiB0aGUgd29ya2luZyB0cmVlLAordG8gdGhhdCBvZiB0aGUgbGFzdCBjb21taXQgd2l0aCBgZ2l0LXJlc2V0IEhFQUQgLS0gPGZpbGU+YCwKK3doaWNoIGVmZmVjdGl2ZWx5IHJldmVydHMgYGdpdC1hZGRgIGFuZCBwcmV2ZW50cyB0aGUgY2hhbmdlcyB0bwordGhpcyBmaWxlIGZyb20gcGFydGljaXBhdGluZyBpbiB0aGUgbmV4dCBjb21taXQuICBBZnRlciBidWlsZGluZwordGhlIHN0YXRlIHRvIGJlIGNvbW1pdHRlZCBpbmNyZW1lbnRhbGx5IHdpdGggdGhlc2UgY29tbWFuZHMsCitgZ2l0IGNvbW1pdGAgKHdpdGhvdXQgYW55IHBhdGhuYW1lIHBhcmFtZXRlcikgaXMgdXNlZCB0byByZWNvcmQgd2hhdAoraGFzIGJlZW4gc3RhZ2VkIHNvIGZhci4gIFRoaXMgaXMgdGhlIG1vc3QgYmFzaWMgZm9ybSBvZiB0aGUKK2NvbW1hbmQuICBBbiBleGFtcGxlOgorCistLS0tLS0tLS0tLS0KKyQgZWRpdCBoZWxsby5jCiskIGdpdCBybSBnb29kYnllLmMKKyQgZ2l0IGFkZCBoZWxsby5jCiskIGdpdCBjb21taXQKKy0tLS0tLS0tLS0tLQorCitJbnN0ZWFkIG9mIHN0YWdpbmcgZmlsZXMgYWZ0ZXIgZWFjaCBpbmRpdmlkdWFsIGNoYW5nZSwgeW91IGNhbgordGVsbCBgZ2l0IGNvbW1pdGAgdG8gbm90aWNlIHRoZSBjaGFuZ2VzIHRvIHRoZSBmaWxlcyB3aG9zZQorY29udGVudHMgYXJlIHRyYWNrZWQgaW4KK3lvdXIgd29ya2luZyB0cmVlIGFuZCBkbyBjb3JyZXNwb25kaW5nIGBnaXQgYWRkYCBhbmQgYGdpdCBybWAKK2ZvciB5b3UuICBUaGF0IGlzLCB0aGlzIGV4YW1wbGUgZG9lcyB0aGUgc2FtZSBhcyB0aGUgZWFybGllcgorZXhhbXBsZSBpZiB0aGVyZSBpcyBubyBvdGhlciBjaGFuZ2UgaW4geW91ciB3b3JraW5nIHRyZWU6CisKKy0tLS0tLS0tLS0tLQorJCBlZGl0IGhlbGxvLmMKKyQgcm0gZ29vZGJ5ZS5jCiskIGdpdCBjb21taXQgLWEKKy0tLS0tLS0tLS0tLQorCitUaGUgY29tbWFuZCBgZ2l0IGNvbW1pdCAtYWAgZmlyc3QgbG9va3MgYXQgeW91ciB3b3JraW5nIHRyZWUsCitub3RpY2VzIHRoYXQgeW91IGhhdmUgbW9kaWZpZWQgaGVsbG8uYyBhbmQgcmVtb3ZlZCBnb29kYnllLmMsCithbmQgcGVyZm9ybXMgbmVjZXNzYXJ5IGBnaXQgYWRkYCBhbmQgYGdpdCBybWAgZm9yIHlvdS4KKworQWZ0ZXIgc3RhZ2luZyBjaGFuZ2VzIHRvIG1hbnkgZmlsZXMsIHlvdSBjYW4gYWx0ZXIgdGhlIG9yZGVyIHRoZQorY2hhbmdlcyBhcmUgcmVjb3JkZWQgaW4sIGJ5IGdpdmluZyBwYXRobmFtZXMgdG8gYGdpdCBjb21taXRgLgorV2hlbiBwYXRobmFtZXMgYXJlIGdpdmVuLCB0aGUgY29tbWFuZCBtYWtlcyBhIGNvbW1pdCB0aGF0Citvbmx5IHJlY29yZHMgdGhlIGNoYW5nZXMgbWFkZSB0byB0aGUgbmFtZWQgcGF0aHM6CisKKy0tLS0tLS0tLS0tLQorJCBlZGl0IGhlbGxvLmMgaGVsbG8uaAorJCBnaXQgYWRkIGhlbGxvLmMgaGVsbG8uaAorJCBlZGl0IE1ha2VmaWxlCiskIGdpdCBjb21taXQgTWFrZWZpbGUKKy0tLS0tLS0tLS0tLQorCitUaGlzIG1ha2VzIGEgY29tbWl0IHRoYXQgcmVjb3JkcyB0aGUgbW9kaWZpY2F0aW9uIHRvIGBNYWtlZmlsZWAuCitUaGUgY2hhbmdlcyBzdGFnZWQgZm9yIGBoZWxsby5jYCBhbmQgYGhlbGxvLmhgIGFyZSBub3QgaW5jbHVkZWQKK2luIHRoZSByZXN1bHRpbmcgY29tbWl0LiAgSG93ZXZlciwgdGhlaXIgY2hhbmdlcyBhcmUgbm90IGxvc3QgLS0KK3RoZXkgYXJlIHN0aWxsIHN0YWdlZCBhbmQgbWVyZWx5IGhlbGQgYmFjay4gIEFmdGVyIHRoZSBhYm92ZQorc2VxdWVuY2UsIGlmIHlvdSBkbzoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBjb21taXQKKy0tLS0tLS0tLS0tLQorCit0aGlzIHNlY29uZCBjb21taXQgd291bGQgcmVjb3JkIHRoZSBjaGFuZ2VzIHRvIGBoZWxsby5jYCBhbmQKK2BoZWxsby5oYCBhcyBleHBlY3RlZC4KKworQWZ0ZXIgYSBtZXJnZSAoaW5pdGlhdGVkIGJ5IGVpdGhlciBsaW5rZ2l0OmdpdC1tZXJnZVsxXSBvcgorbGlua2dpdDpnaXQtcHVsbFsxXSkgc3RvcHMgYmVjYXVzZSBvZiBjb25mbGljdHMsIGNsZWFubHkgbWVyZ2VkCitwYXRocyBhcmUgYWxyZWFkeSBzdGFnZWQgdG8gYmUgY29tbWl0dGVkIGZvciB5b3UsIGFuZCBwYXRocyB0aGF0Citjb25mbGljdGVkIGFyZSBsZWZ0IGluIHVubWVyZ2VkIHN0YXRlLiAgWW91IHdvdWxkIGhhdmUgdG8gZmlyc3QKK2NoZWNrIHdoaWNoIHBhdGhzIGFyZSBjb25mbGljdGluZyB3aXRoIGxpbmtnaXQ6Z2l0LXN0YXR1c1sxXQorYW5kIGFmdGVyIGZpeGluZyB0aGVtIG1hbnVhbGx5IGluIHlvdXIgd29ya2luZyB0cmVlLCB5b3Ugd291bGQKK3N0YWdlIHRoZSByZXN1bHQgYXMgdXN1YWwgd2l0aCBsaW5rZ2l0OmdpdC1hZGRbMV06CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgc3RhdHVzIHwgZ3JlcCB1bm1lcmdlZAordW5tZXJnZWQ6IGhlbGxvLmMKKyQgZWRpdCBoZWxsby5jCiskIGdpdCBhZGQgaGVsbG8uYworLS0tLS0tLS0tLS0tCisKK0FmdGVyIHJlc29sdmluZyBjb25mbGljdHMgYW5kIHN0YWdpbmcgdGhlIHJlc3VsdCwgYGdpdCBscy1maWxlcyAtdWAKK3dvdWxkIHN0b3AgbWVudGlvbmluZyB0aGUgY29uZmxpY3RlZCBwYXRoLiAgV2hlbiB5b3UgYXJlIGRvbmUsCitydW4gYGdpdCBjb21taXRgIHRvIGZpbmFsbHkgcmVjb3JkIHRoZSBtZXJnZToKKworLS0tLS0tLS0tLS0tCiskIGdpdCBjb21taXQKKy0tLS0tLS0tLS0tLQorCitBcyB3aXRoIHRoZSBjYXNlIHRvIHJlY29yZCB5b3VyIG93biBjaGFuZ2VzLCB5b3UgY2FuIHVzZSBgLWFgCitvcHRpb24gdG8gc2F2ZSB0eXBpbmcuICBPbmUgZGlmZmVyZW5jZSBpcyB0aGF0IGR1cmluZyBhIG1lcmdlCityZXNvbHV0aW9uLCB5b3UgY2Fubm90IHVzZSBgZ2l0IGNvbW1pdGAgd2l0aCBwYXRobmFtZXMgdG8KK2FsdGVyIHRoZSBvcmRlciB0aGUgY2hhbmdlcyBhcmUgY29tbWl0dGVkLCBiZWNhdXNlIHRoZSBtZXJnZQorc2hvdWxkIGJlIHJlY29yZGVkIGFzIGEgc2luZ2xlIGNvbW1pdC4gIEluIGZhY3QsIHRoZSBjb21tYW5kCityZWZ1c2VzIHRvIHJ1biB3aGVuIGdpdmVuIHBhdGhuYW1lcyAoYnV0IHNlZSBgLWlgIG9wdGlvbikuCisKKworRElTQ1VTU0lPTgorLS0tLS0tLS0tLQorCitUaG91Z2ggbm90IHJlcXVpcmVkLCBpdCdzIGEgZ29vZCBpZGVhIHRvIGJlZ2luIHRoZSBjb21taXQgbWVzc2FnZQord2l0aCBhIHNpbmdsZSBzaG9ydCAobGVzcyB0aGFuIDUwIGNoYXJhY3RlcikgbGluZSBzdW1tYXJpemluZyB0aGUKK2NoYW5nZSwgZm9sbG93ZWQgYnkgYSBibGFuayBsaW5lIGFuZCB0aGVuIGEgbW9yZSB0aG9yb3VnaCBkZXNjcmlwdGlvbi4KK1Rvb2xzIHRoYXQgdHVybiBjb21taXRzIGludG8gZW1haWwsIGZvciBleGFtcGxlLCB1c2UgdGhlIGZpcnN0IGxpbmUKK29uIHRoZSBTdWJqZWN0OiBsaW5lIGFuZCB0aGUgcmVzdCBvZiB0aGUgY29tbWl0IGluIHRoZSBib2R5LgorCitpbmNsdWRlOjppMThuLnR4dFtdCisKK0VOVklST05NRU5UIEFORCBDT05GSUdVUkFUSU9OIFZBUklBQkxFUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgZWRpdG9yIHVzZWQgdG8gZWRpdCB0aGUgY29tbWl0IGxvZyBtZXNzYWdlIHdpbGwgYmUgY2hvc2VuIGZyb20gdGhlCitHSVRfRURJVE9SIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgY29yZS5lZGl0b3IgY29uZmlndXJhdGlvbiB2YXJpYWJsZSwgdGhlCitWSVNVQUwgZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIHRoZSBFRElUT1IgZW52aXJvbm1lbnQgdmFyaWFibGUgKGluIHRoYXQKK29yZGVyKS4KKworSE9PS1MKKy0tLS0tCitUaGlzIGNvbW1hbmQgY2FuIHJ1biBgY29tbWl0LW1zZ2AsIGBwcmVwYXJlLWNvbW1pdC1tc2dgLCBgcHJlLWNvbW1pdGAsCithbmQgYHBvc3QtY29tbWl0YCBob29rcy4gIFNlZSBsaW5rOmhvb2tzLmh0bWxbaG9va3NdIGZvciBtb3JlCitpbmZvcm1hdGlvbi4KKworCitTRUUgQUxTTworLS0tLS0tLS0KK2xpbmtnaXQ6Z2l0LWFkZFsxXSwKK2xpbmtnaXQ6Z2l0LXJtWzFdLAorbGlua2dpdDpnaXQtbXZbMV0sCitsaW5rZ2l0OmdpdC1tZXJnZVsxXSwKK2xpbmtnaXQ6Z2l0LWNvbW1pdC10cmVlWzFdCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4gYW5kCitKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jb25maWcudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtY29uZmlnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTE2MTcxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY29uZmlnLnR4dApAQCAtMCwwICsxLDMzNSBAQAorZ2l0LWNvbmZpZygxKQorPT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtY29uZmlnIC0gR2V0IGFuZCBzZXQgcmVwb3NpdG9yeSBvciBnbG9iYWwgb3B0aW9ucworCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1jb25maWcnIFs8ZmlsZS1vcHRpb24+XSBbdHlwZV0gWy16fC0tbnVsbF0gbmFtZSBbdmFsdWUgW3ZhbHVlX3JlZ2V4XV0KKydnaXQtY29uZmlnJyBbPGZpbGUtb3B0aW9uPl0gW3R5cGVdIC0tYWRkIG5hbWUgdmFsdWUKKydnaXQtY29uZmlnJyBbPGZpbGUtb3B0aW9uPl0gW3R5cGVdIC0tcmVwbGFjZS1hbGwgbmFtZSBbdmFsdWUgW3ZhbHVlX3JlZ2V4XV0KKydnaXQtY29uZmlnJyBbPGZpbGUtb3B0aW9uPl0gW3R5cGVdIFstenwtLW51bGxdIC0tZ2V0IG5hbWUgW3ZhbHVlX3JlZ2V4XQorJ2dpdC1jb25maWcnIFs8ZmlsZS1vcHRpb24+XSBbdHlwZV0gWy16fC0tbnVsbF0gLS1nZXQtYWxsIG5hbWUgW3ZhbHVlX3JlZ2V4XQorJ2dpdC1jb25maWcnIFs8ZmlsZS1vcHRpb24+XSBbdHlwZV0gWy16fC0tbnVsbF0gLS1nZXQtcmVnZXhwIG5hbWVfcmVnZXggW3ZhbHVlX3JlZ2V4XQorJ2dpdC1jb25maWcnIFs8ZmlsZS1vcHRpb24+XSAtLXVuc2V0IG5hbWUgW3ZhbHVlX3JlZ2V4XQorJ2dpdC1jb25maWcnIFs8ZmlsZS1vcHRpb24+XSAtLXVuc2V0LWFsbCBuYW1lIFt2YWx1ZV9yZWdleF0KKydnaXQtY29uZmlnJyBbPGZpbGUtb3B0aW9uPl0gLS1yZW5hbWUtc2VjdGlvbiBvbGRfbmFtZSBuZXdfbmFtZQorJ2dpdC1jb25maWcnIFs8ZmlsZS1vcHRpb24+XSAtLXJlbW92ZS1zZWN0aW9uIG5hbWUKKydnaXQtY29uZmlnJyBbPGZpbGUtb3B0aW9uPl0gWy16fC0tbnVsbF0gLWwgfCAtLWxpc3QKKydnaXQtY29uZmlnJyBbPGZpbGUtb3B0aW9uPl0gLS1nZXQtY29sb3IgbmFtZSBbZGVmYXVsdF0KKydnaXQtY29uZmlnJyBbPGZpbGUtb3B0aW9uPl0gLS1nZXQtY29sb3Jib29sIG5hbWUgW3N0ZG91dC1pcy10dHldCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorWW91IGNhbiBxdWVyeS9zZXQvcmVwbGFjZS91bnNldCBvcHRpb25zIHdpdGggdGhpcyBjb21tYW5kLiBUaGUgbmFtZSBpcworYWN0dWFsbHkgdGhlIHNlY3Rpb24gYW5kIHRoZSBrZXkgc2VwYXJhdGVkIGJ5IGEgZG90LCBhbmQgdGhlIHZhbHVlIHdpbGwgYmUKK2VzY2FwZWQuCisKK011bHRpcGxlIGxpbmVzIGNhbiBiZSBhZGRlZCB0byBhbiBvcHRpb24gYnkgdXNpbmcgdGhlICctLWFkZCcgb3B0aW9uLgorSWYgeW91IHdhbnQgdG8gdXBkYXRlIG9yIHVuc2V0IGFuIG9wdGlvbiB3aGljaCBjYW4gb2NjdXIgb24gbXVsdGlwbGUKK2xpbmVzLCBhIFBPU0lYIHJlZ2V4cCBgdmFsdWVfcmVnZXhgIG5lZWRzIHRvIGJlIGdpdmVuLiAgT25seSB0aGUKK2V4aXN0aW5nIHZhbHVlcyB0aGF0IG1hdGNoIHRoZSByZWdleHAgYXJlIHVwZGF0ZWQgb3IgdW5zZXQuICBJZgoreW91IHdhbnQgdG8gaGFuZGxlIHRoZSBsaW5lcyB0aGF0IGRvICpub3QqIG1hdGNoIHRoZSByZWdleCwganVzdAorcHJlcGVuZCBhIHNpbmdsZSBleGNsYW1hdGlvbiBtYXJrIGluIGZyb250IChzZWUgYWxzbyA8PEVYQU1QTEVTPj4pLgorCitUaGUgdHlwZSBzcGVjaWZpZXIgY2FuIGJlIGVpdGhlciAnLS1pbnQnIG9yICctLWJvb2wnLCB3aGljaCB3aWxsIG1ha2UKKydnaXQtY29uZmlnJyBlbnN1cmUgdGhhdCB0aGUgdmFyaWFibGUocykgYXJlIG9mIHRoZSBnaXZlbiB0eXBlIGFuZAorY29udmVydCB0aGUgdmFsdWUgdG8gdGhlIGNhbm9uaWNhbCBmb3JtIChzaW1wbGUgZGVjaW1hbCBudW1iZXIgZm9yIGludCwKK2EgInRydWUiIG9yICJmYWxzZSIgc3RyaW5nIGZvciBib29sKS4gIElmIG5vIHR5cGUgc3BlY2lmaWVyIGlzIHBhc3NlZCwKK25vIGNoZWNrcyBvciB0cmFuc2Zvcm1hdGlvbnMgYXJlIHBlcmZvcm1lZCBvbiB0aGUgdmFsdWUuCisKK1RoZSBmaWxlLW9wdGlvbiBjYW4gYmUgb25lIG9mICctLXN5c3RlbScsICctLWdsb2JhbCcgb3IgJy0tZmlsZScKK3doaWNoIHNwZWNpZnkgd2hlcmUgdGhlIHZhbHVlcyB3aWxsIGJlIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvLgorVGhlIGRlZmF1bHQgaXMgdG8gYXNzdW1lIHRoZSBjb25maWcgZmlsZSBvZiB0aGUgY3VycmVudCByZXBvc2l0b3J5LAorLmdpdC9jb25maWcgdW5sZXNzIGRlZmluZWQgb3RoZXJ3aXNlIHdpdGggR0lUX0RJUiBhbmQgR0lUX0NPTkZJRworKHNlZSA8PEZJTEVTPj4pLgorCitUaGlzIGNvbW1hbmQgd2lsbCBmYWlsIGlmOgorCisuIFRoZSBjb25maWcgZmlsZSBpcyBpbnZhbGlkLAorLiBDYW4gbm90IHdyaXRlIHRvIHRoZSBjb25maWcgZmlsZSwKKy4gbm8gc2VjdGlvbiB3YXMgcHJvdmlkZWQsCisuIHRoZSBzZWN0aW9uIG9yIGtleSBpcyBpbnZhbGlkLAorLiB5b3UgdHJ5IHRvIHVuc2V0IGFuIG9wdGlvbiB3aGljaCBkb2VzIG5vdCBleGlzdCwKKy4geW91IHRyeSB0byB1bnNldC9zZXQgYW4gb3B0aW9uIGZvciB3aGljaCBtdWx0aXBsZSBsaW5lcyBtYXRjaCwgb3IKKy4geW91IHVzZSAnLS1nbG9iYWwnIG9wdGlvbiB3aXRob3V0ICRIT01FIGJlaW5nIHByb3Blcmx5IHNldC4KKworCitPUFRJT05TCistLS0tLS0tCisKKy0tcmVwbGFjZS1hbGw6OgorCURlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVwbGFjZSBhdCBtb3N0IG9uZSBsaW5lLiBUaGlzIHJlcGxhY2VzCisJYWxsIGxpbmVzIG1hdGNoaW5nIHRoZSBrZXkgKGFuZCBvcHRpb25hbGx5IHRoZSB2YWx1ZV9yZWdleCkuCisKKy0tYWRkOjoKKwlBZGRzIGEgbmV3IGxpbmUgdG8gdGhlIG9wdGlvbiB3aXRob3V0IGFsdGVyaW5nIGFueSBleGlzdGluZworCXZhbHVlcy4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgcHJvdmlkaW5nICdeJCcgYXMgdGhlIHZhbHVlX3JlZ2V4LgorCistLWdldDo6CisJR2V0IHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBrZXkgKG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgYSByZWdleAorCW1hdGNoaW5nIHRoZSB2YWx1ZSkuIFJldHVybnMgZXJyb3IgY29kZSAxIGlmIHRoZSBrZXkgd2FzIG5vdAorCWZvdW5kIGFuZCBlcnJvciBjb2RlIDIgaWYgbXVsdGlwbGUga2V5IHZhbHVlcyB3ZXJlIGZvdW5kLgorCistLWdldC1hbGw6OgorCUxpa2UgZ2V0LCBidXQgZG9lcyBub3QgZmFpbCBpZiB0aGUgbnVtYmVyIG9mIHZhbHVlcyBmb3IgdGhlIGtleQorCWlzIG5vdCBleGFjdGx5IG9uZS4KKworLS1nZXQtcmVnZXhwOjoKKwlMaWtlIC0tZ2V0LWFsbCwgYnV0IGludGVycHJldHMgdGhlIG5hbWUgYXMgYSByZWd1bGFyIGV4cHJlc3Npb24uCisJQWxzbyBvdXRwdXRzIHRoZSBrZXkgbmFtZXMuCisKKy0tZ2xvYmFsOjoKKwlGb3Igd3JpdGluZyBvcHRpb25zOiB3cml0ZSB0byBnbG9iYWwgfi8uZ2l0Y29uZmlnIGZpbGUgcmF0aGVyIHRoYW4KKwl0aGUgcmVwb3NpdG9yeSAuZ2l0L2NvbmZpZy4KKysKK0ZvciByZWFkaW5nIG9wdGlvbnM6IHJlYWQgb25seSBmcm9tIGdsb2JhbCB+Ly5naXRjb25maWcgcmF0aGVyIHRoYW4KK2Zyb20gYWxsIGF2YWlsYWJsZSBmaWxlcy4KKysKK1NlZSBhbHNvIDw8RklMRVM+Pi4KKworLS1zeXN0ZW06OgorCUZvciB3cml0aW5nIG9wdGlvbnM6IHdyaXRlIHRvIHN5c3RlbS13aWRlICQocHJlZml4KS9ldGMvZ2l0Y29uZmlnCisJcmF0aGVyIHRoYW4gdGhlIHJlcG9zaXRvcnkgLmdpdC9jb25maWcuCisrCitGb3IgcmVhZGluZyBvcHRpb25zOiByZWFkIG9ubHkgZnJvbSBzeXN0ZW0td2lkZSAkKHByZWZpeCkvZXRjL2dpdGNvbmZpZworcmF0aGVyIHRoYW4gZnJvbSBhbGwgYXZhaWxhYmxlIGZpbGVzLgorKworU2VlIGFsc28gPDxGSUxFUz4+LgorCistZiBjb25maWctZmlsZSwgLS1maWxlIGNvbmZpZy1maWxlOjoKKwlVc2UgdGhlIGdpdmVuIGNvbmZpZyBmaWxlIGluc3RlYWQgb2YgdGhlIG9uZSBzcGVjaWZpZWQgYnkgR0lUX0NPTkZJRy4KKworLS1yZW1vdmUtc2VjdGlvbjo6CisJUmVtb3ZlIHRoZSBnaXZlbiBzZWN0aW9uIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKworLS1yZW5hbWUtc2VjdGlvbjo6CisJUmVuYW1lIHRoZSBnaXZlbiBzZWN0aW9uIHRvIGEgbmV3IG5hbWUuCisKKy0tdW5zZXQ6OgorCVJlbW92ZSB0aGUgbGluZSBtYXRjaGluZyB0aGUga2V5IGZyb20gY29uZmlnIGZpbGUuCisKKy0tdW5zZXQtYWxsOjoKKwlSZW1vdmUgYWxsIGxpbmVzIG1hdGNoaW5nIHRoZSBrZXkgZnJvbSBjb25maWcgZmlsZS4KKworLWwsIC0tbGlzdDo6CisJTGlzdCBhbGwgdmFyaWFibGVzIHNldCBpbiBjb25maWcgZmlsZS4KKworLS1ib29sOjoKKwlnaXQtY29uZmlnIHdpbGwgZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBpcyAidHJ1ZSIgb3IgImZhbHNlIgorCistLWludDo6CisJZ2l0LWNvbmZpZyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBvdXRwdXQgaXMgYSBzaW1wbGUKKwlkZWNpbWFsIG51bWJlci4gIEFuIG9wdGlvbmFsIHZhbHVlIHN1ZmZpeCBvZiAnaycsICdtJywgb3IgJ2cnCisJaW4gdGhlIGNvbmZpZyBmaWxlIHdpbGwgY2F1c2UgdGhlIHZhbHVlIHRvIGJlIG11bHRpcGxpZWQKKwlieSAxMDI0LCAxMDQ4NTc2LCBvciAxMDczNzQxODI0IHByaW9yIHRvIG91dHB1dC4KKworLXosIC0tbnVsbDo6CisJRm9yIGFsbCBvcHRpb25zIHRoYXQgb3V0cHV0IHZhbHVlcyBhbmQvb3Iga2V5cywgYWx3YXlzCisJZW5kIHZhbHVlcyB3aXRoIHRoZSBudWxsIGNoYXJhY3RlciAoaW5zdGVhZCBvZiBhCisJbmV3bGluZSkuIFVzZSBuZXdsaW5lIGluc3RlYWQgYXMgYSBkZWxpbWl0ZXIgYmV0d2VlbgorCWtleSBhbmQgdmFsdWUuIFRoaXMgYWxsb3dzIGZvciBzZWN1cmUgcGFyc2luZyBvZiB0aGUKKwlvdXRwdXQgd2l0aG91dCBnZXR0aW5nIGNvbmZ1c2VkIGUuZy4gYnkgdmFsdWVzIHRoYXQKKwljb250YWluIGxpbmUgYnJlYWtzLgorCistLWdldC1jb2xvcmJvb2wgbmFtZSBbc3Rkb3V0LWlzLXR0eV06OgorCisJRmluZCB0aGUgY29sb3Igc2V0dGluZyBmb3IgYG5hbWVgIChlLmcuIGBjb2xvci5kaWZmYCkgYW5kIG91dHB1dAorCSJ0cnVlIiBvciAiZmFsc2UiLiAgYHN0ZG91dC1pcy10dHlgIHNob3VsZCBiZSBlaXRoZXIgInRydWUiIG9yCisJImZhbHNlIiwgYW5kIGlzIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGNvbmZpZ3VyYXRpb24gc2F5cworCSJhdXRvIi4gIElmIGBzdGRvdXQtaXMtdHR5YCBpcyBtaXNzaW5nLCB0aGVuIGNoZWNrcyB0aGUgc3RhbmRhcmQKKwlvdXRwdXQgb2YgdGhlIGNvbW1hbmQgaXRzZWxmLCBhbmQgZXhpdHMgd2l0aCBzdGF0dXMgMCBpZiBjb2xvcgorCWlzIHRvIGJlIHVzZWQsIG9yIGV4aXRzIHdpdGggc3RhdHVzIDEgb3RoZXJ3aXNlLgorCistLWdldC1jb2xvciBuYW1lIGRlZmF1bHQ6OgorCisJRmluZCB0aGUgY29sb3IgY29uZmlndXJlZCBmb3IgYG5hbWVgIChlLmcuIGBjb2xvci5kaWZmLm5ld2ApIGFuZAorCW91dHB1dCBpdCBhcyB0aGUgQU5TSSBjb2xvciBlc2NhcGUgc2VxdWVuY2UgdG8gdGhlIHN0YW5kYXJkCisJb3V0cHV0LiAgVGhlIG9wdGlvbmFsIGBkZWZhdWx0YCBwYXJhbWV0ZXIgaXMgdXNlZCBpbnN0ZWFkLCBpZgorCXRoZXJlIGlzIG5vIGNvbG9yIGNvbmZpZ3VyZWQgZm9yIGBuYW1lYC4KKworW1tGSUxFU11dCitGSUxFUworLS0tLS0KKworSWYgbm90IHNldCBleHBsaWNpdGx5IHdpdGggJy0tZmlsZScsIHRoZXJlIGFyZSB0aHJlZSBmaWxlcyB3aGVyZQorZ2l0LWNvbmZpZyB3aWxsIHNlYXJjaCBmb3IgY29uZmlndXJhdGlvbiBvcHRpb25zOgorCiskR0lUX0RJUi9jb25maWc6OgorCVJlcG9zaXRvcnkgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmaWxlLiAoVGhlIGZpbGVuYW1lIGlzCisJb2YgY291cnNlIHJlbGF0aXZlIHRvIHRoZSByZXBvc2l0b3J5IHJvb3QsIG5vdCB0aGUgd29ya2luZworCWRpcmVjdG9yeS4pCisKK34vLmdpdGNvbmZpZzo6CisJVXNlci1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGZpbGUuIEFsc28gY2FsbGVkICJnbG9iYWwiCisJY29uZmlndXJhdGlvbiBmaWxlLgorCiskKHByZWZpeCkvZXRjL2dpdGNvbmZpZzo6CisJU3lzdGVtLXdpZGUgY29uZmlndXJhdGlvbiBmaWxlLgorCitJZiBubyBmdXJ0aGVyIG9wdGlvbnMgYXJlIGdpdmVuLCBhbGwgcmVhZGluZyBvcHRpb25zIHdpbGwgcmVhZCBhbGwgb2YgdGhlc2UKK2ZpbGVzIHRoYXQgYXJlIGF2YWlsYWJsZS4gSWYgdGhlIGdsb2JhbCBvciB0aGUgc3lzdGVtLXdpZGUgY29uZmlndXJhdGlvbgorZmlsZSBhcmUgbm90IGF2YWlsYWJsZSB0aGV5IHdpbGwgYmUgaWdub3JlZC4gSWYgdGhlIHJlcG9zaXRvcnkgY29uZmlndXJhdGlvbgorZmlsZSBpcyBub3QgYXZhaWxhYmxlIG9yIHJlYWRhYmxlLCBnaXQtY29uZmlnIHdpbGwgZXhpdCB3aXRoIGEgbm9uLXplcm8KK2Vycm9yIGNvZGUuIEhvd2V2ZXIsIGluIG5laXRoZXIgY2FzZSB3aWxsIGFuIGVycm9yIG1lc3NhZ2UgYmUgaXNzdWVkLgorCitBbGwgd3JpdGluZyBvcHRpb25zIHdpbGwgcGVyIGRlZmF1bHQgd3JpdGUgdG8gdGhlIHJlcG9zaXRvcnkgc3BlY2lmaWMKK2NvbmZpZ3VyYXRpb24gZmlsZS4gTm90ZSB0aGF0IHRoaXMgYWxzbyBhZmZlY3RzIG9wdGlvbnMgbGlrZSAnLS1yZXBsYWNlLWFsbCcKK2FuZCAnLS11bnNldCcuICpnaXQtY29uZmlnIHdpbGwgb25seSBldmVyIGNoYW5nZSBvbmUgZmlsZSBhdCBhIHRpbWUqLgorCitZb3UgY2FuIG92ZXJyaWRlIHRoZXNlIHJ1bGVzIGVpdGhlciBieSBjb21tYW5kIGxpbmUgb3B0aW9ucyBvciBieSBlbnZpcm9ubWVudAordmFyaWFibGVzLiBUaGUgJy0tZ2xvYmFsJyBhbmQgdGhlICctLXN5c3RlbScgb3B0aW9ucyB3aWxsIGxpbWl0IHRoZSBmaWxlIHVzZWQKK3RvIHRoZSBnbG9iYWwgb3Igc3lzdGVtLXdpZGUgZmlsZSByZXNwZWN0aXZlbHkuIFRoZSBHSVRfQ09ORklHIGVudmlyb25tZW50Cit2YXJpYWJsZSBoYXMgYSBzaW1pbGFyIGVmZmVjdCwgYnV0IHlvdSBjYW4gc3BlY2lmeSBhbnkgZmlsZW5hbWUgeW91IHdhbnQuCisKK1RoZSBHSVRfQ09ORklHX0xPQ0FMIGVudmlyb25tZW50IHZhcmlhYmxlIG9uIHRoZSBvdGhlciBoYW5kIG9ubHkgY2hhbmdlcwordGhlIG5hbWUgdXNlZCBpbnN0ZWFkIG9mIHRoZSByZXBvc2l0b3J5IGNvbmZpZ3VyYXRpb24gZmlsZS4gVGhlIGdsb2JhbCBhbmQKK3RoZSBzeXN0ZW0td2lkZSBjb25maWd1cmF0aW9uIGZpbGVzIHdpbGwgc3RpbGwgYmUgcmVhZC4gKEZvciB3cml0aW5nIG9wdGlvbnMKK3RoaXMgd2lsbCBvYnZpb3VzbHkgcmVzdWx0IGluIHRoZSBzYW1lIGJlaGF2aW9yIGFzIHVzaW5nIEdJVF9DT05GSUcuKQorCisKK0VOVklST05NRU5UCistLS0tLS0tLS0tLQorCitHSVRfQ09ORklHOjoKKwlUYWtlIHRoZSBjb25maWd1cmF0aW9uIGZyb20gdGhlIGdpdmVuIGZpbGUgaW5zdGVhZCBvZiAuZ2l0L2NvbmZpZy4KKwlVc2luZyB0aGUgIi0tZ2xvYmFsIiBvcHRpb24gZm9yY2VzIHRoaXMgdG8gfi8uZ2l0Y29uZmlnLiBVc2luZyB0aGUKKwkiLS1zeXN0ZW0iIG9wdGlvbiBmb3JjZXMgdGhpcyB0byAkKHByZWZpeCkvZXRjL2dpdGNvbmZpZy4KKworR0lUX0NPTkZJR19MT0NBTDo6CisJVGFrZSB0aGUgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBnaXZlbiBmaWxlIGluc3RlYWQgaWYgLmdpdC9jb25maWcuCisJU3RpbGwgcmVhZCB0aGUgZ2xvYmFsIGFuZCB0aGUgc3lzdGVtLXdpZGUgY29uZmlndXJhdGlvbiBmaWxlcywgdGhvdWdoLgorCitTZWUgYWxzbyA8PEZJTEVTPj4uCisKKworW1tFWEFNUExFU11dCitFWEFNUExFUworLS0tLS0tLS0KKworR2l2ZW4gYSAuZ2l0L2NvbmZpZyBsaWtlIHRoaXM6CisKKwkjCisJIyBUaGlzIGlzIHRoZSBjb25maWcgZmlsZSwgYW5kCisJIyBhICcjJyBvciAnOycgY2hhcmFjdGVyIGluZGljYXRlcworCSMgYSBjb21tZW50CisJIworCisJOyBjb3JlIHZhcmlhYmxlcworCVtjb3JlXQorCQk7IERvbid0IHRydXN0IGZpbGUgbW9kZXMKKwkJZmlsZW1vZGUgPSBmYWxzZQorCisJOyBPdXIgZGlmZiBhbGdvcml0aG0KKwlbZGlmZl0KKwkJZXh0ZXJuYWwgPSAiL3Vzci9sb2NhbC9iaW4vZ251LWRpZmYgLXUiCisJCXJlbmFtZXMgPSB0cnVlCisKKwk7IFByb3h5IHNldHRpbmdzCisJW2NvcmVdCisJCWdpdHByb3h5PSJwcm94eS1jb21tYW5kIiBmb3Iga2VybmVsLm9yZworCQlnaXRwcm94eT1kZWZhdWx0LXByb3h5IDsgZm9yIGFsbCB0aGUgcmVzdAorCit5b3UgY2FuIHNldCB0aGUgZmlsZW1vZGUgdG8gdHJ1ZSB3aXRoCisKKy0tLS0tLS0tLS0tLQorJSBnaXQgY29uZmlnIGNvcmUuZmlsZW1vZGUgdHJ1ZQorLS0tLS0tLS0tLS0tCisKK1RoZSBoeXBvdGhldGljYWwgcHJveHkgY29tbWFuZCBlbnRyaWVzIGFjdHVhbGx5IGhhdmUgYSBwb3N0Zml4IHRvIGRpc2Nlcm4KK3doYXQgVVJMIHRoZXkgYXBwbHkgdG8uIEhlcmUgaXMgaG93IHRvIGNoYW5nZSB0aGUgZW50cnkgZm9yIGtlcm5lbC5vcmcKK3RvICJzc2giLgorCistLS0tLS0tLS0tLS0KKyUgZ2l0IGNvbmZpZyBjb3JlLmdpdHByb3h5ICcic3NoIiBmb3Iga2VybmVsLm9yZycgJ2ZvciBrZXJuZWwub3JnJCcKKy0tLS0tLS0tLS0tLQorCitUaGlzIG1ha2VzIHN1cmUgdGhhdCBvbmx5IHRoZSBrZXkvdmFsdWUgcGFpciBmb3Iga2VybmVsLm9yZyBpcyByZXBsYWNlZC4KKworVG8gZGVsZXRlIHRoZSBlbnRyeSBmb3IgcmVuYW1lcywgZG8KKworLS0tLS0tLS0tLS0tCislIGdpdCBjb25maWcgLS11bnNldCBkaWZmLnJlbmFtZXMKKy0tLS0tLS0tLS0tLQorCitJZiB5b3Ugd2FudCB0byBkZWxldGUgYW4gZW50cnkgZm9yIGEgbXVsdGl2YXIgKGxpa2UgY29yZS5naXRwcm94eSBhYm92ZSksCit5b3UgaGF2ZSB0byBwcm92aWRlIGEgcmVnZXggbWF0Y2hpbmcgdGhlIHZhbHVlIG9mIGV4YWN0bHkgb25lIGxpbmUuCisKK1RvIHF1ZXJ5IHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBrZXksIGRvCisKKy0tLS0tLS0tLS0tLQorJSBnaXQgY29uZmlnIC0tZ2V0IGNvcmUuZmlsZW1vZGUKKy0tLS0tLS0tLS0tLQorCitvcgorCistLS0tLS0tLS0tLS0KKyUgZ2l0IGNvbmZpZyBjb3JlLmZpbGVtb2RlCistLS0tLS0tLS0tLS0KKworb3IsIHRvIHF1ZXJ5IGEgbXVsdGl2YXI6CisKKy0tLS0tLS0tLS0tLQorJSBnaXQgY29uZmlnIC0tZ2V0IGNvcmUuZ2l0cHJveHkgImZvciBrZXJuZWwub3JnJCIKKy0tLS0tLS0tLS0tLQorCitJZiB5b3Ugd2FudCB0byBrbm93IGFsbCB0aGUgdmFsdWVzIGZvciBhIG11bHRpdmFyLCBkbzoKKworLS0tLS0tLS0tLS0tCislIGdpdCBjb25maWcgLS1nZXQtYWxsIGNvcmUuZ2l0cHJveHkKKy0tLS0tLS0tLS0tLQorCitJZiB5b3UgbGlrZSB0byBsaXZlIGRhbmdlcm91cywgeW91IGNhbiByZXBsYWNlICphbGwqIGNvcmUuZ2l0cHJveHkgYnkgYQorbmV3IG9uZSB3aXRoCisKKy0tLS0tLS0tLS0tLQorJSBnaXQgY29uZmlnIC0tcmVwbGFjZS1hbGwgY29yZS5naXRwcm94eSBzc2gKKy0tLS0tLS0tLS0tLQorCitIb3dldmVyLCBpZiB5b3UgcmVhbGx5IG9ubHkgd2FudCB0byByZXBsYWNlIHRoZSBsaW5lIGZvciB0aGUgZGVmYXVsdCBwcm94eSwKK2kuZS4gdGhlIG9uZSB3aXRob3V0IGEgImZvciAuLi4iIHBvc3RmaXgsIGRvIHNvbWV0aGluZyBsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLQorJSBnaXQgY29uZmlnIGNvcmUuZ2l0cHJveHkgc3NoICchIGZvciAnCistLS0tLS0tLS0tLS0KKworVG8gYWN0dWFsbHkgbWF0Y2ggb25seSB2YWx1ZXMgd2l0aCBhbiBleGNsYW1hdGlvbiBtYXJrLCB5b3UgaGF2ZSB0bworCistLS0tLS0tLS0tLS0KKyUgZ2l0IGNvbmZpZyBzZWN0aW9uLmtleSB2YWx1ZSAnWyFdJworLS0tLS0tLS0tLS0tCisKK1RvIGFkZCBhIG5ldyBwcm94eSwgd2l0aG91dCBhbHRlcmluZyBhbnkgb2YgdGhlIGV4aXN0aW5nIG9uZXMsIHVzZQorCistLS0tLS0tLS0tLS0KKyUgZ2l0IGNvbmZpZyBjb3JlLmdpdHByb3h5ICcicHJveHktY29tbWFuZCIgZm9yIGV4YW1wbGUuY29tJworLS0tLS0tLS0tLS0tCisKK0FuIGV4YW1wbGUgdG8gdXNlIGN1c3RvbWl6ZWQgY29sb3IgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBpbiB5b3VyCitzY3JpcHQ6CisKKy0tLS0tLS0tLS0tLQorIyEvYmluL3NoCitXUz0kKGdpdCBjb25maWcgLS1nZXQtY29sb3IgY29sb3IuZGlmZi53aGl0ZXNwYWNlICJibHVlIHJldmVyc2UiKQorUkVTRVQ9JChnaXQgY29uZmlnIC0tZ2V0LWNvbG9yICIiICJyZXNldCIpCitlY2hvICIke1dTfXlvdXIgd2hpdGVzcGFjZSBjb2xvciBvciBibHVlIHJldmVyc2Uke1JFU0VUfSIKKy0tLS0tLS0tLS0tLQorCitpbmNsdWRlOjpjb25maWcudHh0W10KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKb2hhbm5lcyBTY2hpbmRlbGluIDxKb2hhbm5lcy5TY2hpbmRlbGluQGdteC5kZT4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSm9oYW5uZXMgU2NoaW5kZWxpbiwgUGV0ciBCYXVkaXMgYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY291bnQtb2JqZWN0cy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jb3VudC1vYmplY3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmIwOGU5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY291bnQtb2JqZWN0cy50eHQKQEAgLTAsMCArMSwzNyBAQAorZ2l0LWNvdW50LW9iamVjdHMoMSkKKz09PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jb3VudC1vYmplY3RzIC0gQ291bnQgdW5wYWNrZWQgbnVtYmVyIG9mIG9iamVjdHMgYW5kIHRoZWlyIGRpc2sgY29uc3VtcHRpb24KKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWNvdW50LW9iamVjdHMnIFstdl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIGNvdW50cyB0aGUgbnVtYmVyIG9mIHVucGFja2VkIG9iamVjdCBmaWxlcyBhbmQgZGlzayBzcGFjZSBjb25zdW1lZCBieQordGhlbSwgdG8gaGVscCB5b3UgZGVjaWRlIHdoZW4gaXQgaXMgYSBnb29kIHRpbWUgdG8gcmVwYWNrLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy12OjoKKwlJbiBhZGRpdGlvbiB0byB0aGUgbnVtYmVyIG9mIGxvb3NlIG9iamVjdHMgYW5kIGRpc2sKKwlzcGFjZSBjb25zdW1lZCwgaXQgcmVwb3J0cyB0aGUgbnVtYmVyIG9mIGluLXBhY2sKKwlvYmplY3RzLCBudW1iZXIgb2YgcGFja3MsIGFuZCBudW1iZXIgb2Ygb2JqZWN0cyB0aGF0IGNhbiBiZQorCXJlbW92ZWQgYnkgcnVubmluZyBgZ2l0LXBydW5lLXBhY2tlZGAuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jdnNleHBvcnRjb21taXQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtY3ZzZXhwb3J0Y29tbWl0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQ3YjRjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY3ZzZXhwb3J0Y29tbWl0LnR4dApAQCAtMCwwICsxLDEwOSBAQAorZ2l0LWN2c2V4cG9ydGNvbW1pdCgxKQorPT09PT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtY3ZzZXhwb3J0Y29tbWl0IC0gRXhwb3J0IGEgc2luZ2xlIGNvbW1pdCB0byBhIENWUyBjaGVja291dAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1jdnNleHBvcnRjb21taXQnIFstaF0gWy11XSBbLXZdIFstY10gWy1QXSBbLXBdIFstYV0gWy1kIGN2c3Jvb3RdIFstdyBjdnN3b3JrZGlyXSBbLWZdIFstbSBtc2dwcmVmaXhdIFtQQVJFTlRDT01NSVRdIENPTU1JVElECisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitFeHBvcnRzIGEgY29tbWl0IGZyb20gR0lUIHRvIGEgQ1ZTIGNoZWNrb3V0LCBtYWtpbmcgaXQgZWFzaWVyCit0byBtZXJnZSBwYXRjaGVzIGZyb20gYSBnaXQgcmVwb3NpdG9yeSBpbnRvIGEgQ1ZTIHJlcG9zaXRvcnkuCisKK1NwZWNpZnkgdGhlIG5hbWUgb2YgYSBDVlMgY2hlY2tvdXQgdXNpbmcgdGhlIC13IHN3aXRjaCBvciBleGVjdXRlIGl0Citmcm9tIHRoZSByb290IG9mIHRoZSBDVlMgd29ya2luZyBjb3B5LiBJbiB0aGUgbGF0dGVyIGNhc2UgR0lUX0RJUiBtdXN0CitiZSBkZWZpbmVkLiBTZWUgZXhhbXBsZXMgYmVsb3cuCisKK0l0IGRvZXMgaXRzIGJlc3QgdG8gZG8gdGhlIHNhZmUgdGhpbmcsIGl0IHdpbGwgY2hlY2sgdGhhdCB0aGUgZmlsZXMgYXJlCit1bmNoYW5nZWQgYW5kIHVwIHRvIGRhdGUgaW4gdGhlIENWUyBjaGVja291dCwgYW5kIGl0IHdpbGwgbm90IGF1dG9jb21taXQKK2J5IGRlZmF1bHQuCisKK1N1cHBvcnRzIGZpbGUgYWRkaXRpb25zLCByZW1vdmFscywgYW5kIGNvbW1pdHMgdGhhdCBhZmZlY3QgYmluYXJ5IGZpbGVzLgorCitJZiB0aGUgY29tbWl0IGlzIGEgbWVyZ2UgY29tbWl0LCB5b3UgbXVzdCB0ZWxsIGdpdC1jdnNleHBvcnRjb21taXQgd2hhdCBwYXJlbnQKK3Nob3VsZCB0aGUgY2hhbmdlc2V0IGJlIGRvbmUgYWdhaW5zdC4KKworT1BUSU9OUworLS0tLS0tLQorCistYzo6CisJQ29tbWl0IGF1dG9tYXRpY2FsbHkgaWYgdGhlIHBhdGNoIGFwcGxpZWQgY2xlYW5seS4gSXQgd2lsbCBub3QKKwljb21taXQgaWYgYW55IGh1bmtzIGZhaWwgdG8gYXBwbHkgb3IgdGhlcmUgd2VyZSBvdGhlciBwcm9ibGVtcy4KKworLXA6OgorCUJlIHBlZGFudGljIChwYXJhbm9pZCkgd2hlbiBhcHBseWluZyBwYXRjaGVzLiBJbnZva2VzIHBhdGNoIHdpdGgKKwktLWZ1eno9MAorCistYTo6CisJQWRkIGF1dGhvcnNoaXAgaW5mb3JtYXRpb24uIEFkZHMgQXV0aG9yIGxpbmUsIGFuZCBDb21taXR0ZXIgKGlmCisJZGlmZmVyZW50IGZyb20gQXV0aG9yKSB0byB0aGUgbWVzc2FnZS4KKworLWQ6OgorCVNldCBhbiBhbHRlcm5hdGl2ZSBDVlNST09UIHRvIHVzZS4gIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIENWUworCS1kIHBhcmFtZXRlci4gIFVzdWFsbHkgdXNlcnMgd2lsbCBub3Qgd2FudCB0byBzZXQgdGhpcywgZXhjZXB0CisJaWYgdXNpbmcgQ1ZTIGluIGFuIGFzeW1tZXRyaWMgZmFzaGlvbi4KKworLWY6OgorCUZvcmNlIHRoZSBtZXJnZSBldmVuIGlmIHRoZSBmaWxlcyBhcmUgbm90IHVwIHRvIGRhdGUuCisKKy1QOjoKKwlGb3JjZSB0aGUgcGFyZW50IGNvbW1pdCwgZXZlbiBpZiBpdCBpcyBub3QgYSBkaXJlY3QgcGFyZW50LgorCistbTo6CisJUHJlcGVuZCB0aGUgY29tbWl0IG1lc3NhZ2Ugd2l0aCB0aGUgcHJvdmlkZWQgcHJlZml4LgorCVVzZWZ1bCBmb3IgcGF0Y2ggc2VyaWVzIGFuZCB0aGUgbGlrZS4KKworLXU6OgorCVVwZGF0ZSBhZmZlY3RlZCBmaWxlcyBmcm9tIENWUyByZXBvc2l0b3J5IGJlZm9yZSBhdHRlbXB0aW5nIGV4cG9ydC4KKworLXc6OgorCVNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSBDVlMgY2hlY2tvdXQgdG8gdXNlIGZvciB0aGUgZXhwb3J0LiBUaGlzCisJb3B0aW9uIGRvZXMgbm90IHJlcXVpcmUgR0lUX0RJUiB0byBiZSBzZXQgYmVmb3JlIGV4ZWN1dGlvbiBpZiB0aGUKKwljdXJyZW50IGRpcmVjdG9yeSBpcyB3aXRoaW4gYSBnaXQgcmVwb3NpdG9yeS4KKworLXY6OgorCVZlcmJvc2UuCisKK0VYQU1QTEVTCistLS0tLS0tLQorCitNZXJnZSBvbmUgcGF0Y2ggaW50byBDVlM6OgorKworLS0tLS0tLS0tLS0tCiskIGV4cG9ydCBHSVRfRElSPX4vcHJvamVjdC8uZ2l0CiskIGNkIH4vcHJvamVjdF9jdnNfY2hlY2tvdXQKKyQgZ2l0LWN2c2V4cG9ydGNvbW1pdCAtdiA8Y29tbWl0LXNoYTE+CiskIGN2cyBjb21taXQgLUYgLm1zZyA8ZmlsZXM+CistLS0tLS0tLS0tLS0KKworTWVyZ2Ugb25lIHBhdGNoIGludG8gQ1ZTICgtYyBhbmQgLXcgb3B0aW9ucykuIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBpcyB3aXRoaW4gdGhlIEdpdCBSZXBvOjoKKysKKy0tLS0tLS0tLS0tLQorCSQgZ2l0LWN2c2V4cG9ydGNvbW1pdCAtdiAtYyAtdyB+L3Byb2plY3RfY3ZzX2NoZWNrb3V0IDxjb21taXQtc2hhMT4KKy0tLS0tLS0tLS0tLQorCitNZXJnZSBwZW5kaW5nIHBhdGNoZXMgaW50byBDVlMgYXV0b21hdGljYWxseSAtLSBvbmx5IGlmIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSBhcmUgZG9pbmc6OgorKworLS0tLS0tLS0tLS0tCiskIGV4cG9ydCBHSVRfRElSPX4vcHJvamVjdC8uZ2l0CiskIGNkIH4vcHJvamVjdF9jdnNfY2hlY2tvdXQKKyQgZ2l0LWNoZXJyeSBjdnNoZWFkIG15aGVhZCB8IHNlZCAtbiAncy9eKyAvL3AnIHwgeGFyZ3MgLWwxIGdpdC1jdnNleHBvcnRjb21taXQgLWMgLXAgLXYKKy0tLS0tLS0tLS0tLQorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBNYXJ0aW4gTGFuZ2hvZmYgPG1hcnRpbkBjYXRhbHlzdC5uZXQubno+IGFuZCBvdGhlcnMuCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IE1hcnRpbiBMYW5naG9mZiA8bWFydGluQGNhdGFseXN0Lm5ldC5uej4gYW5kIG90aGVycy4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jdnNpbXBvcnQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtY3ZzaW1wb3J0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGVlZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY3ZzaW1wb3J0LnR4dApAQCAtMCwwICsxLDE3MyBAQAorZ2l0LWN2c2ltcG9ydCgxKQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtY3ZzaW1wb3J0IC0gU2FsdmFnZSB5b3VyIGRhdGEgb3V0IG9mIGFub3RoZXIgU0NNIHBlb3BsZSBsb3ZlIHRvIGhhdGUKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtY3ZzaW1wb3J0JyBbLW8gPGJyYW5jaC1mb3ItSEVBRD5dIFstaF0gWy12XSBbLWQgPENWU1JPT1Q+XQorCSAgICAgIFstQSA8YXV0aG9yLWNvbnYtZmlsZT5dIFstcCA8b3B0aW9ucy1mb3ItY3ZzcHM+XSBbLVAgPGZpbGU+XQorCSAgICAgIFstQyA8Z2l0X3JlcG9zaXRvcnk+XSBbLXogPGZ1eno+XSBbLWldIFsta10gWy11XSBbLXMgPHN1YnN0Pl0KKwkgICAgICBbLWFdIFstbV0gWy1NIDxyZWdleD5dIFstUyA8cmVnZXg+XSBbLUwgPGNvbW1pdGxpbWl0Pl0KKwkgICAgICBbLXIgPHJlbW90ZT5dIFs8Q1ZTX21vZHVsZT5dCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitJbXBvcnRzIGEgQ1ZTIHJlcG9zaXRvcnkgaW50byBnaXQuIEl0IHdpbGwgZWl0aGVyIGNyZWF0ZSBhIG5ldworcmVwb3NpdG9yeSwgb3IgaW5jcmVtZW50YWxseSBpbXBvcnQgaW50byBhbiBleGlzdGluZyBvbmUuCisKK1NwbGl0dGluZyB0aGUgQ1ZTIGxvZyBpbnRvIHBhdGNoIHNldHMgaXMgZG9uZSBieSAnY3ZzcHMnLgorQXQgbGVhc3QgdmVyc2lvbiAyLjEgaXMgcmVxdWlyZWQuCisKK1lvdSBzaG91bGQgKm5ldmVyKiBkbyBhbnkgd29yayBvZiB5b3VyIG93biBvbiB0aGUgYnJhbmNoZXMgdGhhdCBhcmUKK2NyZWF0ZWQgYnkgZ2l0LWN2c2ltcG9ydC4gIEJ5IGRlZmF1bHQgaW5pdGlhbCBpbXBvcnQgd2lsbCBjcmVhdGUgYW5kIHBvcHVsYXRlIGEKKyJtYXN0ZXIiIGJyYW5jaCBmcm9tIHRoZSBDVlMgcmVwb3NpdG9yeSdzIG1haW4gYnJhbmNoIHdoaWNoIHlvdSdyZSBmcmVlCit0byB3b3JrIHdpdGg7IGFmdGVyIHRoYXQsIHlvdSBuZWVkIHRvICdnaXQgbWVyZ2UnIGluY3JlbWVudGFsIGltcG9ydHMsIG9yCithbnkgQ1ZTIGJyYW5jaGVzLCB5b3Vyc2VsZi4gIEl0IGlzIGFkdmlzYWJsZSB0byBzcGVjaWZ5IGEgbmFtZWQgcmVtb3RlIHZpYQorLXIgdG8gc2VwYXJhdGUgYW5kIHByb3RlY3QgdGhlIGluY29taW5nIGJyYW5jaGVzLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy12OjoKKwlWZXJib3NpdHk6IGxldCAnY3ZzaW1wb3J0JyByZXBvcnQgd2hhdCBpdCBpcyBkb2luZy4KKworLWQgPENWU1JPT1Q+OjoKKwlUaGUgcm9vdCBvZiB0aGUgQ1ZTIGFyY2hpdmUuIE1heSBiZSBsb2NhbCAoYSBzaW1wbGUgcGF0aCkgb3IgcmVtb3RlOworCWN1cnJlbnRseSwgb25seSB0aGUgOmxvY2FsOiwgOmV4dDogYW5kIDpwc2VydmVyOiBhY2Nlc3MgbWV0aG9kcworCWFyZSBzdXBwb3J0ZWQuIElmIG5vdCBnaXZlbiwgZ2l0LWN2c2ltcG9ydCB3aWxsIHRyeSB0byByZWFkIGl0CisJZnJvbSBgQ1ZTL1Jvb3RgLiBJZiBubyBzdWNoIGZpbGUgZXhpc3RzLCBpdCBjaGVja3MgZm9yIHRoZQorCWBDVlNST09UYCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworPENWU19tb2R1bGU+OjoKKwlUaGUgQ1ZTIG1vZHVsZSB5b3Ugd2FudCB0byBpbXBvcnQuIFJlbGF0aXZlIHRvIDxDVlNST09UPi4KKwlJZiBub3QgZ2l2ZW4sIGdpdC1jdnNpbXBvcnQgdHJpZXMgdG8gcmVhZCBpdCBmcm9tCisJYENWUy9SZXBvc2l0b3J5YC4KKworLUMgPHRhcmdldC1kaXI+OjoKKyAgICAgICAgVGhlIGdpdCByZXBvc2l0b3J5IHRvIGltcG9ydCB0by4gIElmIHRoZSBkaXJlY3RvcnkgZG9lc24ndAorICAgICAgICBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkLiAgRGVmYXVsdCBpcyB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisKKy1yIDxyZW1vdGU+OjoKKwlUaGUgZ2l0IHJlbW90ZSB0byBpbXBvcnQgdGhpcyBDVlMgcmVwb3NpdG9yeSBpbnRvLgorCU1vdmVzIGFsbCBDVlMgYnJhbmNoZXMgaW50byByZW1vdGVzLzxyZW1vdGU+LzxicmFuY2g+CisJYWtpbiB0byB0aGUgZ2l0LWNsb25lIC0tdXNlLXNlcGFyYXRlLXJlbW90ZSBvcHRpb24uCisKKy1vIDxicmFuY2gtZm9yLUhFQUQ+OjoKKwlXaGVuIG5vIHJlbW90ZSBpcyBzcGVjaWZpZWQgKHZpYSAtcikgdGhlICdIRUFEJyBicmFuY2gKKwlmcm9tIENWUyBpcyBpbXBvcnRlZCB0byB0aGUgJ29yaWdpbicgYnJhbmNoIHdpdGhpbiB0aGUgZ2l0CisJcmVwb3NpdG9yeSwgYXMgJ0hFQUQnIGFscmVhZHkgaGFzIGEgc3BlY2lhbCBtZWFuaW5nIGZvciBnaXQuCisJV2hlbiBhIHJlbW90ZSBpcyBzcGVjaWZpZWQgdGhlICdIRUFEJyBicmFuY2ggaXMgbmFtZWQKKwlyZW1vdGVzLzxyZW1vdGU+L21hc3RlciBtaXJyb3JpbmcgZ2l0LWNsb25lIGJlaGF2aW91ci4KKwlVc2UgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gaW1wb3J0IGludG8gYSBkaWZmZXJlbnQKKwlicmFuY2guCisrCitVc2UgJy1vIG1hc3RlcicgZm9yIGNvbnRpbnVpbmcgYW4gaW1wb3J0IHRoYXQgd2FzIGluaXRpYWxseSBkb25lIGJ5Cit0aGUgb2xkIGN2czJnaXQgdG9vbC4KKworLWk6OgorCUltcG9ydC1vbmx5OiBkb24ndCBwZXJmb3JtIGEgY2hlY2tvdXQgYWZ0ZXIgaW1wb3J0aW5nLiAgVGhpcyBvcHRpb24KKwllbnN1cmVzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgaW5kZXggcmVtYWluIHVudG91Y2hlZCBhbmQgd2lsbAorCW5vdCBjcmVhdGUgdGhlbSBpZiB0aGV5IGRvIG5vdCBleGlzdC4KKworLWs6OgorCUtpbGwga2V5d29yZHM6IHdpbGwgZXh0cmFjdCBmaWxlcyB3aXRoICcta2snIGZyb20gdGhlIENWUyBhcmNoaXZlCisJdG8gYXZvaWQgbm9pc3kgY2hhbmdlc2V0cy4gSGlnaGx5IHJlY29tbWVuZGVkLCBidXQgb2ZmIGJ5IGRlZmF1bHQKKwl0byBwcmVzZXJ2ZSBjb21wYXRpYmlsaXR5IHdpdGggZWFybHkgaW1wb3J0ZWQgdHJlZXMuCisKKy11OjoKKwlDb252ZXJ0IHVuZGVyc2NvcmVzIGluIHRhZyBhbmQgYnJhbmNoIG5hbWVzIHRvIGRvdHMuCisKKy1zIDxzdWJzdD46OgorCVN1YnN0aXR1dGUgdGhlIGNoYXJhY3RlciAiLyIgaW4gYnJhbmNoIG5hbWVzIHdpdGggPHN1YnN0PgorCistcCA8b3B0aW9ucy1mb3ItY3ZzcHM+OjoKKwlBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIGN2c3BzLgorCVRoZSBvcHRpb25zICctdScgYW5kICctQScgYXJlIGltcGxpY2l0IGFuZCBzaG91bGQgbm90IGJlIHVzZWQgaGVyZS4KKysKK0lmIHlvdSBuZWVkIHRvIHBhc3MgbXVsdGlwbGUgb3B0aW9ucywgc2VwYXJhdGUgdGhlbSB3aXRoIGEgY29tbWEuCisKKy16IDxmdXp6Pjo6CisJUGFzcyB0aGUgdGltZXN0YW1wIGZ1enogZmFjdG9yIHRvIGN2c3BzLCBpbiBzZWNvbmRzLiBJZiB1bnNldCwKKwljdnNwcyBkZWZhdWx0cyB0byAzMDBzLgorCistUCA8Y3ZzcHMtb3V0cHV0LWZpbGU+OjoKKwlJbnN0ZWFkIG9mIGNhbGxpbmcgY3ZzcHMsIHJlYWQgdGhlIHByb3ZpZGVkIGN2c3BzIG91dHB1dCBmaWxlLiBVc2VmdWwKKwlmb3IgZGVidWdnaW5nIG9yIHdoZW4gY3ZzcHMgaXMgYmVpbmcgaGFuZGxlZCBvdXRzaWRlIGN2c2ltcG9ydC4KKworLW06OgorCUF0dGVtcHQgdG8gZGV0ZWN0IG1lcmdlcyBiYXNlZCBvbiB0aGUgY29tbWl0IG1lc3NhZ2UuIFRoaXMgb3B0aW9uCisJd2lsbCBlbmFibGUgZGVmYXVsdCByZWdleGVzIHRoYXQgdHJ5IHRvIGNhcHR1cmUgdGhlIHNvdXJjZQorCWJyYW5jaCBuYW1lIGZyb20gdGhlIGNvbW1pdCBtZXNzYWdlLgorCistTSA8cmVnZXg+OjoKKwlBdHRlbXB0IHRvIGRldGVjdCBtZXJnZXMgYmFzZWQgb24gdGhlIGNvbW1pdCBtZXNzYWdlIHdpdGggYSBjdXN0b20KKwlyZWdleC4gSXQgY2FuIGJlIHVzZWQgd2l0aCAnLW0nIHRvIGVuYWJsZSB0aGUgZGVmYXVsdCByZWdleGVzCisJYXMgd2VsbC4gWW91IG11c3QgZXNjYXBlIGZvcndhcmQgc2xhc2hlcy4KKysKK1RoZSByZWdleCBtdXN0IGNhcHR1cmUgdGhlIHNvdXJjZSBicmFuY2ggbmFtZSBpbiAkMS4KKysKK1RoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHNldmVyYWwgdGltZXMgdG8gcHJvdmlkZSBzZXZlcmFsIGRldGVjdGlvbiByZWdleGVzLgorCistUyA8cmVnZXg+OjoKKwlTa2lwIHBhdGhzIG1hdGNoaW5nIHRoZSByZWdleC4KKworLWE6OgorCUltcG9ydCBhbGwgY29tbWl0cywgaW5jbHVkaW5nIHJlY2VudCBvbmVzLiBjdnNpbXBvcnQgYnkgZGVmYXVsdAorCXNraXBzIGNvbW1pdHMgdGhhdCBoYXZlIGEgdGltZXN0YW1wIGxlc3MgdGhhbiAxMCBtaW51dGVzIGFnby4KKworLUwgPGxpbWl0Pjo6CisJTGltaXQgdGhlIG51bWJlciBvZiBjb21taXRzIGltcG9ydGVkLiBXb3JrYXJvdW5kIGZvciBjYXNlcyB3aGVyZQorCWN2c2ltcG9ydCBsZWFrcyBtZW1vcnkuCisKKy1BIDxhdXRob3ItY29udi1maWxlPjo6CisJQ1ZTIGJ5IGRlZmF1bHQgdXNlcyB0aGUgVW5peCB1c2VybmFtZSB3aGVuIHdyaXRpbmcgaXRzCisJY29tbWl0IGxvZ3MuIFVzaW5nIHRoaXMgb3B0aW9uIGFuZCBhbiBhdXRob3ItY29udi1maWxlCisJaW4gdGhpcyBmb3JtYXQKKysKKy0tLS0tLS0tLQorCWV4b249QW5kcmVhcyBFcmljc3NvbiA8YWVAb3A1LnNlPgorCXNwYXduPVNpbW9uIFBhd24gPHNwYXduQGZyb2ctcG9uZC5vcmc+CisKKy0tLS0tLS0tLQorKworZ2l0LWN2c2ltcG9ydCB3aWxsIG1ha2UgaXQgYXBwZWFyIGFzIHRob3NlIGF1dGhvcnMgaGFkCit0aGVpciBHSVRfQVVUSE9SX05BTUUgYW5kIEdJVF9BVVRIT1JfRU1BSUwgc2V0IHByb3Blcmx5CithbGwgYWxvbmcuCisrCitGb3IgY29udmVuaWVuY2UsIHRoaXMgZGF0YSBpcyBzYXZlZCB0byBgJEdJVF9ESVIvY3ZzLWF1dGhvcnNgCitlYWNoIHRpbWUgdGhlICctQScgb3B0aW9uIGlzIHByb3ZpZGVkIGFuZCByZWFkIGZyb20gdGhhdCBzYW1lCitmaWxlIGVhY2ggdGltZSBnaXQtY3ZzaW1wb3J0IGlzIHJ1bi4KKysKK0l0IGlzIG5vdCByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyBmZWF0dXJlIGlmIHlvdSBpbnRlbmQgdG8KK2V4cG9ydCBjaGFuZ2VzIGJhY2sgdG8gQ1ZTIGFnYWluIGxhdGVyIHdpdGgKK2xpbmtnaXQ6Z2l0LWN2c2V4cG9ydGNvbW1pdFsxXS4KKworLWg6OgorCVByaW50IGEgc2hvcnQgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KKworT1VUUFVUCistLS0tLS0KK0lmICctdicgaXMgc3BlY2lmaWVkLCB0aGUgc2NyaXB0IHJlcG9ydHMgd2hhdCBpdCBpcyBkb2luZy4KKworT3RoZXJ3aXNlLCBzdWNjZXNzIGlzIGluZGljYXRlZCB0aGUgVW5peCB3YXksIGkuZS4gYnkgc2ltcGx5IGV4aXRpbmcgd2l0aAorYSB6ZXJvIGV4aXQgc3RhdHVzLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IE1hdHRoaWFzIFVybGljaHMgPHNtdXJmQHNtdXJmLm5vcmlzLmRlPiwgd2l0aCBoZWxwIGZyb20KK3ZhcmlvdXMgcGFydGljaXBhbnRzIG9mIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IE1hdHRoaWFzIFVybGljaHMgPHNtdXJmQHNtdXJmLm5vcmlzLmRlPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jdnNzZXJ2ZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtY3Zzc2VydmVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2VjODAyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY3Zzc2VydmVyLnR4dApAQCAtMCwwICsxLDMyNyBAQAorZ2l0LWN2c3NlcnZlcigxKQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtY3Zzc2VydmVyIC0gQSBDVlMgc2VydmVyIGVtdWxhdG9yIGZvciBnaXQKKworU1lOT1BTSVMKKy0tLS0tLS0tCisKK1NTSDoKKworW3ZlcnNlXQorZXhwb3J0IENWU19TRVJWRVI9Z2l0LWN2c3NlcnZlcgorJ2N2cycgLWQgOmV4dDp1c2VyQHNlcnZlci9wYXRoL3JlcG8uZ2l0IGNvIDxIRUFEX25hbWU+CisKK3BzZXJ2ZXIgKC9ldGMvaW5ldGQuY29uZik6CisKK1t2ZXJzZV0KK2N2c3BzZXJ2ZXIgc3RyZWFtIHRjcCBub3dhaXQgbm9ib2R5IC91c3IvYmluL2dpdC1jdnNzZXJ2ZXIgZ2l0LWN2c3NlcnZlciBwc2VydmVyCisKK1VzYWdlOgorCitbdmVyc2VdCisnZ2l0LWN2c3NlcnZlcicgW29wdGlvbnNdIFtwc2VydmVyfHNlcnZlcl0gWzxkaXJlY3Rvcnk+IC4uLl0KKworT1BUSU9OUworLS0tLS0tLQorCitBbGwgdGhlc2Ugb3B0aW9ucyBvYnZpb3VzbHkgb25seSBtYWtlIHNlbnNlIGlmIGVuZm9yY2VkIGJ5IHRoZSBzZXJ2ZXIgc2lkZS4KK1RoZXkgaGF2ZSBiZWVuIGltcGxlbWVudGVkIHRvIHJlc2VtYmxlIHRoZSBsaW5rZ2l0OmdpdC1kYWVtb25bMV0gb3B0aW9ucyBhcworY2xvc2VseSBhcyBwb3NzaWJsZS4KKworLS1iYXNlLXBhdGggPHBhdGg+OjoKK1ByZXBlbmQgJ3BhdGgnIHRvIHJlcXVlc3RlZCBDVlNST09UCisKKy0tc3RyaWN0LXBhdGhzOjoKK0Rvbid0IGFsbG93IHJlY3Vyc2luZyBpbnRvIHN1YmRpcmVjdG9yaWVzCisKKy0tZXhwb3J0LWFsbDo6CitEb24ndCBjaGVjayBmb3IgYGdpdGN2cy5lbmFibGVkYCBpbiBjb25maWcuIFlvdSBhbHNvIGhhdmUgdG8gc3BlY2lmeSBhIGxpc3QKK29mIGFsbG93ZWQgZGlyZWN0b3JpZXMgKHNlZSBiZWxvdykgaWYgeW91IHdhbnQgdG8gdXNlIHRoaXMgb3B0aW9uLgorCistLXZlcnNpb24sIC1WOjoKK1ByaW50IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKworLS1oZWxwLCAtaCwgLUg6OgorUHJpbnQgdXNhZ2UgaW5mb3JtYXRpb24gYW5kIGV4aXQKKworPGRpcmVjdG9yeT46OgorWW91IGNhbiBzcGVjaWZ5IGEgbGlzdCBvZiBhbGxvd2VkIGRpcmVjdG9yaWVzLiBJZiBubyBkaXJlY3RvcmllcworYXJlIGdpdmVuLCBhbGwgYXJlIGFsbG93ZWQuIFRoaXMgaXMgYW4gYWRkaXRpb25hbCByZXN0cmljdGlvbiwgZ2l0Y3ZzCithY2Nlc3Mgc3RpbGwgbmVlZHMgdG8gYmUgZW5hYmxlZCBieSB0aGUgYGdpdGN2cy5lbmFibGVkYCBjb25maWcgb3B0aW9uCit1bmxlc3MgJy0tZXhwb3J0LWFsbCcgd2FzIGdpdmVuLCB0b28uCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK1RoaXMgYXBwbGljYXRpb24gaXMgYSBDVlMgZW11bGF0aW9uIGxheWVyIGZvciBnaXQuCisKK0l0IGlzIGhpZ2hseSBmdW5jdGlvbmFsLiBIb3dldmVyLCBub3QgYWxsIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkLAorYW5kIGZvciB0aG9zZSBtZXRob2RzIHRoYXQgYXJlIGltcGxlbWVudGVkLAorbm90IGFsbCBzd2l0Y2hlcyBhcmUgaW1wbGVtZW50ZWQuCisKK1Rlc3RpbmcgaGFzIGJlZW4gZG9uZSB1c2luZyBib3RoIHRoZSBDTEkgQ1ZTIGNsaWVudCwgYW5kIHRoZSBFY2xpcHNlIENWUworcGx1Z2luLiBNb3N0IGZ1bmN0aW9uYWxpdHkgd29ya3MgZmluZSB3aXRoIGJvdGggb2YgdGhlc2UgY2xpZW50cy4KKworTElNSVRBVElPTlMKKy0tLS0tLS0tLS0tCisKK0N1cnJlbnRseSBjdnNzZXJ2ZXIgd29ya3Mgb3ZlciBTU0ggY29ubmVjdGlvbnMgZm9yIHJlYWQvd3JpdGUgY2xpZW50cywgYW5kCitvdmVyIHBzZXJ2ZXIgZm9yIGFub255bW91cyBDVlMgYWNjZXNzLgorCitDVlMgY2xpZW50cyBjYW5ub3QgdGFnLCBicmFuY2ggb3IgcGVyZm9ybSBHSVQgbWVyZ2VzLgorCitnaXQtY3Zzc2VydmVyIG1hcHMgR0lUIGJyYW5jaGVzIHRvIENWUyBtb2R1bGVzLiBUaGlzIGlzIHZlcnkgZGlmZmVyZW50Citmcm9tIHdoYXQgbW9zdCBDVlMgdXNlcnMgd291bGQgZXhwZWN0IHNpbmNlIGluIENWUyBtb2R1bGVzIHVzdWFsbHkgcmVwcmVzZW50CitvbmUgb3IgbW9yZSBkaXJlY3Rvcmllcy4KKworSU5TVEFMTEFUSU9OCistLS0tLS0tLS0tLS0KKworMS4gSWYgeW91IGFyZSBnb2luZyB0byBvZmZlciBhbm9ueW1vdXMgQ1ZTIGFjY2VzcyB2aWEgcHNlcnZlciwgYWRkIGEgbGluZSBpbgorICAgL2V0Yy9pbmV0ZC5jb25mIGxpa2UKKysKKy0tCistLS0tLS0KKyAgIGN2c3BzZXJ2ZXIgc3RyZWFtIHRjcCBub3dhaXQgbm9ib2R5IGdpdC1jdnNzZXJ2ZXIgcHNlcnZlcgorCistLS0tLS0KK05vdGU6IFNvbWUgaW5ldGQgc2VydmVycyBsZXQgeW91IHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUKK2luZGVwZW5kZW50bHkgb2YgdGhlIHZhbHVlIG9mIGFyZ3ZbMF0gKGkuZS4gdGhlIG5hbWUgdGhlIHByb2dyYW0gYXNzdW1lcworaXQgd2FzIGV4ZWN1dGVkIHdpdGgpLiBJbiB0aGlzIGNhc2UgdGhlIGNvcnJlY3QgbGluZSBpbiAvZXRjL2luZXRkLmNvbmYKK2xvb2tzIGxpa2UKKworLS0tLS0tCisgICBjdnNwc2VydmVyIHN0cmVhbSB0Y3Agbm93YWl0IG5vYm9keSAvdXNyL2Jpbi9naXQtY3Zzc2VydmVyIGdpdC1jdnNzZXJ2ZXIgcHNlcnZlcgorCistLS0tLS0KK05vIHNwZWNpYWwgc2V0dXAgaXMgbmVlZGVkIGZvciBTU0ggYWNjZXNzLCBvdGhlciB0aGFuIGhhdmluZyBHSVQgdG9vbHMKK2luIHRoZSBQQVRILiBJZiB5b3UgaGF2ZSBjbGllbnRzIHRoYXQgZG8gbm90IGFjY2VwdCB0aGUgQ1ZTX1NFUlZFUgorZW52aXJvbm1lbnQgdmFyaWFibGUsIHlvdSBjYW4gcmVuYW1lIGdpdC1jdnNzZXJ2ZXIgdG8gY3ZzLgorCitOb3RlOiBOZXdlciBDVlMgdmVyc2lvbnMgKD49IDEuMTIuMTEpIGFsc28gc3VwcG9ydCBzcGVjaWZ5aW5nCitDVlNfU0VSVkVSIGRpcmVjdGx5IGluIENWU1JPT1QgbGlrZQorCistLS0tLS0KK2N2cyAtZCAiOmV4dDtDVlNfU0VSVkVSPWdpdC1jdnNzZXJ2ZXI6dXNlckBzZXJ2ZXIvcGF0aC9yZXBvLmdpdCIgY28gPEhFQURfbmFtZT4KKy0tLS0tLQorVGhpcyBoYXMgdGhlIGFkdmFudGFnZSB0aGF0IGl0IHdpbGwgYmUgc2F2ZWQgaW4geW91ciAnQ1ZTL1Jvb3QnIGZpbGVzIGFuZAoreW91IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgYWx3YXlzIHNldHRpbmcgdGhlIGNvcnJlY3QgZW52aXJvbm1lbnQKK3ZhcmlhYmxlLgorLS0KKzIuIEZvciBlYWNoIHJlcG8gdGhhdCB5b3Ugd2FudCBhY2Nlc3NpYmxlIGZyb20gQ1ZTIHlvdSBuZWVkIHRvIGVkaXQgY29uZmlnIGluCisgICB0aGUgcmVwbyBhbmQgYWRkIHRoZSBmb2xsb3dpbmcgc2VjdGlvbi4KKysKKy0tCistLS0tLS0KKyAgIFtnaXRjdnNdCisgICAgICAgIGVuYWJsZWQ9MQorICAgICAgICAjIG9wdGlvbmFsIGZvciBkZWJ1Z2dpbmcKKyAgICAgICAgbG9nZmlsZT0vcGF0aC90by9sb2dmaWxlCisKKy0tLS0tLQorTm90ZTogeW91IG5lZWQgdG8gZW5zdXJlIGVhY2ggdXNlciB0aGF0IGlzIGdvaW5nIHRvIGludm9rZSBnaXQtY3Zzc2VydmVyIGhhcword3JpdGUgYWNjZXNzIHRvIHRoZSBsb2cgZmlsZSBhbmQgdG8gdGhlIGRhdGFiYXNlIChzZWUKKzw8ZGJiYWNrZW5kLERhdGFiYXNlIEJhY2tlbmQ+Pi4gSWYgeW91IHdhbnQgdG8gb2ZmZXIgd3JpdGUgYWNjZXNzIG92ZXIKK1NTSCwgdGhlIHVzZXJzIG9mIGNvdXJzZSBhbHNvIG5lZWQgd3JpdGUgYWNjZXNzIHRvIHRoZSBnaXQgcmVwb3NpdG9yeSBpdHNlbGYuCisKK1tbY29uZmlnYWNjZXNzbWV0aG9kXV0KK0FsbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBjYW4gYWxzbyBiZSBvdmVycmlkZGVuIGZvciBhIHNwZWNpZmljIG1ldGhvZCBvZgorYWNjZXNzLiBWYWxpZCBtZXRob2QgbmFtZXMgYXJlICJleHQiIChmb3IgU1NIIGFjY2VzcykgYW5kICJwc2VydmVyIi4gVGhlCitmb2xsb3dpbmcgZXhhbXBsZSBjb25maWd1cmF0aW9uIHdvdWxkIGRpc2FibGUgcHNlcnZlciBhY2Nlc3Mgd2hpbGUgc3RpbGwKK2FsbG93aW5nIGFjY2VzcyBvdmVyIFNTSC4KKy0tLS0tLQorICAgW2dpdGN2c10KKyAgICAgICAgZW5hYmxlZD0wCisKKyAgIFtnaXRjdnMgImV4dCJdCisgICAgICAgIGVuYWJsZWQ9MQorLS0tLS0tCistLQorMy4gT24gdGhlIGNsaWVudCBtYWNoaW5lIHlvdSBuZWVkIHRvIHNldCB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcy4KKyAgIENWU1JPT1Qgc2hvdWxkIGJlIHNldCBhcyBwZXIgbm9ybWFsLCBidXQgdGhlIGRpcmVjdG9yeSBzaG91bGQgcG9pbnQgYXQgdGhlCisgICBhcHByb3ByaWF0ZSBnaXQgcmVwby4gRm9yIGV4YW1wbGU6CisrCistLQorRm9yIFNTSCBhY2Nlc3MsIENWU19TRVJWRVIgc2hvdWxkIGJlIHNldCB0byBnaXQtY3Zzc2VydmVyCisKK0V4YW1wbGU6CisKKy0tLS0tLQorICAgICBleHBvcnQgQ1ZTUk9PVD06ZXh0OnVzZXJAc2VydmVyOi92YXIvZ2l0L3Byb2plY3QuZ2l0CisgICAgIGV4cG9ydCBDVlNfU0VSVkVSPWdpdC1jdnNzZXJ2ZXIKKy0tLS0tLQorLS0KKzQuIEZvciBTU0ggY2xpZW50cyB0aGF0IHdpbGwgbWFrZSBjb21taXRzLCBtYWtlIHN1cmUgdGhlaXIgLmJhc2hyYyBmaWxlCisgICBzZXRzIHRoZSBHSVRfQVVUSE9SIGFuZCBHSVRfQ09NTUlUVEVSIHZhcmlhYmxlcy4KKworNS4gQ2xpZW50cyBzaG91bGQgbm93IGJlIGFibGUgdG8gY2hlY2sgb3V0IHRoZSBwcm9qZWN0LiBVc2UgdGhlIENWUyAnbW9kdWxlJworICAgbmFtZSB0byBpbmRpY2F0ZSB3aGF0IEdJVCAnaGVhZCcgeW91IHdhbnQgdG8gY2hlY2sgb3V0LiBFeGFtcGxlOgorKworLS0tLS0tCisgICAgIGN2cyBjbyAtZCBwcm9qZWN0LW1hc3RlciBtYXN0ZXIKKy0tLS0tLQorCitbW2RiYmFja2VuZF1dCitEYXRhYmFzZSBCYWNrZW5kCistLS0tLS0tLS0tLS0tLS0tCisKK2dpdC1jdnNzZXJ2ZXIgdXNlcyBvbmUgZGF0YWJhc2UgcGVyIGdpdCBoZWFkIChpLmUuIENWUyBtb2R1bGUpIHRvCitzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVwb3NpdG9yeSBmb3IgZmFzdGVyIGFjY2Vzcy4gVGhlCitkYXRhYmFzZSBkb2Vzbid0IGNvbnRhaW4gYW55IHBlcnNpc3RlbnQgZGF0YSBhbmQgY2FuIGJlIGNvbXBsZXRlbHkKK3JlZ2VuZXJhdGVkIGZyb20gdGhlIGdpdCByZXBvc2l0b3J5IGF0IGFueSB0aW1lLiBUaGUgZGF0YWJhc2UKK25lZWRzIHRvIGJlIHVwZGF0ZWQgKGkuZS4gd3JpdHRlbiB0bykgYWZ0ZXIgZXZlcnkgY29tbWl0LgorCitJZiB0aGUgY29tbWl0IGlzIGRvbmUgZGlyZWN0bHkgYnkgdXNpbmcgZ2l0IChhcyBvcHBvc2VkIHRvCit1c2luZyBnaXQtY3Zzc2VydmVyKSB0aGUgdXBkYXRlIHdpbGwgbmVlZCB0byBoYXBwZW4gb24gdGhlCituZXh0IHJlcG9zaXRvcnkgYWNjZXNzIGJ5IGdpdC1jdnNzZXJ2ZXIsIGluZGVwZW5kZW50IG9mCithY2Nlc3MgbWV0aG9kIGFuZCByZXF1ZXN0ZWQgb3BlcmF0aW9uLgorCitUaGF0IG1lYW5zIHRoYXQgZXZlbiBpZiB5b3Ugb2ZmZXIgb25seSByZWFkIGFjY2VzcyAoZS5nLiBieSB1c2luZwordGhlIHBzZXJ2ZXIgbWV0aG9kKSwgZ2l0LWN2c3NlcnZlciBzaG91bGQgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8KK3RoZSBkYXRhYmFzZSB0byB3b3JrIHJlbGlhYmx5IChvdGhlcndpc2UgeW91IG5lZWQgdG8gbWFrZSBzdXJlCit0aGF0IHRoZSBkYXRhYmFzZSBpcyB1cC10by1kYXRlIGFueSB0aW1lIGdpdC1jdnNzZXJ2ZXIgaXMgZXhlY3V0ZWQpLgorCitCeSBkZWZhdWx0IGl0IHVzZXMgU1FMaXRlIGRhdGFiYXNlcyBpbiB0aGUgZ2l0IGRpcmVjdG9yeSwgbmFtZWQKK2BnaXRjdnMuPG1vZHVsZV9uYW1lPi5zcWxpdGVgLiBOb3RlIHRoYXQgdGhlIFNRTGl0ZSBiYWNrZW5kIGNyZWF0ZXMKK3RlbXBvcmFyeSBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGRhdGFiYXNlIGZpbGUgb24KK3dyaXRlIHNvIGl0IG1pZ2h0IG5vdCBiZSBlbm91Z2ggdG8gZ3JhbnQgdGhlIHVzZXJzIHVzaW5nCitnaXQtY3Zzc2VydmVyIHdyaXRlIGFjY2VzcyB0byB0aGUgZGF0YWJhc2UgZmlsZSB3aXRob3V0IGdyYW50aW5nCit0aGVtIHdyaXRlIGFjY2VzcyB0byB0aGUgZGlyZWN0b3J5LCB0b28uCisKK1lvdSBjYW4gY29uZmlndXJlIHRoZSBkYXRhYmFzZSBiYWNrZW5kIHdpdGggdGhlIGZvbGxvd2luZworY29uZmlndXJhdGlvbiB2YXJpYWJsZXM6CisKK0NvbmZpZ3VyaW5nIGRhdGFiYXNlIGJhY2tlbmQKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworZ2l0LWN2c3NlcnZlciB1c2VzIHRoZSBQZXJsIERCSSBtb2R1bGUuIFBsZWFzZSBhbHNvIHJlYWQKK2l0cyBkb2N1bWVudGF0aW9uIGlmIGNoYW5naW5nIHRoZXNlIHZhcmlhYmxlcywgZXNwZWNpYWxseQorYWJvdXQgYERCSS0+Y29ubmVjdCgpYC4KKworZ2l0Y3ZzLmRibmFtZTo6CisJRGF0YWJhc2UgbmFtZS4gVGhlIGV4YWN0IG1lYW5pbmcgZGVwZW5kcyBvbiB0aGUKKwlzZWxlY3RlZCBkYXRhYmFzZSBkcml2ZXIsIGZvciBTUUxpdGUgdGhpcyBpcyBhIGZpbGVuYW1lLgorCVN1cHBvcnRzIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiAoc2VlIGJlbG93KS4gTWF5CisJbm90IGNvbnRhaW4gc2VtaWNvbG9ucyAoYDtgKS4KKwlEZWZhdWx0OiAnJUdnaXRjdnMuJW0uc3FsaXRlJworCitnaXRjdnMuZGJkcml2ZXI6OgorCVVzZWQgREJJIGRyaXZlci4gWW91IGNhbiBzcGVjaWZ5IGFueSBhdmFpbGFibGUgZHJpdmVyCisJZm9yIHRoaXMgaGVyZSwgYnV0IGl0IG1pZ2h0IG5vdCB3b3JrLiBjdnNzZXJ2ZXIgaXMgdGVzdGVkCisJd2l0aCAnREJEOjpTUUxpdGUnLCByZXBvcnRlZCB0byB3b3JrIHdpdGgKKwknREJEOjpQZycsIGFuZCByZXBvcnRlZCAqbm90KiB0byB3b3JrIHdpdGggJ0RCRDo6bXlzcWwnLgorCVBsZWFzZSByZWdhcmQgdGhpcyBhcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZS4gTWF5IG5vdAorCWNvbnRhaW4gY29sb25zIChgOmApLgorCURlZmF1bHQ6ICdTUUxpdGUnCisKK2dpdGN2cy5kYnVzZXI6OgorCURhdGFiYXNlIHVzZXIuIE9ubHkgdXNlZnVsIGlmIHNldHRpbmcgYGRiZHJpdmVyYCwgc2luY2UKKwlTUUxpdGUgaGFzIG5vIGNvbmNlcHQgb2YgZGF0YWJhc2UgdXNlcnMuIFN1cHBvcnRzIHZhcmlhYmxlCisJc3Vic3RpdHV0aW9uIChzZWUgYmVsb3cpLgorCitnaXRjdnMuZGJwYXNzOjoKKwlEYXRhYmFzZSBwYXNzd29yZC4gIE9ubHkgdXNlZnVsIGlmIHNldHRpbmcgYGRiZHJpdmVyYCwgc2luY2UKKwlTUUxpdGUgaGFzIG5vIGNvbmNlcHQgb2YgZGF0YWJhc2UgcGFzc3dvcmRzLgorCitnaXRjdnMuZGJUYWJsZU5hbWVQcmVmaXg6OgorCURhdGFiYXNlIHRhYmxlIG5hbWUgcHJlZml4LiAgU3VwcG9ydHMgdmFyaWFibGUgc3Vic3RpdHV0aW9uCisJKHNlZSBiZWxvdykuICBBbnkgbm9uLWFscGhhYmV0aWMgY2hhcmFjdGVycyB3aWxsIGJlIHJlcGxhY2VkCisJd2l0aCB1bmRlcnNjb3Jlcy4KKworQWxsIHZhcmlhYmxlcyBjYW4gYWxzbyBiZSBzZXQgcGVyIGFjY2VzcyBtZXRob2QsIHNlZSA8PGNvbmZpZ2FjY2Vzc21ldGhvZCxhYm92ZT4+LgorCitWYXJpYWJsZSBzdWJzdGl0dXRpb24KK15eXl5eXl5eXl5eXl5eXl5eXl5eXgorSW4gYGRiZHJpdmVyYCBhbmQgYGRidXNlcmAgeW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6CisKKyVHOjoKKwlnaXQgZGlyZWN0b3J5IG5hbWUKKyVnOjoKKwlnaXQgZGlyZWN0b3J5IG5hbWUsIHdoZXJlIGFsbCBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IKKwlhbHBoYS1udW1lcmljIG9uZXMsIGAuYCwgYW5kIGAtYCBhcmUgcmVwbGFjZWQgd2l0aAorCWBfYCAodGhpcyBzaG91bGQgbWFrZSBpdCBlYXNpZXIgdG8gdXNlIHRoZSBkaXJlY3RvcnkKKwluYW1lIGluIGEgZmlsZW5hbWUgaWYgd2FudGVkKQorJW06OgorCUNWUyBtb2R1bGUvZ2l0IGhlYWQgbmFtZQorJWE6OgorCWFjY2VzcyBtZXRob2QgKG9uZSBvZiAiZXh0IiBvciAicHNlcnZlciIpCisldTo6CisJTmFtZSBvZiB0aGUgdXNlciBydW5uaW5nIGdpdC1jdnNzZXJ2ZXIuCisJSWYgbm8gbmFtZSBjYW4gYmUgZGV0ZXJtaW5lZCwgdGhlCisJbnVtZXJpYyB1aWQgaXMgdXNlZC4KKworRWNsaXBzZSBDVlMgQ2xpZW50IE5vdGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gZ2V0IGEgY2hlY2tvdXQgd2l0aCB0aGUgRWNsaXBzZSBDVlMgY2xpZW50OgorCisxLiBTZWxlY3QgIkNyZWF0ZSBhIG5ldyBwcm9qZWN0IC0+IEZyb20gQ1ZTIGNoZWNrb3V0IgorMi4gQ3JlYXRlIGEgbmV3IGxvY2F0aW9uLiBTZWUgdGhlIG5vdGVzIGJlbG93IGZvciBkZXRhaWxzIG9uIGhvdyB0byBjaG9vc2UgdGhlCisgICByaWdodCBwcm90b2NvbC4KKzMuIEJyb3dzZSB0aGUgJ21vZHVsZXMnIGF2YWlsYWJsZS4gSXQgd2lsbCBnaXZlIHlvdSBhIGxpc3Qgb2YgdGhlIGhlYWRzIGluCisgICB0aGUgcmVwb3NpdG9yeS4gWW91IHdpbGwgbm90IGJlIGFibGUgdG8gYnJvd3NlIHRoZSB0cmVlIGZyb20gdGhlcmUuIE9ubHkKKyAgIHRoZSBoZWFkcy4KKzQuIFBpY2sgJ0hFQUQnIHdoZW4gaXQgYXNrcyB3aGF0IGJyYW5jaC90YWcgdG8gY2hlY2sgb3V0LiBVbnRpY2sgdGhlCisgICAibGF1bmNoIGNvbW1pdCB3aXphcmQiIHRvIGF2b2lkIGNvbW1pdHRpbmcgdGhlIC5wcm9qZWN0IGZpbGUuCisKK1Byb3RvY29sIG5vdGVzOiBJZiB5b3UgYXJlIHVzaW5nIGFub255bW91cyBhY2Nlc3MgdmlhIHBzZXJ2ZXIsIGp1c3Qgc2VsZWN0IHRoYXQuCitUaG9zZSB1c2luZyBTU0ggYWNjZXNzIHNob3VsZCBjaG9vc2UgdGhlICdleHQnIHByb3RvY29sLCBhbmQgY29uZmlndXJlICdleHQnCithY2Nlc3Mgb24gdGhlIFByZWZlcmVuY2VzLT5UZWFtLT5DVlMtPkV4dENvbm5lY3Rpb24gcGFuZS4gU2V0IENWU19TRVJWRVIgdG8KKydnaXQtY3Zzc2VydmVyJy4gTm90ZSB0aGF0IHBhc3N3b3JkIHN1cHBvcnQgaXMgbm90IGdvb2Qgd2hlbiB1c2luZyAnZXh0JywKK3lvdSB3aWxsIGRlZmluaXRlbHkgd2FudCB0byBoYXZlIFNTSCBrZXlzIHNldHVwLgorCitBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGp1c3QgdXNlIHRoZSBub24tc3RhbmRhcmQgZXh0c3NoIHByb3RvY29sIHRoYXQgRWNsaXBzZQorb2ZmZXIuIEluIHRoYXQgY2FzZSBDVlNfU0VSVkVSIGlzIGlnbm9yZWQsIGFuZCB5b3Ugd2lsbCBoYXZlIHRvIHJlcGxhY2UKK3RoZSBjdnMgdXRpbGl0eSBvbiB0aGUgc2VydmVyIHdpdGggZ2l0LWN2c3NlcnZlciBvciBtYW5pcHVsYXRlIHlvdXIgYC5iYXNocmNgCitzbyB0aGF0IGNhbGxpbmcgJ2N2cycgZWZmZWN0aXZlbHkgY2FsbHMgZ2l0LWN2c3NlcnZlci4KKworQ2xpZW50cyBrbm93biB0byB3b3JrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBDVlMgMS4xMi45IG9uIERlYmlhbgorLSBDVlMgMS4xMS4xNyBvbiBNYWNPU1ggKGZyb20gRmluayBwYWNrYWdlKQorLSBFY2xpcHNlIDMuMCwgMy4xLjIgb24gTWFjT1NYIChzZWUgRWNsaXBzZSBDVlMgQ2xpZW50IE5vdGVzKQorLSBUb3J0b2lzZUNWUworCitPcGVyYXRpb25zIHN1cHBvcnRlZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQWxsIHRoZSBvcGVyYXRpb25zIHJlcXVpcmVkIGZvciBub3JtYWwgdXNlIGFyZSBzdXBwb3J0ZWQsIGluY2x1ZGluZworY2hlY2tvdXQsIGRpZmYsIHN0YXR1cywgdXBkYXRlLCBsb2csIGFkZCwgcmVtb3ZlLCBjb21taXQuCitMZWdhY3kgbW9uaXRvcmluZyBvcGVyYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIChlZGl0LCB3YXRjaCBhbmQgcmVsYXRlZCkuCitFeHBvcnRzIGFuZCB0YWdnaW5nICh0YWdzIGFuZCBicmFuY2hlcykgYXJlIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyBzdGFnZS4KKworVGhlIHNlcnZlciBzaG91bGQgc2V0IHRoZSAnLWsnIG1vZGUgdG8gYmluYXJ5IHdoZW4gcmVsZXZhbnQsIGhvd2V2ZXIsCit0aGlzIGlzIG5vdCByZWFsbHkgaW1wbGVtZW50ZWQgeWV0LiBGb3Igbm93LCB5b3UgY2FuIGZvcmNlIHRoZSBzZXJ2ZXIKK3RvIHNldCAnLWtiJyBmb3IgYWxsIGZpbGVzIGJ5IHNldHRpbmcgdGhlIGBnaXRjdnMuYWxsYmluYXJ5YCBjb25maWcKK3ZhcmlhYmxlLiBJbiBwcm9wZXIgR0lUIHRyYWRpdGlvbiwgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlcyBhcmUKK2Fsd2F5cyByZXNwZWN0ZWQuIE5vIGtleXdvcmQgZXhwYW5zaW9uIG9yIG5ld2xpbmUgbXVuZ2luZyBpcyBzdXBwb3J0ZWQuCisKK0RlcGVuZGVuY2llcworLS0tLS0tLS0tLS0tCisKK2dpdC1jdnNzZXJ2ZXIgZGVwZW5kcyBvbiBEQkQ6OlNRTGl0ZS4KKworQ29weXJpZ2h0IGFuZCBBdXRob3JzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBwcm9ncmFtIGlzIGNvcHlyaWdodCBUaGUgT3BlbiBVbml2ZXJzaXR5IFVLIC0gMjAwNi4KKworQXV0aG9yczoKKworLSBNYXJ0eW4gU21pdGggICAgPG1hcnR5bkBjYXRhbHlzdC5uZXQubno+CistIE1hcnRpbiBMYW5naG9mZiA8bWFydGluQGNhdGFseXN0Lm5ldC5uej4KKword2l0aCBpZGVhcyBhbmQgcGF0Y2hlcyBmcm9tIHBhcnRpY2lwYW50cyBvZiB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBNYXJ0eW4gU21pdGggPG1hcnR5bkBjYXRhbHlzdC5uZXQubno+LCBNYXJ0aW4gTGFuZ2hvZmYgPG1hcnRpbkBjYXRhbHlzdC5uZXQubno+LCBhbmQgTWF0dGhpYXMgVXJsaWNocyA8c211cmZAc211cmYubm9yaXMuZGU+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWRhZW1vbi50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1kYWVtb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkODNiYzcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1kYWVtb24udHh0CkBAIC0wLDAgKzEsMjc1IEBACitnaXQtZGFlbW9uKDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1kYWVtb24gLSBBIHJlYWxseSBzaW1wbGUgc2VydmVyIGZvciBnaXQgcmVwb3NpdG9yaWVzCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1kYWVtb24nIFstLXZlcmJvc2VdIFstLXN5c2xvZ10gWy0tZXhwb3J0LWFsbF0KKyAgICAgICAgICAgICBbLS10aW1lb3V0PW5dIFstLWluaXQtdGltZW91dD1uXSBbLS1zdHJpY3QtcGF0aHNdCisgICAgICAgICAgICAgWy0tYmFzZS1wYXRoPXBhdGhdIFstLXVzZXItcGF0aCB8IC0tdXNlci1wYXRoPXBhdGhdCisgICAgICAgICAgICAgWy0taW50ZXJwb2xhdGVkLXBhdGg9cGF0aHRlbXBsYXRlXQorICAgICAgICAgICAgIFstLXJldXNlYWRkcl0gWy0tZGV0YWNoXSBbLS1waWQtZmlsZT1maWxlXQorICAgICAgICAgICAgIFstLWVuYWJsZT1zZXJ2aWNlXSBbLS1kaXNhYmxlPXNlcnZpY2VdCisJICAgICBbLS1hbGxvdy1vdmVycmlkZT1zZXJ2aWNlXSBbLS1mb3JiaWQtb3ZlcnJpZGU9c2VydmljZV0KKwkgICAgIFstLWluZXRkIHwgWy0tbGlzdGVuPWhvc3Rfb3JfaXBhZGRyXSBbLS1wb3J0PW5dIFstLXVzZXI9dXNlciBbLS1ncm91cD1ncm91cF1dCisJICAgICBbZGlyZWN0b3J5Li4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0EgcmVhbGx5IHNpbXBsZSBUQ1AgZ2l0IGRhZW1vbiB0aGF0IG5vcm1hbGx5IGxpc3RlbnMgb24gcG9ydCAiREVGQVVMVF9HSVRfUE9SVCIKK2FrYSA5NDE4LiAgSXQgd2FpdHMgZm9yIGEgY29ubmVjdGlvbiBhc2tpbmcgZm9yIGEgc2VydmljZSwgYW5kIHdpbGwgc2VydmUKK3RoYXQgc2VydmljZSBpZiBpdCBpcyBlbmFibGVkLgorCitJdCB2ZXJpZmllcyB0aGF0IHRoZSBkaXJlY3RvcnkgaGFzIHRoZSBtYWdpYyBmaWxlICJnaXQtZGFlbW9uLWV4cG9ydC1vayIsIGFuZAoraXQgd2lsbCByZWZ1c2UgdG8gZXhwb3J0IGFueSBnaXQgZGlyZWN0b3J5IHRoYXQgaGFzbid0IGV4cGxpY2l0bHkgYmVlbiBtYXJrZWQKK2ZvciBleHBvcnQgdGhpcyB3YXkgKHVubGVzcyB0aGUgJy0tZXhwb3J0LWFsbCcgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCkuIElmIHlvdQorcGFzcyBzb21lIGRpcmVjdG9yeSBwYXRocyBhcyAnZ2l0LWRhZW1vbicgYXJndW1lbnRzLCB5b3UgY2FuIGZ1cnRoZXIgcmVzdHJpY3QKK3RoZSBvZmZlcnMgdG8gYSB3aGl0ZWxpc3QgY29tcHJpc2luZyBvZiB0aG9zZS4KKworQnkgZGVmYXVsdCwgb25seSBgdXBsb2FkLXBhY2tgIHNlcnZpY2UgaXMgZW5hYmxlZCwgd2hpY2ggc2VydmVzCitgZ2l0LWZldGNoLXBhY2tgIGFuZCBgZ2l0LWxzLXJlbW90ZWAgY2xpZW50cywgd2hpY2ggYXJlIGludm9rZWQKK2Zyb20gYGdpdC1mZXRjaGAsIGBnaXQtcHVsbGAsIGFuZCBgZ2l0LWNsb25lYC4KKworVGhpcyBpcyBpZGVhbGx5IHN1aXRlZCBmb3IgcmVhZC1vbmx5IHVwZGF0ZXMsIGkuZS4sIHB1bGxpbmcgZnJvbQorZ2l0IHJlcG9zaXRvcmllcy4KKworQW4gYHVwbG9hZC1hcmNoaXZlYCBhbHNvIGV4aXN0cyB0byBzZXJ2ZSBgZ2l0LWFyY2hpdmVgLgorCitPUFRJT05TCistLS0tLS0tCistLXN0cmljdC1wYXRoczo6CisJTWF0Y2ggcGF0aHMgZXhhY3RseSAoaS5lLiBkb24ndCBhbGxvdyAiL2Zvby9yZXBvIiB3aGVuIHRoZSByZWFsIHBhdGggaXMKKwkiL2Zvby9yZXBvLmdpdCIgb3IgIi9mb28vcmVwby8uZ2l0IikgYW5kIGRvbid0IGRvIHVzZXItcmVsYXRpdmUgcGF0aHMuCisJZ2l0LWRhZW1vbiB3aWxsIHJlZnVzZSB0byBzdGFydCB3aGVuIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQgYW5kIG5vCisJd2hpdGVsaXN0IGlzIHNwZWNpZmllZC4KKworLS1iYXNlLXBhdGg6OgorCVJlbWFwIGFsbCB0aGUgcGF0aCByZXF1ZXN0cyBhcyByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gcGF0aC4KKwlUaGlzIGlzIHNvcnQgb2YgIkdJVCByb290IiAtIGlmIHlvdSBydW4gZ2l0LWRhZW1vbiB3aXRoCisJJy0tYmFzZS1wYXRoPS9zcnYvZ2l0JyBvbiBleGFtcGxlLmNvbSwgdGhlbiBpZiB5b3UgbGF0ZXIgdHJ5IHRvIHB1bGwKKwknZ2l0Oi8vZXhhbXBsZS5jb20vaGVsbG8uZ2l0JywgYGdpdC1kYWVtb25gIHdpbGwgaW50ZXJwcmV0IHRoZSBwYXRoCisJYXMgJy9zcnYvZ2l0L2hlbGxvLmdpdCcuCisKKy0tYmFzZS1wYXRoLXJlbGF4ZWQ6OgorCUlmIC0tYmFzZS1wYXRoIGlzIGVuYWJsZWQgYW5kIHJlcG8gbG9va3VwIGZhaWxzLCB3aXRoIHRoaXMgb3B0aW9uCisJYGdpdC1kYWVtb25gIHdpbGwgYXR0ZW1wdCB0byBsb29rdXAgd2l0aG91dCBwcmVmaXhpbmcgdGhlIGJhc2UgcGF0aC4KKwlUaGlzIGlzIHVzZWZ1bCBmb3Igc3dpdGNoaW5nIHRvIC0tYmFzZS1wYXRoIHVzYWdlLCB3aGlsZSBzdGlsbAorCWFsbG93aW5nIHRoZSBvbGQgcGF0aHMuCisKKy0taW50ZXJwb2xhdGVkLXBhdGg9cGF0aHRlbXBsYXRlOjoKKwlUbyBzdXBwb3J0IHZpcnR1YWwgaG9zdGluZywgYW4gaW50ZXJwb2xhdGVkIHBhdGggdGVtcGxhdGUgY2FuIGJlCisJdXNlZCB0byBkeW5hbWljYWxseSBjb25zdHJ1Y3QgYWx0ZXJuYXRlIHBhdGhzLiAgVGhlIHRlbXBsYXRlCisJc3VwcG9ydHMgJUggZm9yIHRoZSB0YXJnZXQgaG9zdG5hbWUgYXMgc3VwcGxpZWQgYnkgdGhlIGNsaWVudCBidXQKKwljb252ZXJ0ZWQgdG8gYWxsIGxvd2VyY2FzZSwgJUNIIGZvciB0aGUgY2Fub25pY2FsIGhvc3RuYW1lLAorCSVJUCBmb3IgdGhlIHNlcnZlcidzIElQIGFkZHJlc3MsICVQIGZvciB0aGUgcG9ydCBudW1iZXIsCisJYW5kICVEIGZvciB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgbmFtZWQgcmVwb3NpdG9yeS4KKwlBZnRlciBpbnRlcnBvbGF0aW9uLCB0aGUgcGF0aCBpcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgZGlyZWN0b3J5CisJd2hpdGVsaXN0LgorCistLWV4cG9ydC1hbGw6OgorCUFsbG93IHB1bGxpbmcgZnJvbSBhbGwgZGlyZWN0b3JpZXMgdGhhdCBsb29rIGxpa2UgR0lUIHJlcG9zaXRvcmllcworCShoYXZlIHRoZSAnb2JqZWN0cycgYW5kICdyZWZzJyBzdWJkaXJlY3RvcmllcyksIGV2ZW4gaWYgdGhleQorCWRvIG5vdCBoYXZlIHRoZSAnZ2l0LWRhZW1vbi1leHBvcnQtb2snIGZpbGUuCisKKy0taW5ldGQ6OgorCUhhdmUgdGhlIHNlcnZlciBydW4gYXMgYW4gaW5ldGQgc2VydmljZS4gSW1wbGllcyAtLXN5c2xvZy4KKwlJbmNvbXBhdGlibGUgd2l0aCAtLXBvcnQsIC0tbGlzdGVuLCAtLXVzZXIgYW5kIC0tZ3JvdXAgb3B0aW9ucy4KKworLS1saXN0ZW49aG9zdF9vcl9pcGFkZHI6OgorCUxpc3RlbiBvbiBhbiBhIHNwZWNpZmljIElQIGFkZHJlc3Mgb3IgaG9zdG5hbWUuICBJUCBhZGRyZXNzZXMgY2FuCisJYmUgZWl0aGVyIGFuIElQdjQgYWRkcmVzcyBvciBhbiBJUFY2IGFkZHJlc3MgaWYgc3VwcG9ydGVkLiAgSWYgSVB2NgorCWlzIG5vdCBzdXBwb3J0ZWQsIHRoZW4gLS1saXN0ZW49aG9zdG5hbWUgaXMgYWxzbyBub3Qgc3VwcG9ydGVkIGFuZAorCS0tbGlzdGVuIG11c3QgYmUgZ2l2ZW4gYW4gSVB2NCBhZGRyZXNzLgorCUluY29tcGF0aWJsZSB3aXRoICctLWluZXRkJyBvcHRpb24uCisKKy0tcG9ydD1uOjoKKwlMaXN0ZW4gb24gYW4gYWx0ZXJuYXRpdmUgcG9ydC4gIEluY29tcGF0aWJsZSB3aXRoICctLWluZXRkJyBvcHRpb24uCisKKy0taW5pdC10aW1lb3V0OjoKKwlUaW1lb3V0IGJldHdlZW4gdGhlIG1vbWVudCB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCBhbmQgdGhlCisJY2xpZW50IHJlcXVlc3QgaXMgcmVjZWl2ZWQgKHR5cGljYWxseSBhIHJhdGhlciBsb3cgdmFsdWUsIHNpbmNlCisJdGhhdCBzaG91bGQgYmUgYmFzaWNhbGx5IGltbWVkaWF0ZSkuCisKKy0tdGltZW91dDo6CisJVGltZW91dCBmb3Igc3BlY2lmaWMgY2xpZW50IHN1Yi1yZXF1ZXN0cy4gVGhpcyBpbmNsdWRlcyB0aGUgdGltZQorCWl0IHRha2VzIGZvciB0aGUgc2VydmVyIHRvIHByb2Nlc3MgdGhlIHN1Yi1yZXF1ZXN0IGFuZCB0aW1lIHNwZW50CisJd2FpdGluZyBmb3IgbmV4dCBjbGllbnQncyByZXF1ZXN0LgorCistLXN5c2xvZzo6CisJTG9nIHRvIHN5c2xvZyBpbnN0ZWFkIG9mIHN0ZGVyci4gTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGRvZXMgbm90IGltcGx5CisJLS12ZXJib3NlLCB0aHVzIGJ5IGRlZmF1bHQgb25seSBlcnJvciBjb25kaXRpb25zIHdpbGwgYmUgbG9nZ2VkLgorCistLXVzZXItcGF0aCwgLS11c2VyLXBhdGg9cGF0aDo6CisJQWxsb3cgfnVzZXIgbm90YXRpb24gdG8gYmUgdXNlZCBpbiByZXF1ZXN0cy4gIFdoZW4KKwlzcGVjaWZpZWQgd2l0aCBubyBwYXJhbWV0ZXIsIHJlcXVlc3RzIHRvCisJZ2l0Oi8vaG9zdC9+YWxpY2UvZm9vIGlzIHRha2VuIGFzIGEgcmVxdWVzdCB0byBhY2Nlc3MKKwknZm9vJyByZXBvc2l0b3J5IGluIHRoZSBob21lIGRpcmVjdG9yeSBvZiB1c2VyIGBhbGljZWAuCisJSWYgYC0tdXNlci1wYXRoPXBhdGhgIGlzIHNwZWNpZmllZCwgdGhlIHNhbWUgcmVxdWVzdCBpcworCXRha2VuIGFzIGEgcmVxdWVzdCB0byBhY2Nlc3MgYHBhdGgvZm9vYCByZXBvc2l0b3J5IGluCisJdGhlIGhvbWUgZGlyZWN0b3J5IG9mIHVzZXIgYGFsaWNlYC4KKworLS12ZXJib3NlOjoKKwlMb2cgZGV0YWlscyBhYm91dCB0aGUgaW5jb21pbmcgY29ubmVjdGlvbnMgYW5kIHJlcXVlc3RlZCBmaWxlcy4KKworLS1yZXVzZWFkZHI6OgorCVVzZSBTT19SRVVTRUFERFIgd2hlbiBiaW5kaW5nIHRoZSBsaXN0ZW5pbmcgc29ja2V0LgorCVRoaXMgYWxsb3dzIHRoZSBzZXJ2ZXIgdG8gcmVzdGFydCB3aXRob3V0IHdhaXRpbmcgZm9yCisJb2xkIGNvbm5lY3Rpb25zIHRvIHRpbWUgb3V0LgorCistLWRldGFjaDo6CisJRGV0YWNoIGZyb20gdGhlIHNoZWxsLiBJbXBsaWVzIC0tc3lzbG9nLgorCistLXBpZC1maWxlPWZpbGU6OgorCVNhdmUgdGhlIHByb2Nlc3MgaWQgaW4gJ2ZpbGUnLiAgSWdub3JlZCB3aGVuIHRoZSBkYWVtb24KKwlpcyBydW4gdW5kZXIgYC0taW5ldGRgLgorCistLXVzZXI9dXNlciwgLS1ncm91cD1ncm91cDo6CisJQ2hhbmdlIGRhZW1vbidzIHVpZCBhbmQgZ2lkIGJlZm9yZSBlbnRlcmluZyB0aGUgc2VydmljZSBsb29wLgorCVdoZW4gb25seSBgLS11c2VyYCBpcyBnaXZlbiB3aXRob3V0IGAtLWdyb3VwYCwgdGhlCisJcHJpbWFyeSBncm91cCBJRCBmb3IgdGhlIHVzZXIgaXMgdXNlZC4gIFRoZSB2YWx1ZXMgb2YKKwl0aGUgb3B0aW9uIGFyZSBnaXZlbiB0byBgZ2V0cHduYW0oMylgIGFuZCBgZ2V0Z3JuYW0oMylgCisJYW5kIG51bWVyaWMgSURzIGFyZSBub3Qgc3VwcG9ydGVkLgorKworR2l2aW5nIHRoZXNlIG9wdGlvbnMgaXMgYW4gZXJyb3Igd2hlbiB1c2VkIHdpdGggYC0taW5ldGRgOyB1c2UKK3RoZSBmYWNpbGl0eSBvZiBpbmV0IGRhZW1vbiB0byBhY2hpZXZlIHRoZSBzYW1lIGJlZm9yZSBzcGF3bmluZworYGdpdC1kYWVtb25gIGlmIG5lZWRlZC4KKworLS1lbmFibGU9c2VydmljZSwgLS1kaXNhYmxlPXNlcnZpY2U6OgorCUVuYWJsZS9kaXNhYmxlIHRoZSBzZXJ2aWNlIHNpdGUtd2lkZSBwZXIgZGVmYXVsdC4gIE5vdGUKKwl0aGF0IGEgc2VydmljZSBkaXNhYmxlZCBzaXRlLXdpZGUgY2FuIHN0aWxsIGJlIGVuYWJsZWQKKwlwZXIgcmVwb3NpdG9yeSBpZiBpdCBpcyBtYXJrZWQgb3ZlcnJpZGFibGUgYW5kIHRoZQorCXJlcG9zaXRvcnkgZW5hYmxlcyB0aGUgc2VydmljZSB3aXRoIGFuIGNvbmZpZ3VyYXRpb24KKwlpdGVtLgorCistLWFsbG93LW92ZXJyaWRlPXNlcnZpY2UsIC0tZm9yYmlkLW92ZXJyaWRlPXNlcnZpY2U6OgorCUFsbG93L2ZvcmJpZCBvdmVycmlkaW5nIHRoZSBzaXRlLXdpZGUgZGVmYXVsdCB3aXRoIHBlcgorCXJlcG9zaXRvcnkgY29uZmlndXJhdGlvbi4gIEJ5IGRlZmF1bHQsIGFsbCB0aGUgc2VydmljZXMKKwlhcmUgb3ZlcnJpZGFibGUuCisKKzxkaXJlY3Rvcnk+OjoKKwlBIGRpcmVjdG9yeSB0byBhZGQgdG8gdGhlIHdoaXRlbGlzdCBvZiBhbGxvd2VkIGRpcmVjdG9yaWVzLiBVbmxlc3MKKwktLXN0cmljdC1wYXRocyBpcyBzcGVjaWZpZWQgdGhpcyB3aWxsIGFsc28gaW5jbHVkZSBzdWJkaXJlY3RvcmllcworCW9mIGVhY2ggbmFtZWQgZGlyZWN0b3J5LgorCitTRVJWSUNFUworLS0tLS0tLS0KKworVGhlc2Ugc2VydmljZXMgY2FuIGJlIGdsb2JhbGx5IGVuYWJsZWQvZGlzYWJsZWQgdXNpbmcgdGhlCitjb21tYW5kIGxpbmUgb3B0aW9ucyBvZiB0aGlzIGNvbW1hbmQuICBJZiBhIGZpbmVyLWdyYWluZWQKK2NvbnRyb2wgaXMgZGVzaXJlZCAoZS5nLiB0byBhbGxvdyBgZ2l0LWFyY2hpdmVgIHRvIGJlIHJ1bgorYWdhaW5zdCBvbmx5IGluIGEgZmV3IHNlbGVjdGVkIHJlcG9zaXRvcmllcyB0aGUgZGFlbW9uIHNlcnZlcyksCit0aGUgcGVyLXJlcG9zaXRvcnkgY29uZmlndXJhdGlvbiBmaWxlIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBvcgorZGlzYWJsZSB0aGVtLgorCit1cGxvYWQtcGFjazo6CisJVGhpcyBzZXJ2ZXMgYGdpdC1mZXRjaC1wYWNrYCBhbmQgYGdpdC1scy1yZW1vdGVgCisJY2xpZW50cy4gIEl0IGlzIGVuYWJsZWQgYnkgZGVmYXVsdCwgYnV0IGEgcmVwb3NpdG9yeSBjYW4KKwlkaXNhYmxlIGl0IGJ5IHNldHRpbmcgYGRhZW1vbi51cGxvYWRwYWNrYCBjb25maWd1cmF0aW9uCisJaXRlbSB0byBgZmFsc2VgLgorCit1cGxvYWQtYXJjaGl2ZTo6CisJVGhpcyBzZXJ2ZXMgYGdpdC1hcmNoaXZlIC0tcmVtb3RlYC4gIEl0IGlzIGRpc2FibGVkIGJ5CisJZGVmYXVsdCwgYnV0IGEgcmVwb3NpdG9yeSBjYW4gZW5hYmxlIGl0IGJ5IHNldHRpbmcKKwlgZGFlbW9uLnVwbG9hZGFyY2hpdmVgIGNvbmZpZ3VyYXRpb24gaXRlbSB0byBgdHJ1ZWAuCisKK3JlY2VpdmUtcGFjazo6CisJVGhpcyBzZXJ2ZXMgYGdpdC1zZW5kLXBhY2tgIGNsaWVudHMsIGFsbG93aW5nIGFub255bW91cworCXB1c2guICBJdCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBhcyB0aGVyZSBpcyBfbm9fCisJYXV0aGVudGljYXRpb24gaW4gdGhlIHByb3RvY29sIChpbiBvdGhlciB3b3JkcywgYW55Ym9keQorCWNhbiBwdXNoIGFueXRoaW5nIGludG8gdGhlIHJlcG9zaXRvcnksIGluY2x1ZGluZyByZW1vdmFsCisJb2YgcmVmcykuICBUaGlzIGlzIHNvbGVseSBtZWFudCBmb3IgYSBjbG9zZWQgTEFOIHNldHRpbmcKKwl3aGVyZSBldmVyeWJvZHkgaXMgZnJpZW5kbHkuICBUaGlzIHNlcnZpY2UgY2FuIGJlCisJZW5hYmxlZCBieSBgZGFlbW9uLnJlY2VpdmVwYWNrYCBjb25maWd1cmF0aW9uIGl0ZW0gdG8KKwlgdHJ1ZWAuCisKK0VYQU1QTEVTCistLS0tLS0tLQorV2UgYXNzdW1lIHRoZSBmb2xsb3dpbmcgaW4gL2V0Yy9zZXJ2aWNlczo6CisrCistLS0tLS0tLS0tLS0KKyQgZ3JlcCA5NDE4IC9ldGMvc2VydmljZXMKK2dpdAkJOTQxOC90Y3AJCSMgR2l0IFZlcnNpb24gQ29udHJvbCBTeXN0ZW0KKy0tLS0tLS0tLS0tLQorCitnaXQtZGFlbW9uIGFzIGluZXRkIHNlcnZlcjo6CisJVG8gc2V0IHVwIGBnaXQtZGFlbW9uYCBhcyBhbiBpbmV0ZCBzZXJ2aWNlIHRoYXQgaGFuZGxlcyBhbnkKKwlyZXBvc2l0b3J5IHVuZGVyIHRoZSB3aGl0ZWxpc3RlZCBzZXQgb2YgZGlyZWN0b3JpZXMsIC9wdWIvZm9vCisJYW5kIC9wdWIvYmFyLCBwbGFjZSBhbiBlbnRyeSBsaWtlIHRoZSBmb2xsb3dpbmcgaW50bworCS9ldGMvaW5ldGQgYWxsIG9uIG9uZSBsaW5lOgorKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJZ2l0IHN0cmVhbSB0Y3Agbm93YWl0IG5vYm9keSAgL3Vzci9iaW4vZ2l0LWRhZW1vbgorCQlnaXQtZGFlbW9uIC0taW5ldGQgLS12ZXJib3NlIC0tZXhwb3J0LWFsbAorCQkvcHViL2ZvbyAvcHViL2JhcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworZ2l0LWRhZW1vbiBhcyBpbmV0ZCBzZXJ2ZXIgZm9yIHZpcnR1YWwgaG9zdHM6OgorCVRvIHNldCB1cCBgZ2l0LWRhZW1vbmAgYXMgYW4gaW5ldGQgc2VydmljZSB0aGF0IGhhbmRsZXMKKwlyZXBvc2l0b3JpZXMgZm9yIGRpZmZlcmVudCB2aXJ0dWFsIGhvc3RzLCBgd3d3LmV4YW1wbGUuY29tYAorCWFuZCBgd3d3LmV4YW1wbGUub3JnYCwgcGxhY2UgYW4gZW50cnkgbGlrZSB0aGUgZm9sbG93aW5nIGludG8KKwlgL2V0Yy9pbmV0ZGAgYWxsIG9uIG9uZSBsaW5lOgorKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJZ2l0IHN0cmVhbSB0Y3Agbm93YWl0IG5vYm9keSAvdXNyL2Jpbi9naXQtZGFlbW9uCisJCWdpdC1kYWVtb24gLS1pbmV0ZCAtLXZlcmJvc2UgLS1leHBvcnQtYWxsCisJCS0taW50ZXJwb2xhdGVkLXBhdGg9L3B1Yi8lSCVECisJCS9wdWIvd3d3LmV4YW1wbGUub3JnL3NvZnR3YXJlCisJCS9wdWIvd3d3LmV4YW1wbGUuY29tL3NvZnR3YXJlCisJCS9zb2Z0d2FyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisrCitJbiB0aGlzIGV4YW1wbGUsIHRoZSByb290LWxldmVsIGRpcmVjdG9yeSBgL3B1YmAgd2lsbCBjb250YWluCithIHN1YmRpcmVjdG9yeSBmb3IgZWFjaCB2aXJ0dWFsIGhvc3QgbmFtZSBzdXBwb3J0ZWQuCitGdXJ0aGVyLCBib3RoIGhvc3RzIGFkdmVydGlzZSByZXBvc2l0b3JpZXMgc2ltcGx5IGFzCitgZ2l0Oi8vd3d3LmV4YW1wbGUuY29tL3NvZnR3YXJlL3JlcG8uZ2l0YC4gIEZvciBwcmUtMS40LjAKK2NsaWVudHMsIGEgc3ltbGluayBmcm9tIGAvc29mdHdhcmVgIGludG8gdGhlIGFwcHJvcHJpYXRlCitkZWZhdWx0IHJlcG9zaXRvcnkgY291bGQgYmUgbWFkZSBhcyB3ZWxsLgorCisKK2dpdC1kYWVtb24gYXMgcmVndWxhciBkYWVtb24gZm9yIHZpcnR1YWwgaG9zdHM6OgorCVRvIHNldCB1cCBgZ2l0LWRhZW1vbmAgYXMgYSByZWd1bGFyLCBub24taW5ldGQgc2VydmljZSB0aGF0CisJaGFuZGxlcyByZXBvc2l0b3JpZXMgZm9yIG11bHRpcGxlIHZpcnR1YWwgaG9zdHMgYmFzZWQgb24KKwl0aGVpciBJUCBhZGRyZXNzZXMsIHN0YXJ0IHRoZSBkYWVtb24gbGlrZSB0aGlzOgorKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJZ2l0LWRhZW1vbiAtLXZlcmJvc2UgLS1leHBvcnQtYWxsCisJCS0taW50ZXJwb2xhdGVkLXBhdGg9L3B1Yi8lSVAvJUQKKwkJL3B1Yi8xOTIuMTY4LjEuMjAwL3NvZnR3YXJlCisJCS9wdWIvMTAuMTAuMjIwLjIzL3NvZnR3YXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKysKK0luIHRoaXMgZXhhbXBsZSwgdGhlIHJvb3QtbGV2ZWwgZGlyZWN0b3J5IGAvcHViYCB3aWxsIGNvbnRhaW4KK2Egc3ViZGlyZWN0b3J5IGZvciBlYWNoIHZpcnR1YWwgaG9zdCBJUCBhZGRyZXNzIHN1cHBvcnRlZC4KK1JlcG9zaXRvcmllcyBjYW4gc3RpbGwgYmUgYWNjZXNzZWQgYnkgaG9zdG5hbWUgdGhvdWdoLCBhc3N1bWluZwordGhleSBjb3JyZXNwb25kIHRvIHRoZXNlIElQIGFkZHJlc3Nlcy4KKworc2VsZWN0aXZlbHkgZW5hYmxlL2Rpc2FibGUgc2VydmljZXMgcGVyIHJlcG9zaXRvcnk6OgorCVRvIGVuYWJsZSBgZ2l0LWFyY2hpdmUgLS1yZW1vdGVgIGFuZCBkaXNhYmxlIGBnaXQtZmV0Y2hgIGFnYWluc3QKKwlhIHJlcG9zaXRvcnksIGhhdmUgdGhlIGZvbGxvd2luZyBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGluIHRoZQorCXJlcG9zaXRvcnkgKHRoYXQgaXMgdGhlIGZpbGUgJ2NvbmZpZycgbmV4dCB0byAnSEVBRCcsICdyZWZzJyBhbmQKKwknb2JqZWN0cycpLgorKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVtkYWVtb25dCisJCXVwbG9hZHBhY2sgPSBmYWxzZQorCQl1cGxvYWRhcmNoaXZlID0gdHJ1ZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4sIFlPU0hJRlVKSSBIaWRlYWtpCis8eW9zaGZ1amlAbGludXgtaXB2Ni5vcmc+IGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWRlc2NyaWJlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWRlc2NyaWJlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWFhMmYyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtZGVzY3JpYmUudHh0CkBAIC0wLDAgKzEsMTQ0IEBACitnaXQtZGVzY3JpYmUoMSkKKz09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZGVzY3JpYmUgLSBTaG93IHRoZSBtb3N0IHJlY2VudCB0YWcgdGhhdCBpcyByZWFjaGFibGUgZnJvbSBhIGNvbW1pdAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1kZXNjcmliZScgWy0tYWxsXSBbLS10YWdzXSBbLS1jb250YWluc10gWy0tYWJicmV2PTxuPl0gPGNvbW1pdHRpc2g+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhlIGNvbW1hbmQgZmluZHMgdGhlIG1vc3QgcmVjZW50IHRhZyB0aGF0IGlzIHJlYWNoYWJsZSBmcm9tIGEKK2NvbW1pdCwgYW5kIGlmIHRoZSBjb21taXQgaXRzZWxmIGlzIHBvaW50ZWQgYXQgYnkgdGhlIHRhZywgc2hvd3MKK3RoZSB0YWcuICBPdGhlcndpc2UsIGl0IHN1ZmZpeGVzIHRoZSB0YWcgbmFtZSB3aXRoIHRoZSBudW1iZXIgb2YKK2FkZGl0aW9uYWwgY29tbWl0cyBhbmQgdGhlIGFiYnJldmlhdGVkIG9iamVjdCBuYW1lIG9mIHRoZSBjb21taXQuCisKKworT1BUSU9OUworLS0tLS0tLQorPGNvbW1pdHRpc2g+OjoKKwlUaGUgb2JqZWN0IG5hbWUgb2YgdGhlIGNvbW1pdHRpc2guCisKKy0tYWxsOjoKKwlJbnN0ZWFkIG9mIHVzaW5nIG9ubHkgdGhlIGFubm90YXRlZCB0YWdzLCB1c2UgYW55IHJlZgorCWZvdW5kIGluIGAuZ2l0L3JlZnMvYC4KKworLS10YWdzOjoKKwlJbnN0ZWFkIG9mIHVzaW5nIG9ubHkgdGhlIGFubm90YXRlZCB0YWdzLCB1c2UgYW55IHRhZworCWZvdW5kIGluIGAuZ2l0L3JlZnMvdGFnc2AuCisKKy0tY29udGFpbnM6OgorCUluc3RlYWQgb2YgZmluZGluZyB0aGUgdGFnIHRoYXQgcHJlZGF0ZXMgdGhlIGNvbW1pdCwgZmluZAorCXRoZSB0YWcgdGhhdCBjb21lcyBhZnRlciB0aGUgY29tbWl0LCBhbmQgdGh1cyBjb250YWlucyBpdC4KKwlBdXRvbWF0aWNhbGx5IGltcGxpZXMgLS10YWdzLgorCistLWFiYnJldj08bj46OgorCUluc3RlYWQgb2YgdXNpbmcgdGhlIGRlZmF1bHQgOCBoZXhhZGVjaW1hbCBkaWdpdHMgYXMgdGhlCisJYWJicmV2aWF0ZWQgb2JqZWN0IG5hbWUsIHVzZSA8bj4gZGlnaXRzLgorCistLWNhbmRpZGF0ZXM9PG4+OjoKKwlJbnN0ZWFkIG9mIGNvbnNpZGVyaW5nIG9ubHkgdGhlIDEwIG1vc3QgcmVjZW50IHRhZ3MgYXMKKwljYW5kaWRhdGVzIHRvIGRlc2NyaWJlIHRoZSBpbnB1dCBjb21taXR0aXNoIGNvbnNpZGVyCisJdXAgdG8gPG4+IGNhbmRpZGF0ZXMuICBJbmNyZWFzaW5nIDxuPiBhYm92ZSAxMCB3aWxsIHRha2UKKwlzbGlnaHRseSBsb25nZXIgYnV0IG1heSBwcm9kdWNlIGEgbW9yZSBhY2N1cmF0ZSByZXN1bHQuCisJQW4gPG4+IG9mIDAgd2lsbCBjYXVzZSBvbmx5IGV4YWN0IG1hdGNoZXMgdG8gYmUgb3V0cHV0LgorCistLWV4YWN0LW1hdGNoOjoKKwlPbmx5IG91dHB1dCBleGFjdCBtYXRjaGVzIChhIHRhZyBkaXJlY3RseSByZWZlcmVuY2VzIHRoZQorCXN1cHBsaWVkIGNvbW1pdCkuICBUaGlzIGlzIGEgc3lub255bSBmb3IgLS1jYW5kaWRhdGVzPTAuCisKKy0tZGVidWc6OgorCVZlcmJvc2VseSBkaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZWFyY2hpbmcgc3RyYXRlZ3kKKwliZWluZyBlbXBsb3llZCB0byBzdGFuZGFyZCBlcnJvci4gIFRoZSB0YWcgbmFtZSB3aWxsIHN0aWxsCisJYmUgcHJpbnRlZCB0byBzdGFuZGFyZCBvdXQuCisKKy0tbG9uZzo6CisJQWx3YXlzIG91dHB1dCB0aGUgbG9uZyBmb3JtYXQgKHRoZSB0YWcsIHRoZSBudW1iZXIgb2YgY29tbWl0cworCWFuZCB0aGUgYWJicmV2aWF0ZWQgY29tbWl0IG5hbWUpIGV2ZW4gd2hlbiBpdCBtYXRjaGVzIGEgdGFnLgorCVRoaXMgaXMgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VlIHBhcnRzIG9mIHRoZSBjb21taXQgb2JqZWN0IG5hbWUKKwlpbiAiZGVzY3JpYmUiIG91dHB1dCwgZXZlbiB3aGVuIHRoZSBjb21taXQgaW4gcXVlc3Rpb24gaGFwcGVucyB0byBiZQorCWEgdGFnZ2VkIHZlcnNpb24uICBJbnN0ZWFkIG9mIGp1c3QgZW1pdHRpbmcgdGhlIHRhZyBuYW1lLCBpdCB3aWxsCisJZGVzY3JpYmUgc3VjaCBhIGNvbW1pdCBhcyB2MS4yLTAtZGVhZGJlZWYgKDB0aCBjb21taXQgc2luY2UgdGFnIHYxLjIKKwl0aGF0IHBvaW50cyBhdCBvYmplY3QgZGVhZGJlZWYuLi4uKS4KKworLS1tYXRjaCA8cGF0dGVybj46OgorCU9ubHkgY29uc2lkZXIgdGFncyBtYXRjaGluZyB0aGUgZ2l2ZW4gcGF0dGVybiAoY2FuIGJlIHVzZWQgdG8gYXZvaWQKKwlsZWFraW5nIHByaXZhdGUgdGFncyBtYWRlIGZyb20gdGhlIHJlcG9zaXRvcnkpLgorCitFWEFNUExFUworLS0tLS0tLS0KKworV2l0aCBzb21ldGhpbmcgbGlrZSBnaXQuZ2l0IGN1cnJlbnQgdHJlZSwgSSBnZXQ6CisKKwlbdG9ydmFsZHNAZzUgZ2l0XSQgZ2l0LWRlc2NyaWJlIHBhcmVudAorCXYxLjAuNC0xNC1nMjQxNDcyMQorCitpLmUuIHRoZSBjdXJyZW50IGhlYWQgb2YgbXkgInBhcmVudCIgYnJhbmNoIGlzIGJhc2VkIG9uIHYxLjAuNCwKK2J1dCBzaW5jZSBpdCBoYXMgYSBoYW5kZnVsIGNvbW1pdHMgb24gdG9wIG9mIHRoYXQsCitkZXNjcmliZSBoYXMgYWRkZWQgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGNvbW1pdHMgKCIxNCIpIGFuZAorYW4gYWJicmV2aWF0ZWQgb2JqZWN0IG5hbWUgZm9yIHRoZSBjb21taXQgaXRzZWxmICgiMjQxNDcyMSIpCithdCB0aGUgZW5kLgorCitUaGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgY29tbWl0cyBpcyB0aGUgbnVtYmVyCitvZiBjb21taXRzIHdoaWNoIHdvdWxkIGJlIGRpc3BsYXllZCBieSAiZ2l0IGxvZyB2MS4wLjQuLnBhcmVudCIuCitUaGUgaGFzaCBzdWZmaXggaXMgIi1nIiArIDctY2hhciBhYmJyZXZpYXRpb24gZm9yIHRoZSB0aXAgY29tbWl0CitvZiBwYXJlbnQgKHdoaWNoIHdhcyBgMjQxNDcyMWIxOTQ0NTNmMDU4MDc5ZDg5N2QxM2M0ZTM3N2Y5MmRjNmApLgorCitEb2luZyBhICJnaXQtZGVzY3JpYmUiIG9uIGEgdGFnLW5hbWUgd2lsbCBqdXN0IHNob3cgdGhlIHRhZyBuYW1lOgorCisJW3RvcnZhbGRzQGc1IGdpdF0kIGdpdC1kZXNjcmliZSB2MS4wLjQKKwl2MS4wLjQKKworV2l0aCAtLWFsbCwgdGhlIGNvbW1hbmQgY2FuIHVzZSBicmFuY2ggaGVhZHMgYXMgcmVmZXJlbmNlcywgc28KK3RoZSBvdXRwdXQgc2hvd3MgdGhlIHJlZmVyZW5jZSBwYXRoIGFzIHdlbGw6CisKKwlbdG9ydmFsZHNAZzUgZ2l0XSQgZ2l0IGRlc2NyaWJlIC0tYWxsIC0tYWJicmV2PTQgdjEuMC41XjIKKwl0YWdzL3YxLjAuMC0yMS1nOTc1YgorCisJW3RvcnZhbGRzQGc1IGdpdF0kIGdpdCBkZXNjcmliZSAtLWFsbCBIRUFEXgorCWhlYWRzL2x0L2Rlc2NyaWJlLTctZzk3NWIKKworV2l0aCAtLWFiYnJldiBzZXQgdG8gMCwgdGhlIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gZmluZCB0aGUKK2Nsb3Nlc3QgdGFnbmFtZSB3aXRob3V0IGFueSBzdWZmaXg6CisKKwlbdG9ydmFsZHNAZzUgZ2l0XSQgZ2l0IGRlc2NyaWJlIC0tYWJicmV2PTAgdjEuMC41XjIKKwl0YWdzL3YxLjAuMAorCitTRUFSQ0ggU1RSQVRFR1kKKy0tLS0tLS0tLS0tLS0tLQorCitGb3IgZWFjaCBjb21taXR0aXNoIHN1cHBsaWVkICJnaXQgZGVzY3JpYmUiIHdpbGwgZmlyc3QgbG9vayBmb3IKK2EgdGFnIHdoaWNoIHRhZ3MgZXhhY3RseSB0aGF0IGNvbW1pdC4gIEFubm90YXRlZCB0YWdzIHdpbGwgYWx3YXlzCitiZSBwcmVmZXJyZWQgb3ZlciBsaWdodHdlaWdodCB0YWdzLCBhbmQgdGFncyB3aXRoIG5ld2VyIGRhdGVzIHdpbGwKK2Fsd2F5cyBiZSBwcmVmZXJyZWQgb3ZlciB0YWdzIHdpdGggb2xkZXIgZGF0ZXMuICBJZiBhbiBleGFjdCBtYXRjaAoraXMgZm91bmQsIGl0cyBuYW1lIHdpbGwgYmUgb3V0cHV0IGFuZCBzZWFyY2hpbmcgd2lsbCBzdG9wLgorCitJZiBhbiBleGFjdCBtYXRjaCB3YXMgbm90IGZvdW5kICJnaXQgZGVzY3JpYmUiIHdpbGwgd2FsayBiYWNrCit0aHJvdWdoIHRoZSBjb21taXQgaGlzdG9yeSB0byBsb2NhdGUgYW4gYW5jZXN0b3IgY29tbWl0IHdoaWNoCitoYXMgYmVlbiB0YWdnZWQuICBUaGUgYW5jZXN0b3IncyB0YWcgd2lsbCBiZSBvdXRwdXQgYWxvbmcgd2l0aCBhbgorYWJicmV2aWF0aW9uIG9mIHRoZSBpbnB1dCBjb21taXR0aXNoJ3MgU0hBMS4KKworSWYgbXVsdGlwbGUgdGFncyB3ZXJlIGZvdW5kIGR1cmluZyB0aGUgd2FsayB0aGVuIHRoZSB0YWcgd2hpY2gKK2hhcyB0aGUgZmV3ZXN0IGNvbW1pdHMgZGlmZmVyZW50IGZyb20gdGhlIGlucHV0IGNvbW1pdHRpc2ggd2lsbCBiZQorc2VsZWN0ZWQgYW5kIG91dHB1dC4gIEhlcmUgZmV3ZXN0IGNvbW1pdHMgZGlmZmVyZW50IGlzIGRlZmluZWQgYXMKK3RoZSBudW1iZXIgb2YgY29tbWl0cyB3aGljaCB3b3VsZCBiZSBzaG93biBieSAiZ2l0IGxvZyB0YWcuLmlucHV0Igord2lsbCBiZSB0aGUgc21hbGxlc3QgbnVtYmVyIG9mIGNvbW1pdHMgcG9zc2libGUuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPiwgYnV0IHNvbWV3aGF0CitidXRjaGVyZWQgYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0Pi4gIExhdGVyIHNpZ25pZmljYW50bHkKK3VwZGF0ZWQgYnkgU2hhd24gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPi4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtZGlmZi1maWxlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLWZpbGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDJlYTE2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtZGlmZi1maWxlcy50eHQKQEAgLTAsMCArMSw2MCBAQAorZ2l0LWRpZmYtZmlsZXMoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1kaWZmLWZpbGVzIC0gQ29tcGFyZXMgZmlsZXMgaW4gdGhlIHdvcmtpbmcgdHJlZSBhbmQgdGhlIGluZGV4CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWRpZmYtZmlsZXMnIFstcV0gWy0wfC0xfC0yfC0zfC1jfC0tY2N8LS1uby1pbmRleF0gWzxjb21tb24gZGlmZiBvcHRpb25zPl0gWzxwYXRoPi4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitDb21wYXJlcyB0aGUgZmlsZXMgaW4gdGhlIHdvcmtpbmcgdHJlZSBhbmQgdGhlIGluZGV4LiAgV2hlbiBwYXRocworYXJlIHNwZWNpZmllZCwgY29tcGFyZXMgb25seSB0aG9zZSBuYW1lZCBwYXRocy4gIE90aGVyd2lzZSBhbGwKK2VudHJpZXMgaW4gdGhlIGluZGV4IGFyZSBjb21wYXJlZC4gIFRoZSBvdXRwdXQgZm9ybWF0IGlzIHRoZQorc2FtZSBhcyAiZ2l0LWRpZmYtaW5kZXgiIGFuZCAiZ2l0LWRpZmYtdHJlZSIuCisKK09QVElPTlMKKy0tLS0tLS0KK2luY2x1ZGU6OmRpZmYtb3B0aW9ucy50eHRbXQorCistMSAtMiAtMyBvciAtLWJhc2UgLS1vdXJzIC0tdGhlaXJzLCBhbmQgLTA6OgorCURpZmYgYWdhaW5zdCB0aGUgImJhc2UiIHZlcnNpb24sICJvdXIgYnJhbmNoIiBvciAidGhlaXIKKwlicmFuY2giIHJlc3BlY3RpdmVseS4gIFdpdGggdGhlc2Ugb3B0aW9ucywgZGlmZnMgZm9yCisJbWVyZ2VkIGVudHJpZXMgYXJlIG5vdCBzaG93bi4KKysKK1RoZSBkZWZhdWx0IGlzIHRvIGRpZmYgYWdhaW5zdCBvdXIgYnJhbmNoICgtMikgYW5kIHRoZQorY2xlYW5seSByZXNvbHZlZCBwYXRocy4gIFRoZSBvcHRpb24gLTAgY2FuIGJlIGdpdmVuIHRvCitvbWl0IGRpZmYgb3V0cHV0IGZvciB1bm1lcmdlZCBlbnRyaWVzIGFuZCBqdXN0IHNob3cgIlVubWVyZ2VkIi4KKworLWMsLS1jYzo6CisJVGhpcyBjb21wYXJlcyBzdGFnZSAyIChvdXIgYnJhbmNoKSwgc3RhZ2UgMyAodGhlaXIKKwlicmFuY2gpIGFuZCB0aGUgd29ya2luZyB0cmVlIGZpbGUgYW5kIG91dHB1dHMgYSBjb21iaW5lZAorCWRpZmYsIHNpbWlsYXIgdG8gdGhlIHdheSAnZGlmZi10cmVlJyBzaG93cyBhIG1lcmdlCisJY29tbWl0IHdpdGggdGhlc2UgZmxhZ3MuCisKKy0tbm8taW5kZXg6OgorCUNvbXBhcmUgdGhlIHR3byBnaXZlbiBmaWxlcyAvIGRpcmVjdG9yaWVzLgorCistcTo6CisJUmVtYWluIHNpbGVudCBldmVuIG9uIG5vbmV4aXN0ZW50IGZpbGVzCisKK091dHB1dCBmb3JtYXQKKy0tLS0tLS0tLS0tLS0KK2luY2x1ZGU6OmRpZmYtZm9ybWF0LnR4dFtdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLWluZGV4LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWRpZmYtaW5kZXgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4Njc3NzgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLWluZGV4LnR4dApAQCAtMCwwICsxLDEzMiBAQAorZ2l0LWRpZmYtaW5kZXgoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1kaWZmLWluZGV4IC0gQ29tcGFyZXMgY29udGVudCBhbmQgbW9kZSBvZiBibG9icyBiZXR3ZWVuIHRoZSBpbmRleCBhbmQgcmVwb3NpdG9yeQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1kaWZmLWluZGV4JyBbLW1dIFstLWNhY2hlZF0gWzxjb21tb24gZGlmZiBvcHRpb25zPl0gPHRyZWUtaXNoPiBbPHBhdGg+Li4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0NvbXBhcmVzIHRoZSBjb250ZW50IGFuZCBtb2RlIG9mIHRoZSBibG9icyBmb3VuZCB2aWEgYSB0cmVlCitvYmplY3Qgd2l0aCB0aGUgY29udGVudCBvZiB0aGUgY3VycmVudCBpbmRleCBhbmQsIG9wdGlvbmFsbHkKK2lnbm9yaW5nIHRoZSBzdGF0IHN0YXRlIG9mIHRoZSBmaWxlIG9uIGRpc2suICBXaGVuIHBhdGhzIGFyZQorc3BlY2lmaWVkLCBjb21wYXJlcyBvbmx5IHRob3NlIG5hbWVkIHBhdGhzLiAgT3RoZXJ3aXNlIGFsbAorZW50cmllcyBpbiB0aGUgaW5kZXggYXJlIGNvbXBhcmVkLgorCitPUFRJT05TCistLS0tLS0tCitpbmNsdWRlOjpkaWZmLW9wdGlvbnMudHh0W10KKworPHRyZWUtaXNoPjo6CisJVGhlIGlkIG9mIGEgdHJlZSBvYmplY3QgdG8gZGlmZiBhZ2FpbnN0LgorCistLWNhY2hlZDo6CisJZG8gbm90IGNvbnNpZGVyIHRoZSBvbi1kaXNrIGZpbGUgYXQgYWxsCisKKy1tOjoKKwlCeSBkZWZhdWx0LCBmaWxlcyByZWNvcmRlZCBpbiB0aGUgaW5kZXggYnV0IG5vdCBjaGVja2VkCisJb3V0IGFyZSByZXBvcnRlZCBhcyBkZWxldGVkLiAgVGhpcyBmbGFnIG1ha2VzCisJImdpdC1kaWZmLWluZGV4IiBzYXkgdGhhdCBhbGwgbm9uLWNoZWNrZWQtb3V0IGZpbGVzIGFyZSB1cAorCXRvIGRhdGUuCisKK091dHB1dCBmb3JtYXQKKy0tLS0tLS0tLS0tLS0KK2luY2x1ZGU6OmRpZmYtZm9ybWF0LnR4dFtdCisKK09wZXJhdGluZyBNb2RlcworLS0tLS0tLS0tLS0tLS0tCitZb3UgY2FuIGNob29zZSB3aGV0aGVyIHlvdSB3YW50IHRvIHRydXN0IHRoZSBpbmRleCBmaWxlIGVudGlyZWx5CisodXNpbmcgdGhlICctLWNhY2hlZCcgZmxhZykgb3IgYXNrIHRoZSBkaWZmIGxvZ2ljIHRvIHNob3cgYW55IGZpbGVzCit0aGF0IGRvbid0IG1hdGNoIHRoZSBzdGF0IHN0YXRlIGFzIGJlaW5nICJ0ZW50YXRpdmVseSBjaGFuZ2VkIi4gIEJvdGgKK29mIHRoZXNlIG9wZXJhdGlvbnMgYXJlIHZlcnkgdXNlZnVsIGluZGVlZC4KKworQ2FjaGVkIE1vZGUKKy0tLS0tLS0tLS0tCitJZiAnLS1jYWNoZWQnIGlzIHNwZWNpZmllZCwgaXQgYWxsb3dzIHlvdSB0byBhc2s6CisKKwlzaG93IG1lIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIEhFQUQgYW5kIHRoZSBjdXJyZW50IGluZGV4CisJY29udGVudHMgKHRoZSBvbmVzIEknZCB3cml0ZSB3aXRoIGEgImdpdC13cml0ZS10cmVlIikKKworRm9yIGV4YW1wbGUsIGxldCdzIHNheSB0aGF0IHlvdSBoYXZlIHdvcmtlZCBvbiB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5LCB1cGRhdGVkCitzb21lIGZpbGVzIGluIHRoZSBpbmRleCBhbmQgYXJlIHJlYWR5IHRvIGNvbW1pdC4gWW91IHdhbnQgdG8gc2VlIGV4YWN0bHkKKyp3aGF0KiB5b3UgYXJlIGdvaW5nIHRvIGNvbW1pdCwgd2l0aG91dCBoYXZpbmcgdG8gd3JpdGUgYSBuZXcgdHJlZQorb2JqZWN0IGFuZCBjb21wYXJlIGl0IHRoYXQgd2F5LCBhbmQgdG8gZG8gdGhhdCwgeW91IGp1c3QgZG8KKworCWdpdC1kaWZmLWluZGV4IC0tY2FjaGVkIEhFQUQKKworRXhhbXBsZTogbGV0J3Mgc2F5IEkgaGFkIHJlbmFtZWQgYGNvbW1pdC5jYCB0byBgZ2l0LWNvbW1pdC5jYCwgYW5kIEkgaGFkCitkb25lIGFuICJnaXQtdXBkYXRlLWluZGV4IiB0byBtYWtlIHRoYXQgZWZmZWN0aXZlIGluIHRoZSBpbmRleCBmaWxlLgorImdpdC1kaWZmLWZpbGVzIiB3b3VsZG4ndCBzaG93IGFueXRoaW5nIGF0IGFsbCwgc2luY2UgdGhlIGluZGV4IGZpbGUKK21hdGNoZXMgbXkgd29ya2luZyBkaXJlY3RvcnkuIEJ1dCBkb2luZyBhICJnaXQtZGlmZi1pbmRleCIgZG9lczoKKworICB0b3J2YWxkc0BwcGM5NzA6fi9naXQ+IGdpdC1kaWZmLWluZGV4IC0tY2FjaGVkIEhFQUQKKyAgLTEwMDY0NCBibG9iICAgIDQxNjFhZWNjNjcwMGEyZWI1NzllODQyYWYwYjdmMjJiOTg0NDNmNzQgICAgICAgIGNvbW1pdC5jCisgICsxMDA2NDQgYmxvYiAgICA0MTYxYWVjYzY3MDBhMmViNTc5ZTg0MmFmMGI3ZjIyYjk4NDQzZjc0ICAgICAgICBnaXQtY29tbWl0LmMKKworWW91IGNhbiBzZWUgZWFzaWx5IHRoYXQgdGhlIGFib3ZlIGlzIGEgcmVuYW1lLgorCitJbiBmYWN0LCAiZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQiICpzaG91bGQqIGFsd2F5cyBiZSBlbnRpcmVseSBlcXVpdmFsZW50IHRvCithY3R1YWxseSBkb2luZyBhICJnaXQtd3JpdGUtdHJlZSIgYW5kIGNvbXBhcmluZyB0aGF0LiBFeGNlcHQgdGhpcyBvbmUgaXMgbXVjaAorbmljZXIgZm9yIHRoZSBjYXNlIHdoZXJlIHlvdSBqdXN0IHdhbnQgdG8gY2hlY2sgd2hlcmUgeW91IGFyZS4KKworU28gZG9pbmcgYSAiZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQiIGlzIGJhc2ljYWxseSB2ZXJ5IHVzZWZ1bCB3aGVuIHlvdSBhcmUKK2Fza2luZyB5b3Vyc2VsZiAid2hhdCBoYXZlIEkgYWxyZWFkeSBtYXJrZWQgZm9yIGJlaW5nIGNvbW1pdHRlZCwgYW5kCit3aGF0J3MgdGhlIGRpZmZlcmVuY2UgdG8gYSBwcmV2aW91cyB0cmVlIi4KKworTm9uLWNhY2hlZCBNb2RlCistLS0tLS0tLS0tLS0tLS0KK1RoZSAibm9uLWNhY2hlZCIgbW9kZSB0YWtlcyBhIGRpZmZlcmVudCBhcHByb2FjaCwgYW5kIGlzIHBvdGVudGlhbGx5Cit0aGUgbW9yZSB1c2VmdWwgb2YgdGhlIHR3byBpbiB0aGF0IHdoYXQgaXQgZG9lcyBjYW4ndCBiZSBlbXVsYXRlZCB3aXRoCithICJnaXQtd3JpdGUtdHJlZSIgKyAiZ2l0LWRpZmYtdHJlZSIuIFRodXMgdGhhdCdzIHRoZSBkZWZhdWx0IG1vZGUuCitUaGUgbm9uLWNhY2hlZCB2ZXJzaW9uIGFza3MgdGhlIHF1ZXN0aW9uOgorCisgIHNob3cgbWUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gSEVBRCBhbmQgdGhlIGN1cnJlbnRseSBjaGVja2VkIG91dAorICB0cmVlIC0gaW5kZXggY29udGVudHMgX2FuZF8gZmlsZXMgdGhhdCBhcmVuJ3QgdXAtdG8tZGF0ZQorCit3aGljaCBpcyBvYnZpb3VzbHkgYSB2ZXJ5IHVzZWZ1bCBxdWVzdGlvbiB0b28sIHNpbmNlIHRoYXQgdGVsbHMgeW91IHdoYXQKK3lvdSAqY291bGQqIGNvbW1pdC4gQWdhaW4sIHRoZSBvdXRwdXQgbWF0Y2hlcyB0aGUgImdpdC1kaWZmLXRyZWUgLXIiCitvdXRwdXQgdG8gYSB0ZWUsIGJ1dCB3aXRoIGEgdHdpc3QuCisKK1RoZSB0d2lzdCBpcyB0aGF0IGlmIHNvbWUgZmlsZSBkb2Vzbid0IG1hdGNoIHRoZSBpbmRleCwgd2UgZG9uJ3QgaGF2ZQorYSBiYWNraW5nIHN0b3JlIHRoaW5nIGZvciBpdCwgYW5kIHdlIHVzZSB0aGUgbWFnaWMgImFsbC16ZXJvIiBzaGExIHRvCitzaG93IHRoYXQuIFNvIGxldCdzIHNheSB0aGF0IHlvdSBoYXZlIGVkaXRlZCBga2VybmVsL3NjaGVkLmNgLCBidXQKK2hhdmUgbm90IGFjdHVhbGx5IGRvbmUgYSAiZ2l0LXVwZGF0ZS1pbmRleCIgb24gaXQgeWV0IC0gdGhlcmUgaXMgbm8KKyJvYmplY3QiIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3IHN0YXRlLCBhbmQgeW91IGdldDoKKworICB0b3J2YWxkc0BwcGM5NzA6fi92Mi42L2xpbnV4PiBnaXQtZGlmZi1pbmRleCBIRUFECisgICoxMDA2NDQtPjEwMDY2NCBibG9iICAgIDc0NzZiYi4uLi4uLi0+MDAwMDAwLi4uLi4uICAgICAga2VybmVsL3NjaGVkLmMKKworaS5lLiwgaXQgc2hvd3MgdGhhdCB0aGUgdHJlZSBoYXMgY2hhbmdlZCwgYW5kIHRoYXQgYGtlcm5lbC9zY2hlZC5jYCBoYXMgaXMKK25vdCB1cC10by1kYXRlIGFuZCBtYXkgY29udGFpbiBuZXcgc3R1ZmYuIFRoZSBhbGwtemVybyBzaGExIG1lYW5zIHRoYXQgdG8KK2dldCB0aGUgcmVhbCBkaWZmLCB5b3UgbmVlZCB0byBsb29rIGF0IHRoZSBvYmplY3QgaW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5CitkaXJlY3RseSByYXRoZXIgdGhhbiBkbyBhbiBvYmplY3QtdG8tb2JqZWN0IGRpZmYuCisKK05PVEU6IEFzIHdpdGggb3RoZXIgY29tbWFuZHMgb2YgdGhpcyB0eXBlLCAiZ2l0LWRpZmYtaW5kZXgiIGRvZXMgbm90CithY3R1YWxseSBsb29rIGF0IHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBhdCBhbGwuIFNvIG1heWJlCitga2VybmVsL3NjaGVkLmNgIGhhc24ndCBhY3R1YWxseSBjaGFuZ2VkLCBhbmQgaXQncyBqdXN0IHRoYXQgeW91Cit0b3VjaGVkIGl0LiBJbiBlaXRoZXIgY2FzZSwgaXQncyBhIG5vdGUgdGhhdCB5b3UgbmVlZCB0bworImdpdC11cGRhdGUtaW5kZXgiIGl0IHRvIG1ha2UgdGhlIGluZGV4IGJlIGluIHN5bmMuCisKK05PVEU6IFlvdSBjYW4gaGF2ZSBhIG1peHR1cmUgb2YgZmlsZXMgc2hvdyB1cCBhcyAiaGFzIGJlZW4gdXBkYXRlZCIKK2FuZCAiaXMgc3RpbGwgZGlydHkgaW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IiB0b2dldGhlci4gWW91IGNhbiBhbHdheXMKK3RlbGwgd2hpY2ggZmlsZSBpcyBpbiB3aGljaCBzdGF0ZSwgc2luY2UgdGhlICJoYXMgYmVlbiB1cGRhdGVkIiBvbmVzCitzaG93IGEgdmFsaWQgc2hhMSwgYW5kIHRoZSAibm90IGluIHN5bmMgd2l0aCB0aGUgaW5kZXgiIG9uZXMgd2lsbAorYWx3YXlzIGhhdmUgdGhlIHNwZWNpYWwgYWxsLXplcm8gc2hhMS4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWRpZmYtdHJlZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLXRyZWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZDAyYzYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLXRyZWUudHh0CkBAIC0wLDAgKzEsMTY4IEBACitnaXQtZGlmZi10cmVlKDEpCis9PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1kaWZmLXRyZWUgLSBDb21wYXJlcyB0aGUgY29udGVudCBhbmQgbW9kZSBvZiBibG9icyBmb3VuZCB2aWEgdHdvIHRyZWUgb2JqZWN0cworCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1kaWZmLXRyZWUnIFstLXN0ZGluXSBbLW1dIFstc10gWy12XSBbLS1uby1jb21taXQtaWRdIFstLXByZXR0eV0KKwkgICAgICBbLXRdIFstcl0gWy1jIHwgLS1jY10gWy0tcm9vdF0gWzxjb21tb24gZGlmZiBvcHRpb25zPl0KKwkgICAgICA8dHJlZS1pc2g+IFs8dHJlZS1pc2g+XSBbPHBhdGg+Li4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0NvbXBhcmVzIHRoZSBjb250ZW50IGFuZCBtb2RlIG9mIHRoZSBibG9icyBmb3VuZCB2aWEgdHdvIHRyZWUgb2JqZWN0cy4KKworSWYgdGhlcmUgaXMgb25seSBvbmUgPHRyZWUtaXNoPiBnaXZlbiwgdGhlIGNvbW1pdCBpcyBjb21wYXJlZCB3aXRoIGl0cyBwYXJlbnRzCisoc2VlIC0tc3RkaW4gYmVsb3cpLgorCitOb3RlIHRoYXQgImdpdC1kaWZmLXRyZWUiIGNhbiB1c2UgdGhlIHRyZWUgZW5jYXBzdWxhdGVkIGluIGEgY29tbWl0IG9iamVjdC4KKworT1BUSU9OUworLS0tLS0tLQoraW5jbHVkZTo6ZGlmZi1vcHRpb25zLnR4dFtdCisKKzx0cmVlLWlzaD46OgorCVRoZSBpZCBvZiBhIHRyZWUgb2JqZWN0LgorCis8cGF0aD4uLi46OgorCUlmIHByb3ZpZGVkLCB0aGUgcmVzdWx0cyBhcmUgbGltaXRlZCB0byBhIHN1YnNldCBvZiBmaWxlcworCW1hdGNoaW5nIG9uZSBvZiB0aGVzZSBwcmVmaXggc3RyaW5ncy4KKwlpLmUuLCBmaWxlIG1hdGNoZXMgYC9ePHBhdHRlcm4xPnw8cGF0dGVybjI+fC4uLi9gCisJTm90ZSB0aGF0IHRoaXMgcGFyYW1ldGVyIGRvZXMgbm90IHByb3ZpZGUgYW55IHdpbGRjYXJkIG9yIHJlZ2V4cAorCWZlYXR1cmVzLgorCistcjo6CisgICAgICAgIHJlY3Vyc2UgaW50byBzdWItdHJlZXMKKworLXQ6OgorCXNob3cgdHJlZSBlbnRyeSBpdHNlbGYgYXMgd2VsbCBhcyBzdWJ0cmVlcy4gIEltcGxpZXMgLXIuCisKKy0tcm9vdDo6CisJV2hlbiAnLS1yb290JyBpcyBzcGVjaWZpZWQgdGhlIGluaXRpYWwgY29tbWl0IHdpbGwgYmUgc2hvd2VkIGFzIGEgYmlnCisJY3JlYXRpb24gZXZlbnQuIFRoaXMgaXMgZXF1aXZhbGVudCB0byBhIGRpZmYgYWdhaW5zdCB0aGUgTlVMTCB0cmVlLgorCistLXN0ZGluOjoKKwlXaGVuICctLXN0ZGluJyBpcyBzcGVjaWZpZWQsIHRoZSBjb21tYW5kIGRvZXMgbm90IHRha2UKKwk8dHJlZS1pc2g+IGFyZ3VtZW50cyBmcm9tIHRoZSBjb21tYW5kIGxpbmUuICBJbnN0ZWFkLCBpdAorCXJlYWRzIGVpdGhlciBvbmUgPGNvbW1pdD4gb3IgYSBwYWlyIG9mIDx0cmVlLWlzaD4KKwlzZXBhcmF0ZWQgd2l0aCBhIHNpbmdsZSBzcGFjZSBmcm9tIGl0cyBzdGFuZGFyZCBpbnB1dC4KKysKK1doZW4gYSBzaW5nbGUgY29tbWl0IGlzIGdpdmVuIG9uIG9uZSBsaW5lIG9mIHN1Y2ggaW5wdXQsIGl0IGNvbXBhcmVzCit0aGUgY29tbWl0IHdpdGggaXRzIHBhcmVudHMuICBUaGUgZm9sbG93aW5nIGZsYWdzIGZ1cnRoZXIgYWZmZWN0cyBpdHMKK2JlaGF2aW9yLiAgVGhpcyBkb2VzIG5vdCBhcHBseSB0byB0aGUgY2FzZSB3aGVyZSB0d28gPHRyZWUtaXNoPgorc2VwYXJhdGVkIHdpdGggYSBzaW5nbGUgc3BhY2UgYXJlIGdpdmVuLgorCistbTo6CisJQnkgZGVmYXVsdCwgImdpdC1kaWZmLXRyZWUgLS1zdGRpbiIgZG9lcyBub3Qgc2hvdworCWRpZmZlcmVuY2VzIGZvciBtZXJnZSBjb21taXRzLiAgV2l0aCB0aGlzIGZsYWcsIGl0IHNob3dzCisJZGlmZmVyZW5jZXMgdG8gdGhhdCBjb21taXQgZnJvbSBhbGwgb2YgaXRzIHBhcmVudHMuIFNlZQorCWFsc28gJy1jJy4KKworLXM6OgorCUJ5IGRlZmF1bHQsICJnaXQtZGlmZi10cmVlIC0tc3RkaW4iIHNob3dzIGRpZmZlcmVuY2VzLAorCWVpdGhlciBpbiBtYWNoaW5lLXJlYWRhYmxlIGZvcm0gKHdpdGhvdXQgJy1wJykgb3IgaW4gcGF0Y2gKKwlmb3JtICh3aXRoICctcCcpLiAgVGhpcyBvdXRwdXQgY2FuIGJlIHN1cHByZXNzZWQuICBJdCBpcworCW9ubHkgdXNlZnVsIHdpdGggJy12JyBmbGFnLgorCistdjo6CisJVGhpcyBmbGFnIGNhdXNlcyAiZ2l0LWRpZmYtdHJlZSAtLXN0ZGluIiB0byBhbHNvIHNob3cKKwl0aGUgY29tbWl0IG1lc3NhZ2UgYmVmb3JlIHRoZSBkaWZmZXJlbmNlcy4KKworaW5jbHVkZTo6cHJldHR5LW9wdGlvbnMudHh0W10KKworLS1uby1jb21taXQtaWQ6OgorCWdpdC1kaWZmLXRyZWUgb3V0cHV0cyBhIGxpbmUgd2l0aCB0aGUgY29tbWl0IElEIHdoZW4KKwlhcHBsaWNhYmxlLiAgVGhpcyBmbGFnIHN1cHByZXNzZWQgdGhlIGNvbW1pdCBJRCBvdXRwdXQuCisKKy1jOjoKKwlUaGlzIGZsYWcgY2hhbmdlcyB0aGUgd2F5IGEgbWVyZ2UgY29tbWl0IGlzIGRpc3BsYXllZAorCSh3aGljaCBtZWFucyBpdCBpcyB1c2VmdWwgb25seSB3aGVuIHRoZSBjb21tYW5kIGlzIGdpdmVuCisJb25lIDx0cmVlLWlzaD4sIG9yICctLXN0ZGluJykuICBJdCBzaG93cyB0aGUgZGlmZmVyZW5jZXMKKwlmcm9tIGVhY2ggb2YgdGhlIHBhcmVudHMgdG8gdGhlIG1lcmdlIHJlc3VsdCBzaW11bHRhbmVvdXNseQorCWluc3RlYWQgb2Ygc2hvd2luZyBwYWlyd2lzZSBkaWZmIGJldHdlZW4gYSBwYXJlbnQgYW5kIHRoZQorCXJlc3VsdCBvbmUgYXQgYSB0aW1lICh3aGljaCBpcyB3aGF0IHRoZSAnLW0nIG9wdGlvbiBkb2VzKS4KKwlGdXJ0aGVybW9yZSwgaXQgbGlzdHMgb25seSBmaWxlcyB3aGljaCB3ZXJlIG1vZGlmaWVkCisJZnJvbSBhbGwgcGFyZW50cy4KKworLS1jYzo6CisJVGhpcyBmbGFnIGNoYW5nZXMgdGhlIHdheSBhIG1lcmdlIGNvbW1pdCBwYXRjaCBpcyBkaXNwbGF5ZWQsCisJaW4gYSBzaW1pbGFyIHdheSB0byB0aGUgJy1jJyBvcHRpb24uIEl0IGltcGxpZXMgdGhlICctYycKKwlhbmQgJy1wJyBvcHRpb25zIGFuZCBmdXJ0aGVyIGNvbXByZXNzZXMgdGhlIHBhdGNoIG91dHB1dAorCWJ5IG9taXR0aW5nIGh1bmtzIHRoYXQgc2hvdyBkaWZmZXJlbmNlcyBmcm9tIG9ubHkgb25lCisJcGFyZW50LCBvciBzaG93IHRoZSBzYW1lIGNoYW5nZSBmcm9tIGFsbCBidXQgb25lIHBhcmVudAorCWZvciBhbiBPY3RvcHVzIG1lcmdlLiAgV2hlbiB0aGlzIG9wdGltaXphdGlvbiBtYWtlcyBhbGwKKwlodW5rcyBkaXNhcHBlYXIsIHRoZSBjb21taXQgaXRzZWxmIGFuZCB0aGUgY29tbWl0IGxvZworCW1lc3NhZ2UgaXMgbm90IHNob3duLCBqdXN0IGxpa2UgaW4gYW55IG90aGVyICJlbXB0eSBkaWZmIiBjYXNlLgorCistLWFsd2F5czo6CisJU2hvdyB0aGUgY29tbWl0IGl0c2VsZiBhbmQgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZSBldmVuCisJaWYgdGhlIGRpZmYgaXRzZWxmIGlzIGVtcHR5LgorCisKK2luY2x1ZGU6OnByZXR0eS1mb3JtYXRzLnR4dFtdCisKKworTGltaXRpbmcgT3V0cHV0CistLS0tLS0tLS0tLS0tLS0KK0lmIHlvdSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gZGlmZmVyZW5jZXMgaW4gYSBzdWJzZXQgb2YgZmlsZXMsIGZvcgorZXhhbXBsZSBzb21lIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBmaWxlcywgeW91IG1pZ2h0IGRvOgorCisJZ2l0LWRpZmYtdHJlZSAtciA8dHJlZS1pc2g+IDx0cmVlLWlzaD4gYXJjaC9pYTY0IGluY2x1ZGUvYXNtLWlhNjQKKworYW5kIGl0IHdpbGwgb25seSBzaG93IHlvdSB3aGF0IGNoYW5nZWQgaW4gdGhvc2UgdHdvIGRpcmVjdG9yaWVzLgorCitPciBpZiB5b3UgYXJlIHNlYXJjaGluZyBmb3Igd2hhdCBjaGFuZ2VkIGluIGp1c3QgYGtlcm5lbC9zY2hlZC5jYCwganVzdCBkbworCisJZ2l0LWRpZmYtdHJlZSAtciA8dHJlZS1pc2g+IDx0cmVlLWlzaD4ga2VybmVsL3NjaGVkLmMKKworYW5kIGl0IHdpbGwgaWdub3JlIGFsbCBkaWZmZXJlbmNlcyB0byBvdGhlciBmaWxlcy4KKworVGhlIHBhdHRlcm4gaXMgYWx3YXlzIHRoZSBwcmVmaXgsIGFuZCBpcyBtYXRjaGVkIGV4YWN0bHkuICBUaGVyZSBhcmUgbm8KK3dpbGRjYXJkcy4gIEV2ZW4gc3RyaWN0ZXIsIGl0IGhhcyB0byBtYXRjaCBhIGNvbXBsZXRlIHBhdGggY29tcG9uZW50LgorSS5lLiAiZm9vIiBkb2VzIG5vdCBwaWNrIHVwIGBmb29iYXIuaGAuICAiZm9vIiBkb2VzIG1hdGNoIGBmb28vYmFyLmhgCitzbyBpdCBjYW4gYmUgdXNlZCB0byBuYW1lIHN1YmRpcmVjdG9yaWVzLgorCitBbiBleGFtcGxlIG9mIG5vcm1hbCB1c2FnZSBpczoKKworICB0b3J2YWxkc0BwcGM5NzA6fi9naXQ+IGdpdC1kaWZmLXRyZWUgNTMxOWU0Li4uLi4uCisgICoxMDA2NjQtPjEwMDY2NCBibG9iICAgIGFjMzQ4Yi4uLi4uLi4tPmEwMTUxMy4uLi4uLi4gICAgICBnaXQtZnNjay1vYmplY3RzLmMKKword2hpY2ggdGVsbHMgeW91IHRoYXQgdGhlIGxhc3QgY29tbWl0IGNoYW5nZWQganVzdCBvbmUgZmlsZSAoaXQncyBmcm9tCit0aGlzIG9uZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2NvbW1pdCAzYzZmN2NhMTlhZDQwNDNlOWU3MmZhOTQxMDZmMzUyODk3ZTY1MWE4Cit0cmVlIDUzMTllNGQ2MDljZGQyODIwNjljYzRkY2UzM2MxZGI1NTk1MzliMDMKK3BhcmVudCBiNGU2MjhlYTMwZDVhYjM2MDYxMTlkMmVhNWNhZWFiMTQxZDM4ZGY3CithdXRob3IgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQHBwYzk3MC5vc2RsLm9yZz4gU2F0IEFwciA5IDEyOjAyOjMwIDIwMDUKK2NvbW1pdHRlciBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAcHBjOTcwLm9zZGwub3JnPiBTYXQgQXByIDkgMTI6MDI6MzAgMjAwNQorCitNYWtlICJnaXQtZnNjay1vYmplY3RzIiBwcmludCBvdXQgYWxsIHRoZSByb290IGNvbW1pdHMgaXQgZmluZHMuCisKK09uY2UgSSBkbyB0aGUgcmVmZXJlbmNlIHRyYWNraW5nLCBJJ2xsIGFsc28gbWFrZSBpdCBwcmludCBvdXQgYWxsIHRoZQorSEVBRCBjb21taXRzIGl0IGZpbmRzLCB3aGljaCBpcyBldmVuIG1vcmUgaW50ZXJlc3RpbmcuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbiBjYXNlIHlvdSBjYXJlKS4KKworT3V0cHV0IGZvcm1hdAorLS0tLS0tLS0tLS0tLQoraW5jbHVkZTo6ZGlmZi1mb3JtYXQudHh0W10KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWRpZmYudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZGlmZi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjMjg2MgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWRpZmYudHh0CkBAIC0wLDAgKzEsMTcxIEBACitnaXQtZGlmZigxKQorPT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWRpZmYgLSBTaG93IGNoYW5nZXMgYmV0d2VlbiBjb21taXRzLCBjb21taXQgYW5kIHdvcmtpbmcgdHJlZSwgZXRjCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWRpZmYnIFs8Y29tbW9uIGRpZmYgb3B0aW9ucz5dIDxjb21taXQ+ezAsMn0gWy0tXSBbPHBhdGg+Li4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1Nob3cgY2hhbmdlcyBiZXR3ZWVuIHR3byB0cmVlcywgYSB0cmVlIGFuZCB0aGUgd29ya2luZyB0cmVlLCBhCit0cmVlIGFuZCB0aGUgaW5kZXggZmlsZSwgb3IgdGhlIGluZGV4IGZpbGUgYW5kIHRoZSB3b3JraW5nIHRyZWUuCisKKydnaXQtZGlmZicgWy0tb3B0aW9uc10gWy0tXSBbPHBhdGg+Li4uXTo6CisKKwlUaGlzIGZvcm0gaXMgdG8gdmlldyB0aGUgY2hhbmdlcyB5b3UgbWFkZSByZWxhdGl2ZSB0bworCXRoZSBpbmRleCAoc3RhZ2luZyBhcmVhIGZvciB0aGUgbmV4dCBjb21taXQpLiAgSW4gb3RoZXIKKwl3b3JkcywgdGhlIGRpZmZlcmVuY2VzIGFyZSB3aGF0IHlvdSBfY291bGRfIHRlbGwgZ2l0IHRvCisJZnVydGhlciBhZGQgdG8gdGhlIGluZGV4IGJ1dCB5b3Ugc3RpbGwgaGF2ZW4ndC4gIFlvdSBjYW4KKwlzdGFnZSB0aGVzZSBjaGFuZ2VzIGJ5IHVzaW5nIGxpbmtnaXQ6Z2l0LWFkZFsxXS4KKysKK0lmIGV4YWN0bHkgdHdvIHBhdGhzIGFyZSBnaXZlbiwgYW5kIGF0IGxlYXN0IG9uZSBpcyB1bnRyYWNrZWQsCitjb21wYXJlIHRoZSB0d28gZmlsZXMgLyBkaXJlY3Rvcmllcy4gVGhpcyBiZWhhdmlvciBjYW4gYmUKK2ZvcmNlZCBieSAtLW5vLWluZGV4LgorCisnZ2l0LWRpZmYnIFstLW9wdGlvbnNdIC0tY2FjaGVkIFs8Y29tbWl0Pl0gWy0tXSBbPHBhdGg+Li4uXTo6CisKKwlUaGlzIGZvcm0gaXMgdG8gdmlldyB0aGUgY2hhbmdlcyB5b3Ugc3RhZ2VkIGZvciB0aGUgbmV4dAorCWNvbW1pdCByZWxhdGl2ZSB0byB0aGUgbmFtZWQgPGNvbW1pdD4uICBUeXBpY2FsbHkgeW91CisJd291bGQgd2FudCBjb21wYXJpc29uIHdpdGggdGhlIGxhdGVzdCBjb21taXQsIHNvIGlmIHlvdQorCWRvIG5vdCBnaXZlIDxjb21taXQ+LCBpdCBkZWZhdWx0cyB0byBIRUFELgorCisnZ2l0LWRpZmYnIFstLW9wdGlvbnNdIDxjb21taXQ+IFstLV0gWzxwYXRoPi4uLl06OgorCisJVGhpcyBmb3JtIGlzIHRvIHZpZXcgdGhlIGNoYW5nZXMgeW91IGhhdmUgaW4geW91cgorCXdvcmtpbmcgdHJlZSByZWxhdGl2ZSB0byB0aGUgbmFtZWQgPGNvbW1pdD4uICBZb3UgY2FuCisJdXNlIEhFQUQgdG8gY29tcGFyZSBpdCB3aXRoIHRoZSBsYXRlc3QgY29tbWl0LCBvciBhCisJYnJhbmNoIG5hbWUgdG8gY29tcGFyZSB3aXRoIHRoZSB0aXAgb2YgYSBkaWZmZXJlbnQKKwlicmFuY2guCisKKydnaXQtZGlmZicgWy0tb3B0aW9uc10gPGNvbW1pdD4gPGNvbW1pdD4gWy0tXSBbPHBhdGg+Li4uXTo6CisKKwlUaGlzIGlzIHRvIHZpZXcgdGhlIGNoYW5nZXMgYmV0d2VlbiB0d28gYXJiaXRyYXJ5CisJPGNvbW1pdD4uCisKKydnaXQtZGlmZicgWy0tb3B0aW9uc10gPGNvbW1pdD4uLjxjb21taXQ+IFstLV0gWzxwYXRoPi4uLl06OgorCisJVGhpcyBpcyBzeW5vbnltb3VzIHRvIHRoZSBwcmV2aW91cyBmb3JtLiAgSWYgPGNvbW1pdD4gb24KKwlvbmUgc2lkZSBpcyBvbWl0dGVkLCBpdCB3aWxsIGhhdmUgdGhlIHNhbWUgZWZmZWN0IGFzCisJdXNpbmcgSEVBRCBpbnN0ZWFkLgorCisnZ2l0LWRpZmYnIFstLW9wdGlvbnNdIDxjb21taXQ+XC4uLjxjb21taXQ+IFstLV0gWzxwYXRoPi4uLl06OgorCisJVGhpcyBmb3JtIGlzIHRvIHZpZXcgdGhlIGNoYW5nZXMgb24gdGhlIGJyYW5jaCBjb250YWluaW5nCisJYW5kIHVwIHRvIHRoZSBzZWNvbmQgPGNvbW1pdD4sIHN0YXJ0aW5nIGF0IGEgY29tbW9uIGFuY2VzdG9yCisJb2YgYm90aCA8Y29tbWl0Pi4gICJnaXQtZGlmZiBBXC4uLkIiIGlzIGVxdWl2YWxlbnQgdG8KKwkiZ2l0LWRpZmYgJChnaXQtbWVyZ2UtYmFzZSBBIEIpIEIiLiAgWW91IGNhbiBvbWl0IGFueSBvbmUKKwlvZiA8Y29tbWl0Piwgd2hpY2ggaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyB1c2luZyBIRUFEIGluc3RlYWQuCisKK0p1c3QgaW4gY2FzZSBpZiB5b3UgYXJlIGRvaW5nIHNvbWV0aGluZyBleG90aWMsIGl0IHNob3VsZCBiZQorbm90ZWQgdGhhdCBhbGwgb2YgdGhlIDxjb21taXQ+IGluIHRoZSBhYm92ZSBkZXNjcmlwdGlvbiwgZXhjZXB0Citmb3IgdGhlIGxhc3QgdHdvIGZvcm1zIHRoYXQgdXNlICIuLiIgbm90YXRpb25zLCBjYW4gYmUgYW55Cis8dHJlZS1pc2g+LgorCitGb3IgYSBtb3JlIGNvbXBsZXRlIGxpc3Qgb2Ygd2F5cyB0byBzcGVsbCA8Y29tbWl0Piwgc2VlCisiU1BFQ0lGWUlORyBSRVZJU0lPTlMiIHNlY3Rpb24gaW4gbGlua2dpdDpnaXQtcmV2LXBhcnNlWzFdLgorSG93ZXZlciwgImRpZmYiIGlzIGFib3V0IGNvbXBhcmluZyB0d28gX2VuZHBvaW50c18sIG5vdCByYW5nZXMsCithbmQgdGhlIHJhbmdlIG5vdGF0aW9ucyAoIjxjb21taXQ+Li48Y29tbWl0PiIgYW5kCisiPGNvbW1pdD5cLi4uPGNvbW1pdD4iKSBkbyBub3QgbWVhbiBhIHJhbmdlIGFzIGRlZmluZWQgaW4gdGhlCisiU1BFQ0lGWUlORyBSQU5HRVMiIHNlY3Rpb24gaW4gbGlua2dpdDpnaXQtcmV2LXBhcnNlWzFdLgorCitPUFRJT05TCistLS0tLS0tCis6Z2l0LWRpZmY6IDEKK2luY2x1ZGU6OmRpZmYtb3B0aW9ucy50eHRbXQorCis8cGF0aD4uLi46OgorCVRoZSA8cGF0aHM+IHBhcmFtZXRlcnMsIHdoZW4gZ2l2ZW4sIGFyZSB1c2VkIHRvIGxpbWl0CisJdGhlIGRpZmYgdG8gdGhlIG5hbWVkIHBhdGhzICh5b3UgY2FuIGdpdmUgZGlyZWN0b3J5CisJbmFtZXMgYW5kIGdldCBkaWZmIGZvciBhbGwgZmlsZXMgdW5kZXIgdGhlbSkuCisKK091dHB1dCBmb3JtYXQKKy0tLS0tLS0tLS0tLS0KK2luY2x1ZGU6OmRpZmYtZm9ybWF0LnR4dFtdCisKK0VYQU1QTEVTCistLS0tLS0tLQorCitWYXJpb3VzIHdheXMgdG8gY2hlY2sgeW91ciB3b3JraW5nIHRyZWU6OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmICAgICAgICAgICAgPDE+CiskIGdpdCBkaWZmIC0tY2FjaGVkICAgPDI+CiskIGdpdCBkaWZmIEhFQUQgICAgICAgPDM+CistLS0tLS0tLS0tLS0KKysKKzwxPiBDaGFuZ2VzIGluIHRoZSB3b3JraW5nIHRyZWUgbm90IHlldCBzdGFnZWQgZm9yIHRoZSBuZXh0IGNvbW1pdC4KKzwyPiBDaGFuZ2VzIGJldHdlZW4gdGhlIGluZGV4IGFuZCB5b3VyIGxhc3QgY29tbWl0OyB3aGF0IHlvdQord291bGQgYmUgY29tbWl0dGluZyBpZiB5b3UgcnVuICJnaXQgY29tbWl0IiB3aXRob3V0ICItYSIgb3B0aW9uLgorPDM+IENoYW5nZXMgaW4gdGhlIHdvcmtpbmcgdHJlZSBzaW5jZSB5b3VyIGxhc3QgY29tbWl0OyB3aGF0IHlvdQord291bGQgYmUgY29tbWl0dGluZyBpZiB5b3UgcnVuICJnaXQgY29tbWl0IC1hIgorCitDb21wYXJpbmcgd2l0aCBhcmJpdHJhcnkgY29tbWl0czo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgdGVzdCAgICAgICAgICAgIDwxPgorJCBnaXQgZGlmZiBIRUFEIC0tIC4vdGVzdCAgPDI+CiskIGdpdCBkaWZmIEhFQUReIEhFQUQgICAgICA8Mz4KKy0tLS0tLS0tLS0tLQorKworPDE+IEluc3RlYWQgb2YgdXNpbmcgdGhlIHRpcCBvZiB0aGUgY3VycmVudCBicmFuY2gsIGNvbXBhcmUgd2l0aCB0aGUKK3RpcCBvZiAidGVzdCIgYnJhbmNoLgorPDI+IEluc3RlYWQgb2YgY29tcGFyaW5nIHdpdGggdGhlIHRpcCBvZiAidGVzdCIgYnJhbmNoLCBjb21wYXJlIHdpdGgKK3RoZSB0aXAgb2YgdGhlIGN1cnJlbnQgYnJhbmNoLCBidXQgbGltaXQgdGhlIGNvbXBhcmlzb24gdG8gdGhlCitmaWxlICJ0ZXN0Ii4KKzwzPiBDb21wYXJlIHRoZSB2ZXJzaW9uIGJlZm9yZSB0aGUgbGFzdCBjb21taXQgYW5kIHRoZSBsYXN0IGNvbW1pdC4KKworQ29tcGFyaW5nIGJyYW5jaGVzOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZiB0b3BpYyBtYXN0ZXIgICAgPDE+CiskIGdpdCBkaWZmIHRvcGljLi5tYXN0ZXIgICA8Mj4KKyQgZ2l0IGRpZmYgdG9waWMuLi5tYXN0ZXIgIDwzPgorLS0tLS0tLS0tLS0tCisrCis8MT4gQ2hhbmdlcyBiZXR3ZWVuIHRoZSB0aXBzIG9mIHRoZSB0b3BpYyBhbmQgdGhlIG1hc3RlciBicmFuY2hlcy4KKzwyPiBTYW1lIGFzIGFib3ZlLgorPDM+IENoYW5nZXMgdGhhdCBvY2N1cnJlZCBvbiB0aGUgbWFzdGVyIGJyYW5jaCBzaW5jZSB3aGVuIHRoZSB0b3BpYworYnJhbmNoIHdhcyBzdGFydGVkIG9mZiBpdC4KKworTGltaXRpbmcgdGhlIGRpZmYgb3V0cHV0OjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZiAtLWRpZmYtZmlsdGVyPU1SQyAgICAgICAgICAgIDwxPgorJCBnaXQgZGlmZiAtLW5hbWUtc3RhdHVzICAgICAgICAgICAgICAgIDwyPgorJCBnaXQgZGlmZiBhcmNoL2kzODYgaW5jbHVkZS9hc20taTM4NiAgIDwzPgorLS0tLS0tLS0tLS0tCisrCis8MT4gU2hvdyBvbmx5IG1vZGlmaWNhdGlvbiwgcmVuYW1lIGFuZCBjb3B5LCBidXQgbm90IGFkZGl0aW9uCitub3IgZGVsZXRpb24uCis8Mj4gU2hvdyBvbmx5IG5hbWVzIGFuZCB0aGUgbmF0dXJlIG9mIGNoYW5nZSwgYnV0IG5vdCBhY3R1YWwKK2RpZmYgb3V0cHV0LgorPDM+IExpbWl0IGRpZmYgb3V0cHV0IHRvIG5hbWVkIHN1YnRyZWVzLgorCitNdW5naW5nIHRoZSBkaWZmIG91dHB1dDo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgLS1maW5kLWNvcGllcy1oYXJkZXIgLUIgLUMgIDwxPgorJCBnaXQgZGlmZiAtUiAgICAgICAgICAgICAgICAgICAgICAgICAgPDI+CistLS0tLS0tLS0tLS0KKysKKzwxPiBTcGVuZCBleHRyYSBjeWNsZXMgdG8gZmluZCByZW5hbWVzLCBjb3BpZXMgYW5kIGNvbXBsZXRlCityZXdyaXRlcyAodmVyeSBleHBlbnNpdmUpLgorPDI+IE91dHB1dCBkaWZmIGluIHJldmVyc2UuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1mYXN0LWV4cG9ydC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1mYXN0LWV4cG9ydC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhYzQ3NQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWZhc3QtZXhwb3J0LnR4dApAQCAtMCwwICsxLDgzIEBACitnaXQtZmFzdC1leHBvcnQoMSkKKz09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZmFzdC1leHBvcnQgLSBHaXQgZGF0YSBleHBvcnRlcgorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1mYXN0LWV4cG9ydCBbb3B0aW9uc10nIHwgJ2dpdC1mYXN0LWltcG9ydCcKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIHByb2dyYW0gZHVtcHMgdGhlIGdpdmVuIHJldmlzaW9ucyBpbiBhIGZvcm0gc3VpdGFibGUgdG8gYmUgcGlwZWQKK2ludG8gbGlua2dpdDpnaXQtZmFzdC1pbXBvcnRbMV0uCisKK1lvdSBjYW4gdXNlIGl0IGFzIGEgaHVtYW4gcmVhZGFibGUgYnVuZGxlIHJlcGxhY2VtZW50IChzZWUKK2xpbmtnaXQ6Z2l0LWJ1bmRsZVsxXSksIG9yIGFzIGEga2luZCBvZiBhbiBpbnRlcmFjdGl2ZQorbGlua2dpdDpnaXQtZmlsdGVyLWJyYW5jaFsxXS4KKworCitPUFRJT05TCistLS0tLS0tCistLXByb2dyZXNzPTxuPjo6CisJSW5zZXJ0ICdwcm9ncmVzcycgc3RhdGVtZW50cyBldmVyeSA8bj4gb2JqZWN0cywgdG8gYmUgc2hvd24gYnkKKwlsaW5rZ2l0OmdpdC1mYXN0LWltcG9ydFsxXSBkdXJpbmcgaW1wb3J0LgorCistLXNpZ25lZC10YWdzPSh2ZXJiYXRpbXx3YXJufHN0cmlwfGFib3J0KTo6CisJU3BlY2lmeSBob3cgdG8gaGFuZGxlIHNpZ25lZCB0YWdzLiAgU2luY2UgYW55IHRyYW5zZm9ybWF0aW9uCisJYWZ0ZXIgdGhlIGV4cG9ydCBjYW4gY2hhbmdlIHRoZSB0YWcgbmFtZXMgKHdoaWNoIGNhbiBhbHNvIGhhcHBlbgorCXdoZW4gZXhjbHVkaW5nIHJldmlzaW9ucykgdGhlIHNpZ25hdHVyZXMgd2lsbCBub3QgbWF0Y2guCisrCitXaGVuIGFza2luZyB0byAnYWJvcnQnICh3aGljaCBpcyB0aGUgZGVmYXVsdCksIHRoaXMgcHJvZ3JhbSB3aWxsIGRpZQord2hlbiBlbmNvdW50ZXJpbmcgYSBzaWduZWQgdGFnLiAgV2l0aCAnc3RyaXAnLCB0aGUgdGFncyB3aWxsIGJlIG1hZGUKK3Vuc2lnbmVkLCB3aXRoICd2ZXJiYXRpbScsIHRoZXkgd2lsbCBiZSBzaWxlbnRseSBleHBvcnRlZAorYW5kIHdpdGggJ3dhcm4nLCB0aGV5IHdpbGwgYmUgZXhwb3J0ZWQsIGJ1dCB5b3Ugd2lsbCBzZWUgYSB3YXJuaW5nLgorCisKK0VYQU1QTEVTCistLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBmYXN0LWV4cG9ydCAtLWFsbCB8IChjZCAvZW1wdHkvcmVwb3NpdG9yeSAmJiBnaXQgZmFzdC1pbXBvcnQpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgd2lsbCBleHBvcnQgdGhlIHdob2xlIHJlcG9zaXRvcnkgYW5kIGltcG9ydCBpdCBpbnRvIHRoZSBleGlzdGluZworZW1wdHkgcmVwb3NpdG9yeS4gIEV4Y2VwdCBmb3IgcmVlbmNvZGluZyBjb21taXRzIHRoYXQgYXJlIG5vdCBpbgorVVRGLTgsIGl0IHdvdWxkIGJlIGEgb25lLXRvLW9uZSBtaXJyb3IuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBmYXN0LWV4cG9ydCBtYXN0ZXJ+NS4ubWFzdGVyIHwKKwlzZWQgInN8cmVmcy9oZWFkcy9tYXN0ZXJ8cmVmcy9oZWFkcy9vdGhlcnwiIHwKKwlnaXQgZmFzdC1pbXBvcnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgbWFrZXMgYSBuZXcgYnJhbmNoIGNhbGxlZCAnb3RoZXInIGZyb20gJ21hc3Rlcn41Li5tYXN0ZXInCisoaS5lLiBpZiAnbWFzdGVyJyBoYXMgbGluZWFyIGhpc3RvcnksIGl0IHdpbGwgdGFrZSB0aGUgbGFzdCA1IGNvbW1pdHMpLgorCitOb3RlIHRoYXQgdGhpcyBhc3N1bWVzIHRoYXQgbm9uZSBvZiB0aGUgYmxvYnMgYW5kIGNvbW1pdCBtZXNzYWdlcworcmVmZXJlbmNlZCBieSB0aGF0IHJldmlzaW9uIHJhbmdlIGNvbnRhaW5zIHRoZSBzdHJpbmcKKydyZWZzL2hlYWRzL21hc3RlcicuCisKKworTGltaXRhdGlvbnMKKy0tLS0tLS0tLS0tCisKK1NpbmNlIGxpbmtnaXQ6Z2l0LWZhc3QtaW1wb3J0WzFdIGNhbm5vdCB0YWcgdHJlZXMsIHlvdSB3aWxsIG5vdCBiZQorYWJsZSB0byBleHBvcnQgdGhlIGxpbnV4LTIuNi5naXQgcmVwb3NpdG9yeSBjb21wbGV0ZWx5LCBhcyBpdCBjb250YWlucworYSB0YWcgcmVmZXJlbmNpbmcgYSB0cmVlIGluc3RlYWQgb2YgYSBjb21taXQuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSm9oYW5uZXMgRS4gU2NoaW5kZWxpbiA8am9oYW5uZXMuc2NoaW5kZWxpbkBnbXguZGU+LgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKb2hhbm5lcyBFLiBTY2hpbmRlbGluIDxqb2hhbm5lcy5zY2hpbmRlbGluQGdteC5kZT4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtZmFzdC1pbXBvcnQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZmFzdC1pbXBvcnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyOWE0ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1mYXN0LWltcG9ydC50eHQKQEAgLTAsMCArMSwxMTIyIEBACitnaXQtZmFzdC1pbXBvcnQoMSkKKz09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZmFzdC1pbXBvcnQgLSBCYWNrZW5kIGZvciBmYXN0IEdpdCBkYXRhIGltcG9ydGVycworCisKK1NZTk9QU0lTCistLS0tLS0tLQorZnJvbnRlbmQgfCAnZ2l0LWZhc3QtaW1wb3J0JyBbb3B0aW9uc10KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIHByb2dyYW0gaXMgdXN1YWxseSBub3Qgd2hhdCB0aGUgZW5kIHVzZXIgd2FudHMgdG8gcnVuIGRpcmVjdGx5LgorTW9zdCBlbmQgdXNlcnMgd2FudCB0byB1c2Ugb25lIG9mIHRoZSBleGlzdGluZyBmcm9udGVuZCBwcm9ncmFtcywKK3doaWNoIHBhcnNlcyBhIHNwZWNpZmljIHR5cGUgb2YgZm9yZWlnbiBzb3VyY2UgYW5kIGZlZWRzIHRoZSBjb250ZW50cworc3RvcmVkIHRoZXJlIHRvIGdpdC1mYXN0LWltcG9ydC4KKworZmFzdC1pbXBvcnQgcmVhZHMgYSBtaXhlZCBjb21tYW5kL2RhdGEgc3RyZWFtIGZyb20gc3RhbmRhcmQgaW5wdXQgYW5kCit3cml0ZXMgb25lIG9yIG1vcmUgcGFja2ZpbGVzIGRpcmVjdGx5IGludG8gdGhlIGN1cnJlbnQgcmVwb3NpdG9yeS4KK1doZW4gRU9GIGlzIHJlY2VpdmVkIG9uIHN0YW5kYXJkIGlucHV0LCBmYXN0IGltcG9ydCB3cml0ZXMgb3V0Cit1cGRhdGVkIGJyYW5jaCBhbmQgdGFnIHJlZnMsIGZ1bGx5IHVwZGF0aW5nIHRoZSBjdXJyZW50IHJlcG9zaXRvcnkKK3dpdGggdGhlIG5ld2x5IGltcG9ydGVkIGRhdGEuCisKK1RoZSBmYXN0LWltcG9ydCBiYWNrZW5kIGl0c2VsZiBjYW4gaW1wb3J0IGludG8gYW4gZW1wdHkgcmVwb3NpdG9yeSAob25lIHRoYXQKK2hhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgYnkgbGlua2dpdDpnaXQtaW5pdFsxXSkgb3IgaW5jcmVtZW50YWxseQordXBkYXRlIGFuIGV4aXN0aW5nIHBvcHVsYXRlZCByZXBvc2l0b3J5LiAgV2hldGhlciBvciBub3QgaW5jcmVtZW50YWwKK2ltcG9ydHMgYXJlIHN1cHBvcnRlZCBmcm9tIGEgcGFydGljdWxhciBmb3JlaWduIHNvdXJjZSBkZXBlbmRzIG9uCit0aGUgZnJvbnRlbmQgcHJvZ3JhbSBpbiB1c2UuCisKKworT1BUSU9OUworLS0tLS0tLQorLS1kYXRlLWZvcm1hdD08Zm10Pjo6CisJU3BlY2lmeSB0aGUgdHlwZSBvZiBkYXRlcyB0aGUgZnJvbnRlbmQgd2lsbCBzdXBwbHkgdG8KKwlmYXN0LWltcG9ydCB3aXRoaW4gYGF1dGhvcmAsIGBjb21taXR0ZXJgIGFuZCBgdGFnZ2VyYCBjb21tYW5kcy4KKwlTZWUgYGBEYXRlIEZvcm1hdHMnJyBiZWxvdyBmb3IgZGV0YWlscyBhYm91dCB3aGljaCBmb3JtYXRzCisJYXJlIHN1cHBvcnRlZCwgYW5kIHRoZWlyIHN5bnRheC4KKworLS1mb3JjZTo6CisJRm9yY2UgdXBkYXRpbmcgbW9kaWZpZWQgZXhpc3RpbmcgYnJhbmNoZXMsIGV2ZW4gaWYgZG9pbmcKKwlzbyB3b3VsZCBjYXVzZSBjb21taXRzIHRvIGJlIGxvc3QgKGFzIHRoZSBuZXcgY29tbWl0IGRvZXMKKwlub3QgY29udGFpbiB0aGUgb2xkIGNvbW1pdCkuCisKKy0tbWF4LXBhY2stc2l6ZT08bj46OgorCU1heGltdW0gc2l6ZSBvZiBlYWNoIG91dHB1dCBwYWNrZmlsZSwgZXhwcmVzc2VkIGluIE1pQi4KKwlUaGUgZGVmYXVsdCBpcyA0MDk2ICg0IEdpQikgYXMgdGhhdCBpcyB0aGUgbWF4aW11bSBhbGxvd2VkCisJcGFja2ZpbGUgc2l6ZSAoZHVlIHRvIGZpbGUgZm9ybWF0IGxpbWl0YXRpb25zKS4gU29tZQorCWltcG9ydGVycyBtYXkgd2lzaCB0byBsb3dlciB0aGlzLCBzdWNoIGFzIHRvIGVuc3VyZSB0aGUKKwlyZXN1bHRpbmcgcGFja2ZpbGVzIGZpdCBvbiBDRHMuCisKKy0tZGVwdGg9PG4+OjoKKwlNYXhpbXVtIGRlbHRhIGRlcHRoLCBmb3IgYmxvYiBhbmQgdHJlZSBkZWx0aWZpY2F0aW9uLgorCURlZmF1bHQgaXMgMTAuCisKKy0tYWN0aXZlLWJyYW5jaGVzPTxuPjo6CisJTWF4aW11bSBudW1iZXIgb2YgYnJhbmNoZXMgdG8gbWFpbnRhaW4gYWN0aXZlIGF0IG9uY2UuCisJU2VlIGBgTWVtb3J5IFV0aWxpemF0aW9uJycgYmVsb3cgZm9yIGRldGFpbHMuICBEZWZhdWx0IGlzIDUuCisKKy0tZXhwb3J0LW1hcmtzPTxmaWxlPjo6CisJRHVtcHMgdGhlIGludGVybmFsIG1hcmtzIHRhYmxlIHRvIDxmaWxlPiB3aGVuIGNvbXBsZXRlLgorCU1hcmtzIGFyZSB3cml0dGVuIG9uZSBwZXIgbGluZSBhcyBgOm1hcmtpZCBTSEEtMWAuCisJRnJvbnRlbmRzIGNhbiB1c2UgdGhpcyBmaWxlIHRvIHZhbGlkYXRlIGltcG9ydHMgYWZ0ZXIgdGhleQorCWhhdmUgYmVlbiBjb21wbGV0ZWQsIG9yIHRvIHNhdmUgdGhlIG1hcmtzIHRhYmxlIGFjcm9zcworCWluY3JlbWVudGFsIHJ1bnMuICBBcyA8ZmlsZT4gaXMgb25seSBvcGVuZWQgYW5kIHRydW5jYXRlZAorCWF0IGNoZWNrcG9pbnQgKG9yIGNvbXBsZXRpb24pIHRoZSBzYW1lIHBhdGggY2FuIGFsc28gYmUKKwlzYWZlbHkgZ2l2ZW4gdG8gXC0taW1wb3J0LW1hcmtzLgorCistLWltcG9ydC1tYXJrcz08ZmlsZT46OgorCUJlZm9yZSBwcm9jZXNzaW5nIGFueSBpbnB1dCwgbG9hZCB0aGUgbWFya3Mgc3BlY2lmaWVkIGluCisJPGZpbGU+LiAgVGhlIGlucHV0IGZpbGUgbXVzdCBleGlzdCwgbXVzdCBiZSByZWFkYWJsZSwgYW5kCisJbXVzdCB1c2UgdGhlIHNhbWUgZm9ybWF0IGFzIHByb2R1Y2VkIGJ5IFwtLWV4cG9ydC1tYXJrcy4KKwlNdWx0aXBsZSBvcHRpb25zIG1heSBiZSBzdXBwbGllZCB0byBpbXBvcnQgbW9yZSB0aGFuIG9uZQorCXNldCBvZiBtYXJrcy4gIElmIGEgbWFyayBpcyBkZWZpbmVkIHRvIGRpZmZlcmVudCB2YWx1ZXMsCisJdGhlIGxhc3QgZmlsZSB3aW5zLgorCistLWV4cG9ydC1wYWNrLWVkZ2VzPTxmaWxlPjo6CisJQWZ0ZXIgY3JlYXRpbmcgYSBwYWNrZmlsZSwgcHJpbnQgYSBsaW5lIG9mIGRhdGEgdG8KKwk8ZmlsZT4gbGlzdGluZyB0aGUgZmlsZW5hbWUgb2YgdGhlIHBhY2tmaWxlIGFuZCB0aGUgbGFzdAorCWNvbW1pdCBvbiBlYWNoIGJyYW5jaCB0aGF0IHdhcyB3cml0dGVuIHRvIHRoYXQgcGFja2ZpbGUuCisJVGhpcyBpbmZvcm1hdGlvbiBtYXkgYmUgdXNlZnVsIGFmdGVyIGltcG9ydGluZyBwcm9qZWN0cworCXdob3NlIHRvdGFsIG9iamVjdCBzZXQgZXhjZWVkcyB0aGUgNCBHaUIgcGFja2ZpbGUgbGltaXQsCisJYXMgdGhlc2UgY29tbWl0cyBjYW4gYmUgdXNlZCBhcyBlZGdlIHBvaW50cyBkdXJpbmcgY2FsbHMKKwl0byBsaW5rZ2l0OmdpdC1wYWNrLW9iamVjdHNbMV0uCisKKy0tcXVpZXQ6OgorCURpc2FibGUgYWxsIG5vbi1mYXRhbCBvdXRwdXQsIG1ha2luZyBmYXN0LWltcG9ydCBzaWxlbnQgd2hlbiBpdAorCWlzIHN1Y2Nlc3NmdWwuCVRoaXMgb3B0aW9uIGRpc2FibGVzIHRoZSBvdXRwdXQgc2hvd24gYnkKKwlcLS1zdGF0cy4KKworLS1zdGF0czo6CisJRGlzcGxheSBzb21lIGJhc2ljIHN0YXRpc3RpY3MgYWJvdXQgdGhlIG9iamVjdHMgZmFzdC1pbXBvcnQgaGFzCisJY3JlYXRlZCwgdGhlIHBhY2tmaWxlcyB0aGV5IHdlcmUgc3RvcmVkIGludG8sIGFuZCB0aGUKKwltZW1vcnkgdXNlZCBieSBmYXN0LWltcG9ydCBkdXJpbmcgdGhpcyBydW4uICBTaG93aW5nIHRoaXMgb3V0cHV0CisJaXMgY3VycmVudGx5IHRoZSBkZWZhdWx0LCBidXQgY2FuIGJlIGRpc2FibGVkIHdpdGggXC0tcXVpZXQuCisKKworUGVyZm9ybWFuY2UKKy0tLS0tLS0tLS0tCitUaGUgZGVzaWduIG9mIGZhc3QtaW1wb3J0IGFsbG93cyBpdCB0byBpbXBvcnQgbGFyZ2UgcHJvamVjdHMgaW4gYSBtaW5pbXVtCithbW91bnQgb2YgbWVtb3J5IHVzYWdlIGFuZCBwcm9jZXNzaW5nIHRpbWUuICBBc3N1bWluZyB0aGUgZnJvbnRlbmQKK2lzIGFibGUgdG8ga2VlcCB1cCB3aXRoIGZhc3QtaW1wb3J0IGFuZCBmZWVkIGl0IGEgY29uc3RhbnQgc3RyZWFtIG9mIGRhdGEsCitpbXBvcnQgdGltZXMgZm9yIHByb2plY3RzIGhvbGRpbmcgMTArIHllYXJzIG9mIGhpc3RvcnkgYW5kIGNvbnRhaW5pbmcKKzEwMCwwMDArIGluZGl2aWR1YWwgY29tbWl0cyBhcmUgZ2VuZXJhbGx5IGNvbXBsZXRlZCBpbiBqdXN0IDEtMgoraG91cnMgb24gcXVpdGUgbW9kZXN0ICh+JDIsMDAwIFVTRCkgaGFyZHdhcmUuCisKK01vc3QgYm90dGxlbmVja3MgYXBwZWFyIHRvIGJlIGluIGZvcmVpZ24gc291cmNlIGRhdGEgYWNjZXNzICh0aGUKK3NvdXJjZSBqdXN0IGNhbm5vdCBleHRyYWN0IHJldmlzaW9ucyBmYXN0IGVub3VnaCkgb3IgZGlzayBJTyAoZmFzdC1pbXBvcnQKK3dyaXRlcyBhcyBmYXN0IGFzIHRoZSBkaXNrIHdpbGwgdGFrZSB0aGUgZGF0YSkuICBJbXBvcnRzIHdpbGwgcnVuCitmYXN0ZXIgaWYgdGhlIHNvdXJjZSBkYXRhIGlzIHN0b3JlZCBvbiBhIGRpZmZlcmVudCBkcml2ZSB0aGFuIHRoZQorZGVzdGluYXRpb24gR2l0IHJlcG9zaXRvcnkgKGR1ZSB0byBsZXNzIElPIGNvbnRlbnRpb24pLgorCisKK0RldmVsb3BtZW50IENvc3QKKy0tLS0tLS0tLS0tLS0tLS0KK0EgdHlwaWNhbCBmcm9udGVuZCBmb3IgZmFzdC1pbXBvcnQgdGVuZHMgdG8gd2VpZ2ggaW4gYXQgYXBwcm94aW1hdGVseSAyMDAKK2xpbmVzIG9mIFBlcmwvUHl0aG9uL1J1YnkgY29kZS4gIE1vc3QgZGV2ZWxvcGVycyBoYXZlIGJlZW4gYWJsZSB0bworY3JlYXRlIHdvcmtpbmcgaW1wb3J0ZXJzIGluIGp1c3QgYSBjb3VwbGUgb2YgaG91cnMsIGV2ZW4gdGhvdWdoIGl0CitpcyB0aGVpciBmaXJzdCBleHBvc3VyZSB0byBmYXN0LWltcG9ydCwgYW5kIHNvbWV0aW1lcyBldmVuIHRvIEdpdC4gIFRoaXMgaXMKK2FuIGlkZWFsIHNpdHVhdGlvbiwgZ2l2ZW4gdGhhdCBtb3N0IGNvbnZlcnNpb24gdG9vbHMgYXJlIHRocm93LWF3YXkKKyh1c2Ugb25jZSwgYW5kIG5ldmVyIGxvb2sgYmFjaykuCisKKworUGFyYWxsZWwgT3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0KK0xpa2UgYGdpdC1wdXNoYCBvciBgZ2l0LWZldGNoYCwgaW1wb3J0cyBoYW5kbGVkIGJ5IGZhc3QtaW1wb3J0IGFyZSBzYWZlIHRvCitydW4gYWxvbmdzaWRlIHBhcmFsbGVsIGBnaXQgcmVwYWNrIC1hIC1kYCBvciBgZ2l0IGdjYCBpbnZvY2F0aW9ucywKK29yIGFueSBvdGhlciBHaXQgb3BlcmF0aW9uIChpbmNsdWRpbmcgYGdpdCBwcnVuZWAsIGFzIGxvb3NlIG9iamVjdHMKK2FyZSBuZXZlciB1c2VkIGJ5IGZhc3QtaW1wb3J0KS4KKworZmFzdC1pbXBvcnQgZG9lcyBub3QgbG9jayB0aGUgYnJhbmNoIG9yIHRhZyByZWZzIGl0IGlzIGFjdGl2ZWx5IGltcG9ydGluZy4KK0FmdGVyIHRoZSBpbXBvcnQsIGR1cmluZyBpdHMgcmVmIHVwZGF0ZSBwaGFzZSwgZmFzdC1pbXBvcnQgdGVzdHMgZWFjaAorZXhpc3RpbmcgYnJhbmNoIHJlZiB0byB2ZXJpZnkgdGhlIHVwZGF0ZSB3aWxsIGJlIGEgZmFzdC1mb3J3YXJkCit1cGRhdGUgKHRoZSBjb21taXQgc3RvcmVkIGluIHRoZSByZWYgaXMgY29udGFpbmVkIGluIHRoZSBuZXcKK2hpc3Rvcnkgb2YgdGhlIGNvbW1pdCB0byBiZSB3cml0dGVuKS4gIElmIHRoZSB1cGRhdGUgaXMgbm90IGEKK2Zhc3QtZm9yd2FyZCB1cGRhdGUsIGZhc3QtaW1wb3J0IHdpbGwgc2tpcCB1cGRhdGluZyB0aGF0IHJlZiBhbmQgaW5zdGVhZAorcHJpbnRzIGEgd2FybmluZyBtZXNzYWdlLiAgZmFzdC1pbXBvcnQgd2lsbCBhbHdheXMgYXR0ZW1wdCB0byB1cGRhdGUgYWxsCiticmFuY2ggcmVmcywgYW5kIGRvZXMgbm90IHN0b3Agb24gdGhlIGZpcnN0IGZhaWx1cmUuCisKK0JyYW5jaCB1cGRhdGVzIGNhbiBiZSBmb3JjZWQgd2l0aCBcLS1mb3JjZSwgYnV0IGl0cyByZWNvbW1lbmRlZCB0aGF0Cit0aGlzIG9ubHkgYmUgdXNlZCBvbiBhbiBvdGhlcndpc2UgcXVpZXQgcmVwb3NpdG9yeS4gIFVzaW5nIFwtLWZvcmNlCitpcyBub3QgbmVjZXNzYXJ5IGZvciBhbiBpbml0aWFsIGltcG9ydCBpbnRvIGFuIGVtcHR5IHJlcG9zaXRvcnkuCisKKworVGVjaG5pY2FsIERpc2N1c3Npb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tCitmYXN0LWltcG9ydCB0cmFja3MgYSBzZXQgb2YgYnJhbmNoZXMgaW4gbWVtb3J5LiAgQW55IGJyYW5jaCBjYW4gYmUgY3JlYXRlZAorb3IgbW9kaWZpZWQgYXQgYW55IHBvaW50IGR1cmluZyB0aGUgaW1wb3J0IHByb2Nlc3MgYnkgc2VuZGluZyBhCitgY29tbWl0YCBjb21tYW5kIG9uIHRoZSBpbnB1dCBzdHJlYW0uICBUaGlzIGRlc2lnbiBhbGxvd3MgYSBmcm9udGVuZAorcHJvZ3JhbSB0byBwcm9jZXNzIGFuIHVubGltaXRlZCBudW1iZXIgb2YgYnJhbmNoZXMgc2ltdWx0YW5lb3VzbHksCitnZW5lcmF0aW5nIGNvbW1pdHMgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBzb3VyY2UKK2RhdGEuICBJdCBhbHNvIHNpbXBsaWZpZXMgdGhlIGZyb250ZW5kIHByb2dyYW1zIGNvbnNpZGVyYWJseS4KKworZmFzdC1pbXBvcnQgZG9lcyBub3QgdXNlIG9yIGFsdGVyIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBvciBhbnkKK2ZpbGUgd2l0aGluIGl0LiAgKEl0IGRvZXMgaG93ZXZlciB1cGRhdGUgdGhlIGN1cnJlbnQgR2l0IHJlcG9zaXRvcnksCithcyByZWZlcmVuY2VkIGJ5IGBHSVRfRElSYC4pICBUaGVyZWZvcmUgYW4gaW1wb3J0IGZyb250ZW5kIG1heSB1c2UKK3RoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgaXRzIG93biBwdXJwb3Nlcywgc3VjaCBhcyBleHRyYWN0aW5nIGZpbGUKK3JldmlzaW9ucyBmcm9tIHRoZSBmb3JlaWduIHNvdXJjZS4gIFRoaXMgaWdub3JhbmNlIG9mIHRoZSB3b3JraW5nCitkaXJlY3RvcnkgYWxzbyBhbGxvd3MgZmFzdC1pbXBvcnQgdG8gcnVuIHZlcnkgcXVpY2tseSwgYXMgaXQgZG9lcyBub3QKK25lZWQgdG8gcGVyZm9ybSBhbnkgY29zdGx5IGZpbGUgdXBkYXRlIG9wZXJhdGlvbnMgd2hlbiBzd2l0Y2hpbmcKK2JldHdlZW4gYnJhbmNoZXMuCisKK0lucHV0IEZvcm1hdAorLS0tLS0tLS0tLS0tCitXaXRoIHRoZSBleGNlcHRpb24gb2YgcmF3IGZpbGUgZGF0YSAod2hpY2ggR2l0IGRvZXMgbm90IGludGVycHJldCkKK3RoZSBmYXN0LWltcG9ydCBpbnB1dCBmb3JtYXQgaXMgdGV4dCAoQVNDSUkpIGJhc2VkLiAgVGhpcyB0ZXh0IGJhc2VkCitmb3JtYXQgc2ltcGxpZmllcyBkZXZlbG9wbWVudCBhbmQgZGVidWdnaW5nIG9mIGZyb250ZW5kIHByb2dyYW1zLAorZXNwZWNpYWxseSB3aGVuIGEgaGlnaGVyIGxldmVsIGxhbmd1YWdlIHN1Y2ggYXMgUGVybCwgUHl0aG9uIG9yCitSdWJ5IGlzIGJlaW5nIHVzZWQuCisKK2Zhc3QtaW1wb3J0IGlzIHZlcnkgc3RyaWN0IGFib3V0IGl0cyBpbnB1dC4gIFdoZXJlIHdlIHNheSBTUCBiZWxvdyB3ZSBtZWFuCisqZXhhY3RseSogb25lIHNwYWNlLiAgTGlrZXdpc2UgTEYgbWVhbnMgb25lIChhbmQgb25seSBvbmUpIGxpbmVmZWVkLgorU3VwcGx5aW5nIGFkZGl0aW9uYWwgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHdpbGwgY2F1c2UgdW5leHBlY3RlZAorcmVzdWx0cywgc3VjaCBhcyBicmFuY2ggbmFtZXMgb3IgZmlsZSBuYW1lcyB3aXRoIGxlYWRpbmcgb3IgdHJhaWxpbmcKK3NwYWNlcyBpbiB0aGVpciBuYW1lLCBvciBlYXJseSB0ZXJtaW5hdGlvbiBvZiBmYXN0LWltcG9ydCB3aGVuIGl0IGVuY291bnRlcnMKK3VuZXhwZWN0ZWQgaW5wdXQuCisKK1N0cmVhbSBDb21tZW50cworfn5+fn5+fn5+fn5+fn5+CitUbyBhaWQgaW4gZGVidWdnaW5nIGZyb250ZW5kcyBmYXN0LWltcG9ydCBpZ25vcmVzIGFueSBsaW5lIHRoYXQKK2JlZ2lucyB3aXRoIGAjYCAoQVNDSUkgcG91bmQvaGFzaCkgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgbGluZQorZW5kaW5nIGBMRmAuICBBIGNvbW1lbnQgbGluZSBtYXkgY29udGFpbiBhbnkgc2VxdWVuY2Ugb2YgYnl0ZXMKK3RoYXQgZG9lcyBub3QgY29udGFpbiBhbiBMRiBhbmQgdGhlcmVmb3JlIG1heSBiZSB1c2VkIHRvIGluY2x1ZGUKK2FueSBkZXRhaWxlZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBiZSBzcGVjaWZpYyB0byB0aGUKK2Zyb250ZW5kIGFuZCB1c2VmdWwgd2hlbiBpbnNwZWN0aW5nIGEgZmFzdC1pbXBvcnQgZGF0YSBzdHJlYW0uCisKK0RhdGUgRm9ybWF0cworfn5+fn5+fn5+fn5+CitUaGUgZm9sbG93aW5nIGRhdGUgZm9ybWF0cyBhcmUgc3VwcG9ydGVkLiAgQSBmcm9udGVuZCBzaG91bGQgc2VsZWN0Cit0aGUgZm9ybWF0IGl0IHdpbGwgdXNlIGZvciB0aGlzIGltcG9ydCBieSBwYXNzaW5nIHRoZSBmb3JtYXQgbmFtZQoraW4gdGhlIFwtLWRhdGUtZm9ybWF0PTxmbXQ+IGNvbW1hbmQgbGluZSBvcHRpb24uCisKK2ByYXdgOjoKKwlUaGlzIGlzIHRoZSBHaXQgbmF0aXZlIGZvcm1hdCBhbmQgaXMgYDx0aW1lPiBTUCA8b2ZmdXRjPmAuCisJSXQgaXMgYWxzbyBmYXN0LWltcG9ydCdzIGRlZmF1bHQgZm9ybWF0LCBpZiBcLS1kYXRlLWZvcm1hdCB3YXMKKwlub3Qgc3BlY2lmaWVkLgorKworVGhlIHRpbWUgb2YgdGhlIGV2ZW50IGlzIHNwZWNpZmllZCBieSBgPHRpbWU+YCBhcyB0aGUgbnVtYmVyIG9mCitzZWNvbmRzIHNpbmNlIHRoZSBVTklYIGVwb2NoIChtaWRuaWdodCwgSmFuIDEsIDE5NzAsIFVUQykgYW5kIGlzCit3cml0dGVuIGFzIGFuIEFTQ0lJIGRlY2ltYWwgaW50ZWdlci4KKysKK1RoZSBsb2NhbCBvZmZzZXQgaXMgc3BlY2lmaWVkIGJ5IGA8b2ZmdXRjPmAgYXMgYSBwb3NpdGl2ZSBvciBuZWdhdGl2ZQorb2Zmc2V0IGZyb20gVVRDLiAgRm9yIGV4YW1wbGUgRVNUICh3aGljaCBpcyA1IGhvdXJzIGJlaGluZCBVVEMpCit3b3VsZCBiZSBleHByZXNzZWQgaW4gYDx0ej5gIGJ5IGBgLTA1MDAnJyB3aGlsZSBVVEMgaXMgYGArMDAwMCcnLgorVGhlIGxvY2FsIG9mZnNldCBkb2VzIG5vdCBhZmZlY3QgYDx0aW1lPmA7IGl0IGlzIHVzZWQgb25seSBhcyBhbgorYWR2aXNlbWVudCB0byBoZWxwIGZvcm1hdHRpbmcgcm91dGluZXMgZGlzcGxheSB0aGUgdGltZXN0YW1wLgorKworSWYgdGhlIGxvY2FsIG9mZnNldCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBzb3VyY2UgbWF0ZXJpYWwsIHVzZQorYGArMDAwMCcnLCBvciB0aGUgbW9zdCBjb21tb24gbG9jYWwgb2Zmc2V0LiAgRm9yIGV4YW1wbGUgbWFueQorb3JnYW5pemF0aW9ucyBoYXZlIGEgQ1ZTIHJlcG9zaXRvcnkgd2hpY2ggaGFzIG9ubHkgZXZlciBiZWVuIGFjY2Vzc2VkCitieSB1c2VycyB3aG8gYXJlIGxvY2F0ZWQgaW4gdGhlIHNhbWUgbG9jYXRpb24gYW5kIHRpbWV6b25lLiAgSW4gdGhpcworY2FzZSBhIHJlYXNvbmFibGUgb2Zmc2V0IGZyb20gVVRDIGNvdWxkIGJlIGFzc3VtZWQuCisrCitVbmxpa2UgdGhlIGByZmMyODIyYCBmb3JtYXQsIHRoaXMgZm9ybWF0IGlzIHZlcnkgc3RyaWN0LiAgQW55Cit2YXJpYXRpb24gaW4gZm9ybWF0dGluZyB3aWxsIGNhdXNlIGZhc3QtaW1wb3J0IHRvIHJlamVjdCB0aGUgdmFsdWUuCisKK2ByZmMyODIyYDo6CisJVGhpcyBpcyB0aGUgc3RhbmRhcmQgZW1haWwgZm9ybWF0IGFzIGRlc2NyaWJlZCBieSBSRkMgMjgyMi4KKysKK0FuIGV4YW1wbGUgdmFsdWUgaXMgYGBUdWUgRmViIDYgMTE6MjI6MTggMjAwNyAtMDUwMCcnLiAgVGhlIEdpdAorcGFyc2VyIGlzIGFjY3VyYXRlLCBidXQgYSBsaXR0bGUgb24gdGhlIGxlbmllbnQgc2lkZS4gIEl0IGlzIHRoZQorc2FtZSBwYXJzZXIgdXNlZCBieSBsaW5rZ2l0OmdpdC1hbVsxXSB3aGVuIGFwcGx5aW5nIHBhdGNoZXMKK3JlY2VpdmVkIGZyb20gZW1haWwuCisrCitTb21lIG1hbGZvcm1lZCBzdHJpbmdzIG1heSBiZSBhY2NlcHRlZCBhcyB2YWxpZCBkYXRlcy4gIEluIHNvbWUgb2YKK3RoZXNlIGNhc2VzIEdpdCB3aWxsIHN0aWxsIGJlIGFibGUgdG8gb2J0YWluIHRoZSBjb3JyZWN0IGRhdGUgZnJvbQordGhlIG1hbGZvcm1lZCBzdHJpbmcuICBUaGVyZSBhcmUgYWxzbyBzb21lIHR5cGVzIG9mIG1hbGZvcm1lZAorc3RyaW5ncyB3aGljaCBHaXQgd2lsbCBwYXJzZSB3cm9uZywgYW5kIHlldCBjb25zaWRlciB2YWxpZC4KK1NlcmlvdXNseSBtYWxmb3JtZWQgc3RyaW5ncyB3aWxsIGJlIHJlamVjdGVkLgorKworVW5saWtlIHRoZSBgcmF3YCBmb3JtYXQgYWJvdmUsIHRoZSB0aW1lem9uZS9VVEMgb2Zmc2V0IGluZm9ybWF0aW9uCitjb250YWluZWQgaW4gYW4gUkZDIDI4MjIgZGF0ZSBzdHJpbmcgaXMgdXNlZCB0byBhZGp1c3QgdGhlIGRhdGUKK3ZhbHVlIHRvIFVUQyBwcmlvciB0byBzdG9yYWdlLiAgVGhlcmVmb3JlIGl0IGlzIGltcG9ydGFudCB0aGF0Cit0aGlzIGluZm9ybWF0aW9uIGJlIGFzIGFjY3VyYXRlIGFzIHBvc3NpYmxlLgorKworSWYgdGhlIHNvdXJjZSBtYXRlcmlhbCB1c2VzIFJGQyAyODIyIHN0eWxlIGRhdGVzLAordGhlIGZyb250ZW5kIHNob3VsZCBsZXQgZmFzdC1pbXBvcnQgaGFuZGxlIHRoZSBwYXJzaW5nIGFuZCBjb252ZXJzaW9uCisocmF0aGVyIHRoYW4gYXR0ZW1wdGluZyB0byBkbyBpdCBpdHNlbGYpIGFzIHRoZSBHaXQgcGFyc2VyIGhhcworYmVlbiB3ZWxsIHRlc3RlZCBpbiB0aGUgd2lsZC4KKysKK0Zyb250ZW5kcyBzaG91bGQgcHJlZmVyIHRoZSBgcmF3YCBmb3JtYXQgaWYgdGhlIHNvdXJjZSBtYXRlcmlhbAorYWxyZWFkeSB1c2VzIFVOSVgtZXBvY2ggZm9ybWF0LCBjYW4gYmUgY29heGVkIHRvIGdpdmUgZGF0ZXMgaW4gdGhhdAorZm9ybWF0LCBvciBpdHMgZm9ybWF0IGlzIGVhc2lseSBjb252ZXJ0aWJsZSB0byBpdCwgYXMgdGhlcmUgaXMgbm8KK2FtYmlndWl0eSBpbiBwYXJzaW5nLgorCitgbm93YDo6CisJQWx3YXlzIHVzZSB0aGUgY3VycmVudCB0aW1lIGFuZCB0aW1lem9uZS4gIFRoZSBsaXRlcmFsCisJYG5vd2AgbXVzdCBhbHdheXMgYmUgc3VwcGxpZWQgZm9yIGA8d2hlbj5gLgorKworVGhpcyBpcyBhIHRveSBmb3JtYXQuICBUaGUgY3VycmVudCB0aW1lIGFuZCB0aW1lem9uZSBvZiB0aGlzIHN5c3RlbQoraXMgYWx3YXlzIGNvcGllZCBpbnRvIHRoZSBpZGVudGl0eSBzdHJpbmcgYXQgdGhlIHRpbWUgaXQgaXMgYmVpbmcKK2NyZWF0ZWQgYnkgZmFzdC1pbXBvcnQuICBUaGVyZSBpcyBubyB3YXkgdG8gc3BlY2lmeSBhIGRpZmZlcmVudCB0aW1lIG9yCit0aW1lem9uZS4KKysKK1RoaXMgcGFydGljdWxhciBmb3JtYXQgaXMgc3VwcGxpZWQgYXMgaXRzIHNob3J0IHRvIGltcGxlbWVudCBhbmQKK21heSBiZSB1c2VmdWwgdG8gYSBwcm9jZXNzIHRoYXQgd2FudHMgdG8gY3JlYXRlIGEgbmV3IGNvbW1pdAorcmlnaHQgbm93LCB3aXRob3V0IG5lZWRpbmcgdG8gdXNlIGEgd29ya2luZyBkaXJlY3Rvcnkgb3IKK2xpbmtnaXQ6Z2l0LXVwZGF0ZS1pbmRleFsxXS4KKysKK0lmIHNlcGFyYXRlIGBhdXRob3JgIGFuZCBgY29tbWl0dGVyYCBjb21tYW5kcyBhcmUgdXNlZCBpbiBhIGBjb21taXRgCit0aGUgdGltZXN0YW1wcyBtYXkgbm90IG1hdGNoLCBhcyB0aGUgc3lzdGVtIGNsb2NrIHdpbGwgYmUgcG9sbGVkCit0d2ljZSAob25jZSBmb3IgZWFjaCBjb21tYW5kKS4gIFRoZSBvbmx5IHdheSB0byBlbnN1cmUgdGhhdCBib3RoCithdXRob3IgYW5kIGNvbW1pdHRlciBpZGVudGl0eSBpbmZvcm1hdGlvbiBoYXMgdGhlIHNhbWUgdGltZXN0YW1wCitpcyB0byBvbWl0IGBhdXRob3JgICh0aHVzIGNvcHlpbmcgZnJvbSBgY29tbWl0dGVyYCkgb3IgdG8gdXNlIGEKK2RhdGUgZm9ybWF0IG90aGVyIHRoYW4gYG5vd2AuCisKK0NvbW1hbmRzCit+fn5+fn5+fgorZmFzdC1pbXBvcnQgYWNjZXB0cyBzZXZlcmFsIGNvbW1hbmRzIHRvIHVwZGF0ZSB0aGUgY3VycmVudCByZXBvc2l0b3J5CithbmQgY29udHJvbCB0aGUgY3VycmVudCBpbXBvcnQgcHJvY2Vzcy4gIE1vcmUgZGV0YWlsZWQgZGlzY3Vzc2lvbgorKHdpdGggZXhhbXBsZXMpIG9mIGVhY2ggY29tbWFuZCBmb2xsb3dzIGxhdGVyLgorCitgY29tbWl0YDo6CisJQ3JlYXRlcyBhIG5ldyBicmFuY2ggb3IgdXBkYXRlcyBhbiBleGlzdGluZyBicmFuY2ggYnkKKwljcmVhdGluZyBhIG5ldyBjb21taXQgYW5kIHVwZGF0aW5nIHRoZSBicmFuY2ggdG8gcG9pbnQgYXQKKwl0aGUgbmV3bHkgY3JlYXRlZCBjb21taXQuCisKK2B0YWdgOjoKKwlDcmVhdGVzIGFuIGFubm90YXRlZCB0YWcgb2JqZWN0IGZyb20gYW4gZXhpc3RpbmcgY29tbWl0IG9yCisJYnJhbmNoLiAgTGlnaHR3ZWlnaHQgdGFncyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGNvbW1hbmQsCisJYXMgdGhleSBhcmUgbm90IHJlY29tbWVuZGVkIGZvciByZWNvcmRpbmcgbWVhbmluZ2Z1bCBwb2ludHMKKwlpbiB0aW1lLgorCitgcmVzZXRgOjoKKwlSZXNldCBhbiBleGlzdGluZyBicmFuY2ggKG9yIGEgbmV3IGJyYW5jaCkgdG8gYSBzcGVjaWZpYworCXJldmlzaW9uLiAgVGhpcyBjb21tYW5kIG11c3QgYmUgdXNlZCB0byBjaGFuZ2UgYSBicmFuY2ggdG8KKwlhIHNwZWNpZmljIHJldmlzaW9uIHdpdGhvdXQgbWFraW5nIGEgY29tbWl0IG9uIGl0LgorCitgYmxvYmA6OgorCUNvbnZlcnQgcmF3IGZpbGUgZGF0YSBpbnRvIGEgYmxvYiwgZm9yIGZ1dHVyZSB1c2UgaW4gYQorCWBjb21taXRgIGNvbW1hbmQuICBUaGlzIGNvbW1hbmQgaXMgb3B0aW9uYWwgYW5kIGlzIG5vdAorCW5lZWRlZCB0byBwZXJmb3JtIGFuIGltcG9ydC4KKworYGNoZWNrcG9pbnRgOjoKKwlGb3JjZXMgZmFzdC1pbXBvcnQgdG8gY2xvc2UgdGhlIGN1cnJlbnQgcGFja2ZpbGUsIGdlbmVyYXRlIGl0cworCXVuaXF1ZSBTSEEtMSBjaGVja3N1bSBhbmQgaW5kZXgsIGFuZCBzdGFydCBhIG5ldyBwYWNrZmlsZS4KKwlUaGlzIGNvbW1hbmQgaXMgb3B0aW9uYWwgYW5kIGlzIG5vdCBuZWVkZWQgdG8gcGVyZm9ybQorCWFuIGltcG9ydC4KKworYHByb2dyZXNzYDo6CisJQ2F1c2VzIGZhc3QtaW1wb3J0IHRvIGVjaG8gdGhlIGVudGlyZSBsaW5lIHRvIGl0cyBvd24KKwlzdGFuZGFyZCBvdXRwdXQuICBUaGlzIGNvbW1hbmQgaXMgb3B0aW9uYWwgYW5kIGlzIG5vdCBuZWVkZWQKKwl0byBwZXJmb3JtIGFuIGltcG9ydC4KKworYGNvbW1pdGAKK35+fn5+fn5+CitDcmVhdGUgb3IgdXBkYXRlIGEgYnJhbmNoIHdpdGggYSBuZXcgY29tbWl0LCByZWNvcmRpbmcgb25lIGxvZ2ljYWwKK2NoYW5nZSB0byB0aGUgcHJvamVjdC4KKworLi4uLgorCSdjb21taXQnIFNQIDxyZWY+IExGCisJbWFyaz8KKwkoJ2F1dGhvcicgU1AgPG5hbWU+IFNQIExUIDxlbWFpbD4gR1QgU1AgPHdoZW4+IExGKT8KKwknY29tbWl0dGVyJyBTUCA8bmFtZT4gU1AgTFQgPGVtYWlsPiBHVCBTUCA8d2hlbj4gTEYKKwlkYXRhCisJKCdmcm9tJyBTUCA8Y29tbWl0dGlzaD4gTEYpPworCSgnbWVyZ2UnIFNQIDxjb21taXR0aXNoPiBMRik/CisJKGZpbGVtb2RpZnkgfCBmaWxlZGVsZXRlIHwgZmlsZWNvcHkgfCBmaWxlcmVuYW1lIHwgZmlsZWRlbGV0ZWFsbCkqCisJTEY/CisuLi4uCisKK3doZXJlIGA8cmVmPmAgaXMgdGhlIG5hbWUgb2YgdGhlIGJyYW5jaCB0byBtYWtlIHRoZSBjb21taXQgb24uCitUeXBpY2FsbHkgYnJhbmNoIG5hbWVzIGFyZSBwcmVmaXhlZCB3aXRoIGByZWZzL2hlYWRzL2AgaW4KK0dpdCwgc28gaW1wb3J0aW5nIHRoZSBDVlMgYnJhbmNoIHN5bWJvbCBgUkVMRU5HLTFfMGAgd291bGQgdXNlCitgcmVmcy9oZWFkcy9SRUxFTkctMV8wYCBmb3IgdGhlIHZhbHVlIG9mIGA8cmVmPmAuICBUaGUgdmFsdWUgb2YKK2A8cmVmPmAgbXVzdCBiZSBhIHZhbGlkIHJlZm5hbWUgaW4gR2l0LiAgQXMgYExGYCBpcyBub3QgdmFsaWQgaW4KK2EgR2l0IHJlZm5hbWUsIG5vIHF1b3Rpbmcgb3IgZXNjYXBpbmcgc3ludGF4IGlzIHN1cHBvcnRlZCBoZXJlLgorCitBIGBtYXJrYCBjb21tYW5kIG1heSBvcHRpb25hbGx5IGFwcGVhciwgcmVxdWVzdGluZyBmYXN0LWltcG9ydCB0byBzYXZlIGEKK3JlZmVyZW5jZSB0byB0aGUgbmV3bHkgY3JlYXRlZCBjb21taXQgZm9yIGZ1dHVyZSB1c2UgYnkgdGhlIGZyb250ZW5kCisoc2VlIGJlbG93IGZvciBmb3JtYXQpLiAgSXQgaXMgdmVyeSBjb21tb24gZm9yIGZyb250ZW5kcyB0byBtYXJrCitldmVyeSBjb21taXQgdGhleSBjcmVhdGUsIHRoZXJlYnkgYWxsb3dpbmcgZnV0dXJlIGJyYW5jaCBjcmVhdGlvbgorZnJvbSBhbnkgaW1wb3J0ZWQgY29tbWl0LgorCitUaGUgYGRhdGFgIGNvbW1hbmQgZm9sbG93aW5nIGBjb21taXR0ZXJgIG11c3Qgc3VwcGx5IHRoZSBjb21taXQKK21lc3NhZ2UgKHNlZSBiZWxvdyBmb3IgYGRhdGFgIGNvbW1hbmQgc3ludGF4KS4gIFRvIGltcG9ydCBhbiBlbXB0eQorY29tbWl0IG1lc3NhZ2UgdXNlIGEgMCBsZW5ndGggZGF0YS4gIENvbW1pdCBtZXNzYWdlcyBhcmUgZnJlZS1mb3JtCithbmQgYXJlIG5vdCBpbnRlcnByZXRlZCBieSBHaXQuICBDdXJyZW50bHkgdGhleSBtdXN0IGJlIGVuY29kZWQgaW4KK1VURi04LCBhcyBmYXN0LWltcG9ydCBkb2VzIG5vdCBwZXJtaXQgb3RoZXIgZW5jb2RpbmdzIHRvIGJlIHNwZWNpZmllZC4KKworWmVybyBvciBtb3JlIGBmaWxlbW9kaWZ5YCwgYGZpbGVkZWxldGVgLCBgZmlsZWNvcHlgLCBgZmlsZXJlbmFtZWAKK2FuZCBgZmlsZWRlbGV0ZWFsbGAgY29tbWFuZHMKK21heSBiZSBpbmNsdWRlZCB0byB1cGRhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBicmFuY2ggcHJpb3IgdG8KK2NyZWF0aW5nIHRoZSBjb21taXQuICBUaGVzZSBjb21tYW5kcyBtYXkgYmUgc3VwcGxpZWQgaW4gYW55IG9yZGVyLgorSG93ZXZlciBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IGEgYGZpbGVkZWxldGVhbGxgIGNvbW1hbmQgcHJlY2VkZQorYWxsIGBmaWxlbW9kaWZ5YCwgYGZpbGVjb3B5YCBhbmQgYGZpbGVyZW5hbWVgIGNvbW1hbmRzIGluIHRoZSBzYW1lCitjb21taXQsIGFzIGBmaWxlZGVsZXRlYWxsYAord2lwZXMgdGhlIGJyYW5jaCBjbGVhbiAoc2VlIGJlbG93KS4KKworVGhlIGBMRmAgYWZ0ZXIgdGhlIGNvbW1hbmQgaXMgb3B0aW9uYWwgKGl0IHVzZWQgdG8gYmUgcmVxdWlyZWQpLgorCitgYXV0aG9yYAorXl5eXl5eXl4KK0FuIGBhdXRob3JgIGNvbW1hbmQgbWF5IG9wdGlvbmFsbHkgYXBwZWFyLCBpZiB0aGUgYXV0aG9yIGluZm9ybWF0aW9uCittaWdodCBkaWZmZXIgZnJvbSB0aGUgY29tbWl0dGVyIGluZm9ybWF0aW9uLiAgSWYgYGF1dGhvcmAgaXMgb21pdHRlZAordGhlbiBmYXN0LWltcG9ydCB3aWxsIGF1dG9tYXRpY2FsbHkgdXNlIHRoZSBjb21taXR0ZXIncyBpbmZvcm1hdGlvbiBmb3IKK3RoZSBhdXRob3IgcG9ydGlvbiBvZiB0aGUgY29tbWl0LiAgU2VlIGJlbG93IGZvciBhIGRlc2NyaXB0aW9uIG9mCit0aGUgZmllbGRzIGluIGBhdXRob3JgLCBhcyB0aGV5IGFyZSBpZGVudGljYWwgdG8gYGNvbW1pdHRlcmAuCisKK2Bjb21taXR0ZXJgCiteXl5eXl5eXl5eXgorVGhlIGBjb21taXR0ZXJgIGNvbW1hbmQgaW5kaWNhdGVzIHdobyBtYWRlIHRoaXMgY29tbWl0LCBhbmQgd2hlbgordGhleSBtYWRlIGl0LgorCitIZXJlIGA8bmFtZT5gIGlzIHRoZSBwZXJzb24ncyBkaXNwbGF5IG5hbWUgKGZvciBleGFtcGxlCitgYENvbSBNIEl0dGVyJycpIGFuZCBgPGVtYWlsPmAgaXMgdGhlIHBlcnNvbidzIGVtYWlsIGFkZHJlc3MKKyhgYGNtQGV4YW1wbGUuY29tJycpLiAgYExUYCBhbmQgYEdUYCBhcmUgdGhlIGxpdGVyYWwgbGVzcy10aGFuIChceDNjKQorYW5kIGdyZWF0ZXItdGhhbiAoXHgzZSkgc3ltYm9scy4gIFRoZXNlIGFyZSByZXF1aXJlZCB0byBkZWxpbWl0Cit0aGUgZW1haWwgYWRkcmVzcyBmcm9tIHRoZSBvdGhlciBmaWVsZHMgaW4gdGhlIGxpbmUuICBOb3RlIHRoYXQKK2A8bmFtZT5gIGlzIGZyZWUtZm9ybSBhbmQgbWF5IGNvbnRhaW4gYW55IHNlcXVlbmNlIG9mIGJ5dGVzLCBleGNlcHQKK2BMVGAgYW5kIGBMRmAuICBJdCBpcyB0eXBpY2FsbHkgVVRGLTggZW5jb2RlZC4KKworVGhlIHRpbWUgb2YgdGhlIGNoYW5nZSBpcyBzcGVjaWZpZWQgYnkgYDx3aGVuPmAgdXNpbmcgdGhlIGRhdGUgZm9ybWF0Cit0aGF0IHdhcyBzZWxlY3RlZCBieSB0aGUgXC0tZGF0ZS1mb3JtYXQ9PGZtdD4gY29tbWFuZCBsaW5lIG9wdGlvbi4KK1NlZSBgYERhdGUgRm9ybWF0cycnIGFib3ZlIGZvciB0aGUgc2V0IG9mIHN1cHBvcnRlZCBmb3JtYXRzLCBhbmQKK3RoZWlyIHN5bnRheC4KKworYGZyb21gCiteXl5eXl4KK1RoZSBgZnJvbWAgY29tbWFuZCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbW1pdCB0byBpbml0aWFsaXplCit0aGlzIGJyYW5jaCBmcm9tLiAgVGhpcyByZXZpc2lvbiB3aWxsIGJlIHRoZSBmaXJzdCBhbmNlc3RvciBvZiB0aGUKK25ldyBjb21taXQuCisKK09taXR0aW5nIHRoZSBgZnJvbWAgY29tbWFuZCBpbiB0aGUgZmlyc3QgY29tbWl0IG9mIGEgbmV3IGJyYW5jaAord2lsbCBjYXVzZSBmYXN0LWltcG9ydCB0byBjcmVhdGUgdGhhdCBjb21taXQgd2l0aCBubyBhbmNlc3Rvci4gVGhpcwordGVuZHMgdG8gYmUgZGVzaXJlZCBvbmx5IGZvciB0aGUgaW5pdGlhbCBjb21taXQgb2YgYSBwcm9qZWN0LgorSWYgdGhlIGZyb250ZW5kIGNyZWF0ZXMgYWxsIGZpbGVzIGZyb20gc2NyYXRjaCB3aGVuIG1ha2luZyBhIG5ldworYnJhbmNoLCBhIGBtZXJnZWAgY29tbWFuZCBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mIGBmcm9tYCB0byBzdGFydAordGhlIGNvbW1pdCB3aXRoIGFuIGVtcHR5IHRyZWUuCitPbWl0dGluZyB0aGUgYGZyb21gIGNvbW1hbmQgb24gZXhpc3RpbmcgYnJhbmNoZXMgaXMgdXN1YWxseSBkZXNpcmVkLAorYXMgdGhlIGN1cnJlbnQgY29tbWl0IG9uIHRoYXQgYnJhbmNoIGlzIGF1dG9tYXRpY2FsbHkgYXNzdW1lZCB0bworYmUgdGhlIGZpcnN0IGFuY2VzdG9yIG9mIHRoZSBuZXcgY29tbWl0LgorCitBcyBgTEZgIGlzIG5vdCB2YWxpZCBpbiBhIEdpdCByZWZuYW1lIG9yIFNIQS0xIGV4cHJlc3Npb24sIG5vCitxdW90aW5nIG9yIGVzY2FwaW5nIHN5bnRheCBpcyBzdXBwb3J0ZWQgd2l0aGluIGA8Y29tbWl0dGlzaD5gLgorCitIZXJlIGA8Y29tbWl0dGlzaD5gIGlzIGFueSBvZiB0aGUgZm9sbG93aW5nOgorCisqIFRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGJyYW5jaCBhbHJlYWR5IGluIGZhc3QtaW1wb3J0J3MgaW50ZXJuYWwgYnJhbmNoCisgIHRhYmxlLiAgSWYgZmFzdC1pbXBvcnQgZG9lc24ndCBrbm93IHRoZSBuYW1lLCBpdHMgdHJlYXRlZCBhcyBhIFNIQS0xCisgIGV4cHJlc3Npb24uCisKKyogQSBtYXJrIHJlZmVyZW5jZSwgYDo8aWRudW0+YCwgd2hlcmUgYDxpZG51bT5gIGlzIHRoZSBtYXJrIG51bWJlci4KKysKK1RoZSByZWFzb24gZmFzdC1pbXBvcnQgdXNlcyBgOmAgdG8gZGVub3RlIGEgbWFyayByZWZlcmVuY2UgaXMgdGhpcyBjaGFyYWN0ZXIKK2lzIG5vdCBsZWdhbCBpbiBhIEdpdCBicmFuY2ggbmFtZS4gIFRoZSBsZWFkaW5nIGA6YCBtYWtlcyBpdCBlYXN5Cit0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSBtYXJrIDQyIChgOjQyYCkgYW5kIHRoZSBicmFuY2ggNDIgKGA0MmAKK29yIGByZWZzL2hlYWRzLzQyYCksIG9yIGFuIGFiYnJldmlhdGVkIFNIQS0xIHdoaWNoIGhhcHBlbmVkIHRvCitjb25zaXN0IG9ubHkgb2YgYmFzZS0xMCBkaWdpdHMuCisrCitNYXJrcyBtdXN0IGJlIGRlY2xhcmVkICh2aWEgYG1hcmtgKSBiZWZvcmUgdGhleSBjYW4gYmUgdXNlZC4KKworKiBBIGNvbXBsZXRlIDQwIGJ5dGUgb3IgYWJicmV2aWF0ZWQgY29tbWl0IFNIQS0xIGluIGhleC4KKworKiBBbnkgdmFsaWQgR2l0IFNIQS0xIGV4cHJlc3Npb24gdGhhdCByZXNvbHZlcyB0byBhIGNvbW1pdC4gIFNlZQorICBgYFNQRUNJRllJTkcgUkVWSVNJT05TJycgaW4gbGlua2dpdDpnaXQtcmV2LXBhcnNlWzFdIGZvciBkZXRhaWxzLgorCitUaGUgc3BlY2lhbCBjYXNlIG9mIHJlc3RhcnRpbmcgYW4gaW5jcmVtZW50YWwgaW1wb3J0IGZyb20gdGhlCitjdXJyZW50IGJyYW5jaCB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbiBhczoKKy0tLS0KKwlmcm9tIHJlZnMvaGVhZHMvYnJhbmNoXjAKKy0tLS0KK1RoZSBge2NhcmV0fTBgIHN1ZmZpeCBpcyBuZWNlc3NhcnkgYXMgZmFzdC1pbXBvcnQgZG9lcyBub3QgcGVybWl0IGEgYnJhbmNoIHRvCitzdGFydCBmcm9tIGl0c2VsZiwgYW5kIHRoZSBicmFuY2ggaXMgY3JlYXRlZCBpbiBtZW1vcnkgYmVmb3JlIHRoZQorYGZyb21gIGNvbW1hbmQgaXMgZXZlbiByZWFkIGZyb20gdGhlIGlucHV0LiAgQWRkaW5nIGB7Y2FyZXR9MGAgd2lsbCBmb3JjZQorZmFzdC1pbXBvcnQgdG8gcmVzb2x2ZSB0aGUgY29tbWl0IHRocm91Z2ggR2l0J3MgcmV2aXNpb24gcGFyc2luZyBsaWJyYXJ5LAorcmF0aGVyIHRoYW4gaXRzIGludGVybmFsIGJyYW5jaCB0YWJsZSwgdGhlcmVieSBsb2FkaW5nIGluIHRoZQorZXhpc3RpbmcgdmFsdWUgb2YgdGhlIGJyYW5jaC4KKworYG1lcmdlYAorXl5eXl5eXgorSW5jbHVkZXMgb25lIGFkZGl0aW9uYWwgYW5jZXN0b3IgY29tbWl0LiAgSWYgdGhlIGBmcm9tYCBjb21tYW5kIGlzCitvbWl0dGVkIHdoZW4gY3JlYXRpbmcgYSBuZXcgYnJhbmNoLCB0aGUgZmlyc3QgYG1lcmdlYCBjb21taXQgd2lsbCBiZQordGhlIGZpcnN0IGFuY2VzdG9yIG9mIHRoZSBjdXJyZW50IGNvbW1pdCwgYW5kIHRoZSBicmFuY2ggd2lsbCBzdGFydAorb3V0IHdpdGggbm8gZmlsZXMuICBBbiB1bmxpbWl0ZWQgbnVtYmVyIG9mIGBtZXJnZWAgY29tbWFuZHMgcGVyCitjb21taXQgYXJlIHBlcm1pdHRlZCBieSBmYXN0LWltcG9ydCwgdGhlcmVieSBlc3RhYmxpc2hpbmcgYW4gbi13YXkgbWVyZ2UuCitIb3dldmVyIEdpdCdzIG90aGVyIHRvb2xzIG5ldmVyIGNyZWF0ZSBjb21taXRzIHdpdGggbW9yZSB0aGFuIDE1CithZGRpdGlvbmFsIGFuY2VzdG9ycyAoZm9ybWluZyBhIDE2LXdheSBtZXJnZSkuICBGb3IgdGhpcyByZWFzb24KK2l0IGlzIHN1Z2dlc3RlZCB0aGF0IGZyb250ZW5kcyBkbyBub3QgdXNlIG1vcmUgdGhhbiAxNSBgbWVyZ2VgCitjb21tYW5kcyBwZXIgY29tbWl0OyAxNiwgaWYgc3RhcnRpbmcgYSBuZXcsIGVtcHR5IGJyYW5jaC4KKworSGVyZSBgPGNvbW1pdHRpc2g+YCBpcyBhbnkgb2YgdGhlIGNvbW1pdCBzcGVjaWZpY2F0aW9uIGV4cHJlc3Npb25zCithbHNvIGFjY2VwdGVkIGJ5IGBmcm9tYCAoc2VlIGFib3ZlKS4KKworYGZpbGVtb2RpZnlgCiteXl5eXl5eXl5eXl4KK0luY2x1ZGVkIGluIGEgYGNvbW1pdGAgY29tbWFuZCB0byBhZGQgYSBuZXcgZmlsZSBvciBjaGFuZ2UgdGhlCitjb250ZW50IG9mIGFuIGV4aXN0aW5nIGZpbGUuICBUaGlzIGNvbW1hbmQgaGFzIHR3byBkaWZmZXJlbnQgbWVhbnMKK29mIHNwZWNpZnlpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUuCisKK0V4dGVybmFsIGRhdGEgZm9ybWF0OjoKKwlUaGUgZGF0YSBjb250ZW50IGZvciB0aGUgZmlsZSB3YXMgYWxyZWFkeSBzdXBwbGllZCBieSBhIHByaW9yCisJYGJsb2JgIGNvbW1hbmQuICBUaGUgZnJvbnRlbmQganVzdCBuZWVkcyB0byBjb25uZWN0IGl0LgorKworLi4uLgorCSdNJyBTUCA8bW9kZT4gU1AgPGRhdGFyZWY+IFNQIDxwYXRoPiBMRgorLi4uLgorKworSGVyZSBgPGRhdGFyZWY+YCBjYW4gYmUgZWl0aGVyIGEgbWFyayByZWZlcmVuY2UgKGA6PGlkbnVtPmApCitzZXQgYnkgYSBwcmlvciBgYmxvYmAgY29tbWFuZCwgb3IgYSBmdWxsIDQwLWJ5dGUgU0hBLTEgb2YgYW4KK2V4aXN0aW5nIEdpdCBibG9iIG9iamVjdC4KKworSW5saW5lIGRhdGEgZm9ybWF0OjoKKwlUaGUgZGF0YSBjb250ZW50IGZvciB0aGUgZmlsZSBoYXMgbm90IGJlZW4gc3VwcGxpZWQgeWV0LgorCVRoZSBmcm9udGVuZCB3YW50cyB0byBzdXBwbHkgaXQgYXMgcGFydCBvZiB0aGlzIG1vZGlmeQorCWNvbW1hbmQuCisrCisuLi4uCisJJ00nIFNQIDxtb2RlPiBTUCAnaW5saW5lJyBTUCA8cGF0aD4gTEYKKwlkYXRhCisuLi4uCisrCitTZWUgYmVsb3cgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIGBkYXRhYCBjb21tYW5kLgorCitJbiBib3RoIGZvcm1hdHMgYDxtb2RlPmAgaXMgdGhlIHR5cGUgb2YgZmlsZSBlbnRyeSwgc3BlY2lmaWVkCitpbiBvY3RhbC4gIEdpdCBvbmx5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgbW9kZXM6CisKKyogYDEwMDY0NGAgb3IgYDY0NGA6IEEgbm9ybWFsIChub3QtZXhlY3V0YWJsZSkgZmlsZS4gIFRoZSBtYWpvcml0eQorICBvZiBmaWxlcyBpbiBtb3N0IHByb2plY3RzIHVzZSB0aGlzIG1vZGUuICBJZiBpbiBkb3VidCwgdGhpcyBpcworICB3aGF0IHlvdSB3YW50LgorKiBgMTAwNzU1YCBvciBgNzU1YDogQSBub3JtYWwsIGJ1dCBleGVjdXRhYmxlLCBmaWxlLgorKiBgMTIwMDAwYDogQSBzeW1saW5rLCB0aGUgY29udGVudCBvZiB0aGUgZmlsZSB3aWxsIGJlIHRoZSBsaW5rIHRhcmdldC4KKworSW4gYm90aCBmb3JtYXRzIGA8cGF0aD5gIGlzIHRoZSBjb21wbGV0ZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGJlIGFkZGVkCisoaWYgbm90IGFscmVhZHkgZXhpc3RpbmcpIG9yIG1vZGlmaWVkIChpZiBhbHJlYWR5IGV4aXN0aW5nKS4KKworQSBgPHBhdGg+YCBzdHJpbmcgbXVzdCB1c2UgVU5JWC1zdHlsZSBkaXJlY3Rvcnkgc2VwYXJhdG9ycyAoZm9yd2FyZAorc2xhc2ggYC9gKSwgbWF5IGNvbnRhaW4gYW55IGJ5dGUgb3RoZXIgdGhhbiBgTEZgLCBhbmQgbXVzdCBub3QKK3N0YXJ0IHdpdGggZG91YmxlIHF1b3RlIChgImApLgorCitJZiBhbiBgTEZgIG9yIGRvdWJsZSBxdW90ZSBtdXN0IGJlIGVuY29kZWQgaW50byBgPHBhdGg+YCBzaGVsbC1zdHlsZQorcXVvdGluZyBzaG91bGQgYmUgdXNlZCwgZS5nLiBgInBhdGgvd2l0aFxuIGFuZCBcIiBpbiBpdCJgLgorCitUaGUgdmFsdWUgb2YgYDxwYXRoPmAgbXVzdCBiZSBpbiBjYW5vbmljYWwgZm9ybS4gVGhhdCBpcyBpdCBtdXN0IG5vdDoKKworKiBjb250YWluIGFuIGVtcHR5IGRpcmVjdG9yeSBjb21wb25lbnQgKGUuZy4gYGZvby8vYmFyYCBpcyBpbnZhbGlkKSwKKyogZW5kIHdpdGggYSBkaXJlY3Rvcnkgc2VwYXJhdG9yIChlLmcuIGBmb28vYCBpcyBpbnZhbGlkKSwKKyogc3RhcnQgd2l0aCBhIGRpcmVjdG9yeSBzZXBhcmF0b3IgKGUuZy4gYC9mb29gIGlzIGludmFsaWQpLAorKiBjb250YWluIHRoZSBzcGVjaWFsIGNvbXBvbmVudCBgLmAgb3IgYC4uYCAoZS5nLiBgZm9vLy4vYmFyYCBhbmQKKyAgYGZvby8uLi9iYXJgIGFyZSBpbnZhbGlkKS4KKworSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBgPHBhdGg+YCBhbHdheXMgYmUgZW5jb2RlZCB1c2luZyBVVEYtOC4KKworYGZpbGVkZWxldGVgCiteXl5eXl5eXl5eXl4KK0luY2x1ZGVkIGluIGEgYGNvbW1pdGAgY29tbWFuZCB0byByZW1vdmUgYSBmaWxlIG9yIHJlY3Vyc2l2ZWx5CitkZWxldGUgYW4gZW50aXJlIGRpcmVjdG9yeSBmcm9tIHRoZSBicmFuY2guICBJZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkKK3JlbW92YWwgbWFrZXMgaXRzIHBhcmVudCBkaXJlY3RvcnkgZW1wdHksIHRoZSBwYXJlbnQgZGlyZWN0b3J5IHdpbGwKK2JlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCB0b28uICBUaGlzIGNhc2NhZGVzIHVwIHRoZSB0cmVlIHVudGlsIHRoZQorZmlyc3Qgbm9uLWVtcHR5IGRpcmVjdG9yeSBvciB0aGUgcm9vdCBpcyByZWFjaGVkLgorCisuLi4uCisJJ0QnIFNQIDxwYXRoPiBMRgorLi4uLgorCitoZXJlIGA8cGF0aD5gIGlzIHRoZSBjb21wbGV0ZSBwYXRoIG9mIHRoZSBmaWxlIG9yIHN1YmRpcmVjdG9yeSB0bworYmUgcmVtb3ZlZCBmcm9tIHRoZSBicmFuY2guCitTZWUgYGZpbGVtb2RpZnlgIGFib3ZlIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGA8cGF0aD5gLgorCitgZmlsZWNvcHlgCiteXl5eXl5eXl5eXl4KK1JlY3Vyc2l2ZWx5IGNvcGllcyBhbiBleGlzdGluZyBmaWxlIG9yIHN1YmRpcmVjdG9yeSB0byBhIGRpZmZlcmVudAorbG9jYXRpb24gd2l0aGluIHRoZSBicmFuY2guICBUaGUgZXhpc3RpbmcgZmlsZSBvciBkaXJlY3RvcnkgbXVzdAorZXhpc3QuICBJZiB0aGUgZGVzdGluYXRpb24gZXhpc3RzIGl0IHdpbGwgYmUgY29tcGxldGVseSByZXBsYWNlZAorYnkgdGhlIGNvbnRlbnQgY29waWVkIGZyb20gdGhlIHNvdXJjZS4KKworLi4uLgorCSdDJyBTUCA8cGF0aD4gU1AgPHBhdGg+IExGCisuLi4uCisKK2hlcmUgdGhlIGZpcnN0IGA8cGF0aD5gIGlzIHRoZSBzb3VyY2UgbG9jYXRpb24gYW5kIHRoZSBzZWNvbmQKK2A8cGF0aD5gIGlzIHRoZSBkZXN0aW5hdGlvbi4gIFNlZSBgZmlsZW1vZGlmeWAgYWJvdmUgZm9yIGEgZGV0YWlsZWQKK2Rlc2NyaXB0aW9uIG9mIHdoYXQgYDxwYXRoPmAgbWF5IGxvb2sgbGlrZS4gIFRvIHVzZSBhIHNvdXJjZSBwYXRoCit0aGF0IGNvbnRhaW5zIFNQIHRoZSBwYXRoIG11c3QgYmUgcXVvdGVkLgorCitBIGBmaWxlY29weWAgY29tbWFuZCB0YWtlcyBlZmZlY3QgaW1tZWRpYXRlbHkuICBPbmNlIHRoZSBzb3VyY2UKK2xvY2F0aW9uIGhhcyBiZWVuIGNvcGllZCB0byB0aGUgZGVzdGluYXRpb24gYW55IGZ1dHVyZSBjb21tYW5kcworYXBwbGllZCB0byB0aGUgc291cmNlIGxvY2F0aW9uIHdpbGwgbm90IGltcGFjdCB0aGUgZGVzdGluYXRpb24gb2YKK3RoZSBjb3B5LgorCitgZmlsZXJlbmFtZWAKK15eXl5eXl5eXl5eXgorUmVuYW1lcyBhbiBleGlzdGluZyBmaWxlIG9yIHN1YmRpcmVjdG9yeSB0byBhIGRpZmZlcmVudCBsb2NhdGlvbgord2l0aGluIHRoZSBicmFuY2guICBUaGUgZXhpc3RpbmcgZmlsZSBvciBkaXJlY3RvcnkgbXVzdCBleGlzdC4gSWYKK3RoZSBkZXN0aW5hdGlvbiBleGlzdHMgaXQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgc291cmNlIGRpcmVjdG9yeS4KKworLi4uLgorCSdSJyBTUCA8cGF0aD4gU1AgPHBhdGg+IExGCisuLi4uCisKK2hlcmUgdGhlIGZpcnN0IGA8cGF0aD5gIGlzIHRoZSBzb3VyY2UgbG9jYXRpb24gYW5kIHRoZSBzZWNvbmQKK2A8cGF0aD5gIGlzIHRoZSBkZXN0aW5hdGlvbi4gIFNlZSBgZmlsZW1vZGlmeWAgYWJvdmUgZm9yIGEgZGV0YWlsZWQKK2Rlc2NyaXB0aW9uIG9mIHdoYXQgYDxwYXRoPmAgbWF5IGxvb2sgbGlrZS4gIFRvIHVzZSBhIHNvdXJjZSBwYXRoCit0aGF0IGNvbnRhaW5zIFNQIHRoZSBwYXRoIG11c3QgYmUgcXVvdGVkLgorCitBIGBmaWxlcmVuYW1lYCBjb21tYW5kIHRha2VzIGVmZmVjdCBpbW1lZGlhdGVseS4gIE9uY2UgdGhlIHNvdXJjZQorbG9jYXRpb24gaGFzIGJlZW4gcmVuYW1lZCB0byB0aGUgZGVzdGluYXRpb24gYW55IGZ1dHVyZSBjb21tYW5kcworYXBwbGllZCB0byB0aGUgc291cmNlIGxvY2F0aW9uIHdpbGwgY3JlYXRlIG5ldyBmaWxlcyB0aGVyZSBhbmQgbm90CitpbXBhY3QgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSByZW5hbWUuCisKK05vdGUgdGhhdCBhIGBmaWxlcmVuYW1lYCBpcyB0aGUgc2FtZSBhcyBhIGBmaWxlY29weWAgZm9sbG93ZWQgYnkgYQorYGZpbGVkZWxldGVgIG9mIHRoZSBzb3VyY2UgbG9jYXRpb24uICBUaGVyZSBpcyBhIHNsaWdodCBwZXJmb3JtYW5jZQorYWR2YW50YWdlIHRvIHVzaW5nIGBmaWxlcmVuYW1lYCwgYnV0IHRoZSBhZHZhbnRhZ2UgaXMgc28gc21hbGwKK3RoYXQgaXQgaXMgbmV2ZXIgd29ydGggdHJ5aW5nIHRvIGNvbnZlcnQgYSBkZWxldGUvYWRkIHBhaXIgaW4KK3NvdXJjZSBtYXRlcmlhbCBpbnRvIGEgcmVuYW1lIGZvciBmYXN0LWltcG9ydC4gIFRoaXMgYGZpbGVyZW5hbWVgCitjb21tYW5kIGlzIHByb3ZpZGVkIGp1c3QgdG8gc2ltcGxpZnkgZnJvbnRlbmRzIHRoYXQgYWxyZWFkeSBoYXZlCityZW5hbWUgaW5mb3JtYXRpb24gYW5kIGRvbid0IHdhbnQgYm90aGVyIHdpdGggZGVjb21wb3NpbmcgaXQgaW50byBhCitgZmlsZWNvcHlgIGZvbGxvd2VkIGJ5IGEgYGZpbGVkZWxldGVgLgorCitgZmlsZWRlbGV0ZWFsbGAKK15eXl5eXl5eXl5eXl5eXgorSW5jbHVkZWQgaW4gYSBgY29tbWl0YCBjb21tYW5kIHRvIHJlbW92ZSBhbGwgZmlsZXMgKGFuZCBhbHNvIGFsbAorZGlyZWN0b3JpZXMpIGZyb20gdGhlIGJyYW5jaC4gIFRoaXMgY29tbWFuZCByZXNldHMgdGhlIGludGVybmFsCiticmFuY2ggc3RydWN0dXJlIHRvIGhhdmUgbm8gZmlsZXMgaW4gaXQsIGFsbG93aW5nIHRoZSBmcm9udGVuZAordG8gc3Vic2VxdWVudGx5IGFkZCBhbGwgaW50ZXJlc3RpbmcgZmlsZXMgZnJvbSBzY3JhdGNoLgorCisuLi4uCisJJ2RlbGV0ZWFsbCcgTEYKKy4uLi4KKworVGhpcyBjb21tYW5kIGlzIGV4dHJlbWVseSB1c2VmdWwgaWYgdGhlIGZyb250ZW5kIGRvZXMgbm90IGtub3cKKyhvciBkb2VzIG5vdCBjYXJlIHRvIGtub3cpIHdoYXQgZmlsZXMgYXJlIGN1cnJlbnRseSBvbiB0aGUgYnJhbmNoLAorYW5kIHRoZXJlZm9yZSBjYW5ub3QgZ2VuZXJhdGUgdGhlIHByb3BlciBgZmlsZWRlbGV0ZWAgY29tbWFuZHMgdG8KK3VwZGF0ZSB0aGUgY29udGVudC4KKworSXNzdWluZyBhIGBmaWxlZGVsZXRlYWxsYCBmb2xsb3dlZCBieSB0aGUgbmVlZGVkIGBmaWxlbW9kaWZ5YAorY29tbWFuZHMgdG8gc2V0IHRoZSBjb3JyZWN0IGNvbnRlbnQgd2lsbCBwcm9kdWNlIHRoZSBzYW1lIHJlc3VsdHMKK2FzIHNlbmRpbmcgb25seSB0aGUgbmVlZGVkIGBmaWxlbW9kaWZ5YCBhbmQgYGZpbGVkZWxldGVgIGNvbW1hbmRzLgorVGhlIGBmaWxlZGVsZXRlYWxsYCBhcHByb2FjaCBtYXkgaG93ZXZlciByZXF1aXJlIGZhc3QtaW1wb3J0IHRvIHVzZSBzbGlnaHRseQorbW9yZSBtZW1vcnkgcGVyIGFjdGl2ZSBicmFuY2ggKGxlc3MgdGhhbiAxIE1pQiBmb3IgZXZlbiBtb3N0IGxhcmdlCitwcm9qZWN0cyk7IHNvIGZyb250ZW5kcyB0aGF0IGNhbiBlYXNpbHkgb2J0YWluIG9ubHkgdGhlIGFmZmVjdGVkCitwYXRocyBmb3IgYSBjb21taXQgYXJlIGVuY291cmFnZWQgdG8gZG8gc28uCisKK2BtYXJrYAorfn5+fn5+CitBcnJhbmdlcyBmb3IgZmFzdC1pbXBvcnQgdG8gc2F2ZSBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBvYmplY3QsIGFsbG93aW5nCit0aGUgZnJvbnRlbmQgdG8gcmVjYWxsIHRoaXMgb2JqZWN0IGF0IGEgZnV0dXJlIHBvaW50IGluIHRpbWUsIHdpdGhvdXQKK2tub3dpbmcgaXRzIFNIQS0xLiAgSGVyZSB0aGUgY3VycmVudCBvYmplY3QgaXMgdGhlIG9iamVjdCBjcmVhdGlvbgorY29tbWFuZCB0aGUgYG1hcmtgIGNvbW1hbmQgYXBwZWFycyB3aXRoaW4uICBUaGlzIGNhbiBiZSBgY29tbWl0YCwKK2B0YWdgLCBhbmQgYGJsb2JgLCBidXQgYGNvbW1pdGAgaXMgdGhlIG1vc3QgY29tbW9uIHVzYWdlLgorCisuLi4uCisJJ21hcmsnIFNQICc6JyA8aWRudW0+IExGCisuLi4uCisKK3doZXJlIGA8aWRudW0+YCBpcyB0aGUgbnVtYmVyIGFzc2lnbmVkIGJ5IHRoZSBmcm9udGVuZCB0byB0aGlzIG1hcmsuCitUaGUgdmFsdWUgb2YgYDxpZG51bT5gIGlzIGV4cHJlc3NlZCBhcyBhbiBBU0NJSSBkZWNpbWFsIGludGVnZXIuCitUaGUgdmFsdWUgMCBpcyByZXNlcnZlZCBhbmQgY2Fubm90IGJlIHVzZWQgYXMKK2EgbWFyay4gIE9ubHkgdmFsdWVzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxIG1heSBiZSB1c2VkIGFzIG1hcmtzLgorCitOZXcgbWFya3MgYXJlIGNyZWF0ZWQgYXV0b21hdGljYWxseS4gIEV4aXN0aW5nIG1hcmtzIGNhbiBiZSBtb3ZlZAordG8gYW5vdGhlciBvYmplY3Qgc2ltcGx5IGJ5IHJldXNpbmcgdGhlIHNhbWUgYDxpZG51bT5gIGluIGFub3RoZXIKK2BtYXJrYCBjb21tYW5kLgorCitgdGFnYAorfn5+fn4KK0NyZWF0ZXMgYW4gYW5ub3RhdGVkIHRhZyByZWZlcnJpbmcgdG8gYSBzcGVjaWZpYyBjb21taXQuICBUbyBjcmVhdGUKK2xpZ2h0d2VpZ2h0IChub24tYW5ub3RhdGVkKSB0YWdzIHNlZSB0aGUgYHJlc2V0YCBjb21tYW5kIGJlbG93LgorCisuLi4uCisJJ3RhZycgU1AgPG5hbWU+IExGCisJJ2Zyb20nIFNQIDxjb21taXR0aXNoPiBMRgorCSd0YWdnZXInIFNQIDxuYW1lPiBTUCBMVCA8ZW1haWw+IEdUIFNQIDx3aGVuPiBMRgorCWRhdGEKKy4uLi4KKword2hlcmUgYDxuYW1lPmAgaXMgdGhlIG5hbWUgb2YgdGhlIHRhZyB0byBjcmVhdGUuCisKK1RhZyBuYW1lcyBhcmUgYXV0b21hdGljYWxseSBwcmVmaXhlZCB3aXRoIGByZWZzL3RhZ3MvYCB3aGVuIHN0b3JlZAoraW4gR2l0LCBzbyBpbXBvcnRpbmcgdGhlIENWUyBicmFuY2ggc3ltYm9sIGBSRUxFTkctMV8wLUZJTkFMYCB3b3VsZAordXNlIGp1c3QgYFJFTEVORy0xXzAtRklOQUxgIGZvciBgPG5hbWU+YCwgYW5kIGZhc3QtaW1wb3J0IHdpbGwgd3JpdGUgdGhlCitjb3JyZXNwb25kaW5nIHJlZiBhcyBgcmVmcy90YWdzL1JFTEVORy0xXzAtRklOQUxgLgorCitUaGUgdmFsdWUgb2YgYDxuYW1lPmAgbXVzdCBiZSBhIHZhbGlkIHJlZm5hbWUgaW4gR2l0IGFuZCB0aGVyZWZvcmUKK21heSBjb250YWluIGZvcndhcmQgc2xhc2hlcy4gIEFzIGBMRmAgaXMgbm90IHZhbGlkIGluIGEgR2l0IHJlZm5hbWUsCitubyBxdW90aW5nIG9yIGVzY2FwaW5nIHN5bnRheCBpcyBzdXBwb3J0ZWQgaGVyZS4KKworVGhlIGBmcm9tYCBjb21tYW5kIGlzIHRoZSBzYW1lIGFzIGluIHRoZSBgY29tbWl0YCBjb21tYW5kOyBzZWUKK2Fib3ZlIGZvciBkZXRhaWxzLgorCitUaGUgYHRhZ2dlcmAgY29tbWFuZCB1c2VzIHRoZSBzYW1lIGZvcm1hdCBhcyBgY29tbWl0dGVyYCB3aXRoaW4KK2Bjb21taXRgOyBhZ2FpbiBzZWUgYWJvdmUgZm9yIGRldGFpbHMuCisKK1RoZSBgZGF0YWAgY29tbWFuZCBmb2xsb3dpbmcgYHRhZ2dlcmAgbXVzdCBzdXBwbHkgdGhlIGFubm90YXRlZCB0YWcKK21lc3NhZ2UgKHNlZSBiZWxvdyBmb3IgYGRhdGFgIGNvbW1hbmQgc3ludGF4KS4gIFRvIGltcG9ydCBhbiBlbXB0eQordGFnIG1lc3NhZ2UgdXNlIGEgMCBsZW5ndGggZGF0YS4gIFRhZyBtZXNzYWdlcyBhcmUgZnJlZS1mb3JtIGFuZCBhcmUKK25vdCBpbnRlcnByZXRlZCBieSBHaXQuICBDdXJyZW50bHkgdGhleSBtdXN0IGJlIGVuY29kZWQgaW4gVVRGLTgsCithcyBmYXN0LWltcG9ydCBkb2VzIG5vdCBwZXJtaXQgb3RoZXIgZW5jb2RpbmdzIHRvIGJlIHNwZWNpZmllZC4KKworU2lnbmluZyBhbm5vdGF0ZWQgdGFncyBkdXJpbmcgaW1wb3J0IGZyb20gd2l0aGluIGZhc3QtaW1wb3J0IGlzIG5vdAorc3VwcG9ydGVkLiAgVHJ5aW5nIHRvIGluY2x1ZGUgeW91ciBvd24gUEdQL0dQRyBzaWduYXR1cmUgaXMgbm90CityZWNvbW1lbmRlZCwgYXMgdGhlIGZyb250ZW5kIGRvZXMgbm90IChlYXNpbHkpIGhhdmUgYWNjZXNzIHRvIHRoZQorY29tcGxldGUgc2V0IG9mIGJ5dGVzIHdoaWNoIG5vcm1hbGx5IGdvZXMgaW50byBzdWNoIGEgc2lnbmF0dXJlLgorSWYgc2lnbmluZyBpcyByZXF1aXJlZCwgY3JlYXRlIGxpZ2h0d2VpZ2h0IHRhZ3MgZnJvbSB3aXRoaW4gZmFzdC1pbXBvcnQgd2l0aAorYHJlc2V0YCwgdGhlbiBjcmVhdGUgdGhlIGFubm90YXRlZCB2ZXJzaW9ucyBvZiB0aG9zZSB0YWdzIG9mZmxpbmUKK3dpdGggdGhlIHN0YW5kYXJkIGxpbmtnaXQ6Z2l0LXRhZ1sxXSBwcm9jZXNzLgorCitgcmVzZXRgCit+fn5+fn5+CitDcmVhdGVzIChvciByZWNyZWF0ZXMpIHRoZSBuYW1lZCBicmFuY2gsIG9wdGlvbmFsbHkgc3RhcnRpbmcgZnJvbQorYSBzcGVjaWZpYyByZXZpc2lvbi4gIFRoZSByZXNldCBjb21tYW5kIGFsbG93cyBhIGZyb250ZW5kIHRvIGlzc3VlCithIG5ldyBgZnJvbWAgY29tbWFuZCBmb3IgYW4gZXhpc3RpbmcgYnJhbmNoLCBvciB0byBjcmVhdGUgYSBuZXcKK2JyYW5jaCBmcm9tIGFuIGV4aXN0aW5nIGNvbW1pdCB3aXRob3V0IGNyZWF0aW5nIGEgbmV3IGNvbW1pdC4KKworLi4uLgorCSdyZXNldCcgU1AgPHJlZj4gTEYKKwkoJ2Zyb20nIFNQIDxjb21taXR0aXNoPiBMRik/CisJTEY/CisuLi4uCisKK0ZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGA8cmVmPmAgYW5kIGA8Y29tbWl0dGlzaD5gIHNlZSBhYm92ZQordW5kZXIgYGNvbW1pdGAgYW5kIGBmcm9tYC4KKworVGhlIGBMRmAgYWZ0ZXIgdGhlIGNvbW1hbmQgaXMgb3B0aW9uYWwgKGl0IHVzZWQgdG8gYmUgcmVxdWlyZWQpLgorCitUaGUgYHJlc2V0YCBjb21tYW5kIGNhbiBhbHNvIGJlIHVzZWQgdG8gY3JlYXRlIGxpZ2h0d2VpZ2h0Cisobm9uLWFubm90YXRlZCkgdGFncy4gIEZvciBleGFtcGxlOgorCis9PT09CisJcmVzZXQgcmVmcy90YWdzLzkzOAorCWZyb20gOjkzOAorPT09PQorCit3b3VsZCBjcmVhdGUgdGhlIGxpZ2h0d2VpZ2h0IHRhZyBgcmVmcy90YWdzLzkzOGAgcmVmZXJyaW5nIHRvCit3aGF0ZXZlciBjb21taXQgbWFyayBgOjkzOGAgcmVmZXJlbmNlcy4KKworYGJsb2JgCit+fn5+fn4KK1JlcXVlc3RzIHdyaXRpbmcgb25lIGZpbGUgcmV2aXNpb24gdG8gdGhlIHBhY2tmaWxlLiAgVGhlIHJldmlzaW9uCitpcyBub3QgY29ubmVjdGVkIHRvIGFueSBjb21taXQ7IHRoaXMgY29ubmVjdGlvbiBtdXN0IGJlIGZvcm1lZCBpbgorYSBzdWJzZXF1ZW50IGBjb21taXRgIGNvbW1hbmQgYnkgcmVmZXJlbmNpbmcgdGhlIGJsb2IgdGhyb3VnaCBhbgorYXNzaWduZWQgbWFyay4KKworLi4uLgorCSdibG9iJyBMRgorCW1hcms/CisJZGF0YQorLi4uLgorCitUaGUgbWFyayBjb21tYW5kIGlzIG9wdGlvbmFsIGhlcmUgYXMgc29tZSBmcm9udGVuZHMgaGF2ZSBjaG9zZW4KK3RvIGdlbmVyYXRlIHRoZSBHaXQgU0hBLTEgZm9yIHRoZSBibG9iIG9uIHRoZWlyIG93biwgYW5kIGZlZWQgdGhhdAorZGlyZWN0bHkgdG8gYGNvbW1pdGAuICBUaGlzIGlzIHR5cGljYWxseSBtb3JlIHdvcmsgdGhhbiBpdHMgd29ydGgKK2hvd2V2ZXIsIGFzIG1hcmtzIGFyZSBpbmV4cGVuc2l2ZSB0byBzdG9yZSBhbmQgZWFzeSB0byB1c2UuCisKK2BkYXRhYAorfn5+fn5+CitTdXBwbGllcyByYXcgZGF0YSAoZm9yIHVzZSBhcyBibG9iL2ZpbGUgY29udGVudCwgY29tbWl0IG1lc3NhZ2VzLCBvcgorYW5ub3RhdGVkIHRhZyBtZXNzYWdlcykgdG8gZmFzdC1pbXBvcnQuICBEYXRhIGNhbiBiZSBzdXBwbGllZCB1c2luZyBhbiBleGFjdAorYnl0ZSBjb3VudCBvciBkZWxpbWl0ZWQgd2l0aCBhIHRlcm1pbmF0aW5nIGxpbmUuICBSZWFsIGZyb250ZW5kcworaW50ZW5kZWQgZm9yIHByb2R1Y3Rpb24tcXVhbGl0eSBjb252ZXJzaW9ucyBzaG91bGQgYWx3YXlzIHVzZSB0aGUKK2V4YWN0IGJ5dGUgY291bnQgZm9ybWF0LCBhcyBpdCBpcyBtb3JlIHJvYnVzdCBhbmQgcGVyZm9ybXMgYmV0dGVyLgorVGhlIGRlbGltaXRlZCBmb3JtYXQgaXMgaW50ZW5kZWQgcHJpbWFyaWx5IGZvciB0ZXN0aW5nIGZhc3QtaW1wb3J0LgorCitDb21tZW50IGxpbmVzIGFwcGVhcmluZyB3aXRoaW4gdGhlIGA8cmF3PmAgcGFydCBvZiBgZGF0YWAgY29tbWFuZHMKK2FyZSBhbHdheXMgdGFrZW4gdG8gYmUgcGFydCBvZiB0aGUgYm9keSBvZiB0aGUgZGF0YSBhbmQgYXJlIHRoZXJlZm9yZQorbmV2ZXIgaWdub3JlZCBieSBmYXN0LWltcG9ydC4gIFRoaXMgbWFrZXMgaXQgc2FmZSB0byBpbXBvcnQgYW55CitmaWxlL21lc3NhZ2UgY29udGVudCB3aG9zZSBsaW5lcyBtaWdodCBzdGFydCB3aXRoIGAjYC4KKworRXhhY3QgYnl0ZSBjb3VudCBmb3JtYXQ6OgorCVRoZSBmcm9udGVuZCBtdXN0IHNwZWNpZnkgdGhlIG51bWJlciBvZiBieXRlcyBvZiBkYXRhLgorKworLi4uLgorCSdkYXRhJyBTUCA8Y291bnQ+IExGCisJPHJhdz4gTEY/CisuLi4uCisrCit3aGVyZSBgPGNvdW50PmAgaXMgdGhlIGV4YWN0IG51bWJlciBvZiBieXRlcyBhcHBlYXJpbmcgd2l0aGluCitgPHJhdz5gLiAgVGhlIHZhbHVlIG9mIGA8Y291bnQ+YCBpcyBleHByZXNzZWQgYXMgYW4gQVNDSUkgZGVjaW1hbAoraW50ZWdlci4gIFRoZSBgTEZgIG9uIGVpdGhlciBzaWRlIG9mIGA8cmF3PmAgaXMgbm90CitpbmNsdWRlZCBpbiBgPGNvdW50PmAgYW5kIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBpbXBvcnRlZCBkYXRhLgorKworVGhlIGBMRmAgYWZ0ZXIgYDxyYXc+YCBpcyBvcHRpb25hbCAoaXQgdXNlZCB0byBiZSByZXF1aXJlZCkgYnV0CityZWNvbW1lbmRlZC4gIEFsd2F5cyBpbmNsdWRpbmcgaXQgbWFrZXMgZGVidWdnaW5nIGEgZmFzdC1pbXBvcnQKK3N0cmVhbSBlYXNpZXIgYXMgdGhlIG5leHQgY29tbWFuZCBhbHdheXMgc3RhcnRzIGluIGNvbHVtbiAwCitvZiB0aGUgbmV4dCBsaW5lLCBldmVuIGlmIGA8cmF3PmAgZGlkIG5vdCBlbmQgd2l0aCBhbiBgTEZgLgorCitEZWxpbWl0ZWQgZm9ybWF0OjoKKwlBIGRlbGltaXRlciBzdHJpbmcgaXMgdXNlZCB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIGRhdGEuCisJZmFzdC1pbXBvcnQgd2lsbCBjb21wdXRlIHRoZSBsZW5ndGggYnkgc2VhcmNoaW5nIGZvciB0aGUgZGVsaW1pdGVyLgorCVRoaXMgZm9ybWF0IGlzIHByaW1hcmlseSB1c2VmdWwgZm9yIHRlc3RpbmcgYW5kIGlzIG5vdAorCXJlY29tbWVuZGVkIGZvciByZWFsIGRhdGEuCisrCisuLi4uCisJJ2RhdGEnIFNQICc8PCcgPGRlbGltPiBMRgorCTxyYXc+IExGCisJPGRlbGltPiBMRgorCUxGPworLi4uLgorKword2hlcmUgYDxkZWxpbT5gIGlzIHRoZSBjaG9zZW4gZGVsaW1pdGVyIHN0cmluZy4gIFRoZSBzdHJpbmcgYDxkZWxpbT5gCittdXN0IG5vdCBhcHBlYXIgb24gYSBsaW5lIGJ5IGl0c2VsZiB3aXRoaW4gYDxyYXc+YCwgYXMgb3RoZXJ3aXNlCitmYXN0LWltcG9ydCB3aWxsIHRoaW5rIHRoZSBkYXRhIGVuZHMgZWFybGllciB0aGFuIGl0IHJlYWxseSBkb2VzLiAgVGhlIGBMRmAKK2ltbWVkaWF0ZWx5IHRyYWlsaW5nIGA8cmF3PmAgaXMgcGFydCBvZiBgPHJhdz5gLiAgVGhpcyBpcyBvbmUgb2YKK3RoZSBsaW1pdGF0aW9ucyBvZiB0aGUgZGVsaW1pdGVkIGZvcm1hdCwgaXQgaXMgaW1wb3NzaWJsZSB0byBzdXBwbHkKK2EgZGF0YSBjaHVuayB3aGljaCBkb2VzIG5vdCBoYXZlIGFuIExGIGFzIGl0cyBsYXN0IGJ5dGUuCisrCitUaGUgYExGYCBhZnRlciBgPGRlbGltPiBMRmAgaXMgb3B0aW9uYWwgKGl0IHVzZWQgdG8gYmUgcmVxdWlyZWQpLgorCitgY2hlY2twb2ludGAKK35+fn5+fn5+fn5+fgorRm9yY2VzIGZhc3QtaW1wb3J0IHRvIGNsb3NlIHRoZSBjdXJyZW50IHBhY2tmaWxlLCBzdGFydCBhIG5ldyBvbmUsIGFuZCB0bworc2F2ZSBvdXQgYWxsIGN1cnJlbnQgYnJhbmNoIHJlZnMsIHRhZ3MgYW5kIG1hcmtzLgorCisuLi4uCisJJ2NoZWNrcG9pbnQnIExGCisJTEY/CisuLi4uCisKK05vdGUgdGhhdCBmYXN0LWltcG9ydCBhdXRvbWF0aWNhbGx5IHN3aXRjaGVzIHBhY2tmaWxlcyB3aGVuIHRoZSBjdXJyZW50CitwYWNrZmlsZSByZWFjaGVzIFwtLW1heC1wYWNrLXNpemUsIG9yIDQgR2lCLCB3aGljaGV2ZXIgbGltaXQgaXMKK3NtYWxsZXIuICBEdXJpbmcgYW4gYXV0b21hdGljIHBhY2tmaWxlIHN3aXRjaCBmYXN0LWltcG9ydCBkb2VzIG5vdCB1cGRhdGUKK3RoZSBicmFuY2ggcmVmcywgdGFncyBvciBtYXJrcy4KKworQXMgYSBgY2hlY2twb2ludGAgY2FuIHJlcXVpcmUgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgQ1BVIHRpbWUgYW5kCitkaXNrIElPICh0byBjb21wdXRlIHRoZSBvdmVyYWxsIHBhY2sgU0hBLTEgY2hlY2tzdW0sIGdlbmVyYXRlIHRoZQorY29ycmVzcG9uZGluZyBpbmRleCBmaWxlLCBhbmQgdXBkYXRlIHRoZSByZWZzKSBpdCBjYW4gZWFzaWx5IHRha2UKK3NldmVyYWwgbWludXRlcyBmb3IgYSBzaW5nbGUgYGNoZWNrcG9pbnRgIGNvbW1hbmQgdG8gY29tcGxldGUuCisKK0Zyb250ZW5kcyBtYXkgY2hvb3NlIHRvIGlzc3VlIGNoZWNrcG9pbnRzIGR1cmluZyBleHRyZW1lbHkgbGFyZ2UKK2FuZCBsb25nIHJ1bm5pbmcgaW1wb3J0cywgb3Igd2hlbiB0aGV5IG5lZWQgdG8gYWxsb3cgYW5vdGhlciBHaXQKK3Byb2Nlc3MgYWNjZXNzIHRvIGEgYnJhbmNoLiAgSG93ZXZlciBnaXZlbiB0aGF0IGEgMzAgR2lCIFN1YnZlcnNpb24KK3JlcG9zaXRvcnkgY2FuIGJlIGxvYWRlZCBpbnRvIEdpdCB0aHJvdWdoIGZhc3QtaW1wb3J0IGluIGFib3V0IDMgaG91cnMsCitleHBsaWNpdCBjaGVja3BvaW50aW5nIG1heSBub3QgYmUgbmVjZXNzYXJ5LgorCitUaGUgYExGYCBhZnRlciB0aGUgY29tbWFuZCBpcyBvcHRpb25hbCAoaXQgdXNlZCB0byBiZSByZXF1aXJlZCkuCisKK2Bwcm9ncmVzc2AKK35+fn5+fn5+fn4KK0NhdXNlcyBmYXN0LWltcG9ydCB0byBwcmludCB0aGUgZW50aXJlIGBwcm9ncmVzc2AgbGluZSB1bm1vZGlmaWVkIHRvCitpdHMgc3RhbmRhcmQgb3V0cHV0IGNoYW5uZWwgKGZpbGUgZGVzY3JpcHRvciAxKSB3aGVuIHRoZSBjb21tYW5kIGlzCitwcm9jZXNzZWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiAgVGhlIGNvbW1hbmQgb3RoZXJ3aXNlIGhhcyBubyBpbXBhY3QKK29uIHRoZSBjdXJyZW50IGltcG9ydCwgb3Igb24gYW55IG9mIGZhc3QtaW1wb3J0J3MgaW50ZXJuYWwgc3RhdGUuCisKKy4uLi4KKwkncHJvZ3Jlc3MnIFNQIDxhbnk+IExGCisJTEY/CisuLi4uCisKK1RoZSBgPGFueT5gIHBhcnQgb2YgdGhlIGNvbW1hbmQgbWF5IGNvbnRhaW4gYW55IHNlcXVlbmNlIG9mIGJ5dGVzCit0aGF0IGRvZXMgbm90IGNvbnRhaW4gYExGYC4gIFRoZSBgTEZgIGFmdGVyIHRoZSBjb21tYW5kIGlzIG9wdGlvbmFsLgorQ2FsbGVycyBtYXkgd2lzaCB0byBwcm9jZXNzIHRoZSBvdXRwdXQgdGhyb3VnaCBhIHRvb2wgc3VjaCBhcyBzZWQgdG8KK3JlbW92ZSB0aGUgbGVhZGluZyBwYXJ0IG9mIHRoZSBsaW5lLCBmb3IgZXhhbXBsZToKKworPT09PQorCWZyb250ZW5kIHwgZ2l0LWZhc3QtaW1wb3J0IHwgc2VkICdzL15wcm9ncmVzcyAvLycKKz09PT0KKworUGxhY2luZyBhIGBwcm9ncmVzc2AgY29tbWFuZCBpbW1lZGlhdGVseSBhZnRlciBhIGBjaGVja3BvaW50YCB3aWxsCitpbmZvcm0gdGhlIHJlYWRlciB3aGVuIHRoZSBgY2hlY2twb2ludGAgaGFzIGJlZW4gY29tcGxldGVkIGFuZCBpdAorY2FuIHNhZmVseSBhY2Nlc3MgdGhlIHJlZnMgdGhhdCBmYXN0LWltcG9ydCB1cGRhdGVkLgorCitDcmFzaCBSZXBvcnRzCistLS0tLS0tLS0tLS0tCitJZiBmYXN0LWltcG9ydCBpcyBzdXBwbGllZCBpbnZhbGlkIGlucHV0IGl0IHdpbGwgdGVybWluYXRlIHdpdGggYQorbm9uLXplcm8gZXhpdCBzdGF0dXMgYW5kIGNyZWF0ZSBhIGNyYXNoIHJlcG9ydCBpbiB0aGUgdG9wIGxldmVsIG9mCit0aGUgR2l0IHJlcG9zaXRvcnkgaXQgd2FzIGltcG9ydGluZyBpbnRvLiAgQ3Jhc2ggcmVwb3J0cyBjb250YWluCithIHNuYXBzaG90IG9mIHRoZSBpbnRlcm5hbCBmYXN0LWltcG9ydCBzdGF0ZSBhcyB3ZWxsIGFzIHRoZSBtb3N0CityZWNlbnQgY29tbWFuZHMgdGhhdCBsZWFkIHVwIHRvIHRoZSBjcmFzaC4KKworQWxsIHJlY2VudCBjb21tYW5kcyAoaW5jbHVkaW5nIHN0cmVhbSBjb21tZW50cywgZmlsZSBjaGFuZ2VzIGFuZAorcHJvZ3Jlc3MgY29tbWFuZHMpIGFyZSBzaG93biBpbiB0aGUgY29tbWFuZCBoaXN0b3J5IHdpdGhpbiB0aGUgY3Jhc2gKK3JlcG9ydCwgYnV0IHJhdyBmaWxlIGRhdGEgYW5kIGNvbW1pdCBtZXNzYWdlcyBhcmUgZXhjbHVkZWQgZnJvbSB0aGUKK2NyYXNoIHJlcG9ydC4gIFRoaXMgZXhjbHVzaW9uIHNhdmVzIHNwYWNlIHdpdGhpbiB0aGUgcmVwb3J0IGZpbGUKK2FuZCByZWR1Y2VzIHRoZSBhbW91bnQgb2YgYnVmZmVyaW5nIHRoYXQgZmFzdC1pbXBvcnQgbXVzdCBwZXJmb3JtCitkdXJpbmcgZXhlY3V0aW9uLgorCitBZnRlciB3cml0aW5nIGEgY3Jhc2ggcmVwb3J0IGZhc3QtaW1wb3J0IHdpbGwgY2xvc2UgdGhlIGN1cnJlbnQKK3BhY2tmaWxlIGFuZCBleHBvcnQgdGhlIG1hcmtzIHRhYmxlLiAgVGhpcyBhbGxvd3MgdGhlIGZyb250ZW5kCitkZXZlbG9wZXIgdG8gaW5zcGVjdCB0aGUgcmVwb3NpdG9yeSBzdGF0ZSBhbmQgcmVzdW1lIHRoZSBpbXBvcnQgZnJvbQordGhlIHBvaW50IHdoZXJlIGl0IGNyYXNoZWQuICBUaGUgbW9kaWZpZWQgYnJhbmNoZXMgYW5kIHRhZ3MgYXJlIG5vdAordXBkYXRlZCBkdXJpbmcgYSBjcmFzaCwgYXMgdGhlIGltcG9ydCBkaWQgbm90IGNvbXBsZXRlIHN1Y2Nlc3NmdWxseS4KK0JyYW5jaCBhbmQgdGFnIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0aGUgY3Jhc2ggcmVwb3J0IGFuZAorbXVzdCBiZSBhcHBsaWVkIG1hbnVhbGx5IGlmIHRoZSB1cGRhdGUgaXMgbmVlZGVkLgorCitBbiBleGFtcGxlIGNyYXNoOgorCis9PT09CisJJCBjYXQgPmluIDw8RU5EX09GX0lOUFVUCisJIyBteSB2ZXJ5IGZpcnN0IHRlc3QgY29tbWl0CisJY29tbWl0IHJlZnMvaGVhZHMvbWFzdGVyCisJY29tbWl0dGVyIFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZT4gMTkyODMgLTA0MDAKKwkjIHdobyBpcyB0aGF0IGd1eSBhbnl3YXk/CisJZGF0YSA8PEVPRgorCXRoaXMgaXMgbXkgY29tbWl0CisJRU9GCisJTSA2NDQgaW5saW5lIC5naXRpZ25vcmUKKwlkYXRhIDw8RU9GCisJLmdpdGlnbm9yZQorCUVPRgorCU0gNzc3IGlubGluZSBib2IKKwlFTkRfT0ZfSU5QVVQKKworCSQgZ2l0LWZhc3QtaW1wb3J0IDxpbgorCWZhdGFsOiBDb3JydXB0IG1vZGU6IE0gNzc3IGlubGluZSBib2IKKwlmYXN0LWltcG9ydDogZHVtcGluZyBjcmFzaCByZXBvcnQgdG8gLmdpdC9mYXN0X2ltcG9ydF9jcmFzaF84NDM0CisKKwkkIGNhdCAuZ2l0L2Zhc3RfaW1wb3J0X2NyYXNoXzg0MzQKKwlmYXN0LWltcG9ydCBjcmFzaCByZXBvcnQ6CisJICAgIGZhc3QtaW1wb3J0IHByb2Nlc3M6IDg0MzQKKwkgICAgcGFyZW50IHByb2Nlc3MgICAgIDogMTM5MQorCSAgICBhdCBTYXQgU2VwIDEgMDA6NTg6MTIgMjAwNworCisJZmF0YWw6IENvcnJ1cHQgbW9kZTogTSA3NzcgaW5saW5lIGJvYgorCisJTW9zdCBSZWNlbnQgQ29tbWFuZHMgQmVmb3JlIENyYXNoCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAjIG15IHZlcnkgZmlyc3QgdGVzdCBjb21taXQKKwkgIGNvbW1pdCByZWZzL2hlYWRzL21hc3RlcgorCSAgY29tbWl0dGVyIFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZT4gMTkyODMgLTA0MDAKKwkgICMgd2hvIGlzIHRoYXQgZ3V5IGFueXdheT8KKwkgIGRhdGEgPDxFT0YKKwkgIE0gNjQ0IGlubGluZSAuZ2l0aWdub3JlCisJICBkYXRhIDw8RU9GCisJKiBNIDc3NyBpbmxpbmUgYm9iCisKKwlBY3RpdmUgQnJhbmNoIExSVQorCS0tLS0tLS0tLS0tLS0tLS0tCisJICAgIGFjdGl2ZV9icmFuY2hlcyA9IDEgY3VyLCA1IG1heAorCisJICBwb3MgIGNsb2NrIG5hbWUKKwkgIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCSAgIDEpICAgICAgMCByZWZzL2hlYWRzL21hc3RlcgorCisJSW5hY3RpdmUgQnJhbmNoZXMKKwktLS0tLS0tLS0tLS0tLS0tLQorCXJlZnMvaGVhZHMvbWFzdGVyOgorCSAgc3RhdHVzICAgICAgOiBhY3RpdmUgbG9hZGVkIGRpcnR5CisJICB0aXAgY29tbWl0ICA6IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKwkgIG9sZCB0cmVlICAgIDogMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorCSAgY3VyIHRyZWUgICAgOiAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisJICBjb21taXQgY2xvY2s6IDAKKwkgIGxhc3QgcGFjayAgIDoKKworCisJLS0tLS0tLS0tLS0tLS0tLS0tLQorCUVORCBPRiBDUkFTSCBSRVBPUlQKKz09PT0KKworVGlwcyBhbmQgVHJpY2tzCistLS0tLS0tLS0tLS0tLS0KK1RoZSBmb2xsb3dpbmcgdGlwcyBhbmQgdHJpY2tzIGhhdmUgYmVlbiBjb2xsZWN0ZWQgZnJvbSB2YXJpb3VzCit1c2VycyBvZiBmYXN0LWltcG9ydCwgYW5kIGFyZSBvZmZlcmVkIGhlcmUgYXMgc3VnZ2VzdGlvbnMuCisKK1VzZSBPbmUgTWFyayBQZXIgQ29tbWl0Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorV2hlbiBkb2luZyBhIHJlcG9zaXRvcnkgY29udmVyc2lvbiwgdXNlIGEgdW5pcXVlIG1hcmsgcGVyIGNvbW1pdAorKGBtYXJrIDo8bj5gKSBhbmQgc3VwcGx5IHRoZSBcLS1leHBvcnQtbWFya3Mgb3B0aW9uIG9uIHRoZSBjb21tYW5kCitsaW5lLiAgZmFzdC1pbXBvcnQgd2lsbCBkdW1wIGEgZmlsZSB3aGljaCBsaXN0cyBldmVyeSBtYXJrIGFuZCB0aGUgR2l0CitvYmplY3QgU0hBLTEgdGhhdCBjb3JyZXNwb25kcyB0byBpdC4gIElmIHRoZSBmcm9udGVuZCBjYW4gdGllCit0aGUgbWFya3MgYmFjayB0byB0aGUgc291cmNlIHJlcG9zaXRvcnksIGl0IGlzIGVhc3kgdG8gdmVyaWZ5IHRoZQorYWNjdXJhY3kgYW5kIGNvbXBsZXRlbmVzcyBvZiB0aGUgaW1wb3J0IGJ5IGNvbXBhcmluZyBlYWNoIEdpdAorY29tbWl0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSByZXZpc2lvbi4KKworQ29taW5nIGZyb20gYSBzeXN0ZW0gc3VjaCBhcyBQZXJmb3JjZSBvciBTdWJ2ZXJzaW9uIHRoaXMgc2hvdWxkIGJlCitxdWl0ZSBzaW1wbGUsIGFzIHRoZSBmYXN0LWltcG9ydCBtYXJrIGNhbiBhbHNvIGJlIHRoZSBQZXJmb3JjZSBjaGFuZ2VzZXQKK251bWJlciBvciB0aGUgU3VidmVyc2lvbiByZXZpc2lvbiBudW1iZXIuCisKK0ZyZWVseSBTa2lwIEFyb3VuZCBCcmFuY2hlcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitEb24ndCBib3RoZXIgdHJ5aW5nIHRvIG9wdGltaXplIHRoZSBmcm9udGVuZCB0byBzdGljayB0byBvbmUgYnJhbmNoCithdCBhIHRpbWUgZHVyaW5nIGFuIGltcG9ydC4gIEFsdGhvdWdoIGRvaW5nIHNvIG1pZ2h0IGJlIHNsaWdodGx5CitmYXN0ZXIgZm9yIGZhc3QtaW1wb3J0LCBpdCB0ZW5kcyB0byBpbmNyZWFzZSB0aGUgY29tcGxleGl0eSBvZiB0aGUgZnJvbnRlbmQKK2NvZGUgY29uc2lkZXJhYmx5LgorCitUaGUgYnJhbmNoIExSVSBidWlsdGluIHRvIGZhc3QtaW1wb3J0IHRlbmRzIHRvIGJlaGF2ZSB2ZXJ5IHdlbGwsIGFuZCB0aGUKK2Nvc3Qgb2YgYWN0aXZhdGluZyBhbiBpbmFjdGl2ZSBicmFuY2ggaXMgc28gbG93IHRoYXQgYm91bmNpbmcgYXJvdW5kCitiZXR3ZWVuIGJyYW5jaGVzIGhhcyB2aXJ0dWFsbHkgbm8gaW1wYWN0IG9uIGltcG9ydCBwZXJmb3JtYW5jZS4KKworSGFuZGxpbmcgUmVuYW1lcworfn5+fn5+fn5+fn5+fn5+fgorV2hlbiBpbXBvcnRpbmcgYSByZW5hbWVkIGZpbGUgb3IgZGlyZWN0b3J5LCBzaW1wbHkgZGVsZXRlIHRoZSBvbGQKK25hbWUocykgYW5kIG1vZGlmeSB0aGUgbmV3IG5hbWUocykgZHVyaW5nIHRoZSBjb3JyZXNwb25kaW5nIGNvbW1pdC4KK0dpdCBwZXJmb3JtcyByZW5hbWUgZGV0ZWN0aW9uIGFmdGVyLXRoZS1mYWN0LCByYXRoZXIgdGhhbiBleHBsaWNpdGx5CitkdXJpbmcgYSBjb21taXQuCisKK1VzZSBUYWcgRml4dXAgQnJhbmNoZXMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK1NvbWUgb3RoZXIgU0NNIHN5c3RlbXMgbGV0IHRoZSB1c2VyIGNyZWF0ZSBhIHRhZyBmcm9tIG11bHRpcGxlCitmaWxlcyB3aGljaCBhcmUgbm90IGZyb20gdGhlIHNhbWUgY29tbWl0L2NoYW5nZXNldC4gIE9yIHRvIGNyZWF0ZQordGFncyB3aGljaCBhcmUgYSBzdWJzZXQgb2YgdGhlIGZpbGVzIGF2YWlsYWJsZSBpbiB0aGUgcmVwb3NpdG9yeS4KKworSW1wb3J0aW5nIHRoZXNlIHRhZ3MgYXMtaXMgaW4gR2l0IGlzIGltcG9zc2libGUgd2l0aG91dCBtYWtpbmcgYXQKK2xlYXN0IG9uZSBjb21taXQgd2hpY2ggYGBmaXhlcyB1cCcnIHRoZSBmaWxlcyB0byBtYXRjaCB0aGUgY29udGVudAorb2YgdGhlIHRhZy4gIFVzZSBmYXN0LWltcG9ydCdzIGByZXNldGAgY29tbWFuZCB0byByZXNldCBhIGR1bW15IGJyYW5jaAorb3V0c2lkZSBvZiB5b3VyIG5vcm1hbCBicmFuY2ggc3BhY2UgdG8gdGhlIGJhc2UgY29tbWl0IGZvciB0aGUgdGFnLAordGhlbiBjb21taXQgb25lIG9yIG1vcmUgZmlsZSBmaXh1cCBjb21taXRzLCBhbmQgZmluYWxseSB0YWcgdGhlCitkdW1teSBicmFuY2guCisKK0ZvciBleGFtcGxlIHNpbmNlIGFsbCBub3JtYWwgYnJhbmNoZXMgYXJlIHN0b3JlZCB1bmRlciBgcmVmcy9oZWFkcy9gCituYW1lIHRoZSB0YWcgZml4dXAgYnJhbmNoIGBUQUdfRklYVVBgLiAgVGhpcyB3YXkgaXQgaXMgaW1wb3NzaWJsZSBmb3IKK3RoZSBmaXh1cCBicmFuY2ggdXNlZCBieSB0aGUgaW1wb3J0ZXIgdG8gaGF2ZSBuYW1lc3BhY2UgY29uZmxpY3RzCit3aXRoIHJlYWwgYnJhbmNoZXMgaW1wb3J0ZWQgZnJvbSB0aGUgc291cmNlICh0aGUgbmFtZSBgVEFHX0ZJWFVQYAoraXMgbm90IGByZWZzL2hlYWRzL1RBR19GSVhVUGApLgorCitXaGVuIGNvbW1pdHRpbmcgZml4dXBzLCBjb25zaWRlciB1c2luZyBgbWVyZ2VgIHRvIGNvbm5lY3QgdGhlCitjb21taXQocykgd2hpY2ggYXJlIHN1cHBseWluZyBmaWxlIHJldmlzaW9ucyB0byB0aGUgZml4dXAgYnJhbmNoLgorRG9pbmcgc28gd2lsbCBhbGxvdyB0b29scyBzdWNoIGFzIGxpbmtnaXQ6Z2l0LWJsYW1lWzFdIHRvIHRyYWNrCit0aHJvdWdoIHRoZSByZWFsIGNvbW1pdCBoaXN0b3J5IGFuZCBwcm9wZXJseSBhbm5vdGF0ZSB0aGUgc291cmNlCitmaWxlcy4KKworQWZ0ZXIgZmFzdC1pbXBvcnQgdGVybWluYXRlcyB0aGUgZnJvbnRlbmQgd2lsbCBuZWVkIHRvIGRvIGBybSAuZ2l0L1RBR19GSVhVUGAKK3RvIHJlbW92ZSB0aGUgZHVtbXkgYnJhbmNoLgorCitJbXBvcnQgTm93LCBSZXBhY2sgTGF0ZXIKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorQXMgc29vbiBhcyBmYXN0LWltcG9ydCBjb21wbGV0ZXMgdGhlIEdpdCByZXBvc2l0b3J5IGlzIGNvbXBsZXRlbHkgdmFsaWQKK2FuZCByZWFkeSBmb3IgdXNlLiAgVHlwaWNhbGx5IHRoaXMgdGFrZXMgb25seSBhIHZlcnkgc2hvcnQgdGltZSwKK2V2ZW4gZm9yIGNvbnNpZGVyYWJseSBsYXJnZSBwcm9qZWN0cyAoMTAwLDAwMCsgY29tbWl0cykuCisKK0hvd2V2ZXIgcmVwYWNraW5nIHRoZSByZXBvc2l0b3J5IGlzIG5lY2Vzc2FyeSB0byBpbXByb3ZlIGRhdGEKK2xvY2FsaXR5IGFuZCBhY2Nlc3MgcGVyZm9ybWFuY2UuICBJdCBjYW4gYWxzbyB0YWtlIGhvdXJzIG9uIGV4dHJlbWVseQorbGFyZ2UgcHJvamVjdHMgKGVzcGVjaWFsbHkgaWYgLWYgYW5kIGEgbGFyZ2UgXC0td2luZG93IHBhcmFtZXRlciBpcwordXNlZCkuICBTaW5jZSByZXBhY2tpbmcgaXMgc2FmZSB0byBydW4gYWxvbmdzaWRlIHJlYWRlcnMgYW5kIHdyaXRlcnMsCitydW4gdGhlIHJlcGFjayBpbiB0aGUgYmFja2dyb3VuZCBhbmQgbGV0IGl0IGZpbmlzaCB3aGVuIGl0IGZpbmlzaGVzLgorVGhlcmUgaXMgbm8gcmVhc29uIHRvIHdhaXQgdG8gZXhwbG9yZSB5b3VyIG5ldyBHaXQgcHJvamVjdCEKKworSWYgeW91IGNob29zZSB0byB3YWl0IGZvciB0aGUgcmVwYWNrLCBkb24ndCB0cnkgdG8gcnVuIGJlbmNobWFya3MKK29yIHBlcmZvcm1hbmNlIHRlc3RzIHVudGlsIHJlcGFja2luZyBpcyBjb21wbGV0ZWQuICBmYXN0LWltcG9ydCBvdXRwdXRzCitzdWJvcHRpbWFsIHBhY2tmaWxlcyB0aGF0IGFyZSBzaW1wbHkgbmV2ZXIgc2VlbiBpbiByZWFsIHVzZQorc2l0dWF0aW9ucy4KKworUmVwYWNraW5nIEhpc3RvcmljYWwgRGF0YQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorSWYgeW91IGFyZSByZXBhY2tpbmcgdmVyeSBvbGQgaW1wb3J0ZWQgZGF0YSAoZS5nLiBvbGRlciB0aGFuIHRoZQorbGFzdCB5ZWFyKSwgY29uc2lkZXIgZXhwZW5kaW5nIHNvbWUgZXh0cmEgQ1BVIHRpbWUgYW5kIHN1cHBseWluZworXC0td2luZG93PTUwIChvciBoaWdoZXIpIHdoZW4geW91IHJ1biBsaW5rZ2l0OmdpdC1yZXBhY2tbMV0uCitUaGlzIHdpbGwgdGFrZSBsb25nZXIsIGJ1dCB3aWxsIGFsc28gcHJvZHVjZSBhIHNtYWxsZXIgcGFja2ZpbGUuCitZb3Ugb25seSBuZWVkIHRvIGV4cGVuZCB0aGUgZWZmb3J0IG9uY2UsIGFuZCBldmVyeW9uZSB1c2luZyB5b3VyCitwcm9qZWN0IHdpbGwgYmVuZWZpdCBmcm9tIHRoZSBzbWFsbGVyIHJlcG9zaXRvcnkuCisKK0luY2x1ZGUgU29tZSBQcm9ncmVzcyBNZXNzYWdlcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitFdmVyeSBvbmNlIGluIGEgd2hpbGUgaGF2ZSB5b3VyIGZyb250ZW5kIGVtaXQgYSBgcHJvZ3Jlc3NgIG1lc3NhZ2UKK3RvIGZhc3QtaW1wb3J0LiAgVGhlIGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlcyBhcmUgZW50aXJlbHkgZnJlZS1mb3JtLAorc28gb25lIHN1Z2dlc3Rpb24gd291bGQgYmUgdG8gb3V0cHV0IHRoZSBjdXJyZW50IG1vbnRoIGFuZCB5ZWFyCitlYWNoIHRpbWUgdGhlIGN1cnJlbnQgY29tbWl0IGRhdGUgbW92ZXMgaW50byB0aGUgbmV4dCBtb250aC4KK1lvdXIgdXNlcnMgd2lsbCBmZWVsIGJldHRlciBrbm93aW5nIGhvdyBtdWNoIG9mIHRoZSBkYXRhIHN0cmVhbQoraGFzIGJlZW4gcHJvY2Vzc2VkLgorCisKK1BhY2tmaWxlIE9wdGltaXphdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitXaGVuIHBhY2tpbmcgYSBibG9iIGZhc3QtaW1wb3J0IGFsd2F5cyBhdHRlbXB0cyB0byBkZWx0aWZ5IGFnYWluc3QgdGhlIGxhc3QKK2Jsb2Igd3JpdHRlbi4gIFVubGVzcyBzcGVjaWZpY2FsbHkgYXJyYW5nZWQgZm9yIGJ5IHRoZSBmcm9udGVuZCwKK3RoaXMgd2lsbCBwcm9iYWJseSBub3QgYmUgYSBwcmlvciB2ZXJzaW9uIG9mIHRoZSBzYW1lIGZpbGUsIHNvIHRoZQorZ2VuZXJhdGVkIGRlbHRhIHdpbGwgbm90IGJlIHRoZSBzbWFsbGVzdCBwb3NzaWJsZS4gIFRoZSByZXN1bHRpbmcKK3BhY2tmaWxlIHdpbGwgYmUgY29tcHJlc3NlZCwgYnV0IHdpbGwgbm90IGJlIG9wdGltYWwuCisKK0Zyb250ZW5kcyB3aGljaCBoYXZlIGVmZmljaWVudCBhY2Nlc3MgdG8gYWxsIHJldmlzaW9ucyBvZiBhCitzaW5nbGUgZmlsZSAoZm9yIGV4YW1wbGUgcmVhZGluZyBhbiBSQ1MvQ1ZTICx2IGZpbGUpIGNhbiBjaG9vc2UKK3RvIHN1cHBseSBhbGwgcmV2aXNpb25zIG9mIHRoYXQgZmlsZSBhcyBhIHNlcXVlbmNlIG9mIGNvbnNlY3V0aXZlCitgYmxvYmAgY29tbWFuZHMuICBUaGlzIGFsbG93cyBmYXN0LWltcG9ydCB0byBkZWx0aWZ5IHRoZSBkaWZmZXJlbnQgZmlsZQorcmV2aXNpb25zIGFnYWluc3QgZWFjaCBvdGhlciwgc2F2aW5nIHNwYWNlIGluIHRoZSBmaW5hbCBwYWNrZmlsZS4KK01hcmtzIGNhbiBiZSB1c2VkIHRvIGxhdGVyIGlkZW50aWZ5IGluZGl2aWR1YWwgZmlsZSByZXZpc2lvbnMgZHVyaW5nCithIHNlcXVlbmNlIG9mIGBjb21taXRgIGNvbW1hbmRzLgorCitUaGUgcGFja2ZpbGUocykgY3JlYXRlZCBieSBmYXN0LWltcG9ydCBkbyBub3QgZW5jb3VyYWdlIGdvb2QgZGlzayBhY2Nlc3MKK3BhdHRlcm5zLiAgVGhpcyBpcyBjYXVzZWQgYnkgZmFzdC1pbXBvcnQgd3JpdGluZyB0aGUgZGF0YSBpbiB0aGUgb3JkZXIKK2l0IGlzIHJlY2VpdmVkIG9uIHN0YW5kYXJkIGlucHV0LCB3aGlsZSBHaXQgdHlwaWNhbGx5IG9yZ2FuaXplcworZGF0YSB3aXRoaW4gcGFja2ZpbGVzIHRvIG1ha2UgdGhlIG1vc3QgcmVjZW50IChjdXJyZW50IHRpcCkgZGF0YQorYXBwZWFyIGJlZm9yZSBoaXN0b3JpY2FsIGRhdGEuICBHaXQgYWxzbyBjbHVzdGVycyBjb21taXRzIHRvZ2V0aGVyLAorc3BlZWRpbmcgdXAgcmV2aXNpb24gdHJhdmVyc2FsIHRocm91Z2ggYmV0dGVyIGNhY2hlIGxvY2FsaXR5LgorCitGb3IgdGhpcyByZWFzb24gaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdGhhdCB1c2VycyByZXBhY2sgdGhlCityZXBvc2l0b3J5IHdpdGggYGdpdCByZXBhY2sgLWEgLWRgIGFmdGVyIGZhc3QtaW1wb3J0IGNvbXBsZXRlcywgYWxsb3dpbmcKK0dpdCB0byByZW9yZ2FuaXplIHRoZSBwYWNrZmlsZXMgZm9yIGZhc3RlciBkYXRhIGFjY2Vzcy4gIElmIGJsb2IKK2RlbHRhcyBhcmUgc3Vib3B0aW1hbCAoc2VlIGFib3ZlKSB0aGVuIGFsc28gYWRkaW5nIHRoZSBgLWZgIG9wdGlvbgordG8gZm9yY2UgcmVjb21wdXRhdGlvbiBvZiBhbGwgZGVsdGFzIGNhbiBzaWduaWZpY2FudGx5IHJlZHVjZSB0aGUKK2ZpbmFsIHBhY2tmaWxlIHNpemUgKDMwLTUwJSBzbWFsbGVyIGNhbiBiZSBxdWl0ZSB0eXBpY2FsKS4KKworCitNZW1vcnkgVXRpbGl6YXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLQorVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGZhY3RvcnMgd2hpY2ggYWZmZWN0IGhvdyBtdWNoIG1lbW9yeSBmYXN0LWltcG9ydAorcmVxdWlyZXMgdG8gcGVyZm9ybSBhbiBpbXBvcnQuICBMaWtlIGNyaXRpY2FsIHNlY3Rpb25zIG9mIGNvcmUKK0dpdCwgZmFzdC1pbXBvcnQgdXNlcyBpdHMgb3duIG1lbW9yeSBhbGxvY2F0b3JzIHRvIGFtb3J0aXplIGFueSBvdmVyaGVhZHMKK2Fzc29jaWF0ZWQgd2l0aCBtYWxsb2MuICBJbiBwcmFjdGljZSBmYXN0LWltcG9ydCB0ZW5kcyB0byBhbW9ydGl6ZSBhbnkKK21hbGxvYyBvdmVyaGVhZHMgdG8gMCwgZHVlIHRvIGl0cyB1c2Ugb2YgbGFyZ2UgYmxvY2sgYWxsb2NhdGlvbnMuCisKK3BlciBvYmplY3QKK35+fn5+fn5+fn4KK2Zhc3QtaW1wb3J0IG1haW50YWlucyBhbiBpbi1tZW1vcnkgc3RydWN0dXJlIGZvciBldmVyeSBvYmplY3Qgd3JpdHRlbiBpbgordGhpcyBleGVjdXRpb24uICBPbiBhIDMyIGJpdCBzeXN0ZW0gdGhlIHN0cnVjdHVyZSBpcyAzMiBieXRlcywKK29uIGEgNjQgYml0IHN5c3RlbSB0aGUgc3RydWN0dXJlIGlzIDQwIGJ5dGVzIChkdWUgdG8gdGhlIGxhcmdlcgorcG9pbnRlciBzaXplcykuICBPYmplY3RzIGluIHRoZSB0YWJsZSBhcmUgbm90IGRlYWxsb2NhdGVkIHVudGlsCitmYXN0LWltcG9ydCB0ZXJtaW5hdGVzLiAgSW1wb3J0aW5nIDIgbWlsbGlvbiBvYmplY3RzIG9uIGEgMzIgYml0IHN5c3RlbQord2lsbCByZXF1aXJlIGFwcHJveGltYXRlbHkgNjQgTWlCIG9mIG1lbW9yeS4KKworVGhlIG9iamVjdCB0YWJsZSBpcyBhY3R1YWxseSBhIGhhc2h0YWJsZSBrZXllZCBvbiB0aGUgb2JqZWN0IG5hbWUKKyh0aGUgdW5pcXVlIFNIQS0xKS4gIFRoaXMgc3RvcmFnZSBjb25maWd1cmF0aW9uIGFsbG93cyBmYXN0LWltcG9ydCB0byByZXVzZQorYW4gZXhpc3Rpbmcgb3IgYWxyZWFkeSB3cml0dGVuIG9iamVjdCBhbmQgYXZvaWQgd3JpdGluZyBkdXBsaWNhdGVzCit0byB0aGUgb3V0cHV0IHBhY2tmaWxlLiAgRHVwbGljYXRlIGJsb2JzIGFyZSBzdXJwcmlzaW5nbHkgY29tbW9uCitpbiBhbiBpbXBvcnQsIHR5cGljYWxseSBkdWUgdG8gYnJhbmNoIG1lcmdlcyBpbiB0aGUgc291cmNlLgorCitwZXIgbWFyaworfn5+fn5+fn4KK01hcmtzIGFyZSBzdG9yZWQgaW4gYSBzcGFyc2UgYXJyYXksIHVzaW5nIDEgcG9pbnRlciAoNCBieXRlcyBvciA4CitieXRlcywgZGVwZW5kaW5nIG9uIHBvaW50ZXIgc2l6ZSkgcGVyIG1hcmsuICBBbHRob3VnaCB0aGUgYXJyYXkKK2lzIHNwYXJzZSwgZnJvbnRlbmRzIGFyZSBzdGlsbCBzdHJvbmdseSBlbmNvdXJhZ2VkIHRvIHVzZSBtYXJrcworYmV0d2VlbiAxIGFuZCBuLCB3aGVyZSBuIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgbWFya3MgcmVxdWlyZWQgZm9yCit0aGlzIGltcG9ydC4KKworcGVyIGJyYW5jaAorfn5+fn5+fn5+fgorQnJhbmNoZXMgYXJlIGNsYXNzaWZpZWQgYXMgYWN0aXZlIGFuZCBpbmFjdGl2ZS4gIFRoZSBtZW1vcnkgdXNhZ2UKK29mIHRoZSB0d28gY2xhc3NlcyBpcyBzaWduaWZpY2FudGx5IGRpZmZlcmVudC4KKworSW5hY3RpdmUgYnJhbmNoZXMgYXJlIHN0b3JlZCBpbiBhIHN0cnVjdHVyZSB3aGljaCB1c2VzIDk2IG9yIDEyMAorYnl0ZXMgKDMyIGJpdCBvciA2NCBiaXQgc3lzdGVtcywgcmVzcGVjdGl2ZWx5KSwgcGx1cyB0aGUgbGVuZ3RoIG9mCit0aGUgYnJhbmNoIG5hbWUgKHR5cGljYWxseSB1bmRlciAyMDAgYnl0ZXMpLCBwZXIgYnJhbmNoLiAgZmFzdC1pbXBvcnQgd2lsbAorZWFzaWx5IGhhbmRsZSBhcyBtYW55IGFzIDEwLDAwMCBpbmFjdGl2ZSBicmFuY2hlcyBpbiB1bmRlciAyIE1pQgorb2YgbWVtb3J5LgorCitBY3RpdmUgYnJhbmNoZXMgaGF2ZSB0aGUgc2FtZSBvdmVyaGVhZCBhcyBpbmFjdGl2ZSBicmFuY2hlcywgYnV0CithbHNvIGNvbnRhaW4gY29waWVzIG9mIGV2ZXJ5IHRyZWUgdGhhdCBoYXMgYmVlbiByZWNlbnRseSBtb2RpZmllZCBvbgordGhhdCBicmFuY2guICBJZiBzdWJ0cmVlIGBpbmNsdWRlYCBoYXMgbm90IGJlZW4gbW9kaWZpZWQgc2luY2UgdGhlCiticmFuY2ggYmVjYW1lIGFjdGl2ZSwgaXRzIGNvbnRlbnRzIHdpbGwgbm90IGJlIGxvYWRlZCBpbnRvIG1lbW9yeSwKK2J1dCBpZiBzdWJ0cmVlIGBzcmNgIGhhcyBiZWVuIG1vZGlmaWVkIGJ5IGEgY29tbWl0IHNpbmNlIHRoZSBicmFuY2gKK2JlY2FtZSBhY3RpdmUsIHRoZW4gaXRzIGNvbnRlbnRzIHdpbGwgYmUgbG9hZGVkIGluIG1lbW9yeS4KKworQXMgYWN0aXZlIGJyYW5jaGVzIHN0b3JlIG1ldGFkYXRhIGFib3V0IHRoZSBmaWxlcyBjb250YWluZWQgb24gdGhhdAorYnJhbmNoLCB0aGVpciBpbi1tZW1vcnkgc3RvcmFnZSBzaXplIGNhbiBncm93IHRvIGEgY29uc2lkZXJhYmxlIHNpemUKKyhzZWUgYmVsb3cpLgorCitmYXN0LWltcG9ydCBhdXRvbWF0aWNhbGx5IG1vdmVzIGFjdGl2ZSBicmFuY2hlcyB0byBpbmFjdGl2ZSBzdGF0dXMgYmFzZWQgb24KK2Egc2ltcGxlIGxlYXN0LXJlY2VudGx5LXVzZWQgYWxnb3JpdGhtLiAgVGhlIExSVSBjaGFpbiBpcyB1cGRhdGVkIG9uCitlYWNoIGBjb21taXRgIGNvbW1hbmQuICBUaGUgbWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGJyYW5jaGVzIGNhbiBiZQoraW5jcmVhc2VkIG9yIGRlY3JlYXNlZCBvbiB0aGUgY29tbWFuZCBsaW5lIHdpdGggXC0tYWN0aXZlLWJyYW5jaGVzPS4KKworcGVyIGFjdGl2ZSB0cmVlCit+fn5+fn5+fn5+fn5+fn4KK1RyZWVzIChha2EgZGlyZWN0b3JpZXMpIHVzZSBqdXN0IDEyIGJ5dGVzIG9mIG1lbW9yeSBvbiB0b3Agb2YgdGhlCittZW1vcnkgcmVxdWlyZWQgZm9yIHRoZWlyIGVudHJpZXMgKHNlZSBgYHBlciBhY3RpdmUgZmlsZScnIGJlbG93KS4KK1RoZSBjb3N0IG9mIGEgdHJlZSBpcyB2aXJ0dWFsbHkgMCwgYXMgaXRzIG92ZXJoZWFkIGFtb3J0aXplcyBvdXQKK292ZXIgdGhlIGluZGl2aWR1YWwgZmlsZSBlbnRyaWVzLgorCitwZXIgYWN0aXZlIGZpbGUgZW50cnkKK35+fn5+fn5+fn5+fn5+fn5+fn5+fgorRmlsZXMgKGFuZCBwb2ludGVycyB0byBzdWJ0cmVlcykgd2l0aGluIGFjdGl2ZSB0cmVlcyByZXF1aXJlIDUyIG9yIDY0CitieXRlcyAoMzIvNjQgYml0IHBsYXRmb3JtcykgcGVyIGVudHJ5LiAgVG8gY29uc2VydmUgc3BhY2UsIGZpbGUgYW5kCit0cmVlIG5hbWVzIGFyZSBwb29sZWQgaW4gYSBjb21tb24gc3RyaW5nIHRhYmxlLCBhbGxvd2luZyB0aGUgZmlsZW5hbWUKK2BgTWFrZWZpbGUnJyB0byB1c2UganVzdCAxNiBieXRlcyAoYWZ0ZXIgaW5jbHVkaW5nIHRoZSBzdHJpbmcgaGVhZGVyCitvdmVyaGVhZCkgbm8gbWF0dGVyIGhvdyBtYW55IHRpbWVzIGl0IG9jY3VycyB3aXRoaW4gdGhlIHByb2plY3QuCisKK1RoZSBhY3RpdmUgYnJhbmNoIExSVSwgd2hlbiBjb3VwbGVkIHdpdGggdGhlIGZpbGVuYW1lIHN0cmluZyBwb29sCithbmQgbGF6eSBsb2FkaW5nIG9mIHN1YnRyZWVzLCBhbGxvd3MgZmFzdC1pbXBvcnQgdG8gZWZmaWNpZW50bHkgaW1wb3J0Citwcm9qZWN0cyB3aXRoIDIsMDAwKyBicmFuY2hlcyBhbmQgNDUsMTE0KyBmaWxlcyBpbiBhIHZlcnkgbGltaXRlZAorbWVtb3J5IGZvb3RwcmludCAobGVzcyB0aGFuIDIuNyBNaUIgcGVyIGFjdGl2ZSBicmFuY2gpLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4uCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtZmV0Y2gtcGFjay50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1mZXRjaC1wYWNrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzU5OGViCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtZmV0Y2gtcGFjay50eHQKQEAgLTAsMCArMSwxMDIgQEAKK2dpdC1mZXRjaC1wYWNrKDEpCis9PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZmV0Y2gtcGFjayAtIFJlY2VpdmUgbWlzc2luZyBvYmplY3RzIGZyb20gYW5vdGhlciByZXBvc2l0b3J5CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWZldGNoLXBhY2snIFstLWFsbF0gWy0tcXVpZXR8LXFdIFstLWtlZXB8LWtdIFstLXRoaW5dIFstLWluY2x1ZGUtdGFnXSBbLS11cGxvYWQtcGFjaz08Z2l0LXVwbG9hZC1wYWNrPl0gWy0tZGVwdGg9PG4+XSBbLS1uby1wcm9ncmVzc10gWy12XSBbPGhvc3Q+Ol08ZGlyZWN0b3J5PiBbPHJlZnM+Li4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1VzdWFsbHkgeW91IHdvdWxkIHdhbnQgdG8gdXNlIGxpbmtnaXQ6Z2l0LWZldGNoWzFdIHdoaWNoIGlzIGEKK2hpZ2hlciBsZXZlbCB3cmFwcGVyIG9mIHRoaXMgY29tbWFuZCBpbnN0ZWFkLgorCitJbnZva2VzICdnaXQtdXBsb2FkLXBhY2snIG9uIGEgcG90ZW50aWFsbHkgcmVtb3RlIHJlcG9zaXRvcnksCithbmQgYXNrcyBpdCB0byBzZW5kIG9iamVjdHMgbWlzc2luZyBmcm9tIHRoaXMgcmVwb3NpdG9yeSwgdG8KK3VwZGF0ZSB0aGUgbmFtZWQgaGVhZHMuICBUaGUgbGlzdCBvZiBjb21taXRzIGF2YWlsYWJsZSBsb2NhbGx5CitpcyBmb3VuZCBvdXQgYnkgc2Nhbm5pbmcgbG9jYWwgJEdJVF9ESVIvcmVmcy8gYW5kIHNlbnQgdG8KKydnaXQtdXBsb2FkLXBhY2snIHJ1bm5pbmcgb24gdGhlIG90aGVyIGVuZC4KKworVGhpcyBjb21tYW5kIGRlZ2VuZXJhdGVzIHRvIGRvd25sb2FkIGV2ZXJ5dGhpbmcgdG8gY29tcGxldGUgdGhlCithc2tlZCByZWZzIGZyb20gdGhlIHJlbW90ZSBzaWRlIHdoZW4gdGhlIGxvY2FsIHNpZGUgZG9lcyBub3QKK2hhdmUgYSBjb21tb24gYW5jZXN0b3IgY29tbWl0LgorCisKK09QVElPTlMKKy0tLS0tLS0KK1wtLWFsbDo6CisJRmV0Y2ggYWxsIHJlbW90ZSByZWZzLgorCitcLS1xdWlldCwgXC1xOjoKKwlQYXNzICctcScgZmxhZyB0byAnZ2l0LXVucGFjay1vYmplY3RzJzsgdGhpcyBtYWtlcyB0aGUKKwljbG9uaW5nIHByb2Nlc3MgbGVzcyB2ZXJib3NlLgorCitcLS1rZWVwLCBcLWs6OgorCURvIG5vdCBpbnZva2UgJ2dpdC11bnBhY2stb2JqZWN0cycgb24gcmVjZWl2ZWQgZGF0YSwgYnV0CisJY3JlYXRlIGEgc2luZ2xlIHBhY2tmaWxlIG91dCBvZiBpdCBpbnN0ZWFkLCBhbmQgc3RvcmUgaXQKKwlpbiB0aGUgb2JqZWN0IGRhdGFiYXNlLiBJZiBwcm92aWRlZCB0d2ljZSB0aGVuIHRoZSBwYWNrIGlzCisJbG9ja2VkIGFnYWluc3QgcmVwYWNraW5nLgorCitcLS10aGluOjoKKwlTcGVuZCBleHRyYSBjeWNsZXMgdG8gbWluaW1pemUgdGhlIG51bWJlciBvZiBvYmplY3RzIHRvIGJlIHNlbnQuCisJVXNlIGl0IG9uIHNsb3dlciBjb25uZWN0aW9uLgorCitcLS1pbmNsdWRlLXRhZzo6CisJSWYgdGhlIHJlbW90ZSBzaWRlIHN1cHBvcnRzIGl0LCBhbm5vdGF0ZWQgdGFncyBvYmplY3RzIHdpbGwKKwliZSBkb3dubG9hZGVkIG9uIHRoZSBzYW1lIGNvbm5lY3Rpb24gYXMgdGhlIG90aGVyIG9iamVjdHMgaWYKKwl0aGUgb2JqZWN0IHRoZSB0YWcgcmVmZXJlbmNlcyBpcyBkb3dubG9hZGVkLiAgVGhlIGNhbGxlciBtdXN0CisJb3RoZXJ3aXNlIGRldGVybWluZSB0aGUgdGFncyB0aGlzIG9wdGlvbiBtYWRlIGF2YWlsYWJsZS4KKworXC0tdXBsb2FkLXBhY2s9PGdpdC11cGxvYWQtcGFjaz46OgorCVVzZSB0aGlzIHRvIHNwZWNpZnkgdGhlIHBhdGggdG8gJ2dpdC11cGxvYWQtcGFjaycgb24gdGhlCisJcmVtb3RlIHNpZGUsIGlmIGlzIG5vdCBmb3VuZCBvbiB5b3VyICRQQVRILgorCUluc3RhbGxhdGlvbnMgb2Ygc3NoZCBpZ25vcmVzIHRoZSB1c2VyJ3MgZW52aXJvbm1lbnQKKwlzZXR1cCBzY3JpcHRzIGZvciBsb2dpbiBzaGVsbHMgKGUuZy4gLmJhc2hfcHJvZmlsZSkgYW5kCisJeW91ciBwcml2YXRlbHkgaW5zdGFsbGVkIGdpdCBtYXkgbm90IGJlIGZvdW5kIG9uIHRoZSBzeXN0ZW0KKwlkZWZhdWx0ICRQQVRILiAgQW5vdGhlciB3b3JrYXJvdW5kIHN1Z2dlc3RlZCBpcyB0byBzZXQKKwl1cCB5b3VyICRQQVRIIGluICIuYmFzaHJjIiwgYnV0IHRoaXMgZmxhZyBpcyBmb3IgcGVvcGxlCisJd2hvIGRvIG5vdCB3YW50IHRvIHBheSB0aGUgb3ZlcmhlYWQgZm9yIG5vbi1pbnRlcmFjdGl2ZQorCXNoZWxscyBieSBoYXZpbmcgYSBsZWFuIC5iYXNocmMgZmlsZSAodGhleSBzZXQgbW9zdCBvZgorCXRoZSB0aGluZ3MgdXAgaW4gLmJhc2hfcHJvZmlsZSkuCisKK1wtLWV4ZWM9PGdpdC11cGxvYWQtcGFjaz46OgorCVNhbWUgYXMgXC0tdXBsb2FkLXBhY2s9PGdpdC11cGxvYWQtcGFjaz4uCisKK1wtLWRlcHRoPTxuPjo6CisJTGltaXQgZmV0Y2hpbmcgdG8gYW5jZXN0b3ItY2hhaW5zIG5vdCBsb25nZXIgdGhhbiBuLgorCitcLS1uby1wcm9ncmVzczo6CisJRG8gbm90IHNob3cgdGhlIHByb2dyZXNzLgorCitcLXY6OgorCVJ1biB2ZXJib3NlbHkuCisKKzxob3N0Pjo6CisJQSByZW1vdGUgaG9zdCB0aGF0IGhvdXNlcyB0aGUgcmVwb3NpdG9yeS4gIFdoZW4gdGhpcworCXBhcnQgaXMgc3BlY2lmaWVkLCAnZ2l0LXVwbG9hZC1wYWNrJyBpcyBpbnZva2VkIHZpYQorCXNzaC4KKworPGRpcmVjdG9yeT46OgorCVRoZSByZXBvc2l0b3J5IHRvIHN5bmMgZnJvbS4KKworPHJlZnM+Li4uOjoKKwlUaGUgcmVtb3RlIGhlYWRzIHRvIHVwZGF0ZSBmcm9tLiBUaGlzIGlzIHJlbGF0aXZlIHRvCisJJEdJVF9ESVIgKGUuZy4gIkhFQUQiLCAicmVmcy9oZWFkcy9tYXN0ZXIiKS4gIFdoZW4KKwl1bnNwZWNpZmllZCwgdXBkYXRlIGZyb20gYWxsIGhlYWRzIHRoZSByZW1vdGUgc2lkZSBoYXMuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFuby4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1mZXRjaC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1mZXRjaC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk4MmY5NgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWZldGNoLnR4dApAQCAtMCwwICsxLDU2IEBACitnaXQtZmV0Y2goMSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZmV0Y2ggLSBEb3dubG9hZCBvYmplY3RzIGFuZCByZWZzIGZyb20gYW5vdGhlciByZXBvc2l0b3J5CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWZldGNoJyA8b3B0aW9ucz4gPHJlcG9zaXRvcnk+IDxyZWZzcGVjPi4uLgorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorRmV0Y2hlcyBuYW1lZCBoZWFkcyBvciB0YWdzIGZyb20gYW5vdGhlciByZXBvc2l0b3J5LCBhbG9uZyB3aXRoCit0aGUgb2JqZWN0cyBuZWNlc3NhcnkgdG8gY29tcGxldGUgdGhlbS4KKworVGhlIHJlZiBuYW1lcyBhbmQgdGhlaXIgb2JqZWN0IG5hbWVzIG9mIGZldGNoZWQgcmVmcyBhcmUgc3RvcmVkCitpbiBgLmdpdC9GRVRDSF9IRUFEYC4gIFRoaXMgaW5mb3JtYXRpb24gaXMgbGVmdCBmb3IgYSBsYXRlciBtZXJnZQorb3BlcmF0aW9uIGRvbmUgYnkgImdpdCBtZXJnZSIuCisKK1doZW4gPHJlZnNwZWM+IHN0b3JlcyB0aGUgZmV0Y2hlZCByZXN1bHQgaW4gdHJhY2tpbmcgYnJhbmNoZXMsCit0aGUgdGFncyB0aGF0IHBvaW50IGF0IHRoZXNlIGJyYW5jaGVzIGFyZSBhdXRvbWF0aWNhbGx5Citmb2xsb3dlZC4gIFRoaXMgaXMgZG9uZSBieSBmaXJzdCBmZXRjaGluZyBmcm9tIHRoZSByZW1vdGUgdXNpbmcKK3RoZSBnaXZlbiA8cmVmc3BlYz5zLCBhbmQgaWYgdGhlIHJlcG9zaXRvcnkgaGFzIG9iamVjdHMgdGhhdCBhcmUKK3BvaW50ZWQgYnkgcmVtb3RlIHRhZ3MgdGhhdCBpdCBkb2VzIG5vdCB5ZXQgaGF2ZSwgdGhlbiBmZXRjaAordGhvc2UgbWlzc2luZyB0YWdzLiAgSWYgdGhlIG90aGVyIGVuZCBoYXMgdGFncyB0aGF0IHBvaW50IGF0CiticmFuY2hlcyB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkIGluLCB5b3Ugd2lsbCBub3QgZ2V0IHRoZW0uCisKKworT1BUSU9OUworLS0tLS0tLQoraW5jbHVkZTo6ZmV0Y2gtb3B0aW9ucy50eHRbXQorCitpbmNsdWRlOjpwdWxsLWZldGNoLXBhcmFtLnR4dFtdCisKK2luY2x1ZGU6OnVybHMtcmVtb3Rlcy50eHRbXQorCitTRUUgQUxTTworLS0tLS0tLS0KK2xpbmtnaXQ6Z2l0LXB1bGxbMV0KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+IGFuZAorSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWZpbHRlci1icmFuY2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZmlsdGVyLWJyYW5jaC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE3ODU0OQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWZpbHRlci1icmFuY2gudHh0CkBAIC0wLDAgKzEsMzEwIEBACitnaXQtZmlsdGVyLWJyYW5jaCgxKQorPT09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWZpbHRlci1icmFuY2ggLSBSZXdyaXRlIGJyYW5jaGVzCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1maWx0ZXItYnJhbmNoJyBbLS1lbnYtZmlsdGVyIDxjb21tYW5kPl0gWy0tdHJlZS1maWx0ZXIgPGNvbW1hbmQ+XQorCVstLWluZGV4LWZpbHRlciA8Y29tbWFuZD5dIFstLXBhcmVudC1maWx0ZXIgPGNvbW1hbmQ+XQorCVstLW1zZy1maWx0ZXIgPGNvbW1hbmQ+XSBbLS1jb21taXQtZmlsdGVyIDxjb21tYW5kPl0KKwlbLS10YWctbmFtZS1maWx0ZXIgPGNvbW1hbmQ+XSBbLS1zdWJkaXJlY3RvcnktZmlsdGVyIDxkaXJlY3Rvcnk+XQorCVstLW9yaWdpbmFsIDxuYW1lc3BhY2U+XSBbLWQgPGRpcmVjdG9yeT5dIFstZiB8IC0tZm9yY2VdCisJWzxyZXYtbGlzdCBvcHRpb25zPi4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitMZXRzIHlvdSByZXdyaXRlIGdpdCByZXZpc2lvbiBoaXN0b3J5IGJ5IHJld3JpdGluZyB0aGUgYnJhbmNoZXMgbWVudGlvbmVkCitpbiB0aGUgPHJldi1saXN0IG9wdGlvbnM+LCBhcHBseWluZyBjdXN0b20gZmlsdGVycyBvbiBlYWNoIHJldmlzaW9uLgorVGhvc2UgZmlsdGVycyBjYW4gbW9kaWZ5IGVhY2ggdHJlZSAoZS5nLiByZW1vdmluZyBhIGZpbGUgb3IgcnVubmluZworYSBwZXJsIHJld3JpdGUgb24gYWxsIGZpbGVzKSBvciBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIGNvbW1pdC4KK090aGVyd2lzZSwgYWxsIGluZm9ybWF0aW9uIChpbmNsdWRpbmcgb3JpZ2luYWwgY29tbWl0IHRpbWVzIG9yIG1lcmdlCitpbmZvcm1hdGlvbikgd2lsbCBiZSBwcmVzZXJ2ZWQuCisKK1RoZSBjb21tYW5kIHdpbGwgb25seSByZXdyaXRlIHRoZSBfcG9zaXRpdmVfIHJlZnMgbWVudGlvbmVkIGluIHRoZQorY29tbWFuZCBsaW5lIChlLmcuIGlmIHlvdSBwYXNzICdhLi5iJywgb25seSAnYicgd2lsbCBiZSByZXdyaXR0ZW4pLgorSWYgeW91IHNwZWNpZnkgbm8gZmlsdGVycywgdGhlIGNvbW1pdHMgd2lsbCBiZSByZWNvbW1pdHRlZCB3aXRob3V0IGFueQorY2hhbmdlcywgd2hpY2ggd291bGQgbm9ybWFsbHkgaGF2ZSBubyBlZmZlY3QuICBOZXZlcnRoZWxlc3MsIHRoaXMgbWF5IGJlCit1c2VmdWwgaW4gdGhlIGZ1dHVyZSBmb3IgY29tcGVuc2F0aW5nIGZvciBzb21lIGdpdCBidWdzIG9yIHN1Y2gsCit0aGVyZWZvcmUgc3VjaCBhIHVzYWdlIGlzIHBlcm1pdHRlZC4KKworKldBUk5JTkcqISBUaGUgcmV3cml0dGVuIGhpc3Rvcnkgd2lsbCBoYXZlIGRpZmZlcmVudCBvYmplY3QgbmFtZXMgZm9yIGFsbAordGhlIG9iamVjdHMgYW5kIHdpbGwgbm90IGNvbnZlcmdlIHdpdGggdGhlIG9yaWdpbmFsIGJyYW5jaC4gIFlvdSB3aWxsIG5vdAorYmUgYWJsZSB0byBlYXNpbHkgcHVzaCBhbmQgZGlzdHJpYnV0ZSB0aGUgcmV3cml0dGVuIGJyYW5jaCBvbiB0b3Agb2YgdGhlCitvcmlnaW5hbCBicmFuY2guICBQbGVhc2UgZG8gbm90IHVzZSB0aGlzIGNvbW1hbmQgaWYgeW91IGRvIG5vdCBrbm93IHRoZQorZnVsbCBpbXBsaWNhdGlvbnMsIGFuZCBhdm9pZCB1c2luZyBpdCBhbnl3YXksIGlmIGEgc2ltcGxlIHNpbmdsZSBjb21taXQKK3dvdWxkIHN1ZmZpY2UgdG8gZml4IHlvdXIgcHJvYmxlbS4KKworQWx3YXlzIHZlcmlmeSB0aGF0IHRoZSByZXdyaXR0ZW4gdmVyc2lvbiBpcyBjb3JyZWN0OiBUaGUgb3JpZ2luYWwgcmVmcywKK2lmIGRpZmZlcmVudCBmcm9tIHRoZSByZXdyaXR0ZW4gb25lcywgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIG5hbWVzcGFjZQorJ3JlZnMvb3JpZ2luYWwvJy4KKworTm90ZSB0aGF0IHNpbmNlIHRoaXMgb3BlcmF0aW9uIGlzIHZlcnkgSS9PIGV4cGVuc2l2ZSwgaXQgbWlnaHQKK2JlIGEgZ29vZCBpZGVhIHRvIHJlZGlyZWN0IHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IG9mZi1kaXNrIHdpdGggdGhlCisnLWQnIG9wdGlvbiwgZS5nLiBvbiB0bXBmcy4gIFJlcG9ydGVkbHkgdGhlIHNwZWVkdXAgaXMgdmVyeSBub3RpY2VhYmxlLgorCisKK0ZpbHRlcnMKK35+fn5+fn4KKworVGhlIGZpbHRlcnMgYXJlIGFwcGxpZWQgaW4gdGhlIG9yZGVyIGFzIGxpc3RlZCBiZWxvdy4gIFRoZSA8Y29tbWFuZD4KK2FyZ3VtZW50IGlzIGFsd2F5cyBldmFsdWF0ZWQgaW4gdGhlIHNoZWxsIGNvbnRleHQgdXNpbmcgdGhlICdldmFsJyBjb21tYW5kCisod2l0aCB0aGUgbm90YWJsZSBleGNlcHRpb24gb2YgdGhlIGNvbW1pdCBmaWx0ZXIsIGZvciB0ZWNobmljYWwgcmVhc29ucykuCitQcmlvciB0byB0aGF0LCB0aGUgJEdJVF9DT01NSVQgZW52aXJvbm1lbnQgdmFyaWFibGUgd2lsbCBiZSBzZXQgdG8gY29udGFpbgordGhlIGlkIG9mIHRoZSBjb21taXQgYmVpbmcgcmV3cml0dGVuLiAgQWxzbywgR0lUX0FVVEhPUl9OQU1FLAorR0lUX0FVVEhPUl9FTUFJTCwgR0lUX0FVVEhPUl9EQVRFLCBHSVRfQ09NTUlUVEVSX05BTUUsIEdJVF9DT01NSVRURVJfRU1BSUwsCithbmQgR0lUX0NPTU1JVFRFUl9EQVRFIGFyZSBzZXQgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGNvbW1pdC4gIFRoZSB2YWx1ZXMKK29mIHRoZXNlIHZhcmlhYmxlcyBhZnRlciB0aGUgZmlsdGVycyBoYXZlIHJ1biwgYXJlIHVzZWQgZm9yIHRoZSBuZXcgY29tbWl0LgorSWYgYW55IGV2YWx1YXRpb24gb2YgPGNvbW1hbmQ+IHJldHVybnMgYSBub24temVybyBleGl0IHN0YXR1cywgdGhlIHdob2xlCitvcGVyYXRpb24gd2lsbCBiZSBhYm9ydGVkLgorCitBICdtYXAnIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSB0aGF0IHRha2VzIGFuICJvcmlnaW5hbCBzaGExIGlkIiBhcmd1bWVudAorYW5kIG91dHB1dHMgYSAicmV3cml0dGVuIHNoYTEgaWQiIGlmIHRoZSBjb21taXQgaGFzIGJlZW4gYWxyZWFkeQorcmV3cml0dGVuLCBhbmQgIm9yaWdpbmFsIHNoYTEgaWQiIG90aGVyd2lzZTsgdGhlICdtYXAnIGZ1bmN0aW9uIGNhbgorcmV0dXJuIHNldmVyYWwgaWRzIG9uIHNlcGFyYXRlIGxpbmVzIGlmIHlvdXIgY29tbWl0IGZpbHRlciBlbWl0dGVkCittdWx0aXBsZSBjb21taXRzLgorCisKK09QVElPTlMKKy0tLS0tLS0KKworLS1lbnYtZmlsdGVyIDxjb21tYW5kPjo6CisJVGhpcyBmaWx0ZXIgbWF5IGJlIHVzZWQgaWYgeW91IG9ubHkgbmVlZCB0byBtb2RpZnkgdGhlIGVudmlyb25tZW50CisJaW4gd2hpY2ggdGhlIGNvbW1pdCB3aWxsIGJlIHBlcmZvcm1lZC4gIFNwZWNpZmljYWxseSwgeW91IG1pZ2h0CisJd2FudCB0byByZXdyaXRlIHRoZSBhdXRob3IvY29tbWl0dGVyIG5hbWUvZW1haWwvdGltZSBlbnZpcm9ubWVudAorCXZhcmlhYmxlcyAoc2VlIGxpbmtnaXQ6Z2l0LWNvbW1pdFsxXSBmb3IgZGV0YWlscykuICBEbyBub3QgZm9yZ2V0CisJdG8gcmUtZXhwb3J0IHRoZSB2YXJpYWJsZXMuCisKKy0tdHJlZS1maWx0ZXIgPGNvbW1hbmQ+OjoKKwlUaGlzIGlzIHRoZSBmaWx0ZXIgZm9yIHJld3JpdGluZyB0aGUgdHJlZSBhbmQgaXRzIGNvbnRlbnRzLgorCVRoZSBhcmd1bWVudCBpcyBldmFsdWF0ZWQgaW4gc2hlbGwgd2l0aCB0aGUgd29ya2luZworCWRpcmVjdG9yeSBzZXQgdG8gdGhlIHJvb3Qgb2YgdGhlIGNoZWNrZWQgb3V0IHRyZWUuICBUaGUgbmV3IHRyZWUKKwlpcyB0aGVuIHVzZWQgYXMtaXMgKG5ldyBmaWxlcyBhcmUgYXV0by1hZGRlZCwgZGlzYXBwZWFyZWQgZmlsZXMKKwlhcmUgYXV0by1yZW1vdmVkIC0gbmVpdGhlciAuZ2l0aWdub3JlIGZpbGVzIG5vciBhbnkgb3RoZXIgaWdub3JlCisJcnVsZXMgKkhBVkUgQU5ZIEVGRkVDVCohKS4KKworLS1pbmRleC1maWx0ZXIgPGNvbW1hbmQ+OjoKKwlUaGlzIGlzIHRoZSBmaWx0ZXIgZm9yIHJld3JpdGluZyB0aGUgaW5kZXguICBJdCBpcyBzaW1pbGFyIHRvIHRoZQorCXRyZWUgZmlsdGVyIGJ1dCBkb2VzIG5vdCBjaGVjayBvdXQgdGhlIHRyZWUsIHdoaWNoIG1ha2VzIGl0IG11Y2gKKwlmYXN0ZXIuICBGb3IgaGFpcnkgY2FzZXMsIHNlZSBsaW5rZ2l0OmdpdC11cGRhdGUtaW5kZXhbMV0uCisKKy0tcGFyZW50LWZpbHRlciA8Y29tbWFuZD46OgorCVRoaXMgaXMgdGhlIGZpbHRlciBmb3IgcmV3cml0aW5nIHRoZSBjb21taXQncyBwYXJlbnQgbGlzdC4KKwlJdCB3aWxsIHJlY2VpdmUgdGhlIHBhcmVudCBzdHJpbmcgb24gc3RkaW4gYW5kIHNoYWxsIG91dHB1dAorCXRoZSBuZXcgcGFyZW50IHN0cmluZyBvbiBzdGRvdXQuICBUaGUgcGFyZW50IHN0cmluZyBpcyBpbgorCWEgZm9ybWF0IGFjY2VwdGVkIGJ5IGxpbmtnaXQ6Z2l0LWNvbW1pdC10cmVlWzFdOiBlbXB0eSBmb3IKKwl0aGUgaW5pdGlhbCBjb21taXQsICItcCBwYXJlbnQiIGZvciBhIG5vcm1hbCBjb21taXQgYW5kCisJIi1wIHBhcmVudDEgLXAgcGFyZW50MiAtcCBwYXJlbnQzIC4uLiIgZm9yIGEgbWVyZ2UgY29tbWl0LgorCistLW1zZy1maWx0ZXIgPGNvbW1hbmQ+OjoKKwlUaGlzIGlzIHRoZSBmaWx0ZXIgZm9yIHJld3JpdGluZyB0aGUgY29tbWl0IG1lc3NhZ2VzLgorCVRoZSBhcmd1bWVudCBpcyBldmFsdWF0ZWQgaW4gdGhlIHNoZWxsIHdpdGggdGhlIG9yaWdpbmFsCisJY29tbWl0IG1lc3NhZ2Ugb24gc3RhbmRhcmQgaW5wdXQ7IGl0cyBzdGFuZGFyZCBvdXRwdXQgaXMKKwl1c2VkIGFzIHRoZSBuZXcgY29tbWl0IG1lc3NhZ2UuCisKKy0tY29tbWl0LWZpbHRlciA8Y29tbWFuZD46OgorCVRoaXMgaXMgdGhlIGZpbHRlciBmb3IgcGVyZm9ybWluZyB0aGUgY29tbWl0LgorCUlmIHRoaXMgZmlsdGVyIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBiZSBjYWxsZWQgaW5zdGVhZCBvZiB0aGUKKwlsaW5rZ2l0OmdpdC1jb21taXQtdHJlZVsxXSBjb21tYW5kLCB3aXRoIGFyZ3VtZW50cyBvZiB0aGUgZm9ybQorCSI8VFJFRV9JRD4gWy1wIDxQQVJFTlRfQ09NTUlUX0lEPl0uLi4iIGFuZCB0aGUgbG9nIG1lc3NhZ2Ugb24KKwlzdGRpbi4gIFRoZSBjb21taXQgaWQgaXMgZXhwZWN0ZWQgb24gc3Rkb3V0LgorKworQXMgYSBzcGVjaWFsIGV4dGVuc2lvbiwgdGhlIGNvbW1pdCBmaWx0ZXIgbWF5IGVtaXQgbXVsdGlwbGUKK2NvbW1pdCBpZHM7IGluIHRoYXQgY2FzZSwgYW5jZXN0b3JzIG9mIHRoZSBvcmlnaW5hbCBjb21taXQgd2lsbAoraGF2ZSBhbGwgb2YgdGhlbSBhcyBwYXJlbnRzLgorKworWW91IGNhbiB1c2UgdGhlICdtYXAnIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGluIHRoaXMgZmlsdGVyLCBhbmQgb3RoZXIKK2NvbnZlbmllbmNlIGZ1bmN0aW9ucywgdG9vLiAgRm9yIGV4YW1wbGUsIGNhbGxpbmcgJ3NraXBfY29tbWl0ICIkQCInCit3aWxsIGxlYXZlIG91dCB0aGUgY3VycmVudCBjb21taXQgKGJ1dCBub3QgaXRzIGNoYW5nZXMhIElmIHlvdSB3YW50Cit0aGF0LCB1c2UgbGlua2dpdDpnaXQtcmViYXNlWzFdIGluc3RlYWQpLgorCistLXRhZy1uYW1lLWZpbHRlciA8Y29tbWFuZD46OgorCVRoaXMgaXMgdGhlIGZpbHRlciBmb3IgcmV3cml0aW5nIHRhZyBuYW1lcy4gV2hlbiBwYXNzZWQsCisJaXQgd2lsbCBiZSBjYWxsZWQgZm9yIGV2ZXJ5IHRhZyByZWYgdGhhdCBwb2ludHMgdG8gYSByZXdyaXR0ZW4KKwlvYmplY3QgKG9yIHRvIGEgdGFnIG9iamVjdCB3aGljaCBwb2ludHMgdG8gYSByZXdyaXR0ZW4gb2JqZWN0KS4KKwlUaGUgb3JpZ2luYWwgdGFnIG5hbWUgaXMgcGFzc2VkIHZpYSBzdGFuZGFyZCBpbnB1dCwgYW5kIHRoZSBuZXcKKwl0YWcgbmFtZSBpcyBleHBlY3RlZCBvbiBzdGFuZGFyZCBvdXRwdXQuCisrCitUaGUgb3JpZ2luYWwgdGFncyBhcmUgbm90IGRlbGV0ZWQsIGJ1dCBjYW4gYmUgb3ZlcndyaXR0ZW47Cit1c2UgIi0tdGFnLW5hbWUtZmlsdGVyIGNhdCIgdG8gc2ltcGx5IHVwZGF0ZSB0aGUgdGFncy4gIEluIHRoaXMKK2Nhc2UsIGJlIHZlcnkgY2FyZWZ1bCBhbmQgbWFrZSBzdXJlIHlvdSBoYXZlIHRoZSBvbGQgdGFncworYmFja2VkIHVwIGluIGNhc2UgdGhlIGNvbnZlcnNpb24gaGFzIHJ1biBhZm91bC4KKysKK05vdGUgdGhhdCB0aGVyZSBpcyBjdXJyZW50bHkgbm8gc3VwcG9ydCBmb3IgcHJvcGVyIHJld3JpdGluZyBvZgordGFnIG9iamVjdHM7IGluIGxheW1hbiB0ZXJtcywgaWYgdGhlIHRhZyBoYXMgYSBtZXNzYWdlIG9yIHNpZ25hdHVyZQorYXR0YWNoZWQsIHRoZSByZXdyaXR0ZW4gdGFnIHdvbid0IGhhdmUgaXQuICBTb3JyeS4gIChJdCBpcyBieQorZGVmaW5pdGlvbiBpbXBvc3NpYmxlIHRvIHByZXNlcnZlIHNpZ25hdHVyZXMgYXQgYW55IHJhdGUuKQorCistLXN1YmRpcmVjdG9yeS1maWx0ZXIgPGRpcmVjdG9yeT46OgorCU9ubHkgbG9vayBhdCB0aGUgaGlzdG9yeSB3aGljaCB0b3VjaGVzIHRoZSBnaXZlbiBzdWJkaXJlY3RvcnkuCisJVGhlIHJlc3VsdCB3aWxsIGNvbnRhaW4gdGhhdCBkaXJlY3RvcnkgKGFuZCBvbmx5IHRoYXQpIGFzIGl0cworCXByb2plY3Qgcm9vdC4KKworLS1vcmlnaW5hbCA8bmFtZXNwYWNlPjo6CisJVXNlIHRoaXMgb3B0aW9uIHRvIHNldCB0aGUgbmFtZXNwYWNlIHdoZXJlIHRoZSBvcmlnaW5hbCBjb21taXRzCisJd2lsbCBiZSBzdG9yZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzICdyZWZzL29yaWdpbmFsJy4KKworLWQgPGRpcmVjdG9yeT46OgorCVVzZSB0aGlzIG9wdGlvbiB0byBzZXQgdGhlIHBhdGggdG8gdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkgdXNlZCBmb3IKKwlyZXdyaXRpbmcuICBXaGVuIGFwcGx5aW5nIGEgdHJlZSBmaWx0ZXIsIHRoZSBjb21tYW5kIG5lZWRzIHRvCisJdGVtcG9yYXJpbHkgY2hlY2sgb3V0IHRoZSB0cmVlIHRvIHNvbWUgZGlyZWN0b3J5LCB3aGljaCBtYXkgY29uc3VtZQorCWNvbnNpZGVyYWJsZSBzcGFjZSBpbiBjYXNlIG9mIGxhcmdlIHByb2plY3RzLiAgQnkgZGVmYXVsdCBpdAorCWRvZXMgdGhpcyBpbiB0aGUgJy5naXQtcmV3cml0ZS8nIGRpcmVjdG9yeSBidXQgeW91IGNhbiBvdmVycmlkZQorCXRoYXQgY2hvaWNlIGJ5IHRoaXMgcGFyYW1ldGVyLgorCistZnwtLWZvcmNlOjoKKwlgZ2l0IGZpbHRlci1icmFuY2hgIHJlZnVzZXMgdG8gc3RhcnQgd2l0aCBhbiBleGlzdGluZyB0ZW1wb3JhcnkKKwlkaXJlY3Rvcnkgb3Igd2hlbiB0aGVyZSBhcmUgYWxyZWFkeSByZWZzIHN0YXJ0aW5nIHdpdGgKKwkncmVmcy9vcmlnaW5hbC8nLCB1bmxlc3MgZm9yY2VkLgorCis8cmV2LWxpc3Qtb3B0aW9ucz46OgorCVdoZW4gb3B0aW9ucyBhcmUgZ2l2ZW4gYWZ0ZXIgdGhlIG5ldyBicmFuY2ggbmFtZSwgdGhleSB3aWxsCisJYmUgcGFzc2VkIHRvIGxpbmtnaXQ6Z2l0LXJldi1saXN0WzFdLiAgT25seSBjb21taXRzIGluIHRoZSByZXN1bHRpbmcKKwlvdXRwdXQgd2lsbCBiZSBmaWx0ZXJlZCwgYWx0aG91Z2ggdGhlIGZpbHRlcmVkIGNvbW1pdHMgY2FuIHN0aWxsCisJcmVmZXJlbmNlIHBhcmVudHMgd2hpY2ggYXJlIG91dHNpZGUgb2YgdGhhdCBzZXQuCisKKworRXhhbXBsZXMKKy0tLS0tLS0tCisKK1N1cHBvc2UgeW91IHdhbnQgdG8gcmVtb3ZlIGEgZmlsZSAoY29udGFpbmluZyBjb25maWRlbnRpYWwgaW5mb3JtYXRpb24KK29yIGNvcHlyaWdodCB2aW9sYXRpb24pIGZyb20gYWxsIGNvbW1pdHM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dpdCBmaWx0ZXItYnJhbmNoIC0tdHJlZS1maWx0ZXIgJ3JtIGZpbGVuYW1lJyBIRUFECistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Egc2lnbmlmaWNhbnRseSBmYXN0ZXIgdmVyc2lvbjoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dpdCBmaWx0ZXItYnJhbmNoIC0taW5kZXgtZmlsdGVyICdnaXQgdXBkYXRlLWluZGV4IC0tcmVtb3ZlIGZpbGVuYW1lJyBIRUFECistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3csIHlvdSB3aWxsIGdldCB0aGUgcmV3cml0dGVuIGhpc3Rvcnkgc2F2ZWQgaW4gSEVBRC4KKworVG8gc2V0IGEgY29tbWl0ICh3aGljaCB0eXBpY2FsbHkgaXMgYXQgdGhlIHRpcCBvZiBhbm90aGVyCitoaXN0b3J5KSB0byBiZSB0aGUgcGFyZW50IG9mIHRoZSBjdXJyZW50IGluaXRpYWwgY29tbWl0LCBpbgorb3JkZXIgdG8gcGFzdGUgdGhlIG90aGVyIGhpc3RvcnkgYmVoaW5kIHRoZSBjdXJyZW50IGhpc3Rvcnk6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dpdCBmaWx0ZXItYnJhbmNoIC0tcGFyZW50LWZpbHRlciAnc2VkICJzL15cJC8tcCA8Z3JhZnQtaWQ+LyInIEhFQUQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKGlmIHRoZSBwYXJlbnQgc3RyaW5nIGlzIGVtcHR5IC0gd2hpY2ggaGFwcGVucyB3aGVuIHdlIGFyZSBkZWFsaW5nIHdpdGgKK3RoZSBpbml0aWFsIGNvbW1pdCAtIGFkZCBncmFmdGNvbW1pdCBhcyBhIHBhcmVudCkuICBOb3RlIHRoYXQgdGhpcyBhc3N1bWVzCitoaXN0b3J5IHdpdGggYSBzaW5nbGUgcm9vdCAodGhhdCBpcywgbm8gbWVyZ2Ugd2l0aG91dCBjb21tb24gYW5jZXN0b3JzCitoYXBwZW5lZCkuICBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgdXNlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ2l0IGZpbHRlci1icmFuY2ggLS1wYXJlbnQtZmlsdGVyIFwKKwkndGVzdCAkR0lUX0NPTU1JVCA9IDxjb21taXQtaWQ+ICYmIGVjaG8gIi1wIDxncmFmdC1pZD4iIHx8IGNhdCcgSEVBRAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworb3IgZXZlbiBzaW1wbGVyOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZWNobyAiJGNvbW1pdC1pZCAkZ3JhZnQtaWQiID4+IC5naXQvaW5mby9ncmFmdHMKK2dpdCBmaWx0ZXItYnJhbmNoICRncmFmdC1pZC4uSEVBRAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gcmVtb3ZlIGNvbW1pdHMgYXV0aG9yZWQgYnkgIkRhcmwgTWNCcmliZSIgZnJvbSB0aGUgaGlzdG9yeToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnaXQgZmlsdGVyLWJyYW5jaCAtLWNvbW1pdC1maWx0ZXIgJworCWlmIFsgIiRHSVRfQVVUSE9SX05BTUUiID0gIkRhcmwgTWNCcmliZSIgXTsKKwl0aGVuCisJCXNraXBfY29tbWl0ICIkQCI7CisJZWxzZQorCQlnaXQgY29tbWl0LXRyZWUgIiRAIjsKKwlmaScgSEVBRAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBmdW5jdGlvbiAnc2tpcF9jb21taXQnIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3NraXBfY29tbWl0KCkKK3sKKwlzaGlmdDsKKwl3aGlsZSBbIC1uICIkMSIgXTsKKwlkbworCQlzaGlmdDsKKwkJbWFwICIkMSI7CisJCXNoaWZ0OworCWRvbmU7Cit9CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgc2hpZnQgbWFnaWMgZmlyc3QgdGhyb3dzIGF3YXkgdGhlIHRyZWUgaWQgYW5kIHRoZW4gdGhlIC1wCitwYXJhbWV0ZXJzLiAgTm90ZSB0aGF0IHRoaXMgaGFuZGxlcyBtZXJnZXMgcHJvcGVybHkhIEluIGNhc2UgRGFybAorY29tbWl0dGVkIGEgbWVyZ2UgYmV0d2VlbiBQMSBhbmQgUDIsIGl0IHdpbGwgYmUgcHJvcGFnYXRlZCBwcm9wZXJseQorYW5kIGFsbCBjaGlsZHJlbiBvZiB0aGUgbWVyZ2Ugd2lsbCBiZWNvbWUgbWVyZ2UgY29tbWl0cyB3aXRoIFAxLFAyCithcyB0aGVpciBwYXJlbnRzIGluc3RlYWQgb2YgdGhlIG1lcmdlIGNvbW1pdC4KKworWW91IGNhbiByZXdyaXRlIHRoZSBjb21taXQgbG9nIG1lc3NhZ2VzIHVzaW5nIGAtLW1lc3NhZ2UtZmlsdGVyYC4gIEZvcgorZXhhbXBsZSwgYGdpdC1zdm4taWRgIHN0cmluZ3MgaW4gYSByZXBvc2l0b3J5IGNyZWF0ZWQgYnkgYGdpdC1zdm5gIGNhbgorYmUgcmVtb3ZlZCB0aGlzIHdheToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ2l0IGZpbHRlci1icmFuY2ggLS1tZXNzYWdlLWZpbHRlciAnCisJc2VkIC1lICIvXmdpdC1zdm4taWQ6L2QiCisnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIHJlc3RyaWN0IHJld3JpdGluZyB0byBvbmx5IHBhcnQgb2YgdGhlIGhpc3RvcnksIHNwZWNpZnkgYSByZXZpc2lvbgorcmFuZ2UgaW4gYWRkaXRpb24gdG8gdGhlIG5ldyBicmFuY2ggbmFtZS4gIFRoZSBuZXcgYnJhbmNoIG5hbWUgd2lsbAorcG9pbnQgdG8gdGhlIHRvcC1tb3N0IHJldmlzaW9uIHRoYXQgYSAnZ2l0IHJldi1saXN0JyBvZiB0aGlzIHJhbmdlCit3aWxsIHByaW50LgorCisqTk9URSogdGhlIGNoYW5nZXMgaW50cm9kdWNlZCBieSB0aGUgY29tbWl0cywgYW5kIHdoaWNoIGFyZSBub3QgcmV2ZXJ0ZWQKK2J5IHN1YnNlcXVlbnQgY29tbWl0cywgd2lsbCBzdGlsbCBiZSBpbiB0aGUgcmV3cml0dGVuIGJyYW5jaC4gSWYgeW91IHdhbnQKK3RvIHRocm93IG91dCBfY2hhbmdlc18gdG9nZXRoZXIgd2l0aCB0aGUgY29tbWl0cywgeW91IHNob3VsZCB1c2UgdGhlCitpbnRlcmFjdGl2ZSBtb2RlIG9mIGxpbmtnaXQ6Z2l0LXJlYmFzZVsxXS4KKworCitDb25zaWRlciB0aGlzIGhpc3Rvcnk6CisKKy0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBELS1FLS1GLS1HLS1ICisgICAgLyAgICAgLworQS0tQi0tLS0tQworLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIHJld3JpdGUgb25seSBjb21taXRzIEQsRSxGLEcsSCwgYnV0IGxlYXZlIEEsIEIgYW5kIEMgYWxvbmUsIHVzZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dpdCBmaWx0ZXItYnJhbmNoIC4uLiBDLi5ICistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUbyByZXdyaXRlIGNvbW1pdHMgRSxGLEcsSCwgdXNlIG9uZSBvZiB0aGVzZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ2l0IGZpbHRlci1icmFuY2ggLi4uIEMuLkggLS1ub3QgRAorZ2l0IGZpbHRlci1icmFuY2ggLi4uIEQuLkggLS1ub3QgQworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUbyBtb3ZlIHRoZSB3aG9sZSB0cmVlIGludG8gYSBzdWJkaXJlY3RvcnksIG9yIHJlbW92ZSBpdCBmcm9tIHRoZXJlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dpdCBmaWx0ZXItYnJhbmNoIC0taW5kZXgtZmlsdGVyIFwKKwknZ2l0IGxzLWZpbGVzIC1zIHwgc2VkICJzLVx0LSZuZXdzdWJkaXIvLSIgfAorCQlHSVRfSU5ERVhfRklMRT0kR0lUX0lOREVYX0ZJTEUubmV3IFwKKwkJCWdpdCB1cGRhdGUtaW5kZXggLS1pbmRleC1pbmZvICYmCisJIG12ICRHSVRfSU5ERVhfRklMRS5uZXcgJEdJVF9JTkRFWF9GSUxFJyBIRUFECistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBQZXRyICJQYXNreSIgQmF1ZGlzIDxwYXNreUBzdXNlLmN6PiwKK2FuZCB0aGUgZ2l0IGxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IFBldHIgQmF1ZGlzIGFuZCB0aGUgZ2l0IGxpc3QuCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtZm10LW1lcmdlLW1zZy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1mbXQtbWVyZ2UtbXNnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjE1YWUzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtZm10LW1lcmdlLW1zZy50eHQKQEAgLTAsMCArMSw2MiBAQAorZ2l0LWZtdC1tZXJnZS1tc2coMSkKKz09PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1mbXQtbWVyZ2UtbXNnIC0gUHJvZHVjZSBhIG1lcmdlIGNvbW1pdCBtZXNzYWdlCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCitnaXQtZm10LW1lcmdlLW1zZyBbLS1zdW1tYXJ5IHwgLS1uby1zdW1tYXJ5XSA8JEdJVF9ESVIvRkVUQ0hfSEVBRAorZ2l0LWZtdC1tZXJnZS1tc2cgWy0tc3VtbWFyeSB8IC0tbm8tc3VtbWFyeV0gLUYgPGZpbGU+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGFrZXMgdGhlIGxpc3Qgb2YgbWVyZ2VkIG9iamVjdHMgb24gc3RkaW4gYW5kIHByb2R1Y2VzIGEgc3VpdGFibGUKK2NvbW1pdCBtZXNzYWdlIHRvIGJlIHVzZWQgZm9yIHRoZSBtZXJnZSBjb21taXQsIHVzdWFsbHkgdG8gYmUKK3Bhc3NlZCBhcyB0aGUgJzxtZXJnZS1tZXNzYWdlPicgYXJndW1lbnQgb2YgYGdpdC1tZXJnZWAuCisKK1RoaXMgc2NyaXB0IGlzIGludGVuZGVkIG1vc3RseSBmb3IgaW50ZXJuYWwgdXNlIGJ5IHNjcmlwdHMKK2F1dG9tYXRpY2FsbHkgaW52b2tpbmcgYGdpdC1tZXJnZWAuCisKK09QVElPTlMKKy0tLS0tLS0KKworLS1zdW1tYXJ5OjoKKwlJbiBhZGRpdGlvbiB0byBicmFuY2ggbmFtZXMsIHBvcHVsYXRlIHRoZSBsb2cgbWVzc2FnZSB3aXRoCisJb25lLWxpbmUgZGVzY3JpcHRpb25zIGZyb20gdGhlIGFjdHVhbCBjb21taXRzIHRoYXQgYXJlIGJlaW5nCisJbWVyZ2VkLgorCistLW5vLXN1bW1hcnk6OgorCURvIG5vdCBsaXN0IG9uZS1saW5lIGRlc2NyaXB0aW9ucyBmcm9tIHRoZSBhY3R1YWwgY29tbWl0cyBiZWluZworCW1lcmdlZC4KKworLS1maWxlIDxmaWxlPiwgLUYgPGZpbGU+OjoKKwlUYWtlIHRoZSBsaXN0IG9mIG1lcmdlZCBvYmplY3RzIGZyb20gPGZpbGU+IGluc3RlYWQgb2YKKwlzdGRpbi4KKworQ09ORklHVVJBVElPTgorLS0tLS0tLS0tLS0tLQorCittZXJnZS5zdW1tYXJ5OjoKKwlXaGV0aGVyIHRvIGluY2x1ZGUgc3VtbWFyaWVzIG9mIG1lcmdlZCBjb21taXRzIGluIG5ld2x5CisJbWVyZ2UgY29tbWl0IG1lc3NhZ2VzLiBGYWxzZSBieSBkZWZhdWx0LgorCitTRUUgQUxTTworLS0tLS0tLS0KK2xpbmtnaXQ6Z2l0LW1lcmdlWzFdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBQZXRyIEJhdWRpcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtZm9yLWVhY2gtcmVmLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWZvci1lYWNoLXJlZi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmOTBjYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWZvci1lYWNoLXJlZi50eHQKQEAgLTAsMCArMSwxOTMgQEAKK2dpdC1mb3ItZWFjaC1yZWYoMSkKKz09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWZvci1lYWNoLXJlZiAtIE91dHB1dCBpbmZvcm1hdGlvbiBvbiBlYWNoIHJlZgorCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtZm9yLWVhY2gtcmVmJyBbLS1jb3VudD08Y291bnQ+XVwqCisgICAgICAgICAgICAgICAgICAgWy0tc2hlbGx8LS1wZXJsfC0tcHl0aG9ufC0tdGNsXQorICAgICAgICAgICAgICAgICAgIFstLXNvcnQ9PGtleT5dXCogWy0tZm9ybWF0PTxmb3JtYXQ+XSBbPHBhdHRlcm4+XQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworSXRlcmF0ZSBvdmVyIGFsbCByZWZzIHRoYXQgbWF0Y2ggYDxwYXR0ZXJuPmAgYW5kIHNob3cgdGhlbQorYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBgPGZvcm1hdD5gLCBhZnRlciBzb3J0aW5nIHRoZW0gYWNjb3JkaW5nCit0byB0aGUgZ2l2ZW4gc2V0IG9mIGA8a2V5PmAuICBJZiBgPG1heD5gIGlzIGdpdmVuLCBzdG9wIGFmdGVyCitzaG93aW5nIHRoYXQgbWFueSByZWZzLiAgVGhlIGludGVycG9sYXRlZCB2YWx1ZXMgaW4gYDxmb3JtYXQ+YAorY2FuIG9wdGlvbmFsbHkgYmUgcXVvdGVkIGFzIHN0cmluZyBsaXRlcmFscyBpbiB0aGUgc3BlY2lmaWVkCitob3N0IGxhbmd1YWdlIGFsbG93aW5nIHRoZWlyIGRpcmVjdCBldmFsdWF0aW9uIGluIHRoYXQgbGFuZ3VhZ2UuCisKK09QVElPTlMKKy0tLS0tLS0KKzxjb3VudD46OgorCUJ5IGRlZmF1bHQgdGhlIGNvbW1hbmQgc2hvd3MgYWxsIHJlZnMgdGhhdCBtYXRjaAorCWA8cGF0dGVybj5gLiAgVGhpcyBvcHRpb24gbWFrZXMgaXQgc3RvcCBhZnRlciBzaG93aW5nCisJdGhhdCBtYW55IHJlZnMuCisKKzxrZXk+OjoKKwlBIGZpZWxkIG5hbWUgdG8gc29ydCBvbi4gIFByZWZpeCBgLWAgdG8gc29ydCBpbgorCWRlc2NlbmRpbmcgb3JkZXIgb2YgdGhlIHZhbHVlLiAgV2hlbiB1bnNwZWNpZmllZCwKKwlgcmVmbmFtZWAgaXMgdXNlZC4gIE1vcmUgdGhhbiBvbmUgc29ydCBrZXlzIGNhbiBiZQorCWdpdmVuLgorCis8Zm9ybWF0Pjo6CisJQSBzdHJpbmcgdGhhdCBpbnRlcnBvbGF0ZXMgYCUoZmllbGRuYW1lKWAgZnJvbSB0aGUKKwlvYmplY3QgcG9pbnRlZCBhdCBieSBhIHJlZiBiZWluZyBzaG93bi4gIElmIGBmaWVsZG5hbWVgCisJaXMgcHJlZml4ZWQgd2l0aCBhbiBhc3RlcmlzayAoYCpgKSBhbmQgdGhlIHJlZiBwb2ludHMKKwlhdCBhIHRhZyBvYmplY3QsIHRoZSB2YWx1ZSBmb3IgdGhlIGZpZWxkIGluIHRoZSBvYmplY3QKKwl0YWcgcmVmZXJzIGlzIHVzZWQuICBXaGVuIHVuc3BlY2lmaWVkLCBkZWZhdWx0cyB0bworCWAlKG9iamVjdG5hbWUpIFNQQyAlKG9iamVjdHR5cGUpIFRBQiAlKHJlZm5hbWUpYC4KKwlJdCBhbHNvIGludGVycG9sYXRlcyBgJSVgIHRvIGAlYCwgYW5kIGAleHhgIHdoZXJlIGB4eGAKKwlhcmUgaGV4IGRpZ2l0cyBpbnRlcnBvbGF0ZXMgdG8gY2hhcmFjdGVyIHdpdGggaGV4IGNvZGUKKwlgeHhgOyBmb3IgZXhhbXBsZSBgJTAwYCBpbnRlcnBvbGF0ZXMgdG8gYFwwYCAoTlVMKSwKKwlgJTA5YCB0byBgXHRgIChUQUIpIGFuZCBgJTBhYCB0byBgXG5gIChMRikuCisKKzxwYXR0ZXJuPjo6CisJSWYgZ2l2ZW4sIHRoZSBuYW1lIG9mIHRoZSByZWYgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoaXMKKwl1c2luZyBmbm1hdGNoKDMpLiAgUmVmcyB0aGF0IGRvIG5vdCBtYXRjaCB0aGUgcGF0dGVybgorCWFyZSBub3Qgc2hvd24uCisKKy0tc2hlbGwsIC0tcGVybCwgLS1weXRob24sIC0tdGNsOjoKKwlJZiBnaXZlbiwgc3RyaW5ncyB0aGF0IHN1YnN0aXR1dGUgYCUoZmllbGRuYW1lKWAKKwlwbGFjZWhvbGRlcnMgYXJlIHF1b3RlZCBhcyBzdHJpbmcgbGl0ZXJhbHMgc3VpdGFibGUgZm9yCisJdGhlIHNwZWNpZmllZCBob3N0IGxhbmd1YWdlLiAgVGhpcyBpcyBtZWFudCB0byBwcm9kdWNlCisJYSBzY3JpcHRsZXQgdGhhdCBjYW4gZGlyZWN0bHkgYmUgYGV2YWxgZWQuCisKKworRklFTEQgTkFNRVMKKy0tLS0tLS0tLS0tCisKK1ZhcmlvdXMgdmFsdWVzIGZyb20gc3RydWN0dXJlZCBmaWVsZHMgaW4gcmVmZXJlbmNlZCBvYmplY3RzIGNhbgorYmUgdXNlZCB0byBpbnRlcnBvbGF0ZSBpbnRvIHRoZSByZXN1bHRpbmcgb3V0cHV0LCBvciBhcyBzb3J0CitrZXlzLgorCitGb3IgYWxsIG9iamVjdHMsIHRoZSBmb2xsb3dpbmcgbmFtZXMgY2FuIGJlIHVzZWQ6CisKK3JlZm5hbWU6OgorCVRoZSBuYW1lIG9mIHRoZSByZWYgKHRoZSBwYXJ0IGFmdGVyICRHSVRfRElSLykuCisKK29iamVjdHR5cGU6OgorCVRoZSB0eXBlIG9mIHRoZSBvYmplY3QgKGBibG9iYCwgYHRyZWVgLCBgY29tbWl0YCwgYHRhZ2ApLgorCitvYmplY3RzaXplOjoKKwlUaGUgc2l6ZSBvZiB0aGUgb2JqZWN0ICh0aGUgc2FtZSBhcyBgZ2l0LWNhdC1maWxlIC1zYCByZXBvcnRzKS4KKworb2JqZWN0bmFtZTo6CisJVGhlIG9iamVjdCBuYW1lIChha2EgU0hBLTEpLgorCitJbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUsIGZvciBjb21taXQgYW5kIHRhZyBvYmplY3RzLCB0aGUgaGVhZGVyCitmaWVsZCBuYW1lcyAoYHRyZWVgLCBgcGFyZW50YCwgYG9iamVjdGAsIGB0eXBlYCwgYW5kIGB0YWdgKSBjYW4KK2JlIHVzZWQgdG8gc3BlY2lmeSB0aGUgdmFsdWUgaW4gdGhlIGhlYWRlciBmaWVsZC4KKworRmllbGRzIHRoYXQgaGF2ZSBuYW1lLWVtYWlsLWRhdGUgdHVwbGUgYXMgaXRzIHZhbHVlIChgYXV0aG9yYCwKK2Bjb21taXR0ZXJgLCBhbmQgYHRhZ2dlcmApIGNhbiBiZSBzdWZmaXhlZCB3aXRoIGBuYW1lYCwgYGVtYWlsYCwKK2FuZCBgZGF0ZWAgdG8gZXh0cmFjdCB0aGUgbmFtZWQgY29tcG9uZW50LgorCitUaGUgZmlyc3QgbGluZSBvZiB0aGUgbWVzc2FnZSBpbiBhIGNvbW1pdCBhbmQgdGFnIG9iamVjdCBpcworYHN1YmplY3RgLCB0aGUgcmVtYWluaW5nIGxpbmVzIGFyZSBgYm9keWAuICBUaGUgd2hvbGUgbWVzc2FnZQoraXMgYGNvbnRlbnRzYC4KKworRm9yIHNvcnRpbmcgcHVycG9zZXMsIGZpZWxkcyB3aXRoIG51bWVyaWMgdmFsdWVzIHNvcnQgaW4gbnVtZXJpYworb3JkZXIgKGBvYmplY3RzaXplYCwgYGF1dGhvcmRhdGVgLCBgY29tbWl0dGVyZGF0ZWAsIGB0YWdnZXJkYXRlYCkuCitBbGwgb3RoZXIgZmllbGRzIGFyZSB1c2VkIHRvIHNvcnQgaW4gdGhlaXIgYnl0ZS12YWx1ZSBvcmRlci4KKworSW4gYW55IGNhc2UsIGEgZmllbGQgbmFtZSB0aGF0IHJlZmVycyB0byBhIGZpZWxkIGluYXBwbGljYWJsZSB0bwordGhlIG9iamVjdCByZWZlcnJlZCBieSB0aGUgcmVmIGRvZXMgbm90IGNhdXNlIGFuIGVycm9yLiAgSXQKK3JldHVybnMgYW4gZW1wdHkgc3RyaW5nIGluc3RlYWQuCisKK0FzIGEgc3BlY2lhbCBjYXNlIGZvciB0aGUgZGF0ZS10eXBlIGZpZWxkcywgeW91IG1heSBzcGVjaWZ5IGEgZm9ybWF0IGZvcgordGhlIGRhdGUgYnkgYWRkaW5nIG9uZSBvZiBgOmRlZmF1bHRgLCBgOnJlbGF0aXZlYCwgYDpzaG9ydGAsIGA6bG9jYWxgLAorYDppc284NjAxYCBvciBgOnJmYzI4MjJgIHRvIHRoZSBlbmQgb2YgdGhlIGZpZWxkbmFtZTsgZS5nLgorYCUodGFnZ2VyZGF0ZTpyZWxhdGl2ZSlgLgorCisKK0VYQU1QTEVTCistLS0tLS0tLQorCitBbiBleGFtcGxlIGRpcmVjdGx5IHByb2R1Y2luZyBmb3JtYXR0ZWQgdGV4dC4gIFNob3cgdGhlIG1vc3QgcmVjZW50CiszIHRhZ2dlZCBjb21taXRzOjoKKworLS0tLS0tLS0tLS0tCisjIS9iaW4vc2gKKworZ2l0LWZvci1lYWNoLXJlZiAtLWNvdW50PTMgLS1zb3J0PSctKmF1dGhvcmRhdGUnIFwKKy0tZm9ybWF0PSdGcm9tOiAlKCphdXRob3JuYW1lKSAlKCphdXRob3JlbWFpbCkKK1N1YmplY3Q6ICUoKnN1YmplY3QpCitEYXRlOiAlKCphdXRob3JkYXRlKQorUmVmOiAlKCpyZWZuYW1lKQorCislKCpib2R5KQorJyAncmVmcy90YWdzJworLS0tLS0tLS0tLS0tCisKKworQSBzaW1wbGUgZXhhbXBsZSBzaG93aW5nIHRoZSB1c2Ugb2Ygc2hlbGwgZXZhbCBvbiB0aGUgb3V0cHV0LAorZGVtb25zdHJhdGluZyB0aGUgdXNlIG9mIC0tc2hlbGwuICBMaXN0IHRoZSBwcmVmaXhlcyBvZiBhbGwgaGVhZHM6OgorLS0tLS0tLS0tLS0tCisjIS9iaW4vc2gKKworZ2l0LWZvci1lYWNoLXJlZiAtLXNoZWxsIC0tZm9ybWF0PSJyZWY9JShyZWZuYW1lKSIgcmVmcy9oZWFkcyB8IFwKK3doaWxlIHJlYWQgZW50cnkKK2RvCisJZXZhbCAiJGVudHJ5IgorCWVjaG8gYGRpcm5hbWUgJHJlZmAKK2RvbmUKKy0tLS0tLS0tLS0tLQorCisKK0EgYml0IG1vcmUgZWxhYm9yYXRlIHJlcG9ydCBvbiB0YWdzLCBkZW1vbnN0cmF0aW5nIHRoYXQgdGhlIGZvcm1hdAorbWF5IGJlIGFuIGVudGlyZSBzY3JpcHQ6OgorLS0tLS0tLS0tLS0tCisjIS9iaW4vc2gKKworZm10PScKKwlyPSUocmVmbmFtZSkKKwl0PSUoKm9iamVjdHR5cGUpCisJVD0ke3IjcmVmcy90YWdzL30KKworCW89JSgqb2JqZWN0bmFtZSkKKwluPSUoKmF1dGhvcm5hbWUpCisJZT0lKCphdXRob3JlbWFpbCkKKwlzPSUoKnN1YmplY3QpCisJZD0lKCphdXRob3JkYXRlKQorCWI9JSgqYm9keSkKKworCWtpbmQ9VGFnCisJaWYgdGVzdCAieiR0IiA9IHoKKwl0aGVuCisJCSMgY291bGQgYmUgYSBsaWdodHdlaWdodCB0YWcKKwkJdD0lKG9iamVjdHR5cGUpCisJCWtpbmQ9IkxpZ2h0d2VpZ2h0IHRhZyIKKwkJbz0lKG9iamVjdG5hbWUpCisJCW49JShhdXRob3JuYW1lKQorCQllPSUoYXV0aG9yZW1haWwpCisJCXM9JShzdWJqZWN0KQorCQlkPSUoYXV0aG9yZGF0ZSkKKwkJYj0lKGJvZHkpCisJZmkKKwllY2hvICIka2luZCAkVCBwb2ludHMgYXQgYSAkdCBvYmplY3QgJG8iCisJaWYgdGVzdCAieiR0IiA9IHpjb21taXQKKwl0aGVuCisJCWVjaG8gIlRoZSBjb21taXQgd2FzIGF1dGhvcmVkIGJ5ICRuICRlCithdCAkZCwgYW5kIHRpdGxlZAorCisgICAgJHMKKworSXRzIG1lc3NhZ2UgcmVhZHMgYXM6CisiCisJCWVjaG8gIiRiIiB8IHNlZCAtZSAicy9eLyAgICAvIgorCQllY2hvCisJZmkKKycKKworZXZhbD1gZ2l0LWZvci1lYWNoLXJlZiAtLXNoZWxsIC0tZm9ybWF0PSIkZm10IiBcCisJLS1zb3J0PScqb2JqZWN0dHlwZScgXAorCS0tc29ydD0tdGFnZ2VyZGF0ZSBcCisJcmVmcy90YWdzYAorZXZhbCAiJGV2YWwiCistLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWZvcm1hdC1wYXRjaC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1mb3JtYXQtcGF0Y2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MjA3YjcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1mb3JtYXQtcGF0Y2gudHh0CkBAIC0wLDAgKzEsMjE5IEBACitnaXQtZm9ybWF0LXBhdGNoKDEpCis9PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1mb3JtYXQtcGF0Y2ggLSBQcmVwYXJlIHBhdGNoZXMgZm9yIGUtbWFpbCBzdWJtaXNzaW9uCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWZvcm1hdC1wYXRjaCcgWy1rXSBbLW8gPGRpcj4gfCAtLXN0ZG91dF0gWy0tdGhyZWFkXQorCQkgICBbLS1hdHRhY2hbPTxib3VuZGFyeT5dIHwgLS1pbmxpbmVbPTxib3VuZGFyeT5dXQorCQkgICBbLXMgfCAtLXNpZ25vZmZdIFs8Y29tbW9uIGRpZmYgb3B0aW9ucz5dCisJCSAgIFstbiB8IC0tbnVtYmVyZWQgfCAtTiB8IC0tbm8tbnVtYmVyZWRdCisJCSAgIFstLXN0YXJ0LW51bWJlciA8bj5dIFstLW51bWJlcmVkLWZpbGVzXQorCQkgICBbLS1pbi1yZXBseS10bz1NZXNzYWdlLUlkXSBbLS1zdWZmaXg9LjxzZng+XQorCQkgICBbLS1pZ25vcmUtaWYtaW4tdXBzdHJlYW1dCisJCSAgIFstLXN1YmplY3QtcHJlZml4PVN1YmplY3QtUHJlZml4XQorCQkgICBbLS1jYz08ZW1haWw+XQorCQkgICBbLS1jb3Zlci1sZXR0ZXJdCisJCSAgIFsgPHNpbmNlPiB8IDxyZXZpc2lvbiByYW5nZT4gXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworUHJlcGFyZSBlYWNoIGNvbW1pdCB3aXRoIGl0cyBwYXRjaCBpbgorb25lIGZpbGUgcGVyIGNvbW1pdCwgZm9ybWF0dGVkIHRvIHJlc2VtYmxlIFVOSVggbWFpbGJveCBmb3JtYXQuCitUaGUgb3V0cHV0IG9mIHRoaXMgY29tbWFuZCBpcyBjb252ZW5pZW50IGZvciBlLW1haWwgc3VibWlzc2lvbiBvcgorZm9yIHVzZSB3aXRoIGxpbmtnaXQ6Z2l0LWFtWzFdLgorCitUaGVyZSBhcmUgdHdvIHdheXMgdG8gc3BlY2lmeSB3aGljaCBjb21taXRzIHRvIG9wZXJhdGUgb24uCisKKzEuIEEgc2luZ2xlIGNvbW1pdCwgPHNpbmNlPiwgc3BlY2lmaWVzIHRoYXQgdGhlIGNvbW1pdHMgbGVhZGluZworICAgdG8gdGhlIHRpcCBvZiB0aGUgY3VycmVudCBicmFuY2ggdGhhdCBhcmUgbm90IGluIHRoZSBoaXN0b3J5CisgICB0aGF0IGxlYWRzIHRvIHRoZSA8c2luY2U+IHRvIGJlIG91dHB1dC4KKworMi4gR2VuZXJpYyA8cmV2aXNpb24gcmFuZ2U+IGV4cHJlc3Npb24gKHNlZSAiU1BFQ0lGWUlORworICAgUkVWSVNJT05TIiBzZWN0aW9uIGluIGxpbmtnaXQ6Z2l0LXJldi1wYXJzZVsxXSkgbWVhbnMgdGhlCisgICBjb21taXRzIGluIHRoZSBzcGVjaWZpZWQgcmFuZ2UuCisKK0Egc2luZ2xlIGNvbW1pdCwgd2hlbiBpbnRlcnByZXRlZCBhcyBhIDxyZXZpc2lvbiByYW5nZT4KK2V4cHJlc3Npb24sIG1lYW5zICJldmVyeXRoaW5nIHRoYXQgbGVhZHMgdG8gdGhhdCBjb21taXQiLCBidXQKK2lmIHlvdSB3cml0ZSAnZ2l0IGZvcm1hdC1wYXRjaCA8Y29tbWl0PicsIHRoZSBwcmV2aW91cyBydWxlCithcHBsaWVzIHRvIHRoYXQgY29tbWFuZCBsaW5lIGFuZCB5b3UgZG8gbm90IGdldCAiZXZlcnl0aGluZworc2luY2UgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGltZSIuICBJZiB5b3Ugd2FudCB0byBmb3JtYXQKK2V2ZXJ5dGhpbmcgc2luY2UgcHJvamVjdCBpbmNlcHRpb24gdG8gb25lIGNvbW1pdCwgc2F5ICJnaXQKK2Zvcm1hdC1wYXRjaCBcLS1yb290IDxjb21taXQ+IiB0byBtYWtlIGl0IGNsZWFyIHRoYXQgaXQgaXMgdGhlCitsYXR0ZXIgY2FzZS4KKworQnkgZGVmYXVsdCwgZWFjaCBvdXRwdXQgZmlsZSBpcyBudW1iZXJlZCBzZXF1ZW50aWFsbHkgZnJvbSAxLCBhbmQgdXNlcyB0aGUKK2ZpcnN0IGxpbmUgb2YgdGhlIGNvbW1pdCBtZXNzYWdlIChtYXNzYWdlZCBmb3IgcGF0aG5hbWUgc2FmZXR5KSBhcwordGhlIGZpbGVuYW1lLiBXaXRoIHRoZSAtLW51bWJlcmVkLWZpbGVzIG9wdGlvbiwgdGhlIG91dHB1dCBmaWxlIG5hbWVzCit3aWxsIG9ubHkgYmUgbnVtYmVycywgd2l0aG91dCB0aGUgZmlyc3QgbGluZSBvZiB0aGUgY29tbWl0IGFwcGVuZGVkLgorVGhlIG5hbWVzIG9mIHRoZSBvdXRwdXQgZmlsZXMgYXJlIHByaW50ZWQgdG8gc3RhbmRhcmQKK291dHB1dCwgdW5sZXNzIHRoZSAtLXN0ZG91dCBvcHRpb24gaXMgc3BlY2lmaWVkLgorCitJZiAtbyBpcyBzcGVjaWZpZWQsIG91dHB1dCBmaWxlcyBhcmUgY3JlYXRlZCBpbiA8ZGlyPi4gIE90aGVyd2lzZQordGhleSBhcmUgY3JlYXRlZCBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KKworSWYgLW4gaXMgc3BlY2lmaWVkLCBpbnN0ZWFkIG9mICJbUEFUQ0hdIFN1YmplY3QiLCB0aGUgZmlyc3QgbGluZQoraXMgZm9ybWF0dGVkIGFzICJbUEFUQ0ggbi9tXSBTdWJqZWN0Ii4KKworSWYgZ2l2ZW4gLS10aHJlYWQsIGdpdC1mb3JtYXQtcGF0Y2ggd2lsbCBnZW5lcmF0ZSBJbi1SZXBseS1UbyBhbmQKK1JlZmVyZW5jZXMgaGVhZGVycyB0byBtYWtlIHRoZSBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgcGF0Y2ggbWFpbHMgYXBwZWFyCithcyByZXBsaWVzIHRvIHRoZSBmaXJzdCBtYWlsOyB0aGlzIGFsc28gZ2VuZXJhdGVzIGEgTWVzc2FnZS1JZCBoZWFkZXIgdG8KK3JlZmVyZW5jZS4KKworT1BUSU9OUworLS0tLS0tLQorOmdpdC1mb3JtYXQtcGF0Y2g6IDEKK2luY2x1ZGU6OmRpZmYtb3B0aW9ucy50eHRbXQorCistPG4+OjoKKwlMaW1pdHMgdGhlIG51bWJlciBvZiBwYXRjaGVzIHRvIHByZXBhcmUuCisKKy1vfC0tb3V0cHV0LWRpcmVjdG9yeSA8ZGlyPjo6CisJVXNlIDxkaXI+IHRvIHN0b3JlIHRoZSByZXN1bHRpbmcgZmlsZXMsIGluc3RlYWQgb2YgdGhlCisJY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KKworLW58LS1udW1iZXJlZDo6CisJTmFtZSBvdXRwdXQgaW4gJ1tQQVRDSCBuL21dJyBmb3JtYXQuCisKKy1OfC0tbm8tbnVtYmVyZWQ6OgorCU5hbWUgb3V0cHV0IGluICdbUEFUQ0hdJyBmb3JtYXQuCisKKy0tc3RhcnQtbnVtYmVyIDxuPjo6CisJU3RhcnQgbnVtYmVyaW5nIHRoZSBwYXRjaGVzIGF0IDxuPiBpbnN0ZWFkIG9mIDEuCisKKy0tbnVtYmVyZWQtZmlsZXM6OgorCU91dHB1dCBmaWxlIG5hbWVzIHdpbGwgYmUgYSBzaW1wbGUgbnVtYmVyIHNlcXVlbmNlCisJd2l0aG91dCB0aGUgZGVmYXVsdCBmaXJzdCBsaW5lIG9mIHRoZSBjb21taXQgYXBwZW5kZWQuCisJTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlIC0tc3Rkb3V0IG9wdGlvbi4KKworLWt8LS1rZWVwLXN1YmplY3Q6OgorCURvIG5vdCBzdHJpcC9hZGQgJ1tQQVRDSF0nIGZyb20gdGhlIGZpcnN0IGxpbmUgb2YgdGhlCisJY29tbWl0IGxvZyBtZXNzYWdlLgorCistc3wtLXNpZ25vZmY6OgorCUFkZCBgU2lnbmVkLW9mZi1ieTpgIGxpbmUgdG8gdGhlIGNvbW1pdCBtZXNzYWdlLCB1c2luZworCXRoZSBjb21taXR0ZXIgaWRlbnRpdHkgb2YgeW91cnNlbGYuCisKKy0tc3Rkb3V0OjoKKwlQcmludCBhbGwgY29tbWl0cyB0byB0aGUgc3RhbmRhcmQgb3V0cHV0IGluIG1ib3ggZm9ybWF0LAorCWluc3RlYWQgb2YgY3JlYXRpbmcgYSBmaWxlIGZvciBlYWNoIG9uZS4KKworLS1hdHRhY2hbPTxib3VuZGFyeT5dOjoKKwlDcmVhdGUgbXVsdGlwYXJ0L21peGVkIGF0dGFjaG1lbnQsIHRoZSBmaXJzdCBwYXJ0IG9mCisJd2hpY2ggaXMgdGhlIGNvbW1pdCBtZXNzYWdlIGFuZCB0aGUgcGF0Y2ggaXRzZWxmIGluIHRoZQorCXNlY29uZCBwYXJ0LCB3aXRoICJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50Ii4KKworLS1pbmxpbmVbPTxib3VuZGFyeT5dOjoKKwlDcmVhdGUgbXVsdGlwYXJ0L21peGVkIGF0dGFjaG1lbnQsIHRoZSBmaXJzdCBwYXJ0IG9mCisJd2hpY2ggaXMgdGhlIGNvbW1pdCBtZXNzYWdlIGFuZCB0aGUgcGF0Y2ggaXRzZWxmIGluIHRoZQorCXNlY29uZCBwYXJ0LCB3aXRoICJDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmUiLgorCistLXRocmVhZDo6CisJQWRkIEluLVJlcGx5LVRvIGFuZCBSZWZlcmVuY2VzIGhlYWRlcnMgdG8gbWFrZSB0aGUgc2Vjb25kIGFuZAorCXN1YnNlcXVlbnQgbWFpbHMgYXBwZWFyIGFzIHJlcGxpZXMgdG8gdGhlIGZpcnN0LiAgQWxzbyBnZW5lcmF0ZXMKKwl0aGUgTWVzc2FnZS1JZCBoZWFkZXIgdG8gcmVmZXJlbmNlLgorCistLWluLXJlcGx5LXRvPU1lc3NhZ2UtSWQ6OgorCU1ha2UgdGhlIGZpcnN0IG1haWwgKG9yIGFsbCB0aGUgbWFpbHMgd2l0aCAtLW5vLXRocmVhZCkgYXBwZWFyIGFzIGEKKwlyZXBseSB0byB0aGUgZ2l2ZW4gTWVzc2FnZS1JZCwgd2hpY2ggYXZvaWRzIGJyZWFraW5nIHRocmVhZHMgdG8KKwlwcm92aWRlIGEgbmV3IHBhdGNoIHNlcmllcy4KKworLS1pZ25vcmUtaWYtaW4tdXBzdHJlYW06OgorCURvIG5vdCBpbmNsdWRlIGEgcGF0Y2ggdGhhdCBtYXRjaGVzIGEgY29tbWl0IGluCisJPHVudGlsPi4uPHNpbmNlPi4gIFRoaXMgd2lsbCBleGFtaW5lIGFsbCBwYXRjaGVzIHJlYWNoYWJsZQorCWZyb20gPHNpbmNlPiBidXQgbm90IGZyb20gPHVudGlsPiBhbmQgY29tcGFyZSB0aGVtIHdpdGggdGhlCisJcGF0Y2hlcyBiZWluZyBnZW5lcmF0ZWQsIGFuZCBhbnkgcGF0Y2ggdGhhdCBtYXRjaGVzIGlzCisJaWdub3JlZC4KKworLS1zdWJqZWN0LXByZWZpeD08U3ViamVjdC1QcmVmaXg+OjoKKwlJbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZCAnW1BBVENIXScgcHJlZml4IGluIHRoZSBzdWJqZWN0CisJbGluZSwgaW5zdGVhZCB1c2UgJ1s8U3ViamVjdC1QcmVmaXg+XScuIFRoaXMKKwlhbGxvd3MgZm9yIHVzZWZ1bCBuYW1pbmcgb2YgYSBwYXRjaCBzZXJpZXMsIGFuZCBjYW4gYmUKKwljb21iaW5lZCB3aXRoIHRoZSAtLW51bWJlcmVkIG9wdGlvbi4KKworLS1jYz08ZW1haWw+OjoKKwlBZGQgYSAiQ2M6IiBoZWFkZXIgdG8gdGhlIGVtYWlsIGhlYWRlcnMuIFRoaXMgaXMgaW4gYWRkaXRpb24KKwl0byBhbnkgY29uZmlndXJlZCBoZWFkZXJzLCBhbmQgbWF5IGJlIHVzZWQgbXVsdGlwbGUgdGltZXMuCisKKy0tY292ZXItbGV0dGVyOjoKKwlHZW5lcmF0ZSBhIGNvdmVyIGxldHRlciB0ZW1wbGF0ZS4gIFlvdSBzdGlsbCBoYXZlIHRvIGZpbGwgaW4KKwlhIGRlc2NyaXB0aW9uLCBidXQgdGhlIHNob3J0bG9nIGFuZCB0aGUgZGlmZnN0YXQgd2lsbCBiZQorCWdlbmVyYXRlZCBmb3IgeW91LgorCistLXN1ZmZpeD0uPHNmeD46OgorCUluc3RlYWQgb2YgdXNpbmcgYC5wYXRjaGAgYXMgdGhlIHN1ZmZpeCBmb3IgZ2VuZXJhdGVkCisJZmlsZW5hbWVzLCB1c2Ugc3BlY2lmaWVkIHN1ZmZpeC4gIEEgY29tbW9uIGFsdGVybmF0aXZlIGlzCisJYC0tc3VmZml4PS50eHRgLgorKworTm90ZSB0aGF0IHlvdSB3b3VsZCBuZWVkIHRvIGluY2x1ZGUgdGhlIGxlYWRpbmcgZG90IGAuYCBpZiB5b3UKK3dhbnQgYSBmaWxlbmFtZSBsaWtlIGAwMDAxLWRlc2NyaXB0aW9uLW9mLW15LWNoYW5nZS5wYXRjaGAsIGFuZAordGhlIGZpcnN0IGxldHRlciBkb2VzIG5vdCBoYXZlIHRvIGJlIGEgZG90LiAgTGVhdmluZyBpdCBlbXB0eSB3b3VsZAorbm90IGFkZCBhbnkgc3VmZml4LgorCitDT05GSUdVUkFUSU9OCistLS0tLS0tLS0tLS0tCitZb3UgY2FuIHNwZWNpZnkgZXh0cmEgbWFpbCBoZWFkZXIgbGluZXMgdG8gYmUgYWRkZWQgdG8gZWFjaCBtZXNzYWdlCitpbiB0aGUgcmVwb3NpdG9yeSBjb25maWd1cmF0aW9uLCBuZXcgZGVmYXVsdHMgZm9yIHRoZSBzdWJqZWN0IHByZWZpeAorYW5kIGZpbGUgc3VmZml4LCBhbmQgbnVtYmVyIHBhdGNoZXMgd2hlbiBvdXRwdXR0aW5nIG1vcmUgdGhhbiBvbmUuCisKKy0tLS0tLS0tLS0tLQorW2Zvcm1hdF0KKyAgICAgICAgaGVhZGVycyA9ICJPcmdhbml6YXRpb246IGdpdC1mb29cbiIKKyAgICAgICAgc3ViamVjdHByZWZpeCA9IENIQU5HRQorICAgICAgICBzdWZmaXggPSAudHh0CisgICAgICAgIG51bWJlcmVkID0gYXV0bworLS0tLS0tLS0tLS0tCisKKworRVhBTVBMRVMKKy0tLS0tLS0tCisKK2dpdC1mb3JtYXQtcGF0Y2ggLWsgLS1zdGRvdXQgUjEuLlIyIHwgZ2l0LWFtIC0zIC1rOjoKKwlFeHRyYWN0IGNvbW1pdHMgYmV0d2VlbiByZXZpc2lvbnMgUjEgYW5kIFIyLCBhbmQgYXBwbHkKKwl0aGVtIG9uIHRvcCBvZiB0aGUgY3VycmVudCBicmFuY2ggdXNpbmcgYGdpdC1hbWAgdG8KKwljaGVycnktcGljayB0aGVtLgorCitnaXQtZm9ybWF0LXBhdGNoIG9yaWdpbjo6CisJRXh0cmFjdCBhbGwgY29tbWl0cyB3aGljaCBhcmUgaW4gdGhlIGN1cnJlbnQgYnJhbmNoIGJ1dAorCW5vdCBpbiB0aGUgb3JpZ2luIGJyYW5jaC4gIEZvciBlYWNoIGNvbW1pdCBhIHNlcGFyYXRlIGZpbGUKKwlpcyBjcmVhdGVkIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKworZ2l0LWZvcm1hdC1wYXRjaCBcLS1yb290IG9yaWdpbjo6CisJRXh0cmFjdCBhbGwgY29tbWl0cyB0aGF0IGxlYWQgdG8gJ29yaWdpbicgc2luY2UgdGhlCisJaW5jZXB0aW9uIG9mIHRoZSBwcm9qZWN0LgorCitnaXQtZm9ybWF0LXBhdGNoIC1NIC1CIG9yaWdpbjo6CisJVGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIG9uZS4gIEFkZGl0aW9uYWxseSwgaXQgZGV0ZWN0cworCWFuZCBoYW5kbGVzIHJlbmFtZXMgYW5kIGNvbXBsZXRlIHJld3JpdGVzIGludGVsbGlnZW50bHkgdG8KKwlwcm9kdWNlIGEgcmVuYW1pbmcgcGF0Y2guICBBIHJlbmFtaW5nIHBhdGNoIHJlZHVjZXMgdGhlCisJYW1vdW50IG9mIHRleHQgb3V0cHV0LCBhbmQgZ2VuZXJhbGx5IG1ha2VzIGl0IGVhc2llciB0bworCXJldmlldyBpdC4gIE5vdGUgdGhhdCB0aGUgInBhdGNoIiBwcm9ncmFtIGRvZXMgbm90CisJdW5kZXJzdGFuZCByZW5hbWluZyBwYXRjaGVzLCBzbyB1c2UgaXQgb25seSB3aGVuIHlvdSBrbm93CisJdGhlIHJlY2lwaWVudCB1c2VzIGdpdCB0byBhcHBseSB5b3VyIHBhdGNoLgorCitnaXQtZm9ybWF0LXBhdGNoIC0zOjoKKwlFeHRyYWN0IHRocmVlIHRvcG1vc3QgY29tbWl0cyBmcm9tIHRoZSBjdXJyZW50IGJyYW5jaAorCWFuZCBmb3JtYXQgdGhlbSBhcyBlLW1haWxhYmxlIHBhdGNoZXMuCisKK1NlZSBBbHNvCistLS0tLS0tLQorbGlua2dpdDpnaXQtYW1bMV0sIGxpbmtnaXQ6Z2l0LXNlbmQtZW1haWxbMV0KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWZzY2stb2JqZWN0cy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1mc2NrLW9iamVjdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlOWY3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1mc2NrLW9iamVjdHMudHh0CkBAIC0wLDAgKzEsMTcgQEAKK2dpdC1mc2NrLW9iamVjdHMoMSkKKz09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWZzY2stb2JqZWN0cyAtIFZlcmlmaWVzIHRoZSBjb25uZWN0aXZpdHkgYW5kIHZhbGlkaXR5IG9mIHRoZSBvYmplY3RzIGluIHRoZSBkYXRhYmFzZQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1mc2NrLW9iamVjdHMnIC4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworVGhpcyBpcyBhIHN5bm9ueW0gZm9yIGxpbmtnaXQ6Z2l0LWZzY2tbMV0uICBQbGVhc2UgcmVmZXIgdG8gdGhlCitkb2N1bWVudGF0aW9uIG9mIHRoYXQgY29tbWFuZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWZzY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZnNjay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE2Y2I5OAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWZzY2sudHh0CkBAIC0wLDAgKzEsMTUzIEBACitnaXQtZnNjaygxKQorPT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWZzY2sgLSBWZXJpZmllcyB0aGUgY29ubmVjdGl2aXR5IGFuZCB2YWxpZGl0eSBvZiB0aGUgb2JqZWN0cyBpbiB0aGUgZGF0YWJhc2UKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtZnNjaycgWy0tdGFnc10gWy0tcm9vdF0gWy0tdW5yZWFjaGFibGVdIFstLWNhY2hlXSBbLS1uby1yZWZsb2dzXQorCSBbLS1mdWxsXSBbLS1zdHJpY3RdIFstLXZlcmJvc2VdIFstLWxvc3QtZm91bmRdIFs8b2JqZWN0PipdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVmVyaWZpZXMgdGhlIGNvbm5lY3Rpdml0eSBhbmQgdmFsaWRpdHkgb2YgdGhlIG9iamVjdHMgaW4gdGhlIGRhdGFiYXNlLgorCitPUFRJT05TCistLS0tLS0tCis8b2JqZWN0Pjo6CisJQW4gb2JqZWN0IHRvIHRyZWF0IGFzIHRoZSBoZWFkIG9mIGFuIHVucmVhY2hhYmlsaXR5IHRyYWNlLgorKworSWYgbm8gb2JqZWN0cyBhcmUgZ2l2ZW4sIGdpdC1mc2NrIGRlZmF1bHRzIHRvIHVzaW5nIHRoZQoraW5kZXggZmlsZSBhbmQgYWxsIFNIQTEgcmVmZXJlbmNlcyBpbiAuZ2l0L3JlZnMvKiBhcyBoZWFkcy4KKworLS11bnJlYWNoYWJsZTo6CisJUHJpbnQgb3V0IG9iamVjdHMgdGhhdCBleGlzdCBidXQgdGhhdCBhcmVuJ3QgcmVhZGFibGUgZnJvbSBhbnkKKwlvZiB0aGUgcmVmZXJlbmNlIG5vZGVzLgorCistLXJvb3Q6OgorCVJlcG9ydCByb290IG5vZGVzLgorCistLXRhZ3M6OgorCVJlcG9ydCB0YWdzLgorCistLWNhY2hlOjoKKwlDb25zaWRlciBhbnkgb2JqZWN0IHJlY29yZGVkIGluIHRoZSBpbmRleCBhbHNvIGFzIGEgaGVhZCBub2RlIGZvcgorCWFuIHVucmVhY2hhYmlsaXR5IHRyYWNlLgorCistLW5vLXJlZmxvZ3M6OgorCURvIG5vdCBjb25zaWRlciBjb21taXRzIHRoYXQgYXJlIHJlZmVyZW5jZWQgb25seSBieSBhbgorCWVudHJ5IGluIGEgcmVmbG9nIHRvIGJlIHJlYWNoYWJsZS4gIFRoaXMgb3B0aW9uIGlzIG1lYW50CisJb25seSB0byBzZWFyY2ggZm9yIGNvbW1pdHMgdGhhdCB1c2VkIHRvIGJlIGluIGEgcmVmLCBidXQKKwlub3cgYXJlbid0LCBidXQgYXJlIHN0aWxsIGluIHRoYXQgY29ycmVzcG9uZGluZyByZWZsb2cuCisKKy0tZnVsbDo6CisJQ2hlY2sgbm90IGp1c3Qgb2JqZWN0cyBpbiBHSVRfT0JKRUNUX0RJUkVDVE9SWQorCSgkR0lUX0RJUi9vYmplY3RzKSwgYnV0IGFsc28gdGhlIG9uZXMgZm91bmQgaW4gYWx0ZXJuYXRlCisJb2JqZWN0IHBvb2xzIGxpc3RlZCBpbiBHSVRfQUxURVJOQVRFX09CSkVDVF9ESVJFQ1RPUklFUworCW9yICRHSVRfRElSL29iamVjdHMvaW5mby9hbHRlcm5hdGVzLAorCWFuZCBpbiBwYWNrZWQgZ2l0IGFyY2hpdmVzIGZvdW5kIGluICRHSVRfRElSL29iamVjdHMvcGFjaworCWFuZCBjb3JyZXNwb25kaW5nIHBhY2sgc3ViZGlyZWN0b3JpZXMgaW4gYWx0ZXJuYXRlCisJb2JqZWN0IHBvb2xzLgorCistLXN0cmljdDo6CisJRW5hYmxlIG1vcmUgc3RyaWN0IGNoZWNraW5nLCBuYW1lbHkgdG8gY2F0Y2ggYSBmaWxlIG1vZGUKKwlyZWNvcmRlZCB3aXRoIGcrdyBiaXQgc2V0LCB3aGljaCB3YXMgY3JlYXRlZCBieSBvbGRlcgorCXZlcnNpb25zIG9mIGdpdC4gIEV4aXN0aW5nIHJlcG9zaXRvcmllcywgaW5jbHVkaW5nIHRoZQorCUxpbnV4IGtlcm5lbCwgZ2l0IGl0c2VsZiwgYW5kIHNwYXJzZSByZXBvc2l0b3J5IGhhdmUgb2xkCisJb2JqZWN0cyB0aGF0IHRyaWdnZXJzIHRoaXMgY2hlY2ssIGJ1dCBpdCBpcyByZWNvbW1lbmRlZAorCXRvIGNoZWNrIG5ldyBwcm9qZWN0cyB3aXRoIHRoaXMgZmxhZy4KKworLS12ZXJib3NlOjoKKwlCZSBjaGF0dHkuCisKKy0tbG9zdC1mb3VuZDo6CisJV3JpdGUgZGFuZ2xpbmcgb2JqZWN0cyBpbnRvIC5naXQvbG9zdC1mb3VuZC9jb21taXQvIG9yCisJLmdpdC9sb3N0LWZvdW5kL290aGVyLywgZGVwZW5kaW5nIG9uIHR5cGUuICBJZiB0aGUgb2JqZWN0IGlzCisJYSBibG9iLCB0aGUgY29udGVudHMgYXJlIHdyaXR0ZW4gaW50byB0aGUgZmlsZSwgcmF0aGVyIHRoYW4KKwlpdHMgb2JqZWN0IG5hbWUuCisKK0l0IHRlc3RzIFNIQTEgYW5kIGdlbmVyYWwgb2JqZWN0IHNhbml0eSwgYW5kIGl0IGRvZXMgZnVsbCB0cmFja2luZyBvZgordGhlIHJlc3VsdGluZyByZWFjaGFiaWxpdHkgYW5kIGV2ZXJ5dGhpbmcgZWxzZS4gSXQgcHJpbnRzIG91dCBhbnkKK2NvcnJ1cHRpb24gaXQgZmluZHMgKG1pc3Npbmcgb3IgYmFkIG9iamVjdHMpLCBhbmQgaWYgeW91IHVzZSB0aGUKKyctLXVucmVhY2hhYmxlJyBmbGFnIGl0IHdpbGwgYWxzbyBwcmludCBvdXQgb2JqZWN0cyB0aGF0IGV4aXN0IGJ1dAordGhhdCBhcmVuJ3QgcmVhZGFibGUgZnJvbSBhbnkgb2YgdGhlIHNwZWNpZmllZCBoZWFkIG5vZGVzLgorCitTbyBmb3IgZXhhbXBsZQorCisJZ2l0LWZzY2sgLS11bnJlYWNoYWJsZSBIRUFEICQoY2F0IC5naXQvcmVmcy9oZWFkcy8qKQorCit3aWxsIGRvIHF1aXRlIGEgX2xvdF8gb2YgdmVyaWZpY2F0aW9uIG9uIHRoZSB0cmVlLiBUaGVyZSBhcmUgYSBmZXcKK2V4dHJhIHZhbGlkaXR5IHRlc3RzIHRvIGJlIGFkZGVkIChtYWtlIHN1cmUgdGhhdCB0cmVlIG9iamVjdHMgYXJlCitzb3J0ZWQgcHJvcGVybHkgZXRjKSwgYnV0IG9uIHRoZSB3aG9sZSBpZiAiZ2l0LWZzY2siIGlzIGhhcHB5LCB5b3UKK2RvIGhhdmUgYSB2YWxpZCB0cmVlLgorCitBbnkgY29ycnVwdCBvYmplY3RzIHlvdSB3aWxsIGhhdmUgdG8gZmluZCBpbiBiYWNrdXBzIG9yIG90aGVyIGFyY2hpdmVzCisoaS5lLiwgeW91IGNhbiBqdXN0IHJlbW92ZSB0aGVtIGFuZCBkbyBhbiAicnN5bmMiIHdpdGggc29tZSBvdGhlciBzaXRlIGluCit0aGUgaG9wZXMgdGhhdCBzb21lYm9keSBlbHNlIGhhcyB0aGUgb2JqZWN0IHlvdSBoYXZlIGNvcnJ1cHRlZCkuCisKK09mIGNvdXJzZSwgInZhbGlkIHRyZWUiIGRvZXNuJ3QgbWVhbiB0aGF0IGl0IHdhc24ndCBnZW5lcmF0ZWQgYnkgc29tZQorZXZpbCBwZXJzb24sIGFuZCB0aGUgZW5kIHJlc3VsdCBtaWdodCBiZSBjcmFwLiBnaXQgaXMgYSByZXZpc2lvbgordHJhY2tpbmcgc3lzdGVtLCBub3QgYSBxdWFsaXR5IGFzc3VyYW5jZSBzeXN0ZW0gOykKKworRXh0cmFjdGVkIERpYWdub3N0aWNzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZXhwZWN0IGRhbmdsaW5nIGNvbW1pdHMgLSBwb3RlbnRpYWwgaGVhZHMgLSBkdWUgdG8gbGFjayBvZiBoZWFkIGluZm9ybWF0aW9uOjoKKwlZb3UgaGF2ZW4ndCBzcGVjaWZpZWQgYW55IG5vZGVzIGFzIGhlYWRzIHNvIGl0IHdvbid0IGJlCisJcG9zc2libGUgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHVuLXBhcmVudGVkIGNvbW1pdHMgYW5kCisJcm9vdCBub2Rlcy4KKworbWlzc2luZyBzaGExIGRpcmVjdG9yeSAnPGRpcj4nOjoKKwlUaGUgZGlyZWN0b3J5IGhvbGRpbmcgdGhlIHNoYTEgb2JqZWN0cyBpcyBtaXNzaW5nLgorCit1bnJlYWNoYWJsZSA8dHlwZT4gPG9iamVjdD46OgorCVRoZSA8dHlwZT4gb2JqZWN0IDxvYmplY3Q+LCBpc24ndCBhY3R1YWxseSByZWZlcnJlZCB0byBkaXJlY3RseQorCW9yIGluZGlyZWN0bHkgaW4gYW55IG9mIHRoZSB0cmVlcyBvciBjb21taXRzIHNlZW4uIFRoaXMgY2FuCisJbWVhbiB0aGF0IHRoZXJlJ3MgYW5vdGhlciByb290IG5vZGUgdGhhdCB5b3UncmUgbm90IHNwZWNpZnlpbmcKKwlvciB0aGF0IHRoZSB0cmVlIGlzIGNvcnJ1cHQuIElmIHlvdSBoYXZlbid0IG1pc3NlZCBhIHJvb3Qgbm9kZQorCXRoZW4geW91IG1pZ2h0IGFzIHdlbGwgZGVsZXRlIHVucmVhY2hhYmxlIG5vZGVzIHNpbmNlIHRoZXkKKwljYW4ndCBiZSB1c2VkLgorCittaXNzaW5nIDx0eXBlPiA8b2JqZWN0Pjo6CisJVGhlIDx0eXBlPiBvYmplY3QgPG9iamVjdD4sIGlzIHJlZmVycmVkIHRvIGJ1dCBpc24ndCBwcmVzZW50IGluCisJdGhlIGRhdGFiYXNlLgorCitkYW5nbGluZyA8dHlwZT4gPG9iamVjdD46OgorCVRoZSA8dHlwZT4gb2JqZWN0IDxvYmplY3Q+LCBpcyBwcmVzZW50IGluIHRoZSBkYXRhYmFzZSBidXQgbmV2ZXIKKwknZGlyZWN0bHknIHVzZWQuIEEgZGFuZ2xpbmcgY29tbWl0IGNvdWxkIGJlIGEgcm9vdCBub2RlLgorCit3YXJuaW5nOiBnaXQtZnNjazogdHJlZSA8dHJlZT4gaGFzIGZ1bGwgcGF0aG5hbWVzIGluIGl0OjoKKwlBbmQgaXQgc2hvdWxkbid0Li4uCisKK3NoYTEgbWlzbWF0Y2ggPG9iamVjdD46OgorCVRoZSBkYXRhYmFzZSBoYXMgYW4gb2JqZWN0IHdobydzIHNoYTEgZG9lc24ndCBtYXRjaCB0aGUKKwlkYXRhYmFzZSB2YWx1ZS4KKwlUaGlzIGluZGljYXRlcyBhIHNlcmlvdXMgZGF0YSBpbnRlZ3JpdHkgcHJvYmxlbS4KKworRW52aXJvbm1lbnQgVmFyaWFibGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworR0lUX09CSkVDVF9ESVJFQ1RPUlk6OgorCXVzZWQgdG8gc3BlY2lmeSB0aGUgb2JqZWN0IGRhdGFiYXNlIHJvb3QgKHVzdWFsbHkgJEdJVF9ESVIvb2JqZWN0cykKKworR0lUX0lOREVYX0ZJTEU6OgorCXVzZWQgdG8gc3BlY2lmeSB0aGUgaW5kZXggZmlsZSBvZiB0aGUgaW5kZXgKKworR0lUX0FMVEVSTkFURV9PQkpFQ1RfRElSRUNUT1JJRVM6OgorCXVzZWQgdG8gc3BlY2lmeSBhZGRpdGlvbmFsIG9iamVjdCBkYXRhYmFzZSByb290cyAodXN1YWxseSB1bnNldCkKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1nYy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1nYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQyNGE0ZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWdjLnR4dApAQCAtMCwwICsxLDEyMCBAQAorZ2l0LWdjKDEpCis9PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWdjIC0gQ2xlYW51cCB1bm5lY2Vzc2FyeSBmaWxlcyBhbmQgb3B0aW1pemUgdGhlIGxvY2FsIHJlcG9zaXRvcnkKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtZ2MnIFstLWFnZ3Jlc3NpdmVdIFstLWF1dG9dIFstLXF1aWV0XQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1J1bnMgYSBudW1iZXIgb2YgaG91c2VrZWVwaW5nIHRhc2tzIHdpdGhpbiB0aGUgY3VycmVudCByZXBvc2l0b3J5LAorc3VjaCBhcyBjb21wcmVzc2luZyBmaWxlIHJldmlzaW9ucyAodG8gcmVkdWNlIGRpc2sgc3BhY2UgYW5kIGluY3JlYXNlCitwZXJmb3JtYW5jZSkgYW5kIHJlbW92aW5nIHVucmVhY2hhYmxlIG9iamVjdHMgd2hpY2ggbWF5IGhhdmUgYmVlbgorY3JlYXRlZCBmcm9tIHByaW9yIGludm9jYXRpb25zIG9mIGxpbmtnaXQ6Z2l0LWFkZFsxXS4KKworVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gcnVuIHRoaXMgdGFzayBvbiBhIHJlZ3VsYXIgYmFzaXMgd2l0aGluCitlYWNoIHJlcG9zaXRvcnkgdG8gbWFpbnRhaW4gZ29vZCBkaXNrIHNwYWNlIHV0aWxpemF0aW9uIGFuZCBnb29kCitvcGVyYXRpbmcgcGVyZm9ybWFuY2UuCisKK1NvbWUgZ2l0IGNvbW1hbmRzIG1heSBhdXRvbWF0aWNhbGx5IHJ1biBgZ2l0LWdjYDsgc2VlIHRoZSBgLS1hdXRvYCBmbGFnCitiZWxvdyBmb3IgZGV0YWlscy4gSWYgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcgYW5kIGFsbCB5b3Ugd2FudCBpcyB0bworZGlzYWJsZSB0aGlzIGJlaGF2aW9yIHBlcm1hbmVudGx5IHdpdGhvdXQgZnVydGhlciBjb25zaWRlcmF0aW9ucywganVzdCBkbzoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY29uZmlnIC0tZ2xvYmFsIGdjLmF1dG8gMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitPUFRJT05TCistLS0tLS0tCisKKy0tYWdncmVzc2l2ZTo6CisJVXN1YWxseSAnZ2l0LWdjJyBydW5zIHZlcnkgcXVpY2tseSB3aGlsZSBwcm92aWRpbmcgZ29vZCBkaXNrCisJc3BhY2UgdXRpbGl6YXRpb24gYW5kIHBlcmZvcm1hbmNlLiAgVGhpcyBvcHRpb24gd2lsbCBjYXVzZQorCWdpdC1nYyB0byBtb3JlIGFnZ3Jlc3NpdmVseSBvcHRpbWl6ZSB0aGUgcmVwb3NpdG9yeSBhdCB0aGUgZXhwZW5zZQorCW9mIHRha2luZyBtdWNoIG1vcmUgdGltZS4gIFRoZSBlZmZlY3RzIG9mIHRoaXMgb3B0aW1pemF0aW9uIGFyZQorCXBlcnNpc3RlbnQsIHNvIHRoaXMgb3B0aW9uIG9ubHkgbmVlZHMgdG8gYmUgdXNlZCBvY2Nhc2lvbmFsbHk7IGV2ZXJ5CisJZmV3IGh1bmRyZWQgY2hhbmdlc2V0cyBvciBzby4KKworLS1hdXRvOjoKKwlXaXRoIHRoaXMgb3B0aW9uLCBgZ2l0IGdjYCBjaGVja3Mgd2hldGhlciBhbnkgaG91c2VrZWVwaW5nIGlzCisJcmVxdWlyZWQ7IGlmIG5vdCwgaXQgZXhpdHMgd2l0aG91dCBwZXJmb3JtaW5nIGFueSB3b3JrLgorCVNvbWUgZ2l0IGNvbW1hbmRzIHJ1biBgZ2l0IGdjIC0tYXV0b2AgYWZ0ZXIgcGVyZm9ybWluZworCW9wZXJhdGlvbnMgdGhhdCBjb3VsZCBjcmVhdGUgbWFueSBsb29zZSBvYmplY3RzLgorKworSG91c2VrZWVwaW5nIGlzIHJlcXVpcmVkIGlmIHRoZXJlIGFyZSB0b28gbWFueSBsb29zZSBvYmplY3RzIG9yCit0b28gbWFueSBwYWNrcyBpbiB0aGUgcmVwb3NpdG9yeS4gSWYgdGhlIG51bWJlciBvZiBsb29zZSBvYmplY3RzCitleGNlZWRzIHRoZSB2YWx1ZSBvZiB0aGUgYGdjLmF1dG9gIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUsIHRoZW4KK2FsbCBsb29zZSBvYmplY3RzIGFyZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIHBhY2sgdXNpbmcKK2BnaXQtcmVwYWNrIC1kIC1sYC4gIFNldHRpbmcgdGhlIHZhbHVlIG9mIGBnYy5hdXRvYCB0byAwCitkaXNhYmxlcyBhdXRvbWF0aWMgcGFja2luZyBvZiBsb29zZSBvYmplY3RzLgorKworSWYgdGhlIG51bWJlciBvZiBwYWNrcyBleGNlZWRzIHRoZSB2YWx1ZSBvZiBgZ2MuYXV0b3BhY2tsaW1pdGAsCit0aGVuIGV4aXN0aW5nIHBhY2tzIChleGNlcHQgdGhvc2UgbWFya2VkIHdpdGggYSBgLmtlZXBgIGZpbGUpCithcmUgY29uc29saWRhdGVkIGludG8gYSBzaW5nbGUgcGFjayBieSB1c2luZyB0aGUgYC1BYCBvcHRpb24gb2YKK2BnaXQtcmVwYWNrYC4gU2V0dGluZyBgZ2MuYXV0b3BhY2tsaW1pdGAgdG8gMCBkaXNhYmxlcworYXV0b21hdGljIGNvbnNvbGlkYXRpb24gb2YgcGFja3MuCisKKy0tcXVpZXQ6OgorCVN1cHByZXNzIGFsbCBwcm9ncmVzcyByZXBvcnRzLgorCitDb25maWd1cmF0aW9uCistLS0tLS0tLS0tLS0tCisKK1RoZSBvcHRpb25hbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlICdnYy5yZWZsb2dFeHBpcmUnIGNhbiBiZQorc2V0IHRvIGluZGljYXRlIGhvdyBsb25nIGhpc3RvcmljYWwgZW50cmllcyB3aXRoaW4gZWFjaCBicmFuY2gncworcmVmbG9nIHNob3VsZCByZW1haW4gYXZhaWxhYmxlIGluIHRoaXMgcmVwb3NpdG9yeS4gIFRoZSBzZXR0aW5nIGlzCitleHByZXNzZWQgYXMgYSBsZW5ndGggb2YgdGltZSwgZm9yIGV4YW1wbGUgJzkwIGRheXMnIG9yICczIG1vbnRocycuCitJdCBkZWZhdWx0cyB0byAnOTAgZGF5cycuCisKK1RoZSBvcHRpb25hbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlICdnYy5yZWZsb2dFeHBpcmVVbnJlYWNoYWJsZScKK2NhbiBiZSBzZXQgdG8gaW5kaWNhdGUgaG93IGxvbmcgaGlzdG9yaWNhbCByZWZsb2cgZW50cmllcyB3aGljaAorYXJlIG5vdCBwYXJ0IG9mIHRoZSBjdXJyZW50IGJyYW5jaCBzaG91bGQgcmVtYWluIGF2YWlsYWJsZSBpbgordGhpcyByZXBvc2l0b3J5LiAgVGhlc2UgdHlwZXMgb2YgZW50cmllcyBhcmUgZ2VuZXJhbGx5IGNyZWF0ZWQgYXMKK2EgcmVzdWx0IG9mIHVzaW5nIGBnaXQgY29tbWl0IFwtLWFtZW5kYCBvciBgZ2l0IHJlYmFzZWAgYW5kIGFyZSB0aGUKK2NvbW1pdHMgcHJpb3IgdG8gdGhlIGFtZW5kIG9yIHJlYmFzZSBvY2N1cnJpbmcuICBTaW5jZSB0aGVzZSBjaGFuZ2VzCithcmUgbm90IHBhcnQgb2YgdGhlIGN1cnJlbnQgcHJvamVjdCBtb3N0IHVzZXJzIHdpbGwgd2FudCB0byBleHBpcmUKK3RoZW0gc29vbmVyLiAgVGhpcyBvcHRpb24gZGVmYXVsdHMgdG8gJzMwIGRheXMnLgorCitUaGUgb3B0aW9uYWwgY29uZmlndXJhdGlvbiB2YXJpYWJsZSAnZ2MucmVyZXJlcmVzb2x2ZWQnIGluZGljYXRlcworaG93IGxvbmcgcmVjb3JkcyBvZiBjb25mbGljdGVkIG1lcmdlIHlvdSByZXNvbHZlZCBlYXJsaWVyIGFyZQora2VwdC4gIFRoaXMgZGVmYXVsdHMgdG8gNjAgZGF5cy4KKworVGhlIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgJ2djLnJlcmVyZXVucmVzb2x2ZWQnIGluZGljYXRlcworaG93IGxvbmcgcmVjb3JkcyBvZiBjb25mbGljdGVkIG1lcmdlIHlvdSBoYXZlIG5vdCByZXNvbHZlZCBhcmUKK2tlcHQuICBUaGlzIGRlZmF1bHRzIHRvIDE1IGRheXMuCisKK1RoZSBvcHRpb25hbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlICdnYy5wYWNrcmVmcycgZGV0ZXJtaW5lcyBpZgorYGdpdCBnY2AgcnVucyBgZ2l0LXBhY2stcmVmc2AuIFRoaXMgY2FuIGJlIHNldCB0byAibm9iYXJlIiB0byBlbmFibGUKK2l0IHdpdGhpbiBhbGwgbm9uLWJhcmUgcmVwb3Mgb3IgaXQgY2FuIGJlIHNldCB0byBhIGJvb2xlYW4gdmFsdWUuCitUaGlzIGRlZmF1bHRzIHRvIHRydWUuCisKK1RoZSBvcHRpb25hbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlICdnYy5hZ2dyZXNzaXZlV2luZG93JyBjb250cm9scyBob3cKK211Y2ggdGltZSBpcyBzcGVudCBvcHRpbWl6aW5nIHRoZSBkZWx0YSBjb21wcmVzc2lvbiBvZiB0aGUgb2JqZWN0cyBpbgordGhlIHJlcG9zaXRvcnkgd2hlbiB0aGUgLS1hZ2dyZXNzaXZlIG9wdGlvbiBpcyBzcGVjaWZpZWQuICBUaGUgbGFyZ2VyCit0aGUgdmFsdWUsIHRoZSBtb3JlIHRpbWUgaXMgc3BlbnQgb3B0aW1pemluZyB0aGUgZGVsdGEgY29tcHJlc3Npb24uICBTZWUKK3RoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgLS13aW5kb3cnIG9wdGlvbiBpbiBsaW5rZ2l0OmdpdC1yZXBhY2tbMV0gZm9yCittb3JlIGRldGFpbHMuICBUaGlzIGRlZmF1bHRzIHRvIDEwLgorCitUaGUgb3B0aW9uYWwgY29uZmlndXJhdGlvbiB2YXJpYWJsZSAnZ2MucHJ1bmVFeHBpcmUnIGNvbnRyb2xzIGhvdyBvbGQKK3RoZSB1bnJlZmVyZW5jZWQgbG9vc2Ugb2JqZWN0cyBoYXZlIHRvIGJlIGJlZm9yZSB0aGV5IGFyZSBwcnVuZWQuICBUaGUKK2RlZmF1bHQgaXMgIjIgd2Vla3MgYWdvIi4KKworU2VlIEFsc28KKy0tLS0tLS0tCitsaW5rZ2l0OmdpdC1wcnVuZVsxXQorbGlua2dpdDpnaXQtcmVmbG9nWzFdCitsaW5rZ2l0OmdpdC1yZXBhY2tbMV0KK2xpbmtnaXQ6Z2l0LXJlcmVyZVsxXQorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBTaGF3biBPLiBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+CisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtZ2V0LXRhci1jb21taXQtaWQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZ2V0LXRhci1jb21taXQtaWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYTQxNDkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1nZXQtdGFyLWNvbW1pdC1pZC50eHQKQEAgLTAsMCArMSwzNiBAQAorZ2l0LWdldC10YXItY29tbWl0LWlkKDEpCis9PT09PT09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWdldC10YXItY29tbWl0LWlkIC0gRXh0cmFjdCBjb21taXQgSUQgZnJvbSBhbiBhcmNoaXZlIGNyZWF0ZWQgdXNpbmcgZ2l0LWFyY2hpdmUKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtZ2V0LXRhci1jb21taXQtaWQnIDwgPHRhcmZpbGU+CisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitBY3RzIGFzIGEgZmlsdGVyLCBleHRyYWN0aW5nIHRoZSBjb21taXQgSUQgc3RvcmVkIGluIGFyY2hpdmVzIGNyZWF0ZWQgYnkKK2xpbmtnaXQ6Z2l0LWFyY2hpdmVbMV0uICBJdCByZWFkcyBvbmx5IHRoZSBmaXJzdCAxMDI0IGJ5dGVzIG9mIGlucHV0LCB0aHVzIGl0cworcnVudGltZSBpcyBub3QgaW5mbHVlbmNlZCBieSB0aGUgc2l6ZSBvZiA8dGFyZmlsZT4gdmVyeSBtdWNoLgorCitJZiBubyBjb21taXQgSUQgaXMgZm91bmQsIGdpdC1nZXQtdGFyLWNvbW1pdC1pZCBxdWlldGx5IGV4aXN0cyB3aXRoIGEKK3JldHVybiBjb2RlIG9mIDEuICBUaGlzIGNhbiBoYXBwZW4gaWYgPHRhcmZpbGU+IGhhZCBub3QgYmVlbiBjcmVhdGVkCit1c2luZyBnaXQtYXJjaGl2ZSBvciBpZiB0aGUgZmlyc3QgcGFyYW1ldGVyIG9mIGdpdC1hcmNoaXZlIGhhZCBiZWVuCithIHRyZWUgSUQgaW5zdGVhZCBvZiBhIGNvbW1pdCBJRCBvciB0YWcuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgUmVuZSBTY2hhcmZlIDxyZW5lLnNjaGFyZmVAbHNyZmlyZS5hdGguY3g+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWdyZXAudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZ3JlcC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk3ZjA1NQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWdyZXAudHh0CkBAIC0wLDAgKzEsMTQ4IEBACitnaXQtZ3JlcCgxKQorPT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWdyZXAgLSBQcmludCBsaW5lcyBtYXRjaGluZyBhIHBhdHRlcm4KKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtZ3JlcCcgWy0tY2FjaGVkXQorCSAgIFstYSB8IC0tdGV4dF0gWy1JXSBbLWkgfCAtLWlnbm9yZS1jYXNlXSBbLXcgfCAtLXdvcmQtcmVnZXhwXQorCSAgIFstdiB8IC0taW52ZXJ0LW1hdGNoXSBbLWh8LUhdIFstLWZ1bGwtbmFtZV0KKwkgICBbLUUgfCAtLWV4dGVuZGVkLXJlZ2V4cF0gWy1HIHwgLS1iYXNpYy1yZWdleHBdCisJICAgWy1GIHwgLS1maXhlZC1zdHJpbmdzXSBbLW5dCisJICAgWy1sIHwgLS1maWxlcy13aXRoLW1hdGNoZXNdIFstTCB8IC0tZmlsZXMtd2l0aG91dC1tYXRjaF0KKwkgICBbLWMgfCAtLWNvdW50XSBbLS1hbGwtbWF0Y2hdCisJICAgWy1BIDxwb3N0LWNvbnRleHQ+XSBbLUIgPHByZS1jb250ZXh0Pl0gWy1DIDxjb250ZXh0Pl0KKwkgICBbLWYgPGZpbGU+XSBbLWVdIDxwYXR0ZXJuPgorCSAgIFstLWFuZHwtLW9yfC0tbm90fCh8KXwtZSA8cGF0dGVybj4uLi5dIFs8dHJlZT4uLi5dCisJICAgWy0tXSBbPHBhdGg+Li4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0xvb2sgZm9yIHNwZWNpZmllZCBwYXR0ZXJucyBpbiB0aGUgd29ya2luZyB0cmVlIGZpbGVzLCBibG9icworcmVnaXN0ZXJlZCBpbiB0aGUgaW5kZXggZmlsZSwgb3IgZ2l2ZW4gdHJlZSBvYmplY3RzLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy0tY2FjaGVkOjoKKwlJbnN0ZWFkIG9mIHNlYXJjaGluZyBpbiB0aGUgd29ya2luZyB0cmVlIGZpbGVzLCBjaGVjaworCXRoZSBibG9icyByZWdpc3RlcmVkIGluIHRoZSBpbmRleCBmaWxlLgorCistYSB8IC0tdGV4dDo6CisJUHJvY2VzcyBiaW5hcnkgZmlsZXMgYXMgaWYgdGhleSB3ZXJlIHRleHQuCisKKy1pIHwgLS1pZ25vcmUtY2FzZTo6CisJSWdub3JlIGNhc2UgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgcGF0dGVybnMgYW5kIHRoZQorCWZpbGVzLgorCistSTo6CisJRG9uJ3QgbWF0Y2ggdGhlIHBhdHRlcm4gaW4gYmluYXJ5IGZpbGVzLgorCistdyB8IC0td29yZC1yZWdleHA6OgorCU1hdGNoIHRoZSBwYXR0ZXJuIG9ubHkgYXQgd29yZCBib3VuZGFyeSAoZWl0aGVyIGJlZ2luIGF0IHRoZQorCWJlZ2lubmluZyBvZiBhIGxpbmUsIG9yIHByZWNlZGVkIGJ5IGEgbm9uLXdvcmQgY2hhcmFjdGVyOyBlbmQgYXQKKwl0aGUgZW5kIG9mIGEgbGluZSBvciBmb2xsb3dlZCBieSBhIG5vbi13b3JkIGNoYXJhY3RlcikuCisKKy12IHwgLS1pbnZlcnQtbWF0Y2g6OgorCVNlbGVjdCBub24tbWF0Y2hpbmcgbGluZXMuCisKKy1oIHwgLUg6OgorCUJ5IGRlZmF1bHQsIHRoZSBjb21tYW5kIHNob3dzIHRoZSBmaWxlbmFtZSBmb3IgZWFjaAorCW1hdGNoLiAgYC1oYCBvcHRpb24gaXMgdXNlZCB0byBzdXBwcmVzcyB0aGlzIG91dHB1dC4KKwlgLUhgIGlzIHRoZXJlIGZvciBjb21wbGV0ZW5lc3MgYW5kIGRvZXMgbm90IGRvIGFueXRoaW5nCisJZXhjZXB0IGl0IG92ZXJyaWRlcyBgLWhgIGdpdmVuIGVhcmxpZXIgb24gdGhlIGNvbW1hbmQKKwlsaW5lLgorCistLWZ1bGwtbmFtZTo6CisJV2hlbiBydW4gZnJvbSBhIHN1YmRpcmVjdG9yeSwgdGhlIGNvbW1hbmQgdXN1YWxseQorCW91dHB1dHMgcGF0aHMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgVGhpcworCW9wdGlvbiBmb3JjZXMgcGF0aHMgdG8gYmUgb3V0cHV0IHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0CisJdG9wIGRpcmVjdG9yeS4KKworLUUgfCAtLWV4dGVuZGVkLXJlZ2V4cCB8IC1HIHwgLS1iYXNpYy1yZWdleHA6OgorCVVzZSBQT1NJWCBleHRlbmRlZC9iYXNpYyByZWdleHAgZm9yIHBhdHRlcm5zLiAgRGVmYXVsdAorCWlzIHRvIHVzZSBiYXNpYyByZWdleHAuCisKKy1GIHwgLS1maXhlZC1zdHJpbmdzOjoKKwlVc2UgZml4ZWQgc3RyaW5ncyBmb3IgcGF0dGVybnMgKGRvbid0IGludGVycHJldCBwYXR0ZXJuCisJYXMgYSByZWdleCkuCisKKy1uOjoKKwlQcmVmaXggdGhlIGxpbmUgbnVtYmVyIHRvIG1hdGNoaW5nIGxpbmVzLgorCistbCB8IC0tZmlsZXMtd2l0aC1tYXRjaGVzIHwgLS1uYW1lLW9ubHkgfCAtTCB8IC0tZmlsZXMtd2l0aG91dC1tYXRjaDo6CisJSW5zdGVhZCBvZiBzaG93aW5nIGV2ZXJ5IG1hdGNoZWQgbGluZSwgc2hvdyBvbmx5IHRoZQorCW5hbWVzIG9mIGZpbGVzIHRoYXQgY29udGFpbiAob3IgZG8gbm90IGNvbnRhaW4pIG1hdGNoZXMuCisJRm9yIGJldHRlciBjb21wYXRpYmlsaXR5IHdpdGggZ2l0LWRpZmYsIC0tbmFtZS1vbmx5IGlzIGEKKwlzeW5vbnltIGZvciAtLWZpbGVzLXdpdGgtbWF0Y2hlcy4KKworLWMgfCAtLWNvdW50OjoKKwlJbnN0ZWFkIG9mIHNob3dpbmcgZXZlcnkgbWF0Y2hlZCBsaW5lLCBzaG93IHRoZSBudW1iZXIgb2YKKwlsaW5lcyB0aGF0IG1hdGNoLgorCistW0FCQ10gPGNvbnRleHQ+OjoKKwlTaG93IGBjb250ZXh0YCB0cmFpbGluZyAoYEFgIC0tIGFmdGVyKSwgb3IgbGVhZGluZyAoYEJgCisJLS0gYmVmb3JlKSwgb3IgYm90aCAoYENgIC0tIGNvbnRleHQpIGxpbmVzLCBhbmQgcGxhY2UgYQorCWxpbmUgY29udGFpbmluZyBgLS1gIGJldHdlZW4gY29udGlndW91cyBncm91cHMgb2YKKwltYXRjaGVzLgorCistPG51bT46OgorCUEgc2hvcnRjdXQgZm9yIHNwZWNpZnlpbmcgLUM8bnVtPi4KKworLWYgPGZpbGU+OjoKKwlSZWFkIHBhdHRlcm5zIGZyb20gPGZpbGU+LCBvbmUgcGVyIGxpbmUuCisKKy1lOjoKKwlUaGUgbmV4dCBwYXJhbWV0ZXIgaXMgdGhlIHBhdHRlcm4uIFRoaXMgb3B0aW9uIGhhcyB0byBiZQorCXVzZWQgZm9yIHBhdHRlcm5zIHN0YXJ0aW5nIHdpdGggLSBhbmQgc2hvdWxkIGJlIHVzZWQgaW4KKwlzY3JpcHRzIHBhc3NpbmcgdXNlciBpbnB1dCB0byBncmVwLiAgTXVsdGlwbGUgcGF0dGVybnMgYXJlCisJY29tYmluZWQgYnkgJ29yJy4KKworLS1hbmQgfCAtLW9yIHwgLS1ub3QgfCAoIHwgKTo6CisJU3BlY2lmeSBob3cgbXVsdGlwbGUgcGF0dGVybnMgYXJlIGNvbWJpbmVkIHVzaW5nIEJvb2xlYW4KKwlleHByZXNzaW9ucy4gIGAtLW9yYCBpcyB0aGUgZGVmYXVsdCBvcGVyYXRvci4gIGAtLWFuZGAgaGFzCisJaGlnaGVyIHByZWNlZGVuY2UgdGhhbiBgLS1vcmAuICBgLWVgIGhhcyB0byBiZSB1c2VkIGZvciBhbGwKKwlwYXR0ZXJucy4KKworLS1hbGwtbWF0Y2g6OgorCVdoZW4gZ2l2aW5nIG11bHRpcGxlIHBhdHRlcm4gZXhwcmVzc2lvbnMgY29tYmluZWQgd2l0aCBgLS1vcmAsCisJdGhpcyBmbGFnIGlzIHNwZWNpZmllZCB0byBsaW1pdCB0aGUgbWF0Y2ggdG8gZmlsZXMgdGhhdAorCWhhdmUgbGluZXMgdG8gbWF0Y2ggYWxsIG9mIHRoZW0uCisKK2A8dHJlZT4uLi5gOjoKKwlTZWFyY2ggYmxvYnMgaW4gdGhlIHRyZWVzIGZvciBzcGVjaWZpZWQgcGF0dGVybnMuCisKK1wtLTo6CisJU2lnbmFscyB0aGUgZW5kIG9mIG9wdGlvbnM7IHRoZSByZXN0IG9mIHRoZSBwYXJhbWV0ZXJzCisJYXJlIDxwYXRoPiBsaW1pdGVycy4KKworCitFeGFtcGxlCistLS0tLS0tCisKK2dpdCBncmVwIC1lIFwnI2RlZmluZVwnIC0tYW5kIFwoIC1lIE1BWF9QQVRIIC1lIFBBVEhfTUFYIFwpOjoKKwlMb29rcyBmb3IgYSBsaW5lIHRoYXQgaGFzIGAjZGVmaW5lYCBhbmQgZWl0aGVyIGBNQVhfUEFUSGAgb3IKKwlgUEFUSF9NQVhgLgorCitnaXQgZ3JlcCAtLWFsbC1tYXRjaCAtZSBOT0RFIC1lIFVuZXhwZWN0ZWQ6OgorCUxvb2tzIGZvciBhIGxpbmUgdGhhdCBoYXMgYE5PREVgIG9yIGBVbmV4cGVjdGVkYCBpbgorCWZpbGVzIHRoYXQgaGF2ZSBsaW5lcyB0aGF0IG1hdGNoIGJvdGguCisKK0F1dGhvcgorLS0tLS0tCitPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPiwgbGF0ZXIKK3JldmFtcGVkIGJ5IEp1bmlvIEMgSGFtYW5vLgorCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWd1aS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1ndWkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNmNkNWQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1ndWkudHh0CkBAIC0wLDAgKzEsMTE1IEBACitnaXQtZ3VpKDEpCis9PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1ndWkgLSBBIHBvcnRhYmxlIGdyYXBoaWNhbCBpbnRlcmZhY2UgdG8gR2l0CisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdCBndWknIFs8Y29tbWFuZD5dIFthcmd1bWVudHNdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQSBUY2wvVGsgYmFzZWQgZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlIHRvIEdpdC4gIGdpdC1ndWkgZm9jdXNlcworb24gYWxsb3dpbmcgdXNlcnMgdG8gbWFrZSBjaGFuZ2VzIHRvIHRoZWlyIHJlcG9zaXRvcnkgYnkgbWFraW5nCituZXcgY29tbWl0cywgYW1lbmRpbmcgZXhpc3Rpbmcgb25lcywgY3JlYXRpbmcgYnJhbmNoZXMsIHBlcmZvcm1pbmcKK2xvY2FsIG1lcmdlcywgYW5kIGZldGNoaW5nL3B1c2hpbmcgdG8gcmVtb3RlIHJlcG9zaXRvcmllcy4KKworVW5saWtlIGxpbmtnaXQ6Z2l0a1sxXSwgZ2l0LWd1aSBmb2N1c2VzIG9uIGNvbW1pdCBnZW5lcmF0aW9uCithbmQgc2luZ2xlIGZpbGUgYW5ub3RhdGlvbiwgYW5kIGRvZXMgbm90IHNob3cgcHJvamVjdCBoaXN0b3J5LgorSXQgZG9lcyBob3dldmVyIHN1cHBseSBtZW51IGFjdGlvbnMgdG8gc3RhcnQgYSBnaXRrIHNlc3Npb24gZnJvbQord2l0aGluIGdpdC1ndWkuCisKK2dpdC1ndWkgaXMga25vd24gdG8gd29yayBvbiBhbGwgcG9wdWxhciBVTklYIHN5c3RlbXMsIE1hYyBPUyBYLAorYW5kIFdpbmRvd3MgKHVuZGVyIGJvdGggQ3lnd2luIGFuZCBNU1lTKS4gIFRvIHRoZSBleHRlbnQgcG9zc2libGUKK09TIHNwZWNpZmljIHVzZXIgaW50ZXJmYWNlIGd1aWRlbGluZXMgYXJlIGZvbGxvd2VkLCBtYWtpbmcgZ2l0LWd1aQorYSBmYWlybHkgbmF0aXZlIGludGVyZmFjZSBmb3IgdXNlcnMuCisKK0NPTU1BTkRTCistLS0tLS0tLQorYmxhbWU6OgorCVN0YXJ0IGEgYmxhbWUgdmlld2VyIG9uIHRoZSBzcGVjaWZpZWQgZmlsZSBvbiB0aGUgZ2l2ZW4KKwl2ZXJzaW9uIChvciB3b3JraW5nIGRpcmVjdG9yeSBpZiBub3Qgc3BlY2lmaWVkKS4KKworYnJvd3Nlcjo6CisJU3RhcnQgYSB0cmVlIGJyb3dzZXIgc2hvd2luZyBhbGwgZmlsZXMgaW4gdGhlIHNwZWNpZmllZAorCWNvbW1pdCAob3IgJ0hFQUQnIGJ5IGRlZmF1bHQpLglGaWxlcyBzZWxlY3RlZCB0aHJvdWdoIHRoZQorCWJyb3dzZXIgYXJlIG9wZW5lZCBpbiB0aGUgYmxhbWUgdmlld2VyLgorCitjaXRvb2w6OgorCVN0YXJ0IGdpdC1ndWkgYW5kIGFycmFuZ2UgdG8gbWFrZSBleGFjdGx5IG9uZSBjb21taXQgYmVmb3JlCisJZXhpdGluZyBhbmQgcmV0dXJuaW5nIHRvIHRoZSBzaGVsbC4gIFRoZSBpbnRlcmZhY2UgaXMgbGltaXRlZAorCXRvIG9ubHkgY29tbWl0IGFjdGlvbnMsIHNsaWdodGx5IHJlZHVjaW5nIHRoZSBhcHBsaWNhdGlvbidzCisJc3RhcnR1cCB0aW1lIGFuZCBzaW1wbGlmeWluZyB0aGUgbWVudWJhci4KKwordmVyc2lvbjo6CisJRGlzcGxheSB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdmVyc2lvbiBvZiBnaXQtZ3VpLgorCisKK0V4YW1wbGVzCistLS0tLS0tLQorZ2l0IGd1aSBibGFtZSBNYWtlZmlsZTo6CisKKwlTaG93IHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSAnTWFrZWZpbGUnIGluIHRoZSBjdXJyZW50CisJd29ya2luZyBkaXJlY3RvcnksIGFuZCBwcm92aWRlIGFubm90YXRpb25zIGZvciBib3RoIHRoZQorCW9yaWdpbmFsIGF1dGhvciBvZiBlYWNoIGxpbmUsIGFuZCB3aG8gbW92ZWQgdGhlIGxpbmUgdG8gaXRzCisJY3VycmVudCBsb2NhdGlvbi4gIFRoZSB1bmNvbW1pdHRlZCBmaWxlIGlzIGFubm90YXRlZCwgYW5kCisJdW5jb21taXR0ZWQgY2hhbmdlcyAoaWYgYW55KSBhcmUgZXhwbGljaXRseSBhdHRyaWJ1dGVkIHRvCisJJ05vdCBZZXQgQ29tbWl0dGVkJy4KKworZ2l0IGd1aSBibGFtZSB2MC45OS44IE1ha2VmaWxlOjoKKworCVNob3cgdGhlIGNvbnRlbnRzIG9mICdNYWtlZmlsZScgaW4gcmV2aXNpb24gJ3YwLjk5LjgnCisJYW5kIHByb3ZpZGUgYW5ub3RhdGlvbnMgZm9yIGVhY2ggbGluZS4JVW5saWtlIHRoZSBhYm92ZQorCWV4YW1wbGUgdGhlIGZpbGUgaXMgcmVhZCBmcm9tIHRoZSBvYmplY3QgZGF0YWJhc2UgYW5kIG5vdAorCXRoZSB3b3JraW5nIGRpcmVjdG9yeS4KKworZ2l0IGd1aSBjaXRvb2w6OgorCisJTWFrZSBvbmUgY29tbWl0IGFuZCByZXR1cm4gdG8gdGhlIHNoZWxsIHdoZW4gaXQgaXMgY29tcGxldGUuCisKK2dpdCBjaXRvb2w6OgorCisJU2FtZSBhcyAnZ2l0IGd1aSBjaXRvb2wnIChhYm92ZSkuCisKK2dpdCBndWkgYnJvd3NlciBtYWludDo6CisKKwlTaG93IGEgYnJvd3NlciBmb3IgdGhlIHRyZWUgb2YgdGhlICdtYWludCcgYnJhbmNoLiAgRmlsZXMKKwlzZWxlY3RlZCBpbiB0aGUgYnJvd3NlciBjYW4gYmUgdmlld2VkIHdpdGggdGhlIGludGVybmFsCisJYmxhbWUgdmlld2VyLgorCitTZWUgQWxzbworLS0tLS0tLS0KKydnaXRrKDEpJzo6CisJVGhlIGdpdCByZXBvc2l0b3J5IGJyb3dzZXIuICBTaG93cyBicmFuY2hlcywgY29tbWl0IGhpc3RvcnkKKwlhbmQgZmlsZSBkaWZmZXJlbmNlcy4gIGdpdGsgaXMgdGhlIHV0aWxpdHkgc3RhcnRlZCBieQorCWdpdC1ndWkncyBSZXBvc2l0b3J5IFZpc3VhbGl6ZSBhY3Rpb25zLgorCitPdGhlcgorLS0tLS0KK2dpdC1ndWkgaXMgYWN0dWFsbHkgbWFpbnRhaW5lZCBhcyBhbiBpbmRlcGVuZGVudCBwcm9qZWN0LCBidXQgc3RhYmxlCit2ZXJzaW9ucyBhcmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiB0aGUgR2l0IHN1aXRlIGZvciB0aGUgY29udmVuaWVuY2UKK29mIGVuZCB1c2Vycy4KKworQSBnaXQtZ3VpIGRldmVsb3BtZW50IHJlcG9zaXRvcnkgY2FuIGJlIG9idGFpbmVkIGZyb206CisKKyAgZ2l0IGNsb25lIGdpdDovL3JlcG8ub3IuY3ovZ2l0LWd1aS5naXQKKworb3IKKworICBnaXQgY2xvbmUgaHR0cDovL3JlcG8ub3IuY3ovci9naXQtZ3VpLmdpdAorCitvciBicm93c2VkIG9ubGluZSBhdCBodHRwOi8vcmVwby5vci5jei93L2dpdC1ndWkuZ2l0L1tdLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBTaGF3biBPLiBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+LgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBTaGF3biBPLiBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWhhc2gtb2JqZWN0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWhhc2gtb2JqZWN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzAzMGMwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtaGFzaC1vYmplY3QudHh0CkBAIC0wLDAgKzEsNDUgQEAKK2dpdC1oYXNoLW9iamVjdCgxKQorPT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1oYXNoLW9iamVjdCAtIENvbXB1dGUgb2JqZWN0IElEIGFuZCBvcHRpb25hbGx5IGNyZWF0ZXMgYSBibG9iIGZyb20gYSBmaWxlCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWhhc2gtb2JqZWN0JyBbLXQgPHR5cGU+XSBbLXddIFstLXN0ZGluXSBbLS1dIDxmaWxlPi4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0NvbXB1dGVzIHRoZSBvYmplY3QgSUQgdmFsdWUgZm9yIGFuIG9iamVjdCB3aXRoIHNwZWNpZmllZCB0eXBlCit3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgbmFtZWQgZmlsZSAod2hpY2ggY2FuIGJlIG91dHNpZGUgb2YgdGhlCit3b3JrIHRyZWUpLCBhbmQgb3B0aW9uYWxseSB3cml0ZXMgdGhlIHJlc3VsdGluZyBvYmplY3QgaW50byB0aGUKK29iamVjdCBkYXRhYmFzZS4gIFJlcG9ydHMgaXRzIG9iamVjdCBJRCB0byBpdHMgc3RhbmRhcmQgb3V0cHV0LgorVGhpcyBpcyB1c2VkIGJ5ICJnaXQtY3ZzaW1wb3J0IiB0byB1cGRhdGUgdGhlIGluZGV4Cit3aXRob3V0IG1vZGlmeWluZyBmaWxlcyBpbiB0aGUgd29yayB0cmVlLiAgV2hlbiA8dHlwZT4gaXMgbm90CitzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvICJibG9iIi4KKworT1BUSU9OUworLS0tLS0tLQorCistdCA8dHlwZT46OgorCVNwZWNpZnkgdGhlIHR5cGUgKGRlZmF1bHQ6ICJibG9iIikuCisKKy13OjoKKwlBY3R1YWxseSB3cml0ZSB0aGUgb2JqZWN0IGludG8gdGhlIG9iamVjdCBkYXRhYmFzZS4KKworLS1zdGRpbjo6CisJUmVhZCB0aGUgb2JqZWN0IGZyb20gc3RhbmRhcmQgaW5wdXQgaW5zdGVhZCBvZiBmcm9tIGEgZmlsZS4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1oZWxwLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWhlbHAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMmFlNTMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1oZWxwLnR4dApAQCAtMCwwICsxLDEzNCBAQAorZ2l0LWhlbHAoMSkKKz09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1oZWxwIC0gZGlzcGxheSBoZWxwIGluZm9ybWF0aW9uIGFib3V0IGdpdAorCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQgaGVscCcgWy1hfC0tYWxsfC1pfC0taW5mb3wtbXwtLW1hbnwtd3wtLXdlYl0gW0NPTU1BTkRdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitXaXRoIG5vIG9wdGlvbnMgYW5kIG5vIENPTU1BTkQgZ2l2ZW4sIHRoZSBzeW5vcHNpcyBvZiB0aGUgJ2dpdCcKK2NvbW1hbmQgYW5kIGEgbGlzdCBvZiB0aGUgbW9zdCBjb21tb25seSB1c2VkIGdpdCBjb21tYW5kcyBhcmUgcHJpbnRlZAorb24gdGhlIHN0YW5kYXJkIG91dHB1dC4KKworSWYgdGhlIG9wdGlvbiAnLS1hbGwnIG9yICctYScgaXMgZ2l2ZW4sIHRoZW4gYWxsIGF2YWlsYWJsZSBjb21tYW5kcyBhcmUKK3ByaW50ZWQgb24gdGhlIHN0YW5kYXJkIG91dHB1dC4KKworSWYgYSBnaXQgY29tbWFuZCBpcyBuYW1lZCwgYSBtYW51YWwgcGFnZSBmb3IgdGhhdCBjb21tYW5kIGlzIGJyb3VnaHQKK3VwLiBUaGUgJ21hbicgcHJvZ3JhbSBpcyB1c2VkIGJ5IGRlZmF1bHQgZm9yIHRoaXMgcHVycG9zZSwgYnV0IHRoaXMKK2NhbiBiZSBvdmVycmlkZGVuIGJ5IG90aGVyIG9wdGlvbnMgb3IgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMuCisKK05vdGUgdGhhdCAnZ2l0IC0taGVscCAuLi4nIGlzIGlkZW50aWNhbCBhcyAnZ2l0IGhlbHAgLi4uJyBiZWNhdXNlIHRoZQorZm9ybWVyIGlzIGludGVybmFsbHkgY29udmVydGVkIGludG8gdGhlIGxhdHRlci4KKworT1BUSU9OUworLS0tLS0tLQorLWF8LS1hbGw6OgorCVByaW50cyBhbGwgdGhlIGF2YWlsYWJsZSBjb21tYW5kcyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LiBUaGlzCisJb3B0aW9uIHN1cGVyc2VkZXMgYW55IG90aGVyIG9wdGlvbi4KKworLWl8LS1pbmZvOjoKKwlEaXNwbGF5IG1hbnVhbCBwYWdlIGZvciB0aGUgY29tbWFuZCBpbiB0aGUgJ2luZm8nIGZvcm1hdC4gVGhlCisJJ2luZm8nIHByb2dyYW0gd2lsbCBiZSB1c2VkIGZvciB0aGF0IHB1cnBvc2UuCisKKy1tfC0tbWFuOjoKKwlEaXNwbGF5IG1hbnVhbCBwYWdlIGZvciB0aGUgY29tbWFuZCBpbiB0aGUgJ21hbicgZm9ybWF0LiBUaGlzCisJb3B0aW9uIG1heSBiZSB1c2VkIHRvIG92ZXJyaWRlIGEgdmFsdWUgc2V0IGluIHRoZQorCSdoZWxwLmZvcm1hdCcgY29uZmlndXJhdGlvbiB2YXJpYWJsZS4KKysKK0J5IGRlZmF1bHQgdGhlICdtYW4nIHByb2dyYW0gd2lsbCBiZSB1c2VkIHRvIGRpc3BsYXkgdGhlIG1hbnVhbCBwYWdlLAorYnV0IHRoZSAnbWFuLnZpZXdlcicgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBtYXkgYmUgdXNlZCB0byBjaG9vc2UKK290aGVyIGRpc3BsYXkgcHJvZ3JhbXMgKHNlZSBiZWxvdykuCisKKy13fC0td2ViOjoKKwlEaXNwbGF5IG1hbnVhbCBwYWdlIGZvciB0aGUgY29tbWFuZCBpbiB0aGUgJ3dlYicgKEhUTUwpCisJZm9ybWF0LiBBIHdlYiBicm93c2VyIHdpbGwgYmUgdXNlZCBmb3IgdGhhdCBwdXJwb3NlLgorKworVGhlIHdlYiBicm93c2VyIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUKKydoZWxwLmJyb3dzZXInLCBvciAnd2ViLmJyb3dzZXInIGlmIHRoZSBmb3JtZXIgaXMgbm90IHNldC4gSWYgbm9uZSBvZgordGhlc2UgY29uZmlnIHZhcmlhYmxlcyBpcyBzZXQsIHRoZSAnZ2l0LXdlYi0tYnJvd3NlJyBoZWxwZXIgc2NyaXB0CisoY2FsbGVkIGJ5ICdnaXQtaGVscCcpIHdpbGwgcGljayBhIHN1aXRhYmxlIGRlZmF1bHQuIFNlZQorbGlua2dpdDpnaXQtd2ViLS1icm93c2VbMV0gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcy4KKworQ09ORklHVVJBVElPTiBWQVJJQUJMRVMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2hlbHAuZm9ybWF0Cit+fn5+fn5+fn5+fgorCitJZiBubyBjb21tYW5kIGxpbmUgb3B0aW9uIGlzIHBhc3NlZCwgdGhlICdoZWxwLmZvcm1hdCcgY29uZmlndXJhdGlvbgordmFyaWFibGUgd2lsbCBiZSBjaGVja2VkLiBUaGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgc3VwcG9ydGVkIGZvciB0aGlzCit2YXJpYWJsZTsgdGhleSBtYWtlICdnaXQtaGVscCcgYmVoYXZlIGFzIHRoZWlyIGNvcnJlc3BvbmRpbmcgY29tbWFuZAorbGluZSBvcHRpb246CisKKyogIm1hbiIgY29ycmVzcG9uZHMgdG8gJy1tfC0tbWFuJywKKyogImluZm8iIGNvcnJlc3BvbmRzIHRvICctaXwtLWluZm8nLAorKiAid2ViIiBvciAiaHRtbCIgY29ycmVzcG9uZCB0byAnLXd8LS13ZWInLgorCitoZWxwLmJyb3dzZXIsIHdlYi5icm93c2VyIGFuZCBicm93c2VyLjx0b29sPi5wYXRoCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSAnaGVscC5icm93c2VyJywgJ3dlYi5icm93c2VyJyBhbmQgJ2Jyb3dzZXIuPHRvb2w+LnBhdGgnIHdpbGwgYWxzbworYmUgY2hlY2tlZCBpZiB0aGUgJ3dlYicgZm9ybWF0IGlzIGNob3NlbiAoZWl0aGVyIGJ5IGNvbW1hbmQgbGluZQorb3B0aW9uIG9yIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUpLiBTZWUgJy13fC0td2ViJyBpbiB0aGUgT1BUSU9OUworc2VjdGlvbiBhYm92ZSBhbmQgbGlua2dpdDpnaXQtd2ViLS1icm93c2VbMV0uCisKK21hbi52aWV3ZXIKK35+fn5+fn5+fn4KKworVGhlICdtYW4udmlld2VyJyBjb25maWcgdmFyaWFibGUgd2lsbCBiZSBjaGVja2VkIGlmIHRoZSAnbWFuJyBmb3JtYXQKK2lzIGNob3Nlbi4gT25seSB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZDoKKworKiAibWFuIjogdXNlIHRoZSAnbWFuJyBwcm9ncmFtIGFzIHVzdWFsLAorKiAid29tYW4iOiB1c2UgJ2VtYWNzY2xpZW50JyB0byBsYXVuY2ggdGhlICJ3b21hbiIgbW9kZSBpbiBlbWFjcworKHRoaXMgb25seSB3b3JrcyBzdGFydGluZyB3aXRoIGVtYWNzY2xpZW50IHZlcnNpb25zIDIyKSwKKyogImtvbnF1ZXJvciI6IHVzZSBhIG1hbiBLSU8gc2xhdmUgaW4ga29ucXVlcm9yLgorCitNdWx0aXBsZSB2YWx1ZXMgbWF5IGJlIGdpdmVuIHRvIHRoaXMgY29uZmlndXJhdGlvbiB2YXJpYWJsZS4gVGhlaXIKK2NvcnJlc3BvbmRpbmcgcHJvZ3JhbXMgd2lsbCBiZSB0cmllZCBpbiB0aGUgb3JkZXIgbGlzdGVkIGluIHRoZQorY29uZmlndXJhdGlvbiBmaWxlLgorCitGb3IgZXhhbXBsZSwgdGhpcyBjb25maWd1cmF0aW9uOgorCisJW21hbl0KKwkJdmlld2VyID0ga29ucXVlcm9yCisJCXZpZXdlciA9IHdvbWFuCisKK3dpbGwgdHJ5IHRvIHVzZSBrb25xdWVyb3IgZmlyc3QuIEJ1dCB0aGlzIG1heSBmYWlsIChmb3IgZXhhbXBsZSBpZgorRElTUExBWSBpcyBub3Qgc2V0KSBhbmQgaW4gdGhhdCBjYXNlIGVtYWNzJyB3b21hbiBtb2RlIHdpbGwgYmUgdHJpZWQuCisKK0lmIGV2ZXJ5dGhpbmcgZmFpbHMgdGhlICdtYW4nIHByb2dyYW0gd2lsbCBiZSB0cmllZCBhbnl3YXkuCisKK05vdGUgYWJvdXQgZ2l0IGNvbmZpZyAtLWdsb2JhbAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK05vdGUgdGhhdCBhbGwgdGhlc2UgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgc2hvdWxkIHByb2JhYmx5IGJlIHNldAordXNpbmcgdGhlICctLWdsb2JhbCcgZmxhZywgZm9yIGV4YW1wbGUgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbmZpZyAtLWdsb2JhbCBoZWxwLmZvcm1hdCB3ZWIKKyQgZ2l0IGNvbmZpZyAtLWdsb2JhbCB3ZWIuYnJvd3NlciBmaXJlZm94CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYXMgdGhleSBhcmUgcHJvYmFibHkgbW9yZSB1c2VyIHNwZWNpZmljIHRoYW4gcmVwb3NpdG9yeSBzcGVjaWZpYy4KK1NlZSBsaW5rZ2l0OmdpdC1jb25maWdbMV0gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcy4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGdpdHN0ZXJAcG9ib3guY29tPiBhbmQgdGhlIGdpdC1saXN0Cis8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0KK0luaXRpYWwgZG9jdW1lbnRhdGlvbiB3YXMgcGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gbWFuIHBhZ2UuCitDaHJpc3RpYW4gQ291ZGVyIDxjaHJpc2Nvb2xAdHV4ZmFtaWx5Lm9yZz4gZXh0cmFjdGVkIGFuZCByZXdyb3RlIGl0IGEKK2xpdHRsZS4gTWFpbnRlbmFuY2UgaXMgZG9uZSBieSB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWh0dHAtZmV0Y2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtaHR0cC1mZXRjaC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc4NGE5ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWh0dHAtZmV0Y2gudHh0CkBAIC0wLDAgKzEsNTYgQEAKK2dpdC1odHRwLWZldGNoKDEpCis9PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtaHR0cC1mZXRjaCAtIERvd25sb2FkIGZyb20gYSByZW1vdGUgZ2l0IHJlcG9zaXRvcnkgdmlhIEhUVFAKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtaHR0cC1mZXRjaCcgWy1jXSBbLXRdIFstYV0gWy1kXSBbLXZdIFstdyBmaWxlbmFtZV0gWy0tcmVjb3Zlcl0gWy0tc3RkaW5dIDxjb21taXQ+IDx1cmw+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorRG93bmxvYWRzIGEgcmVtb3RlIGdpdCByZXBvc2l0b3J5IHZpYSBIVFRQLgorCitPUFRJT05TCistLS0tLS0tCitjb21taXQtaWQ6OgorICAgICAgICBFaXRoZXIgdGhlIGhhc2ggb3IgdGhlIGZpbGVuYW1lIHVuZGVyIFtVUkxdL3JlZnMvIHRvCisgICAgICAgIHB1bGwuCisKKy1jOjoKKwlHZXQgdGhlIGNvbW1pdCBvYmplY3RzLgorLXQ6OgorCUdldCB0cmVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbW1pdCBvYmplY3RzLgorLWE6OgorCUdldCBhbGwgdGhlIG9iamVjdHMuCistdjo6CisJUmVwb3J0IHdoYXQgaXMgZG93bmxvYWRlZC4KKworLXcgPGZpbGVuYW1lPjo6CisgICAgICAgIFdyaXRlcyB0aGUgY29tbWl0LWlkIGludG8gdGhlIGZpbGVuYW1lIHVuZGVyICRHSVRfRElSL3JlZnMvPGZpbGVuYW1lPiBvbgorICAgICAgICB0aGUgbG9jYWwgZW5kIGFmdGVyIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZS4KKworLS1zdGRpbjo6CisJSW5zdGVhZCBvZiBhIGNvbW1pdCBpZCBvbiB0aGUgY29tbWFuZCBsaW5lICh3aGljaCBpcyBub3QgZXhwZWN0ZWQgaW4gdGhpcworCWNhc2UpLCAnZ2l0LWh0dHAtZmV0Y2gnIGV4cGVjdHMgbGluZXMgb24gc3RkaW4gaW4gdGhlIGZvcm1hdAorCisJCTxjb21taXQtaWQ+WydcdCc8ZmlsZW5hbWUtYXMtaW4tLXc+XQorCistLXJlY292ZXI6OgorCVZlcmlmeSB0aGF0IGV2ZXJ5dGhpbmcgcmVhY2hhYmxlIGZyb20gdGFyZ2V0IGlzIGZldGNoZWQuICBVc2VkIGFmdGVyCisJYW4gZWFybGllciBmZXRjaCBpcyBpbnRlcnJ1cHRlZC4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1odHRwLXB1c2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtaHR0cC1wdXNoLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjgyNzIyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtaHR0cC1wdXNoLnR4dApAQCAtMCwwICsxLDEwNCBAQAorZ2l0LWh0dHAtcHVzaCgxKQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtaHR0cC1wdXNoIC0gUHVzaCBvYmplY3RzIG92ZXIgSFRUUC9EQVYgdG8gYW5vdGhlciByZXBvc2l0b3J5CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWh0dHAtcHVzaCcgWy0tYWxsXSBbLS1kcnktcnVuXSBbLS1mb3JjZV0gWy0tdmVyYm9zZV0gPHVybD4gPHJlZj4gWzxyZWY+Li4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1NlbmRzIG1pc3Npbmcgb2JqZWN0cyB0byByZW1vdGUgcmVwb3NpdG9yeSwgYW5kIHVwZGF0ZXMgdGhlCityZW1vdGUgYnJhbmNoLgorCisqTk9URSo6IFRoaXMgY29tbWFuZCBpcyB0ZW1wb3JhcmlseSBkaXNhYmxlZCBpZiB5b3VyIGNVUkwKK2xpYnJhcnkgaXMgb2xkZXIgdGhhbiA3LjE2LCBhcyB0aGUgY29tYmluYXRpb24gaGFzIGJlZW4gcmVwb3J0ZWQKK25vdCB0byB3b3JrIGFuZCBzb21ldGltZXMgY29ycnVwdHMgcmVwb3NpdG9yeS4KKworT1BUSU9OUworLS0tLS0tLQorLS1hbGw6OgorCURvIG5vdCBhc3N1bWUgdGhhdCB0aGUgcmVtb3RlIHJlcG9zaXRvcnkgaXMgY29tcGxldGUgaW4gaXRzCisJY3VycmVudCBzdGF0ZSwgYW5kIHZlcmlmeSBhbGwgb2JqZWN0cyBpbiB0aGUgZW50aXJlIGxvY2FsCisJcmVmJ3MgaGlzdG9yeSBleGlzdCBpbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnkuCisKKy0tZm9yY2U6OgorCVVzdWFsbHksIHRoZSBjb21tYW5kIHJlZnVzZXMgdG8gdXBkYXRlIGEgcmVtb3RlIHJlZiB0aGF0CisJaXMgbm90IGFuIGFuY2VzdG9yIG9mIHRoZSBsb2NhbCByZWYgdXNlZCB0byBvdmVyd3JpdGUgaXQuCisJVGhpcyBmbGFnIGRpc2FibGVzIHRoZSBjaGVjay4gIFdoYXQgdGhpcyBtZWFucyBpcyB0aGF0CisJdGhlIHJlbW90ZSByZXBvc2l0b3J5IGNhbiBsb3NlIGNvbW1pdHM7IHVzZSBpdCB3aXRoCisJY2FyZS4KKworLS1kcnktcnVuOjoKKwlEbyBldmVyeXRoaW5nIGV4Y2VwdCBhY3R1YWxseSBzZW5kIHRoZSB1cGRhdGVzLgorCistLXZlcmJvc2U6OgorCVJlcG9ydCB0aGUgbGlzdCBvZiBvYmplY3RzIGJlaW5nIHdhbGtlZCBsb2NhbGx5IGFuZCB0aGUKKwlsaXN0IG9mIG9iamVjdHMgc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gdGhlIHJlbW90ZSByZXBvc2l0b3J5LgorCistZCwgLUQ6OgorCVJlbW92ZSA8cmVmPiBmcm9tIHJlbW90ZSByZXBvc2l0b3J5LiAgVGhlIHNwZWNpZmllZCBicmFuY2gKKwljYW5ub3QgYmUgdGhlIHJlbW90ZSBIRUFELiAgSWYgLWQgaXMgc3BlY2lmaWVkIHRoZSBmb2xsb3dpbmcKKwlvdGhlciBjb25kaXRpb25zIG11c3QgYWxzbyBiZSBtZXQ6CisKKwktIFJlbW90ZSBIRUFEIG11c3QgcmVzb2x2ZSB0byBhbiBvYmplY3QgdGhhdCBleGlzdHMgbG9jYWxseQorCS0gU3BlY2lmaWVkIGJyYW5jaCByZXNvbHZlcyB0byBhbiBvYmplY3QgdGhhdCBleGlzdHMgbG9jYWxseQorCS0gU3BlY2lmaWVkIGJyYW5jaCBpcyBhbiBhbmNlc3RvciBvZiB0aGUgcmVtb3RlIEhFQUQKKworPHJlZj4uLi46OgorCVRoZSByZW1vdGUgcmVmcyB0byB1cGRhdGUuCisKKworU3BlY2lmeWluZyB0aGUgUmVmcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBICc8cmVmPicgc3BlY2lmaWNhdGlvbiBjYW4gYmUgZWl0aGVyIGEgc2luZ2xlIHBhdHRlcm4sIG9yIGEgcGFpcgorb2Ygc3VjaCBwYXR0ZXJucyBzZXBhcmF0ZWQgYnkgYSBjb2xvbiAiOiIgKHRoaXMgbWVhbnMgdGhhdCBhIHJlZiBuYW1lCitjYW5ub3QgaGF2ZSBhIGNvbG9uIGluIGl0KS4gIEEgc2luZ2xlIHBhdHRlcm4gJzxuYW1lPicgaXMganVzdCBhCitzaG9ydGhhbmQgZm9yICc8bmFtZT46PG5hbWU+Jy4KKworRWFjaCBwYXR0ZXJuIHBhaXIgY29uc2lzdHMgb2YgdGhlIHNvdXJjZSBzaWRlIChiZWZvcmUgdGhlIGNvbG9uKQorYW5kIHRoZSBkZXN0aW5hdGlvbiBzaWRlIChhZnRlciB0aGUgY29sb24pLiAgVGhlIHJlZiB0byBiZQorcHVzaGVkIGlzIGRldGVybWluZWQgYnkgZmluZGluZyBhIG1hdGNoIHRoYXQgbWF0Y2hlcyB0aGUgc291cmNlCitzaWRlLCBhbmQgd2hlcmUgaXQgaXMgcHVzaGVkIGlzIGRldGVybWluZWQgYnkgdXNpbmcgdGhlCitkZXN0aW5hdGlvbiBzaWRlLgorCisgLSBJdCBpcyBhbiBlcnJvciBpZiA8c3JjPiBkb2VzIG5vdCBtYXRjaCBleGFjdGx5IG9uZSBvZiB0aGUKKyAgIGxvY2FsIHJlZnMuCisKKyAtIElmIDxkc3Q+IGRvZXMgbm90IG1hdGNoIGFueSByZW1vdGUgcmVmLCBlaXRoZXIKKworICAgKiBpdCBoYXMgdG8gc3RhcnQgd2l0aCAicmVmcy8iOyA8ZHN0PiBpcyB1c2VkIGFzIHRoZQorICAgICBkZXN0aW5hdGlvbiBsaXRlcmFsbHkgaW4gdGhpcyBjYXNlLgorCisgICAqIDxzcmM+ID09IDxkc3Q+IGFuZCB0aGUgcmVmIHRoYXQgbWF0Y2hlZCB0aGUgPHNyYz4gbXVzdCBub3QKKyAgICAgZXhpc3QgaW4gdGhlIHNldCBvZiByZW1vdGUgcmVmczsgdGhlIHJlZiBtYXRjaGVkIDxzcmM+CisgICAgIGxvY2FsbHkgaXMgdXNlZCBhcyB0aGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24uCisKK1dpdGhvdXQgJy0tZm9yY2UnLCB0aGUgPHNyYz4gcmVmIGlzIHN0b3JlZCBhdCB0aGUgcmVtb3RlIG9ubHkgaWYKKzxkc3Q+IGRvZXMgbm90IGV4aXN0LCBvciA8ZHN0PiBpcyBhIHByb3BlciBzdWJzZXQgKGkuZS4gYW4KK2FuY2VzdG9yKSBvZiA8c3JjPi4gIFRoaXMgY2hlY2ssIGtub3duIGFzICJmYXN0IGZvcndhcmQgY2hlY2siLAoraXMgcGVyZm9ybWVkIGluIG9yZGVyIHRvIGF2b2lkIGFjY2lkZW50YWxseSBvdmVyd3JpdGluZyB0aGUKK3JlbW90ZSByZWYgYW5kIGxvc2Ugb3RoZXIgcGVvcGxlcycgY29tbWl0cyBmcm9tIHRoZXJlLgorCitXaXRoICctLWZvcmNlJywgdGhlIGZhc3QgZm9yd2FyZCBjaGVjayBpcyBkaXNhYmxlZCBmb3IgYWxsIHJlZnMuCisKK09wdGlvbmFsbHksIGEgPHJlZj4gcGFyYW1ldGVyIGNhbiBiZSBwcmVmaXhlZCB3aXRoIGEgcGx1cyAnKycgc2lnbgordG8gZGlzYWJsZSB0aGUgZmFzdC1mb3J3YXJkIGNoZWNrIG9ubHkgb24gdGhhdCByZWYuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTmljayBIZW5nZXZlbGQgPG5pY2toQHJlYWN0cml4LmNvbT4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgTmljayBIZW5nZXZlbGQKKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1pbWFwLXNlbmQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtaW1hcC1zZW5kLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjJiNzNjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtaW1hcC1zZW5kLnR4dApAQCAtMCwwICsxLDYyIEBACitnaXQtaW1hcC1zZW5kKDEpCis9PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1pbWFwLXNlbmQgLSBEdW1wIGEgbWFpbGJveCBmcm9tIHN0ZGluIGludG8gYW4gaW1hcCBmb2xkZXIKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtaW1hcC1zZW5kJworCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhpcyBjb21tYW5kIHVwbG9hZHMgYSBtYWlsYm94IGdlbmVyYXRlZCB3aXRoIGdpdC1mb3JtYXQtcGF0Y2gKK2ludG8gYW4gaW1hcCBkcmFmdHMgZm9sZGVyLiAgVGhpcyBhbGxvd3MgcGF0Y2hlcyB0byBiZSBzZW50IGFzCitvdGhlciBlbWFpbCBpcyBzZW50IHdpdGggbWFpbCBjbGllbnRzIHRoYXQgY2Fubm90IHJlYWQgbWFpbGJveAorZmlsZXMgZGlyZWN0bHkuCisKK1R5cGljYWwgdXNhZ2UgaXMgc29tZXRoaW5nIGxpa2U6CisKK2dpdC1mb3JtYXQtcGF0Y2ggLS1zaWdub2ZmIC0tc3Rkb3V0IC0tYXR0YWNoIG9yaWdpbiB8IGdpdC1pbWFwLXNlbmQKKworCitDT05GSUdVUkFUSU9OCistLS0tLS0tLS0tLS0tCisKK2dpdC1pbWFwLXNlbmQgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyB2YWx1ZXMgaW4gdGhlIHJlcG9zaXRvcnkKK2NvbmZpZ3VyYXRpb24gZmlsZSAoc2hvd24gd2l0aCBleGFtcGxlcyk6CisKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCitbaW1hcF0KKyAgICBGb2xkZXIgPSAiSU5CT1guRHJhZnRzIgorCitbaW1hcF0KKyAgICBUdW5uZWwgPSAic3NoIC1xIHVzZXJAc2VydmVyLmNvbSAvdXNyL2Jpbi9pbWFwZCAuL01haWxkaXIgMj4gL2Rldi9udWxsIgorCitbaW1hcF0KKyAgICBIb3N0ID0gaW1hcC5zZXJ2ZXIuY29tCisgICAgVXNlciA9IGJvYgorICAgIFBhc3MgPSBwd2QKKyAgICBQb3J0ID0gMTQzCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCisKK0JVR1MKKy0tLS0KK0RvZXNuJ3QgaGFuZGxlIGxpbmVzIHN0YXJ0aW5nIHdpdGggIkZyb20gIiBpbiB0aGUgbWVzc2FnZSBib2R5LgorCisKK0F1dGhvcgorLS0tLS0tCitEZXJpdmVkIGZyb20gaXN5bmMgMS4wLjEgYnkgTWlrZSBNY0Nvcm1hY2suCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IE1pa2UgTWNDb3JtYWNrCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtaW5kZXgtcGFjay50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1pbmRleC1wYWNrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzgyNWI2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtaW5kZXgtcGFjay50eHQKQEAgLTAsMCArMSwxMDMgQEAKK2dpdC1pbmRleC1wYWNrKDEpCis9PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtaW5kZXgtcGFjayAtIEJ1aWxkIHBhY2sgaW5kZXggZmlsZSBmb3IgYW4gZXhpc3RpbmcgcGFja2VkIGFyY2hpdmUKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtaW5kZXgtcGFjaycgWy12XSBbLW8gPGluZGV4LWZpbGU+XSA8cGFjay1maWxlPgorJ2dpdC1pbmRleC1wYWNrJyAtLXN0ZGluIFstLWZpeC10aGluXSBbLS1rZWVwXSBbLXZdIFstbyA8aW5kZXgtZmlsZT5dCisgICAgICAgICAgICAgICAgIFs8cGFjay1maWxlPl0KKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1JlYWRzIGEgcGFja2VkIGFyY2hpdmUgKC5wYWNrKSBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZSwgYW5kCitidWlsZHMgYSBwYWNrIGluZGV4IGZpbGUgKC5pZHgpIGZvciBpdC4gIFRoZSBwYWNrZWQgYXJjaGl2ZQordG9nZXRoZXIgd2l0aCB0aGUgcGFjayBpbmRleCBjYW4gdGhlbiBiZSBwbGFjZWQgaW4gdGhlCitvYmplY3RzL3BhY2svIGRpcmVjdG9yeSBvZiBhIGdpdCByZXBvc2l0b3J5LgorCisKK09QVElPTlMKKy0tLS0tLS0KKy12OjoKKwlCZSB2ZXJib3NlIGFib3V0IHdoYXQgaXMgZ29pbmcgb24sIGluY2x1ZGluZyBwcm9ncmVzcyBzdGF0dXMuCisKKy1vIDxpbmRleC1maWxlPjo6CisJV3JpdGUgdGhlIGdlbmVyYXRlZCBwYWNrIGluZGV4IGludG8gdGhlIHNwZWNpZmllZAorCWZpbGUuICBXaXRob3V0IHRoaXMgb3B0aW9uIHRoZSBuYW1lIG9mIHBhY2sgaW5kZXgKKwlmaWxlIGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIG5hbWUgb2YgcGFja2VkIGFyY2hpdmUKKwlmaWxlIGJ5IHJlcGxhY2luZyAucGFjayB3aXRoIC5pZHggKGFuZCB0aGUgcHJvZ3JhbQorCWZhaWxzIGlmIHRoZSBuYW1lIG9mIHBhY2tlZCBhcmNoaXZlIGRvZXMgbm90IGVuZAorCXdpdGggLnBhY2spLgorCistLXN0ZGluOjoKKwlXaGVuIHRoaXMgZmxhZyBpcyBwcm92aWRlZCwgdGhlIHBhY2sgaXMgcmVhZCBmcm9tIHN0ZGluCisJaW5zdGVhZCBhbmQgYSBjb3B5IGlzIHRoZW4gd3JpdHRlbiB0byA8cGFjay1maWxlPi4gSWYKKwk8cGFjay1maWxlPiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgcGFjayBpcyB3cml0dGVuIHRvCisJb2JqZWN0cy9wYWNrLyBkaXJlY3Rvcnkgb2YgdGhlIGN1cnJlbnQgZ2l0IHJlcG9zaXRvcnkgd2l0aAorCWEgZGVmYXVsdCBuYW1lIGRldGVybWluZWQgZnJvbSB0aGUgcGFjayBjb250ZW50LiAgSWYKKwk8cGFjay1maWxlPiBpcyBub3Qgc3BlY2lmaWVkIGNvbnNpZGVyIHVzaW5nIC0ta2VlcCB0bworCXByZXZlbnQgYSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIHRoaXMgcHJvY2VzcyBhbmQKKwlsaW5rZ2l0OmdpdC1yZXBhY2tbMV0uCisKKy0tZml4LXRoaW46OgorCUl0IGlzIHBvc3NpYmxlIGZvciBsaW5rZ2l0OmdpdC1wYWNrLW9iamVjdHNbMV0gdG8gYnVpbGQKKwkidGhpbiIgcGFjaywgd2hpY2ggcmVjb3JkcyBvYmplY3RzIGluIGRlbHRpZmllZCBmb3JtIGJhc2VkIG9uCisJb2JqZWN0cyBub3QgaW5jbHVkZWQgaW4gdGhlIHBhY2sgdG8gcmVkdWNlIG5ldHdvcmsgdHJhZmZpYy4KKwlUaG9zZSBvYmplY3RzIGFyZSBleHBlY3RlZCB0byBiZSBwcmVzZW50IG9uIHRoZSByZWNlaXZpbmcgZW5kCisJYW5kIHRoZXkgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgcGFjayBmb3IgdGhhdCBwYWNrIHRvIGJlIHNlbGYKKwljb250YWluZWQgYW5kIGluZGV4YWJsZS4gV2l0aG91dCB0aGlzIG9wdGlvbiBhbnkgYXR0ZW1wdCB0bworCWluZGV4IGEgdGhpbiBwYWNrIHdpbGwgZmFpbC4gVGhpcyBvcHRpb24gb25seSBtYWtlcyBzZW5zZSBpbgorCWNvbmp1bmN0aW9uIHdpdGggLS1zdGRpbi4KKworLS1rZWVwOjoKKwlCZWZvcmUgbW92aW5nIHRoZSBpbmRleCBpbnRvIGl0cyBmaW5hbCBkZXN0aW5hdGlvbgorCWNyZWF0ZSBhbiBlbXB0eSAua2VlcCBmaWxlIGZvciB0aGUgYXNzb2NpYXRlZCBwYWNrIGZpbGUuCisJVGhpcyBvcHRpb24gaXMgdXN1YWxseSBuZWNlc3Nhcnkgd2l0aCAtLXN0ZGluIHRvIHByZXZlbnQgYQorCXNpbXVsdGFuZW91cyBsaW5rZ2l0OmdpdC1yZXBhY2tbMV0gcHJvY2VzcyBmcm9tIGRlbGV0aW5nCisJdGhlIG5ld2x5IGNvbnN0cnVjdGVkIHBhY2sgYW5kIGluZGV4IGJlZm9yZSByZWZzIGNhbiBiZQorCXVwZGF0ZWQgdG8gdXNlIG9iamVjdHMgY29udGFpbmVkIGluIHRoZSBwYWNrLgorCistLWtlZXA9J3doeSc6OgorCUxpa2UgLS1rZWVwIGNyZWF0ZSBhIC5rZWVwIGZpbGUgYmVmb3JlIG1vdmluZyB0aGUgaW5kZXggaW50bworCWl0cyBmaW5hbCBkZXN0aW5hdGlvbiwgYnV0IHJhdGhlciB0aGFuIGNyZWF0aW5nIGFuIGVtcHR5IGZpbGUKKwlwbGFjZSAnd2h5JyBmb2xsb3dlZCBieSBhbiBMRiBpbnRvIHRoZSAua2VlcCBmaWxlLiAgVGhlICd3aHknCisJbWVzc2FnZSBjYW4gbGF0ZXIgYmUgc2VhcmNoZWQgZm9yIHdpdGhpbiBhbGwgLmtlZXAgZmlsZXMgdG8KKwlsb2NhdGUgYW55IHdoaWNoIGhhdmUgb3V0bGl2ZWQgdGhlaXIgdXNlZnVsbmVzcy4KKworLS1pbmRleC12ZXJzaW9uPTx2ZXJzaW9uPlssPG9mZnNldD5dOjoKKwlUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIHRlc3Qgc3VpdGUgb25seS4gSXQgYWxsb3dzCisJdG8gZm9yY2UgdGhlIHZlcnNpb24gZm9yIHRoZSBnZW5lcmF0ZWQgcGFjayBpbmRleCwgYW5kIHRvIGZvcmNlCisJNjQtYml0IGluZGV4IGVudHJpZXMgb24gb2JqZWN0cyBsb2NhdGVkIGFib3ZlIHRoZSBnaXZlbiBvZmZzZXQuCisKKy0tc3RyaWN0OjoKKwlEaWUsIGlmIHRoZSBwYWNrIGNvbnRhaW5zIGJyb2tlbiBvYmplY3RzIG9yIGxpbmtzLgorCisKK05vdGUKKy0tLS0KKworT25jZSB0aGUgaW5kZXggaGFzIGJlZW4gY3JlYXRlZCwgdGhlIGxpc3Qgb2Ygb2JqZWN0IG5hbWVzIGlzIHNvcnRlZAorYW5kIHRoZSBTSEExIGhhc2ggb2YgdGhhdCBsaXN0IGlzIHByaW50ZWQgdG8gc3Rkb3V0LiBJZiAtLXN0ZGluIHdhcworYWxzbyB1c2VkIHRoZW4gdGhpcyBpcyBwcmVmaXhlZCBieSBlaXRoZXIgInBhY2tcdCIsIG9yICJrZWVwXHQiIGlmIGEKK25ldyAua2VlcCBmaWxlIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4gVGhpcyBpcyB1c2VmdWwgdG8gcmVtb3ZlIGEKKy5rZWVwIGZpbGUgdXNlZCBhcyBhIGxvY2sgdG8gcHJldmVudCB0aGUgcmFjZSB3aXRoIGxpbmtnaXQ6Z2l0LXJlcGFja1sxXQorbWVudGlvbmVkIGFib3ZlLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IFNlcmdleSBWbGFzb3YgPHZzdUBhbHRsaW51eC5ydT4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBTZXJnZXkgVmxhc292CisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtaW5pdC1kYi50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1pbml0LWRiLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzljYWJiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtaW5pdC1kYi50eHQKQEAgLTAsMCArMSwxOCBAQAorZ2l0LWluaXQtZGIoMSkKKz09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1pbml0LWRiIC0gQ3JlYXRlcyBhbiBlbXB0eSBnaXQgcmVwb3NpdG9yeQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1pbml0LWRiJyBbLXEgfCAtLXF1aWV0XSBbLS10ZW1wbGF0ZT08dGVtcGxhdGVfZGlyZWN0b3J5Pl0gWy0tc2hhcmVkWz08cGVybWlzc2lvbnM+XV0KKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworVGhpcyBpcyBhIHN5bm9ueW0gZm9yIGxpbmtnaXQ6Z2l0LWluaXRbMV0uICBQbGVhc2UgcmVmZXIgdG8gdGhlCitkb2N1bWVudGF0aW9uIG9mIHRoYXQgY29tbWFuZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWluaXQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtaW5pdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI5MTRkYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWluaXQudHh0CkBAIC0wLDAgKzEsMTE0IEBACitnaXQtaW5pdCgxKQorPT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWluaXQgLSBDcmVhdGUgYW4gZW1wdHkgZ2l0IHJlcG9zaXRvcnkgb3IgcmVpbml0aWFsaXplIGFuIGV4aXN0aW5nIG9uZQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1pbml0JyBbLXEgfCAtLXF1aWV0XSBbLS10ZW1wbGF0ZT08dGVtcGxhdGVfZGlyZWN0b3J5Pl0gWy0tc2hhcmVkWz08cGVybWlzc2lvbnM+XV0KKworCitPUFRJT05TCistLS0tLS0tCisKKy0tCisKKy1xLCBcLS1xdWlldDo6CisKK09ubHkgcHJpbnQgZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMsIGFsbCBvdGhlciBvdXRwdXQgd2lsbCBiZSBzdXBwcmVzc2VkLgorCistLXRlbXBsYXRlPTx0ZW1wbGF0ZV9kaXJlY3Rvcnk+OjoKKworUHJvdmlkZSB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggdGVtcGxhdGVzIHdpbGwgYmUgdXNlZC4gIFRoZSBkZWZhdWx0IHRlbXBsYXRlCitkaXJlY3RvcnkgaXMgYC91c3Ivc2hhcmUvZ2l0LWNvcmUvdGVtcGxhdGVzYC4KKworV2hlbiBzcGVjaWZpZWQsIGA8dGVtcGxhdGVfZGlyZWN0b3J5PmAgaXMgdXNlZCBhcyB0aGUgc291cmNlIG9mIHRoZSB0ZW1wbGF0ZQorZmlsZXMgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQuICBUaGUgdGVtcGxhdGUgZmlsZXMgaW5jbHVkZSBzb21lIGRpcmVjdG9yeQorc3RydWN0dXJlLCBzb21lIHN1Z2dlc3RlZCAiZXhjbHVkZSBwYXR0ZXJucyIsIGFuZCBjb3BpZXMgb2Ygbm9uLWV4ZWN1dGluZworImhvb2siIGZpbGVzLiAgVGhlIHN1Z2dlc3RlZCBwYXR0ZXJucyBhbmQgaG9vayBmaWxlcyBhcmUgYWxsIG1vZGlmaWFibGUgYW5kCitleHRlbnNpYmxlLgorCistLXNoYXJlZFs9e2ZhbHNlfHRydWV8dW1hc2t8Z3JvdXB8YWxsfHdvcmxkfGV2ZXJ5Ym9keX1dOjoKKworU3BlY2lmeSB0aGF0IHRoZSBnaXQgcmVwb3NpdG9yeSBpcyB0byBiZSBzaGFyZWQgYW1vbmdzdCBzZXZlcmFsIHVzZXJzLiAgVGhpcworYWxsb3dzIHVzZXJzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBncm91cCB0byBwdXNoIGludG8gdGhhdAorcmVwb3NpdG9yeS4gIFdoZW4gc3BlY2lmaWVkLCB0aGUgY29uZmlnIHZhcmlhYmxlICJjb3JlLnNoYXJlZFJlcG9zaXRvcnkiIGlzCitzZXQgc28gdGhhdCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgdW5kZXIgYCRHSVRfRElSYCBhcmUgY3JlYXRlZCB3aXRoIHRoZQorcmVxdWVzdGVkIHBlcm1pc3Npb25zLiAgV2hlbiBub3Qgc3BlY2lmaWVkLCBnaXQgd2lsbCB1c2UgcGVybWlzc2lvbnMgcmVwb3J0ZWQKK2J5IHVtYXNrKDIpLgorCitUaGUgb3B0aW9uIGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgdmFsdWVzLCBkZWZhdWx0aW5nIHRvICdncm91cCcgaWYgbm8gdmFsdWUKK2lzIGdpdmVuOgorCisgLSAndW1hc2snIChvciAnZmFsc2UnKTogVXNlIHBlcm1pc3Npb25zIHJlcG9ydGVkIGJ5IHVtYXNrKDIpLiBUaGUgZGVmYXVsdCwKKyAgIHdoZW4gYC0tc2hhcmVkYCBpcyBub3Qgc3BlY2lmaWVkLgorCisgLSAnZ3JvdXAnIChvciAndHJ1ZScpOiBNYWtlIHRoZSByZXBvc2l0b3J5IGdyb3VwLXdyaXRhYmxlLCAoYW5kIGcrc3gsIHNpbmNlCisgICB0aGUgZ2l0IGdyb3VwIG1heSBiZSBub3QgdGhlIHByaW1hcnkgZ3JvdXAgb2YgYWxsIHVzZXJzKS4KKworIC0gJ2FsbCcgKG9yICd3b3JsZCcgb3IgJ2V2ZXJ5Ym9keScpOiBTYW1lIGFzICdncm91cCcsIGJ1dCBtYWtlIHRoZSByZXBvc2l0b3J5CisgICByZWFkYWJsZSBieSBhbGwgdXNlcnMuCisKK0J5IGRlZmF1bHQsIHRoZSBjb25maWd1cmF0aW9uIGZsYWcgcmVjZWl2ZS5kZW55Tm9uRmFzdEZvcndhcmRzIGlzIGVuYWJsZWQKK2luIHNoYXJlZCByZXBvc2l0b3JpZXMsIHNvIHRoYXQgeW91IGNhbm5vdCBmb3JjZSBhIG5vbiBmYXN0LWZvcndhcmRpbmcgcHVzaAoraW50byBpdC4KKworLS0KKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoaXMgY29tbWFuZCBjcmVhdGVzIGFuIGVtcHR5IGdpdCByZXBvc2l0b3J5IC0gYmFzaWNhbGx5IGEgYC5naXRgIGRpcmVjdG9yeQord2l0aCBzdWJkaXJlY3RvcmllcyBmb3IgYG9iamVjdHNgLCBgcmVmcy9oZWFkc2AsIGByZWZzL3RhZ3NgLCBhbmQKK3RlbXBsYXRlIGZpbGVzLgorQW4gaW5pdGlhbCBgSEVBRGAgZmlsZSB0aGF0IHJlZmVyZW5jZXMgdGhlIEhFQUQgb2YgdGhlIG1hc3RlciBicmFuY2gKK2lzIGFsc28gY3JlYXRlZC4KKworSWYgdGhlIGAkR0lUX0RJUmAgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0IHRoZW4gaXQgc3BlY2lmaWVzIGEgcGF0aAordG8gdXNlIGluc3RlYWQgb2YgYC4vLmdpdGAgZm9yIHRoZSBiYXNlIG9mIHRoZSByZXBvc2l0b3J5LgorCitJZiB0aGUgb2JqZWN0IHN0b3JhZ2UgZGlyZWN0b3J5IGlzIHNwZWNpZmllZCB2aWEgdGhlIGAkR0lUX09CSkVDVF9ESVJFQ1RPUllgCitlbnZpcm9ubWVudCB2YXJpYWJsZSB0aGVuIHRoZSBzaGExIGRpcmVjdG9yaWVzIGFyZSBjcmVhdGVkIHVuZGVybmVhdGggLQorb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IGAkR0lUX0RJUi9vYmplY3RzYCBkaXJlY3RvcnkgaXMgdXNlZC4KKworUnVubmluZyBgZ2l0LWluaXRgIGluIGFuIGV4aXN0aW5nIHJlcG9zaXRvcnkgaXMgc2FmZS4gSXQgd2lsbCBub3Qgb3ZlcndyaXRlCit0aGluZ3MgdGhhdCBhcmUgYWxyZWFkeSB0aGVyZS4gVGhlIHByaW1hcnkgcmVhc29uIGZvciByZXJ1bm5pbmcgYGdpdC1pbml0YAoraXMgdG8gcGljayB1cCBuZXdseSBhZGRlZCB0ZW1wbGF0ZXMuCisKK05vdGUgdGhhdCBgZ2l0LWluaXRgIGlzIHRoZSBzYW1lIGFzIGBnaXQtaW5pdC1kYmAuICBUaGUgY29tbWFuZAord2FzIHByaW1hcmlseSBtZWFudCB0byBpbml0aWFsaXplIHRoZSBvYmplY3QgZGF0YWJhc2UsIGJ1dCBvdmVyCit0aW1lIGl0IGhhcyBiZWNvbWUgcmVzcG9uc2libGUgZm9yIHNldHRpbmcgdXAgdGhlIG90aGVyIGFzcGVjdHMKK29mIHRoZSByZXBvc2l0b3J5LCBzdWNoIGFzIGluc3RhbGxpbmcgdGhlIGRlZmF1bHQgaG9va3MgYW5kCitzZXR0aW5nIHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcy4gIFRoZSBvbGQgbmFtZSBpcyByZXRhaW5lZAorZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcmVhc29ucy4KKworCitFWEFNUExFUworLS0tLS0tLS0KKworU3RhcnQgYSBuZXcgZ2l0IHJlcG9zaXRvcnkgZm9yIGFuIGV4aXN0aW5nIGNvZGUgYmFzZTo6CisrCistLS0tLS0tLS0tLS0tLS0tCiskIGNkIC9wYXRoL3RvL215L2NvZGViYXNlCiskIGdpdC1pbml0ICAgICAgPDE+CiskIGdpdC1hZGQgLiAgICAgPDI+CistLS0tLS0tLS0tLS0tLS0tCisrCis8MT4gcHJlcGFyZSAvcGF0aC90by9teS9jb2RlYmFzZS8uZ2l0IGRpcmVjdG9yeQorPDI+IGFkZCBhbGwgZXhpc3RpbmcgZmlsZSB0byB0aGUgaW5kZXgKKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWluc3Rhd2ViLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWluc3Rhd2ViLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWYxNTMyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtaW5zdGF3ZWIudHh0CkBAIC0wLDAgKzEsODkgQEAKK2dpdC1pbnN0YXdlYigxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1pbnN0YXdlYiAtIEluc3RhbnRseSBicm93c2UgeW91ciB3b3JraW5nIHJlcG9zaXRvcnkgaW4gZ2l0d2ViCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1pbnN0YXdlYicgWy0tbG9jYWxdIFstLWh0dHBkPTxodHRwZD5dIFstLXBvcnQ9PHBvcnQ+XQorICAgICAgICAgICAgICAgWy0tYnJvd3Nlcj08YnJvd3Nlcj5dCisnZ2l0LWluc3Rhd2ViJyBbLS1zdGFydF0gWy0tc3RvcF0gWy0tcmVzdGFydF0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitBIHNpbXBsZSBzY3JpcHQgdG8gc2V0dXAgZ2l0d2ViIGFuZCBhIHdlYiBzZXJ2ZXIgZm9yIGJyb3dzaW5nIHRoZSBsb2NhbAorcmVwb3NpdG9yeS4KKworT1BUSU9OUworLS0tLS0tLQorCistbHwtLWxvY2FsOjoKKwlPbmx5IGJpbmQgdGhlIHdlYiBzZXJ2ZXIgdG8gdGhlIGxvY2FsIElQICgxMjcuMC4wLjEpLgorCistZHwtLWh0dHBkOjoKKwlUaGUgSFRUUCBkYWVtb24gY29tbWFuZC1saW5lIHRoYXQgd2lsbCBiZSBleGVjdXRlZC4KKwlDb21tYW5kLWxpbmUgb3B0aW9ucyBtYXkgYmUgc3BlY2lmaWVkIGhlcmUsIGFuZCB0aGUKKwljb25maWd1cmF0aW9uIGZpbGUgd2lsbCBiZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBjb21tYW5kLWxpbmUuCisJQ3VycmVudGx5IGxpZ2h0dHBkLCBhcGFjaGUyIGFuZCB3ZWJyaWNrIGFyZSBzdXBwb3J0ZWQuCisJKERlZmF1bHQ6IGxpZ2h0dHBkKQorCistbXwtLW1vZHVsZS1wYXRoOjoKKwlUaGUgbW9kdWxlIHBhdGggKG9ubHkgbmVlZGVkIGlmIGh0dHBkIGlzIEFwYWNoZSkuCisJKERlZmF1bHQ6IC91c3IvbGliL2FwYWNoZTIvbW9kdWxlcykKKworLXB8LS1wb3J0OjoKKwlUaGUgcG9ydCBudW1iZXIgdG8gYmluZCB0aGUgaHR0cGQgdG8uICAoRGVmYXVsdDogMTIzNCkKKworLWJ8LS1icm93c2VyOjoKKwlUaGUgd2ViIGJyb3dzZXIgdGhhdCBzaG91bGQgYmUgdXNlZCB0byB2aWV3IHRoZSBnaXR3ZWIKKwlwYWdlLiBUaGlzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSAnZ2l0LXdlYi0tYnJvd3NlJyBoZWxwZXIKKwlzY3JpcHQgYWxvbmcgd2l0aCB0aGUgVVJMIG9mIHRoZSBnaXR3ZWIgaW5zdGFuY2UuIFNlZQorCWxpbmtnaXQ6Z2l0LXdlYi0tYnJvd3NlWzFdIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMuIElmCisJdGhlIHNjcmlwdCBmYWlscywgdGhlIFVSTCB3aWxsIGJlIHByaW50ZWQgdG8gc3Rkb3V0LgorCistLXN0YXJ0OjoKKwlTdGFydCB0aGUgaHR0cGQgaW5zdGFuY2UgYW5kIGV4aXQuICBUaGlzIGRvZXMgbm90IGdlbmVyYXRlCisJYW55IG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIGZvciBzcGF3bmluZyBhIG5ldyBpbnN0YW5jZS4KKworLS1zdG9wOjoKKwlTdG9wIHRoZSBodHRwZCBpbnN0YW5jZSBhbmQgZXhpdC4gIFRoaXMgZG9lcyBub3QgZ2VuZXJhdGUKKwlhbnkgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIHNwYXduaW5nIGEgbmV3IGluc3RhbmNlLAorCW5vciBkb2VzIGl0IGNsb3NlIHRoZSBicm93c2VyLgorCistLXJlc3RhcnQ6OgorCVJlc3RhcnQgdGhlIGh0dHBkIGluc3RhbmNlIGFuZCBleGl0LiAgVGhpcyBkb2VzIG5vdCBnZW5lcmF0ZQorCWFueSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBmb3Igc3Bhd25pbmcgYSBuZXcgaW5zdGFuY2UuCisKK0NPTkZJR1VSQVRJT04KKy0tLS0tLS0tLS0tLS0KKworWW91IG1heSBzcGVjaWZ5IGNvbmZpZ3VyYXRpb24gaW4geW91ciAuZ2l0L2NvbmZpZworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorW2luc3Rhd2ViXQorCWxvY2FsID0gdHJ1ZQorCWh0dHBkID0gYXBhY2hlMiAtZgorCXBvcnQgPSA0MzIxCisJYnJvd3NlciA9IGtvbnF1ZXJvcgorCW1vZHVsZXBhdGggPSAvdXNyL2xpYi9hcGFjaGUyL21vZHVsZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgJ2luc3Rhd2ViLmJyb3dzZXInIGlzIG5vdCBzZXQsCisnd2ViLmJyb3dzZXInIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIGlmIGl0IGlzIGRlZmluZWQuIFNlZQorbGlua2dpdDpnaXQtd2ViLS1icm93c2VbMV0gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcy4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgRXJpYyBXb25nIDxub3JtYWxwZXJzb25AeWhidC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEVyaWMgV29uZyA8bm9ybWFscGVyc29uQHloYnQubmV0Pi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1sb2cudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbG9nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmFlZTRiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbG9nLnR4dApAQCAtMCwwICsxLDExNSBAQAorZ2l0LWxvZygxKQorPT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbG9nIC0gU2hvdyBjb21taXQgbG9ncworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1sb2cnIDxvcHRpb24+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorU2hvd3MgdGhlIGNvbW1pdCBsb2dzLgorCitUaGUgY29tbWFuZCB0YWtlcyBvcHRpb25zIGFwcGxpY2FibGUgdG8gdGhlIGxpbmtnaXQ6Z2l0LXJldi1saXN0WzFdCitjb21tYW5kIHRvIGNvbnRyb2wgd2hhdCBpcyBzaG93biBhbmQgaG93LCBhbmQgb3B0aW9ucyBhcHBsaWNhYmxlIHRvCit0aGUgbGlua2dpdDpnaXQtZGlmZi10cmVlWzFdIGNvbW1hbmRzIHRvIGNvbnRyb2wgaG93IHRoZSBjaGFuZ2VzCitlYWNoIGNvbW1pdCBpbnRyb2R1Y2VzIGFyZSBzaG93bi4KKworCitPUFRJT05TCistLS0tLS0tCisKKzpnaXQtbG9nOiAxCitpbmNsdWRlOjpkaWZmLW9wdGlvbnMudHh0W10KKworLTxuPjo6CisJTGltaXRzIHRoZSBudW1iZXIgb2YgY29tbWl0cyB0byBzaG93LgorCis8c2luY2U+Li48dW50aWw+OjoKKwlTaG93IG9ubHkgY29tbWl0cyBiZXR3ZWVuIHRoZSBuYW1lZCB0d28gY29tbWl0cy4gIFdoZW4KKwllaXRoZXIgPHNpbmNlPiBvciA8dW50aWw+IGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCisJYEhFQURgLCBpLmUuIHRoZSB0aXAgb2YgdGhlIGN1cnJlbnQgYnJhbmNoLgorCUZvciBhIG1vcmUgY29tcGxldGUgbGlzdCBvZiB3YXlzIHRvIHNwZWxsIDxzaW5jZT4KKwlhbmQgPHVudGlsPiwgc2VlICJTUEVDSUZZSU5HIFJFVklTSU9OUyIgc2VjdGlvbiBpbgorCWxpbmtnaXQ6Z2l0LXJldi1wYXJzZVsxXS4KKworLS1kZWNvcmF0ZTo6CisJUHJpbnQgb3V0IHRoZSByZWYgbmFtZXMgb2YgYW55IGNvbW1pdHMgdGhhdCBhcmUgc2hvd24uCisKKy0tZnVsbC1kaWZmOjoKKwlXaXRob3V0IHRoaXMgZmxhZywgImdpdCBsb2cgLXAgPHBhdGhzPi4uLiIgc2hvd3MgY29tbWl0cyB0aGF0CisJdG91Y2ggdGhlIHNwZWNpZmllZCBwYXRocywgYW5kIGRpZmZzIGFib3V0IHRoZSBzYW1lIHNwZWNpZmllZAorCXBhdGhzLiAgV2l0aCB0aGlzLCB0aGUgZnVsbCBkaWZmIGlzIHNob3duIGZvciBjb21taXRzIHRoYXQgdG91Y2gKKwl0aGUgc3BlY2lmaWVkIHBhdGhzOyB0aGlzIG1lYW5zIHRoYXQgIjxwYXRocz4uLi4iIGxpbWl0cyBvbmx5CisJY29tbWl0cywgYW5kIGRvZXNuJ3QgbGltaXQgZGlmZiBmb3IgdGhvc2UgY29tbWl0cy4KKworLS1mb2xsb3c6OgorCUNvbnRpbnVlIGxpc3RpbmcgdGhlIGhpc3Rvcnkgb2YgYSBmaWxlIGJleW9uZCByZW5hbWVzLgorCistLWxvZy1zaXplOjoKKwlCZWZvcmUgdGhlIGxvZyBtZXNzYWdlIHByaW50IG91dCBpdHMgc2l6ZSBpbiBieXRlcy4gSW50ZW5kZWQKKwltYWlubHkgZm9yIHBvcmNlbGFpbiB0b29scyBjb25zdW1wdGlvbi4gSWYgZ2l0IGlzIHVuYWJsZSB0bworCXByb2R1Y2UgYSB2YWxpZCB2YWx1ZSBzaXplIGlzIHNldCB0byB6ZXJvLgorCU5vdGUgdGhhdCBvbmx5IG1lc3NhZ2UgaXMgY29uc2lkZXJlZCwgaWYgYWxzbyBhIGRpZmYgaXMgc2hvd24KKwlpdHMgc2l6ZSBpcyBub3QgaW5jbHVkZWQuCisKKzxwYXRocz4uLi46OgorCVNob3cgb25seSBjb21taXRzIHRoYXQgYWZmZWN0IHRoZSBzcGVjaWZpZWQgcGF0aHMuCisKKworaW5jbHVkZTo6cmV2LWxpc3Qtb3B0aW9ucy50eHRbXQorCitpbmNsdWRlOjpwcmV0dHktZm9ybWF0cy50eHRbXQorCitpbmNsdWRlOjpkaWZmLWdlbmVyYXRlLXBhdGNoLnR4dFtdCisKK0V4YW1wbGVzCistLS0tLS0tLQorZ2l0IGxvZyAtLW5vLW1lcmdlczo6CisKKwlTaG93IHRoZSB3aG9sZSBjb21taXQgaGlzdG9yeSwgYnV0IHNraXAgYW55IG1lcmdlcworCitnaXQgbG9nIHYyLjYuMTIuLiBpbmNsdWRlL3Njc2kgZHJpdmVycy9zY3NpOjoKKworCVNob3cgYWxsIGNvbW1pdHMgc2luY2UgdmVyc2lvbiAndjIuNi4xMicgdGhhdCBjaGFuZ2VkIGFueSBmaWxlCisJaW4gdGhlIGluY2x1ZGUvc2NzaSBvciBkcml2ZXJzL3Njc2kgc3ViZGlyZWN0b3JpZXMKKworZ2l0IGxvZyAtLXNpbmNlPSIyIHdlZWtzIGFnbyIgXC0tIGdpdGs6OgorCisJU2hvdyB0aGUgY2hhbmdlcyBkdXJpbmcgdGhlIGxhc3QgdHdvIHdlZWtzIHRvIHRoZSBmaWxlICdnaXRrJy4KKwlUaGUgIi0tIiBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgY29uZnVzaW9uIHdpdGggdGhlICpicmFuY2gqIG5hbWVkCisJJ2dpdGsnCisKK2dpdCBsb2cgLS1uYW1lLXN0YXR1cyByZWxlYXNlLi50ZXN0OjoKKworCVNob3cgdGhlIGNvbW1pdHMgdGhhdCBhcmUgaW4gdGhlICJ0ZXN0IiBicmFuY2ggYnV0IG5vdCB5ZXQKKwlpbiB0aGUgInJlbGVhc2UiIGJyYW5jaCwgYWxvbmcgd2l0aCB0aGUgbGlzdCBvZiBwYXRocworCWVhY2ggY29tbWl0IG1vZGlmaWVzLgorCitnaXQgbG9nIC0tZm9sbG93IGJ1aWx0aW4tcmV2LWxpc3QuYzo6CisKKwlTaG93cyB0aGUgY29tbWl0cyB0aGF0IGNoYW5nZWQgYnVpbHRpbi1yZXYtbGlzdC5jLCBpbmNsdWRpbmcKKwl0aG9zZSBjb21taXRzIHRoYXQgb2NjdXJyZWQgYmVmb3JlIHRoZSBmaWxlIHdhcyBnaXZlbiBpdHMKKwlwcmVzZW50IG5hbWUuCisKK0Rpc2N1c3Npb24KKy0tLS0tLS0tLS0KKworaW5jbHVkZTo6aTE4bi50eHRbXQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbG9zdC1mb3VuZC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1sb3N0LWZvdW5kLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWM3OTdmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbG9zdC1mb3VuZC50eHQKQEAgLTAsMCArMSw4MSBAQAorZ2l0LWxvc3QtZm91bmQoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1sb3N0LWZvdW5kIC0gUmVjb3ZlciBsb3N0IHJlZnMgdGhhdCBsdWNraWx5IGhhdmUgbm90IHlldCBiZWVuIHBydW5lZAorCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtbG9zdC1mb3VuZCcKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKKypOT1RFKjogdGhpcyBjb21tYW5kIGlzIGRlcHJlY2F0ZWQuICBVc2UgbGlua2dpdDpnaXQtZnNja1sxXSB3aXRoCit0aGUgb3B0aW9uICctLWxvc3QtZm91bmQnIGluc3RlYWQuCisKK0ZpbmRzIGRhbmdsaW5nIGNvbW1pdHMgYW5kIHRhZ3MgZnJvbSB0aGUgb2JqZWN0IGRhdGFiYXNlLCBhbmQKK2NyZWF0ZXMgcmVmcyB0byB0aGVtIGluIHRoZSAuZ2l0L2xvc3QtZm91bmQvIGRpcmVjdG9yeS4gIENvbW1pdHMgYW5kCit0YWdzIHRoYXQgZGVyZWZlcmVuY2UgdG8gY29tbWl0cyBhcmUgc3RvcmVkIGluIC5naXQvbG9zdC1mb3VuZC9jb21taXQsCithbmQgb3RoZXIgb2JqZWN0cyBhcmUgc3RvcmVkIGluIC5naXQvbG9zdC1mb3VuZC9vdGhlci4KKworCitPVVRQVVQKKy0tLS0tLQorUHJpbnRzIHRvIHN0YW5kYXJkIG91dHB1dCB0aGUgb2JqZWN0IG5hbWVzIGFuZCBvbmUtbGluZSBkZXNjcmlwdGlvbnMKK29mIGFueSBjb21taXRzIG9yIHRhZ3MgZm91bmQuCisKK0VYQU1QTEUKKy0tLS0tLS0KKworU3VwcG9zZSB5b3UgcnVuICdnaXQgdGFnIC1mJyBhbmQgbWlzdHlwZSB0aGUgdGFnIHRvIG92ZXJ3cml0ZS4KK1RoZSByZWYgdG8geW91ciB0YWcgaXMgb3ZlcndyaXR0ZW4sIGJ1dCB1bnRpbCB5b3UgcnVuICdnaXQKK3BydW5lJywgdGhlIHRhZyBpdHNlbGYgaXMgc3RpbGwgdGhlcmUuCisKKy0tLS0tLS0tLS0tLQorJCBnaXQgbG9zdC1mb3VuZAorWzFlZjJiMTk2ZDkwOWVlZDUyM2Q0ZjNjOWJmNTRiNzhjZGQ2ODQzYzZdIEdJVCAwLjk5LjljCisuLi4KKy0tLS0tLS0tLS0tLQorCitBbHNvIHlvdSBjYW4gdXNlIGdpdGsgdG8gYnJvd3NlIGhvdyBhbnkgdGFncyBmb3VuZCByZWxhdGUgdG8gZWFjaAorb3RoZXIuCisKKy0tLS0tLS0tLS0tLQorJCBnaXRrICQoY2QgLmdpdC9sb3N0LWZvdW5kL2NvbW1pdCAmJiBlY2hvID8/KikKKy0tLS0tLS0tLS0tLQorCitBZnRlciBtYWtpbmcgc3VyZSB5b3Uga25vdyB3aGljaCB0aGUgb2JqZWN0IGlzIHRoZSB0YWcgeW91IGFyZSBsb29raW5nCitmb3IsIHlvdSBjYW4gcmVjb25uZWN0IGl0IHRvIHlvdXIgcmVndWxhciAuZ2l0L3JlZnMgaGllcmFyY2h5LgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNhdC1maWxlIC10IDFlZjJiMTk2Cit0YWcKKyQgZ2l0IGNhdC1maWxlIHRhZyAxZWYyYjE5Ngorb2JqZWN0IGZhNDFiYmNlOGUzOGM2N2EyMTg0MTVkZTZjZmE1MTBjN2U1MDAzMmEKK3R5cGUgY29tbWl0Cit0YWcgdjAuOTkuOWMKK3RhZ2dlciBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+IDExMzEwNTk1OTQgLTA4MDAKKworR0lUIDAuOTkuOWMKKworVGhpcyBjb250YWlucyB0aGUgZm9sbG93aW5nIGNoYW5nZXMgZnJvbSB0aGUgIm1hc3RlciIgYnJhbmNoLCBzaW5jZQorLi4uCiskIGdpdCB1cGRhdGUtcmVmIHJlZnMvdGFncy9ub3QtbG9zdC1hbnltb3JlIDFlZjJiMTk2CiskIGdpdCByZXYtcGFyc2Ugbm90LWxvc3QtYW55bW9yZQorMWVmMmIxOTZkOTA5ZWVkNTIzZDRmM2M5YmY1NGI3OGNkZDY4NDNjNgorLS0tLS0tLS0tLS0tCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxnaXRzdGVyQHBvYm94LmNvbT4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1scy1maWxlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1scy1maWxlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE5ZWJmNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWxzLWZpbGVzLnR4dApAQCAtMCwwICsxLDE5NSBAQAorZ2l0LWxzLWZpbGVzKDEpCis9PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWxzLWZpbGVzIC0gU2hvdyBpbmZvcm1hdGlvbiBhYm91dCBmaWxlcyBpbiB0aGUgaW5kZXggYW5kIHRoZSB3b3JraW5nIHRyZWUKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtbHMtZmlsZXMnIFstel0gWy10XSBbLXZdCisJCSgtLVtjYWNoZWR8ZGVsZXRlZHxvdGhlcnN8aWdub3JlZHxzdGFnZXx1bm1lcmdlZHxraWxsZWR8bW9kaWZpZWRdKVwqCisJCSgtW2N8ZHxvfGl8c3x1fGt8bV0pXCoKKwkJWy14IDxwYXR0ZXJuPnwtLWV4Y2x1ZGU9PHBhdHRlcm4+XQorCQlbLVggPGZpbGU+fC0tZXhjbHVkZS1mcm9tPTxmaWxlPl0KKwkJWy0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PTxmaWxlPl0KKwkJWy0tZXhjbHVkZS1zdGFuZGFyZF0KKwkJWy0tZXJyb3ItdW5tYXRjaF0gWy0td2l0aC10cmVlPTx0cmVlLWlzaD5dCisJCVstLWZ1bGwtbmFtZV0gWy0tYWJicmV2XSBbLS1dIFs8ZmlsZT5dXCoKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIG1lcmdlcyB0aGUgZmlsZSBsaXN0aW5nIGluIHRoZSBkaXJlY3RvcnkgY2FjaGUgaW5kZXggd2l0aCB0aGUKK2FjdHVhbCB3b3JraW5nIGRpcmVjdG9yeSBsaXN0LCBhbmQgc2hvd3MgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiB0aGUKK3R3by4KKworT25lIG9yIG1vcmUgb2YgdGhlIG9wdGlvbnMgYmVsb3cgbWF5IGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBmaWxlcworc2hvd246CisKK09QVElPTlMKKy0tLS0tLS0KKy1jfC0tY2FjaGVkOjoKKwlTaG93IGNhY2hlZCBmaWxlcyBpbiB0aGUgb3V0cHV0IChkZWZhdWx0KQorCistZHwtLWRlbGV0ZWQ6OgorCVNob3cgZGVsZXRlZCBmaWxlcyBpbiB0aGUgb3V0cHV0CisKKy1tfC0tbW9kaWZpZWQ6OgorCVNob3cgbW9kaWZpZWQgZmlsZXMgaW4gdGhlIG91dHB1dAorCistb3wtLW90aGVyczo6CisJU2hvdyBvdGhlciBmaWxlcyBpbiB0aGUgb3V0cHV0CisKKy1pfC0taWdub3JlZDo6CisJU2hvdyBpZ25vcmVkIGZpbGVzIGluIHRoZSBvdXRwdXQuCisJTm90ZSB0aGF0IHRoaXMgYWxzbyByZXZlcnNlcyBhbnkgZXhjbHVkZSBsaXN0IHByZXNlbnQuCisKKy1zfC0tc3RhZ2U6OgorCVNob3cgc3RhZ2UgZmlsZXMgaW4gdGhlIG91dHB1dAorCistLWRpcmVjdG9yeTo6CisJSWYgYSB3aG9sZSBkaXJlY3RvcnkgaXMgY2xhc3NpZmllZCBhcyAib3RoZXIiLCBzaG93IGp1c3QgaXRzCisJbmFtZSAod2l0aCBhIHRyYWlsaW5nIHNsYXNoKSBhbmQgbm90IGl0cyB3aG9sZSBjb250ZW50cy4KKworLS1uby1lbXB0eS1kaXJlY3Rvcnk6OgorCURvIG5vdCBsaXN0IGVtcHR5IGRpcmVjdG9yaWVzLiBIYXMgbm8gZWZmZWN0IHdpdGhvdXQgLS1kaXJlY3RvcnkuCisKKy11fC0tdW5tZXJnZWQ6OgorCVNob3cgdW5tZXJnZWQgZmlsZXMgaW4gdGhlIG91dHB1dCAoZm9yY2VzIC0tc3RhZ2UpCisKKy1rfC0ta2lsbGVkOjoKKwlTaG93IGZpbGVzIG9uIHRoZSBmaWxlc3lzdGVtIHRoYXQgbmVlZCB0byBiZSByZW1vdmVkIGR1ZQorCXRvIGZpbGUvZGlyZWN0b3J5IGNvbmZsaWN0cyBmb3IgY2hlY2tvdXQtaW5kZXggdG8KKwlzdWNjZWVkLgorCistejo6CisJXDAgbGluZSB0ZXJtaW5hdGlvbiBvbiBvdXRwdXQuCisKKy14fC0tZXhjbHVkZT08cGF0dGVybj46OgorCVNraXBzIGZpbGVzIG1hdGNoaW5nIHBhdHRlcm4uCisJTm90ZSB0aGF0IHBhdHRlcm4gaXMgYSBzaGVsbCB3aWxkY2FyZCBwYXR0ZXJuLgorCistWHwtLWV4Y2x1ZGUtZnJvbT08ZmlsZT46OgorCWV4Y2x1ZGUgcGF0dGVybnMgYXJlIHJlYWQgZnJvbSA8ZmlsZT47IDEgcGVyIGxpbmUuCisKKy0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PTxmaWxlPjo6CisJcmVhZCBhZGRpdGlvbmFsIGV4Y2x1ZGUgcGF0dGVybnMgdGhhdCBhcHBseSBvbmx5IHRvIHRoZQorCWRpcmVjdG9yeSBhbmQgaXRzIHN1YmRpcmVjdG9yaWVzIGluIDxmaWxlPi4KKworLS1leGNsdWRlLXN0YW5kYXJkOjoKKwlBZGQgdGhlIHN0YW5kYXJkIGdpdCBleGNsdXNpb25zOiAuZ2l0L2luZm8vZXhjbHVkZSwgLmdpdGlnbm9yZQorCWluIGVhY2ggZGlyZWN0b3J5LCBhbmQgdGhlIHVzZXIncyBnbG9iYWwgZXhjbHVzaW9uIGZpbGUuCisKKy0tZXJyb3ItdW5tYXRjaDo6CisJSWYgYW55IDxmaWxlPiBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlIGluZGV4LCB0cmVhdCB0aGlzIGFzIGFuCisJZXJyb3IgKHJldHVybiAxKS4KKworLS13aXRoLXRyZWU9PHRyZWUtaXNoPjo6CisJV2hlbiB1c2luZyAtLWVycm9yLXVubWF0Y2ggdG8gZXhwYW5kIHRoZSB1c2VyIHN1cHBsaWVkCisJPGZpbGU+IChpLmUuIHBhdGggcGF0dGVybikgYXJndW1lbnRzIHRvIHBhdGhzLCBwcmV0ZW5kCisJdGhhdCBwYXRocyB3aGljaCB3ZXJlIHJlbW92ZWQgaW4gdGhlIGluZGV4IHNpbmNlIHRoZQorCW5hbWVkIDx0cmVlLWlzaD4gYXJlIHN0aWxsIHByZXNlbnQuICBVc2luZyB0aGlzIG9wdGlvbgorCXdpdGggYC1zYCBvciBgLXVgIG9wdGlvbnMgZG9lcyBub3QgbWFrZSBhbnkgc2Vuc2UuCisKKy10OjoKKwlJZGVudGlmeSB0aGUgZmlsZSBzdGF0dXMgd2l0aCB0aGUgZm9sbG93aW5nIHRhZ3MgKGZvbGxvd2VkIGJ5CisJYSBzcGFjZSkgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggbGluZToKKwlIOjoJY2FjaGVkCisJTTo6CXVubWVyZ2VkCisJUjo6CXJlbW92ZWQvZGVsZXRlZAorCUM6Ogltb2RpZmllZC9jaGFuZ2VkCisJSzo6CXRvIGJlIGtpbGxlZAorCT86OglvdGhlcgorCistdjo6CisJU2ltaWxhciB0byBgLXRgLCBidXQgdXNlIGxvd2VyY2FzZSBsZXR0ZXJzIGZvciBmaWxlcworCXRoYXQgYXJlIG1hcmtlZCBhcyAnYXNzdW1lIHVuY2hhbmdlZCcgKHNlZQorCWxpbmtnaXQ6Z2l0LXVwZGF0ZS1pbmRleFsxXSkuCisKKy0tZnVsbC1uYW1lOjoKKwlXaGVuIHJ1biBmcm9tIGEgc3ViZGlyZWN0b3J5LCB0aGUgY29tbWFuZCB1c3VhbGx5CisJb3V0cHV0cyBwYXRocyByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBUaGlzCisJb3B0aW9uIGZvcmNlcyBwYXRocyB0byBiZSBvdXRwdXQgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QKKwl0b3AgZGlyZWN0b3J5LgorCistLWFiYnJldls9PG4+XTo6CisJSW5zdGVhZCBvZiBzaG93aW5nIHRoZSBmdWxsIDQwLWJ5dGUgaGV4YWRlY2ltYWwgb2JqZWN0CisJbGluZXMsIHNob3cgb25seSBoYW5kZnVsIGhleGRpZ2l0cyBwcmVmaXguCisJTm9uIGRlZmF1bHQgbnVtYmVyIG9mIGRpZ2l0cyBjYW4gYmUgc3BlY2lmaWVkIHdpdGggLS1hYmJyZXY9PG4+LgorCitcLS06OgorCURvIG5vdCBpbnRlcnByZXQgYW55IG1vcmUgYXJndW1lbnRzIGFzIG9wdGlvbnMuCisKKzxmaWxlPjo6CisJRmlsZXMgdG8gc2hvdy4gSWYgbm8gZmlsZXMgYXJlIGdpdmVuIGFsbCBmaWxlcyB3aGljaCBtYXRjaCB0aGUgb3RoZXIKKwlzcGVjaWZpZWQgY3JpdGVyaWEgYXJlIHNob3duLgorCitPdXRwdXQKKy0tLS0tLQorc2hvdyBmaWxlcyBqdXN0IG91dHB1dHMgdGhlIGZpbGVuYW1lIHVubGVzcyAnLS1zdGFnZScgaXMgc3BlY2lmaWVkIGluCit3aGljaCBjYXNlIGl0IG91dHB1dHM6CisKKyAgICAgICAgWzx0YWc+IF08bW9kZT4gPG9iamVjdD4gPHN0YWdlPiA8ZmlsZT4KKworImdpdC1scy1maWxlcyAtLXVubWVyZ2VkIiBhbmQgImdpdC1scy1maWxlcyAtLXN0YWdlIiBjYW4gYmUgdXNlZCB0byBleGFtaW5lCitkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB1bm1lcmdlZCBwYXRocy4KKworRm9yIGFuIHVubWVyZ2VkIHBhdGgsIGluc3RlYWQgb2YgcmVjb3JkaW5nIGEgc2luZ2xlIG1vZGUvU0hBMSBwYWlyLAordGhlIGluZGV4IHJlY29yZHMgdXAgdG8gdGhyZWUgc3VjaCBwYWlyczsgb25lIGZyb20gdHJlZSBPIGluIHN0YWdlCisxLCBBIGluIHN0YWdlIDIsIGFuZCBCIGluIHN0YWdlIDMuICBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSB1c2VkIGJ5Cit0aGUgdXNlciAob3IgdGhlIHBvcmNlbGFpbikgdG8gc2VlIHdoYXQgc2hvdWxkIGV2ZW50dWFsbHkgYmUgcmVjb3JkZWQgYXQgdGhlCitwYXRoLiAoc2VlIGdpdC1yZWFkLXRyZWUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc3RhdGUpCisKK1doZW4gYC16YCBvcHRpb24gaXMgbm90IHVzZWQsIFRBQiwgTEYsIGFuZCBiYWNrc2xhc2ggY2hhcmFjdGVycworaW4gcGF0aG5hbWVzIGFyZSByZXByZXNlbnRlZCBhcyBgXHRgLCBgXG5gLCBhbmQgYFxcYCwKK3Jlc3BlY3RpdmVseS4KKworCitFeGNsdWRlIFBhdHRlcm5zCistLS0tLS0tLS0tLS0tLS0tCisKKydnaXQtbHMtZmlsZXMnIGNhbiB1c2UgYSBsaXN0IG9mICJleGNsdWRlIHBhdHRlcm5zIiB3aGVuCit0cmF2ZXJzaW5nIHRoZSBkaXJlY3RvcnkgdHJlZSBhbmQgZmluZGluZyBmaWxlcyB0byBzaG93IHdoZW4gdGhlCitmbGFncyAtLW90aGVycyBvciAtLWlnbm9yZWQgYXJlIHNwZWNpZmllZC4gIGxpbmtnaXQ6Z2l0aWdub3JlWzVdCitzcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiBleGNsdWRlIHBhdHRlcm5zLgorCitUaGVzZSBleGNsdWRlIHBhdHRlcm5zIGNvbWUgZnJvbSB0aGVzZSBwbGFjZXMsIGluIG9yZGVyOgorCisgIDEuIFRoZSBjb21tYW5kIGxpbmUgZmxhZyAtLWV4Y2x1ZGU9PHBhdHRlcm4+IHNwZWNpZmllcyBhCisgICAgIHNpbmdsZSBwYXR0ZXJuLiAgUGF0dGVybnMgYXJlIG9yZGVyZWQgaW4gdGhlIHNhbWUgb3JkZXIKKyAgICAgdGhleSBhcHBlYXIgaW4gdGhlIGNvbW1hbmQgbGluZS4KKworICAyLiBUaGUgY29tbWFuZCBsaW5lIGZsYWcgLS1leGNsdWRlLWZyb209PGZpbGU+IHNwZWNpZmllcyBhCisgICAgIGZpbGUgY29udGFpbmluZyBhIGxpc3Qgb2YgcGF0dGVybnMuICBQYXR0ZXJucyBhcmUgb3JkZXJlZAorICAgICBpbiB0aGUgc2FtZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgZmlsZS4KKworICAzLiBjb21tYW5kIGxpbmUgZmxhZyAtLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeT08bmFtZT4gc3BlY2lmaWVzCisgICAgIGEgbmFtZSBvZiB0aGUgZmlsZSBpbiBlYWNoIGRpcmVjdG9yeSAnZ2l0LWxzLWZpbGVzJworICAgICBleGFtaW5lcywgbm9ybWFsbHkgYC5naXRpZ25vcmVgLiAgRmlsZXMgaW4gZGVlcGVyCisgICAgIGRpcmVjdG9yaWVzIHRha2UgcHJlY2VkZW5jZS4gIFBhdHRlcm5zIGFyZSBvcmRlcmVkIGluIHRoZQorICAgICBzYW1lIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBmaWxlcy4KKworQSBwYXR0ZXJuIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIHdpdGggLS1leGNsdWRlIG9yIHJlYWQKK2Zyb20gdGhlIGZpbGUgc3BlY2lmaWVkIHdpdGggLS1leGNsdWRlLWZyb20gaXMgcmVsYXRpdmUgdG8gdGhlCit0b3Agb2YgdGhlIGRpcmVjdG9yeSB0cmVlLiAgQSBwYXR0ZXJuIHJlYWQgZnJvbSBhIGZpbGUgc3BlY2lmaWVkCitieSAtLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeSBpcyByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQgdGhlCitwYXR0ZXJuIGZpbGUgYXBwZWFycyBpbi4KKworU2VlIEFsc28KKy0tLS0tLS0tCitsaW5rZ2l0OmdpdC1yZWFkLXRyZWVbMV0sIGxpbmtnaXQ6Z2l0aWdub3JlWzVdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubywgSm9zaCBUcmlwbGV0dCwgYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbHMtcmVtb3RlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWxzLXJlbW90ZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViYTBhYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWxzLXJlbW90ZS50eHQKQEAgLTAsMCArMSw3MiBAQAorZ2l0LWxzLXJlbW90ZSgxKQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbHMtcmVtb3RlIC0gTGlzdCByZWZlcmVuY2VzIGluIGEgcmVtb3RlIHJlcG9zaXRvcnkKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtbHMtcmVtb3RlJyBbLS1oZWFkc10gWy0tdGFnc10gIFstdSA8ZXhlYz4gfCAtLXVwbG9hZC1wYWNrIDxleGVjPl0KKwkgICAgICA8cmVwb3NpdG9yeT4gPHJlZnM+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorRGlzcGxheXMgcmVmZXJlbmNlcyBhdmFpbGFibGUgaW4gYSByZW1vdGUgcmVwb3NpdG9yeSBhbG9uZyB3aXRoIHRoZSBhc3NvY2lhdGVkCitjb21taXQgSURzLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy1ofC0taGVhZHMsIC10fC0tdGFnczo6CisJTGltaXQgdG8gb25seSByZWZzL2hlYWRzIGFuZCByZWZzL3RhZ3MsIHJlc3BlY3RpdmVseS4KKwlUaGVzZSBvcHRpb25zIGFyZSBfbm90XyBtdXR1YWxseSBleGNsdXNpdmU7IHdoZW4gZ2l2ZW4KKwlib3RoLCByZWZlcmVuY2VzIHN0b3JlZCBpbiByZWZzL2hlYWRzIGFuZCByZWZzL3RhZ3MgYXJlCisJZGlzcGxheWVkLgorCistdSA8ZXhlYz4sIC0tdXBsb2FkLXBhY2s9PGV4ZWM+OjoKKwlTcGVjaWZ5IHRoZSBmdWxsIHBhdGggb2YgbGlua2dpdDpnaXQtdXBsb2FkLXBhY2tbMV0gb24gdGhlIHJlbW90ZQorCWhvc3QuIFRoaXMgYWxsb3dzIGxpc3RpbmcgcmVmZXJlbmNlcyBmcm9tIHJlcG9zaXRvcmllcyBhY2Nlc3NlZCB2aWEKKwlTU0ggYW5kIHdoZXJlIHRoZSBTU0ggZGFlbW9uIGRvZXMgbm90IHVzZSB0aGUgUEFUSCBjb25maWd1cmVkIGJ5IHRoZQorCXVzZXIuCisKKzxyZXBvc2l0b3J5Pjo6CisJTG9jYXRpb24gb2YgdGhlIHJlcG9zaXRvcnkuICBUaGUgc2hvcnRoYW5kIGRlZmluZWQgaW4KKwkkR0lUX0RJUi9icmFuY2hlcy8gY2FuIGJlIHVzZWQuIFVzZSAiLiIgKGRvdCkgdG8gbGlzdCByZWZlcmVuY2VzIGluCisJdGhlIGxvY2FsIHJlcG9zaXRvcnkuCisKKzxyZWZzPi4uLjo6CisJV2hlbiB1bnNwZWNpZmllZCwgYWxsIHJlZmVyZW5jZXMsIGFmdGVyIGZpbHRlcmluZyBkb25lCisJd2l0aCAtLWhlYWRzIGFuZCAtLXRhZ3MsIGFyZSBzaG93bi4gIFdoZW4gPHJlZnM+Li4uIGFyZQorCXNwZWNpZmllZCwgb25seSByZWZlcmVuY2VzIG1hdGNoaW5nIHRoZSBnaXZlbiBwYXR0ZXJucworCWFyZSBkaXNwbGF5ZWQuCisKK0VYQU1QTEVTCistLS0tLS0tLQorCisJJCBnaXQgbHMtcmVtb3RlIC0tdGFncyAuLy4KKwlkNjYwMmVjNTE5NGM4N2IwZmM4NzEwM2NhNGQ2NzI1MWM3NmYyMzNhCXJlZnMvdGFncy92MC45OQorCWYyNWEyNjVhMzQyYWVkNjA0MWFiMGNjNDg0MjI0ZDljYTU0YjZmNDEJcmVmcy90YWdzL3YwLjk5LjEKKwk3Y2VjYTI3NWQwNDdjOTBjMGM3ZDVhZmIxM2FiOTdlZmRmNTFiZDZlCXJlZnMvdGFncy92MC45OS4zCisJYzVkYjU0NTZhZTNiMDg3M2ZjNjU5YzE5ZmFmZGRlMjIzMTNjYzQ0MQlyZWZzL3RhZ3MvdjAuOTkuMgorCTA5MTgzODVkYmQ5NjU2Y2FiMGQxZDgxYmE3NDUzZDQ5YmJjMTYyNTAJcmVmcy90YWdzL2p1bmlvLWdwZy1wdWIKKwkkIGdpdCBscy1yZW1vdGUgaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zY20vZ2l0L2dpdC5naXQgbWFzdGVyIHB1IHJjCisJNWZlOTc4YTUzODFmMWZiYWQyNmE4MGU2ODJkZGQyYTQwMTk2Njc0MAlyZWZzL2hlYWRzL21hc3RlcgorCWM3ODFhODRiNTIwNGZiMjk0YzljY2M3OWY4YjNiYWNlZWIzMmMwNjEJcmVmcy9oZWFkcy9wdQorCWIxZDA5NmYyOTI2YzRlMzdjOWMwYjZhN2JmMjExOWJlZGFhMjc3Y2IJcmVmcy9oZWFkcy9yYworCSQgZWNobyBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NjbS9naXQvZ2l0LmdpdCA+LmdpdC9icmFuY2hlcy9wdWJsaWMKKwkkIGdpdCBscy1yZW1vdGUgLS10YWdzIHB1YmxpYyB2XCoKKwlkNjYwMmVjNTE5NGM4N2IwZmM4NzEwM2NhNGQ2NzI1MWM3NmYyMzNhCXJlZnMvdGFncy92MC45OQorCWYyNWEyNjVhMzQyYWVkNjA0MWFiMGNjNDg0MjI0ZDljYTU0YjZmNDEJcmVmcy90YWdzL3YwLjk5LjEKKwljNWRiNTQ1NmFlM2IwODczZmM2NTljMTlmYWZkZGUyMjMxM2NjNDQxCXJlZnMvdGFncy92MC45OS4yCisJN2NlY2EyNzVkMDQ3YzkwYzBjN2Q1YWZiMTNhYjk3ZWZkZjUxYmQ2ZQlyZWZzL3RhZ3MvdjAuOTkuMworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbHMtdHJlZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1scy10cmVlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjBjMGExCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbHMtdHJlZS50eHQKQEAgLTAsMCArMSw5NCBAQAorZ2l0LWxzLXRyZWUoMSkKKz09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1scy10cmVlIC0gTGlzdCB0aGUgY29udGVudHMgb2YgYSB0cmVlIG9iamVjdAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1scy10cmVlJyBbLWRdIFstcl0gWy10XSBbLWxdIFstel0KKwkgICAgWy0tbmFtZS1vbmx5XSBbLS1uYW1lLXN0YXR1c10gWy0tZnVsbC1uYW1lXSBbLS1hYmJyZXY9WzxuPl1dCisJICAgIDx0cmVlLWlzaD4gW3BhdGhzLi4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0xpc3RzIHRoZSBjb250ZW50cyBvZiBhIGdpdmVuIHRyZWUgb2JqZWN0LCBsaWtlIHdoYXQgIi9iaW4vbHMgLWEiIGRvZXMKK2luIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBOb3RlIHRoYXQgdGhlIHVzYWdlIGlzIHN1YnRseSBkaWZmZXJlbnQsCit0aG91Z2ggLSAncGF0aHMnIGRlbm90ZSBqdXN0IGEgbGlzdCBvZiBwYXR0ZXJucyB0byBtYXRjaCwgZS5nLiBzbyBzcGVjaWZ5aW5nCitkaXJlY3RvcnkgbmFtZSAod2l0aG91dCAnLXInKSB3aWxsIGJlaGF2ZSBkaWZmZXJlbnRseSwgYW5kIG9yZGVyIG9mIHRoZQorYXJndW1lbnRzIGRvZXMgbm90IG1hdHRlci4KKworT1BUSU9OUworLS0tLS0tLQorPHRyZWUtaXNoPjo6CisJSWQgb2YgYSB0cmVlLWlzaC4KKworLWQ6OgorCVNob3cgb25seSB0aGUgbmFtZWQgdHJlZSBlbnRyeSBpdHNlbGYsIG5vdCBpdHMgY2hpbGRyZW4uCisKKy1yOjoKKwlSZWN1cnNlIGludG8gc3ViLXRyZWVzLgorCistdDo6CisJU2hvdyB0cmVlIGVudHJpZXMgZXZlbiB3aGVuIGdvaW5nIHRvIHJlY3Vyc2UgdGhlbS4gSGFzIG5vIGVmZmVjdAorCWlmICctcicgd2FzIG5vdCBwYXNzZWQuICctZCcgaW1wbGllcyAnLXQnLgorCistbDo6CistLWxvbmc6OgorCVNob3cgb2JqZWN0IHNpemUgb2YgYmxvYiAoZmlsZSkgZW50cmllcy4KKworLXo6OgorCVwwIGxpbmUgdGVybWluYXRpb24gb24gb3V0cHV0LgorCistLW5hbWUtb25seTo6CistLW5hbWUtc3RhdHVzOjoKKwlMaXN0IG9ubHkgZmlsZW5hbWVzIChpbnN0ZWFkIG9mIHRoZSAibG9uZyIgb3V0cHV0KSwgb25lIHBlciBsaW5lLgorCistLWFiYnJldls9PG4+XTo6CisJSW5zdGVhZCBvZiBzaG93aW5nIHRoZSBmdWxsIDQwLWJ5dGUgaGV4YWRlY2ltYWwgb2JqZWN0CisJbGluZXMsIHNob3cgb25seSBoYW5kZnVsIGhleGRpZ2l0cyBwcmVmaXguCisJTm9uIGRlZmF1bHQgbnVtYmVyIG9mIGRpZ2l0cyBjYW4gYmUgc3BlY2lmaWVkIHdpdGggLS1hYmJyZXY9PG4+LgorCistLWZ1bGwtbmFtZTo6CisJSW5zdGVhZCBvZiBzaG93aW5nIHRoZSBwYXRoIG5hbWVzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcKKwlkaXJlY3RvcnksIHNob3cgdGhlIGZ1bGwgcGF0aCBuYW1lcy4KKworcGF0aHM6OgorCVdoZW4gcGF0aHMgYXJlIGdpdmVuLCBzaG93IHRoZW0gKG5vdGUgdGhhdCB0aGlzIGlzbid0IHJlYWxseSByYXcKKwlwYXRobmFtZXMsIGJ1dCByYXRoZXIgYSBsaXN0IG9mIHBhdHRlcm5zIHRvIG1hdGNoKS4gIE90aGVyd2lzZQorCWltcGxpY2l0bHkgdXNlcyB0aGUgcm9vdCBsZXZlbCBvZiB0aGUgdHJlZSBhcyB0aGUgc29sZSBwYXRoIGFyZ3VtZW50LgorCisKK091dHB1dCBGb3JtYXQKKy0tLS0tLS0tLS0tLS0KKyAgICAgICAgPG1vZGU+IFNQIDx0eXBlPiBTUCA8b2JqZWN0PiBUQUIgPGZpbGU+CisKK1doZW4gdGhlIGAtemAgb3B0aW9uIGlzIG5vdCB1c2VkLCBUQUIsIExGLCBhbmQgYmFja3NsYXNoIGNoYXJhY3RlcnMKK2luIHBhdGhuYW1lcyBhcmUgcmVwcmVzZW50ZWQgYXMgYFx0YCwgYFxuYCwgYW5kIGBcXGAsIHJlc3BlY3RpdmVseS4KKworV2hlbiB0aGUgYC1sYCBvcHRpb24gaXMgdXNlZCwgZm9ybWF0IGNoYW5nZXMgdG8KKworICAgICAgICA8bW9kZT4gU1AgPHR5cGU+IFNQIDxvYmplY3Q+IFNQIDxvYmplY3Qgc2l6ZT4gVEFCIDxmaWxlPgorCitPYmplY3Qgc2l6ZSBpZGVudGlmaWVkIGJ5IDxvYmplY3Q+IGlzIGdpdmVuIGluIGJ5dGVzLCBhbmQgcmlnaHQtanVzdGlmaWVkCit3aXRoIG1pbmltdW0gd2lkdGggb2YgNyBjaGFyYWN0ZXJzLiAgT2JqZWN0IHNpemUgaXMgZ2l2ZW4gb25seSBmb3IgYmxvYnMKKyhmaWxlKSBlbnRyaWVzOyBmb3Igb3RoZXIgZW50cmllcyBgLWAgY2hhcmFjdGVyIGlzIHVzZWQgaW4gcGxhY2Ugb2Ygc2l6ZS4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBQZXRyIEJhdWRpcyA8cGFza3lAc3VzZS5jej4KK0NvbXBsZXRlbHkgcmV3cml0dGVuIGZyb20gc2NyYXRjaCBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+LAorYW5vdGhlciBtYWpvciByZXdyaXRlIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdAorPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LW1haWxpbmZvLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LW1haWxpbmZvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODQ2ZjBlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbWFpbGluZm8udHh0CkBAIC0wLDAgKzEsNjkgQEAKK2dpdC1tYWlsaW5mbygxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1tYWlsaW5mbyAtIEV4dHJhY3RzIHBhdGNoIGFuZCBhdXRob3JzaGlwIGZyb20gYSBzaW5nbGUgZS1tYWlsIG1lc3NhZ2UKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtbWFpbGluZm8nIFsta10gWy11IHwgLS1lbmNvZGluZz08ZW5jb2Rpbmc+XSA8bXNnPiA8cGF0Y2g+CisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitSZWFkaW5nIGEgc2luZ2xlIGUtbWFpbCBtZXNzYWdlIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0LCBhbmQKK3dyaXRlcyB0aGUgY29tbWl0IGxvZyBtZXNzYWdlIGluIDxtc2c+IGZpbGUsIGFuZCB0aGUgcGF0Y2hlcyBpbgorPHBhdGNoPiBmaWxlLiAgVGhlIGF1dGhvciBuYW1lLCBlLW1haWwgYW5kIGUtbWFpbCBzdWJqZWN0IGFyZQord3JpdHRlbiBvdXQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCB0byBiZSB1c2VkIGJ5IGdpdC1hbQordG8gY3JlYXRlIGEgY29tbWl0LiAgSXQgaXMgdXN1YWxseSBub3QgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzCitjb21tYW5kIGRpcmVjdGx5LiAgU2VlIGxpbmtnaXQ6Z2l0LWFtWzFdIGluc3RlYWQuCisKKworT1BUSU9OUworLS0tLS0tLQorLWs6OgorCVVzdWFsbHkgdGhlIHByb2dyYW0gJ2NsZWFucyB1cCcgdGhlIFN1YmplY3Q6IGhlYWRlciBsaW5lCisJdG8gZXh0cmFjdCB0aGUgdGl0bGUgbGluZSBmb3IgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZSwKKwlhbW9uZyB3aGljaCAoMSkgcmVtb3ZlICdSZTonIG9yICdyZTonLCAoMikgbGVhZGluZworCXdoaXRlc3BhY2VzLCAoMykgJ1snIHVwIHRvICddJywgdHlwaWNhbGx5ICdbUEFUQ0hdJywgYW5kCisJdGhlbiBwcmVwZW5kcyAiW1BBVENIXSAiLiAgVGhpcyBmbGFnIGZvcmJpZHMgdGhpcworCW11bmdpbmcsIGFuZCBpcyBtb3N0IHVzZWZ1bCB3aGVuIHVzZWQgdG8gcmVhZCBiYWNrICdnaXQKKwlmb3JtYXQtcGF0Y2ggLWsnIG91dHB1dC4KKworLXU6OgorCVRoZSBjb21taXQgbG9nIG1lc3NhZ2UsIGF1dGhvciBuYW1lIGFuZCBhdXRob3IgZW1haWwgYXJlCisJdGFrZW4gZnJvbSB0aGUgZS1tYWlsLCBhbmQgYWZ0ZXIgbWluaW1hbGx5IGRlY29kaW5nIE1JTUUKKwl0cmFuc2ZlciBlbmNvZGluZywgcmUtY29kZWQgaW4gVVRGLTggYnkgdHJhbnNsaXRlcmF0aW5nCisJdGhlbS4gIFRoaXMgdXNlZCB0byBiZSBvcHRpb25hbCBidXQgbm93IGl0IGlzIHRoZSBkZWZhdWx0LgorKworTm90ZSB0aGF0IHRoZSBwYXRjaCBpcyBhbHdheXMgdXNlZCBhcy1pcyB3aXRob3V0IGNoYXJzZXQKK2NvbnZlcnNpb24sIGV2ZW4gd2l0aCB0aGlzIGZsYWcuCisKKy0tZW5jb2Rpbmc9PGVuY29kaW5nPjo6CisJU2ltaWxhciB0byAtdSBidXQgaWYgdGhlIGxvY2FsIGNvbnZlbnRpb24gaXMgZGlmZmVyZW50CisJZnJvbSB3aGF0IGlzIHNwZWNpZmllZCBieSBpMThuLmNvbW1pdGVuY29kaW5nLCB0aGlzIGZsYWcKKwljYW4gYmUgdXNlZCB0byBvdmVycmlkZSBpdC4KKworPG1zZz46OgorCVRoZSBjb21taXQgbG9nIG1lc3NhZ2UgZXh0cmFjdGVkIGZyb20gZS1tYWlsLCB1c3VhbGx5CisJZXhjZXB0IHRoZSB0aXRsZSBsaW5lIHdoaWNoIGNvbWVzIGZyb20gZS1tYWlsIFN1YmplY3QuCisKKzxwYXRjaD46OgorCVRoZSBwYXRjaCBleHRyYWN0ZWQgZnJvbSBlLW1haWwuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPiBhbmQKK0p1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1tYWlsc3BsaXQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbWFpbHNwbGl0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjQzZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbWFpbHNwbGl0LnR4dApAQCAtMCwwICsxLDU4IEBACitnaXQtbWFpbHNwbGl0KDEpCis9PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1tYWlsc3BsaXQgLSBTaW1wbGUgVU5JWCBtYm94IHNwbGl0dGVyIHByb2dyYW0KKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LW1haWxzcGxpdCcgWy1iXSBbLWY8bm4+XSBbLWQ8cHJlYz5dIC1vPGRpcmVjdG9yeT4gWy0tXSBbPG1ib3g+fDxNYWlsZGlyPi4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitTcGxpdHMgYSBtYm94IGZpbGUgb3IgYSBNYWlsZGlyIGludG8gYSBsaXN0IG9mIGZpbGVzOiAiMDAwMSIgIjAwMDIiIC4uICBpbiB0aGUKK3NwZWNpZmllZCBkaXJlY3Rvcnkgc28geW91IGNhbiBwcm9jZXNzIHRoZW0gZnVydGhlciBmcm9tIHRoZXJlLgorCitJTVBPUlRBTlQ6IE1haWxkaXIgc3BsaXR0aW5nIHJlbGllcyB1cG9uIGZpbGVuYW1lcyBiZWluZyBzb3J0ZWQgdG8gb3V0cHV0CitwYXRjaGVzIGluIHRoZSBjb3JyZWN0IG9yZGVyLgorCitPUFRJT05TCistLS0tLS0tCis8bWJveD46OgorCU1ib3ggZmlsZSB0byBzcGxpdC4gIElmIG5vdCBnaXZlbiwgdGhlIG1ib3ggaXMgcmVhZCBmcm9tCisJdGhlIHN0YW5kYXJkIGlucHV0LgorCis8TWFpbGRpcj46OgorCVJvb3Qgb2YgdGhlIE1haWxkaXIgdG8gc3BsaXQuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBjb250YWluIHRoZSBjdXIsIHRtcAorCWFuZCBuZXcgc3ViZGlyZWN0b3JpZXMuCisKKzxkaXJlY3Rvcnk+OjoKKwlEaXJlY3RvcnkgaW4gd2hpY2ggdG8gcGxhY2UgdGhlIGluZGl2aWR1YWwgbWVzc2FnZXMuCisKKy1iOjoKKwlJZiBhbnkgZmlsZSBkb2Vzbid0IGJlZ2luIHdpdGggYSBGcm9tIGxpbmUsIGFzc3VtZSBpdCBpcyBhCisJc2luZ2xlIG1haWwgbWVzc2FnZSBpbnN0ZWFkIG9mIHNpZ25hbGluZyBlcnJvci4KKworLWQ8cHJlYz46OgorCUluc3RlYWQgb2YgdGhlIGRlZmF1bHQgNCBkaWdpdHMgd2l0aCBsZWFkaW5nIHplcm9zLAorCWRpZmZlcmVudCBwcmVjaXNpb24gY2FuIGJlIHNwZWNpZmllZCBmb3IgdGhlIGdlbmVyYXRlZAorCWZpbGVuYW1lcy4KKworLWY8bm4+OjoKKwlTa2lwIHRoZSBmaXJzdCA8bm4+IG51bWJlcnMsIGZvciBleGFtcGxlIGlmIC1mMyBpcyBzcGVjaWZpZWQsCisJc3RhcnQgdGhlIG51bWJlcmluZyB3aXRoIDAwMDQuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KK2FuZCBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2UtYmFzZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZS1iYXNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2Y3OGI0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2UtYmFzZS50eHQKQEAgLTAsMCArMSw0MiBAQAorZ2l0LW1lcmdlLWJhc2UoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1tZXJnZS1iYXNlIC0gRmluZCBhcyBnb29kIGNvbW1vbiBhbmNlc3RvcnMgYXMgcG9zc2libGUgZm9yIGEgbWVyZ2UKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtbWVyZ2UtYmFzZScgWy0tYWxsXSA8Y29tbWl0PiA8Y29tbWl0PgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworImdpdC1tZXJnZS1iYXNlIiBmaW5kcyBhcyBnb29kIGEgY29tbW9uIGFuY2VzdG9yIGFzIHBvc3NpYmxlIGJldHdlZW4KK3RoZSB0d28gY29tbWl0cy4gVGhhdCBpcywgZ2l2ZW4gdHdvIGNvbW1pdHMgQSBhbmQgQiAnZ2l0LW1lcmdlLWJhc2UgQQorQicgd2lsbCBvdXRwdXQgYSBjb21taXQgd2hpY2ggaXMgcmVhY2hhYmxlIGZyb20gYm90aCBBIGFuZCBCIHRocm91Z2gKK3RoZSBwYXJlbnQgcmVsYXRpb25zaGlwLgorCitHaXZlbiBhIHNlbGVjdGlvbiBvZiBlcXVhbGx5IGdvb2QgY29tbW9uIGFuY2VzdG9ycyBpdCBzaG91bGQgbm90IGJlCityZWxpZWQgb24gdG8gZGVjaWRlIGluIGFueSBwYXJ0aWN1bGFyIHdheS4KKworVGhlICJnaXQtbWVyZ2UtYmFzZSIgYWxnb3JpdGhtIGlzIHN0aWxsIGluIGZsdXggLSB1c2UgdGhlIHNvdXJjZS4uLgorCitPUFRJT05TCistLS0tLS0tCistLWFsbDo6CisJT3V0cHV0IGFsbCBjb21tb24gYW5jZXN0b3JzIGZvciB0aGUgdHdvIGNvbW1pdHMgaW5zdGVhZCBvZgorCWp1c3Qgb25lLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LW1lcmdlLWZpbGUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2UtZmlsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUxMzE4NAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LW1lcmdlLWZpbGUudHh0CkBAIC0wLDAgKzEsOTIgQEAKK2dpdC1tZXJnZS1maWxlKDEpCis9PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbWVyZ2UtZmlsZSAtIFJ1biBhIHRocmVlLXdheSBmaWxlIG1lcmdlCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LW1lcmdlLWZpbGUnIFstTCA8Y3VycmVudC1uYW1lPiBbLUwgPGJhc2UtbmFtZT4gWy1MIDxvdGhlci1uYW1lPl1dXQorCVstcHwtLXN0ZG91dF0gWy1xfC0tcXVpZXRdIDxjdXJyZW50LWZpbGU+IDxiYXNlLWZpbGU+IDxvdGhlci1maWxlPgorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorZ2l0LWZpbGUtbWVyZ2UgaW5jb3Jwb3JhdGVzIGFsbCBjaGFuZ2VzIHRoYXQgbGVhZCBmcm9tIHRoZSBgPGJhc2UtZmlsZT5gCit0byBgPG90aGVyLWZpbGU+YCBpbnRvIGA8Y3VycmVudC1maWxlPmAuIFRoZSByZXN1bHQgb3JkaW5hcmlseSBnb2VzIGludG8KK2A8Y3VycmVudC1maWxlPmAuIGdpdC1tZXJnZS1maWxlIGlzIHVzZWZ1bCBmb3IgY29tYmluaW5nIHNlcGFyYXRlIGNoYW5nZXMKK3RvIGFuIG9yaWdpbmFsLiBTdXBwb3NlIGA8YmFzZS1maWxlPmAgaXMgdGhlIG9yaWdpbmFsLCBhbmQgYm90aAorYDxjdXJyZW50LWZpbGU+YCBhbmQgYDxvdGhlci1maWxlPmAgYXJlIG1vZGlmaWNhdGlvbnMgb2YgYDxiYXNlLWZpbGU+YC4KK1RoZW4gZ2l0LW1lcmdlLWZpbGUgY29tYmluZXMgYm90aCBjaGFuZ2VzLgorCitBIGNvbmZsaWN0IG9jY3VycyBpZiBib3RoIGA8Y3VycmVudC1maWxlPmAgYW5kIGA8b3RoZXItZmlsZT5gIGhhdmUgY2hhbmdlcworaW4gYSBjb21tb24gc2VnbWVudCBvZiBsaW5lcy4gSWYgYSBjb25mbGljdCBpcyBmb3VuZCwgZ2l0LW1lcmdlLWZpbGUKK25vcm1hbGx5IG91dHB1dHMgYSB3YXJuaW5nIGFuZCBicmFja2V0cyB0aGUgY29uZmxpY3Qgd2l0aCA8PDw8PDw8IGFuZAorPj4+Pj4+PiBsaW5lcy4gQSB0eXBpY2FsIGNvbmZsaWN0IHdpbGwgbG9vayBsaWtlIHRoaXM6CisKKwk8PDw8PDw8IEEKKwlsaW5lcyBpbiBmaWxlIEEKKwk9PT09PT09CisJbGluZXMgaW4gZmlsZSBCCisJPj4+Pj4+PiBCCisKK0lmIHRoZXJlIGFyZSBjb25mbGljdHMsIHRoZSB1c2VyIHNob3VsZCBlZGl0IHRoZSByZXN1bHQgYW5kIGRlbGV0ZSBvbmUgb2YKK3RoZSBhbHRlcm5hdGl2ZXMuCisKK1RoZSBleGl0IHZhbHVlIG9mIHRoaXMgcHJvZ3JhbSBpcyBuZWdhdGl2ZSBvbiBlcnJvciwgYW5kIHRoZSBudW1iZXIgb2YKK2NvbmZsaWN0cyBvdGhlcndpc2UuIElmIHRoZSBtZXJnZSB3YXMgY2xlYW4sIHRoZSBleGl0IHZhbHVlIGlzIDAuCisKK2dpdC1tZXJnZS1maWxlIGlzIGRlc2lnbmVkIHRvIGJlIGEgbWluaW1hbCBjbG9uZSBvZiBSQ1MgbWVyZ2UsIHRoYXQgaXMsIGl0CitpbXBsZW1lbnRzIGFsbCBvZiBSQ1MgbWVyZ2UncyBmdW5jdGlvbmFsaXR5IHdoaWNoIGlzIG5lZWRlZCBieQorbGlua2dpdDpnaXRbMV0uCisKKworT1BUSU9OUworLS0tLS0tLQorCistTCA8bGFiZWw+OjoKKwlUaGlzIG9wdGlvbiBtYXkgYmUgZ2l2ZW4gdXAgdG8gdGhyZWUgdGltZXMsIGFuZAorCXNwZWNpZmllcyBsYWJlbHMgdG8gYmUgdXNlZCBpbiBwbGFjZSBvZiB0aGUKKwljb3JyZXNwb25kaW5nIGZpbGUgbmFtZXMgaW4gY29uZmxpY3QgcmVwb3J0cy4gVGhhdCBpcywKKwlgZ2l0LW1lcmdlLWZpbGUgLUwgeCAtTCB5IC1MIHogYSBiIGNgIGdlbmVyYXRlcyBvdXRwdXQgdGhhdAorCWxvb2tzIGxpa2UgaXQgY2FtZSBmcm9tIGZpbGVzIHgsIHkgYW5kIHogaW5zdGVhZCBvZgorCWZyb20gZmlsZXMgYSwgYiBhbmQgYy4KKworLXA6OgorCVNlbmQgcmVzdWx0cyB0byBzdGFuZGFyZCBvdXRwdXQgaW5zdGVhZCBvZiBvdmVyd3JpdGluZworCWA8Y3VycmVudC1maWxlPmAuCisKKy1xOjoKKwlRdWlldDsgIGRvICBub3QgIHdhcm4gYWJvdXQgY29uZmxpY3RzLgorCisKK0VYQU1QTEVTCistLS0tLS0tLQorCitnaXQgbWVyZ2UtZmlsZSBSRUFETUUubXkgUkVBRE1FIFJFQURNRS51cHN0cmVhbTo6CisKKwljb21iaW5lcyB0aGUgY2hhbmdlcyBvZiBSRUFETUUubXkgYW5kIFJFQURNRS51cHN0cmVhbSBzaW5jZSBSRUFETUUsCisJdHJpZXMgdG8gbWVyZ2UgdGhlbSBhbmQgd3JpdGVzIHRoZSByZXN1bHQgaW50byBSRUFETUUubXkuCisKK2dpdCBtZXJnZS1maWxlIC1MIGEgLUwgYiAtTCBjIHRtcC9hMTIzIHRtcC9iMjM0IHRtcC9jMzQ1OjoKKworCW1lcmdlcyB0bXAvYTEyMyBhbmQgdG1wL2MzNDUgd2l0aCB0aGUgYmFzZSB0bXAvYjIzNCwgYnV0IHVzZXMgbGFiZWxzCisJYGFgIGFuZCBgY2AgaW5zdGVhZCBvZiBgdG1wL2ExMjNgIGFuZCBgdG1wL2MzNDVgLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEpvaGFubmVzIFNjaGluZGVsaW4gPGpvaGFubmVzLnNjaGluZGVsaW5AZ214LmRlPgorCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEpvaGFubmVzIFNjaGluZGVsaW4gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4sCit3aXRoIHBhcnRzIGNvcGllZCBmcm9tIHRoZSBvcmlnaW5hbCBkb2N1bWVudGF0aW9uIG9mIFJDUyBtZXJnZS4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZS1pbmRleC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZS1pbmRleC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllZTAxNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LW1lcmdlLWluZGV4LnR4dApAQCAtMCwwICsxLDg3IEBACitnaXQtbWVyZ2UtaW5kZXgoMSkKKz09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbWVyZ2UtaW5kZXggLSBSdW4gYSBtZXJnZSBmb3IgZmlsZXMgbmVlZGluZyBtZXJnaW5nCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LW1lcmdlLWluZGV4JyBbLW9dIFstcV0gPG1lcmdlLXByb2dyYW0+ICgtYSB8IFstLV0gPGZpbGU+XCopCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhpcyBsb29rcyB1cCB0aGUgPGZpbGU+KHMpIGluIHRoZSBpbmRleCBhbmQsIGlmIHRoZXJlIGFyZSBhbnkgbWVyZ2UKK2VudHJpZXMsIHBhc3NlcyB0aGUgU0hBMSBoYXNoIGZvciB0aG9zZSBmaWxlcyBhcyBhcmd1bWVudHMgMSwgMiwgMyAoZW1wdHkKK2FyZ3VtZW50IGlmIG5vIGZpbGUpLCBhbmQgPGZpbGU+IGFzIGFyZ3VtZW50IDQuICBGaWxlIG1vZGVzIGZvciB0aGUgdGhyZWUKK2ZpbGVzIGFyZSBwYXNzZWQgYXMgYXJndW1lbnRzIDUsIDYgYW5kIDcuCisKK09QVElPTlMKKy0tLS0tLS0KK1wtLTo6CisJRG8gbm90IGludGVycHJldCBhbnkgbW9yZSBhcmd1bWVudHMgYXMgb3B0aW9ucy4KKworLWE6OgorCVJ1biBtZXJnZSBhZ2FpbnN0IGFsbCBmaWxlcyBpbiB0aGUgaW5kZXggdGhhdCBuZWVkIG1lcmdpbmcuCisKKy1vOjoKKwlJbnN0ZWFkIG9mIHN0b3BwaW5nIGF0IHRoZSBmaXJzdCBmYWlsZWQgbWVyZ2UsIGRvIGFsbCBvZiB0aGVtCisJaW4gb25lIHNob3QgLSBjb250aW51ZSB3aXRoIG1lcmdpbmcgZXZlbiB3aGVuIHByZXZpb3VzIG1lcmdlcworCXJldHVybmVkIGVycm9ycywgYW5kIG9ubHkgcmV0dXJuIHRoZSBlcnJvciBjb2RlIGFmdGVyIGFsbCB0aGUKKwltZXJnZXMgYXJlIG92ZXIuCisKKy1xOjoKKwlEbyBub3QgY29tcGxhaW4gYWJvdXQgZmFpbGVkIG1lcmdlIHByb2dyYW0gKHRoZSBtZXJnZSBwcm9ncmFtCisJZmFpbHVyZSB1c3VhbGx5IGluZGljYXRlcyBjb25mbGljdHMgZHVyaW5nIG1lcmdlKS4gVGhpcyBpcyBmb3IKKwlwb3JjZWxhaW5zIHdoaWNoIG1pZ2h0IHdhbnQgdG8gZW1pdCBjdXN0b20gbWVzc2FnZXMuCisKK0lmICJnaXQtbWVyZ2UtaW5kZXgiIGlzIGNhbGxlZCB3aXRoIG11bHRpcGxlIDxmaWxlPnMgKG9yIC1hKSB0aGVuIGl0Citwcm9jZXNzZXMgdGhlbSBpbiB0dXJuIG9ubHkgc3RvcHBpbmcgaWYgbWVyZ2UgcmV0dXJucyBhIG5vbi16ZXJvIGV4aXQKK2NvZGUuCisKK1R5cGljYWxseSB0aGlzIGlzIHJ1biB3aXRoIGEgc2NyaXB0IGNhbGxpbmcgZ2l0J3MgaW1pdGF0aW9uIG9mCit0aGUgbWVyZ2UgY29tbWFuZCBmcm9tIHRoZSBSQ1MgcGFja2FnZS4KKworQSBzYW1wbGUgc2NyaXB0IGNhbGxlZCAiZ2l0LW1lcmdlLW9uZS1maWxlIiBpcyBpbmNsdWRlZCBpbiB0aGUKK2Rpc3RyaWJ1dGlvbi4KKworQUxFUlQgQUxFUlQgQUxFUlQhIFRoZSBnaXQgIm1lcmdlIG9iamVjdCBvcmRlciIgaXMgZGlmZmVyZW50IGZyb20gdGhlCitSQ1MgIm1lcmdlIiBwcm9ncmFtIG1lcmdlIG9iamVjdCBvcmRlci4gSW4gdGhlIGFib3ZlIG9yZGVyaW5nLCB0aGUKK29yaWdpbmFsIGlzIGZpcnN0LiBCdXQgdGhlIGFyZ3VtZW50IG9yZGVyIHRvIHRoZSAzLXdheSBtZXJnZSBwcm9ncmFtCisibWVyZ2UiIGlzIHRvIGhhdmUgdGhlIG9yaWdpbmFsIGluIHRoZSBtaWRkbGUuIERvbid0IGFzayBtZSB3aHkuCisKK0V4YW1wbGVzOgorCisgIHRvcnZhbGRzQHBwYzk3MDp+L21lcmdlLXRlc3Q+IGdpdC1tZXJnZS1pbmRleCBjYXQgTU0KKyAgVGhpcyBpcyBNTSBmcm9tIHRoZSBvcmlnaW5hbCB0cmVlLgkJCSMgb3JpZ2luYWwKKyAgVGhpcyBpcyBtb2RpZmllZCBNTSBpbiB0aGUgYnJhbmNoIEEuCQkJIyBtZXJnZTEKKyAgVGhpcyBpcyBtb2RpZmllZCBNTSBpbiB0aGUgYnJhbmNoIEIuCQkJIyBtZXJnZTIKKyAgVGhpcyBpcyBtb2RpZmllZCBNTSBpbiB0aGUgYnJhbmNoIEIuCQkJIyBjdXJyZW50IGNvbnRlbnRzCisKK29yCisKKyAgdG9ydmFsZHNAcHBjOTcwOn4vbWVyZ2UtdGVzdD4gZ2l0LW1lcmdlLWluZGV4IGNhdCBBQSBNTQorICBjYXQ6IDogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorICBUaGlzIGlzIGFkZGVkIEFBIGluIHRoZSBicmFuY2ggQS4KKyAgVGhpcyBpcyBhZGRlZCBBQSBpbiB0aGUgYnJhbmNoIEIuCisgIFRoaXMgaXMgYWRkZWQgQUEgaW4gdGhlIGJyYW5jaCBCLgorICBmYXRhbDogbWVyZ2UgcHJvZ3JhbSBmYWlsZWQKKword2hlcmUgdGhlIGxhdHRlciBleGFtcGxlIHNob3dzIGhvdyAiZ2l0LW1lcmdlLWluZGV4IiB3aWxsIHN0b3AgdHJ5aW5nIHRvCittZXJnZSBvbmNlIGFueXRoaW5nIGhhcyByZXR1cm5lZCBhbiBlcnJvciAoaS5lLiwgImNhdCIgcmV0dXJuZWQgYW4gZXJyb3IKK2ZvciB0aGUgQUEgZmlsZSwgYmVjYXVzZSBpdCBkaWRuJ3QgZXhpc3QgaW4gdGhlIG9yaWdpbmFsLCBhbmQgdGh1cworImdpdC1tZXJnZS1pbmRleCIgZGlkbid0IGV2ZW4gdHJ5IHRvIG1lcmdlIHRoZSBNTSB0aGluZykuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KK09uZS1zaG90IG1lcmdlIGJ5IFBldHIgQmF1ZGlzIDxwYXNreUB1Y3cuY3o+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LW1lcmdlLW9uZS1maWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LW1lcmdlLW9uZS1maWxlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTk1ZGYzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2Utb25lLWZpbGUudHh0CkBAIC0wLDAgKzEsMjkgQEAKK2dpdC1tZXJnZS1vbmUtZmlsZSgxKQorPT09PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1tZXJnZS1vbmUtZmlsZSAtIFRoZSBzdGFuZGFyZCBoZWxwZXIgcHJvZ3JhbSB0byB1c2Ugd2l0aCBnaXQtbWVyZ2UtaW5kZXgKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtbWVyZ2Utb25lLWZpbGUnCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhpcyBpcyB0aGUgc3RhbmRhcmQgaGVscGVyIHByb2dyYW0gdG8gdXNlIHdpdGggImdpdC1tZXJnZS1pbmRleCIKK3RvIHJlc29sdmUgYSBtZXJnZSBhZnRlciB0aGUgdHJpdmlhbCBtZXJnZSBkb25lIHdpdGggImdpdC1yZWFkLXRyZWUgLW0iLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+LAorSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PiBhbmQgUGV0ciBCYXVkaXMgPHBhc2t5QHN1c2UuY3o+LgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZS10cmVlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LW1lcmdlLXRyZWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYzA5NjQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZS10cmVlLnR4dApAQCAtMCwwICsxLDM2IEBACitnaXQtbWVyZ2UtdHJlZSgxKQorPT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LW1lcmdlLXRyZWUgLSBTaG93IHRocmVlLXdheSBtZXJnZSB3aXRob3V0IHRvdWNoaW5nIGluZGV4CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LW1lcmdlLXRyZWUnIDxiYXNlLXRyZWU+IDxicmFuY2gxPiA8YnJhbmNoMj4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitSZWFkcyB0aHJlZSB0cmVlaXNoLCBhbmQgb3V0cHV0IHRyaXZpYWwgbWVyZ2UgcmVzdWx0cyBhbmQKK2NvbmZsaWN0aW5nIHN0YWdlcyB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LiAgVGhpcyBpcyBzaW1pbGFyIHRvCit3aGF0IHRocmVlLXdheSByZWFkLXRyZWUgLW0gZG9lcywgYnV0IGluc3RlYWQgb2Ygc3RvcmluZyB0aGUKK3Jlc3VsdHMgaW4gdGhlIGluZGV4LCB0aGUgY29tbWFuZCBvdXRwdXRzIHRoZSBlbnRyaWVzIHRvIHRoZQorc3RhbmRhcmQgb3V0cHV0LgorCitUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgYnkgaGlnaGVyIGxldmVsIHNjcmlwdHMgdG8gY29tcHV0ZQorbWVyZ2UgcmVzdWx0cyBvdXRzaWRlIGluZGV4LCBhbmQgc3R1ZmYgdGhlIHJlc3VsdHMgYmFjayBpbnRvIHRoZQoraW5kZXguICBGb3IgdGhpcyByZWFzb24sIHRoZSBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZCBvbWl0cworZW50cmllcyB0aGF0IG1hdGNoIDxicmFuY2gxPiB0cmVlLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LW1lcmdlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LW1lcmdlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTM2YjEwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2UudHh0CkBAIC0wLDAgKzEsMTgyIEBACitnaXQtbWVyZ2UoMSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbWVyZ2UgLSBKb2luIHR3byBvciBtb3JlIGRldmVsb3BtZW50IGhpc3RvcmllcyB0b2dldGhlcgorCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1tZXJnZScgWy1uXSBbLS1zdW1tYXJ5XSBbLS1uby1jb21taXRdIFstLXNxdWFzaF0gWy1zIDxzdHJhdGVneT5dLi4uCisJWy1tIDxtc2c+XSA8cmVtb3RlPiA8cmVtb3RlPi4uLgorJ2dpdC1tZXJnZScgPG1zZz4gSEVBRCA8cmVtb3RlPi4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoaXMgaXMgdGhlIHRvcC1sZXZlbCBpbnRlcmZhY2UgdG8gdGhlIG1lcmdlIG1hY2hpbmVyeQord2hpY2ggZHJpdmVzIG11bHRpcGxlIG1lcmdlIHN0cmF0ZWd5IHNjcmlwdHMuCisKK1RoZSBzZWNvbmQgc3ludGF4ICg8bXNnPiBgSEVBRGAgPHJlbW90ZT4pIGlzIHN1cHBvcnRlZCBmb3IKK2hpc3RvcmljYWwgcmVhc29ucy4gIERvIG5vdCB1c2UgaXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIG9yIGluCituZXcgc2NyaXB0cy4gIEl0IGlzIHRoZSBzYW1lIGFzIGBnaXQgbWVyZ2UgLW0gPG1zZz4gPHJlbW90ZT5gLgorCisKK09QVElPTlMKKy0tLS0tLS0KK2luY2x1ZGU6Om1lcmdlLW9wdGlvbnMudHh0W10KKworLW0gPG1zZz46OgorCVRoZSBjb21taXQgbWVzc2FnZSB0byBiZSB1c2VkIGZvciB0aGUgbWVyZ2UgY29tbWl0IChpbiBjYXNlCisJaXQgaXMgY3JlYXRlZCkuIFRoZSBgZ2l0LWZtdC1tZXJnZS1tc2dgIHNjcmlwdCBjYW4gYmUgdXNlZAorCXRvIGdpdmUgYSBnb29kIGRlZmF1bHQgZm9yIGF1dG9tYXRlZCBgZ2l0LW1lcmdlYCBpbnZvY2F0aW9ucy4KKworPHJlbW90ZT46OgorCU90aGVyIGJyYW5jaCBoZWFkIG1lcmdlZCBpbnRvIG91ciBicmFuY2guICBZb3UgbmVlZCBhdAorCWxlYXN0IG9uZSA8cmVtb3RlPi4gIFNwZWNpZnlpbmcgbW9yZSB0aGFuIG9uZSA8cmVtb3RlPgorCW9idmlvdXNseSBtZWFucyB5b3UgYXJlIHRyeWluZyBhbiBPY3RvcHVzLgorCitpbmNsdWRlOjptZXJnZS1zdHJhdGVnaWVzLnR4dFtdCisKKworSWYgeW91IHRyaWVkIGEgbWVyZ2Ugd2hpY2ggcmVzdWx0ZWQgaW4gYSBjb21wbGV4IGNvbmZsaWN0cyBhbmQKK3dvdWxkIHdhbnQgdG8gc3RhcnQgb3ZlciwgeW91IGNhbiByZWNvdmVyIHdpdGgKK2xpbmtnaXQ6Z2l0LXJlc2V0WzFdLgorCitDT05GSUdVUkFUSU9OCistLS0tLS0tLS0tLS0tCisKK21lcmdlLnN1bW1hcnk6OgorCVdoZXRoZXIgdG8gaW5jbHVkZSBzdW1tYXJpZXMgb2YgbWVyZ2VkIGNvbW1pdHMgaW4gbmV3bHkKKwljcmVhdGVkIG1lcmdlIGNvbW1pdC4gRmFsc2UgYnkgZGVmYXVsdC4KKworbWVyZ2UudmVyYm9zaXR5OjoKKwlDb250cm9scyB0aGUgYW1vdW50IG9mIG91dHB1dCBzaG93biBieSB0aGUgcmVjdXJzaXZlIG1lcmdlCisJc3RyYXRlZ3kuICBMZXZlbCAwIG91dHB1dHMgbm90aGluZyBleGNlcHQgYSBmaW5hbCBlcnJvcgorCW1lc3NhZ2UgaWYgY29uZmxpY3RzIHdlcmUgZGV0ZWN0ZWQuIExldmVsIDEgb3V0cHV0cyBvbmx5CisJY29uZmxpY3RzLCAyIG91dHB1dHMgY29uZmxpY3RzIGFuZCBmaWxlIGNoYW5nZXMuICBMZXZlbCA1IGFuZAorCWFib3ZlIG91dHB1dHMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhlIGRlZmF1bHQgaXMgbGV2ZWwgMi4KKwlDYW4gYmUgb3ZlcnJpZGRlbiBieSAnR0lUX01FUkdFX1ZFUkJPU0lUWScgZW52aXJvbm1lbnQgdmFyaWFibGUuCisKK2JyYW5jaC48bmFtZT4ubWVyZ2VvcHRpb25zOjoKKwlTZXRzIGRlZmF1bHQgb3B0aW9ucyBmb3IgbWVyZ2luZyBpbnRvIGJyYW5jaCA8bmFtZT4uIFRoZSBzeW50YXggYW5kCisJc3VwcG9ydGVkIG9wdGlvbnMgYXJlIGVxdWFsIHRvIHRoYXQgb2YgZ2l0LW1lcmdlLCBidXQgb3B0aW9uIHZhbHVlcworCWNvbnRhaW5pbmcgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGFyZSBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC4KKworSE9XIE1FUkdFIFdPUktTCistLS0tLS0tLS0tLS0tLS0KKworQSBtZXJnZSBpcyBhbHdheXMgYmV0d2VlbiB0aGUgY3VycmVudCBgSEVBRGAgYW5kIG9uZSBvciBtb3JlCitjb21taXRzICh1c3VhbGx5LCBicmFuY2ggaGVhZCBvciB0YWcpLCBhbmQgdGhlIGluZGV4IGZpbGUgbXVzdAorZXhhY3RseSBtYXRjaCB0aGUKK3RyZWUgb2YgYEhFQURgIGNvbW1pdCAoaS5lLiB0aGUgY29udGVudHMgb2YgdGhlIGxhc3QgY29tbWl0KSB3aGVuCitpdCBoYXBwZW5zLiAgSW4gb3RoZXIgd29yZHMsIGBnaXQtZGlmZiAtLWNhY2hlZCBIRUFEYCBtdXN0CityZXBvcnQgbm8gY2hhbmdlcy4KKworW05PVEVdCitUaGlzIGlzIGEgYml0IG9mIGEgbGllLiAgSW4gY2VydGFpbiBzcGVjaWFsIGNhc2VzLCB5b3VyIGluZGV4IGlzCithbGxvd2VkIHRvIGJlIGRpZmZlcmVudCBmcm9tIHRoZSB0cmVlIG9mIHRoZSBgSEVBRGAgY29tbWl0LiAgVGhlIG1vc3QKK25vdGFibGUgY2FzZSBpcyB3aGVuIHlvdXIgYEhFQURgIGNvbW1pdCBpcyBhbHJlYWR5IGFoZWFkIG9mIHdoYXQKK2lzIGJlaW5nIG1lcmdlZCwgaW4gd2hpY2ggY2FzZSB5b3VyIGluZGV4IGNhbiBoYXZlIGFyYml0cmFyeQorZGlmZmVyZW5jZXMgZnJvbSB5b3VyIGBIRUFEYCBjb21taXQuICBBbHNvLCB5b3VyIGluZGV4IGVudHJpZXMKK21heSBoYXZlIGRpZmZlcmVuY2VzIGZyb20geW91ciBgSEVBRGAgY29tbWl0IHRoYXQgbWF0Y2gKK3RoZSByZXN1bHQgb2YgYSB0cml2aWFsIG1lcmdlIChlLmcuIHlvdSByZWNlaXZlZCB0aGUgc2FtZSBwYXRjaAorZnJvbSBhbiBleHRlcm5hbCBzb3VyY2UgdG8gcHJvZHVjZSB0aGUgc2FtZSByZXN1bHQgYXMgd2hhdCB5b3UgYXJlCittZXJnaW5nKS4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGggZGlkIG5vdCBleGlzdCBpbiB0aGUgY29tbW9uCithbmNlc3RvciBhbmQgeW91ciBoZWFkIGNvbW1pdCBidXQgZXhpc3RzIGluIHRoZSB0cmVlIHlvdSBhcmUKK21lcmdpbmcgaW50byB5b3VyIHJlcG9zaXRvcnksIGFuZCBpZiB5b3UgYWxyZWFkeSBoYXBwZW4gdG8gaGF2ZQordGhhdCBwYXRoIGV4YWN0bHkgaW4geW91ciBpbmRleCwgdGhlIG1lcmdlIGRvZXMgbm90IGhhdmUgdG8KK2ZhaWwuCisKK090aGVyd2lzZSwgbWVyZ2Ugd2lsbCByZWZ1c2UgdG8gZG8gYW55IGhhcm0gdG8geW91ciByZXBvc2l0b3J5CisodGhhdCBpcywgaXQgbWF5IGZldGNoIHRoZSBvYmplY3RzIGZyb20gcmVtb3RlLCBhbmQgaXQgbWF5IGV2ZW4KK3VwZGF0ZSB0aGUgbG9jYWwgYnJhbmNoIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgcmVtb3RlIGJyYW5jaAord2l0aCBgZ2l0IHB1bGwgcmVtb3RlIHJicmFuY2g6bGJyYW5jaGAsIGJ1dCB5b3VyIHdvcmtpbmcgdHJlZSwKK2AuZ2l0L0hFQURgIHBvaW50ZXIgYW5kIGluZGV4IGZpbGUgYXJlIGxlZnQgaW50YWN0KS4KKworWW91IG1heSBoYXZlIGxvY2FsIG1vZGlmaWNhdGlvbnMgaW4gdGhlIHdvcmtpbmcgdHJlZSBmaWxlcy4gIEluCitvdGhlciB3b3JkcywgYGdpdC1kaWZmYCBpcyBhbGxvd2VkIHRvIHJlcG9ydCBjaGFuZ2VzLgorSG93ZXZlciwgdGhlIG1lcmdlIHVzZXMgeW91ciB3b3JraW5nIHRyZWUgYXMgdGhlIHdvcmtpbmcgYXJlYSwKK2FuZCBpbiBvcmRlciB0byBwcmV2ZW50IHRoZSBtZXJnZSBvcGVyYXRpb24gZnJvbSBsb3Npbmcgc3VjaAorY2hhbmdlcywgaXQgbWFrZXMgc3VyZSB0aGF0IHRoZXkgZG8gbm90IGludGVyZmVyZSB3aXRoIHRoZQorbWVyZ2UuIFRob3NlIGNvbXBsZXggdGFibGVzIGluIHJlYWQtdHJlZSBkb2N1bWVudGF0aW9uIGRlZmluZQord2hhdCBpdCBtZWFucyBmb3IgYSBwYXRoIHRvICJpbnRlcmZlcmUgd2l0aCB0aGUgbWVyZ2UiLiAgQW5kIGlmCit5b3VyIGxvY2FsIG1vZGlmaWNhdGlvbnMgaW50ZXJmZXJlIHdpdGggdGhlIG1lcmdlLCBhZ2FpbiwgaXQKK3N0b3BzIGJlZm9yZSB0b3VjaGluZyBhbnl0aGluZy4KKworU28gaW4gdGhlIGFib3ZlIHR3byAiZmFpbGVkIG1lcmdlIiBjYXNlLCB5b3UgZG8gbm90IGhhdmUgdG8KK3dvcnJ5IGFib3V0IGxvc3Mgb2YgZGF0YSAtLS0geW91IHNpbXBseSB3ZXJlIG5vdCByZWFkeSB0byBkbworYSBtZXJnZSwgc28gbm8gbWVyZ2UgaGFwcGVuZWQgYXQgYWxsLiAgWW91IG1heSB3YW50IHRvIGZpbmlzaAord2hhdGV2ZXIgeW91IHdlcmUgaW4gdGhlIG1pZGRsZSBvZiBkb2luZywgYW5kIHJldHJ5IHRoZSBzYW1lCitwdWxsIGFmdGVyIHlvdSBhcmUgZG9uZSBhbmQgcmVhZHkuCisKK1doZW4gdGhpbmdzIGNsZWFubHkgbWVyZ2UsIHRoZXNlIHRoaW5ncyBoYXBwZW46CisKKzEuIFRoZSByZXN1bHRzIGFyZSB1cGRhdGVkIGJvdGggaW4gdGhlIGluZGV4IGZpbGUgYW5kIGluIHlvdXIKKyAgIHdvcmtpbmcgdHJlZTsKKzIuIEluZGV4IGZpbGUgaXMgd3JpdHRlbiBvdXQgYXMgYSB0cmVlOworMy4gVGhlIHRyZWUgZ2V0cyBjb21taXR0ZWQ7IGFuZAorNC4gVGhlIGBIRUFEYCBwb2ludGVyIGdldHMgYWR2YW5jZWQuCisKK0JlY2F1c2Ugb2YgMi4sIHdlIHJlcXVpcmUgdGhhdCB0aGUgb3JpZ2luYWwgc3RhdGUgb2YgdGhlIGluZGV4CitmaWxlIHRvIG1hdGNoIGV4YWN0bHkgdGhlIGN1cnJlbnQgYEhFQURgIGNvbW1pdDsgb3RoZXJ3aXNlIHdlCit3aWxsIHdyaXRlIG91dCB5b3VyIGxvY2FsIGNoYW5nZXMgYWxyZWFkeSByZWdpc3RlcmVkIGluIHlvdXIKK2luZGV4IGZpbGUgYWxvbmcgd2l0aCB0aGUgbWVyZ2UgcmVzdWx0LCB3aGljaCBpcyBub3QgZ29vZC4KK0JlY2F1c2UgMS4gaW52b2x2ZXMgb25seSB0aGUgcGF0aHMgZGlmZmVyZW50IGJldHdlZW4geW91cgorYnJhbmNoIGFuZCB0aGUgcmVtb3RlIGJyYW5jaCB5b3UgYXJlIHB1bGxpbmcgZnJvbSBkdXJpbmcgdGhlCittZXJnZSAod2hpY2ggaXMgdHlwaWNhbGx5IGEgZnJhY3Rpb24gb2YgdGhlIHdob2xlIHRyZWUpLCB5b3UgY2FuCitoYXZlIGxvY2FsIG1vZGlmaWNhdGlvbnMgaW4geW91ciB3b3JraW5nIHRyZWUgYXMgbG9uZyBhcyB0aGV5IGRvCitub3Qgb3ZlcmxhcCB3aXRoIHdoYXQgdGhlIG1lcmdlIHVwZGF0ZXMuCisKK1doZW4gdGhlcmUgYXJlIGNvbmZsaWN0cywgdGhlc2UgdGhpbmdzIGhhcHBlbjoKKworMS4gYEhFQURgIHN0YXlzIHRoZSBzYW1lLgorCisyLiBDbGVhbmx5IG1lcmdlZCBwYXRocyBhcmUgdXBkYXRlZCBib3RoIGluIHRoZSBpbmRleCBmaWxlIGFuZAorICAgaW4geW91ciB3b3JraW5nIHRyZWUuCisKKzMuIEZvciBjb25mbGljdGluZyBwYXRocywgdGhlIGluZGV4IGZpbGUgcmVjb3JkcyB1cCB0byB0aHJlZQorICAgdmVyc2lvbnM7IHN0YWdlMSBzdG9yZXMgdGhlIHZlcnNpb24gZnJvbSB0aGUgY29tbW9uIGFuY2VzdG9yLAorICAgc3RhZ2UyIGZyb20gYEhFQURgLCBhbmQgc3RhZ2UzIGZyb20gdGhlIHJlbW90ZSBicmFuY2ggKHlvdQorICAgY2FuIGluc3BlY3QgdGhlIHN0YWdlcyB3aXRoIGBnaXQtbHMtZmlsZXMgLXVgKS4gIFRoZSB3b3JraW5nCisgICB0cmVlIGZpbGVzIGhhdmUgdGhlIHJlc3VsdCBvZiAibWVyZ2UiIHByb2dyYW07IGkuZS4gMy13YXkKKyAgIG1lcmdlIHJlc3VsdCB3aXRoIGZhbWlsaWFyIGNvbmZsaWN0IG1hcmtlcnMgYDw8PCA9PT0gPj4+YC4KKworNC4gTm8gb3RoZXIgY2hhbmdlcyBhcmUgZG9uZS4gIEluIHBhcnRpY3VsYXIsIHRoZSBsb2NhbAorICAgbW9kaWZpY2F0aW9ucyB5b3UgaGFkIGJlZm9yZSB5b3Ugc3RhcnRlZCBtZXJnZSB3aWxsIHN0YXkgdGhlCisgICBzYW1lIGFuZCB0aGUgaW5kZXggZW50cmllcyBmb3IgdGhlbSBzdGF5IGFzIHRoZXkgd2VyZSwKKyAgIGkuZS4gbWF0Y2hpbmcgYEhFQURgLgorCitBZnRlciBzZWVpbmcgYSBjb25mbGljdCwgeW91IGNhbiBkbyB0d28gdGhpbmdzOgorCisgKiBEZWNpZGUgbm90IHRvIG1lcmdlLiAgVGhlIG9ubHkgY2xlYW4tdXAgeW91IG5lZWQgYXJlIHRvIHJlc2V0CisgICB0aGUgaW5kZXggZmlsZSB0byB0aGUgYEhFQURgIGNvbW1pdCB0byByZXZlcnNlIDIuIGFuZCB0byBjbGVhbgorICAgdXAgd29ya2luZyB0cmVlIGNoYW5nZXMgbWFkZSBieSAyLiBhbmQgMy47IGBnaXQtcmVzZXRgIGNhbgorICAgYmUgdXNlZCBmb3IgdGhpcy4KKworICogUmVzb2x2ZSB0aGUgY29uZmxpY3RzLiAgYGdpdC1kaWZmYCB3b3VsZCByZXBvcnQgb25seSB0aGUKKyAgIGNvbmZsaWN0aW5nIHBhdGhzIGJlY2F1c2Ugb2YgdGhlIGFib3ZlIDIuIGFuZCAzLi4gIEVkaXQgdGhlCisgICB3b3JraW5nIHRyZWUgZmlsZXMgaW50byBhIGRlc2lyYWJsZSBzaGFwZSwgYGdpdC1hZGRgIG9yIGBnaXQtcm1gCisgICB0aGVtLCB0byBtYWtlIHRoZSBpbmRleCBmaWxlIGNvbnRhaW4gd2hhdCB0aGUgbWVyZ2UgcmVzdWx0CisgICBzaG91bGQgYmUsIGFuZCBydW4gYGdpdC1jb21taXRgIHRvIGNvbW1pdCB0aGUgcmVzdWx0LgorCisKK1NFRSBBTFNPCistLS0tLS0tLQorbGlua2dpdDpnaXQtZm10LW1lcmdlLW1zZ1sxXSwgbGlua2dpdDpnaXQtcHVsbFsxXSwKK2xpbmtnaXQ6Z2l0YXR0cmlidXRlc1s1XQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZXRvb2wudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2V0b29sLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWQ0NDk0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2V0b29sLnR4dApAQCAtMCwwICsxLDczIEBACitnaXQtbWVyZ2V0b29sKDEpCis9PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1tZXJnZXRvb2wgLSBSdW4gbWVyZ2UgY29uZmxpY3QgcmVzb2x1dGlvbiB0b29scyB0byByZXNvbHZlIG1lcmdlIGNvbmZsaWN0cworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtbWVyZ2V0b29sJyBbLS10b29sPTx0b29sPl0gWzxmaWxlPl0uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK1VzZSBgZ2l0IG1lcmdldG9vbGAgdG8gcnVuIG9uZSBvZiBzZXZlcmFsIG1lcmdlIHV0aWxpdGllcyB0byByZXNvbHZlCittZXJnZSBjb25mbGljdHMuICBJdCBpcyB0eXBpY2FsbHkgcnVuIGFmdGVyIGxpbmtnaXQ6Z2l0LW1lcmdlWzFdLgorCitJZiBvbmUgb3IgbW9yZSA8ZmlsZT4gcGFyYW1ldGVycyBhcmUgZ2l2ZW4sIHRoZSBtZXJnZSB0b29sIHByb2dyYW0gd2lsbAorYmUgcnVuIHRvIHJlc29sdmUgZGlmZmVyZW5jZXMgb24gZWFjaCBmaWxlLiAgSWYgbm8gPGZpbGU+IG5hbWVzIGFyZQorc3BlY2lmaWVkLCBgZ2l0IG1lcmdldG9vbGAgd2lsbCBydW4gdGhlIG1lcmdlIHRvb2wgcHJvZ3JhbSBvbiBldmVyeSBmaWxlCit3aXRoIG1lcmdlIGNvbmZsaWN0cy4KKworT1BUSU9OUworLS0tLS0tLQorLXQgb3IgLS10b29sPTx0b29sPjo6CisJVXNlIHRoZSBtZXJnZSByZXNvbHV0aW9uIHByb2dyYW0gc3BlY2lmaWVkIGJ5IDx0b29sPi4KKwlWYWxpZCBtZXJnZSB0b29scyBhcmU6CisJa2RpZmYzLCB0a2RpZmYsIG1lbGQsIHh4ZGlmZiwgZW1lcmdlLCB2aW1kaWZmLCBndmltZGlmZiwgZWNtZXJnZSwgYW5kIG9wZW5kaWZmCisrCitJZiBhIG1lcmdlIHJlc29sdXRpb24gcHJvZ3JhbSBpcyBub3Qgc3BlY2lmaWVkLCBgZ2l0IG1lcmdldG9vbGAKK3dpbGwgdXNlIHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGBtZXJnZS50b29sYC4gIElmIHRoZQorY29uZmlndXJhdGlvbiB2YXJpYWJsZSBgbWVyZ2UudG9vbGAgaXMgbm90IHNldCwgYGdpdCBtZXJnZXRvb2xgCit3aWxsIHBpY2sgYSBzdWl0YWJsZSBkZWZhdWx0LgorKworWW91IGNhbiBleHBsaWNpdGx5IHByb3ZpZGUgYSBmdWxsIHBhdGggdG8gdGhlIHRvb2wgYnkgc2V0dGluZyB0aGUKK2NvbmZpZ3VyYXRpb24gdmFyaWFibGUgYG1lcmdldG9vbC48dG9vbD4ucGF0aGAuIEZvciBleGFtcGxlLCB5b3UKK2NhbiBjb25maWd1cmUgdGhlIGFic29sdXRlIHBhdGggdG8ga2RpZmYzIGJ5IHNldHRpbmcKK2BtZXJnZXRvb2wua2RpZmYzLnBhdGhgLiBPdGhlcndpc2UsIGBnaXQgbWVyZ2V0b29sYCBhc3N1bWVzIHRoZQordG9vbCBpcyBhdmFpbGFibGUgaW4gUEFUSC4KKysKK0luc3RlYWQgb2YgcnVubmluZyBvbmUgb2YgdGhlIGtub3duIG1lcmdlIHRvb2wgcHJvZ3JhbXMKK2BnaXQgbWVyZ2V0b29sYCBjYW4gYmUgY3VzdG9taXplZCB0byBydW4gYW4gYWx0ZXJuYXRpdmUgcHJvZ3JhbQorYnkgc3BlY2lmeWluZyB0aGUgY29tbWFuZCBsaW5lIHRvIGludm9rZSBpbiBhIGNvbmZpZ3JhdGlvbgordmFyaWFibGUgYG1lcmdldG9vbC48dG9vbD4uY21kYC4KKysKK1doZW4gYGdpdCBtZXJnZXRvb2xgIGlzIGludm9rZWQgd2l0aCB0aGlzIHRvb2wgKGVpdGhlciB0aHJvdWdoIHRoZQorYC10YCBvciBgLS10b29sYCBvcHRpb24gb3IgdGhlIGBtZXJnZS50b29sYCBjb25maWd1cmF0aW9uCit2YXJpYWJsZSkgdGhlIGNvbmZpZ3VyZWQgY29tbWFuZCBsaW5lIHdpbGwgYmUgaW52b2tlZCB3aXRoIGAkQkFTRWAKK3NldCB0byB0aGUgbmFtZSBvZiBhIHRlbXBvcmFyeSBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvbW1vbiBiYXNlIGZvcgordGhlIG1lcmdlLCBpZiBhdmFpbGFibGU7IGAkTE9DQUxgIHNldCB0byB0aGUgbmFtZSBvZiBhIHRlbXBvcmFyeQorZmlsZSBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBvbiB0aGUgY3VycmVudCBicmFuY2g7CitgJFJFTU9URWAgc2V0IHRvIHRoZSBuYW1lIG9mIGEgdGVtcG9yYXJ5IGZpbGUgY29udGFpbmluZyB0aGUKK2NvbnRlbnRzIG9mIHRoZSBmaWxlIHRvIGJlIG1lcmdlZCwgYW5kIGAkTUVSR0VEYCBzZXQgdG8gdGhlIG5hbWUKK29mIHRoZSBmaWxlIHRvIHdoaWNoIHRoZSBtZXJnZSB0b29sIHNob3VsZCB3cml0ZSB0aGUgcmVzdWx0IG9mIHRoZQorbWVyZ2UgcmVzb2x1dGlvbi4KKysKK0lmIHRoZSBjdXN0b20gbWVyZ2UgdG9vbCBjb3JyZWN0bHkgaW5kaWNhdGVzIHRoZSBzdWNjZXNzIG9mIGEKK21lcmdlIHJlc29sdXRpb24gd2l0aCBpdHMgZXhpdCBjb2RlIHRoZW4gdGhlIGNvbmZpZ3VyYXRpb24KK3ZhcmlhYmxlIGBtZXJnZXRvb2wuPHRvb2w+LnRydXN0RXhpdENvZGVgIGNhbiBiZSBzZXQgdG8gYHRydWVgLgorT3RoZXJ3aXNlLCBgZ2l0IG1lcmdldG9vbGAgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gaW5kaWNhdGUgdGhlCitzdWNjZXNzIG9mIHRoZSByZXNvbHV0aW9uIGFmdGVyIHRoZSBjdXN0b20gdG9vbCBoYXMgZXhpdGVkLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBUaGVvZG9yZSBZIFRzJ28gPHR5dHNvQG1pdC5lZHU+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IFRoZW9kb3JlIFkgVHMnby4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1ta3RhZy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1ta3RhZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkYjlmNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LW1rdGFnLnR4dApAQCAtMCwwICsxLDQ2IEBACitnaXQtbWt0YWcoMSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbWt0YWcgLSBDcmVhdGVzIGEgdGFnIG9iamVjdAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1ta3RhZycgPCBzaWduYXR1cmVfZmlsZQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1JlYWRzIGEgdGFnIGNvbnRlbnRzIG9uIHN0YW5kYXJkIGlucHV0IGFuZCBjcmVhdGVzIGEgdGFnIG9iamVjdAordGhhdCBjYW4gYWxzbyBiZSB1c2VkIHRvIHNpZ24gb3RoZXIgb2JqZWN0cy4KKworVGhlIG91dHB1dCBpcyB0aGUgbmV3IHRhZydzIDxvYmplY3Q+IGlkZW50aWZpZXIuCisKK1RhZyBGb3JtYXQKKy0tLS0tLS0tLS0KK0EgdGFnIHNpZ25hdHVyZSBmaWxlIGhhcyBhIHZlcnkgc2ltcGxlIGZpeGVkIGZvcm1hdDogZm91ciBsaW5lcyBvZgorCisgIG9iamVjdCA8c2hhMT4KKyAgdHlwZSA8dHlwZW5hbWU+CisgIHRhZyA8dGFnbmFtZT4KKyAgdGFnZ2VyIDx0YWdnZXI+CisKK2ZvbGxvd2VkIGJ5IHNvbWUgJ29wdGlvbmFsJyBmcmVlLWZvcm0gbWVzc2FnZSAoc29tZSB0YWdzIGNyZWF0ZWQKK2J5IG9sZGVyIGdpdCBtYXkgbm90IGhhdmUgYHRhZ2dlcmAgbGluZSkuICBUaGUgbWVzc2FnZSwgd2hlbgorZXhpc3RzLCBpcyBzZXBhcmF0ZWQgYnkgYSBibGFuayBsaW5lIGZyb20gdGhlIGhlYWRlci4gIFRoZQorbWVzc2FnZSBwYXJ0IG1heSBjb250YWluIGEgc2lnbmF0dXJlIHRoYXQgZ2l0IGl0c2VsZiBkb2Vzbid0CitjYXJlIGFib3V0LCBidXQgdGhhdCBjYW4gYmUgdmVyaWZpZWQgd2l0aCBncGcuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1ta3RyZWUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbWt0cmVlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzEyMDM2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbWt0cmVlLnR4dApAQCAtMCwwICsxLDM0IEBACitnaXQtbWt0cmVlKDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1ta3RyZWUgLSBCdWlsZCBhIHRyZWUtb2JqZWN0IGZyb20gbHMtdHJlZSBmb3JtYXR0ZWQgdGV4dAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1ta3RyZWUnIFstel0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitSZWFkcyBzdGFuZGFyZCBpbnB1dCBpbiBub24tcmVjdXJzaXZlIGBscy10cmVlYCBvdXRwdXQgZm9ybWF0LAorYW5kIGNyZWF0ZXMgYSB0cmVlIG9iamVjdC4gIFRoZSBvYmplY3QgbmFtZSBvZiB0aGUgdHJlZSBvYmplY3QKK2J1aWx0IGlzIHdyaXR0ZW4gdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4KKworT1BUSU9OUworLS0tLS0tLQorLXo6OgorCVJlYWQgdGhlIE5VTC10ZXJtaW5hdGVkIGBscy10cmVlIC16YCBvdXRwdXQgaW5zdGVhZC4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1tdi50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1tdi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmM2ZiZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LW12LnR4dApAQCAtMCwwICsxLDUzIEBACitnaXQtbXYoMSkKKz09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbXYgLSBNb3ZlIG9yIHJlbmFtZSBhIGZpbGUsIGEgZGlyZWN0b3J5LCBvciBhIHN5bWxpbmsKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtbXYnIDxvcHRpb25zPi4uLiA8YXJncz4uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIG1vdmUgb3IgcmVuYW1lIGEgZmlsZSwgZGlyZWN0b3J5IG9yIHN5bWxpbmsuCisKKyBnaXQtbXYgWy1mXSBbLW5dIDxzb3VyY2U+IDxkZXN0aW5hdGlvbj4KKyBnaXQtbXYgWy1mXSBbLW5dIFsta10gPHNvdXJjZT4gLi4uIDxkZXN0aW5hdGlvbiBkaXJlY3Rvcnk+CisKK0luIHRoZSBmaXJzdCBmb3JtLCBpdCByZW5hbWVzIDxzb3VyY2U+LCB3aGljaCBtdXN0IGV4aXN0IGFuZCBiZSBlaXRoZXIKK2EgZmlsZSwgc3ltbGluayBvciBkaXJlY3RvcnksIHRvIDxkZXN0aW5hdGlvbj4uCitJbiB0aGUgc2Vjb25kIGZvcm0sIHRoZSBsYXN0IGFyZ3VtZW50IGhhcyB0byBiZSBhbiBleGlzdGluZworZGlyZWN0b3J5OyB0aGUgZ2l2ZW4gc291cmNlcyB3aWxsIGJlIG1vdmVkIGludG8gdGhpcyBkaXJlY3RvcnkuCisKK1RoZSBpbmRleCBpcyB1cGRhdGVkIGFmdGVyIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiwgYnV0IHRoZSBjaGFuZ2UgbXVzdCBzdGlsbCBiZQorY29tbWl0dGVkLgorCitPUFRJT05TCistLS0tLS0tCistZjo6CisJRm9yY2UgcmVuYW1pbmcgb3IgbW92aW5nIG9mIGEgZmlsZSBldmVuIGlmIHRoZSB0YXJnZXQgZXhpc3RzCistazo6CisgICAgICAgIFNraXAgbW92ZSBvciByZW5hbWUgYWN0aW9ucyB3aGljaCB3b3VsZCBsZWFkIHRvIGFuIGVycm9yCisJY29uZGl0aW9uLiBBbiBlcnJvciBoYXBwZW5zIHdoZW4gYSBzb3VyY2UgaXMgbmVpdGhlciBleGlzdGluZyBub3IKKyAgICAgICAgY29udHJvbGxlZCBieSBHSVQsIG9yIHdoZW4gaXQgd291bGQgb3ZlcndyaXRlIGFuIGV4aXN0aW5nCisgICAgICAgIGZpbGUgdW5sZXNzICctZicgaXMgZ2l2ZW4uCistbiwgXC0tZHJ5LXJ1bjo6CisJRG8gbm90aGluZzsgb25seSBzaG93IHdoYXQgd291bGQgaGFwcGVuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorUmV3cml0dGVuIGJ5IFJ5YW4gQW5kZXJzb24gPHJ5YW5AbWljaG9ubGluZS5jb20+CitNb3ZlIGZ1bmN0aW9uYWxpdHkgYWRkZWQgYnkgSm9zZWYgV2VpZGVuZG9yZmVyIDxKb3NlZi5XZWlkZW5kb3JmZXJAZ214LmRlPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1uYW1lLXJldi50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1uYW1lLXJldi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZjYWJkYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LW5hbWUtcmV2LnR4dApAQCAtMCwwICsxLDc4IEBACitnaXQtbmFtZS1yZXYoMSkKKz09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbmFtZS1yZXYgLSBGaW5kIHN5bWJvbGljIG5hbWVzIGZvciBnaXZlbiByZXZzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LW5hbWUtcmV2JyBbLS10YWdzXSBbLS1yZWZzPTxwYXR0ZXJuPl0KKwkgICAgICAgKCAtLWFsbCB8IC0tc3RkaW4gfCA8Y29tbWl0dGlzaD4uLi4gKQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0ZpbmRzIHN5bWJvbGljIG5hbWVzIHN1aXRhYmxlIGZvciBodW1hbiBkaWdlc3Rpb24gZm9yIHJldmlzaW9ucyBnaXZlbiBpbiBhbnkKK2Zvcm1hdCBwYXJzYWJsZSBieSBnaXQtcmV2LXBhcnNlLgorCisKK09QVElPTlMKKy0tLS0tLS0KKworLS10YWdzOjoKKwlEbyBub3QgdXNlIGJyYW5jaCBuYW1lcywgYnV0IG9ubHkgdGFncyB0byBuYW1lIHRoZSBjb21taXRzCisKKy0tcmVmcz08cGF0dGVybj46OgorCU9ubHkgdXNlIHJlZnMgd2hvc2UgbmFtZXMgbWF0Y2ggYSBnaXZlbiBzaGVsbCBwYXR0ZXJuLgorCistLWFsbDo6CisJTGlzdCBhbGwgY29tbWl0cyByZWFjaGFibGUgZnJvbSBhbGwgcmVmcworCistLXN0ZGluOjoKKwlSZWFkIGZyb20gc3RkaW4sIGFwcGVuZCAiKDxyZXZfbmFtZT4pIiB0byBhbGwgc2hhMSdzIG9mIG5hbWVhYmxlCisJY29tbWl0cywgYW5kIHBhc3MgdG8gc3Rkb3V0CisKKy0tbmFtZS1vbmx5OjoKKwlJbnN0ZWFkIG9mIHByaW50aW5nIGJvdGggdGhlIFNIQS0xIGFuZCB0aGUgbmFtZSwgcHJpbnQgb25seQorCXRoZSBuYW1lLiAgSWYgZ2l2ZW4gd2l0aCAtLXRhZ3MgdGhlIHVzdWFsIHRhZyBwcmVmaXggb2YKKwkidGFncy8iIGlzIGFsc28gb21pdHRlZCBmcm9tIHRoZSBuYW1lLCBtYXRjaGluZyB0aGUgb3V0cHV0CisJb2YgbGlua2dpdDpnaXQtZGVzY3JpYmVbMV0gbW9yZSBjbG9zZWx5LiAgVGhpcyBvcHRpb24KKwljYW5ub3QgYmUgY29tYmluZWQgd2l0aCAtLXN0ZGluLgorCitFWEFNUExFCistLS0tLS0tCisKK0dpdmVuIGEgY29tbWl0LCBmaW5kIG91dCB3aGVyZSBpdCBpcyByZWxhdGl2ZSB0byB0aGUgbG9jYWwgcmVmcy4gU2F5IHNvbWVib2R5Cit3cm90ZSB5b3UgYWJvdXQgdGhhdCBmYW50YXN0aWMgY29tbWl0IDMzZGI1ZjRkOTAyN2ExMGU0NzdjY2YwNTRiMmMxYWI5NGY3NGM4NWEuCitPZiBjb3Vyc2UsIHlvdSBsb29rIGludG8gdGhlIGNvbW1pdCwgYnV0IHRoYXQgb25seSB0ZWxscyB5b3Ugd2hhdCBoYXBwZW5lZCwgYnV0Citub3QgdGhlIGNvbnRleHQuCisKK0VudGVyIGdpdC1uYW1lLXJldjoKKworLS0tLS0tLS0tLS0tCislIGdpdCBuYW1lLXJldiAzM2RiNWY0ZDkwMjdhMTBlNDc3Y2NmMDU0YjJjMWFiOTRmNzRjODVhCiszM2RiNWY0ZDkwMjdhMTBlNDc3Y2NmMDU0YjJjMWFiOTRmNzRjODVhIHRhZ3MvdjAuOTleMH45NDAKKy0tLS0tLS0tLS0tLQorCitOb3cgeW91IGFyZSB3aXNlciwgYmVjYXVzZSB5b3Uga25vdyB0aGF0IGl0IGhhcHBlbmVkIDk0MCByZXZpc2lvbnMgYmVmb3JlIHYwLjk5LgorCitBbm90aGVyIG5pY2UgdGhpbmcgeW91IGNhbiBkbyBpczoKKworLS0tLS0tLS0tLS0tCislIGdpdCBsb2cgfCBnaXQgbmFtZS1yZXYgLS1zdGRpbgorLS0tLS0tLS0tLS0tCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSm9oYW5uZXMgU2NoaW5kZWxpbiA8Sm9oYW5uZXMuU2NoaW5kZWxpbkBnbXguZGU+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEpvaGFubmVzIFNjaGluZGVsaW4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcGFjay1vYmplY3RzLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXBhY2stb2JqZWN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ExYmUwOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXBhY2stb2JqZWN0cy50eHQKQEAgLTAsMCArMSwyMTEgQEAKK2dpdC1wYWNrLW9iamVjdHMoMSkKKz09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXBhY2stb2JqZWN0cyAtIENyZWF0ZSBhIHBhY2tlZCBhcmNoaXZlIG9mIG9iamVjdHMKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtcGFjay1vYmplY3RzJyBbLXFdIFstLW5vLXJldXNlLWRlbHRhXSBbLS1kZWx0YS1iYXNlLW9mZnNldF0gWy0tbm9uLWVtcHR5XQorCVstLWxvY2FsXSBbLS1pbmNyZW1lbnRhbF0gWy0td2luZG93PU5dIFstLWRlcHRoPU5dIFstLWFsbC1wcm9ncmVzc10KKwlbLS1yZXZzIFstLXVucGFja2VkIHwgLS1hbGxdKl0gWy0tc3Rkb3V0IHwgYmFzZS1uYW1lXSA8IG9iamVjdC1saXN0CisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitSZWFkcyBsaXN0IG9mIG9iamVjdHMgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQsIGFuZCB3cml0ZXMgYSBwYWNrZWQKK2FyY2hpdmUgd2l0aCBzcGVjaWZpZWQgYmFzZS1uYW1lLCBvciB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LgorCitBIHBhY2tlZCBhcmNoaXZlIGlzIGFuIGVmZmljaWVudCB3YXkgdG8gdHJhbnNmZXIgc2V0IG9mIG9iamVjdHMKK2JldHdlZW4gdHdvIHJlcG9zaXRvcmllcywgYW5kIGFsc28gaXMgYW4gYXJjaGl2YWwgZm9ybWF0IHdoaWNoCitpcyBlZmZpY2llbnQgdG8gYWNjZXNzLiAgVGhlIHBhY2tlZCBhcmNoaXZlIGZvcm1hdCAoLnBhY2spIGlzCitkZXNpZ25lZCB0byBiZSBzZWxmIGNvbnRhaW5lZCBzbyB0aGF0IGl0IGNhbiBiZSB1bnBhY2tlZCB3aXRob3V0CithbnkgZnVydGhlciBpbmZvcm1hdGlvbiwgYnV0IGZvciBmYXN0LCByYW5kb20gYWNjZXNzIHRvIHRoZSBvYmplY3RzCitpbiB0aGUgcGFjaywgYSBwYWNrIGluZGV4IGZpbGUgKC5pZHgpIHdpbGwgYmUgZ2VuZXJhdGVkLgorCitQbGFjaW5nIGJvdGggaW4gdGhlIHBhY2svIHN1YmRpcmVjdG9yeSBvZiAkR0lUX09CSkVDVF9ESVJFQ1RPUlkgKG9yCithbnkgb2YgdGhlIGRpcmVjdG9yaWVzIG9uICRHSVRfQUxURVJOQVRFX09CSkVDVF9ESVJFQ1RPUklFUykKK2VuYWJsZXMgZ2l0IHRvIHJlYWQgZnJvbSBzdWNoIGFuIGFyY2hpdmUuCisKKydnaXQtdW5wYWNrLW9iamVjdHMnIGNvbW1hbmQgY2FuIHJlYWQgdGhlIHBhY2tlZCBhcmNoaXZlIGFuZAorZXhwYW5kIHRoZSBvYmplY3RzIGNvbnRhaW5lZCBpbiB0aGUgcGFjayBpbnRvICJvbmUtZmlsZQorb25lLW9iamVjdCIgZm9ybWF0OyB0aGlzIGlzIHR5cGljYWxseSBkb25lIGJ5IHRoZSBzbWFydC1wdWxsCitjb21tYW5kcyB3aGVuIGEgcGFjayBpcyBjcmVhdGVkIG9uLXRoZS1mbHkgZm9yIGVmZmljaWVudCBuZXR3b3JrCit0cmFuc3BvcnQgYnkgdGhlaXIgcGVlcnMuCisKK0luIGEgcGFja2VkIGFyY2hpdmUsIGFuIG9iamVjdCBpcyBlaXRoZXIgc3RvcmVkIGFzIGEgY29tcHJlc3NlZAord2hvbGUsIG9yIGFzIGEgZGlmZmVyZW5jZSBmcm9tIHNvbWUgb3RoZXIgb2JqZWN0LiAgVGhlIGxhdHRlciBpcworb2Z0ZW4gY2FsbGVkIGEgZGVsdGEuCisKKworT1BUSU9OUworLS0tLS0tLQorYmFzZS1uYW1lOjoKKwlXcml0ZSBpbnRvIGEgcGFpciBvZiBmaWxlcyAoLnBhY2sgYW5kIC5pZHgpLCB1c2luZworCTxiYXNlLW5hbWU+IHRvIGRldGVybWluZSB0aGUgbmFtZSBvZiB0aGUgY3JlYXRlZCBmaWxlLgorCVdoZW4gdGhpcyBvcHRpb24gaXMgdXNlZCwgdGhlIHR3byBmaWxlcyBhcmUgd3JpdHRlbiBpbgorCTxiYXNlLW5hbWU+LTxTSEExPi57cGFjayxpZHh9IGZpbGVzLiAgPFNIQTE+IGlzIGEgaGFzaAorCW9mIHRoZSBzb3J0ZWQgb2JqZWN0IG5hbWVzIHRvIG1ha2UgdGhlIHJlc3VsdGluZyBmaWxlbmFtZQorCWJhc2VkIG9uIHRoZSBwYWNrIGNvbnRlbnQsIGFuZCB3cml0dGVuIHRvIHRoZSBzdGFuZGFyZAorCW91dHB1dCBvZiB0aGUgY29tbWFuZC4KKworLS1zdGRvdXQ6OgorCVdyaXRlIHRoZSBwYWNrIGNvbnRlbnRzICh3aGF0IHdvdWxkIGhhdmUgYmVlbiB3cml0dGVuIHRvCisJLnBhY2sgZmlsZSkgb3V0IHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuCisKKy0tcmV2czo6CisJUmVhZCB0aGUgcmV2aXNpb24gYXJndW1lbnRzIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0LCBpbnN0ZWFkIG9mCisJaW5kaXZpZHVhbCBvYmplY3QgbmFtZXMuICBUaGUgcmV2aXNpb24gYXJndW1lbnRzIGFyZSBwcm9jZXNzZWQKKwl0aGUgc2FtZSB3YXkgYXMgbGlua2dpdDpnaXQtcmV2LWxpc3RbMV0gd2l0aCBgLS1vYmplY3RzYCBmbGFnCisJdXNlcyBpdHMgYGNvbW1pdGAgYXJndW1lbnRzIHRvIGJ1aWxkIHRoZSBsaXN0IG9mIG9iamVjdHMgaXQKKwlvdXRwdXRzLiAgVGhlIG9iamVjdHMgb24gdGhlIHJlc3VsdGluZyBsaXN0IGFyZSBwYWNrZWQuCisKKy0tdW5wYWNrZWQ6OgorCVRoaXMgaW1wbGllcyBgLS1yZXZzYC4gIFdoZW4gcHJvY2Vzc2luZyB0aGUgbGlzdCBvZgorCXJldmlzaW9uIGFyZ3VtZW50cyByZWFkIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0LCBsaW1pdAorCXRoZSBvYmplY3RzIHBhY2tlZCB0byB0aG9zZSB0aGF0IGFyZSBub3QgYWxyZWFkeSBwYWNrZWQuCisKKy0tYWxsOjoKKwlUaGlzIGltcGxpZXMgYC0tcmV2c2AuICBJbiBhZGRpdGlvbiB0byB0aGUgbGlzdCBvZgorCXJldmlzaW9uIGFyZ3VtZW50cyByZWFkIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0LCBwcmV0ZW5kCisJYXMgaWYgYWxsIHJlZnMgdW5kZXIgYCRHSVRfRElSL3JlZnNgIGFyZSBzcGVjaWZpZWQgdG8gYmUKKwlpbmNsdWRlZC4KKworLS1pbmNsdWRlLXRhZzo6CisJSW5jbHVkZSB1bmFza2VkLWZvciBhbm5vdGF0ZWQgdGFncyBpZiB0aGUgb2JqZWN0IHRoZXkKKwlyZWZlcmVuY2Ugd2FzIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgcGFja2ZpbGUuICBUaGlzCisJY2FuIGJlIHVzZWZ1bCB0byBzZW5kIG5ldyB0YWdzIHRvIG5hdGl2ZSBnaXQgY2xpZW50cy4KKworLS13aW5kb3c9W05dLCAtLWRlcHRoPVtOXTo6CisJVGhlc2UgdHdvIG9wdGlvbnMgYWZmZWN0IGhvdyB0aGUgb2JqZWN0cyBjb250YWluZWQgaW4KKwl0aGUgcGFjayBhcmUgc3RvcmVkIHVzaW5nIGRlbHRhIGNvbXByZXNzaW9uLiAgVGhlCisJb2JqZWN0cyBhcmUgZmlyc3QgaW50ZXJuYWxseSBzb3J0ZWQgYnkgdHlwZSwgc2l6ZSBhbmQKKwlvcHRpb25hbGx5IG5hbWVzIGFuZCBjb21wYXJlZCBhZ2FpbnN0IHRoZSBvdGhlciBvYmplY3RzCisJd2l0aGluIC0td2luZG93IHRvIHNlZSBpZiB1c2luZyBkZWx0YSBjb21wcmVzc2lvbiBzYXZlcworCXNwYWNlLiAgLS1kZXB0aCBsaW1pdHMgdGhlIG1heGltdW0gZGVsdGEgZGVwdGg7IG1ha2luZworCWl0IHRvbyBkZWVwIGFmZmVjdHMgdGhlIHBlcmZvcm1hbmNlIG9uIHRoZSB1bnBhY2tlcgorCXNpZGUsIGJlY2F1c2UgZGVsdGEgZGF0YSBuZWVkcyB0byBiZSBhcHBsaWVkIHRoYXQgbWFueQorCXRpbWVzIHRvIGdldCB0byB0aGUgbmVjZXNzYXJ5IG9iamVjdC4KKwlUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgLS13aW5kb3cgaXMgMTAgYW5kIC0tZGVwdGggaXMgNTAuCisKKy0td2luZG93LW1lbW9yeT1bTl06OgorCVRoaXMgb3B0aW9uIHByb3ZpZGVzIGFuIGFkZGl0aW9uYWwgbGltaXQgb24gdG9wIG9mIGAtLXdpbmRvd2A7CisJdGhlIHdpbmRvdyBzaXplIHdpbGwgZHluYW1pY2FsbHkgc2NhbGUgZG93biBzbyBhcyB0byBub3QgdGFrZQorCXVwIG1vcmUgdGhhbiBOIGJ5dGVzIGluIG1lbW9yeS4gIFRoaXMgaXMgdXNlZnVsIGluCisJcmVwb3NpdG9yaWVzIHdpdGggYSBtaXggb2YgbGFyZ2UgYW5kIHNtYWxsIG9iamVjdHMgdG8gbm90IHJ1bgorCW91dCBvZiBtZW1vcnkgd2l0aCBhIGxhcmdlIHdpbmRvdywgYnV0IHN0aWxsIGJlIGFibGUgdG8gdGFrZQorCWFkdmFudGFnZSBvZiB0aGUgbGFyZ2Ugd2luZG93IGZvciB0aGUgc21hbGxlciBvYmplY3RzLiAgVGhlCisJc2l6ZSBjYW4gYmUgc3VmZml4ZWQgd2l0aCAiayIsICJtIiwgb3IgImciLgorCWAtLXdpbmRvdy1tZW1vcnk9MGAgbWFrZXMgbWVtb3J5IHVzYWdlIHVubGltaXRlZCwgd2hpY2ggaXMgdGhlCisJZGVmYXVsdC4KKworLS1tYXgtcGFjay1zaXplPTxuPjo6CisJTWF4aW11bSBzaXplIG9mIGVhY2ggb3V0cHV0IHBhY2tmaWxlLCBleHByZXNzZWQgaW4gTWlCLgorCUlmIHNwZWNpZmllZCwgIG11bHRpcGxlIHBhY2tmaWxlcyBtYXkgYmUgY3JlYXRlZC4KKwlUaGUgZGVmYXVsdCBpcyB1bmxpbWl0ZWQsIHVubGVzcyB0aGUgY29uZmlnIHZhcmlhYmxlCisJYHBhY2sucGFja1NpemVMaW1pdGAgaXMgc2V0LgorCistLWluY3JlbWVudGFsOjoKKwlUaGlzIGZsYWcgY2F1c2VzIGFuIG9iamVjdCBhbHJlYWR5IGluIGEgcGFjayBpZ25vcmVkCisJZXZlbiBpZiBpdCBhcHBlYXJzIGluIHRoZSBzdGFuZGFyZCBpbnB1dC4KKworLS1sb2NhbDo6CisJVGhpcyBmbGFnIGlzIHNpbWlsYXIgdG8gYC0taW5jcmVtZW50YWxgOyBpbnN0ZWFkIG9mCisJaWdub3JpbmcgYWxsIHBhY2tlZCBvYmplY3RzLCBpdCBvbmx5IGlnbm9yZXMgb2JqZWN0cworCXRoYXQgYXJlIHBhY2tlZCBhbmQgbm90IGluIHRoZSBsb2NhbCBvYmplY3Qgc3RvcmUKKwkoaS5lLiBib3Jyb3dlZCBmcm9tIGFuIGFsdGVybmF0ZSkuCisKKy0tbm9uLWVtcHR5OjoKKyAgICAgICAgT25seSBjcmVhdGUgYSBwYWNrZWQgYXJjaGl2ZSBpZiBpdCB3b3VsZCBjb250YWluIGF0CisgICAgICAgIGxlYXN0IG9uZSBvYmplY3QuCisKKy0tcHJvZ3Jlc3M6OgorCVByb2dyZXNzIHN0YXR1cyBpcyByZXBvcnRlZCBvbiB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyZWFtCisJYnkgZGVmYXVsdCB3aGVuIGl0IGlzIGF0dGFjaGVkIHRvIGEgdGVybWluYWwsIHVubGVzcyAtcQorCWlzIHNwZWNpZmllZC4gVGhpcyBmbGFnIGZvcmNlcyBwcm9ncmVzcyBzdGF0dXMgZXZlbiBpZgorCXRoZSBzdGFuZGFyZCBlcnJvciBzdHJlYW0gaXMgbm90IGRpcmVjdGVkIHRvIGEgdGVybWluYWwuCisKKy0tYWxsLXByb2dyZXNzOjoKKwlXaGVuIC0tc3Rkb3V0IGlzIHNwZWNpZmllZCB0aGVuIHByb2dyZXNzIHJlcG9ydCBpcworCWRpc3BsYXllZCBkdXJpbmcgdGhlIG9iamVjdCBjb3VudCBhbmQgZGVsdGlmaWNhdGlvbiBwaGFzZXMKKwlidXQgaW5oaWJpdGVkIGR1cmluZyB0aGUgd3JpdGUtb3V0IHBoYXNlLiBUaGUgcmVhc29uIGlzCisJdGhhdCBpbiBzb21lIGNhc2VzIHRoZSBvdXRwdXQgc3RyZWFtIGlzIGRpcmVjdGx5IGxpbmtlZAorCXRvIGFub3RoZXIgY29tbWFuZCB3aGljaCBtYXkgd2lzaCB0byBkaXNwbGF5IHByb2dyZXNzCisJc3RhdHVzIG9mIGl0cyBvd24gYXMgaXQgcHJvY2Vzc2VzIGluY29taW5nIHBhY2sgZGF0YS4KKwlUaGlzIGZsYWcgaXMgbGlrZSAtLXByb2dyZXNzIGV4Y2VwdCB0aGF0IGl0IGZvcmNlcyBwcm9ncmVzcworCXJlcG9ydCBmb3IgdGhlIHdyaXRlLW91dCBwaGFzZSBhcyB3ZWxsIGV2ZW4gaWYgLS1zdGRvdXQgaXMKKwl1c2VkLgorCistcTo6CisJVGhpcyBmbGFnIG1ha2VzIHRoZSBjb21tYW5kIG5vdCB0byByZXBvcnQgaXRzIHByb2dyZXNzCisJb24gdGhlIHN0YW5kYXJkIGVycm9yIHN0cmVhbS4KKworLS1uby1yZXVzZS1kZWx0YTo6CisJV2hlbiBjcmVhdGluZyBhIHBhY2tlZCBhcmNoaXZlIGluIGEgcmVwb3NpdG9yeSB0aGF0CisJaGFzIGV4aXN0aW5nIHBhY2tzLCB0aGUgY29tbWFuZCByZXVzZXMgZXhpc3RpbmcgZGVsdGFzLgorCVRoaXMgc29tZXRpbWVzIHJlc3VsdHMgaW4gYSBzbGlnaHRseSBzdWJvcHRpbWFsIHBhY2suCisJVGhpcyBmbGFnIHRlbGxzIHRoZSBjb21tYW5kIG5vdCB0byByZXVzZSBleGlzdGluZyBkZWx0YXMKKwlidXQgY29tcHV0ZSB0aGVtIGZyb20gc2NyYXRjaC4KKworLS1uby1yZXVzZS1vYmplY3Q6OgorCVRoaXMgZmxhZyB0ZWxscyB0aGUgY29tbWFuZCBub3QgdG8gcmV1c2UgZXhpc3Rpbmcgb2JqZWN0IGRhdGEgYXQgYWxsLAorCWluY2x1ZGluZyBub24gZGVsdGlmaWVkIG9iamVjdCwgZm9yY2luZyByZWNvbXByZXNzaW9uIG9mIGV2ZXJ5dGhpbmcuCisJVGhpcyBpbXBsaWVzIC0tbm8tcmV1c2UtZGVsdGEuIFVzZWZ1bCBvbmx5IGluIHRoZSBvYnNjdXJlIGNhc2Ugd2hlcmUKKwl3aG9sZXNhbGUgZW5mb3JjZW1lbnQgb2YgYSBkaWZmZXJlbnQgY29tcHJlc3Npb24gbGV2ZWwgb24gdGhlCisJcGFja2VkIGRhdGEgaXMgZGVzaXJlZC4KKworLS1jb21wcmVzc2lvbj1bTl06OgorCVNwZWNpZmllcyBjb21wcmVzc2lvbiBsZXZlbCBmb3IgbmV3bHktY29tcHJlc3NlZCBkYXRhIGluIHRoZQorCWdlbmVyYXRlZCBwYWNrLiAgSWYgbm90IHNwZWNpZmllZCwgIHBhY2sgY29tcHJlc3Npb24gbGV2ZWwgaXMKKwlkZXRlcm1pbmVkIGZpcnN0IGJ5IHBhY2suY29tcHJlc3Npb24sICB0aGVuIGJ5IGNvcmUuY29tcHJlc3Npb24sCisJYW5kIGRlZmF1bHRzIHRvIC0xLCAgdGhlIHpsaWIgZGVmYXVsdCwgIGlmIG5laXRoZXIgaXMgc2V0LgorCUFkZCBcLS1uby1yZXVzZS1vYmplY3QgaWYgeW91IHdhbnQgdG8gZm9yY2UgYSB1bmlmb3JtIGNvbXByZXNzaW9uCisJbGV2ZWwgb24gYWxsIGRhdGEgbm8gbWF0dGVyIHRoZSBzb3VyY2UuCisKKy0tZGVsdGEtYmFzZS1vZmZzZXQ6OgorCUEgcGFja2VkIGFyY2hpdmUgY2FuIGV4cHJlc3MgYmFzZSBvYmplY3Qgb2YgYSBkZWx0YSBhcworCWVpdGhlciAyMC1ieXRlIG9iamVjdCBuYW1lIG9yIGFzIGFuIG9mZnNldCBpbiB0aGUKKwlzdHJlYW0sIGJ1dCBvbGRlciB2ZXJzaW9uIG9mIGdpdCBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoZQorCWxhdHRlci4gIEJ5IGRlZmF1bHQsIGdpdC1wYWNrLW9iamVjdHMgb25seSB1c2VzIHRoZQorCWZvcm1lciBmb3JtYXQgZm9yIGJldHRlciBjb21wYXRpYmlsaXR5LiAgVGhpcyBvcHRpb24KKwlhbGxvd3MgdGhlIGNvbW1hbmQgdG8gdXNlIHRoZSBsYXR0ZXIgZm9ybWF0IGZvcgorCWNvbXBhY3RuZXNzLiAgRGVwZW5kaW5nIG9uIHRoZSBhdmVyYWdlIGRlbHRhIGNoYWluCisJbGVuZ3RoLCB0aGlzIG9wdGlvbiB0eXBpY2FsbHkgc2hyaW5rcyB0aGUgcmVzdWx0aW5nCisJcGFja2ZpbGUgYnkgMy01IHBlci1jZW50LgorCistLXRocmVhZHM9PG4+OjoKKwlTcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aHJlYWRzIHRvIHNwYXduIHdoZW4gc2VhcmNoaW5nIGZvciBiZXN0CisJZGVsdGEgbWF0Y2hlcy4gIFRoaXMgcmVxdWlyZXMgdGhhdCBwYWNrLW9iamVjdHMgYmUgY29tcGlsZWQgd2l0aAorCXB0aHJlYWRzIG90aGVyd2lzZSB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkIHdpdGggYSB3YXJuaW5nLgorCVRoaXMgaXMgbWVhbnQgdG8gcmVkdWNlIHBhY2tpbmcgdGltZSBvbiBtdWx0aXByb2Nlc3NvciBtYWNoaW5lcy4KKwlUaGUgcmVxdWlyZWQgYW1vdW50IG9mIG1lbW9yeSBmb3IgdGhlIGRlbHRhIHNlYXJjaCB3aW5kb3cgaXMKKwlob3dldmVyIG11bHRpcGxpZWQgYnkgdGhlIG51bWJlciBvZiB0aHJlYWRzLgorCVNwZWNpZnlpbmcgMCB3aWxsIGNhdXNlIGdpdCB0byBhdXRvLWRldGVjdCB0aGUgbnVtYmVyIG9mIENQVSdzCisJYW5kIHNldCB0aGUgbnVtYmVyIG9mIHRocmVhZHMgYWNjb3JkaW5nbHkuCisKKy0taW5kZXgtdmVyc2lvbj08dmVyc2lvbj5bLDxvZmZzZXQ+XTo6CisJVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHRoZSB0ZXN0IHN1aXRlIG9ubHkuIEl0IGFsbG93cworCXRvIGZvcmNlIHRoZSB2ZXJzaW9uIGZvciB0aGUgZ2VuZXJhdGVkIHBhY2sgaW5kZXgsIGFuZCB0byBmb3JjZQorCTY0LWJpdCBpbmRleCBlbnRyaWVzIG9uIG9iamVjdHMgbG9jYXRlZCBhYm92ZSB0aGUgZ2l2ZW4gb2Zmc2V0LgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubworCitTZWUgQWxzbworLS0tLS0tLS0KK2xpbmtnaXQ6Z2l0LXJldi1saXN0WzFdCitsaW5rZ2l0OmdpdC1yZXBhY2tbMV0KK2xpbmtnaXQ6Z2l0LXBydW5lLXBhY2tlZFsxXQorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXBhY2stcmVkdW5kYW50LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXBhY2stcmVkdW5kYW50LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjRhYTRhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcGFjay1yZWR1bmRhbnQudHh0CkBAIC0wLDAgKzEsNTcgQEAKK2dpdC1wYWNrLXJlZHVuZGFudCgxKQorPT09PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1wYWNrLXJlZHVuZGFudCAtIEZpbmQgcmVkdW5kYW50IHBhY2sgZmlsZXMKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcGFjay1yZWR1bmRhbnQnIFsgLS12ZXJib3NlIF0gWyAtLWFsdC1vZGIgXSA8IC0tYWxsIHwgLnBhY2sgZmlsZW5hbWUgLi4uID4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIHByb2dyYW0gY29tcHV0ZXMgd2hpY2ggcGFja3MgaW4geW91ciByZXBvc2l0b3J5CithcmUgcmVkdW5kYW50LiBUaGUgb3V0cHV0IGlzIHN1aXRhYmxlIGZvciBwaXBpbmcgdG8KKyd4YXJncyBybScgaWYgeW91IGFyZSBpbiB0aGUgcm9vdCBvZiB0aGUgcmVwb3NpdG9yeS4KKworZ2l0LXBhY2stcmVkdW5kYW50IGFjY2VwdHMgYSBsaXN0IG9mIG9iamVjdHMgb24gc3RhbmRhcmQgaW5wdXQuIEFueSBvYmplY3RzCitnaXZlbiB3aWxsIGJlIGlnbm9yZWQgd2hlbiBjaGVja2luZyB3aGljaCBwYWNrcyBhcmUgcmVxdWlyZWQuIFRoaXMgbWFrZXMgdGhlCitmb2xsb3dpbmcgY29tbWFuZCB1c2VmdWwgd2hlbiB3YW50aW5nIHRvIHJlbW92ZSBwYWNrcyB3aGljaCBjb250YWluIHVucmVhY2hhYmxlCitvYmplY3RzLgorCitnaXQtZnNjayAtLWZ1bGwgLS11bnJlYWNoYWJsZSB8IGN1dCAtZCAnICcgLWYzIHwgXAorZ2l0LXBhY2stcmVkdW5kYW50IC0tYWxsIHwgeGFyZ3Mgcm0KKworT1BUSU9OUworLS0tLS0tLQorCisKKy0tYWxsOjoKKwlQcm9jZXNzZXMgYWxsIHBhY2tzLiBBbnkgZmlsZW5hbWVzIG9uIHRoZSBjb21tYW5kIGxpbmUgYXJlIGlnbm9yZWQuCisKKy0tYWx0LW9kYjo6CisJRG9uJ3QgcmVxdWlyZSBvYmplY3RzIHByZXNlbnQgaW4gcGFja3MgZnJvbSBhbHRlcm5hdGUgb2JqZWN0CisJZGlyZWN0b3JpZXMgdG8gYmUgcHJlc2VudCBpbiBsb2NhbCBwYWNrcy4KKworLS12ZXJib3NlOjoKKwlPdXRwdXRzIHNvbWUgc3RhdGlzdGljcyB0byBzdGRlcnIuIEhhcyBhIHNtYWxsIHBlcmZvcm1hbmNlIHBlbmFsdHkuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEx1a2FzIFNhbmRzdHLDtm0gPGx1a2Fzc0BldGVrLmNoYWxtZXJzLnNlPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBMdWthcyBTYW5kc3Ryw7ZtIDxsdWthc3NAZXRlay5jaGFsbWVycy5zZT4KKworU2VlIEFsc28KKy0tLS0tLS0tCitsaW5rZ2l0OmdpdC1wYWNrLW9iamVjdHNbMV0KK2xpbmtnaXQ6Z2l0LXJlcGFja1sxXQorbGlua2dpdDpnaXQtcHJ1bmUtcGFja2VkWzFdCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcGFjay1yZWZzLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXBhY2stcmVmcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRmZjkzNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXBhY2stcmVmcy50eHQKQEAgLTAsMCArMSw2NiBAQAorZ2l0LXBhY2stcmVmcygxKQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcGFjay1yZWZzIC0gUGFjayBoZWFkcyBhbmQgdGFncyBmb3IgZWZmaWNpZW50IHJlcG9zaXRvcnkgYWNjZXNzCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1wYWNrLXJlZnMnIFstLWFsbF0gWy0tbm8tcHJ1bmVdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitUcmFkaXRpb25hbGx5LCB0aXBzIG9mIGJyYW5jaGVzIGFuZCB0YWdzIChjb2xsZWN0aXZlbHkga25vd24gYXMKKydyZWZzJykgd2VyZSBzdG9yZWQgb25lIGZpbGUgcGVyIHJlZiB1bmRlciBgJEdJVF9ESVIvcmVmc2AKK2RpcmVjdG9yeS4gIFdoaWxlIG1hbnkgYnJhbmNoIHRpcHMgdGVuZCB0byBiZSB1cGRhdGVkIG9mdGVuLAorbW9zdCB0YWdzIGFuZCBzb21lIGJyYW5jaCB0aXBzIGFyZSBuZXZlciB1cGRhdGVkLiAgV2hlbiBhCityZXBvc2l0b3J5IGhhcyBodW5kcmVkcyBvciB0aG91c2FuZHMgb2YgdGFncywgdGhpcworb25lLWZpbGUtcGVyLXJlZiBmb3JtYXQgYm90aCB3YXN0ZXMgc3RvcmFnZSBhbmQgaHVydHMKK3BlcmZvcm1hbmNlLgorCitUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBzb2x2ZSB0aGUgc3RvcmFnZSBhbmQgcGVyZm9ybWFuY2UKK3Byb2JsZW0gYnkgc3Rhc2hpbmcgdGhlIHJlZnMgaW4gYSBzaW5nbGUgZmlsZSwKK2AkR0lUX0RJUi9wYWNrZWQtcmVmc2AuICBXaGVuIGEgcmVmIGlzIG1pc3NpbmcgZnJvbSB0aGUKK3RyYWRpdGlvbmFsIGAkR0lUX0RJUi9yZWZzYCBoaWVyYXJjaHksIGl0IGlzIGxvb2tlZCB1cCBpbiB0aGlzCitmaWxlIGFuZCB1c2VkIGlmIGZvdW5kLgorCitTdWJzZXF1ZW50IHVwZGF0ZXMgdG8gYnJhbmNoZXMgYWx3YXlzIGNyZWF0ZXMgbmV3IGZpbGUgdW5kZXIKK2AkR0lUX0RJUi9yZWZzYCBoaWVyYXJjaHkuCisKK0EgcmVjb21tZW5kZWQgcHJhY3RpY2UgdG8gZGVhbCB3aXRoIGEgcmVwb3NpdG9yeSB3aXRoIHRvbyBtYW55CityZWZzIGlzIHRvIHBhY2sgaXRzIHJlZnMgd2l0aCBgLS1hbGwgLS1wcnVuZWAgb25jZSwgYW5kCitvY2Nhc2lvbmFsbHkgcnVuIGBnaXQtcGFjay1yZWZzIFwtLXBydW5lYC4gIFRhZ3MgYXJlIGJ5CitkZWZpbml0aW9uIHN0YXRpb25hcnkgYW5kIGFyZSBub3QgZXhwZWN0ZWQgdG8gY2hhbmdlLiAgQnJhbmNoCitoZWFkcyB3aWxsIGJlIHBhY2tlZCB3aXRoIHRoZSBpbml0aWFsIGBwYWNrLXJlZnMgLS1hbGxgLCBidXQKK29ubHkgdGhlIGN1cnJlbnRseSBhY3RpdmUgYnJhbmNoIGhlYWRzIHdpbGwgYmVjb21lIHVucGFja2VkLAorYW5kIG5leHQgYHBhY2stcmVmc2AgKHdpdGhvdXQgYC0tYWxsYCkgd2lsbCBsZWF2ZSB0aGVtCit1bnBhY2tlZC4KKworCitPUFRJT05TCistLS0tLS0tCisKK1wtLWFsbDo6CisKK1RoZSBjb21tYW5kIGJ5IGRlZmF1bHQgcGFja3MgYWxsIHRhZ3MgYW5kIHJlZnMgdGhhdCBhcmUgYWxyZWFkeQorcGFja2VkLCBhbmQgbGVhdmVzIG90aGVyIHJlZnMKK2Fsb25lLiAgVGhpcyBpcyBiZWNhdXNlIGJyYW5jaGVzIGFyZSBleHBlY3RlZCB0byBiZSBhY3RpdmVseQorZGV2ZWxvcGVkIGFuZCBwYWNraW5nIHRoZWlyIHRpcHMgZG9lcyBub3QgaGVscCBwZXJmb3JtYW5jZS4KK1RoaXMgb3B0aW9uIGNhdXNlcyBicmFuY2ggdGlwcyB0byBiZSBwYWNrZWQgYXMgd2VsbC4gIFVzZWZ1bCBmb3IKK2EgcmVwb3NpdG9yeSB3aXRoIG1hbnkgYnJhbmNoZXMgb2YgaGlzdG9yaWNhbCBpbnRlcmVzdHMuCisKK1wtLW5vLXBydW5lOjoKKworVGhlIGNvbW1hbmQgdXN1YWxseSByZW1vdmVzIGxvb3NlIHJlZnMgdW5kZXIgYCRHSVRfRElSL3JlZnNgCitoaWVyYXJjaHkgYWZ0ZXIgcGFja2luZyB0aGVtLiAgVGhpcyBvcHRpb24gdGVsbHMgaXQgbm90IHRvLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1wYXJzZS1yZW1vdGUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcGFyc2UtcmVtb3RlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWI4YjJmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcGFyc2UtcmVtb3RlLnR4dApAQCAtMCwwICsxLDUwIEBACitnaXQtcGFyc2UtcmVtb3RlKDEpCis9PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1wYXJzZS1yZW1vdGUgLSBSb3V0aW5lcyB0byBoZWxwIHBhcnNpbmcgcmVtb3RlIHJlcG9zaXRvcnkgYWNjZXNzIHBhcmFtZXRlcnMKKworCitTWU5PUFNJUworLS0tLS0tLS0KKycuIGdpdC1wYXJzZS1yZW1vdGUnCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhpcyBzY3JpcHQgaXMgaW5jbHVkZWQgaW4gdmFyaW91cyBzY3JpcHRzIHRvIHN1cHBseQorcm91dGluZXMgdG8gcGFyc2UgZmlsZXMgdW5kZXIgJEdJVF9ESVIvcmVtb3Rlcy8gYW5kCiskR0lUX0RJUi9icmFuY2hlcy8gYW5kIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIHRoYXQgYXJlIHJlbGF0ZWQKK3RvIGZldGNoaW5nLCBwdWxsaW5nIGFuZCBwdXNoaW5nLgorCitUaGUgcHJpbWFyeSBlbnRyeSBwb2ludHMgYXJlOgorCitnZXRfcmVtb3RlX3JlZnNfZm9yX2ZldGNoOjoKKwlHaXZlbiB0aGUgbGlzdCBvZiB1c2VyLXN1cHBsaWVkIGA8cmVwbz4gPHJlZnNwZWM+Li4uYCwKKwlyZXR1cm4gdGhlIGxpc3Qgb2YgcmVmcyB0byBmZXRjaCBhZnRlciBjYW5vbmljYWxpemluZworCXRoZW0gaW50byBgJEdJVF9ESVJgIHJlbGF0aXZlIHBhdGhzCisJKGUuZy4gYHJlZnMvaGVhZHMvZm9vYCkuICBXaGVuIGA8cmVmc3BlYz4uLi5gIGlzIGVtcHR5CisJdGhlIHJldHVybmVkIGxpc3Qgb2YgcmVmcyBjb25zaXN0cyBvZiB0aGUgZGVmYXVsdHMKKwlmb3IgdGhlIGdpdmVuIGA8cmVwbz5gLCBpZiBzcGVjaWZpZWQgaW4KKwlgJEdJVF9ESVIvcmVtb3Rlcy9gLCBgJEdJVF9ESVIvYnJhbmNoZXMvYCwgb3IgYHJlbW90ZS4qLmZldGNoYAorCWNvbmZpZ3VyYXRpb24uCisKK2dldF9yZW1vdGVfcmVmc19mb3JfcHVzaDo6CisJR2l2ZW4gdGhlIGxpc3Qgb2YgdXNlci1zdXBwbGllZCBgPHJlcG8+IDxyZWZzcGVjPi4uLmAsCisJcmV0dXJuIHRoZSBsaXN0IG9mIHJlZnMgdG8gcHVzaCBpbiBhIGZvcm0gc3VpdGFibGUgdG8gYmUKKwlmZWQgdG8gdGhlIGBnaXQtc2VuZC1wYWNrYCBjb21tYW5kLiAgV2hlbiBgPHJlZnNwZWM+Li4uYAorCWlzIGVtcHR5IHRoZSByZXR1cm5lZCBsaXN0IG9mIHJlZnMgY29uc2lzdHMgb2YgdGhlCisJZGVmYXVsdHMgZm9yIHRoZSBnaXZlbiBgPHJlcG8+YCwgaWYgc3BlY2lmaWVkIGluCisJYCRHSVRfRElSL3JlbW90ZXMvYC4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8uCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXBhdGNoLWlkLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXBhdGNoLWlkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTQ4NTJhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcGF0Y2gtaWQudHh0CkBAIC0wLDAgKzEsNDIgQEAKK2dpdC1wYXRjaC1pZCgxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1wYXRjaC1pZCAtIENvbXB1dGUgdW5pcXVlIElEIGZvciBhIHBhdGNoCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1wYXRjaC1pZCcgPCA8cGF0Y2g+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQSAicGF0Y2ggSUQiIGlzIG5vdGhpbmcgYnV0IGEgU0hBMSBvZiB0aGUgZGlmZiBhc3NvY2lhdGVkIHdpdGggYSBwYXRjaCwgd2l0aAord2hpdGVzcGFjZSBhbmQgbGluZSBudW1iZXJzIGlnbm9yZWQuICBBcyBzdWNoLCBpdCdzICJyZWFzb25hYmx5IHN0YWJsZSIsIGJ1dCBhdAordGhlIHNhbWUgdGltZSBhbHNvIHJlYXNvbmFibHkgdW5pcXVlLCBpLmUuLCB0d28gcGF0Y2hlcyB0aGF0IGhhdmUgdGhlIHNhbWUgInBhdGNoCitJRCIgYXJlIGFsbW9zdCBndWFyYW50ZWVkIHRvIGJlIHRoZSBzYW1lIHRoaW5nLgorCitJT1csIHlvdSBjYW4gdXNlIHRoaXMgdGhpbmcgdG8gbG9vayBmb3IgbGlrZWx5IGR1cGxpY2F0ZSBjb21taXRzLgorCitXaGVuIGRlYWxpbmcgd2l0aCBnaXQtZGlmZi10cmVlIG91dHB1dCwgaXQgdGFrZXMgYWR2YW50YWdlIG9mCit0aGUgZmFjdCB0aGF0IHRoZSBwYXRjaCBpcyBwcmVmaXhlZCB3aXRoIHRoZSBvYmplY3QgbmFtZSBvZiB0aGUKK2NvbW1pdCwgYW5kIG91dHB1dHMgdHdvIDQwLWJ5dGUgaGV4YWRlY2ltYWwgc3RyaW5nLiAgVGhlIGZpcnN0CitzdHJpbmcgaXMgdGhlIHBhdGNoIElELCBhbmQgdGhlIHNlY29uZCBzdHJpbmcgaXMgdGhlIGNvbW1pdCBJRC4KK1RoaXMgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIG1hcHBpbmcgZnJvbSBwYXRjaCBJRCB0byBjb21taXQgSUQuCisKK09QVElPTlMKKy0tLS0tLS0KKzxwYXRjaD46OgorCVRoZSBkaWZmIHRvIGNyZWF0ZSB0aGUgSUQgb2YuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcGVlay1yZW1vdGUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcGVlay1yZW1vdGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMDE3MTAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1wZWVrLXJlbW90ZS50eHQKQEAgLTAsMCArMSw1MCBAQAorZ2l0LXBlZWstcmVtb3RlKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXBlZWstcmVtb3RlIC0gTGlzdCB0aGUgcmVmZXJlbmNlcyBpbiBhIHJlbW90ZSByZXBvc2l0b3J5CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXBlZWstcmVtb3RlJyBbLS11cGxvYWQtcGFjaz08Z2l0LXVwbG9hZC1wYWNrPl0gWzxob3N0PjpdPGRpcmVjdG9yeT4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIGNvbW1hbmQgaXMgZGVwcmVjYXRlZDsgdXNlIGBnaXQtbHMtcmVtb3RlYCBpbnN0ZWFkLgorCitPUFRJT05TCistLS0tLS0tCitcLS11cGxvYWQtcGFjaz08Z2l0LXVwbG9hZC1wYWNrPjo6CisJVXNlIHRoaXMgdG8gc3BlY2lmeSB0aGUgcGF0aCB0byAnZ2l0LXVwbG9hZC1wYWNrJyBvbiB0aGUKKwlyZW1vdGUgc2lkZSwgaWYgaXQgaXMgbm90IGZvdW5kIG9uIHlvdXIgJFBBVEguIFNvbWUKKwlpbnN0YWxsYXRpb25zIG9mIHNzaGQgaWdub3JlcyB0aGUgdXNlcidzIGVudmlyb25tZW50CisJc2V0dXAgc2NyaXB0cyBmb3IgbG9naW4gc2hlbGxzIChlLmcuIC5iYXNoX3Byb2ZpbGUpIGFuZAorCXlvdXIgcHJpdmF0ZWx5IGluc3RhbGxlZCBnaXQgbWF5IG5vdCBiZSBmb3VuZCBvbiB0aGUgc3lzdGVtCisJZGVmYXVsdCAkUEFUSC4gIEFub3RoZXIgd29ya2Fyb3VuZCBzdWdnZXN0ZWQgaXMgdG8gc2V0CisJdXAgeW91ciAkUEFUSCBpbiAiLmJhc2hyYyIsIGJ1dCB0aGlzIGZsYWcgaXMgZm9yIHBlb3BsZQorCXdobyBkbyBub3Qgd2FudCB0byBwYXkgdGhlIG92ZXJoZWFkIGZvciBub24taW50ZXJhY3RpdmUKKwlzaGVsbHMsIGJ1dCBwcmVmZXIgaGF2aW5nIGEgbGVhbiAuYmFzaHJjIGZpbGUgKHRoZXkgc2V0IG1vc3Qgb2YKKwl0aGUgdGhpbmdzIHVwIGluIC5iYXNoX3Byb2ZpbGUpLgorCis8aG9zdD46OgorCUEgcmVtb3RlIGhvc3QgdGhhdCBob3VzZXMgdGhlIHJlcG9zaXRvcnkuICBXaGVuIHRoaXMKKwlwYXJ0IGlzIHNwZWNpZmllZCwgJ2dpdC11cGxvYWQtcGFjaycgaXMgaW52b2tlZCB2aWEKKwlzc2guCisKKzxkaXJlY3Rvcnk+OjoKKwlUaGUgcmVwb3NpdG9yeSB0byBzeW5jIGZyb20uCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFuby4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1wcnVuZS1wYWNrZWQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcHJ1bmUtcGFja2VkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2VlODJhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcHJ1bmUtcGFja2VkLnR4dApAQCAtMCwwICsxLDUyIEBACitnaXQtcHJ1bmUtcGFja2VkKDEpCis9PT09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXBydW5lLXBhY2tlZCAtIFJlbW92ZSBleHRyYSBvYmplY3RzIHRoYXQgYXJlIGFscmVhZHkgaW4gcGFjayBmaWxlcworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1wcnVuZS1wYWNrZWQnIFstbl0gWy1xXQorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhpcyBwcm9ncmFtIHNlYXJjaGVzIHRoZSBgJEdJVF9PQkpFQ1RfRElSYCBmb3IgYWxsIG9iamVjdHMgdGhhdCBjdXJyZW50bHkKK2V4aXN0IGluIGEgcGFjayBmaWxlIGFzIHdlbGwgYXMgdGhlIGluZGVwZW5kZW50IG9iamVjdCBkaXJlY3Rvcmllcy4KKworQWxsIHN1Y2ggZXh0cmEgb2JqZWN0cyBhcmUgcmVtb3ZlZC4KKworQSBwYWNrIGlzIGEgY29sbGVjdGlvbiBvZiBvYmplY3RzLCBpbmRpdmlkdWFsbHkgY29tcHJlc3NlZCwgd2l0aCBkZWx0YQorY29tcHJlc3Npb24gYXBwbGllZCwgc3RvcmVkIGluIGEgc2luZ2xlIGZpbGUsIHdpdGggYW4gYXNzb2NpYXRlZCBpbmRleCBmaWxlLgorCitQYWNrcyBhcmUgdXNlZCB0byByZWR1Y2UgdGhlIGxvYWQgb24gbWlycm9yIHN5c3RlbXMsIGJhY2t1cCBlbmdpbmVzLAorZGlzayBzdG9yYWdlLCBldGMuCisKKworT1BUSU9OUworLS0tLS0tLQorLW46OgorICAgICAgICBEb24ndCBhY3R1YWxseSByZW1vdmUgYW55IG9iamVjdHMsIG9ubHkgc2hvdyB0aG9zZSB0aGF0IHdvdWxkIGhhdmUgYmVlbgorICAgICAgICByZW1vdmVkLgorCistcTo6CisJU3F1ZWxjaCB0aGUgcHJvZ3Jlc3MgaW5kaWNhdG9yLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IFJ5YW4gQW5kZXJzb24gPHJ5YW5AbWljaG9ubGluZS5jb20+CisKK1NlZSBBbHNvCistLS0tLS0tLQorbGlua2dpdDpnaXQtcGFjay1vYmplY3RzWzFdCitsaW5rZ2l0OmdpdC1yZXBhY2tbMV0KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1wcnVuZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1wcnVuZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1MWNmZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXBydW5lLnR4dApAQCAtMCwwICsxLDYzIEBACitnaXQtcHJ1bmUoMSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcHJ1bmUgLSBQcnVuZSBhbGwgdW5yZWFjaGFibGUgb2JqZWN0cyBmcm9tIHRoZSBvYmplY3QgZGF0YWJhc2UKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcHJ1bmUnIFstbl0gWy0tZXhwaXJlIDxleHBpcmU+XSBbLS1dIFs8aGVhZD4uLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitUaGlzIHJ1bnMgYGdpdC1mc2NrIC0tdW5yZWFjaGFibGVgIHVzaW5nIGFsbCB0aGUgcmVmcworYXZhaWxhYmxlIGluIGAkR0lUX0RJUi9yZWZzYCwgb3B0aW9uYWxseSB3aXRoIGFkZGl0aW9uYWwgc2V0IG9mCitvYmplY3RzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBhbmQgcHJ1bmVzIGFsbAorb2JqZWN0cyB1bnJlYWNoYWJsZSBmcm9tIGFueSBvZiB0aGVzZSBoZWFkIG9iamVjdHMgZnJvbSB0aGUgb2JqZWN0IGRhdGFiYXNlLgorSW4gYWRkaXRpb24sIGl0CitwcnVuZXMgdGhlIHVucGFja2VkIG9iamVjdHMgdGhhdCBhcmUgYWxzbyBmb3VuZCBpbiBwYWNrcyBieQorcnVubmluZyBgZ2l0IHBydW5lLXBhY2tlZGAuCisKK09QVElPTlMKKy0tLS0tLS0KKworLW46OgorCURvIG5vdCByZW1vdmUgYW55dGhpbmc7IGp1c3QgcmVwb3J0IHdoYXQgaXQgd291bGQKKwlyZW1vdmUuCisKK1wtLTo6CisJRG8gbm90IGludGVycHJldCBhbnkgbW9yZSBhcmd1bWVudHMgYXMgb3B0aW9ucy4KKworXC0tZXhwaXJlIDx0aW1lPjo6CisJT25seSBleHBpcmUgbG9vc2Ugb2JqZWN0cyBvbGRlciB0aGFuIDx0aW1lPi4KKworPGhlYWQ+Li4uOjoKKwlJbiBhZGRpdGlvbiB0byBvYmplY3RzCisJcmVhY2hhYmxlIGZyb20gYW55IG9mIG91ciByZWZlcmVuY2VzLCBrZWVwIG9iamVjdHMKKwlyZWFjaGFibGUgZnJvbSBsaXN0ZWQgPGhlYWQ+cy4KKworRVhBTVBMRQorLS0tLS0tLQorCitUbyBwcnVuZSBvYmplY3RzIG5vdCB1c2VkIGJ5IHlvdXIgcmVwb3NpdG9yeSBub3IgYW5vdGhlciB0aGF0Citib3Jyb3dzIGZyb20geW91ciByZXBvc2l0b3J5IHZpYSBpdHMKK2AuZ2l0L29iamVjdHMvaW5mby9hbHRlcm5hdGVzYDoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBwcnVuZSAkKGNkIC4uL2Fub3RoZXIgJiYgJChnaXQtcmV2LXBhcnNlIC0tYWxsKSkKKy0tLS0tLS0tLS0tLQorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXB1bGwudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcHVsbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQwNWNhMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXB1bGwudHh0CkBAIC0wLDAgKzEsMTg4IEBACitnaXQtcHVsbCgxKQorPT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXB1bGwgLSBGZXRjaCBmcm9tIGFuZCBtZXJnZSB3aXRoIGFub3RoZXIgcmVwb3NpdG9yeSBvciBhIGxvY2FsIGJyYW5jaAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1wdWxsJyA8b3B0aW9ucz4gPHJlcG9zaXRvcnk+IDxyZWZzcGVjPi4uLgorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUnVucyBgZ2l0LWZldGNoYCB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLCBhbmQgY2FsbHMgYGdpdC1tZXJnZWAKK3RvIG1lcmdlIHRoZSByZXRyaWV2ZWQgaGVhZChzKSBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaC4KK1dpdGggYC0tcmViYXNlYCwgY2FsbHMgYGdpdC1yZWJhc2VgIGluc3RlYWQgb2YgYGdpdC1tZXJnZWAuCisKK05vdGUgdGhhdCB5b3UgY2FuIHVzZSBgLmAgKGN1cnJlbnQgZGlyZWN0b3J5KSBhcyB0aGUKKzxyZXBvc2l0b3J5PiB0byBwdWxsIGZyb20gdGhlIGxvY2FsIHJlcG9zaXRvcnkgLS0gdGhpcyBpcyB1c2VmdWwKK3doZW4gbWVyZ2luZyBsb2NhbCBicmFuY2hlcyBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaC4KKworQWxzbyBub3RlIHRoYXQgb3B0aW9ucyBtZWFudCBmb3IgYGdpdC1wdWxsYCBpdHNlbGYgYW5kIHVuZGVybHlpbmcKK2BnaXQtbWVyZ2VgIG11c3QgYmUgZ2l2ZW4gYmVmb3JlIHRoZSBvcHRpb25zIG1lYW50IGZvciBgZ2l0LWZldGNoYC4KKworT1BUSU9OUworLS0tLS0tLQoraW5jbHVkZTo6bWVyZ2Utb3B0aW9ucy50eHRbXQorCis6Z2l0LXB1bGw6IDEKKworXC0tcmViYXNlOjoKKwlJbnN0ZWFkIG9mIGEgbWVyZ2UsIHBlcmZvcm0gYSByZWJhc2UgYWZ0ZXIgZmV0Y2hpbmcuICBJZgorCXRoZXJlIGlzIGEgcmVtb3RlIHJlZiBmb3IgdGhlIHVwc3RyZWFtIGJyYW5jaCwgYW5kIHRoaXMgYnJhbmNoCisJd2FzIHJlYmFzZWQgc2luY2UgbGFzdCBmZXRjaGVkLCB0aGUgcmViYXNlIHVzZXMgdGhhdCBpbmZvcm1hdGlvbgorCXRvIGF2b2lkIHJlYmFzaW5nIG5vbi1sb2NhbCBjaGFuZ2VzLiBUbyBtYWtlIHRoaXMgdGhlIGRlZmF1bHQKKwlmb3IgYnJhbmNoIGA8bmFtZT5gLCBzZXQgY29uZmlndXJhdGlvbiBgYnJhbmNoLjxuYW1lPi5yZWJhc2VgCisJdG8gYHRydWVgLgorKworKk5PVEU6KiBUaGlzIGlzIGEgcG90ZW50aWFsbHkgX2Rhbmdlcm91c18gbW9kZSBvZiBvcGVyYXRpb24uCitJdCByZXdyaXRlcyBoaXN0b3J5LCB3aGljaCBkb2VzIG5vdCBib2RlIHdlbGwgd2hlbiB5b3UKK3B1Ymxpc2hlZCB0aGF0IGhpc3RvcnkgYWxyZWFkeS4gIERvICpub3QqIHVzZSB0aGlzIG9wdGlvbgordW5sZXNzIHlvdSBoYXZlIHJlYWQgbGlua2dpdDpnaXQtcmViYXNlWzFdIGNhcmVmdWxseS4KKworXC0tbm8tcmViYXNlOjoKKwlPdmVycmlkZSBlYXJsaWVyIFwtLXJlYmFzZS4KKworaW5jbHVkZTo6ZmV0Y2gtb3B0aW9ucy50eHRbXQorCitpbmNsdWRlOjpwdWxsLWZldGNoLXBhcmFtLnR4dFtdCisKK2luY2x1ZGU6OnVybHMtcmVtb3Rlcy50eHRbXQorCitpbmNsdWRlOjptZXJnZS1zdHJhdGVnaWVzLnR4dFtdCisKK0RFRkFVTFQgQkVIQVZJT1VSCistLS0tLS0tLS0tLS0tLS0tLQorCitPZnRlbiBwZW9wbGUgdXNlIGBnaXQgcHVsbGAgd2l0aG91dCBnaXZpbmcgYW55IHBhcmFtZXRlci4KK1RyYWRpdGlvbmFsbHksIHRoaXMgaGFzIGJlZW4gZXF1aXZhbGVudCB0byBzYXlpbmcgYGdpdCBwdWxsCitvcmlnaW5gLiAgSG93ZXZlciwgd2hlbiBjb25maWd1cmF0aW9uIGBicmFuY2guPG5hbWU+LnJlbW90ZWAgaXMKK3ByZXNlbnQgd2hpbGUgb24gYnJhbmNoIGA8bmFtZT5gLCB0aGF0IHZhbHVlIGlzIHVzZWQgaW5zdGVhZCBvZgorYG9yaWdpbmAuCisKK0luIG9yZGVyIHRvIGRldGVybWluZSB3aGF0IFVSTCB0byB1c2UgdG8gZmV0Y2ggZnJvbSwgdGhlIHZhbHVlCitvZiB0aGUgY29uZmlndXJhdGlvbiBgcmVtb3RlLjxvcmlnaW4+LnVybGAgaXMgY29uc3VsdGVkCithbmQgaWYgdGhlcmUgaXMgbm90IGFueSBzdWNoIHZhcmlhYmxlLCB0aGUgdmFsdWUgb24gYFVSTDogYCBsaW5lCitpbiBgJEdJVF9ESVIvcmVtb3Rlcy88b3JpZ2luPmAgZmlsZSBpcyB1c2VkLgorCitJbiBvcmRlciB0byBkZXRlcm1pbmUgd2hhdCByZW1vdGUgYnJhbmNoZXMgdG8gZmV0Y2ggKGFuZAorb3B0aW9uYWxseSBzdG9yZSBpbiB0aGUgdHJhY2tpbmcgYnJhbmNoZXMpIHdoZW4gdGhlIGNvbW1hbmQgaXMKK3J1biB3aXRob3V0IGFueSByZWZzcGVjIHBhcmFtZXRlcnMgb24gdGhlIGNvbW1hbmQgbGluZSwgdmFsdWVzCitvZiB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBgcmVtb3RlLjxvcmlnaW4+LmZldGNoYCBhcmUKK2NvbnN1bHRlZCwgYW5kIGlmIHRoZXJlIGFyZW4ndCBhbnksIGAkR0lUX0RJUi9yZW1vdGVzLzxvcmlnaW4+YAorZmlsZSBpcyBjb25zdWx0ZWQgYW5kIGl0cyBgUHVsbDogYCBsaW5lcyBhcmUgdXNlZC4KK0luIGFkZGl0aW9uIHRvIHRoZSByZWZzcGVjIGZvcm1hdHMgZGVzY3JpYmVkIGluIHRoZSBPUFRJT05TCitzZWN0aW9uLCB5b3UgY2FuIGhhdmUgYSBnbG9iYmluZyByZWZzcGVjIHRoYXQgbG9va3MgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0KK3JlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoKKy0tLS0tLS0tLS0tLQorCitBIGdsb2JiaW5nIHJlZnNwZWMgbXVzdCBoYXZlIGEgbm9uLWVtcHR5IFJIUyAoaS5lLiBtdXN0IHN0b3JlCit3aGF0IHdlcmUgZmV0Y2hlZCBpbiB0cmFja2luZyBicmFuY2hlcyksIGFuZCBpdHMgTEhTIGFuZCBSSFMKK211c3QgZW5kIHdpdGggYC8qYC4gIFRoZSBhYm92ZSBzcGVjaWZpZXMgdGhhdCBhbGwgcmVtb3RlCiticmFuY2hlcyBhcmUgdHJhY2tlZCB1c2luZyB0cmFja2luZyBicmFuY2hlcyBpbgorYHJlZnMvcmVtb3Rlcy9vcmlnaW4vYCBoaWVyYXJjaHkgdW5kZXIgdGhlIHNhbWUgbmFtZS4KKworVGhlIHJ1bGUgdG8gZGV0ZXJtaW5lIHdoaWNoIHJlbW90ZSBicmFuY2ggdG8gbWVyZ2UgYWZ0ZXIKK2ZldGNoaW5nIGlzIGEgYml0IGludm9sdmVkLCBpbiBvcmRlciBub3QgdG8gYnJlYWsgYmFja3dhcmQKK2NvbXBhdGliaWxpdHkuCisKK0lmIGV4cGxpY2l0IHJlZnNwZWNzIHdlcmUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQKK2xpbmUgb2YgYGdpdCBwdWxsYCwgdGhleSBhcmUgYWxsIG1lcmdlZC4KKworV2hlbiBubyByZWZzcGVjIHdhcyBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGVuIGBnaXQgcHVsbGAKK3VzZXMgdGhlIHJlZnNwZWMgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBvcgorYCRHSVRfRElSL3JlbW90ZXMvPG9yaWdpbj5gLiAgSW4gc3VjaCBjYXNlcywgdGhlIGZvbGxvd2luZworcnVsZXMgYXBwbHk6CisKKy4gSWYgYGJyYW5jaC48bmFtZT4ubWVyZ2VgIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjdXJyZW50CisgIGJyYW5jaCBgPG5hbWU+YCBleGlzdHMsIHRoYXQgaXMgdGhlIG5hbWUgb2YgdGhlIGJyYW5jaCBhdCB0aGUKKyAgcmVtb3RlIHNpdGUgdGhhdCBpcyBtZXJnZWQuCisKKy4gSWYgdGhlIHJlZnNwZWMgaXMgYSBnbG9iYmluZyBvbmUsIG5vdGhpbmcgaXMgbWVyZ2VkLgorCisuIE90aGVyd2lzZSB0aGUgcmVtb3RlIGJyYW5jaCBvZiB0aGUgZmlyc3QgcmVmc3BlYyBpcyBtZXJnZWQuCisKKworRVhBTVBMRVMKKy0tLS0tLS0tCisKK2dpdCBwdWxsLCBnaXQgcHVsbCBvcmlnaW46OgorCVVwZGF0ZSB0aGUgcmVtb3RlLXRyYWNraW5nIGJyYW5jaGVzIGZvciB0aGUgcmVwb3NpdG9yeQorCXlvdSBjbG9uZWQgZnJvbSwgdGhlbiBtZXJnZSBvbmUgb2YgdGhlbSBpbnRvIHlvdXIKKwljdXJyZW50IGJyYW5jaC4gIE5vcm1hbGx5IHRoZSBicmFuY2ggbWVyZ2VkIGluIGlzCisJdGhlIEhFQUQgb2YgdGhlIHJlbW90ZSByZXBvc2l0b3J5LCBidXQgdGhlIGNob2ljZSBpcworCWRldGVybWluZWQgYnkgdGhlIGJyYW5jaC48bmFtZT4ucmVtb3RlIGFuZAorCWJyYW5jaC48bmFtZT4ubWVyZ2Ugb3B0aW9uczsgc2VlIGxpbmtnaXQ6Z2l0LWNvbmZpZ1sxXQorCWZvciBkZXRhaWxzLgorCitnaXQgcHVsbCBvcmlnaW4gbmV4dDo6CisJTWVyZ2UgaW50byB0aGUgY3VycmVudCBicmFuY2ggdGhlIHJlbW90ZSBicmFuY2ggYG5leHRgOworCWxlYXZlcyBhIGNvcHkgb2YgYG5leHRgIHRlbXBvcmFyaWx5IGluIEZFVENIX0hFQUQsIGJ1dAorCWRvZXMgbm90IHVwZGF0ZSBhbnkgcmVtb3RlLXRyYWNraW5nIGJyYW5jaGVzLgorCitnaXQgcHVsbCAuIGZpeGVzIGVuaGFuY2VtZW50czo6CisJQnVuZGxlIGxvY2FsIGJyYW5jaCBgZml4ZXNgIGFuZCBgZW5oYW5jZW1lbnRzYCBvbiB0b3Agb2YKKwl0aGUgY3VycmVudCBicmFuY2gsIG1ha2luZyBhbiBPY3RvcHVzIG1lcmdlLiAgVGhpcyBgZ2l0IHB1bGwgLmAKKwlzeW50YXggaXMgZXF1aXZhbGVudCB0byBgZ2l0IG1lcmdlYC4KKworZ2l0IHB1bGwgLXMgb3VycyAuIG9ic29sZXRlOjoKKwlNZXJnZSBsb2NhbCBicmFuY2ggYG9ic29sZXRlYCBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaCwKKwl1c2luZyBgb3Vyc2AgbWVyZ2Ugc3RyYXRlZ3kuCisKK2dpdCBwdWxsIC0tbm8tY29tbWl0IC4gbWFpbnQ6OgorCU1lcmdlIGxvY2FsIGJyYW5jaCBgbWFpbnRgIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoLCBidXQKKwlkbyBub3QgbWFrZSBhIGNvbW1pdCBhdXRvbWF0aWNhbGx5LiAgVGhpcyBjYW4gYmUgdXNlZAorCXdoZW4geW91IHdhbnQgdG8gaW5jbHVkZSBmdXJ0aGVyIGNoYW5nZXMgdG8gdGhlIG1lcmdlLAorCW9yIHdhbnQgdG8gd3JpdGUgeW91ciBvd24gbWVyZ2UgY29tbWl0IG1lc3NhZ2UuCisrCitZb3Ugc2hvdWxkIHJlZnJhaW4gZnJvbSBhYnVzaW5nIHRoaXMgb3B0aW9uIHRvIHNuZWFrIHN1YnN0YW50aWFsCitjaGFuZ2VzIGludG8gYSBtZXJnZSBjb21taXQuICBTbWFsbCBmaXh1cHMgbGlrZSBidW1waW5nCityZWxlYXNlL3ZlcnNpb24gbmFtZSB3b3VsZCBiZSBhY2NlcHRhYmxlLgorCitDb21tYW5kIGxpbmUgcHVsbCBvZiBtdWx0aXBsZSBicmFuY2hlcyBmcm9tIG9uZSByZXBvc2l0b3J5OjoKKysKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgbWFzdGVyCiskIGdpdCBmZXRjaCBvcmlnaW4gK3B1OnB1IG1haW50OnRtcAorJCBnaXQgcHVsbCAuIHRtcAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisrCitUaGlzIHVwZGF0ZXMgKG9yIGNyZWF0ZXMsIGFzIG5lY2Vzc2FyeSkgYnJhbmNoZXMgYHB1YCBhbmQgYHRtcGAKK2luIHRoZSBsb2NhbCByZXBvc2l0b3J5IGJ5IGZldGNoaW5nIGZyb20gdGhlIGJyYW5jaGVzCisocmVzcGVjdGl2ZWx5KSBgcHVgIGFuZCBgbWFpbnRgIGZyb20gdGhlIHJlbW90ZSByZXBvc2l0b3J5LgorKworVGhlIGBwdWAgYnJhbmNoIHdpbGwgYmUgdXBkYXRlZCBldmVuIGlmIGl0IGlzIGRvZXMgbm90CitmYXN0LWZvcndhcmQ7IHRoZSBvdGhlcnMgd2lsbCBub3QgYmUuCisrCitUaGUgZmluYWwgY29tbWFuZCB0aGVuIG1lcmdlcyB0aGUgbmV3bHkgZmV0Y2hlZCBgdG1wYCBpbnRvIG1hc3Rlci4KKworCitJZiB5b3UgdHJpZWQgYSBwdWxsIHdoaWNoIHJlc3VsdGVkIGluIGEgY29tcGxleCBjb25mbGljdHMgYW5kCit3b3VsZCB3YW50IHRvIHN0YXJ0IG92ZXIsIHlvdSBjYW4gcmVjb3ZlciB3aXRoCitsaW5rZ2l0OmdpdC1yZXNldFsxXS4KKworCitTRUUgQUxTTworLS0tLS0tLS0KK2xpbmtnaXQ6Z2l0LWZldGNoWzFdLCBsaW5rZ2l0OmdpdC1tZXJnZVsxXSwgbGlua2dpdDpnaXQtY29uZmlnWzFdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorYW5kIEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSm9uIExvZWxpZ2VyLAorRGF2aWQgR3JlYXZlcywKK0p1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXB1c2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcHVzaC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEyODE3MAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXB1c2gudHh0CkBAIC0wLDAgKzEsMTk3IEBACitnaXQtcHVzaCgxKQorPT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXB1c2ggLSBVcGRhdGUgcmVtb3RlIHJlZnMgYWxvbmcgd2l0aCBhc3NvY2lhdGVkIG9iamVjdHMKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtcHVzaCcgWy0tYWxsXSBbLS1kcnktcnVuXSBbLS10YWdzXSBbLS1yZWNlaXZlLXBhY2s9PGdpdC1yZWNlaXZlLXBhY2s+XQorICAgICAgICAgICBbLS1yZXBvPWFsbF0gWy1mIHwgLS1mb3JjZV0gWy12IHwgLS12ZXJib3NlXSBbPHJlcG9zaXRvcnk+IDxyZWZzcGVjPi4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK1VwZGF0ZXMgcmVtb3RlIHJlZnMgdXNpbmcgbG9jYWwgcmVmcywgd2hpbGUgc2VuZGluZyBvYmplY3RzCituZWNlc3NhcnkgdG8gY29tcGxldGUgdGhlIGdpdmVuIHJlZnMuCisKK1lvdSBjYW4gbWFrZSBpbnRlcmVzdGluZyB0aGluZ3MgaGFwcGVuIHRvIGEgcmVwb3NpdG9yeQorZXZlcnkgdGltZSB5b3UgcHVzaCBpbnRvIGl0LCBieSBzZXR0aW5nIHVwICdob29rcycgdGhlcmUuICBTZWUKK2RvY3VtZW50YXRpb24gZm9yIGxpbmtnaXQ6Z2l0LXJlY2VpdmUtcGFja1sxXS4KKworCitPUFRJT05TCistLS0tLS0tCis8cmVwb3NpdG9yeT46OgorCVRoZSAicmVtb3RlIiByZXBvc2l0b3J5IHRoYXQgaXMgZGVzdGluYXRpb24gb2YgYSBwdXNoCisJb3BlcmF0aW9uLiAgU2VlIHRoZSBzZWN0aW9uIDw8VVJMUyxHSVQgVVJMUz4+IGJlbG93LgorCis8cmVmc3BlYz46OgorCVRoZSBjYW5vbmljYWwgZm9ybWF0IG9mIGEgPHJlZnNwZWM+IHBhcmFtZXRlciBpcworCWArPzxzcmM+Ojxkc3Q+YDsgdGhhdCBpcywgYW4gb3B0aW9uYWwgcGx1cyBgK2AsIGZvbGxvd2VkCisJYnkgdGhlIHNvdXJjZSByZWYsIGZvbGxvd2VkIGJ5IGEgY29sb24gYDpgLCBmb2xsb3dlZCBieQorCXRoZSBkZXN0aW5hdGlvbiByZWYuCisrCitUaGUgPHNyYz4gc2lkZSBjYW4gYmUgYW4KK2FyYml0cmFyeSAiU0hBMSBleHByZXNzaW9uIiB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuCithcmd1bWVudCB0byBgZ2l0LWNhdC1maWxlIC10YC4gIEUuZy4gYG1hc3Rlcn40YCAocHVzaAorZm91ciBwYXJlbnRzIGJlZm9yZSB0aGUgY3VycmVudCBtYXN0ZXIgaGVhZCkuCisrCitUaGUgbG9jYWwgcmVmIHRoYXQgbWF0Y2hlcyA8c3JjPiBpcyB1c2VkCit0byBmYXN0IGZvcndhcmQgdGhlIHJlbW90ZSByZWYgdGhhdCBtYXRjaGVzIDxkc3Q+LiAgSWYKK3RoZSBvcHRpb25hbCBwbHVzIGArYCBpcyB1c2VkLCB0aGUgcmVtb3RlIHJlZiBpcyB1cGRhdGVkCitldmVuIGlmIGl0IGRvZXMgbm90IHJlc3VsdCBpbiBhIGZhc3QgZm9yd2FyZCB1cGRhdGUuCisrCitOb3RlOiBJZiBubyBleHBsaWNpdCByZWZzcGVjIGlzIGZvdW5kLCAodGhhdCBpcyBuZWl0aGVyCitvbiB0aGUgY29tbWFuZCBsaW5lIG5vciBpbiBhbnkgUHVzaCBsaW5lIG9mIHRoZQorY29ycmVzcG9uZGluZyByZW1vdGVzIGZpbGUtLS1zZWUgYmVsb3cpLCB0aGVuICJtYXRjaGluZyIgaGVhZHMgYXJlCitwdXNoZWQ6IGZvciBldmVyeSBoZWFkIHRoYXQgZXhpc3RzIG9uIHRoZSBsb2NhbCBzaWRlLCB0aGUgcmVtb3RlIHNpZGUgaXMKK3VwZGF0ZWQgaWYgYSBoZWFkIG9mIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgb24gdGhlIHJlbW90ZSBzaWRlLgorKworYHRhZyA8dGFnPmAgbWVhbnMgdGhlIHNhbWUgYXMgYHJlZnMvdGFncy88dGFnPjpyZWZzL3RhZ3MvPHRhZz5gLgorKworQSBwYXJhbWV0ZXIgPHJlZj4gd2l0aG91dCBhIGNvbG9uIHB1c2hlcyB0aGUgPHJlZj4gZnJvbSB0aGUgc291cmNlCityZXBvc2l0b3J5IHRvIHRoZSBkZXN0aW5hdGlvbiByZXBvc2l0b3J5IHVuZGVyIHRoZSBzYW1lIG5hbWUuCisrCitQdXNoaW5nIGFuIGVtcHR5IDxzcmM+IGFsbG93cyB5b3UgdG8gZGVsZXRlIHRoZSA8ZHN0PiByZWYgZnJvbQordGhlIHJlbW90ZSByZXBvc2l0b3J5LgorCitcLS1hbGw6OgorCUluc3RlYWQgb2YgbmFtaW5nIGVhY2ggcmVmIHRvIHB1c2gsIHNwZWNpZmllcyB0aGF0IGFsbAorCXJlZnMgdW5kZXIgYCRHSVRfRElSL3JlZnMvaGVhZHMvYCBiZSBwdXNoZWQuCisKK1wtLW1pcnJvcjo6CisJSW5zdGVhZCBvZiBuYW1pbmcgZWFjaCByZWYgdG8gcHVzaCwgc3BlY2lmaWVzIHRoYXQgYWxsCisJcmVmcyB1bmRlciBgJEdJVF9ESVIvcmVmcy9oZWFkcy9gIGFuZCBgJEdJVF9ESVIvcmVmcy90YWdzL2AKKwliZSBtaXJyb3JlZCB0byB0aGUgcmVtb3RlIHJlcG9zaXRvcnkuICBOZXdseSBjcmVhdGVkIGxvY2FsCisJcmVmcyB3aWxsIGJlIHB1c2hlZCB0byB0aGUgcmVtb3RlIGVuZCwgbG9jYWxseSB1cGRhdGVkIHJlZnMKKwl3aWxsIGJlIGZvcmNlIHVwZGF0ZWQgb24gdGhlIHJlbW90ZSBlbmQsIGFuZCBkZWxldGVkIHJlZnMKKwl3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgcmVtb3RlIGVuZC4KKworXC0tZHJ5LXJ1bjo6CisJRG8gZXZlcnl0aGluZyBleGNlcHQgYWN0dWFsbHkgc2VuZCB0aGUgdXBkYXRlcy4KKworXC0tdGFnczo6CisJQWxsIHJlZnMgdW5kZXIgYCRHSVRfRElSL3JlZnMvdGFnc2AgYXJlIHB1c2hlZCwgaW4KKwlhZGRpdGlvbiB0byByZWZzcGVjcyBleHBsaWNpdGx5IGxpc3RlZCBvbiB0aGUgY29tbWFuZAorCWxpbmUuCisKK1wtLXJlY2VpdmUtcGFjaz08Z2l0LXJlY2VpdmUtcGFjaz46OgorCVBhdGggdG8gdGhlICdnaXQtcmVjZWl2ZS1wYWNrJyBwcm9ncmFtIG9uIHRoZSByZW1vdGUKKwllbmQuICBTb21ldGltZXMgdXNlZnVsIHdoZW4gcHVzaGluZyB0byBhIHJlbW90ZQorCXJlcG9zaXRvcnkgb3ZlciBzc2gsIGFuZCB5b3UgZG8gbm90IGhhdmUgdGhlIHByb2dyYW0gaW4KKwlhIGRpcmVjdG9yeSBvbiB0aGUgZGVmYXVsdCAkUEFUSC4KKworXC0tZXhlYz08Z2l0LXJlY2VpdmUtcGFjaz46OgorCVNhbWUgYXMgXC0tcmVjZWl2ZS1wYWNrPTxnaXQtcmVjZWl2ZS1wYWNrPi4KKworLWYsIFwtLWZvcmNlOjoKKwlVc3VhbGx5LCB0aGUgY29tbWFuZCByZWZ1c2VzIHRvIHVwZGF0ZSBhIHJlbW90ZSByZWYgdGhhdCBpcworCW5vdCBhbiBhbmNlc3RvciBvZiB0aGUgbG9jYWwgcmVmIHVzZWQgdG8gb3ZlcndyaXRlIGl0LgorCVRoaXMgZmxhZyBkaXNhYmxlcyB0aGUgY2hlY2suICBUaGlzIGNhbiBjYXVzZSB0aGUKKwlyZW1vdGUgcmVwb3NpdG9yeSB0byBsb3NlIGNvbW1pdHM7IHVzZSBpdCB3aXRoIGNhcmUuCisKK1wtLXJlcG89PHJlcG8+OjoKKwlXaGVuIG5vIHJlcG9zaXRvcnkgaXMgc3BlY2lmaWVkIHRoZSBjb21tYW5kIGRlZmF1bHRzIHRvCisJIm9yaWdpbiI7IHRoaXMgb3ZlcnJpZGVzIGl0LgorCitcLS10aGluLCBcLS1uby10aGluOjoKKwlUaGVzZSBvcHRpb25zIGFyZSBwYXNzZWQgdG8gYGdpdC1zZW5kLXBhY2tgLiAgVGhpbgorCXRyYW5zZmVyIHNwZW5kcyBleHRyYSBjeWNsZXMgdG8gbWluaW1pemUgdGhlIG51bWJlciBvZgorCW9iamVjdHMgdG8gYmUgc2VudCBhbmQgbWVhbnQgdG8gYmUgdXNlZCBvbiBzbG93ZXIgY29ubmVjdGlvbi4KKworLXYsIFwtLXZlcmJvc2U6OgorCVJ1biB2ZXJib3NlbHkuCisKK2luY2x1ZGU6OnVybHMtcmVtb3Rlcy50eHRbXQorCitPVVRQVVQKKy0tLS0tLQorCitUaGUgb3V0cHV0IG9mICJnaXQgcHVzaCIgZGVwZW5kcyBvbiB0aGUgdHJhbnNwb3J0IG1ldGhvZCB1c2VkOyB0aGlzCitzZWN0aW9uIGRlc2NyaWJlcyB0aGUgb3V0cHV0IHdoZW4gcHVzaGluZyBvdmVyIHRoZSBnaXQgcHJvdG9jb2wgKGVpdGhlcgorbG9jYWxseSBvciB2aWEgc3NoKS4KKworVGhlIHN0YXR1cyBvZiB0aGUgcHVzaCBpcyBvdXRwdXQgaW4gdGFidWxhciBmb3JtLCB3aXRoIGVhY2ggbGluZQorcmVwcmVzZW50aW5nIHRoZSBzdGF0dXMgb2YgYSBzaW5nbGUgcmVmLiBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm06CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyA8ZmxhZz4gPHN1bW1hcnk+IDxmcm9tPiAtPiA8dG8+ICg8cmVhc29uPikKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZmxhZzo6CisJQSBzaW5nbGUgY2hhcmFjdGVyIGluZGljYXRpbmcgdGhlIHN0YXR1cyBvZiB0aGUgcmVmLiBUaGlzIGlzCisJYmxhbmsgZm9yIGEgc3VjY2Vzc2Z1bGx5IHB1c2hlZCByZWYsIGAhYCBmb3IgYSByZWYgdGhhdCB3YXMKKwlyZWplY3RlZCBvciBmYWlsZWQgdG8gcHVzaCwgYW5kICc9JyBmb3IgYSByZWYgdGhhdCB3YXMgdXAgdG8KKwlkYXRlIGFuZCBkaWQgbm90IG5lZWQgcHVzaGluZyAobm90ZSB0aGF0IHRoZSBzdGF0dXMgb2YgdXAgdG8KKwlkYXRlIHJlZnMgaXMgc2hvd24gb25seSB3aGVuIGBnaXQgcHVzaGAgaXMgcnVubmluZyB2ZXJib3NlbHkpLgorCitzdW1tYXJ5OjoKKwlGb3IgYSBzdWNjZXNzZnVsbHkgcHVzaGVkIHJlZiwgdGhlIHN1bW1hcnkgc2hvd3MgdGhlIG9sZCBhbmQgbmV3CisJdmFsdWVzIG9mIHRoZSByZWYgaW4gYSBmb3JtIHN1aXRhYmxlIGZvciB1c2luZyBhcyBhbiBhcmd1bWVudCB0bworCWBnaXQgbG9nYCAodGhpcyBpcyBgPG9sZD4uLjxuZXc+YCBpbiBtb3N0IGNhc2VzLCBhbmQKKwlgPG9sZD4uLi48bmV3PmAgZm9yIGZvcmNlZCBub24tZmFzdCBmb3J3YXJkIHVwZGF0ZXMpLiBGb3IgYQorCWZhaWxlZCB1cGRhdGUsIG1vcmUgZGV0YWlscyBhcmUgZ2l2ZW4gZm9yIHRoZSBmYWlsdXJlLgorCVRoZSBzdHJpbmcgYHJlamVjdGVkYCBpbmRpY2F0ZXMgdGhhdCBnaXQgZGlkIG5vdCB0cnkgdG8gc2VuZCB0aGUKKwlyZWYgYXQgYWxsICh0eXBpY2FsbHkgYmVjYXVzZSBpdCBpcyBub3QgYSBmYXN0IGZvcndhcmQpLiBUaGUKKwlzdHJpbmcgYHJlbW90ZSByZWplY3RlZGAgaW5kaWNhdGVzIHRoYXQgdGhlIHJlbW90ZSBlbmQgcmVmdXNlZAorCXRoZSB1cGRhdGU7IHRoaXMgcmVqZWN0aW9uIGlzIHR5cGljYWxseSBjYXVzZWQgYnkgYSBob29rIG9uIHRoZQorCXJlbW90ZSBzaWRlLiBUaGUgc3RyaW5nIGByZW1vdGUgZmFpbHVyZWAgaW5kaWNhdGVzIHRoYXQgdGhlCisJcmVtb3RlIGVuZCBkaWQgbm90IHJlcG9ydCB0aGUgc3VjY2Vzc2Z1bCB1cGRhdGUgb2YgdGhlIHJlZgorCShwZXJoYXBzIGJlY2F1c2Ugb2YgYSB0ZW1wb3JhcnkgZXJyb3Igb24gdGhlIHJlbW90ZSBzaWRlLCBhCisJYnJlYWsgaW4gdGhlIG5ldHdvcmsgY29ubmVjdGlvbiwgb3Igb3RoZXIgdHJhbnNpZW50IGVycm9yKS4KKworZnJvbTo6CisJVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHJlZiBiZWluZyBwdXNoZWQsIG1pbnVzIGl0cworCWByZWZzLzx0eXBlPi9gIHByZWZpeC4gSW4gdGhlIGNhc2Ugb2YgZGVsZXRpb24sIHRoZQorCW5hbWUgb2YgdGhlIGxvY2FsIHJlZiBpcyBvbWl0dGVkLgorCit0bzo6CisJVGhlIG5hbWUgb2YgdGhlIHJlbW90ZSByZWYgYmVpbmcgdXBkYXRlZCwgbWludXMgaXRzCisJYHJlZnMvPHR5cGU+L2AgcHJlZml4LgorCityZWFzb246OgorCUEgaHVtYW4tcmVhZGFibGUgZXhwbGFuYXRpb24uIEluIHRoZSBjYXNlIG9mIHN1Y2Nlc3NmdWxseSBwdXNoZWQKKwlyZWZzLCBubyBleHBsYW5hdGlvbiBpcyBuZWVkZWQuIEZvciBhIGZhaWxlZCByZWYsIHRoZSByZWFzb24gZm9yCisJZmFpbHVyZSBpcyBkZXNjcmliZWQuCisKK0V4YW1wbGVzCistLS0tLS0tLQorCitnaXQgcHVzaCBvcmlnaW4gbWFzdGVyOjoKKwlGaW5kIGEgcmVmIHRoYXQgbWF0Y2hlcyBgbWFzdGVyYCBpbiB0aGUgc291cmNlIHJlcG9zaXRvcnkKKwkobW9zdCBsaWtlbHksIGl0IHdvdWxkIGZpbmQgYHJlZnMvaGVhZHMvbWFzdGVyYCksIGFuZCB1cGRhdGUKKwl0aGUgc2FtZSByZWYgKGUuZy4gYHJlZnMvaGVhZHMvbWFzdGVyYCkgaW4gYG9yaWdpbmAgcmVwb3NpdG9yeQorCXdpdGggaXQuCisKK2dpdCBwdXNoIG9yaWdpbiA6ZXhwZXJpbWVudGFsOjoKKwlGaW5kIGEgcmVmIHRoYXQgbWF0Y2hlcyBgZXhwZXJpbWVudGFsYCBpbiB0aGUgYG9yaWdpbmAgcmVwb3NpdG9yeQorCShlLmcuIGByZWZzL2hlYWRzL2V4cGVyaW1lbnRhbGApLCBhbmQgZGVsZXRlIGl0LgorCitnaXQgcHVzaCBvcmlnaW4gbWFzdGVyOnNhdGVsbGl0ZS9tYXN0ZXI6OgorCUZpbmQgYSByZWYgdGhhdCBtYXRjaGVzIGBtYXN0ZXJgIGluIHRoZSBzb3VyY2UgcmVwb3NpdG9yeQorCShtb3N0IGxpa2VseSwgaXQgd291bGQgZmluZCBgcmVmcy9oZWFkcy9tYXN0ZXJgKSwgYW5kIHVwZGF0ZQorCXRoZSByZWYgdGhhdCBtYXRjaGVzIGBzYXRlbGxpdGUvbWFzdGVyYCAobW9zdCBsaWtlbHksIGl0IHdvdWxkCisJYmUgYHJlZnMvcmVtb3Rlcy9zYXRlbGxpdGUvbWFzdGVyYCkgaW4gYG9yaWdpbmAgcmVwb3NpdG9yeSB3aXRoIGl0LgorCitnaXQgcHVzaCBvcmlnaW4gbWFzdGVyOnJlZnMvaGVhZHMvZXhwZXJpbWVudGFsOjoKKwlDcmVhdGUgdGhlIGJyYW5jaCBgZXhwZXJpbWVudGFsYCBpbiB0aGUgYG9yaWdpbmAgcmVwb3NpdG9yeQorCWJ5IGNvcHlpbmcgdGhlIGN1cnJlbnQgYG1hc3RlcmAgYnJhbmNoLiAgVGhpcyBmb3JtIGlzIHVzdWFsbHkKKwluZWVkZWQgdG8gY3JlYXRlIGEgbmV3IGJyYW5jaCBpbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnkgYXMKKwl0aGVyZSBpcyBubyBgZXhwZXJpbWVudGFsYCBicmFuY2ggdG8gbWF0Y2guCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4sIGxhdGVyIHJld3JpdHRlbiBpbiBDCitieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXF1aWx0aW1wb3J0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXF1aWx0aW1wb3J0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmMyYjU2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcXVpbHRpbXBvcnQudHh0CkBAIC0wLDAgKzEsNjAgQEAKK2dpdC1xdWlsdGltcG9ydCgxKQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcXVpbHRpbXBvcnQgLSBBcHBsaWVzIGEgcXVpbHQgcGF0Y2hzZXQgb250byB0aGUgY3VycmVudCBicmFuY2gKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtcXVpbHRpbXBvcnQnIFstLWRyeS1ydW5dIFstLWF1dGhvciA8YXV0aG9yPl0gWy0tcGF0Y2hlcyA8ZGlyPl0KKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0FwcGxpZXMgYSBxdWlsdCBwYXRjaHNldCBvbnRvIHRoZSBjdXJyZW50IGdpdCBicmFuY2gsIHByZXNlcnZpbmcKK3RoZSBwYXRjaCBib3VuZGFyaWVzLCBwYXRjaCBvcmRlciwgYW5kIHBhdGNoIGRlc2NyaXB0aW9ucyBwcmVzZW50CitpbiB0aGUgcXVpbHQgcGF0Y2hzZXQuCisKK0ZvciBlYWNoIHBhdGNoIHRoZSBjb2RlIGF0dGVtcHRzIHRvIGV4dHJhY3QgdGhlIGF1dGhvciBmcm9tIHRoZQorcGF0Y2ggZGVzY3JpcHRpb24uICBJZiB0aGF0IGZhaWxzIGl0IGZhbGxzIGJhY2sgdG8gdGhlIGF1dGhvcgorc3BlY2lmaWVkIHdpdGggLS1hdXRob3IuICBJZiB0aGUgLS1hdXRob3IgZmxhZyB3YXMgbm90IGdpdmVuCit0aGUgcGF0Y2ggZGVzY3JpcHRpb24gaXMgZGlzcGxheWVkIGFuZCB0aGUgdXNlciBpcyBhc2tlZCB0bworaW50ZXJhY3RpdmVseSBlbnRlciB0aGUgYXV0aG9yIG9mIHRoZSBwYXRjaC4KKworSWYgYSBzdWJqZWN0IGlzIG5vdCBmb3VuZCBpbiB0aGUgcGF0Y2ggZGVzY3JpcHRpb24gdGhlIHBhdGNoIG5hbWUgaXMKK3ByZXNlcnZlZCBhcyB0aGUgMSBsaW5lIHN1YmplY3QgaW4gdGhlIGdpdCBkZXNjcmlwdGlvbi4KKworT1BUSU9OUworLS0tLS0tLQorLS1kcnktcnVuOjoKKwlXYWxrIHRocm91Z2ggdGhlIHBhdGNoZXMgaW4gdGhlIHNlcmllcyBhbmQgd2FybgorCWlmIHdlIGNhbm5vdCBmaW5kIGFsbCBvZiB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHRvIGNvbW1pdAorCWEgcGF0Y2guICBBdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcgb25seSBtaXNzaW5nIGF1dGhvcgorCWluZm9ybWF0aW9uIGlzIHdhcm5lZCBhYm91dC4KKworLS1hdXRob3IgQXV0aG9yIE5hbWUgPEF1dGhvciBFbWFpbD46OgorCVRoZSBhdXRob3IgbmFtZSBhbmQgZW1haWwgYWRkcmVzcyB0byB1c2Ugd2hlbiBubyBhdXRob3IKKwlpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlIHBhdGNoIGRlc2NyaXB0aW9uLgorCistLXBhdGNoZXMgPGRpcj46OgorCVRoZSBkaXJlY3RvcnkgdG8gZmluZCB0aGUgcXVpbHQgcGF0Y2hlcyBhbmQgdGhlCisJcXVpbHQgc2VyaWVzIGZpbGUuCisrCitUaGUgZGVmYXVsdCBmb3IgdGhlIHBhdGNoIGRpcmVjdG9yeSBpcyBwYXRjaGVzCitvciB0aGUgdmFsdWUgb2YgdGhlICRRVUlMVF9QQVRDSEVTIGVudmlyb25tZW50Cit2YXJpYWJsZS4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgRXJpYyBCaWVkZXJtYW4gPGViaWVkZXJtQGxueGkuY29tPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBFcmljIEJpZWRlcm1hbiA8ZWJpZWRlcm1AbG54aS5jb20+CisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcmVhZC10cmVlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXJlYWQtdHJlZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQyMWQxZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXJlYWQtdHJlZS50eHQKQEAgLTAsMCArMSwzNjQgQEAKK2dpdC1yZWFkLXRyZWUoMSkKKz09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXJlYWQtdHJlZSAtIFJlYWRzIHRyZWUgaW5mb3JtYXRpb24gaW50byB0aGUgaW5kZXgKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcmVhZC10cmVlJyAoPHRyZWUtaXNoPiB8IFtbLW0gWy0tdHJpdmlhbF0gWy0tYWdncmVzc2l2ZV0gfCAtLXJlc2V0IHwgLS1wcmVmaXg9PHByZWZpeD5dIFstdSB8IC1pXV0gWy0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PTxnaXRpZ25vcmU+XSBbLS1pbmRleC1vdXRwdXQ9PGZpbGU+XSA8dHJlZS1pc2gxPiBbPHRyZWUtaXNoMj4gWzx0cmVlLWlzaDM+XV0pCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitSZWFkcyB0aGUgdHJlZSBpbmZvcm1hdGlvbiBnaXZlbiBieSA8dHJlZS1pc2g+IGludG8gdGhlIGluZGV4LAorYnV0IGRvZXMgbm90IGFjdHVhbGx5ICp1cGRhdGUqIGFueSBvZiB0aGUgZmlsZXMgaXQgImNhY2hlcyIuIChzZWU6CitsaW5rZ2l0OmdpdC1jaGVja291dC1pbmRleFsxXSkKKworT3B0aW9uYWxseSwgaXQgY2FuIG1lcmdlIGEgdHJlZSBpbnRvIHRoZSBpbmRleCwgcGVyZm9ybSBhCitmYXN0LWZvcndhcmQgKGkuZS4gMi13YXkpIG1lcmdlLCBvciBhIDMtd2F5IG1lcmdlLCB3aXRoIHRoZSBgLW1gCitmbGFnLiAgV2hlbiB1c2VkIHdpdGggYC1tYCwgdGhlIGAtdWAgZmxhZyBjYXVzZXMgaXQgdG8gYWxzbyB1cGRhdGUKK3RoZSBmaWxlcyBpbiB0aGUgd29yayB0cmVlIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgbWVyZ2UuCisKK1RyaXZpYWwgbWVyZ2VzIGFyZSBkb25lIGJ5IGBnaXQtcmVhZC10cmVlYCBpdHNlbGYuICBPbmx5IGNvbmZsaWN0aW5nIHBhdGhzCit3aWxsIGJlIGluIHVubWVyZ2VkIHN0YXRlIHdoZW4gYGdpdC1yZWFkLXRyZWVgIHJldHVybnMuCisKK09QVElPTlMKKy0tLS0tLS0KKy1tOjoKKwlQZXJmb3JtIGEgbWVyZ2UsIG5vdCBqdXN0IGEgcmVhZC4gIFRoZSBjb21tYW5kIHdpbGwKKwlyZWZ1c2UgdG8gcnVuIGlmIHlvdXIgaW5kZXggZmlsZSBoYXMgdW5tZXJnZWQgZW50cmllcywKKwlpbmRpY2F0aW5nIHRoYXQgeW91IGhhdmUgbm90IGZpbmlzaGVkIHByZXZpb3VzIG1lcmdlIHlvdQorCXN0YXJ0ZWQuCisKKy0tcmVzZXQ6OgorICAgICAgICBTYW1lIGFzIC1tLCBleGNlcHQgdGhhdCB1bm1lcmdlZCBlbnRyaWVzIGFyZSBkaXNjYXJkZWQKKyAgICAgICAgaW5zdGVhZCBvZiBmYWlsaW5nLgorCistdTo6CisJQWZ0ZXIgYSBzdWNjZXNzZnVsIG1lcmdlLCB1cGRhdGUgdGhlIGZpbGVzIGluIHRoZSB3b3JrCisJdHJlZSB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIG1lcmdlLgorCistaTo6CisJVXN1YWxseSBhIG1lcmdlIHJlcXVpcmVzIHRoZSBpbmRleCBmaWxlIGFzIHdlbGwgYXMgdGhlCisJZmlsZXMgaW4gdGhlIHdvcmtpbmcgdHJlZSBhcmUgdXAgdG8gZGF0ZSB3aXRoIHRoZQorCWN1cnJlbnQgaGVhZCBjb21taXQsIGluIG9yZGVyIG5vdCB0byBsb3NlIGxvY2FsCisJY2hhbmdlcy4gIFRoaXMgZmxhZyBkaXNhYmxlcyB0aGUgY2hlY2sgd2l0aCB0aGUgd29ya2luZworCXRyZWUgYW5kIGlzIG1lYW50IHRvIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBhIG1lcmdlIG9mCisJdHJlZXMgdGhhdCBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIGN1cnJlbnQKKwl3b3JraW5nIHRyZWUgc3RhdHVzIGludG8gYSB0ZW1wb3JhcnkgaW5kZXggZmlsZS4KKworLS10cml2aWFsOjoKKwlSZXN0cmljdCB0aHJlZS13YXkgbWVyZ2UgYnkgYGdpdC1yZWFkLXRyZWVgIHRvIGhhcHBlbgorCW9ubHkgaWYgdGhlcmUgaXMgbm8gZmlsZS1sZXZlbCBtZXJnaW5nIHJlcXVpcmVkLCBpbnN0ZWFkCisJb2YgcmVzb2x2aW5nIG1lcmdlIGZvciB0cml2aWFsIGNhc2VzIGFuZCBsZWF2aW5nCisJY29uZmxpY3RpbmcgZmlsZXMgdW5yZXNvbHZlZCBpbiB0aGUgaW5kZXguCisKKy0tYWdncmVzc2l2ZTo6CisJVXN1YWxseSBhIHRocmVlLXdheSBtZXJnZSBieSBgZ2l0LXJlYWQtdHJlZWAgcmVzb2x2ZXMKKwl0aGUgbWVyZ2UgZm9yIHJlYWxseSB0cml2aWFsIGNhc2VzIGFuZCBsZWF2ZXMgb3RoZXIKKwljYXNlcyB1bnJlc29sdmVkIGluIHRoZSBpbmRleCwgc28gdGhhdCBQb3JjZWxhaW5zIGNhbgorCWltcGxlbWVudCBkaWZmZXJlbnQgbWVyZ2UgcG9saWNpZXMuICBUaGlzIGZsYWcgbWFrZXMgdGhlCisJY29tbWFuZCB0byByZXNvbHZlIGEgZmV3IG1vcmUgY2FzZXMgaW50ZXJuYWxseToKKysKKyogd2hlbiBvbmUgc2lkZSByZW1vdmVzIGEgcGF0aCBhbmQgdGhlIG90aGVyIHNpZGUgbGVhdmVzIHRoZSBwYXRoCisgIHVubW9kaWZpZWQuICBUaGUgcmVzb2x1dGlvbiBpcyB0byByZW1vdmUgdGhhdCBwYXRoLgorKiB3aGVuIGJvdGggc2lkZXMgcmVtb3ZlIGEgcGF0aC4gIFRoZSByZXNvbHV0aW9uIGlzIHRvIHJlbW92ZSB0aGF0IHBhdGguCisqIHdoZW4gYm90aCBzaWRlcyBhZGRzIGEgcGF0aCBpZGVudGljYWxseS4gIFRoZSByZXNvbHV0aW9uCisgIGlzIHRvIGFkZCB0aGF0IHBhdGguCisKKy0tcHJlZml4PTxwcmVmaXg+Lzo6CisJS2VlcCB0aGUgY3VycmVudCBpbmRleCBjb250ZW50cywgYW5kIHJlYWQgdGhlIGNvbnRlbnRzCisJb2YgbmFtZWQgdHJlZS1pc2ggdW5kZXIgZGlyZWN0b3J5IGF0IGA8cHJlZml4PmAuICBUaGUKKwlvcmlnaW5hbCBpbmRleCBmaWxlIGNhbm5vdCBoYXZlIGFueXRoaW5nIGF0IHRoZSBwYXRoCisJYDxwcmVmaXg+YCBpdHNlbGYsIGFuZCBoYXZlIG5vdGhpbmcgaW4gYDxwcmVmaXg+L2AKKwlkaXJlY3RvcnkuICBOb3RlIHRoYXQgdGhlIGA8cHJlZml4Pi9gIHZhbHVlIG11c3QgZW5kCisJd2l0aCBhIHNsYXNoLgorCistLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeT08Z2l0aWdub3JlPjo6CisJV2hlbiBydW5uaW5nIHRoZSBjb21tYW5kIHdpdGggYC11YCBhbmQgYC1tYCBvcHRpb25zLCB0aGUKKwltZXJnZSByZXN1bHQgbWF5IG5lZWQgdG8gb3ZlcndyaXRlIHBhdGhzIHRoYXQgYXJlIG5vdAorCXRyYWNrZWQgaW4gdGhlIGN1cnJlbnQgYnJhbmNoLiAgVGhlIGNvbW1hbmQgdXN1YWxseQorCXJlZnVzZXMgdG8gcHJvY2VlZCB3aXRoIHRoZSBtZXJnZSB0byBhdm9pZCBsb3Npbmcgc3VjaCBhCisJcGF0aC4gIEhvd2V2ZXIgdGhpcyBzYWZldHkgdmFsdmUgc29tZXRpbWVzIGdldHMgaW4gdGhlCisJd2F5LiAgRm9yIGV4YW1wbGUsIGl0IG9mdGVuIGhhcHBlbnMgdGhhdCB0aGUgb3RoZXIKKwlicmFuY2ggYWRkZWQgYSBmaWxlIHRoYXQgdXNlZCB0byBiZSBhIGdlbmVyYXRlZCBmaWxlIGluCisJeW91ciBicmFuY2gsIGFuZCB0aGUgc2FmZXR5IHZhbHZlIHRyaWdnZXJzIHdoZW4geW91IHRyeQorCXRvIHN3aXRjaCB0byB0aGF0IGJyYW5jaCBhZnRlciB5b3UgcmFuIGBtYWtlYCBidXQgYmVmb3JlCisJcnVubmluZyBgbWFrZSBjbGVhbmAgdG8gcmVtb3ZlIHRoZSBnZW5lcmF0ZWQgZmlsZS4gIFRoaXMKKwlvcHRpb24gdGVsbHMgdGhlIGNvbW1hbmQgdG8gcmVhZCBwZXItZGlyZWN0b3J5IGV4Y2x1ZGUKKwlmaWxlICh1c3VhbGx5ICcuZ2l0aWdub3JlJykgYW5kIGFsbG93cyBzdWNoIGFuIHVudHJhY2tlZAorCWJ1dCBleHBsaWNpdGx5IGlnbm9yZWQgZmlsZSB0byBiZSBvdmVyd3JpdHRlbi4KKworLS1pbmRleC1vdXRwdXQ9PGZpbGU+OjoKKwlJbnN0ZWFkIG9mIHdyaXRpbmcgdGhlIHJlc3VsdHMgb3V0IHRvIGAkR0lUX0lOREVYX0ZJTEVgLAorCXdyaXRlIHRoZSByZXN1bHRpbmcgaW5kZXggaW4gdGhlIG5hbWVkIGZpbGUuICBXaGlsZSB0aGUKKwljb21tYW5kIGlzIG9wZXJhdGluZywgdGhlIG9yaWdpbmFsIGluZGV4IGZpbGUgaXMgbG9ja2VkCisJd2l0aCB0aGUgc2FtZSBtZWNoYW5pc20gYXMgdXN1YWwuICBUaGUgZmlsZSBtdXN0IGFsbG93CisJdG8gYmUgcmVuYW1lKDIpZWQgaW50byBmcm9tIGEgdGVtcG9yYXJ5IGZpbGUgdGhhdCBpcworCWNyZWF0ZWQgbmV4dCB0byB0aGUgdXN1YWwgaW5kZXggZmlsZTsgdHlwaWNhbGx5IHRoaXMKKwltZWFucyBpdCBuZWVkcyB0byBiZSBvbiB0aGUgc2FtZSBmaWxlc3lzdGVtIGFzIHRoZSBpbmRleAorCWZpbGUgaXRzZWxmLCBhbmQgeW91IG5lZWQgd3JpdGUgcGVybWlzc2lvbiB0byB0aGUKKwlkaXJlY3RvcmllcyB0aGUgaW5kZXggZmlsZSBhbmQgaW5kZXggb3V0cHV0IGZpbGUgYXJlCisJbG9jYXRlZCBpbi4KKworPHRyZWUtaXNoIz46OgorCVRoZSBpZCBvZiB0aGUgdHJlZSBvYmplY3QocykgdG8gYmUgcmVhZC9tZXJnZWQuCisKKworTWVyZ2luZworLS0tLS0tLQorSWYgYC1tYCBpcyBzcGVjaWZpZWQsIGBnaXQtcmVhZC10cmVlYCBjYW4gcGVyZm9ybSAzIGtpbmRzIG9mCittZXJnZSwgYSBzaW5nbGUgdHJlZSBtZXJnZSBpZiBvbmx5IDEgdHJlZSBpcyBnaXZlbiwgYQorZmFzdC1mb3J3YXJkIG1lcmdlIHdpdGggMiB0cmVlcywgb3IgYSAzLXdheSBtZXJnZSBpZiAzIHRyZWVzIGFyZQorcHJvdmlkZWQuCisKKworU2luZ2xlIFRyZWUgTWVyZ2UKK35+fn5+fn5+fn5+fn5+fn5+CitJZiBvbmx5IDEgdHJlZSBpcyBzcGVjaWZpZWQsIGdpdC1yZWFkLXRyZWUgb3BlcmF0ZXMgYXMgaWYgdGhlIHVzZXIgZGlkIG5vdAorc3BlY2lmeSBgLW1gLCBleGNlcHQgdGhhdCBpZiB0aGUgb3JpZ2luYWwgaW5kZXggaGFzIGFuIGVudHJ5IGZvciBhCitnaXZlbiBwYXRobmFtZSwgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgcGF0aCBtYXRjaGVzIHdpdGggdGhlIHRyZWUKK2JlaW5nIHJlYWQsIHRoZSBzdGF0IGluZm8gZnJvbSB0aGUgaW5kZXggaXMgdXNlZC4gKEluIG90aGVyIHdvcmRzLCB0aGUKK2luZGV4J3Mgc3RhdCgpcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgbWVyZ2VkIHRyZWUncykuCisKK1RoYXQgbWVhbnMgdGhhdCBpZiB5b3UgZG8gYSBgZ2l0LXJlYWQtdHJlZSAtbSA8bmV3dHJlZT5gIGZvbGxvd2VkIGJ5IGEKK2BnaXQtY2hlY2tvdXQtaW5kZXggLWYgLXUgLWFgLCB0aGUgYGdpdC1jaGVja291dC1pbmRleGAgb25seSBjaGVja3Mgb3V0Cit0aGUgc3R1ZmYgdGhhdCByZWFsbHkgY2hhbmdlZC4KKworVGhpcyBpcyB1c2VkIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGZhbHNlIGhpdHMgd2hlbiBgZ2l0LWRpZmYtZmlsZXNgIGlzCitydW4gYWZ0ZXIgYGdpdC1yZWFkLXRyZWVgLgorCisKK1R3byBUcmVlIE1lcmdlCit+fn5+fn5+fn5+fn5+fgorCitUeXBpY2FsbHksIHRoaXMgaXMgaW52b2tlZCBhcyBgZ2l0LXJlYWQtdHJlZSAtbSAkSCAkTWAsIHdoZXJlICRICitpcyB0aGUgaGVhZCBjb21taXQgb2YgdGhlIGN1cnJlbnQgcmVwb3NpdG9yeSwgYW5kICRNIGlzIHRoZSBoZWFkCitvZiBhIGZvcmVpZ24gdHJlZSwgd2hpY2ggaXMgc2ltcGx5IGFoZWFkIG9mICRIIChpLmUuIHdlIGFyZSBpbiBhCitmYXN0IGZvcndhcmQgc2l0dWF0aW9uKS4KKworV2hlbiB0d28gdHJlZXMgYXJlIHNwZWNpZmllZCwgdGhlIHVzZXIgaXMgdGVsbGluZyBnaXQtcmVhZC10cmVlCit0aGUgZm9sbG93aW5nOgorCisgICAgIDEuIFRoZSBjdXJyZW50IGluZGV4IGFuZCB3b3JrIHRyZWUgaXMgZGVyaXZlZCBmcm9tICRILCBidXQKKyAgICAgICAgdGhlIHVzZXIgbWF5IGhhdmUgbG9jYWwgY2hhbmdlcyBpbiB0aGVtIHNpbmNlICRIOworCisgICAgIDIuIFRoZSB1c2VyIHdhbnRzIHRvIGZhc3QtZm9yd2FyZCB0byAkTS4KKworSW4gdGhpcyBjYXNlLCB0aGUgYGdpdC1yZWFkLXRyZWUgLW0gJEggJE1gIGNvbW1hbmQgbWFrZXMgc3VyZQordGhhdCBubyBsb2NhbCBjaGFuZ2UgaXMgbG9zdCBhcyB0aGUgcmVzdWx0IG9mIHRoaXMgIm1lcmdlIi4KK0hlcmUgYXJlIHRoZSAiY2FycnkgZm9yd2FyZCIgcnVsZXM6CisKKyAgICAgICAgSSAoaW5kZXgpICAgICAgICAgICBIICAgICAgICBNICAgICAgICBSZXN1bHQKKyAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAwIG5vdGhpbmcgICAgICAgICAgICAgbm90aGluZyAgbm90aGluZyAgKGRvZXMgbm90IGhhcHBlbikKKyAgICAgIDEgbm90aGluZyAgICAgICAgICAgICBub3RoaW5nICBleGlzdHMgICB1c2UgTQorICAgICAgMiBub3RoaW5nICAgICAgICAgICAgIGV4aXN0cyAgIG5vdGhpbmcgIHJlbW92ZSBwYXRoIGZyb20gaW5kZXgKKyAgICAgIDMgbm90aGluZyAgICAgICAgICAgICBleGlzdHMgICBleGlzdHMgICB1c2UgTQorCisgICAgICAgIGNsZWFuIEk9PUggIEk9PU0KKyAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIDQgeWVzICAgTi9BICAgTi9BICAgICBub3RoaW5nICBub3RoaW5nICBrZWVwIGluZGV4CisgICAgICA1IG5vICAgIE4vQSAgIE4vQSAgICAgbm90aGluZyAgbm90aGluZyAga2VlcCBpbmRleAorCisgICAgICA2IHllcyAgIE4vQSAgIHllcyAgICAgbm90aGluZyAgZXhpc3RzICAga2VlcCBpbmRleAorICAgICAgNyBubyAgICBOL0EgICB5ZXMgICAgIG5vdGhpbmcgIGV4aXN0cyAgIGtlZXAgaW5kZXgKKyAgICAgIDggeWVzICAgTi9BICAgbm8gICAgICBub3RoaW5nICBleGlzdHMgICBmYWlsCisgICAgICA5IG5vICAgIE4vQSAgIG5vICAgICAgbm90aGluZyAgZXhpc3RzICAgZmFpbAorCisgICAgIDEwIHllcyAgIHllcyAgIE4vQSAgICAgZXhpc3RzICAgbm90aGluZyAgcmVtb3ZlIHBhdGggZnJvbSBpbmRleAorICAgICAxMSBubyAgICB5ZXMgICBOL0EgICAgIGV4aXN0cyAgIG5vdGhpbmcgIGZhaWwKKyAgICAgMTIgeWVzICAgbm8gICAgTi9BICAgICBleGlzdHMgICBub3RoaW5nICBmYWlsCisgICAgIDEzIG5vICAgIG5vICAgIE4vQSAgICAgZXhpc3RzICAgbm90aGluZyAgZmFpbAorCisgICAgICAgIGNsZWFuIChIPU0pCisgICAgICAgLS0tLS0tCisgICAgIDE0IHllcyAgICAgICAgICAgICAgICAgZXhpc3RzICAgZXhpc3RzICAga2VlcCBpbmRleAorICAgICAxNSBubyAgICAgICAgICAgICAgICAgIGV4aXN0cyAgIGV4aXN0cyAgIGtlZXAgaW5kZXgKKworICAgICAgICBjbGVhbiBJPT1IICBJPT1NIChIIT1NKQorICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAxNiB5ZXMgICBubyAgICBubyAgICAgIGV4aXN0cyAgIGV4aXN0cyAgIGZhaWwKKyAgICAgMTcgbm8gICAgbm8gICAgbm8gICAgICBleGlzdHMgICBleGlzdHMgICBmYWlsCisgICAgIDE4IHllcyAgIG5vICAgIHllcyAgICAgZXhpc3RzICAgZXhpc3RzICAga2VlcCBpbmRleAorICAgICAxOSBubyAgICBubyAgICB5ZXMgICAgIGV4aXN0cyAgIGV4aXN0cyAgIGtlZXAgaW5kZXgKKyAgICAgMjAgeWVzICAgeWVzICAgbm8gICAgICBleGlzdHMgICBleGlzdHMgICB1c2UgTQorICAgICAyMSBubyAgICB5ZXMgICBubyAgICAgIGV4aXN0cyAgIGV4aXN0cyAgIGZhaWwKKworSW4gYWxsICJrZWVwIGluZGV4IiBjYXNlcywgdGhlIGluZGV4IGVudHJ5IHN0YXlzIGFzIGluIHRoZQorb3JpZ2luYWwgaW5kZXggZmlsZS4gIElmIHRoZSBlbnRyeSB3ZXJlIG5vdCB1cCB0byBkYXRlLAorZ2l0LXJlYWQtdHJlZSBrZWVwcyB0aGUgY29weSBpbiB0aGUgd29yayB0cmVlIGludGFjdCB3aGVuCitvcGVyYXRpbmcgdW5kZXIgdGhlIC11IGZsYWcuCisKK1doZW4gdGhpcyBmb3JtIG9mIGdpdC1yZWFkLXRyZWUgcmV0dXJucyBzdWNjZXNzZnVsbHksIHlvdSBjYW4KK3NlZSB3aGF0ICJsb2NhbCBjaGFuZ2VzIiB5b3UgbWFkZSBhcmUgY2FycmllZCBmb3J3YXJkIGJ5IHJ1bm5pbmcKK2BnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCAkTWAuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdAorbmVjZXNzYXJpbHkgbWF0Y2ggYGdpdC1kaWZmLWluZGV4IC0tY2FjaGVkICRIYCB3b3VsZCBoYXZlCitwcm9kdWNlZCBiZWZvcmUgc3VjaCBhIHR3byB0cmVlIG1lcmdlLiAgVGhpcyBpcyBiZWNhdXNlIG9mIGNhc2VzCisxOCBhbmQgMTkgLS0tIGlmIHlvdSBhbHJlYWR5IGhhZCB0aGUgY2hhbmdlcyBpbiAkTSAoZS5nLiBtYXliZQoreW91IHBpY2tlZCBpdCB1cCB2aWEgZS1tYWlsIGluIGEgcGF0Y2ggZm9ybSksIGBnaXQtZGlmZi1pbmRleAorLS1jYWNoZWQgJEhgIHdvdWxkIGhhdmUgdG9sZCB5b3UgYWJvdXQgdGhlIGNoYW5nZSBiZWZvcmUgdGhpcworbWVyZ2UsIGJ1dCBpdCB3b3VsZCBub3Qgc2hvdyBpbiBgZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgJE1gCitvdXRwdXQgYWZ0ZXIgdHdvLXRyZWUgbWVyZ2UuCisKKworMy1XYXkgTWVyZ2UKK35+fn5+fn5+fn5+CitFYWNoICJpbmRleCIgZW50cnkgaGFzIHR3byBiaXRzIHdvcnRoIG9mICJzdGFnZSIgc3RhdGUuIHN0YWdlIDAgaXMgdGhlCitub3JtYWwgb25lLCBhbmQgaXMgdGhlIG9ubHkgb25lIHlvdSdkIHNlZSBpbiBhbnkga2luZCBvZiBub3JtYWwgdXNlLgorCitIb3dldmVyLCB3aGVuIHlvdSBkbyBgZ2l0LXJlYWQtdHJlZWAgd2l0aCB0aHJlZSB0cmVlcywgdGhlICJzdGFnZSIKK3N0YXJ0cyBvdXQgYXQgMS4KKworVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gZG8KKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtcmVhZC10cmVlIC1tIDx0cmVlMT4gPHRyZWUyPiA8dHJlZTM+CistLS0tLS0tLS0tLS0tLS0tCisKK2FuZCB5b3Ugd2lsbCBlbmQgdXAgd2l0aCBhbiBpbmRleCB3aXRoIGFsbCBvZiB0aGUgPHRyZWUxPiBlbnRyaWVzIGluCisic3RhZ2UxIiwgYWxsIG9mIHRoZSA8dHJlZTI+IGVudHJpZXMgaW4gInN0YWdlMiIgYW5kIGFsbCBvZiB0aGUKKzx0cmVlMz4gZW50cmllcyBpbiAic3RhZ2UzIi4gIFdoZW4gcGVyZm9ybWluZyBhIG1lcmdlIG9mIGFub3RoZXIKK2JyYW5jaCBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaCwgd2UgdXNlIHRoZSBjb21tb24gYW5jZXN0b3IgdHJlZQorYXMgPHRyZWUxPiwgdGhlIGN1cnJlbnQgYnJhbmNoIGhlYWQgYXMgPHRyZWUyPiwgYW5kIHRoZSBvdGhlcgorYnJhbmNoIGhlYWQgYXMgPHRyZWUzPi4KKworRnVydGhlcm1vcmUsIGBnaXQtcmVhZC10cmVlYCBoYXMgc3BlY2lhbC1jYXNlIGxvZ2ljIHRoYXQgc2F5czogaWYgeW91IHNlZQorYSBmaWxlIHRoYXQgbWF0Y2hlcyBpbiBhbGwgcmVzcGVjdHMgaW4gdGhlIGZvbGxvd2luZyBzdGF0ZXMsIGl0CisiY29sbGFwc2VzIiBiYWNrIHRvICJzdGFnZTAiOgorCisgICAtIHN0YWdlIDIgYW5kIDMgYXJlIHRoZSBzYW1lOyB0YWtlIG9uZSBvciB0aGUgb3RoZXIgKGl0IG1ha2VzIG5vCisgICAgIGRpZmZlcmVuY2UgLSB0aGUgc2FtZSB3b3JrIGhhcyBiZWVuIGRvbmUgb24gb3VyIGJyYW5jaCBpbgorICAgICBzdGFnZSAyIGFuZCB0aGVpciBicmFuY2ggaW4gc3RhZ2UgMykKKworICAgLSBzdGFnZSAxIGFuZCBzdGFnZSAyIGFyZSB0aGUgc2FtZSBhbmQgc3RhZ2UgMyBpcyBkaWZmZXJlbnQ7IHRha2UKKyAgICAgc3RhZ2UgMyAob3VyIGJyYW5jaCBpbiBzdGFnZSAyIGRpZCBub3QgZG8gYW55dGhpbmcgc2luY2UgdGhlCisgICAgIGFuY2VzdG9yIGluIHN0YWdlIDEgd2hpbGUgdGhlaXIgYnJhbmNoIGluIHN0YWdlIDMgd29ya2VkIG9uCisgICAgIGl0KQorCisgICAtIHN0YWdlIDEgYW5kIHN0YWdlIDMgYXJlIHRoZSBzYW1lIGFuZCBzdGFnZSAyIGlzIGRpZmZlcmVudCB0YWtlCisgICAgIHN0YWdlIDIgKHdlIGRpZCBzb21ldGhpbmcgd2hpbGUgdGhleSBkaWQgbm90aGluZykKKworVGhlIGBnaXQtd3JpdGUtdHJlZWAgY29tbWFuZCByZWZ1c2VzIHRvIHdyaXRlIGEgbm9uc2Vuc2ljYWwgdHJlZSwgYW5kIGl0Cit3aWxsIGNvbXBsYWluIGFib3V0IHVubWVyZ2VkIGVudHJpZXMgaWYgaXQgc2VlcyBhIHNpbmdsZSBlbnRyeSB0aGF0IGlzIG5vdAorc3RhZ2UgMC4KKworT0ssIHRoaXMgYWxsIHNvdW5kcyBsaWtlIGEgY29sbGVjdGlvbiBvZiB0b3RhbGx5IG5vbnNlbnNpY2FsIHJ1bGVzLAorYnV0IGl0J3MgYWN0dWFsbHkgZXhhY3RseSB3aGF0IHlvdSB3YW50IGluIG9yZGVyIHRvIGRvIGEgZmFzdAorbWVyZ2UuIFRoZSBkaWZmZXJlbnQgc3RhZ2VzIHJlcHJlc2VudCB0aGUgInJlc3VsdCB0cmVlIiAoc3RhZ2UgMCwgYWthCisibWVyZ2VkIiksIHRoZSBvcmlnaW5hbCB0cmVlIChzdGFnZSAxLCBha2EgIm9yaWciKSwgYW5kIHRoZSB0d28gdHJlZXMKK3lvdSBhcmUgdHJ5aW5nIHRvIG1lcmdlIChzdGFnZSAyIGFuZCAzIHJlc3BlY3RpdmVseSkuCisKK1RoZSBvcmRlciBvZiBzdGFnZXMgMSwgMiBhbmQgMyAoaGVuY2UgdGhlIG9yZGVyIG9mIHRocmVlCis8dHJlZS1pc2g+IGNvbW1hbmQgbGluZSBhcmd1bWVudHMpIGFyZSBzaWduaWZpY2FudCB3aGVuIHlvdQorc3RhcnQgYSAzLXdheSBtZXJnZSB3aXRoIGFuIGluZGV4IGZpbGUgdGhhdCBpcyBhbHJlYWR5Citwb3B1bGF0ZWQuICBIZXJlIGlzIGFuIG91dGxpbmUgb2YgaG93IHRoZSBhbGdvcml0aG0gd29ya3M6CisKKy0gaWYgYSBmaWxlIGV4aXN0cyBpbiBpZGVudGljYWwgZm9ybWF0IGluIGFsbCB0aHJlZSB0cmVlcywgaXQgd2lsbAorICBhdXRvbWF0aWNhbGx5IGNvbGxhcHNlIHRvICJtZXJnZWQiIHN0YXRlIGJ5IGdpdC1yZWFkLXRyZWUuCisKKy0gYSBmaWxlIHRoYXQgaGFzIF9hbnlfIGRpZmZlcmVuY2Ugd2hhdC1zby1ldmVyIGluIHRoZSB0aHJlZSB0cmVlcworICB3aWxsIHN0YXkgYXMgc2VwYXJhdGUgZW50cmllcyBpbiB0aGUgaW5kZXguIEl0J3MgdXAgdG8gInBvcmNlbGFpbgorICBwb2xpY3kiIHRvIGRldGVybWluZSBob3cgdG8gcmVtb3ZlIHRoZSBub24tMCBzdGFnZXMsIGFuZCBpbnNlcnQgYQorICBtZXJnZWQgdmVyc2lvbi4KKworLSB0aGUgaW5kZXggZmlsZSBzYXZlcyBhbmQgcmVzdG9yZXMgd2l0aCBhbGwgdGhpcyBpbmZvcm1hdGlvbiwgc28geW91CisgIGNhbiBtZXJnZSB0aGluZ3MgaW5jcmVtZW50YWxseSwgYnV0IGFzIGxvbmcgYXMgaXQgaGFzIGVudHJpZXMgaW4KKyAgc3RhZ2VzIDEvMi8zIChpLmUuLCAidW5tZXJnZWQgZW50cmllcyIpIHlvdSBjYW4ndCB3cml0ZSB0aGUgcmVzdWx0LiBTbworICBub3cgdGhlIG1lcmdlIGFsZ29yaXRobSBlbmRzIHVwIGJlaW5nIHJlYWxseSBzaW1wbGU6CisKKyAgKiB5b3Ugd2FsayB0aGUgaW5kZXggaW4gb3JkZXIsIGFuZCBpZ25vcmUgYWxsIGVudHJpZXMgb2Ygc3RhZ2UgMCwKKyAgICBzaW5jZSB0aGV5J3ZlIGFscmVhZHkgYmVlbiBkb25lLgorCisgICogaWYgeW91IGZpbmQgYSAic3RhZ2UxIiwgYnV0IG5vIG1hdGNoaW5nICJzdGFnZTIiIG9yICJzdGFnZTMiLCB5b3UKKyAgICBrbm93IGl0J3MgYmVlbiByZW1vdmVkIGZyb20gYm90aCB0cmVlcyAoaXQgb25seSBleGlzdGVkIGluIHRoZQorICAgIG9yaWdpbmFsIHRyZWUpLCBhbmQgeW91IHJlbW92ZSB0aGF0IGVudHJ5LgorCisgICogaWYgeW91IGZpbmQgYSBtYXRjaGluZyAic3RhZ2UyIiBhbmQgInN0YWdlMyIgdHJlZSwgeW91IHJlbW92ZSBvbmUKKyAgICBvZiB0aGVtLCBhbmQgdHVybiB0aGUgb3RoZXIgaW50byBhICJzdGFnZTAiIGVudHJ5LiBSZW1vdmUgYW55CisgICAgbWF0Y2hpbmcgInN0YWdlMSIgZW50cnkgaWYgaXQgZXhpc3RzIHRvby4gIC4uIGFsbCB0aGUgbm9ybWFsCisgICAgdHJpdmlhbCBydWxlcyAuLgorCitZb3Ugd291bGQgbm9ybWFsbHkgdXNlIGBnaXQtbWVyZ2UtaW5kZXhgIHdpdGggc3VwcGxpZWQKK2BnaXQtbWVyZ2Utb25lLWZpbGVgIHRvIGRvIHRoaXMgbGFzdCBzdGVwLiAgVGhlIHNjcmlwdCB1cGRhdGVzCit0aGUgZmlsZXMgaW4gdGhlIHdvcmtpbmcgdHJlZSBhcyBpdCBtZXJnZXMgZWFjaCBwYXRoIGFuZCBhdCB0aGUKK2VuZCBvZiBhIHN1Y2Nlc3NmdWwgbWVyZ2UuCisKK1doZW4geW91IHN0YXJ0IGEgMy13YXkgbWVyZ2Ugd2l0aCBhbiBpbmRleCBmaWxlIHRoYXQgaXMgYWxyZWFkeQorcG9wdWxhdGVkLCBpdCBpcyBhc3N1bWVkIHRoYXQgaXQgcmVwcmVzZW50cyB0aGUgc3RhdGUgb2YgdGhlCitmaWxlcyBpbiB5b3VyIHdvcmsgdHJlZSwgYW5kIHlvdSBjYW4gZXZlbiBoYXZlIGZpbGVzIHdpdGgKK2NoYW5nZXMgdW5yZWNvcmRlZCBpbiB0aGUgaW5kZXggZmlsZS4gIEl0IGlzIGZ1cnRoZXIgYXNzdW1lZAordGhhdCB0aGlzIHN0YXRlIGlzICJkZXJpdmVkIiBmcm9tIHRoZSBzdGFnZSAyIHRyZWUuICBUaGUgMy13YXkKK21lcmdlIHJlZnVzZXMgdG8gcnVuIGlmIGl0IGZpbmRzIGFuIGVudHJ5IGluIHRoZSBvcmlnaW5hbCBpbmRleAorZmlsZSB0aGF0IGRvZXMgbm90IG1hdGNoIHN0YWdlIDIuCisKK1RoaXMgaXMgZG9uZSB0byBwcmV2ZW50IHlvdSBmcm9tIGxvc2luZyB5b3VyIHdvcmstaW4tcHJvZ3Jlc3MKK2NoYW5nZXMsIGFuZCBtaXhpbmcgeW91ciByYW5kb20gY2hhbmdlcyBpbiBhbiB1bnJlbGF0ZWQgbWVyZ2UKK2NvbW1pdC4gIFRvIGlsbHVzdHJhdGUsIHN1cHBvc2UgeW91IHN0YXJ0IGZyb20gd2hhdCBoYXMgYmVlbgorY29tbWl0dGVkIGxhc3QgdG8geW91ciByZXBvc2l0b3J5OgorCistLS0tLS0tLS0tLS0tLS0tCiskIEpDPWBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICJIRUFEXjAiYAorJCBnaXQtY2hlY2tvdXQtaW5kZXggLWYgLXUgLWEgJEpDCistLS0tLS0tLS0tLS0tLS0tCisKK1lvdSBkbyByYW5kb20gZWRpdHMsIHdpdGhvdXQgcnVubmluZyBnaXQtdXBkYXRlLWluZGV4LiAgQW5kIHRoZW4KK3lvdSBub3RpY2UgdGhhdCB0aGUgdGlwIG9mIHlvdXIgInVwc3RyZWFtIiB0cmVlIGhhcyBhZHZhbmNlZAorc2luY2UgeW91IHB1bGxlZCBmcm9tIGhpbToKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtZmV0Y2ggZ2l0Oi8vLi4uLiBsaW51cworJCBMVD1gY2F0IC5naXQvRkVUQ0hfSEVBRGAKKy0tLS0tLS0tLS0tLS0tLS0KKworWW91ciB3b3JrIHRyZWUgaXMgc3RpbGwgYmFzZWQgb24geW91ciBIRUFEICgkSkMpLCBidXQgeW91IGhhdmUKK3NvbWUgZWRpdHMgc2luY2UuICBUaHJlZS13YXkgbWVyZ2UgbWFrZXMgc3VyZSB0aGF0IHlvdSBoYXZlIG5vdAorYWRkZWQgb3IgbW9kaWZpZWQgaW5kZXggZW50cmllcyBzaW5jZSAkSkMsIGFuZCBpZiB5b3UgaGF2ZW4ndCwKK3RoZW4gZG9lcyB0aGUgcmlnaHQgdGhpbmcuICBTbyB3aXRoIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2U6CisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LXJlYWQtdHJlZSAtbSAtdSBgZ2l0LW1lcmdlLWJhc2UgJEpDICRMVGAgJEpDICRMVAorJCBnaXQtbWVyZ2UtaW5kZXggZ2l0LW1lcmdlLW9uZS1maWxlIC1hCiskIGVjaG8gIk1lcmdlIHdpdGggTGludXMiIHwgXAorICBnaXQtY29tbWl0LXRyZWUgYGdpdC13cml0ZS10cmVlYCAtcCAkSkMgLXAgJExUCistLS0tLS0tLS0tLS0tLS0tCisKK3doYXQgeW91IHdvdWxkIGNvbW1pdCBpcyBhIHB1cmUgbWVyZ2UgYmV0d2VlbiAkSkMgYW5kICRMVCB3aXRob3V0Cit5b3VyIHdvcmstaW4tcHJvZ3Jlc3MgY2hhbmdlcywgYW5kIHlvdXIgd29yayB0cmVlIHdvdWxkIGJlCit1cGRhdGVkIHRvIHRoZSByZXN1bHQgb2YgdGhlIG1lcmdlLgorCitIb3dldmVyLCBpZiB5b3UgaGF2ZSBsb2NhbCBjaGFuZ2VzIGluIHRoZSB3b3JraW5nIHRyZWUgdGhhdAord291bGQgYmUgb3ZlcndyaXR0ZW4gYnkgdGhpcyBtZXJnZSxgZ2l0LXJlYWQtdHJlZWAgd2lsbCByZWZ1c2UKK3RvIHJ1biB0byBwcmV2ZW50IHlvdXIgY2hhbmdlcyBmcm9tIGJlaW5nIGxvc3QuCisKK0luIG90aGVyIHdvcmRzLCB0aGVyZSBpcyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHdoYXQgZXhpc3RzIG9ubHkKK2luIHRoZSB3b3JraW5nIHRyZWUuICBXaGVuIHlvdSBoYXZlIGxvY2FsIGNoYW5nZXMgaW4gYSBwYXJ0IG9mCit0aGUgcHJvamVjdCB0aGF0IGlzIG5vdCBpbnZvbHZlZCBpbiB0aGUgbWVyZ2UsIHlvdXIgY2hhbmdlcyBkbworbm90IGludGVyZmVyZSB3aXRoIHRoZSBtZXJnZSwgYW5kIGFyZSBrZXB0IGludGFjdC4gIFdoZW4gdGhleQorKmRvKiBpbnRlcmZlcmUsIHRoZSBtZXJnZSBkb2VzIG5vdCBldmVuIHN0YXJ0IChgZ2l0LXJlYWQtdHJlZWAKK2NvbXBsYWlucyBsb3VkbHkgYW5kIGZhaWxzIHdpdGhvdXQgbW9kaWZ5aW5nIGFueXRoaW5nKS4gIEluIHN1Y2gKK2EgY2FzZSwgeW91IGNhbiBzaW1wbHkgY29udGludWUgZG9pbmcgd2hhdCB5b3Ugd2VyZSBpbiB0aGUKK21pZGRsZSBvZiBkb2luZywgYW5kIHdoZW4geW91ciB3b3JraW5nIHRyZWUgaXMgcmVhZHkgKGkuZS4geW91CitoYXZlIGZpbmlzaGVkIHlvdXIgd29yay1pbi1wcm9ncmVzcyksIGF0dGVtcHQgdGhlIG1lcmdlIGFnYWluLgorCisKK1NlZSBBbHNvCistLS0tLS0tLQorbGlua2dpdDpnaXQtd3JpdGUtdHJlZVsxXTsgbGlua2dpdDpnaXQtbHMtZmlsZXNbMV07CitsaW5rZ2l0OmdpdGlnbm9yZVs1XQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcmViYXNlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXJlYmFzZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA0MTJlMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXJlYmFzZS50eHQKQEAgLTAsMCArMSw0MDQgQEAKK2dpdC1yZWJhc2UoMSkKKz09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXJlYmFzZSAtIEZvcndhcmQtcG9ydCBsb2NhbCBjb21taXRzIHRvIHRoZSB1cGRhdGVkIHVwc3RyZWFtIGhlYWQKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LXJlYmFzZScgWy1pIHwgLS1pbnRlcmFjdGl2ZV0gWy12IHwgLS12ZXJib3NlXSBbLW0gfCAtLW1lcmdlXQorCVstcyA8c3RyYXRlZ3k+IHwgLS1zdHJhdGVneT08c3RyYXRlZ3k+XQorCVstQzxuPl0gWyAtLXdoaXRlc3BhY2U9PG9wdGlvbj5dIFstcCB8IC0tcHJlc2VydmUtbWVyZ2VzXQorCVstLW9udG8gPG5ld2Jhc2U+XSA8dXBzdHJlYW0+IFs8YnJhbmNoPl0KKydnaXQtcmViYXNlJyAtLWNvbnRpbnVlIHwgLS1za2lwIHwgLS1hYm9ydAorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0lmIDxicmFuY2g+IGlzIHNwZWNpZmllZCwgZ2l0LXJlYmFzZSB3aWxsIHBlcmZvcm0gYW4gYXV0b21hdGljCitgZ2l0IGNoZWNrb3V0IDxicmFuY2g+YCBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIE90aGVyd2lzZQoraXQgcmVtYWlucyBvbiB0aGUgY3VycmVudCBicmFuY2guCisKK0FsbCBjaGFuZ2VzIG1hZGUgYnkgY29tbWl0cyBpbiB0aGUgY3VycmVudCBicmFuY2ggYnV0IHRoYXQgYXJlIG5vdAoraW4gPHVwc3RyZWFtPiBhcmUgc2F2ZWQgdG8gYSB0ZW1wb3JhcnkgYXJlYS4gIFRoaXMgaXMgdGhlIHNhbWUgc2V0CitvZiBjb21taXRzIHRoYXQgd291bGQgYmUgc2hvd24gYnkgYGdpdCBsb2cgPHVwc3RyZWFtPi4uSEVBRGAuCisKK1RoZSBjdXJyZW50IGJyYW5jaCBpcyByZXNldCB0byA8dXBzdHJlYW0+LCBvciA8bmV3YmFzZT4gaWYgdGhlCistLW9udG8gb3B0aW9uIHdhcyBzdXBwbGllZC4gIFRoaXMgaGFzIHRoZSBleGFjdCBzYW1lIGVmZmVjdCBhcworYGdpdCByZXNldCAtLWhhcmQgPHVwc3RyZWFtPmAgKG9yIDxuZXdiYXNlPikuCisKK1RoZSBjb21taXRzIHRoYXQgd2VyZSBwcmV2aW91c2x5IHNhdmVkIGludG8gdGhlIHRlbXBvcmFyeSBhcmVhIGFyZQordGhlbiByZWFwcGxpZWQgdG8gdGhlIGN1cnJlbnQgYnJhbmNoLCBvbmUgYnkgb25lLCBpbiBvcmRlci4gTm90ZSB0aGF0CithbnkgY29tbWl0cyBpbiBIRUFEIHdoaWNoIGludHJvZHVjZSB0aGUgc2FtZSB0ZXh0dWFsIGNoYW5nZXMgYXMgYSBjb21taXQKK2luIEhFQUQuLjx1cHN0cmVhbT4gYXJlIG9taXR0ZWQgKGkuZS4sIGEgcGF0Y2ggYWxyZWFkeSBhY2NlcHRlZCB1cHN0cmVhbQord2l0aCBhIGRpZmZlcmVudCBjb21taXQgbWVzc2FnZSBvciB0aW1lc3RhbXAgd2lsbCBiZSBza2lwcGVkKS4KKworSXQgaXMgcG9zc2libGUgdGhhdCBhIG1lcmdlIGZhaWx1cmUgd2lsbCBwcmV2ZW50IHRoaXMgcHJvY2VzcyBmcm9tIGJlaW5nCitjb21wbGV0ZWx5IGF1dG9tYXRpYy4gIFlvdSB3aWxsIGhhdmUgdG8gcmVzb2x2ZSBhbnkgc3VjaCBtZXJnZSBmYWlsdXJlCithbmQgcnVuIGBnaXQgcmViYXNlIC0tY29udGludWVgLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gYnlwYXNzIHRoZSBjb21taXQKK3RoYXQgY2F1c2VkIHRoZSBtZXJnZSBmYWlsdXJlIHdpdGggYGdpdCByZWJhc2UgLS1za2lwYC4gIFRvIHJlc3RvcmUgdGhlCitvcmlnaW5hbCA8YnJhbmNoPiBhbmQgcmVtb3ZlIHRoZSAuZG90ZXN0IHdvcmtpbmcgZmlsZXMsIHVzZSB0aGUgY29tbWFuZAorYGdpdCByZWJhc2UgLS1hYm9ydGAgaW5zdGVhZC4KKworQXNzdW1lIHRoZSBmb2xsb3dpbmcgaGlzdG9yeSBleGlzdHMgYW5kIHRoZSBjdXJyZW50IGJyYW5jaCBpcyAidG9waWMiOgorCistLS0tLS0tLS0tLS0KKyAgICAgICAgICBBLS0tQi0tLUMgdG9waWMKKyAgICAgICAgIC8KKyAgICBELS0tRS0tLUYtLS1HIG1hc3RlcgorLS0tLS0tLS0tLS0tCisKK0Zyb20gdGhpcyBwb2ludCwgdGhlIHJlc3VsdCBvZiBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKKworCisgICAgZ2l0LXJlYmFzZSBtYXN0ZXIKKyAgICBnaXQtcmViYXNlIG1hc3RlciB0b3BpYworCit3b3VsZCBiZToKKworLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICBBJy0tQictLUMnIHRvcGljCisgICAgICAgICAgICAgICAgIC8KKyAgICBELS0tRS0tLUYtLS1HIG1hc3RlcgorLS0tLS0tLS0tLS0tCisKK1RoZSBsYXR0ZXIgZm9ybSBpcyBqdXN0IGEgc2hvcnQtaGFuZCBvZiBgZ2l0IGNoZWNrb3V0IHRvcGljYAorZm9sbG93ZWQgYnkgYGdpdCByZWJhc2UgbWFzdGVyYC4KKworSWYgdGhlIHVwc3RyZWFtIGJyYW5jaCBhbHJlYWR5IGNvbnRhaW5zIGEgY2hhbmdlIHlvdSBoYXZlIG1hZGUgKGUuZy4sCitiZWNhdXNlIHlvdSBtYWlsZWQgYSBwYXRjaCB3aGljaCB3YXMgYXBwbGllZCB1cHN0cmVhbSksIHRoZW4gdGhhdCBjb21taXQKK3dpbGwgYmUgc2tpcHBlZC4gRm9yIGV4YW1wbGUsIHJ1bm5pbmcgYGdpdC1yZWJhc2UgbWFzdGVyYCBvbiB0aGUKK2ZvbGxvd2luZyBoaXN0b3J5IChpbiB3aGljaCBBJyBhbmQgQSBpbnRyb2R1Y2UgdGhlIHNhbWUgc2V0IG9mIGNoYW5nZXMsCitidXQgaGF2ZSBkaWZmZXJlbnQgY29tbWl0dGVyIGluZm9ybWF0aW9uKToKKworLS0tLS0tLS0tLS0tCisgICAgICAgICAgQS0tLUItLS1DIHRvcGljCisgICAgICAgICAvCisgICAgRC0tLUUtLS1BJy0tLUYgbWFzdGVyCistLS0tLS0tLS0tLS0KKword2lsbCByZXN1bHQgaW46CisKKy0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgIEInLS0tQycgdG9waWMKKyAgICAgICAgICAgICAgICAgIC8KKyAgICBELS0tRS0tLUEnLS0tRiBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCitIZXJlIGlzIGhvdyB5b3Ugd291bGQgdHJhbnNwbGFudCBhIHRvcGljIGJyYW5jaCBiYXNlZCBvbiBvbmUKK2JyYW5jaCB0byBhbm90aGVyLCB0byBwcmV0ZW5kIHRoYXQgeW91IGZvcmtlZCB0aGUgdG9waWMgYnJhbmNoCitmcm9tIHRoZSBsYXR0ZXIgYnJhbmNoLCB1c2luZyBgcmViYXNlIC0tb250b2AuCisKK0ZpcnN0IGxldCdzIGFzc3VtZSB5b3VyICd0b3BpYycgaXMgYmFzZWQgb24gYnJhbmNoICduZXh0Jy4KK0ZvciBleGFtcGxlIGZlYXR1cmUgZGV2ZWxvcGVkIGluICd0b3BpYycgZGVwZW5kcyBvbiBzb21lCitmdW5jdGlvbmFsaXR5IHdoaWNoIGlzIGZvdW5kIGluICduZXh0Jy4KKworLS0tLS0tLS0tLS0tCisgICAgby0tLW8tLS1vLS0tby0tLW8gIG1hc3RlcgorICAgICAgICAgXAorICAgICAgICAgIG8tLS1vLS0tby0tLW8tLS1vICBuZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgby0tLW8tLS1vICB0b3BpYworLS0tLS0tLS0tLS0tCisKK1dlIHdvdWxkIHdhbnQgdG8gbWFrZSAndG9waWMnIGZvcmtlZCBmcm9tIGJyYW5jaCAnbWFzdGVyJywKK2ZvciBleGFtcGxlIGJlY2F1c2UgdGhlIGZ1bmN0aW9uYWxpdHkgJ3RvcGljJyBicmFuY2ggZGVwZW5kIG9uCitnb3QgbWVyZ2VkIGludG8gbW9yZSBzdGFibGUgJ21hc3RlcicgYnJhbmNoLCBsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLQorICAgIG8tLS1vLS0tby0tLW8tLS1vICBtYXN0ZXIKKyAgICAgICAgfCAgICAgICAgICAgIFwKKyAgICAgICAgfCAgICAgICAgICAgICBvJy0tbyctLW8nICB0b3BpYworICAgICAgICAgXAorICAgICAgICAgIG8tLS1vLS0tby0tLW8tLS1vICBuZXh0CistLS0tLS0tLS0tLS0KKworV2UgY2FuIGdldCB0aGlzIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKworICAgIGdpdC1yZWJhc2UgLS1vbnRvIG1hc3RlciBuZXh0IHRvcGljCisKKworQW5vdGhlciBleGFtcGxlIG9mIC0tb250byBvcHRpb24gaXMgdG8gcmViYXNlIHBhcnQgb2YgYQorYnJhbmNoLiAgSWYgd2UgaGF2ZSB0aGUgZm9sbG93aW5nIHNpdHVhdGlvbjoKKworLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSC0tLUktLS1KIHRvcGljQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLworICAgICAgICAgICAgICAgICAgRS0tLUYtLS1HICB0b3BpY0EKKyAgICAgICAgICAgICAgICAgLworICAgIEEtLS1CLS0tQy0tLUQgIG1hc3RlcgorLS0tLS0tLS0tLS0tCisKK3RoZW4gdGhlIGNvbW1hbmQKKworICAgIGdpdC1yZWJhc2UgLS1vbnRvIG1hc3RlciB0b3BpY0EgdG9waWNCCisKK3dvdWxkIHJlc3VsdCBpbjoKKworLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgIEgnLS1JJy0tSicgIHRvcGljQgorICAgICAgICAgICAgICAgIC8KKyAgICAgICAgICAgICAgICB8IEUtLS1GLS0tRyAgdG9waWNBCisgICAgICAgICAgICAgICAgfC8KKyAgICBBLS0tQi0tLUMtLS1EICBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCitUaGlzIGlzIHVzZWZ1bCB3aGVuIHRvcGljQiBkb2VzIG5vdCBkZXBlbmQgb24gdG9waWNBLgorCitBIHJhbmdlIG9mIGNvbW1pdHMgY291bGQgYWxzbyBiZSByZW1vdmVkIHdpdGggcmViYXNlLiAgSWYgd2UgaGF2ZQordGhlIGZvbGxvd2luZyBzaXR1YXRpb246CisKKy0tLS0tLS0tLS0tLQorICAgIEUtLS1GLS0tRy0tLUgtLS1JLS0tSiAgdG9waWNBCistLS0tLS0tLS0tLS0KKwordGhlbiB0aGUgY29tbWFuZAorCisgICAgZ2l0LXJlYmFzZSAtLW9udG8gdG9waWNBfjUgdG9waWNBfjMgdG9waWNBCisKK3dvdWxkIHJlc3VsdCBpbiB0aGUgcmVtb3ZhbCBvZiBjb21taXRzIEYgYW5kIEc6CisKKy0tLS0tLS0tLS0tLQorICAgIEUtLS1IJy0tLUknLS0tSicgIHRvcGljQQorLS0tLS0tLS0tLS0tCisKK1RoaXMgaXMgdXNlZnVsIGlmIEYgYW5kIEcgd2VyZSBmbGF3ZWQgaW4gc29tZSB3YXksIG9yIHNob3VsZCBub3QgYmUKK3BhcnQgb2YgdG9waWNBLiAgTm90ZSB0aGF0IHRoZSBhcmd1bWVudCB0byAtLW9udG8gYW5kIHRoZSA8dXBzdHJlYW0+CitwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWxpZCBjb21taXQtaXNoLgorCitJbiBjYXNlIG9mIGNvbmZsaWN0LCBnaXQtcmViYXNlIHdpbGwgc3RvcCBhdCB0aGUgZmlyc3QgcHJvYmxlbWF0aWMgY29tbWl0CithbmQgbGVhdmUgY29uZmxpY3QgbWFya2VycyBpbiB0aGUgdHJlZS4gIFlvdSBjYW4gdXNlIGdpdCBkaWZmIHRvIGxvY2F0ZQordGhlIG1hcmtlcnMgKDw8PDw8PCkgYW5kIG1ha2UgZWRpdHMgdG8gcmVzb2x2ZSB0aGUgY29uZmxpY3QuICBGb3IgZWFjaAorZmlsZSB5b3UgZWRpdCwgeW91IG5lZWQgdG8gdGVsbCBnaXQgdGhhdCB0aGUgY29uZmxpY3QgaGFzIGJlZW4gcmVzb2x2ZWQsCit0eXBpY2FsbHkgdGhpcyB3b3VsZCBiZSBkb25lIHdpdGgKKworCisgICAgZ2l0IGFkZCA8ZmlsZW5hbWU+CisKKworQWZ0ZXIgcmVzb2x2aW5nIHRoZSBjb25mbGljdCBtYW51YWxseSBhbmQgdXBkYXRpbmcgdGhlIGluZGV4IHdpdGggdGhlCitkZXNpcmVkIHJlc29sdXRpb24sIHlvdSBjYW4gY29udGludWUgdGhlIHJlYmFzaW5nIHByb2Nlc3Mgd2l0aAorCisKKyAgICBnaXQgcmViYXNlIC0tY29udGludWUKKworCitBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVuZG8gdGhlIGdpdC1yZWJhc2Ugd2l0aAorCisKKyAgICBnaXQgcmViYXNlIC0tYWJvcnQKKworT1BUSU9OUworLS0tLS0tLQorPG5ld2Jhc2U+OjoKKwlTdGFydGluZyBwb2ludCBhdCB3aGljaCB0byBjcmVhdGUgdGhlIG5ldyBjb21taXRzLiBJZiB0aGUKKwktLW9udG8gb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBzdGFydGluZyBwb2ludCBpcworCTx1cHN0cmVhbT4uICBNYXkgYmUgYW55IHZhbGlkIGNvbW1pdCwgYW5kIG5vdCBqdXN0IGFuCisJZXhpc3RpbmcgYnJhbmNoIG5hbWUuCisKKzx1cHN0cmVhbT46OgorCVVwc3RyZWFtIGJyYW5jaCB0byBjb21wYXJlIGFnYWluc3QuICBNYXkgYmUgYW55IHZhbGlkIGNvbW1pdCwKKwlub3QganVzdCBhbiBleGlzdGluZyBicmFuY2ggbmFtZS4KKworPGJyYW5jaD46OgorCVdvcmtpbmcgYnJhbmNoOyBkZWZhdWx0cyB0byBIRUFELgorCistLWNvbnRpbnVlOjoKKwlSZXN0YXJ0IHRoZSByZWJhc2luZyBwcm9jZXNzIGFmdGVyIGhhdmluZyByZXNvbHZlZCBhIG1lcmdlIGNvbmZsaWN0LgorCistLWFib3J0OjoKKwlSZXN0b3JlIHRoZSBvcmlnaW5hbCBicmFuY2ggYW5kIGFib3J0IHRoZSByZWJhc2Ugb3BlcmF0aW9uLgorCistLXNraXA6OgorCVJlc3RhcnQgdGhlIHJlYmFzaW5nIHByb2Nlc3MgYnkgc2tpcHBpbmcgdGhlIGN1cnJlbnQgcGF0Y2guCisKKy1tLCBcLS1tZXJnZTo6CisJVXNlIG1lcmdpbmcgc3RyYXRlZ2llcyB0byByZWJhc2UuICBXaGVuIHRoZSByZWN1cnNpdmUgKGRlZmF1bHQpIG1lcmdlCisJc3RyYXRlZ3kgaXMgdXNlZCwgdGhpcyBhbGxvd3MgcmViYXNlIHRvIGJlIGF3YXJlIG9mIHJlbmFtZXMgb24gdGhlCisJdXBzdHJlYW0gc2lkZS4KKworLXMgPHN0cmF0ZWd5PiwgXC0tc3RyYXRlZ3k9PHN0cmF0ZWd5Pjo6CisJVXNlIHRoZSBnaXZlbiBtZXJnZSBzdHJhdGVneTsgY2FuIGJlIHN1cHBsaWVkIG1vcmUgdGhhbgorCW9uY2UgdG8gc3BlY2lmeSB0aGVtIGluIHRoZSBvcmRlciB0aGV5IHNob3VsZCBiZSB0cmllZC4KKwlJZiB0aGVyZSBpcyBubyBgLXNgIG9wdGlvbiwgYSBidWlsdC1pbiBsaXN0IG9mIHN0cmF0ZWdpZXMKKwlpcyB1c2VkIGluc3RlYWQgKGBnaXQtbWVyZ2UtcmVjdXJzaXZlYCB3aGVuIG1lcmdpbmcgYSBzaW5nbGUKKwloZWFkLCBgZ2l0LW1lcmdlLW9jdG9wdXNgIG90aGVyd2lzZSkuICBUaGlzIGltcGxpZXMgLS1tZXJnZS4KKworLXYsIFwtLXZlcmJvc2U6OgorCURpc3BsYXkgYSBkaWZmc3RhdCBvZiB3aGF0IGNoYW5nZWQgdXBzdHJlYW0gc2luY2UgdGhlIGxhc3QgcmViYXNlLgorCistQzxuPjo6CisJRW5zdXJlIGF0IGxlYXN0IDxuPiBsaW5lcyBvZiBzdXJyb3VuZGluZyBjb250ZXh0IG1hdGNoIGJlZm9yZQorCWFuZCBhZnRlciBlYWNoIGNoYW5nZS4gIFdoZW4gZmV3ZXIgbGluZXMgb2Ygc3Vycm91bmRpbmcKKwljb250ZXh0IGV4aXN0IHRoZXkgYWxsIG11c3QgbWF0Y2guICBCeSBkZWZhdWx0IG5vIGNvbnRleHQgaXMKKwlldmVyIGlnbm9yZWQuCisKKy0td2hpdGVzcGFjZT08bm93YXJufHdhcm58ZXJyb3J8ZXJyb3ItYWxsfHN0cmlwPjo6CisJVGhpcyBmbGFnIGlzIHBhc3NlZCB0byB0aGUgYGdpdC1hcHBseWAgcHJvZ3JhbQorCShzZWUgbGlua2dpdDpnaXQtYXBwbHlbMV0pIHRoYXQgYXBwbGllcyB0aGUgcGF0Y2guCisKKy1pLCBcLS1pbnRlcmFjdGl2ZTo6CisJTWFrZSBhIGxpc3Qgb2YgdGhlIGNvbW1pdHMgd2hpY2ggYXJlIGFib3V0IHRvIGJlIHJlYmFzZWQuICBMZXQgdGhlCisJdXNlciBlZGl0IHRoYXQgbGlzdCBiZWZvcmUgcmViYXNpbmcuICBUaGlzIG1vZGUgY2FuIGFsc28gYmUgdXNlZCB0bworCXNwbGl0IGNvbW1pdHMgKHNlZSBTUExJVFRJTkcgQ09NTUlUUyBiZWxvdykuCisKKy1wLCBcLS1wcmVzZXJ2ZS1tZXJnZXM6OgorCUluc3RlYWQgb2YgaWdub3JpbmcgbWVyZ2VzLCB0cnkgdG8gcmVjcmVhdGUgdGhlbS4gIFRoaXMgb3B0aW9uCisJb25seSB3b3JrcyBpbiBpbnRlcmFjdGl2ZSBtb2RlLgorCitpbmNsdWRlOjptZXJnZS1zdHJhdGVnaWVzLnR4dFtdCisKK05PVEVTCistLS0tLQorV2hlbiB5b3UgcmViYXNlIGEgYnJhbmNoLCB5b3UgYXJlIGNoYW5naW5nIGl0cyBoaXN0b3J5IGluIGEgd2F5IHRoYXQKK3dpbGwgY2F1c2UgcHJvYmxlbXMgZm9yIGFueW9uZSB3aG8gYWxyZWFkeSBoYXMgYSBjb3B5IG9mIHRoZSBicmFuY2gKK2luIHRoZWlyIHJlcG9zaXRvcnkgYW5kIHRyaWVzIHRvIHB1bGwgdXBkYXRlcyBmcm9tIHlvdS4gIFlvdSBzaG91bGQKK3VuZGVyc3RhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiB1c2luZyAnZ2l0IHJlYmFzZScgb24gYSByZXBvc2l0b3J5IHRoYXQKK3lvdSBzaGFyZS4KKworV2hlbiB0aGUgZ2l0IHJlYmFzZSBjb21tYW5kIGlzIHJ1biwgaXQgd2lsbCBmaXJzdCBleGVjdXRlIGEgInByZS1yZWJhc2UiCitob29rIGlmIG9uZSBleGlzdHMuICBZb3UgY2FuIHVzZSB0aGlzIGhvb2sgdG8gZG8gc2FuaXR5IGNoZWNrcyBhbmQKK3JlamVjdCB0aGUgcmViYXNlIGlmIGl0IGlzbid0IGFwcHJvcHJpYXRlLiAgUGxlYXNlIHNlZSB0aGUgdGVtcGxhdGUKK3ByZS1yZWJhc2UgaG9vayBzY3JpcHQgZm9yIGFuIGV4YW1wbGUuCisKK1Vwb24gY29tcGxldGlvbiwgPGJyYW5jaD4gd2lsbCBiZSB0aGUgY3VycmVudCBicmFuY2guCisKK0lOVEVSQUNUSVZFIE1PREUKKy0tLS0tLS0tLS0tLS0tLS0KKworUmViYXNpbmcgaW50ZXJhY3RpdmVseSBtZWFucyB0aGF0IHlvdSBoYXZlIGEgY2hhbmNlIHRvIGVkaXQgdGhlIGNvbW1pdHMKK3doaWNoIGFyZSByZWJhc2VkLiAgWW91IGNhbiByZW9yZGVyIHRoZSBjb21taXRzLCBhbmQgeW91IGNhbgorcmVtb3ZlIHRoZW0gKHdlZWRpbmcgb3V0IGJhZCBvciBvdGhlcndpc2UgdW53YW50ZWQgcGF0Y2hlcykuCisKK1RoZSBpbnRlcmFjdGl2ZSBtb2RlIGlzIG1lYW50IGZvciB0aGlzIHR5cGUgb2Ygd29ya2Zsb3c6CisKKzEuIGhhdmUgYSB3b25kZXJmdWwgaWRlYQorMi4gaGFjayBvbiB0aGUgY29kZQorMy4gcHJlcGFyZSBhIHNlcmllcyBmb3Igc3VibWlzc2lvbgorNC4gc3VibWl0CisKK3doZXJlIHBvaW50IDIuIGNvbnNpc3RzIG9mIHNldmVyYWwgaW5zdGFuY2VzIG9mCisKK2EuIHJlZ3VsYXIgdXNlCisgMS4gZmluaXNoIHNvbWV0aGluZyB3b3J0aHkgb2YgYSBjb21taXQKKyAyLiBjb21taXQKK2IuIGluZGVwZW5kZW50IGZpeHVwCisgMS4gcmVhbGl6ZSB0aGF0IHNvbWV0aGluZyBkb2VzIG5vdCB3b3JrCisgMi4gZml4IHRoYXQKKyAzLiBjb21taXQgaXQKKworU29tZXRpbWVzIHRoZSB0aGluZyBmaXhlZCBpbiBiLjIuIGNhbm5vdCBiZSBhbWVuZGVkIHRvIHRoZSBub3QtcXVpdGUKK3BlcmZlY3QgY29tbWl0IGl0IGZpeGVzLCBiZWNhdXNlIHRoYXQgY29tbWl0IGlzIGJ1cmllZCBkZWVwbHkgaW4gYQorcGF0Y2ggc2VyaWVzLiAgVGhhdCBpcyBleGFjdGx5IHdoYXQgaW50ZXJhY3RpdmUgcmViYXNlIGlzIGZvcjogdXNlIGl0CithZnRlciBwbGVudHkgb2YgImEicyBhbmQgImIicywgYnkgcmVhcnJhbmdpbmcgYW5kIGVkaXRpbmcKK2NvbW1pdHMsIGFuZCBzcXVhc2hpbmcgbXVsdGlwbGUgY29tbWl0cyBpbnRvIG9uZS4KKworU3RhcnQgaXQgd2l0aCB0aGUgbGFzdCBjb21taXQgeW91IHdhbnQgdG8gcmV0YWluIGFzLWlzOgorCisJZ2l0IHJlYmFzZSAtaSA8YWZ0ZXItdGhpcy1jb21taXQ+CisKK0FuIGVkaXRvciB3aWxsIGJlIGZpcmVkIHVwIHdpdGggYWxsIHRoZSBjb21taXRzIGluIHlvdXIgY3VycmVudCBicmFuY2gKKyhpZ25vcmluZyBtZXJnZSBjb21taXRzKSwgd2hpY2ggY29tZSBhZnRlciB0aGUgZ2l2ZW4gY29tbWl0LiAgWW91IGNhbgorcmVvcmRlciB0aGUgY29tbWl0cyBpbiB0aGlzIGxpc3QgdG8geW91ciBoZWFydCdzIGNvbnRlbnQsIGFuZCB5b3UgY2FuCityZW1vdmUgdGhlbS4gIFRoZSBsaXN0IGxvb2tzIG1vcmUgb3IgbGVzcyBsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BpY2sgZGVhZGJlZSBUaGUgb25lbGluZSBvZiB0aGlzIGNvbW1pdAorcGljayBmYTFhZmUxIFRoZSBvbmVsaW5lIG9mIHRoZSBuZXh0IGNvbW1pdAorLi4uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBvbmVsaW5lIGRlc2NyaXB0aW9ucyBhcmUgcHVyZWx5IGZvciB5b3VyIHBsZWFzdXJlOyBgZ2l0LXJlYmFzZWAgd2lsbAorbm90IGxvb2sgYXQgdGhlbSBidXQgYXQgdGhlIGNvbW1pdCBuYW1lcyAoImRlYWRiZWUiIGFuZCAiZmExYWZlMSIgaW4gdGhpcworZXhhbXBsZSksIHNvIGRvIG5vdCBkZWxldGUgb3IgZWRpdCB0aGUgbmFtZXMuCisKK0J5IHJlcGxhY2luZyB0aGUgY29tbWFuZCAicGljayIgd2l0aCB0aGUgY29tbWFuZCAiZWRpdCIsIHlvdSBjYW4gdGVsbAorYGdpdC1yZWJhc2VgIHRvIHN0b3AgYWZ0ZXIgYXBwbHlpbmcgdGhhdCBjb21taXQsIHNvIHRoYXQgeW91IGNhbiBlZGl0Cit0aGUgZmlsZXMgYW5kL29yIHRoZSBjb21taXQgbWVzc2FnZSwgYW1lbmQgdGhlIGNvbW1pdCwgYW5kIGNvbnRpbnVlCityZWJhc2luZy4KKworSWYgeW91IHdhbnQgdG8gZm9sZCB0d28gb3IgbW9yZSBjb21taXRzIGludG8gb25lLCByZXBsYWNlIHRoZSBjb21tYW5kCisicGljayIgd2l0aCAic3F1YXNoIiBmb3IgdGhlIHNlY29uZCBhbmQgc3Vic2VxdWVudCBjb21taXQuICBJZiB0aGUKK2NvbW1pdHMgaGFkIGRpZmZlcmVudCBhdXRob3JzLCBpdCB3aWxsIGF0dHJpYnV0ZSB0aGUgc3F1YXNoZWQgY29tbWl0IHRvCit0aGUgYXV0aG9yIG9mIHRoZSBmaXJzdCBjb21taXQuCisKK0luIGJvdGggY2FzZXMsIG9yIHdoZW4gYSAicGljayIgZG9lcyBub3Qgc3VjY2VlZCAoYmVjYXVzZSBvZiBtZXJnZQorZXJyb3JzKSwgdGhlIGxvb3Agd2lsbCBzdG9wIHRvIGxldCB5b3UgZml4IHRoaW5ncywgYW5kIHlvdSBjYW4gY29udGludWUKK3RoZSBsb29wIHdpdGggYGdpdCByZWJhc2UgLS1jb250aW51ZWAuCisKK0ZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byByZW9yZGVyIHRoZSBsYXN0IDUgY29tbWl0cywgc3VjaCB0aGF0IHdoYXQKK3dhcyBIRUFEfjQgYmVjb21lcyB0aGUgbmV3IEhFQUQuIFRvIGFjaGlldmUgdGhhdCwgeW91IHdvdWxkIGNhbGwKK2BnaXQtcmViYXNlYCBsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHJlYmFzZSAtaSBIRUFEfjUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQW5kIG1vdmUgdGhlIGZpcnN0IHBhdGNoIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuCisKK1lvdSBtaWdodCB3YW50IHRvIHByZXNlcnZlIG1lcmdlcywgaWYgeW91IGhhdmUgYSBoaXN0b3J5IGxpa2UgdGhpczoKKworLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgIFgKKyAgICAgICAgICAgIFwKKyAgICAgICAgIEEtLS1NLS0tQgorICAgICAgICAvCistLS1vLS0tTy0tLVAtLS1RCistLS0tLS0tLS0tLS0tLS0tLS0KKworU3VwcG9zZSB5b3Ugd2FudCB0byByZWJhc2UgdGhlIHNpZGUgYnJhbmNoIHN0YXJ0aW5nIGF0ICJBIiB0byAiUSIuIE1ha2UKK3N1cmUgdGhhdCB0aGUgY3VycmVudCBIRUFEIGlzICJCIiwgYW5kIGNhbGwKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHJlYmFzZSAtaSAtcCAtLW9udG8gUSBPCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK1NQTElUVElORyBDT01NSVRTCistLS0tLS0tLS0tLS0tLS0tLQorCitJbiBpbnRlcmFjdGl2ZSBtb2RlLCB5b3UgY2FuIG1hcmsgY29tbWl0cyB3aXRoIHRoZSBhY3Rpb24gImVkaXQiLiAgSG93ZXZlciwKK3RoaXMgZG9lcyBub3QgbmVjZXNzYXJpbHkgbWVhbiB0aGF0ICdnaXQgcmViYXNlJyBleHBlY3RzIHRoZSByZXN1bHQgb2YgdGhpcworZWRpdCB0byBiZSBleGFjdGx5IG9uZSBjb21taXQuICBJbmRlZWQsIHlvdSBjYW4gdW5kbyB0aGUgY29tbWl0LCBvciB5b3UgY2FuCithZGQgb3RoZXIgY29tbWl0cy4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gc3BsaXQgYSBjb21taXQgaW50byB0d286CisKKy0gU3RhcnQgYW4gaW50ZXJhY3RpdmUgcmViYXNlIHdpdGggJ2dpdCByZWJhc2UgLWkgPGNvbW1pdD5eJywgd2hlcmUKKyAgPGNvbW1pdD4gaXMgdGhlIGNvbW1pdCB5b3Ugd2FudCB0byBzcGxpdC4gIEluIGZhY3QsIGFueSBjb21taXQgcmFuZ2UKKyAgd2lsbCBkbywgYXMgbG9uZyBhcyBpdCBjb250YWlucyB0aGF0IGNvbW1pdC4KKworLSBNYXJrIHRoZSBjb21taXQgeW91IHdhbnQgdG8gc3BsaXQgd2l0aCB0aGUgYWN0aW9uICJlZGl0Ii4KKworLSBXaGVuIGl0IGNvbWVzIHRvIGVkaXRpbmcgdGhhdCBjb21taXQsIGV4ZWN1dGUgJ2dpdCByZXNldCBIRUFEXicuICBUaGUKKyAgZWZmZWN0IGlzIHRoYXQgdGhlIEhFQUQgaXMgcmV3b3VuZCBieSBvbmUsIGFuZCB0aGUgaW5kZXggZm9sbG93cyBzdWl0LgorICBIb3dldmVyLCB0aGUgd29ya2luZyB0cmVlIHN0YXlzIHRoZSBzYW1lLgorCistIE5vdyBhZGQgdGhlIGNoYW5nZXMgdG8gdGhlIGluZGV4IHRoYXQgeW91IHdhbnQgdG8gaGF2ZSBpbiB0aGUgZmlyc3QKKyAgY29tbWl0LiAgWW91IGNhbiB1c2UgbGlua2dpdDpnaXQtYWRkWzFdIChwb3NzaWJseSBpbnRlcmFjdGl2ZWx5KSBhbmQvb3IKKyAgbGlua2dpdDpnaXQtZ3VpWzFdIHRvIGRvIHRoYXQuCisKKy0gQ29tbWl0IHRoZSBub3ctY3VycmVudCBpbmRleCB3aXRoIHdoYXRldmVyIGNvbW1pdCBtZXNzYWdlIGlzIGFwcHJvcHJpYXRlCisgIG5vdy4KKworLSBSZXBlYXQgdGhlIGxhc3QgdHdvIHN0ZXBzIHVudGlsIHlvdXIgd29ya2luZyB0cmVlIGlzIGNsZWFuLgorCistIENvbnRpbnVlIHRoZSByZWJhc2Ugd2l0aCAnZ2l0IHJlYmFzZSAtLWNvbnRpbnVlJy4KKworSWYgeW91IGFyZSBub3QgYWJzb2x1dGVseSBzdXJlIHRoYXQgdGhlIGludGVybWVkaWF0ZSByZXZpc2lvbnMgYXJlCitjb25zaXN0ZW50ICh0aGV5IGNvbXBpbGUsIHBhc3MgdGhlIHRlc3RzdWl0ZSwgZXRjLikgeW91IHNob3VsZCB1c2UKK2xpbmtnaXQ6Z2l0LXN0YXNoWzFdIHRvIHN0YXNoIGF3YXkgdGhlIG5vdC15ZXQtY29tbWl0dGVkIGNoYW5nZXMKK2FmdGVyIGVhY2ggY29tbWl0LCB0ZXN0LCBhbmQgYW1lbmQgdGhlIGNvbW1pdCBpZiBmaXhlcyBhcmUgbmVjZXNzYXJ5LgorCisKK0F1dGhvcnMKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+IGFuZAorSm9oYW5uZXMgRS4gU2NoaW5kZWxpbiA8am9oYW5uZXMuc2NoaW5kZWxpbkBnbXguZGU+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJlY2VpdmUtcGFjay50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZWNlaXZlLXBhY2sudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMTE0MzQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZWNlaXZlLXBhY2sudHh0CkBAIC0wLDAgKzEsMTY1IEBACitnaXQtcmVjZWl2ZS1wYWNrKDEpCis9PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1yZWNlaXZlLXBhY2sgLSBSZWNlaXZlIHdoYXQgaXMgcHVzaGVkIGludG8gdGhlIHJlcG9zaXRvcnkKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcmVjZWl2ZS1wYWNrJyA8ZGlyZWN0b3J5PgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0ludm9rZWQgYnkgJ2dpdC1zZW5kLXBhY2snIGFuZCB1cGRhdGVzIHRoZSByZXBvc2l0b3J5IHdpdGggdGhlCitpbmZvcm1hdGlvbiBmZWQgZnJvbSB0aGUgcmVtb3RlIGVuZC4KKworVGhpcyBjb21tYW5kIGlzIHVzdWFsbHkgbm90IGludm9rZWQgZGlyZWN0bHkgYnkgdGhlIGVuZCB1c2VyLgorVGhlIFVJIGZvciB0aGUgcHJvdG9jb2wgaXMgb24gdGhlICdnaXQtc2VuZC1wYWNrJyBzaWRlLCBhbmQgdGhlCitwcm9ncmFtIHBhaXIgaXMgbWVhbnQgdG8gYmUgdXNlZCB0byBwdXNoIHVwZGF0ZXMgdG8gcmVtb3RlCityZXBvc2l0b3J5LiAgRm9yIHB1bGwgb3BlcmF0aW9ucywgc2VlICdnaXQtZmV0Y2gtcGFjaycuCisKK1RoZSBjb21tYW5kIGFsbG93cyBmb3IgY3JlYXRpb24gYW5kIGZhc3QgZm9yd2FyZGluZyBvZiBzaGExIHJlZnMKKyhoZWFkcy90YWdzKSBvbiB0aGUgcmVtb3RlIGVuZCAoc3RyaWN0bHkgc3BlYWtpbmcsIGl0IGlzIHRoZQorbG9jYWwgZW5kIHJlY2VpdmUtcGFjayBydW5zLCBidXQgdG8gdGhlIHVzZXIgd2hvIGlzIHNpdHRpbmcgYXQKK3RoZSBzZW5kLXBhY2sgZW5kLCBpdCBpcyB1cGRhdGluZyB0aGUgcmVtb3RlLiAgQ29uZnVzZWQ/KQorCitUaGVyZSBhcmUgb3RoZXIgcmVhbC13b3JsZCBleGFtcGxlcyBvZiB1c2luZyB1cGRhdGUgYW5kCitwb3N0LXVwZGF0ZSBob29rcyBmb3VuZCBpbiB0aGUgRG9jdW1lbnRhdGlvbi9ob3d0byBkaXJlY3RvcnkuCisKK2dpdC1yZWNlaXZlLXBhY2sgaG9ub3VycyB0aGUgcmVjZWl2ZS5kZW55Tm9uRmFzdEZvcndhcmRzIGNvbmZpZworb3B0aW9uLCB3aGljaCB0ZWxscyBpdCBpZiB1cGRhdGVzIHRvIGEgcmVmIHNob3VsZCBiZSBkZW5pZWQgaWYgdGhleQorYXJlIG5vdCBmYXN0LWZvcndhcmRzLgorCitPUFRJT05TCistLS0tLS0tCis8ZGlyZWN0b3J5Pjo6CisJVGhlIHJlcG9zaXRvcnkgdG8gc3luYyBpbnRvLgorCitwcmUtcmVjZWl2ZSBIb29rCistLS0tLS0tLS0tLS0tLS0tCitCZWZvcmUgYW55IHJlZiBpcyB1cGRhdGVkLCBpZiAkR0lUX0RJUi9ob29rcy9wcmUtcmVjZWl2ZSBmaWxlIGV4aXN0cworYW5kIGlzIGV4ZWN1dGFibGUsIGl0IHdpbGwgYmUgaW52b2tlZCBvbmNlIHdpdGggbm8gcGFyYW1ldGVycy4gIFRoZQorc3RhbmRhcmQgaW5wdXQgb2YgdGhlIGhvb2sgd2lsbCBiZSBvbmUgbGluZSBwZXIgcmVmIHRvIGJlIHVwZGF0ZWQ6CisKKyAgICAgICBzaGExLW9sZCBTUCBzaGExLW5ldyBTUCByZWZuYW1lIExGCisKK1RoZSByZWZuYW1lIHZhbHVlIGlzIHJlbGF0aXZlIHRvICRHSVRfRElSOyBlLmcuIGZvciB0aGUgbWFzdGVyCitoZWFkIHRoaXMgaXMgInJlZnMvaGVhZHMvbWFzdGVyIi4gIFRoZSB0d28gc2hhMSB2YWx1ZXMgYmVmb3JlCitlYWNoIHJlZm5hbWUgYXJlIHRoZSBvYmplY3QgbmFtZXMgZm9yIHRoZSByZWZuYW1lIGJlZm9yZSBhbmQgYWZ0ZXIKK3RoZSB1cGRhdGUuICBSZWZzIHRvIGJlIGNyZWF0ZWQgd2lsbCBoYXZlIHNoYTEtb2xkIGVxdWFsIHRvIDBcezQwfSwKK3doaWxlIHJlZnMgdG8gYmUgZGVsZXRlZCB3aWxsIGhhdmUgc2hhMS1uZXcgZXF1YWwgdG8gMFx7NDB9LCBvdGhlcndpc2UKK3NoYTEtb2xkIGFuZCBzaGExLW5ldyBzaG91bGQgYmUgdmFsaWQgb2JqZWN0cyBpbiB0aGUgcmVwb3NpdG9yeS4KKworVGhpcyBob29rIGlzIGNhbGxlZCBiZWZvcmUgYW55IHJlZm5hbWUgaXMgdXBkYXRlZCBhbmQgYmVmb3JlIGFueQorZmFzdC1mb3J3YXJkIGNoZWNrcyBhcmUgcGVyZm9ybWVkLgorCitJZiB0aGUgcHJlLXJlY2VpdmUgaG9vayBleGl0cyB3aXRoIGEgbm9uLXplcm8gZXhpdCBzdGF0dXMgbm8gdXBkYXRlcword2lsbCBiZSBwZXJmb3JtZWQsIGFuZCB0aGUgdXBkYXRlLCBwb3N0LXJlY2VpdmUgYW5kIHBvc3QtdXBkYXRlCitob29rcyB3aWxsIG5vdCBiZSBpbnZva2VkIGVpdGhlci4gIFRoaXMgY2FuIGJlIHVzZWZ1bCB0byBxdWlja2x5CitiYWlsIG91dCBpZiB0aGUgdXBkYXRlIGlzIG5vdCB0byBiZSBzdXBwb3J0ZWQuCisKK3VwZGF0ZSBIb29rCistLS0tLS0tLS0tLQorQmVmb3JlIGVhY2ggcmVmIGlzIHVwZGF0ZWQsIGlmICRHSVRfRElSL2hvb2tzL3VwZGF0ZSBmaWxlIGV4aXN0cworYW5kIGlzIGV4ZWN1dGFibGUsIGl0IGlzIGludm9rZWQgb25jZSBwZXIgcmVmLCB3aXRoIHRocmVlIHBhcmFtZXRlcnM6CisKKyAgICAgICAkR0lUX0RJUi9ob29rcy91cGRhdGUgcmVmbmFtZSBzaGExLW9sZCBzaGExLW5ldworCitUaGUgcmVmbmFtZSBwYXJhbWV0ZXIgaXMgcmVsYXRpdmUgdG8gJEdJVF9ESVI7IGUuZy4gZm9yIHRoZSBtYXN0ZXIKK2hlYWQgdGhpcyBpcyAicmVmcy9oZWFkcy9tYXN0ZXIiLiAgVGhlIHR3byBzaGExIGFyZ3VtZW50cyBhcmUKK3RoZSBvYmplY3QgbmFtZXMgZm9yIHRoZSByZWZuYW1lIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHVwZGF0ZS4KK05vdGUgdGhhdCB0aGUgaG9vayBpcyBjYWxsZWQgYmVmb3JlIHRoZSByZWZuYW1lIGlzIHVwZGF0ZWQsCitzbyBlaXRoZXIgc2hhMS1vbGQgaXMgMFx7NDB9IChtZWFuaW5nIHRoZXJlIGlzIG5vIHN1Y2ggcmVmIHlldCksCitvciBpdCBzaG91bGQgbWF0Y2ggd2hhdCBpcyByZWNvcmRlZCBpbiByZWZuYW1lLgorCitUaGUgaG9vayBzaG91bGQgZXhpdCB3aXRoIG5vbi16ZXJvIHN0YXR1cyBpZiBpdCB3YW50cyB0byBkaXNhbGxvdwordXBkYXRpbmcgdGhlIG5hbWVkIHJlZi4gIE90aGVyd2lzZSBpdCBzaG91bGQgZXhpdCB3aXRoIHplcm8uCisKK1N1Y2Nlc3NmdWwgZXhlY3V0aW9uIChhIHplcm8gZXhpdCBzdGF0dXMpIG9mIHRoaXMgaG9vayBkb2VzIG5vdAorZW5zdXJlIHRoZSByZWYgd2lsbCBhY3R1YWxseSBiZSB1cGRhdGVkLCBpdCBpcyBvbmx5IGEgcHJlcmVxdWlzaXRlLgorQXMgc3VjaCBpdCBpcyBub3QgYSBnb29kIGlkZWEgdG8gc2VuZCBub3RpY2VzIChlLmcuIGVtYWlsKSBmcm9tCit0aGlzIGhvb2suICBDb25zaWRlciB1c2luZyB0aGUgcG9zdC1yZWNlaXZlIGhvb2sgaW5zdGVhZC4KKworcG9zdC1yZWNlaXZlIEhvb2sKKy0tLS0tLS0tLS0tLS0tLS0tCitBZnRlciBhbGwgcmVmcyB3ZXJlIHVwZGF0ZWQgKG9yIGF0dGVtcHRlZCB0byBiZSB1cGRhdGVkKSwgaWYgYW55CityZWYgdXBkYXRlIHdhcyBzdWNjZXNzZnVsLCBhbmQgaWYgJEdJVF9ESVIvaG9va3MvcG9zdC1yZWNlaXZlCitmaWxlIGV4aXN0cyBhbmQgaXMgZXhlY3V0YWJsZSwgaXQgd2lsbCBiZSBpbnZva2Ugb25jZSB3aXRoIG5vCitwYXJhbWV0ZXJzLiAgVGhlIHN0YW5kYXJkIGlucHV0IG9mIHRoZSBob29rIHdpbGwgYmUgb25lIGxpbmUKK2ZvciBlYWNoIHN1Y2Nlc3NmdWxseSB1cGRhdGVkIHJlZjoKKworICAgICAgIHNoYTEtb2xkIFNQIHNoYTEtbmV3IFNQIHJlZm5hbWUgTEYKKworVGhlIHJlZm5hbWUgdmFsdWUgaXMgcmVsYXRpdmUgdG8gJEdJVF9ESVI7IGUuZy4gZm9yIHRoZSBtYXN0ZXIKK2hlYWQgdGhpcyBpcyAicmVmcy9oZWFkcy9tYXN0ZXIiLiAgVGhlIHR3byBzaGExIHZhbHVlcyBiZWZvcmUKK2VhY2ggcmVmbmFtZSBhcmUgdGhlIG9iamVjdCBuYW1lcyBmb3IgdGhlIHJlZm5hbWUgYmVmb3JlIGFuZCBhZnRlcgordGhlIHVwZGF0ZS4gIFJlZnMgdGhhdCB3ZXJlIGNyZWF0ZWQgd2lsbCBoYXZlIHNoYTEtb2xkIGVxdWFsIHRvCiswXHs0MH0sIHdoaWxlIHJlZnMgdGhhdCB3ZXJlIGRlbGV0ZWQgd2lsbCBoYXZlIHNoYTEtbmV3IGVxdWFsIHRvCiswXHs0MH0sIG90aGVyd2lzZSBzaGExLW9sZCBhbmQgc2hhMS1uZXcgc2hvdWxkIGJlIHZhbGlkIG9iamVjdHMgaW4KK3RoZSByZXBvc2l0b3J5LgorCitVc2luZyB0aGlzIGhvb2ssIGl0IGlzIGVhc3kgdG8gZ2VuZXJhdGUgbWFpbHMgZGVzY3JpYmluZyB0aGUgdXBkYXRlcwordG8gdGhlIHJlcG9zaXRvcnkuICBUaGlzIGV4YW1wbGUgc2NyaXB0IHNlbmRzIG9uZSBtYWlsIG1lc3NhZ2UgcGVyCityZWYgbGlzdGluZyB0aGUgY29tbWl0cyBwdXNoZWQgdG8gdGhlIHJlcG9zaXRvcnk6CisKKwkjIS9iaW4vc2gKKwkjIG1haWwgb3V0IGNvbW1pdCB1cGRhdGUgaW5mb3JtYXRpb24uCisJd2hpbGUgcmVhZCBvdmFsIG52YWwgcmVmCisJZG8KKwkJaWYgZXhwciAiJG92YWwiIDogJzAqJCcgPi9kZXYvbnVsbAorCQl0aGVuCisJCQllY2hvICJDcmVhdGVkIGEgbmV3IHJlZiwgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1pdHM6IgorCQkJZ2l0LXJldi1saXN0IC0tcHJldHR5ICIkbnZhbCIKKwkJZWxzZQorCQkJZWNobyAiTmV3IGNvbW1pdHM6IgorCQkJZ2l0LXJldi1saXN0IC0tcHJldHR5ICIkbnZhbCIgIl4kb3ZhbCIKKwkJZmkgfAorCQltYWlsIC1zICJDaGFuZ2VzIHRvIHJlZiAkcmVmIiBjb21taXQtbGlzdEBteWRvbWFpbgorCWRvbmUKKwlleGl0IDAKKworVGhlIGV4aXQgY29kZSBmcm9tIHRoaXMgaG9vayBpbnZvY2F0aW9uIGlzIGlnbm9yZWQsIGhvd2V2ZXIgYQorbm9uLXplcm8gZXhpdCBjb2RlIHdpbGwgZ2VuZXJhdGUgYW4gZXJyb3IgbWVzc2FnZS4KKworTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciByZWZuYW1lIHRvIG5vdCBoYXZlIHNoYTEtbmV3IHdoZW4gdGhpcworaG9vayBydW5zLiAgVGhpcyBjYW4gZWFzaWx5IG9jY3VyIGlmIGFub3RoZXIgdXNlciBtb2RpZmllcyB0aGUgcmVmCithZnRlciBpdCB3YXMgdXBkYXRlZCBieSByZWNlaXZlLXBhY2ssIGJ1dCBiZWZvcmUgdGhlIGhvb2sgd2FzIGFibGUKK3RvIGV2YWx1YXRlIGl0LiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBob29rcyByZWx5IG9uIHNoYTEtbmV3CityYXRoZXIgdGhhbiB0aGUgY3VycmVudCB2YWx1ZSBvZiByZWZuYW1lLgorCitwb3N0LXVwZGF0ZSBIb29rCistLS0tLS0tLS0tLS0tLS0tCitBZnRlciBhbGwgb3RoZXIgcHJvY2Vzc2luZywgaWYgYXQgbGVhc3Qgb25lIHJlZiB3YXMgdXBkYXRlZCwgYW5kCitpZiAkR0lUX0RJUi9ob29rcy9wb3N0LXVwZGF0ZSBmaWxlIGV4aXN0cyBhbmQgaXMgZXhlY3V0YWJsZSwgdGhlbgorcG9zdC11cGRhdGUgd2lsbCBjYWxsZWQgd2l0aCB0aGUgbGlzdCBvZiByZWZzIHRoYXQgaGF2ZSBiZWVuIHVwZGF0ZWQuCitUaGlzIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBhbnkgcmVwb3NpdG9yeSB3aWRlIGNsZWFudXAgdGFza3MuCisKK1RoZSBleGl0IGNvZGUgZnJvbSB0aGlzIGhvb2sgaW52b2NhdGlvbiBpcyBpZ25vcmVkOyB0aGUgb25seSB0aGluZworbGVmdCBmb3IgZ2l0LXJlY2VpdmUtcGFjayB0byBkbyBhdCB0aGF0IHBvaW50IGlzIHRvIGV4aXQgaXRzZWxmCithbnl3YXkuCisKK1RoaXMgaG9vayBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIHJ1biAiZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mbyIKK2lmIHRoZSByZXBvc2l0b3J5IGlzIHBhY2tlZCBhbmQgaXMgc2VydmVkIHZpYSBhIGR1bWIgdHJhbnNwb3J0LgorCisJIyEvYmluL3NoCisJZXhlYyBnaXQtdXBkYXRlLXNlcnZlci1pbmZvCisKKworU0VFIEFMU08KKy0tLS0tLS0tCitsaW5rZ2l0OmdpdC1zZW5kLXBhY2tbMV0KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vLgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJlZmxvZy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZWZsb2cudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0N2UzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZWZsb2cudHh0CkBAIC0wLDAgKzEsMTA1IEBACitnaXQtcmVmbG9nKDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1yZWZsb2cgLSBNYW5hZ2UgcmVmbG9nIGluZm9ybWF0aW9uCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0IHJlZmxvZycgPHN1YmNvbW1hbmQ+IDxvcHRpb25zPgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoZSBjb21tYW5kIHRha2VzIHZhcmlvdXMgc3ViY29tbWFuZHMsIGFuZCBkaWZmZXJlbnQgb3B0aW9ucworZGVwZW5kaW5nIG9uIHRoZSBzdWJjb21tYW5kOgorCitbdmVyc2VdCitnaXQgcmVmbG9nIGV4cGlyZSBbLS1kcnktcnVuXSBbLS1zdGFsZS1maXhdIFstLXZlcmJvc2VdCisJWy0tZXhwaXJlPTx0aW1lPl0gWy0tZXhwaXJlLXVucmVhY2hhYmxlPTx0aW1lPl0gWy0tYWxsXSA8cmVmcz4uLi4KKworZ2l0IHJlZmxvZyBkZWxldGUgcmVmQFx7c3BlY2lmaWVyXH0uLi4KKworZ2l0IHJlZmxvZyBbc2hvd10gW2xvZy1vcHRpb25zXSBbPHJlZj5dCisKK1JlZmxvZyBpcyBhIG1lY2hhbmlzbSB0byByZWNvcmQgd2hlbiB0aGUgdGlwIG9mIGJyYW5jaGVzIGFyZQordXBkYXRlZC4gIFRoaXMgY29tbWFuZCBpcyB0byBtYW5hZ2UgdGhlIGluZm9ybWF0aW9uIHJlY29yZGVkIGluIGl0LgorCitUaGUgc3ViY29tbWFuZCAiZXhwaXJlIiBpcyB1c2VkIHRvIHBydW5lIG9sZGVyIHJlZmxvZyBlbnRyaWVzLgorRW50cmllcyBvbGRlciB0aGFuIGBleHBpcmVgIHRpbWUsIG9yIGVudHJpZXMgb2xkZXIgdGhhbgorYGV4cGlyZS11bnJlYWNoYWJsZWAgdGltZSBhbmQgYXJlIG5vdCByZWFjaGFibGUgZnJvbSB0aGUgY3VycmVudAordGlwLCBhcmUgcmVtb3ZlZCBmcm9tIHRoZSByZWZsb2cuICBUaGlzIGlzIHR5cGljYWxseSBub3QgdXNlZAorZGlyZWN0bHkgYnkgdGhlIGVuZCB1c2VycyAtLSBpbnN0ZWFkLCBzZWUgbGlua2dpdDpnaXQtZ2NbMV0uCisKK1RoZSBzdWJjb21tYW5kICJzaG93IiAod2hpY2ggaXMgYWxzbyB0aGUgZGVmYXVsdCwgaW4gdGhlIGFic2VuY2Ugb2YgYW55CitzdWJjb21tYW5kcykgd2lsbCB0YWtlIGFsbCB0aGUgbm9ybWFsIGxvZyBvcHRpb25zLCBhbmQgc2hvdyB0aGUgbG9nIG9mCit0aGUgcmVmZXJlbmNlIHByb3ZpZGVkIGluIHRoZSBjb21tYW5kLWxpbmUgKG9yIGBIRUFEYCwgYnkgZGVmYXVsdCkuCitUaGUgcmVmbG9nIHdpbGwgY292ZXIgYWxsIHJlY2VudCBhY3Rpb25zIChIRUFEIHJlZmxvZyByZWNvcmRzIGJyYW5jaCBzd2l0Y2hpbmcKK2FzIHdlbGwpLiAgSXQgaXMgYW4gYWxpYXMgZm9yICdnaXQgbG9nIC1nIC0tYWJicmV2LWNvbW1pdCAtLXByZXR0eT1vbmVsaW5lJzsKK3NlZSBsaW5rZ2l0OmdpdC1sb2dbMV0uCisKK1RoZSByZWZsb2cgaXMgdXNlZnVsIGluIHZhcmlvdXMgZ2l0IGNvbW1hbmRzLCB0byBzcGVjaWZ5IHRoZSBvbGQgdmFsdWUKK29mIGEgcmVmZXJlbmNlLiBGb3IgZXhhbXBsZSwgYEhFQURAXHsyXH1gIG1lYW5zICJ3aGVyZSBIRUFEIHVzZWQgdG8gYmUKK3R3byBtb3ZlcyBhZ28iLCBgbWFzdGVyQFx7b25lLndlZWsuYWdvXH1gIG1lYW5zICJ3aGVyZSBtYXN0ZXIgdXNlZCB0bworcG9pbnQgdG8gb25lIHdlZWsgYWdvIiwgYW5kIHNvIG9uLiBTZWUgbGlua2dpdDpnaXQtcmV2LXBhcnNlWzFdIGZvcgorbW9yZSBkZXRhaWxzLgorCitUbyBkZWxldGUgc2luZ2xlIGVudHJpZXMgZnJvbSB0aGUgcmVmbG9nLCB1c2UgdGhlIHN1YmNvbW1hbmQgImRlbGV0ZSIKK2FuZCBzcGVjaWZ5IHRoZSBfZXhhY3RfIGVudHJ5IChlLmcuIGBgZ2l0IHJlZmxvZyBkZWxldGUgbWFzdGVyQFx7Mlx9JycpLgorCisKK09QVElPTlMKKy0tLS0tLS0KKworLS1zdGFsZS1maXg6OgorCVRoaXMgcmV2YW1wcyB0aGUgbG9naWMgLS0gdGhlIGRlZmluaXRpb24gb2YgImJyb2tlbiBjb21taXQiCisJYmVjb21lczogYSBjb21taXQgdGhhdCBpcyBub3QgcmVhY2hhYmxlIGZyb20gYW55IG9mIHRoZSByZWZzIGFuZAorCXRoZXJlIGlzIGEgbWlzc2luZyBvYmplY3QgYW1vbmcgdGhlIGNvbW1pdCwgdHJlZSwgb3IgYmxvYgorCW9iamVjdHMgcmVhY2hhYmxlIGZyb20gaXQgdGhhdCBpcyBub3QgcmVhY2hhYmxlIGZyb20gYW55IG9mIHRoZQorCXJlZnMuCisrCitUaGlzIGNvbXB1dGF0aW9uIGludm9sdmVzIHRyYXZlcnNpbmcgYWxsIHRoZSByZWFjaGFibGUgb2JqZWN0cywgaS5lLiBpdAoraGFzIHRoZSBzYW1lIGNvc3QgYXMgJ2dpdCBwcnVuZScuICBGb3J0dW5hdGVseSwgb25jZSB0aGlzIGlzIHJ1biwgd2UKK3Nob3VsZCBub3QgaGF2ZSB0byBldmVyIHdvcnJ5IGFib3V0IG1pc3Npbmcgb2JqZWN0cywgYmVjYXVzZSB0aGUgY3VycmVudAorcHJ1bmUgYW5kIHBhY2stb2JqZWN0cyBrbm93IGFib3V0IHJlZmxvZ3MgYW5kIHByb3RlY3Qgb2JqZWN0cyByZWZlcnJlZCBieQordGhlbS4KKworLS1leHBpcmU9PHRpbWU+OjoKKwlFbnRyaWVzIG9sZGVyIHRoYW4gdGhpcyB0aW1lIGFyZSBwcnVuZWQuICBXaXRob3V0IHRoZQorCW9wdGlvbiBpdCBpcyB0YWtlbiBmcm9tIGNvbmZpZ3VyYXRpb24gYGdjLnJlZmxvZ0V4cGlyZWAsCisJd2hpY2ggaW4gdHVybiBkZWZhdWx0cyB0byA5MCBkYXlzLgorCistLWV4cGlyZS11bnJlYWNoYWJsZT08dGltZT46OgorCUVudHJpZXMgb2xkZXIgdGhhbiB0aGlzIHRpbWUgYW5kIGFyZSBub3QgcmVhY2hhYmxlIGZyb20KKwl0aGUgY3VycmVudCB0aXAgb2YgdGhlIGJyYW5jaCBhcmUgcHJ1bmVkLiAgV2l0aG91dCB0aGUKKwlvcHRpb24gaXQgaXMgdGFrZW4gZnJvbSBjb25maWd1cmF0aW9uCisJYGdjLnJlZmxvZ0V4cGlyZVVucmVhY2hhYmxlYCwgd2hpY2ggaW4gdHVybiBkZWZhdWx0cyB0bworCTMwIGRheXMuCisKKy0tYWxsOjoKKwlJbnN0ZWFkIG9mIGxpc3RpbmcgPHJlZnM+IGV4cGxpY2l0bHksIHBydW5lIGFsbCByZWZzLgorCistLXVwZGF0ZXJlZjo6CisJVXBkYXRlIHRoZSByZWYgd2l0aCB0aGUgc2hhMSBvZiB0aGUgdG9wIHJlZmxvZyBlbnRyeSAoaS5lLgorCTxyZWY+QFx7MFx9KSBhZnRlciBleHBpcmluZyBvciBkZWxldGluZy4KKworLS1yZXdyaXRlOjoKKwlXaGlsZSBleHBpcmluZyBvciBkZWxldGluZywgYWRqdXN0IGVhY2ggcmVmbG9nIGVudHJ5IHRvIGVuc3VyZQorCXRoYXQgdGhlIGBvbGRgIHNoYTEgZmllbGQgcG9pbnRzIHRvIHRoZSBgbmV3YCBzaGExIGZpZWxkIG9mIHRoZQorCXByZXZpb3VzIGVudHJ5LgorCistLXZlcmJvc2U6OgorCVByaW50IGV4dHJhIGluZm9ybWF0aW9uIG9uIHNjcmVlbi4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1yZWxpbmsudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcmVsaW5rLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjAyNGRlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcmVsaW5rLnR4dApAQCAtMCwwICsxLDM3IEBACitnaXQtcmVsaW5rKDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1yZWxpbmsgLSBIYXJkbGluayBjb21tb24gb2JqZWN0cyBpbiBsb2NhbCByZXBvc2l0b3JpZXMKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXJlbGluaycgWy0tc2FmZV0gPGRpcj4gWzxkaXI+XVwqIDxtYXN0ZXJfZGlyPgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoaXMgd2lsbCBzY2FuIDEgb3IgbW9yZSBvYmplY3QgcmVwb3NpdG9yaWVzIGFuZCBsb29rIGZvciBvYmplY3RzIGluIGNvbW1vbgord2l0aCBhIG1hc3RlciByZXBvc2l0b3J5LiBPYmplY3RzIG5vdCBhbHJlYWR5IGhhcmRsaW5rZWQgdG8gdGhlIG1hc3RlcgorcmVwb3NpdG9yeSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYSBoYXJkbGluayB0byB0aGUgbWFzdGVyIHJlcG9zaXRvcnkuCisKK09QVElPTlMKKy0tLS0tLS0KKy0tc2FmZTo6CisJU3RvcHMgaWYgdHdvIG9iamVjdHMgd2l0aCB0aGUgc2FtZSBoYXNoIGV4aXN0IGJ1dCBoYXZlIGRpZmZlcmVudCBzaXplcy4KKwlEZWZhdWx0IGlzIHRvIHdhcm4gYW5kIGNvbnRpbnVlLgorCis8ZGlyPjo6CisJRGlyZWN0b3JpZXMgY29udGFpbmluZyBhIC5naXQvb2JqZWN0cy8gc3ViZGlyZWN0b3J5LgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBSeWFuIEFuZGVyc29uIDxyeWFuQG1pY2hvbmxpbmUuY29tPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1yZW1vdGUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcmVtb3RlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2JkMWY3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcmVtb3RlLnR4dApAQCAtMCwwICsxLDE0NyBAQAorZ2l0LXJlbW90ZSgxKQorPT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1yZW1vdGUgLSBtYW5hZ2Ugc2V0IG9mIHRyYWNrZWQgcmVwb3NpdG9yaWVzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LXJlbW90ZScKKydnaXQtcmVtb3RlJyBhZGQgWy10IDxicmFuY2g+XSBbLW0gPG1hc3Rlcj5dIFstZl0gWy0tbWlycm9yXSA8bmFtZT4gPHVybD4KKydnaXQtcmVtb3RlJyBybSA8bmFtZT4KKydnaXQtcmVtb3RlJyBzaG93IDxuYW1lPgorJ2dpdC1yZW1vdGUnIHBydW5lIDxuYW1lPgorJ2dpdC1yZW1vdGUnIHVwZGF0ZSBbZ3JvdXBdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitNYW5hZ2UgdGhlIHNldCBvZiByZXBvc2l0b3JpZXMgKCJyZW1vdGVzIikgd2hvc2UgYnJhbmNoZXMgeW91IHRyYWNrLgorCisKK0NPTU1BTkRTCistLS0tLS0tLQorCitXaXRoIG5vIGFyZ3VtZW50cywgc2hvd3MgYSBsaXN0IG9mIGV4aXN0aW5nIHJlbW90ZXMuICBTZXZlcmFsCitzdWJjb21tYW5kcyBhcmUgYXZhaWxhYmxlIHRvIHBlcmZvcm0gb3BlcmF0aW9ucyBvbiB0aGUgcmVtb3Rlcy4KKworJ2FkZCc6OgorCitBZGRzIGEgcmVtb3RlIG5hbWVkIDxuYW1lPiBmb3IgdGhlIHJlcG9zaXRvcnkgYXQKKzx1cmw+LiAgVGhlIGNvbW1hbmQgYGdpdCBmZXRjaCA8bmFtZT5gIGNhbiB0aGVuIGJlIHVzZWQgdG8gY3JlYXRlIGFuZAordXBkYXRlIHJlbW90ZS10cmFja2luZyBicmFuY2hlcyA8bmFtZT4vPGJyYW5jaD4uCisrCitXaXRoIGAtZmAgb3B0aW9uLCBgZ2l0IGZldGNoIDxuYW1lPmAgaXMgcnVuIGltbWVkaWF0ZWx5IGFmdGVyCit0aGUgcmVtb3RlIGluZm9ybWF0aW9uIGlzIHNldCB1cC4KKysKK1dpdGggYC10IDxicmFuY2g+YCBvcHRpb24sIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgZ2xvYgorcmVmc3BlYyBmb3IgdGhlIHJlbW90ZSB0byB0cmFjayBhbGwgYnJhbmNoZXMgdW5kZXIKK2AkR0lUX0RJUi9yZW1vdGVzLzxuYW1lPi9gLCBhIHJlZnNwZWMgdG8gdHJhY2sgb25seSBgPGJyYW5jaD5gCitpcyBjcmVhdGVkLiAgWW91IGNhbiBnaXZlIG1vcmUgdGhhbiBvbmUgYC10IDxicmFuY2g+YCB0byB0cmFjaworbXVsdGlwbGUgYnJhbmNoZXMgd2l0aG91dCBncmFiYmluZyBhbGwgYnJhbmNoZXMuCisrCitXaXRoIGAtbSA8bWFzdGVyPmAgb3B0aW9uLCBgJEdJVF9ESVIvcmVtb3Rlcy88bmFtZT4vSEVBRGAgaXMgc2V0Cit1cCB0byBwb2ludCBhdCByZW1vdGUncyBgPG1hc3Rlcj5gIGJyYW5jaCBpbnN0ZWFkIG9mIHdoYXRldmVyCiticmFuY2ggdGhlIGBIRUFEYCBhdCB0aGUgcmVtb3RlIHJlcG9zaXRvcnkgYWN0dWFsbHkgcG9pbnRzIGF0LgorKworSW4gbWlycm9yIG1vZGUsIGVuYWJsZWQgd2l0aCBgLS1taXJyb3JgLCB0aGUgcmVmcyB3aWxsIG5vdCBiZSBzdG9yZWQKK2luIHRoZSAncmVmcy9yZW1vdGVzLycgbmFtZXNwYWNlLCBidXQgaW4gJ3JlZnMvaGVhZHMvJy4gIFRoaXMgb3B0aW9uCitvbmx5IG1ha2VzIHNlbnNlIGluIGJhcmUgcmVwb3NpdG9yaWVzLgorCisncm0nOjoKKworUmVtb3ZlIHRoZSByZW1vdGUgbmFtZWQgPG5hbWU+LiBBbGwgcmVtb3RlIHRyYWNraW5nIGJyYW5jaGVzIGFuZAorY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIHJlbW90ZSBhcmUgcmVtb3ZlZC4KKworJ3Nob3cnOjoKKworR2l2ZXMgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVtb3RlIDxuYW1lPi4KKysKK1dpdGggYC1uYCBvcHRpb24sIHRoZSByZW1vdGUgaGVhZHMgYXJlIG5vdCBxdWVyaWVkIGZpcnN0IHdpdGgKK2BnaXQgbHMtcmVtb3RlIDxuYW1lPmA7IGNhY2hlZCBpbmZvcm1hdGlvbiBpcyB1c2VkIGluc3RlYWQuCisKKydwcnVuZSc6OgorCitEZWxldGVzIGFsbCBzdGFsZSB0cmFja2luZyBicmFuY2hlcyB1bmRlciA8bmFtZT4uCitUaGVzZSBzdGFsZSBicmFuY2hlcyBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gdGhlIHJlbW90ZSByZXBvc2l0b3J5CityZWZlcmVuY2VkIGJ5IDxuYW1lPiwgYnV0IGFyZSBzdGlsbCBsb2NhbGx5IGF2YWlsYWJsZSBpbgorInJlbW90ZXMvPG5hbWU+Ii4KKysKK1dpdGggYC1uYCBvcHRpb24sIHRoZSByZW1vdGUgaGVhZHMgYXJlIG5vdCBjb25maXJtZWQgZmlyc3Qgd2l0aCBgZ2l0Citscy1yZW1vdGUgPG5hbWU+YDsgY2FjaGVkIGluZm9ybWF0aW9uIGlzIHVzZWQgaW5zdGVhZC4gIFVzZSB3aXRoCitjYXV0aW9uLgorCisndXBkYXRlJzo6CisKK0ZldGNoIHVwZGF0ZXMgZm9yIGEgbmFtZWQgc2V0IG9mIHJlbW90ZXMgaW4gdGhlIHJlcG9zaXRvcnkgYXMgZGVmaW5lZCBieQorcmVtb3Rlcy48Z3JvdXA+LiAgSWYgYSBuYW1lZCBncm91cCBpcyBub3Qgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsCit0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgcmVtb3Rlcy5kZWZhdWx0IHdpbGwgZ2V0IHVzZWQ7IGlmCityZW1vdGVzLmRlZmF1bHQgaXMgbm90IGRlZmluZWQsIGFsbCByZW1vdGVzIHdoaWNoIGRvIG5vdCBoYXZlIHRoZQorY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgcmVtb3RlLjxuYW1lPi5za2lwRGVmYXVsdFVwZGF0ZSBzZXQgdG8gdHJ1ZSB3aWxsCitiZSB1cGRhdGVkLiAgKFNlZSBsaW5rZ2l0OmdpdC1jb25maWdbMV0pLgorCisKK0RJU0NVU1NJT04KKy0tLS0tLS0tLS0KKworVGhlIHJlbW90ZSBjb25maWd1cmF0aW9uIGlzIGFjaGlldmVkIHVzaW5nIHRoZSBgcmVtb3RlLm9yaWdpbi51cmxgIGFuZAorYHJlbW90ZS5vcmlnaW4uZmV0Y2hgIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzLiAgKFNlZQorbGlua2dpdDpnaXQtY29uZmlnWzFdKS4KKworRXhhbXBsZXMKKy0tLS0tLS0tCisKKyogQWRkIGEgbmV3IHJlbW90ZSwgZmV0Y2gsIGFuZCBjaGVjayBvdXQgYSBicmFuY2ggZnJvbSBpdAorKworLS0tLS0tLS0tLS0tCiskIGdpdCByZW1vdGUKK29yaWdpbgorJCBnaXQgYnJhbmNoIC1yCitvcmlnaW4vbWFzdGVyCiskIGdpdCByZW1vdGUgYWRkIGxpbnV4LW5mcyBnaXQ6Ly9saW51eC1uZnMub3JnL3B1Yi9saW51eC9uZnMtMi42LmdpdAorJCBnaXQgcmVtb3RlCitsaW51eC1uZnMKK29yaWdpbgorJCBnaXQgZmV0Y2gKKyogcmVmcy9yZW1vdGVzL2xpbnV4LW5mcy9tYXN0ZXI6IHN0b3JpbmcgYnJhbmNoICdtYXN0ZXInIC4uLgorICBjb21taXQ6IGJmODFiNDYKKyQgZ2l0IGJyYW5jaCAtcgorb3JpZ2luL21hc3RlcgorbGludXgtbmZzL21hc3RlcgorJCBnaXQgY2hlY2tvdXQgLWIgbmZzIGxpbnV4LW5mcy9tYXN0ZXIKKy4uLgorLS0tLS0tLS0tLS0tCisKKyogSW1pdGF0ZSAnZ2l0IGNsb25lJyBidXQgdHJhY2sgb25seSBzZWxlY3RlZCBicmFuY2hlcworKworLS0tLS0tLS0tLS0tCiskIG1rZGlyIHByb2plY3QuZ2l0CiskIGNkIHByb2plY3QuZ2l0CiskIGdpdCBpbml0CiskIGdpdCByZW1vdGUgYWRkIC1mIC10IG1hc3RlciAtbSBtYXN0ZXIgb3JpZ2luIGdpdDovL2V4YW1wbGUuY29tL2dpdC5naXQvCiskIGdpdCBtZXJnZSBvcmlnaW4KKy0tLS0tLS0tLS0tLQorCisKK1NlZSBBbHNvCistLS0tLS0tLQorbGlua2dpdDpnaXQtZmV0Y2hbMV0KK2xpbmtnaXQ6Z2l0LWJyYW5jaFsxXQorbGlua2dpdDpnaXQtY29uZmlnWzFdCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEhhbWFubworCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEouIEJydWNlIEZpZWxkcyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJlcGFjay50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXBhY2sudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOTU3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXBhY2sudHh0CkBAIC0wLDAgKzEsMTE3IEBACitnaXQtcmVwYWNrKDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1yZXBhY2sgLSBQYWNrIHVucGFja2VkIG9iamVjdHMgaW4gYSByZXBvc2l0b3J5CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXJlcGFjaycgWy1hXSBbLWRdIFstZl0gWy1sXSBbLW5dIFstcV0gWy0td2luZG93PU5dIFstLWRlcHRoPU5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIGNvbWJpbmUgYWxsIG9iamVjdHMgdGhhdCBkbyBub3QgY3VycmVudGx5CityZXNpZGUgaW4gYSAicGFjayIsIGludG8gYSBwYWNrLiAgSXQgY2FuIGFsc28gYmUgdXNlZCB0byByZS1vcmdhbml6ZQorZXhpc3RpbmcgcGFja3MgaW50byBhIHNpbmdsZSwgbW9yZSBlZmZpY2llbnQgcGFjay4KKworQSBwYWNrIGlzIGEgY29sbGVjdGlvbiBvZiBvYmplY3RzLCBpbmRpdmlkdWFsbHkgY29tcHJlc3NlZCwgd2l0aAorZGVsdGEgY29tcHJlc3Npb24gYXBwbGllZCwgc3RvcmVkIGluIGEgc2luZ2xlIGZpbGUsIHdpdGggYW4KK2Fzc29jaWF0ZWQgaW5kZXggZmlsZS4KKworUGFja3MgYXJlIHVzZWQgdG8gcmVkdWNlIHRoZSBsb2FkIG9uIG1pcnJvciBzeXN0ZW1zLCBiYWNrdXAKK2VuZ2luZXMsIGRpc2sgc3RvcmFnZSwgZXRjLgorCitPUFRJT05TCistLS0tLS0tCisKKy1hOjoKKwlJbnN0ZWFkIG9mIGluY3JlbWVudGFsbHkgcGFja2luZyB0aGUgdW5wYWNrZWQgb2JqZWN0cywKKwlwYWNrIGV2ZXJ5dGhpbmcgcmVmZXJlbmNlZCBpbnRvIGEgc2luZ2xlIHBhY2suCisJRXNwZWNpYWxseSB1c2VmdWwgd2hlbiBwYWNraW5nIGEgcmVwb3NpdG9yeSB0aGF0IGlzIHVzZWQKKwlmb3IgcHJpdmF0ZSBkZXZlbG9wbWVudCBhbmQgdGhlcmUgaXMgbm8gbmVlZCB0byB3b3JyeQorCWFib3V0IHBlb3BsZSBmZXRjaGluZyB2aWEgZHVtYiBwcm90b2NvbHMgZnJvbSBpdC4gIFVzZQorCXdpdGggJy1kJy4gIFRoaXMgd2lsbCBjbGVhbiB1cCB0aGUgb2JqZWN0cyB0aGF0IGBnaXQgcHJ1bmVgCisJbGVhdmVzIGJlaGluZCwgYnV0IGBnaXQgZnNjayAtLWZ1bGxgIHNob3dzIGFzCisJZGFuZ2xpbmcuCisKKy1kOjoKKwlBZnRlciBwYWNraW5nLCBpZiB0aGUgbmV3bHkgY3JlYXRlZCBwYWNrcyBtYWtlIHNvbWUKKwlleGlzdGluZyBwYWNrcyByZWR1bmRhbnQsIHJlbW92ZSB0aGUgcmVkdW5kYW50IHBhY2tzLgorCUFsc28gcnVucyBsaW5rZ2l0OmdpdC1wcnVuZS1wYWNrZWRbMV0uCisKKy1sOjoKKyAgICAgICAgUGFzcyB0aGUgYC0tbG9jYWxgIG9wdGlvbiB0byBgZ2l0IHBhY2stb2JqZWN0c2AsIHNlZQorCWxpbmtnaXQ6Z2l0LXBhY2stb2JqZWN0c1sxXS4KKworLWY6OgorICAgICAgICBQYXNzIHRoZSBgLS1uby1yZXVzZS1kZWx0YWAgb3B0aW9uIHRvIGBnaXQgcGFjay1vYmplY3RzYCwgc2VlCisJbGlua2dpdDpnaXQtcGFjay1vYmplY3RzWzFdLgorCistcTo6CisgICAgICAgIFBhc3MgdGhlIGAtcWAgb3B0aW9uIHRvIGBnaXQgcGFjay1vYmplY3RzYCwgc2VlCisJbGlua2dpdDpnaXQtcGFjay1vYmplY3RzWzFdLgorCistbjo6CisgICAgICAgIERvIG5vdCB1cGRhdGUgdGhlIHNlcnZlciBpbmZvcm1hdGlvbiB3aXRoCisgICAgICAgIGBnaXQgdXBkYXRlLXNlcnZlci1pbmZvYC4KKworLS13aW5kb3c9W05dLCAtLWRlcHRoPVtOXTo6CisJVGhlc2UgdHdvIG9wdGlvbnMgYWZmZWN0IGhvdyB0aGUgb2JqZWN0cyBjb250YWluZWQgaW4gdGhlIHBhY2sgYXJlCisJc3RvcmVkIHVzaW5nIGRlbHRhIGNvbXByZXNzaW9uLiBUaGUgb2JqZWN0cyBhcmUgZmlyc3QgaW50ZXJuYWxseQorCXNvcnRlZCBieSB0eXBlLCBzaXplIGFuZCBvcHRpb25hbGx5IG5hbWVzIGFuZCBjb21wYXJlZCBhZ2FpbnN0IHRoZQorCW90aGVyIG9iamVjdHMgd2l0aGluIGAtLXdpbmRvd2AgdG8gc2VlIGlmIHVzaW5nIGRlbHRhIGNvbXByZXNzaW9uIHNhdmVzCisJc3BhY2UuIGAtLWRlcHRoYCBsaW1pdHMgdGhlIG1heGltdW0gZGVsdGEgZGVwdGg7IG1ha2luZyBpdCB0b28gZGVlcAorCWFmZmVjdHMgdGhlIHBlcmZvcm1hbmNlIG9uIHRoZSB1bnBhY2tlciBzaWRlLCBiZWNhdXNlIGRlbHRhIGRhdGEgbmVlZHMKKwl0byBiZSBhcHBsaWVkIHRoYXQgbWFueSB0aW1lcyB0byBnZXQgdG8gdGhlIG5lY2Vzc2FyeSBvYmplY3QuCisJVGhlIGRlZmF1bHQgdmFsdWUgZm9yIC0td2luZG93IGlzIDEwIGFuZCAtLWRlcHRoIGlzIDUwLgorCistLXdpbmRvdy1tZW1vcnk9W05dOjoKKwlUaGlzIG9wdGlvbiBwcm92aWRlcyBhbiBhZGRpdGlvbmFsIGxpbWl0IG9uIHRvcCBvZiBgLS13aW5kb3dgOworCXRoZSB3aW5kb3cgc2l6ZSB3aWxsIGR5bmFtaWNhbGx5IHNjYWxlIGRvd24gc28gYXMgdG8gbm90IHRha2UKKwl1cCBtb3JlIHRoYW4gTiBieXRlcyBpbiBtZW1vcnkuICBUaGlzIGlzIHVzZWZ1bCBpbgorCXJlcG9zaXRvcmllcyB3aXRoIGEgbWl4IG9mIGxhcmdlIGFuZCBzbWFsbCBvYmplY3RzIHRvIG5vdCBydW4KKwlvdXQgb2YgbWVtb3J5IHdpdGggYSBsYXJnZSB3aW5kb3csIGJ1dCBzdGlsbCBiZSBhYmxlIHRvIHRha2UKKwlhZHZhbnRhZ2Ugb2YgdGhlIGxhcmdlIHdpbmRvdyBmb3IgdGhlIHNtYWxsZXIgb2JqZWN0cy4gIFRoZQorCXNpemUgY2FuIGJlIHN1ZmZpeGVkIHdpdGggImsiLCAibSIsIG9yICJnIi4KKwlgLS13aW5kb3ctbWVtb3J5PTBgIG1ha2VzIG1lbW9yeSB1c2FnZSB1bmxpbWl0ZWQsIHdoaWNoIGlzIHRoZQorCWRlZmF1bHQuCisKKy0tbWF4LXBhY2stc2l6ZT08bj46OgorCU1heGltdW0gc2l6ZSBvZiBlYWNoIG91dHB1dCBwYWNrZmlsZSwgZXhwcmVzc2VkIGluIE1pQi4KKwlJZiBzcGVjaWZpZWQsICBtdWx0aXBsZSBwYWNrZmlsZXMgbWF5IGJlIGNyZWF0ZWQuCisJVGhlIGRlZmF1bHQgaXMgdW5saW1pdGVkLgorCisKK0NvbmZpZ3VyYXRpb24KKy0tLS0tLS0tLS0tLS0KKworV2hlbiBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGByZXBhY2suVXNlRGVsdGFCYXNlT2Zmc2V0YCBpcyBzZXQKK2ZvciB0aGUgcmVwb3NpdG9yeSwgdGhlIGNvbW1hbmQgcGFzc2VzIGAtLWRlbHRhLWJhc2Utb2Zmc2V0YAorb3B0aW9uIHRvIGBnaXQtcGFjay1vYmplY3RzYDsgdGhpcyB0eXBpY2FsbHkgcmVzdWx0cyBpbiBzbGlnaHRseQorc21hbGxlciBwYWNrcywgYnV0IHRoZSBnZW5lcmF0ZWQgcGFja3MgYXJlIGluY29tcGF0aWJsZSB3aXRoCit2ZXJzaW9ucyBvZiBnaXQgb2xkZXIgdGhhbiAoYW5kIGluY2x1ZGluZykgdjEuNC4zOyBkbyBub3Qgc2V0Cit0aGUgdmFyaWFibGUgaW4gYSByZXBvc2l0b3J5IHRoYXQgb2xkZXIgdmVyc2lvbiBvZiBnaXQgbmVlZHMgdG8KK2JlIGFibGUgdG8gcmVhZCAodGhpcyBpbmNsdWRlcyByZXBvc2l0b3JpZXMgZnJvbSB3aGljaCBwYWNrcyBjYW4KK2JlIGNvcGllZCBvdXQgb3ZlciBodHRwIG9yIHJzeW5jLCBhbmQgcGVvcGxlIHdobyBvYnRhaW5lZCBwYWNrcwordGhhdCB3YXkgY2FuIHRyeSB0byB1c2Ugb2xkZXIgZ2l0IHdpdGggaXQpLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgUnlhbiBBbmRlcnNvbiA8cnlhbkBtaWNob25saW5lLmNvbT4KKworU2VlIEFsc28KKy0tLS0tLS0tCitsaW5rZ2l0OmdpdC1wYWNrLW9iamVjdHNbMV0KK2xpbmtnaXQ6Z2l0LXBydW5lLXBhY2tlZFsxXQorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJlcG8tY29uZmlnLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXJlcG8tY29uZmlnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2EzOTk0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcmVwby1jb25maWcudHh0CkBAIC0wLDAgKzEsMTggQEAKK2dpdC1yZXBvLWNvbmZpZygxKQorPT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1yZXBvLWNvbmZpZyAtIEdldCBhbmQgc2V0IHJlcG9zaXRvcnkgb3IgZ2xvYmFsIG9wdGlvbnMKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcmVwby1jb25maWcnIC4uLgorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitUaGlzIGlzIGEgc3lub255bSBmb3IgbGlua2dpdDpnaXQtY29uZmlnWzFdLiAgUGxlYXNlIHJlZmVyIHRvIHRoZQorZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGNvbW1hbmQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1yZXF1ZXN0LXB1bGwudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcmVxdWVzdC1wdWxsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzBkZjliCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcmVxdWVzdC1wdWxsLnR4dApAQCAtMCwwICsxLDM5IEBACitnaXQtcmVxdWVzdC1wdWxsKDEpCis9PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1yZXF1ZXN0LXB1bGwgLSBHZW5lcmF0ZXMgYSBzdW1tYXJ5IG9mIHBlbmRpbmcgY2hhbmdlcworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcmVxdWVzdC1wdWxsJyA8c3RhcnQ+IDx1cmw+IFs8ZW5kPl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK1N1bW1hcml6ZXMgdGhlIGNoYW5nZXMgYmV0d2VlbiB0d28gY29tbWl0cyB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LCBhbmQgaW5jbHVkZXMKK3RoZSBnaXZlbiBVUkwgaW4gdGhlIGdlbmVyYXRlZCBzdW1tYXJ5LgorCitPUFRJT05TCistLS0tLS0tCis8c3RhcnQ+OjoKKwlDb21taXQgdG8gc3RhcnQgYXQuCisKKzx1cmw+OjoKKwlVUkwgdG8gaW5jbHVkZSBpbiB0aGUgc3VtbWFyeS4KKworPGVuZD46OgorCUNvbW1pdCB0byBzZW5kIGF0OyBkZWZhdWx0cyB0byBIRUFELgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBSeWFuIEFuZGVyc29uIDxyeWFuQG1pY2hvbmxpbmUuY29tPiBhbmQgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1yZXJlcmUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcmVyZXJlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTM4NThlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcmVyZXJlLnR4dApAQCAtMCwwICsxLDIxMSBAQAorZ2l0LXJlcmVyZSgxKQorPT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcmVyZXJlIC0gUmV1c2UgcmVjb3JkZWQgcmVzb2x1dGlvbiBvZiBjb25mbGljdGVkIG1lcmdlcworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcmVyZXJlJyBbY2xlYXJ8ZGlmZnxzdGF0dXN8Z2NdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitJbiBhIHdvcmtmbG93IHRoYXQgZW1wbG95cyByZWxhdGl2ZWx5IGxvbmcgbGl2ZWQgdG9waWMgYnJhbmNoZXMsCit0aGUgZGV2ZWxvcGVyIHNvbWV0aW1lcyBuZWVkcyB0byByZXNvbHZlIHRoZSBzYW1lIGNvbmZsaWN0IG92ZXIKK2FuZCBvdmVyIGFnYWluIHVudGlsIHRoZSB0b3BpYyBicmFuY2hlcyBhcmUgZG9uZSAoZWl0aGVyIG1lcmdlZAordG8gdGhlICJyZWxlYXNlIiBicmFuY2gsIG9yIHNlbnQgb3V0IGFuZCBhY2NlcHRlZCB1cHN0cmVhbSkuCisKK1RoaXMgY29tbWFuZCBoZWxwcyB0aGlzIHByb2Nlc3MgYnkgcmVjb3JkaW5nIGNvbmZsaWN0ZWQKK2F1dG9tZXJnZSByZXN1bHRzIGFuZCBjb3JyZXNwb25kaW5nIGhhbmQtcmVzb2x2ZSByZXN1bHRzIG9uIHRoZQoraW5pdGlhbCBtYW51YWwgbWVyZ2UsIGFuZCBsYXRlciBieSBub3RpY2luZyB0aGUgc2FtZSBhdXRvbWVyZ2UKK3Jlc3VsdHMgYW5kIGFwcGx5aW5nIHRoZSBwcmV2aW91c2x5IHJlY29yZGVkIGhhbmQgcmVzb2x1dGlvbi4KKworW05PVEVdCitZb3UgbmVlZCB0byBzZXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgcmVyZXJlLmVuYWJsZWQgdG8KK2VuYWJsZSB0aGlzIGNvbW1hbmQuCisKKworQ09NTUFORFMKKy0tLS0tLS0tCisKK05vcm1hbGx5LCBnaXQtcmVyZXJlIGlzIHJ1biB3aXRob3V0IGFyZ3VtZW50cyBvciB1c2VyLWludGVydmVudGlvbi4KK0hvd2V2ZXIsIGl0IGhhcyBzZXZlcmFsIGNvbW1hbmRzIHRoYXQgYWxsb3cgaXQgdG8gaW50ZXJhY3Qgd2l0aAoraXRzIHdvcmtpbmcgc3RhdGUuCisKKydjbGVhcic6OgorCitUaGlzIHJlc2V0cyB0aGUgbWV0YWRhdGEgdXNlZCBieSByZXJlcmUgaWYgYSBtZXJnZSByZXNvbHV0aW9uIGlzIHRvIGJlCitpcyBhYm9ydGVkLiAgQ2FsbGluZyBsaW5rZ2l0OmdpdC1hbVsxXSAtLXNraXAgb3IgbGlua2dpdDpnaXQtcmViYXNlWzFdCitbLS1za2lwfC0tYWJvcnRdIHdpbGwgYXV0b21hdGljYWxseSBpbnZva2UgdGhpcyBjb21tYW5kLgorCisnZGlmZic6OgorCitUaGlzIGRpc3BsYXlzIGRpZmZzIGZvciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcmVzb2x1dGlvbi4gIEl0IGlzCit1c2VmdWwgZm9yIHRyYWNraW5nIHdoYXQgaGFzIGNoYW5nZWQgd2hpbGUgdGhlIHVzZXIgaXMgcmVzb2x2aW5nCitjb25mbGljdHMuICBBZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBzeXN0ZW0KK2RpZmYoMSkgY29tbWFuZCBpbnN0YWxsZWQgaW4gUEFUSC4KKworJ3N0YXR1cyc6OgorCitMaWtlIGRpZmYsIGJ1dCB0aGlzIG9ubHkgcHJpbnRzIHRoZSBmaWxlbmFtZXMgdGhhdCB3aWxsIGJlIHRyYWNrZWQKK2ZvciByZXNvbHV0aW9ucy4KKworJ2djJzo6CisKK1RoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHBydW5lIHJlY29yZHMgb2YgY29uZmxpY3RlZCBtZXJnZSB0aGF0CitvY2N1cnJlZCBsb25nIHRpbWUgYWdvLiAgQnkgZGVmYXVsdCwgY29uZmxpY3RzIG9sZGVyIHRoYW4gMTUKK2RheXMgdGhhdCB5b3UgaGF2ZSBub3QgcmVjb3JkZWQgdGhlaXIgcmVzb2x1dGlvbiwgYW5kIGNvbmZsaWN0cworb2xkZXIgdGhhbiA2MCBkYXlzLCBhcmUgcHJ1bmVkLiAgVGhlc2UgYXJlIGNvbnRyb2xsZWQgd2l0aAorYGdjLnJlcmVyZXVucmVzb2x2ZWRgIGFuZCBgZ2MucmVyZXJlcmVzb2x2ZWRgIGNvbmZpZ3VyYXRpb24KK3ZhcmlhYmxlcy4KKworCitESVNDVVNTSU9OCistLS0tLS0tLS0tCisKK1doZW4geW91ciB0b3BpYyBicmFuY2ggbW9kaWZpZXMgb3ZlcmxhcHBpbmcgYXJlYSB0aGF0IHlvdXIKK21hc3RlciBicmFuY2ggKG9yIHVwc3RyZWFtKSB0b3VjaGVkIHNpbmNlIHlvdXIgdG9waWMgYnJhbmNoCitmb3JrZWQgZnJvbSBpdCwgeW91IG1heSB3YW50IHRvIHRlc3QgaXQgd2l0aCB0aGUgbGF0ZXN0IG1hc3RlciwKK2V2ZW4gYmVmb3JlIHlvdXIgdG9waWMgYnJhbmNoIGlzIHJlYWR5IHRvIGJlIHB1c2hlZCB1cHN0cmVhbToKKworLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgIG8tLS0qLS0tbyB0b3BpYworICAgICAgICAgICAgIC8KKyAgICBvLS0tby0tLW8tLS0qLS0tby0tLW8gbWFzdGVyCistLS0tLS0tLS0tLS0KKworRm9yIHN1Y2ggYSB0ZXN0LCB5b3UgbmVlZCB0byBtZXJnZSBtYXN0ZXIgYW5kIHRvcGljIHNvbWVob3cuCitPbmUgd2F5IHRvIGRvIGl0IGlzIHRvIHB1bGwgbWFzdGVyIGludG8gdGhlIHRvcGljIGJyYW5jaDoKKworLS0tLS0tLS0tLS0tCisJJCBnaXQgY2hlY2tvdXQgdG9waWMKKwkkIGdpdCBtZXJnZSBtYXN0ZXIKKworICAgICAgICAgICAgICBvLS0tKi0tLW8tLS0rIHRvcGljCisgICAgICAgICAgICAgLyAgICAgICAgICAgLworICAgIG8tLS1vLS0tby0tLSotLS1vLS0tbyBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCitUaGUgY29tbWl0cyBtYXJrZWQgd2l0aCBgKmAgdG91Y2ggdGhlIHNhbWUgYXJlYSBpbiB0aGUgc2FtZQorZmlsZTsgeW91IG5lZWQgdG8gcmVzb2x2ZSB0aGUgY29uZmxpY3RzIHdoZW4gY3JlYXRpbmcgdGhlIGNvbW1pdAorbWFya2VkIHdpdGggYCtgLiAgVGhlbiB5b3UgY2FuIHRlc3QgdGhlIHJlc3VsdCB0byBtYWtlIHN1cmUgeW91cgord29yay1pbi1wcm9ncmVzcyBzdGlsbCB3b3JrcyB3aXRoIHdoYXQgaXMgaW4gdGhlIGxhdGVzdCBtYXN0ZXIuCisKK0FmdGVyIHRoaXMgdGVzdCBtZXJnZSwgdGhlcmUgYXJlIHR3byB3YXlzIHRvIGNvbnRpbnVlIHlvdXIgd29yaworb24gdGhlIHRvcGljLiAgVGhlIGVhc2llc3QgaXMgdG8gYnVpbGQgb24gdG9wIG9mIHRoZSB0ZXN0IG1lcmdlCitjb21taXQgYCtgLCBhbmQgd2hlbiB5b3VyIHdvcmsgaW4gdGhlIHRvcGljIGJyYW5jaCBpcyBmaW5hbGx5CityZWFkeSwgcHVsbCB0aGUgdG9waWMgYnJhbmNoIGludG8gbWFzdGVyLCBhbmQvb3IgYXNrIHRoZQordXBzdHJlYW0gdG8gcHVsbCBmcm9tIHlvdS4gIEJ5IHRoYXQgdGltZSwgaG93ZXZlciwgdGhlIG1hc3RlciBvcgordGhlIHVwc3RyZWFtIG1pZ2h0IGhhdmUgYmVlbiBhZHZhbmNlZCBzaW5jZSB0aGUgdGVzdCBtZXJnZSBgK2AsCitpbiB3aGljaCBjYXNlIHRoZSBmaW5hbCBjb21taXQgZ3JhcGggd291bGQgbG9vayBsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLQorCSQgZ2l0IGNoZWNrb3V0IHRvcGljCisJJCBnaXQgbWVyZ2UgbWFzdGVyCisJJCAuLi4gd29yayBvbiBib3RoIHRvcGljIGFuZCBtYXN0ZXIgYnJhbmNoZXMKKwkkIGdpdCBjaGVja291dCBtYXN0ZXIKKwkkIGdpdCBtZXJnZSB0b3BpYworCisgICAgICAgICAgICAgIG8tLS0qLS0tby0tLSstLS1vLS0tbyB0b3BpYworICAgICAgICAgICAgIC8gICAgICAgICAgIC8gICAgICAgICBcCisgICAgby0tLW8tLS1vLS0tKi0tLW8tLS1vLS0tby0tLW8tLS0rIG1hc3RlcgorLS0tLS0tLS0tLS0tCisKK1doZW4geW91ciB0b3BpYyBicmFuY2ggaXMgbG9uZy1saXZlZCwgaG93ZXZlciwgeW91ciB0b3BpYyBicmFuY2gKK3dvdWxkIGVuZCB1cCBoYXZpbmcgbWFueSBzdWNoICJNZXJnZSBmcm9tIG1hc3RlciIgY29tbWl0cyBvbiBpdCwKK3doaWNoIHdvdWxkIHVubmVjZXNzYXJpbHkgY2x1dHRlciB0aGUgZGV2ZWxvcG1lbnQgaGlzdG9yeS4KK1JlYWRlcnMgb2YgdGhlIExpbnV4IGtlcm5lbCBtYWlsaW5nIGxpc3QgbWF5IHJlbWVtYmVyIHRoYXQgTGludXMKK2NvbXBsYWluZWQgYWJvdXQgc3VjaCB0b28gZnJlcXVlbnQgdGVzdCBtZXJnZXMgd2hlbiBhIHN1YnN5c3RlbQorbWFpbnRhaW5lciBhc2tlZCB0byBwdWxsIGZyb20gYSBicmFuY2ggZnVsbCBvZiAidXNlbGVzcyBtZXJnZXMiLgorCitBcyBhbiBhbHRlcm5hdGl2ZSwgdG8ga2VlcCB0aGUgdG9waWMgYnJhbmNoIGNsZWFuIG9mIHRlc3QKK21lcmdlcywgeW91IGNvdWxkIGJsb3cgYXdheSB0aGUgdGVzdCBtZXJnZSwgYW5kIGtlZXAgYnVpbGRpbmcgb24KK3RvcCBvZiB0aGUgdGlwIGJlZm9yZSB0aGUgdGVzdCBtZXJnZToKKworLS0tLS0tLS0tLS0tCisJJCBnaXQgY2hlY2tvdXQgdG9waWMKKwkkIGdpdCBtZXJnZSBtYXN0ZXIKKwkkIGdpdCByZXNldCAtLWhhcmQgSEVBRF4gOyMgcmV3aW5kIHRoZSB0ZXN0IG1lcmdlCisJJCAuLi4gd29yayBvbiBib3RoIHRvcGljIGFuZCBtYXN0ZXIgYnJhbmNoZXMKKwkkIGdpdCBjaGVja291dCBtYXN0ZXIKKwkkIGdpdCBtZXJnZSB0b3BpYworCisgICAgICAgICAgICAgIG8tLS0qLS0tby0tLS0tLS1vLS0tbyB0b3BpYworICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgICAgICBcCisgICAgby0tLW8tLS1vLS0tKi0tLW8tLS1vLS0tby0tLW8tLS0rIG1hc3RlcgorLS0tLS0tLS0tLS0tCisKK1RoaXMgd291bGQgbGVhdmUgb25seSBvbmUgbWVyZ2UgY29tbWl0IHdoZW4geW91ciB0b3BpYyBicmFuY2ggaXMKK2ZpbmFsbHkgcmVhZHkgYW5kIG1lcmdlZCBpbnRvIHRoZSBtYXN0ZXIgYnJhbmNoLiAgVGhpcyBtZXJnZQord291bGQgcmVxdWlyZSB5b3UgdG8gcmVzb2x2ZSB0aGUgY29uZmxpY3QsIGludHJvZHVjZWQgYnkgdGhlCitjb21taXRzIG1hcmtlZCB3aXRoIGAqYC4gIEhvd2V2ZXIsIG9mdGVuIHRoaXMgY29uZmxpY3QgaXMgdGhlCitzYW1lIGNvbmZsaWN0IHlvdSByZXNvbHZlZCB3aGVuIHlvdSBjcmVhdGVkIHRoZSB0ZXN0IG1lcmdlIHlvdQorYmxldyBhd2F5LiAgYGdpdC1yZXJlcmVgIGNvbW1hbmQgaGVscHMgeW91IHRvIHJlc29sdmUgdGhpcyBmaW5hbAorY29uZmxpY3RlZCBtZXJnZSB1c2luZyB0aGUgaW5mb3JtYXRpb24gZnJvbSB5b3VyIGVhcmxpZXIgaGFuZAorcmVzb2x2ZS4KKworUnVubmluZyBgZ2l0LXJlcmVyZWAgY29tbWFuZCBpbW1lZGlhdGVseSBhZnRlciBhIGNvbmZsaWN0ZWQKK2F1dG9tZXJnZSByZWNvcmRzIHRoZSBjb25mbGljdGVkIHdvcmtpbmcgdHJlZSBmaWxlcywgd2l0aCB0aGUKK3VzdWFsIGNvbmZsaWN0IG1hcmtlcnMgYDw8PDw8PDxgLCBgPT09PT09PWAsIGFuZCBgPj4+Pj4+PmAgaW4KK3RoZW0uICBMYXRlciwgYWZ0ZXIgeW91IGFyZSBkb25lIHJlc29sdmluZyB0aGUgY29uZmxpY3RzLAorcnVubmluZyBgZ2l0LXJlcmVyZWAgYWdhaW4gcmVjb3JkcyB0aGUgcmVzb2x2ZWQgc3RhdGUgb2YgdGhlc2UKK2ZpbGVzLiAgU3VwcG9zZSB5b3UgZGlkIHRoaXMgd2hlbiB5b3UgY3JlYXRlZCB0aGUgdGVzdCBtZXJnZSBvZgorbWFzdGVyIGludG8gdGhlIHRvcGljIGJyYW5jaC4KKworTmV4dCB0aW1lLCBydW5uaW5nIGBnaXQtcmVyZXJlYCBhZnRlciBzZWVpbmcgYSBjb25mbGljdGVkCithdXRvbWVyZ2UsIGlmIHRoZSBjb25mbGljdCBpcyB0aGUgc2FtZSBhcyB0aGUgZWFybGllciBvbmUKK3JlY29yZGVkLCBpdCBpcyBub3RpY2VkIGFuZCBhIHRocmVlLXdheSBtZXJnZSBiZXR3ZWVuIHRoZQorZWFybGllciBjb25mbGljdGVkIGF1dG9tZXJnZSwgdGhlIGVhcmxpZXIgbWFudWFsIHJlc29sdXRpb24sIGFuZAordGhlIGN1cnJlbnQgY29uZmxpY3RlZCBhdXRvbWVyZ2UgaXMgcGVyZm9ybWVkIGJ5IHRoZSBjb21tYW5kLgorSWYgdGhpcyB0aHJlZS13YXkgbWVyZ2UgcmVzb2x2ZXMgY2xlYW5seSwgdGhlIHJlc3VsdCBpcyB3cml0dGVuCitvdXQgdG8geW91ciB3b3JraW5nIHRyZWUgZmlsZSwgc28geW91IHdvdWxkIG5vdCBoYXZlIHRvIG1hbnVhbGx5CityZXNvbHZlIGl0LiAgTm90ZSB0aGF0IGBnaXQtcmVyZXJlYCBsZWF2ZXMgdGhlIGluZGV4IGZpbGUgYWxvbmUsCitzbyB5b3Ugc3RpbGwgbmVlZCB0byBkbyB0aGUgZmluYWwgc2FuaXR5IGNoZWNrcyB3aXRoIGBnaXQgZGlmZmAKKyhvciBgZ2l0IGRpZmYgLWNgKSBhbmQgYGdpdCBhZGRgIHdoZW4geW91IGFyZSBzYXRpc2ZpZWQuCisKK0FzIGEgY29udmVuaWVuY2UgbWVhc3VyZSwgYGdpdC1tZXJnZWAgYXV0b21hdGljYWxseSBpbnZva2VzCitgZ2l0LXJlcmVyZWAgd2hlbiBpdCBleGl0cyB3aXRoIGEgZmFpbGVkIGF1dG9tZXJnZSwgd2hpY2gKK3JlY29yZHMgaXQgaWYgaXQgaXMgYSBuZXcgY29uZmxpY3QsIG9yIHJldXNlcyB0aGUgZWFybGllciBoYW5kCityZXNvbHZlIHdoZW4gaXQgaXMgbm90LiAgYGdpdC1jb21taXRgIGFsc28gaW52b2tlcyBgZ2l0LXJlcmVyZWAKK3doZW4gcmVjb3JkaW5nIGEgbWVyZ2UgcmVzdWx0LiAgV2hhdCB0aGlzIG1lYW5zIGlzIHRoYXQgeW91IGRvCitub3QgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsIHlvdXJzZWxmIChOb3RlOiB5b3Ugc3RpbGwgaGF2ZQordG8gc2V0IHRoZSBjb25maWcgdmFyaWFibGUgcmVyZXJlLmVuYWJsZWQgdG8gZW5hYmxlIHRoaXMgY29tbWFuZCkuCisKK0luIG91ciBleGFtcGxlLCB3aGVuIHlvdSBkaWQgdGhlIHRlc3QgbWVyZ2UsIHRoZSBtYW51YWwKK3Jlc29sdXRpb24gaXMgcmVjb3JkZWQsIGFuZCBpdCB3aWxsIGJlIHJldXNlZCB3aGVuIHlvdSBkbyB0aGUKK2FjdHVhbCBtZXJnZSBsYXRlciB3aXRoIHVwZGF0ZWQgbWFzdGVyIGFuZCB0b3BpYyBicmFuY2gsIGFzIGxvbmcKK2FzIHRoZSBlYXJsaWVyIHJlc29sdXRpb24gaXMgc3RpbGwgYXBwbGljYWJsZS4KKworVGhlIGluZm9ybWF0aW9uIGBnaXQtcmVyZXJlYCByZWNvcmRzIGlzIGFsc28gdXNlZCB3aGVuIHJ1bm5pbmcKK2BnaXQtcmViYXNlYC4gIEFmdGVyIGJsb3dpbmcgYXdheSB0aGUgdGVzdCBtZXJnZSBhbmQgY29udGludWluZworZGV2ZWxvcG1lbnQgb24gdGhlIHRvcGljIGJyYW5jaDoKKworLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgIG8tLS0qLS0tby0tLS0tLS1vLS0tbyB0b3BpYworICAgICAgICAgICAgIC8KKyAgICBvLS0tby0tLW8tLS0qLS0tby0tLW8tLS1vLS0tbyAgIG1hc3RlcgorCisJJCBnaXQgcmViYXNlIG1hc3RlciB0b3BpYworCisJCQkJICBvLS0tKi0tLW8tLS0tLS0tby0tLW8gdG9waWMKKwkJCQkgLworICAgIG8tLS1vLS0tby0tLSotLS1vLS0tby0tLW8tLS1vICAgbWFzdGVyCistLS0tLS0tLS0tLS0KKworeW91IGNvdWxkIHJ1biBgZ2l0IHJlYmFzZSBtYXN0ZXIgdG9waWNgLCB0byBrZWVwIHlvdXJzZWxmCit1cC10by1kYXRlIGV2ZW4gYmVmb3JlIHlvdXIgdG9waWMgaXMgcmVhZHkgdG8gYmUgc2VudCB1cHN0cmVhbS4KK1RoaXMgd291bGQgcmVzdWx0IGluIGZhbGxpbmcgYmFjayB0byB0aHJlZS13YXkgbWVyZ2UsIGFuZCBpdAord291bGQgY29uZmxpY3QgdGhlIHNhbWUgd2F5IHRoZSB0ZXN0IG1lcmdlIHlvdSByZXNvbHZlZCBlYXJsaWVyLgorYGdpdC1yZXJlcmVgIGlzIHJ1biBieSBgZ2l0IHJlYmFzZWAgdG8gaGVscCB5b3UgcmVzb2x2ZSB0aGlzCitjb25mbGljdC4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcmVzZXQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcmVzZXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYzU5YzkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXNldC50eHQKQEAgLTAsMCArMSwyMDYgQEAKK2dpdC1yZXNldCgxKQorPT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1yZXNldCAtIFJlc2V0IGN1cnJlbnQgSEVBRCB0byB0aGUgc3BlY2lmaWVkIHN0YXRlCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdCByZXNldCcgWy0tbWl4ZWQgfCAtLXNvZnQgfCAtLWhhcmRdIFstcV0gWzxjb21taXQ+XQorJ2dpdCByZXNldCcgWy1xXSBbPGNvbW1pdD5dIFstLV0gPHBhdGhzPi4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1NldHMgdGhlIGN1cnJlbnQgaGVhZCB0byB0aGUgc3BlY2lmaWVkIGNvbW1pdCBhbmQgb3B0aW9uYWxseSByZXNldHMgdGhlCitpbmRleCBhbmQgd29ya2luZyB0cmVlIHRvIG1hdGNoLgorCitUaGlzIGNvbW1hbmQgaXMgdXNlZnVsIGlmIHlvdSBub3RpY2Ugc29tZSBzbWFsbCBlcnJvciBpbiBhIHJlY2VudAorY29tbWl0IChvciBzZXQgb2YgY29tbWl0cykgYW5kIHdhbnQgdG8gcmVkbyB0aGF0IHBhcnQgd2l0aG91dCBzaG93aW5nCit0aGUgdW5kbyBpbiB0aGUgaGlzdG9yeS4KKworSWYgeW91IHdhbnQgdG8gdW5kbyBhIGNvbW1pdCBvdGhlciB0aGFuIHRoZSBsYXRlc3Qgb24gYSBicmFuY2gsCitsaW5rZ2l0OmdpdC1yZXZlcnRbMV0gaXMgeW91ciBmcmllbmQuCisKK1RoZSBzZWNvbmQgZm9ybSB3aXRoICdwYXRocycgaXMgdXNlZCB0byByZXZlcnQgc2VsZWN0ZWQgcGF0aHMgaW4KK3RoZSBpbmRleCBmcm9tIGEgZ2l2ZW4gY29tbWl0LCB3aXRob3V0IG1vdmluZyBIRUFELgorCisKK09QVElPTlMKKy0tLS0tLS0KKy0tbWl4ZWQ6OgorCVJlc2V0cyB0aGUgaW5kZXggYnV0IG5vdCB0aGUgd29ya2luZyB0cmVlIChpLmUuLCB0aGUgY2hhbmdlZCBmaWxlcworCWFyZSBwcmVzZXJ2ZWQgYnV0IG5vdCBtYXJrZWQgZm9yIGNvbW1pdCkgYW5kIHJlcG9ydHMgd2hhdCBoYXMgbm90CisJYmVlbiB1cGRhdGVkLiBUaGlzIGlzIHRoZSBkZWZhdWx0IGFjdGlvbi4KKworLS1zb2Z0OjoKKwlEb2VzIG5vdCB0b3VjaCB0aGUgaW5kZXggZmlsZSBub3IgdGhlIHdvcmtpbmcgdHJlZSBhdCBhbGwsIGJ1dAorCXJlcXVpcmVzIHRoZW0gdG8gYmUgaW4gYSBnb29kIG9yZGVyLiBUaGlzIGxlYXZlcyBhbGwgeW91ciBjaGFuZ2VkCisJZmlsZXMgIkNoYW5nZXMgdG8gYmUgY29tbWl0dGVkIiwgYXMgbGlua2dpdDpnaXQtc3RhdHVzWzFdIHdvdWxkCisJcHV0IGl0LgorCistLWhhcmQ6OgorCU1hdGNoZXMgdGhlIHdvcmtpbmcgdHJlZSBhbmQgaW5kZXggdG8gdGhhdCBvZiB0aGUgdHJlZSBiZWluZworCXN3aXRjaGVkIHRvLiBBbnkgY2hhbmdlcyB0byB0cmFja2VkIGZpbGVzIGluIHRoZSB3b3JraW5nIHRyZWUKKwlzaW5jZSA8Y29tbWl0PiBhcmUgbG9zdC4KKworLXE6OgorCUJlIHF1aWV0LCBvbmx5IHJlcG9ydCBlcnJvcnMuCisKKzxjb21taXQ+OjoKKwlDb21taXQgdG8gbWFrZSB0aGUgY3VycmVudCBIRUFELiBJZiBub3QgZ2l2ZW4gZGVmYXVsdHMgdG8gSEVBRC4KKworRXhhbXBsZXMKKy0tLS0tLS0tCisKK1VuZG8gYSBjb21taXQgYW5kIHJlZG86OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBjb21taXQgLi4uCiskIGdpdCByZXNldCAtLXNvZnQgSEVBRF4gICAgICA8MT4KKyQgZWRpdCAgICAgICAgICAgICAgICAgICAgICAgIDwyPgorJCBnaXQgY29tbWl0IC1hIC1jIE9SSUdfSEVBRCAgPDM+CistLS0tLS0tLS0tLS0KKysKKzwxPiBUaGlzIGlzIG1vc3Qgb2Z0ZW4gZG9uZSB3aGVuIHlvdSByZW1lbWJlcmVkIHdoYXQgeW91CitqdXN0IGNvbW1pdHRlZCBpcyBpbmNvbXBsZXRlLCBvciB5b3UgbWlzc3BlbGxlZCB5b3VyIGNvbW1pdAorbWVzc2FnZSwgb3IgYm90aC4gIExlYXZlcyB3b3JraW5nIHRyZWUgYXMgaXQgd2FzIGJlZm9yZSAicmVzZXQiLgorPDI+IE1ha2UgY29ycmVjdGlvbnMgdG8gd29ya2luZyB0cmVlIGZpbGVzLgorPDM+ICJyZXNldCIgY29waWVzIHRoZSBvbGQgaGVhZCB0byAuZ2l0L09SSUdfSEVBRDsgcmVkbyB0aGUKK2NvbW1pdCBieSBzdGFydGluZyB3aXRoIGl0cyBsb2cgbWVzc2FnZS4gIElmIHlvdSBkbyBub3QgbmVlZCB0bworZWRpdCB0aGUgbWVzc2FnZSBmdXJ0aGVyLCB5b3UgY2FuIGdpdmUgLUMgb3B0aW9uIGluc3RlYWQuCisrCitTZWUgYWxzbyB0aGUgLS1hbWVuZCBvcHRpb24gdG8gbGlua2dpdDpnaXQtY29tbWl0WzFdLgorCitVbmRvIGNvbW1pdHMgcGVybWFuZW50bHk6OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBjb21taXQgLi4uCiskIGdpdCByZXNldCAtLWhhcmQgSEVBRH4zICAgPDE+CistLS0tLS0tLS0tLS0KKysKKzwxPiBUaGUgbGFzdCB0aHJlZSBjb21taXRzIChIRUFELCBIRUFEXiwgYW5kIEhFQUR+Mikgd2VyZSBiYWQKK2FuZCB5b3UgZG8gbm90IHdhbnQgdG8gZXZlciBzZWUgdGhlbSBhZ2Fpbi4gIERvICpub3QqIGRvIHRoaXMgaWYKK3lvdSBoYXZlIGFscmVhZHkgZ2l2ZW4gdGhlc2UgY29tbWl0cyB0byBzb21lYm9keSBlbHNlLgorCitVbmRvIGEgY29tbWl0LCBtYWtpbmcgaXQgYSB0b3BpYyBicmFuY2g6OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBicmFuY2ggdG9waWMvd2lwICAgICA8MT4KKyQgZ2l0IHJlc2V0IC0taGFyZCBIRUFEfjMgIDwyPgorJCBnaXQgY2hlY2tvdXQgdG9waWMvd2lwICAgPDM+CistLS0tLS0tLS0tLS0KKysKKzwxPiBZb3UgaGF2ZSBtYWRlIHNvbWUgY29tbWl0cywgYnV0IHJlYWxpemUgdGhleSB3ZXJlIHByZW1hdHVyZQordG8gYmUgaW4gdGhlICJtYXN0ZXIiIGJyYW5jaC4gIFlvdSB3YW50IHRvIGNvbnRpbnVlIHBvbGlzaGluZwordGhlbSBpbiBhIHRvcGljIGJyYW5jaCwgc28gY3JlYXRlICJ0b3BpYy93aXAiIGJyYW5jaCBvZmYgb2YgdGhlCitjdXJyZW50IEhFQUQuCis8Mj4gUmV3aW5kIHRoZSBtYXN0ZXIgYnJhbmNoIHRvIGdldCByaWQgb2YgdGhvc2UgdGhyZWUgY29tbWl0cy4KKzwzPiBTd2l0Y2ggdG8gInRvcGljL3dpcCIgYnJhbmNoIGFuZCBrZWVwIHdvcmtpbmcuCisKK1VuZG8gYWRkOjoKKysKKy0tLS0tLS0tLS0tLQorJCBlZGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwxPgorJCBnaXQgYWRkIGZyb3R6LmMgZmlsZnJlLmMKKyQgbWFpbHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Mj4KKyQgZ2l0IHJlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Mz4KKyQgZ2l0IHB1bGwgZ2l0Oi8vaW5mby5leGFtcGxlLmNvbS8gbml0Zm9sICA8ND4KKy0tLS0tLS0tLS0tLQorKworPDE+IFlvdSBhcmUgaGFwcGlseSB3b3JraW5nIG9uIHNvbWV0aGluZywgYW5kIGZpbmQgdGhlIGNoYW5nZXMKK2luIHRoZXNlIGZpbGVzIGFyZSBpbiBnb29kIG9yZGVyLiAgWW91IGRvIG5vdCB3YW50IHRvIHNlZSB0aGVtCit3aGVuIHlvdSBydW4gImdpdCBkaWZmIiwgYmVjYXVzZSB5b3UgcGxhbiB0byB3b3JrIG9uIG90aGVyIGZpbGVzCithbmQgY2hhbmdlcyB3aXRoIHRoZXNlIGZpbGVzIGFyZSBkaXN0cmFjdGluZy4KKzwyPiBTb21lYm9keSBhc2tzIHlvdSB0byBwdWxsLCBhbmQgdGhlIGNoYW5nZXMgc291bmRzIHdvcnRoeSBvZiBtZXJnaW5nLgorPDM+IEhvd2V2ZXIsIHlvdSBhbHJlYWR5IGRpcnRpZWQgdGhlIGluZGV4IChpLmUuIHlvdXIgaW5kZXggZG9lcworbm90IG1hdGNoIHRoZSBIRUFEIGNvbW1pdCkuICBCdXQgeW91IGtub3cgdGhlIHB1bGwgeW91IGFyZSBnb2luZwordG8gbWFrZSBkb2VzIG5vdCBhZmZlY3QgZnJvdHouYyBub3IgZmlsZnJlLmMsIHNvIHlvdSByZXZlcnQgdGhlCitpbmRleCBjaGFuZ2VzIGZvciB0aGVzZSB0d28gZmlsZXMuICBZb3VyIGNoYW5nZXMgaW4gd29ya2luZyB0cmVlCityZW1haW4gdGhlcmUuCis8ND4gVGhlbiB5b3UgY2FuIHB1bGwgYW5kIG1lcmdlLCBsZWF2aW5nIGZyb3R6LmMgYW5kIGZpbGZyZS5jCitjaGFuZ2VzIHN0aWxsIGluIHRoZSB3b3JraW5nIHRyZWUuCisKK1VuZG8gYSBtZXJnZSBvciBwdWxsOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgcHVsbCAgICAgICAgICAgICAgICAgICAgICAgICA8MT4KK0F1dG8tbWVyZ2luZyBuaXRmb2wKK0NPTkZMSUNUIChjb250ZW50KTogTWVyZ2UgY29uZmxpY3QgaW4gbml0Zm9sCitBdXRvbWF0aWMgbWVyZ2UgZmFpbGVkL3ByZXZlbnRlZDsgZml4IHVwIGJ5IGhhbmQKKyQgZ2l0IHJlc2V0IC0taGFyZCAgICAgICAgICAgICAgICAgPDI+CiskIGdpdCBwdWxsIC4gdG9waWMvYnJhbmNoICAgICAgICAgIDwzPgorVXBkYXRpbmcgZnJvbSA0MTIyMy4uLiB0byAxMzEzNC4uLgorRmFzdCBmb3J3YXJkCiskIGdpdCByZXNldCAtLWhhcmQgT1JJR19IRUFEICAgICAgIDw0PgorLS0tLS0tLS0tLS0tCisrCis8MT4gVHJ5IHRvIHVwZGF0ZSBmcm9tIHRoZSB1cHN0cmVhbSByZXN1bHRlZCBpbiBhIGxvdCBvZgorY29uZmxpY3RzOyB5b3Ugd2VyZSBub3QgcmVhZHkgdG8gc3BlbmQgYSBsb3Qgb2YgdGltZSBtZXJnaW5nCityaWdodCBub3csIHNvIHlvdSBkZWNpZGUgdG8gZG8gdGhhdCBsYXRlci4KKzwyPiAicHVsbCIgaGFzIG5vdCBtYWRlIG1lcmdlIGNvbW1pdCwgc28gImdpdCByZXNldCAtLWhhcmQiCit3aGljaCBpcyBhIHN5bm9ueW0gZm9yICJnaXQgcmVzZXQgLS1oYXJkIEhFQUQiIGNsZWFycyB0aGUgbWVzcworZnJvbSB0aGUgaW5kZXggZmlsZSBhbmQgdGhlIHdvcmtpbmcgdHJlZS4KKzwzPiBNZXJnZSBhIHRvcGljIGJyYW5jaCBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaCwgd2hpY2ggcmVzdWx0ZWQKK2luIGEgZmFzdCBmb3J3YXJkLgorPDQ+IEJ1dCB5b3UgZGVjaWRlZCB0aGF0IHRoZSB0b3BpYyBicmFuY2ggaXMgbm90IHJlYWR5IGZvciBwdWJsaWMKK2NvbnN1bXB0aW9uIHlldC4gICJwdWxsIiBvciAibWVyZ2UiIGFsd2F5cyBsZWF2ZXMgdGhlIG9yaWdpbmFsCit0aXAgb2YgdGhlIGN1cnJlbnQgYnJhbmNoIGluIE9SSUdfSEVBRCwgc28gcmVzZXR0aW5nIGhhcmQgdG8gaXQKK2JyaW5ncyB5b3VyIGluZGV4IGZpbGUgYW5kIHRoZSB3b3JraW5nIHRyZWUgYmFjayB0byB0aGF0IHN0YXRlLAorYW5kIHJlc2V0cyB0aGUgdGlwIG9mIHRoZSBicmFuY2ggdG8gdGhhdCBjb21taXQuCisKK0ludGVycnVwdGVkIHdvcmtmbG93OjoKKysKK1N1cHBvc2UgeW91IGFyZSBpbnRlcnJ1cHRlZCBieSBhbiB1cmdlbnQgZml4IHJlcXVlc3Qgd2hpbGUgeW91CithcmUgaW4gdGhlIG1pZGRsZSBvZiBhIGxhcmdlIGNoYW5nZS4gIFRoZSBmaWxlcyBpbiB5b3VyCit3b3JraW5nIHRyZWUgYXJlIG5vdCBpbiBhbnkgc2hhcGUgdG8gYmUgY29tbWl0dGVkIHlldCwgYnV0IHlvdQorbmVlZCB0byBnZXQgdG8gdGhlIG90aGVyIGJyYW5jaCBmb3IgYSBxdWljayBidWdmaXguCisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IGZlYXR1cmUgOyMgeW91IHdlcmUgd29ya2luZyBpbiAiZmVhdHVyZSIgYnJhbmNoIGFuZAorJCB3b3JrIHdvcmsgd29yayAgICAgICA7IyBnb3QgaW50ZXJydXB0ZWQKKyQgZ2l0IGNvbW1pdCAtYSAtbSAic25hcHNob3QgV0lQIiAgICAgICAgICAgICAgICAgPDE+CiskIGdpdCBjaGVja291dCBtYXN0ZXIKKyQgZml4IGZpeCBmaXgKKyQgZ2l0IGNvbW1pdCA7IyBjb21taXQgd2l0aCByZWFsIGxvZworJCBnaXQgY2hlY2tvdXQgZmVhdHVyZQorJCBnaXQgcmVzZXQgLS1zb2Z0IEhFQUReIDsjIGdvIGJhY2sgdG8gV0lQIHN0YXRlICA8Mj4KKyQgZ2l0IHJlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDM+CistLS0tLS0tLS0tLS0KKysKKzwxPiBUaGlzIGNvbW1pdCB3aWxsIGdldCBibG93biBhd2F5IHNvIGEgdGhyb3ctYXdheSBsb2cgbWVzc2FnZSBpcyBPSy4KKzwyPiBUaGlzIHJlbW92ZXMgdGhlICdXSVAnIGNvbW1pdCBmcm9tIHRoZSBjb21taXQgaGlzdG9yeSwgYW5kIHNldHMKKyAgICB5b3VyIHdvcmtpbmcgdHJlZSB0byB0aGUgc3RhdGUganVzdCBiZWZvcmUgeW91IG1hZGUgdGhhdCBzbmFwc2hvdC4KKzwzPiBBdCB0aGlzIHBvaW50IHRoZSBpbmRleCBmaWxlIHN0aWxsIGhhcyBhbGwgdGhlIFdJUCBjaGFuZ2VzIHlvdQorICAgIGNvbW1pdHRlZCBhcyAnc25hcHNob3QgV0lQJy4gIFRoaXMgdXBkYXRlcyB0aGUgaW5kZXggdG8gc2hvdyB5b3VyCisgICAgV0lQIGZpbGVzIGFzIHVuY29tbWl0dGVkLgorCitSZXNldCBhIHNpbmdsZSBmaWxlIGluIHRoZSBpbmRleDo6CisrCitTdXBwb3NlIHlvdSBoYXZlIGFkZGVkIGEgZmlsZSB0byB5b3VyIGluZGV4LCBidXQgbGF0ZXIgZGVjaWRlIHlvdSBkbyBub3QKK3dhbnQgdG8gYWRkIGl0IHRvIHlvdXIgY29tbWl0LiBZb3UgY2FuIHJlbW92ZSB0aGUgZmlsZSBmcm9tIHRoZSBpbmRleAord2hpbGUga2VlcGluZyB5b3VyIGNoYW5nZXMgd2l0aCBnaXQgcmVzZXQuCisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IHJlc2V0IC0tIGZyb3R6LmMgICAgICAgICAgICAgICAgICAgICAgPDE+CiskIGdpdCBjb21taXQgLW0gIkNvbW1pdCBmaWxlcyBpbiBpbmRleCIgICAgIDwyPgorJCBnaXQgYWRkIGZyb3R6LmMgICAgICAgICAgICAgICAgICAgICAgICAgICA8Mz4KKy0tLS0tLS0tLS0tLQorKworPDE+IFRoaXMgcmVtb3ZlcyB0aGUgZmlsZSBmcm9tIHRoZSBpbmRleCB3aGlsZSBrZWVwaW5nIGl0IGluIHRoZSB3b3JraW5nCisgICAgZGlyZWN0b3J5LgorPDI+IFRoaXMgY29tbWl0cyBhbGwgb3RoZXIgY2hhbmdlcyBpbiB0aGUgaW5kZXguCis8Mz4gQWRkcyB0aGUgZmlsZSB0byB0aGUgaW5kZXggYWdhaW4uCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4gYW5kIExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcmV2LWxpc3QudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcmV2LWxpc3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MGNkZjUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXYtbGlzdC50eHQKQEAgLTAsMCArMSwxMTIgQEAKK2dpdC1yZXYtbGlzdCgxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1yZXYtbGlzdCAtIExpc3RzIGNvbW1pdCBvYmplY3RzIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlcgorCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1yZXYtbGlzdCcgWyBcLS1tYXgtY291bnQ9bnVtYmVyIF0KKwkgICAgIFsgXC0tc2tpcD1udW1iZXIgXQorCSAgICAgWyBcLS1tYXgtYWdlPXRpbWVzdGFtcCBdCisJICAgICBbIFwtLW1pbi1hZ2U9dGltZXN0YW1wIF0KKwkgICAgIFsgXC0tc3BhcnNlIF0KKwkgICAgIFsgXC0tbm8tbWVyZ2VzIF0KKwkgICAgIFsgXC0tZmlyc3QtcGFyZW50IF0KKwkgICAgIFsgXC0tcmVtb3ZlLWVtcHR5IF0KKwkgICAgIFsgXC0tZnVsbC1oaXN0b3J5IF0KKwkgICAgIFsgXC0tbm90IF0KKwkgICAgIFsgXC0tYWxsIF0KKwkgICAgIFsgXC0tYnJhbmNoZXMgXQorCSAgICAgWyBcLS10YWdzIF0KKwkgICAgIFsgXC0tcmVtb3RlcyBdCisJICAgICBbIFwtLXN0ZGluIF0KKwkgICAgIFsgXC0tcXVpZXQgXQorCSAgICAgWyBcLS10b3BvLW9yZGVyIF0KKwkgICAgIFsgXC0tcGFyZW50cyBdCisJICAgICBbIFwtLXRpbWVzdGFtcCBdCisJICAgICBbIFwtLWxlZnQtcmlnaHQgXQorCSAgICAgWyBcLS1jaGVycnktcGljayBdCisJICAgICBbIFwtLWVuY29kaW5nWz08ZW5jb2Rpbmc+XSBdCisJICAgICBbIFwtLShhdXRob3J8Y29tbWl0dGVyfGdyZXApPTxwYXR0ZXJuPiBdCisJICAgICBbIFwtLXJlZ2V4cC1pZ25vcmUtY2FzZSB8IFwtaSBdCisJICAgICBbIFwtLWV4dGVuZGVkLXJlZ2V4cCB8IFwtRSBdCisJICAgICBbIFwtLWZpeGVkLXN0cmluZ3MgfCBcLUYgXQorCSAgICAgWyBcLS1kYXRlPXtsb2NhbHxyZWxhdGl2ZXxkZWZhdWx0fGlzb3xyZmN8c2hvcnR9IF0KKwkgICAgIFsgW1wtLW9iamVjdHMgfCBcLS1vYmplY3RzLWVkZ2VdIFsgXC0tdW5wYWNrZWQgXSBdCisJICAgICBbIFwtLXByZXR0eSB8IFwtLWhlYWRlciBdCisJICAgICBbIFwtLWJpc2VjdCBdCisJICAgICBbIFwtLWJpc2VjdC12YXJzIF0KKwkgICAgIFsgXC0tYmlzZWN0LWFsbCBdCisJICAgICBbIFwtLW1lcmdlIF0KKwkgICAgIFsgXC0tcmV2ZXJzZSBdCisJICAgICBbIFwtLXdhbGstcmVmbG9ncyBdCisJICAgICBbIFwtLW5vLXdhbGsgXSBbIFwtLWRvLXdhbGsgXQorCSAgICAgPGNvbW1pdD4uLi4gWyBcLS0gPHBhdGhzPi4uLiBdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitMaXN0cyBjb21taXQgb2JqZWN0cyBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIgc3RhcnRpbmcgYXQgdGhlCitnaXZlbiBjb21taXQocyksIHRha2luZyBhbmNlc3RyeSByZWxhdGlvbnNoaXAgaW50byBhY2NvdW50LiAgVGhpcyBpcwordXNlZnVsIHRvIHByb2R1Y2UgaHVtYW4tcmVhZGFibGUgbG9nIG91dHB1dC4KKworQ29tbWl0cyB3aGljaCBhcmUgc3RhdGVkIHdpdGggYSBwcmVjZWRpbmcgJ3tjYXJldH0nIGNhdXNlIGxpc3RpbmcgdG8KK3N0b3AgYXQgdGhhdCBwb2ludC4gVGhlaXIgcGFyZW50cyBhcmUgaW1wbGllZC4gVGh1cyB0aGUgZm9sbG93aW5nCitjb21tYW5kOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSQgZ2l0LXJldi1saXN0IGZvbyBiYXIgXmJhegorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbWVhbnMgImxpc3QgYWxsIHRoZSBjb21taXRzIHdoaWNoIGFyZSBpbmNsdWRlZCBpbiAnZm9vJyBhbmQgJ2JhcicsIGJ1dAorbm90IGluICdiYXonIi4KKworQSBzcGVjaWFsIG5vdGF0aW9uICInPGNvbW1pdDE+Jy4uJzxjb21taXQyPiciIGNhbiBiZSB1c2VkIGFzIGEKK3Nob3J0LWhhbmQgZm9yICJ7Y2FyZXR9Jzxjb21taXQxPicgJzxjb21taXQyPiciLiBGb3IgZXhhbXBsZSwgZWl0aGVyIG9mCit0aGUgZm9sbG93aW5nIG1heSBiZSB1c2VkIGludGVyY2hhbmdlYWJseToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkkIGdpdC1yZXYtbGlzdCBvcmlnaW4uLkhFQUQKKwkkIGdpdC1yZXYtbGlzdCBIRUFEIF5vcmlnaW4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Fub3RoZXIgc3BlY2lhbCBub3RhdGlvbiBpcyAiJzxjb21taXQxPicuLi4nPGNvbW1pdDI+JyIgd2hpY2ggaXMgdXNlZnVsCitmb3IgbWVyZ2VzLiAgVGhlIHJlc3VsdGluZyBzZXQgb2YgY29tbWl0cyBpcyB0aGUgc3ltbWV0cmljIGRpZmZlcmVuY2UKK2JldHdlZW4gdGhlIHR3byBvcGVyYW5kcy4gIFRoZSBmb2xsb3dpbmcgdHdvIGNvbW1hbmRzIGFyZSBlcXVpdmFsZW50OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSQgZ2l0LXJldi1saXN0IEEgQiAtLW5vdCAkKGdpdC1tZXJnZS1iYXNlIC0tYWxsIEEgQikKKwkkIGdpdC1yZXYtbGlzdCBBLi4uQgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbGlua2dpdDpnaXQtcmV2LWxpc3RbMV0gaXMgYSB2ZXJ5IGVzc2VudGlhbCBnaXQgcHJvZ3JhbSwgc2luY2UgaXQKK3Byb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGJ1aWxkIGFuZCB0cmF2ZXJzZSBjb21taXQgYW5jZXN0cnkgZ3JhcGhzLiBGb3IKK3RoaXMgcmVhc29uLCBpdCBoYXMgYSBsb3Qgb2YgZGlmZmVyZW50IG9wdGlvbnMgdGhhdCBlbmFibGVzIGl0IHRvIGJlCit1c2VkIGJ5IGNvbW1hbmRzIGFzIGRpZmZlcmVudCBhcyBsaW5rZ2l0OmdpdC1iaXNlY3RbMV0gYW5kCitsaW5rZ2l0OmdpdC1yZXBhY2tbMV0uCisKK09QVElPTlMKKy0tLS0tLS0KKworOmdpdC1yZXYtbGlzdDogMQoraW5jbHVkZTo6cmV2LWxpc3Qtb3B0aW9ucy50eHRbXQorCitpbmNsdWRlOjpwcmV0dHktZm9ybWF0cy50eHRbXQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8sIEpvbmFzIEZvbnNlY2EKK2FuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJldi1wYXJzZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXYtcGFyc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MTNjMmUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXYtcGFyc2UudHh0CkBAIC0wLDAgKzEsMzg4IEBACitnaXQtcmV2LXBhcnNlKDEpCis9PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1yZXYtcGFyc2UgLSBQaWNrIG91dCBhbmQgbWFzc2FnZSBwYXJhbWV0ZXJzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXJldi1wYXJzZScgWyAtLW9wdGlvbiBdIDxhcmdzPi4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworTWFueSBnaXQgcG9yY2VsYWluaXNoIGNvbW1hbmRzIHRha2UgbWl4dHVyZSBvZiBmbGFncworKGkuZS4gcGFyYW1ldGVycyB0aGF0IGJlZ2luIHdpdGggYSBkYXNoICctJykgYW5kIHBhcmFtZXRlcnMKK21lYW50IGZvciB1bmRlcmx5aW5nIGBnaXQtcmV2LWxpc3RgIGNvbW1hbmQgdGhleSB1c2UgaW50ZXJuYWxseQorYW5kIGZsYWdzIGFuZCBwYXJhbWV0ZXJzIGZvciBvdGhlciBjb21tYW5kcyB0aGV5IHVzZSBhcyB0aGUKK2Rvd25zdHJlYW0gb2YgYGdpdC1yZXYtbGlzdGAuICBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0bworZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGVtLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy0tcGFyc2VvcHQ6OgorCVVzZSBgZ2l0LXJldi1wYXJzZWAgaW4gb3B0aW9uIHBhcnNpbmcgbW9kZSAoc2VlIFBBUlNFT1BUIHNlY3Rpb24gYmVsb3cpLgorCistLWtlZXAtZGFzaC1kYXNoOjoKKwlPbmx5IG1lYW5pbmdmdWwgaW4gYC0tcGFyc2VvcHRgIG1vZGUuIFRlbGxzIHRoZSBvcHRpb24gcGFyc2VyIHRvIGVjaG8KKwlvdXQgdGhlIGZpcnN0IGAtLWAgbWV0IGluc3RlYWQgb2Ygc2tpcHBpbmcgaXQuCisKKy0tcmV2cy1vbmx5OjoKKwlEbyBub3Qgb3V0cHV0IGZsYWdzIGFuZCBwYXJhbWV0ZXJzIG5vdCBtZWFudCBmb3IKKwlgZ2l0LXJldi1saXN0YCBjb21tYW5kLgorCistLW5vLXJldnM6OgorCURvIG5vdCBvdXRwdXQgZmxhZ3MgYW5kIHBhcmFtZXRlcnMgbWVhbnQgZm9yCisJYGdpdC1yZXYtbGlzdGAgY29tbWFuZC4KKworLS1mbGFnczo6CisJRG8gbm90IG91dHB1dCBub24tZmxhZyBwYXJhbWV0ZXJzLgorCistLW5vLWZsYWdzOjoKKwlEbyBub3Qgb3V0cHV0IGZsYWcgcGFyYW1ldGVycy4KKworLS1kZWZhdWx0IDxhcmc+OjoKKwlJZiB0aGVyZSBpcyBubyBwYXJhbWV0ZXIgZ2l2ZW4gYnkgdGhlIHVzZXIsIHVzZSBgPGFyZz5gCisJaW5zdGVhZC4KKworLS12ZXJpZnk6OgorCVRoZSBwYXJhbWV0ZXIgZ2l2ZW4gbXVzdCBiZSB1c2FibGUgYXMgYSBzaW5nbGUsIHZhbGlkCisJb2JqZWN0IG5hbWUuICBPdGhlcndpc2UgYmFyZiBhbmQgYWJvcnQuCisKKy0tc3E6OgorCVVzdWFsbHkgdGhlIG91dHB1dCBpcyBtYWRlIG9uZSBsaW5lIHBlciBmbGFnIGFuZAorCXBhcmFtZXRlci4gIFRoaXMgb3B0aW9uIG1ha2VzIG91dHB1dCBhIHNpbmdsZSBsaW5lLAorCXByb3Blcmx5IHF1b3RlZCBmb3IgY29uc3VtcHRpb24gYnkgc2hlbGwuICBVc2VmdWwgd2hlbgorCXlvdSBleHBlY3QgeW91ciBwYXJhbWV0ZXIgdG8gY29udGFpbiB3aGl0ZXNwYWNlcyBhbmQKKwluZXdsaW5lcyAoZS5nLiB3aGVuIHVzaW5nIHBpY2theGUgYC1TYCB3aXRoCisJYGdpdC1kaWZmLVwqYCkuCisKKy0tbm90OjoKKwlXaGVuIHNob3dpbmcgb2JqZWN0IG5hbWVzLCBwcmVmaXggdGhlbSB3aXRoICd7Y2FyZXR9JyBhbmQKKwlzdHJpcCAne2NhcmV0fScgcHJlZml4IGZyb20gdGhlIG9iamVjdCBuYW1lcyB0aGF0IGFscmVhZHkgaGF2ZQorCW9uZS4KKworLS1zeW1ib2xpYzo6CisJVXN1YWxseSB0aGUgb2JqZWN0IG5hbWVzIGFyZSBvdXRwdXQgaW4gU0hBMSBmb3JtICh3aXRoCisJcG9zc2libGUgJ3tjYXJldH0nIHByZWZpeCk7IHRoaXMgb3B0aW9uIG1ha2VzIHRoZW0gb3V0cHV0IGluIGEKKwlmb3JtIGFzIGNsb3NlIHRvIHRoZSBvcmlnaW5hbCBpbnB1dCBhcyBwb3NzaWJsZS4KKworLS1zeW1ib2xpYy1mdWxsLW5hbWU6OgorCVRoaXMgaXMgc2ltaWxhciB0byBcLS1zeW1ib2xpYywgYnV0IGl0IG9taXRzIGlucHV0IHRoYXQKKwlhcmUgbm90IHJlZnMgKGkuZS4gYnJhbmNoIG9yIHRhZyBuYW1lczsgb3IgbW9yZQorCWV4cGxpY2l0bHkgZGlzYW1iaWd1YXRpbmcgImhlYWRzL21hc3RlciIgZm9ybSwgd2hlbiB5b3UKKwl3YW50IHRvIG5hbWUgdGhlICJtYXN0ZXIiIGJyYW5jaCB3aGVuIHRoZXJlIGlzIGFuCisJdW5mb3J0dW5hdGVseSBuYW1lZCB0YWcgIm1hc3RlciIpLCBhbmQgc2hvdyB0aGVtIGFzIGZ1bGwKKwlyZWZuYW1lcyAoZS5nLiAicmVmcy9oZWFkcy9tYXN0ZXIiKS4KKworLS1hbGw6OgorCVNob3cgYWxsIHJlZnMgZm91bmQgaW4gYCRHSVRfRElSL3JlZnNgLgorCistLWJyYW5jaGVzOjoKKwlTaG93IGJyYW5jaCByZWZzIGZvdW5kIGluIGAkR0lUX0RJUi9yZWZzL2hlYWRzYC4KKworLS10YWdzOjoKKwlTaG93IHRhZyByZWZzIGZvdW5kIGluIGAkR0lUX0RJUi9yZWZzL3RhZ3NgLgorCistLXJlbW90ZXM6OgorCVNob3cgdGFnIHJlZnMgZm91bmQgaW4gYCRHSVRfRElSL3JlZnMvcmVtb3Rlc2AuCisKKy0tc2hvdy1wcmVmaXg6OgorCVdoZW4gdGhlIGNvbW1hbmQgaXMgaW52b2tlZCBmcm9tIGEgc3ViZGlyZWN0b3J5LCBzaG93IHRoZQorCXBhdGggb2YgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHRoZSB0b3AtbGV2ZWwKKwlkaXJlY3RvcnkuCisKKy0tc2hvdy1jZHVwOjoKKwlXaGVuIHRoZSBjb21tYW5kIGlzIGludm9rZWQgZnJvbSBhIHN1YmRpcmVjdG9yeSwgc2hvdyB0aGUKKwlwYXRoIG9mIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50CisJZGlyZWN0b3J5ICh0eXBpY2FsbHkgYSBzZXF1ZW5jZSBvZiAiLi4vIiwgb3IgYW4gZW1wdHkgc3RyaW5nKS4KKworLS1naXQtZGlyOjoKKwlTaG93IGAkR0lUX0RJUmAgaWYgZGVmaW5lZCBlbHNlIHNob3cgdGhlIHBhdGggdG8gdGhlIC5naXQgZGlyZWN0b3J5LgorCistLWlzLWluc2lkZS1naXQtZGlyOjoKKwlXaGVuIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlzIGJlbG93IHRoZSByZXBvc2l0b3J5CisJZGlyZWN0b3J5IHByaW50ICJ0cnVlIiwgb3RoZXJ3aXNlICJmYWxzZSIuCisKKy0taXMtaW5zaWRlLXdvcmstdHJlZTo6CisJV2hlbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpcyBpbnNpZGUgdGhlIHdvcmsgdHJlZSBvZiB0aGUKKwlyZXBvc2l0b3J5IHByaW50ICJ0cnVlIiwgb3RoZXJ3aXNlICJmYWxzZSIuCisKKy0taXMtYmFyZS1yZXBvc2l0b3J5OjoKKwlXaGVuIHRoZSByZXBvc2l0b3J5IGlzIGJhcmUgcHJpbnQgInRydWUiLCBvdGhlcndpc2UgImZhbHNlIi4KKworLS1zaG9ydCwgLS1zaG9ydD1udW1iZXI6OgorCUluc3RlYWQgb2Ygb3V0cHV0dGluZyB0aGUgZnVsbCBTSEExIHZhbHVlcyBvZiBvYmplY3QgbmFtZXMgdHJ5IHRvCisJYWJicmV2aWF0ZSB0aGVtIHRvIGEgc2hvcnRlciB1bmlxdWUgbmFtZS4gV2hlbiBubyBsZW5ndGggaXMgc3BlY2lmaWVkCisJNyBpcyB1c2VkLiBUaGUgbWluaW11bSBsZW5ndGggaXMgNC4KKworLS1zaW5jZT1kYXRlc3RyaW5nLCAtLWFmdGVyPWRhdGVzdHJpbmc6OgorCVBhcnNlcyB0aGUgZGF0ZSBzdHJpbmcsIGFuZCBvdXRwdXRzIGNvcnJlc3BvbmRpbmcKKwktLW1heC1hZ2U9IHBhcmFtZXRlciBmb3IgZ2l0LXJldi1saXN0IGNvbW1hbmQuCisKKy0tdW50aWw9ZGF0ZXN0cmluZywgLS1iZWZvcmU9ZGF0ZXN0cmluZzo6CisJUGFyc2VzIHRoZSBkYXRlIHN0cmluZywgYW5kIG91dHB1dHMgY29ycmVzcG9uZGluZworCS0tbWluLWFnZT0gcGFyYW1ldGVyIGZvciBnaXQtcmV2LWxpc3QgY29tbWFuZC4KKworPGFyZ3M+Li4uOjoKKwlGbGFncyBhbmQgcGFyYW1ldGVycyB0byBiZSBwYXJzZWQuCisKKworU1BFQ0lGWUlORyBSRVZJU0lPTlMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgcmV2aXNpb24gcGFyYW1ldGVyIHR5cGljYWxseSwgYnV0IG5vdCBuZWNlc3NhcmlseSwgbmFtZXMgYQorY29tbWl0IG9iamVjdC4gIFRoZXkgdXNlIHdoYXQgaXMgY2FsbGVkIGFuICdleHRlbmRlZCBTSEExJworc3ludGF4LiAgSGVyZSBhcmUgdmFyaW91cyB3YXlzIHRvIHNwZWxsIG9iamVjdCBuYW1lcy4gIFRoZQorb25lcyBsaXN0ZWQgbmVhciB0aGUgZW5kIG9mIHRoaXMgbGlzdCBhcmUgdG8gbmFtZSB0cmVlcyBhbmQKK2Jsb2JzIGNvbnRhaW5lZCBpbiBhIGNvbW1pdC4KKworKiBUaGUgZnVsbCBTSEExIG9iamVjdCBuYW1lICg0MC1ieXRlIGhleGFkZWNpbWFsIHN0cmluZyksIG9yCisgIGEgc3Vic3RyaW5nIG9mIHN1Y2ggdGhhdCBpcyB1bmlxdWUgd2l0aGluIHRoZSByZXBvc2l0b3J5LgorICBFLmcuIGRhZTg2ZTE5NTBiMTI3N2U1NDVjZWUxODA1NTE3NTAwMjljZmU3MzUgYW5kIGRhZTg2ZSBib3RoCisgIG5hbWUgdGhlIHNhbWUgY29tbWl0IG9iamVjdCBpZiB0aGVyZSBhcmUgbm8gb3RoZXIgb2JqZWN0IGluCisgIHlvdXIgcmVwb3NpdG9yeSB3aG9zZSBvYmplY3QgbmFtZSBzdGFydHMgd2l0aCBkYWU4NmUuCisKKyogQW4gb3V0cHV0IGZyb20gYGdpdC1kZXNjcmliZWA7IGkuZS4gYSBjbG9zZXN0IHRhZywgZm9sbG93ZWQgYnkgYQorICBkYXNoLCBhIGBnYCwgYW5kIGFuIGFiYnJldmlhdGVkIG9iamVjdCBuYW1lLgorCisqIEEgc3ltYm9saWMgcmVmIG5hbWUuICBFLmcuICdtYXN0ZXInIHR5cGljYWxseSBtZWFucyB0aGUgY29tbWl0CisgIG9iamVjdCByZWZlcmVuY2VkIGJ5ICRHSVRfRElSL3JlZnMvaGVhZHMvbWFzdGVyLiAgSWYgeW91CisgIGhhcHBlbiB0byBoYXZlIGJvdGggaGVhZHMvbWFzdGVyIGFuZCB0YWdzL21hc3RlciwgeW91IGNhbgorICBleHBsaWNpdGx5IHNheSAnaGVhZHMvbWFzdGVyJyB0byB0ZWxsIGdpdCB3aGljaCBvbmUgeW91IG1lYW4uCisgIFdoZW4gYW1iaWd1b3VzLCBhIGA8bmFtZT5gIGlzIGRpc2FtYmlndWF0ZWQgYnkgdGFraW5nIHRoZQorICBmaXJzdCBtYXRjaCBpbiB0aGUgZm9sbG93aW5nIHJ1bGVzOgorCisgIC4gaWYgYCRHSVRfRElSLzxuYW1lPmAgZXhpc3RzLCB0aGF0IGlzIHdoYXQgeW91IG1lYW4gKHRoaXMgaXMgdXN1YWxseQorICAgIHVzZWZ1bCBvbmx5IGZvciBgSEVBRGAsIGBGRVRDSF9IRUFEYCBhbmQgYE1FUkdFX0hFQURgKTsKKworICAuIG90aGVyd2lzZSwgYCRHSVRfRElSL3JlZnMvPG5hbWU+YCBpZiBleGlzdHM7CisKKyAgLiBvdGhlcndpc2UsIGAkR0lUX0RJUi9yZWZzL3RhZ3MvPG5hbWU+YCBpZiBleGlzdHM7CisKKyAgLiBvdGhlcndpc2UsIGAkR0lUX0RJUi9yZWZzL2hlYWRzLzxuYW1lPmAgaWYgZXhpc3RzOworCisgIC4gb3RoZXJ3aXNlLCBgJEdJVF9ESVIvcmVmcy9yZW1vdGVzLzxuYW1lPmAgaWYgZXhpc3RzOworCisgIC4gb3RoZXJ3aXNlLCBgJEdJVF9ESVIvcmVmcy9yZW1vdGVzLzxuYW1lPi9IRUFEYCBpZiBleGlzdHMuCisKKyogQSByZWYgZm9sbG93ZWQgYnkgdGhlIHN1ZmZpeCAnQCcgd2l0aCBhIGRhdGUgc3BlY2lmaWNhdGlvbgorICBlbmNsb3NlZCBpbiBhIGJyYWNlCisgIHBhaXIgKGUuZy4gJ1x7eWVzdGVyZGF5XH0nLCAnXHsxIG1vbnRoIDIgd2Vla3MgMyBkYXlzIDEgaG91ciAxCisgIHNlY29uZCBhZ29cfScgb3IgJ1x7MTk3OS0wMi0yNiAxODozMDowMFx9JykgdG8gc3BlY2lmeSB0aGUgdmFsdWUKKyAgb2YgdGhlIHJlZiBhdCBhIHByaW9yIHBvaW50IGluIHRpbWUuICBUaGlzIHN1ZmZpeCBtYXkgb25seSBiZQorICB1c2VkIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhIHJlZiBuYW1lIGFuZCB0aGUgcmVmIG11c3QgaGF2ZSBhbgorICBleGlzdGluZyBsb2cgKCRHSVRfRElSL2xvZ3MvPHJlZj4pLgorCisqIEEgcmVmIGZvbGxvd2VkIGJ5IHRoZSBzdWZmaXggJ0AnIHdpdGggYW4gb3JkaW5hbCBzcGVjaWZpY2F0aW9uCisgIGVuY2xvc2VkIGluIGEgYnJhY2UgcGFpciAoZS5nLiAnXHsxXH0nLCAnXHsxNVx9JykgdG8gc3BlY2lmeQorICB0aGUgbi10aCBwcmlvciB2YWx1ZSBvZiB0aGF0IHJlZi4gIEZvciBleGFtcGxlICdtYXN0ZXJAXHsxXH0nCisgIGlzIHRoZSBpbW1lZGlhdGUgcHJpb3IgdmFsdWUgb2YgJ21hc3Rlcicgd2hpbGUgJ21hc3RlckBcezVcfScKKyAgaXMgdGhlIDV0aCBwcmlvciB2YWx1ZSBvZiAnbWFzdGVyJy4gVGhpcyBzdWZmaXggbWF5IG9ubHkgYmUgdXNlZAorICBpbW1lZGlhdGVseSBmb2xsb3dpbmcgYSByZWYgbmFtZSBhbmQgdGhlIHJlZiBtdXN0IGhhdmUgYW4gZXhpc3RpbmcKKyAgbG9nICgkR0lUX0RJUi9sb2dzLzxyZWY+KS4KKworKiBZb3UgY2FuIHVzZSB0aGUgJ0AnIGNvbnN0cnVjdCB3aXRoIGFuIGVtcHR5IHJlZiBwYXJ0IHRvIGdldCBhdCBhCisgIHJlZmxvZyBvZiB0aGUgY3VycmVudCBicmFuY2guIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlIG9uIHRoZQorICBicmFuY2ggJ2JsYWJsYScsIHRoZW4gJ0BcezFcfScgbWVhbnMgdGhlIHNhbWUgYXMgJ2JsYWJsYUBcezFcfScuCisKKyogQSBzdWZmaXggJ3tjYXJldH0nIHRvIGEgcmV2aXNpb24gcGFyYW1ldGVyIG1lYW5zIHRoZSBmaXJzdCBwYXJlbnQgb2YKKyAgdGhhdCBjb21taXQgb2JqZWN0LiAgJ3tjYXJldH08bj4nIG1lYW5zIHRoZSA8bj50aCBwYXJlbnQgKGkuZS4KKyAgJ3JldntjYXJldH0nCisgIGlzIGVxdWl2YWxlbnQgdG8gJ3JldntjYXJldH0xJykuICBBcyBhIHNwZWNpYWwgcnVsZSwKKyAgJ3JldntjYXJldH0wJyBtZWFucyB0aGUgY29tbWl0IGl0c2VsZiBhbmQgaXMgdXNlZCB3aGVuICdyZXYnIGlzIHRoZQorICBvYmplY3QgbmFtZSBvZiBhIHRhZyBvYmplY3QgdGhhdCByZWZlcnMgdG8gYSBjb21taXQgb2JqZWN0LgorCisqIEEgc3VmZml4ICd7dGlsZGV9PG4+JyB0byBhIHJldmlzaW9uIHBhcmFtZXRlciBtZWFucyB0aGUgY29tbWl0CisgIG9iamVjdCB0aGF0IGlzIHRoZSA8bj50aCBnZW5lcmF0aW9uIGdyYW5kLXBhcmVudCBvZiB0aGUgbmFtZWQKKyAgY29tbWl0IG9iamVjdCwgZm9sbG93aW5nIG9ubHkgdGhlIGZpcnN0IHBhcmVudC4gIEkuZS4gcmV2fjMgaXMKKyAgZXF1aXZhbGVudCB0byByZXZ7Y2FyZXR9e2NhcmV0fXtjYXJldH0gd2hpY2ggaXMgZXF1aXZhbGVudCB0bworICByZXZ7Y2FyZXR9MXtjYXJldH0xe2NhcmV0fTEuICBTZWUgYmVsb3cgZm9yIGEgaWxsdXN0cmF0aW9uIG9mCisgIHRoZSB1c2FnZSBvZiB0aGlzIGZvcm0uCisKKyogQSBzdWZmaXggJ3tjYXJldH0nIGZvbGxvd2VkIGJ5IGFuIG9iamVjdCB0eXBlIG5hbWUgZW5jbG9zZWQgaW4KKyAgYnJhY2UgcGFpciAoZS5nLiBgdjAuOTkuOHtjYXJldH1ce2NvbW1pdFx9YCkgbWVhbnMgdGhlIG9iamVjdAorICBjb3VsZCBiZSBhIHRhZywgYW5kIGRlcmVmZXJlbmNlIHRoZSB0YWcgcmVjdXJzaXZlbHkgdW50aWwgYW4KKyAgb2JqZWN0IG9mIHRoYXQgdHlwZSBpcyBmb3VuZCBvciB0aGUgb2JqZWN0IGNhbm5vdCBiZQorICBkZXJlZmVyZW5jZWQgYW55bW9yZSAoaW4gd2hpY2ggY2FzZSwgYmFyZikuICBgcmV2e2NhcmV0fTBgCisgIGludHJvZHVjZWQgZWFybGllciBpcyBhIHNob3J0LWhhbmQgZm9yIGByZXZ7Y2FyZXR9XHtjb21taXRcfWAuCisKKyogQSBzdWZmaXggJ3tjYXJldH0nIGZvbGxvd2VkIGJ5IGFuIGVtcHR5IGJyYWNlIHBhaXIKKyAgKGUuZy4gYHYwLjk5Ljh7Y2FyZXR9XHtcfWApIG1lYW5zIHRoZSBvYmplY3QgY291bGQgYmUgYSB0YWcsCisgIGFuZCBkZXJlZmVyZW5jZSB0aGUgdGFnIHJlY3Vyc2l2ZWx5IHVudGlsIGEgbm9uLXRhZyBvYmplY3QgaXMKKyAgZm91bmQuCisKKyogQSBjb2xvbiwgZm9sbG93ZWQgYnkgYSBzbGFzaCwgZm9sbG93ZWQgYnkgYSB0ZXh0OiB0aGlzIG5hbWVzCisgIGEgY29tbWl0IHdob3NlIGNvbW1pdCBtZXNzYWdlIHN0YXJ0cyB3aXRoIHRoZSBzcGVjaWZpZWQgdGV4dC4KKyAgVGhpcyBuYW1lIHJldHVybnMgdGhlIHlvdW5nZXN0IG1hdGNoaW5nIGNvbW1pdCB3aGljaCBpcworICByZWFjaGFibGUgZnJvbSBhbnkgcmVmLiAgSWYgdGhlIGNvbW1pdCBtZXNzYWdlIHN0YXJ0cyB3aXRoIGEKKyAgJyEnLCB5b3UgaGF2ZSB0byByZXBlYXQgdGhhdDsgIHRoZSBzcGVjaWFsIHNlcXVlbmNlICc6LyEnLAorICBmb2xsb3dlZCBieSBzb21ldGhpbmcgZWxzZSB0aGFuICchJyBpcyByZXNlcnZlZCBmb3Igbm93LgorCisqIEEgc3VmZml4ICc6JyBmb2xsb3dlZCBieSBhIHBhdGg7IHRoaXMgbmFtZXMgdGhlIGJsb2Igb3IgdHJlZQorICBhdCB0aGUgZ2l2ZW4gcGF0aCBpbiB0aGUgdHJlZS1pc2ggb2JqZWN0IG5hbWVkIGJ5IHRoZSBwYXJ0CisgIGJlZm9yZSB0aGUgY29sb24uCisKKyogQSBjb2xvbiwgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIHN0YWdlIG51bWJlciAoMCB0byAzKSBhbmQgYQorICBjb2xvbiwgZm9sbG93ZWQgYnkgYSBwYXRoOyB0aGlzIG5hbWVzIGEgYmxvYiBvYmplY3QgaW4gdGhlCisgIGluZGV4IGF0IHRoZSBnaXZlbiBwYXRoLiAgTWlzc2luZyBzdGFnZSBudW1iZXIgKGFuZCB0aGUgY29sb24KKyAgdGhhdCBmb2xsb3dzIGl0KSBuYW1lcyBhIHN0YWdlIDAgZW50cnkuIER1cmluZyBhIG1lcmdlLCBzdGFnZQorICAxIGlzIHRoZSBjb21tb24gYW5jZXN0b3IsIHN0YWdlIDIgaXMgdGhlIHRhcmdldCBicmFuY2gncyB2ZXJzaW9uCisgICh0eXBpY2FsbHkgdGhlIGN1cnJlbnQgYnJhbmNoKSwgYW5kIHN0YWdlIDMgaXMgdGhlIHZlcnNpb24gZnJvbQorICB0aGUgYnJhbmNoIGJlaW5nIG1lcmdlZC4KKworSGVyZSBpcyBhbiBpbGx1c3RyYXRpb24sIGJ5IEpvbiBMb2VsaWdlci4gIEJvdGggY29tbWl0IG5vZGVzIEIKK2FuZCBDIGFyZSBwYXJlbnRzIG9mIGNvbW1pdCBub2RlIEEuICBQYXJlbnQgY29tbWl0cyBhcmUgb3JkZXJlZAorbGVmdC10by1yaWdodC4KKworICAgIEcgICBIICAgSSAgIEoKKyAgICAgXCAvICAgICBcIC8KKyAgICAgIEQgICBFICAgRgorICAgICAgIFwgIHwgIC8gXCAKKyAgICAgICAgXCB8IC8gICB8CisgICAgICAgICBcfC8gICAgfAorICAgICAgICAgIEIgICAgIEMKKyAgICAgICAgICAgXCAgIC8KKyAgICAgICAgICAgIFwgLworICAgICAgICAgICAgIEEKKworICAgIEEgPSAgICAgID0gQV4wCisgICAgQiA9IEFeICAgPSBBXjEgICAgID0gQX4xCisgICAgQyA9IEFeMiAgPSBBXjIKKyAgICBEID0gQV5eICA9IEFeMV4xICAgPSBBfjIKKyAgICBFID0gQl4yICA9IEFeXjIKKyAgICBGID0gQl4zICA9IEFeXjMKKyAgICBHID0gQV5eXiA9IEFeMV4xXjEgPSBBfjMKKyAgICBIID0gRF4yICA9IEJeXjIgICAgPSBBXl5eMiAgPSBBfjJeMgorICAgIEkgPSBGXiAgID0gQl4zXiAgICA9IEFeXjNeCisgICAgSiA9IEZeMiAgPSBCXjNeMiAgID0gQV5eM14yCisKKworU1BFQ0lGWUlORyBSQU5HRVMKKy0tLS0tLS0tLS0tLS0tLS0tCisKK0hpc3RvcnkgdHJhdmVyc2luZyBjb21tYW5kcyBzdWNoIGFzIGBnaXQtbG9nYCBvcGVyYXRlIG9uIGEgc2V0CitvZiBjb21taXRzLCBub3QganVzdCBhIHNpbmdsZSBjb21taXQuICBUbyB0aGVzZSBjb21tYW5kcywKK3NwZWNpZnlpbmcgYSBzaW5nbGUgcmV2aXNpb24gd2l0aCB0aGUgbm90YXRpb24gZGVzY3JpYmVkIGluIHRoZQorcHJldmlvdXMgc2VjdGlvbiBtZWFucyB0aGUgc2V0IG9mIGNvbW1pdHMgcmVhY2hhYmxlIGZyb20gdGhhdAorY29tbWl0LCBmb2xsb3dpbmcgdGhlIGNvbW1pdCBhbmNlc3RyeSBjaGFpbi4KKworVG8gZXhjbHVkZSBjb21taXRzIHJlYWNoYWJsZSBmcm9tIGEgY29tbWl0LCBhIHByZWZpeCBge2NhcmV0fWAKK25vdGF0aW9uIGlzIHVzZWQuICBFLmcuICJge2NhcmV0fXIxIHIyYCIgbWVhbnMgY29tbWl0cyByZWFjaGFibGUKK2Zyb20gYHIyYCBidXQgZXhjbHVkZSB0aGUgb25lcyByZWFjaGFibGUgZnJvbSBgcjFgLgorCitUaGlzIHNldCBvcGVyYXRpb24gYXBwZWFycyBzbyBvZnRlbiB0aGF0IHRoZXJlIGlzIGEgc2hvcnRoYW5kCitmb3IgaXQuICAiYHIxLi5yMmAiIGlzIGVxdWl2YWxlbnQgdG8gImB7Y2FyZXR9cjEgcjJgIi4gIEl0IGlzCit0aGUgZGlmZmVyZW5jZSBvZiB0d28gc2V0cyAoc3VidHJhY3QgdGhlIHNldCBvZiBjb21taXRzCityZWFjaGFibGUgZnJvbSBgcjFgIGZyb20gdGhlIHNldCBvZiBjb21taXRzIHJlYWNoYWJsZSBmcm9tCitgcjJgKS4KKworQSBzaW1pbGFyIG5vdGF0aW9uICJgcjFcLi4ucjJgIiBpcyBjYWxsZWQgc3ltbWV0cmljIGRpZmZlcmVuY2UKK29mIGByMWAgYW5kIGByMmAgYW5kIGlzIGRlZmluZWQgYXMKKyJgcjEgcjIgLS1ub3QgJChnaXQtbWVyZ2UtYmFzZSAtLWFsbCByMSByMilgIi4KK0l0IGlzIHRoZSBzZXQgb2YgY29tbWl0cyB0aGF0IGFyZSByZWFjaGFibGUgZnJvbSBlaXRoZXIgb25lIG9mCitgcjFgIG9yIGByMmAgYnV0IG5vdCBmcm9tIGJvdGguCisKK1R3byBvdGhlciBzaG9ydGhhbmRzIGZvciBuYW1pbmcgYSBzZXQgdGhhdCBpcyBmb3JtZWQgYnkgYSBjb21taXQKK2FuZCBpdHMgcGFyZW50IGNvbW1pdHMgZXhpc3RzLiAgYHIxe2NhcmV0fUBgIG5vdGF0aW9uIG1lYW5zIGFsbAorcGFyZW50cyBvZiBgcjFgLiAgYHIxe2NhcmV0fSFgIGluY2x1ZGVzIGNvbW1pdCBgcjFgIGJ1dCBleGNsdWRlcworaXRzIGFsbCBwYXJlbnRzLgorCitIZXJlIGFyZSBhIGhhbmRmdWwgb2YgZXhhbXBsZXM6CisKKyAgIEQgICAgICAgICAgICAgICAgRyBIIEQKKyAgIEQgRiAgICAgICAgICAgICAgRyBIIEkgSiBEIEYKKyAgIF5HIEQgICAgICAgICAgICAgSCBECisgICBeRCBCICAgICAgICAgICAgIEUgSSBKIEYgQgorICAgQi4uLkMgICAgICAgICAgICBHIEggRCBFIEIgQworICAgXkQgQiBDICAgICAgICAgICBFIEkgSiBGIEIgQworICAgQ15AICAgICAgICAgICAgICBJIEogRgorICAgRl4hIEQgICAgICAgICAgICBHIEggRCBGCisKK1BBUlNFT1BUCistLS0tLS0tLQorCitJbiBgLS1wYXJzZW9wdGAgbW9kZSwgYGdpdC1yZXYtcGFyc2VgIGhlbHBzIG1hc3NhZ2luZyBvcHRpb25zIHRvIGJyaW5nIHRvIHNoZWxsCitzY3JpcHRzIHRoZSBzYW1lIGZhY2lsaXRpZXMgQyBidWlsdGlucyBoYXZlLiBJdCB3b3JrcyBhcyBhbiBvcHRpb24gbm9ybWFsaXplcgorKGUuZy4gc3BsaXRzIHNpbmdsZSBzd2l0Y2hlcyBhZ2dyZWdhdGUgdmFsdWVzKSwgYSBiaXQgbGlrZSBgZ2V0b3B0KDEpYCBkb2VzLgorCitJdCB0YWtlcyBvbiB0aGUgc3RhbmRhcmQgaW5wdXQgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIG9wdGlvbnMgdG8gcGFyc2UgYW5kCit1bmRlcnN0YW5kLCBhbmQgZWNob2VzIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQgYSBsaW5lIHN1aXRhYmxlIGZvciBgc2goMSlgIGBldmFsYAordG8gcmVwbGFjZSB0aGUgYXJndW1lbnRzIHdpdGggbm9ybWFsaXplZCBvbmVzLiAgSW4gY2FzZSBvZiBlcnJvciwgaXQgb3V0cHV0cwordXNhZ2Ugb24gdGhlIHN0YW5kYXJkIGVycm9yIHN0cmVhbSwgYW5kIGV4aXRzIHdpdGggY29kZSAxMjkuCisKK0lucHV0IEZvcm1hdAorfn5+fn5+fn5+fn5+CisKK2BnaXQtcmV2LXBhcnNlIC0tcGFyc2VvcHRgIGlucHV0IGZvcm1hdCBpcyBmdWxseSB0ZXh0IGJhc2VkLiBJdCBoYXMgdHdvIHBhcnRzLAorc2VwYXJhdGVkIGJ5IGEgbGluZSB0aGF0IGNvbnRhaW5zIG9ubHkgYC0tYC4gVGhlIGxpbmVzIGJlZm9yZSB0aGUgc2VwYXJhdG9yCisoc2hvdWxkIGJlIG1vcmUgdGhhbiBvbmUpIGFyZSB1c2VkIGZvciB0aGUgdXNhZ2UuCitUaGUgbGluZXMgYWZ0ZXIgdGhlIHNlcGFyYXRvciBkZXNjcmliZSB0aGUgb3B0aW9ucy4KKworRWFjaCBsaW5lIG9mIG9wdGlvbnMgaGFzIHRoaXMgZm9ybWF0OgorCistLS0tLS0tLS0tLS0KKzxvcHRfc3BlYz48ZmxhZ3M+KiBTUCsgaGVscCBMRgorLS0tLS0tLS0tLS0tCisKK2A8b3B0X3NwZWM+YDo6CisJaXRzIGZvcm1hdCBpcyB0aGUgc2hvcnQgb3B0aW9uIGNoYXJhY3RlciwgdGhlbiB0aGUgbG9uZyBvcHRpb24gbmFtZQorCXNlcGFyYXRlZCBieSBhIGNvbW1hLiBCb3RoIHBhcnRzIGFyZSBub3QgcmVxdWlyZWQsIHRob3VnaCBhdCBsZWFzdCBvbmUKKwlpcyBuZWNlc3NhcnkuIGBoLGhlbHBgLCBgZHJ5LXJ1bmAgYW5kIGBmYCBhcmUgYWxsIHRocmVlIGNvcnJlY3QKKwlgPG9wdF9zcGVjPmAuCisKK2A8ZmxhZ3M+YDo6CisJYDxmbGFncz5gIGFyZSBvZiBgKmAsIGA9YCwgYD9gIG9yIGAhYC4KKwkqIFVzZSBgPWAgaWYgdGhlIG9wdGlvbiB0YWtlcyBhbiBhcmd1bWVudC4KKworCSogVXNlIGA/YCB0byBtZWFuIHRoYXQgdGhlIG9wdGlvbiBpcyBvcHRpb25hbCAodGhvdWdoIGl0cyB1c2UgaXMgZGlzY291cmFnZWQpLgorCisJKiBVc2UgYCpgIHRvIG1lYW4gdGhhdCB0aGlzIG9wdGlvbiBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgdXNhZ2UKKwkgIGdlbmVyYXRlZCBmb3IgdGhlIGAtaGAgYXJndW1lbnQuIEl0J3Mgc2hvd24gZm9yIGAtLWhlbHAtYWxsYCBhcworCSAgZG9jdW1lbnRlZCBpbiBsaW5rZ2l0OmdpdGNsaVs1XS4KKworCSogVXNlIGAhYCB0byBub3QgbWFrZSB0aGUgY29ycmVzcG9uZGluZyBuZWdhdGVkIGxvbmcgb3B0aW9uIGF2YWlsYWJsZS4KKworVGhlIHJlbWFpbmRlciBvZiB0aGUgbGluZSwgYWZ0ZXIgc3RyaXBwaW5nIHRoZSBzcGFjZXMsIGlzIHVzZWQKK2FzIHRoZSBoZWxwIGFzc29jaWF0ZWQgdG8gdGhlIG9wdGlvbi4KKworQmxhbmsgbGluZXMgYXJlIGlnbm9yZWQsIGFuZCBsaW5lcyB0aGF0IGRvbid0IG1hdGNoIHRoaXMgc3BlY2lmaWNhdGlvbiBhcmUgdXNlZAorYXMgb3B0aW9uIGdyb3VwIGhlYWRlcnMgKHN0YXJ0IHRoZSBsaW5lIHdpdGggYSBzcGFjZSB0byBjcmVhdGUgc3VjaAorbGluZXMgb24gcHVycG9zZSkuCisKK0V4YW1wbGUKK35+fn5+fn4KKworLS0tLS0tLS0tLS0tCitPUFRTX1NQRUM9IlwKK3NvbWUtY29tbWFuZCBbb3B0aW9uc10gPGFyZ3M+Li4uCisKK3NvbWUtY29tbWFuZCBkb2VzIGZvbyBhbmQgYmFyIQorLS0KK2gsaGVscCAgICBzaG93IHRoZSBoZWxwCisKK2ZvbyAgICAgICBzb21lIG5pZnR5IG9wdGlvbiAtLWZvbworYmFyPSAgICAgIHNvbWUgY29vbCBvcHRpb24gLS1iYXIgd2l0aCBhbiBhcmd1bWVudAorCisgIEFuIG9wdGlvbiBncm91cCBIZWFkZXIKK0M/ICAgICAgICBvcHRpb24gQyB3aXRoIGFuIG9wdGlvbmFsIGFyZ3VtZW50IgorCitldmFsIGBlY2hvICIkT1BUU19TUEVDIiB8IGdpdC1yZXYtcGFyc2UgLS1wYXJzZW9wdCAtLSAiJEAiIHx8IGVjaG8gZXhpdCAkP2AKKy0tLS0tLS0tLS0tLQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4gLgorSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PiBhbmQgUGllcnJlIEhhYm91eml0IDxtYWRjb2RlckBkZWJpYW4ub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1yZXZlcnQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcmV2ZXJ0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2UyMGY3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcmV2ZXJ0LnR4dApAQCAtMCwwICsxLDY1IEBACitnaXQtcmV2ZXJ0KDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1yZXZlcnQgLSBSZXZlcnQgYW4gZXhpc3RpbmcgY29tbWl0CisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1yZXZlcnQnIFstLWVkaXQgfCAtLW5vLWVkaXRdIFstbl0gWy1tIHBhcmVudC1udW1iZXJdIDxjb21taXQ+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorR2l2ZW4gb25lIGV4aXN0aW5nIGNvbW1pdCwgcmV2ZXJ0IHRoZSBjaGFuZ2UgdGhlIHBhdGNoIGludHJvZHVjZXMsIGFuZCByZWNvcmQgYQorbmV3IGNvbW1pdCB0aGF0IHJlY29yZHMgaXQuICBUaGlzIHJlcXVpcmVzIHlvdXIgd29ya2luZyB0cmVlIHRvIGJlIGNsZWFuIChubworbW9kaWZpY2F0aW9ucyBmcm9tIHRoZSBIRUFEIGNvbW1pdCkuCisKK09QVElPTlMKKy0tLS0tLS0KKzxjb21taXQ+OjoKKwlDb21taXQgdG8gcmV2ZXJ0LgorCUZvciBhIG1vcmUgY29tcGxldGUgbGlzdCBvZiB3YXlzIHRvIHNwZWxsIGNvbW1pdCBuYW1lcywgc2VlCisJIlNQRUNJRllJTkcgUkVWSVNJT05TIiBzZWN0aW9uIGluIGxpbmtnaXQ6Z2l0LXJldi1wYXJzZVsxXS4KKworLWV8LS1lZGl0OjoKKwlXaXRoIHRoaXMgb3B0aW9uLCBgZ2l0LXJldmVydGAgd2lsbCBsZXQgeW91IGVkaXQgdGhlIGNvbW1pdAorCW1lc3NhZ2UgcHJpb3IgdG8gY29tbWl0dGluZyB0aGUgcmV2ZXJ0LiBUaGlzIGlzIHRoZSBkZWZhdWx0IGlmCisJeW91IHJ1biB0aGUgY29tbWFuZCBmcm9tIGEgdGVybWluYWwuCisKKy1tIHBhcmVudC1udW1iZXJ8LS1tYWlubGluZSBwYXJlbnQtbnVtYmVyOjoKKwlVc3VhbGx5IHlvdSBjYW5ub3QgcmV2ZXJ0IGEgbWVyZ2UgYmVjYXVzZSB5b3UgZG8gbm90IGtub3cgd2hpY2gKKwlzaWRlIG9mIHRoZSBtZXJnZSBzaG91bGQgYmUgY29uc2lkZXJlZCB0aGUgbWFpbmxpbmUuICBUaGlzCisJb3B0aW9uIHNwZWNpZmllcyB0aGUgcGFyZW50IG51bWJlciAoc3RhcnRpbmcgZnJvbSAxKSBvZgorCXRoZSBtYWlubGluZSBhbmQgYWxsb3dzIHJldmVydCB0byByZXZlcnNlIHRoZSBjaGFuZ2UKKwlyZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkIHBhcmVudC4KKworLS1uby1lZGl0OjoKKwlXaXRoIHRoaXMgb3B0aW9uLCBgZ2l0LXJldmVydGAgd2lsbCBub3Qgc3RhcnQgdGhlIGNvbW1pdAorCW1lc3NhZ2UgZWRpdG9yLgorCistbnwtLW5vLWNvbW1pdDo6CisJVXN1YWxseSB0aGUgY29tbWFuZCBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYSBjb21taXQgd2l0aAorCWEgY29tbWl0IGxvZyBtZXNzYWdlIHN0YXRpbmcgd2hpY2ggY29tbWl0IHdhcyByZXZlcnRlZC4KKwlUaGlzIGZsYWcgYXBwbGllcyB0aGUgY2hhbmdlIG5lY2Vzc2FyeSB0byByZXZlcnQgdGhlCisJbmFtZWQgY29tbWl0IHRvIHlvdXIgd29ya2luZyB0cmVlLCBidXQgZG9lcyBub3QgbWFrZSB0aGUKKwljb21taXQuICBJbiBhZGRpdGlvbiwgd2hlbiB0aGlzIG9wdGlvbiBpcyB1c2VkLCB5b3VyCisJd29ya2luZyB0cmVlIGRvZXMgbm90IGhhdmUgdG8gbWF0Y2ggdGhlIEhFQUQgY29tbWl0LgorCVRoZSByZXZlcnQgaXMgZG9uZSBhZ2FpbnN0IHRoZSBiZWdpbm5pbmcgc3RhdGUgb2YgeW91cgorCXdvcmtpbmcgdHJlZS4KKysKK1RoaXMgaXMgdXNlZnVsIHdoZW4gcmV2ZXJ0aW5nIG1vcmUgdGhhbiBvbmUgY29tbWl0cycKK2VmZmVjdCB0byB5b3VyIHdvcmtpbmcgdHJlZSBpbiBhIHJvdy4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJtLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXJtLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzM2YzY2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcm0udHh0CkBAIC0wLDAgKzEsOTggQEAKK2dpdC1ybSgxKQorPT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1ybSAtIFJlbW92ZSBmaWxlcyBmcm9tIHRoZSB3b3JraW5nIHRyZWUgYW5kIGZyb20gdGhlIGluZGV4CisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1ybScgWy1mXSBbLW5dIFstcl0gWy0tY2FjaGVkXSBbLS1pZ25vcmUtdW5tYXRjaF0gWy0tcXVpZXRdIFstLV0gPGZpbGU+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUmVtb3ZlIGZpbGVzIGZyb20gdGhlIHdvcmtpbmcgdHJlZSBhbmQgZnJvbSB0aGUgaW5kZXguICBUaGUKK2ZpbGVzIGhhdmUgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSB0aXAgb2YgdGhlIGJyYW5jaCwgYW5kIG5vCit1cGRhdGVzIHRvIGl0cyBjb250ZW50cyBtdXN0IGhhdmUgYmVlbiBwbGFjZWQgaW4gdGhlIHN0YWdpbmcKK2FyZWEgKGFrYSBpbmRleCkuICBXaGVuIC0tY2FjaGVkIGlzIGdpdmVuLCB0aGUgc3RhZ2VkIGNvbnRlbnQgaGFzIHRvCittYXRjaCBlaXRoZXIgdGhlIHRpcCBvZiB0aGUgYnJhbmNoICpvciogdGhlIGZpbGUgb24gZGlzay4KKworCitPUFRJT05TCistLS0tLS0tCis8ZmlsZT4uLi46OgorCUZpbGVzIHRvIHJlbW92ZS4gIEZpbGVnbG9icyAoZS5nLiBgKi5jYCkgY2FuIGJlIGdpdmVuIHRvCisJcmVtb3ZlIGFsbCBtYXRjaGluZyBmaWxlcy4gIEFsc28gYSBsZWFkaW5nIGRpcmVjdG9yeSBuYW1lCisJKGUuZy4gYGRpcmAgdG8gYWRkIGBkaXIvZmlsZTFgIGFuZCBgZGlyL2ZpbGUyYCkgY2FuIGJlCisJZ2l2ZW4gdG8gcmVtb3ZlIGFsbCBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5LCByZWN1cnNpdmVseSwKKwlidXQgdGhpcyByZXF1aXJlcyBgLXJgIG9wdGlvbiB0byBiZSBnaXZlbiBmb3Igc2FmZXR5LgorCistZjo6CisJT3ZlcnJpZGUgdGhlIHVwLXRvLWRhdGUgY2hlY2suCisKKy1uLCBcLS1kcnktcnVuOjoKKyAgICAgICAgRG9uJ3QgYWN0dWFsbHkgcmVtb3ZlIHRoZSBmaWxlKHMpLCBqdXN0IHNob3cgaWYgdGhleSBleGlzdCBpbgorICAgICAgICB0aGUgaW5kZXguCisKKy1yOjoKKyAgICAgICAgQWxsb3cgcmVjdXJzaXZlIHJlbW92YWwgd2hlbiBhIGxlYWRpbmcgZGlyZWN0b3J5IG5hbWUgaXMKKyAgICAgICAgZ2l2ZW4uCisKK1wtLTo6CisJVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgY29tbWFuZC1saW5lIG9wdGlvbnMgZnJvbQorCXRoZSBsaXN0IG9mIGZpbGVzLCAodXNlZnVsIHdoZW4gZmlsZW5hbWVzIG1pZ2h0IGJlIG1pc3Rha2VuCisJZm9yIGNvbW1hbmQtbGluZSBvcHRpb25zKS4KKworXC0tY2FjaGVkOjoKKwlUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byB0ZWxsIHRoZSBjb21tYW5kIHRvIHJlbW92ZQorCXRoZSBwYXRocyBvbmx5IGZyb20gdGhlIGluZGV4LCBsZWF2aW5nIHdvcmtpbmcgdHJlZQorCWZpbGVzLgorCitcLS1pZ25vcmUtdW5tYXRjaDo6CisJRXhpdCB3aXRoIGEgemVybyBzdGF0dXMgZXZlbiBpZiBubyBmaWxlcyBtYXRjaGVkLgorCistcSwgXC0tcXVpZXQ6OgorCWdpdC1ybSBub3JtYWxseSBvdXRwdXRzIG9uZSBsaW5lIChpbiB0aGUgZm9ybSBvZiBhbiAicm0iIGNvbW1hbmQpCisJZm9yIGVhY2ggZmlsZSByZW1vdmVkLiBUaGlzIG9wdGlvbiBzdXBwcmVzc2VzIHRoYXQgb3V0cHV0LgorCisKK0RJU0NVU1NJT04KKy0tLS0tLS0tLS0KKworVGhlIGxpc3Qgb2YgPGZpbGU+IGdpdmVuIHRvIHRoZSBjb21tYW5kIGNhbiBiZSBleGFjdCBwYXRobmFtZXMsCitmaWxlIGdsb2IgcGF0dGVybnMsIG9yIGxlYWRpbmcgZGlyZWN0b3J5IG5hbWUuICBUaGUgY29tbWFuZAorcmVtb3ZlcyBvbmx5IHRoZSBwYXRocyB0aGF0IGlzIGtub3duIHRvIGdpdC4gIEdpdmluZyB0aGUgbmFtZSBvZgorYSBmaWxlIHRoYXQgeW91IGhhdmUgbm90IHRvbGQgZ2l0IGFib3V0IGRvZXMgbm90IHJlbW92ZSB0aGF0IGZpbGUuCisKKworRVhBTVBMRVMKKy0tLS0tLS0tCitnaXQtcm0gRG9jdW1lbnRhdGlvbi9cXCoudHh0OjoKKwlSZW1vdmVzIGFsbCBgXCoudHh0YCBmaWxlcyBmcm9tIHRoZSBpbmRleCB0aGF0IGFyZSB1bmRlciB0aGUKKwlgRG9jdW1lbnRhdGlvbmAgZGlyZWN0b3J5IGFuZCBhbnkgb2YgaXRzIHN1YmRpcmVjdG9yaWVzLgorKworTm90ZSB0aGF0IHRoZSBhc3RlcmlzayBgXCpgIGlzIHF1b3RlZCBmcm9tIHRoZSBzaGVsbCBpbiB0aGlzCitleGFtcGxlOyB0aGlzIGxldHMgdGhlIGNvbW1hbmQgaW5jbHVkZSB0aGUgZmlsZXMgZnJvbQorc3ViZGlyZWN0b3JpZXMgb2YgYERvY3VtZW50YXRpb24vYCBkaXJlY3RvcnkuCisKK2dpdC1ybSAtZiBnaXQtKi5zaDo6CisJUmVtb3ZlIGFsbCBnaXQtKi5zaCBzY3JpcHRzIHRoYXQgYXJlIGluIHRoZSBpbmRleC4KKwlCZWNhdXNlIHRoaXMgZXhhbXBsZSBsZXRzIHRoZSBzaGVsbCBleHBhbmQgdGhlIGFzdGVyaXNrCisJKGkuZS4geW91IGFyZSBsaXN0aW5nIHRoZSBmaWxlcyBleHBsaWNpdGx5KSwgaXQKKwlkb2VzIG5vdCByZW1vdmUgYHN1YmRpci9naXQtZm9vLnNoYC4KKworU2VlIEFsc28KKy0tLS0tLS0tCitsaW5rZ2l0OmdpdC1hZGRbMV0KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zZW5kLWVtYWlsLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXNlbmQtZW1haWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMGExMGMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zZW5kLWVtYWlsLnR4dApAQCAtMCwwICsxLDI0NCBAQAorZ2l0LXNlbmQtZW1haWwoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zZW5kLWVtYWlsIC0gU2VuZCBhIGNvbGxlY3Rpb24gb2YgcGF0Y2hlcyBhcyBlbWFpbHMKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtc2VuZC1lbWFpbCcgW29wdGlvbnNdIDxmaWxlfGRpcmVjdG9yeT4gWy4uLiBmaWxlfGRpcmVjdG9yeV0KKworCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGFrZXMgdGhlIHBhdGNoZXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZSBhbmQgZW1haWxzIHRoZW0gb3V0LgorCitUaGUgaGVhZGVyIG9mIHRoZSBlbWFpbCBpcyBjb25maWd1cmFibGUgYnkgY29tbWFuZCBsaW5lIG9wdGlvbnMuICBJZiBub3QKK3NwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkIHdpdGggYSBSZWFkTGluZQorZW5hYmxlZCBpbnRlcmZhY2UgdG8gcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uLgorCitPUFRJT05TCistLS0tLS0tCitUaGUgb3B0aW9ucyBhdmFpbGFibGUgYXJlOgorCistLWJjYzo6CisJU3BlY2lmeSBhICJCY2M6IiB2YWx1ZSBmb3IgZWFjaCBlbWFpbC4KKysKK1RoZSAtLWJjYyBvcHRpb24gbXVzdCBiZSByZXBlYXRlZCBmb3IgZWFjaCB1c2VyIHlvdSB3YW50IG9uIHRoZSBiY2MgbGlzdC4KKworLS1jYzo6CisJU3BlY2lmeSBhIHN0YXJ0aW5nICJDYzoiIHZhbHVlIGZvciBlYWNoIGVtYWlsLgorKworVGhlIC0tY2Mgb3B0aW9uIG11c3QgYmUgcmVwZWF0ZWQgZm9yIGVhY2ggdXNlciB5b3Ugd2FudCBvbiB0aGUgY2MgbGlzdC4KKworLS1jYy1jbWQ6OgorCVNwZWNpZnkgYSBjb21tYW5kIHRvIGV4ZWN1dGUgb25jZSBwZXIgcGF0Y2ggZmlsZSB3aGljaAorCXNob3VsZCBnZW5lcmF0ZSBwYXRjaCBmaWxlIHNwZWNpZmljICJDYzoiIGVudHJpZXMuCisJT3V0cHV0IG9mIHRoaXMgY29tbWFuZCBtdXN0IGJlIHNpbmdsZSBlbWFpbCBhZGRyZXNzIHBlciBsaW5lLgorCURlZmF1bHQgaXMgdGhlIHZhbHVlIG9mICdzZW5kZW1haWwuY2NjbWQnIGNvbmZpZ3VyYXRpb24gdmFsdWUuCisKKy0tY2hhaW4tcmVwbHktdG8sIC0tbm8tY2hhaW4tcmVwbHktdG86OgorCUlmIHRoaXMgaXMgc2V0LCBlYWNoIGVtYWlsIHdpbGwgYmUgc2VudCBhcyBhIHJlcGx5IHRvIHRoZSBwcmV2aW91cworCWVtYWlsIHNlbnQuICBJZiBkaXNhYmxlZCB3aXRoICItLW5vLWNoYWluLXJlcGx5LXRvIiwgYWxsIGVtYWlscyBhZnRlcgorCXRoZSBmaXJzdCB3aWxsIGJlIHNlbnQgYXMgcmVwbGllcyB0byB0aGUgZmlyc3QgZW1haWwgc2VudC4gIFdoZW4gdXNpbmcKKwl0aGlzLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZSBmaXJzdCBmaWxlIGdpdmVuIGJlIGFuIG92ZXJ2aWV3IG9mIHRoZQorCWVudGlyZSBwYXRjaCBzZXJpZXMuCisJRGVmYXVsdCBpcyB0aGUgdmFsdWUgb2YgdGhlICdzZW5kZW1haWwuY2hhaW5yZXBseXRvJyBjb25maWd1cmF0aW9uCisJdmFsdWU7IGlmIHRoYXQgaXMgdW5zcGVjaWZpZWQsIGRlZmF1bHQgdG8gLS1jaGFpbi1yZXBseS10by4KKworLS1jb21wb3NlOjoKKwlVc2UgJEdJVF9FRElUT1IsIGNvcmUuZWRpdG9yLCAkVklTVUFMLCBvciAkRURJVE9SIHRvIGVkaXQgYW4KKwlpbnRyb2R1Y3RvcnkgbWVzc2FnZSBmb3IgdGhlIHBhdGNoIHNlcmllcy4KKworLS1mcm9tOjoKKwlTcGVjaWZ5IHRoZSBzZW5kZXIgb2YgdGhlIGVtYWlscy4gIFRoaXMgd2lsbCBkZWZhdWx0IHRvCisJdGhlIHZhbHVlIEdJVF9DT01NSVRURVJfSURFTlQsIGFzIHJldHVybmVkIGJ5ICJnaXQtdmFyIC1sIi4KKwlUaGUgdXNlciB3aWxsIHN0aWxsIGJlIHByb21wdGVkIHRvIGNvbmZpcm0gdGhpcyBlbnRyeS4KKworLS1pbi1yZXBseS10bzo6CisJU3BlY2lmeSB0aGUgY29udGVudHMgb2YgdGhlIGZpcnN0IEluLVJlcGx5LVRvIGhlYWRlci4KKwlTdWJzZXF1ZW50IGVtYWlscyB3aWxsIHJlZmVyIHRvIHRoZSBwcmV2aW91cyBlbWFpbAorCWluc3RlYWQgb2YgdGhpcyBpZiAtLWNoYWluLXJlcGx5LXRvIGlzIHNldCAodGhlIGRlZmF1bHQpCisJT25seSBuZWNlc3NhcnkgaWYgLS1jb21wb3NlIGlzIGFsc28gc2V0LiAgSWYgLS1jb21wb3NlCisJaXMgbm90IHNldCwgdGhpcyB3aWxsIGJlIHByb21wdGVkIGZvci4KKworLS1zaWduZWQtb2ZmLWJ5LWNjLCAtLW5vLXNpZ25lZC1vZmYtYnktY2M6OgorICAgICAgICBJZiB0aGlzIGlzIHNldCwgYWRkIGVtYWlscyBmb3VuZCBpbiBTaWduZWQtb2ZmLWJ5OiBvciBDYzogbGluZXMgdG8gdGhlCisgICAgICAgIGNjIGxpc3QuCisgICAgICAgIERlZmF1bHQgaXMgdGhlIHZhbHVlIG9mICdzZW5kZW1haWwuc2lnbmVkb2ZmY2MnIGNvbmZpZ3VyYXRpb24gdmFsdWU7CisgICAgICAgIGlmIHRoYXQgaXMgdW5zcGVjaWZpZWQsIGRlZmF1bHQgdG8gLS1zaWduZWQtb2ZmLWJ5LWNjLgorCistLXF1aWV0OjoKKwlNYWtlIGdpdC1zZW5kLWVtYWlsIGxlc3MgdmVyYm9zZS4gIE9uZSBsaW5lIHBlciBlbWFpbCBzaG91bGQgYmUKKwlhbGwgdGhhdCBpcyBvdXRwdXQuCisKKy0taWRlbnRpdHk6OgorCUEgY29uZmlndXJhdGlvbiBpZGVudGl0eS4gV2hlbiBnaXZlbiwgY2F1c2VzIHZhbHVlcyBpbiB0aGUKKwknc2VuZGVtYWlsLjxpZGVudGl0eT4nIHN1YnNlY3Rpb24gdG8gdGFrZSBwcmVjZWRlbmNlIG92ZXIKKwl2YWx1ZXMgaW4gdGhlICdzZW5kZW1haWwnIHNlY3Rpb24uIFRoZSBkZWZhdWx0IGlkZW50aXR5IGlzCisJdGhlIHZhbHVlIG9mICdzZW5kZW1haWwuaWRlbnRpdHknLgorCistLXNtdHAtc2VydmVyOjoKKwlJZiBzZXQsIHNwZWNpZmllcyB0aGUgb3V0Z29pbmcgU01UUCBzZXJ2ZXIgdG8gdXNlIChlLmcuCisJYHNtdHAuZXhhbXBsZS5jb21gIG9yIGEgcmF3IElQIGFkZHJlc3MpLiAgQWx0ZXJuYXRpdmVseSBpdCBjYW4KKwlzcGVjaWZ5IGEgZnVsbCBwYXRobmFtZSBvZiBhIHNlbmRtYWlsLWxpa2UgcHJvZ3JhbSBpbnN0ZWFkOworCXRoZSBwcm9ncmFtIG11c3Qgc3VwcG9ydCB0aGUgYC1pYCBvcHRpb24uICBEZWZhdWx0IHZhbHVlIGNhbgorCWJlIHNwZWNpZmllZCBieSB0aGUgJ3NlbmRlbWFpbC5zbXRwc2VydmVyJyBjb25maWd1cmF0aW9uCisJb3B0aW9uOyB0aGUgYnVpbHQtaW4gZGVmYXVsdCBpcyBgL3Vzci9zYmluL3NlbmRtYWlsYCBvcgorCWAvdXNyL2xpYi9zZW5kbWFpbGAgaWYgc3VjaCBwcm9ncmFtIGlzIGF2YWlsYWJsZSwgb3IKKwlgbG9jYWxob3N0YCBvdGhlcndpc2UuCisKKy0tc210cC1zZXJ2ZXItcG9ydDo6CisJU3BlY2lmaWVzIGEgcG9ydCBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdCBwb3J0IChTTVRQCisJc2VydmVycyB0eXBpY2FsbHkgbGlzdGVuIHRvIHNtdHAgcG9ydCAyNSBhbmQgc3NtdHAgcG9ydAorCTQ2NSkuCisKKy0tc210cC11c2VyOjoKKwlVc2VybmFtZSBmb3IgU01UUC1BVVRILiBJbiBwbGFjZSBvZiB0aGlzIG9wdGlvbiwgdGhlIGZvbGxvd2luZworCWNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGNhbiBiZSBzcGVjaWZpZWQ6CisrCistLQorCQkqIHNlbmRlbWFpbC5zbXRwdXNlcgorCQkqIHNlbmRlbWFpbC48aWRlbnRpdHk+LnNtdHB1c2VyIChzZWUgc2VuZGVtYWlsLmlkZW50aXR5KS4KKy0tCisrCitIb3dldmVyLCAtLXNtdHAtdXNlciBhbHdheXMgb3ZlcnJpZGVzIHRoZXNlIHZhcmlhYmxlcy4KKysKK0lmIGEgdXNlcm5hbWUgaXMgbm90IHNwZWNpZmllZCAod2l0aCAtLXNtdHAtdXNlciBvciBhCitjb25maWd1cmF0aW9uIHZhcmlhYmxlKSwgdGhlbiBhdXRoZW50aWNhdGlvbiBpcyBub3QgYXR0ZW1wdGVkLgorCistLXNtdHAtcGFzczo6CisJUGFzc3dvcmQgZm9yIFNNVFAtQVVUSC4gVGhlIGFyZ3VtZW50IGlzIG9wdGlvbmFsOiBJZiBubworCWFyZ3VtZW50IGlzIHNwZWNpZmllZCwgdGhlbiB0aGUgZW1wdHkgc3RyaW5nIGlzIHVzZWQgYXMKKwl0aGUgcGFzc3dvcmQuCisrCitJbiBwbGFjZSBvZiB0aGlzIG9wdGlvbiwgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIHZhcmlhYmxlcworY2FuIGJlIHNwZWNpZmllZDoKKysKKy0tCisJCSogc2VuZGVtYWlsLnNtdHBwYXNzCisJCSogc2VuZGVtYWlsLjxpZGVudGl0eT4uc210cHBhc3MgKHNlZSBzZW5kZW1haWwuaWRlbnRpdHkpLgorLS0KKysKK0hvd2V2ZXIsIC0tc210cC1wYXNzIGFsd2F5cyBvdmVycmlkZXMgdGhlc2UgdmFyaWFibGVzLgorKworRnVydGhlcm1vcmUsIHBhc3N3b3JkcyBuZWVkIG5vdCBiZSBzcGVjaWZpZWQgaW4gY29uZmlndXJhdGlvbiBmaWxlcworb3Igb24gdGhlIGNvbW1hbmQgbGluZS4gSWYgYSB1c2VybmFtZSBoYXMgYmVlbiBzcGVjaWZpZWQgKHdpdGgKKy0tc210cC11c2VyIG9yIGEgY29uZmlndXJhdGlvbiB2YXJpYWJsZSksIGJ1dCBubyBwYXNzd29yZCBoYXMgYmVlbgorc3BlY2lmaWVkICh3aXRoIC0tc210cC1wYXNzIG9yIGEgY29uZmlndXJhdGlvbiB2YXJpYWJsZSksIHRoZW4gdGhlCit1c2VyIGlzIHByb21wdGVkIGZvciBhIHBhc3N3b3JkIHdoaWxlIHRoZSBpbnB1dCBpcyBtYXNrZWQgZm9yIHByaXZhY3kuCisKKy0tc210cC1zc2w6OgorCUlmIHNldCwgY29ubmVjdHMgdG8gdGhlIFNNVFAgc2VydmVyIHVzaW5nIFNTTC4KKwlEZWZhdWx0IGlzIHRoZSB2YWx1ZSBvZiB0aGUgJ3NlbmRlbWFpbC5zbXRwc3NsJyBjb25maWd1cmF0aW9uIHZhbHVlOworCWlmIHRoYXQgaXMgdW5zcGVjaWZpZWQsIGRvZXMgbm90IHVzZSBTU0wuCisKKy0tc3ViamVjdDo6CisJU3BlY2lmeSB0aGUgaW5pdGlhbCBzdWJqZWN0IG9mIHRoZSBlbWFpbCB0aHJlYWQuCisJT25seSBuZWNlc3NhcnkgaWYgLS1jb21wb3NlIGlzIGFsc28gc2V0LiAgSWYgLS1jb21wb3NlCisJaXMgbm90IHNldCwgdGhpcyB3aWxsIGJlIHByb21wdGVkIGZvci4KKworLS1zdXBwcmVzcy1mcm9tLCAtLW5vLXN1cHByZXNzLWZyb206OgorICAgICAgICBJZiB0aGlzIGlzIHNldCwgZG8gbm90IGFkZCB0aGUgRnJvbTogYWRkcmVzcyB0byB0aGUgY2M6IGxpc3QuCisgICAgICAgIERlZmF1bHQgaXMgdGhlIHZhbHVlIG9mICdzZW5kZW1haWwuc3VwcHJlc3Nmcm9tJyBjb25maWd1cmF0aW9uIHZhbHVlOworICAgICAgICBpZiB0aGF0IGlzIHVuc3BlY2lmaWVkLCBkZWZhdWx0IHRvIC0tbm8tc3VwcHJlc3MtZnJvbS4KKworLS1zdXBwcmVzcy1jYzo6CisJU3BlY2lmeSBhbiBhZGRpdGlvbmFsIGNhdGVnb3J5IG9mIHJlY2lwaWVudHMgdG8gc3VwcHJlc3MgdGhlCisJYXV0by1jYyBvZi4gICdzZWxmJyB3aWxsIGF2b2lkIGluY2x1ZGluZyB0aGUgc2VuZGVyLCAnYXV0aG9yJyB3aWxsCisJYXZvaWQgaW5jbHVkaW5nIHRoZSBwYXRjaCBhdXRob3IsICdjYycgd2lsbCBhdm9pZCBpbmNsdWRpbmcgYW55b25lCisJbWVudGlvbmVkIGluIENjIGxpbmVzIGluIHRoZSBwYXRjaCwgJ3NvYicgd2lsbCBhdm9pZCBpbmNsdWRpbmcKKwlhbnlvbmUgbWVudGlvbmVkIGluIFNpZ25lZC1vZmYtYnkgbGluZXMsIGFuZCAnY2NjbWQnIHdpbGwgYXZvaWQKKwlydW5uaW5nIHRoZSAtLWNjLWNtZC4gICdhbGwnIHdpbGwgc3VwcHJlc3MgYWxsIGF1dG8gY2MgdmFsdWVzLgorCURlZmF1bHQgaXMgdGhlIHZhbHVlIG9mICdzZW5kZW1haWwuc3VwcHJlc3NjYycgY29uZmlndXJhdGlvbiB2YWx1ZTsKKwlpZiB0aGF0IGlzIHVuc3BlY2lmaWVkLCBkZWZhdWx0IHRvICdzZWxmJyBpZiAtLXN1cHByZXNzLWZyb20gaXMKKwlzcGVjaWZpZWQsIGFzIHdlbGwgYXMgJ3NvYicgaWYgLS1uby1zaWduZWQtb2ZmLWNjIGlzIHNwZWNpZmllZC4KKworLS10aHJlYWQsIC0tbm8tdGhyZWFkOjoKKwlJZiB0aGlzIGlzIHNldCwgdGhlIEluLVJlcGx5LVRvIGhlYWRlciB3aWxsIGJlIHNldCBvbiBlYWNoIGVtYWlsIHNlbnQuCisJSWYgZGlzYWJsZWQgd2l0aCAiLS1uby10aHJlYWQiLCBubyBlbWFpbHMgd2lsbCBoYXZlIHRoZSBJbi1SZXBseS1UbworCWhlYWRlciBzZXQuCisJRGVmYXVsdCBpcyB0aGUgdmFsdWUgb2YgdGhlICdzZW5kZW1haWwudGhyZWFkJyBjb25maWd1cmF0aW9uIHZhbHVlOworCWlmIHRoYXQgaXMgdW5zcGVjaWZpZWQsIGRlZmF1bHQgdG8gLS10aHJlYWQuCisKKy0tZHJ5LXJ1bjo6CisJRG8gZXZlcnl0aGluZyBleGNlcHQgYWN0dWFsbHkgc2VuZCB0aGUgZW1haWxzLgorCistLWVudmVsb3BlLXNlbmRlcjo6CisJU3BlY2lmeSB0aGUgZW52ZWxvcGUgc2VuZGVyIHVzZWQgdG8gc2VuZCB0aGUgZW1haWxzLgorCVRoaXMgaXMgdXNlZnVsIGlmIHlvdXIgZGVmYXVsdCBhZGRyZXNzIGlzIG5vdCB0aGUgYWRkcmVzcyB0aGF0IGlzCisJc3Vic2NyaWJlZCB0byBhIGxpc3QuIElmIHlvdSB1c2UgdGhlIHNlbmRtYWlsIGJpbmFyeSwgeW91IG11c3QgaGF2ZQorCXN1aXRhYmxlIHByaXZpbGVnZXMgZm9yIHRoZSAtZiBwYXJhbWV0ZXIuCisKKy0tdG86OgorCVNwZWNpZnkgdGhlIHByaW1hcnkgcmVjaXBpZW50IG9mIHRoZSBlbWFpbHMgZ2VuZXJhdGVkLgorCUdlbmVyYWxseSwgdGhpcyB3aWxsIGJlIHRoZSB1cHN0cmVhbSBtYWludGFpbmVyIG9mIHRoZQorCXByb2plY3QgaW52b2x2ZWQuCisJRGVmYXVsdCBpcyB0aGUgdmFsdWUgb2YgdGhlICdzZW5kZW1haWwudG8nIGNvbmZpZ3VyYXRpb24gdmFsdWU7CisJaWYgdGhhdCBpcyB1bnNwZWNpZmllZCwgdGhpcyB3aWxsIGJlIHByb21wdGVkIGZvci4KKysKK1RoZSAtLXRvIG9wdGlvbiBtdXN0IGJlIHJlcGVhdGVkIGZvciBlYWNoIHVzZXIgeW91IHdhbnQgb24gdGhlIHRvIGxpc3QuCisKKworQ09ORklHVVJBVElPTgorLS0tLS0tLS0tLS0tLQorc2VuZGVtYWlsLmlkZW50aXR5OjoKKwlUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGlkZW50aXR5LiBXaGVuIHNwZWNpZmllZCwKKwknc2VuZGVtYWlsLjxpZGVudGl0eT4uPGl0ZW0+JyB3aWxsIGhhdmUgaGlnaGVyIHByZWNlZGVuY2UgdGhhbgorCSdzZW5kZW1haWwuPGl0ZW0+Jy4gVGhpcyBpcyB1c2VmdWwgdG8gZGVjbGFyZSBtdWx0aXBsZSBTTVRQCisJaWRlbnRpdGllcyBhbmQgdG8gaG9pc3Qgc2Vuc2l0aXZlIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uCisJb3V0IG9mIHRoZSByZXBvc2l0b3J5IGFuZCBpbnRvIHRoZSBnbG9iYWwgY29uZmlndXJhdGlvbiBmaWxlLgorCitzZW5kZW1haWwuYWxpYXNlc2ZpbGU6OgorCVRvIGF2b2lkIHR5cGluZyBsb25nIGVtYWlsIGFkZHJlc3NlcywgcG9pbnQgdGhpcyB0byBvbmUgb3IgbW9yZQorCWVtYWlsIGFsaWFzZXMgZmlsZXMuICBZb3UgbXVzdCBhbHNvIHN1cHBseSAnc2VuZGVtYWlsLmFsaWFzZmlsZXR5cGUnLgorCitzZW5kZW1haWwuYWxpYXNmaWxldHlwZTo6CisJRm9ybWF0IG9mIHRoZSBmaWxlKHMpIHNwZWNpZmllZCBpbiBzZW5kZW1haWwuYWxpYXNlc2ZpbGUuIE11c3QgYmUKKwlvbmUgb2YgJ211dHQnLCAnbWFpbHJjJywgJ3BpbmUnLCBvciAnZ251cycuCisKK3NlbmRlbWFpbC50bzo6CisJRW1haWwgYWRkcmVzcyAob3IgYWxpYXMpIHRvIGFsd2F5cyBzZW5kIHRvLgorCitzZW5kZW1haWwuY2NjbWQ6OgorCUNvbW1hbmQgdG8gZXhlY3V0ZSB0byBnZW5lcmF0ZSBwZXIgcGF0Y2ggZmlsZSBzcGVjaWZpYyAiQ2M6InMuCisKK3NlbmRlbWFpbC5iY2M6OgorCUVtYWlsIGFkZHJlc3MgKG9yIGFsaWFzKSB0byBhbHdheXMgYmNjLgorCitzZW5kZW1haWwuY2hhaW5yZXBseXRvOjoKKwlCb29sZWFuIHZhbHVlIHNwZWNpZnlpbmcgdGhlIGRlZmF1bHQgdG8gdGhlICctLWNoYWluX3JlcGx5X3RvJworCXBhcmFtZXRlci4KKworc2VuZGVtYWlsLnNtdHBzZXJ2ZXI6OgorCURlZmF1bHQgU01UUCBzZXJ2ZXIgdG8gdXNlLgorCitzZW5kZW1haWwuc210cHNlcnZlcnBvcnQ6OgorCURlZmF1bHQgU01UUCBzZXJ2ZXIgcG9ydCB0byB1c2UuCisKK3NlbmRlbWFpbC5zbXRwdXNlcjo6CisJRGVmYXVsdCBTTVRQLUFVVEggdXNlcm5hbWUuCisKK3NlbmRlbWFpbC5zbXRwcGFzczo6CisJRGVmYXVsdCBTTVRQLUFVVEggcGFzc3dvcmQuCisKK3NlbmRlbWFpbC5zbXRwc3NsOjoKKwlCb29sZWFuIHZhbHVlIHNwZWNpZnlpbmcgdGhlIGRlZmF1bHQgdG8gdGhlICctLXNtdHAtc3NsJyBwYXJhbWV0ZXIuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IFJ5YW4gQW5kZXJzb24gPHJ5YW5AbWljaG9ubGluZS5jb20+CisKK2dpdC1zZW5kLWVtYWlsIGlzIG9yaWdpbmFsbHkgYmFzZWQgdXBvbgorc2VuZF9sb3RzX29mX2VtYWlsLnBsIGJ5IEdyZWcgS3JvYWgtSGFydG1hbi4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgUnlhbiBBbmRlcnNvbgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXNlbmQtcGFjay50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zZW5kLXBhY2sudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NzUxNWIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zZW5kLXBhY2sudHh0CkBAIC0wLDAgKzEsMTI4IEBACitnaXQtc2VuZC1wYWNrKDEpCis9PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zZW5kLXBhY2sgLSBQdXNoIG9iamVjdHMgb3ZlciBnaXQgcHJvdG9jb2wgdG8gYW5vdGhlciByZXBvc2l0b3J5CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXNlbmQtcGFjaycgWy0tYWxsXSBbLS1kcnktcnVuXSBbLS1mb3JjZV0gWy0tcmVjZWl2ZS1wYWNrPTxnaXQtcmVjZWl2ZS1wYWNrPl0gWy0tdmVyYm9zZV0gWy0tdGhpbl0gWzxob3N0PjpdPGRpcmVjdG9yeT4gWzxyZWY+Li4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1VzdWFsbHkgeW91IHdvdWxkIHdhbnQgdG8gdXNlIGxpbmtnaXQ6Z2l0LXB1c2hbMV0gd2hpY2ggaXMgYQoraGlnaGVyIGxldmVsIHdyYXBwZXIgb2YgdGhpcyBjb21tYW5kIGluc3RlYWQuCisKK0ludm9rZXMgJ2dpdC1yZWNlaXZlLXBhY2snIG9uIGEgcG9zc2libHkgcmVtb3RlIHJlcG9zaXRvcnksIGFuZAordXBkYXRlcyBpdCBmcm9tIHRoZSBjdXJyZW50IHJlcG9zaXRvcnksIHNlbmRpbmcgbmFtZWQgcmVmcy4KKworCitPUFRJT05TCistLS0tLS0tCitcLS1yZWNlaXZlLXBhY2s9PGdpdC1yZWNlaXZlLXBhY2s+OjoKKwlQYXRoIHRvIHRoZSAnZ2l0LXJlY2VpdmUtcGFjaycgcHJvZ3JhbSBvbiB0aGUgcmVtb3RlCisJZW5kLiAgU29tZXRpbWVzIHVzZWZ1bCB3aGVuIHB1c2hpbmcgdG8gYSByZW1vdGUKKwlyZXBvc2l0b3J5IG92ZXIgc3NoLCBhbmQgeW91IGRvIG5vdCBoYXZlIHRoZSBwcm9ncmFtIGluCisJYSBkaXJlY3Rvcnkgb24gdGhlIGRlZmF1bHQgJFBBVEguCisKK1wtLWV4ZWM9PGdpdC1yZWNlaXZlLXBhY2s+OjoKKwlTYW1lIGFzIFwtLXJlY2VpdmUtcGFjaz08Z2l0LXJlY2VpdmUtcGFjaz4uCisKK1wtLWFsbDo6CisJSW5zdGVhZCBvZiBleHBsaWNpdGx5IHNwZWNpZnlpbmcgd2hpY2ggcmVmcyB0byB1cGRhdGUsCisJdXBkYXRlIGFsbCBoZWFkcyB0aGF0IGxvY2FsbHkgZXhpc3QuCisKK1wtLWRyeS1ydW46OgorCURvIGV2ZXJ5dGhpbmcgZXhjZXB0IGFjdHVhbGx5IHNlbmQgdGhlIHVwZGF0ZXMuCisKK1wtLWZvcmNlOjoKKwlVc3VhbGx5LCB0aGUgY29tbWFuZCByZWZ1c2VzIHRvIHVwZGF0ZSBhIHJlbW90ZSByZWYgdGhhdAorCWlzIG5vdCBhbiBhbmNlc3RvciBvZiB0aGUgbG9jYWwgcmVmIHVzZWQgdG8gb3ZlcndyaXRlIGl0LgorCVRoaXMgZmxhZyBkaXNhYmxlcyB0aGUgY2hlY2suICBXaGF0IHRoaXMgbWVhbnMgaXMgdGhhdAorCXRoZSByZW1vdGUgcmVwb3NpdG9yeSBjYW4gbG9zZSBjb21taXRzOyB1c2UgaXQgd2l0aAorCWNhcmUuCisKK1wtLXZlcmJvc2U6OgorCVJ1biB2ZXJib3NlbHkuCisKK1wtLXRoaW46OgorCVNwZW5kIGV4dHJhIGN5Y2xlcyB0byBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIG9iamVjdHMgdG8gYmUgc2VudC4KKwlVc2UgaXQgb24gc2xvd2VyIGNvbm5lY3Rpb24uCisKKzxob3N0Pjo6CisJQSByZW1vdGUgaG9zdCB0byBob3VzZSB0aGUgcmVwb3NpdG9yeS4gIFdoZW4gdGhpcworCXBhcnQgaXMgc3BlY2lmaWVkLCAnZ2l0LXJlY2VpdmUtcGFjaycgaXMgaW52b2tlZCB2aWEKKwlzc2guCisKKzxkaXJlY3Rvcnk+OjoKKwlUaGUgcmVwb3NpdG9yeSB0byB1cGRhdGUuCisKKzxyZWY+Li4uOjoKKwlUaGUgcmVtb3RlIHJlZnMgdG8gdXBkYXRlLgorCisKK1NwZWNpZnlpbmcgdGhlIFJlZnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gc3BlY2lmeSB3aGljaCByZWZzIHRvIHVwZGF0ZSBvbiB0aGUKK3JlbW90ZSBlbmQuCisKK1dpdGggJy0tYWxsJyBmbGFnLCBhbGwgcmVmcyB0aGF0IGV4aXN0IGxvY2FsbHkgYXJlIHRyYW5zZmVycmVkIHRvCit0aGUgcmVtb3RlIHNpZGUuICBZb3UgY2Fubm90IHNwZWNpZnkgYW55ICc8cmVmPicgaWYgeW91IHVzZQordGhpcyBmbGFnLgorCitXaXRob3V0ICctLWFsbCcgYW5kIHdpdGhvdXQgYW55ICc8cmVmPicsIHRoZSBoZWFkcyB0aGF0IGV4aXN0Citib3RoIG9uIHRoZSBsb2NhbCBzaWRlIGFuZCBvbiB0aGUgcmVtb3RlIHNpZGUgYXJlIHVwZGF0ZWQuCisKK1doZW4gb25lIG9yIG1vcmUgJzxyZWY+JyBhcmUgc3BlY2lmaWVkIGV4cGxpY2l0bHksIGl0IGNhbiBiZSBlaXRoZXIgYQorc2luZ2xlIHBhdHRlcm4sIG9yIGEgcGFpciBvZiBzdWNoIHBhdHRlcm4gc2VwYXJhdGVkIGJ5IGEgY29sb24KKyI6IiAodGhpcyBtZWFucyB0aGF0IGEgcmVmIG5hbWUgY2Fubm90IGhhdmUgYSBjb2xvbiBpbiBpdCkuICBBCitzaW5nbGUgcGF0dGVybiAnPG5hbWU+JyBpcyBqdXN0IGEgc2hvcnRoYW5kIGZvciAnPG5hbWU+OjxuYW1lPicuCisKK0VhY2ggcGF0dGVybiBwYWlyIGNvbnNpc3RzIG9mIHRoZSBzb3VyY2Ugc2lkZSAoYmVmb3JlIHRoZSBjb2xvbikKK2FuZCB0aGUgZGVzdGluYXRpb24gc2lkZSAoYWZ0ZXIgdGhlIGNvbG9uKS4gIFRoZSByZWYgdG8gYmUKK3B1c2hlZCBpcyBkZXRlcm1pbmVkIGJ5IGZpbmRpbmcgYSBtYXRjaCB0aGF0IG1hdGNoZXMgdGhlIHNvdXJjZQorc2lkZSwgYW5kIHdoZXJlIGl0IGlzIHB1c2hlZCBpcyBkZXRlcm1pbmVkIGJ5IHVzaW5nIHRoZQorZGVzdGluYXRpb24gc2lkZS4gVGhlIHJ1bGVzIHVzZWQgdG8gbWF0Y2ggYSByZWYgYXJlIHRoZSBzYW1lCitydWxlcyB1c2VkIGJ5IGxpbmtnaXQ6Z2l0LXJldi1wYXJzZVsxXSB0byByZXNvbHZlIGEgc3ltYm9saWMgcmVmCituYW1lLgorCisgLSBJdCBpcyBhbiBlcnJvciBpZiA8c3JjPiBkb2VzIG5vdCBtYXRjaCBleGFjdGx5IG9uZSBvZiB0aGUKKyAgIGxvY2FsIHJlZnMuCisKKyAtIEl0IGlzIGFuIGVycm9yIGlmIDxkc3Q+IG1hdGNoZXMgbW9yZSB0aGFuIG9uZSByZW1vdGUgcmVmcy4KKworIC0gSWYgPGRzdD4gZG9lcyBub3QgbWF0Y2ggYW55IHJlbW90ZSByZWYsIGVpdGhlcgorCisgICAqIGl0IGhhcyB0byBzdGFydCB3aXRoICJyZWZzLyI7IDxkc3Q+IGlzIHVzZWQgYXMgdGhlCisgICAgIGRlc3RpbmF0aW9uIGxpdGVyYWxseSBpbiB0aGlzIGNhc2UuCisKKyAgICogPHNyYz4gPT0gPGRzdD4gYW5kIHRoZSByZWYgdGhhdCBtYXRjaGVkIHRoZSA8c3JjPiBtdXN0IG5vdAorICAgICBleGlzdCBpbiB0aGUgc2V0IG9mIHJlbW90ZSByZWZzOyB0aGUgcmVmIG1hdGNoZWQgPHNyYz4KKyAgICAgbG9jYWxseSBpcyB1c2VkIGFzIHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbi4KKworV2l0aG91dCAnLS1mb3JjZScsIHRoZSA8c3JjPiByZWYgaXMgc3RvcmVkIGF0IHRoZSByZW1vdGUgb25seSBpZgorPGRzdD4gZG9lcyBub3QgZXhpc3QsIG9yIDxkc3Q+IGlzIGEgcHJvcGVyIHN1YnNldCAoaS5lLiBhbgorYW5jZXN0b3IpIG9mIDxzcmM+LiAgVGhpcyBjaGVjaywga25vd24gYXMgImZhc3QgZm9yd2FyZCBjaGVjayIsCitpcyBwZXJmb3JtZWQgaW4gb3JkZXIgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IG92ZXJ3cml0aW5nIHRoZQorcmVtb3RlIHJlZiBhbmQgbG9zZSBvdGhlciBwZW9wbGVzJyBjb21taXRzIGZyb20gdGhlcmUuCisKK1dpdGggJy0tZm9yY2UnLCB0aGUgZmFzdCBmb3J3YXJkIGNoZWNrIGlzIGRpc2FibGVkIGZvciBhbGwgcmVmcy4KKworT3B0aW9uYWxseSwgYSA8cmVmPiBwYXJhbWV0ZXIgY2FuIGJlIHByZWZpeGVkIHdpdGggYSBwbHVzICcrJyBzaWduCit0byBkaXNhYmxlIHRoZSBmYXN0LWZvcndhcmQgY2hlY2sgb25seSBvbiB0aGF0IHJlZi4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vLgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXNoLXNldHVwLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXNoLXNldHVwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmI4Yjc1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc2gtc2V0dXAudHh0CkBAIC0wLDAgKzEsODAgQEAKK2dpdC1zaC1zZXR1cCgxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zaC1zZXR1cCAtIENvbW1vbiBnaXQgc2hlbGwgc2NyaXB0IHNldHVwIGNvZGUKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXNoLXNldHVwJworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworVGhpcyBpcyBub3QgYSBjb21tYW5kIHRoZSBlbmQgdXNlciB3b3VsZCB3YW50IHRvIHJ1bi4gIEV2ZXIuCitUaGlzIGRvY3VtZW50YXRpb24gaXMgbWVhbnQgZm9yIHBlb3BsZSB3aG8gYXJlIHN0dWR5aW5nIHRoZQorUG9yY2VsYWluLWlzaCBzY3JpcHRzIGFuZC9vciBhcmUgd3JpdGluZyBuZXcgb25lcy4KKworVGhlIGBnaXQtc2gtc2V0dXBgIHNjcmlwdGxldCBpcyBkZXNpZ25lZCB0byBiZSBzb3VyY2VkICh1c2luZworYC5gKSBieSBvdGhlciBzaGVsbCBzY3JpcHRzIHRvIHNldCB1cCBzb21lIHZhcmlhYmxlcyBwb2ludGluZyBhdAordGhlIG5vcm1hbCBnaXQgZGlyZWN0b3JpZXMgYW5kIGEgZmV3IGhlbHBlciBzaGVsbCBmdW5jdGlvbnMuCisKK0JlZm9yZSBzb3VyY2luZyBpdCwgeW91ciBzY3JpcHQgc2hvdWxkIHNldCB1cCBhIGZldyB2YXJpYWJsZXM7CitgVVNBR0VgIChhbmQgYExPTkdfVVNBR0VgLCBpZiBhbnkpIGlzIHVzZWQgdG8gZGVmaW5lIG1lc3NhZ2UKK2dpdmVuIGJ5IGB1c2FnZSgpYCBzaGVsbCBmdW5jdGlvbi4gIGBTVUJESVJFQ1RPUllfT0tgIGNhbiBiZSBzZXQKK2lmIHRoZSBzY3JpcHQgY2FuIHJ1biBmcm9tIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSB3b3JraW5nIHRyZWUKKyhzb21lIGNvbW1hbmRzIGRvIG5vdCkuCisKK1RoZSBzY3JpcHRsZXQgc2V0cyBgR0lUX0RJUmAgYW5kIGBHSVRfT0JKRUNUX0RJUkVDVE9SWWAgc2hlbGwKK3ZhcmlhYmxlcywgYnV0IGRvZXMgKm5vdCogZXhwb3J0IHRoZW0gdG8gdGhlIGVudmlyb25tZW50LgorCitGVU5DVElPTlMKKy0tLS0tLS0tLQorCitkaWU6OgorCWV4aXQgYWZ0ZXIgZW1pdHRpbmcgdGhlIHN1cHBsaWVkIGVycm9yIG1lc3NhZ2UgdG8gdGhlCisJc3RhbmRhcmQgZXJyb3Igc3RyZWFtLgorCit1c2FnZTo6CisJZGllIHdpdGggdGhlIHVzYWdlIG1lc3NhZ2UuCisKK3NldF9yZWZsb2dfYWN0aW9uOjoKKwlzZXQgdGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIHJlY29yZGVkIHRvIGRlc2NyaWJlIHRoZQorCWVuZC11c2VyIGFjdGlvbiBpbiB0aGUgcmVmbG9nLCB3aGVuIHRoZSBzY3JpcHQgdXBkYXRlcyBhCisJcmVmLgorCitnaXRfZWRpdG9yOjoKKwlydW5zIGFuIGVkaXRvciBvZiB1c2VyJ3MgY2hvaWNlIChHSVRfRURJVE9SLCBjb3JlLmVkaXRvciwgVklTVUFMIG9yCisJRURJVE9SKSBvbiBhIGdpdmVuIGZpbGUsIGJ1dCBlcnJvciBvdXQgaWYgbm8gZWRpdG9yIGlzIHNwZWNpZmllZAorCWFuZCB0aGUgdGVybWluYWwgaXMgZHVtYi4KKworaXNfYmFyZV9yZXBvc2l0b3J5OjoKKwlvdXRwdXRzIGB0cnVlYCBvciBgZmFsc2VgIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgc3RyZWFtCisJdG8gaW5kaWNhdGUgaWYgdGhlIHJlcG9zaXRvcnkgaXMgYSBiYXJlIHJlcG9zaXRvcnkKKwkoaS5lLiB3aXRob3V0IGFuIGFzc29jaWF0ZWQgd29ya2luZyB0cmVlKS4KKworY2RfdG9fdG9wbGV2ZWw6OgorCXJ1bnMgY2hkaXIgdG8gdGhlIHRvcGxldmVsIG9mIHRoZSB3b3JraW5nIHRyZWUuCisKK3JlcXVpcmVfd29ya190cmVlOjoKKwljaGVja3MgaWYgdGhlIHJlcG9zaXRvcnkgaXMgYSBiYXJlIHJlcG9zaXRvcnksIGFuZCBkaWVzCisJaWYgc28uICBVc2VkIGJ5IHNjcmlwdHMgdGhhdCByZXF1aXJlIHdvcmtpbmcgdHJlZQorCShlLmcuIGBjaGVja291dGApLgorCitnZXRfYXV0aG9yX2lkZW50X2Zyb21fY29tbWl0OjoKKwlvdXRwdXRzIGNvZGUgZm9yIHVzZSB3aXRoIGV2YWwgdG8gc2V0IHRoZSBHSVRfQVVUSE9SX05BTUUsCisJR0lUX0FVVEhPUl9FTUFJTCBhbmQgR0lUX0FVVEhPUl9EQVRFIHZhcmlhYmxlcyBmb3IgYSBnaXZlbiBjb21taXQuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zaGVsbC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zaGVsbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMwMzFlMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXNoZWxsLnR4dApAQCAtMCwwICsxLDM0IEBACitnaXQtc2hlbGwoMSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtc2hlbGwgLSBSZXN0cmljdGVkIGxvZ2luIHNoZWxsIGZvciBHSVQtb25seSBTU0ggYWNjZXNzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXNoZWxsJyAtYyA8Y29tbWFuZD4gPGFyZ3VtZW50PgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoaXMgaXMgbWVhbnQgdG8gYmUgdXNlZCBhcyBhIGxvZ2luIHNoZWxsIGZvciBTU0ggYWNjb3VudHMgeW91IHdhbnQKK3RvIHJlc3RyaWN0IHRvIEdJVCBwdWxsL3B1c2ggYWNjZXNzIG9ubHkuIEl0IHBlcm1pdHMgZXhlY3V0aW9uIG9ubHkKK29mIHNlcnZlci1zaWRlIEdJVCBjb21tYW5kcyBpbXBsZW1lbnRpbmcgdGhlIHB1bGwvcHVzaCBmdW5jdGlvbmFsaXR5LgorVGhlIGNvbW1hbmRzIGNhbiBiZSBleGVjdXRlZCBvbmx5IGJ5IHRoZSAnLWMnIG9wdGlvbjsgdGhlIHNoZWxsIGlzIG5vdAoraW50ZXJhY3RpdmUuCisKK0N1cnJlbnRseSwgb25seSB0aGUgYGdpdC1yZWNlaXZlLXBhY2tgIGFuZCBgZ2l0LXVwbG9hZC1wYWNrYCBjb21tYW5kcworYXJlIHBlcm1pdHRlZCB0byBiZSBjYWxsZWQsIHdpdGggYSBzaW5nbGUgcmVxdWlyZWQgYXJndW1lbnQuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgUGV0ciBCYXVkaXMgYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc2hvcnRsb2cudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc2hvcnRsb2cudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NzUyNTcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zaG9ydGxvZy50eHQKQEAgLTAsMCArMSw2MiBAQAorZ2l0LXNob3J0bG9nKDEpCis9PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXNob3J0bG9nIC0gU3VtbWFyaXplICdnaXQgbG9nJyBvdXRwdXQKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCitnaXQtbG9nIC0tcHJldHR5PXNob3J0IHwgJ2dpdC1zaG9ydGxvZycgWy1oXSBbLW5dIFstc10gWy1lXQorZ2l0LXNob3J0bG9nIFstbnwtLW51bWJlcmVkXSBbLXN8LS1zdW1tYXJ5XSBbLWV8LS1lbWFpbF0gWzxjb21taXR0aXNoPi4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitTdW1tYXJpemVzICdnaXQgbG9nJyBvdXRwdXQgaW4gYSBmb3JtYXQgc3VpdGFibGUgZm9yIGluY2x1c2lvbgoraW4gcmVsZWFzZSBhbm5vdW5jZW1lbnRzLiBFYWNoIGNvbW1pdCB3aWxsIGJlIGdyb3VwZWQgYnkgYXV0aG9yIGFuZAordGhlIGZpcnN0IGxpbmUgb2YgdGhlIGNvbW1pdCBtZXNzYWdlIHdpbGwgYmUgc2hvd24uCisKK0FkZGl0aW9uYWxseSwgIltQQVRDSF0iIHdpbGwgYmUgc3RyaXBwZWQgZnJvbSB0aGUgY29tbWl0IGRlc2NyaXB0aW9uLgorCitPUFRJT05TCistLS0tLS0tCisKKy1oLCBcLS1oZWxwOjoKKwlQcmludCBhIHNob3J0IHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuCisKKy1uLCBcLS1udW1iZXJlZDo6CisJU29ydCBvdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgb2YgY29tbWl0cyBwZXIgYXV0aG9yIGluc3RlYWQKKwlvZiBhdXRob3IgYWxwaGFiZXRpYyBvcmRlci4KKworLXMsIFwtLXN1bW1hcnk6OgorCVN1cHByZXNzIGNvbW1pdCBkZXNjcmlwdGlvbiBhbmQgcHJvdmlkZSBhIGNvbW1pdCBjb3VudCBzdW1tYXJ5IG9ubHkuCisKKy1lLCBcLS1lbWFpbDo6CisJU2hvdyB0aGUgZW1haWwgYWRkcmVzcyBvZiBlYWNoIGF1dGhvci4KKworRklMRVMKKy0tLS0tCisKK0lmIHRoZSBmaWxlIGAubWFpbG1hcGAgZXhpc3RzLCBpdCB3aWxsIGJlIHVzZWQgZm9yIG1hcHBpbmcgYXV0aG9yCitlbWFpbCBhZGRyZXNzZXMgdG8gYSByZWFsIGF1dGhvciBuYW1lLiBPbmUgbWFwcGluZyBwZXIgbGluZSwgZmlyc3QKK3RoZSBhdXRob3IgbmFtZSBmb2xsb3dlZCBieSB0aGUgZW1haWwgYWRkcmVzcyBlbmNsb3NlZCBieQorJzwnIGFuZCAnPicuIFVzZSBoYXNoICcjJyBmb3IgY29tbWVudHMuIEV4YW1wbGU6CisKKy0tLS0tLS0tLS0tLQorIyBLZWVwIGFscGhhYmV0aXplZAorQWRhbSBNb3Jyb3cgPGFkYW1AbG9jYWxob3N0LmxvY2FsZG9tYWluPgorRXZlIEpvbmVzIDxldmVAbGFwdG9wLihub25lKT4KKy0tLS0tLS0tLS0tLQorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vLgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXNob3ctYnJhbmNoLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXNob3ctYnJhbmNoLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmI4MjUwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc2hvdy1icmFuY2gudHh0CkBAIC0wLDAgKzEsMTkzIEBACitnaXQtc2hvdy1icmFuY2goMSkKKz09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtc2hvdy1icmFuY2ggLSBTaG93IGJyYW5jaGVzIGFuZCB0aGVpciBjb21taXRzCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1zaG93LWJyYW5jaCcgWy0tYWxsXSBbLS1yZW1vdGVzXSBbLS10b3BvLW9yZGVyXSBbLS1jdXJyZW50XQorCQlbLS1tb3JlPTxuPiB8IC0tbGlzdCB8IC0taW5kZXBlbmRlbnQgfCAtLW1lcmdlLWJhc2VdCisJCVstLW5vLW5hbWUgfCAtLXNoYTEtbmFtZV0gWy0tdG9waWNzXSBbPHJldj4gfCA8Z2xvYj5dLi4uCisnZ2l0LXNob3ctYnJhbmNoJyAoLWd8LS1yZWZsb2cpWz08bj5bLDxiYXNlPl1dIFstLWxpc3RdIFs8cmVmPl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK1Nob3dzIHRoZSBjb21taXQgYW5jZXN0cnkgZ3JhcGggc3RhcnRpbmcgZnJvbSB0aGUgY29tbWl0cyBuYW1lZAord2l0aCA8cmV2PnMgb3IgPGdsb2JzPnMgKG9yIGFsbCByZWZzIHVuZGVyICRHSVRfRElSL3JlZnMvaGVhZHMKK2FuZC9vciAkR0lUX0RJUi9yZWZzL3RhZ3MpIHNlbWktdmlzdWFsbHkuCisKK0l0IGNhbm5vdCBzaG93IG1vcmUgdGhhbiAyOSBicmFuY2hlcyBhbmQgY29tbWl0cyBhdCBhIHRpbWUuCisKK0l0IHVzZXMgYHNob3dicmFuY2guZGVmYXVsdGAgbXVsdGktdmFsdWVkIGNvbmZpZ3VyYXRpb24gaXRlbXMgaWYKK25vIDxyZXY+IG5vciA8Z2xvYj4gaXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KKworCitPUFRJT05TCistLS0tLS0tCis8cmV2Pjo6CisJQXJiaXRyYXJ5IGV4dGVuZGVkIFNIQTEgZXhwcmVzc2lvbiAoc2VlIGBnaXQtcmV2LXBhcnNlYCkKKwl0aGF0IHR5cGljYWxseSBuYW1lcyBhIGJyYW5jaCBIRUFEIG9yIGEgdGFnLgorCis8Z2xvYj46OgorCUEgZ2xvYiBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBicmFuY2ggb3IgdGFnIG5hbWVzIHVuZGVyCisJJEdJVF9ESVIvcmVmcy4gIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBtYW55IHRvcGljCisJYnJhbmNoZXMgdW5kZXIgJEdJVF9ESVIvcmVmcy9oZWFkcy90b3BpYywgZ2l2aW5nCisJYHRvcGljLypgIHdvdWxkIHNob3cgYWxsIG9mIHRoZW0uCisKKy1yfC0tcmVtb3Rlczo6CisJU2hvdyB0aGUgcmVtb3RlLXRyYWNraW5nIGJyYW5jaGVzLgorCistYXwtLWFsbDo6CisJU2hvdyBib3RoIHJlbW90ZS10cmFja2luZyBicmFuY2hlcyBhbmQgbG9jYWwgYnJhbmNoZXMuCisKKy0tY3VycmVudDo6CisJV2l0aCB0aGlzIG9wdGlvbiwgdGhlIGNvbW1hbmQgaW5jbHVkZXMgdGhlIGN1cnJlbnQKKwlicmFuY2ggdG8gdGhlIGxpc3Qgb2YgcmV2cyB0byBiZSBzaG93biB3aGVuIGl0IGlzIG5vdAorCWdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCisKKy0tdG9wby1vcmRlcjo6CisgICAgICAgIEJ5IGRlZmF1bHQsIHRoZSBicmFuY2hlcyBhbmQgdGhlaXIgY29tbWl0cyBhcmUgc2hvd24gaW4KKyAgICAgICAgcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLiAgVGhpcyBvcHRpb24gbWFrZXMgdGhlbQorICAgICAgICBhcHBlYXIgaW4gdG9wb2xvZ2ljYWwgb3JkZXIgKGkuZS4sIGRlc2NlbmRhbnQgY29tbWl0cworICAgICAgICBhcmUgc2hvd24gYmVmb3JlIHRoZWlyIHBhcmVudHMpLgorCistLXNwYXJzZTo6CisJQnkgZGVmYXVsdCwgdGhlIG91dHB1dCBvbWl0cyBtZXJnZXMgdGhhdCBhcmUgcmVhY2hhYmxlCisJZnJvbSBvbmx5IG9uZSB0aXAgYmVpbmcgc2hvd24uICBUaGlzIG9wdGlvbiBtYWtlcyB0aGVtCisJdmlzaWJsZS4KKworLS1tb3JlPTxuPjo6CisJVXN1YWxseSB0aGUgY29tbWFuZCBzdG9wcyBvdXRwdXQgdXBvbiBzaG93aW5nIHRoZSBjb21taXQKKwl0aGF0IGlzIHRoZSBjb21tb24gYW5jZXN0b3Igb2YgYWxsIHRoZSBicmFuY2hlcy4gIFRoaXMKKwlmbGFnIHRlbGxzIHRoZSBjb21tYW5kIHRvIGdvIDxuPiBtb3JlIGNvbW1vbiBjb21taXRzCisJYmV5b25kIHRoYXQuICBXaGVuIDxuPiBpcyBuZWdhdGl2ZSwgZGlzcGxheSBvbmx5IHRoZQorCTxyZWZlcmVuY2U+cyBnaXZlbiwgd2l0aG91dCBzaG93aW5nIHRoZSBjb21taXQgYW5jZXN0cnkKKwl0cmVlLgorCistLWxpc3Q6OgorCVN5bm9ueW0gdG8gYC0tbW9yZT0tMWAKKworLS1tZXJnZS1iYXNlOjoKKwlJbnN0ZWFkIG9mIHNob3dpbmcgdGhlIGNvbW1pdCBsaXN0LCBqdXN0IGFjdCBsaWtlIHRoZQorCSdnaXQtbWVyZ2UtYmFzZSAtYScgY29tbWFuZCwgZXhjZXB0IHRoYXQgaXQgY2FuIGFjY2VwdAorCW1vcmUgdGhhbiB0d28gaGVhZHMuCisKKy0taW5kZXBlbmRlbnQ6OgorCUFtb25nIHRoZSA8cmVmZXJlbmNlPnMgZ2l2ZW4sIGRpc3BsYXkgb25seSB0aGUgb25lcyB0aGF0CisJY2Fubm90IGJlIHJlYWNoZWQgZnJvbSBhbnkgb3RoZXIgPHJlZmVyZW5jZT4uCisKKy0tbm8tbmFtZTo6CisJRG8gbm90IHNob3cgbmFtaW5nIHN0cmluZ3MgZm9yIGVhY2ggY29tbWl0LgorCistLXNoYTEtbmFtZTo6CisJSW5zdGVhZCBvZiBuYW1pbmcgdGhlIGNvbW1pdHMgdXNpbmcgdGhlIHBhdGggdG8gcmVhY2gKKwl0aGVtIGZyb20gaGVhZHMgKGUuZy4gIm1hc3Rlcn4yIiB0byBtZWFuIHRoZSBncmFuZHBhcmVudAorCW9mICJtYXN0ZXIiKSwgbmFtZSB0aGVtIHdpdGggdGhlIHVuaXF1ZSBwcmVmaXggb2YgdGhlaXIKKwlvYmplY3QgbmFtZXMuCisKKy0tdG9waWNzOjoKKwlTaG93cyBvbmx5IGNvbW1pdHMgdGhhdCBhcmUgTk9UIG9uIHRoZSBmaXJzdCBicmFuY2ggZ2l2ZW4uCisJVGhpcyBoZWxwcyB0cmFjayB0b3BpYyBicmFuY2hlcyBieSBoaWRpbmcgYW55IGNvbW1pdCB0aGF0CisJaXMgYWxyZWFkeSBpbiB0aGUgbWFpbiBsaW5lIG9mIGRldmVsb3BtZW50LiAgV2hlbiBnaXZlbgorCSJnaXQgc2hvdy1icmFuY2ggLS10b3BpY3MgbWFzdGVyIHRvcGljMSB0b3BpYzIiLCB0aGlzCisJd2lsbCBzaG93IHRoZSByZXZpc2lvbnMgZ2l2ZW4gYnkgImdpdCByZXYtbGlzdCB7Y2FyZXR9bWFzdGVyCisJdG9waWMxIHRvcGljMiIKKworLS1yZWZsb2dbPTxuPlssPGJhc2U+XV0gWzxyZWY+XTo6CisJU2hvd3MgPG4+IG1vc3QgcmVjZW50IHJlZi1sb2cgZW50cmllcyBmb3IgdGhlIGdpdmVuCisJcmVmLiAgSWYgPGJhc2U+IGlzIGdpdmVuLCA8bj4gZW50cmllcyBnb2luZyBiYWNrIGZyb20KKwl0aGF0IGVudHJ5LiAgPGJhc2U+IGNhbiBiZSBzcGVjaWZpZWQgYXMgY291bnQgb3IgZGF0ZS4KKwlgLWdgIGNhbiBiZSB1c2VkIGFzIGEgc2hvcnQtaGFuZCBmb3IgdGhpcyBvcHRpb24uICBXaGVuCisJbm8gZXhwbGljaXQgPHJlZj4gcGFyYW1ldGVyIGlzIGdpdmVuLCBpdCBkZWZhdWx0cyB0byB0aGUKKwljdXJyZW50IGJyYW5jaCAob3IgYEhFQURgIGlmIGl0IGlzIGRldGFjaGVkKS4KKworTm90ZSB0aGF0IC0tbW9yZSwgLS1saXN0LCAtLWluZGVwZW5kZW50IGFuZCAtLW1lcmdlLWJhc2Ugb3B0aW9ucworYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KKworCitPVVRQVVQKKy0tLS0tLQorR2l2ZW4gTiA8cmVmZXJlbmNlcz4sIHRoZSBmaXJzdCBOIGxpbmVzIGFyZSB0aGUgb25lLWxpbmUKK2Rlc2NyaXB0aW9uIGZyb20gdGhlaXIgY29tbWl0IG1lc3NhZ2UuICBUaGUgYnJhbmNoIGhlYWQgdGhhdCBpcworcG9pbnRlZCBhdCBieSAkR0lUX0RJUi9IRUFEIGlzIHByZWZpeGVkIHdpdGggYW4gYXN0ZXJpc2sgYCpgCitjaGFyYWN0ZXIgd2hpbGUgb3RoZXIgaGVhZHMgYXJlIHByZWZpeGVkIHdpdGggYSBgIWAgY2hhcmFjdGVyLgorCitGb2xsb3dpbmcgdGhlc2UgTiBsaW5lcywgb25lLWxpbmUgbG9nIGZvciBlYWNoIGNvbW1pdCBpcworZGlzcGxheWVkLCBpbmRlbnRlZCBOIHBsYWNlcy4gIElmIGEgY29tbWl0IGlzIG9uIHRoZSBJLXRoCiticmFuY2gsIHRoZSBJLXRoIGluZGVudGF0aW9uIGNoYXJhY3RlciBzaG93cyBhIGArYCBzaWduOworb3RoZXJ3aXNlIGl0IHNob3dzIGEgc3BhY2UuICBNZXJnZSBjb21taXRzIGFyZSBkZW5vdGVkIGJ5CithIGAtYCBzaWduLiAgRWFjaCBjb21taXQgc2hvd3MgYSBzaG9ydCBuYW1lIHRoYXQKK2NhbiBiZSB1c2VkIGFzIGFuIGV4dGVuZGVkIFNIQTEgdG8gbmFtZSB0aGF0IGNvbW1pdC4KKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHRocmVlIGJyYW5jaGVzLCAibWFzdGVyIiwgImZpeGVzIgorYW5kICJtaGYiOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3ctYnJhbmNoIG1hc3RlciBmaXhlcyBtaGYKKyogW21hc3Rlcl0gQWRkICdnaXQgc2hvdy1icmFuY2gnLgorICEgW2ZpeGVzXSBJbnRyb2R1Y2UgInJlc2V0IHR5cGUiIGZsYWcgdG8gImdpdCByZXNldCIKKyAgISBbbWhmXSBBbGxvdyAiK3JlbW90ZTpsb2NhbCIgcmVmc3BlYyB0byBjYXVzZSAtLWZvcmNlIHdoZW4gZmV0Y2hpbmcuCistLS0KKyAgKyBbbWhmXSBBbGxvdyAiK3JlbW90ZTpsb2NhbCIgcmVmc3BlYyB0byBjYXVzZSAtLWZvcmNlIHdoZW4gZmV0Y2hpbmcuCisgICsgW21oZn4xXSBVc2UgZ2l0LW9jdG9wdXMgd2hlbiBwdWxsaW5nIG1vcmUgdGhhbiBvbmUgaGVhZHMuCisgKyAgW2ZpeGVzXSBJbnRyb2R1Y2UgInJlc2V0IHR5cGUiIGZsYWcgdG8gImdpdCByZXNldCIKKyAgKyBbbWhmfjJdICJnaXQgZmV0Y2ggLS1mb3JjZSIuCisgICsgW21oZn4zXSBVc2UgLmdpdC9yZW1vdGUvb3JpZ2luLCBub3QgLmdpdC9icmFuY2hlcy9vcmlnaW4uCisgICsgW21oZn40XSBNYWtlICJnaXQgcHVsbCIgYW5kICJnaXQgZmV0Y2giIGRlZmF1bHQgdG8gb3JpZ2luCisgICsgW21oZn41XSBJbmZhbW91cyAnb2N0b3B1cyBtZXJnZScKKyAgKyBbbWhmfjZdIFJldGlyZSBnaXQtcGFyc2UtcmVtb3RlLgorICArIFttaGZ+N10gTXVsdGktaGVhZCBmZXRjaC4KKyAgKyBbbWhmfjhdIFN0YXJ0IGFkZGluZyB0aGUgJEdJVF9ESVIvcmVtb3Rlcy8gc3VwcG9ydC4KKyorKyBbbWFzdGVyXSBBZGQgJ2dpdCBzaG93LWJyYW5jaCcuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlc2UgdGhyZWUgYnJhbmNoZXMgYWxsIGZvcmtlZCBmcm9tIGEgY29tbW9uIGNvbW1pdCwgW21hc3Rlcl0sCit3aG9zZSBjb21taXQgbWVzc2FnZSBpcyAiQWRkICdnaXQgc2hvdy1icmFuY2gnLiAgImZpeGVzIiBicmFuY2gKK2FkZHMgb25lIGNvbW1pdCAnSW50cm9kdWNlICJyZXNldCB0eXBlIicuICAibWhmIiBicmFuY2ggaGFzIG1hbnkKK290aGVyIGNvbW1pdHMuICBUaGUgY3VycmVudCBicmFuY2ggaXMgIm1hc3RlciIuCisKKworRVhBTVBMRQorLS0tLS0tLQorCitJZiB5b3Uga2VlcCB5b3VyIHByaW1hcnkgYnJhbmNoZXMgaW1tZWRpYXRlbHkgdW5kZXIKK2AkR0lUX0RJUi9yZWZzL2hlYWRzYCwgYW5kIHRvcGljIGJyYW5jaGVzIGluIHN1YmRpcmVjdG9yaWVzIG9mCitpdCwgaGF2aW5nIHRoZSBmb2xsb3dpbmcgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBtYXkgaGVscDoKKworLS0tLS0tLS0tLS0tCitbc2hvd2JyYW5jaF0KKwlkZWZhdWx0ID0gLS10b3BvLW9yZGVyCisJZGVmYXVsdCA9IGhlYWRzLyoKKworLS0tLS0tLS0tLS0tCisKK1dpdGggdGhpcywgYGdpdCBzaG93LWJyYW5jaGAgd2l0aG91dCBleHRyYSBwYXJhbWV0ZXJzIHdvdWxkIHNob3cKK29ubHkgdGhlIHByaW1hcnkgYnJhbmNoZXMuICBJbiBhZGRpdGlvbiwgaWYgeW91IGhhcHBlbiB0byBiZSBvbgoreW91ciB0b3BpYyBicmFuY2gsIGl0IGlzIHNob3duIGFzIHdlbGwuCisKKy0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdy1icmFuY2ggLS1yZWZsb2c9JzEwLDEgaG91ciBhZ28nIC0tbGlzdCBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCitzaG93cyAxMCByZWZsb2cgZW50cmllcyBnb2luZyBiYWNrIGZyb20gdGhlIHRpcCBhcyBvZiAxIGhvdXIgYWdvLgorV2l0aG91dCBgLS1saXN0YCwgdGhlIG91dHB1dCBhbHNvIHNob3dzIGhvdyB0aGVzZSB0aXBzIGFyZQordG9wb2xvZ2ljYWxseSByZWxhdGVkIHdpdGggZWFjaCBvdGhlci4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8uCisKKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zaG93LWluZGV4LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXNob3ctaW5kZXgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNWE4ODQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zaG93LWluZGV4LnR4dApAQCAtMCwwICsxLDM0IEBACitnaXQtc2hvdy1pbmRleCgxKQorPT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXNob3ctaW5kZXggLSBTaG93IHBhY2tlZCBhcmNoaXZlIGluZGV4CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXNob3ctaW5kZXgnIDwgaWR4LWZpbGUKKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1JlYWRzIGdpdmVuIGlkeCBmaWxlIGZvciBwYWNrZWQgZ2l0IGFyY2hpdmUgY3JlYXRlZCB3aXRoCitnaXQtcGFjay1vYmplY3RzIGNvbW1hbmQsIGFuZCBkdW1wcyBpdHMgY29udGVudHMuCisKK1RoZSBpbmZvcm1hdGlvbiBpdCBvdXRwdXRzIGlzIHN1YnNldCBvZiB3aGF0IHlvdSBjYW4gZ2V0IGZyb20KKydnaXQtdmVyaWZ5LXBhY2sgLXYnOyB0aGlzIGNvbW1hbmQgb25seSBzaG93cyB0aGUgcGFja2ZpbGUKK29mZnNldCBhbmQgU0hBMSBvZiBlYWNoIG9iamVjdC4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc2hvdy1yZWYudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc2hvdy1yZWYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMGU2NDMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zaG93LXJlZi50eHQKQEAgLTAsMCArMSwxNzIgQEAKK2dpdC1zaG93LXJlZigxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zaG93LXJlZiAtIExpc3QgcmVmZXJlbmNlcyBpbiBhIGxvY2FsIHJlcG9zaXRvcnkKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LXNob3ctcmVmJyBbLXF8LS1xdWlldF0gWy0tdmVyaWZ5XSBbLWh8LS1oZWFkXSBbLWR8LS1kZXJlZmVyZW5jZV0KKwkgICAgIFstc3wtLWhhc2hdIFstLWFiYnJldl0gWy0tdGFnc10gWy0taGVhZHNdIFstLV0gPHBhdHRlcm4+Li4uCisnZ2l0LXNob3ctcmVmJyAtLWV4Y2x1ZGUtZXhpc3RpbmdbPXBhdHRlcm5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitEaXNwbGF5cyByZWZlcmVuY2VzIGF2YWlsYWJsZSBpbiBhIGxvY2FsIHJlcG9zaXRvcnkgYWxvbmcgd2l0aCB0aGUgYXNzb2NpYXRlZAorY29tbWl0IElEcy4gUmVzdWx0cyBjYW4gYmUgZmlsdGVyZWQgdXNpbmcgYSBwYXR0ZXJuIGFuZCB0YWdzIGNhbiBiZQorZGVyZWZlcmVuY2VkIGludG8gb2JqZWN0IElEcy4gQWRkaXRpb25hbGx5LCBpdCBjYW4gYmUgdXNlZCB0byB0ZXN0IHdoZXRoZXIgYQorcGFydGljdWxhciByZWYgZXhpc3RzLgorCitUaGUgLS1leGNsdWRlLWV4aXN0aW5nIGZvcm0gaXMgYSBmaWx0ZXIgdGhhdCBkb2VzIHRoZSBpbnZlcnNlLCBpdCBzaG93cyB0aGUKK3JlZnMgZnJvbSBzdGRpbiB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBsb2NhbCByZXBvc2l0b3J5LgorCitVc2Ugb2YgdGhpcyB1dGlsaXR5IGlzIGVuY291cmFnZWQgaW4gZmF2b3Igb2YgZGlyZWN0bHkgYWNjZXNzaW5nIGZpbGVzIHVuZGVyCitpbiB0aGUgYC5naXRgIGRpcmVjdG9yeS4KKworT1BUSU9OUworLS0tLS0tLQorCistaCwgLS1oZWFkOjoKKworCVNob3cgdGhlIEhFQUQgcmVmZXJlbmNlLgorCistLXRhZ3MsIC0taGVhZHM6OgorCisJTGltaXQgdG8gb25seSAicmVmcy9oZWFkcyIgYW5kICJyZWZzL3RhZ3MiLCByZXNwZWN0aXZlbHkuICBUaGVzZQorCW9wdGlvbnMgYXJlIG5vdCBtdXR1YWxseSBleGNsdXNpdmU7IHdoZW4gZ2l2ZW4gYm90aCwgcmVmZXJlbmNlcyBzdG9yZWQKKwlpbiAicmVmcy9oZWFkcyIgYW5kICJyZWZzL3RhZ3MiIGFyZSBkaXNwbGF5ZWQuCisKKy1kLCAtLWRlcmVmZXJlbmNlOjoKKworCURlcmVmZXJlbmNlIHRhZ3MgaW50byBvYmplY3QgSURzIGFzIHdlbGwuIFRoZXkgd2lsbCBiZSBzaG93biB3aXRoICJee30iCisJYXBwZW5kZWQuCisKKy1zLCAtLWhhc2g6OgorCisJT25seSBzaG93IHRoZSBTSEExIGhhc2gsIG5vdCB0aGUgcmVmZXJlbmNlIG5hbWUuIFdoZW4gYWxzbyB1c2luZworCS0tZGVyZWZlcmVuY2UgdGhlIGRlcmVmZXJlbmNlZCB0YWcgd2lsbCBzdGlsbCBiZSBzaG93biBhZnRlciB0aGUgU0hBMS4KKworLS12ZXJpZnk6OgorCisJRW5hYmxlIHN0cmljdGVyIHJlZmVyZW5jZSBjaGVja2luZyBieSByZXF1aXJpbmcgYW4gZXhhY3QgcmVmIHBhdGguCisJQXNpZGUgZnJvbSByZXR1cm5pbmcgYW4gZXJyb3IgY29kZSBvZiAxLCBpdCB3aWxsIGFsc28gcHJpbnQgYW4gZXJyb3IKKwltZXNzYWdlIGlmICctLXF1aWV0JyB3YXMgbm90IHNwZWNpZmllZC4KKworLS1hYmJyZXYsIC0tYWJicmV2PWxlbjo6CisKKwlBYmJyZXZpYXRlIHRoZSBvYmplY3QgbmFtZS4gIFdoZW4gdXNpbmcgYC0taGFzaGAsIHlvdSBkbworCW5vdCBoYXZlIHRvIHNheSBgLS1oYXNoIC0tYWJicmV2YDsgYC0taGFzaD1sZW5gIHdvdWxkIGRvLgorCistcSwgLS1xdWlldDo6CisKKwlEbyBub3QgcHJpbnQgYW55IHJlc3VsdHMgdG8gc3Rkb3V0LiBXaGVuIGNvbWJpbmVkIHdpdGggJy0tdmVyaWZ5JyB0aGlzCisJY2FuIGJlIHVzZWQgdG8gc2lsZW50bHkgY2hlY2sgaWYgYSByZWZlcmVuY2UgZXhpc3RzLgorCistLWV4Y2x1ZGUtZXhpc3RpbmcsIC0tZXhjbHVkZS1leGlzdGluZz1wYXR0ZXJuOjoKKworCU1ha2UgZ2l0LXNob3ctcmVmIGFjdCBhcyBhIGZpbHRlciB0aGF0IHJlYWRzIHJlZnMgZnJvbSBzdGRpbiBvZiB0aGUKKwlmb3JtICJeKD86PGFueXRoaW5nPlxzKT88cmVmbmFtZT4oPzpcXlx7XH0pPyQiIGFuZCBwZXJmb3JtcyB0aGUKKwlmb2xsb3dpbmcgYWN0aW9ucyBvbiBlYWNoOgorCSgxKSBzdHJpcCAiXnt9IiBhdCB0aGUgZW5kIG9mIGxpbmUgaWYgYW55OworCSgyKSBpZ25vcmUgaWYgcGF0dGVybiBpcyBwcm92aWRlZCBhbmQgZG9lcyBub3QgaGVhZC1tYXRjaCByZWZuYW1lOworCSgzKSB3YXJuIGlmIHJlZm5hbWUgaXMgbm90IGEgd2VsbC1mb3JtZWQgcmVmbmFtZSBhbmQgc2tpcDsKKwkoNCkgaWdub3JlIGlmIHJlZm5hbWUgaXMgYSByZWYgdGhhdCBleGlzdHMgaW4gdGhlIGxvY2FsIHJlcG9zaXRvcnk7CisJKDUpIG90aGVyd2lzZSBvdXRwdXQgdGhlIGxpbmUuCisKKworPHBhdHRlcm4+OjoKKworCVNob3cgcmVmZXJlbmNlcyBtYXRjaGluZyBvbmUgb3IgbW9yZSBwYXR0ZXJucy4KKworT1VUUFVUCistLS0tLS0KKworVGhlIG91dHB1dCBpcyBpbiB0aGUgZm9ybWF0OiAnPFNIQS0xIElEPicgJzxzcGFjZT4nICc8cmVmZXJlbmNlIG5hbWU+Jy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3ctcmVmIC0taGVhZCAtLWRlcmVmZXJlbmNlCis4MzJlNzZhOTg5OWY1NjBhOTBmZmQ2MmFlMmNlODNiYmVmZjU4ZjU0IEhFQUQKKzgzMmU3NmE5ODk5ZjU2MGE5MGZmZDYyYWUyY2U4M2JiZWZmNThmNTQgcmVmcy9oZWFkcy9tYXN0ZXIKKzgzMmU3NmE5ODk5ZjU2MGE5MGZmZDYyYWUyY2U4M2JiZWZmNThmNTQgcmVmcy9oZWFkcy9vcmlnaW4KKzM1MjEwMTc1NTZjNWRlNDE1OWRhNDYxNWEzOWZhNGQ1ZDJjMjc5YjUgcmVmcy90YWdzL3YwLjk5LjljCis2ZGRjMDk2NDAzNDM0MjUxOWE4N2ZlMDEzNzgxYWJmMzFjNmRiNmFkIHJlZnMvdGFncy92MC45OS45Y157fQorMDU1ZTRhZTNhZTZlYjM0NGNiYWJmMmE1MjU2YTQ5ZWE2NjA0MDEzMSByZWZzL3RhZ3MvdjEuMHJjNAorNDIzMzI1YTJkMjQ2MzhkZGNjODJjZTQ3YmU1ZTQwYmU1NTBmNDUwNyByZWZzL3RhZ3MvdjEuMHJjNF57fQorLi4uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGVuIHVzaW5nIC0taGFzaCAoYW5kIG5vdCAtLWRlcmVmZXJlbmNlKSB0aGUgb3V0cHV0IGZvcm1hdCBpczogJzxTSEEtMSBJRD4nCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93LXJlZiAtLWhlYWRzIC0taGFzaAorMmUzYmEwMTE0YTFmNTJiNDdkZjI5NzQzZDY5MTVkMDU2YmUxMzI3OAorMTg1MDA4YWU5Nzk2MGM4ZDU1MWFkY2Q5ZTIzNTY1MTk0NjUxYjVkMQorMDNhZGY0MmM5ODgxOTViNTBlMWExOTM1YmE1ZmNiYzM5YjJiMDI5YgorLi4uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFWEFNUExFCistLS0tLS0tCisKK1RvIHNob3cgYWxsIHJlZmVyZW5jZXMgY2FsbGVkICJtYXN0ZXIiLCB3aGV0aGVyIHRhZ3Mgb3IgaGVhZHMgb3IgYW55dGhpbmcKK2Vsc2UsIGFuZCByZWdhcmRsZXNzIG9mIGhvdyBkZWVwIGluIHRoZSByZWZlcmVuY2UgbmFtaW5nIGhpZXJhcmNoeSB0aGV5IGFyZSwKK3VzZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlnaXQgc2hvdy1yZWYgbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHdpbGwgc2hvdyAicmVmcy9oZWFkcy9tYXN0ZXIiIGJ1dCBhbHNvICJyZWZzL3JlbW90ZS9vdGhlci1yZXBvL21hc3RlciIsCitpZiBzdWNoIHJlZmVyZW5jZXMgZXhpc3RzLgorCitXaGVuIHVzaW5nIHRoZSAnLS12ZXJpZnknIGZsYWcsIHRoZSBjb21tYW5kIHJlcXVpcmVzIGFuIGV4YWN0IHBhdGg6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IHJlZnMvaGVhZHMvbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3aWxsIG9ubHkgbWF0Y2ggdGhlIGV4YWN0IGJyYW5jaCBjYWxsZWQgIm1hc3RlciIuCisKK0lmIG5vdGhpbmcgbWF0Y2hlcywgbGlua2dpdDpnaXQtc2hvdy1yZWZbMV0gd2lsbCByZXR1cm4gYW4gZXJyb3IgY29kZSBvZiAxLAorYW5kIGluIHRoZSBjYXNlIG9mIHZlcmlmaWNhdGlvbiwgaXQgd2lsbCBzaG93IGFuIGVycm9yIG1lc3NhZ2UuCisKK0ZvciBzY3JpcHRpbmcsIHlvdSBjYW4gYXNrIGl0IHRvIGJlIHF1aWV0IHdpdGggdGhlICItLXF1aWV0IiBmbGFnLCB3aGljaAorYWxsb3dzIHlvdSB0byBkbyB0aGluZ3MgbGlrZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWdpdC1zaG93LXJlZiAtLXF1aWV0IC0tdmVyaWZ5IC0tICJyZWZzL2hlYWRzLyRoZWFkbmFtZSIgfHwKKwkJZWNobyAiJGhlYWRuYW1lIGlzIG5vdCBhIHZhbGlkIGJyYW5jaCIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RvIGNoZWNrIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIGJyYW5jaCBleGlzdHMgb3Igbm90IChub3RpY2UgaG93IHdlIGRvbid0CithY3R1YWxseSB3YW50IHRvIHNob3cgYW55IHJlc3VsdHMsIGFuZCB3ZSB3YW50IHRvIHVzZSB0aGUgZnVsbCByZWZuYW1lIGZvciBpdAoraW4gb3JkZXIgdG8gbm90IHRyaWdnZXIgdGhlIHByb2JsZW0gd2l0aCBhbWJpZ3VvdXMgcGFydGlhbCBtYXRjaGVzKS4KKworVG8gc2hvdyBvbmx5IHRhZ3MsIG9yIG9ubHkgcHJvcGVyIGJyYW5jaCBoZWFkcywgdXNlICItLXRhZ3MiIGFuZC9vciAiLS1oZWFkcyIKK3Jlc3BlY3RpdmVseSAodXNpbmcgYm90aCBtZWFucyB0aGF0IGl0IHNob3dzIHRhZ3MgYW5kIGhlYWRzLCBidXQgbm90IG90aGVyCityYW5kb20gcmVmZXJlbmNlcyB1bmRlciB0aGUgcmVmcy8gc3ViZGlyZWN0b3J5KS4KKworVG8gZG8gYXV0b21hdGljIHRhZyBvYmplY3QgZGVyZWZlcmVuY2luZywgdXNlIHRoZSAiLWQiIG9yICItLWRlcmVmZXJlbmNlIgorZmxhZywgc28geW91IGNhbiBkbworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWdpdCBzaG93LXJlZiAtLXRhZ3MgLS1kZXJlZmVyZW5jZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordG8gZ2V0IGEgbGlzdGluZyBvZiBhbGwgdGFncyB0b2dldGhlciB3aXRoIHdoYXQgdGhleSBkZXJlZmVyZW5jZS4KKworU0VFIEFMU08KKy0tLS0tLS0tCitsaW5rZ2l0OmdpdC1scy1yZW1vdGVbMV0KKworQVVUSE9SUworLS0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+LgorTWFuIHBhZ2UgYnkgSm9uYXMgRm9uc2VjYSA8Zm9uc2VjYUBkaWt1LmRrPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zaG93LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXNob3cudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjY2YwZTIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zaG93LnR4dApAQCAtMCwwICsxLDg2IEBACitnaXQtc2hvdygxKQorPT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXNob3cgLSBTaG93IHZhcmlvdXMgdHlwZXMgb2Ygb2JqZWN0cworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1zaG93JyBbb3B0aW9uc10gPG9iamVjdD4uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitTaG93cyBvbmUgb3IgbW9yZSBvYmplY3RzIChibG9icywgdHJlZXMsIHRhZ3MgYW5kIGNvbW1pdHMpLgorCitGb3IgY29tbWl0cyBpdCBzaG93cyB0aGUgbG9nIG1lc3NhZ2UgYW5kIHRleHR1YWwgZGlmZi4gSXQgYWxzbworcHJlc2VudHMgdGhlIG1lcmdlIGNvbW1pdCBpbiBhIHNwZWNpYWwgZm9ybWF0IGFzIHByb2R1Y2VkIGJ5CisnZ2l0LWRpZmYtdHJlZSAtLWNjJy4KKworRm9yIHRhZ3MsIGl0IHNob3dzIHRoZSB0YWcgbWVzc2FnZSBhbmQgdGhlIHJlZmVyZW5jZWQgb2JqZWN0cy4KKworRm9yIHRyZWVzLCBpdCBzaG93cyB0aGUgbmFtZXMgKGVxdWl2YWxlbnQgdG8gbGlua2dpdDpnaXQtbHMtdHJlZVsxXQord2l0aCBcLS1uYW1lLW9ubHkpLgorCitGb3IgcGxhaW4gYmxvYnMsIGl0IHNob3dzIHRoZSBwbGFpbiBjb250ZW50cy4KKworVGhlIGNvbW1hbmQgdGFrZXMgb3B0aW9ucyBhcHBsaWNhYmxlIHRvIHRoZSBsaW5rZ2l0OmdpdC1kaWZmLXRyZWVbMV0gY29tbWFuZCB0bworY29udHJvbCBob3cgdGhlIGNoYW5nZXMgdGhlIGNvbW1pdCBpbnRyb2R1Y2VzIGFyZSBzaG93bi4KKworVGhpcyBtYW51YWwgcGFnZSBkZXNjcmliZXMgb25seSB0aGUgbW9zdCBmcmVxdWVudGx5IHVzZWQgb3B0aW9ucy4KKworCitPUFRJT05TCistLS0tLS0tCis8b2JqZWN0Pjo6CisJVGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0byBzaG93LgorCUZvciBhIG1vcmUgY29tcGxldGUgbGlzdCBvZiB3YXlzIHRvIHNwZWxsIG9iamVjdCBuYW1lcywgc2VlCisJIlNQRUNJRllJTkcgUkVWSVNJT05TIiBzZWN0aW9uIGluIGxpbmtnaXQ6Z2l0LXJldi1wYXJzZVsxXS4KKworaW5jbHVkZTo6cHJldHR5LW9wdGlvbnMudHh0W10KKworCitpbmNsdWRlOjpwcmV0dHktZm9ybWF0cy50eHRbXQorCisKK0VYQU1QTEVTCistLS0tLS0tLQorCitnaXQgc2hvdyB2MS4wLjA6OgorCVNob3dzIHRoZSB0YWcgYHYxLjAuMGAsIGFsb25nIHdpdGggdGhlIG9iamVjdCB0aGUgdGFncworCXBvaW50cyBhdC4KKworZ2l0IHNob3cgdjEuMC4wXlx7dHJlZVx9OjoKKwlTaG93cyB0aGUgdHJlZSBwb2ludGVkIHRvIGJ5IHRoZSB0YWcgYHYxLjAuMGAuCisKK2dpdCBzaG93IG5leHR+MTA6RG9jdW1lbnRhdGlvbi9SRUFETUU6OgorCVNob3dzIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBgRG9jdW1lbnRhdGlvbi9SRUFETUVgIGFzCisJdGhleSB3ZXJlIGN1cnJlbnQgaW4gdGhlIDEwdGggbGFzdCBjb21taXQgb2YgdGhlIGJyYW5jaAorCWBuZXh0YC4KKworZ2l0IHNob3cgbWFzdGVyOk1ha2VmaWxlIG1hc3Rlcjp0L01ha2VmaWxlOjoKKwlDb25jYXRlbmF0ZXMgdGhlIGNvbnRlbnRzIG9mIHNhaWQgTWFrZWZpbGVzIGluIHRoZSBoZWFkCisJb2YgdGhlIGJyYW5jaCBgbWFzdGVyYC4KKworRGlzY3Vzc2lvbgorLS0tLS0tLS0tLQorCitpbmNsdWRlOjppMThuLnR4dFtdCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4gYW5kCitKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+LiAgU2lnbmlmaWNhbnRseSBlbmhhbmNlZCBieQorSm9oYW5uZXMgU2NoaW5kZWxpbiA8Sm9oYW5uZXMuU2NoaW5kZWxpbkBnbXguZGU+LgorCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgUGV0ciBCYXVkaXMgYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK1RoaXMgbWFudWFsIHBhZ2UgaXMgYSBzdHViLiBZb3UgY2FuIGhlbHAgdGhlIGdpdCBkb2N1bWVudGF0aW9uIGJ5IGV4cGFuZGluZyBpdC4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zdGFzaC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zdGFzaC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRjMzVkNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXN0YXNoLnR4dApAQCAtMCwwICsxLDE4NSBAQAorZ2l0LXN0YXNoKDEpCis9PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXN0YXNoIC0gU3Rhc2ggdGhlIGNoYW5nZXMgaW4gYSBkaXJ0eSB3b3JraW5nIGRpcmVjdG9yeSBhd2F5CisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1zdGFzaCcgKGxpc3QgfCBzaG93IFs8c3Rhc2g+XSB8IGFwcGx5IFs8c3Rhc2g+XSB8IGNsZWFyIHwgZHJvcCBbPHN0YXNoPl0gfCBwb3AgWzxzdGFzaD5dKQorJ2dpdC1zdGFzaCcgW3NhdmUgWzxtZXNzYWdlPl1dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitVc2UgJ2dpdC1zdGFzaCcgd2hlbiB5b3Ugd2FudCB0byByZWNvcmQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlCit3b3JraW5nIGRpcmVjdG9yeSBhbmQgdGhlIGluZGV4LCBidXQgd2FudCB0byBnbyBiYWNrIHRvIGEgY2xlYW4KK3dvcmtpbmcgZGlyZWN0b3J5LiAgVGhlIGNvbW1hbmQgc2F2ZXMgeW91ciBsb2NhbCBtb2RpZmljYXRpb25zIGF3YXkKK2FuZCByZXZlcnRzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byBtYXRjaCB0aGUgYEhFQURgIGNvbW1pdC4KKworVGhlIG1vZGlmaWNhdGlvbnMgc3Rhc2hlZCBhd2F5IGJ5IHRoaXMgY29tbWFuZCBjYW4gYmUgbGlzdGVkIHdpdGgKK2BnaXQtc3Rhc2ggbGlzdGAsIGluc3BlY3RlZCB3aXRoIGBnaXQtc3Rhc2ggc2hvd2AsIGFuZCByZXN0b3JlZAorKHBvdGVudGlhbGx5IG9uIHRvcCBvZiBhIGRpZmZlcmVudCBjb21taXQpIHdpdGggYGdpdC1zdGFzaCBhcHBseWAuCitDYWxsaW5nIGdpdC1zdGFzaCB3aXRob3V0IGFueSBhcmd1bWVudHMgaXMgZXF1aXZhbGVudCB0byBgZ2l0LXN0YXNoCitzYXZlYC4gIEEgc3Rhc2ggaXMgYnkgZGVmYXVsdCBsaXN0ZWQgYXMgIldJUCBvbiAnYnJhbmNobmFtZScgLi4uIiwgYnV0Cit5b3UgY2FuIGdpdmUgYSBtb3JlIGRlc2NyaXB0aXZlIG1lc3NhZ2Ugb24gdGhlIGNvbW1hbmQgbGluZSB3aGVuCit5b3UgY3JlYXRlIG9uZS4KKworVGhlIGxhdGVzdCBzdGFzaCB5b3UgY3JlYXRlZCBpcyBzdG9yZWQgaW4gYCRHSVRfRElSL3JlZnMvc3Rhc2hgOyBvbGRlcgorc3Rhc2hlcyBhcmUgZm91bmQgaW4gdGhlIHJlZmxvZyBvZiB0aGlzIHJlZmVyZW5jZSBhbmQgY2FuIGJlIG5hbWVkIHVzaW5nCit0aGUgdXN1YWwgcmVmbG9nIHN5bnRheCAoZS5nLiBgc3Rhc2hAXHswfWAgaXMgdGhlIG1vc3QgcmVjZW50bHkKK2NyZWF0ZWQgc3Rhc2gsIGBzdGFzaEBcezF9YCBpcyB0aGUgb25lIGJlZm9yZSBpdCwgYHN0YXNoQFx7Mi5ob3Vycy5hZ299YAoraXMgYWxzbyBwb3NzaWJsZSkuCisKK09QVElPTlMKKy0tLS0tLS0KKworc2F2ZSBbPG1lc3NhZ2U+XTo6CisKKwlTYXZlIHlvdXIgbG9jYWwgbW9kaWZpY2F0aW9ucyB0byBhIG5ldyAnc3Rhc2gnLCBhbmQgcnVuIGBnaXQtcmVzZXQKKwktLWhhcmRgIHRvIHJldmVydCB0aGVtLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBhY3Rpb24gd2hlbiBubworCXN1YmNvbW1hbmQgaXMgZ2l2ZW4uIFRoZSA8bWVzc2FnZT4gcGFydCBpcyBvcHRpb25hbCBhbmQgZ2l2ZXMKKwl0aGUgZGVzY3JpcHRpb24gYWxvbmcgd2l0aCB0aGUgc3Rhc2hlZCBzdGF0ZS4KKworbGlzdCBbPG9wdGlvbnM+XTo6CisKKwlMaXN0IHRoZSBzdGFzaGVzIHRoYXQgeW91IGN1cnJlbnRseSBoYXZlLiAgRWFjaCAnc3Rhc2gnIGlzIGxpc3RlZAorCXdpdGggaXRzIG5hbWUgKGUuZy4gYHN0YXNoQFx7MH1gIGlzIHRoZSBsYXRlc3Qgc3Rhc2gsIGBzdGFzaEBcezF9YCBpcworCXRoZSBvbmUgYmVmb3JlLCBldGMuKSwgdGhlIG5hbWUgb2YgdGhlIGJyYW5jaCB0aGF0IHdhcyBjdXJyZW50IHdoZW4gdGhlCisJc3Rhc2ggd2FzIG1hZGUsIGFuZCBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBjb21taXQgdGhlIHN0YXNoIHdhcworCWJhc2VkIG9uLgorKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3Rhc2hAezB9OiBXSVAgb24gc3VibWl0OiA2ZWJkMGUyLi4uIFVwZGF0ZSBnaXQtc3Rhc2ggZG9jdW1lbnRhdGlvbgorc3Rhc2hAezF9OiBPbiBtYXN0ZXI6IDljYzA1ODkuLi4gQWRkIGdpdC1zdGFzaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKworVGhlIGNvbW1hbmQgdGFrZXMgb3B0aW9ucyBhcHBsaWNhYmxlIHRvIHRoZSBsaW5rZ2l0OmdpdC1sb2dbMV0KK2NvbW1hbmQgdG8gY29udHJvbCB3aGF0IGlzIHNob3duIGFuZCBob3cuCisKK3Nob3cgWzxzdGFzaD5dOjoKKworCVNob3cgdGhlIGNoYW5nZXMgcmVjb3JkZWQgaW4gdGhlIHN0YXNoIGFzIGEgZGlmZiBiZXR3ZWVuIHRoZQorCXN0YXNoZWQgc3RhdGUgYW5kIGl0cyBvcmlnaW5hbCBwYXJlbnQuIFdoZW4gbm8gYDxzdGFzaD5gIGlzIGdpdmVuLAorCXNob3dzIHRoZSBsYXRlc3Qgb25lLiBCeSBkZWZhdWx0LCB0aGUgY29tbWFuZCBzaG93cyB0aGUgZGlmZnN0YXQsIGJ1dAorCWl0IHdpbGwgYWNjZXB0IGFueSBmb3JtYXQga25vd24gdG8gYGdpdC1kaWZmYCAoZS5nLiwgYGdpdC1zdGFzaCBzaG93CisJLXAgc3Rhc2hAXHsxfWAgdG8gdmlldyB0aGUgc2Vjb25kIG1vc3QgcmVjZW50IHN0YXNoIGluIHBhdGNoIGZvcm0pLgorCithcHBseSBbLS1pbmRleF0gWzxzdGFzaD5dOjoKKworCVJlc3RvcmUgdGhlIGNoYW5nZXMgcmVjb3JkZWQgaW4gdGhlIHN0YXNoIG9uIHRvcCBvZiB0aGUgY3VycmVudAorCXdvcmtpbmcgdHJlZSBzdGF0ZS4gIFdoZW4gbm8gYDxzdGFzaD5gIGlzIGdpdmVuLCBhcHBsaWVzIHRoZSBsYXRlc3QKKwlvbmUuICBUaGUgd29ya2luZyBkaXJlY3RvcnkgbXVzdCBtYXRjaCB0aGUgaW5kZXguCisrCitUaGlzIG9wZXJhdGlvbiBjYW4gZmFpbCB3aXRoIGNvbmZsaWN0czsgeW91IG5lZWQgdG8gcmVzb2x2ZSB0aGVtCitieSBoYW5kIGluIHRoZSB3b3JraW5nIHRyZWUuCisrCitJZiB0aGUgYC0taW5kZXhgIG9wdGlvbiBpcyB1c2VkLCB0aGVuIHRyaWVzIHRvIHJlaW5zdGF0ZSBub3Qgb25seSB0aGUgd29ya2luZwordHJlZSdzIGNoYW5nZXMsIGJ1dCBhbHNvIHRoZSBpbmRleCdzIG9uZXMuIEhvd2V2ZXIsIHRoaXMgY2FuIGZhaWwsIHdoZW4geW91CitoYXZlIGNvbmZsaWN0cyAod2hpY2ggYXJlIHN0b3JlZCBpbiB0aGUgaW5kZXgsIHdoZXJlIHlvdSB0aGVyZWZvcmUgY2FuIG5vCitsb25nZXIgYXBwbHkgdGhlIGNoYW5nZXMgYXMgdGhleSB3ZXJlIG9yaWdpbmFsbHkpLgorCitjbGVhcjo6CisJUmVtb3ZlIGFsbCB0aGUgc3Rhc2hlZCBzdGF0ZXMuIE5vdGUgdGhhdCB0aG9zZSBzdGF0ZXMgd2lsbCB0aGVuCisJYmUgc3ViamVjdCB0byBwcnVuaW5nLCBhbmQgbWF5IGJlIGRpZmZpY3VsdCBvciBpbXBvc3NpYmxlIHRvIHJlY292ZXIuCisKK2Ryb3AgWzxzdGFzaD5dOjoKKworCVJlbW92ZSBhIHNpbmdsZSBzdGFzaGVkIHN0YXRlIGZyb20gdGhlIHN0YXNoIGxpc3QuIFdoZW4gbm8gYDxzdGFzaD5gCisJaXMgZ2l2ZW4sIGl0IHJlbW92ZXMgdGhlIGxhdGVzdCBvbmUuIGkuZS4gYHN0YXNoQFx7MH1gCisKK3BvcCBbPHN0YXNoPl06OgorCisJUmVtb3ZlIGEgc2luZ2xlIHN0YXNoZWQgc3RhdGUgZnJvbSB0aGUgc3Rhc2ggbGlzdCBhbmQgYXBwbHkgb24gdG9wCisJb2YgdGhlIGN1cnJlbnQgd29ya2luZyB0cmVlIHN0YXRlLiBXaGVuIG5vIGA8c3Rhc2g+YCBpcyBnaXZlbiwKKwlgc3Rhc2hAXHswfWAgaXMgYXNzdW1lZC4gU2VlIGFsc28gYGFwcGx5YC4KKworCitESVNDVVNTSU9OCistLS0tLS0tLS0tCisKK0Egc3Rhc2ggaXMgcmVwcmVzZW50ZWQgYXMgYSBjb21taXQgd2hvc2UgdHJlZSByZWNvcmRzIHRoZSBzdGF0ZSBvZiB0aGUKK3dvcmtpbmcgZGlyZWN0b3J5LCBhbmQgaXRzIGZpcnN0IHBhcmVudCBpcyB0aGUgY29tbWl0IGF0IGBIRUFEYCB3aGVuCit0aGUgc3Rhc2ggd2FzIGNyZWF0ZWQuICBUaGUgdHJlZSBvZiB0aGUgc2Vjb25kIHBhcmVudCByZWNvcmRzIHRoZQorc3RhdGUgb2YgdGhlIGluZGV4IHdoZW4gdGhlIHN0YXNoIGlzIG1hZGUsIGFuZCBpdCBpcyBtYWRlIGEgY2hpbGQgb2YKK3RoZSBgSEVBRGAgY29tbWl0LiAgVGhlIGFuY2VzdHJ5IGdyYXBoIGxvb2tzIGxpa2UgdGhpczoKKworICAgICAgICAgICAgLi0tLS1XCisgICAgICAgICAgIC8gICAgLworICAgICAtLS0tLUgtLS0tSQorCit3aGVyZSBgSGAgaXMgdGhlIGBIRUFEYCBjb21taXQsIGBJYCBpcyBhIGNvbW1pdCB0aGF0IHJlY29yZHMgdGhlIHN0YXRlCitvZiB0aGUgaW5kZXgsIGFuZCBgV2AgaXMgYSBjb21taXQgdGhhdCByZWNvcmRzIHRoZSBzdGF0ZSBvZiB0aGUgd29ya2luZwordHJlZS4KKworCitFWEFNUExFUworLS0tLS0tLS0KKworUHVsbGluZyBpbnRvIGEgZGlydHkgdHJlZTo6CisKK1doZW4geW91IGFyZSBpbiB0aGUgbWlkZGxlIG9mIHNvbWV0aGluZywgeW91IGxlYXJuIHRoYXQgdGhlcmUgYXJlCit1cHN0cmVhbSBjaGFuZ2VzIHRoYXQgYXJlIHBvc3NpYmx5IHJlbGV2YW50IHRvIHdoYXQgeW91IGFyZQorZG9pbmcuICBXaGVuIHlvdXIgbG9jYWwgY2hhbmdlcyBkbyBub3QgY29uZmxpY3Qgd2l0aCB0aGUgY2hhbmdlcyBpbgordGhlIHVwc3RyZWFtLCBhIHNpbXBsZSBgZ2l0IHB1bGxgIHdpbGwgbGV0IHlvdSBtb3ZlIGZvcndhcmQuCisrCitIb3dldmVyLCB0aGVyZSBhcmUgY2FzZXMgaW4gd2hpY2ggeW91ciBsb2NhbCBjaGFuZ2VzIGRvIGNvbmZsaWN0IHdpdGgKK3RoZSB1cHN0cmVhbSBjaGFuZ2VzLCBhbmQgYGdpdCBwdWxsYCByZWZ1c2VzIHRvIG92ZXJ3cml0ZSB5b3VyCitjaGFuZ2VzLiAgSW4gc3VjaCBhIGNhc2UsIHlvdSBjYW4gc3Rhc2ggeW91ciBjaGFuZ2VzIGF3YXksCitwZXJmb3JtIGEgcHVsbCwgYW5kIHRoZW4gdW5zdGFzaCwgbGlrZSB0aGlzOgorKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcHVsbAorLi4uCitmaWxlIGZvb2JhciBub3QgdXAgdG8gZGF0ZSwgY2Fubm90IG1lcmdlLgorJCBnaXQgc3Rhc2gKKyQgZ2l0IHB1bGwKKyQgZ2l0IHN0YXNoIGFwcGx5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ludGVycnVwdGVkIHdvcmtmbG93OjoKKworV2hlbiB5b3UgYXJlIGluIHRoZSBtaWRkbGUgb2Ygc29tZXRoaW5nLCB5b3VyIGJvc3MgY29tZXMgaW4gYW5kCitkZW1hbmRzIHRoYXQgeW91IGZpeCBzb21ldGhpbmcgaW1tZWRpYXRlbHkuICBUcmFkaXRpb25hbGx5LCB5b3Ugd291bGQKK21ha2UgYSBjb21taXQgdG8gYSB0ZW1wb3JhcnkgYnJhbmNoIHRvIHN0b3JlIHlvdXIgY2hhbmdlcyBhd2F5LCBhbmQKK3JldHVybiB0byB5b3VyIG9yaWdpbmFsIGJyYW5jaCB0byBtYWtlIHRoZSBlbWVyZ2VuY3kgZml4LCBsaWtlIHRoaXM6CisrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisuLi4gaGFjayBoYWNrIGhhY2sgLi4uCiskIGdpdCBjaGVja291dCAtYiBteV93aXAKKyQgZ2l0IGNvbW1pdCAtYSAtbSAiV0lQIgorJCBnaXQgY2hlY2tvdXQgbWFzdGVyCiskIGVkaXQgZW1lcmdlbmN5IGZpeAorJCBnaXQgY29tbWl0IC1hIC1tICJGaXggaW4gYSBodXJyeSIKKyQgZ2l0IGNoZWNrb3V0IG15X3dpcAorJCBnaXQgcmVzZXQgLS1zb2Z0IEhFQUReCisuLi4gY29udGludWUgaGFja2luZyAuLi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKysKK1lvdSBjYW4gdXNlIGBnaXQtc3Rhc2hgIHRvIHNpbXBsaWZ5IHRoZSBhYm92ZSwgbGlrZSB0aGlzOgorKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLi4uIGhhY2sgaGFjayBoYWNrIC4uLgorJCBnaXQgc3Rhc2gKKyQgZWRpdCBlbWVyZ2VuY3kgZml4CiskIGdpdCBjb21taXQgLWEgLW0gIkZpeCBpbiBhIGh1cnJ5IgorJCBnaXQgc3Rhc2ggYXBwbHkKKy4uLiBjb250aW51ZSBoYWNraW5nIC4uLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTRUUgQUxTTworLS0tLS0tLS0KK2xpbmtnaXQ6Z2l0LWNoZWNrb3V0WzFdLAorbGlua2dpdDpnaXQtY29tbWl0WzFdLAorbGlua2dpdDpnaXQtcmVmbG9nWzFdLAorbGlua2dpdDpnaXQtcmVzZXRbMV0KKworQVVUSE9SCistLS0tLS0KK1dyaXR0ZW4gYnkgTmFuYWtvIFNoaXJhaXNoaSA8bmFuYWtvM0BibHVlYm90dGxlLmNvbT4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zdGF0dXMudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc3RhdHVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWEyNjlhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc3RhdHVzLnR4dApAQCAtMCwwICsxLDcwIEBACitnaXQtc3RhdHVzKDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zdGF0dXMgLSBTaG93IHRoZSB3b3JraW5nIHRyZWUgc3RhdHVzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXN0YXR1cycgPG9wdGlvbnM+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorRGlzcGxheXMgcGF0aHMgdGhhdCBoYXZlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGluZGV4IGZpbGUgYW5kIHRoZQorY3VycmVudCBIRUFEIGNvbW1pdCwgcGF0aHMgdGhhdCBoYXZlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHdvcmtpbmcKK3RyZWUgYW5kIHRoZSBpbmRleCBmaWxlLCBhbmQgcGF0aHMgaW4gdGhlIHdvcmtpbmcgdHJlZSB0aGF0IGFyZSBub3QKK3RyYWNrZWQgYnkgZ2l0IChhbmQgYXJlIG5vdCBpZ25vcmVkIGJ5IGxpbmtnaXQ6Z2l0aWdub3JlWzVdKS4gVGhlIGZpcnN0CithcmUgd2hhdCB5b3UgX3dvdWxkXyBjb21taXQgYnkgcnVubmluZyBgZ2l0IGNvbW1pdGA7IHRoZSBzZWNvbmQgYW5kCit0aGlyZCBhcmUgd2hhdCB5b3UgX2NvdWxkXyBjb21taXQgYnkgcnVubmluZyBgZ2l0IGFkZGAgYmVmb3JlIHJ1bm5pbmcKK2BnaXQgY29tbWl0YC4KKworVGhlIGNvbW1hbmQgdGFrZXMgdGhlIHNhbWUgc2V0IG9mIG9wdGlvbnMgYXMgYGdpdC1jb21taXRgOyBpdAorc2hvd3Mgd2hhdCB3b3VsZCBiZSBjb21taXR0ZWQgaWYgdGhlIHNhbWUgb3B0aW9ucyBhcmUgZ2l2ZW4gdG8KK2BnaXQtY29tbWl0YC4KKworSWYgdGhlcmUgaXMgbm8gcGF0aCB0aGF0IGlzIGRpZmZlcmVudCBiZXR3ZWVuIHRoZSBpbmRleCBmaWxlIGFuZAordGhlIGN1cnJlbnQgSEVBRCBjb21taXQgKGkuZS4sIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tbWl0IGJ5IHJ1bm5pbmcKK2BnaXQtY29tbWl0YCksIHRoZSBjb21tYW5kIGV4aXRzIHdpdGggbm9uLXplcm8gc3RhdHVzLgorCisKK09VVFBVVAorLS0tLS0tCitUaGUgb3V0cHV0IGZyb20gdGhpcyBjb21tYW5kIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgYXMgYSBjb21taXQKK3RlbXBsYXRlIGNvbW1lbnQsIGFuZCBhbGwgdGhlIG91dHB1dCBsaW5lcyBhcmUgcHJlZml4ZWQgd2l0aCAnIycuCisKK1RoZSBwYXRocyBtZW50aW9uZWQgaW4gdGhlIG91dHB1dCwgdW5saWtlIG1hbnkgb3RoZXIgZ2l0IGNvbW1hbmRzLCBhcmUKK21hZGUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlmIHlvdSBhcmUgd29ya2luZyBpbiBhCitzdWJkaXJlY3RvcnkgKHRoaXMgaXMgb24gcHVycG9zZSwgdG8gaGVscCBjdXR0aW5nIGFuZCBwYXN0aW5nKS4gU2VlCit0aGUgc3RhdHVzLnJlbGF0aXZlUGF0aHMgY29uZmlnIG9wdGlvbiBiZWxvdy4KKworCitDT05GSUdVUkFUSU9OCistLS0tLS0tLS0tLS0tCisKK1RoZSBjb21tYW5kIGhvbm9ycyBgY29sb3Iuc3RhdHVzYCAob3IgYHN0YXR1cy5jb2xvcmAgLS0gdGhleQorbWVhbiB0aGUgc2FtZSB0aGluZyBhbmQgdGhlIGxhdHRlciBpcyBrZXB0IGZvciBiYWNrd2FyZAorY29tcGF0aWJpbGl0eSkgYW5kIGBjb2xvci5zdGF0dXMuPHNsb3Q+YCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcwordG8gY29sb3JpemUgaXRzIG91dHB1dC4KKworSWYgdGhlIGNvbmZpZyB2YXJpYWJsZSBgc3RhdHVzLnJlbGF0aXZlUGF0aHNgIGlzIHNldCB0byBmYWxzZSwgdGhlbiBhbGwKK3BhdGhzIHNob3duIGFyZSByZWxhdGl2ZSB0byB0aGUgcmVwb3NpdG9yeSByb290LCBub3QgdG8gdGhlIGN1cnJlbnQKK2RpcmVjdG9yeS4KKworU2VlIEFsc28KKy0tLS0tLS0tCitsaW5rZ2l0OmdpdGlnbm9yZVs1XQorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+IGFuZAorSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0Pi4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc3RyaXBzcGFjZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zdHJpcHNwYWNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzU2ODc1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc3RyaXBzcGFjZS50eHQKQEAgLTAsMCArMSwzNSBAQAorZ2l0LXN0cmlwc3BhY2UoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zdHJpcHNwYWNlIC0gRmlsdGVyIG91dCBlbXB0eSBsaW5lcworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1zdHJpcHNwYWNlJyBbLXMgfCAtLXN0cmlwLWNvbW1lbnRzXSA8IDxzdHJlYW0+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUmVtb3ZlIG11bHRpcGxlIGVtcHR5IGxpbmVzLCBhbmQgZW1wdHkgbGluZXMgYXQgYmVnaW5uaW5nIGFuZCBlbmQuCisKK09QVElPTlMKKy0tLS0tLS0KKy1zfC0tc3RyaXAtY29tbWVudHM6OgorCUluIGFkZGl0aW9uIHRvIGVtcHR5IGxpbmVzLCBhbHNvIHN0cmlwIGxpbmVzIHN0YXJ0aW5nIHdpdGggJyMnLgorCis8c3RyZWFtPjo6CisJQnl0ZSBzdHJlYW0gdG8gYWN0IG9uLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXN1Ym1vZHVsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zdWJtb2R1bGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZjlmNjMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zdWJtb2R1bGUudHh0CkBAIC0wLDAgKzEsOTYgQEAKK2dpdC1zdWJtb2R1bGUoMSkKKz09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXN1Ym1vZHVsZSAtIEluaXRpYWxpemUsIHVwZGF0ZSBvciBpbnNwZWN0IHN1Ym1vZHVsZXMKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtc3VibW9kdWxlJyBbLS1xdWlldF0gYWRkIFstYiBicmFuY2hdIFstLV0gPHJlcG9zaXRvcnk+IFs8cGF0aD5dCisnZ2l0LXN1Ym1vZHVsZScgWy0tcXVpZXRdIHN0YXR1cyBbLS1jYWNoZWRdIFstLV0gWzxwYXRoPi4uLl0KKydnaXQtc3VibW9kdWxlJyBbLS1xdWlldF0gW2luaXR8dXBkYXRlXSBbLS1dIFs8cGF0aD4uLi5dCisnZ2l0LXN1Ym1vZHVsZScgWy0tcXVpZXRdIHN1bW1hcnkgWy0tc3VtbWFyeS1saW1pdCA8bj5dIFtjb21taXRdIFstLV0gWzxwYXRoPi4uLl0KKworCitDT01NQU5EUworLS0tLS0tLS0KK2FkZDo6CisJQWRkIHRoZSBnaXZlbiByZXBvc2l0b3J5IGFzIGEgc3VibW9kdWxlIGF0IHRoZSBnaXZlbiBwYXRoCisJdG8gdGhlIGNoYW5nZXNldCB0byBiZSBjb21taXR0ZWQgbmV4dC4gIElmIHBhdGggaXMgYSB2YWxpZAorCXJlcG9zaXRvcnkgd2l0aGluIHRoZSBwcm9qZWN0LCBpdCBpcyBhZGRlZCBhcyBpcy4gT3RoZXJ3aXNlLAorCXJlcG9zaXRvcnkgaXMgY2xvbmVkIGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4gcGF0aCBpcyBhZGRlZCB0byB0aGUKKwljaGFuZ2VzZXQgYW5kIHJlZ2lzdGVyZWQgaW4gLmdpdG1vZHVsZXMuICAgSWYgbm8gcGF0aCBpcworCXNwZWNpZmllZCwgdGhlIHBhdGggaXMgZGVkdWNlZCBmcm9tIHRoZSByZXBvc2l0b3J5IHNwZWNpZmljYXRpb24uCisJSWYgdGhlIHJlcG9zaXRvcnkgdXJsIGJlZ2lucyB3aXRoIC4vIG9yIC4uLywgaXQgaXMgc3RvcmVkIGFzCisJZ2l2ZW4gYnV0IHJlc29sdmVkIGFzIGEgcmVsYXRpdmUgcGF0aCBmcm9tIHRoZSBtYWluIHByb2plY3QncworCXVybCB3aGVuIGNsb25pbmcuCisKK3N0YXR1czo6CisJU2hvdyB0aGUgc3RhdHVzIG9mIHRoZSBzdWJtb2R1bGVzLiBUaGlzIHdpbGwgcHJpbnQgdGhlIFNIQS0xIG9mIHRoZQorCWN1cnJlbnRseSBjaGVja2VkIG91dCBjb21taXQgZm9yIGVhY2ggc3VibW9kdWxlLCBhbG9uZyB3aXRoIHRoZQorCXN1Ym1vZHVsZSBwYXRoIGFuZCB0aGUgb3V0cHV0IG9mIGxpbmtnaXQ6Z2l0LWRlc2NyaWJlWzFdIGZvciB0aGUKKwlTSEEtMS4gRWFjaCBTSEEtMSB3aWxsIGJlIHByZWZpeGVkIHdpdGggYC1gIGlmIHRoZSBzdWJtb2R1bGUgaXMgbm90CisJaW5pdGlhbGl6ZWQgYW5kIGArYCBpZiB0aGUgY3VycmVudGx5IGNoZWNrZWQgb3V0IHN1Ym1vZHVsZSBjb21taXQKKwlkb2VzIG5vdCBtYXRjaCB0aGUgU0hBLTEgZm91bmQgaW4gdGhlIGluZGV4IG9mIHRoZSBjb250YWluaW5nCisJcmVwb3NpdG9yeS4gVGhpcyBjb21tYW5kIGlzIHRoZSBkZWZhdWx0IGNvbW1hbmQgZm9yIGdpdC1zdWJtb2R1bGUuCisKK2luaXQ6OgorCUluaXRpYWxpemUgdGhlIHN1Ym1vZHVsZXMsIGkuZS4gcmVnaXN0ZXIgaW4gLmdpdC9jb25maWcgZWFjaCBzdWJtb2R1bGUKKwluYW1lIGFuZCB1cmwgZm91bmQgaW4gLmdpdG1vZHVsZXMuIFRoZSBrZXkgdXNlZCBpbiAuZ2l0L2NvbmZpZyBpcworCWBzdWJtb2R1bGUuJG5hbWUudXJsYC4gVGhpcyBjb21tYW5kIGRvZXMgbm90IGFsdGVyIGV4aXN0aW5nIGluZm9ybWF0aW9uCisJaW4gLmdpdC9jb25maWcuCisKK3VwZGF0ZTo6CisJVXBkYXRlIHRoZSByZWdpc3RlcmVkIHN1Ym1vZHVsZXMsIGkuZS4gY2xvbmUgbWlzc2luZyBzdWJtb2R1bGVzIGFuZAorCWNoZWNrb3V0IHRoZSBjb21taXQgc3BlY2lmaWVkIGluIHRoZSBpbmRleCBvZiB0aGUgY29udGFpbmluZyByZXBvc2l0b3J5LgorCVRoaXMgd2lsbCBtYWtlIHRoZSBzdWJtb2R1bGVzIEhFQUQgYmUgZGV0YWNoZWQuCisKK3N1bW1hcnk6OgorCVNob3cgY29tbWl0IHN1bW1hcnkgYmV0d2VlbiB0aGUgZ2l2ZW4gY29tbWl0IChkZWZhdWx0cyB0byBIRUFEKSBhbmQKKwl3b3JraW5nIHRyZWUvaW5kZXguIEZvciBhIHN1Ym1vZHVsZSBpbiBxdWVzdGlvbiwgYSBzZXJpZXMgb2YgY29tbWl0cworCWluIHRoZSBzdWJtb2R1bGUgYmV0d2VlbiB0aGUgZ2l2ZW4gc3VwZXIgcHJvamVjdCBjb21taXQgYW5kIHRoZQorCWluZGV4IG9yIHdvcmtpbmcgdHJlZSAoc3dpdGNoZWQgYnkgLS1jYWNoZWQpIGFyZSBzaG93bi4KKworT1BUSU9OUworLS0tLS0tLQorLXEsIC0tcXVpZXQ6OgorCU9ubHkgcHJpbnQgZXJyb3IgbWVzc2FnZXMuCisKKy1iLCAtLWJyYW5jaDo6CisJQnJhbmNoIG9mIHJlcG9zaXRvcnkgdG8gYWRkIGFzIHN1Ym1vZHVsZS4KKworLS1jYWNoZWQ6OgorCVRoaXMgb3B0aW9uIGlzIG9ubHkgdmFsaWQgZm9yIHN0YXR1cyBhbmQgc3VtbWFyeSBjb21tYW5kcy4gIFRoZXNlCisJY29tbWFuZHMgdHlwaWNhbGx5IHVzZSB0aGUgY29tbWl0IGZvdW5kIGluIHRoZSBzdWJtb2R1bGUgSEVBRCwgYnV0CisJd2l0aCB0aGlzIG9wdGlvbiwgdGhlIGNvbW1pdCBzdG9yZWQgaW4gdGhlIGluZGV4IGlzIHVzZWQgaW5zdGVhZC4KKworLW4sIC0tc3VtbWFyeS1saW1pdDo6CisJVGhpcyBvcHRpb24gaXMgb25seSB2YWxpZCBmb3IgdGhlIHN1bW1hcnkgY29tbWFuZC4KKwlMaW1pdCB0aGUgc3VtbWFyeSBzaXplIChudW1iZXIgb2YgY29tbWl0cyBzaG93biBpbiB0b3RhbCkuCisJR2l2aW5nIDAgd2lsbCBkaXNhYmxlIHRoZSBzdW1tYXJ5OyBhIG5lZ2F0aXZlIG51bWJlciBtZWFucyB1bmxpbXRlZAorCSh0aGUgZGVmYXVsdCkuIFRoaXMgbGltaXQgb25seSBhcHBsaWVzIHRvIG1vZGlmaWVkIHN1Ym1vZHVsZXMuIFRoZQorCXNpemUgaXMgYWx3YXlzIGxpbWl0ZWQgdG8gMSBmb3IgYWRkZWQvZGVsZXRlZC90eXBlY2hhbmdlZCBzdWJtb2R1bGVzLgorCis8cGF0aD46OgorCVBhdGggdG8gc3VibW9kdWxlKHMpLiBXaGVuIHNwZWNpZmllZCB0aGlzIHdpbGwgcmVzdHJpY3QgdGhlIGNvbW1hbmQKKwl0byBvbmx5IG9wZXJhdGUgb24gdGhlIHN1Ym1vZHVsZXMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBwYXRocy4KKworRklMRVMKKy0tLS0tCitXaGVuIGluaXRpYWxpemluZyBzdWJtb2R1bGVzLCBhIC5naXRtb2R1bGVzIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkKK29mIHRoZSBjb250YWluaW5nIHJlcG9zaXRvcnkgaXMgdXNlZCB0byBmaW5kIHRoZSB1cmwgb2YgZWFjaCBzdWJtb2R1bGUuCitUaGlzIGZpbGUgc2hvdWxkIGJlIGZvcm1hdHRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgYCRHSVRfRElSL2NvbmZpZ2AuIFRoZSBrZXkKK3RvIGVhY2ggc3VibW9kdWxlIHVybCBpcyAic3VibW9kdWxlLiRuYW1lLnVybCIuICBTZWUgbGlua2dpdDpnaXRtb2R1bGVzWzVdCitmb3IgZGV0YWlscy4KKworCitBVVRIT1IKKy0tLS0tLQorV3JpdHRlbiBieSBMYXJzIEhqZW1saSA8aGplbWxpQGdtYWlsLmNvbT4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zdm4udHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc3ZuLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWM5YWNjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc3ZuLnR4dApAQCAtMCwwICsxLDU5MCBAQAorZ2l0LXN2bigxKQorPT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtc3ZuIC0gQmlkaXJlY3Rpb25hbCBvcGVyYXRpb24gYmV0d2VlbiBhIHNpbmdsZSBTdWJ2ZXJzaW9uIGJyYW5jaCBhbmQgZ2l0CisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1zdm4nIDxjb21tYW5kPiBbb3B0aW9uc10gW2FyZ3VtZW50c10KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitnaXQtc3ZuIGlzIGEgc2ltcGxlIGNvbmR1aXQgZm9yIGNoYW5nZXNldHMgYmV0d2VlbiBTdWJ2ZXJzaW9uIGFuZCBnaXQuCitJdCBpcyBub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBsaW5rZ2l0OmdpdC1zdm5pbXBvcnRbMV0sIHdoaWNoIGlzCityZWFkLW9ubHkuCisKK2dpdC1zdm4gd2FzIG9yaWdpbmFsbHkgZGVzaWduZWQgZm9yIGFuIGluZGl2aWR1YWwgZGV2ZWxvcGVyIHdobyB3YW50cyBhCitiaWRpcmVjdGlvbmFsIGZsb3cgb2YgY2hhbmdlc2V0cyBiZXR3ZWVuIGEgc2luZ2xlIGJyYW5jaCBpbiBTdWJ2ZXJzaW9uCithbmQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBicmFuY2hlcyBpbiBnaXQuICBTaW5jZSBpdHMgaW5jZXB0aW9uLAorZ2l0LXN2biBoYXMgZ2FpbmVkIHRoZSBhYmlsaXR5IHRvIHRyYWNrIG11bHRpcGxlIGJyYW5jaGVzIGluIGEgbWFubmVyCitzaW1pbGFyIHRvIGdpdC1zdm5pbXBvcnQuCisKK2dpdC1zdm4gaXMgZXNwZWNpYWxseSB1c2VmdWwgd2hlbiBpdCBjb21lcyB0byB0cmFja2luZyByZXBvc2l0b3JpZXMKK25vdCBvcmdhbml6ZWQgaW4gdGhlIHdheSBTdWJ2ZXJzaW9uIGRldmVsb3BlcnMgcmVjb21tZW5kICh0cnVuaywKK2JyYW5jaGVzLCB0YWdzIGRpcmVjdG9yaWVzKS4KKworQ09NTUFORFMKKy0tLS0tLS0tCistLQorCisnaW5pdCc6OgorCUluaXRpYWxpemVzIGFuIGVtcHR5IGdpdCByZXBvc2l0b3J5IHdpdGggYWRkaXRpb25hbAorCW1ldGFkYXRhIGRpcmVjdG9yaWVzIGZvciBnaXQtc3ZuLiAgVGhlIFN1YnZlcnNpb24gVVJMCisJbWF5IGJlIHNwZWNpZmllZCBhcyBhIGNvbW1hbmQtbGluZSBhcmd1bWVudCwgb3IgYXMgZnVsbAorCVVSTCBhcmd1bWVudHMgdG8gLVQvLXQvLWIuICBPcHRpb25hbGx5LCB0aGUgdGFyZ2V0CisJZGlyZWN0b3J5IHRvIG9wZXJhdGUgb24gY2FuIGJlIHNwZWNpZmllZCBhcyBhIHNlY29uZAorCWFyZ3VtZW50LiAgTm9ybWFsbHkgdGhpcyBjb21tYW5kIGluaXRpYWxpemVzIHRoZSBjdXJyZW50CisJZGlyZWN0b3J5LgorCistVDx0cnVua19zdWJkaXI+OzsKKy0tdHJ1bms9PHRydW5rX3N1YmRpcj47OworLXQ8dGFnc19zdWJkaXI+OzsKKy0tdGFncz08dGFnc19zdWJkaXI+OzsKKy1iPGJyYW5jaGVzX3N1YmRpcj47OworLS1icmFuY2hlcz08YnJhbmNoZXNfc3ViZGlyPjs7Cistczs7CistLXN0ZGxheW91dDs7CisJVGhlc2UgYXJlIG9wdGlvbmFsIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciBpbml0LiAgRWFjaCBvZgorCXRoZXNlIGZsYWdzIGNhbiBwb2ludCB0byBhIHJlbGF0aXZlIHJlcG9zaXRvcnkgcGF0aAorCSgtLXRhZ3M9cHJvamVjdC90YWdzJykgb3IgYSBmdWxsIHVybAorCSgtLXRhZ3M9aHR0cHM6Ly9mb28ub3JnL3Byb2plY3QvdGFncykuIFRoZSBvcHRpb24gLS1zdGRsYXlvdXQgaXMKKwlhIHNob3J0aGFuZCB3YXkgb2Ygc2V0dGluZyB0cnVuayx0YWdzLGJyYW5jaGVzIGFzIHRoZSByZWxhdGl2ZSBwYXRocywKKwl3aGljaCBpcyB0aGUgU3VidmVyc2lvbiBkZWZhdWx0LiBJZiBhbnkgb2YgdGhlIG90aGVyIG9wdGlvbnMgYXJlIGdpdmVuCisJYXMgd2VsbCwgdGhleSB0YWtlIHByZWNlZGVuY2UuCistLW5vLW1ldGFkYXRhOzsKKwlTZXQgdGhlICdub01ldGFkYXRhJyBvcHRpb24gaW4gdGhlIFtzdm4tcmVtb3RlXSBjb25maWcuCistLXVzZS1zdm0tcHJvcHM7OworCVNldCB0aGUgJ3VzZVN2bVByb3BzJyBvcHRpb24gaW4gdGhlIFtzdm4tcmVtb3RlXSBjb25maWcuCistLXVzZS1zdm5zeW5jLXByb3BzOzsKKwlTZXQgdGhlICd1c2VTdm5zeW5jUHJvcHMnIG9wdGlvbiBpbiB0aGUgW3N2bi1yZW1vdGVdIGNvbmZpZy4KKy0tcmV3cml0ZS1yb290PTxVUkw+OzsKKwlTZXQgdGhlICdyZXdyaXRlUm9vdCcgb3B0aW9uIGluIHRoZSBbc3ZuLXJlbW90ZV0gY29uZmlnLgorLS11c2VybmFtZT08VVNFUj47OworCUZvciB0cmFuc3BvcnRzIHRoYXQgU1ZOIGhhbmRsZXMgYXV0aGVudGljYXRpb24gZm9yIChodHRwLAorCWh0dHBzLCBhbmQgcGxhaW4gc3ZuKSwgc3BlY2lmeSB0aGUgdXNlcm5hbWUuICBGb3Igb3RoZXIKKwl0cmFuc3BvcnRzIChlZyBzdm4rc3NoOi8vKSwgeW91IG11c3QgaW5jbHVkZSB0aGUgdXNlcm5hbWUgaW4KKwl0aGUgVVJMLCBlZyBzdm4rc3NoOi8vZm9vQHN2bi5iYXIuY29tL3Byb2plY3QKKy0tcHJlZml4PTxwcmVmaXg+OzsKKwlUaGlzIGFsbG93cyBvbmUgdG8gc3BlY2lmeSBhIHByZWZpeCB3aGljaCBpcyBwcmVwZW5kZWQKKwl0byB0aGUgbmFtZXMgb2YgcmVtb3RlcyBpZiB0cnVuay9icmFuY2hlcy90YWdzIGFyZQorCXNwZWNpZmllZC4gIFRoZSBwcmVmaXggZG9lcyBub3QgYXV0b21hdGljYWxseSBpbmNsdWRlIGEKKwl0cmFpbGluZyBzbGFzaCwgc28gYmUgc3VyZSB5b3UgaW5jbHVkZSBvbmUgaW4gdGhlCisJYXJndW1lbnQgaWYgdGhhdCBpcyB3aGF0IHlvdSB3YW50LiAgSWYgLS1icmFuY2hlcy8tYiBpcworCXNwZWNpZmllZCwgdGhlIHByZWZpeCBtdXN0IGluY2x1ZGUgYSB0cmFpbGluZyBzbGFzaC4KKwlTZXR0aW5nIGEgcHJlZml4IGlzIHVzZWZ1bCBpZiB5b3Ugd2lzaCB0byB0cmFjayBtdWx0aXBsZQorCXByb2plY3RzIHRoYXQgc2hhcmUgYSBjb21tb24gcmVwb3NpdG9yeS4KKworJ2ZldGNoJzo6CisJRmV0Y2ggdW5mZXRjaGVkIHJldmlzaW9ucyBmcm9tIHRoZSBTdWJ2ZXJzaW9uIHJlbW90ZSB3ZSBhcmUKKwl0cmFja2luZy4gIFRoZSBuYW1lIG9mIHRoZSBbc3ZuLXJlbW90ZSAiLi4uIl0gc2VjdGlvbiBpbiB0aGUKKwkuZ2l0L2NvbmZpZyBmaWxlIG1heSBiZSBzcGVjaWZpZWQgYXMgYW4gb3B0aW9uYWwgY29tbWFuZC1saW5lCisJYXJndW1lbnQuCisKKydjbG9uZSc6OgorCVJ1bnMgJ2luaXQnIGFuZCAnZmV0Y2gnLiAgSXQgd2lsbCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhCisJZGlyZWN0b3J5IGJhc2VkIG9uIHRoZSBiYXNlbmFtZSBvZiB0aGUgVVJMIHBhc3NlZCB0byBpdDsKKwlvciBpZiBhIHNlY29uZCBhcmd1bWVudCBpcyBwYXNzZWQ7IGl0IHdpbGwgY3JlYXRlIGEgZGlyZWN0b3J5CisJYW5kIHdvcmsgd2l0aGluIHRoYXQuICBJdCBhY2NlcHRzIGFsbCBhcmd1bWVudHMgdGhhdCB0aGUKKwknaW5pdCcgYW5kICdmZXRjaCcgY29tbWFuZHMgYWNjZXB0OyB3aXRoIHRoZSBleGNlcHRpb24gb2YKKwknLS1mZXRjaC1hbGwnLiAgIEFmdGVyIGEgcmVwb3NpdG9yeSBpcyBjbG9uZWQsIHRoZSAnZmV0Y2gnCisJY29tbWFuZCB3aWxsIGJlIGFibGUgdG8gdXBkYXRlIHJldmlzaW9ucyB3aXRob3V0IGFmZmVjdGluZworCXRoZSB3b3JraW5nIHRyZWU7IGFuZCB0aGUgJ3JlYmFzZScgY29tbWFuZCB3aWxsIGJlIGFibGUKKwl0byB1cGRhdGUgdGhlIHdvcmtpbmcgdHJlZSB3aXRoIHRoZSBsYXRlc3QgY2hhbmdlcy4KKworJ3JlYmFzZSc6OgorCVRoaXMgZmV0Y2hlcyByZXZpc2lvbnMgZnJvbSB0aGUgU1ZOIHBhcmVudCBvZiB0aGUgY3VycmVudCBIRUFECisJYW5kIHJlYmFzZXMgdGhlIGN1cnJlbnQgKHVuY29tbWl0dGVkIHRvIFNWTikgd29yayBhZ2FpbnN0IGl0LgorCitUaGlzIHdvcmtzIHNpbWlsYXJseSB0byAnc3ZuIHVwZGF0ZScgb3IgJ2dpdC1wdWxsJyBleGNlcHQgdGhhdAoraXQgcHJlc2VydmVzIGxpbmVhciBoaXN0b3J5IHdpdGggJ2dpdC1yZWJhc2UnIGluc3RlYWQgb2YKKydnaXQtbWVyZ2UnIGZvciBlYXNlIG9mIGRjb21taXRpbmcgd2l0aCBnaXQtc3ZuLgorCitUaGlzIGFjY2VwdHMgYWxsIG9wdGlvbnMgdGhhdCAnZ2l0LXN2biBmZXRjaCcgYW5kICdnaXQtcmViYXNlJworYWNjZXB0cy4gIEhvd2V2ZXIgJy0tZmV0Y2gtYWxsJyBvbmx5IGZldGNoZXMgZnJvbSB0aGUgY3VycmVudAorW3N2bi1yZW1vdGVdLCBhbmQgbm90IGFsbCBbc3ZuLXJlbW90ZV0gZGVmaW5pdGlvbnMuCisKK0xpa2UgJ2dpdC1yZWJhc2UnOyB0aGlzIHJlcXVpcmVzIHRoYXQgdGhlIHdvcmtpbmcgdHJlZSBiZSBjbGVhbgorYW5kIGhhdmUgbm8gdW5jb21taXR0ZWQgY2hhbmdlcy4KKworLWw7OworLS1sb2NhbDs7CisJRG8gbm90IGZldGNoIHJlbW90ZWx5OyBvbmx5IHJ1biAnZ2l0LXJlYmFzZScgYWdhaW5zdCB0aGUKKwlsYXN0IGZldGNoZWQgY29tbWl0IGZyb20gdGhlIHVwc3RyZWFtIFNWTi4KKworJ2Rjb21taXQnOjoKKwlDb21taXQgZWFjaCBkaWZmIGZyb20gYSBzcGVjaWZpZWQgaGVhZCBkaXJlY3RseSB0byB0aGUgU1ZOCisJcmVwb3NpdG9yeSwgYW5kIHRoZW4gcmViYXNlIG9yIHJlc2V0IChkZXBlbmRpbmcgb24gd2hldGhlciBvcgorCW5vdCB0aGVyZSBpcyBhIGRpZmYgYmV0d2VlbiBTVk4gYW5kIGhlYWQpLiAgVGhpcyB3aWxsIGNyZWF0ZQorCWEgcmV2aXNpb24gaW4gU1ZOIGZvciBlYWNoIGNvbW1pdCBpbiBnaXQuCisJSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgcnVuIGdpdC1zdm4gZmV0Y2ggYW5kIHJlYmFzZSAobm90CisJcHVsbCBvciBtZXJnZSkgeW91ciBjb21taXRzIGFnYWluc3QgdGhlIGxhdGVzdCBjaGFuZ2VzIGluIHRoZQorCVNWTiByZXBvc2l0b3J5LgorCUFuIG9wdGlvbmFsIGNvbW1hbmQtbGluZSBhcmd1bWVudCBtYXkgYmUgc3BlY2lmaWVkIGFzIGFuCisJYWx0ZXJuYXRpdmUgdG8gSEVBRC4KKwlUaGlzIGlzIGFkdmFudGFnZW91cyBvdmVyICdzZXQtdHJlZScgKGJlbG93KSBiZWNhdXNlIGl0IHByb2R1Y2VzCisJY2xlYW5lciwgbW9yZSBsaW5lYXIgaGlzdG9yeS4KKysKKy0tbm8tcmViYXNlOzsKKwlBZnRlciBjb21taXR0aW5nLCBkbyBub3QgcmViYXNlIG9yIHJlc2V0LgorLS0KKworJ2xvZyc6OgorCVRoaXMgc2hvdWxkIG1ha2UgaXQgZWFzeSB0byBsb29rIHVwIHN2biBsb2cgbWVzc2FnZXMgd2hlbiBzdm4KKwl1c2VycyByZWZlciB0byAtci8tLXJldmlzaW9uIG51bWJlcnMuCisrCitUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGZyb20gYHN2biBsb2cnIGFyZSBzdXBwb3J0ZWQ6CisrCistLQorLS1yZXZpc2lvbj08bj5bOjxuPl07OworCWlzIHN1cHBvcnRlZCwgbm9uLW51bWVyaWMgYXJncyBhcmUgbm90OgorCUhFQUQsIE5FWFQsIEJBU0UsIFBSRVYsIGV0YyAuLi4KKy12Ly0tdmVyYm9zZTs7CisJaXQncyBub3QgY29tcGxldGVseSBjb21wYXRpYmxlIHdpdGggdGhlIC0tdmVyYm9zZQorCW91dHB1dCBpbiBzdm4gbG9nLCBidXQgcmVhc29uYWJseSBjbG9zZS4KKy0tbGltaXQ9PG4+OzsKKwlpcyBOT1QgdGhlIHNhbWUgYXMgLS1tYXgtY291bnQsIGRvZXNuJ3QgY291bnQKKwltZXJnZWQvZXhjbHVkZWQgY29tbWl0cworLS1pbmNyZW1lbnRhbDs7CisJc3VwcG9ydGVkCistLQorKworTmV3IGZlYXR1cmVzOgorKworLS0KKy0tc2hvdy1jb21taXQ7OworCXNob3dzIHRoZSBnaXQgY29tbWl0IHNoYTEsIGFzIHdlbGwKKy0tb25lbGluZTs7CisJb3VyIHZlcnNpb24gb2YgLS1wcmV0dHk9b25lbGluZQorLS0KKysKK05PVEU6IFNWTiBpdHNlbGYgb25seSBzdG9yZXMgdGltZXMgaW4gVVRDIGFuZCBub3RoaW5nIGVsc2UuIFRoZSByZWd1bGFyIHN2bgorY2xpZW50IGNvbnZlcnRzIHRoZSBVVEMgdGltZSB0byB0aGUgbG9jYWwgdGltZSAob3IgYmFzZWQgb24gdGhlIFRaPQorZW52aXJvbm1lbnQpLiBUaGlzIGNvbW1hbmQgaGFzIHRoZSBzYW1lIGJlaGF2aW91ci4KKysKK0FueSBvdGhlciBhcmd1bWVudHMgYXJlIHBhc3NlZCBkaXJlY3RseSB0byBgZ2l0IGxvZycKKworJ2JsYW1lJzo6CisgICAgICAgU2hvdyB3aGF0IHJldmlzaW9uIGFuZCBhdXRob3IgbGFzdCBtb2RpZmllZCBlYWNoIGxpbmUgb2YgYSBmaWxlLiBUaGlzIGlzCisgICAgICAgaWRlbnRpY2FsIHRvIGBnaXQgYmxhbWUnLCBidXQgU1ZOIHJldmlzaW9uIG51bWJlcnMgYXJlIHNob3duIGluc3RlYWQgb2YgZ2l0CisgICAgICAgY29tbWl0IGhhc2hlcy4KKysKK0FsbCBhcmd1bWVudHMgYXJlIHBhc3NlZCBkaXJlY3RseSB0byBgZ2l0IGJsYW1lJy4KKworLS0KKydmaW5kLXJldic6OgorCVdoZW4gZ2l2ZW4gYW4gU1ZOIHJldmlzaW9uIG51bWJlciBvZiB0aGUgZm9ybSAnck4nLCByZXR1cm5zIHRoZQorCWNvcnJlc3BvbmRpbmcgZ2l0IGNvbW1pdCBoYXNoICh0aGlzIGNhbiBvcHRpb25hbGx5IGJlIGZvbGxvd2VkIGJ5IGEKKwl0cmVlLWlzaCB0byBzcGVjaWZ5IHdoaWNoIGJyYW5jaCBzaG91bGQgYmUgc2VhcmNoZWQpLiAgV2hlbiBnaXZlbiBhCisJdHJlZS1pc2gsIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgU1ZOIHJldmlzaW9uIG51bWJlci4KKworJ3NldC10cmVlJzo6CisJWW91IHNob3VsZCBjb25zaWRlciB1c2luZyAnZGNvbW1pdCcgaW5zdGVhZCBvZiB0aGlzIGNvbW1hbmQuCisJQ29tbWl0IHNwZWNpZmllZCBjb21taXQgb3IgdHJlZSBvYmplY3RzIHRvIFNWTi4gIFRoaXMgcmVsaWVzIG9uCisJeW91ciBpbXBvcnRlZCBmZXRjaCBkYXRhIGJlaW5nIHVwLXRvLWRhdGUuICBUaGlzIG1ha2VzCisJYWJzb2x1dGVseSBubyBhdHRlbXB0cyB0byBkbyBwYXRjaGluZyB3aGVuIGNvbW1pdHRpbmcgdG8gU1ZOLCBpdAorCXNpbXBseSBvdmVyd3JpdGVzIGZpbGVzIHdpdGggdGhvc2Ugc3BlY2lmaWVkIGluIHRoZSB0cmVlIG9yCisJY29tbWl0LiAgQWxsIG1lcmdpbmcgaXMgYXNzdW1lZCB0byBoYXZlIHRha2VuIHBsYWNlCisJaW5kZXBlbmRlbnRseSBvZiBnaXQtc3ZuIGZ1bmN0aW9ucy4KKworJ3Nob3ctaWdub3JlJzo6CisJUmVjdXJzaXZlbHkgZmluZHMgYW5kIGxpc3RzIHRoZSBzdm46aWdub3JlIHByb3BlcnR5IG9uCisJZGlyZWN0b3JpZXMuICBUaGUgb3V0cHV0IGlzIHN1aXRhYmxlIGZvciBhcHBlbmRpbmcgdG8KKwl0aGUgJEdJVF9ESVIvaW5mby9leGNsdWRlIGZpbGUuCisKKydjb21taXQtZGlmZic6OgorCUNvbW1pdHMgdGhlIGRpZmYgb2YgdHdvIHRyZWUtaXNoIGFyZ3VtZW50cyBmcm9tIHRoZQorCWNvbW1hbmQtbGluZS4gIFRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJvcGVyYWJpbGl0eSB3aXRoCisJZ2l0LXN2bmltcG9ydCBhbmQgZG9lcyBub3QgcmVseSBvbiBiZWluZyBpbnNpZGUgYW4gZ2l0LXN2bgorCWluaXQtZWQgcmVwb3NpdG9yeS4gIFRoaXMgY29tbWFuZCB0YWtlcyB0aHJlZSBhcmd1bWVudHMsIChhKSB0aGUKKwlvcmlnaW5hbCB0cmVlIHRvIGRpZmYgYWdhaW5zdCwgKGIpIHRoZSBuZXcgdHJlZSByZXN1bHQsIChjKSB0aGUKKwlVUkwgb2YgdGhlIHRhcmdldCBTdWJ2ZXJzaW9uIHJlcG9zaXRvcnkuICBUaGUgZmluYWwgYXJndW1lbnQKKwkoVVJMKSBtYXkgYmUgb21pdHRlZCBpZiB5b3UgYXJlIHdvcmtpbmcgZnJvbSBhIGdpdC1zdm4tYXdhcmUKKwlyZXBvc2l0b3J5ICh0aGF0IGhhcyBiZWVuIGluaXQtZWQgd2l0aCBnaXQtc3ZuKS4KKwlUaGUgLXI8cmV2aXNpb24+IG9wdGlvbiBpcyByZXF1aXJlZCBmb3IgdGhpcy4KKworJ2luZm8nOjoKKwlTaG93cyBpbmZvcm1hdGlvbiBhYm91dCBhIGZpbGUgb3IgZGlyZWN0b3J5IHNpbWlsYXIgdG8gd2hhdAorCWBzdm4gaW5mbycgcHJvdmlkZXMuICBEb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCBhIC1yLy0tcmV2aXNpb24KKwlhcmd1bWVudC4gIFVzZSB0aGUgLS11cmwgb3B0aW9uIHRvIG91dHB1dCBvbmx5IHRoZSB2YWx1ZSBvZiB0aGUKKwknVVJMOicgZmllbGQuCisKKy0tCisKK09QVElPTlMKKy0tLS0tLS0KKy0tCisKKy0tc2hhcmVkWz17ZmFsc2V8dHJ1ZXx1bWFza3xncm91cHxhbGx8d29ybGR8ZXZlcnlib2R5fV06OgorLS10ZW1wbGF0ZT08dGVtcGxhdGVfZGlyZWN0b3J5Pjo6CisJT25seSB1c2VkIHdpdGggdGhlICdpbml0JyBjb21tYW5kLgorCVRoZXNlIGFyZSBwYXNzZWQgZGlyZWN0bHkgdG8gbGlua2dpdDpnaXQtaW5pdFsxXS4KKworLXIgPEFSRz46OgorLS1yZXZpc2lvbiA8QVJHPjo6CisKK1VzZWQgd2l0aCB0aGUgJ2ZldGNoJyBjb21tYW5kLgorCitUaGlzIGFsbG93cyByZXZpc2lvbiByYW5nZXMgZm9yIHBhcnRpYWwvY2F1dGVyaXplZCBoaXN0b3J5Cit0byBiZSBzdXBwb3J0ZWQuICAkTlVNQkVSLCAkTlVNQkVSMTokTlVNQkVSMiAobnVtZXJpYyByYW5nZXMpLAorJE5VTUJFUjpIRUFELCBhbmQgQkFTRTokTlVNQkVSIGFyZSBhbGwgc3VwcG9ydGVkLgorCitUaGlzIGNhbiBhbGxvdyB5b3UgdG8gbWFrZSBwYXJ0aWFsIG1pcnJvcnMgd2hlbiBydW5uaW5nIGZldGNoOworYnV0IGlzIGdlbmVyYWxseSBub3QgcmVjb21tZW5kZWQgYmVjYXVzZSBoaXN0b3J5IHdpbGwgYmUgc2tpcHBlZAorYW5kIGxvc3QuCisKKy06OgorLS1zdGRpbjo6CisKK09ubHkgdXNlZCB3aXRoIHRoZSAnc2V0LXRyZWUnIGNvbW1hbmQuCisKK1JlYWQgYSBsaXN0IG9mIGNvbW1pdHMgZnJvbSBzdGRpbiBhbmQgY29tbWl0IHRoZW0gaW4gcmV2ZXJzZQorb3JkZXIuICBPbmx5IHRoZSBsZWFkaW5nIHNoYTEgaXMgcmVhZCBmcm9tIGVhY2ggbGluZSwgc28KK2dpdC1yZXYtbGlzdCAtLXByZXR0eT1vbmVsaW5lIG91dHB1dCBjYW4gYmUgdXNlZC4KKworLS1ybWRpcjo6CisKK09ubHkgdXNlZCB3aXRoIHRoZSAnZGNvbW1pdCcsICdzZXQtdHJlZScgYW5kICdjb21taXQtZGlmZicgY29tbWFuZHMuCisKK1JlbW92ZSBkaXJlY3RvcmllcyBmcm9tIHRoZSBTVk4gdHJlZSBpZiB0aGVyZSBhcmUgbm8gZmlsZXMgbGVmdAorYmVoaW5kLiAgU1ZOIGNhbiB2ZXJzaW9uIGVtcHR5IGRpcmVjdG9yaWVzLCBhbmQgdGhleSBhcmUgbm90CityZW1vdmVkIGJ5IGRlZmF1bHQgaWYgdGhlcmUgYXJlIG5vIGZpbGVzIGxlZnQgaW4gdGhlbS4gIGdpdAorY2Fubm90IHZlcnNpb24gZW1wdHkgZGlyZWN0b3JpZXMuICBFbmFibGluZyB0aGlzIGZsYWcgd2lsbCBtYWtlCit0aGUgY29tbWl0IHRvIFNWTiBhY3QgbGlrZSBnaXQuCisKK2NvbmZpZyBrZXk6IHN2bi5ybWRpcgorCistZTo6CistLWVkaXQ6OgorCitPbmx5IHVzZWQgd2l0aCB0aGUgJ2Rjb21taXQnLCAnc2V0LXRyZWUnIGFuZCAnY29tbWl0LWRpZmYnIGNvbW1hbmRzLgorCitFZGl0IHRoZSBjb21taXQgbWVzc2FnZSBiZWZvcmUgY29tbWl0dGluZyB0byBTVk4uICBUaGlzIGlzIG9mZiBieQorZGVmYXVsdCBmb3Igb2JqZWN0cyB0aGF0IGFyZSBjb21taXRzLCBhbmQgZm9yY2VkIG9uIHdoZW4gY29tbWl0dGluZwordHJlZSBvYmplY3RzLgorCitjb25maWcga2V5OiBzdm4uZWRpdAorCistbDxudW0+OjoKKy0tZmluZC1jb3BpZXMtaGFyZGVyOjoKKworT25seSB1c2VkIHdpdGggdGhlICdkY29tbWl0JywgJ3NldC10cmVlJyBhbmQgJ2NvbW1pdC1kaWZmJyBjb21tYW5kcy4KKworVGhleSBhcmUgYm90aCBwYXNzZWQgZGlyZWN0bHkgdG8gZ2l0LWRpZmYtdHJlZSBzZWUKK2xpbmtnaXQ6Z2l0LWRpZmYtdHJlZVsxXSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworW3ZlcnNlXQorY29uZmlnIGtleTogc3ZuLmwKK2NvbmZpZyBrZXk6IHN2bi5maW5kY29waWVzaGFyZGVyCisKKy1BPGZpbGVuYW1lPjo6CistLWF1dGhvcnMtZmlsZT08ZmlsZW5hbWU+OjoKKworU3ludGF4IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgZmlsZXMgdXNlZCBieSBnaXQtc3ZuaW1wb3J0IGFuZAorZ2l0LWN2c2ltcG9ydDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJbG9naW5uYW1lID0gSm9lIFVzZXIgPHVzZXJAZXhhbXBsZS5jb20+CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgdGhpcyBvcHRpb24gaXMgc3BlY2lmaWVkIGFuZCBnaXQtc3ZuIGVuY291bnRlcnMgYW4gU1ZOCitjb21taXR0ZXIgbmFtZSB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBhdXRob3JzLWZpbGUsIGdpdC1zdm4KK3dpbGwgYWJvcnQgb3BlcmF0aW9uLiBUaGUgdXNlciB3aWxsIHRoZW4gaGF2ZSB0byBhZGQgdGhlCithcHByb3ByaWF0ZSBlbnRyeS4gIFJlLXJ1bm5pbmcgdGhlIHByZXZpb3VzIGdpdC1zdm4gY29tbWFuZAorYWZ0ZXIgdGhlIGF1dGhvcnMtZmlsZSBpcyBtb2RpZmllZCBzaG91bGQgY29udGludWUgb3BlcmF0aW9uLgorCitjb25maWcga2V5OiBzdm4uYXV0aG9yc2ZpbGUKKworLXE6OgorLS1xdWlldDo6CisJTWFrZSBnaXQtc3ZuIGxlc3MgdmVyYm9zZS4KKworLS1yZXBhY2tbPTxuPl06OgorLS1yZXBhY2stZmxhZ3M9PGZsYWdzPjo6CisKK1RoZXNlIHNob3VsZCBoZWxwIGtlZXAgZGlzayB1c2FnZSBzYW5lIGZvciBsYXJnZSBmZXRjaGVzCit3aXRoIG1hbnkgcmV2aXNpb25zLgorCistLXJlcGFjayB0YWtlcyBhbiBvcHRpb25hbCBhcmd1bWVudCBmb3IgdGhlIG51bWJlciBvZiByZXZpc2lvbnMKK3RvIGZldGNoIGJlZm9yZSByZXBhY2tpbmcuICBUaGlzIGRlZmF1bHRzIHRvIHJlcGFja2luZyBldmVyeQorMTAwMCBjb21taXRzIGZldGNoZWQgaWYgbm8gYXJndW1lbnQgaXMgc3BlY2lmaWVkLgorCistLXJlcGFjay1mbGFncyBhcmUgcGFzc2VkIGRpcmVjdGx5IHRvIGxpbmtnaXQ6Z2l0LXJlcGFja1sxXS4KKworW3ZlcnNlXQorY29uZmlnIGtleTogc3ZuLnJlcGFjaworY29uZmlnIGtleTogc3ZuLnJlcGFja2ZsYWdzCisKKy1tOjoKKy0tbWVyZ2U6OgorLXM8c3RyYXRlZ3k+OjoKKy0tc3RyYXRlZ3k9PHN0cmF0ZWd5Pjo6CisKK1RoZXNlIGFyZSBvbmx5IHVzZWQgd2l0aCB0aGUgJ2Rjb21taXQnIGFuZCAncmViYXNlJyBjb21tYW5kcy4KKworUGFzc2VkIGRpcmVjdGx5IHRvIGdpdC1yZWJhc2Ugd2hlbiB1c2luZyAnZGNvbW1pdCcgaWYgYQorJ2dpdC1yZXNldCcgY2Fubm90IGJlIHVzZWQgKHNlZSBkY29tbWl0KS4KKworLW46OgorLS1kcnktcnVuOjoKKworVGhpcyBpcyBvbmx5IHVzZWQgd2l0aCB0aGUgJ2Rjb21taXQnIGNvbW1hbmQuCisKK1ByaW50IG91dCB0aGUgc2VyaWVzIG9mIGdpdCBhcmd1bWVudHMgdGhhdCB3b3VsZCBzaG93Cit3aGljaCBkaWZmcyB3b3VsZCBiZSBjb21taXR0ZWQgdG8gU1ZOLgorCistLQorCitBRFZBTkNFRCBPUFRJT05TCistLS0tLS0tLS0tLS0tLS0tCistLQorCistaTxHSVRfU1ZOX0lEPjo6CistLWlkIDxHSVRfU1ZOX0lEPjo6CisKK1RoaXMgc2V0cyBHSVRfU1ZOX0lEIChpbnN0ZWFkIG9mIHVzaW5nIHRoZSBlbnZpcm9ubWVudCkuICBUaGlzCithbGxvd3MgdGhlIHVzZXIgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcmVmbmFtZSB0byBmZXRjaCBmcm9tCit3aGVuIHRyYWNraW5nIGEgc2luZ2xlIFVSTC4gIFRoZSAnbG9nJyBhbmQgJ2Rjb21taXQnIGNvbW1hbmRzCitubyBsb25nZXIgcmVxdWlyZSB0aGlzIHN3aXRjaCBhcyBhbiBhcmd1bWVudC4KKworLVI8cmVtb3RlIG5hbWU+OjoKKy0tc3ZuLXJlbW90ZSA8cmVtb3RlIG5hbWU+OjoKKwlTcGVjaWZ5IHRoZSBbc3ZuLXJlbW90ZSAiPHJlbW90ZSBuYW1lPiJdIHNlY3Rpb24gdG8gdXNlLAorCXRoaXMgYWxsb3dzIFNWTiBtdWx0aXBsZSByZXBvc2l0b3JpZXMgdG8gYmUgdHJhY2tlZC4KKwlEZWZhdWx0OiAic3ZuIgorCistLWZvbGxvdy1wYXJlbnQ6OgorCVRoaXMgaXMgZXNwZWNpYWxseSBoZWxwZnVsIHdoZW4gd2UncmUgdHJhY2tpbmcgYSBkaXJlY3RvcnkKKwl0aGF0IGhhcyBiZWVuIG1vdmVkIGFyb3VuZCB3aXRoaW4gdGhlIHJlcG9zaXRvcnksIG9yIGlmIHdlCisJc3RhcnRlZCB0cmFja2luZyBhIGJyYW5jaCBhbmQgbmV2ZXIgdHJhY2tlZCB0aGUgdHJ1bmsgaXQgd2FzCisJZGVzY2VuZGVkIGZyb20uIFRoaXMgZmVhdHVyZSBpcyBlbmFibGVkIGJ5IGRlZmF1bHQsIHVzZQorCS0tbm8tZm9sbG93LXBhcmVudCB0byBkaXNhYmxlIGl0LgorCitjb25maWcga2V5OiBzdm4uZm9sbG93cGFyZW50CisKKy0tCitDT05GSUcgRklMRS1PTkxZIE9QVElPTlMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0KKworc3ZuLm5vTWV0YWRhdGE6Ogorc3ZuLXJlbW90ZS48bmFtZT4ubm9NZXRhZGF0YTo6CisKK1RoaXMgZ2V0cyByaWQgb2YgdGhlIGdpdC1zdm4taWQ6IGxpbmVzIGF0IHRoZSBlbmQgb2YgZXZlcnkgY29tbWl0LgorCitJZiB5b3UgbG9zZSB5b3VyIC5naXQvc3ZuL2dpdC1zdm4vLnJldl9kYiBmaWxlLCBnaXQtc3ZuIHdpbGwgbm90CitiZSBhYmxlIHRvIHJlYnVpbGQgaXQgYW5kIHlvdSB3b24ndCBiZSBhYmxlIHRvIGZldGNoIGFnYWluLAorZWl0aGVyLiAgVGhpcyBpcyBmaW5lIGZvciBvbmUtc2hvdCBpbXBvcnRzLgorCitUaGUgJ2dpdC1zdm4gbG9nJyBjb21tYW5kIHdpbGwgbm90IHdvcmsgb24gcmVwb3NpdG9yaWVzIHVzaW5nCit0aGlzLCBlaXRoZXIuICBVc2luZyB0aGlzIGNvbmZsaWN0cyB3aXRoIHRoZSAndXNlU3ZtUHJvcHMnCitvcHRpb24gZm9yIChob3BlZnVsbHkpIG9idmlvdXMgcmVhc29ucy4KKworc3ZuLnVzZVN2bVByb3BzOjoKK3N2bi1yZW1vdGUuPG5hbWU+LnVzZVN2bVByb3BzOjoKKworVGhpcyBhbGxvd3MgZ2l0LXN2biB0byByZS1tYXAgcmVwb3NpdG9yeSBVUkxzIGFuZCBVVUlEcyBmcm9tCittaXJyb3JzIGNyZWF0ZWQgdXNpbmcgU1ZOOjpNaXJyb3IgKG9yIHN2aykgZm9yIG1ldGFkYXRhLgorCitJZiBhbiBTVk4gcmV2aXNpb24gaGFzIGEgcHJvcGVydHksICJzdm06aGVhZHJldiIsIGl0IGlzIGxpa2VseQordGhhdCB0aGUgcmV2aXNpb24gd2FzIGNyZWF0ZWQgYnkgU1ZOOjpNaXJyb3IgKGFsc28gdXNlZCBieSBTVkspLgorVGhlIHByb3BlcnR5IGNvbnRhaW5zIGEgcmVwb3NpdG9yeSBVVUlEIGFuZCBhIHJldmlzaW9uLiAgV2Ugd2FudAordG8gbWFrZSBpdCBsb29rIGxpa2Ugd2UgYXJlIG1pcnJvcmluZyB0aGUgb3JpZ2luYWwgVVJMLCBzbworaW50cm9kdWNlIGEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgb3JpZ2luYWwgaWRlbnRpdHkKK1VSTCBhbmQgVVVJRCwgYW5kIHVzZSBpdCB3aGVuIGdlbmVyYXRpbmcgbWV0YWRhdGEgaW4gY29tbWl0CittZXNzYWdlcy4KKworc3ZuLnVzZVN2bnN5bmNQcm9wczo6Citzdm4tcmVtb3RlLjxuYW1lPi51c2VTdm5zeW5jcHJvcHM6OgorCVNpbWlsYXIgdG8gdGhlIHVzZVN2bVByb3BzIG9wdGlvbjsgdGhpcyBpcyBmb3IgdXNlcnMKKwlvZiB0aGUgc3Zuc3luYygxKSBjb21tYW5kIGRpc3RyaWJ1dGVkIHdpdGggU1ZOIDEuNC54IGFuZAorCWxhdGVyLgorCitzdm4tcmVtb3RlLjxuYW1lPi5yZXdyaXRlUm9vdDo6CisJVGhpcyBhbGxvd3MgdXNlcnMgdG8gY3JlYXRlIHJlcG9zaXRvcmllcyBmcm9tIGFsdGVybmF0ZQorCVVSTHMuICBGb3IgZXhhbXBsZSwgYW4gYWRtaW5pc3RyYXRvciBjb3VsZCBydW4gZ2l0LXN2biBvbiB0aGUKKwlzZXJ2ZXIgbG9jYWxseSAoYWNjZXNzaW5nIHZpYSBmaWxlOi8vKSBidXQgd2lzaCB0byBkaXN0cmlidXRlCisJdGhlIHJlcG9zaXRvcnkgd2l0aCBhIHB1YmxpYyBodHRwOi8vIG9yIHN2bjovLyBVUkwgaW4gdGhlCisJbWV0YWRhdGEgc28gdXNlcnMgb2YgaXQgd2lsbCBzZWUgdGhlIHB1YmxpYyBVUkwuCisKK1NpbmNlIHRoZSBub01ldGFkYXRhLCByZXdyaXRlUm9vdCwgdXNlU3Zuc3luY1Byb3BzIGFuZCB1c2VTdm1Qcm9wcworb3B0aW9ucyBhbGwgYWZmZWN0IHRoZSBtZXRhZGF0YSBnZW5lcmF0ZWQgYW5kIHVzZWQgYnkgZ2l0LXN2bjsgdGhleQorKm11c3QqIGJlIHNldCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGJlZm9yZSBhbnkgaGlzdG9yeSBpcyBpbXBvcnRlZAorYW5kIHRoZXNlIHNldHRpbmdzIHNob3VsZCBuZXZlciBiZSBjaGFuZ2VkIG9uY2UgdGhleSBhcmUgc2V0LgorCitBZGRpdGlvbmFsbHksIG9ubHkgb25lIG9mIHRoZXNlIGZvdXIgb3B0aW9ucyBjYW4gYmUgdXNlZCBwZXItc3ZuLXJlbW90ZQorc2VjdGlvbiBiZWNhdXNlIHRoZXkgYWZmZWN0IHRoZSAnZ2l0LXN2bi1pZDonIG1ldGFkYXRhIGxpbmUuCisKKy0tCisKK0JBU0lDIEVYQU1QTEVTCistLS0tLS0tLS0tLS0tLQorCitUcmFja2luZyBhbmQgY29udHJpYnV0aW5nIHRvIHRoZSB0cnVuayBvZiBhIFN1YnZlcnNpb24tbWFuYWdlZCBwcm9qZWN0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2xvbmUgYSByZXBvIChsaWtlIGdpdCBjbG9uZSk6CisJZ2l0LXN2biBjbG9uZSBodHRwOi8vc3ZuLmZvby5vcmcvcHJvamVjdC90cnVuaworIyBFbnRlciB0aGUgbmV3bHkgY2xvbmVkIGRpcmVjdG9yeToKKwljZCB0cnVuaworIyBZb3Ugc2hvdWxkIGJlIG9uIG1hc3RlciBicmFuY2gsIGRvdWJsZS1jaGVjayB3aXRoIGdpdC1icmFuY2gKKwlnaXQgYnJhbmNoCisjIERvIHNvbWUgd29yayBhbmQgY29tbWl0IGxvY2FsbHkgdG8gZ2l0OgorCWdpdCBjb21taXQgLi4uCisjIFNvbWV0aGluZyBpcyBjb21taXR0ZWQgdG8gU1ZOLCByZWJhc2UgeW91ciBsb2NhbCBjaGFuZ2VzIGFnYWluc3QgdGhlCisjIGxhdGVzdCBjaGFuZ2VzIGluIFNWTjoKKwlnaXQtc3ZuIHJlYmFzZQorIyBOb3cgY29tbWl0IHlvdXIgY2hhbmdlcyAodGhhdCB3ZXJlIGNvbW1pdHRlZCBwcmV2aW91c2x5IHVzaW5nIGdpdCkgdG8gU1ZOLAorIyBhcyB3ZWxsIGFzIGF1dG9tYXRpY2FsbHkgdXBkYXRpbmcgeW91ciB3b3JraW5nIEhFQUQ6CisJZ2l0LXN2biBkY29tbWl0CisjIEFwcGVuZCBzdm46aWdub3JlIHNldHRpbmdzIHRvIHRoZSBkZWZhdWx0IGdpdCBleGNsdWRlIGZpbGU6CisJZ2l0LXN2biBzaG93LWlnbm9yZSA+PiAuZ2l0L2luZm8vZXhjbHVkZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RyYWNraW5nIGFuZCBjb250cmlidXRpbmcgdG8gYW4gZW50aXJlIFN1YnZlcnNpb24tbWFuYWdlZCBwcm9qZWN0CisoY29tcGxldGUgd2l0aCBhIHRydW5rLCB0YWdzIGFuZCBicmFuY2hlcyk6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDbG9uZSBhIHJlcG8gKGxpa2UgZ2l0IGNsb25lKToKKwlnaXQtc3ZuIGNsb25lIGh0dHA6Ly9zdm4uZm9vLm9yZy9wcm9qZWN0IC1UIHRydW5rIC1iIGJyYW5jaGVzIC10IHRhZ3MKKyMgVmlldyBhbGwgYnJhbmNoZXMgYW5kIHRhZ3MgeW91IGhhdmUgY2xvbmVkOgorCWdpdCBicmFuY2ggLXIKKyMgUmVzZXQgeW91ciBtYXN0ZXIgdG8gdHJ1bmsgKG9yIGFueSBvdGhlciBicmFuY2gsIHJlcGxhY2luZyAndHJ1bmsnCisjIHdpdGggdGhlIGFwcHJvcHJpYXRlIG5hbWUpOgorCWdpdCByZXNldCAtLWhhcmQgcmVtb3Rlcy90cnVuaworIyBZb3UgbWF5IG9ubHkgZGNvbW1pdCB0byBvbmUgYnJhbmNoL3RhZy90cnVuayBhdCBhIHRpbWUuICBUaGUgdXNhZ2UKKyMgb2YgZGNvbW1pdC9yZWJhc2Uvc2hvdy1pZ25vcmUgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIGFib3ZlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBpbml0aWFsICdnaXQtc3ZuIGNsb25lJyBjYW4gYmUgcXVpdGUgdGltZS1jb25zdW1pbmcKKyhlc3BlY2lhbGx5IGZvciBsYXJnZSBTdWJ2ZXJzaW9uIHJlcG9zaXRvcmllcykuIElmIG11bHRpcGxlCitwZW9wbGUgKG9yIG9uZSBwZXJzb24gd2l0aCBtdWx0aXBsZSBtYWNoaW5lcykgd2FudCB0byB1c2UKK2dpdC1zdm4gdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc2FtZSBTdWJ2ZXJzaW9uIHJlcG9zaXRvcnksIHlvdSBjYW4KK2RvIHRoZSBpbml0aWFsICdnaXQtc3ZuIGNsb25lJyB0byBhIHJlcG9zaXRvcnkgb24gYSBzZXJ2ZXIgYW5kCitoYXZlIGVhY2ggcGVyc29uIGNsb25lIHRoYXQgcmVwb3NpdG9yeSB3aXRoICdnaXQgY2xvbmUnOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRG8gdGhlIGluaXRpYWwgaW1wb3J0IG9uIGEgc2VydmVyCisJc3NoIHNlcnZlciAiY2QgL3B1YiAmJiBnaXQtc3ZuIGNsb25lIGh0dHA6Ly9zdm4uZm9vLm9yZy9wcm9qZWN0CisjIENsb25lIGxvY2FsbHkgLSBtYWtlIHN1cmUgdGhlIHJlZnMvcmVtb3Rlcy8gc3BhY2UgbWF0Y2hlcyB0aGUgc2VydmVyCisJbWtkaXIgcHJvamVjdAorCWNkIHByb2plY3QKKwlnaXQtaW5pdAorCWdpdCByZW1vdGUgYWRkIG9yaWdpbiBzZXJ2ZXI6L3B1Yi9wcm9qZWN0CisJZ2l0IGNvbmZpZyAtLWFkZCByZW1vdGUub3JpZ2luLmZldGNoPStyZWZzL3JlbW90ZXMvKjpyZWZzL3JlbW90ZXMvKgorCWdpdCBmZXRjaAorIyBJbml0aWFsaXplIGdpdC1zdm4gbG9jYWxseSAoYmUgc3VyZSB0byB1c2UgdGhlIHNhbWUgVVJMIGFuZCAtVC8tYi8tdCBvcHRpb25zIGFzIHdlcmUgdXNlZCBvbiBzZXJ2ZXIpCisJZ2l0LXN2biBpbml0IGh0dHA6Ly9zdm4uZm9vLm9yZy9wcm9qZWN0CisjIFB1bGwgdGhlIGxhdGVzdCBjaGFuZ2VzIGZyb20gU3VidmVyc2lvbgorCWdpdC1zdm4gcmViYXNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUkVCQVNFIFZTLiBQVUxML01FUkdFCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT3JpZ2luYWxseSwgZ2l0LXN2biByZWNvbW1lbmRlZCB0aGF0IHRoZSByZW1vdGVzL2dpdC1zdm4gYnJhbmNoIGJlCitwdWxsZWQgb3IgbWVyZ2VkIGZyb20uICBUaGlzIGlzIGJlY2F1c2UgdGhlIGF1dGhvciBmYXZvcmVkCisnZ2l0LXN2biBzZXQtdHJlZSBCJyB0byBjb21taXQgYSBzaW5nbGUgaGVhZCByYXRoZXIgdGhhbiB0aGUKKydnaXQtc3ZuIHNldC10cmVlIEEuLkInIG5vdGF0aW9uIHRvIGNvbW1pdCBtdWx0aXBsZSBjb21taXRzLgorCitJZiB5b3UgdXNlICdnaXQtc3ZuIHNldC10cmVlIEEuLkInIHRvIGNvbW1pdCBzZXZlcmFsIGRpZmZzIGFuZCB5b3UgZG8KK25vdCBoYXZlIHRoZSBsYXRlc3QgcmVtb3Rlcy9naXQtc3ZuIG1lcmdlZCBpbnRvIG15LWJyYW5jaCwgeW91IHNob3VsZAordXNlICdnaXQtc3ZuIHJlYmFzZScgdG8gdXBkYXRlIHlvdXIgd29yayBicmFuY2ggaW5zdGVhZCBvZiAnZ2l0IHB1bGwnIG9yCisnZ2l0IG1lcmdlJy4gICdwdWxsL21lcmdlJyBjYW4gY2F1c2Ugbm9uLWxpbmVhciBoaXN0b3J5IHRvIGJlIGZsYXR0ZW5lZAord2hlbiBjb21taXR0aW5nIGludG8gU1ZOLCB3aGljaCBjYW4gbGVhZCB0byBtZXJnZSBjb21taXRzIHJldmVyc2luZworcHJldmlvdXMgY29tbWl0cyBpbiBTVk4uCisKK0RFU0lHTiBQSElMT1NPUEhZCistLS0tLS0tLS0tLS0tLS0tLQorTWVyZ2UgdHJhY2tpbmcgaW4gU3VidmVyc2lvbiBpcyBsYWNraW5nIGFuZCBkb2luZyBicmFuY2hlZCBkZXZlbG9wbWVudAord2l0aCBTdWJ2ZXJzaW9uIGNhbiBiZSBjdW1iZXJzb21lIGFzIGEgcmVzdWx0LiAgV2hpbGUgZ2l0LXN2biBjYW4gdHJhY2sKK2NvcHkgaGlzdG9yeSAoaW5jbHVkaW5nIGJyYW5jaGVzIGFuZCB0YWdzKSBmb3IgcmVwb3NpdG9yaWVzIGFkb3B0aW5nIGEKK3N0YW5kYXJkIGxheW91dCwgaXQgY2Fubm90IHlldCByZXByZXNlbnQgbWVyZ2UgaGlzdG9yeSB0aGF0IGhhcHBlbmVkCitpbnNpZGUgZ2l0IGJhY2sgdXBzdHJlYW0gdG8gU1ZOIHVzZXJzLiAgVGhlcmVmb3JlIGl0IGlzIGFkdmlzZWQgdGhhdAordXNlcnMga2VlcCBoaXN0b3J5IGFzIGxpbmVhciBhcyBwb3NzaWJsZSBpbnNpZGUgZ2l0IHRvIGVhc2UKK2NvbXBhdGliaWxpdHkgd2l0aCBTVk4gKHNlZSB0aGUgQ0FWRUFUUyBzZWN0aW9uIGJlbG93KS4KKworQ0FWRUFUUworLS0tLS0tLQorCitGb3IgdGhlIHNha2Ugb2Ygc2ltcGxpY2l0eSBhbmQgaW50ZXJvcGVyYXRpbmcgd2l0aCBhIGxlc3MtY2FwYWJsZSBzeXN0ZW0KKyhTVk4pLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IGFsbCBnaXQtc3ZuIHVzZXJzIGNsb25lLCBmZXRjaCBhbmQgZGNvbW1pdAorZGlyZWN0bHkgZnJvbSB0aGUgU1ZOIHNlcnZlciwgYW5kIGF2b2lkIGFsbCBnaXQtY2xvbmUvcHVsbC9tZXJnZS9wdXNoCitvcGVyYXRpb25zIGJldHdlZW4gZ2l0IHJlcG9zaXRvcmllcyBhbmQgYnJhbmNoZXMuICBUaGUgcmVjb21tZW5kZWQKK21ldGhvZCBvZiBleGNoYW5naW5nIGNvZGUgYmV0d2VlbiBnaXQgYnJhbmNoZXMgYW5kIHVzZXJzIGlzCitnaXQtZm9ybWF0LXBhdGNoIGFuZCBnaXQtYW0sIG9yIGp1c3QgZGNvbW1pdGluZyB0byB0aGUgU1ZOIHJlcG9zaXRvcnkuCisKK1J1bm5pbmcgJ2dpdC1tZXJnZScgb3IgJ2dpdC1wdWxsJyBpcyBOT1QgcmVjb21tZW5kZWQgb24gYSBicmFuY2ggeW91CitwbGFuIHRvIGRjb21taXQgZnJvbS4gIFN1YnZlcnNpb24gZG9lcyBub3QgcmVwcmVzZW50IG1lcmdlcyBpbiBhbnkKK3JlYXNvbmFibGUgb3IgdXNlZnVsIGZhc2hpb247IHNvIHVzZXJzIHVzaW5nIFN1YnZlcnNpb24gY2Fubm90IHNlZSBhbnkKK21lcmdlcyB5b3UndmUgbWFkZS4gIEZ1cnRoZXJtb3JlLCBpZiB5b3UgbWVyZ2Ugb3IgcHVsbCBmcm9tIGEgZ2l0IGJyYW5jaAordGhhdCBpcyBhIG1pcnJvciBvZiBhbiBTVk4gYnJhbmNoLCBkY29tbWl0IG1heSBjb21taXQgdG8gdGhlIHdyb25nCiticmFuY2guCisKKydnaXQtY2xvbmUnIGRvZXMgbm90IGNsb25lIGJyYW5jaGVzIHVuZGVyIHRoZSByZWZzL3JlbW90ZXMvIGhpZXJhcmNoeSBvcgorYW55IGdpdC1zdm4gbWV0YWRhdGEsIG9yIGNvbmZpZy4gIFNvIHJlcG9zaXRvcmllcyBjcmVhdGVkIGFuZCBtYW5hZ2VkIHdpdGgKK3VzaW5nIGdpdC1zdm4gc2hvdWxkIHVzZSByc3luYygxKSBmb3IgY2xvbmluZywgaWYgY2xvbmluZyBpcyB0byBiZSBkb25lCithdCBhbGwuCisKK1NpbmNlICdkY29tbWl0JyB1c2VzIHJlYmFzZSBpbnRlcm5hbGx5LCBhbnkgZ2l0IGJyYW5jaGVzIHlvdSBnaXQtcHVzaCB0bworYmVmb3JlIGRjb21taXQgb24gd2lsbCByZXF1aXJlIGZvcmNpbmcgYW4gb3ZlcndyaXRlIG9mIHRoZSBleGlzdGluZyByZWYKK29uIHRoZSByZW1vdGUgcmVwb3NpdG9yeS4gIFRoaXMgaXMgZ2VuZXJhbGx5IGNvbnNpZGVyZWQgYmFkIHByYWN0aWNlLAorc2VlIHRoZSBnaXQtcHVzaCgxKSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgorCitEbyBub3QgdXNlIHRoZSAtLWFtZW5kIG9wdGlvbiBvZiBnaXQtY29tbWl0KDEpIG9uIGEgY2hhbmdlIHlvdSd2ZQorYWxyZWFkeSBkY29tbWl0dGVkLiAgSXQgaXMgY29uc2lkZXJlZCBiYWQgcHJhY3RpY2UgdG8gLS1hbWVuZCBjb21taXRzCit5b3UndmUgYWxyZWFkeSBwdXNoZWQgdG8gYSByZW1vdGUgcmVwb3NpdG9yeSBmb3Igb3RoZXIgdXNlcnMsIGFuZAorZGNvbW1pdCB3aXRoIFNWTiBpcyBhbmFsb2dvdXMgdG8gdGhhdC4KKworQlVHUworLS0tLQorCitXZSBpZ25vcmUgYWxsIFNWTiBwcm9wZXJ0aWVzIGV4Y2VwdCBzdm46ZXhlY3V0YWJsZS4gIEFueSB1bmhhbmRsZWQKK3Byb3BlcnRpZXMgYXJlIGxvZ2dlZCB0byAkR0lUX0RJUi9zdm4vPHJlZm5hbWU+L3VuaGFuZGxlZC5sb2cKKworUmVuYW1lZCBhbmQgY29waWVkIGRpcmVjdG9yaWVzIGFyZSBub3QgZGV0ZWN0ZWQgYnkgZ2l0IGFuZCBoZW5jZSBub3QKK3RyYWNrZWQgd2hlbiBjb21taXR0aW5nIHRvIFNWTi4gIEkgZG8gbm90IHBsYW4gb24gYWRkaW5nIHN1cHBvcnQgZm9yCit0aGlzIGFzIGl0J3MgcXVpdGUgZGlmZmljdWx0IGFuZCB0aW1lLWNvbnN1bWluZyB0byBnZXQgd29ya2luZyBmb3IgYWxsCit0aGUgcG9zc2libGUgY29ybmVyIGNhc2VzIChnaXQgZG9lc24ndCBkbyBpdCwgZWl0aGVyKS4gIENvbW1pdHRpbmcKK3JlbmFtZWQgYW5kIGNvcGllZCBmaWxlcyBhcmUgZnVsbHkgc3VwcG9ydGVkIGlmIHRoZXkncmUgc2ltaWxhciBlbm91Z2gKK2ZvciBnaXQgdG8gZGV0ZWN0IHRoZW0uCisKK0NPTkZJR1VSQVRJT04KKy0tLS0tLS0tLS0tLS0KKworZ2l0LXN2biBzdG9yZXMgW3N2bi1yZW1vdGVdIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaW4gdGhlCityZXBvc2l0b3J5IC5naXQvY29uZmlnIGZpbGUuICBJdCBpcyBzaW1pbGFyIHRoZSBjb3JlIGdpdAorW3JlbW90ZV0gc2VjdGlvbnMgZXhjZXB0ICdmZXRjaCcga2V5cyBkbyBub3QgYWNjZXB0IGdsb2IKK2FyZ3VtZW50czsgYnV0IHRoZXkgYXJlIGluc3RlYWQgaGFuZGxlZCBieSB0aGUgJ2JyYW5jaGVzJworYW5kICd0YWdzJyBrZXlzLiAgU2luY2Ugc29tZSBTVk4gcmVwb3NpdG9yaWVzIGFyZSBvZGRseQorY29uZmlndXJlZCB3aXRoIG11bHRpcGxlIHByb2plY3RzIGdsb2IgZXhwYW5zaW9ucyBzdWNoIHRob3NlCitsaXN0ZWQgYmVsb3cgYXJlIGFsbG93ZWQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorW3N2bi1yZW1vdGUgInByb2plY3QtYSJdCisJdXJsID0gaHR0cDovL3NlcnZlci5vcmcvc3ZuCisJYnJhbmNoZXMgPSBicmFuY2hlcy8qL3Byb2plY3QtYTpyZWZzL3JlbW90ZXMvcHJvamVjdC1hL2JyYW5jaGVzLyoKKwl0YWdzID0gdGFncy8qL3Byb2plY3QtYTpyZWZzL3JlbW90ZXMvcHJvamVjdC1hL3RhZ3MvKgorCXRydW5rID0gdHJ1bmsvcHJvamVjdC1hOnJlZnMvcmVtb3Rlcy9wcm9qZWN0LWEvdHJ1bmsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitLZWVwIGluIG1pbmQgdGhhdCB0aGUgJyonIChhc3Rlcmlzaykgd2lsZGNhcmQgb2YgdGhlIGxvY2FsIHJlZgorKHJpZ2h0IG9mIHRoZSAnOicpICptdXN0KiBiZSB0aGUgZmFydGhlc3QgcmlnaHQgcGF0aCBjb21wb25lbnQ7Citob3dldmVyIHRoZSByZW1vdGUgd2lsZGNhcmQgbWF5IGJlIGFueXdoZXJlIGFzIGxvbmcgYXMgaXQncyBvd24KK2luZGVwZW5kZW50IHBhdGggY29tcG9uZW50IChzdXJyb3VuZGVkIGJ5ICcvJyBvciBFT0wpLiAgIFRoaXMKK3R5cGUgb2YgY29uZmlndXJhdGlvbiBpcyBub3QgYXV0b21hdGljYWxseSBjcmVhdGVkIGJ5ICdpbml0JyBhbmQKK3Nob3VsZCBiZSBtYW51YWxseSBlbnRlcmVkIHdpdGggYSB0ZXh0LWVkaXRvciBvciB1c2luZworbGlua2dpdDpnaXQtY29uZmlnWzFdCisKK1NFRSBBTFNPCistLS0tLS0tLQorbGlua2dpdDpnaXQtcmViYXNlWzFdCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEVyaWMgV29uZyA8bm9ybWFscGVyc29uQHloYnQubmV0Pi4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLQorV3JpdHRlbiBieSBFcmljIFdvbmcgPG5vcm1hbHBlcnNvbkB5aGJ0Lm5ldD4uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zeW1ib2xpYy1yZWYudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc3ltYm9saWMtcmVmLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWI0MGYzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc3ltYm9saWMtcmVmLnR4dApAQCAtMCwwICsxLDYxIEBACitnaXQtc3ltYm9saWMtcmVmKDEpCis9PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zeW1ib2xpYy1yZWYgLSBSZWFkIGFuZCBtb2RpZnkgc3ltYm9saWMgcmVmcworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtc3ltYm9saWMtcmVmJyBbLXFdIFstbSA8cmVhc29uPl0gPG5hbWU+IFs8cmVmPl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitHaXZlbiBvbmUgYXJndW1lbnQsIHJlYWRzIHdoaWNoIGJyYW5jaCBoZWFkIHRoZSBnaXZlbiBzeW1ib2xpYworcmVmIHJlZmVycyB0byBhbmQgb3V0cHV0cyBpdHMgcGF0aCwgcmVsYXRpdmUgdG8gdGhlIGAuZ2l0L2AKK2RpcmVjdG9yeS4gIFR5cGljYWxseSB5b3Ugd291bGQgZ2l2ZSBgSEVBRGAgYXMgdGhlIDxuYW1lPgorYXJndW1lbnQgdG8gc2VlIG9uIHdoaWNoIGJyYW5jaCB5b3VyIHdvcmtpbmcgdHJlZSBpcyBvbi4KKworR2l2ZSB0d28gYXJndW1lbnRzLCBjcmVhdGUgb3IgdXBkYXRlIGEgc3ltYm9saWMgcmVmIDxuYW1lPiB0bworcG9pbnQgYXQgdGhlIGdpdmVuIGJyYW5jaCA8cmVmPi4KKworQSBzeW1ib2xpYyByZWYgaXMgYSByZWd1bGFyIGZpbGUgdGhhdCBzdG9yZXMgYSBzdHJpbmcgdGhhdAorYmVnaW5zIHdpdGggYHJlZjogcmVmcy9gLiAgRm9yIGV4YW1wbGUsIHlvdXIgYC5naXQvSEVBRGAgaXMKK2EgcmVndWxhciBmaWxlIHdob3NlIGNvbnRlbnRzIGlzIGByZWY6IHJlZnMvaGVhZHMvbWFzdGVyYC4KKworT1BUSU9OUworLS0tLS0tLQorCistcSwgLS1xdWlldDo6CisJRG8gbm90IGlzc3VlIGFuIGVycm9yIG1lc3NhZ2UgaWYgdGhlIDxuYW1lPiBpcyBub3QgYQorCXN5bWJvbGljIHJlZiBidXQgYSBkZXRhY2hlZCBIRUFEOyBpbnN0ZWFkIGV4aXQgd2l0aAorCW5vbi16ZXJvIHN0YXR1cyBzaWxlbnRseS4KKworLW06OgorCVVwZGF0ZSB0aGUgcmVmbG9nIGZvciA8bmFtZT4gd2l0aCA8cmVhc29uPi4gIFRoaXMgaXMgdmFsaWQgb25seQorCXdoZW4gY3JlYXRpbmcgb3IgdXBkYXRpbmcgYSBzeW1ib2xpYyByZWYuCisKK05PVEVTCistLS0tLQorSW4gdGhlIHBhc3QsIGAuZ2l0L0hFQURgIHdhcyBhIHN5bWJvbGljIGxpbmsgcG9pbnRpbmcgYXQKK2ByZWZzL2hlYWRzL21hc3RlcmAuICBXaGVuIHdlIHdhbnRlZCB0byBzd2l0Y2ggdG8gYW5vdGhlciBicmFuY2gsCit3ZSBkaWQgYGxuIC1zZiByZWZzL2hlYWRzL25ld2JyYW5jaCAuZ2l0L0hFQURgLCBhbmQgd2hlbiB3ZSB3YW50ZWQKK3RvIGZpbmQgb3V0IHdoaWNoIGJyYW5jaCB3ZSBhcmUgb24sIHdlIGRpZCBgcmVhZGxpbmsgLmdpdC9IRUFEYC4KK1RoaXMgd2FzIGZpbmUsIGFuZCBpbnRlcm5hbGx5IHRoYXQgaXMgd2hhdCBzdGlsbCBoYXBwZW5zIGJ5CitkZWZhdWx0LCBidXQgb24gcGxhdGZvcm1zIHRoYXQgZG8gbm90IGhhdmUgd29ya2luZyBzeW1saW5rcywKK29yIHRoYXQgZG8gbm90IGhhdmUgdGhlIGByZWFkbGluaygxKWAgY29tbWFuZCwgdGhpcyB3YXMgYSBiaXQKK2N1bWJlcnNvbWUuICBPbiBzb21lIHBsYXRmb3JtcywgYGxuIC1zZmAgZG9lcyBub3QgZXZlbiB3b3JrIGFzCithZHZlcnRpc2VkIChob3Jyb3JzKS4gIFRoZXJlZm9yZSBzeW1ib2xpYyBsaW5rcyBhcmUgbm93IGRlcHJlY2F0ZWQKK2FuZCBzeW1ib2xpYyByZWZzIGFyZSB1c2VkIGJ5IGRlZmF1bHQuCisKK2dpdC1zeW1ib2xpYy1yZWYgd2lsbCBleGl0IHdpdGggc3RhdHVzIDAgaWYgdGhlIGNvbnRlbnRzIG9mIHRoZQorc3ltYm9saWMgcmVmIHdlcmUgcHJpbnRlZCBjb3JyZWN0bHksIHdpdGggc3RhdHVzIDEgaWYgdGhlIHJlcXVlc3RlZAorbmFtZSBpcyBub3QgYSBzeW1ib2xpYyByZWYsIG9yIDEyOCBpZiBhbm90aGVyIGVycm9yIG9jY3Vycy4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXRhZy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC10YWcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMmZiNzEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC10YWcudHh0CkBAIC0wLDAgKzEsMjU4IEBACitnaXQtdGFnKDEpCis9PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC10YWcgLSBDcmVhdGUsIGxpc3QsIGRlbGV0ZSBvciB2ZXJpZnkgYSB0YWcgb2JqZWN0IHNpZ25lZCB3aXRoIEdQRworCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC10YWcnIFstYSB8IC1zIHwgLXUgPGtleS1pZD5dIFstZl0gWy1tIDxtc2c+IHwgLUYgPGZpbGU+XSAgPG5hbWU+IFs8aGVhZD5dCisnZ2l0LXRhZycgLWQgPG5hbWU+Li4uCisnZ2l0LXRhZycgWy1uIFs8bnVtPl1dIC1sIFs8cGF0dGVybj5dCisnZ2l0LXRhZycgLXYgPG5hbWU+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQWRkcyBhICd0YWcnIHJlZmVyZW5jZSBpbiBgLmdpdC9yZWZzL3RhZ3MvYAorCitVbmxlc3MgYC1mYCBpcyBnaXZlbiwgdGhlIHRhZyBtdXN0IG5vdCB5ZXQgZXhpc3QgaW4KK2AuZ2l0L3JlZnMvdGFncy9gIGRpcmVjdG9yeS4KKworSWYgb25lIG9mIGAtYWAsIGAtc2AsIG9yIGAtdSA8a2V5LWlkPmAgaXMgcGFzc2VkLCB0aGUgY29tbWFuZAorY3JlYXRlcyBhICd0YWcnIG9iamVjdCwgYW5kIHJlcXVpcmVzIHRoZSB0YWcgbWVzc2FnZS4gIFVubGVzcworYC1tIDxtc2c+YCBvciBgLUYgPGZpbGU+YCBpcyBnaXZlbiwgYW4gZWRpdG9yIGlzIHN0YXJ0ZWQgZm9yIHRoZSB1c2VyIHRvIHR5cGUKK2luIHRoZSB0YWcgbWVzc2FnZS4KKworSWYgYC1tIDxtc2c+YCBvciBgLUYgPGZpbGU+YCBpcyBnaXZlbiBhbmQgYC1hYCwgYC1zYCwgYW5kIGAtdSA8a2V5LWlkPmAKK2FyZSBhYnNlbnQsIGAtYWAgaXMgaW1wbGllZC4KKworT3RoZXJ3aXNlIGp1c3QgdGhlIFNIQTEgb2JqZWN0IG5hbWUgb2YgdGhlIGNvbW1pdCBvYmplY3QgaXMKK3dyaXR0ZW4gKGkuZS4gYSBsaWdodHdlaWdodCB0YWcpLgorCitBIEdudVBHIHNpZ25lZCB0YWcgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZCB3aGVuIGAtc2Agb3IgYC11Cis8a2V5LWlkPmAgaXMgdXNlZC4gIFdoZW4gYC11IDxrZXktaWQ+YCBpcyBub3QgdXNlZCwgdGhlCitjb21taXR0ZXIgaWRlbnRpdHkgZm9yIHRoZSBjdXJyZW50IHVzZXIgaXMgdXNlZCB0byBmaW5kIHRoZQorR251UEcga2V5IGZvciBzaWduaW5nLgorCitPUFRJT05TCistLS0tLS0tCistYTo6CisJTWFrZSBhbiB1bnNpZ25lZCwgYW5ub3RhdGVkIHRhZyBvYmplY3QKKworLXM6OgorCU1ha2UgYSBHUEctc2lnbmVkIHRhZywgdXNpbmcgdGhlIGRlZmF1bHQgZS1tYWlsIGFkZHJlc3MncyBrZXkKKworLXUgPGtleS1pZD46OgorCU1ha2UgYSBHUEctc2lnbmVkIHRhZywgdXNpbmcgdGhlIGdpdmVuIGtleQorCistZjo6CisJUmVwbGFjZSBhbiBleGlzdGluZyB0YWcgd2l0aCB0aGUgZ2l2ZW4gbmFtZSAoaW5zdGVhZCBvZiBmYWlsaW5nKQorCistZDo6CisJRGVsZXRlIGV4aXN0aW5nIHRhZ3Mgd2l0aCB0aGUgZ2l2ZW4gbmFtZXMuCisKKy12OjoKKwlWZXJpZnkgdGhlIGdwZyBzaWduYXR1cmUgb2YgdGhlIGdpdmVuIHRhZyBuYW1lcy4KKworLW4gPG51bT46OgorCTxudW0+IHNwZWNpZmllcyBob3cgbWFueSBsaW5lcyBmcm9tIHRoZSBhbm5vdGF0aW9uLCBpZiBhbnksCisJYXJlIHByaW50ZWQgd2hlbiB1c2luZyAtbC4KKwlUaGUgZGVmYXVsdCBpcyBub3QgdG8gcHJpbnQgYW55IGFubm90YXRpb24gbGluZXMuCisJSWYgbm8gbnVtYmVyIGlzIGdpdmVuIHRvIGAtbmAsIG9ubHkgdGhlIGZpcnN0IGxpbmUgaXMgcHJpbnRlZC4KKworLWwgPHBhdHRlcm4+OjoKKwlMaXN0IHRhZ3Mgd2l0aCBuYW1lcyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBwYXR0ZXJuIChvciBhbGwgaWYgbm8gcGF0dGVybiBpcyBnaXZlbikuCisJVHlwaW5nICJnaXQgdGFnIiB3aXRob3V0IGFyZ3VtZW50cywgYWxzbyBsaXN0cyBhbGwgdGFncy4KKworLW0gPG1zZz46OgorCVVzZSB0aGUgZ2l2ZW4gdGFnIG1lc3NhZ2UgKGluc3RlYWQgb2YgcHJvbXB0aW5nKS4KKwlJZiBtdWx0aXBsZSBgLW1gIG9wdGlvbnMgYXJlIGdpdmVuLCB0aGVyZSB2YWx1ZXMgYXJlCisJY29uY2F0ZW5hdGVkIGFzIHNlcGFyYXRlIHBhcmFncmFwaHMuCisJSW1wbGllcyBgLWFgIGlmIG5vbmUgb2YgYC1hYCwgYC1zYCwgb3IgYC11IDxrZXktaWQ+YAorCWlzIGdpdmVuLgorCistRiA8ZmlsZT46OgorCVRha2UgdGhlIHRhZyBtZXNzYWdlIGZyb20gdGhlIGdpdmVuIGZpbGUuICBVc2UgJy0nIHRvCisJcmVhZCB0aGUgbWVzc2FnZSBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dC4KKwlJbXBsaWVzIGAtYWAgaWYgbm9uZSBvZiBgLWFgLCBgLXNgLCBvciBgLXUgPGtleS1pZD5gCisJaXMgZ2l2ZW4uCisKK0NPTkZJR1VSQVRJT04KKy0tLS0tLS0tLS0tLS0KK0J5IGRlZmF1bHQsIGdpdC10YWcgaW4gc2lnbi13aXRoLWRlZmF1bHQgbW9kZSAoLXMpIHdpbGwgdXNlIHlvdXIKK2NvbW1pdHRlciBpZGVudGl0eSAob2YgdGhlIGZvcm0gIllvdXIgTmFtZSA8eW91ckBlbWFpbC5hZGRyZXNzPiIpIHRvCitmaW5kIGEga2V5LiAgSWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IGRlZmF1bHQga2V5LCB5b3UgY2FuIHNwZWNpZnkKK2l0IGluIHRoZSByZXBvc2l0b3J5IGNvbmZpZ3VyYXRpb24gYXMgZm9sbG93czoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorW3VzZXJdCisgICAgc2lnbmluZ2tleSA9IDxncGcta2V5LWlkPgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK0RJU0NVU1NJT04KKy0tLS0tLS0tLS0KKworT24gUmUtdGFnZ2luZworfn5+fn5+fn5+fn5+fgorCitXaGF0IHNob3VsZCB5b3UgZG8gd2hlbiB5b3UgdGFnIGEgd3JvbmcgY29tbWl0IGFuZCB5b3Ugd291bGQKK3dhbnQgdG8gcmUtdGFnPworCitJZiB5b3UgbmV2ZXIgcHVzaGVkIGFueXRoaW5nIG91dCwganVzdCByZS10YWcgaXQuIFVzZSAiLWYiIHRvCityZXBsYWNlIHRoZSBvbGQgb25lLiBBbmQgeW91J3JlIGRvbmUuCisKK0J1dCBpZiB5b3UgaGF2ZSBwdXNoZWQgdGhpbmdzIG91dCAob3Igb3RoZXJzIGNvdWxkIGp1c3QgcmVhZAoreW91ciByZXBvc2l0b3J5IGRpcmVjdGx5KSwgdGhlbiBvdGhlcnMgd2lsbCBoYXZlIGFscmVhZHkgc2VlbgordGhlIG9sZCB0YWcuIEluIHRoYXQgY2FzZSB5b3UgY2FuIGRvIG9uZSBvZiB0d28gdGhpbmdzOgorCisuIFRoZSBzYW5lIHRoaW5nLgorSnVzdCBhZG1pdCB5b3Ugc2NyZXdlZCB1cCwgYW5kIHVzZSBhIGRpZmZlcmVudCBuYW1lLiBPdGhlcnMgaGF2ZQorYWxyZWFkeSBzZWVuIG9uZSB0YWctbmFtZSwgYW5kIGlmIHlvdSBrZWVwIHRoZSBzYW1lIG5hbWUsIHlvdQorbWF5IGJlIGluIHRoZSBzaXR1YXRpb24gdGhhdCB0d28gcGVvcGxlIGJvdGggaGF2ZSAidmVyc2lvbiBYIiwKK2J1dCB0aGV5IGFjdHVhbGx5IGhhdmUgJ2RpZmZlcmVudCcgIlgiJ3MuICBTbyBqdXN0IGNhbGwgaXQgIlguMSIKK2FuZCBiZSBkb25lIHdpdGggaXQuCisKKy4gVGhlIGluc2FuZSB0aGluZy4KK1lvdSByZWFsbHkgd2FudCB0byBjYWxsIHRoZSBuZXcgdmVyc2lvbiAiWCIgdG9vLCAnZXZlbiB0aG91Z2gnCitvdGhlcnMgaGF2ZSBhbHJlYWR5IHNlZW4gdGhlIG9sZCBvbmUuIFNvIGp1c3QgdXNlICJnaXQgdGFnIC1mIgorYWdhaW4sIGFzIGlmIHlvdSBoYWRuJ3QgYWxyZWFkeSBwdWJsaXNoZWQgdGhlIG9sZCBvbmUuCisKK0hvd2V2ZXIsIEdpdCBkb2VzICpub3QqIChhbmQgaXQgc2hvdWxkIG5vdCkgY2hhbmdlIHRhZ3MgYmVoaW5kCit1c2VycyBiYWNrLiBTbyBpZiBzb21lYm9keSBhbHJlYWR5IGdvdCB0aGUgb2xkIHRhZywgZG9pbmcgYSAiZ2l0CitwdWxsIiBvbiB5b3VyIHRyZWUgc2hvdWxkbid0IGp1c3QgbWFrZSB0aGVtIG92ZXJ3cml0ZSB0aGUgb2xkCitvbmUuCisKK0lmIHNvbWVib2R5IGdvdCBhIHJlbGVhc2UgdGFnIGZyb20geW91LCB5b3UgY2Fubm90IGp1c3QgY2hhbmdlCit0aGUgdGFnIGZvciB0aGVtIGJ5IHVwZGF0aW5nIHlvdXIgb3duIG9uZS4gVGhpcyBpcyBhIGJpZworc2VjdXJpdHkgaXNzdWUsIGluIHRoYXQgcGVvcGxlIE1VU1QgYmUgYWJsZSB0byB0cnVzdCB0aGVpcgordGFnLW5hbWVzLiAgSWYgeW91IHJlYWxseSB3YW50IHRvIGRvIHRoZSBpbnNhbmUgdGhpbmcsIHlvdSBuZWVkCit0byBqdXN0IGZlc3MgdXAgdG8gaXQsIGFuZCB0ZWxsIHBlb3BsZSB0aGF0IHlvdSBtZXNzZWQgdXAuIFlvdQorY2FuIGRvIHRoYXQgYnkgbWFraW5nIGEgdmVyeSBwdWJsaWMgYW5ub3VuY2VtZW50IHNheWluZzoKKworLS0tLS0tLS0tLS0tCitPaywgSSBtZXNzZWQgdXAsIGFuZCBJIHB1c2hlZCBvdXQgYW4gZWFybGllciB2ZXJzaW9uIHRhZ2dlZCBhcyBYLiBJCit0aGVuIGZpeGVkIHNvbWV0aGluZywgYW5kIHJldGFnZ2VkIHRoZSAqZml4ZWQqIHRyZWUgYXMgWCBhZ2Fpbi4KKworSWYgeW91IGdvdCB0aGUgd3JvbmcgdGFnLCBhbmQgd2FudCB0aGUgbmV3IG9uZSwgcGxlYXNlIGRlbGV0ZQordGhlIG9sZCBvbmUgYW5kIGZldGNoIHRoZSBuZXcgb25lIGJ5IGRvaW5nOgorCisJZ2l0IHRhZyAtZCBYCisJZ2l0IGZldGNoIG9yaWdpbiB0YWcgWAorCit0byBnZXQgbXkgdXBkYXRlZCB0YWcuCisKK1lvdSBjYW4gdGVzdCB3aGljaCB0YWcgeW91IGhhdmUgYnkgZG9pbmcKKworCWdpdCByZXYtcGFyc2UgWAorCit3aGljaCBzaG91bGQgcmV0dXJuIDAxMjM0NTY3ODlhYmNkZWYuLiBpZiB5b3UgaGF2ZSB0aGUgbmV3IHZlcnNpb24uCisKK1NvcnJ5IGZvciBpbmNvbnZlbmllbmNlLgorLS0tLS0tLS0tLS0tCisKK0RvZXMgdGhpcyBzZWVtIGEgYml0IGNvbXBsaWNhdGVkPyAgSXQgKnNob3VsZCogYmUuIFRoZXJlIGlzIG5vCit3YXkgdGhhdCBpdCB3b3VsZCBiZSBjb3JyZWN0IHRvIGp1c3QgImZpeCIgaXQgYmVoaW5kIHBlb3BsZXMKK2JhY2tzLiBQZW9wbGUgbmVlZCB0byBrbm93IHRoYXQgdGhlaXIgdGFncyBtaWdodCBoYXZlIGJlZW4KK2NoYW5nZWQuCisKKworT24gQXV0b21hdGljIGZvbGxvd2luZworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitJZiB5b3UgYXJlIGZvbGxvd2luZyBzb21lYm9keSBlbHNlJ3MgdHJlZSwgeW91IGFyZSBtb3N0IGxpa2VseQordXNpbmcgdHJhY2tpbmcgYnJhbmNoZXMgKGByZWZzL2hlYWRzL29yaWdpbmAgaW4gdHJhZGl0aW9uYWwKK2xheW91dCwgb3IgYHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyYCBpbiB0aGUgc2VwYXJhdGUtcmVtb3RlCitsYXlvdXQpLiAgWW91IHVzdWFsbHkgd2FudCB0aGUgdGFncyBmcm9tIHRoZSBvdGhlciBlbmQuCisKK09uIHRoZSBvdGhlciBoYW5kLCBpZiB5b3UgYXJlIGZldGNoaW5nIGJlY2F1c2UgeW91IHdvdWxkIHdhbnQgYQorb25lLXNob3QgbWVyZ2UgZnJvbSBzb21lYm9keSBlbHNlLCB5b3UgdHlwaWNhbGx5IGRvIG5vdCB3YW50IHRvCitnZXQgdGFncyBmcm9tIHRoZXJlLiAgVGhpcyBoYXBwZW5zIG1vcmUgb2Z0ZW4gZm9yIHBlb3BsZSBuZWFyCit0aGUgdG9wbGV2ZWwgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZW0uICBNZXJlIG1vcnRhbHMgd2hlbiBwdWxsaW5nCitmcm9tIGVhY2ggb3RoZXIgZG8gbm90IG5lY2Vzc2FyaWx5IHdhbnQgdG8gYXV0b21hdGljYWxseSBnZXQKK3ByaXZhdGUgYW5jaG9yIHBvaW50IHRhZ3MgZnJvbSB0aGUgb3RoZXIgcGVyc29uLgorCitZb3Ugd291bGQgbm90aWNlICJwbGVhc2UgcHVsbCIgbWVzc2FnZXMgb24gdGhlIG1haWxpbmcgbGlzdCBzYXlzCityZXBvIFVSTCBhbmQgYnJhbmNoIG5hbWUgYWxvbmUuICBUaGlzIGlzIGRlc2lnbmVkIHRvIGJlIGVhc2lseQorY3V0JnBhc3RlZCB0byAiZ2l0IGZldGNoIiBjb21tYW5kIGxpbmU6CisKKy0tLS0tLS0tLS0tLQorTGludXMsIHBsZWFzZSBwdWxsIGZyb20KKworCWdpdDovL2dpdC4uLi4vcHJvai5naXQgbWFzdGVyCisKK3RvIGdldCB0aGUgZm9sbG93aW5nIHVwZGF0ZXMuLi4KKy0tLS0tLS0tLS0tLQorCitiZWNvbWVzOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IHB1bGwgZ2l0Oi8vZ2l0Li4uLi9wcm9qLmdpdCBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCitJbiBzdWNoIGEgY2FzZSwgeW91IGRvIG5vdCB3YW50IHRvIGF1dG9tYXRpY2FsbHkgZm9sbG93IG90aGVyJ3MKK3RhZ3MuCisKK09uZSBpbXBvcnRhbnQgYXNwZWN0IG9mIGdpdCBpcyBpdCBpcyBkaXN0cmlidXRlZCwgYW5kIGJlaW5nCitkaXN0cmlidXRlZCBsYXJnZWx5IG1lYW5zIHRoZXJlIGlzIG5vIGluaGVyZW50ICJ1cHN0cmVhbSIgb3IKKyJkb3duc3RyZWFtIiBpbiB0aGUgc3lzdGVtLiAgT24gdGhlIGZhY2Ugb2YgaXQsIHRoZSBhYm92ZQorZXhhbXBsZSBtaWdodCBzZWVtIHRvIGluZGljYXRlIHRoYXQgdGhlIHRhZyBuYW1lc3BhY2UgaXMgb3duZWQKK2J5IHVwcGVyIGVjaGVsb24gb2YgcGVvcGxlIGFuZCB0YWdzIG9ubHkgZmxvdyBkb3dud2FyZHMsIGJ1dAordGhhdCBpcyBub3QgdGhlIGNhc2UuICBJdCBvbmx5IHNob3dzIHRoYXQgdGhlIHVzYWdlIHBhdHRlcm4KK2RldGVybWluZXMgd2hvIGFyZSBpbnRlcmVzdGVkIGluIHdob3NlIHRhZ3MuCisKK0Egb25lLXNob3QgcHVsbCBpcyBhIHNpZ24gdGhhdCBhIGNvbW1pdCBoaXN0b3J5IGlzIG5vdyBjcm9zc2luZwordGhlIGJvdW5kYXJ5IGJldHdlZW4gb25lIGNpcmNsZSBvZiBwZW9wbGUgKGUuZy4gInBlb3BsZSB3aG8gYXJlCitwcmltYXJpbHkgaW50ZXJlc3RlZCBpbiBuZXR3b3JraW5nIHBhcnQgb2YgdGhlIGtlcm5lbCIpIHdobyBtYXkKK2hhdmUgdGhlaXIgb3duIHNldCBvZiB0YWdzIChlLmcuICJ0aGlzIGlzIHRoZSB0aGlyZCByZWxlYXNlCitjYW5kaWRhdGUgZnJvbSB0aGUgbmV0d29ya2luZyBncm91cCB0byBiZSBwcm9wb3NlZCBmb3IgZ2VuZXJhbAorY29uc3VtcHRpb24gd2l0aCAyLjYuMjEgcmVsZWFzZSIpIHRvIGFub3RoZXIgY2lyY2xlIG9mIHBlb3BsZQorKGUuZy4gInBlb3BsZSB3aG8gaW50ZWdyYXRlIHZhcmlvdXMgc3Vic3lzdGVtIGltcHJvdmVtZW50cyIpLgorVGhlIGxhdHRlciBhcmUgdXN1YWxseSBub3QgaW50ZXJlc3RlZCBpbiB0aGUgZGV0YWlsZWQgdGFncyB1c2VkCitpbnRlcm5hbGx5IGluIHRoZSBmb3JtZXIgZ3JvdXAgKHRoYXQgaXMgd2hhdCAiaW50ZXJuYWwiIG1lYW5zKS4KK1RoYXQgaXMgd2h5IGl0IGlzIGRlc2lyYWJsZSBub3QgdG8gZm9sbG93IHRhZ3MgYXV0b21hdGljYWxseSBpbgordGhpcyBjYXNlLgorCitJdCBtYXkgd2VsbCBiZSB0aGF0IGFtb25nIG5ldHdvcmtpbmcgcGVvcGxlLCB0aGV5IG1heSB3YW50IHRvCitleGNoYW5nZSB0aGUgdGFncyBpbnRlcm5hbCB0byB0aGVpciBncm91cCwgYnV0IGluIHRoYXQgd29ya2Zsb3cKK3RoZXkgYXJlIG1vc3QgbGlrZWx5IHRyYWNraW5nIHdpdGggZWFjaCBvdGhlcidzIHByb2dyZXNzIGJ5CitoYXZpbmcgdHJhY2tpbmcgYnJhbmNoZXMuICBBZ2FpbiwgdGhlIGhldXJpc3RpYyB0byBhdXRvbWF0aWNhbGx5Citmb2xsb3cgc3VjaCB0YWdzIGlzIGEgZ29vZCB0aGluZy4KKworCitPbiBCYWNrZGF0aW5nIFRhZ3MKK35+fn5+fn5+fn5+fn5+fn5+fgorCitJZiB5b3UgaGF2ZSBpbXBvcnRlZCBzb21lIGNoYW5nZXMgZnJvbSBhbm90aGVyIFZDUyBhbmQgd291bGQgbGlrZQordG8gYWRkIHRhZ3MgZm9yIG1ham9yIHJlbGVhc2VzIG9mIHlvdXIgd29yaywgaXQgaXMgdXNlZnVsIHRvIGJlIGFibGUKK3RvIHNwZWNpZnkgdGhlIGRhdGUgdG8gZW1iZWQgaW5zaWRlIG9mIHRoZSB0YWcgb2JqZWN0LiAgVGhlIGRhdGEgaW4KK3RoZSB0YWcgb2JqZWN0IGFmZmVjdHMsIGZvciBleGFtcGxlLCB0aGUgb3JkZXJpbmcgb2YgdGFncyBpbiB0aGUKK2dpdHdlYiBpbnRlcmZhY2UuCisKK1RvIHNldCB0aGUgZGF0ZSB1c2VkIGluIGZ1dHVyZSB0YWcgb2JqZWN0cywgc2V0IHRoZSBlbnZpcm9ubWVudAordmFyaWFibGUgR0lUX0FVVEhPUl9EQVRFIHRvIG9uZSBvciBtb3JlIG9mIHRoZSBkYXRlIGFuZCB0aW1lLiAgVGhlCitkYXRlIGFuZCB0aW1lIGNhbiBiZSBzcGVjaWZpZWQgaW4gYSBudW1iZXIgb2Ygd2F5czsgdGhlIG1vc3QgY29tbW9uCitpcyAiWVlZWS1NTS1ERCBISDpNTSIuCisKK0FuIGV4YW1wbGUgZm9sbG93cy4KKworLS0tLS0tLS0tLS0tCiskIEdJVF9BVVRIT1JfREFURT0iMjAwNi0xMC0wMiAxMDozMSIgZ2l0IHRhZyAtcyB2MS4wLjEKKy0tLS0tLS0tLS0tLQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4sCitKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+IGFuZCBDaHJpcyBXcmlnaHQgPGNocmlzd0Bvc2RsLm9yZz4uCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXRhci10cmVlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXRhci10cmVlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWM2ODE3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdGFyLXRyZWUudHh0CkBAIC0wLDAgKzEsODkgQEAKK2dpdC10YXItdHJlZSgxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC10YXItdHJlZSAtIENyZWF0ZSBhIHRhciBhcmNoaXZlIG9mIHRoZSBmaWxlcyBpbiB0aGUgbmFtZWQgdHJlZSBvYmplY3QKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtdGFyLXRyZWUnIFstLXJlbW90ZT08cmVwbz5dIDx0cmVlLWlzaD4gWyA8YmFzZT4gXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RISVMgQ09NTUFORCBJUyBERVBSRUNBVEVELiAgVXNlIGBnaXQtYXJjaGl2ZWAgd2l0aCBgLS1mb3JtYXQ9dGFyYAorb3B0aW9uIGluc3RlYWQgKGFuZCBtb3ZlIHRoZSA8YmFzZT4gYXJndW1lbnQgdG8gYC0tcHJlZml4PWJhc2UvYCkuCisKK0NyZWF0ZXMgYSB0YXIgYXJjaGl2ZSBjb250YWluaW5nIHRoZSB0cmVlIHN0cnVjdHVyZSBmb3IgdGhlIG5hbWVkIHRyZWUuCitXaGVuIDxiYXNlPiBpcyBzcGVjaWZpZWQgaXQgaXMgYWRkZWQgYXMgYSBsZWFkaW5nIHBhdGggdG8gdGhlIGZpbGVzIGluIHRoZQorZ2VuZXJhdGVkIHRhciBhcmNoaXZlLgorCitnaXQtdGFyLXRyZWUgYmVoYXZlcyBkaWZmZXJlbnRseSB3aGVuIGdpdmVuIGEgdHJlZSBJRCB2ZXJzdXMgd2hlbiBnaXZlbgorYSBjb21taXQgSUQgb3IgdGFnIElELiAgSW4gdGhlIGZpcnN0IGNhc2UgdGhlIGN1cnJlbnQgdGltZSBpcyB1c2VkIGFzCittb2RpZmljYXRpb24gdGltZSBvZiBlYWNoIGZpbGUgaW4gdGhlIGFyY2hpdmUuICBJbiB0aGUgbGF0dGVyIGNhc2UgdGhlCitjb21taXQgdGltZSBhcyByZWNvcmRlZCBpbiB0aGUgcmVmZXJlbmNlZCBjb21taXQgb2JqZWN0IGlzIHVzZWQgaW5zdGVhZC4KK0FkZGl0aW9uYWxseSB0aGUgY29tbWl0IElEIGlzIHN0b3JlZCBpbiBhIGdsb2JhbCBleHRlbmRlZCBwYXggaGVhZGVyLgorSXQgY2FuIGJlIGV4dHJhY3RlZCB1c2luZyBnaXQtZ2V0LXRhci1jb21taXQtaWQuCisKK09QVElPTlMKKy0tLS0tLS0KKworPHRyZWUtaXNoPjo6CisJVGhlIHRyZWUgb3IgY29tbWl0IHRvIHByb2R1Y2UgdGFyIGFyY2hpdmUgZm9yLiAgSWYgaXQgaXMKKwl0aGUgb2JqZWN0IG5hbWUgb2YgYSBjb21taXQgb2JqZWN0LgorCis8YmFzZT46OgorCUxlYWRpbmcgcGF0aCB0byB0aGUgZmlsZXMgaW4gdGhlIHJlc3VsdGluZyB0YXIgYXJjaGl2ZS4KKworLS1yZW1vdGU9PHJlcG8+OjoKKwlJbnN0ZWFkIG9mIG1ha2luZyBhIHRhciBhcmNoaXZlIGZyb20gbG9jYWwgcmVwb3NpdG9yeSwKKwlyZXRyaWV2ZSBhIHRhciBhcmNoaXZlIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeS4KKworQ09ORklHVVJBVElPTgorLS0tLS0tLS0tLS0tLQorCit0YXIudW1hc2s6OgorCVRoaXMgdmFyaWFibGUgY2FuIGJlIHVzZWQgdG8gcmVzdHJpY3QgdGhlIHBlcm1pc3Npb24gYml0cyBvZgorCXRhciBhcmNoaXZlIGVudHJpZXMuICBUaGUgZGVmYXVsdCBpcyAwMDAyLCB3aGljaCB0dXJucyBvZmYgdGhlCisJd29ybGQgd3JpdGUgYml0LiAgVGhlIHNwZWNpYWwgdmFsdWUgInVzZXIiIGluZGljYXRlcyB0aGF0IHRoZQorCWFyY2hpdmluZyB1c2VyJ3MgdW1hc2sgd2lsbCBiZSB1c2VkIGluc3RlYWQuICBTZWUgdW1hc2soMikgZm9yCisJZGV0YWlscy4KKworRVhBTVBMRVMKKy0tLS0tLS0tCitnaXQgdGFyLXRyZWUgSEVBRCBqdW5rIHwgKGNkIC92YXIvdG1wLyAmJiB0YXIgeGYgLSk6OgorCisJQ3JlYXRlIGEgdGFyIGFyY2hpdmUgdGhhdCBjb250YWlucyB0aGUgY29udGVudHMgb2YgdGhlCisJbGF0ZXN0IGNvbW1pdCBvbiB0aGUgY3VycmVudCBicmFuY2gsIGFuZCBleHRyYWN0cyBpdCBpbgorCWAvdmFyL3RtcC9qdW5rYCBkaXJlY3RvcnkuCisKK2dpdCB0YXItdHJlZSB2MS40LjAgZ2l0LTEuNC4wIHwgZ3ppcCA+Z2l0LTEuNC4wLnRhci5nejo6CisKKwlDcmVhdGUgYSB0YXJiYWxsIGZvciB2MS40LjAgcmVsZWFzZS4KKworZ2l0IHRhci10cmVlIHYxLjQuMHtjYXJldH1ce3RyZWVcfSBnaXQtMS40LjAgfCBnemlwID5naXQtMS40LjAudGFyLmd6OjoKKworCUNyZWF0ZSBhIHRhcmJhbGwgZm9yIHYxLjQuMCByZWxlYXNlLCBidXQgd2l0aG91dCBhCisJZ2xvYmFsIGV4dGVuZGVkIHBheCBoZWFkZXIuCisKK2dpdCB0YXItdHJlZSAtLXJlbW90ZT1leGFtcGxlLmNvbTpnaXQuZ2l0IHYxLjQuMCA+Z2l0LTEuNC4wLnRhcjo6CisKKwlHZXQgYSB0YXJiYWxsIHYxLjQuMCBmcm9tIGV4YW1wbGUuY29tLgorCitnaXQgdGFyLXRyZWUgSEVBRDpEb2N1bWVudGF0aW9uLyBnaXQtZG9jcyA+IGdpdC0xLjQuMC1kb2NzLnRhcjo6CisKKwlQdXQgZXZlcnl0aGluZyBpbiB0aGUgY3VycmVudCBoZWFkJ3MgRG9jdW1lbnRhdGlvbi8gZGlyZWN0b3J5CisJaW50byAnZ2l0LTEuNC4wLWRvY3MudGFyJywgd2l0aCB0aGUgcHJlZml4ICdnaXQtZG9jcy8nLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBSZW5lIFNjaGFyZmUuCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXRvb2xzLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXRvb2xzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTY0MDNjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdG9vbHMudHh0CkBAIC0wLDAgKzEsMTE4IEBACitBIHNob3J0IGdpdCB0b29scyBzdXJ2ZXkKKz09PT09PT09PT09PT09PT09PT09PT09PQorCisKK0ludHJvZHVjdGlvbgorLS0tLS0tLS0tLS0tCisKK0FwYXJ0IGZyb20gZ2l0IGNvbnRyaWIvIGFyZWEgdGhlcmUgYXJlIHNvbWUgb3RoZXJzIHRoaXJkLXBhcnR5IHRvb2xzCit5b3UgbWF5IHdhbnQgdG8gbG9vay4KKworVGhpcyBkb2N1bWVudCBwcmVzZW50cyBhIGJyaWVmIHN1bW1hcnkgb2YgZWFjaCB0b29sIGFuZCB0aGUgY29ycmVzcG9uZGluZworbGluay4KKworCitBbHRlcm5hdGl2ZS9BdWdtZW50YXRpdmUgUG9yY2VsYWlucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgLSAqQ29naXRvKiAoaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vY29naXRvLykKKworICAgQ29naXRvIGlzIGEgdmVyc2lvbiBjb250cm9sIHN5c3RlbSBsYXllcmVkIG9uIHRvcCBvZiB0aGUgZ2l0IHRyZWUgaGlzdG9yeQorICAgc3RvcmFnZSBzeXN0ZW0uIEl0IGFpbXMgYXQgc2VhbWxlc3MgdXNlciBpbnRlcmZhY2UgYW5kIGVhc2Ugb2YgdXNlLAorICAgcHJvdmlkaW5nIGdlbmVyYWxseSBzbW9vdGhlciB1c2VyIGV4cGVyaWVuY2UgdGhhbiB0aGUgInJhdyIgQ29yZSBHSVQKKyAgIGl0c2VsZiBhbmQgaW5kZWVkIG1hbnkgb3RoZXIgdmVyc2lvbiBjb250cm9sIHN5c3RlbXMuCisKKyAgIENvZ2l0byBpcyBubyBsb25nZXIgbWFpbnRhaW5lZCBhcyBtb3N0IG9mIGl0cyBmdW5jdGlvbmFsaXR5CisgICBpcyBub3cgaW4gY29yZSBHSVQuCisKKworICAgLSAqcGcqIChodHRwOi8vd3d3LnNwZWFyY2Uub3JnL2NhdGVnb3J5L3Byb2plY3RzL3NjbS9wZy8pCisKKyAgIHBnIGlzIGEgc2hlbGwgc2NyaXB0IHdyYXBwZXIgYXJvdW5kIEdJVCB0byBoZWxwIHRoZSB1c2VyIG1hbmFnZSBhIHNldCBvZgorICAgcGF0Y2hlcyB0byBmaWxlcy4gcGcgaXMgc29tZXdoYXQgbGlrZSBxdWlsdCBvciBTdEdJVCwgYnV0IGl0IGRvZXMgaGF2ZSBhCisgICBzbGlnaHRseSBkaWZmZXJlbnQgZmVhdHVyZSBzZXQuCisKKworICAgLSAqU3RHaXQqIChodHRwOi8vd3d3LnByb2NvZGUub3JnL3N0Z2l0LykKKworICAgU3RhY2tlZCBHSVQgcHJvdmlkZXMgYSBxdWlsdC1saWtlIHBhdGNoIG1hbmFnZW1lbnQgZnVuY3Rpb25hbGl0eSBpbiB0aGUKKyAgIEdJVCBlbnZpcm9ubWVudC4gWW91IGNhbiBlYXNpbHkgbWFuYWdlIHlvdXIgcGF0Y2hlcyBpbiB0aGUgc2NvcGUgb2YgR0lUCisgICB1bnRpbCB0aGV5IGdldCBtZXJnZWQgdXBzdHJlYW0uCisKKworSGlzdG9yeSBWaWV3ZXJzCistLS0tLS0tLS0tLS0tLS0KKworICAgLSAqZ2l0ayogKHNoaXBwZWQgd2l0aCBnaXQtY29yZSkKKworICAgZ2l0ayBpcyBhIHNpbXBsZSBUayBHVUkgZm9yIGJyb3dzaW5nIGhpc3Rvcnkgb2YgR0lUIHJlcG9zaXRvcmllcyBlYXNpbHkuCisKKworICAgLSAqZ2l0dmlldyogIChjb250cmliLykKKworICAgZ2l0dmlldyBpcyBhIEdUSyBiYXNlZCByZXBvc2l0b3J5IGJyb3dzZXIgZm9yIGdpdAorCisKKyAgIC0gKmdpdHdlYiogKHNoaXBwZWQgd2l0aCBnaXQtY29yZSkKKworICAgR0lUd2ViIHByb3ZpZGVzIGZ1bGwtZmxlZGdlZCB3ZWIgaW50ZXJmYWNlIGZvciBHSVQgcmVwb3NpdG9yaWVzLgorCisKKyAgIC0gKnFnaXQqIChodHRwOi8vZGlnaWxhbmRlci5saWJlcm8uaXQvbWNvc3RhbGJhLykKKworICAgUUdpdCBpcyBhIGdpdC9TdEdJVCBHVUkgdmlld2VyIGJ1aWx0IG9uIFF0L0MrKy4gUUdpdCBjb3VsZCBiZSB1c2VkCisgICB0byBicm93c2UgaGlzdG9yeSBhbmQgZGlyZWN0b3J5IHRyZWUsIHZpZXcgYW5ub3RhdGVkIGZpbGVzLCBjb21taXQKKyAgIGNoYW5nZXMgY2hlcnJ5IHBpY2tpbmcgc2luZ2xlIGZpbGVzIG9yIGFwcGx5aW5nIHBhdGNoZXMuCisgICBDdXJyZW50bHkgaXQgaXMgdGhlIGZhc3Rlc3QgYW5kIG1vc3QgZmVhdHVyZSByaWNoIGFtb25nIHRoZSBnaXQKKyAgIHZpZXdlcnMgYW5kIGNvbW1pdCB0b29scy4KKworICAgLSAqdGlnKiAoaHR0cDovL2pvbmFzLm5pdHJvLmRrL3RpZy8pCisKKyAgIHRpZyBieSBKb25hcyBGb25zZWNhIGlzIGEgc2ltcGxlIGdpdCByZXBvc2l0b3J5IGJyb3dzZXIKKyAgIHdyaXR0ZW4gdXNpbmcgbmN1cnNlcy4gQmFzaWNhbGx5LCBpdCBqdXN0IGFjdHMgYXMgYSBmcm9udC1lbmQKKyAgIGZvciBnaXQtbG9nIGFuZCBnaXQtc2hvdy9naXQtZGlmZi4gQWRkaXRpb25hbGx5LCB5b3UgY2FuIGFsc28KKyAgIHVzZSBpdCBhcyBhIHBhZ2VyIGZvciBnaXQgY29tbWFuZHMuCisKKworRm9yZWlnbiBTQ00gaW50ZXJmYWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgLSAqZ2l0LXN2biogKHNoaXBwZWQgd2l0aCBnaXQtY29yZSkKKworICAgZ2l0LXN2biBpcyBhIHNpbXBsZSBjb25kdWl0IGZvciBjaGFuZ2VzZXRzIGJldHdlZW4gYSBzaW5nbGUgU3VidmVyc2lvbgorICAgYnJhbmNoIGFuZCBnaXQuCisKKworICAgLSAqcXVpbHQyZ2l0IC8gZ2l0MnF1aWx0KiAoaHR0cDovL2hvbWUtdGoub3JnL3dpa2kvaW5kZXgucGhwL01pc2MpCisKKyAgIFRoZXNlIHV0aWxpdGllcyBjb252ZXJ0IHBhdGNoIHNlcmllcyBpbiBhIHF1aWx0IHJlcG9zaXRvcnkgYW5kIGNvbW1pdAorICAgc2VyaWVzIGluIGdpdCBiYWNrIGFuZCBmb3J0aC4KKworCisgICAtICpoZy10by1naXQqIChjb250cmliLykKKworICAgaGctdG8tZ2l0IGNvbnZlcnRzIGEgTWVyY3VyaWFsIHJlcG9zaXRvcnkgaW50byBhIGdpdCBvbmUsIGFuZAorICAgcHJlc2VydmVzIHRoZSBmdWxsIGJyYW5jaCBoaXN0b3J5IGluIHRoZSBwcm9jZXNzLiBoZy10by1naXQgY2FuCisgICBhbHNvIGJlIHVzZWQgaW4gYW4gaW5jcmVtZW50YWwgd2F5IHRvIGtlZXAgdGhlIGdpdCByZXBvc2l0b3J5CisgICBpbiBzeW5jIHdpdGggdGhlIG1hc3RlciBNZXJjdXJpYWwgcmVwb3NpdG9yeS4KKworCitPdGhlcnMKKy0tLS0tLQorCisgICAtICooaClnY3QqIChodHRwOi8vd3d3LmN5ZC5saXUuc2UvdXNlcnMvfmZyZWt1MDQ1L2djdC8pCisKKyAgIENvbW1pdCBUb29sIG9yIChoKWdjdCBpcyBhIEdVSSBlbmFibGVkIGNvbW1pdCB0b29sIGZvciBnaXQgYW5kCisgICBNZXJjdXJpYWwgKGhnKS4gSXQgYWxsb3dzIHRoZSB1c2VyIHRvIHZpZXcgZGlmZnMsIHNlbGVjdCB3aGljaCBmaWxlcworICAgdG8gY29tbWl0dGVkIChvciBpZ25vcmVkIC8gcmV2ZXJ0ZWQpIHdyaXRlIGNvbW1pdCBtZXNzYWdlcyBhbmQKKyAgIHBlcmZvcm0gdGhlIGNvbW1pdCBpdHNlbGYuCisKKyAgIC0gKmdpdC5lbCogKGNvbnRyaWIvKQorCisgICBUaGlzIGlzIGFuIEVtYWNzIGludGVyZmFjZSBmb3IgZ2l0LiBUaGUgdXNlciBpbnRlcmZhY2UgaXMgbW9kZWxlZCBvbgorICAgcGNsLWN2cy4gSXQgaGFzIGJlZW4gZGV2ZWxvcGVkIG9uIEVtYWNzIDIxIGFuZCB3aWxsIHByb2JhYmx5IG5lZWQgc29tZQorICAgdHdlYWtpbmcgdG8gd29yayBvbiBYRW1hY3MuCisKKworaHR0cDovL2dpdC5vci5jei9naXR3aWtpL0ludGVyZmFjZXNGcm9udGVuZHNBbmRUb29scyBoYXMgbW9yZQorY29tcHJlaGVuc2l2ZSBsaXN0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtdW5wYWNrLWZpbGUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtdW5wYWNrLWZpbGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NjRkMTMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC11bnBhY2stZmlsZS50eHQKQEAgLTAsMCArMSwzNSBAQAorZ2l0LXVucGFjay1maWxlKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXVucGFjay1maWxlIC0gQ3JlYXRlcyBhIHRlbXBvcmFyeSBmaWxlIHdpdGggYSBibG9iJ3MgY29udGVudHMKKworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC11bnBhY2stZmlsZScgPGJsb2I+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQ3JlYXRlcyBhIGZpbGUgaG9sZGluZyB0aGUgY29udGVudHMgb2YgdGhlIGJsb2Igc3BlY2lmaWVkIGJ5IHNoYTEuIEl0CityZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKwkubWVyZ2VfZmlsZV9YWFhYWAorCitPUFRJT05TCistLS0tLS0tCis8YmxvYj46OgorCU11c3QgYmUgYSBibG9iIGlkCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtdW5wYWNrLW9iamVjdHMudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtdW5wYWNrLW9iamVjdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OWJlM2YKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC11bnBhY2stb2JqZWN0cy50eHQKQEAgLTAsMCArMSw1NCBAQAorZ2l0LXVucGFjay1vYmplY3RzKDEpCis9PT09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXVucGFjay1vYmplY3RzIC0gVW5wYWNrIG9iamVjdHMgZnJvbSBhIHBhY2tlZCBhcmNoaXZlCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXVucGFjay1vYmplY3RzJyBbLW5dIFstcV0gWy1yXSA8cGFjay1maWxlCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitSZWFkIGEgcGFja2VkIGFyY2hpdmUgKC5wYWNrKSBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dCwgZXhwYW5kaW5nCit0aGUgb2JqZWN0cyBjb250YWluZWQgd2l0aGluIGFuZCB3cml0aW5nIHRoZW0gaW50byB0aGUgcmVwb3NpdG9yeSBpbgorImxvb3NlIiAob25lIG9iamVjdCBwZXIgZmlsZSkgZm9ybWF0LgorCitPYmplY3RzIHRoYXQgYWxyZWFkeSBleGlzdCBpbiB0aGUgcmVwb3NpdG9yeSB3aWxsICpub3QqIGJlIHVucGFja2VkCitmcm9tIHRoZSBwYWNrLWZpbGUuICBUaGVyZWZvcmUsIG5vdGhpbmcgd2lsbCBiZSB1bnBhY2tlZCBpZiB5b3UgdXNlCit0aGlzIGNvbW1hbmQgb24gYSBwYWNrLWZpbGUgdGhhdCBleGlzdHMgd2l0aGluIHRoZSB0YXJnZXQgcmVwb3NpdG9yeS4KKworUGxlYXNlIHNlZSB0aGUgYGdpdC1yZXBhY2tgIGRvY3VtZW50YXRpb24gZm9yIG9wdGlvbnMgdG8gZ2VuZXJhdGUKK25ldyBwYWNrcyBhbmQgcmVwbGFjZSBleGlzdGluZyBvbmVzLgorCitPUFRJT05TCistLS0tLS0tCistbjo6CisgICAgICAgIERyeSBydW4uICBDaGVjayB0aGUgcGFjayBmaWxlIHdpdGhvdXQgYWN0dWFsbHkgdW5wYWNraW5nCisJdGhlIG9iamVjdHMuCisKKy1xOjoKKwlUaGUgY29tbWFuZCB1c3VhbGx5IHNob3dzIHBlcmNlbnRhZ2UgcHJvZ3Jlc3MuICBUaGlzCisJZmxhZyBzdXBwcmVzc2VzIGl0LgorCistcjo6CisJV2hlbiB1bnBhY2tpbmcgYSBjb3JydXB0IHBhY2tmaWxlLCB0aGUgY29tbWFuZCBkaWVzIGF0CisJdGhlIGZpcnN0IGNvcnJ1cHRpb24uICBUaGlzIGZsYWcgdGVsbHMgaXQgdG8ga2VlcCBnb2luZworCWFuZCBtYWtlIHRoZSBiZXN0IGVmZm9ydCB0byByZWNvdmVyIGFzIG1hbnkgb2JqZWN0cyBhcworCXBvc3NpYmxlLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXVwZGF0ZS1pbmRleC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC11cGRhdGUtaW5kZXgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YmUxOGUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC11cGRhdGUtaW5kZXgudHh0CkBAIC0wLDAgKzEsMzI2IEBACitnaXQtdXBkYXRlLWluZGV4KDEpCis9PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC11cGRhdGUtaW5kZXggLSBSZWdpc3RlciBmaWxlIGNvbnRlbnRzIGluIHRoZSB3b3JraW5nIHRyZWUgdG8gdGhlIGluZGV4CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LXVwZGF0ZS1pbmRleCcKKwkgICAgIFstLWFkZF0gWy0tcmVtb3ZlIHwgLS1mb3JjZS1yZW1vdmVdIFstLXJlcGxhY2VdCisJICAgICBbLS1yZWZyZXNoXSBbLXFdIFstLXVubWVyZ2VkXSBbLS1pZ25vcmUtbWlzc2luZ10KKwkgICAgIFstLWNhY2hlaW5mbyA8bW9kZT4gPG9iamVjdD4gPGZpbGU+XVwqCisJICAgICBbLS1jaG1vZD0oK3wtKXhdCisJICAgICBbLS1hc3N1bWUtdW5jaGFuZ2VkIHwgLS1uby1hc3N1bWUtdW5jaGFuZ2VkXQorCSAgICAgWy0tcmVhbGx5LXJlZnJlc2hdIFstLXVucmVzb2x2ZV0gWy0tYWdhaW4gfCAtZ10KKwkgICAgIFstLWluZm8tb25seV0gWy0taW5kZXgtaW5mb10KKwkgICAgIFstel0gWy0tc3RkaW5dCisJICAgICBbLS12ZXJib3NlXQorCSAgICAgWy0tXSBbPGZpbGU+XVwqCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorTW9kaWZpZXMgdGhlIGluZGV4IG9yIGRpcmVjdG9yeSBjYWNoZS4gRWFjaCBmaWxlIG1lbnRpb25lZCBpcyB1cGRhdGVkCitpbnRvIHRoZSBpbmRleCBhbmQgYW55ICd1bm1lcmdlZCcgb3IgJ25lZWRzIHVwZGF0aW5nJyBzdGF0ZSBpcworY2xlYXJlZC4KKworU2VlIGFsc28gbGlua2dpdDpnaXQtYWRkWzFdIGZvciBhIG1vcmUgdXNlci1mcmllbmRseSB3YXkgdG8gZG8gc29tZSBvZgordGhlIG1vc3QgY29tbW9uIG9wZXJhdGlvbnMgb24gdGhlIGluZGV4LgorCitUaGUgd2F5ICJnaXQtdXBkYXRlLWluZGV4IiBoYW5kbGVzIGZpbGVzIGl0IGlzIHRvbGQgYWJvdXQgY2FuIGJlIG1vZGlmaWVkCit1c2luZyB0aGUgdmFyaW91cyBvcHRpb25zOgorCitPUFRJT05TCistLS0tLS0tCistLWFkZDo6CisJSWYgYSBzcGVjaWZpZWQgZmlsZSBpc24ndCBpbiB0aGUgaW5kZXggYWxyZWFkeSB0aGVuIGl0J3MKKwlhZGRlZC4KKwlEZWZhdWx0IGJlaGF2aW91ciBpcyB0byBpZ25vcmUgbmV3IGZpbGVzLgorCistLXJlbW92ZTo6CisJSWYgYSBzcGVjaWZpZWQgZmlsZSBpcyBpbiB0aGUgaW5kZXggYnV0IGlzIG1pc3NpbmcgdGhlbiBpdCdzCisJcmVtb3ZlZC4KKwlEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGlnbm9yZSByZW1vdmVkIGZpbGUuCisKKy0tcmVmcmVzaDo6CisJTG9va3MgYXQgdGhlIGN1cnJlbnQgaW5kZXggYW5kIGNoZWNrcyB0byBzZWUgaWYgbWVyZ2VzIG9yCisJdXBkYXRlcyBhcmUgbmVlZGVkIGJ5IGNoZWNraW5nIHN0YXQoKSBpbmZvcm1hdGlvbi4KKworLXE6OgorICAgICAgICBRdWlldC4gIElmIC0tcmVmcmVzaCBmaW5kcyB0aGF0IHRoZSBpbmRleCBuZWVkcyBhbiB1cGRhdGUsIHRoZQorICAgICAgICBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGVycm9yIG91dC4gIFRoaXMgb3B0aW9uIG1ha2VzCisgICAgICAgIGdpdC11cGRhdGUtaW5kZXggY29udGludWUgYW55d2F5LgorCistLXVubWVyZ2VkOjoKKyAgICAgICAgSWYgLS1yZWZyZXNoIGZpbmRzIHVubWVyZ2VkIGNoYW5nZXMgaW4gdGhlIGluZGV4LCB0aGUgZGVmYXVsdAorICAgICAgICBiZWhhdmlvciBpcyB0byBlcnJvciBvdXQuICBUaGlzIG9wdGlvbiBtYWtlcyBnaXQtdXBkYXRlLWluZGV4CisgICAgICAgIGNvbnRpbnVlIGFueXdheS4KKworLS1pZ25vcmUtbWlzc2luZzo6CisJSWdub3JlcyBtaXNzaW5nIGZpbGVzIGR1cmluZyBhIC0tcmVmcmVzaAorCistLWNhY2hlaW5mbyA8bW9kZT4gPG9iamVjdD4gPHBhdGg+OjoKKwlEaXJlY3RseSBpbnNlcnQgdGhlIHNwZWNpZmllZCBpbmZvIGludG8gdGhlIGluZGV4LgorCistLWluZGV4LWluZm86OgorICAgICAgICBSZWFkIGluZGV4IGluZm9ybWF0aW9uIGZyb20gc3RkaW4uCisKKy0tY2htb2Q9KCt8LSl4OjoKKyAgICAgICAgU2V0IHRoZSBleGVjdXRlIHBlcm1pc3Npb25zIG9uIHRoZSB1cGRhdGVkIGZpbGVzLgorCistLWFzc3VtZS11bmNoYW5nZWQsIC0tbm8tYXNzdW1lLXVuY2hhbmdlZDo6CisJV2hlbiB0aGVzZSBmbGFncyBhcmUgc3BlY2lmaWVkLCB0aGUgb2JqZWN0IG5hbWUgcmVjb3JkZWQKKwlmb3IgdGhlIHBhdGhzIGFyZSBub3QgdXBkYXRlZC4gIEluc3RlYWQsIHRoZXNlIG9wdGlvbnMKKwlzZXRzIGFuZCB1bnNldHMgdGhlICJhc3N1bWUgdW5jaGFuZ2VkIiBiaXQgZm9yIHRoZQorCXBhdGhzLiAgV2hlbiB0aGUgImFzc3VtZSB1bmNoYW5nZWQiIGJpdCBpcyBvbiwgZ2l0IHN0b3BzCisJY2hlY2tpbmcgdGhlIHdvcmtpbmcgdHJlZSBmaWxlcyBmb3IgcG9zc2libGUKKwltb2RpZmljYXRpb25zLCBzbyB5b3UgbmVlZCB0byBtYW51YWxseSB1bnNldCB0aGUgYml0IHRvCisJdGVsbCBnaXQgd2hlbiB5b3UgY2hhbmdlIHRoZSB3b3JraW5nIHRyZWUgZmlsZS4gVGhpcyBpcworCXNvbWV0aW1lcyBoZWxwZnVsIHdoZW4gd29ya2luZyB3aXRoIGEgYmlnIHByb2plY3Qgb24gYQorCWZpbGVzeXN0ZW0gdGhhdCBoYXMgdmVyeSBzbG93IGxzdGF0KDIpIHN5c3RlbSBjYWxsCisJKGUuZy4gY2lmcykuCisKKy0tYWdhaW4sIC1nOjoKKwlSdW5zIGBnaXQtdXBkYXRlLWluZGV4YCBpdHNlbGYgb24gdGhlIHBhdGhzIHdob3NlIGluZGV4CisJZW50cmllcyBhcmUgZGlmZmVyZW50IGZyb20gdGhvc2UgZnJvbSB0aGUgYEhFQURgIGNvbW1pdC4KKworLS11bnJlc29sdmU6OgorCVJlc3RvcmVzIHRoZSAndW5tZXJnZWQnIG9yICduZWVkcyB1cGRhdGluZycgc3RhdGUgb2YgYQorCWZpbGUgZHVyaW5nIGEgbWVyZ2UgaWYgaXQgd2FzIGNsZWFyZWQgYnkgYWNjaWRlbnQuCisKKy0taW5mby1vbmx5OjoKKwlEbyBub3QgY3JlYXRlIG9iamVjdHMgaW4gdGhlIG9iamVjdCBkYXRhYmFzZSBmb3IgYWxsCisJPGZpbGU+IGFyZ3VtZW50cyB0aGF0IGZvbGxvdyB0aGlzIGZsYWc7IGp1c3QgaW5zZXJ0CisJdGhlaXIgb2JqZWN0IElEcyBpbnRvIHRoZSBpbmRleC4KKworLS1mb3JjZS1yZW1vdmU6OgorCVJlbW92ZSB0aGUgZmlsZSBmcm9tIHRoZSBpbmRleCBldmVuIHdoZW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5CisJc3RpbGwgaGFzIHN1Y2ggYSBmaWxlLiAoSW1wbGllcyAtLXJlbW92ZS4pCisKKy0tcmVwbGFjZTo6CisJQnkgZGVmYXVsdCwgd2hlbiBhIGZpbGUgYHBhdGhgIGV4aXN0cyBpbiB0aGUgaW5kZXgsCisJZ2l0LXVwZGF0ZS1pbmRleCByZWZ1c2VzIGFuIGF0dGVtcHQgdG8gYWRkIGBwYXRoL2ZpbGVgLgorCVNpbWlsYXJseSBpZiBhIGZpbGUgYHBhdGgvZmlsZWAgZXhpc3RzLCBhIGZpbGUgYHBhdGhgCisJY2Fubm90IGJlIGFkZGVkLiAgV2l0aCAtLXJlcGxhY2UgZmxhZywgZXhpc3RpbmcgZW50cmllcworCXRoYXQgY29uZmxpY3RzIHdpdGggdGhlIGVudHJ5IGJlaW5nIGFkZGVkIGFyZQorCWF1dG9tYXRpY2FsbHkgcmVtb3ZlZCB3aXRoIHdhcm5pbmcgbWVzc2FnZXMuCisKKy0tc3RkaW46OgorCUluc3RlYWQgb2YgdGFraW5nIGxpc3Qgb2YgcGF0aHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLAorCXJlYWQgbGlzdCBvZiBwYXRocyBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dC4gIFBhdGhzIGFyZQorCXNlcGFyYXRlZCBieSBMRiAoaS5lLiBvbmUgcGF0aCBwZXIgbGluZSkgYnkgZGVmYXVsdC4KKworLS12ZXJib3NlOjoKKyAgICAgICAgUmVwb3J0IHdoYXQgaXMgYmVpbmcgYWRkZWQgYW5kIHJlbW92ZWQgZnJvbSBpbmRleC4KKworLXo6OgorCU9ubHkgbWVhbmluZ2Z1bCB3aXRoIGAtLXN0ZGluYDsgcGF0aHMgYXJlIHNlcGFyYXRlZCB3aXRoCisJTlVMIGNoYXJhY3RlciBpbnN0ZWFkIG9mIExGLgorCitcLS06OgorCURvIG5vdCBpbnRlcnByZXQgYW55IG1vcmUgYXJndW1lbnRzIGFzIG9wdGlvbnMuCisKKzxmaWxlPjo6CisJRmlsZXMgdG8gYWN0IG9uLgorCU5vdGUgdGhhdCBmaWxlcyBiZWdpbm5pbmcgd2l0aCAnLicgYXJlIGRpc2NhcmRlZC4gVGhpcyBpbmNsdWRlcworCWAuL2ZpbGVgIGFuZCBgZGlyLy4vZmlsZWAuIElmIHlvdSBkb24ndCB3YW50IHRoaXMsIHRoZW4gdXNlCisJY2xlYW5lciBuYW1lcy4KKwlUaGUgc2FtZSBhcHBsaWVzIHRvIGRpcmVjdG9yaWVzIGVuZGluZyAnLycgYW5kIHBhdGhzIHdpdGggJy8vJworCitVc2luZyAtLXJlZnJlc2gKKy0tLS0tLS0tLS0tLS0tLQorJy0tcmVmcmVzaCcgZG9lcyBub3QgY2FsY3VsYXRlIGEgbmV3IHNoYTEgZmlsZSBvciBicmluZyB0aGUgaW5kZXgKK3VwLXRvLWRhdGUgZm9yIG1vZGUvY29udGVudCBjaGFuZ2VzLiBCdXQgd2hhdCBpdCAqZG9lcyogZG8gaXMgdG8KKyJyZS1tYXRjaCIgdGhlIHN0YXQgaW5mb3JtYXRpb24gb2YgYSBmaWxlIHdpdGggdGhlIGluZGV4LCBzbyB0aGF0IHlvdQorY2FuIHJlZnJlc2ggdGhlIGluZGV4IGZvciBhIGZpbGUgdGhhdCBoYXNuJ3QgYmVlbiBjaGFuZ2VkIGJ1dCB3aGVyZQordGhlIHN0YXQgZW50cnkgaXMgb3V0IG9mIGRhdGUuCisKK0ZvciBleGFtcGxlLCB5b3UnZCB3YW50IHRvIGRvIHRoaXMgYWZ0ZXIgZG9pbmcgYSAiZ2l0LXJlYWQtdHJlZSIsIHRvIGxpbmsKK3VwIHRoZSBzdGF0IGluZGV4IGRldGFpbHMgd2l0aCB0aGUgcHJvcGVyIGZpbGVzLgorCitVc2luZyAtLWNhY2hlaW5mbyBvciAtLWluZm8tb25seQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyctLWNhY2hlaW5mbycgaXMgdXNlZCB0byByZWdpc3RlciBhIGZpbGUgdGhhdCBpcyBub3QgaW4gdGhlCitjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAgVGhpcyBpcyB1c2VmdWwgZm9yIG1pbmltdW0tY2hlY2tvdXQKK21lcmdpbmcuCisKK1RvIHByZXRlbmQgeW91IGhhdmUgYSBmaWxlIHdpdGggbW9kZSBhbmQgc2hhMSBhdCBwYXRoLCBzYXk6CisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LXVwZGF0ZS1pbmRleCAtLWNhY2hlaW5mbyBtb2RlIHNoYTEgcGF0aAorLS0tLS0tLS0tLS0tLS0tLQorCisnLS1pbmZvLW9ubHknIGlzIHVzZWQgdG8gcmVnaXN0ZXIgZmlsZXMgd2l0aG91dCBwbGFjaW5nIHRoZW0gaW4gdGhlIG9iamVjdAorZGF0YWJhc2UuICBUaGlzIGlzIHVzZWZ1bCBmb3Igc3RhdHVzLW9ubHkgcmVwb3NpdG9yaWVzLgorCitCb3RoICctLWNhY2hlaW5mbycgYW5kICctLWluZm8tb25seScgYmVoYXZlIHNpbWlsYXJseTogdGhlIGluZGV4IGlzIHVwZGF0ZWQKK2J1dCB0aGUgb2JqZWN0IGRhdGFiYXNlIGlzbid0LiAgJy0tY2FjaGVpbmZvJyBpcyB1c2VmdWwgd2hlbiB0aGUgb2JqZWN0IGlzCitpbiB0aGUgZGF0YWJhc2UgYnV0IHRoZSBmaWxlIGlzbid0IGF2YWlsYWJsZSBsb2NhbGx5LiAgJy0taW5mby1vbmx5JyBpcwordXNlZnVsIHdoZW4gdGhlIGZpbGUgaXMgYXZhaWxhYmxlLCBidXQgeW91IGRvIG5vdCB3aXNoIHRvIHVwZGF0ZSB0aGUKK29iamVjdCBkYXRhYmFzZS4KKworCitVc2luZyAtLWluZGV4LWluZm8KKy0tLS0tLS0tLS0tLS0tLS0tLQorCitgLS1pbmRleC1pbmZvYCBpcyBhIG1vcmUgcG93ZXJmdWwgbWVjaGFuaXNtIHRoYXQgbGV0cyB5b3UgZmVlZAorbXVsdGlwbGUgZW50cnkgZGVmaW5pdGlvbnMgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQsIGFuZCBkZXNpZ25lZAorc3BlY2lmaWNhbGx5IGZvciBzY3JpcHRzLiAgSXQgY2FuIHRha2UgaW5wdXRzIG9mIHRocmVlIGZvcm1hdHM6CisKKyAgICAuIG1vZGUgICAgICAgICBTUCBzaGExICAgICAgICAgIFRBQiBwYXRoCisrCitUaGUgZmlyc3QgZm9ybWF0IGlzIHdoYXQgImdpdC1hcHBseSAtLWluZGV4LWluZm8iCityZXBvcnRzLCBhbmQgdXNlZCB0byByZWNvbnN0cnVjdCBhIHBhcnRpYWwgdHJlZQordGhhdCBpcyB1c2VkIGZvciBwaG9ueSBtZXJnZSBiYXNlIHRyZWUgd2hlbiBmYWxsaW5nCitiYWNrIG9uIDMtd2F5IG1lcmdlLgorCisgICAgLiBtb2RlIFNQIHR5cGUgU1Agc2hhMSAgICAgICAgICBUQUIgcGF0aAorKworVGhlIHNlY29uZCBmb3JtYXQgaXMgdG8gc3R1ZmYgZ2l0LWxzLXRyZWUgb3V0cHV0CitpbnRvIHRoZSBpbmRleCBmaWxlLgorCisgICAgLiBtb2RlICAgICAgICAgU1Agc2hhMSBTUCBzdGFnZSBUQUIgcGF0aAorKworVGhpcyBmb3JtYXQgaXMgdG8gcHV0IGhpZ2hlciBvcmRlciBzdGFnZXMgaW50byB0aGUKK2luZGV4IGZpbGUgYW5kIG1hdGNoZXMgZ2l0LWxzLWZpbGVzIC0tc3RhZ2Ugb3V0cHV0LgorCitUbyBwbGFjZSBhIGhpZ2hlciBzdGFnZSBlbnRyeSB0byB0aGUgaW5kZXgsIHRoZSBwYXRoIHNob3VsZAorZmlyc3QgYmUgcmVtb3ZlZCBieSBmZWVkaW5nIGEgbW9kZT0wIGVudHJ5IGZvciB0aGUgcGF0aCwgYW5kCit0aGVuIGZlZWRpbmcgbmVjZXNzYXJ5IGlucHV0IGxpbmVzIGluIHRoZSB0aGlyZCBmb3JtYXQuCisKK0ZvciBleGFtcGxlLCBzdGFydGluZyB3aXRoIHRoaXMgaW5kZXg6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgbHMtZmlsZXMgLXMKKzEwMDY0NCA4YTEyMThhMTAyNGEyMTJiYjNkYjMwYmVjZDg2MDMxNWY5ZjNhYzUyIDAgICAgICAgZnJvdHoKKy0tLS0tLS0tLS0tLQorCit5b3UgY2FuIGZlZWQgdGhlIGZvbGxvd2luZyBpbnB1dCB0byBgLS1pbmRleC1pbmZvYDoKKworLS0tLS0tLS0tLS0tCiskIGdpdCB1cGRhdGUtaW5kZXggLS1pbmRleC1pbmZvCiswIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAJZnJvdHoKKzEwMDY0NCA4YTEyMThhMTAyNGEyMTJiYjNkYjMwYmVjZDg2MDMxNWY5ZjNhYzUyIDEJZnJvdHoKKzEwMDc1NSA4YTEyMThhMTAyNGEyMTJiYjNkYjMwYmVjZDg2MDMxNWY5ZjNhYzUyIDIJZnJvdHoKKy0tLS0tLS0tLS0tLQorCitUaGUgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmVlZHMgMCBhcyB0aGUgbW9kZSB0byByZW1vdmUgdGhlCitwYXRoOyB0aGUgU0hBMSBkb2VzIG5vdCBtYXR0ZXIgYXMgbG9uZyBhcyBpdCBpcyB3ZWxsIGZvcm1hdHRlZC4KK1RoZW4gdGhlIHNlY29uZCBhbmQgdGhpcmQgbGluZSBmZWVkcyBzdGFnZSAxIGFuZCBzdGFnZSAyIGVudHJpZXMKK2ZvciB0aGF0IHBhdGguICBBZnRlciB0aGUgYWJvdmUsIHdlIHdvdWxkIGVuZCB1cCB3aXRoIHRoaXM6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgbHMtZmlsZXMgLXMKKzEwMDY0NCA4YTEyMThhMTAyNGEyMTJiYjNkYjMwYmVjZDg2MDMxNWY5ZjNhYzUyIDEJZnJvdHoKKzEwMDc1NSA4YTEyMThhMTAyNGEyMTJiYjNkYjMwYmVjZDg2MDMxNWY5ZjNhYzUyIDIJZnJvdHoKKy0tLS0tLS0tLS0tLQorCisKK1VzaW5nIGBgYXNzdW1lIHVuY2hhbmdlZCcnIGJpdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01hbnkgb3BlcmF0aW9ucyBpbiBnaXQgZGVwZW5kIG9uIHlvdXIgZmlsZXN5c3RlbSB0byBoYXZlIGFuCitlZmZpY2llbnQgYGxzdGF0KDIpYCBpbXBsZW1lbnRhdGlvbiwgc28gdGhhdCBgc3RfbXRpbWVgCitpbmZvcm1hdGlvbiBmb3Igd29ya2luZyB0cmVlIGZpbGVzIGNhbiBiZSBjaGVhcGx5IGNoZWNrZWQgdG8gc2VlCitpZiB0aGUgZmlsZSBjb250ZW50cyBoYXZlIGNoYW5nZWQgZnJvbSB0aGUgdmVyc2lvbiByZWNvcmRlZCBpbgordGhlIGluZGV4IGZpbGUuICBVbmZvcnR1bmF0ZWx5LCBzb21lIGZpbGVzeXN0ZW1zIGhhdmUKK2luZWZmaWNpZW50IGBsc3RhdCgyKWAuICBJZiB5b3VyIGZpbGVzeXN0ZW0gaXMgb25lIG9mIHRoZW0sIHlvdQorY2FuIHNldCAiYXNzdW1lIHVuY2hhbmdlZCIgYml0IHRvIHBhdGhzIHlvdSBoYXZlIG5vdCBjaGFuZ2VkIHRvCitjYXVzZSBnaXQgbm90IHRvIGRvIHRoaXMgY2hlY2suICBOb3RlIHRoYXQgc2V0dGluZyB0aGlzIGJpdCBvbiBhCitwYXRoIGRvZXMgbm90IG1lYW4gZ2l0IHdpbGwgY2hlY2sgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIHRvCitzZWUgaWYgaXQgaGFzIGNoYW5nZWQgLS0gaXQgbWFrZXMgZ2l0IHRvIG9taXQgYW55IGNoZWNraW5nIGFuZAorYXNzdW1lIGl0IGhhcyAqbm90KiBjaGFuZ2VkLiAgV2hlbiB5b3UgbWFrZSBjaGFuZ2VzIHRvIHdvcmtpbmcKK3RyZWUgZmlsZXMsIHlvdSBoYXZlIHRvIGV4cGxpY2l0bHkgdGVsbCBnaXQgYWJvdXQgaXQgYnkgZHJvcHBpbmcKKyJhc3N1bWUgdW5jaGFuZ2VkIiBiaXQsIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgeW91IG1vZGlmeSB0aGVtLgorCitJbiBvcmRlciB0byBzZXQgImFzc3VtZSB1bmNoYW5nZWQiIGJpdCwgdXNlIGAtLWFzc3VtZS11bmNoYW5nZWRgCitvcHRpb24uICBUbyB1bnNldCwgdXNlIGAtLW5vLWFzc3VtZS11bmNoYW5nZWRgLgorCitUaGUgY29tbWFuZCBsb29rcyBhdCBgY29yZS5pZ25vcmVzdGF0YCBjb25maWd1cmF0aW9uIHZhcmlhYmxlLiAgV2hlbgordGhpcyBpcyB0cnVlLCBwYXRocyB1cGRhdGVkIHdpdGggYGdpdC11cGRhdGUtaW5kZXggcGF0aHMuLi5gIGFuZAorcGF0aHMgdXBkYXRlZCB3aXRoIG90aGVyIGdpdCBjb21tYW5kcyB0aGF0IHVwZGF0ZSBib3RoIGluZGV4IGFuZAord29ya2luZyB0cmVlIChlLmcuIGBnaXQtYXBwbHkgLS1pbmRleGAsIGBnaXQtY2hlY2tvdXQtaW5kZXggLXVgLAorYW5kIGBnaXQtcmVhZC10cmVlIC11YCkgYXJlIGF1dG9tYXRpY2FsbHkgbWFya2VkIGFzICJhc3N1bWUKK3VuY2hhbmdlZCIuICBOb3RlIHRoYXQgImFzc3VtZSB1bmNoYW5nZWQiIGJpdCBpcyAqbm90KiBzZXQgaWYKK2BnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaGAgZmluZHMgdGhlIHdvcmtpbmcgdHJlZSBmaWxlIG1hdGNoZXMKK3RoZSBpbmRleCAodXNlIGBnaXQtdXBkYXRlLWluZGV4IC0tcmVhbGx5LXJlZnJlc2hgIGlmIHlvdSB3YW50Cit0byBtYXJrIHRoZW0gYXMgImFzc3VtZSB1bmNoYW5nZWQiKS4KKworCitFeGFtcGxlcworLS0tLS0tLS0KK1RvIHVwZGF0ZSBhbmQgcmVmcmVzaCBvbmx5IHRoZSBmaWxlcyBhbHJlYWR5IGNoZWNrZWQgb3V0OgorCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1jaGVja291dC1pbmRleCAtbiAtZiAtYSAmJiBnaXQtdXBkYXRlLWluZGV4IC0taWdub3JlLW1pc3NpbmcgLS1yZWZyZXNoCistLS0tLS0tLS0tLS0tLS0tCisKK09uIGFuIGluZWZmaWNpZW50IGZpbGVzeXN0ZW0gd2l0aCBgY29yZS5pZ25vcmVzdGF0YCBzZXQ6OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCB1cGRhdGUtaW5kZXggLS1yZWFsbHktcmVmcmVzaCAgICAgICAgICAgICAgPDE+CiskIGdpdCB1cGRhdGUtaW5kZXggLS1uby1hc3N1bWUtdW5jaGFuZ2VkIGZvby5jICAgPDI+CiskIGdpdCBkaWZmIC0tbmFtZS1vbmx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgPDM+CiskIGVkaXQgZm9vLmMKKyQgZ2l0IGRpZmYgLS1uYW1lLW9ubHkgICAgICAgICAgICAgICAgICAgICAgICAgICA8ND4KK00gZm9vLmMKKyQgZ2l0IHVwZGF0ZS1pbmRleCBmb28uYyAgICAgICAgICAgICAgICAgICAgICAgICA8NT4KKyQgZ2l0IGRpZmYgLS1uYW1lLW9ubHkgICAgICAgICAgICAgICAgICAgICAgICAgICA8Nj4KKyQgZWRpdCBmb28uYworJCBnaXQgZGlmZiAtLW5hbWUtb25seSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw3PgorJCBnaXQgdXBkYXRlLWluZGV4IC0tbm8tYXNzdW1lLXVuY2hhbmdlZCBmb28uYyAgIDw4PgorJCBnaXQgZGlmZiAtLW5hbWUtb25seSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw5PgorTSBmb28uYworLS0tLS0tLS0tLS0tCisrCis8MT4gZm9yY2VzIGxzdGF0KDIpIHRvIHNldCAiYXNzdW1lIHVuY2hhbmdlZCIgYml0cyBmb3IgcGF0aHMgdGhhdCBtYXRjaCBpbmRleC4KKzwyPiBtYXJrIHRoZSBwYXRoIHRvIGJlIGVkaXRlZC4KKzwzPiB0aGlzIGRvZXMgbHN0YXQoMikgYW5kIGZpbmRzIGluZGV4IG1hdGNoZXMgdGhlIHBhdGguCis8ND4gdGhpcyBkb2VzIGxzdGF0KDIpIGFuZCBmaW5kcyBpbmRleCBkb2VzICpub3QqIG1hdGNoIHRoZSBwYXRoLgorPDU+IHJlZ2lzdGVyaW5nIHRoZSBuZXcgdmVyc2lvbiB0byBpbmRleCBzZXRzICJhc3N1bWUgdW5jaGFuZ2VkIiBiaXQuCis8Nj4gYW5kIGl0IGlzIGFzc3VtZWQgdW5jaGFuZ2VkLgorPDc+IGV2ZW4gYWZ0ZXIgeW91IGVkaXQgaXQuCis8OD4geW91IGNhbiB0ZWxsIGFib3V0IHRoZSBjaGFuZ2UgYWZ0ZXIgdGhlIGZhY3QuCis8OT4gbm93IGl0IGNoZWNrcyB3aXRoIGxzdGF0KDIpIGFuZCBmaW5kcyBpdCBoYXMgYmVlbiBjaGFuZ2VkLgorCisKK0NvbmZpZ3VyYXRpb24KKy0tLS0tLS0tLS0tLS0KKworVGhlIGNvbW1hbmQgaG9ub3JzIGBjb3JlLmZpbGVtb2RlYCBjb25maWd1cmF0aW9uIHZhcmlhYmxlLiAgSWYKK3lvdXIgcmVwb3NpdG9yeSBpcyBvbiBhbiBmaWxlc3lzdGVtIHdob3NlIGV4ZWN1dGFibGUgYml0cyBhcmUKK3VucmVsaWFibGUsIHRoaXMgc2hvdWxkIGJlIHNldCB0byAnZmFsc2UnIChzZWUgbGlua2dpdDpnaXQtY29uZmlnWzFdKS4KK1RoaXMgY2F1c2VzIHRoZSBjb21tYW5kIHRvIGlnbm9yZSBkaWZmZXJlbmNlcyBpbiBmaWxlIG1vZGVzIHJlY29yZGVkCitpbiB0aGUgaW5kZXggYW5kIHRoZSBmaWxlIG1vZGUgb24gdGhlIGZpbGVzeXN0ZW0gaWYgdGhleSBkaWZmZXIgb25seSBvbgorZXhlY3V0YWJsZSBiaXQuICAgT24gc3VjaCBhbiB1bmZvcnR1bmF0ZSBmaWxlc3lzdGVtLCB5b3UgbWF5CituZWVkIHRvIHVzZSBgZ2l0LXVwZGF0ZS1pbmRleCAtLWNobW9kPWAuCisKK1F1aXRlIHNpbWlsYXJseSwgaWYgYGNvcmUuc3ltbGlua3NgIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgaXMgc2V0Cit0byAnZmFsc2UnIChzZWUgbGlua2dpdDpnaXQtY29uZmlnWzFdKSwgc3ltYm9saWMgbGlua3MgYXJlIGNoZWNrZWQgb3V0CithcyBwbGFpbiBmaWxlcywgYW5kIHRoaXMgY29tbWFuZCBkb2VzIG5vdCBtb2RpZnkgYSByZWNvcmRlZCBmaWxlIG1vZGUKK2Zyb20gc3ltYm9saWMgbGluayB0byByZWd1bGFyIGZpbGUuCisKK1RoZSBjb21tYW5kIGxvb2tzIGF0IGBjb3JlLmlnbm9yZXN0YXRgIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUuICBTZWUKKydVc2luZyAiYXNzdW1lIHVuY2hhbmdlZCIgYml0JyBzZWN0aW9uIGFib3ZlLgorCisKK1NlZSBBbHNvCistLS0tLS0tLQorbGlua2dpdDpnaXQtY29uZmlnWzFdLAorbGlua2dpdDpnaXQtYWRkWzFdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC11cGRhdGUtcmVmLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXVwZGF0ZS1yZWYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYzQ3NTkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC11cGRhdGUtcmVmLnR4dApAQCAtMCwwICsxLDkzIEBACitnaXQtdXBkYXRlLXJlZigxKQorPT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXVwZGF0ZS1yZWYgLSBVcGRhdGUgdGhlIG9iamVjdCBuYW1lIHN0b3JlZCBpbiBhIHJlZiBzYWZlbHkKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXVwZGF0ZS1yZWYnIFstbSA8cmVhc29uPl0gKC1kIDxyZWY+IDxvbGR2YWx1ZT4gfCBbLS1uby1kZXJlZl0gPHJlZj4gPG5ld3ZhbHVlPiBbPG9sZHZhbHVlPl0pCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorR2l2ZW4gdHdvIGFyZ3VtZW50cywgc3RvcmVzIHRoZSA8bmV3dmFsdWU+IGluIHRoZSA8cmVmPiwgcG9zc2libHkKK2RlcmVmZXJlbmNpbmcgdGhlIHN5bWJvbGljIHJlZnMuICBFLmcuIGBnaXQtdXBkYXRlLXJlZiBIRUFECis8bmV3dmFsdWU+YCB1cGRhdGVzIHRoZSBjdXJyZW50IGJyYW5jaCBoZWFkIHRvIHRoZSBuZXcgb2JqZWN0LgorCitHaXZlbiB0aHJlZSBhcmd1bWVudHMsIHN0b3JlcyB0aGUgPG5ld3ZhbHVlPiBpbiB0aGUgPHJlZj4sCitwb3NzaWJseSBkZXJlZmVyZW5jaW5nIHRoZSBzeW1ib2xpYyByZWZzLCBhZnRlciB2ZXJpZnlpbmcgdGhhdAordGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIDxyZWY+IG1hdGNoZXMgPG9sZHZhbHVlPi4KK0UuZy4gYGdpdC11cGRhdGUtcmVmIHJlZnMvaGVhZHMvbWFzdGVyIDxuZXd2YWx1ZT4gPG9sZHZhbHVlPmAKK3VwZGF0ZXMgdGhlIG1hc3RlciBicmFuY2ggaGVhZCB0byA8bmV3dmFsdWU+IG9ubHkgaWYgaXRzIGN1cnJlbnQKK3ZhbHVlIGlzIDxvbGR2YWx1ZT4uICBZb3UgY2FuIHNwZWNpZnkgNDAgIjAiIG9yIGFuIGVtcHR5IHN0cmluZworYXMgPG9sZHZhbHVlPiB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcmVmIHlvdSBhcmUgY3JlYXRpbmcgZG9lcworbm90IGV4aXN0LgorCitJdCBhbHNvIGFsbG93cyBhICJyZWYiIGZpbGUgdG8gYmUgYSBzeW1ib2xpYyBwb2ludGVyIHRvIGFub3RoZXIKK3JlZiBmaWxlIGJ5IHN0YXJ0aW5nIHdpdGggdGhlIGZvdXItYnl0ZSBoZWFkZXIgc2VxdWVuY2Ugb2YKKyJyZWY6Ii4KKworTW9yZSBpbXBvcnRhbnRseSwgaXQgYWxsb3dzIHRoZSB1cGRhdGUgb2YgYSByZWYgZmlsZSB0byBmb2xsb3cKK3RoZXNlIHN5bWJvbGljIHBvaW50ZXJzLCB3aGV0aGVyIHRoZXkgYXJlIHN5bWxpbmtzIG9yIHRoZXNlCisicmVndWxhciBmaWxlIHN5bWJvbGljIHJlZnMiLiAgSXQgZm9sbG93cyAqcmVhbCogc3ltbGlua3Mgb25seQoraWYgdGhleSBzdGFydCB3aXRoICJyZWZzLyI6IG90aGVyd2lzZSBpdCB3aWxsIGp1c3QgdHJ5IHRvIHJlYWQKK3RoZW0gYW5kIHVwZGF0ZSB0aGVtIGFzIGEgcmVndWxhciBmaWxlIChpLmUuIGl0IHdpbGwgYWxsb3cgdGhlCitmaWxlc3lzdGVtIHRvIGZvbGxvdyB0aGVtLCBidXQgd2lsbCBvdmVyd3JpdGUgc3VjaCBhIHN5bWxpbmsgdG8KK3NvbWV3aGVyZSBlbHNlIHdpdGggYSByZWd1bGFyIGZpbGVuYW1lKS4KKworSWYgLS1uby1kZXJlZiBpcyBnaXZlbiwgPHJlZj4gaXRzZWxmIGlzIG92ZXJ3cml0dGVuLCByYXRoZXIgdGhhbgordGhlIHJlc3VsdCBvZiBmb2xsb3dpbmcgdGhlIHN5bWJvbGljIHBvaW50ZXJzLgorCitJbiBnZW5lcmFsLCB1c2luZworCisJZ2l0LXVwZGF0ZS1yZWYgSEVBRCAiJGhlYWQiCisKK3Nob3VsZCBiZSBhIF9sb3RfIHNhZmVyIHRoYW4gZG9pbmcKKworCWVjaG8gIiRoZWFkIiA+ICIkR0lUX0RJUi9IRUFEIgorCitib3RoIGZyb20gYSBzeW1saW5rIGZvbGxvd2luZyBzdGFuZHBvaW50ICphbmQqIGFuIGVycm9yIGNoZWNraW5nCitzdGFuZHBvaW50LiAgVGhlICJyZWZzLyIgcnVsZSBmb3Igc3ltbGlua3MgbWVhbnMgdGhhdCBzeW1saW5rcwordGhhdCBwb2ludCB0byAib3V0c2lkZSIgdGhlIHRyZWUgYXJlIHNhZmU6IHRoZXknbGwgYmUgZm9sbG93ZWQKK2ZvciByZWFkaW5nIGJ1dCBub3QgZm9yIHdyaXRpbmcgKHNvIHdlJ2xsIG5ldmVyIHdyaXRlIHRocm91Z2ggYQorcmVmIHN5bWxpbmsgdG8gc29tZSBvdGhlciB0cmVlLCBpZiB5b3UgaGF2ZSBjb3BpZWQgYSB3aG9sZQorYXJjaGl2ZSBieSBjcmVhdGluZyBhIHN5bWxpbmsgdHJlZSkuCisKK1dpdGggYC1kYCBmbGFnLCBpdCBkZWxldGVzIHRoZSBuYW1lZCA8cmVmPiBhZnRlciB2ZXJpZnlpbmcgaXQKK3N0aWxsIGNvbnRhaW5zIDxvbGR2YWx1ZT4uCisKKworTG9nZ2luZyBVcGRhdGVzCistLS0tLS0tLS0tLS0tLS0KK0lmIGNvbmZpZyBwYXJhbWV0ZXIgImNvcmUubG9nQWxsUmVmVXBkYXRlcyIgaXMgdHJ1ZSBvciB0aGUgZmlsZQorIiRHSVRfRElSL2xvZ3MvPHJlZj4iIGV4aXN0cyB0aGVuIGBnaXQtdXBkYXRlLXJlZmAgd2lsbCBhcHBlbmQKK2EgbGluZSB0byB0aGUgbG9nIGZpbGUgIiRHSVRfRElSL2xvZ3MvPHJlZj4iIChkZXJlZmVyZW5jaW5nIGFsbAorc3ltYm9saWMgcmVmcyBiZWZvcmUgY3JlYXRpbmcgdGhlIGxvZyBuYW1lKSBkZXNjcmliaW5nIHRoZSBjaGFuZ2UKK2luIHJlZiB2YWx1ZS4gIExvZyBsaW5lcyBhcmUgZm9ybWF0dGVkIGFzOgorCisgICAgLiBvbGRzaGExIFNQIG5ld3NoYTEgU1AgY29tbWl0dGVyIExGCisrCitXaGVyZSAib2xkc2hhMSIgaXMgdGhlIDQwIGNoYXJhY3RlciBoZXhhZGVjaW1hbCB2YWx1ZSBwcmV2aW91c2x5CitzdG9yZWQgaW4gPHJlZj4sICJuZXdzaGExIiBpcyB0aGUgNDAgY2hhcmFjdGVyIGhleGFkZWNpbWFsIHZhbHVlIG9mCis8bmV3dmFsdWU+IGFuZCAiY29tbWl0dGVyIiBpcyB0aGUgY29tbWl0dGVyJ3MgbmFtZSwgZW1haWwgYWRkcmVzcworYW5kIGRhdGUgaW4gdGhlIHN0YW5kYXJkIEdJVCBjb21taXR0ZXIgaWRlbnQgZm9ybWF0LgorCitPcHRpb25hbGx5IHdpdGggLW06CisKKyAgICAuIG9sZHNoYTEgU1AgbmV3c2hhMSBTUCBjb21taXR0ZXIgVEFCIG1lc3NhZ2UgTEYKKysKK1doZXJlIGFsbCBmaWVsZHMgYXJlIGFzIGRlc2NyaWJlZCBhYm92ZSBhbmQgIm1lc3NhZ2UiIGlzIHRoZQordmFsdWUgc3VwcGxpZWQgdG8gdGhlIC1tIG9wdGlvbi4KKworQW4gdXBkYXRlIHdpbGwgZmFpbCAod2l0aG91dCBjaGFuZ2luZyA8cmVmPikgaWYgdGhlIGN1cnJlbnQgdXNlciBpcwordW5hYmxlIHRvIGNyZWF0ZSBhIG5ldyBsb2cgZmlsZSwgYXBwZW5kIHRvIHRoZSBleGlzdGluZyBsb2cgZmlsZQorb3IgZG9lcyBub3QgaGF2ZSBjb21taXR0ZXIgaW5mb3JtYXRpb24gYXZhaWxhYmxlLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mby50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC11cGRhdGUtc2VydmVyLWluZm8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZjg5ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC11cGRhdGUtc2VydmVyLWluZm8udHh0CkBAIC0wLDAgKzEsNTcgQEAKK2dpdC11cGRhdGUtc2VydmVyLWluZm8oMSkKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mbyAtIFVwZGF0ZSBhdXhpbGlhcnkgaW5mbyBmaWxlIHRvIGhlbHAgZHVtYiBzZXJ2ZXJzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mbycgWy0tZm9yY2VdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQSBkdW1iIHNlcnZlciB0aGF0IGRvZXMgbm90IGRvIG9uLXRoZS1mbHkgcGFjayBnZW5lcmF0aW9ucyBtdXN0CitoYXZlIHNvbWUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIGZpbGVzIGluICRHSVRfRElSL2luZm8gYW5kCiskR0lUX09CSkVDVF9ESVJFQ1RPUlkvaW5mbyBkaXJlY3RvcmllcyB0byBoZWxwIGNsaWVudHMgZGlzY292ZXIKK3doYXQgcmVmZXJlbmNlcyBhbmQgcGFja3MgdGhlIHNlcnZlciBoYXMuICBUaGlzIGNvbW1hbmQKK2dlbmVyYXRlcyBzdWNoIGF1eGlsaWFyeSBmaWxlcy4KKworCitPUFRJT05TCistLS0tLS0tCisKKy1mfC0tZm9yY2U6OgorCVVwZGF0ZSB0aGUgaW5mbyBmaWxlcyBmcm9tIHNjcmF0Y2guCisKKworT1VUUFVUCistLS0tLS0KKworQ3VycmVudGx5IHRoZSBjb21tYW5kIHVwZGF0ZXMgdGhlIGZvbGxvd2luZyBmaWxlcy4gIFBsZWFzZSBzZWUKK2xpbms6cmVwb3NpdG9yeS1sYXlvdXQuaHRtbFtyZXBvc2l0b3J5LWxheW91dF0gZm9yIGRlc2NyaXB0aW9uCitvZiB3aGF0IHRoZXkgYXJlIGZvcjoKKworKiBvYmplY3RzL2luZm8vcGFja3MKKworKiBpbmZvL3JlZnMKKworCitCVUdTCistLS0tCitXaGVuIHlvdSByZW1vdmUgYW4gZXhpc3RpbmcgcmVmLCB0aGUgY29tbWFuZCBmYWlscyB0byB1cGRhdGUKK2luZm8vcmVmcyBmaWxlIHVubGVzcyBgLS1mb3JjZWAgZmxhZyBpcyBnaXZlbi4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vLgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXVwbG9hZC1hcmNoaXZlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXVwbG9hZC1hcmNoaXZlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWVmMTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdXBsb2FkLWFyY2hpdmUudHh0CkBAIC0wLDAgKzEsMzcgQEAKK2dpdC11cGxvYWQtYXJjaGl2ZSgxKQorPT09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXVwbG9hZC1hcmNoaXZlIC0gU2VuZCBhcmNoaXZlIGJhY2sgdG8gZ2l0LWFyY2hpdmUKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtdXBsb2FkLWFyY2hpdmUnIDxkaXJlY3Rvcnk+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorSW52b2tlZCBieSAnZ2l0LWFyY2hpdmUgLS1yZW1vdGUnIGFuZCBzZW5kcyBhIGdlbmVyYXRlZCBhcmNoaXZlIHRvIHRoZQorb3RoZXIgZW5kIG92ZXIgdGhlIGdpdCBwcm90b2NvbC4KKworVGhpcyBjb21tYW5kIGlzIHVzdWFsbHkgbm90IGludm9rZWQgZGlyZWN0bHkgYnkgdGhlIGVuZCB1c2VyLiAgVGhlIFVJCitmb3IgdGhlIHByb3RvY29sIGlzIG9uIHRoZSAnZ2l0LWFyY2hpdmUnIHNpZGUsIGFuZCB0aGUgcHJvZ3JhbSBwYWlyCitpcyBtZWFudCB0byBiZSB1c2VkIHRvIGdldCBhbiBhcmNoaXZlIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeS4KKworT1BUSU9OUworLS0tLS0tLQorPGRpcmVjdG9yeT46OgorCVRoZSByZXBvc2l0b3J5IHRvIGdldCBhIHRhciBhcmNoaXZlIGZyb20uCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEZyYW5jayBCdWktSHV1LgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC11cGxvYWQtcGFjay50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC11cGxvYWQtcGFjay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMzMGQxMwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXVwbG9hZC1wYWNrLnR4dApAQCAtMCwwICsxLDQ2IEBACitnaXQtdXBsb2FkLXBhY2soMSkKKz09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtdXBsb2FkLXBhY2sgLSBTZW5kIG9iamVjdHMgcGFja2VkIGJhY2sgdG8gZ2l0LWZldGNoLXBhY2sKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtdXBsb2FkLXBhY2snIFstLXN0cmljdF0gWy0tdGltZW91dD08bj5dIDxkaXJlY3Rvcnk+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorSW52b2tlZCBieSAnZ2l0LWZldGNoLXBhY2snLCBsZWFybnMgd2hhdAorb2JqZWN0cyB0aGUgb3RoZXIgc2lkZSBpcyBtaXNzaW5nLCBhbmQgc2VuZHMgdGhlbSBhZnRlciBwYWNraW5nLgorCitUaGlzIGNvbW1hbmQgaXMgdXN1YWxseSBub3QgaW52b2tlZCBkaXJlY3RseSBieSB0aGUgZW5kIHVzZXIuCitUaGUgVUkgZm9yIHRoZSBwcm90b2NvbCBpcyBvbiB0aGUgJ2dpdC1mZXRjaC1wYWNrJyBzaWRlLCBhbmQgdGhlCitwcm9ncmFtIHBhaXIgaXMgbWVhbnQgdG8gYmUgdXNlZCB0byBwdWxsIHVwZGF0ZXMgZnJvbSBhIHJlbW90ZQorcmVwb3NpdG9yeS4gIEZvciBwdXNoIG9wZXJhdGlvbnMsIHNlZSAnZ2l0LXNlbmQtcGFjaycuCisKKworT1BUSU9OUworLS0tLS0tLQorCitcLS1zdHJpY3Q6OgorCURvIG5vdCB0cnkgPGRpcmVjdG9yeT4vLmdpdC8gaWYgPGRpcmVjdG9yeT4gaXMgbm8gZ2l0IGRpcmVjdG9yeS4KKworXC0tdGltZW91dD08bj46OgorCUludGVycnVwdCB0cmFuc2ZlciBhZnRlciA8bj4gc2Vjb25kcyBvZiBpbmFjdGl2aXR5LgorCis8ZGlyZWN0b3J5Pjo6CisJVGhlIHJlcG9zaXRvcnkgdG8gc3luYyBmcm9tLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vLgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXZhci50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC12YXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ODAyODMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC12YXIudHh0CkBAIC0wLDAgKzEsNjQgQEAKK2dpdC12YXIoMSkKKz09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXZhciAtIFNob3cgYSBnaXQgbG9naWNhbCB2YXJpYWJsZQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC12YXInIFsgLWwgfCA8dmFyaWFibGU+IF0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitQcmludHMgYSBnaXQgbG9naWNhbCB2YXJpYWJsZS4KKworT1BUSU9OUworLS0tLS0tLQorLWw6OgorCUNhdXNlIHRoZSBsb2dpY2FsIHZhcmlhYmxlcyB0byBiZSBsaXN0ZWQuIEluIGFkZGl0aW9uLCBhbGwgdGhlCisJdmFyaWFibGVzIG9mIHRoZSBnaXQgY29uZmlndXJhdGlvbiBmaWxlIC5naXQvY29uZmlnIGFyZSBsaXN0ZWQKKwlhcyB3ZWxsLiAoSG93ZXZlciwgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGxpc3RpbmcgZnVuY3Rpb25hbGl0eQorCWlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYGdpdC1jb25maWcgLWxgLikKKworRVhBTVBMRQorLS0tLS0tLS0KKwkkIGdpdC12YXIgR0lUX0FVVEhPUl9JREVOVAorCUVyaWMgVy4gQmllZGVybWFuIDxlYmllZGVybUBsbnhpLmNvbT4gMTEyMTIyMzI3OCAtMDYwMAorCisKK1ZBUklBQkxFUworLS0tLS0tLS0tLQorR0lUX0FVVEhPUl9JREVOVDo6CisgICAgVGhlIGF1dGhvciBvZiBhIHBpZWNlIG9mIGNvZGUuCisKK0dJVF9DT01NSVRURVJfSURFTlQ6OgorICAgIFRoZSBwZXJzb24gd2hvIHB1dCBhIHBpZWNlIG9mIGNvZGUgaW50byBnaXQuCisKK0RpYWdub3N0aWNzCistLS0tLS0tLS0tLQorWW91IGRvbid0IGV4aXN0LiBHbyBhd2F5ITo6CisgICAgVGhlIHBhc3N3ZCg1KSBnZWNvcyBmaWVsZCBjb3VsZG4ndCBiZSByZWFkCitZb3VyIHBhcmVudHMgbXVzdCBoYXZlIGhhdGVkIHlvdSE6OgorICAgIFRoZSBwYXNzd29yZCg1KSBnZWNvcyBmaWVsZCBpcyBsb25nZXIgdGhhbiBhIGdpYW50IHN0YXRpYyBidWZmZXIuCitZb3VyIHN5c2FkbWluIG11c3QgaGF0ZSB5b3UhOjoKKyAgICBUaGUgcGFzc3dvcmQoNSkgbmFtZSBmaWVsZCBpcyBsb25nZXIgdGhhbiBhIGdpYW50IHN0YXRpYyBidWZmZXIuCisKK1NlZSBBbHNvCistLS0tLS0tLQorbGlua2dpdDpnaXQtY29tbWl0LXRyZWVbMV0KK2xpbmtnaXQ6Z2l0LXRhZ1sxXQorbGlua2dpdDpnaXQtY29uZmlnWzFdCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEVyaWMgQmllZGVybWFuIDxlYmllZGVybUB4bWlzc2lvbi5jb20+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEVyaWMgQmllZGVybWFuIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXZlcmlmeS1wYWNrLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXZlcmlmeS1wYWNrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTJhMTU3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdmVyaWZ5LXBhY2sudHh0CkBAIC0wLDAgKzEsNTMgQEAKK2dpdC12ZXJpZnktcGFjaygxKQorPT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC12ZXJpZnktcGFjayAtIFZhbGlkYXRlIHBhY2tlZCBnaXQgYXJjaGl2ZSBmaWxlcworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC12ZXJpZnktcGFjaycgWy12XSBbLS1dIDxwYWNrPi5pZHggLi4uCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitSZWFkcyBnaXZlbiBpZHggZmlsZSBmb3IgcGFja2VkIGdpdCBhcmNoaXZlIGNyZWF0ZWQgd2l0aAorZ2l0LXBhY2stb2JqZWN0cyBjb21tYW5kIGFuZCB2ZXJpZmllcyBpZHggZmlsZSBhbmQgdGhlCitjb3JyZXNwb25kaW5nIHBhY2sgZmlsZS4KKworT1BUSU9OUworLS0tLS0tLQorPHBhY2s+LmlkeCAuLi46OgorCVRoZSBpZHggZmlsZXMgdG8gdmVyaWZ5LgorCistdjo6CisJQWZ0ZXIgdmVyaWZ5aW5nIHRoZSBwYWNrLCBzaG93IGxpc3Qgb2Ygb2JqZWN0cyBjb250YWluZWQKKwlpbiB0aGUgcGFjay4KK1wtLTo6CisJRG8gbm90IGludGVycHJldCBhbnkgbW9yZSBhcmd1bWVudHMgYXMgb3B0aW9ucy4KKworT1VUUFVUIEZPUk1BVAorLS0tLS0tLS0tLS0tLQorV2hlbiBzcGVjaWZ5aW5nIHRoZSAtdiBvcHRpb24gdGhlIGZvcm1hdCB1c2VkIGlzOgorCisJU0hBMSB0eXBlIHNpemUgc2l6ZS1pbi1wYWNrLWZpbGUgb2Zmc2V0LWluLXBhY2tmaWxlCisKK2ZvciBvYmplY3RzIHRoYXQgYXJlIG5vdCBkZWx0aWZpZWQgaW4gdGhlIHBhY2ssIGFuZAorCisJU0hBMSB0eXBlIHNpemUgc2l6ZS1pbi1wYWNrZmlsZSBvZmZzZXQtaW4tcGFja2ZpbGUgZGVwdGggYmFzZS1TSEExCisKK2ZvciBvYmplY3RzIHRoYXQgYXJlIGRlbHRpZmllZC4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXZlcmlmeS10YWcudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtdmVyaWZ5LXRhZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U5YzFlZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXZlcmlmeS10YWcudHh0CkBAIC0wLDAgKzEsMzEgQEAKK2dpdC12ZXJpZnktdGFnKDEpCis9PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtdmVyaWZ5LXRhZyAtIENoZWNrIHRoZSBHUEcgc2lnbmF0dXJlIG9mIHRhZ3MKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXZlcmlmeS10YWcnIDx0YWc+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVmFsaWRhdGVzIHRoZSBncGcgc2lnbmF0dXJlIGNyZWF0ZWQgYnkgZ2l0LXRhZy4KKworT1BUSU9OUworLS0tLS0tLQorPHRhZz46OgorCVNIQTEgaWRlbnRpZmllciBvZiBhIGdpdCB0YWcgb2JqZWN0LgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKYW4gSGFya2VzIDxqYWhhcmtlc0Bjcy5jbXUuZWR1PiBhbmQgRXJpYyBXLiBCaWVkZXJtYW4gPGViaWVkZXJtQHhtaXNzaW9uLmNvbT4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtd2ViLS1icm93c2UudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtd2ViLS1icm93c2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYmFlNWIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC13ZWItLWJyb3dzZS50eHQKQEAgLTAsMCArMSw5OSBAQAorZ2l0LXdlYi0tYnJvd3NlKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXdlYi0tYnJvd3NlIC0gZ2l0IGhlbHBlciBzY3JpcHQgdG8gbGF1bmNoIGEgd2ViIGJyb3dzZXIKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXdlYi0tYnJvd3NlJyBbT1BUSU9OU10gVVJML0ZJTEUgLi4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitUaGlzIHNjcmlwdCB0cmllcywgYXMgbXVjaCBhcyBwb3NzaWJsZSwgdG8gZGlzcGxheSB0aGUgVVJMcyBhbmQgRklMRXMKK3RoYXQgYXJlIHBhc3NlZCBhcyBhcmd1bWVudHMsIGFzIEhUTUwgcGFnZXMgaW4gbmV3IHRhYnMgb24gYW4gYWxyZWFkeQorb3BlbmVkIHdlYiBicm93c2VyLgorCitUaGUgZm9sbG93aW5nIGJyb3dzZXJzIChvciBjb21tYW5kcykgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6CisKKyogZmlyZWZveCAodGhpcyBpcyB0aGUgZGVmYXVsdCB1bmRlciBYIFdpbmRvdyB3aGVuIG5vdCB1c2luZyBLREUpCisqIGljZXdlYXNlbAorKiBrb25xdWVyb3IgKHRoaXMgaXMgdGhlIGRlZmF1bHQgdW5kZXIgS0RFKQorKiB3M20gKHRoaXMgaXMgdGhlIGRlZmF1bHQgb3V0c2lkZSBncmFwaGljYWwgZW52aXJvbm1lbnRzKQorKiBsaW5rcworKiBseW54CisqIGRpbGxvCisqIG9wZW4gKHRoaXMgaXMgdGhlIGRlZmF1bHQgdW5kZXIgTWFjIE9TIFggR1VJKQorCitDdXN0b20gY29tbWFuZHMgbWF5IGFsc28gYmUgc3BlY2lmaWVkLgorCitPUFRJT05TCistLS0tLS0tCistYiBCUk9XU0VSfC0tYnJvd3Nlcj1CUk9XU0VSOjoKKwlVc2UgdGhlIHNwZWNpZmllZCBCUk9XU0VSLiBJdCBtdXN0IGJlIGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZAorCWJyb3dzZXJzLgorCistdCBCUk9XU0VSfC0tdG9vbD1CUk9XU0VSOjoKKwlTYW1lIGFzIGFib3ZlLgorCistYyBDT05GLlZBUnwtLWNvbmZpZz1DT05GLlZBUjo6CisJQ09ORi5WQVIgaXMgbG9va2VkIHVwIGluIHRoZSBnaXQgY29uZmlnIGZpbGVzLiBJZiBpdCdzIHNldCwKKwl0aGVuIGl0cyB2YWx1ZSBzcGVjaWZ5IHRoZSBicm93c2VyIHRoYXQgc2hvdWxkIGJlIHVzZWQuCisKK0NPTkZJR1VSQVRJT04gVkFSSUFCTEVTCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDT05GLlZBUiAoZnJvbSAtYyBvcHRpb24pIGFuZCB3ZWIuYnJvd3Nlcgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIHdlYiBicm93c2VyIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgYSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIHBhc3NlZAord2l0aCB0aGUgLWMgKG9yIC0tY29uZmlnKSBjb21tYW5kIGxpbmUgb3B0aW9uLCBvciB0aGUgJ3dlYi5icm93c2VyJworY29uZmlndXJhdGlvbiB2YXJpYWJsZSBpZiB0aGUgZm9ybWVyIGlzIG5vdCB1c2VkLgorCiticm93c2VyLjx0b29sPi5wYXRoCit+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1lvdSBjYW4gZXhwbGljaXRseSBwcm92aWRlIGEgZnVsbCBwYXRoIHRvIHlvdXIgcHJlZmVycmVkIGJyb3dzZXIgYnkKK3NldHRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgJ2Jyb3dzZXIuPHRvb2w+LnBhdGgnLiBGb3IgZXhhbXBsZSwKK3lvdSBjYW4gY29uZmlndXJlIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGZpcmVmb3ggYnkgc2V0dGluZworJ2Jyb3dzZXIuZmlyZWZveC5wYXRoJy4gT3RoZXJ3aXNlLCAnZ2l0LXdlYi0tYnJvd3NlJyBhc3N1bWVzIHRoZSB0b29sCitpcyBhdmFpbGFibGUgaW4gUEFUSC4KKworYnJvd3Nlci48dG9vbD4uY21kCit+fn5+fn5+fn5+fn5+fn5+fn4KKworV2hlbiB0aGUgYnJvd3Nlciwgc3BlY2lmaWVkIGJ5IG9wdGlvbnMgb3IgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMsIGlzCitub3QgYW1vbmcgdGhlIHN1cHBvcnRlZCBvbmVzLCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nCisnYnJvd3Nlci48dG9vbD4uY21kJyBjb25maWd1cmF0aW9uIHZhcmlhYmxlIHdpbGwgYmUgbG9va2VkIHVwLiBJZiB0aGlzCit2YXJpYWJsZSBleGlzdHMgdGhlbiAiZ2l0IHdlYi0tYnJvd3NlIiB3aWxsIHRyZWF0IHRoZSBzcGVjaWZpZWQgdG9vbAorYXMgYSBjdXN0b20gY29tbWFuZCBhbmQgd2lsbCB1c2UgYSBzaGVsbCBldmFsIHRvIHJ1biB0aGUgY29tbWFuZCB3aXRoCit0aGUgVVJMcyBwYXNzZWQgYXMgYXJndW1lbnRzLgorCitOb3RlIGFib3V0IGdpdCBjb25maWcgLS1nbG9iYWwKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitOb3RlIHRoYXQgdGhlc2UgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgc2hvdWxkIHByb2JhYmx5IGJlIHNldCB1c2luZwordGhlICctLWdsb2JhbCcgZmxhZywgZm9yIGV4YW1wbGUgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbmZpZyAtLWdsb2JhbCB3ZWIuYnJvd3NlciBmaXJlZm94CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYXMgdGhleSBhcmUgcHJvYmFibHkgbW9yZSB1c2VyIHNwZWNpZmljIHRoYW4gcmVwb3NpdG9yeSBzcGVjaWZpYy4KK1NlZSBsaW5rZ2l0OmdpdC1jb25maWdbMV0gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcy4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgQ2hyaXN0aWFuIENvdWRlciA8Y2hyaXNjb29sQHR1eGZhbWlseS5vcmc+IGFuZCB0aGUgZ2l0LWxpc3QKKzxnaXRAdmdlci5rZXJuZWwub3JnPiwgYmFzZWQgb24gZ2l0LW1lcmdldG9vbCBieSBUaGVvZG9yZSBZLiBUcydvLgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IENocmlzdGlhbiBDb3VkZXIgPGNocmlzY29vbEB0dXhmYW1pbHkub3JnPiBhbmQgdGhlCitnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtd2hhdGNoYW5nZWQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtd2hhdGNoYW5nZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZTdiZDQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC13aGF0Y2hhbmdlZC50eHQKQEAgLTAsMCArMSw3OSBAQAorZ2l0LXdoYXRjaGFuZ2VkKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXdoYXRjaGFuZ2VkIC0gU2hvdyBsb2dzIHdpdGggZGlmZmVyZW5jZSBlYWNoIGNvbW1pdCBpbnRyb2R1Y2VzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXdoYXRjaGFuZ2VkJyA8b3B0aW9uPi4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1Nob3dzIGNvbW1pdCBsb2dzIGFuZCBkaWZmIG91dHB1dCBlYWNoIGNvbW1pdCBpbnRyb2R1Y2VzLiAgVGhlCitjb21tYW5kIGludGVybmFsbHkgaW52b2tlcyAnZ2l0LXJldi1saXN0JyBwaXBlZCB0bworJ2dpdC1kaWZmLXRyZWUnLCBhbmQgdGFrZXMgY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yIGJvdGggb2YKK3RoZXNlIGNvbW1hbmRzLgorCitUaGlzIG1hbnVhbCBwYWdlIGRlc2NyaWJlcyBvbmx5IHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBvcHRpb25zLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy1wOjoKKwlTaG93IHRleHR1YWwgZGlmZnMsIGluc3RlYWQgb2YgdGhlIGdpdCBpbnRlcm5hbCBkaWZmCisJb3V0cHV0IGZvcm1hdCB0aGF0IGlzIHVzZWZ1bCBvbmx5IHRvIHRlbGwgdGhlIGNoYW5nZWQKKwlwYXRocyBhbmQgdGhlaXIgbmF0dXJlIG9mIGNoYW5nZXMuCisKKy08bj46OgorCUxpbWl0IG91dHB1dCB0byA8bj4gY29tbWl0cy4KKworPHNpbmNlPi4uPHVudGlsPjo6CisJTGltaXQgb3V0cHV0IHRvIGJldHdlZW4gdGhlIHR3byBuYW1lZCBjb21taXRzIChib3R0b20KKwlleGNsdXNpdmUsIHRvcCBpbmNsdXNpdmUpLgorCistcjo6CisJU2hvdyBnaXQgaW50ZXJuYWwgZGlmZiBvdXRwdXQsIGJ1dCBmb3IgdGhlIHdob2xlIHRyZWUsCisJbm90IGp1c3QgdGhlIHRvcCBsZXZlbC4KKworLW06OgorCUJ5IGRlZmF1bHQsIGRpZmZlcmVuY2VzIGZvciBtZXJnZSBjb21taXRzIGFyZSBub3Qgc2hvd24uCisJV2l0aCB0aGlzIGZsYWcsIHNob3cgZGlmZmVyZW5jZXMgdG8gdGhhdCBjb21taXQgZnJvbSBhbGwKKwlvZiBpdHMgcGFyZW50cy4KKysKK0hvd2V2ZXIsIGl0IGlzIG5vdCB2ZXJ5IHVzZWZ1bCBpbiBnZW5lcmFsLCBhbHRob3VnaCBpdAorKmlzKiB1c2VmdWwgb24gYSBmaWxlLWJ5LWZpbGUgYmFzaXMuCisKK2luY2x1ZGU6OnByZXR0eS1vcHRpb25zLnR4dFtdCisKK2luY2x1ZGU6OnByZXR0eS1mb3JtYXRzLnR4dFtdCisKK0V4YW1wbGVzCistLS0tLS0tLQorZ2l0LXdoYXRjaGFuZ2VkIC1wIHYyLjYuMTIuLiBpbmNsdWRlL3Njc2kgZHJpdmVycy9zY3NpOjoKKworCVNob3cgYXMgcGF0Y2hlcyB0aGUgY29tbWl0cyBzaW5jZSB2ZXJzaW9uICd2Mi42LjEyJyB0aGF0IGNoYW5nZWQKKwlhbnkgZmlsZSBpbiB0aGUgaW5jbHVkZS9zY3NpIG9yIGRyaXZlcnMvc2NzaSBzdWJkaXJlY3RvcmllcworCitnaXQtd2hhdGNoYW5nZWQgLS1zaW5jZT0iMiB3ZWVrcyBhZ28iIFwtLSBnaXRrOjoKKworCVNob3cgdGhlIGNoYW5nZXMgZHVyaW5nIHRoZSBsYXN0IHR3byB3ZWVrcyB0byB0aGUgZmlsZSAnZ2l0aycuCisJVGhlICItLSIgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGNvbmZ1c2lvbiB3aXRoIHRoZSAqYnJhbmNoKiBuYW1lZAorCSdnaXRrJworCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4gYW5kCitKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtd3JpdGUtdHJlZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC13cml0ZS10cmVlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjFjODEzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtd3JpdGUtdHJlZS50eHQKQEAgLTAsMCArMSw0OSBAQAorZ2l0LXdyaXRlLXRyZWUoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC13cml0ZS10cmVlIC0gQ3JlYXRlIGEgdHJlZSBvYmplY3QgZnJvbSB0aGUgY3VycmVudCBpbmRleAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC13cml0ZS10cmVlJyBbLS1taXNzaW5nLW9rXSBbLS1wcmVmaXg9PHByZWZpeD4vXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0NyZWF0ZXMgYSB0cmVlIG9iamVjdCB1c2luZyB0aGUgY3VycmVudCBpbmRleC4KKworVGhlIGluZGV4IG11c3QgYmUgaW4gYSBmdWxseSBtZXJnZWQgc3RhdGUuCisKK0NvbmNlcHR1YWxseSwgYGdpdC13cml0ZS10cmVlYCBzeW5jKClzIHRoZSBjdXJyZW50IGluZGV4IGNvbnRlbnRzCitpbnRvIGEgc2V0IG9mIHRyZWUgZmlsZXMuCitJbiBvcmRlciB0byBoYXZlIHRoYXQgbWF0Y2ggd2hhdCBpcyBhY3R1YWxseSBpbiB5b3VyIGRpcmVjdG9yeSByaWdodAorbm93LCB5b3UgbmVlZCB0byBoYXZlIGRvbmUgYSBgZ2l0LXVwZGF0ZS1pbmRleGAgcGhhc2UgYmVmb3JlIHlvdSBkaWQgdGhlCitgZ2l0LXdyaXRlLXRyZWVgLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy0tbWlzc2luZy1vazo6CisJTm9ybWFsbHkgYGdpdC13cml0ZS10cmVlYCBlbnN1cmVzIHRoYXQgdGhlIG9iamVjdHMgcmVmZXJlbmNlZCBieSB0aGUKKwlkaXJlY3RvcnkgZXhpc3QgaW4gdGhlIG9iamVjdCBkYXRhYmFzZS4gIFRoaXMgb3B0aW9uIGRpc2FibGVzIHRoaXMKKwljaGVjay4KKworLS1wcmVmaXg9PHByZWZpeD4vOjoKKwlXcml0ZXMgYSB0cmVlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSBzdWJkaXJlY3RvcnkKKwlgPHByZWZpeD5gLiAgVGhpcyBjYW4gYmUgdXNlZCB0byB3cml0ZSB0aGUgdHJlZSBvYmplY3QKKwlmb3IgYSBzdWJwcm9qZWN0IHRoYXQgaXMgaW4gdGhlIG5hbWVkIHN1YmRpcmVjdG9yeS4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWYzMTg5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQudHh0CkBAIC0wLDAgKzEsNTY4IEBACitnaXQoNykKKz09PT09PQorCitOQU1FCistLS0tCitnaXQgLSB0aGUgc3R1cGlkIGNvbnRlbnQgdHJhY2tlcgorCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdCcgWy0tdmVyc2lvbl0gWy0tZXhlYy1wYXRoWz1HSVRfRVhFQ19QQVRIXV0KKyAgICBbLXB8LS1wYWdpbmF0ZXwtLW5vLXBhZ2VyXQorICAgIFstLWJhcmVdIFstLWdpdC1kaXI9R0lUX0RJUl0gWy0td29yay10cmVlPUdJVF9XT1JLX1RSRUVdCisgICAgWy0taGVscF0gQ09NTUFORCBbQVJHU10KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitHaXQgaXMgYSBmYXN0LCBzY2FsYWJsZSwgZGlzdHJpYnV0ZWQgcmV2aXNpb24gY29udHJvbCBzeXN0ZW0gd2l0aCBhbgordW51c3VhbGx5IHJpY2ggY29tbWFuZCBzZXQgdGhhdCBwcm92aWRlcyBib3RoIGhpZ2gtbGV2ZWwgb3BlcmF0aW9ucworYW5kIGZ1bGwgYWNjZXNzIHRvIGludGVybmFscy4KKworU2VlIHRoaXMgbGluazp0dXRvcmlhbC5odG1sW3R1dG9yaWFsXSB0byBnZXQgc3RhcnRlZCwgdGhlbiBzZWUKK2xpbms6ZXZlcnlkYXkuaHRtbFtFdmVyeWRheSBHaXRdIGZvciBhIHVzZWZ1bCBtaW5pbXVtIHNldCBvZiBjb21tYW5kcywgYW5kCisibWFuIGdpdC1jb21tYW5kbmFtZSIgZm9yIGRvY3VtZW50YXRpb24gb2YgZWFjaCBjb21tYW5kLiAgQ1ZTIHVzZXJzIG1heQorYWxzbyB3YW50IHRvIHJlYWQgbGluazpjdnMtbWlncmF0aW9uLmh0bWxbQ1ZTIG1pZ3JhdGlvbl0uICBTZWUKK2xpbms6dXNlci1tYW51YWwuaHRtbFtHaXQgVXNlcidzIE1hbnVhbF0gZm9yIGEgbW9yZSBpbi1kZXB0aAoraW50cm9kdWN0aW9uLgorCitUaGUgQ09NTUFORCBpcyBlaXRoZXIgYSBuYW1lIG9mIGEgR2l0IGNvbW1hbmQgKHNlZSBiZWxvdykgb3IgYW4gYWxpYXMKK2FzIGRlZmluZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAoc2VlIGxpbmtnaXQ6Z2l0LWNvbmZpZ1sxXSkuCisKK0Zvcm1hdHRlZCBhbmQgaHlwZXJsaW5rZWQgdmVyc2lvbiBvZiB0aGUgbGF0ZXN0IGdpdAorZG9jdW1lbnRhdGlvbiBjYW4gYmUgdmlld2VkIGF0CitgaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvYC4KKworaWZkZWY6OnN0YWxlbm90ZXNbXQorW05PVEVdCis9PT09PT09PT09PT0KKworWW91IGFyZSByZWFkaW5nIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgbGF0ZXN0IChwb3NzaWJseQordW5yZWxlYXNlZCkgdmVyc2lvbiBvZiBnaXQsIHRoYXQgaXMgYXZhaWxhYmxlIGZyb20gJ21hc3RlcicKK2JyYW5jaCBvZiB0aGUgYGdpdC5naXRgIHJlcG9zaXRvcnkuCitEb2N1bWVudGF0aW9uIGZvciBvbGRlciByZWxlYXNlcyBhcmUgYXZhaWxhYmxlIGhlcmU6CisKKyogbGluazp2MS41LjQuNS9naXQuaHRtbFtkb2N1bWVudGF0aW9uIGZvciByZWxlYXNlIDEuNS40LjVdCisKKyogcmVsZWFzZSBub3RlcyBmb3IKKyAgbGluazpSZWxOb3Rlcy0xLjUuNC41LnR4dFsxLjUuNC41XSwKKyAgbGluazpSZWxOb3Rlcy0xLjUuNC40LnR4dFsxLjUuNC40XSwKKyAgbGluazpSZWxOb3Rlcy0xLjUuNC4zLnR4dFsxLjUuNC4zXSwKKyAgbGluazpSZWxOb3Rlcy0xLjUuNC4yLnR4dFsxLjUuNC4yXSwKKyAgbGluazpSZWxOb3Rlcy0xLjUuNC4xLnR4dFsxLjUuNC4xXSwKKyAgbGluazpSZWxOb3Rlcy0xLjUuNC50eHRbMS41LjRdLgorCisqIGxpbms6djEuNS4zLjgvZ2l0Lmh0bWxbZG9jdW1lbnRhdGlvbiBmb3IgcmVsZWFzZSAxLjUuMy44XQorCisqIHJlbGVhc2Ugbm90ZXMgZm9yCisgIGxpbms6UmVsTm90ZXMtMS41LjMuOC50eHRbMS41LjMuOF0sCisgIGxpbms6UmVsTm90ZXMtMS41LjMuNy50eHRbMS41LjMuN10sCisgIGxpbms6UmVsTm90ZXMtMS41LjMuNi50eHRbMS41LjMuNl0sCisgIGxpbms6UmVsTm90ZXMtMS41LjMuNS50eHRbMS41LjMuNV0sCisgIGxpbms6UmVsTm90ZXMtMS41LjMuNC50eHRbMS41LjMuNF0sCisgIGxpbms6UmVsTm90ZXMtMS41LjMuMy50eHRbMS41LjMuM10sCisgIGxpbms6UmVsTm90ZXMtMS41LjMuMi50eHRbMS41LjMuMl0sCisgIGxpbms6UmVsTm90ZXMtMS41LjMuMS50eHRbMS41LjMuMV0sCisgIGxpbms6UmVsTm90ZXMtMS41LjMudHh0WzEuNS4zXS4KKworKiByZWxlYXNlIG5vdGVzIGZvcgorICBsaW5rOlJlbE5vdGVzLTEuNS4yLjUudHh0WzEuNS4yLjVdLAorICBsaW5rOlJlbE5vdGVzLTEuNS4yLjQudHh0WzEuNS4yLjRdLAorICBsaW5rOlJlbE5vdGVzLTEuNS4yLjMudHh0WzEuNS4yLjNdLAorICBsaW5rOlJlbE5vdGVzLTEuNS4yLjIudHh0WzEuNS4yLjJdLAorICBsaW5rOlJlbE5vdGVzLTEuNS4yLjEudHh0WzEuNS4yLjFdLAorICBsaW5rOlJlbE5vdGVzLTEuNS4yLnR4dFsxLjUuMl0uCisKKyogbGluazp2MS41LjEuNi9naXQuaHRtbFtkb2N1bWVudGF0aW9uIGZvciByZWxlYXNlIDEuNS4xLjZdCisKKyogcmVsZWFzZSBub3RlcyBmb3IKKyAgbGluazpSZWxOb3Rlcy0xLjUuMS42LnR4dFsxLjUuMS42XSwKKyAgbGluazpSZWxOb3Rlcy0xLjUuMS41LnR4dFsxLjUuMS41XSwKKyAgbGluazpSZWxOb3Rlcy0xLjUuMS40LnR4dFsxLjUuMS40XSwKKyAgbGluazpSZWxOb3Rlcy0xLjUuMS4zLnR4dFsxLjUuMS4zXSwKKyAgbGluazpSZWxOb3Rlcy0xLjUuMS4yLnR4dFsxLjUuMS4yXSwKKyAgbGluazpSZWxOb3Rlcy0xLjUuMS4xLnR4dFsxLjUuMS4xXSwKKyAgbGluazpSZWxOb3Rlcy0xLjUuMS50eHRbMS41LjFdLgorCisqIGxpbms6djEuNS4wLjcvZ2l0Lmh0bWxbZG9jdW1lbnRhdGlvbiBmb3IgcmVsZWFzZSAxLjUuMC43XQorCisqIHJlbGVhc2Ugbm90ZXMgZm9yCisgIGxpbms6UmVsTm90ZXMtMS41LjAuNy50eHRbMS41LjAuN10sCisgIGxpbms6UmVsTm90ZXMtMS41LjAuNi50eHRbMS41LjAuNl0sCisgIGxpbms6UmVsTm90ZXMtMS41LjAuNS50eHRbMS41LjAuNV0sCisgIGxpbms6UmVsTm90ZXMtMS41LjAuMy50eHRbMS41LjAuM10sCisgIGxpbms6UmVsTm90ZXMtMS41LjAuMi50eHRbMS41LjAuMl0sCisgIGxpbms6UmVsTm90ZXMtMS41LjAuMS50eHRbMS41LjAuMV0sCisgIGxpbms6UmVsTm90ZXMtMS41LjAudHh0WzEuNS4wXS4KKworKiBkb2N1bWVudGF0aW9uIGZvciByZWxlYXNlIGxpbms6djEuNC40LjQvZ2l0Lmh0bWxbMS40LjQuNF0sCisgIGxpbms6djEuMy4zL2dpdC5odG1sWzEuMy4zXSwKKyAgbGluazp2MS4yLjYvZ2l0Lmh0bWxbMS4yLjZdLAorICBsaW5rOnYxLjAuMTMvZ2l0Lmh0bWxbMS4wLjEzXS4KKworPT09PT09PT09PT09CisKK2VuZGlmOjpzdGFsZW5vdGVzW10KKworT1BUSU9OUworLS0tLS0tLQorLS12ZXJzaW9uOjoKKwlQcmludHMgdGhlIGdpdCBzdWl0ZSB2ZXJzaW9uIHRoYXQgdGhlICdnaXQnIHByb2dyYW0gY2FtZSBmcm9tLgorCistLWhlbHA6OgorCVByaW50cyB0aGUgc3lub3BzaXMgYW5kIGEgbGlzdCBvZiB0aGUgbW9zdCBjb21tb25seSB1c2VkCisJY29tbWFuZHMuIElmIHRoZSBvcHRpb24gJy0tYWxsJyBvciAnLWEnIGlzIGdpdmVuIHRoZW4gYWxsCisJYXZhaWxhYmxlIGNvbW1hbmRzIGFyZSBwcmludGVkLiBJZiBhIGdpdCBjb21tYW5kIGlzIG5hbWVkIHRoaXMKKwlvcHRpb24gd2lsbCBicmluZyB1cCB0aGUgbWFudWFsIHBhZ2UgZm9yIHRoYXQgY29tbWFuZC4KKysKK090aGVyIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB0byBjb250cm9sIGhvdyB0aGUgbWFudWFsIHBhZ2UgaXMKK2Rpc3BsYXllZC4gU2VlIGxpbmtnaXQ6Z2l0LWhlbHBbMV0gZm9yIG1vcmUgaW5mb3JtYXRpb24sCitiZWNhdXNlICdnaXQgLS1oZWxwIC4uLicgaXMgY29udmVydGVkIGludGVybmFsbHkgaW50byAnZ2l0CitoZWxwIC4uLicuCisKKy0tZXhlYy1wYXRoOjoKKwlQYXRoIHRvIHdoZXJldmVyIHlvdXIgY29yZSBnaXQgcHJvZ3JhbXMgYXJlIGluc3RhbGxlZC4KKwlUaGlzIGNhbiBhbHNvIGJlIGNvbnRyb2xsZWQgYnkgc2V0dGluZyB0aGUgR0lUX0VYRUNfUEFUSAorCWVudmlyb25tZW50IHZhcmlhYmxlLiBJZiBubyBwYXRoIGlzIGdpdmVuICdnaXQnIHdpbGwgcHJpbnQKKwl0aGUgY3VycmVudCBzZXR0aW5nIGFuZCB0aGVuIGV4aXQuCisKKy1wfC0tcGFnaW5hdGU6OgorCVBpcGUgYWxsIG91dHB1dCBpbnRvICdsZXNzJyAob3IgaWYgc2V0LCAkUEFHRVIpLgorCistLW5vLXBhZ2VyOjoKKwlEbyBub3QgcGlwZSBnaXQgb3V0cHV0IGludG8gYSBwYWdlci4KKworLS1naXQtZGlyPTxwYXRoPjo6CisJU2V0IHRoZSBwYXRoIHRvIHRoZSByZXBvc2l0b3J5LiBUaGlzIGNhbiBhbHNvIGJlIGNvbnRyb2xsZWQgYnkKKwlzZXR0aW5nIHRoZSBHSVRfRElSIGVudmlyb25tZW50IHZhcmlhYmxlLgorCistLXdvcmstdHJlZT08cGF0aD46OgorCVNldCB0aGUgcGF0aCB0byB0aGUgd29ya2luZyB0cmVlLiAgVGhlIHZhbHVlIHdpbGwgbm90IGJlCisJdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIHJlcG9zaXRvcmllcyBmb3VuZCBhdXRvbWF0aWNhbGx5IGluCisJYSAuZ2l0IGRpcmVjdG9yeSAoaS5lLiAkR0lUX0RJUiBpcyBub3Qgc2V0KS4KKwlUaGlzIGNhbiBhbHNvIGJlIGNvbnRyb2xsZWQgYnkgc2V0dGluZyB0aGUgR0lUX1dPUktfVFJFRQorCWVudmlyb25tZW50IHZhcmlhYmxlIGFuZCB0aGUgY29yZS53b3JrdHJlZSBjb25maWd1cmF0aW9uCisJdmFyaWFibGUuCisKKy0tYmFyZTo6CisJVHJlYXQgdGhlIHJlcG9zaXRvcnkgYXMgYSBiYXJlIHJlcG9zaXRvcnkuICBJZiBHSVRfRElSCisJZW52aXJvbm1lbnQgaXMgbm90IHNldCwgaXQgaXMgc2V0IHRvIHRoZSBjdXJyZW50IHdvcmtpbmcKKwlkaXJlY3RvcnkuCisKKworRlVSVEhFUiBET0NVTUVOVEFUSU9OCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2VlIHRoZSByZWZlcmVuY2VzIGFib3ZlIHRvIGdldCBzdGFydGVkIHVzaW5nIGdpdC4gIFRoZSBmb2xsb3dpbmcgaXMKK3Byb2JhYmx5IG1vcmUgZGV0YWlsIHRoYW4gbmVjZXNzYXJ5IGZvciBhIGZpcnN0LXRpbWUgdXNlci4KKworVGhlIGxpbms6dXNlci1tYW51YWwuaHRtbCNnaXQtY29uY2VwdHNbZ2l0IGNvbmNlcHRzIGNoYXB0ZXIgb2YgdGhlCit1c2VyLW1hbnVhbF0gYW5kIHRoZSBsaW5rOmNvcmUtdHV0b3JpYWwuaHRtbFtDb3JlIHR1dG9yaWFsXSBib3RoIHByb3ZpZGUKK2ludHJvZHVjdGlvbnMgdG8gdGhlIHVuZGVybHlpbmcgZ2l0IGFyY2hpdGVjdHVyZS4KKworU2VlIGFsc28gdGhlIGxpbms6aG93dG8taW5kZXguaHRtbFtob3d0b10gZG9jdW1lbnRzIGZvciBzb21lIHVzZWZ1bAorZXhhbXBsZXMuCisKK1RoZSBpbnRlcm5hbHMgYXJlIGRvY3VtZW50ZWQgbGluazp0ZWNobmljYWwvYXBpLWluZGV4Lmh0bWxbaGVyZV0uCisKK0dJVCBDT01NQU5EUworLS0tLS0tLS0tLS0tCisKK1dlIGRpdmlkZSBnaXQgaW50byBoaWdoIGxldmVsICgicG9yY2VsYWluIikgY29tbWFuZHMgYW5kIGxvdyBsZXZlbAorKCJwbHVtYmluZyIpIGNvbW1hbmRzLgorCitIaWdoLWxldmVsIGNvbW1hbmRzIChwb3JjZWxhaW4pCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dlIHNlcGFyYXRlIHRoZSBwb3JjZWxhaW4gY29tbWFuZHMgaW50byB0aGUgbWFpbiBjb21tYW5kcyBhbmQgc29tZQorYW5jaWxsYXJ5IHVzZXIgdXRpbGl0aWVzLgorCitNYWluIHBvcmNlbGFpbiBjb21tYW5kcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworaW5jbHVkZTo6Y21kcy1tYWlucG9yY2VsYWluLnR4dFtdCisKK0FuY2lsbGFyeSBDb21tYW5kcworfn5+fn5+fn5+fn5+fn5+fn5+CitNYW5pcHVsYXRvcnM6CisKK2luY2x1ZGU6OmNtZHMtYW5jaWxsYXJ5bWFuaXB1bGF0b3JzLnR4dFtdCisKK0ludGVycm9nYXRvcnM6CisKK2luY2x1ZGU6OmNtZHMtYW5jaWxsYXJ5aW50ZXJyb2dhdG9ycy50eHRbXQorCisKK0ludGVyYWN0aW5nIHdpdGggT3RoZXJzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGVzZSBjb21tYW5kcyBhcmUgdG8gaW50ZXJhY3Qgd2l0aCBmb3JlaWduIFNDTSBhbmQgd2l0aCBvdGhlcgorcGVvcGxlIHZpYSBwYXRjaCBvdmVyIGUtbWFpbC4KKworaW5jbHVkZTo6Y21kcy1mb3JlaWduc2NtaW50ZXJmYWNlLnR4dFtdCisKKworTG93LWxldmVsIGNvbW1hbmRzIChwbHVtYmluZykKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FsdGhvdWdoIGdpdCBpbmNsdWRlcyBpdHMKK293biBwb3JjZWxhaW4gbGF5ZXIsIGl0cyBsb3ctbGV2ZWwgY29tbWFuZHMgYXJlIHN1ZmZpY2llbnQgdG8gc3VwcG9ydAorZGV2ZWxvcG1lbnQgb2YgYWx0ZXJuYXRpdmUgcG9yY2VsYWlucy4gIERldmVsb3BlcnMgb2Ygc3VjaCBwb3JjZWxhaW5zCittaWdodCBzdGFydCBieSByZWFkaW5nIGFib3V0IGxpbmtnaXQ6Z2l0LXVwZGF0ZS1pbmRleFsxXSBhbmQKK2xpbmtnaXQ6Z2l0LXJlYWQtdHJlZVsxXS4KKworVGhlIGludGVyZmFjZSAoaW5wdXQsIG91dHB1dCwgc2V0IG9mIG9wdGlvbnMgYW5kIHRoZSBzZW1hbnRpY3MpCit0byB0aGVzZSBsb3ctbGV2ZWwgY29tbWFuZHMgYXJlIG1lYW50IHRvIGJlIGEgbG90IG1vcmUgc3RhYmxlCit0aGFuIFBvcmNlbGFpbiBsZXZlbCBjb21tYW5kcywgYmVjYXVzZSB0aGVzZSBjb21tYW5kcyBhcmUKK3ByaW1hcmlseSBmb3Igc2NyaXB0ZWQgdXNlLiAgVGhlIGludGVyZmFjZSB0byBQb3JjZWxhaW4gY29tbWFuZHMKK29uIHRoZSBvdGhlciBoYW5kIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBpbiBvcmRlciB0byBpbXByb3ZlIHRoZQorZW5kIHVzZXIgZXhwZXJpZW5jZS4KKworVGhlIGZvbGxvd2luZyBkZXNjcmlwdGlvbiBkaXZpZGVzCit0aGUgbG93LWxldmVsIGNvbW1hbmRzIGludG8gY29tbWFuZHMgdGhhdCBtYW5pcHVsYXRlIG9iamVjdHMgKGluCit0aGUgcmVwb3NpdG9yeSwgaW5kZXgsIGFuZCB3b3JraW5nIHRyZWUpLCBjb21tYW5kcyB0aGF0IGludGVycm9nYXRlIGFuZAorY29tcGFyZSBvYmplY3RzLCBhbmQgY29tbWFuZHMgdGhhdCBtb3ZlIG9iamVjdHMgYW5kIHJlZmVyZW5jZXMgYmV0d2VlbgorcmVwb3NpdG9yaWVzLgorCisKK01hbmlwdWxhdGlvbiBjb21tYW5kcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK2luY2x1ZGU6OmNtZHMtcGx1bWJpbmdtYW5pcHVsYXRvcnMudHh0W10KKworCitJbnRlcnJvZ2F0aW9uIGNvbW1hbmRzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK2luY2x1ZGU6OmNtZHMtcGx1bWJpbmdpbnRlcnJvZ2F0b3JzLnR4dFtdCisKK0luIGdlbmVyYWwsIHRoZSBpbnRlcnJvZ2F0ZSBjb21tYW5kcyBkbyBub3QgdG91Y2ggdGhlIGZpbGVzIGluCit0aGUgd29ya2luZyB0cmVlLgorCisKK1N5bmNoaW5nIHJlcG9zaXRvcmllcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK2luY2x1ZGU6OmNtZHMtc3luY2hpbmdyZXBvc2l0b3JpZXMudHh0W10KKworVGhlIGZvbGxvd2luZyBhcmUgaGVscGVyIHByb2dyYW1zIHVzZWQgYnkgdGhlIGFib3ZlOyBlbmQgdXNlcnMKK3R5cGljYWxseSBkbyBub3QgdXNlIHRoZW0gZGlyZWN0bHkuCisKK2luY2x1ZGU6OmNtZHMtc3luY2hlbHBlcnMudHh0W10KKworCitJbnRlcm5hbCBoZWxwZXIgY29tbWFuZHMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGVzZSBhcmUgaW50ZXJuYWwgaGVscGVyIGNvbW1hbmRzIHVzZWQgYnkgb3RoZXIgY29tbWFuZHM7IGVuZAordXNlcnMgdHlwaWNhbGx5IGRvIG5vdCB1c2UgdGhlbSBkaXJlY3RseS4KKworaW5jbHVkZTo6Y21kcy1wdXJlaGVscGVycy50eHRbXQorCisKK0NvbmZpZ3VyYXRpb24gTWVjaGFuaXNtCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTdGFydGluZyBmcm9tIDAuOTkuOSAoYWN0dWFsbHkgbWlkIDAuOTkuOC5HSVQpLCBgLmdpdC9jb25maWdgIGZpbGUKK2lzIHVzZWQgdG8gaG9sZCBwZXItcmVwb3NpdG9yeSBjb25maWd1cmF0aW9uIG9wdGlvbnMuICBJdCBpcyBhCitzaW1wbGUgdGV4dCBmaWxlIG1vZGVsZWQgYWZ0ZXIgYC5pbmlgIGZvcm1hdCBmYW1pbGlhciB0byBzb21lCitwZW9wbGUuICBIZXJlIGlzIGFuIGV4YW1wbGU6CisKKy0tLS0tLS0tLS0tLQorIworIyBBICcjJyBvciAnOycgY2hhcmFjdGVyIGluZGljYXRlcyBhIGNvbW1lbnQuCisjCisKKzsgY29yZSB2YXJpYWJsZXMKK1tjb3JlXQorCTsgRG9uJ3QgdHJ1c3QgZmlsZSBtb2RlcworCWZpbGVtb2RlID0gZmFsc2UKKworOyB1c2VyIGlkZW50aXR5CitbdXNlcl0KKwluYW1lID0gIkp1bmlvIEMgSGFtYW5vIgorCWVtYWlsID0gImp1bmtpb0B0d2luc3VuLmNvbSIKKworLS0tLS0tLS0tLS0tCisKK1ZhcmlvdXMgY29tbWFuZHMgcmVhZCBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgYW5kIGFkanVzdAordGhlaXIgb3BlcmF0aW9uIGFjY29yZGluZ2x5LgorCisKK0lkZW50aWZpZXIgVGVybWlub2xvZ3kKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzxvYmplY3Q+OjoKKwlJbmRpY2F0ZXMgdGhlIG9iamVjdCBuYW1lIGZvciBhbnkgdHlwZSBvZiBvYmplY3QuCisKKzxibG9iPjo6CisJSW5kaWNhdGVzIGEgYmxvYiBvYmplY3QgbmFtZS4KKworPHRyZWU+OjoKKwlJbmRpY2F0ZXMgYSB0cmVlIG9iamVjdCBuYW1lLgorCis8Y29tbWl0Pjo6CisJSW5kaWNhdGVzIGEgY29tbWl0IG9iamVjdCBuYW1lLgorCis8dHJlZS1pc2g+OjoKKwlJbmRpY2F0ZXMgYSB0cmVlLCBjb21taXQgb3IgdGFnIG9iamVjdCBuYW1lLiAgQQorCWNvbW1hbmQgdGhhdCB0YWtlcyBhIDx0cmVlLWlzaD4gYXJndW1lbnQgdWx0aW1hdGVseSB3YW50cyB0bworCW9wZXJhdGUgb24gYSA8dHJlZT4gb2JqZWN0IGJ1dCBhdXRvbWF0aWNhbGx5IGRlcmVmZXJlbmNlcworCTxjb21taXQ+IGFuZCA8dGFnPiBvYmplY3RzIHRoYXQgcG9pbnQgYXQgYSA8dHJlZT4uCisKKzxjb21taXQtaXNoPjo6CisJSW5kaWNhdGVzIGEgY29tbWl0IG9yIHRhZyBvYmplY3QgbmFtZS4gIEEKKwljb21tYW5kIHRoYXQgdGFrZXMgYSA8Y29tbWl0LWlzaD4gYXJndW1lbnQgdWx0aW1hdGVseSB3YW50cyB0bworCW9wZXJhdGUgb24gYSA8Y29tbWl0PiBvYmplY3QgYnV0IGF1dG9tYXRpY2FsbHkgZGVyZWZlcmVuY2VzCisJPHRhZz4gb2JqZWN0cyB0aGF0IHBvaW50IGF0IGEgPGNvbW1pdD4uCisKKzx0eXBlPjo6CisJSW5kaWNhdGVzIHRoYXQgYW4gb2JqZWN0IHR5cGUgaXMgcmVxdWlyZWQuCisJQ3VycmVudGx5IG9uZSBvZjogYGJsb2JgLCBgdHJlZWAsIGBjb21taXRgLCBvciBgdGFnYC4KKworPGZpbGU+OjoKKwlJbmRpY2F0ZXMgYSBmaWxlbmFtZSAtIGFsbW9zdCBhbHdheXMgcmVsYXRpdmUgdG8gdGhlCisJcm9vdCBvZiB0aGUgdHJlZSBzdHJ1Y3R1cmUgYEdJVF9JTkRFWF9GSUxFYCBkZXNjcmliZXMuCisKK1N5bWJvbGljIElkZW50aWZpZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLQorQW55IGdpdCBjb21tYW5kIGFjY2VwdGluZyBhbnkgPG9iamVjdD4gY2FuIGFsc28gdXNlIHRoZSBmb2xsb3dpbmcKK3N5bWJvbGljIG5vdGF0aW9uOgorCitIRUFEOjoKKwlpbmRpY2F0ZXMgdGhlIGhlYWQgb2YgdGhlIGN1cnJlbnQgYnJhbmNoIChpLmUuIHRoZQorCWNvbnRlbnRzIG9mIGAkR0lUX0RJUi9IRUFEYCkuCisKKzx0YWc+OjoKKwlhIHZhbGlkIHRhZyAnbmFtZScKKwkoaS5lLiB0aGUgY29udGVudHMgb2YgYCRHSVRfRElSL3JlZnMvdGFncy88dGFnPmApLgorCis8aGVhZD46OgorCWEgdmFsaWQgaGVhZCAnbmFtZScKKwkoaS5lLiB0aGUgY29udGVudHMgb2YgYCRHSVRfRElSL3JlZnMvaGVhZHMvPGhlYWQ+YCkuCisKK0ZvciBhIG1vcmUgY29tcGxldGUgbGlzdCBvZiB3YXlzIHRvIHNwZWxsIG9iamVjdCBuYW1lcywgc2VlCisiU1BFQ0lGWUlORyBSRVZJU0lPTlMiIHNlY3Rpb24gaW4gbGlua2dpdDpnaXQtcmV2LXBhcnNlWzFdLgorCisKK0ZpbGUvRGlyZWN0b3J5IFN0cnVjdHVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1BsZWFzZSBzZWUgdGhlIGxpbms6cmVwb3NpdG9yeS1sYXlvdXQuaHRtbFtyZXBvc2l0b3J5IGxheW91dF0gZG9jdW1lbnQuCisKK1JlYWQgbGluazpob29rcy5odG1sW2hvb2tzXSBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IGVhY2ggaG9vay4KKworSGlnaGVyIGxldmVsIFNDTXMgbWF5IHByb3ZpZGUgYW5kIG1hbmFnZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZQorYCRHSVRfRElSYC4KKworCitUZXJtaW5vbG9neQorLS0tLS0tLS0tLS0KK1BsZWFzZSBzZWUgdGhlIGxpbms6Z2xvc3NhcnkuaHRtbFtnbG9zc2FyeV0gZG9jdW1lbnQuCisKKworRW52aXJvbm1lbnQgVmFyaWFibGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1ZhcmlvdXMgZ2l0IGNvbW1hbmRzIHVzZSB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlczoKKworVGhlIGdpdCBSZXBvc2l0b3J5Cit+fn5+fn5+fn5+fn5+fn5+fn4KK1RoZXNlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcHBseSB0byAnYWxsJyBjb3JlIGdpdCBjb21tYW5kcy4gTmI6IGl0CitpcyB3b3J0aCBub3RpbmcgdGhhdCB0aGV5IG1heSBiZSB1c2VkL292ZXJyaWRkZW4gYnkgU0NNUyBzaXR0aW5nIGFib3ZlCitnaXQgc28gdGFrZSBjYXJlIGlmIHVzaW5nIENvZ2l0byBldGMuCisKKydHSVRfSU5ERVhfRklMRSc6OgorCVRoaXMgZW52aXJvbm1lbnQgYWxsb3dzIHRoZSBzcGVjaWZpY2F0aW9uIG9mIGFuIGFsdGVybmF0ZQorCWluZGV4IGZpbGUuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IG9mIGAkR0lUX0RJUi9pbmRleGAKKwlpcyB1c2VkLgorCisnR0lUX09CSkVDVF9ESVJFQ1RPUlknOjoKKwlJZiB0aGUgb2JqZWN0IHN0b3JhZ2UgZGlyZWN0b3J5IGlzIHNwZWNpZmllZCB2aWEgdGhpcworCWVudmlyb25tZW50IHZhcmlhYmxlIHRoZW4gdGhlIHNoYTEgZGlyZWN0b3JpZXMgYXJlIGNyZWF0ZWQKKwl1bmRlcm5lYXRoIC0gb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IGAkR0lUX0RJUi9vYmplY3RzYAorCWRpcmVjdG9yeSBpcyB1c2VkLgorCisnR0lUX0FMVEVSTkFURV9PQkpFQ1RfRElSRUNUT1JJRVMnOjoKKwlEdWUgdG8gdGhlIGltbXV0YWJsZSBuYXR1cmUgb2YgZ2l0IG9iamVjdHMsIG9sZCBvYmplY3RzIGNhbiBiZQorCWFyY2hpdmVkIGludG8gc2hhcmVkLCByZWFkLW9ubHkgZGlyZWN0b3JpZXMuIFRoaXMgdmFyaWFibGUKKwlzcGVjaWZpZXMgYSAiOiIgc2VwYXJhdGVkIGxpc3Qgb2YgZ2l0IG9iamVjdCBkaXJlY3RvcmllcyB3aGljaAorCWNhbiBiZSB1c2VkIHRvIHNlYXJjaCBmb3IgZ2l0IG9iamVjdHMuIE5ldyBvYmplY3RzIHdpbGwgbm90IGJlCisJd3JpdHRlbiB0byB0aGVzZSBkaXJlY3Rvcmllcy4KKworJ0dJVF9ESVInOjoKKwlJZiB0aGUgJ0dJVF9ESVInIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCB0aGVuIGl0CisJc3BlY2lmaWVzIGEgcGF0aCB0byB1c2UgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBgLmdpdGAKKwlmb3IgdGhlIGJhc2Ugb2YgdGhlIHJlcG9zaXRvcnkuCisKKydHSVRfV09SS19UUkVFJzo6CisJU2V0IHRoZSBwYXRoIHRvIHRoZSB3b3JraW5nIHRyZWUuICBUaGUgdmFsdWUgd2lsbCBub3QgYmUKKwl1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggcmVwb3NpdG9yaWVzIGZvdW5kIGF1dG9tYXRpY2FsbHkgaW4KKwlhIC5naXQgZGlyZWN0b3J5IChpLmUuICRHSVRfRElSIGlzIG5vdCBzZXQpLgorCVRoaXMgY2FuIGFsc28gYmUgY29udHJvbGxlZCBieSB0aGUgJy0td29yay10cmVlJyBjb21tYW5kIGxpbmUKKwlvcHRpb24gYW5kIHRoZSBjb3JlLndvcmt0cmVlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUuCisKK2dpdCBDb21taXRzCit+fn5+fn5+fn5+fgorJ0dJVF9BVVRIT1JfTkFNRSc6OgorJ0dJVF9BVVRIT1JfRU1BSUwnOjoKKydHSVRfQVVUSE9SX0RBVEUnOjoKKydHSVRfQ09NTUlUVEVSX05BTUUnOjoKKydHSVRfQ09NTUlUVEVSX0VNQUlMJzo6CisnR0lUX0NPTU1JVFRFUl9EQVRFJzo6CisnRU1BSUwnOjoKKwlzZWUgbGlua2dpdDpnaXQtY29tbWl0LXRyZWVbMV0KKworZ2l0IERpZmZzCit+fn5+fn5+fn4KKydHSVRfRElGRl9PUFRTJzo6CisJT25seSB2YWxpZCBzZXR0aW5nIGlzICItLXVuaWZpZWQ9Pz8iIG9yICItdT8/IiB0byBzZXQgdGhlCisJbnVtYmVyIG9mIGNvbnRleHQgbGluZXMgc2hvd24gd2hlbiBhIHVuaWZpZWQgZGlmZiBpcyBjcmVhdGVkLgorCVRoaXMgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGFueSAiLVUiIG9yICItLXVuaWZpZWQiIG9wdGlvbgorCXZhbHVlIHBhc3NlZCBvbiB0aGUgZ2l0IGRpZmYgY29tbWFuZCBsaW5lLgorCisnR0lUX0VYVEVSTkFMX0RJRkYnOjoKKwlXaGVuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAnR0lUX0VYVEVSTkFMX0RJRkYnIGlzIHNldCwgdGhlCisJcHJvZ3JhbSBuYW1lZCBieSBpdCBpcyBjYWxsZWQsIGluc3RlYWQgb2YgdGhlIGRpZmYgaW52b2NhdGlvbgorCWRlc2NyaWJlZCBhYm92ZS4gIEZvciBhIHBhdGggdGhhdCBpcyBhZGRlZCwgcmVtb3ZlZCwgb3IgbW9kaWZpZWQsCisgICAgICAgICdHSVRfRVhURVJOQUxfRElGRicgaXMgY2FsbGVkIHdpdGggNyBwYXJhbWV0ZXJzOgorCisJcGF0aCBvbGQtZmlsZSBvbGQtaGV4IG9sZC1tb2RlIG5ldy1maWxlIG5ldy1oZXggbmV3LW1vZGUKKysKK3doZXJlOgorCisJPG9sZHxuZXc+LWZpbGU6OiBhcmUgZmlsZXMgR0lUX0VYVEVSTkFMX0RJRkYgY2FuIHVzZSB0byByZWFkIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzIG9mIDxvbGR8bmV3PiwKKwk8b2xkfG5ldz4taGV4OjogYXJlIHRoZSA0MC1oZXhkaWdpdCBTSEExIGhhc2hlcywKKwk8b2xkfG5ldz4tbW9kZTo6IGFyZSB0aGUgb2N0YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZpbGUgbW9kZXMuCisKKysKK1RoZSBmaWxlIHBhcmFtZXRlcnMgY2FuIHBvaW50IGF0IHRoZSB1c2VyJ3Mgd29ya2luZyBmaWxlCisoZS5nLiBgbmV3LWZpbGVgIGluICJnaXQtZGlmZi1maWxlcyIpLCBgL2Rldi9udWxsYCAoZS5nLiBgb2xkLWZpbGVgCit3aGVuIGEgbmV3IGZpbGUgaXMgYWRkZWQpLCBvciBhIHRlbXBvcmFyeSBmaWxlIChlLmcuIGBvbGQtZmlsZWAgaW4gdGhlCitpbmRleCkuICAnR0lUX0VYVEVSTkFMX0RJRkYnIHNob3VsZCBub3Qgd29ycnkgYWJvdXQgdW5saW5raW5nIHRoZQordGVtcG9yYXJ5IGZpbGUgLS0tIGl0IGlzIHJlbW92ZWQgd2hlbiAnR0lUX0VYVEVSTkFMX0RJRkYnIGV4aXRzLgorKworRm9yIGEgcGF0aCB0aGF0IGlzIHVubWVyZ2VkLCAnR0lUX0VYVEVSTkFMX0RJRkYnIGlzIGNhbGxlZCB3aXRoIDEKK3BhcmFtZXRlciwgPHBhdGg+LgorCitvdGhlcgorfn5+fn4KKydHSVRfTUVSR0VfVkVSQk9TSVRZJzo6CisJQSBudW1iZXIgY29udHJvbGxpbmcgdGhlIGFtb3VudCBvZiBvdXRwdXQgc2hvd24gYnkKKwl0aGUgcmVjdXJzaXZlIG1lcmdlIHN0cmF0ZWd5LiAgT3ZlcnJpZGVzIG1lcmdlLnZlcmJvc2l0eS4KKwlTZWUgbGlua2dpdDpnaXQtbWVyZ2VbMV0KKworJ0dJVF9QQUdFUic6OgorCVRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgb3ZlcnJpZGVzIGAkUEFHRVJgLiBJZiBpdCBpcyBzZXQKKwl0byBhbiBlbXB0eSBzdHJpbmcgb3IgdG8gdGhlIHZhbHVlICJjYXQiLCBnaXQgd2lsbCBub3QgbGF1bmNoCisJYSBwYWdlci4KKworJ0dJVF9TU0gnOjoKKwlJZiB0aGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCB0aGVuIGxpbmtnaXQ6Z2l0LWZldGNoWzFdCisJYW5kIGxpbmtnaXQ6Z2l0LXB1c2hbMV0gd2lsbCB1c2UgdGhpcyBjb21tYW5kIGluc3RlYWQKKwlvZiBgc3NoYCB3aGVuIHRoZXkgbmVlZCB0byBjb25uZWN0IHRvIGEgcmVtb3RlIHN5c3RlbS4KKwlUaGUgJ0dJVF9TU0gnIGNvbW1hbmQgd2lsbCBiZSBnaXZlbiBleGFjdGx5IHR3byBhcmd1bWVudHM6CisJdGhlICd1c2VybmFtZUBob3N0JyAob3IganVzdCAnaG9zdCcpIGZyb20gdGhlIFVSTCBhbmQgdGhlCisJc2hlbGwgY29tbWFuZCB0byBleGVjdXRlIG9uIHRoYXQgcmVtb3RlIHN5c3RlbS4KKysKK1RvIHBhc3Mgb3B0aW9ucyB0byB0aGUgcHJvZ3JhbSB0aGF0IHlvdSB3YW50IHRvIGxpc3QgaW4gR0lUX1NTSAoreW91IHdpbGwgbmVlZCB0byB3cmFwIHRoZSBwcm9ncmFtIGFuZCBvcHRpb25zIGludG8gYSBzaGVsbCBzY3JpcHQsCit0aGVuIHNldCBHSVRfU1NIIHRvIHJlZmVyIHRvIHRoZSBzaGVsbCBzY3JpcHQuCisrCitVc3VhbGx5IGl0IGlzIGVhc2llciB0byBjb25maWd1cmUgYW55IGRlc2lyZWQgb3B0aW9ucyB0aHJvdWdoIHlvdXIKK3BlcnNvbmFsIGAuc3NoL2NvbmZpZ2AgZmlsZS4gIFBsZWFzZSBjb25zdWx0IHlvdXIgc3NoIGRvY3VtZW50YXRpb24KK2ZvciBmdXJ0aGVyIGRldGFpbHMuCisKKydHSVRfRkxVU0gnOjoKKwlJZiB0aGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCB0byAiMSIsIHRoZW4gY29tbWFuZHMgc3VjaAorCWFzIGdpdC1ibGFtZSAoaW4gaW5jcmVtZW50YWwgbW9kZSksIGdpdC1yZXYtbGlzdCwgZ2l0LWxvZywKKwlnaXQtd2hhdGNoYW5nZWQsIGV0Yy4sIHdpbGwgZm9yY2UgYSBmbHVzaCBvZiB0aGUgb3V0cHV0IHN0cmVhbQorCWFmdGVyIGVhY2ggY29tbWl0LW9yaWVudGVkIHJlY29yZCBoYXZlIGJlZW4gZmx1c2hlZC4gICBJZiB0aGlzCisJdmFyaWFibGUgaXMgc2V0IHRvICIwIiwgdGhlIG91dHB1dCBvZiB0aGVzZSBjb21tYW5kcyB3aWxsIGJlIGRvbmUKKwl1c2luZyBjb21wbGV0ZWx5IGJ1ZmZlcmVkIEkvTy4gICBJZiB0aGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzCisJbm90IHNldCwgZ2l0IHdpbGwgY2hvb3NlIGJ1ZmZlcmVkIG9yIHJlY29yZC1vcmllbnRlZCBmbHVzaGluZworCWJhc2VkIG9uIHdoZXRoZXIgc3Rkb3V0IGFwcGVhcnMgdG8gYmUgcmVkaXJlY3RlZCB0byBhIGZpbGUgb3Igbm90LgorCisnR0lUX1RSQUNFJzo6CisJSWYgdGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gIjEiLCAiMiIgb3IgInRydWUiIChjb21wYXJpc29uCisJaXMgY2FzZSBpbnNlbnNpdGl2ZSksIGdpdCB3aWxsIHByaW50IGB0cmFjZTpgIG1lc3NhZ2VzIG9uCisJc3RkZXJyIHRlbGxpbmcgYWJvdXQgYWxpYXMgZXhwYW5zaW9uLCBidWlsdC1pbiBjb21tYW5kCisJZXhlY3V0aW9uIGFuZCBleHRlcm5hbCBjb21tYW5kIGV4ZWN1dGlvbi4KKwlJZiB0aGlzIHZhcmlhYmxlIGlzIHNldCB0byBhbiBpbnRlZ2VyIHZhbHVlIGdyZWF0ZXIgdGhhbiAxCisJYW5kIGxvd2VyIHRoYW4gMTAgKHN0cmljdGx5KSB0aGVuIGdpdCB3aWxsIGludGVycHJldCB0aGlzCisJdmFsdWUgYXMgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IgYW5kIHdpbGwgdHJ5IHRvIHdyaXRlIHRoZQorCXRyYWNlIG1lc3NhZ2VzIGludG8gdGhpcyBmaWxlIGRlc2NyaXB0b3IuCisJQWx0ZXJuYXRpdmVseSwgaWYgdGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gYW4gYWJzb2x1dGUgcGF0aAorCShzdGFydGluZyB3aXRoIGEgJy8nIGNoYXJhY3RlciksIGdpdCB3aWxsIGludGVycHJldCB0aGlzCisJYXMgYSBmaWxlIHBhdGggYW5kIHdpbGwgdHJ5IHRvIHdyaXRlIHRoZSB0cmFjZSBtZXNzYWdlcworCWludG8gaXQuCisKK0Rpc2N1c3Npb25bW0Rpc2N1c3Npb25dXQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01vcmUgZGV0YWlsIG9uIHRoZSBmb2xsb3dpbmcgaXMgYXZhaWxhYmxlIGZyb20gdGhlCitsaW5rOnVzZXItbWFudWFsLmh0bWwjZ2l0LWNvbmNlcHRzW2dpdCBjb25jZXB0cyBjaGFwdGVyIG9mIHRoZQordXNlci1tYW51YWxdIGFuZCB0aGUgbGluazpjb3JlLXR1dG9yaWFsLmh0bWxbQ29yZSB0dXRvcmlhbF0uCisKK0EgZ2l0IHByb2plY3Qgbm9ybWFsbHkgY29uc2lzdHMgb2YgYSB3b3JraW5nIGRpcmVjdG9yeSB3aXRoIGEgIi5naXQiCitzdWJkaXJlY3RvcnkgYXQgdGhlIHRvcCBsZXZlbC4gIFRoZSAuZ2l0IGRpcmVjdG9yeSBjb250YWlucywgYW1vbmcgb3RoZXIKK3RoaW5ncywgYSBjb21wcmVzc2VkIG9iamVjdCBkYXRhYmFzZSByZXByZXNlbnRpbmcgdGhlIGNvbXBsZXRlIGhpc3RvcnkKK29mIHRoZSBwcm9qZWN0LCBhbiAiaW5kZXgiIGZpbGUgd2hpY2ggbGlua3MgdGhhdCBoaXN0b3J5IHRvIHRoZSBjdXJyZW50Citjb250ZW50cyBvZiB0aGUgd29ya2luZyB0cmVlLCBhbmQgbmFtZWQgcG9pbnRlcnMgaW50byB0aGF0IGhpc3Rvcnkgc3VjaAorYXMgdGFncyBhbmQgYnJhbmNoIGhlYWRzLgorCitUaGUgb2JqZWN0IGRhdGFiYXNlIGNvbnRhaW5zIG9iamVjdHMgb2YgdGhyZWUgbWFpbiB0eXBlczogYmxvYnMsIHdoaWNoCitob2xkIGZpbGUgZGF0YTsgdHJlZXMsIHdoaWNoIHBvaW50IHRvIGJsb2JzIGFuZCBvdGhlciB0cmVlcyB0byBidWlsZCB1cAorZGlyZWN0b3J5IGhpZXJhcmNoaWVzOyBhbmQgY29tbWl0cywgd2hpY2ggZWFjaCByZWZlcmVuY2UgYSBzaW5nbGUgdHJlZQorYW5kIHNvbWUgbnVtYmVyIG9mIHBhcmVudCBjb21taXRzLgorCitUaGUgY29tbWl0LCBlcXVpdmFsZW50IHRvIHdoYXQgb3RoZXIgc3lzdGVtcyBjYWxsIGEgImNoYW5nZXNldCIgb3IKKyJ2ZXJzaW9uIiwgcmVwcmVzZW50cyBhIHN0ZXAgaW4gdGhlIHByb2plY3QncyBoaXN0b3J5LCBhbmQgZWFjaCBwYXJlbnQKK3JlcHJlc2VudHMgYW4gaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHN0ZXAuICBDb21taXRzIHdpdGggbW9yZSB0aGFuIG9uZQorcGFyZW50IHJlcHJlc2VudCBtZXJnZXMgb2YgaW5kZXBlbmRlbnQgbGluZXMgb2YgZGV2ZWxvcG1lbnQuCisKK0FsbCBvYmplY3RzIGFyZSBuYW1lZCBieSB0aGUgU0hBMSBoYXNoIG9mIHRoZWlyIGNvbnRlbnRzLCBub3JtYWxseQord3JpdHRlbiBhcyBhIHN0cmluZyBvZiA0MCBoZXggZGlnaXRzLiAgU3VjaCBuYW1lcyBhcmUgZ2xvYmFsbHkgdW5pcXVlLgorVGhlIGVudGlyZSBoaXN0b3J5IGxlYWRpbmcgdXAgdG8gYSBjb21taXQgY2FuIGJlIHZvdWNoZWQgZm9yIGJ5IHNpZ25pbmcKK2p1c3QgdGhhdCBjb21taXQuICBBIGZvdXJ0aCBvYmplY3QgdHlwZSwgdGhlIHRhZywgaXMgcHJvdmlkZWQgZm9yIHRoaXMKK3B1cnBvc2UuCisKK1doZW4gZmlyc3QgY3JlYXRlZCwgb2JqZWN0cyBhcmUgc3RvcmVkIGluIGluZGl2aWR1YWwgZmlsZXMsIGJ1dCBmb3IKK2VmZmljaWVuY3kgbWF5IGxhdGVyIGJlIGNvbXByZXNzZWQgdG9nZXRoZXIgaW50byAicGFjayBmaWxlcyIuCisKK05hbWVkIHBvaW50ZXJzIGNhbGxlZCByZWZzIG1hcmsgaW50ZXJlc3RpbmcgcG9pbnRzIGluIGhpc3RvcnkuICBBIHJlZgorbWF5IGNvbnRhaW4gdGhlIFNIQTEgbmFtZSBvZiBhbiBvYmplY3Qgb3IgdGhlIG5hbWUgb2YgYW5vdGhlciByZWYuICBSZWZzCit3aXRoIG5hbWVzIGJlZ2lubmluZyBgcmVmL2hlYWQvYCBjb250YWluIHRoZSBTSEExIG5hbWUgb2YgdGhlIG1vc3QKK3JlY2VudCBjb21taXQgKG9yICJoZWFkIikgb2YgYSBicmFuY2ggdW5kZXIgZGV2ZWxvcG1lbnQuICBTSEExIG5hbWVzIG9mCit0YWdzIG9mIGludGVyZXN0IGFyZSBzdG9yZWQgdW5kZXIgYHJlZi90YWdzL2AuICBBIHNwZWNpYWwgcmVmIG5hbWVkCitgSEVBRGAgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBjaGVja2VkLW91dCBicmFuY2guCisKK1RoZSBpbmRleCBmaWxlIGlzIGluaXRpYWxpemVkIHdpdGggYSBsaXN0IG9mIGFsbCBwYXRocyBhbmQsIGZvciBlYWNoCitwYXRoLCBhIGJsb2Igb2JqZWN0IGFuZCBhIHNldCBvZiBhdHRyaWJ1dGVzLiAgVGhlIGJsb2Igb2JqZWN0IHJlcHJlc2VudHMKK3RoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBhcyBvZiB0aGUgaGVhZCBvZiB0aGUgY3VycmVudCBicmFuY2guICBUaGUKK2F0dHJpYnV0ZXMgKGxhc3QgbW9kaWZpZWQgdGltZSwgc2l6ZSwgZXRjLikgYXJlIHRha2VuIGZyb20gdGhlCitjb3JyZXNwb25kaW5nIGZpbGUgaW4gdGhlIHdvcmtpbmcgdHJlZS4gIFN1YnNlcXVlbnQgY2hhbmdlcyB0byB0aGUKK3dvcmtpbmcgdHJlZSBjYW4gYmUgZm91bmQgYnkgY29tcGFyaW5nIHRoZXNlIGF0dHJpYnV0ZXMuICBUaGUgaW5kZXggbWF5CitiZSB1cGRhdGVkIHdpdGggbmV3IGNvbnRlbnQsIGFuZCBuZXcgY29tbWl0cyBtYXkgYmUgY3JlYXRlZCBmcm9tIHRoZQorY29udGVudCBzdG9yZWQgaW4gdGhlIGluZGV4LgorCitUaGUgaW5kZXggaXMgYWxzbyBjYXBhYmxlIG9mIHN0b3JpbmcgbXVsdGlwbGUgZW50cmllcyAoY2FsbGVkICJzdGFnZXMiKQorZm9yIGEgZ2l2ZW4gcGF0aG5hbWUuICBUaGVzZSBzdGFnZXMgYXJlIHVzZWQgdG8gaG9sZCB0aGUgdmFyaW91cwordW5tZXJnZWQgdmVyc2lvbiBvZiBhIGZpbGUgd2hlbiBhIG1lcmdlIGlzIGluIHByb2dyZXNzLgorCitBdXRob3JzCistLS0tLS0tCisqIGdpdCdzIGZvdW5kaW5nIGZhdGhlciBpcyBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+LgorKiBUaGUgY3VycmVudCBnaXQgbnVyc2UgaXMgSnVuaW8gQyBIYW1hbm8gPGdpdHN0ZXJAcG9ib3guY29tPi4KKyogVGhlIGdpdCBwb3R0eSB3YXMgd3JpdHRlbiBieSBBbmRyZWFzIEVyaWNzc29uIDxhZUBvcDUuc2U+LgorKiBHZW5lcmFsIHVwYnJpbmdpbmcgaXMgaGFuZGxlZCBieSB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorVGhlIGRvY3VtZW50YXRpb24gZm9yIGdpdCBzdWl0ZSB3YXMgc3RhcnRlZCBieSBEYXZpZCBHcmVhdmVzCis8ZGF2aWRAZGdyZWF2ZXMuY29tPiwgYW5kIGxhdGVyIGVuaGFuY2VkIGdyZWF0bHkgYnkgdGhlCitjb250cmlidXRvcnMgb24gdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdGF0dHJpYnV0ZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9naXRhdHRyaWJ1dGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGNhNjNjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXRhdHRyaWJ1dGVzLnR4dApAQCAtMCwwICsxLDUyMSBAQAorZ2l0YXR0cmlidXRlcyg1KQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXRhdHRyaWJ1dGVzIC0gZGVmaW5pbmcgYXR0cmlidXRlcyBwZXIgcGF0aAorCitTWU5PUFNJUworLS0tLS0tLS0KKyRHSVRfRElSL2luZm8vYXR0cmlidXRlcywgZ2l0YXR0cmlidXRlcworCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitBIGBnaXRhdHRyaWJ1dGVzYCBmaWxlIGlzIGEgc2ltcGxlIHRleHQgZmlsZSB0aGF0IGdpdmVzCitgYXR0cmlidXRlc2AgdG8gcGF0aG5hbWVzLgorCitFYWNoIGxpbmUgaW4gYGdpdGF0dHJpYnV0ZXNgIGZpbGUgaXMgb2YgZm9ybToKKworCWdsb2IJYXR0cjEgYXR0cjIgLi4uCisKK1RoYXQgaXMsIGEgZ2xvYiBwYXR0ZXJuIGZvbGxvd2VkIGJ5IGFuIGF0dHJpYnV0ZXMgbGlzdCwKK3NlcGFyYXRlZCBieSB3aGl0ZXNwYWNlcy4gIFdoZW4gdGhlIGdsb2IgcGF0dGVybiBtYXRjaGVzIHRoZQorcGF0aCBpbiBxdWVzdGlvbiwgdGhlIGF0dHJpYnV0ZXMgbGlzdGVkIG9uIHRoZSBsaW5lIGFyZSBnaXZlbiB0bwordGhlIHBhdGguCisKK0VhY2ggYXR0cmlidXRlIGNhbiBiZSBpbiBvbmUgb2YgdGhlc2Ugc3RhdGVzIGZvciBhIGdpdmVuIHBhdGg6CisKK1NldDo6CisKKwlUaGUgcGF0aCBoYXMgdGhlIGF0dHJpYnV0ZSB3aXRoIHNwZWNpYWwgdmFsdWUgInRydWUiOworCXRoaXMgaXMgc3BlY2lmaWVkIGJ5IGxpc3Rpbmcgb25seSB0aGUgbmFtZSBvZiB0aGUKKwlhdHRyaWJ1dGUgaW4gdGhlIGF0dHJpYnV0ZSBsaXN0LgorCitVbnNldDo6CisKKwlUaGUgcGF0aCBoYXMgdGhlIGF0dHJpYnV0ZSB3aXRoIHNwZWNpYWwgdmFsdWUgImZhbHNlIjsKKwl0aGlzIGlzIHNwZWNpZmllZCBieSBsaXN0aW5nIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKKwlwcmVmaXhlZCB3aXRoIGEgZGFzaCBgLWAgaW4gdGhlIGF0dHJpYnV0ZSBsaXN0LgorCitTZXQgdG8gYSB2YWx1ZTo6CisKKwlUaGUgcGF0aCBoYXMgdGhlIGF0dHJpYnV0ZSB3aXRoIHNwZWNpZmllZCBzdHJpbmcgdmFsdWU7CisJdGhpcyBpcyBzcGVjaWZpZWQgYnkgbGlzdGluZyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCisJZm9sbG93ZWQgYnkgYW4gZXF1YWwgc2lnbiBgPWAgYW5kIGl0cyB2YWx1ZSBpbiB0aGUKKwlhdHRyaWJ1dGUgbGlzdC4KKworVW5zcGVjaWZpZWQ6OgorCisJTm8gZ2xvYiBwYXR0ZXJuIG1hdGNoZXMgdGhlIHBhdGgsIGFuZCBub3RoaW5nIHNheXMgaWYKKwl0aGUgcGF0aCBoYXMgb3IgZG9lcyBub3QgaGF2ZSB0aGUgYXR0cmlidXRlLCB0aGUKKwlhdHRyaWJ1dGUgZm9yIHRoZSBwYXRoIGlzIHNhaWQgdG8gYmUgVW5zcGVjaWZpZWQuCisKK1doZW4gbW9yZSB0aGFuIG9uZSBnbG9iIHBhdHRlcm4gbWF0Y2hlcyB0aGUgcGF0aCwgYSBsYXRlciBsaW5lCitvdmVycmlkZXMgYW4gZWFybGllciBsaW5lLiAgVGhpcyBvdmVycmlkaW5nIGlzIGRvbmUgcGVyCithdHRyaWJ1dGUuCisKK1doZW4gZGVjaWRpbmcgd2hhdCBhdHRyaWJ1dGVzIGFyZSBhc3NpZ25lZCB0byBhIHBhdGgsIGdpdAorY29uc3VsdHMgYCRHSVRfRElSL2luZm8vYXR0cmlidXRlc2AgZmlsZSAod2hpY2ggaGFzIHRoZSBoaWdoZXN0CitwcmVjZWRlbmNlKSwgYC5naXRhdHRyaWJ1dGVzYCBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUKK3BhdGggaW4gcXVlc3Rpb24sIGFuZCBpdHMgcGFyZW50IGRpcmVjdG9yaWVzICh0aGUgZnVydGhlciB0aGUKK2RpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGAuZ2l0YXR0cmlidXRlc2AgaXMgZnJvbSB0aGUgcGF0aCBpbgorcXVlc3Rpb24sIHRoZSBsb3dlciBpdHMgcHJlY2VkZW5jZSkuCisKK0lmIHlvdSB3aXNoIHRvIGFmZmVjdCBvbmx5IGEgc2luZ2xlIHJlcG9zaXRvcnkgKGkuZS4sIHRvIGFzc2lnbgorYXR0cmlidXRlcyB0byBmaWxlcyB0aGF0IGFyZSBwYXJ0aWN1bGFyIHRvIG9uZSB1c2VyJ3Mgd29ya2Zsb3cpLCB0aGVuCithdHRyaWJ1dGVzIHNob3VsZCBiZSBwbGFjZWQgaW4gdGhlIGAkR0lUX0RJUi9pbmZvL2F0dHJpYnV0ZXNgIGZpbGUuCitBdHRyaWJ1dGVzIHdoaWNoIHNob3VsZCBiZSB2ZXJzaW9uLWNvbnRyb2xsZWQgYW5kIGRpc3RyaWJ1dGVkIHRvIG90aGVyCityZXBvc2l0b3JpZXMgKGkuZS4sIGF0dHJpYnV0ZXMgb2YgaW50ZXJlc3QgdG8gYWxsIHVzZXJzKSBzaG91bGQgZ28gaW50bworYC5naXRhdHRyaWJ1dGVzYCBmaWxlcy4KKworU29tZXRpbWVzIHlvdSB3b3VsZCBuZWVkIHRvIG92ZXJyaWRlIGFuIHNldHRpbmcgb2YgYW4gYXR0cmlidXRlCitmb3IgYSBwYXRoIHRvIGB1bnNwZWNpZmllZGAgc3RhdGUuICBUaGlzIGNhbiBiZSBkb25lIGJ5IGxpc3RpbmcKK3RoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgcHJlZml4ZWQgd2l0aCBhbiBleGNsYW1hdGlvbiBwb2ludCBgIWAuCisKKworRUZGRUNUUworLS0tLS0tLQorCitDZXJ0YWluIG9wZXJhdGlvbnMgYnkgZ2l0IGNhbiBiZSBpbmZsdWVuY2VkIGJ5IGFzc2lnbmluZworcGFydGljdWxhciBhdHRyaWJ1dGVzIHRvIGEgcGF0aC4gIEN1cnJlbnRseSwgdGhlIGZvbGxvd2luZworb3BlcmF0aW9ucyBhcmUgYXR0cmlidXRlcy1hd2FyZS4KKworQ2hlY2tpbmctb3V0IGFuZCBjaGVja2luZy1pbgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGVzZSBhdHRyaWJ1dGVzIGFmZmVjdCBob3cgdGhlIGNvbnRlbnRzIHN0b3JlZCBpbiB0aGUKK3JlcG9zaXRvcnkgYXJlIGNvcGllZCB0byB0aGUgd29ya2luZyB0cmVlIGZpbGVzIHdoZW4gY29tbWFuZHMKK3N1Y2ggYXMgYGdpdCBjaGVja291dGAgYW5kIGBnaXQgbWVyZ2VgIHJ1bi4gIFRoZXkgYWxzbyBhZmZlY3QgaG93CitnaXQgc3RvcmVzIHRoZSBjb250ZW50cyB5b3UgcHJlcGFyZSBpbiB0aGUgd29ya2luZyB0cmVlIGluIHRoZQorcmVwb3NpdG9yeSB1cG9uIGBnaXQgYWRkYCBhbmQgYGdpdCBjb21taXRgLgorCitgY3JsZmAKK15eXl5eXgorCitUaGlzIGF0dHJpYnV0ZSBjb250cm9scyB0aGUgbGluZS1lbmRpbmcgY29udmVudGlvbi4KKworU2V0OjoKKworCVNldHRpbmcgdGhlIGBjcmxmYCBhdHRyaWJ1dGUgb24gYSBwYXRoIGlzIG1lYW50IHRvIG1hcmsKKwl0aGUgcGF0aCBhcyBhICJ0ZXh0IiBmaWxlLiAgJ2NvcmUuYXV0b2NybGYnIGNvbnZlcnNpb24KKwl0YWtlcyBwbGFjZSB3aXRob3V0IGd1ZXNzaW5nIHRoZSBjb250ZW50IHR5cGUgYnkKKwlpbnNwZWN0aW9uLgorCitVbnNldDo6CisKKwlVbnNldHRpbmcgdGhlIGBjcmxmYCBhdHRyaWJ1dGUgb24gYSBwYXRoIGlzIG1lYW50IHRvCisJbWFyayB0aGUgcGF0aCBhcyBhICJiaW5hcnkiIGZpbGUuICBUaGUgcGF0aCBuZXZlciBnb2VzCisJdGhyb3VnaCBsaW5lIGVuZGluZ3MgY29udmVyc2lvbiB1cG9uIGNoZWNraW4vY2hlY2tvdXQuCisKK1Vuc3BlY2lmaWVkOjoKKworCVVuc3BlY2lmaWVkIGBjcmxmYCBhdHRyaWJ1dGUgdGVsbHMgZ2l0IHRvIGFwcGx5IHRoZQorCWBjb3JlLmF1dG9jcmxmYCBjb252ZXJzaW9uIHdoZW4gdGhlIGZpbGUgY29udGVudCBsb29rcworCWxpa2UgdGV4dC4KKworU2V0IHRvIHN0cmluZyB2YWx1ZSAiaW5wdXQiOjoKKworCVRoaXMgaXMgc2ltaWxhciB0byBzZXR0aW5nIHRoZSBhdHRyaWJ1dGUgdG8gYHRydWVgLCBidXQKKwlhbHNvIGZvcmNlcyBnaXQgdG8gYWN0IGFzIGlmIGBjb3JlLmF1dG9jcmxmYCBpcyBzZXQgdG8KKwlgaW5wdXRgIGZvciB0aGUgcGF0aC4KKworQW55IG90aGVyIHZhbHVlIHNldCB0byBgY3JsZmAgYXR0cmlidXRlIGlzIGlnbm9yZWQgYW5kIGdpdCBhY3RzCithcyBpZiB0aGUgYXR0cmlidXRlIGlzIGxlZnQgdW5zcGVjaWZpZWQuCisKKworVGhlIGBjb3JlLmF1dG9jcmxmYCBjb252ZXJzaW9uCiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKworSWYgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgYGNvcmUuYXV0b2NybGZgIGlzIGZhbHNlLCBubworY29udmVyc2lvbiBpcyBkb25lLgorCitXaGVuIGBjb3JlLmF1dG9jcmxmYCBpcyB0cnVlLCBpdCBtZWFucyB0aGF0IHRoZSBwbGF0Zm9ybSB3YW50cworQ1JMRiBsaW5lIGVuZGluZ3MgZm9yIGZpbGVzIGluIHRoZSB3b3JraW5nIHRyZWUsIGFuZCB5b3Ugd2FudCB0bworY29udmVydCB0aGVtIGJhY2sgdG8gdGhlIG5vcm1hbCBMRiBsaW5lIGVuZGluZ3Mgd2hlbiBjaGVja2luZworaW4gdG8gdGhlIHJlcG9zaXRvcnkuCisKK1doZW4gYGNvcmUuYXV0b2NybGZgIGlzIHNldCB0byAiaW5wdXQiLCBsaW5lIGVuZGluZ3MgYXJlCitjb252ZXJ0ZWQgdG8gTEYgdXBvbiBjaGVja2luLCBidXQgdGhlcmUgaXMgbm8gY29udmVyc2lvbiBkb25lCit1cG9uIGNoZWNrb3V0LgorCitJZiBgY29yZS5zYWZlY3JsZmAgaXMgc2V0IHRvICJ0cnVlIiBvciAid2FybiIsIGdpdCB2ZXJpZmllcyBpZgordGhlIGNvbnZlcnNpb24gaXMgcmV2ZXJzaWJsZSBmb3IgdGhlIGN1cnJlbnQgc2V0dGluZyBvZgorYGNvcmUuYXV0b2NybGZgLiAgRm9yICJ0cnVlIiwgZ2l0IHJlamVjdHMgaXJyZXZlcnNpYmxlCitjb252ZXJzaW9uczsgZm9yICJ3YXJuIiwgZ2l0IG9ubHkgcHJpbnRzIGEgd2FybmluZyBidXQgYWNjZXB0cworYW4gaXJyZXZlcnNpYmxlIGNvbnZlcnNpb24uICBUaGUgc2FmZXR5IHRyaWdnZXJzIHRvIHByZXZlbnQgc3VjaAorYSBjb252ZXJzaW9uIGRvbmUgdG8gdGhlIGZpbGVzIGluIHRoZSB3b3JrIHRyZWUsIGJ1dCB0aGVyZSBhcmUgYQorZmV3IGV4Y2VwdGlvbnMuICBFdmVuIHRob3VnaC4uLgorCistICJnaXQgYWRkIiBpdHNlbGYgZG9lcyBub3QgdG91Y2ggdGhlIGZpbGVzIGluIHRoZSB3b3JrIHRyZWUsIHRoZQorICBuZXh0IGNoZWNrb3V0IHdvdWxkLCBzbyB0aGUgc2FmZXR5IHRyaWdnZXJzOworCistICJnaXQgYXBwbHkiIHRvIHVwZGF0ZSBhIHRleHQgZmlsZSB3aXRoIGEgcGF0Y2ggZG9lcyB0b3VjaCB0aGUgZmlsZXMKKyAgaW4gdGhlIHdvcmsgdHJlZSwgYnV0IHRoZSBvcGVyYXRpb24gaXMgYWJvdXQgdGV4dCBmaWxlcyBhbmQgQ1JMRgorICBjb252ZXJzaW9uIGlzIGFib3V0IGZpeGluZyB0aGUgbGluZSBlbmRpbmcgaW5jb25zaXN0ZW5jaWVzLCBzbyB0aGUKKyAgc2FmZXR5IGRvZXMgbm90IHRyaWdnZXI7CisKKy0gImdpdCBkaWZmIiBpdHNlbGYgZG9lcyBub3QgdG91Y2ggdGhlIGZpbGVzIGluIHRoZSB3b3JrIHRyZWUsIGl0IGlzCisgIG9mdGVuIHJ1biB0byBpbnNwZWN0IHRoZSBjaGFuZ2VzIHlvdSBpbnRlbmQgdG8gbmV4dCAiZ2l0IGFkZCIuICBUbworICBjYXRjaCBwb3RlbnRpYWwgcHJvYmxlbXMgZWFybHksIHNhZmV0eSB0cmlnZ2Vycy4KKworCitgaWRlbnRgCiteXl5eXl5eCisKK1doZW4gdGhlIGF0dHJpYnV0ZSBgaWRlbnRgIGlzIHNldCB0byBhIHBhdGgsIGdpdCByZXBsYWNlcworYCRJZCRgIGluIHRoZSBibG9iIG9iamVjdCB3aXRoIGAkSWQ6YCwgZm9sbG93ZWQgYnkKKzQwLWNoYXJhY3RlciBoZXhhZGVjaW1hbCBibG9iIG9iamVjdCBuYW1lLCBmb2xsb3dlZCBieSBhIGRvbGxhcgorc2lnbiBgJGAgdXBvbiBjaGVja291dC4gIEFueSBieXRlIHNlcXVlbmNlIHRoYXQgYmVnaW5zIHdpdGgKK2AkSWQ6YCBhbmQgZW5kcyB3aXRoIGAkYCBpbiB0aGUgd29ya3RyZWUgZmlsZSBpcyByZXBsYWNlZAord2l0aCBgJElkJGAgdXBvbiBjaGVjay1pbi4KKworCitgZmlsdGVyYAorXl5eXl5eXl4KKworQSBgZmlsdGVyYCBhdHRyaWJ1dGUgY2FuIGJlIHNldCB0byBhIHN0cmluZyB2YWx1ZSB0aGF0IG5hbWVzIGEKK2ZpbHRlciBkcml2ZXIgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uLgorCitBIGZpbHRlciBkcml2ZXIgY29uc2lzdHMgb2YgYSBgY2xlYW5gIGNvbW1hbmQgYW5kIGEgYHNtdWRnZWAKK2NvbW1hbmQsIGVpdGhlciBvZiB3aGljaCBjYW4gYmUgbGVmdCB1bnNwZWNpZmllZC4gIFVwb24KK2NoZWNrb3V0LCB3aGVuIHRoZSBgc211ZGdlYCBjb21tYW5kIGlzIHNwZWNpZmllZCwgdGhlIGNvbW1hbmQgaXMKK2ZlZCB0aGUgYmxvYiBvYmplY3QgZnJvbSBpdHMgc3RhbmRhcmQgaW5wdXQsIGFuZCBpdHMgc3RhbmRhcmQKK291dHB1dCBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgd29ya3RyZWUgZmlsZS4gIFNpbWlsYXJseSwgdGhlCitgY2xlYW5gIGNvbW1hbmQgaXMgdXNlZCB0byBjb252ZXJ0IHRoZSBjb250ZW50cyBvZiB3b3JrdHJlZSBmaWxlCit1cG9uIGNoZWNraW4uCisKK0EgbWlzc2luZyBmaWx0ZXIgZHJpdmVyIGRlZmluaXRpb24gaW4gdGhlIGNvbmZpZyBpcyBub3QgYW4gZXJyb3IKK2J1dCBtYWtlcyB0aGUgZmlsdGVyIGEgbm8tb3AgcGFzc3RocnUuCisKK1RoZSBjb250ZW50IGZpbHRlcmluZyBpcyBkb25lIHRvIG1hc3NhZ2UgdGhlIGNvbnRlbnQgaW50byBhCitzaGFwZSB0aGF0IGlzIG1vcmUgY29udmVuaWVudCBmb3IgdGhlIHBsYXRmb3JtLCBmaWxlc3lzdGVtLCBhbmQKK3RoZSB1c2VyIHRvIHVzZS4gIFRoZSBrZXkgcGhyYXNlIGhlcmUgaXMgIm1vcmUgY29udmVuaWVudCIgYW5kIG5vdAorInR1cm5pbmcgc29tZXRoaW5nIHVudXNhYmxlIGludG8gdXNhYmxlIi4gIEluIG90aGVyIHdvcmRzLCB0aGUKK2ludGVudCBpcyB0aGF0IGlmIHNvbWVvbmUgdW5zZXRzIHRoZSBmaWx0ZXIgZHJpdmVyIGRlZmluaXRpb24sCitvciBkb2VzIG5vdCBoYXZlIHRoZSBhcHByb3ByaWF0ZSBmaWx0ZXIgcHJvZ3JhbSwgdGhlIHByb2plY3QKK3Nob3VsZCBzdGlsbCBiZSB1c2FibGUuCisKKworSW50ZXJhY3Rpb24gYmV0d2VlbiBjaGVja2luL2NoZWNrb3V0IGF0dHJpYnV0ZXMKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisKK0luIHRoZSBjaGVjay1pbiBjb2RlcGF0aCwgdGhlIHdvcmt0cmVlIGZpbGUgaXMgZmlyc3QgY29udmVydGVkCit3aXRoIGBmaWx0ZXJgIGRyaXZlciAoaWYgc3BlY2lmaWVkIGFuZCBjb3JyZXNwb25kaW5nIGRyaXZlcgorZGVmaW5lZCksIHRoZW4gdGhlIHJlc3VsdCBpcyBwcm9jZXNzZWQgd2l0aCBgaWRlbnRgIChpZgorc3BlY2lmaWVkKSwgYW5kIHRoZW4gZmluYWxseSB3aXRoIGBjcmxmYCAoYWdhaW4sIGlmIHNwZWNpZmllZAorYW5kIGFwcGxpY2FibGUpLgorCitJbiB0aGUgY2hlY2stb3V0IGNvZGVwYXRoLCB0aGUgYmxvYiBjb250ZW50IGlzIGZpcnN0IGNvbnZlcnRlZAord2l0aCBgY3JsZmAsIGFuZCB0aGVuIGBpZGVudGAgYW5kIGZlZCB0byBgZmlsdGVyYC4KKworCitHZW5lcmF0aW5nIGRpZmYgdGV4dAorfn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIGF0dHJpYnV0ZSBgZGlmZmAgYWZmZWN0cyBpZiBgZ2l0IGRpZmZgIGdlbmVyYXRlcyB0ZXh0dWFsCitwYXRjaCBmb3IgdGhlIHBhdGggb3IganVzdCBzYXlzIGBCaW5hcnkgZmlsZXMgZGlmZmVyYC4gIEl0IGFsc28KK2NhbiBhZmZlY3Qgd2hhdCBsaW5lIGlzIHNob3duIG9uIHRoZSBodW5rIGhlYWRlciBgQEAgLWssbCArbixtIEBAYAorbGluZS4KKworU2V0OjoKKworCUEgcGF0aCB0byB3aGljaCB0aGUgYGRpZmZgIGF0dHJpYnV0ZSBpcyBzZXQgaXMgdHJlYXRlZAorCWFzIHRleHQsIGV2ZW4gd2hlbiB0aGV5IGNvbnRhaW4gYnl0ZSB2YWx1ZXMgdGhhdAorCW5vcm1hbGx5IG5ldmVyIGFwcGVhciBpbiB0ZXh0IGZpbGVzLCBzdWNoIGFzIE5VTC4KKworVW5zZXQ6OgorCisJQSBwYXRoIHRvIHdoaWNoIHRoZSBgZGlmZmAgYXR0cmlidXRlIGlzIHVuc2V0IHdpbGwKKwlnZW5lcmF0ZSBgQmluYXJ5IGZpbGVzIGRpZmZlcmAuCisKK1Vuc3BlY2lmaWVkOjoKKworCUEgcGF0aCB0byB3aGljaCB0aGUgYGRpZmZgIGF0dHJpYnV0ZSBpcyB1bnNwZWNpZmllZAorCWZpcnN0IGdldHMgaXRzIGNvbnRlbnRzIGluc3BlY3RlZCwgYW5kIGlmIGl0IGxvb2tzIGxpa2UKKwl0ZXh0LCBpdCBpcyB0cmVhdGVkIGFzIHRleHQuICBPdGhlcndpc2UgaXQgd291bGQKKwlnZW5lcmF0ZSBgQmluYXJ5IGZpbGVzIGRpZmZlcmAuCisKK1N0cmluZzo6CisKKwlEaWZmIGlzIHNob3duIHVzaW5nIHRoZSBzcGVjaWZpZWQgY3VzdG9tIGRpZmYgZHJpdmVyLgorCVRoZSBkcml2ZXIgcHJvZ3JhbSBpcyBnaXZlbiBpdHMgaW5wdXQgdXNpbmcgdGhlIHNhbWUKKwljYWxsaW5nIGNvbnZlbnRpb24gYXMgdXNlZCBmb3IgR0lUX0VYVEVSTkFMX0RJRkYKKwlwcm9ncmFtLiAgVGhpcyBuYW1lIGlzIGFsc28gdXNlZCBmb3IgY3VzdG9tIGh1bmsgaGVhZGVyCisJc2VsZWN0aW9uLgorCisKK0RlZmluaW5nIGEgY3VzdG9tIGRpZmYgZHJpdmVyCiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorCitUaGUgZGVmaW5pdGlvbiBvZiBhIGRpZmYgZHJpdmVyIGlzIGRvbmUgaW4gYGdpdGNvbmZpZ2AsIG5vdAorYGdpdGF0dHJpYnV0ZXNgIGZpbGUsIHNvIHN0cmljdGx5IHNwZWFraW5nIHRoaXMgbWFudWFsIHBhZ2UgaXMgYQord3JvbmcgcGxhY2UgdG8gdGFsayBhYm91dCBpdC4gIEhvd2V2ZXIuLi4KKworVG8gZGVmaW5lIGEgY3VzdG9tIGRpZmYgZHJpdmVyIGBqY2RpZmZgLCBhZGQgYSBzZWN0aW9uIHRvIHlvdXIKK2AkR0lUX0RJUi9jb25maWdgIGZpbGUgKG9yIGAkSE9NRS8uZ2l0Y29uZmlnYCBmaWxlKSBsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1tkaWZmICJqY2RpZmYiXQorCWNvbW1hbmQgPSBqLWMtZGlmZgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGVuIGdpdCBuZWVkcyB0byBzaG93IHlvdSBhIGRpZmYgZm9yIHRoZSBwYXRoIHdpdGggYGRpZmZgCithdHRyaWJ1dGUgc2V0IHRvIGBqY2RpZmZgLCBpdCBjYWxscyB0aGUgY29tbWFuZCB5b3Ugc3BlY2lmaWVkCit3aXRoIHRoZSBhYm92ZSBjb25maWd1cmF0aW9uLCBpLmUuIGBqLWMtZGlmZmAsIHdpdGggNworcGFyYW1ldGVycywganVzdCBsaWtlIGBHSVRfRVhURVJOQUxfRElGRmAgcHJvZ3JhbSBpcyBjYWxsZWQuCitTZWUgbGlua2dpdDpnaXRbN10gZm9yIGRldGFpbHMuCisKKworRGVmaW5pbmcgYSBjdXN0b20gaHVuay1oZWFkZXIKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisKK0VhY2ggZ3JvdXAgb2YgY2hhbmdlcyAoY2FsbGVkICJodW5rIikgaW4gdGhlIHRleHR1YWwgZGlmZiBvdXRwdXQKK2lzIHByZWZpeGVkIHdpdGggYSBsaW5lIG9mIHRoZSBmb3JtOgorCisJQEAgLWssbCArbixtIEBAIFRFWFQKKworVGhlIHRleHQgaXMgY2FsbGVkICdodW5rIGhlYWRlcicsIGFuZCBieSBkZWZhdWx0IGEgbGluZSB0aGF0CitiZWdpbnMgd2l0aCBhbiBhbHBoYWJldCwgYW4gdW5kZXJzY29yZSBvciBhIGRvbGxhciBzaWduIGlzIHVzZWQsCit3aGljaCBtYXRjaGVzIHdoYXQgR05VIGBkaWZmIC1wYCBvdXRwdXQgdXNlcy4gIFRoaXMgZGVmYXVsdAorc2VsZWN0aW9uIGhvd2V2ZXIgaXMgbm90IHN1aXRlZCBmb3Igc29tZSBjb250ZW50cywgYW5kIHlvdSBjYW4KK3VzZSBjdXN0b21pemVkIHBhdHRlcm4gdG8gbWFrZSBhIHNlbGVjdGlvbi4KKworRmlyc3QgaW4gLmdpdGF0dHJpYnV0ZXMsIHlvdSB3b3VsZCBhc3NpZ24gdGhlIGBkaWZmYCBhdHRyaWJ1dGUKK2ZvciBwYXRocy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLnRleAlkaWZmPXRleAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZW4sIHlvdSB3b3VsZCBkZWZpbmUgImRpZmYudGV4LmZ1bmNuYW1lIiBjb25maWd1cmF0aW9uIHRvCitzcGVjaWZ5IGEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyBhIGxpbmUgdGhhdCB5b3Ugd291bGQKK3dhbnQgdG8gYXBwZWFyIGFzIHRoZSBodW5rIGhlYWRlciwgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1tkaWZmICJ0ZXgiXQorCWZ1bmNuYW1lID0gIl5cXChcXFxcXFwoc3ViXFwpKnNlY3Rpb257LipcXCkkIgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdGUuICBBIHNpbmdsZSBsZXZlbCBvZiBiYWNrc2xhc2hlcyBhcmUgZWF0ZW4gYnkgdGhlCitjb25maWd1cmF0aW9uIGZpbGUgcGFyc2VyLCBzbyB5b3Ugd291bGQgbmVlZCB0byBkb3VibGUgdGhlCitiYWNrc2xhc2hlczsgdGhlIHBhdHRlcm4gYWJvdmUgcGlja3MgYSBsaW5lIHRoYXQgYmVnaW5zIHdpdGggYQorYmFja3NsYXNoLCBhbmQgemVybyBvciBtb3JlIG9jY3VycmVuY2VzIG9mIGBzdWJgIGZvbGxvd2VkIGJ5Citgc2VjdGlvbmAgZm9sbG93ZWQgYnkgb3BlbiBicmFjZSwgdG8gdGhlIGVuZCBvZiBsaW5lLgorCitUaGVyZSBhcmUgYSBmZXcgYnVpbHQtaW4gcGF0dGVybnMgdG8gbWFrZSB0aGlzIGVhc2llciwgYW5kIGB0ZXhgCitpcyBvbmUgb2YgdGhlbSwgc28geW91IGRvIG5vdCBoYXZlIHRvIHdyaXRlIHRoZSBhYm92ZSBpbiB5b3VyCitjb25maWd1cmF0aW9uIGZpbGUgKHlvdSBzdGlsbCBuZWVkIHRvIGVuYWJsZSB0aGlzIHdpdGggdGhlCithdHRyaWJ1dGUgbWVjaGFuaXNtLCB2aWEgYC5naXRhdHRyaWJ1dGVzYCkuICBBbm90aGVyIGJ1aWx0LWluCitwYXR0ZXJuIGlzIGRlZmluZWQgZm9yIGBqYXZhYCB0aGF0IGRlZmluZXMgYSBwYXR0ZXJuIHN1aXRhYmxlCitmb3IgcHJvZ3JhbSB0ZXh0IGluIEphdmEgbGFuZ3VhZ2UuCisKKworUGVyZm9ybWluZyBhIHRocmVlLXdheSBtZXJnZQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgYXR0cmlidXRlIGBtZXJnZWAgYWZmZWN0cyBob3cgdGhyZWUgdmVyc2lvbnMgb2YgYSBmaWxlIGlzCittZXJnZWQgd2hlbiBhIGZpbGUtbGV2ZWwgbWVyZ2UgaXMgbmVjZXNzYXJ5IGR1cmluZyBgZ2l0IG1lcmdlYCwKK2FuZCBvdGhlciBwcm9ncmFtcyBzdWNoIGFzIGBnaXQgcmV2ZXJ0YCBhbmQgYGdpdCBjaGVycnktcGlja2AuCisKK1NldDo6CisKKwlCdWlsdC1pbiAzLXdheSBtZXJnZSBkcml2ZXIgaXMgdXNlZCB0byBtZXJnZSB0aGUKKwljb250ZW50cyBpbiBhIHdheSBzaW1pbGFyIHRvIGBtZXJnZWAgY29tbWFuZCBvZiBgUkNTYAorCXN1aXRlLiAgVGhpcyBpcyBzdWl0YWJsZSBmb3Igb3JkaW5hcnkgdGV4dCBmaWxlcy4KKworVW5zZXQ6OgorCisJVGFrZSB0aGUgdmVyc2lvbiBmcm9tIHRoZSBjdXJyZW50IGJyYW5jaCBhcyB0aGUKKwl0ZW50YXRpdmUgbWVyZ2UgcmVzdWx0LCBhbmQgZGVjbGFyZSB0aGF0IHRoZSBtZXJnZSBoYXMKKwljb25mbGljdHMuICBUaGlzIGlzIHN1aXRhYmxlIGZvciBiaW5hcnkgZmlsZXMgdGhhdCBkb2VzCisJbm90IGhhdmUgYSB3ZWxsLWRlZmluZWQgbWVyZ2Ugc2VtYW50aWNzLgorCitVbnNwZWNpZmllZDo6CisKKwlCeSBkZWZhdWx0LCB0aGlzIHVzZXMgdGhlIHNhbWUgYnVpbHQtaW4gMy13YXkgbWVyZ2UKKwlkcml2ZXIgYXMgaXMgdGhlIGNhc2UgdGhlIGBtZXJnZWAgYXR0cmlidXRlIGlzIHNldC4KKwlIb3dldmVyLCBgbWVyZ2UuZGVmYXVsdGAgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBjYW4gbmFtZQorCWRpZmZlcmVudCBtZXJnZSBkcml2ZXIgdG8gYmUgdXNlZCBmb3IgcGF0aHMgdG8gd2hpY2ggdGhlCisJYG1lcmdlYCBhdHRyaWJ1dGUgaXMgdW5zcGVjaWZpZWQuCisKK1N0cmluZzo6CisKKwkzLXdheSBtZXJnZSBpcyBwZXJmb3JtZWQgdXNpbmcgdGhlIHNwZWNpZmllZCBjdXN0b20KKwltZXJnZSBkcml2ZXIuICBUaGUgYnVpbHQtaW4gMy13YXkgbWVyZ2UgZHJpdmVyIGNhbiBiZQorCWV4cGxpY2l0bHkgc3BlY2lmaWVkIGJ5IGFza2luZyBmb3IgInRleHQiIGRyaXZlcjsgdGhlCisJYnVpbHQtaW4gInRha2UgdGhlIGN1cnJlbnQgYnJhbmNoIiBkcml2ZXIgY2FuIGJlCisJcmVxdWVzdGVkIHdpdGggImJpbmFyeSIuCisKKworQnVpbHQtaW4gbWVyZ2UgZHJpdmVycworXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorCitUaGVyZSBhcmUgYSBmZXcgYnVpbHQtaW4gbG93LWxldmVsIG1lcmdlIGRyaXZlcnMgZGVmaW5lZCB0aGF0CitjYW4gYmUgYXNrZWQgZm9yIHZpYSB0aGUgYG1lcmdlYCBhdHRyaWJ1dGUuCisKK3RleHQ6OgorCisJVXN1YWwgMy13YXkgZmlsZSBsZXZlbCBtZXJnZSBmb3IgdGV4dCBmaWxlcy4gIENvbmZsaWN0ZWQKKwlyZWdpb25zIGFyZSBtYXJrZWQgd2l0aCBjb25mbGljdCBtYXJrZXJzIGA8PDw8PDw8YCwKKwlgPT09PT09PWAgYW5kIGA+Pj4+Pj4+YC4gIFRoZSB2ZXJzaW9uIGZyb20geW91ciBicmFuY2gKKwlhcHBlYXJzIGJlZm9yZSB0aGUgYD09PT09PT1gIG1hcmtlciwgYW5kIHRoZSB2ZXJzaW9uCisJZnJvbSB0aGUgbWVyZ2VkIGJyYW5jaCBhcHBlYXJzIGFmdGVyIHRoZSBgPT09PT09PWAKKwltYXJrZXIuCisKK2JpbmFyeTo6CisKKwlLZWVwIHRoZSB2ZXJzaW9uIGZyb20geW91ciBicmFuY2ggaW4gdGhlIHdvcmsgdHJlZSwgYnV0CisJbGVhdmUgdGhlIHBhdGggaW4gdGhlIGNvbmZsaWN0ZWQgc3RhdGUgZm9yIHRoZSB1c2VyIHRvCisJc29ydCBvdXQuCisKK3VuaW9uOjoKKworCVJ1biAzLXdheSBmaWxlIGxldmVsIG1lcmdlIGZvciB0ZXh0IGZpbGVzLCBidXQgdGFrZQorCWxpbmVzIGZyb20gYm90aCB2ZXJzaW9ucywgaW5zdGVhZCBvZiBsZWF2aW5nIGNvbmZsaWN0CisJbWFya2Vycy4gIFRoaXMgdGVuZHMgdG8gbGVhdmUgdGhlIGFkZGVkIGxpbmVzIGluIHRoZQorCXJlc3VsdGluZyBmaWxlIGluIHJhbmRvbSBvcmRlciBhbmQgdGhlIHVzZXIgc2hvdWxkCisJdmVyaWZ5IHRoZSByZXN1bHQuIERvIG5vdCB1c2UgdGhpcyBpZiB5b3UgZG8gbm90CisJdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zLgorCisKK0RlZmluaW5nIGEgY3VzdG9tIG1lcmdlIGRyaXZlcgorXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisKK1RoZSBkZWZpbml0aW9uIG9mIGEgbWVyZ2UgZHJpdmVyIGlzIGRvbmUgaW4gdGhlIGAuZ2l0L2NvbmZpZ2AKK2ZpbGUsIG5vdCBpbiB0aGUgYGdpdGF0dHJpYnV0ZXNgIGZpbGUsIHNvIHN0cmljdGx5IHNwZWFraW5nIHRoaXMKK21hbnVhbCBwYWdlIGlzIGEgd3JvbmcgcGxhY2UgdG8gdGFsayBhYm91dCBpdC4gIEhvd2V2ZXIuLi4KKworVG8gZGVmaW5lIGEgY3VzdG9tIG1lcmdlIGRyaXZlciBgZmlsZnJlYCwgYWRkIGEgc2VjdGlvbiB0byB5b3VyCitgJEdJVF9ESVIvY29uZmlnYCBmaWxlIChvciBgJEhPTUUvLmdpdGNvbmZpZ2AgZmlsZSkgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbbWVyZ2UgImZpbGZyZSJdCisJbmFtZSA9IGZlZWwtZnJlZSBtZXJnZSBkcml2ZXIKKwlkcml2ZXIgPSBmaWxmcmUgJU8gJUEgJUIKKwlyZWN1cnNpdmUgPSBiaW5hcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGBtZXJnZS4qLm5hbWVgIHZhcmlhYmxlIGdpdmVzIHRoZSBkcml2ZXIgYSBodW1hbi1yZWFkYWJsZQorbmFtZS4KKworVGhlIGBtZXJnZS4qLmRyaXZlcmAgdmFyaWFibGUncyB2YWx1ZSBpcyB1c2VkIHRvIGNvbnN0cnVjdCBhCitjb21tYW5kIHRvIHJ1biB0byBtZXJnZSBhbmNlc3RvcidzIHZlcnNpb24gKGAlT2ApLCBjdXJyZW50Cit2ZXJzaW9uIChgJUFgKSBhbmQgdGhlIG90aGVyIGJyYW5jaGVzJyB2ZXJzaW9uIChgJUJgKS4gIFRoZXNlCit0aHJlZSB0b2tlbnMgYXJlIHJlcGxhY2VkIHdpdGggdGhlIG5hbWVzIG9mIHRlbXBvcmFyeSBmaWxlcyB0aGF0Citob2xkIHRoZSBjb250ZW50cyBvZiB0aGVzZSB2ZXJzaW9ucyB3aGVuIHRoZSBjb21tYW5kIGxpbmUgaXMKK2J1aWx0LgorCitUaGUgbWVyZ2UgZHJpdmVyIGlzIGV4cGVjdGVkIHRvIGxlYXZlIHRoZSByZXN1bHQgb2YgdGhlIG1lcmdlIGluCit0aGUgZmlsZSBuYW1lZCB3aXRoIGAlQWAgYnkgb3ZlcndyaXRpbmcgaXQsIGFuZCBleGl0IHdpdGggemVybworc3RhdHVzIGlmIGl0IG1hbmFnZWQgdG8gbWVyZ2UgdGhlbSBjbGVhbmx5LCBvciBub24temVybyBpZiB0aGVyZQord2VyZSBjb25mbGljdHMuCisKK1RoZSBgbWVyZ2UuKi5yZWN1cnNpdmVgIHZhcmlhYmxlIHNwZWNpZmllcyB3aGF0IG90aGVyIG1lcmdlCitkcml2ZXIgdG8gdXNlIHdoZW4gdGhlIG1lcmdlIGRyaXZlciBpcyBjYWxsZWQgZm9yIGFuIGludGVybmFsCittZXJnZSBiZXR3ZWVuIGNvbW1vbiBhbmNlc3RvcnMsIHdoZW4gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUuCitXaGVuIGxlZnQgdW5zcGVjaWZpZWQsIHRoZSBkcml2ZXIgaXRzZWxmIGlzIHVzZWQgZm9yIGJvdGgKK2ludGVybmFsIG1lcmdlIGFuZCB0aGUgZmluYWwgbWVyZ2UuCisKKworQ2hlY2tpbmcgd2hpdGVzcGFjZSBlcnJvcnMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK2B3aGl0ZXNwYWNlYAorXl5eXl5eXl5eXl5eCisKK1RoZSBgY29yZS53aGl0ZXNwYWNlYCBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGFsbG93cyB5b3UgdG8gZGVmaW5lIHdoYXQKK2BkaWZmYCBhbmQgYGFwcGx5YCBzaG91bGQgY29uc2lkZXIgd2hpdGVzcGFjZSBlcnJvcnMgZm9yIGFsbCBwYXRocyBpbgordGhlIHByb2plY3QgKFNlZSBsaW5rZ2l0OmdpdC1jb25maWdbMV0pLiAgVGhpcyBhdHRyaWJ1dGUgZ2l2ZXMgeW91IGZpbmVyCitjb250cm9sIHBlciBwYXRoLgorCitTZXQ6OgorCisJTm90aWNlIGFsbCB0eXBlcyBvZiBwb3RlbnRpYWwgd2hpdGVzcGFjZSBlcnJvcnMga25vd24gdG8gZ2l0LgorCitVbnNldDo6CisKKwlEbyBub3Qgbm90aWNlIGFueXRoaW5nIGFzIGVycm9yLgorCitVbnNwZWNpZmllZDo6CisKKwlVc2UgdGhlIHZhbHVlIG9mIGBjb3JlLndoaXRlc3BhY2VgIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgdG8KKwlkZWNpZGUgd2hhdCB0byBub3RpY2UgYXMgZXJyb3IuCisKK1N0cmluZzo6CisKKwlTcGVjaWZ5IGEgY29tbWEgc2VwYXJhdGUgbGlzdCBvZiBjb21tb24gd2hpdGVzcGFjZSBwcm9ibGVtcyB0bworCW5vdGljZSBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgYGNvcmUud2hpdGVzcGFjZWAgY29uZmlndXJhdGlvbgorCXZhcmlhYmxlLgorCisKK0VYQU1QTEUKKy0tLS0tLS0KKworSWYgeW91IGhhdmUgdGhlc2UgdGhyZWUgYGdpdGF0dHJpYnV0ZXNgIGZpbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyhpbiAkR0lUX0RJUi9pbmZvL2F0dHJpYnV0ZXMpCisKK2EqCWZvbyAhYmFyIC1iYXoKKworKGluIC5naXRhdHRyaWJ1dGVzKQorYWJjCWZvbyBiYXIgYmF6CisKKyhpbiB0Ly5naXRhdHRyaWJ1dGVzKQorYWIqCW1lcmdlPWZpbGZyZQorYWJjCS1mb28gLWJhcgorKi5jCWZyb3R6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RoZSBhdHRyaWJ1dGVzIGdpdmVuIHRvIHBhdGggYHQvYWJjYCBhcmUgY29tcHV0ZWQgYXMgZm9sbG93czoKKworMS4gQnkgZXhhbWluaW5nIGB0Ly5naXRhdHRyaWJ1dGVzYCAod2hpY2ggaXMgaW4gdGhlIHNhbWUKKyAgIGRpcmVjdG9yeSBhcyB0aGUgcGF0aCBpbiBxdWVzdGlvbiksIGdpdCBmaW5kcyB0aGF0IHRoZSBmaXJzdAorICAgbGluZSBtYXRjaGVzLiAgYG1lcmdlYCBhdHRyaWJ1dGUgaXMgc2V0LiAgSXQgYWxzbyBmaW5kcyB0aGF0CisgICB0aGUgc2Vjb25kIGxpbmUgbWF0Y2hlcywgYW5kIGF0dHJpYnV0ZXMgYGZvb2AgYW5kIGBiYXJgCisgICBhcmUgdW5zZXQuCisKKzIuIFRoZW4gaXQgZXhhbWluZXMgYC5naXRhdHRyaWJ1dGVzYCAod2hpY2ggaXMgaW4gdGhlIHBhcmVudAorICAgZGlyZWN0b3J5KSwgYW5kIGZpbmRzIHRoYXQgdGhlIGZpcnN0IGxpbmUgbWF0Y2hlcywgYnV0CisgICBgdC8uZ2l0YXR0cmlidXRlc2AgZmlsZSBhbHJlYWR5IGRlY2lkZWQgaG93IGBtZXJnZWAsIGBmb29gCisgICBhbmQgYGJhcmAgYXR0cmlidXRlcyBzaG91bGQgYmUgZ2l2ZW4gdG8gdGhpcyBwYXRoLCBzbyBpdAorICAgbGVhdmVzIGBmb29gIGFuZCBgYmFyYCB1bnNldC4gIEF0dHJpYnV0ZSBgYmF6YCBpcyBzZXQuCisKKzMuIEZpbmFsbHkgaXQgZXhhbWluZXMgYCRHSVRfRElSL2luZm8vYXR0cmlidXRlc2AuICBUaGlzIGZpbGUKKyAgIGlzIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGluLXRyZWUgc2V0dGluZ3MuICBUaGUgZmlyc3QgbGluZSBpcworICAgYSBtYXRjaCwgYW5kIGBmb29gIGlzIHNldCwgYGJhcmAgaXMgcmV2ZXJ0ZWQgdG8gdW5zcGVjaWZpZWQKKyAgIHN0YXRlLCBhbmQgYGJhemAgaXMgdW5zZXQuCisKK0FzIHRoZSByZXN1bHQsIHRoZSBhdHRyaWJ1dGVzIGFzc2lnbm1lbnQgdG8gYHQvYWJjYCBiZWNvbWVzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmb28Jc2V0IHRvIHRydWUKK2Jhcgl1bnNwZWNpZmllZAorYmF6CXNldCB0byBmYWxzZQorbWVyZ2UJc2V0IHRvIHN0cmluZyB2YWx1ZSAiZmlsZnJlIgorZnJvdHoJdW5zcGVjaWZpZWQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitDcmVhdGluZyBhbiBhcmNoaXZlCit+fn5+fn5+fn5+fn5+fn5+fn5+CisKK2BleHBvcnQtc3Vic3RgCiteXl5eXl5eXl5eXl5eXgorCitJZiB0aGUgYXR0cmlidXRlIGBleHBvcnQtc3Vic3RgIGlzIHNldCBmb3IgYSBmaWxlIHRoZW4gZ2l0IHdpbGwgZXhwYW5kCitzZXZlcmFsIHBsYWNlaG9sZGVycyB3aGVuIGFkZGluZyB0aGlzIGZpbGUgdG8gYW4gYXJjaGl2ZS4gIFRoZQorZXhwYW5zaW9uIGRlcGVuZHMgb24gdGhlIGF2YWlsYWJpbGl0eSBvZiBhIGNvbW1pdCBJRCwgaS5lLiBpZgorbGlua2dpdDpnaXQtYXJjaGl2ZVsxXSBoYXMgYmVlbiBnaXZlbiBhIHRyZWUgaW5zdGVhZCBvZiBhIGNvbW1pdCBvciBhCit0YWcgdGhlbiBubyByZXBsYWNlbWVudCB3aWxsIGJlIGRvbmUuICBUaGUgcGxhY2Vob2xkZXJzIGFyZSB0aGUgc2FtZQorYXMgdGhvc2UgZm9yIHRoZSBvcHRpb24gYC0tcHJldHR5PWZvcm1hdDpgIG9mIGxpbmtnaXQ6Z2l0LWxvZ1sxXSwKK2V4Y2VwdCB0aGF0IHRoZXkgbmVlZCB0byBiZSB3cmFwcGVkIGxpa2UgdGhpczogYCRGb3JtYXQ6UExBQ0VIT0xERVJTJGAKK2luIHRoZSBmaWxlLiAgRS5nLiB0aGUgc3RyaW5nIGAkRm9ybWF0OiVIJGAgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUKK2NvbW1pdCBoYXNoLgorCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBsaW5rZ2l0OmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXRjbGkudHh0IGIvRG9jdW1lbnRhdGlvbi9naXRjbGkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZTVjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdGNsaS50eHQKQEAgLTAsMCArMSwxMTMgQEAKK2dpdGNsaSg1KQorPT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdGNsaSAtIGdpdCBjb21tYW5kIGxpbmUgaW50ZXJmYWNlIGFuZCBjb252ZW50aW9ucworCitTWU5PUFNJUworLS0tLS0tLS0KK2dpdGNsaQorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitUaGlzIG1hbnVhbCBkZXNjcmliZXMgYmVzdCBwcmFjdGljZSBpbiBob3cgdG8gdXNlIGdpdCBDTEkuICBIZXJlIGFyZQordGhlIHJ1bGVzIHRoYXQgeW91IHNob3VsZCBmb2xsb3cgd2hlbiB5b3UgYXJlIHNjcmlwdGluZyBnaXQ6CisKKyAqIGl0J3MgcHJlZmVycmVkIHRvIHVzZSB0aGUgbm9uIGRhc2hlZCBmb3JtIG9mIGdpdCBjb21tYW5kcywgd2hpY2ggbWVhbnMgdGhhdAorICAgeW91IHNob3VsZCBwcmVmZXIgYCJnaXQgZm9vImAgdG8gYCJnaXQtZm9vImAuCisKKyAqIHNwbGl0dGluZyBzaG9ydCBvcHRpb25zIHRvIHNlcGFyYXRlIHdvcmRzIChwcmVmZXIgYCJnaXQgZm9vIC1hIC1iImAKKyAgIHRvIGAiZ2l0IGZvbyAtYWIiYCwgdGhlIGxhdHRlciBtYXkgbm90IGV2ZW4gd29yaykuCisKKyAqIHdoZW4gYSBjb21tYW5kIGxpbmUgb3B0aW9uIHRha2VzIGFuIGFyZ3VtZW50LCB1c2UgdGhlICdzdGlja2VkJyBmb3JtLiAgSW4KKyAgIG90aGVyIHdvcmRzLCB3cml0ZSBgImdpdCBmb28gLW9BcmciYCBpbnN0ZWFkIG9mIGAiZ2l0IGZvbyAtbyBBcmciYCBmb3Igc2hvcnQKKyAgIG9wdGlvbnMsIGFuZCBgImdpdCBmb28gLS1sb25nLW9wdD1BcmciYCBpbnN0ZWFkIG9mIGAiZ2l0IGZvbyAtLWxvbmctb3B0IEFyZyJgCisgICBmb3IgbG9uZyBvcHRpb25zLiAgQW4gb3B0aW9uIHRoYXQgdGFrZXMgb3B0aW9uYWwgb3B0aW9uLWFyZ3VtZW50IG11c3QgYmUKKyAgIHdyaXR0ZW4gaW4gdGhlICdzdGlja2VkJyBmb3JtLgorCisgKiB3aGVuIHlvdSBnaXZlIGEgcmV2aXNpb24gcGFyYW1ldGVyIHRvIGEgY29tbWFuZCwgbWFrZSBzdXJlIHRoZSBwYXJhbWV0ZXIgaXMKKyAgIG5vdCBhbWJpZ3VvdXMgd2l0aCBhIG5hbWUgb2YgYSBmaWxlIGluIHRoZSB3b3JrIHRyZWUuICBFLmcuIGRvIG5vdCB3cml0ZQorICAgYCJnaXQgbG9nIC0xIEhFQUQiYCBidXQgd3JpdGUgYCJnaXQgbG9nIC0xIEhFQUQgLS0iYDsgdGhlIGZvcm1lciB3aWxsIG5vdCB3b3JrCisgICBpZiB5b3UgaGFwcGVuIHRvIGhhdmUgYSBmaWxlIGNhbGxlZCBgSEVBRGAgaW4gdGhlIHdvcmsgdHJlZS4KKworCitFTkhBTkNFRCBDTEkKKy0tLS0tLS0tLS0tLQorRnJvbSB0aGUgZ2l0IDEuNS40IHNlcmllcyBhbmQgZnVydGhlciwgbWFueSBnaXQgY29tbWFuZHMgKG5vdCBhbGwgb2YgdGhlbSBhdCB0aGUKK3RpbWUgb2YgdGhlIHdyaXRpbmcgdGhvdWdoKSBjb21lIHdpdGggYW4gZW5oYW5jZWQgb3B0aW9uIHBhcnNlci4KKworSGVyZSBpcyBhbiBleGhhdXN0aXZlIGxpc3Qgb2YgdGhlIGZhY2lsaXRpZXMgcHJvdmlkZWQgYnkgdGhpcyBvcHRpb24gcGFyc2VyLgorCisKK01hZ2ljIE9wdGlvbnMKK35+fn5+fn5+fn5+fn4KK0NvbW1hbmRzIHdoaWNoIGhhdmUgdGhlIGVuaGFuY2VkIG9wdGlvbiBwYXJzZXIgYWN0aXZhdGVkIGFsbCB1bmRlcnN0YW5kIGEKK2NvdXBsZSBvZiBtYWdpYyBjb21tYW5kIGxpbmUgb3B0aW9uczoKKworLWg6OgorCWdpdmVzIGEgcHJldHR5IHByaW50ZWQgdXNhZ2Ugb2YgdGhlIGNvbW1hbmQuCisrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRlc2NyaWJlIC1oCit1c2FnZTogZ2l0LWRlc2NyaWJlIFtvcHRpb25zXSA8Y29tbWl0dGlzaD4qCisKKyAgICAtLWNvbnRhaW5zICAgICAgICAgICAgZmluZCB0aGUgdGFnIHRoYXQgY29tZXMgYWZ0ZXIgdGhlIGNvbW1pdAorICAgIC0tZGVidWcgICAgICAgICAgICAgICBkZWJ1ZyBzZWFyY2ggc3RyYXRlZ3kgb24gc3RkZXJyCisgICAgLS1hbGwgICAgICAgICAgICAgICAgIHVzZSBhbnkgcmVmIGluIC5naXQvcmVmcworICAgIC0tdGFncyAgICAgICAgICAgICAgICB1c2UgYW55IHRhZyBpbiAuZ2l0L3JlZnMvdGFncworICAgIC0tYWJicmV2IFs8bj5dICAgICAgICB1c2UgPG4+IGRpZ2l0cyB0byBkaXNwbGF5IFNIQS0xcworICAgIC0tY2FuZGlkYXRlcyA8bj4gICAgICBjb25zaWRlciA8bj4gbW9zdCByZWNlbnQgdGFncyAoZGVmYXVsdDogMTApCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS1oZWxwLWFsbDo6CisJU29tZSBnaXQgY29tbWFuZHMgdGFrZSBvcHRpb25zIHRoYXQgYXJlIG9ubHkgdXNlZCBmb3IgcGx1bWJpbmcgb3IgdGhhdAorCWFyZSBkZXByZWNhdGVkLCBhbmQgc3VjaCBvcHRpb25zIGFyZSBoaWRkZW4gZnJvbSB0aGUgZGVmYXVsdCB1c2FnZS4gVGhpcworCW9wdGlvbiBnaXZlcyB0aGUgZnVsbCBsaXN0IG9mIG9wdGlvbnMuCisKKworTmVnYXRpbmcgb3B0aW9ucworfn5+fn5+fn5+fn5+fn5+fgorT3B0aW9ucyB3aXRoIGxvbmcgb3B0aW9uIG5hbWVzIGNhbiBiZSBuZWdhdGVkIGJ5IHByZWZpeGluZyBgIi0tbm8tImAuIEZvcgorZXhhbXBsZSwgYCJnaXQgYnJhbmNoImAgaGFzIHRoZSBvcHRpb24gYCItLXRyYWNrImAgd2hpY2ggaXMgJ29uJyBieSBkZWZhdWx0LiBZb3UKK2NhbiB1c2UgYCItLW5vLXRyYWNrImAgdG8gb3ZlcnJpZGUgdGhhdCBiZWhhdmlvdXIuIFRoZSBzYW1lIGdvZXMgZm9yIGAiLS1jb2xvciJgCithbmQgYCItLW5vLWNvbG9yImAuCisKKworQWdncmVnYXRpbmcgc2hvcnQgb3B0aW9ucworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorQ29tbWFuZHMgdGhhdCBzdXBwb3J0IHRoZSBlbmhhbmNlZCBvcHRpb24gcGFyc2VyIGFsbG93IHlvdSB0byBhZ2dyZWdhdGUgc2hvcnQKK29wdGlvbnMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIGZvciBleGFtcGxlIHVzZSBgImdpdCBybSAtcmYiYCBvcgorYCJnaXQgY2xlYW4gLWZkeCJgLgorCisKK1NlcGFyYXRpbmcgYXJndW1lbnQgZnJvbSB0aGUgb3B0aW9uCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorWW91IGNhbiB3cml0ZSB0aGUgbWFuZGF0b3J5IG9wdGlvbiBwYXJhbWV0ZXIgdG8gYW4gb3B0aW9uIGFzIGEgc2VwYXJhdGUKK3dvcmQgb24gdGhlIGNvbW1hbmQgbGluZS4gIFRoYXQgbWVhbnMgdGhhdCBhbGwgdGhlIGZvbGxvd2luZyB1c2VzIHdvcms6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGZvbyAtLWxvbmctb3B0PUFyZworJCBnaXQgZm9vIC0tbG9uZy1vcHQgQXJnCiskIGdpdCBmb28gLW9BcmcKKyQgZ2l0IGZvbyAtbyBBcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSG93ZXZlciwgdGhpcyBpcyAqTk9UKiBhbGxvd2VkIGZvciBzd2l0Y2hlcyB3aXRoIGFuIG9wdGlvbmFsIHZhbHVlLCB3aGVyZSB0aGUKKydzdGlja2VkJyBmb3JtIG11c3QgYmUgdXNlZDoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRlc2NyaWJlIC0tYWJicmV2IEhFQUQgICAgICMgY29ycmVjdAorJCBnaXQgZGVzY3JpYmUgLS1hYmJyZXY9MTAgSEVBRCAgIyBjb3JyZWN0CiskIGdpdCBkZXNjcmliZSAtLWFiYnJldiAxMCBIRUFEICAjIE5PVCBXSEFUIFlPVSBNRUFOVAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgUGllcnJlIEhhYm91eml0LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0aWdub3JlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0aWdub3JlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTNkY2EwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXRpZ25vcmUudHh0CkBAIC0wLDAgKzEsMTQxIEBACitnaXRpZ25vcmUoNSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXRpZ25vcmUgLSBTcGVjaWZpZXMgaW50ZW50aW9uYWxseSB1bnRyYWNrZWQgZmlsZXMgdG8gaWdub3JlCisKK1NZTk9QU0lTCistLS0tLS0tLQorJEdJVF9ESVIvaW5mby9leGNsdWRlLCAuZ2l0aWdub3JlCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitBIGBnaXRpZ25vcmVgIGZpbGUgc3BlY2lmaWVzIGludGVudGlvbmFsbHkgdW50cmFja2VkIGZpbGVzIHRoYXQKK2dpdCBzaG91bGQgaWdub3JlLiAgRWFjaCBsaW5lIGluIGEgYGdpdGlnbm9yZWAgZmlsZSBzcGVjaWZpZXMgYQorcGF0dGVybi4KKworV2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIGlnbm9yZSBhIHBhdGgsIGdpdCBub3JtYWxseSBjaGVja3MKK2BnaXRpZ25vcmVgIHBhdHRlcm5zIGZyb20gbXVsdGlwbGUgc291cmNlcywgd2l0aCB0aGUgZm9sbG93aW5nCitvcmRlciBvZiBwcmVjZWRlbmNlLCBmcm9tIGhpZ2hlc3QgdG8gbG93ZXN0ICh3aXRoaW4gb25lIGxldmVsIG9mCitwcmVjZWRlbmNlLCB0aGUgbGFzdCBtYXRjaGluZyBwYXR0ZXJuIGRlY2lkZXMgdGhlIG91dGNvbWUpOgorCisgKiBQYXR0ZXJucyByZWFkIGZyb20gdGhlIGNvbW1hbmQgbGluZSBmb3IgdGhvc2UgY29tbWFuZHMgdGhhdCBzdXBwb3J0CisgICB0aGVtLgorCisgKiBQYXR0ZXJucyByZWFkIGZyb20gYSBgLmdpdGlnbm9yZWAgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkKKyAgIGFzIHRoZSBwYXRoLCBvciBpbiBhbnkgcGFyZW50IGRpcmVjdG9yeSwgd2l0aCBwYXR0ZXJucyBpbiB0aGUKKyAgIGhpZ2hlciBsZXZlbCBmaWxlcyAodXAgdG8gdGhlIHJvb3QpIGJlaW5nIG92ZXJyaWRkZW4gYnkgdGhvc2UgaW4KKyAgIGxvd2VyIGxldmVsIGZpbGVzIGRvd24gdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmaWxlLgorICAgVGhlc2UgcGF0dGVybnMgbWF0Y2ggcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZQorICAgYC5naXRpZ25vcmVgIGZpbGUuICBBIHByb2plY3Qgbm9ybWFsbHkgaW5jbHVkZXMgc3VjaAorICAgYC5naXRpZ25vcmVgIGZpbGVzIGluIGl0cyByZXBvc2l0b3J5LCBjb250YWluaW5nIHBhdHRlcm5zIGZvcgorICAgZmlsZXMgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhlIHByb2plY3QgYnVpbGQuCisKKyAqIFBhdHRlcm5zIHJlYWQgZnJvbSBgJEdJVF9ESVIvaW5mby9leGNsdWRlYC4KKworICogUGF0dGVybnMgcmVhZCBmcm9tIHRoZSBmaWxlIHNwZWNpZmllZCBieSB0aGUgY29uZmlndXJhdGlvbgorICAgdmFyaWFibGUgJ2NvcmUuZXhjbHVkZXNmaWxlJy4KKworV2hpY2ggZmlsZSB0byBwbGFjZSBhIHBhdHRlcm4gaW4gZGVwZW5kcyBvbiBob3cgdGhlIHBhdHRlcm4gaXMgbWVhbnQgdG8KK2JlIHVzZWQuIFBhdHRlcm5zIHdoaWNoIHNob3VsZCBiZSB2ZXJzaW9uLWNvbnRyb2xsZWQgYW5kIGRpc3RyaWJ1dGVkIHRvCitvdGhlciByZXBvc2l0b3JpZXMgdmlhIGNsb25lIChpLmUuLCBmaWxlcyB0aGF0IGFsbCBkZXZlbG9wZXJzIHdpbGwgd2FudAordG8gaWdub3JlKSBzaG91bGQgZ28gaW50byBhIGAuZ2l0aWdub3JlYCBmaWxlLiBQYXR0ZXJucyB3aGljaCBhcmUKK3NwZWNpZmljIHRvIGEgcGFydGljdWxhciByZXBvc2l0b3J5IGJ1dCB3aGljaCBkbyBub3QgbmVlZCB0byBiZSBzaGFyZWQKK3dpdGggb3RoZXIgcmVsYXRlZCByZXBvc2l0b3JpZXMgKGUuZy4sIGF1eGlsaWFyeSBmaWxlcyB0aGF0IGxpdmUgaW5zaWRlCit0aGUgcmVwb3NpdG9yeSBidXQgYXJlIHNwZWNpZmljIHRvIG9uZSB1c2VyJ3Mgd29ya2Zsb3cpIHNob3VsZCBnbyBpbnRvCit0aGUgYCRHSVRfRElSL2luZm8vZXhjbHVkZWAgZmlsZS4gIFBhdHRlcm5zIHdoaWNoIGEgdXNlciB3YW50cyBnaXQgdG8KK2lnbm9yZSBpbiBhbGwgc2l0dWF0aW9ucyAoZS5nLiwgYmFja3VwIG9yIHRlbXBvcmFyeSBmaWxlcyBnZW5lcmF0ZWQgYnkKK3RoZSB1c2VyJ3MgZWRpdG9yIG9mIGNob2ljZSkgZ2VuZXJhbGx5IGdvIGludG8gYSBmaWxlIHNwZWNpZmllZCBieQorYGNvcmUuZXhjbHVkZXNmaWxlYCBpbiB0aGUgdXNlcidzIGB+Ly5naXRjb25maWdgLgorCitUaGUgdW5kZXJseWluZyBnaXQgcGx1bWJpbmcgdG9vbHMsIHN1Y2ggYXMKK2xpbmtnaXQ6Z2l0LWxzLWZpbGVzWzFdIGFuZCBsaW5rZ2l0OmdpdC1yZWFkLXRyZWVbMV0sIHJlYWQKK2BnaXRpZ25vcmVgIHBhdHRlcm5zIHNwZWNpZmllZCBieSBjb21tYW5kLWxpbmUgb3B0aW9ucywgb3IgZnJvbQorZmlsZXMgc3BlY2lmaWVkIGJ5IGNvbW1hbmQtbGluZSBvcHRpb25zLiAgSGlnaGVyLWxldmVsIGdpdAordG9vbHMsIHN1Y2ggYXMgbGlua2dpdDpnaXQtc3RhdHVzWzFdIGFuZCBsaW5rZ2l0OmdpdC1hZGRbMV0sCit1c2UgcGF0dGVybnMgZnJvbSB0aGUgc291cmNlcyBzcGVjaWZpZWQgYWJvdmUuCisKK1BhdHRlcm5zIGhhdmUgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisKKyAtIEEgYmxhbmsgbGluZSBtYXRjaGVzIG5vIGZpbGVzLCBzbyBpdCBjYW4gc2VydmUgYXMgYSBzZXBhcmF0b3IKKyAgIGZvciByZWFkYWJpbGl0eS4KKworIC0gQSBsaW5lIHN0YXJ0aW5nIHdpdGggIyBzZXJ2ZXMgYXMgYSBjb21tZW50LgorCisgLSBBbiBvcHRpb25hbCBwcmVmaXggJyEnIHdoaWNoIG5lZ2F0ZXMgdGhlIHBhdHRlcm47IGFueQorICAgbWF0Y2hpbmcgZmlsZSBleGNsdWRlZCBieSBhIHByZXZpb3VzIHBhdHRlcm4gd2lsbCBiZWNvbWUKKyAgIGluY2x1ZGVkIGFnYWluLiAgSWYgYSBuZWdhdGVkIHBhdHRlcm4gbWF0Y2hlcywgdGhpcyB3aWxsCisgICBvdmVycmlkZSBsb3dlciBwcmVjZWRlbmNlIHBhdHRlcm5zIHNvdXJjZXMuCisKKyAtIElmIHRoZSBwYXR0ZXJuIGVuZHMgd2l0aCBhIHNsYXNoLCBpdCBpcyByZW1vdmVkIGZvciB0aGUKKyAgIHB1cnBvc2Ugb2YgdGhlIGZvbGxvd2luZyBkZXNjcmlwdGlvbiwgYnV0IGl0IHdvdWxkIG9ubHkgZmluZAorICAgYSBtYXRjaCB3aXRoIGEgZGlyZWN0b3J5LiAgSW4gb3RoZXIgd29yZHMsIGBmb28vYCB3aWxsIG1hdGNoIGEKKyAgIGRpcmVjdG9yeSBgZm9vYCBhbmQgcGF0aHMgdW5kZXJuZWF0aCBpdCwgYnV0IHdpbGwgbm90IG1hdGNoIGEKKyAgIHJlZ3VsYXIgZmlsZSBvciBhIHN5bWJvbGljIGxpbmsgYGZvb2AgKHRoaXMgaXMgY29uc2lzdGVudAorICAgd2l0aCB0aGUgd2F5IGhvdyBwYXRoc3BlYyB3b3JrcyBpbiBnZW5lcmFsIGluIGdpdCkuCisKKyAtIElmIHRoZSBwYXR0ZXJuIGRvZXMgbm90IGNvbnRhaW4gYSBzbGFzaCAnLycsIGdpdCB0cmVhdHMgaXQgYXMKKyAgIGEgc2hlbGwgZ2xvYiBwYXR0ZXJuIGFuZCBjaGVja3MgZm9yIGEgbWF0Y2ggYWdhaW5zdCB0aGUKKyAgIHBhdGhuYW1lIHdpdGhvdXQgbGVhZGluZyBkaXJlY3Rvcmllcy4KKworIC0gT3RoZXJ3aXNlLCBnaXQgdHJlYXRzIHRoZSBwYXR0ZXJuIGFzIGEgc2hlbGwgZ2xvYiBzdWl0YWJsZQorICAgZm9yIGNvbnN1bXB0aW9uIGJ5IGZubWF0Y2goMykgd2l0aCB0aGUgRk5NX1BBVEhOQU1FIGZsYWc6CisgICB3aWxkY2FyZHMgaW4gdGhlIHBhdHRlcm4gd2lsbCBub3QgbWF0Y2ggYSAvIGluIHRoZSBwYXRobmFtZS4KKyAgIEZvciBleGFtcGxlLCAiRG9jdW1lbnRhdGlvbi9cKi5odG1sIiBtYXRjaGVzCisgICAiRG9jdW1lbnRhdGlvbi9naXQuaHRtbCIgYnV0IG5vdAorICAgIkRvY3VtZW50YXRpb24vcHBjL3BwYy5odG1sIi4gIEEgbGVhZGluZyBzbGFzaCBtYXRjaGVzIHRoZQorICAgYmVnaW5uaW5nIG9mIHRoZSBwYXRobmFtZTsgZm9yIGV4YW1wbGUsICIvKi5jIiBtYXRjaGVzCisgICAiY2F0LWZpbGUuYyIgYnV0IG5vdCAibW96aWxsYS1zaGExL3NoYTEuYyIuCisKK0FuIGV4YW1wbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgJCBnaXQtc3RhdHVzCisgICAgWy4uLl0KKyAgICAjIFVudHJhY2tlZCBmaWxlczoKKyAgICBbLi4uXQorICAgICMgICAgICAgRG9jdW1lbnRhdGlvbi9mb28uaHRtbAorICAgICMgICAgICAgRG9jdW1lbnRhdGlvbi9naXRpZ25vcmUuaHRtbAorICAgICMgICAgICAgZmlsZS5vCisgICAgIyAgICAgICBsaWIuYQorICAgICMgICAgICAgc3JjL2ludGVybmFsLm8KKyAgICBbLi4uXQorICAgICQgY2F0IC5naXQvaW5mby9leGNsdWRlCisgICAgIyBpZ25vcmUgb2JqZWN0cyBhbmQgYXJjaGl2ZXMsIGFueXdoZXJlIGluIHRoZSB0cmVlLgorICAgICouW29hXQorICAgICQgY2F0IERvY3VtZW50YXRpb24vLmdpdGlnbm9yZQorICAgICMgaWdub3JlIGdlbmVyYXRlZCBodG1sIGZpbGVzLAorICAgICouaHRtbAorICAgICMgZXhjZXB0IGZvby5odG1sIHdoaWNoIGlzIG1haW50YWluZWQgYnkgaGFuZAorICAgICFmb28uaHRtbAorICAgICQgZ2l0LXN0YXR1cworICAgIFsuLi5dCisgICAgIyBVbnRyYWNrZWQgZmlsZXM6CisgICAgWy4uLl0KKyAgICAjICAgICAgIERvY3VtZW50YXRpb24vZm9vLmh0bWwKKyAgICBbLi4uXQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQW5vdGhlciBleGFtcGxlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICQgY2F0IC5naXRpZ25vcmUKKyAgICB2bWxpbnV4KgorICAgICQgbHMgYXJjaC9mb28va2VybmVsL3ZtKgorICAgIGFyY2gvZm9vL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisgICAgJCBlY2hvICchL3ZtbGludXgqJyA+YXJjaC9mb28va2VybmVsLy5naXRpZ25vcmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBzZWNvbmQgLmdpdGlnbm9yZSBwcmV2ZW50cyBnaXQgZnJvbSBpZ25vcmluZworYGFyY2gvZm9vL2tlcm5lbC92bWxpbnV4Lmxkcy5TYC4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubywgSm9zaCBUcmlwbGV0dCwKK0ZyYW5rIExpY2h0ZW5oZWxkLCBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdGsudHh0IGIvRG9jdW1lbnRhdGlvbi9naXRrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWVkYWZjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXRrLnR4dApAQCAtMCwwICsxLDEwMSBAQAorZ2l0aygxKQorPT09PT09PQorCitOQU1FCistLS0tCitnaXRrIC0gVGhlIGdpdCByZXBvc2l0b3J5IGJyb3dzZXIKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0aycgWzxvcHRpb24+Li4uXSBbPHJldnM+XSBbLS1dIFs8cGF0aD4uLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorRGlzcGxheXMgY2hhbmdlcyBpbiBhIHJlcG9zaXRvcnkgb3IgYSBzZWxlY3RlZCBzZXQgb2YgY29tbWl0cy4gVGhpcyBpbmNsdWRlcwordmlzdWFsaXppbmcgdGhlIGNvbW1pdCBncmFwaCwgc2hvd2luZyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGVhY2ggY29tbWl0LCBhbmQKK3RoZSBmaWxlcyBpbiB0aGUgdHJlZXMgb2YgZWFjaCByZXZpc2lvbi4KKworSGlzdG9yaWNhbGx5LCBnaXRrIHdhcyB0aGUgZmlyc3QgcmVwb3NpdG9yeSBicm93c2VyLiBJdCdzIHdyaXR0ZW4gaW4gdGNsL3RrCithbmQgc3RhcnRlZCBvZmYgaW4gYSBzZXBhcmF0ZSByZXBvc2l0b3J5IGJ1dCB3YXMgbGF0ZXIgbWVyZ2VkIGludG8gdGhlIG1haW4KK2dpdCByZXBvc2l0b3J5LgorCitPUFRJT05TCistLS0tLS0tCitUbyBjb250cm9sIHdoaWNoIHJldmlzaW9ucyB0byBzaG93biwgdGhlIGNvbW1hbmQgdGFrZXMgb3B0aW9ucyBhcHBsaWNhYmxlIHRvCit0aGUgbGlua2dpdDpnaXQtcmV2LWxpc3RbMV0gY29tbWFuZC4gVGhpcyBtYW51YWwgcGFnZSBkZXNjcmliZXMgb25seSB0aGUgbW9zdAorZnJlcXVlbnRseSB1c2VkIG9wdGlvbnMuCisKKy1uIDxudW1iZXI+LCAtLW1heC1jb3VudD08bnVtYmVyPjo6CisKKwlMaW1pdHMgdGhlIG51bWJlciBvZiBjb21taXRzIHRvIHNob3cuCisKKy0tc2luY2U9PGRhdGU+OjoKKworCVNob3cgY29tbWl0cyBtb3JlIHJlY2VudCB0aGFuIGEgc3BlY2lmaWMgZGF0ZS4KKworLS11bnRpbD08ZGF0ZT46OgorCisJU2hvdyBjb21taXRzIG9sZGVyIHRoYW4gYSBzcGVjaWZpYyBkYXRlLgorCistLWFsbDo6CisKKwlTaG93IGFsbCBicmFuY2hlcy4KKworPHJldnM+OjoKKworCUxpbWl0IHRoZSByZXZpc2lvbnMgdG8gc2hvdy4gVGhpcyBjYW4gYmUgZWl0aGVyIGEgc2luZ2xlIHJldmlzaW9uCisJbWVhbmluZyBzaG93IGZyb20gdGhlIGdpdmVuIHJldmlzaW9uIGFuZCBiYWNrLCBvciBpdCBjYW4gYmUgYSByYW5nZSBpbgorCXRoZSBmb3JtICInPGZyb20+Jy4uJzx0bz4nIiB0byBzaG93IGFsbCByZXZpc2lvbnMgYmV0d2VlbiAnPGZyb20+JyBhbmQKKwliYWNrIHRvICc8dG8+Jy4gTm90ZSwgbW9yZSBhZHZhbmNlZCByZXZpc2lvbiBzZWxlY3Rpb24gY2FuIGJlIGFwcGxpZWQuCisJRm9yIGEgbW9yZSBjb21wbGV0ZSBsaXN0IG9mIHdheXMgdG8gc3BlbGwgb2JqZWN0IG5hbWVzLCBzZWUKKwkiU1BFQ0lGWUlORyBSRVZJU0lPTlMiIHNlY3Rpb24gaW4gbGlua2dpdDpnaXQtcmV2LXBhcnNlWzFdLgorCis8cGF0aD46OgorCisJTGltaXQgY29tbWl0cyB0byB0aGUgb25lcyB0b3VjaGluZyBmaWxlcyBpbiB0aGUgZ2l2ZW4gcGF0aHMuIE5vdGUsIHRvCisJYXZvaWQgYW1iaWd1aXR5IHdydC4gcmV2aXNpb24gbmFtZXMgdXNlICItLSIgdG8gc2VwYXJhdGUgdGhlIHBhdGhzCisJZnJvbSBhbnkgcHJlY2VkaW5nIG9wdGlvbnMuCisKK0V4YW1wbGVzCistLS0tLS0tLQorZ2l0ayB2Mi42LjEyLi4gaW5jbHVkZS9zY3NpIGRyaXZlcnMvc2NzaTo6CisKKwlTaG93IGFzIHRoZSBjaGFuZ2VzIHNpbmNlIHZlcnNpb24gJ3YyLjYuMTInIHRoYXQgY2hhbmdlZCBhbnkKKwlmaWxlIGluIHRoZSBpbmNsdWRlL3Njc2kgb3IgZHJpdmVycy9zY3NpIHN1YmRpcmVjdG9yaWVzCisKK2dpdGsgLS1zaW5jZT0iMiB3ZWVrcyBhZ28iIFwtLSBnaXRrOjoKKworCVNob3cgdGhlIGNoYW5nZXMgZHVyaW5nIHRoZSBsYXN0IHR3byB3ZWVrcyB0byB0aGUgZmlsZSAnZ2l0aycuCisJVGhlICItLSIgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGNvbmZ1c2lvbiB3aXRoIHRoZSAqYnJhbmNoKiBuYW1lZAorCSdnaXRrJworCitnaXRrIC0tbWF4LWNvdW50PTEwMCAtLWFsbCBcLS0gTWFrZWZpbGU6OgorCisJU2hvdyBhdCBtb3N0IDEwMCBjaGFuZ2VzIG1hZGUgdG8gdGhlIGZpbGUgJ01ha2VmaWxlJy4gSW5zdGVhZCBvZiBvbmx5CisJbG9va2luZyBmb3IgY2hhbmdlcyBpbiB0aGUgY3VycmVudCBicmFuY2ggbG9vayBpbiBhbGwgYnJhbmNoZXMuCisKK1NlZSBBbHNvCistLS0tLS0tLQorJ3FnaXQoMSknOjoKKwlBIHJlcG9zaXRvcnkgYnJvd3NlciB3cml0dGVuIGluIEMrKyB1c2luZyBRdC4KKworJ2dpdHZpZXcoMSknOjoKKwlBIHJlcG9zaXRvcnkgYnJvd3NlciB3cml0dGVuIGluIFB5dGhvbiB1c2luZyBHdGsuIEl0J3MgYmFzZWQgb24KKwknYnpyaygxKScgYW5kIGRpc3RyaWJ1dGVkIGluIHRoZSBjb250cmliIGFyZWEgb2YgdGhlIGdpdCByZXBvc2l0b3J5LgorCisndGlnKDEpJzo6CisJQSBtaW5pbWFsIHJlcG9zaXRvcnkgYnJvd3NlciBhbmQgZ2l0IHRvb2wgb3V0cHV0IGhpZ2hsaWdodGVyIHdyaXR0ZW4KKwlpbiBDIHVzaW5nIE5jdXJzZXMuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IFBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPi4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8sIEpvbmFzIEZvbnNlY2EsIGFuZCB0aGUgZ2l0LWxpc3QKKzxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbmtnaXQ6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdG1vZHVsZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9naXRtb2R1bGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzk1YjY5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXRtb2R1bGVzLnR4dApAQCAtMCwwICsxLDYyIEBACitnaXRtb2R1bGVzKDUpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdG1vZHVsZXMgLSBkZWZpbmluZyBzdWJtb2R1bGUgcHJvcGVydGllcworCitTWU5PUFNJUworLS0tLS0tLS0KK2dpdG1vZHVsZXMKKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworVGhlIGAuZ2l0bW9kdWxlc2AgZmlsZSwgbG9jYXRlZCBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSBvZiBhIGdpdAord29ya2luZyB0cmVlLCBpcyBhIHRleHQgZmlsZSB3aXRoIGEgc3ludGF4IG1hdGNoaW5nIHRoZSByZXF1aXJlbWVudHMKK29mIGxpbmtnaXQ6Z2l0LWNvbmZpZ1sxXS4KKworVGhlIGZpbGUgY29udGFpbnMgb25lIHN1YnNlY3Rpb24gcGVyIHN1Ym1vZHVsZSwgYW5kIHRoZSBzdWJzZWN0aW9uIHZhbHVlCitpcyB0aGUgbmFtZSBvZiB0aGUgc3VibW9kdWxlLiBFYWNoIHN1Ym1vZHVsZSBzZWN0aW9uIGFsc28gY29udGFpbnMgdGhlCitmb2xsb3dpbmcgcmVxdWlyZWQga2V5czoKKworc3VibW9kdWxlLjxuYW1lPi5wYXRoOjoKKwlEZWZpbmVzIHRoZSBwYXRoLCByZWxhdGl2ZSB0byB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSBvZiB0aGUgZ2l0CisJd29ya2luZyB0cmVlLCB3aGVyZSB0aGUgc3VibW9kdWxlIGlzIGV4cGVjdGVkIHRvIGJlIGNoZWNrZWQgb3V0LgorCVRoZSBwYXRoIG5hbWUgbXVzdCBub3QgZW5kIHdpdGggYSBgL2AuIEFsbCBzdWJtb2R1bGUgcGF0aHMgbXVzdAorCWJlIHVuaXF1ZSB3aXRoaW4gdGhlIC5naXRtb2R1bGVzIGZpbGUuCisKK3N1Ym1vZHVsZS48bmFtZT4udXJsOjoKKwlEZWZpbmVzIGFuIHVybCBmcm9tIHdoZXJlIHRoZSBzdWJtb2R1bGUgcmVwb3NpdG9yeSBjYW4gYmUgY2xvbmVkLgorCisKK0VYQU1QTEVTCistLS0tLS0tLQorCitDb25zaWRlciB0aGUgZm9sbG93aW5nIC5naXRtb2R1bGVzIGZpbGU6CisKKwlbc3VibW9kdWxlICJsaWJmb28iXQorCQlwYXRoID0gaW5jbHVkZS9mb28KKwkJdXJsID0gZ2l0Oi8vZm9vLmNvbS9naXQvbGliLmdpdAorCisJW3N1Ym1vZHVsZSAibGliYmFyIl0KKwkJcGF0aCA9IGluY2x1ZGUvYmFyCisJCXVybCA9IGdpdDovL2Jhci5jb20vZ2l0L2xpYi5naXQKKworCitUaGlzIGRlZmluZXMgdHdvIHN1Ym1vZHVsZXMsIGBsaWJmb29gIGFuZCBgbGliYmFyYC4gVGhlc2UgYXJlIGV4cGVjdGVkIHRvCitiZSBjaGVja2VkIG91dCBpbiB0aGUgcGF0aHMgJ2luY2x1ZGUvZm9vJyBhbmQgJ2luY2x1ZGUvYmFyJywgYW5kIGZvciBib3RoCitzdWJtb2R1bGVzIGFuIHVybCBpcyBzcGVjaWZpZWQgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGNsb25pbmcgdGhlIHN1Ym1vZHVsZXMuCisKK1NFRSBBTFNPCistLS0tLS0tLQorbGlua2dpdDpnaXQtc3VibW9kdWxlWzFdIGxpbmtnaXQ6Z2l0LWNvbmZpZ1sxXQorCitET0NVTUVOVEFUSU9OCistLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IExhcnMgSGplbWxpIDxoamVtbGlAZ21haWwuY29tPgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgbGlua2dpdDpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2xvc3NhcnkudHh0IGIvRG9jdW1lbnRhdGlvbi9nbG9zc2FyeS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiNjM1MwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2xvc3NhcnkudHh0CkBAIC0wLDAgKzEsNDU3IEBACitHSVQgR2xvc3NhcnkKKz09PT09PT09PT09PQorCitbW2RlZl9hbHRlcm5hdGVfb2JqZWN0X2RhdGFiYXNlXV1hbHRlcm5hdGUgb2JqZWN0IGRhdGFiYXNlOjoKKwlWaWEgdGhlIGFsdGVybmF0ZXMgbWVjaGFuaXNtLCBhIDw8ZGVmX3JlcG9zaXRvcnkscmVwb3NpdG9yeT4+CisJY2FuIGluaGVyaXQgcGFydCBvZiBpdHMgPDxkZWZfb2JqZWN0X2RhdGFiYXNlLG9iamVjdCBkYXRhYmFzZT4+CisJZnJvbSBhbm90aGVyIG9iamVjdCBkYXRhYmFzZSwgd2hpY2ggaXMgY2FsbGVkICJhbHRlcm5hdGUiLgorCitbW2RlZl9iYXJlX3JlcG9zaXRvcnldXWJhcmUgcmVwb3NpdG9yeTo6CisJQSBiYXJlIHJlcG9zaXRvcnkgaXMgbm9ybWFsbHkgYW4gYXBwcm9wcmlhdGVseQorCW5hbWVkIDw8ZGVmX2RpcmVjdG9yeSxkaXJlY3Rvcnk+PiB3aXRoIGEgYC5naXRgIHN1ZmZpeCB0aGF0IGRvZXMgbm90CisJaGF2ZSBhIGxvY2FsbHkgY2hlY2tlZC1vdXQgY29weSBvZiBhbnkgb2YgdGhlIGZpbGVzIHVuZGVyCisJcmV2aXNpb24gY29udHJvbC4gVGhhdCBpcywgYWxsIG9mIHRoZSBgZ2l0YAorCWFkbWluaXN0cmF0aXZlIGFuZCBjb250cm9sIGZpbGVzIHRoYXQgd291bGQgbm9ybWFsbHkgYmUgcHJlc2VudCBpbiB0aGUKKwloaWRkZW4gYC5naXRgIHN1Yi1kaXJlY3RvcnkgYXJlIGRpcmVjdGx5IHByZXNlbnQgaW4gdGhlCisJYHJlcG9zaXRvcnkuZ2l0YCBkaXJlY3RvcnkgaW5zdGVhZCwKKwlhbmQgbm8gb3RoZXIgZmlsZXMgYXJlIHByZXNlbnQgYW5kIGNoZWNrZWQgb3V0LiBVc3VhbGx5IHB1Ymxpc2hlcnMgb2YKKwlwdWJsaWMgcmVwb3NpdG9yaWVzIG1ha2UgYmFyZSByZXBvc2l0b3JpZXMgYXZhaWxhYmxlLgorCitbW2RlZl9ibG9iX29iamVjdF1dYmxvYiBvYmplY3Q6OgorCVVudHlwZWQgPDxkZWZfb2JqZWN0LG9iamVjdD4+LCBlLmcuIHRoZSBjb250ZW50cyBvZiBhIGZpbGUuCisKK1tbZGVmX2JyYW5jaF1dYnJhbmNoOjoKKwlBICJicmFuY2giIGlzIGFuIGFjdGl2ZSBsaW5lIG9mIGRldmVsb3BtZW50LiAgVGhlIG1vc3QgcmVjZW50CisJPDxkZWZfY29tbWl0LGNvbW1pdD4+IG9uIGEgYnJhbmNoIGlzIHJlZmVycmVkIHRvIGFzIHRoZSB0aXAgb2YKKwl0aGF0IGJyYW5jaC4gIFRoZSB0aXAgb2YgdGhlIGJyYW5jaCBpcyByZWZlcmVuY2VkIGJ5IGEgYnJhbmNoCisJPDxkZWZfaGVhZCxoZWFkPj4sIHdoaWNoIG1vdmVzIGZvcndhcmQgYXMgYWRkaXRpb25hbCBkZXZlbG9wbWVudAorCWlzIGRvbmUgb24gdGhlIGJyYW5jaC4gIEEgc2luZ2xlIGdpdAorCTw8ZGVmX3JlcG9zaXRvcnkscmVwb3NpdG9yeT4+IGNhbiB0cmFjayBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mCisJYnJhbmNoZXMsIGJ1dCB5b3VyIDw8ZGVmX3dvcmtpbmdfdHJlZSx3b3JraW5nIHRyZWU+PiBpcworCWFzc29jaWF0ZWQgd2l0aCBqdXN0IG9uZSBvZiB0aGVtICh0aGUgImN1cnJlbnQiIG9yICJjaGVja2VkIG91dCIKKwlicmFuY2gpLCBhbmQgPDxkZWZfSEVBRCxIRUFEPj4gcG9pbnRzIHRvIHRoYXQgYnJhbmNoLgorCitbW2RlZl9jYWNoZV1dY2FjaGU6OgorCU9ic29sZXRlIGZvcjogPDxkZWZfaW5kZXgsaW5kZXg+Pi4KKworW1tkZWZfY2hhaW5dXWNoYWluOjoKKwlBIGxpc3Qgb2Ygb2JqZWN0cywgd2hlcmUgZWFjaCA8PGRlZl9vYmplY3Qsb2JqZWN0Pj4gaW4gdGhlIGxpc3QgY29udGFpbnMKKwlhIHJlZmVyZW5jZSB0byBpdHMgc3VjY2Vzc29yIChmb3IgZXhhbXBsZSwgdGhlIHN1Y2Nlc3NvciBvZiBhCisJPDxkZWZfY29tbWl0LGNvbW1pdD4+IGNvdWxkIGJlIG9uZSBvZiBpdHMgPDxkZWZfcGFyZW50LHBhcmVudHM+PikuCisKK1tbZGVmX2NoYW5nZXNldF1dY2hhbmdlc2V0OjoKKwlCaXRLZWVwZXIvY3ZzcHMgc3BlYWsgZm9yICI8PGRlZl9jb21taXQsY29tbWl0Pj4iLiBTaW5jZSBnaXQgZG9lcyBub3QKKwlzdG9yZSBjaGFuZ2VzLCBidXQgc3RhdGVzLCBpdCByZWFsbHkgZG9lcyBub3QgbWFrZSBzZW5zZSB0byB1c2UgdGhlIHRlcm0KKwkiY2hhbmdlc2V0cyIgd2l0aCBnaXQuCisKK1tbZGVmX2NoZWNrb3V0XV1jaGVja291dDo6CisJVGhlIGFjdGlvbiBvZiB1cGRhdGluZyBhbGwgb3IgcGFydCBvZiB0aGUKKwk8PGRlZl93b3JraW5nX3RyZWUsd29ya2luZyB0cmVlPj4gd2l0aCBhIDw8ZGVmX3RyZWVfb2JqZWN0LHRyZWUgb2JqZWN0Pj4KKwlvciA8PGRlZl9ibG9iX29iamVjdCxibG9iPj4gZnJvbSB0aGUKKwk8PGRlZl9vYmplY3RfZGF0YWJhc2Usb2JqZWN0IGRhdGFiYXNlPj4sIGFuZCB1cGRhdGluZyB0aGUKKwk8PGRlZl9pbmRleCxpbmRleD4+IGFuZCA8PGRlZl9IRUFELEhFQUQ+PiBpZiB0aGUgd2hvbGUgd29ya2luZyB0cmVlIGhhcworCWJlZW4gcG9pbnRlZCBhdCBhIG5ldyA8PGRlZl9icmFuY2gsYnJhbmNoPj4uCisKK1tbZGVmX2NoZXJyeS1waWNraW5nXV1jaGVycnktcGlja2luZzo6CisJSW4gPDxkZWZfU0NNLFNDTT4+IGphcmdvbiwgImNoZXJyeSBwaWNrIiBtZWFucyB0byBjaG9vc2UgYSBzdWJzZXQgb2YKKwljaGFuZ2VzIG91dCBvZiBhIHNlcmllcyBvZiBjaGFuZ2VzICh0eXBpY2FsbHkgY29tbWl0cykgYW5kIHJlY29yZCB0aGVtCisJYXMgYSBuZXcgc2VyaWVzIG9mIGNoYW5nZXMgb24gdG9wIG9mIGEgZGlmZmVyZW50IGNvZGViYXNlLiBJbiBHSVQsIHRoaXMgaXMKKwlwZXJmb3JtZWQgYnkgdGhlICJnaXQgY2hlcnJ5LXBpY2siIGNvbW1hbmQgdG8gZXh0cmFjdCB0aGUgY2hhbmdlIGludHJvZHVjZWQKKwlieSBhbiBleGlzdGluZyA8PGRlZl9jb21taXQsY29tbWl0Pj4gYW5kIHRvIHJlY29yZCBpdCBiYXNlZCBvbiB0aGUgdGlwCisJb2YgdGhlIGN1cnJlbnQgPDxkZWZfYnJhbmNoLGJyYW5jaD4+IGFzIGEgbmV3IGNvbW1pdC4KKworW1tkZWZfY2xlYW5dXWNsZWFuOjoKKwlBIDw8ZGVmX3dvcmtpbmdfdHJlZSx3b3JraW5nIHRyZWU+PiBpcyBjbGVhbiwgaWYgaXQKKwljb3JyZXNwb25kcyB0byB0aGUgPDxkZWZfcmV2aXNpb24scmV2aXNpb24+PiByZWZlcmVuY2VkIGJ5IHRoZSBjdXJyZW50CisJPDxkZWZfaGVhZCxoZWFkPj4uIEFsc28gc2VlICI8PGRlZl9kaXJ0eSxkaXJ0eT4+Ii4KKworW1tkZWZfY29tbWl0XV1jb21taXQ6OgorCUFzIGEgbm91bjogQSBzaW5nbGUgcG9pbnQgaW4gdGhlCisJZ2l0IGhpc3Rvcnk7IHRoZSBlbnRpcmUgaGlzdG9yeSBvZiBhIHByb2plY3QgaXMgcmVwcmVzZW50ZWQgYXMgYQorCXNldCBvZiBpbnRlcnJlbGF0ZWQgY29tbWl0cy4gIFRoZSB3b3JkICJjb21taXQiIGlzIG9mdGVuCisJdXNlZCBieSBnaXQgaW4gdGhlIHNhbWUgcGxhY2VzIG90aGVyIHJldmlzaW9uIGNvbnRyb2wgc3lzdGVtcworCXVzZSB0aGUgd29yZHMgInJldmlzaW9uIiBvciAidmVyc2lvbiIuICBBbHNvIHVzZWQgYXMgYSBzaG9ydAorCWhhbmQgZm9yIDw8ZGVmX2NvbW1pdF9vYmplY3QsY29tbWl0IG9iamVjdD4+LgorKworQXMgYSB2ZXJiOiBUaGUgYWN0aW9uIG9mIHN0b3JpbmcgYSBuZXcgc25hcHNob3Qgb2YgdGhlIHByb2plY3Qncworc3RhdGUgaW4gdGhlIGdpdCBoaXN0b3J5LCBieSBjcmVhdGluZyBhIG5ldyBjb21taXQgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50CitzdGF0ZSBvZiB0aGUgPDxkZWZfaW5kZXgsaW5kZXg+PiBhbmQgYWR2YW5jaW5nIDw8ZGVmX0hFQUQsSEVBRD4+Cit0byBwb2ludCBhdCB0aGUgbmV3IGNvbW1pdC4KKworW1tkZWZfY29tbWl0X29iamVjdF1dY29tbWl0IG9iamVjdDo6CisJQW4gPDxkZWZfb2JqZWN0LG9iamVjdD4+IHdoaWNoIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhCisJcGFydGljdWxhciA8PGRlZl9yZXZpc2lvbixyZXZpc2lvbj4+LCBzdWNoIGFzIDw8ZGVmX3BhcmVudCxwYXJlbnRzPj4sIGNvbW1pdHRlciwKKwlhdXRob3IsIGRhdGUgYW5kIHRoZSA8PGRlZl90cmVlX29iamVjdCx0cmVlIG9iamVjdD4+IHdoaWNoIGNvcnJlc3BvbmRzCisJdG8gdGhlIHRvcCA8PGRlZl9kaXJlY3RvcnksZGlyZWN0b3J5Pj4gb2YgdGhlIHN0b3JlZAorCXJldmlzaW9uLgorCitbW2RlZl9jb3JlX2dpdF1dY29yZSBnaXQ6OgorCUZ1bmRhbWVudGFsIGRhdGEgc3RydWN0dXJlcyBhbmQgdXRpbGl0aWVzIG9mIGdpdC4gRXhwb3NlcyBvbmx5IGxpbWl0ZWQKKwlzb3VyY2UgY29kZSBtYW5hZ2VtZW50IHRvb2xzLgorCitbW2RlZl9EQUddXURBRzo6CisJRGlyZWN0ZWQgYWN5Y2xpYyBncmFwaC4gVGhlIDw8ZGVmX2NvbW1pdCxjb21taXQ+PiBvYmplY3RzIGZvcm0gYQorCWRpcmVjdGVkIGFjeWNsaWMgZ3JhcGgsIGJlY2F1c2UgdGhleSBoYXZlIHBhcmVudHMgKGRpcmVjdGVkKSwgYW5kIHRoZQorCWdyYXBoIG9mIGNvbW1pdCBvYmplY3RzIGlzIGFjeWNsaWMgKHRoZXJlIGlzIG5vCisJPDxkZWZfY2hhaW4sY2hhaW4+PiB3aGljaCBiZWdpbnMgYW5kIGVuZHMgd2l0aCB0aGUgc2FtZQorCTw8ZGVmX29iamVjdCxvYmplY3Q+PikuCisKK1tbZGVmX2RhbmdsaW5nX29iamVjdF1dZGFuZ2xpbmcgb2JqZWN0OjoKKwlBbiA8PGRlZl91bnJlYWNoYWJsZV9vYmplY3QsdW5yZWFjaGFibGUgb2JqZWN0Pj4gd2hpY2ggaXMgbm90CisJPDxkZWZfcmVhY2hhYmxlLHJlYWNoYWJsZT4+IGV2ZW4gZnJvbSBvdGhlciB1bnJlYWNoYWJsZSBvYmplY3RzOyBhCisJZGFuZ2xpbmcgb2JqZWN0IGhhcyBubyByZWZlcmVuY2VzIHRvIGl0IGZyb20gYW55CisJcmVmZXJlbmNlIG9yIDw8ZGVmX29iamVjdCxvYmplY3Q+PiBpbiB0aGUgPDxkZWZfcmVwb3NpdG9yeSxyZXBvc2l0b3J5Pj4uCisKK1tbZGVmX2RldGFjaGVkX0hFQURdXWRldGFjaGVkIEhFQUQ6OgorCU5vcm1hbGx5IHRoZSA8PGRlZl9IRUFELEhFQUQ+PiBzdG9yZXMgdGhlIG5hbWUgb2YgYQorCTw8ZGVmX2JyYW5jaCxicmFuY2g+Pi4gIEhvd2V2ZXIsIGdpdCBhbHNvIGFsbG93cyB5b3UgdG8gPDxkZWZfY2hlY2tvdXQsY2hlY2sgb3V0Pj4KKwlhbiBhcmJpdHJhcnkgPDxkZWZfY29tbWl0LGNvbW1pdD4+IHRoYXQgaXNuJ3QgbmVjZXNzYXJpbHkgdGhlIHRpcCBvZiBhbnkKKwlwYXJ0aWN1bGFyIGJyYW5jaC4gIEluIHRoaXMgY2FzZSBIRUFEIGlzIHNhaWQgdG8gYmUgImRldGFjaGVkIi4KKworW1tkZWZfZGlyY2FjaGVdXWRpcmNhY2hlOjoKKwlZb3UgYXJlICp3YWFhYWF5KiBiZWhpbmQuIFNlZSA8PGRlZl9pbmRleCxpbmRleD4+LgorCitbW2RlZl9kaXJlY3RvcnldXWRpcmVjdG9yeTo6CisJVGhlIGxpc3QgeW91IGdldCB3aXRoICJscyIgOi0pCisKK1tbZGVmX2RpcnR5XV1kaXJ0eTo6CisJQSA8PGRlZl93b3JraW5nX3RyZWUsd29ya2luZyB0cmVlPj4gaXMgc2FpZCB0byBiZSAiZGlydHkiIGlmCisJaXQgY29udGFpbnMgbW9kaWZpY2F0aW9ucyB3aGljaCBoYXZlIG5vdCBiZWVuIDw8ZGVmX2NvbW1pdCxjb21taXR0ZWQ+PiB0byB0aGUgY3VycmVudAorCTw8ZGVmX2JyYW5jaCxicmFuY2g+Pi4KKworW1tkZWZfZW50XV1lbnQ6OgorCUZhdm9yaXRlIHN5bm9ueW0gdG8gIjw8ZGVmX3RyZWUtaXNoLHRyZWUtaXNoPj4iIGJ5IHNvbWUgdG90YWwgZ2Vla3MuIFNlZQorCWBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0VudF8oTWlkZGxlLWVhcnRoKWAgZm9yIGFuIGluLWRlcHRoCisJZXhwbGFuYXRpb24uIEF2b2lkIHRoaXMgdGVybSwgbm90IHRvIGNvbmZ1c2UgcGVvcGxlLgorCitbW2RlZl9ldmlsX21lcmdlXV1ldmlsIG1lcmdlOjoKKwlBbiBldmlsIG1lcmdlIGlzIGEgPDxkZWZfbWVyZ2UsbWVyZ2U+PiB0aGF0IGludHJvZHVjZXMgY2hhbmdlcyB0aGF0CisJZG8gbm90IGFwcGVhciBpbiBhbnkgPDxkZWZfcGFyZW50LHBhcmVudD4+LgorCitbW2RlZl9mYXN0X2ZvcndhcmRdXWZhc3QgZm9yd2FyZDo6CisJQSBmYXN0LWZvcndhcmQgaXMgYSBzcGVjaWFsIHR5cGUgb2YgPDxkZWZfbWVyZ2UsbWVyZ2U+PiB3aGVyZSB5b3UgaGF2ZSBhCisJPDxkZWZfcmV2aXNpb24scmV2aXNpb24+PiBhbmQgeW91IGFyZSAibWVyZ2luZyIgYW5vdGhlcgorCTw8ZGVmX2JyYW5jaCxicmFuY2g+PidzIGNoYW5nZXMgdGhhdCBoYXBwZW4gdG8gYmUgYSBkZXNjZW5kYW50IG9mIHdoYXQKKwl5b3UgaGF2ZS4gSW4gc3VjaCB0aGVzZSBjYXNlcywgeW91IGRvIG5vdCBtYWtlIGEgbmV3IDw8ZGVmX21lcmdlLG1lcmdlPj4KKwk8PGRlZl9jb21taXQsY29tbWl0Pj4gYnV0IGluc3RlYWQganVzdCB1cGRhdGUgdG8gaGlzCisJcmV2aXNpb24uIFRoaXMgd2lsbCBoYXBwZW4gZnJlcXVlbnRseSBvbiBhCisJPDxkZWZfdHJhY2tpbmdfYnJhbmNoLHRyYWNraW5nIGJyYW5jaD4+IG9mIGEgcmVtb3RlCisJPDxkZWZfcmVwb3NpdG9yeSxyZXBvc2l0b3J5Pj4uCisKK1tbZGVmX2ZldGNoXV1mZXRjaDo6CisJRmV0Y2hpbmcgYSA8PGRlZl9icmFuY2gsYnJhbmNoPj4gbWVhbnMgdG8gZ2V0IHRoZQorCWJyYW5jaCdzIDw8ZGVmX2hlYWRfcmVmLGhlYWQgcmVmPj4gZnJvbSBhIHJlbW90ZQorCTw8ZGVmX3JlcG9zaXRvcnkscmVwb3NpdG9yeT4+LCB0byBmaW5kIG91dCB3aGljaCBvYmplY3RzIGFyZQorCW1pc3NpbmcgZnJvbSB0aGUgbG9jYWwgPDxkZWZfb2JqZWN0X2RhdGFiYXNlLG9iamVjdCBkYXRhYmFzZT4+LAorCWFuZCB0byBnZXQgdGhlbSwgdG9vLiAgU2VlIGFsc28gbGlua2dpdDpnaXQtZmV0Y2hbMV0uCisKK1tbZGVmX2ZpbGVfc3lzdGVtXV1maWxlIHN5c3RlbTo6CisJTGludXMgVG9ydmFsZHMgb3JpZ2luYWxseSBkZXNpZ25lZCBnaXQgdG8gYmUgYSB1c2VyIHNwYWNlIGZpbGUgc3lzdGVtLAorCWkuZS4gdGhlIGluZnJhc3RydWN0dXJlIHRvIGhvbGQgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLiBUaGF0IGVuc3VyZWQgdGhlCisJZWZmaWNpZW5jeSBhbmQgc3BlZWQgb2YgZ2l0LgorCitbW2RlZl9naXRfYXJjaGl2ZV1dZ2l0IGFyY2hpdmU6OgorCVN5bm9ueW0gZm9yIDw8ZGVmX3JlcG9zaXRvcnkscmVwb3NpdG9yeT4+IChmb3IgYXJjaCBwZW9wbGUpLgorCitbW2RlZl9ncmFmdHNdXWdyYWZ0czo6CisJR3JhZnRzIGVuYWJsZXMgdHdvIG90aGVyd2lzZSBkaWZmZXJlbnQgbGluZXMgb2YgZGV2ZWxvcG1lbnQgdG8gYmUgam9pbmVkCisJdG9nZXRoZXIgYnkgcmVjb3JkaW5nIGZha2UgYW5jZXN0cnkgaW5mb3JtYXRpb24gZm9yIGNvbW1pdHMuIFRoaXMgd2F5CisJeW91IGNhbiBtYWtlIGdpdCBwcmV0ZW5kIHRoZSBzZXQgb2YgPDxkZWZfcGFyZW50LHBhcmVudHM+PiBhIDw8ZGVmX2NvbW1pdCxjb21taXQ+PiBoYXMKKwlpcyBkaWZmZXJlbnQgZnJvbSB3aGF0IHdhcyByZWNvcmRlZCB3aGVuIHRoZSBjb21taXQgd2FzCisJY3JlYXRlZC4gQ29uZmlndXJlZCB2aWEgdGhlIGAuZ2l0L2luZm8vZ3JhZnRzYCBmaWxlLgorCitbW2RlZl9oYXNoXV1oYXNoOjoKKwlJbiBnaXQncyBjb250ZXh0LCBzeW5vbnltIHRvIDw8ZGVmX29iamVjdF9uYW1lLG9iamVjdCBuYW1lPj4uCisKK1tbZGVmX2hlYWRdXWhlYWQ6OgorCUEgPDxkZWZfcmVmLG5hbWVkIHJlZmVyZW5jZT4+IHRvIHRoZSA8PGRlZl9jb21taXQsY29tbWl0Pj4gYXQgdGhlIHRpcCBvZiBhCisJPDxkZWZfYnJhbmNoLGJyYW5jaD4+LiAgSGVhZHMgYXJlIHN0b3JlZCBpbgorCWAkR0lUX0RJUi9yZWZzL2hlYWRzL2AsIGV4Y2VwdCB3aGVuIHVzaW5nIHBhY2tlZCByZWZzLiAoU2VlCisJbGlua2dpdDpnaXQtcGFjay1yZWZzWzFdLikKKworW1tkZWZfSEVBRF1dSEVBRDo6CisJVGhlIGN1cnJlbnQgPDxkZWZfYnJhbmNoLGJyYW5jaD4+LiAgSW4gbW9yZSBkZXRhaWw6IFlvdXIgPDxkZWZfd29ya2luZ190cmVlLAorCXdvcmtpbmcgdHJlZT4+IGlzIG5vcm1hbGx5IGRlcml2ZWQgZnJvbSB0aGUgc3RhdGUgb2YgdGhlIHRyZWUKKwlyZWZlcnJlZCB0byBieSBIRUFELiAgSEVBRCBpcyBhIHJlZmVyZW5jZSB0byBvbmUgb2YgdGhlCisJPDxkZWZfaGVhZCxoZWFkcz4+IGluIHlvdXIgcmVwb3NpdG9yeSwgZXhjZXB0IHdoZW4gdXNpbmcgYQorCTw8ZGVmX2RldGFjaGVkX0hFQUQsZGV0YWNoZWQgSEVBRD4+LCBpbiB3aGljaCBjYXNlIGl0IG1heQorCXJlZmVyZW5jZSBhbiBhcmJpdHJhcnkgY29tbWl0LgorCitbW2RlZl9oZWFkX3JlZl1daGVhZCByZWY6OgorCUEgc3lub255bSBmb3IgPDxkZWZfaGVhZCxoZWFkPj4uCisKK1tbZGVmX2hvb2tdXWhvb2s6OgorCUR1cmluZyB0aGUgbm9ybWFsIGV4ZWN1dGlvbiBvZiBzZXZlcmFsIGdpdCBjb21tYW5kcywgY2FsbC1vdXRzIGFyZSBtYWRlCisJdG8gb3B0aW9uYWwgc2NyaXB0cyB0aGF0IGFsbG93IGEgZGV2ZWxvcGVyIHRvIGFkZCBmdW5jdGlvbmFsaXR5IG9yCisJY2hlY2tpbmcuIFR5cGljYWxseSwgdGhlIGhvb2tzIGFsbG93IGZvciBhIGNvbW1hbmQgdG8gYmUgcHJlLXZlcmlmaWVkCisJYW5kIHBvdGVudGlhbGx5IGFib3J0ZWQsIGFuZCBhbGxvdyBmb3IgYSBwb3N0LW5vdGlmaWNhdGlvbiBhZnRlciB0aGUKKwlvcGVyYXRpb24gaXMgZG9uZS4gVGhlIGhvb2sgc2NyaXB0cyBhcmUgZm91bmQgaW4gdGhlCisJYCRHSVRfRElSL2hvb2tzL2AgZGlyZWN0b3J5LCBhbmQgYXJlIGVuYWJsZWQgYnkgc2ltcGx5CisJbWFraW5nIHRoZW0gZXhlY3V0YWJsZS4KKworW1tkZWZfaW5kZXhdXWluZGV4OjoKKwlBIGNvbGxlY3Rpb24gb2YgZmlsZXMgd2l0aCBzdGF0IGluZm9ybWF0aW9uLCB3aG9zZSBjb250ZW50cyBhcmUgc3RvcmVkCisJYXMgb2JqZWN0cy4gVGhlIGluZGV4IGlzIGEgc3RvcmVkIHZlcnNpb24gb2YgeW91cgorCTw8ZGVmX3dvcmtpbmdfdHJlZSx3b3JraW5nIHRyZWU+Pi4gVHJ1dGggYmUgdG9sZCwgaXQgY2FuIGFsc28gY29udGFpbiBhIHNlY29uZCwgYW5kIGV2ZW4KKwlhIHRoaXJkIHZlcnNpb24gb2YgYSB3b3JraW5nIHRyZWUsIHdoaWNoIGFyZSB1c2VkCisJd2hlbiA8PGRlZl9tZXJnZSxtZXJnaW5nPj4uCisKK1tbZGVmX2luZGV4X2VudHJ5XV1pbmRleCBlbnRyeTo6CisJVGhlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBhIHBhcnRpY3VsYXIgZmlsZSwgc3RvcmVkIGluIHRoZQorCTw8ZGVmX2luZGV4LGluZGV4Pj4uIEFuIGluZGV4IGVudHJ5IGNhbiBiZSB1bm1lcmdlZCwgaWYgYQorCTw8ZGVmX21lcmdlLG1lcmdlPj4gd2FzIHN0YXJ0ZWQsIGJ1dCBub3QgeWV0IGZpbmlzaGVkIChpLmUuIGlmCisJdGhlIGluZGV4IGNvbnRhaW5zIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoYXQgZmlsZSkuCisKK1tbZGVmX21hc3Rlcl1dbWFzdGVyOjoKKwlUaGUgZGVmYXVsdCBkZXZlbG9wbWVudCA8PGRlZl9icmFuY2gsYnJhbmNoPj4uIFdoZW5ldmVyIHlvdQorCWNyZWF0ZSBhIGdpdCA8PGRlZl9yZXBvc2l0b3J5LHJlcG9zaXRvcnk+PiwgYSBicmFuY2ggbmFtZWQKKwkibWFzdGVyIiBpcyBjcmVhdGVkLCBhbmQgYmVjb21lcyB0aGUgYWN0aXZlIGJyYW5jaC4gSW4gbW9zdAorCWNhc2VzLCB0aGlzIGNvbnRhaW5zIHRoZSBsb2NhbCBkZXZlbG9wbWVudCwgdGhvdWdoIHRoYXQgaXMKKwlwdXJlbHkgYnkgY29udmVudGlvbiBhbmQgaXMgbm90IHJlcXVpcmVkLgorCitbW2RlZl9tZXJnZV1dbWVyZ2U6OgorCUFzIGEgdmVyYjogVG8gYnJpbmcgdGhlIGNvbnRlbnRzIG9mIGFub3RoZXIKKwk8PGRlZl9icmFuY2gsYnJhbmNoPj4gKHBvc3NpYmx5IGZyb20gYW4gZXh0ZXJuYWwKKwk8PGRlZl9yZXBvc2l0b3J5LHJlcG9zaXRvcnk+PikgaW50byB0aGUgY3VycmVudCBicmFuY2guICBJbiB0aGUKKwljYXNlIHdoZXJlIHRoZSBtZXJnZWQtaW4gYnJhbmNoIGlzIGZyb20gYSBkaWZmZXJlbnQgcmVwb3NpdG9yeSwKKwl0aGlzIGlzIGRvbmUgYnkgZmlyc3QgPDxkZWZfZmV0Y2gsZmV0Y2hpbmc+PiB0aGUgcmVtb3RlIGJyYW5jaAorCWFuZCB0aGVuIG1lcmdpbmcgdGhlIHJlc3VsdCBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaC4gIFRoaXMKKwljb21iaW5hdGlvbiBvZiBmZXRjaCBhbmQgbWVyZ2Ugb3BlcmF0aW9ucyBpcyBjYWxsZWQgYQorCTw8ZGVmX3B1bGwscHVsbD4+LiAgTWVyZ2luZyBpcyBwZXJmb3JtZWQgYnkgYW4gYXV0b21hdGljIHByb2Nlc3MKKwl0aGF0IGlkZW50aWZpZXMgY2hhbmdlcyBtYWRlIHNpbmNlIHRoZSBicmFuY2hlcyBkaXZlcmdlZCwgYW5kCisJdGhlbiBhcHBsaWVzIGFsbCB0aG9zZSBjaGFuZ2VzIHRvZ2V0aGVyLiAgSW4gY2FzZXMgd2hlcmUgY2hhbmdlcworCWNvbmZsaWN0LCBtYW51YWwgaW50ZXJ2ZW50aW9uIG1heSBiZSByZXF1aXJlZCB0byBjb21wbGV0ZSB0aGUKKwltZXJnZS4KKysKK0FzIGEgbm91bjogdW5sZXNzIGl0IGlzIGEgPDxkZWZfZmFzdF9mb3J3YXJkLGZhc3QgZm9yd2FyZD4+LCBhCitzdWNjZXNzZnVsIG1lcmdlIHJlc3VsdHMgaW4gdGhlIGNyZWF0aW9uIG9mIGEgbmV3IDw8ZGVmX2NvbW1pdCxjb21taXQ+PgorcmVwcmVzZW50aW5nIHRoZSByZXN1bHQgb2YgdGhlIG1lcmdlLCBhbmQgaGF2aW5nIGFzCis8PGRlZl9wYXJlbnQscGFyZW50cz4+IHRoZSB0aXBzIG9mIHRoZSBtZXJnZWQgPDxkZWZfYnJhbmNoLGJyYW5jaGVzPj4uCitUaGlzIGNvbW1pdCBpcyByZWZlcnJlZCB0byBhcyBhICJtZXJnZSBjb21taXQiLCBvciBzb21ldGltZXMganVzdCBhCisibWVyZ2UiLgorCitbW2RlZl9vYmplY3RdXW9iamVjdDo6CisJVGhlIHVuaXQgb2Ygc3RvcmFnZSBpbiBnaXQuIEl0IGlzIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgdGhlCisJPDxkZWZfU0hBMSxTSEExPj4gb2YgaXRzIGNvbnRlbnRzLiBDb25zZXF1ZW50bHksIGFuCisJb2JqZWN0IGNhbiBub3QgYmUgY2hhbmdlZC4KKworW1tkZWZfb2JqZWN0X2RhdGFiYXNlXV1vYmplY3QgZGF0YWJhc2U6OgorCVN0b3JlcyBhIHNldCBvZiAib2JqZWN0cyIsIGFuZCBhbiBpbmRpdmlkdWFsIDw8ZGVmX29iamVjdCxvYmplY3Q+PiBpcworCWlkZW50aWZpZWQgYnkgaXRzIDw8ZGVmX29iamVjdF9uYW1lLG9iamVjdCBuYW1lPj4uIFRoZSBvYmplY3RzIHVzdWFsbHkKKwlsaXZlIGluIGAkR0lUX0RJUi9vYmplY3RzL2AuCisKK1tbZGVmX29iamVjdF9pZGVudGlmaWVyXV1vYmplY3QgaWRlbnRpZmllcjo6CisJU3lub255bSBmb3IgPDxkZWZfb2JqZWN0X25hbWUsb2JqZWN0IG5hbWU+Pi4KKworW1tkZWZfb2JqZWN0X25hbWVdXW9iamVjdCBuYW1lOjoKKwlUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgYW4gPDxkZWZfb2JqZWN0LG9iamVjdD4+LiBUaGUgPDxkZWZfaGFzaCxoYXNoPj4KKwlvZiB0aGUgb2JqZWN0J3MgY29udGVudHMgdXNpbmcgdGhlIFNlY3VyZSBIYXNoIEFsZ29yaXRobQorCTEgYW5kIHVzdWFsbHkgcmVwcmVzZW50ZWQgYnkgdGhlIDQwIGNoYXJhY3RlciBoZXhhZGVjaW1hbCBlbmNvZGluZyBvZgorCXRoZSA8PGRlZl9oYXNoLGhhc2g+PiBvZiB0aGUgb2JqZWN0LgorCitbW2RlZl9vYmplY3RfdHlwZV1db2JqZWN0IHR5cGU6OgorCU9uZSBvZiB0aGUgaWRlbnRpZmllcnMKKwkiPDxkZWZfY29tbWl0LGNvbW1pdD4+IiwiPDxkZWZfdHJlZSx0cmVlPj4iLCI8PGRlZl90YWcsdGFnPj4iIG9yICI8PGRlZl9ibG9iX29iamVjdCxibG9iPj4iCisJZGVzY3JpYmluZyB0aGUgdHlwZSBvZiBhbiA8PGRlZl9vYmplY3Qsb2JqZWN0Pj4uCisKK1tbZGVmX29jdG9wdXNdXW9jdG9wdXM6OgorCVRvIDw8ZGVmX21lcmdlLG1lcmdlPj4gbW9yZSB0aGFuIHR3byA8PGRlZl9icmFuY2gsYnJhbmNoZXM+Pi4gQWxzbyBkZW5vdGVzIGFuCisJaW50ZWxsaWdlbnQgcHJlZGF0b3IuCisKK1tbZGVmX29yaWdpbl1db3JpZ2luOjoKKwlUaGUgZGVmYXVsdCB1cHN0cmVhbSA8PGRlZl9yZXBvc2l0b3J5LHJlcG9zaXRvcnk+Pi4gTW9zdCBwcm9qZWN0cyBoYXZlCisJYXQgbGVhc3Qgb25lIHVwc3RyZWFtIHByb2plY3Qgd2hpY2ggdGhleSB0cmFjay4gQnkgZGVmYXVsdAorCSdvcmlnaW4nIGlzIHVzZWQgZm9yIHRoYXQgcHVycG9zZS4gTmV3IHVwc3RyZWFtIHVwZGF0ZXMKKwl3aWxsIGJlIGZldGNoZWQgaW50byByZW1vdGUgPDxkZWZfdHJhY2tpbmdfYnJhbmNoLHRyYWNraW5nIGJyYW5jaGVzPj4gbmFtZWQKKwlvcmlnaW4vbmFtZS1vZi11cHN0cmVhbS1icmFuY2gsIHdoaWNoIHlvdSBjYW4gc2VlIHVzaW5nCisJImBnaXQgYnJhbmNoIC1yYCIuCisKK1tbZGVmX3BhY2tdXXBhY2s6OgorCUEgc2V0IG9mIG9iamVjdHMgd2hpY2ggaGF2ZSBiZWVuIGNvbXByZXNzZWQgaW50byBvbmUgZmlsZSAodG8gc2F2ZSBzcGFjZQorCW9yIHRvIHRyYW5zbWl0IHRoZW0gZWZmaWNpZW50bHkpLgorCitbW2RlZl9wYWNrX2luZGV4XV1wYWNrIGluZGV4OjoKKwlUaGUgbGlzdCBvZiBpZGVudGlmaWVycywgYW5kIG90aGVyIGluZm9ybWF0aW9uLCBvZiB0aGUgb2JqZWN0cyBpbiBhCisJPDxkZWZfcGFjayxwYWNrPj4sIHRvIGFzc2lzdCBpbiBlZmZpY2llbnRseSBhY2Nlc3NpbmcgdGhlIGNvbnRlbnRzIG9mIGEKKwlwYWNrLgorCitbW2RlZl9wYXJlbnRdXXBhcmVudDo6CisJQSA8PGRlZl9jb21taXRfb2JqZWN0LGNvbW1pdCBvYmplY3Q+PiBjb250YWlucyBhIChwb3NzaWJseSBlbXB0eSkgbGlzdAorCW9mIHRoZSBsb2dpY2FsIHByZWRlY2Vzc29yKHMpIGluIHRoZSBsaW5lIG9mIGRldmVsb3BtZW50LCBpLmUuIGl0cworCXBhcmVudHMuCisKK1tbZGVmX3BpY2theGVdXXBpY2theGU6OgorCVRoZSB0ZXJtIDw8ZGVmX3BpY2theGUscGlja2F4ZT4+IHJlZmVycyB0byBhbiBvcHRpb24gdG8gdGhlIGRpZmZjb3JlCisJcm91dGluZXMgdGhhdCBoZWxwIHNlbGVjdCBjaGFuZ2VzIHRoYXQgYWRkIG9yIGRlbGV0ZSBhIGdpdmVuIHRleHQKKwlzdHJpbmcuIFdpdGggdGhlIGAtLXBpY2theGUtYWxsYCBvcHRpb24sIGl0IGNhbiBiZSB1c2VkIHRvIHZpZXcgdGhlIGZ1bGwKKwk8PGRlZl9jaGFuZ2VzZXQsY2hhbmdlc2V0Pj4gdGhhdCBpbnRyb2R1Y2VkIG9yIHJlbW92ZWQsIHNheSwgYQorCXBhcnRpY3VsYXIgbGluZSBvZiB0ZXh0LiBTZWUgbGlua2dpdDpnaXQtZGlmZlsxXS4KKworW1tkZWZfcGx1bWJpbmddXXBsdW1iaW5nOjoKKwlDdXRlIG5hbWUgZm9yIDw8ZGVmX2NvcmVfZ2l0LGNvcmUgZ2l0Pj4uCisKK1tbZGVmX3BvcmNlbGFpbl1dcG9yY2VsYWluOjoKKwlDdXRlIG5hbWUgZm9yIHByb2dyYW1zIGFuZCBwcm9ncmFtIHN1aXRlcyBkZXBlbmRpbmcgb24KKwk8PGRlZl9jb3JlX2dpdCxjb3JlIGdpdD4+LCBwcmVzZW50aW5nIGEgaGlnaCBsZXZlbCBhY2Nlc3MgdG8KKwljb3JlIGdpdC4gUG9yY2VsYWlucyBleHBvc2UgbW9yZSBvZiBhIDw8ZGVmX1NDTSxTQ00+PgorCWludGVyZmFjZSB0aGFuIHRoZSA8PGRlZl9wbHVtYmluZyxwbHVtYmluZz4+LgorCitbW2RlZl9wdWxsXV1wdWxsOjoKKwlQdWxsaW5nIGEgPDxkZWZfYnJhbmNoLGJyYW5jaD4+IG1lYW5zIHRvIDw8ZGVmX2ZldGNoLGZldGNoPj4gaXQgYW5kCisJPDxkZWZfbWVyZ2UsbWVyZ2U+PiBpdC4gIFNlZSBhbHNvIGxpbmtnaXQ6Z2l0LXB1bGxbMV0uCisKK1tbZGVmX3B1c2hdXXB1c2g6OgorCVB1c2hpbmcgYSA8PGRlZl9icmFuY2gsYnJhbmNoPj4gbWVhbnMgdG8gZ2V0IHRoZSBicmFuY2gncworCTw8ZGVmX2hlYWRfcmVmLGhlYWQgcmVmPj4gZnJvbSBhIHJlbW90ZSA8PGRlZl9yZXBvc2l0b3J5LHJlcG9zaXRvcnk+PiwKKwlmaW5kIG91dCBpZiBpdCBpcyBhIGRpcmVjdCBhbmNlc3RvciB0byB0aGUgYnJhbmNoJ3MgbG9jYWwKKwloZWFkIHJlZiwgYW5kIGluIHRoYXQgY2FzZSwgcHV0dGluZyBhbGwKKwlvYmplY3RzLCB3aGljaCBhcmUgPDxkZWZfcmVhY2hhYmxlLHJlYWNoYWJsZT4+IGZyb20gdGhlIGxvY2FsCisJaGVhZCByZWYsIGFuZCB3aGljaCBhcmUgbWlzc2luZyBmcm9tIHRoZSByZW1vdGUKKwlyZXBvc2l0b3J5LCBpbnRvIHRoZSByZW1vdGUKKwk8PGRlZl9vYmplY3RfZGF0YWJhc2Usb2JqZWN0IGRhdGFiYXNlPj4sIGFuZCB1cGRhdGluZyB0aGUgcmVtb3RlCisJaGVhZCByZWYuIElmIHRoZSByZW1vdGUgPDxkZWZfaGVhZCxoZWFkPj4gaXMgbm90IGFuCisJYW5jZXN0b3IgdG8gdGhlIGxvY2FsIGhlYWQsIHRoZSBwdXNoIGZhaWxzLgorCitbW2RlZl9yZWFjaGFibGVdXXJlYWNoYWJsZTo6CisJQWxsIG9mIHRoZSBhbmNlc3RvcnMgb2YgYSBnaXZlbiA8PGRlZl9jb21taXQsY29tbWl0Pj4gYXJlIHNhaWQgdG8gYmUKKwkicmVhY2hhYmxlIiBmcm9tIHRoYXQgY29tbWl0LiBNb3JlCisJZ2VuZXJhbGx5LCBvbmUgPDxkZWZfb2JqZWN0LG9iamVjdD4+IGlzIHJlYWNoYWJsZSBmcm9tCisJYW5vdGhlciBpZiB3ZSBjYW4gcmVhY2ggdGhlIG9uZSBmcm9tIHRoZSBvdGhlciBieSBhIDw8ZGVmX2NoYWluLGNoYWluPj4KKwl0aGF0IGZvbGxvd3MgPDxkZWZfdGFnLHRhZ3M+PiB0byB3aGF0ZXZlciB0aGV5IHRhZywKKwk8PGRlZl9jb21taXRfb2JqZWN0LGNvbW1pdHM+PiB0byB0aGVpciBwYXJlbnRzIG9yIHRyZWVzLCBhbmQKKwk8PGRlZl90cmVlX29iamVjdCx0cmVlcz4+IHRvIHRoZSB0cmVlcyBvciA8PGRlZl9ibG9iX29iamVjdCxibG9icz4+CisJdGhhdCB0aGV5IGNvbnRhaW4uCisKK1tbZGVmX3JlYmFzZV1dcmViYXNlOjoKKwlUbyByZWFwcGx5IGEgc2VyaWVzIG9mIGNoYW5nZXMgZnJvbSBhIDw8ZGVmX2JyYW5jaCxicmFuY2g+PiB0byBhCisJZGlmZmVyZW50IGJhc2UsIGFuZCByZXNldCB0aGUgPDxkZWZfaGVhZCxoZWFkPj4gb2YgdGhhdCBicmFuY2gKKwl0byB0aGUgcmVzdWx0LgorCitbW2RlZl9yZWZdXXJlZjo6CisJQSA0MC1ieXRlIGhleCByZXByZXNlbnRhdGlvbiBvZiBhIDw8ZGVmX1NIQTEsU0hBMT4+IG9yIGEgbmFtZSB0aGF0CisJZGVub3RlcyBhIHBhcnRpY3VsYXIgPDxkZWZfb2JqZWN0LG9iamVjdD4+LiBUaGVzZSBtYXkgYmUgc3RvcmVkIGluCisJYCRHSVRfRElSL3JlZnMvYC4KKworW1tkZWZfcmVmbG9nXV1yZWZsb2c6OgorCUEgcmVmbG9nIHNob3dzIHRoZSBsb2NhbCAiaGlzdG9yeSIgb2YgYSByZWYuICBJbiBvdGhlciB3b3JkcywKKwlpdCBjYW4gdGVsbCB5b3Ugd2hhdCB0aGUgM3JkIGxhc3QgcmV2aXNpb24gaW4gX3RoaXNfIHJlcG9zaXRvcnkKKwl3YXMsIGFuZCB3aGF0IHdhcyB0aGUgY3VycmVudCBzdGF0ZSBpbiBfdGhpc18gcmVwb3NpdG9yeSwKKwl5ZXN0ZXJkYXkgOToxNHBtLiAgU2VlIGxpbmtnaXQ6Z2l0LXJlZmxvZ1sxXSBmb3IgZGV0YWlscy4KKworW1tkZWZfcmVmc3BlY11dcmVmc3BlYzo6CisJQSAicmVmc3BlYyIgaXMgdXNlZCBieSA8PGRlZl9mZXRjaCxmZXRjaD4+IGFuZAorCTw8ZGVmX3B1c2gscHVzaD4+IHRvIGRlc2NyaWJlIHRoZSBtYXBwaW5nIGJldHdlZW4gcmVtb3RlCisJPDxkZWZfcmVmLHJlZj4+IGFuZCBsb2NhbCByZWYuIFRoZXkgYXJlIGNvbWJpbmVkIHdpdGggYSBjb2xvbiBpbgorCXRoZSBmb3JtYXQgPHNyYz46PGRzdD4sIHByZWNlZGVkIGJ5IGFuIG9wdGlvbmFsIHBsdXMgc2lnbiwgKy4KKwlGb3IgZXhhbXBsZTogYGdpdCBmZXRjaCAkVVJMCisJcmVmcy9oZWFkcy9tYXN0ZXI6cmVmcy9oZWFkcy9vcmlnaW5gIG1lYW5zICJncmFiIHRoZSBtYXN0ZXIKKwk8PGRlZl9icmFuY2gsYnJhbmNoPj4gPDxkZWZfaGVhZCxoZWFkPj4gZnJvbSB0aGUgJFVSTCBhbmQgc3RvcmUKKwlpdCBhcyBteSBvcmlnaW4gYnJhbmNoIGhlYWQiLiBBbmQgYGdpdCBwdXNoCisJJFVSTCByZWZzL2hlYWRzL21hc3RlcjpyZWZzL2hlYWRzL3RvLXVwc3RyZWFtYCBtZWFucyAicHVibGlzaCBteQorCW1hc3RlciBicmFuY2ggaGVhZCBhcyB0by11cHN0cmVhbSBicmFuY2ggYXQgJFVSTCIuIFNlZSBhbHNvCisJbGlua2dpdDpnaXQtcHVzaFsxXS4KKworW1tkZWZfcmVwb3NpdG9yeV1dcmVwb3NpdG9yeTo6CisJQSBjb2xsZWN0aW9uIG9mIDw8ZGVmX3JlZixyZWZzPj4gdG9nZXRoZXIgd2l0aCBhbgorCTw8ZGVmX29iamVjdF9kYXRhYmFzZSxvYmplY3QgZGF0YWJhc2U+PiBjb250YWluaW5nIGFsbCBvYmplY3RzCisJd2hpY2ggYXJlIDw8ZGVmX3JlYWNoYWJsZSxyZWFjaGFibGU+PiBmcm9tIHRoZSByZWZzLCBwb3NzaWJseQorCWFjY29tcGFuaWVkIGJ5IG1ldGEgZGF0YSBmcm9tIG9uZSBvciBtb3JlIDw8ZGVmX3BvcmNlbGFpbixwb3JjZWxhaW5zPj4uIEEKKwlyZXBvc2l0b3J5IGNhbiBzaGFyZSBhbiBvYmplY3QgZGF0YWJhc2Ugd2l0aCBvdGhlciByZXBvc2l0b3JpZXMKKwl2aWEgPDxkZWZfYWx0ZXJuYXRlX29iamVjdF9kYXRhYmFzZSxhbHRlcm5hdGVzIG1lY2hhbmlzbT4+LgorCitbW2RlZl9yZXNvbHZlXV1yZXNvbHZlOjoKKwlUaGUgYWN0aW9uIG9mIGZpeGluZyB1cCBtYW51YWxseSB3aGF0IGEgZmFpbGVkIGF1dG9tYXRpYworCTw8ZGVmX21lcmdlLG1lcmdlPj4gbGVmdCBiZWhpbmQuCisKK1tbZGVmX3JldmlzaW9uXV1yZXZpc2lvbjo6CisJQSBwYXJ0aWN1bGFyIHN0YXRlIG9mIGZpbGVzIGFuZCBkaXJlY3RvcmllcyB3aGljaCB3YXMgc3RvcmVkIGluIHRoZQorCTw8ZGVmX29iamVjdF9kYXRhYmFzZSxvYmplY3QgZGF0YWJhc2U+Pi4gSXQgaXMgcmVmZXJlbmNlZCBieSBhCisJPDxkZWZfY29tbWl0X29iamVjdCxjb21taXQgb2JqZWN0Pj4uCisKK1tbZGVmX3Jld2luZF1dcmV3aW5kOjoKKwlUbyB0aHJvdyBhd2F5IHBhcnQgb2YgdGhlIGRldmVsb3BtZW50LCBpLmUuIHRvIGFzc2lnbiB0aGUKKwk8PGRlZl9oZWFkLGhlYWQ+PiB0byBhbiBlYXJsaWVyIDw8ZGVmX3JldmlzaW9uLHJldmlzaW9uPj4uCisKK1tbZGVmX1NDTV1dU0NNOjoKKwlTb3VyY2UgY29kZSBtYW5hZ2VtZW50ICh0b29sKS4KKworW1tkZWZfU0hBMV1dU0hBMTo6CisJU3lub255bSBmb3IgPDxkZWZfb2JqZWN0X25hbWUsb2JqZWN0IG5hbWU+Pi4KKworW1tkZWZfc2hhbGxvd19yZXBvc2l0b3J5XV1zaGFsbG93IHJlcG9zaXRvcnk6OgorCUEgc2hhbGxvdyA8PGRlZl9yZXBvc2l0b3J5LHJlcG9zaXRvcnk+PiBoYXMgYW4gaW5jb21wbGV0ZQorCWhpc3Rvcnkgc29tZSBvZiB3aG9zZSA8PGRlZl9jb21taXQsY29tbWl0cz4+IGhhdmUgPDxkZWZfcGFyZW50LHBhcmVudHM+PiBjYXV0ZXJpemVkIGF3YXkgKGluIG90aGVyCisJd29yZHMsIGdpdCBpcyB0b2xkIHRvIHByZXRlbmQgdGhhdCB0aGVzZSBjb21taXRzIGRvIG5vdCBoYXZlIHRoZQorCXBhcmVudHMsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHJlY29yZGVkIGluIHRoZSA8PGRlZl9jb21taXRfb2JqZWN0LGNvbW1pdAorCW9iamVjdD4+KS4gVGhpcyBpcyBzb21ldGltZXMgdXNlZnVsIHdoZW4geW91IGFyZSBpbnRlcmVzdGVkIG9ubHkgaW4gdGhlCisJcmVjZW50IGhpc3Rvcnkgb2YgYSBwcm9qZWN0IGV2ZW4gdGhvdWdoIHRoZSByZWFsIGhpc3RvcnkgcmVjb3JkZWQgaW4gdGhlCisJdXBzdHJlYW0gaXMgbXVjaCBsYXJnZXIuIEEgc2hhbGxvdyByZXBvc2l0b3J5CisJaXMgY3JlYXRlZCBieSBnaXZpbmcgdGhlIGAtLWRlcHRoYCBvcHRpb24gdG8gbGlua2dpdDpnaXQtY2xvbmVbMV0sIGFuZAorCWl0cyBoaXN0b3J5IGNhbiBiZSBsYXRlciBkZWVwZW5lZCB3aXRoIGxpbmtnaXQ6Z2l0LWZldGNoWzFdLgorCitbW2RlZl9zeW1yZWZdXXN5bXJlZjo6CisJU3ltYm9saWMgcmVmZXJlbmNlOiBpbnN0ZWFkIG9mIGNvbnRhaW5pbmcgdGhlIDw8ZGVmX1NIQTEsU0hBMT4+CisJaWQgaXRzZWxmLCBpdCBpcyBvZiB0aGUgZm9ybWF0ICdyZWY6IHJlZnMvc29tZS90aGluZycgYW5kIHdoZW4KKwlyZWZlcmVuY2VkLCBpdCByZWN1cnNpdmVseSBkZXJlZmVyZW5jZXMgdG8gdGhpcyByZWZlcmVuY2UuCisJJzw8ZGVmX0hFQUQsSEVBRD4+JyBpcyBhIHByaW1lIGV4YW1wbGUgb2YgYSBzeW1yZWYuIFN5bWJvbGljCisJcmVmZXJlbmNlcyBhcmUgbWFuaXB1bGF0ZWQgd2l0aCB0aGUgbGlua2dpdDpnaXQtc3ltYm9saWMtcmVmWzFdCisJY29tbWFuZC4KKworW1tkZWZfdGFnXV10YWc6OgorCUEgPDxkZWZfcmVmLHJlZj4+IHBvaW50aW5nIHRvIGEgPDxkZWZfdGFnX29iamVjdCx0YWc+PiBvcgorCTw8ZGVmX2NvbW1pdF9vYmplY3QsY29tbWl0IG9iamVjdD4+LiBJbiBjb250cmFzdCB0byBhIDw8ZGVmX2hlYWQsaGVhZD4+LAorCWEgdGFnIGlzIG5vdCBjaGFuZ2VkIGJ5IGEgPDxkZWZfY29tbWl0LGNvbW1pdD4+LiBUYWdzIChub3QKKwk8PGRlZl90YWdfb2JqZWN0LHRhZyBvYmplY3RzPj4pIGFyZSBzdG9yZWQgaW4gYCRHSVRfRElSL3JlZnMvdGFncy9gLiBBCisJZ2l0IHRhZyBoYXMgbm90aGluZyB0byBkbyB3aXRoIGEgTGlzcCB0YWcgKHdoaWNoIHdvdWxkIGJlCisJY2FsbGVkIGFuIDw8ZGVmX29iamVjdF90eXBlLG9iamVjdCB0eXBlPj4gaW4gZ2l0J3MgY29udGV4dCkuIEEKKwl0YWcgaXMgbW9zdCB0eXBpY2FsbHkgdXNlZCB0byBtYXJrIGEgcGFydGljdWxhciBwb2ludCBpbiB0aGUKKwljb21taXQgYW5jZXN0cnkgPDxkZWZfY2hhaW4sY2hhaW4+Pi4KKworW1tkZWZfdGFnX29iamVjdF1ddGFnIG9iamVjdDo6CisJQW4gPDxkZWZfb2JqZWN0LG9iamVjdD4+IGNvbnRhaW5pbmcgYSA8PGRlZl9yZWYscmVmPj4gcG9pbnRpbmcgdG8KKwlhbm90aGVyIG9iamVjdCwgd2hpY2ggY2FuIGNvbnRhaW4gYSBtZXNzYWdlIGp1c3QgbGlrZSBhCisJPDxkZWZfY29tbWl0X29iamVjdCxjb21taXQgb2JqZWN0Pj4uIEl0IGNhbiBhbHNvIGNvbnRhaW4gYSAoUEdQKQorCXNpZ25hdHVyZSwgaW4gd2hpY2ggY2FzZSBpdCBpcyBjYWxsZWQgYSAic2lnbmVkIHRhZyBvYmplY3QiLgorCitbW2RlZl90b3BpY19icmFuY2hdXXRvcGljIGJyYW5jaDo6CisJQSByZWd1bGFyIGdpdCA8PGRlZl9icmFuY2gsYnJhbmNoPj4gdGhhdCBpcyB1c2VkIGJ5IGEgZGV2ZWxvcGVyIHRvCisJaWRlbnRpZnkgYSBjb25jZXB0dWFsIGxpbmUgb2YgZGV2ZWxvcG1lbnQuIFNpbmNlIGJyYW5jaGVzIGFyZSB2ZXJ5IGVhc3kKKwlhbmQgaW5leHBlbnNpdmUsIGl0IGlzIG9mdGVuIGRlc2lyYWJsZSB0byBoYXZlIHNldmVyYWwgc21hbGwgYnJhbmNoZXMKKwl0aGF0IGVhY2ggY29udGFpbiB2ZXJ5IHdlbGwgZGVmaW5lZCBjb25jZXB0cyBvciBzbWFsbCBpbmNyZW1lbnRhbCB5ZXQKKwlyZWxhdGVkIGNoYW5nZXMuCisKK1tbZGVmX3RyYWNraW5nX2JyYW5jaF1ddHJhY2tpbmcgYnJhbmNoOjoKKwlBIHJlZ3VsYXIgZ2l0IDw8ZGVmX2JyYW5jaCxicmFuY2g+PiB0aGF0IGlzIHVzZWQgdG8gZm9sbG93IGNoYW5nZXMgZnJvbQorCWFub3RoZXIgPDxkZWZfcmVwb3NpdG9yeSxyZXBvc2l0b3J5Pj4uIEEgdHJhY2tpbmcKKwlicmFuY2ggc2hvdWxkIG5vdCBjb250YWluIGRpcmVjdCBtb2RpZmljYXRpb25zIG9yIGhhdmUgbG9jYWwgY29tbWl0cworCW1hZGUgdG8gaXQuIEEgdHJhY2tpbmcgYnJhbmNoIGNhbiB1c3VhbGx5IGJlCisJaWRlbnRpZmllZCBhcyB0aGUgcmlnaHQtaGFuZC1zaWRlIDw8ZGVmX3JlZixyZWY+PiBpbiBhIFB1bGw6CisJPDxkZWZfcmVmc3BlYyxyZWZzcGVjPj4uCisKK1tbZGVmX3RyZWVdXXRyZWU6OgorCUVpdGhlciBhIDw8ZGVmX3dvcmtpbmdfdHJlZSx3b3JraW5nIHRyZWU+Piwgb3IgYSA8PGRlZl90cmVlX29iamVjdCx0cmVlCisJb2JqZWN0Pj4gdG9nZXRoZXIgd2l0aCB0aGUgZGVwZW5kZW50IDw8ZGVmX2Jsb2Jfb2JqZWN0LGJsb2I+PiBhbmQgdHJlZSBvYmplY3RzCisJKGkuZS4gYSBzdG9yZWQgcmVwcmVzZW50YXRpb24gb2YgYSB3b3JraW5nIHRyZWUpLgorCitbW2RlZl90cmVlX29iamVjdF1ddHJlZSBvYmplY3Q6OgorCUFuIDw8ZGVmX29iamVjdCxvYmplY3Q+PiBjb250YWluaW5nIGEgbGlzdCBvZiBmaWxlIG5hbWVzIGFuZCBtb2RlcyBhbG9uZworCXdpdGggcmVmcyB0byB0aGUgYXNzb2NpYXRlZCBibG9iIGFuZC9vciB0cmVlIG9iamVjdHMuIEEKKwk8PGRlZl90cmVlLHRyZWU+PiBpcyBlcXVpdmFsZW50IHRvIGEgPDxkZWZfZGlyZWN0b3J5LGRpcmVjdG9yeT4+LgorCitbW2RlZl90cmVlLWlzaF1ddHJlZS1pc2g6OgorCUEgPDxkZWZfcmVmLHJlZj4+IHBvaW50aW5nIHRvIGVpdGhlciBhIDw8ZGVmX2NvbW1pdF9vYmplY3QsY29tbWl0CisJb2JqZWN0Pj4sIGEgPDxkZWZfdHJlZV9vYmplY3QsdHJlZSBvYmplY3Q+Piwgb3IgYSA8PGRlZl90YWdfb2JqZWN0LHRhZworCW9iamVjdD4+IHBvaW50aW5nIHRvIGEgdGFnIG9yIGNvbW1pdCBvciB0cmVlIG9iamVjdC4KKworW1tkZWZfdW5tZXJnZWRfaW5kZXhdXXVubWVyZ2VkIGluZGV4OjoKKwlBbiA8PGRlZl9pbmRleCxpbmRleD4+IHdoaWNoIGNvbnRhaW5zIHVubWVyZ2VkCisJPDxkZWZfaW5kZXhfZW50cnksaW5kZXggZW50cmllcz4+LgorCitbW2RlZl91bnJlYWNoYWJsZV9vYmplY3RdXXVucmVhY2hhYmxlIG9iamVjdDo6CisJQW4gPDxkZWZfb2JqZWN0LG9iamVjdD4+IHdoaWNoIGlzIG5vdCA8PGRlZl9yZWFjaGFibGUscmVhY2hhYmxlPj4gZnJvbSBhCisJPDxkZWZfYnJhbmNoLGJyYW5jaD4+LCA8PGRlZl90YWcsdGFnPj4sIG9yIGFueSBvdGhlciByZWZlcmVuY2UuCisKK1tbZGVmX3dvcmtpbmdfdHJlZV1dd29ya2luZyB0cmVlOjoKKwlUaGUgdHJlZSBvZiBhY3R1YWwgY2hlY2tlZCBvdXQgZmlsZXMuICBUaGUgd29ya2luZyB0cmVlIGlzCisJbm9ybWFsbHkgZXF1YWwgdG8gdGhlIDw8ZGVmX0hFQUQsSEVBRD4+IHBsdXMgYW55IGxvY2FsIGNoYW5nZXMKKwl0aGF0IHlvdSBoYXZlIG1hZGUgYnV0IG5vdCB5ZXQgY29tbWl0dGVkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ob29rcy50eHQgYi9Eb2N1bWVudGF0aW9uL2hvb2tzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmI4ZDc3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ob29rcy50eHQKQEAgLTAsMCArMSwyNzggQEAKK0hvb2tzIHVzZWQgYnkgZ2l0Cis9PT09PT09PT09PT09PT09PQorCitIb29rcyBhcmUgbGl0dGxlIHNjcmlwdHMgeW91IGNhbiBwbGFjZSBpbiBgJEdJVF9ESVIvaG9va3NgCitkaXJlY3RvcnkgdG8gdHJpZ2dlciBhY3Rpb24gYXQgY2VydGFpbiBwb2ludHMuICBXaGVuCitgZ2l0LWluaXRgIGlzIHJ1biwgYSBoYW5kZnVsIGV4YW1wbGUgaG9va3MgYXJlIGNvcGllZCBpbiB0aGUKK2Bob29rc2AgZGlyZWN0b3J5IG9mIHRoZSBuZXcgcmVwb3NpdG9yeSwgYnV0IGJ5IGRlZmF1bHQgdGhleSBhcmUKK2FsbCBkaXNhYmxlZC4gIFRvIGVuYWJsZSBhIGhvb2ssIG1ha2UgaXQgZXhlY3V0YWJsZSB3aXRoIGBjaG1vZCAreGAuCisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBjdXJyZW50bHkgZGVmaW5lZCBob29rcy4KKworYXBwbHlwYXRjaC1tc2cKKy0tLS0tLS0tLS0tLS0tCisKK1RoaXMgaG9vayBpcyBpbnZva2VkIGJ5IGBnaXQtYW1gIHNjcmlwdC4gIEl0IHRha2VzIGEgc2luZ2xlCitwYXJhbWV0ZXIsIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgaG9sZHMgdGhlIHByb3Bvc2VkIGNvbW1pdAorbG9nIG1lc3NhZ2UuICBFeGl0aW5nIHdpdGggbm9uLXplcm8gc3RhdHVzIGNhdXNlcworYGdpdC1hbWAgdG8gYWJvcnQgYmVmb3JlIGFwcGx5aW5nIHRoZSBwYXRjaC4KKworVGhlIGhvb2sgaXMgYWxsb3dlZCB0byBlZGl0IHRoZSBtZXNzYWdlIGZpbGUgaW4gcGxhY2UsIGFuZCBjYW4KK2JlIHVzZWQgdG8gbm9ybWFsaXplIHRoZSBtZXNzYWdlIGludG8gc29tZSBwcm9qZWN0IHN0YW5kYXJkCitmb3JtYXQgKGlmIHRoZSBwcm9qZWN0IGhhcyBvbmUpLiBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIHJlZnVzZQordGhlIGNvbW1pdCBhZnRlciBpbnNwZWN0aW5nIHRoZSBtZXNzYWdlIGZpbGUuCisKK1RoZSBkZWZhdWx0ICdhcHBseXBhdGNoLW1zZycgaG9vaywgd2hlbiBlbmFibGVkLCBydW5zIHRoZQorJ2NvbW1pdC1tc2cnIGhvb2ssIGlmIHRoZSBsYXR0ZXIgaXMgZW5hYmxlZC4KKworcHJlLWFwcGx5cGF0Y2gKKy0tLS0tLS0tLS0tLS0tCisKK1RoaXMgaG9vayBpcyBpbnZva2VkIGJ5IGBnaXQtYW1gLiAgSXQgdGFrZXMgbm8gcGFyYW1ldGVyLAorYW5kIGlzIGludm9rZWQgYWZ0ZXIgdGhlIHBhdGNoIGlzIGFwcGxpZWQsIGJ1dCBiZWZvcmUgYSBjb21taXQKK2lzIG1hZGUuICBFeGl0aW5nIHdpdGggbm9uLXplcm8gc3RhdHVzIGNhdXNlcyB0aGUgd29ya2luZyB0cmVlCithZnRlciBhcHBsaWNhdGlvbiBvZiB0aGUgcGF0Y2ggbm90IGNvbW1pdHRlZC4KKworSXQgY2FuIGJlIHVzZWQgdG8gaW5zcGVjdCB0aGUgY3VycmVudCB3b3JraW5nIHRyZWUgYW5kIHJlZnVzZSB0bworbWFrZSBhIGNvbW1pdCBpZiBpdCBkb2VzIG5vdCBwYXNzIGNlcnRhaW4gdGVzdC4KKworVGhlIGRlZmF1bHQgJ3ByZS1hcHBseXBhdGNoJyBob29rLCB3aGVuIGVuYWJsZWQsIHJ1bnMgdGhlCisncHJlLWNvbW1pdCcgaG9vaywgaWYgdGhlIGxhdHRlciBpcyBlbmFibGVkLgorCitwb3N0LWFwcGx5cGF0Y2gKKy0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGhvb2sgaXMgaW52b2tlZCBieSBgZ2l0LWFtYC4gIEl0IHRha2VzIG5vIHBhcmFtZXRlciwKK2FuZCBpcyBpbnZva2VkIGFmdGVyIHRoZSBwYXRjaCBpcyBhcHBsaWVkIGFuZCBhIGNvbW1pdCBpcyBtYWRlLgorCitUaGlzIGhvb2sgaXMgbWVhbnQgcHJpbWFyaWx5IGZvciBub3RpZmljYXRpb24sIGFuZCBjYW5ub3QgYWZmZWN0Cit0aGUgb3V0Y29tZSBvZiBgZ2l0LWFtYC4KKworcHJlLWNvbW1pdAorLS0tLS0tLS0tLQorCitUaGlzIGhvb2sgaXMgaW52b2tlZCBieSBgZ2l0LWNvbW1pdGAsIGFuZCBjYW4gYmUgYnlwYXNzZWQKK3dpdGggYFwtLW5vLXZlcmlmeWAgb3B0aW9uLiAgSXQgdGFrZXMgbm8gcGFyYW1ldGVyLCBhbmQgaXMKK2ludm9rZWQgYmVmb3JlIG9idGFpbmluZyB0aGUgcHJvcG9zZWQgY29tbWl0IGxvZyBtZXNzYWdlIGFuZAorbWFraW5nIGEgY29tbWl0LiAgRXhpdGluZyB3aXRoIG5vbi16ZXJvIHN0YXR1cyBmcm9tIHRoaXMgc2NyaXB0CitjYXVzZXMgdGhlIGBnaXQtY29tbWl0YCB0byBhYm9ydC4KKworVGhlIGRlZmF1bHQgJ3ByZS1jb21taXQnIGhvb2ssIHdoZW4gZW5hYmxlZCwgY2F0Y2hlcyBpbnRyb2R1Y3Rpb24KK29mIGxpbmVzIHdpdGggdHJhaWxpbmcgd2hpdGVzcGFjZXMgYW5kIGFib3J0cyB0aGUgY29tbWl0IHdoZW4KK3N1Y2ggYSBsaW5lIGlzIGZvdW5kLgorCitBbGwgdGhlIGBnaXQtY29tbWl0YCBob29rcyBhcmUgaW52b2tlZCB3aXRoIHRoZSBlbnZpcm9ubWVudAordmFyaWFibGUgYEdJVF9FRElUT1I9OmAgaWYgdGhlIGNvbW1hbmQgd2lsbCBub3QgYnJpbmcgdXAgYW4gZWRpdG9yCit0byBtb2RpZnkgdGhlIGNvbW1pdCBtZXNzYWdlLgorCitwcmVwYXJlLWNvbW1pdC1tc2cKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGhvb2sgaXMgaW52b2tlZCBieSBgZ2l0LWNvbW1pdGAgcmlnaHQgYWZ0ZXIgcHJlcGFyaW5nIHRoZQorZGVmYXVsdCBsb2cgbWVzc2FnZSwgYW5kIGJlZm9yZSB0aGUgZWRpdG9yIGlzIHN0YXJ0ZWQuCisKK0l0IHRha2VzIG9uZSB0byB0aHJlZSBwYXJhbWV0ZXJzLiAgVGhlIGZpcnN0IGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlCit0aGF0IHRoZSBjb21taXQgbG9nIG1lc3NhZ2UuICBUaGUgc2Vjb25kIGlzIHRoZSBzb3VyY2Ugb2YgdGhlIGNvbW1pdAorbWVzc2FnZSwgYW5kIGNhbiBiZTogYG1lc3NhZ2VgIChpZiBhIGBcLW1gIG9yIGBcLUZgIG9wdGlvbiB3YXMKK2dpdmVuKTsgYHRlbXBsYXRlYCAoaWYgYSBgXC10YCBvcHRpb24gd2FzIGdpdmVuIG9yIHRoZQorY29uZmlndXJhdGlvbiBvcHRpb24gYGNvbW1pdC50ZW1wbGF0ZWAgaXMgc2V0KTsgYG1lcmdlYCAoaWYgdGhlCitjb21taXQgaXMgYSBtZXJnZSBvciBhIGAuZ2l0L01FUkdFX01TR2AgZmlsZSBleGlzdHMpOyBgc3F1YXNoYAorKGlmIGEgYC5naXQvU1FVQVNIX01TR2AgZmlsZSBleGlzdHMpOyBvciBgY29tbWl0YCwgZm9sbG93ZWQgYnkKK2EgY29tbWl0IFNIQTEgKGlmIGEgYFwtY2AsIGBcLUNgIG9yIGBcLS1hbWVuZGAgb3B0aW9uIHdhcyBnaXZlbikuCisKK0lmIHRoZSBleGl0IHN0YXR1cyBpcyBub24temVybywgYGdpdC1jb21taXRgIHdpbGwgYWJvcnQuCisKK1RoZSBwdXJwb3NlIG9mIHRoZSBob29rIGlzIHRvIGVkaXQgdGhlIG1lc3NhZ2UgZmlsZSBpbiBwbGFjZSwgYW5kCitpdCBpcyBub3Qgc3VwcHJlc3NlZCBieSB0aGUgYFwtLW5vLXZlcmlmeWAgb3B0aW9uLiAgQSBub24temVybyBleGl0CittZWFucyBhIGZhaWx1cmUgb2YgdGhlIGhvb2sgYW5kIGFib3J0cyB0aGUgY29tbWl0LiAgSXQgc2hvdWxkIG5vdAorYmUgdXNlZCBhcyByZXBsYWNlbWVudCBmb3IgcHJlLWNvbW1pdCBob29rLgorCitUaGUgc2FtcGxlIGBwcmVwYXJlLWNvbW1pdC1tc2dgIGhvb2sgdGhhdCBjb21lcyB3aXRoIGdpdCBjb21tZW50cworb3V0IHRoZSBgQ29uZmxpY3RzOmAgcGFydCBvZiBhIG1lcmdlJ3MgY29tbWl0IG1lc3NhZ2UuCisKK2NvbW1pdC1tc2cKKy0tLS0tLS0tLS0KKworVGhpcyBob29rIGlzIGludm9rZWQgYnkgYGdpdC1jb21taXRgLCBhbmQgY2FuIGJlIGJ5cGFzc2VkCit3aXRoIGBcLS1uby12ZXJpZnlgIG9wdGlvbi4gIEl0IHRha2VzIGEgc2luZ2xlIHBhcmFtZXRlciwgdGhlCituYW1lIG9mIHRoZSBmaWxlIHRoYXQgaG9sZHMgdGhlIHByb3Bvc2VkIGNvbW1pdCBsb2cgbWVzc2FnZS4KK0V4aXRpbmcgd2l0aCBub24temVybyBzdGF0dXMgY2F1c2VzIHRoZSBgZ2l0LWNvbW1pdGAgdG8KK2Fib3J0LgorCitUaGUgaG9vayBpcyBhbGxvd2VkIHRvIGVkaXQgdGhlIG1lc3NhZ2UgZmlsZSBpbiBwbGFjZSwgYW5kIGNhbgorYmUgdXNlZCB0byBub3JtYWxpemUgdGhlIG1lc3NhZ2UgaW50byBzb21lIHByb2plY3Qgc3RhbmRhcmQKK2Zvcm1hdCAoaWYgdGhlIHByb2plY3QgaGFzIG9uZSkuIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVmdXNlCit0aGUgY29tbWl0IGFmdGVyIGluc3BlY3RpbmcgdGhlIG1lc3NhZ2UgZmlsZS4KKworVGhlIGRlZmF1bHQgJ2NvbW1pdC1tc2cnIGhvb2ssIHdoZW4gZW5hYmxlZCwgZGV0ZWN0cyBkdXBsaWNhdGUKKyJTaWduZWQtb2ZmLWJ5IiBsaW5lcywgYW5kIGFib3J0cyB0aGUgY29tbWl0IGlmIG9uZSBpcyBmb3VuZC4KKworcG9zdC1jb21taXQKKy0tLS0tLS0tLS0tCisKK1RoaXMgaG9vayBpcyBpbnZva2VkIGJ5IGBnaXQtY29tbWl0YC4gIEl0IHRha2VzIG5vCitwYXJhbWV0ZXIsIGFuZCBpcyBpbnZva2VkIGFmdGVyIGEgY29tbWl0IGlzIG1hZGUuCisKK1RoaXMgaG9vayBpcyBtZWFudCBwcmltYXJpbHkgZm9yIG5vdGlmaWNhdGlvbiwgYW5kIGNhbm5vdCBhZmZlY3QKK3RoZSBvdXRjb21lIG9mIGBnaXQtY29tbWl0YC4KKworcG9zdC1jaGVja291dAorLS0tLS0tLS0tLS0KKworVGhpcyBob29rIGlzIGludm9rZWQgd2hlbiBhIGBnaXQtY2hlY2tvdXRgIGlzIHJ1biBhZnRlciBoYXZpbmcgdXBkYXRlZCB0aGUKK3dvcmt0cmVlLiAgVGhlIGhvb2sgaXMgZ2l2ZW4gdGhyZWUgcGFyYW1ldGVyczogdGhlIHJlZiBvZiB0aGUgcHJldmlvdXMgSEVBRCwKK3RoZSByZWYgb2YgdGhlIG5ldyBIRUFEICh3aGljaCBtYXkgb3IgbWF5IG5vdCBoYXZlIGNoYW5nZWQpLCBhbmQgYSBmbGFnCitpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNoZWNrb3V0IHdhcyBhIGJyYW5jaCBjaGVja291dCAoY2hhbmdpbmcgYnJhbmNoZXMsCitmbGFnPTEpIG9yIGEgZmlsZSBjaGVja291dCAocmV0cmlldmluZyBhIGZpbGUgZnJvbSB0aGUgaW5kZXgsIGZsYWc9MCkuCitUaGlzIGhvb2sgY2Fubm90IGFmZmVjdCB0aGUgb3V0Y29tZSBvZiBgZ2l0LWNoZWNrb3V0YC4KKworVGhpcyBob29rIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gcmVwb3NpdG9yeSB2YWxpZGl0eSBjaGVja3MsIGF1dG8tZGlzcGxheQorZGlmZmVyZW5jZXMgZnJvbSB0aGUgcHJldmlvdXMgSEVBRCBpZiBkaWZmZXJlbnQsIG9yIHNldCB3b3JraW5nIGRpciBtZXRhZGF0YQorcHJvcGVydGllcy4KKworcG9zdC1tZXJnZQorLS0tLS0tLS0tLS0KKworVGhpcyBob29rIGlzIGludm9rZWQgYnkgYGdpdC1tZXJnZWAsIHdoaWNoIGhhcHBlbnMgd2hlbiBhIGBnaXQgcHVsbGAKK2lzIGRvbmUgb24gYSBsb2NhbCByZXBvc2l0b3J5LiAgVGhlIGhvb2sgdGFrZXMgYSBzaW5nbGUgcGFyYW1ldGVyLCBhIHN0YXR1cworZmxhZyBzcGVjaWZ5aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBtZXJnZSBiZWluZyBkb25lIHdhcyBhIHNxdWFzaCBtZXJnZS4KK1RoaXMgaG9vayBjYW5ub3QgYWZmZWN0IHRoZSBvdXRjb21lIG9mIGBnaXQtbWVyZ2VgLgorCitUaGlzIGhvb2sgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhIGNvcnJlc3BvbmRpbmcgcHJlLWNvbW1pdCBob29rIHRvCitzYXZlIGFuZCByZXN0b3JlIGFueSBmb3JtIG9mIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgd29ya2luZyB0cmVlCisoZWc6IHBlcm1pc3Npb25zL293bmVyc2hpcCwgQUNMUywgZXRjKS4gIFNlZSBjb250cmliL2hvb2tzL3NldGdpdHBlcm1zLnBlcmwKK2ZvciBhbiBleGFtcGxlIG9mIGhvdyB0byBkbyB0aGlzLgorCitbW3ByZS1yZWNlaXZlXV0KK3ByZS1yZWNlaXZlCistLS0tLS0tLS0tLQorCitUaGlzIGhvb2sgaXMgaW52b2tlZCBieSBgZ2l0LXJlY2VpdmUtcGFja2Agb24gdGhlIHJlbW90ZSByZXBvc2l0b3J5LAord2hpY2ggaGFwcGVucyB3aGVuIGEgYGdpdCBwdXNoYCBpcyBkb25lIG9uIGEgbG9jYWwgcmVwb3NpdG9yeS4KK0p1c3QgYmVmb3JlIHN0YXJ0aW5nIHRvIHVwZGF0ZSByZWZzIG9uIHRoZSByZW1vdGUgcmVwb3NpdG9yeSwgdGhlCitwcmUtcmVjZWl2ZSBob29rIGlzIGludm9rZWQuICBJdHMgZXhpdCBzdGF0dXMgZGV0ZXJtaW5lcyB0aGUgc3VjY2Vzcworb3IgZmFpbHVyZSBvZiB0aGUgdXBkYXRlLgorCitUaGlzIGhvb2sgZXhlY3V0ZXMgb25jZSBmb3IgdGhlIHJlY2VpdmUgb3BlcmF0aW9uLiBJdCB0YWtlcyBubworYXJndW1lbnRzLCBidXQgZm9yIGVhY2ggcmVmIHRvIGJlIHVwZGF0ZWQgaXQgcmVjZWl2ZXMgb24gc3RhbmRhcmQKK2lucHV0IGEgbGluZSBvZiB0aGUgZm9ybWF0OgorCisgIDxvbGQtdmFsdWU+IFNQIDxuZXctdmFsdWU+IFNQIDxyZWYtbmFtZT4gTEYKKword2hlcmUgYDxvbGQtdmFsdWU+YCBpcyB0aGUgb2xkIG9iamVjdCBuYW1lIHN0b3JlZCBpbiB0aGUgcmVmLAorYDxuZXctdmFsdWU+YCBpcyB0aGUgbmV3IG9iamVjdCBuYW1lIHRvIGJlIHN0b3JlZCBpbiB0aGUgcmVmIGFuZAorYDxyZWYtbmFtZT5gIGlzIHRoZSBmdWxsIG5hbWUgb2YgdGhlIHJlZi4KK1doZW4gY3JlYXRpbmcgYSBuZXcgcmVmLCBgPG9sZC12YWx1ZT5gIGlzIDQwIGAwYC4KKworSWYgdGhlIGhvb2sgZXhpdHMgd2l0aCBub24temVybyBzdGF0dXMsIG5vbmUgb2YgdGhlIHJlZnMgd2lsbCBiZQordXBkYXRlZC4gSWYgdGhlIGhvb2sgZXhpdHMgd2l0aCB6ZXJvLCB1cGRhdGluZyBvZiBpbmRpdmlkdWFsIHJlZnMgY2FuCitzdGlsbCBiZSBwcmV2ZW50ZWQgYnkgdGhlIDw8dXBkYXRlLCd1cGRhdGUnPj4gaG9vay4KKworQm90aCBzdGFuZGFyZCBvdXRwdXQgYW5kIHN0YW5kYXJkIGVycm9yIG91dHB1dCBhcmUgZm9yd2FyZGVkIHRvCitgZ2l0LXNlbmQtcGFja2Agb24gdGhlIG90aGVyIGVuZCwgc28geW91IGNhbiBzaW1wbHkgYGVjaG9gIG1lc3NhZ2VzCitmb3IgdGhlIHVzZXIuCisKK1tbdXBkYXRlXV0KK3VwZGF0ZQorLS0tLS0tCisKK1RoaXMgaG9vayBpcyBpbnZva2VkIGJ5IGBnaXQtcmVjZWl2ZS1wYWNrYCBvbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnksCit3aGljaCBoYXBwZW5zIHdoZW4gYSBgZ2l0IHB1c2hgIGlzIGRvbmUgb24gYSBsb2NhbCByZXBvc2l0b3J5LgorSnVzdCBiZWZvcmUgdXBkYXRpbmcgdGhlIHJlZiBvbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnksIHRoZSB1cGRhdGUgaG9vaworaXMgaW52b2tlZC4gIEl0cyBleGl0IHN0YXR1cyBkZXRlcm1pbmVzIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgb2YKK3RoZSByZWYgdXBkYXRlLgorCitUaGUgaG9vayBleGVjdXRlcyBvbmNlIGZvciBlYWNoIHJlZiB0byBiZSB1cGRhdGVkLCBhbmQgdGFrZXMKK3RocmVlIHBhcmFtZXRlcnM6CisKKyAtIHRoZSBuYW1lIG9mIHRoZSByZWYgYmVpbmcgdXBkYXRlZCwKKyAtIHRoZSBvbGQgb2JqZWN0IG5hbWUgc3RvcmVkIGluIHRoZSByZWYsCisgLSBhbmQgdGhlIG5ldyBvYmplY3RuYW1lIHRvIGJlIHN0b3JlZCBpbiB0aGUgcmVmLgorCitBIHplcm8gZXhpdCBmcm9tIHRoZSB1cGRhdGUgaG9vayBhbGxvd3MgdGhlIHJlZiB0byBiZSB1cGRhdGVkLgorRXhpdGluZyB3aXRoIGEgbm9uLXplcm8gc3RhdHVzIHByZXZlbnRzIGBnaXQtcmVjZWl2ZS1wYWNrYAorZnJvbSB1cGRhdGluZyB0aGF0IHJlZi4KKworVGhpcyBob29rIGNhbiBiZSB1c2VkIHRvIHByZXZlbnQgJ2ZvcmNlZCcgdXBkYXRlIG9uIGNlcnRhaW4gcmVmcyBieQorbWFraW5nIHN1cmUgdGhhdCB0aGUgb2JqZWN0IG5hbWUgaXMgYSBjb21taXQgb2JqZWN0IHRoYXQgaXMgYQorZGVzY2VuZGFudCBvZiB0aGUgY29tbWl0IG9iamVjdCBuYW1lZCBieSB0aGUgb2xkIG9iamVjdCBuYW1lLgorVGhhdCBpcywgdG8gZW5mb3JjZSBhICJmYXN0IGZvcndhcmQgb25seSIgcG9saWN5LgorCitJdCBjb3VsZCBhbHNvIGJlIHVzZWQgdG8gbG9nIHRoZSBvbGQuLm5ldyBzdGF0dXMuICBIb3dldmVyLCBpdAorZG9lcyBub3Qga25vdyB0aGUgZW50aXJlIHNldCBvZiBicmFuY2hlcywgc28gaXQgd291bGQgZW5kIHVwCitmaXJpbmcgb25lIGUtbWFpbCBwZXIgcmVmIHdoZW4gdXNlZCBuYWl2ZWx5LCB0aG91Z2guICBUaGUKKzw8cG9zdC1yZWNlaXZlLCdwb3N0LXJlY2VpdmUnPj4gaG9vayBpcyBtb3JlIHN1aXRlZCB0byB0aGF0LgorCitBbm90aGVyIHVzZSBzdWdnZXN0ZWQgb24gdGhlIG1haWxpbmcgbGlzdCBpcyB0byB1c2UgdGhpcyBob29rIHRvCitpbXBsZW1lbnQgYWNjZXNzIGNvbnRyb2wgd2hpY2ggaXMgZmluZXIgZ3JhaW5lZCB0aGFuIHRoZSBvbmUKK2Jhc2VkIG9uIGZpbGVzeXN0ZW0gZ3JvdXAuCisKK0JvdGggc3RhbmRhcmQgb3V0cHV0IGFuZCBzdGFuZGFyZCBlcnJvciBvdXRwdXQgYXJlIGZvcndhcmRlZCB0bworYGdpdC1zZW5kLXBhY2tgIG9uIHRoZSBvdGhlciBlbmQsIHNvIHlvdSBjYW4gc2ltcGx5IGBlY2hvYCBtZXNzYWdlcworZm9yIHRoZSB1c2VyLgorCitUaGUgZGVmYXVsdCAndXBkYXRlJyBob29rLCB3aGVuIGVuYWJsZWQtLWFuZCB3aXRoCitgaG9va3MuYWxsb3d1bmFubm90YXRlZGAgY29uZmlnIG9wdGlvbiB0dXJuZWQgb24tLXByZXZlbnRzCit1bmFubm90YXRlZCB0YWdzIHRvIGJlIHB1c2hlZC4KKworW1twb3N0LXJlY2VpdmVdXQorcG9zdC1yZWNlaXZlCistLS0tLS0tLS0tLS0KKworVGhpcyBob29rIGlzIGludm9rZWQgYnkgYGdpdC1yZWNlaXZlLXBhY2tgIG9uIHRoZSByZW1vdGUgcmVwb3NpdG9yeSwKK3doaWNoIGhhcHBlbnMgd2hlbiBhIGBnaXQgcHVzaGAgaXMgZG9uZSBvbiBhIGxvY2FsIHJlcG9zaXRvcnkuCitJdCBleGVjdXRlcyBvbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnkgb25jZSBhZnRlciBhbGwgdGhlIHJlZnMgaGF2ZQorYmVlbiB1cGRhdGVkLgorCitUaGlzIGhvb2sgZXhlY3V0ZXMgb25jZSBmb3IgdGhlIHJlY2VpdmUgb3BlcmF0aW9uLiAgSXQgdGFrZXMgbm8KK2FyZ3VtZW50cywgYnV0IGdldHMgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlCis8PHByZS1yZWNlaXZlLCdwcmUtcmVjZWl2ZSc+PgoraG9vayBkb2VzIG9uIGl0cyBzdGFuZGFyZCBpbnB1dC4KKworVGhpcyBob29rIGRvZXMgbm90IGFmZmVjdCB0aGUgb3V0Y29tZSBvZiBgZ2l0LXJlY2VpdmUtcGFja2AsIGFzIGl0CitpcyBjYWxsZWQgYWZ0ZXIgdGhlIHJlYWwgd29yayBpcyBkb25lLgorCitUaGlzIHN1cGVyc2VkZXMgdGhlIDw8cG9zdC11cGRhdGUsJ3Bvc3QtdXBkYXRlJz4+IGhvb2sgaW4gdGhhdCBpdCBnZXRzCitib3RoIG9sZCBhbmQgbmV3IHZhbHVlcyBvZiBhbGwgdGhlIHJlZnMgaW4gYWRkaXRpb24gdG8gdGhlaXIKK25hbWVzLgorCitCb3RoIHN0YW5kYXJkIG91dHB1dCBhbmQgc3RhbmRhcmQgZXJyb3Igb3V0cHV0IGFyZSBmb3J3YXJkZWQgdG8KK2BnaXQtc2VuZC1wYWNrYCBvbiB0aGUgb3RoZXIgZW5kLCBzbyB5b3UgY2FuIHNpbXBseSBgZWNob2AgbWVzc2FnZXMKK2ZvciB0aGUgdXNlci4KKworVGhlIGRlZmF1bHQgJ3Bvc3QtcmVjZWl2ZScgaG9vayBpcyBlbXB0eSwgYnV0IHRoZXJlIGlzCithIHNhbXBsZSBzY3JpcHQgYHBvc3QtcmVjZWl2ZS1lbWFpbGAgcHJvdmlkZWQgaW4gdGhlIGBjb250cmliL2hvb2tzYAorZGlyZWN0b3J5IGluIGdpdCBkaXN0cmlidXRpb24sIHdoaWNoIGltcGxlbWVudHMgc2VuZGluZyBjb21taXQKK2VtYWlscy4KKworW1twb3N0LXVwZGF0ZV1dCitwb3N0LXVwZGF0ZQorLS0tLS0tLS0tLS0KKworVGhpcyBob29rIGlzIGludm9rZWQgYnkgYGdpdC1yZWNlaXZlLXBhY2tgIG9uIHRoZSByZW1vdGUgcmVwb3NpdG9yeSwKK3doaWNoIGhhcHBlbnMgd2hlbiBhIGBnaXQgcHVzaGAgaXMgZG9uZSBvbiBhIGxvY2FsIHJlcG9zaXRvcnkuCitJdCBleGVjdXRlcyBvbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnkgb25jZSBhZnRlciBhbGwgdGhlIHJlZnMgaGF2ZQorYmVlbiB1cGRhdGVkLgorCitJdCB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZiBwYXJhbWV0ZXJzLCBlYWNoIG9mIHdoaWNoIGlzIHRoZQorbmFtZSBvZiByZWYgdGhhdCB3YXMgYWN0dWFsbHkgdXBkYXRlZC4KKworVGhpcyBob29rIGlzIG1lYW50IHByaW1hcmlseSBmb3Igbm90aWZpY2F0aW9uLCBhbmQgY2Fubm90IGFmZmVjdAordGhlIG91dGNvbWUgb2YgYGdpdC1yZWNlaXZlLXBhY2tgLgorCitUaGUgJ3Bvc3QtdXBkYXRlJyBob29rIGNhbiB0ZWxsIHdoYXQgYXJlIHRoZSBoZWFkcyB0aGF0IHdlcmUgcHVzaGVkLAorYnV0IGl0IGRvZXMgbm90IGtub3cgd2hhdCB0aGVpciBvcmlnaW5hbCBhbmQgdXBkYXRlZCB2YWx1ZXMgYXJlLAorc28gaXQgaXMgYSBwb29yIHBsYWNlIHRvIGRvIGxvZyBvbGQuLm5ldy4gVGhlCis8PHBvc3QtcmVjZWl2ZSwncG9zdC1yZWNlaXZlJz4+IGhvb2sgZG9lcyBnZXQgYm90aCBvcmlnaW5hbCBhbmQKK3VwZGF0ZWQgdmFsdWVzIG9mIHRoZSByZWZzLiBZb3UgbWlnaHQgY29uc2lkZXIgaXQgaW5zdGVhZCBpZiB5b3UgbmVlZAordGhlbS4KKworV2hlbiBlbmFibGVkLCB0aGUgZGVmYXVsdCAncG9zdC11cGRhdGUnIGhvb2sgcnVucworYGdpdC11cGRhdGUtc2VydmVyLWluZm9gIHRvIGtlZXAgdGhlIGluZm9ybWF0aW9uIHVzZWQgYnkgZHVtYgordHJhbnNwb3J0cyAoZS5nLiwgSFRUUCkgdXAtdG8tZGF0ZS4gIElmIHlvdSBhcmUgcHVibGlzaGluZworYSBnaXQgcmVwb3NpdG9yeSB0aGF0IGlzIGFjY2Vzc2libGUgdmlhIEhUVFAsIHlvdSBzaG91bGQKK3Byb2JhYmx5IGVuYWJsZSB0aGlzIGhvb2suCisKK0JvdGggc3RhbmRhcmQgb3V0cHV0IGFuZCBzdGFuZGFyZCBlcnJvciBvdXRwdXQgYXJlIGZvcndhcmRlZCB0bworYGdpdC1zZW5kLXBhY2tgIG9uIHRoZSBvdGhlciBlbmQsIHNvIHlvdSBjYW4gc2ltcGx5IGBlY2hvYCBtZXNzYWdlcworZm9yIHRoZSB1c2VyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ob3d0by1pbmRleC5zaCBiL0RvY3VtZW50YXRpb24vaG93dG8taW5kZXguc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzRhYTMwYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaG93dG8taW5kZXguc2gKQEAgLTAsMCArMSw1NiBAQAorIyEvYmluL3NoCisKK2NhdCA8PFxFT0YKK0dJVCBIb3d0byBJbmRleAorPT09PT09PT09PT09PT09CisKK0hlcmUgaXMgYSBjb2xsZWN0aW9uIG9mIG1haWxpbmcgbGlzdCBwb3N0aW5ncyBtYWRlIGJ5IHZhcmlvdXMKK3Blb3BsZSBkZXNjcmliaW5nIGhvdyB0aGV5IHVzZSBnaXQgaW4gdGhlaXIgd29ya2Zsb3cuCisKK0VPRgorCitmb3IgdHh0CitkbworCXRpdGxlPWBleHByICIkdHh0IiA6ICcuKi9cKC4qXClcLnR4dCQnYAorCWZyb209YHNlZCAtbmUgJworCS9eJC9xCisJL15Gcm9tOlsgCV0veworCQlzLy8vCisJCXMvXlsgCV0qLy8KKwkJcy9bIAldKiQvLworCQlzL14vYnkgLworCQlwCisJfQorCScgIiR0eHQiYAorCisJYWJzdHJhY3Q9YHNlZCAtbmUgJworCS9eQWJzdHJhY3Q6WyAJXS97CisJCXMvXlteIAldKi8vCisJCXgKKwkJcy8uKi8vCisJCXgKKwkJOiBhZ2FpbgorCQkvXlsgCV0veworCQkJcy9eWyAJXSovLworCQkJSAorCQkJbgorCQkJYiBhZ2FpbgorCQl9CisJCXgKKwkJcAorCQlxCisJfScgIiR0eHQiYAorCisJaWYgZ3JlcCAnQ29udGVudC10eXBlOiB0ZXh0L2FzY2lpZG9jJyA+L2Rldi9udWxsICR0eHQKKwl0aGVuCisJCWZpbGU9YGV4cHIgIiR0eHQiIDogJ1woLipcKVwudHh0JCdgLmh0bWwKKwllbHNlCisJCWZpbGU9IiR0eHQiCisJZmkKKworCWVjaG8gIiogbGluazokZmlsZVskdGl0bGVdICRmcm9tCiskYWJzdHJhY3QKKworIgorCitkb25lCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hvd3RvL21haW50YWluLWdpdC50eHQgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL21haW50YWluLWdpdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM1N2UyNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaG93dG8vbWFpbnRhaW4tZ2l0LnR4dApAQCAtMCwwICsxLDI3NyBAQAorRnJvbTogSnVuaW8gQyBIYW1hbm8gPGdpdHN0ZXJAcG9ib3guY29tPgorRGF0ZTogV2VkLCAyMSBOb3YgMjAwNyAxNjozMjo1NSAtMDgwMAorU3ViamVjdDogQWRkZW5kdW0gdG8gIk1haW50Tm90ZXMiCitBYnN0cmFjdDogSW1hZ2luZSB0aGF0IGdpdCBkZXZlbG9wbWVudCBpcyByYWNpbmcgYWxvbmcgYXMgdXN1YWwsIHdoZW4gb3VyIGZyaWVuZGx5CisgbmVpZ2hib3Job29kIG1haW50YWluZXIgaXMgc3RydWNrIGRvd24gYnkgYSB3YXl3YXJkIGJ1cy4gT3V0IG9mIHRoZQorIGhvcmRlcyBvZiBzdWNrZXJzIChsb3lhbCBkZXZlbG9wZXJzKSwgeW91IGhhdmUgYmVlbiB0cmlja2VkIChjaG9zZW4pIHRvCisgc3RlcCB1cCBhcyB0aGUgbmV3IG1haW50YWluZXIuIFRoaXMgaG93dG8gd2lsbCBzaG93IHlvdSAiaG93IHRvIiBkbyBpdC4KKworVGhlIG1haW50YWluZXIncyBnaXQgdGltZSBpcyBzcGVudCBvbiB0aHJlZSBhY3Rpdml0aWVzLgorCisgLSBDb21tdW5pY2F0aW9uICg2MCUpCisKKyAgIE1haWxpbmcgbGlzdCBkaXNjdXNzaW9ucyBvbiBnZW5lcmFsIGRlc2lnbiwgZmllbGRpbmcgdXNlcgorICAgcXVlc3Rpb25zLCBkaWFnbm9zaW5nIGJ1ZyByZXBvcnRzOyByZXZpZXdpbmcsIGNvbW1lbnRpbmcgb24sCisgICBzdWdnZXN0aW5nIGFsdGVybmF0aXZlcyB0bywgYW5kIHJlamVjdGluZyBwYXRjaGVzLgorCisgLSBJbnRlZ3JhdGlvbiAoMzAlKQorCisgICBBcHBseWluZyBuZXcgcGF0Y2hlcyBmcm9tIHRoZSBjb250cmlidXRvcnMgd2hpbGUgc3BvdHRpbmcgYW5kCisgICBjb3JyZWN0aW5nIG1pbm9yIG1pc3Rha2VzLCBzaHVmZmxpbmcgdGhlIGludGVncmF0aW9uIGFuZAorICAgdGVzdGluZyBicmFuY2hlcywgcHVzaGluZyB0aGUgcmVzdWx0cyBvdXQsIGN1dHRpbmcgdGhlCisgICByZWxlYXNlcywgYW5kIG1ha2luZyBhbm5vdW5jZW1lbnRzLgorCisgLSBPd24gZGV2ZWxvcG1lbnQgKDEwJSkKKworICAgU2NyYXRjaGluZyBteSBvd24gaXRjaCBhbmQgc2VuZGluZyBwcm9wb3NlZCBwYXRjaCBzZXJpZXMgb3V0LgorCitUaGUgcG9saWN5IG9uIEludGVncmF0aW9uIGlzIGluZm9ybWFsbHkgbWVudGlvbmVkIGluICJBIE5vdGUKK2Zyb20gdGhlIG1haW50YWluZXIiIG1lc3NhZ2UsIHdoaWNoIGlzIHBlcmlvZGljYWxseSBwb3N0ZWQgdG8KK3RoaXMgbWFpbGluZyBsaXN0IGFmdGVyIGVhY2ggZmVhdHVyZSByZWxlYXNlIGlzIG1hZGUuCisKK1RoZSBwb2xpY3kuCisKKyAtIEZlYXR1cmUgcmVsZWFzZXMgYXJlIG51bWJlcmVkIGFzIHZYLlkuWiBhbmQgYXJlIG1lYW50IHRvCisgICBjb250YWluIGJ1Z2ZpeGVzIGFuZCBlbmhhbmNlbWVudHMgaW4gYW55IGFyZWEsIGluY2x1ZGluZworICAgZnVuY3Rpb25hbGl0eSwgcGVyZm9ybWFuY2UgYW5kIHVzYWJpbGl0eSwgd2l0aG91dCByZWdyZXNzaW9uLgorCisgLSBNYWludGVuYW5jZSByZWxlYXNlcyBhcmUgbnVtYmVyZWQgYXMgdlguWS5aLlcgYW5kIGFyZSBtZWFudAorICAgdG8gY29udGFpbiBvbmx5IGJ1Z2ZpeGVzIGZvciB0aGUgY29ycmVzcG9uZGluZyB2WC5ZLlogZmVhdHVyZQorICAgcmVsZWFzZSBhbmQgZWFybGllciBtYWludGVuYW5jZSByZWxlYXNlcyB2WC5ZLlouViAoViA8IFcpLgorCisgLSAnbWFzdGVyJyBicmFuY2ggaXMgdXNlZCB0byBwcmVwYXJlIGZvciB0aGUgbmV4dCBmZWF0dXJlCisgICByZWxlYXNlLiBJbiBvdGhlciB3b3JkcywgYXQgc29tZSBwb2ludCwgdGhlIHRpcCBvZiAnbWFzdGVyJworICAgYnJhbmNoIGlzIHRhZ2dlZCB3aXRoIHZYLlkuWi4KKworIC0gJ21haW50JyBicmFuY2ggaXMgdXNlZCB0byBwcmVwYXJlIGZvciB0aGUgbmV4dCBtYWludGVuYW5jZQorICAgcmVsZWFzZS4gIEFmdGVyIHRoZSBmZWF0dXJlIHJlbGVhc2UgdlguWS5aIGlzIG1hZGUsIHRoZSB0aXAKKyAgIG9mICdtYWludCcgYnJhbmNoIGlzIHNldCB0byB0aGF0IHJlbGVhc2UsIGFuZCBidWdmaXhlcyB3aWxsCisgICBhY2N1bXVsYXRlIG9uIHRoZSBicmFuY2gsIGFuZCBhdCBzb21lIHBvaW50LCB0aGUgdGlwIG9mIHRoZQorICAgYnJhbmNoIGlzIHRhZ2dlZCB3aXRoIHZYLlkuWi4xLCB2WC5ZLlouMiwgYW5kIHNvIG9uLgorCisgLSAnbmV4dCcgYnJhbmNoIGlzIHVzZWQgdG8gcHVibGlzaCBjaGFuZ2VzIChib3RoIGVuaGFuY2VtZW50cworICAgYW5kIGZpeGVzKSB0aGF0ICgxKSBoYXZlIHdvcnRod2hpbGUgZ29hbCwgKDIpIGFyZSBpbiBhIGZhaXJseQorICAgZ29vZCBzaGFwZSBzdWl0YWJsZSBmb3IgZXZlcnlkYXkgdXNlLCAoMykgYnV0IGhhdmUgbm90IHlldAorICAgZGVtb25zdHJhdGVkIHRvIGJlIHJlZ3Jlc3Npb24gZnJlZS4gIE5ldyBjaGFuZ2VzIGFyZSB0ZXN0ZWQKKyAgIGluICduZXh0JyBiZWZvcmUgbWVyZ2VkIHRvICdtYXN0ZXInLgorCisgLSAncHUnIGJyYW5jaCBpcyB1c2VkIHRvIHB1Ymxpc2ggb3RoZXIgcHJvcG9zZWQgY2hhbmdlcyB0aGF0IGRvCisgICBub3QgeWV0IHBhc3MgdGhlIGNyaXRlcmlhIHNldCBmb3IgJ25leHQnLgorCisgLSBUaGUgdGlwcyBvZiAnbWFzdGVyJywgJ21haW50JyBhbmQgJ25leHQnIGJyYW5jaGVzIHdpbGwgYWx3YXlzCisgICBmYXN0IGZvcndhcmQsIHRvIGFsbG93IHBlb3BsZSB0byBidWlsZCB0aGVpciBvd24KKyAgIGN1c3RvbWl6YXRpb24gb24gdG9wIG9mIHRoZW0uCisKKyAtIFVzdWFsbHkgJ21hc3RlcicgY29udGFpbnMgYWxsIG9mICdtYWludCcsICduZXh0JyBjb250YWlucyBhbGwKKyAgIG9mICdtYXN0ZXInIGFuZCAncHUnIGNvbnRhaW5zIGFsbCBvZiAnbmV4dCcuCisKKyAtIFRoZSB0aXAgb2YgJ21hc3RlcicgaXMgbWVhbnQgdG8gYmUgbW9yZSBzdGFibGUgdGhhbiBhbnkKKyAgIHRhZ2dlZCByZWxlYXNlcywgYW5kIHRoZSB1c2VycyBhcmUgZW5jb3VyYWdlZCB0byBmb2xsb3cgaXQuCisKKyAtIFRoZSAnbmV4dCcgYnJhbmNoIGlzIHdoZXJlIG5ldyBhY3Rpb24gdGFrZXMgcGxhY2UsIGFuZCB0aGUKKyAgIHVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHRlc3QgaXQgc28gdGhhdCByZWdyZXNzaW9ucyBhbmQgYnVncworICAgYXJlIGZvdW5kIGJlZm9yZSBuZXcgdG9waWNzIGFyZSBtZXJnZWQgdG8gJ21hc3RlcicuCisKKworQSB0eXBpY2FsIGdpdCBkYXkgZm9yIHRoZSBtYWludGFpbmVyIGltcGxlbWVudHMgdGhlIGFib3ZlIHBvbGljeQorYnkgZG9pbmcgdGhlIGZvbGxvd2luZzoKKworIC0gU2NhbiBtYWlsaW5nIGxpc3QgYW5kICNnaXQgY2hhbm5lbCBsb2cuICBSZXNwb25kIHdpdGggcmV2aWV3CisgICBjb21tZW50cywgc3VnZ2VzdGlvbnMgZXRjLiAgS2liaXR6LiAgQ29sbGVjdCBwb3RlbnRpYWxseQorICAgdXNhYmxlIHBhdGNoZXMgZnJvbSB0aGUgbWFpbGluZyBsaXN0LiAgUGF0Y2hlcyBhYm91dCBhIHNpbmdsZQorICAgdG9waWMgZ28gdG8gb25lIG1haWxib3ggKEkgcmVhZCBteSBtYWlsIGluIEdudXMsIGFuZCB0eXBlCisgICBcQy1vIHRvIHNhdmUvYXBwZW5kIG1lc3NhZ2VzIGluIGZpbGVzIGluIG1ib3ggZm9ybWF0KS4KKworIC0gUmV2aWV3IHRoZSBwYXRjaGVzIGluIHRoZSBzYXZlZCBtYWlsYm94ZXMuICBFZGl0IHByb3Bvc2VkIGxvZworICAgbWVzc2FnZSBmb3IgdHlwb2ZpeGVzIGFuZCBjbGFyaWZpY2F0aW9ucywgYW5kIGFkZCBBY2tzCisgICBjb2xsZWN0ZWQgZnJvbSB0aGUgbGlzdC4gIEVkaXQgcGF0Y2ggdG8gaW5jb3Jwb3JhdGUgIk9vcHMsCisgICB0aGF0IHNob3VsZCBoYXZlIGJlZW4gbGlrZSB0aGlzIiBmaXhlcyBmcm9tIHRoZSBkaXNjdXNzaW9uLgorCisgLSBDbGFzc2lmeSB0aGUgY29sbGVjdGVkIHBhdGNoZXMgYW5kIGhhbmRsZSAnbWFzdGVyJyBhbmQKKyAgICdtYWludCcgdXBkYXRlczoKKworICAgLSBPYnZpb3VzbHkgY29ycmVjdCBmaXhlcyB0aGF0IHBlcnRhaW4gdG8gdGhlIHRpcCBvZiAnbWFpbnQnCisgICAgIGFyZSBkaXJlY3RseSBhcHBsaWVkIHRvICdtYWludCcuCisKKyAgIC0gT2J2aW91c2x5IGNvcnJlY3QgZml4ZXMgdGhhdCBwZXJ0YWluIHRvIHRoZSB0aXAgb2YgJ21hc3RlcicKKyAgICAgYXJlIGRpcmVjdGx5IGFwcGxpZWQgdG8gJ21hc3RlcicuCisKKyAgIFRoaXMgc3RlcCBpcyBkb25lIHdpdGggImdpdCBhbSIuCisKKyAgICAgJCBnaXQgY2hlY2tvdXQgbWFzdGVyICAgIDsjIG9yICJnaXQgY2hlY2tvdXQgbWFpbnQiCisgICAgICQgZ2l0IGFtIC0zIC1zIG1haWxib3gKKyAgICAgJCBtYWtlIHRlc3QKKworIC0gTWVyZ2UgZG93bndhcmRzIChtYWludC0+bWFzdGVyKToKKworICAgICAkIGdpdCBjaGVja291dCBtYXN0ZXIKKyAgICAgJCBnaXQgbWVyZ2UgbWFpbnQKKyAgICAgJCBtYWtlIHRlc3QKKworIC0gUmV2aWV3IHRoZSBsYXN0IGlzc3VlIG9mICJXaGF0J3MgY29va2luZyIgbWVzc2FnZSwgcmV2aWV3IHRoZQorICAgdG9waWNzIHNjaGVkdWxlZCBmb3IgbWVyZ2luZyB1cHdhcmRzICh0b3BpYy0+bWFzdGVyIGFuZAorICAgdG9waWMtPm1haW50KSwgYW5kIG1lcmdlLgorCisgICAgICQgZ2l0IGNoZWNrb3V0IG1hc3RlciAgICA7IyBvciAiZ2l0IGNoZWNrb3V0IG1haW50IgorICAgICAkIGdpdCBtZXJnZSBhaS90b3BpYyAgICAgOyMgb3IgImdpdCBtZXJnZSBhaS9tYWludC10b3BpYyIKKyAgICAgJCBnaXQgbG9nIC1wIE9SSUdfSEVBRC4uIDsjIGZpbmFsIHJldmlldworICAgICAkIGdpdCBkaWZmIE9SSUdfSEVBRC4uICAgOyMgZmluYWwgcmV2aWV3CisgICAgICQgbWFrZSB0ZXN0ICAgICAgICAgICAgICA7IyBmaW5hbCByZXZpZXcKKyAgICAgJCBnaXQgYnJhbmNoIC1kIGFpL3RvcGljIDsjIG9yICJnaXQgYnJhbmNoIC1kIGFpL21haW50LXRvcGljIgorCisgLSBNZXJnZSBkb3dud2FyZHMgKG1haW50LT5tYXN0ZXIpIGlmIG5lZWRlZDoKKworICAgICAkIGdpdCBjaGVja291dCBtYXN0ZXIKKyAgICAgJCBnaXQgbWVyZ2UgbWFpbnQKKyAgICAgJCBtYWtlIHRlc3QKKworIC0gTWVyZ2UgZG93bndhcmRzIChtYXN0ZXItPm5leHQpIGlmIG5lZWRlZDoKKworICAgICAkIGdpdCBjaGVja291dCBuZXh0CisgICAgICQgZ2l0IG1lcmdlIG1hc3RlcgorICAgICAkIG1ha2UgdGVzdAorCisgLSBIYW5kbGUgdGhlIHJlbWFpbmluZyBwYXRjaGVzOgorCisgICAtIEFueXRoaW5nIHVub2J2aW91cyB0aGF0IGlzIGFwcGxpY2FibGUgdG8gJ21hc3RlcicgKGluIG90aGVyCisgICAgIHdvcmRzLCBkb2VzIG5vdCBkZXBlbmQgb24gYW55dGhpbmcgdGhhdCBpcyBzdGlsbCBpbiAnbmV4dCcKKyAgICAgYW5kIG5vdCBpbiAnbWFzdGVyJykgaXMgYXBwbGllZCB0byBhIG5ldyB0b3BpYyBicmFuY2ggdGhhdAorICAgICBpcyBmb3JrZWQgZnJvbSB0aGUgdGlwIG9mICdtYXN0ZXInLiAgVGhpcyBpbmNsdWRlcyBib3RoCisgICAgIGVuaGFuY2VtZW50cyBhbmQgdW5vYnZpb3VzIGZpeGVzIHRvICdtYXN0ZXInLiAgQSB0b3BpYworICAgICBicmFuY2ggaXMgbmFtZWQgYXMgYWkvdG9waWMgd2hlcmUgImFpIiBpcyB0eXBpY2FsbHkKKyAgICAgYXV0aG9yJ3MgaW5pdGlhbCBhbmQgInRvcGljIiBpcyBhIGRlc2NyaXB0aXZlIG5hbWUgb2YgdGhlCisgICAgIHRvcGljIChpbiBvdGhlciB3b3JkcywgIndoYXQncyB0aGUgc2VyaWVzIGlzIGFib3V0IikuCisKKyAgIC0gQW4gdW5vYnZpb3VzIGZpeCBtZWFudCBmb3IgJ21haW50JyBpcyBhcHBsaWVkIHRvIGEgbmV3CisgICAgIHRvcGljIGJyYW5jaCB0aGF0IGlzIGZvcmtlZCBmcm9tIHRoZSB0aXAgb2YgJ21haW50Jy4gIFRoZQorICAgICB0b3BpYyBpcyBuYW1lZCBhcyBhaS9tYWludC10b3BpYy4KKworICAgLSBDaGFuZ2VzIHRoYXQgcGVydGFpbiB0byBhbiBleGlzdGluZyB0b3BpYyBhcmUgYXBwbGllZCB0bworICAgICB0aGUgYnJhbmNoLCBidXQ6CisKKyAgICAgLSBvYnZpb3VzbHkgY29ycmVjdCBvbmVzIGFyZSBhcHBsaWVkIGZpcnN0OworCisgICAgIC0gcXVlc3Rpb25hYmxlIG9uZXMgYXJlIGRpc2NhcmRlZCBvciBhcHBsaWVkIHRvIG5lYXIgdGhlIHRpcDsKKworICAgLSBSZXBsYWNlbWVudCBwYXRjaGVzIHRvIGFuIGV4aXN0aW5nIHRvcGljIGFyZSBhY2NlcHRlZCBvbmx5CisgICAgIGZvciBjb21taXRzIG5vdCBpbiAnbmV4dCcuCisKKyAgIFRoZSBhYm92ZSBleGNlcHQgdGhlICJyZXBsYWNlbWVudCIgYXJlIGFsbCBkb25lIHdpdGg6CisKKyAgICAgJCBnaXQgYW0gLTMgLXMgbWFpbGJveAorCisgICB3aGlsZSBwYXRjaCByZXBsYWNlbWVudCBpcyBvZnRlbiBkb25lIGJ5OgorCisgICAgICQgZ2l0IGZvcm1hdC1wYXRjaCBhaS90b3BpY34kbi4uYWkvdG9waWMgOyMgZXhwb3J0IGV4aXN0aW5nCisKKyAgIHRoZW4gcmVwbGFjZSBzb21lIHBhcnRzIHdpdGggdGhlIG5ldyBwYXRjaCwgYW5kIHJlYXBwbHlpbmc6CisKKyAgICAgJCBnaXQgcmVzZXQgLS1oYXJkIGFpL3RvcGljfiRuCisgICAgICQgZ2l0IGFtIC0zIC1zIDAwMCoudHh0CisKKyAgIFRoZSBmdWxsIHRlc3Qgc3VpdGUgaXMgYWx3YXlzIHJ1biBmb3IgJ21haW50JyBhbmQgJ21hc3RlcicKKyAgIGFmdGVyIHBhdGNoIGFwcGxpY2F0aW9uOyBmb3IgdG9waWMgYnJhbmNoZXMgdGhlIHRlc3RzIGFyZSBydW4KKyAgIGFzIHRpbWUgcGVybWl0cy4KKworIC0gVXBkYXRlICJXaGF0J3MgY29va2luZyIgbWVzc2FnZSB0byByZXZpZXcgdGhlIHVwZGF0ZXMgdG8KKyAgIGV4aXN0aW5nIHRvcGljcywgbmV3bHkgYWRkZWQgdG9waWNzIGFuZCBncmFkdWF0ZWQgdG9waWNzLgorCisgICBUaGlzIHN0ZXAgaXMgaGVscGVkIHdpdGggTWV0YS9VV0Mgc2NyaXB0ICh3aGVyZSBNZXRhLyBjb250YWlucworICAgYSBjaGVja291dCBvZiB0aGUgJ3RvZG8nIGJyYW5jaCkuCisKKyAtIE1lcmdlIHRvcGljcyB0byAnbmV4dCcuICBGb3IgZWFjaCBicmFuY2ggd2hvc2UgdGlwIGlzIG5vdAorICAgbWVyZ2VkIHRvICduZXh0Jywgb25lIG9mIHRocmVlIHRoaW5ncyBjYW4gaGFwcGVuOgorCisgICAtIFRoZSBjb21taXRzIGFyZSBhbGwgbmV4dC13b3J0aHk7IG1lcmdlIHRoZSB0b3BpYyB0byBuZXh0OgorCisgICAgICQgZ2l0IGNoZWNrb3V0IG5leHQKKyAgICAgJCBnaXQgbWVyZ2UgYWkvdG9waWMgICAgIDsjIG9yICJnaXQgbWVyZ2UgYWkvbWFpbnQtdG9waWMiCisgICAgICQgbWFrZSB0ZXN0CisKKyAgIC0gVGhlIG5ldyBwYXJ0cyBhcmUgb2YgbWl4ZWQgcXVhbGl0eSwgYnV0IGVhcmxpZXIgb25lcyBhcmUKKyAgICAgbmV4dC13b3J0aHk7IG1lcmdlIHRoZSBlYXJseSBwYXJ0cyB0byBuZXh0OgorCisgICAgICQgZ2l0IGNoZWNrb3V0IG5leHQKKyAgICAgJCBnaXQgbWVyZ2UgYWkvdG9waWN+MiAgIDsjIHRoZSB0aXAgdHdvIGFyZSBkdWJpb3VzCisgICAgICQgbWFrZSB0ZXN0CisKKyAgIC0gTm90aGluZyBpcyBuZXh0LXdvcnRoeTsgZG8gbm90IGRvIGFueXRoaW5nLgorCisgLSBSZWJhc2UgdG9waWNzIHRoYXQgZG8gbm90IGhhdmUgYW55IGNvbW1pdCBpbiBuZXh0IHlldC4gIFRoaXMKKyAgIHN0ZXAgaXMgb3B0aW9uYWwgYnV0IHNvbWV0aW1lcyBpcyB3b3J0aCBkb2luZyB3aGVuIGFuIG9sZAorICAgc2VyaWVzIHRoYXQgaXMgbm90IGluIG5leHQgY2FuIHRha2UgYWR2YW50YWdlIG9mIGxvdy1sZXZlbAorICAgZnJhbWV3b3JrIGNoYW5nZSB0aGF0IGlzIG1lcmdlZCB0byAnbWFzdGVyJyBhbHJlYWR5LgorCisgICAgICQgZ2l0IHJlYmFzZSBtYXN0ZXIgYWkvdG9waWMKKworICAgVGhpcyBzdGVwIGlzIGhlbHBlZCB3aXRoIE1ldGEvZ2l0LXRvcGljLnBlcmwgc2NyaXB0IHRvCisgICBpZGVudGlmeSB3aGljaCB0b3BpYyBpcyByZWJhc2VhYmxlLiAgVGhlcmUgYWxzbyBpcyBhCisgICBwcmUtcmViYXNlIGhvb2sgdG8gbWFrZSBzdXJlIHRoYXQgdG9waWNzIHRoYXQgYXJlIGFscmVhZHkgaW4KKyAgICduZXh0JyBhcmUgbm90IHJlYmFzZWQgYmV5b25kIHRoZSBtZXJnZWQgY29tbWl0LgorCisgLSBSZWJ1aWxkICJwdSIgdG8gbWVyZ2UgdGhlIHRpcHMgb2YgdG9waWNzIG5vdCBpbiAnbmV4dCcuCisKKyAgICAgJCBnaXQgY2hlY2tvdXQgcHUKKyAgICAgJCBnaXQgcmVzZXQgLS1oYXJkIG5leHQKKyAgICAgJCBnaXQgbWVyZ2UgYWkvdG9waWMgICAgIDsjIHJlcGVhdCBmb3IgYWxsIHJlbWFpbmluZyB0b3BpY3MKKyAgICAgJCBtYWtlIHRlc3QKKworICAgVGhpcyBzdGVwIGlzIGhlbHBlZCB3aXRoIE1ldGEvUFUgc2NyaXB0CisKKyAtIFB1c2ggZm91ciBpbnRlZ3JhdGlvbiBicmFuY2hlcyB0byBhIHByaXZhdGUgcmVwb3NpdG9yeSBhdAorICAgay5vcmcgYW5kIHJ1biAibWFrZSB0ZXN0IiBvbiBhbGwgb2YgdGhlbS4KKworIC0gUHVzaCBmb3VyIGludGVncmF0aW9uIGJyYW5jaGVzIHRvIC9wdWIvc2NtL2dpdC9naXQuZ2l0IGF0CisgICBrLm9yZy4gIFRoaXMgdHJpZ2dlcnMgaXRzIHBvc3QtdXBkYXRlIGhvb2sgd2hpY2g6CisKKyAgICAoMSkgcnVucyAiZ2l0IHB1bGwiIGluICRIT01FL2dpdC1kb2MvIHJlcG9zaXRvcnkgdG8gcHVsbAorICAgICAgICAnbWFzdGVyJyBqdXN0IHB1c2hlZCBvdXQ7CisKKyAgICAoMikgcnVucyAibWFrZSBkb2MiIGluICRIT01FL2dpdC1kb2MvLCBpbnN0YWxsIHRoZSBnZW5lcmF0ZWQKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBpbiBzdGFnaW5nIGFyZWFzLCB3aGljaCBhcmUgc2VwYXJhdGUKKyAgICAgICAgcmVwb3NpdG9yaWVzIHRoYXQgaGF2ZSBodG1sIGFuZCBtYW4gYnJhbmNoZXMgY2hlY2tlZAorICAgICAgICBvdXQuCisKKyAgICAoMykgcnVucyAiZ2l0IGNvbW1pdCIgaW4gdGhlIHN0YWdpbmcgYXJlYXMsIGFuZCBydW4gImdpdAorICAgICAgICBwdXNoIiBiYWNrIHRvIC9wdWIvc2NtL2dpdC9naXQuZ2l0LyB0byB1cGRhdGUgdGhlIGh0bWwKKyAgICAgICAgYW5kIG1hbiBicmFuY2hlcy4KKworICAgICg0KSBpbnN0YWxscyBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiB0byAvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy8KKyAgICAgICAgdG8gYmUgdmlld2VkIGZyb20gaHR0cDovL3d3dy5rZXJuZWwub3JnLworCisgLSBGZXRjaCBodG1sIGFuZCBtYW4gYnJhbmNoZXMgYmFjayBmcm9tIGsub3JnLCBhbmQgcHVzaCBmb3VyCisgICBpbnRlZ3JhdGlvbiBicmFuY2hlcyBhbmQgdGhlIHR3byBkb2N1bWVudGF0aW9uIGJyYW5jaGVzIHRvCisgICByZXBvLm9yLmN6CisKKworU29tZSBvYnNlcnZhdGlvbnMgdG8gYmUgbWFkZS4KKworICogRWFjaCB0b3BpYyBpcyB0ZXN0ZWQgaW5kaXZpZHVhbGx5LCBhbmQgYWxzbyB0b2dldGhlciB3aXRoCisgICBvdGhlciB0b3BpY3MgY29va2luZyBpbiAnbmV4dCcuICBVbnRpbCBpdCBtYXR1cmVzLCBub25lIHBhcnQKKyAgIG9mIGl0IGlzIG1lcmdlZCB0byAnbWFzdGVyJy4KKworICogQSB0b3BpYyBhbHJlYWR5IGluICduZXh0JyBjYW4gZ2V0IGZpeGVzIHdoaWxlIHN0aWxsIGluCisgICAnbmV4dCcuICBTdWNoIGEgdG9waWMgd2lsbCBoYXZlIG1hbnkgbWVyZ2VzIHRvICduZXh0JyAoaW4KKyAgIG90aGVyIHdvcmRzLCAiZ2l0IGxvZyAtLWZpcnN0LXBhcmVudCBuZXh0IiB3aWxsIHNob3cgbWFueQorICAgIk1lcmdlIGFpL3RvcGljIHRvIG5leHQiIGZvciB0aGUgc2FtZSB0b3BpYy4KKworICogQW4gdW5vYnZpb3VzIGZpeCBmb3IgJ21haW50JyBpcyBjb29rZWQgaW4gJ25leHQnIGFuZCB0aGVuCisgICBtZXJnZWQgdG8gJ21hc3RlcicgdG8gbWFrZSBleHRyYSBzdXJlIGl0IGlzIE9rIGFuZCB0aGVuCisgICBtZXJnZWQgdG8gJ21haW50Jy4KKworICogRXZlbiB3aGVuICduZXh0JyBiZWNvbWVzIGVtcHR5IChpbiBvdGhlciB3b3JkcywgYWxsIHRvcGljcworICAgcHJvdmUgc3RhYmxlIGFuZCBhcmUgbWVyZ2VkIHRvICdtYXN0ZXInIGFuZCAiZ2l0IGRpZmYgbWFzdGVyCisgICBuZXh0IiBzaG93cyBlbXB0eSksIGl0IGhhcyB0b25zIG9mIG1lcmdlIGNvbW1pdHMgdGhhdCB3aWxsCisgICBuZXZlciBiZSBpbiAnbWFzdGVyJy4KKworICogSW4gcHJpbmNpcGxlLCAiZ2l0IGxvZyAtLWZpcnN0LXBhcmVudCBtYXN0ZXIuLm5leHQiIHNob3VsZAorICAgc2hvdyBub3RoaW5nIGJ1dCBtZXJnZXMgKGluIHByYWN0aWNlLCB0aGVyZSBhcmUgZml4dXAgY29tbWl0cworICAgYW5kIHJldmVydHMgdGhhdCBhcmUgbm90IG1lcmdlcykuCisKKyAqIENvbW1pdHMgbmVhciB0aGUgdGlwIG9mIGEgdG9waWMgYnJhbmNoIHRoYXQgYXJlIG5vdCBpbiAnbmV4dCcKKyAgIGFyZSBmYWlyIGdhbWUgdG8gYmUgZGlzY2FyZGVkLCByZXBsYWNlZCBvciByZXdyaXR0ZW4uCisgICBDb21taXRzIGFscmVhZHkgbWVyZ2VkIHRvICduZXh0JyB3aWxsIG5vdCBiZS4KKworICogQmVpbmcgaW4gdGhlICduZXh0JyBicmFuY2ggaXMgbm90IGEgZ3VhcmFudGVlIGZvciBhIHRvcGljIHRvCisgICBiZSBpbmNsdWRlZCBpbiB0aGUgbmV4dCBmZWF0dXJlIHJlbGVhc2UuICBCZWluZyBpbiB0aGUKKyAgICdtYXN0ZXInIGJyYW5jaCB0eXBpY2FsbHkgaXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hvd3RvL3JlYmFzZS1hbmQtZWRpdC50eHQgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL3JlYmFzZS1hbmQtZWRpdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0OTA5ZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaG93dG8vcmViYXNlLWFuZC1lZGl0LnR4dApAQCAtMCwwICsxLDc5IEBACitEYXRlOglTYXQsIDEzIEF1ZyAyMDA1IDIyOjE2OjAyIC0wNzAwIChQRFQpCitGcm9tOglMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CitUbzoJU3RldmUgRnJlbmNoIDxzbWZyZW5jaEBhdXN0aW4ucnIuY29tPgorY2M6CWdpdEB2Z2VyLmtlcm5lbC5vcmcKK1N1YmplY3Q6IFJlOiBzZW5kaW5nIGNoYW5nZXNldHMgZnJvbSB0aGUgbWlkZGxlIG9mIGEgZ2l0IHRyZWUKK0Fic3RyYWN0OiBJbiB0aGlzIGFydGljbGUsIExpbnVzIGRlbW9uc3RyYXRlcyBob3cgYSBicm9rZW4gY29tbWl0CisgaW4gYSBzZXF1ZW5jZSBvZiBjb21taXRzIGNhbiBiZSByZW1vdmVkIGJ5IHJld2luZGluZyB0aGUgaGVhZCBhbmQKKyByZWFwcGx5aW5nIHNlbGVjdGVkIGNoYW5nZXMuCisKK09uIFNhdCwgMTMgQXVnIDIwMDUsIExpbnVzIFRvcnZhbGRzIHdyb3RlOgorCis+IFRoYXQncyBjb3JyZWN0LiBTYW1lIHRoaW5ncyBhcHBseTogeW91IGNhbiBtb3ZlIGEgcGF0Y2ggb3ZlciwgYW5kIGNyZWF0ZSBhCis+IG5ldyBvbmUgd2l0aCBhIG1vZGlmaWVkIGNvbW1lbnQsIGJ1dCBiYXNpY2FsbHkgdGhlIF9vbGRfIGNvbW1pdCB3aWxsIGJlCis+IGltbXV0YWJsZS4KKworTGV0IG1lIGNsYXJpZnkuCisKK1lvdSBjYW4gZW50aXJlbHkgX2Ryb3BfIG9sZCBicmFuY2hlcywgc28gY29tbWl0cyBtYXkgYmUgaW1tdXRhYmxlLCBidXQKK25vdGhpbmcgZm9yY2VzIHlvdSB0byBrZWVwIHRoZW0uIE9mIGNvdXJzZSwgd2hlbiB5b3UgZHJvcCBhIGNvbW1pdCwgeW91J2xsCithbHdheXMgZW5kIHVwIGRyb3BwaW5nIGFsbCB0aGUgY29tbWl0cyB0aGF0IGRlcGVuZGVkIG9uIGl0LCBhbmQgaWYgeW91CithY3R1YWxseSBnb3Qgc29tZWJvZHkgZWxzZSB0byBwdWxsIHRoYXQgY29tbWl0IHlvdSBjYW4ndCBkcm9wIGl0IGZyb20KK190aGVpcl8gcmVwb3NpdG9yeSwgYnV0IHVuZG9pbmcgdGhpbmdzIGlzIG5vdCBpbXBvc3NpYmxlLgorCitGb3IgZXhhbXBsZSwgbGV0J3Mgc2F5IHRoYXQgeW91J3ZlIG1hZGUgYSBtZXNzIG9mIHRoaW5nczogeW91J3ZlIGNvbW1pdHRlZAordGhyZWUgY29tbWl0cyAib2xkLT5hLT5iLT5jIiwgYW5kIHlvdSBub3RpY2UgdGhhdCAiYSIgd2FzIGJyb2tlbiwgYnV0IHlvdQord2FudCB0byBzYXZlICJiIiBhbmQgImMiLiBXaGF0IHlvdSBjYW4gZG8gaXMKKworCSMgQ3JlYXRlIGEgYnJhbmNoICJicm9rZW4iIHRoYXQgaXMgdGhlIGN1cnJlbnQgY29kZQorCSMgZm9yIHJlZmVyZW5jZQorCWdpdCBicmFuY2ggYnJva2VuCisKKwkjIFJlc2V0IHRoZSBtYWluIGJyYW5jaCB0byB0aHJlZSBwYXJlbnRzIGJhY2s6IHRoaXMKKwkjIGVmZmVjdGl2ZWx5IHVuZG9lcyB0aGUgdGhyZWUgdG9wIGNvbW1pdHMKKwlnaXQgcmVzZXQgSEVBRF5eXgorCWdpdCBjaGVja291dCAtZgorCisJIyBDaGVjayB0aGUgcmVzdWx0IHZpc3VhbGx5IHRvIG1ha2Ugc3VyZSB5b3Uga25vdyB3aGF0J3MKKwkjIGdvaW5nIG9uCisJZ2l0ayAtLWFsbAorCisJIyBSZS1hcHBseSB0aGUgdHdvIHRvcCBvbmVzIGZyb20gImJyb2tlbiIKKwkjCisJIyBGaXJzdCAicGFyZW50IG9mIGJyb2tlbiIgKGFrYSBiKToKKwlnaXQtZGlmZi10cmVlIC1wIGJyb2tlbl4gfCBnaXQtYXBwbHkgLS1pbmRleAorCWdpdCBjb21taXQgLS1yZWVkaXQ9YnJva2VuXgorCisJIyBUaGVuICJ0b3Agb2YgYnJva2VuIiAoYWthIGMpOgorCWdpdC1kaWZmLXRyZWUgLXAgYnJva2VuIHwgZ2l0LWFwcGx5IC0taW5kZXgKKwlnaXQgY29tbWl0IC0tcmVlZGl0PWJyb2tlbgorCithbmQgeW91J3ZlIG5vdyByZS1hcHBsaWVkIChhbmQgcG9zc2libHkgZWRpdGVkIHRoZSBjb21tZW50cykgdGhlIHR3bworY29tbWl0cyBiL2MsIGFuZCBjb21taXQgImEiIGlzIGJhc2ljYWxseSBnb25lIChpdCBzdGlsbCBleGlzdHMgaW4gdGhlCisiYnJva2VuIiBicmFuY2gsIG9mIGNvdXJzZSkuCisKK0ZpbmFsbHksIGNoZWNrIG91dCB0aGUgZW5kIHJlc3VsdCBhZ2FpbjoKKworCSMgTG9vayBhdCB0aGUgbmV3IGNvbW1pdCBoaXN0b3J5CisJZ2l0ayAtLWFsbAorCit0byBzZWUgdGhhdCBldmVyeXRoaW5nIGxvb2tzIHNlbnNpYmxlLgorCitBbmQgdGhlbiwgeW91IGNhbiBqdXN0IHJlbW92ZSB0aGUgYnJva2VuIGJyYW5jaCBpZiB5b3UgZGVjaWRlIHlvdSByZWFsbHkKK2Rvbid0IHdhbnQgaXQ6CisKKwkjIHJlbW92ZSAnYnJva2VuJyBicmFuY2gKKwlnaXQgYnJhbmNoIC1kIGJyb2tlbgorCisJIyBQcnVuZSBvbGQgb2JqZWN0cyBpZiB5b3UncmUgcmVhbGx5IHJlYWxseSBzdXJlCisJZ2l0IHBydW5lCisKK0FuZCB5ZWFoLCBJJ20gc3VyZSB0aGVyZSBhcmUgb3RoZXIgd2F5cyBvZiBkb2luZyB0aGlzLiBBbmQgYXMgdXN1YWwsIHRoZQorYWJvdmUgaXMgdG90YWxseSB1bnRlc3RlZCwgYW5kIEkganVzdCB3cm90ZSBpdCBkb3duIGluIHRoaXMgZW1haWwsIHNvIGlmCitJJ3ZlIGRvbmUgc29tZXRoaW5nIHdyb25nLCB5b3UnbGwgaGF2ZSB0byBmaWd1cmUgaXQgb3V0IG9uIHlvdXIgb3duIDspCisKKwkJCUxpbnVzCistCitUbyB1bnN1YnNjcmliZSBmcm9tIHRoaXMgbGlzdDogc2VuZCB0aGUgbGluZSAidW5zdWJzY3JpYmUgZ2l0IiBpbgordGhlIGJvZHkgb2YgYSBtZXNzYWdlIHRvIG1ham9yZG9tb0B2Z2VyLmtlcm5lbC5vcmcKK01vcmUgbWFqb3Jkb21vIGluZm8gYXQgIGh0dHA6Ly92Z2VyLmtlcm5lbC5vcmcvbWFqb3Jkb21vLWluZm8uaHRtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ob3d0by9yZWJhc2UtZnJvbS1pbnRlcm5hbC1icmFuY2gudHh0IGIvRG9jdW1lbnRhdGlvbi9ob3d0by9yZWJhc2UtZnJvbS1pbnRlcm5hbC1icmFuY2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNzYwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL3JlYmFzZS1mcm9tLWludGVybmFsLWJyYW5jaC50eHQKQEAgLTAsMCArMSwxNjMgQEAKK0Zyb206CUp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KK1RvOglnaXRAdmdlci5rZXJuZWwub3JnCitDYzoJUGV0ciBCYXVkaXMgPHBhc2t5QHN1c2UuY3o+LCBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CitTdWJqZWN0OiBSZTogc2VuZGluZyBjaGFuZ2VzZXRzIGZyb20gdGhlIG1pZGRsZSBvZiBhIGdpdCB0cmVlCitEYXRlOglTdW4sIDE0IEF1ZyAyMDA1IDE4OjM3OjM5IC0wNzAwCitBYnN0cmFjdDogSW4gdGhpcyBhcnRpY2xlLCBKQyB0YWxrcyBhYm91dCBob3cgaGUgcmViYXNlcyB0aGUKKyBwdWJsaWMgInB1IiBicmFuY2ggdXNpbmcgdGhlIGNvcmUgR0lUIHRvb2xzIHdoZW4gaGUgdXBkYXRlcworIHRoZSAibWFzdGVyIiBicmFuY2gsIGFuZCBob3cgInJlYmFzZSIgd29ya3MuICBBbHNvIGRpc2N1c3NlZAorIGlzIGhvdyB0aGlzIGFwcGxpZXMgdG8gaW5kaXZpZHVhbCBkZXZlbG9wZXJzIHdobyBzZW5kcyBwYXRjaGVzCisgdXBzdHJlYW0uCisKK1BldHIgQmF1ZGlzIDxwYXNreUBzdXNlLmN6PiB3cml0ZXM6CisKKz4gRGVhciBkaWFyeSwgb24gU3VuLCBBdWcgMTQsIDIwMDUgYXQgMDk6NTc6MTNBTSBDRVNULCBJIGdvdCBhIGxldHRlcgorPiB3aGVyZSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+IHRvbGQgbWUgdGhhdC4uLgorPj4gTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPiB3cml0ZXM6Cis+PgorPj4gPiBKdW5pbywgbWF5YmUgeW91IHdhbnQgdG8gdGFsayBhYm91dCBob3cgeW91IG1vdmUgcGF0Y2hlcyBmcm9tIHlvdXIgInB1IgorPj4gPiBicmFuY2ggdG8gdGhlIHJlYWwgYnJhbmNoZXMuCis+PgorPiBBY3R1YWxseSwgd291bGRuJ3QgdGhpcyBiZSBhbHNvIHByZWNpc2VseSBmb3Igd2hhdCBTdEdJVCBpcyBpbnRlbmRlZCB0bz8KKworRXhhY3RseSBteSBmZWVsaW5nLiAgSSB3YXMgc29ydCBvZiB3YWl0aW5nIGZvciBDYXRhbGluIHRvIHNwZWFrCit1cC4gIFdpdGggaXRzIGJhc2luZyBwaGlsb3NvcGhpY2FsIGFuY2VzdHJ5IG9uIHF1aWx0LCB0aGlzIGlzCit0aGUga2luZCBvZiB0YXNrIFN0R0lUIGlzIGRlc2lnbmVkIHRvIGRvLgorCitJIGp1c3QgaGF2ZSBkb25lIGEgc2ltcGxlciBvbmUsIHRoaXMgdGltZSB1c2luZyBvbmx5IHRoZSBjb3JlCitHSVQgdG9vbHMuCisKK0kgaGFkIGEgaGFuZGZ1bCBjb21taXRzIHRoYXQgd2VyZSBhaGVhZCBvZiBtYXN0ZXIgaW4gcHUsIGFuZCBJCit3YW50ZWQgdG8gYWRkIHNvbWUgZG9jdW1lbnRhdGlvbiBieXBhc3NpbmcgbXkgdXN1YWwgaGFiaXQgb2YKK3BsYWNpbmcgbmV3IHRoaW5ncyBpbiBwdSBmaXJzdC4gIEF0IHRoZSBiZWdpbm5pbmcsIHRoZSBjb21taXQKK2FuY2VzdHJ5IGdyYXBoIGxvb2tlZCBsaWtlIHRoaXM6CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiJwdSIgaGVhZAorICAgIG1hc3RlciAtLT4gIzEgLS0+ICMyIC0tPiAjMworCitTbyBJIHN0YXJ0ZWQgZnJvbSBtYXN0ZXIsIG1hZGUgYSBidW5jaCBvZiBlZGl0cywgYW5kIGNvbW1pdHRlZDoKKworICAgICQgZ2l0IGNoZWNrb3V0IG1hc3RlcgorICAgICQgY2QgRG9jdW1lbnRhdGlvbjsgZWQgZ2l0LnR4dCAuLi4KKyAgICAkIGNkIC4uOyBnaXQgYWRkIERvY3VtZW50YXRpb24vKi50eHQKKyAgICAkIGdpdCBjb21taXQgLXMKKworQWZ0ZXIgdGhlIGNvbW1pdCwgdGhlIGFuY2VzdHJ5IGdyYXBoIHdvdWxkIGxvb2sgbGlrZSB0aGlzOgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqInB1IiBoZWFkCisgICAgbWFzdGVyXiAtLT4gIzEgLS0+ICMyIC0tPiAjMworICAgICAgICAgIFwKKyAgICAgICAgICAgIFwtLS0+IG1hc3RlcgorCitUaGUgb2xkIG1hc3RlciBpcyBub3cgbWFzdGVyXiAodGhlIGZpcnN0IHBhcmVudCBvZiB0aGUgbWFzdGVyKS4KK1RoZSBuZXcgbWFzdGVyIGNvbW1pdCBob2xkcyBteSBkb2N1bWVudGF0aW9uIHVwZGF0ZXMuCisKK05vdyBJIGhhdmUgdG8gZGVhbCB3aXRoICJwdSIgYnJhbmNoLgorCitUaGlzIGlzIHRoZSBraW5kIG9mIHNpdHVhdGlvbiBJIHVzZWQgdG8gaGF2ZSBhbGwgdGhlIHRpbWUgd2hlbgorTGludXMgd2FzIHRoZSBtYWludGFpbmVyIGFuZCBJIHdhcyBhIGNvbnRyaWJ1dG9yLCB3aGVuIHlvdSBsb29rCithdCAibWFzdGVyIiBicmFuY2ggYmVpbmcgdGhlICJtYWludGFpbmVyIiBicmFuY2gsIGFuZCAicHUiCiticmFuY2ggYmVpbmcgdGhlICJjb250cmlidXRvciIgYnJhbmNoLiAgWW91ciB3b3JrIHN0YXJ0ZWQgYXQgdGhlCit0aXAgb2YgdGhlICJtYWludGFpbmVyIiBicmFuY2ggc29tZSB0aW1lIGFnbywgeW91IG1hZGUgYSBsb3Qgb2YKK3Byb2dyZXNzIGluIHRoZSBtZWFudGltZSwgYW5kIG5vdyB0aGUgbWFpbnRhaW5lciBicmFuY2ggaGFzIHNvbWUKK290aGVyIGNvbW1pdHMgeW91IGRvIG5vdCBoYXZlIHlldC4gIEFuZCAiZ2l0IHJlYmFzZSIgd2FzIHdyaXR0ZW4KK3dpdGggdGhlIGV4cGxpY2l0IHB1cnBvc2Ugb2YgaGVscGluZyB0byBtYWludGFpbiBicmFuY2hlcyBsaWtlCisicHUiLiAgWW91IF9jb3VsZF8gbWVyZ2UgbWFzdGVyIHRvIHB1IGFuZCBrZWVwIGdvaW5nLCBidXQgaWYgeW91CitldmVudHVhbGx5IHdhbnQgdG8gY2hlcnJ5cGljayBhbmQgbWVyZ2Ugc29tZSBidXQgbm90IG5lY2Vzc2FyaWx5CithbGwgY2hhbmdlcyBiYWNrIHRvIHRoZSBtYXN0ZXIgYnJhbmNoLCBpdCBvZnRlbiBtYWtlcyBsYXRlcgorb3BlcmF0aW9ucyBmb3IgX3lvdV8gZWFzaWVyIGlmIHlvdSByZWJhc2UgKGkuZS4gY2FycnkgZm9yd2FyZAoreW91ciBjaGFuZ2VzKSAicHUiIHJhdGhlciB0aGFuIG1lcmdlLiAgU28gSSByYW4gImdpdCByZWJhc2UiOgorCisgICAgJCBnaXQgY2hlY2tvdXQgcHUKKyAgICAkIGdpdCByZWJhc2UgbWFzdGVyIHB1CisKK1doYXQgdGhpcyBkb2VzIGlzIHRvIHBpY2sgYWxsIHRoZSBjb21taXRzIHNpbmNlIHRoZSBjdXJyZW50CiticmFuY2ggKG5vdGUgdGhhdCBJIG5vdyBhbSBvbiAicHUiIGJyYW5jaCkgZm9ya2VkIGZyb20gdGhlCittYXN0ZXIgYnJhbmNoLCBhbmQgZm9yd2FyZCBwb3J0IHRoZXNlIGNoYW5nZXMuCisKKyAgICBtYXN0ZXJeIC0tPiAjMSAtLT4gIzIgLS0+ICMzCisgICAgICAgICAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqInB1IiBoZWFkCisgICAgICAgICAgICBcLS0tPiBtYXN0ZXIgLS0+ICMxJyAtLT4gIzInIC0tPiAjMycKKworVGhlIGRpZmYgYmV0d2VlbiBtYXN0ZXJeIGFuZCAjMSBpcyBhcHBsaWVkIHRvIG1hc3RlciBhbmQKK2NvbW1pdHRlZCB0byBjcmVhdGUgIzEnIGNvbW1pdCB3aXRoIHRoZSBjb21taXQgaW5mb3JtYXRpb24gKGxvZywKK2F1dGhvciBhbmQgZGF0ZSkgdGFrZW4gZnJvbSBjb21taXQgIzEuICBPbiB0b3Agb2YgdGhhdCAjMicgYW5kICMzJworY29tbWl0cyBhcmUgbWFkZSBzaW1pbGFybHkgb3V0IG9mICMyIGFuZCAjMyBjb21taXRzLgorCitPbGQgIzMgaXMgbm90IHJlY29yZGVkIGluIGFueSBvZiB0aGUgLmdpdC9yZWZzL2hlYWRzLyBmaWxlCithbnltb3JlLCBzbyBhZnRlciBkb2luZyB0aGlzIHlvdSB3aWxsIGhhdmUgZGFuZ2xpbmcgY29tbWl0IGlmCit5b3UgcmFuIGZzY2stY2FjaGUsIHdoaWNoIGlzIG5vcm1hbC4gIEFmdGVyIHRlc3RpbmcgInB1IiwgeW91CitjYW4gcnVuICJnaXQgcHJ1bmUiIHRvIGdldCByaWQgb2YgdGhvc2Ugb3JpZ2luYWwgdGhyZWUgY29tbWl0cy4KKworV2hpbGUgSSBhbSB0YWxraW5nIGFib3V0ICJnaXQgcmViYXNlIiwgSSBzaG91bGQgdGFsayBhYm91dCBob3cKK3RvIGRvIGNoZXJyeXBpY2tpbmcgdXNpbmcgb25seSB0aGUgY29yZSBHSVQgdG9vbHMuCisKK0xldCdzIGdvIGJhY2sgdG8gdGhlIGVhcmxpZXIgcGljdHVyZSwgd2l0aCBkaWZmZXJlbnQgbGFiZWxzLgorCitZb3UsIGFzIGFuIGluZGl2aWR1YWwgZGV2ZWxvcGVyLCBjbG9uZWQgdXBzdHJlYW0gcmVwb3NpdG9yeSBhbmQKK21hZGUgYSBjb3VwbGUgb2YgY29tbWl0cyBvbiB0b3Agb2YgaXQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp5b3VyICJtYXN0ZXIiIGhlYWQKKyAgIHVwc3RyZWFtIC0tPiAjMSAtLT4gIzIgLS0+ICMzCisKK1lvdSB3b3VsZCB3YW50IGNoYW5nZXMgIzIgYW5kICMzIGluY29ycG9yYXRlZCBpbiB0aGUgdXBzdHJlYW0sCit3aGlsZSB5b3UgZmVlbCB0aGF0ICMxIG1heSBuZWVkIGZ1cnRoZXIgaW1wcm92ZW1lbnRzLiAgU28geW91CitwcmVwYXJlICMyIGFuZCAjMyBmb3IgZS1tYWlsIHN1Ym1pc3Npb24uCisKKyAgICAkIGdpdCBmb3JtYXQtcGF0Y2ggbWFzdGVyXl4gbWFzdGVyCisKK1RoaXMgY3JlYXRlcyB0d28gZmlsZXMsIDAwMDEtWFhYWC5wYXRjaCBhbmQgMDAwMi1YWFhYLnBhdGNoLiAgU2VuZAordGhlbSBvdXQgIlRvOiAiIHlvdXIgcHJvamVjdCBtYWludGFpbmVyIGFuZCAiQ2M6ICIgeW91ciBtYWlsaW5nCitsaXN0LiAgWW91IGNvdWxkIHVzZSBjb250cmlidXRlZCBzY3JpcHQgZ2l0LXNlbmQtZW1haWwgaWYKK3lvdXIgaG9zdCBoYXMgbmVjZXNzYXJ5IHBlcmwgbW9kdWxlcyBmb3IgdGhpcywgYnV0IHlvdXIgdXN1YWwKK01VQSB3b3VsZCBkbyBhcyBsb25nIGFzIGl0IGRvZXMgbm90IGNvcnJ1cHQgd2hpdGVzcGFjZXMgaW4gdGhlCitwYXRjaC4KKworVGhlbiB5b3Ugd291bGQgd2FpdCwgYW5kIHlvdSBmaW5kIG91dCB0aGF0IHRoZSB1cHN0cmVhbSBwaWNrZWQKK3VwIHlvdXIgY2hhbmdlcywgYWxvbmcgd2l0aCBvdGhlciBjaGFuZ2VzLgorCisgICB3aGVyZSAgICAgICAgICAgICAgICAgICAgICAqeW91ciAibWFzdGVyIiBoZWFkCisgIHVwc3RyZWFtIC0tPiAjMSAtLT4gIzIgLS0+ICMzCisgICAgdXNlZCAgIFwKKyAgIHRvIGJlICAgICBcLS0+ICNBIC0tPiAjMicgLS0+ICMzJyAtLT4gI0IgLS0+ICNDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdXBzdHJlYW0gaGVhZAorCitUaGUgdHdvIGNvbW1pdHMgIzInIGFuZCAjMycgaW4gdGhlIGFib3ZlIHBpY3R1cmUgcmVjb3JkIHRoZSBzYW1lCitjaGFuZ2VzIHlvdXIgZS1tYWlsIHN1Ym1pc3Npb24gZm9yICMyIGFuZCAjMyBjb250YWluZWQsIGJ1dAorcHJvYmFibHkgd2l0aCB0aGUgbmV3IHNpZ24tb2ZmIGxpbmUgYWRkZWQgYnkgdGhlIHVwc3RyZWFtCittYWludGFpbmVyIGFuZCBkZWZpbml0ZWx5IHdpdGggZGlmZmVyZW50IGNvbW1pdHRlciBhbmQgYW5jZXN0cnkKK2luZm9ybWF0aW9uLCB0aGV5IGFyZSBkaWZmZXJlbnQgb2JqZWN0cyBmcm9tICMyIGFuZCAjMyBjb21taXRzLgorCitZb3UgZmV0Y2ggZnJvbSB1cHN0cmVhbSwgYnV0IG5vdCBtZXJnZS4KKworICAgICQgZ2l0IGZldGNoIHVwc3RyZWFtCisKK1RoaXMgbGVhdmVzIHRoZSB1cGRhdGVkIHVwc3RyZWFtIGhlYWQgaW4gLmdpdC9GRVRDSF9IRUFEIGJ1dAorZG9lcyBub3QgdG91Y2ggeW91ciAuZ2l0L0hFQUQgbm9yIC5naXQvcmVmcy9oZWFkcy9tYXN0ZXIuCitZb3UgcnVuICJnaXQgcmViYXNlIiBub3cuCisKKyAgICAkIGdpdCByZWJhc2UgRkVUQ0hfSEVBRCBtYXN0ZXIKKworRWFybGllciwgSSBzYWlkIHRoYXQgcmViYXNlIGFwcGxpZXMgYWxsIHRoZSBjb21taXRzIGZyb20geW91cgorYnJhbmNoIG9uIHRvcCBvZiB0aGUgdXBzdHJlYW0gaGVhZC4gIFdlbGwsIEkgbGllZC4gICJnaXQgcmViYXNlIgoraXMgYSBiaXQgc21hcnRlciB0aGFuIHRoYXQgYW5kIG5vdGljZXMgdGhhdCAjMiBhbmQgIzMgbmVlZCBub3QKK2JlIGFwcGxpZWQsIHNvIGl0IG9ubHkgYXBwbGllcyAjMS4gIFRoZSBjb21taXQgYW5jZXN0cnkgZ3JhcGgKK2JlY29tZXMgc29tZXRoaW5nIGxpa2UgdGhpczoKKworICAgd2hlcmUgICAgICAgICAgICAgICAgICAgICAqeW91ciBvbGQgIm1hc3RlciIgaGVhZAorICB1cHN0cmVhbSAtLT4gIzEgLS0+ICMyIC0tPiAjMworICAgIHVzZWQgICBcICAgICAgICAgICAgICAgICAgICAgIHlvdXIgbmV3ICJtYXN0ZXIiIGhlYWQqCisgICB0byBiZSAgICAgXC0tPiAjQSAtLT4gIzInIC0tPiAjMycgLS0+ICNCIC0tPiAjQyAtLT4gIzEnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdXBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQKKworQWdhaW4sICJnaXQgcHJ1bmUiIHdvdWxkIGRpc2NhcmQgdGhlIGRpc3VzZWQgY29tbWl0cyAjMS0jMyBhbmQKK3lvdSBjb250aW51ZSBvbiBzdGFydGluZyBmcm9tIHRoZSBuZXcgIm1hc3RlciIgaGVhZCwgd2hpY2ggaXMKK3RoZSAjMScgY29tbWl0LgorCistamMKKworLQorVG8gdW5zdWJzY3JpYmUgZnJvbSB0aGlzIGxpc3Q6IHNlbmQgdGhlIGxpbmUgInVuc3Vic2NyaWJlIGdpdCIgaW4KK3RoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnCitNb3JlIG1ham9yZG9tbyBpbmZvIGF0ICBodHRwOi8vdmdlci5rZXJuZWwub3JnL21ham9yZG9tby1pbmZvLmh0bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaG93dG8vcmVidWlsZC1mcm9tLXVwZGF0ZS1ob29rLnR4dCBiL0RvY3VtZW50YXRpb24vaG93dG8vcmVidWlsZC1mcm9tLXVwZGF0ZS1ob29rLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDU1ZGZiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ob3d0by9yZWJ1aWxkLWZyb20tdXBkYXRlLWhvb2sudHh0CkBAIC0wLDAgKzEsODYgQEAKK1N1YmplY3Q6IFtIT1dUT10gVXNpbmcgcG9zdC11cGRhdGUgaG9vaworTWVzc2FnZS1JRDogPDd2eTg2bzZ1c3guZnNmQGFzc2lnbmVkLWJ5LWRoY3AuY294Lm5ldD4KK0Zyb206IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KK0RhdGU6IEZyaSwgMjYgQXVnIDIwMDUgMTg6MTk6MTAgLTA3MDAKK0Fic3RyYWN0OiBJbiB0aGlzIGhvdy10byBhcnRpY2xlLCBKQyB0YWxrcyBhYm91dCBob3cgaGUKKyB1c2VzIHRoZSBwb3N0LXVwZGF0ZSBob29rIHRvIGF1dG9tYXRlIGdpdCBkb2N1bWVudGF0aW9uIHBhZ2UKKyBzaG93biBhdCBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy8uCisKK1RoZSBwYWdlcyB1bmRlciBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy8KK2FyZSBidWlsdCBmcm9tIERvY3VtZW50YXRpb24vIGRpcmVjdG9yeSBvZiB0aGUgZ2l0LmdpdCBwcm9qZWN0CithbmQgbmVlZGVkIHRvIGJlIGtlcHQgdXAtdG8tZGF0ZS4gIFRoZSB3d3cua2VybmVsLm9yZy8gc2VydmVycworYXJlIG1pcnJvcmVkIGFuZCBJIHdhcyB0b2xkIHRoYXQgdGhlIG9yaWdpbiBvZiB0aGUgbWlycm9yIGlzIG9uCit0aGUgbWFjaGluZSAkc29tZS5rZXJuZWwub3JnLCBvbiB3aGljaCBJIHdhcyBnaXZlbiBhbiBhY2NvdW50Cit3aGVuIEkgdG9vayBvdmVyIGdpdCBtYWludGFpbmVyc2hpcCBmcm9tIExpbnVzLgorCitUaGUgZGlyZWN0b3JpZXMgcmVsZXZhbnQgdG8gdGhpcyBob3ctdG8gYXJlIHRoZXNlIHR3bzoKKworICAgIC9wdWIvc2NtL2dpdC9naXQuZ2l0LwlUaGUgcHVibGljIGdpdCByZXBvc2l0b3J5LgorICAgIC9wdWIvc29mdHdhcmUvc2NtL2dpdC9kb2NzLwlUaGUgSFRNTCBkb2N1bWVudGF0aW9uIHBhZ2UuCisKK1NvIEkgbWFkZSBhIHJlcG9zaXRvcnkgdG8gZ2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24gdW5kZXIgbXkKK2hvbWUgZGlyZWN0b3J5IG92ZXIgdGhlcmUuCisKKyAgICAkIGNkCisgICAgJCBta2RpciBkb2MtZ2l0ICYmIGNkIGRvYy1naXQKKyAgICAkIGdpdCBjbG9uZSAvcHViL3NjbS9naXQvZ2l0LmdpdC8gZG9jZ2VuCisKK1doYXQgbmVlZHMgdG8gaGFwcGVuIGlzIHRvIHVwZGF0ZSB0aGUgJEhPTUUvZG9jLWdpdC9kb2NnZW4vCit3b3JraW5nIHRyZWUsIGJ1aWxkIEhUTUwgZG9jcyB0aGVyZSBhbmQgaW5zdGFsbCB0aGUgcmVzdWx0IGluCisvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy8gZGlyZWN0b3J5LiAgU28gSSB3cm90ZSBhIGxpdHRsZQorc2NyaXB0OgorCisgICAgJCBjYXQgPmRvZG9kb2Muc2ggPDxcRU9GCisgICAgIyEvYmluL3NoCisgICAgY2QgJEhPTUUvZG9jLWdpdC9kb2NnZW4gfHwgZXhpdAorCisgICAgdW5zZXQgR0lUX0RJUgorCisgICAgZ2l0IHB1bGwgL3B1Yi9zY20vZ2l0L2dpdC5naXQvIG1hc3RlciAmJgorICAgIGNkIERvY3VtZW50YXRpb24gJiYKKyAgICBtYWtlIGluc3RhbGwtd2ViZG9jCisgICAgRU9GCisKK0luaXRpYWxseSBJIHVzZWQgdG8gcnVuIHRoaXMgYnkgaGFuZCB3aGVuZXZlciBJIHB1c2ggaW50byB0aGUKK3B1YmxpYyBnaXQgcmVwb3NpdG9yeS4gIFRoZW4gSSBkaWQgYSBjcm9uIGpvYiB0aGF0IHJhbiB0d2ljZSBhCitkYXkuICBUaGUgY3VycmVudCByb3VuZCB1c2VzIHRoZSBwb3N0LXVwZGF0ZSBob29rIG1lY2hhbmlzbSwKK2xpa2UgdGhpczoKKworICAgICQgY2F0ID4vcHViL3NjbS9naXQvZ2l0LmdpdC9ob29rcy9wb3N0LXVwZGF0ZSA8PFxFT0YKKyAgICAjIS9iaW4vc2gKKyAgICAjCisgICAgIyBBbiBleGFtcGxlIGhvb2sgc2NyaXB0IHRvIHByZXBhcmUgYSBwYWNrZWQgcmVwb3NpdG9yeSBmb3IgdXNlIG92ZXIKKyAgICAjIGR1bWIgdHJhbnNwb3J0cy4KKyAgICAjCisgICAgIyBUbyBlbmFibGUgdGhpcyBob29rLCBtYWtlIHRoaXMgZmlsZSBleGVjdXRhYmxlIGJ5ICJjaG1vZCAreCBwb3N0LXVwZGF0ZSIuCisKKyAgICBjYXNlICIgJCogIiBpbgorICAgIConIHJlZnMvaGVhZHMvbWFzdGVyICcqKQorICAgICAgICAgICAgZWNobyAkSE9NRS9kb2MtZ2l0L2RvZG9kb2Muc2ggfCBhdCBub3cKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworICAgIGV4ZWMgZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mbworICAgIEVPRgorICAgICQgY2htb2QgK3ggL3B1Yi9zY20vZ2l0L2dpdC5naXQvaG9va3MvcG9zdC11cGRhdGUKKworVGhlcmUgYXJlIGZvdXIgdGhpbmdzIHdvcnRoIG1lbnRpb25pbmc6CisKKyAtIFRoZSB1cGRhdGUtaG9vayBpcyBydW4gYWZ0ZXIgdGhlIHJlcG9zaXRvcnkgYWNjZXB0cyBhICJnaXQKKyAgIHB1c2giLCB1bmRlciBteSB1c2VyIHByaXZpbGVnZS4gIEl0IGlzIGdpdmVuIHRoZSBmdWxsIG5hbWVzCisgICBvZiByZWZzIHRoYXQgaGF2ZSBiZWVuIHVwZGF0ZWQgYXMgYXJndW1lbnRzLiAgTXkgcG9zdC11cGRhdGUKKyAgIHJ1bnMgdGhlIGRvZG9kb2Muc2ggc2NyaXB0IG9ubHkgd2hlbiB0aGUgbWFzdGVyIGhlYWQgaXMKKyAgIHVwZGF0ZWQuCisKKyAtIFdoZW4gdXBkYXRlLWhvb2sgaXMgcnVuLCBHSVRfRElSIGlzIHNldCB0byAnLicgYnkgdGhlIGNhbGxpbmcKKyAgIHJlY2VpdmUtcGFjay4gIFRoaXMgaXMgaW5oZXJpdGVkIGJ5IHRoZSBkb2RvZG9jLnNoIHJ1biB2aWEKKyAgIHRoZSAiYXQiIGNvbW1hbmQsIGFuZCBuZWVkcyB0byBiZSB1bnNldDsgb3RoZXJ3aXNlLCAiZ2l0CisgICBwdWxsIiBpdCBkb2VzIGludG8gJEhPTUUvZG9jLWdpdC9kb2NnZW4vIHJlcG9zaXRvcnkgd291bGQgbm90CisgICB3b3JrIGNvcnJlY3RseS4KKworIC0gVGhlIHN0ZG91dCBvZiB1cGRhdGUgaG9vayBzY3JpcHQgaXMgbm90IGNvbm5lY3RlZCB0byBnaXQKKyAgIHB1c2g7IEkgcnVuIHRoZSBoZWF2eSBwYXJ0IG9mIHRoZSBjb21tYW5kIGluc2lkZSAiYXQiLCB0bworICAgcmVjZWl2ZSB0aGUgZXhlY3V0aW9uIHJlcG9ydCB2aWEgZS1tYWlsLgorCisgLSBUaGlzIGlzIHN0aWxsIGNydWRlIGFuZCBkb2VzIG5vdCBwcm90ZWN0IGFnYWluc3Qgc2ltdWx0YW5lb3VzCisgICBtYWtlIGludm9jYXRpb25zIHN0b21waW5nIG9uIGVhY2ggb3RoZXIuICBJIHdvdWxkIG5lZWQgdG8gYWRkCisgICBzb21lIGxvY2tpbmcgbWVjaGFuaXNtIGZvciB0aGlzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ob3d0by9yZWNvdmVyLWNvcnJ1cHRlZC1ibG9iLW9iamVjdC50eHQgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL3JlY292ZXItY29ycnVwdGVkLWJsb2Itb2JqZWN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjNiNTEzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ob3d0by9yZWNvdmVyLWNvcnJ1cHRlZC1ibG9iLW9iamVjdC50eHQKQEAgLTAsMCArMSwxMzQgQEAKK0RhdGU6IEZyaSwgOSBOb3YgMjAwNyAwODoyODozOCAtMDgwMCAoUFNUKQorRnJvbTogTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQGxpbnV4LWZvdW5kYXRpb24ub3JnPgorU3ViamVjdDogY29ycnVwdCBvYmplY3Qgb24gZ2l0LWdjCitBYnN0cmFjdDogU29tZSB0cmlja3MgdG8gcmVjb25zdHJ1Y3QgYmxvYiBvYmplY3RzIGluIG9yZGVyIHRvIGZpeAorIGEgY29ycnVwdGVkIHJlcG9zaXRvcnkuCisKK09uIEZyaSwgOSBOb3YgMjAwNywgWW9zc2kgTGV5Ym92aWNoIHdyb3RlOgorPgorPiBEaWQgbm90IGhlbHAgc3RpbGwgdGhlIHJlcG9zaXRvcnkgbG9vayBmb3IgdGhpcyBvYmplY3Q/Cis+IEFueSBvbmUga25vdyBob3cgY2FuIEkgdHJhY2sgdGhpcyBvYmplY3QgYW5kIHVuZGVyc3RhbmQgd2hpY2ggZmlsZSBpcyBpdAorCitTbyBleGFjdGx5ICpiZWNhdXNlKiB0aGUgU0hBMSBoYXNoIGlzIGNyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZSwgdGhlIGhhc2gKK2l0c2VsZiBkb2Vzbid0IGFjdHVhbGx5IHRlbGwgeW91IGFueXRoaW5nLCBpbiBvcmRlciB0byBmaXggYSBjb3JydXB0CitvYmplY3QgeW91IGJhc2ljYWxseSBoYXZlIHRvIGZpbmQgdGhlICJvcmlnaW5hbCBzb3VyY2UiIGZvciBpdC4KKworVGhlIGVhc2llc3Qgd2F5IHRvIGRvIHRoYXQgaXMgYWxtb3N0IGFsd2F5cyB0byBoYXZlIGJhY2t1cHMsIGFuZCBmaW5kIHRoZQorc2FtZSBvYmplY3Qgc29tZXdoZXJlIGVsc2UuIEJhY2t1cHMgcmVhbGx5IGFyZSBhIGdvb2QgaWRlYSwgYW5kIGdpdCBtYWtlcworaXQgcHJldHR5IGVhc3kgKGlmIG5vdGhpbmcgZWxzZSwganVzdCBjbG9uZSB0aGUgcmVwb3NpdG9yeSBzb21ld2hlcmUgZWxzZSwKK2FuZCBtYWtlIHN1cmUgdGhhdCB5b3UgZG8gKm5vdCogdXNlIGEgaGFyZC1saW5rZWQgY2xvbmUsIGFuZCBwcmVmZXJhYmx5Citub3QgdGhlIHNhbWUgZGlzay9tYWNoaW5lKS4KKworQnV0IHNpbmNlIHlvdSBkb24ndCBzZWVtIHRvIGhhdmUgYmFja3VwcyByaWdodCBub3csIHRoZSBnb29kIG5ld3MgaXMgdGhhdAorZXNwZWNpYWxseSB3aXRoIGEgc2luZ2xlIGJsb2IgYmVpbmcgY29ycnVwdCwgdGhlc2UgdGhpbmdzICphcmUqIHNvbWV3aGF0CitkZWJ1Z2dhYmxlLgorCitGaXJzdCBvZmYsIG1vdmUgdGhlIGNvcnJ1cHQgb2JqZWN0IGF3YXksIGFuZCAqc2F2ZSogaXQuIFRoZSBtb3N0IGNvbW1vbgorY2F1c2Ugb2YgY29ycnVwdGlvbiBzbyBmYXIgaGFzIGJlZW4gbWVtb3J5IGNvcnJ1cHRpb24sIGJ1dCBldmVuIHNvLCB0aGVyZQorYXJlIHBlb3BsZSB3aG8gd291bGQgYmUgaW50ZXJlc3RlZCBpbiBzZWVpbmcgdGhlIGNvcnJ1cHRpb24gLSBidXQgaXQncworYmFzaWNhbGx5IGltcG9zc2libGUgdG8ganVkZ2UgdGhlIGNvcnJ1cHRpb24gdW50aWwgd2UgY2FuIGFsc28gc2VlIHRoZQorb3JpZ2luYWwgb2JqZWN0LCBzbyByaWdodCBub3cgdGhlIGNvcnJ1cHQgb2JqZWN0IGlzIHVzZWxlc3MsIGJ1dCBpdCdzIHZlcnkKK2ludGVyZXN0aW5nIGZvciB0aGUgZnV0dXJlLCBpbiB0aGUgaG9wZSB0aGF0IHlvdSBjYW4gcmUtY3JlYXRlIGEKK25vbi1jb3JydXB0IHZlcnNpb24uCisKK1NvOgorCis+IGliXSQgbXYgLmdpdC9vYmplY3RzLzRiLzk0NThiMzc4NjIyODM2OWM2MzkzNmRiNjU4MjdkZTNjYzA2MjAwIC4uLworCitUaGlzIGlzIHRoZSByaWdodCB0aGluZyB0byBkbywgYWx0aG91Z2ggaXQncyB1c3VhbGx5IGJlc3QgdG8gc2F2ZSBpdCB1bmRlcgoraXQncyBmdWxsIFNIQTEgbmFtZSAoeW91IGp1c3QgZHJvcHBlZCB0aGUgIjRiIiBmcm9tIHRoZSByZXN1bHQgOykuCisKK0xldCdzIHNlZSB3aGF0IHRoYXQgdGVsbHMgdXM6CisKKz4gaWJdJCBnaXQtZnNjayAtLWZ1bGwKKz4gYnJva2VuIGxpbmsgZnJvbSAgICB0cmVlIDJkOTI2M2M2ZDIzNTk1ZTdjYjJhMjFlNWViYmI1MzY1NTI3OGRmZjgKKz4gICAgICAgICAgICAgIHRvICAgIGJsb2IgNGI5NDU4YjM3ODYyMjgzNjljNjM5MzZkYjY1ODI3ZGUzY2MwNjIwMAorPiBtaXNzaW5nIGJsb2IgNGI5NDU4YjM3ODYyMjgzNjljNjM5MzZkYjY1ODI3ZGUzY2MwNjIwMAorCitPaywgSSByZW1vdmVkIHRoZSAiZGFuZ2xpbmcgY29tbWl0IiBtZXNzYWdlcywgYmVjYXVzZSB0aGV5IGFyZSBqdXN0CittZXNzYWdlcyBhYm91dCB0aGUgZmFjdCB0aGF0IHlvdSBwcm9iYWJseSBoYXZlIHJlYmFzZWQgZXRjLCBzbyB0aGV5J3JlIG5vdAorYXQgYWxsIGludGVyZXN0aW5nLiBCdXQgd2hhdCByZW1haW5zIGlzIHN0aWxsIHZlcnkgdXNlZnVsLiBJbiBwYXJ0aWN1bGFyLAord2Ugbm93IGtub3cgd2hpY2ggdHJlZSBwb2ludHMgdG8gaXQhCisKK05vdyB5b3UgY2FuIGRvCisKKwlnaXQgbHMtdHJlZSAyZDkyNjNjNmQyMzU5NWU3Y2IyYTIxZTVlYmJiNTM2NTUyNzhkZmY4CisKK3doaWNoIHdpbGwgc2hvdyBzb21ldGhpbmcgbGlrZQorCisJMTAwNjQ0IGJsb2IgOGQxNDUzMTg0NmI5NWJmYTM1NjRiNThjY2ZiNzkxM2EwMzQzMjNiOCAgICAuZ2l0aWdub3JlCisJMTAwNjQ0IGJsb2IgZWJmOWJmODRkYTBhYWI1ZWQ5NDQyNjRhNWRiMmE2NWZlM2EzZTg4MyAgICAubWFpbG1hcAorCTEwMDY0NCBibG9iIGNhNDQyZDMxM2Q4NmRjNjdlMGEyZTVkNTg0YjQ2NWJkMzgyY2JmNWMgICAgQ09QWUlORworCTEwMDY0NCBibG9iIGVlOTA5ZjJjYzQ5ZTU0ZjA3OTlhNDczOWQyNGM0Y2I5MTUxYWU0NTMgICAgQ1JFRElUUworCTA0MDAwMCB0cmVlIDBmNWY3MDljMTdhZDg5ZTcyYmRiYmVmNmVhMjIxYzY5ODA3MDA5ZjYgICAgRG9jdW1lbnRhdGlvbgorCTEwMDY0NCBibG9iIDE1NzBkMjQ4YWQ5MjM3ZTRmYTZlNGQwNzkzMzZiOWRhNjJkOWJhMzIgICAgS2J1aWxkCisJMTAwNjQ0IGJsb2IgMWM3YzIyOWEwOTI2NjViMTFjZDQ2YTI1ZGJkNDBmZWViMzE2NjFkOSAgICBNQUlOVEFJTkVSUworCS4uLgorCithbmQgeW91IHNob3VsZCBub3cgaGF2ZSBhIGxpbmUgdGhhdCBsb29rcyBsaWtlCisKKwkxMDA2NCBibG9iIDRiOTQ1OGIzNzg2MjI4MzY5YzYzOTM2ZGI2NTgyN2RlM2NjMDYyMDAJbXktbWFnaWMtZmlsZQorCitpbiB0aGUgb3V0cHV0LiBUaGlzIGFscmVhZHkgdGVsbHMgeW91IGEgKmxvdCogaXQgdGVsbHMgeW91IHdoYXQgZmlsZSB0aGUKK2NvcnJ1cHQgYmxvYiBjYW1lIGZyb20hCisKK05vdywgaXQgZG9lc24ndCB0ZWxsIHlvdSBxdWl0ZSBlbm91Z2gsIHRob3VnaDogaXQgZG9lc24ndCB0ZWxsIHdoYXQKKyp2ZXJzaW9uKiBvZiB0aGUgZmlsZSBkaWRuJ3QgZ2V0IGNvcnJlY3RseSB3cml0dGVuISBZb3UgbWlnaHQgYmUgcmVhbGx5CitsdWNreSwgYW5kIGl0IG1heSBiZSB0aGUgdmVyc2lvbiB0aGF0IHlvdSBhbHJlYWR5IGhhdmUgY2hlY2tlZCBvdXQgaW4geW91cgord29ya2luZyB0cmVlLCBpbiB3aGljaCBjYXNlIGZpeGluZyB0aGlzIHByb2JsZW0gaXMgcmVhbGx5IHNpbXBsZSwganVzdCBkbworCisJZ2l0IGhhc2gtb2JqZWN0IC13IG15LW1hZ2ljLWZpbGUKKworYWdhaW4sIGFuZCBpZiBpdCBvdXRwdXRzIHRoZSBtaXNzaW5nIFNIQTEgKDRiOTQ1Li4pIHlvdSdyZSBub3cgYWxsIGRvbmUhCisKK0J1dCB0aGF0J3MgdGhlIHJlYWxseSBsdWNreSBjYXNlLCBzbyBsZXQncyBhc3N1bWUgdGhhdCBpdCB3YXMgc29tZSBvbGRlcgordmVyc2lvbiB0aGF0IHdhcyBicm9rZW4uIEhvdyBkbyB5b3UgdGVsbCB3aGljaCB2ZXJzaW9uIGl0IHdhcz8KKworVGhlIGVhc2llc3Qgd2F5IHRvIGRvIGl0IGlzIHRvIGRvCisKKwlnaXQgbG9nIC0tcmF3IC0tYWxsIC0tZnVsbC1oaXN0b3J5IC0tIHN1YmRpcmVjdG9yeS9teS1tYWdpYy1maWxlCisKK2FuZCB0aGF0IHdpbGwgc2hvdyB5b3UgdGhlIHdob2xlIGxvZyBmb3IgdGhhdCBmaWxlIChwbGVhc2UgcmVhbGl6ZSB0aGF0Cit0aGUgdHJlZSB5b3UgaGFkIG1heSBub3QgYmUgdGhlIHRvcC1sZXZlbCB0cmVlLCBzbyB5b3UgbmVlZCB0byBmaWd1cmUgb3V0Cit3aGljaCBzdWJkaXJlY3RvcnkgaXQgd2FzIGluIG9uIHlvdXIgb3duKSwgYW5kIGJlY2F1c2UgeW91J3JlIGFza2luZyBmb3IKK3JhdyBvdXRwdXQsIHlvdSdsbCBub3cgZ2V0IHNvbWV0aGluZyBsaWtlCisKKwljb21taXQgYWJjCisJQXV0aG9yOgorCURhdGU6CisJICAuLgorCToxMDA2NDQgMTAwNjQ0IDRiOTQ1OGIuLi4gbmV3c2hhLi4uIE0gIHNvbWVkaXJlY3RvcnkvbXktbWFnaWMtZmlsZQorCisKKwljb21taXQgeHl6CisJQXV0aG9yOgorCURhdGU6CisKKwkgIC4uCisJOjEwMDY0NCAxMDA2NDQgb2xkc2hhLi4uIDRiOTQ1OGIuLi4gTQlzb21lZGlyZWN0b3J5L215LW1hZ2ljLWZpbGUKKworYW5kIHRoaXMgYWN0dWFsbHkgdGVsbHMgeW91IHdoYXQgdGhlICpwcmV2aW91cyogYW5kICpzdWJzZXF1ZW50KiB2ZXJzaW9ucworb2YgdGhhdCBmaWxlIHdlcmUhIFNvIG5vdyB5b3UgY2FuIGxvb2sgYXQgdGhvc2UgKCJvbGRzaGEiIGFuZCAibmV3c2hhIgorcmVzcGVjdGl2ZWx5KSwgYW5kIGhvcGVmdWxseSB5b3UgaGF2ZSBkb25lIGNvbW1pdHMgb2Z0ZW4sIGFuZCBjYW4KK3JlLWNyZWF0ZSB0aGUgbWlzc2luZyBteS1tYWdpYy1maWxlIHZlcnNpb24gYnkgbG9va2luZyBhdCB0aG9zZSBvbGRlciBhbmQKK25ld2VyIHZlcnNpb25zIQorCitJZiB5b3UgY2FuIGRvIHRoYXQsIHlvdSBjYW4gbm93IHJlY3JlYXRlIHRoZSBtaXNzaW5nIG9iamVjdCB3aXRoCisKKwlnaXQgaGFzaC1vYmplY3QgLXcgPHJlY3JlYXRlZC1maWxlPgorCithbmQgeW91ciByZXBvc2l0b3J5IGlzIGdvb2QgYWdhaW4hCisKKyhCdHcsIHlvdSBjb3VsZCBoYXZlIGlnbm9yZWQgdGhlIGZzY2ssIGFuZCBzdGFydGVkIHdpdGggZG9pbmcgYQorCisJZ2l0IGxvZyAtLXJhdyAtLWFsbAorCithbmQganVzdCBsb29rZWQgZm9yIHRoZSBzaGEgb2YgdGhlIG1pc3Npbmcgb2JqZWN0ICg0Yjk0NThiLi4pIGluIHRoYXQKK3dob2xlIHRoaW5nLiBJdCdzIHVwIHRvIHlvdSAtIGdpdCBkb2VzICpoYXZlKiBhIGxvdCBvZiBpbmZvcm1hdGlvbiwgaXQgaXMKK2p1c3QgbWlzc2luZyBvbmUgcGFydGljdWxhciBibG9iIHZlcnNpb24uCisKK1RyeWluZyB0byByZWNyZWF0ZSB0cmVlcyBhbmQgZXNwZWNpYWxseSBjb21taXRzIGlzICptdWNoKiBoYXJkZXIuIFNvIHlvdQord2VyZSBsdWNreSB0aGF0IGl0J3MgYSBibG9iLiBJdCdzIHF1aXRlIHBvc3NpYmxlIHRoYXQgeW91IGNhbiByZWNyZWF0ZSB0aGUKK3RoaW5nLgorCisJCQlMaW51cwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ob3d0by9yZXZlcnQtYnJhbmNoLXJlYmFzZS50eHQgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL3JldmVydC1icmFuY2gtcmViYXNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjVhNjY2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ob3d0by9yZXZlcnQtYnJhbmNoLXJlYmFzZS50eHQKQEAgLTAsMCArMSwxOTMgQEAKK0Zyb206IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KK1RvOiBnaXRAdmdlci5rZXJuZWwub3JnCitTdWJqZWN0OiBbSE9XVE9dIFJldmVydGluZyBhbiBleGlzdGluZyBjb21taXQKK0Fic3RyYWN0OiBJbiB0aGlzIGFydGljbGUsIEpDIGdpdmVzIGEgc21hbGwgcmVhbC1saWZlIGV4YW1wbGUgb2YgdXNpbmcKKyAnZ2l0IHJldmVydCcgY29tbWFuZCwgYW5kIHVzaW5nIGEgdGVtcG9yYXJ5IGJyYW5jaCBhbmQgdGFnIGZvciBzYWZldHkKKyBhbmQgZWFzaWVyIHNhbml0eSBjaGVja2luZy4KK0RhdGU6IE1vbiwgMjkgQXVnIDIwMDUgMjE6Mzk6MDIgLTA3MDAKK0NvbnRlbnQtdHlwZTogdGV4dC9hc2NpaWRvYworTWVzc2FnZS1JRDogPDd2b2U3ZzN1b3AuZnNmQGFzc2lnbmVkLWJ5LWRoY3AuY294Lm5ldD4KKworUmV2ZXJ0aW5nIGFuIGV4aXN0aW5nIGNvbW1pdAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitPbmUgb2YgdGhlIGNoYW5nZXMgSSBwdWxsZWQgaW50byB0aGUgJ21hc3RlcicgYnJhbmNoIHR1cm5zIG91dCB0bworYnJlYWsgYnVpbGRpbmcgR0lUIHdpdGggR0NDIDIuOTUuICBXaGlsZSB0aGV5IHdlcmUgd2VsbCBpbnRlbnRpb25lZAorcG9ydGFiaWxpdHkgZml4ZXMsIGtlZXBpbmcgdGhpbmdzIHdvcmtpbmcgd2l0aCBnY2MtMi45NSB3YXMgYWxzbworaW1wb3J0YW50LiAgSGVyZSBpcyB3aGF0IEkgZGlkIHRvIHJldmVydCB0aGUgY2hhbmdlIGluIHRoZSAnbWFzdGVyJworYnJhbmNoIGFuZCB0byBhZGp1c3QgdGhlICdwdScgYnJhbmNoLCB1c2luZyBjb3JlIEdJVCB0b29scyBhbmQKK2JhcmVib25lIFBvcmNlbGFpbi4KKworRmlyc3QsIHByZXBhcmUgYSB0aHJvdy1hd2F5IGJyYW5jaCBpbiBjYXNlIEkgc2NyZXcgdGhpbmdzIHVwLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC1iIHJldmVydC1jOTkgbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm93IEkgYW0gb24gdGhlICdyZXZlcnQtYzk5JyBicmFuY2guICBMZXQncyBmaWd1cmUgb3V0IHdoaWNoIGNvbW1pdCB0bworcmV2ZXJ0LiAgSSBoYXBwZW4gdG8ga25vdyB0aGF0IHRoZSB0b3Agb2YgdGhlICdtYXN0ZXInIGJyYW5jaCBpcyBhCittZXJnZSwgYW5kIGl0cyBzZWNvbmQgcGFyZW50IChpLmUuIGZvcmVpZ24gY29tbWl0IEkgbWVyZ2VkIGZyb20pIGhhcwordGhlIGNoYW5nZSBJIHdvdWxkIHdhbnQgdG8gdW5kby4gIEZ1cnRoZXIgSSBoYXBwZW4gdG8ga25vdyB0aGF0IHRoYXQKK21lcmdlIGludHJvZHVjZWQgNSBjb21taXRzIG9yIHNvOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3ctYnJhbmNoIC0tbW9yZT00IG1hc3RlciBtYXN0ZXJeMiB8IGhlYWQKKyogW21hc3Rlcl0gTWVyZ2UgcmVmcy9oZWFkcy9wb3J0YWJsZSBmcm9tIGh0dHA6Ly93d3cuY3MuYmVya2VsZXkuLi4uCisgISBbbWFzdGVyXjJdIFJlcGxhY2UgQzk5IGFycmF5IGluaXRpYWxpemVycyB3aXRoIGNvZGUuCistLQorLSAgW21hc3Rlcl0gTWVyZ2UgcmVmcy9oZWFkcy9wb3J0YWJsZSBmcm9tIGh0dHA6Ly93d3cuY3MuYmVya2VsZXkuLi4uCisqKyBbbWFzdGVyXjJdIFJlcGxhY2UgQzk5IGFycmF5IGluaXRpYWxpemVycyB3aXRoIGNvZGUuCisqKyBbbWFzdGVyXjJ+MV0gUmVwbGFjZSB1bnNldGVudigpIGFuZCBzZXRlbnYoKSB3aXRoIG9sZGVyIHB1dGVudigpLgorKisgW21hc3Rlcl4yfjJdIEluY2x1ZGUgc3lzL3RpbWUuaCBpbiBkYWVtb24uYy4KKyorIFttYXN0ZXJeMn4zXSBGaXggPzogc3RhdGVtZW50cy4KKyorIFttYXN0ZXJeMn40XSBSZXBsYWNlIHplcm8tbGVuZ3RoIGFycmF5IGRlY2xzIHdpdGggW10uCisqICBbbWFzdGVyfjFdIHR1dG9yaWFsIG5vdGUgYWJvdXQgZ2l0IGJyYW5jaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSAnLS1tb3JlPTQnIGFib3ZlIG1lYW5zICJhZnRlciB3ZSByZWFjaCB0aGUgbWVyZ2UgYmFzZSBvZiByZWZzLAorc2hvdyB1bnRpbCB3ZSBkaXNwbGF5IGZvdXIgbW9yZSBjb21tb24gY29tbWl0cyIuICBUaGF0IGxhc3QgY29tbWl0Cit3b3VsZCBoYXZlIGJlZW4gd2hlcmUgdGhlICJwb3J0YWJsZSIgYnJhbmNoIHdhcyBmb3JrZWQgZnJvbSB0aGUgbWFpbgorZ2l0LmdpdCByZXBvc2l0b3J5LCBzbyB0aGlzIHdvdWxkIHNob3cgZXZlcnl0aGluZyBvbiBib3RoIGJyYW5jaGVzCitzaW5jZSB0aGVuLiAgSSBqdXN0IGxpbWl0ZWQgdGhlIG91dHB1dCB0byB0aGUgZmlyc3QgaGFuZGZ1bCB1c2luZworJ2hlYWQnLgorCitOb3cgSSBrbm93ICdtYXN0ZXJeMn40JyAocHJvbm91bmNlIGl0IGFzICJmaW5kIHRoZSBzZWNvbmQgcGFyZW50IG9mCit0aGUgJ21hc3RlcicsIGFuZCB0aGVuIGdvIGZvdXIgZ2VuZXJhdGlvbnMgYmFjayBmb2xsb3dpbmcgdGhlIGZpcnN0CitwYXJlbnQiKSBpcyB0aGUgb25lIEkgd291bGQgd2FudCB0byByZXZlcnQuICBTaW5jZSBJIGFsc28gd2FudCB0byBzYXkKK3doeSBJIGFtIHJldmVydGluZyBpdCwgdGhlICctbicgZmxhZyBpcyBnaXZlbiB0byAnZ2l0IHJldmVydCcuICBUaGlzCitwcmV2ZW50cyBpdCBmcm9tIGFjdHVhbGx5IG1ha2luZyBhIGNvbW1pdCwgYW5kIGluc3RlYWQgJ2dpdCByZXZlcnQnCitsZWF2ZXMgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZSBpdCB3YW50ZWQgdG8gdXNlIGluICcubXNnJyBmaWxlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHJldmVydCAtbiBtYXN0ZXJeMn40CiskIGNhdCAubXNnCitSZXZlcnQgIlJlcGxhY2UgemVyby1sZW5ndGggYXJyYXkgZGVjbHMgd2l0aCBbXS4iCisKK1RoaXMgcmV2ZXJ0cyA2YzVmOWJhYTNiYzBkNjNlMTQxZTBhZmMyMzExMDIwNTM3OTkwNWE0IGNvbW1pdC4KKyQgZ2l0IGRpZmYgSEVBRCA7IyB0byBtYWtlIHN1cmUgd2hhdCB3ZSBhcmUgcmV2ZXJ0aW5nIG1ha2VzIHNlbnNlLgorJCBtYWtlIENDPWdjYy0yLjk1IGNsZWFuIHRlc3QgOyMgbWFrZSBzdXJlIGl0IGZpeGVkIHRoZSBicmVha2FnZS4KKyQgbWFrZSBjbGVhbiB0ZXN0IDsjIG1ha2Ugc3VyZSBpdCBkaWQgbm90IGNhdXNlIG90aGVyIGJyZWFrYWdlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSByZXZlcnRlZCBjaGFuZ2UgbWFrZXMgc2Vuc2UgKGZyb20gcmVhZGluZyB0aGUgJ2RpZmYnIG91dHB1dCksIGRvZXMKK2ZpeCB0aGUgcHJvYmxlbSAoZnJvbSAnbWFrZSBDQz1nY2MtMi45NScgdGVzdCksIGFuZCBkb2VzIG5vdCBjYXVzZSBuZXcKK2JyZWFrYWdlIChmcm9tIHRoZSBsYXN0ICdtYWtlIHRlc3QnKS4gIEknbSByZWFkeSB0byBjb21taXQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY29tbWl0IC1hIC1zIDsjIHJlYWQgLm1zZyBpbnRvIHRoZSBsb2csCisgICAgICAgICAgICAgICAgICAgICMgYW5kIGV4cGxhaW4gd2h5IEkgYW0gcmV2ZXJ0aW5nLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0kgY291bGQgaGF2ZSBzY3Jld2VkIHVwIGluIGFueSBvZiB0aGUgYWJvdmUgc3RlcHMsIGJ1dCBpbiB0aGUgd29yc3QKK2Nhc2UgSSBjb3VsZCBqdXN0IGhhdmUgZG9uZSAnZ2l0IGNoZWNrb3V0IG1hc3RlcicgdG8gc3RhcnQgb3Zlci4KK0ZvcnR1bmF0ZWx5IEkgZGlkIG5vdCBoYXZlIHRvOyB3aGF0IEkgaGF2ZSBpbiB0aGUgY3VycmVudCBicmFuY2gKKydyZXZlcnQtYzk5JyBpcyB3aGF0IEkgd2FudC4gIFNvIG1lcmdlIHRoYXQgYmFjayBpbnRvICdtYXN0ZXInOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IG1hc3RlcgorJCBnaXQgbWVyZ2UgcmV2ZXJ0LWM5OSA7IyB0aGlzIHNob3VsZCBiZSBhIGZhc3QgZm9yd2FyZAorVXBkYXRpbmcgZnJvbSAxMGQ3ODFiOWNhYTRmNzE0OTVjN2IzNDk2M2JlZjEzNzIxNmY4NmE4IHRvIGUzYTY5M2MuLi4KKyBjYWNoZS5oICAgICAgICB8ICAgIDggKysrKy0tLS0KKyBjb21taXQuYyAgICAgICB8ICAgIDIgKy0KKyBscy1maWxlcy5jICAgICB8ICAgIDIgKy0KKyByZWNlaXZlLXBhY2suYyB8ICAgIDIgKy0KKyBzZXJ2ZXItaW5mby5jICB8ICAgIDIgKy0KKyA1IGZpbGVzIGNoYW5nZWQsIDggaW5zZXJ0aW9ucygrKSwgOCBkZWxldGlvbnMoLSkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGVyZSBpcyBubyBuZWVkIHRvIHJlZG8gdGhlIHRlc3QgYXQgdGhpcyBwb2ludC4gIFdlIGZhc3QgZm9yd2FyZGVkCithbmQgd2Uga25vdyAnbWFzdGVyJyBtYXRjaGVzICdyZXZlcnQtYzk5JyBleGFjdGx5LiAgSW4gZmFjdDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmIG1hc3Rlci4ucmV2ZXJ0LWM5OQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3NheXMgbm90aGluZy4KKworVGhlbiB3ZSByZWJhc2UgdGhlICdwdScgYnJhbmNoIGFzIHVzdWFsLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IHB1CiskIGdpdCB0YWcgcHUtYW5jaG9yIHB1CiskIGdpdCByZWJhc2UgbWFzdGVyCisqIEFwcGx5aW5nOiBSZWRvICJyZXZlcnQiIHVzaW5nIHRocmVlLXdheSBtZXJnZSBtYWNoaW5lcnkuCitGaXJzdCB0cnlpbmcgc2ltcGxlIG1lcmdlIHN0cmF0ZWd5IHRvIGNoZXJyeS1waWNrLgorRmluaXNoZWQgb25lIGNoZXJyeS1waWNrLgorKiBBcHBseWluZzogUmVtb3ZlIGdpdC1hcHBseS1wYXRjaC1zY3JpcHQuCitGaXJzdCB0cnlpbmcgc2ltcGxlIG1lcmdlIHN0cmF0ZWd5IHRvIGNoZXJyeS1waWNrLgorU2ltcGxlIGNoZXJyeS1waWNrIGZhaWxzOyB0cnlpbmcgQXV0b21hdGljIGNoZXJyeS1waWNrLgorUmVtb3ZpbmcgRG9jdW1lbnRhdGlvbi9naXQtYXBwbHktcGF0Y2gtc2NyaXB0LnR4dAorUmVtb3ZpbmcgZ2l0LWFwcGx5LXBhdGNoLXNjcmlwdAorRmluaXNoZWQgb25lIGNoZXJyeS1waWNrLgorKiBBcHBseWluZzogRG9jdW1lbnQgImdpdCBjaGVycnktcGljayIgYW5kICJnaXQgcmV2ZXJ0IgorRmlyc3QgdHJ5aW5nIHNpbXBsZSBtZXJnZSBzdHJhdGVneSB0byBjaGVycnktcGljay4KK0ZpbmlzaGVkIG9uZSBjaGVycnktcGljay4KKyogQXBwbHlpbmc6IG1haWxpbmZvIGFuZCBhcHBseW1ib3ggdXBkYXRlcworRmlyc3QgdHJ5aW5nIHNpbXBsZSBtZXJnZSBzdHJhdGVneSB0byBjaGVycnktcGljay4KK0ZpbmlzaGVkIG9uZSBjaGVycnktcGljay4KKyogQXBwbHlpbmc6IFNob3cgY29tbWl0cyBpbiB0b3BvIG9yZGVyIGFuZCBuYW1lIGFsbCBjb21taXRzLgorRmlyc3QgdHJ5aW5nIHNpbXBsZSBtZXJnZSBzdHJhdGVneSB0byBjaGVycnktcGljay4KK0ZpbmlzaGVkIG9uZSBjaGVycnktcGljay4KKyogQXBwbHlpbmc6IE1vcmUgZG9jdW1lbnRhdGlvbiB1cGRhdGVzLgorRmlyc3QgdHJ5aW5nIHNpbXBsZSBtZXJnZSBzdHJhdGVneSB0byBjaGVycnktcGljay4KK0ZpbmlzaGVkIG9uZSBjaGVycnktcGljay4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgdGVtcG9yYXJ5IHRhZyAncHUtYW5jaG9yJyBpcyBtZSBqdXN0IGJlaW5nIGNhcmVmdWwsIGluIGNhc2UgJ2dpdAorcmViYXNlJyBzY3Jld3MgdXAuICBBZnRlciB0aGlzLCBJIGNhbiBkbyB0aGVzZSBmb3Igc2FuaXR5IGNoZWNrOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgcHUtYW5jaG9yLi5wdSA7IyBtYWtlIHN1cmUgd2UgZ290IHRoZSBtYXN0ZXIgZml4LgorJCBtYWtlIENDPWdjYy0yLjk1IGNsZWFuIHRlc3QgOyMgbWFrZSBzdXJlIGl0IGZpeGVkIHRoZSBicmVha2FnZS4KKyQgbWFrZSBjbGVhbiB0ZXN0IDsjIG1ha2Ugc3VyZSBpdCBkaWQgbm90IGNhdXNlIG90aGVyIGJyZWFrYWdlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0V2ZXJ5dGhpbmcgaXMgaW4gdGhlIGdvb2Qgb3JkZXIuICBJIGRvIG5vdCBuZWVkIHRoZSB0ZW1wb3JhcnkgYnJhbmNoCitub3IgdGFnIGFueW1vcmUsIHNvIHJlbW92ZSB0aGVtOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgcm0gLWYgLmdpdC9yZWZzL3RhZ3MvcHUtYW5jaG9yCiskIGdpdCBicmFuY2ggLWQgcmV2ZXJ0LWM5OQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0l0IHdhcyBhbiBlbWVyZ2VuY3kgZml4LCBzbyB3ZSBtaWdodCBhcyB3ZWxsIG1lcmdlIGl0IGludG8gdGhlCisncmVsZWFzZSBjYW5kaWRhdGUnIGJyYW5jaCwgYWx0aG91Z2ggSSBleHBlY3QgdGhlIG5leHQgcmVsZWFzZSB3b3VsZAorYmUgc29tZSBkYXlzIG9mZjoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCByYworJCBnaXQgcHVsbCAuIG1hc3RlcgorUGFja2luZyAwIG9iamVjdHMKK1VucGFja2luZyAwIG9iamVjdHMKKworKiBjb21taXR0aXNoOiBlM2E2OTNjLi4uCXJlZnMvaGVhZHMvbWFzdGVyIGZyb20gLgorVHJ5aW5nIHRvIG1lcmdlIGUzYTY5M2MuLi4gaW50byA4YzFmNWYwLi4uIHVzaW5nIDEwZDc4MWIuLi4KK0NvbW1pdHRlZCBtZXJnZSA3ZmI5YjcyNjJhMWQxZTBhNDdiYmZkY2JiY2Y1MGNlMDYzNWQzZjhmCisgY2FjaGUuaCAgICAgICAgfCAgICA4ICsrKystLS0tCisgY29tbWl0LmMgICAgICAgfCAgICAyICstCisgbHMtZmlsZXMuYyAgICAgfCAgICAyICstCisgcmVjZWl2ZS1wYWNrLmMgfCAgICAyICstCisgc2VydmVyLWluZm8uYyAgfCAgICAyICstCisgNSBmaWxlcyBjaGFuZ2VkLCA4IGluc2VydGlvbnMoKyksIDggZGVsZXRpb25zKC0pCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQW5kIHRoZSBmaW5hbCByZXBvc2l0b3J5IHN0YXR1cyBsb29rcyBsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdy1icmFuY2ggLS1tb3JlPTEgbWFzdGVyIHB1IHJjCishIFttYXN0ZXJdIFJldmVydCAiUmVwbGFjZSB6ZXJvLWxlbmd0aCBhcnJheSBkZWNscyB3aXRoIFtdLiIKKyAhIFtwdV0gZ2l0LXJlcGFjazogQWRkIG9wdGlvbiB0byByZXBhY2sgYWxsIG9iamVjdHMuCisgICogW3JjXSBNZXJnZSByZWZzL2hlYWRzL21hc3RlciBmcm9tIC4KKy0tLQorICsgIFtwdV0gZ2l0LXJlcGFjazogQWRkIG9wdGlvbiB0byByZXBhY2sgYWxsIG9iamVjdHMuCisgKyAgW3B1fjFdIE1vcmUgZG9jdW1lbnRhdGlvbiB1cGRhdGVzLgorICsgIFtwdX4yXSBTaG93IGNvbW1pdHMgaW4gdG9wbyBvcmRlciBhbmQgbmFtZSBhbGwgY29tbWl0cy4KKyArICBbcHV+M10gbWFpbGluZm8gYW5kIGFwcGx5bWJveCB1cGRhdGVzCisgKyAgW3B1fjRdIERvY3VtZW50ICJnaXQgY2hlcnJ5LXBpY2siIGFuZCAiZ2l0IHJldmVydCIKKyArICBbcHV+NV0gUmVtb3ZlIGdpdC1hcHBseS1wYXRjaC1zY3JpcHQuCisgKyAgW3B1fjZdIFJlZG8gInJldmVydCIgdXNpbmcgdGhyZWUtd2F5IG1lcmdlIG1hY2hpbmVyeS4KKyAgLSBbcmNdIE1lcmdlIHJlZnMvaGVhZHMvbWFzdGVyIGZyb20gLgorKysqIFttYXN0ZXJdIFJldmVydCAiUmVwbGFjZSB6ZXJvLWxlbmd0aCBhcnJheSBkZWNscyB3aXRoIFtdLiIKKyAgLSBbcmN+MV0gTWVyZ2UgcmVmcy9oZWFkcy9tYXN0ZXIgZnJvbSAuCisuLi4gW21hc3Rlcn4xXSBNZXJnZSByZWZzL2hlYWRzL3BvcnRhYmxlIGZyb20gaHR0cDovL3d3dy5jcy5iZXJrZWxleS4uLi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ob3d0by9zZXBhcmF0aW5nLXRvcGljLWJyYW5jaGVzLnR4dCBiL0RvY3VtZW50YXRpb24vaG93dG8vc2VwYXJhdGluZy10b3BpYy1icmFuY2hlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ3M2IzMQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaG93dG8vc2VwYXJhdGluZy10b3BpYy1icmFuY2hlcy50eHQKQEAgLTAsMCArMSw5MCBAQAorRnJvbTogSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorU3ViamVjdDogU2VwYXJhdGluZyB0b3BpYyBicmFuY2hlcworQWJzdHJhY3Q6IEluIHRoaXMgYXJ0aWNsZSwgSkMgZGVzY3JpYmVzIGhvdyB0byBzZXBhcmF0ZSB0b3BpYyBicmFuY2hlcy4KKworVGhpcyB0ZXh0IHdhcyBvcmlnaW5hbGx5IGEgZm9vdG5vdGUgdG8gYSBkaXNjdXNzaW9uIGFib3V0IHRoZQorYmVoYXZpb3VyIG9mIHRoZSBnaXQgZGlmZiBjb21tYW5kcy4KKworT2Z0ZW4gSSBmaW5kIG15c2VsZiBkb2luZyB0aGF0IFtydW5uaW5nIGRpZmYgYWdhaW5zdCBzb21ldGhpbmcgb3RoZXIKK3RoYW4gSEVBRF0gd2hpbGUgcmV3cml0aW5nIG1lc3N5IGRldmVsb3BtZW50IGhpc3RvcnkuICBGb3IgZXhhbXBsZSwgSQorc3RhcnQgZG9pbmcgc29tZSB3b3JrIHdpdGhvdXQga25vd2luZyBleGFjdGx5IHdoZXJlIGl0IGxlYWRzLCBhbmQgZW5kCit1cCB3aXRoIGEgaGlzdG9yeSBsaWtlIHRoaXM6CisKKyAgICAgICAgICAgICJtYXN0ZXIiCisgICAgICAgIG8tLS1vCisgICAgICAgICAgICAgXCAgICAgICAgICAgICAgICAgICAgInRvcGljIgorICAgICAgICAgICAgICBvLS0tby0tLW8tLS1vLS0tby0tLW8KKworQXQgdGhpcyBwb2ludCwgInRvcGljIiBjb250YWlucyBzb21ldGhpbmcgSSBrbm93IEkgd2FudCwgYnV0IGl0Citjb250YWlucyB0d28gY29uY2VwdHMgdGhhdCB0dXJuZWQgb3V0IHRvIGJlIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQuCitBbmQgb2Z0ZW4sIG9uZSB0b3BpYyBjb21wb25lbnQgaXMgbGFyZ2VyIHRoYW4gdGhlIG90aGVyLiAgSXQgbWF5Citjb250YWluIG1vcmUgdGhhbiB0d28gdG9waWNzLgorCitJbiBvcmRlciB0byByZXdyaXRlIHRoaXMgbWVzcyB0byBiZSBtb3JlIG1hbmFnZWFibGUsIEkgd291bGQgZmlyc3QgZG8KKyJkaWZmIG1hc3Rlci4udG9waWMiLCB0byBleHRyYWN0IHRoZSBjaGFuZ2VzIGludG8gYSBzaW5nbGUgcGF0Y2gsIHN0YXJ0CitwaWNraW5nIHBpZWNlcyBmcm9tIGl0IHRvIGdldCBsb2dpY2FsbHkgc2VsZi1jb250YWluZWQgdW5pdHMsIGFuZAorc3RhcnQgYnVpbGRpbmcgb24gdG9wIG9mICJtYXN0ZXIiOgorCisgICAgICAgICQgZ2l0IGRpZmYgbWFzdGVyLi50b3BpYyA+UC5kaWZmCisgICAgICAgICQgZ2l0IGNoZWNrb3V0IC1iIHRvcGljQSBtYXN0ZXIKKyAgICAgICAgLi4uIHBpY2sgYW5kIGFwcGx5IHBpZWNlcyBmcm9tIFAuZGlmZiB0byBidWlsZAorICAgICAgICAuLi4gY29tbWl0cyBvbiB0b3BpY0EgYnJhbmNoLgorCisgICAgICAgICAgICAgIG8tLS1vLS0tbworICAgICAgICAgICAgIC8gICAgICAgICJ0b3BpY0EiCisgICAgICAgIG8tLS1vIm1hc3RlciIKKyAgICAgICAgICAgICBcICAgICAgICAgICAgICAgICAgICAidG9waWMiCisgICAgICAgICAgICAgIG8tLS1vLS0tby0tLW8tLS1vLS0tbworCitCZWZvcmUgZG9pbmcgZWFjaCBjb21taXQgb24gInRvcGljQSIgSEVBRCwgSSBydW4gImRpZmYgSEVBRCIKK2JlZm9yZSB1cGRhdGUtaW5kZXggdGhlIGFmZmVjdGVkIHBhdGhzLCBvciAiZGlmZiAtLWNhY2hlZCBIRUFEIgorYWZ0ZXIuICBBbHNvIEkgd291bGQgcnVuICJkaWZmIC0tY2FjaGVkIG1hc3RlciIgdG8gbWFrZSBzdXJlCit0aGF0IHRoZSBjaGFuZ2VzIGFyZSBvbmx5IHRoZSBvbmVzIHJlbGF0ZWQgdG8gInRvcGljQSIuICBVc3VhbGx5CitJIGRvIHRoaXMgZm9yIHNtYWxsZXIgdG9waWNzIGZpcnN0LgorCitBZnRlciB0aGF0LCBJJ2QgZG8gdGhlIHJlbWFpbmRlciBvZiB0aGUgb3JpZ2luYWwgInRvcGljIiwgYnV0Citmb3IgdGhhdCwgSSBkbyBub3Qgc3RhcnQgZnJvbSB0aGUgcGF0Y2hmaWxlIEkgZXh0cmFjdGVkIGJ5Citjb21wYXJpbmcgIm1hc3RlciIgYW5kICJ0b3BpYyIgSSB1c2VkIGluaXRpYWxseS4gIFN0aWxsIG9uCisidG9waWNBIiwgSSBleHRyYWN0ICJkaWZmIHRvcGljIiwgYW5kIHVzZSBpdCB0byByZWJ1aWxkIHRoZQorb3RoZXIgdG9waWM6CisKKyAgICAgICAgJCBnaXQgZGlmZiAtUiB0b3BpYyA+UC5kaWZmIDsjIC0tY2FjaGVkIGFsc28gd291bGQgd29yayBmaW5lCisgICAgICAgICQgZ2l0IGNoZWNrb3V0IC1iIHRvcGljQiBtYXN0ZXIKKyAgICAgICAgLi4uIHBpY2sgYW5kIGFwcGx5IHBpZWNlcyBmcm9tIFAuZGlmZiB0byBidWlsZAorICAgICAgICAuLi4gY29tbWl0cyBvbiB0b3BpY0IgYnJhbmNoLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3BpY0IiCisgICAgICAgICAgICAgICBvLS0tby0tLW8tLS1vLS0tbworICAgICAgICAgICAgICAvCisgICAgICAgICAgICAgL28tLS1vLS0tbworICAgICAgICAgICAgfC8gICAgICAgICJ0b3BpY0EiCisgICAgICAgIG8tLS1vIm1hc3RlciIKKyAgICAgICAgICAgICBcICAgICAgICAgICAgICAgICAgICAidG9waWMiCisgICAgICAgICAgICAgIG8tLS1vLS0tby0tLW8tLS1vLS0tbworCitBZnRlciBJIGFtIGRvbmUsIEknZCB0cnkgYSBwcmV0ZW5kLW1lcmdlIGJldHdlZW4gInRvcGljQSIgYW5kCisidG9waWNCIiBpbiBvcmRlciB0byBtYWtlIHN1cmUgSSBoYXZlIG5vdCBtaXNzZWQgYW55dGhpbmc6CisKKyAgICAgICAgJCBnaXQgcHVsbCAuIHRvcGljQSA7IyBtZXJnZSBpdCBpbnRvIGN1cnJlbnQgInRvcGljQiIKKyAgICAgICAgJCBnaXQgZGlmZiB0b3BpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9waWNCIgorICAgICAgICAgICAgICAgby0tLW8tLS1vLS0tby0tLW8tLS0qIChwcmV0ZW5kIG1lcmdlKQorICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICAgIC8KKyAgICAgICAgICAgICAvby0tLW8tLS1vLS0tLS0tLS0tLScKKyAgICAgICAgICAgIHwvICAgICAgICAidG9waWNBIgorICAgICAgICBvLS0tbyJtYXN0ZXIiCisgICAgICAgICAgICAgXCAgICAgICAgICAgICAgICAgICAgInRvcGljIgorICAgICAgICAgICAgICBvLS0tby0tLW8tLS1vLS0tby0tLW8KKworVGhlIGxhc3QgZGlmZiBiZXR0ZXIgbm90IHRvIHNob3cgYW55dGhpbmcgb3RoZXIgdGhhbiBjbGVhbnVwcworZm9yIGNydWZ0cy4gIFRoZW4gSSBjYW4gZmluYWxseSBjbGVhbiB0aGluZ3MgdXA6CisKKyAgICAgICAgJCBnaXQgYnJhbmNoIC1EIHRvcGljCisgICAgICAgICQgZ2l0IHJlc2V0IC0taGFyZCBIRUFEXiA7IyBudWtlIHByZXRlbmQgbWVyZ2UKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9waWNCIgorICAgICAgICAgICAgICAgby0tLW8tLS1vLS0tby0tLW8KKyAgICAgICAgICAgICAgLworICAgICAgICAgICAgIC9vLS0tby0tLW8KKyAgICAgICAgICAgIHwvICAgICAgICAidG9waWNBIgorICAgICAgICBvLS0tbyJtYXN0ZXIiCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hvd3RvL3NldHVwLWdpdC1zZXJ2ZXItb3Zlci1odHRwLnR4dCBiL0RvY3VtZW50YXRpb24vaG93dG8vc2V0dXAtZ2l0LXNlcnZlci1vdmVyLWh0dHAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYWRjMjAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL3NldHVwLWdpdC1zZXJ2ZXItb3Zlci1odHRwLnR4dApAQCAtMCwwICsxLDI1NiBAQAorRnJvbTogUnV0Z2VyIE5pamx1bnNpbmcgPHJ1dGdlckBub3NwYW0uY29tPgorU3ViamVjdDogU2V0dGluZyB1cCBhIGdpdCByZXBvc2l0b3J5IHdoaWNoIGNhbiBiZSBwdXNoZWQgaW50byBhbmQgcHVsbGVkIGZyb20gb3ZlciBIVFRQLgorRGF0ZTogVGh1LCAxMCBBdWcgMjAwNiAyMjowMDoyNiArMDIwMAorCitTaW5jZSBBcGFjaGUgaXMgb25lIG9mIHRob3NlIHBhY2thZ2VzIHBlb3BsZSBsaWtlIHRvIGNvbXBpbGUKK3RoZW1zZWx2ZXMgd2hpbGUgb3RoZXJzIHByZWZlciB0aGUgYnVyZWF1Y3JhdCdzIGRyZWFtIERlYmlhbiwgaXQgaXMKK2ltcG9zc2libGUgdG8gZ2l2ZSBndWlkZWxpbmVzIHdoaWNoIHdpbGwgd29yayBmb3IgZXZlcnlvbmUuIEp1c3Qgc2VuZAorc29tZSBmZWVkYmFjayB0byB0aGUgbWFpbGluZyBsaXN0IGF0IGdpdEB2Z2VyLmtlcm5lbC5vcmcgdG8gZ2V0IHRoaXMKK2RvY3VtZW50IHRhaWxvcmVkIHRvIHlvdXIgZmF2b3JpdGUgZGlzdHJvLgorCisKK1doYXQncyBuZWVkZWQ6CisKKy0gSGF2ZSBhbiBBcGFjaGUgd2ViLXNlcnZlcgorCisgIE9uIERlYmlhbjoKKyAgICAkIGFwdC1nZXQgaW5zdGFsbCBhcGFjaGUyCisgICAgVG8gZ2V0IGFwYWNoZTIgYnkgZGVmYXVsdCBzdGFydGVkLAorICAgIGVkaXQgL2V0Yy9kZWZhdWx0L2FwYWNoZTIgYW5kIHNldCBOT19TVEFSVD0wCisKKy0gY2FuIGVkaXQgdGhlIGNvbmZpZ3VyYXRpb24gb2YgaXQuCisKKyAgVGhpcyBjb3VsZCBiZSBmb3VuZCB1bmRlciAvZXRjL2h0dHBkLCBvciByZWZlciB0byB5b3VyIEFwYWNoZSBkb2N1bWVudGF0aW9uLgorCisgIE9uIERlYmlhbjogdGhpcyBtZWFucyBiZWluZyBhYmxlIHRvIGVkaXQgZmlsZXMgdW5kZXIgL2V0Yy9hcGFjaGUyCisKKy0gY2FuIHJlc3RhcnQgaXQuCisKKyAgJ2FwYWNoZWN0bCAtLWdyYWNlZnVsJyBtaWdodCBkby4gSWYgaXQgZG9lc24ndCwganVzdCBzdG9wIGFuZAorICByZXN0YXJ0IGFwYWNoZS4gQmUgd2FybmluZyB0aGF0IGFjdGl2ZSBjb25uZWN0aW9ucyB0byB5b3VyIHNlcnZlcgorICBtaWdodCBiZSBhYm9ydGVkIGJ5IHRoaXMuCisKKyAgT24gRGViaWFuOgorICAgICQgL2V0Yy9pbml0LmQvYXBhY2hlMiByZXN0YXJ0CisgIG9yCisgICAgJCAvZXRjL2luaXQuZC9hcGFjaGUyIGZvcmNlLXJlbG9hZAorICAgICh3aGljaCBzZWVtcyB0byBkbyB0aGUgc2FtZSkKKyAgVGhpcyBhZGRzIHN5bWxpbmtzIGZyb20gdGhlIC9ldGMvYXBhY2hlMi9tb2RzLWVuYWJsZWQgdG8KKyAgL2V0Yy9hcGFjaGUyL21vZHMtYXZhaWxhYmxlLgorCistIGhhdmUgcGVybWlzc2lvbnMgdG8gY2hvd24gYSBkaXJlY3RvcnkKKworLSBoYXZlIGdpdCBpbnN0YWxsZWQgYXQgdGhlIHNlcnZlciBfYW5kXyBjbGllbnQKKworSW4gZWZmZWN0LCB0aGlzIHByb2JhYmx5IG1lYW5zIHlvdSdyZSBnb2luZyB0byBiZSByb290LgorCisKK1N0ZXAgMTogc2V0dXAgYSBiYXJlIEdJVCByZXBvc2l0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBdCB0aGUgdGltZSBvZiB3cml0aW5nLCBnaXQtaHR0cC1wdXNoIGNhbm5vdCByZW1vdGVseSBjcmVhdGUgYSBHSVQKK3JlcG9zaXRvcnkuIFNvIHdlIGhhdmUgdG8gZG8gdGhhdCBhdCB0aGUgc2VydmVyIHNpZGUgd2l0aCBnaXQuIEFub3RoZXIKK29wdGlvbiB3b3VsZCBiZSB0byBnZW5lcmF0ZSBhbiBlbXB0eSByZXBvc2l0b3J5IGF0IHRoZSBjbGllbnQgYW5kIGNvcHkKK2l0IHRvIHRoZSBzZXJ2ZXIgd2l0aCBXZWJEQVYuIEJ1dCB0aGVuIHlvdSdyZSBwcm9iYWJseSB0aGUgZmlyc3QgdG8KK3RyeSB0aGF0IG91dCA6KQorCitDcmVhdGUgdGhlIGRpcmVjdG9yeSB1bmRlciB0aGUgRG9jdW1lbnRSb290IG9mIHRoZSBkaXJlY3RvcmllcyBzZXJ2ZWQKK2J5IEFwYWNoZS4gQXMgYW4gZXhhbXBsZSB3ZSB0YWtlIC91c3IvbG9jYWwvYXBhY2hlMiwgYnV0IHRyeSAiZ3JlcAorRG9jdW1lbnRSb290IC93aGVyZS9ldmVyL2h0dHBkLmNvbmYiIHRvIGZpbmQgeW91ciByb290OgorCisgICAgJCBjZCAvdXNyL2xvY2FsL2FwYWNoZS9odGRvY3MKKyAgICAkIG1rZGlyIG15LW5ldy1yZXBvLmdpdAorCisgIE9uIERlYmlhbjoKKworICAgICQgY2QgL3Zhci93d3cKKyAgICAkIG1rZGlyIG15LW5ldy1yZXBvLmdpdAorCisKK0luaXRpYWxpemUgYSBiYXJlIHJlcG9zaXRvcnkKKworICAgICQgY2QgbXktbmV3LXJlcG8uZ2l0CisgICAgJCBnaXQgLS1iYXJlIGluaXQKKworCitDaGFuZ2UgdGhlIG93bmVyc2hpcCB0byB5b3VyIHdlYi1zZXJ2ZXIncyBjcmVkZW50aWFscy4gVXNlICJncmVwIF5Vc2VyCitodHRwZC5jb25mIiBhbmQgImdyZXAgXkdyb3VwIGh0dHBkLmNvbmYiIHRvIGZpbmQgb3V0OgorCisgICAgJCBjaG93biAtUiB3d3cud3d3IC4KKworICBPbiBEZWJpYW46CisKKyAgICAkIGNob3duIC1SIHd3dy1kYXRhLnd3dy1kYXRhIC4KKworCitJZiB5b3UgZG8gbm90IGtub3cgd2hpY2ggdXNlciBBcGFjaGUgcnVucyBhcywgeW91IGNhbiBhbHRlcm5hdGl2ZWx5IGRvCithICJjaG1vZCAtUiBhK3cgLiIsIGluc3BlY3QgdGhlIGZpbGVzIHdoaWNoIGFyZSBjcmVhdGVkIGxhdGVyIG9uLCBhbmQKK3NldCB0aGUgcGVybWlzc2lvbnMgYXBwcm9wcmlhdGVseS4KKworUmVzdGFydCBhcGFjaGUyLCBhbmQgY2hlY2sgd2hldGhlciBodHRwOi8vc2VydmVyL215LW5ldy1yZXBvLmdpdCBnaXZlcworYSBkaXJlY3RvcnkgbGlzdGluZy4gSWYgbm90LCBjaGVjayB3aGV0aGVyIGFwYWNoZSBzdGFydGVkIHVwCitzdWNjZXNzZnVsbHkuCisKKworU3RlcCAyOiBlbmFibGUgREFWIG9uIHRoaXMgcmVwb3NpdG9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGaXJzdCBtYWtlIHN1cmUgdGhlIGRhdl9tb2R1bGUgaXMgbG9hZGVkLiBGb3IgdGhpcywgaW5zZXJ0IGluIGh0dHBkLmNvbmY6CisKKyAgICBMb2FkTW9kdWxlIGRhdl9tb2R1bGUgbGliZXhlYy9odHRwZC9saWJkYXYuc28KKyAgICBBZGRNb2R1bGUgbW9kX2Rhdi5jCisKK0Fsc28gbWFrZSBzdXJlIHRoYXQgdGhpcyBsaW5lIGV4aXN0cyB3aGljaCBpcyB0aGUgZmlsZSB1c2VkIGZvcgorbG9ja2luZyBEQVYgb3BlcmF0aW9uczoKKworICBEQVZMb2NrREIgIi91c3IvbG9jYWwvYXBhY2hlMi90ZW1wL0RBVi5sb2NrIgorCisgIE9uIERlYmlhbiB0aGVzZSBzdGVwcyBjYW4gYmUgcGVyZm9ybWVkIHdpdGg6CisKKyAgICBFbmFibGUgdGhlIGRhdiBhbmQgZGF2X2ZzIG1vZHVsZXMgb2YgYXBhY2hlOgorICAgICQgYTJlbm1vZCBkYXZfZnMKKyAgICAoanVzdCB0byBiZSBzdXJlLiBkYXZfZnMgbWlnaHQgYmUgdW5uZWVkZWQsIEkgZG9uJ3Qga25vdykKKyAgICAkIGEyZW5tb2QgZGF2CisgICAgVGhlIERBViBsb2NrIGlzIGxvY2F0ZWQgaW4gL2V0Yy9hcGFjaGUyL21vZHMtYXZhaWxhYmxlL2Rhdl9mcy5jb25mOgorICAgICAgREFWTG9ja0RCIC92YXIvbG9jay9hcGFjaGUyL0RBVkxvY2sKKworT2YgY291cnNlLCBpdCBjYW4gcG9pbnQgc29tZXdoZXJlIGVsc2UsIGJ1dCB0aGUgc3RyaW5nIGlzIGFjdHVhbGx5IGp1c3QgYQorcHJlZml4IGluIHNvbWUgQXBhY2hlIGNvbmZpZ3VyYXRpb25zLCBhbmQgdGhlcmVmb3JlIHRoZSBfZGlyZWN0b3J5XyBoYXMgdG8KK2JlIHdyaXRhYmxlIGJ5IHRoZSB1c2VyIEFwYWNoZSBydW5zIGFzLgorCitUaGVuLCBhZGQgc29tZXRoaW5nIGxpa2UgdGhpcyB0byB5b3VyIGh0dHBkLmNvbmYKKworICA8TG9jYXRpb24gL215LW5ldy1yZXBvLmdpdD4KKyAgICAgREFWIG9uCisgICAgIEF1dGhUeXBlIEJhc2ljCisgICAgIEF1dGhOYW1lICJHaXQiCisgICAgIEF1dGhVc2VyRmlsZSAvdXNyL2xvY2FsL2FwYWNoZTIvY29uZi9wYXNzd2QuZ2l0CisgICAgIFJlcXVpcmUgdmFsaWQtdXNlcgorICA8L0xvY2F0aW9uPgorCisgIE9uIERlYmlhbjoKKyAgICBDcmVhdGUgKG9yIGFkZCB0bykgL2V0Yy9hcGFjaGUyL2NvbmYuZC9naXQuY29uZiA6CisKKyAgICA8TG9jYXRpb24gL215LW5ldy1yZXBvLmdpdD4KKyAgICAgICBEQVYgb24KKyAgICAgICBBdXRoVHlwZSBCYXNpYworICAgICAgIEF1dGhOYW1lICJHaXQiCisgICAgICAgQXV0aFVzZXJGaWxlIC9ldGMvYXBhY2hlMi9wYXNzd2QuZ2l0CisgICAgICAgUmVxdWlyZSB2YWxpZC11c2VyCisgICAgPC9Mb2NhdGlvbj4KKworICAgIERlYmlhbiBhdXRvbWF0aWNhbGx5IHJlYWRzIGFsbCBmaWxlcyB1bmRlciAvZXRjL2FwYWNoMi9jb25mLmQuCisKK1RoZSBwYXNzd29yZCBmaWxlIGNhbiBiZSBzb21ld2hlcmUgZWxzZSwgYnV0IGl0IGhhcyB0byBiZSByZWFkYWJsZSBieQorQXBhY2hlIGFuZCBwcmVmZXJhYmx5IG5vdCByZWFkYWJsZSBieSB0aGUgd29ybGQuCisKK0NyZWF0ZSB0aGlzIGZpbGUgYnkKKyAgICAkIGh0cGFzc3dkIC1jIC91c3IvbG9jYWwvYXBhY2hlMi9jb25mL3Bhc3N3ZC5naXQgPHVzZXI+CisKKyAgICBPbiBEZWJpYW46CisgICAgICAkIGh0cGFzc3dkIC1jIC9ldGMvYXBhY2hlMi9wYXNzd2QuZ2l0IDx1c2VyPgorCitZb3Ugd2lsbCBiZSBhc2tlZCBhIHBhc3N3b3JkLCBhbmQgdGhlIGZpbGUgaXMgY3JlYXRlZC4gU3Vic2VxdWVudCBjYWxscwordG8gaHRwYXNzd2Qgc2hvdWxkIG9taXQgdGhlICctYycgb3B0aW9uLCBzaW5jZSB5b3Ugd2FudCB0byBhcHBlbmQgdG8gdGhlCitleGlzdGluZyBmaWxlLgorCitZb3UgbmVlZCB0byByZXN0YXJ0IEFwYWNoZS4KKworTm93IGdvIHRvIGh0dHA6Ly88dXNlcm5hbWU+QDxzZXJ2ZXJuYW1lPi9teS1uZXctcmVwby5naXQgaW4geW91cgorYnJvd3NlciB0byBjaGVjayB3aGV0aGVyIGl0IGFza3MgZm9yIGEgcGFzc3dvcmQgYW5kIGFjY2VwdHMgdGhlIHJpZ2h0CitwYXNzd29yZC4KKworT24gRGViaWFuOgorCisgICBUbyB0ZXN0IHRoZSBXZWJEQVYgcGFydCwgZG86CisKKyAgICQgYXB0LWdldCBpbnN0YWxsIGxpdG11cworICAgJCBsaXRtdXMgaHR0cDovLzxzZXJ2ZXJuYW1lPi9teS1uZXctcmVwby5naXQgPHVzZXJuYW1lPiA8cGFzc3dvcmQ+CisKKyAgIE1vc3QgdGVzdHMgc2hvdWxkIHBhc3MuCisKK0EgY29tbWFuZCBsaW5lIHRvb2wgdG8gdGVzdCBXZWJEQVYgaXMgY2FkYXZlci4KKworSWYgeW91J3JlIGludG8gV2luZG93cywgZnJvbSBYUCBvbndhcmRzIEludGVybmV0IEV4cGxvcmVyIHN1cHBvcnRzCitXZWJEQVYuIEZvciB0aGlzLCBkbyBJbnRlcm5ldCBFeHBsb3JlciAtPiBPcGVuIExvY2F0aW9uIC0+CitodHRwOi8vPHNlcnZlcm5hbWU+L215LW5ldy1yZXBvLmdpdCBbeF0gT3BlbiBhcyB3ZWJmb2xkZXIgLT4gbG9naW4gLgorCisKK1N0ZXAgMzogc2V0dXAgdGhlIGNsaWVudAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIEhUVFAgc3VwcG9ydCwgaS5lLiB5b3VyIGdpdCB3YXMgYnVpbHQgd2l0aCBjdXJsLgorVGhlIGVhc2llc3Qgd2F5IHRvIGNoZWNrIGlzIHRvIGxvb2sgZm9yIHRoZSBleGVjdXRhYmxlICdnaXQtaHR0cC1wdXNoJy4KKworVGhlbiwgYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciAkSE9NRS8ubmV0cmMgKHlvdSBjYW4gZG8gd2l0aG91dCwgYnV0IHdpbGwgYmUKK2Fza2VkIHRvIGlucHV0IHlvdXIgcGFzc3dvcmQgYSBfbG90XyBvZiB0aW1lcyk6CisKKyAgICBtYWNoaW5lIDxzZXJ2ZXJuYW1lPgorICAgIGxvZ2luIDx1c2VybmFtZT4KKyAgICBwYXNzd29yZCA8cGFzc3dvcmQ+CisKKy4uLmFuZCBzZXQgcGVybWlzc2lvbnM6CisgICAgIGNobW9kIDYwMCB+Ly5uZXRyYworCitJZiB5b3Ugd2FudCB0byBhY2Nlc3MgdGhlIHdlYi1zZXJ2ZXIgYnkgaXRzIElQLCB5b3UgaGF2ZSB0byB0eXBlIHRoYXQgaW4sCitpbnN0ZWFkIG9mIHRoZSBzZXJ2ZXIgbmFtZS4KKworVG8gY2hlY2sgd2hldGhlciBhbGwgaXMgT0ssIGRvOgorCisgICBjdXJsIC0tbmV0cmMgLS1sb2NhdGlvbiAtdiBodHRwOi8vPHVzZXJuYW1lPkA8c2VydmVybmFtZT4vbXktbmV3LXJlcG8uZ2l0LworCisuLi50aGlzIHNob3VsZCBnaXZlIGEgZGlyZWN0b3J5IGxpc3RpbmcgaW4gSFRNTCBvZiAvdmFyL3d3dy9teS1uZXctcmVwby5naXQgLgorCisKK05vdywgYWRkIHRoZSByZW1vdGUgaW4geW91ciBleGlzdGluZyByZXBvc2l0b3J5IHdoaWNoIGNvbnRhaW5zIHRoZSBwcm9qZWN0Cit5b3Ugd2FudCB0byBleHBvcnQ6CisKKyAgICQgZ2l0LWNvbmZpZyByZW1vdGUudXBsb2FkLnVybCBcCisgICAgICAgaHR0cDovLzx1c2VybmFtZT5APHNlcnZlcm5hbWU+L215LW5ldy1yZXBvLmdpdC8KKworSXQgaXMgaW1wb3J0YW50IHRvIHB1dCB0aGUgbGFzdCAnLyc7IFdpdGhvdXQgaXQsIHRoZSBzZXJ2ZXIgd2lsbCBzZW5kCithIHJlZGlyZWN0IHdoaWNoIGdpdC1odHRwLXB1c2ggZG9lcyBub3QgKHlldCkgdW5kZXJzdGFuZCwgYW5kIGdpdC1odHRwLXB1c2gKK3dpbGwgcmVwZWF0IHRoZSByZXF1ZXN0IGluZmluaXRlbHkuCisKKworU3RlcCA0OiBtYWtlIHRoZSBpbml0aWFsIHB1c2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Zyb20geW91ciBjbGllbnQgcmVwb3NpdG9yeSwgZG8KKworICAgJCBnaXQgcHVzaCB1cGxvYWQgbWFzdGVyCisKK1RoaXMgcHVzaGVzIGJyYW5jaCAnbWFzdGVyJyAod2hpY2ggaXMgYXNzdW1lZCB0byBiZSB0aGUgYnJhbmNoIHlvdQord2FudCB0byBleHBvcnQpIHRvIHJlcG9zaXRvcnkgY2FsbGVkICd1cGxvYWQnLCB3aGljaCB3ZSBwcmV2aW91c2x5CitkZWZpbmVkIHdpdGggZ2l0LWNvbmZpZy4KKworCitUcm91Ymxlc2hvb3Rpbmc6CistLS0tLS0tLS0tLS0tLS0tCisKK0lmIGdpdC1odHRwLXB1c2ggc2F5cworCisgICBFcnJvcjogbm8gREFWIGxvY2tpbmcgc3VwcG9ydCBvbiByZW1vdGUgcmVwbyBodHRwOi8vLi4uCisKK3RoZW4gaXQgbWVhbnMgdGhlIHdlYi1zZXJ2ZXIgZGlkIG5vdCBhY2NlcHQgeW91ciBhdXRoZW50aWNhdGlvbi4gTWFrZSBzdXJlCit0aGF0IHRoZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIG1hdGNoZXMgaW4gaHR0cGQuY29uZiwgLm5ldHJjIGFuZCB0aGUgVVJMCit5b3UgYXJlIHVwbG9hZGluZyB0by4KKworSWYgZ2l0LWh0dHAtcHVzaCBzaG93cyB5b3UgYW4gZXJyb3IgKDIyLzUwMikgd2hlbiB0cnlpbmcgdG8gTU9WRSBhIGJsb2IsCitpdCBtZWFucyB0aGF0IHlvdXIgd2ViLXNlcnZlciBzb21laG93IGRvZXMgbm90IHJlY29nbml6ZSBpdHMgbmFtZSBpbiB0aGUKK3JlcXVlc3Q7IFRoaXMgY2FuIGhhcHBlbiB3aGVuIHlvdSBzdGFydCBBcGFjaGUsIGJ1dCB0aGVuIGRpc2FibGUgdGhlCituZXR3b3JrIGludGVyZmFjZS4gQSBzaW1wbGUgcmVzdGFydCBvZiBBcGFjaGUgaGVscHMuCisKK0Vycm9ycyBsaWtlICgyMi81MDIpIGFyZSBvZiBmb3JtYXQgKGN1cmwgZXJyb3IgY29kZS9odHRwIGVycm9yCitjb2RlKS4gU28gKDIyLzQwNCkgbWVhbnMgc29tZXRoaW5nIGxpa2UgJ25vdCBmb3VuZCcgYXQgdGhlIHNlcnZlci4KKworUmVhZGluZyAvdXNyL2xvY2FsL2FwYWNoZTIvbG9ncy9lcnJvcl9sb2cgaXMgb2Z0ZW4gaGVscGZ1bC4KKworICBPbiBEZWJpYW46IFJlYWQgL3Zhci9sb2cvYXBhY2hlMi9lcnJvci5sb2cgaW5zdGVhZC4KKworCitEZWJpYW4gUmVmZXJlbmNlczogaHR0cDovL3d3dy5kZWJpYW4tYWRtaW5pc3RyYXRpb24ub3JnL2FydGljbGVzLzI4NQorCitBdXRob3JzCisgIEpvaGFubmVzIFNjaGluZGVsaW4gPEpvaGFubmVzLlNjaGluZGVsaW5AZ214LmRlPgorICBSdXRnZXIgTmlqbHVuc2luZyA8Z2l0QHdpbmdkaW5nLmRlbW9uLm5sPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ob3d0by91cGRhdGUtaG9vay1leGFtcGxlLnR4dCBiL0RvY3VtZW50YXRpb24vaG93dG8vdXBkYXRlLWhvb2stZXhhbXBsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3NjViNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaG93dG8vdXBkYXRlLWhvb2stZXhhbXBsZS50eHQKQEAgLTAsMCArMSwxNzIgQEAKK0Zyb206IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4gYW5kIENhcmwgQmFsZHdpbiA8Y25iQGZjLmhwLmNvbT4KK1N1YmplY3Q6IGNvbnRyb2wgYWNjZXNzIHRvIGJyYW5jaGVzLgorRGF0ZTogVGh1LCAxNyBOb3YgMjAwNSAyMzo1NTozMiAtMDgwMAorTWVzc2FnZS1JRDogPDd2ZnlwdW1sdTMuZnNmQGFzc2lnbmVkLWJ5LWRoY3AuY294Lm5ldD4KK0Fic3RyYWN0OiBBbiBleGFtcGxlIGhvb2tzL3VwZGF0ZSBzY3JpcHQgaXMgcHJlc2VudGVkIHRvCisgaW1wbGVtZW50IHJlcG9zaXRvcnkgbWFpbnRlbmFuY2UgcG9saWNpZXMsIHN1Y2ggYXMgd2hvIGNhbiBwdXNoCisgaW50byB3aGljaCBicmFuY2ggYW5kIHdobyBjYW4gbWFrZSBhIHRhZy4KKworV2hlbiB5b3VyIGRldmVsb3BlciBydW5zIGdpdC1wdXNoIGludG8gdGhlIHJlcG9zaXRvcnksCitnaXQtcmVjZWl2ZS1wYWNrIGlzIHJ1biAoZWl0aGVyIGxvY2FsbHkgb3Igb3ZlciBzc2gpIGFzIHRoYXQKK2RldmVsb3Blciwgc28gaXMgaG9va3MvdXBkYXRlIHNjcmlwdC4gIFF1b3RpbmcgZnJvbSB0aGUgcmVsZXZhbnQKK3NlY3Rpb24gb2YgdGhlIGRvY3VtZW50YXRpb246CisKKyAgICBCZWZvcmUgZWFjaCByZWYgaXMgdXBkYXRlZCwgaWYgJEdJVF9ESVIvaG9va3MvdXBkYXRlIGZpbGUgZXhpc3RzCisgICAgYW5kIGV4ZWN1dGFibGUsIGl0IGlzIGNhbGxlZCB3aXRoIHRocmVlIHBhcmFtZXRlcnM6CisKKyAgICAgICAgICAgJEdJVF9ESVIvaG9va3MvdXBkYXRlIHJlZm5hbWUgc2hhMS1vbGQgc2hhMS1uZXcKKworICAgIFRoZSByZWZuYW1lIHBhcmFtZXRlciBpcyByZWxhdGl2ZSB0byAkR0lUX0RJUjsgZS5nLiBmb3IgdGhlCisgICAgbWFzdGVyIGhlYWQgdGhpcyBpcyAicmVmcy9oZWFkcy9tYXN0ZXIiLiAgVHdvIHNoYTEgYXJlIHRoZQorICAgIG9iamVjdCBuYW1lcyBmb3IgdGhlIHJlZm5hbWUgYmVmb3JlIGFuZCBhZnRlciB0aGUgdXBkYXRlLiAgTm90ZQorICAgIHRoYXQgdGhlIGhvb2sgaXMgY2FsbGVkIGJlZm9yZSB0aGUgcmVmbmFtZSBpcyB1cGRhdGVkLCBzbyBlaXRoZXIKKyAgICBzaGExLW9sZCBpcyAwezQwfSAobWVhbmluZyB0aGVyZSBpcyBubyBzdWNoIHJlZiB5ZXQpLCBvciBpdAorICAgIHNob3VsZCBtYXRjaCB3aGF0IGlzIHJlY29yZGVkIGluIHJlZm5hbWUuCisKK1NvIGlmIHlvdXIgcG9saWN5IGlzICgxKSBhbHdheXMgcmVxdWlyZSBmYXN0LWZvcndhcmQgcHVzaAorKGkuZS4gbmV2ZXIgYWxsb3cgImdpdC1wdXNoIHJlcG8gK2JyYW5jaDpicmFuY2giKSwgKDIpIHlvdQoraGF2ZSBhIGxpc3Qgb2YgdXNlcnMgYWxsb3dlZCB0byB1cGRhdGUgZWFjaCBicmFuY2gsIGFuZCAoMykgeW91CitkbyBub3QgbGV0IHRhZ3MgdG8gYmUgb3ZlcndyaXR0ZW4sIHRoZW4geW91IGNhbiB1c2Ugc29tZXRoaW5nCitsaWtlIHRoaXMgYXMgeW91ciBob29rcy91cGRhdGUgc2NyaXB0LgorCitbamM6IGVkaXRvcmlhbCBub3RlLiAgVGhpcyBpcyBhIG11Y2ggaW1wcm92ZWQgdmVyc2lvbiBieSBDYXJsCitzaW5jZSBJIHBvc3RlZCB0aGUgb3JpZ2luYWwgb3V0bGluZV0KKworLS0gPjggLS0gYmVnaW5uaW5nIG9mIHNjcmlwdCAtLSA+OCAtLQorCisjIS9iaW4vYmFzaAorCit1bWFzayAwMDIKKworIyBJZiB5b3UgYXJlIGhhdmluZyB0cm91YmxlIHdpdGggdGhpcyBhY2Nlc3MgY29udHJvbCBob29rIHNjcmlwdAorIyB5b3UgY2FuIHRyeSBzZXR0aW5nIHRoaXMgdG8gdHJ1ZS4gIEl0IHdpbGwgdGVsbCB5b3UgZXhhY3RseQorIyB3aHkgYSB1c2VyIGlzIGJlaW5nIGFsbG93ZWQvZGVuaWVkIGFjY2Vzcy4KKwordmVyYm9zZT1mYWxzZQorCisjIERlZmF1bHQgc2hlbGwgZ2xvYmJpbmcgbWVzc2VzIHRoaW5ncyB1cCBkb3duc3RyZWFtCitHTE9CSUdOT1JFPSoKKworZnVuY3Rpb24gZ3JhbnQgeworICAkdmVyYm9zZSAmJiBlY2hvID4mMiAiLUdyYW50LQkJJDEiCisgIGVjaG8gZ3JhbnQKKyAgZXhpdCAwCit9CisKK2Z1bmN0aW9uIGRlbnkgeworICAkdmVyYm9zZSAmJiBlY2hvID4mMiAiLURlbnktCQkkMSIKKyAgZWNobyBkZW55CisgIGV4aXQgMQorfQorCitmdW5jdGlvbiBpbmZvIHsKKyAgJHZlcmJvc2UgJiYgZWNobyA+JjIgIi1JbmZvLQkJJDEiCit9CisKKyMgSW1wbGVtZW50IGdlbmVyaWMgYnJhbmNoIGFuZCB0YWcgcG9saWNpZXMuCisjIC0gVGFncyBzaG91bGQgbm90IGJlIHVwZGF0ZWQgb25jZSBjcmVhdGVkLgorIyAtIEJyYW5jaGVzIHNob3VsZCBvbmx5IGJlIGZhc3QtZm9yd2FyZGVkLgorY2FzZSAiJDEiIGluCisgIHJlZnMvdGFncy8qKQorICAgIFsgLWYgIiRHSVRfRElSLyQxIiBdICYmCisgICAgZGVueSA+L2Rldi9udWxsICJZb3UgY2FuJ3Qgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIHRhZyIKKyAgICA7OworICByZWZzL2hlYWRzLyopCisgICAgIyBObyByZWJhc2luZyBvciByZXdpbmRpbmcKKyAgICBpZiBleHByICIkMiIgOiAnMCokJyA+L2Rldi9udWxsOyB0aGVuCisgICAgICBpbmZvICJUaGUgYnJhbmNoICckMScgaXMgbmV3Li4uIgorICAgIGVsc2UKKyAgICAgICMgdXBkYXRpbmcgLS0gbWFrZSBzdXJlIGl0IGlzIGEgZmFzdCBmb3J3YXJkCisgICAgICBtYj0kKGdpdC1tZXJnZS1iYXNlICIkMiIgIiQzIikKKyAgICAgIGNhc2UgIiRtYiwkMiIgaW4KKyAgICAgICAgIiQyLCRtYiIpIGluZm8gIlVwZGF0ZSBpcyBmYXN0LWZvcndhcmQiIDs7CisgICAgICAgICopICAgICAgICBkZW55ID4vZGV2L251bGwgICJUaGlzIGlzIG5vdCBhIGZhc3QtZm9yd2FyZCB1cGRhdGUuIiA7OworICAgICAgZXNhYworICAgIGZpCisgICAgOzsKKyAgKikKKyAgICBkZW55ID4vZGV2L251bGwgXAorICAgICJCcmFuY2ggaXMgbm90IHVuZGVyIHJlZnMvaGVhZHMgb3IgcmVmcy90YWdzLiAgV2hhdCBhcmUgeW91IHRyeWluZyB0byBkbz8iCisgICAgOzsKK2VzYWMKKworIyBJbXBsZW1lbnQgcGVyLWJyYW5jaCBjb250cm9scyBiYXNlZCBvbiB1c2VybmFtZQorYWxsb3dlZF91c2Vyc19maWxlPSRHSVRfRElSL2luZm8vYWxsb3dlZC11c2VycwordXNlcm5hbWU9JChpZCAtdSAtbikKK2luZm8gIlRoZSB1c2VyIGlzOiAnJHVzZXJuYW1lJyIKKworaWYgWyAtZiAiJGFsbG93ZWRfdXNlcnNfZmlsZSIgXTsgdGhlbgorICByYz0kKGNhdCAkYWxsb3dlZF91c2Vyc19maWxlIHwgZ3JlcCAtdiAnXiMnIHwgZ3JlcCAtdiAnXiQnIHwKKyAgICB3aGlsZSByZWFkIGhlYWRfcGF0dGVybiB1c2VyX3BhdHRlcm5zOyBkbworICAgICAgbWF0Y2hsZW49JChleHByICIkMSIgOiAiJGhlYWRfcGF0dGVybiIpCisgICAgICBpZiBbICIkbWF0Y2hsZW4iID09ICIkeyMxfSIgXTsgdGhlbgorICAgICAgICBpbmZvICJGb3VuZCBtYXRjaGluZyBoZWFkIHBhdHRlcm46ICckaGVhZF9wYXR0ZXJuJyIKKyAgICAgICAgZm9yIHVzZXJfcGF0dGVybiBpbiAkdXNlcl9wYXR0ZXJuczsgZG8KKyAgICAgICAgICBpbmZvICJDaGVja2luZyB1c2VyOiAnJHVzZXJuYW1lJyBhZ2FpbnN0IHBhdHRlcm46ICckdXNlcl9wYXR0ZXJuJyIKKyAgICAgICAgICBtYXRjaGxlbj0kKGV4cHIgIiR1c2VybmFtZSIgOiAiJHVzZXJfcGF0dGVybiIpCisgICAgICAgICAgaWYgWyAiJG1hdGNobGVuIiA9PSAiJHsjdXNlcm5hbWV9IiBdOyB0aGVuCisgICAgICAgICAgICBncmFudCAiQWxsb3dpbmcgdXNlcjogJyR1c2VybmFtZScgd2l0aCBwYXR0ZXJuOiAnJHVzZXJfcGF0dGVybiciCisgICAgICAgICAgZmkKKyAgICAgICAgZG9uZQorICAgICAgICBkZW55ICJUaGUgdXNlciBpcyBub3QgaW4gdGhlIGFjY2VzcyBsaXN0IGZvciB0aGlzIGJyYW5jaCIKKyAgICAgIGZpCisgICAgZG9uZQorICApCisgIGNhc2UgIiRyYyIgaW4KKyAgICBncmFudCkgZ3JhbnQgPi9kZXYvbnVsbCAiR3JhbnRpbmcgYWNjZXNzIGJhc2VkIG9uICRhbGxvd2VkX3VzZXJzX2ZpbGUiIDs7CisgICAgZGVueSkgIGRlbnkgID4vZGV2L251bGwgIkRlbnlpbmcgIGFjY2VzcyBiYXNlZCBvbiAkYWxsb3dlZF91c2Vyc19maWxlIiA7OworICAgICopIDs7CisgIGVzYWMKK2ZpCisKK2FsbG93ZWRfZ3JvdXBzX2ZpbGU9JEdJVF9ESVIvaW5mby9hbGxvd2VkLWdyb3VwcworZ3JvdXBzPSQoaWQgLUcgLW4pCitpbmZvICJUaGUgdXNlciBiZWxvbmdzIHRvIHRoZSBmb2xsb3dpbmcgZ3JvdXBzOiIKK2luZm8gIickZ3JvdXBzJyIKKworaWYgWyAtZiAiJGFsbG93ZWRfZ3JvdXBzX2ZpbGUiIF07IHRoZW4KKyAgcmM9JChjYXQgJGFsbG93ZWRfZ3JvdXBzX2ZpbGUgfCBncmVwIC12ICdeIycgfCBncmVwIC12ICdeJCcgfAorICAgIHdoaWxlIHJlYWQgaGVhZF9wYXR0ZXJuIGdyb3VwX3BhdHRlcm5zOyBkbworICAgICAgbWF0Y2hsZW49JChleHByICIkMSIgOiAiJGhlYWRfcGF0dGVybiIpCisgICAgICBpZiBbICIkbWF0Y2hsZW4iID09ICIkeyMxfSIgXTsgdGhlbgorICAgICAgICBpbmZvICJGb3VuZCBtYXRjaGluZyBoZWFkIHBhdHRlcm46ICckaGVhZF9wYXR0ZXJuJyIKKyAgICAgICAgZm9yIGdyb3VwX3BhdHRlcm4gaW4gJGdyb3VwX3BhdHRlcm5zOyBkbworICAgICAgICAgIGZvciBncm91cG5hbWUgaW4gJGdyb3VwczsgZG8KKyAgICAgICAgICAgIGluZm8gIkNoZWNraW5nIGdyb3VwOiAnJGdyb3VwbmFtZScgYWdhaW5zdCBwYXR0ZXJuOiAnJGdyb3VwX3BhdHRlcm4nIgorICAgICAgICAgICAgbWF0Y2hsZW49JChleHByICIkZ3JvdXBuYW1lIiA6ICIkZ3JvdXBfcGF0dGVybiIpCisgICAgICAgICAgICBpZiBbICIkbWF0Y2hsZW4iID09ICIkeyNncm91cG5hbWV9IiBdOyB0aGVuCisgICAgICAgICAgICAgIGdyYW50ICJBbGxvd2luZyBncm91cDogJyRncm91cG5hbWUnIHdpdGggcGF0dGVybjogJyRncm91cF9wYXR0ZXJuJyIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZG9uZQorICAgICAgICBkb25lCisgICAgICAgIGRlbnkgIk5vbmUgb2YgdGhlIHVzZXIncyBncm91cHMgYXJlIGluIHRoZSBhY2Nlc3MgbGlzdCBmb3IgdGhpcyBicmFuY2giCisgICAgICBmaQorICAgIGRvbmUKKyAgKQorICBjYXNlICIkcmMiIGluCisgICAgZ3JhbnQpIGdyYW50ID4vZGV2L251bGwgIkdyYW50aW5nIGFjY2VzcyBiYXNlZCBvbiAkYWxsb3dlZF9ncm91cHNfZmlsZSIgOzsKKyAgICBkZW55KSAgZGVueSAgPi9kZXYvbnVsbCAiRGVueWluZyAgYWNjZXNzIGJhc2VkIG9uICRhbGxvd2VkX2dyb3Vwc19maWxlIiA7OworICAgICopIDs7CisgIGVzYWMKK2ZpCisKK2RlbnkgPi9kZXYvbnVsbCAiVGhlcmUgYXJlIG5vIG1vcmUgcnVsZXMgdG8gY2hlY2suICBEZW55aW5nIGFjY2VzcyIKKworLS0gPjggLS0gZW5kIG9mIHNjcmlwdCAtLSA+OCAtLQorCitUaGlzIHVzZXMgdHdvIGZpbGVzLCAkR0lUX0RJUi9pbmZvL2FsbG93ZWQtdXNlcnMgYW5kCithbGxvd2VkLWdyb3VwcywgdG8gZGVzY3JpYmUgd2hpY2ggaGVhZHMgY2FuIGJlIHB1c2hlZCBpbnRvIGJ5Cit3aG9tLiAgVGhlIGZvcm1hdCBvZiBlYWNoIGZpbGUgd291bGQgbG9vayBsaWtlIHRoaXM6CisKKyAgICAgICAgcmVmcy9oZWFkcy9tYXN0ZXIJanVuaW8KKyAgICAgICAgcmVmcy9oZWFkcy9jb2dpdG8kCXBhc2t5CisgICAgICAgIHJlZnMvaGVhZHMvYncvLioJbGludXMKKyAgICAgICAgcmVmcy9oZWFkcy90bXAvLioJLioKKyAgICAgICAgcmVmcy90YWdzL3ZbMC05XS4qCWp1bmlvCisKK1dpdGggdGhpcywgTGludXMgY2FuIHB1c2ggb3IgY3JlYXRlICJidy9wZW5ndWluIiBvciAiYncvemVicmEiCitvciAiYncvcGFuZGEiIGJyYW5jaGVzLCBQYXNreSBjYW4gZG8gb25seSAiY29naXRvIiwgYW5kIEpDIGNhbgorZG8gbWFzdGVyIGJyYW5jaCBhbmQgbWFrZSB2ZXJzaW9uZWQgdGFncy4gIEFuZCBhbnlib2R5IGNhbiBkbwordG1wL2JsYWggYnJhbmNoZXMuCisKKy0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ob3d0by91c2UtZ2l0LWRhZW1vbi50eHQgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL3VzZS1naXQtZGFlbW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTJmNzVjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ob3d0by91c2UtZ2l0LWRhZW1vbi50eHQKQEAgLTAsMCArMSw1MSBAQAorSG93IHRvIHVzZSBnaXQtZGFlbW9uCisKK0dpdCBjYW4gYmUgcnVuIGluIGluZXRkIG1vZGUgYW5kIGluIHN0YW5kIGFsb25lIG1vZGUuIEJ1dCBhbGwgeW91IHdhbnQgaXMKK2xldCBhIGNvd29ya2VyIHB1bGwgZnJvbSB5b3UsIGFuZCB0aGVyZWZvcmUgbmVlZCB0byBzZXQgdXAgYSBnaXQgc2VydmVyCityZWFsIHF1aWNrLCByaWdodD8KKworTm90ZSB0aGF0IGdpdC1kYWVtb24gaXMgbm90IHJlYWxseSBjaGF0dHkgYXQgdGhlIG1vbWVudCwgZXNwZWNpYWxseSB3aGVuCit0aGluZ3MgZG8gbm90IGdvIGFjY29yZGluZyB0byBwbGFuIChlLmcuIGEgc29ja2V0IGNvdWxkIG5vdCBiZSBib3VuZCkuCisKK0Fub3RoZXIgd29yZCBvZiB3YXJuaW5nOiBpZiB5b3UgcnVuCisKKwkkIGdpdCBscy1yZW1vdGUgZ2l0Oi8vMTI3LjAuMC4xL3J1bGUtdGhlLXdvcmxkLmdpdAorCithbmQgeW91IHNlZSBhIG1lc3NhZ2UgbGlrZQorCisJZmF0YWw6IFRoZSByZW1vdGUgZW5kIGh1bmcgdXAgdW5leHBlY3RlZGx5CisKK2l0IG9ubHkgbWVhbnMgdGhhdCBfc29tZXRoaW5nXyB3ZW50IHdyb25nLiBUbyBmaW5kIG91dCBfd2hhdF8gd2VudCB3cm9uZywKK3lvdSBoYXZlIHRvIGFzayB0aGUgc2VydmVyLiAoR2l0IHJlZnVzZXMgdG8gYmUgbW9yZSBwcmVjaXNlIGZvciB5b3VyCitzZWN1cml0eSBvbmx5LiBUYWtlIG9mZiB5b3VyIHNob2VzIG5vdy4gWW91IGhhdmUgYW55IGNvaW5zIGluIHlvdXIgcG9ja2V0cz8KK1NvcnJ5LCBub3QgYWxsb3dlZCAtLSB3aG8ga25vd3Mgd2hhdCB5b3UgcGxhbm5lZCB0byBkbyB3aXRoIHRoZW0/KQorCitXaXRoIHRoZXNlIHR3byBjYXZlYXRzLCBsZXQncyBzZWUgYW4gZXhhbXBsZToKKworCSQgZ2l0IGRhZW1vbiAtLXJldXNlYWRkciAtLXZlcmJvc2UgLS1iYXNlLXBhdGg9L2hvbWUvZ2l0dGUvZ2l0IFwKKwkgIC0tZXhwb3J0LWFsbCAtLSAvaG9tZS9naXR0ZS9naXQvcnVsZS10aGUtd29ybGQuZ2l0CisKKyhPZiBjb3Vyc2UsIHVubGVzcyB5b3VyIHVzZXIgbmFtZSBpcyBgZ2l0dGVgIF9hbmRfIHlvdXIgcmVwb3NpdG9yeSBpcyBpbgorfi9ydWxlLXRoZS13b3JsZC5naXQsIHlvdSBoYXZlIHRvIGFkanVzdCB0aGUgcGF0aHMuIElmIHlvdXIgcmVwb3NpdG9yeSBpcworbm90IGJhcmUsIGJlIGF3YXJlIHRoYXQgeW91IGhhdmUgdG8gdHlwZSB0aGUgcGF0aCB0byB0aGUgLmdpdCBkaXJlY3RvcnkhKQorCitUaGlzIGludm9jYXRpb24gdHJpZXMgdG8gcmV1c2UgdGhlIGFkZHJlc3MgaWYgaXQgaXMgYWxyZWFkeSB0YWtlbgorKHRoaXMgY2FuIHNhdmUgeW91IHNvbWUgZGVidWdnaW5nLCBiZWNhdXNlIG90aGVyd2lzZSBraWxsaW5nIGFuZCByZXN0YXJ0aW5nCitnaXQtZGFlbW9uIGNvdWxkIGp1c3Qgc2lsZW50bHkgZmFpbCB0byBiaW5kIHRvIGEgc29ja2V0KS4KKworQWxzbywgaXQgaXMgKHJlbGF0aXZlbHkpIHZlcmJvc2Ugd2hlbiBzb21lYm9keSBhY3R1YWxseSBjb25uZWN0cyB0byBpdC4KK0l0IGFsc28gc2V0cyB0aGUgYmFzZSBwYXRoLCB3aGljaCBtZWFucyB0aGF0IGFsbCB0aGUgcHJvamVjdHMgd2hpY2ggY2FuIGJlCithY2Nlc3NlZCB1c2luZyB0aGlzIGRhZW1vbiBoYXZlIHRvIHJlc2lkZSBpbiBvciB1bmRlciB0aGF0IHBhdGguCisKK1RoZSBvcHRpb24gYC0tZXhwb3J0LWFsbGAganVzdCBtZWFucyB0aGF0IHlvdSBfZG9uJ3RfIGhhdmUgdG8gY3JlYXRlIGEKK2ZpbGUgbmFtZWQgYGdpdC1kYWVtb24tZXhwb3J0LW9rYCBpbiBlYWNoIGV4cG9ydGVkIHJlcG9zaXRvcnkuIChPdGhlcndpc2UsCitnaXQtZGFlbW9uIHdvdWxkIGNvbXBsYWluIGxvdWRseSwgYW5kIHJlZnVzZSB0byBjb29wZXJhdGUuKQorCitMYXN0IG9mIGFsbCwgdGhlIHJlcG9zaXRvcnkgd2hpY2ggc2hvdWxkIGJlIGV4cG9ydGVkIGlzIHNwZWNpZmllZC4gSXQgaXMKK2EgZ29vZCBwcmFjdGljZSB0byBwdXQgdGhlIHBhdGhzIGFmdGVyIGEgIi0tIiBzZXBhcmF0b3IuCisKK05vdywgdGVzdCB5b3VyIGRhZW1vbiB3aXRoCisKKwkkIGdpdCBscy1yZW1vdGUgZ2l0Oi8vMTI3LjAuMC4xL3J1bGUtdGhlLXdvcmxkLmdpdAorCitJZiB0aGlzIGRvZXMgbm90IHdvcmssIGZpbmQgb3V0IHdoeSwgYW5kIHN1Ym1pdCBhIHBhdGNoIHRvIHRoaXMgZG9jdW1lbnQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hvd3RvL3VzaW5nLW1lcmdlLXN1YnRyZWUudHh0IGIvRG9jdW1lbnRhdGlvbi9ob3d0by91c2luZy1tZXJnZS1zdWJ0cmVlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTUzYTUwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ob3d0by91c2luZy1tZXJnZS1zdWJ0cmVlLnR4dApAQCAtMCwwICsxLDc1IEBACitEYXRlOiBTYXQsIDUgSmFuIDIwMDggMjA6MTc6NDAgLTA1MDAKK0Zyb206IFNlYW4gPHNlYW5sa21sQHN5bXBhdGljby5jYT4KK1RvOiBNaWtsb3MgVmFqbmEgPHZtaWtsb3NAZnJ1Z2Fsd2FyZS5vcmc+CitDYzogZ2l0QHZnZXIua2VybmVsLm9yZworU3ViamVjdDogaG93IHRvIHVzZSBnaXQgbWVyZ2UgLXMgc3VidHJlZT8KK0Fic3RyYWN0OiBJbiB0aGlzIGFydGljbGUsIFNlYW4gZGVtb25zdHJhdGVzIGhvdyBvbmUgY2FuIHVzZSB0aGUgc3VidHJlZSBtZXJnZQorIHN0cmF0ZWd5LgorQ29udGVudC10eXBlOiB0ZXh0L2FzY2lpZG9jCitNZXNzYWdlLUlEOiA8QkFZQzEtUEFTTVRQMTIzNzRCNTRCQTM3MEExRTFDNkU3OEFFNEUwQENFWi5JQ0U+CisKK0hvdyB0byB1c2UgdGhlIHN1YnRyZWUgbWVyZ2Ugc3RyYXRlZ3kKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlcmUgYXJlIHNpdHVhdGlvbnMgd2hlcmUgeW91IHdhbnQgdG8gaW5jbHVkZSBjb250ZW50cyBpbiB5b3VyIHByb2plY3QKK2Zyb20gYW4gaW5kZXBlbmRlbnRseSBkZXZlbG9wZWQgcHJvamVjdC4gWW91IGNhbiBqdXN0IHB1bGwgZnJvbSB0aGUKK290aGVyIHByb2plY3QgYXMgbG9uZyBhcyB0aGVyZSBhcmUgbm8gY29uZmxpY3RpbmcgcGF0aHMuCisKK1RoZSBwcm9ibGVtYXRpYyBjYXNlIGlzIHdoZW4gdGhlcmUgYXJlIGNvbmZsaWN0aW5nIGZpbGVzLiBQb3RlbnRpYWwKK2NhbmRpZGF0ZXMgYXJlIE1ha2VmaWxlcyBhbmQgb3RoZXIgc3RhbmRhcmQgZmlsZW5hbWVzLiBZb3UgY291bGQgbWVyZ2UKK3RoZXNlIGZpbGVzIGJ1dCBwcm9iYWJseSB5b3UgZG8gbm90IHdhbnQgdG8uICBBIGJldHRlciBzb2x1dGlvbiBmb3IgdGhpcworcHJvYmxlbSBjYW4gYmUgdG8gbWVyZ2UgdGhlIHByb2plY3QgYXMgaXRzIG93biBzdWJkaXJlY3RvcnkuIFRoaXMgaXMgbm90CitzdXBwb3J0ZWQgYnkgdGhlICdyZWN1cnNpdmUnIG1lcmdlIHN0cmF0ZWd5LCBzbyBqdXN0IHB1bGxpbmcgd29uJ3Qgd29yay4KKworV2hhdCB5b3Ugd2FudCBpcyB0aGUgJ3N1YnRyZWUnIG1lcmdlIHN0cmF0ZWd5LCB3aGljaCBoZWxwcyB5b3UgaW4gc3VjaCBhCitzaXR1YXRpb24uCisKK0luIHRoaXMgZXhhbXBsZSwgbGV0J3Mgc2F5IHlvdSBoYXZlIHRoZSByZXBvc2l0b3J5IGF0IGAvcGF0aC90by9CYCAoYnV0CitpdCBjYW4gYmUgYW4gVVJMIGFzIHdlbGwsIGlmIHlvdSB3YW50KS4gWW91IHdhbnQgdG8gbWVyZ2UgdGhlICdtYXN0ZXInCiticmFuY2ggb2YgdGhhdCByZXBvc2l0b3J5IHRvIHRoZSBgZGlyLUJgIHN1YmRpcmVjdG9yeSBpbiB5b3VyIGN1cnJlbnQKK2JyYW5jaC4KKworSGVyZSBpcyB0aGUgY29tbWFuZCBzZXF1ZW5jZSB5b3UgbmVlZDoKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcmVtb3RlIGFkZCAtZiBCcHJvamVjdCAvcGF0aC90by9CIDwxPgorJCBnaXQgbWVyZ2UgLXMgb3VycyAtLW5vLWNvbW1pdCBCcHJvamVjdC9tYXN0ZXIgPDI+CiskIGdpdCByZWFkLXRyZWUgLS1wcmVmaXg9ZGlyLUIvIC11IEJwcm9qZWN0L21hc3RlciA8Mz4KKyQgZ2l0IGNvbW1pdCAtbSAiTWVyZ2UgQiBwcm9qZWN0IGFzIG91ciBzdWJkaXJlY3RvcnkiIDw0PgorCiskIGdpdCBwdWxsIC1zIHN1YnRyZWUgQnByb2plY3QgbWFzdGVyIDw1PgorLS0tLS0tLS0tLS0tLS0tLQorPDE+IG5hbWUgdGhlIG90aGVyIHByb2plY3QgIkJwcm9qZWN0IiwgYW5kIGZldGNoLgorPDI+IHByZXBhcmUgZm9yIHRoZSBsYXRlciBzdGVwIHRvIHJlY29yZCB0aGUgcmVzdWx0IGFzIGEgbWVyZ2UuCis8Mz4gcmVhZCAibWFzdGVyIiBicmFuY2ggb2YgQnByb2plY3QgdG8gdGhlIHN1YmRpcmVjdG9yeSAiZGlyLUIiLgorPDQ+IHJlY29yZCB0aGUgbWVyZ2UgcmVzdWx0LgorPDU+IG1haW50YWluIHRoZSByZXN1bHQgd2l0aCBzdWJzZXF1ZW50IG1lcmdlcyB1c2luZyAic3VidHJlZSIKKworVGhlIGZpcnN0IGZvdXIgY29tbWFuZHMgYXJlIHVzZWQgZm9yIHRoZSBpbml0aWFsIG1lcmdlLCB3aGlsZSB0aGUgbGFzdAorb25lIGlzIHRvIG1lcmdlIHVwZGF0ZXMgZnJvbSAnQiBwcm9qZWN0Jy4KKworQ29tcGFyaW5nICdzdWJ0cmVlJyBtZXJnZSB3aXRoIHN1Ym1vZHVsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gVGhlIGJlbmVmaXQgb2YgdXNpbmcgc3VidHJlZSBtZXJnZSBpcyB0aGF0IGl0IHJlcXVpcmVzIGxlc3MKKyAgYWRtaW5pc3RyYXRpdmUgYnVyZGVuIGZyb20gdGhlIHVzZXJzIG9mIHlvdXIgcmVwb3NpdG9yeS4gSXQgd29ya3Mgd2l0aAorICBvbGRlciAoYmVmb3JlIEdpdCB2MS41LjIpIGNsaWVudHMgYW5kIHlvdSBoYXZlIHRoZSBjb2RlIHJpZ2h0IGFmdGVyCisgIGNsb25lLgorCistIEhvd2V2ZXIgaWYgeW91IHVzZSBzdWJtb2R1bGVzIHRoZW4geW91IGNhbiBjaG9vc2Ugbm90IHRvIHRyYW5zZmVyIHRoZQorICBzdWJtb2R1bGUgb2JqZWN0cy4gVGhpcyBtYXkgYmUgYSBwcm9ibGVtIHdpdGggdGhlIHN1YnRyZWUgbWVyZ2UuCisKKy0gQWxzbywgaW4gY2FzZSB5b3UgbWFrZSBjaGFuZ2VzIHRvIHRoZSBvdGhlciBwcm9qZWN0LCBpdCBpcyBlYXNpZXIgdG8KKyAgc3VibWl0IGNoYW5nZXMgaWYgeW91IGp1c3QgdXNlIHN1Ym1vZHVsZXMuCisKK0FkZGl0aW9uYWwgdGlwcworLS0tLS0tLS0tLS0tLS0tCisKKy0gSWYgeW91IG1hZGUgY2hhbmdlcyB0byB0aGUgb3RoZXIgcHJvamVjdCBpbiB5b3VyIHJlcG9zaXRvcnksIHRoZXkgbWF5CisgIHdhbnQgdG8gbWVyZ2UgZnJvbSB5b3VyIHByb2plY3QuIFRoaXMgaXMgcG9zc2libGUgdXNpbmcgc3VidHJlZSAtLSBpdAorICBjYW4gc2hpZnQgdXAgdGhlIHBhdGhzIGluIHlvdXIgdHJlZSBhbmQgdGhlbiB0aGV5IGNhbiBtZXJnZSBvbmx5IHRoZQorICByZWxldmFudCBwYXJ0cyBvZiB5b3VyIHRyZWUuCisKKy0gUGxlYXNlIG5vdGUgdGhhdCBpZiB0aGUgb3RoZXIgcHJvamVjdCBtZXJnZXMgZnJvbSB5b3UsIHRoZW4gaXQgd2lsbAorICBjb25uZWN0cyBpdHMgaGlzdG9yeSB0byB5b3Vycywgd2hpY2ggY2FuIGJlIHNvbWV0aGluZyB0aGV5IGRvbid0IHdhbnQKKyAgdG8uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kxOG4udHh0IGIvRG9jdW1lbnRhdGlvbi9pMThuLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTE4OGU2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9pMThuLnR4dApAQCAtMCwwICsxLDU3IEBACitBdCB0aGUgY29yZSBsZXZlbCwgZ2l0IGlzIGNoYXJhY3RlciBlbmNvZGluZyBhZ25vc3RpYy4KKworIC0gVGhlIHBhdGhuYW1lcyByZWNvcmRlZCBpbiB0aGUgaW5kZXggYW5kIGluIHRoZSB0cmVlIG9iamVjdHMKKyAgIGFyZSB0cmVhdGVkIGFzIHVuaW50ZXJwcmV0ZWQgc2VxdWVuY2VzIG9mIG5vbi1OVUwgYnl0ZXMuCisgICBXaGF0IHJlYWRkaXIoMikgcmV0dXJucyBhcmUgd2hhdCBhcmUgcmVjb3JkZWQgYW5kIGNvbXBhcmVkCisgICB3aXRoIHRoZSBkYXRhIGdpdCBrZWVwcyB0cmFjayBvZiwgd2hpY2ggaW4gdHVybiBhcmUgZXhwZWN0ZWQKKyAgIHRvIGJlIHdoYXQgbHN0YXQoMikgYW5kIGNyZWF0KDIpIGFjY2VwdHMuICBUaGVyZSBpcyBubyBzdWNoCisgICB0aGluZyBhcyBwYXRobmFtZSBlbmNvZGluZyB0cmFuc2xhdGlvbi4KKworIC0gVGhlIGNvbnRlbnRzIG9mIHRoZSBibG9iIG9iamVjdHMgYXJlIHVuaW50ZXJwcmV0ZWQgc2VxdWVuY2UKKyAgIG9mIGJ5dGVzLiAgVGhlcmUgaXMgbm8gZW5jb2RpbmcgdHJhbnNsYXRpb24gYXQgdGhlIGNvcmUKKyAgIGxldmVsLgorCisgLSBUaGUgY29tbWl0IGxvZyBtZXNzYWdlcyBhcmUgdW5pbnRlcnByZXRlZCBzZXF1ZW5jZSBvZiBub24tTlVMCisgICBieXRlcy4KKworQWx0aG91Z2ggd2UgZW5jb3VyYWdlIHRoYXQgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZXMgYXJlIGVuY29kZWQKK2luIFVURi04LCBib3RoIHRoZSBjb3JlIGFuZCBnaXQgUG9yY2VsYWluIGFyZSBkZXNpZ25lZCBub3QgdG8KK2ZvcmNlIFVURi04IG9uIHByb2plY3RzLiAgSWYgYWxsIHBhcnRpY2lwYW50cyBvZiBhIHBhcnRpY3VsYXIKK3Byb2plY3QgZmluZCBpdCBtb3JlIGNvbnZlbmllbnQgdG8gdXNlIGxlZ2FjeSBlbmNvZGluZ3MsIGdpdAorZG9lcyBub3QgZm9yYmlkIGl0LiAgSG93ZXZlciwgdGhlcmUgYXJlIGEgZmV3IHRoaW5ncyB0byBrZWVwIGluCittaW5kLgorCisuIGBnaXQtY29tbWl0LXRyZWVgIChoZW5jZSwgYGdpdC1jb21taXRgIHdoaWNoIHVzZXMgaXQpIGlzc3VlcworICBhIHdhcm5pbmcgaWYgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZSBnaXZlbiB0byBpdCBkb2VzIG5vdCBsb29rCisgIGxpa2UgYSB2YWxpZCBVVEYtOCBzdHJpbmcsIHVubGVzcyB5b3UgZXhwbGljaXRseSBzYXkgeW91cgorICBwcm9qZWN0IHVzZXMgYSBsZWdhY3kgZW5jb2RpbmcuICBUaGUgd2F5IHRvIHNheSB0aGlzIGlzIHRvCisgIGhhdmUgaTE4bi5jb21taXRlbmNvZGluZyBpbiBgLmdpdC9jb25maWdgIGZpbGUsIGxpa2UgdGhpczoKKysKKy0tLS0tLS0tLS0tLQorW2kxOG5dCisJY29tbWl0ZW5jb2RpbmcgPSBJU08tODg1OS0xCistLS0tLS0tLS0tLS0KKysKK0NvbW1pdCBvYmplY3RzIGNyZWF0ZWQgd2l0aCB0aGUgYWJvdmUgc2V0dGluZyByZWNvcmQgdGhlIHZhbHVlCitvZiBgaTE4bi5jb21taXRlbmNvZGluZ2AgaW4gaXRzIGBlbmNvZGluZ2AgaGVhZGVyLiAgVGhpcyBpcyB0bworaGVscCBvdGhlciBwZW9wbGUgd2hvIGxvb2sgYXQgdGhlbSBsYXRlci4gIExhY2sgb2YgdGhpcyBoZWFkZXIKK2ltcGxpZXMgdGhhdCB0aGUgY29tbWl0IGxvZyBtZXNzYWdlIGlzIGVuY29kZWQgaW4gVVRGLTguCisKKy4gYGdpdC1sb2dgLCBgZ2l0LXNob3dgIGFuZCBmcmllbmRzIGxvb2tzIGF0IHRoZSBgZW5jb2RpbmdgCisgIGhlYWRlciBvZiBhIGNvbW1pdCBvYmplY3QsIGFuZCB0cmllcyB0byByZS1jb2RlIHRoZSBsb2cKKyAgbWVzc2FnZSBpbnRvIFVURi04IHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiAgWW91IGNhbgorICBzcGVjaWZ5IHRoZSBkZXNpcmVkIG91dHB1dCBlbmNvZGluZyB3aXRoCisgIGBpMThuLmxvZ291dHB1dGVuY29kaW5nYCBpbiBgLmdpdC9jb25maWdgIGZpbGUsIGxpa2UgdGhpczoKKysKKy0tLS0tLS0tLS0tLQorW2kxOG5dCisJbG9nb3V0cHV0ZW5jb2RpbmcgPSBJU08tODg1OS0xCistLS0tLS0tLS0tLS0KKysKK0lmIHlvdSBkbyBub3QgaGF2ZSB0aGlzIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUsIHRoZSB2YWx1ZSBvZgorYGkxOG4uY29tbWl0ZW5jb2RpbmdgIGlzIHVzZWQgaW5zdGVhZC4KKworTm90ZSB0aGF0IHdlIGRlbGliZXJhdGVseSBjaG9zZSBub3QgdG8gcmUtY29kZSB0aGUgY29tbWl0IGxvZworbWVzc2FnZSB3aGVuIGEgY29tbWl0IGlzIG1hZGUgdG8gZm9yY2UgVVRGLTggYXQgdGhlIGNvbW1pdAorb2JqZWN0IGxldmVsLCBiZWNhdXNlIHJlLWNvZGluZyB0byBVVEYtOCBpcyBub3QgbmVjZXNzYXJpbHkgYQorcmV2ZXJzaWJsZSBvcGVyYXRpb24uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2luc3RhbGwtZG9jLXF1aWNrLnNoIGIvRG9jdW1lbnRhdGlvbi9pbnN0YWxsLWRvYy1xdWljay5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NDMzY2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9pbnN0YWxsLWRvYy1xdWljay5zaApAQCAtMCwwICsxLDMxIEBACisjIS9iaW4vc2gKKyMgVGhpcyByZXF1aXJlcyBhIGJyYW5jaCBuYW1lZCBpbiAkaGVhZAorIyAodXN1YWxseSAnbWFuJyBvciAnaHRtbCcsIHByb3ZpZGVkIGJ5IHRoZSBnaXQuZ2l0IHJlcG9zaXRvcnkpCitzZXQgLWUKK2hlYWQ9IiQxIgorbWFuZGlyPSIkMiIKK1NVQkRJUkVDVE9SWV9PSz10CitVU0FHRT0nPHJlZm5hbWU+IDx0YXJnZXQgZGlyZWN0b3J5PicKKy4gZ2l0LXNoLXNldHVwCitjZF90b190b3BsZXZlbAorCit0ZXN0IC16ICIkbWFuZGlyIiAmJiB1c2FnZQoraWYgISBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5ICIkaGVhZF4wIiA+L2Rldi9udWxsOyB0aGVuCisJZWNobyA+JjIgImhlYWQ6ICRoZWFkIGRvZXMgbm90IGV4aXN0IGluIHRoZSBjdXJyZW50IHJlcG9zaXRvcnkiCisJdXNhZ2UKK2ZpCisKK0dJVF9JTkRFWF9GSUxFPWBwd2RgLy5xdWljay1kb2MuaW5kZXgKK2V4cG9ydCBHSVRfSU5ERVhfRklMRQorcm0gLWYgIiRHSVRfSU5ERVhfRklMRSIKK3RyYXAgJ3JtIC1mICIkR0lUX0lOREVYX0ZJTEUiJyAwCisKK2dpdCByZWFkLXRyZWUgJGhlYWQKK2dpdCBjaGVja291dC1pbmRleCAtYSAtZiAtLXByZWZpeD0iJG1hbmRpciIvCisKK2lmIHRlc3QgLW4gIiRHWiI7IHRoZW4KKwlnaXQgbHMtdHJlZSAtciAtLW5hbWUtb25seSAkaGVhZCB8CisJeGFyZ3MgcHJpbnRmICIkbWFuZGlyLyVzXG4iIHwKKwl4YXJncyBnemlwIC1mCitmaQorcm0gLWYgIiRHSVRfSU5ERVhfRklMRSIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW5zdGFsbC13ZWJkb2Muc2ggYi9Eb2N1bWVudGF0aW9uL2luc3RhbGwtd2ViZG9jLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIxMzVhOGUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2luc3RhbGwtd2ViZG9jLnNoCkBAIC0wLDAgKzEsMzkgQEAKKyMhL2Jpbi9zaAorCitUPSIkMSIKKworZm9yIGggaW4gXAorCSoudHh0ICouaHRtbCBcCisJaG93dG8vKi50eHQgaG93dG8vKi5odG1sIFwKKwl0ZWNobmljYWwvKi50eHQgdGVjaG5pY2FsLyouaHRtbCBcCisJUmVsTm90ZXMtKi50eHQgKi5jc3MKK2RvCisJaWYgdGVzdCAhIC1mICIkaCIKKwl0aGVuCisJCTogZGlkIG5vdCBtYXRjaAorCWVsaWYgdGVzdCAtZiAiJFQvJGgiICYmCisJICAgZGlmZiAtdSAtSSdMYXN0IHVwZGF0ZWQgWzAtOV1bMC05XS1bQS1aXVthLXpdW2Etel0tJyAiJFQvJGgiICIkaCIKKwl0aGVuCisJCTo7ICMgdXAgdG8gZGF0ZQorCWVsc2UKKwkJZWNobyA+JjIgIiMgaW5zdGFsbCAkaCAkVC8kaCIKKwkJcm0gLWYgIiRULyRoIgorCQlta2RpciAtcCBgZGlybmFtZSAiJFQvJGgiYAorCQljcCAiJGgiICIkVC8kaCIKKwlmaQorZG9uZQorc3RyaXBfbGVhZGluZz1gZWNobyAiJFQvIiB8IHNlZCAtZSAnc3wufC58ZydgCitmb3IgdGggaW4gXAorCSIkVCIvKi5odG1sICIkVCIvKi50eHQgXAorCSIkVCIvaG93dG8vKi50eHQgIiRUIi9ob3d0by8qLmh0bWwgXAorCSIkVCIvdGVjaG5pY2FsLyoudHh0ICIkVCIvdGVjaG5pY2FsLyouaHRtbAorZG8KKwloPWBleHByICIkdGgiIDogIiRzdHJpcF9sZWFkaW5nIidcKC4qXCknYAorCWNhc2UgIiRoIiBpbgorCWluZGV4Lmh0bWwpIGNvbnRpbnVlIDs7CisJZXNhYworCXRlc3QgLWYgIiRoIiAmJiBjb250aW51ZQorCWVjaG8gPiYyICIjIHJtIC1mICR0aCIKKwlybSAtZiAiJHRoIgorZG9uZQorbG4gLXNmIGdpdC5odG1sICIkVC9pbmRleC5odG1sIgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tYW5wYWdlLTEuNzIueHNsIGIvRG9jdW1lbnRhdGlvbi9tYW5wYWdlLTEuNzIueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNjVhM2EKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL21hbnBhZ2UtMS43Mi54c2wKQEAgLTAsMCArMSwyMSBAQAorPCEtLSBCYXNlZCBvbiBjYWxsb3V0cy54c2wuIEZpeGVzIG1hbiBwYWdlIGNhbGxvdXRzIGZvciBEb2NCb29rIDEuNzIgWFNMIC0tPgorPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgorCis8eHNsOnBhcmFtIG5hbWU9Im1hbi5vdXRwdXQucXVpZXRseSIgc2VsZWN0PSIxIi8+Cis8eHNsOnBhcmFtIG5hbWU9InJlZmVudHJ5Lm1ldGEuZ2V0LnF1aWV0bHkiIHNlbGVjdD0iMSIvPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJjbyI+CisJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCgnJiN4MjU5MztmQignLHN1YnN0cmluZy1hZnRlcihAaWQsJy0nKSwnKSYjeDI1OTM7ZlInKSIvPgorPC94c2w6dGVtcGxhdGU+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJjYWxsb3V0bGlzdCI+CisJPHhzbDp0ZXh0PiYjeDIzMDI7c3AmIzEwOzwveHNsOnRleHQ+CisJPHhzbDphcHBseS10ZW1wbGF0ZXMvPgorCTx4c2w6dGV4dD4mIzEwOzwveHNsOnRleHQ+Cis8L3hzbDp0ZW1wbGF0ZT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNhbGxvdXQiPgorCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoJyYjeDI1OTM7ZkInLHN1YnN0cmluZy1hZnRlcihAYXJlYXJlZnMsJy0nKSwnLiAmI3gyNTkzO2ZSJykiLz4KKwk8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisJPHhzbDp0ZXh0PiYjeDIzMDI7YnImIzEwOzwveHNsOnRleHQ+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWVyZ2Utb3B0aW9ucy50eHQgYi9Eb2N1bWVudGF0aW9uL21lcmdlLW9wdGlvbnMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMWZjODIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL21lcmdlLW9wdGlvbnMudHh0CkBAIC0wLDAgKzEsNDQgQEAKKy0tc3VtbWFyeTo6CisJU2hvdyBhIGRpZmZzdGF0IGF0IHRoZSBlbmQgb2YgdGhlIG1lcmdlLiBUaGUgZGlmZnN0YXQgaXMgYWxzbworCWNvbnRyb2xsZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9uIG1lcmdlLmRpZmZzdGF0LgorCistbiwgXC0tbm8tc3VtbWFyeTo6CisJRG8gbm90IHNob3cgZGlmZnN0YXQgYXQgdGhlIGVuZCBvZiB0aGUgbWVyZ2UuCisKKy0tbm8tY29tbWl0OjoKKwlQZXJmb3JtIHRoZSBtZXJnZSBidXQgcHJldGVuZCB0aGUgbWVyZ2UgZmFpbGVkIGFuZCBkbworCW5vdCBhdXRvY29tbWl0LCB0byBnaXZlIHRoZSB1c2VyIGEgY2hhbmNlIHRvIGluc3BlY3QgYW5kCisJZnVydGhlciB0d2VhayB0aGUgbWVyZ2UgcmVzdWx0IGJlZm9yZSBjb21taXR0aW5nLgorCistLWNvbW1pdDo6CisJUGVyZm9ybSB0aGUgbWVyZ2UgYW5kIGNvbW1pdCB0aGUgcmVzdWx0LiBUaGlzIG9wdGlvbiBjYW4KKwliZSB1c2VkIHRvIG92ZXJyaWRlIC0tbm8tY29tbWl0LgorCistLXNxdWFzaDo6CisJUHJvZHVjZSB0aGUgd29ya2luZyB0cmVlIGFuZCBpbmRleCBzdGF0ZSBhcyBpZiBhIHJlYWwKKwltZXJnZSBoYXBwZW5lZCwgYnV0IGRvIG5vdCBhY3R1YWxseSBtYWtlIGEgY29tbWl0IG9yCisJbW92ZSB0aGUgYEhFQURgLCBub3IgcmVjb3JkIGAkR0lUX0RJUi9NRVJHRV9IRUFEYCB0bworCWNhdXNlIHRoZSBuZXh0IGBnaXQgY29tbWl0YCBjb21tYW5kIHRvIGNyZWF0ZSBhIG1lcmdlCisJY29tbWl0LiAgVGhpcyBhbGxvd3MgeW91IHRvIGNyZWF0ZSBhIHNpbmdsZSBjb21taXQgb24KKwl0b3Agb2YgdGhlIGN1cnJlbnQgYnJhbmNoIHdob3NlIGVmZmVjdCBpcyB0aGUgc2FtZSBhcworCW1lcmdpbmcgYW5vdGhlciBicmFuY2ggKG9yIG1vcmUgaW4gY2FzZSBvZiBhbiBvY3RvcHVzKS4KKworLS1uby1zcXVhc2g6OgorCVBlcmZvcm0gdGhlIG1lcmdlIGFuZCBjb21taXQgdGhlIHJlc3VsdC4gVGhpcyBvcHRpb24gY2FuCisJYmUgdXNlZCB0byBvdmVycmlkZSAtLXNxdWFzaC4KKworLS1uby1mZjo6CisJR2VuZXJhdGUgYSBtZXJnZSBjb21taXQgZXZlbiBpZiB0aGUgbWVyZ2UgcmVzb2x2ZWQgYXMgYQorCWZhc3QtZm9yd2FyZC4KKworLS1mZjo6CisJRG8gbm90IGdlbmVyYXRlIGEgbWVyZ2UgY29tbWl0IGlmIHRoZSBtZXJnZSByZXNvbHZlZCBhcworCWEgZmFzdC1mb3J3YXJkLCBvbmx5IHVwZGF0ZSB0aGUgYnJhbmNoIHBvaW50ZXIuIFRoaXMgaXMKKwl0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBnaXQtbWVyZ2UuCisKKy1zIDxzdHJhdGVneT4sIFwtLXN0cmF0ZWd5PTxzdHJhdGVneT46OgorCVVzZSB0aGUgZ2l2ZW4gbWVyZ2Ugc3RyYXRlZ3k7IGNhbiBiZSBzdXBwbGllZCBtb3JlIHRoYW4KKwlvbmNlIHRvIHNwZWNpZnkgdGhlbSBpbiB0aGUgb3JkZXIgdGhleSBzaG91bGQgYmUgdHJpZWQuCisJSWYgdGhlcmUgaXMgbm8gYC1zYCBvcHRpb24sIGEgYnVpbHQtaW4gbGlzdCBvZiBzdHJhdGVnaWVzCisJaXMgdXNlZCBpbnN0ZWFkIChgZ2l0LW1lcmdlLXJlY3Vyc2l2ZWAgd2hlbiBtZXJnaW5nIGEgc2luZ2xlCisJaGVhZCwgYGdpdC1tZXJnZS1vY3RvcHVzYCBvdGhlcndpc2UpLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tZXJnZS1zdHJhdGVnaWVzLnR4dCBiL0RvY3VtZW50YXRpb24vbWVyZ2Utc3RyYXRlZ2llcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3NmY4NQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbWVyZ2Utc3RyYXRlZ2llcy50eHQKQEAgLTAsMCArMSw0MiBAQAorTUVSR0UgU1RSQVRFR0lFUworLS0tLS0tLS0tLS0tLS0tLQorCityZXNvbHZlOjoKKwlUaGlzIGNhbiBvbmx5IHJlc29sdmUgdHdvIGhlYWRzIChpLmUuIHRoZSBjdXJyZW50IGJyYW5jaAorCWFuZCBhbm90aGVyIGJyYW5jaCB5b3UgcHVsbGVkIGZyb20pIHVzaW5nIDMtd2F5IG1lcmdlCisJYWxnb3JpdGhtLiAgSXQgdHJpZXMgdG8gY2FyZWZ1bGx5IGRldGVjdCBjcmlzcy1jcm9zcworCW1lcmdlIGFtYmlndWl0aWVzIGFuZCBpcyBjb25zaWRlcmVkIGdlbmVyYWxseSBzYWZlIGFuZAorCWZhc3QuCisKK3JlY3Vyc2l2ZTo6CisJVGhpcyBjYW4gb25seSByZXNvbHZlIHR3byBoZWFkcyB1c2luZyAzLXdheSBtZXJnZQorCWFsZ29yaXRobS4gIFdoZW4gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgY29tbW9uCisJYW5jZXN0b3JzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIDMtd2F5IG1lcmdlLCBpdCBjcmVhdGVzIGEKKwltZXJnZWQgdHJlZSBvZiB0aGUgY29tbW9uIGFuY2VzdG9ycyBhbmQgdXNlcyB0aGF0IGFzCisJdGhlIHJlZmVyZW5jZSB0cmVlIGZvciB0aGUgMy13YXkgbWVyZ2UuICBUaGlzIGhhcyBiZWVuCisJcmVwb3J0ZWQgdG8gcmVzdWx0IGluIGZld2VyIG1lcmdlIGNvbmZsaWN0cyB3aXRob3V0CisJY2F1c2luZyBtaXMtbWVyZ2VzIGJ5IHRlc3RzIGRvbmUgb24gYWN0dWFsIG1lcmdlIGNvbW1pdHMKKwl0YWtlbiBmcm9tIExpbnV4IDIuNiBrZXJuZWwgZGV2ZWxvcG1lbnQgaGlzdG9yeS4KKwlBZGRpdGlvbmFsbHkgdGhpcyBjYW4gZGV0ZWN0IGFuZCBoYW5kbGUgbWVyZ2VzIGludm9sdmluZworCXJlbmFtZXMuICBUaGlzIGlzIHRoZSBkZWZhdWx0IG1lcmdlIHN0cmF0ZWd5IHdoZW4KKwlwdWxsaW5nIG9yIG1lcmdpbmcgb25lIGJyYW5jaC4KKworb2N0b3B1czo6CisJVGhpcyByZXNvbHZlcyBtb3JlIHRoYW4gdHdvLWhlYWQgY2FzZSwgYnV0IHJlZnVzZXMgdG8gZG8KKwljb21wbGV4IG1lcmdlIHRoYXQgbmVlZHMgbWFudWFsIHJlc29sdXRpb24uICBJdCBpcworCXByaW1hcmlseSBtZWFudCB0byBiZSB1c2VkIGZvciBidW5kbGluZyB0b3BpYyBicmFuY2gKKwloZWFkcyB0b2dldGhlci4gIFRoaXMgaXMgdGhlIGRlZmF1bHQgbWVyZ2Ugc3RyYXRlZ3kgd2hlbgorCXB1bGxpbmcgb3IgbWVyZ2luZyBtb3JlIHRoYW4gb25lIGJyYW5jaGVzLgorCitvdXJzOjoKKwlUaGlzIHJlc29sdmVzIGFueSBudW1iZXIgb2YgaGVhZHMsIGJ1dCB0aGUgcmVzdWx0IG9mIHRoZQorCW1lcmdlIGlzIGFsd2F5cyB0aGUgY3VycmVudCBicmFuY2ggaGVhZC4gIEl0IGlzIG1lYW50IHRvCisJYmUgdXNlZCB0byBzdXBlcnNlZGUgb2xkIGRldmVsb3BtZW50IGhpc3Rvcnkgb2Ygc2lkZQorCWJyYW5jaGVzLgorCitzdWJ0cmVlOjoKKwlUaGlzIGlzIGEgbW9kaWZpZWQgcmVjdXJzaXZlIHN0cmF0ZWd5LiBXaGVuIG1lcmdpbmcgdHJlZXMgQSBhbmQKKwlCLCBpZiBCIGNvcnJlc3BvbmRzIHRvIGEgc3VidHJlZSBvZiBBLCBCIGlzIGZpcnN0IGFkanVzdGVkIHRvCisJbWF0Y2ggdGhlIHRyZWUgc3RydWN0dXJlIG9mIEEsIGluc3RlYWQgb2YgcmVhZGluZyB0aGUgdHJlZXMgYXQKKwl0aGUgc2FtZSBsZXZlbC4gVGhpcyBhZGp1c3RtZW50IGlzIGFsc28gZG9uZSB0byB0aGUgY29tbW9uCisJYW5jZXN0b3IgdHJlZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcHJldHR5LWZvcm1hdHMudHh0IGIvRG9jdW1lbnRhdGlvbi9wcmV0dHktZm9ybWF0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE5M2MzYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vcHJldHR5LWZvcm1hdHMudHh0CkBAIC0wLDAgKzEsMTI1IEBACitQUkVUVFkgRk9STUFUUworLS0tLS0tLS0tLS0tLS0KKworSWYgdGhlIGNvbW1pdCBpcyBhIG1lcmdlLCBhbmQgaWYgdGhlIHByZXR0eS1mb3JtYXQKK2lzIG5vdCAnb25lbGluZScsICdlbWFpbCcgb3IgJ3JhdycsIGFuIGFkZGl0aW9uYWwgbGluZSBpcworaW5zZXJ0ZWQgYmVmb3JlIHRoZSAnQXV0aG9yOicgbGluZS4gIFRoaXMgbGluZSBiZWdpbnMgd2l0aAorIk1lcmdlOiAiIGFuZCB0aGUgc2hhMXMgb2YgYW5jZXN0cmFsIGNvbW1pdHMgYXJlIHByaW50ZWQsCitzZXBhcmF0ZWQgYnkgc3BhY2VzLiAgTm90ZSB0aGF0IHRoZSBsaXN0ZWQgY29tbWl0cyBtYXkgbm90CituZWNlc3NhcmlseSBiZSB0aGUgbGlzdCBvZiB0aGUgKmRpcmVjdCogcGFyZW50IGNvbW1pdHMgaWYgeW91CitoYXZlIGxpbWl0ZWQgeW91ciB2aWV3IG9mIGhpc3Rvcnk6IGZvciBleGFtcGxlLCBpZiB5b3UgYXJlCitvbmx5IGludGVyZXN0ZWQgaW4gY2hhbmdlcyByZWxhdGVkIHRvIGEgY2VydGFpbiBkaXJlY3Rvcnkgb3IKK2ZpbGUuCisKK0hlcmUgYXJlIHNvbWUgYWRkaXRpb25hbCBkZXRhaWxzIGZvciBlYWNoIGZvcm1hdDoKKworKiAnb25lbGluZScKKworCSAgPHNoYTE+IDx0aXRsZSBsaW5lPgorKworVGhpcyBpcyBkZXNpZ25lZCB0byBiZSBhcyBjb21wYWN0IGFzIHBvc3NpYmxlLgorCisqICdzaG9ydCcKKworCSAgY29tbWl0IDxzaGExPgorCSAgQXV0aG9yOiA8YXV0aG9yPgorCisJICAgICAgPHRpdGxlIGxpbmU+CisKKyogJ21lZGl1bScKKworCSAgY29tbWl0IDxzaGExPgorCSAgQXV0aG9yOiA8YXV0aG9yPgorCSAgRGF0ZTogPGRhdGU+CisKKwkgICAgICA8dGl0bGUgbGluZT4KKworCSAgICAgIDxmdWxsIGNvbW1pdCBtZXNzYWdlPgorCisqICdmdWxsJworCisJICBjb21taXQgPHNoYTE+CisJICBBdXRob3I6IDxhdXRob3I+CisJICBDb21taXQ6IDxjb21taXR0ZXI+CisKKwkgICAgICA8dGl0bGUgbGluZT4KKworCSAgICAgIDxmdWxsIGNvbW1pdCBtZXNzYWdlPgorCisqICdmdWxsZXInCisKKwkgIGNvbW1pdCA8c2hhMT4KKwkgIEF1dGhvcjogPGF1dGhvcj4KKwkgIEF1dGhvckRhdGU6IDxkYXRlICYgdGltZT4KKwkgIENvbW1pdDogPGNvbW1pdHRlcj4KKwkgIENvbW1pdERhdGU6IDxkYXRlICYgdGltZT4KKworCSAgICAgICA8dGl0bGUgbGluZT4KKworCSAgICAgICA8ZnVsbCBjb21taXQgbWVzc2FnZT4KKworKiAnZW1haWwnCisKKwkgIEZyb20gPHNoYTE+IDxkYXRlPgorCSAgRnJvbTogPGF1dGhvcj4KKwkgIERhdGU6IDxkYXRlICYgdGltZT4KKwkgIFN1YmplY3Q6IFtQQVRDSF0gPHRpdGxlIGxpbmU+CisKKwkgIDxmdWxsIGNvbW1pdCBtZXNzYWdlPgorCisqICdyYXcnCisrCitUaGUgJ3JhdycgZm9ybWF0IHNob3dzIHRoZSBlbnRpcmUgY29tbWl0IGV4YWN0bHkgYXMKK3N0b3JlZCBpbiB0aGUgY29tbWl0IG9iamVjdC4gIE5vdGFibHksIHRoZSBTSEExcyBhcmUKK2Rpc3BsYXllZCBpbiBmdWxsLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgLS1hYmJyZXYgb3IKKy0tbm8tYWJicmV2IGFyZSB1c2VkLCBhbmQgJ3BhcmVudHMnIGluZm9ybWF0aW9uIHNob3cgdGhlCit0cnVlIHBhcmVudCBjb21taXRzLCB3aXRob3V0IHRha2luZyBncmFmdHMgbm9yIGhpc3RvcnkKK3NpbXBsaWZpY2F0aW9uIGludG8gYWNjb3VudC4KKworKiAnZm9ybWF0OicKKysKK1RoZSAnZm9ybWF0OicgZm9ybWF0IGFsbG93cyB5b3UgdG8gc3BlY2lmeSB3aGljaCBpbmZvcm1hdGlvbgoreW91IHdhbnQgdG8gc2hvdy4gSXQgd29ya3MgYSBsaXR0bGUgYml0IGxpa2UgcHJpbnRmIGZvcm1hdCwKK3dpdGggdGhlIG5vdGFibGUgZXhjZXB0aW9uIHRoYXQgeW91IGdldCBhIG5ld2xpbmUgd2l0aCAnJW4nCitpbnN0ZWFkIG9mICdcbicuCisrCitFLmcsICdmb3JtYXQ6IlRoZSBhdXRob3Igb2YgJWggd2FzICVhbiwgJWFyJW5UaGUgdGl0bGUgd2FzID4+JXM8PCVuIicKK3dvdWxkIHNob3cgc29tZXRoaW5nIGxpa2UgdGhpczoKKysKKy0tLS0tLS0KK1RoZSBhdXRob3Igb2YgZmU2ZTBlZSB3YXMgSnVuaW8gQyBIYW1hbm8sIDIzIGhvdXJzIGFnbworVGhlIHRpdGxlIHdhcyA+PnQ0MTE5OiB0ZXN0IGF1dG9jb21wdXRpbmcgLXA8bj4gZm9yIHRyYWRpdGlvbmFsIGRpZmYgaW5wdXQuPDwKKworLS0tLS0tLS0KKysKK1RoZSBwbGFjZWhvbGRlcnMgYXJlOgorCistICclSCc6IGNvbW1pdCBoYXNoCistICclaCc6IGFiYnJldmlhdGVkIGNvbW1pdCBoYXNoCistICclVCc6IHRyZWUgaGFzaAorLSAnJXQnOiBhYmJyZXZpYXRlZCB0cmVlIGhhc2gKKy0gJyVQJzogcGFyZW50IGhhc2hlcworLSAnJXAnOiBhYmJyZXZpYXRlZCBwYXJlbnQgaGFzaGVzCistICclYW4nOiBhdXRob3IgbmFtZQorLSAnJWFlJzogYXV0aG9yIGVtYWlsCistICclYWQnOiBhdXRob3IgZGF0ZQorLSAnJWFEJzogYXV0aG9yIGRhdGUsIFJGQzI4MjIgc3R5bGUKKy0gJyVhcic6IGF1dGhvciBkYXRlLCByZWxhdGl2ZQorLSAnJWF0JzogYXV0aG9yIGRhdGUsIFVOSVggdGltZXN0YW1wCistICclYWknOiBhdXRob3IgZGF0ZSwgSVNPIDg2MDEgZm9ybWF0CistICclY24nOiBjb21taXR0ZXIgbmFtZQorLSAnJWNlJzogY29tbWl0dGVyIGVtYWlsCistICclY2QnOiBjb21taXR0ZXIgZGF0ZQorLSAnJWNEJzogY29tbWl0dGVyIGRhdGUsIFJGQzI4MjIgc3R5bGUKKy0gJyVjcic6IGNvbW1pdHRlciBkYXRlLCByZWxhdGl2ZQorLSAnJWN0JzogY29tbWl0dGVyIGRhdGUsIFVOSVggdGltZXN0YW1wCistICclY2knOiBjb21taXR0ZXIgZGF0ZSwgSVNPIDg2MDEgZm9ybWF0CistICclZSc6IGVuY29kaW5nCistICclcyc6IHN1YmplY3QKKy0gJyViJzogYm9keQorLSAnJUNyZWQnOiBzd2l0Y2ggY29sb3IgdG8gcmVkCistICclQ2dyZWVuJzogc3dpdGNoIGNvbG9yIHRvIGdyZWVuCistICclQ2JsdWUnOiBzd2l0Y2ggY29sb3IgdG8gYmx1ZQorLSAnJUNyZXNldCc6IHJlc2V0IGNvbG9yCistICclbSc6IGxlZnQsIHJpZ2h0IG9yIGJvdW5kYXJ5IG1hcmsKKy0gJyVuJzogbmV3bGluZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wcmV0dHktb3B0aW9ucy50eHQgYi9Eb2N1bWVudGF0aW9uL3ByZXR0eS1vcHRpb25zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDY2Yzc0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9wcmV0dHktb3B0aW9ucy50eHQKQEAgLTAsMCArMSwyNSBAQAorLS1wcmV0dHlbPSc8Zm9ybWF0PiddOjoKKworCVByZXR0eS1wcmludCB0aGUgY29udGVudHMgb2YgdGhlIGNvbW1pdCBsb2dzIGluIGEgZ2l2ZW4gZm9ybWF0LAorCXdoZXJlICc8Zm9ybWF0PicgY2FuIGJlIG9uZSBvZiAnb25lbGluZScsICdzaG9ydCcsICdtZWRpdW0nLAorCSdmdWxsJywgJ2Z1bGxlcicsICdlbWFpbCcsICdyYXcnIGFuZCAnZm9ybWF0OjxzdHJpbmc+Jy4KKwlXaGVuIG9taXR0ZWQsIHRoZSBmb3JtYXQgZGVmYXVsdHMgdG8gJ21lZGl1bScuCisrCitOb3RlOiB5b3UgY2FuIHNwZWNpZnkgdGhlIGRlZmF1bHQgcHJldHR5IGZvcm1hdCBpbiB0aGUgcmVwb3NpdG9yeQorY29uZmlndXJhdGlvbiAoc2VlIGxpbmtnaXQ6Z2l0LWNvbmZpZ1sxXSkuCisKKy0tYWJicmV2LWNvbW1pdDo6CisJSW5zdGVhZCBvZiBzaG93aW5nIHRoZSBmdWxsIDQwLWJ5dGUgaGV4YWRlY2ltYWwgY29tbWl0IG9iamVjdAorCW5hbWUsIHNob3cgb25seSBoYW5kZnVsIGhleGRpZ2l0cyBwcmVmaXguICBOb24gZGVmYXVsdCBudW1iZXIgb2YKKwlkaWdpdHMgY2FuIGJlIHNwZWNpZmllZCB3aXRoICItLWFiYnJldj08bj4iICh3aGljaCBhbHNvIG1vZGlmaWVzCisJZGlmZiBvdXRwdXQsIGlmIGl0IGlzIGRpc3BsYXllZCkuCisrCitUaGlzIHNob3VsZCBtYWtlICItLXByZXR0eT1vbmVsaW5lIiBhIHdob2xlIGxvdCBtb3JlIHJlYWRhYmxlIGZvcgorcGVvcGxlIHVzaW5nIDgwLWNvbHVtbiB0ZXJtaW5hbHMuCisKKy0tZW5jb2RpbmdbPTxlbmNvZGluZz5dOjoKKwlUaGUgY29tbWl0IG9iamVjdHMgcmVjb3JkIHRoZSBlbmNvZGluZyB1c2VkIGZvciB0aGUgbG9nIG1lc3NhZ2UKKwlpbiB0aGVpciBlbmNvZGluZyBoZWFkZXI7IHRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHRlbGwgdGhlCisJY29tbWFuZCB0byByZS1jb2RlIHRoZSBjb21taXQgbG9nIG1lc3NhZ2UgaW4gdGhlIGVuY29kaW5nCisJcHJlZmVycmVkIGJ5IHRoZSB1c2VyLiAgRm9yIG5vbiBwbHVtYmluZyBjb21tYW5kcyB0aGlzCisJZGVmYXVsdHMgdG8gVVRGLTguCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3B1bGwtZmV0Y2gtcGFyYW0udHh0IGIvRG9jdW1lbnRhdGlvbi9wdWxsLWZldGNoLXBhcmFtLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmViN2ZjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9wdWxsLWZldGNoLXBhcmFtLnR4dApAQCAtMCwwICsxLDY1IEBACis8cmVwb3NpdG9yeT46OgorCVRoZSAicmVtb3RlIiByZXBvc2l0b3J5IHRoYXQgaXMgdGhlIHNvdXJjZSBvZiBhIGZldGNoCisJb3IgcHVsbCBvcGVyYXRpb24uICBTZWUgdGhlIHNlY3Rpb24gPDxVUkxTLEdJVCBVUkxTPj4gYmVsb3cuCisKKzxyZWZzcGVjPjo6CisJVGhlIGNhbm9uaWNhbCBmb3JtYXQgb2YgYSA8cmVmc3BlYz4gcGFyYW1ldGVyIGlzCisJYCs/PHNyYz46PGRzdD5gOyB0aGF0IGlzLCBhbiBvcHRpb25hbCBwbHVzIGArYCwgZm9sbG93ZWQKKwlieSB0aGUgc291cmNlIHJlZiwgZm9sbG93ZWQgYnkgYSBjb2xvbiBgOmAsIGZvbGxvd2VkIGJ5CisJdGhlIGRlc3RpbmF0aW9uIHJlZi4KKysKK1RoZSByZW1vdGUgcmVmIHRoYXQgbWF0Y2hlcyA8c3JjPgoraXMgZmV0Y2hlZCwgYW5kIGlmIDxkc3Q+IGlzIG5vdCBlbXB0eSBzdHJpbmcsIHRoZSBsb2NhbAorcmVmIHRoYXQgbWF0Y2hlcyBpdCBpcyBmYXN0IGZvcndhcmRlZCB1c2luZyA8c3JjPi4KK0FnYWluLCBpZiB0aGUgb3B0aW9uYWwgcGx1cyBgK2AgaXMgdXNlZCwgdGhlIGxvY2FsIHJlZgoraXMgdXBkYXRlZCBldmVuIGlmIGl0IGRvZXMgbm90IHJlc3VsdCBpbiBhIGZhc3QgZm9yd2FyZAordXBkYXRlLgorKworW05PVEVdCitJZiB0aGUgcmVtb3RlIGJyYW5jaCBmcm9tIHdoaWNoIHlvdSB3YW50IHRvIHB1bGwgaXMKK21vZGlmaWVkIGluIG5vbi1saW5lYXIgd2F5cyBzdWNoIGFzIGJlaW5nIHJld291bmQgYW5kCityZWJhc2VkIGZyZXF1ZW50bHksIHRoZW4gYSBwdWxsIHdpbGwgYXR0ZW1wdCBhIG1lcmdlIHdpdGgKK2FuIG9sZGVyIHZlcnNpb24gb2YgaXRzZWxmLCBsaWtlbHkgY29uZmxpY3QsIGFuZCBmYWlsLgorSXQgaXMgdW5kZXIgdGhlc2UgY29uZGl0aW9ucyB0aGF0IHlvdSB3b3VsZCB3YW50IHRvIHVzZQordGhlIGArYCBzaWduIHRvIGluZGljYXRlIG5vbi1mYXN0LWZvcndhcmQgdXBkYXRlcyB3aWxsCitiZSBuZWVkZWQuICBUaGVyZSBpcyBjdXJyZW50bHkgbm8gZWFzeSB3YXkgdG8gZGV0ZXJtaW5lCitvciBkZWNsYXJlIHRoYXQgYSBicmFuY2ggd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSBpbiBhCityZXBvc2l0b3J5IHdpdGggdGhpcyBiZWhhdmlvcjsgdGhlIHB1bGxpbmcgdXNlciBzaW1wbHkKK211c3Qga25vdyB0aGlzIGlzIHRoZSBleHBlY3RlZCB1c2FnZSBwYXR0ZXJuIGZvciBhIGJyYW5jaC4KKysKK1tOT1RFXQorWW91IG5ldmVyIGRvIHlvdXIgb3duIGRldmVsb3BtZW50IG9uIGJyYW5jaGVzIHRoYXQgYXBwZWFyCitvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIGEgPHJlZnNwZWM+IGNvbG9uIG9uIGBQdWxsOmAgbGluZXM7Cit0aGV5IGFyZSB0byBiZSB1cGRhdGVkIGJ5IGBnaXQtZmV0Y2hgLiAgSWYgeW91IGludGVuZCB0byBkbworZGV2ZWxvcG1lbnQgZGVyaXZlZCBmcm9tIGEgcmVtb3RlIGJyYW5jaCBgQmAsIGhhdmUgYSBgUHVsbDpgCitsaW5lIHRvIHRyYWNrIGl0IChpLmUuIGBQdWxsOiBCOnJlbW90ZS1CYCksIGFuZCBoYXZlIGEgc2VwYXJhdGUKK2JyYW5jaCBgbXktQmAgdG8gZG8geW91ciBkZXZlbG9wbWVudCBvbiB0b3Agb2YgaXQuICBUaGUgbGF0dGVyCitpcyBjcmVhdGVkIGJ5IGBnaXQgYnJhbmNoIG15LUIgcmVtb3RlLUJgIChvciBpdHMgZXF1aXZhbGVudCBgZ2l0CitjaGVja291dCAtYiBteS1CIHJlbW90ZS1CYCkuICBSdW4gYGdpdCBmZXRjaGAgdG8ga2VlcCB0cmFjayBvZgordGhlIHByb2dyZXNzIG9mIHRoZSByZW1vdGUgc2lkZSwgYW5kIHdoZW4geW91IHNlZSBzb21ldGhpbmcgbmV3CitvbiB0aGUgcmVtb3RlIGJyYW5jaCwgbWVyZ2UgaXQgaW50byB5b3VyIGRldmVsb3BtZW50IGJyYW5jaCB3aXRoCitgZ2l0IHB1bGwgLiByZW1vdGUtQmAsIHdoaWxlIHlvdSBhcmUgb24gYG15LUJgIGJyYW5jaC4KKysKK1tOT1RFXQorVGhlcmUgaXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gbGlzdGluZyBtdWx0aXBsZSA8cmVmc3BlYz4KK2RpcmVjdGx5IG9uIGBnaXQtcHVsbGAgY29tbWFuZCBsaW5lIGFuZCBoYXZpbmcgbXVsdGlwbGUKK2BQdWxsOmAgPHJlZnNwZWM+IGxpbmVzIGZvciBhIDxyZXBvc2l0b3J5PiBhbmQgcnVubmluZworYGdpdC1wdWxsYCBjb21tYW5kIHdpdGhvdXQgYW55IGV4cGxpY2l0IDxyZWZzcGVjPiBwYXJhbWV0ZXJzLgorPHJlZnNwZWM+IGxpc3RlZCBleHBsaWNpdGx5IG9uIHRoZSBjb21tYW5kIGxpbmUgYXJlIGFsd2F5cworbWVyZ2VkIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoIGFmdGVyIGZldGNoaW5nLiAgSW4gb3RoZXIgd29yZHMsCitpZiB5b3UgbGlzdCBtb3JlIHRoYW4gb25lIHJlbW90ZSByZWZzLCB5b3Ugd291bGQgYmUgbWFraW5nCithbiBPY3RvcHVzLiAgV2hpbGUgYGdpdC1wdWxsYCBydW4gd2l0aG91dCBhbnkgZXhwbGljaXQgPHJlZnNwZWM+CitwYXJhbWV0ZXIgdGFrZXMgZGVmYXVsdCA8cmVmc3BlYz5zIGZyb20gYFB1bGw6YCBsaW5lcywgaXQKK21lcmdlcyBvbmx5IHRoZSBmaXJzdCA8cmVmc3BlYz4gZm91bmQgaW50byB0aGUgY3VycmVudCBicmFuY2gsCithZnRlciBmZXRjaGluZyBhbGwgdGhlIHJlbW90ZSByZWZzLiAgVGhpcyBpcyBiZWNhdXNlIG1ha2luZyBhbgorT2N0b3B1cyBmcm9tIHJlbW90ZSByZWZzIGlzIHJhcmVseSBkb25lLCB3aGlsZSBrZWVwaW5nIHRyYWNrCitvZiBtdWx0aXBsZSByZW1vdGUgaGVhZHMgaW4gb25lLWdvIGJ5IGZldGNoaW5nIG1vcmUgdGhhbiBvbmUKK2lzIG9mdGVuIHVzZWZ1bC4KKysKK1NvbWUgc2hvcnQtY3V0IG5vdGF0aW9ucyBhcmUgYWxzbyBzdXBwb3J0ZWQuCisrCisqIGB0YWcgPHRhZz5gIG1lYW5zIHRoZSBzYW1lIGFzIGByZWZzL3RhZ3MvPHRhZz46cmVmcy90YWdzLzx0YWc+YDsKKyAgaXQgcmVxdWVzdHMgZmV0Y2hpbmcgZXZlcnl0aGluZyB1cCB0byB0aGUgZ2l2ZW4gdGFnLgorKiBBIHBhcmFtZXRlciA8cmVmPiB3aXRob3V0IGEgY29sb24gaXMgZXF1aXZhbGVudCB0bworICA8cmVmPjogd2hlbiBwdWxsaW5nL2ZldGNoaW5nLCBzbyBpdCBtZXJnZXMgPHJlZj4gaW50byB0aGUgY3VycmVudAorICBicmFuY2ggd2l0aG91dCBzdG9yaW5nIHRoZSByZW1vdGUgYnJhbmNoIGFueXdoZXJlIGxvY2FsbHkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcmVwb3NpdG9yeS1sYXlvdXQudHh0IGIvRG9jdW1lbnRhdGlvbi9yZXBvc2l0b3J5LWxheW91dC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkzOTEzMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vcmVwb3NpdG9yeS1sYXlvdXQudHh0CkBAIC0wLDAgKzEsMTc5IEBACitnaXQgcmVwb3NpdG9yeSBsYXlvdXQKKz09PT09PT09PT09PT09PT09PT09PQorCitZb3UgbWF5IGZpbmQgdGhlc2UgdGhpbmdzIGluIHlvdXIgZ2l0IHJlcG9zaXRvcnkgKGAuZ2l0YAorZGlyZWN0b3J5IGZvciBhIHJlcG9zaXRvcnkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgd29ya2luZyB0cmVlLCBvcgorYCdwcm9qZWN0Jy5naXRgIGRpcmVjdG9yeSBmb3IgYSBwdWJsaWMgJ2JhcmUnIHJlcG9zaXRvcnkpLgorCitvYmplY3RzOjoKKwlPYmplY3Qgc3RvcmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVwb3NpdG9yeS4gIFVzdWFsbHkKKwlhbiBvYmplY3Qgc3RvcmUgaXMgc2VsZiBzdWZmaWNpZW50IChpLmUuIGFsbCB0aGUgb2JqZWN0cworCXRoYXQgYXJlIHJlZmVycmVkIHRvIGJ5IGFuIG9iamVjdCBmb3VuZCBpbiBpdCBhcmUgYWxzbworCWZvdW5kIGluIGl0KSwgYnV0IHRoZXJlIGFyZSBjb3VwbGUgb2Ygd2F5cyB0byB2aW9sYXRlCisJaXQuCisrCisuIFlvdSBjb3VsZCBwb3B1bGF0ZSB0aGUgcmVwb3NpdG9yeSBieSBydW5uaW5nIGEgY29tbWl0IHdhbGtlcgord2l0aG91dCBgLWFgIG9wdGlvbi4gIERlcGVuZGluZyBvbiB3aGljaCBvcHRpb25zIGFyZSBnaXZlbiwgeW91Citjb3VsZCBoYXZlIG9ubHkgY29tbWl0IG9iamVjdHMgd2l0aG91dCBhc3NvY2lhdGVkIGJsb2JzIGFuZAordHJlZXMgdGhpcyB3YXksIGZvciBleGFtcGxlLiAgQSByZXBvc2l0b3J5IHdpdGggdGhpcyBraW5kIG9mCitpbmNvbXBsZXRlIG9iamVjdCBzdG9yZSBpcyBub3Qgc3VpdGFibGUgdG8gYmUgcHVibGlzaGVkIHRvIHRoZQorb3V0c2lkZSB3b3JsZCBidXQgc29tZXRpbWVzIHVzZWZ1bCBmb3IgcHJpdmF0ZSByZXBvc2l0b3J5LgorLiBZb3UgYWxzbyBjb3VsZCBoYXZlIGFuIGluY29tcGxldGUgYnV0IGxvY2FsbHkgdXNhYmxlIHJlcG9zaXRvcnkKK2J5IGNsb25pbmcgc2hhbGxvd2x5LiAgU2VlIGxpbmtnaXQ6Z2l0LWNsb25lWzFdLgorLiBZb3UgY2FuIGJlIHVzaW5nIGBvYmplY3RzL2luZm8vYWx0ZXJuYXRlc2AgbWVjaGFuaXNtLCBvcgorYCRHSVRfQUxURVJOQVRFX09CSkVDVF9ESVJFQ1RPUklFU2AgbWVjaGFuaXNtIHRvICdib3Jyb3cnCitvYmplY3RzIGZyb20gb3RoZXIgb2JqZWN0IHN0b3Jlcy4gIEEgcmVwb3NpdG9yeSB3aXRoIHRoaXMga2luZAorb2YgaW5jb21wbGV0ZSBvYmplY3Qgc3RvcmUgaXMgbm90IHN1aXRhYmxlIHRvIGJlIHB1Ymxpc2hlZCBmb3IKK3VzZSB3aXRoIGR1bWIgdHJhbnNwb3J0cyBidXQgb3RoZXJ3aXNlIGlzIE9LIGFzIGxvbmcgYXMKK2BvYmplY3RzL2luZm8vYWx0ZXJuYXRlc2AgcG9pbnRzIGF0IHRoZSByaWdodCBvYmplY3Qgc3RvcmVzCitpdCBib3Jyb3dzIGZyb20uCisKK29iamVjdHMvWzAtOWEtZl1bMC05YS1mXTo6CisJVHJhZGl0aW9uYWxseSwgZWFjaCBvYmplY3QgaXMgc3RvcmVkIGluIGl0cyBvd24gZmlsZS4KKwlUaGV5IGFyZSBzcGxpdCBpbnRvIDI1NiBzdWJkaXJlY3RvcmllcyB1c2luZyB0aGUgZmlyc3QKKwl0d28gbGV0dGVycyBmcm9tIGl0cyBvYmplY3QgbmFtZSB0byBrZWVwIHRoZSBudW1iZXIgb2YKKwlkaXJlY3RvcnkgZW50cmllcyBgb2JqZWN0c2AgZGlyZWN0b3J5IGl0c2VsZiBuZWVkcyB0bworCWhvbGQuICBPYmplY3RzIGZvdW5kIGhlcmUgYXJlIG9mdGVuIGNhbGxlZCAndW5wYWNrZWQnCisJKG9yICdsb29zZScpIG9iamVjdHMuCisKK29iamVjdHMvcGFjazo6CisJUGFja3MgKGZpbGVzIHRoYXQgc3RvcmUgbWFueSBvYmplY3QgaW4gY29tcHJlc3NlZCBmb3JtLAorCWFsb25nIHdpdGggaW5kZXggZmlsZXMgdG8gYWxsb3cgdGhlbSB0byBiZSByYW5kb21seQorCWFjY2Vzc2VkKSBhcmUgZm91bmQgaW4gdGhpcyBkaXJlY3RvcnkuCisKK29iamVjdHMvaW5mbzo6CisJQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IHN0b3JlIGlzCisJcmVjb3JkZWQgaW4gdGhpcyBkaXJlY3RvcnkuCisKK29iamVjdHMvaW5mby9wYWNrczo6CisJVGhpcyBmaWxlIGlzIHRvIGhlbHAgZHVtYiB0cmFuc3BvcnRzIGRpc2NvdmVyIHdoYXQgcGFja3MKKwlhcmUgYXZhaWxhYmxlIGluIHRoaXMgb2JqZWN0IHN0b3JlLiAgV2hlbmV2ZXIgYSBwYWNrIGlzCisJYWRkZWQgb3IgcmVtb3ZlZCwgYGdpdCB1cGRhdGUtc2VydmVyLWluZm9gIHNob3VsZCBiZSBydW4KKwl0byBrZWVwIHRoaXMgZmlsZSB1cC10by1kYXRlIGlmIHRoZSByZXBvc2l0b3J5IGlzCisJcHVibGlzaGVkIGZvciBkdW1iIHRyYW5zcG9ydHMuICBgZ2l0IHJlcGFja2AgZG9lcyB0aGlzCisJYnkgZGVmYXVsdC4KKworb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXM6OgorCVRoaXMgZmlsZSByZWNvcmRzIHBhdGhzIHRvIGFsdGVybmF0ZSBvYmplY3Qgc3RvcmVzIHRoYXQKKwl0aGlzIG9iamVjdCBzdG9yZSBib3Jyb3dzIG9iamVjdHMgZnJvbSwgb25lIHBhdGhuYW1lIHBlcgorCWxpbmUuIE5vdGUgdGhhdCBub3Qgb25seSBuYXRpdmUgR2l0IHRvb2xzIHVzZSBpdCBsb2NhbGx5LAorCWJ1dCB0aGUgSFRUUCBmZXRjaGVyIGFsc28gdHJpZXMgdG8gdXNlIGl0IHJlbW90ZWx5OyB0aGlzCisJd2lsbCB1c3VhbGx5IHdvcmsgaWYgeW91IGhhdmUgcmVsYXRpdmUgcGF0aHMgKHJlbGF0aXZlCisJdG8gdGhlIG9iamVjdCBkYXRhYmFzZSwgbm90IHRvIHRoZSByZXBvc2l0b3J5ISkgaW4geW91cgorCWFsdGVybmF0ZXMgZmlsZSwgYnV0IGl0IHdpbGwgbm90IHdvcmsgaWYgeW91IHVzZSBhYnNvbHV0ZQorCXBhdGhzIHVubGVzcyB0aGUgYWJzb2x1dGUgcGF0aCBpbiBmaWxlc3lzdGVtIGFuZCB3ZWIgVVJMCisJaXMgdGhlIHNhbWUuIFNlZSBhbHNvICdvYmplY3RzL2luZm8vaHR0cC1hbHRlcm5hdGVzJy4KKworb2JqZWN0cy9pbmZvL2h0dHAtYWx0ZXJuYXRlczo6CisJVGhpcyBmaWxlIHJlY29yZHMgVVJMcyB0byBhbHRlcm5hdGUgb2JqZWN0IHN0b3JlcyB0aGF0CisJdGhpcyBvYmplY3Qgc3RvcmUgYm9ycm93cyBvYmplY3RzIGZyb20sIHRvIGJlIHVzZWQgd2hlbgorCXRoZSByZXBvc2l0b3J5IGlzIGZldGNoZWQgb3ZlciBIVFRQLgorCityZWZzOjoKKwlSZWZlcmVuY2VzIGFyZSBzdG9yZWQgaW4gc3ViZGlyZWN0b3JpZXMgb2YgdGhpcworCWRpcmVjdG9yeS4gIFRoZSBgZ2l0IHBydW5lYCBjb21tYW5kIGtub3dzIHRvIGtlZXAKKwlvYmplY3RzIHJlYWNoYWJsZSBmcm9tIHJlZnMgZm91bmQgaW4gdGhpcyBkaXJlY3RvcnkgYW5kCisJaXRzIHN1YmRpcmVjdG9yaWVzLgorCityZWZzL2hlYWRzL2BuYW1lYDo6CisJcmVjb3JkcyB0aXAtb2YtdGhlLXRyZWUgY29tbWl0IG9iamVjdHMgb2YgYnJhbmNoIGBuYW1lYAorCityZWZzL3RhZ3MvYG5hbWVgOjoKKwlyZWNvcmRzIGFueSBvYmplY3QgbmFtZSAobm90IG5lY2Vzc2FyaWx5IGEgY29tbWl0CisJb2JqZWN0LCBvciBhIHRhZyBvYmplY3QgdGhhdCBwb2ludHMgYXQgYSBjb21taXQgb2JqZWN0KS4KKworcmVmcy9yZW1vdGVzL2BuYW1lYDo6CisJcmVjb3JkcyB0aXAtb2YtdGhlLXRyZWUgY29tbWl0IG9iamVjdHMgb2YgYnJhbmNoZXMgY29waWVkCisJZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5LgorCitwYWNrZWQtcmVmczo6CisJcmVjb3JkcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyByZWZzL2hlYWRzLywgcmVmcy90YWdzLywKKwlhbmQgZnJpZW5kcyByZWNvcmQgaW4gYSBtb3JlIGVmZmljaWVudCB3YXkuICBTZWUKKwlsaW5rZ2l0OmdpdC1wYWNrLXJlZnNbMV0uCisKK0hFQUQ6OgorCUEgc3ltcmVmIChzZWUgZ2xvc3NhcnkpIHRvIHRoZSBgcmVmcy9oZWFkcy9gIG5hbWVzcGFjZQorCWRlc2NyaWJpbmcgdGhlIGN1cnJlbnRseSBhY3RpdmUgYnJhbmNoLiAgSXQgZG9lcyBub3QgbWVhbgorCW11Y2ggaWYgdGhlIHJlcG9zaXRvcnkgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgd29ya2luZyB0cmVlCisJKGkuZS4gYSAnYmFyZScgcmVwb3NpdG9yeSksIGJ1dCBhIHZhbGlkIGdpdCByZXBvc2l0b3J5CisJKm11c3QqIGhhdmUgdGhlIEhFQUQgZmlsZTsgc29tZSBwb3JjZWxhaW5zIG1heSB1c2UgaXQgdG8KKwlndWVzcyB0aGUgZGVzaWduYXRlZCAiZGVmYXVsdCIgYnJhbmNoIG9mIHRoZSByZXBvc2l0b3J5CisJKHVzdWFsbHkgJ21hc3RlcicpLiAgSXQgaXMgbGVnYWwgaWYgdGhlIG5hbWVkIGJyYW5jaAorCSduYW1lJyBkb2VzIG5vdCAoeWV0KSBleGlzdC4gIEluIHNvbWUgbGVnYWN5IHNldHVwcywgaXQgaXMKKwlhIHN5bWJvbGljIGxpbmsgaW5zdGVhZCBvZiBhIHN5bXJlZiB0aGF0IHBvaW50cyBhdCB0aGUgY3VycmVudAorCWJyYW5jaC4KKysKK0hFQUQgY2FuIGFsc28gcmVjb3JkIGEgc3BlY2lmaWMgY29tbWl0IGRpcmVjdGx5LCBpbnN0ZWFkIG9mCitiZWluZyBhIHN5bXJlZiB0byBwb2ludCBhdCB0aGUgY3VycmVudCBicmFuY2guICBTdWNoIGEgc3RhdGUKK2lzIG9mdGVuIGNhbGxlZCAnZGV0YWNoZWQgSEVBRCcsIGFuZCBhbG1vc3QgYWxsIGNvbW1hbmRzIHdvcmsKK2lkZW50aWNhbGx5IGFzIG5vcm1hbC4gIFNlZSBsaW5rZ2l0OmdpdC1jaGVja291dFsxXSBmb3IKK2RldGFpbHMuCisKK2JyYW5jaGVzOjoKKwlBIHNsaWdodGx5IGRlcHJlY2F0ZWQgd2F5IHRvIHN0b3JlIHNob3J0aGFuZHMgdG8gYmUgdXNlZAorCXRvIHNwZWNpZnkgVVJMIHRvIGBnaXQgZmV0Y2hgLCBgZ2l0IHB1bGxgIGFuZCBgZ2l0IHB1c2hgCisJY29tbWFuZHMgaXMgdG8gc3RvcmUgYSBmaWxlIGluIGBicmFuY2hlcy8nbmFtZSdgIGFuZAorCWdpdmUgJ25hbWUnIHRvIHRoZXNlIGNvbW1hbmRzIGluIHBsYWNlIG9mICdyZXBvc2l0b3J5JworCWFyZ3VtZW50LgorCitob29rczo6CisJSG9va3MgYXJlIGN1c3RvbWl6YXRpb24gc2NyaXB0cyB1c2VkIGJ5IHZhcmlvdXMgZ2l0CisJY29tbWFuZHMuICBBIGhhbmRmdWwgb2Ygc2FtcGxlIGhvb2tzIGFyZSBpbnN0YWxsZWQgd2hlbgorCWBnaXQgaW5pdGAgaXMgcnVuLCBidXQgYWxsIG9mIHRoZW0gYXJlIGRpc2FibGVkIGJ5CisJZGVmYXVsdC4gIFRvIGVuYWJsZSwgdGhleSBuZWVkIHRvIGJlIG1hZGUgZXhlY3V0YWJsZS4KKwlSZWFkIGxpbms6aG9va3MuaHRtbFtob29rc10gZm9yIG1vcmUgZGV0YWlscyBhYm91dAorCWVhY2ggaG9vay4KKworaW5kZXg6OgorCVRoZSBjdXJyZW50IGluZGV4IGZpbGUgZm9yIHRoZSByZXBvc2l0b3J5LiAgSXQgaXMKKwl1c3VhbGx5IG5vdCBmb3VuZCBpbiBhIGJhcmUgcmVwb3NpdG9yeS4KKworaW5mbzo6CisJQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVwb3NpdG9yeSBpcyByZWNvcmRlZAorCWluIHRoaXMgZGlyZWN0b3J5LgorCitpbmZvL3JlZnM6OgorCVRoaXMgZmlsZSBoZWxwcyBkdW1iIHRyYW5zcG9ydHMgZGlzY292ZXIgd2hhdCByZWZzIGFyZQorCWF2YWlsYWJsZSBpbiB0aGlzIHJlcG9zaXRvcnkuICBJZiB0aGUgcmVwb3NpdG9yeSBpcworCXB1Ymxpc2hlZCBmb3IgZHVtYiB0cmFuc3BvcnRzLCB0aGlzIGZpbGUgc2hvdWxkIGJlCisJcmVnZW5lcmF0ZWQgYnkgYGdpdCB1cGRhdGUtc2VydmVyLWluZm9gIGV2ZXJ5IHRpbWUgYSB0YWcKKwlvciBicmFuY2ggaXMgY3JlYXRlZCBvciBtb2RpZmllZC4gIFRoaXMgaXMgbm9ybWFsbHkgZG9uZQorCWZyb20gdGhlIGBob29rcy91cGRhdGVgIGhvb2ssIHdoaWNoIGlzIHJ1biBieSB0aGUKKwlgZ2l0LXJlY2VpdmUtcGFja2AgY29tbWFuZCB3aGVuIHlvdSBgZ2l0IHB1c2hgIGludG8gdGhlCisJcmVwb3NpdG9yeS4KKworaW5mby9ncmFmdHM6OgorCVRoaXMgZmlsZSByZWNvcmRzIGZha2UgY29tbWl0IGFuY2VzdHJ5IGluZm9ybWF0aW9uLCB0bworCXByZXRlbmQgdGhlIHNldCBvZiBwYXJlbnRzIGEgY29tbWl0IGhhcyBpcyBkaWZmZXJlbnQKKwlmcm9tIGhvdyB0aGUgY29tbWl0IHdhcyBhY3R1YWxseSBjcmVhdGVkLiAgT25lIHJlY29yZAorCXBlciBsaW5lIGRlc2NyaWJlcyBhIGNvbW1pdCBhbmQgaXRzIGZha2UgcGFyZW50cyBieQorCWxpc3RpbmcgdGhlaXIgNDAtYnl0ZSBoZXhhZGVjaW1hbCBvYmplY3QgbmFtZXMgc2VwYXJhdGVkCisJYnkgYSBzcGFjZSBhbmQgdGVybWluYXRlZCBieSBhIG5ld2xpbmUuCisKK2luZm8vZXhjbHVkZTo6CisJVGhpcyBmaWxlLCBieSBjb252ZW50aW9uIGFtb25nIFBvcmNlbGFpbnMsIHN0b3JlcyB0aGUKKwlleGNsdWRlIHBhdHRlcm4gbGlzdC4gYC5naXRpZ25vcmVgIGlzIHRoZSBwZXItZGlyZWN0b3J5CisJaWdub3JlIGZpbGUuICBgZ2l0IHN0YXR1c2AsIGBnaXQgYWRkYCwgYGdpdCBybWAgYW5kIGBnaXQKKwljbGVhbmAgbG9vayBhdCBpdCBidXQgdGhlIGNvcmUgZ2l0IGNvbW1hbmRzIGRvIG5vdCBsb29rCisJYXQgaXQuICBTZWUgYWxzbzogbGlua2dpdDpnaXRpZ25vcmVbNV0uCisKK3JlbW90ZXM6OgorCVN0b3JlcyBzaG9ydGhhbmRzIHRvIGJlIHVzZWQgdG8gZ2l2ZSBVUkwgYW5kIGRlZmF1bHQKKwlyZWZuYW1lcyB0byBpbnRlcmFjdCB3aXRoIHJlbW90ZSByZXBvc2l0b3J5IHRvIGBnaXQKKwlmZXRjaGAsIGBnaXQgcHVsbGAgYW5kIGBnaXQgcHVzaGAgY29tbWFuZHMuCisKK2xvZ3M6OgorCVJlY29yZHMgb2YgY2hhbmdlcyBtYWRlIHRvIHJlZnMgYXJlIHN0b3JlZCBpbiB0aGlzCisJZGlyZWN0b3J5LiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uIGdpdC11cGRhdGUtcmVmCisJZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK2xvZ3MvcmVmcy9oZWFkcy9gbmFtZWA6OgorCVJlY29yZHMgYWxsIGNoYW5nZXMgbWFkZSB0byB0aGUgYnJhbmNoIHRpcCBuYW1lZCBgbmFtZWAuCisKK2xvZ3MvcmVmcy90YWdzL2BuYW1lYDo6CisJUmVjb3JkcyBhbGwgY2hhbmdlcyBtYWRlIHRvIHRoZSB0YWcgbmFtZWQgYG5hbWVgLgorCitzaGFsbG93OjoKKwlUaGlzIGlzIHNpbWlsYXIgdG8gYGluZm8vZ3JhZnRzYCBidXQgaXMgaW50ZXJuYWxseSB1c2VkCisJYW5kIG1haW50YWluZWQgYnkgc2hhbGxvdyBjbG9uZSBtZWNoYW5pc20uICBTZWUgYC0tZGVwdGhgCisJb3B0aW9uIHRvIGxpbmtnaXQ6Z2l0LWNsb25lWzFdIGFuZCBsaW5rZ2l0OmdpdC1mZXRjaFsxXS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcmV2LWxpc3Qtb3B0aW9ucy50eHQgYi9Eb2N1bWVudGF0aW9uL3Jldi1saXN0LW9wdGlvbnMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NDhhNTUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3Jldi1saXN0LW9wdGlvbnMudHh0CkBAIC0wLDAgKzEsMzY4IEBACitDb21taXQgRm9ybWF0dGluZworfn5+fn5+fn5+fn5+fn5+fn4KKworaWZkZWY6OmdpdC1yZXYtbGlzdFtdCitVc2luZyB0aGVzZSBvcHRpb25zLCBsaW5rZ2l0OmdpdC1yZXYtbGlzdFsxXSB3aWxsIGFjdCBzaW1pbGFyIHRvIHRoZQorbW9yZSBzcGVjaWFsaXplZCBmYW1pbHkgb2YgY29tbWl0IGxvZyB0b29sczogbGlua2dpdDpnaXQtbG9nWzFdLAorbGlua2dpdDpnaXQtc2hvd1sxXSwgYW5kIGxpbmtnaXQ6Z2l0LXdoYXRjaGFuZ2VkWzFdCitlbmRpZjo6Z2l0LXJldi1saXN0W10KKworaW5jbHVkZTo6cHJldHR5LW9wdGlvbnMudHh0W10KKworLS1yZWxhdGl2ZS1kYXRlOjoKKworCVN5bm9ueW0gZm9yIGAtLWRhdGU9cmVsYXRpdmVgLgorCistLWRhdGU9e3JlbGF0aXZlLGxvY2FsLGRlZmF1bHQsaXNvLHJmY306OgorCisJT25seSB0YWtlcyBlZmZlY3QgZm9yIGRhdGVzIHNob3duIGluIGh1bWFuLXJlYWRhYmxlIGZvcm1hdCwgc3VjaAorCWFzIHdoZW4gdXNpbmcgIi0tcHJldHR5Ii4KKysKK2AtLWRhdGU9cmVsYXRpdmVgIHNob3dzIGRhdGVzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHRpbWUsCitlLmcuICIyIGhvdXJzIGFnbyIuCisrCitgLS1kYXRlPWxvY2FsYCBzaG93cyB0aW1lc3RhbXBzIGluIHVzZXIncyBsb2NhbCB0aW1lem9uZS4KKysKK2AtLWRhdGU9aXNvYCAob3IgYC0tZGF0ZT1pc284NjAxYCkgc2hvd3MgdGltZXN0YW1wcyBpbiBJU08gODYwMSBmb3JtYXQuCisrCitgLS1kYXRlPXJmY2AgKG9yIGAtLWRhdGU9cmZjMjgyMmApIHNob3dzIHRpbWVzdGFtcHMgaW4gUkZDIDI4MjIKK2Zvcm1hdCwgb2Z0ZW4gZm91bmQgaW4gRS1tYWlsIG1lc3NhZ2VzLgorKworYC0tZGF0ZT1zaG9ydGAgc2hvd3Mgb25seSBkYXRlIGJ1dCBub3QgdGltZSwgaW4gYFlZWVktTU0tRERgIGZvcm1hdC4KKysKK2AtLWRhdGU9ZGVmYXVsdGAgc2hvd3MgdGltZXN0YW1wcyBpbiB0aGUgb3JpZ2luYWwgdGltZXpvbmUKKyhlaXRoZXIgY29tbWl0dGVyJ3Mgb3IgYXV0aG9yJ3MpLgorCistLWhlYWRlcjo6CisKKwlQcmludCB0aGUgY29udGVudHMgb2YgdGhlIGNvbW1pdCBpbiByYXctZm9ybWF0OyBlYWNoIHJlY29yZCBpcworCXNlcGFyYXRlZCB3aXRoIGEgTlVMIGNoYXJhY3Rlci4KKworLS1wYXJlbnRzOjoKKworCVByaW50IHRoZSBwYXJlbnRzIG9mIHRoZSBjb21taXQuCisKKy0tdGltZXN0YW1wOjoKKwlQcmludCB0aGUgcmF3IGNvbW1pdCB0aW1lc3RhbXAuCisKKy0tbGVmdC1yaWdodDo6CisKKwlNYXJrIHdoaWNoIHNpZGUgb2YgYSBzeW1tZXRyaWMgZGlmZiBhIGNvbW1pdCBpcyByZWFjaGFibGUgZnJvbS4KKwlDb21taXRzIGZyb20gdGhlIGxlZnQgc2lkZSBhcmUgcHJlZml4ZWQgd2l0aCBgPGAgYW5kIHRob3NlIGZyb20KKwl0aGUgcmlnaHQgd2l0aCBgPmAuICBJZiBjb21iaW5lZCB3aXRoIGAtLWJvdW5kYXJ5YCwgdGhvc2UKKwljb21taXRzIGFyZSBwcmVmaXhlZCB3aXRoIGAtYC4KKysKK0ZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0aGlzIHRvcG9sb2d5OgorKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICB5LS0tYi0tLWIgIGJyYW5jaCBCCisgICAgICAgICAgICAvIFwgLworICAgICAgICAgICAvICAgLgorICAgICAgICAgIC8gICAvIFwKKyAgICAgICAgIG8tLS14LS0tYS0tLWEgIGJyYW5jaCBBCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKworeW91IHdvdWxkIGdldCBhbiBvdXRwdXQgbGluZSB0aGlzOgorKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkkIGdpdCByZXYtbGlzdCAtLWxlZnQtcmlnaHQgLS1ib3VuZGFyeSAtLXByZXR0eT1vbmVsaW5lIEEuLi5CCisKKwk+YmJiYmJiYi4uLiAzcmQgb24gYgorCT5iYmJiYmJiLi4uIDJuZCBvbiBiCisJPGFhYWFhYWEuLi4gM3JkIG9uIGEKKwk8YWFhYWFhYS4uLiAybmQgb24gYQorCS15eXl5eXl5Li4uIDFzdCBvbiBiCisJLXh4eHh4eHguLi4gMXN0IG9uIGEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RpZmYgRm9ybWF0dGluZworfn5+fn5+fn5+fn5+fn5+CisKK0JlbG93IGFyZSBsaXN0ZWQgb3B0aW9ucyB0aGF0IGNvbnRyb2wgdGhlIGZvcm1hdHRpbmcgb2YgZGlmZiBvdXRwdXQuCitTb21lIG9mIHRoZW0gYXJlIHNwZWNpZmljIHRvIGxpbmtnaXQ6Z2l0LXJldi1saXN0WzFdLCBob3dldmVyIG90aGVyIGRpZmYKK29wdGlvbnMgbWF5IGJlIGdpdmVuLiBTZWUgbGlua2dpdDpnaXQtZGlmZi1maWxlc1sxXSBmb3IgbW9yZSBvcHRpb25zLgorCistYzo6CisKKwlUaGlzIGZsYWcgY2hhbmdlcyB0aGUgd2F5IGEgbWVyZ2UgY29tbWl0IGlzIGRpc3BsYXllZC4gIEl0IHNob3dzCisJdGhlIGRpZmZlcmVuY2VzIGZyb20gZWFjaCBvZiB0aGUgcGFyZW50cyB0byB0aGUgbWVyZ2UgcmVzdWx0CisJc2ltdWx0YW5lb3VzbHkgaW5zdGVhZCBvZiBzaG93aW5nIHBhaXJ3aXNlIGRpZmYgYmV0d2VlbiBhIHBhcmVudAorCWFuZCB0aGUgcmVzdWx0IG9uZSBhdCBhIHRpbWUuIEZ1cnRoZXJtb3JlLCBpdCBsaXN0cyBvbmx5IGZpbGVzCisJd2hpY2ggd2VyZSBtb2RpZmllZCBmcm9tIGFsbCBwYXJlbnRzLgorCistLWNjOjoKKworCVRoaXMgZmxhZyBpbXBsaWVzIHRoZSAnLWMnIG9wdGlvbnMgYW5kIGZ1cnRoZXIgY29tcHJlc3NlcyB0aGUKKwlwYXRjaCBvdXRwdXQgYnkgb21pdHRpbmcgaHVua3MgdGhhdCBzaG93IGRpZmZlcmVuY2VzIGZyb20gb25seQorCW9uZSBwYXJlbnQsIG9yIHNob3cgdGhlIHNhbWUgY2hhbmdlIGZyb20gYWxsIGJ1dCBvbmUgcGFyZW50IGZvcgorCWFuIE9jdG9wdXMgbWVyZ2UuCisKKy1yOjoKKworCVNob3cgcmVjdXJzaXZlIGRpZmZzLgorCistdDo6CisKKwlTaG93IHRoZSB0cmVlIG9iamVjdHMgaW4gdGhlIGRpZmYgb3V0cHV0LiBUaGlzIGltcGxpZXMgJy1yJy4KKworQ29tbWl0IExpbWl0aW5nCit+fn5+fn5+fn5+fn5+fn4KKworQmVzaWRlcyBzcGVjaWZ5aW5nIGEgcmFuZ2Ugb2YgY29tbWl0cyB0aGF0IHNob3VsZCBiZSBsaXN0ZWQgdXNpbmcgdGhlCitzcGVjaWFsIG5vdGF0aW9ucyBleHBsYWluZWQgaW4gdGhlIGRlc2NyaXB0aW9uLCBhZGRpdGlvbmFsIGNvbW1pdAorbGltaXRpbmcgbWF5IGJlIGFwcGxpZWQuCisKKy0tCisKKy1uICdudW1iZXInLCAtLW1heC1jb3VudD0nbnVtYmVyJzo6CisKKwlMaW1pdCB0aGUgbnVtYmVyIG9mIGNvbW1pdHMgb3V0cHV0LgorCistLXNraXA9J251bWJlcic6OgorCisJU2tpcCAnbnVtYmVyJyBjb21taXRzIGJlZm9yZSBzdGFydGluZyB0byBzaG93IHRoZSBjb21taXQgb3V0cHV0LgorCistLXNpbmNlPSdkYXRlJywgLS1hZnRlcj0nZGF0ZSc6OgorCisJU2hvdyBjb21taXRzIG1vcmUgcmVjZW50IHRoYW4gYSBzcGVjaWZpYyBkYXRlLgorCistLXVudGlsPSdkYXRlJywgLS1iZWZvcmU9J2RhdGUnOjoKKworCVNob3cgY29tbWl0cyBvbGRlciB0aGFuIGEgc3BlY2lmaWMgZGF0ZS4KKworaWZkZWY6OmdpdC1yZXYtbGlzdFtdCistLW1heC1hZ2U9J3RpbWVzdGFtcCcsIC0tbWluLWFnZT0ndGltZXN0YW1wJzo6CisKKwlMaW1pdCB0aGUgY29tbWl0cyBvdXRwdXQgdG8gc3BlY2lmaWVkIHRpbWUgcmFuZ2UuCitlbmRpZjo6Z2l0LXJldi1saXN0W10KKworLS1hdXRob3I9J3BhdHRlcm4nLCAtLWNvbW1pdHRlcj0ncGF0dGVybic6OgorCisJTGltaXQgdGhlIGNvbW1pdHMgb3V0cHV0IHRvIG9uZXMgd2l0aCBhdXRob3IvY29tbWl0dGVyCisJaGVhZGVyIGxpbmVzIHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZCBwYXR0ZXJuIChyZWd1bGFyIGV4cHJlc3Npb24pLgorCistLWdyZXA9J3BhdHRlcm4nOjoKKworCUxpbWl0IHRoZSBjb21taXRzIG91dHB1dCB0byBvbmVzIHdpdGggbG9nIG1lc3NhZ2UgdGhhdAorCW1hdGNoZXMgdGhlIHNwZWNpZmllZCBwYXR0ZXJuIChyZWd1bGFyIGV4cHJlc3Npb24pLgorCistaSwgLS1yZWdleHAtaWdub3JlLWNhc2U6OgorCisJTWF0Y2ggdGhlIHJlZ2V4cCBsaW1pdGluZyBwYXR0ZXJucyB3aXRob3V0IHJlZ2FyZCB0byBsZXR0ZXJzIGNhc2UuCisKKy1FLCAtLWV4dGVuZGVkLXJlZ2V4cDo6CisKKwlDb25zaWRlciB0aGUgbGltaXRpbmcgcGF0dGVybnMgdG8gYmUgZXh0ZW5kZWQgcmVndWxhciBleHByZXNzaW9ucworCWluc3RlYWQgb2YgdGhlIGRlZmF1bHQgYmFzaWMgcmVndWxhciBleHByZXNzaW9ucy4KKworLUYsIC0tZml4ZWQtc3RyaW5nczo6CisKKwlDb25zaWRlciB0aGUgbGltaXRpbmcgcGF0dGVybnMgdG8gYmUgZml4ZWQgc3RyaW5ncyAoZG9uJ3QgaW50ZXJwcmV0CisJcGF0dGVybiBhcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbikuCisKKy0tcmVtb3ZlLWVtcHR5OjoKKworCVN0b3Agd2hlbiBhIGdpdmVuIHBhdGggZGlzYXBwZWFycyBmcm9tIHRoZSB0cmVlLgorCistLWZ1bGwtaGlzdG9yeTo6CisKKwlTaG93IGFsc28gcGFydHMgb2YgaGlzdG9yeSBpcnJlbGV2YW50IHRvIGN1cnJlbnQgc3RhdGUgb2YgYSBnaXZlbgorCXBhdGguIFRoaXMgdHVybnMgb2ZmIGhpc3Rvcnkgc2ltcGxpZmljYXRpb24sIHdoaWNoIHJlbW92ZWQgbWVyZ2VzCisJd2hpY2ggZGlkbid0IGNoYW5nZSBhbnl0aGluZyBhdCBhbGwgYXQgc29tZSBjaGlsZC4gSXQgd2lsbCBzdGlsbCBhY3R1YWxseQorCXNpbXBsaWZ5IGF3YXkgbWVyZ2VzIHRoYXQgZGlkbid0IGNoYW5nZSBhbnl0aGluZyBhdCBhbGwgaW50byBlaXRoZXIKKwljaGlsZC4KKworLS1uby1tZXJnZXM6OgorCisJRG8gbm90IHByaW50IGNvbW1pdHMgd2l0aCBtb3JlIHRoYW4gb25lIHBhcmVudC4KKworLS1maXJzdC1wYXJlbnQ6OgorCUZvbGxvdyBvbmx5IHRoZSBmaXJzdCBwYXJlbnQgY29tbWl0IHVwb24gc2VlaW5nIGEgbWVyZ2UKKwljb21taXQuICBUaGlzIG9wdGlvbiBjYW4gZ2l2ZSBhIGJldHRlciBvdmVydmlldyB3aGVuCisJdmlld2luZyB0aGUgZXZvbHV0aW9uIG9mIGEgcGFydGljdWxhciB0b3BpYyBicmFuY2gsCisJYmVjYXVzZSBtZXJnZXMgaW50byBhIHRvcGljIGJyYW5jaCB0ZW5kIHRvIGJlIG9ubHkgYWJvdXQKKwlhZGp1c3RpbmcgdG8gdXBkYXRlZCB1cHN0cmVhbSBmcm9tIHRpbWUgdG8gdGltZSwgYW5kCisJdGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBpZ25vcmUgdGhlIGluZGl2aWR1YWwgY29tbWl0cworCWJyb3VnaHQgaW4gdG8geW91ciBoaXN0b3J5IGJ5IHN1Y2ggYSBtZXJnZS4KKworLS1ub3Q6OgorCisJUmV2ZXJzZXMgdGhlIG1lYW5pbmcgb2YgdGhlICd7Y2FyZXR9JyBwcmVmaXggKG9yIGxhY2sgdGhlcmVvZikKKwlmb3IgYWxsIGZvbGxvd2luZyByZXZpc2lvbiBzcGVjaWZpZXJzLCB1cCB0byB0aGUgbmV4dCAnLS1ub3QnLgorCistLWFsbDo6CisKKwlQcmV0ZW5kIGFzIGlmIGFsbCB0aGUgcmVmcyBpbiBgJEdJVF9ESVIvcmVmcy9gIGFyZSBsaXN0ZWQgb24gdGhlCisJY29tbWFuZCBsaW5lIGFzICc8Y29tbWl0PicuCisKKy0tc3RkaW46OgorCisJSW4gYWRkaXRpb24gdG8gdGhlICc8Y29tbWl0PicgbGlzdGVkIG9uIHRoZSBjb21tYW5kCisJbGluZSwgcmVhZCB0aGVtIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0LgorCistLXF1aWV0OjoKKworCURvbid0IHByaW50IGFueXRoaW5nIHRvIHN0YW5kYXJkIG91dHB1dC4gIFRoaXMgZm9ybQorCWlzIHByaW1hcmlseSBtZWFudCB0byBhbGxvdyB0aGUgY2FsbGVyIHRvCisJdGVzdCB0aGUgZXhpdCBzdGF0dXMgdG8gc2VlIGlmIGEgcmFuZ2Ugb2Ygb2JqZWN0cyBpcyBmdWxseQorCWNvbm5lY3RlZCAob3Igbm90KS4gIEl0IGlzIGZhc3RlciB0aGFuIHJlZGlyZWN0aW5nIHN0ZG91dAorCXRvIC9kZXYvbnVsbCBhcyB0aGUgb3V0cHV0IGRvZXMgbm90IGhhdmUgdG8gYmUgZm9ybWF0dGVkLgorCistLWNoZXJyeS1waWNrOjoKKworCU9taXQgYW55IGNvbW1pdCB0aGF0IGludHJvZHVjZXMgdGhlIHNhbWUgY2hhbmdlIGFzCisJYW5vdGhlciBjb21taXQgb24gdGhlICJvdGhlciBzaWRlIiB3aGVuIHRoZSBzZXQgb2YKKwljb21taXRzIGFyZSBsaW1pdGVkIHdpdGggc3ltbWV0cmljIGRpZmZlcmVuY2UuCisrCitGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIGJyYW5jaGVzLCBgQWAgYW5kIGBCYCwgYSB1c3VhbCB3YXkKK3RvIGxpc3QgYWxsIGNvbW1pdHMgb24gb25seSBvbmUgc2lkZSBvZiB0aGVtIGlzIHdpdGgKK2AtLWxlZnQtcmlnaHRgLCBsaWtlIHRoZSBleGFtcGxlIGFib3ZlIGluIHRoZSBkZXNjcmlwdGlvbiBvZgordGhhdCBvcHRpb24uICBJdCBob3dldmVyIHNob3dzIHRoZSBjb21taXRzIHRoYXQgd2VyZSBjaGVycnktcGlja2VkCitmcm9tIHRoZSBvdGhlciBicmFuY2ggKGZvciBleGFtcGxlLCAiM3JkIG9uIGIiIG1heSBiZSBjaGVycnktcGlja2VkCitmcm9tIGJyYW5jaCBBKS4gIFdpdGggdGhpcyBvcHRpb24sIHN1Y2ggcGFpcnMgb2YgY29tbWl0cyBhcmUKK2V4Y2x1ZGVkIGZyb20gdGhlIG91dHB1dC4KKworLWcsIC0td2Fsay1yZWZsb2dzOjoKKworCUluc3RlYWQgb2Ygd2Fsa2luZyB0aGUgY29tbWl0IGFuY2VzdHJ5IGNoYWluLCB3YWxrCisJcmVmbG9nIGVudHJpZXMgZnJvbSB0aGUgbW9zdCByZWNlbnQgb25lIHRvIG9sZGVyIG9uZXMuCisJV2hlbiB0aGlzIG9wdGlvbiBpcyB1c2VkIHlvdSBjYW5ub3Qgc3BlY2lmeSBjb21taXRzIHRvCisJZXhjbHVkZSAodGhhdCBpcywgJ3tjYXJldH1jb21taXQnLCAnY29tbWl0MS4uY29tbWl0MicsCisJbm9yICdjb21taXQxLi4uY29tbWl0Micgbm90YXRpb25zIGNhbm5vdCBiZSB1c2VkKS4KKysKK1dpdGggJ1wtLXByZXR0eScgZm9ybWF0IG90aGVyIHRoYW4gb25lbGluZSAoZm9yIG9idmlvdXMgcmVhc29ucyksCit0aGlzIGNhdXNlcyB0aGUgb3V0cHV0IHRvIGhhdmUgdHdvIGV4dHJhIGxpbmVzIG9mIGluZm9ybWF0aW9uCit0YWtlbiBmcm9tIHRoZSByZWZsb2cuICBCeSBkZWZhdWx0LCAnY29tbWl0QFx7TnRofScgbm90YXRpb24gaXMKK3VzZWQgaW4gdGhlIG91dHB1dC4gIFdoZW4gdGhlIHN0YXJ0aW5nIGNvbW1pdCBpcyBzcGVjaWZpZWQgYXMKKydjb21taXRAe25vd30nLCBvdXRwdXQgYWxzbyB1c2VzICdjb21taXRAXHt0aW1lc3RhbXB9JyBub3RhdGlvbgoraW5zdGVhZC4gIFVuZGVyICdcLS1wcmV0dHk9b25lbGluZScsIHRoZSBjb21taXQgbWVzc2FnZSBpcworcHJlZml4ZWQgd2l0aCB0aGlzIGluZm9ybWF0aW9uIG9uIHRoZSBzYW1lIGxpbmUuCisKK0Nhbm5vdCBiZSBjb21iaW5lZCB3aXRoICdcLS1yZXZlcnNlJy4KK1NlZSBhbHNvIGxpbmtnaXQ6Z2l0LXJlZmxvZ1sxXS4KKworLS1tZXJnZTo6CisKKwlBZnRlciBhIGZhaWxlZCBtZXJnZSwgc2hvdyByZWZzIHRoYXQgdG91Y2ggZmlsZXMgaGF2aW5nIGEKKwljb25mbGljdCBhbmQgZG9uJ3QgZXhpc3Qgb24gYWxsIGhlYWRzIHRvIG1lcmdlLgorCistLWJvdW5kYXJ5OjoKKworCU91dHB1dCB1bmludGVyZXN0aW5nIGNvbW1pdHMgYXQgdGhlIGJvdW5kYXJ5LCB3aGljaCBhcmUgdXN1YWxseQorCW5vdCBzaG93bi4KKworLS1kZW5zZSwgLS1zcGFyc2U6OgorCitXaGVuIG9wdGlvbmFsIHBhdGhzIGFyZSBnaXZlbiwgdGhlIGRlZmF1bHQgYmVoYXZpb3VyICgnLS1kZW5zZScpIGlzIHRvCitvbmx5IG91dHB1dCBjb21taXRzIHRoYXQgY2hhbmdlcyBhdCBsZWFzdCBvbmUgb2YgdGhlbSwgYW5kIGFsc28gaWdub3JlCittZXJnZXMgdGhhdCBkbyBub3QgdG91Y2ggdGhlIGdpdmVuIHBhdGhzLgorCitVc2UgdGhlICctLXNwYXJzZScgZmxhZyB0byBtYWtlcyB0aGUgY29tbWFuZCBvdXRwdXQgYWxsIGVsaWdpYmxlIGNvbW1pdHMKKyhzdGlsbCBzdWJqZWN0IHRvIGNvdW50IGFuZCBhZ2UgbGltaXRhdGlvbiksIGJ1dCBhcHBseSBtZXJnZQorc2ltcGxpZmljYXRpb24gbmV2ZXJ0aGVsZXNzLgorCitpZmRlZjo6Z2l0LXJldi1saXN0W10KKy0tYmlzZWN0OjoKKworTGltaXQgb3V0cHV0IHRvIHRoZSBvbmUgY29tbWl0IG9iamVjdCB3aGljaCBpcyByb3VnaGx5IGhhbGZ3YXkgYmV0d2VlbgordGhlIGluY2x1ZGVkIGFuZCBleGNsdWRlZCBjb21taXRzLiBUaHVzLCBpZgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSQgZ2l0LXJldi1saXN0IC0tYmlzZWN0IGZvbyBeYmFyIF5iYXoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK291dHB1dHMgJ21pZHBvaW50JywgdGhlIG91dHB1dCBvZiB0aGUgdHdvIGNvbW1hbmRzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJJCBnaXQtcmV2LWxpc3QgZm9vIF5taWRwb2ludAorCSQgZ2l0LXJldi1saXN0IG1pZHBvaW50IF5iYXIgXmJhegorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword291bGQgYmUgb2Ygcm91Z2hseSB0aGUgc2FtZSBsZW5ndGguICBGaW5kaW5nIHRoZSBjaGFuZ2Ugd2hpY2gKK2ludHJvZHVjZXMgYSByZWdyZXNzaW9uIGlzIHRodXMgcmVkdWNlZCB0byBhIGJpbmFyeSBzZWFyY2g6IHJlcGVhdGVkbHkKK2dlbmVyYXRlIGFuZCB0ZXN0IG5ldyAnbWlkcG9pbnQncyB1bnRpbCB0aGUgY29tbWl0IGNoYWluIGlzIG9mIGxlbmd0aAorb25lLgorCistLWJpc2VjdC12YXJzOjoKKworVGhpcyBjYWxjdWxhdGVzIHRoZSBzYW1lIGFzIGAtLWJpc2VjdGAsIGJ1dCBvdXRwdXRzIHRleHQgcmVhZHkKK3RvIGJlIGV2YWwnZWQgYnkgdGhlIHNoZWxsLiBUaGVzZSBsaW5lcyB3aWxsIGFzc2lnbiB0aGUgbmFtZSBvZgordGhlIG1pZHBvaW50IHJldmlzaW9uIHRvIHRoZSB2YXJpYWJsZSBgYmlzZWN0X3JldmAsIGFuZCB0aGUKK2V4cGVjdGVkIG51bWJlciBvZiBjb21taXRzIHRvIGJlIHRlc3RlZCBhZnRlciBgYmlzZWN0X3JldmAgaXMKK3Rlc3RlZCB0byBgYmlzZWN0X25yYCwgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBjb21taXRzIHRvIGJlCit0ZXN0ZWQgaWYgYGJpc2VjdF9yZXZgIHR1cm5zIG91dCB0byBiZSBnb29kIHRvIGBiaXNlY3RfZ29vZGAsCit0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGNvbW1pdHMgdG8gYmUgdGVzdGVkIGlmIGBiaXNlY3RfcmV2YAordHVybnMgb3V0IHRvIGJlIGJhZCB0byBgYmlzZWN0X2JhZGAsIGFuZCB0aGUgbnVtYmVyIG9mIGNvbW1pdHMKK3dlIGFyZSBiaXNlY3RpbmcgcmlnaHQgbm93IHRvIGBiaXNlY3RfYWxsYC4KKworLS1iaXNlY3QtYWxsOjoKKworVGhpcyBvdXRwdXRzIGFsbCB0aGUgY29tbWl0IG9iamVjdHMgYmV0d2VlbiB0aGUgaW5jbHVkZWQgYW5kIGV4Y2x1ZGVkCitjb21taXRzLCBvcmRlcmVkIGJ5IHRoZWlyIGRpc3RhbmNlIHRvIHRoZSBpbmNsdWRlZCBhbmQgZXhjbHVkZWQKK2NvbW1pdHMuIFRoZSBmYXJ0aGVzdCBmcm9tIHRoZW0gaXMgZGlzcGxheWVkIGZpcnN0LiAoVGhpcyBpcyB0aGUgb25seQorb25lIGRpc3BsYXllZCBieSBgLS1iaXNlY3RgLikKKworVGhpcyBpcyB1c2VmdWwgYmVjYXVzZSBpdCBtYWtlcyBpdCBlYXN5IHRvIGNob29zZSBhIGdvb2QgY29tbWl0IHRvCit0ZXN0IHdoZW4geW91IHdhbnQgdG8gYXZvaWQgdG8gdGVzdCBzb21lIG9mIHRoZW0gZm9yIHNvbWUgcmVhc29uICh0aGV5CittYXkgbm90IGNvbXBpbGUgZm9yIGV4YW1wbGUpLgorCitUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCBhbG9uZyB3aXRoIGAtLWJpc2VjdC12YXJzYCwgaW4gdGhpcyBjYXNlLAorYWZ0ZXIgYWxsIHRoZSBzb3J0ZWQgY29tbWl0IG9iamVjdHMsIHRoZXJlIHdpbGwgYmUgdGhlIHNhbWUgdGV4dCBhcyBpZgorYC0tYmlzZWN0LXZhcnNgIGhhZCBiZWVuIHVzZWQgYWxvbmUuCitlbmRpZjo6Z2l0LXJldi1saXN0W10KKworLS0KKworQ29tbWl0IE9yZGVyaW5nCit+fn5+fn5+fn5+fn5+fn4KKworQnkgZGVmYXVsdCwgdGhlIGNvbW1pdHMgYXJlIHNob3duIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KKworLS10b3BvLW9yZGVyOjoKKworCVRoaXMgb3B0aW9uIG1ha2VzIHRoZW0gYXBwZWFyIGluIHRvcG9sb2dpY2FsIG9yZGVyIChpLmUuCisJZGVzY2VuZGFudCBjb21taXRzIGFyZSBzaG93biBiZWZvcmUgdGhlaXIgcGFyZW50cykuCisKKy0tZGF0ZS1vcmRlcjo6CisKKwlUaGlzIG9wdGlvbiBpcyBzaW1pbGFyIHRvICctLXRvcG8tb3JkZXInIGluIHRoZSBzZW5zZSB0aGF0IG5vCisJcGFyZW50IGNvbWVzIGJlZm9yZSBhbGwgb2YgaXRzIGNoaWxkcmVuLCBidXQgb3RoZXJ3aXNlIHRoaW5ncworCWFyZSBzdGlsbCBvcmRlcmVkIGluIHRoZSBjb21taXQgdGltZXN0YW1wIG9yZGVyLgorCistLXJldmVyc2U6OgorCisJT3V0cHV0IHRoZSBjb21taXRzIGluIHJldmVyc2Ugb3JkZXIuCisJQ2Fubm90IGJlIGNvbWJpbmVkIHdpdGggJ1wtLXdhbGstcmVmbG9ncycuCisKK09iamVjdCBUcmF2ZXJzYWwKK35+fn5+fn5+fn5+fn5+fn4KKworVGhlc2Ugb3B0aW9ucyBhcmUgbW9zdGx5IHRhcmdldGVkIGZvciBwYWNraW5nIG9mIGdpdCByZXBvc2l0b3JpZXMuCisKKy0tb2JqZWN0czo6CisKKwlQcmludCB0aGUgb2JqZWN0IElEcyBvZiBhbnkgb2JqZWN0IHJlZmVyZW5jZWQgYnkgdGhlIGxpc3RlZAorCWNvbW1pdHMuICAnLS1vYmplY3RzIGZvbyBeYmFyJyB0aHVzIG1lYW5zICJzZW5kIG1lCisJYWxsIG9iamVjdCBJRHMgd2hpY2ggSSBuZWVkIHRvIGRvd25sb2FkIGlmIEkgaGF2ZSB0aGUgY29tbWl0CisJb2JqZWN0ICdiYXInLCBidXQgbm90ICdmb28nIi4KKworLS1vYmplY3RzLWVkZ2U6OgorCisJU2ltaWxhciB0byAnLS1vYmplY3RzJywgYnV0IGFsc28gcHJpbnQgdGhlIElEcyBvZiBleGNsdWRlZAorCWNvbW1pdHMgcHJlZml4ZWQgd2l0aCBhICItIiBjaGFyYWN0ZXIuICBUaGlzIGlzIHVzZWQgYnkKKwlsaW5rZ2l0OmdpdC1wYWNrLW9iamVjdHNbMV0gdG8gYnVpbGQgInRoaW4iIHBhY2ssIHdoaWNoIHJlY29yZHMKKwlvYmplY3RzIGluIGRlbHRpZmllZCBmb3JtIGJhc2VkIG9uIG9iamVjdHMgY29udGFpbmVkIGluIHRoZXNlCisJZXhjbHVkZWQgY29tbWl0cyB0byByZWR1Y2UgbmV0d29yayB0cmFmZmljLgorCistLXVucGFja2VkOjoKKworCU9ubHkgdXNlZnVsIHdpdGggJy0tb2JqZWN0cyc7IHByaW50IHRoZSBvYmplY3QgSURzIHRoYXQgYXJlIG5vdAorCWluIHBhY2tzLgorCistLW5vLXdhbGs6OgorCisJT25seSBzaG93IHRoZSBnaXZlbiByZXZzLCBidXQgZG8gbm90IHRyYXZlcnNlIHRoZWlyIGFuY2VzdG9ycy4KKworLS1kby13YWxrOjoKKworCU92ZXJyaWRlcyBhIHByZXZpb3VzIC0tbm8td2Fsay4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsLy5naXRpZ25vcmUgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYTg5MWQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKK2FwaS1pbmRleC50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1hbGxvY2F0aW9uLWdyb3dpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvYXBpLWFsbG9jYXRpb24tZ3Jvd2luZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkYmUwOQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1hbGxvY2F0aW9uLWdyb3dpbmcudHh0CkBAIC0wLDAgKzEsMzQgQEAKK2FsbG9jYXRpb24gZ3Jvd2luZyBBUEkKKz09PT09PT09PT09PT09PT09PT09PT0KKworRHluYW1pY2FsbHkgZ3Jvd2luZyBhbiBhcnJheSB1c2luZyByZWFsbG9jKCkgaXMgZXJyb3IgcHJvbmUgYW5kIGJvcmluZy4KKworRGVmaW5lIHlvdXIgYXJyYXkgd2l0aDoKKworKiBhIHBvaW50ZXIgKGBhcnlgKSB0aGF0IHBvaW50cyBhdCB0aGUgYXJyYXksIGluaXRpYWxpemVkIHRvIGBOVUxMYDsKKworKiBhbiBpbnRlZ2VyIHZhcmlhYmxlIChgYWxsb2NgKSB0aGF0IGtlZXBzIHRyYWNrIG9mIGhvdyBiaWcgdGhlIGN1cnJlbnQKKyAgYWxsb2NhdGlvbiBpcywgaW5pdGlhbGl6ZWQgdG8gYDBgOworCisqIGFub3RoZXIgaW50ZWdlciB2YXJpYWJsZSAoYG5yYCkgdG8ga2VlcCB0cmFjayBvZiBob3cgbWFueSBlbGVtZW50cyB0aGUKKyAgYXJyYXkgY3VycmVudGx5IGhhcywgaW5pdGlhbGl6ZWQgdG8gYDBgLgorCitUaGVuIGJlZm9yZSBhZGRpbmcgYG5gdGggZWxlbWVudCB0byB0aGUgYXJyYXksIGNhbGwgYEFMTE9DX0dST1coYXJ5LCBuLAorYWxsb2MpYC4gIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBhcnJheSBjYW4gaG9sZCBhdCBsZWFzdCBgbmAgZWxlbWVudHMgYnkKK2NhbGxpbmcgYHJlYWxsb2MoMylgIGFuZCBhZGp1c3RpbmcgYGFsbG9jYCB2YXJpYWJsZS4KKworLS0tLS0tLS0tLS0tCitzb21ldHlwZSAqYXJ5Oworc2l6ZV90IG5yOworc2l6ZV90IGFsbG9jCisKK2ZvciAoaSA9IDA7IGkgPCBucjsgaSsrKQorCWlmICh3ZSBsaWtlIGFyeVtpXSBhbHJlYWR5KQorCQlyZXR1cm47CisKKy8qIHdlIGRpZCBub3QgbGlrZSBhbnkgZXhpc3Rpbmcgb25lLCBzbyBhZGQgb25lICovCitBTExPQ19HUk9XKGFyeSwgbnIgKyAxLCBhbGxvYyk7CithcnlbbnIrK10gPSB2YWx1ZSB5b3UgbGlrZTsKKy0tLS0tLS0tLS0tLQorCitZb3UgYXJlIHJlc3BvbnNpYmxlIGZvciB1cGRhdGluZyB0aGUgYG5yYCB2YXJpYWJsZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1idWlsdGluLnR4dCBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1idWlsdGluLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmNkYjRjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvYXBpLWJ1aWx0aW4udHh0CkBAIC0wLDAgKzEsNjMgQEAKK2J1aWx0aW4gQVBJCis9PT09PT09PT09PQorCitBZGRpbmcgYSBuZXcgYnVpbHQtaW4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGVyZSBhcmUgNCB0aGluZ3MgdG8gZG8gdG8gYWRkIGEgYnVsaXQtaW4gY29tbWFuZCBpbXBsZW1lbnRhdGlvbiB0bworZ2l0OgorCisuIERlZmluZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGJ1aWx0LWluIGNvbW1hbmQgYGZvb2Agd2l0aAorICBzaWduYXR1cmU6CisKKwlpbnQgY21kX2ZvbyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CisKKy4gQWRkIHRoZSBleHRlcm5hbCBkZWNsYXJhdGlvbiBmb3IgdGhlIGZ1bmN0aW9uIHRvIGBidWlsdGluLmhgLgorCisuIEFkZCB0aGUgY29tbWFuZCB0byBgY29tbWFuZHNbXWAgdGFibGUgaW4gYGhhbmRsZV9pbnRlcm5hbF9jb21tYW5kKClgLAorICBkZWZpbmVkIGluIGBnaXQuY2AuICBUaGUgZW50cnkgc2hvdWxkIGxvb2sgbGlrZToKKworCXsgImZvbyIsIGNtZF9mb28sIDxvcHRpb25zPiB9LAorCisgIHdoZXJlIG9wdGlvbnMgaXMgdGhlIGJpdHdpc2Utb3Igb2Y6CisKK2BSVU5fU0VUVVBgOjoKKworCU1ha2Ugc3VyZSB0aGVyZSBpcyBhIGdpdCBkaXJlY3RvcnkgdG8gd29yayBvbiwgYW5kIGlmIHRoZXJlIGlzIGEKKwl3b3JrIHRyZWUsIGNoZGlyIHRvIHRoZSB0b3Agb2YgaXQgaWYgdGhlIGNvbW1hbmQgd2FzIGludm9rZWQKKwlpbiBhIHN1YmRpcmVjdG9yeS4gIElmIHRoZXJlIGlzIG5vIHdvcmsgdHJlZSwgbm8gY2hkaXIoKSBpcworCWRvbmUuCisKK2BVU0VfUEFHRVJgOjoKKworCUlmIHRoZSBzdGFuZGFyZCBvdXRwdXQgaXMgY29ubmVjdGVkIHRvIGEgdHR5LCBzcGF3biBhIHBhZ2VyIGFuZAorCWZlZWQgb3VyIG91dHB1dCB0byBpdC4KKworLiBBZGQgYGJ1aWx0aW4tZm9vLm9gIHRvIGBCVUlMVElOX09CSlNgIGluIGBNYWtlZmlsZWAuCisKK0FkZGl0aW9uYWxseSwgaWYgYGZvb2AgaXMgYSBuZXcgY29tbWFuZCwgdGhlcmUgYXJlIDMgbW9yZSB0aGluZ3MgdG8gZG86CisKKy4gQWRkIHRlc3RzIHRvIGB0L2AgZGlyZWN0b3J5LgorCisuIFdyaXRlIGRvY3VtZW50YXRpb24gaW4gYERvY3VtZW50YXRpb24vZ2l0LWZvby50eHRgLgorCisuIEFkZCBhbiBlbnRyeSBmb3IgYGdpdC1mb29gIHRvIHRoZSBsaXN0IGF0IHRoZSBlbmQgb2YKKyAgYERvY3VtZW50YXRpb24vY21kLWxpc3QucGVybGAuCisKKworSG93IGEgYnVpbHQtaW4gaXMgY2FsbGVkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGltcGxlbWVudGF0aW9uIGBjbWRfZm9vKClgIHRha2VzIHRocmVlIHBhcmFtZXRlcnMsIGBhcmdjYCwgYGFyZ3YsCithbmQgYHByZWZpeGAuICBUaGUgZmlyc3QgdHdvIGFyZSBzaW1pbGFyIHRvIHdoYXQgYG1haW4oKWAgb2YgYQorc3RhbmRhbG9uZSBjb21tYW5kIHdvdWxkIGJlIGNhbGxlZCB3aXRoLgorCitXaGVuIGBSVU5fU0VUVVBgIGlzIHNwZWNpZmllZCBpbiB0aGUgYGNvbW1hbmRzW11gIHRhYmxlLCBhbmQgd2hlbiB5b3UKK3dlcmUgc3RhcnRlZCBmcm9tIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSB3b3JrIHRyZWUsIGBjbWRfZm9vKClgIGlzIGNhbGxlZAorYWZ0ZXIgY2hkaXIoMikgdG8gdGhlIHRvcCBvZiB0aGUgd29yayB0cmVlLCBhbmQgYHByZWZpeGAgZ2V0cyB0aGUgcGF0aAordG8gdGhlIHN1YmRpcmVjdG9yeSB0aGUgY29tbWFuZCBzdGFydGVkIGZyb20uICBUaGlzIGFsbG93cyB5b3UgdG8KK2NvbnZlcnQgYSB1c2VyLXN1cHBsaWVkIHBhdGhuYW1lICh0eXBpY2FsbHkgcmVsYXRpdmUgdG8gdGhhdCBkaXJlY3RvcnkpCit0byBhIHBhdGhuYW1lIHJlbGF0aXZlIHRvIHRoZSB0b3Agb2YgdGhlIHdvcmsgdHJlZS4KKworVGhlIHJldHVybiB2YWx1ZSBmcm9tIGBjbWRfZm9vKClgIGJlY29tZXMgdGhlIGV4aXQgc3RhdHVzIG9mIHRoZQorY29tbWFuZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1kZWNvcmF0ZS50eHQgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9hcGktZGVjb3JhdGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNTJhNmMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9hcGktZGVjb3JhdGUudHh0CkBAIC0wLDAgKzEsNiBAQAorZGVjb3JhdGUgQVBJCis9PT09PT09PT09PT0KKworVGFsayBhYm91dCA8ZGVjb3JhdGUuaD4KKworKExpbnVzKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvYXBpLWRpZmYudHh0IGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvYXBpLWRpZmYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYjAyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9hcGktZGlmZi50eHQKQEAgLTAsMCArMSwxNjYgQEAKK2RpZmYgQVBJCis9PT09PT09PQorCitUaGUgZGlmZiBBUEkgaXMgZm9yIHByb2dyYW1zIHRoYXQgY29tcGFyZSB0d28gc2V0cyBvZiBmaWxlcyAoZS5nLiB0d28KK3RyZWVzLCBvbmUgdHJlZSBhbmQgdGhlIGluZGV4KSBhbmQgcHJlc2VudCB0aGUgZm91bmQgZGlmZmVyZW5jZSBpbgordmFyaW91cyB3YXlzLiAgVGhlIGNhbGxpbmcgcHJvZ3JhbSBpcyByZXNwb25zaWJsZSBmb3IgZmVlZGluZyB0aGUgQVBJCitwYWlycyBvZiBmaWxlcywgb25lIGZyb20gdGhlICJvbGQiIHNldCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgb25lIGZyb20KKyJuZXciIHNldCwgdGhhdCBhcmUgZGlmZmVyZW50LiAgVGhlIGxpYnJhcnkgY2FsbGVkIHRocm91Z2ggdGhpcyBBUEkgaXMKK2NhbGxlZCBkaWZmY29yZSwgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciB0d28gdGhpbmdzLgorCisqIGZpbmRpbmcgdG90YWwgcmV3cml0ZXMgKGAtQmApLCByZW5hbWVzIChgLU1gKSBhbmQgY29waWVzIChgLUNgKSwgYW5kCisgIGNoYW5nZXMgdGhhdCB0b3VjaCBhIHN0cmluZyAoYC1TYCksIGFzIHNwZWNpZmllZCBieSB0aGUgY2FsbGVyLgorCisqIG91dHB1dHRpbmcgdGhlIGRpZmZlcmVuY2VzIGluIHZhcmlvdXMgZm9ybWF0cywgYXMgc3BlY2lmaWVkIGJ5IHRoZQorICBjYWxsZXIuCisKK0NhbGxpbmcgc2VxdWVuY2UKKy0tLS0tLS0tLS0tLS0tLS0KKworKiBQcmVwYXJlIGBzdHJ1Y3QgZGlmZl9vcHRpb25zYCB0byByZWNvcmQgdGhlIHNldCBvZiBkaWZmIG9wdGlvbnMsIGFuZAorICB0aGVuIGNhbGwgYGRpZmZfc2V0dXAoKWAgdG8gaW5pdGlhbGl6ZSB0aGlzIHN0cnVjdHVyZS4gIFRoaXMgc2V0cyB1cAorICB0aGUgdmFuaWxsYSBkZWZhdWx0LgorCisqIEZpbGwgaW4gdGhlIG9wdGlvbnMgc3RydWN0dXJlIHRvIHNwZWNpZnkgZGVzaXJlZCBvdXRwdXQgZm9ybWF0LCByZW5hbWUKKyAgZGV0ZWN0aW9uLCBldGMuICBgZGlmZl9vcHRfcGFyc2UoKWAgY2FuIGJlIHVzZWQgdG8gcGFyc2Ugb3B0aW9ucyBnaXZlbgorICBmcm9tIHRoZSBjb21tYW5kIGxpbmUgaW4gYSB3YXkgY29uc2lzdGVudCB3aXRoIGV4aXN0aW5nIGdpdC1kaWZmCisgIGZhbWlseSBvZiBwcm9ncmFtcy4KKworKiBDYWxsIGBkaWZmX3NldHVwX2RvbmUoKWA7IHRoaXMgaW5zcGVjdHMgdGhlIG9wdGlvbnMgc2V0IHVwIHNvIGZhciBmb3IKKyAgaW50ZXJuYWwgY29uc2lzdGVuY3kgYW5kIG1ha2UgbmVjZXNzYXJ5IHR3ZWFraW5nIHRvIGl0IChlLmcuIGlmCisgIHRleHR1YWwgcGF0Y2ggb3V0cHV0IHdhcyBhc2tlZCwgcmVjdXJzaXZlIGJlaGF2aW91ciBpcyB0dXJuZWQgb24pLgorCisqIEFzIHlvdSBmaW5kIGRpZmZlcmVudCBwYWlycyBvZiBmaWxlcywgY2FsbCBgZGlmZl9jaGFuZ2UoKWAgdG8gZmVlZAorICBtb2RpZmllZCBmaWxlcywgYGRpZmZfYWRkcmVtb3ZlKClgIHRvIGZlZWQgY3JlYXRlZCBvciBkZWxldGVkIGZpbGVzLAorICBvciBgZGlmZl91bm1lcmdlZCgpYCB0byBmZWVkIGEgZmlsZSB3aG9zZSBzdGF0ZSBpcyAndW5tZXJnZWQnIHRvIHRoZQorICBBUEkuICBUaGVzZSBhcmUgdGhpbiB3cmFwcGVycyB0byBhIGxvd2VyLWxldmVsIGBkaWZmX3F1ZXVlKClgIGZ1bmN0aW9uCisgIHRoYXQgaXMgZmxleGlibGUgZW5vdWdoIHRvIHJlY29yZCBhbnkgb2YgdGhlc2Uga2luZHMgb2YgY2hhbmdlcy4KKworKiBPbmNlIHlvdSBmaW5pc2ggZmVlZGluZyB0aGUgcGFpcnMgb2YgZmlsZXMsIGNhbGwgYGRpZmZjb3JlX3N0ZCgpYC4KKyAgVGhpcyB3aWxsIHRlbGwgdGhlIGRpZmZjb3JlIGxpYnJhcnkgdG8gZ28gYWhlYWQgYW5kIGRvIGl0cyB3b3JrLgorCisqIENhbGxpbmcgYGRpZmZfZmx1c2goKWAgd2lsbCBwcm9kdWNlIHRoZSBvdXRwdXQuCisKKworRGF0YSBzdHJ1Y3R1cmVzCistLS0tLS0tLS0tLS0tLS0KKworKiBgc3RydWN0IGRpZmZfZmlsZXNwZWNgCisKK1RoaXMgaXMgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGZvciBhIHNpbmdsZSBmaWxlIChibG9iKS4gIEl0CityZWNvcmRzIHRoZSBibG9iIG9iamVjdCBuYW1lIChpZiBrbm93biAtLSBmb3IgYSB3b3JrIHRyZWUgZmlsZSBpdAordHlwaWNhbGx5IGlzIGEgTlVMIFNIQS0xKSwgZmlsZW1vZGUgYW5kIHBhdGhuYW1lLiAgVGhpcyBpcyB3aGF0IHRoZQorYGRpZmZfYWRkcmVtb3ZlKClgLCBgZGlmZl9jaGFuZ2UoKWAgYW5kIGBkaWZmX3VubWVyZ2VkKClgIHN5bnRoZXNpemUgYW5kCitmZWVkIGBkaWZmX3F1ZXVlKClgIGZ1bmN0aW9uIHdpdGguCisKKyogYHN0cnVjdCBkaWZmX2ZpbGVwYWlyYAorCitUaGlzIHJlY29yZHMgYSBwYWlyIG9mIGBzdHJ1Y3QgZGlmZl9maWxlc3BlY2A7IHRoZSBmaWxlc3BlYyBmb3IgYSBmaWxlCitpbiB0aGUgIm9sZCIgc2V0IChpLmUuIHByZWltYWdlKSBpcyBjYWxsZWQgYG9uZWAsIGFuZCB0aGUgZmlsZXNwZWMgZm9yIGEKK2ZpbGUgaW4gdGhlICJuZXciIHNldCAoaS5lLiBwb3N0aW1hZ2UpIGlzIGNhbGxlZCBgdHdvYC4gIEEgY2hhbmdlIHRoYXQKK3JlcHJlc2VudHMgZmlsZSBjcmVhdGlvbiBoYXMgTlVMTCBpbiBgb25lYCwgYW5kIGZpbGUgZGVsZXRpb24gaGFzIE5VTEwKK2luIGB0d29gLgorCitBIGBmaWxlcGFpcmAgc3RhcnRzIHBvaW50aW5nIGF0IGBvbmVgIGFuZCBgdHdvYCB0aGF0IGFyZSBmcm9tIHRoZSBzYW1lCitmaWxlbmFtZSwgYnV0IGBkaWZmY29yZV9zdGQoKWAgY2FuIGJyZWFrIHBhaXJzIGFuZCBtYXRjaCBjb21wb25lbnQKK2ZpbGVzcGVjcyB3aXRoIG90aGVyIGZpbGVzcGVjcyBmcm9tIGEgZGlmZmVyZW50IGZpbGVwYWlyIHRvIGZvcm0gbmV3CitmaWxlcGFpci4gIFRoaXMgaXMgY2FsbGVkICdyZW5hbWUgZGV0ZWN0aW9uJy4KKworKiBgc3RydWN0IGRpZmZfcXVldWVgCisKK1RoaXMgaXMgYSBjb2xsZWN0aW9uIG9mIGZpbGVwYWlycy4gIE5vdGFibGUgbWVtYmVycyBhcmU6CisKK2BxdWV1ZWA6OgorCisJQW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gYHN0cnVjdCBkaWZmX2ZpbGVwYWlyYC4gIFRoaXMKKwlkeW5hbWljYWxseSBncm93cyBhcyB5b3UgYWRkIGZpbGVwYWlyczsKKworYGFsbG9jYDo6CisKKwlUaGUgYWxsb2NhdGVkIHNpemUgb2YgdGhlIGBxdWV1ZWAgYXJyYXk7CisKK2BucmA6OgorCisJVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYHF1ZXVlYCBhcnJheS4KKworCisqIGBzdHJ1Y3QgZGlmZl9vcHRpb25zYAorCitUaGlzIGRlc2NyaWJlcyB0aGUgc2V0IG9mIG9wdGlvbnMgdGhlIGNhbGxpbmcgcHJvZ3JhbSB3YW50cyB0byBhZmZlY3QKK3RoZSBvcGVyYXRpb24gb2YgZGlmZmNvcmUgbGlicmFyeSB3aXRoLgorCitOb3RhYmxlIG1lbWJlcnMgYXJlOgorCitgb3V0cHV0X2Zvcm1hdGA6OgorCVRoZSBvdXRwdXQgZm9ybWF0IHVzZWQgd2hlbiBgZGlmZl9mbHVzaCgpYCBpcyBydW4uCisKK2Bjb250ZXh0YDo6CisJTnVtYmVyIG9mIGNvbnRleHQgbGluZXMgdG8gZ2VuZXJhdGUgaW4gcGF0Y2ggb3V0cHV0LgorCitgYnJlYWtfb3B0YCwgYGRldGVjdF9yZW5hbWVgLCBgcmVuYW1lLXNjb3JlYCwgYHJlbmFtZV9saW1pdGA6OgorCUFmZmVjdHMgdGhlIHdheSBkZXRlY3Rpb24gbG9naWMgZm9yIGNvbXBsZXRlIHJld3JpdGVzLCByZW5hbWVzCisJYW5kIGNvcGllcy4KKworYGFiYnJldmA6OgorCU51bWJlciBvZiBoZXhkaWdpdHMgdG8gYWJicmV2aWF0ZSByYXcgZm9ybWF0IG91dHB1dCB0by4KKworYHBpY2theGVgOjoKKwlBIGNvbnN0YW50IHN0cmluZyAoY2FuIGFuZCB0eXBpY2FsbHkgZG9lcyBjb250YWluIG5ld2xpbmVzIHRvCisJbG9vayBmb3IgYSBibG9jayBvZiB0ZXh0LCBub3QganVzdCBhIHNpbmdsZSBsaW5lKSB0byBmaWx0ZXIgb3V0CisJdGhlIGZpbGVwYWlycyB0aGF0IGRvIG5vdCBjaGFuZ2UgdGhlIG51bWJlciBvZiBzdHJpbmdzIGNvbnRhaW5lZAorCWluIGl0cyBwcmVpbWFnZSBhbmQgcG9zdGltYWdlIG9mIHRoZSBkaWZmX3F1ZXVlLgorCitgZmxhZ3NgOjoKKwlUaGlzIGlzIG1vc3RseSBhIGNvbGxlY3Rpb24gb2YgYm9vbGVhbiBvcHRpb25zIHRoYXQgYWZmZWN0cyB0aGUKKwlvcGVyYXRpb24sIGJ1dCBzb21lIGRvIG5vdCBoYXZlIGFueXRoaW5nIHRvIGRvIHdpdGggdGhlIGRpZmZjb3JlCisJbGlicmFyeS4KKworQklOQVJZLCBURVhUOzsKKwlBZmZlY3RzIHRoZSB3YXkgaG93IGEgZmlsZSB0aGF0IGlzIHNlZW1pbmdseSBiaW5hcnkgaXMgdHJlYXRlZC4KKworRlVMTF9JTkRFWDs7CisJVGVsbHMgdGhlIHBhdGNoIG91dHB1dCBmb3JtYXQgbm90IHRvIHVzZSBhYmJyZXZpYXRlZCBvYmplY3QKKwluYW1lcyBvbiB0aGUgImluZGV4IiBsaW5lcy4KKworRklORF9DT1BJRVNfSEFSREVSOzsKKwlUZWxscyB0aGUgZGlmZmNvcmUgbGlicmFyeSB0aGF0IHRoZSBjYWxsZXIgaXMgZmVlZGluZyB1bmNoYW5nZWQKKwlmaWxlcGFpcnMgdG8gYWxsb3cgY29waWVzIGZyb20gdW5tb2RpZmllZCBmaWxlcyBiZSBkZXRlY3RlZC4KKworQ09MT1JfRElGRjs7CisJT3V0cHV0IHNob3VsZCBiZSBjb2xvcmVkLgorCitDT0xPUl9ESUZGX1dPUkRTOzsKKwlPdXRwdXQgaXMgYSBjb2xvcmVkIHdvcmQtZGlmZi4KKworTk9fSU5ERVg7OworCVRlbGxzIGRpZmYtZmlsZXMgdGhhdCB0aGUgaW5wdXQgaXMgbm90IHRyYWNrZWQgZmlsZXMgYnV0IGZpbGVzCisJaW4gcmFuZG9tIGxvY2F0aW9ucyBvbiB0aGUgZmlsZXN5c3RlbS4KKworQUxMT1dfRVhURVJOQUw7OworCVRlbGxzIG91dHB1dCByb3V0aW5lIHRoYXQgaXQgaXMgT2sgdG8gY2FsbCB1c2VyIHNwZWNpZmllZCBwYXRjaAorCW91dHB1dCByb3V0aW5lLiAgUGx1bWJpbmcgZGlzYWJsZXMgdGhpcyB0byBlbnN1cmUgc3RhYmxlIG91dHB1dC4KKworUVVJRVQ7OworCURvIG5vdCBzaG93IGFueSBvdXRwdXQuCisKK1JFVkVSU0VfRElGRjs7CisJVGVsbHMgdGhlIGxpYnJhcnkgdGhhdCB0aGUgY2FsbGluZyBwcm9ncmFtIGlzIGZlZWRpbmcgdGhlCisJZmlsZXBhaXJzIHJldmVyc2VkOyBgb25lYCBpcyB0d28sIGFuZCBgdHdvYCBpcyBvbmUuCisKK0VYSVRfV0lUSF9TVEFUVVM7OworCUZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGNhbGxpbmcgcHJvZ3JhbSBhbmQgdGhlIG9wdGlvbnMKKwlwYXJzZXI7IHRlbGwgdGhlIGNhbGxpbmcgcHJvZ3JhbSB0byBzaWduYWwgdGhlIHByZXNlbmNlIG9mCisJZGlmZmVyZW5jZSB1c2luZyBwcm9ncmFtIGV4aXQgY29kZS4KKworSEFTX0NIQU5HRVM7OworCUludGVybmFsOyB1c2VkIGZvciBvcHRpbWl6YXRpb24gdG8gc2VlIGlmIHRoZXJlIGlzIGFueSBjaGFuZ2UuCisKK1NJTEVOVF9PTl9SRU1PVkU7OworCUFmZmVjdHMgaWYgZGlmZi1maWxlcyBzaG93cyByZW1vdmVkIGZpbGVzLgorCitSRUNVUlNJVkUsIFRSRUVfSU5fUkVDVVJTSVZFOzsKKwlUZWxscyBpZiB0cmVlIHRyYXZlcnNhbCBkb25lIGJ5IHRyZWUtZGlmZiBzaG91bGQgcmVjdXJzaXZlbHkKKwlkZXNjZW5kIGludG8gYSB0cmVlIG9iamVjdCBwYWlyIHRoYXQgYXJlIGRpZmZlcmVudCBpbiBwcmVpbWFnZQorCWFuZCBwb3N0aW1hZ2Ugc2V0LgorCisoSkMpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9hcGktZGlyZWN0b3J5LWxpc3RpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvYXBpLWRpcmVjdG9yeS1saXN0aW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmJkMThmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvYXBpLWRpcmVjdG9yeS1saXN0aW5nLnR4dApAQCAtMCwwICsxLDc2IEBACitkaXJlY3RvcnkgbGlzdGluZyBBUEkKKz09PT09PT09PT09PT09PT09PT09PQorCitUaGUgZGlyZWN0b3J5IGxpc3RpbmcgQVBJIGlzIHVzZWQgdG8gZW51bWVyYXRlIHBhdGhzIGluIHRoZSB3b3JrIHRyZWUsCitvcHRpb25hbGx5IHRha2luZyBgLmdpdC9pbmZvL2V4Y2x1ZGVgIGFuZCBgLmdpdGlnbm9yZWAgZmlsZXMgcGVyCitkaXJlY3RvcnkgaW50byBhY2NvdW50LgorCitEYXRhIHN0cnVjdHVyZQorLS0tLS0tLS0tLS0tLS0KKworYHN0cnVjdCBkaXJfc3RydWN0YCBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBwYXNzIGRpcmVjdG9yeSB0cmF2ZXJzYWwKK29wdGlvbnMgdG8gdGhlIGxpYnJhcnkgYW5kIHRvIHJlY29yZCB0aGUgcGF0aHMgZGlzY292ZXJlZC4gIFRoZSBub3RhYmxlCitvcHRpb25zIGFyZToKKworYGV4Y2x1ZGVfcGVyX2RpcmA6OgorCisJVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gYmUgcmVhZCBpbiBlYWNoIGRpcmVjdG9yeSBmb3IgZXhjbHVkZWQKKwlmaWxlcyAodHlwaWNhbGx5IGAuZ2l0aWdub3JlYCkuCisKK2Bjb2xsZWN0X2lnbm9yZWRgOjoKKworCUluY2x1ZGUgcGF0aHMgdGhhdCBhcmUgdG8gYmUgZXhjbHVkZWQgaW4gdGhlIHJlc3VsdC4KKworYHNob3dfaWdub3JlZGA6OgorCisJVGhlIHRyYXZlcnNhbCBpcyBmb3IgZmluZGluZyBqdXN0IGlnbm9yZWQgZmlsZXMsIG5vdCB1bmlnbm9yZWQKKwlmaWxlcy4KKworYHNob3dfb3RoZXJfZGlyZWN0b3JpZXNgOjoKKworCUluY2x1ZGUgYSBkaXJlY3RvcnkgdGhhdCBpcyBub3QgdHJhY2tlZC4KKworYGhpZGVfZW1wdHlfZGlyZWN0b3JpZXNgOjoKKworCURvIG5vdCBpbmNsdWRlIGEgZGlyZWN0b3J5IHRoYXQgaXMgbm90IHRyYWNrZWQgYW5kIGlzIGVtcHR5LgorCitgbm9fZ2l0bGlua3NgOjoKKworCUlmIHNldCwgcmVjdXJzZSBpbnRvIGEgZGlyZWN0b3J5IHRoYXQgbG9va3MgbGlrZSBhIGdpdAorCWRpcmVjdG9yeS4gIE90aGVyd2lzZSBpdCBpcyBzaG93biBhcyBhIGRpcmVjdG9yeS4KKworVGhlIHJlc3VsdCBvZiB0aGUgZW51bWVyYXRpb24gaXMgbGVmdCBpbiB0aGVzZSBmaWVsZHM6OgorCitgZW50cmllc1tdYDo6CisKKwlBbiBhcnJheSBvZiBgc3RydWN0IGRpcl9lbnRyeWAsIGVhY2ggZWxlbWVudCBvZiB3aGljaCBkZXNjcmliZXMKKwlhIHBhdGguCisKK2BucmA6OgorCisJVGhlIG51bWJlciBvZiBtZW1iZXJzIGluIGBlbnRyaWVzW11gIGFycmF5LgorCitgYWxsb2NgOjoKKworCUludGVybmFsIHVzZTsga2VlcHMgdHJhY2sgb2YgYWxsb2NhdGlvbiBvZiBgZW50cmllc1tdYCBhcnJheS4KKworCitDYWxsaW5nIHNlcXVlbmNlCistLS0tLS0tLS0tLS0tLS0tCisKKyogUHJlcGFyZSBgc3RydWN0IGRpcl9zdHJ1Y3QgZGlyYCBhbmQgY2xlYXIgaXQgd2l0aCBgbWVtc2V0KCZkaXIsIDAsCisgIHNpemVvZihkaXIpKWAuCisKKyogQ2FsbCBgYWRkX2V4Y2x1ZGUoKWAgdG8gYWRkIHNpbmdsZSBleGNsdWRlIHBhdHRlcm4sCisgIGBhZGRfZXhjbHVkZXNfZnJvbV9maWxlKClgIHRvIGFkZCBwYXR0ZXJucyBmcm9tIGEgZmlsZQorICAoZS5nLiBgLmdpdC9pbmZvL2V4Y2x1ZGVgKSwgYW5kL29yIHNldCBgZGlyLmV4Y2x1ZGVfcGVyX2RpcmAuICBBCisgIHNob3J0LWhhbmQgZnVuY3Rpb24gYHNldHVwX3N0YW5kYXJkX2V4Y2x1ZGVzKClgIGNhbiBiZSB1c2VkIHRvIHNldCB1cAorICB0aGUgc3RhbmRhcmQgc2V0IG9mIGV4Y2x1ZGUgc2V0dGluZ3MuCisKKyogU2V0IG9wdGlvbnMgZGVzY3JpYmVkIGluIHRoZSBEYXRhIFN0cnVjdHVyZSBzZWN0aW9uIGFib3ZlLgorCisqIENhbGwgYHJlYWRfZGlyZWN0b3J5KClgLgorCisqIFVzZSBgZGlyLmVudHJpZXNbXWAuCisKKyhKQykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1naXRhdHRyaWJ1dGVzLnR4dCBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1naXRhdHRyaWJ1dGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDk3ZWFhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvYXBpLWdpdGF0dHJpYnV0ZXMudHh0CkBAIC0wLDAgKzEsMTExIEBACitnaXRhdHRyaWJ1dGVzIEFQSQorPT09PT09PT09PT09PT09PT0KKworZ2l0YXR0cmlidXRlcyBtZWNoYW5pc20gZ2l2ZXMgYSB1bmlmb3JtIHdheSB0byBhc3NvY2lhdGUgdmFyaW91cworYXR0cmlidXRlcyB0byBzZXQgb2YgcGF0aHMuCisKKworRGF0YSBTdHJ1Y3R1cmUKKy0tLS0tLS0tLS0tLS0tCisKK2BzdHJ1Y3QgZ2l0X2F0dHJgOjoKKworCUFuIGF0dHJpYnV0ZSBpcyBhbiBvcGFxdWUgb2JqZWN0IHRoYXQgaXMgaWRlbnRpZmllZCBieSBpdHMgbmFtZS4KKwlQYXNzIHRoZSBuYW1lIGFuZCBpdHMgbGVuZ3RoIHRvIGBnaXRfYXR0cigpYCBmdW5jdGlvbiB0byBvYnRhaW4KKwl0aGUgb2JqZWN0IG9mIHRoaXMgdHlwZS4gIFRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzCisJc3RydWN0dXJlIGlzIG9mIG5vIGludGVyZXN0IHRvIHRoZSBjYWxsaW5nIHByb2dyYW1zLgorCitgc3RydWN0IGdpdF9hdHRyX2NoZWNrYDo6CisKKwlUaGlzIHN0cnVjdHVyZSByZXByZXNlbnRzIGEgc2V0IG9mIGF0dHJpYnV0ZXMgdG8gY2hlY2sgaW4gYSBjYWxsCisJdG8gYGdpdF9jaGVja2F0dHIoKWAgZnVuY3Rpb24sIGFuZCByZWNlaXZlcyB0aGUgcmVzdWx0cy4KKworCitDYWxsaW5nIFNlcXVlbmNlCistLS0tLS0tLS0tLS0tLS0tCisKKyogUHJlcGFyZSBhbiBhcnJheSBvZiBgc3RydWN0IGdpdF9hdHRyX2NoZWNrYCB0byBkZWZpbmUgdGhlIGxpc3Qgb2YKKyAgYXR0cmlidXRlcyB5b3Ugd291bGQgd2FudCB0byBjaGVjay4gIFRvIHBvcHVsYXRlIHRoaXMgYXJyYXksIHlvdSB3b3VsZAorICBuZWVkIHRvIGRlZmluZSBuZWNlc3NhcnkgYXR0cmlidXRlcyBieSBjYWxsaW5nIGBnaXRfYXR0cigpYCBmdW5jdGlvbi4KKworKiBDYWxsIGdpdF9jaGVja2F0dHIoKSB0byBjaGVjayB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIHBhdGguCisKKyogSW5zcGVjdCBgZ2l0X2F0dHJfY2hlY2tgIHN0cnVjdHVyZSB0byBzZWUgaG93IGVhY2ggb2YgdGhlIGF0dHJpYnV0ZSBpbgorICB0aGUgYXJyYXkgaXMgZGVmaW5lZCBmb3IgdGhlIHBhdGguCisKKworQXR0cmlidXRlIFZhbHVlcworLS0tLS0tLS0tLS0tLS0tLQorCitBbiBhdHRyaWJ1dGUgZm9yIGEgcGF0aCBjYW4gYmUgaW4gb25lIG9mIGZvdXIgc3RhdGVzOiBTZXQsIFVuc2V0LAorVW5zcGVjaWZpZWQgb3Igc2V0IHRvIGEgc3RyaW5nLCBhbmQgYC52YWx1ZWAgbWVtYmVyIG9mIGBzdHJ1Y3QKK2dpdF9hdHRyX2NoZWNrYCByZWNvcmRzIGl0LiAgVGhlcmUgYXJlIHRocmVlIG1hY3JvcyB0byBjaGVjayB0aGVzZToKKworYEFUVFJfVFJVRSgpYDo6CisKKwlSZXR1cm5zIHRydWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyBTZXQgZm9yIHRoZSBwYXRoLgorCitgQVRUUl9GQUxTRSgpYDo6CisKKwlSZXR1cm5zIHRydWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyBVbnNldCBmb3IgdGhlIHBhdGguCisKK2BBVFRSX1VOU0VUKClgOjoKKworCVJldHVybnMgdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIFVuc3BlY2lmaWVkIGZvciB0aGUgcGF0aC4KKworSWYgbm9uZSBvZiB0aGUgYWJvdmUgcmV0dXJucyB0cnVlLCBgLnZhbHVlYCBtZW1iZXIgcG9pbnRzIGF0IGEgc3RyaW5nCit2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGZvciB0aGUgcGF0aC4KKworCitFeGFtcGxlCistLS0tLS0tCisKK1RvIHNlZSBob3cgYXR0cmlidXRlcyAiY3JsZiIgYW5kICJpbmRlbnQiIGFyZSBzZXQgZm9yIGRpZmZlcmVudCBwYXRocy4KKworLiBQcmVwYXJlIGFuIGFycmF5IG9mIGBzdHJ1Y3QgZ2l0X2F0dHJfY2hlY2tgIHdpdGggdHdvIGVsZW1lbnRzIChiZWNhdXNlCisgIHdlIGFyZSBjaGVja2luZyB0d28gYXR0cmlidXRlcykuICBJbml0aWFsaXplIHRoZWlyIGBhdHRyYCBtZW1iZXIgd2l0aAorICBwb2ludGVycyB0byBgc3RydWN0IGdpdF9hdHRyYCBvYnRhaW5lZCBieSBjYWxsaW5nIGBnaXRfYXR0cigpYDoKKworLS0tLS0tLS0tLS0tCitzdGF0aWMgc3RydWN0IGdpdF9hdHRyX2NoZWNrIGNoZWNrWzJdOworc3RhdGljIHZvaWQgc2V0dXBfY2hlY2sodm9pZCkKK3sKKwlpZiAoY2hlY2tbMF0uYXR0cikKKwkJcmV0dXJuOyAvKiBhbHJlYWR5IGRvbmUgKi8KKwljaGVja1swXS5hdHRyID0gZ2l0X2F0dHIoImNybGYiLCA0KTsKKwljaGVja1sxXS5hdHRyID0gZ2l0X2F0dHIoImlkZW50IiwgNSk7Cit9CistLS0tLS0tLS0tLS0KKworLiBDYWxsIGBnaXRfY2hlY2thdHRyKClgIHdpdGggdGhlIHByZXBhcmVkIGFycmF5IG9mIGBzdHJ1Y3QgZ2l0X2F0dHJfY2hlY2tgOgorCistLS0tLS0tLS0tLS0KKwljb25zdCBjaGFyICpwYXRoOworCisJc2V0dXBfY2hlY2soKTsKKwlnaXRfY2hlY2thdHRyKHBhdGgsIEFSUkFZX1NJWkUoY2hlY2spLCBjaGVjayk7CistLS0tLS0tLS0tLS0KKworLiBBY3Qgb24gYC52YWx1ZWAgbWVtYmVyIG9mIHRoZSByZXN1bHQsIGxlZnQgaW4gYGNoZWNrW11gOgorCistLS0tLS0tLS0tLS0KKwljb25zdCBjaGFyICp2YWx1ZSA9IGNoZWNrWzBdLnZhbHVlOworCisJaWYgKEFUVFJfVFJVRSh2YWx1ZSkpIHsKKwkJVGhlIGF0dHJpYnV0ZSBpcyBTZXQsIGJ5IGxpc3Rpbmcgb25seSB0aGUgbmFtZSBvZiB0aGUKKwkJYXR0cmlidXRlIGluIHRoZSBnaXRhdHRyaWJ1dGVzIGZpbGUgZm9yIHRoZSBwYXRoLgorCX0gZWxzZSBpZiAoQVRUUl9GQUxTRSh2YWx1ZSkpIHsKKwkJVGhlIGF0dHJpYnV0ZSBpcyBVbnNldCwgYnkgbGlzdGluZyB0aGUgbmFtZSBvZiB0aGUKKwkJYXR0cmlidXRlIHByZWZpeGVkIHdpdGggYSBkYXNoIC0gZm9yIHRoZSBwYXRoLgorCX0gZWxzZSBpZiAoQVRUUl9VTlNFVCh2YWx1ZSkpIHsKKwkJVGhlIGF0dHJpYnV0ZSBpcyBub3Qgc2V0IG5vciB1bnNldCBmb3IgdGhlIHBhdGguCisJfSBlbHNlIGlmICghc3RyY21wKHZhbHVlLCAiaW5wdXQiKSkgeworCQlJZiBub25lIG9mIEFUVFJfVFJVRSgpLCBBVFRSX0ZBTFNFKCksIG9yIEFUVFJfVU5TRVQoKSBpcworCQl0cnVlLCB0aGUgdmFsdWUgaXMgYSBzdHJpbmcgc2V0IGluIHRoZSBnaXRhdHRyaWJ1dGVzCisJCWZpbGUgZm9yIHRoZSBwYXRoIGJ5IHNheWluZyAiYXR0cj12YWx1ZSIuCisJfSBlbHNlIGlmICguLi4gb3RoZXIgY2hlY2sgdXNpbmcgdmFsdWUgYXMgc3RyaW5nIC4uLikgeworCQkuLi4KKwl9CistLS0tLS0tLS0tLS0KKworKEpDKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvYXBpLWdyZXAudHh0IGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvYXBpLWdyZXAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2OWNjODkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9hcGktZ3JlcC50eHQKQEAgLTAsMCArMSw4IEBACitncmVwIEFQSQorPT09PT09PT0KKworVGFsayBhYm91dCA8Z3JlcC5oPiwgdGhpbmdzIGxpa2U6CisKKyogZ3JlcF9idWZmZXIoKQorCisoSkMpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9hcGktaGFzaC50eHQgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9hcGktaGFzaC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc4NGQzZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1oYXNoLnR4dApAQCAtMCwwICsxLDYgQEAKK2hhc2ggQVBJCis9PT09PT09PQorCitUYWxrIGFib3V0IDxoYXNoLmg+CisKKyhMaW51cykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1pbi1jb3JlLWluZGV4LnR4dCBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1pbi1jb3JlLWluZGV4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGJkYmY1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvYXBpLWluLWNvcmUtaW5kZXgudHh0CkBAIC0wLDAgKzEsMjEgQEAKK2luLWNvcmUgaW5kZXggQVBJCis9PT09PT09PT09PT09PT09PQorCitUYWxrIGFib3V0IDxyZWFkLWNhY2hlLmM+IGFuZCA8Y2FjaGUtdHJlZS5jPiwgdGhpbmdzIGxpa2U6CisKKyogY2FjaGUgLT4gdGhlX2luZGV4IG1hY3JvcworKiByZWFkX2luZGV4KCkKKyogd3JpdGVfaW5kZXgoKQorKiBpZV9tYXRjaF9zdGF0KCkgYW5kIGllX21vZGlmaWVkKCk7IGhvdyB0aGV5IGFyZSBkaWZmZXJlbnQgYW5kIHdoZW4gdG8KKyAgdXNlIHdoaWNoLgorKiBpbmRleF9uYW1lX3BvcygpCisqIHJlbW92ZV9pbmRleF9lbnRyeV9hdCgpCisqIHJlbW92ZV9maWxlX2Zyb21faW5kZXgoKQorKiBhZGRfZmlsZV90b19pbmRleCgpCisqIGFkZF9pbmRleF9lbnRyeSgpCisqIHJlZnJlc2hfaW5kZXgoKQorKiBkaXNjYXJkX2luZGV4KCkKKyogY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoKQorKiBjYWNoZV90cmVlX3VwZGF0ZSgpCisKKyhKQywgTGludXMpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9hcGktaW5kZXgtc2tlbC50eHQgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9hcGktaW5kZXgtc2tlbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY3Y2MyZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1pbmRleC1za2VsLnR4dApAQCAtMCwwICsxLDE1IEBACitHSVQgQVBJIERvY3VtZW50cworPT09PT09PT09PT09PT09PT0KKworR0lUIGhhcyBncm93biBhIHNldCBvZiBpbnRlcm5hbCBBUEkgb3ZlciB0aW1lLiAgVGhpcyBjb2xsZWN0aW9uCitkb2N1bWVudHMgdGhlbS4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gdGFibGUgb2YgY29udGVudHMgYmVnaW4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gdGFibGUgb2YgY29udGVudHMgZW5kCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKzIwMDctMTEtMjQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1pbmRleC5zaCBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1pbmRleC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YzNmNDEzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvYXBpLWluZGV4LnNoCkBAIC0wLDAgKzEsMjggQEAKKyMhL2Jpbi9zaAorCisoCisJYz0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJc2tlbD1hcGktaW5kZXgtc2tlbC50eHQKKwlzZWQgLWUgJy9eXC9cLyB0YWJsZSBvZiBjb250ZW50cyBiZWdpbi9xJyAiJHNrZWwiCisJZWNobyAiJGMiCisKKwlscyBhcGktKi50eHQgfAorCXdoaWxlIHJlYWQgZmlsZW5hbWUKKwlkbworCQljYXNlICIkZmlsZW5hbWUiIGluCisJCWFwaS1pbmRleC1za2VsLnR4dCB8IGFwaS1pbmRleC50eHQpIGNvbnRpbnVlIDs7CisJCWVzYWMKKwkJdGl0bGU9JChzZWQgLWUgMXEgIiRmaWxlbmFtZSIpCisJCWh0bWw9JHtmaWxlbmFtZSUudHh0fS5odG1sCisJCWVjaG8gIiogbGluazokaHRtbFskdGl0bGVdIgorCWRvbmUKKwllY2hvICIkYyIKKwlzZWQgLW4gLWUgJy9eXC9cLyB0YWJsZSBvZiBjb250ZW50cyBlbmQvLCRwJyAiJHNrZWwiCispID5hcGktaW5kZXgudHh0KworCitpZiB0ZXN0IC1mIGFwaS1pbmRleC50eHQgJiYgY21wIGFwaS1pbmRleC50eHQgYXBpLWluZGV4LnR4dCsgPi9kZXYvbnVsbAordGhlbgorCXJtIC1mIGFwaS1pbmRleC50eHQrCitlbHNlCisJbXYgYXBpLWluZGV4LnR4dCsgYXBpLWluZGV4LnR4dAorZmkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1sb2NrZmlsZS50eHQgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9hcGktbG9ja2ZpbGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkODk0MDQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9hcGktbG9ja2ZpbGUudHh0CkBAIC0wLDAgKzEsNzQgQEAKK2xvY2tmaWxlIEFQSQorPT09PT09PT09PT09CisKK1RoZSBsb2NrZmlsZSBBUEkgc2VydmVzIHR3byBwdXJwb3NlczoKKworKiBNdXR1YWwgZXhjbHVzaW9uLiAgV2hlbiB3ZSB3cml0ZSBvdXQgYSBuZXcgaW5kZXggZmlsZSwgZmlyc3QKKyAgd2UgY3JlYXRlIGEgbmV3IGZpbGUgYCRHSVRfRElSL2luZGV4LmxvY2tgLCB3cml0ZSB0aGUgbmV3CisgIGNvbnRlbnRzIGludG8gaXQsIGFuZCByZW5hbWUgaXQgdG8gdGhlIGZpbmFsIGRlc3RpbmF0aW9uCisgIGAkR0lUX0RJUi9pbmRleGAuICBXZSB0cnkgdG8gY3JlYXRlIHRoZSBgJEdJVF9ESVIvaW5kZXgubG9ja2AKKyAgZmlsZSB3aXRoIE9fRVhDTCBzbyB0aGF0IHdlIGNhbiBub3RpY2UgYW5kIGZhaWwgd2hlbiBzb21lYm9keQorICBlbHNlIGlzIGFscmVhZHkgdHJ5aW5nIHRvIHVwZGF0ZSB0aGUgaW5kZXggZmlsZS4KKworKiBBdXRvbWF0aWMgY3J1ZnQgcmVtb3ZhbC4gIEFmdGVyIHdlIGNyZWF0ZSB0aGUgImxvY2siIGZpbGUsIHdlCisgIG1heSBkZWNpZGUgdG8gYGRpZSgpYCwgYW5kIHdlIHdvdWxkIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgd2UKKyAgcmVtb3ZlIHRoZSBmaWxlIHRoYXQgaGFzIG5vdCBiZWVuIGNvbW1pdHRlZCB0byBpdHMgZmluYWwKKyAgZGVzdGluYXRpb24uICBUaGlzIGlzIGRvbmUgYnkgcmVtZW1iZXJpbmcgdGhlIGxvY2tmaWxlcyB3ZQorICBjcmVhdGVkIGluIGEgbGlua2VkIGxpc3QgYW5kIGNsZWFuaW5nIHRoZW0gdXAgZnJvbSBhbgorICBgYXRleGl0KDMpYCBoYW5kbGVyLiAgT3V0c3RhbmRpbmcgbG9ja2ZpbGVzIGFyZSBhbHNvIHJlbW92ZWQKKyAgd2hlbiB0aGUgcHJvZ3JhbSBkaWVzIG9uIGEgc2lnbmFsLgorCisKK1RoZSBmdW5jdGlvbnMKKy0tLS0tLS0tLS0tLS0KKworaG9sZF9sb2NrX2ZpbGVfZm9yX3VwZGF0ZTo6CisKKwlUYWtlIGEgcG9pbnRlciB0byBgc3RydWN0IGxvY2tfZmlsZWAsIHRoZSBmaWxlbmFtZSBvZgorCXRoZSBmaW5hbCBkZXN0aW5hdGlvbiAoZS5nLiBgJEdJVF9ESVIvaW5kZXhgKSBhbmQgYSBmbGFnCisJYGRpZV9vbl9lcnJvcmAuICBBdHRlbXB0IHRvIGNyZWF0ZSBhIGxvY2tmaWxlIGZvciB0aGUKKwlkZXN0aW5hdGlvbiBhbmQgcmV0dXJuIHRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIHdyaXRpbmcKKwl0byB0aGUgZmlsZS4gIElmIGBkaWVfb25fZXJyb3JgIGZsYWcgaXMgdHJ1ZSwgaXQgZGllcyBpZgorCWEgbG9jayBpcyBhbHJlYWR5IHRha2VuIGZvciB0aGUgZmlsZTsgb3RoZXJ3aXNlIGl0CisJcmV0dXJucyBhIG5lZ2F0aXZlIGludGVnZXIgdG8gdGhlIGNhbGxlciBvbiBmYWlsdXJlLgorCitjb21taXRfbG9ja19maWxlOjoKKworCVRha2UgYSBwb2ludGVyIHRvIHRoZSBgc3RydWN0IGxvY2tfZmlsZWAgaW5pdGlhbGl6ZWQKKwl3aXRoIGFuIGVhcmxpZXIgY2FsbCB0byBgaG9sZF9sb2NrX2ZpbGVfZm9yX3VwZGF0ZSgpYCwKKwljbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9yIGFuZCByZW5hbWUgdGhlIGxvY2tmaWxlIHRvIGl0cworCWZpbmFsIGRlc3RpbmF0aW9uLiAgUmV0dXJucyAwIHVwb24gc3VjY2VzcywgYSBuZWdhdGl2ZQorCXZhbHVlIG9uIGZhaWx1cmUgdG8gY2xvc2UoMikgb3IgcmVuYW1lKDIpLgorCityb2xsYmFja19sb2NrX2ZpbGU6OgorCisJVGFrZSBhIHBvaW50ZXIgdG8gdGhlIGBzdHJ1Y3QgbG9ja19maWxlYCBpbml0aWFsaXplZAorCXdpdGggYW4gZWFybGllciBjYWxsIHRvIGBob2xkX2xvY2tfZmlsZV9mb3JfdXBkYXRlKClgLAorCWNsb3NlIHRoZSBmaWxlIGRlc2NyaXB0b3IgYW5kIHJlbW92ZSB0aGUgbG9ja2ZpbGUuCisKK2Nsb3NlX2xvY2tfZmlsZTo6CisJVGFrZSBhIHBvaW50ZXIgdG8gdGhlIGBzdHJ1Y3QgbG9ja19maWxlYCBpbml0aWFsaXplZAorCXdpdGggYW4gZWFybGllciBjYWxsIHRvIGBob2xkX2xvY2tfZmlsZV9mb3JfdXBkYXRlKClgLAorCWFuZCBjbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9yLiAgUmV0dXJucyAwIHVwb24gc3VjY2VzcywKKwlhIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUgdG8gY2xvc2UoMikuCisKK0JlY2F1c2UgdGhlIHN0cnVjdHVyZSBpcyB1c2VkIGluIGFuIGBhdGV4aXQoMylgIGhhbmRsZXIsIGl0cworc3RvcmFnZSBoYXMgdG8gc3RheSB0aHJvdWdob3V0IHRoZSBsaWZlIG9mIHRoZSBwcm9ncmFtLiAgSXQKK2Nhbm5vdCBiZSBhbiBhdXRvIHZhcmlhYmxlIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2suCisKK0NhbGwgYGNvbW1pdF9sb2NrX2ZpbGUoKWAgb3IgYHJvbGxiYWNrX2xvY2tfZmlsZSgpYCB3aGVuIHlvdSBhcmUKK2RvbmUgd3JpdGluZyB0byB0aGUgZmlsZSBkZXNjcmlwdG9yLiAgSWYgeW91IGRvIG5vdCBjYWxsIGVpdGhlcgorYW5kIHNpbXBseSBgZXhpdCgzKWAgZnJvbSB0aGUgcHJvZ3JhbSwgYW4gYGF0ZXhpdCgzKWAgaGFuZGxlcgord2lsbCBjbG9zZSBhbmQgcmVtb3ZlIHRoZSBsb2NrZmlsZS4KKworSWYgeW91IG5lZWQgdG8gY2xvc2UgdGhlIGZpbGUgZGVzY3JpcHRvciB5b3Ugb2J0YWluZWQgZnJvbQorYGhvbGRfbG9ja19maWxlX2Zvcl91cGRhdGVgIGZ1bmN0aW9uIHlvdXJzZWxmLCBkbyBzbyBieSBjYWxsaW5nCitgY2xvc2VfbG9ja19maWxlKClgLiAgWW91IHNob3VsZCBuZXZlciBjYWxsIGBjbG9zZSgyKWAgeW91cnNlbGYhCitPdGhlcndpc2UgdGhlIGBzdHJ1Y3QKK2xvY2tfZmlsZWAgc3RydWN0dXJlIHN0aWxsIHJlbWVtYmVycyB0aGF0IHRoZSBmaWxlIGRlc2NyaXB0b3IKK25lZWRzIHRvIGJlIGNsb3NlZCwgYW5kIGEgbGF0ZXIgY2FsbCB0byBgY29tbWl0X2xvY2tfZmlsZSgpYCBvcgorYHJvbGxiYWNrX2xvY2tfZmlsZSgpYCB3aWxsIHJlc3VsdCBpbiBkdXBsaWNhdGUgY2FsbHMgdG8KK2BjbG9zZSgyKWAuICBXb3JzZSB5ZXQsIGlmIHlvdSBgY2xvc2UoMilgLCBvcGVuIGFub3RoZXIgZmlsZQorZGVzY3JpcHRvciBmb3IgY29tcGxldGVseSBkaWZmZXJlbnQgcHVycG9zZSwgYW5kIHRoZW4gY2FsbAorYGNvbW1pdF9sb2NrX2ZpbGUoKWAgb3IgYHJvbGxiYWNrX2xvY2tfZmlsZSgpYCwgdGhleSBtYXkgY2xvc2UKK3RoYXQgdW5yZWxhdGVkIGZpbGUgZGVzY3JpcHRvci4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1vYmplY3QtYWNjZXNzLnR4dCBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1vYmplY3QtYWNjZXNzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2JiMGU5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvYXBpLW9iamVjdC1hY2Nlc3MudHh0CkBAIC0wLDAgKzEsMTUgQEAKK29iamVjdCBhY2Nlc3MgQVBJCis9PT09PT09PT09PT09PT09PQorCitUYWxrIGFib3V0IDxzaGExX2ZpbGUuYz4gYW5kIDxvYmplY3QuaD4gZmFtaWx5LCB0aGluZ3MgbGlrZQorCisqIHJlYWRfc2hhMV9maWxlKCkKKyogcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2UoKQorKiBoYXNfc2hhMV9maWxlKCkKKyogd3JpdGVfc2hhMV9maWxlKCkKKyogcHJldGVuZF9zaGExX2ZpbGUoKQorKiBsb29rdXBfe29iamVjdCxjb21taXQsdGFnLGJsb2IsdHJlZX0KKyogcGFyc2Vfe29iamVjdCxjb21taXQsdGFnLGJsb2IsdHJlZX0KKyogVXNlIG9mIG9iamVjdCBmbGFncworCisoSkMsIFNoYXduLCBEYW5pZWwsIERzY2hvLCBMaW51cykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1wYXJzZS1vcHRpb25zLnR4dCBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1wYXJzZS1vcHRpb25zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2NkYTk0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvYXBpLXBhcnNlLW9wdGlvbnMudHh0CkBAIC0wLDAgKzEsNiBAQAorcGFyc2Utb3B0aW9ucyBBUEkKKz09PT09PT09PT09PT09PT09CisKK1RhbGsgYWJvdXQgPHBhcnNlLW9wdGlvbnMuaD4KKworKFBpZXJyZSkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1wYXRoLWxpc3QudHh0IGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvYXBpLXBhdGgtbGlzdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA3NzY4MwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1wYXRoLWxpc3QudHh0CkBAIC0wLDAgKzEsOSBAQAorcGF0aC1saXN0IEFQSQorPT09PT09PT09PT09PQorCitUYWxrIGFib3V0IDxwYXRoLWxpc3QuaD4sIHRoaW5ncyBsaWtlCisKKyogaXQgaXMgbm90IGp1c3QgcGF0aHMgYnV0IHN0cmluZ3MgaW4gZ2VuZXJhbDsKKyogdGhlIGNhbGxpbmcgc2VxdWVuY2UuCisKKyhEc2NobykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1xdW90ZS50eHQgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9hcGktcXVvdGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YTFiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9hcGktcXVvdGUudHh0CkBAIC0wLDAgKzEsMTAgQEAKK3F1b3RlIEFQSQorPT09PT09PT09CisKK1RhbGsgYWJvdXQgPHF1b3RlLmg+LCB0aGluZ3MgbGlrZQorCisqIHNxX3F1b3RlIGFuZCB1bnF1b3RlCisqIGNfc3R5bGUgcXVvdGUgYW5kIHVucXVvdGUKKyogcXVvdGluZyBmb3IgZm9yZWlnbiBsYW5ndWFnZXMKKworKEpDKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvYXBpLXJlbW90ZS50eHQgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9hcGktcmVtb3RlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzNiMjJiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvYXBpLXJlbW90ZS50eHQKQEAgLTAsMCArMSwxMjMgQEAKK1JlbW90ZXMgY29uZmlndXJhdGlvbiBBUEkKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIEFQSSBpbiByZW1vdGUuaCBnaXZlcyBhY2Nlc3MgdG8gdGhlIGNvbmZpZ3VyYXRpb24gcmVsYXRlZCB0bworcmVtb3Rlcy4gSXQgaGFuZGxlcyBhbGwgdGhyZWUgY29uZmlndXJhdGlvbiBtZWNoYW5pc21zIGhpc3RvcmljYWxseQorYW5kIGN1cnJlbnRseSB1c2VkIGJ5IGdpdCwgYW5kIHByZXNlbnRzIHRoZSBpbmZvcm1hdGlvbiBpbiBhIHVuaWZvcm0KK2Zhc2hpb24uIE5vdGUgdGhhdCB0aGUgY29kZSBhbHNvIGhhbmRsZXMgcGxhaW4gVVJMcyB3aXRob3V0IGFueQorY29uZmlndXJhdGlvbiwgZ2l2aW5nIHRoZW0ganVzdCB0aGUgZGVmYXVsdCBpbmZvcm1hdGlvbi4KKworc3RydWN0IHJlbW90ZQorLS0tLS0tLS0tLS0tLQorCitgbmFtZWA6OgorCisJVGhlIHVzZXIncyBuaWNrbmFtZSBmb3IgdGhlIHJlbW90ZQorCitgdXJsYDo6CisKKwlBbiBhcnJheSBvZiBhbGwgb2YgdGhlIHVybF9uciBVUkxzIGNvbmZpZ3VyZWQgZm9yIHRoZSByZW1vdGUKKworYHB1c2hgOjoKKworCSBBbiBhcnJheSBvZiByZWZzcGVjcyBjb25maWd1cmVkIGZvciBwdXNoaW5nLCB3aXRoCisJIHB1c2hfcmVmc3BlYyBiZWluZyB0aGUgbGl0ZXJhbCBzdHJpbmdzLCBhbmQgcHVzaF9yZWZzcGVjX25yCisJIGJlaW5nIHRoZSBxdWFudGl0eS4KKworYGZldGNoYDo6CisKKwlBbiBhcnJheSBvZiByZWZzcGVjcyBjb25maWd1cmVkIGZvciBmZXRjaGluZywgd2l0aAorCWZldGNoX3JlZnNwZWMgYmVpbmcgdGhlIGxpdGVyYWwgc3RyaW5ncywgYW5kIGZldGNoX3JlZnNwZWNfbnIKKwliZWluZyB0aGUgcXVhbnRpdHkuCisKK2BmZXRjaF90YWdzYDo6CisKKwlUaGUgc2V0dGluZyBmb3Igd2hldGhlciB0byBmZXRjaCB0YWdzIChhcyBhIHNlcGFyYXRlIHJ1bGUgZnJvbQorCXRoZSBjb25maWd1cmVkIHJlZnNwZWNzKTsgLTEgbWVhbnMgbmV2ZXIgdG8gZmV0Y2ggdGFncywgMAorCW1lYW5zIHRvIGF1dG8tZm9sbG93IHRhZ3MgYmFzZWQgb24gdGhlIGRlZmF1bHQgaGV1cmlzdGljLCAxCisJbWVhbnMgdG8gYWx3YXlzIGF1dG8tZm9sbG93IHRhZ3MsIGFuZCAyIG1lYW5zIHRvIGZldGNoIGFsbAorCXRhZ3MuCisKK2ByZWNlaXZlcGFja2AsIGB1cGxvYWRwYWNrYDo6CisKKwlUaGUgY29uZmlndXJlZCBoZWxwZXIgcHJvZ3JhbXMgdG8gcnVuIG9uIHRoZSByZW1vdGUgc2lkZSwgZm9yCisJZ2l0LW5hdGl2ZSBwcm90b2NvbHMuCisKK2BodHRwX3Byb3h5YDo6CisKKwlUaGUgcHJveHkgdG8gdXNlIGZvciBjdXJsIChodHRwLCBodHRwcywgZnRwLCBldGMuKSBVUkxzLgorCitzdHJ1Y3QgcmVtb3RlcyBjYW4gYmUgZm91bmQgYnkgbmFtZSB3aXRoIHJlbW90ZV9nZXQoKSwgYW5kIGl0ZXJhdGVkCit0aHJvdWdoIHdpdGggZm9yX2VhY2hfcmVtb3RlKCkuIHJlbW90ZV9nZXQoTlVMTCkgd2lsbCByZXR1cm4gdGhlCitkZWZhdWx0IHJlbW90ZSwgZ2l2ZW4gdGhlIGN1cnJlbnQgYnJhbmNoIGFuZCBjb25maWd1cmF0aW9uLgorCitzdHJ1Y3QgcmVmc3BlYworLS0tLS0tLS0tLS0tLS0KKworQSBzdHJ1Y3QgcmVmc3BlYyBob2xkcyB0aGUgcGFyc2VkIGludGVycHJldGF0aW9uIG9mIGEgcmVmc3BlYy4gSWYgaXQKK3dpbGwgZm9yY2UgdXBkYXRlcyAoc3RhcnRzIHdpdGggYSAnKycpLCBmb3JjZSBpcyB0cnVlLiBJZiBpdCBpcyBhCitwYXR0ZXJuIChzaWRlcyBlbmQgd2l0aCAnKicpIHBhdHRlcm4gaXMgdHJ1ZS4gc3JjIGFuZCBkZXN0IGFyZSB0aGUgdHdvCitzaWRlcyAoaWYgYSBwYXR0ZXJuLCBvbmx5IHRoZSBwYXJ0IG91dHNpZGUgb2YgdGhlIHdpbGRjYXJkcyk7IGlmIHRoZXJlCitpcyBvbmx5IG9uZSBzaWRlLCBpdCBpcyBzcmMsIGFuZCBkc3QgaXMgTlVMTDsgaWYgc2lkZXMgZXhpc3QgYnV0IGFyZQorZW1wdHkgKGkuZS4sIHRoZSByZWZzcGVjIGVpdGhlciBzdGFydHMgb3IgZW5kcyB3aXRoICc6JyksIHRoZQorY29ycmVzcG9uZGluZyBzaWRlIGlzICIiLgorCitUaGlzIHBhcnNpbmcgY2FuIGJlIGRvbmUgdG8gYW4gYXJyYXkgb2Ygc3RyaW5ncyB0byBnaXZlIGFuIGFycmF5IG9mCitzdHJ1Y3QgcmVmcHNlY3Mgd2l0aCBwYXJzZV9yZWZfc3BlYygpLgorCityZW1vdGVfZmluZF90cmFja2luZygpLCBnaXZlbiBhIHJlbW90ZSBhbmQgYSBzdHJ1Y3QgcmVmc3BlYyB3aXRoCitlaXRoZXIgc3JjIG9yIGRzdCBmaWxsZWQgb3V0LCB3aWxsIGZpbGwgb3V0IHRoZSBvdGhlciBzdWNoIHRoYXQgdGhlCityZXN1bHQgaXMgaW4gdGhlICJmZXRjaCIgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIHJlbW90ZSAobm90ZSB0aGF0IHRoaXMKK2V2YWx1YXRlcyBwYXR0ZXJucyBhbmQgcmV0dXJucyBhIHNpbmdsZSByZXN1bHQpLgorCitzdHJ1Y3QgYnJhbmNoCistLS0tLS0tLS0tLS0tCisKK05vdGUgdGhhdCB0aGlzIG1heSBlbmQgdXAgbW92aW5nIHRvIGJyYW5jaC5oCisKK3N0cnVjdCBicmFuY2ggaG9sZHMgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGEgYnJhbmNoLiBJdCBjYW4gYmUgbG9va2VkCit1cCB3aXRoIGJyYW5jaF9nZXQobmFtZSkgZm9yICJyZWZzL2hlYWRzL3tuYW1lfSIsIG9yIHdpdGgKK2JyYW5jaF9nZXQoTlVMTCkgZm9yIEhFQUQuCisKK0l0IGNvbnRhaW5zOgorCitgbmFtZWA6OgorCisJVGhlIHNob3J0IG5hbWUgb2YgdGhlIGJyYW5jaC4KKworYHJlZm5hbWVgOjoKKworCVRoZSBmdWxsIHBhdGggZm9yIHRoZSBicmFuY2ggcmVmLgorCitgcmVtb3RlX25hbWVgOjoKKworCVRoZSBuYW1lIG9mIHRoZSByZW1vdGUgbGlzdGVkIGluIHRoZSBjb25maWd1cmF0aW9uLgorCitgcmVtb3RlYDo6CisKKwlUaGUgc3RydWN0IHJlbW90ZSBmb3IgdGhhdCByZW1vdGUuCisKK2BtZXJnZV9uYW1lYDo6CisKKwlBbiBhcnJheSBvZiB0aGUgIm1lcmdlIiBsaW5lcyBpbiB0aGUgY29uZmlndXJhdGlvbi4KKworYG1lcmdlYDo6CisKKwlBbiBhcnJheSBvZiB0aGUgc3RydWN0IHJlZnNwZWNzIHVzZWQgZm9yIHRoZSBtZXJnZSBsaW5lcy4gVGhhdAorCWlzLCBtZXJnZVtpXS0+ZHN0IGlzIGEgbG9jYWwgdHJhY2tpbmcgcmVmIHdoaWNoIHNob3VsZCBiZQorCW1lcmdlZCBpbnRvIHRoaXMgYnJhbmNoIGJ5IGRlZmF1bHQuCisKK2BtZXJnZV9ucmA6OgorCisJVGhlIG51bWJlciBvZiBtZXJnZSBjb25maWd1cmF0aW9ucworCiticmFuY2hfaGFzX21lcmdlX2NvbmZpZygpIHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnJhbmNoIGhhcyBtZXJnZQorY29uZmlndXJhdGlvbiBnaXZlbi4KKworT3RoZXIgc3R1ZmYKKy0tLS0tLS0tLS0tCisKK1RoZXJlIGlzIG90aGVyIHN0dWZmIGluIHJlbW90ZS5oIHRoYXQgaXMgcmVsYXRlZCwgaW4gZ2VuZXJhbCwgdG8gdGhlCitwcm9jZXNzIG9mIGludGVyYWN0aW5nIHdpdGggcmVtb3Rlcy4KKworKERhbmllbCBCYXJrYWxvdykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1yZXZpc2lvbi13YWxraW5nLnR4dCBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1yZXZpc2lvbi13YWxraW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWEyNDU1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvYXBpLXJldmlzaW9uLXdhbGtpbmcudHh0CkBAIC0wLDAgKzEsOSBAQAorcmV2aXNpb24gd2Fsa2luZyBBUEkKKz09PT09PT09PT09PT09PT09PT09CisKK1RhbGsgYWJvdXQgPHJldmlzaW9uLmg+LCB0aGluZ3MgbGlrZToKKworKiB0d28gZGlmZl9vcHRpb25zLCBvbmUgZm9yIHBhdGggbGltaXRpbmcsIGFub3RoZXIgZm9yIG91dHB1dDsKKyogY2FsbGluZyBzZXF1ZW5jZTogaW5pdF9yZXZpc2lvbnMoKSwgc2V0dXBfcmV2c2lvbnMoKSwgZ2V0X3JldmlzaW9uKCk7CisKKyhMaW51cywgSkMsIERzY2hvKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvYXBpLXJ1bi1jb21tYW5kLnR4dCBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1ydW4tY29tbWFuZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM2NGEyMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1ydW4tY29tbWFuZC50eHQKQEAgLTAsMCArMSwxNzIgQEAKK3J1bi1jb21tYW5kIEFQSQorPT09PT09PT09PT09PT09CisKK1RoZSBydW4tY29tbWFuZCBBUEkgb2ZmZXJzIGEgdmVyc2F0aWxlIHRvb2wgdG8gcnVuIHN1Yi1wcm9jZXNzZXMgd2l0aAorcmVkaXJlY3RlZCBpbnB1dCBhbmQgb3V0cHV0IGFzIHdlbGwgYXMgd2l0aCBhIG1vZGlmaWVkIGVudmlyb25tZW50CithbmQgYW4gYWx0ZXJuYXRlIGN1cnJlbnQgZGlyZWN0b3J5LgorCitBIHNpbWlsYXIgQVBJIG9mZmVycyB0aGUgY2FwYWJpbGl0eSB0byBydW4gYSBmdW5jdGlvbiBhc3luY2hyb25vdXNseSwKK3doaWNoIGlzIHByaW1hcmlseSB1c2VkIHRvIGNhcHR1cmUgdGhlIG91dHB1dCB0aGF0IHRoZSBmdW5jdGlvbgorcHJvZHVjZXMgaW4gdGhlIGNhbGxlciBpbiBvcmRlciB0byBwcm9jZXNzIGl0LgorCisKK0Z1bmN0aW9ucworLS0tLS0tLS0tCisKK2BzdGFydF9jb21tYW5kYDo6CisKKwlTdGFydCBhIHN1Yi1wcm9jZXNzLiBUYWtlcyBhIHBvaW50ZXIgdG8gYSBgc3RydWN0IGNoaWxkX3Byb2Nlc3NgCisJdGhhdCBzcGVjaWZpZXMgdGhlIGRldGFpbHMgYW5kIHJldHVybnMgcGlwZSBGRHMgKGlmIHJlcXVlc3RlZCkuCisJU2VlIGJlbG93IGZvciBkZXRhaWxzLgorCitgZmluaXNoX2NvbW1hbmRgOjoKKworCVdhaXQgZm9yIHRoZSBjb21wbGV0aW9uIG9mIGEgc3ViLXByb2Nlc3MgdGhhdCB3YXMgc3RhcnRlZCB3aXRoCisJc3RhcnRfY29tbWFuZCgpLgorCitgcnVuX2NvbW1hbmRgOjoKKworCUEgY29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBlbmNhcHN1bGF0ZXMgYSBzZXF1ZW5jZSBvZgorCXN0YXJ0X2NvbW1hbmQoKSBmb2xsb3dlZCBieSBmaW5pc2hfY29tbWFuZCgpLiBUYWtlcyBhIHBvaW50ZXIKKwl0byBhIGBzdHJ1Y3QgY2hpbGRfcHJvY2Vzc2AgdGhhdCBzcGVjaWZpZXMgdGhlIGRldGFpbHMuCisKK2BydW5fY29tbWFuZF92X29wdGAsIGBydW5fY29tbWFuZF92X29wdF9kaXJgLCBgcnVuX2NvbW1hbmRfdl9vcHRfY2RfZW52YDo6CisKKwlDb252ZW5pZW5jZSBmdW5jdGlvbnMgdGhhdCBlbmNhcHN1bGF0ZSBhIHNlcXVlbmNlIG9mCisJc3RhcnRfY29tbWFuZCgpIGZvbGxvd2VkIGJ5IGZpbmlzaF9jb21tYW5kKCkuIFRoZSBhcmd1bWVudCBhcmd2CisJc3BlY2lmaWVzIHRoZSBwcm9ncmFtIGFuZCBpdHMgYXJndW1lbnRzLiBUaGUgYXJndW1lbnQgb3B0IGlzIHplcm8KKwlvciBtb3JlIG9mIHRoZSBmbGFncyBgUlVOX0NPTU1BTkRfTk9fU1RESU5gLCBgUlVOX0dJVF9DTURgLCBvcgorCWBSVU5fQ09NTUFORF9TVERPVVRfVE9fU1RERVJSYCB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIG1lbWJlcnMKKwkubm9fc3RkaW4sIC5naXRfY21kLCAuc3Rkb3V0X3RvX3N0ZGVyciBvZiBgc3RydWN0IGNoaWxkX3Byb2Nlc3NgLgorCVRoZSBhcmd1bWVudCBkaXIgY29ycmVzcG9uZHMgdGhlIG1lbWJlciAuZGlyLiBUaGUgYXJndW1lbnQgZW52CisJY29ycmVzcG9uZHMgdG8gdGhlIG1lbWJlciAuZW52LgorCitgc3RhcnRfYXN5bmNgOjoKKworCVJ1biBhIGZ1bmN0aW9uIGFzeW5jaHJvbm91c2x5LiBUYWtlcyBhIHBvaW50ZXIgdG8gYSBgc3RydWN0CisJYXN5bmNgIHRoYXQgc3BlY2lmaWVzIHRoZSBkZXRhaWxzIGFuZCByZXR1cm5zIGEgcGlwZSBGRAorCWZyb20gd2hpY2ggdGhlIGNhbGxlciByZWFkcy4gU2VlIGJlbG93IGZvciBkZXRhaWxzLgorCitgZmluaXNoX2FzeW5jYDo6CisKKwlXYWl0IGZvciB0aGUgY29tcGxldGlvbiBvZiBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gdGhhdCB3YXMKKwlzdGFydGVkIHdpdGggc3RhcnRfYXN5bmMoKS4KKworCitEYXRhIHN0cnVjdHVyZXMKKy0tLS0tLS0tLS0tLS0tLQorCisqIGBzdHJ1Y3QgY2hpbGRfcHJvY2Vzc2AKKworVGhpcyBkZXNjcmliZXMgdGhlIGFyZ3VtZW50cywgcmVkaXJlY3Rpb25zLCBhbmQgZW52aXJvbm1lbnQgb2YgYQorY29tbWFuZCB0byBydW4gaW4gYSBzdWItcHJvY2Vzcy4KKworVGhlIGNhbGxlcjoKKworMS4gYWxsb2NhdGVzIGFuZCBjbGVhcnMgKG1lbXNldCgmY2hsZCwgJzAnLCBzaXplb2YoY2hsZCkpOykgYQorICAgc3RydWN0IGNoaWxkX3Byb2Nlc3MgdmFyaWFibGU7CisyLiBpbml0aWFsaXplcyB0aGUgbWVtYmVyczsKKzMuIGNhbGxzIHN0YXJ0X2NvbW1hbmQoKTsKKzQuIHByb2Nlc3NlcyB0aGUgZGF0YTsKKzUuIGNsb3NlcyBmaWxlIGRlc2NyaXB0b3JzIChpZiBuZWNlc3Nhcnk7IHNlZSBiZWxvdyk7Cis2LiBjYWxscyBmaW5pc2hfY29tbWFuZCgpLgorCitUaGUgLmFyZ3YgbWVtYmVyIGlzIHNldCB1cCBhcyBhbiBhcnJheSBvZiBzdHJpbmcgcG9pbnRlcnMgKE5VTEwKK3Rlcm1pbmF0ZWQpLCBvZiB3aGljaCAuYXJndlswXSBpcyB0aGUgcHJvZ3JhbSBuYW1lIHRvIHJ1biAodXN1YWxseQord2l0aG91dCBhIHBhdGgpLiBJZiB0aGUgY29tbWFuZCB0byBydW4gaXMgYSBnaXQgY29tbWFuZCwgc2V0IGFyZ3ZbMF0gdG8KK3RoZSBjb21tYW5kIG5hbWUgd2l0aG91dCB0aGUgJ2dpdC0nIHByZWZpeCBhbmQgc2V0IC5naXRfY21kID0gMS4KKworVGhlIG1lbWJlcnMgLmluLCAub3V0LCAuZXJyIGFyZSB1c2VkIHRvIHJlZGlyZWN0IHN0ZGluLCBzdGRvdXQsCitzdGRlcnIgYXMgZm9sbG93czoKKworLiBTcGVjaWZ5IDAgdG8gcmVxdWVzdCBubyBzcGVjaWFsIHJlZGlyZWN0aW9uLiBObyBuZXcgZmlsZSBkZXNjcmlwdG9yCisgIGlzIGFsbG9jYXRlZC4gVGhlIGNoaWxkIHByb2Nlc3Mgc2ltcGx5IGluaGVyaXRzIHRoZSBjaGFubmVsIGZyb20gdGhlCisgIHBhcmVudC4KKworLiBTcGVjaWZ5IC0xIHRvIGhhdmUgYSBwaXBlIGFsbG9jYXRlZDsgc3RhcnRfY29tbWFuZCgpIHJlcGxhY2VzIC0xCisgIGJ5IHRoZSBwaXBlIEZEIGluIHRoZSBmb2xsb3dpbmcgd2F5OgorCisJLmluOiBSZXR1cm5zIHRoZSB3cml0YWJsZSBwaXBlIGVuZCBpbnRvIHdoaWNoIHRoZSBjYWxsZXIgd3JpdGVzOworCQl0aGUgcmVhZGFibGUgZW5kIG9mIHRoZSBwaXBlIGJlY29tZXMgdGhlIGNoaWxkJ3Mgc3RkaW4uCisKKwkub3V0LCAuZXJyOiBSZXR1cm5zIHRoZSByZWFkYWJsZSBwaXBlIGVuZCBmcm9tIHdoaWNoIHRoZSBjYWxsZXIKKwkJcmVhZHM7IHRoZSB3cml0YWJsZSBlbmQgb2YgdGhlIHBpcGUgZW5kIGJlY29tZXMgY2hpbGQncworCQlzdGRvdXQvc3RkZXJyLgorCisgIFRoZSBjYWxsZXIgb2Ygc3RhcnRfY29tbWFuZCgpIG11c3QgY2xvc2UgdGhlIHNvIHJldHVybmVkIEZEcworICBhZnRlciBpdCBoYXMgY29tcGxldGVkIHJlYWRpbmcgZnJvbS93cml0aW5nIHRvIGl0IQorCisuIFNwZWNpZnkgYSBmaWxlIGRlc2NyaXB0b3IgPiAwIHRvIGJlIHVzZWQgYnkgdGhlIGNoaWxkOgorCisJLmluOiBUaGUgRkQgbXVzdCBiZSByZWFkYWJsZTsgaXQgYmVjb21lcyBjaGlsZCdzIHN0ZGluLgorCS5vdXQ6IFRoZSBGRCBtdXN0IGJlIHdyaXRhYmxlOyBpdCBiZWNvbWVzIGNoaWxkJ3Mgc3Rkb3V0LgorCS5lcnIgPiAwIGlzIG5vdCBzdXBwb3J0ZWQuCisKKyAgVGhlIHNwZWNpZmllZCBGRCBpcyBjbG9zZWQgYnkgc3RhcnRfY29tbWFuZCgpLCBldmVuIGlmIGl0IGZhaWxzIHRvCisgIHJ1biB0aGUgc3ViLXByb2Nlc3MhCisKKy4gU3BlY2lhbCBmb3JtcyBvZiByZWRpcmVjdGlvbiBhcmUgYXZhaWxhYmxlIGJ5IHNldHRpbmcgdGhlc2UgbWVtYmVycworICB0byAxOgorCisJLm5vX3N0ZGluLCAubm9fc3Rkb3V0LCAubm9fc3RkZXJyOiBUaGUgcmVzcGVjdGl2ZSBjaGFubmVsIGlzCisJCXJlZGlyZWN0ZWQgdG8gL2Rldi9udWxsLgorCisJLnN0ZG91dF90b19zdGRlcnI6IHN0ZG91dCBvZiB0aGUgY2hpbGQgaXMgcmVkaXJlY3RlZCB0byBpdHMKKwkJc3RkZXJyLiBUaGlzIGhhcHBlbnMgYWZ0ZXIgc3RkZXJyIGlzIGl0c2VsZiByZWRpcmVjdGVkLgorCQlTbyBzdGRvdXQgd2lsbCBmb2xsb3cgc3RkZXJyIHRvIHdoZXJldmVyIGl0IGlzCisJCXJlZGlyZWN0ZWQuCisKK1RvIG1vZGlmeSB0aGUgZW52aXJvbm1lbnQgb2YgdGhlIHN1Yi1wcm9jZXNzLCBzcGVjaWZ5IGFuIGFycmF5IG9mCitzdHJpbmcgcG9pbnRlcnMgKE5VTEwgdGVybWluYXRlZCkgaW4gLmVudjoKKworLiBJZiB0aGUgc3RyaW5nIGlzIG9mIHRoZSBmb3JtICJWQVI9dmFsdWUiLCBpLmUuIGl0IGNvbnRhaW5zICc9JworICB0aGUgdmFyaWFibGUgaXMgYWRkZWQgdG8gdGhlIGNoaWxkIHByb2Nlc3MncyBlbnZpcm9ubWVudC4KKworLiBJZiB0aGUgc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gJz0nLCBpdCBuYW1lcyBhbiBlbnZpcm9ubWVudAorICB2YXJpYWJsZSB0aGF0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBjaGlsZCBwcm9jZXNzJ3MgZW52aXJvbm1lbnQuCisKK1RvIHNwZWNpZnkgYSBuZXcgaW5pdGlhbCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHN1Yi1wcm9jZXNzLAorc3BlY2lmeSBpdCBpbiB0aGUgLmRpciBtZW1iZXIuCisKKworKiBgc3RydWN0IGFzeW5jYAorCitUaGlzIGRlc2NyaWJlcyBhIGZ1bmN0aW9uIHRvIHJ1biBhc3luY2hyb25vdXNseSwgd2hvc2UgcHVycG9zZSBpcwordG8gcHJvZHVjZSBvdXRwdXQgdGhhdCB0aGUgY2FsbGVyIHJlYWRzLgorCitUaGUgY2FsbGVyOgorCisxLiBhbGxvY2F0ZXMgYW5kIGNsZWFycyAobWVtc2V0KCZhc3ksICcwJywgc2l6ZW9mKGFzeSkpOykgYQorICAgc3RydWN0IGFzeW5jIHZhcmlhYmxlOworMi4gaW5pdGlhbGl6ZXMgLnByb2MgYW5kIC5kYXRhOworMy4gY2FsbHMgc3RhcnRfYXN5bmMoKTsKKzQuIHByb2Nlc3NlcyB0aGUgZGF0YSBieSByZWFkaW5nIGZyb20gdGhlIGZkIGluIC5vdXQ7Cis1LiBjbG9zZXMgLm91dDsKKzYuIGNhbGxzIGZpbmlzaF9hc3luYygpLgorCitUaGUgZnVuY3Rpb24gcG9pbnRlciBpbiAucHJvYyBoYXMgdGhlIGZvbGxvd2luZyBzaWduYXR1cmU6CisKKwlpbnQgcHJvYyhpbnQgZmQsIHZvaWQgKmRhdGEpOworCisuIGZkIHNwZWNpZmllcyBhIHdyaXRhYmxlIGZpbGUgZGVzY3JpcHRvciB0byB3aGljaCB0aGUgZnVuY3Rpb24gbXVzdAorICB3cml0ZSB0aGUgZGF0YSB0aGF0IGl0IHByb2R1Y2VzLiBUaGUgZnVuY3Rpb24gKm11c3QqIGNsb3NlIHRoaXMKKyAgZGVzY3JpcHRvciBiZWZvcmUgaXQgcmV0dXJucy4KKworLiBkYXRhIGlzIHRoZSB2YWx1ZSB0aGF0IHRoZSBjYWxsZXIgaGFzIHNwZWNpZmllZCBpbiB0aGUgLmRhdGEgbWVtYmVyCisgIG9mIHN0cnVjdCBhc3luYy4KKworLiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBpcyAwIG9uIHN1Y2Nlc3MgYW5kIG5vbi16ZXJvCisgIG9uIGZhaWx1cmUuIElmIHRoZSBmdW5jdGlvbiBpbmRpY2F0ZXMgZmFpbHVyZSwgZmluaXNoX2FzeW5jKCkgd2lsbAorICByZXBvcnQgZmFpbHVyZSBhcyB3ZWxsLgorCisKK1RoZXJlIGFyZSBzZXJpb3VzIHJlc3RyaWN0aW9ucyBvbiB3aGF0IHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gY2FuIGRvCitiZWNhdXNlIHRoaXMgZmFjaWxpdHkgaXMgaW1wbGVtZW50ZWQgYnkgYSBwaXBlIHRvIGEgZm9ya2VkIHByb2Nlc3Mgb24KK1VOSVgsIGJ1dCBieSBhIHRocmVhZCBpbiB0aGUgc2FtZSBhZGRyZXNzIHNwYWNlIG9uIFdpbmRvd3M6CisKKy4gSXQgY2Fubm90IGNoYW5nZSB0aGUgcHJvZ3JhbSdzIHN0YXRlIChnbG9iYWwgdmFyaWFibGVzLCBlbnZpcm9ubWVudCwKKyAgZXRjLikgaW4gYSB3YXkgdGhhdCB0aGUgY2FsbGVyIG5vdGljZXM7IGluIG90aGVyIHdvcmRzLCAub3V0IGlzIHRoZQorICBvbmx5IGNvbW11bmljYXRpb24gY2hhbm5lbCB0byB0aGUgY2FsbGVyLgorCisuIEl0IG11c3Qgbm90IGNoYW5nZSB0aGUgcHJvZ3JhbSdzIHN0YXRlIHRoYXQgdGhlIGNhbGxlciBvZiB0aGUKKyAgZmFjaWxpdHkgYWxzbyB1c2VzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvYXBpLXNldHVwLnR4dCBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1zZXR1cC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY2M2EwNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1zZXR1cC50eHQKQEAgLTAsMCArMSwxMyBAQAorc2V0dXAgQVBJCis9PT09PT09PT0KKworVGFsayBhYm91dAorCisqIHNldHVwX2dpdF9kaXJlY3RvcnkoKQorKiBzZXR1cF9naXRfZGlyZWN0b3J5X2dlbnRseSgpCisqIGlzX2luc2lkZV9naXRfZGlyKCkKKyogaXNfaW5zaWRlX3dvcmtfdHJlZSgpCisqIHNldHVwX3dvcmtfdHJlZSgpCisqIGdldF9wYXRoc3BlYygpCisKKyhEc2NobykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1zdHJidWYudHh0IGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvYXBpLXN0cmJ1Zi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyZTRmMwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS1zdHJidWYudHh0CkBAIC0wLDAgKzEsNiBAQAorc3RyYnVmIEFQSQorPT09PT09PT09PQorCitUYWxrIGFib3V0IDxzdHJidWYuaD4KKworKFBpZXJyZSwgSkMpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9hcGktdHJlZS13YWxraW5nLnR4dCBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL2FwaS10cmVlLXdhbGtpbmcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZGRmOTEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9hcGktdHJlZS13YWxraW5nLnR4dApAQCAtMCwwICsxLDEyIEBACit0cmVlIHdhbGtpbmcgQVBJCis9PT09PT09PT09PT09PT09CisKK1RhbGsgYWJvdXQgPHRyZWUtd2Fsay5oPiwgdGhpbmdzIGxpa2UKKworKiBzdHJ1Y3QgdHJlZV9kZXNjCisqIGluaXRfdHJlZV9kZXNjCisqIHRyZWVfZW50cnlfZXh0cmFjdAorKiB1cGRhdGVfdHJlZV9lbnRyeQorKiBnZXRfdHJlZV9lbnRyeQorCisoSkMsIExpbnVzKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvYXBpLXhkaWZmLWludGVyZmFjZS50eHQgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9hcGkteGRpZmYtaW50ZXJmYWNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mjk2ZWNhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvYXBpLXhkaWZmLWludGVyZmFjZS50eHQKQEAgLTAsMCArMSw3IEBACit4ZGlmZiBpbnRlcmZhY2UgQVBJCis9PT09PT09PT09PT09PT09PT09CisKK1RhbGsgYWJvdXQgb3VyIGNhbGxpbmcgY29udmVudGlvbiB0byB4ZGlmZiBsaWJyYXJ5LCBpbmNsdWRpbmcKK3hkaWZmX2VtaXRfY29uc3VtZV9mbi4KKworKERzY2hvLCBKQykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3BhY2stZm9ybWF0LnR4dCBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3BhY2stZm9ybWF0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODAzZTY0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvcGFjay1mb3JtYXQudHh0CkBAIC0wLDAgKzEsMTYwIEBACitHSVQgcGFjayBmb3JtYXQKKz09PT09PT09PT09PT09PQorCis9IHBhY2stKi5wYWNrIGZpbGVzIGhhdmUgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisKKyAgIC0gQSBoZWFkZXIgYXBwZWFycyBhdCB0aGUgYmVnaW5uaW5nIGFuZCBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgIDQtYnl0ZSBzaWduYXR1cmU6CisgICAgICAgICBUaGUgc2lnbmF0dXJlIGlzOiB7J1AnLCAnQScsICdDJywgJ0snfQorCisgICAgIDQtYnl0ZSB2ZXJzaW9uIG51bWJlciAobmV0d29yayBieXRlIG9yZGVyKToKKyAgICAgICAgIEdJVCBjdXJyZW50bHkgYWNjZXB0cyB2ZXJzaW9uIG51bWJlciAyIG9yIDMgYnV0CisgICAgICAgICBnZW5lcmF0ZXMgdmVyc2lvbiAyIG9ubHkuCisKKyAgICAgNC1ieXRlIG51bWJlciBvZiBvYmplY3RzIGNvbnRhaW5lZCBpbiB0aGUgcGFjayAobmV0d29yayBieXRlIG9yZGVyKQorCisgICAgIE9ic2VydmF0aW9uOiB3ZSBjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gNEcgdmVyc2lvbnMgOy0pIGFuZAorICAgICBtb3JlIHRoYW4gNEcgb2JqZWN0cyBpbiBhIHBhY2suCisKKyAgIC0gVGhlIGhlYWRlciBpcyBmb2xsb3dlZCBieSBudW1iZXIgb2Ygb2JqZWN0IGVudHJpZXMsIGVhY2ggb2YKKyAgICAgd2hpY2ggbG9va3MgbGlrZSB0aGlzOgorCisgICAgICh1bmRlbHRpZmllZCByZXByZXNlbnRhdGlvbikKKyAgICAgbi1ieXRlIHR5cGUgYW5kIGxlbmd0aCAoMy1iaXQgdHlwZSwgKG4tMSkqNys0LWJpdCBsZW5ndGgpCisgICAgIGNvbXByZXNzZWQgZGF0YQorCisgICAgIChkZWx0aWZpZWQgcmVwcmVzZW50YXRpb24pCisgICAgIG4tYnl0ZSB0eXBlIGFuZCBsZW5ndGggKDMtYml0IHR5cGUsIChuLTEpKjcrNC1iaXQgbGVuZ3RoKQorICAgICAyMC1ieXRlIGJhc2Ugb2JqZWN0IG5hbWUKKyAgICAgY29tcHJlc3NlZCBkZWx0YSBkYXRhCisKKyAgICAgT2JzZXJ2YXRpb246IGxlbmd0aCBvZiBlYWNoIG9iamVjdCBpcyBlbmNvZGVkIGluIGEgdmFyaWFibGUKKyAgICAgbGVuZ3RoIGZvcm1hdCBhbmQgaXMgbm90IGNvbnN0cmFpbmVkIHRvIDMyLWJpdCBvciBhbnl0aGluZy4KKworICAtIFRoZSB0cmFpbGVyIHJlY29yZHMgMjAtYnl0ZSBTSEExIGNoZWNrc3VtIG9mIGFsbCBvZiB0aGUgYWJvdmUuCisKKz0gT3JpZ2luYWwgKHZlcnNpb24gMSkgcGFjay0qLmlkeCBmaWxlcyBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorCisgIC0gVGhlIGhlYWRlciBjb25zaXN0cyBvZiAyNTYgNC1ieXRlIG5ldHdvcmsgYnl0ZSBvcmRlcgorICAgIGludGVnZXJzLiAgTi10aCBlbnRyeSBvZiB0aGlzIHRhYmxlIHJlY29yZHMgdGhlIG51bWJlciBvZgorICAgIG9iamVjdHMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcGFjaywgdGhlIGZpcnN0IGJ5dGUgb2Ygd2hvc2UKKyAgICBvYmplY3QgbmFtZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gTi4gIFRoaXMgaXMgY2FsbGVkIHRoZQorICAgICdmaXJzdC1sZXZlbCBmYW4tb3V0JyB0YWJsZS4KKworICAtIFRoZSBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgc29ydGVkIDI0LWJ5dGUgZW50cmllcywgb25lIGVudHJ5CisgICAgcGVyIG9iamVjdCBpbiB0aGUgcGFjay4gIEVhY2ggZW50cnkgaXM6CisKKyAgICA0LWJ5dGUgbmV0d29yayBieXRlIG9yZGVyIGludGVnZXIsIHJlY29yZGluZyB3aGVyZSB0aGUKKyAgICBvYmplY3QgaXMgc3RvcmVkIGluIHRoZSBwYWNrZmlsZSBhcyB0aGUgb2Zmc2V0IGZyb20gdGhlCisgICAgYmVnaW5uaW5nLgorCisgICAgMjAtYnl0ZSBvYmplY3QgbmFtZS4KKworICAtIFRoZSBmaWxlIGlzIGNvbmNsdWRlZCB3aXRoIGEgdHJhaWxlcjoKKworICAgIEEgY29weSBvZiB0aGUgMjAtYnl0ZSBTSEExIGNoZWNrc3VtIGF0IHRoZSBlbmQgb2YKKyAgICBjb3JyZXNwb25kaW5nIHBhY2tmaWxlLgorCisgICAgMjAtYnl0ZSBTSEExLWNoZWNrc3VtIG9mIGFsbCBvZiB0aGUgYWJvdmUuCisKK1BhY2sgSWR4IGZpbGU6CisKKwktLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworZmFub3V0CSAgICB8IGZhbm91dFswXSA9IDIgKGZvciBleGFtcGxlKSAgICB8LS4KK3RhYmxlCSAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIHwKKwkgICAgfCBmYW5vdXRbMV0gICAgICAgICAgICAgICAgICAgICAgfCB8CisJICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgfAorCSAgICB8IGZhbm91dFsyXSAgICAgICAgICAgICAgICAgICAgICB8IHwKKwkgICAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiB8CisJICAgIHwgZmFub3V0WzI1NV0gPSB0b3RhbCBvYmplY3RzICAgIHwtLS0uCisJLS0gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgfCB8CittYWluCSAgICB8IG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAoraW5kZXgJICAgIHwgb2JqZWN0IG5hbWUgMDBYWFhYWFhYWFhYWFhYWFhYIHwgfCB8Cit0YWJsZQkgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyB8IHwKKwkgICAgfCBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKwkgICAgfCBvYmplY3QgbmFtZSAwMFhYWFhYWFhYWFhYWFhYWFggfCB8IHwKKwkgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKzwrIHwKKwkgIC4tfCBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKwkgIHwgfCBvYmplY3QgbmFtZSAwMVhYWFhYWFhYWFhYWFhYWFggfCAgIHwKKwkgIHwgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgIHwKKwkgIHwgfCBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKwkgIHwgfCBvYmplY3QgbmFtZSAwMVhYWFhYWFhYWFhYWFhYWFggfCAgIHwKKwkgIHwgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAgIHwKKwkgIHwgfCBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKwkgIHwgfCBvYmplY3QgbmFtZSBGRlhYWFhYWFhYWFhYWFhYWFggfCAgIHwKKwktLXwgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKzwtLSsKK3RyYWlsZXIJICB8IHwgcGFja2ZpbGUgY2hlY2tzdW0gICAgICAgICAgICAgIHwKKwkgIHwgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAgfCB8IGlkeGZpbGUgY2hlY2tzdW0gICAgICAgICAgICAgICB8CisJICB8ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAuLS0tLS0tLS4KKyAgICAgICAgICAgICAgICAgIHwKK1BhY2sgZmlsZSBlbnRyeTogPCsKKworICAgICBwYWNrZWQgb2JqZWN0IGhlYWRlcjoKKwkxLWJ5dGUgc2l6ZSBleHRlbnNpb24gYml0IChNU0IpCisJICAgICAgIHR5cGUgKG5leHQgMyBiaXQpCisJICAgICAgIHNpemUwIChsb3dlciA0LWJpdCkKKyAgICAgICAgbi1ieXRlIHNpemVOIChhcyBsb25nIGFzIE1TQiBpcyBzZXQsIGVhY2ggNy1iaXQpCisJCXNpemUwLi5zaXplTiBmb3JtIDQrNys3Ky4uKzcgYml0IGludGVnZXIsIHNpemUwCisJCWlzIHRoZSBsZWFzdCBzaWduaWZpY2FudCBwYXJ0LCBhbmQgc2l6ZU4gaXMgdGhlCisJCW1vc3Qgc2lnbmlmaWNhbnQgcGFydC4KKyAgICAgcGFja2VkIG9iamVjdCBkYXRhOgorICAgICAgICBJZiBpdCBpcyBub3QgREVMVEEsIHRoZW4gZGVmbGF0ZWQgYnl0ZXMgKHRoZSBzaXplIGFib3ZlCisJCWlzIHRoZSBzaXplIGJlZm9yZSBjb21wcmVzc2lvbikuCisJSWYgaXQgaXMgUkVGX0RFTFRBLCB0aGVuCisJICAyMC1ieXRlIGJhc2Ugb2JqZWN0IG5hbWUgU0hBMSAodGhlIHNpemUgYWJvdmUgaXMgdGhlCisJCXNpemUgb2YgdGhlIGRlbHRhIGRhdGEgdGhhdCBmb2xsb3dzKS4KKyAgICAgICAgICBkZWx0YSBkYXRhLCBkZWZsYXRlZC4KKwlJZiBpdCBpcyBPRlNfREVMVEEsIHRoZW4KKwkgIG4tYnl0ZSBvZmZzZXQgKHNlZSBiZWxvdykgaW50ZXJwcmV0ZWQgYXMgYSBuZWdhdGl2ZQorCQlvZmZzZXQgZnJvbSB0aGUgdHlwZS1ieXRlIG9mIHRoZSBoZWFkZXIgb2YgdGhlCisJCW9mcy1kZWx0YSBlbnRyeSAodGhlIHNpemUgYWJvdmUgaXMgdGhlIHNpemUgb2YKKwkJdGhlIGRlbHRhIGRhdGEgdGhhdCBmb2xsb3dzKS4KKwkgIGRlbHRhIGRhdGEsIGRlZmxhdGVkLgorCisgICAgIG9mZnNldCBlbmNvZGluZzoKKwkgIG4gYnl0ZXMgd2l0aCBNU0Igc2V0IGluIGFsbCBidXQgdGhlIGxhc3Qgb25lLgorCSAgVGhlIG9mZnNldCBpcyB0aGVuIHRoZSBudW1iZXIgY29uc3RydWN0ZWQgYnkKKwkgIGNvbmNhdGVuYXRpbmcgdGhlIGxvd2VyIDcgYml0IG9mIGVhY2ggYnl0ZSwgYW5kCisJICBmb3IgbiA+PSAyIGFkZGluZyAyXjcgKyAyXjE0ICsgLi4uICsgMl4oNyoobi0xKSkKKwkgIHRvIHRoZSByZXN1bHQuCisKKworCis9IFZlcnNpb24gMiBwYWNrLSouaWR4IGZpbGVzIHN1cHBvcnQgcGFja3MgbGFyZ2VyIHRoYW4gNCBHaUIsIGFuZAorICBoYXZlIHNvbWUgb3RoZXIgcmVvcmdhbml6YXRpb25zLiAgVGhleSBoYXZlIHRoZSBmb3JtYXQ6CisKKyAgLSBBIDQtYnl0ZSBtYWdpYyBudW1iZXIgJ1wzNzd0T2MnIHdoaWNoIGlzIGFuIHVucmVhc29uYWJsZQorICAgIGZhbm91dFswXSB2YWx1ZS4KKworICAtIEEgNC1ieXRlIHZlcnNpb24gbnVtYmVyICg9IDIpCisKKyAgLSBBIDI1Ni1lbnRyeSBmYW4tb3V0IHRhYmxlIGp1c3QgbGlrZSB2MS4KKworICAtIEEgdGFibGUgb2Ygc29ydGVkIDIwLWJ5dGUgU0hBMSBvYmplY3QgbmFtZXMuICBUaGVzZSBhcmUKKyAgICBwYWNrZWQgdG9nZXRoZXIgd2l0aG91dCBvZmZzZXQgdmFsdWVzIHRvIHJlZHVjZSB0aGUgY2FjaGUKKyAgICBmb290cHJpbnQgb2YgdGhlIGJpbmFyeSBzZWFyY2ggZm9yIGEgc3BlY2lmaWMgb2JqZWN0IG5hbWUuCisKKyAgLSBBIHRhYmxlIG9mIDQtYnl0ZSBDUkMzMiB2YWx1ZXMgb2YgdGhlIHBhY2tlZCBvYmplY3QgZGF0YS4KKyAgICBUaGlzIGlzIG5ldyBpbiB2MiBzbyBjb21wcmVzc2VkIGRhdGEgY2FuIGJlIGNvcGllZCBkaXJlY3RseQorICAgIGZyb20gcGFjayB0byBwYWNrIGR1cmluZyByZXBhY2tpbmcgd2l0aG91dCB1bmRldGVjdGVkCisgICAgZGF0YSBjb3JydXB0aW9uLgorCisgIC0gQSB0YWJsZSBvZiA0LWJ5dGUgb2Zmc2V0IHZhbHVlcyAoaW4gbmV0d29yayBieXRlIG9yZGVyKS4KKyAgICBUaGVzZSBhcmUgdXN1YWxseSAzMS1iaXQgcGFjayBmaWxlIG9mZnNldHMsIGJ1dCBsYXJnZQorICAgIG9mZnNldHMgYXJlIGVuY29kZWQgYXMgYW4gaW5kZXggaW50byB0aGUgbmV4dCB0YWJsZSB3aXRoCisgICAgdGhlIG1zYml0IHNldC4KKworICAtIEEgdGFibGUgb2YgOC1ieXRlIG9mZnNldCBlbnRyaWVzIChlbXB0eSBmb3IgcGFjayBmaWxlcyBsZXNzCisgICAgdGhhbiAyIEdpQikuICBQYWNrIGZpbGVzIGFyZSBvcmdhbml6ZWQgd2l0aCBoZWF2aWx5IHVzZWQKKyAgICBvYmplY3RzIHRvd2FyZCB0aGUgZnJvbnQsIHNvIG1vc3Qgb2JqZWN0IHJlZmVyZW5jZXMgc2hvdWxkCisgICAgbm90IG5lZWQgdG8gcmVmZXIgdG8gdGhpcyB0YWJsZS4KKworICAtIFRoZSBzYW1lIHRyYWlsZXIgYXMgYSB2MSBwYWNrIGZpbGU6CisKKyAgICBBIGNvcHkgb2YgdGhlIDIwLWJ5dGUgU0hBMSBjaGVja3N1bSBhdCB0aGUgZW5kIG9mCisgICAgY29ycmVzcG9uZGluZyBwYWNrZmlsZS4KKworICAgIDIwLWJ5dGUgU0hBMS1jaGVja3N1bSBvZiBhbGwgb2YgdGhlIGFib3ZlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvcGFjay1oZXVyaXN0aWNzLnR4dCBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3BhY2staGV1cmlzdGljcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAzZWI1ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3BhY2staGV1cmlzdGljcy50eHQKQEAgLTAsMCArMSw0NjYgQEAKKyAgICAgICAgQ29uY2VybmluZyBHaXQncyBQYWNraW5nIEhldXJpc3RpY3MKKyAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICBPaCwgaGVyZSdzIGEgcmVhbGx5IHN0dXBpZCBxdWVzdGlvbjoKKworICAgICAgICAgICAgICAgICAgV2hlcmUgZG8gSSBnbworICAgICAgICAgICAgICAgdG8gbGVhcm4gdGhlIGRldGFpbHMKKwkgICAgb2YgZ2l0J3MgcGFja2luZyBoZXVyaXN0aWNzPworCitCZSBjYXJlZnVsIHdoYXQgeW91IGFzayEKKworRm9sbG93ZXJzIG9mIHRoZSBnaXQsIHBsZWFzZSBvcGVuIHRoZSBnaXQgSVJDIExvZyBhbmQgdHVybiB0bworRmVicnVhcnkgMTAsIDIwMDYuCisKK0l0J3MgYSByYXJlIG9jY2FzaW9uLCBhbmQgd2UgYXJlIGpvaW5lZCBieSB0aGUgS2luZyBHaXQgSGltc2VsZiwKK0xpbnVzIFRvcnZhbGRzIChsaW51cykuICBOYXRoYW5pZWwgU21pdGgsIChuanNgKSwgaGFzIHRoZSBmbG9vcgorYW5kIHNlZWtzIGVubGlnaHRlbm1lbnQuICBPdGhlcnMgYXJlIHByZXNlbnQsIGJ1dCBzaWxlbnQuCisKK0xldCdzIGxpc3RlbiBpbiEKKworICAgIDxuanNgPiBPaCwgaGVyZSdzIGEgcmVhbGx5IHN0dXBpZCBxdWVzdGlvbiAtLSB3aGVyZSBkbyBJIGdvIHRvCisgICAgICAgIGxlYXJuIHRoZSBkZXRhaWxzIG9mIGdpdCdzIHBhY2tpbmcgaGV1cmlzdGljcz8gIGdvb2dsZSBhdmFpbHMKKyAgICAgICAgbWUgbm90LCByZWFkaW5nIHRoZSBzb3VyY2UgZGlkbid0IGhlbHAgYSBsb3QsIGFuZCB3YWRpbmcKKyAgICAgICAgdGhyb3VnaCB0aGUgd2hvbGUgbWFpbGluZyBsaXN0IHNlZW1zIGxlc3MgZWZmaWNpZW50IHRoYW4gYW55CisgICAgICAgIG9mIHRoYXQuCisKK0l0IGlzIGEgYm9sZCBzdGFydCEgIEEgcGxlYSBmb3IgaGVscCBjb21iaW5lZCB3aXRoIGEgc2ltdWx0YW5lb3VzCit0cmktcGFydCBhdHRhY2sgb24gc29tZSBvZiB0aGUgdHJpZWQgYW5kIHRydWUgbWFpbnN0YXlzIGluIHRoZSBxdWVzdAorZm9yIGVubGlnaHRlbm1lbnQuICBCcmFzaCBhY2N1c2F0aW9ucyBvZiBnb29nbGUgYmVpbmcgdXNlbGVzcy4gSHVicmlzIQorTWFsaWduaW5nIHRoZSBzb3VyY2UuICBIZXJlc3khICBEaXNkYWluIGZvciB0aGUgbWFpbGluZyBsaXN0IGFyY2hpdmVzLgorV29lLgorCisgICAgPHBhc2t5PiB5ZXMsIHRoZSBwYWNraW5nLXJlbGF0ZWQgZGVsdGEgc3R1ZmYgaXMgc29tZXdoYXQKKyAgICAgICAgbXlzdGVyaW91cyBldmVuIGZvciBtZSA7KQorCitBaCEgIE1vZGVzdHkgYWZ0ZXIgYWxsLgorCisgICAgPGxpbnVzPiBuanMsIEkgZG9uJ3QgdGhpbmsgdGhlIGRvY3MgZXhpc3QuIFRoYXQncyBzb21ldGhpbmcgd2hlcmUKKwkgSSBkb24ndCB0aGluayBhbnlib2R5IGVsc2UgdGhhbiBtZSBldmVuIHJlYWxseSBnb3QgaW52b2x2ZWQuCisJIE1vc3Qgb2YgdGhlIHJlc3Qgb2YgZ2l0IG90aGVycyBoYXZlIGJlZW4gYnVzeSB3aXRoIChlc3BlY2lhbGx5CisJIEp1bmlvKSwgYnV0IHBhY2tpbmcgbm9ib2R5IHRvdWNoZWQgYWZ0ZXIgSSBkaWQgaXQuCisKK0l0J3MgY3J5cHRpYywgeWV0IHZhZ3VlLiAgTGludXMgaW4gc3R5bGUgZm9yIHN1cmUuICBXaXNlIG1lbgoraW50ZXJwcmV0IHRoaXMgYXMgYW4gYXBvbG9neS4gIEEgZmV3IGFyZ3VlIGl0IGlzIG1lcmVseSBhCitzdGF0ZW1lbnQgb2YgZmFjdC4KKworICAgIDxuanNgPiBJIGd1ZXNzIHRoZSBuZXh0IHN0ZXAgaXMgInJlYWQgdGhlIHNvdXJjZSBhZ2FpbiIsIGJ1dCBJCisgICAgICAgIGhhdmUgdG8gYnVpbGQgdXAgYSBjZXJ0YWluIGxldmVsIG9mIGd1bXB0aW9uIGZpcnN0IDotKQorCitJbmRlZWQhICBPbiBib3RoIHBvaW50cy4KKworICAgIDxsaW51cz4gVGhlIHBhY2tpbmcgaGV1cmlzdGljIGlzIGFjdHVhbGx5IHJlYWxseSByZWFsbHkgc2ltcGxlLgorCitCYWl0Li4uCisKKyAgICA8bGludXM+IEJ1dCBzdHJhbmdlLgorCitBbmQgc3dpdGNoLiAgVGhhdCBvdWdodCB0byBkbyBpdCEKKworICAgIDxsaW51cz4gUmVtZW1iZXI6IGdpdCByZWFsbHkgZG9lc24ndCBmb2xsb3cgZmlsZXMuIFNvIHdoYXQgaXQgZG9lcyBpcworICAgICAgICAtIGdlbmVyYXRlIGEgbGlzdCBvZiBhbGwgb2JqZWN0cworICAgICAgICAtIHNvcnQgdGhlIGxpc3QgYWNjb3JkaW5nIHRvIG1hZ2ljIGhldXJpc3RpY3MKKyAgICAgICAgLSB3YWxrIHRoZSBsaXN0LCB1c2luZyBhIHNsaWRpbmcgd2luZG93LCBzZWVpbmcgaWYgYW4gb2JqZWN0CisgICAgICAgICAgY2FuIGJlIGRpZmZlZCBhZ2FpbnN0IGFub3RoZXIgb2JqZWN0IGluIHRoZSB3aW5kb3cKKyAgICAgICAgLSB3cml0ZSBvdXQgdGhlIGxpc3QgaW4gcmVjZW5jeSBvcmRlcgorCitUaGUgdHJhZGl0aW9uYWwgdW5kZXJzdGF0ZW1lbnQ6CisKKyAgICA8bmpzYD4gSSBzdXNwZWN0IHRoYXQgd2hhdCBJJ20gbWlzc2luZyBpcyB0aGUgcHJlY2lzZSBkZWZpbml0aW9uIG9mCisgICAgICAgIHRoZSB3b3JkICJtYWdpYyIKKworVGhlIHRyYWRpdGlvbmFsIGluc2lnaHQ6CisKKyAgICA8cGFza3k+IHllcworCitBbmQgQmFiZWwtbGlrZSBjb25mdXNpb24gZmxvd2VkLgorCisgICAgPG5qc2A+IG9oLCBobW0sIGFuZCBJJ20gbm90IHN1cmUgd2hhdCB0aGlzIHNsaWRpbmcgd2luZG93IG1lYW5zIGVpdGhlcgorCisgICAgPHBhc2t5PiBpaXJjLCBpdCBhcHBlYXJlZCB0byBtZSB0byBiZSBqdXN0IHRoZSBzaGExIG9mIHRoZSBvYmplY3QKKyAgICAgICAgd2hlbiByZWFkaW5nIHRoZSBjb2RlIGNhc3VhbGx5IC4uLgorCisgICAgICAgIC4uLiB3aGljaCBzaW1wbHkgZG9lc24ndCBzb3VuZCBhcyBhIHZlcnkgZ29vZCBoZXVyaXN0aWNzLCB0aG91Z2ggOykKKworICAgIDxuanNgPiAuLi4uLmFuZCByZWNlbmN5IG9yZGVyLiAgb2theSwgSSB0aGluayBpdCdzIGNsZWFyIEkgZGlkbid0CisgICAgICAgZXZlbiByZWFsaXplIGhvdyBtdWNoIEkgd2Fzbid0IHJlYWxpemluZyA6LSkKKworQWgsIGdyYXNzaG9wcGVyISAgQW5kIHRodXMgdGhlIGVubGlnaHRlbm1lbnQgYmVnaW5zIGFuZXcuCisKKyAgICA8bGludXM+IFRoZSAibWFnaWMiIGlzIGFjdHVhbGx5IGluIHRoZW9yeSB0b3RhbGx5IGFyYml0cmFyeS4KKyAgICAgICAgQU5ZIG9yZGVyIHdpbGwgZ2l2ZSB5b3UgYSB3b3JraW5nIHBhY2ssIGJ1dCBubywgaXQncyBub3QKKyAgICAgICAgb3JkZXJlZCBieSBTSEExLgorCisgICAgICAgIEJlZm9yZSB0YWxraW5nIGFib3V0IHRoZSBvcmRlcmluZyBmb3IgdGhlIHNsaWRpbmcgZGVsdGEKKyAgICAgICAgd2luZG93LCBsZXQncyB0YWxrIGFib3V0IHRoZSByZWNlbmN5IG9yZGVyLiBUaGF0J3MgbW9yZQorICAgICAgICBpbXBvcnRhbnQgaW4gb25lIHdheS4KKworICAgIDxuanNgPiBSaWdodCwgYnV0IGlmIGFsbCB5b3Ugd2FudCBpcyBhIHdvcmtpbmcgd2F5IHRvIHBhY2sgdGhpbmdzCisgICAgICAgIHRvZ2V0aGVyLCB5b3UgY291bGQganVzdCB1c2UgY2F0IGFuZCBzYXZlIHlvdXJzZWxmIHNvbWUKKyAgICAgICAgdHJvdWJsZS4uLgorCitXYWFhaXQgZm9yIGl0Li4uLgorCisgICAgPGxpbnVzPiBUaGUgcmVjZW5jeSBvcmRlcmluZyAod2hpY2ggaXMgYmFzaWNhbGx5OiBwdXQgb2JqZWN0cworICAgICAgICBfcGh5c2ljYWxseV8gaW50byB0aGUgcGFjayBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFyZQorICAgICAgICAicmVhY2hhYmxlIiBmcm9tIHRoZSBoZWFkKSBpcyBpbXBvcnRhbnQuCisKKyAgICA8bmpzYD4gb2theQorCisgICAgPGxpbnVzPiBJdCdzIGltcG9ydGFudCBiZWNhdXNlIHRoYXQncyB0aGUgdGhpbmcgdGhhdCBnaXZlcyBwYWNrcworICAgICAgICBnb29kIGxvY2FsaXR5LiBJdCBrZWVwcyB0aGUgb2JqZWN0cyBjbG9zZSB0byB0aGUgaGVhZCAod2hldGhlcgorICAgICAgICB0aGV5IGFyZSBvbGQgb3IgbmV3LCBidXQgdGhleSBhcmUgX3JlYWNoYWJsZV8gZnJvbSB0aGUgaGVhZCkKKyAgICAgICAgYXQgdGhlIGhlYWQgb2YgdGhlIHBhY2suIFNvIHBhY2tzIGFjdHVhbGx5IGhhdmUgYWJzb2x1dGVseQorICAgICAgICBfd29uZGVyZnVsXyBJTyBwYXR0ZXJucy4KKworUmVhZCB0aGF0IGFnYWluLCBiZWNhdXNlIGl0IGlzIGltcG9ydGFudC4KKworICAgIDxsaW51cz4gQnV0IHJlY2VuY3kgb3JkZXJpbmcgaXMgdG90YWxseSB1c2VsZXNzIGZvciBkZWNpZGluZyBob3cKKyAgICAgICAgdG8gYWN0dWFsbHkgZ2VuZXJhdGUgdGhlIGRlbHRhcywgc28gdGhlIGRlbHRhIG9yZGVyaW5nIGlzCisgICAgICAgIHNvbWV0aGluZyBlbHNlLgorCisgICAgICAgIFRoZSBkZWx0YSBvcmRlcmluZyBpcyAod2FpdCBmb3IgaXQpOgorICAgICAgICAtIGZpcnN0IHNvcnQgYnkgdGhlICJiYXNlbmFtZSIgb2YgdGhlIG9iamVjdCwgYXMgZGVmaW5lZCBieQorICAgICAgICAgIHRoZSBuYW1lIHRoZSBvYmplY3Qgd2FzIF9maXJzdF8gcmVhY2hlZCB0aHJvdWdoIHdoZW4KKyAgICAgICAgICBnZW5lcmF0aW5nIHRoZSBvYmplY3QgbGlzdAorICAgICAgICAtIHdpdGhpbiB0aGUgc2FtZSBiYXNlbmFtZSwgc29ydCBieSBzaXplIG9mIHRoZSBvYmplY3QKKyAgICAgICAgLSBidXQgYWx3YXlzIHNvcnQgZGlmZmVyZW50IHR5cGVzIHNlcGFyYXRlbHkgKGNvbW1pdHMgZmlyc3QpLgorCisgICAgICAgIFRoYXQncyBub3QgZXhhY3RseSBpdCwgYnV0IGl0J3MgdmVyeSBjbG9zZS4KKworICAgIDxuanNgPiBUaGUgIl9maXJzdF8gcmVhY2hlZCIgdGhpbmcgaXMgbm90IHRvbyBpbXBvcnRhbnQsIGp1c3QgeW91CisgICAgICAgIG5lZWQgc29tZSB3YXkgdG8gYnJlYWsgdGllcyBzaW5jZSB0aGUgc2FtZSBvYmplY3RzIG1heSBiZQorICAgICAgICByZWFjaGFibGUgbWFueSB3YXlzLCB5ZXM/CisKK0FuZCBhcyBpZiB0byBjbGFyaWZ5OgorCisgICAgPGxpbnVzPiBUaGUgcG9pbnQgaXMgdGhhdCBpdCdzIGFsbCByZWFsbHkganVzdCBhbnkgcmFuZG9tCisgICAgICAgIGhldXJpc3RpYywgYW5kIHRoZSBvcmRlcmluZyBpcyB0b3RhbGx5IHVuaW1wb3J0YW50IGZvcgorICAgICAgICBjb3JyZWN0bmVzcywgYnV0IGl0IGhlbHBzIGEgbG90IGlmIHRoZSBoZXVyaXN0aWMgZ2l2ZXMKKyAgICAgICAgImNsdW1waW5nIiBmb3IgdGhpbmdzIHRoYXQgYXJlIGxpa2VseSB0byBkZWx0YSB3ZWxsIGFnYWluc3QKKyAgICAgICAgZWFjaCBvdGhlci4KKworSXQgaXMgYW4gaW1wb3J0YW50IHBvaW50LCBzbyBzZWNyZXRseSwgSSBkaWQgbXkgb3duIHJlc2VhcmNoIGFuZCBoYXZlCitpbmNsdWRlZCBteSByZXN1bHRzIGJlbG93LiAgVG8gYmUgZmFpciwgaXQgaGFzIGNoYW5nZWQgc29tZSBvdmVyIHRpbWUuCitBbmQgdGhyb3VnaCB0aGUgbWFnaWMgb2YgUmV2aXNpb25pc3RpYyBIaXN0b3J5LCBJIGRyYXcgdXBvbiB0aGlzIGVudHJ5Citmcm9tIFRoZSBHaXQgSVJDIExvZ3Mgb24gbXkgZmF0aGVyJ3MgYmlydGhkYXksIE1hcmNoIDE6CisKKyAgICA8Z2l0c3Rlcj4gVGhlIHF1b3RlIGZyb20gdGhlIGFib3ZlIGxpbnVzIHNob3VsZCBiZSByZXdyaXR0ZW4gYQorICAgICAgICBiaXQgKHdhaXQgZm9yIGl0KToKKyAgICAgICAgLSBmaXJzdCBzb3J0IGJ5IHR5cGUuICBEaWZmZXJlbnQgb2JqZWN0cyBuZXZlciBkZWx0YSB3aXRoCisJICBlYWNoIG90aGVyLgorICAgICAgICAtIHRoZW4gc29ydCBieSBmaWxlbmFtZS9kaXJuYW1lLiAgaGFzaCBvZiB0aGUgYmFzZW5hbWUKKyAgICAgICAgICBvY2N1cGllcyB0aGUgdG9wIEJJVFNfUEVSX0lOVC1ESVJfQklUUyBiaXRzLCBhbmQgYm90dG9tCisgICAgICAgICAgRElSX0JJVFMgYXJlIGZvciB0aGUgaGFzaCBvZiBsZWFkaW5nIHBhdGggZWxlbWVudHMuCisgICAgICAgIC0gdGhlbiBpZiB3ZSBhcmUgZG9pbmcgInRoaW4iIHBhY2ssIHRoZSBvYmplY3RzIHdlIGFyZSBfbm90XworICAgICAgICAgIGdvaW5nIHRvIHBhY2sgYnV0IHdlIGtub3cgYWJvdXQgYXJlIHNvcnRlZCBlYXJsaWVyIHRoYW4KKyAgICAgICAgICBvdGhlciBvYmplY3RzLgorICAgICAgICAtIGFuZCBmaW5hbGx5IHNvcnQgYnkgc2l6ZSwgbGFyZ2VyIHRvIHNtYWxsZXIuCisKK0luIG9uZSBzd2VsbC1mb29wLCBjbGFyaWZpY2F0aW9uIGFuZCBvYnNjdXJpZmljYXRpb24hICBOb25ldGhlbGVzcywKK2F1dGhvcml0YXRpdmUuICBDcnlwdGljLCB5ZXQgY29uY2lzZS4gIEl0IGV2ZW4gc29saWNpdHMgbm90aW9ucyBvZgorcXVvdGVzIGZyb20gVGhlIFNvdXJjZSBDb2RlLiAgQ2xlYXJseSwgbW9yZSBzdHVkeSBpcyBuZWVkZWQuCisKKyAgICA8Z2l0c3Rlcj4gVGhhdCdzIHRoZSBzb3J0IG9yZGVyLiAgV2hhdCB0aGlzIG1lYW5zIGlzOgorICAgICAgICAtIHdlIGRvIG5vdCBkZWx0YSBkaWZmZXJlbnQgb2JqZWN0IHR5cGVzLgorCS0gd2UgcHJlZmVyIHRvIGRlbHRhIHRoZSBvYmplY3RzIHdpdGggdGhlIHNhbWUgZnVsbCBwYXRoLCBidXQKKyAgICAgICAgICBhbGxvdyBmaWxlcyB3aXRoIHRoZSBzYW1lIG5hbWUgZnJvbSBkaWZmZXJlbnQgZGlyZWN0b3JpZXMuCisJLSB3ZSBhbHdheXMgcHJlZmVyIHRvIGRlbHRhIGFnYWluc3Qgb2JqZWN0cyB3ZSBhcmUgbm90IGdvaW5nCisgICAgICAgICAgdG8gc2VuZCwgaWYgdGhlcmUgYXJlIHNvbWUuCisJLSB3ZSBwcmVmZXIgdG8gZGVsdGEgYWdhaW5zdCBsYXJnZXIgb2JqZWN0cywgc28gdGhhdCB3ZSBoYXZlCisgICAgICAgICAgbG90cyBvZiByZW1vdmFscy4KKworICAgICAgICBUaGUgcGVudWx0aW1hdGUgcnVsZSBpcyBmb3IgInRoaW4iIHBhY2tzLiAgSXQgaXMgdXNlZCB3aGVuCisgICAgICAgIHRoZSBvdGhlciBzaWRlIGlzIGtub3duIHRvIGhhdmUgc3VjaCBvYmplY3RzLgorCitUaGVyZSBpdCBpcyBhZ2Fpbi4gIlRoaW4iIHBhY2tzLiAgSSdtIHRoaW5raW5nIHRvIG15c2VsZiwgIldoYXQKK2lzIGEgJ3RoaW4nIHBhY2s/IiAgU28gSSBhc2s6CisKKyAgICA8amRsPiBXaGF0IGlzIGEgInRoaW4iIHBhY2s/CisKKyAgICA8Z2l0c3Rlcj4gVXNlIG9mIC0tb2JqZWN0cy1lZGdlIHRvIHJldi1saXN0IGFzIHRoZSB1cHN0cmVhbSBvZgorICAgICAgICBwYWNrLW9iamVjdHMuICBUaGUgcGFjayB0cmFuc2ZlciBwcm90b2NvbCBuZWdvdGlhdGVzIHRoYXQuCisKK1dvbyBob28hICBDbGVhcmVkIHRoYXQgX3JpZ2h0XyB1cCEKKworICAgIDxnaXRzdGVyPiBUaGVyZSBhcmUgdHdvIGRpcmVjdGlvbnMgLSBwdXNoIGFuZCBmZXRjaC4KKworVGhlcmUhICBEaWQgeW91IHNlZSBpdD8gIEl0IGlzIG5vdCAnInB1c2giIGFuZCAicHVsbCInISAgSG93IG9mdGVuIHRoZQorY29uZnVzaW9uIGhhcyBzdGFydGVkIGhlcmUuICBTbyBjYXN1YWxseSBtZW50aW9uZWQsIHRvbyEKKworICAgIDxnaXRzdGVyPiBGb3IgcHVzaCwgZ2l0LXNlbmQtcGFjayBpbnZva2VzIGdpdC1yZWNlaXZlLXBhY2sgb24gdGhlCisgICAgICAgIG90aGVyIGVuZC4gIFRoZSByZWNlaXZlLXBhY2sgc2F5cyAiSSBoYXZlIHVwIHRvIHRoZXNlIGNvbW1pdHMiLgorICAgICAgICBzZW5kLXBhY2sgbG9va3MgYXQgdGhlbSwgYW5kIGNvbXB1dGVzIHdoYXQgYXJlIG1pc3NpbmcgZnJvbQorICAgICAgICB0aGUgb3RoZXIgZW5kLiAgU28gInRoaW4iIGNvdWxkIGJlIHRoZSBkZWZhdWx0IHRoZXJlLgorCisgICAgICAgIEluIHRoZSBvdGhlciBkaXJlY3Rpb24sIGZldGNoLCBnaXQtZmV0Y2gtcGFjayBhbmQKKyAgICAgICAgZ2l0LWNsb25lLXBhY2sgaW52b2tlcyBnaXQtdXBsb2FkLXBhY2sgb24gdGhlIG90aGVyIGVuZAorCSh2aWEgc3NoIG9yIGJ5IHRhbGtpbmcgdG8gdGhlIGRhZW1vbikuCisKKwlUaGVyZSBhcmUgdHdvIGNhc2VzOiBmZXRjaC1wYWNrIHdpdGggLWsgYW5kIGNsb25lLXBhY2sgaXMgb25lLAorICAgICAgICBmZXRjaC1wYWNrIHdpdGhvdXQgLWsgaXMgdGhlIG90aGVyLiAgY2xvbmUtcGFjayBhbmQgZmV0Y2gtcGFjaworICAgICAgICB3aXRoIC1rIHdpbGwga2VlcCB0aGUgZG93bmxvYWRlZCBwYWNrZmlsZSB3aXRob3V0IGV4cGFuZGVkLCBzbworICAgICAgICB3ZSBkbyBub3QgdXNlIHRoaW4gcGFjayB0cmFuc2Zlci4gIE90aGVyd2lzZSwgdGhlIGdlbmVyYXRlZAorICAgICAgICBwYWNrIHdpbGwgaGF2ZSBkZWx0YSB3aXRob3V0IGJhc2Ugb2JqZWN0IGluIHRoZSBzYW1lIHBhY2suCisKKyAgICAgICAgQnV0IGZldGNoLXBhY2sgd2l0aG91dCAtayB3aWxsIGV4cGxvZGUgdGhlIHJlY2VpdmVkIHBhY2sgaW50bworICAgICAgICBpbmRpdmlkdWFsIG9iamVjdHMsIHNvIHdlIGF1dG9tYXRpY2FsbHkgYXNrIHVwbG9hZC1wYWNrIHRvCisgICAgICAgIGdpdmUgdXMgYSB0aGluIHBhY2sgaWYgdXBsb2FkLXBhY2sgc3VwcG9ydHMgaXQuCisKK09LIHRoZW4uCisKK1VoLgorCitMZXQncyByZXR1cm4gdG8gdGhlIHByZXZpb3VzIGNvbnZlcnNhdGlvbiBzdGlsbCBpbiBwcm9ncmVzcy4KKworICAgIDxuanNgPiBhbmQgImJhc2VuYW1lIiBtZWFucyBzb21ldGhpbmcgbGlrZSAidGhlIHRhaWwgb2YgZW5kIG9mCisgICAgICAgIHBhdGggb2YgZmlsZSBvYmplY3RzIGFuZCBkaXIgb2JqZWN0cywgYXMgcGVyIGJhc2VuYW1lKDMpLCBhbmQKKyAgICAgICAgd2UganVzdCBkZWNsYXJlIGFsbCBjb21taXQgYW5kIHRhZyBvYmplY3RzIHRvIGhhdmUgdGhlIHNhbWUKKyAgICAgICAgYmFzZW5hbWUiIG9yIHNvbWV0aGluZz8KKworTHVja2lseSwgdGhhdCB0b28gaXMgYSBwb2ludCB0aGF0IGdpdHN0ZXIgY2xhcmlmaWVkIGZvciB1cyEKKworSWYgSSBtaWdodCBhZGQsIHRoZSB0cmljayBpcyB0byBtYWtlIGZpbGVzIHRoYXQgX21pZ2h0XyBiZSBzaW1pbGFyIGJlCitsb2NhdGVkIGNsb3NlIHRvIGVhY2ggb3RoZXIgaW4gdGhlIGhhc2ggYnVja2V0cyBiYXNlZCBvbiB0aGVpciBmaWxlCituYW1lcy4gIEl0IHVzZWQgdG8gYmUgdGhhdCAiZm9vL01ha2VmaWxlIiwgImJhci9iYXovcXV1eC9NYWtlZmlsZSIgYW5kCisiTWFrZWZpbGUiIGFsbCBsYW5kZWQgaW4gdGhlIHNhbWUgYnVja2V0IGR1ZSB0byB0aGVpciBjb21tb24gYmFzZW5hbWUsCisiTWFrZWZpbGUiLiBIb3dldmVyLCBub3cgdGhleSBsYW5kIGluICJjbG9zZSIgYnVja2V0cy4KKworVGhlIGFsZ29yaXRobSBhbGxvd3Mgbm90IGp1c3QgZm9yIHRoZSBfc2FtZV8gYnVja2V0LCBidXQgZm9yIF9jbG9zZV8KK2J1Y2tldHMgdG8gYmUgY29uc2lkZXJlZCBkZWx0YSBjYW5kaWRhdGVzLiAgVGhlIHJhdGlvbmFsZSBpcworZXNzZW50aWFsbHkgdGhhdCBmaWxlcywgbGlrZSBNYWtlZmlsZXMsIG9mdGVuIGhhdmUgdmVyeSBzaW1pbGFyCitjb250ZW50IG5vIG1hdHRlciB3aGF0IGRpcmVjdG9yeSB0aGV5IGxpdmUgaW4uCisKKyAgICA8bGludXM+IEkgcGxheWVkIGFyb3VuZCB3aXRoIGRpZmZlcmVudCBkZWx0YSBhbGdvcml0aG1zLCBhbmQgd2l0aAorICAgICAgICBtYWtpbmcgdGhlICJkZWx0YSB3aW5kb3ciIGJpZ2dlciwgYnV0IGhhdmluZyB0b28gYmlnIG9mIGEKKyAgICAgICAgc2xpZGluZyB3aW5kb3cgbWFrZXMgaXQgdmVyeSBleHBlbnNpdmUgdG8gZ2VuZXJhdGUgdGhlIHBhY2s6CisgICAgICAgIHlvdSBuZWVkIHRvIGNvbXBhcmUgZXZlcnkgb2JqZWN0IHdpdGggYSBfdG9uXyBvZiBvdGhlciBvYmplY3RzLgorCisgICAgICAgIFRoZXJlIGFyZSBhIG51bWJlciBvZiBvdGhlciB0cml2aWFsIGhldXJpc3RpY3MgdG9vLCB3aGljaAorICAgICAgICBiYXNpY2FsbHkgYm9pbCBkb3duIHRvICJkb24ndCBib3RoZXIgZXZlbiB0cnlpbmcgdG8gZGVsdGEgdGhpcworICAgICAgICBwYWlyIiBpZiB3ZSBjYW4gdGVsbCBiZWZvcmUtaGFuZCB0aGF0IHRoZSBkZWx0YSBpc24ndCB3b3J0aCBpdAorICAgICAgICAoZHVlIHRvIHNpemUgZGlmZmVyZW5jZXMsIHdoZXJlIHdlIGNhbiB0YWtlIGEgcHJldmlvdXMgZGVsdGEKKyAgICAgICAgcmVzdWx0IGludG8gYWNjb3VudCB0byBkZWNpZGUgdGhhdCAib2ssIG5vIHBvaW50IGluIHRyeWluZworICAgICAgICB0aGF0IG9uZSwgaXQgd2lsbCBiZSB3b3JzZSIpLgorCisgICAgICAgIEVuZCByZXN1bHQ6IHBhY2tpbmcgaXMgYWN0dWFsbHkgdmVyeSBzaXplIGVmZmljaWVudC4gSXQncworICAgICAgICBzb21ld2hhdCBDUFUtd2FzdGVmdWwsIGJ1dCBvbiB0aGUgb3RoZXIgaGFuZCwgc2luY2UgeW91J3JlCisgICAgICAgIHJlYWxseSBvbmx5IHN1cHBvc2VkIHRvIGRvIGl0IG1heWJlIG9uY2UgYSBtb250aCAoYW5kIHlvdSBjYW4KKyAgICAgICAgZG8gaXQgZHVyaW5nIHRoZSBuaWdodCksIG5vYm9keSByZWFsbHkgc2VlbXMgdG8gY2FyZS4KKworTmljZSBFbmdpbmVlcmluZyBUb3VjaCwgdGhlcmUuICBGaW5kIHdoZW4gaXQgZG9lc24ndCBtYXR0ZXIsIGFuZAorcHJvY2xhaW0gaXQgYSBub24taXNzdWUuICBHb29kIHN0eWxlIHRvbyEKKworICAgIDxuanNgPiBTbywganVzdCB0byByZXBlYXQgdG8gc2VlIGlmIEknbSBmb2xsb3dpbmcsIHdlIHN0YXJ0IGJ5CisgICAgICAgIGdldHRpbmcgYSBsaXN0IG9mIHRoZSBvYmplY3RzIHdlIHdhbnQgdG8gcGFjaywgd2Ugc29ydCBpdCBieQorICAgICAgICB0aGlzIGhldXJpc3RpYyAoYmFzaWNhbGx5IGxleGljb2dyYXBoaWNhbGx5IG9uIHRoZSB0dXBsZQorICAgICAgICAodHlwZSwgYmFzZW5hbWUsIHNpemUpKS4KKworICAgICAgICBUaGVuIHdlIHdhbGsgdGhyb3VnaCB0aGlzIGxpc3QsIGFuZCBjYWxjdWxhdGUgYSBkZWx0YSBvZgorICAgICAgICBlYWNoIG9iamVjdCBhZ2FpbnN0IHRoZSBsYXN0IG4gKHR1bmFibGUgcGFyYW1ldGVyKSBvYmplY3RzLAorICAgICAgICBhbmQgcGljayB0aGUgc21hbGxlc3Qgb2YgdGhlc2UgZGVsdGFzLgorCitWYXN0bHkgc2ltcGxpZmllZCwgYnV0IHRoZSBlc3NlbmNlIGlzIHRoZXJlIQorCisgICAgPGxpbnVzPiBDb3JyZWN0LgorCisgICAgPG5qc2A+IEFuZCB0aGVuIG9uY2Ugd2UgaGF2ZSBwaWNrZWQgYSBkZWx0YSBvciBmdWxsdGV4dCB0bworICAgICAgICByZXByZXNlbnQgZWFjaCBvYmplY3QsIHdlIHJlLXNvcnQgYnkgcmVjZW5jeSwgYW5kIHdyaXRlIHRoZW0KKyAgICAgICAgb3V0IGluIHRoYXQgb3JkZXIuCisKKyAgICA8bGludXM+IFl1cC4gU29tZSBvdGhlciBzbWFsbCBkZXRhaWxzOgorCitBbmQgb2YgY291cnNlIHRoZXJlIGlzIHRoZSAiT3RoZXIgU2hvZSIgRmFjdG9yIHRvby4KKworICAgIDxsaW51cz4gLSBXZSBsaW1pdCB0aGUgZGVsdGEgZGVwdGggdG8gYW5vdGhlciBtYWdpYyB2YWx1ZSAocmlnaHQKKyAgICAgICAgbm93IGJvdGggdGhlIHdpbmRvdyBhbmQgZGVsdGEgZGVwdGggbWFnaWMgdmFsdWVzIGFyZSBqdXN0ICIxMCIpCisKKyAgICA8bmpzYD4gSHJtLCBteSBpbnR1aXRpb24gaXMgdGhhdCB5b3UnZCBlbmQgdXAgd2l0aCByZWFsbHkgX2JhZF8gSU8KKyAgICAgICAgcGF0dGVybnMsIGJlY2F1c2UgdGhlIHRoaW5ncyB5b3Ugd2FudCBhcmUgbmVhciBieSwgYnV0IHRvCisgICAgICAgIGFjdHVhbGx5IHJlY29uc3RydWN0IHRoZW0geW91IG1heSBoYXZlIHRvIGp1bXAgYWxsIG92ZXIgaW4KKyAgICAgICAgcmFuZG9tIHdheXMuCisKKyAgICA8bGludXM+IC0gV2hlbiB3ZSB3cml0ZSBvdXQgYSBkZWx0YSwgYW5kIHdlIGhhdmVuJ3QgeWV0IHdyaXR0ZW4KKyAgICAgICAgb3V0IHRoZSBvYmplY3QgaXQgaXMgYSBkZWx0YSBhZ2FpbnN0LCB3ZSB3cml0ZSBvdXQgdGhlIGJhc2UKKyAgICAgICAgb2JqZWN0IGZpcnN0LiAgQW5kIG5vLCB3aGVuIHdlIHJlY29uc3RydWN0IHRoZW0sIHdlIGFjdHVhbGx5CisgICAgICAgIGdldCBuaWNlIElPIHBhdHRlcm5zLCBiZWNhdXNlOgorICAgICAgICAtIGxhcmdlciBvYmplY3RzIHRlbmQgdG8gYmUgIm1vcmUgcmVjZW50IiAoTGludXMnIGxhdzogZmlsZXMgZ3JvdykKKyAgICAgICAgLSB3ZSBhY3RpdmVseSB0cnkgdG8gZ2VuZXJhdGUgZGVsdGFzIGZyb20gYSBsYXJnZXIgb2JqZWN0IHRvIGEKKyAgICAgICAgICBzbWFsbGVyIG9uZQorICAgICAgICAtIHRoaXMgbWVhbnMgdGhhdCB0aGUgdG9wLW9mLXRyZWUgdmVyeSBzZWxkb20gaGFzIGRlbHRhcworICAgICAgICAgIChpLmUuIGRlbHRhcyBpbiBfcHJhY3RpY2VfIGFyZSAiYmFja3dhcmRzIGRlbHRhcyIpCisKK0FnYWluLCB3ZSBzaG91bGQgcmVyZWFkIHRoYXQgd2hvbGUgcGFyYWdyYXBoLiAgTm90IGp1c3QgYmVjYXVzZQorTGludXMgaGFzIHNsaXBwZWQgTGludXMncyBMYXcgaW4gdGhlcmUgb24gdXMsIGJ1dCBiZWNhdXNlIGl0IGlzCitpbXBvcnRhbnQuICBMZXQncyBtYWtlIHN1cmUgd2UgY2xhcmlmeSBzb21lIG9mIHRoZSBwb2ludHMgaGVyZToKKworICAgIDxuanNgPiBTbyB0aGUgcG9pbnQgaXMganVzdCB0aGF0IGluIHByYWN0aWNlLCBkZWx0YSBvcmRlciBhbmQKKyAgICAgICAgcmVjZW5jeSBvcmRlciBtYXRjaCBlYWNoIG90aGVyIHF1aXRlIHdlbGwuCisKKyAgICA8bGludXM+IFllcy4gVGhlcmUncyBhbm90aGVyIG5pY2Ugc2lkZSB0byB0aGlzIChhbmQgeWVzLCBpdCB3YXMKKwlkZXNpZ25lZCB0aGF0IHdheSA7KToKKyAgICAgICAgLSB0aGUgcmVhc29uIHdlIGdlbmVyYXRlIGRlbHRhcyBhZ2FpbnN0IHRoZSBsYXJnZXIgb2JqZWN0IGlzCisJICBhY3R1YWxseSBhIGJpZyBzcGFjZSBzYXZlciB0b28hCisKKyAgICA8bmpzYD4gSG1tLCBidXQgeW91ciBsYXN0IGNvbW1lbnQgKGlmICJ3ZSBoYXZlbid0IHlldCB3cml0dGVuIG91dAorICAgICAgICB0aGUgb2JqZWN0IGl0IGlzIGEgZGVsdGEgYWdhaW5zdCwgd2Ugd3JpdGUgb3V0IHRoZSBiYXNlIG9iamVjdAorICAgICAgICBmaXJzdCIpLCBzZWVtcyBsaWtlIGl0IHdvdWxkIG1ha2UgdGhlc2UgZmFjdHMgbW9zdGx5CisgICAgICAgIGlycmVsZXZhbnQgYmVjYXVzZSBldmVuIGlmIGluIHByYWN0aWNlIHlvdSB3b3VsZCBub3QgaGF2ZSB0bworICAgICAgICB3YW5kZXIgYXJvdW5kIG11Y2gsIGluIGZhY3QgeW91IGp1c3QgYnJ1dGUtZm9yY2Ugc2F5IHRoYXQgaW4KKyAgICAgICAgdGhlIGNhc2VzIHdoZXJlIHlvdSBtaWdodCBoYXZlIHRvIHdhbmRlciwgZG9uJ3QgZG8gdGhhdCA6LSkKKworICAgIDxsaW51cz4gWWVzIGFuZCBuby4gTm90aWNlIHRoZSBydWxlOiB3ZSBvbmx5IHdyaXRlIG91dCB0aGUgYmFzZQorICAgICAgICBvYmplY3QgZmlyc3QgaWYgdGhlIGRlbHRhIGFnYWluc3QgaXQgd2FzIG1vcmUgcmVjZW50LiAgVGhhdAorICAgICAgICBtZWFucyB0aGF0IHlvdSBjYW4gYWN0dWFsbHkgaGF2ZSBkZWx0YXMgdGhhdCByZWZlciB0byBhIGJhc2UKKyAgICAgICAgb2JqZWN0IHRoYXQgaXMgX25vdF8gY2xvc2UgdG8gdGhlIGRlbHRhIG9iamVjdCwgYnV0IHRoYXQgb25seQorICAgICAgICBoYXBwZW5zIHdoZW4gdGhlIGRlbHRhIGlzIG5lZWRlZCB0byBnZW5lcmF0ZSBhbiBfb2xkXyBvYmplY3QuCisKKyAgICA8bGludXM+IFNlZT8KKworWWVhaCwgbm8uICBJIG1pc3NlZCB0aGF0IG9uIHRoZSBmaXJzdCB0d28gb3IgdGhyZWUgcmVhZGluZ3MgbXlzZWxmLgorCisgICAgPGxpbnVzPiBUaGlzIGtlZXBzIHRoZSBmcm9udCBvZiB0aGUgcGFjayBkZW5zZS4gVGhlIGZyb250IG9mIHRoZQorICAgICAgICBwYWNrIG5ldmVyIGNvbnRhaW5zIGRhdGEgdGhhdCBpc24ndCByZWxldmFudCB0byBhICJyZWNlbnQiCisgICAgICAgIG9iamVjdC4gIFRoZSBzaXplIG9wdGltaXphdGlvbiBjb21lcyBmcm9tIG91ciB1c2Ugb2YgeGRlbHRhCisgICAgICAgIChidXQgaXMgdHJ1ZSBmb3IgbWFueSBvdGhlciBkZWx0YSBhbGdvcml0aG1zKTogcmVtb3ZpbmcgZGF0YQorICAgICAgICBpcyBjaGVhcGVyIChpbiBzaXplKSB0aGFuIGFkZGluZyBkYXRhLgorCisgICAgICAgIFdoZW4geW91IHJlbW92ZSBkYXRhLCB5b3Ugb25seSBuZWVkIHRvIHNheSAiY29weSBieXRlcyBuLS1tIi4KKwlJbiBjb250cmFzdCwgaW4gYSBkZWx0YSB0aGF0IF9hZGRzXyBkYXRhLCB5b3UgaGF2ZSB0byBzYXkgImFkZAorICAgICAgICB0aGVzZSBieXRlczogJ2FjdHVhbCBkYXRhIGdvZXMgaGVyZSciCisKKyAgICAqKiogbmpzYCBoYXMgcXVpdDogUmVhZCBlcnJvcjogMTA0IChDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIpCisKKyAgICA8bGludXM+IFVoaHVoLiBJIGhvcGUgSSBkaWRuJ3QgYmxvdyBuanNgIG1pbmQuCisKKyAgICAqKiogbmpzYCBoYXMgam9pbmVkIGNoYW5uZWwgI2dpdAorCisgICAgPHBhc2t5PiA6KQorCitUaGUgc2lsZW50IG9ic2VydmVycyBhcmUgYW11c2VkLiAgT2YgY291cnNlLgorCitBbmQgYXMgaWYgbmpzYCB3YXMgZXhwZWN0ZWQgdG8gYmUgb21uaXNjaWVudDoKKworICAgIDxsaW51cz4gbmpzIC0gZGlkIHlvdSBtaXNzIGFueXRoaW5nPworCitPSywgSSdsbCBzcGVsbCBpdCBvdXQuICBUaGF0J3MgR2VlayBIdW1vci4gIElmIG5qc2Agd2FzIG5vdCBhY3R1YWxseQorY29ubmVjdGVkIGZvciBhIGxpdHRsZSBiaXQgdGhlcmUsIGhvdyB3b3VsZCBoZSBrbm93IGlmIG1pc3NlZCBhbnl0aGluZword2hpbGUgaGUgd2FzIGRpc2Nvbm5lY3RlZD8gIEhlJ3MgYSBiZW5ldm9sZW50IGRpY3RhdG9yIHdpdGggYSBzZW5zZSBvZgoraHVtb3IhICBXZWxsIG5vdGVkIQorCisgICAgPG5qc2A+IFN0dXBpZCByb3V0ZXIuICBPciBncmVtbGlucywgb3Igd2hhdGV2ZXIuCisKK0l0J3MgYSBjaGVhcCBzaG90IGF0IENpc2NvLiAgVGFrZSAnZW0gd2hlbiB5b3UgY2FuLgorCisgICAgPG5qc2A+IFllcyBhbmQgbm8uIE5vdGljZSB0aGUgcnVsZTogd2Ugb25seSB3cml0ZSBvdXQgdGhlIGJhc2UKKyAgICAgICAgb2JqZWN0IGZpcnN0IGlmIHRoZSBkZWx0YSBhZ2FpbnN0IGl0IHdhcyBtb3JlIHJlY2VudC4KKworICAgICAgICBJJ20gZ2V0dGluZyBsb3N0IGluIGFsbCB0aGVzZSBvcmRlcnMsIGxldCBtZSByZS1yZWFkIDotKQorCVNvIHRoZSB3cml0ZS1vdXQgb3JkZXIgaXMgZnJvbSBtb3N0IHJlY2VudCB0byBsZWFzdCByZWNlbnQ/CisgICAgICAgIChDb25jZWl2YWJseSBpdCBjb3VsZCBiZSB0aGUgb3Bwb3NpdGUgd2F5IHRvbywgSSdtIG5vdCBzdXJlIGlmCisgICAgICAgIHdlJ3ZlIHNhaWQpIHRob3VnaCBteSBjb25uZWN0aW9uIGJhY2sgYXQgaG9tZSBpcyBsb2dnaW5nLCBzbyBJCisgICAgICAgIGNhbiBqdXN0IHJlYWQgd2hhdCB5b3Ugc2FpZCB0aGVyZSA6LSkKKworQW5kIGZvciB0aG9zZSBvZiB5b3UgcGF5aW5nIGF0dGVudGlvbiwgdGhlIE9tbmlzY2llbnQgVHJpY2sgaGFzIGp1c3QKK2JlZW4gZGV0YWlsZWQhCisKKyAgICA8bGludXM+IFllcywgd2UgYWx3YXlzIHdyaXRlIG91dCBtb3N0IHJlY2VudCBmaXJzdAorCitGb3IgdGhlIG90aGVyIHJlY29yZDoKKworICAgIDxwYXNreT4gbmpzYDogaHR0cDovL3Bhc3RlYmluLmNvbS81NDc5NjUKKworVGhlICduZXQgbmV2ZXIgZm9yZ2V0cywgc28gdGhhdCBzaG91bGQgYmUgZ29vZCB1bnRpbCB0aGUgZW5kIG9mIHRpbWUuCisKKyAgICA8bmpzYD4gQW5kLCB5ZWFoLCBJIGdvdCB0aGUgcGFydCBhYm91dCBkZWVwZXItaW4taGlzdG9yeSBzdHVmZgorICAgICAgICBoYXZpbmcgd29yc2UgSU8gY2hhcmFjdGVyaXN0aWNzLCBvbmUgc29ydCBvZiBkb2Vzbid0IGNhcmUuCisKKyAgICA8bGludXM+IFdpdGggdGhlIGNhdmVhdCB0aGF0IGlmIHRoZSAibW9zdCByZWNlbnQiIG5lZWRzIGFuIG9sZGVyCisgICAgICAgIG9iamVjdCB0byBkZWx0YSBhZ2FpbnN0IChoZXksIHNocmlua2luZyBzb21ldGltZXMgZG9lcworICAgICAgICBoYXBwZW4pLCB3ZSB3cml0ZSBvdXQgdGhlIG9sZCBvYmplY3Qgd2l0aCB0aGUgZGVsdGEuCisKKyAgICA8bmpzYD4gKGlmIG9ubHkgaXQgaGFwcGVuZWQgbW9yZS4uLikKKworICAgIDxsaW51cz4gQW55d2F5LCB0aGUgcGFjay1maWxlIGNvdWxkIGVhc2lseSBiZSBkZW5zZXIgc3RpbGwsIGJ1dAorICAgICAgICBiZWNhdXNlIGl0J3MgdXNlZCBib3RoIGZvciBzdHJlYW1pbmcgKHRoZSBnaXQgcHJvdG9jb2wpIGFuZAorICAgICAgICBmb3Igb24tZGlzaywgaXQgaGFzIGEgZmV3IHBlc3NpbWl6YXRpb25zLgorCitBY3R1YWxseSwgaXQgaXMgYSBtYWRlLXVwIHdvcmQuIEJ1dCBpdCBpcyBhIG1hZGUtdXAgd29yZCBiZWluZwordXNlZCBhcyBzZXR1cCBmb3IgYSBsYXRlciBvcHRpbWl6YXRpb24sIHdoaWNoIGlzIGEgcmVhbCB3b3JkOgorCisgICAgPGxpbnVzPiBJbiBwYXJ0aWN1bGFyLCB3aGlsZSB0aGUgcGFjay1maWxlIGlzIHRoZW4gY29tcHJlc3NlZCwKKyAgICAgICAgaXQncyBjb21wcmVzc2VkIGp1c3Qgb25lIG9iamVjdCBhdCBhIHRpbWUsIHNvIHRoZSBhY3R1YWwKKyAgICAgICAgY29tcHJlc3Npb24gZmFjdG9yIGlzIGxlc3MgdGhhbiBpdCBjb3VsZCBiZSBpbiB0aGVvcnkuIEJ1dCBpdAorICAgICAgICBtZWFucyB0aGF0IGl0J3MgYWxsIG5pY2UgcmFuZG9tLWFjY2VzcyB3aXRoIGEgc2ltcGxlIGluZGV4IHRvCisgICAgICAgIGRvICJvYmplY3QgbmFtZS0+bG9jYXRpb24gaW4gcGFja2ZpbGUiIHRyYW5zbGF0aW9uLgorCisgICAgPG5qc2A+IEknbSBhc3N1bWluZyB0aGUgcmVhbCB3aW4gZm9yIGRlbHRhLWluZyBsYXJnZS0+c21hbGwgaXMKKyAgICAgICAgbW9yZSBob21vZ2VuZW91cyBzdGF0aXN0aWNzIGZvciBnemlwIHRvIHJ1biBvdmVyPworCisgICAgICAgIChZb3UgaGF2ZSB0byBwdXQgdGhlIGJ5dGVzIGluIG9uZSBwbGFjZSBvciBhbm90aGVyLCBidXQKKyAgICAgICAgcHV0dGluZyB0aGVtIGluIGEgbGFyZ2VyIGJsb2Igd2lucyBvbiBjb21wcmVzc2lvbikKKworICAgICAgICBBY3R1YWxseSwgd2hhdCBpcyB0aGUgY29tcHJlc3Npb24gc3RyYXRlZ3kgLS0gZWFjaCBkZWx0YQorICAgICAgICBpbmRpdmlkdWFsbHkgZ3ppcHBlZCwgdGhlIHdob2xlIGZpbGUgZ3ppcHBlZCwgc29tZXdoZXJlIGluCisgICAgICAgIGJldHdlZW4sIG5vIGNvbXByZXNzaW9uIGF0IGFsbCwgLi4uLj8KKworICAgICAgICBSaWdodC4KKworUmVhbGl0eSBJUkMgc2V0cyBpbi4gIEZvciBleGFtcGxlOgorCisgICAgPHBhc2t5PiBJJ2xsIHJlYWQgdGhlIHJlc3QgaW4gdGhlIG1vcm5pbmcsIEkgcmVhbGx5IGhhdmUgdG8gZ28KKyAgICAgICAgc2xlZXAgb3IgdGhlcmUncyBubyBob3BlIHdoYXRzb2V2ZXIgZm9yIG1lIGF0IHRoZSB0b2RheSdzCisgICAgICAgIGV4YW0uLi4gZyduaXRlIGFsbC4KKworSGVoLgorCisgICAgPGxpbnVzPiBwYXNreTogZyduaXRlCisKKyAgICA8bmpzYD4gcGFza3k6ICdsdWNrCisKKyAgICA8bGludXM+IFJpZ2h0OiBsYXJnZS0+c21hbGwgbWF0dGVycyBleGFjdGx5IGJlY2F1c2Ugb2YgY29tcHJlc3Npb24KKyAgICAgICAgYmVoYXZpb3VyLiBJZiBpdCB3YXMgbm9uLWNvbXByZXNzZWQsIGl0IHByb2JhYmx5IHdvdWxkbid0IG1ha2UKKyAgICAgICAgYW55IGRpZmZlcmVuY2UuCisKKyAgICA8bmpzYD4geWVhaAorCisgICAgPGxpbnVzPiBBbnl3YXk6IEknbSBub3QgZXZlbiB0cnlpbmcgdG8gY2xhaW0gdGhhdCB0aGUgcGFjay1maWxlcworICAgICAgICBhcmUgcGVyZmVjdCwgYnV0IHRoZXkgZG8gdGVuZCB0byBoYXZlIGEgbmljZSBiYWxhbmNlIG9mCisgICAgICAgIGRlbnNpdHkgdnMgZWFzZS1vZiB1c2UuCisKK0dhc3AhICBPSywgc2F2ZWQuICBUaGF0J3MgYSBmYWlyIEVuZ2luZWVyaW5nIHRyYWRlIG9mZi4gIENsb3NlIGNhbGwhCitJbiBmYWN0LCBMaW51cyByZWZsZWN0cyBvbiBzb21lIEJhc2ljIEVuZ2luZWVyaW5nIEZ1bmRhbWVudGFscywKK2Rlc2lnbiBvcHRpb25zLCBldGMuCisKKyAgICA8bGludXM+IE1vcmUgaW1wb3J0YW50bHksIHRoZXkgYWxsb3cgZ2l0IHRvIHN0aWxsIF9jb25jZXB0dWFsbHlfCisgICAgICAgIG5ldmVyIGRlYWwgd2l0aCBkZWx0YXMgYXQgYWxsLCBhbmQgYmUgYSAid2hvbGUgb2JqZWN0IiBzdG9yZS4KKworICAgICAgICBXaGljaCBoYXMgc29tZSBwcm9ibGVtcyAod2UgZGlzY3Vzc2VkIGJhZCBodWdlLWZpbGUKKyAgICAgICAgYmVoYXZpb3VyIG9uIHRoZSBnaXQgbGlzdHMgdGhlIG90aGVyIGRheSksIGJ1dCBpdCBkb2VzIG1lYW4KKyAgICAgICAgdGhhdCB0aGUgYmFzaWMgZ2l0IGNvbmNlcHRzIGFyZSByZWFsbHkgcmVhbGx5IHNpbXBsZSBhbmQKKyAgICAgICAgc3RyYWlnaHRmb3J3YXJkLgorCisgICAgICAgIEl0J3MgYWxsIGJlZW4gcXVpdGUgc3RhYmxlLgorCisgICAgICAgIFdoaWNoIEkgdGhpbmsgaXMgdmVyeSBtdWNoIGEgcmVzdWx0IG9mIGhhdmluZyB2ZXJ5IHNpbXBsZQorICAgICAgICBiYXNpYyBpZGVhcywgc28gdGhhdCB0aGVyZSdzIG5ldmVyIGFueSBjb25mdXNpb24gYWJvdXQgd2hhdCdzCisgICAgICAgIGdvaW5nIG9uLgorCisgICAgICAgIEJ1Z3MgaGFwcGVuLCBidXQgdGhleSBhcmUgInNpbXBsZSIgYnVncy4gQW5kIGJ1Z3MgdGhhdAorICAgICAgICBhY3R1YWxseSBnZXQgc29tZSBvYmplY3Qgc3RvcmUgZGV0YWlsIHdyb25nIGFyZSBhbG1vc3QgYWx3YXlzCisgICAgICAgIHNvIG9idmlvdXMgdGhhdCB0aGV5IG5ldmVyIGdvIGFueXdoZXJlLgorCisgICAgPG5qc2A+IFllYWguCisKK051ZmYgc2FpZC4KKworICAgIDxsaW51cz4gQW55d2F5LiAgSSdtIG9mZiBmb3IgYmVkLiBJdCdzIG5vdCA2QU0gaGVyZSwgYnV0IEkndmUgZ290CisJIHRocmVlIGtpZHMsIGFuZCBoYXZlIHRvIGdldCB1cCBlYXJseSBpbiB0aGUgbW9ybmluZyB0byBzZW5kCisJIHRoZW0gb2ZmLiBJIG5lZWQgbXkgYmVhdXR5IHNsZWVwLgorCisgICAgPG5qc2A+IDotKQorCisgICAgPG5qc2A+IGFwcHJlY2lhdGUgdGhlIGluZm9kdW1wLCBJIHJlYWxseSB3YXMgZmFpbGluZyB0byBmaW5kIHRoZQorICAgICAgICBkZXRhaWxzIG9uIGdpdCBwYWNrcyA6LSkKKworQW5kIG5vdyB5b3Uga25vdyB0aGUgcmVzdCBvZiB0aGUgc3RvcnkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9wYWNrLXByb3RvY29sLnR4dCBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3BhY2stcHJvdG9jb2wudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZDQ4YjQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9wYWNrLXByb3RvY29sLnR4dApAQCAtMCwwICsxLDQxIEBACitQYWNrIHRyYW5zZmVyIHByb3RvY29scworPT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlcmUgYXJlIHR3byBQYWNrIHB1c2gtcHVsbCBwcm90b2NvbHMuCisKK3VwbG9hZC1wYWNrIChTKSB8IGZldGNoL2Nsb25lLXBhY2sgKEMpIHByb3RvY29sOgorCisJIyBUZWxsIHRoZSBwdWxsZXIgd2hhdCBjb21taXRzIHdlIGhhdmUgYW5kIHdoYXQgdGhlaXIgbmFtZXMgYXJlCisJUzogU0hBMSBuYW1lCisJUzogLi4uCisJUzogU0hBMSBuYW1lCisJUzogIyBmbHVzaCAtLSBpdCdzIHlvdXIgdHVybgorCSMgVGVsbCB0aGUgcHVzaGVyIHdoYXQgY29tbWl0cyB3ZSB3YW50LCBhbmQgd2hhdCB3ZSBoYXZlCisJQzogd2FudCBuYW1lCisJQzogLi4KKwlDOiB3YW50IG5hbWUKKwlDOiBoYXZlIFNIQTEKKwlDOiBoYXZlIFNIQTEKKwlDOiAuLi4KKwlDOiAjIGZsdXNoIC0tIG9jY2FzaW9uYWxseSBhc2sgImhhZCBlbm91Z2g/IgorCVM6IE5BSworCUM6IGhhdmUgU0hBMQorCUM6IC4uLgorCUM6IGhhdmUgU0hBMQorCVM6IEFDSworCUM6IGRvbmUKKwlTOiBYWFhYWFhYIC0tIHBhY2tmaWxlIGNvbnRlbnRzLgorCitzZW5kLXBhY2sgfCByZWNlaXZlLXBhY2sgcHJvdG9jb2wuCisKKwkjIFRlbGwgdGhlIHB1c2hlciB3aGF0IGNvbW1pdHMgd2UgaGF2ZSBhbmQgd2hhdCB0aGVpciBuYW1lcyBhcmUKKwlDOiBTSEExIG5hbWUKKwlDOiAuLi4KKwlDOiBTSEExIG5hbWUKKwlDOiAjIGZsdXNoIC0tIGl0J3MgeW91ciB0dXJuCisJIyBUZWxsIHRoZSBwdWxsZXIgd2hhdCB0aGUgcHVzaGVyIGhhcworCVM6IG9sZC1TSEExIG5ldy1TSEExIG5hbWUKKwlTOiBvbGQtU0hBMSBuZXctU0hBMSBuYW1lCisJUzogLi4uCisJUzogIyBmbHVzaCAtLSBkb25lIHdpdGggdGhlIGxpc3QKKwlTOiBYWFhYWFhYIC0tLSBwYWNrZmlsZSBjb250ZW50cy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3JhY3ktZ2l0LnR4dCBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3JhY3ktZ2l0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmRmMDM0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvcmFjeS1naXQudHh0CkBAIC0wLDAgKzEsMTk1IEBACitVc2Ugb2YgaW5kZXggYW5kIFJhY3kgZ2l0IHByb2JsZW0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitCYWNrZ3JvdW5kCistLS0tLS0tLS0tCisKK1RoZSBpbmRleCBpcyBvbmUgb2YgdGhlIG1vc3QgaW1wb3J0YW50IGRhdGEgc3RydWN0dXJlcyBpbiBnaXQuCitJdCByZXByZXNlbnRzIGEgdmlydHVhbCB3b3JraW5nIHRyZWUgc3RhdGUgYnkgcmVjb3JkaW5nIGxpc3Qgb2YKK3BhdGhzIGFuZCB0aGVpciBvYmplY3QgbmFtZXMgYW5kIHNlcnZlcyBhcyBhIHN0YWdpbmcgYXJlYSB0bword3JpdGUgb3V0IHRoZSBuZXh0IHRyZWUgb2JqZWN0IHRvIGJlIGNvbW1pdHRlZC4gIFRoZSBzdGF0ZSBpcworInZpcnR1YWwiIGluIHRoZSBzZW5zZSB0aGF0IGl0IGRvZXMgbm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8sIGFuZAorb2Z0ZW4gZG9lcyBub3QsIG1hdGNoIHRoZSBmaWxlcyBpbiB0aGUgd29ya2luZyB0cmVlLgorCitUaGVyZSBhcmUgY2FzZXMgZ2l0IG5lZWRzIHRvIGV4YW1pbmUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlCit2aXJ0dWFsIHdvcmtpbmcgdHJlZSBzdGF0ZSBpbiB0aGUgaW5kZXggYW5kIHRoZSBmaWxlcyBpbiB0aGUKK3dvcmtpbmcgdHJlZS4gIFRoZSBtb3N0IG9idmlvdXMgY2FzZSBpcyB3aGVuIHRoZSB1c2VyIGFza3MgYGdpdAorZGlmZmAgKG9yIGl0cyBsb3cgbGV2ZWwgaW1wbGVtZW50YXRpb24sIGBnaXQgZGlmZi1maWxlc2ApIG9yCitgZ2l0LWxzLWZpbGVzIC0tbW9kaWZpZWRgLiAgSW4gYWRkaXRpb24sIGdpdCBpbnRlcm5hbGx5IGNoZWNrcworaWYgdGhlIGZpbGVzIGluIHRoZSB3b3JraW5nIHRyZWUgYXJlIGRpZmZlcmVudCBmcm9tIHdoYXQgYXJlCityZWNvcmRlZCBpbiB0aGUgaW5kZXggdG8gYXZvaWQgc3RvbXBpbmcgb24gbG9jYWwgY2hhbmdlcyBpbiB0aGVtCitkdXJpbmcgcGF0Y2ggYXBwbGljYXRpb24sIHN3aXRjaGluZyBicmFuY2hlcywgYW5kIG1lcmdpbmcuCisKK0luIG9yZGVyIHRvIHNwZWVkIHVwIHRoaXMgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBmaWxlcyBpbiB0aGUKK3dvcmtpbmcgdHJlZSBhbmQgdGhlIGluZGV4IGVudHJpZXMsIHRoZSBpbmRleCBlbnRyaWVzIHJlY29yZCB0aGUKK2luZm9ybWF0aW9uIG9idGFpbmVkIGZyb20gdGhlIGZpbGVzeXN0ZW0gdmlhIGBsc3RhdCgyKWAgc3lzdGVtCitjYWxsIHdoZW4gdGhleSB3ZXJlIGxhc3QgdXBkYXRlZC4gIFdoZW4gY2hlY2tpbmcgaWYgdGhleSBkaWZmZXIsCitnaXQgZmlyc3QgcnVucyBgbHN0YXQoMilgIG9uIHRoZSBmaWxlcyBhbmQgY29tcGFyZXMgdGhlIHJlc3VsdAord2l0aCB0aGlzIGluZm9ybWF0aW9uICh0aGlzIGlzIHdoYXQgd2FzIG9yaWdpbmFsbHkgZG9uZSBieSB0aGUKK2BjZV9tYXRjaF9zdGF0KClgIGZ1bmN0aW9uLCBidXQgdGhlIGN1cnJlbnQgY29kZSBkb2VzIGl0IGluCitgY2VfbWF0Y2hfc3RhdF9iYXNpYygpYCBmdW5jdGlvbikuICBJZiBzb21lIG9mIHRoZXNlICJjYWNoZWQKK3N0YXQgaW5mb3JtYXRpb24iIGZpZWxkcyBkbyBub3QgbWF0Y2gsIGdpdCBjYW4gdGVsbCB0aGF0IHRoZQorZmlsZXMgYXJlIG1vZGlmaWVkIHdpdGhvdXQgZXZlbiBsb29raW5nIGF0IHRoZWlyIGNvbnRlbnRzLgorCitOb3RlOiBub3QgYWxsIG1lbWJlcnMgaW4gYHN0cnVjdCBzdGF0YCBvYnRhaW5lZCB2aWEgYGxzdGF0KDIpYAorYXJlIHVzZWQgZm9yIHRoaXMgY29tcGFyaXNvbi4gIEZvciBleGFtcGxlLCBgc3RfYXRpbWVgIG9idmlvdXNseQoraXMgbm90IHVzZWZ1bC4gIEN1cnJlbnRseSwgZ2l0IGNvbXBhcmVzIHRoZSBmaWxlIHR5cGUgKHJlZ3VsYXIKK2ZpbGVzIHZzIHN5bWJvbGljIGxpbmtzKSBhbmQgZXhlY3V0YWJsZSBiaXRzIChvbmx5IGZvciByZWd1bGFyCitmaWxlcykgZnJvbSBgc3RfbW9kZWAgbWVtYmVyLCBgc3RfbXRpbWVgIGFuZCBgc3RfY3RpbWVgCit0aW1lc3RhbXBzLCBgc3RfdWlkYCwgYHN0X2dpZGAsIGBzdF9pbm9gLCBhbmQgYHN0X3NpemVgIG1lbWJlcnMuCitXaXRoIGEgYFVTRV9TVERFVmAgY29tcGlsZS10aW1lIG9wdGlvbiwgYHN0X2RldmAgaXMgYWxzbworY29tcGFyZWQsIGJ1dCB0aGlzIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQgYmVjYXVzZSB0aGlzIG1lbWJlcgoraXMgbm90IHN0YWJsZSBvbiBuZXR3b3JrIGZpbGVzeXN0ZW1zLiAgV2l0aCBgVVNFX05TRUNgCitjb21waWxlLXRpbWUgb3B0aW9uLCBgc3RfbXRpbS50dl9uc2VjYCBhbmQgYHN0X2N0aW0udHZfbnNlY2AKK21lbWJlcnMgYXJlIGFsc28gY29tcGFyZWQsIGJ1dCB0aGlzIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQKK2JlY2F1c2UgdGhlIHZhbHVlIG9mIHRoaXMgbWVtYmVyIGJlY29tZXMgbWVhbmluZ2xlc3Mgb25jZSB0aGUKK2lub2RlIGlzIGV2aWN0ZWQgZnJvbSB0aGUgaW5vZGUgY2FjaGUgb24gZmlsZXN5c3RlbXMgdGhhdCBkbyBub3QKK3N0b3JlIGl0IG9uIGRpc2suCisKKworUmFjeSBnaXQKKy0tLS0tLS0tCisKK1RoZXJlIGlzIG9uZSBzbGlnaHQgcHJvYmxlbSB3aXRoIHRoZSBvcHRpbWl6YXRpb24gYmFzZWQgb24gdGhlCitjYWNoZWQgc3RhdCBpbmZvcm1hdGlvbi4gIENvbnNpZGVyIHRoaXMgc2VxdWVuY2U6CisKKyAgOiBtb2RpZnkgJ2ZvbycKKyAgJCBnaXQgdXBkYXRlLWluZGV4ICdmb28nCisgIDogbW9kaWZ5ICdmb28nIGFnYWluLCBpbi1wbGFjZSwgd2l0aG91dCBjaGFuZ2luZyBpdHMgc2l6ZQorCitUaGUgZmlyc3QgYHVwZGF0ZS1pbmRleGAgY29tcHV0ZXMgdGhlIG9iamVjdCBuYW1lIG9mIHRoZQorY29udGVudHMgb2YgZmlsZSBgZm9vYCBhbmQgdXBkYXRlcyB0aGUgaW5kZXggZW50cnkgZm9yIGBmb29gCithbG9uZyB3aXRoIHRoZSBgc3RydWN0IHN0YXRgIGluZm9ybWF0aW9uLiAgSWYgdGhlIG1vZGlmaWNhdGlvbgordGhhdCBmb2xsb3dzIGl0IGhhcHBlbnMgdmVyeSBmYXN0IHNvIHRoYXQgdGhlIGZpbGUncyBgc3RfbXRpbWVgCit0aW1lc3RhbXAgZG9lcyBub3QgY2hhbmdlLCBhZnRlciB0aGlzIHNlcXVlbmNlLCB0aGUgY2FjaGVkIHN0YXQKK2luZm9ybWF0aW9uIHRoZSBpbmRleCBlbnRyeSByZWNvcmRzIHN0aWxsIGV4YWN0bHkgbWF0Y2ggd2hhdCB5b3UKK3dvdWxkIHNlZSBpbiB0aGUgZmlsZXN5c3RlbSwgZXZlbiB0aG91Z2ggdGhlIGZpbGUgYGZvb2AgaXMgbm93CitkaWZmZXJlbnQuCitUaGlzIHdheSwgZ2l0IGNhbiBpbmNvcnJlY3RseSB0aGluayBmaWxlcyBpbiB0aGUgd29ya2luZyB0cmVlCithcmUgdW5tb2RpZmllZCBldmVuIHRob3VnaCB0aGV5IGFjdHVhbGx5IGFyZS4gIFRoaXMgaXMgY2FsbGVkCit0aGUgInJhY3kgZ2l0IiBwcm9ibGVtIChkaXNjb3ZlcmVkIGJ5IFBhc2t5KSwgYW5kIHRoZSBlbnRyaWVzCit0aGF0IGFwcGVhciBjbGVhbiB3aGVuIHRoZXkgbWF5IG5vdCBiZSBiZWNhdXNlIG9mIHRoaXMgcHJvYmxlbQorYXJlIGNhbGxlZCAicmFjaWx5IGNsZWFuIi4KKworVG8gYXZvaWQgdGhpcyBwcm9ibGVtLCBnaXQgZG9lcyB0d28gdGhpbmdzOgorCisuIFdoZW4gdGhlIGNhY2hlZCBzdGF0IGluZm9ybWF0aW9uIHNheXMgdGhlIGZpbGUgaGFzIG5vdCBiZWVuCisgIG1vZGlmaWVkLCBhbmQgdGhlIGBzdF9tdGltZWAgaXMgdGhlIHNhbWUgYXMgKG9yIG5ld2VyIHRoYW4pCisgIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGluZGV4IGZpbGUgaXRzZWxmICh3aGljaCBpcyB0aGUgdGltZSBgZ2l0CisgIHVwZGF0ZS1pbmRleCBmb29gIGZpbmlzaGVkIHJ1bm5pbmcgaW4gdGhlIGFib3ZlIGV4YW1wbGUpLCBpdAorICBhbHNvIGNvbXBhcmVzIHRoZSBjb250ZW50cyB3aXRoIHRoZSBvYmplY3QgcmVnaXN0ZXJlZCBpbiB0aGUKKyAgaW5kZXggZW50cnkgdG8gbWFrZSBzdXJlIHRoZXkgbWF0Y2guCisKKy4gV2hlbiB0aGUgaW5kZXggZmlsZSBpcyB1cGRhdGVkIHRoYXQgY29udGFpbnMgcmFjaWx5IGNsZWFuCisgIGVudHJpZXMsIGNhY2hlZCBgc3Rfc2l6ZWAgaW5mb3JtYXRpb24gaXMgdHJ1bmNhdGVkIHRvIHplcm8KKyAgYmVmb3JlIHdyaXRpbmcgYSBuZXcgdmVyc2lvbiBvZiB0aGUgaW5kZXggZmlsZS4KKworQmVjYXVzZSB0aGUgaW5kZXggZmlsZSBpdHNlbGYgaXMgd3JpdHRlbiBhZnRlciBjb2xsZWN0aW5nIGFsbAordGhlIHN0YXQgaW5mb3JtYXRpb24gZnJvbSB1cGRhdGVkIHBhdGhzLCBgc3RfbXRpbWVgIHRpbWVzdGFtcCBvZgoraXQgaXMgdXN1YWxseSB0aGUgc2FtZSBhcyBvciBuZXdlciB0aGFuIGFueSBvZiB0aGUgcGF0aHMgdGhlCitpbmRleCBjb250YWlucy4gIEFuZCBubyBtYXR0ZXIgaG93IHF1aWNrIHRoZSBtb2RpZmljYXRpb24gdGhhdAorZm9sbG93cyBgZ2l0IHVwZGF0ZS1pbmRleCBmb29gIGZpbmlzaGVzLCB0aGUgcmVzdWx0aW5nCitgc3RfbXRpbWVgIHRpbWVzdGFtcCBvbiBgZm9vYCBjYW5ub3QgZ2V0IGEgdmFsdWUgZWFybGllcgordGhhbiB0aGUgaW5kZXggZmlsZS4gIFRoZXJlZm9yZSwgaW5kZXggZW50cmllcyB0aGF0IGNhbiBiZQorcmFjaWx5IGNsZWFuIGFyZSBsaW1pdGVkIHRvIHRoZSBvbmVzIHRoYXQgaGF2ZSB0aGUgc2FtZQordGltZXN0YW1wIGFzIHRoZSBpbmRleCBmaWxlIGl0c2VsZi4KKworVGhlIGNhbGxlcnMgdGhhdCB3YW50IHRvIGNoZWNrIGlmIGFuIGluZGV4IGVudHJ5IG1hdGNoZXMgdGhlCitjb3JyZXNwb25kaW5nIGZpbGUgaW4gdGhlIHdvcmtpbmcgdHJlZSBjb250aW51ZSB0byBjYWxsCitgY2VfbWF0Y2hfc3RhdCgpYCwgYnV0IHdpdGggdGhpcyBjaGFuZ2UsIGBjZV9tYXRjaF9zdGF0KClgIHVzZXMKK2BjZV9tb2RpZmllZF9jaGVja19mcygpYCB0byBzZWUgaWYgcmFjaWx5IGNsZWFuIG9uZXMgYXJlCithY3R1YWxseSBjbGVhbiBhZnRlciBjb21wYXJpbmcgdGhlIGNhY2hlZCBzdGF0IGluZm9ybWF0aW9uIHVzaW5nCitgY2VfbWF0Y2hfc3RhdF9iYXNpYygpYC4KKworVGhlIHByb2JsZW0gdGhlIGxhdHRlciBzb2x2ZXMgaXMgdGhpcyBzZXF1ZW5jZToKKworICAkIGdpdCB1cGRhdGUtaW5kZXggJ2ZvbycKKyAgOiBtb2RpZnkgJ2ZvbycgaW4tcGxhY2Ugd2l0aG91dCBjaGFuZ2luZyBpdHMgc2l6ZQorICA6IHdhaXQgZm9yIGVub3VnaCB0aW1lCisgICQgZ2l0IHVwZGF0ZS1pbmRleCAnYmFyJworCitXaXRob3V0IHRoZSBsYXR0ZXIsIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGluZGV4IGZpbGUgZ2V0cyBhIG5ld2VyCit2YWx1ZSwgYW5kIGZhbHNlbHkgY2xlYW4gZW50cnkgYGZvb2Agd291bGQgbm90IGJlIGNhdWdodCBieSB0aGUKK3RpbWVzdGFtcCBjb21wYXJpc29uIGNoZWNrIGRvbmUgd2l0aCB0aGUgZm9ybWVyIGxvZ2ljIGFueW1vcmUuCitUaGUgbGF0dGVyIG1ha2VzIHN1cmUgdGhhdCB0aGUgY2FjaGVkIHN0YXQgaW5mb3JtYXRpb24gZm9yIGBmb29gCit3b3VsZCBuZXZlciBtYXRjaCB3aXRoIHRoZSBmaWxlIGluIHRoZSB3b3JraW5nIHRyZWUsIHNvIGxhdGVyCitjaGVja3MgYnkgYGNlX21hdGNoX3N0YXRfYmFzaWMoKWAgd291bGQgcmVwb3J0IHRoYXQgdGhlIGluZGV4IGVudHJ5Citkb2VzIG5vdCBtYXRjaCB0aGUgZmlsZSBhbmQgZ2l0IGRvZXMgbm90IGhhdmUgdG8gZmFsbCBiYWNrIG9uIG1vcmUKK2V4cGVuc2l2ZSBgY2VfbW9kaWZpZWRfY2hlY2tfZnMoKWAuCisKKworUnVudGltZSBwZW5hbHR5CistLS0tLS0tLS0tLS0tLS0KKworVGhlIHJ1bnRpbWUgcGVuYWx0eSBvZiBmYWxsaW5nIGJhY2sgdG8gYGNlX21vZGlmaWVkX2NoZWNrX2ZzKClgCitmcm9tIGBjZV9tYXRjaF9zdGF0KClgIGNhbiBiZSB2ZXJ5IGV4cGVuc2l2ZSB3aGVuIHRoZXJlIGFyZSBtYW55CityYWNpbHkgY2xlYW4gZW50cmllcy4gIEFuIG9idmlvdXMgd2F5IHRvIGFydGlmaWNpYWxseSBjcmVhdGUKK3RoaXMgc2l0dWF0aW9uIGlzIHRvIGdpdmUgdGhlIHNhbWUgdGltZXN0YW1wIHRvIGFsbCB0aGUgZmlsZXMgaW4KK3RoZSB3b3JraW5nIHRyZWUgaW4gYSBsYXJnZSBwcm9qZWN0LCBydW4gYGdpdCB1cGRhdGUtaW5kZXhgIG9uCit0aGVtLCBhbmQgZ2l2ZSB0aGUgc2FtZSB0aW1lc3RhbXAgdG8gdGhlIGluZGV4IGZpbGU6CisKKyAgJCBkYXRlID4uZGF0ZXN0YW1wCisgICQgZ2l0IGxzLWZpbGVzIHwgeGFyZ3MgdG91Y2ggLXIgLmRhdGVzdGFtcAorICAkIGdpdCBscy1maWxlcyB8IGdpdCB1cGRhdGUtaW5kZXggLS1zdGRpbgorICAkIHRvdWNoIC1yIC5kYXRlc3RhbXAgLmdpdC9pbmRleAorCitUaGlzIHdpbGwgbWFrZSBhbGwgaW5kZXggZW50cmllcyByYWNpbHkgY2xlYW4uICBUaGUgbGludXgtMi42Citwcm9qZWN0LCBmb3IgZXhhbXBsZSwgdGhlcmUgYXJlIG92ZXIgMjAsMDAwIGZpbGVzIGluIHRoZSB3b3JraW5nCit0cmVlLiAgT24gbXkgQXRocm9uIDY0WDIgMzgwMCssIGFmdGVyIHRoZSBhYm92ZToKKworICAkIC91c3IvYmluL3RpbWUgZ2l0IGRpZmYtZmlsZXMKKyAgMS42OHVzZXIgMC41NHN5c3RlbSAwOjAyLjIyZWxhcHNlZCAxMDAlQ1BVICgwYXZndGV4dCswYXZnZGF0YSAwbWF4cmVzaWRlbnQpaworICAwaW5wdXRzKzBvdXRwdXRzICgwbWFqb3IrNjcxMTFtaW5vcilwYWdlZmF1bHRzIDBzd2FwcworICAkIGdpdCB1cGRhdGUtaW5kZXggTUFJTlRBSU5FUlMKKyAgJCAvdXNyL2Jpbi90aW1lIGdpdCBkaWZmLWZpbGVzCisgIDAuMDJ1c2VyIDAuMTJzeXN0ZW0gMDowMC4xNGVsYXBzZWQgMTAwJUNQVSAoMGF2Z3RleHQrMGF2Z2RhdGEgMG1heHJlc2lkZW50KWsKKyAgMGlucHV0cyswb3V0cHV0cyAoMG1ham9yKzkzNW1pbm9yKXBhZ2VmYXVsdHMgMHN3YXBzCisKK1J1bm5pbmcgYGdpdCB1cGRhdGUtaW5kZXhgIGluIHRoZSBtaWRkbGUgY2hlY2tlZCB0aGUgcmFjaWx5CitjbGVhbiBlbnRyaWVzLCBhbmQgbGVmdCB0aGUgY2FjaGVkIGBzdF9tdGltZWAgZm9yIGFsbCB0aGUgcGF0aHMKK2ludGFjdCBiZWNhdXNlIHRoZXkgd2VyZSBhY3R1YWxseSBjbGVhbiAoc28gdGhpcyBzdGVwIHRvb2sgYWJvdXQKK3RoZSBzYW1lIGFtb3VudCBvZiB0aW1lIGFzIHRoZSBmaXJzdCBgZ2l0IGRpZmYtZmlsZXNgKS4gIEFmdGVyCit0aGF0LCB0aGV5IGFyZSBub3QgcmFjaWx5IGNsZWFuIGFueW1vcmUgYnV0IGFyZSB0cnVseSBjbGVhbiwgc28KK3RoZSBzZWNvbmQgaW52b2NhdGlvbiBvZiBgZ2l0IGRpZmYtZmlsZXNgIGZ1bGx5IHRvb2sgYWR2YW50YWdlCitvZiB0aGUgY2FjaGVkIHN0YXQgaW5mb3JtYXRpb24uCisKKworQXZvaWRpbmcgcnVudGltZSBwZW5hbHR5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW4gb3JkZXIgdG8gYXZvaWQgdGhlIGFib3ZlIHJ1bnRpbWUgcGVuYWx0eSwgcG9zdCAxLjQuMiBnaXQgdXNlZAordG8gaGF2ZSBhIGNvZGUgdGhhdCBtYWRlIHN1cmUgdGhlIGluZGV4IGZpbGUKK2dvdCB0aW1lc3RhbXAgbmV3ZXIgdGhhbiB0aGUgeW91bmdlc3QgZmlsZXMgaW4gdGhlIGluZGV4IHdoZW4KK3RoZXJlIGFyZSBtYW55IHlvdW5nIGZpbGVzIHdpdGggdGhlIHNhbWUgdGltZXN0YW1wIGFzIHRoZQorcmVzdWx0aW5nIGluZGV4IGZpbGUgd291bGQgb3RoZXJ3aXNlIHdvdWxkIGhhdmUgYnkgd2FpdGluZworYmVmb3JlIGZpbmlzaGluZyB3cml0aW5nIHRoZSBpbmRleCBmaWxlIG91dC4KKworSSBzdXNwZWN0ZWQgdGhhdCBpbiBwcmFjdGljZSB0aGUgc2l0dWF0aW9uIHdoZXJlIG1hbnkgcGF0aHMgaW4gdGhlCitpbmRleCBhcmUgYWxsIHJhY2lseSBjbGVhbiB3YXMgcXVpdGUgcmFyZS4gIFRoZSBvbmx5IGNvZGUgcGF0aHMKK3RoYXQgY2FuIHJlY29yZCByZWNlbnQgdGltZXN0YW1wIGZvciBsYXJnZSBudW1iZXIgb2YgcGF0aHMgYXJlOgorCisuIEluaXRpYWwgYGdpdCBhZGQgLmAgb2YgYSBsYXJnZSBwcm9qZWN0LgorCisuIGBnaXQgY2hlY2tvdXRgIG9mIGEgbGFyZ2UgcHJvamVjdCBmcm9tIGFuIGVtcHR5IGluZGV4IGludG8gYW4KKyAgdW5wb3B1bGF0ZWQgd29ya2luZyB0cmVlLgorCitOb3RlOiBzd2l0Y2hpbmcgYnJhbmNoZXMgd2l0aCBgZ2l0IGNoZWNrb3V0YCBrZWVwcyB0aGUgY2FjaGVkCitzdGF0IGluZm9ybWF0aW9uIG9mIGV4aXN0aW5nIHdvcmtpbmcgdHJlZSBmaWxlcyB0aGF0IGFyZSB0aGUKK3NhbWUgYmV0d2VlbiB0aGUgY3VycmVudCBicmFuY2ggYW5kIHRoZSBuZXcgYnJhbmNoLCB3aGljaCBhcmUKK2FsbCBvbGRlciB0aGFuIHRoZSByZXN1bHRpbmcgaW5kZXggZmlsZSwgYW5kIHRoZXkgd2lsbCBub3QKK2JlY29tZSByYWNpbHkgY2xlYW4uICBPbmx5IHRoZSBmaWxlcyB0aGF0IGFyZSBhY3R1YWxseSBjaGVja2VkCitvdXQgY2FuIGJlY29tZSByYWNpbHkgY2xlYW4uCisKK0luIGEgbGFyZ2UgcHJvamVjdCB3aGVyZSByYWNpbmVzcyBhdm9pZGFuY2UgY29zdCByZWFsbHkgbWF0dGVycywKK2hvd2V2ZXIsIHRoZSBpbml0aWFsIGNvbXB1dGF0aW9uIG9mIGFsbCBvYmplY3QgbmFtZXMgaW4gdGhlCitpbmRleCB0YWtlcyBtb3JlIHRoYW4gb25lIHNlY29uZCwgYW5kIHRoZSBpbmRleCBmaWxlIGlzIHdyaXR0ZW4KK291dCBhZnRlciBhbGwgdGhhdCBoYXBwZW5zLiAgVGhlcmVmb3JlIHRoZSB0aW1lc3RhbXAgb2YgdGhlCitpbmRleCBmaWxlIHdpbGwgYmUgbW9yZSB0aGFuIG9uZSBzZWNvbmRzIGxhdGVyIHRoYW4gdGhlCit5b3VuZ2VzdCBmaWxlIGluIHRoZSB3b3JraW5nIHRyZWUuICBUaGlzIG1lYW5zIHRoYXQgaW4gdGhlc2UKK2Nhc2VzIHRoZXJlIGFjdHVhbGx5IHdpbGwgbm90IGJlIGFueSByYWNpbHkgY2xlYW4gZW50cnkgaW4KK3RoZSByZXN1bHRpbmcgaW5kZXguCisKK0Jhc2VkIG9uIHRoaXMgZGlzY3Vzc2lvbiwgdGhlIGN1cnJlbnQgY29kZSBkb2VzIG5vdCB1c2UgdGhlCisid29ya2Fyb3VuZCIgdG8gYXZvaWQgdGhlIHJ1bnRpbWUgcGVuYWx0eSB0aGF0IGRvZXMgbm90IGV4aXN0IGluCitwcmFjdGljZSBhbnltb3JlLiAgVGhpcyB3YXMgZG9uZSB3aXRoIGNvbW1pdCAwZmM4MmNmZiBvbiBBdWcgMTUsCisyMDA2LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvc2VuZC1wYWNrLXBpcGVsaW5lLnR4dCBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3NlbmQtcGFjay1waXBlbGluZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgxZWZlNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3NlbmQtcGFjay1waXBlbGluZS50eHQKQEAgLTAsMCArMSw2MyBAQAorZ2l0LXNlbmQtcGFjaworPT09PT09PT09PT09PQorCitPdmVyYWxsIG9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0KKworLiBDb25uZWN0cyB0byB0aGUgcmVtb3RlIHNpZGUgYW5kIGludm9rZXMgZ2l0LXJlY2VpdmUtcGFjay4KKworLiBMZWFybnMgd2hhdCByZWZzIHRoZSByZW1vdGUgaGFzIGFuZCB3aGF0IGNvbW1pdCB0aGV5IHBvaW50IGF0LgorICBNYXRjaGVzIHRoZW0gdG8gdGhlIHJlZnNwZWNzIHdlIGFyZSBwdXNoaW5nLgorCisuIENoZWNrcyBpZiB0aGVyZSBhcmUgbm9uLWZhc3QtZm9yd2FyZHMuICBVbmxpa2UgZmV0Y2gtcGFjaywKKyAgdGhlIHJlcG9zaXRvcnkgc2VuZC1wYWNrIHJ1bnMgaW4gaXMgc3VwcG9zZWQgdG8gYmUgYSBzdXBlcnNldAorICBvZiB0aGUgcmVjaXBpZW50IGluIGZhc3QtZm9yd2FyZCBjYXNlcywgc28gdGhlcmUgaXMgbm8gbmVlZAorICBmb3Igd2FudC9oYXZlIGV4Y2hhbmdlcywgYW5kIGZhc3QtZm9yd2FyZCBjaGVjayBjYW4gYmUgZG9uZQorICBsb2NhbGx5LiAgVGVsbCB0aGUgcmVzdWx0IHRvIHRoZSBvdGhlciBlbmQuCisKKy4gQ2FsbHMgcGFja19vYmplY3RzKCkgd2hpY2ggZ2VuZXJhdGVzIGEgcGFja2ZpbGUgYW5kIHNlbmRzIGl0CisgIG92ZXIgdG8gdGhlIG90aGVyIGVuZC4KKworLiBJZiB0aGUgcmVtb3RlIHNpZGUgaXMgbmV3IGVub3VnaCAodjEuMS4wIG9yIGxhdGVyKSwgd2FpdCBmb3IKKyAgdGhlIHVucGFjayBhbmQgaG9vayBzdGF0dXMgZnJvbSB0aGUgb3RoZXIgZW5kLgorCisuIEV4aXQgd2l0aCBhcHByb3ByaWF0ZSBlcnJvciBjb2Rlcy4KKworCitQYWNrX29iamVjdHMgcGlwZWxpbmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGZ1bmN0aW9uIGdldHMgb25lIGZpbGUgZGVzY3JpcHRvciAoYGZkYCkgd2hpY2ggaXMgZWl0aGVyIGEKK3NvY2tldCAob3ZlciB0aGUgbmV0d29yaykgb3IgYSBwaXBlIChsb2NhbCkuICBXaGF0J3Mgd3JpdHRlbiB0bwordGhpcyBmZCBnb2VzIHRvIGdpdC1yZWNlaXZlLXBhY2sgdG8gYmUgdW5wYWNrZWQuCisKKyAgICBzZW5kLXBhY2sgLS0tPiBmZCAtLS0+IHJlY2VpdmUtcGFjaworCitUaGUgZnVuY3Rpb24gcGFja19vYmplY3RzIGNyZWF0ZXMgYSBwaXBlIGFuZCB0aGVuIGZvcmtzLiAgVGhlCitmb3JrZWQgY2hpbGQgZXhlY3MgcGFjay1vYmplY3RzIHdpdGggLS1yZXZzIHRvIHJlY2VpdmUgcmV2aXNpb24KK3BhcmFtZXRlcnMgZnJvbSBpdHMgc3RhbmRhcmQgaW5wdXQuIFRoaXMgcHJvY2VzcyB3aWxsIHdyaXRlIHRoZQorcGFja2ZpbGUgdG8gdGhlIG90aGVyIGVuZC4KKworICAgIHNlbmQtcGFjaworICAgICAgIHwKKyAgICAgICBwYWNrX29iamVjdHMoKSAtLS0+IGZkIC0tLT4gcmVjZWl2ZS1wYWNrCisgICAgICAgICAgfCBeIChwaXBlKQorCSAgdiB8CisgICAgICAgICAoY2hpbGQpCisKK1RoZSBjaGlsZCBkdXAyJ3MgdG8gYXJyYW5nZSBpdHMgc3RhbmRhcmQgb3V0cHV0IHRvIGdvIGJhY2sgdG8KK3RoZSBvdGhlciBlbmQsIGFuZCByZWFkIGl0cyBzdGFuZGFyZCBpbnB1dCB0byBjb21lIGZyb20gdGhlCitwaXBlLiAgQWZ0ZXIgdGhhdCBpdCBleGVjJ3MgcGFjay1vYmplY3RzLiAgT24gdGhlIG90aGVyIGhhbmQsCit0aGUgcGFyZW50IHByb2Nlc3MsIGJlZm9yZSBzdGFydGluZyB0byBmZWVkIHRoZSBjaGlsZCBwaXBlbGluZSwKK2Nsb3NlcyB0aGUgcmVhZGluZyBzaWRlIG9mIHRoZSBwaXBlIGFuZCBmZCB0byByZWNlaXZlLXBhY2suCisKKyAgICBzZW5kLXBhY2sKKyAgICAgICB8CisgICAgICAgcGFja19vYmplY3RzKHBhcmVudCkKKyAgICAgICAgICB8CisJICB2IFswXQorICAgICAgICAgcGFjay1vYmplY3RzIFswXSAtLS0+IHJlY2VpdmUtcGFjaworCisKK1tqYzogdGhlIHBpcGVsaW5lIHdhcyBtdWNoIG1vcmUgY29tcGxleCBhbmQgbmVlZGVkIGRvY3VtZW50YXRpb24gYmVmb3JlCisgSSB1bmRlcnN0b29kIGFuIGVhcmxpZXIgYnVnLCBidXQgbm93IGl0IGlzIHRyaXZpYWwgYW5kIHN0cmFpZ2h0Zm9yd2FyZC5dCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9zaGFsbG93LnR4dCBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3NoYWxsb3cudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OTI2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9zaGFsbG93LnR4dApAQCAtMCwwICsxLDQ5IEBACitEZWYuOiBTaGFsbG93IGNvbW1pdHMgZG8gaGF2ZSBwYXJlbnRzLCBidXQgbm90IGluIHRoZSBzaGFsbG93CityZXBvLCBhbmQgdGhlcmVmb3JlIGdyYWZ0cyBhcmUgaW50cm9kdWNlZCBwcmV0ZW5kaW5nIHRoYXQKK3RoZXNlIGNvbW1pdHMgaGF2ZSBubyBwYXJlbnRzLgorCitUaGUgYmFzaWMgaWRlYSBpcyB0byB3cml0ZSB0aGUgU0hBMXMgb2Ygc2hhbGxvdyBjb21taXRzIGludG8KKyRHSVRfRElSL3NoYWxsb3csIGFuZCBoYW5kbGUgaXRzIGNvbnRlbnRzIGxpa2UgdGhlIGNvbnRlbnRzCitvZiAkR0lUX0RJUi9pbmZvL2dyYWZ0cyAod2l0aCB0aGUgZGlmZmVyZW5jZSB0aGF0IHNoYWxsb3cKK2Nhbm5vdCBjb250YWluIHBhcmVudCBpbmZvcm1hdGlvbikuCisKK1RoaXMgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIGEgbmV3IGZpbGUgaW5zdGVhZCBvZiBncmFmdHMsIG9yCitldmVuIHRoZSBjb25maWcsIHNpbmNlIHRoZSB1c2VyIHNob3VsZCBub3QgdG91Y2ggdGhhdCBmaWxlCithdCBhbGwgKGV2ZW4gdGhyb3VnaG91dCBkZXZlbG9wbWVudCBvZiB0aGUgc2hhbGxvdyBjbG9uZSwgaXQKK3dhcyBuZXZlciBtYW51YWxseSBlZGl0ZWQhKS4KKworRWFjaCBsaW5lIGNvbnRhaW5zIGV4YWN0bHkgb25lIFNIQTEuIFdoZW4gcmVhZCwgYSBjb21taXRfZ3JhZnQKK3dpbGwgYmUgY29uc3RydWN0ZWQsIHdoaWNoIGhhcyBucl9wYXJlbnQgPCAwIHRvIG1ha2UgaXQgZWFzaWVyCit0byBkaXNjZXJuIGZyb20gdXNlciBwcm92aWRlZCBncmFmdHMuCisKK1NpbmNlIGZzY2stb2JqZWN0cyByZWxpZXMgb24gdGhlIGxpYnJhcnkgdG8gcmVhZCB0aGUgb2JqZWN0cywKK2l0IGhvbm91cnMgc2hhbGxvdyBjb21taXRzIGF1dG9tYXRpY2FsbHkuCisKK1RoZXJlIGFyZSBzb21lIHVuZmluaXNoZWQgZW5kcyBvZiB0aGUgd2hvbGUgc2hhbGxvdyBidXNpbmVzczoKKworLSBtYXliZSB3ZSBoYXZlIHRvIGZvcmNlIG5vbi10aGluIHBhY2tzIHdoZW4gZmV0Y2hpbmcgaW50byBhCisgIHNoYWxsb3cgcmVwbyAoQVRNIHRoZXkgYXJlIGZvcmNlZCBub24tdGhpbikuCisKKy0gQSBzcGVjaWFsIGhhbmRsaW5nIG9mIGEgc2hhbGxvdyB1cHN0cmVhbSBpcyBuZWVkZWQuIEF0IHNvbWUKKyAgc3RhZ2UsIHVwbG9hZC1wYWNrIGhhcyB0byBjaGVjayBpZiBpdCBzZW5kcyBhIHNoYWxsb3cgY29tbWl0LAorICBhbmQgaXQgc2hvdWxkIHNlbmQgdGhhdCBpbmZvcm1hdGlvbiBlYXJseSAob3IgZmFpbCwgaWYgdGhlCisgIGNsaWVudCBkb2VzIG5vdCBzdXBwb3J0IHNoYWxsb3cgcmVwb3NpdG9yaWVzKS4gVGhlcmUgaXMgbm8KKyAgc3VwcG9ydCBhdCBhbGwgZm9yIHRoaXMgaW4gdGhpcyBwYXRjaCBzZXJpZXMuCisKKy0gSW5zdGVhZCBvZiBsb2NraW5nICRHSVRfRElSL3NoYWxsb3cgYXQgdGhlIHN0YXJ0LCBqdXN0CisgIHRoZSB0aW1lc3RhbXAgb2YgaXQgaXMgbm90ZWQsIGFuZCB3aGVuIGl0IGNvbWVzIHRvIHdyaXRpbmcgaXQsCisgIGEgY2hlY2sgaXMgcGVyZm9ybWVkIGlmIHRoZSBtdGltZSBpcyBzdGlsbCB0aGUgc2FtZSwgZHlpbmcgaWYKKyAgaXQgaXMgbm90LgorCistIEl0IGlzIHVuY2xlYXIgaG93ICJwdXNoIGludG8vZnJvbSBhIHNoYWxsb3cgcmVwbyIgc2hvdWxkIGJlaGF2ZS4KKworLSBJZiB5b3UgZGVlcGVuIGEgaGlzdG9yeSwgeW91J2Qgd2FudCB0byBnZXQgdGhlIHRhZ3Mgb2YgdGhlCisgIG5ld2x5IHN0b3JlZCAoYnV0IG9sZGVyISkgY29tbWl0cy4gVGhpcyBkb2VzIG5vdCB3b3JrIHJpZ2h0IG5vdy4KKworVG8gbWFrZSBhIHNoYWxsb3cgY2xvbmUsIHlvdSBjYW4gY2FsbCAiZ2l0LWNsb25lIC0tZGVwdGggMjAgcmVwbyIuCitUaGUgcmVzdWx0IGNvbnRhaW5zIG9ubHkgY29tbWl0IGNoYWlucyB3aXRoIGEgbGVuZ3RoIG9mIGF0IG1vc3QgMjAuCitJdCBhbHNvIHdyaXRlcyBhbiBhcHByb3ByaWF0ZSAkR0lUX0RJUi9zaGFsbG93LgorCitZb3UgY2FuIGRlZXBlbiBhIHNoYWxsb3cgcmVwb3NpdG9yeSB3aXRoICJnaXQtZmV0Y2ggLS1kZXB0aCAyMAorcmVwbyBicmFuY2giLCB3aGljaCB3aWxsIGZldGNoIGJyYW5jaCBmcm9tIHJlcG8sIGJ1dCBzdG9wIGF0IGRlcHRoCisyMCwgdXBkYXRpbmcgJEdJVF9ESVIvc2hhbGxvdy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3RyaXZpYWwtbWVyZ2UudHh0IGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvdHJpdmlhbC1tZXJnZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRjODQxMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3RyaXZpYWwtbWVyZ2UudHh0CkBAIC0wLDAgKzEsMTIxIEBACitUcml2aWFsIG1lcmdlIHJ1bGVzCis9PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBvdXRjb21lcyBvZiB0aGUgdHJpdmlhbCBtZXJnZSBsb2dpYyBpbiByZWFkLXRyZWUuCisKK09uZS13YXkgbWVyZ2UKKy0tLS0tLS0tLS0tLS0KKworVGhpcyByZXBsYWNlcyB0aGUgaW5kZXggd2l0aCBhIGRpZmZlcmVudCB0cmVlLCBrZWVwaW5nIHRoZSBzdGF0IGluZm8KK2ZvciBlbnRyaWVzIHRoYXQgZG9uJ3QgY2hhbmdlLCBhbmQgYWxsb3dpbmcgLXUgdG8gbWFrZSB0aGUgbWluaW11bQorcmVxdWlyZWQgY2hhbmdlcyB0byB0aGUgd29ya2luZyB0cmVlIHRvIGhhdmUgaXQgbWF0Y2guCisKK0VudHJpZXMgbWFya2VkICcrJyBoYXZlIHN0YXQgaW5mb3JtYXRpb24uIFNwYWNlcyBtYXJrZWQgJyonIGRvbid0CithZmZlY3QgdGhlIHJlc3VsdC4KKworICAgaW5kZXggICB0cmVlICAgIHJlc3VsdAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogICAgICAgKGVtcHR5KSAoZW1wdHkpCisgICAoZW1wdHkpIHRyZWUgICAgdHJlZQorICAgaW5kZXgrICB0cmVlICAgIHRyZWUKKyAgIGluZGV4KyAgaW5kZXggICBpbmRleCsKKworVHdvLXdheSBtZXJnZQorLS0tLS0tLS0tLS0tLQorCitJdCBpcyBwZXJtaXR0ZWQgZm9yIHRoZSBpbmRleCB0byBsYWNrIGFuIGVudHJ5OyB0aGlzIGRvZXMgbm90IHByZXZlbnQKK2FueSBjYXNlIGZyb20gYXBwbHlpbmcuCisKK0lmIHRoZSBpbmRleCBleGlzdHMsIGl0IGlzIGFuIGVycm9yIGZvciBpdCBub3QgdG8gbWF0Y2ggZWl0aGVyIHRoZSBvbGQKK29yIHRoZSByZXN1bHQuCisKK0lmIG11bHRpcGxlIGNhc2VzIGFwcGx5LCB0aGUgb25lIHVzZWQgaXMgbGlzdGVkIGZpcnN0LgorCitBIHJlc3VsdCB3aGljaCBjaGFuZ2VzIHRoZSBpbmRleCBpcyBhbiBlcnJvciBpZiB0aGUgaW5kZXggaXMgbm90IGVtcHR5CithbmQgbm90IHVwLXRvLWRhdGUuCisKK0VudHJpZXMgbWFya2VkICcrJyBoYXZlIHN0YXQgaW5mb3JtYXRpb24uIFNwYWNlcyBtYXJrZWQgJyonIGRvbid0CithZmZlY3QgdGhlIHJlc3VsdC4KKworIGNhc2UgIGluZGV4ICAgb2xkICAgICBuZXcgICAgIHJlc3VsdAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAwLzIgICAoZW1wdHkpICogICAgICAgKGVtcHR5KSAoZW1wdHkpCisgMS8zICAgKGVtcHR5KSAqICAgICAgIG5ldyAgICAgbmV3CisgNC81ICAgaW5kZXgrICAoZW1wdHkpIChlbXB0eSkgaW5kZXgrCisgNi83ICAgaW5kZXgrICAoZW1wdHkpIGluZGV4ICAgaW5kZXgrCisgMTAgICAgaW5kZXgrICBpbmRleCAgIChlbXB0eSkgKGVtcHR5KQorIDE0LzE1IGluZGV4KyAgb2xkICAgICBvbGQgICAgIGluZGV4KworIDE4LzE5IGluZGV4KyAgb2xkICAgICBpbmRleCAgIGluZGV4KworIDIwICAgIGluZGV4KyAgaW5kZXggICBuZXcgICAgIG5ldworCitUaHJlZS13YXkgbWVyZ2UKKy0tLS0tLS0tLS0tLS0tLQorCitJdCBpcyBwZXJtaXR0ZWQgZm9yIHRoZSBpbmRleCB0byBsYWNrIGFuIGVudHJ5OyB0aGlzIGRvZXMgbm90IHByZXZlbnQKK2FueSBjYXNlIGZyb20gYXBwbHlpbmcuCisKK0lmIHRoZSBpbmRleCBleGlzdHMsIGl0IGlzIGFuIGVycm9yIGZvciBpdCBub3QgdG8gbWF0Y2ggZWl0aGVyIHRoZQoraGVhZCBvciAoaWYgdGhlIG1lcmdlIGlzIHRyaXZpYWwpIHRoZSByZXN1bHQuCisKK0lmIG11bHRpcGxlIGNhc2VzIGFwcGx5LCB0aGUgb25lIHVzZWQgaXMgbGlzdGVkIGZpcnN0LgorCitBIHJlc3VsdCBvZiAibm8gbWVyZ2UiIG1lYW5zIHRoYXQgaW5kZXggaXMgbGVmdCBpbiBzdGFnZSAwLCBhbmNlc3QgaW4KK3N0YWdlIDEsIGhlYWQgaW4gc3RhZ2UgMiwgYW5kIHJlbW90ZSBpbiBzdGFnZSAzIChpZiBhbnkgb2YgdGhlc2UgYXJlCitlbXB0eSwgbm8gZW50cnkgaXMgbGVmdCBmb3IgdGhhdCBzdGFnZSkuIE90aGVyd2lzZSwgdGhlIGdpdmVuIGVudHJ5IGlzCitsZWZ0IGluIHN0YWdlIDAsIGFuZCB0aGVyZSBhcmUgbm8gb3RoZXIgZW50cmllcy4KKworQSByZXN1bHQgb2YgIm5vIG1lcmdlIiBpcyBhbiBlcnJvciBpZiB0aGUgaW5kZXggaXMgbm90IGVtcHR5IGFuZCBub3QKK3VwLXRvLWRhdGUuCisKKyplbXB0eSogbWVhbnMgdGhhdCB0aGUgdHJlZSBtdXN0IG5vdCBoYXZlIGEgZGlyZWN0b3J5LWZpbGUgY29uZmxpY3QKKyB3aXRoIHRoZSBlbnRyeS4KKworRm9yIG11bHRpcGxlIGFuY2VzdG9ycywgYSAnKycgbWVhbnMgdGhhdCB0aGlzIGNhc2UgYXBwbGllcyBldmVuIGlmCitvbmx5IG9uZSBhbmNlc3RvciBvciByZW1vdGUgZml0czsgYSAnXicgbWVhbnMgYWxsIG9mIHRoZSBhbmNlc3RvcnMKK211c3QgYmUgdGhlIHNhbWUuCisKK2Nhc2UgIGFuY2VzdCAgICBoZWFkICAgIHJlbW90ZSAgICByZXN1bHQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzEgICAgIChlbXB0eSkrICAoZW1wdHkpIChlbXB0eSkgICAoZW1wdHkpCisyQUxUICAoZW1wdHkpKyAgKmVtcHR5KiByZW1vdGUgICAgcmVtb3RlCisyICAgICAoZW1wdHkpXiAgKGVtcHR5KSByZW1vdGUgICAgbm8gbWVyZ2UKKzNBTFQgIChlbXB0eSkrICBoZWFkICAgICplbXB0eSogICBoZWFkCiszICAgICAoZW1wdHkpXiAgaGVhZCAgICAoZW1wdHkpICAgbm8gbWVyZ2UKKzQgICAgIChlbXB0eSleICBoZWFkICAgIHJlbW90ZSAgICBubyBtZXJnZQorNUFMVCAgKiAgICAgICAgIGhlYWQgICAgaGVhZCAgICAgIGhlYWQKKzYgICAgIGFuY2VzdCsgICAoZW1wdHkpIChlbXB0eSkgICBubyBtZXJnZQorOCAgICAgYW5jZXN0XiAgIChlbXB0eSkgYW5jZXN0ICAgIG5vIG1lcmdlCis3ICAgICBhbmNlc3QrICAgKGVtcHR5KSByZW1vdGUgICAgbm8gbWVyZ2UKKzEwICAgIGFuY2VzdF4gICBhbmNlc3QgIChlbXB0eSkgICBubyBtZXJnZQorOSAgICAgYW5jZXN0KyAgIGhlYWQgICAgKGVtcHR5KSAgIG5vIG1lcmdlCisxNiAgICBhbmMxL2FuYzIgYW5jMSAgICBhbmMyICAgICAgbm8gbWVyZ2UKKzEzICAgIGFuY2VzdCsgICBoZWFkICAgIGFuY2VzdCAgICBoZWFkCisxNCAgICBhbmNlc3QrICAgYW5jZXN0ICByZW1vdGUgICAgcmVtb3RlCisxMSAgICBhbmNlc3QrICAgaGVhZCAgICByZW1vdGUgICAgbm8gbWVyZ2UKKworT25seSAjMkFMVCBhbmQgIzNBTFQgdXNlICplbXB0eSosIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBvbmx5IGNhc2VzCit3aGVyZSB0aGVyZSBjYW4gYmUgY29uZmxpY3RzIHRoYXQgZGlkbid0IGV4aXN0IGJlZm9yZS4gTm90ZSB0aGF0IHdlCithbGxvdyBkaXJlY3RvcnktZmlsZSBjb25mbGljdHMgYmV0d2VlbiB0aGluZ3MgaW4gZGlmZmVyZW50IHN0YWdlcworYWZ0ZXIgdGhlIHRyaXZpYWwgbWVyZ2UuCisKK0EgcG9zc2libGUgYWx0ZXJuYXRpdmUgZm9yICM2IGlzIChlbXB0eSksIHdoaWNoIHdvdWxkIG1ha2UgaXQgbGlrZQorIzEuIFRoaXMgaXMgbm90IHVzZWQsIGR1ZSB0byB0aGUgbGlrZWxpaG9vZCB0aGF0IGl0IGFyaXNlcyBkdWUgdG8KK21vdmluZyB0aGUgZmlsZSB0byBtdWx0aXBsZSBkaWZmZXJlbnQgbG9jYXRpb25zIG9yIG1vdmluZyBhbmQgZGVsZXRpbmcKK2l0IGluIGRpZmZlcmVudCBicmFuY2hlcy4KKworQ2FzZSAjMSBpcyBpbmNsdWRlZCBmb3IgY29tcGxldGVuZXNzLCBhbmQgYWxzbyBpbiBjYXNlIHdlIGRlY2lkZSB0bworcHV0IG9uICcrJyBtYXJraW5nczsgYW55IHBhdGggdGhhdCBpcyBuZXZlciBtZW50aW9uZWQgYXQgYWxsIGlzbid0CitoYW5kbGVkLgorCitOb3RlIHRoYXQgIzE2IGlzIHdoZW4gYm90aCAjMTMgYW5kICMxNCBhcHBseTsgaW4gdGhpcyBjYXNlLCB3ZSByZWZ1c2UKK3RoZSB0cml2aWFsIG1lcmdlLCBiZWNhdXNlIHdlIGNhbid0IHRlbGwgZnJvbSB0aGlzIGRhdGEgd2hpY2ggaXMKK3JpZ2h0LiBUaGlzIGlzIGEgY2FzZSBvZiBhIHJldmVydGVkIHBhdGNoIChpbiBzb21lIGRpcmVjdGlvbiwgbWF5YmUKK211bHRpcGxlIHRpbWVzKSwgYW5kIHRoZSByaWdodCBhbnN3ZXIgZGVwZW5kcyBvbiBsb29raW5nIGF0IGNyb3NzaW5ncworb2YgaGlzdG9yeSBvciBjb21tb24gYW5jZXN0b3JzIG9mIHRoZSBhbmNlc3RvcnMuCisKK05vdGUgdGhhdCwgYmV0d2VlbiAjNiwgIzcsICM5LCBhbmQgIzExLCBhbGwgY2FzZXMgbm90IG90aGVyd2lzZQorY292ZXJlZCBhcmUgaGFuZGxlZCBpbiB0aGlzIHRhYmxlLgorCitGb3IgIzggYW5kICMxMCwgdGhlcmUgaXMgYWx0ZXJuYXRpdmUgYmVoYXZpb3IsIG5vdCBjdXJyZW50bHkKK2ltcGxlbWVudGVkLCB3aGVyZSB0aGUgcmVzdWx0IGlzIChlbXB0eSkuIEFzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCwKK3RoZSBhdXRvbWF0aWMgbWVyZ2Ugd2lsbCBnZW5lcmFsbHkgZ2l2ZSB0aGlzIGVmZmVjdC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdHV0b3JpYWwtMi50eHQgYi9Eb2N1bWVudGF0aW9uL3R1dG9yaWFsLTIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYWM0N2QKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3R1dG9yaWFsLTIudHh0CkBAIC0wLDAgKzEsNDA2IEBACitBIHR1dG9yaWFsIGludHJvZHVjdGlvbiB0byBnaXQ6IHBhcnQgdHdvCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1lvdSBzaG91bGQgd29yayB0aHJvdWdoIGxpbms6dHV0b3JpYWwuaHRtbFtBIHR1dG9yaWFsIGludHJvZHVjdGlvbiB0bworZ2l0XSBiZWZvcmUgcmVhZGluZyB0aGlzIHR1dG9yaWFsLgorCitUaGUgZ29hbCBvZiB0aGlzIHR1dG9yaWFsIGlzIHRvIGludHJvZHVjZSB0d28gZnVuZGFtZW50YWwgcGllY2VzIG9mCitnaXQncyBhcmNoaXRlY3R1cmUtLXRoZSBvYmplY3QgZGF0YWJhc2UgYW5kIHRoZSBpbmRleCBmaWxlLS1hbmQgdG8KK3Byb3ZpZGUgdGhlIHJlYWRlciB3aXRoIGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIHVuZGVyc3RhbmQgdGhlIHJlc3QKK29mIHRoZSBnaXQgZG9jdW1lbnRhdGlvbi4KKworVGhlIGdpdCBvYmplY3QgZGF0YWJhc2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xldCdzIHN0YXJ0IGEgbmV3IHByb2plY3QgYW5kIGNyZWF0ZSBhIHNtYWxsIGFtb3VudCBvZiBoaXN0b3J5OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgbWtkaXIgdGVzdC1wcm9qZWN0CiskIGNkIHRlc3QtcHJvamVjdAorJCBnaXQgaW5pdAorSW5pdGlhbGl6ZWQgZW1wdHkgR2l0IHJlcG9zaXRvcnkgaW4gLmdpdC8KKyQgZWNobyAnaGVsbG8gd29ybGQnID4gZmlsZS50eHQKKyQgZ2l0IGFkZCAuCiskIGdpdCBjb21taXQgLWEgLW0gImluaXRpYWwgY29tbWl0IgorQ3JlYXRlZCBpbml0aWFsIGNvbW1pdCA1NDE5NmNjMjcwM2RjMTY1Y2JkMzczYTY1YTRkY2YyMmQ1MGFlN2Y3CisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUudHh0CiskIGVjaG8gJ2hlbGxvIHdvcmxkIScgPmZpbGUudHh0CiskIGdpdCBjb21taXQgLWEgLW0gImFkZCBlbXBoYXNpcyIKK0NyZWF0ZWQgY29tbWl0IGM0ZDU5ZjM5MGI5Y2ZkNDMxODExN2FmZGUxMWQ2MDFjMTA4NWYyNDEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGF0IGFyZSB0aGUgNDAgZGlnaXRzIG9mIGhleCB0aGF0IGdpdCByZXNwb25kZWQgdG8gdGhlIGNvbW1pdCB3aXRoPworCitXZSBzYXcgaW4gcGFydCBvbmUgb2YgdGhlIHR1dG9yaWFsIHRoYXQgY29tbWl0cyBoYXZlIG5hbWVzIGxpa2UgdGhpcy4KK0l0IHR1cm5zIG91dCB0aGF0IGV2ZXJ5IG9iamVjdCBpbiB0aGUgZ2l0IGhpc3RvcnkgaXMgc3RvcmVkIHVuZGVyCitzdWNoIGEgNDAtZGlnaXQgaGV4IG5hbWUuICBUaGF0IG5hbWUgaXMgdGhlIFNIQTEgaGFzaCBvZiB0aGUgb2JqZWN0J3MKK2NvbnRlbnRzOyBhbW9uZyBvdGhlciB0aGluZ3MsIHRoaXMgZW5zdXJlcyB0aGF0IGdpdCB3aWxsIG5ldmVyIHN0b3JlCit0aGUgc2FtZSBkYXRhIHR3aWNlIChzaW5jZSBpZGVudGljYWwgZGF0YSBpcyBnaXZlbiBhbiBpZGVudGljYWwgU0hBMQorbmFtZSksIGFuZCB0aGF0IHRoZSBjb250ZW50cyBvZiBhIGdpdCBvYmplY3Qgd2lsbCBuZXZlciBjaGFuZ2UgKHNpbmNlCit0aGF0IHdvdWxkIGNoYW5nZSB0aGUgb2JqZWN0J3MgbmFtZSBhcyB3ZWxsKS4KKworSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgY29udGVudCBvZiB0aGUgY29tbWl0IG9iamVjdCB5b3UgY3JlYXRlZCB3aGlsZQorZm9sbG93aW5nIHRoZSBleGFtcGxlIGFib3ZlIGdlbmVyYXRlcyBhIGRpZmZlcmVudCBTSEExIGhhc2ggdGhhbgordGhlIG9uZSBzaG93biBhYm92ZSBiZWNhdXNlIHRoZSBjb21taXQgb2JqZWN0IHJlY29yZHMgdGhlIHRpbWUgd2hlbgoraXQgd2FzIGNyZWF0ZWQgYW5kIHRoZSBuYW1lIG9mIHRoZSBwZXJzb24gcGVyZm9ybWluZyB0aGUgY29tbWl0LgorCitXZSBjYW4gYXNrIGdpdCBhYm91dCB0aGlzIHBhcnRpY3VsYXIgb2JqZWN0IHdpdGggdGhlIGNhdC1maWxlCitjb21tYW5kLiBEb24ndCBjb3B5IHRoZSA0MCBoZXggZGlnaXRzIGZyb20gdGhpcyBleGFtcGxlIGJ1dCB1c2UgdGhvc2UKK2Zyb20geW91ciBvd24gdmVyc2lvbi4gTm90ZSB0aGF0IHlvdSBjYW4gc2hvcnRlbiBpdCB0byBvbmx5IGEgZmV3CitjaGFyYWN0ZXJzIHRvIHNhdmUgeW91cnNlbGYgdHlwaW5nIGFsbCA0MCBoZXggZGlnaXRzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWNhdC1maWxlIC10IDU0MTk2Y2MyCitjb21taXQKKyQgZ2l0LWNhdC1maWxlIGNvbW1pdCA1NDE5NmNjMgordHJlZSA5MmI4YjY5NGZmYjE2NzVlNTk3NTE0OGUxMTIxODEwMDgxZGJkZmZlCithdXRob3IgSi4gQnJ1Y2UgRmllbGRzIDxiZmllbGRzQHB1enpsZS5maWVsZHNlcy5vcmc+IDExNDM0MTQ2NjggLTA1MDAKK2NvbW1pdHRlciBKLiBCcnVjZSBGaWVsZHMgPGJmaWVsZHNAcHV6emxlLmZpZWxkc2VzLm9yZz4gMTE0MzQxNDY2OCAtMDUwMAorCitpbml0aWFsIGNvbW1pdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgdHJlZSBjYW4gcmVmZXIgdG8gb25lIG9yIG1vcmUgImJsb2IiIG9iamVjdHMsIGVhY2ggY29ycmVzcG9uZGluZyB0bworYSBmaWxlLiAgSW4gYWRkaXRpb24sIGEgdHJlZSBjYW4gYWxzbyByZWZlciB0byBvdGhlciB0cmVlIG9iamVjdHMsCit0aHVzIGNyZWF0aW5nIGEgZGlyZWN0b3J5IGhpZXJhcmNoeS4gIFlvdSBjYW4gZXhhbWluZSB0aGUgY29udGVudHMgb2YKK2FueSB0cmVlIHVzaW5nIGxzLXRyZWUgKHJlbWVtYmVyIHRoYXQgYSBsb25nIGVub3VnaCBpbml0aWFsIHBvcnRpb24KK29mIHRoZSBTSEExIHdpbGwgYWxzbyB3b3JrKToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBscy10cmVlIDkyYjhiNjk0CisxMDA2NDQgYmxvYiAzYjE4ZTUxMmRiYTc5ZTRjODMwMGRkMDhhZWIzN2Y4ZTcyOGI4ZGFkICAgIGZpbGUudHh0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGh1cyB3ZSBzZWUgdGhhdCB0aGlzIHRyZWUgaGFzIG9uZSBmaWxlIGluIGl0LiAgVGhlIFNIQTEgaGFzaCBpcyBhCityZWZlcmVuY2UgdG8gdGhhdCBmaWxlJ3MgZGF0YToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjYXQtZmlsZSAtdCAzYjE4ZTUxMgorYmxvYgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgImJsb2IiIGlzIGp1c3QgZmlsZSBkYXRhLCB3aGljaCB3ZSBjYW4gYWxzbyBleGFtaW5lIHdpdGggY2F0LWZpbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2F0LWZpbGUgYmxvYiAzYjE4ZTUxMgoraGVsbG8gd29ybGQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3RlIHRoYXQgdGhpcyBpcyB0aGUgb2xkIGZpbGUgZGF0YTsgc28gdGhlIG9iamVjdCB0aGF0IGdpdCBuYW1lZCBpbgoraXRzIHJlc3BvbnNlIHRvIHRoZSBpbml0aWFsIHRyZWUgd2FzIGEgdHJlZSB3aXRoIGEgc25hcHNob3Qgb2YgdGhlCitkaXJlY3Rvcnkgc3RhdGUgdGhhdCB3YXMgcmVjb3JkZWQgYnkgdGhlIGZpcnN0IGNvbW1pdC4KKworQWxsIG9mIHRoZXNlIG9iamVjdHMgYXJlIHN0b3JlZCB1bmRlciB0aGVpciBTSEExIG5hbWVzIGluc2lkZSB0aGUgZ2l0CitkaXJlY3Rvcnk6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBmaW5kIC5naXQvb2JqZWN0cy8KKy5naXQvb2JqZWN0cy8KKy5naXQvb2JqZWN0cy9wYWNrCisuZ2l0L29iamVjdHMvaW5mbworLmdpdC9vYmplY3RzLzNiCisuZ2l0L29iamVjdHMvM2IvMThlNTEyZGJhNzllNGM4MzAwZGQwOGFlYjM3ZjhlNzI4YjhkYWQKKy5naXQvb2JqZWN0cy85MgorLmdpdC9vYmplY3RzLzkyL2I4YjY5NGZmYjE2NzVlNTk3NTE0OGUxMTIxODEwMDgxZGJkZmZlCisuZ2l0L29iamVjdHMvNTQKKy5naXQvb2JqZWN0cy81NC8xOTZjYzI3MDNkYzE2NWNiZDM3M2E2NWE0ZGNmMjJkNTBhZTdmNworLmdpdC9vYmplY3RzL2EwCisuZ2l0L29iamVjdHMvYTAvNDIzODk2OTczNjQ0NzcxNDk3YmRjMDNlYjk5ZDUyODE2MTViNTEKKy5naXQvb2JqZWN0cy9kMAorLmdpdC9vYmplY3RzL2QwLzQ5MmIzNjhiNjZiZGFiZjJhYzFmZDhjOTJiMzlkM2RiOTE2ZTU5CisuZ2l0L29iamVjdHMvYzQKKy5naXQvb2JqZWN0cy9jNC9kNTlmMzkwYjljZmQ0MzE4MTE3YWZkZTExZDYwMWMxMDg1ZjI0MQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FuZCB0aGUgY29udGVudHMgb2YgdGhlc2UgZmlsZXMgaXMganVzdCB0aGUgY29tcHJlc3NlZCBkYXRhIHBsdXMgYQoraGVhZGVyIGlkZW50aWZ5aW5nIHRoZWlyIGxlbmd0aCBhbmQgdGhlaXIgdHlwZS4gIFRoZSB0eXBlIGlzIGVpdGhlciBhCitibG9iLCBhIHRyZWUsIGEgY29tbWl0LCBvciBhIHRhZy4KKworVGhlIHNpbXBsZXN0IGNvbW1pdCB0byBmaW5kIGlzIHRoZSBIRUFEIGNvbW1pdCwgd2hpY2ggd2UgY2FuIGZpbmQKK2Zyb20gLmdpdC9IRUFEOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgY2F0IC5naXQvSEVBRAorcmVmOiByZWZzL2hlYWRzL21hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FzIHlvdSBjYW4gc2VlLCB0aGlzIHRlbGxzIHVzIHdoaWNoIGJyYW5jaCB3ZSdyZSBjdXJyZW50bHkgb24sIGFuZCBpdAordGVsbHMgdXMgdGhpcyBieSBuYW1pbmcgYSBmaWxlIHVuZGVyIHRoZSAuZ2l0IGRpcmVjdG9yeSwgd2hpY2ggaXRzZWxmCitjb250YWlucyBhIFNIQTEgbmFtZSByZWZlcnJpbmcgdG8gYSBjb21taXQgb2JqZWN0LCB3aGljaCB3ZSBjYW4KK2V4YW1pbmUgd2l0aCBjYXQtZmlsZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGNhdCAuZ2l0L3JlZnMvaGVhZHMvbWFzdGVyCitjNGQ1OWYzOTBiOWNmZDQzMTgxMTdhZmRlMTFkNjAxYzEwODVmMjQxCiskIGdpdCBjYXQtZmlsZSAtdCBjNGQ1OWYzOQorY29tbWl0CiskIGdpdCBjYXQtZmlsZSBjb21taXQgYzRkNTlmMzkKK3RyZWUgZDA0OTJiMzY4YjY2YmRhYmYyYWMxZmQ4YzkyYjM5ZDNkYjkxNmU1OQorcGFyZW50IDU0MTk2Y2MyNzAzZGMxNjVjYmQzNzNhNjVhNGRjZjIyZDUwYWU3ZjcKK2F1dGhvciBKLiBCcnVjZSBGaWVsZHMgPGJmaWVsZHNAcHV6emxlLmZpZWxkc2VzLm9yZz4gMTE0MzQxODcwMiAtMDUwMAorY29tbWl0dGVyIEouIEJydWNlIEZpZWxkcyA8YmZpZWxkc0BwdXp6bGUuZmllbGRzZXMub3JnPiAxMTQzNDE4NzAyIC0wNTAwCisKK2FkZCBlbXBoYXNpcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSAidHJlZSIgb2JqZWN0IGhlcmUgcmVmZXJzIHRvIHRoZSBuZXcgc3RhdGUgb2YgdGhlIHRyZWU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbHMtdHJlZSBkMDQ5MmIzNgorMTAwNjQ0IGJsb2IgYTA0MjM4OTY5NzM2NDQ3NzE0OTdiZGMwM2ViOTlkNTI4MTYxNWI1MSAgICBmaWxlLnR4dAorJCBnaXQgY2F0LWZpbGUgYmxvYiBhMDQyMzg5NgoraGVsbG8gd29ybGQhCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIHRoZSAicGFyZW50IiBvYmplY3QgcmVmZXJzIHRvIHRoZSBwcmV2aW91cyBjb21taXQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtY2F0LWZpbGUgY29tbWl0IDU0MTk2Y2MyCit0cmVlIDkyYjhiNjk0ZmZiMTY3NWU1OTc1MTQ4ZTExMjE4MTAwODFkYmRmZmUKK2F1dGhvciBKLiBCcnVjZSBGaWVsZHMgPGJmaWVsZHNAcHV6emxlLmZpZWxkc2VzLm9yZz4gMTE0MzQxNDY2OCAtMDUwMAorY29tbWl0dGVyIEouIEJydWNlIEZpZWxkcyA8YmZpZWxkc0BwdXp6bGUuZmllbGRzZXMub3JnPiAxMTQzNDE0NjY4IC0wNTAwCisKK2luaXRpYWwgY29tbWl0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHRyZWUgb2JqZWN0IGlzIHRoZSB0cmVlIHdlIGV4YW1pbmVkIGZpcnN0LCBhbmQgdGhpcyBjb21taXQgaXMKK3VudXN1YWwgaW4gdGhhdCBpdCBsYWNrcyBhbnkgcGFyZW50LgorCitNb3N0IGNvbW1pdHMgaGF2ZSBvbmx5IG9uZSBwYXJlbnQsIGJ1dCBpdCBpcyBhbHNvIGNvbW1vbiBmb3IgYSBjb21taXQKK3RvIGhhdmUgbXVsdGlwbGUgcGFyZW50cy4gICBJbiB0aGF0IGNhc2UgdGhlIGNvbW1pdCByZXByZXNlbnRzIGEKK21lcmdlLCB3aXRoIHRoZSBwYXJlbnQgcmVmZXJlbmNlcyBwb2ludGluZyB0byB0aGUgaGVhZHMgb2YgdGhlIG1lcmdlZAorYnJhbmNoZXMuCisKK0Jlc2lkZXMgYmxvYnMsIHRyZWVzLCBhbmQgY29tbWl0cywgdGhlIG9ubHkgcmVtYWluaW5nIHR5cGUgb2Ygb2JqZWN0CitpcyBhICJ0YWciLCB3aGljaCB3ZSB3b24ndCBkaXNjdXNzIGhlcmU7IHJlZmVyIHRvIGxpbmtnaXQ6Z2l0LXRhZ1sxXQorZm9yIGRldGFpbHMuCisKK1NvIG5vdyB3ZSBrbm93IGhvdyBnaXQgdXNlcyB0aGUgb2JqZWN0IGRhdGFiYXNlIHRvIHJlcHJlc2VudCBhCitwcm9qZWN0J3MgaGlzdG9yeToKKworICAqICJjb21taXQiIG9iamVjdHMgcmVmZXIgdG8gInRyZWUiIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZQorICAgIHNuYXBzaG90IG9mIGEgZGlyZWN0b3J5IHRyZWUgYXQgYSBwYXJ0aWN1bGFyIHBvaW50IGluIHRoZQorICAgIGhpc3RvcnksIGFuZCByZWZlciB0byAicGFyZW50IiBjb21taXRzIHRvIHNob3cgaG93IHRoZXkncmUKKyAgICBjb25uZWN0ZWQgaW50byB0aGUgcHJvamVjdCBoaXN0b3J5LgorICAqICJ0cmVlIiBvYmplY3RzIHJlcHJlc2VudCB0aGUgc3RhdGUgb2YgYSBzaW5nbGUgZGlyZWN0b3J5LAorICAgIGFzc29jaWF0aW5nIGRpcmVjdG9yeSBuYW1lcyB0byAiYmxvYiIgb2JqZWN0cyBjb250YWluaW5nIGZpbGUKKyAgICBkYXRhIGFuZCAidHJlZSIgb2JqZWN0cyBjb250YWluaW5nIHN1YmRpcmVjdG9yeSBpbmZvcm1hdGlvbi4KKyAgKiAiYmxvYiIgb2JqZWN0cyBjb250YWluIGZpbGUgZGF0YSB3aXRob3V0IGFueSBvdGhlciBzdHJ1Y3R1cmUuCisgICogUmVmZXJlbmNlcyB0byBjb21taXQgb2JqZWN0cyBhdCB0aGUgaGVhZCBvZiBlYWNoIGJyYW5jaCBhcmUKKyAgICBzdG9yZWQgaW4gZmlsZXMgdW5kZXIgLmdpdC9yZWZzL2hlYWRzLy4KKyAgKiBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBicmFuY2ggaXMgc3RvcmVkIGluIC5naXQvSEVBRC4KKworTm90ZSwgYnkgdGhlIHdheSwgdGhhdCBsb3RzIG9mIGNvbW1hbmRzIHRha2UgYSB0cmVlIGFzIGFuIGFyZ3VtZW50LgorQnV0IGFzIHdlIGNhbiBzZWUgYWJvdmUsIGEgdHJlZSBjYW4gYmUgcmVmZXJyZWQgdG8gaW4gbWFueSBkaWZmZXJlbnQKK3dheXMtLWJ5IHRoZSBTSEExIG5hbWUgZm9yIHRoYXQgdHJlZSwgYnkgdGhlIG5hbWUgb2YgYSBjb21taXQgdGhhdAorcmVmZXJzIHRvIHRoZSB0cmVlLCBieSB0aGUgbmFtZSBvZiBhIGJyYW5jaCB3aG9zZSBoZWFkIHJlZmVycyB0byB0aGF0Cit0cmVlLCBldGMuLS1hbmQgbW9zdCBzdWNoIGNvbW1hbmRzIGNhbiBhY2NlcHQgYW55IG9mIHRoZXNlIG5hbWVzLgorCitJbiBjb21tYW5kIHN5bm9wc2VzLCB0aGUgd29yZCAidHJlZS1pc2giIGlzIHNvbWV0aW1lcyB1c2VkIHRvCitkZXNpZ25hdGUgc3VjaCBhbiBhcmd1bWVudC4KKworVGhlIGluZGV4IGZpbGUKKy0tLS0tLS0tLS0tLS0tCisKK1RoZSBwcmltYXJ5IHRvb2wgd2UndmUgYmVlbiB1c2luZyB0byBjcmVhdGUgY29tbWl0cyBpcyAiZ2l0IGNvbW1pdAorLWEiLCB3aGljaCBjcmVhdGVzIGEgY29tbWl0IGluY2x1ZGluZyBldmVyeSBjaGFuZ2UgeW91J3ZlIG1hZGUgdG8KK3lvdXIgd29ya2luZyB0cmVlLiAgQnV0IHdoYXQgaWYgeW91IHdhbnQgdG8gY29tbWl0IGNoYW5nZXMgb25seSB0bworY2VydGFpbiBmaWxlcz8gIE9yIG9ubHkgY2VydGFpbiBjaGFuZ2VzIHRvIGNlcnRhaW4gZmlsZXM/CisKK0lmIHdlIGxvb2sgYXQgdGhlIHdheSBjb21taXRzIGFyZSBjcmVhdGVkIHVuZGVyIHRoZSBjb3Zlciwgd2UnbGwgc2VlCit0aGF0IHRoZXJlIGFyZSBtb3JlIGZsZXhpYmxlIHdheXMgY3JlYXRpbmcgY29tbWl0cy4KKworQ29udGludWluZyB3aXRoIG91ciB0ZXN0LXByb2plY3QsIGxldCdzIG1vZGlmeSBmaWxlLnR4dCBhZ2FpbjoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGVjaG8gImhlbGxvIHdvcmxkLCBhZ2FpbiIgPj5maWxlLnR4dAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2J1dCB0aGlzIHRpbWUgaW5zdGVhZCBvZiBpbW1lZGlhdGVseSBtYWtpbmcgdGhlIGNvbW1pdCwgbGV0J3MgdGFrZSBhbgoraW50ZXJtZWRpYXRlIHN0ZXAsIGFuZCBhc2sgZm9yIGRpZmZzIGFsb25nIHRoZSB3YXkgdG8ga2VlcCB0cmFjayBvZgord2hhdCdzIGhhcHBlbmluZzoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmCistLS0gYS9maWxlLnR4dAorKysrIGIvZmlsZS50eHQKK0BAIC0xICsxLDIgQEAKKyBoZWxsbyB3b3JsZCEKKytoZWxsbyB3b3JsZCwgYWdhaW4KKyQgZ2l0IGFkZCBmaWxlLnR4dAorJCBnaXQgZGlmZgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBsYXN0IGRpZmYgaXMgZW1wdHksIGJ1dCBubyBuZXcgY29tbWl0cyBoYXZlIGJlZW4gbWFkZSwgYW5kIHRoZQoraGVhZCBzdGlsbCBkb2Vzbid0IGNvbnRhaW4gdGhlIG5ldyBsaW5lOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWRpZmYgSEVBRAorZGlmZiAtLWdpdCBhL2ZpbGUudHh0IGIvZmlsZS50eHQKK2luZGV4IGEwNDIzODkuLjUxM2ZlYmEgMTAwNjQ0CistLS0gYS9maWxlLnR4dAorKysrIGIvZmlsZS50eHQKK0BAIC0xICsxLDIgQEAKKyBoZWxsbyB3b3JsZCEKKytoZWxsbyB3b3JsZCwgYWdhaW4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTbyAiZ2l0IGRpZmYiIGlzIGNvbXBhcmluZyBhZ2FpbnN0IHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBoZWFkLgorVGhlIHRoaW5nIHRoYXQgaXQncyBjb21wYXJpbmcgYWdhaW5zdCBpcyBhY3R1YWxseSB0aGUgaW5kZXggZmlsZSwKK3doaWNoIGlzIHN0b3JlZCBpbiAuZ2l0L2luZGV4IGluIGEgYmluYXJ5IGZvcm1hdCwgYnV0IHdob3NlIGNvbnRlbnRzCit3ZSBjYW4gZXhhbWluZSB3aXRoIGxzLWZpbGVzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxzLWZpbGVzIC0tc3RhZ2UKKzEwMDY0NCA1MTNmZWJhMmU1M2ViYmQyNTMyNDE5ZGVkODQ4YmExOWRlODhiYTAwIDAgICAgICAgZmlsZS50eHQKKyQgZ2l0IGNhdC1maWxlIC10IDUxM2ZlYmEyCitibG9iCiskIGdpdCBjYXQtZmlsZSBibG9iIDUxM2ZlYmEyCitoZWxsbyB3b3JsZCEKK2hlbGxvIHdvcmxkLCBhZ2FpbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NvIHdoYXQgb3VyICJnaXQgYWRkIiBkaWQgd2FzIHN0b3JlIGEgbmV3IGJsb2IgYW5kIHRoZW4gcHV0CithIHJlZmVyZW5jZSB0byBpdCBpbiB0aGUgaW5kZXggZmlsZS4gIElmIHdlIG1vZGlmeSB0aGUgZmlsZSBhZ2FpbiwKK3dlJ2xsIHNlZSB0aGF0IHRoZSBuZXcgbW9kaWZpY2F0aW9ucyBhcmUgcmVmbGVjdGVkIGluIHRoZSAiZ2l0LWRpZmYiCitvdXRwdXQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBlY2hvICdhZ2Fpbj8nID4+ZmlsZS50eHQKKyQgZ2l0IGRpZmYKK2luZGV4IDUxM2ZlYmEuLmJhM2RhN2IgMTAwNjQ0CistLS0gYS9maWxlLnR4dAorKysrIGIvZmlsZS50eHQKK0BAIC0xLDIgKzEsMyBAQAorIGhlbGxvIHdvcmxkIQorIGhlbGxvIHdvcmxkLCBhZ2FpbgorK2FnYWluPworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dpdGggdGhlIHJpZ2h0IGFyZ3VtZW50cywgZ2l0IGRpZmYgY2FuIGFsc28gc2hvdyB1cyB0aGUgZGlmZmVyZW5jZQorYmV0d2VlbiB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIHRoZSBsYXN0IGNvbW1pdCwgb3IgYmV0d2VlbiB0aGUKK2luZGV4IGFuZCB0aGUgbGFzdCBjb21taXQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZiBIRUFECitkaWZmIC0tZ2l0IGEvZmlsZS50eHQgYi9maWxlLnR4dAoraW5kZXggYTA0MjM4OS4uYmEzZGE3YiAxMDA2NDQKKy0tLSBhL2ZpbGUudHh0CisrKysgYi9maWxlLnR4dAorQEAgLTEgKzEsMyBAQAorIGhlbGxvIHdvcmxkIQorK2hlbGxvIHdvcmxkLCBhZ2FpbgorK2FnYWluPworJCBnaXQgZGlmZiAtLWNhY2hlZAorZGlmZiAtLWdpdCBhL2ZpbGUudHh0IGIvZmlsZS50eHQKK2luZGV4IGEwNDIzODkuLjUxM2ZlYmEgMTAwNjQ0CistLS0gYS9maWxlLnR4dAorKysrIGIvZmlsZS50eHQKK0BAIC0xICsxLDIgQEAKKyBoZWxsbyB3b3JsZCEKKytoZWxsbyB3b3JsZCwgYWdhaW4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBdCBhbnkgdGltZSwgd2UgY2FuIGNyZWF0ZSBhIG5ldyBjb21taXQgdXNpbmcgImdpdCBjb21taXQiICh3aXRob3V0Cit0aGUgLWEgb3B0aW9uKSwgYW5kIHZlcmlmeSB0aGF0IHRoZSBzdGF0ZSBjb21taXR0ZWQgb25seSBpbmNsdWRlcyB0aGUKK2NoYW5nZXMgc3RvcmVkIGluIHRoZSBpbmRleCBmaWxlLCBub3QgdGhlIGFkZGl0aW9uYWwgY2hhbmdlIHRoYXQgaXMKK3N0aWxsIG9ubHkgaW4gb3VyIHdvcmtpbmcgdHJlZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjb21taXQgLW0gInJlcGVhdCIKKyQgZ2l0IGRpZmYgSEVBRAorZGlmZiAtLWdpdCBhL2ZpbGUudHh0IGIvZmlsZS50eHQKK2luZGV4IDUxM2ZlYmEuLmJhM2RhN2IgMTAwNjQ0CistLS0gYS9maWxlLnR4dAorKysrIGIvZmlsZS50eHQKK0BAIC0xLDIgKzEsMyBAQAorIGhlbGxvIHdvcmxkIQorIGhlbGxvIHdvcmxkLCBhZ2FpbgorK2FnYWluPworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NvIGJ5IGRlZmF1bHQgImdpdCBjb21taXQiIHVzZXMgdGhlIGluZGV4IHRvIGNyZWF0ZSB0aGUgY29tbWl0LCBub3QKK3RoZSB3b3JraW5nIHRyZWU7IHRoZSAtYSBvcHRpb24gdG8gY29tbWl0IHRlbGxzIGl0IHRvIGZpcnN0IHVwZGF0ZQordGhlIGluZGV4IHdpdGggYWxsIGNoYW5nZXMgaW4gdGhlIHdvcmtpbmcgdHJlZS4KKworRmluYWxseSwgaXQncyB3b3J0aCBsb29raW5nIGF0IHRoZSBlZmZlY3Qgb2YgImdpdCBhZGQiIG9uIHRoZSBpbmRleAorZmlsZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGVjaG8gImdvb2RieWUsIHdvcmxkIiA+Y2xvc2luZy50eHQKKyQgZ2l0IGFkZCBjbG9zaW5nLnR4dAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBlZmZlY3Qgb2YgdGhlICJnaXQgYWRkIiB3YXMgdG8gYWRkIG9uZSBlbnRyeSB0byB0aGUgaW5kZXggZmlsZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBscy1maWxlcyAtLXN0YWdlCisxMDA2NDQgOGI5NzQzYjIwZDRiMTViZTM5NTVmYzhkNWNkMmIwOWNkMjMzNjEzOCAwICAgICAgIGNsb3NpbmcudHh0CisxMDA2NDQgNTEzZmViYTJlNTNlYmJkMjUzMjQxOWRlZDg0OGJhMTlkZTg4YmEwMCAwICAgICAgIGZpbGUudHh0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQW5kLCBhcyB5b3UgY2FuIHNlZSB3aXRoIGNhdC1maWxlLCB0aGlzIG5ldyBlbnRyeSByZWZlcnMgdG8gdGhlCitjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBmaWxlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNhdC1maWxlIGJsb2IgOGI5NzQzYjIKK2dvb2RieWUsIHdvcmxkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlICJzdGF0dXMiIGNvbW1hbmQgaXMgYSB1c2VmdWwgd2F5IHRvIGdldCBhIHF1aWNrIHN1bW1hcnkgb2YgdGhlCitzaXR1YXRpb246CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc3RhdHVzCisjIE9uIGJyYW5jaCBtYXN0ZXIKKyMgQ2hhbmdlcyB0byBiZSBjb21taXR0ZWQ6CisjICAgKHVzZSAiZ2l0IHJlc2V0IEhFQUQgPGZpbGU+Li4uIiB0byB1bnN0YWdlKQorIworIyAgICAgICBuZXcgZmlsZTogY2xvc2luZy50eHQKKyMKKyMgQ2hhbmdlZCBidXQgbm90IHVwZGF0ZWQ6CisjICAgKHVzZSAiZ2l0IGFkZCA8ZmlsZT4uLi4iIHRvIHVwZGF0ZSB3aGF0IHdpbGwgYmUgY29tbWl0dGVkKQorIworIyAgICAgICBtb2RpZmllZDogZmlsZS50eHQKKyMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTaW5jZSB0aGUgY3VycmVudCBzdGF0ZSBvZiBjbG9zaW5nLnR4dCBpcyBjYWNoZWQgaW4gdGhlIGluZGV4IGZpbGUsCitpdCBpcyBsaXN0ZWQgYXMgIkNoYW5nZXMgdG8gYmUgY29tbWl0dGVkIi4gIFNpbmNlIGZpbGUudHh0IGhhcworY2hhbmdlcyBpbiB0aGUgd29ya2luZyBkaXJlY3RvcnkgdGhhdCBhcmVuJ3QgcmVmbGVjdGVkIGluIHRoZSBpbmRleCwKK2l0IGlzIG1hcmtlZCAiY2hhbmdlZCBidXQgbm90IHVwZGF0ZWQiLiAgQXQgdGhpcyBwb2ludCwgcnVubmluZyAiZ2l0Citjb21taXQiIHdvdWxkIGNyZWF0ZSBhIGNvbW1pdCB0aGF0IGFkZGVkIGNsb3NpbmcudHh0ICh3aXRoIGl0cyBuZXcKK2NvbnRlbnRzKSwgYnV0IHRoYXQgZGlkbid0IG1vZGlmeSBmaWxlLnR4dC4KKworQWxzbywgbm90ZSB0aGF0IGEgYmFyZSAiZ2l0IGRpZmYiIHNob3dzIHRoZSBjaGFuZ2VzIHRvIGZpbGUudHh0LCBidXQKK25vdCB0aGUgYWRkaXRpb24gb2YgY2xvc2luZy50eHQsIGJlY2F1c2UgdGhlIHZlcnNpb24gb2YgY2xvc2luZy50eHQKK2luIHRoZSBpbmRleCBmaWxlIGlzIGlkZW50aWNhbCB0byB0aGUgb25lIGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4KKworSW4gYWRkaXRpb24gdG8gYmVpbmcgdGhlIHN0YWdpbmcgYXJlYSBmb3IgbmV3IGNvbW1pdHMsIHRoZSBpbmRleCBmaWxlCitpcyBhbHNvIHBvcHVsYXRlZCBmcm9tIHRoZSBvYmplY3QgZGF0YWJhc2Ugd2hlbiBjaGVja2luZyBvdXQgYQorYnJhbmNoLCBhbmQgaXMgdXNlZCB0byBob2xkIHRoZSB0cmVlcyBpbnZvbHZlZCBpbiBhIG1lcmdlIG9wZXJhdGlvbi4KK1NlZSB0aGUgbGluazpjb3JlLXR1dG9yaWFsLmh0bWxbY29yZSB0dXRvcmlhbF0gYW5kIHRoZSByZWxldmFudCBtYW4KK3BhZ2VzIGZvciBkZXRhaWxzLgorCitXaGF0IG5leHQ/CistLS0tLS0tLS0tCisKK0F0IHRoaXMgcG9pbnQgeW91IHNob3VsZCBrbm93IGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIHJlYWQgdGhlIG1hbgorcGFnZXMgZm9yIGFueSBvZiB0aGUgZ2l0IGNvbW1hbmRzOyBvbmUgZ29vZCBwbGFjZSB0byBzdGFydCB3b3VsZCBiZQord2l0aCB0aGUgY29tbWFuZHMgbWVudGlvbmVkIGluIGxpbms6ZXZlcnlkYXkuaHRtbFtFdmVyeWRheSBnaXRdLiAgWW91CitzaG91bGQgYmUgYWJsZSB0byBmaW5kIGFueSB1bmtub3duIGphcmdvbiBpbiB0aGUKK2xpbms6Z2xvc3NhcnkuaHRtbFtHbG9zc2FyeV0uCisKK1RoZSBsaW5rOnVzZXItbWFudWFsLmh0bWxbR2l0IFVzZXIncyBNYW51YWxdIHByb3ZpZGVzIGEgbW9yZQorY29tcHJlaGVuc2l2ZSBpbnRyb2R1Y3Rpb24gdG8gZ2l0LgorCitUaGUgbGluazpjdnMtbWlncmF0aW9uLmh0bWxbQ1ZTIG1pZ3JhdGlvbl0gZG9jdW1lbnQgZXhwbGFpbnMgaG93IHRvCitpbXBvcnQgYSBDVlMgcmVwb3NpdG9yeSBpbnRvIGdpdCwgYW5kIHNob3dzIGhvdyB0byB1c2UgZ2l0IGluIGEKK0NWUy1saWtlIHdheS4KKworRm9yIHNvbWUgaW50ZXJlc3RpbmcgZXhhbXBsZXMgb2YgZ2l0IHVzZSwgc2VlIHRoZQorbGluazpob3d0by1pbmRleC5odG1sW2hvd3Rvc10uCisKK0ZvciBnaXQgZGV2ZWxvcGVycywgdGhlIGxpbms6Y29yZS10dXRvcmlhbC5odG1sW0NvcmUgdHV0b3JpYWxdIGdvZXMKK2ludG8gZGV0YWlsIG9uIHRoZSBsb3dlci1sZXZlbCBnaXQgbWVjaGFuaXNtcyBpbnZvbHZlZCBpbiwgZm9yCitleGFtcGxlLCBjcmVhdGluZyBhIG5ldyBjb21taXQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3R1dG9yaWFsLnR4dCBiL0RvY3VtZW50YXRpb24vdHV0b3JpYWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYmJkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3R1dG9yaWFsLnR4dApAQCAtMCwwICsxLDU4NCBAQAorQSB0dXRvcmlhbCBpbnRyb2R1Y3Rpb24gdG8gZ2l0IChmb3IgdmVyc2lvbiAxLjUuMSBvciBuZXdlcikKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgdHV0b3JpYWwgZXhwbGFpbnMgaG93IHRvIGltcG9ydCBhIG5ldyBwcm9qZWN0IGludG8gZ2l0LCBtYWtlCitjaGFuZ2VzIHRvIGl0LCBhbmQgc2hhcmUgY2hhbmdlcyB3aXRoIG90aGVyIGRldmVsb3BlcnMuCisKK0lmIHlvdSBhcmUgaW5zdGVhZCBwcmltYXJpbHkgaW50ZXJlc3RlZCBpbiB1c2luZyBnaXQgdG8gZmV0Y2ggYSBwcm9qZWN0LAorZm9yIGV4YW1wbGUsIHRvIHRlc3QgdGhlIGxhdGVzdCB2ZXJzaW9uLCB5b3UgbWF5IHByZWZlciB0byBzdGFydCB3aXRoCit0aGUgZmlyc3QgdHdvIGNoYXB0ZXJzIG9mIGxpbms6dXNlci1tYW51YWwuaHRtbFtUaGUgR2l0IFVzZXIncyBNYW51YWxdLgorCitGaXJzdCwgbm90ZSB0aGF0IHlvdSBjYW4gZ2V0IGRvY3VtZW50YXRpb24gZm9yIGEgY29tbWFuZCBzdWNoIGFzICJnaXQKK2RpZmYiIHdpdGg6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBtYW4gZ2l0LWRpZmYKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJdCBpcyBhIGdvb2QgaWRlYSB0byBpbnRyb2R1Y2UgeW91cnNlbGYgdG8gZ2l0IHdpdGggeW91ciBuYW1lIGFuZAorcHVibGljIGVtYWlsIGFkZHJlc3MgYmVmb3JlIGRvaW5nIGFueSBvcGVyYXRpb24uICBUaGUgZWFzaWVzdAord2F5IHRvIGRvIHNvIGlzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLm5hbWUgIllvdXIgTmFtZSBDb21lcyBIZXJlIgorJCBnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgeW91QHlvdXJkb21haW4uZXhhbXBsZS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK0ltcG9ydGluZyBhIG5ldyBwcm9qZWN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBc3N1bWUgeW91IGhhdmUgYSB0YXJiYWxsIHByb2plY3QudGFyLmd6IHdpdGggeW91ciBpbml0aWFsIHdvcmsuICBZb3UKK2NhbiBwbGFjZSBpdCB1bmRlciBnaXQgcmV2aXNpb24gY29udHJvbCBhcyBmb2xsb3dzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgdGFyIHh6ZiBwcm9qZWN0LnRhci5negorJCBjZCBwcm9qZWN0CiskIGdpdCBpbml0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworR2l0IHdpbGwgcmVwbHkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJbml0aWFsaXplZCBlbXB0eSBHaXQgcmVwb3NpdG9yeSBpbiAuZ2l0LworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1lvdSd2ZSBub3cgaW5pdGlhbGl6ZWQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LS15b3UgbWF5IG5vdGljZSBhIG5ldworZGlyZWN0b3J5IGNyZWF0ZWQsIG5hbWVkICIuZ2l0Ii4KKworTmV4dCwgdGVsbCBnaXQgdG8gdGFrZSBhIHNuYXBzaG90IG9mIHRoZSBjb250ZW50cyBvZiBhbGwgZmlsZXMgdW5kZXIgdGhlCitjdXJyZW50IGRpcmVjdG9yeSAobm90ZSB0aGUgJy4nKSwgd2l0aCBsaW5rZ2l0OmdpdC1hZGRbMV06CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYWRkIC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHNuYXBzaG90IGlzIG5vdyBzdG9yZWQgaW4gYSB0ZW1wb3Jhcnkgc3RhZ2luZyBhcmVhIHdoaWNoIGdpdCBjYWxscwordGhlICJpbmRleCIuICBZb3UgY2FuIHBlcm1hbmVudGx5IHN0b3JlIHRoZSBjb250ZW50cyBvZiB0aGUgaW5kZXggaW4gdGhlCityZXBvc2l0b3J5IHdpdGggbGlua2dpdDpnaXQtY29tbWl0WzFdOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbW1pdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgd2lsbCBwcm9tcHQgeW91IGZvciBhIGNvbW1pdCBtZXNzYWdlLiAgWW91J3ZlIG5vdyBzdG9yZWQgdGhlIGZpcnN0Cit2ZXJzaW9uIG9mIHlvdXIgcHJvamVjdCBpbiBnaXQuCisKK01ha2luZyBjaGFuZ2VzCistLS0tLS0tLS0tLS0tLQorCitNb2RpZnkgc29tZSBmaWxlcywgdGhlbiBhZGQgdGhlaXIgdXBkYXRlZCBjb250ZW50cyB0byB0aGUgaW5kZXg6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYWRkIGZpbGUxIGZpbGUyIGZpbGUzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWW91IGFyZSBub3cgcmVhZHkgdG8gY29tbWl0LiAgWW91IGNhbiBzZWUgd2hhdCBpcyBhYm91dCB0byBiZSBjb21taXR0ZWQKK3VzaW5nIGxpbmtnaXQ6Z2l0LWRpZmZbMV0gd2l0aCB0aGUgLS1jYWNoZWQgb3B0aW9uOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgLS1jYWNoZWQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoV2l0aG91dCAtLWNhY2hlZCwgbGlua2dpdDpnaXQtZGlmZlsxXSB3aWxsIHNob3cgeW91IGFueSBjaGFuZ2VzIHRoYXQKK3lvdSd2ZSBtYWRlIGJ1dCBub3QgeWV0IGFkZGVkIHRvIHRoZSBpbmRleC4pICBZb3UgY2FuIGFsc28gZ2V0IGEgYnJpZWYKK3N1bW1hcnkgb2YgdGhlIHNpdHVhdGlvbiB3aXRoIGxpbmtnaXQ6Z2l0LXN0YXR1c1sxXToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzdGF0dXMKKyMgT24gYnJhbmNoIG1hc3RlcgorIyBDaGFuZ2VzIHRvIGJlIGNvbW1pdHRlZDoKKyMgICAodXNlICJnaXQgcmVzZXQgSEVBRCA8ZmlsZT4uLi4iIHRvIHVuc3RhZ2UpCisjCisjCW1vZGlmaWVkOiAgIGZpbGUxCisjCW1vZGlmaWVkOiAgIGZpbGUyCisjCW1vZGlmaWVkOiAgIGZpbGUzCisjCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgeW91IG5lZWQgdG8gbWFrZSBhbnkgZnVydGhlciBhZGp1c3RtZW50cywgZG8gc28gbm93LCBhbmQgdGhlbiBhZGQgYW55CituZXdseSBtb2RpZmllZCBjb250ZW50IHRvIHRoZSBpbmRleC4gIEZpbmFsbHksIGNvbW1pdCB5b3VyIGNoYW5nZXMgd2l0aDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjb21taXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHdpbGwgYWdhaW4gcHJvbXB0IHlvdXIgZm9yIGEgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBjaGFuZ2UsIGFuZCB0aGVuCityZWNvcmQgYSBuZXcgdmVyc2lvbiBvZiB0aGUgcHJvamVjdC4KKworQWx0ZXJuYXRpdmVseSwgaW5zdGVhZCBvZiBydW5uaW5nIGBnaXQgYWRkYCBiZWZvcmVoYW5kLCB5b3UgY2FuIHVzZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbW1pdCAtYQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIHdpbGwgYXV0b21hdGljYWxseSBub3RpY2UgYW55IG1vZGlmaWVkIChidXQgbm90IG5ldykgZmlsZXMsIGFkZAordGhlbSB0byB0aGUgaW5kZXgsIGFuZCBjb21taXQsIGFsbCBpbiBvbmUgc3RlcC4KKworQSBub3RlIG9uIGNvbW1pdCBtZXNzYWdlczogVGhvdWdoIG5vdCByZXF1aXJlZCwgaXQncyBhIGdvb2QgaWRlYSB0bworYmVnaW4gdGhlIGNvbW1pdCBtZXNzYWdlIHdpdGggYSBzaW5nbGUgc2hvcnQgKGxlc3MgdGhhbiA1MCBjaGFyYWN0ZXIpCitsaW5lIHN1bW1hcml6aW5nIHRoZSBjaGFuZ2UsIGZvbGxvd2VkIGJ5IGEgYmxhbmsgbGluZSBhbmQgdGhlbiBhIG1vcmUKK3Rob3JvdWdoIGRlc2NyaXB0aW9uLiAgVG9vbHMgdGhhdCB0dXJuIGNvbW1pdHMgaW50byBlbWFpbCwgZm9yCitleGFtcGxlLCB1c2UgdGhlIGZpcnN0IGxpbmUgb24gdGhlIFN1YmplY3Q6IGxpbmUgYW5kIHRoZSByZXN0IG9mIHRoZQorY29tbWl0IGluIHRoZSBib2R5LgorCitHaXQgdHJhY2tzIGNvbnRlbnQgbm90IGZpbGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01hbnkgcmV2aXNpb24gY29udHJvbCBzeXN0ZW1zIHByb3ZpZGUgYW4gImFkZCIgY29tbWFuZCB0aGF0IHRlbGxzIHRoZQorc3lzdGVtIHRvIHN0YXJ0IHRyYWNraW5nIGNoYW5nZXMgdG8gYSBuZXcgZmlsZS4gIEdpdCdzICJhZGQiIGNvbW1hbmQKK2RvZXMgc29tZXRoaW5nIHNpbXBsZXIgYW5kIG1vcmUgcG93ZXJmdWw6IGBnaXQgYWRkYCBpcyB1c2VkIGJvdGggZm9yIG5ldworYW5kIG5ld2x5IG1vZGlmaWVkIGZpbGVzLCBhbmQgaW4gYm90aCBjYXNlcyBpdCB0YWtlcyBhIHNuYXBzaG90IG9mIHRoZQorZ2l2ZW4gZmlsZXMgYW5kIHN0YWdlcyB0aGF0IGNvbnRlbnQgaW4gdGhlIGluZGV4LCByZWFkeSBmb3IgaW5jbHVzaW9uIGluCit0aGUgbmV4dCBjb21taXQuCisKK1ZpZXdpbmcgcHJvamVjdCBoaXN0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBdCBhbnkgcG9pbnQgeW91IGNhbiB2aWV3IHRoZSBoaXN0b3J5IG9mIHlvdXIgY2hhbmdlcyB1c2luZworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHlvdSBhbHNvIHdhbnQgdG8gc2VlIGNvbXBsZXRlIGRpZmZzIGF0IGVhY2ggc3RlcCwgdXNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbG9nIC1wCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT2Z0ZW4gdGhlIG92ZXJ2aWV3IG9mIHRoZSBjaGFuZ2UgaXMgdXNlZnVsIHRvIGdldCBhIGZlZWwgb2YKK2VhY2ggc3RlcAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZyAtLXN0YXQgLS1zdW1tYXJ5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTWFuYWdpbmcgYnJhbmNoZXMKKy0tLS0tLS0tLS0tLS0tLS0tCisKK0Egc2luZ2xlIGdpdCByZXBvc2l0b3J5IGNhbiBtYWludGFpbiBtdWx0aXBsZSBicmFuY2hlcyBvZgorZGV2ZWxvcG1lbnQuICBUbyBjcmVhdGUgYSBuZXcgYnJhbmNoIG5hbWVkICJleHBlcmltZW50YWwiLCB1c2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBicmFuY2ggZXhwZXJpbWVudGFsCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgeW91IG5vdyBydW4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBicmFuY2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit5b3UnbGwgZ2V0IGEgbGlzdCBvZiBhbGwgZXhpc3RpbmcgYnJhbmNoZXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBleHBlcmltZW50YWwKKyogbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlICJleHBlcmltZW50YWwiIGJyYW5jaCBpcyB0aGUgb25lIHlvdSBqdXN0IGNyZWF0ZWQsIGFuZCB0aGUKKyJtYXN0ZXIiIGJyYW5jaCBpcyBhIGRlZmF1bHQgYnJhbmNoIHRoYXQgd2FzIGNyZWF0ZWQgZm9yIHlvdQorYXV0b21hdGljYWxseS4gIFRoZSBhc3RlcmlzayBtYXJrcyB0aGUgYnJhbmNoIHlvdSBhcmUgY3VycmVudGx5IG9uOwordHlwZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IGV4cGVyaW1lbnRhbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RvIHN3aXRjaCB0byB0aGUgZXhwZXJpbWVudGFsIGJyYW5jaC4gIE5vdyBlZGl0IGEgZmlsZSwgY29tbWl0IHRoZQorY2hhbmdlLCBhbmQgc3dpdGNoIGJhY2sgdG8gdGhlIG1hc3RlciBicmFuY2g6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKGVkaXQgZmlsZSkKKyQgZ2l0IGNvbW1pdCAtYQorJCBnaXQgY2hlY2tvdXQgbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ2hlY2sgdGhhdCB0aGUgY2hhbmdlIHlvdSBtYWRlIGlzIG5vIGxvbmdlciB2aXNpYmxlLCBzaW5jZSBpdCB3YXMKK21hZGUgb24gdGhlIGV4cGVyaW1lbnRhbCBicmFuY2ggYW5kIHlvdSdyZSBiYWNrIG9uIHRoZSBtYXN0ZXIgYnJhbmNoLgorCitZb3UgY2FuIG1ha2UgYSBkaWZmZXJlbnQgY2hhbmdlIG9uIHRoZSBtYXN0ZXIgYnJhbmNoOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyhlZGl0IGZpbGUpCiskIGdpdCBjb21taXQgLWEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithdCB0aGlzIHBvaW50IHRoZSB0d28gYnJhbmNoZXMgaGF2ZSBkaXZlcmdlZCwgd2l0aCBkaWZmZXJlbnQgY2hhbmdlcworbWFkZSBpbiBlYWNoLiAgVG8gbWVyZ2UgdGhlIGNoYW5nZXMgbWFkZSBpbiBleHBlcmltZW50YWwgaW50byBtYXN0ZXIsIHJ1bgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IG1lcmdlIGV4cGVyaW1lbnRhbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHRoZSBjaGFuZ2VzIGRvbid0IGNvbmZsaWN0LCB5b3UncmUgZG9uZS4gIElmIHRoZXJlIGFyZSBjb25mbGljdHMsCittYXJrZXJzIHdpbGwgYmUgbGVmdCBpbiB0aGUgcHJvYmxlbWF0aWMgZmlsZXMgc2hvd2luZyB0aGUgY29uZmxpY3Q7CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgc2hvdyB0aGlzLiAgT25jZSB5b3UndmUgZWRpdGVkIHRoZSBmaWxlcyB0byByZXNvbHZlIHRoZQorY29uZmxpY3RzLAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbW1pdCAtYQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgY29tbWl0IHRoZSByZXN1bHQgb2YgdGhlIG1lcmdlLiBGaW5hbGx5LAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0aworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgc2hvdyBhIG5pY2UgZ3JhcGhpY2FsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXN1bHRpbmcgaGlzdG9yeS4KKworQXQgdGhpcyBwb2ludCB5b3UgY291bGQgZGVsZXRlIHRoZSBleHBlcmltZW50YWwgYnJhbmNoIHdpdGgKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBicmFuY2ggLWQgZXhwZXJpbWVudGFsCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBjb21tYW5kIGVuc3VyZXMgdGhhdCB0aGUgY2hhbmdlcyBpbiB0aGUgZXhwZXJpbWVudGFsIGJyYW5jaCBhcmUKK2FscmVhZHkgaW4gdGhlIGN1cnJlbnQgYnJhbmNoLgorCitJZiB5b3UgZGV2ZWxvcCBvbiBhIGJyYW5jaCBjcmF6eS1pZGVhLCB0aGVuIHJlZ3JldCBpdCwgeW91IGNhbiBhbHdheXMKK2RlbGV0ZSB0aGUgYnJhbmNoIHdpdGgKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYnJhbmNoIC1EIGNyYXp5LWlkZWEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQnJhbmNoZXMgYXJlIGNoZWFwIGFuZCBlYXN5LCBzbyB0aGlzIGlzIGEgZ29vZCB3YXkgdG8gdHJ5IHNvbWV0aGluZworb3V0LgorCitVc2luZyBnaXQgZm9yIGNvbGxhYm9yYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTdXBwb3NlIHRoYXQgQWxpY2UgaGFzIHN0YXJ0ZWQgYSBuZXcgcHJvamVjdCB3aXRoIGEgZ2l0IHJlcG9zaXRvcnkgaW4KKy9ob21lL2FsaWNlL3Byb2plY3QsIGFuZCB0aGF0IEJvYiwgd2hvIGhhcyBhIGhvbWUgZGlyZWN0b3J5IG9uIHRoZQorc2FtZSBtYWNoaW5lLCB3YW50cyB0byBjb250cmlidXRlLgorCitCb2IgYmVnaW5zIHdpdGg6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2xvbmUgL2hvbWUvYWxpY2UvcHJvamVjdCBteXJlcG8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGNyZWF0ZXMgYSBuZXcgZGlyZWN0b3J5ICJteXJlcG8iIGNvbnRhaW5pbmcgYSBjbG9uZSBvZiBBbGljZSdzCityZXBvc2l0b3J5LiAgVGhlIGNsb25lIGlzIG9uIGFuIGVxdWFsIGZvb3Rpbmcgd2l0aCB0aGUgb3JpZ2luYWwKK3Byb2plY3QsIHBvc3Nlc3NpbmcgaXRzIG93biBjb3B5IG9mIHRoZSBvcmlnaW5hbCBwcm9qZWN0J3MgaGlzdG9yeS4KKworQm9iIHRoZW4gbWFrZXMgc29tZSBjaGFuZ2VzIGFuZCBjb21taXRzIHRoZW06CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKGVkaXQgZmlsZXMpCiskIGdpdCBjb21taXQgLWEKKyhyZXBlYXQgYXMgbmVjZXNzYXJ5KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doZW4gaGUncyByZWFkeSwgaGUgdGVsbHMgQWxpY2UgdG8gcHVsbCBjaGFuZ2VzIGZyb20gdGhlIHJlcG9zaXRvcnkKK2F0IC9ob21lL2JvYi9teXJlcG8uICBTaGUgZG9lcyB0aGlzIHdpdGg6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBjZCAvaG9tZS9hbGljZS9wcm9qZWN0CiskIGdpdCBwdWxsIC9ob21lL2JvYi9teXJlcG8gbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBtZXJnZXMgdGhlIGNoYW5nZXMgZnJvbSBCb2IncyAibWFzdGVyIiBicmFuY2ggaW50byBBbGljZSdzCitjdXJyZW50IGJyYW5jaC4gIElmIEFsaWNlIGhhcyBtYWRlIGhlciBvd24gY2hhbmdlcyBpbiB0aGUgbWVhbnRpbWUsCit0aGVuIHNoZSBtYXkgbmVlZCB0byBtYW51YWxseSBmaXggYW55IGNvbmZsaWN0cy4gIChOb3RlIHRoYXQgdGhlCisibWFzdGVyIiBhcmd1bWVudCBpbiB0aGUgYWJvdmUgY29tbWFuZCBpcyBhY3R1YWxseSB1bm5lY2Vzc2FyeSwgYXMgaXQKK2lzIHRoZSBkZWZhdWx0LikKKworVGhlICJwdWxsIiBjb21tYW5kIHRodXMgcGVyZm9ybXMgdHdvIG9wZXJhdGlvbnM6IGl0IGZldGNoZXMgY2hhbmdlcworZnJvbSBhIHJlbW90ZSBicmFuY2gsIHRoZW4gbWVyZ2VzIHRoZW0gaW50byB0aGUgY3VycmVudCBicmFuY2guCisKK1doZW4geW91IGFyZSB3b3JraW5nIGluIGEgc21hbGwgY2xvc2VseSBrbml0IGdyb3VwLCBpdCBpcyBub3QKK3VudXN1YWwgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc2FtZSByZXBvc2l0b3J5IG92ZXIgYW5kIG92ZXIKK2FnYWluLiAgQnkgZGVmaW5pbmcgJ3JlbW90ZScgcmVwb3NpdG9yeSBzaG9ydGhhbmQsIHlvdSBjYW4gbWFrZQoraXQgZWFzaWVyOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHJlbW90ZSBhZGQgYm9iIC9ob21lL2JvYi9teXJlcG8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaXRoIHRoaXMsIEFsaWNlIGNhbiBwZXJmb3JtIHRoZSBmaXJzdCBvcGVyYXRpb24gYWxvbmUgdXNpbmcgdGhlCisiZ2l0IGZldGNoIiBjb21tYW5kIHdpdGhvdXQgbWVyZ2luZyB0aGVtIHdpdGggaGVyIG93biBicmFuY2gsCit1c2luZzoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZmV0Y2ggYm9iCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1VubGlrZSB0aGUgbG9uZ2hhbmQgZm9ybSwgd2hlbiBBbGljZSBmZXRjaGVzIGZyb20gQm9iIHVzaW5nIGEKK3JlbW90ZSByZXBvc2l0b3J5IHNob3J0aGFuZCBzZXQgdXAgd2l0aCBgZ2l0IHJlbW90ZWAsIHdoYXQgd2FzCitmZXRjaGVkIGlzIHN0b3JlZCBpbiBhIHJlbW90ZSB0cmFja2luZyBicmFuY2gsIGluIHRoaXMgY2FzZQorYGJvYi9tYXN0ZXJgLiAgU28gYWZ0ZXIgdGhpczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbG9nIC1wIG1hc3Rlci4uYm9iL21hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBjaGFuZ2VzIHRoYXQgQm9iIG1hZGUgc2luY2UgaGUgYnJhbmNoZWQgZnJvbQorQWxpY2UncyBtYXN0ZXIgYnJhbmNoLgorCitBZnRlciBleGFtaW5pbmcgdGhvc2UgY2hhbmdlcywgQWxpY2UKK2NvdWxkIG1lcmdlIHRoZSBjaGFuZ2VzIGludG8gaGVyIG1hc3RlciBicmFuY2g6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IG1lcmdlIGJvYi9tYXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBgbWVyZ2VgIGNhbiBhbHNvIGJlIGRvbmUgYnkgJ3B1bGxpbmcgZnJvbSBoZXIgb3duIHJlbW90ZQordHJhY2tpbmcgYnJhbmNoJywgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBwdWxsIC4gcmVtb3Rlcy9ib2IvbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdGUgdGhhdCBnaXQgcHVsbCBhbHdheXMgbWVyZ2VzIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoLAorcmVnYXJkbGVzcyBvZiB3aGF0IGVsc2UgaXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KKworTGF0ZXIsIEJvYiBjYW4gdXBkYXRlIGhpcyByZXBvIHdpdGggQWxpY2UncyBsYXRlc3QgY2hhbmdlcyB1c2luZworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBwdWxsCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdGUgdGhhdCBoZSBkb2Vzbid0IG5lZWQgdG8gZ2l2ZSB0aGUgcGF0aCB0byBBbGljZSdzIHJlcG9zaXRvcnk7Cit3aGVuIEJvYiBjbG9uZWQgQWxpY2UncyByZXBvc2l0b3J5LCBnaXQgc3RvcmVkIHRoZSBsb2NhdGlvbiBvZiBoZXIKK3JlcG9zaXRvcnkgaW4gdGhlIHJlcG9zaXRvcnkgY29uZmlndXJhdGlvbiwgYW5kIHRoYXQgbG9jYXRpb24gaXMKK3VzZWQgZm9yIHB1bGxzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjb25maWcgLS1nZXQgcmVtb3RlLm9yaWdpbi51cmwKKy9ob21lL2FsaWNlL3Byb2plY3QKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKFRoZSBjb21wbGV0ZSBjb25maWd1cmF0aW9uIGNyZWF0ZWQgYnkgZ2l0LWNsb25lIGlzIHZpc2libGUgdXNpbmcKKyJnaXQgY29uZmlnIC1sIiwgYW5kIHRoZSBsaW5rZ2l0OmdpdC1jb25maWdbMV0gbWFuIHBhZ2UKK2V4cGxhaW5zIHRoZSBtZWFuaW5nIG9mIGVhY2ggb3B0aW9uLikKKworR2l0IGFsc28ga2VlcHMgYSBwcmlzdGluZSBjb3B5IG9mIEFsaWNlJ3MgbWFzdGVyIGJyYW5jaCB1bmRlciB0aGUKK25hbWUgIm9yaWdpbi9tYXN0ZXIiOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBicmFuY2ggLXIKKyAgb3JpZ2luL21hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiBCb2IgbGF0ZXIgZGVjaWRlcyB0byB3b3JrIGZyb20gYSBkaWZmZXJlbnQgaG9zdCwgaGUgY2FuIHN0aWxsCitwZXJmb3JtIGNsb25lcyBhbmQgcHVsbHMgdXNpbmcgdGhlIHNzaCBwcm90b2NvbDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2xvbmUgYWxpY2Uub3JnOi9ob21lL2FsaWNlL3Byb2plY3QgbXlyZXBvCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FsdGVybmF0aXZlbHksIGdpdCBoYXMgYSBuYXRpdmUgcHJvdG9jb2wsIG9yIGNhbiB1c2UgcnN5bmMgb3IgaHR0cDsKK3NlZSBsaW5rZ2l0OmdpdC1wdWxsWzFdIGZvciBkZXRhaWxzLgorCitHaXQgY2FuIGFsc28gYmUgdXNlZCBpbiBhIENWUy1saWtlIG1vZGUsIHdpdGggYSBjZW50cmFsIHJlcG9zaXRvcnkKK3RoYXQgdmFyaW91cyB1c2VycyBwdXNoIGNoYW5nZXMgdG87IHNlZSBsaW5rZ2l0OmdpdC1wdXNoWzFdIGFuZAorbGluazpjdnMtbWlncmF0aW9uLmh0bWxbZ2l0IGZvciBDVlMgdXNlcnNdLgorCitFeHBsb3JpbmcgaGlzdG9yeQorLS0tLS0tLS0tLS0tLS0tLS0KKworR2l0IGhpc3RvcnkgaXMgcmVwcmVzZW50ZWQgYXMgYSBzZXJpZXMgb2YgaW50ZXJyZWxhdGVkIGNvbW1pdHMuICBXZQoraGF2ZSBhbHJlYWR5IHNlZW4gdGhhdCB0aGUgZ2l0IGxvZyBjb21tYW5kIGNhbiBsaXN0IHRob3NlIGNvbW1pdHMuCitOb3RlIHRoYXQgZmlyc3QgbGluZSBvZiBlYWNoIGdpdCBsb2cgZW50cnkgYWxzbyBnaXZlcyBhIG5hbWUgZm9yIHRoZQorY29tbWl0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBsb2cKK2NvbW1pdCBjODJhMjJjMzljYmMzMjU3NmY2NGY1YzZiM2YyNGI5OWVhODE0OWM3CitBdXRob3I6IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KK0RhdGU6ICAgVHVlIE1heSAxNiAxNzoxODoyMiAyMDA2IC0wNzAwCisKKyAgICBtZXJnZS1iYXNlOiBDbGFyaWZ5IHRoZSBjb21tZW50cyBvbiBwb3N0IHByb2Nlc3NpbmcuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dlIGNhbiBnaXZlIHRoaXMgbmFtZSB0byBnaXQgc2hvdyB0byBzZWUgdGhlIGRldGFpbHMgYWJvdXQgdGhpcworY29tbWl0LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93IGM4MmEyMmMzOWNiYzMyNTc2ZjY0ZjVjNmIzZjI0Yjk5ZWE4MTQ5YzcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQnV0IHRoZXJlIGFyZSBvdGhlciB3YXlzIHRvIHJlZmVyIHRvIGNvbW1pdHMuICBZb3UgY2FuIHVzZSBhbnkgaW5pdGlhbAorcGFydCBvZiB0aGUgbmFtZSB0aGF0IGlzIGxvbmcgZW5vdWdoIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBjb21taXQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3cgYzgyYTIyYzM5YwkjIHRoZSBmaXJzdCBmZXcgY2hhcmFjdGVycyBvZiB0aGUgbmFtZSBhcmUKKwkJCSMgdXN1YWxseSBlbm91Z2gKKyQgZ2l0IHNob3cgSEVBRAkJIyB0aGUgdGlwIG9mIHRoZSBjdXJyZW50IGJyYW5jaAorJCBnaXQgc2hvdyBleHBlcmltZW50YWwJIyB0aGUgdGlwIG9mIHRoZSAiZXhwZXJpbWVudGFsIiBicmFuY2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRXZlcnkgY29tbWl0IHVzdWFsbHkgaGFzIG9uZSAicGFyZW50IiBjb21taXQKK3doaWNoIHBvaW50cyB0byB0aGUgcHJldmlvdXMgc3RhdGUgb2YgdGhlIHByb2plY3Q6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3cgSEVBRF4gICMgdG8gc2VlIHRoZSBwYXJlbnQgb2YgSEVBRAorJCBnaXQgc2hvdyBIRUFEXl4gIyB0byBzZWUgdGhlIGdyYW5kcGFyZW50IG9mIEhFQUQKKyQgZ2l0IHNob3cgSEVBRH40ICMgdG8gc2VlIHRoZSBncmVhdC1ncmVhdCBncmFuZHBhcmVudCBvZiBIRUFECistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdGUgdGhhdCBtZXJnZSBjb21taXRzIG1heSBoYXZlIG1vcmUgdGhhbiBvbmUgcGFyZW50OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93IEhFQUReMSAjIHNob3cgdGhlIGZpcnN0IHBhcmVudCBvZiBIRUFEIChzYW1lIGFzIEhFQUReKQorJCBnaXQgc2hvdyBIRUFEXjIgIyBzaG93IHRoZSBzZWNvbmQgcGFyZW50IG9mIEhFQUQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWW91IGNhbiBhbHNvIGdpdmUgY29tbWl0cyBuYW1lcyBvZiB5b3VyIG93bjsgYWZ0ZXIgcnVubmluZworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdC10YWcgdjIuNSAxYjJlMWQ2M2ZmCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3lvdSBjYW4gcmVmZXIgdG8gMWIyZTFkNjNmZiBieSB0aGUgbmFtZSAidjIuNSIuICBJZiB5b3UgaW50ZW5kIHRvCitzaGFyZSB0aGlzIG5hbWUgd2l0aCBvdGhlciBwZW9wbGUgKGZvciBleGFtcGxlLCB0byBpZGVudGlmeSBhIHJlbGVhc2UKK3ZlcnNpb24pLCB5b3Ugc2hvdWxkIGNyZWF0ZSBhICJ0YWciIG9iamVjdCwgYW5kIHBlcmhhcHMgc2lnbiBpdDsgc2VlCitsaW5rZ2l0OmdpdC10YWdbMV0gZm9yIGRldGFpbHMuCisKK0FueSBnaXQgY29tbWFuZCB0aGF0IG5lZWRzIHRvIGtub3cgYSBjb21taXQgY2FuIHRha2UgYW55IG9mIHRoZXNlCituYW1lcy4gIEZvciBleGFtcGxlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmIHYyLjUgSEVBRAkgIyBjb21wYXJlIHRoZSBjdXJyZW50IEhFQUQgdG8gdjIuNQorJCBnaXQgYnJhbmNoIHN0YWJsZSB2Mi41ICMgc3RhcnQgYSBuZXcgYnJhbmNoIG5hbWVkICJzdGFibGUiIGJhc2VkCisJCQkgIyBhdCB2Mi41CiskIGdpdCByZXNldCAtLWhhcmQgSEVBRF4gIyByZXNldCB5b3VyIGN1cnJlbnQgYnJhbmNoIGFuZCB3b3JraW5nCisJCQkgIyBkaXJlY3RvcnkgdG8gaXRzIHN0YXRlIGF0IEhFQUReCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JlIGNhcmVmdWwgd2l0aCB0aGF0IGxhc3QgY29tbWFuZDogaW4gYWRkaXRpb24gdG8gbG9zaW5nIGFueSBjaGFuZ2VzCitpbiB0aGUgd29ya2luZyBkaXJlY3RvcnksIGl0IHdpbGwgYWxzbyByZW1vdmUgYWxsIGxhdGVyIGNvbW1pdHMgZnJvbQordGhpcyBicmFuY2guICBJZiB0aGlzIGJyYW5jaCBpcyB0aGUgb25seSBicmFuY2ggY29udGFpbmluZyB0aG9zZQorY29tbWl0cywgdGhleSB3aWxsIGJlIGxvc3QuICBBbHNvLCBkb24ndCB1c2UgImdpdCByZXNldCIgb24gYQorcHVibGljbHktdmlzaWJsZSBicmFuY2ggdGhhdCBvdGhlciBkZXZlbG9wZXJzIHB1bGwgZnJvbSwgYXMgaXQgd2lsbAorZm9yY2UgbmVlZGxlc3MgbWVyZ2VzIG9uIG90aGVyIGRldmVsb3BlcnMgdG8gY2xlYW4gdXAgdGhlIGhpc3RvcnkuCitJZiB5b3UgbmVlZCB0byB1bmRvIGNoYW5nZXMgdGhhdCB5b3UgaGF2ZSBwdXNoZWQsIHVzZSBsaW5rZ2l0OmdpdC1yZXZlcnRbMV0KK2luc3RlYWQuCisKK1RoZSBnaXQgZ3JlcCBjb21tYW5kIGNhbiBzZWFyY2ggZm9yIHN0cmluZ3MgaW4gYW55IHZlcnNpb24gb2YgeW91cgorcHJvamVjdCwgc28KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZ3JlcCAiaGVsbG8iIHYyLjUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc2VhcmNoZXMgZm9yIGFsbCBvY2N1cnJlbmNlcyBvZiAiaGVsbG8iIGluIHYyLjUuCisKK0lmIHlvdSBsZWF2ZSBvdXQgdGhlIGNvbW1pdCBuYW1lLCBnaXQgZ3JlcCB3aWxsIHNlYXJjaCBhbnkgb2YgdGhlCitmaWxlcyBpdCBtYW5hZ2VzIGluIHlvdXIgY3VycmVudCBkaXJlY3RvcnkuICBTbworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBncmVwICJoZWxsbyIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaXMgYSBxdWljayB3YXkgdG8gc2VhcmNoIGp1c3QgdGhlIGZpbGVzIHRoYXQgYXJlIHRyYWNrZWQgYnkgZ2l0LgorCitNYW55IGdpdCBjb21tYW5kcyBhbHNvIHRha2Ugc2V0cyBvZiBjb21taXRzLCB3aGljaCBjYW4gYmUgc3BlY2lmaWVkCitpbiBhIG51bWJlciBvZiB3YXlzLiAgSGVyZSBhcmUgc29tZSBleGFtcGxlcyB3aXRoIGdpdCBsb2c6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZyB2Mi41Li52Mi42ICAgICAgICAgICAgIyBjb21taXRzIGJldHdlZW4gdjIuNSBhbmQgdjIuNgorJCBnaXQgbG9nIHYyLjUuLiAgICAgICAgICAgICAgICAjIGNvbW1pdHMgc2luY2UgdjIuNQorJCBnaXQgbG9nIC0tc2luY2U9IjIgd2Vla3MgYWdvIiAjIGNvbW1pdHMgZnJvbSB0aGUgbGFzdCAyIHdlZWtzCiskIGdpdCBsb2cgdjIuNS4uIE1ha2VmaWxlICAgICAgICMgY29tbWl0cyBzaW5jZSB2Mi41IHdoaWNoIG1vZGlmeQorCQkJCSMgTWFrZWZpbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWW91IGNhbiBhbHNvIGdpdmUgZ2l0IGxvZyBhICJyYW5nZSIgb2YgY29tbWl0cyB3aGVyZSB0aGUgZmlyc3QgaXMgbm90CituZWNlc3NhcmlseSBhbiBhbmNlc3RvciBvZiB0aGUgc2Vjb25kOyBmb3IgZXhhbXBsZSwgaWYgdGhlIHRpcHMgb2YKK3RoZSBicmFuY2hlcyAic3RhYmxlLXJlbGVhc2UiIGFuZCAibWFzdGVyIiBkaXZlcmdlZCBmcm9tIGEgY29tbW9uCitjb21taXQgc29tZSB0aW1lIGFnbywgdGhlbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBsb2cgc3RhYmxlLi5leHBlcmltZW50YWwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2lsbCBsaXN0IGNvbW1pdHMgbWFkZSBpbiB0aGUgZXhwZXJpbWVudGFsIGJyYW5jaCBidXQgbm90IGluIHRoZQorc3RhYmxlIGJyYW5jaCwgd2hpbGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbG9nIGV4cGVyaW1lbnRhbC4uc3RhYmxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgc2hvdyB0aGUgbGlzdCBvZiBjb21taXRzIG1hZGUgb24gdGhlIHN0YWJsZSBicmFuY2ggYnV0IG5vdAordGhlIGV4cGVyaW1lbnRhbCBicmFuY2guCisKK1RoZSAiZ2l0IGxvZyIgY29tbWFuZCBoYXMgYSB3ZWFrbmVzczogaXQgbXVzdCBwcmVzZW50IGNvbW1pdHMgaW4gYQorbGlzdC4gIFdoZW4gdGhlIGhpc3RvcnkgaGFzIGxpbmVzIG9mIGRldmVsb3BtZW50IHRoYXQgZGl2ZXJnZWQgYW5kCit0aGVuIG1lcmdlZCBiYWNrIHRvZ2V0aGVyLCB0aGUgb3JkZXIgaW4gd2hpY2ggImdpdCBsb2ciIHByZXNlbnRzCit0aG9zZSBjb21taXRzIGlzIG1lYW5pbmdsZXNzLgorCitNb3N0IHByb2plY3RzIHdpdGggbXVsdGlwbGUgY29udHJpYnV0b3JzIChzdWNoIGFzIHRoZSBsaW51eCBrZXJuZWwsCitvciBnaXQgaXRzZWxmKSBoYXZlIGZyZXF1ZW50IG1lcmdlcywgYW5kIGdpdGsgZG9lcyBhIGJldHRlciBqb2Igb2YKK3Zpc3VhbGl6aW5nIHRoZWlyIGhpc3RvcnkuICBGb3IgZXhhbXBsZSwKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXRrIC0tc2luY2U9IjIgd2Vla3MgYWdvIiBkcml2ZXJzLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbGxvd3MgeW91IHRvIGJyb3dzZSBhbnkgY29tbWl0cyBmcm9tIHRoZSBsYXN0IDIgd2Vla3Mgb2YgY29tbWl0cwordGhhdCBtb2RpZmllZCBmaWxlcyB1bmRlciB0aGUgImRyaXZlcnMiIGRpcmVjdG9yeS4gIChOb3RlOiB5b3UgY2FuCithZGp1c3QgZ2l0aydzIGZvbnRzIGJ5IGhvbGRpbmcgZG93biB0aGUgY29udHJvbCBrZXkgd2hpbGUgcHJlc3NpbmcKKyItIiBvciAiKyIuKQorCitGaW5hbGx5LCBtb3N0IGNvbW1hbmRzIHRoYXQgdGFrZSBmaWxlbmFtZXMgd2lsbCBvcHRpb25hbGx5IGFsbG93IHlvdQordG8gcHJlY2VkZSBhbnkgZmlsZW5hbWUgYnkgYSBjb21taXQsIHRvIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIHZlcnNpb24KK29mIHRoZSBmaWxlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmIHYyLjU6TWFrZWZpbGUgSEVBRDpNYWtlZmlsZS5pbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3UgY2FuIGFsc28gdXNlICJnaXQgc2hvdyIgdG8gc2VlIGFueSBzdWNoIGZpbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3cgdjIuNTpNYWtlZmlsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOZXh0IFN0ZXBzCistLS0tLS0tLS0tCisKK1RoaXMgdHV0b3JpYWwgc2hvdWxkIGJlIGVub3VnaCB0byBwZXJmb3JtIGJhc2ljIGRpc3RyaWJ1dGVkIHJldmlzaW9uCitjb250cm9sIGZvciB5b3VyIHByb2plY3RzLiAgSG93ZXZlciwgdG8gZnVsbHkgdW5kZXJzdGFuZCB0aGUgZGVwdGgKK2FuZCBwb3dlciBvZiBnaXQgeW91IG5lZWQgdG8gdW5kZXJzdGFuZCB0d28gc2ltcGxlIGlkZWFzIG9uIHdoaWNoIGl0CitpcyBiYXNlZDoKKworICAqIFRoZSBvYmplY3QgZGF0YWJhc2UgaXMgdGhlIHJhdGhlciBlbGVnYW50IHN5c3RlbSB1c2VkIHRvCisgICAgc3RvcmUgdGhlIGhpc3Rvcnkgb2YgeW91ciBwcm9qZWN0LS1maWxlcywgZGlyZWN0b3JpZXMsIGFuZAorICAgIGNvbW1pdHMuCisKKyAgKiBUaGUgaW5kZXggZmlsZSBpcyBhIGNhY2hlIG9mIHRoZSBzdGF0ZSBvZiBhIGRpcmVjdG9yeSB0cmVlLAorICAgIHVzZWQgdG8gY3JlYXRlIGNvbW1pdHMsIGNoZWNrIG91dCB3b3JraW5nIGRpcmVjdG9yaWVzLCBhbmQKKyAgICBob2xkIHRoZSB2YXJpb3VzIHRyZWVzIGludm9sdmVkIGluIGEgbWVyZ2UuCisKK2xpbms6dHV0b3JpYWwtMi5odG1sW1BhcnQgdHdvIG9mIHRoaXMgdHV0b3JpYWxdIGV4cGxhaW5zIHRoZSBvYmplY3QKK2RhdGFiYXNlLCB0aGUgaW5kZXggZmlsZSwgYW5kIGEgZmV3IG90aGVyIG9kZHMgYW5kIGVuZHMgdGhhdCB5b3UnbGwKK25lZWQgdG8gbWFrZSB0aGUgbW9zdCBvZiBnaXQuCisKK0lmIHlvdSBkb24ndCB3YW50IHRvIGNvbnRpbnVlIHdpdGggdGhhdCByaWdodCBhd2F5LCBhIGZldyBvdGhlcgorZGlncmVzc2lvbnMgdGhhdCBtYXkgYmUgaW50ZXJlc3RpbmcgYXQgdGhpcyBwb2ludCBhcmU6CisKKyAgKiBsaW5rZ2l0OmdpdC1mb3JtYXQtcGF0Y2hbMV0sIGxpbmtnaXQ6Z2l0LWFtWzFdOiBUaGVzZSBjb252ZXJ0CisgICAgc2VyaWVzIG9mIGdpdCBjb21taXRzIGludG8gZW1haWxlZCBwYXRjaGVzLCBhbmQgdmljZSB2ZXJzYSwKKyAgICB1c2VmdWwgZm9yIHByb2plY3RzIHN1Y2ggYXMgdGhlIGxpbnV4IGtlcm5lbCB3aGljaCByZWx5IGhlYXZpbHkKKyAgICBvbiBlbWFpbGVkIHBhdGNoZXMuCisKKyAgKiBsaW5rZ2l0OmdpdC1iaXNlY3RbMV06IFdoZW4gdGhlcmUgaXMgYSByZWdyZXNzaW9uIGluIHlvdXIKKyAgICBwcm9qZWN0LCBvbmUgd2F5IHRvIHRyYWNrIGRvd24gdGhlIGJ1ZyBpcyBieSBzZWFyY2hpbmcgdGhyb3VnaAorICAgIHRoZSBoaXN0b3J5IHRvIGZpbmQgdGhlIGV4YWN0IGNvbW1pdCB0aGF0J3MgdG8gYmxhbWUuICBHaXQgYmlzZWN0CisgICAgY2FuIGhlbHAgeW91IHBlcmZvcm0gYSBiaW5hcnkgc2VhcmNoIGZvciB0aGF0IGNvbW1pdC4gIEl0IGlzCisgICAgc21hcnQgZW5vdWdoIHRvIHBlcmZvcm0gYSBjbG9zZS10by1vcHRpbWFsIHNlYXJjaCBldmVuIGluIHRoZQorICAgIGNhc2Ugb2YgY29tcGxleCBub24tbGluZWFyIGhpc3Rvcnkgd2l0aCBsb3RzIG9mIG1lcmdlZCBicmFuY2hlcy4KKworICAqIGxpbms6ZXZlcnlkYXkuaHRtbFtFdmVyeWRheSBHSVQgd2l0aCAyMCBDb21tYW5kcyBPciBTb10KKworICAqIGxpbms6Y3ZzLW1pZ3JhdGlvbi5odG1sW2dpdCBmb3IgQ1ZTIHVzZXJzXS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXJscy1yZW1vdGVzLnR4dCBiL0RvY3VtZW50YXRpb24vdXJscy1yZW1vdGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGQxZjgzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi91cmxzLXJlbW90ZXMudHh0CkBAIC0wLDAgKzEsNTUgQEAKK2luY2x1ZGU6OnVybHMudHh0W10KKworUkVNT1RFUworLS0tLS0tLQorCitJbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUsIGFzIGEgc2hvcnQtaGFuZCwgdGhlIG5hbWUgb2YgYQorZmlsZSBpbiBgJEdJVF9ESVIvcmVtb3Rlc2AgZGlyZWN0b3J5IGNhbiBiZSBnaXZlbjsgdGhlCituYW1lZCBmaWxlIHNob3VsZCBiZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKworLS0tLS0tLS0tLS0tCisJVVJMOiBvbmUgb2YgdGhlIGFib3ZlIFVSTCBmb3JtYXQKKwlQdXNoOiA8cmVmc3BlYz4KKwlQdWxsOiA8cmVmc3BlYz4KKworLS0tLS0tLS0tLS0tCisKK1RoZW4gc3VjaCBhIHNob3J0LWhhbmQgaXMgc3BlY2lmaWVkIGluIHBsYWNlIG9mCis8cmVwb3NpdG9yeT4gd2l0aG91dCA8cmVmc3BlYz4gcGFyYW1ldGVycyBvbiB0aGUgY29tbWFuZAorbGluZSwgPHJlZnNwZWM+IHNwZWNpZmllZCBvbiBgUHVzaDpgIGxpbmVzIG9yIGBQdWxsOmAKK2xpbmVzIGFyZSB1c2VkIGZvciBgZ2l0LXB1c2hgIGFuZCBgZ2l0LWZldGNoYC9gZ2l0LXB1bGxgLAorcmVzcGVjdGl2ZWx5LiAgTXVsdGlwbGUgYFB1c2g6YCBhbmQgYFB1bGw6YCBsaW5lcyBtYXkKK2JlIHNwZWNpZmllZCBmb3IgYWRkaXRpb25hbCBicmFuY2ggbWFwcGluZ3MuCisKK09yLCBlcXVpdmFsZW50bHksIGluIHRoZSBgJEdJVF9ESVIvY29uZmlnYCAobm90ZSB0aGUgdXNlCitvZiBgZmV0Y2hgIGluc3RlYWQgb2YgYFB1bGw6YCk6CisKKy0tLS0tLS0tLS0tLQorCVtyZW1vdGUgIjxyZW1vdGU+Il0KKwkJdXJsID0gPHVybD4KKwkJcHVzaCA9IDxyZWZzcGVjPgorCQlmZXRjaCA9IDxyZWZzcGVjPgorCistLS0tLS0tLS0tLS0KKworVGhlIG5hbWUgb2YgYSBmaWxlIGluIGAkR0lUX0RJUi9icmFuY2hlc2AgZGlyZWN0b3J5IGNhbiBiZQorc3BlY2lmaWVkIGFzIGFuIG9sZGVyIG5vdGF0aW9uIHNob3J0LWhhbmQ7IHRoZSBuYW1lZAorZmlsZSBzaG91bGQgY29udGFpbiBhIHNpbmdsZSBsaW5lLCBhIFVSTCBpbiBvbmUgb2YgdGhlCithYm92ZSBmb3JtYXRzLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgaGFzaCBgI2AgYW5kIHRoZQorbmFtZSBvZiByZW1vdGUgaGVhZCAoVVJMIGZyYWdtZW50IG5vdGF0aW9uKS4KK2AkR0lUX0RJUi9icmFuY2hlcy88cmVtb3RlPmAgZmlsZSB0aGF0IHN0b3JlcyBhIDx1cmw+Cit3aXRob3V0IHRoZSBmcmFnbWVudCBpcyBlcXVpdmFsZW50IHRvIGhhdmUgdGhpcyBpbiB0aGUKK2NvcnJlc3BvbmRpbmcgZmlsZSBpbiB0aGUgYCRHSVRfRElSL3JlbW90ZXMvYCBkaXJlY3RvcnkuCisKKy0tLS0tLS0tLS0tLQorCVVSTDogPHVybD4KKwlQdWxsOiByZWZzL2hlYWRzL21hc3Rlcjo8cmVtb3RlPgorCistLS0tLS0tLS0tLS0KKword2hpbGUgaGF2aW5nIGA8dXJsPiM8aGVhZD5gIGlzIGVxdWl2YWxlbnQgdG8KKworLS0tLS0tLS0tLS0tCisJVVJMOiA8dXJsPgorCVB1bGw6IHJlZnMvaGVhZHMvPGhlYWQ+OjxyZW1vdGU+CistLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXJscy50eHQgYi9Eb2N1bWVudGF0aW9uL3VybHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMzRjNjcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3VybHMudHh0CkBAIC0wLDAgKzEsNjkgQEAKK0dJVCBVUkxTW1tVUkxTXV0KKy0tLS0tLS0tLS0tLS0tLS0KKworT25lIG9mIHRoZSBmb2xsb3dpbmcgbm90YXRpb25zIGNhbiBiZSB1c2VkCit0byBuYW1lIHRoZSByZW1vdGUgcmVwb3NpdG9yeToKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistIHJzeW5jOi8vaG9zdC54ei9wYXRoL3RvL3JlcG8uZ2l0LworLSBodHRwOi8vaG9zdC54ei9wYXRoL3RvL3JlcG8uZ2l0LworLSBodHRwczovL2hvc3QueHovcGF0aC90by9yZXBvLmdpdC8KKy0gZ2l0Oi8vaG9zdC54ei9wYXRoL3RvL3JlcG8uZ2l0LworLSBnaXQ6Ly9ob3N0Lnh6L351c2VyL3BhdGgvdG8vcmVwby5naXQvCistIHNzaDovL3tzdGFydHNifXVzZXJAe2VuZHNifWhvc3QueHp7c3RhcnRzYn06cG9ydHtlbmRzYn0vcGF0aC90by9yZXBvLmdpdC8KKy0gc3NoOi8ve3N0YXJ0c2J9dXNlckB7ZW5kc2J9aG9zdC54ei9wYXRoL3RvL3JlcG8uZ2l0LworLSBzc2g6Ly97c3RhcnRzYn11c2VyQHtlbmRzYn1ob3N0Lnh6L351c2VyL3BhdGgvdG8vcmVwby5naXQvCistIHNzaDovL3tzdGFydHNifXVzZXJAe2VuZHNifWhvc3QueHovfi9wYXRoL3RvL3JlcG8uZ2l0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU1NIIGlzIHRoZSBkZWZhdWx0IHRyYW5zcG9ydCBwcm90b2NvbCBvdmVyIHRoZSBuZXR3b3JrLiAgWW91IGNhbgorb3B0aW9uYWxseSBzcGVjaWZ5IHdoaWNoIHVzZXIgdG8gbG9nLWluIGFzLCBhbmQgYW4gYWx0ZXJuYXRlLAorc2NwLWxpa2Ugc3ludGF4IGlzIGFsc28gc3VwcG9ydGVkLiAgQm90aCBzeW50YXhlcyBzdXBwb3J0Cit1c2VybmFtZSBleHBhbnNpb24sIGFzIGRvZXMgdGhlIG5hdGl2ZSBnaXQgcHJvdG9jb2wsIGJ1dAorb25seSB0aGUgZm9ybWVyIHN1cHBvcnRzIHBvcnQgc3BlY2lmaWNhdGlvbi4gVGhlIGZvbGxvd2luZwordGhyZWUgYXJlIGlkZW50aWNhbCB0byB0aGUgbGFzdCB0aHJlZSBhYm92ZSwgcmVzcGVjdGl2ZWx5OgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0ge3N0YXJ0c2J9dXNlckB7ZW5kc2J9aG9zdC54ejovcGF0aC90by9yZXBvLmdpdC8KKy0ge3N0YXJ0c2J9dXNlckB7ZW5kc2J9aG9zdC54ejp+dXNlci9wYXRoL3RvL3JlcG8uZ2l0LworLSB7c3RhcnRzYn11c2VyQHtlbmRzYn1ob3N0Lnh6OnBhdGgvdG8vcmVwby5naXQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUbyBzeW5jIHdpdGggYSBsb2NhbCBkaXJlY3RvcnksIHlvdSBjYW4gdXNlOgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0gL3BhdGgvdG8vcmVwby5naXQvCistIGZpbGU6Ly8vcGF0aC90by9yZXBvLmdpdC8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpZm5kZWY6OmdpdC1jbG9uZVtdCitUaGV5IGFyZSBtb3N0bHkgZXF1aXZhbGVudCwgZXhjZXB0IHdoZW4gY2xvbmluZy4gIFNlZQorbGlua2dpdDpnaXQtY2xvbmVbMV0gZm9yIGRldGFpbHMuCitlbmRpZjo6Z2l0LWNsb25lW10KKworaWZkZWY6OmdpdC1jbG9uZVtdCitUaGV5IGFyZSBlcXVpdmFsZW50LCBleGNlcHQgdGhlIGZvcm1lciBpbXBsaWVzIC0tbG9jYWwgb3B0aW9uLgorZW5kaWY6OmdpdC1jbG9uZVtdCisKKworSWYgdGhlcmUgYXJlIGEgbGFyZ2UgbnVtYmVyIG9mIHNpbWlsYXJseS1uYW1lZCByZW1vdGUgcmVwb3NpdG9yaWVzIGFuZAoreW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IGZvcm1hdCBmb3IgdGhlbSAoc3VjaCB0aGF0IHRoZSBVUkxzIHlvdQordXNlIHdpbGwgYmUgcmV3cml0dGVuIGludG8gVVJMcyB0aGF0IHdvcmspLCB5b3UgY2FuIGNyZWF0ZSBhCitjb25maWd1cmF0aW9uIHNlY3Rpb24gb2YgdGhlIGZvcm06CisKKy0tLS0tLS0tLS0tLQorCVt1cmwgIjxhY3R1YWwgdXJsIGJhc2U+Il0KKwkJaW5zdGVhZE9mID0gPG90aGVyIHVybCBiYXNlPgorLS0tLS0tLS0tLS0tCisKK0ZvciBleGFtcGxlLCB3aXRoIHRoaXM6CisKKy0tLS0tLS0tLS0tLQorCVt1cmwgImdpdDovL2dpdC5ob3N0Lnh6LyJdCisJCWluc3RlYWRPZiA9IGhvc3QueHo6L3BhdGgvdG8vCisJCWluc3RlYWRPZiA9IHdvcms6CistLS0tLS0tLS0tLS0KKworYSBVUkwgbGlrZSAid29yazpyZXBvLmdpdCIgb3IgbGlrZSAiaG9zdC54ejovcGF0aC90by9yZXBvLmdpdCIgd2lsbCBiZQorcmV3cml0dGVuIGluIGFueSBjb250ZXh0IHRoYXQgdGFrZXMgYSBVUkwgdG8gYmUgImdpdDovL2dpdC5ob3N0Lnh6L3JlcG8uZ2l0Ii4KKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2VyLW1hbnVhbC5jb25mIGIvRG9jdW1lbnRhdGlvbi91c2VyLW1hbnVhbC5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOWIzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3VzZXItbWFudWFsLmNvbmYKQEAgLTAsMCArMSwyMSBAQAorW3RpdGxlc10KKwl1bmRlcmxpbmVzPSJfXyIsIj09IiwiLS0iLCJ+fiIsIl5eIgorCitbYXR0cmlidXRlc10KK2NhcmV0PV4KK3N0YXJ0c2I9JiM5MTsKK2VuZHNiPSYjOTM7Cit0aWxkZT0mIzEyNjsKKworW2xpbmtnaXQtaW5saW5lbWFjcm9dCis8dWxpbmsgdXJsPSJ7dGFyZ2V0fS5odG1sIj57dGFyZ2V0fXswPyh7MH0pfTwvdWxpbms+CisKK2lmZGVmOjpiYWNrZW5kLWRvY2Jvb2tbXQorIyAidW5icmVhayIgZG9jYm9vay14c2wgdjEuNjggZm9yIG1hbnBhZ2VzLiB2MS42OSB3b3JrcyB3aXRoIG9yIHdpdGhvdXQgdGhpcy4KK1tsaXN0aW5nYmxvY2tdCis8ZXhhbXBsZT48dGl0bGU+e3RpdGxlfTwvdGl0bGU+Cis8bGl0ZXJhbGxheW91dD4KK3wKKzwvbGl0ZXJhbGxheW91dD4KK3t0aXRsZSN9PC9leGFtcGxlPgorZW5kaWY6OmJhY2tlbmQtZG9jYm9va1tdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3VzZXItbWFudWFsLnR4dCBiL0RvY3VtZW50YXRpb24vdXNlci1tYW51YWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NWFlYjkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3VzZXItbWFudWFsLnR4dApAQCAtMCwwICsxLDQ1NjIgQEAKK0dpdCBVc2VyJ3MgTWFudWFsIChmb3IgdmVyc2lvbiAxLjUuMyBvciBuZXdlcikKK19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworCitHaXQgaXMgYSBmYXN0IGRpc3RyaWJ1dGVkIHJldmlzaW9uIGNvbnRyb2wgc3lzdGVtLgorCitUaGlzIG1hbnVhbCBpcyBkZXNpZ25lZCB0byBiZSByZWFkYWJsZSBieSBzb21lb25lIHdpdGggYmFzaWMgVU5JWAorY29tbWFuZC1saW5lIHNraWxscywgYnV0IG5vIHByZXZpb3VzIGtub3dsZWRnZSBvZiBnaXQuCisKKzw8cmVwb3NpdG9yaWVzLWFuZC1icmFuY2hlcz4+IGFuZCA8PGV4cGxvcmluZy1naXQtaGlzdG9yeT4+IGV4cGxhaW4gaG93Cit0byBmZXRjaCBhbmQgc3R1ZHkgYSBwcm9qZWN0IHVzaW5nIGdpdC0tcmVhZCB0aGVzZSBjaGFwdGVycyB0byBsZWFybiBob3cKK3RvIGJ1aWxkIGFuZCB0ZXN0IGEgcGFydGljdWxhciB2ZXJzaW9uIG9mIGEgc29mdHdhcmUgcHJvamVjdCwgc2VhcmNoIGZvcgorcmVncmVzc2lvbnMsIGFuZCBzbyBvbi4KKworUGVvcGxlIG5lZWRpbmcgdG8gZG8gYWN0dWFsIGRldmVsb3BtZW50IHdpbGwgYWxzbyB3YW50IHRvIHJlYWQKKzw8RGV2ZWxvcGluZy13aXRoLWdpdD4+IGFuZCA8PHNoYXJpbmctZGV2ZWxvcG1lbnQ+Pi4KKworRnVydGhlciBjaGFwdGVycyBjb3ZlciBtb3JlIHNwZWNpYWxpemVkIHRvcGljcy4KKworQ29tcHJlaGVuc2l2ZSByZWZlcmVuY2UgZG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgbWFuCitwYWdlcy4gIEZvciBhIGNvbW1hbmQgc3VjaCBhcyAiZ2l0IGNsb25lIiwganVzdCB1c2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIG1hbiBnaXQtY2xvbmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTZWUgYWxzbyA8PGdpdC1xdWljay1zdGFydD4+IGZvciBhIGJyaWVmIG92ZXJ2aWV3IG9mIGdpdCBjb21tYW5kcywKK3dpdGhvdXQgYW55IGV4cGxhbmF0aW9uLgorCitGaW5hbGx5LCBzZWUgPDx0b2RvPj4gZm9yIHdheXMgdGhhdCB5b3UgY2FuIGhlbHAgbWFrZSB0aGlzIG1hbnVhbCBtb3JlCitjb21wbGV0ZS4KKworCitbW3JlcG9zaXRvcmllcy1hbmQtYnJhbmNoZXNdXQorUmVwb3NpdG9yaWVzIGFuZCBCcmFuY2hlcworPT09PT09PT09PT09PT09PT09PT09PT09PQorCitbW2hvdy10by1nZXQtYS1naXQtcmVwb3NpdG9yeV1dCitIb3cgdG8gZ2V0IGEgZ2l0IHJlcG9zaXRvcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJdCB3aWxsIGJlIHVzZWZ1bCB0byBoYXZlIGEgZ2l0IHJlcG9zaXRvcnkgdG8gZXhwZXJpbWVudCB3aXRoIGFzIHlvdQorcmVhZCB0aGlzIG1hbnVhbC4KKworVGhlIGJlc3Qgd2F5IHRvIGdldCBvbmUgaXMgYnkgdXNpbmcgdGhlIGxpbmtnaXQ6Z2l0LWNsb25lWzFdIGNvbW1hbmQgdG8KK2Rvd25sb2FkIGEgY29weSBvZiBhbiBleGlzdGluZyByZXBvc2l0b3J5LiAgSWYgeW91IGRvbid0IGFscmVhZHkgaGF2ZSBhCitwcm9qZWN0IGluIG1pbmQsIGhlcmUgYXJlIHNvbWUgaW50ZXJlc3RpbmcgZXhhbXBsZXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSMgZ2l0IGl0c2VsZiAoYXBwcm94LiAxME1CIGRvd25sb2FkKToKKyQgZ2l0IGNsb25lIGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vZ2l0L2dpdC5naXQKKwkjIHRoZSBsaW51eCBrZXJuZWwgKGFwcHJveC4gMTUwTUIgZG93bmxvYWQpOgorJCBnaXQgY2xvbmUgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3RvcnZhbGRzL2xpbnV4LTIuNi5naXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgaW5pdGlhbCBjbG9uZSBtYXkgYmUgdGltZS1jb25zdW1pbmcgZm9yIGEgbGFyZ2UgcHJvamVjdCwgYnV0IHlvdQord2lsbCBvbmx5IG5lZWQgdG8gY2xvbmUgb25jZS4KKworVGhlIGNsb25lIGNvbW1hbmQgY3JlYXRlcyBhIG5ldyBkaXJlY3RvcnkgbmFtZWQgYWZ0ZXIgdGhlIHByb2plY3QgKCJnaXQiCitvciAibGludXgtMi42IiBpbiB0aGUgZXhhbXBsZXMgYWJvdmUpLiAgQWZ0ZXIgeW91IGNkIGludG8gdGhpcworZGlyZWN0b3J5LCB5b3Ugd2lsbCBzZWUgdGhhdCBpdCBjb250YWlucyBhIGNvcHkgb2YgdGhlIHByb2plY3QgZmlsZXMsCitjYWxsZWQgdGhlIDw8ZGVmX3dvcmtpbmdfdHJlZSx3b3JraW5nIHRyZWU+PiwgdG9nZXRoZXIgd2l0aCBhIHNwZWNpYWwKK3RvcC1sZXZlbCBkaXJlY3RvcnkgbmFtZWQgIi5naXQiLCB3aGljaCBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uCithYm91dCB0aGUgaGlzdG9yeSBvZiB0aGUgcHJvamVjdC4KKworW1tob3ctdG8tY2hlY2stb3V0XV0KK0hvdyB0byBjaGVjayBvdXQgYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiBhIHByb2plY3QKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworR2l0IGlzIGJlc3QgdGhvdWdodCBvZiBhcyBhIHRvb2wgZm9yIHN0b3JpbmcgdGhlIGhpc3Rvcnkgb2YgYSBjb2xsZWN0aW9uCitvZiBmaWxlcy4gIEl0IHN0b3JlcyB0aGUgaGlzdG9yeSBhcyBhIGNvbXByZXNzZWQgY29sbGVjdGlvbiBvZgoraW50ZXJyZWxhdGVkIHNuYXBzaG90cyBvZiB0aGUgcHJvamVjdCdzIGNvbnRlbnRzLiAgSW4gZ2l0IGVhY2ggc3VjaAordmVyc2lvbiBpcyBjYWxsZWQgYSA8PGRlZl9jb21taXQsY29tbWl0Pj4uCisKK1Rob3NlIHNuYXBzaG90cyBhcmVuJ3QgbmVjZXNzYXJpbHkgYWxsIGFycmFuZ2VkIGluIGEgc2luZ2xlIGxpbmUgZnJvbQorb2xkZXN0IHRvIG5ld2VzdDsgaW5zdGVhZCwgd29yayBtYXkgc2ltdWx0YW5lb3VzbHkgcHJvY2VlZCBhbG9uZworcGFyYWxsZWwgbGluZXMgb2YgZGV2ZWxvcG1lbnQsIGNhbGxlZCA8PGRlZl9icmFuY2gsYnJhbmNoZXM+Piwgd2hpY2ggbWF5CittZXJnZSBhbmQgZGl2ZXJnZS4KKworQSBzaW5nbGUgZ2l0IHJlcG9zaXRvcnkgY2FuIHRyYWNrIGRldmVsb3BtZW50IG9uIG11bHRpcGxlIGJyYW5jaGVzLiAgSXQKK2RvZXMgdGhpcyBieSBrZWVwaW5nIGEgbGlzdCBvZiA8PGRlZl9oZWFkLGhlYWRzPj4gd2hpY2ggcmVmZXJlbmNlIHRoZQorbGF0ZXN0IGNvbW1pdCBvbiBlYWNoIGJyYW5jaDsgdGhlIGxpbmtnaXQ6Z2l0LWJyYW5jaFsxXSBjb21tYW5kIHNob3dzCit5b3UgdGhlIGxpc3Qgb2YgYnJhbmNoIGhlYWRzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGJyYW5jaAorKiBtYXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIGZyZXNobHkgY2xvbmVkIHJlcG9zaXRvcnkgY29udGFpbnMgYSBzaW5nbGUgYnJhbmNoIGhlYWQsIGJ5IGRlZmF1bHQKK25hbWVkICJtYXN0ZXIiLCB3aXRoIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBpbml0aWFsaXplZCB0byB0aGUgc3RhdGUgb2YKK3RoZSBwcm9qZWN0IHJlZmVycmVkIHRvIGJ5IHRoYXQgYnJhbmNoIGhlYWQuCisKK01vc3QgcHJvamVjdHMgYWxzbyB1c2UgPDxkZWZfdGFnLHRhZ3M+Pi4gIFRhZ3MsIGxpa2UgaGVhZHMsIGFyZQorcmVmZXJlbmNlcyBpbnRvIHRoZSBwcm9qZWN0J3MgaGlzdG9yeSwgYW5kIGNhbiBiZSBsaXN0ZWQgdXNpbmcgdGhlCitsaW5rZ2l0OmdpdC10YWdbMV0gY29tbWFuZDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCB0YWcgLWwKK3YyLjYuMTEKK3YyLjYuMTEtdHJlZQordjIuNi4xMgordjIuNi4xMi1yYzIKK3YyLjYuMTItcmMzCit2Mi42LjEyLXJjNAordjIuNi4xMi1yYzUKK3YyLjYuMTItcmM2Cit2Mi42LjEzCisuLi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUYWdzIGFyZSBleHBlY3RlZCB0byBhbHdheXMgcG9pbnQgYXQgdGhlIHNhbWUgdmVyc2lvbiBvZiBhIHByb2plY3QsCit3aGlsZSBoZWFkcyBhcmUgZXhwZWN0ZWQgdG8gYWR2YW5jZSBhcyBkZXZlbG9wbWVudCBwcm9ncmVzc2VzLgorCitDcmVhdGUgYSBuZXcgYnJhbmNoIGhlYWQgcG9pbnRpbmcgdG8gb25lIG9mIHRoZXNlIHZlcnNpb25zIGFuZCBjaGVjayBpdAorb3V0IHVzaW5nIGxpbmtnaXQ6Z2l0LWNoZWNrb3V0WzFdOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC1iIG5ldyB2Mi42LjEzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRoZW4gcmVmbGVjdHMgdGhlIGNvbnRlbnRzIHRoYXQgdGhlIHByb2plY3QgaGFkCit3aGVuIGl0IHdhcyB0YWdnZWQgdjIuNi4xMywgYW5kIGxpbmtnaXQ6Z2l0LWJyYW5jaFsxXSBzaG93cyB0d28KK2JyYW5jaGVzLCB3aXRoIGFuIGFzdGVyaXNrIG1hcmtpbmcgdGhlIGN1cnJlbnRseSBjaGVja2VkLW91dCBicmFuY2g6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYnJhbmNoCisgIG1hc3RlcgorKiBuZXcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiB5b3UgZGVjaWRlIHRoYXQgeW91J2QgcmF0aGVyIHNlZSB2ZXJzaW9uIDIuNi4xNywgeW91IGNhbiBtb2RpZnkKK3RoZSBjdXJyZW50IGJyYW5jaCB0byBwb2ludCBhdCB2Mi42LjE3IGluc3RlYWQsIHdpdGgKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCByZXNldCAtLWhhcmQgdjIuNi4xNworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdGUgdGhhdCBpZiB0aGUgY3VycmVudCBicmFuY2ggaGVhZCB3YXMgeW91ciBvbmx5IHJlZmVyZW5jZSB0byBhCitwYXJ0aWN1bGFyIHBvaW50IGluIGhpc3RvcnksIHRoZW4gcmVzZXR0aW5nIHRoYXQgYnJhbmNoIG1heSBsZWF2ZSB5b3UKK3dpdGggbm8gd2F5IHRvIGZpbmQgdGhlIGhpc3RvcnkgaXQgdXNlZCB0byBwb2ludCB0bzsgc28gdXNlIHRoaXMgY29tbWFuZAorY2FyZWZ1bGx5LgorCitbW3VuZGVyc3RhbmRpbmctY29tbWl0c11dCitVbmRlcnN0YW5kaW5nIEhpc3Rvcnk6IENvbW1pdHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFdmVyeSBjaGFuZ2UgaW4gdGhlIGhpc3Rvcnkgb2YgYSBwcm9qZWN0IGlzIHJlcHJlc2VudGVkIGJ5IGEgY29tbWl0LgorVGhlIGxpbmtnaXQ6Z2l0LXNob3dbMV0gY29tbWFuZCBzaG93cyB0aGUgbW9zdCByZWNlbnQgY29tbWl0IG9uIHRoZQorY3VycmVudCBicmFuY2g6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdworY29tbWl0IDE3Y2Y3ODE2NjFlNmQzOGY3MzdmMTVmNTNhYjU1MmYxZTk1OTYwZDcKK0F1dGhvcjogTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQHBwYzk3MC5vc2RsLm9yZy4obm9uZSk+CitEYXRlOiAgIFR1ZSBBcHIgMTkgMTQ6MTE6MDYgMjAwNSAtMDcwMAorCisgICAgUmVtb3ZlIGR1cGxpY2F0ZSBnZXRlbnYoREJfRU5WSVJPTk1FTlQpIGNhbGwKKworICAgIE5vdGVkIGJ5IFRvbnkgTHVjay4KKworZGlmZiAtLWdpdCBhL2luaXQtZGIuYyBiL2luaXQtZGIuYworaW5kZXggNjU4OThmYS4uYjAwMmRjNiAxMDA2NDQKKy0tLSBhL2luaXQtZGIuYworKysrIGIvaW5pdC1kYi5jCitAQCAtNyw3ICs3LDcgQEAKKyAKKyBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisgeworLQljaGFyICpzaGExX2RpciA9IGdldGVudihEQl9FTlZJUk9OTUVOVCksICpwYXRoOworKwljaGFyICpzaGExX2RpciwgKnBhdGg7CisgCWludCBsZW4sIGk7CisgCisgCWlmIChta2RpcigiLmdpdCIsIDA3NTUpIDwgMCkgeworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FzIHlvdSBjYW4gc2VlLCBhIGNvbW1pdCBzaG93cyB3aG8gbWFkZSB0aGUgbGF0ZXN0IGNoYW5nZSwgd2hhdCB0aGV5CitkaWQsIGFuZCB3aHkuCisKK0V2ZXJ5IGNvbW1pdCBoYXMgYSA0MC1oZXhkaWdpdCBpZCwgc29tZXRpbWVzIGNhbGxlZCB0aGUgIm9iamVjdCBuYW1lIiBvciB0aGUKKyJTSEExIGlkIiwgc2hvd24gb24gdGhlIGZpcnN0IGxpbmUgb2YgdGhlICJnaXQgc2hvdyIgb3V0cHV0LiAgWW91IGNhbiB1c3VhbGx5CityZWZlciB0byBhIGNvbW1pdCBieSBhIHNob3J0ZXIgbmFtZSwgc3VjaCBhcyBhIHRhZyBvciBhIGJyYW5jaCBuYW1lLCBidXQgdGhpcworbG9uZ2VyIG5hbWUgY2FuIGFsc28gYmUgdXNlZnVsLiAgTW9zdCBpbXBvcnRhbnRseSwgaXQgaXMgYSBnbG9iYWxseSB1bmlxdWUKK25hbWUgZm9yIHRoaXMgY29tbWl0OiBzbyBpZiB5b3UgdGVsbCBzb21lYm9keSBlbHNlIHRoZSBvYmplY3QgbmFtZSAoZm9yCitleGFtcGxlIGluIGVtYWlsKSwgdGhlbiB5b3UgYXJlIGd1YXJhbnRlZWQgdGhhdCBuYW1lIHdpbGwgcmVmZXIgdG8gdGhlIHNhbWUKK2NvbW1pdCBpbiB0aGVpciByZXBvc2l0b3J5IHRoYXQgaXQgZG9lcyBpbiB5b3VycyAoYXNzdW1pbmcgdGhlaXIgcmVwb3NpdG9yeQoraGFzIHRoYXQgY29tbWl0IGF0IGFsbCkuICBTaW5jZSB0aGUgb2JqZWN0IG5hbWUgaXMgY29tcHV0ZWQgYXMgYSBoYXNoIG92ZXIgdGhlCitjb250ZW50cyBvZiB0aGUgY29tbWl0LCB5b3UgYXJlIGd1YXJhbnRlZWQgdGhhdCB0aGUgY29tbWl0IGNhbiBuZXZlciBjaGFuZ2UKK3dpdGhvdXQgaXRzIG5hbWUgYWxzbyBjaGFuZ2luZy4KKworSW4gZmFjdCwgaW4gPDxnaXQtY29uY2VwdHM+PiB3ZSBzaGFsbCBzZWUgdGhhdCBldmVyeXRoaW5nIHN0b3JlZCBpbiBnaXQKK2hpc3RvcnksIGluY2x1ZGluZyBmaWxlIGRhdGEgYW5kIGRpcmVjdG9yeSBjb250ZW50cywgaXMgc3RvcmVkIGluIGFuIG9iamVjdAord2l0aCBhIG5hbWUgdGhhdCBpcyBhIGhhc2ggb2YgaXRzIGNvbnRlbnRzLgorCitbW3VuZGVyc3RhbmRpbmctcmVhY2hhYmlsaXR5XV0KK1VuZGVyc3RhbmRpbmcgaGlzdG9yeTogY29tbWl0cywgcGFyZW50cywgYW5kIHJlYWNoYWJpbGl0eQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0V2ZXJ5IGNvbW1pdCAoZXhjZXB0IHRoZSB2ZXJ5IGZpcnN0IGNvbW1pdCBpbiBhIHByb2plY3QpIGFsc28gaGFzIGEKK3BhcmVudCBjb21taXQgd2hpY2ggc2hvd3Mgd2hhdCBoYXBwZW5lZCBiZWZvcmUgdGhpcyBjb21taXQuCitGb2xsb3dpbmcgdGhlIGNoYWluIG9mIHBhcmVudHMgd2lsbCBldmVudHVhbGx5IHRha2UgeW91IGJhY2sgdG8gdGhlCitiZWdpbm5pbmcgb2YgdGhlIHByb2plY3QuCisKK0hvd2V2ZXIsIHRoZSBjb21taXRzIGRvIG5vdCBmb3JtIGEgc2ltcGxlIGxpc3Q7IGdpdCBhbGxvd3MgbGluZXMgb2YKK2RldmVsb3BtZW50IHRvIGRpdmVyZ2UgYW5kIHRoZW4gcmVjb252ZXJnZSwgYW5kIHRoZSBwb2ludCB3aGVyZSB0d28KK2xpbmVzIG9mIGRldmVsb3BtZW50IHJlY29udmVyZ2UgaXMgY2FsbGVkIGEgIm1lcmdlIi4gIFRoZSBjb21taXQKK3JlcHJlc2VudGluZyBhIG1lcmdlIGNhbiB0aGVyZWZvcmUgaGF2ZSBtb3JlIHRoYW4gb25lIHBhcmVudCwgd2l0aAorZWFjaCBwYXJlbnQgcmVwcmVzZW50aW5nIHRoZSBtb3N0IHJlY2VudCBjb21taXQgb24gb25lIG9mIHRoZSBsaW5lcworb2YgZGV2ZWxvcG1lbnQgbGVhZGluZyB0byB0aGF0IHBvaW50LgorCitUaGUgYmVzdCB3YXkgdG8gc2VlIGhvdyB0aGlzIHdvcmtzIGlzIHVzaW5nIHRoZSBsaW5rZ2l0OmdpdGtbMV0KK2NvbW1hbmQ7IHJ1bm5pbmcgZ2l0ayBub3cgb24gYSBnaXQgcmVwb3NpdG9yeSBhbmQgbG9va2luZyBmb3IgbWVyZ2UKK2NvbW1pdHMgd2lsbCBoZWxwIHVuZGVyc3RhbmQgaG93IHRoZSBnaXQgb3JnYW5pemVzIGhpc3RvcnkuCisKK0luIHRoZSBmb2xsb3dpbmcsIHdlIHNheSB0aGF0IGNvbW1pdCBYIGlzICJyZWFjaGFibGUiIGZyb20gY29tbWl0IFkKK2lmIGNvbW1pdCBYIGlzIGFuIGFuY2VzdG9yIG9mIGNvbW1pdCBZLiAgRXF1aXZhbGVudGx5LCB5b3UgY291bGQgc2F5Cit0aGF0IFkgaXMgYSBkZXNjZW5kYW50IG9mIFgsIG9yIHRoYXQgdGhlcmUgaXMgYSBjaGFpbiBvZiBwYXJlbnRzCitsZWFkaW5nIGZyb20gY29tbWl0IFkgdG8gY29tbWl0IFguCisKK1tbaGlzdG9yeS1kaWFncmFtc11dCitVbmRlcnN0YW5kaW5nIGhpc3Rvcnk6IEhpc3RvcnkgZGlhZ3JhbXMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitXZSB3aWxsIHNvbWV0aW1lcyByZXByZXNlbnQgZ2l0IGhpc3RvcnkgdXNpbmcgZGlhZ3JhbXMgbGlrZSB0aGUgb25lCitiZWxvdy4gIENvbW1pdHMgYXJlIHNob3duIGFzICJvIiwgYW5kIHRoZSBsaW5rcyBiZXR3ZWVuIHRoZW0gd2l0aAorbGluZXMgZHJhd24gd2l0aCAtIC8gYW5kIFwuICBUaW1lIGdvZXMgbGVmdCB0byByaWdodDoKKworCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICAgICAgIG8tLW8tLW8gPC0tIEJyYW5jaCBBCisgICAgICAgIC8KKyBvLS1vLS1vIDwtLSBtYXN0ZXIKKyAgICAgICAgXAorICAgICAgICAgby0tby0tbyA8LS0gQnJhbmNoIEIKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCitJZiB3ZSBuZWVkIHRvIHRhbGsgYWJvdXQgYSBwYXJ0aWN1bGFyIGNvbW1pdCwgdGhlIGNoYXJhY3RlciAibyIgbWF5CitiZSByZXBsYWNlZCB3aXRoIGFub3RoZXIgbGV0dGVyIG9yIG51bWJlci4KKworW1t3aGF0LWlzLWEtYnJhbmNoXV0KK1VuZGVyc3RhbmRpbmcgaGlzdG9yeTogV2hhdCBpcyBhIGJyYW5jaD8KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworV2hlbiB3ZSBuZWVkIHRvIGJlIHByZWNpc2UsIHdlIHdpbGwgdXNlIHRoZSB3b3JkICJicmFuY2giIHRvIG1lYW4gYSBsaW5lCitvZiBkZXZlbG9wbWVudCwgYW5kICJicmFuY2ggaGVhZCIgKG9yIGp1c3QgImhlYWQiKSB0byBtZWFuIGEgcmVmZXJlbmNlCit0byB0aGUgbW9zdCByZWNlbnQgY29tbWl0IG9uIGEgYnJhbmNoLiAgSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSBicmFuY2gKK2hlYWQgbmFtZWQgIkEiIGlzIGEgcG9pbnRlciB0byBvbmUgcGFydGljdWxhciBjb21taXQsIGJ1dCB3ZSByZWZlciB0bwordGhlIGxpbmUgb2YgdGhyZWUgY29tbWl0cyBsZWFkaW5nIHVwIHRvIHRoYXQgcG9pbnQgYXMgYWxsIGJlaW5nIHBhcnQgb2YKKyJicmFuY2ggQSIuCisKK0hvd2V2ZXIsIHdoZW4gbm8gY29uZnVzaW9uIHdpbGwgcmVzdWx0LCB3ZSBvZnRlbiBqdXN0IHVzZSB0aGUgdGVybQorImJyYW5jaCIgYm90aCBmb3IgYnJhbmNoZXMgYW5kIGZvciBicmFuY2ggaGVhZHMuCisKK1tbbWFuaXB1bGF0aW5nLWJyYW5jaGVzXV0KK01hbmlwdWxhdGluZyBicmFuY2hlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NyZWF0aW5nLCBkZWxldGluZywgYW5kIG1vZGlmeWluZyBicmFuY2hlcyBpcyBxdWljayBhbmQgZWFzeTsgaGVyZSdzCithIHN1bW1hcnkgb2YgdGhlIGNvbW1hbmRzOgorCitnaXQgYnJhbmNoOjoKKwlsaXN0IGFsbCBicmFuY2hlcworZ2l0IGJyYW5jaCA8YnJhbmNoPjo6CisJY3JlYXRlIGEgbmV3IGJyYW5jaCBuYW1lZCA8YnJhbmNoPiwgcmVmZXJlbmNpbmcgdGhlIHNhbWUKKwlwb2ludCBpbiBoaXN0b3J5IGFzIHRoZSBjdXJyZW50IGJyYW5jaAorZ2l0IGJyYW5jaCA8YnJhbmNoPiA8c3RhcnQtcG9pbnQ+OjoKKwljcmVhdGUgYSBuZXcgYnJhbmNoIG5hbWVkIDxicmFuY2g+LCByZWZlcmVuY2luZworCTxzdGFydC1wb2ludD4sIHdoaWNoIG1heSBiZSBzcGVjaWZpZWQgYW55IHdheSB5b3UgbGlrZSwKKwlpbmNsdWRpbmcgdXNpbmcgYSBicmFuY2ggbmFtZSBvciBhIHRhZyBuYW1lCitnaXQgYnJhbmNoIC1kIDxicmFuY2g+OjoKKwlkZWxldGUgdGhlIGJyYW5jaCA8YnJhbmNoPjsgaWYgdGhlIGJyYW5jaCB5b3UgYXJlIGRlbGV0aW5nCisJcG9pbnRzIHRvIGEgY29tbWl0IHdoaWNoIGlzIG5vdCByZWFjaGFibGUgZnJvbSB0aGUgY3VycmVudAorCWJyYW5jaCwgdGhpcyBjb21tYW5kIHdpbGwgZmFpbCB3aXRoIGEgd2FybmluZy4KK2dpdCBicmFuY2ggLUQgPGJyYW5jaD46OgorCWV2ZW4gaWYgdGhlIGJyYW5jaCBwb2ludHMgdG8gYSBjb21taXQgbm90IHJlYWNoYWJsZQorCWZyb20gdGhlIGN1cnJlbnQgYnJhbmNoLCB5b3UgbWF5IGtub3cgdGhhdCB0aGF0IGNvbW1pdAorCWlzIHN0aWxsIHJlYWNoYWJsZSBmcm9tIHNvbWUgb3RoZXIgYnJhbmNoIG9yIHRhZy4gIEluIHRoYXQKKwljYXNlIGl0IGlzIHNhZmUgdG8gdXNlIHRoaXMgY29tbWFuZCB0byBmb3JjZSBnaXQgdG8gZGVsZXRlCisJdGhlIGJyYW5jaC4KK2dpdCBjaGVja291dCA8YnJhbmNoPjo6CisJbWFrZSB0aGUgY3VycmVudCBicmFuY2ggPGJyYW5jaD4sIHVwZGF0aW5nIHRoZSB3b3JraW5nCisJZGlyZWN0b3J5IHRvIHJlZmxlY3QgdGhlIHZlcnNpb24gcmVmZXJlbmNlZCBieSA8YnJhbmNoPgorZ2l0IGNoZWNrb3V0IC1iIDxuZXc+IDxzdGFydC1wb2ludD46OgorCWNyZWF0ZSBhIG5ldyBicmFuY2ggPG5ldz4gcmVmZXJlbmNpbmcgPHN0YXJ0LXBvaW50PiwgYW5kCisJY2hlY2sgaXQgb3V0LgorCitUaGUgc3BlY2lhbCBzeW1ib2wgIkhFQUQiIGNhbiBhbHdheXMgYmUgdXNlZCB0byByZWZlciB0byB0aGUgY3VycmVudAorYnJhbmNoLiAgSW4gZmFjdCwgZ2l0IHVzZXMgYSBmaWxlIG5hbWVkICJIRUFEIiBpbiB0aGUgLmdpdCBkaXJlY3RvcnkgdG8KK3JlbWVtYmVyIHdoaWNoIGJyYW5jaCBpcyBjdXJyZW50OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgY2F0IC5naXQvSEVBRAorcmVmOiByZWZzL2hlYWRzL21hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1tbZGV0YWNoZWQtaGVhZF1dCitFeGFtaW5pbmcgYW4gb2xkIHZlcnNpb24gd2l0aG91dCBjcmVhdGluZyBhIG5ldyBicmFuY2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZ2l0LWNoZWNrb3V0IGNvbW1hbmQgbm9ybWFsbHkgZXhwZWN0cyBhIGJyYW5jaCBoZWFkLCBidXQgd2lsbCBhbHNvCithY2NlcHQgYW4gYXJiaXRyYXJ5IGNvbW1pdDsgZm9yIGV4YW1wbGUsIHlvdSBjYW4gY2hlY2sgb3V0IHRoZSBjb21taXQKK3JlZmVyZW5jZWQgYnkgYSB0YWc6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgdjIuNi4xNworTm90ZTogbW92aW5nIHRvICJ2Mi42LjE3IiB3aGljaCBpc24ndCBhIGxvY2FsIGJyYW5jaAorSWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGJyYW5jaCBmcm9tIHRoaXMgY2hlY2tvdXQsIHlvdSBtYXkgZG8gc28KKyhub3cgb3IgbGF0ZXIpIGJ5IHVzaW5nIC1iIHdpdGggdGhlIGNoZWNrb3V0IGNvbW1hbmQgYWdhaW4uIEV4YW1wbGU6CisgIGdpdCBjaGVja291dCAtYiA8bmV3X2JyYW5jaF9uYW1lPgorSEVBRCBpcyBub3cgYXQgNDI3YWJmYS4uLiBMaW51eCB2Mi42LjE3CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIEhFQUQgdGhlbiByZWZlcnMgdG8gdGhlIFNIQTEgb2YgdGhlIGNvbW1pdCBpbnN0ZWFkIG9mIHRvIGEgYnJhbmNoLAorYW5kIGdpdCBicmFuY2ggc2hvd3MgdGhhdCB5b3UgYXJlIG5vIGxvbmdlciBvbiBhIGJyYW5jaDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGNhdCAuZ2l0L0hFQUQKKzQyN2FiZmEyOGFmZWRmZmFkZmNhOWRkOGIwNjdlYjZkMzZiYWM1M2YKKyQgZ2l0IGJyYW5jaAorKiAobm8gYnJhbmNoKQorICBtYXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbiB0aGlzIGNhc2Ugd2Ugc2F5IHRoYXQgdGhlIEhFQUQgaXMgImRldGFjaGVkIi4KKworVGhpcyBpcyBhbiBlYXN5IHdheSB0byBjaGVjayBvdXQgYSBwYXJ0aWN1bGFyIHZlcnNpb24gd2l0aG91dCBoYXZpbmcgdG8KK21ha2UgdXAgYSBuYW1lIGZvciB0aGUgbmV3IGJyYW5jaC4gICBZb3UgY2FuIHN0aWxsIGNyZWF0ZSBhIG5ldyBicmFuY2gKKyhvciB0YWcpIGZvciB0aGlzIHZlcnNpb24gbGF0ZXIgaWYgeW91IGRlY2lkZSB0by4KKworW1tleGFtaW5pbmctcmVtb3RlLWJyYW5jaGVzXV0KK0V4YW1pbmluZyBicmFuY2hlcyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlICJtYXN0ZXIiIGJyYW5jaCB0aGF0IHdhcyBjcmVhdGVkIGF0IHRoZSB0aW1lIHlvdSBjbG9uZWQgaXMgYSBjb3B5CitvZiB0aGUgSEVBRCBpbiB0aGUgcmVwb3NpdG9yeSB0aGF0IHlvdSBjbG9uZWQgZnJvbS4gIFRoYXQgcmVwb3NpdG9yeQorbWF5IGFsc28gaGF2ZSBoYWQgb3RoZXIgYnJhbmNoZXMsIHRob3VnaCwgYW5kIHlvdXIgbG9jYWwgcmVwb3NpdG9yeQora2VlcHMgYnJhbmNoZXMgd2hpY2ggdHJhY2sgZWFjaCBvZiB0aG9zZSByZW1vdGUgYnJhbmNoZXMsIHdoaWNoIHlvdQorY2FuIHZpZXcgdXNpbmcgdGhlICItciIgb3B0aW9uIHRvIGxpbmtnaXQ6Z2l0LWJyYW5jaFsxXToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBicmFuY2ggLXIKKyAgb3JpZ2luL0hFQUQKKyAgb3JpZ2luL2h0bWwKKyAgb3JpZ2luL21haW50CisgIG9yaWdpbi9tYW4KKyAgb3JpZ2luL21hc3RlcgorICBvcmlnaW4vbmV4dAorICBvcmlnaW4vcHUKKyAgb3JpZ2luL3RvZG8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3UgY2Fubm90IGNoZWNrIG91dCB0aGVzZSByZW1vdGUtdHJhY2tpbmcgYnJhbmNoZXMsIGJ1dCB5b3UgY2FuCitleGFtaW5lIHRoZW0gb24gYSBicmFuY2ggb2YgeW91ciBvd24sIGp1c3QgYXMgeW91IHdvdWxkIGEgdGFnOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC1iIG15LXRvZG8tY29weSBvcmlnaW4vdG9kbworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdGUgdGhhdCB0aGUgbmFtZSAib3JpZ2luIiBpcyBqdXN0IHRoZSBuYW1lIHRoYXQgZ2l0IHVzZXMgYnkgZGVmYXVsdAordG8gcmVmZXIgdG8gdGhlIHJlcG9zaXRvcnkgdGhhdCB5b3UgY2xvbmVkIGZyb20uCisKK1tbaG93LWdpdC1zdG9yZXMtcmVmZXJlbmNlc11dCitOYW1pbmcgYnJhbmNoZXMsIHRhZ3MsIGFuZCBvdGhlciByZWZlcmVuY2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JyYW5jaGVzLCByZW1vdGUtdHJhY2tpbmcgYnJhbmNoZXMsIGFuZCB0YWdzIGFyZSBhbGwgcmVmZXJlbmNlcyB0bworY29tbWl0cy4gIEFsbCByZWZlcmVuY2VzIGFyZSBuYW1lZCB3aXRoIGEgc2xhc2gtc2VwYXJhdGVkIHBhdGggbmFtZQorc3RhcnRpbmcgd2l0aCAicmVmcyI7IHRoZSBuYW1lcyB3ZSd2ZSBiZWVuIHVzaW5nIHNvIGZhciBhcmUgYWN0dWFsbHkKK3Nob3J0aGFuZDoKKworCS0gVGhlIGJyYW5jaCAidGVzdCIgaXMgc2hvcnQgZm9yICJyZWZzL2hlYWRzL3Rlc3QiLgorCS0gVGhlIHRhZyAidjIuNi4xOCIgaXMgc2hvcnQgZm9yICJyZWZzL3RhZ3MvdjIuNi4xOCIuCisJLSAib3JpZ2luL21hc3RlciIgaXMgc2hvcnQgZm9yICJyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlciIuCisKK1RoZSBmdWxsIG5hbWUgaXMgb2NjYXNpb25hbGx5IHVzZWZ1bCBpZiwgZm9yIGV4YW1wbGUsIHRoZXJlIGV2ZXIKK2V4aXN0cyBhIHRhZyBhbmQgYSBicmFuY2ggd2l0aCB0aGUgc2FtZSBuYW1lLgorCisoTmV3bHkgY3JlYXRlZCByZWZzIGFyZSBhY3R1YWxseSBzdG9yZWQgaW4gdGhlIC5naXQvcmVmcyBkaXJlY3RvcnksCit1bmRlciB0aGUgcGF0aCBnaXZlbiBieSB0aGVpciBuYW1lLiAgSG93ZXZlciwgZm9yIGVmZmljaWVuY3kgcmVhc29ucwordGhleSBtYXkgYWxzbyBiZSBwYWNrZWQgdG9nZXRoZXIgaW4gYSBzaW5nbGUgZmlsZTsgc2VlCitsaW5rZ2l0OmdpdC1wYWNrLXJlZnNbMV0pLgorCitBcyBhbm90aGVyIHVzZWZ1bCBzaG9ydGN1dCwgdGhlICJIRUFEIiBvZiBhIHJlcG9zaXRvcnkgY2FuIGJlIHJlZmVycmVkCit0byBqdXN0IHVzaW5nIHRoZSBuYW1lIG9mIHRoYXQgcmVwb3NpdG9yeS4gIFNvLCBmb3IgZXhhbXBsZSwgIm9yaWdpbiIKK2lzIHVzdWFsbHkgYSBzaG9ydGN1dCBmb3IgdGhlIEhFQUQgYnJhbmNoIGluIHRoZSByZXBvc2l0b3J5ICJvcmlnaW4iLgorCitGb3IgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgcGF0aHMgd2hpY2ggZ2l0IGNoZWNrcyBmb3IgcmVmZXJlbmNlcywgYW5kCit0aGUgb3JkZXIgaXQgdXNlcyB0byBkZWNpZGUgd2hpY2ggdG8gY2hvb3NlIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlCityZWZlcmVuY2VzIHdpdGggdGhlIHNhbWUgc2hvcnRoYW5kIG5hbWUsIHNlZSB0aGUgIlNQRUNJRllJTkcKK1JFVklTSU9OUyIgc2VjdGlvbiBvZiBsaW5rZ2l0OmdpdC1yZXYtcGFyc2VbMV0uCisKK1tbVXBkYXRpbmctYS1yZXBvc2l0b3J5LXdpdGgtZ2l0LWZldGNoXV0KK1VwZGF0aW5nIGEgcmVwb3NpdG9yeSB3aXRoIGdpdCBmZXRjaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0V2ZW50dWFsbHkgdGhlIGRldmVsb3BlciBjbG9uZWQgZnJvbSB3aWxsIGRvIGFkZGl0aW9uYWwgd29yayBpbiBoZXIKK3JlcG9zaXRvcnksIGNyZWF0aW5nIG5ldyBjb21taXRzIGFuZCBhZHZhbmNpbmcgdGhlIGJyYW5jaGVzIHRvIHBvaW50CithdCB0aGUgbmV3IGNvbW1pdHMuCisKK1RoZSBjb21tYW5kICJnaXQgZmV0Y2giLCB3aXRoIG5vIGFyZ3VtZW50cywgd2lsbCB1cGRhdGUgYWxsIG9mIHRoZQorcmVtb3RlLXRyYWNraW5nIGJyYW5jaGVzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBmb3VuZCBpbiBoZXIKK3JlcG9zaXRvcnkuICBJdCB3aWxsIG5vdCB0b3VjaCBhbnkgb2YgeW91ciBvd24gYnJhbmNoZXMtLW5vdCBldmVuIHRoZQorIm1hc3RlciIgYnJhbmNoIHRoYXQgd2FzIGNyZWF0ZWQgZm9yIHlvdSBvbiBjbG9uZS4KKworW1tmZXRjaGluZy1icmFuY2hlc11dCitGZXRjaGluZyBicmFuY2hlcyBmcm9tIG90aGVyIHJlcG9zaXRvcmllcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWW91IGNhbiBhbHNvIHRyYWNrIGJyYW5jaGVzIGZyb20gcmVwb3NpdG9yaWVzIG90aGVyIHRoYW4gdGhlIG9uZSB5b3UKK2Nsb25lZCBmcm9tLCB1c2luZyBsaW5rZ2l0OmdpdC1yZW1vdGVbMV06CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHJlbW90ZSBhZGQgbGludXgtbmZzIGdpdDovL2xpbnV4LW5mcy5vcmcvcHViL25mcy0yLjYuZ2l0CiskIGdpdCBmZXRjaCBsaW51eC1uZnMKKyogcmVmcy9yZW1vdGVzL2xpbnV4LW5mcy9tYXN0ZXI6IHN0b3JpbmcgYnJhbmNoICdtYXN0ZXInIC4uLgorICBjb21taXQ6IGJmODFiNDYKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmV3IHJlbW90ZS10cmFja2luZyBicmFuY2hlcyB3aWxsIGJlIHN0b3JlZCB1bmRlciB0aGUgc2hvcnRoYW5kIG5hbWUKK3RoYXQgeW91IGdhdmUgImdpdCByZW1vdGUgYWRkIiwgaW4gdGhpcyBjYXNlIGxpbnV4LW5mczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYnJhbmNoIC1yCitsaW51eC1uZnMvbWFzdGVyCitvcmlnaW4vbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHlvdSBydW4gImdpdCBmZXRjaCA8cmVtb3RlPiIgbGF0ZXIsIHRoZSB0cmFja2luZyBicmFuY2hlcyBmb3IgdGhlCituYW1lZCA8cmVtb3RlPiB3aWxsIGJlIHVwZGF0ZWQuCisKK0lmIHlvdSBleGFtaW5lIHRoZSBmaWxlIC5naXQvY29uZmlnLCB5b3Ugd2lsbCBzZWUgdGhhdCBnaXQgaGFzIGFkZGVkCithIG5ldyBzdGFuemE6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgY2F0IC5naXQvY29uZmlnCisuLi4KK1tyZW1vdGUgImxpbnV4LW5mcyJdCisJdXJsID0gZ2l0Oi8vbGludXgtbmZzLm9yZy9wdWIvbmZzLTIuNi5naXQKKwlmZXRjaCA9ICtyZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL2xpbnV4LW5mcy8qCisuLi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBpcyB3aGF0IGNhdXNlcyBnaXQgdG8gdHJhY2sgdGhlIHJlbW90ZSdzIGJyYW5jaGVzOyB5b3UgbWF5IG1vZGlmeQorb3IgZGVsZXRlIHRoZXNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBieSBlZGl0aW5nIC5naXQvY29uZmlnIHdpdGggYQordGV4dCBlZGl0b3IuICAoU2VlIHRoZSAiQ09ORklHVVJBVElPTiBGSUxFIiBzZWN0aW9uIG9mCitsaW5rZ2l0OmdpdC1jb25maWdbMV0gZm9yIGRldGFpbHMuKQorCitbW2V4cGxvcmluZy1naXQtaGlzdG9yeV1dCitFeHBsb3JpbmcgZ2l0IGhpc3RvcnkKKz09PT09PT09PT09PT09PT09PT09PQorCitHaXQgaXMgYmVzdCB0aG91Z2h0IG9mIGFzIGEgdG9vbCBmb3Igc3RvcmluZyB0aGUgaGlzdG9yeSBvZiBhCitjb2xsZWN0aW9uIG9mIGZpbGVzLiAgSXQgZG9lcyB0aGlzIGJ5IHN0b3JpbmcgY29tcHJlc3NlZCBzbmFwc2hvdHMgb2YKK3RoZSBjb250ZW50cyBvZiBhIGZpbGUgaGllcmFyY2h5LCB0b2dldGhlciB3aXRoICJjb21taXRzIiB3aGljaCBzaG93Cit0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZXNlIHNuYXBzaG90cy4KKworR2l0IHByb3ZpZGVzIGV4dHJlbWVseSBmbGV4aWJsZSBhbmQgZmFzdCB0b29scyBmb3IgZXhwbG9yaW5nIHRoZQoraGlzdG9yeSBvZiBhIHByb2plY3QuCisKK1dlIHN0YXJ0IHdpdGggb25lIHNwZWNpYWxpemVkIHRvb2wgdGhhdCBpcyB1c2VmdWwgZm9yIGZpbmRpbmcgdGhlCitjb21taXQgdGhhdCBpbnRyb2R1Y2VkIGEgYnVnIGludG8gYSBwcm9qZWN0LgorCitbW3VzaW5nLWJpc2VjdF1dCitIb3cgdG8gdXNlIGJpc2VjdCB0byBmaW5kIGEgcmVncmVzc2lvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU3VwcG9zZSB2ZXJzaW9uIDIuNi4xOCBvZiB5b3VyIHByb2plY3Qgd29ya2VkLCBidXQgdGhlIHZlcnNpb24gYXQKKyJtYXN0ZXIiIGNyYXNoZXMuICBTb21ldGltZXMgdGhlIGJlc3Qgd2F5IHRvIGZpbmQgdGhlIGNhdXNlIG9mIHN1Y2ggYQorcmVncmVzc2lvbiBpcyB0byBwZXJmb3JtIGEgYnJ1dGUtZm9yY2Ugc2VhcmNoIHRocm91Z2ggdGhlIHByb2plY3QncworaGlzdG9yeSB0byBmaW5kIHRoZSBwYXJ0aWN1bGFyIGNvbW1pdCB0aGF0IGNhdXNlZCB0aGUgcHJvYmxlbS4gIFRoZQorbGlua2dpdDpnaXQtYmlzZWN0WzFdIGNvbW1hbmQgY2FuIGhlbHAgeW91IGRvIHRoaXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGJpc2VjdCBzdGFydAorJCBnaXQgYmlzZWN0IGdvb2QgdjIuNi4xOAorJCBnaXQgYmlzZWN0IGJhZCBtYXN0ZXIKK0Jpc2VjdGluZzogMzUzNyByZXZpc2lvbnMgbGVmdCB0byB0ZXN0IGFmdGVyIHRoaXMKK1s2NTkzNGE5YTAyOGI4OGU4M2UyYjBmOGIzNjYxOGZlNTAzMzQ5ZjhlXSBCTE9DSzogTWFrZSBVU0Igc3RvcmFnZSBkZXBlbmQgb24gU0NTSSByYXRoZXIgdGhhbiBzZWxlY3RpbmcgaXQgW3RyeSAjNl0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgeW91IHJ1biAiZ2l0IGJyYW5jaCIgYXQgdGhpcyBwb2ludCwgeW91J2xsIHNlZSB0aGF0IGdpdCBoYXMKK3RlbXBvcmFyaWx5IG1vdmVkIHlvdSB0byBhIG5ldyBicmFuY2ggbmFtZWQgImJpc2VjdCIuICBUaGlzIGJyYW5jaAorcG9pbnRzIHRvIGEgY29tbWl0ICh3aXRoIGNvbW1pdCBpZCA2NTkzNC4uLikgdGhhdCBpcyByZWFjaGFibGUgZnJvbQorIm1hc3RlciIgYnV0IG5vdCBmcm9tIHYyLjYuMTguICBDb21waWxlIGFuZCB0ZXN0IGl0LCBhbmQgc2VlIHdoZXRoZXIKK2l0IGNyYXNoZXMuICBBc3N1bWUgaXQgZG9lcyBjcmFzaC4gIFRoZW46CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGJpc2VjdCBiYWQKK0Jpc2VjdGluZzogMTc2OSByZXZpc2lvbnMgbGVmdCB0byB0ZXN0IGFmdGVyIHRoaXMKK1s3ZWZmODJjOGIxNTExMDE3YWU2MDVmMGM5OWFjMjc1YTdlMjFiODY3XSBpMmMtY29yZTogRHJvcCB1c2VsZXNzIGJpdG1hc2tpbmdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NoZWNrcyBvdXQgYW4gb2xkZXIgdmVyc2lvbi4gIENvbnRpbnVlIGxpa2UgdGhpcywgdGVsbGluZyBnaXQgYXQgZWFjaAorc3RhZ2Ugd2hldGhlciB0aGUgdmVyc2lvbiBpdCBnaXZlcyB5b3UgaXMgZ29vZCBvciBiYWQsIGFuZCBub3RpY2UKK3RoYXQgdGhlIG51bWJlciBvZiByZXZpc2lvbnMgbGVmdCB0byB0ZXN0IGlzIGN1dCBhcHByb3hpbWF0ZWx5IGluCitoYWxmIGVhY2ggdGltZS4KKworQWZ0ZXIgYWJvdXQgMTMgdGVzdHMgKGluIHRoaXMgY2FzZSksIGl0IHdpbGwgb3V0cHV0IHRoZSBjb21taXQgaWQgb2YKK3RoZSBndWlsdHkgY29tbWl0LiAgWW91IGNhbiB0aGVuIGV4YW1pbmUgdGhlIGNvbW1pdCB3aXRoCitsaW5rZ2l0OmdpdC1zaG93WzFdLCBmaW5kIG91dCB3aG8gd3JvdGUgaXQsIGFuZCBtYWlsIHRoZW0geW91ciBidWcKK3JlcG9ydCB3aXRoIHRoZSBjb21taXQgaWQuICBGaW5hbGx5LCBydW4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYmlzZWN0IHJlc2V0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RvIHJldHVybiB5b3UgdG8gdGhlIGJyYW5jaCB5b3Ugd2VyZSBvbiBiZWZvcmUgYW5kIGRlbGV0ZSB0aGUKK3RlbXBvcmFyeSAiYmlzZWN0IiBicmFuY2guCisKK05vdGUgdGhhdCB0aGUgdmVyc2lvbiB3aGljaCBnaXQtYmlzZWN0IGNoZWNrcyBvdXQgZm9yIHlvdSBhdCBlYWNoCitwb2ludCBpcyBqdXN0IGEgc3VnZ2VzdGlvbiwgYW5kIHlvdSdyZSBmcmVlIHRvIHRyeSBhIGRpZmZlcmVudAordmVyc2lvbiBpZiB5b3UgdGhpbmsgaXQgd291bGQgYmUgYSBnb29kIGlkZWEuICBGb3IgZXhhbXBsZSwKK29jY2FzaW9uYWxseSB5b3UgbWF5IGxhbmQgb24gYSBjb21taXQgdGhhdCBicm9rZSBzb21ldGhpbmcgdW5yZWxhdGVkOworcnVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGJpc2VjdCB2aXN1YWxpemUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggd2lsbCBydW4gZ2l0ayBhbmQgbGFiZWwgdGhlIGNvbW1pdCBpdCBjaG9zZSB3aXRoIGEgbWFya2VyIHRoYXQKK3NheXMgImJpc2VjdCIuICBDaG9zZSBhIHNhZmUtbG9va2luZyBjb21taXQgbmVhcmJ5LCBub3RlIGl0cyBjb21taXQKK2lkLCBhbmQgY2hlY2sgaXQgb3V0IHdpdGg6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHJlc2V0IC0taGFyZCBmYjQ3ZGRiMmRiLi4uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RoZW4gdGVzdCwgcnVuICJiaXNlY3QgZ29vZCIgb3IgImJpc2VjdCBiYWQiIGFzIGFwcHJvcHJpYXRlLCBhbmQKK2NvbnRpbnVlLgorCitbW25hbWluZy1jb21taXRzXV0KK05hbWluZyBjb21taXRzCistLS0tLS0tLS0tLS0tLQorCitXZSBoYXZlIHNlZW4gc2V2ZXJhbCB3YXlzIG9mIG5hbWluZyBjb21taXRzIGFscmVhZHk6CisKKwktIDQwLWhleGRpZ2l0IG9iamVjdCBuYW1lCisJLSBicmFuY2ggbmFtZTogcmVmZXJzIHRvIHRoZSBjb21taXQgYXQgdGhlIGhlYWQgb2YgdGhlIGdpdmVuCisJICBicmFuY2gKKwktIHRhZyBuYW1lOiByZWZlcnMgdG8gdGhlIGNvbW1pdCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiB0YWcKKwkgICh3ZSd2ZSBzZWVuIGJyYW5jaGVzIGFuZCB0YWdzIGFyZSBzcGVjaWFsIGNhc2VzIG9mCisJICA8PGhvdy1naXQtc3RvcmVzLXJlZmVyZW5jZXMscmVmZXJlbmNlcz4+KS4KKwktIEhFQUQ6IHJlZmVycyB0byB0aGUgaGVhZCBvZiB0aGUgY3VycmVudCBicmFuY2gKKworVGhlcmUgYXJlIG1hbnkgbW9yZTsgc2VlIHRoZSAiU1BFQ0lGWUlORyBSRVZJU0lPTlMiIHNlY3Rpb24gb2YgdGhlCitsaW5rZ2l0OmdpdC1yZXYtcGFyc2VbMV0gbWFuIHBhZ2UgZm9yIHRoZSBjb21wbGV0ZSBsaXN0IG9mIHdheXMgdG8KK25hbWUgcmV2aXNpb25zLiAgU29tZSBleGFtcGxlczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdyBmYjQ3ZGRiMiAjIHRoZSBmaXJzdCBmZXcgY2hhcmFjdGVycyBvZiB0aGUgb2JqZWN0IG5hbWUKKwkJICAgICMgYXJlIHVzdWFsbHkgZW5vdWdoIHRvIHNwZWNpZnkgaXQgdW5pcXVlbHkKKyQgZ2l0IHNob3cgSEVBRF4gICAgIyB0aGUgcGFyZW50IG9mIHRoZSBIRUFEIGNvbW1pdAorJCBnaXQgc2hvdyBIRUFEXl4gICAjIHRoZSBncmFuZHBhcmVudAorJCBnaXQgc2hvdyBIRUFEfjQgICAjIHRoZSBncmVhdC1ncmVhdC1ncmFuZHBhcmVudAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZWNhbGwgdGhhdCBtZXJnZSBjb21taXRzIG1heSBoYXZlIG1vcmUgdGhhbiBvbmUgcGFyZW50OyBieSBkZWZhdWx0LAorXiBhbmQgfiBmb2xsb3cgdGhlIGZpcnN0IHBhcmVudCBsaXN0ZWQgaW4gdGhlIGNvbW1pdCwgYnV0IHlvdSBjYW4KK2Fsc28gY2hvb3NlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93IEhFQUReMSAgICMgc2hvdyB0aGUgZmlyc3QgcGFyZW50IG9mIEhFQUQKKyQgZ2l0IHNob3cgSEVBRF4yICAgIyBzaG93IHRoZSBzZWNvbmQgcGFyZW50IG9mIEhFQUQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW4gYWRkaXRpb24gdG8gSEVBRCwgdGhlcmUgYXJlIHNldmVyYWwgb3RoZXIgc3BlY2lhbCBuYW1lcyBmb3IKK2NvbW1pdHM6CisKK01lcmdlcyAodG8gYmUgZGlzY3Vzc2VkIGxhdGVyKSwgYXMgd2VsbCBhcyBvcGVyYXRpb25zIHN1Y2ggYXMKK2dpdC1yZXNldCwgd2hpY2ggY2hhbmdlIHRoZSBjdXJyZW50bHkgY2hlY2tlZC1vdXQgY29tbWl0LCBnZW5lcmFsbHkKK3NldCBPUklHX0hFQUQgdG8gdGhlIHZhbHVlIEhFQUQgaGFkIGJlZm9yZSB0aGUgY3VycmVudCBvcGVyYXRpb24uCisKK1RoZSBnaXQtZmV0Y2ggb3BlcmF0aW9uIGFsd2F5cyBzdG9yZXMgdGhlIGhlYWQgb2YgdGhlIGxhc3QgZmV0Y2hlZAorYnJhbmNoIGluIEZFVENIX0hFQUQuICBGb3IgZXhhbXBsZSwgaWYgeW91IHJ1biBnaXQgZmV0Y2ggd2l0aG91dAorc3BlY2lmeWluZyBhIGxvY2FsIGJyYW5jaCBhcyB0aGUgdGFyZ2V0IG9mIHRoZSBvcGVyYXRpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZmV0Y2ggZ2l0Oi8vZXhhbXBsZS5jb20vcHJvai5naXQgdGhlaXJicmFuY2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGhlIGZldGNoZWQgY29tbWl0cyB3aWxsIHN0aWxsIGJlIGF2YWlsYWJsZSBmcm9tIEZFVENIX0hFQUQuCisKK1doZW4gd2UgZGlzY3VzcyBtZXJnZXMgd2UnbGwgYWxzbyBzZWUgdGhlIHNwZWNpYWwgbmFtZSBNRVJHRV9IRUFELAord2hpY2ggcmVmZXJzIHRvIHRoZSBvdGhlciBicmFuY2ggdGhhdCB3ZSdyZSBtZXJnaW5nIGluIHRvIHRoZSBjdXJyZW50CiticmFuY2guCisKK1RoZSBsaW5rZ2l0OmdpdC1yZXYtcGFyc2VbMV0gY29tbWFuZCBpcyBhIGxvdy1sZXZlbCBjb21tYW5kIHRoYXQgaXMKK29jY2FzaW9uYWxseSB1c2VmdWwgZm9yIHRyYW5zbGF0aW5nIHNvbWUgbmFtZSBmb3IgYSBjb21taXQgdG8gdGhlIG9iamVjdAorbmFtZSBmb3IgdGhhdCBjb21taXQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHJldi1wYXJzZSBvcmlnaW4KK2UwNWRiMGZkNGYzMWRkZTcwMDVmMDc1YTg0Zjk2YjM2MGQwNTk4NGIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworW1tjcmVhdGluZy10YWdzXV0KK0NyZWF0aW5nIHRhZ3MKKy0tLS0tLS0tLS0tLS0KKworV2UgY2FuIGFsc28gY3JlYXRlIGEgdGFnIHRvIHJlZmVyIHRvIGEgcGFydGljdWxhciBjb21taXQ7IGFmdGVyCitydW5uaW5nCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHRhZyBzdGFibGUtMSAxYjJlMWQ2M2ZmCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1lvdSBjYW4gdXNlIHN0YWJsZS0xIHRvIHJlZmVyIHRvIHRoZSBjb21taXQgMWIyZTFkNjNmZi4KKworVGhpcyBjcmVhdGVzIGEgImxpZ2h0d2VpZ2h0IiB0YWcuICBJZiB5b3Ugd291bGQgYWxzbyBsaWtlIHRvIGluY2x1ZGUgYQorY29tbWVudCB3aXRoIHRoZSB0YWcsIGFuZCBwb3NzaWJseSBzaWduIGl0IGNyeXB0b2dyYXBoaWNhbGx5LCB0aGVuIHlvdQorc2hvdWxkIGNyZWF0ZSBhIHRhZyBvYmplY3QgaW5zdGVhZDsgc2VlIHRoZSBsaW5rZ2l0OmdpdC10YWdbMV0gbWFuIHBhZ2UKK2ZvciBkZXRhaWxzLgorCitbW2Jyb3dzaW5nLXJldmlzaW9uc11dCitCcm93c2luZyByZXZpc2lvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgbGlua2dpdDpnaXQtbG9nWzFdIGNvbW1hbmQgY2FuIHNob3cgbGlzdHMgb2YgY29tbWl0cy4gIE9uIGl0cworb3duLCBpdCBzaG93cyBhbGwgY29tbWl0cyByZWFjaGFibGUgZnJvbSB0aGUgcGFyZW50IGNvbW1pdDsgYnV0IHlvdQorY2FuIGFsc28gbWFrZSBtb3JlIHNwZWNpZmljIHJlcXVlc3RzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBsb2cgdjIuNS4uCSMgY29tbWl0cyBzaW5jZSAobm90IHJlYWNoYWJsZSBmcm9tKSB2Mi41CiskIGdpdCBsb2cgdGVzdC4ubWFzdGVyCSMgY29tbWl0cyByZWFjaGFibGUgZnJvbSBtYXN0ZXIgYnV0IG5vdCB0ZXN0CiskIGdpdCBsb2cgbWFzdGVyLi50ZXN0CSMgLi4ucmVhY2hhYmxlIGZyb20gdGVzdCBidXQgbm90IG1hc3RlcgorJCBnaXQgbG9nIG1hc3Rlci4uLnRlc3QJIyAuLi5yZWFjaGFibGUgZnJvbSBlaXRoZXIgdGVzdCBvciBtYXN0ZXIsCisJCQkjICAgIGJ1dCBub3QgYm90aAorJCBnaXQgbG9nIC0tc2luY2U9IjIgd2Vla3MgYWdvIiAjIGNvbW1pdHMgZnJvbSB0aGUgbGFzdCAyIHdlZWtzCiskIGdpdCBsb2cgTWFrZWZpbGUgICAgICAjIGNvbW1pdHMgd2hpY2ggbW9kaWZ5IE1ha2VmaWxlCiskIGdpdCBsb2cgZnMvCQkjIC4uLiB3aGljaCBtb2RpZnkgYW55IGZpbGUgdW5kZXIgZnMvCiskIGdpdCBsb2cgLVMnZm9vKCknCSMgY29tbWl0cyB3aGljaCBhZGQgb3IgcmVtb3ZlIGFueSBmaWxlIGRhdGEKKwkJCSMgbWF0Y2hpbmcgdGhlIHN0cmluZyAnZm9vKCknCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FuZCBvZiBjb3Vyc2UgeW91IGNhbiBjb21iaW5lIGFsbCBvZiB0aGVzZTsgdGhlIGZvbGxvd2luZyBmaW5kcworY29tbWl0cyBzaW5jZSB2Mi41IHdoaWNoIHRvdWNoIHRoZSBNYWtlZmlsZSBvciBhbnkgZmlsZSB1bmRlciBmczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbG9nIHYyLjUuLiBNYWtlZmlsZSBmcy8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWW91IGNhbiBhbHNvIGFzayBnaXQgbG9nIHRvIHNob3cgcGF0Y2hlczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbG9nIC1wCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NlZSB0aGUgIi0tcHJldHR5IiBvcHRpb24gaW4gdGhlIGxpbmtnaXQ6Z2l0LWxvZ1sxXSBtYW4gcGFnZSBmb3IgbW9yZQorZGlzcGxheSBvcHRpb25zLgorCitOb3RlIHRoYXQgZ2l0IGxvZyBzdGFydHMgd2l0aCB0aGUgbW9zdCByZWNlbnQgY29tbWl0IGFuZCB3b3JrcworYmFja3dhcmRzIHRocm91Z2ggdGhlIHBhcmVudHM7IGhvd2V2ZXIsIHNpbmNlIGdpdCBoaXN0b3J5IGNhbiBjb250YWluCittdWx0aXBsZSBpbmRlcGVuZGVudCBsaW5lcyBvZiBkZXZlbG9wbWVudCwgdGhlIHBhcnRpY3VsYXIgb3JkZXIgdGhhdAorY29tbWl0cyBhcmUgbGlzdGVkIGluIG1heSBiZSBzb21ld2hhdCBhcmJpdHJhcnkuCisKK1tbZ2VuZXJhdGluZy1kaWZmc11dCitHZW5lcmF0aW5nIGRpZmZzCistLS0tLS0tLS0tLS0tLS0tCisKK1lvdSBjYW4gZ2VuZXJhdGUgZGlmZnMgYmV0d2VlbiBhbnkgdHdvIHZlcnNpb25zIHVzaW5nCitsaW5rZ2l0OmdpdC1kaWZmWzFdOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmIG1hc3Rlci4udGVzdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGF0IHdpbGwgcHJvZHVjZSB0aGUgZGlmZiBiZXR3ZWVuIHRoZSB0aXBzIG9mIHRoZSB0d28gYnJhbmNoZXMuICBJZgoreW91J2QgcHJlZmVyIHRvIGZpbmQgdGhlIGRpZmYgZnJvbSB0aGVpciBjb21tb24gYW5jZXN0b3IgdG8gdGVzdCwgeW91CitjYW4gdXNlIHRocmVlIGRvdHMgaW5zdGVhZCBvZiB0d286CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgbWFzdGVyLi4udGVzdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTb21ldGltZXMgd2hhdCB5b3Ugd2FudCBpbnN0ZWFkIGlzIGEgc2V0IG9mIHBhdGNoZXM7IGZvciB0aGlzIHlvdSBjYW4KK3VzZSBsaW5rZ2l0OmdpdC1mb3JtYXQtcGF0Y2hbMV06CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGZvcm1hdC1wYXRjaCBtYXN0ZXIuLnRlc3QKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2lsbCBnZW5lcmF0ZSBhIGZpbGUgd2l0aCBhIHBhdGNoIGZvciBlYWNoIGNvbW1pdCByZWFjaGFibGUgZnJvbSB0ZXN0CitidXQgbm90IGZyb20gbWFzdGVyLgorCitbW3ZpZXdpbmctb2xkLWZpbGUtdmVyc2lvbnNdXQorVmlld2luZyBvbGQgZmlsZSB2ZXJzaW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3UgY2FuIGFsd2F5cyB2aWV3IGFuIG9sZCB2ZXJzaW9uIG9mIGEgZmlsZSBieSBqdXN0IGNoZWNraW5nIG91dCB0aGUKK2NvcnJlY3QgcmV2aXNpb24gZmlyc3QuICBCdXQgc29tZXRpbWVzIGl0IGlzIG1vcmUgY29udmVuaWVudCB0byBiZQorYWJsZSB0byB2aWV3IGFuIG9sZCB2ZXJzaW9uIG9mIGEgc2luZ2xlIGZpbGUgd2l0aG91dCBjaGVja2luZworYW55dGhpbmcgb3V0OyB0aGlzIGNvbW1hbmQgZG9lcyB0aGF0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93IHYyLjU6ZnMvbG9ja3MuYworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCZWZvcmUgdGhlIGNvbG9uIG1heSBiZSBhbnl0aGluZyB0aGF0IG5hbWVzIGEgY29tbWl0LCBhbmQgYWZ0ZXIgaXQKK21heSBiZSBhbnkgcGF0aCB0byBhIGZpbGUgdHJhY2tlZCBieSBnaXQuCisKK1tbaGlzdG9yeS1leGFtcGxlc11dCitFeGFtcGxlcworLS0tLS0tLS0KKworW1tjb3VudGluZy1jb21taXRzLW9uLWEtYnJhbmNoXV0KK0NvdW50aW5nIHRoZSBudW1iZXIgb2YgY29tbWl0cyBvbiBhIGJyYW5jaAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1N1cHBvc2UgeW91IHdhbnQgdG8ga25vdyBob3cgbWFueSBjb21taXRzIHlvdSd2ZSBtYWRlIG9uICJteWJyYW5jaCIKK3NpbmNlIGl0IGRpdmVyZ2VkIGZyb20gIm9yaWdpbiI6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZyAtLXByZXR0eT1vbmVsaW5lIG9yaWdpbi4ubXlicmFuY2ggfCB3YyAtbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IG9mdGVuIHNlZSB0aGlzIHNvcnQgb2YgdGhpbmcgZG9uZSB3aXRoIHRoZQorbG93ZXItbGV2ZWwgY29tbWFuZCBsaW5rZ2l0OmdpdC1yZXYtbGlzdFsxXSwgd2hpY2gganVzdCBsaXN0cyB0aGUgU0hBMSdzCitvZiBhbGwgdGhlIGdpdmVuIGNvbW1pdHM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHJldi1saXN0IG9yaWdpbi4ubXlicmFuY2ggfCB3YyAtbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitbW2NoZWNraW5nLWZvci1lcXVhbC1icmFuY2hlc11dCitDaGVjayB3aGV0aGVyIHR3byBicmFuY2hlcyBwb2ludCBhdCB0aGUgc2FtZSBoaXN0b3J5Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1N1cHBvc2UgeW91IHdhbnQgdG8gY2hlY2sgd2hldGhlciB0d28gYnJhbmNoZXMgcG9pbnQgYXQgdGhlIHNhbWUgcG9pbnQKK2luIGhpc3RvcnkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgb3JpZ2luLi5tYXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2lsbCB0ZWxsIHlvdSB3aGV0aGVyIHRoZSBjb250ZW50cyBvZiB0aGUgcHJvamVjdCBhcmUgdGhlIHNhbWUgYXQgdGhlCit0d28gYnJhbmNoZXM7IGluIHRoZW9yeSwgaG93ZXZlciwgaXQncyBwb3NzaWJsZSB0aGF0IHRoZSBzYW1lIHByb2plY3QKK2NvbnRlbnRzIGNvdWxkIGhhdmUgYmVlbiBhcnJpdmVkIGF0IGJ5IHR3byBkaWZmZXJlbnQgaGlzdG9yaWNhbAorcm91dGVzLiAgWW91IGNvdWxkIGNvbXBhcmUgdGhlIG9iamVjdCBuYW1lczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcmV2LWxpc3Qgb3JpZ2luCitlMDVkYjBmZDRmMzFkZGU3MDA1ZjA3NWE4NGY5NmIzNjBkMDU5ODRiCiskIGdpdCByZXYtbGlzdCBtYXN0ZXIKK2UwNWRiMGZkNGYzMWRkZTcwMDVmMDc1YTg0Zjk2YjM2MGQwNTk4NGIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT3IgeW91IGNvdWxkIHJlY2FsbCB0aGF0IHRoZSAuLi4gb3BlcmF0b3Igc2VsZWN0cyBhbGwgY29tbWl0cworY29udGFpbmVkIHJlYWNoYWJsZSBmcm9tIGVpdGhlciBvbmUgcmVmZXJlbmNlIG9yIHRoZSBvdGhlciBidXQgbm90Citib3RoOiBzbworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBsb2cgb3JpZ2luLi4ubWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgcmV0dXJuIG5vIGNvbW1pdHMgd2hlbiB0aGUgdHdvIGJyYW5jaGVzIGFyZSBlcXVhbC4KKworW1tmaW5kaW5nLXRhZ2dlZC1kZXNjZW5kYW50c11dCitGaW5kIGZpcnN0IHRhZ2dlZCB2ZXJzaW9uIGluY2x1ZGluZyBhIGdpdmVuIGZpeAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworU3VwcG9zZSB5b3Uga25vdyB0aGF0IHRoZSBjb21taXQgZTA1ZGIwZmQgZml4ZWQgYSBjZXJ0YWluIHByb2JsZW0uCitZb3UnZCBsaWtlIHRvIGZpbmQgdGhlIGVhcmxpZXN0IHRhZ2dlZCByZWxlYXNlIHRoYXQgY29udGFpbnMgdGhhdAorZml4LgorCitPZiBjb3Vyc2UsIHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lIGFuc3dlci0taWYgdGhlIGhpc3RvcnkgYnJhbmNoZWQKK2FmdGVyIGNvbW1pdCBlMDVkYjBmZCwgdGhlbiB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSAiZWFybGllc3QiIHRhZ2dlZAorcmVsZWFzZXMuCisKK1lvdSBjb3VsZCBqdXN0IHZpc3VhbGx5IGluc3BlY3QgdGhlIGNvbW1pdHMgc2luY2UgZTA1ZGIwZmQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0ayBlMDVkYjBmZC4uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK09yIHlvdSBjYW4gdXNlIGxpbmtnaXQ6Z2l0LW5hbWUtcmV2WzFdLCB3aGljaCB3aWxsIGdpdmUgdGhlIGNvbW1pdCBhCituYW1lIGJhc2VkIG9uIGFueSB0YWcgaXQgZmluZHMgcG9pbnRpbmcgdG8gb25lIG9mIHRoZSBjb21taXQncworZGVzY2VuZGFudHM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IG5hbWUtcmV2IC0tdGFncyBlMDVkYjBmZAorZTA1ZGIwZmQgdGFncy92MS41LjAtcmMxXjB+MjMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGxpbmtnaXQ6Z2l0LWRlc2NyaWJlWzFdIGNvbW1hbmQgZG9lcyB0aGUgb3Bwb3NpdGUsIG5hbWluZyB0aGUKK3JldmlzaW9uIHVzaW5nIGEgdGFnIG9uIHdoaWNoIHRoZSBnaXZlbiBjb21taXQgaXMgYmFzZWQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRlc2NyaWJlIGUwNWRiMGZkCit2MS41LjAtcmMwLTI2MC1nZTA1ZGIwZgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitidXQgdGhhdCBtYXkgc29tZXRpbWVzIGhlbHAgeW91IGd1ZXNzIHdoaWNoIHRhZ3MgbWlnaHQgY29tZSBhZnRlciB0aGUKK2dpdmVuIGNvbW1pdC4KKworSWYgeW91IGp1c3Qgd2FudCB0byB2ZXJpZnkgd2hldGhlciBhIGdpdmVuIHRhZ2dlZCB2ZXJzaW9uIGNvbnRhaW5zIGEKK2dpdmVuIGNvbW1pdCwgeW91IGNvdWxkIHVzZSBsaW5rZ2l0OmdpdC1tZXJnZS1iYXNlWzFdOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBtZXJnZS1iYXNlIGUwNWRiMGZkIHYxLjUuMC1yYzEKK2UwNWRiMGZkNGYzMWRkZTcwMDVmMDc1YTg0Zjk2YjM2MGQwNTk4NGIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIG1lcmdlLWJhc2UgY29tbWFuZCBmaW5kcyBhIGNvbW1vbiBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4gY29tbWl0cywKK2FuZCBhbHdheXMgcmV0dXJucyBvbmUgb3IgdGhlIG90aGVyIGluIHRoZSBjYXNlIHdoZXJlIG9uZSBpcyBhCitkZXNjZW5kYW50IG9mIHRoZSBvdGhlcjsgc28gdGhlIGFib3ZlIG91dHB1dCBzaG93cyB0aGF0IGUwNWRiMGZkCithY3R1YWxseSBpcyBhbiBhbmNlc3RvciBvZiB2MS41LjAtcmMxLgorCitBbHRlcm5hdGl2ZWx5LCBub3RlIHRoYXQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbG9nIHYxLjUuMC1yYzEuLmUwNWRiMGZkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgcHJvZHVjZSBlbXB0eSBvdXRwdXQgaWYgYW5kIG9ubHkgaWYgdjEuNS4wLXJjMSBpbmNsdWRlcyBlMDVkYjBmZCwKK2JlY2F1c2UgaXQgb3V0cHV0cyBvbmx5IGNvbW1pdHMgdGhhdCBhcmUgbm90IHJlYWNoYWJsZSBmcm9tIHYxLjUuMC1yYzEuCisKK0FzIHlldCBhbm90aGVyIGFsdGVybmF0aXZlLCB0aGUgbGlua2dpdDpnaXQtc2hvdy1icmFuY2hbMV0gY29tbWFuZCBsaXN0cwordGhlIGNvbW1pdHMgcmVhY2hhYmxlIGZyb20gaXRzIGFyZ3VtZW50cyB3aXRoIGEgZGlzcGxheSBvbiB0aGUgbGVmdC1oYW5kCitzaWRlIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGFyZ3VtZW50cyB0aGF0IGNvbW1pdCBpcyByZWFjaGFibGUgZnJvbS4gIFNvLAoreW91IGNhbiBydW4gc29tZXRoaW5nIGxpa2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdy1icmFuY2ggZTA1ZGIwZmQgdjEuNS4wLXJjMCB2MS41LjAtcmMxIHYxLjUuMC1yYzIKKyEgW2UwNWRiMGZkXSBGaXggd2FybmluZ3MgaW4gc2hhMV9maWxlLmMgLSB1c2UgQzk5IHByaW50ZiBmb3JtYXQgaWYKK2F2YWlsYWJsZQorICEgW3YxLjUuMC1yYzBdIEdJVCB2MS41LjAgcHJldmlldworICAhIFt2MS41LjAtcmMxXSBHSVQgdjEuNS4wLXJjMQorICAgISBbdjEuNS4wLXJjMl0gR0lUIHYxLjUuMC1yYzIKKy4uLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0aGVuIHNlYXJjaCBmb3IgYSBsaW5lIHRoYXQgbG9va3MgbGlrZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisrICsrIFtlMDVkYjBmZF0gRml4IHdhcm5pbmdzIGluIHNoYTFfZmlsZS5jIC0gdXNlIEM5OSBwcmludGYgZm9ybWF0IGlmCithdmFpbGFibGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hpY2ggc2hvd3MgdGhhdCBlMDVkYjBmZCBpcyByZWFjaGFibGUgZnJvbSBpdHNlbGYsIGZyb20gdjEuNS4wLXJjMSwgYW5kCitmcm9tIHYxLjUuMC1yYzIsIGJ1dCBub3QgZnJvbSB2MS41LjAtcmMwLgorCitbW3Nob3dpbmctY29tbWl0cy11bmlxdWUtdG8tYS1icmFuY2hdXQorU2hvd2luZyBjb21taXRzIHVuaXF1ZSB0byBhIGdpdmVuIGJyYW5jaAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitTdXBwb3NlIHlvdSB3b3VsZCBsaWtlIHRvIHNlZSBhbGwgdGhlIGNvbW1pdHMgcmVhY2hhYmxlIGZyb20gdGhlIGJyYW5jaAoraGVhZCBuYW1lZCAibWFzdGVyIiBidXQgbm90IGZyb20gYW55IG90aGVyIGhlYWQgaW4geW91ciByZXBvc2l0b3J5LgorCitXZSBjYW4gbGlzdCBhbGwgdGhlIGhlYWRzIGluIHRoaXMgcmVwb3NpdG9yeSB3aXRoCitsaW5rZ2l0OmdpdC1zaG93LXJlZlsxXToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdy1yZWYgLS1oZWFkcworYmY2MjE5NmI1ZTM2M2Q3MzM1M2E5ZGNmMDk0YzU5NTk1ZjMxNTNiNyByZWZzL2hlYWRzL2NvcmUtdHV0b3JpYWwKK2RiNzY4ZDU1MDRjMWJiNDZmNjNlZTlkNmUxNzcyYmQwNDdlMDViZjkgcmVmcy9oZWFkcy9tYWludAorYTA3MTU3YWM2MjRiMjUyNGEwNTlhMzQxNGU5OWY2ZjQ0YmViYzFlNyByZWZzL2hlYWRzL21hc3RlcgorMjRkYmMxODBlYTE0ZGMxYWViZTA5ZjE0YzhlY2YzMjAxMDY5MDYyNyByZWZzL2hlYWRzL3R1dG9yaWFsLTIKKzFlODc0ODZhZTA2NjI2YzJmMzFlYWE2M2QyNmZjMGZkNjQ2YzhhZjIgcmVmcy9oZWFkcy90dXRvcmlhbC1maXhlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXZSBjYW4gZ2V0IGp1c3QgdGhlIGJyYW5jaC1oZWFkIG5hbWVzLCBhbmQgcmVtb3ZlICJtYXN0ZXIiLCB3aXRoCit0aGUgaGVscCBvZiB0aGUgc3RhbmRhcmQgdXRpbGl0aWVzIGN1dCBhbmQgZ3JlcDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdy1yZWYgLS1oZWFkcyB8IGN1dCAtZCcgJyAtZjIgfCBncmVwIC12ICdecmVmcy9oZWFkcy9tYXN0ZXInCityZWZzL2hlYWRzL2NvcmUtdHV0b3JpYWwKK3JlZnMvaGVhZHMvbWFpbnQKK3JlZnMvaGVhZHMvdHV0b3JpYWwtMgorcmVmcy9oZWFkcy90dXRvcmlhbC1maXhlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbmQgdGhlbiB3ZSBjYW4gYXNrIHRvIHNlZSBhbGwgdGhlIGNvbW1pdHMgcmVhY2hhYmxlIGZyb20gbWFzdGVyCitidXQgbm90IGZyb20gdGhlc2Ugb3RoZXIgaGVhZHM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0ayBtYXN0ZXIgLS1ub3QgJCggZ2l0IHNob3ctcmVmIC0taGVhZHMgfCBjdXQgLWQnICcgLWYyIHwKKwkJCQlncmVwIC12ICdecmVmcy9oZWFkcy9tYXN0ZXInICkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT2J2aW91c2x5LCBlbmRsZXNzIHZhcmlhdGlvbnMgYXJlIHBvc3NpYmxlOyBmb3IgZXhhbXBsZSwgdG8gc2VlIGFsbAorY29tbWl0cyByZWFjaGFibGUgZnJvbSBzb21lIGhlYWQgYnV0IG5vdCBmcm9tIGFueSB0YWcgaW4gdGhlIHJlcG9zaXRvcnk6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0ayAkKCBnaXQgc2hvdy1yZWYgLS1oZWFkcyApIC0tbm90ICAkKCBnaXQgc2hvdy1yZWYgLS10YWdzICkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKFNlZSBsaW5rZ2l0OmdpdC1yZXYtcGFyc2VbMV0gZm9yIGV4cGxhbmF0aW9ucyBvZiBjb21taXQtc2VsZWN0aW5nCitzeW50YXggc3VjaCBhcyBgLS1ub3RgLikKKworW1ttYWtpbmctYS1yZWxlYXNlXV0KK0NyZWF0aW5nIGEgY2hhbmdlbG9nIGFuZCB0YXJiYWxsIGZvciBhIHNvZnR3YXJlIHJlbGVhc2UKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIGxpbmtnaXQ6Z2l0LWFyY2hpdmVbMV0gY29tbWFuZCBjYW4gY3JlYXRlIGEgdGFyIG9yIHppcCBhcmNoaXZlIGZyb20KK2FueSB2ZXJzaW9uIG9mIGEgcHJvamVjdDsgZm9yIGV4YW1wbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGFyY2hpdmUgLS1mb3JtYXQ9dGFyIC0tcHJlZml4PXByb2plY3QvIEhFQUQgfCBnemlwID5sYXRlc3QudGFyLmd6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgdXNlIEhFQUQgdG8gcHJvZHVjZSBhIHRhciBhcmNoaXZlIGluIHdoaWNoIGVhY2ggZmlsZW5hbWUgaXMKK3ByZWNlZGVkIGJ5ICJwcm9qZWN0LyIuCisKK0lmIHlvdSdyZSByZWxlYXNpbmcgYSBuZXcgdmVyc2lvbiBvZiBhIHNvZnR3YXJlIHByb2plY3QsIHlvdSBtYXkgd2FudAordG8gc2ltdWx0YW5lb3VzbHkgbWFrZSBhIGNoYW5nZWxvZyB0byBpbmNsdWRlIGluIHRoZSByZWxlYXNlCithbm5vdW5jZW1lbnQuCisKK0xpbnVzIFRvcnZhbGRzLCBmb3IgZXhhbXBsZSwgbWFrZXMgbmV3IGtlcm5lbCByZWxlYXNlcyBieSB0YWdnaW5nIHRoZW0sCit0aGVuIHJ1bm5pbmc6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgcmVsZWFzZS1zY3JpcHQgMi42LjEyIDIuNi4xMy1yYzYgMi42LjEzLXJjNworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3aGVyZSByZWxlYXNlLXNjcmlwdCBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGxvb2tzIGxpa2U6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMhL2Jpbi9zaAorc3RhYmxlPSIkMSIKK2xhc3Q9IiQyIgorbmV3PSIkMyIKK2VjaG8gIiMgZ2l0IHRhZyB2JG5ldyIKK2VjaG8gImdpdCBhcmNoaXZlIC0tcHJlZml4PWxpbnV4LSRuZXcvIHYkbmV3IHwgZ3ppcCAtOSA+IC4uL2xpbnV4LSRuZXcudGFyLmd6IgorZWNobyAiZ2l0IGRpZmYgdiRzdGFibGUgdiRuZXcgfCBnemlwIC05ID4gLi4vcGF0Y2gtJG5ldy5neiIKK2VjaG8gImdpdCBsb2cgLS1uby1tZXJnZXMgdiRuZXcgXnYkbGFzdCA+IC4uL0NoYW5nZUxvZy0kbmV3IgorZWNobyAiZ2l0IHNob3J0bG9nIC0tbm8tbWVyZ2VzIHYkbmV3IF52JGxhc3QgPiAuLi9TaG9ydExvZyIKK2VjaG8gImdpdCBkaWZmIC0tc3RhdCAtLXN1bW1hcnkgLU0gdiRsYXN0IHYkbmV3ID4gLi4vZGlmZnN0YXQtJG5ldyIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIHRoZW4gaGUganVzdCBjdXQtYW5kLXBhc3RlcyB0aGUgb3V0cHV0IGNvbW1hbmRzIGFmdGVyIHZlcmlmeWluZyB0aGF0Cit0aGV5IGxvb2sgT0suCisKK1tbRmluZGluZy1jb21tZW50cy13aXRoLWdpdmVuLWNvbnRlbnRdXQorRmluZGluZyBjb21taXRzIHJlZmVyZW5jaW5nIGEgZmlsZSB3aXRoIGdpdmVuIGNvbnRlbnQKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1NvbWVib2R5IGhhbmRzIHlvdSBhIGNvcHkgb2YgYSBmaWxlLCBhbmQgYXNrcyB3aGljaCBjb21taXRzIG1vZGlmaWVkIGEKK2ZpbGUgc3VjaCB0aGF0IGl0IGNvbnRhaW5lZCB0aGUgZ2l2ZW4gY29udGVudCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZQorY29tbWl0LiAgWW91IGNhbiBmaW5kIG91dCB3aXRoIHRoaXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgIGdpdCBsb2cgLS1yYXcgLS1hYmJyZXY9NDAgLS1wcmV0dHk9b25lbGluZSB8CisJZ3JlcCAtQiAxIGBnaXQgaGFzaC1vYmplY3QgZmlsZW5hbWVgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZpZ3VyaW5nIG91dCB3aHkgdGhpcyB3b3JrcyBpcyBsZWZ0IGFzIGFuIGV4ZXJjaXNlIHRvIHRoZSAoYWR2YW5jZWQpCitzdHVkZW50LiAgVGhlIGxpbmtnaXQ6Z2l0LWxvZ1sxXSwgbGlua2dpdDpnaXQtZGlmZi10cmVlWzFdLCBhbmQKK2xpbmtnaXQ6Z2l0LWhhc2gtb2JqZWN0WzFdIG1hbiBwYWdlcyBtYXkgcHJvdmUgaGVscGZ1bC4KKworW1tEZXZlbG9waW5nLXdpdGgtZ2l0XV0KK0RldmVsb3Bpbmcgd2l0aCBnaXQKKz09PT09PT09PT09PT09PT09PT0KKworW1t0ZWxsaW5nLWdpdC15b3VyLW5hbWVdXQorVGVsbGluZyBnaXQgeW91ciBuYW1lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQmVmb3JlIGNyZWF0aW5nIGFueSBjb21taXRzLCB5b3Ugc2hvdWxkIGludHJvZHVjZSB5b3Vyc2VsZiB0byBnaXQuICBUaGUKK2Vhc2llc3Qgd2F5IHRvIGRvIHNvIGlzIHRvIG1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIGxpbmVzIGFwcGVhciBpbiBhCitmaWxlIG5hbWVkIC5naXRjb25maWcgaW4geW91ciBob21lIGRpcmVjdG9yeToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbdXNlcl0KKwluYW1lID0gWW91ciBOYW1lIENvbWVzIEhlcmUKKwllbWFpbCA9IHlvdUB5b3VyZG9tYWluLmV4YW1wbGUuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKFNlZSB0aGUgIkNPTkZJR1VSQVRJT04gRklMRSIgc2VjdGlvbiBvZiBsaW5rZ2l0OmdpdC1jb25maWdbMV0gZm9yCitkZXRhaWxzIG9uIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuKQorCisKK1tbY3JlYXRpbmctYS1uZXctcmVwb3NpdG9yeV1dCitDcmVhdGluZyBhIG5ldyByZXBvc2l0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NyZWF0aW5nIGEgbmV3IHJlcG9zaXRvcnkgZnJvbSBzY3JhdGNoIGlzIHZlcnkgZWFzeToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBta2RpciBwcm9qZWN0CiskIGNkIHByb2plY3QKKyQgZ2l0IGluaXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgeW91IGhhdmUgc29tZSBpbml0aWFsIGNvbnRlbnQgKHNheSwgYSB0YXJiYWxsKToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCB0YXIgLXh6dmYgcHJvamVjdC50YXIuZ3oKKyQgY2QgcHJvamVjdAorJCBnaXQgaW5pdAorJCBnaXQgYWRkIC4gIyBpbmNsdWRlIGV2ZXJ5dGhpbmcgYmVsb3cgLi8gaW4gdGhlIGZpcnN0IGNvbW1pdDoKKyQgZ2l0IGNvbW1pdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitbW2hvdy10by1tYWtlLWEtY29tbWl0XV0KK0hvdyB0byBtYWtlIGEgY29tbWl0CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDcmVhdGluZyBhIG5ldyBjb21taXQgdGFrZXMgdGhyZWUgc3RlcHM6CisKKwkxLiBNYWtpbmcgc29tZSBjaGFuZ2VzIHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB1c2luZyB5b3VyCisJICAgZmF2b3JpdGUgZWRpdG9yLgorCTIuIFRlbGxpbmcgZ2l0IGFib3V0IHlvdXIgY2hhbmdlcy4KKwkzLiBDcmVhdGluZyB0aGUgY29tbWl0IHVzaW5nIHRoZSBjb250ZW50IHlvdSB0b2xkIGdpdCBhYm91dAorCSAgIGluIHN0ZXAgMi4KKworSW4gcHJhY3RpY2UsIHlvdSBjYW4gaW50ZXJsZWF2ZSBhbmQgcmVwZWF0IHN0ZXBzIDEgYW5kIDIgYXMgbWFueQordGltZXMgYXMgeW91IHdhbnQ6IGluIG9yZGVyIHRvIGtlZXAgdHJhY2sgb2Ygd2hhdCB5b3Ugd2FudCBjb21taXR0ZWQKK2F0IHN0ZXAgMywgZ2l0IG1haW50YWlucyBhIHNuYXBzaG90IG9mIHRoZSB0cmVlJ3MgY29udGVudHMgaW4gYQorc3BlY2lhbCBzdGFnaW5nIGFyZWEgY2FsbGVkICJ0aGUgaW5kZXguIgorCitBdCB0aGUgYmVnaW5uaW5nLCB0aGUgY29udGVudCBvZiB0aGUgaW5kZXggd2lsbCBiZSBpZGVudGljYWwgdG8KK3RoYXQgb2YgdGhlIEhFQUQuICBUaGUgY29tbWFuZCAiZ2l0IGRpZmYgLS1jYWNoZWQiLCB3aGljaCBzaG93cwordGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgSEVBRCBhbmQgdGhlIGluZGV4LCBzaG91bGQgdGhlcmVmb3JlCitwcm9kdWNlIG5vIG91dHB1dCBhdCB0aGF0IHBvaW50LgorCitNb2RpZnlpbmcgdGhlIGluZGV4IGlzIGVhc3k6CisKK1RvIHVwZGF0ZSB0aGUgaW5kZXggd2l0aCB0aGUgbmV3IGNvbnRlbnRzIG9mIGEgbW9kaWZpZWQgZmlsZSwgdXNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGFkZCBwYXRoL3RvL2ZpbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gYWRkIHRoZSBjb250ZW50cyBvZiBhIG5ldyBmaWxlIHRvIHRoZSBpbmRleCwgdXNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGFkZCBwYXRoL3RvL2ZpbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gcmVtb3ZlIGEgZmlsZSBmcm9tIHRoZSBpbmRleCBhbmQgZnJvbSB0aGUgd29ya2luZyB0cmVlLAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBybSBwYXRoL3RvL2ZpbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQWZ0ZXIgZWFjaCBzdGVwIHlvdSBjYW4gdmVyaWZ5IHRoYXQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZiAtLWNhY2hlZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbHdheXMgc2hvd3MgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgSEVBRCBhbmQgdGhlIGluZGV4IGZpbGUtLXRoaXMKK2lzIHdoYXQgeW91J2QgY29tbWl0IGlmIHlvdSBjcmVhdGVkIHRoZSBjb21taXQgbm93LS1hbmQgdGhhdAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3Nob3dzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHdvcmtpbmcgdHJlZSBhbmQgdGhlIGluZGV4IGZpbGUuCisKK05vdGUgdGhhdCAiZ2l0IGFkZCIgYWx3YXlzIGFkZHMganVzdCB0aGUgY3VycmVudCBjb250ZW50cyBvZiBhIGZpbGUKK3RvIHRoZSBpbmRleDsgZnVydGhlciBjaGFuZ2VzIHRvIHRoZSBzYW1lIGZpbGUgd2lsbCBiZSBpZ25vcmVkIHVubGVzcworeW91IHJ1biBnaXQtYWRkIG9uIHRoZSBmaWxlIGFnYWluLgorCitXaGVuIHlvdSdyZSByZWFkeSwganVzdCBydW4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY29tbWl0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FuZCBnaXQgd2lsbCBwcm9tcHQgeW91IGZvciBhIGNvbW1pdCBtZXNzYWdlIGFuZCB0aGVuIGNyZWF0ZSB0aGUgbmV3Citjb21taXQuICBDaGVjayB0byBtYWtlIHN1cmUgaXQgbG9va3MgbGlrZSB3aGF0IHlvdSBleHBlY3RlZCB3aXRoCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3cKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQXMgYSBzcGVjaWFsIHNob3J0Y3V0LAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjb21taXQgLWEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2lsbCB1cGRhdGUgdGhlIGluZGV4IHdpdGggYW55IGZpbGVzIHRoYXQgeW91J3ZlIG1vZGlmaWVkIG9yIHJlbW92ZWQKK2FuZCBjcmVhdGUgYSBjb21taXQsIGFsbCBpbiBvbmUgc3RlcC4KKworQSBudW1iZXIgb2YgY29tbWFuZHMgYXJlIHVzZWZ1bCBmb3Iga2VlcGluZyB0cmFjayBvZiB3aGF0IHlvdSdyZQorYWJvdXQgdG8gY29tbWl0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmIC0tY2FjaGVkICMgZGlmZmVyZW5jZSBiZXR3ZWVuIEhFQUQgYW5kIHRoZSBpbmRleDsgd2hhdAorCQkgICAgIyB3b3VsZCBiZSBjb21taXR0ZWQgaWYgeW91IHJhbiAiY29tbWl0IiBub3cuCiskIGdpdCBkaWZmCSAgICAjIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgaW5kZXggZmlsZSBhbmQgeW91cgorCQkgICAgIyB3b3JraW5nIGRpcmVjdG9yeTsgY2hhbmdlcyB0aGF0IHdvdWxkIG5vdAorCQkgICAgIyBiZSBpbmNsdWRlZCBpZiB5b3UgcmFuICJjb21taXQiIG5vdy4KKyQgZ2l0IGRpZmYgSEVBRAkgICAgIyBkaWZmZXJlbmNlIGJldHdlZW4gSEVBRCBhbmQgd29ya2luZyB0cmVlOyB3aGF0CisJCSAgICAjIHdvdWxkIGJlIGNvbW1pdHRlZCBpZiB5b3UgcmFuICJjb21taXQgLWEiIG5vdy4KKyQgZ2l0IHN0YXR1cwkgICAgIyBhIGJyaWVmIHBlci1maWxlIHN1bW1hcnkgb2YgdGhlIGFib3ZlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3UgY2FuIGFsc28gdXNlIGxpbmtnaXQ6Z2l0LWd1aVsxXSB0byBjcmVhdGUgY29tbWl0cywgdmlldyBjaGFuZ2VzIGluCit0aGUgaW5kZXggYW5kIHRoZSB3b3JraW5nIHRyZWUgZmlsZXMsIGFuZCBpbmRpdmlkdWFsbHkgc2VsZWN0IGRpZmYgaHVua3MKK2ZvciBpbmNsdXNpb24gaW4gdGhlIGluZGV4IChieSByaWdodC1jbGlja2luZyBvbiB0aGUgZGlmZiBodW5rIGFuZAorY2hvb3NpbmcgIlN0YWdlIEh1bmsgRm9yIENvbW1pdCIpLgorCitbW2NyZWF0aW5nLWdvb2QtY29tbWl0LW1lc3NhZ2VzXV0KK0NyZWF0aW5nIGdvb2QgY29tbWl0IG1lc3NhZ2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaG91Z2ggbm90IHJlcXVpcmVkLCBpdCdzIGEgZ29vZCBpZGVhIHRvIGJlZ2luIHRoZSBjb21taXQgbWVzc2FnZQord2l0aCBhIHNpbmdsZSBzaG9ydCAobGVzcyB0aGFuIDUwIGNoYXJhY3RlcikgbGluZSBzdW1tYXJpemluZyB0aGUKK2NoYW5nZSwgZm9sbG93ZWQgYnkgYSBibGFuayBsaW5lIGFuZCB0aGVuIGEgbW9yZSB0aG9yb3VnaAorZGVzY3JpcHRpb24uICBUb29scyB0aGF0IHR1cm4gY29tbWl0cyBpbnRvIGVtYWlsLCBmb3IgZXhhbXBsZSwgdXNlCit0aGUgZmlyc3QgbGluZSBvbiB0aGUgU3ViamVjdCBsaW5lIGFuZCB0aGUgcmVzdCBvZiB0aGUgY29tbWl0IGluIHRoZQorYm9keS4KKworW1tpZ25vcmluZy1maWxlc11dCitJZ25vcmluZyBmaWxlcworLS0tLS0tLS0tLS0tLS0KKworQSBwcm9qZWN0IHdpbGwgb2Z0ZW4gZ2VuZXJhdGUgZmlsZXMgdGhhdCB5b3UgZG8gJ25vdCcgd2FudCB0byB0cmFjayB3aXRoIGdpdC4KK1RoaXMgdHlwaWNhbGx5IGluY2x1ZGVzIGZpbGVzIGdlbmVyYXRlZCBieSBhIGJ1aWxkIHByb2Nlc3Mgb3IgdGVtcG9yYXJ5CitiYWNrdXAgZmlsZXMgbWFkZSBieSB5b3VyIGVkaXRvci4gT2YgY291cnNlLCAnbm90JyB0cmFja2luZyBmaWxlcyB3aXRoIGdpdAoraXMganVzdCBhIG1hdHRlciBvZiAnbm90JyBjYWxsaW5nICJgZ2l0IGFkZGAiIG9uIHRoZW0uIEJ1dCBpdCBxdWlja2x5IGJlY29tZXMKK2Fubm95aW5nIHRvIGhhdmUgdGhlc2UgdW50cmFja2VkIGZpbGVzIGx5aW5nIGFyb3VuZDsgZS5nLiB0aGV5IG1ha2UKKyJgZ2l0IGFkZCAuYCIgYW5kICJgZ2l0IGNvbW1pdCAtYWAiIHByYWN0aWNhbGx5IHVzZWxlc3MsIGFuZCB0aGV5IGtlZXAKK3Nob3dpbmcgdXAgaW4gdGhlIG91dHB1dCBvZiAiYGdpdCBzdGF0dXNgIi4KKworWW91IGNhbiB0ZWxsIGdpdCB0byBpZ25vcmUgY2VydGFpbiBmaWxlcyBieSBjcmVhdGluZyBhIGZpbGUgY2FsbGVkIC5naXRpZ25vcmUKK2luIHRoZSB0b3AgbGV2ZWwgb2YgeW91ciB3b3JraW5nIGRpcmVjdG9yeSwgd2l0aCBjb250ZW50cyBzdWNoIGFzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExpbmVzIHN0YXJ0aW5nIHdpdGggJyMnIGFyZSBjb25zaWRlcmVkIGNvbW1lbnRzLgorIyBJZ25vcmUgYW55IGZpbGUgbmFtZWQgZm9vLnR4dC4KK2Zvby50eHQKKyMgSWdub3JlIChnZW5lcmF0ZWQpIGh0bWwgZmlsZXMsCisqLmh0bWwKKyMgZXhjZXB0IGZvby5odG1sIHdoaWNoIGlzIG1haW50YWluZWQgYnkgaGFuZC4KKyFmb28uaHRtbAorIyBJZ25vcmUgb2JqZWN0cyBhbmQgYXJjaGl2ZXMuCisqLltvYV0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2VlIGxpbmtnaXQ6Z2l0aWdub3JlWzVdIGZvciBhIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9mIHRoZSBzeW50YXguICBZb3UgY2FuCithbHNvIHBsYWNlIC5naXRpZ25vcmUgZmlsZXMgaW4gb3RoZXIgZGlyZWN0b3JpZXMgaW4geW91ciB3b3JraW5nIHRyZWUsIGFuZCB0aGV5Cit3aWxsIGFwcGx5IHRvIHRob3NlIGRpcmVjdG9yaWVzIGFuZCB0aGVpciBzdWJkaXJlY3Rvcmllcy4gIFRoZSBgLmdpdGlnbm9yZWAKK2ZpbGVzIGNhbiBiZSBhZGRlZCB0byB5b3VyIHJlcG9zaXRvcnkgbGlrZSBhbnkgb3RoZXIgZmlsZXMgKGp1c3QgcnVuIGBnaXQgYWRkCisuZ2l0aWdub3JlYCBhbmQgYGdpdCBjb21taXRgLCBhcyB1c3VhbCksIHdoaWNoIGlzIGNvbnZlbmllbnQgd2hlbiB0aGUgZXhjbHVkZQorcGF0dGVybnMgKHN1Y2ggYXMgcGF0dGVybnMgbWF0Y2hpbmcgYnVpbGQgb3V0cHV0IGZpbGVzKSB3b3VsZCBhbHNvIG1ha2Ugc2Vuc2UKK2ZvciBvdGhlciB1c2VycyB3aG8gY2xvbmUgeW91ciByZXBvc2l0b3J5LgorCitJZiB5b3Ugd2lzaCB0aGUgZXhjbHVkZSBwYXR0ZXJucyB0byBhZmZlY3Qgb25seSBjZXJ0YWluIHJlcG9zaXRvcmllcworKGluc3RlYWQgb2YgZXZlcnkgcmVwb3NpdG9yeSBmb3IgYSBnaXZlbiBwcm9qZWN0KSwgeW91IG1heSBpbnN0ZWFkIHB1dAordGhlbSBpbiBhIGZpbGUgaW4geW91ciByZXBvc2l0b3J5IG5hbWVkIC5naXQvaW5mby9leGNsdWRlLCBvciBpbiBhbnkgZmlsZQorc3BlY2lmaWVkIGJ5IHRoZSBgY29yZS5leGNsdWRlc2ZpbGVgIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUuICBTb21lIGdpdAorY29tbWFuZHMgY2FuIGFsc28gdGFrZSBleGNsdWRlIHBhdHRlcm5zIGRpcmVjdGx5IG9uIHRoZSBjb21tYW5kIGxpbmUuCitTZWUgbGlua2dpdDpnaXRpZ25vcmVbNV0gZm9yIHRoZSBkZXRhaWxzLgorCitbW2hvdy10by1tZXJnZV1dCitIb3cgdG8gbWVyZ2UKKy0tLS0tLS0tLS0tLQorCitZb3UgY2FuIHJlam9pbiB0d28gZGl2ZXJnaW5nIGJyYW5jaGVzIG9mIGRldmVsb3BtZW50IHVzaW5nCitsaW5rZ2l0OmdpdC1tZXJnZVsxXToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbWVyZ2UgYnJhbmNobmFtZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCittZXJnZXMgdGhlIGRldmVsb3BtZW50IGluIHRoZSBicmFuY2ggImJyYW5jaG5hbWUiIGludG8gdGhlIGN1cnJlbnQKK2JyYW5jaC4gIElmIHRoZXJlIGFyZSBjb25mbGljdHMtLWZvciBleGFtcGxlLCBpZiB0aGUgc2FtZSBmaWxlIGlzCittb2RpZmllZCBpbiB0d28gZGlmZmVyZW50IHdheXMgaW4gdGhlIHJlbW90ZSBicmFuY2ggYW5kIHRoZSBsb2NhbAorYnJhbmNoLS10aGVuIHlvdSBhcmUgd2FybmVkOyB0aGUgb3V0cHV0IG1heSBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IG1lcmdlIG5leHQKKyAxMDAlICg0LzQpIGRvbmUKK0F1dG8tbWVyZ2VkIGZpbGUudHh0CitDT05GTElDVCAoY29udGVudCk6IE1lcmdlIGNvbmZsaWN0IGluIGZpbGUudHh0CitBdXRvbWF0aWMgbWVyZ2UgZmFpbGVkOyBmaXggY29uZmxpY3RzIGFuZCB0aGVuIGNvbW1pdCB0aGUgcmVzdWx0LgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDb25mbGljdCBtYXJrZXJzIGFyZSBsZWZ0IGluIHRoZSBwcm9ibGVtYXRpYyBmaWxlcywgYW5kIGFmdGVyCit5b3UgcmVzb2x2ZSB0aGUgY29uZmxpY3RzIG1hbnVhbGx5LCB5b3UgY2FuIHVwZGF0ZSB0aGUgaW5kZXgKK3dpdGggdGhlIGNvbnRlbnRzIGFuZCBydW4gZ2l0IGNvbW1pdCwgYXMgeW91IG5vcm1hbGx5IHdvdWxkIHdoZW4KK2NyZWF0aW5nIGEgbmV3IGZpbGUuCisKK0lmIHlvdSBleGFtaW5lIHRoZSByZXN1bHRpbmcgY29tbWl0IHVzaW5nIGdpdGssIHlvdSB3aWxsIHNlZSB0aGF0IGl0CitoYXMgdHdvIHBhcmVudHMsIG9uZSBwb2ludGluZyB0byB0aGUgdG9wIG9mIHRoZSBjdXJyZW50IGJyYW5jaCwgYW5kCitvbmUgdG8gdGhlIHRvcCBvZiB0aGUgb3RoZXIgYnJhbmNoLgorCitbW3Jlc29sdmluZy1hLW1lcmdlXV0KK1Jlc29sdmluZyBhIG1lcmdlCistLS0tLS0tLS0tLS0tLS0tLQorCitXaGVuIGEgbWVyZ2UgaXNuJ3QgcmVzb2x2ZWQgYXV0b21hdGljYWxseSwgZ2l0IGxlYXZlcyB0aGUgaW5kZXggYW5kCit0aGUgd29ya2luZyB0cmVlIGluIGEgc3BlY2lhbCBzdGF0ZSB0aGF0IGdpdmVzIHlvdSBhbGwgdGhlCitpbmZvcm1hdGlvbiB5b3UgbmVlZCB0byBoZWxwIHJlc29sdmUgdGhlIG1lcmdlLgorCitGaWxlcyB3aXRoIGNvbmZsaWN0cyBhcmUgbWFya2VkIHNwZWNpYWxseSBpbiB0aGUgaW5kZXgsIHNvIHVudGlsIHlvdQorcmVzb2x2ZSB0aGUgcHJvYmxlbSBhbmQgdXBkYXRlIHRoZSBpbmRleCwgbGlua2dpdDpnaXQtY29tbWl0WzFdIHdpbGwKK2ZhaWw6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbW1pdAorZmlsZS50eHQ6IG5lZWRzIG1lcmdlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Fsc28sIGxpbmtnaXQ6Z2l0LXN0YXR1c1sxXSB3aWxsIGxpc3QgdGhvc2UgZmlsZXMgYXMgInVubWVyZ2VkIiwgYW5kIHRoZQorZmlsZXMgd2l0aCBjb25mbGljdHMgd2lsbCBoYXZlIGNvbmZsaWN0IG1hcmtlcnMgYWRkZWQsIGxpa2UgdGhpczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorPDw8PDw8PCBIRUFEOmZpbGUudHh0CitIZWxsbyB3b3JsZAorPT09PT09PQorR29vZGJ5ZQorPj4+Pj4+PiA3Nzk3NmRhMzVhMTFkYjQ1ODBiODBhZTI3ZThkNjVjYWY1MjA4MDg2OmZpbGUudHh0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FsbCB5b3UgbmVlZCB0byBkbyBpcyBlZGl0IHRoZSBmaWxlcyB0byByZXNvbHZlIHRoZSBjb25mbGljdHMsIGFuZCB0aGVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGFkZCBmaWxlLnR4dAorJCBnaXQgY29tbWl0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdGUgdGhhdCB0aGUgY29tbWl0IG1lc3NhZ2Ugd2lsbCBhbHJlYWR5IGJlIGZpbGxlZCBpbiBmb3IgeW91IHdpdGgKK3NvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lcmdlLiAgTm9ybWFsbHkgeW91IGNhbiBqdXN0IHVzZSB0aGlzCitkZWZhdWx0IG1lc3NhZ2UgdW5jaGFuZ2VkLCBidXQgeW91IG1heSBhZGQgYWRkaXRpb25hbCBjb21tZW50YXJ5IG9mCit5b3VyIG93biBpZiBkZXNpcmVkLgorCitUaGUgYWJvdmUgaXMgYWxsIHlvdSBuZWVkIHRvIGtub3cgdG8gcmVzb2x2ZSBhIHNpbXBsZSBtZXJnZS4gIEJ1dCBnaXQKK2Fsc28gcHJvdmlkZXMgbW9yZSBpbmZvcm1hdGlvbiB0byBoZWxwIHJlc29sdmUgY29uZmxpY3RzOgorCitbW2NvbmZsaWN0LXJlc29sdXRpb25dXQorR2V0dGluZyBjb25mbGljdC1yZXNvbHV0aW9uIGhlbHAgZHVyaW5nIGEgbWVyZ2UKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0FsbCBvZiB0aGUgY2hhbmdlcyB0aGF0IGdpdCB3YXMgYWJsZSB0byBtZXJnZSBhdXRvbWF0aWNhbGx5IGFyZQorYWxyZWFkeSBhZGRlZCB0byB0aGUgaW5kZXggZmlsZSwgc28gbGlua2dpdDpnaXQtZGlmZlsxXSBzaG93cyBvbmx5Cit0aGUgY29uZmxpY3RzLiAgSXQgdXNlcyBhbiB1bnVzdWFsIHN5bnRheDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZgorZGlmZiAtLWNjIGZpbGUudHh0CitpbmRleCA4MDI5OTJjLDJiNjAyMDcuLjAwMDAwMDAKKy0tLSBhL2ZpbGUudHh0CisrKysgYi9maWxlLnR4dAorQEBAIC0xLDEgLTEsMSArMSw1IEBAQAorKys8PDw8PDw8IEhFQUQ6ZmlsZS50eHQKKyArSGVsbG8gd29ybGQKKysrPT09PT09PQorKyBHb29kYnllCisrKz4+Pj4+Pj4gNzc5NzZkYTM1YTExZGI0NTgwYjgwYWUyN2U4ZDY1Y2FmNTIwODA4NjpmaWxlLnR4dAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZWNhbGwgdGhhdCB0aGUgY29tbWl0IHdoaWNoIHdpbGwgYmUgY29tbWl0dGVkIGFmdGVyIHdlIHJlc29sdmUgdGhpcworY29uZmxpY3Qgd2lsbCBoYXZlIHR3byBwYXJlbnRzIGluc3RlYWQgb2YgdGhlIHVzdWFsIG9uZTogb25lIHBhcmVudAord2lsbCBiZSBIRUFELCB0aGUgdGlwIG9mIHRoZSBjdXJyZW50IGJyYW5jaDsgdGhlIG90aGVyIHdpbGwgYmUgdGhlCit0aXAgb2YgdGhlIG90aGVyIGJyYW5jaCwgd2hpY2ggaXMgc3RvcmVkIHRlbXBvcmFyaWx5IGluIE1FUkdFX0hFQUQuCisKK0R1cmluZyB0aGUgbWVyZ2UsIHRoZSBpbmRleCBob2xkcyB0aHJlZSB2ZXJzaW9ucyBvZiBlYWNoIGZpbGUuICBFYWNoIG9mCit0aGVzZSB0aHJlZSAiZmlsZSBzdGFnZXMiIHJlcHJlc2VudHMgYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiB0aGUgZmlsZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdyA6MTpmaWxlLnR4dAkjIHRoZSBmaWxlIGluIGEgY29tbW9uIGFuY2VzdG9yIG9mIGJvdGggYnJhbmNoZXMKKyQgZ2l0IHNob3cgOjI6ZmlsZS50eHQJIyB0aGUgdmVyc2lvbiBmcm9tIEhFQUQsIGJ1dCBpbmNsdWRpbmcgYW55CisJCQkjIG5vbmNvbmZsaWN0aW5nIGNoYW5nZXMgZnJvbSBNRVJHRV9IRUFECiskIGdpdCBzaG93IDozOmZpbGUudHh0CSMgdGhlIHZlcnNpb24gZnJvbSBNRVJHRV9IRUFELCBidXQgaW5jbHVkaW5nIGFueQorCQkJIyBub25jb25mbGljdGluZyBjaGFuZ2VzIGZyb20gSEVBRC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2luY2UgdGhlIHN0YWdlIDIgYW5kIHN0YWdlIDMgdmVyc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gdXBkYXRlZCB3aXRoCitub25jb25mbGljdGluZyBjaGFuZ2VzLCB0aGUgb25seSByZW1haW5pbmcgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGVtIGFyZQordGhlIGltcG9ydGFudCBvbmVzOyB0aHVzIGxpbmtnaXQ6Z2l0LWRpZmZbMV0gY2FuIHVzZSB0aGUgaW5mb3JtYXRpb24gaW4KK3RoZSBpbmRleCB0byBzaG93IG9ubHkgdGhvc2UgY29uZmxpY3RzLgorCitUaGUgZGlmZiBhYm92ZSBzaG93cyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgd29ya2luZy10cmVlIHZlcnNpb24gb2YKK2ZpbGUudHh0IGFuZCB0aGUgc3RhZ2UgMiBhbmQgc3RhZ2UgMyB2ZXJzaW9ucy4gIFNvIGluc3RlYWQgb2YgcHJlY2VkaW5nCitlYWNoIGxpbmUgYnkgYSBzaW5nbGUgIisiIG9yICItIiwgaXQgbm93IHVzZXMgdHdvIGNvbHVtbnM6IHRoZSBmaXJzdAorY29sdW1uIGlzIHVzZWQgZm9yIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGZpcnN0IHBhcmVudCBhbmQgdGhlIHdvcmtpbmcKK2RpcmVjdG9yeSBjb3B5LCBhbmQgdGhlIHNlY29uZCBmb3IgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgc2Vjb25kIHBhcmVudAorYW5kIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBjb3B5LiAgKFNlZSB0aGUgIkNPTUJJTkVEIERJRkYgRk9STUFUIiBzZWN0aW9uCitvZiBsaW5rZ2l0OmdpdC1kaWZmLWZpbGVzWzFdIGZvciBhIGRldGFpbHMgb2YgdGhlIGZvcm1hdC4pCisKK0FmdGVyIHJlc29sdmluZyB0aGUgY29uZmxpY3QgaW4gdGhlIG9idmlvdXMgd2F5IChidXQgYmVmb3JlIHVwZGF0aW5nIHRoZQoraW5kZXgpLCB0aGUgZGlmZiB3aWxsIGxvb2sgbGlrZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZgorZGlmZiAtLWNjIGZpbGUudHh0CitpbmRleCA4MDI5OTJjLDJiNjAyMDcuLjAwMDAwMDAKKy0tLSBhL2ZpbGUudHh0CisrKysgYi9maWxlLnR4dAorQEBAIC0xLDEgLTEsMSArMSwxIEBAQAorLSBIZWxsbyB3b3JsZAorIC1Hb29kYnllCisrK0dvb2RieWUgd29ybGQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBzaG93cyB0aGF0IG91ciByZXNvbHZlZCB2ZXJzaW9uIGRlbGV0ZWQgIkhlbGxvIHdvcmxkIiBmcm9tIHRoZQorZmlyc3QgcGFyZW50LCBkZWxldGVkICJHb29kYnllIiBmcm9tIHRoZSBzZWNvbmQgcGFyZW50LCBhbmQgYWRkZWQKKyJHb29kYnllIHdvcmxkIiwgd2hpY2ggd2FzIHByZXZpb3VzbHkgYWJzZW50IGZyb20gYm90aC4KKworU29tZSBzcGVjaWFsIGRpZmYgb3B0aW9ucyBhbGxvdyBkaWZmaW5nIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhZ2FpbnN0Cithbnkgb2YgdGhlc2Ugc3RhZ2VzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmIC0xIGZpbGUudHh0CQkjIGRpZmYgYWdhaW5zdCBzdGFnZSAxCiskIGdpdCBkaWZmIC0tYmFzZSBmaWxlLnR4dAkjIHNhbWUgYXMgdGhlIGFib3ZlCiskIGdpdCBkaWZmIC0yIGZpbGUudHh0CQkjIGRpZmYgYWdhaW5zdCBzdGFnZSAyCiskIGdpdCBkaWZmIC0tb3VycyBmaWxlLnR4dAkjIHNhbWUgYXMgdGhlIGFib3ZlCiskIGdpdCBkaWZmIC0zIGZpbGUudHh0CQkjIGRpZmYgYWdhaW5zdCBzdGFnZSAzCiskIGdpdCBkaWZmIC0tdGhlaXJzIGZpbGUudHh0CSMgc2FtZSBhcyB0aGUgYWJvdmUuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBsaW5rZ2l0OmdpdC1sb2dbMV0gYW5kIGdpdGtbMV0gY29tbWFuZHMgYWxzbyBwcm92aWRlIHNwZWNpYWwgaGVscAorZm9yIG1lcmdlczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbG9nIC0tbWVyZ2UKKyQgZ2l0ayAtLW1lcmdlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZXNlIHdpbGwgZGlzcGxheSBhbGwgY29tbWl0cyB3aGljaCBleGlzdCBvbmx5IG9uIEhFQUQgb3Igb24KK01FUkdFX0hFQUQsIGFuZCB3aGljaCB0b3VjaCBhbiB1bm1lcmdlZCBmaWxlLgorCitZb3UgbWF5IGFsc28gdXNlIGxpbmtnaXQ6Z2l0LW1lcmdldG9vbFsxXSwgd2hpY2ggbGV0cyB5b3UgbWVyZ2UgdGhlCit1bm1lcmdlZCBmaWxlcyB1c2luZyBleHRlcm5hbCB0b29scyBzdWNoIGFzIGVtYWNzIG9yIGtkaWZmMy4KKworRWFjaCB0aW1lIHlvdSByZXNvbHZlIHRoZSBjb25mbGljdHMgaW4gYSBmaWxlIGFuZCB1cGRhdGUgdGhlIGluZGV4OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBhZGQgZmlsZS50eHQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGhlIGRpZmZlcmVudCBzdGFnZXMgb2YgdGhhdCBmaWxlIHdpbGwgYmUgImNvbGxhcHNlZCIsIGFmdGVyIHdoaWNoCitnaXQtZGlmZiB3aWxsIChieSBkZWZhdWx0KSBubyBsb25nZXIgc2hvdyBkaWZmcyBmb3IgdGhhdCBmaWxlLgorCitbW3VuZG9pbmctYS1tZXJnZV1dCitVbmRvaW5nIGEgbWVyZ2UKKy0tLS0tLS0tLS0tLS0tLQorCitJZiB5b3UgZ2V0IHN0dWNrIGFuZCBkZWNpZGUgdG8ganVzdCBnaXZlIHVwIGFuZCB0aHJvdyB0aGUgd2hvbGUgbWVzcworYXdheSwgeW91IGNhbiBhbHdheXMgcmV0dXJuIHRvIHRoZSBwcmUtbWVyZ2Ugc3RhdGUgd2l0aAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCByZXNldCAtLWhhcmQgSEVBRAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitPciwgaWYgeW91J3ZlIGFscmVhZHkgY29tbWl0dGVkIHRoZSBtZXJnZSB0aGF0IHlvdSB3YW50IHRvIHRocm93IGF3YXksCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHJlc2V0IC0taGFyZCBPUklHX0hFQUQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSG93ZXZlciwgdGhpcyBsYXN0IGNvbW1hbmQgY2FuIGJlIGRhbmdlcm91cyBpbiBzb21lIGNhc2VzLS1uZXZlcgordGhyb3cgYXdheSBhIGNvbW1pdCB5b3UgaGF2ZSBhbHJlYWR5IGNvbW1pdHRlZCBpZiB0aGF0IGNvbW1pdCBtYXkKK2l0c2VsZiBoYXZlIGJlZW4gbWVyZ2VkIGludG8gYW5vdGhlciBicmFuY2gsIGFzIGRvaW5nIHNvIG1heSBjb25mdXNlCitmdXJ0aGVyIG1lcmdlcy4KKworW1tmYXN0LWZvcndhcmRzXV0KK0Zhc3QtZm9yd2FyZCBtZXJnZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlcmUgaXMgb25lIHNwZWNpYWwgY2FzZSBub3QgbWVudGlvbmVkIGFib3ZlLCB3aGljaCBpcyB0cmVhdGVkCitkaWZmZXJlbnRseS4gIE5vcm1hbGx5LCBhIG1lcmdlIHJlc3VsdHMgaW4gYSBtZXJnZSBjb21taXQsIHdpdGggdHdvCitwYXJlbnRzLCBvbmUgcG9pbnRpbmcgYXQgZWFjaCBvZiB0aGUgdHdvIGxpbmVzIG9mIGRldmVsb3BtZW50IHRoYXQKK3dlcmUgbWVyZ2VkLgorCitIb3dldmVyLCBpZiB0aGUgY3VycmVudCBicmFuY2ggaXMgYSBkZXNjZW5kYW50IG9mIHRoZSBvdGhlci0tc28gZXZlcnkKK2NvbW1pdCBwcmVzZW50IGluIHRoZSBvbmUgaXMgYWxyZWFkeSBjb250YWluZWQgaW4gdGhlIG90aGVyLS10aGVuIGdpdAoranVzdCBwZXJmb3JtcyBhICJmYXN0IGZvcndhcmQiOyB0aGUgaGVhZCBvZiB0aGUgY3VycmVudCBicmFuY2ggaXMgbW92ZWQKK2ZvcndhcmQgdG8gcG9pbnQgYXQgdGhlIGhlYWQgb2YgdGhlIG1lcmdlZC1pbiBicmFuY2gsIHdpdGhvdXQgYW55IG5ldworY29tbWl0cyBiZWluZyBjcmVhdGVkLgorCitbW2ZpeGluZy1taXN0YWtlc11dCitGaXhpbmcgbWlzdGFrZXMKKy0tLS0tLS0tLS0tLS0tLQorCitJZiB5b3UndmUgbWVzc2VkIHVwIHRoZSB3b3JraW5nIHRyZWUsIGJ1dCBoYXZlbid0IHlldCBjb21taXR0ZWQgeW91cgorbWlzdGFrZSwgeW91IGNhbiByZXR1cm4gdGhlIGVudGlyZSB3b3JraW5nIHRyZWUgdG8gdGhlIGxhc3QgY29tbWl0dGVkCitzdGF0ZSB3aXRoCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHJlc2V0IC0taGFyZCBIRUFECistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHlvdSBtYWtlIGEgY29tbWl0IHRoYXQgeW91IGxhdGVyIHdpc2ggeW91IGhhZG4ndCwgdGhlcmUgYXJlIHR3bworZnVuZGFtZW50YWxseSBkaWZmZXJlbnQgd2F5cyB0byBmaXggdGhlIHByb2JsZW06CisKKwkxLiBZb3UgY2FuIGNyZWF0ZSBhIG5ldyBjb21taXQgdGhhdCB1bmRvZXMgd2hhdGV2ZXIgd2FzIGRvbmUKKwlieSB0aGUgb2xkIGNvbW1pdC4gIFRoaXMgaXMgdGhlIGNvcnJlY3QgdGhpbmcgaWYgeW91cgorCW1pc3Rha2UgaGFzIGFscmVhZHkgYmVlbiBtYWRlIHB1YmxpYy4KKworCTIuIFlvdSBjYW4gZ28gYmFjayBhbmQgbW9kaWZ5IHRoZSBvbGQgY29tbWl0LiAgWW91IHNob3VsZAorCW5ldmVyIGRvIHRoaXMgaWYgeW91IGhhdmUgYWxyZWFkeSBtYWRlIHRoZSBoaXN0b3J5IHB1YmxpYzsKKwlnaXQgZG9lcyBub3Qgbm9ybWFsbHkgZXhwZWN0IHRoZSAiaGlzdG9yeSIgb2YgYSBwcm9qZWN0IHRvCisJY2hhbmdlLCBhbmQgY2Fubm90IGNvcnJlY3RseSBwZXJmb3JtIHJlcGVhdGVkIG1lcmdlcyBmcm9tCisJYSBicmFuY2ggdGhhdCBoYXMgaGFkIGl0cyBoaXN0b3J5IGNoYW5nZWQuCisKK1tbcmV2ZXJ0aW5nLWEtY29tbWl0XV0KK0ZpeGluZyBhIG1pc3Rha2Ugd2l0aCBhIG5ldyBjb21taXQKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworQ3JlYXRpbmcgYSBuZXcgY29tbWl0IHRoYXQgcmV2ZXJ0cyBhbiBlYXJsaWVyIGNoYW5nZSBpcyB2ZXJ5IGVhc3k7CitqdXN0IHBhc3MgdGhlIGxpbmtnaXQ6Z2l0LXJldmVydFsxXSBjb21tYW5kIGEgcmVmZXJlbmNlIHRvIHRoZSBiYWQKK2NvbW1pdDsgZm9yIGV4YW1wbGUsIHRvIHJldmVydCB0aGUgbW9zdCByZWNlbnQgY29tbWl0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCByZXZlcnQgSEVBRAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IGNvbW1pdCB3aGljaCB1bmRvZXMgdGhlIGNoYW5nZSBpbiBIRUFELiAgWW91Cit3aWxsIGJlIGdpdmVuIGEgY2hhbmNlIHRvIGVkaXQgdGhlIGNvbW1pdCBtZXNzYWdlIGZvciB0aGUgbmV3IGNvbW1pdC4KKworWW91IGNhbiBhbHNvIHJldmVydCBhbiBlYXJsaWVyIGNoYW5nZSwgZm9yIGV4YW1wbGUsIHRoZSBuZXh0LXRvLWxhc3Q6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHJldmVydCBIRUFEXgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbiB0aGlzIGNhc2UgZ2l0IHdpbGwgYXR0ZW1wdCB0byB1bmRvIHRoZSBvbGQgY2hhbmdlIHdoaWxlIGxlYXZpbmcKK2ludGFjdCBhbnkgY2hhbmdlcyBtYWRlIHNpbmNlIHRoZW4uICBJZiBtb3JlIHJlY2VudCBjaGFuZ2VzIG92ZXJsYXAKK3dpdGggdGhlIGNoYW5nZXMgdG8gYmUgcmV2ZXJ0ZWQsIHRoZW4geW91IHdpbGwgYmUgYXNrZWQgdG8gZml4Citjb25mbGljdHMgbWFudWFsbHksIGp1c3QgYXMgaW4gdGhlIGNhc2Ugb2YgPDxyZXNvbHZpbmctYS1tZXJnZSwKK3Jlc29sdmluZyBhIG1lcmdlPj4uCisKK1tbZml4aW5nLWEtbWlzdGFrZS1ieS1yZXdyaXRpbmctaGlzdG9yeV1dCitGaXhpbmcgYSBtaXN0YWtlIGJ5IHJld3JpdGluZyBoaXN0b3J5Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitJZiB0aGUgcHJvYmxlbWF0aWMgY29tbWl0IGlzIHRoZSBtb3N0IHJlY2VudCBjb21taXQsIGFuZCB5b3UgaGF2ZSBub3QKK3lldCBtYWRlIHRoYXQgY29tbWl0IHB1YmxpYywgdGhlbiB5b3UgbWF5IGp1c3QKKzw8dW5kb2luZy1hLW1lcmdlLGRlc3Ryb3kgaXQgdXNpbmcgZ2l0LXJlc2V0Pj4uCisKK0FsdGVybmF0aXZlbHksIHlvdQorY2FuIGVkaXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCB1cGRhdGUgdGhlIGluZGV4IHRvIGZpeCB5b3VyCittaXN0YWtlLCBqdXN0IGFzIGlmIHlvdSB3ZXJlIGdvaW5nIHRvIDw8aG93LXRvLW1ha2UtYS1jb21taXQsY3JlYXRlIGEKK25ldyBjb21taXQ+PiwgdGhlbiBydW4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY29tbWl0IC0tYW1lbmQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggd2lsbCByZXBsYWNlIHRoZSBvbGQgY29tbWl0IGJ5IGEgbmV3IGNvbW1pdCBpbmNvcnBvcmF0aW5nIHlvdXIKK2NoYW5nZXMsIGdpdmluZyB5b3UgYSBjaGFuY2UgdG8gZWRpdCB0aGUgb2xkIGNvbW1pdCBtZXNzYWdlIGZpcnN0LgorCitBZ2FpbiwgeW91IHNob3VsZCBuZXZlciBkbyB0aGlzIHRvIGEgY29tbWl0IHRoYXQgbWF5IGFscmVhZHkgaGF2ZQorYmVlbiBtZXJnZWQgaW50byBhbm90aGVyIGJyYW5jaDsgdXNlIGxpbmtnaXQ6Z2l0LXJldmVydFsxXSBpbnN0ZWFkIGluCit0aGF0IGNhc2UuCisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gcmVwbGFjZSBjb21taXRzIGZ1cnRoZXIgYmFjayBpbiB0aGUgaGlzdG9yeSwgYnV0Cit0aGlzIGlzIGFuIGFkdmFuY2VkIHRvcGljIHRvIGJlIGxlZnQgZm9yCis8PGNsZWFuaW5nLXVwLWhpc3RvcnksYW5vdGhlciBjaGFwdGVyPj4uCisKK1tbY2hlY2tvdXQtb2YtcGF0aF1dCitDaGVja2luZyBvdXQgYW4gb2xkIHZlcnNpb24gb2YgYSBmaWxlCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0luIHRoZSBwcm9jZXNzIG9mIHVuZG9pbmcgYSBwcmV2aW91cyBiYWQgY2hhbmdlLCB5b3UgbWF5IGZpbmQgaXQKK3VzZWZ1bCB0byBjaGVjayBvdXQgYW4gb2xkZXIgdmVyc2lvbiBvZiBhIHBhcnRpY3VsYXIgZmlsZSB1c2luZworbGlua2dpdDpnaXQtY2hlY2tvdXRbMV0uICBXZSd2ZSB1c2VkIGdpdCBjaGVja291dCBiZWZvcmUgdG8gc3dpdGNoCiticmFuY2hlcywgYnV0IGl0IGhhcyBxdWl0ZSBkaWZmZXJlbnQgYmVoYXZpb3IgaWYgaXQgaXMgZ2l2ZW4gYSBwYXRoCituYW1lOiB0aGUgY29tbWFuZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCBIRUFEXiBwYXRoL3RvL2ZpbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcmVwbGFjZXMgcGF0aC90by9maWxlIGJ5IHRoZSBjb250ZW50cyBpdCBoYWQgaW4gdGhlIGNvbW1pdCBIRUFEXiwgYW5kCithbHNvIHVwZGF0ZXMgdGhlIGluZGV4IHRvIG1hdGNoLiAgSXQgZG9lcyBub3QgY2hhbmdlIGJyYW5jaGVzLgorCitJZiB5b3UganVzdCB3YW50IHRvIGxvb2sgYXQgYW4gb2xkIHZlcnNpb24gb2YgdGhlIGZpbGUsIHdpdGhvdXQKK21vZGlmeWluZyB0aGUgd29ya2luZyBkaXJlY3RvcnksIHlvdSBjYW4gZG8gdGhhdCB3aXRoCitsaW5rZ2l0OmdpdC1zaG93WzFdOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93IEhFQUReOnBhdGgvdG8vZmlsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCB3aWxsIGRpc3BsYXkgdGhlIGdpdmVuIHZlcnNpb24gb2YgdGhlIGZpbGUuCisKK1tbaW50ZXJydXB0ZWQtd29ya11dCitUZW1wb3JhcmlseSBzZXR0aW5nIGFzaWRlIHdvcmsgaW4gcHJvZ3Jlc3MKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitXaGlsZSB5b3UgYXJlIGluIHRoZSBtaWRkbGUgb2Ygd29ya2luZyBvbiBzb21ldGhpbmcgY29tcGxpY2F0ZWQsIHlvdQorZmluZCBhbiB1bnJlbGF0ZWQgYnV0IG9idmlvdXMgYW5kIHRyaXZpYWwgYnVnLiAgWW91IHdvdWxkIGxpa2UgdG8gZml4IGl0CitiZWZvcmUgY29udGludWluZy4gIFlvdSBjYW4gdXNlIGxpbmtnaXQ6Z2l0LXN0YXNoWzFdIHRvIHNhdmUgdGhlIGN1cnJlbnQKK3N0YXRlIG9mIHlvdXIgd29yaywgYW5kIGFmdGVyIGZpeGluZyB0aGUgYnVnIChvciwgb3B0aW9uYWxseSBhZnRlciBkb2luZworc28gb24gYSBkaWZmZXJlbnQgYnJhbmNoIGFuZCB0aGVuIGNvbWluZyBiYWNrKSwgdW5zdGFzaCB0aGUKK3dvcmstaW4tcHJvZ3Jlc3MgY2hhbmdlcy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzdGFzaCAid29yayBpbiBwcm9ncmVzcyBmb3IgZm9vIGZlYXR1cmUiCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBjb21tYW5kIHdpbGwgc2F2ZSB5b3VyIGNoYW5nZXMgYXdheSB0byB0aGUgYHN0YXNoYCwgYW5kCityZXNldCB5b3VyIHdvcmtpbmcgdHJlZSBhbmQgdGhlIGluZGV4IHRvIG1hdGNoIHRoZSB0aXAgb2YgeW91cgorY3VycmVudCBicmFuY2guICBUaGVuIHlvdSBjYW4gbWFrZSB5b3VyIGZpeCBhcyB1c3VhbC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisuLi4gZWRpdCBhbmQgdGVzdCAuLi4KKyQgZ2l0IGNvbW1pdCAtYSAtbSAiYmxvcnBsOiB0eXBvZml4IgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FmdGVyIHRoYXQsIHlvdSBjYW4gZ28gYmFjayB0byB3aGF0IHlvdSB3ZXJlIHdvcmtpbmcgb24gd2l0aAorYGdpdCBzdGFzaCBhcHBseWA6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc3Rhc2ggYXBwbHkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK1tbZW5zdXJpbmctZ29vZC1wZXJmb3JtYW5jZV1dCitFbnN1cmluZyBnb29kIHBlcmZvcm1hbmNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK09uIGxhcmdlIHJlcG9zaXRvcmllcywgZ2l0IGRlcGVuZHMgb24gY29tcHJlc3Npb24gdG8ga2VlcCB0aGUgaGlzdG9yeQoraW5mb3JtYXRpb24gZnJvbSB0YWtpbmcgdXAgdG9vIG11Y2ggc3BhY2Ugb24gZGlzayBvciBpbiBtZW1vcnkuCisKK1RoaXMgY29tcHJlc3Npb24gaXMgbm90IHBlcmZvcm1lZCBhdXRvbWF0aWNhbGx5LiAgVGhlcmVmb3JlIHlvdQorc2hvdWxkIG9jY2FzaW9uYWxseSBydW4gbGlua2dpdDpnaXQtZ2NbMV06CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGdjCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RvIHJlY29tcHJlc3MgdGhlIGFyY2hpdmUuICBUaGlzIGNhbiBiZSB2ZXJ5IHRpbWUtY29uc3VtaW5nLCBzbworeW91IG1heSBwcmVmZXIgdG8gcnVuIGdpdC1nYyB3aGVuIHlvdSBhcmUgbm90IGRvaW5nIG90aGVyIHdvcmsuCisKKworW1tlbnN1cmluZy1yZWxpYWJpbGl0eV1dCitFbnN1cmluZyByZWxpYWJpbGl0eQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworW1tjaGVja2luZy1mb3ItY29ycnVwdGlvbl1dCitDaGVja2luZyB0aGUgcmVwb3NpdG9yeSBmb3IgY29ycnVwdGlvbgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIGxpbmtnaXQ6Z2l0LWZzY2tbMV0gY29tbWFuZCBydW5zIGEgbnVtYmVyIG9mIHNlbGYtY29uc2lzdGVuY3kgY2hlY2tzCitvbiB0aGUgcmVwb3NpdG9yeSwgYW5kIHJlcG9ydHMgb24gYW55IHByb2JsZW1zLiAgVGhpcyBtYXkgdGFrZSBzb21lCit0aW1lLiAgVGhlIG1vc3QgY29tbW9uIHdhcm5pbmcgYnkgZmFyIGlzIGFib3V0ICJkYW5nbGluZyIgb2JqZWN0czoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZnNjaworZGFuZ2xpbmcgY29tbWl0IDcyODEyNTFkZGQyYTYxZTM4NjU3YzgyNzczOWM1NzAxNTY3MWE2YjMKK2RhbmdsaW5nIGNvbW1pdCAyNzA2YTA1OWYyNThjNmIyNDVmMjk4ZGM0ZmYyY2NkMzBlYzIxYTYzCitkYW5nbGluZyBjb21taXQgMTM0NzJiN2M0YjgwODUxYTFiYzU1MTc3OTE3MWRjYjAzNjU1ZTliNQorZGFuZ2xpbmcgYmxvYiAyMTg3NjFmOWQ5MDcxMmQzN2E5YzVlMzZmNDA2ZjkyMjAyZGIwN2ViCitkYW5nbGluZyBjb21taXQgYmYwOTM1MzVhMzRhNGQzNTczMWFhMmJkOTBmZTZiMTc2MzAyZjE0ZgorZGFuZ2xpbmcgY29tbWl0IDhlNGJlYzdmMmRkYWEyNjhiZWY5OTk4NTNjMjU3NTU0NTIxMDBmOGUKK2RhbmdsaW5nIHRyZWUgZDUwYmI4NjE4NmJmMjdiNjgxZDI1YWY4OWQzYjViNjgzODJlNDA4NQorZGFuZ2xpbmcgdHJlZSBiMjRjMjQ3M2YxZmQzZDkxMzUyYTYyNDc5NWJlMDI2ZDY0Yzg4NDFmCisuLi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRGFuZ2xpbmcgb2JqZWN0cyBhcmUgbm90IGEgcHJvYmxlbS4gIEF0IHdvcnN0IHRoZXkgbWF5IHRha2UgdXAgYSBsaXR0bGUKK2V4dHJhIGRpc2sgc3BhY2UuICBUaGV5IGNhbiBzb21ldGltZXMgcHJvdmlkZSBhIGxhc3QtcmVzb3J0IG1ldGhvZCBmb3IKK3JlY292ZXJpbmcgbG9zdCB3b3JrLS1zZWUgPDxkYW5nbGluZy1vYmplY3RzPj4gZm9yIGRldGFpbHMuICBIb3dldmVyLCBpZgoreW91IHdpc2gsIHlvdSBjYW4gcmVtb3ZlIHRoZW0gd2l0aCBsaW5rZ2l0OmdpdC1wcnVuZVsxXSBvciB0aGUgYC0tcHJ1bmVgCitvcHRpb24gdG8gbGlua2dpdDpnaXQtZ2NbMV06CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGdjIC0tcHJ1bmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBtYXkgYmUgdGltZS1jb25zdW1pbmcuICBVbmxpa2UgbW9zdCBvdGhlciBnaXQgb3BlcmF0aW9ucyAoaW5jbHVkaW5nCitnaXQtZ2Mgd2hlbiBydW4gd2l0aG91dCBhbnkgb3B0aW9ucyksIGl0IGlzIG5vdCBzYWZlIHRvIHBydW5lIHdoaWxlCitvdGhlciBnaXQgb3BlcmF0aW9ucyBhcmUgaW4gcHJvZ3Jlc3MgaW4gdGhlIHNhbWUgcmVwb3NpdG9yeS4KKworSWYgbGlua2dpdDpnaXQtZnNja1sxXSBjb21wbGFpbnMgYWJvdXQgc2hhMSBtaXNtYXRjaGVzIG9yIG1pc3NpbmcKK29iamVjdHMsIHlvdSBtYXkgaGF2ZSBhIG11Y2ggbW9yZSBzZXJpb3VzIHByb2JsZW07IHlvdXIgYmVzdCBvcHRpb24gaXMKK3Byb2JhYmx5IHJlc3RvcmluZyBmcm9tIGJhY2t1cHMuICBTZWUKKzw8cmVjb3ZlcmluZy1mcm9tLXJlcG9zaXRvcnktY29ycnVwdGlvbj4+IGZvciBhIGRldGFpbGVkIGRpc2N1c3Npb24uCisKK1tbcmVjb3ZlcmluZy1sb3N0LWNoYW5nZXNdXQorUmVjb3ZlcmluZyBsb3N0IGNoYW5nZXMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1tbcmVmbG9nc11dCitSZWZsb2dzCiteXl5eXl5eCisKK1NheSB5b3UgbW9kaWZ5IGEgYnJhbmNoIHdpdGggYGxpbmtnaXQ6Z2l0LXJlc2V0WzFdIC0taGFyZGAsIGFuZCB0aGVuCityZWFsaXplIHRoYXQgdGhlIGJyYW5jaCB3YXMgdGhlIG9ubHkgcmVmZXJlbmNlIHlvdSBoYWQgdG8gdGhhdCBwb2ludCBpbgoraGlzdG9yeS4KKworRm9ydHVuYXRlbHksIGdpdCBhbHNvIGtlZXBzIGEgbG9nLCBjYWxsZWQgYSAicmVmbG9nIiwgb2YgYWxsIHRoZQorcHJldmlvdXMgdmFsdWVzIG9mIGVhY2ggYnJhbmNoLiAgU28gaW4gdGhpcyBjYXNlIHlvdSBjYW4gc3RpbGwgZmluZCB0aGUKK29sZCBoaXN0b3J5IHVzaW5nLCBmb3IgZXhhbXBsZSwKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbG9nIG1hc3RlckB7MX0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBsaXN0cyB0aGUgY29tbWl0cyByZWFjaGFibGUgZnJvbSB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUKKyJtYXN0ZXIiIGJyYW5jaCBoZWFkLiAgVGhpcyBzeW50YXggY2FuIGJlIHVzZWQgd2l0aCBhbnkgZ2l0IGNvbW1hbmQKK3RoYXQgYWNjZXB0cyBhIGNvbW1pdCwgbm90IGp1c3Qgd2l0aCBnaXQgbG9nLiAgU29tZSBvdGhlciBleGFtcGxlczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdyBtYXN0ZXJAezJ9CQkjIFNlZSB3aGVyZSB0aGUgYnJhbmNoIHBvaW50ZWQgMiwKKyQgZ2l0IHNob3cgbWFzdGVyQHszfQkJIyAzLCAuLi4gY2hhbmdlcyBhZ28uCiskIGdpdGsgbWFzdGVyQHt5ZXN0ZXJkYXl9CSMgU2VlIHdoZXJlIGl0IHBvaW50ZWQgeWVzdGVyZGF5LAorJCBnaXRrIG1hc3RlckB7IjEgd2VlayBhZ28ifQkjIC4uLiBvciBsYXN0IHdlZWsKKyQgZ2l0IGxvZyAtLXdhbGstcmVmbG9ncyBtYXN0ZXIJIyBzaG93IHJlZmxvZyBlbnRyaWVzIGZvciBtYXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSBzZXBhcmF0ZSByZWZsb2cgaXMga2VwdCBmb3IgdGhlIEhFQUQsIHNvCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3cgSEVBREB7IjEgd2VlayBhZ28ifQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3aWxsIHNob3cgd2hhdCBIRUFEIHBvaW50ZWQgdG8gb25lIHdlZWsgYWdvLCBub3Qgd2hhdCB0aGUgY3VycmVudCBicmFuY2gKK3BvaW50ZWQgdG8gb25lIHdlZWsgYWdvLiAgVGhpcyBhbGxvd3MgeW91IHRvIHNlZSB0aGUgaGlzdG9yeSBvZiB3aGF0Cit5b3UndmUgY2hlY2tlZCBvdXQuCisKK1RoZSByZWZsb2dzIGFyZSBrZXB0IGJ5IGRlZmF1bHQgZm9yIDMwIGRheXMsIGFmdGVyIHdoaWNoIHRoZXkgbWF5IGJlCitwcnVuZWQuICBTZWUgbGlua2dpdDpnaXQtcmVmbG9nWzFdIGFuZCBsaW5rZ2l0OmdpdC1nY1sxXSB0byBsZWFybgoraG93IHRvIGNvbnRyb2wgdGhpcyBwcnVuaW5nLCBhbmQgc2VlIHRoZSAiU1BFQ0lGWUlORyBSRVZJU0lPTlMiCitzZWN0aW9uIG9mIGxpbmtnaXQ6Z2l0LXJldi1wYXJzZVsxXSBmb3IgZGV0YWlscy4KKworTm90ZSB0aGF0IHRoZSByZWZsb2cgaGlzdG9yeSBpcyB2ZXJ5IGRpZmZlcmVudCBmcm9tIG5vcm1hbCBnaXQgaGlzdG9yeS4KK1doaWxlIG5vcm1hbCBoaXN0b3J5IGlzIHNoYXJlZCBieSBldmVyeSByZXBvc2l0b3J5IHRoYXQgd29ya3Mgb24gdGhlCitzYW1lIHByb2plY3QsIHRoZSByZWZsb2cgaGlzdG9yeSBpcyBub3Qgc2hhcmVkOiBpdCB0ZWxscyB5b3Ugb25seSBhYm91dAoraG93IHRoZSBicmFuY2hlcyBpbiB5b3VyIGxvY2FsIHJlcG9zaXRvcnkgaGF2ZSBjaGFuZ2VkIG92ZXIgdGltZS4KKworW1tkYW5nbGluZy1vYmplY3QtcmVjb3ZlcnldXQorRXhhbWluaW5nIGRhbmdsaW5nIG9iamVjdHMKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisKK0luIHNvbWUgc2l0dWF0aW9ucyB0aGUgcmVmbG9nIG1heSBub3QgYmUgYWJsZSB0byBzYXZlIHlvdS4gIEZvciBleGFtcGxlLAorc3VwcG9zZSB5b3UgZGVsZXRlIGEgYnJhbmNoLCB0aGVuIHJlYWxpemUgeW91IG5lZWQgdGhlIGhpc3RvcnkgaXQKK2NvbnRhaW5lZC4gIFRoZSByZWZsb2cgaXMgYWxzbyBkZWxldGVkOyBob3dldmVyLCBpZiB5b3UgaGF2ZSBub3QgeWV0CitwcnVuZWQgdGhlIHJlcG9zaXRvcnksIHRoZW4geW91IG1heSBzdGlsbCBiZSBhYmxlIHRvIGZpbmQgdGhlIGxvc3QKK2NvbW1pdHMgaW4gdGhlIGRhbmdsaW5nIG9iamVjdHMgdGhhdCBnaXQtZnNjayByZXBvcnRzLiAgU2VlCis8PGRhbmdsaW5nLW9iamVjdHM+PiBmb3IgdGhlIGRldGFpbHMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGZzY2sKK2RhbmdsaW5nIGNvbW1pdCA3MjgxMjUxZGRkMmE2MWUzODY1N2M4Mjc3MzljNTcwMTU2NzFhNmIzCitkYW5nbGluZyBjb21taXQgMjcwNmEwNTlmMjU4YzZiMjQ1ZjI5OGRjNGZmMmNjZDMwZWMyMWE2MworZGFuZ2xpbmcgY29tbWl0IDEzNDcyYjdjNGI4MDg1MWExYmM1NTE3NzkxNzFkY2IwMzY1NWU5YjUKKy4uLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3UgY2FuIGV4YW1pbmUKK29uZSBvZiB0aG9zZSBkYW5nbGluZyBjb21taXRzIHdpdGgsIGZvciBleGFtcGxlLAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0ayA3MjgxMjUxZGRkIC0tbm90IC0tYWxsCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggZG9lcyB3aGF0IGl0IHNvdW5kcyBsaWtlOiBpdCBzYXlzIHRoYXQgeW91IHdhbnQgdG8gc2VlIHRoZSBjb21taXQKK2hpc3RvcnkgdGhhdCBpcyBkZXNjcmliZWQgYnkgdGhlIGRhbmdsaW5nIGNvbW1pdChzKSwgYnV0IG5vdCB0aGUKK2hpc3RvcnkgdGhhdCBpcyBkZXNjcmliZWQgYnkgYWxsIHlvdXIgZXhpc3RpbmcgYnJhbmNoZXMgYW5kIHRhZ3MuICBUaHVzCit5b3UgZ2V0IGV4YWN0bHkgdGhlIGhpc3RvcnkgcmVhY2hhYmxlIGZyb20gdGhhdCBjb21taXQgdGhhdCBpcyBsb3N0LgorKEFuZCBub3RpY2UgdGhhdCBpdCBtaWdodCBub3QgYmUganVzdCBvbmUgY29tbWl0OiB3ZSBvbmx5IHJlcG9ydCB0aGUKKyJ0aXAgb2YgdGhlIGxpbmUiIGFzIGJlaW5nIGRhbmdsaW5nLCBidXQgdGhlcmUgbWlnaHQgYmUgYSB3aG9sZSBkZWVwCithbmQgY29tcGxleCBjb21taXQgaGlzdG9yeSB0aGF0IHdhcyBkcm9wcGVkLikKKworSWYgeW91IGRlY2lkZSB5b3Ugd2FudCB0aGUgaGlzdG9yeSBiYWNrLCB5b3UgY2FuIGFsd2F5cyBjcmVhdGUgYSBuZXcKK3JlZmVyZW5jZSBwb2ludGluZyB0byBpdCwgZm9yIGV4YW1wbGUsIGEgbmV3IGJyYW5jaDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBicmFuY2ggcmVjb3ZlcmVkLWJyYW5jaCA3MjgxMjUxZGRkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT3RoZXIgdHlwZXMgb2YgZGFuZ2xpbmcgb2JqZWN0cyAoYmxvYnMgYW5kIHRyZWVzKSBhcmUgYWxzbyBwb3NzaWJsZSwgYW5kCitkYW5nbGluZyBvYmplY3RzIGNhbiBhcmlzZSBpbiBvdGhlciBzaXR1YXRpb25zLgorCisKK1tbc2hhcmluZy1kZXZlbG9wbWVudF1dCitTaGFyaW5nIGRldmVsb3BtZW50IHdpdGggb3RoZXJzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbZ2V0dGluZy11cGRhdGVzLXdpdGgtZ2l0LXB1bGxdXQorR2V0dGluZyB1cGRhdGVzIHdpdGggZ2l0IHB1bGwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FmdGVyIHlvdSBjbG9uZSBhIHJlcG9zaXRvcnkgYW5kIG1ha2UgYSBmZXcgY2hhbmdlcyBvZiB5b3VyIG93biwgeW91CittYXkgd2lzaCB0byBjaGVjayB0aGUgb3JpZ2luYWwgcmVwb3NpdG9yeSBmb3IgdXBkYXRlcyBhbmQgbWVyZ2UgdGhlbQoraW50byB5b3VyIG93biB3b3JrLgorCitXZSBoYXZlIGFscmVhZHkgc2VlbiA8PFVwZGF0aW5nLWEtcmVwb3NpdG9yeS13aXRoLWdpdC1mZXRjaCxob3cgdG8KK2tlZXAgcmVtb3RlIHRyYWNraW5nIGJyYW5jaGVzIHVwIHRvIGRhdGU+PiB3aXRoIGxpbmtnaXQ6Z2l0LWZldGNoWzFdLAorYW5kIGhvdyB0byBtZXJnZSB0d28gYnJhbmNoZXMuICBTbyB5b3UgY2FuIG1lcmdlIGluIGNoYW5nZXMgZnJvbSB0aGUKK29yaWdpbmFsIHJlcG9zaXRvcnkncyBtYXN0ZXIgYnJhbmNoIHdpdGg6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGZldGNoCiskIGdpdCBtZXJnZSBvcmlnaW4vbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0hvd2V2ZXIsIHRoZSBsaW5rZ2l0OmdpdC1wdWxsWzFdIGNvbW1hbmQgcHJvdmlkZXMgYSB3YXkgdG8gZG8gdGhpcyBpbgorb25lIHN0ZXA6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHB1bGwgb3JpZ2luIG1hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbiBmYWN0LCBpZiB5b3UgaGF2ZSAibWFzdGVyIiBjaGVja2VkIG91dCwgdGhlbiBieSBkZWZhdWx0ICJnaXQgcHVsbCIKK21lcmdlcyBmcm9tIHRoZSBIRUFEIGJyYW5jaCBvZiB0aGUgb3JpZ2luIHJlcG9zaXRvcnkuICBTbyBvZnRlbiB5b3UgY2FuCithY2NvbXBsaXNoIHRoZSBhYm92ZSB3aXRoIGp1c3QgYSBzaW1wbGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcHVsbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNb3JlIGdlbmVyYWxseSwgYSBicmFuY2ggdGhhdCBpcyBjcmVhdGVkIGZyb20gYSByZW1vdGUgYnJhbmNoIHdpbGwgcHVsbAorYnkgZGVmYXVsdCBmcm9tIHRoYXQgYnJhbmNoLiAgU2VlIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlCiticmFuY2guPG5hbWU+LnJlbW90ZSBhbmQgYnJhbmNoLjxuYW1lPi5tZXJnZSBvcHRpb25zIGluCitsaW5rZ2l0OmdpdC1jb25maWdbMV0sIGFuZCB0aGUgZGlzY3Vzc2lvbiBvZiB0aGUgYC0tdHJhY2tgIG9wdGlvbiBpbgorbGlua2dpdDpnaXQtY2hlY2tvdXRbMV0sIHRvIGxlYXJuIGhvdyB0byBjb250cm9sIHRoZXNlIGRlZmF1bHRzLgorCitJbiBhZGRpdGlvbiB0byBzYXZpbmcgeW91IGtleXN0cm9rZXMsICJnaXQgcHVsbCIgYWxzbyBoZWxwcyB5b3UgYnkKK3Byb2R1Y2luZyBhIGRlZmF1bHQgY29tbWl0IG1lc3NhZ2UgZG9jdW1lbnRpbmcgdGhlIGJyYW5jaCBhbmQKK3JlcG9zaXRvcnkgdGhhdCB5b3UgcHVsbGVkIGZyb20uCisKKyhCdXQgbm90ZSB0aGF0IG5vIHN1Y2ggY29tbWl0IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgY2FzZSBvZiBhCis8PGZhc3QtZm9yd2FyZHMsZmFzdCBmb3J3YXJkPj47IGluc3RlYWQsIHlvdXIgYnJhbmNoIHdpbGwganVzdCBiZQordXBkYXRlZCB0byBwb2ludCB0byB0aGUgbGF0ZXN0IGNvbW1pdCBmcm9tIHRoZSB1cHN0cmVhbSBicmFuY2guKQorCitUaGUgZ2l0LXB1bGwgY29tbWFuZCBjYW4gYWxzbyBiZSBnaXZlbiAiLiIgYXMgdGhlICJyZW1vdGUiIHJlcG9zaXRvcnksCitpbiB3aGljaCBjYXNlIGl0IGp1c3QgbWVyZ2VzIGluIGEgYnJhbmNoIGZyb20gdGhlIGN1cnJlbnQgcmVwb3NpdG9yeTsgc28KK3RoZSBjb21tYW5kcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBwdWxsIC4gYnJhbmNoCiskIGdpdCBtZXJnZSBicmFuY2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYXJlIHJvdWdobHkgZXF1aXZhbGVudC4gIFRoZSBmb3JtZXIgaXMgYWN0dWFsbHkgdmVyeSBjb21tb25seSB1c2VkLgorCitbW3N1Ym1pdHRpbmctcGF0Y2hlc11dCitTdWJtaXR0aW5nIHBhdGNoZXMgdG8gYSBwcm9qZWN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHlvdSBqdXN0IGhhdmUgYSBmZXcgY2hhbmdlcywgdGhlIHNpbXBsZXN0IHdheSB0byBzdWJtaXQgdGhlbSBtYXkKK2p1c3QgYmUgdG8gc2VuZCB0aGVtIGFzIHBhdGNoZXMgaW4gZW1haWw6CisKK0ZpcnN0LCB1c2UgbGlua2dpdDpnaXQtZm9ybWF0LXBhdGNoWzFdOyBmb3IgZXhhbXBsZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZm9ybWF0LXBhdGNoIG9yaWdpbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3aWxsIHByb2R1Y2UgYSBudW1iZXJlZCBzZXJpZXMgb2YgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBvbmUKK2ZvciBlYWNoIHBhdGNoIGluIHRoZSBjdXJyZW50IGJyYW5jaCBidXQgbm90IGluIG9yaWdpbi9IRUFELgorCitZb3UgY2FuIHRoZW4gaW1wb3J0IHRoZXNlIGludG8geW91ciBtYWlsIGNsaWVudCBhbmQgc2VuZCB0aGVtIGJ5CitoYW5kLiAgSG93ZXZlciwgaWYgeW91IGhhdmUgYSBsb3QgdG8gc2VuZCBhdCBvbmNlLCB5b3UgbWF5IHByZWZlciB0bwordXNlIHRoZSBsaW5rZ2l0OmdpdC1zZW5kLWVtYWlsWzFdIHNjcmlwdCB0byBhdXRvbWF0ZSB0aGUgcHJvY2Vzcy4KK0NvbnN1bHQgdGhlIG1haWxpbmcgbGlzdCBmb3IgeW91ciBwcm9qZWN0IGZpcnN0IHRvIGRldGVybWluZSBob3cgdGhleQorcHJlZmVyIHN1Y2ggcGF0Y2hlcyBiZSBoYW5kbGVkLgorCitbW2ltcG9ydGluZy1wYXRjaGVzXV0KK0ltcG9ydGluZyBwYXRjaGVzIHRvIGEgcHJvamVjdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0dpdCBhbHNvIHByb3ZpZGVzIGEgdG9vbCBjYWxsZWQgbGlua2dpdDpnaXQtYW1bMV0gKGFtIHN0YW5kcyBmb3IKKyJhcHBseSBtYWlsYm94IiksIGZvciBpbXBvcnRpbmcgc3VjaCBhbiBlbWFpbGVkIHNlcmllcyBvZiBwYXRjaGVzLgorSnVzdCBzYXZlIGFsbCBvZiB0aGUgcGF0Y2gtY29udGFpbmluZyBtZXNzYWdlcywgaW4gb3JkZXIsIGludG8gYQorc2luZ2xlIG1haWxib3ggZmlsZSwgc2F5ICJwYXRjaGVzLm1ib3giLCB0aGVuIHJ1bgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBhbSAtMyBwYXRjaGVzLm1ib3gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworR2l0IHdpbGwgYXBwbHkgZWFjaCBwYXRjaCBpbiBvcmRlcjsgaWYgYW55IGNvbmZsaWN0cyBhcmUgZm91bmQsIGl0Cit3aWxsIHN0b3AsIGFuZCB5b3UgY2FuIGZpeCB0aGUgY29uZmxpY3RzIGFzIGRlc2NyaWJlZCBpbgorIjw8cmVzb2x2aW5nLWEtbWVyZ2UsUmVzb2x2aW5nIGEgbWVyZ2U+PiIuICAoVGhlICItMyIgb3B0aW9uIHRlbGxzCitnaXQgdG8gcGVyZm9ybSBhIG1lcmdlOyBpZiB5b3Ugd291bGQgcHJlZmVyIGl0IGp1c3QgdG8gYWJvcnQgYW5kCitsZWF2ZSB5b3VyIHRyZWUgYW5kIGluZGV4IHVudG91Y2hlZCwgeW91IG1heSBvbWl0IHRoYXQgb3B0aW9uLikKKworT25jZSB0aGUgaW5kZXggaXMgdXBkYXRlZCB3aXRoIHRoZSByZXN1bHRzIG9mIHRoZSBjb25mbGljdAorcmVzb2x1dGlvbiwgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBjb21taXQsIGp1c3QgcnVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGFtIC0tcmVzb2x2ZWQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIGdpdCB3aWxsIGNyZWF0ZSB0aGUgY29tbWl0IGZvciB5b3UgYW5kIGNvbnRpbnVlIGFwcGx5aW5nIHRoZQorcmVtYWluaW5nIHBhdGNoZXMgZnJvbSB0aGUgbWFpbGJveC4KKworVGhlIGZpbmFsIHJlc3VsdCB3aWxsIGJlIGEgc2VyaWVzIG9mIGNvbW1pdHMsIG9uZSBmb3IgZWFjaCBwYXRjaCBpbgordGhlIG9yaWdpbmFsIG1haWxib3gsIHdpdGggYXV0aG9yc2hpcCBhbmQgY29tbWl0IGxvZyBtZXNzYWdlIGVhY2gKK3Rha2VuIGZyb20gdGhlIG1lc3NhZ2UgY29udGFpbmluZyBlYWNoIHBhdGNoLgorCitbW3B1YmxpYy1yZXBvc2l0b3JpZXNdXQorUHVibGljIGdpdCByZXBvc2l0b3JpZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Fub3RoZXIgd2F5IHRvIHN1Ym1pdCBjaGFuZ2VzIHRvIGEgcHJvamVjdCBpcyB0byB0ZWxsIHRoZSBtYWludGFpbmVyCitvZiB0aGF0IHByb2plY3QgdG8gcHVsbCB0aGUgY2hhbmdlcyBmcm9tIHlvdXIgcmVwb3NpdG9yeSB1c2luZworbGlua2dpdDpnaXQtcHVsbFsxXS4gIEluIHRoZSBzZWN0aW9uICI8PGdldHRpbmctdXBkYXRlcy13aXRoLWdpdC1wdWxsLAorR2V0dGluZyB1cGRhdGVzIHdpdGggZ2l0IHB1bGw+PiIgd2UgZGVzY3JpYmVkIHRoaXMgYXMgYSB3YXkgdG8gZ2V0Cit1cGRhdGVzIGZyb20gdGhlICJtYWluIiByZXBvc2l0b3J5LCBidXQgaXQgd29ya3MganVzdCBhcyB3ZWxsIGluIHRoZQorb3RoZXIgZGlyZWN0aW9uLgorCitJZiB5b3UgYW5kIHRoZSBtYWludGFpbmVyIGJvdGggaGF2ZSBhY2NvdW50cyBvbiB0aGUgc2FtZSBtYWNoaW5lLCB0aGVuCit5b3UgY2FuIGp1c3QgcHVsbCBjaGFuZ2VzIGZyb20gZWFjaCBvdGhlcidzIHJlcG9zaXRvcmllcyBkaXJlY3RseTsKK2NvbW1hbmRzIHRoYXQgYWNjZXB0IHJlcG9zaXRvcnkgVVJMcyBhcyBhcmd1bWVudHMgd2lsbCBhbHNvIGFjY2VwdCBhCitsb2NhbCBkaXJlY3RvcnkgbmFtZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2xvbmUgL3BhdGgvdG8vcmVwb3NpdG9yeQorJCBnaXQgcHVsbCAvcGF0aC90by9vdGhlci9yZXBvc2l0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK29yIGFuIHNzaCBVUkw6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNsb25lIHNzaDovL3lvdXJob3N0L355b3UvcmVwb3NpdG9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGb3IgcHJvamVjdHMgd2l0aCBmZXcgZGV2ZWxvcGVycywgb3IgZm9yIHN5bmNocm9uaXppbmcgYSBmZXcgcHJpdmF0ZQorcmVwb3NpdG9yaWVzLCB0aGlzIG1heSBiZSBhbGwgeW91IG5lZWQuCisKK0hvd2V2ZXIsIHRoZSBtb3JlIGNvbW1vbiB3YXkgdG8gZG8gdGhpcyBpcyB0byBtYWludGFpbiBhIHNlcGFyYXRlIHB1YmxpYworcmVwb3NpdG9yeSAodXN1YWxseSBvbiBhIGRpZmZlcmVudCBob3N0KSBmb3Igb3RoZXJzIHRvIHB1bGwgY2hhbmdlcworZnJvbS4gIFRoaXMgaXMgdXN1YWxseSBtb3JlIGNvbnZlbmllbnQsIGFuZCBhbGxvd3MgeW91IHRvIGNsZWFubHkKK3NlcGFyYXRlIHByaXZhdGUgd29yayBpbiBwcm9ncmVzcyBmcm9tIHB1YmxpY2x5IHZpc2libGUgd29yay4KKworWW91IHdpbGwgY29udGludWUgdG8gZG8geW91ciBkYXktdG8tZGF5IHdvcmsgaW4geW91ciBwZXJzb25hbAorcmVwb3NpdG9yeSwgYnV0IHBlcmlvZGljYWxseSAicHVzaCIgY2hhbmdlcyBmcm9tIHlvdXIgcGVyc29uYWwKK3JlcG9zaXRvcnkgaW50byB5b3VyIHB1YmxpYyByZXBvc2l0b3J5LCBhbGxvd2luZyBvdGhlciBkZXZlbG9wZXJzIHRvCitwdWxsIGZyb20gdGhhdCByZXBvc2l0b3J5LiAgU28gdGhlIGZsb3cgb2YgY2hhbmdlcywgaW4gYSBzaXR1YXRpb24KK3doZXJlIHRoZXJlIGlzIG9uZSBvdGhlciBkZXZlbG9wZXIgd2l0aCBhIHB1YmxpYyByZXBvc2l0b3J5LCBsb29rcworbGlrZSB0aGlzOgorCisgICAgICAgICAgICAgICAgICAgICAgICB5b3UgcHVzaAorICB5b3VyIHBlcnNvbmFsIHJlcG8gLS0tLS0tLS0tLS0tLS0tLS0tPiB5b3VyIHB1YmxpYyByZXBvCisJXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisJfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisJfCB5b3UgcHVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoZXkgcHVsbAorCXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICB8ICAgICAgICAgICAgICAgdGhleSBwdXNoICAgICAgICAgICAgIFYKKyAgdGhlaXIgcHVibGljIHJlcG8gPC0tLS0tLS0tLS0tLS0tLS0tLS0gdGhlaXIgcmVwbworCitXZSBleHBsYWluIGhvdyB0byBkbyB0aGlzIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMuCisKK1tbc2V0dGluZy11cC1hLXB1YmxpYy1yZXBvc2l0b3J5XV0KK1NldHRpbmcgdXAgYSBwdWJsaWMgcmVwb3NpdG9yeQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0Fzc3VtZSB5b3VyIHBlcnNvbmFsIHJlcG9zaXRvcnkgaXMgaW4gdGhlIGRpcmVjdG9yeSB+L3Byb2ouICBXZQorZmlyc3QgY3JlYXRlIGEgbmV3IGNsb25lIG9mIHRoZSByZXBvc2l0b3J5IGFuZCB0ZWxsIGdpdC1kYWVtb24gdGhhdCBpdAoraXMgbWVhbnQgdG8gYmUgcHVibGljOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjbG9uZSAtLWJhcmUgfi9wcm9qIHByb2ouZ2l0CiskIHRvdWNoIHByb2ouZ2l0L2dpdC1kYWVtb24tZXhwb3J0LW9rCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSByZXN1bHRpbmcgZGlyZWN0b3J5IHByb2ouZ2l0IGNvbnRhaW5zIGEgImJhcmUiIGdpdCByZXBvc2l0b3J5LS1pdCBpcworanVzdCB0aGUgY29udGVudHMgb2YgdGhlICIuZ2l0IiBkaXJlY3RvcnksIHdpdGhvdXQgYW55IGZpbGVzIGNoZWNrZWQgb3V0Cithcm91bmQgaXQuCisKK05leHQsIGNvcHkgcHJvai5naXQgdG8gdGhlIHNlcnZlciB3aGVyZSB5b3UgcGxhbiB0byBob3N0IHRoZQorcHVibGljIHJlcG9zaXRvcnkuICBZb3UgY2FuIHVzZSBzY3AsIHJzeW5jLCBvciB3aGF0ZXZlciBpcyBtb3N0Citjb252ZW5pZW50LgorCitbW2V4cG9ydGluZy12aWEtZ2l0XV0KK0V4cG9ydGluZyBhIGdpdCByZXBvc2l0b3J5IHZpYSB0aGUgZ2l0IHByb3RvY29sCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGlzIGlzIHRoZSBwcmVmZXJyZWQgbWV0aG9kLgorCitJZiBzb21lb25lIGVsc2UgYWRtaW5pc3RlcnMgdGhlIHNlcnZlciwgdGhleSBzaG91bGQgdGVsbCB5b3Ugd2hhdAorZGlyZWN0b3J5IHRvIHB1dCB0aGUgcmVwb3NpdG9yeSBpbiwgYW5kIHdoYXQgZ2l0Oi8vIFVSTCBpdCB3aWxsIGFwcGVhcgorYXQuICBZb3UgY2FuIHRoZW4gc2tpcCB0byB0aGUgc2VjdGlvbgorIjw8cHVzaGluZy1jaGFuZ2VzLXRvLWEtcHVibGljLXJlcG9zaXRvcnksUHVzaGluZyBjaGFuZ2VzIHRvIGEgcHVibGljCityZXBvc2l0b3J5Pj4iLCBiZWxvdy4KKworT3RoZXJ3aXNlLCBhbGwgeW91IG5lZWQgdG8gZG8gaXMgc3RhcnQgbGlua2dpdDpnaXQtZGFlbW9uWzFdOyBpdCB3aWxsCitsaXN0ZW4gb24gcG9ydCA5NDE4LiAgQnkgZGVmYXVsdCwgaXQgd2lsbCBhbGxvdyBhY2Nlc3MgdG8gYW55IGRpcmVjdG9yeQordGhhdCBsb29rcyBsaWtlIGEgZ2l0IGRpcmVjdG9yeSBhbmQgY29udGFpbnMgdGhlIG1hZ2ljIGZpbGUKK2dpdC1kYWVtb24tZXhwb3J0LW9rLiAgUGFzc2luZyBzb21lIGRpcmVjdG9yeSBwYXRocyBhcyBnaXQtZGFlbW9uCithcmd1bWVudHMgd2lsbCBmdXJ0aGVyIHJlc3RyaWN0IHRoZSBleHBvcnRzIHRvIHRob3NlIHBhdGhzLgorCitZb3UgY2FuIGFsc28gcnVuIGdpdC1kYWVtb24gYXMgYW4gaW5ldGQgc2VydmljZTsgc2VlIHRoZQorbGlua2dpdDpnaXQtZGFlbW9uWzFdIG1hbiBwYWdlIGZvciBkZXRhaWxzLiAgKFNlZSBlc3BlY2lhbGx5IHRoZQorZXhhbXBsZXMgc2VjdGlvbi4pCisKK1tbZXhwb3J0aW5nLXZpYS1odHRwXV0KK0V4cG9ydGluZyBhIGdpdCByZXBvc2l0b3J5IHZpYSBodHRwCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgZ2l0IHByb3RvY29sIGdpdmVzIGJldHRlciBwZXJmb3JtYW5jZSBhbmQgcmVsaWFiaWxpdHksIGJ1dCBvbiBhCitob3N0IHdpdGggYSB3ZWIgc2VydmVyIHNldCB1cCwgaHR0cCBleHBvcnRzIG1heSBiZSBzaW1wbGVyIHRvIHNldCB1cC4KKworQWxsIHlvdSBuZWVkIHRvIGRvIGlzIHBsYWNlIHRoZSBuZXdseSBjcmVhdGVkIGJhcmUgZ2l0IHJlcG9zaXRvcnkgaW4KK2EgZGlyZWN0b3J5IHRoYXQgaXMgZXhwb3J0ZWQgYnkgdGhlIHdlYiBzZXJ2ZXIsIGFuZCBtYWtlIHNvbWUKK2FkanVzdG1lbnRzIHRvIGdpdmUgd2ViIGNsaWVudHMgc29tZSBleHRyYSBpbmZvcm1hdGlvbiB0aGV5IG5lZWQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgbXYgcHJvai5naXQgL2hvbWUveW91L3B1YmxpY19odG1sL3Byb2ouZ2l0CiskIGNkIHByb2ouZ2l0CiskIGdpdCAtLWJhcmUgdXBkYXRlLXNlcnZlci1pbmZvCiskIGNobW9kIGEreCBob29rcy9wb3N0LXVwZGF0ZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoRm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBsYXN0IHR3byBsaW5lcywgc2VlCitsaW5rZ2l0OmdpdC11cGRhdGUtc2VydmVyLWluZm9bMV0sIGFuZCB0aGUgZG9jdW1lbnRhdGlvbgorbGluazpob29rcy5odG1sW0hvb2tzIHVzZWQgYnkgZ2l0XS4pCisKK0FkdmVydGlzZSB0aGUgVVJMIG9mIHByb2ouZ2l0LiAgQW55Ym9keSBlbHNlIHNob3VsZCB0aGVuIGJlIGFibGUgdG8KK2Nsb25lIG9yIHB1bGwgZnJvbSB0aGF0IFVSTCwgZm9yIGV4YW1wbGUgd2l0aCBhIGNvbW1hbmQgbGluZSBsaWtlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjbG9uZSBodHRwOi8veW91cnNlcnZlci5jb20vfnlvdS9wcm9qLmdpdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoU2VlIGFsc28KK2xpbms6aG93dG8vc2V0dXAtZ2l0LXNlcnZlci1vdmVyLWh0dHAudHh0W3NldHVwLWdpdC1zZXJ2ZXItb3Zlci1odHRwXQorZm9yIGEgc2xpZ2h0bHkgbW9yZSBzb3BoaXN0aWNhdGVkIHNldHVwIHVzaW5nIFdlYkRBViB3aGljaCBhbHNvCithbGxvd3MgcHVzaGluZyBvdmVyIGh0dHAuKQorCitbW3B1c2hpbmctY2hhbmdlcy10by1hLXB1YmxpYy1yZXBvc2l0b3J5XV0KK1B1c2hpbmcgY2hhbmdlcyB0byBhIHB1YmxpYyByZXBvc2l0b3J5Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitOb3RlIHRoYXQgdGhlIHR3byB0ZWNobmlxdWVzIG91dGxpbmVkIGFib3ZlIChleHBvcnRpbmcgdmlhCis8PGV4cG9ydGluZy12aWEtaHR0cCxodHRwPj4gb3IgPDxleHBvcnRpbmctdmlhLWdpdCxnaXQ+PikgYWxsb3cgb3RoZXIKK21haW50YWluZXJzIHRvIGZldGNoIHlvdXIgbGF0ZXN0IGNoYW5nZXMsIGJ1dCB0aGV5IGRvIG5vdCBhbGxvdyB3cml0ZQorYWNjZXNzLCB3aGljaCB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZSB0aGUgcHVibGljIHJlcG9zaXRvcnkgd2l0aCB0aGUKK2xhdGVzdCBjaGFuZ2VzIGNyZWF0ZWQgaW4geW91ciBwcml2YXRlIHJlcG9zaXRvcnkuCisKK1RoZSBzaW1wbGVzdCB3YXkgdG8gZG8gdGhpcyBpcyB1c2luZyBsaW5rZ2l0OmdpdC1wdXNoWzFdIGFuZCBzc2g7IHRvCit1cGRhdGUgdGhlIHJlbW90ZSBicmFuY2ggbmFtZWQgIm1hc3RlciIgd2l0aCB0aGUgbGF0ZXN0IHN0YXRlIG9mIHlvdXIKK2JyYW5jaCBuYW1lZCAibWFzdGVyIiwgcnVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHB1c2ggc3NoOi8veW91cnNlcnZlci5jb20vfnlvdS9wcm9qLmdpdCBtYXN0ZXI6bWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK29yIGp1c3QKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcHVzaCBzc2g6Ly95b3Vyc2VydmVyLmNvbS9+eW91L3Byb2ouZ2l0IG1hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBcyB3aXRoIGdpdC1mZXRjaCwgZ2l0LXB1c2ggd2lsbCBjb21wbGFpbiBpZiB0aGlzIGRvZXMgbm90IHJlc3VsdCBpbiBhCis8PGZhc3QtZm9yd2FyZHMsZmFzdCBmb3J3YXJkPj47IHNlZSB0aGUgZm9sbG93aW5nIHNlY3Rpb24gZm9yIGRldGFpbHMgb24KK2hhbmRsaW5nIHRoaXMgY2FzZS4KKworTm90ZSB0aGF0IHRoZSB0YXJnZXQgb2YgYSAicHVzaCIgaXMgbm9ybWFsbHkgYQorPDxkZWZfYmFyZV9yZXBvc2l0b3J5LGJhcmU+PiByZXBvc2l0b3J5LiAgWW91IGNhbiBhbHNvIHB1c2ggdG8gYQorcmVwb3NpdG9yeSB0aGF0IGhhcyBhIGNoZWNrZWQtb3V0IHdvcmtpbmcgdHJlZSwgYnV0IHRoZSB3b3JraW5nIHRyZWUKK3dpbGwgbm90IGJlIHVwZGF0ZWQgYnkgdGhlIHB1c2guICBUaGlzIG1heSBsZWFkIHRvIHVuZXhwZWN0ZWQgcmVzdWx0cyBpZgordGhlIGJyYW5jaCB5b3UgcHVzaCB0byBpcyB0aGUgY3VycmVudGx5IGNoZWNrZWQtb3V0IGJyYW5jaCEKKworQXMgd2l0aCBnaXQtZmV0Y2gsIHlvdSBtYXkgYWxzbyBzZXQgdXAgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvCitzYXZlIHR5cGluZzsgc28sIGZvciBleGFtcGxlLCBhZnRlcgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGNhdCA+Pi5naXQvY29uZmlnIDw8RU9GCitbcmVtb3RlICJwdWJsaWMtcmVwbyJdCisJdXJsID0gc3NoOi8veW91cnNlcnZlci5jb20vfnlvdS9wcm9qLmdpdAorRU9GCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3lvdSBzaG91bGQgYmUgYWJsZSB0byBwZXJmb3JtIHRoZSBhYm92ZSBwdXNoIHdpdGgganVzdAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBwdXNoIHB1YmxpYy1yZXBvIG1hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTZWUgdGhlIGV4cGxhbmF0aW9ucyBvZiB0aGUgcmVtb3RlLjxuYW1lPi51cmwsIGJyYW5jaC48bmFtZT4ucmVtb3RlLAorYW5kIHJlbW90ZS48bmFtZT4ucHVzaCBvcHRpb25zIGluIGxpbmtnaXQ6Z2l0LWNvbmZpZ1sxXSBmb3IKK2RldGFpbHMuCisKK1tbZm9yY2luZy1wdXNoXV0KK1doYXQgdG8gZG8gd2hlbiBhIHB1c2ggZmFpbHMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworSWYgYSBwdXNoIHdvdWxkIG5vdCByZXN1bHQgaW4gYSA8PGZhc3QtZm9yd2FyZHMsZmFzdCBmb3J3YXJkPj4gb2YgdGhlCityZW1vdGUgYnJhbmNoLCB0aGVuIGl0IHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yIGxpa2U6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Vycm9yOiByZW1vdGUgJ3JlZnMvaGVhZHMvbWFzdGVyJyBpcyBub3QgYW4gYW5jZXN0b3Igb2YKKyBsb2NhbCAgJ3JlZnMvaGVhZHMvbWFzdGVyJy4KKyBNYXliZSB5b3UgYXJlIG5vdCB1cC10by1kYXRlIGFuZCBuZWVkIHRvIHB1bGwgZmlyc3Q/CitlcnJvcjogZmFpbGVkIHRvIHB1c2ggdG8gJ3NzaDovL3lvdXJzZXJ2ZXIuY29tL355b3UvcHJvai5naXQnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgY2FuIGhhcHBlbiwgZm9yIGV4YW1wbGUsIGlmIHlvdToKKworCS0gdXNlIGBnaXQgcmVzZXQgLS1oYXJkYCB0byByZW1vdmUgYWxyZWFkeS1wdWJsaXNoZWQgY29tbWl0cywgb3IKKwktIHVzZSBgZ2l0IGNvbW1pdCAtLWFtZW5kYCB0byByZXBsYWNlIGFscmVhZHktcHVibGlzaGVkIGNvbW1pdHMKKwkgIChhcyBpbiA8PGZpeGluZy1hLW1pc3Rha2UtYnktcmV3cml0aW5nLWhpc3Rvcnk+PiksIG9yCisJLSB1c2UgYGdpdCByZWJhc2VgIHRvIHJlYmFzZSBhbnkgYWxyZWFkeS1wdWJsaXNoZWQgY29tbWl0cyAoYXMKKwkgIGluIDw8dXNpbmctZ2l0LXJlYmFzZT4+KS4KKworWW91IG1heSBmb3JjZSBnaXQtcHVzaCB0byBwZXJmb3JtIHRoZSB1cGRhdGUgYW55d2F5IGJ5IHByZWNlZGluZyB0aGUKK2JyYW5jaCBuYW1lIHdpdGggYSBwbHVzIHNpZ246CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHB1c2ggc3NoOi8veW91cnNlcnZlci5jb20vfnlvdS9wcm9qLmdpdCArbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vcm1hbGx5IHdoZW5ldmVyIGEgYnJhbmNoIGhlYWQgaW4gYSBwdWJsaWMgcmVwb3NpdG9yeSBpcyBtb2RpZmllZCwgaXQKK2lzIG1vZGlmaWVkIHRvIHBvaW50IHRvIGEgZGVzY2VuZGFudCBvZiB0aGUgY29tbWl0IHRoYXQgaXQgcG9pbnRlZCB0bworYmVmb3JlLiAgQnkgZm9yY2luZyBhIHB1c2ggaW4gdGhpcyBzaXR1YXRpb24sIHlvdSBicmVhayB0aGF0IGNvbnZlbnRpb24uCisoU2VlIDw8cHJvYmxlbXMtd2l0aC1yZXdyaXRpbmctaGlzdG9yeT4+LikKKworTmV2ZXJ0aGVsZXNzLCB0aGlzIGlzIGEgY29tbW9uIHByYWN0aWNlIGZvciBwZW9wbGUgdGhhdCBuZWVkIGEgc2ltcGxlCit3YXkgdG8gcHVibGlzaCBhIHdvcmstaW4tcHJvZ3Jlc3MgcGF0Y2ggc2VyaWVzLCBhbmQgaXQgaXMgYW4gYWNjZXB0YWJsZQorY29tcHJvbWlzZSBhcyBsb25nIGFzIHlvdSB3YXJuIG90aGVyIGRldmVsb3BlcnMgdGhhdCB0aGlzIGlzIGhvdyB5b3UKK2ludGVuZCB0byBtYW5hZ2UgdGhlIGJyYW5jaC4KKworSXQncyBhbHNvIHBvc3NpYmxlIGZvciBhIHB1c2ggdG8gZmFpbCBpbiB0aGlzIHdheSB3aGVuIG90aGVyIHBlb3BsZSBoYXZlCit0aGUgcmlnaHQgdG8gcHVzaCB0byB0aGUgc2FtZSByZXBvc2l0b3J5LiAgSW4gdGhhdCBjYXNlLCB0aGUgY29ycmVjdAorc29sdXRpb24gaXMgdG8gcmV0cnkgdGhlIHB1c2ggYWZ0ZXIgZmlyc3QgdXBkYXRpbmcgeW91ciB3b3JrIGJ5IGVpdGhlciBhCitwdWxsIG9yIGEgZmV0Y2ggZm9sbG93ZWQgYnkgYSByZWJhc2U7IHNlZSB0aGUKKzw8c2V0dGluZy11cC1hLXNoYXJlZC1yZXBvc2l0b3J5LG5leHQgc2VjdGlvbj4+IGFuZAorbGluazpjdnMtbWlncmF0aW9uLmh0bWxbZ2l0IGZvciBDVlMgdXNlcnNdIGZvciBtb3JlLgorCitbW3NldHRpbmctdXAtYS1zaGFyZWQtcmVwb3NpdG9yeV1dCitTZXR0aW5nIHVwIGEgc2hhcmVkIHJlcG9zaXRvcnkKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitBbm90aGVyIHdheSB0byBjb2xsYWJvcmF0ZSBpcyBieSB1c2luZyBhIG1vZGVsIHNpbWlsYXIgdG8gdGhhdAorY29tbW9ubHkgdXNlZCBpbiBDVlMsIHdoZXJlIHNldmVyYWwgZGV2ZWxvcGVycyB3aXRoIHNwZWNpYWwgcmlnaHRzCithbGwgcHVzaCB0byBhbmQgcHVsbCBmcm9tIGEgc2luZ2xlIHNoYXJlZCByZXBvc2l0b3J5LiAgU2VlCitsaW5rOmN2cy1taWdyYXRpb24uaHRtbFtnaXQgZm9yIENWUyB1c2Vyc10gZm9yIGluc3RydWN0aW9ucyBvbiBob3cgdG8KK3NldCB0aGlzIHVwLgorCitIb3dldmVyLCB3aGlsZSB0aGVyZSBpcyBub3RoaW5nIHdyb25nIHdpdGggZ2l0J3Mgc3VwcG9ydCBmb3Igc2hhcmVkCityZXBvc2l0b3JpZXMsIHRoaXMgbW9kZSBvZiBvcGVyYXRpb24gaXMgbm90IGdlbmVyYWxseSByZWNvbW1lbmRlZCwKK3NpbXBseSBiZWNhdXNlIHRoZSBtb2RlIG9mIGNvbGxhYm9yYXRpb24gdGhhdCBnaXQgc3VwcG9ydHMtLWJ5CitleGNoYW5naW5nIHBhdGNoZXMgYW5kIHB1bGxpbmcgZnJvbSBwdWJsaWMgcmVwb3NpdG9yaWVzLS1oYXMgc28gbWFueQorYWR2YW50YWdlcyBvdmVyIHRoZSBjZW50cmFsIHNoYXJlZCByZXBvc2l0b3J5OgorCisJLSBHaXQncyBhYmlsaXR5IHRvIHF1aWNrbHkgaW1wb3J0IGFuZCBtZXJnZSBwYXRjaGVzIGFsbG93cyBhCisJICBzaW5nbGUgbWFpbnRhaW5lciB0byBwcm9jZXNzIGluY29taW5nIGNoYW5nZXMgZXZlbiBhdCB2ZXJ5CisJICBoaWdoIHJhdGVzLiAgQW5kIHdoZW4gdGhhdCBiZWNvbWVzIHRvbyBtdWNoLCBnaXQtcHVsbCBwcm92aWRlcworCSAgYW4gZWFzeSB3YXkgZm9yIHRoYXQgbWFpbnRhaW5lciB0byBkZWxlZ2F0ZSB0aGlzIGpvYiB0byBvdGhlcgorCSAgbWFpbnRhaW5lcnMgd2hpbGUgc3RpbGwgYWxsb3dpbmcgb3B0aW9uYWwgcmV2aWV3IG9mIGluY29taW5nCisJICBjaGFuZ2VzLgorCS0gU2luY2UgZXZlcnkgZGV2ZWxvcGVyJ3MgcmVwb3NpdG9yeSBoYXMgdGhlIHNhbWUgY29tcGxldGUgY29weQorCSAgb2YgdGhlIHByb2plY3QgaGlzdG9yeSwgbm8gcmVwb3NpdG9yeSBpcyBzcGVjaWFsLCBhbmQgaXQgaXMKKwkgIHRyaXZpYWwgZm9yIGFub3RoZXIgZGV2ZWxvcGVyIHRvIHRha2Ugb3ZlciBtYWludGVuYW5jZSBvZiBhCisJICBwcm9qZWN0LCBlaXRoZXIgYnkgbXV0dWFsIGFncmVlbWVudCwgb3IgYmVjYXVzZSBhIG1haW50YWluZXIKKwkgIGJlY29tZXMgdW5yZXNwb25zaXZlIG9yIGRpZmZpY3VsdCB0byB3b3JrIHdpdGguCisJLSBUaGUgbGFjayBvZiBhIGNlbnRyYWwgZ3JvdXAgb2YgImNvbW1pdHRlcnMiIG1lYW5zIHRoZXJlIGlzCisJICBsZXNzIG5lZWQgZm9yIGZvcm1hbCBkZWNpc2lvbnMgYWJvdXQgd2hvIGlzICJpbiIgYW5kIHdobyBpcworCSAgIm91dCIuCisKK1tbc2V0dGluZy11cC1naXR3ZWJdXQorQWxsb3dpbmcgd2ViIGJyb3dzaW5nIG9mIGEgcmVwb3NpdG9yeQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgZ2l0d2ViIGNnaSBzY3JpcHQgcHJvdmlkZXMgdXNlcnMgYW4gZWFzeSB3YXkgdG8gYnJvd3NlIHlvdXIKK3Byb2plY3QncyBmaWxlcyBhbmQgaGlzdG9yeSB3aXRob3V0IGhhdmluZyB0byBpbnN0YWxsIGdpdDsgc2VlIHRoZSBmaWxlCitnaXR3ZWIvSU5TVEFMTCBpbiB0aGUgZ2l0IHNvdXJjZSB0cmVlIGZvciBpbnN0cnVjdGlvbnMgb24gc2V0dGluZyBpdCB1cC4KKworW1tzaGFyaW5nLWRldmVsb3BtZW50LWV4YW1wbGVzXV0KK0V4YW1wbGVzCistLS0tLS0tLQorCitbW21haW50YWluaW5nLXRvcGljLWJyYW5jaGVzXV0KK01haW50YWluaW5nIHRvcGljIGJyYW5jaGVzIGZvciBhIExpbnV4IHN1YnN5c3RlbSBtYWludGFpbmVyCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGlzIGRlc2NyaWJlcyBob3cgVG9ueSBMdWNrIHVzZXMgZ2l0IGluIGhpcyByb2xlIGFzIG1haW50YWluZXIgb2YgdGhlCitJQTY0IGFyY2hpdGVjdHVyZSBmb3IgdGhlIExpbnV4IGtlcm5lbC4KKworSGUgdXNlcyB0d28gcHVibGljIGJyYW5jaGVzOgorCisgLSBBICJ0ZXN0IiB0cmVlIGludG8gd2hpY2ggcGF0Y2hlcyBhcmUgaW5pdGlhbGx5IHBsYWNlZCBzbyB0aGF0IHRoZXkKKyAgIGNhbiBnZXQgc29tZSBleHBvc3VyZSB3aGVuIGludGVncmF0ZWQgd2l0aCBvdGhlciBvbmdvaW5nIGRldmVsb3BtZW50LgorICAgVGhpcyB0cmVlIGlzIGF2YWlsYWJsZSB0byBBbmRyZXcgZm9yIHB1bGxpbmcgaW50byAtbW0gd2hlbmV2ZXIgaGUKKyAgIHdhbnRzLgorCisgLSBBICJyZWxlYXNlIiB0cmVlIGludG8gd2hpY2ggdGVzdGVkIHBhdGNoZXMgYXJlIG1vdmVkIGZvciBmaW5hbCBzYW5pdHkKKyAgIGNoZWNraW5nLCBhbmQgYXMgYSB2ZWhpY2xlIHRvIHNlbmQgdGhlbSB1cHN0cmVhbSB0byBMaW51cyAoYnkgc2VuZGluZworICAgaGltIGEgInBsZWFzZSBwdWxsIiByZXF1ZXN0LikKKworSGUgYWxzbyB1c2VzIGEgc2V0IG9mIHRlbXBvcmFyeSBicmFuY2hlcyAoInRvcGljIGJyYW5jaGVzIiksIGVhY2gKK2NvbnRhaW5pbmcgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHBhdGNoZXMuCisKK1RvIHNldCB0aGlzIHVwLCBmaXJzdCBjcmVhdGUgeW91ciB3b3JrIHRyZWUgYnkgY2xvbmluZyBMaW51cydzIHB1YmxpYwordHJlZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2xvbmUgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3RvcnZhbGRzL2xpbnV4LTIuNi5naXQgd29yaworJCBjZCB3b3JrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xpbnVzJ3MgdHJlZSB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgcmVtb3RlIGJyYW5jaCBuYW1lZCBvcmlnaW4vbWFzdGVyLAorYW5kIGNhbiBiZSB1cGRhdGVkIHVzaW5nIGxpbmtnaXQ6Z2l0LWZldGNoWzFdOyB5b3UgY2FuIHRyYWNrIG90aGVyCitwdWJsaWMgdHJlZXMgdXNpbmcgbGlua2dpdDpnaXQtcmVtb3RlWzFdIHRvIHNldCB1cCBhICJyZW1vdGUiIGFuZAorbGlua2dpdDpnaXQtZmV0Y2hbMV0gdG8ga2VlcCB0aGVtIHVwLXRvLWRhdGU7IHNlZQorPDxyZXBvc2l0b3JpZXMtYW5kLWJyYW5jaGVzPj4uCisKK05vdyBjcmVhdGUgdGhlIGJyYW5jaGVzIGluIHdoaWNoIHlvdSBhcmUgZ29pbmcgdG8gd29yazsgdGhlc2Ugc3RhcnQgb3V0CithdCB0aGUgY3VycmVudCB0aXAgb2Ygb3JpZ2luL21hc3RlciBicmFuY2gsIGFuZCBzaG91bGQgYmUgc2V0IHVwICh1c2luZwordGhlIC0tdHJhY2sgb3B0aW9uIHRvIGxpbmtnaXQ6Z2l0LWJyYW5jaFsxXSkgdG8gbWVyZ2UgY2hhbmdlcyBpbiBmcm9tCitMaW51cyBieSBkZWZhdWx0LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBicmFuY2ggLS10cmFjayB0ZXN0IG9yaWdpbi9tYXN0ZXIKKyQgZ2l0IGJyYW5jaCAtLXRyYWNrIHJlbGVhc2Ugb3JpZ2luL21hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGVzZSBjYW4gYmUgZWFzaWx5IGtlcHQgdXAgdG8gZGF0ZSB1c2luZyBsaW5rZ2l0OmdpdC1wdWxsWzFdLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCB0ZXN0ICYmIGdpdCBwdWxsCiskIGdpdCBjaGVja291dCByZWxlYXNlICYmIGdpdCBwdWxsCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ltcG9ydGFudCBub3RlISAgSWYgeW91IGhhdmUgYW55IGxvY2FsIGNoYW5nZXMgaW4gdGhlc2UgYnJhbmNoZXMsIHRoZW4KK3RoaXMgbWVyZ2Ugd2lsbCBjcmVhdGUgYSBjb21taXQgb2JqZWN0IGluIHRoZSBoaXN0b3J5ICh3aXRoIG5vIGxvY2FsCitjaGFuZ2VzIGdpdCB3aWxsIHNpbXBseSBkbyBhICJGYXN0IGZvcndhcmQiIG1lcmdlKS4gIE1hbnkgcGVvcGxlIGRpc2xpa2UKK3RoZSAibm9pc2UiIHRoYXQgdGhpcyBjcmVhdGVzIGluIHRoZSBMaW51eCBoaXN0b3J5LCBzbyB5b3Ugc2hvdWxkIGF2b2lkCitkb2luZyB0aGlzIGNhcHJpY2lvdXNseSBpbiB0aGUgInJlbGVhc2UiIGJyYW5jaCwgYXMgdGhlc2Ugbm9pc3kgY29tbWl0cword2lsbCBiZWNvbWUgcGFydCBvZiB0aGUgcGVybWFuZW50IGhpc3Rvcnkgd2hlbiB5b3UgYXNrIExpbnVzIHRvIHB1bGwKK2Zyb20gdGhlIHJlbGVhc2UgYnJhbmNoLgorCitBIGZldyBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyAoc2VlIGxpbmtnaXQ6Z2l0LWNvbmZpZ1sxXSkgY2FuCittYWtlIGl0IGVhc3kgdG8gcHVzaCBib3RoIGJyYW5jaGVzIHRvIHlvdXIgcHVibGljIHRyZWUuICAoU2VlCis8PHNldHRpbmctdXAtYS1wdWJsaWMtcmVwb3NpdG9yeT4+LikKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBjYXQgPj4gLmdpdC9jb25maWcgPDxFT0YKK1tyZW1vdGUgIm15dHJlZSJdCisJdXJsID0gIG1hc3Rlci5rZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvYWVnbC9saW51eC0yLjYuZ2l0CisJcHVzaCA9IHJlbGVhc2UKKwlwdXNoID0gdGVzdAorRU9GCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZW4geW91IGNhbiBwdXNoIGJvdGggdGhlIHRlc3QgYW5kIHJlbGVhc2UgdHJlZXMgdXNpbmcKK2xpbmtnaXQ6Z2l0LXB1c2hbMV06CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHB1c2ggbXl0cmVlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK29yIHB1c2gganVzdCBvbmUgb2YgdGhlIHRlc3QgYW5kIHJlbGVhc2UgYnJhbmNoZXMgdXNpbmc6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHB1c2ggbXl0cmVlIHRlc3QKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworb3IKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcHVzaCBteXRyZWUgcmVsZWFzZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3cgdG8gYXBwbHkgc29tZSBwYXRjaGVzIGZyb20gdGhlIGNvbW11bml0eS4gIFRoaW5rIG9mIGEgc2hvcnQKK3NuYXBweSBuYW1lIGZvciBhIGJyYW5jaCB0byBob2xkIHRoaXMgcGF0Y2ggKG9yIHJlbGF0ZWQgZ3JvdXAgb2YKK3BhdGNoZXMpLCBhbmQgY3JlYXRlIGEgbmV3IGJyYW5jaCBmcm9tIHRoZSBjdXJyZW50IHRpcCBvZiBMaW51cydzCiticmFuY2g6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC1iIHNwZWVkLXVwLXNwaW5sb2NrcyBvcmlnaW4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm93IHlvdSBhcHBseSB0aGUgcGF0Y2goZXMpLCBydW4gc29tZSB0ZXN0cywgYW5kIGNvbW1pdCB0aGUgY2hhbmdlKHMpLiAgSWYKK3RoZSBwYXRjaCBpcyBhIG11bHRpLXBhcnQgc2VyaWVzLCB0aGVuIHlvdSBzaG91bGQgYXBwbHkgZWFjaCBhcyBhIHNlcGFyYXRlCitjb21taXQgdG8gdGhpcyBicmFuY2guCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgLi4uIHBhdGNoIC4uLiB0ZXN0ICAuLi4gY29tbWl0IFsgLi4uIHBhdGNoIC4uLiB0ZXN0IC4uLiBjb21taXQgXSoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hlbiB5b3UgYXJlIGhhcHB5IHdpdGggdGhlIHN0YXRlIG9mIHRoaXMgY2hhbmdlLCB5b3UgY2FuIHB1bGwgaXQgaW50byB0aGUKKyJ0ZXN0IiBicmFuY2ggaW4gcHJlcGFyYXRpb24gdG8gbWFrZSBpdCBwdWJsaWM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IHRlc3QgJiYgZ2l0IHB1bGwgLiBzcGVlZC11cC1zcGlubG9ja3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSXQgaXMgdW5saWtlbHkgdGhhdCB5b3Ugd291bGQgaGF2ZSBhbnkgY29uZmxpY3RzIGhlcmUgLi4uIGJ1dCB5b3UgbWlnaHQgaWYgeW91CitzcGVudCBhIHdoaWxlIG9uIHRoaXMgc3RlcCBhbmQgaGFkIGFsc28gcHVsbGVkIG5ldyB2ZXJzaW9ucyBmcm9tIHVwc3RyZWFtLgorCitTb21lIHRpbWUgbGF0ZXIgd2hlbiBlbm91Z2ggdGltZSBoYXMgcGFzc2VkIGFuZCB0ZXN0aW5nIGRvbmUsIHlvdSBjYW4gcHVsbCB0aGUKK3NhbWUgYnJhbmNoIGludG8gdGhlICJyZWxlYXNlIiB0cmVlIHJlYWR5IHRvIGdvIHVwc3RyZWFtLiAgVGhpcyBpcyB3aGVyZSB5b3UKK3NlZSB0aGUgdmFsdWUgb2Yga2VlcGluZyBlYWNoIHBhdGNoIChvciBwYXRjaCBzZXJpZXMpIGluIGl0cyBvd24gYnJhbmNoLiAgSXQKK21lYW5zIHRoYXQgdGhlIHBhdGNoZXMgY2FuIGJlIG1vdmVkIGludG8gdGhlICJyZWxlYXNlIiB0cmVlIGluIGFueSBvcmRlci4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgcmVsZWFzZSAmJiBnaXQgcHVsbCAuIHNwZWVkLXVwLXNwaW5sb2NrcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBZnRlciBhIHdoaWxlLCB5b3Ugd2lsbCBoYXZlIGEgbnVtYmVyIG9mIGJyYW5jaGVzLCBhbmQgZGVzcGl0ZSB0aGUKK3dlbGwgY2hvc2VuIG5hbWVzIHlvdSBwaWNrZWQgZm9yIGVhY2ggb2YgdGhlbSwgeW91IG1heSBmb3JnZXQgd2hhdAordGhleSBhcmUgZm9yLCBvciB3aGF0IHN0YXR1cyB0aGV5IGFyZSBpbi4gIFRvIGdldCBhIHJlbWluZGVyIG9mIHdoYXQKK2NoYW5nZXMgYXJlIGluIGEgc3BlY2lmaWMgYnJhbmNoLCB1c2U6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZyBsaW51eC4uYnJhbmNobmFtZSB8IGdpdC1zaG9ydGxvZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUbyBzZWUgd2hldGhlciBpdCBoYXMgYWxyZWFkeSBiZWVuIG1lcmdlZCBpbnRvIHRoZSB0ZXN0IG9yIHJlbGVhc2UgYnJhbmNoZXMsCit1c2U6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZyB0ZXN0Li5icmFuY2huYW1lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK29yCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZyByZWxlYXNlLi5icmFuY2huYW1lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyhJZiB0aGlzIGJyYW5jaCBoYXMgbm90IHlldCBiZWVuIG1lcmdlZCwgeW91IHdpbGwgc2VlIHNvbWUgbG9nIGVudHJpZXMuCitJZiBpdCBoYXMgYmVlbiBtZXJnZWQsIHRoZW4gdGhlcmUgd2lsbCBiZSBubyBvdXRwdXQuKQorCitPbmNlIGEgcGF0Y2ggY29tcGxldGVzIHRoZSBncmVhdCBjeWNsZSAobW92aW5nIGZyb20gdGVzdCB0byByZWxlYXNlLAordGhlbiBwdWxsZWQgYnkgTGludXMsIGFuZCBmaW5hbGx5IGNvbWluZyBiYWNrIGludG8geW91ciBsb2NhbAorIm9yaWdpbi9tYXN0ZXIiIGJyYW5jaCksIHRoZSBicmFuY2ggZm9yIHRoaXMgY2hhbmdlIGlzIG5vIGxvbmdlciBuZWVkZWQuCitZb3UgZGV0ZWN0IHRoaXMgd2hlbiB0aGUgb3V0cHV0IGZyb206CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZyBvcmlnaW4uLmJyYW5jaG5hbWUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaXMgZW1wdHkuICBBdCB0aGlzIHBvaW50IHRoZSBicmFuY2ggY2FuIGJlIGRlbGV0ZWQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGJyYW5jaCAtZCBicmFuY2huYW1lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NvbWUgY2hhbmdlcyBhcmUgc28gdHJpdmlhbCB0aGF0IGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY3JlYXRlIGEgc2VwYXJhdGUKK2JyYW5jaCBhbmQgdGhlbiBtZXJnZSBpbnRvIGVhY2ggb2YgdGhlIHRlc3QgYW5kIHJlbGVhc2UgYnJhbmNoZXMuICBGb3IKK3RoZXNlIGNoYW5nZXMsIGp1c3QgYXBwbHkgZGlyZWN0bHkgdG8gdGhlICJyZWxlYXNlIiBicmFuY2gsIGFuZCB0aGVuCittZXJnZSB0aGF0IGludG8gdGhlICJ0ZXN0IiBicmFuY2guCisKK1RvIGNyZWF0ZSBkaWZmc3RhdCBhbmQgc2hvcnRsb2cgc3VtbWFyaWVzIG9mIGNoYW5nZXMgdG8gaW5jbHVkZSBpbiBhICJwbGVhc2UKK3B1bGwiIHJlcXVlc3QgdG8gTGludXMgeW91IGNhbiB1c2U6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgLS1zdGF0IG9yaWdpbi4ucmVsZWFzZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbG9nIC1wIG9yaWdpbi4ucmVsZWFzZSB8IGdpdCBzaG9ydGxvZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitIZXJlIGFyZSBzb21lIG9mIHRoZSBzY3JpcHRzIHRoYXQgc2ltcGxpZnkgYWxsIHRoaXMgZXZlbiBmdXJ0aGVyLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis9PT09IHVwZGF0ZSBzY3JpcHQgPT09PQorIyBVcGRhdGUgYSBicmFuY2ggaW4gbXkgR0lUIHRyZWUuICBJZiB0aGUgYnJhbmNoIHRvIGJlIHVwZGF0ZWQKKyMgaXMgb3JpZ2luLCB0aGVuIHB1bGwgZnJvbSBrZXJuZWwub3JnLiAgT3RoZXJ3aXNlIG1lcmdlCisjIG9yaWdpbi9tYXN0ZXIgYnJhbmNoIGludG8gdGVzdHxyZWxlYXNlIGJyYW5jaAorCitjYXNlICIkMSIgaW4KK3Rlc3R8cmVsZWFzZSkKKwlnaXQgY2hlY2tvdXQgJDEgJiYgZ2l0IHB1bGwgLiBvcmlnaW4KKwk7Oworb3JpZ2luKQorCWJlZm9yZT0kKGdpdCByZXYtcGFyc2UgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIpCisJZ2l0IGZldGNoIG9yaWdpbgorCWFmdGVyPSQoZ2l0IHJldi1wYXJzZSByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcikKKwlpZiBbICRiZWZvcmUgIT0gJGFmdGVyIF0KKwl0aGVuCisJCWdpdCBsb2cgJGJlZm9yZS4uJGFmdGVyIHwgZ2l0IHNob3J0bG9nCisJZmkKKwk7OworKikKKwllY2hvICJVc2FnZTogJDAgb3JpZ2lufHRlc3R8cmVsZWFzZSIgMT4mMgorCWV4aXQgMQorCTs7Citlc2FjCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKz09PT0gbWVyZ2Ugc2NyaXB0ID09PT0KKyMgTWVyZ2UgYSBicmFuY2ggaW50byBlaXRoZXIgdGhlIHRlc3Qgb3IgcmVsZWFzZSBicmFuY2gKKworcG5hbWU9JDAKKwordXNhZ2UoKQoreworCWVjaG8gIlVzYWdlOiAkcG5hbWUgYnJhbmNoIHRlc3R8cmVsZWFzZSIgMT4mMgorCWV4aXQgMQorfQorCitnaXQgc2hvdy1yZWYgLXEgLS12ZXJpZnkgLS0gcmVmcy9oZWFkcy8iJDEiIHx8IHsKKwllY2hvICJDYW4ndCBzZWUgYnJhbmNoIDwkMT4iIDE+JjIKKwl1c2FnZQorfQorCitjYXNlICIkMiIgaW4KK3Rlc3R8cmVsZWFzZSkKKwlpZiBbICQoZ2l0IGxvZyAkMi4uJDEgfCB3YyAtYykgLWVxIDAgXQorCXRoZW4KKwkJZWNobyAkMSBhbHJlYWR5IG1lcmdlZCBpbnRvICQyIDE+JjIKKwkJZXhpdCAxCisJZmkKKwlnaXQgY2hlY2tvdXQgJDIgJiYgZ2l0IHB1bGwgLiAkMQorCTs7CisqKQorCXVzYWdlCisJOzsKK2VzYWMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorPT09PSBzdGF0dXMgc2NyaXB0ID09PT0KKyMgcmVwb3J0IG9uIHN0YXR1cyBvZiBteSBpYTY0IEdJVCB0cmVlCisKK2diPSQodHB1dCBzZXRhYiAyKQorcmI9JCh0cHV0IHNldGFiIDEpCityZXN0b3JlPSQodHB1dCBzZXRhYiA5KQorCitpZiBbIGBnaXQgcmV2LWxpc3QgdGVzdC4ucmVsZWFzZSB8IHdjIC1jYCAtZ3QgMCBdCit0aGVuCisJZWNobyAkcmIgV2FybmluZzogY29tbWl0cyBpbiByZWxlYXNlIHRoYXQgYXJlIG5vdCBpbiB0ZXN0ICRyZXN0b3JlCisJZ2l0IGxvZyB0ZXN0Li5yZWxlYXNlCitmaQorCitmb3IgYnJhbmNoIGluIGBnaXQgc2hvdy1yZWYgLS1oZWFkcyB8IHNlZCAnc3xeLiovfHwnYAorZG8KKwlpZiBbICRicmFuY2ggPSB0ZXN0IC1vICRicmFuY2ggPSByZWxlYXNlIF0KKwl0aGVuCisJCWNvbnRpbnVlCisJZmkKKworCWVjaG8gLW4gJGdiID09PT09PT0gJGJyYW5jaCA9PT09PT0gJHJlc3RvcmUgIiAiCisJc3RhdHVzPQorCWZvciByZWYgaW4gdGVzdCByZWxlYXNlIG9yaWdpbi9tYXN0ZXIKKwlkbworCQlpZiBbIGBnaXQgcmV2LWxpc3QgJHJlZi4uJGJyYW5jaCB8IHdjIC1jYCAtZ3QgMCBdCisJCXRoZW4KKwkJCXN0YXR1cz0kc3RhdHVzJHtyZWY6MDoxfQorCQlmaQorCWRvbmUKKwljYXNlICRzdGF0dXMgaW4KKwl0cmwpCisJCWVjaG8gJHJiIE5lZWQgdG8gcHVsbCBpbnRvIHRlc3QgJHJlc3RvcmUKKwkJOzsKKwlybCkKKwkJZWNobyAiSW4gdGVzdCIKKwkJOzsKKwlsKQorCQllY2hvICJXYWl0aW5nIGZvciBsaW51cyIKKwkJOzsKKwkiIikKKwkJZWNobyAkcmIgQWxsIGRvbmUgJHJlc3RvcmUKKwkJOzsKKwkqKQorCQllY2hvICRyYiAiPCRzdGF0dXM+IiAkcmVzdG9yZQorCQk7OworCWVzYWMKKwlnaXQgbG9nIG9yaWdpbi9tYXN0ZXIuLiRicmFuY2ggfCBnaXQgc2hvcnRsb2cKK2RvbmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitbW2NsZWFuaW5nLXVwLWhpc3RvcnldXQorUmV3cml0aW5nIGhpc3RvcnkgYW5kIG1haW50YWluaW5nIHBhdGNoIHNlcmllcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitOb3JtYWxseSBjb21taXRzIGFyZSBvbmx5IGFkZGVkIHRvIGEgcHJvamVjdCwgbmV2ZXIgdGFrZW4gYXdheSBvcgorcmVwbGFjZWQuICBHaXQgaXMgZGVzaWduZWQgd2l0aCB0aGlzIGFzc3VtcHRpb24sIGFuZCB2aW9sYXRpbmcgaXQgd2lsbAorY2F1c2UgZ2l0J3MgbWVyZ2UgbWFjaGluZXJ5IChmb3IgZXhhbXBsZSkgdG8gZG8gdGhlIHdyb25nIHRoaW5nLgorCitIb3dldmVyLCB0aGVyZSBpcyBhIHNpdHVhdGlvbiBpbiB3aGljaCBpdCBjYW4gYmUgdXNlZnVsIHRvIHZpb2xhdGUgdGhpcworYXNzdW1wdGlvbi4KKworW1twYXRjaC1zZXJpZXNdXQorQ3JlYXRpbmcgdGhlIHBlcmZlY3QgcGF0Y2ggc2VyaWVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU3VwcG9zZSB5b3UgYXJlIGEgY29udHJpYnV0b3IgdG8gYSBsYXJnZSBwcm9qZWN0LCBhbmQgeW91IHdhbnQgdG8gYWRkIGEKK2NvbXBsaWNhdGVkIGZlYXR1cmUsIGFuZCB0byBwcmVzZW50IGl0IHRvIHRoZSBvdGhlciBkZXZlbG9wZXJzIGluIGEgd2F5Cit0aGF0IG1ha2VzIGl0IGVhc3kgZm9yIHRoZW0gdG8gcmVhZCB5b3VyIGNoYW5nZXMsIHZlcmlmeSB0aGF0IHRoZXkgYXJlCitjb3JyZWN0LCBhbmQgdW5kZXJzdGFuZCB3aHkgeW91IG1hZGUgZWFjaCBjaGFuZ2UuCisKK0lmIHlvdSBwcmVzZW50IGFsbCBvZiB5b3VyIGNoYW5nZXMgYXMgYSBzaW5nbGUgcGF0Y2ggKG9yIGNvbW1pdCksIHRoZXkKK21heSBmaW5kIHRoYXQgaXQgaXMgdG9vIG11Y2ggdG8gZGlnZXN0IGFsbCBhdCBvbmNlLgorCitJZiB5b3UgcHJlc2VudCB0aGVtIHdpdGggdGhlIGVudGlyZSBoaXN0b3J5IG9mIHlvdXIgd29yaywgY29tcGxldGUgd2l0aAorbWlzdGFrZXMsIGNvcnJlY3Rpb25zLCBhbmQgZGVhZCBlbmRzLCB0aGV5IG1heSBiZSBvdmVyd2hlbG1lZC4KKworU28gdGhlIGlkZWFsIGlzIHVzdWFsbHkgdG8gcHJvZHVjZSBhIHNlcmllcyBvZiBwYXRjaGVzIHN1Y2ggdGhhdDoKKworCTEuIEVhY2ggcGF0Y2ggY2FuIGJlIGFwcGxpZWQgaW4gb3JkZXIuCisKKwkyLiBFYWNoIHBhdGNoIGluY2x1ZGVzIGEgc2luZ2xlIGxvZ2ljYWwgY2hhbmdlLCB0b2dldGhlciB3aXRoIGEKKwkgICBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlIGNoYW5nZS4KKworCTMuIE5vIHBhdGNoIGludHJvZHVjZXMgYSByZWdyZXNzaW9uOiBhZnRlciBhcHBseWluZyBhbnkgaW5pdGlhbAorCSAgIHBhcnQgb2YgdGhlIHNlcmllcywgdGhlIHJlc3VsdGluZyBwcm9qZWN0IHN0aWxsIGNvbXBpbGVzIGFuZAorCSAgIHdvcmtzLCBhbmQgaGFzIG5vIGJ1Z3MgdGhhdCBpdCBkaWRuJ3QgaGF2ZSBiZWZvcmUuCisKKwk0LiBUaGUgY29tcGxldGUgc2VyaWVzIHByb2R1Y2VzIHRoZSBzYW1lIGVuZCByZXN1bHQgYXMgeW91ciBvd24KKwkgICAocHJvYmFibHkgbXVjaCBtZXNzaWVyISkgZGV2ZWxvcG1lbnQgcHJvY2VzcyBkaWQuCisKK1dlIHdpbGwgaW50cm9kdWNlIHNvbWUgdG9vbHMgdGhhdCBjYW4gaGVscCB5b3UgZG8gdGhpcywgZXhwbGFpbiBob3cgdG8KK3VzZSB0aGVtLCBhbmQgdGhlbiBleHBsYWluIHNvbWUgb2YgdGhlIHByb2JsZW1zIHRoYXQgY2FuIGFyaXNlIGJlY2F1c2UKK3lvdSBhcmUgcmV3cml0aW5nIGhpc3RvcnkuCisKK1tbdXNpbmctZ2l0LXJlYmFzZV1dCitLZWVwaW5nIGEgcGF0Y2ggc2VyaWVzIHVwIHRvIGRhdGUgdXNpbmcgZ2l0LXJlYmFzZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU3VwcG9zZSB0aGF0IHlvdSBjcmVhdGUgYSBicmFuY2ggIm15d29yayIgb24gYSByZW1vdGUtdHJhY2tpbmcgYnJhbmNoCisib3JpZ2luIiwgYW5kIGNyZWF0ZSBzb21lIGNvbW1pdHMgb24gdG9wIG9mIGl0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCAtYiBteXdvcmsgb3JpZ2luCiskIHZpIGZpbGUudHh0CiskIGdpdCBjb21taXQKKyQgdmkgb3RoZXJmaWxlLnR4dAorJCBnaXQgY29tbWl0CisuLi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWW91IGhhdmUgcGVyZm9ybWVkIG5vIG1lcmdlcyBpbnRvIG15d29yaywgc28gaXQgaXMganVzdCBhIHNpbXBsZSBsaW5lYXIKK3NlcXVlbmNlIG9mIHBhdGNoZXMgb24gdG9wIG9mICJvcmlnaW4iOgorCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyBvLS1vLS1vIDwtLSBvcmlnaW4KKyAgICAgICAgXAorICAgICAgICAgby0tby0tbyA8LS0gbXl3b3JrCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKworU29tZSBtb3JlIGludGVyZXN0aW5nIHdvcmsgaGFzIGJlZW4gZG9uZSBpbiB0aGUgdXBzdHJlYW0gcHJvamVjdCwgYW5kCisib3JpZ2luIiBoYXMgYWR2YW5jZWQ6CisKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorIG8tLW8tLU8tLW8tLW8tLW8gPC0tIG9yaWdpbgorICAgICAgICBcCisgICAgICAgICBhLS1iLS1jIDwtLSBteXdvcmsKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCitBdCB0aGlzIHBvaW50LCB5b3UgY291bGQgdXNlICJwdWxsIiB0byBtZXJnZSB5b3VyIGNoYW5nZXMgYmFjayBpbjsKK3RoZSByZXN1bHQgd291bGQgY3JlYXRlIGEgbmV3IG1lcmdlIGNvbW1pdCwgbGlrZSB0aGlzOgorCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyBvLS1vLS1PLS1vLS1vLS1vIDwtLSBvcmlnaW4KKyAgICAgICAgXCAgICAgICAgXAorICAgICAgICAgYS0tYi0tYy0tbSA8LS0gbXl3b3JrCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKworSG93ZXZlciwgaWYgeW91IHByZWZlciB0byBrZWVwIHRoZSBoaXN0b3J5IGluIG15d29yayBhIHNpbXBsZSBzZXJpZXMgb2YKK2NvbW1pdHMgd2l0aG91dCBhbnkgbWVyZ2VzLCB5b3UgbWF5IGluc3RlYWQgY2hvb3NlIHRvIHVzZQorbGlua2dpdDpnaXQtcmViYXNlWzFdOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCBteXdvcmsKKyQgZ2l0IHJlYmFzZSBvcmlnaW4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyB3aWxsIHJlbW92ZSBlYWNoIG9mIHlvdXIgY29tbWl0cyBmcm9tIG15d29yaywgdGVtcG9yYXJpbHkgc2F2aW5nCit0aGVtIGFzIHBhdGNoZXMgKGluIGEgZGlyZWN0b3J5IG5hbWVkICIuZG90ZXN0IiksIHVwZGF0ZSBteXdvcmsgdG8KK3BvaW50IGF0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBvcmlnaW4sIHRoZW4gYXBwbHkgZWFjaCBvZiB0aGUgc2F2ZWQKK3BhdGNoZXMgdG8gdGhlIG5ldyBteXdvcmsuICBUaGUgcmVzdWx0IHdpbGwgbG9vayBsaWtlOgorCisKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorIG8tLW8tLU8tLW8tLW8tLW8gPC0tIG9yaWdpbgorCQkgXAorCQkgIGEnLS1iJy0tYycgPC0tIG15d29yaworLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisKK0luIHRoZSBwcm9jZXNzLCBpdCBtYXkgZGlzY292ZXIgY29uZmxpY3RzLiAgSW4gdGhhdCBjYXNlIGl0IHdpbGwgc3RvcAorYW5kIGFsbG93IHlvdSB0byBmaXggdGhlIGNvbmZsaWN0czsgYWZ0ZXIgZml4aW5nIGNvbmZsaWN0cywgdXNlICJnaXQKK2FkZCIgdG8gdXBkYXRlIHRoZSBpbmRleCB3aXRoIHRob3NlIGNvbnRlbnRzLCBhbmQgdGhlbiwgaW5zdGVhZCBvZgorcnVubmluZyBnaXQtY29tbWl0LCBqdXN0IHJ1bgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCByZWJhc2UgLS1jb250aW51ZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbmQgZ2l0IHdpbGwgY29udGludWUgYXBwbHlpbmcgdGhlIHJlc3Qgb2YgdGhlIHBhdGNoZXMuCisKK0F0IGFueSBwb2ludCB5b3UgbWF5IHVzZSB0aGUgYC0tYWJvcnRgIG9wdGlvbiB0byBhYm9ydCB0aGlzIHByb2Nlc3MgYW5kCityZXR1cm4gbXl3b3JrIHRvIHRoZSBzdGF0ZSBpdCBoYWQgYmVmb3JlIHlvdSBzdGFydGVkIHRoZSByZWJhc2U6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHJlYmFzZSAtLWFib3J0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1tbcmV3cml0aW5nLW9uZS1jb21taXRdXQorUmV3cml0aW5nIGEgc2luZ2xlIGNvbW1pdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXZSBzYXcgaW4gPDxmaXhpbmctYS1taXN0YWtlLWJ5LXJld3JpdGluZy1oaXN0b3J5Pj4gdGhhdCB5b3UgY2FuIHJlcGxhY2UgdGhlCittb3N0IHJlY2VudCBjb21taXQgdXNpbmcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY29tbWl0IC0tYW1lbmQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggd2lsbCByZXBsYWNlIHRoZSBvbGQgY29tbWl0IGJ5IGEgbmV3IGNvbW1pdCBpbmNvcnBvcmF0aW5nIHlvdXIKK2NoYW5nZXMsIGdpdmluZyB5b3UgYSBjaGFuY2UgdG8gZWRpdCB0aGUgb2xkIGNvbW1pdCBtZXNzYWdlIGZpcnN0LgorCitZb3UgY2FuIGFsc28gdXNlIGEgY29tYmluYXRpb24gb2YgdGhpcyBhbmQgbGlua2dpdDpnaXQtcmViYXNlWzFdIHRvCityZXBsYWNlIGEgY29tbWl0IGZ1cnRoZXIgYmFjayBpbiB5b3VyIGhpc3RvcnkgYW5kIHJlY3JlYXRlIHRoZQoraW50ZXJ2ZW5pbmcgY2hhbmdlcyBvbiB0b3Agb2YgaXQuICBGaXJzdCwgdGFnIHRoZSBwcm9ibGVtYXRpYyBjb21taXQKK3dpdGgKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgdGFnIGJhZCBteXdvcmt+NQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoRWl0aGVyIGdpdGsgb3IgZ2l0LWxvZyBtYXkgYmUgdXNlZnVsIGZvciBmaW5kaW5nIHRoZSBjb21taXQuKQorCitUaGVuIGNoZWNrIG91dCB0aGF0IGNvbW1pdCwgZWRpdCBpdCwgYW5kIHJlYmFzZSB0aGUgcmVzdCBvZiB0aGUgc2VyaWVzCitvbiB0b3Agb2YgaXQgKG5vdGUgdGhhdCB3ZSBjb3VsZCBjaGVjayBvdXQgdGhlIGNvbW1pdCBvbiBhIHRlbXBvcmFyeQorYnJhbmNoLCBidXQgaW5zdGVhZCB3ZSdyZSB1c2luZyBhIDw8ZGV0YWNoZWQtaGVhZCxkZXRhY2hlZCBoZWFkPj4pOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCBiYWQKKyQgIyBtYWtlIGNoYW5nZXMgaGVyZSBhbmQgdXBkYXRlIHRoZSBpbmRleAorJCBnaXQgY29tbWl0IC0tYW1lbmQKKyQgZ2l0IHJlYmFzZSAtLW9udG8gSEVBRCBiYWQgbXl3b3JrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doZW4geW91J3JlIGRvbmUsIHlvdSdsbCBiZSBsZWZ0IHdpdGggbXl3b3JrIGNoZWNrZWQgb3V0LCB3aXRoIHRoZSB0b3AKK3BhdGNoZXMgb24gbXl3b3JrIHJlYXBwbGllZCBvbiB0b3Agb2YgeW91ciBtb2RpZmllZCBjb21taXQuICBZb3UgY2FuCit0aGVuIGNsZWFuIHVwIHdpdGgKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgdGFnIC1kIGJhZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3RlIHRoYXQgdGhlIGltbXV0YWJsZSBuYXR1cmUgb2YgZ2l0IGhpc3RvcnkgbWVhbnMgdGhhdCB5b3UgaGF2ZW4ndCByZWFsbHkKKyJtb2RpZmllZCIgZXhpc3RpbmcgY29tbWl0czsgaW5zdGVhZCwgeW91IGhhdmUgcmVwbGFjZWQgdGhlIG9sZCBjb21taXRzIHdpdGgKK25ldyBjb21taXRzIGhhdmluZyBuZXcgb2JqZWN0IG5hbWVzLgorCitbW3Jlb3JkZXJpbmctcGF0Y2gtc2VyaWVzXV0KK1Jlb3JkZXJpbmcgb3Igc2VsZWN0aW5nIGZyb20gYSBwYXRjaCBzZXJpZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworR2l2ZW4gb25lIGV4aXN0aW5nIGNvbW1pdCwgdGhlIGxpbmtnaXQ6Z2l0LWNoZXJyeS1waWNrWzFdIGNvbW1hbmQKK2FsbG93cyB5b3UgdG8gYXBwbHkgdGhlIGNoYW5nZSBpbnRyb2R1Y2VkIGJ5IHRoYXQgY29tbWl0IGFuZCBjcmVhdGUgYQorbmV3IGNvbW1pdCB0aGF0IHJlY29yZHMgaXQuICBTbywgZm9yIGV4YW1wbGUsIGlmICJteXdvcmsiIHBvaW50cyB0byBhCitzZXJpZXMgb2YgcGF0Y2hlcyBvbiB0b3Agb2YgIm9yaWdpbiIsIHlvdSBtaWdodCBkbyBzb21ldGhpbmcgbGlrZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgLWIgbXl3b3JrLW5ldyBvcmlnaW4KKyQgZ2l0ayBvcmlnaW4uLm15d29yayAmCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FuZCBicm93c2UgdGhyb3VnaCB0aGUgbGlzdCBvZiBwYXRjaGVzIGluIHRoZSBteXdvcmsgYnJhbmNoIHVzaW5nIGdpdGssCithcHBseWluZyB0aGVtIChwb3NzaWJseSBpbiBhIGRpZmZlcmVudCBvcmRlcikgdG8gbXl3b3JrLW5ldyB1c2luZworY2hlcnJ5LXBpY2ssIGFuZCBwb3NzaWJseSBtb2RpZnlpbmcgdGhlbSBhcyB5b3UgZ28gdXNpbmcgYGNvbW1pdCAtLWFtZW5kYC4KK1RoZSBsaW5rZ2l0OmdpdC1ndWlbMV0gY29tbWFuZCBtYXkgYWxzbyBoZWxwIGFzIGl0IGFsbG93cyB5b3UgdG8KK2luZGl2aWR1YWxseSBzZWxlY3QgZGlmZiBodW5rcyBmb3IgaW5jbHVzaW9uIGluIHRoZSBpbmRleCAoYnkKK3JpZ2h0LWNsaWNraW5nIG9uIHRoZSBkaWZmIGh1bmsgYW5kIGNob29zaW5nICJTdGFnZSBIdW5rIGZvciBDb21taXQiKS4KKworQW5vdGhlciB0ZWNobmlxdWUgaXMgdG8gdXNlIGdpdC1mb3JtYXQtcGF0Y2ggdG8gY3JlYXRlIGEgc2VyaWVzIG9mCitwYXRjaGVzLCB0aGVuIHJlc2V0IHRoZSBzdGF0ZSB0byBiZWZvcmUgdGhlIHBhdGNoZXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGZvcm1hdC1wYXRjaCBvcmlnaW4KKyQgZ2l0IHJlc2V0IC0taGFyZCBvcmlnaW4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlbiBtb2RpZnksIHJlb3JkZXIsIG9yIGVsaW1pbmF0ZSBwYXRjaGVzIGFzIHByZWZlcnJlZCBiZWZvcmUgYXBwbHlpbmcKK3RoZW0gYWdhaW4gd2l0aCBsaW5rZ2l0OmdpdC1hbVsxXS4KKworW1twYXRjaC1zZXJpZXMtdG9vbHNdXQorT3RoZXIgdG9vbHMKKy0tLS0tLS0tLS0tCisKK1RoZXJlIGFyZSBudW1lcm91cyBvdGhlciB0b29scywgc3VjaCBhcyBTdEdJVCwgd2hpY2ggZXhpc3QgZm9yIHRoZQorcHVycG9zZSBvZiBtYWludGFpbmluZyBhIHBhdGNoIHNlcmllcy4gIFRoZXNlIGFyZSBvdXRzaWRlIG9mIHRoZSBzY29wZSBvZgordGhpcyBtYW51YWwuCisKK1tbcHJvYmxlbXMtd2l0aC1yZXdyaXRpbmctaGlzdG9yeV1dCitQcm9ibGVtcyB3aXRoIHJld3JpdGluZyBoaXN0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBwcmltYXJ5IHByb2JsZW0gd2l0aCByZXdyaXRpbmcgdGhlIGhpc3Rvcnkgb2YgYSBicmFuY2ggaGFzIHRvIGRvCit3aXRoIG1lcmdpbmcuICBTdXBwb3NlIHNvbWVib2R5IGZldGNoZXMgeW91ciBicmFuY2ggYW5kIG1lcmdlcyBpdCBpbnRvCit0aGVpciBicmFuY2gsIHdpdGggYSByZXN1bHQgc29tZXRoaW5nIGxpa2UgdGhpczoKKworLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgby0tby0tTy0tby0tby0tbyA8LS0gb3JpZ2luCisgICAgICAgIFwgICAgICAgIFwKKyAgICAgICAgIHQtLXQtLXQtLW0gPC0tIHRoZWlyIGJyYW5jaDoKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCitUaGVuIHN1cHBvc2UgeW91IG1vZGlmeSB0aGUgbGFzdCB0aHJlZSBjb21taXRzOgorCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKwkgby0tby0tbyA8LS0gbmV3IGhlYWQgb2Ygb3JpZ2luCisJLworIG8tLW8tLU8tLW8tLW8tLW8gPC0tIG9sZCBoZWFkIG9mIG9yaWdpbgorLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisKK0lmIHdlIGV4YW1pbmVkIGFsbCB0aGlzIGhpc3RvcnkgdG9nZXRoZXIgaW4gb25lIHJlcG9zaXRvcnksIGl0IHdpbGwKK2xvb2sgbGlrZToKKworLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisJIG8tLW8tLW8gPC0tIG5ldyBoZWFkIG9mIG9yaWdpbgorCS8KKyBvLS1vLS1PLS1vLS1vLS1vIDwtLSBvbGQgaGVhZCBvZiBvcmlnaW4KKyAgICAgICAgXCAgICAgICAgXAorICAgICAgICAgdC0tdC0tdC0tbSA8LS0gdGhlaXIgYnJhbmNoOgorLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisKK0dpdCBoYXMgbm8gd2F5IG9mIGtub3dpbmcgdGhhdCB0aGUgbmV3IGhlYWQgaXMgYW4gdXBkYXRlZCB2ZXJzaW9uIG9mCit0aGUgb2xkIGhlYWQ7IGl0IHRyZWF0cyB0aGlzIHNpdHVhdGlvbiBleGFjdGx5IHRoZSBzYW1lIGFzIGl0IHdvdWxkIGlmCit0d28gZGV2ZWxvcGVycyBoYWQgaW5kZXBlbmRlbnRseSBkb25lIHRoZSB3b3JrIG9uIHRoZSBvbGQgYW5kIG5ldyBoZWFkcworaW4gcGFyYWxsZWwuICBBdCB0aGlzIHBvaW50LCBpZiBzb21lb25lIGF0dGVtcHRzIHRvIG1lcmdlIHRoZSBuZXcgaGVhZAoraW4gdG8gdGhlaXIgYnJhbmNoLCBnaXQgd2lsbCBhdHRlbXB0IHRvIG1lcmdlIHRvZ2V0aGVyIHRoZSB0d28gKG9sZCBhbmQKK25ldykgbGluZXMgb2YgZGV2ZWxvcG1lbnQsIGluc3RlYWQgb2YgdHJ5aW5nIHRvIHJlcGxhY2UgdGhlIG9sZCBieSB0aGUKK25ldy4gIFRoZSByZXN1bHRzIGFyZSBsaWtlbHkgdG8gYmUgdW5leHBlY3RlZC4KKworWW91IG1heSBzdGlsbCBjaG9vc2UgdG8gcHVibGlzaCBicmFuY2hlcyB3aG9zZSBoaXN0b3J5IGlzIHJld3JpdHRlbiwKK2FuZCBpdCBtYXkgYmUgdXNlZnVsIGZvciBvdGhlcnMgdG8gYmUgYWJsZSB0byBmZXRjaCB0aG9zZSBicmFuY2hlcyBpbgorb3JkZXIgdG8gZXhhbWluZSBvciB0ZXN0IHRoZW0sIGJ1dCB0aGV5IHNob3VsZCBub3QgYXR0ZW1wdCB0byBwdWxsIHN1Y2gKK2JyYW5jaGVzIGludG8gdGhlaXIgb3duIHdvcmsuCisKK0ZvciB0cnVlIGRpc3RyaWJ1dGVkIGRldmVsb3BtZW50IHRoYXQgc3VwcG9ydHMgcHJvcGVyIG1lcmdpbmcsCitwdWJsaXNoZWQgYnJhbmNoZXMgc2hvdWxkIG5ldmVyIGJlIHJld3JpdHRlbi4KKworW1tiaXNlY3QtbWVyZ2VzXV0KK1doeSBiaXNlY3RpbmcgbWVyZ2UgY29tbWl0cyBjYW4gYmUgaGFyZGVyIHRoYW4gYmlzZWN0aW5nIGxpbmVhciBoaXN0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgbGlua2dpdDpnaXQtYmlzZWN0WzFdIGNvbW1hbmQgY29ycmVjdGx5IGhhbmRsZXMgaGlzdG9yeSB0aGF0CitpbmNsdWRlcyBtZXJnZSBjb21taXRzLiAgSG93ZXZlciwgd2hlbiB0aGUgY29tbWl0IHRoYXQgaXQgZmluZHMgaXMgYQorbWVyZ2UgY29tbWl0LCB0aGUgdXNlciBtYXkgbmVlZCB0byB3b3JrIGhhcmRlciB0aGFuIHVzdWFsIHRvIGZpZ3VyZSBvdXQKK3doeSB0aGF0IGNvbW1pdCBpbnRyb2R1Y2VkIGEgcHJvYmxlbS4KKworSW1hZ2luZSB0aGlzIGhpc3Rvcnk6CisKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAgICAgLS0tWi0tLW8tLS1YLS0tLi4uLS0tby0tLUEtLS1DLS0tRAorICAgICAgICAgIFwgICAgICAgICAgICAgICAgICAgICAgIC8KKyAgICAgICAgICAgby0tLW8tLS1ZLS0tLi4uLS0tby0tLUIKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCitTdXBwb3NlIHRoYXQgb24gdGhlIHVwcGVyIGxpbmUgb2YgZGV2ZWxvcG1lbnQsIHRoZSBtZWFuaW5nIG9mIG9uZQorb2YgdGhlIGZ1bmN0aW9ucyB0aGF0IGV4aXN0cyBhdCBaIGlzIGNoYW5nZWQgYXQgY29tbWl0IFguICBUaGUKK2NvbW1pdHMgZnJvbSBaIGxlYWRpbmcgdG8gQSBjaGFuZ2UgYm90aCB0aGUgZnVuY3Rpb24ncworaW1wbGVtZW50YXRpb24gYW5kIGFsbCBjYWxsaW5nIHNpdGVzIHRoYXQgZXhpc3QgYXQgWiwgYXMgd2VsbAorYXMgbmV3IGNhbGxpbmcgc2l0ZXMgdGhleSBhZGQsIHRvIGJlIGNvbnNpc3RlbnQuICBUaGVyZSBpcyBubworYnVnIGF0IEEuCisKK1N1cHBvc2UgdGhhdCBpbiB0aGUgbWVhbnRpbWUgb24gdGhlIGxvd2VyIGxpbmUgb2YgZGV2ZWxvcG1lbnQgc29tZWJvZHkKK2FkZHMgYSBuZXcgY2FsbGluZyBzaXRlIGZvciB0aGF0IGZ1bmN0aW9uIGF0IGNvbW1pdCBZLiAgVGhlCitjb21taXRzIGZyb20gWiBsZWFkaW5nIHRvIEIgYWxsIGFzc3VtZSB0aGUgb2xkIHNlbWFudGljcyBvZiB0aGF0CitmdW5jdGlvbiBhbmQgdGhlIGNhbGxlcnMgYW5kIHRoZSBjYWxsZWUgYXJlIGNvbnNpc3RlbnQgd2l0aCBlYWNoCitvdGhlci4gIFRoZXJlIGlzIG5vIGJ1ZyBhdCBCLCBlaXRoZXIuCisKK1N1cHBvc2UgZnVydGhlciB0aGF0IHRoZSB0d28gZGV2ZWxvcG1lbnQgbGluZXMgbWVyZ2UgY2xlYW5seSBhdCBDLAorc28gbm8gY29uZmxpY3QgcmVzb2x1dGlvbiBpcyByZXF1aXJlZC4KKworTmV2ZXJ0aGVsZXNzLCB0aGUgY29kZSBhdCBDIGlzIGJyb2tlbiwgYmVjYXVzZSB0aGUgY2FsbGVycyBhZGRlZAorb24gdGhlIGxvd2VyIGxpbmUgb2YgZGV2ZWxvcG1lbnQgaGF2ZSBub3QgYmVlbiBjb252ZXJ0ZWQgdG8gdGhlIG5ldworc2VtYW50aWNzIGludHJvZHVjZWQgb24gdGhlIHVwcGVyIGxpbmUgb2YgZGV2ZWxvcG1lbnQuICBTbyBpZiBhbGwKK3lvdSBrbm93IGlzIHRoYXQgRCBpcyBiYWQsIHRoYXQgWiBpcyBnb29kLCBhbmQgdGhhdAorbGlua2dpdDpnaXQtYmlzZWN0WzFdIGlkZW50aWZpZXMgQyBhcyB0aGUgY3VscHJpdCwgaG93IHdpbGwgeW91CitmaWd1cmUgb3V0IHRoYXQgdGhlIHByb2JsZW0gaXMgZHVlIHRvIHRoaXMgY2hhbmdlIGluIHNlbWFudGljcz8KKworV2hlbiB0aGUgcmVzdWx0IG9mIGEgZ2l0LWJpc2VjdCBpcyBhIG5vbi1tZXJnZSBjb21taXQsIHlvdSBzaG91bGQKK25vcm1hbGx5IGJlIGFibGUgdG8gZGlzY292ZXIgdGhlIHByb2JsZW0gYnkgZXhhbWluaW5nIGp1c3QgdGhhdCBjb21taXQuCitEZXZlbG9wZXJzIGNhbiBtYWtlIHRoaXMgZWFzeSBieSBicmVha2luZyB0aGVpciBjaGFuZ2VzIGludG8gc21hbGwKK3NlbGYtY29udGFpbmVkIGNvbW1pdHMuICBUaGF0IHdvbid0IGhlbHAgaW4gdGhlIGNhc2UgYWJvdmUsIGhvd2V2ZXIsCitiZWNhdXNlIHRoZSBwcm9ibGVtIGlzbid0IG9idmlvdXMgZnJvbSBleGFtaW5hdGlvbiBvZiBhbnkgc2luZ2xlCitjb21taXQ7IGluc3RlYWQsIGEgZ2xvYmFsIHZpZXcgb2YgdGhlIGRldmVsb3BtZW50IGlzIHJlcXVpcmVkLiAgVG8KK21ha2UgbWF0dGVycyB3b3JzZSwgdGhlIGNoYW5nZSBpbiBzZW1hbnRpY3MgaW4gdGhlIHByb2JsZW1hdGljCitmdW5jdGlvbiBtYXkgYmUganVzdCBvbmUgc21hbGwgcGFydCBvZiB0aGUgY2hhbmdlcyBpbiB0aGUgdXBwZXIKK2xpbmUgb2YgZGV2ZWxvcG1lbnQuCisKK09uIHRoZSBvdGhlciBoYW5kLCBpZiBpbnN0ZWFkIG9mIG1lcmdpbmcgYXQgQyB5b3UgaGFkIHJlYmFzZWQgdGhlCitoaXN0b3J5IGJldHdlZW4gWiB0byBCIG9uIHRvcCBvZiBBLCB5b3Ugd291bGQgaGF2ZSBnb3R0ZW4gdGhpcworbGluZWFyIGhpc3Rvcnk6CisKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICAtLS1aLS0tby0tLVgtLS4uLi0tLW8tLS1BLS0tby0tLW8tLS1ZKi0tLi4uLS0tby0tLUIqLS1EKgorLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCitCaXNlY3RpbmcgYmV0d2VlbiBaIGFuZCBEKiB3b3VsZCBoaXQgYSBzaW5nbGUgY3VscHJpdCBjb21taXQgWSosCithbmQgdW5kZXJzdGFuZGluZyB3aHkgWSogd2FzIGJyb2tlbiB3b3VsZCBwcm9iYWJseSBiZSBlYXNpZXIuCisKK1BhcnRseSBmb3IgdGhpcyByZWFzb24sIG1hbnkgZXhwZXJpZW5jZWQgZ2l0IHVzZXJzLCBldmVuIHdoZW4KK3dvcmtpbmcgb24gYW4gb3RoZXJ3aXNlIG1lcmdlLWhlYXZ5IHByb2plY3QsIGtlZXAgdGhlIGhpc3RvcnkKK2xpbmVhciBieSByZWJhc2luZyBhZ2FpbnN0IHRoZSBsYXRlc3QgdXBzdHJlYW0gdmVyc2lvbiBiZWZvcmUKK3B1Ymxpc2hpbmcuCisKK1tbYWR2YW5jZWQtYnJhbmNoLW1hbmFnZW1lbnRdXQorQWR2YW5jZWQgYnJhbmNoIG1hbmFnZW1lbnQKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbZmV0Y2hpbmctaW5kaXZpZHVhbC1icmFuY2hlc11dCitGZXRjaGluZyBpbmRpdmlkdWFsIGJyYW5jaGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0luc3RlYWQgb2YgdXNpbmcgbGlua2dpdDpnaXQtcmVtb3RlWzFdLCB5b3UgY2FuIGFsc28gY2hvb3NlIGp1c3QKK3RvIHVwZGF0ZSBvbmUgYnJhbmNoIGF0IGEgdGltZSwgYW5kIHRvIHN0b3JlIGl0IGxvY2FsbHkgdW5kZXIgYW4KK2FyYml0cmFyeSBuYW1lOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBmZXRjaCBvcmlnaW4gdG9kbzpteS10b2RvLXdvcmsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGZpcnN0IGFyZ3VtZW50LCAib3JpZ2luIiwganVzdCB0ZWxscyBnaXQgdG8gZmV0Y2ggZnJvbSB0aGUKK3JlcG9zaXRvcnkgeW91IG9yaWdpbmFsbHkgY2xvbmVkIGZyb20uICBUaGUgc2Vjb25kIGFyZ3VtZW50IHRlbGxzIGdpdAordG8gZmV0Y2ggdGhlIGJyYW5jaCBuYW1lZCAidG9kbyIgZnJvbSB0aGUgcmVtb3RlIHJlcG9zaXRvcnksIGFuZCB0bworc3RvcmUgaXQgbG9jYWxseSB1bmRlciB0aGUgbmFtZSByZWZzL2hlYWRzL215LXRvZG8td29yay4KKworWW91IGNhbiBhbHNvIGZldGNoIGJyYW5jaGVzIGZyb20gb3RoZXIgcmVwb3NpdG9yaWVzOyBzbworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBmZXRjaCBnaXQ6Ly9leGFtcGxlLmNvbS9wcm9qLmdpdCBtYXN0ZXI6ZXhhbXBsZS1tYXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2lsbCBjcmVhdGUgYSBuZXcgYnJhbmNoIG5hbWVkICJleGFtcGxlLW1hc3RlciIgYW5kIHN0b3JlIGluIGl0IHRoZQorYnJhbmNoIG5hbWVkICJtYXN0ZXIiIGZyb20gdGhlIHJlcG9zaXRvcnkgYXQgdGhlIGdpdmVuIFVSTC4gIElmIHlvdQorYWxyZWFkeSBoYXZlIGEgYnJhbmNoIG5hbWVkIGV4YW1wbGUtbWFzdGVyLCBpdCB3aWxsIGF0dGVtcHQgdG8KKzw8ZmFzdC1mb3J3YXJkcyxmYXN0LWZvcndhcmQ+PiB0byB0aGUgY29tbWl0IGdpdmVuIGJ5IGV4YW1wbGUuY29tJ3MKK21hc3RlciBicmFuY2guICBJbiBtb3JlIGRldGFpbDoKKworW1tmZXRjaC1mYXN0LWZvcndhcmRzXV0KK2dpdCBmZXRjaCBhbmQgZmFzdC1mb3J3YXJkcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0luIHRoZSBwcmV2aW91cyBleGFtcGxlLCB3aGVuIHVwZGF0aW5nIGFuIGV4aXN0aW5nIGJyYW5jaCwgImdpdAorZmV0Y2giIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbW9zdCByZWNlbnQgY29tbWl0IG9uIHRoZSByZW1vdGUKK2JyYW5jaCBpcyBhIGRlc2NlbmRhbnQgb2YgdGhlIG1vc3QgcmVjZW50IGNvbW1pdCBvbiB5b3VyIGNvcHkgb2YgdGhlCiticmFuY2ggYmVmb3JlIHVwZGF0aW5nIHlvdXIgY29weSBvZiB0aGUgYnJhbmNoIHRvIHBvaW50IGF0IHRoZSBuZXcKK2NvbW1pdC4gIEdpdCBjYWxscyB0aGlzIHByb2Nlc3MgYSA8PGZhc3QtZm9yd2FyZHMsZmFzdCBmb3J3YXJkPj4uCisKK0EgZmFzdCBmb3J3YXJkIGxvb2tzIHNvbWV0aGluZyBsaWtlIHRoaXM6CisKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorIG8tLW8tLW8tLW8gPC0tIG9sZCBoZWFkIG9mIHRoZSBicmFuY2gKKyAgICAgICAgICAgXAorICAgICAgICAgICAgby0tby0tbyA8LS0gbmV3IGhlYWQgb2YgdGhlIGJyYW5jaAorLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisKKworSW4gc29tZSBjYXNlcyBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBuZXcgaGVhZCB3aWxsICpub3QqIGFjdHVhbGx5IGJlCithIGRlc2NlbmRhbnQgb2YgdGhlIG9sZCBoZWFkLiAgRm9yIGV4YW1wbGUsIHRoZSBkZXZlbG9wZXIgbWF5IGhhdmUKK3JlYWxpemVkIHNoZSBtYWRlIGEgc2VyaW91cyBtaXN0YWtlLCBhbmQgZGVjaWRlZCB0byBiYWNrdHJhY2ssCityZXN1bHRpbmcgaW4gYSBzaXR1YXRpb24gbGlrZToKKworLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgby0tby0tby0tby0tYS0tYiA8LS0gb2xkIGhlYWQgb2YgdGhlIGJyYW5jaAorICAgICAgICAgICBcCisgICAgICAgICAgICBvLS1vLS1vIDwtLSBuZXcgaGVhZCBvZiB0aGUgYnJhbmNoCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKworSW4gdGhpcyBjYXNlLCAiZ2l0IGZldGNoIiB3aWxsIGZhaWwsIGFuZCBwcmludCBvdXQgYSB3YXJuaW5nLgorCitJbiB0aGF0IGNhc2UsIHlvdSBjYW4gc3RpbGwgZm9yY2UgZ2l0IHRvIHVwZGF0ZSB0byB0aGUgbmV3IGhlYWQsIGFzCitkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9uLiAgSG93ZXZlciwgbm90ZSB0aGF0IGluIHRoZQorc2l0dWF0aW9uIGFib3ZlIHRoaXMgbWF5IG1lYW4gbG9zaW5nIHRoZSBjb21taXRzIGxhYmVsZWQgImEiIGFuZCAiYiIsCit1bmxlc3MgeW91J3ZlIGFscmVhZHkgY3JlYXRlZCBhIHJlZmVyZW5jZSBvZiB5b3VyIG93biBwb2ludGluZyB0bwordGhlbS4KKworW1tmb3JjaW5nLWZldGNoXV0KK0ZvcmNpbmcgZ2l0IGZldGNoIHRvIGRvIG5vbi1mYXN0LWZvcndhcmQgdXBkYXRlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIGdpdCBmZXRjaCBmYWlscyBiZWNhdXNlIHRoZSBuZXcgaGVhZCBvZiBhIGJyYW5jaCBpcyBub3QgYQorZGVzY2VuZGFudCBvZiB0aGUgb2xkIGhlYWQsIHlvdSBtYXkgZm9yY2UgdGhlIHVwZGF0ZSB3aXRoOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBmZXRjaCBnaXQ6Ly9leGFtcGxlLmNvbS9wcm9qLmdpdCArbWFzdGVyOnJlZnMvcmVtb3Rlcy9leGFtcGxlL21hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3RlIHRoZSBhZGRpdGlvbiBvZiB0aGUgIisiIHNpZ24uICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSB0aGUgIi1mIgorZmxhZyB0byBmb3JjZSB1cGRhdGVzIG9mIGFsbCB0aGUgZmV0Y2hlZCBicmFuY2hlcywgYXMgaW46CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGZldGNoIC1mIG9yaWdpbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCZSBhd2FyZSB0aGF0IGNvbW1pdHMgdGhhdCB0aGUgb2xkIHZlcnNpb24gb2YgZXhhbXBsZS9tYXN0ZXIgcG9pbnRlZCBhdAorbWF5IGJlIGxvc3QsIGFzIHdlIHNhdyBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi4KKworW1tyZW1vdGUtYnJhbmNoLWNvbmZpZ3VyYXRpb25dXQorQ29uZmlndXJpbmcgcmVtb3RlIGJyYW5jaGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2Ugc2F3IGFib3ZlIHRoYXQgIm9yaWdpbiIgaXMganVzdCBhIHNob3J0Y3V0IHRvIHJlZmVyIHRvIHRoZQorcmVwb3NpdG9yeSB0aGF0IHlvdSBvcmlnaW5hbGx5IGNsb25lZCBmcm9tLiAgVGhpcyBpbmZvcm1hdGlvbiBpcworc3RvcmVkIGluIGdpdCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcywgd2hpY2ggeW91IGNhbiBzZWUgdXNpbmcKK2xpbmtnaXQ6Z2l0LWNvbmZpZ1sxXToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY29uZmlnIC1sCitjb3JlLnJlcG9zaXRvcnlmb3JtYXR2ZXJzaW9uPTAKK2NvcmUuZmlsZW1vZGU9dHJ1ZQorY29yZS5sb2dhbGxyZWZ1cGRhdGVzPXRydWUKK3JlbW90ZS5vcmlnaW4udXJsPWdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vZ2l0L2dpdC5naXQKK3JlbW90ZS5vcmlnaW4uZmV0Y2g9K3JlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoKK2JyYW5jaC5tYXN0ZXIucmVtb3RlPW9yaWdpbgorYnJhbmNoLm1hc3Rlci5tZXJnZT1yZWZzL2hlYWRzL21hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiB0aGVyZSBhcmUgb3RoZXIgcmVwb3NpdG9yaWVzIHRoYXQgeW91IGFsc28gdXNlIGZyZXF1ZW50bHksIHlvdSBjYW4KK2NyZWF0ZSBzaW1pbGFyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBzYXZlIHR5cGluZzsgZm9yIGV4YW1wbGUsCithZnRlcgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjb25maWcgcmVtb3RlLmV4YW1wbGUudXJsIGdpdDovL2V4YW1wbGUuY29tL3Byb2ouZ2l0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RoZW4gdGhlIGZvbGxvd2luZyB0d28gY29tbWFuZHMgd2lsbCBkbyB0aGUgc2FtZSB0aGluZzoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZmV0Y2ggZ2l0Oi8vZXhhbXBsZS5jb20vcHJvai5naXQgbWFzdGVyOnJlZnMvcmVtb3Rlcy9leGFtcGxlL21hc3RlcgorJCBnaXQgZmV0Y2ggZXhhbXBsZSBtYXN0ZXI6cmVmcy9yZW1vdGVzL2V4YW1wbGUvbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0V2ZW4gYmV0dGVyLCBpZiB5b3UgYWRkIG9uZSBtb3JlIG9wdGlvbjoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY29uZmlnIHJlbW90ZS5leGFtcGxlLmZldGNoIG1hc3RlcjpyZWZzL3JlbW90ZXMvZXhhbXBsZS9tYXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGhlbiB0aGUgZm9sbG93aW5nIGNvbW1hbmRzIHdpbGwgYWxsIGRvIHRoZSBzYW1lIHRoaW5nOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBmZXRjaCBnaXQ6Ly9leGFtcGxlLmNvbS9wcm9qLmdpdCBtYXN0ZXI6cmVmcy9yZW1vdGVzL2V4YW1wbGUvbWFzdGVyCiskIGdpdCBmZXRjaCBleGFtcGxlIG1hc3RlcjpyZWZzL3JlbW90ZXMvZXhhbXBsZS9tYXN0ZXIKKyQgZ2l0IGZldGNoIGV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWW91IGNhbiBhbHNvIGFkZCBhICIrIiB0byBmb3JjZSB0aGUgdXBkYXRlIGVhY2ggdGltZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY29uZmlnIHJlbW90ZS5leGFtcGxlLmZldGNoICttYXN0ZXI6cmVmL3JlbW90ZXMvZXhhbXBsZS9tYXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRG9uJ3QgZG8gdGhpcyB1bmxlc3MgeW91J3JlIHN1cmUgeW91IHdvbid0IG1pbmQgImdpdCBmZXRjaCIgcG9zc2libHkKK3Rocm93aW5nIGF3YXkgY29tbWl0cyBvbiBteWJyYW5jaC4KKworQWxzbyBub3RlIHRoYXQgYWxsIG9mIHRoZSBhYm92ZSBjb25maWd1cmF0aW9uIGNhbiBiZSBwZXJmb3JtZWQgYnkKK2RpcmVjdGx5IGVkaXRpbmcgdGhlIGZpbGUgLmdpdC9jb25maWcgaW5zdGVhZCBvZiB1c2luZworbGlua2dpdDpnaXQtY29uZmlnWzFdLgorCitTZWUgbGlua2dpdDpnaXQtY29uZmlnWzFdIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIGNvbmZpZ3VyYXRpb24KK29wdGlvbnMgbWVudGlvbmVkIGFib3ZlLgorCisKK1tbZ2l0LWNvbmNlcHRzXV0KK0dpdCBjb25jZXB0cworPT09PT09PT09PT09CisKK0dpdCBpcyBidWlsdCBvbiBhIHNtYWxsIG51bWJlciBvZiBzaW1wbGUgYnV0IHBvd2VyZnVsIGlkZWFzLiAgV2hpbGUgaXQKK2lzIHBvc3NpYmxlIHRvIGdldCB0aGluZ3MgZG9uZSB3aXRob3V0IHVuZGVyc3RhbmRpbmcgdGhlbSwgeW91IHdpbGwgZmluZAorZ2l0IG11Y2ggbW9yZSBpbnR1aXRpdmUgaWYgeW91IGRvLgorCitXZSBzdGFydCB3aXRoIHRoZSBtb3N0IGltcG9ydGFudCwgdGhlICA8PGRlZl9vYmplY3RfZGF0YWJhc2Usb2JqZWN0CitkYXRhYmFzZT4+IGFuZCB0aGUgPDxkZWZfaW5kZXgsaW5kZXg+Pi4KKworW1t0aGUtb2JqZWN0LWRhdGFiYXNlXV0KK1RoZSBPYmplY3QgRGF0YWJhc2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitXZSBhbHJlYWR5IHNhdyBpbiA8PHVuZGVyc3RhbmRpbmctY29tbWl0cz4+IHRoYXQgYWxsIGNvbW1pdHMgYXJlIHN0b3JlZAordW5kZXIgYSA0MC1kaWdpdCAib2JqZWN0IG5hbWUiLiAgSW4gZmFjdCwgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8KK3JlcHJlc2VudCB0aGUgaGlzdG9yeSBvZiBhIHByb2plY3QgaXMgc3RvcmVkIGluIG9iamVjdHMgd2l0aCBzdWNoIG5hbWVzLgorSW4gZWFjaCBjYXNlIHRoZSBuYW1lIGlzIGNhbGN1bGF0ZWQgYnkgdGFraW5nIHRoZSBTSEExIGhhc2ggb2YgdGhlCitjb250ZW50cyBvZiB0aGUgb2JqZWN0LiAgVGhlIFNIQTEgaGFzaCBpcyBhIGNyeXB0b2dyYXBoaWMgaGFzaCBmdW5jdGlvbi4KK1doYXQgdGhhdCBtZWFucyB0byB1cyBpcyB0aGF0IGl0IGlzIGltcG9zc2libGUgdG8gZmluZCB0d28gZGlmZmVyZW50CitvYmplY3RzIHdpdGggdGhlIHNhbWUgbmFtZS4gIFRoaXMgaGFzIGEgbnVtYmVyIG9mIGFkdmFudGFnZXM7IGFtb25nCitvdGhlcnM6CisKKy0gR2l0IGNhbiBxdWlja2x5IGRldGVybWluZSB3aGV0aGVyIHR3byBvYmplY3RzIGFyZSBpZGVudGljYWwgb3Igbm90LAorICBqdXN0IGJ5IGNvbXBhcmluZyBuYW1lcy4KKy0gU2luY2Ugb2JqZWN0IG5hbWVzIGFyZSBjb21wdXRlZCB0aGUgc2FtZSB3YXkgaW4gZXZlcnkgcmVwb3NpdG9yeSwgdGhlCisgIHNhbWUgY29udGVudCBzdG9yZWQgaW4gdHdvIHJlcG9zaXRvcmllcyB3aWxsIGFsd2F5cyBiZSBzdG9yZWQgdW5kZXIKKyAgdGhlIHNhbWUgbmFtZS4KKy0gR2l0IGNhbiBkZXRlY3QgZXJyb3JzIHdoZW4gaXQgcmVhZHMgYW4gb2JqZWN0LCBieSBjaGVja2luZyB0aGF0IHRoZQorICBvYmplY3QncyBuYW1lIGlzIHN0aWxsIHRoZSBTSEExIGhhc2ggb2YgaXRzIGNvbnRlbnRzLgorCisoU2VlIDw8b2JqZWN0LWRldGFpbHM+PiBmb3IgdGhlIGRldGFpbHMgb2YgdGhlIG9iamVjdCBmb3JtYXR0aW5nIGFuZAorU0hBMSBjYWxjdWxhdGlvbi4pCisKK1RoZXJlIGFyZSBmb3VyIGRpZmZlcmVudCB0eXBlcyBvZiBvYmplY3RzOiAiYmxvYiIsICJ0cmVlIiwgImNvbW1pdCIsIGFuZAorInRhZyIuCisKKy0gQSA8PGRlZl9ibG9iX29iamVjdCwiYmxvYiIgb2JqZWN0Pj4gaXMgdXNlZCB0byBzdG9yZSBmaWxlIGRhdGEuCistIEEgPDxkZWZfdHJlZV9vYmplY3QsInRyZWUiIG9iamVjdD4+IGlzIGFuIG9iamVjdCB0aGF0IHRpZXMgb25lIG9yIG1vcmUKKyAgImJsb2IiIG9iamVjdHMgaW50byBhIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuIEluIGFkZGl0aW9uLCBhIHRyZWUgb2JqZWN0CisgIGNhbiByZWZlciB0byBvdGhlciB0cmVlIG9iamVjdHMsIHRodXMgY3JlYXRpbmcgYSBkaXJlY3RvcnkgaGllcmFyY2h5LgorLSBBIDw8ZGVmX2NvbW1pdF9vYmplY3QsImNvbW1pdCIgb2JqZWN0Pj4gdGllcyBzdWNoIGRpcmVjdG9yeSBoaWVyYXJjaGllcworICB0b2dldGhlciBpbnRvIGEgPDxkZWZfREFHLGRpcmVjdGVkIGFjeWNsaWMgZ3JhcGg+PiBvZiByZXZpc2lvbnMtLWVhY2gKKyAgY29tbWl0IGNvbnRhaW5zIHRoZSBvYmplY3QgbmFtZSBvZiBleGFjdGx5IG9uZSB0cmVlIGRlc2lnbmF0aW5nIHRoZQorICBkaXJlY3RvcnkgaGllcmFyY2h5IGF0IHRoZSB0aW1lIG9mIHRoZSBjb21taXQuIEluIGFkZGl0aW9uLCBhIGNvbW1pdAorICByZWZlcnMgdG8gInBhcmVudCIgY29tbWl0IG9iamVjdHMgdGhhdCBkZXNjcmliZSB0aGUgaGlzdG9yeSBvZiBob3cgd2UKKyAgYXJyaXZlZCBhdCB0aGF0IGRpcmVjdG9yeSBoaWVyYXJjaHkuCistIEEgPDxkZWZfdGFnX29iamVjdCwidGFnIiBvYmplY3Q+PiBzeW1ib2xpY2FsbHkgaWRlbnRpZmllcyBhbmQgY2FuIGJlCisgIHVzZWQgdG8gc2lnbiBvdGhlciBvYmplY3RzLiBJdCBjb250YWlucyB0aGUgb2JqZWN0IG5hbWUgYW5kIHR5cGUgb2YKKyAgYW5vdGhlciBvYmplY3QsIGEgc3ltYm9saWMgbmFtZSAob2YgY291cnNlISkgYW5kLCBvcHRpb25hbGx5LCBhCisgIHNpZ25hdHVyZS4KKworVGhlIG9iamVjdCB0eXBlcyBpbiBzb21lIG1vcmUgZGV0YWlsOgorCitbW2NvbW1pdC1vYmplY3RdXQorQ29tbWl0IE9iamVjdAorfn5+fn5+fn5+fn5+fgorCitUaGUgImNvbW1pdCIgb2JqZWN0IGxpbmtzIGEgcGh5c2ljYWwgc3RhdGUgb2YgYSB0cmVlIHdpdGggYSBkZXNjcmlwdGlvbgorb2YgaG93IHdlIGdvdCB0aGVyZSBhbmQgd2h5LiAgVXNlIHRoZSAtLXByZXR0eT1yYXcgb3B0aW9uIHRvCitsaW5rZ2l0OmdpdC1zaG93WzFdIG9yIGxpbmtnaXQ6Z2l0LWxvZ1sxXSB0byBleGFtaW5lIHlvdXIgZmF2b3JpdGUKK2NvbW1pdDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93IC1zIC0tcHJldHR5PXJhdyAyYmU3ZmNiNDc2Citjb21taXQgMmJlN2ZjYjQ3NjRmMmRiY2VlNTI2MzViOTFmZWRiMWIzZGNmN2FiNAordHJlZSBmYjNhOGJkZDBjZWRkZDAxOTYxNWFmNGQ1N2E1M2Y0M2Q4Y2VlMmJmCitwYXJlbnQgMjU3YTg0ZDlkMDJlOTA0NDdiMTQ5YWY1OGIyNzFjMTk0MDVlZGI2YQorYXV0aG9yIERhdmUgV2F0c29uIDxkd2F0c29uQG1pbXZpc3RhLmNvbT4gMTE4NzU3Njg3MiAtMDQwMAorY29tbWl0dGVyIEp1bmlvIEMgSGFtYW5vIDxnaXRzdGVyQHBvYm94LmNvbT4gMTE4NzU5MTE2MyAtMDcwMAorCisgICAgRml4IG1pc3NwZWxsaW5nIG9mICdzdXBwcmVzcycgaW4gZG9jcworCisgICAgU2lnbmVkLW9mZi1ieTogSnVuaW8gQyBIYW1hbm8gPGdpdHN0ZXJAcG9ib3guY29tPgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FzIHlvdSBjYW4gc2VlLCBhIGNvbW1pdCBpcyBkZWZpbmVkIGJ5OgorCistIGEgdHJlZTogVGhlIFNIQTEgbmFtZSBvZiBhIHRyZWUgb2JqZWN0IChhcyBkZWZpbmVkIGJlbG93KSwgcmVwcmVzZW50aW5nCisgIHRoZSBjb250ZW50cyBvZiBhIGRpcmVjdG9yeSBhdCBhIGNlcnRhaW4gcG9pbnQgaW4gdGltZS4KKy0gcGFyZW50KHMpOiBUaGUgU0hBMSBuYW1lIG9mIHNvbWUgbnVtYmVyIG9mIGNvbW1pdHMgd2hpY2ggcmVwcmVzZW50IHRoZQorICBpbW1lZGlhdGVseSBwcmV2aW91cyBzdGVwKHMpIGluIHRoZSBoaXN0b3J5IG9mIHRoZSBwcm9qZWN0LiAgVGhlCisgIGV4YW1wbGUgYWJvdmUgaGFzIG9uZSBwYXJlbnQ7IG1lcmdlIGNvbW1pdHMgbWF5IGhhdmUgbW9yZSB0aGFuCisgIG9uZS4gIEEgY29tbWl0IHdpdGggbm8gcGFyZW50cyBpcyBjYWxsZWQgYSAicm9vdCIgY29tbWl0LCBhbmQKKyAgcmVwcmVzZW50cyB0aGUgaW5pdGlhbCByZXZpc2lvbiBvZiBhIHByb2plY3QuICBFYWNoIHByb2plY3QgbXVzdCBoYXZlCisgIGF0IGxlYXN0IG9uZSByb290LiAgQSBwcm9qZWN0IGNhbiBhbHNvIGhhdmUgbXVsdGlwbGUgcm9vdHMsIHRob3VnaAorICB0aGF0IGlzbid0IGNvbW1vbiAob3IgbmVjZXNzYXJpbHkgYSBnb29kIGlkZWEpLgorLSBhbiBhdXRob3I6IFRoZSBuYW1lIG9mIHRoZSBwZXJzb24gcmVzcG9uc2libGUgZm9yIHRoaXMgY2hhbmdlLCB0b2dldGhlcgorICB3aXRoIGl0cyBkYXRlLgorLSBhIGNvbW1pdHRlcjogVGhlIG5hbWUgb2YgdGhlIHBlcnNvbiB3aG8gYWN0dWFsbHkgY3JlYXRlZCB0aGUgY29tbWl0LAorICB3aXRoIHRoZSBkYXRlIGl0IHdhcyBkb25lLiAgVGhpcyBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIGF1dGhvciwgZm9yCisgIGV4YW1wbGUsIGlmIHRoZSBhdXRob3Igd2FzIHNvbWVvbmUgd2hvIHdyb3RlIGEgcGF0Y2ggYW5kIGVtYWlsZWQgaXQKKyAgdG8gdGhlIHBlcnNvbiB3aG8gdXNlZCBpdCB0byBjcmVhdGUgdGhlIGNvbW1pdC4KKy0gYSBjb21tZW50IGRlc2NyaWJpbmcgdGhpcyBjb21taXQuCisKK05vdGUgdGhhdCBhIGNvbW1pdCBkb2VzIG5vdCBpdHNlbGYgY29udGFpbiBhbnkgaW5mb3JtYXRpb24gYWJvdXQgd2hhdAorYWN0dWFsbHkgY2hhbmdlZDsgYWxsIGNoYW5nZXMgYXJlIGNhbGN1bGF0ZWQgYnkgY29tcGFyaW5nIHRoZSBjb250ZW50cworb2YgdGhlIHRyZWUgcmVmZXJyZWQgdG8gYnkgdGhpcyBjb21taXQgd2l0aCB0aGUgdHJlZXMgYXNzb2NpYXRlZCB3aXRoCitpdHMgcGFyZW50cy4gIEluIHBhcnRpY3VsYXIsIGdpdCBkb2VzIG5vdCBhdHRlbXB0IHRvIHJlY29yZCBmaWxlIHJlbmFtZXMKK2V4cGxpY2l0bHksIHRob3VnaCBpdCBjYW4gaWRlbnRpZnkgY2FzZXMgd2hlcmUgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgc2FtZQorZmlsZSBkYXRhIGF0IGNoYW5naW5nIHBhdGhzIHN1Z2dlc3RzIGEgcmVuYW1lLiAgKFNlZSwgZm9yIGV4YW1wbGUsIHRoZQorLU0gb3B0aW9uIHRvIGxpbmtnaXQ6Z2l0LWRpZmZbMV0pLgorCitBIGNvbW1pdCBpcyB1c3VhbGx5IGNyZWF0ZWQgYnkgbGlua2dpdDpnaXQtY29tbWl0WzFdLCB3aGljaCBjcmVhdGVzIGEKK2NvbW1pdCB3aG9zZSBwYXJlbnQgaXMgbm9ybWFsbHkgdGhlIGN1cnJlbnQgSEVBRCwgYW5kIHdob3NlIHRyZWUgaXMKK3Rha2VuIGZyb20gdGhlIGNvbnRlbnQgY3VycmVudGx5IHN0b3JlZCBpbiB0aGUgaW5kZXguCisKK1tbdHJlZS1vYmplY3RdXQorVHJlZSBPYmplY3QKK35+fn5+fn5+fn5+CisKK1RoZSBldmVyLXZlcnNhdGlsZSBsaW5rZ2l0OmdpdC1zaG93WzFdIGNvbW1hbmQgY2FuIGFsc28gYmUgdXNlZCB0bworZXhhbWluZSB0cmVlIG9iamVjdHMsIGJ1dCBsaW5rZ2l0OmdpdC1scy10cmVlWzFdIHdpbGwgZ2l2ZSB5b3UgbW9yZQorZGV0YWlsczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBscy10cmVlIGZiM2E4YmRkMGNlCisxMDA2NDQgYmxvYiA2M2M5MThjNjY3ZmEwMDVmZjEyYWQ4OTQzN2YyZmRjODA5MjZlMjFjICAgIC5naXRpZ25vcmUKKzEwMDY0NCBibG9iIDU1MjliMTk4ZThkMTRkZWNiZTRhZDk5ZGIzZjdmYjYzMmRlMDQzOWQgICAgLm1haWxtYXAKKzEwMDY0NCBibG9iIDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgICAgQ09QWUlORworMDQwMDAwIHRyZWUgMmZiNzgzZTQ3NzEwMGNlMDc2ZjZiZjU3ZTRhNmYwMjYwMTNkYzc0NSAgICBEb2N1bWVudGF0aW9uCisxMDA3NTUgYmxvYiAzYzAwMzJjZWM1OTJhNzY1NjkyMjM0ZjFjYmE0N2RmZGNjM2E5MjAwICAgIEdJVC1WRVJTSU9OLUdFTgorMTAwNjQ0IGJsb2IgMjg5YjA0NmE0NDNjMDY0NzYyNDYwN2Q0NzEyODliMmM3ZGNkNDcwYiAgICBJTlNUQUxMCisxMDA2NDQgYmxvYiA0ZWI0NjM3OTdhZGM2OTNkYzE2OGI5MjZiNjkzMmZmNTNmMTdkMGIxICAgIE1ha2VmaWxlCisxMDA2NDQgYmxvYiA1NDgxNDJjMzI3YTY3OTBmZjg4MjFkNjdjMmVlMWVmZjdhNjU2YjUyICAgIFJFQURNRQorLi4uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQXMgeW91IGNhbiBzZWUsIGEgdHJlZSBvYmplY3QgY29udGFpbnMgYSBsaXN0IG9mIGVudHJpZXMsIGVhY2ggd2l0aCBhCittb2RlLCBvYmplY3QgdHlwZSwgU0hBMSBuYW1lLCBhbmQgbmFtZSwgc29ydGVkIGJ5IG5hbWUuICBJdCByZXByZXNlbnRzCit0aGUgY29udGVudHMgb2YgYSBzaW5nbGUgZGlyZWN0b3J5IHRyZWUuCisKK1RoZSBvYmplY3QgdHlwZSBtYXkgYmUgYSBibG9iLCByZXByZXNlbnRpbmcgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSwgb3IKK2Fub3RoZXIgdHJlZSwgcmVwcmVzZW50aW5nIHRoZSBjb250ZW50cyBvZiBhIHN1YmRpcmVjdG9yeS4gIFNpbmNlIHRyZWVzCithbmQgYmxvYnMsIGxpa2UgYWxsIG90aGVyIG9iamVjdHMsIGFyZSBuYW1lZCBieSB0aGUgU0hBMSBoYXNoIG9mIHRoZWlyCitjb250ZW50cywgdHdvIHRyZWVzIGhhdmUgdGhlIHNhbWUgU0hBMSBuYW1lIGlmIGFuZCBvbmx5IGlmIHRoZWlyCitjb250ZW50cyAoaW5jbHVkaW5nLCByZWN1cnNpdmVseSwgdGhlIGNvbnRlbnRzIG9mIGFsbCBzdWJkaXJlY3RvcmllcykKK2FyZSBpZGVudGljYWwuICBUaGlzIGFsbG93cyBnaXQgdG8gcXVpY2tseSBkZXRlcm1pbmUgdGhlIGRpZmZlcmVuY2VzCitiZXR3ZWVuIHR3byByZWxhdGVkIHRyZWUgb2JqZWN0cywgc2luY2UgaXQgY2FuIGlnbm9yZSBhbnkgZW50cmllcyB3aXRoCitpZGVudGljYWwgb2JqZWN0IG5hbWVzLgorCisoTm90ZTogaW4gdGhlIHByZXNlbmNlIG9mIHN1Ym1vZHVsZXMsIHRyZWVzIG1heSBhbHNvIGhhdmUgY29tbWl0cyBhcworZW50cmllcy4gIFNlZSA8PHN1Ym1vZHVsZXM+PiBmb3IgZG9jdW1lbnRhdGlvbi4pCisKK05vdGUgdGhhdCB0aGUgZmlsZXMgYWxsIGhhdmUgbW9kZSA2NDQgb3IgNzU1OiBnaXQgYWN0dWFsbHkgb25seSBwYXlzCithdHRlbnRpb24gdG8gdGhlIGV4ZWN1dGFibGUgYml0LgorCitbW2Jsb2Itb2JqZWN0XV0KK0Jsb2IgT2JqZWN0Cit+fn5+fn5+fn5+fgorCitZb3UgY2FuIHVzZSBsaW5rZ2l0OmdpdC1zaG93WzFdIHRvIGV4YW1pbmUgdGhlIGNvbnRlbnRzIG9mIGEgYmxvYjsgdGFrZSwKK2ZvciBleGFtcGxlLCB0aGUgYmxvYiBpbiB0aGUgZW50cnkgZm9yICJDT1BZSU5HIiBmcm9tIHRoZSB0cmVlIGFib3ZlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3cgNmZmODdjNDY2NAorCisgTm90ZSB0aGF0IHRoZSBvbmx5IHZhbGlkIHZlcnNpb24gb2YgdGhlIEdQTCBhcyBmYXIgYXMgdGhpcyBwcm9qZWN0CisgaXMgY29uY2VybmVkIGlzIF90aGlzXyBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgdGhlIGxpY2Vuc2UgKGllIHYyLCBub3QKKyB2Mi4yIG9yIHYzLnggb3Igd2hhdGV2ZXIpLCB1bmxlc3MgZXhwbGljaXRseSBvdGhlcndpc2Ugc3RhdGVkLgorLi4uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSAiYmxvYiIgb2JqZWN0IGlzIG5vdGhpbmcgYnV0IGEgYmluYXJ5IGJsb2Igb2YgZGF0YS4gIEl0IGRvZXNuJ3QgcmVmZXIKK3RvIGFueXRoaW5nIGVsc2Ugb3IgaGF2ZSBhdHRyaWJ1dGVzIG9mIGFueSBraW5kLgorCitTaW5jZSB0aGUgYmxvYiBpcyBlbnRpcmVseSBkZWZpbmVkIGJ5IGl0cyBkYXRhLCBpZiB0d28gZmlsZXMgaW4gYQorZGlyZWN0b3J5IHRyZWUgKG9yIGluIG11bHRpcGxlIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgcmVwb3NpdG9yeSkKK2hhdmUgdGhlIHNhbWUgY29udGVudHMsIHRoZXkgd2lsbCBzaGFyZSB0aGUgc2FtZSBibG9iIG9iamVjdC4gVGhlIG9iamVjdAoraXMgdG90YWxseSBpbmRlcGVuZGVudCBvZiBpdHMgbG9jYXRpb24gaW4gdGhlIGRpcmVjdG9yeSB0cmVlLCBhbmQKK3JlbmFtaW5nIGEgZmlsZSBkb2VzIG5vdCBjaGFuZ2UgdGhlIG9iamVjdCB0aGF0IGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLgorCitOb3RlIHRoYXQgYW55IHRyZWUgb3IgYmxvYiBvYmplY3QgY2FuIGJlIGV4YW1pbmVkIHVzaW5nCitsaW5rZ2l0OmdpdC1zaG93WzFdIHdpdGggdGhlIDxyZXZpc2lvbj46PHBhdGg+IHN5bnRheC4gIFRoaXMgY2FuCitzb21ldGltZXMgYmUgdXNlZnVsIGZvciBicm93c2luZyB0aGUgY29udGVudHMgb2YgYSB0cmVlIHRoYXQgaXMgbm90CitjdXJyZW50bHkgY2hlY2tlZCBvdXQuCisKK1tbdHJ1c3RdXQorVHJ1c3QKK35+fn5+CisKK0lmIHlvdSByZWNlaXZlIHRoZSBTSEExIG5hbWUgb2YgYSBibG9iIGZyb20gb25lIHNvdXJjZSwgYW5kIGl0cyBjb250ZW50cworZnJvbSBhbm90aGVyIChwb3NzaWJseSB1bnRydXN0ZWQpIHNvdXJjZSwgeW91IGNhbiBzdGlsbCB0cnVzdCB0aGF0IHRob3NlCitjb250ZW50cyBhcmUgY29ycmVjdCBhcyBsb25nIGFzIHRoZSBTSEExIG5hbWUgYWdyZWVzLiAgVGhpcyBpcyBiZWNhdXNlCit0aGUgU0hBMSBpcyBkZXNpZ25lZCBzbyB0aGF0IGl0IGlzIGluZmVhc2libGUgdG8gZmluZCBkaWZmZXJlbnQgY29udGVudHMKK3RoYXQgcHJvZHVjZSB0aGUgc2FtZSBoYXNoLgorCitTaW1pbGFybHksIHlvdSBuZWVkIG9ubHkgdHJ1c3QgdGhlIFNIQTEgbmFtZSBvZiBhIHRvcC1sZXZlbCB0cmVlIG9iamVjdAordG8gdHJ1c3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnRpcmUgZGlyZWN0b3J5IHRoYXQgaXQgcmVmZXJzIHRvLCBhbmQgaWYKK3lvdSByZWNlaXZlIHRoZSBTSEExIG5hbWUgb2YgYSBjb21taXQgZnJvbSBhIHRydXN0ZWQgc291cmNlLCB0aGVuIHlvdQorY2FuIGVhc2lseSB2ZXJpZnkgdGhlIGVudGlyZSBoaXN0b3J5IG9mIGNvbW1pdHMgcmVhY2hhYmxlIHRocm91Z2gKK3BhcmVudHMgb2YgdGhhdCBjb21taXQsIGFuZCBhbGwgb2YgdGhvc2UgY29udGVudHMgb2YgdGhlIHRyZWVzIHJlZmVycmVkCit0byBieSB0aG9zZSBjb21taXRzLgorCitTbyB0byBpbnRyb2R1Y2Ugc29tZSByZWFsIHRydXN0IGluIHRoZSBzeXN0ZW0sIHRoZSBvbmx5IHRoaW5nIHlvdSBuZWVkCit0byBkbyBpcyB0byBkaWdpdGFsbHkgc2lnbiBqdXN0ICdvbmUnIHNwZWNpYWwgbm90ZSwgd2hpY2ggaW5jbHVkZXMgdGhlCituYW1lIG9mIGEgdG9wLWxldmVsIGNvbW1pdC4gIFlvdXIgZGlnaXRhbCBzaWduYXR1cmUgc2hvd3Mgb3RoZXJzCit0aGF0IHlvdSB0cnVzdCB0aGF0IGNvbW1pdCwgYW5kIHRoZSBpbW11dGFiaWxpdHkgb2YgdGhlIGhpc3Rvcnkgb2YKK2NvbW1pdHMgdGVsbHMgb3RoZXJzIHRoYXQgdGhleSBjYW4gdHJ1c3QgdGhlIHdob2xlIGhpc3RvcnkuCisKK0luIG90aGVyIHdvcmRzLCB5b3UgY2FuIGVhc2lseSB2YWxpZGF0ZSBhIHdob2xlIGFyY2hpdmUgYnkganVzdAorc2VuZGluZyBvdXQgYSBzaW5nbGUgZW1haWwgdGhhdCB0ZWxscyB0aGUgcGVvcGxlIHRoZSBuYW1lIChTSEExIGhhc2gpCitvZiB0aGUgdG9wIGNvbW1pdCwgYW5kIGRpZ2l0YWxseSBzaWduIHRoYXQgZW1haWwgdXNpbmcgc29tZXRoaW5nCitsaWtlIEdQRy9QR1AuCisKK1RvIGFzc2lzdCBpbiB0aGlzLCBnaXQgYWxzbyBwcm92aWRlcyB0aGUgdGFnIG9iamVjdC4uLgorCitbW3RhZy1vYmplY3RdXQorVGFnIE9iamVjdAorfn5+fn5+fn5+fgorCitBIHRhZyBvYmplY3QgY29udGFpbnMgYW4gb2JqZWN0LCBvYmplY3QgdHlwZSwgdGFnIG5hbWUsIHRoZSBuYW1lIG9mIHRoZQorcGVyc29uICgidGFnZ2VyIikgd2hvIGNyZWF0ZWQgdGhlIHRhZywgYW5kIGEgbWVzc2FnZSwgd2hpY2ggbWF5IGNvbnRhaW4KK2Egc2lnbmF0dXJlLCBhcyBjYW4gYmUgc2VlbiB1c2luZyB0aGUgbGlua2dpdDpnaXQtY2F0LWZpbGVbMV06CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2F0LWZpbGUgdGFnIHYxLjUuMAorb2JqZWN0IDQzN2IxYjIwZGY0YjM1NmM5MzQyZGFjOGQzODg0OWYyNGVmNDRmMjcKK3R5cGUgY29tbWl0Cit0YWcgdjEuNS4wCit0YWdnZXIgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PiAxMTcxNDExMjAwICswMDAwCisKK0dJVCAxLjUuMAorLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0KK1ZlcnNpb246IEdudVBHIHYxLjQuNiAoR05VL0xpbnV4KQorCitpRDhEQlFCRjBsR3F3TWJacFBNUm01b1JBdVJpQUo5b2hCTGQ3czJrcWprS2xxMXFxQzU3U2JubXpRQ2RHNHVpCituTEUvTDlhVVhkV2VURlByb245NkRMQT0KKz0yRSswCistLS0tLUVORCBQR1AgU0lHTkFUVVJFLS0tLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTZWUgdGhlIGxpbmtnaXQ6Z2l0LXRhZ1sxXSBjb21tYW5kIHRvIGxlYXJuIGhvdyB0byBjcmVhdGUgYW5kIHZlcmlmeSB0YWcKK29iamVjdHMuICAoTm90ZSB0aGF0IGxpbmtnaXQ6Z2l0LXRhZ1sxXSBjYW4gYWxzbyBiZSB1c2VkIHRvIGNyZWF0ZQorImxpZ2h0d2VpZ2h0IHRhZ3MiLCB3aGljaCBhcmUgbm90IHRhZyBvYmplY3RzIGF0IGFsbCwgYnV0IGp1c3Qgc2ltcGxlCityZWZlcmVuY2VzIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggInJlZnMvdGFncy8iKS4KKworW1twYWNrLWZpbGVzXV0KK0hvdyBnaXQgc3RvcmVzIG9iamVjdHMgZWZmaWNpZW50bHk6IHBhY2sgZmlsZXMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworTmV3bHkgY3JlYXRlZCBvYmplY3RzIGFyZSBpbml0aWFsbHkgY3JlYXRlZCBpbiBhIGZpbGUgbmFtZWQgYWZ0ZXIgdGhlCitvYmplY3QncyBTSEExIGhhc2ggKHN0b3JlZCBpbiAuZ2l0L29iamVjdHMpLgorCitVbmZvcnR1bmF0ZWx5IHRoaXMgc3lzdGVtIGJlY29tZXMgaW5lZmZpY2llbnQgb25jZSBhIHByb2plY3QgaGFzIGEKK2xvdCBvZiBvYmplY3RzLiAgVHJ5IHRoaXMgb24gYW4gb2xkIHByb2plY3Q6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY291bnQtb2JqZWN0cworNjkzMCBvYmplY3RzLCA0NzYyMCBraWxvYnl0ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZmlyc3QgbnVtYmVyIGlzIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyB3aGljaCBhcmUga2VwdCBpbgoraW5kaXZpZHVhbCBmaWxlcy4gIFRoZSBzZWNvbmQgaXMgdGhlIGFtb3VudCBvZiBzcGFjZSB0YWtlbiB1cCBieQordGhvc2UgImxvb3NlIiBvYmplY3RzLgorCitZb3UgY2FuIHNhdmUgc3BhY2UgYW5kIG1ha2UgZ2l0IGZhc3RlciBieSBtb3ZpbmcgdGhlc2UgbG9vc2Ugb2JqZWN0cyBpbgordG8gYSAicGFjayBmaWxlIiwgd2hpY2ggc3RvcmVzIGEgZ3JvdXAgb2Ygb2JqZWN0cyBpbiBhbiBlZmZpY2llbnQKK2NvbXByZXNzZWQgZm9ybWF0OyB0aGUgZGV0YWlscyBvZiBob3cgcGFjayBmaWxlcyBhcmUgZm9ybWF0dGVkIGNhbiBiZQorZm91bmQgaW4gbGluazp0ZWNobmljYWwvcGFjay1mb3JtYXQudHh0W3RlY2huaWNhbC9wYWNrLWZvcm1hdC50eHRdLgorCitUbyBwdXQgdGhlIGxvb3NlIG9iamVjdHMgaW50byBhIHBhY2ssIGp1c3QgcnVuIGdpdCByZXBhY2s6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcmVwYWNrCitHZW5lcmF0aW5nIHBhY2suLi4KK0RvbmUgY291bnRpbmcgNjAyMCBvYmplY3RzLgorRGVsdGlmeWluZyA2MDIwIG9iamVjdHMuCisgMTAwJSAoNjAyMC82MDIwKSBkb25lCitXcml0aW5nIDYwMjAgb2JqZWN0cy4KKyAxMDAlICg2MDIwLzYwMjApIGRvbmUKK1RvdGFsIDYwMjAsIHdyaXR0ZW4gNjAyMCAoZGVsdGEgNDA3MCksIHJldXNlZCAwIChkZWx0YSAwKQorUGFjayBwYWNrLTNlNTRhZDI5ZDViMmUwNTgzOGM3NWRmNTgyYzY1MjU3YjhkMDhlMWMgY3JlYXRlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3UgY2FuIHRoZW4gcnVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcHJ1bmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0byByZW1vdmUgYW55IG9mIHRoZSAibG9vc2UiIG9iamVjdHMgdGhhdCBhcmUgbm93IGNvbnRhaW5lZCBpbiB0aGUKK3BhY2suICBUaGlzIHdpbGwgYWxzbyByZW1vdmUgYW55IHVucmVmZXJlbmNlZCBvYmplY3RzICh3aGljaCBtYXkgYmUKK2NyZWF0ZWQgd2hlbiwgZm9yIGV4YW1wbGUsIHlvdSB1c2UgImdpdCByZXNldCIgdG8gcmVtb3ZlIGEgY29tbWl0KS4KK1lvdSBjYW4gdmVyaWZ5IHRoYXQgdGhlIGxvb3NlIG9iamVjdHMgYXJlIGdvbmUgYnkgbG9va2luZyBhdCB0aGUKKy5naXQvb2JqZWN0cyBkaXJlY3Rvcnkgb3IgYnkgcnVubmluZworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvdW50LW9iamVjdHMKKzAgb2JqZWN0cywgMCBraWxvYnl0ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbHRob3VnaCB0aGUgb2JqZWN0IGZpbGVzIGFyZSBnb25lLCBhbnkgY29tbWFuZHMgdGhhdCByZWZlciB0byB0aG9zZQorb2JqZWN0cyB3aWxsIHdvcmsgZXhhY3RseSBhcyB0aGV5IGRpZCBiZWZvcmUuCisKK1RoZSBsaW5rZ2l0OmdpdC1nY1sxXSBjb21tYW5kIHBlcmZvcm1zIHBhY2tpbmcsIHBydW5pbmcsIGFuZCBtb3JlIGZvcgoreW91LCBzbyBpcyBub3JtYWxseSB0aGUgb25seSBoaWdoLWxldmVsIGNvbW1hbmQgeW91IG5lZWQuCisKK1tbZGFuZ2xpbmctb2JqZWN0c11dCitEYW5nbGluZyBvYmplY3RzCit+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSBsaW5rZ2l0OmdpdC1mc2NrWzFdIGNvbW1hbmQgd2lsbCBzb21ldGltZXMgY29tcGxhaW4gYWJvdXQgZGFuZ2xpbmcKK29iamVjdHMuICBUaGV5IGFyZSBub3QgYSBwcm9ibGVtLgorCitUaGUgbW9zdCBjb21tb24gY2F1c2Ugb2YgZGFuZ2xpbmcgb2JqZWN0cyBpcyB0aGF0IHlvdSd2ZSByZWJhc2VkIGEKK2JyYW5jaCwgb3IgeW91IGhhdmUgcHVsbGVkIGZyb20gc29tZWJvZHkgZWxzZSB3aG8gcmViYXNlZCBhIGJyYW5jaC0tc2VlCis8PGNsZWFuaW5nLXVwLWhpc3Rvcnk+Pi4gIEluIHRoYXQgY2FzZSwgdGhlIG9sZCBoZWFkIG9mIHRoZSBvcmlnaW5hbAorYnJhbmNoIHN0aWxsIGV4aXN0cywgYXMgZG9lcyBldmVyeXRoaW5nIGl0IHBvaW50ZWQgdG8uIFRoZSBicmFuY2gKK3BvaW50ZXIgaXRzZWxmIGp1c3QgZG9lc24ndCwgc2luY2UgeW91IHJlcGxhY2VkIGl0IHdpdGggYW5vdGhlciBvbmUuCisKK1RoZXJlIGFyZSBhbHNvIG90aGVyIHNpdHVhdGlvbnMgdGhhdCBjYXVzZSBkYW5nbGluZyBvYmplY3RzLiBGb3IKK2V4YW1wbGUsIGEgImRhbmdsaW5nIGJsb2IiIG1heSBhcmlzZSBiZWNhdXNlIHlvdSBkaWQgYSAiZ2l0IGFkZCIgb2YgYQorZmlsZSwgYnV0IHRoZW4sIGJlZm9yZSB5b3UgYWN0dWFsbHkgY29tbWl0dGVkIGl0IGFuZCBtYWRlIGl0IHBhcnQgb2YgdGhlCitiaWdnZXIgcGljdHVyZSwgeW91IGNoYW5nZWQgc29tZXRoaW5nIGVsc2UgaW4gdGhhdCBmaWxlIGFuZCBjb21taXR0ZWQKK3RoYXQgKnVwZGF0ZWQqIHRoaW5nLS10aGUgb2xkIHN0YXRlIHRoYXQgeW91IGFkZGVkIG9yaWdpbmFsbHkgZW5kcyB1cAorbm90IGJlaW5nIHBvaW50ZWQgdG8gYnkgYW55IGNvbW1pdCBvciB0cmVlLCBzbyBpdCdzIG5vdyBhIGRhbmdsaW5nIGJsb2IKK29iamVjdC4KKworU2ltaWxhcmx5LCB3aGVuIHRoZSAicmVjdXJzaXZlIiBtZXJnZSBzdHJhdGVneSBydW5zLCBhbmQgZmluZHMgdGhhdAordGhlcmUgYXJlIGNyaXNzLWNyb3NzIG1lcmdlcyBhbmQgdGh1cyBtb3JlIHRoYW4gb25lIG1lcmdlIGJhc2UgKHdoaWNoIGlzCitmYWlybHkgdW51c3VhbCwgYnV0IGl0IGRvZXMgaGFwcGVuKSwgaXQgd2lsbCBnZW5lcmF0ZSBvbmUgdGVtcG9yYXJ5CittaWR3YXkgdHJlZSAob3IgcG9zc2libHkgZXZlbiBtb3JlLCBpZiB5b3UgaGFkIGxvdHMgb2YgY3Jpc3MtY3Jvc3NpbmcKK21lcmdlcyBhbmQgbW9yZSB0aGFuIHR3byBtZXJnZSBiYXNlcykgYXMgYSB0ZW1wb3JhcnkgaW50ZXJuYWwgbWVyZ2UKK2Jhc2UsIGFuZCBhZ2FpbiwgdGhvc2UgYXJlIHJlYWwgb2JqZWN0cywgYnV0IHRoZSBlbmQgcmVzdWx0IHdpbGwgbm90IGVuZAordXAgcG9pbnRpbmcgdG8gdGhlbSwgc28gdGhleSBlbmQgdXAgImRhbmdsaW5nIiBpbiB5b3VyIHJlcG9zaXRvcnkuCisKK0dlbmVyYWxseSwgZGFuZ2xpbmcgb2JqZWN0cyBhcmVuJ3QgYW55dGhpbmcgdG8gd29ycnkgYWJvdXQuIFRoZXkgY2FuCitldmVuIGJlIHZlcnkgdXNlZnVsOiBpZiB5b3Ugc2NyZXcgc29tZXRoaW5nIHVwLCB0aGUgZGFuZ2xpbmcgb2JqZWN0cyBjYW4KK2JlIGhvdyB5b3UgcmVjb3ZlciB5b3VyIG9sZCB0cmVlIChzYXksIHlvdSBkaWQgYSByZWJhc2UsIGFuZCByZWFsaXplZAordGhhdCB5b3UgcmVhbGx5IGRpZG4ndCB3YW50IHRvLS15b3UgY2FuIGxvb2sgYXQgd2hhdCBkYW5nbGluZyBvYmplY3RzCit5b3UgaGF2ZSwgYW5kIGRlY2lkZSB0byByZXNldCB5b3VyIGhlYWQgdG8gc29tZSBvbGQgZGFuZ2xpbmcgc3RhdGUpLgorCitGb3IgY29tbWl0cywgeW91IGNhbiBqdXN0IHVzZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdGsgPGRhbmdsaW5nLWNvbW1pdC1zaGEtZ29lcy1oZXJlPiAtLW5vdCAtLWFsbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgYXNrcyBmb3IgYWxsIHRoZSBoaXN0b3J5IHJlYWNoYWJsZSBmcm9tIHRoZSBnaXZlbiBjb21taXQgYnV0IG5vdAorZnJvbSBhbnkgYnJhbmNoLCB0YWcsIG9yIG90aGVyIHJlZmVyZW5jZS4gIElmIHlvdSBkZWNpZGUgaXQncyBzb21ldGhpbmcKK3lvdSB3YW50LCB5b3UgY2FuIGFsd2F5cyBjcmVhdGUgYSBuZXcgcmVmZXJlbmNlIHRvIGl0LCBlLmcuLAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGJyYW5jaCByZWNvdmVyZWQtYnJhbmNoIDxkYW5nbGluZy1jb21taXQtc2hhLWdvZXMtaGVyZT4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGb3IgYmxvYnMgYW5kIHRyZWVzLCB5b3UgY2FuJ3QgZG8gdGhlIHNhbWUsIGJ1dCB5b3UgY2FuIHN0aWxsIGV4YW1pbmUKK3RoZW0uICBZb3UgY2FuIGp1c3QgZG8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93IDxkYW5nbGluZy1ibG9iL3RyZWUtc2hhLWdvZXMtaGVyZT4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0byBzaG93IHdoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBibG9iIHdlcmUgKG9yLCBmb3IgYSB0cmVlLCBiYXNpY2FsbHkKK3doYXQgdGhlICJscyIgZm9yIHRoYXQgZGlyZWN0b3J5IHdhcyksIGFuZCB0aGF0IG1heSBnaXZlIHlvdSBzb21lIGlkZWEKK29mIHdoYXQgdGhlIG9wZXJhdGlvbiB3YXMgdGhhdCBsZWZ0IHRoYXQgZGFuZ2xpbmcgb2JqZWN0LgorCitVc3VhbGx5LCBkYW5nbGluZyBibG9icyBhbmQgdHJlZXMgYXJlbid0IHZlcnkgaW50ZXJlc3RpbmcuIFRoZXkncmUKK2FsbW9zdCBhbHdheXMgdGhlIHJlc3VsdCBvZiBlaXRoZXIgYmVpbmcgYSBoYWxmLXdheSBtZXJnZWJhc2UgKHRoZSBibG9iCit3aWxsIG9mdGVuIGV2ZW4gaGF2ZSB0aGUgY29uZmxpY3QgbWFya2VycyBmcm9tIGEgbWVyZ2UgaW4gaXQsIGlmIHlvdQoraGF2ZSBoYWQgY29uZmxpY3RpbmcgbWVyZ2VzIHRoYXQgeW91IGZpeGVkIHVwIGJ5IGhhbmQpLCBvciBzaW1wbHkKK2JlY2F1c2UgeW91IGludGVycnVwdGVkIGEgImdpdCBmZXRjaCIgd2l0aCBeQyBvciBzb21ldGhpbmcgbGlrZSB0aGF0LAorbGVhdmluZyBfc29tZV8gb2YgdGhlIG5ldyBvYmplY3RzIGluIHRoZSBvYmplY3QgZGF0YWJhc2UsIGJ1dCBqdXN0CitkYW5nbGluZyBhbmQgdXNlbGVzcy4KKworQW55d2F5LCBvbmNlIHlvdSBhcmUgc3VyZSB0aGF0IHlvdSdyZSBub3QgaW50ZXJlc3RlZCBpbiBhbnkgZGFuZ2xpbmcKK3N0YXRlLCB5b3UgY2FuIGp1c3QgcHJ1bmUgYWxsIHVucmVhY2hhYmxlIG9iamVjdHM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcHJ1bmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbmQgdGhleSdsbCBiZSBnb25lLiBCdXQgeW91IHNob3VsZCBvbmx5IHJ1biAiZ2l0IHBydW5lIiBvbiBhIHF1aWVzY2VudAorcmVwb3NpdG9yeS0taXQncyBraW5kIG9mIGxpa2UgZG9pbmcgYSBmaWxlc3lzdGVtIGZzY2sgcmVjb3Zlcnk6IHlvdQorZG9uJ3Qgd2FudCB0byBkbyB0aGF0IHdoaWxlIHRoZSBmaWxlc3lzdGVtIGlzIG1vdW50ZWQuCisKKyhUaGUgc2FtZSBpcyB0cnVlIG9mICJnaXQtZnNjayIgaXRzZWxmLCBidHcsIGJ1dCBzaW5jZQorZ2l0LWZzY2sgbmV2ZXIgYWN0dWFsbHkgKmNoYW5nZXMqIHRoZSByZXBvc2l0b3J5LCBpdCBqdXN0IHJlcG9ydHMKK29uIHdoYXQgaXQgZm91bmQsIGdpdC1mc2NrIGl0c2VsZiBpcyBuZXZlciAiZGFuZ2Vyb3VzIiB0byBydW4uCitSdW5uaW5nIGl0IHdoaWxlIHNvbWVib2R5IGlzIGFjdHVhbGx5IGNoYW5naW5nIHRoZSByZXBvc2l0b3J5IGNhbiBjYXVzZQorY29uZnVzaW5nIGFuZCBzY2FyeSBtZXNzYWdlcywgYnV0IGl0IHdvbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nIGJhZC4gSW4KK2NvbnRyYXN0LCBydW5uaW5nICJnaXQgcHJ1bmUiIHdoaWxlIHNvbWVib2R5IGlzIGFjdGl2ZWx5IGNoYW5naW5nIHRoZQorcmVwb3NpdG9yeSBpcyBhICpCQUQqIGlkZWEpLgorCitbW3JlY292ZXJpbmctZnJvbS1yZXBvc2l0b3J5LWNvcnJ1cHRpb25dXQorUmVjb3ZlcmluZyBmcm9tIHJlcG9zaXRvcnkgY29ycnVwdGlvbgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitCeSBkZXNpZ24sIGdpdCB0cmVhdHMgZGF0YSB0cnVzdGVkIHRvIGl0IHdpdGggY2F1dGlvbi4gIEhvd2V2ZXIsIGV2ZW4gaW4KK3RoZSBhYnNlbmNlIG9mIGJ1Z3MgaW4gZ2l0IGl0c2VsZiwgaXQgaXMgc3RpbGwgcG9zc2libGUgdGhhdCBoYXJkd2FyZSBvcgorb3BlcmF0aW5nIHN5c3RlbSBlcnJvcnMgY291bGQgY29ycnVwdCBkYXRhLgorCitUaGUgZmlyc3QgZGVmZW5zZSBhZ2FpbnN0IHN1Y2ggcHJvYmxlbXMgaXMgYmFja3Vwcy4gIFlvdSBjYW4gYmFjayB1cCBhCitnaXQgZGlyZWN0b3J5IHVzaW5nIGNsb25lLCBvciBqdXN0IHVzaW5nIGNwLCB0YXIsIG9yIGFueSBvdGhlciBiYWNrdXAKK21lY2hhbmlzbS4KKworQXMgYSBsYXN0IHJlc29ydCwgeW91IGNhbiBzZWFyY2ggZm9yIHRoZSBjb3JydXB0ZWQgb2JqZWN0cyBhbmQgYXR0ZW1wdAordG8gcmVwbGFjZSB0aGVtIGJ5IGhhbmQuICBCYWNrIHVwIHlvdXIgcmVwb3NpdG9yeSBiZWZvcmUgYXR0ZW1wdGluZyB0aGlzCitpbiBjYXNlIHlvdSBjb3JydXB0IHRoaW5ncyBldmVuIG1vcmUgaW4gdGhlIHByb2Nlc3MuCisKK1dlJ2xsIGFzc3VtZSB0aGF0IHRoZSBwcm9ibGVtIGlzIGEgc2luZ2xlIG1pc3Npbmcgb3IgY29ycnVwdGVkIGJsb2IsCit3aGljaCBpcyBzb21ldGltZXMgYSBzb2x2YWJsZSBwcm9ibGVtLiAgKFJlY292ZXJpbmcgbWlzc2luZyB0cmVlcyBhbmQKK2VzcGVjaWFsbHkgY29tbWl0cyBpcyAqbXVjaCogaGFyZGVyKS4KKworQmVmb3JlIHN0YXJ0aW5nLCB2ZXJpZnkgdGhhdCB0aGVyZSBpcyBjb3JydXB0aW9uLCBhbmQgZmlndXJlIG91dCB3aGVyZQoraXQgaXMgd2l0aCBsaW5rZ2l0OmdpdC1mc2NrWzFdOyB0aGlzIG1heSBiZSB0aW1lLWNvbnN1bWluZy4KKworQXNzdW1lIHRoZSBvdXRwdXQgbG9va3MgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWZzY2sgLS1mdWxsCiticm9rZW4gbGluayBmcm9tICAgIHRyZWUgMmQ5MjYzYzZkMjM1OTVlN2NiMmEyMWU1ZWJiYjUzNjU1Mjc4ZGZmOAorICAgICAgICAgICAgICB0byAgICBibG9iIDRiOTQ1OGIzNzg2MjI4MzY5YzYzOTM2ZGI2NTgyN2RlM2NjMDYyMDAKK21pc3NpbmcgYmxvYiA0Yjk0NThiMzc4NjIyODM2OWM2MzkzNmRiNjU4MjdkZTNjYzA2MjAwCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKFR5cGljYWxseSB0aGVyZSB3aWxsIGJlIHNvbWUgImRhbmdsaW5nIG9iamVjdCIgbWVzc2FnZXMgdG9vLCBidXQgdGhleQorYXJlbid0IGludGVyZXN0aW5nLikKKworTm93IHlvdSBrbm93IHRoYXQgYmxvYiA0Yjk0NThiMyBpcyBtaXNzaW5nLCBhbmQgdGhhdCB0aGUgdHJlZSAyZDkyNjNjNgorcG9pbnRzIHRvIGl0LiAgSWYgeW91IGNvdWxkIGZpbmQganVzdCBvbmUgY29weSBvZiB0aGF0IG1pc3NpbmcgYmxvYgorb2JqZWN0LCBwb3NzaWJseSBpbiBzb21lIG90aGVyIHJlcG9zaXRvcnksIHlvdSBjb3VsZCBtb3ZlIGl0IGludG8KKy5naXQvb2JqZWN0cy80Yi85NDU4YjMuLi4gYW5kIGJlIGRvbmUuICBTdXBwb3NlIHlvdSBjYW4ndC4gIFlvdSBjYW4KK3N0aWxsIGV4YW1pbmUgdGhlIHRyZWUgdGhhdCBwb2ludGVkIHRvIGl0IHdpdGggbGlua2dpdDpnaXQtbHMtdHJlZVsxXSwKK3doaWNoIG1pZ2h0IG91dHB1dCBzb21ldGhpbmcgbGlrZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBscy10cmVlIDJkOTI2M2M2ZDIzNTk1ZTdjYjJhMjFlNWViYmI1MzY1NTI3OGRmZjgKKzEwMDY0NCBibG9iIDhkMTQ1MzE4NDZiOTViZmEzNTY0YjU4Y2NmYjc5MTNhMDM0MzIzYjgJLmdpdGlnbm9yZQorMTAwNjQ0IGJsb2IgZWJmOWJmODRkYTBhYWI1ZWQ5NDQyNjRhNWRiMmE2NWZlM2EzZTg4MwkubWFpbG1hcAorMTAwNjQ0IGJsb2IgY2E0NDJkMzEzZDg2ZGM2N2UwYTJlNWQ1ODRiNDY1YmQzODJjYmY1YwlDT1BZSU5HCisuLi4KKzEwMDY0NCBibG9iIDRiOTQ1OGIzNzg2MjI4MzY5YzYzOTM2ZGI2NTgyN2RlM2NjMDYyMDAJbXlmaWxlCisuLi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTbyBub3cgeW91IGtub3cgdGhhdCB0aGUgbWlzc2luZyBibG9iIHdhcyB0aGUgZGF0YSBmb3IgYSBmaWxlIG5hbWVkCisibXlmaWxlIi4gIEFuZCBjaGFuY2VzIGFyZSB5b3UgY2FuIGFsc28gaWRlbnRpZnkgdGhlIGRpcmVjdG9yeS0tbGV0J3MKK3NheSBpdCdzIGluICJzb21lZGlyZWN0b3J5Ii4gIElmIHlvdSdyZSBsdWNreSB0aGUgbWlzc2luZyBjb3B5IG1pZ2h0IGJlCit0aGUgc2FtZSBhcyB0aGUgY29weSB5b3UgaGF2ZSBjaGVja2VkIG91dCBpbiB5b3VyIHdvcmtpbmcgdHJlZSBhdAorInNvbWVkaXJlY3RvcnkvbXlmaWxlIjsgeW91IGNhbiB0ZXN0IHdoZXRoZXIgdGhhdCdzIHJpZ2h0IHdpdGgKK2xpbmtnaXQ6Z2l0LWhhc2gtb2JqZWN0WzFdOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGhhc2gtb2JqZWN0IC13IHNvbWVkaXJlY3RvcnkvbXlmaWxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggd2lsbCBjcmVhdGUgYW5kIHN0b3JlIGEgYmxvYiBvYmplY3Qgd2l0aCB0aGUgY29udGVudHMgb2YKK3NvbWVkaXJlY3RvcnkvbXlmaWxlLCBhbmQgb3V0cHV0IHRoZSBzaGExIG9mIHRoYXQgb2JqZWN0LiAgaWYgeW91J3JlCitleHRyZW1lbHkgbHVja3kgaXQgbWlnaHQgYmUgNGI5NDU4YjM3ODYyMjgzNjljNjM5MzZkYjY1ODI3ZGUzY2MwNjIwMCwgaW4KK3doaWNoIGNhc2UgeW91J3ZlIGd1ZXNzZWQgcmlnaHQsIGFuZCB0aGUgY29ycnVwdGlvbiBpcyBmaXhlZCEKKworT3RoZXJ3aXNlLCB5b3UgbmVlZCBtb3JlIGluZm9ybWF0aW9uLiAgSG93IGRvIHlvdSB0ZWxsIHdoaWNoIHZlcnNpb24gb2YKK3RoZSBmaWxlIGhhcyBiZWVuIGxvc3Q/CisKK1RoZSBlYXNpZXN0IHdheSB0byBkbyB0aGlzIGlzIHdpdGg6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbG9nIC0tcmF3IC0tYWxsIC0tZnVsbC1oaXN0b3J5IC0tIHNvbWVkaXJlY3RvcnkvbXlmaWxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQmVjYXVzZSB5b3UncmUgYXNraW5nIGZvciByYXcgb3V0cHV0LCB5b3UnbGwgbm93IGdldCBzb21ldGhpbmcgbGlrZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2NvbW1pdCBhYmMKK0F1dGhvcjoKK0RhdGU6CisuLi4KKzoxMDA2NDQgMTAwNjQ0IDRiOTQ1OGIuLi4gbmV3c2hhLi4uIE0gc29tZWRpcmVjdG9yeS9teWZpbGUKKworCitjb21taXQgeHl6CitBdXRob3I6CitEYXRlOgorCisuLi4KKzoxMDA2NDQgMTAwNjQ0IG9sZHNoYS4uLiA0Yjk0NThiLi4uIE0gc29tZWRpcmVjdG9yeS9teWZpbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHRlbGxzIHlvdSB0aGF0IHRoZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgdmVyc2lvbiBvZiB0aGUgZmlsZSB3YXMKKyJuZXdzaGEiLCBhbmQgdGhhdCB0aGUgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHZlcnNpb24gd2FzICJvbGRzaGEiLgorWW91IGFsc28ga25vdyB0aGUgY29tbWl0IG1lc3NhZ2VzIHRoYXQgd2VudCB3aXRoIHRoZSBjaGFuZ2UgZnJvbSBvbGRzaGEKK3RvIDRiOTQ1OGIgYW5kIHdpdGggdGhlIGNoYW5nZSBmcm9tIDRiOTQ1OGIgdG8gbmV3c2hhLgorCitJZiB5b3UndmUgYmVlbiBjb21taXR0aW5nIHNtYWxsIGVub3VnaCBjaGFuZ2VzLCB5b3UgbWF5IG5vdyBoYXZlIGEgZ29vZAorc2hvdCBhdCByZWNvbnN0cnVjdGluZyB0aGUgY29udGVudHMgb2YgdGhlIGluLWJldHdlZW4gc3RhdGUgNGI5NDU4Yi4KKworSWYgeW91IGNhbiBkbyB0aGF0LCB5b3UgY2FuIG5vdyByZWNyZWF0ZSB0aGUgbWlzc2luZyBvYmplY3Qgd2l0aAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGhhc2gtb2JqZWN0IC13IDxyZWNyZWF0ZWQtZmlsZT4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbmQgeW91ciByZXBvc2l0b3J5IGlzIGdvb2QgYWdhaW4hCisKKyhCdHcsIHlvdSBjb3VsZCBoYXZlIGlnbm9yZWQgdGhlIGZzY2ssIGFuZCBzdGFydGVkIHdpdGggZG9pbmcgYQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZyAtLXJhdyAtLWFsbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FuZCBqdXN0IGxvb2tlZCBmb3IgdGhlIHNoYSBvZiB0aGUgbWlzc2luZyBvYmplY3QgKDRiOTQ1OGIuLikgaW4gdGhhdAord2hvbGUgdGhpbmcuIEl0J3MgdXAgdG8geW91IC0gZ2l0IGRvZXMgKmhhdmUqIGEgbG90IG9mIGluZm9ybWF0aW9uLCBpdCBpcworanVzdCBtaXNzaW5nIG9uZSBwYXJ0aWN1bGFyIGJsb2IgdmVyc2lvbi4KKworW1t0aGUtaW5kZXhdXQorVGhlIGluZGV4CistLS0tLS0tLS0tLQorCitUaGUgaW5kZXggaXMgYSBiaW5hcnkgZmlsZSAoZ2VuZXJhbGx5IGtlcHQgaW4gLmdpdC9pbmRleCkgY29udGFpbmluZyBhCitzb3J0ZWQgbGlzdCBvZiBwYXRoIG5hbWVzLCBlYWNoIHdpdGggcGVybWlzc2lvbnMgYW5kIHRoZSBTSEExIG9mIGEgYmxvYgorb2JqZWN0OyBsaW5rZ2l0OmdpdC1scy1maWxlc1sxXSBjYW4gc2hvdyB5b3UgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbmRleDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbHMtZmlsZXMgLS1zdGFnZQorMTAwNjQ0IDYzYzkxOGM2NjdmYTAwNWZmMTJhZDg5NDM3ZjJmZGM4MDkyNmUyMWMgMAkuZ2l0aWdub3JlCisxMDA2NDQgNTUyOWIxOThlOGQxNGRlY2JlNGFkOTlkYjNmN2ZiNjMyZGUwNDM5ZCAwCS5tYWlsbWFwCisxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyAwCUNPUFlJTkcKKzEwMDY0NCBhMzdiMjE1MmJkMjZiZTJjMjI4OWUxZjU3YTI5MjUzNGE1MWE5M2M3IDAJRG9jdW1lbnRhdGlvbi8uZ2l0aWdub3JlCisxMDA2NDQgZmJlZmU5YTQ1YjAwYTU0YjU4ZDk0ZDA2ZWNhNDhiMDNkNDBhNTBlMCAwCURvY3VtZW50YXRpb24vTWFrZWZpbGUKKy4uLgorMTAwNjQ0IDI1MTFhZWY4ZDg5YWI1MmJlNWVjNmE1ZTQ2MjM2YjRiNmJjZDA3ZWEgMAl4ZGlmZi94dHlwZXMuaAorMTAwNjQ0IDJhZGU5N2IyNTc0YTlmNzdlN2FlNDAwMmE0ZTA3YTZhMzhlNDZkMDcgMAl4ZGlmZi94dXRpbHMuYworMTAwNjQ0IGQ1ZGU4MjkyZTA1ZTdjMzZjNGI2ODg1N2MxY2Y5ODU1ZTNkMmY3MGEgMAl4ZGlmZi94dXRpbHMuaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3RlIHRoYXQgaW4gb2xkZXIgZG9jdW1lbnRhdGlvbiB5b3UgbWF5IHNlZSB0aGUgaW5kZXggY2FsbGVkIHRoZQorImN1cnJlbnQgZGlyZWN0b3J5IGNhY2hlIiBvciBqdXN0IHRoZSAiY2FjaGUiLiAgSXQgaGFzIHRocmVlIGltcG9ydGFudAorcHJvcGVydGllczoKKworMS4gVGhlIGluZGV4IGNvbnRhaW5zIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIGdlbmVyYXRlIGEgc2luZ2xlCisodW5pcXVlbHkgZGV0ZXJtaW5lZCkgdHJlZSBvYmplY3QuCisrCitGb3IgZXhhbXBsZSwgcnVubmluZyBsaW5rZ2l0OmdpdC1jb21taXRbMV0gZ2VuZXJhdGVzIHRoaXMgdHJlZSBvYmplY3QKK2Zyb20gdGhlIGluZGV4LCBzdG9yZXMgaXQgaW4gdGhlIG9iamVjdCBkYXRhYmFzZSwgYW5kIHVzZXMgaXQgYXMgdGhlCit0cmVlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyBjb21taXQuCisKKzIuIFRoZSBpbmRleCBlbmFibGVzIGZhc3QgY29tcGFyaXNvbnMgYmV0d2VlbiB0aGUgdHJlZSBvYmplY3QgaXQgZGVmaW5lcworYW5kIHRoZSB3b3JraW5nIHRyZWUuCisrCitJdCBkb2VzIHRoaXMgYnkgc3RvcmluZyBzb21lIGFkZGl0aW9uYWwgZGF0YSBmb3IgZWFjaCBlbnRyeSAoc3VjaCBhcwordGhlIGxhc3QgbW9kaWZpZWQgdGltZSkuICBUaGlzIGRhdGEgaXMgbm90IGRpc3BsYXllZCBhYm92ZSwgYW5kIGlzIG5vdAorc3RvcmVkIGluIHRoZSBjcmVhdGVkIHRyZWUgb2JqZWN0LCBidXQgaXQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lCitxdWlja2x5IHdoaWNoIGZpbGVzIGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBkaWZmZXIgZnJvbSB3aGF0IHdhcworc3RvcmVkIGluIHRoZSBpbmRleCwgYW5kIHRodXMgc2F2ZSBnaXQgZnJvbSBoYXZpbmcgdG8gcmVhZCBhbGwgb2YgdGhlCitkYXRhIGZyb20gc3VjaCBmaWxlcyB0byBsb29rIGZvciBjaGFuZ2VzLgorCiszLiBJdCBjYW4gZWZmaWNpZW50bHkgcmVwcmVzZW50IGluZm9ybWF0aW9uIGFib3V0IG1lcmdlIGNvbmZsaWN0cworYmV0d2VlbiBkaWZmZXJlbnQgdHJlZSBvYmplY3RzLCBhbGxvd2luZyBlYWNoIHBhdGhuYW1lIHRvIGJlCithc3NvY2lhdGVkIHdpdGggc3VmZmljaWVudCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJlZXMgaW52b2x2ZWQgdGhhdAoreW91IGNhbiBjcmVhdGUgYSB0aHJlZS13YXkgbWVyZ2UgYmV0d2VlbiB0aGVtLgorKworV2Ugc2F3IGluIDw8Y29uZmxpY3QtcmVzb2x1dGlvbj4+IHRoYXQgZHVyaW5nIGEgbWVyZ2UgdGhlIGluZGV4IGNhbgorc3RvcmUgbXVsdGlwbGUgdmVyc2lvbnMgb2YgYSBzaW5nbGUgZmlsZSAoY2FsbGVkICJzdGFnZXMiKS4gIFRoZSB0aGlyZAorY29sdW1uIGluIHRoZSBsaW5rZ2l0OmdpdC1scy1maWxlc1sxXSBvdXRwdXQgYWJvdmUgaXMgdGhlIHN0YWdlCitudW1iZXIsIGFuZCB3aWxsIHRha2Ugb24gdmFsdWVzIG90aGVyIHRoYW4gMCBmb3IgZmlsZXMgd2l0aCBtZXJnZQorY29uZmxpY3RzLgorCitUaGUgaW5kZXggaXMgdGh1cyBhIHNvcnQgb2YgdGVtcG9yYXJ5IHN0YWdpbmcgYXJlYSwgd2hpY2ggaXMgZmlsbGVkIHdpdGgKK2EgdHJlZSB3aGljaCB5b3UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIHdvcmtpbmcgb24uCisKK0lmIHlvdSBibG93IHRoZSBpbmRleCBhd2F5IGVudGlyZWx5LCB5b3UgZ2VuZXJhbGx5IGhhdmVuJ3QgbG9zdCBhbnkKK2luZm9ybWF0aW9uIGFzIGxvbmcgYXMgeW91IGhhdmUgdGhlIG5hbWUgb2YgdGhlIHRyZWUgdGhhdCBpdCBkZXNjcmliZWQuCisKK1tbc3VibW9kdWxlc11dCitTdWJtb2R1bGVzCis9PT09PT09PT09CisKK0xhcmdlIHByb2plY3RzIGFyZSBvZnRlbiBjb21wb3NlZCBvZiBzbWFsbGVyLCBzZWxmLWNvbnRhaW5lZCBtb2R1bGVzLiAgRm9yCitleGFtcGxlLCBhbiBlbWJlZGRlZCBMaW51eCBkaXN0cmlidXRpb24ncyBzb3VyY2UgdHJlZSB3b3VsZCBpbmNsdWRlIGV2ZXJ5CitwaWVjZSBvZiBzb2Z0d2FyZSBpbiB0aGUgZGlzdHJpYnV0aW9uIHdpdGggc29tZSBsb2NhbCBtb2RpZmljYXRpb25zOyBhIG1vdmllCitwbGF5ZXIgbWlnaHQgbmVlZCB0byBidWlsZCBhZ2FpbnN0IGEgc3BlY2lmaWMsIGtub3duLXdvcmtpbmcgdmVyc2lvbiBvZiBhCitkZWNvbXByZXNzaW9uIGxpYnJhcnk7IHNldmVyYWwgaW5kZXBlbmRlbnQgcHJvZ3JhbXMgbWlnaHQgYWxsIHNoYXJlIHRoZSBzYW1lCitidWlsZCBzY3JpcHRzLgorCitXaXRoIGNlbnRyYWxpemVkIHJldmlzaW9uIGNvbnRyb2wgc3lzdGVtcyB0aGlzIGlzIG9mdGVuIGFjY29tcGxpc2hlZCBieQoraW5jbHVkaW5nIGV2ZXJ5IG1vZHVsZSBpbiBvbmUgc2luZ2xlIHJlcG9zaXRvcnkuICBEZXZlbG9wZXJzIGNhbiBjaGVjayBvdXQKK2FsbCBtb2R1bGVzIG9yIG9ubHkgdGhlIG1vZHVsZXMgdGhleSBuZWVkIHRvIHdvcmsgd2l0aC4gIFRoZXkgY2FuIGV2ZW4gbW9kaWZ5CitmaWxlcyBhY3Jvc3Mgc2V2ZXJhbCBtb2R1bGVzIGluIGEgc2luZ2xlIGNvbW1pdCB3aGlsZSBtb3ZpbmcgdGhpbmdzIGFyb3VuZAorb3IgdXBkYXRpbmcgQVBJcyBhbmQgdHJhbnNsYXRpb25zLgorCitHaXQgZG9lcyBub3QgYWxsb3cgcGFydGlhbCBjaGVja291dHMsIHNvIGR1cGxpY2F0aW5nIHRoaXMgYXBwcm9hY2ggaW4gR2l0Cit3b3VsZCBmb3JjZSBkZXZlbG9wZXJzIHRvIGtlZXAgYSBsb2NhbCBjb3B5IG9mIG1vZHVsZXMgdGhleSBhcmUgbm90CitpbnRlcmVzdGVkIGluIHRvdWNoaW5nLiAgQ29tbWl0cyBpbiBhbiBlbm9ybW91cyBjaGVja291dCB3b3VsZCBiZSBzbG93ZXIKK3RoYW4geW91J2QgZXhwZWN0IGFzIEdpdCB3b3VsZCBoYXZlIHRvIHNjYW4gZXZlcnkgZGlyZWN0b3J5IGZvciBjaGFuZ2VzLgorSWYgbW9kdWxlcyBoYXZlIGEgbG90IG9mIGxvY2FsIGhpc3RvcnksIGNsb25lcyB3b3VsZCB0YWtlIGZvcmV2ZXIuCisKK09uIHRoZSBwbHVzIHNpZGUsIGRpc3RyaWJ1dGVkIHJldmlzaW9uIGNvbnRyb2wgc3lzdGVtcyBjYW4gbXVjaCBiZXR0ZXIKK2ludGVncmF0ZSB3aXRoIGV4dGVybmFsIHNvdXJjZXMuICBJbiBhIGNlbnRyYWxpemVkIG1vZGVsLCBhIHNpbmdsZSBhcmJpdHJhcnkKK3NuYXBzaG90IG9mIHRoZSBleHRlcm5hbCBwcm9qZWN0IGlzIGV4cG9ydGVkIGZyb20gaXRzIG93biByZXZpc2lvbiBjb250cm9sCithbmQgdGhlbiBpbXBvcnRlZCBpbnRvIHRoZSBsb2NhbCByZXZpc2lvbiBjb250cm9sIG9uIGEgdmVuZG9yIGJyYW5jaC4gIEFsbAordGhlIGhpc3RvcnkgaXMgaGlkZGVuLiAgV2l0aCBkaXN0cmlidXRlZCByZXZpc2lvbiBjb250cm9sIHlvdSBjYW4gY2xvbmUgdGhlCitlbnRpcmUgZXh0ZXJuYWwgaGlzdG9yeSBhbmQgbXVjaCBtb3JlIGVhc2lseSBmb2xsb3cgZGV2ZWxvcG1lbnQgYW5kIHJlLW1lcmdlCitsb2NhbCBjaGFuZ2VzLgorCitHaXQncyBzdWJtb2R1bGUgc3VwcG9ydCBhbGxvd3MgYSByZXBvc2l0b3J5IHRvIGNvbnRhaW4sIGFzIGEgc3ViZGlyZWN0b3J5LCBhCitjaGVja291dCBvZiBhbiBleHRlcm5hbCBwcm9qZWN0LiAgU3VibW9kdWxlcyBtYWludGFpbiB0aGVpciBvd24gaWRlbnRpdHk7Cit0aGUgc3VibW9kdWxlIHN1cHBvcnQganVzdCBzdG9yZXMgdGhlIHN1Ym1vZHVsZSByZXBvc2l0b3J5IGxvY2F0aW9uIGFuZAorY29tbWl0IElELCBzbyBvdGhlciBkZXZlbG9wZXJzIHdobyBjbG9uZSB0aGUgY29udGFpbmluZyBwcm9qZWN0CisoInN1cGVycHJvamVjdCIpIGNhbiBlYXNpbHkgY2xvbmUgYWxsIHRoZSBzdWJtb2R1bGVzIGF0IHRoZSBzYW1lIHJldmlzaW9uLgorUGFydGlhbCBjaGVja291dHMgb2YgdGhlIHN1cGVycHJvamVjdCBhcmUgcG9zc2libGU6IHlvdSBjYW4gdGVsbCBHaXQgdG8KK2Nsb25lIG5vbmUsIHNvbWUgb3IgYWxsIG9mIHRoZSBzdWJtb2R1bGVzLgorCitUaGUgbGlua2dpdDpnaXQtc3VibW9kdWxlWzFdIGNvbW1hbmQgaXMgYXZhaWxhYmxlIHNpbmNlIEdpdCAxLjUuMy4gIFVzZXJzCit3aXRoIEdpdCAxLjUuMiBjYW4gbG9vayB1cCB0aGUgc3VibW9kdWxlIGNvbW1pdHMgaW4gdGhlIHJlcG9zaXRvcnkgYW5kCittYW51YWxseSBjaGVjayB0aGVtIG91dDsgZWFybGllciB2ZXJzaW9ucyB3b24ndCByZWNvZ25pemUgdGhlIHN1Ym1vZHVsZXMgYXQKK2FsbC4KKworVG8gc2VlIGhvdyBzdWJtb2R1bGUgc3VwcG9ydCB3b3JrcywgY3JlYXRlIChmb3IgZXhhbXBsZSkgZm91ciBleGFtcGxlCityZXBvc2l0b3JpZXMgdGhhdCBjYW4gYmUgdXNlZCBsYXRlciBhcyBhIHN1Ym1vZHVsZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBta2RpciB+L2dpdAorJCBjZCB+L2dpdAorJCBmb3IgaSBpbiBhIGIgYyBkCitkbworCW1rZGlyICRpCisJY2QgJGkKKwlnaXQgaW5pdAorCWVjaG8gIm1vZHVsZSAkaSIgPiAkaS50eHQKKwlnaXQgYWRkICRpLnR4dAorCWdpdCBjb21taXQgLW0gIkluaXRpYWwgY29tbWl0LCBzdWJtb2R1bGUgJGkiCisJY2QgLi4KK2RvbmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm93IGNyZWF0ZSB0aGUgc3VwZXJwcm9qZWN0IGFuZCBhZGQgYWxsIHRoZSBzdWJtb2R1bGVzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIG1rZGlyIHN1cGVyCiskIGNkIHN1cGVyCiskIGdpdCBpbml0CiskIGZvciBpIGluIGEgYiBjIGQKK2RvCisJZ2l0IHN1Ym1vZHVsZSBhZGQgfi9naXQvJGkKK2RvbmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTk9URTogRG8gbm90IHVzZSBsb2NhbCBVUkxzIGhlcmUgaWYgeW91IHBsYW4gdG8gcHVibGlzaCB5b3VyIHN1cGVycHJvamVjdCEKKworU2VlIHdoYXQgZmlsZXMgYGdpdCBzdWJtb2R1bGVgIGNyZWF0ZWQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgbHMgLWEKKy4gIC4uICAuZ2l0ICAuZ2l0bW9kdWxlcyAgYSAgYiAgYyAgZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgYGdpdCBzdWJtb2R1bGUgYWRkYCBjb21tYW5kIGRvZXMgYSBjb3VwbGUgb2YgdGhpbmdzOgorCistIEl0IGNsb25lcyB0aGUgc3VibW9kdWxlIHVuZGVyIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgYnkgZGVmYXVsdCBjaGVja3Mgb3V0CisgIHRoZSBtYXN0ZXIgYnJhbmNoLgorLSBJdCBhZGRzIHRoZSBzdWJtb2R1bGUncyBjbG9uZSBwYXRoIHRvIHRoZSBsaW5rZ2l0OmdpdG1vZHVsZXNbNV0gZmlsZSBhbmQKKyAgYWRkcyB0aGlzIGZpbGUgdG8gdGhlIGluZGV4LCByZWFkeSB0byBiZSBjb21taXR0ZWQuCistIEl0IGFkZHMgdGhlIHN1Ym1vZHVsZSdzIGN1cnJlbnQgY29tbWl0IElEIHRvIHRoZSBpbmRleCwgcmVhZHkgdG8gYmUKKyAgY29tbWl0dGVkLgorCitDb21taXQgdGhlIHN1cGVycHJvamVjdDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY29tbWl0IC1tICJBZGQgc3VibW9kdWxlcyBhLCBiLCBjIGFuZCBkLiIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm93IGNsb25lIHRoZSBzdXBlcnByb2plY3Q6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgY2QgLi4KKyQgZ2l0IGNsb25lIHN1cGVyIGNsb25lZAorJCBjZCBjbG9uZWQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHN1Ym1vZHVsZSBkaXJlY3RvcmllcyBhcmUgdGhlcmUsIGJ1dCB0aGV5J3JlIGVtcHR5OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGxzIC1hIGEKKy4gIC4uCiskIGdpdCBzdWJtb2R1bGUgc3RhdHVzCistZDI2NmI5ODczYWQ1MDQ4ODE2MzQ1N2YwMjVkYjdjZGQ5NjgzZDg4YiBhCistZTgxZDQ1N2RhMTUzMDliNGZlZjQyNDlhYmE5YjUwMTg3OTk5NjcwZCBiCistYzE1MzZhOTcyYjlhZmZlYTBmMTZlMDY4MGJhODczMzJkYzA1OTE0NiBjCistZDk2MjQ5ZmY1ZDU3ZGU1ZGUwOTNlNmJhZmY5ZTBhYWZhNTI3NmE3NCBkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05PVEU6IFRoZSBjb21taXQgb2JqZWN0IG5hbWVzIHNob3duIGFib3ZlIHdvdWxkIGJlIGRpZmZlcmVudCBmb3IgeW91LCBidXQgdGhleQorc2hvdWxkIG1hdGNoIHRoZSBIRUFEIGNvbW1pdCBvYmplY3QgbmFtZXMgb2YgeW91ciByZXBvc2l0b3JpZXMuICBZb3UgY2FuIGNoZWNrCitpdCBieSBydW5uaW5nIGBnaXQgbHMtcmVtb3RlIC4uL2FgLgorCitQdWxsaW5nIGRvd24gdGhlIHN1Ym1vZHVsZXMgaXMgYSB0d28tc3RlcCBwcm9jZXNzLiBGaXJzdCBydW4gYGdpdCBzdWJtb2R1bGUKK2luaXRgIHRvIGFkZCB0aGUgc3VibW9kdWxlIHJlcG9zaXRvcnkgVVJMcyB0byBgLmdpdC9jb25maWdgOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzdWJtb2R1bGUgaW5pdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3cgdXNlIGBnaXQgc3VibW9kdWxlIHVwZGF0ZWAgdG8gY2xvbmUgdGhlIHJlcG9zaXRvcmllcyBhbmQgY2hlY2sgb3V0IHRoZQorY29tbWl0cyBzcGVjaWZpZWQgaW4gdGhlIHN1cGVycHJvamVjdDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc3VibW9kdWxlIHVwZGF0ZQorJCBjZCBhCiskIGxzIC1hCisuICAuLiAgLmdpdCAgYS50eHQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT25lIG1ham9yIGRpZmZlcmVuY2UgYmV0d2VlbiBgZ2l0IHN1Ym1vZHVsZSB1cGRhdGVgIGFuZCBgZ2l0IHN1Ym1vZHVsZSBhZGRgIGlzCit0aGF0IGBnaXQgc3VibW9kdWxlIHVwZGF0ZWAgY2hlY2tzIG91dCBhIHNwZWNpZmljIGNvbW1pdCwgcmF0aGVyIHRoYW4gdGhlIHRpcAorb2YgYSBicmFuY2guIEl0J3MgbGlrZSBjaGVja2luZyBvdXQgYSB0YWc6IHRoZSBoZWFkIGlzIGRldGFjaGVkLCBzbyB5b3UncmUgbm90Cit3b3JraW5nIG9uIGEgYnJhbmNoLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBicmFuY2gKKyogKG5vIGJyYW5jaCkKKyAgbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHlvdSB3YW50IHRvIG1ha2UgYSBjaGFuZ2Ugd2l0aGluIGEgc3VibW9kdWxlIGFuZCB5b3UgaGF2ZSBhIGRldGFjaGVkIGhlYWQsCit0aGVuIHlvdSBzaG91bGQgY3JlYXRlIG9yIGNoZWNrb3V0IGEgYnJhbmNoLCBtYWtlIHlvdXIgY2hhbmdlcywgcHVibGlzaCB0aGUKK2NoYW5nZSB3aXRoaW4gdGhlIHN1Ym1vZHVsZSwgYW5kIHRoZW4gdXBkYXRlIHRoZSBzdXBlcnByb2plY3QgdG8gcmVmZXJlbmNlIHRoZQorbmV3IGNvbW1pdDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgbWFzdGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK29yCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC1iIGZpeC11cAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0aGVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZWNobyAiYWRkaW5nIGEgbGluZSBhZ2FpbiIgPj4gYS50eHQKKyQgZ2l0IGNvbW1pdCAtYSAtbSAiVXBkYXRlZCB0aGUgc3VibW9kdWxlIGZyb20gd2l0aGluIHRoZSBzdXBlcnByb2plY3QuIgorJCBnaXQgcHVzaAorJCBjZCAuLgorJCBnaXQgZGlmZgorZGlmZiAtLWdpdCBhL2EgYi9hCitpbmRleCBkMjY2Yjk4Li4yNjFkZmFjIDE2MDAwMAorLS0tIGEvYQorKysrIGIvYQorQEAgLTEgKzEgQEAKKy1TdWJwcm9qZWN0IGNvbW1pdCBkMjY2Yjk4NzNhZDUwNDg4MTYzNDU3ZjAyNWRiN2NkZDk2ODNkODhiCisrU3VicHJvamVjdCBjb21taXQgMjYxZGZhYzM1Y2I5OWQzODBlYjk2NmUxMDJjMTE5NzEzOWY3ZmEyNAorJCBnaXQgYWRkIGEKKyQgZ2l0IGNvbW1pdCAtbSAiVXBkYXRlZCBzdWJtb2R1bGUgYS4iCiskIGdpdCBwdXNoCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1lvdSBoYXZlIHRvIHJ1biBgZ2l0IHN1Ym1vZHVsZSB1cGRhdGVgIGFmdGVyIGBnaXQgcHVsbGAgaWYgeW91IHdhbnQgdG8gdXBkYXRlCitzdWJtb2R1bGVzLCB0b28uCisKK1BpdGZhbGxzIHdpdGggc3VibW9kdWxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Fsd2F5cyBwdWJsaXNoIHRoZSBzdWJtb2R1bGUgY2hhbmdlIGJlZm9yZSBwdWJsaXNoaW5nIHRoZSBjaGFuZ2UgdG8gdGhlCitzdXBlcnByb2plY3QgdGhhdCByZWZlcmVuY2VzIGl0LiBJZiB5b3UgZm9yZ2V0IHRvIHB1Ymxpc2ggdGhlIHN1Ym1vZHVsZSBjaGFuZ2UsCitvdGhlcnMgd29uJ3QgYmUgYWJsZSB0byBjbG9uZSB0aGUgcmVwb3NpdG9yeToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBjZCB+L2dpdC9zdXBlci9hCiskIGVjaG8gaSBhZGRlZCBhbm90aGVyIGxpbmUgdG8gdGhpcyBmaWxlID4+IGEudHh0CiskIGdpdCBjb21taXQgLWEgLW0gImRvaW5nIGl0IHdyb25nIHRoaXMgdGltZSIKKyQgY2QgLi4KKyQgZ2l0IGFkZCBhCiskIGdpdCBjb21taXQgLW0gIlVwZGF0ZWQgc3VibW9kdWxlIGEgYWdhaW4uIgorJCBnaXQgcHVzaAorJCBjZCB+L2dpdC9jbG9uZWQKKyQgZ2l0IHB1bGwKKyQgZ2l0IHN1Ym1vZHVsZSB1cGRhdGUKK2Vycm9yOiBwYXRoc3BlYyAnMjYxZGZhYzM1Y2I5OWQzODBlYjk2NmUxMDJjMTE5NzEzOWY3ZmEyNCcgZGlkIG5vdCBtYXRjaCBhbnkgZmlsZShzKSBrbm93biB0byBnaXQuCitEaWQgeW91IGZvcmdldCB0byAnZ2l0IGFkZCc/CitVbmFibGUgdG8gY2hlY2tvdXQgJzI2MWRmYWMzNWNiOTlkMzgwZWI5NjZlMTAyYzExOTcxMzlmN2ZhMjQnIGluIHN1Ym1vZHVsZSBwYXRoICdhJworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3UgYWxzbyBzaG91bGQgbm90IHJld2luZCBicmFuY2hlcyBpbiBhIHN1Ym1vZHVsZSBiZXlvbmQgY29tbWl0cyB0aGF0IHdlcmUKK2V2ZXIgcmVjb3JkZWQgaW4gYW55IHN1cGVycHJvamVjdC4KKworSXQncyBub3Qgc2FmZSB0byBydW4gYGdpdCBzdWJtb2R1bGUgdXBkYXRlYCBpZiB5b3UndmUgbWFkZSBhbmQgY29tbWl0dGVkCitjaGFuZ2VzIHdpdGhpbiBhIHN1Ym1vZHVsZSB3aXRob3V0IGNoZWNraW5nIG91dCBhIGJyYW5jaCBmaXJzdC4gVGhleSB3aWxsIGJlCitzaWxlbnRseSBvdmVyd3JpdHRlbjoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBjYXQgYS50eHQKK21vZHVsZSBhCiskIGVjaG8gbGluZSBhZGRlZCBmcm9tIHByaXZhdGUyID4+IGEudHh0CiskIGdpdCBjb21taXQgLWEgLW0gImxpbmUgYWRkZWQgaW5zaWRlIHByaXZhdGUyIgorJCBjZCAuLgorJCBnaXQgc3VibW9kdWxlIHVwZGF0ZQorU3VibW9kdWxlIHBhdGggJ2EnOiBjaGVja2VkIG91dCAnZDI2NmI5ODczYWQ1MDQ4ODE2MzQ1N2YwMjVkYjdjZGQ5NjgzZDg4YicKKyQgY2QgYQorJCBjYXQgYS50eHQKK21vZHVsZSBhCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05PVEU6IFRoZSBjaGFuZ2VzIGFyZSBzdGlsbCB2aXNpYmxlIGluIHRoZSBzdWJtb2R1bGUncyByZWZsb2cuCisKK1RoaXMgaXMgbm90IHRoZSBjYXNlIGlmIHlvdSBkaWQgbm90IGNvbW1pdCB5b3VyIGNoYW5nZXMuCisKK1tbbG93LWxldmVsLW9wZXJhdGlvbnNdXQorTG93LWxldmVsIGdpdCBvcGVyYXRpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT0KKworTWFueSBvZiB0aGUgaGlnaGVyLWxldmVsIGNvbW1hbmRzIHdlcmUgb3JpZ2luYWxseSBpbXBsZW1lbnRlZCBhcyBzaGVsbAorc2NyaXB0cyB1c2luZyBhIHNtYWxsZXIgY29yZSBvZiBsb3ctbGV2ZWwgZ2l0IGNvbW1hbmRzLiAgVGhlc2UgY2FuIHN0aWxsCitiZSB1c2VmdWwgd2hlbiBkb2luZyB1bnVzdWFsIHRoaW5ncyB3aXRoIGdpdCwgb3IganVzdCBhcyBhIHdheSB0bwordW5kZXJzdGFuZCBpdHMgaW5uZXIgd29ya2luZ3MuCisKK1tbb2JqZWN0LW1hbmlwdWxhdGlvbl1dCitPYmplY3QgYWNjZXNzIGFuZCBtYW5pcHVsYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgbGlua2dpdDpnaXQtY2F0LWZpbGVbMV0gY29tbWFuZCBjYW4gc2hvdyB0aGUgY29udGVudHMgb2YgYW55IG9iamVjdCwKK3Rob3VnaCB0aGUgaGlnaGVyLWxldmVsIGxpbmtnaXQ6Z2l0LXNob3dbMV0gaXMgdXN1YWxseSBtb3JlIHVzZWZ1bC4KKworVGhlIGxpbmtnaXQ6Z2l0LWNvbW1pdC10cmVlWzFdIGNvbW1hbmQgYWxsb3dzIGNvbnN0cnVjdGluZyBjb21taXRzIHdpdGgKK2FyYml0cmFyeSBwYXJlbnRzIGFuZCB0cmVlcy4KKworQSB0cmVlIGNhbiBiZSBjcmVhdGVkIHdpdGggbGlua2dpdDpnaXQtd3JpdGUtdHJlZVsxXSBhbmQgaXRzIGRhdGEgY2FuIGJlCithY2Nlc3NlZCBieSBsaW5rZ2l0OmdpdC1scy10cmVlWzFdLiAgVHdvIHRyZWVzIGNhbiBiZSBjb21wYXJlZCB3aXRoCitsaW5rZ2l0OmdpdC1kaWZmLXRyZWVbMV0uCisKK0EgdGFnIGlzIGNyZWF0ZWQgd2l0aCBsaW5rZ2l0OmdpdC1ta3RhZ1sxXSwgYW5kIHRoZSBzaWduYXR1cmUgY2FuIGJlCit2ZXJpZmllZCBieSBsaW5rZ2l0OmdpdC12ZXJpZnktdGFnWzFdLCB0aG91Z2ggaXQgaXMgbm9ybWFsbHkgc2ltcGxlciB0bwordXNlIGxpbmtnaXQ6Z2l0LXRhZ1sxXSBmb3IgYm90aC4KKworW1t0aGUtd29ya2Zsb3ddXQorVGhlIFdvcmtmbG93CistLS0tLS0tLS0tLS0KKworSGlnaC1sZXZlbCBvcGVyYXRpb25zIHN1Y2ggYXMgbGlua2dpdDpnaXQtY29tbWl0WzFdLAorbGlua2dpdDpnaXQtY2hlY2tvdXRbMV0gYW5kIGxpbmtnaXQ6Z2l0LXJlc2V0WzFdIHdvcmsgYnkgbW92aW5nIGRhdGEKK2JldHdlZW4gdGhlIHdvcmtpbmcgdHJlZSwgdGhlIGluZGV4LCBhbmQgdGhlIG9iamVjdCBkYXRhYmFzZS4gIEdpdAorcHJvdmlkZXMgbG93LWxldmVsIG9wZXJhdGlvbnMgd2hpY2ggcGVyZm9ybSBlYWNoIG9mIHRoZXNlIHN0ZXBzCitpbmRpdmlkdWFsbHkuCisKK0dlbmVyYWxseSwgYWxsICJnaXQiIG9wZXJhdGlvbnMgd29yayBvbiB0aGUgaW5kZXggZmlsZS4gU29tZSBvcGVyYXRpb25zCit3b3JrICpwdXJlbHkqIG9uIHRoZSBpbmRleCBmaWxlIChzaG93aW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZQoraW5kZXgpLCBidXQgbW9zdCBvcGVyYXRpb25zIG1vdmUgZGF0YSBiZXR3ZWVuIHRoZSBpbmRleCBmaWxlIGFuZCBlaXRoZXIKK3RoZSBkYXRhYmFzZSBvciB0aGUgd29ya2luZyBkaXJlY3RvcnkuIFRodXMgdGhlcmUgYXJlIGZvdXIgbWFpbgorY29tYmluYXRpb25zOgorCitbW3dvcmtpbmctZGlyZWN0b3J5LXRvLWluZGV4XV0KK3dvcmtpbmcgZGlyZWN0b3J5IC0+IGluZGV4Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgbGlua2dpdDpnaXQtdXBkYXRlLWluZGV4WzFdIGNvbW1hbmQgdXBkYXRlcyB0aGUgaW5kZXggd2l0aAoraW5mb3JtYXRpb24gZnJvbSB0aGUgd29ya2luZyBkaXJlY3RvcnkuICBZb3UgZ2VuZXJhbGx5IHVwZGF0ZSB0aGUKK2luZGV4IGluZm9ybWF0aW9uIGJ5IGp1c3Qgc3BlY2lmeWluZyB0aGUgZmlsZW5hbWUgeW91IHdhbnQgdG8gdXBkYXRlLAorbGlrZSBzbzoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgdXBkYXRlLWluZGV4IGZpbGVuYW1lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2J1dCB0byBhdm9pZCBjb21tb24gbWlzdGFrZXMgd2l0aCBmaWxlbmFtZSBnbG9iYmluZyBldGMsIHRoZSBjb21tYW5kCit3aWxsIG5vdCBub3JtYWxseSBhZGQgdG90YWxseSBuZXcgZW50cmllcyBvciByZW1vdmUgb2xkIGVudHJpZXMsCitpLmUuIGl0IHdpbGwgbm9ybWFsbHkganVzdCB1cGRhdGUgZXhpc3RpbmcgY2FjaGUgZW50cmllcy4KKworVG8gdGVsbCBnaXQgdGhhdCB5ZXMsIHlvdSByZWFsbHkgZG8gcmVhbGl6ZSB0aGF0IGNlcnRhaW4gZmlsZXMgbm8KK2xvbmdlciBleGlzdCwgb3IgdGhhdCBuZXcgZmlsZXMgc2hvdWxkIGJlIGFkZGVkLCB5b3UKK3Nob3VsZCB1c2UgdGhlIGAtLXJlbW92ZWAgYW5kIGAtLWFkZGAgZmxhZ3MgcmVzcGVjdGl2ZWx5LgorCitOT1RFISBBIGAtLXJlbW92ZWAgZmxhZyBkb2VzICdub3QnIG1lYW4gdGhhdCBzdWJzZXF1ZW50IGZpbGVuYW1lcyB3aWxsCituZWNlc3NhcmlseSBiZSByZW1vdmVkOiBpZiB0aGUgZmlsZXMgc3RpbGwgZXhpc3QgaW4geW91ciBkaXJlY3RvcnkKK3N0cnVjdHVyZSwgdGhlIGluZGV4IHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZWlyIG5ldyBzdGF0dXMsIG5vdAorcmVtb3ZlZC4gVGhlIG9ubHkgdGhpbmcgYC0tcmVtb3ZlYCBtZWFucyBpcyB0aGF0IHVwZGF0ZS1pbmRleCB3aWxsIGJlCitjb25zaWRlcmluZyBhIHJlbW92ZWQgZmlsZSB0byBiZSBhIHZhbGlkIHRoaW5nLCBhbmQgaWYgdGhlIGZpbGUgcmVhbGx5Citkb2VzIG5vdCBleGlzdCBhbnkgbW9yZSwgaXQgd2lsbCB1cGRhdGUgdGhlIGluZGV4IGFjY29yZGluZ2x5LgorCitBcyBhIHNwZWNpYWwgY2FzZSwgeW91IGNhbiBhbHNvIGRvIGBnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaGAsIHdoaWNoCit3aWxsIHJlZnJlc2ggdGhlICJzdGF0IiBpbmZvcm1hdGlvbiBvZiBlYWNoIGluZGV4IHRvIG1hdGNoIHRoZSBjdXJyZW50CitzdGF0IGluZm9ybWF0aW9uLiBJdCB3aWxsICdub3QnIHVwZGF0ZSB0aGUgb2JqZWN0IHN0YXR1cyBpdHNlbGYsIGFuZAoraXQgd2lsbCBvbmx5IHVwZGF0ZSB0aGUgZmllbGRzIHRoYXQgYXJlIHVzZWQgdG8gcXVpY2tseSB0ZXN0IHdoZXRoZXIKK2FuIG9iamVjdCBzdGlsbCBtYXRjaGVzIGl0cyBvbGQgYmFja2luZyBzdG9yZSBvYmplY3QuCisKK1RoZSBwcmV2aW91c2x5IGludHJvZHVjZWQgbGlua2dpdDpnaXQtYWRkWzFdIGlzIGp1c3QgYSB3cmFwcGVyIGZvcgorbGlua2dpdDpnaXQtdXBkYXRlLWluZGV4WzFdLgorCitbW2luZGV4LXRvLW9iamVjdC1kYXRhYmFzZV1dCitpbmRleCAtPiBvYmplY3QgZGF0YWJhc2UKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitZb3Ugd3JpdGUgeW91ciBjdXJyZW50IGluZGV4IGZpbGUgdG8gYSAidHJlZSIgb2JqZWN0IHdpdGggdGhlIHByb2dyYW0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgd3JpdGUtdHJlZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0aGF0IGRvZXNuJ3QgY29tZSB3aXRoIGFueSBvcHRpb25zLS1pdCB3aWxsIGp1c3Qgd3JpdGUgb3V0IHRoZQorY3VycmVudCBpbmRleCBpbnRvIHRoZSBzZXQgb2YgdHJlZSBvYmplY3RzIHRoYXQgZGVzY3JpYmUgdGhhdCBzdGF0ZSwKK2FuZCBpdCB3aWxsIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIHRvcC1sZXZlbCB0cmVlLiBZb3UgY2FuCit1c2UgdGhhdCB0cmVlIHRvIHJlLWdlbmVyYXRlIHRoZSBpbmRleCBhdCBhbnkgdGltZSBieSBnb2luZyBpbiB0aGUKK290aGVyIGRpcmVjdGlvbjoKKworW1tvYmplY3QtZGF0YWJhc2UtdG8taW5kZXhdXQorb2JqZWN0IGRhdGFiYXNlIC0+IGluZGV4Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworWW91IHJlYWQgYSAidHJlZSIgZmlsZSBmcm9tIHRoZSBvYmplY3QgZGF0YWJhc2UsIGFuZCB1c2UgdGhhdCB0bworcG9wdWxhdGUgKGFuZCBvdmVyd3JpdGUtLWRvbid0IGRvIHRoaXMgaWYgeW91ciBpbmRleCBjb250YWlucyBhbnkKK3Vuc2F2ZWQgc3RhdGUgdGhhdCB5b3UgbWlnaHQgd2FudCB0byByZXN0b3JlIGxhdGVyISkgeW91ciBjdXJyZW50CitpbmRleC4gIE5vcm1hbCBvcGVyYXRpb24gaXMganVzdAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1yZWFkLXRyZWUgPHNoYTEgb2YgdHJlZT4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIHlvdXIgaW5kZXggZmlsZSB3aWxsIG5vdyBiZSBlcXVpdmFsZW50IHRvIHRoZSB0cmVlIHRoYXQgeW91IHNhdmVkCitlYXJsaWVyLiBIb3dldmVyLCB0aGF0IGlzIG9ubHkgeW91ciAnaW5kZXgnIGZpbGU6IHlvdXIgd29ya2luZworZGlyZWN0b3J5IGNvbnRlbnRzIGhhdmUgbm90IGJlZW4gbW9kaWZpZWQuCisKK1tbaW5kZXgtdG8td29ya2luZy1kaXJlY3RvcnldXQoraW5kZXggLT4gd29ya2luZyBkaXJlY3RvcnkKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1lvdSB1cGRhdGUgeW91ciB3b3JraW5nIGRpcmVjdG9yeSBmcm9tIHRoZSBpbmRleCBieSAiY2hlY2tpbmcgb3V0IgorZmlsZXMuIFRoaXMgaXMgbm90IGEgdmVyeSBjb21tb24gb3BlcmF0aW9uLCBzaW5jZSBub3JtYWxseSB5b3UnZCBqdXN0CitrZWVwIHlvdXIgZmlsZXMgdXBkYXRlZCwgYW5kIHJhdGhlciB0aGFuIHdyaXRlIHRvIHlvdXIgd29ya2luZworZGlyZWN0b3J5LCB5b3UnZCB0ZWxsIHRoZSBpbmRleCBmaWxlcyBhYm91dCB0aGUgY2hhbmdlcyBpbiB5b3VyCit3b3JraW5nIGRpcmVjdG9yeSAoaS5lLiBgZ2l0LXVwZGF0ZS1pbmRleGApLgorCitIb3dldmVyLCBpZiB5b3UgZGVjaWRlIHRvIGp1bXAgdG8gYSBuZXcgdmVyc2lvbiwgb3IgY2hlY2sgb3V0IHNvbWVib2R5CitlbHNlJ3MgdmVyc2lvbiwgb3IganVzdCByZXN0b3JlIGEgcHJldmlvdXMgdHJlZSwgeW91J2QgcG9wdWxhdGUgeW91cgoraW5kZXggZmlsZSB3aXRoIHJlYWQtdHJlZSwgYW5kIHRoZW4geW91IG5lZWQgdG8gY2hlY2sgb3V0IHRoZSByZXN1bHQKK3dpdGgKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtY2hlY2tvdXQtaW5kZXggZmlsZW5hbWUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworb3IsIGlmIHlvdSB3YW50IHRvIGNoZWNrIG91dCBhbGwgb2YgdGhlIGluZGV4LCB1c2UgYC1hYC4KKworTk9URSEgZ2l0LWNoZWNrb3V0LWluZGV4IG5vcm1hbGx5IHJlZnVzZXMgdG8gb3ZlcndyaXRlIG9sZCBmaWxlcywgc28KK2lmIHlvdSBoYXZlIGFuIG9sZCB2ZXJzaW9uIG9mIHRoZSB0cmVlIGFscmVhZHkgY2hlY2tlZCBvdXQsIHlvdSB3aWxsCituZWVkIHRvIHVzZSB0aGUgIi1mIiBmbGFnICgnYmVmb3JlJyB0aGUgIi1hIiBmbGFnIG9yIHRoZSBmaWxlbmFtZSkgdG8KKydmb3JjZScgdGhlIGNoZWNrb3V0LgorCisKK0ZpbmFsbHksIHRoZXJlIGFyZSBhIGZldyBvZGRzIGFuZCBlbmRzIHdoaWNoIGFyZSBub3QgcHVyZWx5IG1vdmluZworZnJvbSBvbmUgcmVwcmVzZW50YXRpb24gdG8gdGhlIG90aGVyOgorCitbW3R5aW5nLWl0LWFsbC10b2dldGhlcl1dCitUeWluZyBpdCBhbGwgdG9nZXRoZXIKK35+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUbyBjb21taXQgYSB0cmVlIHlvdSBoYXZlIGluc3RhbnRpYXRlZCB3aXRoICJnaXQtd3JpdGUtdHJlZSIsIHlvdSdkCitjcmVhdGUgYSAiY29tbWl0IiBvYmplY3QgdGhhdCByZWZlcnMgdG8gdGhhdCB0cmVlIGFuZCB0aGUgaGlzdG9yeQorYmVoaW5kIGl0LS1tb3N0IG5vdGFibHkgdGhlICJwYXJlbnQiIGNvbW1pdHMgdGhhdCBwcmVjZWRlZCBpdCBpbgoraGlzdG9yeS4KKworTm9ybWFsbHkgYSAiY29tbWl0IiBoYXMgb25lIHBhcmVudDogdGhlIHByZXZpb3VzIHN0YXRlIG9mIHRoZSB0cmVlCitiZWZvcmUgYSBjZXJ0YWluIGNoYW5nZSB3YXMgbWFkZS4gSG93ZXZlciwgc29tZXRpbWVzIGl0IGNhbiBoYXZlIHR3bworb3IgbW9yZSBwYXJlbnQgY29tbWl0cywgaW4gd2hpY2ggY2FzZSB3ZSBjYWxsIGl0IGEgIm1lcmdlIiwgZHVlIHRvIHRoZQorZmFjdCB0aGF0IHN1Y2ggYSBjb21taXQgYnJpbmdzIHRvZ2V0aGVyICgibWVyZ2VzIikgdHdvIG9yIG1vcmUKK3ByZXZpb3VzIHN0YXRlcyByZXByZXNlbnRlZCBieSBvdGhlciBjb21taXRzLgorCitJbiBvdGhlciB3b3Jkcywgd2hpbGUgYSAidHJlZSIgcmVwcmVzZW50cyBhIHBhcnRpY3VsYXIgZGlyZWN0b3J5IHN0YXRlCitvZiBhIHdvcmtpbmcgZGlyZWN0b3J5LCBhICJjb21taXQiIHJlcHJlc2VudHMgdGhhdCBzdGF0ZSBpbiAidGltZSIsCithbmQgZXhwbGFpbnMgaG93IHdlIGdvdCB0aGVyZS4KKworWW91IGNyZWF0ZSBhIGNvbW1pdCBvYmplY3QgYnkgZ2l2aW5nIGl0IHRoZSB0cmVlIHRoYXQgZGVzY3JpYmVzIHRoZQorc3RhdGUgYXQgdGhlIHRpbWUgb2YgdGhlIGNvbW1pdCwgYW5kIGEgbGlzdCBvZiBwYXJlbnRzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1jb21taXQtdHJlZSA8dHJlZT4gLXAgPHBhcmVudD4gWy1wIDxwYXJlbnQyPiAuLl0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIHRoZW4gZ2l2aW5nIHRoZSByZWFzb24gZm9yIHRoZSBjb21taXQgb24gc3RkaW4gKGVpdGhlciB0aHJvdWdoCityZWRpcmVjdGlvbiBmcm9tIGEgcGlwZSBvciBmaWxlLCBvciBieSBqdXN0IHR5cGluZyBpdCBhdCB0aGUgdHR5KS4KKworZ2l0LWNvbW1pdC10cmVlIHdpbGwgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdGhhdCByZXByZXNlbnRzCit0aGF0IGNvbW1pdCwgYW5kIHlvdSBzaG91bGQgc2F2ZSBpdCBhd2F5IGZvciBsYXRlciB1c2UuIE5vcm1hbGx5LAoreW91J2QgY29tbWl0IGEgbmV3IGBIRUFEYCBzdGF0ZSwgYW5kIHdoaWxlIGdpdCBkb2Vzbid0IGNhcmUgd2hlcmUgeW91CitzYXZlIHRoZSBub3RlIGFib3V0IHRoYXQgc3RhdGUsIGluIHByYWN0aWNlIHdlIHRlbmQgdG8ganVzdCB3cml0ZSB0aGUKK3Jlc3VsdCB0byB0aGUgZmlsZSBwb2ludGVkIGF0IGJ5IGAuZ2l0L0hFQURgLCBzbyB0aGF0IHdlIGNhbiBhbHdheXMgc2VlCit3aGF0IHRoZSBsYXN0IGNvbW1pdHRlZCBzdGF0ZSB3YXMuCisKK0hlcmUgaXMgYW4gQVNDSUkgYXJ0IGJ5IEpvbiBMb2VsaWdlciB0aGF0IGlsbHVzdHJhdGVzIGhvdwordmFyaW91cyBwaWVjZXMgZml0IHRvZ2V0aGVyLgorCistLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICAgICAgY29tbWl0LXRyZWUKKyAgICAgICAgICAgICAgICAgICAgICBjb21taXQgb2JqCisgICAgICAgICAgICAgICAgICAgICAgICstLS0tKworICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgfCAgICB8CisgICAgICAgICAgICAgICAgICAgICAgIFYgICAgVgorICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgIHwgT2JqZWN0IERCIHwKKyAgICAgICAgICAgICAgICAgICAgfCAgQmFja2luZyAgfAorICAgICAgICAgICAgICAgICAgICB8ICAgU3RvcmUgICB8CisgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICAgXgorICAgICAgICAgICB3cml0ZS10cmVlICB8ICAgICB8CisgICAgICAgICAgICAgdHJlZSBvYmogIHwgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCAgcmVhZC10cmVlCisgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgIHRyZWUgb2JqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYKKyAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICB8ICAgSW5kZXggICB8CisgICAgICAgICAgICAgICAgICAgIHwgICJjYWNoZSIgIHwKKyAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKworICAgICAgICAgdXBkYXRlLWluZGV4ICBeCisgICAgICAgICAgICAgYmxvYiBvYmogIHwgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfAorICAgIGNoZWNrb3V0LWluZGV4IC11ICB8ICAgICB8ICBjaGVja291dC1pbmRleAorICAgICAgICAgICAgIHN0YXQgICAgICB8ICAgICB8ICBibG9iIG9iagorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWCisgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgfCAgV29ya2luZyAgfAorICAgICAgICAgICAgICAgICAgICB8IERpcmVjdG9yeSB8CisgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKworLS0tLS0tLS0tLS0tCisKKworW1tleGFtaW5pbmctdGhlLWRhdGFdXQorRXhhbWluaW5nIHRoZSBkYXRhCistLS0tLS0tLS0tLS0tLS0tLS0KKworWW91IGNhbiBleGFtaW5lIHRoZSBkYXRhIHJlcHJlc2VudGVkIGluIHRoZSBvYmplY3QgZGF0YWJhc2UgYW5kIHRoZQoraW5kZXggd2l0aCB2YXJpb3VzIGhlbHBlciB0b29scy4gRm9yIGV2ZXJ5IG9iamVjdCwgeW91IGNhbiB1c2UKK2xpbmtnaXQ6Z2l0LWNhdC1maWxlWzFdIHRvIGV4YW1pbmUgZGV0YWlscyBhYm91dCB0aGUKK29iamVjdDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtY2F0LWZpbGUgLXQgPG9iamVjdG5hbWU+CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3Nob3dzIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QsIGFuZCBvbmNlIHlvdSBoYXZlIHRoZSB0eXBlICh3aGljaCBpcwordXN1YWxseSBpbXBsaWNpdCBpbiB3aGVyZSB5b3UgZmluZCB0aGUgb2JqZWN0KSwgeW91IGNhbiB1c2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtY2F0LWZpbGUgYmxvYnx0cmVlfGNvbW1pdHx0YWcgPG9iamVjdG5hbWU+CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RvIHNob3cgaXRzIGNvbnRlbnRzLiBOT1RFISBUcmVlcyBoYXZlIGJpbmFyeSBjb250ZW50LCBhbmQgYXMgYSByZXN1bHQKK3RoZXJlIGlzIGEgc3BlY2lhbCBoZWxwZXIgZm9yIHNob3dpbmcgdGhhdCBjb250ZW50LCBjYWxsZWQKK2BnaXQtbHMtdHJlZWAsIHdoaWNoIHR1cm5zIHRoZSBiaW5hcnkgY29udGVudCBpbnRvIGEgbW9yZSBlYXNpbHkKK3JlYWRhYmxlIGZvcm0uCisKK0l0J3MgZXNwZWNpYWxseSBpbnN0cnVjdGl2ZSB0byBsb29rIGF0ICJjb21taXQiIG9iamVjdHMsIHNpbmNlIHRob3NlCit0ZW5kIHRvIGJlIHNtYWxsIGFuZCBmYWlybHkgc2VsZi1leHBsYW5hdG9yeS4gSW4gcGFydGljdWxhciwgaWYgeW91Citmb2xsb3cgdGhlIGNvbnZlbnRpb24gb2YgaGF2aW5nIHRoZSB0b3AgY29tbWl0IG5hbWUgaW4gYC5naXQvSEVBRGAsCit5b3UgY2FuIGRvCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWNhdC1maWxlIGNvbW1pdCBIRUFECistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RvIHNlZSB3aGF0IHRoZSB0b3AgY29tbWl0IHdhcy4KKworW1ttZXJnaW5nLW11bHRpcGxlLXRyZWVzXV0KK01lcmdpbmcgbXVsdGlwbGUgdHJlZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworR2l0IGhlbHBzIHlvdSBkbyBhIHRocmVlLXdheSBtZXJnZSwgd2hpY2ggeW91IGNhbiBleHBhbmQgdG8gbi13YXkgYnkKK3JlcGVhdGluZyB0aGUgbWVyZ2UgcHJvY2VkdXJlIGFyYml0cmFyeSB0aW1lcyB1bnRpbCB5b3UgZmluYWxseQorImNvbW1pdCIgdGhlIHN0YXRlLiAgVGhlIG5vcm1hbCBzaXR1YXRpb24gaXMgdGhhdCB5b3UnZCBvbmx5IGRvIG9uZQordGhyZWUtd2F5IG1lcmdlICh0d28gcGFyZW50cyksIGFuZCBjb21taXQgaXQsIGJ1dCBpZiB5b3UgbGlrZSB0bywgeW91CitjYW4gZG8gbXVsdGlwbGUgcGFyZW50cyBpbiBvbmUgZ28uCisKK1RvIGRvIGEgdGhyZWUtd2F5IG1lcmdlLCB5b3UgbmVlZCB0aGUgdHdvIHNldHMgb2YgImNvbW1pdCIgb2JqZWN0cwordGhhdCB5b3Ugd2FudCB0byBtZXJnZSwgdXNlIHRob3NlIHRvIGZpbmQgdGhlIGNsb3Nlc3QgY29tbW9uIHBhcmVudCAoYQordGhpcmQgImNvbW1pdCIgb2JqZWN0KSwgYW5kIHRoZW4gdXNlIHRob3NlIGNvbW1pdCBvYmplY3RzIHRvIGZpbmQgdGhlCitzdGF0ZSBvZiB0aGUgZGlyZWN0b3J5ICgidHJlZSIgb2JqZWN0KSBhdCB0aGVzZSBwb2ludHMuCisKK1RvIGdldCB0aGUgImJhc2UiIGZvciB0aGUgbWVyZ2UsIHlvdSBmaXJzdCBsb29rIHVwIHRoZSBjb21tb24gcGFyZW50CitvZiB0d28gY29tbWl0cyB3aXRoCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LW1lcmdlLWJhc2UgPGNvbW1pdDE+IDxjb21taXQyPgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCB3aWxsIHJldHVybiB5b3UgdGhlIGNvbW1pdCB0aGV5IGFyZSBib3RoIGJhc2VkIG9uLiAgWW91IHNob3VsZAorbm93IGxvb2sgdXAgdGhlICJ0cmVlIiBvYmplY3RzIG9mIHRob3NlIGNvbW1pdHMsIHdoaWNoIHlvdSBjYW4gZWFzaWx5CitkbyB3aXRoIChmb3IgZXhhbXBsZSkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtY2F0LWZpbGUgY29tbWl0IDxjb21taXRuYW1lPiB8IGhlYWQgLTEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc2luY2UgdGhlIHRyZWUgb2JqZWN0IGluZm9ybWF0aW9uIGlzIGFsd2F5cyB0aGUgZmlyc3QgbGluZSBpbiBhIGNvbW1pdAorb2JqZWN0LgorCitPbmNlIHlvdSBrbm93IHRoZSB0aHJlZSB0cmVlcyB5b3UgYXJlIGdvaW5nIHRvIG1lcmdlICh0aGUgb25lICJvcmlnaW5hbCIKK3RyZWUsIGFrYSB0aGUgY29tbW9uIHRyZWUsIGFuZCB0aGUgdHdvICJyZXN1bHQiIHRyZWVzLCBha2EgdGhlIGJyYW5jaGVzCit5b3Ugd2FudCB0byBtZXJnZSksIHlvdSBkbyBhICJtZXJnZSIgcmVhZCBpbnRvIHRoZSBpbmRleC4gVGhpcyB3aWxsCitjb21wbGFpbiBpZiBpdCBoYXMgdG8gdGhyb3cgYXdheSB5b3VyIG9sZCBpbmRleCBjb250ZW50cywgc28geW91IHNob3VsZAorbWFrZSBzdXJlIHRoYXQgeW91J3ZlIGNvbW1pdHRlZCB0aG9zZS0taW4gZmFjdCB5b3Ugd291bGQgbm9ybWFsbHkKK2Fsd2F5cyBkbyBhIG1lcmdlIGFnYWluc3QgeW91ciBsYXN0IGNvbW1pdCAod2hpY2ggc2hvdWxkIHRodXMgbWF0Y2ggd2hhdAoreW91IGhhdmUgaW4geW91ciBjdXJyZW50IGluZGV4IGFueXdheSkuCisKK1RvIGRvIHRoZSBtZXJnZSwgZG8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtcmVhZC10cmVlIC1tIC11IDxvcmlndHJlZT4gPHlvdXJ0cmVlPiA8dGFyZ2V0dHJlZT4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggd2lsbCBkbyBhbGwgdHJpdmlhbCBtZXJnZSBvcGVyYXRpb25zIGZvciB5b3UgZGlyZWN0bHkgaW4gdGhlCitpbmRleCBmaWxlLCBhbmQgeW91IGNhbiBqdXN0IHdyaXRlIHRoZSByZXN1bHQgb3V0IHdpdGgKK2BnaXQtd3JpdGUtdHJlZWAuCisKKworW1ttZXJnaW5nLW11bHRpcGxlLXRyZWVzLTJdXQorTWVyZ2luZyBtdWx0aXBsZSB0cmVlcywgY29udGludWVkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2FkbHksIG1hbnkgbWVyZ2VzIGFyZW4ndCB0cml2aWFsLiBJZiB0aGVyZSBhcmUgZmlsZXMgdGhhdCBoYXZlCitiZWVuIGFkZGVkLCBtb3ZlZCBvciByZW1vdmVkLCBvciBpZiBib3RoIGJyYW5jaGVzIGhhdmUgbW9kaWZpZWQgdGhlCitzYW1lIGZpbGUsIHlvdSB3aWxsIGJlIGxlZnQgd2l0aCBhbiBpbmRleCB0cmVlIHRoYXQgY29udGFpbnMgIm1lcmdlCitlbnRyaWVzIiBpbiBpdC4gU3VjaCBhbiBpbmRleCB0cmVlIGNhbiAnTk9UJyBiZSB3cml0dGVuIG91dCB0byBhIHRyZWUKK29iamVjdCwgYW5kIHlvdSB3aWxsIGhhdmUgdG8gcmVzb2x2ZSBhbnkgc3VjaCBtZXJnZSBjbGFzaGVzIHVzaW5nCitvdGhlciB0b29scyBiZWZvcmUgeW91IGNhbiB3cml0ZSBvdXQgdGhlIHJlc3VsdC4KKworWW91IGNhbiBleGFtaW5lIHN1Y2ggaW5kZXggc3RhdGUgd2l0aCBgZ2l0LWxzLWZpbGVzIC0tdW5tZXJnZWRgCitjb21tYW5kLiAgQW4gZXhhbXBsZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1yZWFkLXRyZWUgLW0gJG9yaWcgSEVBRCAkdGFyZ2V0CiskIGdpdC1scy1maWxlcyAtLXVubWVyZ2VkCisxMDA2NDQgMjYzNDE0ZjQyM2QwZTRkNzBkYWU4ZmU1M2ZhMzQ2MTRmZjNlMjg2MCAxCWhlbGxvLmMKKzEwMDY0NCAwNmZhNmEyNDI1NmRjN2U1NjBlZmE1Njg3ZmE4NGI1MWYwMjYzYzNhIDIJaGVsbG8uYworMTAwNjQ0IGNjNDRjNzNlYjc4MzU2NWRhNTgzMWI0ZDgyMGM5NjI5NTQwMTliNjkgMwloZWxsby5jCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRWFjaCBsaW5lIG9mIHRoZSBgZ2l0LWxzLWZpbGVzIC0tdW5tZXJnZWRgIG91dHB1dCBiZWdpbnMgd2l0aAordGhlIGJsb2IgbW9kZSBiaXRzLCBibG9iIFNIQTEsICdzdGFnZSBudW1iZXInLCBhbmQgdGhlCitmaWxlbmFtZS4gIFRoZSAnc3RhZ2UgbnVtYmVyJyBpcyBnaXQncyB3YXkgdG8gc2F5IHdoaWNoIHRyZWUgaXQKK2NhbWUgZnJvbTogc3RhZ2UgMSBjb3JyZXNwb25kcyB0byBgJG9yaWdgIHRyZWUsIHN0YWdlIDIgYEhFQURgCit0cmVlLCBhbmQgc3RhZ2UzIGAkdGFyZ2V0YCB0cmVlLgorCitFYXJsaWVyIHdlIHNhaWQgdGhhdCB0cml2aWFsIG1lcmdlcyBhcmUgZG9uZSBpbnNpZGUKK2BnaXQtcmVhZC10cmVlIC1tYC4gIEZvciBleGFtcGxlLCBpZiB0aGUgZmlsZSBkaWQgbm90IGNoYW5nZQorZnJvbSBgJG9yaWdgIHRvIGBIRUFEYCBub3IgYCR0YXJnZXRgLCBvciBpZiB0aGUgZmlsZSBjaGFuZ2VkCitmcm9tIGAkb3JpZ2AgdG8gYEhFQURgIGFuZCBgJG9yaWdgIHRvIGAkdGFyZ2V0YCB0aGUgc2FtZSB3YXksCitvYnZpb3VzbHkgdGhlIGZpbmFsIG91dGNvbWUgaXMgd2hhdCBpcyBpbiBgSEVBRGAuICBXaGF0IHRoZQorYWJvdmUgZXhhbXBsZSBzaG93cyBpcyB0aGF0IGZpbGUgYGhlbGxvLmNgIHdhcyBjaGFuZ2VkIGZyb20KK2Akb3JpZ2AgdG8gYEhFQURgIGFuZCBgJG9yaWdgIHRvIGAkdGFyZ2V0YCBpbiBhIGRpZmZlcmVudCB3YXkuCitZb3UgY291bGQgcmVzb2x2ZSB0aGlzIGJ5IHJ1bm5pbmcgeW91ciBmYXZvcml0ZSAzLXdheSBtZXJnZQorcHJvZ3JhbSwgZS5nLiAgYGRpZmYzYCwgYG1lcmdlYCwgb3IgZ2l0J3Mgb3duIG1lcmdlLWZpbGUsIG9uCit0aGUgYmxvYiBvYmplY3RzIGZyb20gdGhlc2UgdGhyZWUgc3RhZ2VzIHlvdXJzZWxmLCBsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtY2F0LWZpbGUgYmxvYiAyNjM0MTRmLi4uID5oZWxsby5jfjEKKyQgZ2l0LWNhdC1maWxlIGJsb2IgMDZmYTZhMi4uLiA+aGVsbG8uY34yCiskIGdpdC1jYXQtZmlsZSBibG9iIGNjNDRjNzMuLi4gPmhlbGxvLmN+MworJCBnaXQgbWVyZ2UtZmlsZSBoZWxsby5jfjIgaGVsbG8uY34xIGhlbGxvLmN+MworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgd291bGQgbGVhdmUgdGhlIG1lcmdlIHJlc3VsdCBpbiBgaGVsbG8uY34yYCBmaWxlLCBhbG9uZword2l0aCBjb25mbGljdCBtYXJrZXJzIGlmIHRoZXJlIGFyZSBjb25mbGljdHMuICBBZnRlciB2ZXJpZnlpbmcKK3RoZSBtZXJnZSByZXN1bHQgbWFrZXMgc2Vuc2UsIHlvdSBjYW4gdGVsbCBnaXQgd2hhdCB0aGUgZmluYWwKK21lcmdlIHJlc3VsdCBmb3IgdGhpcyBmaWxlIGlzIGJ5OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIG12IC1mIGhlbGxvLmN+MiBoZWxsby5jCiskIGdpdC11cGRhdGUtaW5kZXggaGVsbG8uYworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGVuIGEgcGF0aCBpcyBpbiB1bm1lcmdlZCBzdGF0ZSwgcnVubmluZyBgZ2l0LXVwZGF0ZS1pbmRleGAgZm9yCit0aGF0IHBhdGggdGVsbHMgZ2l0IHRvIG1hcmsgdGhlIHBhdGggcmVzb2x2ZWQuCisKK1RoZSBhYm92ZSBpcyB0aGUgZGVzY3JpcHRpb24gb2YgYSBnaXQgbWVyZ2UgYXQgdGhlIGxvd2VzdCBsZXZlbCwKK3RvIGhlbHAgeW91IHVuZGVyc3RhbmQgd2hhdCBjb25jZXB0dWFsbHkgaGFwcGVucyB1bmRlciB0aGUgaG9vZC4KK0luIHByYWN0aWNlLCBub2JvZHksIG5vdCBldmVuIGdpdCBpdHNlbGYsIHVzZXMgdGhyZWUgYGdpdC1jYXQtZmlsZWAKK2ZvciB0aGlzLiAgVGhlcmUgaXMgYGdpdC1tZXJnZS1pbmRleGAgcHJvZ3JhbSB0aGF0IGV4dHJhY3RzIHRoZQorc3RhZ2VzIHRvIHRlbXBvcmFyeSBmaWxlcyBhbmQgY2FsbHMgYSAibWVyZ2UiIHNjcmlwdCBvbiBpdDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtbWVyZ2UtaW5kZXggZ2l0LW1lcmdlLW9uZS1maWxlIGhlbGxvLmMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIHRoYXQgaXMgd2hhdCBoaWdoZXIgbGV2ZWwgYGdpdCBtZXJnZSAtcyByZXNvbHZlYCBpcyBpbXBsZW1lbnRlZCB3aXRoLgorCitbW2hhY2tpbmctZ2l0XV0KK0hhY2tpbmcgZ2l0Cis9PT09PT09PT09PQorCitUaGlzIGNoYXB0ZXIgY292ZXJzIGludGVybmFsIGRldGFpbHMgb2YgdGhlIGdpdCBpbXBsZW1lbnRhdGlvbiB3aGljaAorcHJvYmFibHkgb25seSBnaXQgZGV2ZWxvcGVycyBuZWVkIHRvIHVuZGVyc3RhbmQuCisKK1tbb2JqZWN0LWRldGFpbHNdXQorT2JqZWN0IHN0b3JhZ2UgZm9ybWF0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQWxsIG9iamVjdHMgaGF2ZSBhIHN0YXRpY2FsbHkgZGV0ZXJtaW5lZCAidHlwZSIgd2hpY2ggaWRlbnRpZmllcyB0aGUKK2Zvcm1hdCBvZiB0aGUgb2JqZWN0IChpLmUuIGhvdyBpdCBpcyB1c2VkLCBhbmQgaG93IGl0IGNhbiByZWZlciB0byBvdGhlcgorb2JqZWN0cykuICBUaGVyZSBhcmUgY3VycmVudGx5IGZvdXIgZGlmZmVyZW50IG9iamVjdCB0eXBlczogImJsb2IiLAorInRyZWUiLCAiY29tbWl0IiwgYW5kICJ0YWciLgorCitSZWdhcmRsZXNzIG9mIG9iamVjdCB0eXBlLCBhbGwgb2JqZWN0cyBzaGFyZSB0aGUgZm9sbG93aW5nCitjaGFyYWN0ZXJpc3RpY3M6IHRoZXkgYXJlIGFsbCBkZWZsYXRlZCB3aXRoIHpsaWIsIGFuZCBoYXZlIGEgaGVhZGVyCit0aGF0IG5vdCBvbmx5IHNwZWNpZmllcyB0aGVpciB0eXBlLCBidXQgYWxzbyBwcm92aWRlcyBzaXplIGluZm9ybWF0aW9uCithYm91dCB0aGUgZGF0YSBpbiB0aGUgb2JqZWN0LiAgSXQncyB3b3J0aCBub3RpbmcgdGhhdCB0aGUgU0hBMSBoYXNoCit0aGF0IGlzIHVzZWQgdG8gbmFtZSB0aGUgb2JqZWN0IGlzIHRoZSBoYXNoIG9mIHRoZSBvcmlnaW5hbCBkYXRhCitwbHVzIHRoaXMgaGVhZGVyLCBzbyBgc2hhMXN1bWAgJ2ZpbGUnIGRvZXMgbm90IG1hdGNoIHRoZSBvYmplY3QgbmFtZQorZm9yICdmaWxlJy4KKyhIaXN0b3JpY2FsIG5vdGU6IGluIHRoZSBkYXduIG9mIHRoZSBhZ2Ugb2YgZ2l0IHRoZSBoYXNoCit3YXMgdGhlIHNoYTEgb2YgdGhlICdjb21wcmVzc2VkJyBvYmplY3QuKQorCitBcyBhIHJlc3VsdCwgdGhlIGdlbmVyYWwgY29uc2lzdGVuY3kgb2YgYW4gb2JqZWN0IGNhbiBhbHdheXMgYmUgdGVzdGVkCitpbmRlcGVuZGVudGx5IG9mIHRoZSBjb250ZW50cyBvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0OiBhbGwgb2JqZWN0cyBjYW4KK2JlIHZhbGlkYXRlZCBieSB2ZXJpZnlpbmcgdGhhdCAoYSkgdGhlaXIgaGFzaGVzIG1hdGNoIHRoZSBjb250ZW50IG9mIHRoZQorZmlsZSBhbmQgKGIpIHRoZSBvYmplY3Qgc3VjY2Vzc2Z1bGx5IGluZmxhdGVzIHRvIGEgc3RyZWFtIG9mIGJ5dGVzIHRoYXQKK2Zvcm1zIGEgc2VxdWVuY2Ugb2YgPGFzY2lpIHR5cGUgd2l0aG91dCBzcGFjZT4ge3BsdXN9IDxzcGFjZT4ge3BsdXN9IDxhc2NpaSBkZWNpbWFsCitzaXplPiB7cGx1c30gPGJ5dGVcMD4ge3BsdXN9IDxiaW5hcnkgb2JqZWN0IGRhdGE+LgorCitUaGUgc3RydWN0dXJlZCBvYmplY3RzIGNhbiBmdXJ0aGVyIGhhdmUgdGhlaXIgc3RydWN0dXJlIGFuZAorY29ubmVjdGl2aXR5IHRvIG90aGVyIG9iamVjdHMgdmVyaWZpZWQuIFRoaXMgaXMgZ2VuZXJhbGx5IGRvbmUgd2l0aAordGhlIGBnaXQtZnNja2AgcHJvZ3JhbSwgd2hpY2ggZ2VuZXJhdGVzIGEgZnVsbCBkZXBlbmRlbmN5IGdyYXBoCitvZiBhbGwgb2JqZWN0cywgYW5kIHZlcmlmaWVzIHRoZWlyIGludGVybmFsIGNvbnNpc3RlbmN5IChpbiBhZGRpdGlvbgordG8ganVzdCB2ZXJpZnlpbmcgdGhlaXIgc3VwZXJmaWNpYWwgY29uc2lzdGVuY3kgdGhyb3VnaCB0aGUgaGFzaCkuCisKK1tbYmlyZHZpZXctb24tdGhlLXNvdXJjZS1jb2RlXV0KK0EgYmlyZHMtZXllIHZpZXcgb2YgR2l0J3Mgc291cmNlIGNvZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSXQgaXMgbm90IGFsd2F5cyBlYXN5IGZvciBuZXcgZGV2ZWxvcGVycyB0byBmaW5kIHRoZWlyIHdheSB0aHJvdWdoIEdpdCdzCitzb3VyY2UgY29kZS4gIFRoaXMgc2VjdGlvbiBnaXZlcyB5b3UgYSBsaXR0bGUgZ3VpZGFuY2UgdG8gc2hvdyB3aGVyZSB0bworc3RhcnQuCisKK0EgZ29vZCBwbGFjZSB0byBzdGFydCBpcyB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgaW5pdGlhbCBjb21taXQsIHdpdGg6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IGU4M2M1MTYzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBpbml0aWFsIHJldmlzaW9uIGxheXMgdGhlIGZvdW5kYXRpb24gZm9yIGFsbW9zdCBldmVyeXRoaW5nIGdpdCBoYXMKK3RvZGF5LCBidXQgaXMgc21hbGwgZW5vdWdoIHRvIHJlYWQgaW4gb25lIHNpdHRpbmcuCisKK05vdGUgdGhhdCB0ZXJtaW5vbG9neSBoYXMgY2hhbmdlZCBzaW5jZSB0aGF0IHJldmlzaW9uLiAgRm9yIGV4YW1wbGUsIHRoZQorUkVBRE1FIGluIHRoYXQgcmV2aXNpb24gdXNlcyB0aGUgd29yZCAiY2hhbmdlc2V0IiB0byBkZXNjcmliZSB3aGF0IHdlCitub3cgY2FsbCBhIDw8ZGVmX2NvbW1pdF9vYmplY3QsY29tbWl0Pj4uCisKK0Fsc28sIHdlIGRvIG5vdCBjYWxsIGl0ICJjYWNoZSIgYW55IG1vcmUsIGJ1dCAiaW5kZXgiLCBob3dldmVyLCB0aGUKK2ZpbGUgaXMgc3RpbGwgY2FsbGVkIGBjYWNoZS5oYC4gIFJlbWFyazogTm90IG11Y2ggcmVhc29uIHRvIGNoYW5nZSBpdCBub3csCitlc3BlY2lhbGx5IHNpbmNlIHRoZXJlIGlzIG5vIGdvb2Qgc2luZ2xlIG5hbWUgZm9yIGl0IGFueXdheSwgYmVjYXVzZSBpdCBpcworYmFzaWNhbGx5IF90aGVfIGhlYWRlciBmaWxlIHdoaWNoIGlzIGluY2x1ZGVkIGJ5IF9hbGxfIG9mIEdpdCdzIEMgc291cmNlcy4KKworSWYgeW91IGdyYXNwIHRoZSBpZGVhcyBpbiB0aGF0IGluaXRpYWwgY29tbWl0LCB5b3Ugc2hvdWxkIGNoZWNrIG91dCBhCittb3JlIHJlY2VudCB2ZXJzaW9uIGFuZCBza2ltIGBjYWNoZS5oYCwgYG9iamVjdC5oYCBhbmQgYGNvbW1pdC5oYC4KKworSW4gdGhlIGVhcmx5IGRheXMsIEdpdCAoaW4gdGhlIHRyYWRpdGlvbiBvZiBVTklYKSB3YXMgYSBidW5jaCBvZiBwcm9ncmFtcword2hpY2ggd2VyZSBleHRyZW1lbHkgc2ltcGxlLCBhbmQgd2hpY2ggeW91IHVzZWQgaW4gc2NyaXB0cywgcGlwaW5nIHRoZQorb3V0cHV0IG9mIG9uZSBpbnRvIGFub3RoZXIuIFRoaXMgdHVybmVkIG91dCB0byBiZSBnb29kIGZvciBpbml0aWFsCitkZXZlbG9wbWVudCwgc2luY2UgaXQgd2FzIGVhc2llciB0byB0ZXN0IG5ldyB0aGluZ3MuICBIb3dldmVyLCByZWNlbnRseQorbWFueSBvZiB0aGVzZSBwYXJ0cyBoYXZlIGJlY29tZSBidWlsdGlucywgYW5kIHNvbWUgb2YgdGhlIGNvcmUgaGFzIGJlZW4KKyJsaWJpZmllZCIsIGkuZS4gcHV0IGludG8gbGliZ2l0LmEgZm9yIHBlcmZvcm1hbmNlLCBwb3J0YWJpbGl0eSByZWFzb25zLAorYW5kIHRvIGF2b2lkIGNvZGUgZHVwbGljYXRpb24uCisKK0J5IG5vdywgeW91IGtub3cgd2hhdCB0aGUgaW5kZXggaXMgKGFuZCBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEKK3N0cnVjdHVyZXMgaW4gYGNhY2hlLmhgKSwgYW5kIHRoYXQgdGhlcmUgYXJlIGp1c3QgYSBjb3VwbGUgb2Ygb2JqZWN0IHR5cGVzCisoYmxvYnMsIHRyZWVzLCBjb21taXRzIGFuZCB0YWdzKSB3aGljaCBpbmhlcml0IHRoZWlyIGNvbW1vbiBzdHJ1Y3R1cmUgZnJvbQorYHN0cnVjdCBvYmplY3RgLCB3aGljaCBpcyB0aGVpciBmaXJzdCBtZW1iZXIgKGFuZCB0aHVzLCB5b3UgY2FuIGNhc3QgZS5nLgorYChzdHJ1Y3Qgb2JqZWN0ICopY29tbWl0YCB0byBhY2hpZXZlIHRoZSBfc2FtZV8gYXMgYCZjb21taXQtPm9iamVjdGAsIGkuZS4KK2dldCBhdCB0aGUgb2JqZWN0IG5hbWUgYW5kIGZsYWdzKS4KKworTm93IGlzIGEgZ29vZCBwb2ludCB0byB0YWtlIGEgYnJlYWsgdG8gbGV0IHRoaXMgaW5mb3JtYXRpb24gc2luayBpbi4KKworTmV4dCBzdGVwOiBnZXQgZmFtaWxpYXIgd2l0aCB0aGUgb2JqZWN0IG5hbWluZy4gIFJlYWQgPDxuYW1pbmctY29tbWl0cz4+LgorVGhlcmUgYXJlIHF1aXRlIGEgZmV3IHdheXMgdG8gbmFtZSBhbiBvYmplY3QgKGFuZCBub3Qgb25seSByZXZpc2lvbnMhKS4KK0FsbCBvZiB0aGVzZSBhcmUgaGFuZGxlZCBpbiBgc2hhMV9uYW1lLmNgLiBKdXN0IGhhdmUgYSBxdWljayBsb29rIGF0Cit0aGUgZnVuY3Rpb24gYGdldF9zaGExKClgLiBBIGxvdCBvZiB0aGUgc3BlY2lhbCBoYW5kbGluZyBpcyBkb25lIGJ5CitmdW5jdGlvbnMgbGlrZSBgZ2V0X3NoYTFfYmFzaWMoKWAgb3IgdGhlIGxpa2VzLgorCitUaGlzIGlzIGp1c3QgdG8gZ2V0IHlvdSBpbnRvIHRoZSBncm9vdmUgZm9yIHRoZSBtb3N0IGxpYmlmaWVkIHBhcnQgb2YgR2l0OgordGhlIHJldmlzaW9uIHdhbGtlci4KKworQmFzaWNhbGx5LCB0aGUgaW5pdGlhbCB2ZXJzaW9uIG9mIGBnaXQgbG9nYCB3YXMgYSBzaGVsbCBzY3JpcHQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LXJldi1saXN0IC0tcHJldHR5ICQoZ2l0LXJldi1wYXJzZSAtLWRlZmF1bHQgSEVBRCAiJEAiKSB8IFwKKwlMRVNTPS1TICR7UEFHRVI6LWxlc3N9CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doYXQgZG9lcyB0aGlzIG1lYW4/CisKK2BnaXQtcmV2LWxpc3RgIGlzIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSByZXZpc2lvbiB3YWxrZXIsIHdoaWNoCitfYWx3YXlzXyBwcmludGVkIGEgbGlzdCBvZiByZXZpc2lvbnMgdG8gc3Rkb3V0LiAgSXQgaXMgc3RpbGwgZnVuY3Rpb25hbCwKK2FuZCBuZWVkcyB0bywgc2luY2UgbW9zdCBuZXcgR2l0IHByb2dyYW1zIHN0YXJ0IG91dCBhcyBzY3JpcHRzIHVzaW5nCitgZ2l0LXJldi1saXN0YC4KKworYGdpdC1yZXYtcGFyc2VgIGlzIG5vdCBhcyBpbXBvcnRhbnQgYW55IG1vcmU7IGl0IHdhcyBvbmx5IHVzZWQgdG8gZmlsdGVyIG91dAorb3B0aW9ucyB0aGF0IHdlcmUgcmVsZXZhbnQgZm9yIHRoZSBkaWZmZXJlbnQgcGx1bWJpbmcgY29tbWFuZHMgdGhhdCB3ZXJlCitjYWxsZWQgYnkgdGhlIHNjcmlwdC4KKworTW9zdCBvZiB3aGF0IGBnaXQtcmV2LWxpc3RgIGRpZCBpcyBjb250YWluZWQgaW4gYHJldmlzaW9uLmNgIGFuZAorYHJldmlzaW9uLmhgLiAgSXQgd3JhcHMgdGhlIG9wdGlvbnMgaW4gYSBzdHJ1Y3QgbmFtZWQgYHJldl9pbmZvYCwgd2hpY2gKK2NvbnRyb2xzIGhvdyBhbmQgd2hhdCByZXZpc2lvbnMgYXJlIHdhbGtlZCwgYW5kIG1vcmUuCisKK1RoZSBvcmlnaW5hbCBqb2Igb2YgYGdpdC1yZXYtcGFyc2VgIGlzIG5vdyB0YWtlbiBieSB0aGUgZnVuY3Rpb24KK2BzZXR1cF9yZXZpc2lvbnMoKWAsIHdoaWNoIHBhcnNlcyB0aGUgcmV2aXNpb25zIGFuZCB0aGUgY29tbW9uIGNvbW1hbmQgbGluZQorb3B0aW9ucyBmb3IgdGhlIHJldmlzaW9uIHdhbGtlci4gVGhpcyBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIHN0cnVjdAorYHJldl9pbmZvYCBmb3IgbGF0ZXIgY29uc3VtcHRpb24uIFlvdSBjYW4gZG8geW91ciBvd24gY29tbWFuZCBsaW5lIG9wdGlvbgorcGFyc2luZyBhZnRlciBjYWxsaW5nIGBzZXR1cF9yZXZpc2lvbnMoKWAuIEFmdGVyIHRoYXQsIHlvdSBoYXZlIHRvIGNhbGwKK2BwcmVwYXJlX3JldmlzaW9uX3dhbGsoKWAgZm9yIGluaXRpYWxpemF0aW9uLCBhbmQgdGhlbiB5b3UgY2FuIGdldCB0aGUKK2NvbW1pdHMgb25lIGJ5IG9uZSB3aXRoIHRoZSBmdW5jdGlvbiBgZ2V0X3JldmlzaW9uKClgLgorCitJZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gbW9yZSBkZXRhaWxzIG9mIHRoZSByZXZpc2lvbiB3YWxraW5nIHByb2Nlc3MsCitqdXN0IGhhdmUgYSBsb29rIGF0IHRoZSBmaXJzdCBpbXBsZW1lbnRhdGlvbiBvZiBgY21kX2xvZygpYDsgY2FsbAorYGdpdC1zaG93IHYxLjMuMHt0aWxkZX0xNTVeMnt0aWxkZX00YCBhbmQgc2Nyb2xsIGRvd24gdG8gdGhhdCBmdW5jdGlvbiAobm90ZSB0aGF0IHlvdQorbm8gbG9uZ2VyIG5lZWQgdG8gY2FsbCBgc2V0dXBfcGFnZXIoKWAgZGlyZWN0bHkpLgorCitOb3dhZGF5cywgYGdpdCBsb2dgIGlzIGEgYnVpbHRpbiwgd2hpY2ggbWVhbnMgdGhhdCBpdCBpcyBfY29udGFpbmVkXyBpbiB0aGUKK2NvbW1hbmQgYGdpdGAuICBUaGUgc291cmNlIHNpZGUgb2YgYSBidWlsdGluIGlzCisKKy0gYSBmdW5jdGlvbiBjYWxsZWQgYGNtZF88YmxhPmAsIHR5cGljYWxseSBkZWZpbmVkIGluIGBidWlsdGluLTxibGE+LmNgLAorICBhbmQgZGVjbGFyZWQgaW4gYGJ1aWx0aW4uaGAsCisKKy0gYW4gZW50cnkgaW4gdGhlIGBjb21tYW5kc1tdYCBhcnJheSBpbiBgZ2l0LmNgLCBhbmQKKworLSBhbiBlbnRyeSBpbiBgQlVJTFRJTl9PQkpFQ1RTYCBpbiB0aGUgYE1ha2VmaWxlYC4KKworU29tZXRpbWVzLCBtb3JlIHRoYW4gb25lIGJ1aWx0aW4gaXMgY29udGFpbmVkIGluIG9uZSBzb3VyY2UgZmlsZS4gIEZvcgorZXhhbXBsZSwgYGNtZF93aGF0Y2hhbmdlZCgpYCBhbmQgYGNtZF9sb2coKWAgYm90aCByZXNpZGUgaW4gYGJ1aWx0aW4tbG9nLmNgLAorc2luY2UgdGhleSBzaGFyZSBxdWl0ZSBhIGJpdCBvZiBjb2RlLiAgSW4gdGhhdCBjYXNlLCB0aGUgY29tbWFuZHMgd2hpY2ggYXJlCitfbm90XyBuYW1lZCBsaWtlIHRoZSBgLmNgIGZpbGUgaW4gd2hpY2ggdGhleSBsaXZlIGhhdmUgdG8gYmUgbGlzdGVkIGluCitgQlVJTFRfSU5TYCBpbiB0aGUgYE1ha2VmaWxlYC4KKworYGdpdCBsb2dgIGxvb2tzIG1vcmUgY29tcGxpY2F0ZWQgaW4gQyB0aGFuIGl0IGRvZXMgaW4gdGhlIG9yaWdpbmFsIHNjcmlwdCwKK2J1dCB0aGF0IGFsbG93cyBmb3IgYSBtdWNoIGdyZWF0ZXIgZmxleGliaWxpdHkgYW5kIHBlcmZvcm1hbmNlLgorCitIZXJlIGFnYWluIGl0IGlzIGEgZ29vZCBwb2ludCB0byB0YWtlIGEgcGF1c2UuCisKK0xlc3NvbiB0aHJlZSBpczogc3R1ZHkgdGhlIGNvZGUuICBSZWFsbHksIGl0IGlzIHRoZSBiZXN0IHdheSB0byBsZWFybiBhYm91dAordGhlIG9yZ2FuaXphdGlvbiBvZiBHaXQgKGFmdGVyIHlvdSBrbm93IHRoZSBiYXNpYyBjb25jZXB0cykuCisKK1NvLCB0aGluayBhYm91dCBzb21ldGhpbmcgd2hpY2ggeW91IGFyZSBpbnRlcmVzdGVkIGluLCBzYXksICJob3cgY2FuIEkKK2FjY2VzcyBhIGJsb2IganVzdCBrbm93aW5nIHRoZSBvYmplY3QgbmFtZSBvZiBpdD8iLiAgVGhlIGZpcnN0IHN0ZXAgaXMgdG8KK2ZpbmQgYSBHaXQgY29tbWFuZCB3aXRoIHdoaWNoIHlvdSBjYW4gZG8gaXQuICBJbiB0aGlzIGV4YW1wbGUsIGl0IGlzIGVpdGhlcgorYGdpdCBzaG93YCBvciBgZ2l0IGNhdC1maWxlYC4KKworRm9yIHRoZSBzYWtlIG9mIGNsYXJpdHksIGxldCdzIHN0YXkgd2l0aCBgZ2l0IGNhdC1maWxlYCwgYmVjYXVzZSBpdAorCistIGlzIHBsdW1iaW5nLCBhbmQKKworLSB3YXMgYXJvdW5kIGV2ZW4gaW4gdGhlIGluaXRpYWwgY29tbWl0IChpdCBsaXRlcmFsbHkgd2VudCBvbmx5IHRocm91Z2gKKyAgc29tZSAyMCByZXZpc2lvbnMgYXMgYGNhdC1maWxlLmNgLCB3YXMgcmVuYW1lZCB0byBgYnVpbHRpbi1jYXQtZmlsZS5jYAorICB3aGVuIG1hZGUgYSBidWlsdGluLCBhbmQgdGhlbiBzYXcgbGVzcyB0aGFuIDEwIHZlcnNpb25zKS4KKworU28sIGxvb2sgaW50byBgYnVpbHRpbi1jYXQtZmlsZS5jYCwgc2VhcmNoIGZvciBgY21kX2NhdF9maWxlKClgIGFuZCBsb29rIHdoYXQKK2l0IGRvZXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisgICAgICAgIGlmIChhcmdjICE9IDMpCisgICAgICAgICAgICAgICAgdXNhZ2UoImdpdC1jYXQtZmlsZSBbLXR8LXN8LWV8LXB8PHR5cGU+XSA8c2hhMT4iKTsKKyAgICAgICAgaWYgKGdldF9zaGExKGFyZ3ZbMl0sIHNoYTEpKQorICAgICAgICAgICAgICAgIGRpZSgiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWUgJXMiLCBhcmd2WzJdKTsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMZXQncyBza2lwIG92ZXIgdGhlIG9idmlvdXMgZGV0YWlsczsgdGhlIG9ubHkgcmVhbGx5IGludGVyZXN0aW5nIHBhcnQKK2hlcmUgaXMgdGhlIGNhbGwgdG8gYGdldF9zaGExKClgLiAgSXQgdHJpZXMgdG8gaW50ZXJwcmV0IGBhcmd2WzJdYCBhcyBhbgorb2JqZWN0IG5hbWUsIGFuZCBpZiBpdCByZWZlcnMgdG8gYW4gb2JqZWN0IHdoaWNoIGlzIHByZXNlbnQgaW4gdGhlIGN1cnJlbnQKK3JlcG9zaXRvcnksIGl0IHdyaXRlcyB0aGUgcmVzdWx0aW5nIFNIQS0xIGludG8gdGhlIHZhcmlhYmxlIGBzaGExYC4KKworVHdvIHRoaW5ncyBhcmUgaW50ZXJlc3RpbmcgaGVyZToKKworLSBgZ2V0X3NoYTEoKWAgcmV0dXJucyAwIG9uIF9zdWNjZXNzXy4gIFRoaXMgbWlnaHQgc3VycHJpc2Ugc29tZSBuZXcKKyAgR2l0IGhhY2tlcnMsIGJ1dCB0aGVyZSBpcyBhIGxvbmcgdHJhZGl0aW9uIGluIFVOSVggdG8gcmV0dXJuIGRpZmZlcmVudAorICBuZWdhdGl2ZSBudW1iZXJzIGluIGNhc2Ugb2YgZGlmZmVyZW50IGVycm9ycy0tYW5kIDAgb24gc3VjY2Vzcy4KKworLSB0aGUgdmFyaWFibGUgYHNoYTFgIGluIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgYGdldF9zaGExKClgIGlzIGB1bnNpZ25lZAorICBjaGFyIFwqYCwgYnV0IGlzIGFjdHVhbGx5IGV4cGVjdGVkIHRvIGJlIGEgcG9pbnRlciB0byBgdW5zaWduZWQKKyAgY2hhclsyMF1gLiAgVGhpcyB2YXJpYWJsZSB3aWxsIGNvbnRhaW4gdGhlIDE2MC1iaXQgU0hBLTEgb2YgdGhlIGdpdmVuCisgIGNvbW1pdC4gIE5vdGUgdGhhdCB3aGVuZXZlciBhIFNIQS0xIGlzIHBhc3NlZCBhcyBgdW5zaWduZWQgY2hhciBcKmAsIGl0CisgIGlzIHRoZSBiaW5hcnkgcmVwcmVzZW50YXRpb24sIGFzIG9wcG9zZWQgdG8gdGhlIEFTQ0lJIHJlcHJlc2VudGF0aW9uIGluCisgIGhleCBjaGFyYWN0ZXJzLCB3aGljaCBpcyBwYXNzZWQgYXMgYGNoYXIgKmAuCisKK1lvdSB3aWxsIHNlZSBib3RoIG9mIHRoZXNlIHRoaW5ncyB0aHJvdWdob3V0IHRoZSBjb2RlLgorCitOb3csIGZvciB0aGUgbWVhdDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGJ1ZiA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKHNoYTEsIGFyZ3ZbMV0sICZzaXplLCBOVUxMKTsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgaXMgaG93IHlvdSByZWFkIGEgYmxvYiAoYWN0dWFsbHksIG5vdCBvbmx5IGEgYmxvYiwgYnV0IGFueSB0eXBlIG9mCitvYmplY3QpLiAgVG8ga25vdyBob3cgdGhlIGZ1bmN0aW9uIGByZWFkX29iamVjdF93aXRoX3JlZmVyZW5jZSgpYCBhY3R1YWxseQord29ya3MsIGZpbmQgdGhlIHNvdXJjZSBjb2RlIGZvciBpdCAoc29tZXRoaW5nIGxpa2UgYGdpdCBncmVwCityZWFkX29iamVjdF93aXRoIHwgZ3JlcCAiOlthLXpdImAgaW4gdGhlIGdpdCByZXBvc2l0b3J5KSwgYW5kIHJlYWQKK3RoZSBzb3VyY2UuCisKK1RvIGZpbmQgb3V0IGhvdyB0aGUgcmVzdWx0IGNhbiBiZSB1c2VkLCBqdXN0IHJlYWQgb24gaW4gYGNtZF9jYXRfZmlsZSgpYDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgd3JpdGVfb3JfZGllKDEsIGJ1Ziwgc2l6ZSk7CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTb21ldGltZXMsIHlvdSBkbyBub3Qga25vdyB3aGVyZSB0byBsb29rIGZvciBhIGZlYXR1cmUuICBJbiBtYW55IHN1Y2ggY2FzZXMsCitpdCBoZWxwcyB0byBzZWFyY2ggdGhyb3VnaCB0aGUgb3V0cHV0IG9mIGBnaXQgbG9nYCwgYW5kIHRoZW4gYGdpdCBzaG93YCB0aGUKK2NvcnJlc3BvbmRpbmcgY29tbWl0LgorCitFeGFtcGxlOiBJZiB5b3Uga25vdyB0aGF0IHRoZXJlIHdhcyBzb21lIHRlc3QgY2FzZSBmb3IgYGdpdCBidW5kbGVgLCBidXQKK2RvIG5vdCByZW1lbWJlciB3aGVyZSBpdCB3YXMgKHllcywgeW91IF9jb3VsZF8gYGdpdCBncmVwIGJ1bmRsZSB0L2AsIGJ1dCB0aGF0Citkb2VzIG5vdCBpbGx1c3RyYXRlIHRoZSBwb2ludCEpOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZyAtLW5vLW1lcmdlcyB0LworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0luIHRoZSBwYWdlciAoYGxlc3NgKSwganVzdCBzZWFyY2ggZm9yICJidW5kbGUiLCBnbyBhIGZldyBsaW5lcyBiYWNrLAorYW5kIHNlZSB0aGF0IGl0IGlzIGluIGNvbW1pdCAxODQ0OWFiMC4uLiAgTm93IGp1c3QgY29weSB0aGlzIG9iamVjdCBuYW1lLAorYW5kIHBhc3RlIGl0IGludG8gdGhlIGNvbW1hbmQgbGluZQorCistLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93IDE4NDQ5YWIwCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1ZvaWxhLgorCitBbm90aGVyIGV4YW1wbGU6IEZpbmQgb3V0IHdoYXQgdG8gZG8gaW4gb3JkZXIgdG8gbWFrZSBzb21lIHNjcmlwdCBhCitidWlsdGluOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBsb2cgLS1uby1tZXJnZXMgLS1kaWZmLWZpbHRlcj1BIGJ1aWx0aW4tKi5jCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1lvdSBzZWUsIEdpdCBpcyBhY3R1YWxseSB0aGUgYmVzdCB0b29sIHRvIGZpbmQgb3V0IGFib3V0IHRoZSBzb3VyY2Ugb2YgR2l0CitpdHNlbGYhCisKK1tbZ2xvc3NhcnldXQoraW5jbHVkZTo6Z2xvc3NhcnkudHh0W10KKworW1tnaXQtcXVpY2stc3RhcnRdXQorQXBwZW5kaXggQTogR2l0IFF1aWNrIFJlZmVyZW5jZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGlzIGEgcXVpY2sgc3VtbWFyeSBvZiB0aGUgbWFqb3IgY29tbWFuZHM7IHRoZSBwcmV2aW91cyBjaGFwdGVycworZXhwbGFpbiBob3cgdGhlc2Ugd29yayBpbiBtb3JlIGRldGFpbC4KKworW1txdWljay1jcmVhdGluZy1hLW5ldy1yZXBvc2l0b3J5XV0KK0NyZWF0aW5nIGEgbmV3IHJlcG9zaXRvcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRnJvbSBhIHRhcmJhbGw6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIHRhciB4emYgcHJvamVjdC50YXIuZ3oKKyQgY2QgcHJvamVjdAorJCBnaXQgaW5pdAorSW5pdGlhbGl6ZWQgZW1wdHkgR2l0IHJlcG9zaXRvcnkgaW4gLmdpdC8KKyQgZ2l0IGFkZCAuCiskIGdpdCBjb21taXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Zyb20gYSByZW1vdGUgcmVwb3NpdG9yeToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNsb25lIGdpdDovL2V4YW1wbGUuY29tL3B1Yi9wcm9qZWN0LmdpdAorJCBjZCBwcm9qZWN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitbW21hbmFnaW5nLWJyYW5jaGVzXV0KK01hbmFnaW5nIGJyYW5jaGVzCistLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYnJhbmNoCSAgICAgIyBsaXN0IGFsbCBsb2NhbCBicmFuY2hlcyBpbiB0aGlzIHJlcG8KKyQgZ2l0IGNoZWNrb3V0IHRlc3QgICMgc3dpdGNoIHdvcmtpbmcgZGlyZWN0b3J5IHRvIGJyYW5jaCAidGVzdCIKKyQgZ2l0IGJyYW5jaCBuZXcgICAgICMgY3JlYXRlIGJyYW5jaCAibmV3IiBzdGFydGluZyBhdCBjdXJyZW50IEhFQUQKKyQgZ2l0IGJyYW5jaCAtZCBuZXcgICMgZGVsZXRlIGJyYW5jaCAibmV3IgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW5zdGVhZCBvZiBiYXNpbmcgYSBuZXcgYnJhbmNoIG9uIGN1cnJlbnQgSEVBRCAodGhlIGRlZmF1bHQpLCB1c2U6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBicmFuY2ggbmV3IHRlc3QgICAgIyBicmFuY2ggbmFtZWQgInRlc3QiCiskIGdpdCBicmFuY2ggbmV3IHYyLjYuMTUgIyB0YWcgbmFtZWQgdjIuNi4xNQorJCBnaXQgYnJhbmNoIG5ldyBIRUFEXiAgICMgY29tbWl0IGJlZm9yZSB0aGUgbW9zdCByZWNlbnQKKyQgZ2l0IGJyYW5jaCBuZXcgSEVBRF5eICAjIGNvbW1pdCBiZWZvcmUgdGhhdAorJCBnaXQgYnJhbmNoIG5ldyB0ZXN0fjEwICMgdGVuIGNvbW1pdHMgYmVmb3JlIHRpcCBvZiBicmFuY2ggInRlc3QiCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDcmVhdGUgYW5kIHN3aXRjaCB0byBhIG5ldyBicmFuY2ggYXQgdGhlIHNhbWUgdGltZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC1iIG5ldyB2Mi42LjE1CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitVcGRhdGUgYW5kIGV4YW1pbmUgYnJhbmNoZXMgZnJvbSB0aGUgcmVwb3NpdG9yeSB5b3UgY2xvbmVkIGZyb206CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBmZXRjaAkJIyB1cGRhdGUKKyQgZ2l0IGJyYW5jaCAtcgkJIyBsaXN0CisgIG9yaWdpbi9tYXN0ZXIKKyAgb3JpZ2luL25leHQKKyAgLi4uCiskIGdpdCBjaGVja291dCAtYiBtYXN0ZXJ3b3JrIG9yaWdpbi9tYXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZldGNoIGEgYnJhbmNoIGZyb20gYSBkaWZmZXJlbnQgcmVwb3NpdG9yeSwgYW5kIGdpdmUgaXQgYSBuZXcKK25hbWUgaW4geW91ciByZXBvc2l0b3J5OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZmV0Y2ggZ2l0Oi8vZXhhbXBsZS5jb20vcHJvamVjdC5naXQgdGhlaXJicmFuY2g6bXlicmFuY2gKKyQgZ2l0IGZldGNoIGdpdDovL2V4YW1wbGUuY29tL3Byb2plY3QuZ2l0IHYyLjYuMTU6bXlicmFuY2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0tlZXAgYSBsaXN0IG9mIHJlcG9zaXRvcmllcyB5b3Ugd29yayB3aXRoIHJlZ3VsYXJseToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHJlbW90ZSBhZGQgZXhhbXBsZSBnaXQ6Ly9leGFtcGxlLmNvbS9wcm9qZWN0LmdpdAorJCBnaXQgcmVtb3RlCQkJIyBsaXN0IHJlbW90ZSByZXBvc2l0b3JpZXMKK2V4YW1wbGUKK29yaWdpbgorJCBnaXQgcmVtb3RlIHNob3cgZXhhbXBsZQkjIGdldCBkZXRhaWxzCisqIHJlbW90ZSBleGFtcGxlCisgIFVSTDogZ2l0Oi8vZXhhbXBsZS5jb20vcHJvamVjdC5naXQKKyAgVHJhY2tlZCByZW1vdGUgYnJhbmNoZXMKKyAgICBtYXN0ZXIgbmV4dCAuLi4KKyQgZ2l0IGZldGNoIGV4YW1wbGUJCSMgdXBkYXRlIGJyYW5jaGVzIGZyb20gZXhhbXBsZQorJCBnaXQgYnJhbmNoIC1yCQkJIyBsaXN0IGFsbCByZW1vdGUgYnJhbmNoZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworW1tleHBsb3JpbmctaGlzdG9yeV1dCitFeHBsb3JpbmcgaGlzdG9yeQorLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0awkJCSAgICAjIHZpc3VhbGl6ZSBhbmQgYnJvd3NlIGhpc3RvcnkKKyQgZ2l0IGxvZwkJICAgICMgbGlzdCBhbGwgY29tbWl0cworJCBnaXQgbG9nIHNyYy8JCSAgICAjIC4uLm1vZGlmeWluZyBzcmMvCiskIGdpdCBsb2cgdjIuNi4xNS4udjIuNi4xNiAgIyAuLi5pbiB2Mi42LjE2LCBub3QgaW4gdjIuNi4xNQorJCBnaXQgbG9nIG1hc3Rlci4udGVzdAkgICAgIyAuLi5pbiBicmFuY2ggdGVzdCwgbm90IGluIGJyYW5jaCBtYXN0ZXIKKyQgZ2l0IGxvZyB0ZXN0Li5tYXN0ZXIJICAgICMgLi4uaW4gYnJhbmNoIG1hc3RlciwgYnV0IG5vdCBpbiB0ZXN0CiskIGdpdCBsb2cgdGVzdC4uLm1hc3RlcgkgICAgIyAuLi5pbiBvbmUgYnJhbmNoLCBub3QgaW4gYm90aAorJCBnaXQgbG9nIC1TJ2ZvbygpJwkgICAgIyAuLi53aGVyZSBkaWZmZXJlbmNlIGNvbnRhaW4gImZvbygpIgorJCBnaXQgbG9nIC0tc2luY2U9IjIgd2Vla3MgYWdvIgorJCBnaXQgbG9nIC1wCQkgICAgIyBzaG93IHBhdGNoZXMgYXMgd2VsbAorJCBnaXQgc2hvdwkJICAgICMgbW9zdCByZWNlbnQgY29tbWl0CiskIGdpdCBkaWZmIHYyLjYuMTUuLnYyLjYuMTYgIyBkaWZmIGJldHdlZW4gdHdvIHRhZ2dlZCB2ZXJzaW9ucworJCBnaXQgZGlmZiB2Mi42LjE1Li5IRUFEICAgICMgZGlmZiB3aXRoIGN1cnJlbnQgaGVhZAorJCBnaXQgZ3JlcCAiZm9vKCkiCSAgICAjIHNlYXJjaCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgImZvbygpIgorJCBnaXQgZ3JlcCB2Mi42LjE1ICJmb28oKSIgICMgc2VhcmNoIG9sZCB0cmVlIGZvciAiZm9vKCkiCiskIGdpdCBzaG93IHYyLjYuMTU6YS50eHQgICAgIyBsb29rIGF0IG9sZCB2ZXJzaW9uIG9mIGEudHh0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTZWFyY2ggZm9yIHJlZ3Jlc3Npb25zOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYmlzZWN0IHN0YXJ0CiskIGdpdCBiaXNlY3QgYmFkCQkjIGN1cnJlbnQgdmVyc2lvbiBpcyBiYWQKKyQgZ2l0IGJpc2VjdCBnb29kIHYyLjYuMTMtcmMyCSMgbGFzdCBrbm93biBnb29kIHJldmlzaW9uCitCaXNlY3Rpbmc6IDY3NSByZXZpc2lvbnMgbGVmdCB0byB0ZXN0IGFmdGVyIHRoaXMKKwkJCQkjIHRlc3QgaGVyZSwgdGhlbjoKKyQgZ2l0IGJpc2VjdCBnb29kCQkjIGlmIHRoaXMgcmV2aXNpb24gaXMgZ29vZCwgb3IKKyQgZ2l0IGJpc2VjdCBiYWQJCSMgaWYgdGhpcyByZXZpc2lvbiBpcyBiYWQuCisJCQkJIyByZXBlYXQgdW50aWwgZG9uZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1tbbWFraW5nLWNoYW5nZXNdXQorTWFraW5nIGNoYW5nZXMKKy0tLS0tLS0tLS0tLS0tCisKK01ha2Ugc3VyZSBnaXQga25vd3Mgd2hvIHRvIGJsYW1lOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgY2F0ID4+fi8uZ2l0Y29uZmlnIDw8XEVPRgorW3VzZXJdCisJbmFtZSA9IFlvdXIgTmFtZSBDb21lcyBIZXJlCisJZW1haWwgPSB5b3VAeW91cmRvbWFpbi5leGFtcGxlLmNvbQorRU9GCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2VsZWN0IGZpbGUgY29udGVudHMgdG8gaW5jbHVkZSBpbiB0aGUgbmV4dCBjb21taXQsIHRoZW4gbWFrZSB0aGUKK2NvbW1pdDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGFkZCBhLnR4dCAgICAjIHVwZGF0ZWQgZmlsZQorJCBnaXQgYWRkIGIudHh0ICAgICMgbmV3IGZpbGUKKyQgZ2l0IHJtIGMudHh0ICAgICAjIG9sZCBmaWxlCiskIGdpdCBjb21taXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK09yLCBwcmVwYXJlIGFuZCBjcmVhdGUgdGhlIGNvbW1pdCBpbiBvbmUgc3RlcDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbW1pdCBkLnR4dCAjIHVzZSBsYXRlc3QgY29udGVudCBvbmx5IG9mIGQudHh0CiskIGdpdCBjb21taXQgLWEJICAgIyB1c2UgbGF0ZXN0IGNvbnRlbnQgb2YgYWxsIHRyYWNrZWQgZmlsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1tbbWVyZ2luZ11dCitNZXJnaW5nCistLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBtZXJnZSB0ZXN0ICAgIyBtZXJnZSBicmFuY2ggInRlc3QiIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoCiskIGdpdCBwdWxsIGdpdDovL2V4YW1wbGUuY29tL3Byb2plY3QuZ2l0IG1hc3RlcgorCQkgICAjIGZldGNoIGFuZCBtZXJnZSBpbiByZW1vdGUgYnJhbmNoCiskIGdpdCBwdWxsIC4gdGVzdCAgIyBlcXVpdmFsZW50IHRvIGdpdCBtZXJnZSB0ZXN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitbW3NoYXJpbmcteW91ci1jaGFuZ2VzXV0KK1NoYXJpbmcgeW91ciBjaGFuZ2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbXBvcnRpbmcgb3IgZXhwb3J0aW5nIHBhdGNoZXM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBmb3JtYXQtcGF0Y2ggb3JpZ2luLi5IRUFEICMgZm9ybWF0IGEgcGF0Y2ggZm9yIGVhY2ggY29tbWl0CisJCQkJIyBpbiBIRUFEIGJ1dCBub3QgaW4gb3JpZ2luCiskIGdpdCBhbSBtYm94ICMgaW1wb3J0IHBhdGNoZXMgZnJvbSB0aGUgbWFpbGJveCAibWJveCIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZldGNoIGEgYnJhbmNoIGluIGEgZGlmZmVyZW50IGdpdCByZXBvc2l0b3J5LCB0aGVuIG1lcmdlIGludG8gdGhlCitjdXJyZW50IGJyYW5jaDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHB1bGwgZ2l0Oi8vZXhhbXBsZS5jb20vcHJvamVjdC5naXQgdGhlaXJicmFuY2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1N0b3JlIHRoZSBmZXRjaGVkIGJyYW5jaCBpbnRvIGEgbG9jYWwgYnJhbmNoIGJlZm9yZSBtZXJnaW5nIGludG8gdGhlCitjdXJyZW50IGJyYW5jaDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHB1bGwgZ2l0Oi8vZXhhbXBsZS5jb20vcHJvamVjdC5naXQgdGhlaXJicmFuY2g6bXlicmFuY2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FmdGVyIGNyZWF0aW5nIGNvbW1pdHMgb24gYSBsb2NhbCBicmFuY2gsIHVwZGF0ZSB0aGUgcmVtb3RlCiticmFuY2ggd2l0aCB5b3VyIGNvbW1pdHM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBwdXNoIHNzaDovL2V4YW1wbGUuY29tL3Byb2plY3QuZ2l0IG15YnJhbmNoOnRoZWlyYnJhbmNoCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGVuIHJlbW90ZSBhbmQgbG9jYWwgYnJhbmNoIGFyZSBib3RoIG5hbWVkICJ0ZXN0IjoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHB1c2ggc3NoOi8vZXhhbXBsZS5jb20vcHJvamVjdC5naXQgdGVzdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2hvcnRjdXQgdmVyc2lvbiBmb3IgYSBmcmVxdWVudGx5IHVzZWQgcmVtb3RlIHJlcG9zaXRvcnk6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCByZW1vdGUgYWRkIGV4YW1wbGUgc3NoOi8vZXhhbXBsZS5jb20vcHJvamVjdC5naXQKKyQgZ2l0IHB1c2ggZXhhbXBsZSB0ZXN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitbW3JlcG9zaXRvcnktbWFpbnRlbmFuY2VdXQorUmVwb3NpdG9yeSBtYWludGVuYW5jZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDaGVjayBmb3IgY29ycnVwdGlvbjoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGZzY2sKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlY29tcHJlc3MsIHJlbW92ZSB1bnVzZWQgY3J1ZnQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBnYworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitbW3RvZG9dXQorQXBwZW5kaXggQjogTm90ZXMgYW5kIHRvZG8gbGlzdCBmb3IgdGhpcyBtYW51YWwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgaXMgYSB3b3JrIGluIHByb2dyZXNzLgorCitUaGUgYmFzaWMgcmVxdWlyZW1lbnRzOgorCistIEl0IG11c3QgYmUgcmVhZGFibGUgaW4gb3JkZXIsIGZyb20gYmVnaW5uaW5nIHRvIGVuZCwgYnkgc29tZW9uZQorICBpbnRlbGxpZ2VudCB3aXRoIGEgYmFzaWMgZ3Jhc3Agb2YgdGhlIFVOSVggY29tbWFuZCBsaW5lLCBidXQgd2l0aG91dAorICBhbnkgc3BlY2lhbCBrbm93bGVkZ2Ugb2YgZ2l0LiAgSWYgbmVjZXNzYXJ5LCBhbnkgb3RoZXIgcHJlcmVxdWlzaXRlcworICBzaG91bGQgYmUgc3BlY2lmaWNhbGx5IG1lbnRpb25lZCBhcyB0aGV5IGFyaXNlLgorLSBXaGVuZXZlciBwb3NzaWJsZSwgc2VjdGlvbiBoZWFkaW5ncyBzaG91bGQgY2xlYXJseSBkZXNjcmliZSB0aGUgdGFzaworICB0aGV5IGV4cGxhaW4gaG93IHRvIGRvLCBpbiBsYW5ndWFnZSB0aGF0IHJlcXVpcmVzIG5vIG1vcmUga25vd2xlZGdlCisgIHRoYW4gbmVjZXNzYXJ5OiBmb3IgZXhhbXBsZSwgImltcG9ydGluZyBwYXRjaGVzIGludG8gYSBwcm9qZWN0IiByYXRoZXIKKyAgdGhhbiAidGhlIGdpdC1hbSBjb21tYW5kIgorCitUaGluayBhYm91dCBob3cgdG8gY3JlYXRlIGEgY2xlYXIgY2hhcHRlciBkZXBlbmRlbmN5IGdyYXBoIHRoYXQgd2lsbAorYWxsb3cgcGVvcGxlIHRvIGdldCB0byBpbXBvcnRhbnQgdG9waWNzIHdpdGhvdXQgbmVjZXNzYXJpbHkgcmVhZGluZworZXZlcnl0aGluZyBpbiBiZXR3ZWVuLgorCitTY2FuIERvY3VtZW50YXRpb24vIGZvciBvdGhlciBzdHVmZiBsZWZ0IG91dDsgaW4gcGFydGljdWxhcjoKKworLSBob3d0bydzCistIHNvbWUgb2YgdGVjaG5pY2FsLz8KKy0gaG9va3MKKy0gbGlzdCBvZiBjb21tYW5kcyBpbiBsaW5rZ2l0OmdpdFsxXQorCitTY2FuIGVtYWlsIGFyY2hpdmVzIGZvciBvdGhlciBzdHVmZiBsZWZ0IG91dAorCitTY2FuIG1hbiBwYWdlcyB0byBzZWUgaWYgYW55IGFzc3VtZSBtb3JlIGJhY2tncm91bmQgdGhhbiB0aGlzIG1hbnVhbAorcHJvdmlkZXMuCisKK1NpbXBsaWZ5IGJlZ2lubmluZyBieSBzdWdnZXN0aW5nIGRpc2Nvbm5lY3RlZCBoZWFkIGluc3RlYWQgb2YKK3RlbXBvcmFyeSBicmFuY2ggY3JlYXRpb24/CisKK0FkZCBtb3JlIGdvb2QgZXhhbXBsZXMuICBFbnRpcmUgc2VjdGlvbnMgb2YganVzdCBjb29rYm9vayBleGFtcGxlcworbWlnaHQgYmUgYSBnb29kIGlkZWE7IG1heWJlIG1ha2UgYW4gImFkdmFuY2VkIGV4YW1wbGVzIiBzZWN0aW9uIGEKK3N0YW5kYXJkIGVuZC1vZi1jaGFwdGVyIHNlY3Rpb24/CisKK0luY2x1ZGUgY3Jvc3MtcmVmZXJlbmNlcyB0byB0aGUgZ2xvc3NhcnksIHdoZXJlIGFwcHJvcHJpYXRlLgorCitEb2N1bWVudCBzaGFsbG93IGNsb25lcz8gIFNlZSBkcmFmdCAxLjUuMCByZWxlYXNlIG5vdGVzIGZvciBzb21lCitkb2N1bWVudGF0aW9uLgorCitBZGQgYSBzZWN0aW9uIG9uIHdvcmtpbmcgd2l0aCBvdGhlciB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtcywgaW5jbHVkaW5nCitDVlMsIFN1YnZlcnNpb24sIGFuZCBqdXN0IGltcG9ydHMgb2Ygc2VyaWVzIG9mIHJlbGVhc2UgdGFyYmFsbHMuCisKK01vcmUgZGV0YWlscyBvbiBnaXR3ZWI/CisKK1dyaXRlIGEgY2hhcHRlciBvbiB1c2luZyBwbHVtYmluZyBhbmQgd3JpdGluZyBzY3JpcHRzLgorCitBbHRlcm5hdGVzLCBjbG9uZSAtcmVmZXJlbmNlLCBldGMuCisKK01vcmUgb24gcmVjb3ZlcnkgZnJvbSByZXBvc2l0b3J5IGNvcnJ1cHRpb24uICBTZWU6CisJaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1naXQmbT0xMTcyNjM4NjQ4MjA3OTkmdz0yCisJaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1naXQmbT0xMTcxNDc4NTU1MDM3OTgmdz0yCisJaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1naXQmbT0xMTcxNDc4NTU1MDM3OTgmdz0yCmRpZmYgLS1naXQgYS9HSVQtVkVSU0lPTi1HRU4gYi9HSVQtVkVSU0lPTi1HRU4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTY1Y2I0MQotLS0gL2Rldi9udWxsCisrKyBiL0dJVC1WRVJTSU9OLUdFTgpAQCAtMCwwICsxLDQxIEBACisjIS9iaW4vc2gKKworR1ZGPUdJVC1WRVJTSU9OLUZJTEUKK0RFRl9WRVI9djEuNS41LXJjMy5HSVQKKworTEY9JworJworCisjIEZpcnN0IHNlZSBpZiB0aGVyZSBpcyBhIHZlcnNpb24gZmlsZSAoaW5jbHVkZWQgaW4gcmVsZWFzZSB0YXJiYWxscyksCisjIHRoZW4gdHJ5IGdpdC1kZXNjcmliZSwgdGhlbiBkZWZhdWx0LgoraWYgdGVzdCAtZiB2ZXJzaW9uCit0aGVuCisJVk49JChjYXQgdmVyc2lvbikgfHwgVk49IiRERUZfVkVSIgorZWxpZiB0ZXN0IC1kIC5naXQgJiYKKwlWTj0kKGdpdCBkZXNjcmliZSAtLWFiYnJldj00IEhFQUQgMj4vZGV2L251bGwpICYmCisJY2FzZSAiJFZOIiBpbgorCSokTEYqKSAoZXhpdCAxKSA7OworCXZbMC05XSopCisJCXRlc3QgLXogIiQoZ2l0IGRpZmYtaW5kZXggLS1uYW1lLW9ubHkgSEVBRCkiIHx8CisJCVZOPSIkVk4tZGlydHkiIDs7CisJZXNhYwordGhlbgorCVZOPSQoZWNobyAiJFZOIiB8IHNlZCAtZSAncy8tLy4vZycpOworZWxzZQorCVZOPSIkREVGX1ZFUiIKK2ZpCisKK1ZOPSQoZXhwciAiJFZOIiA6IHYqJ1woLipcKScpCisKK2lmIHRlc3QgLXIgJEdWRgordGhlbgorCVZDPSQoc2VkIC1lICdzL15HSVRfVkVSU0lPTiA9IC8vJyA8JEdWRikKK2Vsc2UKKwlWQz11bnNldAorZmkKK3Rlc3QgIiRWTiIgPSAiJFZDIiB8fCB7CisJZWNobyA+JjIgIkdJVF9WRVJTSU9OID0gJFZOIgorCWVjaG8gIkdJVF9WRVJTSU9OID0gJFZOIiA+JEdWRgorfQorCisKZGlmZiAtLWdpdCBhL0lOU1RBTEwgYi9JTlNUQUxMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmM2JjYjQKLS0tIC9kZXYvbnVsbAorKysgYi9JTlNUQUxMCkBAIC0wLDAgKzEsMTI5IEBACisKKwkJR2l0IGluc3RhbGxhdGlvbgorCitOb3JtYWxseSB5b3UgY2FuIGp1c3QgZG8gIm1ha2UiIGZvbGxvd2VkIGJ5ICJtYWtlIGluc3RhbGwiLCBhbmQgdGhhdAord2lsbCBpbnN0YWxsIHRoZSBnaXQgcHJvZ3JhbXMgaW4geW91ciBvd24gfi9iaW4vIGRpcmVjdG9yeS4gIElmIHlvdSB3YW50Cit0byBkbyBhIGdsb2JhbCBpbnN0YWxsLCB5b3UgY2FuIGRvCisKKwkkIG1ha2UgcHJlZml4PS91c3IgYWxsIGRvYyBpbmZvIDsjIGFzIHlvdXJzZWxmCisJIyBtYWtlIHByZWZpeD0vdXNyIGluc3RhbGwgaW5zdGFsbC1kb2MgaW5zdGFsbC1pbmZvIDsjIGFzIHJvb3QKKworKG9yIHByZWZpeD0vdXNyL2xvY2FsLCBvZiBjb3Vyc2UpLiAgSnVzdCBsaWtlIGFueSBwcm9ncmFtIHN1aXRlCit0aGF0IHVzZXMgJHByZWZpeCwgdGhlIGJ1aWx0IHJlc3VsdHMgaGF2ZSBzb21lIHBhdGhzIGVuY29kZWQsCit3aGljaCBhcmUgZGVyaXZlZCBmcm9tICRwcmVmaXgsIHNvICJtYWtlIGFsbDsgbWFrZSBwcmVmaXg9L3VzcgoraW5zdGFsbCIgd291bGQgbm90IHdvcmsuCisKK0FsdGVybmF0aXZlbHkgeW91IGNhbiB1c2UgYXV0b2NvbmYgZ2VuZXJhdGVkIC4vY29uZmlndXJlIHNjcmlwdCB0bworc2V0IHVwIGluc3RhbGwgcGF0aHMgKHZpYSBjb25maWcubWFrLmF1dG9nZW4pLCBzbyB5b3UgY2FuIHdyaXRlIGluc3RlYWQKKworCSQgbWFrZSBjb25maWd1cmUgOyMgYXMgeW91cnNlbGYKKwkkIC4vY29uZmlndXJlIC0tcHJlZml4PS91c3IgOyMgYXMgeW91cnNlbGYKKwkkIG1ha2UgYWxsIGRvYyA7IyBhcyB5b3Vyc2VsZgorCSMgbWFrZSBpbnN0YWxsIGluc3RhbGwtZG9jIDsjIGFzIHJvb3QKKworCitJc3N1ZXMgb2Ygbm90ZToKKworIC0gZ2l0IG5vcm1hbGx5IGluc3RhbGxzIGEgaGVscGVyIHNjcmlwdCB3cmFwcGVyIGNhbGxlZCAiZ2l0Iiwgd2hpY2gKKyAgIGNvbmZsaWN0cyB3aXRoIGEgc2ltaWxhcmx5IG5hbWVkICJHTlUgaW50ZXJhY3RpdmUgdG9vbHMiIHByb2dyYW0uCisKKyAgIFRvdWdoLiAgRWl0aGVyIGRvbid0IHVzZSB0aGUgd3JhcHBlciBzY3JpcHQsIG9yIGRlbGV0ZSB0aGUgb2xkIEdOVQorICAgaW50ZXJhY3RpdmUgdG9vbHMuICBOb25lIG9mIHRoZSBjb3JlIGdpdCBzdHVmZiBuZWVkcyB0aGUgd3JhcHBlciwKKyAgIGl0J3MganVzdCBhIGNvbnZlbmllbnQgc2hvcnRoYW5kIGFuZCB3aGlsZSBpdCBpcyBkb2N1bWVudGVkIGluIHNvbWUKKyAgIHBsYWNlcywgeW91IGNhbiBhbHdheXMgcmVwbGFjZSAiZ2l0IGNvbW1pdCIgd2l0aCAiZ2l0LWNvbW1pdCIKKyAgIGluc3RlYWQuCisKKyAgIEJ1dCBsZXQncyBmYWNlIGl0LCBtb3N0IG9mIHVzIGRvbid0IGhhdmUgR05VIGludGVyYWN0aXZlIHRvb2xzLCBhbmQKKyAgIGV2ZW4gaWYgd2UgaGFkIGl0LCB3ZSB3b3VsZG4ndCBrbm93IHdoYXQgaXQgZG9lcy4gIEkgZG9uJ3QgdGhpbmsgaXQKKyAgIGhhcyBiZWVuIGFjdGl2ZWx5IGRldmVsb3BlZCBzaW5jZSAxOTk3LCBhbmQgcGVvcGxlIGhhdmUgbW92ZWQgb3ZlciB0bworICAgZ3JhcGhpY2FsIGZpbGUgbWFuYWdlcnMuCisKKyAtIFlvdSBjYW4gdXNlIGdpdCBhZnRlciBidWlsZGluZyBidXQgd2l0aG91dCBpbnN0YWxsaW5nIGlmIHlvdQorICAgd2FudGVkIHRvLiAgVmFyaW91cyBnaXQgY29tbWFuZHMgbmVlZCB0byBmaW5kIG90aGVyIGdpdAorICAgY29tbWFuZHMgYW5kIHNjcmlwdHMgdG8gZG8gdGhlaXIgd29yaywgc28geW91IHdvdWxkIG5lZWQgdG8KKyAgIGFycmFuZ2UgYSBmZXcgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHRlbGwgdGhlbSB0aGF0IHRoZWlyCisgICBmcmllbmRzIHdpbGwgYmUgZm91bmQgaW4geW91ciBidWlsdCBzb3VyY2UgYXJlYSBpbnN0ZWFkIG9mIGF0CisgICB0aGVpciBzdGFuZGFyZCBpbnN0YWxsYXRpb24gYXJlYS4gIFNvbWV0aGluZyBsaWtlIHRoaXMgd29ya3MKKyAgIGZvciBtZToKKworCUdJVF9FWEVDX1BBVEg9YHB3ZGAKKwlQQVRIPWBwd2RgOiRQQVRICisJR0lUUEVSTExJQj1gcHdkYC9wZXJsL2JsaWIvbGliCisJZXhwb3J0IEdJVF9FWEVDX1BBVEggUEFUSCBHSVRQRVJMTElCCisKKyAtIEdpdCBpcyByZWFzb25hYmx5IHNlbGYtc3VmZmljaWVudCwgYnV0IGRvZXMgZGVwZW5kIG9uIGEgZmV3IGV4dGVybmFsCisgICBwcm9ncmFtcyBhbmQgbGlicmFyaWVzOgorCisJLSAiemxpYiIsIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5LiBHaXQgd29uJ3QgYnVpbGQgd2l0aG91dCBpdC4KKworCS0gIm9wZW5zc2wiLiAgVW5sZXNzIHlvdSBzcGVjaWZ5IG90aGVyd2lzZSwgeW91J2xsIGdldCB0aGUgU0hBMQorCSAgbGlicmFyeSBmcm9tIGhlcmUuCisKKwkgIElmIHlvdSBkb24ndCBoYXZlIG9wZW5zc2wsIHlvdSBjYW4gdXNlIG9uZSBvZiB0aGUgU0hBMSBsaWJyYXJpZXMKKwkgIHRoYXQgY29tZSB3aXRoIGdpdCAoZ2l0IGluY2x1ZGVzIHRoZSBvbmUgZnJvbSBNb3ppbGxhLCBhbmQgaGFzCisJICBpdHMgb3duIFBvd2VyUEMgYW5kIEFSTSBvcHRpbWl6ZWQgb25lcyB0b28gLSBzZWUgdGhlIE1ha2VmaWxlKS4KKworCS0gImxpYmN1cmwiIGFuZCAiY3VybCIgZXhlY3V0YWJsZS4gIGdpdC1odHRwLWZldGNoIGFuZAorCSAgZ2l0LWZldGNoIHVzZSB0aGVtLiAgSWYgeW91IGRvIG5vdCB1c2UgaHR0cAorCSAgdHJhbnNmZXIsIHlvdSBhcmUgcHJvYmFibHkgT0sgaWYgeW91IGRvIG5vdCBoYXZlCisJICB0aGVtLgorCisJLSBleHBhdCBsaWJyYXJ5OyBnaXQtaHR0cC1wdXNoIHVzZXMgaXQgZm9yIHJlbW90ZSBsb2NrCisJICBtYW5hZ2VtZW50IG92ZXIgREFWLiAgU2ltaWxhciB0byAiY3VybCIgYWJvdmUsIHRoaXMgaXMgb3B0aW9uYWwuCisKKyAgICAgICAgLSAid2lzaCIsIHRoZSBUY2wvVGsgd2luZG93aW5nIHNoZWxsIGlzIHVzZWQgaW4gZ2l0ayB0byBzaG93IHRoZQorICAgICAgICAgIGhpc3RvcnkgZ3JhcGhpY2FsbHksIGFuZCBpbiBnaXQtZ3VpLgorCisJLSAic3NoIiBpcyB1c2VkIHRvIHB1c2ggYW5kIHB1bGwgb3ZlciB0aGUgbmV0CisKKwktICJwZXJsIiBhbmQgUE9TSVgtY29tcGxpYW50IHNoZWxscyBhcmUgbmVlZGVkIHRvIHVzZSBtb3N0IG9mCisJICB0aGUgYmFyZWJvbmUgUG9yY2VsYWluaXNoIHNjcmlwdHMuCisKKwktICJjcGlvIiBpcyB1c2VkIGJ5IGdpdC1jbG9uZSB3aGVuIGRvaW5nIGEgbG9jYWwgKHBvc3NpYmx5CisJICBoYXJkbGlua2VkKSBjbG9uZS4KKworIC0gU29tZSBwbGF0Zm9ybSBzcGVjaWZpYyBpc3N1ZXMgYXJlIGRlYWx0IHdpdGggTWFrZWZpbGUgcnVsZXMsCisgICBidXQgZGVwZW5kaW5nIG9uIHlvdXIgc3BlY2lmaWMgaW5zdGFsbGF0aW9uLCB5b3UgbWF5IG5vdAorICAgaGF2ZSBhbGwgdGhlIGxpYnJhcmllcy90b29scyBuZWVkZWQsIG9yIHlvdSBtYXkgaGF2ZQorICAgbmVjZXNzYXJ5IGxpYnJhcmllcyBhdCB1bnVzdWFsIGxvY2F0aW9ucy4gIFBsZWFzZSBsb29rIGF0IHRoZQorICAgdG9wIG9mIHRoZSBNYWtlZmlsZSB0byBzZWUgd2hhdCBjYW4gYmUgYWRqdXN0ZWQgZm9yIHlvdXIgbmVlZHMuCisgICBZb3UgY2FuIHBsYWNlIGxvY2FsIHNldHRpbmdzIGluIGNvbmZpZy5tYWsgYW5kIHRoZSBNYWtlZmlsZQorICAgd2lsbCBpbmNsdWRlIHRoZW0uICBOb3RlIHRoYXQgY29uZmlnLm1hayBpcyBub3QgZGlzdHJpYnV0ZWQ7CisgICB0aGUgbmFtZSBpcyByZXNlcnZlZCBmb3IgbG9jYWwgc2V0dGluZ3MuCisKKyAtIFRvIGJ1aWxkIGFuZCBpbnN0YWxsIGRvY3VtZW50YXRpb24gc3VpdGUsIHlvdSBuZWVkIHRvIGhhdmUKKyAgIHRoZSBhc2NpaWRvYy94bWx0byB0b29sY2hhaW4uICBCZWNhdXNlIG5vdCBtYW55IHBlb3BsZSBhcmUKKyAgIGluY2xpbmVkIHRvIGluc3RhbGwgdGhlIHRvb2xzLCB0aGUgZGVmYXVsdCBidWlsZCB0YXJnZXQKKyAgICgibWFrZSBhbGwiKSBkb2VzIF9ub3RfIGJ1aWxkIHRoZW0uCisKKyAgIEJ1aWxkaW5nIGFuZCBpbnN0YWxsaW5nIHRoZSBpbmZvIGZpbGUgYWRkaXRpb25hbGx5IHJlcXVpcmVzCisgICBtYWtlaW5mbyBhbmQgZG9jYm9vazJYLiAgVmVyc2lvbiAwLjguMyBpcyBrbm93biB0byB3b3JrLgorCisgICBUaGUgZG9jdW1lbnRhdGlvbiBpcyB3cml0dGVuIGZvciBBc2NpaURvYyA3LCBidXQgIm1ha2UKKyAgIEFTQ0lJRE9DOD1ZZXNQbGVhc2UgZG9jIiB3aWxsIGxldCB5b3UgZm9ybWF0IHdpdGggQXNjaWlEb2MgOC4KKworICAgQWx0ZXJuYXRpdmVseSwgcHJlLWZvcm1hdHRlZCBkb2N1bWVudGF0aW9uIGFyZSBhdmFpbGFibGUgaW4KKyAgICJodG1sIiBhbmQgIm1hbiIgYnJhbmNoZXMgb2YgdGhlIGdpdCByZXBvc2l0b3J5IGl0c2VsZi4gIEZvcgorICAgZXhhbXBsZSwgeW91IGNvdWxkOgorCisJJCBta2RpciBtYW51YWwgJiYgY2QgbWFudWFsCisJJCBnaXQgaW5pdAorCSQgZ2l0IGZldGNoLXBhY2sgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9naXQvZ2l0LmdpdCBtYW4gaHRtbCB8CisJICB3aGlsZSByZWFkIGEgYgorCSAgZG8KKwkgICAgZWNobyAkYSA+LmdpdC8kYgorCSAgZG9uZQorCSQgY3AgLmdpdC9yZWZzL2hlYWRzL21hbiAuZ2l0L3JlZnMvaGVhZHMvbWFzdGVyCisJJCBnaXQgY2hlY2tvdXQKKworICAgdG8gY2hlY2tvdXQgdGhlIHByZS1idWlsdCBtYW4gcGFnZXMuICBBbHNvIGluIHRoaXMgcmVwb3NpdG9yeToKKworCSQgZ2l0IGNoZWNrb3V0IGh0bWwKKworICAgd291bGQgaW5zdGVhZCBnaXZlIHlvdSBhIGNvcHkgb2Ygd2hhdCB5b3Ugc2VlIGF0OgorCisJaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvCisKKyAgIEl0IGhhcyBiZWVuIHJlcG9ydGVkIHRoYXQgZG9jYm9vay14c2wgdmVyc2lvbiAxLjcyIGFuZCAxLjczIGFyZQorICAgYnVnZ3k7IDEuNzIgbWlzZm9ybWF0cyBtYW51YWwgcGFnZXMgZm9yIGNhbGxvdXRzLCBhbmQgMS43MyBuZWVkcworICAgdGhlIHBhdGNoIGluIGNvbnRyaWIvcGF0Y2hlcy9kb2Nib29rLXhzbC1tYW5wYWdlcy1jaGFybWFwLnBhdGNoCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IGY5MGRmYWIuLjdjNzBiMDAgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0xLDY3ICsxLDEzNzUgQEAKICMgVGhlIGRlZmF1bHQgdGFyZ2V0IG9mIHRoaXMgTWFrZWZpbGUgaXMuLi4KIGFsbDo6CiAKLXByZWZpeCA/PSAkKEhPTUUpCi1iaW5kaXIgPz0gJChwcmVmaXgpL2Jpbgotc2hhcmVkaXIgPz0gJChwcmVmaXgpL3NoYXJlCi1naXRrX2xpYmRpciAgID89ICQoc2hhcmVkaXIpL2dpdGsvbGliCi1tc2dzZGlyICAgID89ICQoZ2l0a19saWJkaXIpL21zZ3MKLW1zZ3NkaXJfU1EgID0gJChzdWJzdCAnLCdcJycsJChtc2dzZGlyKSkKKyMgRGVmaW5lIFY9MSB0byBoYXZlIGEgbW9yZSB2ZXJib3NlIGNvbXBpbGUuCisjCisjIERlZmluZSBTTlBSSU5URl9SRVRVUk5TX0JPR1VTIGlmIHlvdXIgYXJlIG9uIGEgc3lzdGVtIHdoaWNoIHNucHJpbnRmKCkKKyMgb3IgdnNucHJpbnRmKCkgcmV0dXJuIC0xIGluc3RlYWQgb2YgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2hpY2ggd291bGQKKyMgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gdGhlIGZpbmFsIHN0cmluZyBpZiBlbm91Z2ggc3BhY2UgaGFkIGJlZW4gYXZhaWxhYmxlLgorIworIyBEZWZpbmUgRlJFQURfUkVBRFNfRElSRUNUT1JJRVMgaWYgeW91ciBhcmUgb24gYSBzeXN0ZW0gd2hpY2ggc3VjY2VlZHMKKyMgd2hlbiBhdHRlbXB0aW5nIHRvIHJlYWQgZnJvbSBhbiBmb3BlbidlZCBkaXJlY3RvcnkuCisjCisjIERlZmluZSBOT19PUEVOU1NMIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIHlvdSBkbyBub3QgaGF2ZSBPcGVuU1NMLgorIyBUaGlzIGFsc28gaW1wbGllcyBNT1pJTExBX1NIQTEuCisjCisjIERlZmluZSBOT19DVVJMIGlmIHlvdSBkbyBub3QgaGF2ZSBjdXJsIGluc3RhbGxlZC4gIGdpdC1odHRwLXB1bGwgYW5kCisjIGdpdC1odHRwLXB1c2ggYXJlIG5vdCBidWlsdCwgYW5kIHlvdSBjYW5ub3QgdXNlIGh0dHA6Ly8gYW5kIGh0dHBzOi8vCisjIHRyYW5zcG9ydHMuCisjCisjIERlZmluZSBDVVJMRElSPS9mb28vYmFyIGlmIHlvdXIgY3VybCBoZWFkZXIgYW5kIGxpYnJhcnkgZmlsZXMgYXJlIGluCisjIC9mb28vYmFyL2luY2x1ZGUgYW5kIC9mb28vYmFyL2xpYiBkaXJlY3Rvcmllcy4KKyMKKyMgRGVmaW5lIE5PX0VYUEFUIGlmIHlvdSBkbyBub3QgaGF2ZSBleHBhdCBpbnN0YWxsZWQuICBnaXQtaHR0cC1wdXNoIGlzCisjIG5vdCBidWlsdCwgYW5kIHlvdSBjYW5ub3QgcHVzaCB1c2luZyBodHRwOi8vIGFuZCBodHRwczovLyB0cmFuc3BvcnRzLgorIworIyBEZWZpbmUgTk9fRF9JTk9fSU5fRElSRU5UIGlmIHlvdSBkb24ndCBoYXZlIGRfaW5vIGluIHlvdXIgc3RydWN0IGRpcmVudC4KKyMKKyMgRGVmaW5lIE5PX0RfVFlQRV9JTl9ESVJFTlQgaWYgeW91ciBwbGF0Zm9ybSBkZWZpbmVzIERUX1VOS05PV04gYnV0IGxhY2tzCisjIGRfdHlwZSBpbiBzdHJ1Y3QgZGlyZW50IChsYXRlc3QgQ3lnd2luIC0tIHdpbGwgYmUgZml4ZWQgc29vbmlzaCkuCisjCisjIERlZmluZSBOT19DOTlfRk9STUFUIGlmIHlvdXIgZm9ybWF0dGVkIElPIGZ1bmN0aW9ucyAocHJpbnRmL3NjYW5mIGV0LmFsLikKKyMgZG8gbm90IHN1cHBvcnQgdGhlICdzaXplIHNwZWNpZmllcnMnIGludHJvZHVjZWQgYnkgQzk5LCBuYW1lbHkgbGwsIGhoLAorIyBqLCB6LCB0LiAocmVwcmVzZW50aW5nIGxvbmcgbG9uZyBpbnQsIGNoYXIsIGludG1heF90LCBzaXplX3QsIHB0cmRpZmZfdCkuCisjIHNvbWUgQyBjb21waWxlcnMgc3VwcG9ydGVkIHRoZXNlIHNwZWNpZmllcnMgcHJpb3IgdG8gQzk5IGFzIGFuIGV4dGVuc2lvbi4KKyMKKyMgRGVmaW5lIE5PX1NUUkNBU0VTVFIgaWYgeW91IGRvbid0IGhhdmUgc3RyY2FzZXN0ci4KKyMKKyMgRGVmaW5lIE5PX01FTU1FTSBpZiB5b3UgZG9uJ3QgaGF2ZSBtZW1tZW0uCisjCisjIERlZmluZSBOT19TVFJMQ1BZIGlmIHlvdSBkb24ndCBoYXZlIHN0cmxjcHkuCisjCisjIERlZmluZSBOT19TVFJUT1VNQVggaWYgeW91IGRvbid0IGhhdmUgc3RydG91bWF4IGluIHRoZSBDIGxpYnJhcnkuCisjIElmIHlvdXIgY29tcGlsZXIgYWxzbyBkb2VzIG5vdCBzdXBwb3J0IGxvbmcgbG9uZyBvciBkb2VzIG5vdCBoYXZlCisjIHN0cnRvdWxsLCBkZWZpbmUgTk9fU1RSVE9VTEwuCisjCisjIERlZmluZSBOT19TRVRFTlYgaWYgeW91IGRvbid0IGhhdmUgc2V0ZW52IGluIHRoZSBDIGxpYnJhcnkuCisjCisjIERlZmluZSBOT19VTlNFVEVOViBpZiB5b3UgZG9uJ3QgaGF2ZSB1bnNldGVudiBpbiB0aGUgQyBsaWJyYXJ5LgorIworIyBEZWZpbmUgTk9fTUtEVEVNUCBpZiB5b3UgZG9uJ3QgaGF2ZSBta2R0ZW1wIGluIHRoZSBDIGxpYnJhcnkuCisjCisjIERlZmluZSBOT19TWVNfU0VMRUNUX0ggaWYgeW91IGRvbid0IGhhdmUgc3lzL3NlbGVjdC5oLgorIworIyBEZWZpbmUgTk9fU1lNTElOS19IRUFEIGlmIHlvdSBuZXZlciB3YW50IC5naXQvSEVBRCB0byBiZSBhIHN5bWJvbGljIGxpbmsuCisjIEVuYWJsZSBpdCBvbiBXaW5kb3dzLiAgQnkgZGVmYXVsdCwgc3ltcmVmcyBhcmUgc3RpbGwgdXNlZC4KKyMKKyMgRGVmaW5lIE5PX1NWTl9URVNUUyBpZiB5b3Ugd2FudCB0byBza2lwIHRpbWUtY29uc3VtaW5nIFNWTiBpbnRlcm9wZXJhYmlsaXR5CisjIHRlc3RzLiAgVGhlc2UgdGVzdHMgdGFrZSB1cCBhIHNpZ25pZmljYW50IGFtb3VudCBvZiB0aGUgdG90YWwgdGVzdCB0aW1lCisjIGJ1dCBhcmUgbm90IG5lZWRlZCB1bmxlc3MgeW91IHBsYW4gdG8gdGFsayB0byBTVk4gcmVwb3MuCisjCisjIERlZmluZSBOT19GSU5LIGlmIHlvdSBhcmUgYnVpbGRpbmcgb24gRGFyd2luL01hYyBPUyBYLCBoYXZlIEZpbmsKKyMgaW5zdGFsbGVkIGluIC9zdywgYnV0IGRvbid0IHdhbnQgR0lUIHRvIGxpbmsgYWdhaW5zdCBhbnkgbGlicmFyaWVzCisjIGluc3RhbGxlZCB0aGVyZS4gIElmIGRlZmluZWQgeW91IG1heSBzcGVjaWZ5IHlvdXIgb3duIChvciBGaW5rJ3MpCisjIGluY2x1ZGUgZGlyZWN0b3JpZXMgYW5kIGxpYnJhcnkgZGlyZWN0b3JpZXMgYnkgZGVmaW5pbmcgQ0ZMQUdTCisjIGFuZCBMREZMQUdTIGFwcHJvcHJpYXRlbHkuCisjCisjIERlZmluZSBOT19EQVJXSU5fUE9SVFMgaWYgeW91IGFyZSBidWlsZGluZyBvbiBEYXJ3aW4vTWFjIE9TIFgsCisjIGhhdmUgRGFyd2luUG9ydHMgaW5zdGFsbGVkIGluIC9vcHQvbG9jYWwsIGJ1dCBkb24ndCB3YW50IEdJVCB0bworIyBsaW5rIGFnYWluc3QgYW55IGxpYnJhcmllcyBpbnN0YWxsZWQgdGhlcmUuICBJZiBkZWZpbmVkIHlvdSBtYXkKKyMgc3BlY2lmeSB5b3VyIG93biAob3IgRGFyd2luUG9ydCdzKSBpbmNsdWRlIGRpcmVjdG9yaWVzIGFuZAorIyBsaWJyYXJ5IGRpcmVjdG9yaWVzIGJ5IGRlZmluaW5nIENGTEFHUyBhbmQgTERGTEFHUyBhcHByb3ByaWF0ZWx5LgorIworIyBEZWZpbmUgUFBDX1NIQTEgZW52aXJvbm1lbnQgdmFyaWFibGUgd2hlbiBydW5uaW5nIG1ha2UgdG8gbWFrZSB1c2Ugb2YKKyMgYSBidW5kbGVkIFNIQTEgcm91dGluZSBvcHRpbWl6ZWQgZm9yIFBvd2VyUEMuCisjCisjIERlZmluZSBBUk1fU0hBMSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIHJ1bm5pbmcgbWFrZSB0byBtYWtlIHVzZSBvZgorIyBhIGJ1bmRsZWQgU0hBMSByb3V0aW5lIG9wdGltaXplZCBmb3IgQVJNLgorIworIyBEZWZpbmUgTU9aSUxMQV9TSEExIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gcnVubmluZyBtYWtlIHRvIG1ha2UgdXNlIG9mCisjIGEgYnVuZGxlZCBTSEExIHJvdXRpbmUgY29taW5nIGZyb20gTW96aWxsYS4gSXQgaXMgR1BMJ2QgYW5kIHNob3VsZCBiZSBmYXN0CisjIG9uIG5vbi14ODYgYXJjaGl0ZWN0dXJlcyAoZS5nLiBQb3dlclBDKSwgd2hpbGUgdGhlIE9wZW5TU0wgdmVyc2lvbiAoZGVmYXVsdAorIyBjaG9pY2UpIGhhcyB2ZXJ5IGZhc3QgdmVyc2lvbiBvcHRpbWl6ZWQgZm9yIGk1ODYuCisjCisjIERlZmluZSBORUVEU19TU0xfV0lUSF9DUllQVE8gaWYgeW91IG5lZWQgLWxjcnlwdG8gd2l0aCAtbHNzbCAoRGFyd2luKS4KKyMKKyMgRGVmaW5lIE5FRURTX0xJQklDT05WIGlmIGxpbmtpbmcgd2l0aCBsaWJjIGlzIG5vdCBlbm91Z2ggKERhcndpbikuCisjCisjIERlZmluZSBORUVEU19TT0NLRVQgaWYgbGlua2luZyB3aXRoIGxpYmMgaXMgbm90IGVub3VnaCAoU3VuT1MsCisjIFBhdHJpY2sgTWF1cml0eikuCisjCisjIERlZmluZSBOT19NTUFQIGlmIHlvdSB3YW50IHRvIGF2b2lkIG1tYXAuCisjCisjIERlZmluZSBOT19QUkVBRCBpZiB5b3UgaGF2ZSBhIHByb2JsZW0gd2l0aCBwcmVhZCgpIHN5c3RlbSBjYWxsIChlLmcuCisjIGN5Z3dpbi5kbGwgYmVmb3JlIHYxLjUuMjIpLgorIworIyBEZWZpbmUgTk9fRkFTVF9XT1JLSU5HX0RJUkVDVE9SWSBpZiBhY2Nlc3Npbmcgb2JqZWN0cyBpbiBwYWNrIGZpbGVzIGlzCisjIGdlbmVyYWxseSBmYXN0ZXIgb24geW91ciBwbGF0Zm9ybSB0aGFuIGFjY2Vzc2luZyB0aGUgd29ya2luZyBkaXJlY3RvcnkuCisjCisjIERlZmluZSBOT19UUlVTVEFCTEVfRklMRU1PREUgaWYgeW91ciBmaWxlc3lzdGVtIG1heSBjbGFpbSB0byBzdXBwb3J0CisjIHRoZSBleGVjdXRhYmxlIG1vZGUgYml0LCBidXQgZG9lc24ndCByZWFsbHkgZG8gc28uCisjCisjIERlZmluZSBOT19JUFY2IGlmIHlvdSBsYWNrIElQdjYgc3VwcG9ydCBhbmQgZ2V0YWRkcmluZm8oKS4KKyMKKyMgRGVmaW5lIE5PX1NPQ0tBRERSX1NUT1JBR0UgaWYgeW91ciBwbGF0Zm9ybSBkb2VzIG5vdCBoYXZlIHN0cnVjdAorIyBzb2NrYWRkcl9zdG9yYWdlLgorIworIyBEZWZpbmUgTk9fSUNPTlYgaWYgeW91ciBsaWJjIGRvZXMgbm90IHByb3Blcmx5IHN1cHBvcnQgaWNvbnYuCisjCisjIERlZmluZSBPTERfSUNPTlYgaWYgeW91ciBsaWJyYXJ5IGhhcyBhbiBvbGQgaWNvbnYoKSwgd2hlcmUgdGhlIHNlY29uZAorIyAoaW5wdXQgYnVmZmVyIHBvaW50ZXIpIHBhcmFtZXRlciBpcyBkZWNsYXJlZCB3aXRoIHR5cGUgKGNvbnN0IGNoYXIgKiopLgorIworIyBEZWZpbmUgTk9fREVGTEFURV9CT1VORCBpZiB5b3VyIHpsaWIgZG9lcyBub3QgaGF2ZSBkZWZsYXRlQm91bmQuCisjCisjIERlZmluZSBOT19SX1RPX0dDQ19MSU5LRVIgaWYgeW91ciBnY2MgZG9lcyBub3QgbGlrZSAiLVIvcGF0aC9saWIiCisjIHRoYXQgdGVsbHMgcnVudGltZSBwYXRocyB0byBkeW5hbWljIGxpYnJhcmllczsKKyMgIi1XbCwtcnBhdGg9L3BhdGgvbGliIiBpcyB1c2VkIGluc3RlYWQuCisjCisjIERlZmluZSBVU0VfTlNFQyBiZWxvdyBpZiB5b3Ugd2FudCBnaXQgdG8gY2FyZSBhYm91dCBzdWItc2Vjb25kIGZpbGUgbXRpbWVzCisjIGFuZCBjdGltZXMuIE5vdGUgdGhhdCB5b3UgbmVlZCByZWNlbnQgZ2xpYmMgKGF0IGxlYXN0IDIuMi40KSBmb3IgdGhpcywgYW5kCisjIGl0IHdpbGwgQlJFQUsgWU9VUiBMT0NBTCBESUZGUyEgc2hvdy1kaWZmIGFuZCBhbnl0aGluZyB1c2luZyBpdCB3aWxsIGxpa2VseQorIyByYW5kb21seSBicmVhayB1bmxlc3MgeW91ciB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0gc3VwcG9ydHMgdGhvc2Ugc3ViLXNlY29uZAorIyB0aW1lcyAobXkgZXh0MyBkb2Vzbid0KS4KKyMKKyMgRGVmaW5lIFVTRV9TVERFViBiZWxvdyBpZiB5b3Ugd2FudCBnaXQgdG8gY2FyZSBhYm91dCB0aGUgdW5kZXJseWluZyBkZXZpY2UKKyMgY2hhbmdlIGJlaW5nIGNvbnNpZGVyZWQgYW4gaW5vZGUgY2hhbmdlIGZyb20gdGhlIHVwZGF0ZS1pbmRleCBwZXJzcGVjdGl2ZS4KKyMKKyMgRGVmaW5lIEFTQ0lJRE9DOCBpZiB5b3Ugd2FudCB0byBmb3JtYXQgZG9jdW1lbnRhdGlvbiB3aXRoIEFzY2lpRG9jIDgKKyMKKyMgRGVmaW5lIERPQ0JPT0tfWFNMXzE3MiBpZiB5b3Ugd2FudCB0byBmb3JtYXQgbWFuIHBhZ2VzIHdpdGggRG9jQm9vayBYU0wgdjEuNzIuCisjCisjIERlZmluZSBOT19QRVJMX01BS0VNQUtFUiBpZiB5b3UgY2Fubm90IHVzZSBNYWtlZmlsZXMgZ2VuZXJhdGVkIGJ5IHBlcmwncworIyBNYWtlTWFrZXIgKGUuZy4gdXNpbmcgQWN0aXZlU3RhdGUgdW5kZXIgQ3lnd2luKS4KKyMKKyMgRGVmaW5lIE5PX1RDTFRLIGlmIHlvdSBkbyBub3Qgd2FudCBUY2wvVGsgR1VJLgorIworIyBUaGUgVENMX1BBVEggdmFyaWFibGUgZ292ZXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIFRjbCBpbnRlcnByZXRlcgorIyB1c2VkIHRvIG9wdGltaXplIGdpdC1ndWkgZm9yIHlvdXIgc3lzdGVtLiAgT25seSB1c2VkIGlmIE5PX1RDTFRLCisjIGlzIG5vdCBzZXQuICBEZWZhdWx0cyB0byB0aGUgYmFyZSAndGNsc2gnLgorIworIyBUaGUgVENMVEtfUEFUSCB2YXJpYWJsZSBnb3Zlcm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgVGNsL1RrIGludGVycHJldGVyLgorIyBJZiBub3Qgc2V0IGl0IGRlZmF1bHRzIHRvIHRoZSBiYXJlICd3aXNoJy4gSWYgaXQgaXMgc2V0IHRvIHRoZSBlbXB0eQorIyBzdHJpbmcgdGhlbiBOT19UQ0xUSyB3aWxsIGJlIGZvcmNlZCAodGhpcyBpcyB1c2VkIGJ5IGNvbmZpZ3VyZSBzY3JpcHQpLgorIworIyBEZWZpbmUgVEhSRUFERURfREVMVEFfU0VBUkNIIGlmIHlvdSBoYXZlIHB0aHJlYWRzIGFuZCB3aXNoIHRvIGV4cGxvaXQKKyMgcGFyYWxsZWwgZGVsdGEgc2VhcmNoaW5nIHdoZW4gcGFja2luZyBvYmplY3RzLgorIworIyBEZWZpbmUgSU5URVJOQUxfUVNPUlQgdG8gdXNlIEdpdCdzIGltcGxlbWVudGF0aW9uIG9mIHFzb3J0KCksIHdoaWNoCisjIGlzIGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIHRoZSBtZXJnZSBzb3J0IHVzZWQgaW4gZ2xpYmMuIFRoaXMgaXMKKyMgcmVjb21tZW5kZWQgaWYgR2l0IHRyaWdnZXJzIE8obl4yKSBiZWhhdmlvciBpbiB5b3VyIHBsYXRmb3JtJ3MgcXNvcnQoKS4KKyMKKyMgRGVmaW5lIE5PX0VYVEVSTkFMX0dSRVAgaWYgeW91IGRvbid0IHdhbnQgImdpdCBncmVwIiB0byBldmVyIGNhbGwKKyMgeW91ciBleHRlcm5hbCBncmVwIChlLmcuLCBpZiB5b3VyIHN5c3RlbSBsYWNrcyBncmVwLCBpZiBpdHMgZ3JlcCBpcworIyBicm9rZW4sIG9yIHNwYXduaW5nIGV4dGVybmFsIHByb2Nlc3MgaXMgc2xvd2VyIHRoYW4gYnVpbHQtaW4gZ3JlcCBnaXQgaGFzKS4KIAotVENMX1BBVEggPz0gdGNsc2gKLVRDTFRLX1BBVEggPz0gd2lzaAotSU5TVEFMTCA/PSBpbnN0YWxsCi1STSA/PSBybSAtZgorR0lULVZFUlNJT04tRklMRTogLkZPUkNFLUdJVC1WRVJTSU9OLUZJTEUKKwlAJChTSEVMTF9QQVRIKSAuL0dJVC1WRVJTSU9OLUdFTgorLWluY2x1ZGUgR0lULVZFUlNJT04tRklMRQogCi1ERVNURElSX1NRID0gJChzdWJzdCAnLCdcJycsJChERVNURElSKSkKLWJpbmRpcl9TUSA9ICQoc3Vic3QgJywnXCcnLCQoYmluZGlyKSkKLVRDTFRLX1BBVEhfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKFRDTFRLX1BBVEgpKQordW5hbWVfUyA6PSAkKHNoZWxsIHNoIC1jICd1bmFtZSAtcyAyPi9kZXYvbnVsbCB8fCBlY2hvIG5vdCcpCit1bmFtZV9NIDo9ICQoc2hlbGwgc2ggLWMgJ3VuYW1lIC1tIDI+L2Rldi9udWxsIHx8IGVjaG8gbm90JykKK3VuYW1lX08gOj0gJChzaGVsbCBzaCAtYyAndW5hbWUgLW8gMj4vZGV2L251bGwgfHwgZWNobyBub3QnKQordW5hbWVfUiA6PSAkKHNoZWxsIHNoIC1jICd1bmFtZSAtciAyPi9kZXYvbnVsbCB8fCBlY2hvIG5vdCcpCit1bmFtZV9QIDo9ICQoc2hlbGwgc2ggLWMgJ3VuYW1lIC1wIDI+L2Rldi9udWxsIHx8IGVjaG8gbm90JykKIAotIyMgcG8tZmlsZSBjcmVhdGlvbiBydWxlcwotWEdFVFRFWFQgICA/PSB4Z2V0dGV4dAotaWZkZWYgTk9fTVNHRk1UCi0JTVNHRk1UID89ICQoVENMX1BBVEgpIHBvL3BvMm1zZy5zaAorIyBDRkxBR1MgYW5kIExERkxBR1MgYXJlIGZvciB0aGUgdXNlcnMgdG8gb3ZlcnJpZGUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorCitDRkxBR1MgPSAtZyAtTzIgLVdhbGwKK0xERkxBR1MgPQorQUxMX0NGTEFHUyA9ICQoQ0ZMQUdTKQorQUxMX0xERkxBR1MgPSAkKExERkxBR1MpCitTVFJJUCA/PSBzdHJpcAorCitwcmVmaXggPSAkKEhPTUUpCitiaW5kaXIgPSAkKHByZWZpeCkvYmluCittYW5kaXIgPSAkKHByZWZpeCkvc2hhcmUvbWFuCitpbmZvZGlyID0gJChwcmVmaXgpL3NoYXJlL2luZm8KK2dpdGV4ZWNkaXIgPSAkKGJpbmRpcikKK3NoYXJlZGlyID0gJChwcmVmaXgpL3NoYXJlCit0ZW1wbGF0ZV9kaXIgPSAkKHNoYXJlZGlyKS9naXQtY29yZS90ZW1wbGF0ZXMKK2h0bWxkaXI9JChzaGFyZWRpcikvZG9jL2dpdC1kb2MKK2lmZXEgKCQocHJlZml4KSwvdXNyKQorc3lzY29uZmRpciA9IC9ldGMKIGVsc2UKLQlNU0dGTVQgPz0gbXNnZm10Ci0JaWZuZXEgKCQoc2hlbGwgJChNU0dGTVQpIC0tdGNsIC1sIEMgLWQgLiAvZGV2L251bGwgMj4vZGV2L251bGw7IGVjaG8gJCQ/KSwwKQotCQlNU0dGTVQgOj0gJChUQ0xfUEFUSCkgcG8vcG8ybXNnLnNoCitzeXNjb25mZGlyID0gJChwcmVmaXgpL2V0YworZW5kaWYKK2xpYiA9IGxpYgorRVRDX0dJVENPTkZJRyA9ICQoc3lzY29uZmRpcikvZ2l0Y29uZmlnCisjIERFU1RESVI9CisKKyMgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciBnaXR3ZWIKK0dJVFdFQl9DT05GSUcgPSBnaXR3ZWJfY29uZmlnLnBlcmwKK0dJVFdFQl9IT01FX0xJTktfU1RSID0gcHJvamVjdHMKK0dJVFdFQl9TSVRFTkFNRSA9CitHSVRXRUJfUFJPSkVDVFJPT1QgPSAvcHViL2dpdAorR0lUV0VCX1BST0pFQ1RfTUFYREVQVEggPSAyMDA3CitHSVRXRUJfRVhQT1JUX09LID0KK0dJVFdFQl9TVFJJQ1RfRVhQT1JUID0KK0dJVFdFQl9CQVNFX1VSTCA9CitHSVRXRUJfTElTVCA9CitHSVRXRUJfSE9NRVRFWFQgPSBpbmRleHRleHQuaHRtbAorR0lUV0VCX0NTUyA9IGdpdHdlYi5jc3MKK0dJVFdFQl9MT0dPID0gZ2l0LWxvZ28ucG5nCitHSVRXRUJfRkFWSUNPTiA9IGdpdC1mYXZpY29uLnBuZworR0lUV0VCX1NJVEVfSEVBREVSID0KK0dJVFdFQl9TSVRFX0ZPT1RFUiA9CisKK2V4cG9ydCBwcmVmaXggYmluZGlyIGdpdGV4ZWNkaXIgc2hhcmVkaXIgdGVtcGxhdGVfZGlyIGh0bWxkaXIgc3lzY29uZmRpcgorCitDQyA9IGdjYworQVIgPSBhcgorUk0gPSBybSAtZgorVEFSID0gdGFyCitGSU5EID0gZmluZAorSU5TVEFMTCA9IGluc3RhbGwKK1JQTUJVSUxEID0gcnBtYnVpbGQKK1RDTF9QQVRIID0gdGNsc2gKK1RDTFRLX1BBVEggPSB3aXNoCisKK2V4cG9ydCBUQ0xfUEFUSCBUQ0xUS19QQVRICisKKyMgc3BhcnNlIGlzIGFyY2hpdGVjdHVyZS1uZXV0cmFsLCB3aGljaCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gdGVsbCBpdAorIyBleHBsaWNpdGx5IHdoYXQgYXJjaGl0ZWN0dXJlIHRvIGNoZWNrIGZvci4gRml4IHRoaXMgdXAgZm9yIHlvdXJzLi4KK1NQQVJTRV9GTEFHUyA9IC1EX19CSUdfRU5ESUFOX18gLURfX3Bvd2VycGNfXworCisKKworIyMjIC0tLSBFTkQgQ09ORklHVVJBVElPTiBTRUNUSU9OIC0tLQorCisjIFRob3NlIG11c3Qgbm90IGJlIEdOVS1zcGVjaWZpYzsgdGhleSBhcmUgc2hhcmVkIHdpdGggcGVybC8gd2hpY2ggbWF5CisjIGJlIGJ1aWx0IGJ5IGEgZGlmZmVyZW50IGNvbXBpbGVyLiAoTm90ZSB0aGF0IHRoaXMgaXMgYW4gYXJ0aWZhY3Qgbm93CisjIGJ1dCBpdCBzdGlsbCBtaWdodCBiZSBuaWNlIHRvIGtlZXAgdGhhdCBkaXN0aW5jdGlvbi4pCitCQVNJQ19DRkxBR1MgPQorQkFTSUNfTERGTEFHUyA9CisKK1NDUklQVF9TSCArPSBnaXQtYW0uc2gKK1NDUklQVF9TSCArPSBnaXQtYmlzZWN0LnNoCitTQ1JJUFRfU0ggKz0gZ2l0LWNsb25lLnNoCitTQ1JJUFRfU0ggKz0gZ2l0LWZpbHRlci1icmFuY2guc2gKK1NDUklQVF9TSCArPSBnaXQtbG9zdC1mb3VuZC5zaAorU0NSSVBUX1NIICs9IGdpdC1tZXJnZS1vY3RvcHVzLnNoCitTQ1JJUFRfU0ggKz0gZ2l0LW1lcmdlLW9uZS1maWxlLnNoCitTQ1JJUFRfU0ggKz0gZ2l0LW1lcmdlLXJlc29sdmUuc2gKK1NDUklQVF9TSCArPSBnaXQtbWVyZ2Uuc2gKK1NDUklQVF9TSCArPSBnaXQtbWVyZ2Utc3R1cGlkLnNoCitTQ1JJUFRfU0ggKz0gZ2l0LW1lcmdldG9vbC5zaAorU0NSSVBUX1NIICs9IGdpdC1wYXJzZS1yZW1vdGUuc2gKK1NDUklQVF9TSCArPSBnaXQtcHVsbC5zaAorU0NSSVBUX1NIICs9IGdpdC1xdWlsdGltcG9ydC5zaAorU0NSSVBUX1NIICs9IGdpdC1yZWJhc2UtLWludGVyYWN0aXZlLnNoCitTQ1JJUFRfU0ggKz0gZ2l0LXJlYmFzZS5zaAorU0NSSVBUX1NIICs9IGdpdC1yZXBhY2suc2gKK1NDUklQVF9TSCArPSBnaXQtcmVxdWVzdC1wdWxsLnNoCitTQ1JJUFRfU0ggKz0gZ2l0LXNoLXNldHVwLnNoCitTQ1JJUFRfU0ggKz0gZ2l0LXN0YXNoLnNoCitTQ1JJUFRfU0ggKz0gZ2l0LXN1Ym1vZHVsZS5zaAorU0NSSVBUX1NIICs9IGdpdC13ZWItLWJyb3dzZS5zaAorCitTQ1JJUFRfUEVSTCArPSBnaXQtYWRkLS1pbnRlcmFjdGl2ZS5wZXJsCitTQ1JJUFRfUEVSTCArPSBnaXQtYXJjaGltcG9ydC5wZXJsCitTQ1JJUFRfUEVSTCArPSBnaXQtY3ZzZXhwb3J0Y29tbWl0LnBlcmwKK1NDUklQVF9QRVJMICs9IGdpdC1jdnNpbXBvcnQucGVybAorU0NSSVBUX1BFUkwgKz0gZ2l0LWN2c3NlcnZlci5wZXJsCitTQ1JJUFRfUEVSTCArPSBnaXQtcmVsaW5rLnBlcmwKK1NDUklQVF9QRVJMICs9IGdpdC1zZW5kLWVtYWlsLnBlcmwKK1NDUklQVF9QRVJMICs9IGdpdC1zdm4ucGVybAorCitTQ1JJUFRTID0gJChwYXRzdWJzdCAlLnNoLCUsJChTQ1JJUFRfU0gpKSBcCisJICAkKHBhdHN1YnN0ICUucGVybCwlLCQoU0NSSVBUX1BFUkwpKSBcCisJICBnaXQtaW5zdGF3ZWIKKworIyBFbXB0eS4uLgorRVhUUkFfUFJPR1JBTVMgPQorCisjIC4uLiBhbmQgYWxsIHRoZSByZXN0IHRoYXQgY291bGQgYmUgbW92ZWQgb3V0IG9mIGJpbmRpciB0byBnaXRleGVjZGlyCitQUk9HUkFNUyArPSAkKEVYVFJBX1BST0dSQU1TKQorUFJPR1JBTVMgKz0gZ2l0LWRhZW1vbiRYCitQUk9HUkFNUyArPSBnaXQtZmFzdC1pbXBvcnQkWAorUFJPR1JBTVMgKz0gZ2l0LWZldGNoLXBhY2skWAorUFJPR1JBTVMgKz0gZ2l0LWhhc2gtb2JqZWN0JFgKK1BST0dSQU1TICs9IGdpdC1pbWFwLXNlbmQkWAorUFJPR1JBTVMgKz0gZ2l0LWluZGV4LXBhY2skWAorUFJPR1JBTVMgKz0gZ2l0LW1lcmdlLWluZGV4JFgKK1BST0dSQU1TICs9IGdpdC1tZXJnZS10cmVlJFgKK1BST0dSQU1TICs9IGdpdC1ta3RhZyRYCitQUk9HUkFNUyArPSBnaXQtbWt0cmVlJFgKK1BST0dSQU1TICs9IGdpdC1wYWNrLXJlZHVuZGFudCRYCitQUk9HUkFNUyArPSBnaXQtcGF0Y2gtaWQkWAorUFJPR1JBTVMgKz0gZ2l0LXJlY2VpdmUtcGFjayRYCitQUk9HUkFNUyArPSBnaXQtc2VuZC1wYWNrJFgKK1BST0dSQU1TICs9IGdpdC1zaGVsbCRYCitQUk9HUkFNUyArPSBnaXQtc2hvdy1pbmRleCRYCitQUk9HUkFNUyArPSBnaXQtdW5wYWNrLWZpbGUkWAorUFJPR1JBTVMgKz0gZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mbyRYCitQUk9HUkFNUyArPSBnaXQtdXBsb2FkLXBhY2skWAorUFJPR1JBTVMgKz0gZ2l0LXZhciRYCisKKyMgTGlzdCBidWlsdC1pbiBjb21tYW5kICRDIHdob3NlIGltcGxlbWVudGF0aW9uIGNtZF8kQygpIGlzIG5vdCBpbgorIyBidWlsdGluLSRDLm8gYnV0IGlzIGxpbmtlZCBpbiBhcyBwYXJ0IG9mIHNvbWUgb3RoZXIgY29tbWFuZC4KK0JVSUxUX0lOUyArPSAkKHBhdHN1YnN0IGJ1aWx0aW4tJS5vLGdpdC0lJFgsJChCVUlMVElOX09CSlMpKQorCitCVUlMVF9JTlMgKz0gZ2l0LWNoZXJyeS1waWNrJFgKK0JVSUxUX0lOUyArPSBnaXQtY2hlcnJ5JFgKK0JVSUxUX0lOUyArPSBnaXQtZm9ybWF0LXBhdGNoJFgKK0JVSUxUX0lOUyArPSBnaXQtZnNjay1vYmplY3RzJFgKK0JVSUxUX0lOUyArPSBnaXQtZ2V0LXRhci1jb21taXQtaWQkWAorQlVJTFRfSU5TICs9IGdpdC1pbml0JFgKK0JVSUxUX0lOUyArPSBnaXQtbWVyZ2Utc3VidHJlZSRYCitCVUlMVF9JTlMgKz0gZ2l0LXBlZWstcmVtb3RlJFgKK0JVSUxUX0lOUyArPSBnaXQtcmVwby1jb25maWckWAorQlVJTFRfSU5TICs9IGdpdC1zaG93JFgKK0JVSUxUX0lOUyArPSBnaXQtc3RhdHVzJFgKK0JVSUxUX0lOUyArPSBnaXQtd2hhdGNoYW5nZWQkWAorCisjIHdoYXQgJ2FsbCcgd2lsbCBidWlsZCBhbmQgJ2luc3RhbGwnIHdpbGwgaW5zdGFsbCwgaW4gZ2l0ZXhlY2RpcgorQUxMX1BST0dSQU1TID0gJChQUk9HUkFNUykgJChTQ1JJUFRTKQorCisjIHdoYXQgJ2FsbCcgd2lsbCBidWlsZCBidXQgbm90IGluc3RhbGwgaW4gZ2l0ZXhlY2RpcgorT1RIRVJfUFJPR1JBTVMgPSBnaXQkWCBnaXR3ZWIvZ2l0d2ViLmNnaQorCisjIFNldCBwYXRocyB0byB0b29scyBlYXJseSBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgZm9yIHZlcnNpb24gdGVzdHMuCitpZm5kZWYgU0hFTExfUEFUSAorCVNIRUxMX1BBVEggPSAvYmluL3NoCitlbmRpZgoraWZuZGVmIFBFUkxfUEFUSAorCVBFUkxfUEFUSCA9IC91c3IvYmluL3BlcmwKK2VuZGlmCisKK2V4cG9ydCBQRVJMX1BBVEgKKworTElCX0ZJTEU9bGliZ2l0LmEKK1hESUZGX0xJQj14ZGlmZi9saWIuYQorCitMSUJfSCArPSBhcmNoaXZlLmgKK0xJQl9IICs9IGF0dHIuaAorTElCX0ggKz0gYmxvYi5oCitMSUJfSCArPSBidWlsdGluLmgKK0xJQl9IICs9IGNhY2hlLmgKK0xJQl9IICs9IGNhY2hlLXRyZWUuaAorTElCX0ggKz0gY29tbWl0LmgKK0xJQl9IICs9IGNzdW0tZmlsZS5oCitMSUJfSCArPSBkZWNvcmF0ZS5oCitMSUJfSCArPSBkZWx0YS5oCitMSUJfSCArPSBkaWZmY29yZS5oCitMSUJfSCArPSBkaWZmLmgKK0xJQl9IICs9IGRpci5oCitMSUJfSCArPSBmc2NrLmgKK0xJQl9IICs9IGdpdC1jb21wYXQtdXRpbC5oCitMSUJfSCArPSBncmVwLmgKK0xJQl9IICs9IGhhc2guaAorTElCX0ggKz0gbGlzdC1vYmplY3RzLmgKK0xJQl9IICs9IGxsLW1lcmdlLmgKK0xJQl9IICs9IGxvZy10cmVlLmgKK0xJQl9IICs9IG1haWxtYXAuaAorTElCX0ggKz0gb2JqZWN0LmgKK0xJQl9IICs9IHBhY2suaAorTElCX0ggKz0gcGFjay1yZXZpbmRleC5oCitMSUJfSCArPSBwYXJzZS1vcHRpb25zLmgKK0xJQl9IICs9IHBhdGNoLWlkcy5oCitMSUJfSCArPSBwYXRoLWxpc3QuaAorTElCX0ggKz0gcGt0LWxpbmUuaAorTElCX0ggKz0gcHJvZ3Jlc3MuaAorTElCX0ggKz0gcXVvdGUuaAorTElCX0ggKz0gcmVmbG9nLXdhbGsuaAorTElCX0ggKz0gcmVmcy5oCitMSUJfSCArPSByZW1vdGUuaAorTElCX0ggKz0gcmV2aXNpb24uaAorTElCX0ggKz0gcnVuLWNvbW1hbmQuaAorTElCX0ggKz0gc2lkZWJhbmQuaAorTElCX0ggKz0gc3RyYnVmLmgKK0xJQl9IICs9IHRhZy5oCitMSUJfSCArPSB0cmFuc3BvcnQuaAorTElCX0ggKz0gdHJlZS5oCitMSUJfSCArPSB0cmVlLXdhbGsuaAorTElCX0ggKz0gdW5wYWNrLXRyZWVzLmgKK0xJQl9IICs9IHV0ZjguaAorCitMSUJfT0JKUyArPSBhbGlhcy5vCitMSUJfT0JKUyArPSBhbGxvYy5vCitMSUJfT0JKUyArPSBhcmNoaXZlLm8KK0xJQl9PQkpTICs9IGFyY2hpdmUtdGFyLm8KK0xJQl9PQkpTICs9IGFyY2hpdmUtemlwLm8KK0xJQl9PQkpTICs9IGF0dHIubworTElCX09CSlMgKz0gYmFzZTg1Lm8KK0xJQl9PQkpTICs9IGJsb2IubworTElCX09CSlMgKz0gYnJhbmNoLm8KK0xJQl9PQkpTICs9IGJ1bmRsZS5vCitMSUJfT0JKUyArPSBjYWNoZS10cmVlLm8KK0xJQl9PQkpTICs9IGNvbG9yLm8KK0xJQl9PQkpTICs9IGNvbWJpbmUtZGlmZi5vCitMSUJfT0JKUyArPSBjb21taXQubworTElCX09CSlMgKz0gY29uZmlnLm8KK0xJQl9PQkpTICs9IGNvbm5lY3QubworTElCX09CSlMgKz0gY29udmVydC5vCitMSUJfT0JKUyArPSBjb3B5Lm8KK0xJQl9PQkpTICs9IGNzdW0tZmlsZS5vCitMSUJfT0JKUyArPSBjdHlwZS5vCitMSUJfT0JKUyArPSBkYXRlLm8KK0xJQl9PQkpTICs9IGRlY29yYXRlLm8KK0xJQl9PQkpTICs9IGRpZmZjb3JlLWJyZWFrLm8KK0xJQl9PQkpTICs9IGRpZmZjb3JlLWRlbHRhLm8KK0xJQl9PQkpTICs9IGRpZmZjb3JlLW9yZGVyLm8KK0xJQl9PQkpTICs9IGRpZmZjb3JlLXBpY2theGUubworTElCX09CSlMgKz0gZGlmZmNvcmUtcmVuYW1lLm8KK0xJQl9PQkpTICs9IGRpZmYtZGVsdGEubworTElCX09CSlMgKz0gZGlmZi1saWIubworTElCX09CSlMgKz0gZGlmZi5vCitMSUJfT0JKUyArPSBkaXIubworTElCX09CSlMgKz0gZW50cnkubworTElCX09CSlMgKz0gZW52aXJvbm1lbnQubworTElCX09CSlMgKz0gZXhlY19jbWQubworTElCX09CSlMgKz0gZnNjay5vCitMSUJfT0JKUyArPSBncmVwLm8KK0xJQl9PQkpTICs9IGhhc2gubworTElCX09CSlMgKz0gaGVscC5vCitMSUJfT0JKUyArPSBpZGVudC5vCitMSUJfT0JKUyArPSBpbnRlcnBvbGF0ZS5vCitMSUJfT0JKUyArPSBsaXN0LW9iamVjdHMubworTElCX09CSlMgKz0gbGwtbWVyZ2UubworTElCX09CSlMgKz0gbG9ja2ZpbGUubworTElCX09CSlMgKz0gbG9nLXRyZWUubworTElCX09CSlMgKz0gbWFpbG1hcC5vCitMSUJfT0JKUyArPSBtYXRjaC10cmVlcy5vCitMSUJfT0JKUyArPSBtZXJnZS1maWxlLm8KK0xJQl9PQkpTICs9IG9iamVjdC5vCitMSUJfT0JKUyArPSBwYWNrLWNoZWNrLm8KK0xJQl9PQkpTICs9IHBhY2stcmV2aW5kZXgubworTElCX09CSlMgKz0gcGFjay13cml0ZS5vCitMSUJfT0JKUyArPSBwYWdlci5vCitMSUJfT0JKUyArPSBwYXJzZS1vcHRpb25zLm8KK0xJQl9PQkpTICs9IHBhdGNoLWRlbHRhLm8KK0xJQl9PQkpTICs9IHBhdGNoLWlkcy5vCitMSUJfT0JKUyArPSBwYXRoLWxpc3QubworTElCX09CSlMgKz0gcGF0aC5vCitMSUJfT0JKUyArPSBwa3QtbGluZS5vCitMSUJfT0JKUyArPSBwcmV0dHkubworTElCX09CSlMgKz0gcHJvZ3Jlc3MubworTElCX09CSlMgKz0gcXVvdGUubworTElCX09CSlMgKz0gcmVhY2hhYmxlLm8KK0xJQl9PQkpTICs9IHJlYWQtY2FjaGUubworTElCX09CSlMgKz0gcmVmbG9nLXdhbGsubworTElCX09CSlMgKz0gcmVmcy5vCitMSUJfT0JKUyArPSByZW1vdGUubworTElCX09CSlMgKz0gcmV2aXNpb24ubworTElCX09CSlMgKz0gcnVuLWNvbW1hbmQubworTElCX09CSlMgKz0gc2VydmVyLWluZm8ubworTElCX09CSlMgKz0gc2V0dXAubworTElCX09CSlMgKz0gc2hhMV9maWxlLm8KK0xJQl9PQkpTICs9IHNoYTFfbmFtZS5vCitMSUJfT0JKUyArPSBzaGFsbG93Lm8KK0xJQl9PQkpTICs9IHNpZGViYW5kLm8KK0xJQl9PQkpTICs9IHN0cmJ1Zi5vCitMSUJfT0JKUyArPSBzeW1saW5rcy5vCitMSUJfT0JKUyArPSB0YWcubworTElCX09CSlMgKz0gdHJhY2UubworTElCX09CSlMgKz0gdHJhbnNwb3J0Lm8KK0xJQl9PQkpTICs9IHRyZWUtZGlmZi5vCitMSUJfT0JKUyArPSB0cmVlLm8KK0xJQl9PQkpTICs9IHRyZWUtd2Fsay5vCitMSUJfT0JKUyArPSB1bnBhY2stdHJlZXMubworTElCX09CSlMgKz0gdXNhZ2UubworTElCX09CSlMgKz0gdXRmOC5vCitMSUJfT0JKUyArPSB3YWxrZXIubworTElCX09CSlMgKz0gd3JpdGVfb3JfZGllLm8KK0xJQl9PQkpTICs9IHdzLm8KK0xJQl9PQkpTICs9IHd0LXN0YXR1cy5vCitMSUJfT0JKUyArPSB4ZGlmZi1pbnRlcmZhY2UubworCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1hZGQubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tYW5ub3RhdGUubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tYXBwbHkubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tYXJjaGl2ZS5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1ibGFtZS5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1icmFuY2gubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tYnVuZGxlLm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLWNhdC1maWxlLm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLWNoZWNrLWF0dHIubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tY2hlY2stcmVmLWZvcm1hdC5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1jaGVja291dC1pbmRleC5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1jaGVja291dC5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1jbGVhbi5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1jb21taXQtdHJlZS5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1jb21taXQubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tY29uZmlnLm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLWNvdW50LW9iamVjdHMubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tZGVzY3JpYmUubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tZGlmZi1maWxlcy5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1kaWZmLWluZGV4Lm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLWRpZmYtdHJlZS5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1kaWZmLm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLWZhc3QtZXhwb3J0Lm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLWZldGNoLS10b29sLm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLWZldGNoLXBhY2subworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tZmV0Y2gubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tZm10LW1lcmdlLW1zZy5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1mb3ItZWFjaC1yZWYubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tZnNjay5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1nYy5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1ncmVwLm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLWluaXQtZGIubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tbG9nLm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLWxzLWZpbGVzLm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLWxzLXJlbW90ZS5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1scy10cmVlLm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLW1haWxpbmZvLm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLW1haWxzcGxpdC5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1tZXJnZS1iYXNlLm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLW1lcmdlLWZpbGUubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tbWVyZ2Utb3Vycy5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1tZXJnZS1yZWN1cnNpdmUubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tbXYubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tbmFtZS1yZXYubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tcGFjay1vYmplY3RzLm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLXBhY2stcmVmcy5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1wcnVuZS1wYWNrZWQubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tcHJ1bmUubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tcHVzaC5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1yZWFkLXRyZWUubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tcmVmbG9nLm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLXJlbW90ZS5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1yZXJlcmUubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tcmVzZXQubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tcmV2LWxpc3QubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tcmV2LXBhcnNlLm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLXJldmVydC5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1ybS5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1zZW5kLXBhY2subworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tc2hvcnRsb2cubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tc2hvdy1icmFuY2gubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tc2hvdy1yZWYubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tc3RyaXBzcGFjZS5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1zeW1ib2xpYy1yZWYubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tdGFnLm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLXRhci10cmVlLm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLXVucGFjay1vYmplY3RzLm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLXVwZGF0ZS1pbmRleC5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi11cGRhdGUtcmVmLm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLXVwbG9hZC1hcmNoaXZlLm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLXZlcmlmeS1wYWNrLm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLXZlcmlmeS10YWcubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4td3JpdGUtdHJlZS5vCisKK0dJVExJQlMgPSAkKExJQl9GSUxFKSAkKFhESUZGX0xJQikKK0VYVExJQlMgPQorCisjCisjIFBsYXRmb3JtIHNwZWNpZmljIHR3ZWFrcworIworCisjIFdlIGNob29zZSB0byBhdm9pZCAiaWYgLi4gZWxzZSBpZiAuLiBlbHNlIC4uIGVuZGlmIGVuZGlmIgorIyBiZWNhdXNlIG1haW50YWluaW5nIHRoZSBuZXN0aW5nIHRvIG1hdGNoIGlzIGEgcGFpbi4gIElmCisjIHdlIGhhZCAiZWxpZiIgdGhpbmdzIHdvdWxkIGhhdmUgYmVlbiBtdWNoIG5pY2VyLi4uCisKK2lmZXEgKCQodW5hbWVfUyksTGludXgpCisJTk9fU1RSTENQWSA9IFllc1BsZWFzZQorZW5kaWYKK2lmZXEgKCQodW5hbWVfUyksR05VL2tGcmVlQlNEKQorCU5PX1NUUkxDUFkgPSBZZXNQbGVhc2UKK2VuZGlmCitpZmVxICgkKHVuYW1lX1MpLERhcndpbikKKwlORUVEU19TU0xfV0lUSF9DUllQVE8gPSBZZXNQbGVhc2UKKwlORUVEU19MSUJJQ09OViA9IFllc1BsZWFzZQorCWlmbmVxICgkKHNoZWxsIGV4cHIgIiQodW5hbWVfUikiIDogJzlcLicpLDIpCisJCU9MRF9JQ09OViA9IFVuZm9ydHVuYXRlbHlZZXMKKwllbmRpZgorCU5PX1NUUkxDUFkgPSBZZXNQbGVhc2UKKwlOT19NRU1NRU0gPSBZZXNQbGVhc2UKK2VuZGlmCitpZmVxICgkKHVuYW1lX1MpLFN1bk9TKQorCU5FRURTX1NPQ0tFVCA9IFllc1BsZWFzZQorCU5FRURTX05TTCA9IFllc1BsZWFzZQorCVNIRUxMX1BBVEggPSAvYmluL2Jhc2gKKwlOT19TVFJDQVNFU1RSID0gWWVzUGxlYXNlCisJTk9fTUVNTUVNID0gWWVzUGxlYXNlCisJTk9fSFNUUkVSUk9SID0gWWVzUGxlYXNlCisJTk9fTUtEVEVNUCA9IFllc1BsZWFzZQorCWlmZXEgKCQodW5hbWVfUiksNS44KQorCQlORUVEU19MSUJJQ09OViA9IFllc1BsZWFzZQorCQlOT19VTlNFVEVOViA9IFllc1BsZWFzZQorCQlOT19TRVRFTlYgPSBZZXNQbGVhc2UKKwkJTk9fQzk5X0ZPUk1BVCA9IFllc1BsZWFzZQorCQlOT19TVFJUT1VNQVggPSBZZXNQbGVhc2UKKwllbmRpZgorCWlmZXEgKCQodW5hbWVfUiksNS45KQorCQlOT19VTlNFVEVOViA9IFllc1BsZWFzZQorCQlOT19TRVRFTlYgPSBZZXNQbGVhc2UKKwkJTk9fQzk5X0ZPUk1BVCA9IFllc1BsZWFzZQorCQlOT19TVFJUT1VNQVggPSBZZXNQbGVhc2UKKwllbmRpZgorCUlOU1RBTEwgPSBnaW5zdGFsbAorCVRBUiA9IGd0YXIKKwlCQVNJQ19DRkxBR1MgKz0gLURfX0VYVEVOU0lPTlNfXworZW5kaWYKK2lmZXEgKCQodW5hbWVfTyksQ3lnd2luKQorCU5PX0RfVFlQRV9JTl9ESVJFTlQgPSBZZXNQbGVhc2UKKwlOT19EX0lOT19JTl9ESVJFTlQgPSBZZXNQbGVhc2UKKwlOT19TVFJDQVNFU1RSID0gWWVzUGxlYXNlCisJTk9fTUVNTUVNID0gWWVzUGxlYXNlCisJTk9fU1lNTElOS19IRUFEID0gWWVzUGxlYXNlCisJTkVFRFNfTElCSUNPTlYgPSBZZXNQbGVhc2UKKwlOT19GQVNUX1dPUktJTkdfRElSRUNUT1JZID0gVW5mb3J0dW5hdGVseVllcworCU5PX1RSVVNUQUJMRV9GSUxFTU9ERSA9IFVuZm9ydHVuYXRlbHlZZXMKKwlPTERfSUNPTlYgPSBVbmZvcnR1bmF0ZWx5WWVzCisJIyBUaGVyZSBhcmUgY29uZmxpY3RpbmcgcmVwb3J0cyBhYm91dCB0aGlzLgorCSMgT24gc29tZSBib3hlcyBOT19NTUFQIGlzIG5lZWRlZCwgYW5kIG5vdCBzbyBlbHNld2hlcmUuCisJIyBUcnkgY29tbWVudGluZyB0aGlzIG91dCBpZiB5b3Ugc3VzcGVjdCBNTUFQIGlzIG1vcmUgZWZmaWNpZW50CisJTk9fTU1BUCA9IFllc1BsZWFzZQorCU5PX0lQVjYgPSBZZXNQbGVhc2UKKwlYID0gLmV4ZQorZW5kaWYKK2lmZXEgKCQodW5hbWVfUyksRnJlZUJTRCkKKwlORUVEU19MSUJJQ09OViA9IFllc1BsZWFzZQorCU5PX01FTU1FTSA9IFllc1BsZWFzZQorCUJBU0lDX0NGTEFHUyArPSAtSS91c3IvbG9jYWwvaW5jbHVkZQorCUJBU0lDX0xERkxBR1MgKz0gLUwvdXNyL2xvY2FsL2xpYgorCURJUl9IQVNfQlNEX0dST1VQX1NFTUFOVElDUyA9IFllc1BsZWFzZQorZW5kaWYKK2lmZXEgKCQodW5hbWVfUyksT3BlbkJTRCkKKwlOT19TVFJDQVNFU1RSID0gWWVzUGxlYXNlCisJTk9fTUVNTUVNID0gWWVzUGxlYXNlCisJTkVFRFNfTElCSUNPTlYgPSBZZXNQbGVhc2UKKwlCQVNJQ19DRkxBR1MgKz0gLUkvdXNyL2xvY2FsL2luY2x1ZGUKKwlCQVNJQ19MREZMQUdTICs9IC1ML3Vzci9sb2NhbC9saWIKK2VuZGlmCitpZmVxICgkKHVuYW1lX1MpLE5ldEJTRCkKKwlpZmVxICgkKHNoZWxsIGV4cHIgIiQodW5hbWVfUikiIDogJ1swMV1cLicpLDIpCisJCU5FRURTX0xJQklDT05WID0gWWVzUGxlYXNlCisJZW5kaWYKKwlCQVNJQ19DRkxBR1MgKz0gLUkvdXNyL3BrZy9pbmNsdWRlCisJQkFTSUNfTERGTEFHUyArPSAtTC91c3IvcGtnL2xpYgorCUFMTF9MREZMQUdTICs9IC1XbCwtcnBhdGgsL3Vzci9wa2cvbGliCitlbmRpZgoraWZlcSAoJCh1bmFtZV9TKSxBSVgpCisJTk9fU1RSQ0FTRVNUUj1ZZXNQbGVhc2UKKwlOT19NRU1NRU0gPSBZZXNQbGVhc2UKKwlOT19TVFJMQ1BZID0gWWVzUGxlYXNlCisJTkVFRFNfTElCSUNPTlY9WWVzUGxlYXNlCitlbmRpZgoraWZlcSAoJCh1bmFtZV9TKSxHTlUpCisJIyBHTlUvSHVyZAorCU5PX1NUUkxDUFk9WWVzUGxlYXNlCitlbmRpZgoraWZlcSAoJCh1bmFtZV9TKSxJUklYNjQpCisJTk9fSVBWNj1ZZXNQbGVhc2UKKwlOT19TRVRFTlY9WWVzUGxlYXNlCisJTk9fU1RSQ0FTRVNUUj1ZZXNQbGVhc2UKKwlOT19NRU1NRU0gPSBZZXNQbGVhc2UKKwlOT19TVFJMQ1BZID0gWWVzUGxlYXNlCisJTk9fU09DS0FERFJfU1RPUkFHRT1ZZXNQbGVhc2UKKwlTSEVMTF9QQVRIPS91c3IvZ251L2Jpbi9iYXNoCisJQkFTSUNfQ0ZMQUdTICs9IC1EUEFUSF9NQVg9MTAyNAorCSMgZm9yIG5vdywgYnVpbGQgMzItYml0IHZlcnNpb24KKwlCQVNJQ19MREZMQUdTICs9IC1ML3Vzci9saWIzMgorZW5kaWYKK2lmZXEgKCQodW5hbWVfUyksSFAtVVgpCisJTk9fSVBWNj1ZZXNQbGVhc2UKKwlOT19TRVRFTlY9WWVzUGxlYXNlCisJTk9fU1RSQ0FTRVNUUj1ZZXNQbGVhc2UKKwlOT19NRU1NRU0gPSBZZXNQbGVhc2UKKwlOT19TVFJMQ1BZID0gWWVzUGxlYXNlCisJTk9fTUtEVEVNUCA9IFllc1BsZWFzZQorCU5PX1VOU0VURU5WID0gWWVzUGxlYXNlCisJTk9fSFNUUkVSUk9SID0gWWVzUGxlYXNlCisJTk9fU1lTX1NFTEVDVF9IID0gWWVzUGxlYXNlCitlbmRpZgoraWZuZXEgKCwkKGZpbmRzdHJpbmcgYXJtLCQodW5hbWVfTSkpKQorCUFSTV9TSEExID0gWWVzUGxlYXNlCitlbmRpZgorCistaW5jbHVkZSBjb25maWcubWFrLmF1dG9nZW4KKy1pbmNsdWRlIGNvbmZpZy5tYWsKKworaWZlcSAoJCh1bmFtZV9TKSxEYXJ3aW4pCisJaWZuZGVmIE5PX0ZJTksKKwkJaWZlcSAoJChzaGVsbCB0ZXN0IC1kIC9zdy9saWIgJiYgZWNobyB5KSx5KQorCQkJQkFTSUNfQ0ZMQUdTICs9IC1JL3N3L2luY2x1ZGUKKwkJCUJBU0lDX0xERkxBR1MgKz0gLUwvc3cvbGliCisJCWVuZGlmCisJZW5kaWYKKwlpZm5kZWYgTk9fREFSV0lOX1BPUlRTCisJCWlmZXEgKCQoc2hlbGwgdGVzdCAtZCAvb3B0L2xvY2FsL2xpYiAmJiBlY2hvIHkpLHkpCisJCQlCQVNJQ19DRkxBR1MgKz0gLUkvb3B0L2xvY2FsL2luY2x1ZGUKKwkJCUJBU0lDX0xERkxBR1MgKz0gLUwvb3B0L2xvY2FsL2xpYgorCQllbmRpZgogCWVuZGlmCiBlbmRpZgogCi1QT19URU1QTEFURSA9IHBvL2dpdGsucG90Ci1BTExfUE9GSUxFUyA9ICQod2lsZGNhcmQgcG8vKi5wbykKLUFMTF9NU0dGSUxFUyA9ICQoc3Vic3QgLnBvLC5tc2csJChBTExfUE9GSUxFUykpCi0KLWlmbmRlZiBWCi0JUVVJRVQgICAgICAgICAgPSBACi0JUVVJRVRfR0VOICAgICAgPSAkKFFVSUVUKWVjaG8gJyAgICcgR0VOICRAICYmCitpZmRlZiBOT19SX1RPX0dDQ19MSU5LRVIKKwkjIFNvbWUgZ2NjIGRvZXMgbm90IGFjY2VwdCBhbmQgcGFzcyAtUiB0byB0aGUgbGlua2VyIHRvIHNwZWNpZnkKKwkjIHRoZSBydW50aW1lIGR5bmFtaWMgbGlicmFyeSBwYXRoLgorCUNDX0xEX0RZTlBBVEggPSAtV2wsLXJwYXRoPQorZWxzZQorCUNDX0xEX0RZTlBBVEggPSAtUgogZW5kaWYKIAotYWxsOjogZ2l0ay13aXNoICQoQUxMX01TR0ZJTEVTKQoraWZkZWYgTk9fQ1VSTAorCUJBU0lDX0NGTEFHUyArPSAtRE5PX0NVUkwKK2Vsc2UKKwlpZmRlZiBDVVJMRElSCisJCSMgVHJ5ICItV2wsLXJwYXRoPSQoQ1VSTERJUikvJChsaWIpIiBpbiBzdWNoIGEgY2FzZS4KKwkJQkFTSUNfQ0ZMQUdTICs9IC1JJChDVVJMRElSKS9pbmNsdWRlCisJCUNVUkxfTElCQ1VSTCA9IC1MJChDVVJMRElSKS8kKGxpYikgJChDQ19MRF9EWU5QQVRIKSQoQ1VSTERJUikvJChsaWIpIC1sY3VybAorCWVsc2UKKwkJQ1VSTF9MSUJDVVJMID0gLWxjdXJsCisJZW5kaWYKKwlCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1odHRwLWZldGNoLm8KKwlFWFRMSUJTICs9ICQoQ1VSTF9MSUJDVVJMKQorCUxJQl9PQkpTICs9IGh0dHAubyBodHRwLXdhbGtlci5vCisJY3VybF9jaGVjayA6PSAkKHNoZWxsIChlY2hvIDA3MDkwODsgY3VybC1jb25maWcgLS12ZXJudW0pIHwgc29ydCAtciB8IHNlZCAtbmUgMnApCisJaWZlcSAiJChjdXJsX2NoZWNrKSIgIjA3MDkwOCIKKwkJaWZuZGVmIE5PX0VYUEFUCisJCQlQUk9HUkFNUyArPSBnaXQtaHR0cC1wdXNoJFgKKwkJZW5kaWYKKwllbmRpZgorCWlmbmRlZiBOT19FWFBBVAorCQlFWFBBVF9MSUJFWFBBVCA9IC1sZXhwYXQKKwllbmRpZgorZW5kaWYKIAotaW5zdGFsbDo6IGFsbAotCSQoSU5TVEFMTCkgZ2l0ay13aXNoICckKERFU1RESVJfU1EpJChiaW5kaXJfU1EpJy9naXRrCi0JJChJTlNUQUxMKSAtZCAnJChERVNURElSX1NRKSQobXNnc2Rpcl9TUSknCi0JJChmb3JlYWNoIHAsJChBTExfTVNHRklMRVMpLCAkKElOU1RBTEwpICRwICckKERFU1RESVJfU1EpJChtc2dzZGlyX1NRKScgJiYpIHRydWUKK2lmZGVmIFpMSUJfUEFUSAorCUJBU0lDX0NGTEFHUyArPSAtSSQoWkxJQl9QQVRIKS9pbmNsdWRlCisJRVhUTElCUyArPSAtTCQoWkxJQl9QQVRIKS8kKGxpYikgJChDQ19MRF9EWU5QQVRIKSQoWkxJQl9QQVRIKS8kKGxpYikKK2VuZGlmCitFWFRMSUJTICs9IC1segogCi11bmluc3RhbGw6OgotCSQoZm9yZWFjaCBwLCQoQUxMX01TR0ZJTEVTKSwgJChSTSkgJyQoREVTVERJUl9TUSkkKG1zZ3NkaXJfU1EpJy8kKG5vdGRpciAkcCkgJiYpIHRydWUKLQkkKFJNKSAnJChERVNURElSX1NRKSQoYmluZGlyX1NRKScvZ2l0aworaWZuZGVmIE5PX09QRU5TU0wKKwlPUEVOU1NMX0xJQlNTTCA9IC1sc3NsCisJaWZkZWYgT1BFTlNTTERJUgorCQlCQVNJQ19DRkxBR1MgKz0gLUkkKE9QRU5TU0xESVIpL2luY2x1ZGUKKwkJT1BFTlNTTF9MSU5LID0gLUwkKE9QRU5TU0xESVIpLyQobGliKSAkKENDX0xEX0RZTlBBVEgpJChPUEVOU1NMRElSKS8kKGxpYikKKwllbHNlCisJCU9QRU5TU0xfTElOSyA9CisJZW5kaWYKK2Vsc2UKKwlCQVNJQ19DRkxBR1MgKz0gLUROT19PUEVOU1NMCisJTU9aSUxMQV9TSEExID0gMQorCU9QRU5TU0xfTElCU1NMID0KK2VuZGlmCitpZmRlZiBORUVEU19TU0xfV0lUSF9DUllQVE8KKwlMSUJfNF9DUllQVE8gPSAkKE9QRU5TU0xfTElOSykgLWxjcnlwdG8gLWxzc2wKK2Vsc2UKKwlMSUJfNF9DUllQVE8gPSAkKE9QRU5TU0xfTElOSykgLWxjcnlwdG8KK2VuZGlmCitpZmRlZiBORUVEU19MSUJJQ09OVgorCWlmZGVmIElDT05WRElSCisJCUJBU0lDX0NGTEFHUyArPSAtSSQoSUNPTlZESVIpL2luY2x1ZGUKKwkJSUNPTlZfTElOSyA9IC1MJChJQ09OVkRJUikvJChsaWIpICQoQ0NfTERfRFlOUEFUSCkkKElDT05WRElSKS8kKGxpYikKKwllbHNlCisJCUlDT05WX0xJTksgPQorCWVuZGlmCisJRVhUTElCUyArPSAkKElDT05WX0xJTkspIC1saWNvbnYKK2VuZGlmCitpZmRlZiBORUVEU19TT0NLRVQKKwlFWFRMSUJTICs9IC1sc29ja2V0CitlbmRpZgoraWZkZWYgTkVFRFNfTlNMCisJRVhUTElCUyArPSAtbG5zbAorZW5kaWYKK2lmZGVmIE5PX0RfVFlQRV9JTl9ESVJFTlQKKwlCQVNJQ19DRkxBR1MgKz0gLUROT19EX1RZUEVfSU5fRElSRU5UCitlbmRpZgoraWZkZWYgTk9fRF9JTk9fSU5fRElSRU5UCisJQkFTSUNfQ0ZMQUdTICs9IC1ETk9fRF9JTk9fSU5fRElSRU5UCitlbmRpZgoraWZkZWYgTk9fQzk5X0ZPUk1BVAorCUJBU0lDX0NGTEFHUyArPSAtRE5PX0M5OV9GT1JNQVQKK2VuZGlmCitpZmRlZiBTTlBSSU5URl9SRVRVUk5TX0JPR1VTCisJQ09NUEFUX0NGTEFHUyArPSAtRFNOUFJJTlRGX1JFVFVSTlNfQk9HVVMKKwlDT01QQVRfT0JKUyArPSBjb21wYXQvc25wcmludGYubworZW5kaWYKK2lmZGVmIEZSRUFEX1JFQURTX0RJUkVDVE9SSUVTCisJQ09NUEFUX0NGTEFHUyArPSAtREZSRUFEX1JFQURTX0RJUkVDVE9SSUVTCisJQ09NUEFUX09CSlMgKz0gY29tcGF0L2ZvcGVuLm8KK2VuZGlmCitpZmRlZiBOT19TWU1MSU5LX0hFQUQKKwlCQVNJQ19DRkxBR1MgKz0gLUROT19TWU1MSU5LX0hFQUQKK2VuZGlmCitpZmRlZiBOT19TVFJDQVNFU1RSCisJQ09NUEFUX0NGTEFHUyArPSAtRE5PX1NUUkNBU0VTVFIKKwlDT01QQVRfT0JKUyArPSBjb21wYXQvc3RyY2FzZXN0ci5vCitlbmRpZgoraWZkZWYgTk9fU1RSTENQWQorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19TVFJMQ1BZCisJQ09NUEFUX09CSlMgKz0gY29tcGF0L3N0cmxjcHkubworZW5kaWYKK2lmZGVmIE5PX1NUUlRPVU1BWAorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19TVFJUT1VNQVgKKwlDT01QQVRfT0JKUyArPSBjb21wYXQvc3RydG91bWF4Lm8KK2VuZGlmCitpZmRlZiBOT19TVFJUT1VMTAorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19TVFJUT1VMTAorZW5kaWYKK2lmZGVmIE5PX1NFVEVOVgorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19TRVRFTlYKKwlDT01QQVRfT0JKUyArPSBjb21wYXQvc2V0ZW52Lm8KK2VuZGlmCitpZmRlZiBOT19NS0RURU1QCisJQ09NUEFUX0NGTEFHUyArPSAtRE5PX01LRFRFTVAKKwlDT01QQVRfT0JKUyArPSBjb21wYXQvbWtkdGVtcC5vCitlbmRpZgoraWZkZWYgTk9fVU5TRVRFTlYKKwlDT01QQVRfQ0ZMQUdTICs9IC1ETk9fVU5TRVRFTlYKKwlDT01QQVRfT0JKUyArPSBjb21wYXQvdW5zZXRlbnYubworZW5kaWYKK2lmZGVmIE5PX1NZU19TRUxFQ1RfSAorCUJBU0lDX0NGTEFHUyArPSAtRE5PX1NZU19TRUxFQ1RfSAorZW5kaWYKK2lmZGVmIE5PX01NQVAKKwlDT01QQVRfQ0ZMQUdTICs9IC1ETk9fTU1BUAorCUNPTVBBVF9PQkpTICs9IGNvbXBhdC9tbWFwLm8KK2VuZGlmCitpZmRlZiBOT19QUkVBRAorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19QUkVBRAorCUNPTVBBVF9PQkpTICs9IGNvbXBhdC9wcmVhZC5vCitlbmRpZgoraWZkZWYgTk9fRkFTVF9XT1JLSU5HX0RJUkVDVE9SWQorCUJBU0lDX0NGTEFHUyArPSAtRE5PX0ZBU1RfV09SS0lOR19ESVJFQ1RPUlkKK2VuZGlmCitpZmRlZiBOT19UUlVTVEFCTEVfRklMRU1PREUKKwlCQVNJQ19DRkxBR1MgKz0gLUROT19UUlVTVEFCTEVfRklMRU1PREUKK2VuZGlmCitpZmRlZiBOT19JUFY2CisJQkFTSUNfQ0ZMQUdTICs9IC1ETk9fSVBWNgorZW5kaWYKK2lmZGVmIE5PX1NPQ0tBRERSX1NUT1JBR0UKK2lmZGVmIE5PX0lQVjYKKwlCQVNJQ19DRkxBR1MgKz0gLURzb2NrYWRkcl9zdG9yYWdlPXNvY2thZGRyX2luCitlbHNlCisJQkFTSUNfQ0ZMQUdTICs9IC1Ec29ja2FkZHJfc3RvcmFnZT1zb2NrYWRkcl9pbjYKK2VuZGlmCitlbmRpZgoraWZkZWYgTk9fSU5FVF9OVE9QCisJTElCX09CSlMgKz0gY29tcGF0L2luZXRfbnRvcC5vCitlbmRpZgoraWZkZWYgTk9fSU5FVF9QVE9OCisJTElCX09CSlMgKz0gY29tcGF0L2luZXRfcHRvbi5vCitlbmRpZgogCi1jbGVhbjo6Ci0JJChSTSkgZ2l0ay13aXNoIHBvLyoubXNnCitpZmRlZiBOT19JQ09OVgorCUJBU0lDX0NGTEFHUyArPSAtRE5PX0lDT05WCitlbmRpZgogCi1naXRrLXdpc2g6IGdpdGsKK2lmZGVmIE9MRF9JQ09OVgorCUJBU0lDX0NGTEFHUyArPSAtRE9MRF9JQ09OVgorZW5kaWYKKworaWZkZWYgTk9fREVGTEFURV9CT1VORAorCUJBU0lDX0NGTEFHUyArPSAtRE5PX0RFRkxBVEVfQk9VTkQKK2VuZGlmCisKK2lmZGVmIFBQQ19TSEExCisJU0hBMV9IRUFERVIgPSAicHBjL3NoYTEuaCIKKwlMSUJfT0JKUyArPSBwcGMvc2hhMS5vIHBwYy9zaGExcHBjLm8KK2Vsc2UKK2lmZGVmIEFSTV9TSEExCisJU0hBMV9IRUFERVIgPSAiYXJtL3NoYTEuaCIKKwlMSUJfT0JKUyArPSBhcm0vc2hhMS5vIGFybS9zaGExX2FybS5vCitlbHNlCitpZmRlZiBNT1pJTExBX1NIQTEKKwlTSEExX0hFQURFUiA9ICJtb3ppbGxhLXNoYTEvc2hhMS5oIgorCUxJQl9PQkpTICs9IG1vemlsbGEtc2hhMS9zaGExLm8KK2Vsc2UKKwlTSEExX0hFQURFUiA9IDxvcGVuc3NsL3NoYS5oPgorCUVYVExJQlMgKz0gJChMSUJfNF9DUllQVE8pCitlbmRpZgorZW5kaWYKK2VuZGlmCitpZmRlZiBOT19QRVJMX01BS0VNQUtFUgorCWV4cG9ydCBOT19QRVJMX01BS0VNQUtFUgorZW5kaWYKK2lmZGVmIE5PX0hTVFJFUlJPUgorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19IU1RSRVJST1IKKwlDT01QQVRfT0JKUyArPSBjb21wYXQvaHN0cmVycm9yLm8KK2VuZGlmCitpZmRlZiBOT19NRU1NRU0KKwlDT01QQVRfQ0ZMQUdTICs9IC1ETk9fTUVNTUVNCisJQ09NUEFUX09CSlMgKz0gY29tcGF0L21lbW1lbS5vCitlbmRpZgoraWZkZWYgSU5URVJOQUxfUVNPUlQKKwlDT01QQVRfQ0ZMQUdTICs9IC1ESU5URVJOQUxfUVNPUlQKKwlDT01QQVRfT0JKUyArPSBjb21wYXQvcXNvcnQubworZW5kaWYKKworaWZkZWYgVEhSRUFERURfREVMVEFfU0VBUkNICisJQkFTSUNfQ0ZMQUdTICs9IC1EVEhSRUFERURfREVMVEFfU0VBUkNICisJRVhUTElCUyArPSAtbHB0aHJlYWQKKwlMSUJfT0JKUyArPSB0aHJlYWQtdXRpbHMubworZW5kaWYKK2lmZGVmIERJUl9IQVNfQlNEX0dST1VQX1NFTUFOVElDUworCUNPTVBBVF9DRkxBR1MgKz0gLURESVJfSEFTX0JTRF9HUk9VUF9TRU1BTlRJQ1MKK2VuZGlmCitpZmRlZiBOT19FWFRFUk5BTF9HUkVQCisJQkFTSUNfQ0ZMQUdTICs9IC1ETk9fRVhURVJOQUxfR1JFUAorZW5kaWYKKworaWZlcSAoJChUQ0xUS19QQVRIKSwpCitOT19UQ0xUSz1Ob1RoYW5rcworZW5kaWYKKworUVVJRVRfU1VCRElSMCAgPSArJChNQUtFKSAtQyAjIHNwYWNlIHRvIHNlcGFyYXRlIC1DIGFuZCBzdWJkaXIKK1FVSUVUX1NVQkRJUjEgID0KKworaWZuZXEgKCQoZmluZHN0cmluZyAkKE1BS0VGTEFHUyksdyksdykKK1BSSU5UX0RJUiA9IC0tbm8tcHJpbnQtZGlyZWN0b3J5CitlbHNlICMgIm1ha2UgLXciCitOT19TVUJESVIgPSA6CitlbmRpZgorCitpZm5lcSAoJChmaW5kc3RyaW5nICQoTUFLRUZMQUdTKSxzKSxzKQoraWZuZGVmIFYKKwlRVUlFVF9DQyAgICAgICA9IEBlY2hvICcgICAnIENDICRAOworCVFVSUVUX0FSICAgICAgID0gQGVjaG8gJyAgICcgQVIgJEA7CisJUVVJRVRfTElOSyAgICAgPSBAZWNobyAnICAgJyBMSU5LICRAOworCVFVSUVUX0JVSUxUX0lOID0gQGVjaG8gJyAgICcgQlVJTFRJTiAkQDsKKwlRVUlFVF9HRU4gICAgICA9IEBlY2hvICcgICAnIEdFTiAkQDsKKwlRVUlFVF9TVUJESVIwICA9ICtAc3ViZGlyPQorCVFVSUVUX1NVQkRJUjEgID0gOyQoTk9fU1VCRElSKSBlY2hvICcgICAnIFNVQkRJUiAkJHN1YmRpcjsgXAorCQkJICQoTUFLRSkgJChQUklOVF9ESVIpIC1DICQkc3ViZGlyCisJZXhwb3J0IFYKKwlleHBvcnQgUVVJRVRfR0VOCisJZXhwb3J0IFFVSUVUX0JVSUxUX0lOCitlbmRpZgorZW5kaWYKKworaWZkZWYgQVNDSUlET0M4CisJZXhwb3J0IEFTQ0lJRE9DOAorZW5kaWYKKworIyBTaGVsbCBxdW90ZSAoZG8gbm90IHVzZSAkKGNhbGwpIHRvIGFjY29tbW9kYXRlIGFuY2llbnQgc2V0dXBzKTsKKworU0hBMV9IRUFERVJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKFNIQTFfSEVBREVSKSkKK0VUQ19HSVRDT05GSUdfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKEVUQ19HSVRDT05GSUcpKQorCitERVNURElSX1NRID0gJChzdWJzdCAnLCdcJycsJChERVNURElSKSkKK2JpbmRpcl9TUSA9ICQoc3Vic3QgJywnXCcnLCQoYmluZGlyKSkKK21hbmRpcl9TUSA9ICQoc3Vic3QgJywnXCcnLCQobWFuZGlyKSkKK2luZm9kaXJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKGluZm9kaXIpKQorZ2l0ZXhlY2Rpcl9TUSA9ICQoc3Vic3QgJywnXCcnLCQoZ2l0ZXhlY2RpcikpCit0ZW1wbGF0ZV9kaXJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKHRlbXBsYXRlX2RpcikpCitodG1sZGlyX1NRID0gJChzdWJzdCAnLCdcJycsJChodG1sZGlyKSkKK3ByZWZpeF9TUSA9ICQoc3Vic3QgJywnXCcnLCQocHJlZml4KSkKKworU0hFTExfUEFUSF9TUSA9ICQoc3Vic3QgJywnXCcnLCQoU0hFTExfUEFUSCkpCitQRVJMX1BBVEhfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKFBFUkxfUEFUSCkpCitUQ0xUS19QQVRIX1NRID0gJChzdWJzdCAnLCdcJycsJChUQ0xUS19QQVRIKSkKKworTElCUyA9ICQoR0lUTElCUykgJChFWFRMSUJTKQorCitCQVNJQ19DRkxBR1MgKz0gLURTSEExX0hFQURFUj0nJChTSEExX0hFQURFUl9TUSknIFwKKwkkKENPTVBBVF9DRkxBR1MpCitMSUJfT0JKUyArPSAkKENPTVBBVF9PQkpTKQorCitBTExfQ0ZMQUdTICs9ICQoQkFTSUNfQ0ZMQUdTKQorQUxMX0xERkxBR1MgKz0gJChCQVNJQ19MREZMQUdTKQorCitleHBvcnQgVEFSIElOU1RBTEwgREVTVERJUiBTSEVMTF9QQVRICisKKworIyMjIEJ1aWxkIHJ1bGVzCisKK2FsbDo6ICQoQUxMX1BST0dSQU1TKSAkKEJVSUxUX0lOUykgJChPVEhFUl9QUk9HUkFNUykgR0lULUJVSUxELU9QVElPTlMKK2lmbmVxICgsJFgpCisJJChmb3JlYWNoIHAsJChwYXRzdWJzdCAlJFgsJSwkKGZpbHRlciAlJFgsJChBTExfUFJPR1JBTVMpICQoQlVJTFRfSU5TKSBnaXQkWCkpLCAkKFJNKSAnJHAnOykKK2VuZGlmCisKK2FsbDo6CitpZm5kZWYgTk9fVENMVEsKKwkkKFFVSUVUX1NVQkRJUjApZ2l0LWd1aSAkKFFVSUVUX1NVQkRJUjEpIGFsbAorCSQoUVVJRVRfU1VCRElSMClnaXRrLWdpdCAkKFFVSUVUX1NVQkRJUjEpIGFsbAorZW5kaWYKKwkkKFFVSUVUX1NVQkRJUjApcGVybCAkKFFVSUVUX1NVQkRJUjEpIFBFUkxfUEFUSD0nJChQRVJMX1BBVEhfU1EpJyBwcmVmaXg9JyQocHJlZml4X1NRKScgYWxsCisJJChRVUlFVF9TVUJESVIwKXRlbXBsYXRlcyAkKFFVSUVUX1NVQkRJUjEpCisKK3N0cmlwOiAkKFBST0dSQU1TKSBnaXQkWAorCSQoU1RSSVApICQoU1RSSVBfT1BUUykgJChQUk9HUkFNUykgZ2l0JFgKKworZ2l0Lm86IGdpdC5jIGNvbW1vbi1jbWRzLmggR0lULUNGTEFHUworCSQoUVVJRVRfQ0MpJChDQykgLURHSVRfVkVSU0lPTj0nIiQoR0lUX1ZFUlNJT04pIicgXAorCQkkKEFMTF9DRkxBR1MpIC1jICQoZmlsdGVyICUuYywkXikKKworZ2l0JFg6IGdpdC5vICQoQlVJTFRJTl9PQkpTKSAkKEdJVExJQlMpCisJJChRVUlFVF9MSU5LKSQoQ0MpICQoQUxMX0NGTEFHUykgLW8gJEAgZ2l0Lm8gXAorCQkkKEJVSUxUSU5fT0JKUykgJChBTExfTERGTEFHUykgJChMSUJTKQorCitoZWxwLm86IGhlbHAuYyBjb21tb24tY21kcy5oIEdJVC1DRkxBR1MKKwkkKFFVSUVUX0NDKSQoQ0MpIC1vICQqLm8gLWMgJChBTExfQ0ZMQUdTKSBcCisJCSctREdJVF9IVE1MX1BBVEg9IiQoaHRtbGRpcl9TUSkiJyBcCisJCSctREdJVF9NQU5fUEFUSD0iJChtYW5kaXJfU1EpIicgXAorCQknLURHSVRfSU5GT19QQVRIPSIkKGluZm9kaXJfU1EpIicgJDwKKworJChCVUlMVF9JTlMpOiBnaXQkWAorCSQoUVVJRVRfQlVJTFRfSU4pJChSTSkgJEAgJiYgbG4gZ2l0JFggJEAKKworY29tbW9uLWNtZHMuaDogLi9nZW5lcmF0ZS1jbWRsaXN0LnNoIGNvbW1hbmQtbGlzdC50eHQKKworY29tbW9uLWNtZHMuaDogJCh3aWxkY2FyZCBEb2N1bWVudGF0aW9uL2dpdC0qLnR4dCkKKwkkKFFVSUVUX0dFTikuL2dlbmVyYXRlLWNtZGxpc3Quc2ggPiAkQCsgJiYgbXYgJEArICRACisKKyQocGF0c3Vic3QgJS5zaCwlLCQoU0NSSVBUX1NIKSkgOiAlIDogJS5zaAogCSQoUVVJRVRfR0VOKSQoUk0pICRAICRAKyAmJiBcCi0Jc2VkIC1lICcxLDNzfF5leGVjIC4qICIkJDAifGV4ZWMgJChzdWJzdCB8LCdcfCcsJChUQ0xUS19QQVRIX1NRKSkgIiQkMCJ8JyA8Z2l0ayA+JEArICYmIFwKKwlzZWQgLWUgJzFzfCMhLiovc2h8IyEkKFNIRUxMX1BBVEhfU1EpfCcgXAorCSAgICAtZSAnc3xAU0hFTExfUEFUSEB8JChTSEVMTF9QQVRIX1NRKXwnIFwKKwkgICAgLWUgJ3N8QEBQRVJMQEB8JChQRVJMX1BBVEhfU1EpfGcnIFwKKwkgICAgLWUgJ3MvQEBHSVRfVkVSU0lPTkBALyQoR0lUX1ZFUlNJT04pL2cnIFwKKwkgICAgLWUgJ3MvQEBOT19DVVJMQEAvJChOT19DVVJMKS9nJyBcCisJICAgICRALnNoID4kQCsgJiYgXAogCWNobW9kICt4ICRAKyAmJiBcCi0JbXYgLWYgJEArICRACisJbXYgJEArICRACiAKLSQoUE9fVEVNUExBVEUpOiBnaXRrCi0JJChYR0VUVEVYVCkgLWttYyAtTFRjbCAtbyAkQCBnaXRrCi11cGRhdGUtcG86OiAkKFBPX1RFTVBMQVRFKQotCSQoZm9yZWFjaCBwLCAkKEFMTF9QT0ZJTEVTKSwgZWNobyBVcGRhdGluZyAkcCA7IG1zZ21lcmdlIC1VICRwICQoUE9fVEVNUExBVEUpIDsgKQotJChBTExfTVNHRklMRVMpOiAlLm1zZyA6ICUucG8KLQlAZWNobyBHZW5lcmF0aW5nIGNhdGFsb2cgJEAKLQkkKE1TR0ZNVCkgLS1zdGF0aXN0aWNzIC0tdGNsICQ8IC1sICQoYmFzZW5hbWUgJChub3RkaXIgJDwpKSAtZCAkKGRpciAkQCkKKyQocGF0c3Vic3QgJS5wZXJsLCUsJChTQ1JJUFRfUEVSTCkpOiBwZXJsL3BlcmwubWFrCisKK3BlcmwvcGVybC5tYWs6IEdJVC1DRkxBR1MgcGVybC9NYWtlZmlsZSBwZXJsL01ha2VmaWxlLlBMCisJJChRVUlFVF9TVUJESVIwKXBlcmwgJChRVUlFVF9TVUJESVIxKSBQRVJMX1BBVEg9JyQoUEVSTF9QQVRIX1NRKScgcHJlZml4PSckKHByZWZpeF9TUSknICQoQEYpCisKKyQocGF0c3Vic3QgJS5wZXJsLCUsJChTQ1JJUFRfUEVSTCkpOiAlIDogJS5wZXJsCisJJChRVUlFVF9HRU4pJChSTSkgJEAgJEArICYmIFwKKwlJTlNUTElCRElSPWBNQUtFRkxBR1M9ICQoTUFLRSkgLUMgcGVybCAtcyAtLW5vLXByaW50LWRpcmVjdG9yeSBpbnN0bGliZGlyYCAmJiBcCisJc2VkIC1lICcxeycgXAorCSAgICAtZSAnCXN8IyEuKnBlcmx8IyEkKFBFUkxfUEFUSF9TUSl8JyBcCisJICAgIC1lICcJaCcgXAorCSAgICAtZSAnCXM9Lio9dXNlIGxpYiAoc3BsaXQoLzovLCAkJEVOVntHSVRQRVJMTElCfSB8fCAiQEBJTlNUTElCRElSQEAiKSk7PScgXAorCSAgICAtZSAnCUgnIFwKKwkgICAgLWUgJwl4JyBcCisJICAgIC1lICd9JyBcCisJICAgIC1lICdzfEBASU5TVExJQkRJUkBAfCciJCRJTlNUTElCRElSIid8ZycgXAorCSAgICAtZSAncy9AQEdJVF9WRVJTSU9OQEAvJChHSVRfVkVSU0lPTikvZycgXAorCSAgICAkQC5wZXJsID4kQCsgJiYgXAorCWNobW9kICt4ICRAKyAmJiBcCisJbXYgJEArICRACisKK2dpdHdlYi9naXR3ZWIuY2dpOiBnaXR3ZWIvZ2l0d2ViLnBlcmwKKwkkKFFVSUVUX0dFTikkKFJNKSAkQCAkQCsgJiYgXAorCXNlZCAtZSAnMXN8IyEuKnBlcmx8IyEkKFBFUkxfUEFUSF9TUSl8JyBcCisJICAgIC1lICdzfCsrR0lUX1ZFUlNJT04rK3wkKEdJVF9WRVJTSU9OKXxnJyBcCisJICAgIC1lICdzfCsrR0lUX0JJTkRJUisrfCQoYmluZGlyKXxnJyBcCisJICAgIC1lICdzfCsrR0lUV0VCX0NPTkZJRysrfCQoR0lUV0VCX0NPTkZJRyl8ZycgXAorCSAgICAtZSAnc3wrK0dJVFdFQl9IT01FX0xJTktfU1RSKyt8JChHSVRXRUJfSE9NRV9MSU5LX1NUUil8ZycgXAorCSAgICAtZSAnc3wrK0dJVFdFQl9TSVRFTkFNRSsrfCQoR0lUV0VCX1NJVEVOQU1FKXxnJyBcCisJICAgIC1lICdzfCsrR0lUV0VCX1BST0pFQ1RST09UKyt8JChHSVRXRUJfUFJPSkVDVFJPT1QpfGcnIFwKKwkgICAgLWUgJ3N8IisrR0lUV0VCX1BST0pFQ1RfTUFYREVQVEgrKyJ8JChHSVRXRUJfUFJPSkVDVF9NQVhERVBUSCl8ZycgXAorCSAgICAtZSAnc3wrK0dJVFdFQl9FWFBPUlRfT0srK3wkKEdJVFdFQl9FWFBPUlRfT0spfGcnIFwKKwkgICAgLWUgJ3N8KytHSVRXRUJfU1RSSUNUX0VYUE9SVCsrfCQoR0lUV0VCX1NUUklDVF9FWFBPUlQpfGcnIFwKKwkgICAgLWUgJ3N8KytHSVRXRUJfQkFTRV9VUkwrK3wkKEdJVFdFQl9CQVNFX1VSTCl8ZycgXAorCSAgICAtZSAnc3wrK0dJVFdFQl9MSVNUKyt8JChHSVRXRUJfTElTVCl8ZycgXAorCSAgICAtZSAnc3wrK0dJVFdFQl9IT01FVEVYVCsrfCQoR0lUV0VCX0hPTUVURVhUKXxnJyBcCisJICAgIC1lICdzfCsrR0lUV0VCX0NTUysrfCQoR0lUV0VCX0NTUyl8ZycgXAorCSAgICAtZSAnc3wrK0dJVFdFQl9MT0dPKyt8JChHSVRXRUJfTE9HTyl8ZycgXAorCSAgICAtZSAnc3wrK0dJVFdFQl9GQVZJQ09OKyt8JChHSVRXRUJfRkFWSUNPTil8ZycgXAorCSAgICAtZSAnc3wrK0dJVFdFQl9TSVRFX0hFQURFUisrfCQoR0lUV0VCX1NJVEVfSEVBREVSKXxnJyBcCisJICAgIC1lICdzfCsrR0lUV0VCX1NJVEVfRk9PVEVSKyt8JChHSVRXRUJfU0lURV9GT09URVIpfGcnIFwKKwkgICAgJDwgPiRAKyAmJiBcCisJY2htb2QgK3ggJEArICYmIFwKKwltdiAkQCsgJEAKKworZ2l0LWluc3Rhd2ViOiBnaXQtaW5zdGF3ZWIuc2ggZ2l0d2ViL2dpdHdlYi5jZ2kgZ2l0d2ViL2dpdHdlYi5jc3MKKwkkKFFVSUVUX0dFTikkKFJNKSAkQCAkQCsgJiYgXAorCXNlZCAtZSAnMXN8IyEuKi9zaHwjISQoU0hFTExfUEFUSF9TUSl8JyBcCisJICAgIC1lICdzL0BAR0lUX1ZFUlNJT05AQC8kKEdJVF9WRVJTSU9OKS9nJyBcCisJICAgIC1lICdzL0BATk9fQ1VSTEBALyQoTk9fQ1VSTCkvZycgXAorCSAgICAtZSAnL0BAR0lUV0VCX0NHSUBAL3IgZ2l0d2ViL2dpdHdlYi5jZ2knIFwKKwkgICAgLWUgJy9AQEdJVFdFQl9DR0lAQC9kJyBcCisJICAgIC1lICcvQEBHSVRXRUJfQ1NTQEAvciBnaXR3ZWIvZ2l0d2ViLmNzcycgXAorCSAgICAtZSAnL0BAR0lUV0VCX0NTU0BAL2QnIFwKKwkgICAgLWUgJ3N8QEBQRVJMQEB8JChQRVJMX1BBVEhfU1EpfGcnIFwKKwkgICAgJEAuc2ggPiAkQCsgJiYgXAorCWNobW9kICt4ICRAKyAmJiBcCisJbXYgJEArICRACisKK2NvbmZpZ3VyZTogY29uZmlndXJlLmFjCisJJChRVUlFVF9HRU4pJChSTSkgJEAgJDwrICYmIFwKKwlzZWQgLWUgJ3MvQEBHSVRfVkVSU0lPTkBALyQoR0lUX1ZFUlNJT04pL2cnIFwKKwkgICAgJDwgPiAkPCsgJiYgXAorCWF1dG9jb25mIC1vICRAICQ8KyAmJiBcCisJJChSTSkgJDwrCisKKyMgVGhlc2UgY2FuIHJlY29yZCBHSVRfVkVSU0lPTgorZ2l0Lm8gZ2l0LnNwZWMgXAorCSQocGF0c3Vic3QgJS5zaCwlLCQoU0NSSVBUX1NIKSkgXAorCSQocGF0c3Vic3QgJS5wZXJsLCUsJChTQ1JJUFRfUEVSTCkpIFwKKwk6IEdJVC1WRVJTSU9OLUZJTEUKKworJS5vOiAlLmMgR0lULUNGTEFHUworCSQoUVVJRVRfQ0MpJChDQykgLW8gJCoubyAtYyAkKEFMTF9DRkxBR1MpICQ8CislLnM6ICUuYyBHSVQtQ0ZMQUdTCisJJChRVUlFVF9DQykkKENDKSAtUyAkKEFMTF9DRkxBR1MpICQ8CislLm86ICUuUworCSQoUVVJRVRfQ0MpJChDQykgLW8gJCoubyAtYyAkKEFMTF9DRkxBR1MpICQ8CisKK2V4ZWNfY21kLm86IGV4ZWNfY21kLmMgR0lULUNGTEFHUworCSQoUVVJRVRfQ0MpJChDQykgLW8gJCoubyAtYyAkKEFMTF9DRkxBR1MpICctREdJVF9FWEVDX1BBVEg9IiQoZ2l0ZXhlY2Rpcl9TUSkiJyAkPAorYnVpbHRpbi1pbml0LWRiLm86IGJ1aWx0aW4taW5pdC1kYi5jIEdJVC1DRkxBR1MKKwkkKFFVSUVUX0NDKSQoQ0MpIC1vICQqLm8gLWMgJChBTExfQ0ZMQUdTKSAtRERFRkFVTFRfR0lUX1RFTVBMQVRFX0RJUj0nIiQodGVtcGxhdGVfZGlyX1NRKSInICQ8CisKK2NvbmZpZy5vOiBjb25maWcuYyBHSVQtQ0ZMQUdTCisJJChRVUlFVF9DQykkKENDKSAtbyAkKi5vIC1jICQoQUxMX0NGTEFHUykgLURFVENfR0lUQ09ORklHPSciJChFVENfR0lUQ09ORklHX1NRKSInICQ8CisKK2h0dHAubzogaHR0cC5jIEdJVC1DRkxBR1MKKwkkKFFVSUVUX0NDKSQoQ0MpIC1vICQqLm8gLWMgJChBTExfQ0ZMQUdTKSAtREdJVF9VU0VSX0FHRU5UPSciZ2l0LyQoR0lUX1ZFUlNJT04pIicgJDwKKworaWZkZWYgTk9fRVhQQVQKK2h0dHAtd2Fsa2VyLm86IGh0dHAtd2Fsa2VyLmMgaHR0cC5oIEdJVC1DRkxBR1MKKwkkKFFVSUVUX0NDKSQoQ0MpIC1vICQqLm8gLWMgJChBTExfQ0ZMQUdTKSAtRE5PX0VYUEFUICQ8CitlbmRpZgorCitnaXQtJSRYOiAlLm8gJChHSVRMSUJTKQorCSQoUVVJRVRfTElOSykkKENDKSAkKEFMTF9DRkxBR1MpIC1vICRAICQoQUxMX0xERkxBR1MpICQoZmlsdGVyICUubywkXikgJChMSUJTKQorCitnaXQtaW1hcC1zZW5kJFg6IGltYXAtc2VuZC5vICQoTElCX0ZJTEUpCisKK2h0dHAubyBodHRwLXdhbGtlci5vIGh0dHAtcHVzaC5vIHRyYW5zcG9ydC5vOiBodHRwLmgKKworZ2l0LWh0dHAtcHVzaCRYOiByZXZpc2lvbi5vIGh0dHAubyBodHRwLXB1c2gubyAkKEdJVExJQlMpCisJJChRVUlFVF9MSU5LKSQoQ0MpICQoQUxMX0NGTEFHUykgLW8gJEAgJChBTExfTERGTEFHUykgJChmaWx0ZXIgJS5vLCReKSBcCisJCSQoTElCUykgJChDVVJMX0xJQkNVUkwpICQoRVhQQVRfTElCRVhQQVQpCisKKyQoTElCX09CSlMpICQoQlVJTFRJTl9PQkpTKTogJChMSUJfSCkKKyQocGF0c3Vic3QgZ2l0LSUkWCwlLm8sJChQUk9HUkFNUykpOiAkKExJQl9IKSAkKHdpbGRjYXJkICovKi5oKQorYnVpbHRpbi1yZXZlcnQubyB3dC1zdGF0dXMubzogd3Qtc3RhdHVzLmgKKworJChMSUJfRklMRSk6ICQoTElCX09CSlMpCisJJChRVUlFVF9BUikkKFJNKSAkQCAmJiAkKEFSKSByY3MgJEAgJChMSUJfT0JKUykKKworWERJRkZfT0JKUz14ZGlmZi94ZGlmZmkubyB4ZGlmZi94cHJlcGFyZS5vIHhkaWZmL3h1dGlscy5vIHhkaWZmL3hlbWl0Lm8gXAorCXhkaWZmL3htZXJnZS5vCiskKFhESUZGX09CSlMpOiB4ZGlmZi94aW5jbHVkZS5oIHhkaWZmL3htYWNyb3MuaCB4ZGlmZi94ZGlmZi5oIHhkaWZmL3h0eXBlcy5oIFwKKwl4ZGlmZi94dXRpbHMuaCB4ZGlmZi94cHJlcGFyZS5oIHhkaWZmL3hkaWZmaS5oIHhkaWZmL3hlbWl0LmgKKworJChYRElGRl9MSUIpOiAkKFhESUZGX09CSlMpCisJJChRVUlFVF9BUikkKFJNKSAkQCAmJiAkKEFSKSByY3MgJEAgJChYRElGRl9PQkpTKQorCisKK2RvYzoKKwkkKE1BS0UpIC1DIERvY3VtZW50YXRpb24gYWxsCisKK2luZm86CisJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uIGluZm8KKworVEFHUzoKKwkkKFJNKSBUQUdTCisJJChGSU5EKSAuIC1uYW1lICcqLltoY1NdJyAtcHJpbnQgfCB4YXJncyBldGFncyAtYQorCit0YWdzOgorCSQoUk0pIHRhZ3MKKwkkKEZJTkQpIC4gLW5hbWUgJyouW2hjU10nIC1wcmludCB8IHhhcmdzIGN0YWdzIC1hCisKK2NzY29wZToKKwkkKFJNKSBjc2NvcGUqCisJJChGSU5EKSAuIC1uYW1lICcqLltoY1NdJyAtcHJpbnQgfCB4YXJncyBjc2NvcGUgLWIKKworIyMjIERldGVjdCBwcmVmaXggY2hhbmdlcworVFJBQ0tfQ0ZMQUdTID0gJChzdWJzdCAnLCdcJycsJChBTExfQ0ZMQUdTKSk6XAorICAgICAgICAgICAgICQoYmluZGlyX1NRKTokKGdpdGV4ZWNkaXJfU1EpOiQodGVtcGxhdGVfZGlyX1NRKTokKHByZWZpeF9TUSkKKworR0lULUNGTEFHUzogLkZPUkNFLUdJVC1DRkxBR1MKKwlARkxBR1M9JyQoVFJBQ0tfQ0ZMQUdTKSc7IFwKKwkgICAgaWYgdGVzdCB4IiQkRkxBR1MiICE9IHgiYGNhdCBHSVQtQ0ZMQUdTIDI+L2Rldi9udWxsYCIgOyB0aGVuIFwKKwkJZWNobyAxPiYyICIgICAgKiBuZXcgYnVpbGQgZmxhZ3Mgb3IgcHJlZml4IjsgXAorCQllY2hvICIkJEZMQUdTIiA+R0lULUNGTEFHUzsgXAorICAgICAgICAgICAgZmkKKworR0lULUJVSUxELU9QVElPTlM6IC5GT1JDRS1HSVQtQlVJTEQtT1BUSU9OUworCUBlY2hvIFNIRUxMX1BBVEg9XCcnJChTSEVMTF9QQVRIX1NRKSdcJyA+JEAKKworIyMjIERldGVjdCBUY2svVGsgaW50ZXJwcmV0ZXIgcGF0aCBjaGFuZ2VzCitpZm5kZWYgTk9fVENMVEsKK1RSQUNLX1ZBUlMgPSAkKHN1YnN0ICcsJ1wnJywtRFRDTFRLX1BBVEg9JyQoVENMVEtfUEFUSF9TUSknKQorCitHSVQtR1VJLVZBUlM6IC5GT1JDRS1HSVQtR1VJLVZBUlMKKwlAVkFSUz0nJChUUkFDS19WQVJTKSc7IFwKKwkgICAgaWYgdGVzdCB4IiQkVkFSUyIgIT0geCJgY2F0ICRAIDI+L2Rldi9udWxsYCIgOyB0aGVuIFwKKwkJZWNobyAxPiYyICIgICAgKiBuZXcgVGNsL1RrIGludGVycHJldGVyIGxvY2F0aW9uIjsgXAorCQllY2hvICIkJFZBUlMiID4kQDsgXAorICAgICAgICAgICAgZmkKKworLlBIT05ZOiAuRk9SQ0UtR0lULUdVSS1WQVJTCitlbmRpZgorCisjIyMgVGVzdGluZyBydWxlcworCitURVNUX1BST0dSQU1TID0gdGVzdC1jaG10aW1lJFggdGVzdC1nZW5yYW5kb20kWCB0ZXN0LWRhdGUkWCB0ZXN0LWRlbHRhJFggdGVzdC1zaGExJFggdGVzdC1tYXRjaC10cmVlcyRYIHRlc3QtYWJzb2x1dGUtcGF0aCRYIHRlc3QtcGFyc2Utb3B0aW9ucyRYCisKK2FsbDo6ICQoVEVTVF9QUk9HUkFNUykKKworIyBHTlUgbWFrZSBzdXBwb3J0cyBleHBvcnRpbmcgYWxsIHZhcmlhYmxlcyBieSAiZXhwb3J0IiB3aXRob3V0IHBhcmFtZXRlcnMuCisjIEhvd2V2ZXIsIHRoZSBlbnZpcm9ubWVudCBnZXRzIHF1aXRlIGJpZywgYW5kIHNvbWUgcHJvZ3JhbXMgaGF2ZSBwcm9ibGVtcworIyB3aXRoIHRoYXQuCisKK2V4cG9ydCBOT19TVk5fVEVTVFMKKwordGVzdDogYWxsCisJJChNQUtFKSAtQyB0LyBhbGwKKwordGVzdC1kYXRlJFg6IGRhdGUubyBjdHlwZS5vCisKK3Rlc3QtZGVsdGEkWDogZGlmZi1kZWx0YS5vIHBhdGNoLWRlbHRhLm8KKwordGVzdC1wYXJzZS1vcHRpb25zJFg6IHBhcnNlLW9wdGlvbnMubworCisuUFJFQ0lPVVM6ICQocGF0c3Vic3QgdGVzdC0lJFgsdGVzdC0lLm8sJChURVNUX1BST0dSQU1TKSkKKwordGVzdC0lJFg6IHRlc3QtJS5vICQoR0lUTElCUykKKwkkKFFVSUVUX0xJTkspJChDQykgJChBTExfQ0ZMQUdTKSAtbyAkQCAkKEFMTF9MREZMQUdTKSAkKGZpbHRlciAlLm8sJF4pICQoTElCUykKKworY2hlY2stc2hhMTo6IHRlc3Qtc2hhMSRYCisJLi90ZXN0LXNoYTEuc2gKKworY2hlY2s6IGNvbW1vbi1jbWRzLmgKKwlmb3IgaSBpbiAqLmM7IGRvIHNwYXJzZSAkKEFMTF9DRkxBR1MpICQoU1BBUlNFX0ZMQUdTKSAkJGkgfHwgZXhpdDsgZG9uZQorCityZW1vdmUtZGFzaGVzOgorCS4vZml4dXAtYnVpbHRpbnMgJChCVUlMVF9JTlMpCisKKyMjIyBJbnN0YWxsYXRpb24gcnVsZXMKKworaW5zdGFsbDogYWxsCisJJChJTlNUQUxMKSAtZCAtbSA3NTUgJyQoREVTVERJUl9TUSkkKGJpbmRpcl9TUSknCisJJChJTlNUQUxMKSAtZCAtbSA3NTUgJyQoREVTVERJUl9TUSkkKGdpdGV4ZWNkaXJfU1EpJworCSQoSU5TVEFMTCkgJChBTExfUFJPR1JBTVMpICckKERFU1RESVJfU1EpJChnaXRleGVjZGlyX1NRKScKKwkkKElOU1RBTEwpIGdpdCRYICckKERFU1RESVJfU1EpJChiaW5kaXJfU1EpJworCSQoTUFLRSkgLUMgdGVtcGxhdGVzIERFU1RESVI9JyQoREVTVERJUl9TUSknIGluc3RhbGwKKwkkKE1BS0UpIC1DIHBlcmwgcHJlZml4PSckKHByZWZpeF9TUSknIERFU1RESVI9JyQoREVTVERJUl9TUSknIGluc3RhbGwKK2lmbmRlZiBOT19UQ0xUSworCSQoTUFLRSkgLUMgZ2l0ay1naXQgaW5zdGFsbAorCSQoTUFLRSkgLUMgZ2l0LWd1aSBpbnN0YWxsCitlbmRpZgorCWlmIHRlc3QgJ3okKGJpbmRpcl9TUSknICE9ICd6JChnaXRleGVjZGlyX1NRKSc7IFwKKwl0aGVuIFwKKwkJbG4gLWYgJyQoREVTVERJUl9TUSkkKGJpbmRpcl9TUSkvZ2l0JFgnIFwKKwkJCSckKERFU1RESVJfU1EpJChnaXRleGVjZGlyX1NRKS9naXQkWCcgfHwgXAorCQljcCAnJChERVNURElSX1NRKSQoYmluZGlyX1NRKS9naXQkWCcgXAorCQkJJyQoREVTVERJUl9TUSkkKGdpdGV4ZWNkaXJfU1EpL2dpdCRYJzsgXAorCWZpCisJJChmb3JlYWNoIHAsJChCVUlMVF9JTlMpLCAkKFJNKSAnJChERVNURElSX1NRKSQoZ2l0ZXhlY2Rpcl9TUSkvJHAnICYmIGxuICckKERFU1RESVJfU1EpJChnaXRleGVjZGlyX1NRKS9naXQkWCcgJyQoREVTVERJUl9TUSkkKGdpdGV4ZWNkaXJfU1EpLyRwJyA7KQoraWZuZXEgKCwkWCkKKwkkKGZvcmVhY2ggcCwkKHBhdHN1YnN0ICUkWCwlLCQoZmlsdGVyICUkWCwkKEFMTF9QUk9HUkFNUykgJChCVUlMVF9JTlMpIGdpdCRYKSksICQoUk0pICckKERFU1RESVJfU1EpJChnaXRleGVjZGlyX1NRKS8kcCc7KQorZW5kaWYKKworaW5zdGFsbC1kb2M6CisJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uIGluc3RhbGwKKworaW5zdGFsbC1pbmZvOgorCSQoTUFLRSkgLUMgRG9jdW1lbnRhdGlvbiBpbnN0YWxsLWluZm8KKworcXVpY2staW5zdGFsbC1kb2M6CisJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uIHF1aWNrLWluc3RhbGwKKworCisKKyMjIyBNYWludGFpbmVyJ3MgZGlzdCBydWxlcworCitnaXQuc3BlYzogZ2l0LnNwZWMuaW4KKwlzZWQgLWUgJ3MvQEBWRVJTSU9OQEAvJChHSVRfVkVSU0lPTikvZycgPCAkPCA+ICRAKworCW12ICRAKyAkQAorCitHSVRfVEFSTkFNRT1naXQtJChHSVRfVkVSU0lPTikKK2Rpc3Q6IGdpdC5zcGVjIGdpdC1hcmNoaXZlJChYKSBjb25maWd1cmUKKwkuL2dpdC1hcmNoaXZlIC0tZm9ybWF0PXRhciBcCisJCS0tcHJlZml4PSQoR0lUX1RBUk5BTUUpLyBIRUFEXnt0cmVlfSA+ICQoR0lUX1RBUk5BTUUpLnRhcgorCUBta2RpciAtcCAkKEdJVF9UQVJOQU1FKQorCUBjcCBnaXQuc3BlYyBjb25maWd1cmUgJChHSVRfVEFSTkFNRSkKKwlAZWNobyAkKEdJVF9WRVJTSU9OKSA+ICQoR0lUX1RBUk5BTUUpL3ZlcnNpb24KKwlAJChNQUtFKSAtQyBnaXQtZ3VpIFRBUkRJUj0uLi8kKEdJVF9UQVJOQU1FKS9naXQtZ3VpIGRpc3QtdmVyc2lvbgorCSQoVEFSKSByZiAkKEdJVF9UQVJOQU1FKS50YXIgXAorCQkkKEdJVF9UQVJOQU1FKS9naXQuc3BlYyBcCisJCSQoR0lUX1RBUk5BTUUpL2NvbmZpZ3VyZSBcCisJCSQoR0lUX1RBUk5BTUUpL3ZlcnNpb24gXAorCQkkKEdJVF9UQVJOQU1FKS9naXQtZ3VpL3ZlcnNpb24KKwlAJChSTSkgLXIgJChHSVRfVEFSTkFNRSkKKwlnemlwIC1mIC05ICQoR0lUX1RBUk5BTUUpLnRhcgorCitycG06IGRpc3QKKwkkKFJQTUJVSUxEKSAtdGEgJChHSVRfVEFSTkFNRSkudGFyLmd6CisKK2h0bWxkb2NzID0gZ2l0LWh0bWxkb2NzLSQoR0lUX1ZFUlNJT04pCittYW5wYWdlcyA9IGdpdC1tYW5wYWdlcy0kKEdJVF9WRVJTSU9OKQorZGlzdC1kb2M6CisJJChSTSkgLXIgLmRvYy10bXAtZGlyCisJbWtkaXIgLmRvYy10bXAtZGlyCisJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uIFdFQkRPQ19ERVNUPS4uLy5kb2MtdG1wLWRpciBpbnN0YWxsLXdlYmRvYworCWNkIC5kb2MtdG1wLWRpciAmJiAkKFRBUikgY2YgLi4vJChodG1sZG9jcykudGFyIC4KKwlnemlwIC1uIC05IC1mICQoaHRtbGRvY3MpLnRhcgorCToKKwkkKFJNKSAtciAuZG9jLXRtcC1kaXIKKwlta2RpciAtcCAuZG9jLXRtcC1kaXIvbWFuMSAuZG9jLXRtcC1kaXIvbWFuNSAuZG9jLXRtcC1kaXIvbWFuNworCSQoTUFLRSkgLUMgRG9jdW1lbnRhdGlvbiBERVNURElSPS4vIFwKKwkJbWFuMWRpcj0uLi8uZG9jLXRtcC1kaXIvbWFuMSBcCisJCW1hbjVkaXI9Li4vLmRvYy10bXAtZGlyL21hbjUgXAorCQltYW43ZGlyPS4uLy5kb2MtdG1wLWRpci9tYW43IFwKKwkJaW5zdGFsbAorCWNkIC5kb2MtdG1wLWRpciAmJiAkKFRBUikgY2YgLi4vJChtYW5wYWdlcykudGFyIC4KKwlnemlwIC1uIC05IC1mICQobWFucGFnZXMpLnRhcgorCSQoUk0pIC1yIC5kb2MtdG1wLWRpcgorCisjIyMgQ2xlYW5pbmcgcnVsZXMKKworZGlzdGNsZWFuOiBjbGVhbgorCSQoUk0pIGNvbmZpZ3VyZQorCitjbGVhbjoKKwkkKFJNKSAqLm8gbW96aWxsYS1zaGExLyoubyBhcm0vKi5vIHBwYy8qLm8gY29tcGF0LyoubyB4ZGlmZi8qLm8gXAorCQkkKExJQl9GSUxFKSAkKFhESUZGX0xJQikKKwkkKFJNKSAkKEFMTF9QUk9HUkFNUykgJChCVUlMVF9JTlMpIGdpdCRYCisJJChSTSkgJChURVNUX1BST0dSQU1TKQorCSQoUk0pICouc3BlYyAqLnB5YyAqLnB5byAqLyoucHljICovKi5weW8gY29tbW9uLWNtZHMuaCBUQUdTIHRhZ3MgY3Njb3BlKgorCSQoUk0pIC1yIGF1dG9tNHRlLmNhY2hlCisJJChSTSkgY29uZmlnLmxvZyBjb25maWcubWFrLmF1dG9nZW4gY29uZmlnLm1hay5hcHBlbmQgY29uZmlnLnN0YXR1cyBjb25maWcuY2FjaGUKKwkkKFJNKSAtciAkKEdJVF9UQVJOQU1FKSAuZG9jLXRtcC1kaXIKKwkkKFJNKSAkKEdJVF9UQVJOQU1FKS50YXIuZ3ogZ2l0LWNvcmVfJChHSVRfVkVSU0lPTiktKi50YXIuZ3oKKwkkKFJNKSAkKGh0bWxkb2NzKS50YXIuZ3ogJChtYW5wYWdlcykudGFyLmd6CisJJChSTSkgZ2l0d2ViL2dpdHdlYi5jZ2kKKwkkKE1BS0UpIC1DIERvY3VtZW50YXRpb24vIGNsZWFuCisJJChNQUtFKSAtQyBwZXJsIGNsZWFuCisJJChNQUtFKSAtQyB0ZW1wbGF0ZXMvIGNsZWFuCisJJChNQUtFKSAtQyB0LyBjbGVhbgoraWZuZGVmIE5PX1RDTFRLCisJJChNQUtFKSAtQyBnaXRrLWdpdCBjbGVhbgorCSQoTUFLRSkgLUMgZ2l0LWd1aSBjbGVhbgorZW5kaWYKKwkkKFJNKSBHSVQtVkVSU0lPTi1GSUxFIEdJVC1DRkxBR1MgR0lULUdVSS1WQVJTIEdJVC1CVUlMRC1PUFRJT05TCisKKy5QSE9OWTogYWxsIGluc3RhbGwgY2xlYW4gc3RyaXAKKy5QSE9OWTogLkZPUkNFLUdJVC1WRVJTSU9OLUZJTEUgVEFHUyB0YWdzIGNzY29wZSAuRk9SQ0UtR0lULUNGTEFHUworLlBIT05ZOiAuRk9SQ0UtR0lULUJVSUxELU9QVElPTlMKKworIyMjIENoZWNrIGRvY3VtZW50YXRpb24KKyMKK2NoZWNrLWRvY3M6OgorCUAoZm9yIHYgaW4gJChBTExfUFJPR1JBTVMpICQoQlVJTFRfSU5TKSBnaXQgZ2l0azsgXAorCWRvIFwKKwkJY2FzZSAiJCR2IiBpbiBcCisJCWdpdC1tZXJnZS1vY3RvcHVzIHwgZ2l0LW1lcmdlLW91cnMgfCBnaXQtbWVyZ2UtcmVjdXJzaXZlIHwgXAorCQlnaXQtbWVyZ2UtcmVzb2x2ZSB8IGdpdC1tZXJnZS1zdHVwaWQgfCBnaXQtbWVyZ2Utc3VidHJlZSB8IFwKKwkJZ2l0LWZzY2stb2JqZWN0cyB8IGdpdC1pbml0LWRiIHwgXAorCQlnaXQtPyotLT8qICkgY29udGludWUgOzsgXAorCQllc2FjIDsgXAorCQl0ZXN0IC1mICJEb2N1bWVudGF0aW9uLyQkdi50eHQiIHx8IFwKKwkJZWNobyAibm8gZG9jOiAkJHYiOyBcCisJCXNlZCAtZSAnL14jL2QnIGNvbW1hbmQtbGlzdC50eHQgfCBcCisJCWdyZXAgLXEgIl4kJHZbIAldIiB8fCBcCisJCWNhc2UgIiQkdiIgaW4gXAorCQlnaXQpIDs7IFwKKwkJKikgZWNobyAibm8gbGluazogJCR2Ijs7IFwKKwkJZXNhYyA7IFwKKwlkb25lOyBcCisJKCBcCisJCXNlZCAtZSAnL14jL2QnIFwKKwkJICAgIC1lICdzL1sgCV0uKi8vJyBcCisJCSAgICAtZSAncy9eL2xpc3RlZCAvJyBjb21tYW5kLWxpc3QudHh0OyBcCisJCWxzIC0xIERvY3VtZW50YXRpb24vZ2l0KnR4dCB8IFwKKwkJc2VkIC1lICdzfERvY3VtZW50YXRpb24vfGRvY3VtZW50ZWQgfCcgXAorCQkgICAgLWUgJ3MvXC50eHQvLyc7IFwKKwkpIHwgd2hpbGUgcmVhZCBob3cgY21kOyBcCisJZG8gXAorCQljYXNlICIkJGhvdywkJGNtZCIgaW4gXAorCQkqLGdpdC1jaXRvb2wgfCBcCisJCSosZ2l0LWd1aSB8IFwKKwkJKixnaXQtaGVscCB8IFwKKwkJZG9jdW1lbnRlZCxnaXRhdHRyaWJ1dGVzIHwgXAorCQlkb2N1bWVudGVkLGdpdGlnbm9yZSB8IFwKKwkJZG9jdW1lbnRlZCxnaXRtb2R1bGVzIHwgXAorCQlkb2N1bWVudGVkLGdpdGNsaSB8IFwKKwkJZG9jdW1lbnRlZCxnaXQtdG9vbHMgfCBcCisJCXNlbnRpbmVsLG5vdCxtYXRjaGluZyxpcyxvayApIGNvbnRpbnVlIDs7IFwKKwkJZXNhYzsgXAorCQljYXNlICIgJChBTExfUFJPR1JBTVMpICQoQlVJTFRfSU5TKSBnaXQgZ2l0ayAiIGluIFwKKwkJKiIgJCRjbWQgIiopCTs7IFwKKwkJKikgZWNobyAicmVtb3ZlZCBidXQgJCRob3c6ICQkY21kIiA7OyBcCisJCWVzYWM7IFwKKwlkb25lICkgfCBzb3J0CisKKyMjIyBNYWtlIHN1cmUgYnVpbHQtaW5zIGRvIG5vdCBoYXZlIGR1cHMgYW5kIGxpc3RlZCBpbiBnaXQuYworIworY2hlY2stYnVpbHRpbnM6OgorCS4vY2hlY2stYnVpbHRpbnMuc2gKIApkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ODE0MmMKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUKQEAgLTAsMCArMSw0NiBAQAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJR0lUIC0gdGhlIHN0dXBpZCBjb250ZW50IHRyYWNrZXIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisiZ2l0IiBjYW4gbWVhbiBhbnl0aGluZywgZGVwZW5kaW5nIG9uIHlvdXIgbW9vZC4KKworIC0gcmFuZG9tIHRocmVlLWxldHRlciBjb21iaW5hdGlvbiB0aGF0IGlzIHByb25vdW5jZWFibGUsIGFuZCBub3QKKyAgIGFjdHVhbGx5IHVzZWQgYnkgYW55IGNvbW1vbiBVTklYIGNvbW1hbmQuICBUaGUgZmFjdCB0aGF0IGl0IGlzIGEKKyAgIG1pc3Byb251bmNpYXRpb24gb2YgImdldCIgbWF5IG9yIG1heSBub3QgYmUgcmVsZXZhbnQuCisgLSBzdHVwaWQuIGNvbnRlbXB0aWJsZSBhbmQgZGVzcGljYWJsZS4gc2ltcGxlLiBUYWtlIHlvdXIgcGljayBmcm9tIHRoZQorICAgZGljdGlvbmFyeSBvZiBzbGFuZy4KKyAtICJnbG9iYWwgaW5mb3JtYXRpb24gdHJhY2tlciI6IHlvdSdyZSBpbiBhIGdvb2QgbW9vZCwgYW5kIGl0IGFjdHVhbGx5CisgICB3b3JrcyBmb3IgeW91LiBBbmdlbHMgc2luZywgYW5kIGEgbGlnaHQgc3VkZGVubHkgZmlsbHMgdGhlIHJvb20uCisgLSAiZ29kZGFtbiBpZGlvdGljIHRydWNrbG9hZCBvZiBzaCp0Ijogd2hlbiBpdCBicmVha3MKKworR2l0IGlzIGEgZmFzdCwgc2NhbGFibGUsIGRpc3RyaWJ1dGVkIHJldmlzaW9uIGNvbnRyb2wgc3lzdGVtIHdpdGggYW4KK3VudXN1YWxseSByaWNoIGNvbW1hbmQgc2V0IHRoYXQgcHJvdmlkZXMgYm90aCBoaWdoLWxldmVsIG9wZXJhdGlvbnMKK2FuZCBmdWxsIGFjY2VzcyB0byBpbnRlcm5hbHMuCisKK0dpdCBpcyBhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorSXQgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyB3aXRoIGhlbHAgb2YgYSBncm91cCBvZgoraGFja2VycyBhcm91bmQgdGhlIG5ldC4gSXQgaXMgY3VycmVudGx5IG1haW50YWluZWQgYnkgSnVuaW8gQyBIYW1hbm8uCisKK1BsZWFzZSByZWFkIHRoZSBmaWxlIElOU1RBTEwgZm9yIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuCitTZWUgRG9jdW1lbnRhdGlvbi90dXRvcmlhbC50eHQgdG8gZ2V0IHN0YXJ0ZWQsIHRoZW4gc2VlCitEb2N1bWVudGF0aW9uL2V2ZXJ5ZGF5LnR4dCBmb3IgYSB1c2VmdWwgbWluaW11bSBzZXQgb2YgY29tbWFuZHMsCithbmQgIm1hbiBnaXQtY29tbWFuZG5hbWUiIGZvciBkb2N1bWVudGF0aW9uIG9mIGVhY2ggY29tbWFuZC4KK0NWUyB1c2VycyBtYXkgYWxzbyB3YW50IHRvIHJlYWQgRG9jdW1lbnRhdGlvbi9jdnMtbWlncmF0aW9uLnR4dC4KKworTWFueSBHaXQgb25saW5lIHJlc291cmNlcyBhcmUgYWNjZXNzaWJsZSBmcm9tIGh0dHA6Ly9naXQub3IuY3ovCitpbmNsdWRpbmcgZnVsbCBkb2N1bWVudGF0aW9uIGFuZCBHaXQgcmVsYXRlZCB0b29scy4KKworVGhlIHVzZXIgZGlzY3Vzc2lvbiBhbmQgZGV2ZWxvcG1lbnQgb2YgR2l0IHRha2UgcGxhY2Ugb24gdGhlIEdpdAorbWFpbGluZyBsaXN0IC0tIGV2ZXJ5b25lIGlzIHdlbGNvbWUgdG8gcG9zdCBidWcgcmVwb3J0cywgZmVhdHVyZQorcmVxdWVzdHMsIGNvbW1lbnRzIGFuZCBwYXRjaGVzIHRvIGdpdEB2Z2VyLmtlcm5lbC5vcmcuIFRvIHN1YnNjcmliZQordG8gdGhlIGxpc3QsIHNlbmQgYW4gZW1haWwgd2l0aCBqdXN0ICJzdWJzY3JpYmUgZ2l0IiBpbiB0aGUgYm9keSB0bworbWFqb3Jkb21vQHZnZXIua2VybmVsLm9yZy4gVGhlIG1haWxpbmcgbGlzdCBhcmNoaXZlcyBhcmUgYXZhaWxhYmxlIGF0CitodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLz9sPWdpdCBhbmQgb3RoZXIgYXJjaGl2YWwgc2l0ZXMuCisKK1RoZSBtZXNzYWdlcyB0aXRsZWQgIkEgbm90ZSBmcm9tIHRoZSBtYWludGFpbmVyIiwgIldoYXQncyBpbgorZ2l0LmdpdCAoc3RhYmxlKSIgYW5kICJXaGF0J3MgY29va2luZyBpbiBnaXQuZ2l0ICh0b3BpY3MpIiBhbmQKK3RoZSBkaXNjdXNzaW9uIGZvbGxvd2luZyB0aGVtIG9uIHRoZSBtYWlsaW5nIGxpc3QgZ2l2ZSBhIGdvb2QKK3JlZmVyZW5jZSBmb3IgcHJvamVjdCBzdGF0dXMsIGRldmVsb3BtZW50IGRpcmVjdGlvbiBhbmQKK3JlbWFpbmluZyB0YXNrcy4KZGlmZiAtLWdpdCBhL1JlbE5vdGVzIGIvUmVsTm90ZXMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uM2U3NzM1OAotLS0gL2Rldi9udWxsCisrKyBiL1JlbE5vdGVzCkBAIC0wLDAgKzEgQEAKK0RvY3VtZW50YXRpb24vUmVsTm90ZXMtMS41LjUudHh0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYWxpYXMuYyBiL2FsaWFzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE2Y2FjOAotLS0gL2Rldi9udWxsCisrKyBiL2FsaWFzLmMKQEAgLTAsMCArMSwyMiBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICphbGlhc19rZXk7CitzdGF0aWMgY2hhciAqYWxpYXNfdmFsOworc3RhdGljIGludCBhbGlhc19sb29rdXBfY2IoY29uc3QgY2hhciAqaywgY29uc3QgY2hhciAqdikKK3sKKwlpZiAoIXByZWZpeGNtcChrLCAiYWxpYXMuIikgJiYgIXN0cmNtcChrKzYsIGFsaWFzX2tleSkpIHsKKwkJaWYgKCF2KQorCQkJcmV0dXJuIGNvbmZpZ19lcnJvcl9ub25ib29sKGspOworCQlhbGlhc192YWwgPSB4c3RyZHVwKHYpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2NoYXIgKmFsaWFzX2xvb2t1cChjb25zdCBjaGFyICphbGlhcykKK3sKKwlhbGlhc19rZXkgPSBhbGlhczsKKwlhbGlhc192YWwgPSBOVUxMOworCWdpdF9jb25maWcoYWxpYXNfbG9va3VwX2NiKTsKKwlyZXR1cm4gYWxpYXNfdmFsOworfQpkaWZmIC0tZ2l0IGEvYWxsb2MuYyBiL2FsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2YzIzYQotLS0gL2Rldi9udWxsCisrKyBiL2FsbG9jLmMKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIGFsbG9jLmMgIC0gc3BlY2lhbGl6ZWQgYWxsb2NhdG9yIGZvciBpbnRlcm5hbCBvYmplY3RzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IExpbnVzIFRvcnZhbGRzCisgKgorICogVGhlIHN0YW5kYXJkIG1hbGxvYy9mcmVlIHdhc3RlcyB0b28gbXVjaCBzcGFjZSBmb3Igb2JqZWN0cywgcGFydGx5IGJlY2F1c2UKKyAqIGl0IG1haW50YWlucyBhbGwgdGhlIGFsbG9jYXRpb24gaW5mcmFzdHJ1Y3R1cmUgKHdoaWNoIGlzbid0IG5lZWRlZCwgc2luY2UKKyAqIHdlIG5ldmVyIGZyZWUgYW4gb2JqZWN0IGRlc2NyaXB0b3IgYW55d2F5KSwgYnV0IGV2ZW4gbW9yZSBiZWNhdXNlIGl0IGVuZHMKKyAqIHVwIHdpdGggbWF4aW1hbCBhbGlnbm1lbnQgYmVjYXVzZSBpdCBkb2Vzbid0IGtub3cgd2hhdCB0aGUgb2JqZWN0IGFsaWdubWVudAorICogZm9yIHRoZSBuZXcgYWxsb2NhdGlvbiBpcy4KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKworI2RlZmluZSBCTE9DS0lORyAxMDI0CisKKyNkZWZpbmUgREVGSU5FX0FMTE9DQVRPUihuYW1lLCB0eXBlKQkJCQlcCitzdGF0aWMgdW5zaWduZWQgaW50IG5hbWUjI19hbGxvY3M7CQkJCVwKK3ZvaWQgKmFsbG9jXyMjbmFtZSMjX25vZGUodm9pZCkJCQkJCVwKK3sJCQkJCQkJCVwKKwlzdGF0aWMgaW50IG5yOwkJCQkJCVwKKwlzdGF0aWMgdHlwZSAqYmxvY2s7CQkJCQlcCisJdm9pZCAqcmV0OwkJCQkJCVwKKwkJCQkJCQkJXAorCWlmICghbnIpIHsJCQkJCQlcCisJCW5yID0gQkxPQ0tJTkc7CQkJCQlcCisJCWJsb2NrID0geG1hbGxvYyhCTE9DS0lORyAqIHNpemVvZih0eXBlKSk7CVwKKwl9CQkJCQkJCVwKKwluci0tOwkJCQkJCQlcCisJbmFtZSMjX2FsbG9jcysrOwkJCQkJXAorCXJldCA9IGJsb2NrKys7CQkJCQkJXAorCW1lbXNldChyZXQsIDAsIHNpemVvZih0eXBlKSk7CQkJCVwKKwlyZXR1cm4gcmV0OwkJCQkJCVwKK30KKwordW5pb24gYW55X29iamVjdCB7CisJc3RydWN0IG9iamVjdCBvYmplY3Q7CisJc3RydWN0IGJsb2IgYmxvYjsKKwlzdHJ1Y3QgdHJlZSB0cmVlOworCXN0cnVjdCBjb21taXQgY29tbWl0OworCXN0cnVjdCB0YWcgdGFnOworfTsKKworREVGSU5FX0FMTE9DQVRPUihibG9iLCBzdHJ1Y3QgYmxvYikKK0RFRklORV9BTExPQ0FUT1IodHJlZSwgc3RydWN0IHRyZWUpCitERUZJTkVfQUxMT0NBVE9SKGNvbW1pdCwgc3RydWN0IGNvbW1pdCkKK0RFRklORV9BTExPQ0FUT1IodGFnLCBzdHJ1Y3QgdGFnKQorREVGSU5FX0FMTE9DQVRPUihvYmplY3QsIHVuaW9uIGFueV9vYmplY3QpCisKKyNpZmRlZiBOT19DOTlfRk9STUFUCisjZGVmaW5lIFNaX0ZNVCAiJXUiCisjZWxzZQorI2RlZmluZSBTWl9GTVQgIiV6dSIKKyNlbmRpZgorCitzdGF0aWMgdm9pZCByZXBvcnQoY29uc3QgY2hhciogbmFtZSwgdW5zaWduZWQgaW50IGNvdW50LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiUxMHM6ICU4dSAoIiBTWl9GTVQgIiBrQilcbiIsIG5hbWUsIGNvdW50LCBzaXplKTsKK30KKworI3VuZGVmIFNaX0ZNVAorCisjZGVmaW5lIFJFUE9SVChuYW1lKQlcCisgICAgcmVwb3J0KCNuYW1lLCBuYW1lIyNfYWxsb2NzLCBuYW1lIyNfYWxsb2NzKnNpemVvZihzdHJ1Y3QgbmFtZSkgPj4gMTApCisKK3ZvaWQgYWxsb2NfcmVwb3J0KHZvaWQpCit7CisJUkVQT1JUKGJsb2IpOworCVJFUE9SVCh0cmVlKTsKKwlSRVBPUlQoY29tbWl0KTsKKwlSRVBPUlQodGFnKTsKK30KZGlmZiAtLWdpdCBhL2FyY2hpdmUtdGFyLmMgYi9hcmNoaXZlLXRhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYWEyZTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZlLXRhci5jCkBAIC0wLDAgKzEsMjkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IFJlbmUgU2NoYXJmZQorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0YXIuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCisjZGVmaW5lIFJFQ09SRFNJWkUJKDUxMikKKyNkZWZpbmUgQkxPQ0tTSVpFCShSRUNPUkRTSVpFICogMjApCisKK3N0YXRpYyBjaGFyIGJsb2NrW0JMT0NLU0laRV07CitzdGF0aWMgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKK3N0YXRpYyB0aW1lX3QgYXJjaGl2ZV90aW1lOworc3RhdGljIGludCB0YXJfdW1hc2sgPSAwMDI7CitzdGF0aWMgaW50IHZlcmJvc2U7CitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbW1pdCAqY29tbWl0OworCisvKiB3cml0ZXMgb3V0IHRoZSB3aG9sZSBibG9jaywgYnV0IG9ubHkgaWYgaXQgaXMgZnVsbCAqLworc3RhdGljIHZvaWQgd3JpdGVfaWZfbmVlZGVkKHZvaWQpCit7CisJaWYgKG9mZnNldCA9PSBCTE9DS1NJWkUpIHsKKwkJd3JpdGVfb3JfZGllKDEsIGJsb2NrLCBCTE9DS1NJWkUpOworCQlvZmZzZXQgPSAwOworCX0KK30KKworLyoKKyAqIHF1ZXVlcyB1cCB3cml0ZXMsIHNvIHRoYXQgYWxsIG91ciB3cml0ZSgyKSBjYWxscyB3cml0ZSBleGFjdGx5IG9uZQorICogZnVsbCBibG9jazsgcGFkcyB3cml0ZXMgdG8gUkVDT1JEU0laRQorICovCitzdGF0aWMgdm9pZCB3cml0ZV9ibG9ja2VkKGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwljb25zdCBjaGFyICpidWYgPSBkYXRhOworCXVuc2lnbmVkIGxvbmcgdGFpbDsKKworCWlmIChvZmZzZXQpIHsKKwkJdW5zaWduZWQgbG9uZyBjaHVuayA9IEJMT0NLU0laRSAtIG9mZnNldDsKKwkJaWYgKHNpemUgPCBjaHVuaykKKwkJCWNodW5rID0gc2l6ZTsKKwkJbWVtY3B5KGJsb2NrICsgb2Zmc2V0LCBidWYsIGNodW5rKTsKKwkJc2l6ZSAtPSBjaHVuazsKKwkJb2Zmc2V0ICs9IGNodW5rOworCQlidWYgKz0gY2h1bms7CisJCXdyaXRlX2lmX25lZWRlZCgpOworCX0KKwl3aGlsZSAoc2l6ZSA+PSBCTE9DS1NJWkUpIHsKKwkJd3JpdGVfb3JfZGllKDEsIGJ1ZiwgQkxPQ0tTSVpFKTsKKwkJc2l6ZSAtPSBCTE9DS1NJWkU7CisJCWJ1ZiArPSBCTE9DS1NJWkU7CisJfQorCWlmIChzaXplKSB7CisJCW1lbWNweShibG9jayArIG9mZnNldCwgYnVmLCBzaXplKTsKKwkJb2Zmc2V0ICs9IHNpemU7CisJfQorCXRhaWwgPSBvZmZzZXQgJSBSRUNPUkRTSVpFOworCWlmICh0YWlsKSAgeworCQltZW1zZXQoYmxvY2sgKyBvZmZzZXQsIDAsIFJFQ09SRFNJWkUgLSB0YWlsKTsKKwkJb2Zmc2V0ICs9IFJFQ09SRFNJWkUgLSB0YWlsOworCX0KKwl3cml0ZV9pZl9uZWVkZWQoKTsKK30KKworLyoKKyAqIFRoZSBlbmQgb2YgdGFyIGFyY2hpdmVzIGlzIG1hcmtlZCBieSAyKjUxMiBudWwgYnl0ZXMgYW5kIGFmdGVyIHRoYXQKKyAqIGZvbGxvd3MgdGhlIHJlc3Qgb2YgdGhlIGJsb2NrIChpZiBhbnkpLgorICovCitzdGF0aWMgdm9pZCB3cml0ZV90cmFpbGVyKHZvaWQpCit7CisJaW50IHRhaWwgPSBCTE9DS1NJWkUgLSBvZmZzZXQ7CisJbWVtc2V0KGJsb2NrICsgb2Zmc2V0LCAwLCB0YWlsKTsKKwl3cml0ZV9vcl9kaWUoMSwgYmxvY2ssIEJMT0NLU0laRSk7CisJaWYgKHRhaWwgPCAyICogUkVDT1JEU0laRSkgeworCQltZW1zZXQoYmxvY2ssIDAsIG9mZnNldCk7CisJCXdyaXRlX29yX2RpZSgxLCBibG9jaywgQkxPQ0tTSVpFKTsKKwl9Cit9CisKKy8qCisgKiBwYXggZXh0ZW5kZWQgaGVhZGVyIHJlY29yZHMgaGF2ZSB0aGUgZm9ybWF0ICIldSAlcz0lc1xuIi4gICV1IGNvbnRhaW5zCisgKiB0aGUgc2l6ZSBvZiB0aGUgd2hvbGUgc3RyaW5nIChpbmNsdWRpbmcgdGhlICV1KSwgdGhlIGZpcnN0ICVzIGlzIHRoZQorICoga2V5d29yZCwgdGhlIHNlY29uZCBvbmUgaXMgdGhlIHZhbHVlLiAgVGhpcyBmdW5jdGlvbiBjb25zdHJ1Y3RzIHN1Y2ggYQorICogc3RyaW5nIGFuZCBhcHBlbmRzIGl0IHRvIGEgc3RydWN0IHN0cmJ1Zi4KKyAqLworc3RhdGljIHZvaWQgc3RyYnVmX2FwcGVuZF9leHRfaGVhZGVyKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFyICprZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlLCB1bnNpZ25lZCBpbnQgdmFsdWVsZW4pCit7CisJaW50IGxlbiwgdG1wOworCisJLyogIiV1ICVzPSVzXG4iICovCisJbGVuID0gMSArIDEgKyBzdHJsZW4oa2V5d29yZCkgKyAxICsgdmFsdWVsZW4gKyAxOworCWZvciAodG1wID0gbGVuOyB0bXAgPiA5OyB0bXAgLz0gMTApCisJCWxlbisrOworCisJc3RyYnVmX2dyb3coc2IsIGxlbik7CisJc3RyYnVmX2FkZGYoc2IsICIldSAlcz0iLCBsZW4sIGtleXdvcmQpOworCXN0cmJ1Zl9hZGQoc2IsIHZhbHVlLCB2YWx1ZWxlbik7CisJc3RyYnVmX2FkZGNoKHNiLCAnXG4nKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB1c3Rhcl9oZWFkZXJfY2hrc3VtKGNvbnN0IHN0cnVjdCB1c3Rhcl9oZWFkZXIgKmhlYWRlcikKK3sKKwljaGFyICpwID0gKGNoYXIgKiloZWFkZXI7CisJdW5zaWduZWQgaW50IGNoa3N1bSA9IDA7CisJd2hpbGUgKHAgPCBoZWFkZXItPmNoa3N1bSkKKwkJY2hrc3VtICs9ICpwKys7CisJY2hrc3VtICs9IHNpemVvZihoZWFkZXItPmNoa3N1bSkgKiAnICc7CisJcCArPSBzaXplb2YoaGVhZGVyLT5jaGtzdW0pOworCXdoaWxlIChwIDwgKGNoYXIgKiloZWFkZXIgKyBzaXplb2Yoc3RydWN0IHVzdGFyX2hlYWRlcikpCisJCWNoa3N1bSArPSAqcCsrOworCXJldHVybiBjaGtzdW07Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3BhdGhfcHJlZml4KGNvbnN0IHN0cnVjdCBzdHJidWYgKnBhdGgsIGludCBtYXhsZW4pCit7CisJaW50IGkgPSBwYXRoLT5sZW47CisJaWYgKGkgPiBtYXhsZW4pCisJCWkgPSBtYXhsZW47CisJZG8geworCQlpLS07CisJfSB3aGlsZSAoaSA+IDAgJiYgcGF0aC0+YnVmW2ldICE9ICcvJyk7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2VudHJ5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHN0cnVjdCBzdHJidWYgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZSwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IHVzdGFyX2hlYWRlciBoZWFkZXI7CisJc3RydWN0IHN0cmJ1ZiBleHRfaGVhZGVyOworCisJbWVtc2V0KCZoZWFkZXIsIDAsIHNpemVvZihoZWFkZXIpKTsKKwlzdHJidWZfaW5pdCgmZXh0X2hlYWRlciwgMCk7CisKKwlpZiAoIXNoYTEpIHsKKwkJKmhlYWRlci50eXBlZmxhZyA9IFRZUEVGTEFHX0dMT0JBTF9IRUFERVI7CisJCW1vZGUgPSAwMTAwNjY2OworCQlzdHJjcHkoaGVhZGVyLm5hbWUsICJwYXhfZ2xvYmFsX2hlYWRlciIpOworCX0gZWxzZSBpZiAoIXBhdGgpIHsKKwkJKmhlYWRlci50eXBlZmxhZyA9IFRZUEVGTEFHX0VYVF9IRUFERVI7CisJCW1vZGUgPSAwMTAwNjY2OworCQlzcHJpbnRmKGhlYWRlci5uYW1lLCAiJXMucGF4aGVhZGVyIiwgc2hhMV90b19oZXgoc2hhMSkpOworCX0gZWxzZSB7CisJCWlmICh2ZXJib3NlKQorCQkJZnByaW50ZihzdGRlcnIsICIlLipzXG4iLCAoaW50KXBhdGgtPmxlbiwgcGF0aC0+YnVmKTsKKwkJaWYgKFNfSVNESVIobW9kZSkgfHwgU19JU0dJVExJTksobW9kZSkpIHsKKwkJCSpoZWFkZXIudHlwZWZsYWcgPSBUWVBFRkxBR19ESVI7CisJCQltb2RlID0gKG1vZGUgfCAwNzc3KSAmIH50YXJfdW1hc2s7CisJCX0gZWxzZSBpZiAoU19JU0xOSyhtb2RlKSkgeworCQkJKmhlYWRlci50eXBlZmxhZyA9IFRZUEVGTEFHX0xOSzsKKwkJCW1vZGUgfD0gMDc3NzsKKwkJfSBlbHNlIGlmIChTX0lTUkVHKG1vZGUpKSB7CisJCQkqaGVhZGVyLnR5cGVmbGFnID0gVFlQRUZMQUdfUkVHOworCQkJbW9kZSA9IChtb2RlIHwgKChtb2RlICYgMDEwMCkgPyAwNzc3IDogMDY2NikpICYgfnRhcl91bWFzazsKKwkJfSBlbHNlIHsKKwkJCWVycm9yKCJ1bnN1cHBvcnRlZCBmaWxlIG1vZGU6IDAlbyAoU0hBMTogJXMpIiwKKwkJCSAgICAgIG1vZGUsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAocGF0aC0+bGVuID4gc2l6ZW9mKGhlYWRlci5uYW1lKSkgeworCQkJaW50IHBsZW4gPSBnZXRfcGF0aF9wcmVmaXgocGF0aCwgc2l6ZW9mKGhlYWRlci5wcmVmaXgpKTsKKwkJCWludCByZXN0ID0gcGF0aC0+bGVuIC0gcGxlbiAtIDE7CisJCQlpZiAocGxlbiA+IDAgJiYgcmVzdCA8PSBzaXplb2YoaGVhZGVyLm5hbWUpKSB7CisJCQkJbWVtY3B5KGhlYWRlci5wcmVmaXgsIHBhdGgtPmJ1ZiwgcGxlbik7CisJCQkJbWVtY3B5KGhlYWRlci5uYW1lLCBwYXRoLT5idWYgKyBwbGVuICsgMSwgcmVzdCk7CisJCQl9IGVsc2UgeworCQkJCXNwcmludGYoaGVhZGVyLm5hbWUsICIlcy5kYXRhIiwKKwkJCQkgICAgICAgIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJCQlzdHJidWZfYXBwZW5kX2V4dF9oZWFkZXIoJmV4dF9oZWFkZXIsICJwYXRoIiwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC0+YnVmLCBwYXRoLT5sZW4pOworCQkJfQorCQl9IGVsc2UKKwkJCW1lbWNweShoZWFkZXIubmFtZSwgcGF0aC0+YnVmLCBwYXRoLT5sZW4pOworCX0KKworCWlmIChTX0lTTE5LKG1vZGUpICYmIGJ1ZmZlcikgeworCQlpZiAoc2l6ZSA+IHNpemVvZihoZWFkZXIubGlua25hbWUpKSB7CisJCQlzcHJpbnRmKGhlYWRlci5saW5rbmFtZSwgInNlZSAlcy5wYXhoZWFkZXIiLAorCQkJICAgICAgICBzaGExX3RvX2hleChzaGExKSk7CisJCQlzdHJidWZfYXBwZW5kX2V4dF9oZWFkZXIoJmV4dF9oZWFkZXIsICJsaW5rcGF0aCIsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBzaXplKTsKKwkJfSBlbHNlCisJCQltZW1jcHkoaGVhZGVyLmxpbmtuYW1lLCBidWZmZXIsIHNpemUpOworCX0KKworCXNwcmludGYoaGVhZGVyLm1vZGUsICIlMDdvIiwgbW9kZSAmIDA3Nzc3KTsKKwlzcHJpbnRmKGhlYWRlci5zaXplLCAiJTAxMWxvIiwgU19JU1JFRyhtb2RlKSA/IHNpemUgOiAwKTsKKwlzcHJpbnRmKGhlYWRlci5tdGltZSwgIiUwMTFsbyIsIGFyY2hpdmVfdGltZSk7CisKKwlzcHJpbnRmKGhlYWRlci51aWQsICIlMDdvIiwgMCk7CisJc3ByaW50ZihoZWFkZXIuZ2lkLCAiJTA3byIsIDApOworCXN0cmxjcHkoaGVhZGVyLnVuYW1lLCAicm9vdCIsIHNpemVvZihoZWFkZXIudW5hbWUpKTsKKwlzdHJsY3B5KGhlYWRlci5nbmFtZSwgInJvb3QiLCBzaXplb2YoaGVhZGVyLmduYW1lKSk7CisJc3ByaW50ZihoZWFkZXIuZGV2bWFqb3IsICIlMDdvIiwgMCk7CisJc3ByaW50ZihoZWFkZXIuZGV2bWlub3IsICIlMDdvIiwgMCk7CisKKwltZW1jcHkoaGVhZGVyLm1hZ2ljLCAidXN0YXIiLCA2KTsKKwltZW1jcHkoaGVhZGVyLnZlcnNpb24sICIwMCIsIDIpOworCisJc3ByaW50ZihoZWFkZXIuY2hrc3VtLCAiJTA3byIsIHVzdGFyX2hlYWRlcl9jaGtzdW0oJmhlYWRlcikpOworCisJaWYgKGV4dF9oZWFkZXIubGVuID4gMCkgeworCQl3cml0ZV9lbnRyeShzaGExLCBOVUxMLCAwLCBleHRfaGVhZGVyLmJ1ZiwgZXh0X2hlYWRlci5sZW4pOworCX0KKwlzdHJidWZfcmVsZWFzZSgmZXh0X2hlYWRlcik7CisJd3JpdGVfYmxvY2tlZCgmaGVhZGVyLCBzaXplb2YoaGVhZGVyKSk7CisJaWYgKFNfSVNSRUcobW9kZSkgJiYgYnVmZmVyICYmIHNpemUgPiAwKQorCQl3cml0ZV9ibG9ja2VkKGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2dsb2JhbF9leHRlbmRlZF9oZWFkZXIoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgc3RyYnVmIGV4dF9oZWFkZXI7CisKKwlzdHJidWZfaW5pdCgmZXh0X2hlYWRlciwgMCk7CisJc3RyYnVmX2FwcGVuZF9leHRfaGVhZGVyKCZleHRfaGVhZGVyLCAiY29tbWVudCIsIHNoYTFfdG9faGV4KHNoYTEpLCA0MCk7CisJd3JpdGVfZW50cnkoTlVMTCwgTlVMTCwgMCwgZXh0X2hlYWRlci5idWYsIGV4dF9oZWFkZXIubGVuKTsKKwlzdHJidWZfcmVsZWFzZSgmZXh0X2hlYWRlcik7Cit9CisKK3N0YXRpYyBpbnQgZ2l0X3Rhcl9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXN0cmNtcCh2YXIsICJ0YXIudW1hc2siKSkgeworCQlpZiAodmFsdWUgJiYgIXN0cmNtcCh2YWx1ZSwgInVzZXIiKSkgeworCQkJdGFyX3VtYXNrID0gdW1hc2soMCk7CisJCQl1bWFzayh0YXJfdW1hc2spOworCQl9IGVsc2UgeworCQkJdGFyX3VtYXNrID0gZ2l0X2NvbmZpZ19pbnQodmFyLCB2YWx1ZSk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBnaXRfZGVmYXVsdF9jb25maWcodmFyLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfdGFyX2VudHJ5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB1bnNpZ25lZCBtb2RlLCBpbnQgc3RhZ2UpCit7CisJc3RhdGljIHN0cnVjdCBzdHJidWYgcGF0aCA9IFNUUkJVRl9JTklUOworCXZvaWQgKmJ1ZmZlcjsKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJc3RyYnVmX3Jlc2V0KCZwYXRoKTsKKwlzdHJidWZfZ3JvdygmcGF0aCwgUEFUSF9NQVgpOworCXN0cmJ1Zl9hZGQoJnBhdGgsIGJhc2UsIGJhc2VsZW4pOworCXN0cmJ1Zl9hZGRzdHIoJnBhdGgsIGZpbGVuYW1lKTsKKwlpZiAoU19JU0RJUihtb2RlKSB8fCBTX0lTR0lUTElOSyhtb2RlKSkgeworCQlzdHJidWZfYWRkY2goJnBhdGgsICcvJyk7CisJCWJ1ZmZlciA9IE5VTEw7CisJCXNpemUgPSAwOworCX0gZWxzZSB7CisJCWJ1ZmZlciA9IHNoYTFfZmlsZV90b19hcmNoaXZlKHBhdGguYnVmLCBzaGExLCBtb2RlLCAmdHlwZSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIGNvbW1pdCk7CisJCWlmICghYnVmZmVyKQorCQkJZGllKCJjYW5ub3QgcmVhZCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwl9CisKKwl3cml0ZV9lbnRyeShzaGExLCAmcGF0aCwgbW9kZSwgYnVmZmVyLCBzaXplKTsKKwlmcmVlKGJ1ZmZlcik7CisKKwlyZXR1cm4gUkVBRF9UUkVFX1JFQ1VSU0lWRTsKK30KKworaW50IHdyaXRlX3Rhcl9hcmNoaXZlKHN0cnVjdCBhcmNoaXZlcl9hcmdzICphcmdzKQoreworCWludCBwbGVuID0gYXJncy0+YmFzZSA/IHN0cmxlbihhcmdzLT5iYXNlKSA6IDA7CisKKwlnaXRfY29uZmlnKGdpdF90YXJfY29uZmlnKTsKKworCWFyY2hpdmVfdGltZSA9IGFyZ3MtPnRpbWU7CisJdmVyYm9zZSA9IGFyZ3MtPnZlcmJvc2U7CisJY29tbWl0ID0gYXJncy0+Y29tbWl0OworCisJaWYgKGFyZ3MtPmNvbW1pdF9zaGExKQorCQl3cml0ZV9nbG9iYWxfZXh0ZW5kZWRfaGVhZGVyKGFyZ3MtPmNvbW1pdF9zaGExKTsKKworCWlmIChhcmdzLT5iYXNlICYmIHBsZW4gPiAwICYmIGFyZ3MtPmJhc2VbcGxlbiAtIDFdID09ICcvJykgeworCQljaGFyICpiYXNlID0geHN0cmR1cChhcmdzLT5iYXNlKTsKKwkJaW50IGJhc2VsZW4gPSBzdHJsZW4oYmFzZSk7CisKKwkJd2hpbGUgKGJhc2VsZW4gPiAwICYmIGJhc2VbYmFzZWxlbiAtIDFdID09ICcvJykKKwkJCWJhc2VbLS1iYXNlbGVuXSA9ICdcMCc7CisJCXdyaXRlX3Rhcl9lbnRyeShhcmdzLT50cmVlLT5vYmplY3Quc2hhMSwgIiIsIDAsIGJhc2UsIDA0MDc3NywgMCk7CisJCWZyZWUoYmFzZSk7CisJfQorCXJlYWRfdHJlZV9yZWN1cnNpdmUoYXJncy0+dHJlZSwgYXJncy0+YmFzZSwgcGxlbiwgMCwKKwkJCSAgICBhcmdzLT5wYXRoc3BlYywgd3JpdGVfdGFyX2VudHJ5KTsKKwl3cml0ZV90cmFpbGVyKCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2hpdmUtemlwLmMgYi9hcmNoaXZlLXppcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZTMwZjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZlLXppcC5jCkBAIC0wLDAgKzEsMzU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IFJlbmUgU2NoYXJmZQorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKworc3RhdGljIGludCB2ZXJib3NlOworc3RhdGljIGludCB6aXBfZGF0ZTsKK3N0YXRpYyBpbnQgemlwX3RpbWU7CitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbW1pdCAqY29tbWl0OworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqemlwX2RpcjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgemlwX2Rpcl9zaXplOworCitzdGF0aWMgdW5zaWduZWQgaW50IHppcF9vZmZzZXQ7CitzdGF0aWMgdW5zaWduZWQgaW50IHppcF9kaXJfb2Zmc2V0Oworc3RhdGljIHVuc2lnbmVkIGludCB6aXBfZGlyX2VudHJpZXM7CisKKyNkZWZpbmUgWklQX0RJUkVDVE9SWV9NSU5fU0laRQkoMTAyNCAqIDEwMjQpCisKK3N0cnVjdCB6aXBfbG9jYWxfaGVhZGVyIHsKKwl1bnNpZ25lZCBjaGFyIG1hZ2ljWzRdOworCXVuc2lnbmVkIGNoYXIgdmVyc2lvblsyXTsKKwl1bnNpZ25lZCBjaGFyIGZsYWdzWzJdOworCXVuc2lnbmVkIGNoYXIgY29tcHJlc3Npb25fbWV0aG9kWzJdOworCXVuc2lnbmVkIGNoYXIgbXRpbWVbMl07CisJdW5zaWduZWQgY2hhciBtZGF0ZVsyXTsKKwl1bnNpZ25lZCBjaGFyIGNyYzMyWzRdOworCXVuc2lnbmVkIGNoYXIgY29tcHJlc3NlZF9zaXplWzRdOworCXVuc2lnbmVkIGNoYXIgc2l6ZVs0XTsKKwl1bnNpZ25lZCBjaGFyIGZpbGVuYW1lX2xlbmd0aFsyXTsKKwl1bnNpZ25lZCBjaGFyIGV4dHJhX2xlbmd0aFsyXTsKKwl1bnNpZ25lZCBjaGFyIF9lbmRbMV07Cit9OworCitzdHJ1Y3QgemlwX2Rpcl9oZWFkZXIgeworCXVuc2lnbmVkIGNoYXIgbWFnaWNbNF07CisJdW5zaWduZWQgY2hhciBjcmVhdG9yX3ZlcnNpb25bMl07CisJdW5zaWduZWQgY2hhciB2ZXJzaW9uWzJdOworCXVuc2lnbmVkIGNoYXIgZmxhZ3NbMl07CisJdW5zaWduZWQgY2hhciBjb21wcmVzc2lvbl9tZXRob2RbMl07CisJdW5zaWduZWQgY2hhciBtdGltZVsyXTsKKwl1bnNpZ25lZCBjaGFyIG1kYXRlWzJdOworCXVuc2lnbmVkIGNoYXIgY3JjMzJbNF07CisJdW5zaWduZWQgY2hhciBjb21wcmVzc2VkX3NpemVbNF07CisJdW5zaWduZWQgY2hhciBzaXplWzRdOworCXVuc2lnbmVkIGNoYXIgZmlsZW5hbWVfbGVuZ3RoWzJdOworCXVuc2lnbmVkIGNoYXIgZXh0cmFfbGVuZ3RoWzJdOworCXVuc2lnbmVkIGNoYXIgY29tbWVudF9sZW5ndGhbMl07CisJdW5zaWduZWQgY2hhciBkaXNrWzJdOworCXVuc2lnbmVkIGNoYXIgYXR0cjFbMl07CisJdW5zaWduZWQgY2hhciBhdHRyMls0XTsKKwl1bnNpZ25lZCBjaGFyIG9mZnNldFs0XTsKKwl1bnNpZ25lZCBjaGFyIF9lbmRbMV07Cit9OworCitzdHJ1Y3QgemlwX2Rpcl90cmFpbGVyIHsKKwl1bnNpZ25lZCBjaGFyIG1hZ2ljWzRdOworCXVuc2lnbmVkIGNoYXIgZGlza1syXTsKKwl1bnNpZ25lZCBjaGFyIGRpcmVjdG9yeV9zdGFydF9kaXNrWzJdOworCXVuc2lnbmVkIGNoYXIgZW50cmllc19vbl90aGlzX2Rpc2tbMl07CisJdW5zaWduZWQgY2hhciBlbnRyaWVzWzJdOworCXVuc2lnbmVkIGNoYXIgc2l6ZVs0XTsKKwl1bnNpZ25lZCBjaGFyIG9mZnNldFs0XTsKKwl1bnNpZ25lZCBjaGFyIGNvbW1lbnRfbGVuZ3RoWzJdOworCXVuc2lnbmVkIGNoYXIgX2VuZFsxXTsKK307CisKKy8qCisgKiBPbiBBUk0sIHBhZGRpbmcgaXMgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgc3RydWN0LCBzbyBhIHNpbXBsZQorICogc2l6ZW9mKHN0cnVjdCAuLi4pIHJlcG9ydHMgdHdvIGJ5dGVzIG1vcmUgdGhhbiB0aGUgcGF5bG9hZCBzaXplCisgKiB3ZSdyZSBpbnRlcmVzdGVkIGluLgorICovCisjZGVmaW5lIFpJUF9MT0NBTF9IRUFERVJfU0laRQlvZmZzZXRvZihzdHJ1Y3QgemlwX2xvY2FsX2hlYWRlciwgX2VuZCkKKyNkZWZpbmUgWklQX0RJUl9IRUFERVJfU0laRQlvZmZzZXRvZihzdHJ1Y3QgemlwX2Rpcl9oZWFkZXIsIF9lbmQpCisjZGVmaW5lIFpJUF9ESVJfVFJBSUxFUl9TSVpFCW9mZnNldG9mKHN0cnVjdCB6aXBfZGlyX3RyYWlsZXIsIF9lbmQpCisKK3N0YXRpYyB2b2lkIGNvcHlfbGUxNih1bnNpZ25lZCBjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgbikKK3sKKwlkZXN0WzBdID0gMHhmZiAmIG47CisJZGVzdFsxXSA9IDB4ZmYgJiAobiA+PiAwMTApOworfQorCitzdGF0aWMgdm9pZCBjb3B5X2xlMzIodW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgaW50IG4pCit7CisJZGVzdFswXSA9IDB4ZmYgJiBuOworCWRlc3RbMV0gPSAweGZmICYgKG4gPj4gMDEwKTsKKwlkZXN0WzJdID0gMHhmZiAmIChuID4+IDAyMCk7CisJZGVzdFszXSA9IDB4ZmYgJiAobiA+PiAwMzApOworfQorCitzdGF0aWMgdm9pZCAqemxpYl9kZWZsYXRlKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqY29tcHJlc3NlZF9zaXplKQoreworCXpfc3RyZWFtIHN0cmVhbTsKKwl1bnNpZ25lZCBsb25nIG1heHNpemU7CisJdm9pZCAqYnVmZmVyOworCWludCByZXN1bHQ7CisKKwltZW1zZXQoJnN0cmVhbSwgMCwgc2l6ZW9mKHN0cmVhbSkpOworCWRlZmxhdGVJbml0KCZzdHJlYW0sIHpsaWJfY29tcHJlc3Npb25fbGV2ZWwpOworCW1heHNpemUgPSBkZWZsYXRlQm91bmQoJnN0cmVhbSwgc2l6ZSk7CisJYnVmZmVyID0geG1hbGxvYyhtYXhzaXplKTsKKworCXN0cmVhbS5uZXh0X2luID0gZGF0YTsKKwlzdHJlYW0uYXZhaWxfaW4gPSBzaXplOworCXN0cmVhbS5uZXh0X291dCA9IGJ1ZmZlcjsKKwlzdHJlYW0uYXZhaWxfb3V0ID0gbWF4c2l6ZTsKKworCWRvIHsKKwkJcmVzdWx0ID0gZGVmbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCk7CisJfSB3aGlsZSAocmVzdWx0ID09IFpfT0spOworCisJaWYgKHJlc3VsdCAhPSBaX1NUUkVBTV9FTkQpIHsKKwkJZnJlZShidWZmZXIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkZWZsYXRlRW5kKCZzdHJlYW0pOworCSpjb21wcmVzc2VkX3NpemUgPSBzdHJlYW0udG90YWxfb3V0OworCisJcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RhdGljIGNoYXIgKmNvbnN0cnVjdF9wYXRoKGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXNkaXIsIGludCAqcGF0aGxlbikKK3sKKwlpbnQgZmlsZW5hbWVsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOworCWludCBsZW4gPSBiYXNlbGVuICsgZmlsZW5hbWVsZW47CisJY2hhciAqcGF0aCwgKnA7CisKKwlpZiAoaXNkaXIpCisJCWxlbisrOworCXAgPSBwYXRoID0geG1hbGxvYyhsZW4gKyAxKTsKKworCW1lbWNweShwLCBiYXNlLCBiYXNlbGVuKTsKKwlwICs9IGJhc2VsZW47CisJbWVtY3B5KHAsIGZpbGVuYW1lLCBmaWxlbmFtZWxlbik7CisJcCArPSBmaWxlbmFtZWxlbjsKKwlpZiAoaXNkaXIpCisJCSpwKysgPSAnLyc7CisJKnAgPSAnXDAnOworCisJKnBhdGhsZW4gPSBsZW47CisKKwlyZXR1cm4gcGF0aDsKK30KKworc3RhdGljIGludCB3cml0ZV96aXBfZW50cnkoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIHVuc2lnbmVkIG1vZGUsIGludCBzdGFnZSkKK3sKKwlzdHJ1Y3QgemlwX2xvY2FsX2hlYWRlciBoZWFkZXI7CisJc3RydWN0IHppcF9kaXJfaGVhZGVyIGRpcmVudDsKKwl1bnNpZ25lZCBsb25nIGF0dHIyOworCXVuc2lnbmVkIGxvbmcgY29tcHJlc3NlZF9zaXplOworCXVuc2lnbmVkIGxvbmcgdW5jb21wcmVzc2VkX3NpemU7CisJdW5zaWduZWQgbG9uZyBjcmM7CisJdW5zaWduZWQgbG9uZyBkaXJlbnRzaXplOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgbWV0aG9kOworCWludCByZXN1bHQgPSAtMTsKKwlpbnQgcGF0aGxlbjsKKwl1bnNpZ25lZCBjaGFyICpvdXQ7CisJY2hhciAqcGF0aDsKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJdm9pZCAqYnVmZmVyID0gTlVMTDsKKwl2b2lkICpkZWZsYXRlZCA9IE5VTEw7CisKKwljcmMgPSBjcmMzMigwLCBOVUxMLCAwKTsKKworCXBhdGggPSBjb25zdHJ1Y3RfcGF0aChiYXNlLCBiYXNlbGVuLCBmaWxlbmFtZSwgU19JU0RJUihtb2RlKSwgJnBhdGhsZW4pOworCWlmICh2ZXJib3NlKQorCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBwYXRoKTsKKwlpZiAocGF0aGxlbiA+IDB4ZmZmZikgeworCQllcnJvcigicGF0aCB0b28gbG9uZyAoJWQgY2hhcnMsIFNIQTE6ICVzKTogJXMiLCBwYXRobGVuLAorCQkgICAgICBzaGExX3RvX2hleChzaGExKSwgcGF0aCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChTX0lTRElSKG1vZGUpIHx8IFNfSVNHSVRMSU5LKG1vZGUpKSB7CisJCW1ldGhvZCA9IDA7CisJCWF0dHIyID0gMTY7CisJCXJlc3VsdCA9IChTX0lTRElSKG1vZGUpID8gUkVBRF9UUkVFX1JFQ1VSU0lWRSA6IDApOworCQlvdXQgPSBOVUxMOworCQl1bmNvbXByZXNzZWRfc2l6ZSA9IDA7CisJCWNvbXByZXNzZWRfc2l6ZSA9IDA7CisJfSBlbHNlIGlmIChTX0lTUkVHKG1vZGUpIHx8IFNfSVNMTksobW9kZSkpIHsKKwkJbWV0aG9kID0gMDsKKwkJYXR0cjIgPSBTX0lTTE5LKG1vZGUpID8gKChtb2RlIHwgMDc3NykgPDwgMTYpIDoKKwkJCShtb2RlICYgMDExMSkgPyAoKG1vZGUpIDw8IDE2KSA6IDA7CisJCWlmIChTX0lTUkVHKG1vZGUpICYmIHpsaWJfY29tcHJlc3Npb25fbGV2ZWwgIT0gMCkKKwkJCW1ldGhvZCA9IDg7CisJCXJlc3VsdCA9IDA7CisJCWJ1ZmZlciA9IHNoYTFfZmlsZV90b19hcmNoaXZlKHBhdGgsIHNoYTEsIG1vZGUsICZ0eXBlLCAmc2l6ZSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0KTsKKwkJaWYgKCFidWZmZXIpCisJCQlkaWUoImNhbm5vdCByZWFkICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworCQljcmMgPSBjcmMzMihjcmMsIGJ1ZmZlciwgc2l6ZSk7CisJCW91dCA9IGJ1ZmZlcjsKKwkJdW5jb21wcmVzc2VkX3NpemUgPSBzaXplOworCQljb21wcmVzc2VkX3NpemUgPSBzaXplOworCX0gZWxzZSB7CisJCWVycm9yKCJ1bnN1cHBvcnRlZCBmaWxlIG1vZGU6IDAlbyAoU0hBMTogJXMpIiwgbW9kZSwKKwkJICAgICAgc2hhMV90b19oZXgoc2hhMSkpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobWV0aG9kID09IDgpIHsKKwkJZGVmbGF0ZWQgPSB6bGliX2RlZmxhdGUoYnVmZmVyLCBzaXplLCAmY29tcHJlc3NlZF9zaXplKTsKKwkJaWYgKGRlZmxhdGVkICYmIGNvbXByZXNzZWRfc2l6ZSAtIDYgPCBzaXplKSB7CisJCQkvKiBaTElCIC0tPiByYXcgY29tcHJlc3NlZCBkYXRhIChzZWUgUkZDIDE5NTApICovCisJCQkvKiBDTUYgYW5kIEZMRyAuLi4gKi8KKwkJCW91dCA9ICh1bnNpZ25lZCBjaGFyICopZGVmbGF0ZWQgKyAyOworCQkJY29tcHJlc3NlZF9zaXplIC09IDY7CS8qIC4uLiBhbmQgQURMRVIzMiAqLworCQl9IGVsc2UgeworCQkJbWV0aG9kID0gMDsKKwkJCWNvbXByZXNzZWRfc2l6ZSA9IHNpemU7CisJCX0KKwl9CisKKwkvKiBtYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggZnJlZSBzcGFjZSBpbiB0aGUgZGljdGlvbmFyeSAqLworCWRpcmVudHNpemUgPSBaSVBfRElSX0hFQURFUl9TSVpFICsgcGF0aGxlbjsKKwl3aGlsZSAoemlwX2Rpcl9zaXplIDwgemlwX2Rpcl9vZmZzZXQgKyBkaXJlbnRzaXplKSB7CisJCXppcF9kaXJfc2l6ZSArPSBaSVBfRElSRUNUT1JZX01JTl9TSVpFOworCQl6aXBfZGlyID0geHJlYWxsb2MoemlwX2RpciwgemlwX2Rpcl9zaXplKTsKKwl9CisKKwljb3B5X2xlMzIoZGlyZW50Lm1hZ2ljLCAweDAyMDE0YjUwKTsKKwljb3B5X2xlMTYoZGlyZW50LmNyZWF0b3JfdmVyc2lvbiwKKwkJU19JU0xOSyhtb2RlKSB8fCAoU19JU1JFRyhtb2RlKSAmJiAobW9kZSAmIDAxMTEpKSA/IDB4MDMxNyA6IDApOworCWNvcHlfbGUxNihkaXJlbnQudmVyc2lvbiwgMTApOworCWNvcHlfbGUxNihkaXJlbnQuZmxhZ3MsIDApOworCWNvcHlfbGUxNihkaXJlbnQuY29tcHJlc3Npb25fbWV0aG9kLCBtZXRob2QpOworCWNvcHlfbGUxNihkaXJlbnQubXRpbWUsIHppcF90aW1lKTsKKwljb3B5X2xlMTYoZGlyZW50Lm1kYXRlLCB6aXBfZGF0ZSk7CisJY29weV9sZTMyKGRpcmVudC5jcmMzMiwgY3JjKTsKKwljb3B5X2xlMzIoZGlyZW50LmNvbXByZXNzZWRfc2l6ZSwgY29tcHJlc3NlZF9zaXplKTsKKwljb3B5X2xlMzIoZGlyZW50LnNpemUsIHVuY29tcHJlc3NlZF9zaXplKTsKKwljb3B5X2xlMTYoZGlyZW50LmZpbGVuYW1lX2xlbmd0aCwgcGF0aGxlbik7CisJY29weV9sZTE2KGRpcmVudC5leHRyYV9sZW5ndGgsIDApOworCWNvcHlfbGUxNihkaXJlbnQuY29tbWVudF9sZW5ndGgsIDApOworCWNvcHlfbGUxNihkaXJlbnQuZGlzaywgMCk7CisJY29weV9sZTE2KGRpcmVudC5hdHRyMSwgMCk7CisJY29weV9sZTMyKGRpcmVudC5hdHRyMiwgYXR0cjIpOworCWNvcHlfbGUzMihkaXJlbnQub2Zmc2V0LCB6aXBfb2Zmc2V0KTsKKwltZW1jcHkoemlwX2RpciArIHppcF9kaXJfb2Zmc2V0LCAmZGlyZW50LCBaSVBfRElSX0hFQURFUl9TSVpFKTsKKwl6aXBfZGlyX29mZnNldCArPSBaSVBfRElSX0hFQURFUl9TSVpFOworCW1lbWNweSh6aXBfZGlyICsgemlwX2Rpcl9vZmZzZXQsIHBhdGgsIHBhdGhsZW4pOworCXppcF9kaXJfb2Zmc2V0ICs9IHBhdGhsZW47CisJemlwX2Rpcl9lbnRyaWVzKys7CisKKwljb3B5X2xlMzIoaGVhZGVyLm1hZ2ljLCAweDA0MDM0YjUwKTsKKwljb3B5X2xlMTYoaGVhZGVyLnZlcnNpb24sIDEwKTsKKwljb3B5X2xlMTYoaGVhZGVyLmZsYWdzLCAwKTsKKwljb3B5X2xlMTYoaGVhZGVyLmNvbXByZXNzaW9uX21ldGhvZCwgbWV0aG9kKTsKKwljb3B5X2xlMTYoaGVhZGVyLm10aW1lLCB6aXBfdGltZSk7CisJY29weV9sZTE2KGhlYWRlci5tZGF0ZSwgemlwX2RhdGUpOworCWNvcHlfbGUzMihoZWFkZXIuY3JjMzIsIGNyYyk7CisJY29weV9sZTMyKGhlYWRlci5jb21wcmVzc2VkX3NpemUsIGNvbXByZXNzZWRfc2l6ZSk7CisJY29weV9sZTMyKGhlYWRlci5zaXplLCB1bmNvbXByZXNzZWRfc2l6ZSk7CisJY29weV9sZTE2KGhlYWRlci5maWxlbmFtZV9sZW5ndGgsIHBhdGhsZW4pOworCWNvcHlfbGUxNihoZWFkZXIuZXh0cmFfbGVuZ3RoLCAwKTsKKwl3cml0ZV9vcl9kaWUoMSwgJmhlYWRlciwgWklQX0xPQ0FMX0hFQURFUl9TSVpFKTsKKwl6aXBfb2Zmc2V0ICs9IFpJUF9MT0NBTF9IRUFERVJfU0laRTsKKwl3cml0ZV9vcl9kaWUoMSwgcGF0aCwgcGF0aGxlbik7CisJemlwX29mZnNldCArPSBwYXRobGVuOworCWlmIChjb21wcmVzc2VkX3NpemUgPiAwKSB7CisJCXdyaXRlX29yX2RpZSgxLCBvdXQsIGNvbXByZXNzZWRfc2l6ZSk7CisJCXppcF9vZmZzZXQgKz0gY29tcHJlc3NlZF9zaXplOworCX0KKworb3V0OgorCWZyZWUoYnVmZmVyKTsKKwlmcmVlKGRlZmxhdGVkKTsKKwlmcmVlKHBhdGgpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfemlwX3RyYWlsZXIoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3QgemlwX2Rpcl90cmFpbGVyIHRyYWlsZXI7CisKKwljb3B5X2xlMzIodHJhaWxlci5tYWdpYywgMHgwNjA1NGI1MCk7CisJY29weV9sZTE2KHRyYWlsZXIuZGlzaywgMCk7CisJY29weV9sZTE2KHRyYWlsZXIuZGlyZWN0b3J5X3N0YXJ0X2Rpc2ssIDApOworCWNvcHlfbGUxNih0cmFpbGVyLmVudHJpZXNfb25fdGhpc19kaXNrLCB6aXBfZGlyX2VudHJpZXMpOworCWNvcHlfbGUxNih0cmFpbGVyLmVudHJpZXMsIHppcF9kaXJfZW50cmllcyk7CisJY29weV9sZTMyKHRyYWlsZXIuc2l6ZSwgemlwX2Rpcl9vZmZzZXQpOworCWNvcHlfbGUzMih0cmFpbGVyLm9mZnNldCwgemlwX29mZnNldCk7CisJY29weV9sZTE2KHRyYWlsZXIuY29tbWVudF9sZW5ndGgsIHNoYTEgPyA0MCA6IDApOworCisJd3JpdGVfb3JfZGllKDEsIHppcF9kaXIsIHppcF9kaXJfb2Zmc2V0KTsKKwl3cml0ZV9vcl9kaWUoMSwgJnRyYWlsZXIsIFpJUF9ESVJfVFJBSUxFUl9TSVpFKTsKKwlpZiAoc2hhMSkKKwkJd3JpdGVfb3JfZGllKDEsIHNoYTFfdG9faGV4KHNoYTEpLCA0MCk7Cit9CisKK3N0YXRpYyB2b2lkIGRvc190aW1lKHRpbWVfdCAqdGltZSwgaW50ICpkb3NfZGF0ZSwgaW50ICpkb3NfdGltZSkKK3sKKwlzdHJ1Y3QgdG0gKnQgPSBsb2NhbHRpbWUodGltZSk7CisKKwkqZG9zX2RhdGUgPSB0LT50bV9tZGF5ICsgKHQtPnRtX21vbiArIDEpICogMzIgKworCSAgICAgICAgICAgICh0LT50bV95ZWFyICsgMTkwMCAtIDE5ODApICogNTEyOworCSpkb3NfdGltZSA9IHQtPnRtX3NlYyAvIDIgKyB0LT50bV9taW4gKiAzMiArIHQtPnRtX2hvdXIgKiAyMDQ4OworfQorCitpbnQgd3JpdGVfemlwX2FyY2hpdmUoc3RydWN0IGFyY2hpdmVyX2FyZ3MgKmFyZ3MpCit7CisJaW50IHBsZW4gPSBzdHJsZW4oYXJncy0+YmFzZSk7CisKKwlkb3NfdGltZSgmYXJncy0+dGltZSwgJnppcF9kYXRlLCAmemlwX3RpbWUpOworCisJemlwX2RpciA9IHhtYWxsb2MoWklQX0RJUkVDVE9SWV9NSU5fU0laRSk7CisJemlwX2Rpcl9zaXplID0gWklQX0RJUkVDVE9SWV9NSU5fU0laRTsKKwl2ZXJib3NlID0gYXJncy0+dmVyYm9zZTsKKwljb21taXQgPSBhcmdzLT5jb21taXQ7CisKKwlpZiAoYXJncy0+YmFzZSAmJiBwbGVuID4gMCAmJiBhcmdzLT5iYXNlW3BsZW4gLSAxXSA9PSAnLycpIHsKKwkJY2hhciAqYmFzZSA9IHhzdHJkdXAoYXJncy0+YmFzZSk7CisJCWludCBiYXNlbGVuID0gc3RybGVuKGJhc2UpOworCisJCXdoaWxlIChiYXNlbGVuID4gMCAmJiBiYXNlW2Jhc2VsZW4gLSAxXSA9PSAnLycpCisJCQliYXNlWy0tYmFzZWxlbl0gPSAnXDAnOworCQl3cml0ZV96aXBfZW50cnkoYXJncy0+dHJlZS0+b2JqZWN0LnNoYTEsICIiLCAwLCBiYXNlLCAwNDA3NzcsIDApOworCQlmcmVlKGJhc2UpOworCX0KKwlyZWFkX3RyZWVfcmVjdXJzaXZlKGFyZ3MtPnRyZWUsIGFyZ3MtPmJhc2UsIHBsZW4sIDAsCisJCQkgICAgYXJncy0+cGF0aHNwZWMsIHdyaXRlX3ppcF9lbnRyeSk7CisJd3JpdGVfemlwX3RyYWlsZXIoYXJncy0+Y29tbWl0X3NoYTEpOworCisJZnJlZSh6aXBfZGlyKTsKKworCXJldHVybiAwOworfQorCit2b2lkICpwYXJzZV9leHRyYV96aXBfYXJncyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisJZm9yICg7IGFyZ2MgPiAwOyBhcmdjLS0sIGFyZ3YrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2WzBdOworCisJCWlmIChhcmdbMF0gPT0gJy0nICYmIGlzZGlnaXQoYXJnWzFdKSAmJiBhcmdbMl0gPT0gJ1wwJykKKwkJCXpsaWJfY29tcHJlc3Npb25fbGV2ZWwgPSBhcmdbMV0gLSAnMCc7CisJCWVsc2UKKwkJCWRpZSgiVW5rbm93biBhcmd1bWVudCBmb3IgemlwIGZvcm1hdDogJXMiLCBhcmcpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2FyY2hpdmUuYyBiL2FyY2hpdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjE1OWZlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2ZS5jCkBAIC0wLDAgKzEsODQgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgImF0dHIuaCIKKworc3RhdGljIHZvaWQgZm9ybWF0X3N1YnN0KGNvbnN0IHN0cnVjdCBjb21taXQgKmNvbW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN0cmJ1ZiAqYnVmKQoreworCWNoYXIgKnRvX2ZyZWUgPSBOVUxMOworCXN0cnVjdCBzdHJidWYgZm10OworCisJaWYgKHNyYyA9PSBidWYtPmJ1ZikKKwkJdG9fZnJlZSA9IHN0cmJ1Zl9kZXRhY2goYnVmLCBOVUxMKTsKKwlzdHJidWZfaW5pdCgmZm10LCAwKTsKKwlmb3IgKDs7KSB7CisJCWNvbnN0IGNoYXIgKmIsICpjOworCisJCWIgPSBtZW1tZW0oc3JjLCBsZW4sICIkRm9ybWF0OiIsIDgpOworCQlpZiAoIWIgfHwgc3JjICsgbGVuIDwgYiArIDkpCisJCQlicmVhazsKKwkJYyA9IG1lbWNocihiICsgOCwgJyQnLCBsZW4gLSA4KTsKKwkJaWYgKCFjKQorCQkJYnJlYWs7CisKKwkJc3RyYnVmX3Jlc2V0KCZmbXQpOworCQlzdHJidWZfYWRkKCZmbXQsIGIgKyA4LCBjIC0gYiAtIDgpOworCisJCXN0cmJ1Zl9hZGQoYnVmLCBzcmMsIGIgLSBzcmMpOworCQlmb3JtYXRfY29tbWl0X21lc3NhZ2UoY29tbWl0LCBmbXQuYnVmLCBidWYpOworCQlsZW4gLT0gYyArIDEgLSBzcmM7CisJCXNyYyAgPSBjICsgMTsKKwl9CisJc3RyYnVmX2FkZChidWYsIHNyYywgbGVuKTsKKwlzdHJidWZfcmVsZWFzZSgmZm10KTsKKwlmcmVlKHRvX2ZyZWUpOworfQorCitzdGF0aWMgaW50IGNvbnZlcnRfdG9fYXJjaGl2ZShjb25zdCBjaGFyICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN0cmJ1ZiAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCXN0YXRpYyBzdHJ1Y3QgZ2l0X2F0dHIgKmF0dHJfZXhwb3J0X3N1YnN0OworCXN0cnVjdCBnaXRfYXR0cl9jaGVjayBjaGVja1sxXTsKKworCWlmICghY29tbWl0KQorCQlyZXR1cm4gMDsKKworCWlmICghYXR0cl9leHBvcnRfc3Vic3QpCisJCWF0dHJfZXhwb3J0X3N1YnN0ID0gZ2l0X2F0dHIoImV4cG9ydC1zdWJzdCIsIDEyKTsKKworCWNoZWNrWzBdLmF0dHIgPSBhdHRyX2V4cG9ydF9zdWJzdDsKKwlpZiAoZ2l0X2NoZWNrYXR0cihwYXRoLCBBUlJBWV9TSVpFKGNoZWNrKSwgY2hlY2spKQorCQlyZXR1cm4gMDsKKwlpZiAoIUFUVFJfVFJVRShjaGVja1swXS52YWx1ZSkpCisJCXJldHVybiAwOworCisJZm9ybWF0X3N1YnN0KGNvbW1pdCwgc3JjLCBsZW4sIGJ1Zik7CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgKnNoYTFfZmlsZV90b19hcmNoaXZlKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZSwgZW51bSBvYmplY3RfdHlwZSAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKnNpemVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCXZvaWQgKmJ1ZmZlcjsKKworCWJ1ZmZlciA9IHJlYWRfc2hhMV9maWxlKHNoYTEsIHR5cGUsIHNpemVwKTsKKwlpZiAoYnVmZmVyICYmIFNfSVNSRUcobW9kZSkpIHsKKwkJc3RydWN0IHN0cmJ1ZiBidWY7CisJCXNpemVfdCBzaXplID0gMDsKKworCQlzdHJidWZfaW5pdCgmYnVmLCAwKTsKKwkJc3RyYnVmX2F0dGFjaCgmYnVmLCBidWZmZXIsICpzaXplcCwgKnNpemVwICsgMSk7CisJCWNvbnZlcnRfdG9fd29ya2luZ190cmVlKHBhdGgsIGJ1Zi5idWYsIGJ1Zi5sZW4sICZidWYpOworCQljb252ZXJ0X3RvX2FyY2hpdmUocGF0aCwgYnVmLmJ1ZiwgYnVmLmxlbiwgJmJ1ZiwgY29tbWl0KTsKKwkJYnVmZmVyID0gc3RyYnVmX2RldGFjaCgmYnVmLCAmc2l6ZSk7CisJCSpzaXplcCA9IHNpemU7CisJfQorCisJcmV0dXJuIGJ1ZmZlcjsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaGl2ZS5oIGIvYXJjaGl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OTFlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZlLmgKQEAgLTAsMCArMSw0OCBAQAorI2lmbmRlZiBBUkNISVZFX0gKKyNkZWZpbmUgQVJDSElWRV9ICisKKyNkZWZpbmUgTUFYX0VYVFJBX0FSR1MJMzIKKyNkZWZpbmUgTUFYX0FSR1MJKE1BWF9FWFRSQV9BUkdTICsgMzIpCisKK3N0cnVjdCBhcmNoaXZlcl9hcmdzIHsKKwljb25zdCBjaGFyICpiYXNlOworCXN0cnVjdCB0cmVlICp0cmVlOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbW1pdF9zaGExOworCWNvbnN0IHN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwl0aW1lX3QgdGltZTsKKwljb25zdCBjaGFyICoqcGF0aHNwZWM7CisJdW5zaWduZWQgaW50IHZlcmJvc2UgOiAxOworCXZvaWQgKmV4dHJhOworfTsKKwordHlwZWRlZiBpbnQgKCp3cml0ZV9hcmNoaXZlX2ZuX3QpKHN0cnVjdCBhcmNoaXZlcl9hcmdzICopOworCit0eXBlZGVmIHZvaWQgKigqcGFyc2VfZXh0cmFfYXJnc19mbl90KShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpOworCitzdHJ1Y3QgYXJjaGl2ZXIgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IGFyY2hpdmVyX2FyZ3MgYXJnczsKKwl3cml0ZV9hcmNoaXZlX2ZuX3Qgd3JpdGVfYXJjaGl2ZTsKKwlwYXJzZV9leHRyYV9hcmdzX2ZuX3QgcGFyc2VfZXh0cmE7Cit9OworCitleHRlcm4gaW50IHBhcnNlX2FyY2hpdmVfYXJncyhpbnQgYXJnYywKKwkJCSAgICAgIGNvbnN0IGNoYXIgKiphcmd2LAorCQkJICAgICAgc3RydWN0IGFyY2hpdmVyICphcik7CisKK2V4dGVybiB2b2lkIHBhcnNlX3RyZWVpc2hfYXJnKGNvbnN0IGNoYXIgKip0cmVlaXNoLAorCQkJICAgICAgc3RydWN0IGFyY2hpdmVyX2FyZ3MgKmFyX2FyZ3MsCisJCQkgICAgICBjb25zdCBjaGFyICpwcmVmaXgpOworCitleHRlcm4gdm9pZCBwYXJzZV9wYXRoc3BlY19hcmcoY29uc3QgY2hhciAqKnBhdGhzcGVjLAorCQkJICAgICAgIHN0cnVjdCBhcmNoaXZlcl9hcmdzICphcmdzKTsKKy8qCisgKiBBcmNoaXZlLWZvcm1hdCBzcGVjaWZpYyBiYWNrZW5kcy4KKyAqLworZXh0ZXJuIGludCB3cml0ZV90YXJfYXJjaGl2ZShzdHJ1Y3QgYXJjaGl2ZXJfYXJncyAqKTsKK2V4dGVybiBpbnQgd3JpdGVfemlwX2FyY2hpdmUoc3RydWN0IGFyY2hpdmVyX2FyZ3MgKik7CitleHRlcm4gdm9pZCAqcGFyc2VfZXh0cmFfemlwX2FyZ3MoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KTsKKworZXh0ZXJuIHZvaWQgKnNoYTFfZmlsZV90b19hcmNoaXZlKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHVuc2lnbmVkIGludCBtb2RlLCBlbnVtIG9iamVjdF90eXBlICp0eXBlLCB1bnNpZ25lZCBsb25nICpzaXplLCBjb25zdCBzdHJ1Y3QgY29tbWl0ICpjb21taXQpOworCisjZW5kaWYJLyogQVJDSElWRV9IICovCmRpZmYgLS1naXQgYS9hcm0vc2hhMS5jIGIvYXJtL3NoYTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTNhZTAzCi0tLSAvZGV2L251bGwKKysrIGIvYXJtL3NoYTEuYwpAQCAtMCwwICsxLDgyIEBACisvKgorICogU0hBLTEgaW1wbGVtZW50YXRpb24gb3B0aW1pemVkIGZvciBBUk0KKyAqCisgKiBDb3B5cmlnaHQ6ICAgKEMpIDIwMDUgYnkgTmljb2xhcyBQaXRyZSA8bmljb0BjYW0ub3JnPgorICogQ3JlYXRlZDogICAgIFNlcHRlbWJlciAxNywgMjAwNQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJzaGExLmgiCisKK2V4dGVybiB2b2lkIHNoYV90cmFuc2Zvcm0odWludDMyX3QgKmhhc2gsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVpbnQzMl90ICpXKTsKKwordm9pZCBTSEExX0luaXQoU0hBX0NUWCAqYykKK3sKKwljLT5sZW4gPSAwOworCWMtPmhhc2hbMF0gPSAweDY3NDUyMzAxOworCWMtPmhhc2hbMV0gPSAweGVmY2RhYjg5OworCWMtPmhhc2hbMl0gPSAweDk4YmFkY2ZlOworCWMtPmhhc2hbM10gPSAweDEwMzI1NDc2OworCWMtPmhhc2hbNF0gPSAweGMzZDJlMWYwOworfQorCit2b2lkIFNIQTFfVXBkYXRlKFNIQV9DVFggKmMsIGNvbnN0IHZvaWQgKnAsIHVuc2lnbmVkIGxvbmcgbikKK3sKKwl1aW50MzJfdCB3b3Jrc3BhY2VbODBdOworCXVuc2lnbmVkIGludCBwYXJ0aWFsOworCXVuc2lnbmVkIGxvbmcgZG9uZTsKKworCXBhcnRpYWwgPSBjLT5sZW4gJiAweDNmOworCWMtPmxlbiArPSBuOworCWlmICgocGFydGlhbCArIG4pID49IDY0KSB7CisJCWlmIChwYXJ0aWFsKSB7CisJCQlkb25lID0gNjQgLSBwYXJ0aWFsOworCQkJbWVtY3B5KGMtPmJ1ZmZlciArIHBhcnRpYWwsIHAsIGRvbmUpOworCQkJc2hhX3RyYW5zZm9ybShjLT5oYXNoLCBjLT5idWZmZXIsIHdvcmtzcGFjZSk7CisJCQlwYXJ0aWFsID0gMDsKKwkJfSBlbHNlCisJCQlkb25lID0gMDsKKwkJd2hpbGUgKG4gPj0gZG9uZSArIDY0KSB7CisJCQlzaGFfdHJhbnNmb3JtKGMtPmhhc2gsIHAgKyBkb25lLCB3b3Jrc3BhY2UpOworCQkJZG9uZSArPSA2NDsKKwkJfQorCX0gZWxzZQorCQlkb25lID0gMDsKKwlpZiAobiAtIGRvbmUpCisJCW1lbWNweShjLT5idWZmZXIgKyBwYXJ0aWFsLCBwICsgZG9uZSwgbiAtIGRvbmUpOworfQorCit2b2lkIFNIQTFfRmluYWwodW5zaWduZWQgY2hhciAqaGFzaCwgU0hBX0NUWCAqYykKK3sKKwl1aW50NjRfdCBiaXRsZW47CisJdWludDMyX3QgYml0bGVuX2hpLCBiaXRsZW5fbG87CisJdW5zaWduZWQgaW50IGksIG9mZnNldCwgcGFkbGVuOworCXVuc2lnbmVkIGNoYXIgYml0c1s4XTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwYWRkaW5nWzY0XSA9IHsgMHg4MCwgfTsKKworCWJpdGxlbiA9IGMtPmxlbiA8PCAzOworCW9mZnNldCA9IGMtPmxlbiAmIDB4M2Y7CisJcGFkbGVuID0gKChvZmZzZXQgPCA1NikgPyA1NiA6ICg2NCArIDU2KSkgLSBvZmZzZXQ7CisJU0hBMV9VcGRhdGUoYywgcGFkZGluZywgcGFkbGVuKTsKKworCWJpdGxlbl9oaSA9IGJpdGxlbiA+PiAzMjsKKwliaXRsZW5fbG8gPSBiaXRsZW4gJiAweGZmZmZmZmZmOworCWJpdHNbMF0gPSBiaXRsZW5faGkgPj4gMjQ7CisJYml0c1sxXSA9IGJpdGxlbl9oaSA+PiAxNjsKKwliaXRzWzJdID0gYml0bGVuX2hpID4+IDg7CisJYml0c1szXSA9IGJpdGxlbl9oaTsKKwliaXRzWzRdID0gYml0bGVuX2xvID4+IDI0OworCWJpdHNbNV0gPSBiaXRsZW5fbG8gPj4gMTY7CisJYml0c1s2XSA9IGJpdGxlbl9sbyA+PiA4OworCWJpdHNbN10gPSBiaXRsZW5fbG87CisJU0hBMV9VcGRhdGUoYywgYml0cywgOCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCXVpbnQzMl90IHYgPSBjLT5oYXNoW2ldOworCQloYXNoWzBdID0gdiA+PiAyNDsKKwkJaGFzaFsxXSA9IHYgPj4gMTY7CisJCWhhc2hbMl0gPSB2ID4+IDg7CisJCWhhc2hbM10gPSB2OworCQloYXNoICs9IDQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJtL3NoYTEuaCBiL2FybS9zaGExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk1MjY0NgotLS0gL2Rldi9udWxsCisrKyBiL2FybS9zaGExLmgKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIFNIQS0xIGltcGxlbWVudGF0aW9uIG9wdGltaXplZCBmb3IgQVJNCisgKgorICogQ29weXJpZ2h0OgkoQykgMjAwNSBieSBOaWNvbGFzIFBpdHJlIDxuaWNvQGNhbS5vcmc+CisgKiBDcmVhdGVkOglTZXB0ZW1iZXIgMTcsIDIwMDUKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3R5cGVkZWYgc3RydWN0IHNoYV9jb250ZXh0IHsKKwl1aW50NjRfdCBsZW47CisJdWludDMyX3QgaGFzaFs1XTsKKwl1bnNpZ25lZCBjaGFyIGJ1ZmZlcls2NF07Cit9IFNIQV9DVFg7CisKK3ZvaWQgU0hBMV9Jbml0KFNIQV9DVFggKmMpOwordm9pZCBTSEExX1VwZGF0ZShTSEFfQ1RYICpjLCBjb25zdCB2b2lkICpwLCB1bnNpZ25lZCBsb25nIG4pOwordm9pZCBTSEExX0ZpbmFsKHVuc2lnbmVkIGNoYXIgKmhhc2gsIFNIQV9DVFggKmMpOwpkaWZmIC0tZ2l0IGEvYXJtL3NoYTFfYXJtLlMgYi9hcm0vc2hhMV9hcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzFjYjk5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJtL3NoYTFfYXJtLlMKQEAgLTAsMCArMSwxODMgQEAKKy8qCisgKiAgU0hBIHRyYW5zZm9ybSBvcHRpbWl6ZWQgZm9yIEFSTQorICoKKyAqICBDb3B5cmlnaHQ6CShDKSAyMDA1IGJ5IE5pY29sYXMgUGl0cmUgPG5pY29AY2FtLm9yZz4KKyAqICBDcmVhdGVkOglTZXB0ZW1iZXIgMTcsIDIwMDUKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKwkudGV4dAorCS5nbG9ibAlzaGFfdHJhbnNmb3JtCisKKy8qCisgKiB2b2lkIHNoYV90cmFuc2Zvcm0odWludDMyX3QgKmhhc2gsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVpbnQzMl90ICpXKTsKKyAqCisgKiBub3RlOiB0aGUgImRhdGEiIHBvaW50ZXIgbWF5IGJlIHVuYWxpZ25lZC4KKyAqLworCitzaGFfdHJhbnNmb3JtOgorCisJc3RtZmQJc3AhLCB7cjQgLSByOCwgbHJ9CisKKwlAIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCUAgICAgICAgICBXW2ldID0gbnRvaGwoKCh1aW50MzJfdCAqKWRhdGEpW2ldKTsKKworI2lmZGVmIF9fQVJNRUJfXworCW1vdglyNCwgcjAKKwltb3YJcjAsIHIyCisJbW92CXIyLCAjNjQKKwlibAltZW1jcHkKKwltb3YJcjIsIHIwCisJbW92CXIwLCByNAorI2Vsc2UKKwltb3YJcjMsIHIyCisJbW92CWxyLCAjMTYKKzE6CWxkcmIJcjQsIFtyMV0sICMxCisJbGRyYglyNSwgW3IxXSwgIzEKKwlsZHJiCXI2LCBbcjFdLCAjMQorCWxkcmIJcjcsIFtyMV0sICMxCisJc3VicwlsciwgbHIsICMxCisJb3JyCXI1LCByNSwgcjQsIGxzbCAjOAorCW9ycglyNiwgcjYsIHI1LCBsc2wgIzgKKwlvcnIJcjcsIHI3LCByNiwgbHNsICM4CisJc3RyCXI3LCBbcjNdLCAjNAorCWJuZQkxYgorI2VuZGlmCisKKwlAIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorCUAgICAgICAgICBXW2krMTZdID0gcm9yKFdbaSsxM10gXiBXW2krOF0gXiBXW2krMl0gXiBXW2ldLCAzMSk7CisKKwlzdWIJcjMsIHIyLCAjNAorCW1vdglsciwgIzY0CisyOglsZHIJcjQsIFtyMywgIzRdIQorCXN1YnMJbHIsIGxyLCAjMQorCWxkcglyNSwgW3IzLCAjOF0KKwlsZHIJcjYsIFtyMywgIzMyXQorCWxkcglyNywgW3IzLCAjNTJdCisJZW9yCXI0LCByNCwgcjUKKwllb3IJcjQsIHI0LCByNgorCWVvcglyNCwgcjQsIHI3CisJbW92CXI0LCByNCwgcm9yICMzMQorCXN0cglyNCwgW3IzLCAjNjRdCisJYm5lCTJiCisKKwkvKgorCSAqIFRoZSBTSEEgZnVuY3Rpb25zIGFyZToKKwkgKgorCSAqIGYxKEIsQyxEKSA9IChEIF4gKEIgJiAoQyBeIEQpKSkKKwkgKiBmMihCLEMsRCkgPSAoQiBeIEMgXiBEKQorCSAqIGYzKEIsQyxEKSA9ICgoQiAmIEMpIHwgKEQgJiAoQiB8IEMpKSkKKwkgKgorCSAqIFRoZW4gdGhlIHN1Yi1ibG9ja3MgYXJlIHByb2Nlc3NlZCBhcyBmb2xsb3dzOgorCSAqCisJICogQScgPSByb3IoQSwgMjcpICsgZihCLEMsRCkgKyBFICsgSyArICpXKysKKwkgKiBCJyA9IEEKKwkgKiBDJyA9IHJvcihCLCAyKQorCSAqIEQnID0gQworCSAqIEUnID0gRAorCSAqCisJICogV2UgdGhlcmVmb3JlIHVucm9sbCBlYWNoIGxvb3AgNSB0aW1lcyB0byBhdm9pZCByZWdpc3RlciBzaHVmZmxpbmcuCisJICogQWxzbyB0aGUgcm9yIGZvciBDIChhbmQgYWxzbyBEIGFuZCBFIHdoaWNoIGFyZSBzdWNjZXNzaXZlbHlkZXJpdmVkCisJICogZnJvbSBpdCkgaXMgYXBwbGllZCBpbiBwbGFjZSB0byBjdXQgb24gYW4gYWRkaXRpb25hbCBtb3YgaW5zbiBmb3IKKwkgKiBlYWNoIHJvdW5kLgorCSAqLworCisJLm1hY3JvCXNoYV9mMSwgQSwgQiwgQywgRCwgRQorCWxkcglyMywgW3IyXSwgIzQKKwllb3IJaXAsIFxDLCBcRAorCWFkZAlcRSwgcjEsIFxFLCByb3IgIzIKKwlhbmQJaXAsIFxCLCBpcCwgcm9yICMyCisJYWRkCVxFLCBcRSwgXEEsIHJvciAjMjcKKwllb3IJaXAsIGlwLCBcRCwgcm9yICMyCisJYWRkCVxFLCBcRSwgcjMKKwlhZGQJXEUsIFxFLCBpcAorCS5lbmRtCisKKwkubWFjcm8Jc2hhX2YyLCBBLCBCLCBDLCBELCBFCisJbGRyCXIzLCBbcjJdLCAjNAorCWFkZAlcRSwgcjEsIFxFLCByb3IgIzIKKwllb3IJaXAsIFxCLCBcQywgcm9yICMyCisJYWRkCVxFLCBcRSwgXEEsIHJvciAjMjcKKwllb3IJaXAsIGlwLCBcRCwgcm9yICMyCisJYWRkCVxFLCBcRSwgcjMKKwlhZGQJXEUsIFxFLCBpcAorCS5lbmRtCisKKwkubWFjcm8Jc2hhX2YzLCBBLCBCLCBDLCBELCBFCisJbGRyCXIzLCBbcjJdLCAjNAorCWFkZAlcRSwgcjEsIFxFLCByb3IgIzIKKwlvcnIJaXAsIFxCLCBcQywgcm9yICMyCisJYWRkCVxFLCBcRSwgXEEsIHJvciAjMjcKKwlhbmQJaXAsIGlwLCBcRCwgcm9yICMyCisJYWRkCVxFLCBcRSwgcjMKKwlhbmQJcjMsIFxCLCBcQywgcm9yICMyCisJb3JyCWlwLCBpcCwgcjMKKwlhZGQJXEUsIFxFLCBpcAorCS5lbmRtCisKKwlsZG1pYQlyMCwge3I0IC0gcjh9CisKKwltb3YJbHIsICM0CisJbGRyCXIxLCAuTF9zaGFfSyArIDAKKworCS8qIGFkanVzdCBpbml0aWFsIHZhbHVlcyAqLworCW1vdglyNiwgcjYsIHJvciAjMzAKKwltb3YJcjcsIHI3LCByb3IgIzMwCisJbW92CXI4LCByOCwgcm9yICMzMAorCiszOglzdWJzCWxyLCBsciwgIzEKKwlzaGFfZjEJcjQsIHI1LCByNiwgcjcsIHI4CisJc2hhX2YxCXI4LCByNCwgcjUsIHI2LCByNworCXNoYV9mMQlyNywgcjgsIHI0LCByNSwgcjYKKwlzaGFfZjEJcjYsIHI3LCByOCwgcjQsIHI1CisJc2hhX2YxCXI1LCByNiwgcjcsIHI4LCByNAorCWJuZQkzYgorCisJbGRyCXIxLCAuTF9zaGFfSyArIDQKKwltb3YJbHIsICM0CisKKzQ6CXN1YnMJbHIsIGxyLCAjMQorCXNoYV9mMglyNCwgcjUsIHI2LCByNywgcjgKKwlzaGFfZjIJcjgsIHI0LCByNSwgcjYsIHI3CisJc2hhX2YyCXI3LCByOCwgcjQsIHI1LCByNgorCXNoYV9mMglyNiwgcjcsIHI4LCByNCwgcjUKKwlzaGFfZjIJcjUsIHI2LCByNywgcjgsIHI0CisJYm5lCTRiCisKKwlsZHIJcjEsIC5MX3NoYV9LICsgOAorCW1vdglsciwgIzQKKworNToJc3VicwlsciwgbHIsICMxCisJc2hhX2YzCXI0LCByNSwgcjYsIHI3LCByOAorCXNoYV9mMwlyOCwgcjQsIHI1LCByNiwgcjcKKwlzaGFfZjMJcjcsIHI4LCByNCwgcjUsIHI2CisJc2hhX2YzCXI2LCByNywgcjgsIHI0LCByNQorCXNoYV9mMwlyNSwgcjYsIHI3LCByOCwgcjQKKwlibmUJNWIKKworCWxkcglyMSwgLkxfc2hhX0sgKyAxMgorCW1vdglsciwgIzQKKworNjoJc3VicwlsciwgbHIsICMxCisJc2hhX2YyCXI0LCByNSwgcjYsIHI3LCByOAorCXNoYV9mMglyOCwgcjQsIHI1LCByNiwgcjcKKwlzaGFfZjIJcjcsIHI4LCByNCwgcjUsIHI2CisJc2hhX2YyCXI2LCByNywgcjgsIHI0LCByNQorCXNoYV9mMglyNSwgcjYsIHI3LCByOCwgcjQKKwlibmUJNmIKKworCWxkbWlhCXIwLCB7cjEsIHIyLCByMywgaXAsIGxyfQorCWFkZAlyNCwgcjEsIHI0CisJYWRkCXI1LCByMiwgcjUKKwlhZGQJcjYsIHIzLCByNiwgcm9yICMyCisJYWRkCXI3LCBpcCwgcjcsIHJvciAjMgorCWFkZAlyOCwgbHIsIHI4LCByb3IgIzIKKwlzdG1pYQlyMCwge3I0IC0gcjh9CisKKwlsZG1mZAlzcCEsIHtyNCAtIHI4LCBwY30KKworLkxfc2hhX0s6CisJLndvcmQJMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwgMHg4ZjFiYmNkYywgMHhjYTYyYzFkNgpkaWZmIC0tZ2l0IGEvYXR0ci5jIGIvYXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Yjc3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9hdHRyLmMKQEAgLTAsMCArMSw2MzUgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImF0dHIuaCIKKworY29uc3QgY2hhciBnaXRfYXR0cl9fdHJ1ZVtdID0gIihidWlsdGluKXRydWUiOworY29uc3QgY2hhciBnaXRfYXR0cl9fZmFsc2VbXSA9ICJcMChidWlsdGluKWZhbHNlIjsKK3N0YXRpYyBjb25zdCBjaGFyIGdpdF9hdHRyX191bmtub3duW10gPSAiKGJ1aWx0aW4pdW5rbm93biI7CisjZGVmaW5lIEFUVFJfX1RSVUUgZ2l0X2F0dHJfX3RydWUKKyNkZWZpbmUgQVRUUl9fRkFMU0UgZ2l0X2F0dHJfX2ZhbHNlCisjZGVmaW5lIEFUVFJfX1VOU0VUIE5VTEwKKyNkZWZpbmUgQVRUUl9fVU5LTk9XTiBnaXRfYXR0cl9fdW5rbm93bgorCisvKgorICogVGhlIGJhc2ljIGRlc2lnbiBkZWNpc2lvbiBoZXJlIGlzIHRoYXQgd2UgYXJlIG5vdCBnb2luZyB0byBoYXZlCisgKiBpbnNhbmVseSBsYXJnZSBudW1iZXIgb2YgYXR0cmlidXRlcy4KKyAqCisgKiBUaGlzIGlzIGEgcmFuZG9tbHkgY2hvc2VuIHByaW1lLgorICovCisjZGVmaW5lIEhBU0hTSVpFIDI1NworCisjaWZuZGVmIERFQlVHX0FUVFIKKyNkZWZpbmUgREVCVUdfQVRUUiAwCisjZW5kaWYKKworc3RydWN0IGdpdF9hdHRyIHsKKwlzdHJ1Y3QgZ2l0X2F0dHIgKm5leHQ7CisJdW5zaWduZWQgaDsKKwlpbnQgYXR0cl9ucjsKKwljaGFyIG5hbWVbRkxFWF9BUlJBWV07Cit9Oworc3RhdGljIGludCBhdHRyX25yOworCitzdGF0aWMgc3RydWN0IGdpdF9hdHRyX2NoZWNrICpjaGVja19hbGxfYXR0cjsKK3N0YXRpYyBzdHJ1Y3QgZ2l0X2F0dHIgKihnaXRfYXR0cl9oYXNoW0hBU0hTSVpFXSk7CisKK3N0YXRpYyB1bnNpZ25lZCBoYXNoX25hbWUoY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pCit7CisJdW5zaWduZWQgdmFsID0gMDsKKwl1bnNpZ25lZCBjaGFyIGM7CisKKwl3aGlsZSAobmFtZWxlbi0tKSB7CisJCWMgPSAqbmFtZSsrOworCQl2YWwgPSAoKHZhbCA8PCA3KSB8ICh2YWwgPj4gMjIpKSBeIGM7CisJfQorCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgaW52YWxpZF9hdHRyX25hbWUoY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pCit7CisJLyoKKwkgKiBBdHRyaWJ1dGUgbmFtZSBjYW5ub3QgYmVnaW4gd2l0aCAnLScgYW5kIGZyb20KKwkgKiBbLUEtWmEtejAtOV8uXS4gIFdlJ2Qgc3BlY2lmaWNhbGx5IGV4Y2x1ZGUgJz0nIGZvciBub3csCisJICogYXMgd2UgbWlnaHQgbGF0ZXIgd2FudCB0byBhbGxvdyBub24tYmluYXJ5IHZhbHVlIGZvcgorCSAqIGF0dHJpYnV0ZXMsIGUuZy4gIiouc3ZnCW1lcmdlPXNwZWNpYWwtbWVyZ2UtcHJvZ3JhbS1mb3Itc3ZnIgorCSAqLworCWlmICgqbmFtZSA9PSAnLScpCisJCXJldHVybiAtMTsKKwl3aGlsZSAobmFtZWxlbi0tKSB7CisJCWNoYXIgY2ggPSAqbmFtZSsrOworCQlpZiAoISAoY2ggPT0gJy0nIHx8IGNoID09ICcuJyB8fCBjaCA9PSAnXycgfHwKKwkJICAgICAgICgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKSB8fAorCQkgICAgICAgKCdhJyA8PSBjaCAmJiBjaCA8PSAneicpIHx8CisJCSAgICAgICAoJ0EnIDw9IGNoICYmIGNoIDw9ICdaJykpICkKKwkJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBnaXRfYXR0ciAqZ2l0X2F0dHIoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBodmFsID0gaGFzaF9uYW1lKG5hbWUsIGxlbik7CisJdW5zaWduZWQgcG9zID0gaHZhbCAlIEhBU0hTSVpFOworCXN0cnVjdCBnaXRfYXR0ciAqYTsKKworCWZvciAoYSA9IGdpdF9hdHRyX2hhc2hbcG9zXTsgYTsgYSA9IGEtPm5leHQpIHsKKwkJaWYgKGEtPmggPT0gaHZhbCAmJgorCQkgICAgIW1lbWNtcChhLT5uYW1lLCBuYW1lLCBsZW4pICYmICFhLT5uYW1lW2xlbl0pCisJCQlyZXR1cm4gYTsKKwl9CisKKwlpZiAoaW52YWxpZF9hdHRyX25hbWUobmFtZSwgbGVuKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlhID0geG1hbGxvYyhzaXplb2YoKmEpICsgbGVuICsgMSk7CisJbWVtY3B5KGEtPm5hbWUsIG5hbWUsIGxlbik7CisJYS0+bmFtZVtsZW5dID0gMDsKKwlhLT5oID0gaHZhbDsKKwlhLT5uZXh0ID0gZ2l0X2F0dHJfaGFzaFtwb3NdOworCWEtPmF0dHJfbnIgPSBhdHRyX25yKys7CisJZ2l0X2F0dHJfaGFzaFtwb3NdID0gYTsKKworCWNoZWNrX2FsbF9hdHRyID0geHJlYWxsb2MoY2hlY2tfYWxsX2F0dHIsCisJCQkJICBzaXplb2YoKmNoZWNrX2FsbF9hdHRyKSAqIGF0dHJfbnIpOworCWNoZWNrX2FsbF9hdHRyW2EtPmF0dHJfbnJdLmF0dHIgPSBhOworCWNoZWNrX2FsbF9hdHRyW2EtPmF0dHJfbnJdLnZhbHVlID0gQVRUUl9fVU5LTk9XTjsKKwlyZXR1cm4gYTsKK30KKworLyoKKyAqIC5naXRhdHRyaWJ1dGVzIGZpbGUgaXMgb25lIGxpbmUgcGVyIHJlY29yZCwgZWFjaCBvZiB3aGljaCBpcworICoKKyAqICgxKSBnbG9iIHBhdHRlcm4uCisgKiAoMikgd2hpdGVzcGFjZQorICogKDMpIHdoaXRlc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlIG5hbWVzLCBlYWNoIG9mIHdoaWNoCisgKiAgICAgY291bGQgYmUgcHJlZml4ZWQgd2l0aCAnLScgdG8gbWVhbiAic2V0IHRvIGZhbHNlIiwgJyEnIHRvIG1lYW4KKyAqICAgICAidW5zZXQiLgorICovCisKKy8qIFdoYXQgZG9lcyBhIG1hdGNoZWQgcGF0dGVybiBkZWNpZGU/ICovCitzdHJ1Y3QgYXR0cl9zdGF0ZSB7CisJc3RydWN0IGdpdF9hdHRyICphdHRyOworCWNvbnN0IGNoYXIgKnNldHRvOworfTsKKworc3RydWN0IG1hdGNoX2F0dHIgeworCXVuaW9uIHsKKwkJY2hhciAqcGF0dGVybjsKKwkJc3RydWN0IGdpdF9hdHRyICphdHRyOworCX0gdTsKKwljaGFyIGlzX21hY3JvOworCXVuc2lnbmVkIG51bV9hdHRyOworCXN0cnVjdCBhdHRyX3N0YXRlIHN0YXRlW0ZMRVhfQVJSQVldOworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgYmxhbmtbXSA9ICIgXHRcclxuIjsKKworc3RhdGljIGNvbnN0IGNoYXIgKnBhcnNlX2F0dHIoY29uc3QgY2hhciAqc3JjLCBpbnQgbGluZW5vLCBjb25zdCBjaGFyICpjcCwKKwkJCSAgICAgIGludCAqbnVtX2F0dHIsIHN0cnVjdCBtYXRjaF9hdHRyICpyZXMpCit7CisJY29uc3QgY2hhciAqZXAsICplcXVhbHM7CisJaW50IGxlbjsKKworCWVwID0gY3AgKyBzdHJjc3BuKGNwLCBibGFuayk7CisJZXF1YWxzID0gc3RyY2hyKGNwLCAnPScpOworCWlmIChlcXVhbHMgJiYgZXAgPCBlcXVhbHMpCisJCWVxdWFscyA9IE5VTEw7CisJaWYgKGVxdWFscykKKwkJbGVuID0gZXF1YWxzIC0gY3A7CisJZWxzZQorCQlsZW4gPSBlcCAtIGNwOworCWlmICghcmVzKSB7CisJCWlmICgqY3AgPT0gJy0nIHx8ICpjcCA9PSAnIScpIHsKKwkJCWNwKys7CisJCQlsZW4tLTsKKwkJfQorCQlpZiAoaW52YWxpZF9hdHRyX25hbWUoY3AsIGxlbikpIHsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSIlLipzIGlzIG5vdCBhIHZhbGlkIGF0dHJpYnV0ZSBuYW1lOiAlczolZFxuIiwKKwkJCQlsZW4sIGNwLCBzcmMsIGxpbmVubyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCXN0cnVjdCBhdHRyX3N0YXRlICplOworCisJCWUgPSAmKHJlcy0+c3RhdGVbKm51bV9hdHRyXSk7CisJCWlmICgqY3AgPT0gJy0nIHx8ICpjcCA9PSAnIScpIHsKKwkJCWUtPnNldHRvID0gKCpjcCA9PSAnLScpID8gQVRUUl9fRkFMU0UgOiBBVFRSX19VTlNFVDsKKwkJCWNwKys7CisJCQlsZW4tLTsKKwkJfQorCQllbHNlIGlmICghZXF1YWxzKQorCQkJZS0+c2V0dG8gPSBBVFRSX19UUlVFOworCQllbHNlIHsKKwkJCWUtPnNldHRvID0geG1lbWR1cHooZXF1YWxzICsgMSwgZXAgLSBlcXVhbHMgLSAxKTsKKwkJfQorCQllLT5hdHRyID0gZ2l0X2F0dHIoY3AsIGxlbik7CisJfQorCSgqbnVtX2F0dHIpKys7CisJcmV0dXJuIGVwICsgc3Ryc3BuKGVwLCBibGFuayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWF0Y2hfYXR0ciAqcGFyc2VfYXR0cl9saW5lKGNvbnN0IGNoYXIgKmxpbmUsIGNvbnN0IGNoYXIgKnNyYywKKwkJCQkJICBpbnQgbGluZW5vLCBpbnQgbWFjcm9fb2spCit7CisJaW50IG5hbWVsZW47CisJaW50IG51bV9hdHRyOworCWNvbnN0IGNoYXIgKmNwLCAqbmFtZTsKKwlzdHJ1Y3QgbWF0Y2hfYXR0ciAqcmVzID0gTlVMTDsKKwlpbnQgcGFzczsKKwlpbnQgaXNfbWFjcm87CisKKwljcCA9IGxpbmUgKyBzdHJzcG4obGluZSwgYmxhbmspOworCWlmICghKmNwIHx8ICpjcCA9PSAnIycpCisJCXJldHVybiBOVUxMOworCW5hbWUgPSBjcDsKKwluYW1lbGVuID0gc3RyY3NwbihuYW1lLCBibGFuayk7CisJaWYgKHN0cmxlbihBVFRSSUJVVEVfTUFDUk9fUFJFRklYKSA8IG5hbWVsZW4gJiYKKwkgICAgIXByZWZpeGNtcChuYW1lLCBBVFRSSUJVVEVfTUFDUk9fUFJFRklYKSkgeworCQlpZiAoIW1hY3JvX29rKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIG5vdCBhbGxvd2VkOiAlczolZFxuIiwKKwkJCQluYW1lLCBzcmMsIGxpbmVubyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpc19tYWNybyA9IDE7CisJCW5hbWUgKz0gc3RybGVuKEFUVFJJQlVURV9NQUNST19QUkVGSVgpOworCQluYW1lICs9IHN0cnNwbihuYW1lLCBibGFuayk7CisJCW5hbWVsZW4gPSBzdHJjc3BuKG5hbWUsIGJsYW5rKTsKKwkJaWYgKGludmFsaWRfYXR0cl9uYW1lKG5hbWUsIG5hbWVsZW4pKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiJS4qcyBpcyBub3QgYSB2YWxpZCBhdHRyaWJ1dGUgbmFtZTogJXM6JWRcbiIsCisJCQkJbmFtZWxlbiwgbmFtZSwgc3JjLCBsaW5lbm8pOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJZWxzZQorCQlpc19tYWNybyA9IDA7CisKKwlmb3IgKHBhc3MgPSAwOyBwYXNzIDwgMjsgcGFzcysrKSB7CisJCS8qIHBhc3MgMCBjb3VudHMgYW5kIGFsbG9jYXRlcywgcGFzcyAxIGZpbGxzICovCisJCW51bV9hdHRyID0gMDsKKwkJY3AgPSBuYW1lICsgbmFtZWxlbjsKKwkJY3AgPSBjcCArIHN0cnNwbihjcCwgYmxhbmspOworCQl3aGlsZSAoKmNwKSB7CisJCQljcCA9IHBhcnNlX2F0dHIoc3JjLCBsaW5lbm8sIGNwLCAmbnVtX2F0dHIsIHJlcyk7CisJCQlpZiAoIWNwKQorCQkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChwYXNzKQorCQkJYnJlYWs7CisJCXJlcyA9IHhjYWxsb2MoMSwKKwkJCSAgICAgIHNpemVvZigqcmVzKSArCisJCQkgICAgICBzaXplb2Yoc3RydWN0IGF0dHJfc3RhdGUpICogbnVtX2F0dHIgKworCQkJICAgICAgKGlzX21hY3JvID8gMCA6IG5hbWVsZW4gKyAxKSk7CisJCWlmIChpc19tYWNybykKKwkJCXJlcy0+dS5hdHRyID0gZ2l0X2F0dHIobmFtZSwgbmFtZWxlbik7CisJCWVsc2UgeworCQkJcmVzLT51LnBhdHRlcm4gPSAoY2hhciopJihyZXMtPnN0YXRlW251bV9hdHRyXSk7CisJCQltZW1jcHkocmVzLT51LnBhdHRlcm4sIG5hbWUsIG5hbWVsZW4pOworCQkJcmVzLT51LnBhdHRlcm5bbmFtZWxlbl0gPSAwOworCQl9CisJCXJlcy0+aXNfbWFjcm8gPSBpc19tYWNybzsKKwkJcmVzLT5udW1fYXR0ciA9IG51bV9hdHRyOworCX0KKwlyZXR1cm4gcmVzOworfQorCisvKgorICogTGlrZSBpbmZvL2V4Y2x1ZGUgYW5kIC5naXRpZ25vcmUsIHRoZSBhdHRyaWJ1dGUgaW5mb3JtYXRpb24gY2FuCisgKiBjb21lIGZyb20gbWFueSBwbGFjZXMuCisgKgorICogKDEpIC5naXRhdHRyaWJ1dGUgZmlsZSBvZiB0aGUgc2FtZSBkaXJlY3Rvcnk7CisgKiAoMikgLmdpdGF0dHJpYnV0ZSBmaWxlIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGlmICgxKSBkb2VzIG5vdCBoYXZlCisgKiAgICAgIGFueSBtYXRjaDsgdGhpcyBnb2VzIHJlY3Vyc2l2ZWx5IHVwd2FyZHMsIGp1c3QgbGlrZSAuZ2l0aWdub3JlLgorICogKDMpICRHSVRfRElSL2luZm8vYXR0cmlidXRlcywgd2hpY2ggb3ZlcnJpZGVzIGJvdGggb2YgdGhlIGFib3ZlLgorICoKKyAqIEluIHRoZSBzYW1lIGZpbGUsIGxhdGVyIGVudHJpZXMgb3ZlcnJpZGUgdGhlIGVhcmxpZXIgbWF0Y2gsIHNvIGluIHRoZQorICogZ2xvYmFsIGxpc3QsIHdlIHdvdWxkIGhhdmUgZW50cmllcyBmcm9tIGluZm8vYXR0cmlidXRlcyB0aGUgZWFybGllc3QKKyAqIChyZWFkaW5nIHRoZSBmaWxlIGZyb20gdG9wIHRvIGJvdHRvbSksIC5naXRhdHRyaWJ1dGUgb2YgdGhlIHJvb3QKKyAqIGRpcmVjdG9yeSAoYWdhaW4sIHJlYWRpbmcgdGhlIGZpbGUgZnJvbSB0b3AgdG8gYm90dG9tKSBkb3duIHRvIHRoZQorICogY3VycmVudCBkaXJlY3RvcnksIGFuZCB0aGVuIHNjYW4gdGhlIGxpc3QgYmFja3dhcmRzIHRvIGZpbmQgdGhlIGZpcnN0IG1hdGNoLgorICogVGhpcyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHdoYXQgZXhjbHVkZWQoKSBkb2VzIGluIGRpci5jIHRvIGRlYWwgd2l0aAorICogLmdpdGlnbm9yZQorICovCisKK3N0YXRpYyBzdHJ1Y3QgYXR0cl9zdGFjayB7CisJc3RydWN0IGF0dHJfc3RhY2sgKnByZXY7CisJY2hhciAqb3JpZ2luOworCXVuc2lnbmVkIG51bV9tYXRjaGVzOworCXVuc2lnbmVkIGFsbG9jOworCXN0cnVjdCBtYXRjaF9hdHRyICoqYXR0cnM7Cit9ICphdHRyX3N0YWNrOworCitzdGF0aWMgdm9pZCBmcmVlX2F0dHJfZWxlbShzdHJ1Y3QgYXR0cl9zdGFjayAqZSkKK3sKKwlpbnQgaTsKKwlmcmVlKGUtPm9yaWdpbik7CisJZm9yIChpID0gMDsgaSA8IGUtPm51bV9tYXRjaGVzOyBpKyspIHsKKwkJc3RydWN0IG1hdGNoX2F0dHIgKmEgPSBlLT5hdHRyc1tpXTsKKwkJaW50IGo7CisJCWZvciAoaiA9IDA7IGogPCBhLT5udW1fYXR0cjsgaisrKSB7CisJCQljb25zdCBjaGFyICpzZXR0byA9IGEtPnN0YXRlW2pdLnNldHRvOworCQkJaWYgKHNldHRvID09IEFUVFJfX1RSVUUgfHwKKwkJCSAgICBzZXR0byA9PSBBVFRSX19GQUxTRSB8fAorCQkJICAgIHNldHRvID09IEFUVFJfX1VOU0VUIHx8CisJCQkgICAgc2V0dG8gPT0gQVRUUl9fVU5LTk9XTikKKwkJCQk7CisJCQllbHNlCisJCQkJZnJlZSgoY2hhciopIHNldHRvKTsKKwkJfQorCQlmcmVlKGEpOworCX0KKwlmcmVlKGUpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYnVpbHRpbl9hdHRyW10gPSB7CisJIlthdHRyXWJpbmFyeSAtZGlmZiAtY3JsZiIsCisJTlVMTCwKK307CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9hdHRyX2xpbmUoc3RydWN0IGF0dHJfc3RhY2sgKnJlcywKKwkJCSAgICAgY29uc3QgY2hhciAqbGluZSwKKwkJCSAgICAgY29uc3QgY2hhciAqc3JjLAorCQkJICAgICBpbnQgbGluZW5vLAorCQkJICAgICBpbnQgbWFjcm9fb2spCit7CisJc3RydWN0IG1hdGNoX2F0dHIgKmE7CisKKwlhID0gcGFyc2VfYXR0cl9saW5lKGxpbmUsIHNyYywgbGluZW5vLCBtYWNyb19vayk7CisJaWYgKCFhKQorCQlyZXR1cm47CisJaWYgKHJlcy0+YWxsb2MgPD0gcmVzLT5udW1fbWF0Y2hlcykgeworCQlyZXMtPmFsbG9jID0gYWxsb2NfbnIocmVzLT5udW1fbWF0Y2hlcyk7CisJCXJlcy0+YXR0cnMgPSB4cmVhbGxvYyhyZXMtPmF0dHJzLAorCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgbWF0Y2hfYXR0ciAqKSAqCisJCQkJICAgICAgcmVzLT5hbGxvYyk7CisJfQorCXJlcy0+YXR0cnNbcmVzLT5udW1fbWF0Y2hlcysrXSA9IGE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cl9zdGFjayAqcmVhZF9hdHRyX2Zyb21fYXJyYXkoY29uc3QgY2hhciAqKmxpc3QpCit7CisJc3RydWN0IGF0dHJfc3RhY2sgKnJlczsKKwljb25zdCBjaGFyICpsaW5lOworCWludCBsaW5lbm8gPSAwOworCisJcmVzID0geGNhbGxvYygxLCBzaXplb2YoKnJlcykpOworCXdoaWxlICgobGluZSA9ICoobGlzdCsrKSkgIT0gTlVMTCkKKwkJaGFuZGxlX2F0dHJfbGluZShyZXMsIGxpbmUsICJbYnVpbHRpbl0iLCArK2xpbmVubywgMSk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHN0cnVjdCBhdHRyX3N0YWNrICpyZWFkX2F0dHJfZnJvbV9maWxlKGNvbnN0IGNoYXIgKnBhdGgsIGludCBtYWNyb19vaykKK3sKKwlGSUxFICpmcCA9IGZvcGVuKHBhdGgsICJyIik7CisJc3RydWN0IGF0dHJfc3RhY2sgKnJlczsKKwljaGFyIGJ1ZlsyMDQ4XTsKKwlpbnQgbGluZW5vID0gMDsKKworCWlmICghZnApCisJCXJldHVybiBOVUxMOworCXJlcyA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpyZXMpKTsKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKQorCQloYW5kbGVfYXR0cl9saW5lKHJlcywgYnVmLCBwYXRoLCArK2xpbmVubywgbWFjcm9fb2spOworCWZjbG9zZShmcCk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgKnJlYWRfaW5kZXhfZGF0YShjb25zdCBjaGFyICpwYXRoKQoreworCWludCBwb3MsIGxlbjsKKwl1bnNpZ25lZCBsb25nIHN6OworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwl2b2lkICpkYXRhOworCisJbGVuID0gc3RybGVuKHBhdGgpOworCXBvcyA9IGNhY2hlX25hbWVfcG9zKHBhdGgsIGxlbik7CisJaWYgKHBvcyA8IDApIHsKKwkJLyoKKwkJICogV2UgbWlnaHQgYmUgaW4gdGhlIG1pZGRsZSBvZiBhIG1lcmdlLCBpbiB3aGljaAorCQkgKiBjYXNlIHdlIHdvdWxkIHJlYWQgc3RhZ2UgIzIgKG91cnMpLgorCQkgKi8KKwkJaW50IGk7CisJCWZvciAoaSA9IC1wb3MgLSAxOworCQkgICAgIChwb3MgPCAwICYmIGkgPCBhY3RpdmVfbnIgJiYKKwkJICAgICAgIXN0cmNtcChhY3RpdmVfY2FjaGVbaV0tPm5hbWUsIHBhdGgpKTsKKwkJICAgICBpKyspCisJCQlpZiAoY2Vfc3RhZ2UoYWN0aXZlX2NhY2hlW2ldKSA9PSAyKQorCQkJCXBvcyA9IGk7CisJfQorCWlmIChwb3MgPCAwKQorCQlyZXR1cm4gTlVMTDsKKwlkYXRhID0gcmVhZF9zaGExX2ZpbGUoYWN0aXZlX2NhY2hlW3Bvc10tPnNoYTEsICZ0eXBlLCAmc3opOworCWlmICghZGF0YSB8fCB0eXBlICE9IE9CSl9CTE9CKSB7CisJCWZyZWUoZGF0YSk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHN0cnVjdCBhdHRyX3N0YWNrICpyZWFkX2F0dHIoY29uc3QgY2hhciAqcGF0aCwgaW50IG1hY3JvX29rKQoreworCXN0cnVjdCBhdHRyX3N0YWNrICpyZXM7CisJY2hhciAqYnVmLCAqc3A7CisJaW50IGxpbmVubyA9IDA7CisKKwlyZXMgPSByZWFkX2F0dHJfZnJvbV9maWxlKHBhdGgsIG1hY3JvX29rKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCisJcmVzID0geGNhbGxvYygxLCBzaXplb2YoKnJlcykpOworCisJLyoKKwkgKiBUaGVyZSBpcyBubyBjaGVja2VkIG91dCAuZ2l0YXR0cmlidXRlcyBmaWxlIHRoZXJlLCBidXQKKwkgKiB3ZSBtaWdodCBoYXZlIGl0IGluIHRoZSBpbmRleC4gIFdlIGFsbG93IG9wZXJhdGlvbiBpbiBhCisJICogc3BhcnNlbHkgY2hlY2tlZCBvdXQgd29yayB0cmVlLCBzbyByZWFkIGZyb20gaXQuCisJICovCisJYnVmID0gcmVhZF9pbmRleF9kYXRhKHBhdGgpOworCWlmICghYnVmKQorCQlyZXR1cm4gcmVzOworCisJZm9yIChzcCA9IGJ1ZjsgKnNwOyApIHsKKwkJY2hhciAqZXA7CisJCWludCBtb3JlOworCQlmb3IgKGVwID0gc3A7ICplcCAmJiAqZXAgIT0gJ1xuJzsgZXArKykKKwkJCTsKKwkJbW9yZSA9ICgqZXAgPT0gJ1xuJyk7CisJCSplcCA9ICdcMCc7CisJCWhhbmRsZV9hdHRyX2xpbmUocmVzLCBzcCwgcGF0aCwgKytsaW5lbm8sIG1hY3JvX29rKTsKKwkJc3AgPSBlcCArIG1vcmU7CisJfQorCWZyZWUoYnVmKTsKKwlyZXR1cm4gcmVzOworfQorCisjaWYgREVCVUdfQVRUUgorc3RhdGljIHZvaWQgZGVidWdfaW5mbyhjb25zdCBjaGFyICp3aGF0LCBzdHJ1Y3QgYXR0cl9zdGFjayAqZWxlbSkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiAlc1xuIiwgd2hhdCwgZWxlbS0+b3JpZ2luID8gZWxlbS0+b3JpZ2luIDogIigpIik7Cit9CitzdGF0aWMgdm9pZCBkZWJ1Z19zZXQoY29uc3QgY2hhciAqd2hhdCwgY29uc3QgY2hhciAqbWF0Y2gsIHN0cnVjdCBnaXRfYXR0ciAqYXR0ciwgY29uc3Qgdm9pZCAqdikKK3sKKwljb25zdCBjaGFyICp2YWx1ZSA9IHY7CisKKwlpZiAoQVRUUl9UUlVFKHZhbHVlKSkKKwkJdmFsdWUgPSAic2V0IjsKKwllbHNlIGlmIChBVFRSX0ZBTFNFKHZhbHVlKSkKKwkJdmFsdWUgPSAidW5zZXQiOworCWVsc2UgaWYgKEFUVFJfVU5TRVQodmFsdWUpKQorCQl2YWx1ZSA9ICJ1bnNwZWNpZmllZCI7CisKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiAlcyA9PiAlcyAoJXMpXG4iLAorCQl3aGF0LCBhdHRyLT5uYW1lLCAoY2hhciAqKSB2YWx1ZSwgbWF0Y2gpOworfQorI2RlZmluZSBkZWJ1Z19wdXNoKGEpIGRlYnVnX2luZm8oInB1c2giLCAoYSkpCisjZGVmaW5lIGRlYnVnX3BvcChhKSBkZWJ1Z19pbmZvKCJwb3AiLCAoYSkpCisjZWxzZQorI2RlZmluZSBkZWJ1Z19wdXNoKGEpIGRvIHsgOyB9IHdoaWxlICgwKQorI2RlZmluZSBkZWJ1Z19wb3AoYSkgZG8geyA7IH0gd2hpbGUgKDApCisjZGVmaW5lIGRlYnVnX3NldChhLGIsYyxkKSBkbyB7IDsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBib290c3RyYXBfYXR0cl9zdGFjayh2b2lkKQoreworCWlmICghYXR0cl9zdGFjaykgeworCQlzdHJ1Y3QgYXR0cl9zdGFjayAqZWxlbTsKKworCQllbGVtID0gcmVhZF9hdHRyX2Zyb21fYXJyYXkoYnVpbHRpbl9hdHRyKTsKKwkJZWxlbS0+b3JpZ2luID0gTlVMTDsKKwkJZWxlbS0+cHJldiA9IGF0dHJfc3RhY2s7CisJCWF0dHJfc3RhY2sgPSBlbGVtOworCisJCWVsZW0gPSByZWFkX2F0dHIoR0lUQVRUUklCVVRFU19GSUxFLCAxKTsKKwkJZWxlbS0+b3JpZ2luID0gc3RyZHVwKCIiKTsKKwkJZWxlbS0+cHJldiA9IGF0dHJfc3RhY2s7CisJCWF0dHJfc3RhY2sgPSBlbGVtOworCQlkZWJ1Z19wdXNoKGVsZW0pOworCisJCWVsZW0gPSByZWFkX2F0dHJfZnJvbV9maWxlKGdpdF9wYXRoKElORk9BVFRSSUJVVEVTX0ZJTEUpLCAxKTsKKwkJaWYgKCFlbGVtKQorCQkJZWxlbSA9IHhjYWxsb2MoMSwgc2l6ZW9mKCplbGVtKSk7CisJCWVsZW0tPm9yaWdpbiA9IE5VTEw7CisJCWVsZW0tPnByZXYgPSBhdHRyX3N0YWNrOworCQlhdHRyX3N0YWNrID0gZWxlbTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByZXBhcmVfYXR0cl9zdGFjayhjb25zdCBjaGFyICpwYXRoLCBpbnQgZGlybGVuKQoreworCXN0cnVjdCBhdHRyX3N0YWNrICplbGVtLCAqaW5mbzsKKwlpbnQgbGVuOworCWNoYXIgcGF0aGJ1ZltQQVRIX01BWF07CisKKwkvKgorCSAqIEF0IHRoZSBib3R0b20gb2YgdGhlIGF0dHJpYnV0ZSBzdGFjayBpcyB0aGUgYnVpbHQtaW4KKwkgKiBzZXQgb2YgYXR0cmlidXRlIGRlZmluaXRpb25zLiAgVGhlbiwgY29udGVudHMgZnJvbQorCSAqIC5naXRhdHRyaWJ1dGUgZmlsZXMgZnJvbSBkaXJlY3RvcmllcyBjbG9zZXIgdG8gdGhlCisJICogcm9vdCB0byB0aGUgb25lcyBpbiBkZWVwZXIgZGlyZWN0b3JpZXMgYXJlIHB1c2hlZAorCSAqIHRvIHRoZSBzdGFjay4gIEZpbmFsbHksIGF0IHRoZSB2ZXJ5IHRvcCBvZiB0aGUgc3RhY2sKKwkgKiB3ZSBhbHdheXMga2VlcCB0aGUgY29udGVudHMgb2YgJEdJVF9ESVIvaW5mby9hdHRyaWJ1dGVzLgorCSAqCisJICogV2hlbiBjaGVja2luZywgd2UgdXNlIGVudHJpZXMgZnJvbSBuZWFyIHRoZSB0b3Agb2YgdGhlCisJICogc3RhY2ssIHByZWZlcnJpbmcgJEdJVF9ESVIvaW5mby9hdHRyaWJ1dGVzLCB0aGVuCisJICogLmdpdGF0dHJpYnV0ZXMgaW4gZGVlcGVyIGRpcmVjdG9yaWVzIHRvIHNoYWxsb3dlciBvbmVzLAorCSAqIGFuZCBmaW5hbGx5IHVzZSB0aGUgYnVpbHQtaW4gc2V0IGFzIHRoZSBkZWZhdWx0LgorCSAqLworCWlmICghYXR0cl9zdGFjaykKKwkJYm9vdHN0cmFwX2F0dHJfc3RhY2soKTsKKworCS8qCisJICogUG9wIHRoZSAiaW5mbyIgb25lIHRoYXQgaXMgYWx3YXlzIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLgorCSAqLworCWluZm8gPSBhdHRyX3N0YWNrOworCWF0dHJfc3RhY2sgPSBpbmZvLT5wcmV2OworCisJLyoKKwkgKiBQb3AgdGhlIG9uZXMgZnJvbSBkaXJlY3RvcmllcyB0aGF0IGFyZSBub3QgdGhlIHByZWZpeCBvZgorCSAqIHRoZSBwYXRoIHdlIGFyZSBjaGVja2luZy4KKwkgKi8KKwl3aGlsZSAoYXR0cl9zdGFjayAmJiBhdHRyX3N0YWNrLT5vcmlnaW4pIHsKKwkJaW50IG5hbWVsZW4gPSBzdHJsZW4oYXR0cl9zdGFjay0+b3JpZ2luKTsKKworCQllbGVtID0gYXR0cl9zdGFjazsKKwkJaWYgKG5hbWVsZW4gPD0gZGlybGVuICYmCisJCSAgICAhc3RybmNtcChlbGVtLT5vcmlnaW4sIHBhdGgsIG5hbWVsZW4pKQorCQkJYnJlYWs7CisKKwkJZGVidWdfcG9wKGVsZW0pOworCQlhdHRyX3N0YWNrID0gZWxlbS0+cHJldjsKKwkJZnJlZV9hdHRyX2VsZW0oZWxlbSk7CisJfQorCisJLyoKKwkgKiBSZWFkIGZyb20gcGFyZW50IGRpcmVjdG9yaWVzIGFuZCBwdXNoIHRoZW0gZG93bgorCSAqLworCXdoaWxlICgxKSB7CisJCWNoYXIgKmNwOworCisJCWxlbiA9IHN0cmxlbihhdHRyX3N0YWNrLT5vcmlnaW4pOworCQlpZiAoZGlybGVuIDw9IGxlbikKKwkJCWJyZWFrOworCQltZW1jcHkocGF0aGJ1ZiwgcGF0aCwgZGlybGVuKTsKKwkJbWVtY3B5KHBhdGhidWYgKyBkaXJsZW4sICIvIiwgMik7CisJCWNwID0gc3RyY2hyKHBhdGhidWYgKyBsZW4gKyAxLCAnLycpOworCQlzdHJjcHkoY3AgKyAxLCBHSVRBVFRSSUJVVEVTX0ZJTEUpOworCQllbGVtID0gcmVhZF9hdHRyKHBhdGhidWYsIDApOworCQkqY3AgPSAnXDAnOworCQllbGVtLT5vcmlnaW4gPSBzdHJkdXAocGF0aGJ1Zik7CisJCWVsZW0tPnByZXYgPSBhdHRyX3N0YWNrOworCQlhdHRyX3N0YWNrID0gZWxlbTsKKwkJZGVidWdfcHVzaChlbGVtKTsKKwl9CisKKwkvKgorCSAqIEZpbmFsbHkgcHVzaCB0aGUgImluZm8iIG9uZSBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay4KKwkgKi8KKwlpbmZvLT5wcmV2ID0gYXR0cl9zdGFjazsKKwlhdHRyX3N0YWNrID0gaW5mbzsKK30KKworc3RhdGljIGludCBwYXRoX21hdGNoZXMoY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBwYXRobGVuLAorCQkJY29uc3QgY2hhciAqcGF0dGVybiwKKwkJCWNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuKQoreworCWlmICghc3RyY2hyKHBhdHRlcm4sICcvJykpIHsKKwkJLyogbWF0Y2ggYmFzZW5hbWUgKi8KKwkJY29uc3QgY2hhciAqYmFzZW5hbWUgPSBzdHJyY2hyKHBhdGhuYW1lLCAnLycpOworCQliYXNlbmFtZSA9IGJhc2VuYW1lID8gYmFzZW5hbWUgKyAxIDogcGF0aG5hbWU7CisJCXJldHVybiAoZm5tYXRjaChwYXR0ZXJuLCBiYXNlbmFtZSwgMCkgPT0gMCk7CisJfQorCS8qCisJICogbWF0Y2ggd2l0aCBGTk1fUEFUSE5BTUU7IHRoZSBwYXR0ZXJuIGhhcyBiYXNlIGltcGxpY2l0bHkKKwkgKiBpbiBmcm9udCBvZiBpdC4KKwkgKi8KKwlpZiAoKnBhdHRlcm4gPT0gJy8nKQorCQlwYXR0ZXJuKys7CisJaWYgKHBhdGhsZW4gPCBiYXNlbGVuIHx8CisJICAgIChiYXNlbGVuICYmIHBhdGhuYW1lW2Jhc2VsZW5dICE9ICcvJykgfHwKKwkgICAgc3RybmNtcChwYXRobmFtZSwgYmFzZSwgYmFzZWxlbikpCisJCXJldHVybiAwOworCXJldHVybiBmbm1hdGNoKHBhdHRlcm4sIHBhdGhuYW1lICsgYmFzZWxlbiArIDEsIEZOTV9QQVRITkFNRSkgPT0gMDsKK30KKworc3RhdGljIGludCBmaWxsX29uZShjb25zdCBjaGFyICp3aGF0LCBzdHJ1Y3QgbWF0Y2hfYXR0ciAqYSwgaW50IHJlbSkKK3sKKwlzdHJ1Y3QgZ2l0X2F0dHJfY2hlY2sgKmNoZWNrID0gY2hlY2tfYWxsX2F0dHI7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyAwIDwgcmVtICYmIGkgPCBhLT5udW1fYXR0cjsgaSsrKSB7CisJCXN0cnVjdCBnaXRfYXR0ciAqYXR0ciA9IGEtPnN0YXRlW2ldLmF0dHI7CisJCWNvbnN0IGNoYXIgKipuID0gJihjaGVja1thdHRyLT5hdHRyX25yXS52YWx1ZSk7CisJCWNvbnN0IGNoYXIgKnYgPSBhLT5zdGF0ZVtpXS5zZXR0bzsKKworCQlpZiAoKm4gPT0gQVRUUl9fVU5LTk9XTikgeworCQkJZGVidWdfc2V0KHdoYXQsIGEtPnUucGF0dGVybiwgYXR0ciwgdik7CisJCQkqbiA9IHY7CisJCQlyZW0tLTsKKwkJfQorCX0KKwlyZXR1cm4gcmVtOworfQorCitzdGF0aWMgaW50IGZpbGwoY29uc3QgY2hhciAqcGF0aCwgaW50IHBhdGhsZW4sIHN0cnVjdCBhdHRyX3N0YWNrICpzdGssIGludCByZW0pCit7CisJaW50IGk7CisJY29uc3QgY2hhciAqYmFzZSA9IHN0ay0+b3JpZ2luID8gc3RrLT5vcmlnaW4gOiAiIjsKKworCWZvciAoaSA9IHN0ay0+bnVtX21hdGNoZXMgLSAxOyAwIDwgcmVtICYmIDAgPD0gaTsgaS0tKSB7CisJCXN0cnVjdCBtYXRjaF9hdHRyICphID0gc3RrLT5hdHRyc1tpXTsKKwkJaWYgKGEtPmlzX21hY3JvKQorCQkJY29udGludWU7CisJCWlmIChwYXRoX21hdGNoZXMocGF0aCwgcGF0aGxlbiwKKwkJCQkgYS0+dS5wYXR0ZXJuLCBiYXNlLCBzdHJsZW4oYmFzZSkpKQorCQkJcmVtID0gZmlsbF9vbmUoImZpbGwiLCBhLCByZW0pOworCX0KKwlyZXR1cm4gcmVtOworfQorCitzdGF0aWMgaW50IG1hY3JvZXhwYW5kKHN0cnVjdCBhdHRyX3N0YWNrICpzdGssIGludCByZW0pCit7CisJaW50IGk7CisJc3RydWN0IGdpdF9hdHRyX2NoZWNrICpjaGVjayA9IGNoZWNrX2FsbF9hdHRyOworCisJZm9yIChpID0gc3RrLT5udW1fbWF0Y2hlcyAtIDE7IDAgPCByZW0gJiYgMCA8PSBpOyBpLS0pIHsKKwkJc3RydWN0IG1hdGNoX2F0dHIgKmEgPSBzdGstPmF0dHJzW2ldOworCQlpZiAoIWEtPmlzX21hY3JvKQorCQkJY29udGludWU7CisJCWlmIChjaGVja1thLT51LmF0dHItPmF0dHJfbnJdLnZhbHVlICE9IEFUVFJfX1RSVUUpCisJCQljb250aW51ZTsKKwkJcmVtID0gZmlsbF9vbmUoImV4cGFuZCIsIGEsIHJlbSk7CisJfQorCXJldHVybiByZW07Cit9CisKK2ludCBnaXRfY2hlY2thdHRyKGNvbnN0IGNoYXIgKnBhdGgsIGludCBudW0sIHN0cnVjdCBnaXRfYXR0cl9jaGVjayAqY2hlY2spCit7CisJc3RydWN0IGF0dHJfc3RhY2sgKnN0azsKKwljb25zdCBjaGFyICpjcDsKKwlpbnQgZGlybGVuLCBwYXRobGVuLCBpLCByZW07CisKKwlib290c3RyYXBfYXR0cl9zdGFjaygpOworCWZvciAoaSA9IDA7IGkgPCBhdHRyX25yOyBpKyspCisJCWNoZWNrX2FsbF9hdHRyW2ldLnZhbHVlID0gQVRUUl9fVU5LTk9XTjsKKworCXBhdGhsZW4gPSBzdHJsZW4ocGF0aCk7CisJY3AgPSBzdHJyY2hyKHBhdGgsICcvJyk7CisJaWYgKCFjcCkKKwkJZGlybGVuID0gMDsKKwllbHNlCisJCWRpcmxlbiA9IGNwIC0gcGF0aDsKKwlwcmVwYXJlX2F0dHJfc3RhY2socGF0aCwgZGlybGVuKTsKKwlyZW0gPSBhdHRyX25yOworCWZvciAoc3RrID0gYXR0cl9zdGFjazsgMCA8IHJlbSAmJiBzdGs7IHN0ayA9IHN0ay0+cHJldikKKwkJcmVtID0gZmlsbChwYXRoLCBwYXRobGVuLCBzdGssIHJlbSk7CisKKwlmb3IgKHN0ayA9IGF0dHJfc3RhY2s7IDAgPCByZW0gJiYgc3RrOyBzdGsgPSBzdGstPnByZXYpCisJCXJlbSA9IG1hY3JvZXhwYW5kKHN0aywgcmVtKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQljb25zdCBjaGFyICp2YWx1ZSA9IGNoZWNrX2FsbF9hdHRyW2NoZWNrW2ldLmF0dHItPmF0dHJfbnJdLnZhbHVlOworCQlpZiAodmFsdWUgPT0gQVRUUl9fVU5LTk9XTikKKwkJCXZhbHVlID0gQVRUUl9fVU5TRVQ7CisJCWNoZWNrW2ldLnZhbHVlID0gdmFsdWU7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hdHRyLmggYi9hdHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjMjAzOAotLS0gL2Rldi9udWxsCisrKyBiL2F0dHIuaApAQCAtMCwwICsxLDM0IEBACisjaWZuZGVmIEFUVFJfSAorI2RlZmluZSBBVFRSX0gKKworLyogQW4gYXR0cmlidXRlIGlzIGEgcG9pbnRlciB0byB0aGlzIG9wYXF1ZSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBnaXRfYXR0cjsKKworLyoKKyAqIEdpdmVuIGEgc3RyaW5nLCByZXR1cm4gdGhlIGdpdGF0dHJpYnV0ZSBvYmplY3QgdGhhdAorICogY29ycmVzcG9uZHMgdG8gaXQuCisgKi8KK3N0cnVjdCBnaXRfYXR0ciAqZ2l0X2F0dHIoY29uc3QgY2hhciAqLCBpbnQpOworCisvKiBJbnRlcm5hbCB1c2UgKi8KK2V4dGVybiBjb25zdCBjaGFyIGdpdF9hdHRyX190cnVlW107CitleHRlcm4gY29uc3QgY2hhciBnaXRfYXR0cl9fZmFsc2VbXTsKKworLyogRm9yIHB1YmxpYyB0byBjaGVjayBnaXRfYXR0cl9jaGVjayByZXN1bHRzICovCisjZGVmaW5lIEFUVFJfVFJVRSh2KSAoKHYpID09IGdpdF9hdHRyX190cnVlKQorI2RlZmluZSBBVFRSX0ZBTFNFKHYpICgodikgPT0gZ2l0X2F0dHJfX2ZhbHNlKQorI2RlZmluZSBBVFRSX1VOU0VUKHYpICgodikgPT0gTlVMTCkKKworLyoKKyAqIFNlbmQgb25lIG9yIG1vcmUgZ2l0X2F0dHJfY2hlY2sgdG8gZ2l0X2NoZWNrYXR0cigpLCBhbmQKKyAqIGVhY2ggJ3ZhbHVlJyBtZW1iZXIgdGVsbHMgd2hhdCBpdHMgdmFsdWUgaXMuCisgKiBVbnNldCBvbmUgaXMgcmV0dXJuZWQgYXMgTlVMTC4KKyAqLworc3RydWN0IGdpdF9hdHRyX2NoZWNrIHsKKwlzdHJ1Y3QgZ2l0X2F0dHIgKmF0dHI7CisJY29uc3QgY2hhciAqdmFsdWU7Cit9OworCitpbnQgZ2l0X2NoZWNrYXR0cihjb25zdCBjaGFyICpwYXRoLCBpbnQsIHN0cnVjdCBnaXRfYXR0cl9jaGVjayAqKTsKKworI2VuZGlmIC8qIEFUVFJfSCAqLwpkaWZmIC0tZ2l0IGEvYmFzZTg1LmMgYi9iYXNlODUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODgyNzBmCi0tLSAvZGV2L251bGwKKysrIGIvYmFzZTg1LmMKQEAgLTAsMCArMSwxNDAgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorCisjdW5kZWYgREVCVUdfODUKKworI2lmZGVmIERFQlVHXzg1CisjZGVmaW5lIHNheShhKSBmcHJpbnRmKHN0ZGVyciwgYSkKKyNkZWZpbmUgc2F5MShhLGIpIGZwcmludGYoc3RkZXJyLCBhLCBiKQorI2RlZmluZSBzYXkyKGEsYixjKSBmcHJpbnRmKHN0ZGVyciwgYSwgYiwgYykKKyNlbHNlCisjZGVmaW5lIHNheShhKSBkbyB7fSB3aGlsZSgwKQorI2RlZmluZSBzYXkxKGEsYikgZG8ge30gd2hpbGUoMCkKKyNkZWZpbmUgc2F5MihhLGIsYykgZG8ge30gd2hpbGUoMCkKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciBlbjg1W10gPSB7CisJJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAorCSdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0gnLCAnSScsICdKJywKKwknSycsICdMJywgJ00nLCAnTicsICdPJywgJ1AnLCAnUScsICdSJywgJ1MnLCAnVCcsCisJJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJywKKwknYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicsCisJJ2snLCAnbCcsICdtJywgJ24nLCAnbycsICdwJywgJ3EnLCAncicsICdzJywgJ3QnLAorCSd1JywgJ3YnLCAndycsICd4JywgJ3knLCAneicsCisJJyEnLCAnIycsICckJywgJyUnLCAnJicsICcoJywgJyknLCAnKicsICcrJywgJy0nLAorCSc7JywgJzwnLCAnPScsICc+JywgJz8nLCAnQCcsICdeJywgJ18nLAknYCcsICd7JywKKwknfCcsICd9JywgJ34nCit9OworCitzdGF0aWMgY2hhciBkZTg1WzI1Nl07CitzdGF0aWMgdm9pZCBwcmVwX2Jhc2U4NSh2b2lkKQoreworCWludCBpOworCWlmIChkZTg1WydaJ10pCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlbjg1KTsgaSsrKSB7CisJCWludCBjaCA9IGVuODVbaV07CisJCWRlODVbY2hdID0gaSArIDE7CisJfQorfQorCitpbnQgZGVjb2RlXzg1KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworCXByZXBfYmFzZTg1KCk7CisKKwlzYXkyKCJkZWNvZGUgODUgPCUuKnM+IiwgbGVuLzQqNSwgYnVmZmVyKTsKKwl3aGlsZSAobGVuKSB7CisJCXVuc2lnbmVkIGFjYyA9IDA7CisJCWludCBkZSwgY250ID0gNDsKKwkJdW5zaWduZWQgY2hhciBjaDsKKwkJZG8geworCQkJY2ggPSAqYnVmZmVyKys7CisJCQlkZSA9IGRlODVbY2hdOworCQkJaWYgKC0tZGUgPCAwKQorCQkJCXJldHVybiBlcnJvcigiaW52YWxpZCBiYXNlODUgYWxwaGFiZXQgJWMiLCBjaCk7CisJCQlhY2MgPSBhY2MgKiA4NSArIGRlOworCQl9IHdoaWxlICgtLWNudCk7CisJCWNoID0gKmJ1ZmZlcisrOworCQlkZSA9IGRlODVbY2hdOworCQlpZiAoLS1kZSA8IDApCisJCQlyZXR1cm4gZXJyb3IoImludmFsaWQgYmFzZTg1IGFscGhhYmV0ICVjIiwgY2gpOworCQkvKgorCQkgKiBEZXRlY3Qgb3ZlcmZsb3cuICBUaGUgbGFyZ2VzdAorCQkgKiA1LWxldHRlciBwb3NzaWJsZSBpcyAifE5zQzAiIHRvCisJCSAqIGVuY29kZSAweGZmZmZmZmZmLCBhbmQgInxOc0MiIGdpdmVzCisJCSAqIDB4MDMwMzAzMDMgYXQgdGhpcyBwb2ludCAoaS5lLgorCQkgKiAweGZmZmZmZmZmID0gMHgwMzAzMDMwMyAqIDg1KS4KKwkJICovCisJCWlmICgweDAzMDMwMzAzIDwgYWNjIHx8CisJCSAgICAweGZmZmZmZmZmIC0gZGUgPCAoYWNjICo9IDg1KSkKKwkJCXJldHVybiBlcnJvcigiaW52YWxpZCBiYXNlODUgc2VxdWVuY2UgJS41cyIsIGJ1ZmZlci01KTsKKwkJYWNjICs9IGRlOworCQlzYXkxKCIgJTA4eCIsIGFjYyk7CisKKwkJY250ID0gKGxlbiA8IDQpID8gbGVuIDogNDsKKwkJbGVuIC09IGNudDsKKwkJZG8geworCQkJYWNjID0gKGFjYyA8PCA4KSB8IChhY2MgPj4gMjQpOworCQkJKmRzdCsrID0gYWNjOworCQl9IHdoaWxlICgtLWNudCk7CisJfQorCXNheSgiXG4iKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGVuY29kZV84NShjaGFyICpidWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBieXRlcykKK3sKKwlwcmVwX2Jhc2U4NSgpOworCisJc2F5KCJlbmNvZGUgODUiKTsKKwl3aGlsZSAoYnl0ZXMpIHsKKwkJdW5zaWduZWQgYWNjID0gMDsKKwkJaW50IGNudDsKKwkJZm9yIChjbnQgPSAyNDsgY250ID49IDA7IGNudCAtPSA4KSB7CisJCQlpbnQgY2ggPSAqZGF0YSsrOworCQkJYWNjIHw9IGNoIDw8IGNudDsKKwkJCWlmICgtLWJ5dGVzID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJc2F5MSgiICUwOHgiLCBhY2MpOworCQlmb3IgKGNudCA9IDQ7IGNudCA+PSAwOyBjbnQtLSkgeworCQkJaW50IHZhbCA9IGFjYyAlIDg1OworCQkJYWNjIC89IDg1OworCQkJYnVmW2NudF0gPSBlbjg1W3ZhbF07CisJCX0KKwkJYnVmICs9IDU7CisJfQorCXNheSgiXG4iKTsKKworCSpidWYgPSAwOworfQorCisjaWZkZWYgREVCVUdfODUKK2ludCBtYWluKGludCBhYywgY2hhciAqKmF2KQoreworCWNoYXIgYnVmWzEwMjRdOworCisJaWYgKCFzdHJjbXAoYXZbMV0sICItZSIpKSB7CisJCWludCBsZW4gPSBzdHJsZW4oYXZbMl0pOworCQllbmNvZGVfODUoYnVmLCBhdlsyXSwgbGVuKTsKKwkJaWYgKGxlbiA8PSAyNikgbGVuID0gbGVuICsgJ0EnIC0gMTsKKwkJZWxzZSBsZW4gPSBsZW4gKyAnYScgLSAyNiArIDE7CisJCXByaW50ZigiZW5jb2RlZDogJWMlc1xuIiwgbGVuLCBidWYpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAoYXZbMV0sICItZCIpKSB7CisJCWludCBsZW4gPSAqYXZbMl07CisJCWlmICgnQScgPD0gbGVuICYmIGxlbiA8PSAnWicpIGxlbiA9IGxlbiAtICdBJyArIDE7CisJCWVsc2UgbGVuID0gbGVuIC0gJ2EnICsgMjYgKyAxOworCQlkZWNvZGVfODUoYnVmLCBhdlsyXSsxLCBsZW4pOworCQlwcmludGYoImRlY29kZWQ6ICUuKnNcbiIsIGxlbiwgYnVmKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKGF2WzFdLCAiLXQiKSkgeworCQljaGFyIHRbNF0gPSB7IC0xLC0xLC0xLC0xIH07CisJCWVuY29kZV84NShidWYsIHQsIDQpOworCQlwcmludGYoImVuY29kZWQ6IEQlc1xuIiwgYnVmKTsKKwkJcmV0dXJuIDA7CisJfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9ibG9iLmMgYi9ibG9iLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ3ZDA3OAotLS0gL2Rldi9udWxsCisrKyBiL2Jsb2IuYwpAQCAtMCwwICsxLDQ2IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisKK2NvbnN0IGNoYXIgKmJsb2JfdHlwZSA9ICJibG9iIjsKKworc3RydWN0IGJsb2IgKmxvb2t1cF9ibG9iKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IG9iamVjdCAqb2JqID0gbG9va3VwX29iamVjdChzaGExKTsKKwlpZiAoIW9iaikKKwkJcmV0dXJuIGNyZWF0ZV9vYmplY3Qoc2hhMSwgT0JKX0JMT0IsIGFsbG9jX2Jsb2Jfbm9kZSgpKTsKKwlpZiAoIW9iai0+dHlwZSkKKwkJb2JqLT50eXBlID0gT0JKX0JMT0I7CisJaWYgKG9iai0+dHlwZSAhPSBPQkpfQkxPQikgeworCQllcnJvcigiT2JqZWN0ICVzIGlzIGEgJXMsIG5vdCBhIGJsb2IiLAorCQkgICAgICBzaGExX3RvX2hleChzaGExKSwgdHlwZW5hbWUob2JqLT50eXBlKSk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gKHN0cnVjdCBibG9iICopIG9iajsKK30KKworaW50IHBhcnNlX2Jsb2JfYnVmZmVyKHN0cnVjdCBibG9iICppdGVtLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpdGVtLT5vYmplY3QucGFyc2VkID0gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IHBhcnNlX2Jsb2Ioc3RydWN0IGJsb2IgKml0ZW0pCit7CisgICAgICAgIGVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKyAgICAgICAgdm9pZCAqYnVmZmVyOworICAgICAgICB1bnNpZ25lZCBsb25nIHNpemU7CisJaW50IHJldDsKKworICAgICAgICBpZiAoaXRlbS0+b2JqZWN0LnBhcnNlZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgYnVmZmVyID0gcmVhZF9zaGExX2ZpbGUoaXRlbS0+b2JqZWN0LnNoYTEsICZ0eXBlLCAmc2l6ZSk7CisgICAgICAgIGlmICghYnVmZmVyKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcigiQ291bGQgbm90IHJlYWQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGExX3RvX2hleChpdGVtLT5vYmplY3Quc2hhMSkpOworICAgICAgICBpZiAodHlwZSAhPSBPQkpfQkxPQikKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoIk9iamVjdCAlcyBub3QgYSBibG9iIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhMV90b19oZXgoaXRlbS0+b2JqZWN0LnNoYTEpKTsKKwlyZXQgPSBwYXJzZV9ibG9iX2J1ZmZlcihpdGVtLCBidWZmZXIsIHNpemUpOworCWZyZWUoYnVmZmVyKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYmxvYi5oIGIvYmxvYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNWQ5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9ibG9iLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBCTE9CX0gKKyNkZWZpbmUgQkxPQl9ICisKKyNpbmNsdWRlICJvYmplY3QuaCIKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmJsb2JfdHlwZTsKKworc3RydWN0IGJsb2IgeworCXN0cnVjdCBvYmplY3Qgb2JqZWN0OworfTsKKworc3RydWN0IGJsb2IgKmxvb2t1cF9ibG9iKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCitpbnQgcGFyc2VfYmxvYl9idWZmZXIoc3RydWN0IGJsb2IgKml0ZW0sIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKTsKKworaW50IHBhcnNlX2Jsb2Ioc3RydWN0IGJsb2IgKml0ZW0pOworCisjZW5kaWYgLyogQkxPQl9IICovCmRpZmYgLS1naXQgYS9icmFuY2guYyBiL2JyYW5jaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZjg2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9icmFuY2guYwpAQCAtMCwwICsxLDE1MiBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYnJhbmNoLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgInJlbW90ZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorCitzdHJ1Y3QgdHJhY2tpbmcgeworCXN0cnVjdCByZWZzcGVjIHNwZWM7CisJY2hhciAqc3JjOworCWNvbnN0IGNoYXIgKnJlbW90ZTsKKwlpbnQgbWF0Y2hlczsKK307CisKK3N0YXRpYyBpbnQgZmluZF90cmFja2VkX2JyYW5jaChzdHJ1Y3QgcmVtb3RlICpyZW1vdGUsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IHRyYWNraW5nICp0cmFja2luZyA9IHByaXY7CisKKwlpZiAoIXJlbW90ZV9maW5kX3RyYWNraW5nKHJlbW90ZSwgJnRyYWNraW5nLT5zcGVjKSkgeworCQlpZiAoKyt0cmFja2luZy0+bWF0Y2hlcyA9PSAxKSB7CisJCQl0cmFja2luZy0+c3JjID0gdHJhY2tpbmctPnNwZWMuc3JjOworCQkJdHJhY2tpbmctPnJlbW90ZSA9IHJlbW90ZS0+bmFtZTsKKwkJfSBlbHNlIHsKKwkJCWZyZWUodHJhY2tpbmctPnNwZWMuc3JjKTsKKwkJCWlmICh0cmFja2luZy0+c3JjKSB7CisJCQkJZnJlZSh0cmFja2luZy0+c3JjKTsKKwkJCQl0cmFja2luZy0+c3JjID0gTlVMTDsKKwkJCX0KKwkJfQorCQl0cmFja2luZy0+c3BlYy5zcmMgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiBuZXdfcmVmIGlzIGJyYW5jaGVkIG9mZiBvZiBvcmlnX3JlZiwgYW5kIHRyaWVzCisgKiB0byBpbmZlciB0aGUgc2V0dGluZ3MgZm9yIGJyYW5jaC48bmV3X3JlZj4ue3JlbW90ZSxtZXJnZX0gZnJvbSB0aGUKKyAqIGNvbmZpZy4KKyAqLworc3RhdGljIGludCBzZXR1cF90cmFja2luZyhjb25zdCBjaGFyICpuZXdfcmVmLCBjb25zdCBjaGFyICpvcmlnX3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBicmFuY2hfdHJhY2sgdHJhY2spCit7CisJY2hhciBrZXlbMTAyNF07CisJc3RydWN0IHRyYWNraW5nIHRyYWNraW5nOworCisJaWYgKHN0cmxlbihuZXdfcmVmKSA+IDEwMjQgLSA3IC0gNyAtIDEpCisJCXJldHVybiBlcnJvcigiVHJhY2tpbmcgbm90IHNldCB1cDogbmFtZSB0b28gbG9uZzogJXMiLAorCQkJCW5ld19yZWYpOworCisJbWVtc2V0KCZ0cmFja2luZywgMCwgc2l6ZW9mKHRyYWNraW5nKSk7CisJdHJhY2tpbmcuc3BlYy5kc3QgPSAoY2hhciAqKW9yaWdfcmVmOworCWlmIChmb3JfZWFjaF9yZW1vdGUoZmluZF90cmFja2VkX2JyYW5jaCwgJnRyYWNraW5nKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIXRyYWNraW5nLm1hdGNoZXMpCisJCXN3aXRjaCAodHJhY2spIHsKKwkJY2FzZSBCUkFOQ0hfVFJBQ0tfQUxXQVlTOgorCQljYXNlIEJSQU5DSF9UUkFDS19FWFBMSUNJVDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDE7CisJCX0KKworCWlmICh0cmFja2luZy5tYXRjaGVzID4gMSkKKwkJcmV0dXJuIGVycm9yKCJOb3QgdHJhY2tpbmc6IGFtYmlndW91cyBpbmZvcm1hdGlvbiBmb3IgcmVmICVzIiwKKwkJCQlvcmlnX3JlZik7CisKKwlzcHJpbnRmKGtleSwgImJyYW5jaC4lcy5yZW1vdGUiLCBuZXdfcmVmKTsKKwlnaXRfY29uZmlnX3NldChrZXksIHRyYWNraW5nLnJlbW90ZSA/ICB0cmFja2luZy5yZW1vdGUgOiAiLiIpOworCXNwcmludGYoa2V5LCAiYnJhbmNoLiVzLm1lcmdlIiwgbmV3X3JlZik7CisJZ2l0X2NvbmZpZ19zZXQoa2V5LCB0cmFja2luZy5zcmMgPyB0cmFja2luZy5zcmMgOiBvcmlnX3JlZik7CisJZnJlZSh0cmFja2luZy5zcmMpOworCXByaW50ZigiQnJhbmNoICVzIHNldCB1cCB0byB0cmFjayAlcyBicmFuY2ggJXMuXG4iLCBuZXdfcmVmLAorCQl0cmFja2luZy5yZW1vdGUgPyAicmVtb3RlIiA6ICJsb2NhbCIsIG9yaWdfcmVmKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGNyZWF0ZV9icmFuY2goY29uc3QgY2hhciAqaGVhZCwKKwkJICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqc3RhcnRfbmFtZSwKKwkJICAgaW50IGZvcmNlLCBpbnQgcmVmbG9nLCBlbnVtIGJyYW5jaF90cmFjayB0cmFjaykKK3sKKwlzdHJ1Y3QgcmVmX2xvY2sgKmxvY2s7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY2hhciAqcmVhbF9yZWYsIHJlZltQQVRIX01BWF0sIG1zZ1tQQVRIX01BWCArIDIwXTsKKwlpbnQgZm9yY2luZyA9IDA7CisKKwlzbnByaW50ZihyZWYsIHNpemVvZiByZWYsICJyZWZzL2hlYWRzLyVzIiwgbmFtZSk7CisJaWYgKGNoZWNrX3JlZl9mb3JtYXQocmVmKSkKKwkJZGllKCInJXMnIGlzIG5vdCBhIHZhbGlkIGJyYW5jaCBuYW1lLiIsIG5hbWUpOworCisJaWYgKHJlc29sdmVfcmVmKHJlZiwgc2hhMSwgMSwgTlVMTCkpIHsKKwkJaWYgKCFmb3JjZSkKKwkJCWRpZSgiQSBicmFuY2ggbmFtZWQgJyVzJyBhbHJlYWR5IGV4aXN0cy4iLCBuYW1lKTsKKwkJZWxzZSBpZiAoIWlzX2JhcmVfcmVwb3NpdG9yeSgpICYmICFzdHJjbXAoaGVhZCwgbmFtZSkpCisJCQlkaWUoIkNhbm5vdCBmb3JjZSB1cGRhdGUgdGhlIGN1cnJlbnQgYnJhbmNoLiIpOworCQlmb3JjaW5nID0gMTsKKwl9CisKKwlyZWFsX3JlZiA9IE5VTEw7CisJaWYgKGdldF9zaGExKHN0YXJ0X25hbWUsIHNoYTEpKQorCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lOiAnJXMnLiIsIHN0YXJ0X25hbWUpOworCisJc3dpdGNoIChkd2ltX3JlZihzdGFydF9uYW1lLCBzdHJsZW4oc3RhcnRfbmFtZSksIHNoYTEsICZyZWFsX3JlZikpIHsKKwljYXNlIDA6CisJCS8qIE5vdCBicmFuY2hpbmcgZnJvbSBhbnkgZXhpc3RpbmcgYnJhbmNoICovCisJCWlmICh0cmFjayA9PSBCUkFOQ0hfVFJBQ0tfRVhQTElDSVQpCisJCQlkaWUoIkNhbm5vdCBzZXR1cCB0cmFja2luZyBpbmZvcm1hdGlvbjsgc3RhcnRpbmcgcG9pbnQgaXMgbm90IGEgYnJhbmNoLiIpOworCQlicmVhazsKKwljYXNlIDE6CisJCS8qIFVuaXF1ZSBjb21wbGV0aW9uIC0tIGdvb2QgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGllKCJBbWJpZ3VvdXMgb2JqZWN0IG5hbWU6ICclcycuIiwgc3RhcnRfbmFtZSk7CisJCWJyZWFrOworCX0KKworCWlmICgoY29tbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2Uoc2hhMSkpID09IE5VTEwpCisJCWRpZSgiTm90IGEgdmFsaWQgYnJhbmNoIHBvaW50OiAnJXMnLiIsIHN0YXJ0X25hbWUpOworCWhhc2hjcHkoc2hhMSwgY29tbWl0LT5vYmplY3Quc2hhMSk7CisKKwlsb2NrID0gbG9ja19hbnlfcmVmX2Zvcl91cGRhdGUocmVmLCBOVUxMLCAwKTsKKwlpZiAoIWxvY2spCisJCWRpZSgiRmFpbGVkIHRvIGxvY2sgcmVmIGZvciB1cGRhdGU6ICVzLiIsIHN0cmVycm9yKGVycm5vKSk7CisKKwlpZiAocmVmbG9nKQorCQlsb2dfYWxsX3JlZl91cGRhdGVzID0gMTsKKworCWlmIChmb3JjaW5nKQorCQlzbnByaW50Zihtc2csIHNpemVvZiBtc2csICJicmFuY2g6IFJlc2V0IGZyb20gJXMiLAorCQkJIHN0YXJ0X25hbWUpOworCWVsc2UKKwkJc25wcmludGYobXNnLCBzaXplb2YgbXNnLCAiYnJhbmNoOiBDcmVhdGVkIGZyb20gJXMiLAorCQkJIHN0YXJ0X25hbWUpOworCisJaWYgKHJlYWxfcmVmICYmIHRyYWNrKQorCQlzZXR1cF90cmFja2luZyhuYW1lLCByZWFsX3JlZiwgdHJhY2spOworCisJaWYgKHdyaXRlX3JlZl9zaGExKGxvY2ssIHNoYTEsIG1zZykgPCAwKQorCQlkaWUoIkZhaWxlZCB0byB3cml0ZSByZWY6ICVzLiIsIHN0cmVycm9yKGVycm5vKSk7CisKKwlmcmVlKHJlYWxfcmVmKTsKK30KKwordm9pZCByZW1vdmVfYnJhbmNoX3N0YXRlKHZvaWQpCit7CisJdW5saW5rKGdpdF9wYXRoKCJNRVJHRV9IRUFEIikpOworCXVubGluayhnaXRfcGF0aCgicnItY2FjaGUvTUVSR0VfUlIiKSk7CisJdW5saW5rKGdpdF9wYXRoKCJNRVJHRV9NU0ciKSk7CisJdW5saW5rKGdpdF9wYXRoKCJTUVVBU0hfTVNHIikpOworfQpkaWZmIC0tZ2l0IGEvYnJhbmNoLmggYi9icmFuY2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjBjMmEyCi0tLSAvZGV2L251bGwKKysrIGIvYnJhbmNoLmgKQEAgLTAsMCArMSwyNCBAQAorI2lmbmRlZiBCUkFOQ0hfSAorI2RlZmluZSBCUkFOQ0hfSAorCisvKiBGdW5jdGlvbnMgZm9yIGFjdGluZyBvbiB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYnJhbmNoZXMuICovCisKKy8qCisgKiBDcmVhdGVzIGEgbmV3IGJyYW5jaCwgd2hlcmUgaGVhZCBpcyB0aGUgYnJhbmNoIGN1cnJlbnRseSBjaGVja2VkCisgKiBvdXQsIG5hbWUgaXMgdGhlIG5ldyBicmFuY2ggbmFtZSwgc3RhcnRfbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUKKyAqIGV4aXN0aW5nIGJyYW5jaCB0aGF0IHRoZSBuZXcgYnJhbmNoIHNob3VsZCBzdGFydCBmcm9tLCBmb3JjZQorICogZW5hYmxlcyBvdmVyd3JpdGluZyBhbiBleGlzdGluZyAobm9uLWhlYWQpIGJyYW5jaCwgcmVmbG9nIGNyZWF0ZXMgYQorICogcmVmbG9nIGZvciB0aGUgYnJhbmNoLCBhbmQgdHJhY2sgY2F1c2VzIHRoZSBuZXcgYnJhbmNoIHRvIGJlCisgKiBjb25maWd1cmVkIHRvIG1lcmdlIHRoZSByZW1vdGUgYnJhbmNoIHRoYXQgc3RhcnRfbmFtZSBpcyBhIHRyYWNraW5nCisgKiBicmFuY2ggZm9yIChpZiBhbnkpLgorICovCit2b2lkIGNyZWF0ZV9icmFuY2goY29uc3QgY2hhciAqaGVhZCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqc3RhcnRfbmFtZSwKKwkJICAgaW50IGZvcmNlLCBpbnQgcmVmbG9nLCBlbnVtIGJyYW5jaF90cmFjayB0cmFjayk7CisKKy8qCisgKiBSZW1vdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXRlIG9mIHdvcmtpbmcgb24gdGhlIGN1cnJlbnQKKyAqIGJyYW5jaC4gKEUuZy4sIE1FUkdFX0hFQUQpCisgKi8KK3ZvaWQgcmVtb3ZlX2JyYW5jaF9zdGF0ZSh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9idWlsdGluLWFkZC5jIGIvYnVpbHRpbi1hZGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTkxZTNlCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1hZGQuYwpAQCAtMCwwICsxLDI2NyBAQAorLyoKKyAqICJnaXQgYWRkIiBidWlsdGluIGNvbW1hbmQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTGludXMgVG9ydmFsZHMKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImRpci5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisjaW5jbHVkZSAiY2FjaGUtdHJlZS5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJkaWZmY29yZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInJldmlzaW9uLmgiCisjaW5jbHVkZSAicnVuLWNvbW1hbmQuaCIKKyNpbmNsdWRlICJwYXJzZS1vcHRpb25zLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYnVpbHRpbl9hZGRfdXNhZ2VbXSA9IHsKKwkiZ2l0LWFkZCBbb3B0aW9uc10gWy0tXSA8ZmlsZXBhdHRlcm4+Li4uIiwKKwlOVUxMCit9Oworc3RhdGljIGludCBwYXRjaF9pbnRlcmFjdGl2ZSA9IDAsIGFkZF9pbnRlcmFjdGl2ZSA9IDA7CitzdGF0aWMgaW50IHRha2Vfd29ya3RyZWVfY2hhbmdlczsKKworc3RhdGljIHZvaWQgcHJ1bmVfZGlyZWN0b3J5KHN0cnVjdCBkaXJfc3RydWN0ICpkaXIsIGNvbnN0IGNoYXIgKipwYXRoc3BlYywgaW50IHByZWZpeCkKK3sKKwljaGFyICpzZWVuOworCWludCBpLCBzcGVjczsKKwlzdHJ1Y3QgZGlyX2VudHJ5ICoqc3JjLCAqKmRzdDsKKworCWZvciAoc3BlY3MgPSAwOyBwYXRoc3BlY1tzcGVjc107ICBzcGVjcysrKQorCQkvKiBub3RoaW5nICovOworCXNlZW4gPSB4Y2FsbG9jKHNwZWNzLCAxKTsKKworCXNyYyA9IGRzdCA9IGRpci0+ZW50cmllczsKKwlpID0gZGlyLT5ucjsKKwl3aGlsZSAoLS1pID49IDApIHsKKwkJc3RydWN0IGRpcl9lbnRyeSAqZW50cnkgPSAqc3JjKys7CisJCWlmIChtYXRjaF9wYXRoc3BlYyhwYXRoc3BlYywgZW50cnktPm5hbWUsIGVudHJ5LT5sZW4sCisJCQkJICAgcHJlZml4LCBzZWVuKSkKKwkJCSpkc3QrKyA9IGVudHJ5OworCX0KKwlkaXItPm5yID0gZHN0IC0gZGlyLT5lbnRyaWVzOworCisJZm9yIChpID0gMDsgaSA8IHNwZWNzOyBpKyspIHsKKwkJaWYgKCFzZWVuW2ldICYmICFmaWxlX2V4aXN0cyhwYXRoc3BlY1tpXSkpCisJCQlkaWUoInBhdGhzcGVjICclcycgZGlkIG5vdCBtYXRjaCBhbnkgZmlsZXMiLAorCQkJCQlwYXRoc3BlY1tpXSk7CisJfQorICAgICAgICBmcmVlKHNlZW4pOworfQorCitzdGF0aWMgdm9pZCBmaWxsX2RpcmVjdG9yeShzdHJ1Y3QgZGlyX3N0cnVjdCAqZGlyLCBjb25zdCBjaGFyICoqcGF0aHNwZWMsCisJCWludCBpZ25vcmVkX3RvbykKK3sKKwljb25zdCBjaGFyICpwYXRoLCAqYmFzZTsKKwlpbnQgYmFzZWxlbjsKKworCS8qIFNldCB1cCB0aGUgZGVmYXVsdCBnaXQgcG9yY2VsYWluIGV4Y2x1ZGVzICovCisJbWVtc2V0KGRpciwgMCwgc2l6ZW9mKCpkaXIpKTsKKwlpZiAoIWlnbm9yZWRfdG9vKSB7CisJCWRpci0+Y29sbGVjdF9pZ25vcmVkID0gMTsKKwkJc2V0dXBfc3RhbmRhcmRfZXhjbHVkZXMoZGlyKTsKKwl9CisKKwkvKgorCSAqIENhbGN1bGF0ZSBjb21tb24gcHJlZml4IGZvciB0aGUgcGF0aHNwZWMsIGFuZAorCSAqIHVzZSB0aGF0IHRvIG9wdGltaXplIHRoZSBkaXJlY3Rvcnkgd2FsaworCSAqLworCWJhc2VsZW4gPSBjb21tb25fcHJlZml4KHBhdGhzcGVjKTsKKwlwYXRoID0gIi4iOworCWJhc2UgPSAiIjsKKwlpZiAoYmFzZWxlbikKKwkJcGF0aCA9IGJhc2UgPSB4bWVtZHVweigqcGF0aHNwZWMsIGJhc2VsZW4pOworCisJLyogUmVhZCB0aGUgZGlyZWN0b3J5IGFuZCBwcnVuZSBpdCAqLworCXJlYWRfZGlyZWN0b3J5KGRpciwgcGF0aCwgYmFzZSwgYmFzZWxlbiwgcGF0aHNwZWMpOworCWlmIChwYXRoc3BlYykKKwkJcHJ1bmVfZGlyZWN0b3J5KGRpciwgcGF0aHNwZWMsIGJhc2VsZW4pOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfY2FsbGJhY2soc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxLAorCQkJICAgIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCwgdm9pZCAqY2JkYXRhKQoreworCWludCBpLCB2ZXJib3NlOworCisJdmVyYm9zZSA9ICooKGludCAqKWNiZGF0YSk7CisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJY29uc3QgY2hhciAqcGF0aCA9IHAtPm9uZS0+cGF0aDsKKwkJc3dpdGNoIChwLT5zdGF0dXMpIHsKKwkJZGVmYXVsdDoKKwkJCWRpZSgidW5leHBlY3RlZCBkaWZmIHN0YXR1cyAlYyIsIHAtPnN0YXR1cyk7CisJCWNhc2UgRElGRl9TVEFUVVNfVU5NRVJHRUQ6CisJCWNhc2UgRElGRl9TVEFUVVNfTU9ESUZJRUQ6CisJCWNhc2UgRElGRl9TVEFUVVNfVFlQRV9DSEFOR0VEOgorCQkJYWRkX2ZpbGVfdG9fY2FjaGUocGF0aCwgdmVyYm9zZSk7CisJCQlicmVhazsKKwkJY2FzZSBESUZGX1NUQVRVU19ERUxFVEVEOgorCQkJcmVtb3ZlX2ZpbGVfZnJvbV9jYWNoZShwYXRoKTsKKwkJCWlmICh2ZXJib3NlKQorCQkJCXByaW50ZigicmVtb3ZlICclcydcbiIsIHBhdGgpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3ZvaWQgYWRkX2ZpbGVzX3RvX2NhY2hlKGludCB2ZXJib3NlLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKipwYXRoc3BlYykKK3sKKwlzdHJ1Y3QgcmV2X2luZm8gcmV2OworCWluaXRfcmV2aXNpb25zKCZyZXYsIHByZWZpeCk7CisJc2V0dXBfcmV2aXNpb25zKDAsIE5VTEwsICZyZXYsIE5VTEwpOworCXJldi5wcnVuZV9kYXRhID0gcGF0aHNwZWM7CisJcmV2LmRpZmZvcHQub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX0NBTExCQUNLOworCXJldi5kaWZmb3B0LmZvcm1hdF9jYWxsYmFjayA9IHVwZGF0ZV9jYWxsYmFjazsKKwlyZXYuZGlmZm9wdC5mb3JtYXRfY2FsbGJhY2tfZGF0YSA9ICZ2ZXJib3NlOworCXJ1bl9kaWZmX2ZpbGVzKCZyZXYsIERJRkZfUkFDWV9JU19NT0RJRklFRCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlZnJlc2goaW50IHZlcmJvc2UsIGNvbnN0IGNoYXIgKipwYXRoc3BlYykKK3sKKwljaGFyICpzZWVuOworCWludCBpLCBzcGVjczsKKworCWZvciAoc3BlY3MgPSAwOyBwYXRoc3BlY1tzcGVjc107ICBzcGVjcysrKQorCQkvKiBub3RoaW5nICovOworCXNlZW4gPSB4Y2FsbG9jKHNwZWNzLCAxKTsKKwlpZiAocmVhZF9jYWNoZSgpIDwgMCkKKwkJZGllKCJpbmRleCBmaWxlIGNvcnJ1cHQiKTsKKwlyZWZyZXNoX2luZGV4KCZ0aGVfaW5kZXgsIHZlcmJvc2UgPyAwIDogUkVGUkVTSF9RVUlFVCwgcGF0aHNwZWMsIHNlZW4pOworCWZvciAoaSA9IDA7IGkgPCBzcGVjczsgaSsrKSB7CisJCWlmICghc2VlbltpXSkKKwkJCWRpZSgicGF0aHNwZWMgJyVzJyBkaWQgbm90IG1hdGNoIGFueSBmaWxlcyIsIHBhdGhzcGVjW2ldKTsKKwl9CisgICAgICAgIGZyZWUoc2Vlbik7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoqdmFsaWRhdGVfcGF0aHNwZWMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJY29uc3QgY2hhciAqKnBhdGhzcGVjID0gZ2V0X3BhdGhzcGVjKHByZWZpeCwgYXJndik7CisKKwlyZXR1cm4gcGF0aHNwZWM7Cit9CisKK2ludCBpbnRlcmFjdGl2ZV9hZGQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IHN0YXR1cywgYWM7CisJY29uc3QgY2hhciAqKmFyZ3M7CisJY29uc3QgY2hhciAqKnBhdGhzcGVjID0gTlVMTDsKKworCWlmIChhcmdjKSB7CisJCXBhdGhzcGVjID0gdmFsaWRhdGVfcGF0aHNwZWMoYXJnYywgYXJndiwgcHJlZml4KTsKKwkJaWYgKCFwYXRoc3BlYykKKwkJCXJldHVybiAtMTsKKwl9CisKKwlhcmdzID0geGNhbGxvYyhzaXplb2YoY29uc3QgY2hhciAqKSwgKGFyZ2MgKyA0KSk7CisJYWMgPSAwOworCWFyZ3NbYWMrK10gPSAiYWRkLS1pbnRlcmFjdGl2ZSI7CisJaWYgKHBhdGNoX2ludGVyYWN0aXZlKQorCQlhcmdzW2FjKytdID0gIi0tcGF0Y2giOworCWFyZ3NbYWMrK10gPSAiLS0iOworCWlmIChhcmdjKSB7CisJCW1lbWNweSgmKGFyZ3NbYWNdKSwgcGF0aHNwZWMsIHNpemVvZihjb25zdCBjaGFyICopICogYXJnYyk7CisJCWFjICs9IGFyZ2M7CisJfQorCWFyZ3NbYWNdID0gTlVMTDsKKworCXN0YXR1cyA9IHJ1bl9jb21tYW5kX3Zfb3B0KGFyZ3MsIFJVTl9HSVRfQ01EKTsKKwlmcmVlKGFyZ3MpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG9ja19maWxlIGxvY2tfZmlsZTsKKworc3RhdGljIGNvbnN0IGNoYXIgaWdub3JlX2Vycm9yW10gPQorIlRoZSBmb2xsb3dpbmcgcGF0aHMgYXJlIGlnbm9yZWQgYnkgb25lIG9mIHlvdXIgLmdpdGlnbm9yZSBmaWxlczpcbiI7CisKK3N0YXRpYyBpbnQgdmVyYm9zZSA9IDAsIHNob3dfb25seSA9IDAsIGlnbm9yZWRfdG9vID0gMCwgcmVmcmVzaF9vbmx5ID0gMDsKKworc3RhdGljIHN0cnVjdCBvcHRpb24gYnVpbHRpbl9hZGRfb3B0aW9uc1tdID0geworCU9QVF9fRFJZX1JVTigmc2hvd19vbmx5KSwKKwlPUFRfX1ZFUkJPU0UoJnZlcmJvc2UpLAorCU9QVF9HUk9VUCgiIiksCisJT1BUX0JPT0xFQU4oJ2knLCAiaW50ZXJhY3RpdmUiLCAmYWRkX2ludGVyYWN0aXZlLCAiaW50ZXJhY3RpdmUgcGlja2luZyIpLAorCU9QVF9CT09MRUFOKCdwJywgInBhdGNoIiwgJnBhdGNoX2ludGVyYWN0aXZlLCAiaW50ZXJhY3RpdmUgcGF0Y2hpbmciKSwKKwlPUFRfQk9PTEVBTignZicsIE5VTEwsICZpZ25vcmVkX3RvbywgImFsbG93IGFkZGluZyBvdGhlcndpc2UgaWdub3JlZCBmaWxlcyIpLAorCU9QVF9CT09MRUFOKCd1JywgTlVMTCwgJnRha2Vfd29ya3RyZWVfY2hhbmdlcywgInVwZGF0ZSB0cmFja2VkIGZpbGVzIiksCisJT1BUX0JPT0xFQU4oIDAgLCAicmVmcmVzaCIsICZyZWZyZXNoX29ubHksICJkb24ndCBhZGQsIG9ubHkgcmVmcmVzaCB0aGUgaW5kZXgiKSwKKwlPUFRfRU5EKCksCit9OworCitpbnQgY21kX2FkZChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaSwgbmV3ZmQ7CisJY29uc3QgY2hhciAqKnBhdGhzcGVjOworCXN0cnVjdCBkaXJfc3RydWN0IGRpcjsKKworCWFyZ2MgPSBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIGJ1aWx0aW5fYWRkX29wdGlvbnMsCisJCQkgIGJ1aWx0aW5fYWRkX3VzYWdlLCAwKTsKKwlpZiAocGF0Y2hfaW50ZXJhY3RpdmUpCisJCWFkZF9pbnRlcmFjdGl2ZSA9IDE7CisJaWYgKGFkZF9pbnRlcmFjdGl2ZSkKKwkJZXhpdChpbnRlcmFjdGl2ZV9hZGQoYXJnYywgYXJndiwgcHJlZml4KSk7CisKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwluZXdmZCA9IGhvbGRfbG9ja2VkX2luZGV4KCZsb2NrX2ZpbGUsIDEpOworCisJaWYgKHRha2Vfd29ya3RyZWVfY2hhbmdlcykgeworCQljb25zdCBjaGFyICoqcGF0aHNwZWM7CisJCWlmIChyZWFkX2NhY2hlKCkgPCAwKQorCQkJZGllKCJpbmRleCBmaWxlIGNvcnJ1cHQiKTsKKwkJcGF0aHNwZWMgPSBnZXRfcGF0aHNwZWMocHJlZml4LCBhcmd2KTsKKwkJYWRkX2ZpbGVzX3RvX2NhY2hlKHZlcmJvc2UsIHByZWZpeCwgcGF0aHNwZWMpOworCQlnb3RvIGZpbmlzaDsKKwl9CisKKwlpZiAoYXJnYyA9PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm90aGluZyBzcGVjaWZpZWQsIG5vdGhpbmcgYWRkZWQuXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICJNYXliZSB5b3Ugd2FudGVkIHRvIHNheSAnZ2l0IGFkZCAuJz9cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJcGF0aHNwZWMgPSBnZXRfcGF0aHNwZWMocHJlZml4LCBhcmd2KTsKKworCWlmIChyZWZyZXNoX29ubHkpIHsKKwkJcmVmcmVzaCh2ZXJib3NlLCBwYXRoc3BlYyk7CisJCWdvdG8gZmluaXNoOworCX0KKworCWZpbGxfZGlyZWN0b3J5KCZkaXIsIHBhdGhzcGVjLCBpZ25vcmVkX3Rvbyk7CisKKwlpZiAoc2hvd19vbmx5KSB7CisJCWNvbnN0IGNoYXIgKnNlcCA9ICIiLCAqZW9mID0gIiI7CisJCWZvciAoaSA9IDA7IGkgPCBkaXIubnI7IGkrKykgeworCQkJcHJpbnRmKCIlcyVzIiwgc2VwLCBkaXIuZW50cmllc1tpXS0+bmFtZSk7CisJCQlzZXAgPSAiICI7CisJCQllb2YgPSAiXG4iOworCQl9CisJCWZwdXRzKGVvZiwgc3Rkb3V0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHJlYWRfY2FjaGUoKSA8IDApCisJCWRpZSgiaW5kZXggZmlsZSBjb3JydXB0Iik7CisKKwlpZiAoZGlyLmlnbm9yZWRfbnIpIHsKKwkJZnByaW50ZihzdGRlcnIsIGlnbm9yZV9lcnJvcik7CisJCWZvciAoaSA9IDA7IGkgPCBkaXIuaWdub3JlZF9ucjsgaSsrKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBkaXIuaWdub3JlZFtpXS0+bmFtZSk7CisJCX0KKwkJZnByaW50ZihzdGRlcnIsICJVc2UgLWYgaWYgeW91IHJlYWxseSB3YW50IHRvIGFkZCB0aGVtLlxuIik7CisJCWRpZSgibm8gZmlsZXMgYWRkZWQiKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZGlyLm5yOyBpKyspCisJCWFkZF9maWxlX3RvX2NhY2hlKGRpci5lbnRyaWVzW2ldLT5uYW1lLCB2ZXJib3NlKTsKKworIGZpbmlzaDoKKwlpZiAoYWN0aXZlX2NhY2hlX2NoYW5nZWQpIHsKKwkJaWYgKHdyaXRlX2NhY2hlKG5ld2ZkLCBhY3RpdmVfY2FjaGUsIGFjdGl2ZV9ucikgfHwKKwkJICAgIGNvbW1pdF9sb2NrZWRfaW5kZXgoJmxvY2tfZmlsZSkpCisJCQlkaWUoIlVuYWJsZSB0byB3cml0ZSBuZXcgaW5kZXggZmlsZSIpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1hbm5vdGF0ZS5jIGIvYnVpbHRpbi1hbm5vdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNDNlZWQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWFubm90YXRlLmMKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqICJnaXQgYW5ub3RhdGUiIGJ1aWx0aW4gYWxpYXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUnlhbiBBbmRlcnNvbgorICovCisjaW5jbHVkZSAiZ2l0LWNvbXBhdC11dGlsLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCitpbnQgY21kX2Fubm90YXRlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWNvbnN0IGNoYXIgKipuYXJndjsKKwlpbnQgaTsKKwluYXJndiA9IHhtYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiAoYXJnYyArIDIpKTsKKworCW5hcmd2WzBdID0gImFubm90YXRlIjsKKwluYXJndlsxXSA9ICItYyI7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCW5hcmd2W2krMV0gPSBhcmd2W2ldOworCX0KKwluYXJndlthcmdjICsgMV0gPSBOVUxMOworCisJcmV0dXJuIGNtZF9ibGFtZShhcmdjICsgMSwgbmFyZ3YsIHByZWZpeCk7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWFwcGx5LmMgYi9idWlsdGluLWFwcGx5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlNzNhMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tYXBwbHkuYwpAQCAtMCwwICsxLDMxNjcgQEAKKy8qCisgKiBhcHBseS5jCisgKgorICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorICoKKyAqIFRoaXMgYXBwbGllcyBwYXRjaGVzIG9uIHRvcCBvZiBzb21lIChhcmJpdHJhcnkpIHZlcnNpb24gb2YgdGhlIFNDTS4KKyAqCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNhY2hlLXRyZWUuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJkZWx0YS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworLyoKKyAqICAtLWNoZWNrIHR1cm5zIG9uIGNoZWNraW5nIHRoYXQgdGhlIHdvcmtpbmcgdHJlZSBtYXRjaGVzIHRoZQorICogICAgZmlsZXMgdGhhdCBhcmUgYmVpbmcgbW9kaWZpZWQsIGJ1dCBkb2Vzbid0IGFwcGx5IHRoZSBwYXRjaAorICogIC0tc3RhdCBkb2VzIGp1c3QgYSBkaWZmc3RhdCwgYW5kIGRvZXNuJ3QgYWN0dWFsbHkgYXBwbHkKKyAqICAtLW51bXN0YXQgZG9lcyBudW1lcmljIGRpZmZzdGF0LCBhbmQgZG9lc24ndCBhY3R1YWxseSBhcHBseQorICogIC0taW5kZXgtaW5mbyBzaG93cyB0aGUgb2xkIGFuZCBuZXcgaW5kZXggaW5mbyBmb3IgcGF0aHMgaWYgYXZhaWxhYmxlLgorICogIC0taW5kZXggdXBkYXRlcyB0aGUgY2FjaGUgYXMgd2VsbC4KKyAqICAtLWNhY2hlZCB1cGRhdGVzIG9ubHkgdGhlIGNhY2hlIHdpdGhvdXQgZXZlciB0b3VjaGluZyB0aGUgd29ya2luZyB0cmVlLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqcHJlZml4Oworc3RhdGljIGludCBwcmVmaXhfbGVuZ3RoID0gLTE7CitzdGF0aWMgaW50IG5ld2ZkID0gLTE7CisKK3N0YXRpYyBpbnQgdW5pZGlmZl96ZXJvOworc3RhdGljIGludCBwX3ZhbHVlID0gMTsKK3N0YXRpYyBpbnQgcF92YWx1ZV9rbm93bjsKK3N0YXRpYyBpbnQgY2hlY2tfaW5kZXg7CitzdGF0aWMgaW50IHVwZGF0ZV9pbmRleDsKK3N0YXRpYyBpbnQgY2FjaGVkOworc3RhdGljIGludCBkaWZmc3RhdDsKK3N0YXRpYyBpbnQgbnVtc3RhdDsKK3N0YXRpYyBpbnQgc3VtbWFyeTsKK3N0YXRpYyBpbnQgY2hlY2s7CitzdGF0aWMgaW50IGFwcGx5ID0gMTsKK3N0YXRpYyBpbnQgYXBwbHlfaW5fcmV2ZXJzZTsKK3N0YXRpYyBpbnQgYXBwbHlfd2l0aF9yZWplY3Q7CitzdGF0aWMgaW50IGFwcGx5X3ZlcmJvc2VseTsKK3N0YXRpYyBpbnQgbm9fYWRkOworc3RhdGljIGNvbnN0IGNoYXIgKmZha2VfYW5jZXN0b3I7CitzdGF0aWMgaW50IGxpbmVfdGVybWluYXRpb24gPSAnXG4nOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcF9jb250ZXh0ID0gVUxPTkdfTUFYOworc3RhdGljIGNvbnN0IGNoYXIgYXBwbHlfdXNhZ2VbXSA9CisiZ2l0LWFwcGx5IFstLXN0YXRdIFstLW51bXN0YXRdIFstLXN1bW1hcnldIFstLWNoZWNrXSBbLS1pbmRleF0gWy0tY2FjaGVkXSBbLS1hcHBseV0gWy0tbm8tYWRkXSBbLS1pbmRleC1pbmZvXSBbLS1hbGxvdy1iaW5hcnktcmVwbGFjZW1lbnRdIFstLXJldmVyc2VdIFstLXJlamVjdF0gWy0tdmVyYm9zZV0gWy16XSBbLXBOVU1dIFstQ05VTV0gWy0td2hpdGVzcGFjZT08bm93YXJufHdhcm58Zml4fGVycm9yfGVycm9yLWFsbD5dIDxwYXRjaD4uLi4iOworCitzdGF0aWMgZW51bSB3c19lcnJvcl9hY3Rpb24geworCW5vd2Fybl93c19lcnJvciwKKwl3YXJuX29uX3dzX2Vycm9yLAorCWRpZV9vbl93c19lcnJvciwKKwljb3JyZWN0X3dzX2Vycm9yLAorfSB3c19lcnJvcl9hY3Rpb24gPSB3YXJuX29uX3dzX2Vycm9yOworc3RhdGljIGludCB3aGl0ZXNwYWNlX2Vycm9yOworc3RhdGljIGludCBzcXVlbGNoX3doaXRlc3BhY2VfZXJyb3JzID0gNTsKK3N0YXRpYyBpbnQgYXBwbGllZF9hZnRlcl9maXhpbmdfd3M7CitzdGF0aWMgY29uc3QgY2hhciAqcGF0Y2hfaW5wdXRfZmlsZTsKKworc3RhdGljIHZvaWQgcGFyc2Vfd2hpdGVzcGFjZV9vcHRpb24oY29uc3QgY2hhciAqb3B0aW9uKQoreworCWlmICghb3B0aW9uKSB7CisJCXdzX2Vycm9yX2FjdGlvbiA9IHdhcm5fb25fd3NfZXJyb3I7CisJCXJldHVybjsKKwl9CisJaWYgKCFzdHJjbXAob3B0aW9uLCAid2FybiIpKSB7CisJCXdzX2Vycm9yX2FjdGlvbiA9IHdhcm5fb25fd3NfZXJyb3I7CisJCXJldHVybjsKKwl9CisJaWYgKCFzdHJjbXAob3B0aW9uLCAibm93YXJuIikpIHsKKwkJd3NfZXJyb3JfYWN0aW9uID0gbm93YXJuX3dzX2Vycm9yOworCQlyZXR1cm47CisJfQorCWlmICghc3RyY21wKG9wdGlvbiwgImVycm9yIikpIHsKKwkJd3NfZXJyb3JfYWN0aW9uID0gZGllX29uX3dzX2Vycm9yOworCQlyZXR1cm47CisJfQorCWlmICghc3RyY21wKG9wdGlvbiwgImVycm9yLWFsbCIpKSB7CisJCXdzX2Vycm9yX2FjdGlvbiA9IGRpZV9vbl93c19lcnJvcjsKKwkJc3F1ZWxjaF93aGl0ZXNwYWNlX2Vycm9ycyA9IDA7CisJCXJldHVybjsKKwl9CisJaWYgKCFzdHJjbXAob3B0aW9uLCAic3RyaXAiKSB8fCAhc3RyY21wKG9wdGlvbiwgImZpeCIpKSB7CisJCXdzX2Vycm9yX2FjdGlvbiA9IGNvcnJlY3Rfd3NfZXJyb3I7CisJCXJldHVybjsKKwl9CisJZGllKCJ1bnJlY29nbml6ZWQgd2hpdGVzcGFjZSBvcHRpb24gJyVzJyIsIG9wdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9kZWZhdWx0X3doaXRlc3BhY2VfbW9kZShjb25zdCBjaGFyICp3aGl0ZXNwYWNlX29wdGlvbikKK3sKKwlpZiAoIXdoaXRlc3BhY2Vfb3B0aW9uICYmICFhcHBseV9kZWZhdWx0X3doaXRlc3BhY2UpCisJCXdzX2Vycm9yX2FjdGlvbiA9IChhcHBseSA/IHdhcm5fb25fd3NfZXJyb3IgOiBub3dhcm5fd3NfZXJyb3IpOworfQorCisvKgorICogRm9yICJkaWZmLXN0YXQiIGxpa2UgYmVoYXZpb3VyLCB3ZSBrZWVwIHRyYWNrIG9mIHRoZSBiaWdnZXN0IGNoYW5nZQorICogd2UndmUgc2VlbiwgYW5kIHRoZSBsb25nZXN0IGZpbGVuYW1lLiBUaGF0IGFsbG93cyB1cyB0byBkbyBzaW1wbGUKKyAqIHNjYWxpbmcuCisgKi8KK3N0YXRpYyBpbnQgbWF4X2NoYW5nZSwgbWF4X2xlbjsKKworLyoKKyAqIFZhcmlvdXMgImN1cnJlbnQgc3RhdGUiLCBub3RhYmx5IGxpbmUgbnVtYmVycyBhbmQgd2hhdAorICogZmlsZSAoYW5kIGhvdykgd2UncmUgcGF0Y2hpbmcgcmlnaHQgbm93Li4gVGhlICJpc194eHh4IgorICogdGhpbmdzIGFyZSBmbGFncywgd2hlcmUgLTEgbWVhbnMgImRvbid0IGtub3cgeWV0Ii4KKyAqLworc3RhdGljIGludCBsaW5lbnIgPSAxOworCisvKgorICogVGhpcyByZXByZXNlbnRzIG9uZSAiaHVuayIgZnJvbSBhIHBhdGNoLCBzdGFydGluZyB3aXRoCisgKiAiQEAgLW9sZHBvcyxvbGRsaW5lcyArbmV3cG9zLG5ld2xpbmVzIEBAIiBtYXJrZXIuICBUaGUKKyAqIHBhdGNoIHRleHQgaXMgcG9pbnRlZCBhdCBieSBwYXRjaCwgYW5kIGl0cyBieXRlIGxlbmd0aAorICogaXMgc3RvcmVkIGluIHNpemUuICBsZWFkaW5nIGFuZCB0cmFpbGluZyBhcmUgdGhlIG51bWJlcgorICogb2YgY29udGV4dCBsaW5lcy4KKyAqLworc3RydWN0IGZyYWdtZW50IHsKKwl1bnNpZ25lZCBsb25nIGxlYWRpbmcsIHRyYWlsaW5nOworCXVuc2lnbmVkIGxvbmcgb2xkcG9zLCBvbGRsaW5lczsKKwl1bnNpZ25lZCBsb25nIG5ld3BvcywgbmV3bGluZXM7CisJY29uc3QgY2hhciAqcGF0Y2g7CisJaW50IHNpemU7CisJaW50IHJlamVjdGVkOworCXN0cnVjdCBmcmFnbWVudCAqbmV4dDsKK307CisKKy8qCisgKiBXaGVuIGRlYWxpbmcgd2l0aCBhIGJpbmFyeSBwYXRjaCwgd2UgcmV1c2UgImxlYWRpbmciIGZpZWxkCisgKiB0byBzdG9yZSB0aGUgdHlwZSBvZiB0aGUgYmluYXJ5IGh1bmssIGVpdGhlciBkZWZsYXRlZCAiZGVsdGEiCisgKiBvciBkZWZsYXRlZCAibGl0ZXJhbCIuCisgKi8KKyNkZWZpbmUgYmluYXJ5X3BhdGNoX21ldGhvZCBsZWFkaW5nCisjZGVmaW5lIEJJTkFSWV9ERUxUQV9ERUZMQVRFRAkxCisjZGVmaW5lIEJJTkFSWV9MSVRFUkFMX0RFRkxBVEVEIDIKKworLyoKKyAqIFRoaXMgcmVwcmVzZW50cyBhICJwYXRjaCIgdG8gYSBmaWxlLCBib3RoIG1ldGFpbmZvIGNoYW5nZXMKKyAqIHN1Y2ggYXMgY3JlYXRpb24vZGVsZXRpb24sIGZpbGVtb2RlIGFuZCBjb250ZW50IGNoYW5nZXMgcmVwcmVzZW50ZWQKKyAqIGFzIGEgc2VyaWVzIG9mIGZyYWdtZW50cy4KKyAqLworc3RydWN0IHBhdGNoIHsKKwljaGFyICpuZXdfbmFtZSwgKm9sZF9uYW1lLCAqZGVmX25hbWU7CisJdW5zaWduZWQgaW50IG9sZF9tb2RlLCBuZXdfbW9kZTsKKwlpbnQgaXNfbmV3LCBpc19kZWxldGU7CS8qIC0xID0gdW5rbm93biwgMCA9IGZhbHNlLCAxID0gdHJ1ZSAqLworCWludCByZWplY3RlZDsKKwl1bnNpZ25lZCB3c19ydWxlOworCXVuc2lnbmVkIGxvbmcgZGVmbGF0ZV9vcmlnbGVuOworCWludCBsaW5lc19hZGRlZCwgbGluZXNfZGVsZXRlZDsKKwlpbnQgc2NvcmU7CisJdW5zaWduZWQgaW50IGlzX3RvcGxldmVsX3JlbGF0aXZlOjE7CisJdW5zaWduZWQgaW50IGluYWNjdXJhdGVfZW9mOjE7CisJdW5zaWduZWQgaW50IGlzX2JpbmFyeToxOworCXVuc2lnbmVkIGludCBpc19jb3B5OjE7CisJdW5zaWduZWQgaW50IGlzX3JlbmFtZToxOworCXN0cnVjdCBmcmFnbWVudCAqZnJhZ21lbnRzOworCWNoYXIgKnJlc3VsdDsKKwlzaXplX3QgcmVzdWx0c2l6ZTsKKwljaGFyIG9sZF9zaGExX3ByZWZpeFs0MV07CisJY2hhciBuZXdfc2hhMV9wcmVmaXhbNDFdOworCXN0cnVjdCBwYXRjaCAqbmV4dDsKK307CisKKy8qCisgKiBBIGxpbmUgaW4gYSBmaWxlLCBsZW4tYnl0ZXMgbG9uZyAoaW5jbHVkZXMgdGhlIHRlcm1pbmF0aW5nIExGLAorICogZXhjZXB0IGZvciBhbiBpbmNvbXBsZXRlIGxpbmUgYXQgdGhlIGVuZCBpZiB0aGUgZmlsZSBlbmRzIHdpdGgKKyAqIG9uZSksIGFuZCBpdHMgY29udGVudHMgaGFzaGVzIHRvICdoYXNoJy4KKyAqLworc3RydWN0IGxpbmUgeworCXNpemVfdCBsZW47CisJdW5zaWduZWQgaGFzaCA6IDI0OworCXVuc2lnbmVkIGZsYWcgOiA4OworI2RlZmluZSBMSU5FX0NPTU1PTiAgICAgMQorfTsKKworLyoKKyAqIFRoaXMgcmVwcmVzZW50cyBhICJmaWxlIiwgd2hpY2ggaXMgYW4gYXJyYXkgb2YgImxpbmVzIi4KKyAqLworc3RydWN0IGltYWdlIHsKKwljaGFyICpidWY7CisJc2l6ZV90IGxlbjsKKwlzaXplX3QgbnI7CisJc2l6ZV90IGFsbG9jOworCXN0cnVjdCBsaW5lICpsaW5lX2FsbG9jYXRlZDsKKwlzdHJ1Y3QgbGluZSAqbGluZTsKK307CisKK3N0YXRpYyB1aW50MzJfdCBoYXNoX2xpbmUoY29uc3QgY2hhciAqY3AsIHNpemVfdCBsZW4pCit7CisJc2l6ZV90IGk7CisJdWludDMyX3QgaDsKKwlmb3IgKGkgPSAwLCBoID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmICghaXNzcGFjZShjcFtpXSkpIHsKKwkJCWggPSBoICogMyArIChjcFtpXSAmIDB4ZmYpOworCQl9CisJfQorCXJldHVybiBoOworfQorCitzdGF0aWMgdm9pZCBhZGRfbGluZV9pbmZvKHN0cnVjdCBpbWFnZSAqaW1nLCBjb25zdCBjaGFyICpib2wsIHNpemVfdCBsZW4sIHVuc2lnbmVkIGZsYWcpCit7CisJQUxMT0NfR1JPVyhpbWctPmxpbmVfYWxsb2NhdGVkLCBpbWctPm5yICsgMSwgaW1nLT5hbGxvYyk7CisJaW1nLT5saW5lX2FsbG9jYXRlZFtpbWctPm5yXS5sZW4gPSBsZW47CisJaW1nLT5saW5lX2FsbG9jYXRlZFtpbWctPm5yXS5oYXNoID0gaGFzaF9saW5lKGJvbCwgbGVuKTsKKwlpbWctPmxpbmVfYWxsb2NhdGVkW2ltZy0+bnJdLmZsYWcgPSBmbGFnOworCWltZy0+bnIrKzsKK30KKworc3RhdGljIHZvaWQgcHJlcGFyZV9pbWFnZShzdHJ1Y3QgaW1hZ2UgKmltYWdlLCBjaGFyICpidWYsIHNpemVfdCBsZW4sCisJCQkgIGludCBwcmVwYXJlX2xpbmV0YWJsZSkKK3sKKwljb25zdCBjaGFyICpjcCwgKmVwOworCisJbWVtc2V0KGltYWdlLCAwLCBzaXplb2YoKmltYWdlKSk7CisJaW1hZ2UtPmJ1ZiA9IGJ1ZjsKKwlpbWFnZS0+bGVuID0gbGVuOworCisJaWYgKCFwcmVwYXJlX2xpbmV0YWJsZSkKKwkJcmV0dXJuOworCisJZXAgPSBpbWFnZS0+YnVmICsgaW1hZ2UtPmxlbjsKKwljcCA9IGltYWdlLT5idWY7CisJd2hpbGUgKGNwIDwgZXApIHsKKwkJY29uc3QgY2hhciAqbmV4dDsKKwkJZm9yIChuZXh0ID0gY3A7IG5leHQgPCBlcCAmJiAqbmV4dCAhPSAnXG4nOyBuZXh0KyspCisJCQk7CisJCWlmIChuZXh0IDwgZXApCisJCQluZXh0Kys7CisJCWFkZF9saW5lX2luZm8oaW1hZ2UsIGNwLCBuZXh0IC0gY3AsIDApOworCQljcCA9IG5leHQ7CisJfQorCWltYWdlLT5saW5lID0gaW1hZ2UtPmxpbmVfYWxsb2NhdGVkOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9pbWFnZShzdHJ1Y3QgaW1hZ2UgKmltYWdlKQoreworCWZyZWUoaW1hZ2UtPmJ1Zik7CisJaW1hZ2UtPmJ1ZiA9IE5VTEw7CisJaW1hZ2UtPmxlbiA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHNheV9wYXRjaF9uYW1lKEZJTEUgKm91dHB1dCwgY29uc3QgY2hhciAqcHJlLAorCQkJICAgc3RydWN0IHBhdGNoICpwYXRjaCwgY29uc3QgY2hhciAqcG9zdCkKK3sKKwlmcHV0cyhwcmUsIG91dHB1dCk7CisJaWYgKHBhdGNoLT5vbGRfbmFtZSAmJiBwYXRjaC0+bmV3X25hbWUgJiYKKwkgICAgc3RyY21wKHBhdGNoLT5vbGRfbmFtZSwgcGF0Y2gtPm5ld19uYW1lKSkgeworCQlxdW90ZV9jX3N0eWxlKHBhdGNoLT5vbGRfbmFtZSwgTlVMTCwgb3V0cHV0LCAwKTsKKwkJZnB1dHMoIiA9PiAiLCBvdXRwdXQpOworCQlxdW90ZV9jX3N0eWxlKHBhdGNoLT5uZXdfbmFtZSwgTlVMTCwgb3V0cHV0LCAwKTsKKwl9IGVsc2UgeworCQljb25zdCBjaGFyICpuID0gcGF0Y2gtPm5ld19uYW1lOworCQlpZiAoIW4pCisJCQluID0gcGF0Y2gtPm9sZF9uYW1lOworCQlxdW90ZV9jX3N0eWxlKG4sIE5VTEwsIG91dHB1dCwgMCk7CisJfQorCWZwdXRzKHBvc3QsIG91dHB1dCk7Cit9CisKKyNkZWZpbmUgQ0hVTktTSVpFICg4MTkyKQorI2RlZmluZSBTTE9QICgxNikKKworc3RhdGljIHZvaWQgcmVhZF9wYXRjaF9maWxlKHN0cnVjdCBzdHJidWYgKnNiLCBpbnQgZmQpCit7CisJaWYgKHN0cmJ1Zl9yZWFkKHNiLCBmZCwgMCkgPCAwKQorCQlkaWUoImdpdC1hcHBseTogcmVhZCByZXR1cm5lZCAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgc29tZSBzbG9wIGluIHRoZSBidWZmZXIKKwkgKiBzbyB0aGF0IHdlIGNhbiBkbyBzcGVjdWxhdGl2ZSAibWVtY21wIiBldGMsIGFuZAorCSAqIHNlZSB0byBpdCB0aGF0IGl0IGlzIE5VTC1maWxsZWQuCisJICovCisJc3RyYnVmX2dyb3coc2IsIFNMT1ApOworCW1lbXNldChzYi0+YnVmICsgc2ItPmxlbiwgMCwgU0xPUCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxpbmVsZW4oY29uc3QgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBsZW4gPSAwOworCXdoaWxlIChzaXplLS0pIHsKKwkJbGVuKys7CisJCWlmICgqYnVmZmVyKysgPT0gJ1xuJykKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGlzX2Rldl9udWxsKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlyZXR1cm4gIW1lbWNtcCgiL2Rldi9udWxsIiwgc3RyLCA5KSAmJiBpc3NwYWNlKHN0cls5XSk7Cit9CisKKyNkZWZpbmUgVEVSTV9TUEFDRQkxCisjZGVmaW5lIFRFUk1fVEFCCTIKKworc3RhdGljIGludCBuYW1lX3Rlcm1pbmF0ZShjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGMsIGludCB0ZXJtaW5hdGUpCit7CisJaWYgKGMgPT0gJyAnICYmICEodGVybWluYXRlICYgVEVSTV9TUEFDRSkpCisJCXJldHVybiAwOworCWlmIChjID09ICdcdCcgJiYgISh0ZXJtaW5hdGUgJiBURVJNX1RBQikpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjaGFyICpmaW5kX25hbWUoY29uc3QgY2hhciAqbGluZSwgY2hhciAqZGVmLCBpbnQgcF92YWx1ZSwgaW50IHRlcm1pbmF0ZSkKK3sKKwlpbnQgbGVuOworCWNvbnN0IGNoYXIgKnN0YXJ0ID0gbGluZTsKKworCWlmICgqbGluZSA9PSAnIicpIHsKKwkJc3RydWN0IHN0cmJ1ZiBuYW1lOworCisJCS8qCisJCSAqIFByb3Bvc2VkICJuZXctc3R5bGUiIEdOVSBwYXRjaC9kaWZmIGZvcm1hdDsgc2VlCisJCSAqIGh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9Z2l0Jm09MTEyOTI3MzE2NDA4NjkwJnc9MgorCQkgKi8KKwkJc3RyYnVmX2luaXQoJm5hbWUsIDApOworCQlpZiAoIXVucXVvdGVfY19zdHlsZSgmbmFtZSwgbGluZSwgTlVMTCkpIHsKKwkJCWNoYXIgKmNwOworCisJCQlmb3IgKGNwID0gbmFtZS5idWY7IHBfdmFsdWU7IHBfdmFsdWUtLSkgeworCQkJCWNwID0gc3RyY2hyKGNwLCAnLycpOworCQkJCWlmICghY3ApCisJCQkJCWJyZWFrOworCQkJCWNwKys7CisJCQl9CisJCQlpZiAoY3ApIHsKKwkJCQkvKiBuYW1lIGNhbiBsYXRlciBiZSBmcmVlZCwgc28gd2UgbmVlZAorCQkJCSAqIHRvIG1lbW1vdmUsIG5vdCBqdXN0IHJldHVybiBjcAorCQkJCSAqLworCQkJCXN0cmJ1Zl9yZW1vdmUoJm5hbWUsIDAsIGNwIC0gbmFtZS5idWYpOworCQkJCWZyZWUoZGVmKTsKKwkJCQlyZXR1cm4gc3RyYnVmX2RldGFjaCgmbmFtZSwgTlVMTCk7CisJCQl9CisJCX0KKwkJc3RyYnVmX3JlbGVhc2UoJm5hbWUpOworCX0KKworCWZvciAoOzspIHsKKwkJY2hhciBjID0gKmxpbmU7CisKKwkJaWYgKGlzc3BhY2UoYykpIHsKKwkJCWlmIChjID09ICdcbicpCisJCQkJYnJlYWs7CisJCQlpZiAobmFtZV90ZXJtaW5hdGUoc3RhcnQsIGxpbmUtc3RhcnQsIGMsIHRlcm1pbmF0ZSkpCisJCQkJYnJlYWs7CisJCX0KKwkJbGluZSsrOworCQlpZiAoYyA9PSAnLycgJiYgIS0tcF92YWx1ZSkKKwkJCXN0YXJ0ID0gbGluZTsKKwl9CisJaWYgKCFzdGFydCkKKwkJcmV0dXJuIGRlZjsKKwlsZW4gPSBsaW5lIC0gc3RhcnQ7CisJaWYgKCFsZW4pCisJCXJldHVybiBkZWY7CisKKwkvKgorCSAqIEdlbmVyYWxseSB3ZSBwcmVmZXIgdGhlIHNob3J0ZXIgbmFtZSwgZXNwZWNpYWxseQorCSAqIGlmIHRoZSBvdGhlciBvbmUgaXMganVzdCBhIHZhcmlhdGlvbiBvZiB0aGF0IHdpdGgKKwkgKiBzb21ldGhpbmcgZWxzZSB0YWNrZWQgb24gdG8gdGhlIGVuZCAoaWUgImZpbGUub3JpZyIKKwkgKiBvciAiZmlsZX4iKS4KKwkgKi8KKwlpZiAoZGVmKSB7CisJCWludCBkZWZsZW4gPSBzdHJsZW4oZGVmKTsKKwkJaWYgKGRlZmxlbiA8IGxlbiAmJiAhc3RybmNtcChzdGFydCwgZGVmLCBkZWZsZW4pKQorCQkJcmV0dXJuIGRlZjsKKwkJZnJlZShkZWYpOworCX0KKworCXJldHVybiB4bWVtZHVweihzdGFydCwgbGVuKTsKK30KKworc3RhdGljIGludCBjb3VudF9zbGFzaGVzKGNvbnN0IGNoYXIgKmNwKQoreworCWludCBjbnQgPSAwOworCWNoYXIgY2g7CisKKwl3aGlsZSAoKGNoID0gKmNwKyspKQorCQlpZiAoY2ggPT0gJy8nKQorCQkJY250Kys7CisJcmV0dXJuIGNudDsKK30KKworLyoKKyAqIEdpdmVuIHRoZSBzdHJpbmcgYWZ0ZXIgIi0tLSAiIG9yICIrKysgIiwgZ3Vlc3MgdGhlIGFwcHJvcHJpYXRlCisgKiBwX3ZhbHVlIGZvciB0aGUgZ2l2ZW4gcGF0Y2guCisgKi8KK3N0YXRpYyBpbnQgZ3Vlc3NfcF92YWx1ZShjb25zdCBjaGFyICpuYW1lbGluZSkKK3sKKwljaGFyICpuYW1lLCAqY3A7CisJaW50IHZhbCA9IC0xOworCisJaWYgKGlzX2Rldl9udWxsKG5hbWVsaW5lKSkKKwkJcmV0dXJuIC0xOworCW5hbWUgPSBmaW5kX25hbWUobmFtZWxpbmUsIE5VTEwsIDAsIFRFUk1fU1BBQ0UgfCBURVJNX1RBQik7CisJaWYgKCFuYW1lKQorCQlyZXR1cm4gLTE7CisJY3AgPSBzdHJjaHIobmFtZSwgJy8nKTsKKwlpZiAoIWNwKQorCQl2YWwgPSAwOworCWVsc2UgaWYgKHByZWZpeCkgeworCQkvKgorCQkgKiBEb2VzIGl0IGJlZ2luIHdpdGggImEvJG91ci1wcmVmaXgiIGFuZCBzdWNoPyAgVGhlbiB0aGlzIGlzCisJCSAqIHZlcnkgbGlrZWx5IHRvIGFwcGx5IHRvIG91ciBkaXJlY3RvcnkuCisJCSAqLworCQlpZiAoIXN0cm5jbXAobmFtZSwgcHJlZml4LCBwcmVmaXhfbGVuZ3RoKSkKKwkJCXZhbCA9IGNvdW50X3NsYXNoZXMocHJlZml4KTsKKwkJZWxzZSB7CisJCQljcCsrOworCQkJaWYgKCFzdHJuY21wKGNwLCBwcmVmaXgsIHByZWZpeF9sZW5ndGgpKQorCQkJCXZhbCA9IGNvdW50X3NsYXNoZXMocHJlZml4KSArIDE7CisJCX0KKwl9CisJZnJlZShuYW1lKTsKKwlyZXR1cm4gdmFsOworfQorCisvKgorICogR2V0IHRoZSBuYW1lIGV0YyBpbmZvIGZyb20gdGhlIC0tLysrKyBsaW5lcyBvZiBhIHRyYWRpdGlvbmFsIHBhdGNoIGhlYWRlcgorICoKKyAqIEZJWE1FISBUaGUgZW5kLW9mLWZpbGVuYW1lIGhldXJpc3RpY3MgYXJlIGtpbmQgb2Ygc2NyZXd5LiBGb3IgZXhpc3RpbmcKKyAqIGZpbGVzLCB3ZSBjYW4gaGFwcGlseSBjaGVjayB0aGUgaW5kZXggZm9yIGEgbWF0Y2gsIGJ1dCBmb3IgY3JlYXRpbmcgYQorICogbmV3IGZpbGUgd2Ugc2hvdWxkIHRyeSB0byBtYXRjaCB3aGF0ZXZlciAicGF0Y2giIGRvZXMuIEkgaGF2ZSBubyBpZGVhLgorICovCitzdGF0aWMgdm9pZCBwYXJzZV90cmFkaXRpb25hbF9wYXRjaChjb25zdCBjaGFyICpmaXJzdCwgY29uc3QgY2hhciAqc2Vjb25kLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCWNoYXIgKm5hbWU7CisKKwlmaXJzdCArPSA0OwkvKiBza2lwICItLS0gIiAqLworCXNlY29uZCArPSA0OwkvKiBza2lwICIrKysgIiAqLworCWlmICghcF92YWx1ZV9rbm93bikgeworCQlpbnQgcCwgcTsKKwkJcCA9IGd1ZXNzX3BfdmFsdWUoZmlyc3QpOworCQlxID0gZ3Vlc3NfcF92YWx1ZShzZWNvbmQpOworCQlpZiAocCA8IDApIHAgPSBxOworCQlpZiAoMCA8PSBwICYmIHAgPT0gcSkgeworCQkJcF92YWx1ZSA9IHA7CisJCQlwX3ZhbHVlX2tub3duID0gMTsKKwkJfQorCX0KKwlpZiAoaXNfZGV2X251bGwoZmlyc3QpKSB7CisJCXBhdGNoLT5pc19uZXcgPSAxOworCQlwYXRjaC0+aXNfZGVsZXRlID0gMDsKKwkJbmFtZSA9IGZpbmRfbmFtZShzZWNvbmQsIE5VTEwsIHBfdmFsdWUsIFRFUk1fU1BBQ0UgfCBURVJNX1RBQik7CisJCXBhdGNoLT5uZXdfbmFtZSA9IG5hbWU7CisJfSBlbHNlIGlmIChpc19kZXZfbnVsbChzZWNvbmQpKSB7CisJCXBhdGNoLT5pc19uZXcgPSAwOworCQlwYXRjaC0+aXNfZGVsZXRlID0gMTsKKwkJbmFtZSA9IGZpbmRfbmFtZShmaXJzdCwgTlVMTCwgcF92YWx1ZSwgVEVSTV9TUEFDRSB8IFRFUk1fVEFCKTsKKwkJcGF0Y2gtPm9sZF9uYW1lID0gbmFtZTsKKwl9IGVsc2UgeworCQluYW1lID0gZmluZF9uYW1lKGZpcnN0LCBOVUxMLCBwX3ZhbHVlLCBURVJNX1NQQUNFIHwgVEVSTV9UQUIpOworCQluYW1lID0gZmluZF9uYW1lKHNlY29uZCwgbmFtZSwgcF92YWx1ZSwgVEVSTV9TUEFDRSB8IFRFUk1fVEFCKTsKKwkJcGF0Y2gtPm9sZF9uYW1lID0gcGF0Y2gtPm5ld19uYW1lID0gbmFtZTsKKwl9CisJaWYgKCFuYW1lKQorCQlkaWUoInVuYWJsZSB0byBmaW5kIGZpbGVuYW1lIGluIHBhdGNoIGF0IGxpbmUgJWQiLCBsaW5lbnIpOworfQorCitzdGF0aWMgaW50IGdpdGRpZmZfaGRyZW5kKGNvbnN0IGNoYXIgKmxpbmUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJcmV0dXJuIC0xOworfQorCisvKgorICogV2UncmUgYW5hbCBhYm91dCBkaWZmIGhlYWRlciBjb25zaXN0ZW5jeSwgdG8gbWFrZQorICogc3VyZSB0aGF0IHdlIGRvbid0IGVuZCB1cCBoYXZpbmcgc3RyYW5nZSBhbWJpZ3VvdXMKKyAqIHBhdGNoZXMgZmxvYXRpbmcgYXJvdW5kLgorICoKKyAqIEFzIGEgcmVzdWx0LCBnaXRkaWZmX3tvbGR8bmV3fW5hbWUoKSB3aWxsIGNoZWNrCisgKiB0aGVpciBuYW1lcyBhZ2FpbnN0IGFueSBwcmV2aW91cyBpbmZvcm1hdGlvbiwganVzdAorICogdG8gbWFrZSBzdXJlLi4KKyAqLworc3RhdGljIGNoYXIgKmdpdGRpZmZfdmVyaWZ5X25hbWUoY29uc3QgY2hhciAqbGluZSwgaW50IGlzbnVsbCwgY2hhciAqb3JpZ19uYW1lLCBjb25zdCBjaGFyICpvbGRuZXcpCit7CisJaWYgKCFvcmlnX25hbWUgJiYgIWlzbnVsbCkKKwkJcmV0dXJuIGZpbmRfbmFtZShsaW5lLCBOVUxMLCBwX3ZhbHVlLCBURVJNX1RBQik7CisKKwlpZiAob3JpZ19uYW1lKSB7CisJCWludCBsZW47CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJCWNoYXIgKmFub3RoZXI7CisJCW5hbWUgPSBvcmlnX25hbWU7CisJCWxlbiA9IHN0cmxlbihuYW1lKTsKKwkJaWYgKGlzbnVsbCkKKwkJCWRpZSgiZ2l0LWFwcGx5OiBiYWQgZ2l0LWRpZmYgLSBleHBlY3RlZCAvZGV2L251bGwsIGdvdCAlcyBvbiBsaW5lICVkIiwgbmFtZSwgbGluZW5yKTsKKwkJYW5vdGhlciA9IGZpbmRfbmFtZShsaW5lLCBOVUxMLCBwX3ZhbHVlLCBURVJNX1RBQik7CisJCWlmICghYW5vdGhlciB8fCBtZW1jbXAoYW5vdGhlciwgbmFtZSwgbGVuKSkKKwkJCWRpZSgiZ2l0LWFwcGx5OiBiYWQgZ2l0LWRpZmYgLSBpbmNvbnNpc3RlbnQgJXMgZmlsZW5hbWUgb24gbGluZSAlZCIsIG9sZG5ldywgbGluZW5yKTsKKwkJZnJlZShhbm90aGVyKTsKKwkJcmV0dXJuIG9yaWdfbmFtZTsKKwl9CisJZWxzZSB7CisJCS8qIGV4cGVjdCAiL2Rldi9udWxsIiAqLworCQlpZiAobWVtY21wKCIvZGV2L251bGwiLCBsaW5lLCA5KSB8fCBsaW5lWzldICE9ICdcbicpCisJCQlkaWUoImdpdC1hcHBseTogYmFkIGdpdC1kaWZmIC0gZXhwZWN0ZWQgL2Rldi9udWxsIG9uIGxpbmUgJWQiLCBsaW5lbnIpOworCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZ2l0ZGlmZl9vbGRuYW1lKGNvbnN0IGNoYXIgKmxpbmUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJcGF0Y2gtPm9sZF9uYW1lID0gZ2l0ZGlmZl92ZXJpZnlfbmFtZShsaW5lLCBwYXRjaC0+aXNfbmV3LCBwYXRjaC0+b2xkX25hbWUsICJvbGQiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnaXRkaWZmX25ld25hbWUoY29uc3QgY2hhciAqbGluZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlwYXRjaC0+bmV3X25hbWUgPSBnaXRkaWZmX3ZlcmlmeV9uYW1lKGxpbmUsIHBhdGNoLT5pc19kZWxldGUsIHBhdGNoLT5uZXdfbmFtZSwgIm5ldyIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdpdGRpZmZfb2xkbW9kZShjb25zdCBjaGFyICpsaW5lLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXBhdGNoLT5vbGRfbW9kZSA9IHN0cnRvdWwobGluZSwgTlVMTCwgOCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2l0ZGlmZl9uZXdtb2RlKGNvbnN0IGNoYXIgKmxpbmUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJcGF0Y2gtPm5ld19tb2RlID0gc3RydG91bChsaW5lLCBOVUxMLCA4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnaXRkaWZmX2RlbGV0ZShjb25zdCBjaGFyICpsaW5lLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXBhdGNoLT5pc19kZWxldGUgPSAxOworCXBhdGNoLT5vbGRfbmFtZSA9IHBhdGNoLT5kZWZfbmFtZTsKKwlyZXR1cm4gZ2l0ZGlmZl9vbGRtb2RlKGxpbmUsIHBhdGNoKTsKK30KKworc3RhdGljIGludCBnaXRkaWZmX25ld2ZpbGUoY29uc3QgY2hhciAqbGluZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlwYXRjaC0+aXNfbmV3ID0gMTsKKwlwYXRjaC0+bmV3X25hbWUgPSBwYXRjaC0+ZGVmX25hbWU7CisJcmV0dXJuIGdpdGRpZmZfbmV3bW9kZShsaW5lLCBwYXRjaCk7Cit9CisKK3N0YXRpYyBpbnQgZ2l0ZGlmZl9jb3B5c3JjKGNvbnN0IGNoYXIgKmxpbmUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJcGF0Y2gtPmlzX2NvcHkgPSAxOworCXBhdGNoLT5vbGRfbmFtZSA9IGZpbmRfbmFtZShsaW5lLCBOVUxMLCAwLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnaXRkaWZmX2NvcHlkc3QoY29uc3QgY2hhciAqbGluZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlwYXRjaC0+aXNfY29weSA9IDE7CisJcGF0Y2gtPm5ld19uYW1lID0gZmluZF9uYW1lKGxpbmUsIE5VTEwsIDAsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdpdGRpZmZfcmVuYW1lc3JjKGNvbnN0IGNoYXIgKmxpbmUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJcGF0Y2gtPmlzX3JlbmFtZSA9IDE7CisJcGF0Y2gtPm9sZF9uYW1lID0gZmluZF9uYW1lKGxpbmUsIE5VTEwsIDAsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdpdGRpZmZfcmVuYW1lZHN0KGNvbnN0IGNoYXIgKmxpbmUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJcGF0Y2gtPmlzX3JlbmFtZSA9IDE7CisJcGF0Y2gtPm5ld19uYW1lID0gZmluZF9uYW1lKGxpbmUsIE5VTEwsIDAsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdpdGRpZmZfc2ltaWxhcml0eShjb25zdCBjaGFyICpsaW5lLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCWlmICgocGF0Y2gtPnNjb3JlID0gc3RydG91bChsaW5lLCBOVUxMLCAxMCkpID09IFVMT05HX01BWCkKKwkJcGF0Y2gtPnNjb3JlID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnaXRkaWZmX2Rpc3NpbWlsYXJpdHkoY29uc3QgY2hhciAqbGluZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlpZiAoKHBhdGNoLT5zY29yZSA9IHN0cnRvdWwobGluZSwgTlVMTCwgMTApKSA9PSBVTE9OR19NQVgpCisJCXBhdGNoLT5zY29yZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2l0ZGlmZl9pbmRleChjb25zdCBjaGFyICpsaW5lLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCS8qCisJICogaW5kZXggbGluZSBpcyBOIGhleGFkZWNpbWFsLCAiLi4iLCBOIGhleGFkZWNpbWFsLAorCSAqIGFuZCBvcHRpb25hbCBzcGFjZSB3aXRoIG9jdGFsIG1vZGUuCisJICovCisJY29uc3QgY2hhciAqcHRyLCAqZW9sOworCWludCBsZW47CisKKwlwdHIgPSBzdHJjaHIobGluZSwgJy4nKTsKKwlpZiAoIXB0ciB8fCBwdHJbMV0gIT0gJy4nIHx8IDQwIDwgcHRyIC0gbGluZSkKKwkJcmV0dXJuIDA7CisJbGVuID0gcHRyIC0gbGluZTsKKwltZW1jcHkocGF0Y2gtPm9sZF9zaGExX3ByZWZpeCwgbGluZSwgbGVuKTsKKwlwYXRjaC0+b2xkX3NoYTFfcHJlZml4W2xlbl0gPSAwOworCisJbGluZSA9IHB0ciArIDI7CisJcHRyID0gc3RyY2hyKGxpbmUsICcgJyk7CisJZW9sID0gc3RyY2hyKGxpbmUsICdcbicpOworCisJaWYgKCFwdHIgfHwgZW9sIDwgcHRyKQorCQlwdHIgPSBlb2w7CisJbGVuID0gcHRyIC0gbGluZTsKKworCWlmICg0MCA8IGxlbikKKwkJcmV0dXJuIDA7CisJbWVtY3B5KHBhdGNoLT5uZXdfc2hhMV9wcmVmaXgsIGxpbmUsIGxlbik7CisJcGF0Y2gtPm5ld19zaGExX3ByZWZpeFtsZW5dID0gMDsKKwlpZiAoKnB0ciA9PSAnICcpCisJCXBhdGNoLT5uZXdfbW9kZSA9IHBhdGNoLT5vbGRfbW9kZSA9IHN0cnRvdWwocHRyKzEsIE5VTEwsIDgpOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBpcyBub3JtYWwgZm9yIGEgZGlmZiB0aGF0IGRvZXNuJ3QgY2hhbmdlIGFueXRoaW5nOiB3ZSdsbCBmYWxsIHRocm91Z2gKKyAqIGludG8gdGhlIG5leHQgZGlmZi4gVGVsbCB0aGUgcGFyc2VyIHRvIGJyZWFrIG91dC4KKyAqLworc3RhdGljIGludCBnaXRkaWZmX3VucmVjb2duaXplZChjb25zdCBjaGFyICpsaW5lLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXJldHVybiAtMTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnN0b3BfYXRfc2xhc2goY29uc3QgY2hhciAqbGluZSwgaW50IGxsZW4pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGxlbjsgaSsrKSB7CisJCWludCBjaCA9IGxpbmVbaV07CisJCWlmIChjaCA9PSAnLycpCisJCQlyZXR1cm4gbGluZSArIGk7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogVGhpcyBpcyB0byBleHRyYWN0IHRoZSBzYW1lIG5hbWUgdGhhdCBhcHBlYXJzIG9uICJkaWZmIC0tZ2l0IgorICogbGluZS4gIFdlIGRvIG5vdCBmaW5kIGFuZCByZXR1cm4gYW55dGhpbmcgaWYgaXQgaXMgYSByZW5hbWUKKyAqIHBhdGNoLCBhbmQgaXQgaXMgT0sgYmVjYXVzZSB3ZSB3aWxsIGZpbmQgdGhlIG5hbWUgZWxzZXdoZXJlLgorICogV2UgbmVlZCB0byByZWxpYWJseSBmaW5kIG5hbWUgb25seSB3aGVuIGl0IGlzIG1vZGUtY2hhbmdlIG9ubHksCisgKiBjcmVhdGlvbiBvciBkZWxldGlvbiBvZiBhbiBlbXB0eSBmaWxlLiAgSW4gYW55IG9mIHRoZXNlIGNhc2VzLAorICogYm90aCBzaWRlcyBhcmUgdGhlIHNhbWUgbmFtZSB1bmRlciBhLyBhbmQgYi8gcmVzcGVjdGl2ZWx5LgorICovCitzdGF0aWMgY2hhciAqZ2l0X2hlYWRlcl9uYW1lKGNoYXIgKmxpbmUsIGludCBsbGVuKQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqc2Vjb25kID0gTlVMTDsKKwlzaXplX3QgbGVuOworCisJbGluZSArPSBzdHJsZW4oImRpZmYgLS1naXQgIik7CisJbGxlbiAtPSBzdHJsZW4oImRpZmYgLS1naXQgIik7CisKKwlpZiAoKmxpbmUgPT0gJyInKSB7CisJCWNvbnN0IGNoYXIgKmNwOworCQlzdHJ1Y3Qgc3RyYnVmIGZpcnN0OworCQlzdHJ1Y3Qgc3RyYnVmIHNwOworCisJCXN0cmJ1Zl9pbml0KCZmaXJzdCwgMCk7CisJCXN0cmJ1Zl9pbml0KCZzcCwgMCk7CisKKwkJaWYgKHVucXVvdGVfY19zdHlsZSgmZmlyc3QsIGxpbmUsICZzZWNvbmQpKQorCQkJZ290byBmcmVlX2FuZF9mYWlsMTsKKworCQkvKiBhZHZhbmNlIHRvIHRoZSBmaXJzdCBzbGFzaCAqLworCQljcCA9IHN0b3BfYXRfc2xhc2goZmlyc3QuYnVmLCBmaXJzdC5sZW4pOworCQkvKiB3ZSBkbyBub3QgYWNjZXB0IGFic29sdXRlIHBhdGhzICovCisJCWlmICghY3AgfHwgY3AgPT0gZmlyc3QuYnVmKQorCQkJZ290byBmcmVlX2FuZF9mYWlsMTsKKwkJc3RyYnVmX3JlbW92ZSgmZmlyc3QsIDAsIGNwICsgMSAtIGZpcnN0LmJ1Zik7CisKKwkJLyoKKwkJICogc2Vjb25kIHBvaW50cyBhdCBvbmUgcGFzdCBjbG9zaW5nIGRxIG9mIG5hbWUuCisJCSAqIGZpbmQgdGhlIHNlY29uZCBuYW1lLgorCQkgKi8KKwkJd2hpbGUgKChzZWNvbmQgPCBsaW5lICsgbGxlbikgJiYgaXNzcGFjZSgqc2Vjb25kKSkKKwkJCXNlY29uZCsrOworCisJCWlmIChsaW5lICsgbGxlbiA8PSBzZWNvbmQpCisJCQlnb3RvIGZyZWVfYW5kX2ZhaWwxOworCQlpZiAoKnNlY29uZCA9PSAnIicpIHsKKwkJCWlmICh1bnF1b3RlX2Nfc3R5bGUoJnNwLCBzZWNvbmQsIE5VTEwpKQorCQkJCWdvdG8gZnJlZV9hbmRfZmFpbDE7CisJCQljcCA9IHN0b3BfYXRfc2xhc2goc3AuYnVmLCBzcC5sZW4pOworCQkJaWYgKCFjcCB8fCBjcCA9PSBzcC5idWYpCisJCQkJZ290byBmcmVlX2FuZF9mYWlsMTsKKwkJCS8qIFRoZXkgbXVzdCBtYXRjaCwgb3RoZXJ3aXNlIGlnbm9yZSAqLworCQkJaWYgKHN0cmNtcChjcCArIDEsIGZpcnN0LmJ1ZikpCisJCQkJZ290byBmcmVlX2FuZF9mYWlsMTsKKwkJCXN0cmJ1Zl9yZWxlYXNlKCZzcCk7CisJCQlyZXR1cm4gc3RyYnVmX2RldGFjaCgmZmlyc3QsIE5VTEwpOworCQl9CisKKwkJLyogdW5xdW90ZWQgc2Vjb25kICovCisJCWNwID0gc3RvcF9hdF9zbGFzaChzZWNvbmQsIGxpbmUgKyBsbGVuIC0gc2Vjb25kKTsKKwkJaWYgKCFjcCB8fCBjcCA9PSBzZWNvbmQpCisJCQlnb3RvIGZyZWVfYW5kX2ZhaWwxOworCQljcCsrOworCQlpZiAobGluZSArIGxsZW4gLSBjcCAhPSBmaXJzdC5sZW4gKyAxIHx8CisJCSAgICBtZW1jbXAoZmlyc3QuYnVmLCBjcCwgZmlyc3QubGVuKSkKKwkJCWdvdG8gZnJlZV9hbmRfZmFpbDE7CisJCXJldHVybiBzdHJidWZfZGV0YWNoKCZmaXJzdCwgTlVMTCk7CisKKwlmcmVlX2FuZF9mYWlsMToKKwkJc3RyYnVmX3JlbGVhc2UoJmZpcnN0KTsKKwkJc3RyYnVmX3JlbGVhc2UoJnNwKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogdW5xdW90ZWQgZmlyc3QgbmFtZSAqLworCW5hbWUgPSBzdG9wX2F0X3NsYXNoKGxpbmUsIGxsZW4pOworCWlmICghbmFtZSB8fCBuYW1lID09IGxpbmUpCisJCXJldHVybiBOVUxMOworCW5hbWUrKzsKKworCS8qCisJICogc2luY2UgdGhlIGZpcnN0IG5hbWUgaXMgdW5xdW90ZWQsIGEgZHEgaWYgZXhpc3RzIG11c3QgYmUKKwkgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWNvbmQgbmFtZS4KKwkgKi8KKwlmb3IgKHNlY29uZCA9IG5hbWU7IHNlY29uZCA8IGxpbmUgKyBsbGVuOyBzZWNvbmQrKykgeworCQlpZiAoKnNlY29uZCA9PSAnIicpIHsKKwkJCXN0cnVjdCBzdHJidWYgc3A7CisJCQljb25zdCBjaGFyICpucDsKKworCQkJc3RyYnVmX2luaXQoJnNwLCAwKTsKKwkJCWlmICh1bnF1b3RlX2Nfc3R5bGUoJnNwLCBzZWNvbmQsIE5VTEwpKQorCQkJCWdvdG8gZnJlZV9hbmRfZmFpbDI7CisKKwkJCW5wID0gc3RvcF9hdF9zbGFzaChzcC5idWYsIHNwLmxlbik7CisJCQlpZiAoIW5wIHx8IG5wID09IHNwLmJ1ZikKKwkJCQlnb3RvIGZyZWVfYW5kX2ZhaWwyOworCQkJbnArKzsKKworCQkJbGVuID0gc3AuYnVmICsgc3AubGVuIC0gbnA7CisJCQlpZiAobGVuIDwgc2Vjb25kIC0gbmFtZSAmJgorCQkJICAgICFzdHJuY21wKG5wLCBuYW1lLCBsZW4pICYmCisJCQkgICAgaXNzcGFjZShuYW1lW2xlbl0pKSB7CisJCQkJLyogR29vZCAqLworCQkJCXN0cmJ1Zl9yZW1vdmUoJnNwLCAwLCBucCAtIHNwLmJ1Zik7CisJCQkJcmV0dXJuIHN0cmJ1Zl9kZXRhY2goJnNwLCBOVUxMKTsKKwkJCX0KKworCQlmcmVlX2FuZF9mYWlsMjoKKwkJCXN0cmJ1Zl9yZWxlYXNlKCZzcCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCS8qCisJICogQWNjZXB0IGEgbmFtZSBvbmx5IGlmIGl0IHNob3dzIHVwIHR3aWNlLCBleGFjdGx5IHRoZSBzYW1lCisJICogZm9ybS4KKwkgKi8KKwlmb3IgKGxlbiA9IDAgOyA7IGxlbisrKSB7CisJCXN3aXRjaCAobmFtZVtsZW5dKSB7CisJCWRlZmF1bHQ6CisJCQljb250aW51ZTsKKwkJY2FzZSAnXG4nOgorCQkJcmV0dXJuIE5VTEw7CisJCWNhc2UgJ1x0JzogY2FzZSAnICc6CisJCQlzZWNvbmQgPSBuYW1lK2xlbjsKKwkJCWZvciAoOzspIHsKKwkJCQljaGFyIGMgPSAqc2Vjb25kKys7CisJCQkJaWYgKGMgPT0gJ1xuJykKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJaWYgKGMgPT0gJy8nKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzZWNvbmRbbGVuXSA9PSAnXG4nICYmICFtZW1jbXAobmFtZSwgc2Vjb25kLCBsZW4pKSB7CisJCQkJcmV0dXJuIHhtZW1kdXB6KG5hbWUsIGxlbik7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIFZlcmlmeSB0aGF0IHdlIHJlY29nbml6ZSB0aGUgbGluZXMgZm9sbG93aW5nIGEgZ2l0IGhlYWRlciAqLworc3RhdGljIGludCBwYXJzZV9naXRfaGVhZGVyKGNoYXIgKmxpbmUsIGludCBsZW4sIHVuc2lnbmVkIGludCBzaXplLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCisJLyogQSBnaXQgZGlmZiBoYXMgZXhwbGljaXQgbmV3L2RlbGV0ZSBpbmZvcm1hdGlvbiwgc28gd2UgZG9uJ3QgZ3Vlc3MgKi8KKwlwYXRjaC0+aXNfbmV3ID0gMDsKKwlwYXRjaC0+aXNfZGVsZXRlID0gMDsKKworCS8qCisJICogU29tZSB0aGluZ3MgbWF5IG5vdCBoYXZlIHRoZSBvbGQgbmFtZSBpbiB0aGUKKwkgKiByZXN0IG9mIHRoZSBoZWFkZXJzIGFueXdoZXJlIChwdXJlIG1vZGUgY2hhbmdlcywKKwkgKiBvciByZW1vdmluZyBvciBhZGRpbmcgZW1wdHkgZmlsZXMpLCBzbyB3ZSBnZXQKKwkgKiB0aGUgZGVmYXVsdCBuYW1lIGZyb20gdGhlIGhlYWRlci4KKwkgKi8KKwlwYXRjaC0+ZGVmX25hbWUgPSBnaXRfaGVhZGVyX25hbWUobGluZSwgbGVuKTsKKworCWxpbmUgKz0gbGVuOworCXNpemUgLT0gbGVuOworCWxpbmVucisrOworCWZvciAob2Zmc2V0ID0gbGVuIDsgc2l6ZSA+IDAgOyBvZmZzZXQgKz0gbGVuLCBzaXplIC09IGxlbiwgbGluZSArPSBsZW4sIGxpbmVucisrKSB7CisJCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3BlbnRyeSB7CisJCQljb25zdCBjaGFyICpzdHI7CisJCQlpbnQgKCpmbikoY29uc3QgY2hhciAqLCBzdHJ1Y3QgcGF0Y2ggKik7CisJCX0gb3B0YWJsZVtdID0geworCQkJeyAiQEAgLSIsIGdpdGRpZmZfaGRyZW5kIH0sCisJCQl7ICItLS0gIiwgZ2l0ZGlmZl9vbGRuYW1lIH0sCisJCQl7ICIrKysgIiwgZ2l0ZGlmZl9uZXduYW1lIH0sCisJCQl7ICJvbGQgbW9kZSAiLCBnaXRkaWZmX29sZG1vZGUgfSwKKwkJCXsgIm5ldyBtb2RlICIsIGdpdGRpZmZfbmV3bW9kZSB9LAorCQkJeyAiZGVsZXRlZCBmaWxlIG1vZGUgIiwgZ2l0ZGlmZl9kZWxldGUgfSwKKwkJCXsgIm5ldyBmaWxlIG1vZGUgIiwgZ2l0ZGlmZl9uZXdmaWxlIH0sCisJCQl7ICJjb3B5IGZyb20gIiwgZ2l0ZGlmZl9jb3B5c3JjIH0sCisJCQl7ICJjb3B5IHRvICIsIGdpdGRpZmZfY29weWRzdCB9LAorCQkJeyAicmVuYW1lIG9sZCAiLCBnaXRkaWZmX3JlbmFtZXNyYyB9LAorCQkJeyAicmVuYW1lIG5ldyAiLCBnaXRkaWZmX3JlbmFtZWRzdCB9LAorCQkJeyAicmVuYW1lIGZyb20gIiwgZ2l0ZGlmZl9yZW5hbWVzcmMgfSwKKwkJCXsgInJlbmFtZSB0byAiLCBnaXRkaWZmX3JlbmFtZWRzdCB9LAorCQkJeyAic2ltaWxhcml0eSBpbmRleCAiLCBnaXRkaWZmX3NpbWlsYXJpdHkgfSwKKwkJCXsgImRpc3NpbWlsYXJpdHkgaW5kZXggIiwgZ2l0ZGlmZl9kaXNzaW1pbGFyaXR5IH0sCisJCQl7ICJpbmRleCAiLCBnaXRkaWZmX2luZGV4IH0sCisJCQl7ICIiLCBnaXRkaWZmX3VucmVjb2duaXplZCB9LAorCQl9OworCQlpbnQgaTsKKworCQlsZW4gPSBsaW5lbGVuKGxpbmUsIHNpemUpOworCQlpZiAoIWxlbiB8fCBsaW5lW2xlbi0xXSAhPSAnXG4nKQorCQkJYnJlYWs7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9wdGFibGUpOyBpKyspIHsKKwkJCWNvbnN0IHN0cnVjdCBvcGVudHJ5ICpwID0gb3B0YWJsZSArIGk7CisJCQlpbnQgb3BsZW4gPSBzdHJsZW4ocC0+c3RyKTsKKwkJCWlmIChsZW4gPCBvcGxlbiB8fCBtZW1jbXAocC0+c3RyLCBsaW5lLCBvcGxlbikpCisJCQkJY29udGludWU7CisJCQlpZiAocC0+Zm4obGluZSArIG9wbGVuLCBwYXRjaCkgPCAwKQorCQkJCXJldHVybiBvZmZzZXQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfbnVtKGNvbnN0IGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxvbmcgKnApCit7CisJY2hhciAqcHRyOworCisJaWYgKCFpc2RpZ2l0KCpsaW5lKSkKKwkJcmV0dXJuIDA7CisJKnAgPSBzdHJ0b3VsKGxpbmUsICZwdHIsIDEwKTsKKwlyZXR1cm4gcHRyIC0gbGluZTsKK30KKworc3RhdGljIGludCBwYXJzZV9yYW5nZShjb25zdCBjaGFyICpsaW5lLCBpbnQgbGVuLCBpbnQgb2Zmc2V0LCBjb25zdCBjaGFyICpleHBlY3QsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICpwMSwgdW5zaWduZWQgbG9uZyAqcDIpCit7CisJaW50IGRpZ2l0cywgZXg7CisKKwlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gbGVuKQorCQlyZXR1cm4gLTE7CisJbGluZSArPSBvZmZzZXQ7CisJbGVuIC09IG9mZnNldDsKKworCWRpZ2l0cyA9IHBhcnNlX251bShsaW5lLCBwMSk7CisJaWYgKCFkaWdpdHMpCisJCXJldHVybiAtMTsKKworCW9mZnNldCArPSBkaWdpdHM7CisJbGluZSArPSBkaWdpdHM7CisJbGVuIC09IGRpZ2l0czsKKworCSpwMiA9IDE7CisJaWYgKCpsaW5lID09ICcsJykgeworCQlkaWdpdHMgPSBwYXJzZV9udW0obGluZSsxLCBwMik7CisJCWlmICghZGlnaXRzKQorCQkJcmV0dXJuIC0xOworCisJCW9mZnNldCArPSBkaWdpdHMrMTsKKwkJbGluZSArPSBkaWdpdHMrMTsKKwkJbGVuIC09IGRpZ2l0cysxOworCX0KKworCWV4ID0gc3RybGVuKGV4cGVjdCk7CisJaWYgKGV4ID4gbGVuKQorCQlyZXR1cm4gLTE7CisJaWYgKG1lbWNtcChsaW5lLCBleHBlY3QsIGV4KSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIG9mZnNldCArIGV4OworfQorCisvKgorICogUGFyc2UgYSB1bmlmaWVkIGRpZmYgZnJhZ21lbnQgaGVhZGVyIG9mIHRoZQorICogZm9ybSAiQEAgLWEsYiArYyxkIEBAIgorICovCitzdGF0aWMgaW50IHBhcnNlX2ZyYWdtZW50X2hlYWRlcihjaGFyICpsaW5lLCBpbnQgbGVuLCBzdHJ1Y3QgZnJhZ21lbnQgKmZyYWdtZW50KQoreworCWludCBvZmZzZXQ7CisKKwlpZiAoIWxlbiB8fCBsaW5lW2xlbi0xXSAhPSAnXG4nKQorCQlyZXR1cm4gLTE7CisKKwkvKiBGaWd1cmUgb3V0IHRoZSBudW1iZXIgb2YgbGluZXMgaW4gYSBmcmFnbWVudCAqLworCW9mZnNldCA9IHBhcnNlX3JhbmdlKGxpbmUsIGxlbiwgNCwgIiArIiwgJmZyYWdtZW50LT5vbGRwb3MsICZmcmFnbWVudC0+b2xkbGluZXMpOworCW9mZnNldCA9IHBhcnNlX3JhbmdlKGxpbmUsIGxlbiwgb2Zmc2V0LCAiIEBAIiwgJmZyYWdtZW50LT5uZXdwb3MsICZmcmFnbWVudC0+bmV3bGluZXMpOworCisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGludCBmaW5kX2hlYWRlcihjaGFyICpsaW5lLCB1bnNpZ25lZCBsb25nIHNpemUsIGludCAqaGRyc2l6ZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgbGVuOworCisJcGF0Y2gtPmlzX3RvcGxldmVsX3JlbGF0aXZlID0gMDsKKwlwYXRjaC0+aXNfcmVuYW1lID0gcGF0Y2gtPmlzX2NvcHkgPSAwOworCXBhdGNoLT5pc19uZXcgPSBwYXRjaC0+aXNfZGVsZXRlID0gLTE7CisJcGF0Y2gtPm9sZF9tb2RlID0gcGF0Y2gtPm5ld19tb2RlID0gMDsKKwlwYXRjaC0+b2xkX25hbWUgPSBwYXRjaC0+bmV3X25hbWUgPSBOVUxMOworCWZvciAob2Zmc2V0ID0gMDsgc2l6ZSA+IDA7IG9mZnNldCArPSBsZW4sIHNpemUgLT0gbGVuLCBsaW5lICs9IGxlbiwgbGluZW5yKyspIHsKKwkJdW5zaWduZWQgbG9uZyBuZXh0bGVuOworCisJCWxlbiA9IGxpbmVsZW4obGluZSwgc2l6ZSk7CisJCWlmICghbGVuKQorCQkJYnJlYWs7CisKKwkJLyogVGVzdGluZyB0aGlzIGVhcmx5IGFsbG93cyB1cyB0byB0YWtlIGEgZmV3IHNob3J0Y3V0cy4uICovCisJCWlmIChsZW4gPCA2KQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogTWFrZSBzdXJlIHdlIGRvbid0IGZpbmQgYW55IHVuY29ubmVjdGVkIHBhdGNoIGZyYWdtZW50cy4KKwkJICogVGhhdCdzIGEgc2lnbiB0aGF0IHdlIGRpZG4ndCBmaW5kIGEgaGVhZGVyLCBhbmQgdGhhdCBhCisJCSAqIHBhdGNoIGhhcyBiZWNvbWUgY29ycnVwdGVkL2Jyb2tlbiB1cC4KKwkJICovCisJCWlmICghbWVtY21wKCJAQCAtIiwgbGluZSwgNCkpIHsKKwkJCXN0cnVjdCBmcmFnbWVudCBkdW1teTsKKwkJCWlmIChwYXJzZV9mcmFnbWVudF9oZWFkZXIobGluZSwgbGVuLCAmZHVtbXkpIDwgMCkKKwkJCQljb250aW51ZTsKKwkJCWRpZSgicGF0Y2ggZnJhZ21lbnQgd2l0aG91dCBoZWFkZXIgYXQgbGluZSAlZDogJS4qcyIsCisJCQkgICAgbGluZW5yLCAoaW50KWxlbi0xLCBsaW5lKTsKKwkJfQorCisJCWlmIChzaXplIDwgbGVuICsgNikKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIEdpdCBwYXRjaD8gSXQgbWlnaHQgbm90IGhhdmUgYSByZWFsIHBhdGNoLCBqdXN0IGEgcmVuYW1lCisJCSAqIG9yIG1vZGUgY2hhbmdlLCBzbyB3ZSBoYW5kbGUgdGhhdCBzcGVjaWFsbHkKKwkJICovCisJCWlmICghbWVtY21wKCJkaWZmIC0tZ2l0ICIsIGxpbmUsIDExKSkgeworCQkJaW50IGdpdF9oZHJfbGVuID0gcGFyc2VfZ2l0X2hlYWRlcihsaW5lLCBsZW4sIHNpemUsIHBhdGNoKTsKKwkJCWlmIChnaXRfaGRyX2xlbiA8PSBsZW4pCisJCQkJY29udGludWU7CisJCQlpZiAoIXBhdGNoLT5vbGRfbmFtZSAmJiAhcGF0Y2gtPm5ld19uYW1lKSB7CisJCQkJaWYgKCFwYXRjaC0+ZGVmX25hbWUpCisJCQkJCWRpZSgiZ2l0IGRpZmYgaGVhZGVyIGxhY2tzIGZpbGVuYW1lIGluZm9ybWF0aW9uIChsaW5lICVkKSIsIGxpbmVucik7CisJCQkJcGF0Y2gtPm9sZF9uYW1lID0gcGF0Y2gtPm5ld19uYW1lID0gcGF0Y2gtPmRlZl9uYW1lOworCQkJfQorCQkJcGF0Y2gtPmlzX3RvcGxldmVsX3JlbGF0aXZlID0gMTsKKwkJCSpoZHJzaXplID0gZ2l0X2hkcl9sZW47CisJCQlyZXR1cm4gb2Zmc2V0OworCQl9CisKKwkJLyogLS0tIGZvbGxvd2VkIGJ5ICsrKyA/ICovCisJCWlmIChtZW1jbXAoIi0tLSAiLCBsaW5lLCAgNCkgfHwgbWVtY21wKCIrKysgIiwgbGluZSArIGxlbiwgNCkpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBXZSBvbmx5IGFjY2VwdCB1bmlmaWVkIHBhdGNoZXMsIHNvIHdlIHdhbnQgaXQgdG8KKwkJICogYXQgbGVhc3QgaGF2ZSAiQEAgLWEsYiArYyxkIEBAXG4iLCB3aGljaCBpcyAxNCBjaGFycworCQkgKiBtaW5pbXVtICgiQEAgLTAsMCArMSBAQFxuIiBpcyB0aGUgc2hvcnRlc3QpLgorCQkgKi8KKwkJbmV4dGxlbiA9IGxpbmVsZW4obGluZSArIGxlbiwgc2l6ZSAtIGxlbik7CisJCWlmIChzaXplIDwgbmV4dGxlbiArIDE0IHx8IG1lbWNtcCgiQEAgLSIsIGxpbmUgKyBsZW4gKyBuZXh0bGVuLCA0KSkKKwkJCWNvbnRpbnVlOworCisJCS8qIE9rLCB3ZSdsbCBjb25zaWRlciBpdCBhIHBhdGNoICovCisJCXBhcnNlX3RyYWRpdGlvbmFsX3BhdGNoKGxpbmUsIGxpbmUrbGVuLCBwYXRjaCk7CisJCSpoZHJzaXplID0gbGVuICsgbmV4dGxlbjsKKwkJbGluZW5yICs9IDI7CisJCXJldHVybiBvZmZzZXQ7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfd2hpdGVzcGFjZShjb25zdCBjaGFyICpsaW5lLCBpbnQgbGVuLCB1bnNpZ25lZCB3c19ydWxlKQoreworCWNoYXIgKmVycjsKKwl1bnNpZ25lZCByZXN1bHQgPSBjaGVja19hbmRfZW1pdF9saW5lKGxpbmUgKyAxLCBsZW4gLSAxLCB3c19ydWxlLAorCSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuOworCisJd2hpdGVzcGFjZV9lcnJvcisrOworCWlmIChzcXVlbGNoX3doaXRlc3BhY2VfZXJyb3JzICYmCisJICAgIHNxdWVsY2hfd2hpdGVzcGFjZV9lcnJvcnMgPCB3aGl0ZXNwYWNlX2Vycm9yKQorCQk7CisJZWxzZSB7CisJCWVyciA9IHdoaXRlc3BhY2VfZXJyb3Jfc3RyaW5nKHJlc3VsdCk7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6ICVzLlxuJS4qc1xuIiwKKwkJICAgICBwYXRjaF9pbnB1dF9maWxlLCBsaW5lbnIsIGVyciwgbGVuIC0gMiwgbGluZSArIDEpOworCQlmcmVlKGVycik7CisJfQorfQorCisvKgorICogUGFyc2UgYSB1bmlmaWVkIGRpZmYuIE5vdGUgdGhhdCB0aGlzIHJlYWxseSBuZWVkcyB0byBwYXJzZSBlYWNoCisgKiBmcmFnbWVudCBzZXBhcmF0ZWx5LCBzaW5jZSB0aGUgb25seSB3YXkgdG8ga25vdyB0aGUgZGlmZmVyZW5jZQorICogYmV0d2VlbiBhICItLS0iIHRoYXQgaXMgcGFydCBvZiBhIHBhdGNoLCBhbmQgYSAiLS0tIiB0aGF0IHN0YXJ0cworICogdGhlIG5leHQgcGF0Y2ggaXMgdG8gbG9vayBhdCB0aGUgbGluZSBjb3VudHMuLgorICovCitzdGF0aWMgaW50IHBhcnNlX2ZyYWdtZW50KGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCSAgc3RydWN0IHBhdGNoICpwYXRjaCwgc3RydWN0IGZyYWdtZW50ICpmcmFnbWVudCkKK3sKKwlpbnQgYWRkZWQsIGRlbGV0ZWQ7CisJaW50IGxlbiA9IGxpbmVsZW4obGluZSwgc2l6ZSksIG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIG9sZGxpbmVzLCBuZXdsaW5lczsKKwl1bnNpZ25lZCBsb25nIGxlYWRpbmcsIHRyYWlsaW5nOworCisJb2Zmc2V0ID0gcGFyc2VfZnJhZ21lbnRfaGVhZGVyKGxpbmUsIGxlbiwgZnJhZ21lbnQpOworCWlmIChvZmZzZXQgPCAwKQorCQlyZXR1cm4gLTE7CisJb2xkbGluZXMgPSBmcmFnbWVudC0+b2xkbGluZXM7CisJbmV3bGluZXMgPSBmcmFnbWVudC0+bmV3bGluZXM7CisJbGVhZGluZyA9IDA7CisJdHJhaWxpbmcgPSAwOworCisJLyogUGFyc2UgdGhlIHRoaW5nLi4gKi8KKwlsaW5lICs9IGxlbjsKKwlzaXplIC09IGxlbjsKKwlsaW5lbnIrKzsKKwlhZGRlZCA9IGRlbGV0ZWQgPSAwOworCWZvciAob2Zmc2V0ID0gbGVuOworCSAgICAgMCA8IHNpemU7CisJICAgICBvZmZzZXQgKz0gbGVuLCBzaXplIC09IGxlbiwgbGluZSArPSBsZW4sIGxpbmVucisrKSB7CisJCWlmICghb2xkbGluZXMgJiYgIW5ld2xpbmVzKQorCQkJYnJlYWs7CisJCWxlbiA9IGxpbmVsZW4obGluZSwgc2l6ZSk7CisJCWlmICghbGVuIHx8IGxpbmVbbGVuLTFdICE9ICdcbicpCisJCQlyZXR1cm4gLTE7CisJCXN3aXRjaCAoKmxpbmUpIHsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtMTsKKwkJY2FzZSAnXG4nOiAvKiBuZXdlciBHTlUgZGlmZiwgYW4gZW1wdHkgY29udGV4dCBsaW5lICovCisJCWNhc2UgJyAnOgorCQkJb2xkbGluZXMtLTsKKwkJCW5ld2xpbmVzLS07CisJCQlpZiAoIWRlbGV0ZWQgJiYgIWFkZGVkKQorCQkJCWxlYWRpbmcrKzsKKwkJCXRyYWlsaW5nKys7CisJCQlicmVhazsKKwkJY2FzZSAnLSc6CisJCQlpZiAoYXBwbHlfaW5fcmV2ZXJzZSAmJgorCQkJICAgIHdzX2Vycm9yX2FjdGlvbiAhPSBub3dhcm5fd3NfZXJyb3IpCisJCQkJY2hlY2tfd2hpdGVzcGFjZShsaW5lLCBsZW4sIHBhdGNoLT53c19ydWxlKTsKKwkJCWRlbGV0ZWQrKzsKKwkJCW9sZGxpbmVzLS07CisJCQl0cmFpbGluZyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAnKyc6CisJCQlpZiAoIWFwcGx5X2luX3JldmVyc2UgJiYKKwkJCSAgICB3c19lcnJvcl9hY3Rpb24gIT0gbm93YXJuX3dzX2Vycm9yKQorCQkJCWNoZWNrX3doaXRlc3BhY2UobGluZSwgbGVuLCBwYXRjaC0+d3NfcnVsZSk7CisJCQlhZGRlZCsrOworCQkJbmV3bGluZXMtLTsKKwkJCXRyYWlsaW5nID0gMDsKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIFdlIGFsbG93ICJcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUiLiBEZXBlbmRpbmcKKyAgICAgICAgICAgICAgICAgKiBvbiBsb2NhbGUgc2V0dGluZ3Mgd2hlbiB0aGUgcGF0Y2ggd2FzIHByb2R1Y2VkIHdlCisgICAgICAgICAgICAgICAgICogZG9uJ3Qga25vdyB3aGF0IHRoaXMgbGluZSBsb29rcyBsaWtlLiBUaGUgb25seQorICAgICAgICAgICAgICAgICAqIHRoaW5nIHdlIGRvIGtub3cgaXMgdGhhdCBpdCBiZWdpbnMgd2l0aCAiXCAiLgorCQkgKiBDaGVja2luZyBmb3IgMTIgaXMganVzdCBmb3Igc2FuaXR5IGNoZWNrIC0tIGFueQorCQkgKiBsMTBuIG9mICJcIE5vIG5ld2xpbmUuLi4iIGlzIGF0IGxlYXN0IHRoYXQgbG9uZy4KKwkJICovCisJCWNhc2UgJ1xcJzoKKwkJCWlmIChsZW4gPCAxMiB8fCBtZW1jbXAobGluZSwgIlxcICIsIDIpKQorCQkJCXJldHVybiAtMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChvbGRsaW5lcyB8fCBuZXdsaW5lcykKKwkJcmV0dXJuIC0xOworCWZyYWdtZW50LT5sZWFkaW5nID0gbGVhZGluZzsKKwlmcmFnbWVudC0+dHJhaWxpbmcgPSB0cmFpbGluZzsKKworCS8qCisJICogSWYgYSBmcmFnbWVudCBlbmRzIHdpdGggYW4gaW5jb21wbGV0ZSBsaW5lLCB3ZSBmYWlsZWQgdG8gaW5jbHVkZQorCSAqIGl0IGluIHRoZSBhYm92ZSBsb29wIGJlY2F1c2Ugd2UgaGl0IG9sZGxpbmVzID09IG5ld2xpbmVzID09IDAKKwkgKiBiZWZvcmUgc2VlaW5nIGl0LgorCSAqLworCWlmICgxMiA8IHNpemUgJiYgIW1lbWNtcChsaW5lLCAiXFwgIiwgMikpCisJCW9mZnNldCArPSBsaW5lbGVuKGxpbmUsIHNpemUpOworCisJcGF0Y2gtPmxpbmVzX2FkZGVkICs9IGFkZGVkOworCXBhdGNoLT5saW5lc19kZWxldGVkICs9IGRlbGV0ZWQ7CisKKwlpZiAoMCA8IHBhdGNoLT5pc19uZXcgJiYgb2xkbGluZXMpCisJCXJldHVybiBlcnJvcigibmV3IGZpbGUgZGVwZW5kcyBvbiBvbGQgY29udGVudHMiKTsKKwlpZiAoMCA8IHBhdGNoLT5pc19kZWxldGUgJiYgbmV3bGluZXMpCisJCXJldHVybiBlcnJvcigiZGVsZXRlZCBmaWxlIHN0aWxsIGhhcyBjb250ZW50cyIpOworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfc2luZ2xlX3BhdGNoKGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7CisJdW5zaWduZWQgbG9uZyBvbGRsaW5lcyA9IDAsIG5ld2xpbmVzID0gMCwgY29udGV4dCA9IDA7CisJc3RydWN0IGZyYWdtZW50ICoqZnJhZ3AgPSAmcGF0Y2gtPmZyYWdtZW50czsKKworCXdoaWxlIChzaXplID4gNCAmJiAhbWVtY21wKGxpbmUsICJAQCAtIiwgNCkpIHsKKwkJc3RydWN0IGZyYWdtZW50ICpmcmFnbWVudDsKKwkJaW50IGxlbjsKKworCQlmcmFnbWVudCA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpmcmFnbWVudCkpOworCQlsZW4gPSBwYXJzZV9mcmFnbWVudChsaW5lLCBzaXplLCBwYXRjaCwgZnJhZ21lbnQpOworCQlpZiAobGVuIDw9IDApCisJCQlkaWUoImNvcnJ1cHQgcGF0Y2ggYXQgbGluZSAlZCIsIGxpbmVucik7CisJCWZyYWdtZW50LT5wYXRjaCA9IGxpbmU7CisJCWZyYWdtZW50LT5zaXplID0gbGVuOworCQlvbGRsaW5lcyArPSBmcmFnbWVudC0+b2xkbGluZXM7CisJCW5ld2xpbmVzICs9IGZyYWdtZW50LT5uZXdsaW5lczsKKwkJY29udGV4dCArPSBmcmFnbWVudC0+bGVhZGluZyArIGZyYWdtZW50LT50cmFpbGluZzsKKworCQkqZnJhZ3AgPSBmcmFnbWVudDsKKwkJZnJhZ3AgPSAmZnJhZ21lbnQtPm5leHQ7CisKKwkJb2Zmc2V0ICs9IGxlbjsKKwkJbGluZSArPSBsZW47CisJCXNpemUgLT0gbGVuOworCX0KKworCS8qCisJICogSWYgc29tZXRoaW5nIHdhcyByZW1vdmVkIChpLmUuIHdlIGhhdmUgb2xkLWxpbmVzKSBpdCBjYW5ub3QKKwkgKiBiZSBjcmVhdGlvbiwgYW5kIGlmIHNvbWV0aGluZyB3YXMgYWRkZWQgaXQgY2Fubm90IGJlCisJICogZGVsZXRpb24uICBIb3dldmVyLCB0aGUgcmV2ZXJzZSBpcyBub3QgdHJ1ZTsgLS11bmlmaWVkPTAKKwkgKiBwYXRjaGVzIHRoYXQgb25seSBhZGQgYXJlIG5vdCBuZWNlc3NhcmlseSBjcmVhdGlvbiBldmVuCisJICogdGhvdWdoIHRoZXkgZG8gbm90IGhhdmUgYW55IG9sZCBsaW5lcywgYW5kIG9uZXMgdGhhdCBvbmx5CisJICogZGVsZXRlIGFyZSBub3QgbmVjZXNzYXJpbHkgZGVsZXRpb24uCisJICoKKwkgKiBVbmZvcnR1bmF0ZWx5LCBhIHJlYWwgY3JlYXRpb24vZGVsZXRpb24gcGF0Y2ggZG8gX25vdF8gaGF2ZQorCSAqIGFueSBjb250ZXh0IGxpbmUgYnkgZGVmaW5pdGlvbiwgc28gd2UgY2Fubm90IHNhZmVseSB0ZWxsIGl0CisJICogYXBhcnQgd2l0aCAtLXVuaWZpZWQ9MCBpbnNhbml0eS4gIEF0IGxlYXN0IGlmIHRoZSBwYXRjaCBoYXMKKwkgKiBtb3JlIHRoYW4gb25lIGh1bmsgaXQgaXMgbm90IGNyZWF0aW9uIG9yIGRlbGV0aW9uLgorCSAqLworCWlmIChwYXRjaC0+aXNfbmV3IDwgMCAmJgorCSAgICAob2xkbGluZXMgfHwgKHBhdGNoLT5mcmFnbWVudHMgJiYgcGF0Y2gtPmZyYWdtZW50cy0+bmV4dCkpKQorCQlwYXRjaC0+aXNfbmV3ID0gMDsKKwlpZiAocGF0Y2gtPmlzX2RlbGV0ZSA8IDAgJiYKKwkgICAgKG5ld2xpbmVzIHx8IChwYXRjaC0+ZnJhZ21lbnRzICYmIHBhdGNoLT5mcmFnbWVudHMtPm5leHQpKSkKKwkJcGF0Y2gtPmlzX2RlbGV0ZSA9IDA7CisJaWYgKCF1bmlkaWZmX3plcm8gfHwgY29udGV4dCkgeworCQkvKiBJZiB0aGUgdXNlciBzYXlzIHRoZSBwYXRjaCBpcyBub3QgZ2VuZXJhdGVkIHdpdGgKKwkJICogLS11bmlmaWVkPTAsIG9yIGlmIHdlIGhhdmUgc2VlbiBjb250ZXh0IGxpbmVzLAorCQkgKiB0aGVuIG5vdCBoYXZpbmcgb2xkbGluZXMgbWVhbnMgdGhlIHBhdGNoIGlzIGNyZWF0aW9uLAorCQkgKiBhbmQgbm90IGhhdmluZyBuZXdsaW5lcyBtZWFucyB0aGUgcGF0Y2ggaXMgZGVsZXRpb24uCisJCSAqLworCQlpZiAocGF0Y2gtPmlzX25ldyA8IDAgJiYgIW9sZGxpbmVzKSB7CisJCQlwYXRjaC0+aXNfbmV3ID0gMTsKKwkJCXBhdGNoLT5vbGRfbmFtZSA9IE5VTEw7CisJCX0KKwkJaWYgKHBhdGNoLT5pc19kZWxldGUgPCAwICYmICFuZXdsaW5lcykgeworCQkJcGF0Y2gtPmlzX2RlbGV0ZSA9IDE7CisJCQlwYXRjaC0+bmV3X25hbWUgPSBOVUxMOworCQl9CisJfQorCisJaWYgKDAgPCBwYXRjaC0+aXNfbmV3ICYmIG9sZGxpbmVzKQorCQlkaWUoIm5ldyBmaWxlICVzIGRlcGVuZHMgb24gb2xkIGNvbnRlbnRzIiwgcGF0Y2gtPm5ld19uYW1lKTsKKwlpZiAoMCA8IHBhdGNoLT5pc19kZWxldGUgJiYgbmV3bGluZXMpCisJCWRpZSgiZGVsZXRlZCBmaWxlICVzIHN0aWxsIGhhcyBjb250ZW50cyIsIHBhdGNoLT5vbGRfbmFtZSk7CisJaWYgKCFwYXRjaC0+aXNfZGVsZXRlICYmICFuZXdsaW5lcyAmJiBjb250ZXh0KQorCQlmcHJpbnRmKHN0ZGVyciwgIioqIHdhcm5pbmc6IGZpbGUgJXMgYmVjb21lcyBlbXB0eSBidXQgIgorCQkJImlzIG5vdCBkZWxldGVkXG4iLCBwYXRjaC0+bmV3X25hbWUpOworCisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbWV0YWRhdGFfY2hhbmdlcyhzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXJldHVybglwYXRjaC0+aXNfcmVuYW1lID4gMCB8fAorCQlwYXRjaC0+aXNfY29weSA+IDAgfHwKKwkJcGF0Y2gtPmlzX25ldyA+IDAgfHwKKwkJcGF0Y2gtPmlzX2RlbGV0ZSB8fAorCQkocGF0Y2gtPm9sZF9tb2RlICYmIHBhdGNoLT5uZXdfbW9kZSAmJgorCQkgcGF0Y2gtPm9sZF9tb2RlICE9IHBhdGNoLT5uZXdfbW9kZSk7Cit9CisKK3N0YXRpYyBjaGFyICppbmZsYXRlX2l0KGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCXVuc2lnbmVkIGxvbmcgaW5mbGF0ZWRfc2l6ZSkKK3sKKwl6X3N0cmVhbSBzdHJlYW07CisJdm9pZCAqb3V0OworCWludCBzdDsKKworCW1lbXNldCgmc3RyZWFtLCAwLCBzaXplb2Yoc3RyZWFtKSk7CisKKwlzdHJlYW0ubmV4dF9pbiA9ICh1bnNpZ25lZCBjaGFyICopZGF0YTsKKwlzdHJlYW0uYXZhaWxfaW4gPSBzaXplOworCXN0cmVhbS5uZXh0X291dCA9IG91dCA9IHhtYWxsb2MoaW5mbGF0ZWRfc2l6ZSk7CisJc3RyZWFtLmF2YWlsX291dCA9IGluZmxhdGVkX3NpemU7CisJaW5mbGF0ZUluaXQoJnN0cmVhbSk7CisJc3QgPSBpbmZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKwlpZiAoKHN0ICE9IFpfU1RSRUFNX0VORCkgfHwgc3RyZWFtLnRvdGFsX291dCAhPSBpbmZsYXRlZF9zaXplKSB7CisJCWZyZWUob3V0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBvdXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnJhZ21lbnQgKnBhcnNlX2JpbmFyeV9odW5rKGNoYXIgKipidWZfcCwKKwkJCQkJICB1bnNpZ25lZCBsb25nICpzel9wLAorCQkJCQkgIGludCAqc3RhdHVzX3AsCisJCQkJCSAgaW50ICp1c2VkX3ApCit7CisJLyoKKwkgKiBFeHBlY3QgYSBsaW5lIHRoYXQgYmVnaW5zIHdpdGggYmluYXJ5IHBhdGNoIG1ldGhvZCAoImxpdGVyYWwiCisJICogb3IgImRlbHRhIiksIGZvbGxvd2VkIGJ5IHRoZSBsZW5ndGggb2YgZGF0YSBiZWZvcmUgZGVmbGF0aW5nLgorCSAqIGEgc2VxdWVuY2Ugb2YgJ2xlbmd0aC1ieXRlJyBmb2xsb3dlZCBieSBiYXNlLTg1IGVuY29kZWQgZGF0YQorCSAqIHNob3VsZCBmb2xsb3csIHRlcm1pbmF0ZWQgYnkgYSBuZXdsaW5lLgorCSAqCisJICogRWFjaCA1LWJ5dGUgc2VxdWVuY2Ugb2YgYmFzZS04NSBlbmNvZGVzIHVwIHRvIDQgYnl0ZXMsCisJICogYW5kIHdlIHdvdWxkIGxpbWl0IHRoZSBwYXRjaCBsaW5lIHRvIDY2IGNoYXJhY3RlcnMsCisJICogc28gb25lIGxpbmUgY2FuIGZpdCB1cCB0byAxMyBncm91cHMgdGhhdCB3b3VsZCBkZWNvZGUKKwkgKiB0byA1MiBieXRlcyBtYXguICBUaGUgbGVuZ3RoIGJ5dGUgJ0EnLSdaJyBjb3JyZXNwb25kcworCSAqIHRvIDEtMjYgYnl0ZXMsIGFuZCAnYSctJ3onIGNvcnJlc3BvbmRzIHRvIDI3LTUyIGJ5dGVzLgorCSAqLworCWludCBsbGVuLCB1c2VkOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9ICpzel9wOworCWNoYXIgKmJ1ZmZlciA9ICpidWZfcDsKKwlpbnQgcGF0Y2hfbWV0aG9kOworCXVuc2lnbmVkIGxvbmcgb3JpZ2xlbjsKKwljaGFyICpkYXRhID0gTlVMTDsKKwlpbnQgaHVua19zaXplID0gMDsKKwlzdHJ1Y3QgZnJhZ21lbnQgKmZyYWc7CisKKwlsbGVuID0gbGluZWxlbihidWZmZXIsIHNpemUpOworCXVzZWQgPSBsbGVuOworCisJKnN0YXR1c19wID0gMDsKKworCWlmICghcHJlZml4Y21wKGJ1ZmZlciwgImRlbHRhICIpKSB7CisJCXBhdGNoX21ldGhvZCA9IEJJTkFSWV9ERUxUQV9ERUZMQVRFRDsKKwkJb3JpZ2xlbiA9IHN0cnRvdWwoYnVmZmVyICsgNiwgTlVMTCwgMTApOworCX0KKwllbHNlIGlmICghcHJlZml4Y21wKGJ1ZmZlciwgImxpdGVyYWwgIikpIHsKKwkJcGF0Y2hfbWV0aG9kID0gQklOQVJZX0xJVEVSQUxfREVGTEFURUQ7CisJCW9yaWdsZW4gPSBzdHJ0b3VsKGJ1ZmZlciArIDgsIE5VTEwsIDEwKTsKKwl9CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKKworCWxpbmVucisrOworCWJ1ZmZlciArPSBsbGVuOworCXdoaWxlICgxKSB7CisJCWludCBieXRlX2xlbmd0aCwgbWF4X2J5dGVfbGVuZ3RoLCBuZXdzaXplOworCQlsbGVuID0gbGluZWxlbihidWZmZXIsIHNpemUpOworCQl1c2VkICs9IGxsZW47CisJCWxpbmVucisrOworCQlpZiAobGxlbiA9PSAxKSB7CisJCQkvKiBjb25zdW1lIHRoZSBibGFuayBsaW5lICovCisJCQlidWZmZXIrKzsKKwkJCXNpemUtLTsKKwkJCWJyZWFrOworCQl9CisJCS8qCisJCSAqIE1pbmltdW0gbGluZSBpcyAiQTAwMDAwXG4iIHdoaWNoIGlzIDctYnl0ZSBsb25nLAorCQkgKiBhbmQgdGhlIGxpbmUgbGVuZ3RoIG11c3QgYmUgbXVsdGlwbGUgb2YgNSBwbHVzIDIuCisJCSAqLworCQlpZiAoKGxsZW4gPCA3KSB8fCAobGxlbi0yKSAlIDUpCisJCQlnb3RvIGNvcnJ1cHQ7CisJCW1heF9ieXRlX2xlbmd0aCA9IChsbGVuIC0gMikgLyA1ICogNDsKKwkJYnl0ZV9sZW5ndGggPSAqYnVmZmVyOworCQlpZiAoJ0EnIDw9IGJ5dGVfbGVuZ3RoICYmIGJ5dGVfbGVuZ3RoIDw9ICdaJykKKwkJCWJ5dGVfbGVuZ3RoID0gYnl0ZV9sZW5ndGggLSAnQScgKyAxOworCQllbHNlIGlmICgnYScgPD0gYnl0ZV9sZW5ndGggJiYgYnl0ZV9sZW5ndGggPD0gJ3onKQorCQkJYnl0ZV9sZW5ndGggPSBieXRlX2xlbmd0aCAtICdhJyArIDI3OworCQllbHNlCisJCQlnb3RvIGNvcnJ1cHQ7CisJCS8qIGlmIHRoZSBpbnB1dCBsZW5ndGggd2FzIG5vdCBtdWx0aXBsZSBvZiA0LCB3ZSB3b3VsZAorCQkgKiBoYXZlIGZpbGxlciBhdCB0aGUgZW5kIGJ1dCB0aGUgZmlsbGVyIHNob3VsZCBuZXZlcgorCQkgKiBleGNlZWQgMyBieXRlcworCQkgKi8KKwkJaWYgKG1heF9ieXRlX2xlbmd0aCA8IGJ5dGVfbGVuZ3RoIHx8CisJCSAgICBieXRlX2xlbmd0aCA8PSBtYXhfYnl0ZV9sZW5ndGggLSA0KQorCQkJZ290byBjb3JydXB0OworCQluZXdzaXplID0gaHVua19zaXplICsgYnl0ZV9sZW5ndGg7CisJCWRhdGEgPSB4cmVhbGxvYyhkYXRhLCBuZXdzaXplKTsKKwkJaWYgKGRlY29kZV84NShkYXRhICsgaHVua19zaXplLCBidWZmZXIgKyAxLCBieXRlX2xlbmd0aCkpCisJCQlnb3RvIGNvcnJ1cHQ7CisJCWh1bmtfc2l6ZSA9IG5ld3NpemU7CisJCWJ1ZmZlciArPSBsbGVuOworCQlzaXplIC09IGxsZW47CisJfQorCisJZnJhZyA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpmcmFnKSk7CisJZnJhZy0+cGF0Y2ggPSBpbmZsYXRlX2l0KGRhdGEsIGh1bmtfc2l6ZSwgb3JpZ2xlbik7CisJaWYgKCFmcmFnLT5wYXRjaCkKKwkJZ290byBjb3JydXB0OworCWZyZWUoZGF0YSk7CisJZnJhZy0+c2l6ZSA9IG9yaWdsZW47CisJKmJ1Zl9wID0gYnVmZmVyOworCSpzel9wID0gc2l6ZTsKKwkqdXNlZF9wID0gdXNlZDsKKwlmcmFnLT5iaW5hcnlfcGF0Y2hfbWV0aG9kID0gcGF0Y2hfbWV0aG9kOworCXJldHVybiBmcmFnOworCisgY29ycnVwdDoKKwlmcmVlKGRhdGEpOworCSpzdGF0dXNfcCA9IC0xOworCWVycm9yKCJjb3JydXB0IGJpbmFyeSBwYXRjaCBhdCBsaW5lICVkOiAlLipzIiwKKwkgICAgICBsaW5lbnItMSwgbGxlbi0xLCBidWZmZXIpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHBhcnNlX2JpbmFyeShjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwkvKgorCSAqIFdlIGhhdmUgcmVhZCAiR0lUIGJpbmFyeSBwYXRjaFxuIjsgd2hhdCBmb2xsb3dzIGlzIGEgbGluZQorCSAqIHRoYXQgc2F5cyB0aGUgcGF0Y2ggbWV0aG9kIChjdXJyZW50bHksIGVpdGhlciAibGl0ZXJhbCIgb3IKKwkgKiAiZGVsdGEiKSBhbmQgdGhlIGxlbmd0aCBvZiBkYXRhIGJlZm9yZSBkZWZsYXRpbmc7IGEKKwkgKiBzZXF1ZW5jZSBvZiAnbGVuZ3RoLWJ5dGUnIGZvbGxvd2VkIGJ5IGJhc2UtODUgZW5jb2RlZCBkYXRhCisJICogZm9sbG93cy4KKwkgKgorCSAqIFdoZW4gYSBiaW5hcnkgcGF0Y2ggaXMgcmV2ZXJzaWJsZSwgdGhlcmUgaXMgYW5vdGhlciBiaW5hcnkKKwkgKiBodW5rIGluIHRoZSBzYW1lIGZvcm1hdCwgc3RhcnRpbmcgd2l0aCBwYXRjaCBtZXRob2QgKGVpdGhlcgorCSAqICJsaXRlcmFsIiBvciAiZGVsdGEiKSB3aXRoIHRoZSBsZW5ndGggb2YgZGF0YSwgYW5kIGEgc2VxdWVuY2UKKwkgKiBvZiBsZW5ndGgtYnl0ZSArIGJhc2UtODUgZW5jb2RlZCBkYXRhLCB0ZXJtaW5hdGVkIHdpdGggYW5vdGhlcgorCSAqIGVtcHR5IGxpbmUuICBUaGlzIGRhdGEsIHdoZW4gYXBwbGllZCB0byB0aGUgcG9zdGltYWdlLCBwcm9kdWNlcworCSAqIHRoZSBwcmVpbWFnZS4KKwkgKi8KKwlzdHJ1Y3QgZnJhZ21lbnQgKmZvcndhcmQ7CisJc3RydWN0IGZyYWdtZW50ICpyZXZlcnNlOworCWludCBzdGF0dXM7CisJaW50IHVzZWQsIHVzZWRfMTsKKworCWZvcndhcmQgPSBwYXJzZV9iaW5hcnlfaHVuaygmYnVmZmVyLCAmc2l6ZSwgJnN0YXR1cywgJnVzZWQpOworCWlmICghZm9yd2FyZCAmJiAhc3RhdHVzKQorCQkvKiB0aGVyZSBoYXMgdG8gYmUgb25lIGh1bmsgKGZvcndhcmQgaHVuaykgKi8KKwkJcmV0dXJuIGVycm9yKCJ1bnJlY29nbml6ZWQgYmluYXJ5IHBhdGNoIGF0IGxpbmUgJWQiLCBsaW5lbnItMSk7CisJaWYgKHN0YXR1cykKKwkJLyogb3RoZXJ3aXNlIHdlIGFscmVhZHkgZ2F2ZSBhbiBlcnJvciBtZXNzYWdlICovCisJCXJldHVybiBzdGF0dXM7CisKKwlyZXZlcnNlID0gcGFyc2VfYmluYXJ5X2h1bmsoJmJ1ZmZlciwgJnNpemUsICZzdGF0dXMsICZ1c2VkXzEpOworCWlmIChyZXZlcnNlKQorCQl1c2VkICs9IHVzZWRfMTsKKwllbHNlIGlmIChzdGF0dXMpIHsKKwkJLyoKKwkJICogTm90IGhhdmluZyByZXZlcnNlIGh1bmsgaXMgbm90IGFuIGVycm9yLCBidXQgaGF2aW5nCisJCSAqIGEgY29ycnVwdCByZXZlcnNlIGh1bmsgaXMuCisJCSAqLworCQlmcmVlKCh2b2lkKikgZm9yd2FyZC0+cGF0Y2gpOworCQlmcmVlKGZvcndhcmQpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwlmb3J3YXJkLT5uZXh0ID0gcmV2ZXJzZTsKKwlwYXRjaC0+ZnJhZ21lbnRzID0gZm9yd2FyZDsKKwlwYXRjaC0+aXNfYmluYXJ5ID0gMTsKKwlyZXR1cm4gdXNlZDsKK30KKworc3RhdGljIGludCBwYXJzZV9jaHVuayhjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlpbnQgaGRyc2l6ZSwgcGF0Y2hzaXplOworCWludCBvZmZzZXQgPSBmaW5kX2hlYWRlcihidWZmZXIsIHNpemUsICZoZHJzaXplLCBwYXRjaCk7CisKKwlpZiAob2Zmc2V0IDwgMCkKKwkJcmV0dXJuIG9mZnNldDsKKworCXBhdGNoLT53c19ydWxlID0gd2hpdGVzcGFjZV9ydWxlKHBhdGNoLT5uZXdfbmFtZQorCQkJCQkgPyBwYXRjaC0+bmV3X25hbWUKKwkJCQkJIDogcGF0Y2gtPm9sZF9uYW1lKTsKKworCXBhdGNoc2l6ZSA9IHBhcnNlX3NpbmdsZV9wYXRjaChidWZmZXIgKyBvZmZzZXQgKyBoZHJzaXplLAorCQkJCSAgICAgICBzaXplIC0gb2Zmc2V0IC0gaGRyc2l6ZSwgcGF0Y2gpOworCisJaWYgKCFwYXRjaHNpemUpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmJpbmhkcltdID0geworCQkJIkJpbmFyeSBmaWxlcyAiLAorCQkJIkZpbGVzICIsCisJCQlOVUxMLAorCQl9OworCQlzdGF0aWMgY29uc3QgY2hhciBnaXRfYmluYXJ5W10gPSAiR0lUIGJpbmFyeSBwYXRjaFxuIjsKKwkJaW50IGk7CisJCWludCBoZCA9IGhkcnNpemUgKyBvZmZzZXQ7CisJCXVuc2lnbmVkIGxvbmcgbGxlbiA9IGxpbmVsZW4oYnVmZmVyICsgaGQsIHNpemUgLSBoZCk7CisKKwkJaWYgKGxsZW4gPT0gc2l6ZW9mKGdpdF9iaW5hcnkpIC0gMSAmJgorCQkgICAgIW1lbWNtcChnaXRfYmluYXJ5LCBidWZmZXIgKyBoZCwgbGxlbikpIHsKKwkJCWludCB1c2VkOworCQkJbGluZW5yKys7CisJCQl1c2VkID0gcGFyc2VfYmluYXJ5KGJ1ZmZlciArIGhkICsgbGxlbiwKKwkJCQkJICAgIHNpemUgLSBoZCAtIGxsZW4sIHBhdGNoKTsKKwkJCWlmICh1c2VkKQorCQkJCXBhdGNoc2l6ZSA9IHVzZWQgKyBsbGVuOworCQkJZWxzZQorCQkJCXBhdGNoc2l6ZSA9IDA7CisJCX0KKwkJZWxzZSBpZiAoIW1lbWNtcCgiIGRpZmZlclxuIiwgYnVmZmVyICsgaGQgKyBsbGVuIC0gOCwgOCkpIHsKKwkJCWZvciAoaSA9IDA7IGJpbmhkcltpXTsgaSsrKSB7CisJCQkJaW50IGxlbiA9IHN0cmxlbihiaW5oZHJbaV0pOworCQkJCWlmIChsZW4gPCBzaXplIC0gaGQgJiYKKwkJCQkgICAgIW1lbWNtcChiaW5oZHJbaV0sIGJ1ZmZlciArIGhkLCBsZW4pKSB7CisJCQkJCWxpbmVucisrOworCQkJCQlwYXRjaC0+aXNfYmluYXJ5ID0gMTsKKwkJCQkJcGF0Y2hzaXplID0gbGxlbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyogRW1wdHkgcGF0Y2ggY2Fubm90IGJlIGFwcGxpZWQgaWYgaXQgaXMgYSB0ZXh0IHBhdGNoCisJCSAqIHdpdGhvdXQgbWV0YWRhdGEgY2hhbmdlLiAgQSBiaW5hcnkgcGF0Y2ggYXBwZWFycworCQkgKiBlbXB0eSB0byB1cyBoZXJlLgorCQkgKi8KKwkJaWYgKChhcHBseSB8fCBjaGVjaykgJiYKKwkJICAgICghcGF0Y2gtPmlzX2JpbmFyeSAmJiAhbWV0YWRhdGFfY2hhbmdlcyhwYXRjaCkpKQorCQkJZGllKCJwYXRjaCB3aXRoIG9ubHkgZ2FyYmFnZSBhdCBsaW5lICVkIiwgbGluZW5yKTsKKwl9CisKKwlyZXR1cm4gb2Zmc2V0ICsgaGRyc2l6ZSArIHBhdGNoc2l6ZTsKK30KKworI2RlZmluZSBzd2FwKGEsYikgbXlzd2FwKChhKSwoYiksc2l6ZW9mKGEpKQorCisjZGVmaW5lIG15c3dhcChhLCBiLCBzaXplKSBkbyB7CQlcCisJdW5zaWduZWQgY2hhciBteXRtcFtzaXplXTsJXAorCW1lbWNweShteXRtcCwgJmEsIHNpemUpOwkJXAorCW1lbWNweSgmYSwgJmIsIHNpemUpOwkJXAorCW1lbWNweSgmYiwgbXl0bXAsIHNpemUpOwkJXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgcmV2ZXJzZV9wYXRjaGVzKHN0cnVjdCBwYXRjaCAqcCkKK3sKKwlmb3IgKDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJc3RydWN0IGZyYWdtZW50ICpmcmFnID0gcC0+ZnJhZ21lbnRzOworCisJCXN3YXAocC0+bmV3X25hbWUsIHAtPm9sZF9uYW1lKTsKKwkJc3dhcChwLT5uZXdfbW9kZSwgcC0+b2xkX21vZGUpOworCQlzd2FwKHAtPmlzX25ldywgcC0+aXNfZGVsZXRlKTsKKwkJc3dhcChwLT5saW5lc19hZGRlZCwgcC0+bGluZXNfZGVsZXRlZCk7CisJCXN3YXAocC0+b2xkX3NoYTFfcHJlZml4LCBwLT5uZXdfc2hhMV9wcmVmaXgpOworCisJCWZvciAoOyBmcmFnOyBmcmFnID0gZnJhZy0+bmV4dCkgeworCQkJc3dhcChmcmFnLT5uZXdwb3MsIGZyYWctPm9sZHBvcyk7CisJCQlzd2FwKGZyYWctPm5ld2xpbmVzLCBmcmFnLT5vbGRsaW5lcyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIHBsdXNlc1tdID0KKyIrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIjsKK3N0YXRpYyBjb25zdCBjaGFyIG1pbnVzZXNbXT0KKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIjsKKworc3RhdGljIHZvaWQgc2hvd19zdGF0cyhzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXN0cnVjdCBzdHJidWYgcW5hbWU7CisJY2hhciAqY3AgPSBwYXRjaC0+bmV3X25hbWUgPyBwYXRjaC0+bmV3X25hbWUgOiBwYXRjaC0+b2xkX25hbWU7CisJaW50IG1heCwgYWRkLCBkZWw7CisKKwlzdHJidWZfaW5pdCgmcW5hbWUsIDApOworCXF1b3RlX2Nfc3R5bGUoY3AsICZxbmFtZSwgTlVMTCwgMCk7CisKKwkvKgorCSAqICJzY2FsZSIgdGhlIGZpbGVuYW1lCisJICovCisJbWF4ID0gbWF4X2xlbjsKKwlpZiAobWF4ID4gNTApCisJCW1heCA9IDUwOworCisJaWYgKHFuYW1lLmxlbiA+IG1heCkgeworCQljcCA9IHN0cmNocihxbmFtZS5idWYgKyBxbmFtZS5sZW4gKyAzIC0gbWF4LCAnLycpOworCQlpZiAoIWNwKQorCQkJY3AgPSBxbmFtZS5idWYgKyBxbmFtZS5sZW4gKyAzIC0gbWF4OworCQlzdHJidWZfc3BsaWNlKCZxbmFtZSwgMCwgY3AgLSBxbmFtZS5idWYsICIuLi4iLCAzKTsKKwl9CisKKwlpZiAocGF0Y2gtPmlzX2JpbmFyeSkgeworCQlwcmludGYoIiAlLSpzIHwgIEJpblxuIiwgbWF4LCBxbmFtZS5idWYpOworCQlzdHJidWZfcmVsZWFzZSgmcW5hbWUpOworCQlyZXR1cm47CisJfQorCisJcHJpbnRmKCIgJS0qcyB8IiwgbWF4LCBxbmFtZS5idWYpOworCXN0cmJ1Zl9yZWxlYXNlKCZxbmFtZSk7CisKKwkvKgorCSAqIHNjYWxlIHRoZSBhZGQvZGVsZXRlCisJICovCisJbWF4ID0gbWF4ICsgbWF4X2NoYW5nZSA+IDcwID8gNzAgLSBtYXggOiBtYXhfY2hhbmdlOworCWFkZCA9IHBhdGNoLT5saW5lc19hZGRlZDsKKwlkZWwgPSBwYXRjaC0+bGluZXNfZGVsZXRlZDsKKworCWlmIChtYXhfY2hhbmdlID4gMCkgeworCQlpbnQgdG90YWwgPSAoKGFkZCArIGRlbCkgKiBtYXggKyBtYXhfY2hhbmdlIC8gMikgLyBtYXhfY2hhbmdlOworCQlhZGQgPSAoYWRkICogbWF4ICsgbWF4X2NoYW5nZSAvIDIpIC8gbWF4X2NoYW5nZTsKKwkJZGVsID0gdG90YWwgLSBhZGQ7CisJfQorCXByaW50ZigiJTVkICUuKnMlLipzXG4iLCBwYXRjaC0+bGluZXNfYWRkZWQgKyBwYXRjaC0+bGluZXNfZGVsZXRlZCwKKwkJYWRkLCBwbHVzZXMsIGRlbCwgbWludXNlcyk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9vbGRfZGF0YShzdHJ1Y3Qgc3RhdCAqc3QsIGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBzdHJidWYgKmJ1ZikKK3sKKwlzd2l0Y2ggKHN0LT5zdF9tb2RlICYgU19JRk1UKSB7CisJY2FzZSBTX0lGTE5LOgorCQlzdHJidWZfZ3JvdyhidWYsIHN0LT5zdF9zaXplKTsKKwkJaWYgKHJlYWRsaW5rKHBhdGgsIGJ1Zi0+YnVmLCBzdC0+c3Rfc2l6ZSkgIT0gc3QtPnN0X3NpemUpCisJCQlyZXR1cm4gLTE7CisJCXN0cmJ1Zl9zZXRsZW4oYnVmLCBzdC0+c3Rfc2l6ZSk7CisJCXJldHVybiAwOworCWNhc2UgU19JRlJFRzoKKwkJaWYgKHN0cmJ1Zl9yZWFkX2ZpbGUoYnVmLCBwYXRoLCBzdC0+c3Rfc2l6ZSkgIT0gc3QtPnN0X3NpemUpCisJCQlyZXR1cm4gZXJyb3IoInVuYWJsZSB0byBvcGVuIG9yIHJlYWQgJXMiLCBwYXRoKTsKKwkJY29udmVydF90b19naXQocGF0aCwgYnVmLT5idWYsIGJ1Zi0+bGVuLCBidWYsIDApOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfcHJlX3Bvc3RfaW1hZ2VzKHN0cnVjdCBpbWFnZSAqcHJlaW1hZ2UsCisJCQkJICAgc3RydWN0IGltYWdlICpwb3N0aW1hZ2UsCisJCQkJICAgY2hhciAqYnVmLAorCQkJCSAgIHNpemVfdCBsZW4pCit7CisJaW50IGksIGN0eDsKKwljaGFyICpuZXcsICpvbGQsICpmaXhlZDsKKwlzdHJ1Y3QgaW1hZ2UgZml4ZWRfcHJlaW1hZ2U7CisKKwkvKgorCSAqIFVwZGF0ZSB0aGUgcHJlaW1hZ2Ugd2l0aCB3aGl0ZXNwYWNlIGZpeGVzLiAgTm90ZSB0aGF0IHdlCisJICogYXJlIG5vdCBsb3NpbmcgcHJlaW1hZ2UtPmJ1ZiAtLSBhcHBseV9vbmVfZnJhZ21lbnQoKSB3aWxsCisJICogZnJlZSAib2xkbGluZXMiLgorCSAqLworCXByZXBhcmVfaW1hZ2UoJmZpeGVkX3ByZWltYWdlLCBidWYsIGxlbiwgMSk7CisJYXNzZXJ0KGZpeGVkX3ByZWltYWdlLm5yID09IHByZWltYWdlLT5ucik7CisJZm9yIChpID0gMDsgaSA8IHByZWltYWdlLT5ucjsgaSsrKQorCQlmaXhlZF9wcmVpbWFnZS5saW5lW2ldLmZsYWcgPSBwcmVpbWFnZS0+bGluZVtpXS5mbGFnOworCWZyZWUocHJlaW1hZ2UtPmxpbmVfYWxsb2NhdGVkKTsKKwkqcHJlaW1hZ2UgPSBmaXhlZF9wcmVpbWFnZTsKKworCS8qCisJICogQWRqdXN0IHRoZSBjb21tb24gY29udGV4dCBsaW5lcyBpbiBwb3N0aW1hZ2UsIGluIHBsYWNlLgorCSAqIFRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSB3aGl0ZXNwYWNlIGZpeGluZyBkb2VzIG5vdCBtYWtlCisJICogdGhlIHN0cmluZyBncm93LgorCSAqLworCW5ldyA9IG9sZCA9IHBvc3RpbWFnZS0+YnVmOworCWZpeGVkID0gcHJlaW1hZ2UtPmJ1ZjsKKwlmb3IgKGkgPSBjdHggPSAwOyBpIDwgcG9zdGltYWdlLT5ucjsgaSsrKSB7CisJCXNpemVfdCBsZW4gPSBwb3N0aW1hZ2UtPmxpbmVbaV0ubGVuOworCQlpZiAoIShwb3N0aW1hZ2UtPmxpbmVbaV0uZmxhZyAmIExJTkVfQ09NTU9OKSkgeworCQkJLyogYW4gYWRkZWQgbGluZSAtLSBubyBjb3VudGVycGFydHMgaW4gcHJlaW1hZ2UgKi8KKwkJCW1lbW1vdmUobmV3LCBvbGQsIGxlbik7CisJCQlvbGQgKz0gbGVuOworCQkJbmV3ICs9IGxlbjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogYSBjb21tb24gY29udGV4dCAtLSBza2lwIGl0IGluIHRoZSBvcmlnaW5hbCBwb3N0aW1hZ2UgKi8KKwkJb2xkICs9IGxlbjsKKworCQkvKiBhbmQgZmluZCB0aGUgY29ycmVzcG9uZGluZyBvbmUgaW4gdGhlIGZpeGVkIHByZWltYWdlICovCisJCXdoaWxlIChjdHggPCBwcmVpbWFnZS0+bnIgJiYKKwkJICAgICAgICEocHJlaW1hZ2UtPmxpbmVbY3R4XS5mbGFnICYgTElORV9DT01NT04pKSB7CisJCQlmaXhlZCArPSBwcmVpbWFnZS0+bGluZVtjdHhdLmxlbjsKKwkJCWN0eCsrOworCQl9CisJCWlmIChwcmVpbWFnZS0+bnIgPD0gY3R4KQorCQkJZGllKCJvb3BzIik7CisKKwkJLyogYW5kIGNvcHkgaXQgaW4sIHdoaWxlIGZpeGluZyB0aGUgbGluZSBsZW5ndGggKi8KKwkJbGVuID0gcHJlaW1hZ2UtPmxpbmVbY3R4XS5sZW47CisJCW1lbWNweShuZXcsIGZpeGVkLCBsZW4pOworCQluZXcgKz0gbGVuOworCQlmaXhlZCArPSBsZW47CisJCXBvc3RpbWFnZS0+bGluZVtpXS5sZW4gPSBsZW47CisJCWN0eCsrOworCX0KKworCS8qIEZpeCB0aGUgbGVuZ3RoIG9mIHRoZSB3aG9sZSB0aGluZyAqLworCXBvc3RpbWFnZS0+bGVuID0gbmV3IC0gcG9zdGltYWdlLT5idWY7Cit9CisKK3N0YXRpYyBpbnQgbWF0Y2hfZnJhZ21lbnQoc3RydWN0IGltYWdlICppbWcsCisJCQkgIHN0cnVjdCBpbWFnZSAqcHJlaW1hZ2UsCisJCQkgIHN0cnVjdCBpbWFnZSAqcG9zdGltYWdlLAorCQkJICB1bnNpZ25lZCBsb25nIHRyeSwKKwkJCSAgaW50IHRyeV9sbm8sCisJCQkgIHVuc2lnbmVkIHdzX3J1bGUsCisJCQkgIGludCBtYXRjaF9iZWdpbm5pbmcsIGludCBtYXRjaF9lbmQpCit7CisJaW50IGk7CisJY2hhciAqZml4ZWRfYnVmLCAqYnVmLCAqb3JpZywgKnRhcmdldDsKKworCWlmIChwcmVpbWFnZS0+bnIgKyB0cnlfbG5vID4gaW1nLT5ucikKKwkJcmV0dXJuIDA7CisKKwlpZiAobWF0Y2hfYmVnaW5uaW5nICYmIHRyeV9sbm8pCisJCXJldHVybiAwOworCisJaWYgKG1hdGNoX2VuZCAmJiBwcmVpbWFnZS0+bnIgKyB0cnlfbG5vICE9IGltZy0+bnIpCisJCXJldHVybiAwOworCisJLyogUXVpY2sgaGFzaCBjaGVjayAqLworCWZvciAoaSA9IDA7IGkgPCBwcmVpbWFnZS0+bnI7IGkrKykKKwkJaWYgKHByZWltYWdlLT5saW5lW2ldLmhhc2ggIT0gaW1nLT5saW5lW3RyeV9sbm8gKyBpXS5oYXNoKQorCQkJcmV0dXJuIDA7CisKKwkvKgorCSAqIERvIHdlIGhhdmUgYW4gZXhhY3QgbWF0Y2g/ICBJZiB3ZSB3ZXJlIHRvbGQgdG8gbWF0Y2gKKwkgKiBhdCB0aGUgZW5kLCBzaXplIG11c3QgYmUgZXhhY3RseSBhdCB0cnkrZnJhZ3NpemUsCisJICogb3RoZXJ3aXNlIHRyeStmcmFnc2l6ZSBtdXN0IGJlIHN0aWxsIHdpdGhpbiB0aGUgcHJlaW1hZ2UsCisJICogYW5kIGVpdGhlciBjYXNlLCB0aGUgb2xkIHBpZWNlIHNob3VsZCBtYXRjaCB0aGUgcHJlaW1hZ2UKKwkgKiBleGFjdGx5LgorCSAqLworCWlmICgobWF0Y2hfZW5kCisJICAgICA/ICh0cnkgKyBwcmVpbWFnZS0+bGVuID09IGltZy0+bGVuKQorCSAgICAgOiAodHJ5ICsgcHJlaW1hZ2UtPmxlbiA8PSBpbWctPmxlbikpICYmCisJICAgICFtZW1jbXAoaW1nLT5idWYgKyB0cnksIHByZWltYWdlLT5idWYsIHByZWltYWdlLT5sZW4pKQorCQlyZXR1cm4gMTsKKworCWlmICh3c19lcnJvcl9hY3Rpb24gIT0gY29ycmVjdF93c19lcnJvcikKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFRoZSBodW5rIGRvZXMgbm90IGFwcGx5IGJ5dGUtYnktYnl0ZSwgYnV0IHRoZSBoYXNoIHNheXMKKwkgKiBpdCBtaWdodCB3aXRoIHdoaXRlc3BhY2UgZnV6ei4KKwkgKi8KKwlmaXhlZF9idWYgPSB4bWFsbG9jKHByZWltYWdlLT5sZW4gKyAxKTsKKwlidWYgPSBmaXhlZF9idWY7CisJb3JpZyA9IHByZWltYWdlLT5idWY7CisJdGFyZ2V0ID0gaW1nLT5idWYgKyB0cnk7CisJZm9yIChpID0gMDsgaSA8IHByZWltYWdlLT5ucjsgaSsrKSB7CisJCXNpemVfdCBmaXhsZW47IC8qIGxlbmd0aCBhZnRlciBmaXhpbmcgdGhlIHByZWltYWdlICovCisJCXNpemVfdCBvbGRsZW4gPSBwcmVpbWFnZS0+bGluZVtpXS5sZW47CisJCXNpemVfdCB0Z3RsZW4gPSBpbWctPmxpbmVbdHJ5X2xubyArIGldLmxlbjsKKwkJc2l6ZV90IHRndGZpeGxlbjsgLyogbGVuZ3RoIGFmdGVyIGZpeGluZyB0aGUgdGFyZ2V0IGxpbmUgKi8KKwkJY2hhciB0Z3RmaXhidWZbMTAyNF0sICp0Z3RmaXg7CisJCWludCBtYXRjaDsKKworCQkvKiBUcnkgZml4aW5nIHRoZSBsaW5lIGluIHRoZSBwcmVpbWFnZSAqLworCQlmaXhsZW4gPSB3c19maXhfY29weShidWYsIG9yaWcsIG9sZGxlbiwgd3NfcnVsZSwgTlVMTCk7CisKKwkJLyogVHJ5IGZpeGluZyB0aGUgbGluZSBpbiB0aGUgdGFyZ2V0ICovCisJCWlmIChzaXplb2YodGd0Zml4YnVmKSA8IHRndGxlbikKKwkJCXRndGZpeCA9IHRndGZpeGJ1ZjsKKwkJZWxzZQorCQkJdGd0Zml4ID0geG1hbGxvYyh0Z3RsZW4pOworCQl0Z3RmaXhsZW4gPSB3c19maXhfY29weSh0Z3RmaXgsIHRhcmdldCwgdGd0bGVuLCB3c19ydWxlLCBOVUxMKTsKKworCQkvKgorCQkgKiBJZiB0aGV5IG1hdGNoLCBlaXRoZXIgdGhlIHByZWltYWdlIHdhcyBiYXNlZCBvbgorCQkgKiBhIHZlcnNpb24gYmVmb3JlIG91ciB0cmVlIGZpeGVkIHdoaXRlc3BhY2UgYnJlYWthZ2UsCisJCSAqIG9yIHdlIGFyZSBsYWNraW5nIGEgd2hpdGVzcGFjZS1maXggcGF0Y2ggdGhlIHRyZWUKKwkJICogdGhlIHByZWltYWdlIHdhcyBiYXNlZCBvbiBhbHJlYWR5IGhhZCAoaS5lLiB0YXJnZXQKKwkJICogaGFzIHdoaXRlc3BhY2UgYnJlYWthZ2UsIHRoZSBwcmVpbWFnZSBkb2Vzbid0KS4KKwkJICogSW4gZWl0aGVyIGNhc2UsIHdlIGFyZSBmaXhpbmcgdGhlIHdoaXRlc3BhY2UgYnJlYWthZ2VzCisJCSAqIHNvIHdlIG1pZ2h0IGFzIHdlbGwgdGFrZSB0aGUgZml4IHRvZ2V0aGVyIHdpdGggdGhlaXIKKwkJICogcmVhbCBjaGFuZ2UuCisJCSAqLworCQltYXRjaCA9ICh0Z3RmaXhsZW4gPT0gZml4bGVuICYmICFtZW1jbXAodGd0Zml4LCBidWYsIGZpeGxlbikpOworCisJCWlmICh0Z3RmaXggIT0gdGd0Zml4YnVmKQorCQkJZnJlZSh0Z3RmaXgpOworCQlpZiAoIW1hdGNoKQorCQkJZ290byB1bm1hdGNoX2V4aXQ7CisKKwkJb3JpZyArPSBvbGRsZW47CisJCWJ1ZiArPSBmaXhsZW47CisJCXRhcmdldCArPSB0Z3RsZW47CisJfQorCisJLyoKKwkgKiBZZXMsIHRoZSBwcmVpbWFnZSBpcyBiYXNlZCBvbiBhbiBvbGRlciB2ZXJzaW9uIHRoYXQgc3RpbGwKKwkgKiBoYXMgd2hpdGVzcGFjZSBicmVha2FnZXMgdW5maXhlZCwgYW5kIGZpeGluZyB0aGVtIG1ha2VzIHRoZQorCSAqIGh1bmsgbWF0Y2guICBVcGRhdGUgdGhlIGNvbnRleHQgbGluZXMgaW4gdGhlIHBvc3RpbWFnZS4KKwkgKi8KKwl1cGRhdGVfcHJlX3Bvc3RfaW1hZ2VzKHByZWltYWdlLCBwb3N0aW1hZ2UsCisJCQkgICAgICAgZml4ZWRfYnVmLCBidWYgLSBmaXhlZF9idWYpOworCXJldHVybiAxOworCisgdW5tYXRjaF9leGl0OgorCWZyZWUoZml4ZWRfYnVmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaW5kX3BvcyhzdHJ1Y3QgaW1hZ2UgKmltZywKKwkJICAgIHN0cnVjdCBpbWFnZSAqcHJlaW1hZ2UsCisJCSAgICBzdHJ1Y3QgaW1hZ2UgKnBvc3RpbWFnZSwKKwkJICAgIGludCBsaW5lLAorCQkgICAgdW5zaWduZWQgd3NfcnVsZSwKKwkJICAgIGludCBtYXRjaF9iZWdpbm5pbmcsIGludCBtYXRjaF9lbmQpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBiYWNrd2FyZHMsIGZvcndhcmRzLCB0cnk7CisJaW50IGJhY2t3YXJkc19sbm8sIGZvcndhcmRzX2xubywgdHJ5X2xubzsKKworCWlmIChwcmVpbWFnZS0+bnIgPiBpbWctPm5yKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIElmIG1hdGNoX2JlZ2luaW5nIG9yIG1hdGNoX2VuZCBpcyBzcGVjaWZpZWQsIHRoZXJlIGlzIG5vCisJICogcG9pbnQgc3RhcnRpbmcgZnJvbSBhIHdyb25nIGxpbmUgdGhhdCB3aWxsIG5ldmVyIG1hdGNoIGFuZAorCSAqIHdhbmRlciBhcm91bmQgYW5kIHdhaXQgZm9yIGEgbWF0Y2ggYXQgdGhlIHNwZWNpZmllZCBlbmQuCisJICovCisJaWYgKG1hdGNoX2JlZ2lubmluZykKKwkJbGluZSA9IDA7CisJZWxzZSBpZiAobWF0Y2hfZW5kKQorCQlsaW5lID0gaW1nLT5uciAtIHByZWltYWdlLT5ucjsKKworCWlmIChsaW5lID4gaW1nLT5ucikKKwkJbGluZSA9IGltZy0+bnI7CisKKwl0cnkgPSAwOworCWZvciAoaSA9IDA7IGkgPCBsaW5lOyBpKyspCisJCXRyeSArPSBpbWctPmxpbmVbaV0ubGVuOworCisJLyoKKwkgKiBUaGVyZSdzIHByb2JhYmx5IHNvbWUgc21hcnQgd2F5IHRvIGRvIHRoaXMsIGJ1dCBJJ2xsIGxlYXZlCisJICogdGhhdCB0byB0aGUgc21hcnQgYW5kIGJlYXV0aWZ1bCBwZW9wbGUuIEknbSBzaW1wbGUgYW5kIHN0dXBpZC4KKwkgKi8KKwliYWNrd2FyZHMgPSB0cnk7CisJYmFja3dhcmRzX2xubyA9IGxpbmU7CisJZm9yd2FyZHMgPSB0cnk7CisJZm9yd2FyZHNfbG5vID0gbGluZTsKKwl0cnlfbG5vID0gbGluZTsKKworCWZvciAoaSA9IDA7IDsgaSsrKSB7CisJCWlmIChtYXRjaF9mcmFnbWVudChpbWcsIHByZWltYWdlLCBwb3N0aW1hZ2UsCisJCQkJICAgdHJ5LCB0cnlfbG5vLCB3c19ydWxlLAorCQkJCSAgIG1hdGNoX2JlZ2lubmluZywgbWF0Y2hfZW5kKSkKKwkJCXJldHVybiB0cnlfbG5vOworCisJYWdhaW46CisJCWlmIChiYWNrd2FyZHNfbG5vID09IDAgJiYgZm9yd2FyZHNfbG5vID09IGltZy0+bnIpCisJCQlicmVhazsKKworCQlpZiAoaSAmIDEpIHsKKwkJCWlmIChiYWNrd2FyZHNfbG5vID09IDApIHsKKwkJCQlpKys7CisJCQkJZ290byBhZ2FpbjsKKwkJCX0KKwkJCWJhY2t3YXJkc19sbm8tLTsKKwkJCWJhY2t3YXJkcyAtPSBpbWctPmxpbmVbYmFja3dhcmRzX2xub10ubGVuOworCQkJdHJ5ID0gYmFja3dhcmRzOworCQkJdHJ5X2xubyA9IGJhY2t3YXJkc19sbm87CisJCX0gZWxzZSB7CisJCQlpZiAoZm9yd2FyZHNfbG5vID09IGltZy0+bnIpIHsKKwkJCQlpKys7CisJCQkJZ290byBhZ2FpbjsKKwkJCX0KKwkJCWZvcndhcmRzICs9IGltZy0+bGluZVtmb3J3YXJkc19sbm9dLmxlbjsKKwkJCWZvcndhcmRzX2xubysrOworCQkJdHJ5ID0gZm9yd2FyZHM7CisJCQl0cnlfbG5vID0gZm9yd2FyZHNfbG5vOworCQl9CisKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCByZW1vdmVfZmlyc3RfbGluZShzdHJ1Y3QgaW1hZ2UgKmltZykKK3sKKwlpbWctPmJ1ZiArPSBpbWctPmxpbmVbMF0ubGVuOworCWltZy0+bGVuIC09IGltZy0+bGluZVswXS5sZW47CisJaW1nLT5saW5lKys7CisJaW1nLT5uci0tOworfQorCitzdGF0aWMgdm9pZCByZW1vdmVfbGFzdF9saW5lKHN0cnVjdCBpbWFnZSAqaW1nKQoreworCWltZy0+bGVuIC09IGltZy0+bGluZVstLWltZy0+bnJdLmxlbjsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX2ltYWdlKHN0cnVjdCBpbWFnZSAqaW1nLAorCQkJIGludCBhcHBsaWVkX3BvcywKKwkJCSBzdHJ1Y3QgaW1hZ2UgKnByZWltYWdlLAorCQkJIHN0cnVjdCBpbWFnZSAqcG9zdGltYWdlKQoreworCS8qCisJICogcmVtb3ZlIHRoZSBjb3B5IG9mIHByZWltYWdlIGF0IG9mZnNldCBpbiBpbWcKKwkgKiBhbmQgcmVwbGFjZSBpdCB3aXRoIHBvc3RpbWFnZQorCSAqLworCWludCBpLCBucjsKKwlzaXplX3QgcmVtb3ZlX2NvdW50LCBpbnNlcnRfY291bnQsIGFwcGxpZWRfYXQgPSAwOworCWNoYXIgKnJlc3VsdDsKKworCWZvciAoaSA9IDA7IGkgPCBhcHBsaWVkX3BvczsgaSsrKQorCQlhcHBsaWVkX2F0ICs9IGltZy0+bGluZVtpXS5sZW47CisKKwlyZW1vdmVfY291bnQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBwcmVpbWFnZS0+bnI7IGkrKykKKwkJcmVtb3ZlX2NvdW50ICs9IGltZy0+bGluZVthcHBsaWVkX3BvcyArIGldLmxlbjsKKwlpbnNlcnRfY291bnQgPSBwb3N0aW1hZ2UtPmxlbjsKKworCS8qIEFkanVzdCB0aGUgY29udGVudHMgKi8KKwlyZXN1bHQgPSB4bWFsbG9jKGltZy0+bGVuICsgaW5zZXJ0X2NvdW50IC0gcmVtb3ZlX2NvdW50ICsgMSk7CisJbWVtY3B5KHJlc3VsdCwgaW1nLT5idWYsIGFwcGxpZWRfYXQpOworCW1lbWNweShyZXN1bHQgKyBhcHBsaWVkX2F0LCBwb3N0aW1hZ2UtPmJ1ZiwgcG9zdGltYWdlLT5sZW4pOworCW1lbWNweShyZXN1bHQgKyBhcHBsaWVkX2F0ICsgcG9zdGltYWdlLT5sZW4sCisJICAgICAgIGltZy0+YnVmICsgKGFwcGxpZWRfYXQgKyByZW1vdmVfY291bnQpLAorCSAgICAgICBpbWctPmxlbiAtIChhcHBsaWVkX2F0ICsgcmVtb3ZlX2NvdW50KSk7CisJZnJlZShpbWctPmJ1Zik7CisJaW1nLT5idWYgPSByZXN1bHQ7CisJaW1nLT5sZW4gKz0gaW5zZXJ0X2NvdW50IC0gcmVtb3ZlX2NvdW50OworCXJlc3VsdFtpbWctPmxlbl0gPSAnXDAnOworCisJLyogQWRqdXN0IHRoZSBsaW5lIHRhYmxlICovCisJbnIgPSBpbWctPm5yICsgcG9zdGltYWdlLT5uciAtIHByZWltYWdlLT5ucjsKKwlpZiAocHJlaW1hZ2UtPm5yIDwgcG9zdGltYWdlLT5ucikgeworCQkvKgorCQkgKiBOT1RFOiB0aGlzIGtub3dzIHRoYXQgd2UgbmV2ZXIgY2FsbCByZW1vdmVfZmlyc3RfbGluZSgpCisJCSAqIG9uIGFueXRoaW5nIG90aGVyIHRoYW4gcHJlL3Bvc3QgaW1hZ2UuCisJCSAqLworCQlpbWctPmxpbmUgPSB4cmVhbGxvYyhpbWctPmxpbmUsIG5yICogc2l6ZW9mKCppbWctPmxpbmUpKTsKKwkJaW1nLT5saW5lX2FsbG9jYXRlZCA9IGltZy0+bGluZTsKKwl9CisJaWYgKHByZWltYWdlLT5uciAhPSBwb3N0aW1hZ2UtPm5yKQorCQltZW1tb3ZlKGltZy0+bGluZSArIGFwcGxpZWRfcG9zICsgcG9zdGltYWdlLT5uciwKKwkJCWltZy0+bGluZSArIGFwcGxpZWRfcG9zICsgcHJlaW1hZ2UtPm5yLAorCQkJKGltZy0+bnIgLSAoYXBwbGllZF9wb3MgKyBwcmVpbWFnZS0+bnIpKSAqCisJCQlzaXplb2YoKmltZy0+bGluZSkpOworCW1lbWNweShpbWctPmxpbmUgKyBhcHBsaWVkX3BvcywKKwkgICAgICAgcG9zdGltYWdlLT5saW5lLAorCSAgICAgICBwb3N0aW1hZ2UtPm5yICogc2l6ZW9mKCppbWctPmxpbmUpKTsKKwlpbWctPm5yID0gbnI7Cit9CisKK3N0YXRpYyBpbnQgYXBwbHlfb25lX2ZyYWdtZW50KHN0cnVjdCBpbWFnZSAqaW1nLCBzdHJ1Y3QgZnJhZ21lbnQgKmZyYWcsCisJCQkgICAgICBpbnQgaW5hY2N1cmF0ZV9lb2YsIHVuc2lnbmVkIHdzX3J1bGUpCit7CisJaW50IG1hdGNoX2JlZ2lubmluZywgbWF0Y2hfZW5kOworCWNvbnN0IGNoYXIgKnBhdGNoID0gZnJhZy0+cGF0Y2g7CisJaW50IHNpemUgPSBmcmFnLT5zaXplOworCWNoYXIgKm9sZCwgKm5ldywgKm9sZGxpbmVzLCAqbmV3bGluZXM7CisJaW50IG5ld19ibGFua19saW5lc19hdF9lbmQgPSAwOworCXVuc2lnbmVkIGxvbmcgbGVhZGluZywgdHJhaWxpbmc7CisJaW50IHBvcywgYXBwbGllZF9wb3M7CisJc3RydWN0IGltYWdlIHByZWltYWdlOworCXN0cnVjdCBpbWFnZSBwb3N0aW1hZ2U7CisKKwltZW1zZXQoJnByZWltYWdlLCAwLCBzaXplb2YocHJlaW1hZ2UpKTsKKwltZW1zZXQoJnBvc3RpbWFnZSwgMCwgc2l6ZW9mKHBvc3RpbWFnZSkpOworCW9sZGxpbmVzID0geG1hbGxvYyhzaXplKTsKKwluZXdsaW5lcyA9IHhtYWxsb2Moc2l6ZSk7CisKKwlvbGQgPSBvbGRsaW5lczsKKwluZXcgPSBuZXdsaW5lczsKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJY2hhciBmaXJzdDsKKwkJaW50IGxlbiA9IGxpbmVsZW4ocGF0Y2gsIHNpemUpOworCQlpbnQgcGxlbiwgYWRkZWQ7CisJCWludCBhZGRlZF9ibGFua19saW5lID0gMDsKKworCQlpZiAoIWxlbikKKwkJCWJyZWFrOworCisJCS8qCisJCSAqICJwbGVuIiBpcyBob3cgbXVjaCBvZiB0aGUgbGluZSB3ZSBzaG91bGQgdXNlIGZvcgorCQkgKiB0aGUgYWN0dWFsIHBhdGNoIGRhdGEuIE5vcm1hbGx5IHdlIGp1c3QgcmVtb3ZlIHRoZQorCQkgKiBmaXJzdCBjaGFyYWN0ZXIgb24gdGhlIGxpbmUsIGJ1dCBpZiB0aGUgbGluZSBpcworCQkgKiBmb2xsb3dlZCBieSAiXCBObyBuZXdsaW5lIiwgdGhlbiB3ZSBhbHNvIHJlbW92ZSB0aGUKKwkJICogbGFzdCBvbmUgKHdoaWNoIGlzIHRoZSBuZXdsaW5lLCBvZiBjb3Vyc2UpLgorCQkgKi8KKwkJcGxlbiA9IGxlbiAtIDE7CisJCWlmIChsZW4gPCBzaXplICYmIHBhdGNoW2xlbl0gPT0gJ1xcJykKKwkJCXBsZW4tLTsKKwkJZmlyc3QgPSAqcGF0Y2g7CisJCWlmIChhcHBseV9pbl9yZXZlcnNlKSB7CisJCQlpZiAoZmlyc3QgPT0gJy0nKQorCQkJCWZpcnN0ID0gJysnOworCQkJZWxzZSBpZiAoZmlyc3QgPT0gJysnKQorCQkJCWZpcnN0ID0gJy0nOworCQl9CisKKwkJc3dpdGNoIChmaXJzdCkgeworCQljYXNlICdcbic6CisJCQkvKiBOZXdlciBHTlUgZGlmZiwgZW1wdHkgY29udGV4dCBsaW5lICovCisJCQlpZiAocGxlbiA8IDApCisJCQkJLyogLi4uIGZvbGxvd2VkIGJ5ICdcTm8gbmV3bGluZSc7IG5vdGhpbmcgKi8KKwkJCQlicmVhazsKKwkJCSpvbGQrKyA9ICdcbic7CisJCQkqbmV3KysgPSAnXG4nOworCQkJYWRkX2xpbmVfaW5mbygmcHJlaW1hZ2UsICJcbiIsIDEsIExJTkVfQ09NTU9OKTsKKwkJCWFkZF9saW5lX2luZm8oJnBvc3RpbWFnZSwgIlxuIiwgMSwgTElORV9DT01NT04pOworCQkJYnJlYWs7CisJCWNhc2UgJyAnOgorCQljYXNlICctJzoKKwkJCW1lbWNweShvbGQsIHBhdGNoICsgMSwgcGxlbik7CisJCQlhZGRfbGluZV9pbmZvKCZwcmVpbWFnZSwgb2xkLCBwbGVuLAorCQkJCSAgICAgIChmaXJzdCA9PSAnICcgPyBMSU5FX0NPTU1PTiA6IDApKTsKKwkJCW9sZCArPSBwbGVuOworCQkJaWYgKGZpcnN0ID09ICctJykKKwkJCQlicmVhazsKKwkJLyogRmFsbC10aHJvdWdoIGZvciAnICcgKi8KKwkJY2FzZSAnKyc6CisJCQkvKiAtLW5vLWFkZCBkb2VzIG5vdCBhZGQgbmV3IGxpbmVzICovCisJCQlpZiAoZmlyc3QgPT0gJysnICYmIG5vX2FkZCkKKwkJCQlicmVhazsKKworCQkJaWYgKGZpcnN0ICE9ICcrJyB8fAorCQkJICAgICF3aGl0ZXNwYWNlX2Vycm9yIHx8CisJCQkgICAgd3NfZXJyb3JfYWN0aW9uICE9IGNvcnJlY3Rfd3NfZXJyb3IpIHsKKwkJCQltZW1jcHkobmV3LCBwYXRjaCArIDEsIHBsZW4pOworCQkJCWFkZGVkID0gcGxlbjsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWFkZGVkID0gd3NfZml4X2NvcHkobmV3LCBwYXRjaCArIDEsIHBsZW4sIHdzX3J1bGUsICZhcHBsaWVkX2FmdGVyX2ZpeGluZ193cyk7CisJCQl9CisJCQlhZGRfbGluZV9pbmZvKCZwb3N0aW1hZ2UsIG5ldywgYWRkZWQsCisJCQkJICAgICAgKGZpcnN0ID09ICcrJyA/IDAgOiBMSU5FX0NPTU1PTikpOworCQkJbmV3ICs9IGFkZGVkOworCQkJaWYgKGZpcnN0ID09ICcrJyAmJgorCQkJICAgIGFkZGVkID09IDEgJiYgbmV3Wy0xXSA9PSAnXG4nKQorCQkJCWFkZGVkX2JsYW5rX2xpbmUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ0AnOiBjYXNlICdcXCc6CisJCQkvKiBJZ25vcmUgaXQsIHdlIGFscmVhZHkgaGFuZGxlZCBpdCAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoYXBwbHlfdmVyYm9zZWx5KQorCQkJCWVycm9yKCJpbnZhbGlkIHN0YXJ0IG9mIGxpbmU6ICclYyciLCBmaXJzdCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKGFkZGVkX2JsYW5rX2xpbmUpCisJCQluZXdfYmxhbmtfbGluZXNfYXRfZW5kKys7CisJCWVsc2UKKwkJCW5ld19ibGFua19saW5lc19hdF9lbmQgPSAwOworCQlwYXRjaCArPSBsZW47CisJCXNpemUgLT0gbGVuOworCX0KKwlpZiAoaW5hY2N1cmF0ZV9lb2YgJiYKKwkgICAgb2xkID4gb2xkbGluZXMgJiYgb2xkWy0xXSA9PSAnXG4nICYmCisJICAgIG5ldyA+IG5ld2xpbmVzICYmIG5ld1stMV0gPT0gJ1xuJykgeworCQlvbGQtLTsKKwkJbmV3LS07CisJfQorCisJbGVhZGluZyA9IGZyYWctPmxlYWRpbmc7CisJdHJhaWxpbmcgPSBmcmFnLT50cmFpbGluZzsKKworCS8qCisJICogQSBodW5rIHRvIGNoYW5nZSBsaW5lcyBhdCB0aGUgYmVnaW5uaW5nIHdvdWxkIGJlZ2luIHdpdGgKKwkgKiBAQCAtMSxMICtOLE0gQEAKKwkgKgorCSAqIEFuZCBhIGh1bmsgdG8gYWRkIHRvIGFuIGVtcHR5IGZpbGUgd291bGQgYmVnaW4gd2l0aAorCSAqIEBAIC0wLDAgK04sTSBAQAorCSAqCisJICogSW4gb3RoZXIgd29yZHMsIGEgaHVuayB0aGF0IGlzIChmcmFnLT5vbGRwb3MgPD0gMSkgd2l0aCBvcgorCSAqIHdpdGhvdXQgbGVhZGluZyBjb250ZXh0IG11c3QgbWF0Y2ggYXQgdGhlIGJlZ2lubmluZy4KKwkgKi8KKwltYXRjaF9iZWdpbm5pbmcgPSBmcmFnLT5vbGRwb3MgPD0gMTsKKworCS8qCisJICogQSBodW5rIHdpdGhvdXQgdHJhaWxpbmcgbGluZXMgbXVzdCBtYXRjaCBhdCB0aGUgZW5kLgorCSAqIEhvd2V2ZXIsIHdlIHNpbXBseSBjYW5ub3QgdGVsbCBpZiBhIGh1bmsgbXVzdCBtYXRjaCBlbmQKKwkgKiBmcm9tIHRoZSBsYWNrIG9mIHRyYWlsaW5nIGxpbmVzIGlmIHRoZSBwYXRjaCB3YXMgZ2VuZXJhdGVkCisJICogd2l0aCB1bmlkaWZmIHdpdGhvdXQgYW55IGNvbnRleHQuCisJICovCisJbWF0Y2hfZW5kID0gIXVuaWRpZmZfemVybyAmJiAhdHJhaWxpbmc7CisKKwlwb3MgPSBmcmFnLT5uZXdwb3MgPyAoZnJhZy0+bmV3cG9zIC0gMSkgOiAwOworCXByZWltYWdlLmJ1ZiA9IG9sZGxpbmVzOworCXByZWltYWdlLmxlbiA9IG9sZCAtIG9sZGxpbmVzOworCXBvc3RpbWFnZS5idWYgPSBuZXdsaW5lczsKKwlwb3N0aW1hZ2UubGVuID0gbmV3IC0gbmV3bGluZXM7CisJcHJlaW1hZ2UubGluZSA9IHByZWltYWdlLmxpbmVfYWxsb2NhdGVkOworCXBvc3RpbWFnZS5saW5lID0gcG9zdGltYWdlLmxpbmVfYWxsb2NhdGVkOworCisJZm9yICg7OykgeworCisJCWFwcGxpZWRfcG9zID0gZmluZF9wb3MoaW1nLCAmcHJlaW1hZ2UsICZwb3N0aW1hZ2UsIHBvcywKKwkJCQkgICAgICAgd3NfcnVsZSwgbWF0Y2hfYmVnaW5uaW5nLCBtYXRjaF9lbmQpOworCisJCWlmIChhcHBsaWVkX3BvcyA+PSAwKQorCQkJYnJlYWs7CisKKwkJLyogQW0gSSBhdCBteSBjb250ZXh0IGxpbWl0cz8gKi8KKwkJaWYgKChsZWFkaW5nIDw9IHBfY29udGV4dCkgJiYgKHRyYWlsaW5nIDw9IHBfY29udGV4dCkpCisJCQlicmVhazsKKwkJaWYgKG1hdGNoX2JlZ2lubmluZyB8fCBtYXRjaF9lbmQpIHsKKwkJCW1hdGNoX2JlZ2lubmluZyA9IG1hdGNoX2VuZCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIFJlZHVjZSB0aGUgbnVtYmVyIG9mIGNvbnRleHQgbGluZXM7IHJlZHVjZSBib3RoCisJCSAqIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGlmIHRoZXkgYXJlIGVxdWFsIG90aGVyd2lzZQorCQkgKiBqdXN0IHJlZHVjZSB0aGUgbGFyZ2VyIGNvbnRleHQuCisJCSAqLworCQlpZiAobGVhZGluZyA+PSB0cmFpbGluZykgeworCQkJcmVtb3ZlX2ZpcnN0X2xpbmUoJnByZWltYWdlKTsKKwkJCXJlbW92ZV9maXJzdF9saW5lKCZwb3N0aW1hZ2UpOworCQkJcG9zLS07CisJCQlsZWFkaW5nLS07CisJCX0KKwkJaWYgKHRyYWlsaW5nID4gbGVhZGluZykgeworCQkJcmVtb3ZlX2xhc3RfbGluZSgmcHJlaW1hZ2UpOworCQkJcmVtb3ZlX2xhc3RfbGluZSgmcG9zdGltYWdlKTsKKwkJCXRyYWlsaW5nLS07CisJCX0KKwl9CisKKwlpZiAoYXBwbGllZF9wb3MgPj0gMCkgeworCQlpZiAod3NfZXJyb3JfYWN0aW9uID09IGNvcnJlY3Rfd3NfZXJyb3IgJiYKKwkJICAgIG5ld19ibGFua19saW5lc19hdF9lbmQgJiYKKwkJICAgIHBvc3RpbWFnZS5uciArIGFwcGxpZWRfcG9zID09IGltZy0+bnIpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGUgcGF0Y2ggYXBwbGljYXRpb24gYWRkcyBibGFuayBsaW5lcworCQkJICogYXQgdGhlIGVuZCwgYW5kIGlmIHRoZSBwYXRjaCBhcHBsaWVzIGF0IHRoZQorCQkJICogZW5kIG9mIHRoZSBpbWFnZSwgcmVtb3ZlIHRob3NlIGFkZGVkIGJsYW5rCisJCQkgKiBsaW5lcy4KKwkJCSAqLworCQkJd2hpbGUgKG5ld19ibGFua19saW5lc19hdF9lbmQtLSkKKwkJCQlyZW1vdmVfbGFzdF9saW5lKCZwb3N0aW1hZ2UpOworCQl9CisKKwkJLyoKKwkJICogV2FybiBpZiBpdCB3YXMgbmVjZXNzYXJ5IHRvIHJlZHVjZSB0aGUgbnVtYmVyCisJCSAqIG9mIGNvbnRleHQgbGluZXMuCisJCSAqLworCQlpZiAoKGxlYWRpbmcgIT0gZnJhZy0+bGVhZGluZykgfHwKKwkJICAgICh0cmFpbGluZyAhPSBmcmFnLT50cmFpbGluZykpCisJCQlmcHJpbnRmKHN0ZGVyciwgIkNvbnRleHQgcmVkdWNlZCB0byAoJWxkLyVsZCkiCisJCQkJIiB0byBhcHBseSBmcmFnbWVudCBhdCAlZFxuIiwKKwkJCQlsZWFkaW5nLCB0cmFpbGluZywgYXBwbGllZF9wb3MrMSk7CisJCXVwZGF0ZV9pbWFnZShpbWcsIGFwcGxpZWRfcG9zLCAmcHJlaW1hZ2UsICZwb3N0aW1hZ2UpOworCX0gZWxzZSB7CisJCWlmIChhcHBseV92ZXJib3NlbHkpCisJCQllcnJvcigid2hpbGUgc2VhcmNoaW5nIGZvcjpcbiUuKnMiLAorCQkJICAgICAgKGludCkob2xkIC0gb2xkbGluZXMpLCBvbGRsaW5lcyk7CisJfQorCisJZnJlZShvbGRsaW5lcyk7CisJZnJlZShuZXdsaW5lcyk7CisJZnJlZShwcmVpbWFnZS5saW5lX2FsbG9jYXRlZCk7CisJZnJlZShwb3N0aW1hZ2UubGluZV9hbGxvY2F0ZWQpOworCisJcmV0dXJuIChhcHBsaWVkX3BvcyA8IDApOworfQorCitzdGF0aWMgaW50IGFwcGx5X2JpbmFyeV9mcmFnbWVudChzdHJ1Y3QgaW1hZ2UgKmltZywgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlzdHJ1Y3QgZnJhZ21lbnQgKmZyYWdtZW50ID0gcGF0Y2gtPmZyYWdtZW50czsKKwl1bnNpZ25lZCBsb25nIGxlbjsKKwl2b2lkICpkc3Q7CisKKwkvKiBCaW5hcnkgcGF0Y2ggaXMgaXJyZXZlcnNpYmxlIHdpdGhvdXQgdGhlIG9wdGlvbmFsIHNlY29uZCBodW5rICovCisJaWYgKGFwcGx5X2luX3JldmVyc2UpIHsKKwkJaWYgKCFmcmFnbWVudC0+bmV4dCkKKwkJCXJldHVybiBlcnJvcigiY2Fubm90IHJldmVyc2UtYXBwbHkgYSBiaW5hcnkgcGF0Y2ggIgorCQkJCSAgICAgIndpdGhvdXQgdGhlIHJldmVyc2UgaHVuayB0byAnJXMnIiwKKwkJCQkgICAgIHBhdGNoLT5uZXdfbmFtZQorCQkJCSAgICAgPyBwYXRjaC0+bmV3X25hbWUgOiBwYXRjaC0+b2xkX25hbWUpOworCQlmcmFnbWVudCA9IGZyYWdtZW50LT5uZXh0OworCX0KKwlzd2l0Y2ggKGZyYWdtZW50LT5iaW5hcnlfcGF0Y2hfbWV0aG9kKSB7CisJY2FzZSBCSU5BUllfREVMVEFfREVGTEFURUQ6CisJCWRzdCA9IHBhdGNoX2RlbHRhKGltZy0+YnVmLCBpbWctPmxlbiwgZnJhZ21lbnQtPnBhdGNoLAorCQkJCSAgZnJhZ21lbnQtPnNpemUsICZsZW4pOworCQlpZiAoIWRzdCkKKwkJCXJldHVybiAtMTsKKwkJY2xlYXJfaW1hZ2UoaW1nKTsKKwkJaW1nLT5idWYgPSBkc3Q7CisJCWltZy0+bGVuID0gbGVuOworCQlyZXR1cm4gMDsKKwljYXNlIEJJTkFSWV9MSVRFUkFMX0RFRkxBVEVEOgorCQljbGVhcl9pbWFnZShpbWcpOworCQlpbWctPmxlbiA9IGZyYWdtZW50LT5zaXplOworCQlpbWctPmJ1ZiA9IHhtYWxsb2MoaW1nLT5sZW4rMSk7CisJCW1lbWNweShpbWctPmJ1ZiwgZnJhZ21lbnQtPnBhdGNoLCBpbWctPmxlbik7CisJCWltZy0+YnVmW2ltZy0+bGVuXSA9ICdcMCc7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgYXBwbHlfYmluYXJ5KHN0cnVjdCBpbWFnZSAqaW1nLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBwYXRjaC0+b2xkX25hbWUgPyBwYXRjaC0+b2xkX25hbWUgOiBwYXRjaC0+bmV3X25hbWU7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKworCS8qCisJICogRm9yIHNhZmV0eSwgd2UgcmVxdWlyZSBwYXRjaCBpbmRleCBsaW5lIHRvIGNvbnRhaW4KKwkgKiBmdWxsIDQwLWJ5dGUgdGV4dHVhbCBTSEExIGZvciBvbGQgYW5kIG5ldywgYXQgbGVhc3QgZm9yIG5vdy4KKwkgKi8KKwlpZiAoc3RybGVuKHBhdGNoLT5vbGRfc2hhMV9wcmVmaXgpICE9IDQwIHx8CisJICAgIHN0cmxlbihwYXRjaC0+bmV3X3NoYTFfcHJlZml4KSAhPSA0MCB8fAorCSAgICBnZXRfc2hhMV9oZXgocGF0Y2gtPm9sZF9zaGExX3ByZWZpeCwgc2hhMSkgfHwKKwkgICAgZ2V0X3NoYTFfaGV4KHBhdGNoLT5uZXdfc2hhMV9wcmVmaXgsIHNoYTEpKQorCQlyZXR1cm4gZXJyb3IoImNhbm5vdCBhcHBseSBiaW5hcnkgcGF0Y2ggdG8gJyVzJyAiCisJCQkgICAgICJ3aXRob3V0IGZ1bGwgaW5kZXggbGluZSIsIG5hbWUpOworCisJaWYgKHBhdGNoLT5vbGRfbmFtZSkgeworCQkvKgorCQkgKiBTZWUgaWYgdGhlIG9sZCBvbmUgbWF0Y2hlcyB3aGF0IHRoZSBwYXRjaAorCQkgKiBhcHBsaWVzIHRvLgorCQkgKi8KKwkJaGFzaF9zaGExX2ZpbGUoaW1nLT5idWYsIGltZy0+bGVuLCBibG9iX3R5cGUsIHNoYTEpOworCQlpZiAoc3RyY21wKHNoYTFfdG9faGV4KHNoYTEpLCBwYXRjaC0+b2xkX3NoYTFfcHJlZml4KSkKKwkJCXJldHVybiBlcnJvcigidGhlIHBhdGNoIGFwcGxpZXMgdG8gJyVzJyAoJXMpLCAiCisJCQkJICAgICAid2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlICIKKwkJCQkgICAgICJjdXJyZW50IGNvbnRlbnRzLiIsCisJCQkJICAgICBuYW1lLCBzaGExX3RvX2hleChzaGExKSk7CisJfQorCWVsc2UgeworCQkvKiBPdGhlcndpc2UsIHRoZSBvbGQgb25lIG11c3QgYmUgZW1wdHkuICovCisJCWlmIChpbWctPmxlbikKKwkJCXJldHVybiBlcnJvcigidGhlIHBhdGNoIGFwcGxpZXMgdG8gYW4gZW1wdHkgIgorCQkJCSAgICAgIiclcycgYnV0IGl0IGlzIG5vdCBlbXB0eSIsIG5hbWUpOworCX0KKworCWdldF9zaGExX2hleChwYXRjaC0+bmV3X3NoYTFfcHJlZml4LCBzaGExKTsKKwlpZiAoaXNfbnVsbF9zaGExKHNoYTEpKSB7CisJCWNsZWFyX2ltYWdlKGltZyk7CisJCXJldHVybiAwOyAvKiBkZWxldGlvbiBwYXRjaCAqLworCX0KKworCWlmIChoYXNfc2hhMV9maWxlKHNoYTEpKSB7CisJCS8qIFdlIGFscmVhZHkgaGF2ZSB0aGUgcG9zdGltYWdlICovCisJCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwkJdW5zaWduZWQgbG9uZyBzaXplOworCQljaGFyICpyZXN1bHQ7CisKKwkJcmVzdWx0ID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgJnR5cGUsICZzaXplKTsKKwkJaWYgKCFyZXN1bHQpCisJCQlyZXR1cm4gZXJyb3IoInRoZSBuZWNlc3NhcnkgcG9zdGltYWdlICVzIGZvciAiCisJCQkJICAgICAiJyVzJyBjYW5ub3QgYmUgcmVhZCIsCisJCQkJICAgICBwYXRjaC0+bmV3X3NoYTFfcHJlZml4LCBuYW1lKTsKKwkJY2xlYXJfaW1hZ2UoaW1nKTsKKwkJaW1nLT5idWYgPSByZXN1bHQ7CisJCWltZy0+bGVuID0gc2l6ZTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBXZSBoYXZlIHZlcmlmaWVkIGJ1ZiBtYXRjaGVzIHRoZSBwcmVpbWFnZTsKKwkJICogYXBwbHkgdGhlIHBhdGNoIGRhdGEgdG8gaXQsIHdoaWNoIGlzIHN0b3JlZAorCQkgKiBpbiB0aGUgcGF0Y2gtPmZyYWdtZW50cy0+e3BhdGNoLHNpemV9LgorCQkgKi8KKwkJaWYgKGFwcGx5X2JpbmFyeV9mcmFnbWVudChpbWcsIHBhdGNoKSkKKwkJCXJldHVybiBlcnJvcigiYmluYXJ5IHBhdGNoIGRvZXMgbm90IGFwcGx5IHRvICclcyciLAorCQkJCSAgICAgbmFtZSk7CisKKwkJLyogdmVyaWZ5IHRoYXQgdGhlIHJlc3VsdCBtYXRjaGVzICovCisJCWhhc2hfc2hhMV9maWxlKGltZy0+YnVmLCBpbWctPmxlbiwgYmxvYl90eXBlLCBzaGExKTsKKwkJaWYgKHN0cmNtcChzaGExX3RvX2hleChzaGExKSwgcGF0Y2gtPm5ld19zaGExX3ByZWZpeCkpCisJCQlyZXR1cm4gZXJyb3IoImJpbmFyeSBwYXRjaCB0byAnJXMnIGNyZWF0ZXMgaW5jb3JyZWN0IHJlc3VsdCAoZXhwZWN0aW5nICVzLCBnb3QgJXMpIiwKKwkJCQluYW1lLCBwYXRjaC0+bmV3X3NoYTFfcHJlZml4LCBzaGExX3RvX2hleChzaGExKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXBwbHlfZnJhZ21lbnRzKHN0cnVjdCBpbWFnZSAqaW1nLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXN0cnVjdCBmcmFnbWVudCAqZnJhZyA9IHBhdGNoLT5mcmFnbWVudHM7CisJY29uc3QgY2hhciAqbmFtZSA9IHBhdGNoLT5vbGRfbmFtZSA/IHBhdGNoLT5vbGRfbmFtZSA6IHBhdGNoLT5uZXdfbmFtZTsKKwl1bnNpZ25lZCB3c19ydWxlID0gcGF0Y2gtPndzX3J1bGU7CisJdW5zaWduZWQgaW5hY2N1cmF0ZV9lb2YgPSBwYXRjaC0+aW5hY2N1cmF0ZV9lb2Y7CisKKwlpZiAocGF0Y2gtPmlzX2JpbmFyeSkKKwkJcmV0dXJuIGFwcGx5X2JpbmFyeShpbWcsIHBhdGNoKTsKKworCXdoaWxlIChmcmFnKSB7CisJCWlmIChhcHBseV9vbmVfZnJhZ21lbnQoaW1nLCBmcmFnLCBpbmFjY3VyYXRlX2VvZiwgd3NfcnVsZSkpIHsKKwkJCWVycm9yKCJwYXRjaCBmYWlsZWQ6ICVzOiVsZCIsIG5hbWUsIGZyYWctPm9sZHBvcyk7CisJCQlpZiAoIWFwcGx5X3dpdGhfcmVqZWN0KQorCQkJCXJldHVybiAtMTsKKwkJCWZyYWctPnJlamVjdGVkID0gMTsKKwkJfQorCQlmcmFnID0gZnJhZy0+bmV4dDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9maWxlX29yX2dpdGxpbmsoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgc3RydWN0IHN0cmJ1ZiAqYnVmKQoreworCWlmICghY2UpCisJCXJldHVybiAwOworCisJaWYgKFNfSVNHSVRMSU5LKGNlLT5jZV9tb2RlKSkgeworCQlzdHJidWZfZ3JvdyhidWYsIDEwMCk7CisJCXN0cmJ1Zl9hZGRmKGJ1ZiwgIlN1YnByb2plY3QgY29tbWl0ICVzXG4iLCBzaGExX3RvX2hleChjZS0+c2hhMSkpOworCX0gZWxzZSB7CisJCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwkJdW5zaWduZWQgbG9uZyBzejsKKwkJY2hhciAqcmVzdWx0OworCisJCXJlc3VsdCA9IHJlYWRfc2hhMV9maWxlKGNlLT5zaGExLCAmdHlwZSwgJnN6KTsKKwkJaWYgKCFyZXN1bHQpCisJCQlyZXR1cm4gLTE7CisJCS8qIFhYWCByZWFkX3NoYTFfZmlsZSBOVUwtdGVybWluYXRlcyAqLworCQlzdHJidWZfYXR0YWNoKGJ1ZiwgcmVzdWx0LCBzeiwgc3ogKyAxKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXBwbHlfZGF0YShzdHJ1Y3QgcGF0Y2ggKnBhdGNoLCBzdHJ1Y3Qgc3RhdCAqc3QsIHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UpCit7CisJc3RydWN0IHN0cmJ1ZiBidWY7CisJc3RydWN0IGltYWdlIGltYWdlOworCXNpemVfdCBsZW47CisJY2hhciAqaW1nOworCisJc3RyYnVmX2luaXQoJmJ1ZiwgMCk7CisJaWYgKGNhY2hlZCkgeworCQlpZiAocmVhZF9maWxlX29yX2dpdGxpbmsoY2UsICZidWYpKQorCQkJcmV0dXJuIGVycm9yKCJyZWFkIG9mICVzIGZhaWxlZCIsIHBhdGNoLT5vbGRfbmFtZSk7CisJfSBlbHNlIGlmIChwYXRjaC0+b2xkX25hbWUpIHsKKwkJaWYgKFNfSVNHSVRMSU5LKHBhdGNoLT5vbGRfbW9kZSkpIHsKKwkJCWlmIChjZSkgeworCQkJCXJlYWRfZmlsZV9vcl9naXRsaW5rKGNlLCAmYnVmKTsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBUaGVyZSBpcyBubyB3YXkgdG8gYXBwbHkgc3VicHJvamVjdAorCQkJCSAqIHBhdGNoIHdpdGhvdXQgbG9va2luZyBhdCB0aGUgaW5kZXguCisJCQkJICovCisJCQkJcGF0Y2gtPmZyYWdtZW50cyA9IE5VTEw7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAocmVhZF9vbGRfZGF0YShzdCwgcGF0Y2gtPm9sZF9uYW1lLCAmYnVmKSkKKwkJCQlyZXR1cm4gZXJyb3IoInJlYWQgb2YgJXMgZmFpbGVkIiwgcGF0Y2gtPm9sZF9uYW1lKTsKKwkJfQorCX0KKworCWltZyA9IHN0cmJ1Zl9kZXRhY2goJmJ1ZiwgJmxlbik7CisJcHJlcGFyZV9pbWFnZSgmaW1hZ2UsIGltZywgbGVuLCAhcGF0Y2gtPmlzX2JpbmFyeSk7CisKKwlpZiAoYXBwbHlfZnJhZ21lbnRzKCZpbWFnZSwgcGF0Y2gpIDwgMCkKKwkJcmV0dXJuIC0xOyAvKiBub3RlIHdpdGggLS1yZWplY3QgdGhpcyBzdWNjZWVkcy4gKi8KKwlwYXRjaC0+cmVzdWx0ID0gaW1hZ2UuYnVmOworCXBhdGNoLT5yZXN1bHRzaXplID0gaW1hZ2UubGVuOworCWZyZWUoaW1hZ2UubGluZV9hbGxvY2F0ZWQpOworCisJaWYgKDAgPCBwYXRjaC0+aXNfZGVsZXRlICYmIHBhdGNoLT5yZXN1bHRzaXplKQorCQlyZXR1cm4gZXJyb3IoInJlbW92YWwgcGF0Y2ggbGVhdmVzIGZpbGUgY29udGVudHMiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX3RvX2NyZWF0ZV9ibG9iKGNvbnN0IGNoYXIgKm5ld19uYW1lLCBpbnQgb2tfaWZfZXhpc3RzKQoreworCXN0cnVjdCBzdGF0IG5zdDsKKwlpZiAoIWxzdGF0KG5ld19uYW1lLCAmbnN0KSkgeworCQlpZiAoU19JU0RJUihuc3Quc3RfbW9kZSkgfHwgb2tfaWZfZXhpc3RzKQorCQkJcmV0dXJuIDA7CisJCS8qCisJCSAqIEEgbGVhZGluZyBjb21wb25lbnQgb2YgbmV3X25hbWUgbWlnaHQgYmUgYSBzeW1saW5rCisJCSAqIHRoYXQgaXMgZ29pbmcgdG8gYmUgcmVtb3ZlZCB3aXRoIHRoaXMgcGF0Y2gsIGJ1dAorCQkgKiBzdGlsbCBwb2ludGluZyBhdCBzb21ld2hlcmUgdGhhdCBoYXMgdGhlIHBhdGguCisJCSAqIEluIHN1Y2ggYSBjYXNlLCBwYXRoICJuZXdfbmFtZSIgZG9lcyBub3QgZXhpc3QgYXMKKwkJICogZmFyIGFzIGdpdCBpcyBjb25jZXJuZWQuCisJCSAqLworCQlpZiAoaGFzX3N5bWxpbmtfbGVhZGluZ19wYXRoKG5ld19uYW1lLCBOVUxMKSkKKwkJCXJldHVybiAwOworCisJCXJldHVybiBlcnJvcigiJXM6IGFscmVhZHkgZXhpc3RzIGluIHdvcmtpbmcgZGlyZWN0b3J5IiwgbmV3X25hbWUpOworCX0KKwllbHNlIGlmICgoZXJybm8gIT0gRU5PRU5UKSAmJiAoZXJybm8gIT0gRU5PVERJUikpCisJCXJldHVybiBlcnJvcigiJXM6ICVzIiwgbmV3X25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X2luZGV4X21hdGNoKHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIHN0cnVjdCBzdGF0ICpzdCkKK3sKKwlpZiAoU19JU0dJVExJTksoY2UtPmNlX21vZGUpKSB7CisJCWlmICghU19JU0RJUihzdC0+c3RfbW9kZSkpCisJCQlyZXR1cm4gLTE7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gY2VfbWF0Y2hfc3RhdChjZSwgc3QsIENFX01BVENIX0lHTk9SRV9WQUxJRCk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfcGF0Y2goc3RydWN0IHBhdGNoICpwYXRjaCwgc3RydWN0IHBhdGNoICpwcmV2X3BhdGNoKQoreworCXN0cnVjdCBzdGF0IHN0OworCWNvbnN0IGNoYXIgKm9sZF9uYW1lID0gcGF0Y2gtPm9sZF9uYW1lOworCWNvbnN0IGNoYXIgKm5ld19uYW1lID0gcGF0Y2gtPm5ld19uYW1lOworCWNvbnN0IGNoYXIgKm5hbWUgPSBvbGRfbmFtZSA/IG9sZF9uYW1lIDogbmV3X25hbWU7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IE5VTEw7CisJaW50IG9rX2lmX2V4aXN0czsKKworCXBhdGNoLT5yZWplY3RlZCA9IDE7IC8qIHdlIHdpbGwgZHJvcCB0aGlzIGFmdGVyIHdlIHN1Y2NlZWQgKi8KKworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90IGhhdmUgbG9jYWwgbW9kaWZpY2F0aW9ucyBmcm9tIHRoZQorCSAqIGluZGV4IHdoZW4gd2UgYXJlIGxvb2tpbmcgYXQgdGhlIGluZGV4LiAgQWxzbyBtYWtlIHN1cmUKKwkgKiB3ZSBoYXZlIHRoZSBwcmVpbWFnZSBmaWxlIHRvIGJlIHBhdGNoZWQgaW4gdGhlIHdvcmsgdHJlZSwKKwkgKiB1bmxlc3MgLS1jYWNoZWQsIHdoaWNoIHRlbGxzIGdpdCB0byBhcHBseSBvbmx5IGluIHRoZSBpbmRleC4KKwkgKi8KKwlpZiAob2xkX25hbWUpIHsKKwkJaW50IHN0YXRfcmV0ID0gMDsKKwkJdW5zaWduZWQgc3RfbW9kZSA9IDA7CisKKwkJaWYgKCFjYWNoZWQpCisJCQlzdGF0X3JldCA9IGxzdGF0KG9sZF9uYW1lLCAmc3QpOworCQlpZiAoY2hlY2tfaW5kZXgpIHsKKwkJCWludCBwb3MgPSBjYWNoZV9uYW1lX3BvcyhvbGRfbmFtZSwgc3RybGVuKG9sZF9uYW1lKSk7CisJCQlpZiAocG9zIDwgMCkKKwkJCQlyZXR1cm4gZXJyb3IoIiVzOiBkb2VzIG5vdCBleGlzdCBpbiBpbmRleCIsCisJCQkJCSAgICAgb2xkX25hbWUpOworCQkJY2UgPSBhY3RpdmVfY2FjaGVbcG9zXTsKKwkJCWlmIChzdGF0X3JldCA8IDApIHsKKwkJCQlzdHJ1Y3QgY2hlY2tvdXQgY29zdGF0ZTsKKwkJCQlpZiAoZXJybm8gIT0gRU5PRU5UKQorCQkJCQlyZXR1cm4gZXJyb3IoIiVzOiAlcyIsIG9sZF9uYW1lLAorCQkJCQkJICAgICBzdHJlcnJvcihlcnJubykpOworCQkJCS8qIGNoZWNrb3V0ICovCisJCQkJY29zdGF0ZS5iYXNlX2RpciA9ICIiOworCQkJCWNvc3RhdGUuYmFzZV9kaXJfbGVuID0gMDsKKwkJCQljb3N0YXRlLmZvcmNlID0gMDsKKwkJCQljb3N0YXRlLnF1aWV0ID0gMDsKKwkJCQljb3N0YXRlLm5vdF9uZXcgPSAwOworCQkJCWNvc3RhdGUucmVmcmVzaF9jYWNoZSA9IDE7CisJCQkJaWYgKGNoZWNrb3V0X2VudHJ5KGNlLAorCQkJCQkJICAgJmNvc3RhdGUsCisJCQkJCQkgICBOVUxMKSB8fAorCQkJCSAgICBsc3RhdChvbGRfbmFtZSwgJnN0KSkKKwkJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKCFjYWNoZWQgJiYgdmVyaWZ5X2luZGV4X21hdGNoKGNlLCAmc3QpKQorCQkJCXJldHVybiBlcnJvcigiJXM6IGRvZXMgbm90IG1hdGNoIGluZGV4IiwKKwkJCQkJICAgICBvbGRfbmFtZSk7CisJCQlpZiAoY2FjaGVkKQorCQkJCXN0X21vZGUgPSBjZS0+Y2VfbW9kZTsKKwkJfSBlbHNlIGlmIChzdGF0X3JldCA8IDApCisJCQlyZXR1cm4gZXJyb3IoIiVzOiAlcyIsIG9sZF9uYW1lLCBzdHJlcnJvcihlcnJubykpOworCisJCWlmICghY2FjaGVkKQorCQkJc3RfbW9kZSA9IGNlX21vZGVfZnJvbV9zdGF0KGNlLCBzdC5zdF9tb2RlKTsKKworCQlpZiAocGF0Y2gtPmlzX25ldyA8IDApCisJCQlwYXRjaC0+aXNfbmV3ID0gMDsKKwkJaWYgKCFwYXRjaC0+b2xkX21vZGUpCisJCQlwYXRjaC0+b2xkX21vZGUgPSBzdF9tb2RlOworCQlpZiAoKHN0X21vZGUgXiBwYXRjaC0+b2xkX21vZGUpICYgU19JRk1UKQorCQkJcmV0dXJuIGVycm9yKCIlczogd3JvbmcgdHlwZSIsIG9sZF9uYW1lKTsKKwkJaWYgKHN0X21vZGUgIT0gcGF0Y2gtPm9sZF9tb2RlKQorCQkJZnByaW50ZihzdGRlcnIsICJ3YXJuaW5nOiAlcyBoYXMgdHlwZSAlbywgZXhwZWN0ZWQgJW9cbiIsCisJCQkJb2xkX25hbWUsIHN0X21vZGUsIHBhdGNoLT5vbGRfbW9kZSk7CisJfQorCisJaWYgKG5ld19uYW1lICYmIHByZXZfcGF0Y2ggJiYgMCA8IHByZXZfcGF0Y2gtPmlzX2RlbGV0ZSAmJgorCSAgICAhc3RyY21wKHByZXZfcGF0Y2gtPm9sZF9uYW1lLCBuZXdfbmFtZSkpCisJCS8qCisJCSAqIEEgdHlwZS1jaGFuZ2UgZGlmZiBpcyBhbHdheXMgc3BsaXQgaW50byBhIHBhdGNoIHRvCisJCSAqIGRlbGV0ZSBvbGQsIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgcGF0Y2ggdG8KKwkJICogY3JlYXRlIG5ldyAoc2VlIGRpZmYuYzo6cnVuX2RpZmYoKSk7IGluIHN1Y2ggYSBjYXNlCisJCSAqIGl0IGlzIE9rIHRoYXQgdGhlIGVudHJ5IHRvIGJlIGRlbGV0ZWQgYnkgdGhlCisJCSAqIHByZXZpb3VzIHBhdGNoIGlzIHN0aWxsIGluIHRoZSB3b3JraW5nIHRyZWUgYW5kIGluCisJCSAqIHRoZSBpbmRleC4KKwkJICovCisJCW9rX2lmX2V4aXN0cyA9IDE7CisJZWxzZQorCQlva19pZl9leGlzdHMgPSAwOworCisJaWYgKG5ld19uYW1lICYmCisJICAgICgoMCA8IHBhdGNoLT5pc19uZXcpIHwgKDAgPCBwYXRjaC0+aXNfcmVuYW1lKSB8IHBhdGNoLT5pc19jb3B5KSkgeworCQlpZiAoY2hlY2tfaW5kZXggJiYKKwkJICAgIGNhY2hlX25hbWVfcG9zKG5ld19uYW1lLCBzdHJsZW4obmV3X25hbWUpKSA+PSAwICYmCisJCSAgICAhb2tfaWZfZXhpc3RzKQorCQkJcmV0dXJuIGVycm9yKCIlczogYWxyZWFkeSBleGlzdHMgaW4gaW5kZXgiLCBuZXdfbmFtZSk7CisJCWlmICghY2FjaGVkKSB7CisJCQlpbnQgZXJyID0gY2hlY2tfdG9fY3JlYXRlX2Jsb2IobmV3X25hbWUsIG9rX2lmX2V4aXN0cyk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwkJaWYgKCFwYXRjaC0+bmV3X21vZGUpIHsKKwkJCWlmICgwIDwgcGF0Y2gtPmlzX25ldykKKwkJCQlwYXRjaC0+bmV3X21vZGUgPSBTX0lGUkVHIHwgMDY0NDsKKwkJCWVsc2UKKwkJCQlwYXRjaC0+bmV3X21vZGUgPSBwYXRjaC0+b2xkX21vZGU7CisJCX0KKwl9CisKKwlpZiAobmV3X25hbWUgJiYgb2xkX25hbWUpIHsKKwkJaW50IHNhbWUgPSAhc3RyY21wKG9sZF9uYW1lLCBuZXdfbmFtZSk7CisJCWlmICghcGF0Y2gtPm5ld19tb2RlKQorCQkJcGF0Y2gtPm5ld19tb2RlID0gcGF0Y2gtPm9sZF9tb2RlOworCQlpZiAoKHBhdGNoLT5vbGRfbW9kZSBeIHBhdGNoLT5uZXdfbW9kZSkgJiBTX0lGTVQpCisJCQlyZXR1cm4gZXJyb3IoIm5ldyBtb2RlICglbykgb2YgJXMgZG9lcyBub3QgbWF0Y2ggb2xkIG1vZGUgKCVvKSVzJXMiLAorCQkJCXBhdGNoLT5uZXdfbW9kZSwgbmV3X25hbWUsIHBhdGNoLT5vbGRfbW9kZSwKKwkJCQlzYW1lID8gIiIgOiAiIG9mICIsIHNhbWUgPyAiIiA6IG9sZF9uYW1lKTsKKwl9CisKKwlpZiAoYXBwbHlfZGF0YShwYXRjaCwgJnN0LCBjZSkgPCAwKQorCQlyZXR1cm4gZXJyb3IoIiVzOiBwYXRjaCBkb2VzIG5vdCBhcHBseSIsIG5hbWUpOworCXBhdGNoLT5yZWplY3RlZCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfcGF0Y2hfbGlzdChzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXN0cnVjdCBwYXRjaCAqcHJldl9wYXRjaCA9IE5VTEw7CisJaW50IGVyciA9IDA7CisKKwlmb3IgKHByZXZfcGF0Y2ggPSBOVUxMOyBwYXRjaCA7IHBhdGNoID0gcGF0Y2gtPm5leHQpIHsKKwkJaWYgKGFwcGx5X3ZlcmJvc2VseSkKKwkJCXNheV9wYXRjaF9uYW1lKHN0ZGVyciwKKwkJCQkgICAgICAgIkNoZWNraW5nIHBhdGNoICIsIHBhdGNoLCAiLi4uXG4iKTsKKwkJZXJyIHw9IGNoZWNrX3BhdGNoKHBhdGNoLCBwcmV2X3BhdGNoKTsKKwkJcHJldl9wYXRjaCA9IHBhdGNoOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIHJlYWQgdGhlIHNoYTEgZnJvbSB0aGUgY3VycmVudCBpbmRleCAqLworc3RhdGljIGludCBnZXRfY3VycmVudF9zaGExKGNvbnN0IGNoYXIgKnBhdGgsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaW50IHBvczsKKworCWlmIChyZWFkX2NhY2hlKCkgPCAwKQorCQlyZXR1cm4gLTE7CisJcG9zID0gY2FjaGVfbmFtZV9wb3MocGF0aCwgc3RybGVuKHBhdGgpKTsKKwlpZiAocG9zIDwgMCkKKwkJcmV0dXJuIC0xOworCWhhc2hjcHkoc2hhMSwgYWN0aXZlX2NhY2hlW3Bvc10tPnNoYTEpOworCXJldHVybiAwOworfQorCisvKiBCdWlsZCBhbiBpbmRleCB0aGF0IGNvbnRhaW5zIHRoZSBqdXN0IHRoZSBmaWxlcyBuZWVkZWQgZm9yIGEgM3dheSBtZXJnZSAqLworc3RhdGljIHZvaWQgYnVpbGRfZmFrZV9hbmNlc3RvcihzdHJ1Y3QgcGF0Y2ggKmxpc3QsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCXN0cnVjdCBwYXRjaCAqcGF0Y2g7CisJc3RydWN0IGluZGV4X3N0YXRlIHJlc3VsdCA9IHsgMCB9OworCWludCBmZDsKKworCS8qIE9uY2Ugd2Ugc3RhcnQgc3VwcG9ydGluZyB0aGUgcmV2ZXJzZSBwYXRjaCwgaXQgbWF5IGJlCisJICogd29ydGggc2hvd2luZyB0aGUgbmV3IHNoYTEgcHJlZml4LCBidXQgdW50aWwgdGhlbi4uLgorCSAqLworCWZvciAocGF0Y2ggPSBsaXN0OyBwYXRjaDsgcGF0Y2ggPSBwYXRjaC0+bmV4dCkgeworCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExX3B0cjsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZTsKKwkJY29uc3QgY2hhciAqbmFtZTsKKworCQluYW1lID0gcGF0Y2gtPm9sZF9uYW1lID8gcGF0Y2gtPm9sZF9uYW1lIDogcGF0Y2gtPm5ld19uYW1lOworCQlpZiAoMCA8IHBhdGNoLT5pc19uZXcpCisJCQljb250aW51ZTsKKwkJZWxzZSBpZiAoZ2V0X3NoYTEocGF0Y2gtPm9sZF9zaGExX3ByZWZpeCwgc2hhMSkpCisJCQkvKiBnaXQgZGlmZiBoYXMgbm8gaW5kZXggbGluZSBmb3IgbW9kZS90eXBlIGNoYW5nZXMgKi8KKwkJCWlmICghcGF0Y2gtPmxpbmVzX2FkZGVkICYmICFwYXRjaC0+bGluZXNfZGVsZXRlZCkgeworCQkJCWlmIChnZXRfY3VycmVudF9zaGExKHBhdGNoLT5uZXdfbmFtZSwgc2hhMSkgfHwKKwkJCQkgICAgZ2V0X2N1cnJlbnRfc2hhMShwYXRjaC0+b2xkX25hbWUsIHNoYTEpKQorCQkJCQlkaWUoIm1vZGUgY2hhbmdlIGZvciAlcywgd2hpY2ggaXMgbm90ICIKKwkJCQkJCSJpbiBjdXJyZW50IEhFQUQiLCBuYW1lKTsKKwkJCQlzaGExX3B0ciA9IHNoYTE7CisJCQl9IGVsc2UKKwkJCQlkaWUoInNoYTEgaW5mb3JtYXRpb24gaXMgbGFja2luZyBvciB1c2VsZXNzICIKKwkJCQkJIiglcykuIiwgbmFtZSk7CisJCWVsc2UKKwkJCXNoYTFfcHRyID0gc2hhMTsKKworCQljZSA9IG1ha2VfY2FjaGVfZW50cnkocGF0Y2gtPm9sZF9tb2RlLCBzaGExX3B0ciwgbmFtZSwgMCwgMCk7CisJCWlmIChhZGRfaW5kZXhfZW50cnkoJnJlc3VsdCwgY2UsIEFERF9DQUNIRV9PS19UT19BREQpKQorCQkJZGllICgiQ291bGQgbm90IGFkZCAlcyB0byB0ZW1wb3JhcnkgaW5kZXgiLCBuYW1lKTsKKwl9CisKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fV1JPTkxZIHwgT19DUkVBVCwgMDY2Nik7CisJaWYgKGZkIDwgMCB8fCB3cml0ZV9pbmRleCgmcmVzdWx0LCBmZCkgfHwgY2xvc2UoZmQpKQorCQlkaWUgKCJDb3VsZCBub3Qgd3JpdGUgdGVtcG9yYXJ5IGluZGV4IHRvICVzIiwgZmlsZW5hbWUpOworCisJZGlzY2FyZF9pbmRleCgmcmVzdWx0KTsKK30KKworc3RhdGljIHZvaWQgc3RhdF9wYXRjaF9saXN0KHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJaW50IGZpbGVzLCBhZGRzLCBkZWxzOworCisJZm9yIChmaWxlcyA9IGFkZHMgPSBkZWxzID0gMCA7IHBhdGNoIDsgcGF0Y2ggPSBwYXRjaC0+bmV4dCkgeworCQlmaWxlcysrOworCQlhZGRzICs9IHBhdGNoLT5saW5lc19hZGRlZDsKKwkJZGVscyArPSBwYXRjaC0+bGluZXNfZGVsZXRlZDsKKwkJc2hvd19zdGF0cyhwYXRjaCk7CisJfQorCisJcHJpbnRmKCIgJWQgZmlsZXMgY2hhbmdlZCwgJWQgaW5zZXJ0aW9ucygrKSwgJWQgZGVsZXRpb25zKC0pXG4iLCBmaWxlcywgYWRkcywgZGVscyk7Cit9CisKK3N0YXRpYyB2b2lkIG51bXN0YXRfcGF0Y2hfbGlzdChzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCWZvciAoIDsgcGF0Y2g7IHBhdGNoID0gcGF0Y2gtPm5leHQpIHsKKwkJY29uc3QgY2hhciAqbmFtZTsKKwkJbmFtZSA9IHBhdGNoLT5uZXdfbmFtZSA/IHBhdGNoLT5uZXdfbmFtZSA6IHBhdGNoLT5vbGRfbmFtZTsKKwkJaWYgKHBhdGNoLT5pc19iaW5hcnkpCisJCQlwcmludGYoIi1cdC1cdCIpOworCQllbHNlCisJCQlwcmludGYoIiVkXHQlZFx0IiwgcGF0Y2gtPmxpbmVzX2FkZGVkLCBwYXRjaC0+bGluZXNfZGVsZXRlZCk7CisJCXdyaXRlX25hbWVfcXVvdGVkKG5hbWUsIHN0ZG91dCwgbGluZV90ZXJtaW5hdGlvbik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzaG93X2ZpbGVfbW9kZV9uYW1lKGNvbnN0IGNoYXIgKm5ld2RlbGV0ZSwgdW5zaWduZWQgaW50IG1vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaWYgKG1vZGUpCisJCXByaW50ZigiICVzIG1vZGUgJTA2byAlc1xuIiwgbmV3ZGVsZXRlLCBtb2RlLCBuYW1lKTsKKwllbHNlCisJCXByaW50ZigiICVzICVzXG4iLCBuZXdkZWxldGUsIG5hbWUpOworfQorCitzdGF0aWMgdm9pZCBzaG93X21vZGVfY2hhbmdlKHN0cnVjdCBwYXRjaCAqcCwgaW50IHNob3dfbmFtZSkKK3sKKwlpZiAocC0+b2xkX21vZGUgJiYgcC0+bmV3X21vZGUgJiYgcC0+b2xkX21vZGUgIT0gcC0+bmV3X21vZGUpIHsKKwkJaWYgKHNob3dfbmFtZSkKKwkJCXByaW50ZigiIG1vZGUgY2hhbmdlICUwNm8gPT4gJTA2byAlc1xuIiwKKwkJCSAgICAgICBwLT5vbGRfbW9kZSwgcC0+bmV3X21vZGUsIHAtPm5ld19uYW1lKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIgbW9kZSBjaGFuZ2UgJTA2byA9PiAlMDZvXG4iLAorCQkJICAgICAgIHAtPm9sZF9tb2RlLCBwLT5uZXdfbW9kZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzaG93X3JlbmFtZV9jb3B5KHN0cnVjdCBwYXRjaCAqcCkKK3sKKwljb25zdCBjaGFyICpyZW5hbWVjb3B5ID0gcC0+aXNfcmVuYW1lID8gInJlbmFtZSIgOiAiY29weSI7CisJY29uc3QgY2hhciAqb2xkLCAqbmV3OworCisJLyogRmluZCBjb21tb24gcHJlZml4ICovCisJb2xkID0gcC0+b2xkX25hbWU7CisJbmV3ID0gcC0+bmV3X25hbWU7CisJd2hpbGUgKDEpIHsKKwkJY29uc3QgY2hhciAqc2xhc2hfb2xkLCAqc2xhc2hfbmV3OworCQlzbGFzaF9vbGQgPSBzdHJjaHIob2xkLCAnLycpOworCQlzbGFzaF9uZXcgPSBzdHJjaHIobmV3LCAnLycpOworCQlpZiAoIXNsYXNoX29sZCB8fAorCQkgICAgIXNsYXNoX25ldyB8fAorCQkgICAgc2xhc2hfb2xkIC0gb2xkICE9IHNsYXNoX25ldyAtIG5ldyB8fAorCQkgICAgbWVtY21wKG9sZCwgbmV3LCBzbGFzaF9uZXcgLSBuZXcpKQorCQkJYnJlYWs7CisJCW9sZCA9IHNsYXNoX29sZCArIDE7CisJCW5ldyA9IHNsYXNoX25ldyArIDE7CisJfQorCS8qIHAtPm9sZF9uYW1lIHRocnUgb2xkIGlzIHRoZSBjb21tb24gcHJlZml4LCBhbmQgb2xkIGFuZCBuZXcKKwkgKiB0aHJvdWdoIHRoZSBlbmQgb2YgbmFtZXMgYXJlIHJlbmFtZXMKKwkgKi8KKwlpZiAob2xkICE9IHAtPm9sZF9uYW1lKQorCQlwcmludGYoIiAlcyAlLipzeyVzID0+ICVzfSAoJWQlJSlcbiIsIHJlbmFtZWNvcHksCisJCSAgICAgICAoaW50KShvbGQgLSBwLT5vbGRfbmFtZSksIHAtPm9sZF9uYW1lLAorCQkgICAgICAgb2xkLCBuZXcsIHAtPnNjb3JlKTsKKwllbHNlCisJCXByaW50ZigiICVzICVzID0+ICVzICglZCUlKVxuIiwgcmVuYW1lY29weSwKKwkJICAgICAgIHAtPm9sZF9uYW1lLCBwLT5uZXdfbmFtZSwgcC0+c2NvcmUpOworCXNob3dfbW9kZV9jaGFuZ2UocCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHN1bW1hcnlfcGF0Y2hfbGlzdChzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXN0cnVjdCBwYXRjaCAqcDsKKworCWZvciAocCA9IHBhdGNoOyBwOyBwID0gcC0+bmV4dCkgeworCQlpZiAocC0+aXNfbmV3KQorCQkJc2hvd19maWxlX21vZGVfbmFtZSgiY3JlYXRlIiwgcC0+bmV3X21vZGUsIHAtPm5ld19uYW1lKTsKKwkJZWxzZSBpZiAocC0+aXNfZGVsZXRlKQorCQkJc2hvd19maWxlX21vZGVfbmFtZSgiZGVsZXRlIiwgcC0+b2xkX21vZGUsIHAtPm9sZF9uYW1lKTsKKwkJZWxzZSB7CisJCQlpZiAocC0+aXNfcmVuYW1lIHx8IHAtPmlzX2NvcHkpCisJCQkJc2hvd19yZW5hbWVfY29weShwKTsKKwkJCWVsc2UgeworCQkJCWlmIChwLT5zY29yZSkgeworCQkJCQlwcmludGYoIiByZXdyaXRlICVzICglZCUlKVxuIiwKKwkJCQkJICAgICAgIHAtPm5ld19uYW1lLCBwLT5zY29yZSk7CisJCQkJCXNob3dfbW9kZV9jaGFuZ2UocCwgMCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJc2hvd19tb2RlX2NoYW5nZShwLCAxKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcGF0Y2hfc3RhdHMoc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlpbnQgbGluZXMgPSBwYXRjaC0+bGluZXNfYWRkZWQgKyBwYXRjaC0+bGluZXNfZGVsZXRlZDsKKworCWlmIChsaW5lcyA+IG1heF9jaGFuZ2UpCisJCW1heF9jaGFuZ2UgPSBsaW5lczsKKwlpZiAocGF0Y2gtPm9sZF9uYW1lKSB7CisJCWludCBsZW4gPSBxdW90ZV9jX3N0eWxlKHBhdGNoLT5vbGRfbmFtZSwgTlVMTCwgTlVMTCwgMCk7CisJCWlmICghbGVuKQorCQkJbGVuID0gc3RybGVuKHBhdGNoLT5vbGRfbmFtZSk7CisJCWlmIChsZW4gPiBtYXhfbGVuKQorCQkJbWF4X2xlbiA9IGxlbjsKKwl9CisJaWYgKHBhdGNoLT5uZXdfbmFtZSkgeworCQlpbnQgbGVuID0gcXVvdGVfY19zdHlsZShwYXRjaC0+bmV3X25hbWUsIE5VTEwsIE5VTEwsIDApOworCQlpZiAoIWxlbikKKwkJCWxlbiA9IHN0cmxlbihwYXRjaC0+bmV3X25hbWUpOworCQlpZiAobGVuID4gbWF4X2xlbikKKwkJCW1heF9sZW4gPSBsZW47CisJfQorfQorCitzdGF0aWMgdm9pZCByZW1vdmVfZmlsZShzdHJ1Y3QgcGF0Y2ggKnBhdGNoLCBpbnQgcm1kaXJfZW1wdHkpCit7CisJaWYgKHVwZGF0ZV9pbmRleCkgeworCQlpZiAocmVtb3ZlX2ZpbGVfZnJvbV9jYWNoZShwYXRjaC0+b2xkX25hbWUpIDwgMCkKKwkJCWRpZSgidW5hYmxlIHRvIHJlbW92ZSAlcyBmcm9tIGluZGV4IiwgcGF0Y2gtPm9sZF9uYW1lKTsKKwl9CisJaWYgKCFjYWNoZWQpIHsKKwkJaWYgKFNfSVNHSVRMSU5LKHBhdGNoLT5vbGRfbW9kZSkpIHsKKwkJCWlmIChybWRpcihwYXRjaC0+b2xkX25hbWUpKQorCQkJCXdhcm5pbmcoInVuYWJsZSB0byByZW1vdmUgc3VibW9kdWxlICVzIiwKKwkJCQkJcGF0Y2gtPm9sZF9uYW1lKTsKKwkJfSBlbHNlIGlmICghdW5saW5rKHBhdGNoLT5vbGRfbmFtZSkgJiYgcm1kaXJfZW1wdHkpIHsKKwkJCWNoYXIgKm5hbWUgPSB4c3RyZHVwKHBhdGNoLT5vbGRfbmFtZSk7CisJCQljaGFyICplbmQgPSBzdHJyY2hyKG5hbWUsICcvJyk7CisJCQl3aGlsZSAoZW5kKSB7CisJCQkJKmVuZCA9IDA7CisJCQkJaWYgKHJtZGlyKG5hbWUpKQorCQkJCQlicmVhazsKKwkJCQllbmQgPSBzdHJyY2hyKG5hbWUsICcvJyk7CisJCQl9CisJCQlmcmVlKG5hbWUpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBhZGRfaW5kZXhfZmlsZShjb25zdCBjaGFyICpwYXRoLCB1bnNpZ25lZCBtb2RlLCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlOworCWludCBuYW1lbGVuID0gc3RybGVuKHBhdGgpOworCXVuc2lnbmVkIGNlX3NpemUgPSBjYWNoZV9lbnRyeV9zaXplKG5hbWVsZW4pOworCisJaWYgKCF1cGRhdGVfaW5kZXgpCisJCXJldHVybjsKKworCWNlID0geGNhbGxvYygxLCBjZV9zaXplKTsKKwltZW1jcHkoY2UtPm5hbWUsIHBhdGgsIG5hbWVsZW4pOworCWNlLT5jZV9tb2RlID0gY3JlYXRlX2NlX21vZGUobW9kZSk7CisJY2UtPmNlX2ZsYWdzID0gbmFtZWxlbjsKKwlpZiAoU19JU0dJVExJTksobW9kZSkpIHsKKwkJY29uc3QgY2hhciAqcyA9IGJ1ZjsKKworCQlpZiAoZ2V0X3NoYTFfaGV4KHMgKyBzdHJsZW4oIlN1YnByb2plY3QgY29tbWl0ICIpLCBjZS0+c2hhMSkpCisJCQlkaWUoImNvcnJ1cHQgcGF0Y2ggZm9yIHN1YnByb2plY3QgJXMiLCBwYXRoKTsKKwl9IGVsc2UgeworCQlpZiAoIWNhY2hlZCkgeworCQkJaWYgKGxzdGF0KHBhdGgsICZzdCkgPCAwKQorCQkJCWRpZSgidW5hYmxlIHRvIHN0YXQgbmV3bHkgY3JlYXRlZCBmaWxlICVzIiwKKwkJCQkgICAgcGF0aCk7CisJCQlmaWxsX3N0YXRfY2FjaGVfaW5mbyhjZSwgJnN0KTsKKwkJfQorCQlpZiAod3JpdGVfc2hhMV9maWxlKGJ1Ziwgc2l6ZSwgYmxvYl90eXBlLCBjZS0+c2hhMSkgPCAwKQorCQkJZGllKCJ1bmFibGUgdG8gY3JlYXRlIGJhY2tpbmcgc3RvcmUgZm9yIG5ld2x5IGNyZWF0ZWQgZmlsZSAlcyIsIHBhdGgpOworCX0KKwlpZiAoYWRkX2NhY2hlX2VudHJ5KGNlLCBBRERfQ0FDSEVfT0tfVE9fQUREKSA8IDApCisJCWRpZSgidW5hYmxlIHRvIGFkZCBjYWNoZSBlbnRyeSBmb3IgJXMiLCBwYXRoKTsKK30KKworc3RhdGljIGludCB0cnlfY3JlYXRlX2ZpbGUoY29uc3QgY2hhciAqcGF0aCwgdW5zaWduZWQgaW50IG1vZGUsIGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWludCBmZDsKKwlzdHJ1Y3Qgc3RyYnVmIG5idWY7CisKKwlpZiAoU19JU0dJVExJTksobW9kZSkpIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWlmICghbHN0YXQocGF0aCwgJnN0KSAmJiBTX0lTRElSKHN0LnN0X21vZGUpKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiBta2RpcihwYXRoLCAwNzc3KTsKKwl9CisKKwlpZiAoaGFzX3N5bWxpbmtzICYmIFNfSVNMTksobW9kZSkpCisJCS8qIEFsdGhvdWdoIGJ1ZjpzaXplIGlzIGNvdW50ZWQgc3RyaW5nLCBpdCBhbHNvIGlzIE5VTAorCQkgKiB0ZXJtaW5hdGVkLgorCQkgKi8KKwkJcmV0dXJuIHN5bWxpbmsoYnVmLCBwYXRoKTsKKworCWZkID0gb3BlbihwYXRoLCBPX0NSRUFUIHwgT19FWENMIHwgT19XUk9OTFksIChtb2RlICYgMDEwMCkgPyAwNzc3IDogMDY2Nik7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCisJc3RyYnVmX2luaXQoJm5idWYsIDApOworCWlmIChjb252ZXJ0X3RvX3dvcmtpbmdfdHJlZShwYXRoLCBidWYsIHNpemUsICZuYnVmKSkgeworCQlzaXplID0gbmJ1Zi5sZW47CisJCWJ1ZiAgPSBuYnVmLmJ1ZjsKKwl9CisJd3JpdGVfb3JfZGllKGZkLCBidWYsIHNpemUpOworCXN0cmJ1Zl9yZWxlYXNlKCZuYnVmKTsKKworCWlmIChjbG9zZShmZCkgPCAwKQorCQlkaWUoImNsb3NpbmcgZmlsZSAlczogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworCXJldHVybiAwOworfQorCisvKgorICogV2Ugb3B0aW1pc3RpY2FsbHkgYXNzdW1lIHRoYXQgdGhlIGRpcmVjdG9yaWVzIGV4aXN0LAorICogd2hpY2ggaXMgdHJ1ZSA5OSUgb2YgdGhlIHRpbWUgYW55d2F5LiBJZiB0aGV5IGRvbid0LAorICogd2UgY3JlYXRlIHRoZW0gYW5kIHRyeSBhZ2Fpbi4KKyAqLworc3RhdGljIHZvaWQgY3JlYXRlX29uZV9maWxlKGNoYXIgKnBhdGgsIHVuc2lnbmVkIG1vZGUsIGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWlmIChjYWNoZWQpCisJCXJldHVybjsKKwlpZiAoIXRyeV9jcmVhdGVfZmlsZShwYXRoLCBtb2RlLCBidWYsIHNpemUpKQorCQlyZXR1cm47CisKKwlpZiAoZXJybm8gPT0gRU5PRU5UKSB7CisJCWlmIChzYWZlX2NyZWF0ZV9sZWFkaW5nX2RpcmVjdG9yaWVzKHBhdGgpKQorCQkJcmV0dXJuOworCQlpZiAoIXRyeV9jcmVhdGVfZmlsZShwYXRoLCBtb2RlLCBidWYsIHNpemUpKQorCQkJcmV0dXJuOworCX0KKworCWlmIChlcnJubyA9PSBFRVhJU1QgfHwgZXJybm8gPT0gRUFDQ0VTKSB7CisJCS8qIFdlIG1heSBiZSB0cnlpbmcgdG8gY3JlYXRlIGEgZmlsZSB3aGVyZSBhIGRpcmVjdG9yeQorCQkgKiB1c2VkIHRvIGJlLgorCQkgKi8KKwkJc3RydWN0IHN0YXQgc3Q7CisJCWlmICghbHN0YXQocGF0aCwgJnN0KSAmJiAoIVNfSVNESVIoc3Quc3RfbW9kZSkgfHwgIXJtZGlyKHBhdGgpKSkKKwkJCWVycm5vID0gRUVYSVNUOworCX0KKworCWlmIChlcnJubyA9PSBFRVhJU1QpIHsKKwkJdW5zaWduZWQgaW50IG5yID0gZ2V0cGlkKCk7CisKKwkJZm9yICg7OykgeworCQkJY29uc3QgY2hhciAqbmV3cGF0aDsKKwkJCW5ld3BhdGggPSBta3BhdGgoIiVzfiV1IiwgcGF0aCwgbnIpOworCQkJaWYgKCF0cnlfY3JlYXRlX2ZpbGUobmV3cGF0aCwgbW9kZSwgYnVmLCBzaXplKSkgeworCQkJCWlmICghcmVuYW1lKG5ld3BhdGgsIHBhdGgpKQorCQkJCQlyZXR1cm47CisJCQkJdW5saW5rKG5ld3BhdGgpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGVycm5vICE9IEVFWElTVCkKKwkJCQlicmVhazsKKwkJCSsrbnI7CisJCX0KKwl9CisJZGllKCJ1bmFibGUgdG8gd3JpdGUgZmlsZSAlcyBtb2RlICVvIiwgcGF0aCwgbW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9maWxlKHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJY2hhciAqcGF0aCA9IHBhdGNoLT5uZXdfbmFtZTsKKwl1bnNpZ25lZCBtb2RlID0gcGF0Y2gtPm5ld19tb2RlOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHBhdGNoLT5yZXN1bHRzaXplOworCWNoYXIgKmJ1ZiA9IHBhdGNoLT5yZXN1bHQ7CisKKwlpZiAoIW1vZGUpCisJCW1vZGUgPSBTX0lGUkVHIHwgMDY0NDsKKwljcmVhdGVfb25lX2ZpbGUocGF0aCwgbW9kZSwgYnVmLCBzaXplKTsKKwlhZGRfaW5kZXhfZmlsZShwYXRoLCBtb2RlLCBidWYsIHNpemUpOworfQorCisvKiBwaGFzZSB6ZXJvIGlzIHRvIHJlbW92ZSwgcGhhc2Ugb25lIGlzIHRvIGNyZWF0ZSAqLworc3RhdGljIHZvaWQgd3JpdGVfb3V0X29uZV9yZXN1bHQoc3RydWN0IHBhdGNoICpwYXRjaCwgaW50IHBoYXNlKQoreworCWlmIChwYXRjaC0+aXNfZGVsZXRlID4gMCkgeworCQlpZiAocGhhc2UgPT0gMCkKKwkJCXJlbW92ZV9maWxlKHBhdGNoLCAxKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocGF0Y2gtPmlzX25ldyA+IDAgfHwgcGF0Y2gtPmlzX2NvcHkpIHsKKwkJaWYgKHBoYXNlID09IDEpCisJCQljcmVhdGVfZmlsZShwYXRjaCk7CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBSZW5hbWUgb3IgbW9kaWZpY2F0aW9uIGJvaWxzIGRvd24gdG8gdGhlIHNhbWUKKwkgKiB0aGluZzogcmVtb3ZlIHRoZSBvbGQsIHdyaXRlIHRoZSBuZXcKKwkgKi8KKwlpZiAocGhhc2UgPT0gMCkKKwkJcmVtb3ZlX2ZpbGUocGF0Y2gsIHBhdGNoLT5pc19yZW5hbWUpOworCWlmIChwaGFzZSA9PSAxKQorCQljcmVhdGVfZmlsZShwYXRjaCk7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfb3V0X29uZV9yZWplY3Qoc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlGSUxFICpyZWo7CisJY2hhciBuYW1lYnVmW1BBVEhfTUFYXTsKKwlzdHJ1Y3QgZnJhZ21lbnQgKmZyYWc7CisJaW50IGNudCA9IDA7CisKKwlmb3IgKGNudCA9IDAsIGZyYWcgPSBwYXRjaC0+ZnJhZ21lbnRzOyBmcmFnOyBmcmFnID0gZnJhZy0+bmV4dCkgeworCQlpZiAoIWZyYWctPnJlamVjdGVkKQorCQkJY29udGludWU7CisJCWNudCsrOworCX0KKworCWlmICghY250KSB7CisJCWlmIChhcHBseV92ZXJib3NlbHkpCisJCQlzYXlfcGF0Y2hfbmFtZShzdGRlcnIsCisJCQkJICAgICAgICJBcHBsaWVkIHBhdGNoICIsIHBhdGNoLCAiIGNsZWFubHkuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYmVjYXVzZSBhIHJlbW92YWwgcGF0Y2ggdGhhdCBsZWF2ZXMKKwkgKiBjb250ZW50cyBhcmUgbWFya2VkICJyZWplY3RlZCIgYXQgdGhlIHBhdGNoIGxldmVsLgorCSAqLworCWlmICghcGF0Y2gtPm5ld19uYW1lKQorCQlkaWUoImludGVybmFsIGVycm9yIik7CisKKwkvKiBTYXkgdGhpcyBldmVuIHdpdGhvdXQgLS12ZXJib3NlICovCisJc2F5X3BhdGNoX25hbWUoc3RkZXJyLCAiQXBwbHlpbmcgcGF0Y2ggIiwgcGF0Y2gsICIgd2l0aCIpOworCWZwcmludGYoc3RkZXJyLCAiICVkIHJlamVjdHMuLi5cbiIsIGNudCk7CisKKwljbnQgPSBzdHJsZW4ocGF0Y2gtPm5ld19uYW1lKTsKKwlpZiAoQVJSQVlfU0laRShuYW1lYnVmKSA8PSBjbnQgKyA1KSB7CisJCWNudCA9IEFSUkFZX1NJWkUobmFtZWJ1ZikgLSA1OworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJ3YXJuaW5nOiB0cnVuY2F0aW5nIC5yZWogZmlsZW5hbWUgdG8gJS4qcy5yZWoiLAorCQkJY250IC0gMSwgcGF0Y2gtPm5ld19uYW1lKTsKKwl9CisJbWVtY3B5KG5hbWVidWYsIHBhdGNoLT5uZXdfbmFtZSwgY250KTsKKwltZW1jcHkobmFtZWJ1ZiArIGNudCwgIi5yZWoiLCA1KTsKKworCXJlaiA9IGZvcGVuKG5hbWVidWYsICJ3Iik7CisJaWYgKCFyZWopCisJCXJldHVybiBlcnJvcigiY2Fubm90IG9wZW4gJXM6ICVzIiwgbmFtZWJ1Ziwgc3RyZXJyb3IoZXJybm8pKTsKKworCS8qIE5vcm1hbCBnaXQgdG9vbHMgbmV2ZXIgZGVhbCB3aXRoIC5yZWosIHNvIGRvIG5vdCBwcmV0ZW5kCisJICogdGhpcyBpcyBhIGdpdCBwYXRjaCBieSBzYXlpbmcgLS1naXQgbm9yIGdpdmUgZXh0ZW5kZWQKKwkgKiBoZWFkZXJzLiAgV2hpbGUgYXQgaXQsIG1heWJlIHBsZWFzZSAia29tcGFyZSIgdGhhdCB3YW50cworCSAqIHRoZSB0cmFpbGluZyBUQUIgYW5kIHNvbWUgZ2FyYmFnZSBhdCB0aGUgZW5kIG9mIGxpbmUgOy0pLgorCSAqLworCWZwcmludGYocmVqLCAiZGlmZiBhLyVzIGIvJXNcdChyZWplY3RlZCBodW5rcylcbiIsCisJCXBhdGNoLT5uZXdfbmFtZSwgcGF0Y2gtPm5ld19uYW1lKTsKKwlmb3IgKGNudCA9IDEsIGZyYWcgPSBwYXRjaC0+ZnJhZ21lbnRzOworCSAgICAgZnJhZzsKKwkgICAgIGNudCsrLCBmcmFnID0gZnJhZy0+bmV4dCkgeworCQlpZiAoIWZyYWctPnJlamVjdGVkKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkh1bmsgIyVkIGFwcGxpZWQgY2xlYW5seS5cbiIsIGNudCk7CisJCQljb250aW51ZTsKKwkJfQorCQlmcHJpbnRmKHN0ZGVyciwgIlJlamVjdGVkIGh1bmsgIyVkLlxuIiwgY250KTsKKwkJZnByaW50ZihyZWosICIlLipzIiwgZnJhZy0+c2l6ZSwgZnJhZy0+cGF0Y2gpOworCQlpZiAoZnJhZy0+cGF0Y2hbZnJhZy0+c2l6ZS0xXSAhPSAnXG4nKQorCQkJZnB1dGMoJ1xuJywgcmVqKTsKKwl9CisJZmNsb3NlKHJlaik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHdyaXRlX291dF9yZXN1bHRzKHN0cnVjdCBwYXRjaCAqbGlzdCwgaW50IHNraXBwZWRfcGF0Y2gpCit7CisJaW50IHBoYXNlOworCWludCBlcnJzID0gMDsKKwlzdHJ1Y3QgcGF0Y2ggKmw7CisKKwlpZiAoIWxpc3QgJiYgIXNraXBwZWRfcGF0Y2gpCisJCXJldHVybiBlcnJvcigiTm8gY2hhbmdlcyIpOworCisJZm9yIChwaGFzZSA9IDA7IHBoYXNlIDwgMjsgcGhhc2UrKykgeworCQlsID0gbGlzdDsKKwkJd2hpbGUgKGwpIHsKKwkJCWlmIChsLT5yZWplY3RlZCkKKwkJCQllcnJzID0gMTsKKwkJCWVsc2UgeworCQkJCXdyaXRlX291dF9vbmVfcmVzdWx0KGwsIHBoYXNlKTsKKwkJCQlpZiAocGhhc2UgPT0gMSAmJiB3cml0ZV9vdXRfb25lX3JlamVjdChsKSkKKwkJCQkJZXJycyA9IDE7CisJCQl9CisJCQlsID0gbC0+bmV4dDsKKwkJfQorCX0KKwlyZXR1cm4gZXJyczsKK30KKworc3RhdGljIHN0cnVjdCBsb2NrX2ZpbGUgbG9ja19maWxlOworCitzdGF0aWMgc3RydWN0IGV4Y2x1ZGVzIHsKKwlzdHJ1Y3QgZXhjbHVkZXMgKm5leHQ7CisJY29uc3QgY2hhciAqcGF0aDsKK30gKmV4Y2x1ZGVzOworCitzdGF0aWMgaW50IHVzZV9wYXRjaChzdHJ1Y3QgcGF0Y2ggKnApCit7CisJY29uc3QgY2hhciAqcGF0aG5hbWUgPSBwLT5uZXdfbmFtZSA/IHAtPm5ld19uYW1lIDogcC0+b2xkX25hbWU7CisJc3RydWN0IGV4Y2x1ZGVzICp4ID0gZXhjbHVkZXM7CisJd2hpbGUgKHgpIHsKKwkJaWYgKGZubWF0Y2goeC0+cGF0aCwgcGF0aG5hbWUsIDApID09IDApCisJCQlyZXR1cm4gMDsKKwkJeCA9IHgtPm5leHQ7CisJfQorCWlmICgwIDwgcHJlZml4X2xlbmd0aCkgeworCQlpbnQgcGF0aGxlbiA9IHN0cmxlbihwYXRobmFtZSk7CisJCWlmIChwYXRobGVuIDw9IHByZWZpeF9sZW5ndGggfHwKKwkJICAgIG1lbWNtcChwcmVmaXgsIHBhdGhuYW1lLCBwcmVmaXhfbGVuZ3RoKSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcHJlZml4X29uZShjaGFyICoqbmFtZSkKK3sKKwljaGFyICpvbGRfbmFtZSA9ICpuYW1lOworCWlmICghb2xkX25hbWUpCisJCXJldHVybjsKKwkqbmFtZSA9IHhzdHJkdXAocHJlZml4X2ZpbGVuYW1lKHByZWZpeCwgcHJlZml4X2xlbmd0aCwgKm5hbWUpKTsKKwlmcmVlKG9sZF9uYW1lKTsKK30KKworc3RhdGljIHZvaWQgcHJlZml4X3BhdGNoZXMoc3RydWN0IHBhdGNoICpwKQoreworCWlmICghcHJlZml4IHx8IHAtPmlzX3RvcGxldmVsX3JlbGF0aXZlKQorCQlyZXR1cm47CisJZm9yICggOyBwOyBwID0gcC0+bmV4dCkgeworCQlpZiAocC0+bmV3X25hbWUgPT0gcC0+b2xkX25hbWUpIHsKKwkJCWNoYXIgKnByZWZpeGVkID0gcC0+bmV3X25hbWU7CisJCQlwcmVmaXhfb25lKCZwcmVmaXhlZCk7CisJCQlwLT5uZXdfbmFtZSA9IHAtPm9sZF9uYW1lID0gcHJlZml4ZWQ7CisJCX0KKwkJZWxzZSB7CisJCQlwcmVmaXhfb25lKCZwLT5uZXdfbmFtZSk7CisJCQlwcmVmaXhfb25lKCZwLT5vbGRfbmFtZSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgYXBwbHlfcGF0Y2goaW50IGZkLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGluYWNjdXJhdGVfZW9mKQoreworCXNpemVfdCBvZmZzZXQ7CisJc3RydWN0IHN0cmJ1ZiBidWY7CisJc3RydWN0IHBhdGNoICpsaXN0ID0gTlVMTCwgKipsaXN0cCA9ICZsaXN0OworCWludCBza2lwcGVkX3BhdGNoID0gMDsKKworCXN0cmJ1Zl9pbml0KCZidWYsIDApOworCXBhdGNoX2lucHV0X2ZpbGUgPSBmaWxlbmFtZTsKKwlyZWFkX3BhdGNoX2ZpbGUoJmJ1ZiwgZmQpOworCW9mZnNldCA9IDA7CisJd2hpbGUgKG9mZnNldCA8IGJ1Zi5sZW4pIHsKKwkJc3RydWN0IHBhdGNoICpwYXRjaDsKKwkJaW50IG5yOworCisJCXBhdGNoID0geGNhbGxvYygxLCBzaXplb2YoKnBhdGNoKSk7CisJCXBhdGNoLT5pbmFjY3VyYXRlX2VvZiA9IGluYWNjdXJhdGVfZW9mOworCQluciA9IHBhcnNlX2NodW5rKGJ1Zi5idWYgKyBvZmZzZXQsIGJ1Zi5sZW4gLSBvZmZzZXQsIHBhdGNoKTsKKwkJaWYgKG5yIDwgMCkKKwkJCWJyZWFrOworCQlpZiAoYXBwbHlfaW5fcmV2ZXJzZSkKKwkJCXJldmVyc2VfcGF0Y2hlcyhwYXRjaCk7CisJCWlmIChwcmVmaXgpCisJCQlwcmVmaXhfcGF0Y2hlcyhwYXRjaCk7CisJCWlmICh1c2VfcGF0Y2gocGF0Y2gpKSB7CisJCQlwYXRjaF9zdGF0cyhwYXRjaCk7CisJCQkqbGlzdHAgPSBwYXRjaDsKKwkJCWxpc3RwID0gJnBhdGNoLT5uZXh0OworCQl9CisJCWVsc2UgeworCQkJLyogcGVyaGFwcyBmcmVlIGl0IGEgYml0IGJldHRlcj8gKi8KKwkJCWZyZWUocGF0Y2gpOworCQkJc2tpcHBlZF9wYXRjaCsrOworCQl9CisJCW9mZnNldCArPSBucjsKKwl9CisKKwlpZiAod2hpdGVzcGFjZV9lcnJvciAmJiAod3NfZXJyb3JfYWN0aW9uID09IGRpZV9vbl93c19lcnJvcikpCisJCWFwcGx5ID0gMDsKKworCXVwZGF0ZV9pbmRleCA9IGNoZWNrX2luZGV4ICYmIGFwcGx5OworCWlmICh1cGRhdGVfaW5kZXggJiYgbmV3ZmQgPCAwKQorCQluZXdmZCA9IGhvbGRfbG9ja2VkX2luZGV4KCZsb2NrX2ZpbGUsIDEpOworCisJaWYgKGNoZWNrX2luZGV4KSB7CisJCWlmIChyZWFkX2NhY2hlKCkgPCAwKQorCQkJZGllKCJ1bmFibGUgdG8gcmVhZCBpbmRleCBmaWxlIik7CisJfQorCisJaWYgKChjaGVjayB8fCBhcHBseSkgJiYKKwkgICAgY2hlY2tfcGF0Y2hfbGlzdChsaXN0KSA8IDAgJiYKKwkgICAgIWFwcGx5X3dpdGhfcmVqZWN0KQorCQlleGl0KDEpOworCisJaWYgKGFwcGx5ICYmIHdyaXRlX291dF9yZXN1bHRzKGxpc3QsIHNraXBwZWRfcGF0Y2gpKQorCQlleGl0KDEpOworCisJaWYgKGZha2VfYW5jZXN0b3IpCisJCWJ1aWxkX2Zha2VfYW5jZXN0b3IobGlzdCwgZmFrZV9hbmNlc3Rvcik7CisKKwlpZiAoZGlmZnN0YXQpCisJCXN0YXRfcGF0Y2hfbGlzdChsaXN0KTsKKworCWlmIChudW1zdGF0KQorCQludW1zdGF0X3BhdGNoX2xpc3QobGlzdCk7CisKKwlpZiAoc3VtbWFyeSkKKwkJc3VtbWFyeV9wYXRjaF9saXN0KGxpc3QpOworCisJc3RyYnVmX3JlbGVhc2UoJmJ1Zik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2l0X2FwcGx5X2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICghc3RyY21wKHZhciwgImFwcGx5LndoaXRlc3BhY2UiKSkgeworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIGNvbmZpZ19lcnJvcl9ub25ib29sKHZhcik7CisJCWFwcGx5X2RlZmF1bHRfd2hpdGVzcGFjZSA9IHhzdHJkdXAodmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGdpdF9kZWZhdWx0X2NvbmZpZyh2YXIsIHZhbHVlKTsKK30KKworCitpbnQgY21kX2FwcGx5KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqdW51c2VkX3ByZWZpeCkKK3sKKwlpbnQgaTsKKwlpbnQgcmVhZF9zdGRpbiA9IDE7CisJaW50IGluYWNjdXJhdGVfZW9mID0gMDsKKwlpbnQgZXJycyA9IDA7CisJaW50IGlzX25vdF9naXRkaXI7CisKKwljb25zdCBjaGFyICp3aGl0ZXNwYWNlX29wdGlvbiA9IE5VTEw7CisKKwlwcmVmaXggPSBzZXR1cF9naXRfZGlyZWN0b3J5X2dlbnRseSgmaXNfbm90X2dpdGRpcik7CisJcHJlZml4X2xlbmd0aCA9IHByZWZpeCA/IHN0cmxlbihwcmVmaXgpIDogMDsKKwlnaXRfY29uZmlnKGdpdF9hcHBseV9jb25maWcpOworCWlmIChhcHBseV9kZWZhdWx0X3doaXRlc3BhY2UpCisJCXBhcnNlX3doaXRlc3BhY2Vfb3B0aW9uKGFwcGx5X2RlZmF1bHRfd2hpdGVzcGFjZSk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCWNoYXIgKmVuZDsKKwkJaW50IGZkOworCisJCWlmICghc3RyY21wKGFyZywgIi0iKSkgeworCQkJZXJycyB8PSBhcHBseV9wYXRjaCgwLCAiPHN0ZGluPiIsIGluYWNjdXJhdGVfZW9mKTsKKwkJCXJlYWRfc3RkaW4gPSAwOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1leGNsdWRlPSIpKSB7CisJCQlzdHJ1Y3QgZXhjbHVkZXMgKnggPSB4bWFsbG9jKHNpemVvZigqeCkpOworCQkJeC0+cGF0aCA9IGFyZyArIDEwOworCQkJeC0+bmV4dCA9IGV4Y2x1ZGVzOworCQkJZXhjbHVkZXMgPSB4OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLXAiKSkgeworCQkJcF92YWx1ZSA9IGF0b2koYXJnICsgMik7CisJCQlwX3ZhbHVlX2tub3duID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tbm8tYWRkIikpIHsKKwkJCW5vX2FkZCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLXN0YXQiKSkgeworCQkJYXBwbHkgPSAwOworCQkJZGlmZnN0YXQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1hbGxvdy1iaW5hcnktcmVwbGFjZW1lbnQiKSB8fAorCQkgICAgIXN0cmNtcChhcmcsICItLWJpbmFyeSIpKSB7CisJCQljb250aW51ZTsgLyogbm93IG5vLW9wICovCisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1udW1zdGF0IikpIHsKKwkJCWFwcGx5ID0gMDsKKwkJCW51bXN0YXQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1zdW1tYXJ5IikpIHsKKwkJCWFwcGx5ID0gMDsKKwkJCXN1bW1hcnkgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1jaGVjayIpKSB7CisJCQlhcHBseSA9IDA7CisJCQljaGVjayA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWluZGV4IikpIHsKKwkJCWlmIChpc19ub3RfZ2l0ZGlyKQorCQkJCWRpZSgiLS1pbmRleCBvdXRzaWRlIGEgcmVwb3NpdG9yeSIpOworCQkJY2hlY2tfaW5kZXggPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1jYWNoZWQiKSkgeworCQkJaWYgKGlzX25vdF9naXRkaXIpCisJCQkJZGllKCItLWNhY2hlZCBvdXRzaWRlIGEgcmVwb3NpdG9yeSIpOworCQkJY2hlY2tfaW5kZXggPSAxOworCQkJY2FjaGVkID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tYXBwbHkiKSkgeworCQkJYXBwbHkgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1idWlsZC1mYWtlLWFuY2VzdG9yIikpIHsKKwkJCWFwcGx5ID0gMDsKKwkJCWlmICgrK2kgPj0gYXJnYykKKwkJCQlkaWUgKCJuZWVkIGEgZmlsZW5hbWUiKTsKKwkJCWZha2VfYW5jZXN0b3IgPSBhcmd2W2ldOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXoiKSkgeworCQkJbGluZV90ZXJtaW5hdGlvbiA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItQyIpKSB7CisJCQlwX2NvbnRleHQgPSBzdHJ0b3VsKGFyZyArIDIsICZlbmQsIDApOworCQkJaWYgKCplbmQgIT0gJ1wwJykKKwkJCQlkaWUoInVucmVjb2duaXplZCBjb250ZXh0IGNvdW50ICclcyciLCBhcmcgKyAyKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0td2hpdGVzcGFjZT0iKSkgeworCQkJd2hpdGVzcGFjZV9vcHRpb24gPSBhcmcgKyAxMzsKKwkJCXBhcnNlX3doaXRlc3BhY2Vfb3B0aW9uKGFyZyArIDEzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1SIikgfHwgIXN0cmNtcChhcmcsICItLXJldmVyc2UiKSkgeworCQkJYXBwbHlfaW5fcmV2ZXJzZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLXVuaWRpZmYtemVybyIpKSB7CisJCQl1bmlkaWZmX3plcm8gPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1yZWplY3QiKSkgeworCQkJYXBwbHkgPSBhcHBseV93aXRoX3JlamVjdCA9IGFwcGx5X3ZlcmJvc2VseSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItdiIpIHx8ICFzdHJjbXAoYXJnLCAiLS12ZXJib3NlIikpIHsKKwkJCWFwcGx5X3ZlcmJvc2VseSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWluYWNjdXJhdGUtZW9mIikpIHsKKwkJCWluYWNjdXJhdGVfZW9mID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgwIDwgcHJlZml4X2xlbmd0aCkKKwkJCWFyZyA9IHByZWZpeF9maWxlbmFtZShwcmVmaXgsIHByZWZpeF9sZW5ndGgsIGFyZyk7CisKKwkJZmQgPSBvcGVuKGFyZywgT19SRE9OTFkpOworCQlpZiAoZmQgPCAwKQorCQkJdXNhZ2UoYXBwbHlfdXNhZ2UpOworCQlyZWFkX3N0ZGluID0gMDsKKwkJc2V0X2RlZmF1bHRfd2hpdGVzcGFjZV9tb2RlKHdoaXRlc3BhY2Vfb3B0aW9uKTsKKwkJZXJycyB8PSBhcHBseV9wYXRjaChmZCwgYXJnLCBpbmFjY3VyYXRlX2VvZik7CisJCWNsb3NlKGZkKTsKKwl9CisJc2V0X2RlZmF1bHRfd2hpdGVzcGFjZV9tb2RlKHdoaXRlc3BhY2Vfb3B0aW9uKTsKKwlpZiAocmVhZF9zdGRpbikKKwkJZXJycyB8PSBhcHBseV9wYXRjaCgwLCAiPHN0ZGluPiIsIGluYWNjdXJhdGVfZW9mKTsKKwlpZiAod2hpdGVzcGFjZV9lcnJvcikgeworCQlpZiAoc3F1ZWxjaF93aGl0ZXNwYWNlX2Vycm9ycyAmJgorCQkgICAgc3F1ZWxjaF93aGl0ZXNwYWNlX2Vycm9ycyA8IHdoaXRlc3BhY2VfZXJyb3IpIHsKKwkJCWludCBzcXVlbGNoZWQgPQorCQkJCXdoaXRlc3BhY2VfZXJyb3IgLSBzcXVlbGNoX3doaXRlc3BhY2VfZXJyb3JzOworCQkJZnByaW50ZihzdGRlcnIsICJ3YXJuaW5nOiBzcXVlbGNoZWQgJWQgIgorCQkJCSJ3aGl0ZXNwYWNlIGVycm9yJXNcbiIsCisJCQkJc3F1ZWxjaGVkLAorCQkJCXNxdWVsY2hlZCA9PSAxID8gIiIgOiAicyIpOworCQl9CisJCWlmICh3c19lcnJvcl9hY3Rpb24gPT0gZGllX29uX3dzX2Vycm9yKQorCQkJZGllKCIlZCBsaW5lJXMgYWRkJXMgd2hpdGVzcGFjZSBlcnJvcnMuIiwKKwkJCSAgICB3aGl0ZXNwYWNlX2Vycm9yLAorCQkJICAgIHdoaXRlc3BhY2VfZXJyb3IgPT0gMSA/ICIiIDogInMiLAorCQkJICAgIHdoaXRlc3BhY2VfZXJyb3IgPT0gMSA/ICJzIiA6ICIiKTsKKwkJaWYgKGFwcGxpZWRfYWZ0ZXJfZml4aW5nX3dzICYmIGFwcGx5KQorCQkJZnByaW50ZihzdGRlcnIsICJ3YXJuaW5nOiAlZCBsaW5lJXMgYXBwbGllZCBhZnRlciIKKwkJCQkiIGZpeGluZyB3aGl0ZXNwYWNlIGVycm9ycy5cbiIsCisJCQkJYXBwbGllZF9hZnRlcl9maXhpbmdfd3MsCisJCQkJYXBwbGllZF9hZnRlcl9maXhpbmdfd3MgPT0gMSA/ICIiIDogInMiKTsKKwkJZWxzZSBpZiAod2hpdGVzcGFjZV9lcnJvcikKKwkJCWZwcmludGYoc3RkZXJyLCAid2FybmluZzogJWQgbGluZSVzIGFkZCVzIHdoaXRlc3BhY2UgZXJyb3JzLlxuIiwKKwkJCQl3aGl0ZXNwYWNlX2Vycm9yLAorCQkJCXdoaXRlc3BhY2VfZXJyb3IgPT0gMSA/ICIiIDogInMiLAorCQkJCXdoaXRlc3BhY2VfZXJyb3IgPT0gMSA/ICJzIiA6ICIiKTsKKwl9CisKKwlpZiAodXBkYXRlX2luZGV4KSB7CisJCWlmICh3cml0ZV9jYWNoZShuZXdmZCwgYWN0aXZlX2NhY2hlLCBhY3RpdmVfbnIpIHx8CisJCSAgICBjb21taXRfbG9ja2VkX2luZGV4KCZsb2NrX2ZpbGUpKQorCQkJZGllKCJVbmFibGUgdG8gd3JpdGUgbmV3IGluZGV4IGZpbGUiKTsKKwl9CisKKwlyZXR1cm4gISFlcnJzOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1hcmNoaXZlLmMgYi9idWlsdGluLWFyY2hpdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmUwYzFlCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1hcmNoaXZlLmMKQEAgLTAsMCArMSwyNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgRnJhbmNrIEJ1aS1IdXUKKyAqIENvcHlyaWdodCAoYykgMjAwNiBSZW5lIFNjaGFyZmUKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0cmVlLXdhbGsuaCIKKyNpbmNsdWRlICJleGVjX2NtZC5oIgorI2luY2x1ZGUgInBrdC1saW5lLmgiCisjaW5jbHVkZSAic2lkZWJhbmQuaCIKKyNpbmNsdWRlICJhdHRyLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGFyY2hpdmVfdXNhZ2VbXSA9IFwKKyJnaXQtYXJjaGl2ZSAtLWZvcm1hdD08Zm10PiBbLS1wcmVmaXg9PHByZWZpeD4vXSBbLS12ZXJib3NlXSBbPGV4dHJhPl0gPHRyZWUtaXNoPiBbcGF0aC4uLl0iOworCitzdGF0aWMgc3RydWN0IGFyY2hpdmVyX2Rlc2MKK3sKKwljb25zdCBjaGFyICpuYW1lOworCXdyaXRlX2FyY2hpdmVfZm5fdCB3cml0ZV9hcmNoaXZlOworCXBhcnNlX2V4dHJhX2FyZ3NfZm5fdCBwYXJzZV9leHRyYTsKK30gYXJjaGl2ZXJzW10gPSB7CisJeyAidGFyIiwgd3JpdGVfdGFyX2FyY2hpdmUsIE5VTEwgfSwKKwl7ICJ6aXAiLCB3cml0ZV96aXBfYXJjaGl2ZSwgcGFyc2VfZXh0cmFfemlwX2FyZ3MgfSwKK307CisKK3N0YXRpYyBpbnQgcnVuX3JlbW90ZV9hcmNoaXZlcihjb25zdCBjaGFyICpyZW1vdGUsIGludCBhcmdjLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKiphcmd2KQoreworCWNoYXIgKnVybCwgYnVmW0xBUkdFX1BBQ0tFVF9NQVhdOworCWludCBmZFsyXSwgaSwgbGVuLCBydjsKKwlzdHJ1Y3QgY2hpbGRfcHJvY2VzcyAqY29ubjsKKwljb25zdCBjaGFyICpleGVjID0gImdpdC11cGxvYWQtYXJjaGl2ZSI7CisJaW50IGV4ZWNfYXQgPSAwOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCQlpZiAoIXByZWZpeGNtcChhcmcsICItLWV4ZWM9IikpIHsKKwkJCWlmIChleGVjX2F0KQorCQkJCWRpZSgibXVsdGlwbGUgLS1leGVjIHNwZWNpZmllZCIpOworCQkJZXhlYyA9IGFyZyArIDc7CisJCQlleGVjX2F0ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJdXJsID0geHN0cmR1cChyZW1vdGUpOworCWNvbm4gPSBnaXRfY29ubmVjdChmZCwgdXJsLCBleGVjLCAwKTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJaWYgKGkgPT0gZXhlY19hdCkKKwkJCWNvbnRpbnVlOworCQlwYWNrZXRfd3JpdGUoZmRbMV0sICJhcmd1bWVudCAlc1xuIiwgYXJndltpXSk7CisJfQorCXBhY2tldF9mbHVzaChmZFsxXSk7CisKKwlsZW4gPSBwYWNrZXRfcmVhZF9saW5lKGZkWzBdLCBidWYsIHNpemVvZihidWYpKTsKKwlpZiAoIWxlbikKKwkJZGllKCJnaXQtYXJjaGl2ZTogZXhwZWN0ZWQgQUNLL05BSywgZ290IEVPRiIpOworCWlmIChidWZbbGVuLTFdID09ICdcbicpCisJCWJ1ZlstLWxlbl0gPSAwOworCWlmIChzdHJjbXAoYnVmLCAiQUNLIikpIHsKKwkJaWYgKGxlbiA+IDUgJiYgIXByZWZpeGNtcChidWYsICJOQUNLICIpKQorCQkJZGllKCJnaXQtYXJjaGl2ZTogTkFDSyAlcyIsIGJ1ZiArIDUpOworCQlkaWUoImdpdC1hcmNoaXZlOiBwcm90b2NvbCBlcnJvciIpOworCX0KKworCWxlbiA9IHBhY2tldF9yZWFkX2xpbmUoZmRbMF0sIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWlmIChsZW4pCisJCWRpZSgiZ2l0LWFyY2hpdmU6IGV4cGVjdGVkIGEgZmx1c2giKTsKKworCS8qIE5vdywgc3RhcnQgcmVhZGluZyBmcm9tIGZkWzBdIGFuZCBzcGl0IGl0IG91dCB0byBzdGRvdXQgKi8KKwlydiA9IHJlY3Zfc2lkZWJhbmQoImFyY2hpdmUiLCBmZFswXSwgMSwgMik7CisJY2xvc2UoZmRbMF0pOworCWNsb3NlKGZkWzFdKTsKKwlydiB8PSBmaW5pc2hfY29ubmVjdChjb25uKTsKKworCXJldHVybiAhIXJ2OworfQorCitzdGF0aWMgaW50IGluaXRfYXJjaGl2ZXIoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGFyY2hpdmVyICphcikKK3sKKwlpbnQgcnYgPSAtMSwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFyY2hpdmVycyk7IGkrKykgeworCQlpZiAoIXN0cmNtcChuYW1lLCBhcmNoaXZlcnNbaV0ubmFtZSkpIHsKKwkJCW1lbXNldChhciwgMCwgc2l6ZW9mKCphcikpOworCQkJYXItPm5hbWUgPSBhcmNoaXZlcnNbaV0ubmFtZTsKKwkJCWFyLT53cml0ZV9hcmNoaXZlID0gYXJjaGl2ZXJzW2ldLndyaXRlX2FyY2hpdmU7CisJCQlhci0+cGFyc2VfZXh0cmEgPSBhcmNoaXZlcnNbaV0ucGFyc2VfZXh0cmE7CisJCQlydiA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcnY7Cit9CisKK3ZvaWQgcGFyc2VfcGF0aHNwZWNfYXJnKGNvbnN0IGNoYXIgKipwYXRoc3BlYywgc3RydWN0IGFyY2hpdmVyX2FyZ3MgKmFyX2FyZ3MpCit7CisJYXJfYXJncy0+cGF0aHNwZWMgPSBnZXRfcGF0aHNwZWMoYXJfYXJncy0+YmFzZSwgcGF0aHNwZWMpOworfQorCit2b2lkIHBhcnNlX3RyZWVpc2hfYXJnKGNvbnN0IGNoYXIgKiphcmd2LCBzdHJ1Y3QgYXJjaGl2ZXJfYXJncyAqYXJfYXJncywKKwkJICAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwljb25zdCBjaGFyICpuYW1lID0gYXJndlswXTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpjb21taXRfc2hhMTsKKwl0aW1lX3QgYXJjaGl2ZV90aW1lOworCXN0cnVjdCB0cmVlICp0cmVlOworCWNvbnN0IHN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCisJaWYgKGdldF9zaGExKG5hbWUsIHNoYTEpKQorCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lIik7CisKKwljb21taXQgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZV9nZW50bHkoc2hhMSwgMSk7CisJaWYgKGNvbW1pdCkgeworCQljb21taXRfc2hhMSA9IGNvbW1pdC0+b2JqZWN0LnNoYTE7CisJCWFyY2hpdmVfdGltZSA9IGNvbW1pdC0+ZGF0ZTsKKwl9IGVsc2UgeworCQljb21taXRfc2hhMSA9IE5VTEw7CisJCWFyY2hpdmVfdGltZSA9IHRpbWUoTlVMTCk7CisJfQorCisJdHJlZSA9IHBhcnNlX3RyZWVfaW5kaXJlY3Qoc2hhMSk7CisJaWYgKHRyZWUgPT0gTlVMTCkKKwkJZGllKCJub3QgYSB0cmVlIG9iamVjdCIpOworCisJaWYgKHByZWZpeCkgeworCQl1bnNpZ25lZCBjaGFyIHRyZWVfc2hhMVsyMF07CisJCXVuc2lnbmVkIGludCBtb2RlOworCQlpbnQgZXJyOworCisJCWVyciA9IGdldF90cmVlX2VudHJ5KHRyZWUtPm9iamVjdC5zaGExLCBwcmVmaXgsCisJCQkJICAgICB0cmVlX3NoYTEsICZtb2RlKTsKKwkJaWYgKGVyciB8fCAhU19JU0RJUihtb2RlKSkKKwkJCWRpZSgiY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpcyB1bnRyYWNrZWQiKTsKKworCQl0cmVlID0gcGFyc2VfdHJlZV9pbmRpcmVjdCh0cmVlX3NoYTEpOworCX0KKwlhcl9hcmdzLT50cmVlID0gdHJlZTsKKwlhcl9hcmdzLT5jb21taXRfc2hhMSA9IGNvbW1pdF9zaGExOworCWFyX2FyZ3MtPmNvbW1pdCA9IGNvbW1pdDsKKwlhcl9hcmdzLT50aW1lID0gYXJjaGl2ZV90aW1lOworfQorCitpbnQgcGFyc2VfYXJjaGl2ZV9hcmdzKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgc3RydWN0IGFyY2hpdmVyICphcikKK3sKKwljb25zdCBjaGFyICpleHRyYV9hcmd2W01BWF9FWFRSQV9BUkdTXTsKKwlpbnQgZXh0cmFfYXJnYyA9IDA7CisJY29uc3QgY2hhciAqZm9ybWF0ID0gInRhciI7CisJY29uc3QgY2hhciAqYmFzZSA9ICIiOworCWludCB2ZXJib3NlID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoIXN0cmNtcChhcmcsICItLWxpc3QiKSB8fCAhc3RyY21wKGFyZywgIi1sIikpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFyY2hpdmVycyk7IGkrKykKKwkJCQlwcmludGYoIiVzXG4iLCBhcmNoaXZlcnNbaV0ubmFtZSk7CisJCQlleGl0KDApOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tdmVyYm9zZSIpIHx8ICFzdHJjbXAoYXJnLCAiLXYiKSkgeworCQkJdmVyYm9zZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItLWZvcm1hdD0iKSkgeworCQkJZm9ybWF0ID0gYXJnICsgOTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tcHJlZml4PSIpKSB7CisJCQliYXNlID0gYXJnICsgOTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tIikpIHsKKwkJCWkrKzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChhcmdbMF0gPT0gJy0nKSB7CisJCQlpZiAoZXh0cmFfYXJnYyA+IE1BWF9FWFRSQV9BUkdTIC0gMSkKKwkJCQlkaWUoIlRvbyBtYW55IGV4dHJhIG9wdGlvbnMiKTsKKwkJCWV4dHJhX2FyZ3ZbZXh0cmFfYXJnYysrXSA9IGFyZzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJyZWFrOworCX0KKworCS8qIFdlIG5lZWQgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciAtLSB0cmVlLWlzaCAqLworCWlmIChhcmdjIC0gMSA8IGkpCisJCXVzYWdlKGFyY2hpdmVfdXNhZ2UpOworCWlmIChpbml0X2FyY2hpdmVyKGZvcm1hdCwgYXIpIDwgMCkKKwkJZGllKCJVbmtub3duIGFyY2hpdmUgZm9ybWF0ICclcyciLCBmb3JtYXQpOworCisJaWYgKGV4dHJhX2FyZ2MpIHsKKwkJaWYgKCFhci0+cGFyc2VfZXh0cmEpCisJCQlkaWUoIiclcycgZm9ybWF0IGRvZXMgbm90IGhhbmRsZSAlcyIsCisJCQkgICAgYXItPm5hbWUsIGV4dHJhX2FyZ3ZbMF0pOworCQlhci0+YXJncy5leHRyYSA9IGFyLT5wYXJzZV9leHRyYShleHRyYV9hcmdjLCBleHRyYV9hcmd2KTsKKwl9CisJYXItPmFyZ3MudmVyYm9zZSA9IHZlcmJvc2U7CisJYXItPmFyZ3MuYmFzZSA9IGJhc2U7CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmV4dHJhY3RfcmVtb3RlX2FyZyhpbnQgKmFjLCBjb25zdCBjaGFyICoqYXYpCit7CisJaW50IGl4LCBpeSwgY250ID0gKmFjOworCWludCBub19tb3JlX29wdGlvbnMgPSAwOworCWNvbnN0IGNoYXIgKnJlbW90ZSA9IE5VTEw7CisKKwlmb3IgKGl4ID0gaXkgPSAxOyBpeCA8IGNudDsgaXgrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhdltpeF07CisJCWlmICghc3RyY21wKGFyZywgIi0tIikpCisJCQlub19tb3JlX29wdGlvbnMgPSAxOworCQlpZiAoIW5vX21vcmVfb3B0aW9ucykgeworCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1yZW1vdGU9IikpIHsKKwkJCQlpZiAocmVtb3RlKQorCQkJCQlkaWUoIk11bHRpcGxlIC0tcmVtb3RlIHNwZWNpZmllZCIpOworCQkJCXJlbW90ZSA9IGFyZyArIDk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoYXJnWzBdICE9ICctJykKKwkJCQlub19tb3JlX29wdGlvbnMgPSAxOworCQl9CisJCWlmIChpeCAhPSBpeSkKKwkJCWF2W2l5XSA9IGFyZzsKKwkJaXkrKzsKKwl9CisJaWYgKHJlbW90ZSkgeworCQlhdlstLWNudF0gPSBOVUxMOworCQkqYWMgPSBjbnQ7CisJfQorCXJldHVybiByZW1vdGU7Cit9CisKK2ludCBjbWRfYXJjaGl2ZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgYXJjaGl2ZXIgYXI7CisJaW50IHRyZWVfaWR4OworCWNvbnN0IGNoYXIgKnJlbW90ZSA9IE5VTEw7CisKKwlyZW1vdGUgPSBleHRyYWN0X3JlbW90ZV9hcmcoJmFyZ2MsIGFyZ3YpOworCWlmIChyZW1vdGUpCisJCXJldHVybiBydW5fcmVtb3RlX2FyY2hpdmVyKHJlbW90ZSwgYXJnYywgYXJndik7CisKKwlzZXR2YnVmKHN0ZGVyciwgTlVMTCwgX0lPTEJGLCBCVUZTSVopOworCisJbWVtc2V0KCZhciwgMCwgc2l6ZW9mKGFyKSk7CisJdHJlZV9pZHggPSBwYXJzZV9hcmNoaXZlX2FyZ3MoYXJnYywgYXJndiwgJmFyKTsKKwlpZiAocHJlZml4ID09IE5VTEwpCisJCXByZWZpeCA9IHNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKworCWFyZ3YgKz0gdHJlZV9pZHg7CisJcGFyc2VfdHJlZWlzaF9hcmcoYXJndiwgJmFyLmFyZ3MsIHByZWZpeCk7CisJcGFyc2VfcGF0aHNwZWNfYXJnKGFyZ3YgKyAxLCAmYXIuYXJncyk7CisKKwlyZXR1cm4gYXIud3JpdGVfYXJjaGl2ZSgmYXIuYXJncyk7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWJsYW1lLmMgYi9idWlsdGluLWJsYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZkNTYyZAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tYmxhbWUuYwpAQCAtMCwwICsxLDI0NTIgQEAKKy8qCisgKiBQaWNrYXhlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCBKdW5pbyBDIEhhbWFubworICovCisKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgImRpZmZjb3JlLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorI2luY2x1ZGUgInhkaWZmLWludGVyZmFjZS5oIgorI2luY2x1ZGUgImNhY2hlLXRyZWUuaCIKKyNpbmNsdWRlICJwYXRoLWxpc3QuaCIKKyNpbmNsdWRlICJtYWlsbWFwLmgiCisKK3N0YXRpYyBjaGFyIGJsYW1lX3VzYWdlW10gPQorImdpdC1ibGFtZSBbLWNdIFstYl0gWy1sXSBbLS1yb290XSBbLXRdIFstZl0gWy1uXSBbLXNdIFstcF0gWy13XSBbLUwgbixtXSBbLVMgPHJldnMtZmlsZT5dIFstTV0gWy1DXSBbLUNdIFstLWNvbnRlbnRzIDxmaWxlbmFtZT5dIFstLWluY3JlbWVudGFsXSBbY29tbWl0XSBbLS1dIGZpbGVcbiIKKyIgIC1jICAgICAgICAgICAgICAgICAgVXNlIHRoZSBzYW1lIG91dHB1dCBtb2RlIGFzIGdpdC1hbm5vdGF0ZSAoRGVmYXVsdDogb2ZmKVxuIgorIiAgLWIgICAgICAgICAgICAgICAgICBTaG93IGJsYW5rIFNIQS0xIGZvciBib3VuZGFyeSBjb21taXRzIChEZWZhdWx0OiBvZmYpXG4iCisiICAtbCAgICAgICAgICAgICAgICAgIFNob3cgbG9uZyBjb21taXQgU0hBMSAoRGVmYXVsdDogb2ZmKVxuIgorIiAgLS1yb290ICAgICAgICAgICAgICBEbyBub3QgdHJlYXQgcm9vdCBjb21taXRzIGFzIGJvdW5kYXJpZXMgKERlZmF1bHQ6IG9mZilcbiIKKyIgIC10ICAgICAgICAgICAgICAgICAgU2hvdyByYXcgdGltZXN0YW1wIChEZWZhdWx0OiBvZmYpXG4iCisiICAtZiwgLS1zaG93LW5hbWUgICAgIFNob3cgb3JpZ2luYWwgZmlsZW5hbWUgKERlZmF1bHQ6IGF1dG8pXG4iCisiICAtbiwgLS1zaG93LW51bWJlciAgIFNob3cgb3JpZ2luYWwgbGluZW51bWJlciAoRGVmYXVsdDogb2ZmKVxuIgorIiAgLXMgICAgICAgICAgICAgICAgICBTdXBwcmVzcyBhdXRob3IgbmFtZSBhbmQgdGltZXN0YW1wIChEZWZhdWx0OiBvZmYpXG4iCisiICAtcCwgLS1wb3JjZWxhaW4gICAgIFNob3cgaW4gYSBmb3JtYXQgZGVzaWduZWQgZm9yIG1hY2hpbmUgY29uc3VtcHRpb25cbiIKKyIgIC13ICAgICAgICAgICAgICAgICAgSWdub3JlIHdoaXRlc3BhY2UgZGlmZmVyZW5jZXNcbiIKKyIgIC1MIG4sbSAgICAgICAgICAgICAgUHJvY2VzcyBvbmx5IGxpbmUgcmFuZ2UgbixtLCBjb3VudGluZyBmcm9tIDFcbiIKKyIgIC1NLCAtQyAgICAgICAgICAgICAgRmluZCBsaW5lIG1vdmVtZW50cyB3aXRoaW4gYW5kIGFjcm9zcyBmaWxlc1xuIgorIiAgLS1pbmNyZW1lbnRhbCAgICAgICBTaG93IGJsYW1lIGVudHJpZXMgYXMgd2UgZmluZCB0aGVtLCBpbmNyZW1lbnRhbGx5XG4iCisiICAtLWNvbnRlbnRzIGZpbGUgICAgIFVzZSA8ZmlsZT4ncyBjb250ZW50cyBhcyB0aGUgZmluYWwgaW1hZ2VcbiIKKyIgIC1TIHJldnMtZmlsZSAgICAgICAgVXNlIHJldmlzaW9ucyBmcm9tIHJldnMtZmlsZSBpbnN0ZWFkIG9mIGNhbGxpbmcgZ2l0LXJldi1saXN0XG4iOworCitzdGF0aWMgaW50IGxvbmdlc3RfZmlsZTsKK3N0YXRpYyBpbnQgbG9uZ2VzdF9hdXRob3I7CitzdGF0aWMgaW50IG1heF9vcmlnX2RpZ2l0czsKK3N0YXRpYyBpbnQgbWF4X2RpZ2l0czsKK3N0YXRpYyBpbnQgbWF4X3Njb3JlX2RpZ2l0czsKK3N0YXRpYyBpbnQgc2hvd19yb290Oworc3RhdGljIGludCBibGFua19ib3VuZGFyeTsKK3N0YXRpYyBpbnQgaW5jcmVtZW50YWw7CitzdGF0aWMgaW50IGNtZF9pc19hbm5vdGF0ZTsKK3N0YXRpYyBpbnQgeGRsX29wdHMgPSBYREZfTkVFRF9NSU5JTUFMOworc3RhdGljIHN0cnVjdCBwYXRoX2xpc3QgbWFpbG1hcDsKKworI2lmbmRlZiBERUJVRworI2RlZmluZSBERUJVRyAwCisjZW5kaWYKKworLyogc3RhdHMgKi8KK3N0YXRpYyBpbnQgbnVtX3JlYWRfYmxvYjsKK3N0YXRpYyBpbnQgbnVtX2dldF9wYXRjaDsKK3N0YXRpYyBpbnQgbnVtX2NvbW1pdHM7CisKKyNkZWZpbmUgUElDS0FYRV9CTEFNRV9NT1ZFCQkwMQorI2RlZmluZSBQSUNLQVhFX0JMQU1FX0NPUFkJCTAyCisjZGVmaW5lIFBJQ0tBWEVfQkxBTUVfQ09QWV9IQVJERVIJMDQKKyNkZWZpbmUgUElDS0FYRV9CTEFNRV9DT1BZX0hBUkRFU1QJMDEwCisKKy8qCisgKiBibGFtZSBmb3IgYSBibGFtZV9lbnRyeSB3aXRoIHNjb3JlIGxvd2VyIHRoYW4gdGhlc2UgdGhyZXNob2xkcworICogaXMgbm90IHBhc3NlZCB0byB0aGUgcGFyZW50IHVzaW5nIG1vdmUvY29weSBsb2dpYy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGJsYW1lX21vdmVfc2NvcmU7CitzdGF0aWMgdW5zaWduZWQgYmxhbWVfY29weV9zY29yZTsKKyNkZWZpbmUgQkxBTUVfREVGQVVMVF9NT1ZFX1NDT1JFCTIwCisjZGVmaW5lIEJMQU1FX0RFRkFVTFRfQ09QWV9TQ09SRQk0MAorCisvKiBiaXRzICMwLi43IGluIHJldmlzaW9uLmgsICM4Li4xMSB1c2VkIGZvciBtZXJnZV9iYXNlcygpIGluIGNvbW1pdC5jICovCisjZGVmaW5lIE1FVEFJTkZPX1NIT1dOCQkoMXU8PDEyKQorI2RlZmluZSBNT1JFX1RIQU5fT05FX1BBVEgJKDF1PDwxMykKKworLyoKKyAqIE9uZSBibG9iIGluIGEgY29tbWl0IHRoYXQgaXMgYmVpbmcgc3VzcGVjdGVkCisgKi8KK3N0cnVjdCBvcmlnaW4geworCWludCByZWZjbnQ7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCW1tZmlsZV90IGZpbGU7CisJdW5zaWduZWQgY2hhciBibG9iX3NoYTFbMjBdOworCWNoYXIgcGF0aFtGTEVYX0FSUkFZXTsKK307CisKKy8qCisgKiBHaXZlbiBhbiBvcmlnaW4sIHByZXBhcmUgbW1maWxlX3Qgc3RydWN0dXJlIHRvIGJlIHVzZWQgYnkgdGhlCisgKiBkaWZmIG1hY2hpbmVyeQorICovCitzdGF0aWMgY2hhciAqZmlsbF9vcmlnaW5fYmxvYihzdHJ1Y3Qgb3JpZ2luICpvLCBtbWZpbGVfdCAqZmlsZSkKK3sKKwlpZiAoIW8tPmZpbGUucHRyKSB7CisJCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwkJbnVtX3JlYWRfYmxvYisrOworCQlmaWxlLT5wdHIgPSByZWFkX3NoYTFfZmlsZShvLT5ibG9iX3NoYTEsICZ0eXBlLAorCQkJCQkgICAodW5zaWduZWQgbG9uZyAqKSgmKGZpbGUtPnNpemUpKSk7CisJCWlmICghZmlsZS0+cHRyKQorCQkJZGllKCJDYW5ub3QgcmVhZCBibG9iICVzIGZvciBwYXRoICVzIiwKKwkJCSAgICBzaGExX3RvX2hleChvLT5ibG9iX3NoYTEpLAorCQkJICAgIG8tPnBhdGgpOworCQlvLT5maWxlID0gKmZpbGU7CisJfQorCWVsc2UKKwkJKmZpbGUgPSBvLT5maWxlOworCXJldHVybiBmaWxlLT5wdHI7Cit9CisKKy8qCisgKiBPcmlnaW4gaXMgcmVmY291bnRlZCBhbmQgdXN1YWxseSB3ZSBrZWVwIHRoZSBibG9iIGNvbnRlbnRzIHRvIGJlCisgKiByZXVzZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG9yaWdpbiAqb3JpZ2luX2luY3JlZihzdHJ1Y3Qgb3JpZ2luICpvKQoreworCWlmIChvKQorCQlvLT5yZWZjbnQrKzsKKwlyZXR1cm4gbzsKK30KKworc3RhdGljIHZvaWQgb3JpZ2luX2RlY3JlZihzdHJ1Y3Qgb3JpZ2luICpvKQoreworCWlmIChvICYmIC0tby0+cmVmY250IDw9IDApIHsKKwkJZnJlZShvLT5maWxlLnB0cik7CisJCWZyZWUobyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkcm9wX29yaWdpbl9ibG9iKHN0cnVjdCBvcmlnaW4gKm8pCit7CisJaWYgKG8tPmZpbGUucHRyKSB7CisJCWZyZWUoby0+ZmlsZS5wdHIpOworCQlvLT5maWxlLnB0ciA9IE5VTEw7CisJfQorfQorCisvKgorICogRWFjaCBncm91cCBvZiBsaW5lcyBpcyBkZXNjcmliZWQgYnkgYSBibGFtZV9lbnRyeTsgaXQgY2FuIGJlIHNwbGl0CisgKiBhcyB3ZSBwYXNzIGJsYW1lIHRvIHRoZSBwYXJlbnRzLiAgVGhleSBmb3JtIGEgbGlua2VkIGxpc3QgaW4gdGhlCisgKiBzY29yZWJvYXJkIHN0cnVjdHVyZSwgc29ydGVkIGJ5IHRoZSB0YXJnZXQgbGluZSBudW1iZXIuCisgKi8KK3N0cnVjdCBibGFtZV9lbnRyeSB7CisJc3RydWN0IGJsYW1lX2VudHJ5ICpwcmV2OworCXN0cnVjdCBibGFtZV9lbnRyeSAqbmV4dDsKKworCS8qIHRoZSBmaXJzdCBsaW5lIG9mIHRoaXMgZ3JvdXAgaW4gdGhlIGZpbmFsIGltYWdlOworCSAqIGludGVybmFsbHkgYWxsIGxpbmUgbnVtYmVycyBhcmUgMCBiYXNlZC4KKwkgKi8KKwlpbnQgbG5vOworCisJLyogaG93IG1hbnkgbGluZXMgdGhpcyBncm91cCBoYXMgKi8KKwlpbnQgbnVtX2xpbmVzOworCisJLyogdGhlIGNvbW1pdCB0aGF0IGludHJvZHVjZWQgdGhpcyBncm91cCBpbnRvIHRoZSBmaW5hbCBpbWFnZSAqLworCXN0cnVjdCBvcmlnaW4gKnN1c3BlY3Q7CisKKwkvKiB0cnVlIGlmIHRoZSBzdXNwZWN0IGlzIHRydWx5IGd1aWx0eTsgZmFsc2Ugd2hpbGUgd2UgaGF2ZSBub3QKKwkgKiBjaGVja2VkIGlmIHRoZSBncm91cCBjYW1lIGZyb20gb25lIG9mIGl0cyBwYXJlbnRzLgorCSAqLworCWNoYXIgZ3VpbHR5OworCisJLyogdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBmaXJzdCBsaW5lIG9mIHRoaXMgZ3JvdXAgaW4gdGhlCisJICogc3VzcGVjdCdzIGZpbGU7IGludGVybmFsbHkgYWxsIGxpbmUgbnVtYmVycyBhcmUgMCBiYXNlZC4KKwkgKi8KKwlpbnQgc19sbm87CisKKwkvKiBob3cgc2lnbmlmaWNhbnQgdGhpcyBlbnRyeSBpcyAtLSBjYWNoZWQgdG8gYXZvaWQKKwkgKiBzY2FubmluZyB0aGUgbGluZXMgb3ZlciBhbmQgb3Zlci4KKwkgKi8KKwl1bnNpZ25lZCBzY29yZTsKK307CisKKy8qCisgKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYmxhbWUgYXNzaWdubWVudC4KKyAqLworc3RydWN0IHNjb3JlYm9hcmQgeworCS8qIHRoZSBmaW5hbCBjb21taXQgKGkuZS4gd2hlcmUgd2Ugc3RhcnRlZCBkaWdnaW5nIGZyb20pICovCisJc3RydWN0IGNvbW1pdCAqZmluYWw7CisKKwljb25zdCBjaGFyICpwYXRoOworCisJLyoKKwkgKiBUaGUgY29udGVudHMgaW4gdGhlIGZpbmFsIGltYWdlLgorCSAqIFVzZWQgYnkgbWFueSBmdW5jdGlvbnMgdG8gb2J0YWluIGNvbnRlbnRzIG9mIHRoZSBudGggbGluZSwKKwkgKiBpbmRleGVkIHdpdGggc2NvcmVib2FyZC5saW5lbm9bYmxhbWVfZW50cnkubG5vXS4KKwkgKi8KKwljb25zdCBjaGFyICpmaW5hbF9idWY7CisJdW5zaWduZWQgbG9uZyBmaW5hbF9idWZfc2l6ZTsKKworCS8qIGxpbmtlZCBsaXN0IG9mIGJsYW1lcyAqLworCXN0cnVjdCBibGFtZV9lbnRyeSAqZW50OworCisJLyogbG9vay11cCBhIGxpbmUgaW4gdGhlIGZpbmFsIGJ1ZmZlciAqLworCWludCBudW1fbGluZXM7CisJaW50ICpsaW5lbm87Cit9OworCitzdGF0aWMgaW5saW5lIGludCBzYW1lX3N1c3BlY3Qoc3RydWN0IG9yaWdpbiAqYSwgc3RydWN0IG9yaWdpbiAqYikKK3sKKwlpZiAoYSA9PSBiKQorCQlyZXR1cm4gMTsKKwlpZiAoYS0+Y29tbWl0ICE9IGItPmNvbW1pdCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuICFzdHJjbXAoYS0+cGF0aCwgYi0+cGF0aCk7Cit9CisKK3N0YXRpYyB2b2lkIHNhbml0eV9jaGVja19yZWZjbnQoc3RydWN0IHNjb3JlYm9hcmQgKik7CisKKy8qCisgKiBJZiB0d28gYmxhbWUgZW50cmllcyB0aGF0IGFyZSBuZXh0IHRvIGVhY2ggb3RoZXIgY2FtZSBmcm9tCisgKiBjb250aWd1b3VzIGxpbmVzIGluIHRoZSBzYW1lIG9yaWdpbiAoaS5lLiA8Y29tbWl0LCBwYXRoPiBwYWlyKSwKKyAqIG1lcmdlIHRoZW0gdG9nZXRoZXIuCisgKi8KK3N0YXRpYyB2b2lkIGNvYWxlc2NlKHN0cnVjdCBzY29yZWJvYXJkICpzYikKK3sKKwlzdHJ1Y3QgYmxhbWVfZW50cnkgKmVudCwgKm5leHQ7CisKKwlmb3IgKGVudCA9IHNiLT5lbnQ7IGVudCAmJiAobmV4dCA9IGVudC0+bmV4dCk7IGVudCA9IG5leHQpIHsKKwkJaWYgKHNhbWVfc3VzcGVjdChlbnQtPnN1c3BlY3QsIG5leHQtPnN1c3BlY3QpICYmCisJCSAgICBlbnQtPmd1aWx0eSA9PSBuZXh0LT5ndWlsdHkgJiYKKwkJICAgIGVudC0+c19sbm8gKyBlbnQtPm51bV9saW5lcyA9PSBuZXh0LT5zX2xubykgeworCQkJZW50LT5udW1fbGluZXMgKz0gbmV4dC0+bnVtX2xpbmVzOworCQkJZW50LT5uZXh0ID0gbmV4dC0+bmV4dDsKKwkJCWlmIChlbnQtPm5leHQpCisJCQkJZW50LT5uZXh0LT5wcmV2ID0gZW50OworCQkJb3JpZ2luX2RlY3JlZihuZXh0LT5zdXNwZWN0KTsKKwkJCWZyZWUobmV4dCk7CisJCQllbnQtPnNjb3JlID0gMDsKKwkJCW5leHQgPSBlbnQ7IC8qIGFnYWluICovCisJCX0KKwl9CisKKwlpZiAoREVCVUcpIC8qIHNhbml0eSAqLworCQlzYW5pdHlfY2hlY2tfcmVmY250KHNiKTsKK30KKworLyoKKyAqIEdpdmVuIGEgY29tbWl0IGFuZCBhIHBhdGggaW4gaXQsIGNyZWF0ZSBhIG5ldyBvcmlnaW4gc3RydWN0dXJlLgorICogVGhlIGNhbGxlcnMgdGhhdCBhZGQgYmxhbWUgdG8gdGhlIHNjb3JlYm9hcmQgc2hvdWxkIHVzZQorICogZ2V0X29yaWdpbigpIHRvIG9idGFpbiBzaGFyZWQsIHJlZmNvdW50ZWQgY29weSBpbnN0ZWFkIG9mIGNhbGxpbmcKKyAqIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgb3JpZ2luICptYWtlX29yaWdpbihzdHJ1Y3QgY29tbWl0ICpjb21taXQsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc3RydWN0IG9yaWdpbiAqbzsKKwlvID0geGNhbGxvYygxLCBzaXplb2YoKm8pICsgc3RybGVuKHBhdGgpICsgMSk7CisJby0+Y29tbWl0ID0gY29tbWl0OworCW8tPnJlZmNudCA9IDE7CisJc3RyY3B5KG8tPnBhdGgsIHBhdGgpOworCXJldHVybiBvOworfQorCisvKgorICogTG9jYXRlIGFuIGV4aXN0aW5nIG9yaWdpbiBvciBjcmVhdGUgYSBuZXcgb25lLgorICovCitzdGF0aWMgc3RydWN0IG9yaWdpbiAqZ2V0X29yaWdpbihzdHJ1Y3Qgc2NvcmVib2FyZCAqc2IsCisJCQkJIHN0cnVjdCBjb21taXQgKmNvbW1pdCwKKwkJCQkgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3QgYmxhbWVfZW50cnkgKmU7CisKKwlmb3IgKGUgPSBzYi0+ZW50OyBlOyBlID0gZS0+bmV4dCkgeworCQlpZiAoZS0+c3VzcGVjdC0+Y29tbWl0ID09IGNvbW1pdCAmJgorCQkgICAgIXN0cmNtcChlLT5zdXNwZWN0LT5wYXRoLCBwYXRoKSkKKwkJCXJldHVybiBvcmlnaW5faW5jcmVmKGUtPnN1c3BlY3QpOworCX0KKwlyZXR1cm4gbWFrZV9vcmlnaW4oY29tbWl0LCBwYXRoKTsKK30KKworLyoKKyAqIEZpbGwgdGhlIGJsb2Jfc2hhMSBmaWVsZCBvZiBhbiBvcmlnaW4gaWYgaXQgaGFzbid0LCBzbyB0aGF0IGxhdGVyCisgKiBjYWxsIHRvIGZpbGxfb3JpZ2luX2Jsb2IoKSBjYW4gdXNlIGl0IHRvIGxvY2F0ZSB0aGUgZGF0YS4gIGJsb2Jfc2hhMQorICogZm9yIGFuIG9yaWdpbiBpcyBhbHNvIHVzZWQgdG8gcGFzcyB0aGUgYmxhbWUgZm9yIHRoZSBlbnRpcmUgZmlsZSB0bworICogdGhlIHBhcmVudCB0byBkZXRlY3QgdGhlIGNhc2Ugd2hlcmUgYSBjaGlsZCdzIGJsb2IgaXMgaWRlbnRpY2FsIHRvCisgKiB0aGF0IG9mIGl0cyBwYXJlbnQncy4KKyAqLworc3RhdGljIGludCBmaWxsX2Jsb2Jfc2hhMShzdHJ1Y3Qgb3JpZ2luICpvcmlnaW4pCit7CisJdW5zaWduZWQgbW9kZTsKKworCWlmICghaXNfbnVsbF9zaGExKG9yaWdpbi0+YmxvYl9zaGExKSkKKwkJcmV0dXJuIDA7CisJaWYgKGdldF90cmVlX2VudHJ5KG9yaWdpbi0+Y29tbWl0LT5vYmplY3Quc2hhMSwKKwkJCSAgIG9yaWdpbi0+cGF0aCwKKwkJCSAgIG9yaWdpbi0+YmxvYl9zaGExLCAmbW9kZSkpCisJCWdvdG8gZXJyb3Jfb3V0OworCWlmIChzaGExX29iamVjdF9pbmZvKG9yaWdpbi0+YmxvYl9zaGExLCBOVUxMKSAhPSBPQkpfQkxPQikKKwkJZ290byBlcnJvcl9vdXQ7CisJcmV0dXJuIDA7CisgZXJyb3Jfb3V0OgorCWhhc2hjbHIob3JpZ2luLT5ibG9iX3NoYTEpOworCXJldHVybiAtMTsKK30KKworLyoKKyAqIFdlIGhhdmUgYW4gb3JpZ2luIC0tIGNoZWNrIGlmIHRoZSBzYW1lIHBhdGggZXhpc3RzIGluIHRoZQorICogcGFyZW50IGFuZCByZXR1cm4gYW4gb3JpZ2luIHN0cnVjdHVyZSB0byByZXByZXNlbnQgaXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgb3JpZ2luICpmaW5kX29yaWdpbihzdHJ1Y3Qgc2NvcmVib2FyZCAqc2IsCisJCQkJICBzdHJ1Y3QgY29tbWl0ICpwYXJlbnQsCisJCQkJICBzdHJ1Y3Qgb3JpZ2luICpvcmlnaW4pCit7CisJc3RydWN0IG9yaWdpbiAqcG9yaWdpbiA9IE5VTEw7CisJc3RydWN0IGRpZmZfb3B0aW9ucyBkaWZmX29wdHM7CisJY29uc3QgY2hhciAqcGF0aHNbMl07CisKKwlpZiAocGFyZW50LT51dGlsKSB7CisJCS8qCisJCSAqIEVhY2ggY29tbWl0IG9iamVjdCBjYW4gY2FjaGUgb25lIG9yaWdpbiBpbiB0aGF0CisJCSAqIGNvbW1pdC4gIFRoaXMgaXMgYSBmcmVlc3RhbmRpbmcgY29weSBvZiBvcmlnaW4gYW5kCisJCSAqIG5vdCByZWZjb3VudGVkLgorCQkgKi8KKwkJc3RydWN0IG9yaWdpbiAqY2FjaGVkID0gcGFyZW50LT51dGlsOworCQlpZiAoIXN0cmNtcChjYWNoZWQtPnBhdGgsIG9yaWdpbi0+cGF0aCkpIHsKKwkJCS8qCisJCQkgKiBUaGUgc2FtZSBwYXRoIGJldHdlZW4gb3JpZ2luIGFuZCBpdHMgcGFyZW50CisJCQkgKiB3aXRob3V0IHJlbmFtaW5nIC0tIHRoZSBtb3N0IGNvbW1vbiBjYXNlLgorCQkJICovCisJCQlwb3JpZ2luID0gZ2V0X29yaWdpbihzYiwgcGFyZW50LCBjYWNoZWQtPnBhdGgpOworCisJCQkvKgorCQkJICogSWYgdGhlIG9yaWdpbiB3YXMgbmV3bHkgY3JlYXRlZCAoaS5lLiBnZXRfb3JpZ2luCisJCQkgKiB3b3VsZCBjYWxsIG1ha2Vfb3JpZ2luIGlmIG5vbmUgaXMgZm91bmQgaW4gdGhlCisJCQkgKiBzY29yZWJvYXJkKSwgaXQgZG9lcyBub3Qga25vdyB0aGUgYmxvYl9zaGExLAorCQkJICogc28gY29weSBpdC4gIE90aGVyd2lzZSBwb3JpZ2luIHdhcyBpbiB0aGUKKwkJCSAqIHNjb3JlYm9hcmQgYW5kIGFscmVhZHkga25vd3MgYmxvYl9zaGExLgorCQkJICovCisJCQlpZiAocG9yaWdpbi0+cmVmY250ID09IDEpCisJCQkJaGFzaGNweShwb3JpZ2luLT5ibG9iX3NoYTEsIGNhY2hlZC0+YmxvYl9zaGExKTsKKwkJCXJldHVybiBwb3JpZ2luOworCQl9CisJCS8qIG90aGVyd2lzZSBpdCB3YXMgbm90IHZlcnkgdXNlZnVsOyBmcmVlIGl0ICovCisJCWZyZWUocGFyZW50LT51dGlsKTsKKwkJcGFyZW50LT51dGlsID0gTlVMTDsKKwl9CisKKwkvKiBTZWUgaWYgdGhlIG9yaWdpbi0+cGF0aCBpcyBkaWZmZXJlbnQgYmV0d2VlbiBwYXJlbnQKKwkgKiBhbmQgb3JpZ2luIGZpcnN0LiAgTW9zdCBvZiB0aGUgdGltZSB0aGV5IGFyZSB0aGUKKwkgKiBzYW1lIGFuZCBkaWZmLXRyZWUgaXMgZmFpcmx5IGVmZmljaWVudCBhYm91dCB0aGlzLgorCSAqLworCWRpZmZfc2V0dXAoJmRpZmZfb3B0cyk7CisJRElGRl9PUFRfU0VUKCZkaWZmX29wdHMsIFJFQ1VSU0lWRSk7CisJZGlmZl9vcHRzLmRldGVjdF9yZW5hbWUgPSAwOworCWRpZmZfb3B0cy5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfTk9fT1VUUFVUOworCXBhdGhzWzBdID0gb3JpZ2luLT5wYXRoOworCXBhdGhzWzFdID0gTlVMTDsKKworCWRpZmZfdHJlZV9zZXR1cF9wYXRocyhwYXRocywgJmRpZmZfb3B0cyk7CisJaWYgKGRpZmZfc2V0dXBfZG9uZSgmZGlmZl9vcHRzKSA8IDApCisJCWRpZSgiZGlmZi1zZXR1cCIpOworCisJaWYgKGlzX251bGxfc2hhMShvcmlnaW4tPmNvbW1pdC0+b2JqZWN0LnNoYTEpKQorCQlkb19kaWZmX2NhY2hlKHBhcmVudC0+dHJlZS0+b2JqZWN0LnNoYTEsICZkaWZmX29wdHMpOworCWVsc2UKKwkJZGlmZl90cmVlX3NoYTEocGFyZW50LT50cmVlLT5vYmplY3Quc2hhMSwKKwkJCSAgICAgICBvcmlnaW4tPmNvbW1pdC0+dHJlZS0+b2JqZWN0LnNoYTEsCisJCQkgICAgICAgIiIsICZkaWZmX29wdHMpOworCWRpZmZjb3JlX3N0ZCgmZGlmZl9vcHRzKTsKKworCS8qIEl0IGlzIGVpdGhlciBvbmUgZW50cnkgdGhhdCBzYXlzICJtb2RpZmllZCIsIG9yICJjcmVhdGVkIiwKKwkgKiBvciBub3RoaW5nLgorCSAqLworCWlmICghZGlmZl9xdWV1ZWRfZGlmZi5ucikgeworCQkvKiBUaGUgcGF0aCBpcyB0aGUgc2FtZSBhcyBwYXJlbnQgKi8KKwkJcG9yaWdpbiA9IGdldF9vcmlnaW4oc2IsIHBhcmVudCwgb3JpZ2luLT5wYXRoKTsKKwkJaGFzaGNweShwb3JpZ2luLT5ibG9iX3NoYTEsIG9yaWdpbi0+YmxvYl9zaGExKTsKKwl9CisJZWxzZSBpZiAoZGlmZl9xdWV1ZWRfZGlmZi5uciAhPSAxKQorCQlkaWUoImludGVybmFsIGVycm9yIGluIGJsYW1lOjpmaW5kX29yaWdpbiIpOworCWVsc2UgeworCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCA9IGRpZmZfcXVldWVkX2RpZmYucXVldWVbMF07CisJCXN3aXRjaCAocC0+c3RhdHVzKSB7CisJCWRlZmF1bHQ6CisJCQlkaWUoImludGVybmFsIGVycm9yIGluIGJsYW1lOjpmaW5kX29yaWdpbiAoJWMpIiwKKwkJCSAgICBwLT5zdGF0dXMpOworCQljYXNlICdNJzoKKwkJCXBvcmlnaW4gPSBnZXRfb3JpZ2luKHNiLCBwYXJlbnQsIG9yaWdpbi0+cGF0aCk7CisJCQloYXNoY3B5KHBvcmlnaW4tPmJsb2Jfc2hhMSwgcC0+b25lLT5zaGExKTsKKwkJCWJyZWFrOworCQljYXNlICdBJzoKKwkJY2FzZSAnVCc6CisJCQkvKiBEaWQgbm90IGV4aXN0IGluIHBhcmVudCwgb3IgdHlwZSBjaGFuZ2VkICovCisJCQlicmVhazsKKwkJfQorCX0KKwlkaWZmX2ZsdXNoKCZkaWZmX29wdHMpOworCWRpZmZfdHJlZV9yZWxlYXNlX3BhdGhzKCZkaWZmX29wdHMpOworCWlmIChwb3JpZ2luKSB7CisJCS8qCisJCSAqIENyZWF0ZSBhIGZyZWVzdGFuZGluZyBjb3B5IHRoYXQgaXMgbm90IHBhcnQgb2YKKwkJICogdGhlIHJlZmNvdW50ZWQgb3JpZ2luIGZvdW5kIGluIHRoZSBzY29yZWJvYXJkLCBhbmQKKwkJICogY2FjaGUgaXQgaW4gdGhlIGNvbW1pdC4KKwkJICovCisJCXN0cnVjdCBvcmlnaW4gKmNhY2hlZDsKKworCQljYWNoZWQgPSBtYWtlX29yaWdpbihwb3JpZ2luLT5jb21taXQsIHBvcmlnaW4tPnBhdGgpOworCQloYXNoY3B5KGNhY2hlZC0+YmxvYl9zaGExLCBwb3JpZ2luLT5ibG9iX3NoYTEpOworCQlwYXJlbnQtPnV0aWwgPSBjYWNoZWQ7CisJfQorCXJldHVybiBwb3JpZ2luOworfQorCisvKgorICogV2UgaGF2ZSBhbiBvcmlnaW4gLS0gZmluZCB0aGUgcGF0aCB0aGF0IGNvcnJlc3BvbmRzIHRvIGl0IGluIGl0cworICogcGFyZW50IGFuZCByZXR1cm4gYW4gb3JpZ2luIHN0cnVjdHVyZSB0byByZXByZXNlbnQgaXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgb3JpZ2luICpmaW5kX3JlbmFtZShzdHJ1Y3Qgc2NvcmVib2FyZCAqc2IsCisJCQkJICBzdHJ1Y3QgY29tbWl0ICpwYXJlbnQsCisJCQkJICBzdHJ1Y3Qgb3JpZ2luICpvcmlnaW4pCit7CisJc3RydWN0IG9yaWdpbiAqcG9yaWdpbiA9IE5VTEw7CisJc3RydWN0IGRpZmZfb3B0aW9ucyBkaWZmX29wdHM7CisJaW50IGk7CisJY29uc3QgY2hhciAqcGF0aHNbMl07CisKKwlkaWZmX3NldHVwKCZkaWZmX29wdHMpOworCURJRkZfT1BUX1NFVCgmZGlmZl9vcHRzLCBSRUNVUlNJVkUpOworCWRpZmZfb3B0cy5kZXRlY3RfcmVuYW1lID0gRElGRl9ERVRFQ1RfUkVOQU1FOworCWRpZmZfb3B0cy5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfTk9fT1VUUFVUOworCWRpZmZfb3B0cy5zaW5nbGVfZm9sbG93ID0gb3JpZ2luLT5wYXRoOworCXBhdGhzWzBdID0gTlVMTDsKKwlkaWZmX3RyZWVfc2V0dXBfcGF0aHMocGF0aHMsICZkaWZmX29wdHMpOworCWlmIChkaWZmX3NldHVwX2RvbmUoJmRpZmZfb3B0cykgPCAwKQorCQlkaWUoImRpZmYtc2V0dXAiKTsKKworCWlmIChpc19udWxsX3NoYTEob3JpZ2luLT5jb21taXQtPm9iamVjdC5zaGExKSkKKwkJZG9fZGlmZl9jYWNoZShwYXJlbnQtPnRyZWUtPm9iamVjdC5zaGExLCAmZGlmZl9vcHRzKTsKKwllbHNlCisJCWRpZmZfdHJlZV9zaGExKHBhcmVudC0+dHJlZS0+b2JqZWN0LnNoYTEsCisJCQkgICAgICAgb3JpZ2luLT5jb21taXQtPnRyZWUtPm9iamVjdC5zaGExLAorCQkJICAgICAgICIiLCAmZGlmZl9vcHRzKTsKKwlkaWZmY29yZV9zdGQoJmRpZmZfb3B0cyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGlmZl9xdWV1ZWRfZGlmZi5ucjsgaSsrKSB7CisJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gZGlmZl9xdWV1ZWRfZGlmZi5xdWV1ZVtpXTsKKwkJaWYgKChwLT5zdGF0dXMgPT0gJ1InIHx8IHAtPnN0YXR1cyA9PSAnQycpICYmCisJCSAgICAhc3RyY21wKHAtPnR3by0+cGF0aCwgb3JpZ2luLT5wYXRoKSkgeworCQkJcG9yaWdpbiA9IGdldF9vcmlnaW4oc2IsIHBhcmVudCwgcC0+b25lLT5wYXRoKTsKKwkJCWhhc2hjcHkocG9yaWdpbi0+YmxvYl9zaGExLCBwLT5vbmUtPnNoYTEpOworCQkJYnJlYWs7CisJCX0KKwl9CisJZGlmZl9mbHVzaCgmZGlmZl9vcHRzKTsKKwlkaWZmX3RyZWVfcmVsZWFzZV9wYXRocygmZGlmZl9vcHRzKTsKKwlyZXR1cm4gcG9yaWdpbjsKK30KKworLyoKKyAqIFBhcnNpbmcgb2YgcGF0Y2ggY2h1bmtzLi4uCisgKi8KK3N0cnVjdCBjaHVuayB7CisJLyogbGluZSBudW1iZXIgaW4gcG9zdGltYWdlOyB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGlzCisJICogbGluZSBpcyB0aGUgc2FtZSBhcyBwcmVpbWFnZQorCSAqLworCWludCBzYW1lOworCisJLyogcHJlaW1hZ2UgbGluZSBudW1iZXIgYWZ0ZXIgdGhpcyBjaHVuayAqLworCWludCBwX25leHQ7CisKKwkvKiBwb3N0aW1hZ2UgbGluZSBudW1iZXIgYWZ0ZXIgdGhpcyBjaHVuayAqLworCWludCB0X25leHQ7Cit9OworCitzdHJ1Y3QgcGF0Y2ggeworCXN0cnVjdCBjaHVuayAqY2h1bmtzOworCWludCBudW07Cit9OworCitzdHJ1Y3QgYmxhbWVfZGlmZl9zdGF0ZSB7CisJc3RydWN0IHhkaWZmX2VtaXRfc3RhdGUgeG07CisJc3RydWN0IHBhdGNoICpyZXQ7CisJdW5zaWduZWQgaHVua19wb3N0X2NvbnRleHQ7CisJdW5zaWduZWQgaHVua19pbl9wcmVfY29udGV4dCA6IDE7Cit9OworCitzdGF0aWMgdm9pZCBwcm9jZXNzX3VfZGlmZih2b2lkICpzdGF0ZV8sIGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXN0cnVjdCBibGFtZV9kaWZmX3N0YXRlICpzdGF0ZSA9IHN0YXRlXzsKKwlzdHJ1Y3QgY2h1bmsgKmNodW5rOworCWludCBvZmYxLCBvZmYyLCBsZW4xLCBsZW4yLCBudW07CisKKwludW0gPSBzdGF0ZS0+cmV0LT5udW07CisJaWYgKGxlbiA8IDQgfHwgbGluZVswXSAhPSAnQCcgfHwgbGluZVsxXSAhPSAnQCcpIHsKKwkJaWYgKHN0YXRlLT5odW5rX2luX3ByZV9jb250ZXh0ICYmIGxpbmVbMF0gPT0gJyAnKQorCQkJc3RhdGUtPnJldC0+Y2h1bmtzW251bSAtIDFdLnNhbWUrKzsKKwkJZWxzZSB7CisJCQlzdGF0ZS0+aHVua19pbl9wcmVfY29udGV4dCA9IDA7CisJCQlpZiAobGluZVswXSA9PSAnICcpCisJCQkJc3RhdGUtPmh1bmtfcG9zdF9jb250ZXh0Kys7CisJCQllbHNlCisJCQkJc3RhdGUtPmh1bmtfcG9zdF9jb250ZXh0ID0gMDsKKwkJfQorCQlyZXR1cm47CisJfQorCisJaWYgKG51bSAmJiBzdGF0ZS0+aHVua19wb3N0X2NvbnRleHQpIHsKKwkJY2h1bmsgPSAmc3RhdGUtPnJldC0+Y2h1bmtzW251bSAtIDFdOworCQljaHVuay0+cF9uZXh0IC09IHN0YXRlLT5odW5rX3Bvc3RfY29udGV4dDsKKwkJY2h1bmstPnRfbmV4dCAtPSBzdGF0ZS0+aHVua19wb3N0X2NvbnRleHQ7CisJfQorCXN0YXRlLT5yZXQtPm51bSA9ICsrbnVtOworCXN0YXRlLT5yZXQtPmNodW5rcyA9IHhyZWFsbG9jKHN0YXRlLT5yZXQtPmNodW5rcywKKwkJCQkgICAgICBzaXplb2Yoc3RydWN0IGNodW5rKSAqIG51bSk7CisJY2h1bmsgPSAmc3RhdGUtPnJldC0+Y2h1bmtzW251bSAtIDFdOworCWlmIChwYXJzZV9odW5rX2hlYWRlcihsaW5lLCBsZW4sICZvZmYxLCAmbGVuMSwgJm9mZjIsICZsZW4yKSkgeworCQlzdGF0ZS0+cmV0LT5udW0tLTsKKwkJcmV0dXJuOworCX0KKworCS8qIExpbmUgbnVtYmVycyBpbiBwYXRjaCBvdXRwdXQgYXJlIG9uZSBiYXNlZC4gKi8KKwlvZmYxLS07CisJb2ZmMi0tOworCisJY2h1bmstPnNhbWUgPSBsZW4yID8gb2ZmMiA6IChvZmYyICsgMSk7CisKKwljaHVuay0+cF9uZXh0ID0gb2ZmMSArIChsZW4xID8gbGVuMSA6IDEpOworCWNodW5rLT50X25leHQgPSBjaHVuay0+c2FtZSArIGxlbjI7CisJc3RhdGUtPmh1bmtfaW5fcHJlX2NvbnRleHQgPSAxOworCXN0YXRlLT5odW5rX3Bvc3RfY29udGV4dCA9IDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGF0Y2ggKmNvbXBhcmVfYnVmZmVyKG1tZmlsZV90ICpmaWxlX3AsIG1tZmlsZV90ICpmaWxlX28sCisJCQkJICAgIGludCBjb250ZXh0KQoreworCXN0cnVjdCBibGFtZV9kaWZmX3N0YXRlIHN0YXRlOworCXhwcGFyYW1fdCB4cHA7CisJeGRlbWl0Y29uZl90IHhlY2ZnOworCXhkZW1pdGNiX3QgZWNiOworCisJeHBwLmZsYWdzID0geGRsX29wdHM7CisJbWVtc2V0KCZ4ZWNmZywgMCwgc2l6ZW9mKHhlY2ZnKSk7CisJeGVjZmcuY3R4bGVuID0gY29udGV4dDsKKwllY2Iub3V0ZiA9IHhkaWZmX291dGY7CisJZWNiLnByaXYgPSAmc3RhdGU7CisJbWVtc2V0KCZzdGF0ZSwgMCwgc2l6ZW9mKHN0YXRlKSk7CisJc3RhdGUueG0uY29uc3VtZSA9IHByb2Nlc3NfdV9kaWZmOworCXN0YXRlLnJldCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYXRjaCkpOworCXN0YXRlLnJldC0+Y2h1bmtzID0gTlVMTDsKKwlzdGF0ZS5yZXQtPm51bSA9IDA7CisKKwl4ZGlfZGlmZihmaWxlX3AsIGZpbGVfbywgJnhwcCwgJnhlY2ZnLCAmZWNiKTsKKworCWlmIChzdGF0ZS5yZXQtPm51bSkgeworCQlzdHJ1Y3QgY2h1bmsgKmNodW5rOworCQljaHVuayA9ICZzdGF0ZS5yZXQtPmNodW5rc1tzdGF0ZS5yZXQtPm51bSAtIDFdOworCQljaHVuay0+cF9uZXh0IC09IHN0YXRlLmh1bmtfcG9zdF9jb250ZXh0OworCQljaHVuay0+dF9uZXh0IC09IHN0YXRlLmh1bmtfcG9zdF9jb250ZXh0OworCX0KKwlyZXR1cm4gc3RhdGUucmV0OworfQorCisvKgorICogUnVuIGRpZmYgYmV0d2VlbiB0d28gb3JpZ2lucyBhbmQgZ3JhYiB0aGUgcGF0Y2ggb3V0cHV0LCBzbyB0aGF0CisgKiB3ZSBjYW4gcGFzcyBibGFtZSBmb3IgbGluZXMgb3JpZ2luIGlzIGN1cnJlbnRseSBzdXNwZWN0ZWQgZm9yCisgKiB0byBpdHMgcGFyZW50LgorICovCitzdGF0aWMgc3RydWN0IHBhdGNoICpnZXRfcGF0Y2goc3RydWN0IG9yaWdpbiAqcGFyZW50LCBzdHJ1Y3Qgb3JpZ2luICpvcmlnaW4pCit7CisJbW1maWxlX3QgZmlsZV9wLCBmaWxlX287CisJc3RydWN0IHBhdGNoICpwYXRjaDsKKworCWZpbGxfb3JpZ2luX2Jsb2IocGFyZW50LCAmZmlsZV9wKTsKKwlmaWxsX29yaWdpbl9ibG9iKG9yaWdpbiwgJmZpbGVfbyk7CisJaWYgKCFmaWxlX3AucHRyIHx8ICFmaWxlX28ucHRyKQorCQlyZXR1cm4gTlVMTDsKKwlwYXRjaCA9IGNvbXBhcmVfYnVmZmVyKCZmaWxlX3AsICZmaWxlX28sIDApOworCW51bV9nZXRfcGF0Y2grKzsKKwlyZXR1cm4gcGF0Y2g7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcGF0Y2goc3RydWN0IHBhdGNoICpwKQoreworCWZyZWUocC0+Y2h1bmtzKTsKKwlmcmVlKHApOworfQorCisvKgorICogTGluayBpbiBhIG5ldyBibGFtZSBlbnRyeSB0byB0aGUgc2NvcmVib2FyZC4gIEVudHJpZXMgdGhhdCBjb3ZlciB0aGUKKyAqIHNhbWUgbGluZSByYW5nZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzY29yZWJvYXJkIHByZXZpb3VzbHkuCisgKi8KK3N0YXRpYyB2b2lkIGFkZF9ibGFtZV9lbnRyeShzdHJ1Y3Qgc2NvcmVib2FyZCAqc2IsIHN0cnVjdCBibGFtZV9lbnRyeSAqZSkKK3sKKwlzdHJ1Y3QgYmxhbWVfZW50cnkgKmVudCwgKnByZXYgPSBOVUxMOworCisJb3JpZ2luX2luY3JlZihlLT5zdXNwZWN0KTsKKworCWZvciAoZW50ID0gc2ItPmVudDsgZW50ICYmIGVudC0+bG5vIDwgZS0+bG5vOyBlbnQgPSBlbnQtPm5leHQpCisJCXByZXYgPSBlbnQ7CisKKwkvKiBwcmV2LCBpZiBub3QgTlVMTCwgaXMgdGhlIGxhc3Qgb25lIHRoYXQgaXMgYmVsb3cgZSAqLworCWUtPnByZXYgPSBwcmV2OworCWlmIChwcmV2KSB7CisJCWUtPm5leHQgPSBwcmV2LT5uZXh0OworCQlwcmV2LT5uZXh0ID0gZTsKKwl9CisJZWxzZSB7CisJCWUtPm5leHQgPSBzYi0+ZW50OworCQlzYi0+ZW50ID0gZTsKKwl9CisJaWYgKGUtPm5leHQpCisJCWUtPm5leHQtPnByZXYgPSBlOworfQorCisvKgorICogc3JjIHR5cGljYWxseSBpcyBvbi1zdGFjazsgd2Ugd2FudCB0byBjb3B5IHRoZSBpbmZvcm1hdGlvbiBpbiBpdCB0bworICogYSBtYWxsb2NlZCBibGFtZV9lbnRyeSB0aGF0IGlzIGFscmVhZHkgb24gdGhlIGxpbmtlZCBsaXN0IG9mIHRoZQorICogc2NvcmVib2FyZC4gIFRoZSBvcmlnaW4gb2YgZHN0IGxvc2VzIGEgcmVmY250IHdoaWxlIHRoZSBvcmlnaW4gb2Ygc3JjCisgKiBnYWlucyBvbmUuCisgKi8KK3N0YXRpYyB2b2lkIGR1cF9lbnRyeShzdHJ1Y3QgYmxhbWVfZW50cnkgKmRzdCwgc3RydWN0IGJsYW1lX2VudHJ5ICpzcmMpCit7CisJc3RydWN0IGJsYW1lX2VudHJ5ICpwLCAqbjsKKworCXAgPSBkc3QtPnByZXY7CisJbiA9IGRzdC0+bmV4dDsKKwlvcmlnaW5faW5jcmVmKHNyYy0+c3VzcGVjdCk7CisJb3JpZ2luX2RlY3JlZihkc3QtPnN1c3BlY3QpOworCW1lbWNweShkc3QsIHNyYywgc2l6ZW9mKCpzcmMpKTsKKwlkc3QtPnByZXYgPSBwOworCWRzdC0+bmV4dCA9IG47CisJZHN0LT5zY29yZSA9IDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpudGhfbGluZShzdHJ1Y3Qgc2NvcmVib2FyZCAqc2IsIGludCBsbm8pCit7CisJcmV0dXJuIHNiLT5maW5hbF9idWYgKyBzYi0+bGluZW5vW2xub107Cit9CisKKy8qCisgKiBJdCBpcyBrbm93biB0aGF0IGxpbmVzIGJldHdlZW4gdGxubyB0byBzYW1lIGNhbWUgZnJvbSBwYXJlbnQsIGFuZCBlCisgKiBoYXMgYW4gb3ZlcmxhcCB3aXRoIHRoYXQgcmFuZ2UuICBpdCBhbHNvIGlzIGtub3duIHRoYXQgcGFyZW50J3MKKyAqIGxpbmUgcGxubyBjb3JyZXNwb25kcyB0byBlJ3MgbGluZSB0bG5vLgorICoKKyAqICAgICAgICAgICAgICAgIDwtLS0tIGUgLS0tLS0+CisgKiAgICAgICAgICAgICAgICAgICA8LS0tLS0tPgorICogICAgICAgICAgICAgICAgICAgPC0tLS0tLS0tLS0tLT4KKyAqICAgICAgICAgICAgIDwtLS0tLS0tLS0tLS0+CisgKiAgICAgICAgICAgICA8LS0tLS0tLS0tLS0tLS0tLS0tPgorICoKKyAqIFNwbGl0IGUgaW50byBwb3RlbnRpYWxseSB0aHJlZSBwYXJ0czsgYmVmb3JlIHRoaXMgY2h1bmssIHRoZSBjaHVuaworICogdG8gYmUgYmxhbWVkIGZvciB0aGUgcGFyZW50LCBhbmQgYWZ0ZXIgdGhhdCBwb3J0aW9uLgorICovCitzdGF0aWMgdm9pZCBzcGxpdF9vdmVybGFwKHN0cnVjdCBibGFtZV9lbnRyeSAqc3BsaXQsCisJCQkgIHN0cnVjdCBibGFtZV9lbnRyeSAqZSwKKwkJCSAgaW50IHRsbm8sIGludCBwbG5vLCBpbnQgc2FtZSwKKwkJCSAgc3RydWN0IG9yaWdpbiAqcGFyZW50KQoreworCWludCBjaHVua19lbmRfbG5vOworCW1lbXNldChzcGxpdCwgMCwgc2l6ZW9mKHN0cnVjdCBibGFtZV9lbnRyeSBbM10pKTsKKworCWlmIChlLT5zX2xubyA8IHRsbm8pIHsKKwkJLyogdGhlcmUgaXMgYSBwcmUtY2h1bmsgcGFydCBub3QgYmxhbWVkIG9uIHBhcmVudCAqLworCQlzcGxpdFswXS5zdXNwZWN0ID0gb3JpZ2luX2luY3JlZihlLT5zdXNwZWN0KTsKKwkJc3BsaXRbMF0ubG5vID0gZS0+bG5vOworCQlzcGxpdFswXS5zX2xubyA9IGUtPnNfbG5vOworCQlzcGxpdFswXS5udW1fbGluZXMgPSB0bG5vIC0gZS0+c19sbm87CisJCXNwbGl0WzFdLmxubyA9IGUtPmxubyArIHRsbm8gLSBlLT5zX2xubzsKKwkJc3BsaXRbMV0uc19sbm8gPSBwbG5vOworCX0KKwllbHNlIHsKKwkJc3BsaXRbMV0ubG5vID0gZS0+bG5vOworCQlzcGxpdFsxXS5zX2xubyA9IHBsbm8gKyAoZS0+c19sbm8gLSB0bG5vKTsKKwl9CisKKwlpZiAoc2FtZSA8IGUtPnNfbG5vICsgZS0+bnVtX2xpbmVzKSB7CisJCS8qIHRoZXJlIGlzIGEgcG9zdC1jaHVuayBwYXJ0IG5vdCBibGFtZWQgb24gcGFyZW50ICovCisJCXNwbGl0WzJdLnN1c3BlY3QgPSBvcmlnaW5faW5jcmVmKGUtPnN1c3BlY3QpOworCQlzcGxpdFsyXS5sbm8gPSBlLT5sbm8gKyAoc2FtZSAtIGUtPnNfbG5vKTsKKwkJc3BsaXRbMl0uc19sbm8gPSBlLT5zX2xubyArIChzYW1lIC0gZS0+c19sbm8pOworCQlzcGxpdFsyXS5udW1fbGluZXMgPSBlLT5zX2xubyArIGUtPm51bV9saW5lcyAtIHNhbWU7CisJCWNodW5rX2VuZF9sbm8gPSBzcGxpdFsyXS5sbm87CisJfQorCWVsc2UKKwkJY2h1bmtfZW5kX2xubyA9IGUtPmxubyArIGUtPm51bV9saW5lczsKKwlzcGxpdFsxXS5udW1fbGluZXMgPSBjaHVua19lbmRfbG5vIC0gc3BsaXRbMV0ubG5vOworCisJLyoKKwkgKiBpZiBpdCB0dXJucyBvdXQgdGhlcmUgaXMgbm90aGluZyB0byBibGFtZSB0aGUgcGFyZW50IGZvciwKKwkgKiBmb3JnZXQgYWJvdXQgdGhlIHNwbGl0dGluZy4gICFzcGxpdFsxXS5zdXNwZWN0IHNpZ25hbHMgdGhpcy4KKwkgKi8KKwlpZiAoc3BsaXRbMV0ubnVtX2xpbmVzIDwgMSkKKwkJcmV0dXJuOworCXNwbGl0WzFdLnN1c3BlY3QgPSBvcmlnaW5faW5jcmVmKHBhcmVudCk7Cit9CisKKy8qCisgKiBzcGxpdF9vdmVybGFwKCkgZGl2aWRlZCBhbiBleGlzdGluZyBibGFtZSBlIGludG8gdXAgdG8gdGhyZWUgcGFydHMKKyAqIGluIHNwbGl0LiAgQWRqdXN0IHRoZSBsaW5rZWQgbGlzdCBvZiBibGFtZXMgaW4gdGhlIHNjb3JlYm9hcmQgdG8KKyAqIHJlZmxlY3QgdGhlIHNwbGl0LgorICovCitzdGF0aWMgdm9pZCBzcGxpdF9ibGFtZShzdHJ1Y3Qgc2NvcmVib2FyZCAqc2IsCisJCQlzdHJ1Y3QgYmxhbWVfZW50cnkgKnNwbGl0LAorCQkJc3RydWN0IGJsYW1lX2VudHJ5ICplKQoreworCXN0cnVjdCBibGFtZV9lbnRyeSAqbmV3X2VudHJ5OworCisJaWYgKHNwbGl0WzBdLnN1c3BlY3QgJiYgc3BsaXRbMl0uc3VzcGVjdCkgeworCQkvKiBUaGUgZmlyc3QgcGFydCAocmV1c2Ugc3RvcmFnZSBmb3IgdGhlIGV4aXN0aW5nIGVudHJ5IGUpICovCisJCWR1cF9lbnRyeShlLCAmc3BsaXRbMF0pOworCisJCS8qIFRoZSBsYXN0IHBhcnQgLS0gbWUgKi8KKwkJbmV3X2VudHJ5ID0geG1hbGxvYyhzaXplb2YoKm5ld19lbnRyeSkpOworCQltZW1jcHkobmV3X2VudHJ5LCAmKHNwbGl0WzJdKSwgc2l6ZW9mKHN0cnVjdCBibGFtZV9lbnRyeSkpOworCQlhZGRfYmxhbWVfZW50cnkoc2IsIG5ld19lbnRyeSk7CisKKwkJLyogLi4uIGFuZCB0aGUgbWlkZGxlIHBhcnQgLS0gcGFyZW50ICovCisJCW5ld19lbnRyeSA9IHhtYWxsb2Moc2l6ZW9mKCpuZXdfZW50cnkpKTsKKwkJbWVtY3B5KG5ld19lbnRyeSwgJihzcGxpdFsxXSksIHNpemVvZihzdHJ1Y3QgYmxhbWVfZW50cnkpKTsKKwkJYWRkX2JsYW1lX2VudHJ5KHNiLCBuZXdfZW50cnkpOworCX0KKwllbHNlIGlmICghc3BsaXRbMF0uc3VzcGVjdCAmJiAhc3BsaXRbMl0uc3VzcGVjdCkKKwkJLyoKKwkJICogVGhlIHBhcmVudCBjb3ZlcnMgdGhlIGVudGlyZSBhcmVhOyByZXVzZSBzdG9yYWdlIGZvcgorCQkgKiBlIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIHBhcmVudC4KKwkJICovCisJCWR1cF9lbnRyeShlLCAmc3BsaXRbMV0pOworCWVsc2UgaWYgKHNwbGl0WzBdLnN1c3BlY3QpIHsKKwkJLyogbWUgYW5kIHRoZW4gcGFyZW50ICovCisJCWR1cF9lbnRyeShlLCAmc3BsaXRbMF0pOworCisJCW5ld19lbnRyeSA9IHhtYWxsb2Moc2l6ZW9mKCpuZXdfZW50cnkpKTsKKwkJbWVtY3B5KG5ld19lbnRyeSwgJihzcGxpdFsxXSksIHNpemVvZihzdHJ1Y3QgYmxhbWVfZW50cnkpKTsKKwkJYWRkX2JsYW1lX2VudHJ5KHNiLCBuZXdfZW50cnkpOworCX0KKwllbHNlIHsKKwkJLyogcGFyZW50IGFuZCB0aGVuIG1lICovCisJCWR1cF9lbnRyeShlLCAmc3BsaXRbMV0pOworCisJCW5ld19lbnRyeSA9IHhtYWxsb2Moc2l6ZW9mKCpuZXdfZW50cnkpKTsKKwkJbWVtY3B5KG5ld19lbnRyeSwgJihzcGxpdFsyXSksIHNpemVvZihzdHJ1Y3QgYmxhbWVfZW50cnkpKTsKKwkJYWRkX2JsYW1lX2VudHJ5KHNiLCBuZXdfZW50cnkpOworCX0KKworCWlmIChERUJVRykgeyAvKiBzYW5pdHkgKi8KKwkJc3RydWN0IGJsYW1lX2VudHJ5ICplbnQ7CisJCWludCBsbm8gPSBzYi0+ZW50LT5sbm8sIGNvcnJ1cHQgPSAwOworCisJCWZvciAoZW50ID0gc2ItPmVudDsgZW50OyBlbnQgPSBlbnQtPm5leHQpIHsKKwkJCWlmIChsbm8gIT0gZW50LT5sbm8pCisJCQkJY29ycnVwdCA9IDE7CisJCQlpZiAoZW50LT5zX2xubyA8IDApCisJCQkJY29ycnVwdCA9IDE7CisJCQlsbm8gKz0gZW50LT5udW1fbGluZXM7CisJCX0KKwkJaWYgKGNvcnJ1cHQpIHsKKwkJCWxubyA9IHNiLT5lbnQtPmxubzsKKwkJCWZvciAoZW50ID0gc2ItPmVudDsgZW50OyBlbnQgPSBlbnQtPm5leHQpIHsKKwkJCQlwcmludGYoIkwgJThkIGwgJThkIG4gJThkXG4iLAorCQkJCSAgICAgICBsbm8sIGVudC0+bG5vLCBlbnQtPm51bV9saW5lcyk7CisJCQkJbG5vID0gZW50LT5sbm8gKyBlbnQtPm51bV9saW5lczsKKwkJCX0KKwkJCWRpZSgib29wcyIpOworCQl9CisJfQorfQorCisvKgorICogQWZ0ZXIgc3BsaXR0aW5nIHRoZSBibGFtZSwgdGhlIG9yaWdpbnMgdXNlZCBieSB0aGUKKyAqIG9uLXN0YWNrIGJsYW1lX2VudHJ5IHNob3VsZCBsb3NlIG9uZSByZWZjbnQgZWFjaC4KKyAqLworc3RhdGljIHZvaWQgZGVjcmVmX3NwbGl0KHN0cnVjdCBibGFtZV9lbnRyeSAqc3BsaXQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQlvcmlnaW5fZGVjcmVmKHNwbGl0W2ldLnN1c3BlY3QpOworfQorCisvKgorICogSGVscGVyIGZvciBibGFtZV9jaHVuaygpLiAgYmxhbWVfZW50cnkgZSBpcyBrbm93biB0byBvdmVybGFwIHdpdGgKKyAqIHRoZSBwYXRjaCBodW5rOyBzcGxpdCBpdCBhbmQgcGFzcyBibGFtZSB0byB0aGUgcGFyZW50LgorICovCitzdGF0aWMgdm9pZCBibGFtZV9vdmVybGFwKHN0cnVjdCBzY29yZWJvYXJkICpzYiwgc3RydWN0IGJsYW1lX2VudHJ5ICplLAorCQkJICBpbnQgdGxubywgaW50IHBsbm8sIGludCBzYW1lLAorCQkJICBzdHJ1Y3Qgb3JpZ2luICpwYXJlbnQpCit7CisJc3RydWN0IGJsYW1lX2VudHJ5IHNwbGl0WzNdOworCisJc3BsaXRfb3ZlcmxhcChzcGxpdCwgZSwgdGxubywgcGxubywgc2FtZSwgcGFyZW50KTsKKwlpZiAoc3BsaXRbMV0uc3VzcGVjdCkKKwkJc3BsaXRfYmxhbWUoc2IsIHNwbGl0LCBlKTsKKwlkZWNyZWZfc3BsaXQoc3BsaXQpOworfQorCisvKgorICogRmluZCB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGxhc3QgbGluZSB0aGUgdGFyZ2V0IGlzIHN1c3BlY3RlZCBmb3IuCisgKi8KK3N0YXRpYyBpbnQgZmluZF9sYXN0X2luX3RhcmdldChzdHJ1Y3Qgc2NvcmVib2FyZCAqc2IsIHN0cnVjdCBvcmlnaW4gKnRhcmdldCkKK3sKKwlzdHJ1Y3QgYmxhbWVfZW50cnkgKmU7CisJaW50IGxhc3RfaW5fdGFyZ2V0ID0gLTE7CisKKwlmb3IgKGUgPSBzYi0+ZW50OyBlOyBlID0gZS0+bmV4dCkgeworCQlpZiAoZS0+Z3VpbHR5IHx8ICFzYW1lX3N1c3BlY3QoZS0+c3VzcGVjdCwgdGFyZ2V0KSkKKwkJCWNvbnRpbnVlOworCQlpZiAobGFzdF9pbl90YXJnZXQgPCBlLT5zX2xubyArIGUtPm51bV9saW5lcykKKwkJCWxhc3RfaW5fdGFyZ2V0ID0gZS0+c19sbm8gKyBlLT5udW1fbGluZXM7CisJfQorCXJldHVybiBsYXN0X2luX3RhcmdldDsKK30KKworLyoKKyAqIFByb2Nlc3Mgb25lIGh1bmsgZnJvbSB0aGUgcGF0Y2ggYmV0d2VlbiB0aGUgY3VycmVudCBzdXNwZWN0IGZvcgorICogYmxhbWVfZW50cnkgZSBhbmQgaXRzIHBhcmVudC4gIEZpbmQgYW5kIHNwbGl0IHRoZSBvdmVybGFwLCBhbmQKKyAqIHBhc3MgYmxhbWUgdG8gdGhlIG92ZXJsYXBwaW5nIHBhcnQgdG8gdGhlIHBhcmVudC4KKyAqLworc3RhdGljIHZvaWQgYmxhbWVfY2h1bmsoc3RydWN0IHNjb3JlYm9hcmQgKnNiLAorCQkJaW50IHRsbm8sIGludCBwbG5vLCBpbnQgc2FtZSwKKwkJCXN0cnVjdCBvcmlnaW4gKnRhcmdldCwgc3RydWN0IG9yaWdpbiAqcGFyZW50KQoreworCXN0cnVjdCBibGFtZV9lbnRyeSAqZTsKKworCWZvciAoZSA9IHNiLT5lbnQ7IGU7IGUgPSBlLT5uZXh0KSB7CisJCWlmIChlLT5ndWlsdHkgfHwgIXNhbWVfc3VzcGVjdChlLT5zdXNwZWN0LCB0YXJnZXQpKQorCQkJY29udGludWU7CisJCWlmIChzYW1lIDw9IGUtPnNfbG5vKQorCQkJY29udGludWU7CisJCWlmICh0bG5vIDwgZS0+c19sbm8gKyBlLT5udW1fbGluZXMpCisJCQlibGFtZV9vdmVybGFwKHNiLCBlLCB0bG5vLCBwbG5vLCBzYW1lLCBwYXJlbnQpOworCX0KK30KKworLyoKKyAqIFdlIGFyZSBsb29raW5nIGF0IHRoZSBvcmlnaW4gJ3RhcmdldCcgYW5kIGFpbWluZyB0byBwYXNzIGJsYW1lCisgKiBmb3IgdGhlIGxpbmVzIGl0IGlzIHN1c3BlY3RlZCB0byBpdHMgcGFyZW50LiAgUnVuIGRpZmYgdG8gZmluZAorICogd2hpY2ggbGluZXMgY2FtZSBmcm9tIHBhcmVudCBhbmQgcGFzcyBibGFtZSBmb3IgdGhlbS4KKyAqLworc3RhdGljIGludCBwYXNzX2JsYW1lX3RvX3BhcmVudChzdHJ1Y3Qgc2NvcmVib2FyZCAqc2IsCisJCQkJc3RydWN0IG9yaWdpbiAqdGFyZ2V0LAorCQkJCXN0cnVjdCBvcmlnaW4gKnBhcmVudCkKK3sKKwlpbnQgaSwgbGFzdF9pbl90YXJnZXQsIHBsbm8sIHRsbm87CisJc3RydWN0IHBhdGNoICpwYXRjaDsKKworCWxhc3RfaW5fdGFyZ2V0ID0gZmluZF9sYXN0X2luX3RhcmdldChzYiwgdGFyZ2V0KTsKKwlpZiAobGFzdF9pbl90YXJnZXQgPCAwKQorCQlyZXR1cm4gMTsgLyogbm90aGluZyByZW1haW5zIGZvciB0aGlzIHRhcmdldCAqLworCisJcGF0Y2ggPSBnZXRfcGF0Y2gocGFyZW50LCB0YXJnZXQpOworCXBsbm8gPSB0bG5vID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgcGF0Y2gtPm51bTsgaSsrKSB7CisJCXN0cnVjdCBjaHVuayAqY2h1bmsgPSAmcGF0Y2gtPmNodW5rc1tpXTsKKworCQlibGFtZV9jaHVuayhzYiwgdGxubywgcGxubywgY2h1bmstPnNhbWUsIHRhcmdldCwgcGFyZW50KTsKKwkJcGxubyA9IGNodW5rLT5wX25leHQ7CisJCXRsbm8gPSBjaHVuay0+dF9uZXh0OworCX0KKwkvKiBUaGUgcmVzdCAoaS5lLiBhbnl0aGluZyBhZnRlciB0bG5vKSBhcmUgdGhlIHNhbWUgYXMgdGhlIHBhcmVudCAqLworCWJsYW1lX2NodW5rKHNiLCB0bG5vLCBwbG5vLCBsYXN0X2luX3RhcmdldCwgdGFyZ2V0LCBwYXJlbnQpOworCisJZnJlZV9wYXRjaChwYXRjaCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgbGluZXMgaW4gYmxhbWVfZW50cnkgYWZ0ZXIgc3BsaXR0aW5nIGJsYW1lcyBtYW55IHRpbWVzIGNhbiBiZWNvbWUKKyAqIHZlcnkgc21hbGwgYW5kIHRyaXZpYWwsIGFuZCBhdCBzb21lIHBvaW50IGl0IGJlY29tZXMgcG9pbnRsZXNzIHRvCisgKiBibGFtZSB0aGUgcGFyZW50cy4gIEUuZy4gIlx0XHR9XG5cdH1cblxuIiBhcHBlYXJzIGV2ZXJ5d2hlcmUgaW4gYW55CisgKiBvcmRpbmFyeSBDIHByb2dyYW0sIGFuZCBpdCBpcyBub3Qgd29ydGggdG8gc2F5IGl0IHdhcyBjb3BpZWQgZnJvbQorICogdG90YWxseSB1bnJlbGF0ZWQgZmlsZSBpbiB0aGUgcGFyZW50LgorICoKKyAqIENvbXB1dGUgaG93IHRyaXZpYWwgdGhlIGxpbmVzIGluIHRoZSBibGFtZV9lbnRyeSBhcmUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBlbnRfc2NvcmUoc3RydWN0IHNjb3JlYm9hcmQgKnNiLCBzdHJ1Y3QgYmxhbWVfZW50cnkgKmUpCit7CisJdW5zaWduZWQgc2NvcmU7CisJY29uc3QgY2hhciAqY3AsICplcDsKKworCWlmIChlLT5zY29yZSkKKwkJcmV0dXJuIGUtPnNjb3JlOworCisJc2NvcmUgPSAxOworCWNwID0gbnRoX2xpbmUoc2IsIGUtPmxubyk7CisJZXAgPSBudGhfbGluZShzYiwgZS0+bG5vICsgZS0+bnVtX2xpbmVzKTsKKwl3aGlsZSAoY3AgPCBlcCkgeworCQl1bnNpZ25lZCBjaCA9ICooKHVuc2lnbmVkIGNoYXIgKiljcCk7CisJCWlmIChpc2FsbnVtKGNoKSkKKwkJCXNjb3JlKys7CisJCWNwKys7CisJfQorCWUtPnNjb3JlID0gc2NvcmU7CisJcmV0dXJuIHNjb3JlOworfQorCisvKgorICogYmVzdF9zb19mYXJbXSBhbmQgdGhpc1tdIGFyZSBib3RoIGEgc3BsaXQgb2YgYW4gZXhpc3RpbmcgYmxhbWVfZW50cnkKKyAqIHRoYXQgcGFzc2VzIGJsYW1lIHRvIHRoZSBwYXJlbnQuICBNYWludGFpbiBiZXN0X3NvX2ZhciB0aGUgYmVzdCBzcGxpdAorICogc28gZmFyLCBieSBjb21wYXJpbmcgdGhpcyBhbmQgYmVzdF9zb19mYXIgYW5kIGNvcHlpbmcgdGhpcyBpbnRvCisgKiBic3Rfc29fZmFyIGFzIG5lZWRlZC4KKyAqLworc3RhdGljIHZvaWQgY29weV9zcGxpdF9pZl9iZXR0ZXIoc3RydWN0IHNjb3JlYm9hcmQgKnNiLAorCQkJCSBzdHJ1Y3QgYmxhbWVfZW50cnkgKmJlc3Rfc29fZmFyLAorCQkJCSBzdHJ1Y3QgYmxhbWVfZW50cnkgKnRoaXMpCit7CisJaW50IGk7CisKKwlpZiAoIXRoaXNbMV0uc3VzcGVjdCkKKwkJcmV0dXJuOworCWlmIChiZXN0X3NvX2ZhclsxXS5zdXNwZWN0KSB7CisJCWlmIChlbnRfc2NvcmUoc2IsICZ0aGlzWzFdKSA8IGVudF9zY29yZShzYiwgJmJlc3Rfc29fZmFyWzFdKSkKKwkJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQlvcmlnaW5faW5jcmVmKHRoaXNbaV0uc3VzcGVjdCk7CisJZGVjcmVmX3NwbGl0KGJlc3Rfc29fZmFyKTsKKwltZW1jcHkoYmVzdF9zb19mYXIsIHRoaXMsIHNpemVvZihzdHJ1Y3QgYmxhbWVfZW50cnkgWzNdKSk7Cit9CisKKy8qCisgKiBXZSBhcmUgbG9va2luZyBhdCBhIHBhcnQgb2YgdGhlIGZpbmFsIGltYWdlIHJlcHJlc2VudGVkIGJ5CisgKiBlbnQgKHRsbm8gYW5kIHNhbWUgYXJlIG9mZnNldCBieSBlbnQtPnNfbG5vKS4KKyAqIHRsbm8gaXMgd2hlcmUgd2UgYXJlIGxvb2tpbmcgYXQgaW4gdGhlIGZpbmFsIGltYWdlLgorICogdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKSBzYW1lIG1hdGNoIHByZWltYWdlLgorICogcGxubyBpcyB3aGVyZSB3ZSBhcmUgbG9va2luZyBhdCBpbiB0aGUgcHJlaW1hZ2UuCisgKgorICogPC0tLS0tLS0tLS0tLS0tIGZpbmFsIGltYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisgKiAgICAgICA8LS0tLS0tZW50LS0tLS0tPgorICogICAgICAgICBedGxubyBec2FtZQorICogICAgPC0tLS0tLS0tLXByZWltYWdlLS0tLS0+CisgKiAgICAgICAgIF5wbG5vCisgKgorICogQWxsIGxpbmUgbnVtYmVycyBhcmUgMC1iYXNlZC4KKyAqLworc3RhdGljIHZvaWQgaGFuZGxlX3NwbGl0KHN0cnVjdCBzY29yZWJvYXJkICpzYiwKKwkJCSBzdHJ1Y3QgYmxhbWVfZW50cnkgKmVudCwKKwkJCSBpbnQgdGxubywgaW50IHBsbm8sIGludCBzYW1lLAorCQkJIHN0cnVjdCBvcmlnaW4gKnBhcmVudCwKKwkJCSBzdHJ1Y3QgYmxhbWVfZW50cnkgKnNwbGl0KQoreworCWlmIChlbnQtPm51bV9saW5lcyA8PSB0bG5vKQorCQlyZXR1cm47CisJaWYgKHRsbm8gPCBzYW1lKSB7CisJCXN0cnVjdCBibGFtZV9lbnRyeSB0aGlzWzNdOworCQl0bG5vICs9IGVudC0+c19sbm87CisJCXNhbWUgKz0gZW50LT5zX2xubzsKKwkJc3BsaXRfb3ZlcmxhcCh0aGlzLCBlbnQsIHRsbm8sIHBsbm8sIHNhbWUsIHBhcmVudCk7CisJCWNvcHlfc3BsaXRfaWZfYmV0dGVyKHNiLCBzcGxpdCwgdGhpcyk7CisJCWRlY3JlZl9zcGxpdCh0aGlzKTsKKwl9Cit9CisKKy8qCisgKiBGaW5kIHRoZSBsaW5lcyBmcm9tIHBhcmVudCB0aGF0IGFyZSB0aGUgc2FtZSBhcyBlbnQgc28gdGhhdAorICogd2UgY2FuIHBhc3MgYmxhbWVzIHRvIGl0LiAgZmlsZV9wIGhhcyB0aGUgYmxvYiBjb250ZW50cyBmb3IKKyAqIHRoZSBwYXJlbnQuCisgKi8KK3N0YXRpYyB2b2lkIGZpbmRfY29weV9pbl9ibG9iKHN0cnVjdCBzY29yZWJvYXJkICpzYiwKKwkJCSAgICAgIHN0cnVjdCBibGFtZV9lbnRyeSAqZW50LAorCQkJICAgICAgc3RydWN0IG9yaWdpbiAqcGFyZW50LAorCQkJICAgICAgc3RydWN0IGJsYW1lX2VudHJ5ICpzcGxpdCwKKwkJCSAgICAgIG1tZmlsZV90ICpmaWxlX3ApCit7CisJY29uc3QgY2hhciAqY3A7CisJaW50IGNudDsKKwltbWZpbGVfdCBmaWxlX287CisJc3RydWN0IHBhdGNoICpwYXRjaDsKKwlpbnQgaSwgcGxubywgdGxubzsKKworCS8qCisJICogUHJlcGFyZSBtbWZpbGUgdGhhdCBjb250YWlucyBvbmx5IHRoZSBsaW5lcyBpbiBlbnQuCisJICovCisJY3AgPSBudGhfbGluZShzYiwgZW50LT5sbm8pOworCWZpbGVfby5wdHIgPSAoY2hhciopIGNwOworCWNudCA9IGVudC0+bnVtX2xpbmVzOworCisJd2hpbGUgKGNudCAmJiBjcCA8IHNiLT5maW5hbF9idWYgKyBzYi0+ZmluYWxfYnVmX3NpemUpIHsKKwkJaWYgKCpjcCsrID09ICdcbicpCisJCQljbnQtLTsKKwl9CisJZmlsZV9vLnNpemUgPSBjcCAtIGZpbGVfby5wdHI7CisKKwlwYXRjaCA9IGNvbXBhcmVfYnVmZmVyKGZpbGVfcCwgJmZpbGVfbywgMSk7CisKKwkvKgorCSAqIGZpbGVfbyBpcyBhIHBhcnQgb2YgZmluYWwgaW1hZ2Ugd2UgYXJlIGFubm90YXRpbmcuCisJICogZmlsZV9wIHBhcnRpYWxseSBtYXkgbWF0Y2ggdGhhdCBpbWFnZS4KKwkgKi8KKwltZW1zZXQoc3BsaXQsIDAsIHNpemVvZihzdHJ1Y3QgYmxhbWVfZW50cnkgWzNdKSk7CisJcGxubyA9IHRsbm8gPSAwOworCWZvciAoaSA9IDA7IGkgPCBwYXRjaC0+bnVtOyBpKyspIHsKKwkJc3RydWN0IGNodW5rICpjaHVuayA9ICZwYXRjaC0+Y2h1bmtzW2ldOworCisJCWhhbmRsZV9zcGxpdChzYiwgZW50LCB0bG5vLCBwbG5vLCBjaHVuay0+c2FtZSwgcGFyZW50LCBzcGxpdCk7CisJCXBsbm8gPSBjaHVuay0+cF9uZXh0OworCQl0bG5vID0gY2h1bmstPnRfbmV4dDsKKwl9CisJLyogcmVtYWluZGVyLCBpZiBhbnksIGFsbCBtYXRjaCB0aGUgcHJlaW1hZ2UgKi8KKwloYW5kbGVfc3BsaXQoc2IsIGVudCwgdGxubywgcGxubywgZW50LT5udW1fbGluZXMsIHBhcmVudCwgc3BsaXQpOworCWZyZWVfcGF0Y2gocGF0Y2gpOworfQorCisvKgorICogU2VlIGlmIGxpbmVzIGN1cnJlbnRseSB0YXJnZXQgaXMgc3VzcGVjdGVkIGZvciBjYW4gYmUgYXR0cmlidXRlZCB0bworICogcGFyZW50LgorICovCitzdGF0aWMgaW50IGZpbmRfbW92ZV9pbl9wYXJlbnQoc3RydWN0IHNjb3JlYm9hcmQgKnNiLAorCQkJICAgICAgIHN0cnVjdCBvcmlnaW4gKnRhcmdldCwKKwkJCSAgICAgICBzdHJ1Y3Qgb3JpZ2luICpwYXJlbnQpCit7CisJaW50IGxhc3RfaW5fdGFyZ2V0LCBtYWRlX3Byb2dyZXNzOworCXN0cnVjdCBibGFtZV9lbnRyeSAqZSwgc3BsaXRbM107CisJbW1maWxlX3QgZmlsZV9wOworCisJbGFzdF9pbl90YXJnZXQgPSBmaW5kX2xhc3RfaW5fdGFyZ2V0KHNiLCB0YXJnZXQpOworCWlmIChsYXN0X2luX3RhcmdldCA8IDApCisJCXJldHVybiAxOyAvKiBub3RoaW5nIHJlbWFpbnMgZm9yIHRoaXMgdGFyZ2V0ICovCisKKwlmaWxsX29yaWdpbl9ibG9iKHBhcmVudCwgJmZpbGVfcCk7CisJaWYgKCFmaWxlX3AucHRyKQorCQlyZXR1cm4gMDsKKworCW1hZGVfcHJvZ3Jlc3MgPSAxOworCXdoaWxlIChtYWRlX3Byb2dyZXNzKSB7CisJCW1hZGVfcHJvZ3Jlc3MgPSAwOworCQlmb3IgKGUgPSBzYi0+ZW50OyBlOyBlID0gZS0+bmV4dCkgeworCQkJaWYgKGUtPmd1aWx0eSB8fCAhc2FtZV9zdXNwZWN0KGUtPnN1c3BlY3QsIHRhcmdldCkpCisJCQkJY29udGludWU7CisJCQlmaW5kX2NvcHlfaW5fYmxvYihzYiwgZSwgcGFyZW50LCBzcGxpdCwgJmZpbGVfcCk7CisJCQlpZiAoc3BsaXRbMV0uc3VzcGVjdCAmJgorCQkJICAgIGJsYW1lX21vdmVfc2NvcmUgPCBlbnRfc2NvcmUoc2IsICZzcGxpdFsxXSkpIHsKKwkJCQlzcGxpdF9ibGFtZShzYiwgc3BsaXQsIGUpOworCQkJCW1hZGVfcHJvZ3Jlc3MgPSAxOworCQkJfQorCQkJZGVjcmVmX3NwbGl0KHNwbGl0KTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGJsYW1lX2xpc3QgeworCXN0cnVjdCBibGFtZV9lbnRyeSAqZW50OworCXN0cnVjdCBibGFtZV9lbnRyeSBzcGxpdFszXTsKK307CisKKy8qCisgKiBDb3VudCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgdGhlIHRhcmdldCBpcyBzdXNwZWN0ZWQgZm9yLAorICogYW5kIHByZXBhcmUgYSBsaXN0IG9mIGVudHJ5IGFuZCB0aGUgYmVzdCBzcGxpdC4KKyAqLworc3RhdGljIHN0cnVjdCBibGFtZV9saXN0ICpzZXR1cF9ibGFtZV9saXN0KHN0cnVjdCBzY29yZWJvYXJkICpzYiwKKwkJCQkJICAgc3RydWN0IG9yaWdpbiAqdGFyZ2V0LAorCQkJCQkgICBpbnQgKm51bV9lbnRzX3ApCit7CisJc3RydWN0IGJsYW1lX2VudHJ5ICplOworCWludCBudW1fZW50cywgaTsKKwlzdHJ1Y3QgYmxhbWVfbGlzdCAqYmxhbWVfbGlzdCA9IE5VTEw7CisKKwlmb3IgKGUgPSBzYi0+ZW50LCBudW1fZW50cyA9IDA7IGU7IGUgPSBlLT5uZXh0KQorCQlpZiAoIWUtPmd1aWx0eSAmJiBzYW1lX3N1c3BlY3QoZS0+c3VzcGVjdCwgdGFyZ2V0KSkKKwkJCW51bV9lbnRzKys7CisJaWYgKG51bV9lbnRzKSB7CisJCWJsYW1lX2xpc3QgPSB4Y2FsbG9jKG51bV9lbnRzLCBzaXplb2Yoc3RydWN0IGJsYW1lX2xpc3QpKTsKKwkJZm9yIChlID0gc2ItPmVudCwgaSA9IDA7IGU7IGUgPSBlLT5uZXh0KQorCQkJaWYgKCFlLT5ndWlsdHkgJiYgc2FtZV9zdXNwZWN0KGUtPnN1c3BlY3QsIHRhcmdldCkpCisJCQkJYmxhbWVfbGlzdFtpKytdLmVudCA9IGU7CisJfQorCSpudW1fZW50c19wID0gbnVtX2VudHM7CisJcmV0dXJuIGJsYW1lX2xpc3Q7Cit9CisKKy8qCisgKiBGb3IgbGluZXMgdGFyZ2V0IGlzIHN1c3BlY3RlZCBmb3IsIHNlZSBpZiB3ZSBjYW4gZmluZCBjb2RlIG1vdmVtZW50CisgKiBhY3Jvc3MgZmlsZSBib3VuZGFyeSBmcm9tIHRoZSBwYXJlbnQgY29tbWl0LiAgcG9yaWdpbiBpcyB0aGUgcGF0aAorICogaW4gdGhlIHBhcmVudCB3ZSBhbHJlYWR5IHRyaWVkLgorICovCitzdGF0aWMgaW50IGZpbmRfY29weV9pbl9wYXJlbnQoc3RydWN0IHNjb3JlYm9hcmQgKnNiLAorCQkJICAgICAgIHN0cnVjdCBvcmlnaW4gKnRhcmdldCwKKwkJCSAgICAgICBzdHJ1Y3QgY29tbWl0ICpwYXJlbnQsCisJCQkgICAgICAgc3RydWN0IG9yaWdpbiAqcG9yaWdpbiwKKwkJCSAgICAgICBpbnQgb3B0KQoreworCXN0cnVjdCBkaWZmX29wdGlvbnMgZGlmZl9vcHRzOworCWNvbnN0IGNoYXIgKnBhdGhzWzFdOworCWludCBpLCBqOworCWludCByZXR2YWw7CisJc3RydWN0IGJsYW1lX2xpc3QgKmJsYW1lX2xpc3Q7CisJaW50IG51bV9lbnRzOworCisJYmxhbWVfbGlzdCA9IHNldHVwX2JsYW1lX2xpc3Qoc2IsIHRhcmdldCwgJm51bV9lbnRzKTsKKwlpZiAoIWJsYW1lX2xpc3QpCisJCXJldHVybiAxOyAvKiBub3RoaW5nIHJlbWFpbnMgZm9yIHRoaXMgdGFyZ2V0ICovCisKKwlkaWZmX3NldHVwKCZkaWZmX29wdHMpOworCURJRkZfT1BUX1NFVCgmZGlmZl9vcHRzLCBSRUNVUlNJVkUpOworCWRpZmZfb3B0cy5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfTk9fT1VUUFVUOworCisJcGF0aHNbMF0gPSBOVUxMOworCWRpZmZfdHJlZV9zZXR1cF9wYXRocyhwYXRocywgJmRpZmZfb3B0cyk7CisJaWYgKGRpZmZfc2V0dXBfZG9uZSgmZGlmZl9vcHRzKSA8IDApCisJCWRpZSgiZGlmZi1zZXR1cCIpOworCisJLyogVHJ5ICJmaW5kIGNvcGllcyBoYXJkZXIiIG9uIG5ldyBwYXRoIGlmIHJlcXVlc3RlZDsKKwkgKiB3ZSBkbyBub3Qgd2FudCB0byB1c2UgZGlmZmNvcmVfcmVuYW1lKCkgYWN0dWFsbHkgdG8KKwkgKiBtYXRjaCB0aGluZ3MgdXA7IGZpbmRfY29waWVzX2hhcmRlciBpcyBzZXQgb25seSB0bworCSAqIGZvcmNlIGRpZmZfdHJlZV9zaGExKCkgdG8gZmVlZCBhbGwgZmlsZXBhaXJzIHRvIGRpZmZfcXVldWUsCisJICogYW5kIHRoaXMgY29kZSBuZWVkcyB0byBiZSBhZnRlciBkaWZmX3NldHVwX2RvbmUoKSwgd2hpY2gKKwkgKiB1c3VhbGx5IG1ha2VzIGZpbmQtY29waWVzLWhhcmRlciBpbXBseSBjb3B5IGRldGVjdGlvbi4KKwkgKi8KKwlpZiAoKG9wdCAmIFBJQ0tBWEVfQkxBTUVfQ09QWV9IQVJERVNUKQorCSAgICB8fCAoKG9wdCAmIFBJQ0tBWEVfQkxBTUVfQ09QWV9IQVJERVIpCisJCSYmICghcG9yaWdpbiB8fCBzdHJjbXAodGFyZ2V0LT5wYXRoLCBwb3JpZ2luLT5wYXRoKSkpKQorCQlESUZGX09QVF9TRVQoJmRpZmZfb3B0cywgRklORF9DT1BJRVNfSEFSREVSKTsKKworCWlmIChpc19udWxsX3NoYTEodGFyZ2V0LT5jb21taXQtPm9iamVjdC5zaGExKSkKKwkJZG9fZGlmZl9jYWNoZShwYXJlbnQtPnRyZWUtPm9iamVjdC5zaGExLCAmZGlmZl9vcHRzKTsKKwllbHNlCisJCWRpZmZfdHJlZV9zaGExKHBhcmVudC0+dHJlZS0+b2JqZWN0LnNoYTEsCisJCQkgICAgICAgdGFyZ2V0LT5jb21taXQtPnRyZWUtPm9iamVjdC5zaGExLAorCQkJICAgICAgICIiLCAmZGlmZl9vcHRzKTsKKworCWlmICghRElGRl9PUFRfVFNUKCZkaWZmX29wdHMsIEZJTkRfQ09QSUVTX0hBUkRFUikpCisJCWRpZmZjb3JlX3N0ZCgmZGlmZl9vcHRzKTsKKworCXJldHZhbCA9IDA7CisJd2hpbGUgKDEpIHsKKwkJaW50IG1hZGVfcHJvZ3Jlc3MgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBkaWZmX3F1ZXVlZF9kaWZmLm5yOyBpKyspIHsKKwkJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gZGlmZl9xdWV1ZWRfZGlmZi5xdWV1ZVtpXTsKKwkJCXN0cnVjdCBvcmlnaW4gKm5vcmlnaW47CisJCQltbWZpbGVfdCBmaWxlX3A7CisJCQlzdHJ1Y3QgYmxhbWVfZW50cnkgdGhpc1szXTsKKworCQkJaWYgKCFESUZGX0ZJTEVfVkFMSUQocC0+b25lKSkKKwkJCQljb250aW51ZTsgLyogZG9lcyBub3QgZXhpc3QgaW4gcGFyZW50ICovCisJCQlpZiAocG9yaWdpbiAmJiAhc3RyY21wKHAtPm9uZS0+cGF0aCwgcG9yaWdpbi0+cGF0aCkpCisJCQkJLyogZmluZF9tb3ZlIGFscmVhZHkgZGVhbHQgd2l0aCB0aGlzIHBhdGggKi8KKwkJCQljb250aW51ZTsKKworCQkJbm9yaWdpbiA9IGdldF9vcmlnaW4oc2IsIHBhcmVudCwgcC0+b25lLT5wYXRoKTsKKwkJCWhhc2hjcHkobm9yaWdpbi0+YmxvYl9zaGExLCBwLT5vbmUtPnNoYTEpOworCQkJZmlsbF9vcmlnaW5fYmxvYihub3JpZ2luLCAmZmlsZV9wKTsKKwkJCWlmICghZmlsZV9wLnB0cikKKwkJCQljb250aW51ZTsKKworCQkJZm9yIChqID0gMDsgaiA8IG51bV9lbnRzOyBqKyspIHsKKwkJCQlmaW5kX2NvcHlfaW5fYmxvYihzYiwgYmxhbWVfbGlzdFtqXS5lbnQsCisJCQkJCQkgIG5vcmlnaW4sIHRoaXMsICZmaWxlX3ApOworCQkJCWNvcHlfc3BsaXRfaWZfYmV0dGVyKHNiLCBibGFtZV9saXN0W2pdLnNwbGl0LAorCQkJCQkJICAgICB0aGlzKTsKKwkJCQlkZWNyZWZfc3BsaXQodGhpcyk7CisJCQl9CisJCQlvcmlnaW5fZGVjcmVmKG5vcmlnaW4pOworCQl9CisKKwkJZm9yIChqID0gMDsgaiA8IG51bV9lbnRzOyBqKyspIHsKKwkJCXN0cnVjdCBibGFtZV9lbnRyeSAqc3BsaXQgPSBibGFtZV9saXN0W2pdLnNwbGl0OworCQkJaWYgKHNwbGl0WzFdLnN1c3BlY3QgJiYKKwkJCSAgICBibGFtZV9jb3B5X3Njb3JlIDwgZW50X3Njb3JlKHNiLCAmc3BsaXRbMV0pKSB7CisJCQkJc3BsaXRfYmxhbWUoc2IsIHNwbGl0LCBibGFtZV9saXN0W2pdLmVudCk7CisJCQkJbWFkZV9wcm9ncmVzcyA9IDE7CisJCQl9CisJCQlkZWNyZWZfc3BsaXQoc3BsaXQpOworCQl9CisJCWZyZWUoYmxhbWVfbGlzdCk7CisKKwkJaWYgKCFtYWRlX3Byb2dyZXNzKQorCQkJYnJlYWs7CisJCWJsYW1lX2xpc3QgPSBzZXR1cF9ibGFtZV9saXN0KHNiLCB0YXJnZXQsICZudW1fZW50cyk7CisJCWlmICghYmxhbWVfbGlzdCkgeworCQkJcmV0dmFsID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWRpZmZfZmx1c2goJmRpZmZfb3B0cyk7CisJZGlmZl90cmVlX3JlbGVhc2VfcGF0aHMoJmRpZmZfb3B0cyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFRoZSBibG9icyBvZiBvcmlnaW4gYW5kIHBvcmlnaW4gZXhhY3RseSBtYXRjaCwgc28gZXZlcnl0aGluZworICogb3JpZ2luIGlzIHN1c3BlY3RlZCBmb3IgY2FuIGJlIGJsYW1lZCBvbiB0aGUgcGFyZW50LgorICovCitzdGF0aWMgdm9pZCBwYXNzX3dob2xlX2JsYW1lKHN0cnVjdCBzY29yZWJvYXJkICpzYiwKKwkJCSAgICAgc3RydWN0IG9yaWdpbiAqb3JpZ2luLCBzdHJ1Y3Qgb3JpZ2luICpwb3JpZ2luKQoreworCXN0cnVjdCBibGFtZV9lbnRyeSAqZTsKKworCWlmICghcG9yaWdpbi0+ZmlsZS5wdHIgJiYgb3JpZ2luLT5maWxlLnB0cikgeworCQkvKiBTdGVhbCBpdHMgZmlsZSAqLworCQlwb3JpZ2luLT5maWxlID0gb3JpZ2luLT5maWxlOworCQlvcmlnaW4tPmZpbGUucHRyID0gTlVMTDsKKwl9CisJZm9yIChlID0gc2ItPmVudDsgZTsgZSA9IGUtPm5leHQpIHsKKwkJaWYgKCFzYW1lX3N1c3BlY3QoZS0+c3VzcGVjdCwgb3JpZ2luKSkKKwkJCWNvbnRpbnVlOworCQlvcmlnaW5faW5jcmVmKHBvcmlnaW4pOworCQlvcmlnaW5fZGVjcmVmKGUtPnN1c3BlY3QpOworCQllLT5zdXNwZWN0ID0gcG9yaWdpbjsKKwl9Cit9CisKKyNkZWZpbmUgTUFYUEFSRU5UIDE2CisKK3N0YXRpYyB2b2lkIHBhc3NfYmxhbWUoc3RydWN0IHNjb3JlYm9hcmQgKnNiLCBzdHJ1Y3Qgb3JpZ2luICpvcmlnaW4sIGludCBvcHQpCit7CisJaW50IGksIHBhc3M7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gb3JpZ2luLT5jb21taXQ7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnQ7CisJc3RydWN0IG9yaWdpbiAqcGFyZW50X29yaWdpbltNQVhQQVJFTlRdLCAqcG9yaWdpbjsKKworCW1lbXNldChwYXJlbnRfb3JpZ2luLCAwLCBzaXplb2YocGFyZW50X29yaWdpbikpOworCisJLyogVGhlIGZpcnN0IHBhc3MgbG9va3MgZm9yIHVucmVuYW1lZCBwYXRoIHRvIG9wdGltaXplIGZvcgorCSAqIGNvbW1vbiBjYXNlcywgdGhlbiB3ZSBsb29rIGZvciByZW5hbWVzIGluIHRoZSBzZWNvbmQgcGFzcy4KKwkgKi8KKwlmb3IgKHBhc3MgPSAwOyBwYXNzIDwgMjsgcGFzcysrKSB7CisJCXN0cnVjdCBvcmlnaW4gKigqZmluZCkoc3RydWN0IHNjb3JlYm9hcmQgKiwKKwkJCQkgICAgICAgc3RydWN0IGNvbW1pdCAqLCBzdHJ1Y3Qgb3JpZ2luICopOworCQlmaW5kID0gcGFzcyA/IGZpbmRfcmVuYW1lIDogZmluZF9vcmlnaW47CisKKwkJZm9yIChpID0gMCwgcGFyZW50ID0gY29tbWl0LT5wYXJlbnRzOworCQkgICAgIGkgPCBNQVhQQVJFTlQgJiYgcGFyZW50OworCQkgICAgIHBhcmVudCA9IHBhcmVudC0+bmV4dCwgaSsrKSB7CisJCQlzdHJ1Y3QgY29tbWl0ICpwID0gcGFyZW50LT5pdGVtOworCQkJaW50IGosIHNhbWU7CisKKwkJCWlmIChwYXJlbnRfb3JpZ2luW2ldKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHBhcnNlX2NvbW1pdChwKSkKKwkJCQljb250aW51ZTsKKwkJCXBvcmlnaW4gPSBmaW5kKHNiLCBwLCBvcmlnaW4pOworCQkJaWYgKCFwb3JpZ2luKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFoYXNoY21wKHBvcmlnaW4tPmJsb2Jfc2hhMSwgb3JpZ2luLT5ibG9iX3NoYTEpKSB7CisJCQkJcGFzc193aG9sZV9ibGFtZShzYiwgb3JpZ2luLCBwb3JpZ2luKTsKKwkJCQlvcmlnaW5fZGVjcmVmKHBvcmlnaW4pOworCQkJCWdvdG8gZmluaXNoOworCQkJfQorCQkJZm9yIChqID0gc2FtZSA9IDA7IGogPCBpOyBqKyspCisJCQkJaWYgKHBhcmVudF9vcmlnaW5bal0gJiYKKwkJCQkgICAgIWhhc2hjbXAocGFyZW50X29yaWdpbltqXS0+YmxvYl9zaGExLAorCQkJCQkgICAgIHBvcmlnaW4tPmJsb2Jfc2hhMSkpIHsKKwkJCQkJc2FtZSA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCWlmICghc2FtZSkKKwkJCQlwYXJlbnRfb3JpZ2luW2ldID0gcG9yaWdpbjsKKwkJCWVsc2UKKwkJCQlvcmlnaW5fZGVjcmVmKHBvcmlnaW4pOworCQl9CisJfQorCisJbnVtX2NvbW1pdHMrKzsKKwlmb3IgKGkgPSAwLCBwYXJlbnQgPSBjb21taXQtPnBhcmVudHM7CisJICAgICBpIDwgTUFYUEFSRU5UICYmIHBhcmVudDsKKwkgICAgIHBhcmVudCA9IHBhcmVudC0+bmV4dCwgaSsrKSB7CisJCXN0cnVjdCBvcmlnaW4gKnBvcmlnaW4gPSBwYXJlbnRfb3JpZ2luW2ldOworCQlpZiAoIXBvcmlnaW4pCisJCQljb250aW51ZTsKKwkJaWYgKHBhc3NfYmxhbWVfdG9fcGFyZW50KHNiLCBvcmlnaW4sIHBvcmlnaW4pKQorCQkJZ290byBmaW5pc2g7CisJfQorCisJLyoKKwkgKiBPcHRpb25hbGx5IGZpbmQgbW92ZXMgaW4gcGFyZW50cycgZmlsZXMuCisJICovCisJaWYgKG9wdCAmIFBJQ0tBWEVfQkxBTUVfTU9WRSkKKwkJZm9yIChpID0gMCwgcGFyZW50ID0gY29tbWl0LT5wYXJlbnRzOworCQkgICAgIGkgPCBNQVhQQVJFTlQgJiYgcGFyZW50OworCQkgICAgIHBhcmVudCA9IHBhcmVudC0+bmV4dCwgaSsrKSB7CisJCQlzdHJ1Y3Qgb3JpZ2luICpwb3JpZ2luID0gcGFyZW50X29yaWdpbltpXTsKKwkJCWlmICghcG9yaWdpbikKKwkJCQljb250aW51ZTsKKwkJCWlmIChmaW5kX21vdmVfaW5fcGFyZW50KHNiLCBvcmlnaW4sIHBvcmlnaW4pKQorCQkJCWdvdG8gZmluaXNoOworCQl9CisKKwkvKgorCSAqIE9wdGlvbmFsbHkgZmluZCBjb3BpZXMgZnJvbSBwYXJlbnRzJyBmaWxlcy4KKwkgKi8KKwlpZiAob3B0ICYgUElDS0FYRV9CTEFNRV9DT1BZKQorCQlmb3IgKGkgPSAwLCBwYXJlbnQgPSBjb21taXQtPnBhcmVudHM7CisJCSAgICAgaSA8IE1BWFBBUkVOVCAmJiBwYXJlbnQ7CisJCSAgICAgcGFyZW50ID0gcGFyZW50LT5uZXh0LCBpKyspIHsKKwkJCXN0cnVjdCBvcmlnaW4gKnBvcmlnaW4gPSBwYXJlbnRfb3JpZ2luW2ldOworCQkJaWYgKGZpbmRfY29weV9pbl9wYXJlbnQoc2IsIG9yaWdpbiwgcGFyZW50LT5pdGVtLAorCQkJCQkJcG9yaWdpbiwgb3B0KSkKKwkJCQlnb3RvIGZpbmlzaDsKKwkJfQorCisgZmluaXNoOgorCWZvciAoaSA9IDA7IGkgPCBNQVhQQVJFTlQ7IGkrKykgeworCQlpZiAocGFyZW50X29yaWdpbltpXSkgeworCQkJZHJvcF9vcmlnaW5fYmxvYihwYXJlbnRfb3JpZ2luW2ldKTsKKwkJCW9yaWdpbl9kZWNyZWYocGFyZW50X29yaWdpbltpXSk7CisJCX0KKwl9CisJZHJvcF9vcmlnaW5fYmxvYihvcmlnaW4pOworfQorCisvKgorICogSW5mb3JtYXRpb24gb24gY29tbWl0cywgdXNlZCBmb3Igb3V0cHV0LgorICovCitzdHJ1Y3QgY29tbWl0X2luZm8KK3sKKwljb25zdCBjaGFyICphdXRob3I7CisJY29uc3QgY2hhciAqYXV0aG9yX21haWw7CisJdW5zaWduZWQgbG9uZyBhdXRob3JfdGltZTsKKwljb25zdCBjaGFyICphdXRob3JfdHo7CisKKwkvKiBmaWxsZWQgb25seSB3aGVuIGFza2VkIGZvciBkZXRhaWxzICovCisJY29uc3QgY2hhciAqY29tbWl0dGVyOworCWNvbnN0IGNoYXIgKmNvbW1pdHRlcl9tYWlsOworCXVuc2lnbmVkIGxvbmcgY29tbWl0dGVyX3RpbWU7CisJY29uc3QgY2hhciAqY29tbWl0dGVyX3R6OworCisJY29uc3QgY2hhciAqc3VtbWFyeTsKK307CisKKy8qCisgKiBQYXJzZSBhdXRob3IvY29tbWl0dGVyIGxpbmUgaW4gdGhlIGNvbW1pdCBvYmplY3QgYnVmZmVyCisgKi8KK3N0YXRpYyB2b2lkIGdldF9hY19saW5lKGNvbnN0IGNoYXIgKmluYnVmLCBjb25zdCBjaGFyICp3aGF0LAorCQkJaW50IGJ1ZnN6LCBjaGFyICpwZXJzb24sIGNvbnN0IGNoYXIgKiptYWlsLAorCQkJdW5zaWduZWQgbG9uZyAqdGltZSwgY29uc3QgY2hhciAqKnR6KQoreworCWludCBsZW4sIHR6bGVuLCBtYWlsbGVuOworCWNoYXIgKnRtcCwgKmVuZHAsICp0aW1lcG9zOworCisJdG1wID0gc3Ryc3RyKGluYnVmLCB3aGF0KTsKKwlpZiAoIXRtcCkKKwkJZ290byBlcnJvcl9vdXQ7CisJdG1wICs9IHN0cmxlbih3aGF0KTsKKwllbmRwID0gc3RyY2hyKHRtcCwgJ1xuJyk7CisJaWYgKCFlbmRwKQorCQlsZW4gPSBzdHJsZW4odG1wKTsKKwllbHNlCisJCWxlbiA9IGVuZHAgLSB0bXA7CisJaWYgKGJ1ZnN6IDw9IGxlbikgeworCWVycm9yX291dDoKKwkJLyogVWdoICovCisJCSptYWlsID0gKnR6ID0gIih1bmtub3duKSI7CisJCSp0aW1lID0gMDsKKwkJcmV0dXJuOworCX0KKwltZW1jcHkocGVyc29uLCB0bXAsIGxlbik7CisKKwl0bXAgPSBwZXJzb247CisJdG1wICs9IGxlbjsKKwkqdG1wID0gMDsKKwl3aGlsZSAoKnRtcCAhPSAnICcpCisJCXRtcC0tOworCSp0eiA9IHRtcCsxOworCXR6bGVuID0gKHBlcnNvbitsZW4pLSh0bXArMSk7CisKKwkqdG1wID0gMDsKKwl3aGlsZSAoKnRtcCAhPSAnICcpCisJCXRtcC0tOworCSp0aW1lID0gc3RydG91bCh0bXAsIE5VTEwsIDEwKTsKKwl0aW1lcG9zID0gdG1wOworCisJKnRtcCA9IDA7CisJd2hpbGUgKCp0bXAgIT0gJyAnKQorCQl0bXAtLTsKKwkqbWFpbCA9IHRtcCArIDE7CisJKnRtcCA9IDA7CisJbWFpbGxlbiA9IHRpbWVwb3MgLSB0bXA7CisKKwlpZiAoIW1haWxtYXAubnIpCisJCXJldHVybjsKKworCS8qCisJICogbWFpbG1hcCBleHBhbnNpb24gbWF5IG1ha2UgdGhlIG5hbWUgbG9uZ2VyLgorCSAqIG1ha2Ugcm9vbSBieSBwdXNoaW5nIHN0dWZmIGRvd24uCisJICovCisJdG1wID0gcGVyc29uICsgYnVmc3ogLSAodHpsZW4gKyAxKTsKKwltZW1tb3ZlKHRtcCwgKnR6LCB0emxlbik7CisJdG1wW3R6bGVuXSA9IDA7CisJKnR6ID0gdG1wOworCisJdG1wID0gdG1wIC0gKG1haWxsZW4gKyAxKTsKKwltZW1tb3ZlKHRtcCwgKm1haWwsIG1haWxsZW4pOworCXRtcFttYWlsbGVuXSA9IDA7CisJKm1haWwgPSB0bXA7CisKKwkvKgorCSAqIE5vdywgY29udmVydCBlLW1haWwgdXNpbmcgbWFpbG1hcAorCSAqLworCW1hcF9lbWFpbCgmbWFpbG1hcCwgdG1wICsgMSwgcGVyc29uLCB0bXAtcGVyc29uLTEpOworfQorCitzdGF0aWMgdm9pZCBnZXRfY29tbWl0X2luZm8oc3RydWN0IGNvbW1pdCAqY29tbWl0LAorCQkJICAgIHN0cnVjdCBjb21taXRfaW5mbyAqcmV0LAorCQkJICAgIGludCBkZXRhaWxlZCkKK3sKKwlpbnQgbGVuOworCWNoYXIgKnRtcCwgKmVuZHA7CisJc3RhdGljIGNoYXIgYXV0aG9yX2J1ZlsxMDI0XTsKKwlzdGF0aWMgY2hhciBjb21taXR0ZXJfYnVmWzEwMjRdOworCXN0YXRpYyBjaGFyIHN1bW1hcnlfYnVmWzEwMjRdOworCisJLyoKKwkgKiBXZSd2ZSBvcGVyYXRlZCB3aXRob3V0IHNhdmVfY29tbWl0X2J1ZmZlciwgc28KKwkgKiB3ZSBub3cgbmVlZCB0byBwb3B1bGF0ZSB0aGVtIGZvciBvdXRwdXQuCisJICovCisJaWYgKCFjb21taXQtPmJ1ZmZlcikgeworCQllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwkJY29tbWl0LT5idWZmZXIgPQorCQkJcmVhZF9zaGExX2ZpbGUoY29tbWl0LT5vYmplY3Quc2hhMSwgJnR5cGUsICZzaXplKTsKKwkJaWYgKCFjb21taXQtPmJ1ZmZlcikKKwkJCWRpZSgiQ2Fubm90IHJlYWQgY29tbWl0ICVzIiwKKwkJCSAgICBzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisJfQorCXJldC0+YXV0aG9yID0gYXV0aG9yX2J1ZjsKKwlnZXRfYWNfbGluZShjb21taXQtPmJ1ZmZlciwgIlxuYXV0aG9yICIsCisJCSAgICBzaXplb2YoYXV0aG9yX2J1ZiksIGF1dGhvcl9idWYsICZyZXQtPmF1dGhvcl9tYWlsLAorCQkgICAgJnJldC0+YXV0aG9yX3RpbWUsICZyZXQtPmF1dGhvcl90eik7CisKKwlpZiAoIWRldGFpbGVkKQorCQlyZXR1cm47CisKKwlyZXQtPmNvbW1pdHRlciA9IGNvbW1pdHRlcl9idWY7CisJZ2V0X2FjX2xpbmUoY29tbWl0LT5idWZmZXIsICJcbmNvbW1pdHRlciAiLAorCQkgICAgc2l6ZW9mKGNvbW1pdHRlcl9idWYpLCBjb21taXR0ZXJfYnVmLCAmcmV0LT5jb21taXR0ZXJfbWFpbCwKKwkJICAgICZyZXQtPmNvbW1pdHRlcl90aW1lLCAmcmV0LT5jb21taXR0ZXJfdHopOworCisJcmV0LT5zdW1tYXJ5ID0gc3VtbWFyeV9idWY7CisJdG1wID0gc3Ryc3RyKGNvbW1pdC0+YnVmZmVyLCAiXG5cbiIpOworCWlmICghdG1wKSB7CisJZXJyb3Jfb3V0OgorCQlzcHJpbnRmKHN1bW1hcnlfYnVmLCAiKCVzKSIsIHNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKwkJcmV0dXJuOworCX0KKwl0bXAgKz0gMjsKKwllbmRwID0gc3RyY2hyKHRtcCwgJ1xuJyk7CisJaWYgKCFlbmRwKQorCQllbmRwID0gdG1wICsgc3RybGVuKHRtcCk7CisJbGVuID0gZW5kcCAtIHRtcDsKKwlpZiAobGVuID49IHNpemVvZihzdW1tYXJ5X2J1ZikgfHwgbGVuID09IDApCisJCWdvdG8gZXJyb3Jfb3V0OworCW1lbWNweShzdW1tYXJ5X2J1ZiwgdG1wLCBsZW4pOworCXN1bW1hcnlfYnVmW2xlbl0gPSAwOworfQorCisvKgorICogVG8gYWxsb3cgTEYgYW5kIG90aGVyIG5vbnBvcnRhYmxlIGNoYXJhY3RlcnMgaW4gcGF0aG5hbWVzLAorICogdGhleSBhcmUgYy1zdHlsZSBxdW90ZWQgYXMgbmVlZGVkLgorICovCitzdGF0aWMgdm9pZCB3cml0ZV9maWxlbmFtZV9pbmZvKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJcHJpbnRmKCJmaWxlbmFtZSAiKTsKKwl3cml0ZV9uYW1lX3F1b3RlZChwYXRoLCBzdGRvdXQsICdcbicpOworfQorCisvKgorICogVGhlIGJsYW1lX2VudHJ5IGlzIGZvdW5kIHRvIGJlIGd1aWx0eSBmb3IgdGhlIHJhbmdlLiAgTWFyayBpdAorICogYXMgc3VjaCwgYW5kIHNob3cgaXQgaW4gaW5jcmVtZW50YWwgb3V0cHV0LgorICovCitzdGF0aWMgdm9pZCBmb3VuZF9ndWlsdHlfZW50cnkoc3RydWN0IGJsYW1lX2VudHJ5ICplbnQpCit7CisJaWYgKGVudC0+Z3VpbHR5KQorCQlyZXR1cm47CisJZW50LT5ndWlsdHkgPSAxOworCWlmIChpbmNyZW1lbnRhbCkgeworCQlzdHJ1Y3Qgb3JpZ2luICpzdXNwZWN0ID0gZW50LT5zdXNwZWN0OworCisJCXByaW50ZigiJXMgJWQgJWQgJWRcbiIsCisJCSAgICAgICBzaGExX3RvX2hleChzdXNwZWN0LT5jb21taXQtPm9iamVjdC5zaGExKSwKKwkJICAgICAgIGVudC0+c19sbm8gKyAxLCBlbnQtPmxubyArIDEsIGVudC0+bnVtX2xpbmVzKTsKKwkJaWYgKCEoc3VzcGVjdC0+Y29tbWl0LT5vYmplY3QuZmxhZ3MgJiBNRVRBSU5GT19TSE9XTikpIHsKKwkJCXN0cnVjdCBjb21taXRfaW5mbyBjaTsKKwkJCXN1c3BlY3QtPmNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IE1FVEFJTkZPX1NIT1dOOworCQkJZ2V0X2NvbW1pdF9pbmZvKHN1c3BlY3QtPmNvbW1pdCwgJmNpLCAxKTsKKwkJCXByaW50ZigiYXV0aG9yICVzXG4iLCBjaS5hdXRob3IpOworCQkJcHJpbnRmKCJhdXRob3ItbWFpbCAlc1xuIiwgY2kuYXV0aG9yX21haWwpOworCQkJcHJpbnRmKCJhdXRob3ItdGltZSAlbHVcbiIsIGNpLmF1dGhvcl90aW1lKTsKKwkJCXByaW50ZigiYXV0aG9yLXR6ICVzXG4iLCBjaS5hdXRob3JfdHopOworCQkJcHJpbnRmKCJjb21taXR0ZXIgJXNcbiIsIGNpLmNvbW1pdHRlcik7CisJCQlwcmludGYoImNvbW1pdHRlci1tYWlsICVzXG4iLCBjaS5jb21taXR0ZXJfbWFpbCk7CisJCQlwcmludGYoImNvbW1pdHRlci10aW1lICVsdVxuIiwgY2kuY29tbWl0dGVyX3RpbWUpOworCQkJcHJpbnRmKCJjb21taXR0ZXItdHogJXNcbiIsIGNpLmNvbW1pdHRlcl90eik7CisJCQlwcmludGYoInN1bW1hcnkgJXNcbiIsIGNpLnN1bW1hcnkpOworCQkJaWYgKHN1c3BlY3QtPmNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykKKwkJCQlwcmludGYoImJvdW5kYXJ5XG4iKTsKKwkJfQorCQl3cml0ZV9maWxlbmFtZV9pbmZvKHN1c3BlY3QtPnBhdGgpOworCQltYXliZV9mbHVzaF9vcl9kaWUoc3Rkb3V0LCAic3Rkb3V0Iik7CisJfQorfQorCisvKgorICogVGhlIG1haW4gbG9vcCAtLSB3aGlsZSB0aGUgc2NvcmVib2FyZCBoYXMgbGluZXMgd2hvc2UgdHJ1ZSBvcmlnaW4KKyAqIGlzIHN0aWxsIHVua25vd24sIHBpY2sgb25lIGJsYW1lX2VudHJ5LCBhbmQgYWxsb3cgaXRzIGN1cnJlbnQKKyAqIHN1c3BlY3QgdG8gcGFzcyBibGFtZXMgdG8gaXRzIHBhcmVudHMuCisgKi8KK3N0YXRpYyB2b2lkIGFzc2lnbl9ibGFtZShzdHJ1Y3Qgc2NvcmVib2FyZCAqc2IsIHN0cnVjdCByZXZfaW5mbyAqcmV2cywgaW50IG9wdCkKK3sKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgYmxhbWVfZW50cnkgKmVudDsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCQlzdHJ1Y3Qgb3JpZ2luICpzdXNwZWN0ID0gTlVMTDsKKworCQkvKiBmaW5kIG9uZSBzdXNwZWN0IHRvIGJyZWFrIGRvd24gKi8KKwkJZm9yIChlbnQgPSBzYi0+ZW50OyAhc3VzcGVjdCAmJiBlbnQ7IGVudCA9IGVudC0+bmV4dCkKKwkJCWlmICghZW50LT5ndWlsdHkpCisJCQkJc3VzcGVjdCA9IGVudC0+c3VzcGVjdDsKKwkJaWYgKCFzdXNwZWN0KQorCQkJcmV0dXJuOyAvKiBhbGwgZG9uZSAqLworCisJCS8qCisJCSAqIFdlIHdpbGwgdXNlIHRoaXMgc3VzcGVjdCBsYXRlciBpbiB0aGUgbG9vcCwKKwkJICogc28gaG9sZCBvbnRvIGl0IGluIHRoZSBtZWFudGltZS4KKwkJICovCisJCW9yaWdpbl9pbmNyZWYoc3VzcGVjdCk7CisJCWNvbW1pdCA9IHN1c3BlY3QtPmNvbW1pdDsKKwkJaWYgKCFjb21taXQtPm9iamVjdC5wYXJzZWQpCisJCQlwYXJzZV9jb21taXQoY29tbWl0KTsKKwkJaWYgKCEoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSAmJgorCQkgICAgIShyZXZzLT5tYXhfYWdlICE9IC0xICYmIGNvbW1pdC0+ZGF0ZSA8IHJldnMtPm1heF9hZ2UpKQorCQkJcGFzc19ibGFtZShzYiwgc3VzcGVjdCwgb3B0KTsKKwkJZWxzZSB7CisJCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworCQkJaWYgKGNvbW1pdC0+b2JqZWN0LnBhcnNlZCkKKwkJCQltYXJrX3BhcmVudHNfdW5pbnRlcmVzdGluZyhjb21taXQpOworCQl9CisJCS8qIHRyZWF0IHJvb3QgY29tbWl0IGFzIGJvdW5kYXJ5ICovCisJCWlmICghY29tbWl0LT5wYXJlbnRzICYmICFzaG93X3Jvb3QpCisJCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworCisJCS8qIFRha2UgcmVzcG9uc2liaWxpdHkgZm9yIHRoZSByZW1haW5pbmcgZW50cmllcyAqLworCQlmb3IgKGVudCA9IHNiLT5lbnQ7IGVudDsgZW50ID0gZW50LT5uZXh0KQorCQkJaWYgKHNhbWVfc3VzcGVjdChlbnQtPnN1c3BlY3QsIHN1c3BlY3QpKQorCQkJCWZvdW5kX2d1aWx0eV9lbnRyeShlbnQpOworCQlvcmlnaW5fZGVjcmVmKHN1c3BlY3QpOworCisJCWlmIChERUJVRykgLyogc2FuaXR5ICovCisJCQlzYW5pdHlfY2hlY2tfcmVmY250KHNiKTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpmb3JtYXRfdGltZSh1bnNpZ25lZCBsb25nIHRpbWUsIGNvbnN0IGNoYXIgKnR6X3N0ciwKKwkJCSAgICAgICBpbnQgc2hvd19yYXdfdGltZSkKK3sKKwlzdGF0aWMgY2hhciB0aW1lX2J1ZlsxMjhdOworCXRpbWVfdCB0ID0gdGltZTsKKwlpbnQgbWludXRlcywgdHo7CisJc3RydWN0IHRtICp0bTsKKworCWlmIChzaG93X3Jhd190aW1lKSB7CisJCXNwcmludGYodGltZV9idWYsICIlbHUgJXMiLCB0aW1lLCB0el9zdHIpOworCQlyZXR1cm4gdGltZV9idWY7CisJfQorCisJdHogPSBhdG9pKHR6X3N0cik7CisJbWludXRlcyA9IHR6IDwgMCA/IC10eiA6IHR6OworCW1pbnV0ZXMgPSAobWludXRlcyAvIDEwMCkqNjAgKyAobWludXRlcyAlIDEwMCk7CisJbWludXRlcyA9IHR6IDwgMCA/IC1taW51dGVzIDogbWludXRlczsKKwl0ID0gdGltZSArIG1pbnV0ZXMgKiA2MDsKKwl0bSA9IGdtdGltZSgmdCk7CisKKwlzdHJmdGltZSh0aW1lX2J1Ziwgc2l6ZW9mKHRpbWVfYnVmKSwgIiVZLSVtLSVkICVIOiVNOiVTICIsIHRtKTsKKwlzdHJjYXQodGltZV9idWYsIHR6X3N0cik7CisJcmV0dXJuIHRpbWVfYnVmOworfQorCisjZGVmaW5lIE9VVFBVVF9BTk5PVEFURV9DT01QQVQJMDAxCisjZGVmaW5lIE9VVFBVVF9MT05HX09CSkVDVF9OQU1FCTAwMgorI2RlZmluZSBPVVRQVVRfUkFXX1RJTUVTVEFNUAkwMDQKKyNkZWZpbmUgT1VUUFVUX1BPUkNFTEFJTgkwMTAKKyNkZWZpbmUgT1VUUFVUX1NIT1dfTkFNRQkwMjAKKyNkZWZpbmUgT1VUUFVUX1NIT1dfTlVNQkVSCTA0MAorI2RlZmluZSBPVVRQVVRfU0hPV19TQ09SRSAgICAgIDAxMDAKKyNkZWZpbmUgT1VUUFVUX05PX0FVVEhPUiAgICAgICAwMjAwCisKK3N0YXRpYyB2b2lkIGVtaXRfcG9yY2VsYWluKHN0cnVjdCBzY29yZWJvYXJkICpzYiwgc3RydWN0IGJsYW1lX2VudHJ5ICplbnQpCit7CisJaW50IGNudDsKKwljb25zdCBjaGFyICpjcDsKKwlzdHJ1Y3Qgb3JpZ2luICpzdXNwZWN0ID0gZW50LT5zdXNwZWN0OworCWNoYXIgaGV4WzQxXTsKKworCXN0cmNweShoZXgsIHNoYTFfdG9faGV4KHN1c3BlY3QtPmNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKwlwcmludGYoIiVzJWMlZCAlZCAlZFxuIiwKKwkgICAgICAgaGV4LAorCSAgICAgICBlbnQtPmd1aWx0eSA/ICcgJyA6ICcqJywgLy8gcHVyZWx5IGZvciBkZWJ1Z2dpbmcKKwkgICAgICAgZW50LT5zX2xubyArIDEsCisJICAgICAgIGVudC0+bG5vICsgMSwKKwkgICAgICAgZW50LT5udW1fbGluZXMpOworCWlmICghKHN1c3BlY3QtPmNvbW1pdC0+b2JqZWN0LmZsYWdzICYgTUVUQUlORk9fU0hPV04pKSB7CisJCXN0cnVjdCBjb21taXRfaW5mbyBjaTsKKwkJc3VzcGVjdC0+Y29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gTUVUQUlORk9fU0hPV047CisJCWdldF9jb21taXRfaW5mbyhzdXNwZWN0LT5jb21taXQsICZjaSwgMSk7CisJCXByaW50ZigiYXV0aG9yICVzXG4iLCBjaS5hdXRob3IpOworCQlwcmludGYoImF1dGhvci1tYWlsICVzXG4iLCBjaS5hdXRob3JfbWFpbCk7CisJCXByaW50ZigiYXV0aG9yLXRpbWUgJWx1XG4iLCBjaS5hdXRob3JfdGltZSk7CisJCXByaW50ZigiYXV0aG9yLXR6ICVzXG4iLCBjaS5hdXRob3JfdHopOworCQlwcmludGYoImNvbW1pdHRlciAlc1xuIiwgY2kuY29tbWl0dGVyKTsKKwkJcHJpbnRmKCJjb21taXR0ZXItbWFpbCAlc1xuIiwgY2kuY29tbWl0dGVyX21haWwpOworCQlwcmludGYoImNvbW1pdHRlci10aW1lICVsdVxuIiwgY2kuY29tbWl0dGVyX3RpbWUpOworCQlwcmludGYoImNvbW1pdHRlci10eiAlc1xuIiwgY2kuY29tbWl0dGVyX3R6KTsKKwkJd3JpdGVfZmlsZW5hbWVfaW5mbyhzdXNwZWN0LT5wYXRoKTsKKwkJcHJpbnRmKCJzdW1tYXJ5ICVzXG4iLCBjaS5zdW1tYXJ5KTsKKwkJaWYgKHN1c3BlY3QtPmNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykKKwkJCXByaW50ZigiYm91bmRhcnlcbiIpOworCX0KKwllbHNlIGlmIChzdXNwZWN0LT5jb21taXQtPm9iamVjdC5mbGFncyAmIE1PUkVfVEhBTl9PTkVfUEFUSCkKKwkJd3JpdGVfZmlsZW5hbWVfaW5mbyhzdXNwZWN0LT5wYXRoKTsKKworCWNwID0gbnRoX2xpbmUoc2IsIGVudC0+bG5vKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IGVudC0+bnVtX2xpbmVzOyBjbnQrKykgeworCQljaGFyIGNoOworCQlpZiAoY250KQorCQkJcHJpbnRmKCIlcyAlZCAlZFxuIiwgaGV4LAorCQkJICAgICAgIGVudC0+c19sbm8gKyAxICsgY250LAorCQkJICAgICAgIGVudC0+bG5vICsgMSArIGNudCk7CisJCXB1dGNoYXIoJ1x0Jyk7CisJCWRvIHsKKwkJCWNoID0gKmNwKys7CisJCQlwdXRjaGFyKGNoKTsKKwkJfSB3aGlsZSAoY2ggIT0gJ1xuJyAmJgorCQkJIGNwIDwgc2ItPmZpbmFsX2J1ZiArIHNiLT5maW5hbF9idWZfc2l6ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbWl0X290aGVyKHN0cnVjdCBzY29yZWJvYXJkICpzYiwgc3RydWN0IGJsYW1lX2VudHJ5ICplbnQsIGludCBvcHQpCit7CisJaW50IGNudDsKKwljb25zdCBjaGFyICpjcDsKKwlzdHJ1Y3Qgb3JpZ2luICpzdXNwZWN0ID0gZW50LT5zdXNwZWN0OworCXN0cnVjdCBjb21taXRfaW5mbyBjaTsKKwljaGFyIGhleFs0MV07CisJaW50IHNob3dfcmF3X3RpbWUgPSAhIShvcHQgJiBPVVRQVVRfUkFXX1RJTUVTVEFNUCk7CisKKwlnZXRfY29tbWl0X2luZm8oc3VzcGVjdC0+Y29tbWl0LCAmY2ksIDEpOworCXN0cmNweShoZXgsIHNoYTFfdG9faGV4KHN1c3BlY3QtPmNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKworCWNwID0gbnRoX2xpbmUoc2IsIGVudC0+bG5vKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IGVudC0+bnVtX2xpbmVzOyBjbnQrKykgeworCQljaGFyIGNoOworCQlpbnQgbGVuZ3RoID0gKG9wdCAmIE9VVFBVVF9MT05HX09CSkVDVF9OQU1FKSA/IDQwIDogODsKKworCQlpZiAoc3VzcGVjdC0+Y29tbWl0LT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSB7CisJCQlpZiAoYmxhbmtfYm91bmRhcnkpCisJCQkJbWVtc2V0KGhleCwgJyAnLCBsZW5ndGgpOworCQkJZWxzZSBpZiAoIWNtZF9pc19hbm5vdGF0ZSkgeworCQkJCWxlbmd0aC0tOworCQkJCXB1dGNoYXIoJ14nKTsKKwkJCX0KKwkJfQorCisJCXByaW50ZigiJS4qcyIsIGxlbmd0aCwgaGV4KTsKKwkJaWYgKG9wdCAmIE9VVFBVVF9BTk5PVEFURV9DT01QQVQpCisJCQlwcmludGYoIlx0KCUxMHNcdCUxMHNcdCVkKSIsIGNpLmF1dGhvciwKKwkJCSAgICAgICBmb3JtYXRfdGltZShjaS5hdXRob3JfdGltZSwgY2kuYXV0aG9yX3R6LAorCQkJCQkgICBzaG93X3Jhd190aW1lKSwKKwkJCSAgICAgICBlbnQtPmxubyArIDEgKyBjbnQpOworCQllbHNlIHsKKwkJCWlmIChvcHQgJiBPVVRQVVRfU0hPV19TQ09SRSkKKwkJCQlwcmludGYoIiAlKmQgJTAyZCIsCisJCQkJICAgICAgIG1heF9zY29yZV9kaWdpdHMsIGVudC0+c2NvcmUsCisJCQkJICAgICAgIGVudC0+c3VzcGVjdC0+cmVmY250KTsKKwkJCWlmIChvcHQgJiBPVVRQVVRfU0hPV19OQU1FKQorCQkJCXByaW50ZigiICUtKi4qcyIsIGxvbmdlc3RfZmlsZSwgbG9uZ2VzdF9maWxlLAorCQkJCSAgICAgICBzdXNwZWN0LT5wYXRoKTsKKwkJCWlmIChvcHQgJiBPVVRQVVRfU0hPV19OVU1CRVIpCisJCQkJcHJpbnRmKCIgJSpkIiwgbWF4X29yaWdfZGlnaXRzLAorCQkJCSAgICAgICBlbnQtPnNfbG5vICsgMSArIGNudCk7CisKKwkJCWlmICghKG9wdCAmIE9VVFBVVF9OT19BVVRIT1IpKQorCQkJCXByaW50ZigiICglLSouKnMgJTEwcyIsCisJCQkJICAgICAgIGxvbmdlc3RfYXV0aG9yLCBsb25nZXN0X2F1dGhvciwKKwkJCQkgICAgICAgY2kuYXV0aG9yLAorCQkJCSAgICAgICBmb3JtYXRfdGltZShjaS5hdXRob3JfdGltZSwKKwkJCQkJCSAgIGNpLmF1dGhvcl90eiwKKwkJCQkJCSAgIHNob3dfcmF3X3RpbWUpKTsKKwkJCXByaW50ZigiICUqZCkgIiwKKwkJCSAgICAgICBtYXhfZGlnaXRzLCBlbnQtPmxubyArIDEgKyBjbnQpOworCQl9CisJCWRvIHsKKwkJCWNoID0gKmNwKys7CisJCQlwdXRjaGFyKGNoKTsKKwkJfSB3aGlsZSAoY2ggIT0gJ1xuJyAmJgorCQkJIGNwIDwgc2ItPmZpbmFsX2J1ZiArIHNiLT5maW5hbF9idWZfc2l6ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBvdXRwdXQoc3RydWN0IHNjb3JlYm9hcmQgKnNiLCBpbnQgb3B0aW9uKQoreworCXN0cnVjdCBibGFtZV9lbnRyeSAqZW50OworCisJaWYgKG9wdGlvbiAmIE9VVFBVVF9QT1JDRUxBSU4pIHsKKwkJZm9yIChlbnQgPSBzYi0+ZW50OyBlbnQ7IGVudCA9IGVudC0+bmV4dCkgeworCQkJc3RydWN0IGJsYW1lX2VudHJ5ICpvdGg7CisJCQlzdHJ1Y3Qgb3JpZ2luICpzdXNwZWN0ID0gZW50LT5zdXNwZWN0OworCQkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gc3VzcGVjdC0+Y29tbWl0OworCQkJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgTU9SRV9USEFOX09ORV9QQVRIKQorCQkJCWNvbnRpbnVlOworCQkJZm9yIChvdGggPSBlbnQtPm5leHQ7IG90aDsgb3RoID0gb3RoLT5uZXh0KSB7CisJCQkJaWYgKChvdGgtPnN1c3BlY3QtPmNvbW1pdCAhPSBjb21taXQpIHx8CisJCQkJICAgICFzdHJjbXAob3RoLT5zdXNwZWN0LT5wYXRoLCBzdXNwZWN0LT5wYXRoKSkKKwkJCQkJY29udGludWU7CisJCQkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gTU9SRV9USEFOX09ORV9QQVRIOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJZm9yIChlbnQgPSBzYi0+ZW50OyBlbnQ7IGVudCA9IGVudC0+bmV4dCkgeworCQlpZiAob3B0aW9uICYgT1VUUFVUX1BPUkNFTEFJTikKKwkJCWVtaXRfcG9yY2VsYWluKHNiLCBlbnQpOworCQllbHNlIHsKKwkJCWVtaXRfb3RoZXIoc2IsIGVudCwgb3B0aW9uKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFRvIGFsbG93IHF1aWNrIGFjY2VzcyB0byB0aGUgY29udGVudHMgb2YgbnRoIGxpbmUgaW4gdGhlCisgKiBmaW5hbCBpbWFnZSwgcHJlcGFyZSBhbiBpbmRleCBpbiB0aGUgc2NvcmVib2FyZC4KKyAqLworc3RhdGljIGludCBwcmVwYXJlX2xpbmVzKHN0cnVjdCBzY29yZWJvYXJkICpzYikKK3sKKwljb25zdCBjaGFyICpidWYgPSBzYi0+ZmluYWxfYnVmOworCXVuc2lnbmVkIGxvbmcgbGVuID0gc2ItPmZpbmFsX2J1Zl9zaXplOworCWludCBudW0gPSAwLCBpbmNvbXBsZXRlID0gMCwgYm9sID0gMTsKKworCWlmIChsZW4gJiYgYnVmW2xlbi0xXSAhPSAnXG4nKQorCQlpbmNvbXBsZXRlKys7IC8qIGluY29tcGxldGUgbGluZSBhdCB0aGUgZW5kICovCisJd2hpbGUgKGxlbi0tKSB7CisJCWlmIChib2wpIHsKKwkJCXNiLT5saW5lbm8gPSB4cmVhbGxvYyhzYi0+bGluZW5vLAorCQkJCQkgICAgICBzaXplb2YoaW50KiApICogKG51bSArIDEpKTsKKwkJCXNiLT5saW5lbm9bbnVtXSA9IGJ1ZiAtIHNiLT5maW5hbF9idWY7CisJCQlib2wgPSAwOworCQl9CisJCWlmICgqYnVmKysgPT0gJ1xuJykgeworCQkJbnVtKys7CisJCQlib2wgPSAxOworCQl9CisJfQorCXNiLT5saW5lbm8gPSB4cmVhbGxvYyhzYi0+bGluZW5vLAorCQkJICAgICAgc2l6ZW9mKGludCogKSAqIChudW0gKyBpbmNvbXBsZXRlICsgMSkpOworCXNiLT5saW5lbm9bbnVtICsgaW5jb21wbGV0ZV0gPSBidWYgLSBzYi0+ZmluYWxfYnVmOworCXNiLT5udW1fbGluZXMgPSBudW0gKyBpbmNvbXBsZXRlOworCXJldHVybiBzYi0+bnVtX2xpbmVzOworfQorCisvKgorICogQWRkIHBob255IGdyYWZ0cyBmb3IgdXNlIHdpdGggLVM7IHRoaXMgaXMgcHJpbWFyaWx5IHRvCisgKiBzdXBwb3J0IGdpdC1jdnNzZXJ2ZXIgdGhhdCB3YW50cyB0byBnaXZlIGEgbGluZWFyIGhpc3RvcnkKKyAqIHRvIGl0cyBjbGllbnRzLgorICovCitzdGF0aWMgaW50IHJlYWRfYW5jZXN0cnkoY29uc3QgY2hhciAqZ3JhZnRfZmlsZSkKK3sKKwlGSUxFICpmcCA9IGZvcGVuKGdyYWZ0X2ZpbGUsICJyIik7CisJY2hhciBidWZbMTAyNF07CisJaWYgKCFmcCkKKwkJcmV0dXJuIC0xOworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkpIHsKKwkJLyogVGhlIGZvcm1hdCBpcyBqdXN0ICJDb21taXQgUGFyZW50MSBQYXJlbnQyIC4uLlxuIiAqLworCQlpbnQgbGVuID0gc3RybGVuKGJ1Zik7CisJCXN0cnVjdCBjb21taXRfZ3JhZnQgKmdyYWZ0ID0gcmVhZF9ncmFmdF9saW5lKGJ1ZiwgbGVuKTsKKwkJaWYgKGdyYWZ0KQorCQkJcmVnaXN0ZXJfY29tbWl0X2dyYWZ0KGdyYWZ0LCAwKTsKKwl9CisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEhvdyBtYW55IGNvbHVtbnMgZG8gd2UgbmVlZCB0byBzaG93IGxpbmUgbnVtYmVycyBpbiBkZWNpbWFsPworICovCitzdGF0aWMgaW50IGxpbmVub193aWR0aChpbnQgbGluZXMpCit7CisJaW50IGksIHdpZHRoOworCisJZm9yICh3aWR0aCA9IDEsIGkgPSAxMDsgaSA8PSBsaW5lcyArIDE7IHdpZHRoKyspCisJCWkgKj0gMTA7CisJcmV0dXJuIHdpZHRoOworfQorCisvKgorICogSG93IG1hbnkgY29sdW1ucyBkbyB3ZSBuZWVkIHRvIHNob3cgbGluZSBudW1iZXJzLCBhdXRob3JzLAorICogYW5kIGZpbGVuYW1lcz8KKyAqLworc3RhdGljIHZvaWQgZmluZF9hbGlnbm1lbnQoc3RydWN0IHNjb3JlYm9hcmQgKnNiLCBpbnQgKm9wdGlvbikKK3sKKwlpbnQgbG9uZ2VzdF9zcmNfbGluZXMgPSAwOworCWludCBsb25nZXN0X2RzdF9saW5lcyA9IDA7CisJdW5zaWduZWQgbGFyZ2VzdF9zY29yZSA9IDA7CisJc3RydWN0IGJsYW1lX2VudHJ5ICplOworCisJZm9yIChlID0gc2ItPmVudDsgZTsgZSA9IGUtPm5leHQpIHsKKwkJc3RydWN0IG9yaWdpbiAqc3VzcGVjdCA9IGUtPnN1c3BlY3Q7CisJCXN0cnVjdCBjb21taXRfaW5mbyBjaTsKKwkJaW50IG51bTsKKworCQlpZiAoc3RyY21wKHN1c3BlY3QtPnBhdGgsIHNiLT5wYXRoKSkKKwkJCSpvcHRpb24gfD0gT1VUUFVUX1NIT1dfTkFNRTsKKwkJbnVtID0gc3RybGVuKHN1c3BlY3QtPnBhdGgpOworCQlpZiAobG9uZ2VzdF9maWxlIDwgbnVtKQorCQkJbG9uZ2VzdF9maWxlID0gbnVtOworCQlpZiAoIShzdXNwZWN0LT5jb21taXQtPm9iamVjdC5mbGFncyAmIE1FVEFJTkZPX1NIT1dOKSkgeworCQkJc3VzcGVjdC0+Y29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gTUVUQUlORk9fU0hPV047CisJCQlnZXRfY29tbWl0X2luZm8oc3VzcGVjdC0+Y29tbWl0LCAmY2ksIDEpOworCQkJbnVtID0gc3RybGVuKGNpLmF1dGhvcik7CisJCQlpZiAobG9uZ2VzdF9hdXRob3IgPCBudW0pCisJCQkJbG9uZ2VzdF9hdXRob3IgPSBudW07CisJCX0KKwkJbnVtID0gZS0+c19sbm8gKyBlLT5udW1fbGluZXM7CisJCWlmIChsb25nZXN0X3NyY19saW5lcyA8IG51bSkKKwkJCWxvbmdlc3Rfc3JjX2xpbmVzID0gbnVtOworCQludW0gPSBlLT5sbm8gKyBlLT5udW1fbGluZXM7CisJCWlmIChsb25nZXN0X2RzdF9saW5lcyA8IG51bSkKKwkJCWxvbmdlc3RfZHN0X2xpbmVzID0gbnVtOworCQlpZiAobGFyZ2VzdF9zY29yZSA8IGVudF9zY29yZShzYiwgZSkpCisJCQlsYXJnZXN0X3Njb3JlID0gZW50X3Njb3JlKHNiLCBlKTsKKwl9CisJbWF4X29yaWdfZGlnaXRzID0gbGluZW5vX3dpZHRoKGxvbmdlc3Rfc3JjX2xpbmVzKTsKKwltYXhfZGlnaXRzID0gbGluZW5vX3dpZHRoKGxvbmdlc3RfZHN0X2xpbmVzKTsKKwltYXhfc2NvcmVfZGlnaXRzID0gbGluZW5vX3dpZHRoKGxhcmdlc3Rfc2NvcmUpOworfQorCisvKgorICogRm9yIGRlYnVnZ2luZyAtLSBvcmlnaW4gaXMgcmVmY291bnRlZCwgYW5kIHRoaXMgYXNzZXJ0cyB0aGF0CisgKiB3ZSBkbyBub3QgdW5kZXJmbG93LgorICovCitzdGF0aWMgdm9pZCBzYW5pdHlfY2hlY2tfcmVmY250KHN0cnVjdCBzY29yZWJvYXJkICpzYikKK3sKKwlpbnQgYmFhID0gMDsKKwlzdHJ1Y3QgYmxhbWVfZW50cnkgKmVudDsKKworCWZvciAoZW50ID0gc2ItPmVudDsgZW50OyBlbnQgPSBlbnQtPm5leHQpIHsKKwkJLyogTm9ib2R5IHNob3VsZCBoYXZlIHplcm8gb3IgbmVnYXRpdmUgcmVmY250ICovCisJCWlmIChlbnQtPnN1c3BlY3QtPnJlZmNudCA8PSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIGluICVzIGhhcyBuZWdhdGl2ZSByZWZjbnQgJWRcbiIsCisJCQkJZW50LT5zdXNwZWN0LT5wYXRoLAorCQkJCXNoYTFfdG9faGV4KGVudC0+c3VzcGVjdC0+Y29tbWl0LT5vYmplY3Quc2hhMSksCisJCQkJZW50LT5zdXNwZWN0LT5yZWZjbnQpOworCQkJYmFhID0gMTsKKwkJfQorCX0KKwlmb3IgKGVudCA9IHNiLT5lbnQ7IGVudDsgZW50ID0gZW50LT5uZXh0KSB7CisJCS8qIE1hcmsgdGhlIG9uZXMgdGhhdCBoYXZlbid0IGJlZW4gY2hlY2tlZCAqLworCQlpZiAoMCA8IGVudC0+c3VzcGVjdC0+cmVmY250KQorCQkJZW50LT5zdXNwZWN0LT5yZWZjbnQgPSAtZW50LT5zdXNwZWN0LT5yZWZjbnQ7CisJfQorCWZvciAoZW50ID0gc2ItPmVudDsgZW50OyBlbnQgPSBlbnQtPm5leHQpIHsKKwkJLyoKKwkJICogLi4uIHRoZW4gcGljayBlYWNoIGFuZCBzZWUgaWYgdGhleSBoYXZlIHRoZSB0aGUKKwkJICogY29ycmVjdCByZWZjbnQuCisJCSAqLworCQlpbnQgZm91bmQ7CisJCXN0cnVjdCBibGFtZV9lbnRyeSAqZTsKKwkJc3RydWN0IG9yaWdpbiAqc3VzcGVjdCA9IGVudC0+c3VzcGVjdDsKKworCQlpZiAoMCA8IHN1c3BlY3QtPnJlZmNudCkKKwkJCWNvbnRpbnVlOworCQlzdXNwZWN0LT5yZWZjbnQgPSAtc3VzcGVjdC0+cmVmY250OyAvKiBVbm1hcmsgKi8KKwkJZm9yIChmb3VuZCA9IDAsIGUgPSBzYi0+ZW50OyBlOyBlID0gZS0+bmV4dCkgeworCQkJaWYgKGUtPnN1c3BlY3QgIT0gc3VzcGVjdCkKKwkJCQljb250aW51ZTsKKwkJCWZvdW5kKys7CisJCX0KKwkJaWYgKHN1c3BlY3QtPnJlZmNudCAhPSBmb3VuZCkgeworCQkJZnByaW50ZihzdGRlcnIsICIlcyBpbiAlcyBoYXMgcmVmY250ICVkLCBub3QgJWRcbiIsCisJCQkJZW50LT5zdXNwZWN0LT5wYXRoLAorCQkJCXNoYTFfdG9faGV4KGVudC0+c3VzcGVjdC0+Y29tbWl0LT5vYmplY3Quc2hhMSksCisJCQkJZW50LT5zdXNwZWN0LT5yZWZjbnQsIGZvdW5kKTsKKwkJCWJhYSA9IDI7CisJCX0KKwl9CisJaWYgKGJhYSkgeworCQlpbnQgb3B0ID0gMDE2MDsKKwkJZmluZF9hbGlnbm1lbnQoc2IsICZvcHQpOworCQlvdXRwdXQoc2IsIG9wdCk7CisJCWRpZSgiQmFhICVkISIsIGJhYSk7CisJfQorfQorCisvKgorICogVXNlZCBmb3IgdGhlIGNvbW1hbmQgbGluZSBwYXJzaW5nOyBjaGVjayBpZiB0aGUgcGF0aCBleGlzdHMKKyAqIGluIHRoZSB3b3JraW5nIHRyZWUuCisgKi8KK3N0YXRpYyBpbnQgaGFzX3BhdGhfaW5fd29ya190cmVlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJcmV0dXJuICFsc3RhdChwYXRoLCAmc3QpOworfQorCitzdGF0aWMgdW5zaWduZWQgcGFyc2Vfc2NvcmUoY29uc3QgY2hhciAqYXJnKQoreworCWNoYXIgKmVuZDsKKwl1bnNpZ25lZCBsb25nIHNjb3JlID0gc3RydG91bChhcmcsICZlbmQsIDEwKTsKKwlpZiAoKmVuZCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHNjb3JlOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYWRkX3ByZWZpeChjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJcmV0dXJuIHByZWZpeF9wYXRoKHByZWZpeCwgcHJlZml4ID8gc3RybGVuKHByZWZpeCkgOiAwLCBwYXRoKTsKK30KKworLyoKKyAqIFBhcnNpbmcgb2YgKGNvbW1hIHNlcGFyYXRlZCkgb25lIGl0ZW0gaW4gdGhlIC1MIG9wdGlvbgorICovCitzdGF0aWMgY29uc3QgY2hhciAqcGFyc2VfbG9jKGNvbnN0IGNoYXIgKnNwZWMsCisJCQkgICAgIHN0cnVjdCBzY29yZWJvYXJkICpzYiwgbG9uZyBsbm8sCisJCQkgICAgIGxvbmcgYmVnaW4sIGxvbmcgKnJldCkKK3sKKwljaGFyICp0ZXJtOworCWNvbnN0IGNoYXIgKmxpbmU7CisJbG9uZyBudW07CisJaW50IHJlZ19lcnJvcjsKKwlyZWdleF90IHJlZ2V4cDsKKwlyZWdtYXRjaF90IG1hdGNoWzFdOworCisJLyogQWxsb3cgIi1MIDxzb21ldGhpbmc+LCsyMCIgdG8gbWVhbiBzdGFydGluZyBhdCA8c29tZXRoaW5nPgorCSAqIGZvciAyMCBsaW5lcywgb3IgIi1MIDxzb21ldGhpbmc+LC01IiBmb3IgNSBsaW5lcyBlbmRpbmcgYXQKKwkgKiA8c29tZXRoaW5nPi4KKwkgKi8KKwlpZiAoMSA8IGJlZ2luICYmIChzcGVjWzBdID09ICcrJyB8fCBzcGVjWzBdID09ICctJykpIHsKKwkJbnVtID0gc3RydG9sKHNwZWMgKyAxLCAmdGVybSwgMTApOworCQlpZiAodGVybSAhPSBzcGVjICsgMSkgeworCQkJaWYgKHNwZWNbMF0gPT0gJy0nKQorCQkJCW51bSA9IDAgLSBudW07CisJCQlpZiAoMCA8IG51bSkKKwkJCQkqcmV0ID0gYmVnaW4gKyBudW0gLSAyOworCQkJZWxzZSBpZiAoIW51bSkKKwkJCQkqcmV0ID0gYmVnaW47CisJCQllbHNlCisJCQkJKnJldCA9IGJlZ2luICsgbnVtOworCQkJcmV0dXJuIHRlcm07CisJCX0KKwkJcmV0dXJuIHNwZWM7CisJfQorCW51bSA9IHN0cnRvbChzcGVjLCAmdGVybSwgMTApOworCWlmICh0ZXJtICE9IHNwZWMpIHsKKwkJKnJldCA9IG51bTsKKwkJcmV0dXJuIHRlcm07CisJfQorCWlmIChzcGVjWzBdICE9ICcvJykKKwkJcmV0dXJuIHNwZWM7CisKKwkvKiBpdCBjb3VsZCBiZSBhIHJlZ2V4cCBvZiBmb3JtIC8uLi4vICovCisJZm9yICh0ZXJtID0gKGNoYXIqKSBzcGVjICsgMTsgKnRlcm0gJiYgKnRlcm0gIT0gJy8nOyB0ZXJtKyspIHsKKwkJaWYgKCp0ZXJtID09ICdcXCcpCisJCQl0ZXJtKys7CisJfQorCWlmICgqdGVybSAhPSAnLycpCisJCXJldHVybiBzcGVjOworCisJLyogdHJ5IFtzcGVjKzEgLi4gdGVybS0xXSBhcyByZWdleHAgKi8KKwkqdGVybSA9IDA7CisJYmVnaW4tLTsgLyogaW5wdXQgaXMgaW4gaHVtYW4gdGVybXMgKi8KKwlsaW5lID0gbnRoX2xpbmUoc2IsIGJlZ2luKTsKKworCWlmICghKHJlZ19lcnJvciA9IHJlZ2NvbXAoJnJlZ2V4cCwgc3BlYyArIDEsIFJFR19ORVdMSU5FKSkgJiYKKwkgICAgIShyZWdfZXJyb3IgPSByZWdleGVjKCZyZWdleHAsIGxpbmUsIDEsIG1hdGNoLCAwKSkpIHsKKwkJY29uc3QgY2hhciAqY3AgPSBsaW5lICsgbWF0Y2hbMF0ucm1fc287CisJCWNvbnN0IGNoYXIgKm5saW5lOworCisJCXdoaWxlIChiZWdpbisrIDwgbG5vKSB7CisJCQlubGluZSA9IG50aF9saW5lKHNiLCBiZWdpbik7CisJCQlpZiAobGluZSA8PSBjcCAmJiBjcCA8IG5saW5lKQorCQkJCWJyZWFrOworCQkJbGluZSA9IG5saW5lOworCQl9CisJCSpyZXQgPSBiZWdpbjsKKwkJcmVnZnJlZSgmcmVnZXhwKTsKKwkJKnRlcm0rKyA9ICcvJzsKKwkJcmV0dXJuIHRlcm07CisJfQorCWVsc2UgeworCQljaGFyIGVycmJ1ZlsxMDI0XTsKKwkJcmVnZXJyb3IocmVnX2Vycm9yLCAmcmVnZXhwLCBlcnJidWYsIDEwMjQpOworCQlkaWUoIi1MIHBhcmFtZXRlciAnJXMnOiAlcyIsIHNwZWMgKyAxLCBlcnJidWYpOworCX0KK30KKworLyoKKyAqIFBhcnNpbmcgb2YgLUwgb3B0aW9uCisgKi8KK3N0YXRpYyB2b2lkIHByZXBhcmVfYmxhbWVfcmFuZ2Uoc3RydWN0IHNjb3JlYm9hcmQgKnNiLAorCQkJCWNvbnN0IGNoYXIgKmJvdHRvbXRvcCwKKwkJCQlsb25nIGxubywKKwkJCQlsb25nICpib3R0b20sIGxvbmcgKnRvcCkKK3sKKwljb25zdCBjaGFyICp0ZXJtOworCisJdGVybSA9IHBhcnNlX2xvYyhib3R0b210b3AsIHNiLCBsbm8sIDEsIGJvdHRvbSk7CisJaWYgKCp0ZXJtID09ICcsJykgeworCQl0ZXJtID0gcGFyc2VfbG9jKHRlcm0gKyAxLCBzYiwgbG5vLCAqYm90dG9tICsgMSwgdG9wKTsKKwkJaWYgKCp0ZXJtKQorCQkJdXNhZ2UoYmxhbWVfdXNhZ2UpOworCX0KKwlpZiAoKnRlcm0pCisJCXVzYWdlKGJsYW1lX3VzYWdlKTsKK30KKworc3RhdGljIGludCBnaXRfYmxhbWVfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCFzdHJjbXAodmFyLCAiYmxhbWUuc2hvd3Jvb3QiKSkgeworCQlzaG93X3Jvb3QgPSBnaXRfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXN0cmNtcCh2YXIsICJibGFtZS5ibGFua2JvdW5kYXJ5IikpIHsKKwkJYmxhbmtfYm91bmRhcnkgPSBnaXRfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gZ2l0X2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUpOworfQorCitzdGF0aWMgc3RydWN0IGNvbW1pdCAqZmFrZV93b3JraW5nX3RyZWVfY29tbWl0KGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmNvbnRlbnRzX2Zyb20pCit7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCXN0cnVjdCBvcmlnaW4gKm9yaWdpbjsKKwl1bnNpZ25lZCBjaGFyIGhlYWRfc2hhMVsyMF07CisJc3RydWN0IHN0cmJ1ZiBidWY7CisJY29uc3QgY2hhciAqaWRlbnQ7CisJdGltZV90IG5vdzsKKwlpbnQgc2l6ZSwgbGVuOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisJdW5zaWduZWQgbW9kZTsKKworCWlmIChnZXRfc2hhMSgiSEVBRCIsIGhlYWRfc2hhMSkpCisJCWRpZSgiTm8gc3VjaCByZWY6IEhFQUQiKTsKKworCXRpbWUoJm5vdyk7CisJY29tbWl0ID0geGNhbGxvYygxLCBzaXplb2YoKmNvbW1pdCkpOworCWNvbW1pdC0+cGFyZW50cyA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpjb21taXQtPnBhcmVudHMpKTsKKwljb21taXQtPnBhcmVudHMtPml0ZW0gPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShoZWFkX3NoYTEpOworCWNvbW1pdC0+b2JqZWN0LnBhcnNlZCA9IDE7CisJY29tbWl0LT5kYXRlID0gbm93OworCWNvbW1pdC0+b2JqZWN0LnR5cGUgPSBPQkpfQ09NTUlUOworCisJb3JpZ2luID0gbWFrZV9vcmlnaW4oY29tbWl0LCBwYXRoKTsKKworCXN0cmJ1Zl9pbml0KCZidWYsIDApOworCWlmICghY29udGVudHNfZnJvbSB8fCBzdHJjbXAoIi0iLCBjb250ZW50c19mcm9tKSkgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJY29uc3QgY2hhciAqcmVhZF9mcm9tOworCQl1bnNpZ25lZCBsb25nIGZpbl9zaXplOworCisJCWlmIChjb250ZW50c19mcm9tKSB7CisJCQlpZiAoc3RhdChjb250ZW50c19mcm9tLCAmc3QpIDwgMCkKKwkJCQlkaWUoIkNhbm5vdCBzdGF0ICVzIiwgY29udGVudHNfZnJvbSk7CisJCQlyZWFkX2Zyb20gPSBjb250ZW50c19mcm9tOworCQl9CisJCWVsc2UgeworCQkJaWYgKGxzdGF0KHBhdGgsICZzdCkgPCAwKQorCQkJCWRpZSgiQ2Fubm90IGxzdGF0ICVzIiwgcGF0aCk7CisJCQlyZWFkX2Zyb20gPSBwYXRoOworCQl9CisJCWZpbl9zaXplID0geHNpemVfdChzdC5zdF9zaXplKTsKKwkJbW9kZSA9IGNhbm9uX21vZGUoc3Quc3RfbW9kZSk7CisJCXN3aXRjaCAoc3Quc3RfbW9kZSAmIFNfSUZNVCkgeworCQljYXNlIFNfSUZSRUc6CisJCQlpZiAoc3RyYnVmX3JlYWRfZmlsZSgmYnVmLCByZWFkX2Zyb20sIHN0LnN0X3NpemUpICE9IHN0LnN0X3NpemUpCisJCQkJZGllKCJjYW5ub3Qgb3BlbiBvciByZWFkICVzIiwgcmVhZF9mcm9tKTsKKwkJCWJyZWFrOworCQljYXNlIFNfSUZMTks6CisJCQlpZiAocmVhZGxpbmsocmVhZF9mcm9tLCBidWYuYnVmLCBidWYuYWxsb2MpICE9IGZpbl9zaXplKQorCQkJCWRpZSgiY2Fubm90IHJlYWRsaW5rICVzIiwgcmVhZF9mcm9tKTsKKwkJCWJ1Zi5sZW4gPSBmaW5fc2l6ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGllKCJ1bnN1cHBvcnRlZCBmaWxlIHR5cGUgJXMiLCByZWFkX2Zyb20pOworCQl9CisJfQorCWVsc2UgeworCQkvKiBSZWFkaW5nIGZyb20gc3RkaW4gKi8KKwkJY29udGVudHNfZnJvbSA9ICJzdGFuZGFyZCBpbnB1dCI7CisJCW1vZGUgPSAwOworCQlpZiAoc3RyYnVmX3JlYWQoJmJ1ZiwgMCwgMCkgPCAwKQorCQkJZGllKCJyZWFkIGVycm9yICVzIGZyb20gc3RkaW4iLCBzdHJlcnJvcihlcnJubykpOworCX0KKwljb252ZXJ0X3RvX2dpdChwYXRoLCBidWYuYnVmLCBidWYubGVuLCAmYnVmLCAwKTsKKwlvcmlnaW4tPmZpbGUucHRyID0gYnVmLmJ1ZjsKKwlvcmlnaW4tPmZpbGUuc2l6ZSA9IGJ1Zi5sZW47CisJcHJldGVuZF9zaGExX2ZpbGUoYnVmLmJ1ZiwgYnVmLmxlbiwgT0JKX0JMT0IsIG9yaWdpbi0+YmxvYl9zaGExKTsKKwljb21taXQtPnV0aWwgPSBvcmlnaW47CisKKwkvKgorCSAqIFJlYWQgdGhlIGN1cnJlbnQgaW5kZXgsIHJlcGxhY2UgdGhlIHBhdGggZW50cnkgd2l0aAorCSAqIG9yaWdpbi0+YmxvYl9zaGExIHdpdGhvdXQgbXVja2luZyB3aXRoIGl0cyBtb2RlIG9yIHR5cGUKKwkgKiBiaXRzOyB3ZSBhcmUgbm90IGdvaW5nIHRvIHdyaXRlIHRoaXMgaW5kZXggb3V0IC0tIHdlIGp1c3QKKwkgKiB3YW50IHRvIHJ1biAiZGlmZi1pbmRleCAtLWNhY2hlZCIuCisJICovCisJZGlzY2FyZF9jYWNoZSgpOworCXJlYWRfY2FjaGUoKTsKKworCWxlbiA9IHN0cmxlbihwYXRoKTsKKwlpZiAoIW1vZGUpIHsKKwkJaW50IHBvcyA9IGNhY2hlX25hbWVfcG9zKHBhdGgsIGxlbik7CisJCWlmICgwIDw9IHBvcykKKwkJCW1vZGUgPSBhY3RpdmVfY2FjaGVbcG9zXS0+Y2VfbW9kZTsKKwkJZWxzZQorCQkJLyogTGV0J3Mgbm90IGJvdGhlciByZWFkaW5nIGZyb20gSEVBRCB0cmVlICovCisJCQltb2RlID0gU19JRlJFRyB8IDA2NDQ7CisJfQorCXNpemUgPSBjYWNoZV9lbnRyeV9zaXplKGxlbik7CisJY2UgPSB4Y2FsbG9jKDEsIHNpemUpOworCWhhc2hjcHkoY2UtPnNoYTEsIG9yaWdpbi0+YmxvYl9zaGExKTsKKwltZW1jcHkoY2UtPm5hbWUsIHBhdGgsIGxlbik7CisJY2UtPmNlX2ZsYWdzID0gY3JlYXRlX2NlX2ZsYWdzKGxlbiwgMCk7CisJY2UtPmNlX21vZGUgPSBjcmVhdGVfY2VfbW9kZShtb2RlKTsKKwlhZGRfY2FjaGVfZW50cnkoY2UsIEFERF9DQUNIRV9PS19UT19BRER8QUREX0NBQ0hFX09LX1RPX1JFUExBQ0UpOworCisJLyoKKwkgKiBXZSBhcmUgbm90IGdvaW5nIHRvIHdyaXRlIHRoaXMgb3V0LCBzbyB0aGlzIGRvZXMgbm90IG1hdHRlcgorCSAqIHJpZ2h0IG5vdywgYnV0IHNvbWVkYXkgd2UgbWlnaHQgb3B0aW1pemUgZGlmZi1pbmRleCAtLWNhY2hlZAorCSAqIHdpdGggY2FjaGUtdHJlZSBpbmZvcm1hdGlvbi4KKwkgKi8KKwljYWNoZV90cmVlX2ludmFsaWRhdGVfcGF0aChhY3RpdmVfY2FjaGVfdHJlZSwgcGF0aCk7CisKKwljb21taXQtPmJ1ZmZlciA9IHhtYWxsb2MoNDAwKTsKKwlpZGVudCA9IGZtdF9pZGVudCgiTm90IENvbW1pdHRlZCBZZXQiLCAibm90LmNvbW1pdHRlZC55ZXQiLCBOVUxMLCAwKTsKKwlzbnByaW50Zihjb21taXQtPmJ1ZmZlciwgNDAwLAorCQkidHJlZSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwXG4iCisJCSJwYXJlbnQgJXNcbiIKKwkJImF1dGhvciAlc1xuIgorCQkiY29tbWl0dGVyICVzXG5cbiIKKwkJIlZlcnNpb24gb2YgJXMgZnJvbSAlc1xuIiwKKwkJc2hhMV90b19oZXgoaGVhZF9zaGExKSwKKwkJaWRlbnQsIGlkZW50LCBwYXRoLCBjb250ZW50c19mcm9tID8gY29udGVudHNfZnJvbSA6IHBhdGgpOworCXJldHVybiBjb21taXQ7Cit9CisKK2ludCBjbWRfYmxhbWUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IHJldl9pbmZvIHJldnM7CisJY29uc3QgY2hhciAqcGF0aDsKKwlzdHJ1Y3Qgc2NvcmVib2FyZCBzYjsKKwlzdHJ1Y3Qgb3JpZ2luICpvOworCXN0cnVjdCBibGFtZV9lbnRyeSAqZW50OworCWludCBpLCBzZWVuX2Rhc2hkYXNoLCB1bmssIG9wdDsKKwlsb25nIGJvdHRvbSwgdG9wLCBsbm87CisJaW50IG91dHB1dF9vcHRpb24gPSAwOworCWludCBzaG93X3N0YXRzID0gMDsKKwljb25zdCBjaGFyICpyZXZzX2ZpbGUgPSBOVUxMOworCWNvbnN0IGNoYXIgKmZpbmFsX2NvbW1pdF9uYW1lID0gTlVMTDsKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJY29uc3QgY2hhciAqYm90dG9tdG9wID0gTlVMTDsKKwljb25zdCBjaGFyICpjb250ZW50c19mcm9tID0gTlVMTDsKKworCWNtZF9pc19hbm5vdGF0ZSA9ICFzdHJjbXAoYXJndlswXSwgImFubm90YXRlIik7CisKKwlnaXRfY29uZmlnKGdpdF9ibGFtZV9jb25maWcpOworCXNhdmVfY29tbWl0X2J1ZmZlciA9IDA7CisKKwlvcHQgPSAwOworCXNlZW5fZGFzaGRhc2ggPSAwOworCWZvciAodW5rID0gaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKwkJaWYgKCphcmcgIT0gJy0nKQorCQkJYnJlYWs7CisJCWVsc2UgaWYgKCFzdHJjbXAoIi1iIiwgYXJnKSkKKwkJCWJsYW5rX2JvdW5kYXJ5ID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcCgiLS1yb290IiwgYXJnKSkKKwkJCXNob3dfcm9vdCA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1zaG93LXN0YXRzIikpCisJCQlzaG93X3N0YXRzID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcCgiLWMiLCBhcmcpKQorCQkJb3V0cHV0X29wdGlvbiB8PSBPVVRQVVRfQU5OT1RBVEVfQ09NUEFUOworCQllbHNlIGlmICghc3RyY21wKCItdCIsIGFyZykpCisJCQlvdXRwdXRfb3B0aW9uIHw9IE9VVFBVVF9SQVdfVElNRVNUQU1QOworCQllbHNlIGlmICghc3RyY21wKCItbCIsIGFyZykpCisJCQlvdXRwdXRfb3B0aW9uIHw9IE9VVFBVVF9MT05HX09CSkVDVF9OQU1FOworCQllbHNlIGlmICghc3RyY21wKCItcyIsIGFyZykpCisJCQlvdXRwdXRfb3B0aW9uIHw9IE9VVFBVVF9OT19BVVRIT1I7CisJCWVsc2UgaWYgKCFzdHJjbXAoIi13IiwgYXJnKSkKKwkJCXhkbF9vcHRzIHw9IFhERl9JR05PUkVfV0hJVEVTUEFDRTsKKwkJZWxzZSBpZiAoIXN0cmNtcCgiLVMiLCBhcmcpICYmICsraSA8IGFyZ2MpCisJCQlyZXZzX2ZpbGUgPSBhcmd2W2ldOworCQllbHNlIGlmICghcHJlZml4Y21wKGFyZywgIi1NIikpIHsKKwkJCW9wdCB8PSBQSUNLQVhFX0JMQU1FX01PVkU7CisJCQlibGFtZV9tb3ZlX3Njb3JlID0gcGFyc2Vfc2NvcmUoYXJnKzIpOworCQl9CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLUMiKSkgeworCQkJLyoKKwkJCSAqIC1DIGVuYWJsZXMgY29weSBmcm9tIHJlbW92ZWQgZmlsZXM7CisJCQkgKiAtQyAtQyBlbmFibGVzIGNvcHkgZnJvbSBleGlzdGluZyBmaWxlcywgYnV0IG9ubHkKKwkJCSAqICAgICAgIHdoZW4gYmxhbWluZyBhIG5ldyBmaWxlOworCQkJICogLUMgLUMgLUMgZW5hYmxlcyBjb3B5IGZyb20gZXhpc3RpbmcgZmlsZXMgZm9yCisJCQkgKiAgICAgICAgICBldmVyeWJvZHkKKwkJCSAqLworCQkJaWYgKG9wdCAmIFBJQ0tBWEVfQkxBTUVfQ09QWV9IQVJERVIpCisJCQkJb3B0IHw9IFBJQ0tBWEVfQkxBTUVfQ09QWV9IQVJERVNUOworCQkJaWYgKG9wdCAmIFBJQ0tBWEVfQkxBTUVfQ09QWSkKKwkJCQlvcHQgfD0gUElDS0FYRV9CTEFNRV9DT1BZX0hBUkRFUjsKKwkJCW9wdCB8PSBQSUNLQVhFX0JMQU1FX0NPUFkgfCBQSUNLQVhFX0JMQU1FX01PVkU7CisJCQlibGFtZV9jb3B5X3Njb3JlID0gcGFyc2Vfc2NvcmUoYXJnKzIpOworCQl9CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLUwiKSkgeworCQkJaWYgKCFhcmdbMl0pIHsKKwkJCQlpZiAoKytpID49IGFyZ2MpCisJCQkJCXVzYWdlKGJsYW1lX3VzYWdlKTsKKwkJCQlhcmcgPSBhcmd2W2ldOworCQkJfQorCQkJZWxzZQorCQkJCWFyZyArPSAyOworCQkJaWYgKGJvdHRvbXRvcCkKKwkJCQlkaWUoIk1vcmUgdGhhbiBvbmUgJy1MIG4sbScgb3B0aW9uIGdpdmVuIik7CisJCQlib3R0b210b3AgPSBhcmc7CisJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgiLS1jb250ZW50cyIsIGFyZykpIHsKKwkJCWlmICgrK2kgPj0gYXJnYykKKwkJCQl1c2FnZShibGFtZV91c2FnZSk7CisJCQljb250ZW50c19mcm9tID0gYXJndltpXTsKKwkJfQorCQllbHNlIGlmICghc3RyY21wKCItLWluY3JlbWVudGFsIiwgYXJnKSkKKwkJCWluY3JlbWVudGFsID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcCgiLS1zY29yZS1kZWJ1ZyIsIGFyZykpCisJCQlvdXRwdXRfb3B0aW9uIHw9IE9VVFBVVF9TSE9XX1NDT1JFOworCQllbHNlIGlmICghc3RyY21wKCItZiIsIGFyZykgfHwKKwkJCSAhc3RyY21wKCItLXNob3ctbmFtZSIsIGFyZykpCisJCQlvdXRwdXRfb3B0aW9uIHw9IE9VVFBVVF9TSE9XX05BTUU7CisJCWVsc2UgaWYgKCFzdHJjbXAoIi1uIiwgYXJnKSB8fAorCQkJICFzdHJjbXAoIi0tc2hvdy1udW1iZXIiLCBhcmcpKQorCQkJb3V0cHV0X29wdGlvbiB8PSBPVVRQVVRfU0hPV19OVU1CRVI7CisJCWVsc2UgaWYgKCFzdHJjbXAoIi1wIiwgYXJnKSB8fAorCQkJICFzdHJjbXAoIi0tcG9yY2VsYWluIiwgYXJnKSkKKwkJCW91dHB1dF9vcHRpb24gfD0gT1VUUFVUX1BPUkNFTEFJTjsKKwkJZWxzZSBpZiAoIXN0cmNtcCgiLS0iLCBhcmcpKSB7CisJCQlzZWVuX2Rhc2hkYXNoID0gMTsKKwkJCWkrKzsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UKKwkJCWFyZ3ZbdW5rKytdID0gYXJnOworCX0KKworCWlmICghYmxhbWVfbW92ZV9zY29yZSkKKwkJYmxhbWVfbW92ZV9zY29yZSA9IEJMQU1FX0RFRkFVTFRfTU9WRV9TQ09SRTsKKwlpZiAoIWJsYW1lX2NvcHlfc2NvcmUpCisJCWJsYW1lX2NvcHlfc2NvcmUgPSBCTEFNRV9ERUZBVUxUX0NPUFlfU0NPUkU7CisKKwkvKgorCSAqIFdlIGhhdmUgY29sbGVjdGVkIG9wdGlvbnMgdW5rbm93biB0byB1cyBpbiBhcmd2WzEuLnVua10KKwkgKiB3aGljaCBhcmUgdG8gYmUgcGFzc2VkIHRvIHJldmlzaW9uIG1hY2hpbmVyeSBpZiB3ZSBhcmUKKwkgKiBnb2luZyB0byBkbyB0aGUgImJvdHRvbSIgcHJvY2Vzc2luZy4KKwkgKgorCSAqIFRoZSByZW1haW5pbmcgYXJlOgorCSAqCisJICogKDEpIGlmIHNlZW5fZGFzaGRhc2gsIGl0cyBlaXRoZXIKKwkgKiAgICAgIi1vcHRpb25zIC0tIDxwYXRoPiIgb3IKKwkgKiAgICAgIi1vcHRpb25zIC0tIDxwYXRoPiA8cmV2PiIuCisJICogICAgIGJ1dCB0aGUgbGF0dGVyIGlzIGFsbG93ZWQgb25seSBpZiB0aGVyZSBpcyBubworCSAqICAgICBvcHRpb25zIHRoYXQgd2UgcGFzc2VkIHRvIHJldmlzaW9uIG1hY2hpbmVyeS4KKwkgKgorCSAqICgyKSBvdGhlcndpc2UsIHdlIG1heSBoYXZlICItLSIgc29tZXdoZXJlIGxhdGVyIGFuZAorCSAqICAgICBtaWdodCBiZSBsb29raW5nIGF0IHRoZSBmaXJzdCBvbmUgb2YgbXVsdGlwbGUgJ3JldicKKwkgKiAgICAgcGFyYW1ldGVycyAoZS5nLiAiIG1hc3RlciBebmV4dCBebWFpbnQgLS0gcGF0aCIpLgorCSAqICAgICBTZWUgaWYgdGhlcmUgaXMgYSBkYXNoZGFzaCBmaXJzdCwgYW5kIGdpdmUgdGhlCisJICogICAgIGFyZ3VtZW50cyBiZWZvcmUgdGhhdCB0byByZXZpc2lvbiBtYWNoaW5lcnkuCisJICogICAgIEFmdGVyIHRoYXQgdGhlcmUgbXVzdCBiZSBvbmUgJ3BhdGgnLgorCSAqCisJICogKDMpIG90aGVyd2lzZSwgaXRzIG9uZSBvZiB0aGUgdGhyZWU6CisJICogICAgICItb3B0aW9ucyA8cGF0aD4gPHJldj4iCisJICogICAgICItb3B0aW9ucyA8cmV2PiA8cGF0aD4iCisJICogICAgICItb3B0aW9ucyA8cGF0aD4iCisJICogICAgIGJ1dCBhZ2FpbiB0aGUgZmlyc3Qgb25lIGlzIGFsbG93ZWQgb25seSBpZgorCSAqICAgICB0aGVyZSBpcyBubyBvcHRpb25zIHRoYXQgd2UgcGFzc2VkIHRvIHJldmlzaW9uCisJICogICAgIG1hY2hpbmVyeS4KKwkgKi8KKworCWlmIChzZWVuX2Rhc2hkYXNoKSB7CisJCS8qICgxKSAqLworCQlpZiAoYXJnYyA8PSBpKQorCQkJdXNhZ2UoYmxhbWVfdXNhZ2UpOworCQlwYXRoID0gYWRkX3ByZWZpeChwcmVmaXgsIGFyZ3ZbaV0pOworCQlpZiAoaSArIDEgPT0gYXJnYyAtIDEpIHsKKwkJCWlmICh1bmsgIT0gMSkKKwkJCQl1c2FnZShibGFtZV91c2FnZSk7CisJCQlhcmd2W3VuaysrXSA9IGFyZ3ZbaSArIDFdOworCQl9CisJCWVsc2UgaWYgKGkgKyAxICE9IGFyZ2MpCisJCQkvKiBnYXJiYWdlIGF0IGVuZCAqLworCQkJdXNhZ2UoYmxhbWVfdXNhZ2UpOworCX0KKwllbHNlIHsKKwkJaW50IGo7CisJCWZvciAoaiA9IGk7ICFzZWVuX2Rhc2hkYXNoICYmIGogPCBhcmdjOyBqKyspCisJCQlpZiAoIXN0cmNtcChhcmd2W2pdLCAiLS0iKSkKKwkJCQlzZWVuX2Rhc2hkYXNoID0gajsKKwkJaWYgKHNlZW5fZGFzaGRhc2gpIHsKKwkJCS8qICgyKSAqLworCQkJaWYgKHNlZW5fZGFzaGRhc2ggKyAxICE9IGFyZ2MgLSAxKQorCQkJCXVzYWdlKGJsYW1lX3VzYWdlKTsKKwkJCXBhdGggPSBhZGRfcHJlZml4KHByZWZpeCwgYXJndltzZWVuX2Rhc2hkYXNoICsgMV0pOworCQkJZm9yIChqID0gaTsgaiA8IHNlZW5fZGFzaGRhc2g7IGorKykKKwkJCQlhcmd2W3VuaysrXSA9IGFyZ3Zbal07CisJCX0KKwkJZWxzZSB7CisJCQkvKiAoMykgKi8KKwkJCWlmIChhcmdjIDw9IGkpCisJCQkJdXNhZ2UoYmxhbWVfdXNhZ2UpOworCQkJcGF0aCA9IGFkZF9wcmVmaXgocHJlZml4LCBhcmd2W2ldKTsKKwkJCWlmIChpICsgMSA9PSBhcmdjIC0gMSkgeworCQkJCWZpbmFsX2NvbW1pdF9uYW1lID0gYXJndltpICsgMV07CisKKwkJCQkvKiBpZiAodW5rID09IDEpIHdlIGNvdWxkIGJlIGdldHRpbmcKKwkJCQkgKiBvbGQtc3R5bGUKKwkJCQkgKi8KKwkJCQlpZiAodW5rID09IDEgJiYgIWhhc19wYXRoX2luX3dvcmtfdHJlZShwYXRoKSkgeworCQkJCQlwYXRoID0gYWRkX3ByZWZpeChwcmVmaXgsIGFyZ3ZbaSArIDFdKTsKKwkJCQkJZmluYWxfY29tbWl0X25hbWUgPSBhcmd2W2ldOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKGkgIT0gYXJnYyAtIDEpCisJCQkJdXNhZ2UoYmxhbWVfdXNhZ2UpOyAvKiBnYXJiYWdlIGF0IGVuZCAqLworCisJCQlzZXR1cF93b3JrX3RyZWUoKTsKKwkJCWlmICghaGFzX3BhdGhfaW5fd29ya190cmVlKHBhdGgpKQorCQkJCWRpZSgiY2Fubm90IHN0YXQgcGF0aCAlczogJXMiLAorCQkJCSAgICBwYXRoLCBzdHJlcnJvcihlcnJubykpOworCQl9CisJfQorCisJaWYgKGZpbmFsX2NvbW1pdF9uYW1lKQorCQlhcmd2W3VuaysrXSA9IGZpbmFsX2NvbW1pdF9uYW1lOworCisJLyoKKwkgKiBOb3cgd2UgZ290IHJldiBhbmQgcGF0aC4gIFdlIGRvIG5vdCB3YW50IHRoZSBwYXRoIHBydW5pbmcKKwkgKiBidXQgd2UgbWF5IHdhbnQgImJvdHRvbSIgcHJvY2Vzc2luZy4KKwkgKi8KKwlhcmd2W3VuaysrXSA9ICItLSI7IC8qIHRlcm1pbmF0ZSB0aGUgcmV2IG5hbWUgKi8KKwlhcmd2W3Vua10gPSBOVUxMOworCisJaW5pdF9yZXZpc2lvbnMoJnJldnMsIE5VTEwpOworCXNldHVwX3JldmlzaW9ucyh1bmssIGFyZ3YsICZyZXZzLCBOVUxMKTsKKwltZW1zZXQoJnNiLCAwLCBzaXplb2Yoc2IpKTsKKworCS8qCisJICogVGhlcmUgbXVzdCBiZSBvbmUgYW5kIG9ubHkgb25lIHBvc2l0aXZlIGNvbW1pdCBpbiB0aGUKKwkgKiByZXZzLT5wZW5kaW5nIGFycmF5LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCByZXZzLnBlbmRpbmcubnI7IGkrKykgeworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSByZXZzLnBlbmRpbmcub2JqZWN0c1tpXS5pdGVtOworCQlpZiAob2JqLT5mbGFncyAmIFVOSU5URVJFU1RJTkcpCisJCQljb250aW51ZTsKKwkJd2hpbGUgKG9iai0+dHlwZSA9PSBPQkpfVEFHKQorCQkJb2JqID0gZGVyZWZfdGFnKG9iaiwgTlVMTCwgMCk7CisJCWlmIChvYmotPnR5cGUgIT0gT0JKX0NPTU1JVCkKKwkJCWRpZSgiTm9uIGNvbW1pdCAlcz8iLAorCQkJICAgIHJldnMucGVuZGluZy5vYmplY3RzW2ldLm5hbWUpOworCQlpZiAoc2IuZmluYWwpCisJCQlkaWUoIk1vcmUgdGhhbiBvbmUgY29tbWl0IHRvIGRpZyBmcm9tICVzIGFuZCAlcz8iLAorCQkJICAgIHJldnMucGVuZGluZy5vYmplY3RzW2ldLm5hbWUsCisJCQkgICAgZmluYWxfY29tbWl0X25hbWUpOworCQlzYi5maW5hbCA9IChzdHJ1Y3QgY29tbWl0ICopIG9iajsKKwkJZmluYWxfY29tbWl0X25hbWUgPSByZXZzLnBlbmRpbmcub2JqZWN0c1tpXS5uYW1lOworCX0KKworCWlmICghc2IuZmluYWwpIHsKKwkJLyoKKwkJICogIi0tbm90IEEgQiAtLSBwYXRoIiB3aXRob3V0IGFueXRoaW5nIHBvc2l0aXZlOworCQkgKiBkbyBub3QgZGVmYXVsdCB0byBIRUFELCBidXQgdXNlIHRoZSB3b3JraW5nIHRyZWUKKwkJICogb3IgIi0tY29udGVudHMiLgorCQkgKi8KKwkJc2V0dXBfd29ya190cmVlKCk7CisJCXNiLmZpbmFsID0gZmFrZV93b3JraW5nX3RyZWVfY29tbWl0KHBhdGgsIGNvbnRlbnRzX2Zyb20pOworCQlhZGRfcGVuZGluZ19vYmplY3QoJnJldnMsICYoc2IuZmluYWwtPm9iamVjdCksICI6Iik7CisJfQorCWVsc2UgaWYgKGNvbnRlbnRzX2Zyb20pCisJCWRpZSgiQ2Fubm90IHVzZSAtLWNvbnRlbnRzIHdpdGggZmluYWwgY29tbWl0IG9iamVjdCBuYW1lIik7CisKKwkvKgorCSAqIElmIHdlIGhhdmUgYm90dG9tLCB0aGlzIHdpbGwgbWFyayB0aGUgYW5jZXN0b3JzIG9mIHRoZQorCSAqIGJvdHRvbSBjb21taXRzIHdlIHdvdWxkIHJlYWNoIHdoaWxlIHRyYXZlcnNpbmcgYXMKKwkgKiB1bmludGVyZXN0aW5nLgorCSAqLworCWlmIChwcmVwYXJlX3JldmlzaW9uX3dhbGsoJnJldnMpKQorCQlkaWUoInJldmlzaW9uIHdhbGsgc2V0dXAgZmFpbGVkIik7CisKKwlpZiAoaXNfbnVsbF9zaGExKHNiLmZpbmFsLT5vYmplY3Quc2hhMSkpIHsKKwkJY2hhciAqYnVmOworCQlvID0gc2IuZmluYWwtPnV0aWw7CisJCWJ1ZiA9IHhtYWxsb2Moby0+ZmlsZS5zaXplICsgMSk7CisJCW1lbWNweShidWYsIG8tPmZpbGUucHRyLCBvLT5maWxlLnNpemUgKyAxKTsKKwkJc2IuZmluYWxfYnVmID0gYnVmOworCQlzYi5maW5hbF9idWZfc2l6ZSA9IG8tPmZpbGUuc2l6ZTsKKwl9CisJZWxzZSB7CisJCW8gPSBnZXRfb3JpZ2luKCZzYiwgc2IuZmluYWwsIHBhdGgpOworCQlpZiAoZmlsbF9ibG9iX3NoYTEobykpCisJCQlkaWUoIm5vIHN1Y2ggcGF0aCAlcyBpbiAlcyIsIHBhdGgsIGZpbmFsX2NvbW1pdF9uYW1lKTsKKworCQlzYi5maW5hbF9idWYgPSByZWFkX3NoYTFfZmlsZShvLT5ibG9iX3NoYTEsICZ0eXBlLAorCQkJCQkgICAgICAmc2IuZmluYWxfYnVmX3NpemUpOworCQlpZiAoIXNiLmZpbmFsX2J1ZikKKwkJCWRpZSgiQ2Fubm90IHJlYWQgYmxvYiAlcyBmb3IgcGF0aCAlcyIsCisJCQkgICAgc2hhMV90b19oZXgoby0+YmxvYl9zaGExKSwKKwkJCSAgICBwYXRoKTsKKwl9CisJbnVtX3JlYWRfYmxvYisrOworCWxubyA9IHByZXBhcmVfbGluZXMoJnNiKTsKKworCWJvdHRvbSA9IHRvcCA9IDA7CisJaWYgKGJvdHRvbXRvcCkKKwkJcHJlcGFyZV9ibGFtZV9yYW5nZSgmc2IsIGJvdHRvbXRvcCwgbG5vLCAmYm90dG9tLCAmdG9wKTsKKwlpZiAoYm90dG9tICYmIHRvcCAmJiB0b3AgPCBib3R0b20pIHsKKwkJbG9uZyB0bXA7CisJCXRtcCA9IHRvcDsgdG9wID0gYm90dG9tOyBib3R0b20gPSB0bXA7CisJfQorCWlmIChib3R0b20gPCAxKQorCQlib3R0b20gPSAxOworCWlmICh0b3AgPCAxKQorCQl0b3AgPSBsbm87CisJYm90dG9tLS07CisJaWYgKGxubyA8IHRvcCkKKwkJZGllKCJmaWxlICVzIGhhcyBvbmx5ICVsdSBsaW5lcyIsIHBhdGgsIGxubyk7CisKKwllbnQgPSB4Y2FsbG9jKDEsIHNpemVvZigqZW50KSk7CisJZW50LT5sbm8gPSBib3R0b207CisJZW50LT5udW1fbGluZXMgPSB0b3AgLSBib3R0b207CisJZW50LT5zdXNwZWN0ID0gbzsKKwllbnQtPnNfbG5vID0gYm90dG9tOworCisJc2IuZW50ID0gZW50OworCXNiLnBhdGggPSBwYXRoOworCisJaWYgKHJldnNfZmlsZSAmJiByZWFkX2FuY2VzdHJ5KHJldnNfZmlsZSkpCisJCWRpZSgicmVhZGluZyBncmFmdCBmaWxlICVzIGZhaWxlZDogJXMiLAorCQkgICAgcmV2c19maWxlLCBzdHJlcnJvcihlcnJubykpOworCisJcmVhZF9tYWlsbWFwKCZtYWlsbWFwLCAiLm1haWxtYXAiLCBOVUxMKTsKKworCWlmICghaW5jcmVtZW50YWwpCisJCXNldHVwX3BhZ2VyKCk7CisKKwlhc3NpZ25fYmxhbWUoJnNiLCAmcmV2cywgb3B0KTsKKworCWlmIChpbmNyZW1lbnRhbCkKKwkJcmV0dXJuIDA7CisKKwljb2FsZXNjZSgmc2IpOworCisJaWYgKCEob3V0cHV0X29wdGlvbiAmIE9VVFBVVF9QT1JDRUxBSU4pKQorCQlmaW5kX2FsaWdubWVudCgmc2IsICZvdXRwdXRfb3B0aW9uKTsKKworCW91dHB1dCgmc2IsIG91dHB1dF9vcHRpb24pOworCWZyZWUoKHZvaWQgKilzYi5maW5hbF9idWYpOworCWZvciAoZW50ID0gc2IuZW50OyBlbnQ7ICkgeworCQlzdHJ1Y3QgYmxhbWVfZW50cnkgKmUgPSBlbnQtPm5leHQ7CisJCWZyZWUoZW50KTsKKwkJZW50ID0gZTsKKwl9CisKKwlpZiAoc2hvd19zdGF0cykgeworCQlwcmludGYoIm51bSByZWFkIGJsb2I6ICVkXG4iLCBudW1fcmVhZF9ibG9iKTsKKwkJcHJpbnRmKCJudW0gZ2V0IHBhdGNoOiAlZFxuIiwgbnVtX2dldF9wYXRjaCk7CisJCXByaW50ZigibnVtIGNvbW1pdHM6ICVkXG4iLCBudW1fY29tbWl0cyk7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1icmFuY2guYyBiL2J1aWx0aW4tYnJhbmNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjNDUyNgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tYnJhbmNoLmMKQEAgLTAsMCArMSw0ODcgQEAKKy8qCisgKiBCdWlsdGluICJnaXQgYnJhbmNoIgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBLcmlzdGlhbiBIw7hnc2JlcmcgPGtyaEByZWRoYXQuY29tPgorICogQmFzZWQgb24gZ2l0LWJyYW5jaC5zaCBieSBKdW5pbyBDIEhhbWFuby4KKyAqLworCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb2xvci5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAicmVtb3RlLmgiCisjaW5jbHVkZSAicGFyc2Utb3B0aW9ucy5oIgorI2luY2x1ZGUgImJyYW5jaC5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJ1aWx0aW5fYnJhbmNoX3VzYWdlW10gPSB7CisJImdpdC1icmFuY2ggW29wdGlvbnNdIFstciB8IC1hXSIsCisJImdpdC1icmFuY2ggW29wdGlvbnNdIFstbF0gWy1mXSA8YnJhbmNobmFtZT4gWzxzdGFydC1wb2ludD5dIiwKKwkiZ2l0LWJyYW5jaCBbb3B0aW9uc10gWy1yXSAoLWQgfCAtRCkgPGJyYW5jaG5hbWU+IiwKKwkiZ2l0LWJyYW5jaCBbb3B0aW9uc10gKC1tIHwgLU0pIFs8b2xkYnJhbmNoPl0gPG5ld2JyYW5jaD4iLAorCU5VTEwKK307CisKKyNkZWZpbmUgUkVGX1VOS05PV05fVFlQRSAgICAweDAwCisjZGVmaW5lIFJFRl9MT0NBTF9CUkFOQ0ggICAgMHgwMQorI2RlZmluZSBSRUZfUkVNT1RFX0JSQU5DSCAgIDB4MDIKKyNkZWZpbmUgUkVGX1RBRyAgICAgICAgICAgICAweDA0CisKK3N0YXRpYyBjb25zdCBjaGFyICpoZWFkOworc3RhdGljIHVuc2lnbmVkIGNoYXIgaGVhZF9zaGExWzIwXTsKKworc3RhdGljIGludCBicmFuY2hfdXNlX2NvbG9yID0gLTE7CitzdGF0aWMgY2hhciBicmFuY2hfY29sb3JzW11bQ09MT1JfTUFYTEVOXSA9IHsKKwkiXDAzM1ttIiwJLyogcmVzZXQgKi8KKwkiIiwJCS8qIFBMQUlOIChub3JtYWwpICovCisJIlwwMzNbMzFtIiwJLyogUkVNT1RFIChyZWQpICovCisJIiIsCQkvKiBMT0NBTCAobm9ybWFsKSAqLworCSJcMDMzWzMybSIsCS8qIENVUlJFTlQgKGdyZWVuKSAqLworfTsKK2VudW0gY29sb3JfYnJhbmNoIHsKKwlDT0xPUl9CUkFOQ0hfUkVTRVQgPSAwLAorCUNPTE9SX0JSQU5DSF9QTEFJTiA9IDEsCisJQ09MT1JfQlJBTkNIX1JFTU9URSA9IDIsCisJQ09MT1JfQlJBTkNIX0xPQ0FMID0gMywKKwlDT0xPUl9CUkFOQ0hfQ1VSUkVOVCA9IDQsCit9OworCitzdGF0aWMgaW50IHBhcnNlX2JyYW5jaF9jb2xvcl9zbG90KGNvbnN0IGNoYXIgKnZhciwgaW50IG9mcykKK3sKKwlpZiAoIXN0cmNhc2VjbXAodmFyK29mcywgInBsYWluIikpCisJCXJldHVybiBDT0xPUl9CUkFOQ0hfUExBSU47CisJaWYgKCFzdHJjYXNlY21wKHZhcitvZnMsICJyZXNldCIpKQorCQlyZXR1cm4gQ09MT1JfQlJBTkNIX1JFU0VUOworCWlmICghc3RyY2FzZWNtcCh2YXIrb2ZzLCAicmVtb3RlIikpCisJCXJldHVybiBDT0xPUl9CUkFOQ0hfUkVNT1RFOworCWlmICghc3RyY2FzZWNtcCh2YXIrb2ZzLCAibG9jYWwiKSkKKwkJcmV0dXJuIENPTE9SX0JSQU5DSF9MT0NBTDsKKwlpZiAoIXN0cmNhc2VjbXAodmFyK29mcywgImN1cnJlbnQiKSkKKwkJcmV0dXJuIENPTE9SX0JSQU5DSF9DVVJSRU5UOworCWRpZSgiYmFkIGNvbmZpZyB2YXJpYWJsZSAnJXMnIiwgdmFyKTsKK30KKworc3RhdGljIGludCBnaXRfYnJhbmNoX2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICghc3RyY21wKHZhciwgImNvbG9yLmJyYW5jaCIpKSB7CisJCWJyYW5jaF91c2VfY29sb3IgPSBnaXRfY29uZmlnX2NvbG9yYm9vbCh2YXIsIHZhbHVlLCAtMSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXByZWZpeGNtcCh2YXIsICJjb2xvci5icmFuY2guIikpIHsKKwkJaW50IHNsb3QgPSBwYXJzZV9icmFuY2hfY29sb3Jfc2xvdCh2YXIsIDEzKTsKKwkJaWYgKCF2YWx1ZSkKKwkJCXJldHVybiBjb25maWdfZXJyb3Jfbm9uYm9vbCh2YXIpOworCQljb2xvcl9wYXJzZSh2YWx1ZSwgdmFyLCBicmFuY2hfY29sb3JzW3Nsb3RdKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBnaXRfY29sb3JfZGVmYXVsdF9jb25maWcodmFyLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpicmFuY2hfZ2V0X2NvbG9yKGVudW0gY29sb3JfYnJhbmNoIGl4KQoreworCWlmIChicmFuY2hfdXNlX2NvbG9yID4gMCkKKwkJcmV0dXJuIGJyYW5jaF9jb2xvcnNbaXhdOworCXJldHVybiAiIjsKK30KKworc3RhdGljIGludCBkZWxldGVfYnJhbmNoZXMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBpbnQgZm9yY2UsIGludCBraW5kcykKK3sKKwlzdHJ1Y3QgY29tbWl0ICpyZXYsICpoZWFkX3JldiA9IGhlYWRfcmV2OworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY2hhciAqbmFtZSA9IE5VTEw7CisJY29uc3QgY2hhciAqZm10LCAqcmVtb3RlOworCWNoYXIgc2VjdGlvbltQQVRIX01BWF07CisJaW50IGk7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGtpbmRzKSB7CisJY2FzZSBSRUZfUkVNT1RFX0JSQU5DSDoKKwkJZm10ID0gInJlZnMvcmVtb3Rlcy8lcyI7CisJCXJlbW90ZSA9ICJyZW1vdGUgIjsKKwkJZm9yY2UgPSAxOworCQlicmVhazsKKwljYXNlIFJFRl9MT0NBTF9CUkFOQ0g6CisJCWZtdCA9ICJyZWZzL2hlYWRzLyVzIjsKKwkJcmVtb3RlID0gIiI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRpZSgiY2Fubm90IHVzZSAtYSB3aXRoIC1kIik7CisJfQorCisJaWYgKCFmb3JjZSkgeworCQloZWFkX3JldiA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKGhlYWRfc2hhMSk7CisJCWlmICghaGVhZF9yZXYpCisJCQlkaWUoIkNvdWxkbid0IGxvb2sgdXAgY29tbWl0IG9iamVjdCBmb3IgSEVBRCIpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisJCWlmIChraW5kcyA9PSBSRUZfTE9DQUxfQlJBTkNIICYmICFzdHJjbXAoaGVhZCwgYXJndltpXSkpIHsKKwkJCWVycm9yKCJDYW5ub3QgZGVsZXRlIHRoZSBicmFuY2ggJyVzJyAiCisJCQkJIndoaWNoIHlvdSBhcmUgY3VycmVudGx5IG9uLiIsIGFyZ3ZbaV0pOworCQkJcmV0ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZnJlZShuYW1lKTsKKworCQluYW1lID0geHN0cmR1cChta3BhdGgoZm10LCBhcmd2W2ldKSk7CisJCWlmICghcmVzb2x2ZV9yZWYobmFtZSwgc2hhMSwgMSwgTlVMTCkpIHsKKwkJCWVycm9yKCIlc2JyYW5jaCAnJXMnIG5vdCBmb3VuZC4iLAorCQkJCQlyZW1vdGUsIGFyZ3ZbaV0pOworCQkJcmV0ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmV2ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2Uoc2hhMSk7CisJCWlmICghcmV2KSB7CisJCQllcnJvcigiQ291bGRuJ3QgbG9vayB1cCBjb21taXQgb2JqZWN0IGZvciAnJXMnIiwgbmFtZSk7CisJCQlyZXQgPSAxOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBUaGlzIGNoZWNrcyB3aGV0aGVyIHRoZSBtZXJnZSBiYXNlcyBvZiBicmFuY2ggYW5kCisJCSAqIEhFQUQgY29udGFpbnMgYnJhbmNoIC0tIHdoaWNoIG1lYW5zIHRoYXQgdGhlIEhFQUQKKwkJICogY29udGFpbnMgZXZlcnl0aGluZyBpbiBib3RoLgorCQkgKi8KKworCQlpZiAoIWZvcmNlICYmCisJCSAgICAhaW5fbWVyZ2VfYmFzZXMocmV2LCAmaGVhZF9yZXYsIDEpKSB7CisJCQllcnJvcigiVGhlIGJyYW5jaCAnJXMnIGlzIG5vdCBhbiBhbmNlc3RvciBvZiAiCisJCQkJInlvdXIgY3VycmVudCBIRUFELlxuIgorCQkJCSJJZiB5b3UgYXJlIHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIGl0LCAiCisJCQkJInJ1biAnZ2l0IGJyYW5jaCAtRCAlcycuIiwgYXJndltpXSwgYXJndltpXSk7CisJCQlyZXQgPSAxOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoZGVsZXRlX3JlZihuYW1lLCBzaGExKSkgeworCQkJZXJyb3IoIkVycm9yIGRlbGV0aW5nICVzYnJhbmNoICclcyciLCByZW1vdGUsCisJCQkgICAgICAgYXJndltpXSk7CisJCQlyZXQgPSAxOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCJEZWxldGVkICVzYnJhbmNoICVzLlxuIiwgcmVtb3RlLCBhcmd2W2ldKTsKKwkJCXNucHJpbnRmKHNlY3Rpb24sIHNpemVvZihzZWN0aW9uKSwgImJyYW5jaC4lcyIsCisJCQkJIGFyZ3ZbaV0pOworCQkJaWYgKGdpdF9jb25maWdfcmVuYW1lX3NlY3Rpb24oc2VjdGlvbiwgTlVMTCkgPCAwKQorCQkJCXdhcm5pbmcoIlVwZGF0ZSBvZiBjb25maWctZmlsZSBmYWlsZWQiKTsKKwkJfQorCX0KKworCWZyZWUobmFtZSk7CisKKwlyZXR1cm4ocmV0KTsKK30KKworc3RydWN0IHJlZl9pdGVtIHsKKwljaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBraW5kOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07Cit9OworCitzdHJ1Y3QgcmVmX2xpc3QgeworCWludCBpbmRleCwgYWxsb2MsIG1heHdpZHRoOworCXN0cnVjdCByZWZfaXRlbSAqbGlzdDsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKndpdGhfY29tbWl0OworCWludCBraW5kczsKK307CisKK3N0YXRpYyBpbnQgaGFzX2NvbW1pdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBzdHJ1Y3QgY29tbWl0X2xpc3QgKndpdGhfY29tbWl0KQoreworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKworCWlmICghd2l0aF9jb21taXQpCisJCXJldHVybiAxOworCWNvbW1pdCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlX2dlbnRseShzaGExLCAxKTsKKwlpZiAoIWNvbW1pdCkKKwkJcmV0dXJuIDA7CisJd2hpbGUgKHdpdGhfY29tbWl0KSB7CisJCXN0cnVjdCBjb21taXQgKm90aGVyOworCisJCW90aGVyID0gd2l0aF9jb21taXQtPml0ZW07CisJCXdpdGhfY29tbWl0ID0gd2l0aF9jb21taXQtPm5leHQ7CisJCWlmIChpbl9tZXJnZV9iYXNlcyhvdGhlciwgJmNvbW1pdCwgMSkpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXBwZW5kX3JlZihjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmxhZ3MsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IHJlZl9saXN0ICpyZWZfbGlzdCA9IChzdHJ1Y3QgcmVmX2xpc3QqKShjYl9kYXRhKTsKKwlzdHJ1Y3QgcmVmX2l0ZW0gKm5ld2l0ZW07CisJaW50IGtpbmQgPSBSRUZfVU5LTk9XTl9UWVBFOworCWludCBsZW47CisKKwkvKiBEZXRlY3Qga2luZCAqLworCWlmICghcHJlZml4Y21wKHJlZm5hbWUsICJyZWZzL2hlYWRzLyIpKSB7CisJCWtpbmQgPSBSRUZfTE9DQUxfQlJBTkNIOworCQlyZWZuYW1lICs9IDExOworCX0gZWxzZSBpZiAoIXByZWZpeGNtcChyZWZuYW1lLCAicmVmcy9yZW1vdGVzLyIpKSB7CisJCWtpbmQgPSBSRUZfUkVNT1RFX0JSQU5DSDsKKwkJcmVmbmFtZSArPSAxMzsKKwl9IGVsc2UgaWYgKCFwcmVmaXhjbXAocmVmbmFtZSwgInJlZnMvdGFncy8iKSkgeworCQlraW5kID0gUkVGX1RBRzsKKwkJcmVmbmFtZSArPSAxMDsKKwl9CisKKwkvKiBGaWx0ZXIgd2l0aCB3aXRoX2NvbW1pdCBpZiBzcGVjaWZpZWQgKi8KKwlpZiAoIWhhc19jb21taXQoc2hhMSwgcmVmX2xpc3QtPndpdGhfY29tbWl0KSkKKwkJcmV0dXJuIDA7CisKKwkvKiBEb24ndCBhZGQgdHlwZXMgdGhlIGNhbGxlciBkb2Vzbid0IHdhbnQgKi8KKwlpZiAoKGtpbmQgJiByZWZfbGlzdC0+a2luZHMpID09IDApCisJCXJldHVybiAwOworCisJLyogUmVzaXplIGJ1ZmZlciAqLworCWlmIChyZWZfbGlzdC0+aW5kZXggPj0gcmVmX2xpc3QtPmFsbG9jKSB7CisJCXJlZl9saXN0LT5hbGxvYyA9IGFsbG9jX25yKHJlZl9saXN0LT5hbGxvYyk7CisJCXJlZl9saXN0LT5saXN0ID0geHJlYWxsb2MocmVmX2xpc3QtPmxpc3QsCisJCQkJcmVmX2xpc3QtPmFsbG9jICogc2l6ZW9mKHN0cnVjdCByZWZfaXRlbSkpOworCX0KKworCS8qIFJlY29yZCB0aGUgbmV3IGl0ZW0gKi8KKwluZXdpdGVtID0gJihyZWZfbGlzdC0+bGlzdFtyZWZfbGlzdC0+aW5kZXgrK10pOworCW5ld2l0ZW0tPm5hbWUgPSB4c3RyZHVwKHJlZm5hbWUpOworCW5ld2l0ZW0tPmtpbmQgPSBraW5kOworCWhhc2hjcHkobmV3aXRlbS0+c2hhMSwgc2hhMSk7CisJbGVuID0gc3RybGVuKG5ld2l0ZW0tPm5hbWUpOworCWlmIChsZW4gPiByZWZfbGlzdC0+bWF4d2lkdGgpCisJCXJlZl9saXN0LT5tYXh3aWR0aCA9IGxlbjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3JlZl9saXN0KHN0cnVjdCByZWZfbGlzdCAqcmVmX2xpc3QpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVmX2xpc3QtPmluZGV4OyBpKyspCisJCWZyZWUocmVmX2xpc3QtPmxpc3RbaV0ubmFtZSk7CisJZnJlZShyZWZfbGlzdC0+bGlzdCk7Cit9CisKK3N0YXRpYyBpbnQgcmVmX2NtcChjb25zdCB2b2lkICpyMSwgY29uc3Qgdm9pZCAqcjIpCit7CisJc3RydWN0IHJlZl9pdGVtICpjMSA9IChzdHJ1Y3QgcmVmX2l0ZW0gKikocjEpOworCXN0cnVjdCByZWZfaXRlbSAqYzIgPSAoc3RydWN0IHJlZl9pdGVtICopKHIyKTsKKworCWlmIChjMS0+a2luZCAhPSBjMi0+a2luZCkKKwkJcmV0dXJuIGMxLT5raW5kIC0gYzItPmtpbmQ7CisJcmV0dXJuIHN0cmNtcChjMS0+bmFtZSwgYzItPm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9yZWZfaXRlbShzdHJ1Y3QgcmVmX2l0ZW0gKml0ZW0sIGludCBtYXh3aWR0aCwgaW50IHZlcmJvc2UsCisJCQkgICBpbnQgYWJicmV2LCBpbnQgY3VycmVudCkKK3sKKwljaGFyIGM7CisJaW50IGNvbG9yOworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKworCXN3aXRjaCAoaXRlbS0+a2luZCkgeworCWNhc2UgUkVGX0xPQ0FMX0JSQU5DSDoKKwkJY29sb3IgPSBDT0xPUl9CUkFOQ0hfTE9DQUw7CisJCWJyZWFrOworCWNhc2UgUkVGX1JFTU9URV9CUkFOQ0g6CisJCWNvbG9yID0gQ09MT1JfQlJBTkNIX1JFTU9URTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY29sb3IgPSBDT0xPUl9CUkFOQ0hfUExBSU47CisJCWJyZWFrOworCX0KKworCWMgPSAnICc7CisJaWYgKGN1cnJlbnQpIHsKKwkJYyA9ICcqJzsKKwkJY29sb3IgPSBDT0xPUl9CUkFOQ0hfQ1VSUkVOVDsKKwl9CisKKwlpZiAodmVyYm9zZSkgeworCQlzdHJ1Y3Qgc3RyYnVmIHN1YmplY3Q7CisJCWNvbnN0IGNoYXIgKnN1YiA9ICIgKioqKiBpbnZhbGlkIHJlZiAqKioqIjsKKworCQlzdHJidWZfaW5pdCgmc3ViamVjdCwgMCk7CisKKwkJY29tbWl0ID0gbG9va3VwX2NvbW1pdChpdGVtLT5zaGExKTsKKwkJaWYgKGNvbW1pdCAmJiAhcGFyc2VfY29tbWl0KGNvbW1pdCkpIHsKKwkJCXByZXR0eV9wcmludF9jb21taXQoQ01JVF9GTVRfT05FTElORSwgY29tbWl0LAorCQkJCQkgICAgJnN1YmplY3QsIDAsIE5VTEwsIE5VTEwsIDAsIDApOworCQkJc3ViID0gc3ViamVjdC5idWY7CisJCX0KKwkJcHJpbnRmKCIlYyAlcyUtKnMlcyAlcyAlc1xuIiwgYywgYnJhbmNoX2dldF9jb2xvcihjb2xvciksCisJCSAgICAgICBtYXh3aWR0aCwgaXRlbS0+bmFtZSwKKwkJICAgICAgIGJyYW5jaF9nZXRfY29sb3IoQ09MT1JfQlJBTkNIX1JFU0VUKSwKKwkJICAgICAgIGZpbmRfdW5pcXVlX2FiYnJldihpdGVtLT5zaGExLCBhYmJyZXYpLCBzdWIpOworCQlzdHJidWZfcmVsZWFzZSgmc3ViamVjdCk7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCIlYyAlcyVzJXNcbiIsIGMsIGJyYW5jaF9nZXRfY29sb3IoY29sb3IpLCBpdGVtLT5uYW1lLAorCQkgICAgICAgYnJhbmNoX2dldF9jb2xvcihDT0xPUl9CUkFOQ0hfUkVTRVQpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3JlZl9saXN0KGludCBraW5kcywgaW50IGRldGFjaGVkLCBpbnQgdmVyYm9zZSwgaW50IGFiYnJldiwgc3RydWN0IGNvbW1pdF9saXN0ICp3aXRoX2NvbW1pdCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcmVmX2xpc3QgcmVmX2xpc3Q7CisKKwltZW1zZXQoJnJlZl9saXN0LCAwLCBzaXplb2YocmVmX2xpc3QpKTsKKwlyZWZfbGlzdC5raW5kcyA9IGtpbmRzOworCXJlZl9saXN0LndpdGhfY29tbWl0ID0gd2l0aF9jb21taXQ7CisJZm9yX2VhY2hfcmVmKGFwcGVuZF9yZWYsICZyZWZfbGlzdCk7CisKKwlxc29ydChyZWZfbGlzdC5saXN0LCByZWZfbGlzdC5pbmRleCwgc2l6ZW9mKHN0cnVjdCByZWZfaXRlbSksIHJlZl9jbXApOworCisJZGV0YWNoZWQgPSAoZGV0YWNoZWQgJiYgKGtpbmRzICYgUkVGX0xPQ0FMX0JSQU5DSCkpOworCWlmIChkZXRhY2hlZCAmJiBoYXNfY29tbWl0KGhlYWRfc2hhMSwgd2l0aF9jb21taXQpKSB7CisJCXN0cnVjdCByZWZfaXRlbSBpdGVtOworCQlpdGVtLm5hbWUgPSB4c3RyZHVwKCIobm8gYnJhbmNoKSIpOworCQlpdGVtLmtpbmQgPSBSRUZfTE9DQUxfQlJBTkNIOworCQloYXNoY3B5KGl0ZW0uc2hhMSwgaGVhZF9zaGExKTsKKwkJaWYgKHN0cmxlbihpdGVtLm5hbWUpID4gcmVmX2xpc3QubWF4d2lkdGgpCisJCQkgICAgICByZWZfbGlzdC5tYXh3aWR0aCA9IHN0cmxlbihpdGVtLm5hbWUpOworCQlwcmludF9yZWZfaXRlbSgmaXRlbSwgcmVmX2xpc3QubWF4d2lkdGgsIHZlcmJvc2UsIGFiYnJldiwgMSk7CisJCWZyZWUoaXRlbS5uYW1lKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVmX2xpc3QuaW5kZXg7IGkrKykgeworCQlpbnQgY3VycmVudCA9ICFkZXRhY2hlZCAmJgorCQkJKHJlZl9saXN0Lmxpc3RbaV0ua2luZCA9PSBSRUZfTE9DQUxfQlJBTkNIKSAmJgorCQkJIXN0cmNtcChyZWZfbGlzdC5saXN0W2ldLm5hbWUsIGhlYWQpOworCQlwcmludF9yZWZfaXRlbSgmcmVmX2xpc3QubGlzdFtpXSwgcmVmX2xpc3QubWF4d2lkdGgsIHZlcmJvc2UsCisJCQkgICAgICAgYWJicmV2LCBjdXJyZW50KTsKKwl9CisKKwlmcmVlX3JlZl9saXN0KCZyZWZfbGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlbmFtZV9icmFuY2goY29uc3QgY2hhciAqb2xkbmFtZSwgY29uc3QgY2hhciAqbmV3bmFtZSwgaW50IGZvcmNlKQoreworCWNoYXIgb2xkcmVmW1BBVEhfTUFYXSwgbmV3cmVmW1BBVEhfTUFYXSwgbG9nbXNnW1BBVEhfTUFYKjIgKyAxMDBdOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY2hhciBvbGRzZWN0aW9uW1BBVEhfTUFYXSwgbmV3c2VjdGlvbltQQVRIX01BWF07CisKKwlpZiAoIW9sZG5hbWUpCisJCWRpZSgiY2Fubm90IHJlbmFtZSB0aGUgY3VycmVudCBicmFuY2ggd2hpbGUgbm90IG9uIGFueS4iKTsKKworCWlmIChzbnByaW50ZihvbGRyZWYsIHNpemVvZihvbGRyZWYpLCAicmVmcy9oZWFkcy8lcyIsIG9sZG5hbWUpID4gc2l6ZW9mKG9sZHJlZikpCisJCWRpZSgiT2xkIGJyYW5jaG5hbWUgdG9vIGxvbmciKTsKKworCWlmIChjaGVja19yZWZfZm9ybWF0KG9sZHJlZikpCisJCWRpZSgiSW52YWxpZCBicmFuY2ggbmFtZTogJXMiLCBvbGRyZWYpOworCisJaWYgKHNucHJpbnRmKG5ld3JlZiwgc2l6ZW9mKG5ld3JlZiksICJyZWZzL2hlYWRzLyVzIiwgbmV3bmFtZSkgPiBzaXplb2YobmV3cmVmKSkKKwkJZGllKCJOZXcgYnJhbmNobmFtZSB0b28gbG9uZyIpOworCisJaWYgKGNoZWNrX3JlZl9mb3JtYXQobmV3cmVmKSkKKwkJZGllKCJJbnZhbGlkIGJyYW5jaCBuYW1lOiAlcyIsIG5ld3JlZik7CisKKwlpZiAocmVzb2x2ZV9yZWYobmV3cmVmLCBzaGExLCAxLCBOVUxMKSAmJiAhZm9yY2UpCisJCWRpZSgiQSBicmFuY2ggbmFtZWQgJyVzJyBhbHJlYWR5IGV4aXN0cy4iLCBuZXduYW1lKTsKKworCXNucHJpbnRmKGxvZ21zZywgc2l6ZW9mKGxvZ21zZyksICJCcmFuY2g6IHJlbmFtZWQgJXMgdG8gJXMiLAorCQkgb2xkcmVmLCBuZXdyZWYpOworCisJaWYgKHJlbmFtZV9yZWYob2xkcmVmLCBuZXdyZWYsIGxvZ21zZykpCisJCWRpZSgiQnJhbmNoIHJlbmFtZSBmYWlsZWQiKTsKKworCS8qIG5vIG5lZWQgdG8gcGFzcyBsb2dtc2cgaGVyZSBhcyBIRUFEIGRpZG4ndCByZWFsbHkgbW92ZSAqLworCWlmICghc3RyY21wKG9sZG5hbWUsIGhlYWQpICYmIGNyZWF0ZV9zeW1yZWYoIkhFQUQiLCBuZXdyZWYsIE5VTEwpKQorCQlkaWUoIkJyYW5jaCByZW5hbWVkIHRvICVzLCBidXQgSEVBRCBpcyBub3QgdXBkYXRlZCEiLCBuZXduYW1lKTsKKworCXNucHJpbnRmKG9sZHNlY3Rpb24sIHNpemVvZihvbGRzZWN0aW9uKSwgImJyYW5jaC4lcyIsIG9sZHJlZiArIDExKTsKKwlzbnByaW50ZihuZXdzZWN0aW9uLCBzaXplb2YobmV3c2VjdGlvbiksICJicmFuY2guJXMiLCBuZXdyZWYgKyAxMSk7CisJaWYgKGdpdF9jb25maWdfcmVuYW1lX3NlY3Rpb24ob2xkc2VjdGlvbiwgbmV3c2VjdGlvbikgPCAwKQorCQlkaWUoIkJyYW5jaCBpcyByZW5hbWVkLCBidXQgdXBkYXRlIG9mIGNvbmZpZy1maWxlIGZhaWxlZCIpOworfQorCitzdGF0aWMgaW50IG9wdF9wYXJzZV93aXRoX2NvbW1pdChjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHQsIGNvbnN0IGNoYXIgKmFyZywgaW50IHVuc2V0KQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCisJaWYgKCFhcmcpCisJCXJldHVybiAtMTsKKwlpZiAoZ2V0X3NoYTEoYXJnLCBzaGExKSkKKwkJZGllKCJtYWxmb3JtZWQgb2JqZWN0IG5hbWUgJXMiLCBhcmcpOworCWNvbW1pdCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKHNoYTEpOworCWlmICghY29tbWl0KQorCQlkaWUoIm5vIHN1Y2ggY29tbWl0ICVzIiwgYXJnKTsKKwljb21taXRfbGlzdF9pbnNlcnQoY29tbWl0LCBvcHQtPnZhbHVlKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNtZF9icmFuY2goaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGRlbGV0ZSA9IDAsIHJlbmFtZSA9IDAsIGZvcmNlX2NyZWF0ZSA9IDA7CisJaW50IHZlcmJvc2UgPSAwLCBhYmJyZXYgPSBERUZBVUxUX0FCQlJFViwgZGV0YWNoZWQgPSAwOworCWludCByZWZsb2cgPSAwOworCWVudW0gYnJhbmNoX3RyYWNrIHRyYWNrOworCWludCBraW5kcyA9IFJFRl9MT0NBTF9CUkFOQ0g7CisJc3RydWN0IGNvbW1pdF9saXN0ICp3aXRoX2NvbW1pdCA9IE5VTEw7CisKKwlzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKKwkJT1BUX0dST1VQKCJHZW5lcmljIG9wdGlvbnMiKSwKKwkJT1BUX19WRVJCT1NFKCZ2ZXJib3NlKSwKKwkJT1BUX1NFVF9JTlQoIDAgLCAidHJhY2siLCAgJnRyYWNrLCAic2V0IHVwIHRyYWNraW5nIG1vZGUgKHNlZSBnaXQtcHVsbCgxKSkiLAorCQkJQlJBTkNIX1RSQUNLX0VYUExJQ0lUKSwKKwkJT1BUX0JPT0xFQU4oIDAgLCAiY29sb3IiLCAgJmJyYW5jaF91c2VfY29sb3IsICJ1c2UgY29sb3JlZCBvdXRwdXQiKSwKKwkJT1BUX1NFVF9JTlQoJ3InLCBOVUxMLCAgICAgJmtpbmRzLCAiYWN0IG9uIHJlbW90ZS10cmFja2luZyBicmFuY2hlcyIsCisJCQlSRUZfUkVNT1RFX0JSQU5DSCksCisJCU9QVF9DQUxMQkFDSygwLCAiY29udGFpbnMiLCAmd2l0aF9jb21taXQsICJjb21taXQiLAorCQkJICAgICAicHJpbnQgb25seSBicmFuY2hlcyB0aGF0IGNvbnRhaW4gdGhlIGNvbW1pdCIsCisJCQkgICAgIG9wdF9wYXJzZV93aXRoX2NvbW1pdCksCisJCXsKKwkJCU9QVElPTl9DQUxMQkFDSywgMCwgIndpdGgiLCAmd2l0aF9jb21taXQsICJjb21taXQiLAorCQkJInByaW50IG9ubHkgYnJhbmNoZXMgdGhhdCBjb250YWluIHRoZSBjb21taXQiLAorCQkJUEFSU0VfT1BUX0hJRERFTiwgb3B0X3BhcnNlX3dpdGhfY29tbWl0LAorCQl9LAorCQlPUFRfX0FCQlJFVigmYWJicmV2KSwKKworCQlPUFRfR1JPVVAoIlNwZWNpZmljIGdpdC1icmFuY2ggYWN0aW9uczoiKSwKKwkJT1BUX1NFVF9JTlQoJ2EnLCBOVUxMLCAma2luZHMsICJsaXN0IGJvdGggcmVtb3RlLXRyYWNraW5nIGFuZCBsb2NhbCBicmFuY2hlcyIsCisJCQlSRUZfUkVNT1RFX0JSQU5DSCB8IFJFRl9MT0NBTF9CUkFOQ0gpLAorCQlPUFRfQklUKCdkJywgTlVMTCwgJmRlbGV0ZSwgImRlbGV0ZSBmdWxseSBtZXJnZWQgYnJhbmNoIiwgMSksCisJCU9QVF9CSVQoJ0QnLCBOVUxMLCAmZGVsZXRlLCAiZGVsZXRlIGJyYW5jaCAoZXZlbiBpZiBub3QgbWVyZ2VkKSIsIDIpLAorCQlPUFRfQklUKCdtJywgTlVMTCwgJnJlbmFtZSwgIm1vdmUvcmVuYW1lIGEgYnJhbmNoIGFuZCBpdHMgcmVmbG9nIiwgMSksCisJCU9QVF9CSVQoJ00nLCBOVUxMLCAmcmVuYW1lLCAibW92ZS9yZW5hbWUgYSBicmFuY2gsIGV2ZW4gaWYgdGFyZ2V0IGV4aXN0cyIsIDIpLAorCQlPUFRfQk9PTEVBTignbCcsIE5VTEwsICZyZWZsb2csICJjcmVhdGUgdGhlIGJyYW5jaCdzIHJlZmxvZyIpLAorCQlPUFRfQk9PTEVBTignZicsIE5VTEwsICZmb3JjZV9jcmVhdGUsICJmb3JjZSBjcmVhdGlvbiAod2hlbiBhbHJlYWR5IGV4aXN0cykiKSwKKwkJT1BUX0VORCgpLAorCX07CisKKwlnaXRfY29uZmlnKGdpdF9icmFuY2hfY29uZmlnKTsKKworCWlmIChicmFuY2hfdXNlX2NvbG9yID09IC0xKQorCQlicmFuY2hfdXNlX2NvbG9yID0gZ2l0X3VzZV9jb2xvcl9kZWZhdWx0OworCisJdHJhY2sgPSBnaXRfYnJhbmNoX3RyYWNrOworCWFyZ2MgPSBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIG9wdGlvbnMsIGJ1aWx0aW5fYnJhbmNoX3VzYWdlLCAwKTsKKwlpZiAoISFkZWxldGUgKyAhIXJlbmFtZSArICEhZm9yY2VfY3JlYXRlID4gMSkKKwkJdXNhZ2Vfd2l0aF9vcHRpb25zKGJ1aWx0aW5fYnJhbmNoX3VzYWdlLCBvcHRpb25zKTsKKworCWhlYWQgPSByZXNvbHZlX3JlZigiSEVBRCIsIGhlYWRfc2hhMSwgMCwgTlVMTCk7CisJaWYgKCFoZWFkKQorCQlkaWUoIkZhaWxlZCB0byByZXNvbHZlIEhFQUQgYXMgYSB2YWxpZCByZWYuIik7CisJaGVhZCA9IHhzdHJkdXAoaGVhZCk7CisJaWYgKCFzdHJjbXAoaGVhZCwgIkhFQUQiKSkgeworCQlkZXRhY2hlZCA9IDE7CisJfSBlbHNlIHsKKwkJaWYgKHByZWZpeGNtcChoZWFkLCAicmVmcy9oZWFkcy8iKSkKKwkJCWRpZSgiSEVBRCBub3QgZm91bmQgYmVsb3cgcmVmcy9oZWFkcyEiKTsKKwkJaGVhZCArPSAxMTsKKwl9CisKKwlpZiAoZGVsZXRlKQorCQlyZXR1cm4gZGVsZXRlX2JyYW5jaGVzKGFyZ2MsIGFyZ3YsIGRlbGV0ZSA+IDEsIGtpbmRzKTsKKwllbHNlIGlmIChhcmdjID09IDApCisJCXByaW50X3JlZl9saXN0KGtpbmRzLCBkZXRhY2hlZCwgdmVyYm9zZSwgYWJicmV2LCB3aXRoX2NvbW1pdCk7CisJZWxzZSBpZiAocmVuYW1lICYmIChhcmdjID09IDEpKQorCQlyZW5hbWVfYnJhbmNoKGhlYWQsIGFyZ3ZbMF0sIHJlbmFtZSA+IDEpOworCWVsc2UgaWYgKHJlbmFtZSAmJiAoYXJnYyA9PSAyKSkKKwkJcmVuYW1lX2JyYW5jaChhcmd2WzBdLCBhcmd2WzFdLCByZW5hbWUgPiAxKTsKKwllbHNlIGlmIChhcmdjIDw9IDIpCisJCWNyZWF0ZV9icmFuY2goaGVhZCwgYXJndlswXSwgKGFyZ2MgPT0gMikgPyBhcmd2WzFdIDogaGVhZCwKKwkJCSAgICAgIGZvcmNlX2NyZWF0ZSwgcmVmbG9nLCB0cmFjayk7CisJZWxzZQorCQl1c2FnZV93aXRoX29wdGlvbnMoYnVpbHRpbl9icmFuY2hfdXNhZ2UsIG9wdGlvbnMpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWJ1bmRsZS5jIGIvYnVpbHRpbi1idW5kbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzQ3NmU3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1idW5kbGUuYwpAQCAtMCwwICsxLDYzIEBACisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYnVuZGxlLmgiCisKKy8qCisgKiBCYXNpYyBoYW5kbGVyIGZvciBidW5kbGUgZmlsZXMgdG8gY29ubmVjdCByZXBvc2l0b3JpZXMgdmlhIHNuZWFrZXJuZXQuCisgKiBJbnZvY2F0aW9uIG11c3QgaW5jbHVkZSBhY3Rpb24uCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBjcmVhdGUgYSBidW5kbGUgb3IgcHJvdmlkZSBpbmZvcm1hdGlvbiBvbiBhbiBleGlzdGluZworICogYnVuZGxlIHN1cHBvcnRpbmcgZ2l0LWZldGNoLCBnaXQtcHVsbCwgYW5kIGdpdC1scy1yZW1vdGUKKyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqYnVuZGxlX3VzYWdlPSJnaXQtYnVuZGxlIChjcmVhdGUgPGJ1bmRsZT4gPGdpdC1yZXYtbGlzdCBhcmdzPiB8IHZlcmlmeSA8YnVuZGxlPiB8IGxpc3QtaGVhZHMgPGJ1bmRsZT4gW3JlZm5hbWVdLi4uIHwgdW5idW5kbGUgPGJ1bmRsZT4gW3JlZm5hbWVdLi4uICkiOworCitpbnQgY21kX2J1bmRsZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgYnVuZGxlX2hlYWRlciBoZWFkZXI7CisJaW50IG5vbmdpdDsKKwljb25zdCBjaGFyICpjbWQsICpidW5kbGVfZmlsZTsKKwlpbnQgYnVuZGxlX2ZkID0gLTE7CisJY2hhciBidWZmZXJbUEFUSF9NQVhdOworCisJaWYgKGFyZ2MgPCAzKQorCQl1c2FnZShidW5kbGVfdXNhZ2UpOworCisJY21kID0gYXJndlsxXTsKKwlidW5kbGVfZmlsZSA9IGFyZ3ZbMl07CisJYXJnYyAtPSAyOworCWFyZ3YgKz0gMjsKKworCXByZWZpeCA9IHNldHVwX2dpdF9kaXJlY3RvcnlfZ2VudGx5KCZub25naXQpOworCWlmIChwcmVmaXggJiYgYnVuZGxlX2ZpbGVbMF0gIT0gJy8nKSB7CisJCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlcy8lcyIsIHByZWZpeCwgYnVuZGxlX2ZpbGUpOworCQlidW5kbGVfZmlsZSA9IGJ1ZmZlcjsKKwl9CisKKwltZW1zZXQoJmhlYWRlciwgMCwgc2l6ZW9mKGhlYWRlcikpOworCWlmIChzdHJjbXAoY21kLCAiY3JlYXRlIikgJiYgKGJ1bmRsZV9mZCA9CisJCQkJcmVhZF9idW5kbGVfaGVhZGVyKGJ1bmRsZV9maWxlLCAmaGVhZGVyKSkgPCAwKQorCQlyZXR1cm4gMTsKKworCWlmICghc3RyY21wKGNtZCwgInZlcmlmeSIpKSB7CisJCWNsb3NlKGJ1bmRsZV9mZCk7CisJCWlmICh2ZXJpZnlfYnVuZGxlKCZoZWFkZXIsIDEpKQorCQkJcmV0dXJuIDE7CisJCWZwcmludGYoc3RkZXJyLCAiJXMgaXMgb2theVxuIiwgYnVuZGxlX2ZpbGUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAoY21kLCAibGlzdC1oZWFkcyIpKSB7CisJCWNsb3NlKGJ1bmRsZV9mZCk7CisJCXJldHVybiAhIWxpc3RfYnVuZGxlX3JlZnMoJmhlYWRlciwgYXJnYywgYXJndik7CisJfQorCWlmICghc3RyY21wKGNtZCwgImNyZWF0ZSIpKSB7CisJCWlmIChub25naXQpCisJCQlkaWUoIk5lZWQgYSByZXBvc2l0b3J5IHRvIGNyZWF0ZSBhIGJ1bmRsZS4iKTsKKwkJcmV0dXJuICEhY3JlYXRlX2J1bmRsZSgmaGVhZGVyLCBidW5kbGVfZmlsZSwgYXJnYywgYXJndik7CisJfSBlbHNlIGlmICghc3RyY21wKGNtZCwgInVuYnVuZGxlIikpIHsKKwkJaWYgKG5vbmdpdCkKKwkJCWRpZSgiTmVlZCBhIHJlcG9zaXRvcnkgdG8gdW5idW5kbGUuIik7CisJCXJldHVybiAhIXVuYnVuZGxlKCZoZWFkZXIsIGJ1bmRsZV9mZCkgfHwKKwkJCWxpc3RfYnVuZGxlX3JlZnMoJmhlYWRlciwgYXJnYywgYXJndik7CisJfSBlbHNlCisJCXVzYWdlKGJ1bmRsZV91c2FnZSk7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWNhdC1maWxlLmMgYi9idWlsdGluLWNhdC1maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzMmQ1OAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tY2F0LWZpbGUuYwpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZXhlY19jbWQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCitzdGF0aWMgdm9pZCBwcHJpbnRfdGFnKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCS8qIHRoZSBwYXJzZXIgaW4gdGFnLmMgaXMgdXNlbGVzcyBoZXJlLiAqLworCWNvbnN0IGNoYXIgKmVuZHAgPSBidWYgKyBzaXplOworCWNvbnN0IGNoYXIgKmNwID0gYnVmOworCisJd2hpbGUgKGNwIDwgZW5kcCkgeworCQljaGFyIGMgPSAqY3ArKzsKKwkJaWYgKGMgIT0gJ1xuJykKKwkJCWNvbnRpbnVlOworCQlpZiAoNyA8PSBlbmRwIC0gY3AgJiYgIW1lbWNtcCgidGFnZ2VyICIsIGNwLCA3KSkgeworCQkJY29uc3QgY2hhciAqdGFnZ2VyID0gY3A7CisKKwkJCS8qIEZvdW5kIHRoZSB0YWdnZXIgbGluZS4gIENvcHkgb3V0IHRoZSBjb250ZW50cworCQkJICogb2YgdGhlIGJ1ZmZlciBzbyBmYXIuCisJCQkgKi8KKwkJCXdyaXRlX29yX2RpZSgxLCBidWYsIGNwIC0gYnVmKTsKKworCQkJLyoKKwkJCSAqIERvIHNvbWV0aGluZyBpbnRlbGxpZ2VudCwgbGlrZSBwcmV0dHktcHJpbnRpbmcKKwkJCSAqIHRoZSBkYXRlLgorCQkJICovCisJCQl3aGlsZSAoY3AgPCBlbmRwKSB7CisJCQkJaWYgKCpjcCsrID09ICdcbicpIHsKKwkJCQkJLyogdGFnZ2VyIHRvIGNwIGlzIGEgbGluZQorCQkJCQkgKiB0aGF0IGhhcyBpZGVudCBhbmQgdGltZS4KKwkJCQkJICovCisJCQkJCWNvbnN0IGNoYXIgKnNwID0gdGFnZ2VyOworCQkJCQljaGFyICplcDsKKwkJCQkJdW5zaWduZWQgbG9uZyBkYXRlOworCQkJCQlsb25nIHR6OworCQkJCQl3aGlsZSAoc3AgPCBjcCAmJiAqc3AgIT0gJz4nKQorCQkJCQkJc3ArKzsKKwkJCQkJaWYgKHNwID09IGNwKSB7CisJCQkJCQkvKiBnaXZlIHVwICovCisJCQkJCQl3cml0ZV9vcl9kaWUoMSwgdGFnZ2VyLAorCQkJCQkJCSAgICAgY3AgLSB0YWdnZXIpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJd2hpbGUgKHNwIDwgY3AgJiYKKwkJCQkJICAgICAgICEoJzAnIDw9ICpzcCAmJiAqc3AgPD0gJzknKSkKKwkJCQkJCXNwKys7CisJCQkJCXdyaXRlX29yX2RpZSgxLCB0YWdnZXIsIHNwIC0gdGFnZ2VyKTsKKwkJCQkJZGF0ZSA9IHN0cnRvdWwoc3AsICZlcCwgMTApOworCQkJCQl0eiA9IHN0cnRvbChlcCwgTlVMTCwgMTApOworCQkJCQlzcCA9IHNob3dfZGF0ZShkYXRlLCB0eiwgMCk7CisJCQkJCXdyaXRlX29yX2RpZSgxLCBzcCwgc3RybGVuKHNwKSk7CisJCQkJCXh3cml0ZSgxLCAiXG4iLCAxKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNwIDwgZW5kcCAmJiAqY3AgPT0gJ1xuJykKKwkJCS8qIGVuZCBvZiBoZWFkZXIgKi8KKwkJCWJyZWFrOworCX0KKwkvKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGNvcGllZCBvdXQgdGhlIGhlYWRlciB1cCB0byB0aGUgZW5kIG9mCisJICogdGhlIHRhZ2dlciBsaW5lIGFuZCBjcCBwb2ludHMgYXQgb25lIHBhc3QgXG4uICBJdCBjb3VsZCBiZSB0aGUKKwkgKiBuZXh0IGhlYWRlciBsaW5lIGFmdGVyIHRoZSB0YWdnZXIgbGluZSwgb3IgaXQgY291bGQgYmUgYW5vdGhlcgorCSAqIFxuIHRoYXQgbWFya3MgdGhlIGVuZCBvZiB0aGUgaGVhZGVycy4gIFdlIG5lZWQgdG8gY29weSBvdXQgdGhlCisJICogcmVtYWluZGVyIGFzIGlzLgorCSAqLworCWlmIChjcCA8IGVuZHApCisJCXdyaXRlX29yX2RpZSgxLCBjcCwgZW5kcCAtIGNwKTsKK30KKworaW50IGNtZF9jYXRfZmlsZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwl2b2lkICpidWY7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCBvcHQ7CisJY29uc3QgY2hhciAqZXhwX3R5cGUsICpvYmpfbmFtZTsKKworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKwlpZiAoYXJnYyAhPSAzKQorCQl1c2FnZSgiZ2l0LWNhdC1maWxlIFstdHwtc3wtZXwtcHw8dHlwZT5dIDxzaGExPiIpOworCWV4cF90eXBlID0gYXJndlsxXTsKKwlvYmpfbmFtZSA9IGFyZ3ZbMl07CisKKwlpZiAoZ2V0X3NoYTEob2JqX25hbWUsIHNoYTEpKQorCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lICVzIiwgb2JqX25hbWUpOworCisJb3B0ID0gMDsKKwlpZiAoIGV4cF90eXBlWzBdID09ICctJyApIHsKKwkJb3B0ID0gZXhwX3R5cGVbMV07CisJCWlmICggIW9wdCB8fCBleHBfdHlwZVsyXSApCisJCQlvcHQgPSAtMTsgLyogTm90IGEgc2luZ2xlIGNoYXJhY3RlciBvcHRpb24gKi8KKwl9CisKKwlidWYgPSBOVUxMOworCXN3aXRjaCAob3B0KSB7CisJY2FzZSAndCc6CisJCXR5cGUgPSBzaGExX29iamVjdF9pbmZvKHNoYTEsIE5VTEwpOworCQlpZiAodHlwZSA+IDApIHsKKwkJCXByaW50ZigiJXNcbiIsIHR5cGVuYW1lKHR5cGUpKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCisJY2FzZSAncyc6CisJCXR5cGUgPSBzaGExX29iamVjdF9pbmZvKHNoYTEsICZzaXplKTsKKwkJaWYgKHR5cGUgPiAwKSB7CisJCQlwcmludGYoIiVsdVxuIiwgc2l6ZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgJ2UnOgorCQlyZXR1cm4gIWhhc19zaGExX2ZpbGUoc2hhMSk7CisKKwljYXNlICdwJzoKKwkJdHlwZSA9IHNoYTFfb2JqZWN0X2luZm8oc2hhMSwgTlVMTCk7CisJCWlmICh0eXBlIDwgMCkKKwkJCWRpZSgiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWUgJXMiLCBvYmpfbmFtZSk7CisKKwkJLyogY3VzdG9tIHByZXR0eS1wcmludCBoZXJlICovCisJCWlmICh0eXBlID09IE9CSl9UUkVFKSB7CisJCQljb25zdCBjaGFyICpsc19hcmdzWzNdID0geyJscy10cmVlIiwgb2JqX25hbWUsIE5VTEx9OworCQkJcmV0dXJuIGNtZF9sc190cmVlKDIsIGxzX2FyZ3MsIE5VTEwpOworCQl9CisKKwkJYnVmID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgJnR5cGUsICZzaXplKTsKKwkJaWYgKCFidWYpCisJCQlkaWUoIkNhbm5vdCByZWFkIG9iamVjdCAlcyIsIG9ial9uYW1lKTsKKwkJaWYgKHR5cGUgPT0gT0JKX1RBRykgeworCQkJcHByaW50X3RhZyhzaGExLCBidWYsIHNpemUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBvdGhlcndpc2UganVzdCBzcGl0IG91dCB0aGUgZGF0YSAqLworCQlicmVhazsKKwljYXNlIDA6CisJCWJ1ZiA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKHNoYTEsIGV4cF90eXBlLCAmc2l6ZSwgTlVMTCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGllKCJnaXQtY2F0LWZpbGU6IHVua25vd24gb3B0aW9uOiAlc1xuIiwgZXhwX3R5cGUpOworCX0KKworCWlmICghYnVmKQorCQlkaWUoImdpdC1jYXQtZmlsZSAlczogYmFkIGZpbGUiLCBvYmpfbmFtZSk7CisKKwl3cml0ZV9vcl9kaWUoMSwgYnVmLCBzaXplKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tY2hlY2stYXR0ci5jIGIvYnVpbHRpbi1jaGVjay1hdHRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmZGZhMQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tY2hlY2stYXR0ci5jCkBAIC0wLDAgKzEsNjQgQEAKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJhdHRyLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgY2hlY2tfYXR0cl91c2FnZVtdID0KKyJnaXQtY2hlY2stYXR0ciBhdHRyLi4uIFstLV0gcGF0aG5hbWUuLi4iOworCitpbnQgY21kX2NoZWNrX2F0dHIoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IGdpdF9hdHRyX2NoZWNrICpjaGVjazsKKwlpbnQgY250LCBpLCBkb3VibGVkYXNoOworCisJaWYgKHJlYWRfY2FjaGUoKSA8IDApIHsKKwkJZGllKCJpbnZhbGlkIGNhY2hlIik7CisJfQorCisJZG91YmxlZGFzaCA9IC0xOworCWZvciAoaSA9IDE7IGRvdWJsZWRhc2ggPCAwICYmIGkgPCBhcmdjOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tIikpCisJCQlkb3VibGVkYXNoID0gaTsKKwl9CisKKwkvKiBJZiB0aGVyZSBpcyBubyBkb3VibGUgZGFzaCwgd2UgaGFuZGxlIG9ubHkgb25lIGF0dHJpYnV0ZSAqLworCWlmIChkb3VibGVkYXNoIDwgMCkgeworCQljbnQgPSAxOworCQlkb3VibGVkYXNoID0gMTsKKwl9IGVsc2UKKwkJY250ID0gZG91YmxlZGFzaCAtIDE7CisJZG91YmxlZGFzaCsrOworCisJaWYgKGNudCA8PSAwIHx8IGFyZ2MgPCBkb3VibGVkYXNoKQorCQl1c2FnZShjaGVja19hdHRyX3VzYWdlKTsKKwljaGVjayA9IHhjYWxsb2MoY250LCBzaXplb2YoKmNoZWNrKSk7CisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJCXN0cnVjdCBnaXRfYXR0ciAqYTsKKwkJbmFtZSA9IGFyZ3ZbaSArIDFdOworCQlhID0gZ2l0X2F0dHIobmFtZSwgc3RybGVuKG5hbWUpKTsKKwkJaWYgKCFhKQorCQkJcmV0dXJuIGVycm9yKCIlczogbm90IGEgdmFsaWQgYXR0cmlidXRlIG5hbWUiLCBuYW1lKTsKKwkJY2hlY2tbaV0uYXR0ciA9IGE7CisJfQorCisJZm9yIChpID0gZG91YmxlZGFzaDsgaSA8IGFyZ2M7IGkrKykgeworCQlpbnQgajsKKwkJaWYgKGdpdF9jaGVja2F0dHIoYXJndltpXSwgY250LCBjaGVjaykpCisJCQlkaWUoImdpdF9jaGVja2F0dHIgZGllZCIpOworCQlmb3IgKGogPSAwOyBqIDwgY250OyBqKyspIHsKKwkJCWNvbnN0IGNoYXIgKnZhbHVlID0gY2hlY2tbal0udmFsdWU7CisKKwkJCWlmIChBVFRSX1RSVUUodmFsdWUpKQorCQkJCXZhbHVlID0gInNldCI7CisJCQllbHNlIGlmIChBVFRSX0ZBTFNFKHZhbHVlKSkKKwkJCQl2YWx1ZSA9ICJ1bnNldCI7CisJCQllbHNlIGlmIChBVFRSX1VOU0VUKHZhbHVlKSkKKwkJCQl2YWx1ZSA9ICJ1bnNwZWNpZmllZCI7CisKKwkJCXF1b3RlX2Nfc3R5bGUoYXJndltpXSwgTlVMTCwgc3Rkb3V0LCAwKTsKKwkJCXByaW50ZigiOiAlczogJXNcbiIsIGFyZ3ZbaisxXSwgdmFsdWUpOworCQl9CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1jaGVjay1yZWYtZm9ybWF0LmMgYi9idWlsdGluLWNoZWNrLXJlZi1mb3JtYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTA0YmU3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1jaGVjay1yZWYtZm9ybWF0LmMKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICovCisKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKK2ludCBjbWRfY2hlY2tfcmVmX2Zvcm1hdChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpZiAoYXJnYyAhPSAyKQorCQl1c2FnZSgiZ2l0LWNoZWNrLXJlZi1mb3JtYXQgcmVmbmFtZSIpOworCXJldHVybiAhIWNoZWNrX3JlZl9mb3JtYXQoYXJndlsxXSk7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWNoZWNrb3V0LWluZGV4LmMgYi9idWlsdGluLWNoZWNrb3V0LWluZGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U0MjAyNAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tY2hlY2tvdXQtaW5kZXguYwpAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIENoZWNrLW91dCBmaWxlcyBmcm9tIHRoZSAiY3VycmVudCBjYWNoZSBkaXJlY3RvcnkiCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IExpbnVzIFRvcnZhbGRzCisgKgorICogQ2FyZWZ1bDogb3JkZXIgb2YgYXJndW1lbnQgZmxhZ3MgZG9lcyBtYXR0ZXIuIEZvciBleGFtcGxlLAorICoKKyAqCWdpdC1jaGVja291dC1pbmRleCAtYSAtZiBmaWxlLmMKKyAqCisgKiBXaWxsIGZpcnN0IGNoZWNrIG91dCBhbGwgZmlsZXMgbGlzdGVkIGluIHRoZSBjYWNoZSAoYnV0IG5vdAorICogb3ZlcndyaXRlIGFueSBvbGQgb25lcyksIGFuZCB0aGVuIGZvcmNlLWNoZWNrb3V0ICJmaWxlLmMiIGEKKyAqIHNlY29uZCB0aW1lIChpZSB0aGF0IG9uZSBfd2lsbF8gb3ZlcndyaXRlIGFueSBvbGQgY29udGVudHMKKyAqIHdpdGggdGhlIHNhbWUgZmlsZW5hbWUpLgorICoKKyAqIEFsc28sIGp1c3QgZG9pbmcgImdpdC1jaGVja291dC1pbmRleCIgZG9lcyBub3RoaW5nLiBZb3UgcHJvYmFibHkKKyAqIG1lYW50ICJnaXQtY2hlY2tvdXQtaW5kZXggLWEiLiBBbmQgaWYgeW91IHdhbnQgdG8gZm9yY2UgaXQsIHlvdQorICogd2FudCAiZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC1hIi4KKyAqCisgKiBJbnR1aXRpdmVuZXNzIGlzIG5vdCB0aGUgZ29hbCBoZXJlLiBSZXBlYXRhYmlsaXR5IGlzLiBUaGUKKyAqIHJlYXNvbiBmb3IgdGhlICJubyBhcmd1bWVudHMgbWVhbnMgbm8gd29yayIgdGhpbmcgaXMgdGhhdAorICogZnJvbSBzY3JpcHRzIHlvdSBhcmUgc3VwcG9zZWQgdG8gYmUgYWJsZSB0byBkbyB0aGluZ3MgbGlrZQorICoKKyAqCWZpbmQgLiAtbmFtZSAnKi5oJyAtcHJpbnQwIHwgeGFyZ3MgLTAgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC0tCisgKgorICogb3I6CisgKgorICoJZmluZCAuIC1uYW1lICcqLmgnIC1wcmludDAgfCBnaXQtY2hlY2tvdXQtaW5kZXggLWYgLXogLS1zdGRpbgorICoKKyAqIHdoaWNoIHdpbGwgZm9yY2UgYWxsIGV4aXN0aW5nICouaCBmaWxlcyB0byBiZSByZXBsYWNlZCB3aXRoCisgKiB0aGVpciBjYWNoZWQgY29waWVzLiBJZiBhbiBlbXB0eSBjb21tYW5kIGxpbmUgaW1wbGllZCAiYWxsIiwKKyAqIHRoZW4gdGhpcyB3b3VsZCBmb3JjZS1yZWZyZXNoIGV2ZXJ5dGhpbmcgaW4gdGhlIGNhY2hlLCB3aGljaAorICogd2FzIG5vdCB0aGUgcG9pbnQuCisgKgorICogT2gsIGFuZCB0aGUgIi0tIiBpcyBqdXN0IGEgZ29vZCBpZGVhIHdoZW4geW91IGtub3cgdGhlIHJlc3QKKyAqIHdpbGwgYmUgZmlsZW5hbWVzLiBKdXN0IHNvIHRoYXQgeW91IHdvdWxkbid0IGhhdmUgYSBmaWxlbmFtZQorICogb2YgIi1hIiBjYXVzaW5nIHByb2JsZW1zIChub3QgcG9zc2libGUgaW4gdGhlIGFib3ZlIGV4YW1wbGUsCisgKiBidXQgZ2V0IHVzZWQgdG8gaXQgaW4gc2NyaXB0aW5nISkuCisgKi8KKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorI2luY2x1ZGUgImNhY2hlLXRyZWUuaCIKKworI2RlZmluZSBDSEVDS09VVF9BTEwgNAorc3RhdGljIGludCBsaW5lX3Rlcm1pbmF0aW9uID0gJ1xuJzsKK3N0YXRpYyBpbnQgY2hlY2tvdXRfc3RhZ2U7IC8qIGRlZmF1bHQgdG8gY2hlY2tvdXQgc3RhZ2UwICovCitzdGF0aWMgaW50IHRvX3RlbXBmaWxlOworc3RhdGljIGNoYXIgdG9wYXRoWzRdW1BBVEhfTUFYICsgMV07CisKK3N0YXRpYyBzdHJ1Y3QgY2hlY2tvdXQgc3RhdGU7CisKK3N0YXRpYyB2b2lkIHdyaXRlX3RlbXBmaWxlX3JlY29yZChjb25zdCBjaGFyICpuYW1lLCBpbnQgcHJlZml4X2xlbmd0aCkKK3sKKwlpbnQgaTsKKworCWlmIChDSEVDS09VVF9BTEwgPT0gY2hlY2tvdXRfc3RhZ2UpIHsKKwkJZm9yIChpID0gMTsgaSA8IDQ7IGkrKykgeworCQkJaWYgKGkgPiAxKQorCQkJCXB1dGNoYXIoJyAnKTsKKwkJCWlmICh0b3BhdGhbaV1bMF0pCisJCQkJZnB1dHModG9wYXRoW2ldLCBzdGRvdXQpOworCQkJZWxzZQorCQkJCXB1dGNoYXIoJy4nKTsKKwkJfQorCX0gZWxzZQorCQlmcHV0cyh0b3BhdGhbY2hlY2tvdXRfc3RhZ2VdLCBzdGRvdXQpOworCisJcHV0Y2hhcignXHQnKTsKKwl3cml0ZV9uYW1lX3F1b3RlZChuYW1lICsgcHJlZml4X2xlbmd0aCwgc3Rkb3V0LCBsaW5lX3Rlcm1pbmF0aW9uKTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJdG9wYXRoW2ldWzBdID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tvdXRfZmlsZShjb25zdCBjaGFyICpuYW1lLCBpbnQgcHJlZml4X2xlbmd0aCkKK3sKKwlpbnQgbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKwlpbnQgcG9zID0gY2FjaGVfbmFtZV9wb3MobmFtZSwgbmFtZWxlbik7CisJaW50IGhhc19zYW1lX25hbWUgPSAwOworCWludCBkaWRfY2hlY2tvdXQgPSAwOworCWludCBlcnJzID0gMDsKKworCWlmIChwb3MgPCAwKQorCQlwb3MgPSAtcG9zIC0gMTsKKworCXdoaWxlIChwb3MgPCBhY3RpdmVfbnIpIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtwb3NdOworCQlpZiAoY2VfbmFtZWxlbihjZSkgIT0gbmFtZWxlbiB8fAorCQkgICAgbWVtY21wKGNlLT5uYW1lLCBuYW1lLCBuYW1lbGVuKSkKKwkJCWJyZWFrOworCQloYXNfc2FtZV9uYW1lID0gMTsKKwkJcG9zKys7CisJCWlmIChjZV9zdGFnZShjZSkgIT0gY2hlY2tvdXRfc3RhZ2UKKwkJICAgICYmIChDSEVDS09VVF9BTEwgIT0gY2hlY2tvdXRfc3RhZ2UgfHwgIWNlX3N0YWdlKGNlKSkpCisJCQljb250aW51ZTsKKwkJZGlkX2NoZWNrb3V0ID0gMTsKKwkJaWYgKGNoZWNrb3V0X2VudHJ5KGNlLCAmc3RhdGUsCisJCSAgICB0b190ZW1wZmlsZSA/IHRvcGF0aFtjZV9zdGFnZShjZSldIDogTlVMTCkgPCAwKQorCQkJZXJycysrOworCX0KKworCWlmIChkaWRfY2hlY2tvdXQpIHsKKwkJaWYgKHRvX3RlbXBmaWxlKQorCQkJd3JpdGVfdGVtcGZpbGVfcmVjb3JkKG5hbWUsIHByZWZpeF9sZW5ndGgpOworCQlyZXR1cm4gZXJycyA+IDAgPyAtMSA6IDA7CisJfQorCisJaWYgKCFzdGF0ZS5xdWlldCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImdpdC1jaGVja291dC1pbmRleDogJXMgIiwgbmFtZSk7CisJCWlmICghaGFzX3NhbWVfbmFtZSkKKwkJCWZwcmludGYoc3RkZXJyLCAiaXMgbm90IGluIHRoZSBjYWNoZSIpOworCQllbHNlIGlmIChjaGVja291dF9zdGFnZSkKKwkJCWZwcmludGYoc3RkZXJyLCAiZG9lcyBub3QgZXhpc3QgYXQgc3RhZ2UgJWQiLAorCQkJCWNoZWNrb3V0X3N0YWdlKTsKKwkJZWxzZQorCQkJZnByaW50ZihzdGRlcnIsICJpcyB1bm1lcmdlZCIpOworCQlmcHV0YygnXG4nLCBzdGRlcnIpOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrb3V0X2FsbChjb25zdCBjaGFyICpwcmVmaXgsIGludCBwcmVmaXhfbGVuZ3RoKQoreworCWludCBpLCBlcnJzID0gMDsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkqIGxhc3RfY2UgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IGFjdGl2ZV9uciA7IGkrKykgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW2ldOworCQlpZiAoY2Vfc3RhZ2UoY2UpICE9IGNoZWNrb3V0X3N0YWdlCisJCSAgICAmJiAoQ0hFQ0tPVVRfQUxMICE9IGNoZWNrb3V0X3N0YWdlIHx8ICFjZV9zdGFnZShjZSkpKQorCQkJY29udGludWU7CisJCWlmIChwcmVmaXggJiYgKnByZWZpeCAmJgorCQkgICAgKGNlX25hbWVsZW4oY2UpIDw9IHByZWZpeF9sZW5ndGggfHwKKwkJICAgICBtZW1jbXAocHJlZml4LCBjZS0+bmFtZSwgcHJlZml4X2xlbmd0aCkpKQorCQkJY29udGludWU7CisJCWlmIChsYXN0X2NlICYmIHRvX3RlbXBmaWxlKSB7CisJCQlpZiAoY2VfbmFtZWxlbihsYXN0X2NlKSAhPSBjZV9uYW1lbGVuKGNlKQorCQkJICAgIHx8IG1lbWNtcChsYXN0X2NlLT5uYW1lLCBjZS0+bmFtZSwgY2VfbmFtZWxlbihjZSkpKQorCQkJCXdyaXRlX3RlbXBmaWxlX3JlY29yZChsYXN0X2NlLT5uYW1lLCBwcmVmaXhfbGVuZ3RoKTsKKwkJfQorCQlpZiAoY2hlY2tvdXRfZW50cnkoY2UsICZzdGF0ZSwKKwkJICAgIHRvX3RlbXBmaWxlID8gdG9wYXRoW2NlX3N0YWdlKGNlKV0gOiBOVUxMKSA8IDApCisJCQllcnJzKys7CisJCWxhc3RfY2UgPSBjZTsKKwl9CisJaWYgKGxhc3RfY2UgJiYgdG9fdGVtcGZpbGUpCisJCXdyaXRlX3RlbXBmaWxlX3JlY29yZChsYXN0X2NlLT5uYW1lLCBwcmVmaXhfbGVuZ3RoKTsKKwlpZiAoZXJycykKKwkJLyogd2UgaGF2ZSBhbHJlYWR5IGRvbmUgb3VyIGVycm9yIHJlcG9ydGluZy4KKwkJICogZXhpdCB3aXRoIHRoZSBzYW1lIGNvZGUgYXMgZGllKCkuCisJCSAqLworCQlleGl0KDEyOCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGNoZWNrb3V0X2NhY2hlX3VzYWdlW10gPQorImdpdC1jaGVja291dC1pbmRleCBbLXVdIFstcV0gWy1hXSBbLWZdIFstbl0gWy0tc3RhZ2U9WzEyM118YWxsXSBbLS1wcmVmaXg9PHN0cmluZz5dIFstLXRlbXBdIFstLV0gPGZpbGU+Li4uIjsKKworc3RhdGljIHN0cnVjdCBsb2NrX2ZpbGUgbG9ja19maWxlOworCitpbnQgY21kX2NoZWNrb3V0X2luZGV4KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBpOworCWludCBuZXdmZCA9IC0xOworCWludCBhbGwgPSAwOworCWludCByZWFkX2Zyb21fc3RkaW4gPSAwOworCWludCBwcmVmaXhfbGVuZ3RoOworCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCXN0YXRlLmJhc2VfZGlyID0gIiI7CisJcHJlZml4X2xlbmd0aCA9IHByZWZpeCA/IHN0cmxlbihwcmVmaXgpIDogMDsKKworCWlmIChyZWFkX2NhY2hlKCkgPCAwKSB7CisJCWRpZSgiaW52YWxpZCBjYWNoZSIpOworCX0KKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoIXN0cmNtcChhcmcsICItLSIpKSB7CisJCQlpKys7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItYSIpIHx8ICFzdHJjbXAoYXJnLCAiLS1hbGwiKSkgeworCQkJYWxsID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1mIikgfHwgIXN0cmNtcChhcmcsICItLWZvcmNlIikpIHsKKwkJCXN0YXRlLmZvcmNlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1xIikgfHwgIXN0cmNtcChhcmcsICItLXF1aWV0IikpIHsKKwkJCXN0YXRlLnF1aWV0ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1uIikgfHwgIXN0cmNtcChhcmcsICItLW5vLWNyZWF0ZSIpKSB7CisJCQlzdGF0ZS5ub3RfbmV3ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi11IikgfHwgIXN0cmNtcChhcmcsICItLWluZGV4IikpIHsKKwkJCXN0YXRlLnJlZnJlc2hfY2FjaGUgPSAxOworCQkJaWYgKG5ld2ZkIDwgMCkKKwkJCQluZXdmZCA9IGhvbGRfbG9ja2VkX2luZGV4KCZsb2NrX2ZpbGUsIDEpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXoiKSkgeworCQkJbGluZV90ZXJtaW5hdGlvbiA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLXN0ZGluIikpIHsKKwkJCWlmIChpICE9IGFyZ2MgLSAxKQorCQkJCWRpZSgiLS1zdGRpbiBtdXN0IGJlIGF0IHRoZSBlbmQiKTsKKwkJCXJlYWRfZnJvbV9zdGRpbiA9IDE7CisJCQlpKys7IC8qIGRvIG5vdCBjb25zaWRlciBhcmcgYXMgYSBmaWxlIG5hbWUgKi8KKwkJCWJyZWFrOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tdGVtcCIpKSB7CisJCQl0b190ZW1wZmlsZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItLXByZWZpeD0iKSkgeworCQkJc3RhdGUuYmFzZV9kaXIgPSBhcmcrOTsKKwkJCXN0YXRlLmJhc2VfZGlyX2xlbiA9IHN0cmxlbihzdGF0ZS5iYXNlX2Rpcik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItLXN0YWdlPSIpKSB7CisJCQlpZiAoIXN0cmNtcChhcmcgKyA4LCAiYWxsIikpIHsKKwkJCQl0b190ZW1wZmlsZSA9IDE7CisJCQkJY2hlY2tvdXRfc3RhZ2UgPSBDSEVDS09VVF9BTEw7CisJCQl9IGVsc2UgeworCQkJCWludCBjaCA9IGFyZ1s4XTsKKwkJCQlpZiAoJzEnIDw9IGNoICYmIGNoIDw9ICczJykKKwkJCQkJY2hlY2tvdXRfc3RhZ2UgPSBhcmdbOF0gLSAnMCc7CisJCQkJZWxzZQorCQkJCQlkaWUoInN0YWdlIHNob3VsZCBiZSBiZXR3ZWVuIDEgYW5kIDMgb3IgYWxsIik7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYXJnWzBdID09ICctJykKKwkJCXVzYWdlKGNoZWNrb3V0X2NhY2hlX3VzYWdlKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHN0YXRlLmJhc2VfZGlyX2xlbiB8fCB0b190ZW1wZmlsZSkgeworCQkvKiB3aGVuIC0tcHJlZml4IGlzIHNwZWNpZmllZCB3ZSBkbyBub3QKKwkJICogd2FudCB0byB1cGRhdGUgY2FjaGUuCisJCSAqLworCQlpZiAoc3RhdGUucmVmcmVzaF9jYWNoZSkgeworCQkJcm9sbGJhY2tfbG9ja19maWxlKCZsb2NrX2ZpbGUpOworCQkJbmV3ZmQgPSAtMTsKKwkJfQorCQlzdGF0ZS5yZWZyZXNoX2NhY2hlID0gMDsKKwl9CisKKwkvKiBDaGVjayBvdXQgbmFtZWQgZmlsZXMgZmlyc3QgKi8KKwlmb3IgKCA7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKwkJY29uc3QgY2hhciAqcDsKKworCQlpZiAoYWxsKQorCQkJZGllKCJnaXQtY2hlY2tvdXQtaW5kZXg6IGRvbid0IG1peCAnLS1hbGwnIGFuZCBleHBsaWNpdCBmaWxlbmFtZXMiKTsKKwkJaWYgKHJlYWRfZnJvbV9zdGRpbikKKwkJCWRpZSgiZ2l0LWNoZWNrb3V0LWluZGV4OiBkb24ndCBtaXggJy0tc3RkaW4nIGFuZCBleHBsaWNpdCBmaWxlbmFtZXMiKTsKKwkJcCA9IHByZWZpeF9wYXRoKHByZWZpeCwgcHJlZml4X2xlbmd0aCwgYXJnKTsKKwkJY2hlY2tvdXRfZmlsZShwLCBwcmVmaXhfbGVuZ3RoKTsKKwkJaWYgKHAgPCBhcmcgfHwgcCA+IGFyZyArIHN0cmxlbihhcmcpKQorCQkJZnJlZSgoY2hhciopcCk7CisJfQorCisJaWYgKHJlYWRfZnJvbV9zdGRpbikgeworCQlzdHJ1Y3Qgc3RyYnVmIGJ1ZiwgbmJ1ZjsKKworCQlpZiAoYWxsKQorCQkJZGllKCJnaXQtY2hlY2tvdXQtaW5kZXg6IGRvbid0IG1peCAnLS1hbGwnIGFuZCAnLS1zdGRpbiciKTsKKworCQlzdHJidWZfaW5pdCgmYnVmLCAwKTsKKwkJc3RyYnVmX2luaXQoJm5idWYsIDApOworCQl3aGlsZSAoc3RyYnVmX2dldGxpbmUoJmJ1Ziwgc3RkaW4sIGxpbmVfdGVybWluYXRpb24pICE9IEVPRikgeworCQkJY29uc3QgY2hhciAqcDsKKwkJCWlmIChsaW5lX3Rlcm1pbmF0aW9uICYmIGJ1Zi5idWZbMF0gPT0gJyInKSB7CisJCQkJc3RyYnVmX3Jlc2V0KCZuYnVmKTsKKwkJCQlpZiAodW5xdW90ZV9jX3N0eWxlKCZuYnVmLCBidWYuYnVmLCBOVUxMKSkKKwkJCQkJZGllKCJsaW5lIGlzIGJhZGx5IHF1b3RlZCIpOworCQkJCXN0cmJ1Zl9zd2FwKCZidWYsICZuYnVmKTsKKwkJCX0KKwkJCXAgPSBwcmVmaXhfcGF0aChwcmVmaXgsIHByZWZpeF9sZW5ndGgsIGJ1Zi5idWYpOworCQkJY2hlY2tvdXRfZmlsZShwLCBwcmVmaXhfbGVuZ3RoKTsKKwkJCWlmIChwIDwgYnVmLmJ1ZiB8fCBwID4gYnVmLmJ1ZiArIGJ1Zi5sZW4pCisJCQkJZnJlZSgoY2hhciAqKXApOworCQl9CisJCXN0cmJ1Zl9yZWxlYXNlKCZuYnVmKTsKKwkJc3RyYnVmX3JlbGVhc2UoJmJ1Zik7CisJfQorCisJaWYgKGFsbCkKKwkJY2hlY2tvdXRfYWxsKHByZWZpeCwgcHJlZml4X2xlbmd0aCk7CisKKwlpZiAoMCA8PSBuZXdmZCAmJgorCSAgICAod3JpdGVfY2FjaGUobmV3ZmQsIGFjdGl2ZV9jYWNoZSwgYWN0aXZlX25yKSB8fAorCSAgICAgY29tbWl0X2xvY2tlZF9pbmRleCgmbG9ja19maWxlKSkpCisJCWRpZSgiVW5hYmxlIHRvIHdyaXRlIG5ldyBpbmRleCBmaWxlIik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWNoZWNrb3V0LmMgYi9idWlsdGluLWNoZWNrb3V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RlYjUwNAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tY2hlY2tvdXQuYwpAQCAtMCwwICsxLDU3NyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgInBhcnNlLW9wdGlvbnMuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorI2luY2x1ZGUgInVucGFjay10cmVlcy5oIgorI2luY2x1ZGUgImRpci5oIgorI2luY2x1ZGUgInJ1bi1jb21tYW5kLmgiCisjaW5jbHVkZSAibWVyZ2UtcmVjdXJzaXZlLmgiCisjaW5jbHVkZSAiYnJhbmNoLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgInJldmlzaW9uLmgiCisjaW5jbHVkZSAicmVtb3RlLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2hlY2tvdXRfdXNhZ2VbXSA9IHsKKwkiZ2l0IGNoZWNrb3V0IFtvcHRpb25zXSA8YnJhbmNoPiIsCisJImdpdCBjaGVja291dCBbb3B0aW9uc10gWzxicmFuY2g+XSAtLSA8ZmlsZT4uLi4iLAorCU5VTEwsCit9OworCitzdGF0aWMgaW50IHBvc3RfY2hlY2tvdXRfaG9vayhzdHJ1Y3QgY29tbWl0ICpvbGQsIHN0cnVjdCBjb21taXQgKm5ldywKKwkJCSAgICAgIGludCBjaGFuZ2VkKQoreworCXN0cnVjdCBjaGlsZF9wcm9jZXNzIHByb2M7CisJY29uc3QgY2hhciAqbmFtZSA9IGdpdF9wYXRoKCJob29rcy9wb3N0LWNoZWNrb3V0Iik7CisJY29uc3QgY2hhciAqYXJndls1XTsKKworCWlmIChhY2Nlc3MobmFtZSwgWF9PSykgPCAwKQorCQlyZXR1cm4gMDsKKworCW1lbXNldCgmcHJvYywgMCwgc2l6ZW9mKHByb2MpKTsKKwlhcmd2WzBdID0gbmFtZTsKKwlhcmd2WzFdID0geHN0cmR1cChzaGExX3RvX2hleChvbGQtPm9iamVjdC5zaGExKSk7CisJYXJndlsyXSA9IHhzdHJkdXAoc2hhMV90b19oZXgobmV3LT5vYmplY3Quc2hhMSkpOworCWFyZ3ZbM10gPSBjaGFuZ2VkID8gIjEiIDogIjAiOworCWFyZ3ZbNF0gPSBOVUxMOworCXByb2MuYXJndiA9IGFyZ3Y7CisJcHJvYy5ub19zdGRpbiA9IDE7CisJcHJvYy5zdGRvdXRfdG9fc3RkZXJyID0gMTsKKwlyZXR1cm4gcnVuX2NvbW1hbmQoJnByb2MpOworfQorCitzdGF0aWMgaW50IHVwZGF0ZV9zb21lKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLAorCQkgICAgICAgY29uc3QgY2hhciAqcGF0aG5hbWUsIHVuc2lnbmVkIG1vZGUsIGludCBzdGFnZSkKK3sKKwlpbnQgbGVuOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisKKwlpZiAoU19JU0dJVExJTksobW9kZSkpCisJCXJldHVybiAwOworCisJaWYgKFNfSVNESVIobW9kZSkpCisJCXJldHVybiBSRUFEX1RSRUVfUkVDVVJTSVZFOworCisJbGVuID0gYmFzZWxlbiArIHN0cmxlbihwYXRobmFtZSk7CisJY2UgPSB4Y2FsbG9jKDEsIGNhY2hlX2VudHJ5X3NpemUobGVuKSk7CisJaGFzaGNweShjZS0+c2hhMSwgc2hhMSk7CisJbWVtY3B5KGNlLT5uYW1lLCBiYXNlLCBiYXNlbGVuKTsKKwltZW1jcHkoY2UtPm5hbWUgKyBiYXNlbGVuLCBwYXRobmFtZSwgbGVuIC0gYmFzZWxlbik7CisJY2UtPmNlX2ZsYWdzID0gY3JlYXRlX2NlX2ZsYWdzKGxlbiwgMCk7CisJY2UtPmNlX21vZGUgPSBjcmVhdGVfY2VfbW9kZShtb2RlKTsKKwlhZGRfY2FjaGVfZW50cnkoY2UsIEFERF9DQUNIRV9PS19UT19BREQgfCBBRERfQ0FDSEVfT0tfVE9fUkVQTEFDRSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF90cmVlX3NvbWUoc3RydWN0IHRyZWUgKnRyZWUsIGNvbnN0IGNoYXIgKipwYXRoc3BlYykKK3sKKwlyZWFkX3RyZWVfcmVjdXJzaXZlKHRyZWUsICIiLCAwLCAwLCBwYXRoc3BlYywgdXBkYXRlX3NvbWUpOworCisJLyogdXBkYXRlIHRoZSBpbmRleCB3aXRoIHRoZSBnaXZlbiB0cmVlJ3MgaW5mbworCSAqIGZvciBhbGwgYXJncywgZXhwYW5kaW5nIHdpbGRjYXJkcywgYW5kIGV4aXQKKwkgKiB3aXRoIGFueSBub24temVybyByZXR1cm4gY29kZS4KKwkgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja291dF9wYXRocyhzdHJ1Y3QgdHJlZSAqc291cmNlX3RyZWUsIGNvbnN0IGNoYXIgKipwYXRoc3BlYykKK3sKKwlpbnQgcG9zOworCXN0cnVjdCBjaGVja291dCBzdGF0ZTsKKwlzdGF0aWMgY2hhciAqcHNfbWF0Y2hlZDsKKwl1bnNpZ25lZCBjaGFyIHJldlsyMF07CisJaW50IGZsYWc7CisJc3RydWN0IGNvbW1pdCAqaGVhZDsKKworCWludCBuZXdmZDsKKwlzdHJ1Y3QgbG9ja19maWxlICpsb2NrX2ZpbGUgPSB4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgbG9ja19maWxlKSk7CisKKwluZXdmZCA9IGhvbGRfbG9ja2VkX2luZGV4KGxvY2tfZmlsZSwgMSk7CisJcmVhZF9jYWNoZSgpOworCisJaWYgKHNvdXJjZV90cmVlKQorCQlyZWFkX3RyZWVfc29tZShzb3VyY2VfdHJlZSwgcGF0aHNwZWMpOworCisJZm9yIChwb3MgPSAwOyBwYXRoc3BlY1twb3NdOyBwb3MrKykKKwkJOworCXBzX21hdGNoZWQgPSB4Y2FsbG9jKDEsIHBvcyk7CisKKwlmb3IgKHBvcyA9IDA7IHBvcyA8IGFjdGl2ZV9ucjsgcG9zKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtwb3NdOworCQlwYXRoc3BlY19tYXRjaChwYXRoc3BlYywgcHNfbWF0Y2hlZCwgY2UtPm5hbWUsIDApOworCX0KKworCWlmIChyZXBvcnRfcGF0aF9lcnJvcihwc19tYXRjaGVkLCBwYXRoc3BlYywgMCkpCisJCXJldHVybiAxOworCisJbWVtc2V0KCZzdGF0ZSwgMCwgc2l6ZW9mKHN0YXRlKSk7CisJc3RhdGUuZm9yY2UgPSAxOworCXN0YXRlLnJlZnJlc2hfY2FjaGUgPSAxOworCWZvciAocG9zID0gMDsgcG9zIDwgYWN0aXZlX25yOyBwb3MrKykgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW3Bvc107CisJCWlmIChwYXRoc3BlY19tYXRjaChwYXRoc3BlYywgTlVMTCwgY2UtPm5hbWUsIDApKSB7CisJCQljaGVja291dF9lbnRyeShjZSwgJnN0YXRlLCBOVUxMKTsKKwkJfQorCX0KKworCWlmICh3cml0ZV9jYWNoZShuZXdmZCwgYWN0aXZlX2NhY2hlLCBhY3RpdmVfbnIpIHx8CisJICAgIGNvbW1pdF9sb2NrZWRfaW5kZXgobG9ja19maWxlKSkKKwkJZGllKCJ1bmFibGUgdG8gd3JpdGUgbmV3IGluZGV4IGZpbGUiKTsKKworCXJlc29sdmVfcmVmKCJIRUFEIiwgcmV2LCAwLCAmZmxhZyk7CisJaGVhZCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlX2dlbnRseShyZXYsIDEpOworCisJcmV0dXJuIHBvc3RfY2hlY2tvdXRfaG9vayhoZWFkLCBoZWFkLCAwKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19sb2NhbF9jaGFuZ2VzKHN0cnVjdCBvYmplY3QgKmhlYWQpCit7CisJc3RydWN0IHJldl9pbmZvIHJldjsKKwkvKiBJIHRoaW5rIHdlIHdhbnQgZnVsbCBwYXRocywgZXZlbiBpZiB3ZSdyZSBpbiBhIHN1YmRpcmVjdG9yeS4gKi8KKwlpbml0X3JldmlzaW9ucygmcmV2LCBOVUxMKTsKKwlyZXYuYWJicmV2ID0gMDsKKwlyZXYuZGlmZm9wdC5vdXRwdXRfZm9ybWF0IHw9IERJRkZfRk9STUFUX05BTUVfU1RBVFVTOworCWFkZF9wZW5kaW5nX29iamVjdCgmcmV2LCBoZWFkLCBOVUxMKTsKKwlydW5fZGlmZl9pbmRleCgmcmV2LCAwKTsKK30KKworc3RhdGljIHZvaWQgZGVzY3JpYmVfZGV0YWNoZWRfaGVhZChjaGFyICptc2csIHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlzdHJ1Y3Qgc3RyYnVmIHNiOworCXN0cmJ1Zl9pbml0KCZzYiwgMCk7CisJcGFyc2VfY29tbWl0KGNvbW1pdCk7CisJcHJldHR5X3ByaW50X2NvbW1pdChDTUlUX0ZNVF9PTkVMSU5FLCBjb21taXQsICZzYiwgMCwgIiIsICIiLCAwLCAwKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzICVzLi4uICVzXG4iLCBtc2csCisJCWZpbmRfdW5pcXVlX2FiYnJldihjb21taXQtPm9iamVjdC5zaGExLCBERUZBVUxUX0FCQlJFViksIHNiLmJ1Zik7CisJc3RyYnVmX3JlbGVhc2UoJnNiKTsKK30KKworc3RhdGljIGludCByZXNldF90b19uZXcoc3RydWN0IHRyZWUgKnRyZWUsIGludCBxdWlldCkKK3sKKwlzdHJ1Y3QgdW5wYWNrX3RyZWVzX29wdGlvbnMgb3B0czsKKwlzdHJ1Y3QgdHJlZV9kZXNjIHRyZWVfZGVzYzsKKworCW1lbXNldCgmb3B0cywgMCwgc2l6ZW9mKG9wdHMpKTsKKwlvcHRzLmhlYWRfaWR4ID0gLTE7CisJb3B0cy51cGRhdGUgPSAxOworCW9wdHMucmVzZXQgPSAxOworCW9wdHMubWVyZ2UgPSAxOworCW9wdHMuZm4gPSBvbmV3YXlfbWVyZ2U7CisJb3B0cy52ZXJib3NlX3VwZGF0ZSA9ICFxdWlldDsKKwlvcHRzLnNyY19pbmRleCA9ICZ0aGVfaW5kZXg7CisJb3B0cy5kc3RfaW5kZXggPSAmdGhlX2luZGV4OworCXBhcnNlX3RyZWUodHJlZSk7CisJaW5pdF90cmVlX2Rlc2MoJnRyZWVfZGVzYywgdHJlZS0+YnVmZmVyLCB0cmVlLT5zaXplKTsKKwlpZiAodW5wYWNrX3RyZWVzKDEsICZ0cmVlX2Rlc2MsICZvcHRzKSkKKwkJcmV0dXJuIDEyODsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfY2xlYW5fdG9fbmV3KHN0cnVjdCB0cmVlICp0cmVlLCBpbnQgcXVpZXQpCit7CisJc3RydWN0IHVucGFja190cmVlc19vcHRpb25zIG9wdHM7CisJc3RydWN0IHRyZWVfZGVzYyB0cmVlX2Rlc2M7CisKKwltZW1zZXQoJm9wdHMsIDAsIHNpemVvZihvcHRzKSk7CisJb3B0cy5oZWFkX2lkeCA9IC0xOworCW9wdHMuc2tpcF91bm1lcmdlZCA9IDE7CisJb3B0cy5yZXNldCA9IDE7CisJb3B0cy5tZXJnZSA9IDE7CisJb3B0cy5mbiA9IG9uZXdheV9tZXJnZTsKKwlvcHRzLnZlcmJvc2VfdXBkYXRlID0gIXF1aWV0OworCW9wdHMuc3JjX2luZGV4ID0gJnRoZV9pbmRleDsKKwlvcHRzLmRzdF9pbmRleCA9ICZ0aGVfaW5kZXg7CisJcGFyc2VfdHJlZSh0cmVlKTsKKwlpbml0X3RyZWVfZGVzYygmdHJlZV9kZXNjLCB0cmVlLT5idWZmZXIsIHRyZWUtPnNpemUpOworCWlmICh1bnBhY2tfdHJlZXMoMSwgJnRyZWVfZGVzYywgJm9wdHMpKQorCQlleGl0KDEyOCk7Cit9CisKK3N0cnVjdCBjaGVja291dF9vcHRzIHsKKwlpbnQgcXVpZXQ7CisJaW50IG1lcmdlOworCWludCBmb3JjZTsKKworCWNoYXIgKm5ld19icmFuY2g7CisJaW50IG5ld19icmFuY2hfbG9nOworCWVudW0gYnJhbmNoX3RyYWNrIHRyYWNrOworfTsKKworc3RydWN0IGJyYW5jaF9pbmZvIHsKKwljb25zdCBjaGFyICpuYW1lOyAvKiBUaGUgc2hvcnQgbmFtZSB1c2VkICovCisJY29uc3QgY2hhciAqcGF0aDsgLyogVGhlIGZ1bGwgbmFtZSBvZiBhIHJlYWwgYnJhbmNoICovCisJc3RydWN0IGNvbW1pdCAqY29tbWl0OyAvKiBUaGUgbmFtZWQgY29tbWl0ICovCit9OworCitzdGF0aWMgdm9pZCBzZXR1cF9icmFuY2hfcGF0aChzdHJ1Y3QgYnJhbmNoX2luZm8gKmJyYW5jaCkKK3sKKwlzdHJ1Y3Qgc3RyYnVmIGJ1ZjsKKwlzdHJidWZfaW5pdCgmYnVmLCAwKTsKKwlzdHJidWZfYWRkc3RyKCZidWYsICJyZWZzL2hlYWRzLyIpOworCXN0cmJ1Zl9hZGRzdHIoJmJ1ZiwgYnJhbmNoLT5uYW1lKTsKKwlicmFuY2gtPnBhdGggPSBzdHJidWZfZGV0YWNoKCZidWYsIE5VTEwpOworfQorCitzdGF0aWMgaW50IG1lcmdlX3dvcmtpbmdfdHJlZShzdHJ1Y3QgY2hlY2tvdXRfb3B0cyAqb3B0cywKKwkJCSAgICAgIHN0cnVjdCBicmFuY2hfaW5mbyAqb2xkLCBzdHJ1Y3QgYnJhbmNoX2luZm8gKm5ldykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBsb2NrX2ZpbGUgKmxvY2tfZmlsZSA9IHhjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBsb2NrX2ZpbGUpKTsKKwlpbnQgbmV3ZmQgPSBob2xkX2xvY2tlZF9pbmRleChsb2NrX2ZpbGUsIDEpOworCXJlYWRfY2FjaGUoKTsKKworCWlmIChvcHRzLT5mb3JjZSkgeworCQlyZXQgPSByZXNldF90b19uZXcobmV3LT5jb21taXQtPnRyZWUsIG9wdHMtPnF1aWV0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJc3RydWN0IHRyZWVfZGVzYyB0cmVlc1syXTsKKwkJc3RydWN0IHRyZWUgKnRyZWU7CisJCXN0cnVjdCB1bnBhY2tfdHJlZXNfb3B0aW9ucyB0b3B0czsKKworCQltZW1zZXQoJnRvcHRzLCAwLCBzaXplb2YodG9wdHMpKTsKKwkJdG9wdHMuaGVhZF9pZHggPSAtMTsKKwkJdG9wdHMuc3JjX2luZGV4ID0gJnRoZV9pbmRleDsKKwkJdG9wdHMuZHN0X2luZGV4ID0gJnRoZV9pbmRleDsKKworCQlyZWZyZXNoX2NhY2hlKFJFRlJFU0hfUVVJRVQpOworCisJCWlmICh1bm1lcmdlZF9jYWNoZSgpKSB7CisJCQllcnJvcigieW91IG5lZWQgdG8gcmVzb2x2ZSB5b3VyIGN1cnJlbnQgaW5kZXggZmlyc3QiKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJLyogMi13YXkgbWVyZ2UgdG8gdGhlIG5ldyBicmFuY2ggKi8KKwkJdG9wdHMudXBkYXRlID0gMTsKKwkJdG9wdHMubWVyZ2UgPSAxOworCQl0b3B0cy5nZW50bHkgPSBvcHRzLT5tZXJnZTsKKwkJdG9wdHMudmVyYm9zZV91cGRhdGUgPSAhb3B0cy0+cXVpZXQ7CisJCXRvcHRzLmZuID0gdHdvd2F5X21lcmdlOworCQl0b3B0cy5kaXIgPSB4Y2FsbG9jKDEsIHNpemVvZigqdG9wdHMuZGlyKSk7CisJCXRvcHRzLmRpci0+c2hvd19pZ25vcmVkID0gMTsKKwkJdG9wdHMuZGlyLT5leGNsdWRlX3Blcl9kaXIgPSAiLmdpdGlnbm9yZSI7CisJCXRyZWUgPSBwYXJzZV90cmVlX2luZGlyZWN0KG9sZC0+Y29tbWl0LT5vYmplY3Quc2hhMSk7CisJCWluaXRfdHJlZV9kZXNjKCZ0cmVlc1swXSwgdHJlZS0+YnVmZmVyLCB0cmVlLT5zaXplKTsKKwkJdHJlZSA9IHBhcnNlX3RyZWVfaW5kaXJlY3QobmV3LT5jb21taXQtPm9iamVjdC5zaGExKTsKKwkJaW5pdF90cmVlX2Rlc2MoJnRyZWVzWzFdLCB0cmVlLT5idWZmZXIsIHRyZWUtPnNpemUpOworCisJCWlmICh1bnBhY2tfdHJlZXMoMiwgdHJlZXMsICZ0b3B0cykpIHsKKwkJCS8qCisJCQkgKiBVbnBhY2sgY291bGRuJ3QgZG8gYSB0cml2aWFsIG1lcmdlOyBlaXRoZXIKKwkJCSAqIGdpdmUgdXAgb3IgZG8gYSByZWFsIG1lcmdlLCBkZXBlbmRpbmcgb24KKwkJCSAqIHdoZXRoZXIgdGhlIG1lcmdlIGZsYWcgd2FzIHVzZWQuCisJCQkgKi8KKwkJCXN0cnVjdCB0cmVlICpyZXN1bHQ7CisJCQlzdHJ1Y3QgdHJlZSAqd29yazsKKwkJCWlmICghb3B0cy0+bWVyZ2UpCisJCQkJcmV0dXJuIDE7CisJCQlwYXJzZV9jb21taXQob2xkLT5jb21taXQpOworCisJCQkvKiBEbyBtb3JlIHJlYWwgbWVyZ2UgKi8KKworCQkJLyoKKwkJCSAqIFdlIHVwZGF0ZSB0aGUgaW5kZXggZnVsbHksIHRoZW4gd3JpdGUgdGhlCisJCQkgKiB0cmVlIGZyb20gdGhlIGluZGV4LCB0aGVuIG1lcmdlIHRoZSBuZXcKKwkJCSAqIGJyYW5jaCB3aXRoIHRoZSBjdXJyZW50IHRyZWUsIHdpdGggdGhlIG9sZAorCQkJICogYnJhbmNoIGFzIHRoZSBiYXNlLiBUaGVuIHdlIHJlc2V0IHRoZSBpbmRleAorCQkJICogKGJ1dCBub3QgdGhlIHdvcmtpbmcgdHJlZSkgdG8gdGhlIG5ldworCQkJICogYnJhbmNoLCBsZWF2aW5nIHRoZSB3b3JraW5nIHRyZWUgYXMgdGhlCisJCQkgKiBtZXJnZWQgdmVyc2lvbiwgYnV0IHNraXBwaW5nIHVubWVyZ2VkCisJCQkgKiBlbnRyaWVzIGluIHRoZSBpbmRleC4KKwkJCSAqLworCisJCQlhZGRfZmlsZXNfdG9fY2FjaGUoMCwgTlVMTCwgTlVMTCk7CisJCQl3b3JrID0gd3JpdGVfdHJlZV9mcm9tX21lbW9yeSgpOworCisJCQlyZXQgPSByZXNldF90b19uZXcobmV3LT5jb21taXQtPnRyZWUsIG9wdHMtPnF1aWV0KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJCW1lcmdlX3RyZWVzKG5ldy0+Y29tbWl0LT50cmVlLCB3b3JrLCBvbGQtPmNvbW1pdC0+dHJlZSwKKwkJCQkgICAgbmV3LT5uYW1lLCAibG9jYWwiLCAmcmVzdWx0KTsKKwkJCXJlc2V0X2NsZWFuX3RvX25ldyhuZXctPmNvbW1pdC0+dHJlZSwgb3B0cy0+cXVpZXQpOworCQl9CisJfQorCisJaWYgKHdyaXRlX2NhY2hlKG5ld2ZkLCBhY3RpdmVfY2FjaGUsIGFjdGl2ZV9ucikgfHwKKwkgICAgY29tbWl0X2xvY2tlZF9pbmRleChsb2NrX2ZpbGUpKQorCQlkaWUoInVuYWJsZSB0byB3cml0ZSBuZXcgaW5kZXggZmlsZSIpOworCisJaWYgKCFvcHRzLT5mb3JjZSkKKwkJc2hvd19sb2NhbF9jaGFuZ2VzKCZuZXctPmNvbW1pdC0+b2JqZWN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZXBvcnRfdHJhY2tpbmcoc3RydWN0IGJyYW5jaF9pbmZvICpuZXcsIHN0cnVjdCBjaGVja291dF9vcHRzICpvcHRzKQoreworCS8qCisJICogV2UgaGF2ZSBzd2l0Y2hlZCB0byBhIG5ldyBicmFuY2g7IGlzIGl0IGJ1aWxkaW5nIG9uCisJICogdG9wIG9mIGFub3RoZXIgYnJhbmNoLCBhbmQgaWYgc28gZG9lcyB0aGF0IG90aGVyIGJyYW5jaAorCSAqIGhhdmUgY2hhbmdlcyB3ZSBkbyBub3QgaGF2ZSB5ZXQ/CisJICovCisJY2hhciAqYmFzZTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXN0cnVjdCBjb21taXQgKm91cnMsICp0aGVpcnM7CisJY2hhciBzeW1tZXRyaWNbODRdOworCXN0cnVjdCByZXZfaW5mbyByZXZzOworCWNvbnN0IGNoYXIgKnJldl9hcmd2WzEwXTsKKwlpbnQgcmV2X2FyZ2M7CisJaW50IG51bV9vdXJzLCBudW1fdGhlaXJzOworCWNvbnN0IGNoYXIgKnJlbW90ZV9tc2c7CisJc3RydWN0IGJyYW5jaCAqYnJhbmNoID0gYnJhbmNoX2dldChuZXctPm5hbWUpOworCisJLyoKKwkgKiBOb3RoaW5nIHRvIHJlcG9ydCB1bmxlc3Mgd2UgYXJlIG1hcmtlZCB0byBidWlsZCBvbiB0b3Agb2YKKwkgKiBzb21lYm9keSBlbHNlLgorCSAqLworCWlmICghYnJhbmNoIHx8ICFicmFuY2gtPm1lcmdlIHx8ICFicmFuY2gtPm1lcmdlWzBdIHx8ICFicmFuY2gtPm1lcmdlWzBdLT5kc3QpCisJCXJldHVybjsKKworCS8qCisJICogSWYgd2hhdCB3ZSB1c2VkIHRvIGJ1aWxkIG9uIG5vIGxvbmdlciBleGlzdHMsIHRoZXJlIGlzCisJICogbm90aGluZyB0byByZXBvcnQuCisJICovCisJYmFzZSA9IGJyYW5jaC0+bWVyZ2VbMF0tPmRzdDsKKwlpZiAoIXJlc29sdmVfcmVmKGJhc2UsIHNoYTEsIDEsIE5VTEwpKQorCQlyZXR1cm47CisKKwl0aGVpcnMgPSBsb29rdXBfY29tbWl0KHNoYTEpOworCW91cnMgPSBuZXctPmNvbW1pdDsKKwlpZiAoIWhhc2hjbXAoc2hhMSwgb3Vycy0+b2JqZWN0LnNoYTEpKQorCQlyZXR1cm47IC8qIHdlIGFyZSB0aGUgc2FtZSAqLworCisJLyogUnVuICJyZXYtbGlzdCAtLWxlZnQtcmlnaHQgb3Vycy4uLnRoZWlycyIgaW50ZXJuYWxseS4uLiAqLworCXJldl9hcmdjID0gMDsKKwlyZXZfYXJndltyZXZfYXJnYysrXSA9IE5VTEw7CisJcmV2X2FyZ3ZbcmV2X2FyZ2MrK10gPSAiLS1sZWZ0LXJpZ2h0IjsKKwlyZXZfYXJndltyZXZfYXJnYysrXSA9IHN5bW1ldHJpYzsKKwlyZXZfYXJndltyZXZfYXJnYysrXSA9ICItLSI7CisJcmV2X2FyZ3ZbcmV2X2FyZ2NdID0gTlVMTDsKKworCXN0cmNweShzeW1tZXRyaWMsIHNoYTFfdG9faGV4KG91cnMtPm9iamVjdC5zaGExKSk7CisJc3RyY3B5KHN5bW1ldHJpYyArIDQwLCAiLi4uIik7CisJc3RyY3B5KHN5bW1ldHJpYyArIDQzLCBzaGExX3RvX2hleCh0aGVpcnMtPm9iamVjdC5zaGExKSk7CisKKwlpbml0X3JldmlzaW9ucygmcmV2cywgTlVMTCk7CisJc2V0dXBfcmV2aXNpb25zKHJldl9hcmdjLCByZXZfYXJndiwgJnJldnMsIE5VTEwpOworCXByZXBhcmVfcmV2aXNpb25fd2FsaygmcmV2cyk7CisKKwkvKiAuLi4gYW5kIGNvdW50IHRoZSBjb21taXRzIG9uIGVhY2ggc2lkZS4gKi8KKwludW1fb3VycyA9IDA7CisJbnVtX3RoZWlycyA9IDA7CisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IGNvbW1pdCAqYyA9IGdldF9yZXZpc2lvbigmcmV2cyk7CisJCWlmICghYykKKwkJCWJyZWFrOworCQlpZiAoYy0+b2JqZWN0LmZsYWdzICYgU1lNTUVUUklDX0xFRlQpCisJCQludW1fb3VycysrOworCQllbHNlCisJCQludW1fdGhlaXJzKys7CisJfQorCisJaWYgKCFwcmVmaXhjbXAoYmFzZSwgInJlZnMvcmVtb3Rlcy8iKSkgeworCQlyZW1vdGVfbXNnID0gIiByZW1vdGUiOworCQliYXNlICs9IHN0cmxlbigicmVmcy9yZW1vdGVzLyIpOworCX0gZWxzZSB7CisJCXJlbW90ZV9tc2cgPSAiIjsKKwl9CisKKwlpZiAoIW51bV90aGVpcnMpCisJCXByaW50ZigiWW91ciBicmFuY2ggaXMgYWhlYWQgb2YgdGhlIHRyYWNrZWQlcyBicmFuY2ggJyVzJyAiCisJCSAgICAgICAiYnkgJWQgY29tbWl0JXMuXG4iLAorCQkgICAgICAgcmVtb3RlX21zZywgYmFzZSwKKwkJICAgICAgIG51bV9vdXJzLCAobnVtX291cnMgPT0gMSkgPyAiIiA6ICJzIik7CisJZWxzZSBpZiAoIW51bV9vdXJzKQorCQlwcmludGYoIllvdXIgYnJhbmNoIGlzIGJlaGluZCB0aGUgdHJhY2tlZCVzIGJyYW5jaCAnJXMnICIKKwkJICAgICAgICJieSAlZCBjb21taXQlcyxcbiIKKwkJICAgICAgICJhbmQgY2FuIGJlIGZhc3QtZm9yd2FyZGVkLlxuIiwKKwkJICAgICAgIHJlbW90ZV9tc2csIGJhc2UsCisJCSAgICAgICBudW1fdGhlaXJzLCAobnVtX3RoZWlycyA9PSAxKSA/ICIiIDogInMiKTsKKwllbHNlCisJCXByaW50ZigiWW91ciBicmFuY2ggYW5kIHRoZSB0cmFja2VkJXMgYnJhbmNoICclcycgIgorCQkgICAgICAgImhhdmUgZGl2ZXJnZWQsXG5hbmQgcmVzcGVjdGl2ZWx5ICIKKwkJICAgICAgICJoYXZlICVkIGFuZCAlZCBkaWZmZXJlbnQgY29tbWl0KHMpIGVhY2guXG4iLAorCQkgICAgICAgcmVtb3RlX21zZywgYmFzZSwKKwkJICAgICAgIG51bV9vdXJzLCBudW1fdGhlaXJzKTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX3JlZnNfZm9yX3N3aXRjaChzdHJ1Y3QgY2hlY2tvdXRfb3B0cyAqb3B0cywKKwkJCQkgICBzdHJ1Y3QgYnJhbmNoX2luZm8gKm9sZCwKKwkJCQkgICBzdHJ1Y3QgYnJhbmNoX2luZm8gKm5ldykKK3sKKwlzdHJ1Y3Qgc3RyYnVmIG1zZzsKKwljb25zdCBjaGFyICpvbGRfZGVzYzsKKwlpZiAob3B0cy0+bmV3X2JyYW5jaCkgeworCQljcmVhdGVfYnJhbmNoKG9sZC0+bmFtZSwgb3B0cy0+bmV3X2JyYW5jaCwgbmV3LT5uYW1lLCAwLAorCQkJICAgICAgb3B0cy0+bmV3X2JyYW5jaF9sb2csIG9wdHMtPnRyYWNrKTsKKwkJbmV3LT5uYW1lID0gb3B0cy0+bmV3X2JyYW5jaDsKKwkJc2V0dXBfYnJhbmNoX3BhdGgobmV3KTsKKwl9CisKKwlzdHJidWZfaW5pdCgmbXNnLCAwKTsKKwlvbGRfZGVzYyA9IG9sZC0+bmFtZTsKKwlpZiAoIW9sZF9kZXNjKQorCQlvbGRfZGVzYyA9IHNoYTFfdG9faGV4KG9sZC0+Y29tbWl0LT5vYmplY3Quc2hhMSk7CisJc3RyYnVmX2FkZGYoJm1zZywgImNoZWNrb3V0OiBtb3ZpbmcgZnJvbSAlcyB0byAlcyIsCisJCSAgICBvbGRfZGVzYywgbmV3LT5uYW1lKTsKKworCWlmIChuZXctPnBhdGgpIHsKKwkJY3JlYXRlX3N5bXJlZigiSEVBRCIsIG5ldy0+cGF0aCwgbXNnLmJ1Zik7CisJCWlmICghb3B0cy0+cXVpZXQpIHsKKwkJCWlmIChvbGQtPnBhdGggJiYgIXN0cmNtcChuZXctPnBhdGgsIG9sZC0+cGF0aCkpCisJCQkJZnByaW50ZihzdGRlcnIsICJBbHJlYWR5IG9uIFwiJXNcIlxuIiwKKwkJCQkJbmV3LT5uYW1lKTsKKwkJCWVsc2UKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVkIHRvJXMgYnJhbmNoIFwiJXNcIlxuIiwKKwkJCQkJb3B0cy0+bmV3X2JyYW5jaCA/ICIgYSBuZXciIDogIiIsCisJCQkJCW5ldy0+bmFtZSk7CisJCX0KKwl9IGVsc2UgaWYgKHN0cmNtcChuZXctPm5hbWUsICJIRUFEIikpIHsKKwkJdXBkYXRlX3JlZihtc2cuYnVmLCAiSEVBRCIsIG5ldy0+Y29tbWl0LT5vYmplY3Quc2hhMSwgTlVMTCwKKwkJCSAgIFJFRl9OT0RFUkVGLCBESUVfT05fRVJSKTsKKwkJaWYgKCFvcHRzLT5xdWlldCkgeworCQkJaWYgKG9sZC0+cGF0aCkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIk5vdGU6IG1vdmluZyB0byBcIiVzXCIgd2hpY2ggaXNuJ3QgYSBsb2NhbCBicmFuY2hcbklmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBicmFuY2ggZnJvbSB0aGlzIGNoZWNrb3V0LCB5b3UgbWF5IGRvIHNvXG4obm93IG9yIGxhdGVyKSBieSB1c2luZyAtYiB3aXRoIHRoZSBjaGVja291dCBjb21tYW5kIGFnYWluLiBFeGFtcGxlOlxuICBnaXQgY2hlY2tvdXQgLWIgPG5ld19icmFuY2hfbmFtZT5cbiIsIG5ldy0+bmFtZSk7CisJCQlkZXNjcmliZV9kZXRhY2hlZF9oZWFkKCJIRUFEIGlzIG5vdyBhdCIsIG5ldy0+Y29tbWl0KTsKKwkJfQorCX0KKwlyZW1vdmVfYnJhbmNoX3N0YXRlKCk7CisJc3RyYnVmX3JlbGVhc2UoJm1zZyk7CisJaWYgKCFvcHRzLT5xdWlldCAmJiAobmV3LT5wYXRoIHx8ICFzdHJjbXAobmV3LT5uYW1lLCAiSEVBRCIpKSkKKwkJcmVwb3J0X3RyYWNraW5nKG5ldywgb3B0cyk7Cit9CisKK3N0YXRpYyBpbnQgc3dpdGNoX2JyYW5jaGVzKHN0cnVjdCBjaGVja291dF9vcHRzICpvcHRzLCBzdHJ1Y3QgYnJhbmNoX2luZm8gKm5ldykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYnJhbmNoX2luZm8gb2xkOworCXVuc2lnbmVkIGNoYXIgcmV2WzIwXTsKKwlpbnQgZmxhZzsKKwltZW1zZXQoJm9sZCwgMCwgc2l6ZW9mKG9sZCkpOworCW9sZC5wYXRoID0gcmVzb2x2ZV9yZWYoIkhFQUQiLCByZXYsIDAsICZmbGFnKTsKKwlvbGQuY29tbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2VfZ2VudGx5KHJldiwgMSk7CisJaWYgKCEoZmxhZyAmIFJFRl9JU1NZTVJFRikpCisJCW9sZC5wYXRoID0gTlVMTDsKKworCWlmIChvbGQucGF0aCAmJiAhcHJlZml4Y21wKG9sZC5wYXRoLCAicmVmcy9oZWFkcy8iKSkKKwkJb2xkLm5hbWUgPSBvbGQucGF0aCArIHN0cmxlbigicmVmcy9oZWFkcy8iKTsKKworCWlmICghbmV3LT5uYW1lKSB7CisJCW5ldy0+bmFtZSA9ICJIRUFEIjsKKwkJbmV3LT5jb21taXQgPSBvbGQuY29tbWl0OworCQlpZiAoIW5ldy0+Y29tbWl0KQorCQkJZGllKCJZb3UgYXJlIG9uIGEgYnJhbmNoIHlldCB0byBiZSBib3JuIik7CisJCXBhcnNlX2NvbW1pdChuZXctPmNvbW1pdCk7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgbmV3IHRoaW5nIGlzbid0IGEgYnJhbmNoIGFuZCBpc24ndCBIRUFEIGFuZCB3ZSdyZQorCSAqIG5vdCBzdGFydGluZyBhIG5ldyBicmFuY2gsIGFuZCB3ZSB3YW50IG1lc3NhZ2VzLCBhbmQgd2UKKwkgKiB3ZXJlbid0IG9uIGEgYnJhbmNoLCBhbmQgd2UncmUgbW92aW5nIHRvIGEgbmV3IGNvbW1pdCwKKwkgKiBkZXNjcmliZSB0aGUgb2xkIGNvbW1pdC4KKwkgKi8KKwlpZiAoIW5ldy0+cGF0aCAmJiBzdHJjbXAobmV3LT5uYW1lLCAiSEVBRCIpICYmICFvcHRzLT5uZXdfYnJhbmNoICYmCisJICAgICFvcHRzLT5xdWlldCAmJiAhb2xkLnBhdGggJiYgbmV3LT5jb21taXQgIT0gb2xkLmNvbW1pdCkKKwkJZGVzY3JpYmVfZGV0YWNoZWRfaGVhZCgiUHJldmlvdXMgSEVBRCBwb3NpdGlvbiB3YXMiLCBvbGQuY29tbWl0KTsKKworCWlmICghb2xkLmNvbW1pdCkgeworCQlpZiAoIW9wdHMtPnF1aWV0KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6IFlvdSBhcHBlYXIgdG8gYmUgb24gYSBicmFuY2ggeWV0IHRvIGJlIGJvcm4uXG4iKTsKKwkJCWZwcmludGYoc3RkZXJyLCAid2FybmluZzogRm9yY2luZyBjaGVja291dCBvZiAlcy5cbiIsIG5ldy0+bmFtZSk7CisJCX0KKwkJb3B0cy0+Zm9yY2UgPSAxOworCX0KKworCXJldCA9IG1lcmdlX3dvcmtpbmdfdHJlZShvcHRzLCAmb2xkLCBuZXcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl1cGRhdGVfcmVmc19mb3Jfc3dpdGNoKG9wdHMsICZvbGQsIG5ldyk7CisKKwlyZXR1cm4gcG9zdF9jaGVja291dF9ob29rKG9sZC5jb21taXQsIG5ldy0+Y29tbWl0LCAxKTsKK30KKworaW50IGNtZF9jaGVja291dChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgY2hlY2tvdXRfb3B0cyBvcHRzOworCXVuc2lnbmVkIGNoYXIgcmV2WzIwXTsKKwljb25zdCBjaGFyICphcmc7CisJc3RydWN0IGJyYW5jaF9pbmZvIG5ldzsKKwlzdHJ1Y3QgdHJlZSAqc291cmNlX3RyZWUgPSBOVUxMOworCXN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0geworCQlPUFRfX1FVSUVUKCZvcHRzLnF1aWV0KSwKKwkJT1BUX1NUUklORygnYicsIE5VTEwsICZvcHRzLm5ld19icmFuY2gsICJuZXcgYnJhbmNoIiwgImJyYW5jaCIpLAorCQlPUFRfQk9PTEVBTignbCcsIE5VTEwsICZvcHRzLm5ld19icmFuY2hfbG9nLCAibG9nIGZvciBuZXcgYnJhbmNoIiksCisJCU9QVF9TRVRfSU5UKCAwICwgInRyYWNrIiwgICZvcHRzLnRyYWNrLCAidHJhY2siLAorCQkJQlJBTkNIX1RSQUNLX0VYUExJQ0lUKSwKKwkJT1BUX0JPT0xFQU4oJ2YnLCBOVUxMLCAmb3B0cy5mb3JjZSwgImZvcmNlIiksCisJCU9QVF9CT09MRUFOKCdtJywgTlVMTCwgJm9wdHMubWVyZ2UsICJtZXJnZSIpLAorCQlPUFRfRU5EKCksCisJfTsKKworCW1lbXNldCgmb3B0cywgMCwgc2l6ZW9mKG9wdHMpKTsKKwltZW1zZXQoJm5ldywgMCwgc2l6ZW9mKG5ldykpOworCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJb3B0cy50cmFjayA9IGdpdF9icmFuY2hfdHJhY2s7CisKKwlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBvcHRpb25zLCBjaGVja291dF91c2FnZSwgMCk7CisJaWYgKGFyZ2MpIHsKKwkJYXJnID0gYXJndlswXTsKKwkJaWYgKGdldF9zaGExKGFyZywgcmV2KSkKKwkJCTsKKwkJZWxzZSBpZiAoKG5ldy5jb21taXQgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZV9nZW50bHkocmV2LCAxKSkpIHsKKwkJCW5ldy5uYW1lID0gYXJnOworCQkJc2V0dXBfYnJhbmNoX3BhdGgoJm5ldyk7CisJCQlpZiAocmVzb2x2ZV9yZWYobmV3LnBhdGgsIHJldiwgMSwgTlVMTCkpCisJCQkJbmV3LmNvbW1pdCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKHJldik7CisJCQllbHNlCisJCQkJbmV3LnBhdGggPSBOVUxMOworCQkJcGFyc2VfY29tbWl0KG5ldy5jb21taXQpOworCQkJc291cmNlX3RyZWUgPSBuZXcuY29tbWl0LT50cmVlOworCQkJYXJndisrOworCQkJYXJnYy0tOworCQl9IGVsc2UgaWYgKChzb3VyY2VfdHJlZSA9IHBhcnNlX3RyZWVfaW5kaXJlY3QocmV2KSkpIHsKKwkJCWFyZ3YrKzsKKwkJCWFyZ2MtLTsKKwkJfQorCX0KKworCWlmIChhcmdjICYmICFzdHJjbXAoYXJndlswXSwgIi0tIikpIHsKKwkJYXJndisrOworCQlhcmdjLS07CisJfQorCisJaWYgKCFvcHRzLm5ld19icmFuY2ggJiYgKG9wdHMudHJhY2sgIT0gZ2l0X2JyYW5jaF90cmFjaykpCisJCWRpZSgiZ2l0IGNoZWNrb3V0OiAtLXRyYWNrIGFuZCAtLW5vLXRyYWNrIHJlcXVpcmUgLWIiKTsKKworCWlmIChvcHRzLmZvcmNlICYmIG9wdHMubWVyZ2UpCisJCWRpZSgiZ2l0IGNoZWNrb3V0OiAtZiBhbmQgLW0gYXJlIGluY29tcGF0aWJsZSIpOworCisJaWYgKGFyZ2MpIHsKKwkJY29uc3QgY2hhciAqKnBhdGhzcGVjID0gZ2V0X3BhdGhzcGVjKHByZWZpeCwgYXJndik7CisKKwkJaWYgKCFwYXRoc3BlYykKKwkJCWRpZSgiaW52YWxpZCBwYXRoIHNwZWNpZmljYXRpb24iKTsKKworCQkvKiBDaGVja291dCBwYXRocyAqLworCQlpZiAob3B0cy5uZXdfYnJhbmNoIHx8IG9wdHMuZm9yY2UgfHwgb3B0cy5tZXJnZSkgeworCQkJaWYgKGFyZ2MgPT0gMSkgeworCQkJCWRpZSgiZ2l0IGNoZWNrb3V0OiB1cGRhdGluZyBwYXRocyBpcyBpbmNvbXBhdGlibGUgd2l0aCBzd2l0Y2hpbmcgYnJhbmNoZXMvZm9yY2luZ1xuRGlkIHlvdSBpbnRlbmQgdG8gY2hlY2tvdXQgJyVzJyB3aGljaCBjYW4gbm90IGJlIHJlc29sdmVkIGFzIGNvbW1pdD8iLCBhcmd2WzBdKTsKKwkJCX0gZWxzZSB7CisJCQkJZGllKCJnaXQgY2hlY2tvdXQ6IHVwZGF0aW5nIHBhdGhzIGlzIGluY29tcGF0aWJsZSB3aXRoIHN3aXRjaGluZyBicmFuY2hlcy9mb3JjaW5nIik7CisJCQl9CisJCX0KKworCQlyZXR1cm4gY2hlY2tvdXRfcGF0aHMoc291cmNlX3RyZWUsIHBhdGhzcGVjKTsKKwl9CisKKwlpZiAobmV3Lm5hbWUgJiYgIW5ldy5jb21taXQpIHsKKwkJZGllKCJDYW5ub3Qgc3dpdGNoIGJyYW5jaCB0byBhIG5vbi1jb21taXQuIik7CisJfQorCisJcmV0dXJuIHN3aXRjaF9icmFuY2hlcygmb3B0cywgJm5ldyk7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWNsZWFuLmMgYi9idWlsdGluLWNsZWFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVmZWMzMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tY2xlYW4uYwpAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqICJnaXQgY2xlYW4iIGJ1aWx0aW4gY29tbWFuZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTaGF3biBCb2hyZXIKKyAqCisgKiBCYXNlZCBvbiBnaXQtY2xlYW4uc2ggYnkgUGF2ZWwgUm9za2luCisgKi8KKworI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImRpci5oIgorI2luY2x1ZGUgInBhcnNlLW9wdGlvbnMuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorCitzdGF0aWMgaW50IGZvcmNlID0gLTE7IC8qIHVuc2V0ICovCisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBidWlsdGluX2NsZWFuX3VzYWdlW10gPSB7CisJImdpdC1jbGVhbiBbLWRdIFstZl0gWy1uXSBbLXFdIFsteCB8IC1YXSBbLS1dIDxwYXRocz4uLi4iLAorCU5VTEwKK307CisKK3N0YXRpYyBpbnQgZ2l0X2NsZWFuX2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICghc3RyY21wKHZhciwgImNsZWFuLnJlcXVpcmVmb3JjZSIpKQorCQlmb3JjZSA9ICFnaXRfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSk7CisJcmV0dXJuIGdpdF9kZWZhdWx0X2NvbmZpZyh2YXIsIHZhbHVlKTsKK30KKworaW50IGNtZF9jbGVhbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaTsKKwlpbnQgc2hvd19vbmx5ID0gMCwgcmVtb3ZlX2RpcmVjdG9yaWVzID0gMCwgcXVpZXQgPSAwLCBpZ25vcmVkID0gMDsKKwlpbnQgaWdub3JlZF9vbmx5ID0gMCwgYmFzZWxlbiA9IDAsIGNvbmZpZ19zZXQgPSAwLCBlcnJvcnMgPSAwOworCXN0cnVjdCBzdHJidWYgZGlyZWN0b3J5OworCXN0cnVjdCBkaXJfc3RydWN0IGRpcjsKKwljb25zdCBjaGFyICpwYXRoLCAqYmFzZTsKKwlzdGF0aWMgY29uc3QgY2hhciAqKnBhdGhzcGVjOworCXN0cnVjdCBzdHJidWYgYnVmOworCWNvbnN0IGNoYXIgKnFuYW1lOworCWNoYXIgKnNlZW4gPSBOVUxMOworCXN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0geworCQlPUFRfX1FVSUVUKCZxdWlldCksCisJCU9QVF9fRFJZX1JVTigmc2hvd19vbmx5KSwKKwkJT1BUX0JPT0xFQU4oJ2YnLCBOVUxMLCAmZm9yY2UsICJmb3JjZSIpLAorCQlPUFRfQk9PTEVBTignZCcsIE5VTEwsICZyZW1vdmVfZGlyZWN0b3JpZXMsCisJCQkJInJlbW92ZSB3aG9sZSBkaXJlY3RvcmllcyIpLAorCQlPUFRfQk9PTEVBTigneCcsIE5VTEwsICZpZ25vcmVkLCAicmVtb3ZlIGlnbm9yZWQgZmlsZXMsIHRvbyIpLAorCQlPUFRfQk9PTEVBTignWCcsIE5VTEwsICZpZ25vcmVkX29ubHksCisJCQkJInJlbW92ZSBvbmx5IGlnbm9yZWQgZmlsZXMiKSwKKwkJT1BUX0VORCgpCisJfTsKKworCWdpdF9jb25maWcoZ2l0X2NsZWFuX2NvbmZpZyk7CisJaWYgKGZvcmNlIDwgMCkKKwkJZm9yY2UgPSAwOworCWVsc2UKKwkJY29uZmlnX3NldCA9IDE7CisKKwlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBvcHRpb25zLCBidWlsdGluX2NsZWFuX3VzYWdlLCAwKTsKKworCXN0cmJ1Zl9pbml0KCZidWYsIDApOworCW1lbXNldCgmZGlyLCAwLCBzaXplb2YoZGlyKSk7CisJaWYgKGlnbm9yZWRfb25seSkKKwkJZGlyLnNob3dfaWdub3JlZCA9IDE7CisKKwlpZiAoaWdub3JlZCAmJiBpZ25vcmVkX29ubHkpCisJCWRpZSgiLXggYW5kIC1YIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyIik7CisKKwlpZiAoIXNob3dfb25seSAmJiAhZm9yY2UpCisJCWRpZSgiY2xlYW4ucmVxdWlyZUZvcmNlJXMgc2V0IGFuZCAtbiBvciAtZiBub3QgZ2l2ZW47ICIKKwkJICAgICJyZWZ1c2luZyB0byBjbGVhbiIsIGNvbmZpZ19zZXQgPyAiIiA6ICIgbm90Iik7CisKKwlkaXIuc2hvd19vdGhlcl9kaXJlY3RvcmllcyA9IDE7CisKKwlpZiAoIWlnbm9yZWQpCisJCXNldHVwX3N0YW5kYXJkX2V4Y2x1ZGVzKCZkaXIpOworCisJcGF0aHNwZWMgPSBnZXRfcGF0aHNwZWMocHJlZml4LCBhcmd2KTsKKwlyZWFkX2NhY2hlKCk7CisKKwkvKgorCSAqIENhbGN1bGF0ZSBjb21tb24gcHJlZml4IGZvciB0aGUgcGF0aHNwZWMsIGFuZAorCSAqIHVzZSB0aGF0IHRvIG9wdGltaXplIHRoZSBkaXJlY3Rvcnkgd2FsaworCSAqLworCWJhc2VsZW4gPSBjb21tb25fcHJlZml4KHBhdGhzcGVjKTsKKwlwYXRoID0gIi4iOworCWJhc2UgPSAiIjsKKwlpZiAoYmFzZWxlbikKKwkJcGF0aCA9IGJhc2UgPSB4bWVtZHVweigqcGF0aHNwZWMsIGJhc2VsZW4pOworCXJlYWRfZGlyZWN0b3J5KCZkaXIsIHBhdGgsIGJhc2UsIGJhc2VsZW4sIHBhdGhzcGVjKTsKKwlzdHJidWZfaW5pdCgmZGlyZWN0b3J5LCAwKTsKKworCWlmIChwYXRoc3BlYykKKwkJc2VlbiA9IHhtYWxsb2MoYXJnYyA+IDAgPyBhcmdjIDogMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGlyLm5yOyBpKyspIHsKKwkJc3RydWN0IGRpcl9lbnRyeSAqZW50ID0gZGlyLmVudHJpZXNbaV07CisJCWludCBsZW4sIHBvcywgbWF0Y2hlczsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZTsKKwkJc3RydWN0IHN0YXQgc3Q7CisKKwkJLyoKKwkJICogUmVtb3ZlIHRoZSAnLycgYXQgdGhlIGVuZCB0aGF0IGRpcmVjdG9yeQorCQkgKiB3YWxraW5nIGFkZHMgZm9yIGRpcmVjdG9yeSBlbnRyaWVzLgorCQkgKi8KKwkJbGVuID0gZW50LT5sZW47CisJCWlmIChsZW4gJiYgZW50LT5uYW1lW2xlbi0xXSA9PSAnLycpCisJCQlsZW4tLTsKKwkJcG9zID0gY2FjaGVfbmFtZV9wb3MoZW50LT5uYW1lLCBsZW4pOworCQlpZiAoMCA8PSBwb3MpCisJCQljb250aW51ZTsJLyogZXhhY3QgbWF0Y2ggKi8KKwkJcG9zID0gLXBvcyAtIDE7CisJCWlmIChwb3MgPCBhY3RpdmVfbnIpIHsKKwkJCWNlID0gYWN0aXZlX2NhY2hlW3Bvc107CisJCQlpZiAoY2VfbmFtZWxlbihjZSkgPT0gbGVuICYmCisJCQkgICAgIW1lbWNtcChjZS0+bmFtZSwgZW50LT5uYW1lLCBsZW4pKQorCQkJCWNvbnRpbnVlOyAvKiBZdXAsIHRoaXMgb25lIGV4aXN0cyB1bm1lcmdlZCAqLworCQl9CisKKwkJLyoKKwkJICogd2UgbWlnaHQgaGF2ZSByZW1vdmVkIHRoaXMgYXMgcGFydCBvZiBlYXJsaWVyCisJCSAqIHJlY3Vyc2l2ZSBkaXJlY3RvcnkgcmVtb3ZhbCwgc28gbHN0YXQoKSBoZXJlIGNvdWxkCisJCSAqIGZhaWwgd2l0aCBFTk9FTlQuCisJCSAqLworCQlpZiAobHN0YXQoZW50LT5uYW1lLCAmc3QpKQorCQkJY29udGludWU7CisKKwkJaWYgKHBhdGhzcGVjKSB7CisJCQltZW1zZXQoc2VlbiwgMCwgYXJnYyA+IDAgPyBhcmdjIDogMSk7CisJCQltYXRjaGVzID0gbWF0Y2hfcGF0aHNwZWMocGF0aHNwZWMsIGVudC0+bmFtZSwgZW50LT5sZW4sCisJCQkJCQkgYmFzZWxlbiwgc2Vlbik7CisJCX0gZWxzZSB7CisJCQltYXRjaGVzID0gMDsKKwkJfQorCisJCWlmIChTX0lTRElSKHN0LnN0X21vZGUpKSB7CisJCQlzdHJidWZfYWRkc3RyKCZkaXJlY3RvcnksIGVudC0+bmFtZSk7CisJCQlxbmFtZSA9IHF1b3RlX3BhdGhfcmVsYXRpdmUoZGlyZWN0b3J5LmJ1ZiwgZGlyZWN0b3J5LmxlbiwgJmJ1ZiwgcHJlZml4KTsKKwkJCWlmIChzaG93X29ubHkgJiYgKHJlbW92ZV9kaXJlY3RvcmllcyB8fCBtYXRjaGVzKSkgeworCQkJCXByaW50ZigiV291bGQgcmVtb3ZlICVzXG4iLCBxbmFtZSk7CisJCQl9IGVsc2UgaWYgKHJlbW92ZV9kaXJlY3RvcmllcyB8fCBtYXRjaGVzKSB7CisJCQkJaWYgKCFxdWlldCkKKwkJCQkJcHJpbnRmKCJSZW1vdmluZyAlc1xuIiwgcW5hbWUpOworCQkJCWlmIChyZW1vdmVfZGlyX3JlY3Vyc2l2ZWx5KCZkaXJlY3RvcnksIDApICE9IDApIHsKKwkJCQkJd2FybmluZygiZmFpbGVkIHRvIHJlbW92ZSAnJXMnIiwgcW5hbWUpOworCQkJCQllcnJvcnMrKzsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHNob3dfb25seSkgeworCQkJCXByaW50ZigiV291bGQgbm90IHJlbW92ZSAlc1xuIiwgcW5hbWUpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGYoIk5vdCByZW1vdmluZyAlc1xuIiwgcW5hbWUpOworCQkJfQorCQkJc3RyYnVmX3Jlc2V0KCZkaXJlY3RvcnkpOworCQl9IGVsc2UgeworCQkJaWYgKHBhdGhzcGVjICYmICFtYXRjaGVzKQorCQkJCWNvbnRpbnVlOworCQkJcW5hbWUgPSBxdW90ZV9wYXRoX3JlbGF0aXZlKGVudC0+bmFtZSwgLTEsICZidWYsIHByZWZpeCk7CisJCQlpZiAoc2hvd19vbmx5KSB7CisJCQkJcHJpbnRmKCJXb3VsZCByZW1vdmUgJXNcbiIsIHFuYW1lKTsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAoIXF1aWV0KSB7CisJCQkJcHJpbnRmKCJSZW1vdmluZyAlc1xuIiwgcW5hbWUpOworCQkJfQorCQkJaWYgKHVubGluayhlbnQtPm5hbWUpICE9IDApIHsKKwkJCQl3YXJuaW5nKCJmYWlsZWQgdG8gcmVtb3ZlICclcyciLCBxbmFtZSk7CisJCQkJZXJyb3JzKys7CisJCQl9CisJCX0KKwl9CisJZnJlZShzZWVuKTsKKworCXN0cmJ1Zl9yZWxlYXNlKCZkaXJlY3RvcnkpOworCXJldHVybiAoZXJyb3JzICE9IDApOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1jb21taXQtdHJlZS5jIGIvYnVpbHRpbi1jb21taXQtdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MTBkMTgKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWNvbW1pdC10cmVlLmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAidXRmOC5oIgorCisjZGVmaW5lIEJMT0NLSU5HICgxdWwgPDwgMTQpCisKKy8qCisgKiBGSVhNRSEgU2hhcmUgdGhlIGNvZGUgd2l0aCAid3JpdGUtdHJlZS5jIgorICovCitzdGF0aWMgdm9pZCBjaGVja192YWxpZCh1bnNpZ25lZCBjaGFyICpzaGExLCBlbnVtIG9iamVjdF90eXBlIGV4cGVjdCkKK3sKKwllbnVtIG9iamVjdF90eXBlIHR5cGUgPSBzaGExX29iamVjdF9pbmZvKHNoYTEsIE5VTEwpOworCWlmICh0eXBlIDwgMCkKKwkJZGllKCIlcyBpcyBub3QgYSB2YWxpZCBvYmplY3QiLCBzaGExX3RvX2hleChzaGExKSk7CisJaWYgKHR5cGUgIT0gZXhwZWN0KQorCQlkaWUoIiVzIGlzIG5vdCBhIHZhbGlkICclcycgb2JqZWN0Iiwgc2hhMV90b19oZXgoc2hhMSksCisJCSAgICB0eXBlbmFtZShleHBlY3QpKTsKK30KKworLyoKKyAqIEhhdmluZyBtb3JlIHRoYW4gdHdvIHBhcmVudHMgaXMgbm90IHN0cmFuZ2UgYXQgYWxsLCBhbmQgdGhpcyBpcworICogaG93IG11bHRpLXdheSBtZXJnZXMgYXJlIHJlcHJlc2VudGVkLgorICovCisjZGVmaW5lIE1BWFBBUkVOVCAoMTYpCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYXJlbnRfc2hhMVtNQVhQQVJFTlRdWzIwXTsKKworc3RhdGljIGNvbnN0IGNoYXIgY29tbWl0X3RyZWVfdXNhZ2VbXSA9ICJnaXQtY29tbWl0LXRyZWUgPHNoYTE+IFstcCA8c2hhMT5dKiA8IGNoYW5nZWxvZyI7CisKK3N0YXRpYyBpbnQgbmV3X3BhcmVudChpbnQgaWR4KQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgKnNoYTEgPSBwYXJlbnRfc2hhMVtpZHhdOworCWZvciAoaSA9IDA7IGkgPCBpZHg7IGkrKykgeworCQlpZiAoIWhhc2hjbXAocGFyZW50X3NoYTFbaV0sIHNoYTEpKSB7CisJCQllcnJvcigiZHVwbGljYXRlIHBhcmVudCAlcyBpZ25vcmVkIiwgc2hhMV90b19oZXgoc2hhMSkpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGNvbW1pdF91dGY4X3dhcm5bXSA9CisiV2FybmluZzogY29tbWl0IG1lc3NhZ2UgZG9lcyBub3QgY29uZm9ybSB0byBVVEYtOC5cbiIKKyJZb3UgbWF5IHdhbnQgdG8gYW1lbmQgaXQgYWZ0ZXIgZml4aW5nIHRoZSBtZXNzYWdlLCBvciBzZXQgdGhlIGNvbmZpZ1xuIgorInZhcmlhYmxlIGkxOG4uY29tbWl0ZW5jb2RpbmcgdG8gdGhlIGVuY29kaW5nIHlvdXIgcHJvamVjdCB1c2VzLlxuIjsKKworaW50IGNtZF9jb21taXRfdHJlZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaTsKKwlpbnQgcGFyZW50cyA9IDA7CisJdW5zaWduZWQgY2hhciB0cmVlX3NoYTFbMjBdOworCXVuc2lnbmVkIGNoYXIgY29tbWl0X3NoYTFbMjBdOworCXN0cnVjdCBzdHJidWYgYnVmZmVyOworCWludCBlbmNvZGluZ19pc191dGY4OworCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJaWYgKGFyZ2MgPCAyKQorCQl1c2FnZShjb21taXRfdHJlZV91c2FnZSk7CisJaWYgKGdldF9zaGExKGFyZ3ZbMV0sIHRyZWVfc2hhMSkpCisJCWRpZSgiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWUgJXMiLCBhcmd2WzFdKTsKKworCWNoZWNrX3ZhbGlkKHRyZWVfc2hhMSwgT0JKX1RSRUUpOworCWZvciAoaSA9IDI7IGkgPCBhcmdjOyBpICs9IDIpIHsKKwkJY29uc3QgY2hhciAqYSwgKmI7CisJCWEgPSBhcmd2W2ldOyBiID0gYXJndltpKzFdOworCQlpZiAoIWIgfHwgc3RyY21wKGEsICItcCIpKQorCQkJdXNhZ2UoY29tbWl0X3RyZWVfdXNhZ2UpOworCisJCWlmIChwYXJlbnRzID49IE1BWFBBUkVOVCkKKwkJCWRpZSgiVG9vIG1hbnkgcGFyZW50cyAoJWQgbWF4KSIsIE1BWFBBUkVOVCk7CisJCWlmIChnZXRfc2hhMShiLCBwYXJlbnRfc2hhMVtwYXJlbnRzXSkpCisJCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lICVzIiwgYik7CisJCWNoZWNrX3ZhbGlkKHBhcmVudF9zaGExW3BhcmVudHNdLCBPQkpfQ09NTUlUKTsKKwkJaWYgKG5ld19wYXJlbnQocGFyZW50cykpCisJCQlwYXJlbnRzKys7CisJfQorCisJLyogTm90IGhhdmluZyBpMThuLmNvbW1pdGVuY29kaW5nIGlzIHRoZSBzYW1lIGFzIGhhdmluZyB1dGYtOCAqLworCWVuY29kaW5nX2lzX3V0ZjggPSBpc19lbmNvZGluZ191dGY4KGdpdF9jb21taXRfZW5jb2RpbmcpOworCisJc3RyYnVmX2luaXQoJmJ1ZmZlciwgODE5Mik7IC8qIHNob3VsZCBhdm9pZCByZWFsbG9jcyBmb3IgdGhlIGhlYWRlcnMgKi8KKwlzdHJidWZfYWRkZigmYnVmZmVyLCAidHJlZSAlc1xuIiwgc2hhMV90b19oZXgodHJlZV9zaGExKSk7CisKKwkvKgorCSAqIE5PVEUhIFRoaXMgb3JkZXJpbmcgbWVhbnMgdGhhdCB0aGUgc2FtZSBleGFjdCB0cmVlIG1lcmdlZCB3aXRoIGEKKwkgKiBkaWZmZXJlbnQgb3JkZXIgb2YgcGFyZW50cyB3aWxsIGJlIGEgX2RpZmZlcmVudF8gY2hhbmdlc2V0IGV2ZW4KKwkgKiBpZiBldmVyeXRoaW5nIGVsc2Ugc3RheXMgdGhlIHNhbWUuCisJICovCisJZm9yIChpID0gMDsgaSA8IHBhcmVudHM7IGkrKykKKwkJc3RyYnVmX2FkZGYoJmJ1ZmZlciwgInBhcmVudCAlc1xuIiwgc2hhMV90b19oZXgocGFyZW50X3NoYTFbaV0pKTsKKworCS8qIFBlcnNvbi9kYXRlIGluZm9ybWF0aW9uICovCisJc3RyYnVmX2FkZGYoJmJ1ZmZlciwgImF1dGhvciAlc1xuIiwgZ2l0X2F1dGhvcl9pbmZvKElERU5UX0VSUk9SX09OX05PX05BTUUpKTsKKwlzdHJidWZfYWRkZigmYnVmZmVyLCAiY29tbWl0dGVyICVzXG4iLCBnaXRfY29tbWl0dGVyX2luZm8oSURFTlRfRVJST1JfT05fTk9fTkFNRSkpOworCWlmICghZW5jb2RpbmdfaXNfdXRmOCkKKwkJc3RyYnVmX2FkZGYoJmJ1ZmZlciwgImVuY29kaW5nICVzXG4iLCBnaXRfY29tbWl0X2VuY29kaW5nKTsKKwlzdHJidWZfYWRkY2goJmJ1ZmZlciwgJ1xuJyk7CisKKwkvKiBBbmQgYWRkIHRoZSBjb21tZW50ICovCisJaWYgKHN0cmJ1Zl9yZWFkKCZidWZmZXIsIDAsIDApIDwgMCkKKwkJZGllKCJnaXQtY29tbWl0LXRyZWU6IHJlYWQgcmV0dXJuZWQgJXMiLCBzdHJlcnJvcihlcnJubykpOworCisJLyogQW5kIGNoZWNrIHRoZSBlbmNvZGluZyAqLworCWlmIChlbmNvZGluZ19pc191dGY4ICYmICFpc191dGY4KGJ1ZmZlci5idWYpKQorCQlmcHJpbnRmKHN0ZGVyciwgY29tbWl0X3V0Zjhfd2Fybik7CisKKwlpZiAoIXdyaXRlX3NoYTFfZmlsZShidWZmZXIuYnVmLCBidWZmZXIubGVuLCBjb21taXRfdHlwZSwgY29tbWl0X3NoYTEpKSB7CisJCXByaW50ZigiJXNcbiIsIHNoYTFfdG9faGV4KGNvbW1pdF9zaGExKSk7CisJCXJldHVybiAwOworCX0KKwllbHNlCisJCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1jb21taXQuYyBiL2J1aWx0aW4tY29tbWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYwYTM0NQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tY29tbWl0LmMKQEAgLTAsMCArMSw5OTUgQEAKKy8qCisgKiBCdWlsdGluICJnaXQgY29tbWl0IgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBLcmlzdGlhbiBIw7hnc2JlcmcgPGtyaEByZWRoYXQuY29tPgorICogQmFzZWQgb24gZ2l0LWNvbW1pdC5zaCBieSBKdW5pbyBDIEhhbWFubyBhbmQgTGludXMgVG9ydmFsZHMKKyAqLworCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjYWNoZS10cmVlLmgiCisjaW5jbHVkZSAiY29sb3IuaCIKKyNpbmNsdWRlICJkaXIuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgImRpZmZjb3JlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJ3dC1zdGF0dXMuaCIKKyNpbmNsdWRlICJydW4tY29tbWFuZC5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJsb2ctdHJlZS5oIgorI2luY2x1ZGUgInN0cmJ1Zi5oIgorI2luY2x1ZGUgInV0ZjguaCIKKyNpbmNsdWRlICJwYXJzZS1vcHRpb25zLmgiCisjaW5jbHVkZSAicGF0aC1saXN0LmgiCisjaW5jbHVkZSAidW5wYWNrLXRyZWVzLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYnVpbHRpbl9jb21taXRfdXNhZ2VbXSA9IHsKKwkiZ2l0LWNvbW1pdCBbb3B0aW9uc10gWy0tXSA8ZmlsZXBhdHRlcm4+Li4uIiwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJ1aWx0aW5fc3RhdHVzX3VzYWdlW10gPSB7CisJImdpdC1zdGF0dXMgW29wdGlvbnNdIFstLV0gPGZpbGVwYXR0ZXJuPi4uLiIsCisJTlVMTAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgaGVhZF9zaGExWzIwXSwgbWVyZ2VfaGVhZF9zaGExWzIwXTsKK3N0YXRpYyBjaGFyICp1c2VfbWVzc2FnZV9idWZmZXI7CitzdGF0aWMgY29uc3QgY2hhciBjb21taXRfZWRpdG1zZ1tdID0gIkNPTU1JVF9FRElUTVNHIjsKK3N0YXRpYyBzdHJ1Y3QgbG9ja19maWxlIGluZGV4X2xvY2s7IC8qIHJlYWwgaW5kZXggKi8KK3N0YXRpYyBzdHJ1Y3QgbG9ja19maWxlIGZhbHNlX2xvY2s7IC8qIHVzZWQgb25seSBmb3IgcGFydGlhbCBjb21taXRzICovCitzdGF0aWMgZW51bSB7CisJQ09NTUlUX0FTX0lTID0gMSwKKwlDT01NSVRfTk9STUFMLAorCUNPTU1JVF9QQVJUSUFMLAorfSBjb21taXRfc3R5bGU7CisKK3N0YXRpYyBjaGFyICpsb2dmaWxlLCAqZm9yY2VfYXV0aG9yLCAqdGVtcGxhdGVfZmlsZTsKK3N0YXRpYyBjaGFyICplZGl0X21lc3NhZ2UsICp1c2VfbWVzc2FnZTsKK3N0YXRpYyBpbnQgYWxsLCBlZGl0X2ZsYWcsIGFsc28sIGludGVyYWN0aXZlLCBvbmx5LCBhbWVuZCwgc2lnbm9mZjsKK3N0YXRpYyBpbnQgcXVpZXQsIHZlcmJvc2UsIHVudHJhY2tlZF9maWxlcywgbm9fdmVyaWZ5LCBhbGxvd19lbXB0eTsKKy8qCisgKiBUaGUgZGVmYXVsdCBjb21taXQgbWVzc2FnZSBjbGVhbnVwIG1vZGUgd2lsbCByZW1vdmUgdGhlIGxpbmVzCisgKiBiZWdpbm5pbmcgd2l0aCAjIChzaGVsbCBjb21tZW50cykgYW5kIGxlYWRpbmcgYW5kIHRyYWlsaW5nCisgKiB3aGl0ZXNwYWNlcyAoZW1wdHkgbGluZXMgb3IgY29udGFpbmluZyBvbmx5IHdoaXRlc3BhY2VzKQorICogaWYgZWRpdG9yIGlzIHVzZWQsIGFuZCBvbmx5IHRoZSB3aGl0ZXNwYWNlcyBpZiB0aGUgbWVzc2FnZQorICogaXMgc3BlY2lmaWVkIGV4cGxpY2l0bHkuCisgKi8KK3N0YXRpYyBlbnVtIHsKKwlDTEVBTlVQX1NQQUNFLAorCUNMRUFOVVBfTk9ORSwKKwlDTEVBTlVQX0FMTCwKK30gY2xlYW51cF9tb2RlOworc3RhdGljIGNoYXIgKmNsZWFudXBfYXJnOworCitzdGF0aWMgaW50IHVzZV9lZGl0b3IgPSAxLCBpbml0aWFsX2NvbW1pdCwgaW5fbWVyZ2U7Citjb25zdCBjaGFyICpvbmx5X2luY2x1ZGVfYXNzdW1lZDsKK3N0cnVjdCBzdHJidWYgbWVzc2FnZTsKKworc3RhdGljIGludCBvcHRfcGFyc2VfbShjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHQsIGNvbnN0IGNoYXIgKmFyZywgaW50IHVuc2V0KQoreworCXN0cnVjdCBzdHJidWYgKmJ1ZiA9IG9wdC0+dmFsdWU7CisJaWYgKHVuc2V0KQorCQlzdHJidWZfc2V0bGVuKGJ1ZiwgMCk7CisJZWxzZSB7CisJCXN0cmJ1Zl9hZGRzdHIoYnVmLCBhcmcpOworCQlzdHJidWZfYWRkY2goYnVmLCAnXG4nKTsKKwkJc3RyYnVmX2FkZGNoKGJ1ZiwgJ1xuJyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG9wdGlvbiBidWlsdGluX2NvbW1pdF9vcHRpb25zW10gPSB7CisJT1BUX19RVUlFVCgmcXVpZXQpLAorCU9QVF9fVkVSQk9TRSgmdmVyYm9zZSksCisJT1BUX0dST1VQKCJDb21taXQgbWVzc2FnZSBvcHRpb25zIiksCisKKwlPUFRfU1RSSU5HKCdGJywgImZpbGUiLCAmbG9nZmlsZSwgIkZJTEUiLCAicmVhZCBsb2cgZnJvbSBmaWxlIiksCisJT1BUX1NUUklORygwLCAiYXV0aG9yIiwgJmZvcmNlX2F1dGhvciwgIkFVVEhPUiIsICJvdmVycmlkZSBhdXRob3IgZm9yIGNvbW1pdCIpLAorCU9QVF9DQUxMQkFDSygnbScsICJtZXNzYWdlIiwgJm1lc3NhZ2UsICJNRVNTQUdFIiwgInNwZWNpZnkgY29tbWl0IG1lc3NhZ2UiLCBvcHRfcGFyc2VfbSksCisJT1BUX1NUUklORygnYycsICJyZWVkaXQtbWVzc2FnZSIsICZlZGl0X21lc3NhZ2UsICJDT01NSVQiLCAicmV1c2UgYW5kIGVkaXQgbWVzc2FnZSBmcm9tIHNwZWNpZmllZCBjb21taXQgIiksCisJT1BUX1NUUklORygnQycsICJyZXVzZS1tZXNzYWdlIiwgJnVzZV9tZXNzYWdlLCAiQ09NTUlUIiwgInJldXNlIG1lc3NhZ2UgZnJvbSBzcGVjaWZpZWQgY29tbWl0IiksCisJT1BUX0JPT0xFQU4oJ3MnLCAic2lnbm9mZiIsICZzaWdub2ZmLCAiYWRkIFNpZ25lZC1vZmYtYnk6IGhlYWRlciIpLAorCU9QVF9TVFJJTkcoJ3QnLCAidGVtcGxhdGUiLCAmdGVtcGxhdGVfZmlsZSwgIkZJTEUiLCAidXNlIHNwZWNpZmllZCB0ZW1wbGF0ZSBmaWxlIiksCisJT1BUX0JPT0xFQU4oJ2UnLCAiZWRpdCIsICZlZGl0X2ZsYWcsICJmb3JjZSBlZGl0IG9mIGNvbW1pdCIpLAorCisJT1BUX0dST1VQKCJDb21taXQgY29udGVudHMgb3B0aW9ucyIpLAorCU9QVF9CT09MRUFOKCdhJywgImFsbCIsICZhbGwsICJjb21taXQgYWxsIGNoYW5nZWQgZmlsZXMiKSwKKwlPUFRfQk9PTEVBTignaScsICJpbmNsdWRlIiwgJmFsc28sICJhZGQgc3BlY2lmaWVkIGZpbGVzIHRvIGluZGV4IGZvciBjb21taXQiKSwKKwlPUFRfQk9PTEVBTigwLCAiaW50ZXJhY3RpdmUiLCAmaW50ZXJhY3RpdmUsICJpbnRlcmFjdGl2ZWx5IGFkZCBmaWxlcyIpLAorCU9QVF9CT09MRUFOKCdvJywgIm9ubHkiLCAmb25seSwgIiIpLAorCU9QVF9CT09MRUFOKCduJywgIm5vLXZlcmlmeSIsICZub192ZXJpZnksICJieXBhc3MgcHJlLWNvbW1pdCBob29rIiksCisJT1BUX0JPT0xFQU4oMCwgImFtZW5kIiwgJmFtZW5kLCAiYW1lbmQgcHJldmlvdXMgY29tbWl0IiksCisJT1BUX0JPT0xFQU4oMCwgInVudHJhY2tlZC1maWxlcyIsICZ1bnRyYWNrZWRfZmlsZXMsICJzaG93IGFsbCB1bnRyYWNrZWQgZmlsZXMiKSwKKwlPUFRfQk9PTEVBTigwLCAiYWxsb3ctZW1wdHkiLCAmYWxsb3dfZW1wdHksICJvayB0byByZWNvcmQgYW4gZW1wdHkgY2hhbmdlIiksCisJT1BUX1NUUklORygwLCAiY2xlYW51cCIsICZjbGVhbnVwX2FyZywgImRlZmF1bHQiLCAiaG93IHRvIHN0cmlwIHNwYWNlcyBhbmQgI2NvbW1lbnRzIGZyb20gbWVzc2FnZSIpLAorCisJT1BUX0VORCgpCit9OworCitzdGF0aWMgdm9pZCByb2xsYmFja19pbmRleF9maWxlcyh2b2lkKQoreworCXN3aXRjaCAoY29tbWl0X3N0eWxlKSB7CisJY2FzZSBDT01NSVRfQVNfSVM6CisJCWJyZWFrOyAvKiBub3RoaW5nIHRvIGRvICovCisJY2FzZSBDT01NSVRfTk9STUFMOgorCQlyb2xsYmFja19sb2NrX2ZpbGUoJmluZGV4X2xvY2spOworCQlicmVhazsKKwljYXNlIENPTU1JVF9QQVJUSUFMOgorCQlyb2xsYmFja19sb2NrX2ZpbGUoJmluZGV4X2xvY2spOworCQlyb2xsYmFja19sb2NrX2ZpbGUoJmZhbHNlX2xvY2spOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY29tbWl0X2luZGV4X2ZpbGVzKHZvaWQpCit7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2ggKGNvbW1pdF9zdHlsZSkgeworCWNhc2UgQ09NTUlUX0FTX0lTOgorCQlicmVhazsgLyogbm90aGluZyB0byBkbyAqLworCWNhc2UgQ09NTUlUX05PUk1BTDoKKwkJZXJyID0gY29tbWl0X2xvY2tfZmlsZSgmaW5kZXhfbG9jayk7CisJCWJyZWFrOworCWNhc2UgQ09NTUlUX1BBUlRJQUw6CisJCWVyciA9IGNvbW1pdF9sb2NrX2ZpbGUoJmluZGV4X2xvY2spOworCQlyb2xsYmFja19sb2NrX2ZpbGUoJmZhbHNlX2xvY2spOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogVGFrZSBhIHVuaW9uIG9mIHBhdGhzIGluIHRoZSBpbmRleCBhbmQgdGhlIG5hbWVkIHRyZWUgKHR5cGljYWxseSwgIkhFQUQiKSwKKyAqIGFuZCByZXR1cm4gdGhlIHBhdGhzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHBhdHRlcm4gaW4gbGlzdC4KKyAqLworc3RhdGljIGludCBsaXN0X3BhdGhzKHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QsIGNvbnN0IGNoYXIgKndpdGhfdHJlZSwKKwkJICAgICAgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICoqcGF0dGVybikKK3sKKwlpbnQgaTsKKwljaGFyICptOworCisJZm9yIChpID0gMDsgcGF0dGVybltpXTsgaSsrKQorCQk7CisJbSA9IHhjYWxsb2MoMSwgaSk7CisKKwlpZiAod2l0aF90cmVlKQorCQlvdmVybGF5X3RyZWVfb25fY2FjaGUod2l0aF90cmVlLCBwcmVmaXgpOworCisJZm9yIChpID0gMDsgaSA8IGFjdGl2ZV9ucjsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCWlmIChjZS0+Y2VfZmxhZ3MgJiBDRV9VUERBVEUpCisJCQljb250aW51ZTsKKwkJaWYgKCFwYXRoc3BlY19tYXRjaChwYXR0ZXJuLCBtLCBjZS0+bmFtZSwgMCkpCisJCQljb250aW51ZTsKKwkJcGF0aF9saXN0X2luc2VydChjZS0+bmFtZSwgbGlzdCk7CisJfQorCisJcmV0dXJuIHJlcG9ydF9wYXRoX2Vycm9yKG0sIHBhdHRlcm4sIHByZWZpeCA/IHN0cmxlbihwcmVmaXgpIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9yZW1vdmVfZmlsZXMoc3RydWN0IHBhdGhfbGlzdCAqbGlzdCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbGlzdC0+bnI7IGkrKykgeworCQlzdHJ1Y3QgcGF0aF9saXN0X2l0ZW0gKnAgPSAmKGxpc3QtPml0ZW1zW2ldKTsKKwkJaWYgKGZpbGVfZXhpc3RzKHAtPnBhdGgpKQorCQkJYWRkX2ZpbGVfdG9fY2FjaGUocC0+cGF0aCwgMCk7CisJCWVsc2UKKwkJCXJlbW92ZV9maWxlX2Zyb21fY2FjaGUocC0+cGF0aCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjcmVhdGVfYmFzZV9pbmRleCh2b2lkKQoreworCXN0cnVjdCB0cmVlICp0cmVlOworCXN0cnVjdCB1bnBhY2tfdHJlZXNfb3B0aW9ucyBvcHRzOworCXN0cnVjdCB0cmVlX2Rlc2MgdDsKKworCWlmIChpbml0aWFsX2NvbW1pdCkgeworCQlkaXNjYXJkX2NhY2hlKCk7CisJCXJldHVybjsKKwl9CisKKwltZW1zZXQoJm9wdHMsIDAsIHNpemVvZihvcHRzKSk7CisJb3B0cy5oZWFkX2lkeCA9IDE7CisJb3B0cy5pbmRleF9vbmx5ID0gMTsKKwlvcHRzLm1lcmdlID0gMTsKKwlvcHRzLnNyY19pbmRleCA9ICZ0aGVfaW5kZXg7CisJb3B0cy5kc3RfaW5kZXggPSAmdGhlX2luZGV4OworCisJb3B0cy5mbiA9IG9uZXdheV9tZXJnZTsKKwl0cmVlID0gcGFyc2VfdHJlZV9pbmRpcmVjdChoZWFkX3NoYTEpOworCWlmICghdHJlZSkKKwkJZGllKCJmYWlsZWQgdG8gdW5wYWNrIEhFQUQgdHJlZSBvYmplY3QiKTsKKwlwYXJzZV90cmVlKHRyZWUpOworCWluaXRfdHJlZV9kZXNjKCZ0LCB0cmVlLT5idWZmZXIsIHRyZWUtPnNpemUpOworCWlmICh1bnBhY2tfdHJlZXMoMSwgJnQsICZvcHRzKSkKKwkJZXhpdCgxMjgpOyAvKiBXZSd2ZSBhbHJlYWR5IHJlcG9ydGVkIHRoZSBlcnJvciwgZmluaXNoIGR5aW5nICovCit9CisKK3N0YXRpYyBjaGFyICpwcmVwYXJlX2luZGV4KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBmZDsKKwlzdHJ1Y3QgcGF0aF9saXN0IHBhcnRpYWw7CisJY29uc3QgY2hhciAqKnBhdGhzcGVjID0gTlVMTDsKKworCWlmIChpbnRlcmFjdGl2ZSkgeworCQlpbnRlcmFjdGl2ZV9hZGQoYXJnYywgYXJndiwgcHJlZml4KTsKKwkJY29tbWl0X3N0eWxlID0gQ09NTUlUX0FTX0lTOworCQlyZXR1cm4gZ2V0X2luZGV4X2ZpbGUoKTsKKwl9CisKKwlpZiAocmVhZF9jYWNoZSgpIDwgMCkKKwkJZGllKCJpbmRleCBmaWxlIGNvcnJ1cHQiKTsKKworCWlmICgqYXJndikKKwkJcGF0aHNwZWMgPSBnZXRfcGF0aHNwZWMocHJlZml4LCBhcmd2KTsKKworCS8qCisJICogTm9uIHBhcnRpYWwsIG5vbiBhcy1pcyBjb21taXQuCisJICoKKwkgKiAoMSkgZ2V0IHRoZSByZWFsIGluZGV4OworCSAqICgyKSB1cGRhdGUgdGhlX2luZGV4IGFzIG5lY2Vzc2FyeTsKKwkgKiAoMykgd3JpdGUgdGhlX2luZGV4IG91dCB0byB0aGUgcmVhbCBpbmRleCAoc3RpbGwgbG9ja2VkKTsKKwkgKiAoNCkgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBsb2NrZWQgaW5kZXggZmlsZS4KKwkgKgorCSAqIFRoZSBjYWxsZXIgc2hvdWxkIHJ1biBob29rcyBvbiB0aGUgbG9ja2VkIHJlYWwgaW5kZXgsIGFuZAorCSAqIChBKSBpZiBhbGwgZ29lcyB3ZWxsLCBjb21taXQgdGhlIHJlYWwgaW5kZXg7CisJICogKEIpIG9uIGZhaWx1cmUsIHJvbGxiYWNrIHRoZSByZWFsIGluZGV4LgorCSAqLworCWlmIChhbGwgfHwgKGFsc28gJiYgcGF0aHNwZWMgJiYgKnBhdGhzcGVjKSkgeworCQlpbnQgZmQgPSBob2xkX2xvY2tlZF9pbmRleCgmaW5kZXhfbG9jaywgMSk7CisJCWFkZF9maWxlc190b19jYWNoZSgwLCBhbHNvID8gcHJlZml4IDogTlVMTCwgcGF0aHNwZWMpOworCQlyZWZyZXNoX2NhY2hlKFJFRlJFU0hfUVVJRVQpOworCQlpZiAod3JpdGVfY2FjaGUoZmQsIGFjdGl2ZV9jYWNoZSwgYWN0aXZlX25yKSB8fAorCQkgICAgY2xvc2VfbG9ja19maWxlKCZpbmRleF9sb2NrKSkKKwkJCWRpZSgidW5hYmxlIHRvIHdyaXRlIG5ld19pbmRleCBmaWxlIik7CisJCWNvbW1pdF9zdHlsZSA9IENPTU1JVF9OT1JNQUw7CisJCXJldHVybiBpbmRleF9sb2NrLmZpbGVuYW1lOworCX0KKworCS8qCisJICogQXMtaXMgY29tbWl0LgorCSAqCisJICogKDEpIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcmVhbCBpbmRleCBmaWxlLgorCSAqCisJICogVGhlIGNhbGxlciBzaG91bGQgcnVuIGhvb2tzIG9uIHRoZSByZWFsIGluZGV4LCBhbmQgcnVuCisJICogaG9va3Mgb24gdGhlIHJlYWwgaW5kZXgsIGFuZCBjcmVhdGUgY29tbWl0IGZyb20gdGhlX2luZGV4LgorCSAqIFdlIHN0aWxsIG5lZWQgdG8gcmVmcmVzaCB0aGUgaW5kZXggaGVyZS4KKwkgKi8KKwlpZiAoIXBhdGhzcGVjIHx8ICEqcGF0aHNwZWMpIHsKKwkJZmQgPSBob2xkX2xvY2tlZF9pbmRleCgmaW5kZXhfbG9jaywgMSk7CisJCXJlZnJlc2hfY2FjaGUoUkVGUkVTSF9RVUlFVCk7CisJCWlmICh3cml0ZV9jYWNoZShmZCwgYWN0aXZlX2NhY2hlLCBhY3RpdmVfbnIpIHx8CisJCSAgICBjb21taXRfbG9ja2VkX2luZGV4KCZpbmRleF9sb2NrKSkKKwkJCWRpZSgidW5hYmxlIHRvIHdyaXRlIG5ld19pbmRleCBmaWxlIik7CisJCWNvbW1pdF9zdHlsZSA9IENPTU1JVF9BU19JUzsKKwkJcmV0dXJuIGdldF9pbmRleF9maWxlKCk7CisJfQorCisJLyoKKwkgKiBBIHBhcnRpYWwgY29tbWl0LgorCSAqCisJICogKDApIGZpbmQgdGhlIHNldCBvZiBhZmZlY3RlZCBwYXRoczsKKwkgKiAoMSkgZ2V0IGxvY2sgb24gdGhlIHJlYWwgaW5kZXggZmlsZTsKKwkgKiAoMikgdXBkYXRlIHRoZV9pbmRleCB3aXRoIHRoZSBnaXZlbiBwYXRoczsKKwkgKiAoMykgd3JpdGUgdGhlX2luZGV4IG91dCB0byB0aGUgcmVhbCBpbmRleCAoc3RpbGwgbG9ja2VkKTsKKwkgKiAoNCkgZ2V0IGxvY2sgb24gdGhlIGZhbHNlIGluZGV4IGZpbGU7CisJICogKDUpIHJlc2V0IHRoZV9pbmRleCBmcm9tIEhFQUQ7CisJICogKDYpIHVwZGF0ZSB0aGVfaW5kZXggdGhlIHNhbWUgd2F5IGFzICgyKTsKKwkgKiAoNykgd3JpdGUgdGhlX2luZGV4IG91dCB0byB0aGUgZmFsc2UgaW5kZXggZmlsZTsKKwkgKiAoOCkgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmYWxzZSBpbmRleCBmaWxlIChzdGlsbCBsb2NrZWQpOworCSAqCisJICogVGhlIGNhbGxlciBzaG91bGQgcnVuIGhvb2tzIG9uIHRoZSBsb2NrZWQgZmFsc2UgaW5kZXgsIGFuZAorCSAqIGNyZWF0ZSBjb21taXQgZnJvbSBpdC4gIFRoZW4KKwkgKiAoQSkgaWYgYWxsIGdvZXMgd2VsbCwgY29tbWl0IHRoZSByZWFsIGluZGV4OworCSAqIChCKSBvbiBmYWlsdXJlLCByb2xsYmFjayB0aGUgcmVhbCBpbmRleDsKKwkgKiBJbiBlaXRoZXIgY2FzZSwgcm9sbGJhY2sgdGhlIGZhbHNlIGluZGV4LgorCSAqLworCWNvbW1pdF9zdHlsZSA9IENPTU1JVF9QQVJUSUFMOworCisJaWYgKGZpbGVfZXhpc3RzKGdpdF9wYXRoKCJNRVJHRV9IRUFEIikpKQorCQlkaWUoImNhbm5vdCBkbyBhIHBhcnRpYWwgY29tbWl0IGR1cmluZyBhIG1lcmdlLiIpOworCisJbWVtc2V0KCZwYXJ0aWFsLCAwLCBzaXplb2YocGFydGlhbCkpOworCXBhcnRpYWwuc3RyZHVwX3BhdGhzID0gMTsKKwlpZiAobGlzdF9wYXRocygmcGFydGlhbCwgaW5pdGlhbF9jb21taXQgPyBOVUxMIDogIkhFQUQiLCBwcmVmaXgsIHBhdGhzcGVjKSkKKwkJZXhpdCgxKTsKKworCWRpc2NhcmRfY2FjaGUoKTsKKwlpZiAocmVhZF9jYWNoZSgpIDwgMCkKKwkJZGllKCJjYW5ub3QgcmVhZCB0aGUgaW5kZXgiKTsKKworCWZkID0gaG9sZF9sb2NrZWRfaW5kZXgoJmluZGV4X2xvY2ssIDEpOworCWFkZF9yZW1vdmVfZmlsZXMoJnBhcnRpYWwpOworCXJlZnJlc2hfY2FjaGUoUkVGUkVTSF9RVUlFVCk7CisJaWYgKHdyaXRlX2NhY2hlKGZkLCBhY3RpdmVfY2FjaGUsIGFjdGl2ZV9ucikgfHwKKwkgICAgY2xvc2VfbG9ja19maWxlKCZpbmRleF9sb2NrKSkKKwkJZGllKCJ1bmFibGUgdG8gd3JpdGUgbmV3X2luZGV4IGZpbGUiKTsKKworCWZkID0gaG9sZF9sb2NrX2ZpbGVfZm9yX3VwZGF0ZSgmZmFsc2VfbG9jaywKKwkJCQkgICAgICAgZ2l0X3BhdGgoIm5leHQtaW5kZXgtJWQiLCBnZXRwaWQoKSksIDEpOworCisJY3JlYXRlX2Jhc2VfaW5kZXgoKTsKKwlhZGRfcmVtb3ZlX2ZpbGVzKCZwYXJ0aWFsKTsKKwlyZWZyZXNoX2NhY2hlKFJFRlJFU0hfUVVJRVQpOworCisJaWYgKHdyaXRlX2NhY2hlKGZkLCBhY3RpdmVfY2FjaGUsIGFjdGl2ZV9ucikgfHwKKwkgICAgY2xvc2VfbG9ja19maWxlKCZmYWxzZV9sb2NrKSkKKwkJZGllKCJ1bmFibGUgdG8gd3JpdGUgdGVtcG9yYXJ5IGluZGV4IGZpbGUiKTsKKworCWRpc2NhcmRfY2FjaGUoKTsKKwlyZWFkX2NhY2hlX2Zyb20oZmFsc2VfbG9jay5maWxlbmFtZSk7CisKKwlyZXR1cm4gZmFsc2VfbG9jay5maWxlbmFtZTsKK30KKworc3RhdGljIGludCBydW5fc3RhdHVzKEZJTEUgKmZwLCBjb25zdCBjaGFyICppbmRleF9maWxlLCBjb25zdCBjaGFyICpwcmVmaXgsIGludCBub3dhcm4pCit7CisJc3RydWN0IHd0X3N0YXR1cyBzOworCisJd3Rfc3RhdHVzX3ByZXBhcmUoJnMpOworCWlmICh3dF9zdGF0dXNfcmVsYXRpdmVfcGF0aHMpCisJCXMucHJlZml4ID0gcHJlZml4OworCisJaWYgKGFtZW5kKSB7CisJCXMuYW1lbmQgPSAxOworCQlzLnJlZmVyZW5jZSA9ICJIRUFEXjEiOworCX0KKwlzLnZlcmJvc2UgPSB2ZXJib3NlOworCXMudW50cmFja2VkID0gdW50cmFja2VkX2ZpbGVzOworCXMuaW5kZXhfZmlsZSA9IGluZGV4X2ZpbGU7CisJcy5mcCA9IGZwOworCXMubm93YXJuID0gbm93YXJuOworCisJd3Rfc3RhdHVzX3ByaW50KCZzKTsKKworCXJldHVybiBzLmNvbW1pdGFibGU7Cit9CisKK3N0YXRpYyBpbnQgcnVuX2hvb2soY29uc3QgY2hhciAqaW5kZXhfZmlsZSwgY29uc3QgY2hhciAqbmFtZSwgLi4uKQoreworCXN0cnVjdCBjaGlsZF9wcm9jZXNzIGhvb2s7CisJY29uc3QgY2hhciAqYXJndlsxMF0sICplbnZbMl07CisJY2hhciBpbmRleFtQQVRIX01BWF07CisJdmFfbGlzdCBhcmdzOworCWludCBpOworCisJdmFfc3RhcnQoYXJncywgbmFtZSk7CisJYXJndlswXSA9IGdpdF9wYXRoKCJob29rcy8lcyIsIG5hbWUpOworCWkgPSAwOworCWRvIHsKKwkJaWYgKCsraSA+PSBBUlJBWV9TSVpFKGFyZ3YpKQorCQkJZGllICgicnVuX2hvb2soKTogdG9vIG1hbnkgYXJndW1lbnRzIik7CisJCWFyZ3ZbaV0gPSB2YV9hcmcoYXJncywgY29uc3QgY2hhciAqKTsKKwl9IHdoaWxlIChhcmd2W2ldKTsKKwl2YV9lbmQoYXJncyk7CisKKwlzbnByaW50ZihpbmRleCwgc2l6ZW9mKGluZGV4KSwgIkdJVF9JTkRFWF9GSUxFPSVzIiwgaW5kZXhfZmlsZSk7CisJZW52WzBdID0gaW5kZXg7CisJZW52WzFdID0gTlVMTDsKKworCWlmIChhY2Nlc3MoYXJndlswXSwgWF9PSykgPCAwKQorCQlyZXR1cm4gMDsKKworCW1lbXNldCgmaG9vaywgMCwgc2l6ZW9mKGhvb2spKTsKKwlob29rLmFyZ3YgPSBhcmd2OworCWhvb2subm9fc3RkaW4gPSAxOworCWhvb2suc3Rkb3V0X3RvX3N0ZGVyciA9IDE7CisJaG9vay5lbnYgPSBlbnY7CisKKwlyZXR1cm4gcnVuX2NvbW1hbmQoJmhvb2spOworfQorCitzdGF0aWMgaW50IGlzX2FfbWVyZ2UoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsb29rdXBfY29tbWl0KHNoYTEpOworCWlmICghY29tbWl0IHx8IHBhcnNlX2NvbW1pdChjb21taXQpKQorCQlkaWUoImNvdWxkIG5vdCBwYXJzZSBIRUFEIGNvbW1pdCIpOworCXJldHVybiAhIShjb21taXQtPnBhcmVudHMgJiYgY29tbWl0LT5wYXJlbnRzLT5uZXh0KTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgc2lnbl9vZmZfaGVhZGVyW10gPSAiU2lnbmVkLW9mZi1ieTogIjsKKworc3RhdGljIGludCBwcmVwYXJlX3RvX2NvbW1pdChjb25zdCBjaGFyICppbmRleF9maWxlLCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwlpbnQgY29tbWl0YWJsZSwgc2F2ZWRfY29sb3Jfc2V0dGluZzsKKwlzdHJ1Y3Qgc3RyYnVmIHNiOworCWNoYXIgKmJ1ZmZlcjsKKwlGSUxFICpmcDsKKwljb25zdCBjaGFyICpob29rX2FyZzEgPSBOVUxMOworCWNvbnN0IGNoYXIgKmhvb2tfYXJnMiA9IE5VTEw7CisKKwlpZiAoIW5vX3ZlcmlmeSAmJiBydW5faG9vayhpbmRleF9maWxlLCAicHJlLWNvbW1pdCIsIE5VTEwpKQorCQlyZXR1cm4gMDsKKworCXN0cmJ1Zl9pbml0KCZzYiwgMCk7CisJaWYgKG1lc3NhZ2UubGVuKSB7CisJCXN0cmJ1Zl9hZGRidWYoJnNiLCAmbWVzc2FnZSk7CisJCWhvb2tfYXJnMSA9ICJtZXNzYWdlIjsKKwl9IGVsc2UgaWYgKGxvZ2ZpbGUgJiYgIXN0cmNtcChsb2dmaWxlLCAiLSIpKSB7CisJCWlmIChpc2F0dHkoMCkpCisJCQlmcHJpbnRmKHN0ZGVyciwgIihyZWFkaW5nIGxvZyBtZXNzYWdlIGZyb20gc3RhbmRhcmQgaW5wdXQpXG4iKTsKKwkJaWYgKHN0cmJ1Zl9yZWFkKCZzYiwgMCwgMCkgPCAwKQorCQkJZGllKCJjb3VsZCBub3QgcmVhZCBsb2cgZnJvbSBzdGFuZGFyZCBpbnB1dCIpOworCQlob29rX2FyZzEgPSAibWVzc2FnZSI7CisJfSBlbHNlIGlmIChsb2dmaWxlKSB7CisJCWlmIChzdHJidWZfcmVhZF9maWxlKCZzYiwgbG9nZmlsZSwgMCkgPCAwKQorCQkJZGllKCJjb3VsZCBub3QgcmVhZCBsb2cgZmlsZSAnJXMnOiAlcyIsCisJCQkgICAgbG9nZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJaG9va19hcmcxID0gIm1lc3NhZ2UiOworCX0gZWxzZSBpZiAodXNlX21lc3NhZ2UpIHsKKwkJYnVmZmVyID0gc3Ryc3RyKHVzZV9tZXNzYWdlX2J1ZmZlciwgIlxuXG4iKTsKKwkJaWYgKCFidWZmZXIgfHwgYnVmZmVyWzJdID09ICdcMCcpCisJCQlkaWUoImNvbW1pdCBoYXMgZW1wdHkgbWVzc2FnZSIpOworCQlzdHJidWZfYWRkKCZzYiwgYnVmZmVyICsgMiwgc3RybGVuKGJ1ZmZlciArIDIpKTsKKwkJaG9va19hcmcxID0gImNvbW1pdCI7CisJCWhvb2tfYXJnMiA9IHVzZV9tZXNzYWdlOworCX0gZWxzZSBpZiAoIXN0YXQoZ2l0X3BhdGgoIk1FUkdFX01TRyIpLCAmc3RhdGJ1ZikpIHsKKwkJaWYgKHN0cmJ1Zl9yZWFkX2ZpbGUoJnNiLCBnaXRfcGF0aCgiTUVSR0VfTVNHIiksIDApIDwgMCkKKwkJCWRpZSgiY291bGQgbm90IHJlYWQgTUVSR0VfTVNHOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWhvb2tfYXJnMSA9ICJtZXJnZSI7CisJfSBlbHNlIGlmICghc3RhdChnaXRfcGF0aCgiU1FVQVNIX01TRyIpLCAmc3RhdGJ1ZikpIHsKKwkJaWYgKHN0cmJ1Zl9yZWFkX2ZpbGUoJnNiLCBnaXRfcGF0aCgiU1FVQVNIX01TRyIpLCAwKSA8IDApCisJCQlkaWUoImNvdWxkIG5vdCByZWFkIFNRVUFTSF9NU0c6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJaG9va19hcmcxID0gInNxdWFzaCI7CisJfSBlbHNlIGlmICh0ZW1wbGF0ZV9maWxlICYmICFzdGF0KHRlbXBsYXRlX2ZpbGUsICZzdGF0YnVmKSkgeworCQlpZiAoc3RyYnVmX3JlYWRfZmlsZSgmc2IsIHRlbXBsYXRlX2ZpbGUsIDApIDwgMCkKKwkJCWRpZSgiY291bGQgbm90IHJlYWQgJXM6ICVzIiwKKwkJCSAgICB0ZW1wbGF0ZV9maWxlLCBzdHJlcnJvcihlcnJubykpOworCQlob29rX2FyZzEgPSAidGVtcGxhdGUiOworCX0KKworCS8qCisJICogVGhpcyBmaW5hbCBjYXNlIGRvZXMgbm90IG1vZGlmeSB0aGUgdGVtcGxhdGUgbWVzc2FnZSwKKwkgKiBpdCBqdXN0IHNldHMgdGhlIGFyZ3VtZW50IHRvIHRoZSBwcmVwYXJlLWNvbW1pdC1tc2cgaG9vay4KKwkgKi8KKwllbHNlIGlmIChpbl9tZXJnZSkKKwkJaG9va19hcmcxID0gIm1lcmdlIjsKKworCWZwID0gZm9wZW4oZ2l0X3BhdGgoY29tbWl0X2VkaXRtc2cpLCAidyIpOworCWlmIChmcCA9PSBOVUxMKQorCQlkaWUoImNvdWxkIG5vdCBvcGVuICVzIiwgZ2l0X3BhdGgoY29tbWl0X2VkaXRtc2cpKTsKKworCWlmIChjbGVhbnVwX21vZGUgIT0gQ0xFQU5VUF9OT05FKQorCQlzdHJpcHNwYWNlKCZzYiwgMCk7CisKKwlpZiAoc2lnbm9mZikgeworCQlzdHJ1Y3Qgc3RyYnVmIHNvYjsKKwkJaW50IGk7CisKKwkJc3RyYnVmX2luaXQoJnNvYiwgMCk7CisJCXN0cmJ1Zl9hZGRzdHIoJnNvYiwgc2lnbl9vZmZfaGVhZGVyKTsKKwkJc3RyYnVmX2FkZHN0cigmc29iLCBmbXRfbmFtZShnZXRlbnYoIkdJVF9DT01NSVRURVJfTkFNRSIpLAorCQkJCQkgICAgIGdldGVudigiR0lUX0NPTU1JVFRFUl9FTUFJTCIpKSk7CisJCXN0cmJ1Zl9hZGRjaCgmc29iLCAnXG4nKTsKKwkJZm9yIChpID0gc2IubGVuIC0gMTsgaSA+IDAgJiYgc2IuYnVmW2kgLSAxXSAhPSAnXG4nOyBpLS0pCisJCQk7IC8qIGRvIG5vdGhpbmcgKi8KKwkJaWYgKHByZWZpeGNtcChzYi5idWYgKyBpLCBzb2IuYnVmKSkgeworCQkJaWYgKHByZWZpeGNtcChzYi5idWYgKyBpLCBzaWduX29mZl9oZWFkZXIpKQorCQkJCXN0cmJ1Zl9hZGRjaCgmc2IsICdcbicpOworCQkJc3RyYnVmX2FkZGJ1Zigmc2IsICZzb2IpOworCQl9CisJCXN0cmJ1Zl9yZWxlYXNlKCZzb2IpOworCX0KKworCWlmIChmd3JpdGUoc2IuYnVmLCAxLCBzYi5sZW4sIGZwKSA8IHNiLmxlbikKKwkJZGllKCJjb3VsZCBub3Qgd3JpdGUgY29tbWl0IHRlbXBsYXRlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisKKwlzdHJidWZfcmVsZWFzZSgmc2IpOworCisJaWYgKHVzZV9lZGl0b3IpIHsKKwkJaWYgKGluX21lcmdlKQorCQkJZnByaW50ZihmcCwKKwkJCQkiI1xuIgorCQkJCSIjIEl0IGxvb2tzIGxpa2UgeW91IG1heSBiZSBjb21taXR0aW5nIGEgTUVSR0UuXG4iCisJCQkJIiMgSWYgdGhpcyBpcyBub3QgY29ycmVjdCwgcGxlYXNlIHJlbW92ZSB0aGUgZmlsZVxuIgorCQkJCSIjCSVzXG4iCisJCQkJIiMgYW5kIHRyeSBhZ2Fpbi5cbiIKKwkJCQkiI1xuIiwKKwkJCQlnaXRfcGF0aCgiTUVSR0VfSEVBRCIpKTsKKworCQlmcHJpbnRmKGZwLAorCQkJIlxuIgorCQkJIiMgUGxlYXNlIGVudGVyIHRoZSBjb21taXQgbWVzc2FnZSBmb3IgeW91ciBjaGFuZ2VzLlxuIgorCQkJIiMgKENvbW1lbnQgbGluZXMgc3RhcnRpbmcgd2l0aCAnIycgd2lsbCAiKTsKKwkJaWYgKGNsZWFudXBfbW9kZSA9PSBDTEVBTlVQX0FMTCkKKwkJCWZwcmludGYoZnAsICJub3QgYmUgaW5jbHVkZWQpXG4iKTsKKwkJZWxzZSAvKiBDTEVBTlVQX1NQQUNFLCB0aGF0IGlzLiAqLworCQkJZnByaW50ZihmcCwgImJlIGtlcHQuXG4iCisJCQkJIiMgWW91IGNhbiByZW1vdmUgdGhlbSB5b3Vyc2VsZiBpZiB5b3Ugd2FudCB0bylcbiIpOworCQlpZiAob25seV9pbmNsdWRlX2Fzc3VtZWQpCisJCQlmcHJpbnRmKGZwLCAiIyAlc1xuIiwgb25seV9pbmNsdWRlX2Fzc3VtZWQpOworCisJCXNhdmVkX2NvbG9yX3NldHRpbmcgPSB3dF9zdGF0dXNfdXNlX2NvbG9yOworCQl3dF9zdGF0dXNfdXNlX2NvbG9yID0gMDsKKwkJY29tbWl0YWJsZSA9IHJ1bl9zdGF0dXMoZnAsIGluZGV4X2ZpbGUsIHByZWZpeCwgMSk7CisJCXd0X3N0YXR1c191c2VfY29sb3IgPSBzYXZlZF9jb2xvcl9zZXR0aW5nOworCX0gZWxzZSB7CisJCXN0cnVjdCByZXZfaW5mbyByZXY7CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCWNvbnN0IGNoYXIgKnBhcmVudCA9ICJIRUFEIjsKKworCQlpZiAoIWFjdGl2ZV9uciAmJiByZWFkX2NhY2hlKCkgPCAwKQorCQkJZGllKCJDYW5ub3QgcmVhZCBpbmRleCIpOworCisJCWlmIChhbWVuZCkKKwkJCXBhcmVudCA9ICJIRUFEXjEiOworCisJCWlmIChnZXRfc2hhMShwYXJlbnQsIHNoYTEpKQorCQkJY29tbWl0YWJsZSA9ICEhYWN0aXZlX25yOworCQllbHNlIHsKKwkJCWluaXRfcmV2aXNpb25zKCZyZXYsICIiKTsKKwkJCXJldi5hYmJyZXYgPSAwOworCQkJc2V0dXBfcmV2aXNpb25zKDAsIE5VTEwsICZyZXYsIHBhcmVudCk7CisJCQlESUZGX09QVF9TRVQoJnJldi5kaWZmb3B0LCBRVUlFVCk7CisJCQlESUZGX09QVF9TRVQoJnJldi5kaWZmb3B0LCBFWElUX1dJVEhfU1RBVFVTKTsKKwkJCXJ1bl9kaWZmX2luZGV4KCZyZXYsIDEgLyogY2FjaGVkICovKTsKKworCQkJY29tbWl0YWJsZSA9ICEhRElGRl9PUFRfVFNUKCZyZXYuZGlmZm9wdCwgSEFTX0NIQU5HRVMpOworCQl9CisJfQorCisJZmNsb3NlKGZwKTsKKworCWlmICghY29tbWl0YWJsZSAmJiAhaW5fbWVyZ2UgJiYgIWFsbG93X2VtcHR5ICYmCisJICAgICEoYW1lbmQgJiYgaXNfYV9tZXJnZShoZWFkX3NoYTEpKSkgeworCQlydW5fc3RhdHVzKHN0ZG91dCwgaW5kZXhfZmlsZSwgcHJlZml4LCAwKTsKKwkJdW5saW5rKGNvbW1pdF9lZGl0bXNnKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBSZS1yZWFkIHRoZSBpbmRleCBhcyBwcmUtY29tbWl0IGhvb2sgY291bGQgaGF2ZSB1cGRhdGVkIGl0LAorCSAqIGFuZCB3cml0ZSBpdCBvdXQgYXMgYSB0cmVlLiAgV2UgbXVzdCBkbyB0aGlzIGJlZm9yZSB3ZSBpbnZva2UKKwkgKiB0aGUgZWRpdG9yIGFuZCBhZnRlciB3ZSBpbnZva2UgcnVuX3N0YXR1cyBhYm92ZS4KKwkgKi8KKwlkaXNjYXJkX2NhY2hlKCk7CisJcmVhZF9jYWNoZV9mcm9tKGluZGV4X2ZpbGUpOworCWlmICghYWN0aXZlX2NhY2hlX3RyZWUpCisJCWFjdGl2ZV9jYWNoZV90cmVlID0gY2FjaGVfdHJlZSgpOworCWlmIChjYWNoZV90cmVlX3VwZGF0ZShhY3RpdmVfY2FjaGVfdHJlZSwKKwkJCSAgICAgIGFjdGl2ZV9jYWNoZSwgYWN0aXZlX25yLCAwLCAwKSA8IDApIHsKKwkJZXJyb3IoIkVycm9yIGJ1aWxkaW5nIHRyZWVzIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChydW5faG9vayhpbmRleF9maWxlLCAicHJlcGFyZS1jb21taXQtbXNnIiwKKwkJICAgICBnaXRfcGF0aChjb21taXRfZWRpdG1zZyksIGhvb2tfYXJnMSwgaG9va19hcmcyLCBOVUxMKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAodXNlX2VkaXRvcikgeworCQljaGFyIGluZGV4W1BBVEhfTUFYXTsKKwkJY29uc3QgY2hhciAqZW52WzJdID0geyBpbmRleCwgTlVMTCB9OworCQlzbnByaW50ZihpbmRleCwgc2l6ZW9mKGluZGV4KSwgIkdJVF9JTkRFWF9GSUxFPSVzIiwgaW5kZXhfZmlsZSk7CisJCWxhdW5jaF9lZGl0b3IoZ2l0X3BhdGgoY29tbWl0X2VkaXRtc2cpLCBOVUxMLCBlbnYpOworCX0KKworCWlmICghbm9fdmVyaWZ5ICYmCisJICAgIHJ1bl9ob29rKGluZGV4X2ZpbGUsICJjb21taXQtbXNnIiwgZ2l0X3BhdGgoY29tbWl0X2VkaXRtc2cpLCBOVUxMKSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEZpbmQgb3V0IGlmIHRoZSBtZXNzYWdlIHN0YXJ0aW5nIGF0IHBvc2l0aW9uICdzdGFydCcgaW4gdGhlIHN0cmJ1ZgorICogY29udGFpbnMgb25seSB3aGl0ZXNwYWNlIGFuZCBTaWduZWQtb2ZmLWJ5IGxpbmVzLgorICovCitzdGF0aWMgaW50IG1lc3NhZ2VfaXNfZW1wdHkoc3RydWN0IHN0cmJ1ZiAqc2IsIGludCBzdGFydCkKK3sKKwlzdHJ1Y3Qgc3RyYnVmIHRtcGw7CisJY29uc3QgY2hhciAqbmw7CisJaW50IGVvbCwgaTsKKworCWlmIChjbGVhbnVwX21vZGUgPT0gQ0xFQU5VUF9OT05FICYmIHNiLT5sZW4pCisJCXJldHVybiAwOworCisJLyogU2VlIGlmIHRoZSB0ZW1wbGF0ZSBpcyBqdXN0IGEgcHJlZml4IG9mIHRoZSBtZXNzYWdlLiAqLworCXN0cmJ1Zl9pbml0KCZ0bXBsLCAwKTsKKwlpZiAodGVtcGxhdGVfZmlsZSAmJiBzdHJidWZfcmVhZF9maWxlKCZ0bXBsLCB0ZW1wbGF0ZV9maWxlLCAwKSA+IDApIHsKKwkJc3RyaXBzcGFjZSgmdG1wbCwgY2xlYW51cF9tb2RlID09IENMRUFOVVBfQUxMKTsKKwkJaWYgKHN0YXJ0ICsgdG1wbC5sZW4gPD0gc2ItPmxlbiAmJgorCQkgICAgbWVtY21wKHRtcGwuYnVmLCBzYi0+YnVmICsgc3RhcnQsIHRtcGwubGVuKSA9PSAwKQorCQkJc3RhcnQgKz0gdG1wbC5sZW47CisJfQorCXN0cmJ1Zl9yZWxlYXNlKCZ0bXBsKTsKKworCS8qIENoZWNrIGlmIHRoZSByZXN0IGlzIGp1c3Qgd2hpdGVzcGFjZSBhbmQgU2lnbmVkLW9mLWJ5J3MuICovCisJZm9yIChpID0gc3RhcnQ7IGkgPCBzYi0+bGVuOyBpKyspIHsKKwkJbmwgPSBtZW1jaHIoc2ItPmJ1ZiArIGksICdcbicsIHNiLT5sZW4gLSBpKTsKKwkJaWYgKG5sKQorCQkJZW9sID0gbmwgLSBzYi0+YnVmOworCQllbHNlCisJCQllb2wgPSBzYi0+bGVuOworCisJCWlmIChzdHJsZW4oc2lnbl9vZmZfaGVhZGVyKSA8PSBlb2wgLSBpICYmCisJCSAgICAhcHJlZml4Y21wKHNiLT5idWYgKyBpLCBzaWduX29mZl9oZWFkZXIpKSB7CisJCQlpID0gZW9sOworCQkJY29udGludWU7CisJCX0KKwkJd2hpbGUgKGkgPCBlb2wpCisJCQlpZiAoIWlzc3BhY2Uoc2ItPmJ1ZltpKytdKSkKKwkJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZGV0ZXJtaW5lX2F1dGhvcl9pbmZvKHN0cnVjdCBzdHJidWYgKnNiKQoreworCWNoYXIgKm5hbWUsICplbWFpbCwgKmRhdGU7CisKKwluYW1lID0gZ2V0ZW52KCJHSVRfQVVUSE9SX05BTUUiKTsKKwllbWFpbCA9IGdldGVudigiR0lUX0FVVEhPUl9FTUFJTCIpOworCWRhdGUgPSBnZXRlbnYoIkdJVF9BVVRIT1JfREFURSIpOworCisJaWYgKHVzZV9tZXNzYWdlKSB7CisJCWNvbnN0IGNoYXIgKmEsICpsYiwgKnJiLCAqZW9sOworCisJCWEgPSBzdHJzdHIodXNlX21lc3NhZ2VfYnVmZmVyLCAiXG5hdXRob3IgIik7CisJCWlmICghYSkKKwkJCWRpZSgiaW52YWxpZCBjb21taXQ6ICVzIiwgdXNlX21lc3NhZ2UpOworCisJCWxiID0gc3Ryc3RyKGEgKyA4LCAiIDwiKTsKKwkJcmIgPSBzdHJzdHIoYSArIDgsICI+ICIpOworCQllb2wgPSBzdHJjaHIoYSArIDgsICdcbicpOworCQlpZiAoIWxiIHx8ICFyYiB8fCAhZW9sKQorCQkJZGllKCJpbnZhbGlkIGNvbW1pdDogJXMiLCB1c2VfbWVzc2FnZSk7CisKKwkJbmFtZSA9IHhzdHJuZHVwKGEgKyA4LCBsYiAtIChhICsgOCkpOworCQllbWFpbCA9IHhzdHJuZHVwKGxiICsgMiwgcmIgLSAobGIgKyAyKSk7CisJCWRhdGUgPSB4c3RybmR1cChyYiArIDIsIGVvbCAtIChyYiArIDIpKTsKKwl9CisKKwlpZiAoZm9yY2VfYXV0aG9yKSB7CisJCWNvbnN0IGNoYXIgKmxiID0gc3Ryc3RyKGZvcmNlX2F1dGhvciwgIiA8Iik7CisJCWNvbnN0IGNoYXIgKnJiID0gc3RyY2hyKGZvcmNlX2F1dGhvciwgJz4nKTsKKworCQlpZiAoIWxiIHx8ICFyYikKKwkJCWRpZSgibWFsZm9ybWVkIC0tYXV0aG9yIHBhcmFtZXRlciIpOworCQluYW1lID0geHN0cm5kdXAoZm9yY2VfYXV0aG9yLCBsYiAtIGZvcmNlX2F1dGhvcik7CisJCWVtYWlsID0geHN0cm5kdXAobGIgKyAyLCByYiAtIChsYiArIDIpKTsKKwl9CisKKwlzdHJidWZfYWRkZihzYiwgImF1dGhvciAlc1xuIiwgZm10X2lkZW50KG5hbWUsIGVtYWlsLCBkYXRlLCBJREVOVF9FUlJPUl9PTl9OT19OQU1FKSk7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfYW5kX3ZhbGlkYXRlX29wdGlvbnMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSwKKwkJCQkgICAgICBjb25zdCBjaGFyICogY29uc3QgdXNhZ2VbXSkKK3sKKwlpbnQgZiA9IDA7CisKKwlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBidWlsdGluX2NvbW1pdF9vcHRpb25zLCB1c2FnZSwgMCk7CisKKwlpZiAobG9nZmlsZSB8fCBtZXNzYWdlLmxlbiB8fCB1c2VfbWVzc2FnZSkKKwkJdXNlX2VkaXRvciA9IDA7CisJaWYgKGVkaXRfZmxhZykKKwkJdXNlX2VkaXRvciA9IDE7CisJaWYgKCF1c2VfZWRpdG9yKQorCQlzZXRlbnYoIkdJVF9FRElUT1IiLCAiOiIsIDEpOworCisJaWYgKGdldF9zaGExKCJIRUFEIiwgaGVhZF9zaGExKSkKKwkJaW5pdGlhbF9jb21taXQgPSAxOworCisJaWYgKCFnZXRfc2hhMSgiTUVSR0VfSEVBRCIsIG1lcmdlX2hlYWRfc2hhMSkpCisJCWluX21lcmdlID0gMTsKKworCS8qIFNhbml0eSBjaGVjayBvcHRpb25zICovCisJaWYgKGFtZW5kICYmIGluaXRpYWxfY29tbWl0KQorCQlkaWUoIllvdSBoYXZlIG5vdGhpbmcgdG8gYW1lbmQuIik7CisJaWYgKGFtZW5kICYmIGluX21lcmdlKQorCQlkaWUoIllvdSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIG1lcmdlIC0tIGNhbm5vdCBhbWVuZC4iKTsKKworCWlmICh1c2VfbWVzc2FnZSkKKwkJZisrOworCWlmIChlZGl0X21lc3NhZ2UpCisJCWYrKzsKKwlpZiAobG9nZmlsZSkKKwkJZisrOworCWlmIChmID4gMSkKKwkJZGllKCJPbmx5IG9uZSBvZiAtYy8tQy8tRiBjYW4gYmUgdXNlZC4iKTsKKwlpZiAobWVzc2FnZS5sZW4gJiYgZiA+IDApCisJCWRpZSgiT3B0aW9uIC1tIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIC1jLy1DLy1GLiIpOworCWlmIChlZGl0X21lc3NhZ2UpCisJCXVzZV9tZXNzYWdlID0gZWRpdF9tZXNzYWdlOworCWlmIChhbWVuZCAmJiAhdXNlX21lc3NhZ2UpCisJCXVzZV9tZXNzYWdlID0gIkhFQUQiOworCWlmICh1c2VfbWVzc2FnZSkgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQlzdGF0aWMgY2hhciB1dGY4W10gPSAiVVRGLTgiOworCQljb25zdCBjaGFyICpvdXRfZW5jOworCQljaGFyICplbmMsICplbmQ7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKworCQlpZiAoZ2V0X3NoYTEodXNlX21lc3NhZ2UsIHNoYTEpKQorCQkJZGllKCJjb3VsZCBub3QgbG9va3VwIGNvbW1pdCAlcyIsIHVzZV9tZXNzYWdlKTsKKwkJY29tbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2Uoc2hhMSk7CisJCWlmICghY29tbWl0IHx8IHBhcnNlX2NvbW1pdChjb21taXQpKQorCQkJZGllKCJjb3VsZCBub3QgcGFyc2UgY29tbWl0ICVzIiwgdXNlX21lc3NhZ2UpOworCisJCWVuYyA9IHN0cnN0cihjb21taXQtPmJ1ZmZlciwgIlxuZW5jb2RpbmciKTsKKwkJaWYgKGVuYykgeworCQkJZW5kID0gc3RyY2hyKGVuYyArIDEwLCAnXG4nKTsKKwkJCWVuYyA9IHhzdHJuZHVwKGVuYyArIDEwLCBlbmQgLSAoZW5jICsgMTApKTsKKwkJfSBlbHNlIHsKKwkJCWVuYyA9IHV0Zjg7CisJCX0KKwkJb3V0X2VuYyA9IGdpdF9jb21taXRfZW5jb2RpbmcgPyBnaXRfY29tbWl0X2VuY29kaW5nIDogdXRmODsKKworCQlpZiAoc3RyY21wKG91dF9lbmMsIGVuYykpCisJCQl1c2VfbWVzc2FnZV9idWZmZXIgPQorCQkJCXJlZW5jb2RlX3N0cmluZyhjb21taXQtPmJ1ZmZlciwgb3V0X2VuYywgZW5jKTsKKworCQkvKgorCQkgKiBJZiB3ZSBmYWlsZWQgdG8gcmVlbmNvZGUgdGhlIGJ1ZmZlciwganVzdCBjb3B5IGl0CisJCSAqIGJ5dGUgZm9yIGJ5dGUgc28gdGhlIHVzZXIgY2FuIHRyeSB0byBmaXggaXQgdXAuCisJCSAqIFRoaXMgYWxzbyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGlucHV0IGFuZCBvdXRwdXQKKwkJICogZW5jb2RpbmdzIGFyZSBpZGVudGljYWwuCisJCSAqLworCQlpZiAodXNlX21lc3NhZ2VfYnVmZmVyID09IE5VTEwpCisJCQl1c2VfbWVzc2FnZV9idWZmZXIgPSB4c3RyZHVwKGNvbW1pdC0+YnVmZmVyKTsKKwkJaWYgKGVuYyAhPSB1dGY4KQorCQkJZnJlZShlbmMpOworCX0KKworCWlmICghIWFsc28gKyAhIW9ubHkgKyAhIWFsbCArICEhaW50ZXJhY3RpdmUgPiAxKQorCQlkaWUoIk9ubHkgb25lIG9mIC0taW5jbHVkZS8tLW9ubHkvLS1hbGwvLS1pbnRlcmFjdGl2ZSBjYW4gYmUgdXNlZC4iKTsKKwlpZiAoYXJnYyA9PSAwICYmIChhbHNvIHx8IChvbmx5ICYmICFhbWVuZCkpKQorCQlkaWUoIk5vIHBhdGhzIHdpdGggLS1pbmNsdWRlLy0tb25seSBkb2VzIG5vdCBtYWtlIHNlbnNlLiIpOworCWlmIChhcmdjID09IDAgJiYgb25seSAmJiBhbWVuZCkKKwkJb25seV9pbmNsdWRlX2Fzc3VtZWQgPSAiQ2xldmVyLi4uIGFtZW5kaW5nIHRoZSBsYXN0IG9uZSB3aXRoIGRpcnR5IGluZGV4LiI7CisJaWYgKGFyZ2MgPiAwICYmICFhbHNvICYmICFvbmx5KSB7CisJCW9ubHlfaW5jbHVkZV9hc3N1bWVkID0gIkV4cGxpY2l0IHBhdGhzIHNwZWNpZmllZCB3aXRob3V0IC1pIG5vciAtbzsgYXNzdW1pbmcgLS1vbmx5IHBhdGhzLi4uIjsKKwkJYWxzbyA9IDA7CisJfQorCWlmICghY2xlYW51cF9hcmcgfHwgIXN0cmNtcChjbGVhbnVwX2FyZywgImRlZmF1bHQiKSkKKwkJY2xlYW51cF9tb2RlID0gdXNlX2VkaXRvciA/IENMRUFOVVBfQUxMIDogQ0xFQU5VUF9TUEFDRTsKKwllbHNlIGlmICghc3RyY21wKGNsZWFudXBfYXJnLCAidmVyYmF0aW0iKSkKKwkJY2xlYW51cF9tb2RlID0gQ0xFQU5VUF9OT05FOworCWVsc2UgaWYgKCFzdHJjbXAoY2xlYW51cF9hcmcsICJ3aGl0ZXNwYWNlIikpCisJCWNsZWFudXBfbW9kZSA9IENMRUFOVVBfU1BBQ0U7CisJZWxzZSBpZiAoIXN0cmNtcChjbGVhbnVwX2FyZywgInN0cmlwIikpCisJCWNsZWFudXBfbW9kZSA9IENMRUFOVVBfQUxMOworCWVsc2UKKwkJZGllKCJJbnZhbGlkIGNsZWFudXAgbW9kZSAlcyIsIGNsZWFudXBfYXJnKTsKKworCWlmIChhbGwgJiYgYXJnYyA+IDApCisJCWRpZSgiUGF0aHMgd2l0aCAtYSBkb2VzIG5vdCBtYWtlIHNlbnNlLiIpOworCWVsc2UgaWYgKGludGVyYWN0aXZlICYmIGFyZ2MgPiAwKQorCQlkaWUoIlBhdGhzIHdpdGggLS1pbnRlcmFjdGl2ZSBkb2VzIG5vdCBtYWtlIHNlbnNlLiIpOworCisJcmV0dXJuIGFyZ2M7Cit9CisKK2ludCBjbWRfc3RhdHVzKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWNvbnN0IGNoYXIgKmluZGV4X2ZpbGU7CisJaW50IGNvbW1pdGFibGU7CisKKwlnaXRfY29uZmlnKGdpdF9zdGF0dXNfY29uZmlnKTsKKworCWlmICh3dF9zdGF0dXNfdXNlX2NvbG9yID09IC0xKQorCQl3dF9zdGF0dXNfdXNlX2NvbG9yID0gZ2l0X3VzZV9jb2xvcl9kZWZhdWx0OworCisJYXJnYyA9IHBhcnNlX2FuZF92YWxpZGF0ZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIGJ1aWx0aW5fc3RhdHVzX3VzYWdlKTsKKworCWluZGV4X2ZpbGUgPSBwcmVwYXJlX2luZGV4KGFyZ2MsIGFyZ3YsIHByZWZpeCk7CisKKwljb21taXRhYmxlID0gcnVuX3N0YXR1cyhzdGRvdXQsIGluZGV4X2ZpbGUsIHByZWZpeCwgMCk7CisKKwlyb2xsYmFja19pbmRleF9maWxlcygpOworCisJcmV0dXJuIGNvbW1pdGFibGUgPyAwIDogMTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc3VtbWFyeShjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHJldl9pbmZvIHJldjsKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisKKwljb21taXQgPSBsb29rdXBfY29tbWl0KHNoYTEpOworCWlmICghY29tbWl0KQorCQlkaWUoImNvdWxkbid0IGxvb2sgdXAgbmV3bHkgY3JlYXRlZCBjb21taXQiKTsKKwlpZiAoIWNvbW1pdCB8fCBwYXJzZV9jb21taXQoY29tbWl0KSkKKwkJZGllKCJjb3VsZCBub3QgcGFyc2UgbmV3bHkgY3JlYXRlZCBjb21taXQiKTsKKworCWluaXRfcmV2aXNpb25zKCZyZXYsIHByZWZpeCk7CisJc2V0dXBfcmV2aXNpb25zKDAsIE5VTEwsICZyZXYsIE5VTEwpOworCisJcmV2LmFiYnJldiA9IDA7CisJcmV2LmRpZmYgPSAxOworCXJldi5kaWZmb3B0Lm91dHB1dF9mb3JtYXQgPQorCQlESUZGX0ZPUk1BVF9TSE9SVFNUQVQgfCBESUZGX0ZPUk1BVF9TVU1NQVJZOworCisJcmV2LnZlcmJvc2VfaGVhZGVyID0gMTsKKwlyZXYuc2hvd19yb290X2RpZmYgPSAxOworCXJldi5jb21taXRfZm9ybWF0ID0gZ2V0X2NvbW1pdF9mb3JtYXQoImZvcm1hdDolaDogJXMiKTsKKwlyZXYuYWx3YXlzX3Nob3dfaGVhZGVyID0gMDsKKwlyZXYuZGlmZm9wdC5kZXRlY3RfcmVuYW1lID0gMTsKKwlyZXYuZGlmZm9wdC5yZW5hbWVfbGltaXQgPSAxMDA7CisJcmV2LmRpZmZvcHQuYnJlYWtfb3B0ID0gMDsKKwlkaWZmX3NldHVwX2RvbmUoJnJldi5kaWZmb3B0KTsKKworCXByaW50ZigiQ3JlYXRlZCAlc2NvbW1pdCAiLCBpbml0aWFsX2NvbW1pdCA/ICJpbml0aWFsICIgOiAiIik7CisKKwlpZiAoIWxvZ190cmVlX2NvbW1pdCgmcmV2LCBjb21taXQpKSB7CisJCXN0cnVjdCBzdHJidWYgYnVmID0gU1RSQlVGX0lOSVQ7CisJCWZvcm1hdF9jb21taXRfbWVzc2FnZShjb21taXQsICIlaDogJXMiLCAmYnVmKTsKKwkJcHJpbnRmKCIlc1xuIiwgYnVmLmJ1Zik7CisJCXN0cmJ1Zl9yZWxlYXNlKCZidWYpOworCX0KK30KKworaW50IGdpdF9jb21taXRfY29uZmlnKGNvbnN0IGNoYXIgKmssIGNvbnN0IGNoYXIgKnYpCit7CisJaWYgKCFzdHJjbXAoaywgImNvbW1pdC50ZW1wbGF0ZSIpKSB7CisJCWlmICghdikKKwkJCXJldHVybiBjb25maWdfZXJyb3Jfbm9uYm9vbCh2KTsKKwkJdGVtcGxhdGVfZmlsZSA9IHhzdHJkdXAodik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBnaXRfc3RhdHVzX2NvbmZpZyhrLCB2KTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgY29tbWl0X3V0Zjhfd2FybltdID0KKyJXYXJuaW5nOiBjb21taXQgbWVzc2FnZSBkb2VzIG5vdCBjb25mb3JtIHRvIFVURi04LlxuIgorIllvdSBtYXkgd2FudCB0byBhbWVuZCBpdCBhZnRlciBmaXhpbmcgdGhlIG1lc3NhZ2UsIG9yIHNldCB0aGUgY29uZmlnXG4iCisidmFyaWFibGUgaTE4bi5jb21taXRlbmNvZGluZyB0byB0aGUgZW5jb2RpbmcgeW91ciBwcm9qZWN0IHVzZXMuXG4iOworCitzdGF0aWMgdm9pZCBhZGRfcGFyZW50KHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBvYmplY3QgKm9iaiA9IHBhcnNlX29iamVjdChzaGExKTsKKwljb25zdCBjaGFyICpwYXJlbnQgPSBzaGExX3RvX2hleChzaGExKTsKKwlpZiAoIW9iaikKKwkJZGllKCJVbmFibGUgdG8gZmluZCBjb21taXQgcGFyZW50ICVzIiwgcGFyZW50KTsKKwlpZiAob2JqLT50eXBlICE9IE9CSl9DT01NSVQpCisJCWRpZSgiUGFyZW50ICVzIGlzbid0IGEgcHJvcGVyIGNvbW1pdCIsIHBhcmVudCk7CisJc3RyYnVmX2FkZGYoc2IsICJwYXJlbnQgJXNcbiIsIHBhcmVudCk7Cit9CisKK2ludCBjbWRfY29tbWl0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBoZWFkZXJfbGVuOworCXN0cnVjdCBzdHJidWYgc2I7CisJY29uc3QgY2hhciAqaW5kZXhfZmlsZSwgKnJlZmxvZ19tc2c7CisJY2hhciAqbmwsICpwOworCXVuc2lnbmVkIGNoYXIgY29tbWl0X3NoYTFbMjBdOworCXN0cnVjdCByZWZfbG9jayAqcmVmX2xvY2s7CisKKwlnaXRfY29uZmlnKGdpdF9jb21taXRfY29uZmlnKTsKKworCWFyZ2MgPSBwYXJzZV9hbmRfdmFsaWRhdGVfb3B0aW9ucyhhcmdjLCBhcmd2LCBidWlsdGluX2NvbW1pdF91c2FnZSk7CisKKwlpbmRleF9maWxlID0gcHJlcGFyZV9pbmRleChhcmdjLCBhcmd2LCBwcmVmaXgpOworCisJLyogU2V0IHVwIGV2ZXJ5dGhpbmcgZm9yIHdyaXRpbmcgdGhlIGNvbW1pdCBvYmplY3QuICBUaGlzIGluY2x1ZGVzCisJICAgcnVubmluZyBob29rcywgd3JpdGluZyB0aGUgdHJlZXMsIGFuZCBpbnRlcmFjdGluZyB3aXRoIHRoZSB1c2VyLiAgKi8KKwlpZiAoIXByZXBhcmVfdG9fY29tbWl0KGluZGV4X2ZpbGUsIHByZWZpeCkpIHsKKwkJcm9sbGJhY2tfaW5kZXhfZmlsZXMoKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyoKKwkgKiBUaGUgY29tbWl0IG9iamVjdAorCSAqLworCXN0cmJ1Zl9pbml0KCZzYiwgMCk7CisJc3RyYnVmX2FkZGYoJnNiLCAidHJlZSAlc1xuIiwKKwkJICAgIHNoYTFfdG9faGV4KGFjdGl2ZV9jYWNoZV90cmVlLT5zaGExKSk7CisKKwkvKiBEZXRlcm1pbmUgcGFyZW50cyAqLworCWlmIChpbml0aWFsX2NvbW1pdCkgeworCQlyZWZsb2dfbXNnID0gImNvbW1pdCAoaW5pdGlhbCkiOworCX0gZWxzZSBpZiAoYW1lbmQpIHsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICpjOworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisKKwkJcmVmbG9nX21zZyA9ICJjb21taXQgKGFtZW5kKSI7CisJCWNvbW1pdCA9IGxvb2t1cF9jb21taXQoaGVhZF9zaGExKTsKKwkJaWYgKCFjb21taXQgfHwgcGFyc2VfY29tbWl0KGNvbW1pdCkpCisJCQlkaWUoImNvdWxkIG5vdCBwYXJzZSBIRUFEIGNvbW1pdCIpOworCisJCWZvciAoYyA9IGNvbW1pdC0+cGFyZW50czsgYzsgYyA9IGMtPm5leHQpCisJCQlhZGRfcGFyZW50KCZzYiwgYy0+aXRlbS0+b2JqZWN0LnNoYTEpOworCX0gZWxzZSBpZiAoaW5fbWVyZ2UpIHsKKwkJc3RydWN0IHN0cmJ1ZiBtOworCQlGSUxFICpmcDsKKworCQlyZWZsb2dfbXNnID0gImNvbW1pdCAobWVyZ2UpIjsKKwkJYWRkX3BhcmVudCgmc2IsIGhlYWRfc2hhMSk7CisJCXN0cmJ1Zl9pbml0KCZtLCAwKTsKKwkJZnAgPSBmb3BlbihnaXRfcGF0aCgiTUVSR0VfSEVBRCIpLCAiciIpOworCQlpZiAoZnAgPT0gTlVMTCkKKwkJCWRpZSgiY291bGQgbm90IG9wZW4gJXMgZm9yIHJlYWRpbmc6ICVzIiwKKwkJCSAgICBnaXRfcGF0aCgiTUVSR0VfSEVBRCIpLCBzdHJlcnJvcihlcnJubykpOworCQl3aGlsZSAoc3RyYnVmX2dldGxpbmUoJm0sIGZwLCAnXG4nKSAhPSBFT0YpIHsKKwkJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCQlpZiAoZ2V0X3NoYTFfaGV4KG0uYnVmLCBzaGExKSA8IDApCisJCQkJZGllKCJDb3JydXB0IE1FUkdFX0hFQUQgZmlsZSAoJXMpIiwgbS5idWYpOworCQkJYWRkX3BhcmVudCgmc2IsIHNoYTEpOworCQl9CisJCWZjbG9zZShmcCk7CisJCXN0cmJ1Zl9yZWxlYXNlKCZtKTsKKwl9IGVsc2UgeworCQlyZWZsb2dfbXNnID0gImNvbW1pdCI7CisJCXN0cmJ1Zl9hZGRmKCZzYiwgInBhcmVudCAlc1xuIiwgc2hhMV90b19oZXgoaGVhZF9zaGExKSk7CisJfQorCisJZGV0ZXJtaW5lX2F1dGhvcl9pbmZvKCZzYik7CisJc3RyYnVmX2FkZGYoJnNiLCAiY29tbWl0dGVyICVzXG4iLCBnaXRfY29tbWl0dGVyX2luZm8oSURFTlRfRVJST1JfT05fTk9fTkFNRSkpOworCWlmICghaXNfZW5jb2RpbmdfdXRmOChnaXRfY29tbWl0X2VuY29kaW5nKSkKKwkJc3RyYnVmX2FkZGYoJnNiLCAiZW5jb2RpbmcgJXNcbiIsIGdpdF9jb21taXRfZW5jb2RpbmcpOworCXN0cmJ1Zl9hZGRjaCgmc2IsICdcbicpOworCisJLyogRmluYWxseSwgZ2V0IHRoZSBjb21taXQgbWVzc2FnZSAqLworCWhlYWRlcl9sZW4gPSBzYi5sZW47CisJaWYgKHN0cmJ1Zl9yZWFkX2ZpbGUoJnNiLCBnaXRfcGF0aChjb21taXRfZWRpdG1zZyksIDApIDwgMCkgeworCQlyb2xsYmFja19pbmRleF9maWxlcygpOworCQlkaWUoImNvdWxkIG5vdCByZWFkIGNvbW1pdCBtZXNzYWdlIik7CisJfQorCisJLyogVHJ1bmNhdGUgdGhlIG1lc3NhZ2UganVzdCBiZWZvcmUgdGhlIGRpZmYsIGlmIGFueS4gKi8KKwlwID0gc3Ryc3RyKHNiLmJ1ZiwgIlxuZGlmZiAtLWdpdCBhLyIpOworCWlmIChwICE9IE5VTEwpCisJCXN0cmJ1Zl9zZXRsZW4oJnNiLCBwIC0gc2IuYnVmICsgMSk7CisKKwlpZiAoY2xlYW51cF9tb2RlICE9IENMRUFOVVBfTk9ORSkKKwkJc3RyaXBzcGFjZSgmc2IsIGNsZWFudXBfbW9kZSA9PSBDTEVBTlVQX0FMTCk7CisJaWYgKHNiLmxlbiA8IGhlYWRlcl9sZW4gfHwgbWVzc2FnZV9pc19lbXB0eSgmc2IsIGhlYWRlcl9sZW4pKSB7CisJCXJvbGxiYWNrX2luZGV4X2ZpbGVzKCk7CisJCWRpZSgibm8gY29tbWl0IG1lc3NhZ2U/ICBhYm9ydGluZyBjb21taXQuIik7CisJfQorCXN0cmJ1Zl9hZGRjaCgmc2IsICdcMCcpOworCWlmIChpc19lbmNvZGluZ191dGY4KGdpdF9jb21taXRfZW5jb2RpbmcpICYmICFpc191dGY4KHNiLmJ1ZikpCisJCWZwcmludGYoc3RkZXJyLCBjb21taXRfdXRmOF93YXJuKTsKKworCWlmICh3cml0ZV9zaGExX2ZpbGUoc2IuYnVmLCBzYi5sZW4gLSAxLCBjb21taXRfdHlwZSwgY29tbWl0X3NoYTEpKSB7CisJCXJvbGxiYWNrX2luZGV4X2ZpbGVzKCk7CisJCWRpZSgiZmFpbGVkIHRvIHdyaXRlIGNvbW1pdCBvYmplY3QiKTsKKwl9CisKKwlyZWZfbG9jayA9IGxvY2tfYW55X3JlZl9mb3JfdXBkYXRlKCJIRUFEIiwKKwkJCQkJICAgaW5pdGlhbF9jb21taXQgPyBOVUxMIDogaGVhZF9zaGExLAorCQkJCQkgICAwKTsKKworCW5sID0gc3RyY2hyKHNiLmJ1ZiArIGhlYWRlcl9sZW4sICdcbicpOworCWlmIChubCkKKwkJc3RyYnVmX3NldGxlbigmc2IsIG5sICsgMSAtIHNiLmJ1Zik7CisJZWxzZQorCQlzdHJidWZfYWRkY2goJnNiLCAnXG4nKTsKKwlzdHJidWZfcmVtb3ZlKCZzYiwgMCwgaGVhZGVyX2xlbik7CisJc3RyYnVmX2luc2VydCgmc2IsIDAsIHJlZmxvZ19tc2csIHN0cmxlbihyZWZsb2dfbXNnKSk7CisJc3RyYnVmX2luc2VydCgmc2IsIHN0cmxlbihyZWZsb2dfbXNnKSwgIjogIiwgMik7CisKKwlpZiAoIXJlZl9sb2NrKSB7CisJCXJvbGxiYWNrX2luZGV4X2ZpbGVzKCk7CisJCWRpZSgiY2Fubm90IGxvY2sgSEVBRCByZWYiKTsKKwl9CisJaWYgKHdyaXRlX3JlZl9zaGExKHJlZl9sb2NrLCBjb21taXRfc2hhMSwgc2IuYnVmKSA8IDApIHsKKwkJcm9sbGJhY2tfaW5kZXhfZmlsZXMoKTsKKwkJZGllKCJjYW5ub3QgdXBkYXRlIEhFQUQgcmVmIik7CisJfQorCisJdW5saW5rKGdpdF9wYXRoKCJNRVJHRV9IRUFEIikpOworCXVubGluayhnaXRfcGF0aCgiTUVSR0VfTVNHIikpOworCXVubGluayhnaXRfcGF0aCgiU1FVQVNIX01TRyIpKTsKKworCWlmIChjb21taXRfaW5kZXhfZmlsZXMoKSkKKwkJZGllICgiUmVwb3NpdG9yeSBoYXMgYmVlbiB1cGRhdGVkLCBidXQgdW5hYmxlIHRvIHdyaXRlXG4iCisJCSAgICAgIm5ld19pbmRleCBmaWxlLiBDaGVjayB0aGF0IGRpc2sgaXMgbm90IGZ1bGwgb3IgcXVvdGEgaXNcbiIKKwkJICAgICAibm90IGV4Y2VlZGVkLCBhbmQgdGhlbiBcImdpdCByZXNldCBIRUFEXCIgdG8gcmVjb3Zlci4iKTsKKworCXJlcmVyZSgpOworCXJ1bl9ob29rKGdldF9pbmRleF9maWxlKCksICJwb3N0LWNvbW1pdCIsIE5VTEwpOworCWlmICghcXVpZXQpCisJCXByaW50X3N1bW1hcnkocHJlZml4LCBjb21taXRfc2hhMSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tY29uZmlnLmMgYi9idWlsdGluLWNvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNGJjOGIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWNvbmZpZy5jCkBAIC0wLDAgKzEsNDA1IEBACisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29sb3IuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgZ2l0X2NvbmZpZ19zZXRfdXNhZ2VbXSA9CisiZ2l0LWNvbmZpZyBbIC0tZ2xvYmFsIHwgLS1zeXN0ZW0gfCBbIC1mIHwgLS1maWxlIF0gY29uZmlnLWZpbGUgXSBbIC0tYm9vbCB8IC0taW50IF0gWyAteiB8IC0tbnVsbCBdIFstLWdldCB8IC0tZ2V0LWFsbCB8IC0tZ2V0LXJlZ2V4cCB8IC0tcmVwbGFjZS1hbGwgfCAtLWFkZCB8IC0tdW5zZXQgfCAtLXVuc2V0LWFsbF0gbmFtZSBbdmFsdWUgW3ZhbHVlX3JlZ2V4XV0gfCAtLXJlbmFtZS1zZWN0aW9uIG9sZF9uYW1lIG5ld19uYW1lIHwgLS1yZW1vdmUtc2VjdGlvbiBuYW1lIHwgLS1saXN0IHwgLS1nZXQtY29sb3IgdmFyIFtkZWZhdWx0XSB8IC0tZ2V0LWNvbG9yYm9vbCBuYW1lIFtzdGRvdXQtaXMtdHR5XSI7CisKK3N0YXRpYyBjaGFyICprZXk7CitzdGF0aWMgcmVnZXhfdCAqa2V5X3JlZ2V4cDsKK3N0YXRpYyByZWdleF90ICpyZWdleHA7CitzdGF0aWMgaW50IHNob3dfa2V5czsKK3N0YXRpYyBpbnQgdXNlX2tleV9yZWdleHA7CitzdGF0aWMgaW50IGRvX2FsbDsKK3N0YXRpYyBpbnQgZG9fbm90X21hdGNoOworc3RhdGljIGludCBzZWVuOworc3RhdGljIGNoYXIgZGVsaW0gPSAnPSc7CitzdGF0aWMgY2hhciBrZXlfZGVsaW0gPSAnICc7CitzdGF0aWMgY2hhciB0ZXJtID0gJ1xuJzsKK3N0YXRpYyBlbnVtIHsgVF9SQVcsIFRfSU5ULCBUX0JPT0wgfSB0eXBlID0gVF9SQVc7CisKK3N0YXRpYyBpbnQgc2hvd19hbGxfY29uZmlnKGNvbnN0IGNoYXIgKmtleV8sIGNvbnN0IGNoYXIgKnZhbHVlXykKK3sKKwlpZiAodmFsdWVfKQorCQlwcmludGYoIiVzJWMlcyVjIiwga2V5XywgZGVsaW0sIHZhbHVlXywgdGVybSk7CisJZWxzZQorCQlwcmludGYoIiVzJWMiLCBrZXlfLCB0ZXJtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaG93X2NvbmZpZyhjb25zdCBjaGFyKiBrZXlfLCBjb25zdCBjaGFyKiB2YWx1ZV8pCit7CisJY2hhciB2YWx1ZVsyNTZdOworCWNvbnN0IGNoYXIgKnZwdHIgPSB2YWx1ZTsKKwlpbnQgZHVwX2Vycm9yID0gMDsKKworCWlmICghdXNlX2tleV9yZWdleHAgJiYgc3RyY21wKGtleV8sIGtleSkpCisJCXJldHVybiAwOworCWlmICh1c2Vfa2V5X3JlZ2V4cCAmJiByZWdleGVjKGtleV9yZWdleHAsIGtleV8sIDAsIE5VTEwsIDApKQorCQlyZXR1cm4gMDsKKwlpZiAocmVnZXhwICE9IE5VTEwgJiYKKwkgICAgKGRvX25vdF9tYXRjaCBeICEhcmVnZXhlYyhyZWdleHAsICh2YWx1ZV8/dmFsdWVfOiIiKSwgMCwgTlVMTCwgMCkpKQorCQlyZXR1cm4gMDsKKworCWlmIChzaG93X2tleXMpIHsKKwkJaWYgKHZhbHVlXykKKwkJCXByaW50ZigiJXMlYyIsIGtleV8sIGtleV9kZWxpbSk7CisJCWVsc2UKKwkJCXByaW50ZigiJXMiLCBrZXlfKTsKKwl9CisJaWYgKHNlZW4gJiYgIWRvX2FsbCkKKwkJZHVwX2Vycm9yID0gMTsKKwlpZiAodHlwZSA9PSBUX0lOVCkKKwkJc3ByaW50Zih2YWx1ZSwgIiVkIiwgZ2l0X2NvbmZpZ19pbnQoa2V5XywgdmFsdWVfP3ZhbHVlXzoiIikpOworCWVsc2UgaWYgKHR5cGUgPT0gVF9CT09MKQorCQl2cHRyID0gZ2l0X2NvbmZpZ19ib29sKGtleV8sIHZhbHVlXykgPyAidHJ1ZSIgOiAiZmFsc2UiOworCWVsc2UKKwkJdnB0ciA9IHZhbHVlXz92YWx1ZV86IiI7CisJc2VlbisrOworCWlmIChkdXBfZXJyb3IpIHsKKwkJZXJyb3IoIk1vcmUgdGhhbiBvbmUgdmFsdWUgZm9yIHRoZSBrZXkgJXM6ICVzIiwKKwkJCQlrZXlfLCB2cHRyKTsKKwl9CisJZWxzZQorCQlwcmludGYoIiVzJWMiLCB2cHRyLCB0ZXJtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF92YWx1ZShjb25zdCBjaGFyKiBrZXlfLCBjb25zdCBjaGFyKiByZWdleF8pCit7CisJaW50IHJldCA9IC0xOworCWNoYXIgKnRsOworCWNoYXIgKmdsb2JhbCA9IE5VTEwsICpyZXBvX2NvbmZpZyA9IE5VTEw7CisJY29uc3QgY2hhciAqc3lzdGVtX3dpZGUgPSBOVUxMLCAqbG9jYWw7CisKKwlsb2NhbCA9IGdldGVudihDT05GSUdfRU5WSVJPTk1FTlQpOworCWlmICghbG9jYWwpIHsKKwkJY29uc3QgY2hhciAqaG9tZSA9IGdldGVudigiSE9NRSIpOworCQlsb2NhbCA9IGdldGVudihDT05GSUdfTE9DQUxfRU5WSVJPTk1FTlQpOworCQlpZiAoIWxvY2FsKQorCQkJbG9jYWwgPSByZXBvX2NvbmZpZyA9IHhzdHJkdXAoZ2l0X3BhdGgoImNvbmZpZyIpKTsKKwkJaWYgKGdpdF9jb25maWdfZ2xvYmFsKCkgJiYgaG9tZSkKKwkJCWdsb2JhbCA9IHhzdHJkdXAobWtwYXRoKCIlcy8uZ2l0Y29uZmlnIiwgaG9tZSkpOworCQlpZiAoZ2l0X2NvbmZpZ19zeXN0ZW0oKSkKKwkJCXN5c3RlbV93aWRlID0gZ2l0X2V0Y19naXRjb25maWcoKTsKKwl9CisKKwlrZXkgPSB4c3RyZHVwKGtleV8pOworCWZvciAodGw9a2V5K3N0cmxlbihrZXkpLTE7IHRsID49IGtleSAmJiAqdGwgIT0gJy4nOyAtLXRsKQorCQkqdGwgPSB0b2xvd2VyKCp0bCk7CisJZm9yICh0bD1rZXk7ICp0bCAmJiAqdGwgIT0gJy4nOyArK3RsKQorCQkqdGwgPSB0b2xvd2VyKCp0bCk7CisKKwlpZiAodXNlX2tleV9yZWdleHApIHsKKwkJa2V5X3JlZ2V4cCA9IChyZWdleF90Kil4bWFsbG9jKHNpemVvZihyZWdleF90KSk7CisJCWlmIChyZWdjb21wKGtleV9yZWdleHAsIGtleSwgUkVHX0VYVEVOREVEKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGtleSBwYXR0ZXJuOiAlc1xuIiwga2V5Xyk7CisJCQlnb3RvIGZyZWVfc3RyaW5nczsKKwkJfQorCX0KKworCWlmIChyZWdleF8pIHsKKwkJaWYgKHJlZ2V4X1swXSA9PSAnIScpIHsKKwkJCWRvX25vdF9tYXRjaCA9IDE7CisJCQlyZWdleF8rKzsKKwkJfQorCisJCXJlZ2V4cCA9IChyZWdleF90Kil4bWFsbG9jKHNpemVvZihyZWdleF90KSk7CisJCWlmIChyZWdjb21wKHJlZ2V4cCwgcmVnZXhfLCBSRUdfRVhURU5ERUQpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgcGF0dGVybjogJXNcbiIsIHJlZ2V4Xyk7CisJCQlnb3RvIGZyZWVfc3RyaW5nczsKKwkJfQorCX0KKworCWlmIChkb19hbGwgJiYgc3lzdGVtX3dpZGUpCisJCWdpdF9jb25maWdfZnJvbV9maWxlKHNob3dfY29uZmlnLCBzeXN0ZW1fd2lkZSk7CisJaWYgKGRvX2FsbCAmJiBnbG9iYWwpCisJCWdpdF9jb25maWdfZnJvbV9maWxlKHNob3dfY29uZmlnLCBnbG9iYWwpOworCWdpdF9jb25maWdfZnJvbV9maWxlKHNob3dfY29uZmlnLCBsb2NhbCk7CisJaWYgKCFkb19hbGwgJiYgIXNlZW4gJiYgZ2xvYmFsKQorCQlnaXRfY29uZmlnX2Zyb21fZmlsZShzaG93X2NvbmZpZywgZ2xvYmFsKTsKKwlpZiAoIWRvX2FsbCAmJiAhc2VlbiAmJiBzeXN0ZW1fd2lkZSkKKwkJZ2l0X2NvbmZpZ19mcm9tX2ZpbGUoc2hvd19jb25maWcsIHN5c3RlbV93aWRlKTsKKworCWZyZWUoa2V5KTsKKwlpZiAocmVnZXhwKSB7CisJCXJlZ2ZyZWUocmVnZXhwKTsKKwkJZnJlZShyZWdleHApOworCX0KKworCWlmIChkb19hbGwpCisJCXJldCA9ICFzZWVuOworCWVsc2UKKwkJcmV0ID0gKHNlZW4gPT0gMSkgPyAwIDogc2VlbiA+IDEgPyAyIDogMTsKKworZnJlZV9zdHJpbmdzOgorCWZyZWUocmVwb19jb25maWcpOworCWZyZWUoZ2xvYmFsKTsKKwlyZXR1cm4gcmV0OworfQorCitjaGFyICpub3JtYWxpemVfdmFsdWUoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwljaGFyICpub3JtYWxpemVkOworCisJaWYgKCF2YWx1ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAodHlwZSA9PSBUX1JBVykKKwkJbm9ybWFsaXplZCA9IHhzdHJkdXAodmFsdWUpOworCWVsc2UgeworCQlub3JtYWxpemVkID0geG1hbGxvYyg2NCk7CisJCWlmICh0eXBlID09IFRfSU5UKSB7CisJCQlpbnQgdiA9IGdpdF9jb25maWdfaW50KGtleSwgdmFsdWUpOworCQkJc3ByaW50Zihub3JtYWxpemVkLCAiJWQiLCB2KTsKKwkJfQorCQllbHNlIGlmICh0eXBlID09IFRfQk9PTCkKKwkJCXNwcmludGYobm9ybWFsaXplZCwgIiVzIiwKKwkJCQlnaXRfY29uZmlnX2Jvb2woa2V5LCB2YWx1ZSkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKwl9CisKKwlyZXR1cm4gbm9ybWFsaXplZDsKK30KKworc3RhdGljIGludCBnZXRfY29sb3JfZm91bmQ7CitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2NvbG9yX3Nsb3Q7CitzdGF0aWMgY2hhciBwYXJzZWRfY29sb3JbQ09MT1JfTUFYTEVOXTsKKworc3RhdGljIGludCBnaXRfZ2V0X2NvbG9yX2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICghc3RyY21wKHZhciwgZ2V0X2NvbG9yX3Nsb3QpKSB7CisJCWlmICghdmFsdWUpCisJCQljb25maWdfZXJyb3Jfbm9uYm9vbCh2YXIpOworCQljb2xvcl9wYXJzZSh2YWx1ZSwgdmFyLCBwYXJzZWRfY29sb3IpOworCQlnZXRfY29sb3JfZm91bmQgPSAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfY29sb3IoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCS8qCisJICogZ3JhYiB0aGUgY29sb3Igc2V0dGluZyBmb3IgdGhlIGdpdmVuIHNsb3QgZnJvbSB0aGUgY29uZmlndXJhdGlvbiwKKwkgKiBvciBwYXJzZSB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBtaXNzaW5nLCBhbmQgcmV0dXJuIEFOU0kgY29sb3IKKwkgKiBlc2NhcGUgc2VxdWVuY2UuCisJICoKKwkgKiBlLmcuCisJICogZ2l0IGNvbmZpZyAtLWdldC1jb2xvciBjb2xvci5kaWZmLndoaXRlc3BhY2UgImJsdWUgcmV2ZXJzZSIKKwkgKi8KKwljb25zdCBjaGFyICpkZWZfY29sb3IgPSBOVUxMOworCisJc3dpdGNoIChhcmdjKSB7CisJZGVmYXVsdDoKKwkJdXNhZ2UoZ2l0X2NvbmZpZ19zZXRfdXNhZ2UpOworCWNhc2UgMjoKKwkJZGVmX2NvbG9yID0gYXJndlsxXTsKKwkJLyogZmFsbHRocnUgKi8KKwljYXNlIDE6CisJCWdldF9jb2xvcl9zbG90ID0gYXJndlswXTsKKwkJYnJlYWs7CisJfQorCisJZ2V0X2NvbG9yX2ZvdW5kID0gMDsKKwlwYXJzZWRfY29sb3JbMF0gPSAnXDAnOworCWdpdF9jb25maWcoZ2l0X2dldF9jb2xvcl9jb25maWcpOworCisJaWYgKCFnZXRfY29sb3JfZm91bmQgJiYgZGVmX2NvbG9yKQorCQljb2xvcl9wYXJzZShkZWZfY29sb3IsICJjb21tYW5kIGxpbmUiLCBwYXJzZWRfY29sb3IpOworCisJZnB1dHMocGFyc2VkX2NvbG9yLCBzdGRvdXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0ZG91dF9pc190dHk7CitzdGF0aWMgaW50IGdldF9jb2xvcmJvb2xfZm91bmQ7CitzdGF0aWMgaW50IGdldF9kaWZmX2NvbG9yX2ZvdW5kOworc3RhdGljIGludCBnaXRfZ2V0X2NvbG9yYm9vbF9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXN0cmNtcCh2YXIsIGdldF9jb2xvcl9zbG90KSkgeworCQlnZXRfY29sb3Jib29sX2ZvdW5kID0KKwkJCWdpdF9jb25maWdfY29sb3Jib29sKHZhciwgdmFsdWUsIHN0ZG91dF9pc190dHkpOworCX0KKwlpZiAoIXN0cmNtcCh2YXIsICJkaWZmLmNvbG9yIikpIHsKKwkJZ2V0X2RpZmZfY29sb3JfZm91bmQgPQorCQkJZ2l0X2NvbmZpZ19jb2xvcmJvb2wodmFyLCB2YWx1ZSwgc3Rkb3V0X2lzX3R0eSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9jb2xvcmJvb2woaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCS8qCisJICogZ2l0IGNvbmZpZyAtLWdldC1jb2xvcmJvb2wgPHNsb3Q+IFs8c3Rkb3V0LWlzLXR0eT5dCisJICoKKwkgKiByZXR1cm5zICJ0cnVlIiBvciAiZmFsc2UiIGRlcGVuZGluZyBvbiBob3cgPHNsb3Q+CisJICogaXMgY29uZmlndXJlZC4KKwkgKi8KKworCWlmIChhcmdjID09IDIpCisJCXN0ZG91dF9pc190dHkgPSBnaXRfY29uZmlnX2Jvb2woImNvbW1hbmQgbGluZSIsIGFyZ3ZbMV0pOworCWVsc2UgaWYgKGFyZ2MgPT0gMSkKKwkJc3Rkb3V0X2lzX3R0eSA9IGlzYXR0eSgxKTsKKwllbHNlCisJCXVzYWdlKGdpdF9jb25maWdfc2V0X3VzYWdlKTsKKwlnZXRfY29sb3Jib29sX2ZvdW5kID0gLTE7CisJZ2V0X2RpZmZfY29sb3JfZm91bmQgPSAtMTsKKwlnZXRfY29sb3Jfc2xvdCA9IGFyZ3ZbMF07CisJZ2l0X2NvbmZpZyhnaXRfZ2V0X2NvbG9yYm9vbF9jb25maWcpOworCisJaWYgKGdldF9jb2xvcmJvb2xfZm91bmQgPCAwKSB7CisJCWlmICghc3RyY21wKGdldF9jb2xvcl9zbG90LCAiY29sb3IuZGlmZiIpKQorCQkJZ2V0X2NvbG9yYm9vbF9mb3VuZCA9IGdldF9kaWZmX2NvbG9yX2ZvdW5kOworCQlpZiAoZ2V0X2NvbG9yYm9vbF9mb3VuZCA8IDApCisJCQlnZXRfY29sb3Jib29sX2ZvdW5kID0gMDsKKwl9CisKKwlpZiAoYXJnYyA9PSAxKSB7CisJCXJldHVybiBnZXRfY29sb3Jib29sX2ZvdW5kID8gMCA6IDE7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCIlc1xuIiwgZ2V0X2NvbG9yYm9vbF9mb3VuZCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK2ludCBjbWRfY29uZmlnKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBub25naXQ7CisJY2hhciogdmFsdWU7CisJY29uc3QgY2hhciAqZmlsZSA9IHNldHVwX2dpdF9kaXJlY3RvcnlfZ2VudGx5KCZub25naXQpOworCisJd2hpbGUgKDEgPCBhcmdjKSB7CisJCWlmICghc3RyY21wKGFyZ3ZbMV0sICItLWludCIpKQorCQkJdHlwZSA9IFRfSU5UOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItLWJvb2wiKSkKKwkJCXR5cGUgPSBUX0JPT0w7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tbGlzdCIpIHx8ICFzdHJjbXAoYXJndlsxXSwgIi1sIikpIHsKKwkJCWlmIChhcmdjICE9IDIpCisJCQkJdXNhZ2UoZ2l0X2NvbmZpZ19zZXRfdXNhZ2UpOworCQkJaWYgKGdpdF9jb25maWcoc2hvd19hbGxfY29uZmlnKSA8IDAgJiYgZmlsZSAmJiBlcnJubykKKwkJCQlkaWUoInVuYWJsZSB0byByZWFkIGNvbmZpZyBmaWxlICVzOiAlcyIsIGZpbGUsCisJCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItLWdsb2JhbCIpKSB7CisJCQljaGFyICpob21lID0gZ2V0ZW52KCJIT01FIik7CisJCQlpZiAoaG9tZSkgeworCQkJCWNoYXIgKnVzZXJfY29uZmlnID0geHN0cmR1cChta3BhdGgoIiVzLy5naXRjb25maWciLCBob21lKSk7CisJCQkJc2V0ZW52KENPTkZJR19FTlZJUk9OTUVOVCwgdXNlcl9jb25maWcsIDEpOworCQkJCWZyZWUodXNlcl9jb25maWcpOworCQkJfSBlbHNlIHsKKwkJCQlkaWUoIiRIT01FIG5vdCBzZXQiKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItLXN5c3RlbSIpKQorCQkJc2V0ZW52KENPTkZJR19FTlZJUk9OTUVOVCwgZ2l0X2V0Y19naXRjb25maWcoKSwgMSk7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tZmlsZSIpIHx8ICFzdHJjbXAoYXJndlsxXSwgIi1mIikpIHsKKwkJCWlmIChhcmdjIDwgMykKKwkJCQl1c2FnZShnaXRfY29uZmlnX3NldF91c2FnZSk7CisJCQlpZiAoIWlzX2Fic29sdXRlX3BhdGgoYXJndlsyXSkgJiYgZmlsZSkKKwkJCQlmaWxlID0gcHJlZml4X2ZpbGVuYW1lKGZpbGUsIHN0cmxlbihmaWxlKSwKKwkJCQkJCSAgICAgICBhcmd2WzJdKTsKKwkJCWVsc2UKKwkJCQlmaWxlID0gYXJndlsyXTsKKwkJCXNldGVudihDT05GSUdfRU5WSVJPTk1FTlQsIGZpbGUsIDEpOworCQkJYXJnYy0tOworCQkJYXJndisrOworCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tbnVsbCIpIHx8ICFzdHJjbXAoYXJndlsxXSwgIi16IikpIHsKKwkJCXRlcm0gPSAnXDAnOworCQkJZGVsaW0gPSAnXG4nOworCQkJa2V5X2RlbGltID0gJ1xuJzsKKwkJfQorCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItLXJlbmFtZS1zZWN0aW9uIikpIHsKKwkJCWludCByZXQ7CisJCQlpZiAoYXJnYyAhPSA0KQorCQkJCXVzYWdlKGdpdF9jb25maWdfc2V0X3VzYWdlKTsKKwkJCXJldCA9IGdpdF9jb25maWdfcmVuYW1lX3NlY3Rpb24oYXJndlsyXSwgYXJndlszXSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJObyBzdWNoIHNlY3Rpb24hXG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tcmVtb3ZlLXNlY3Rpb24iKSkgeworCQkJaW50IHJldDsKKwkJCWlmIChhcmdjICE9IDMpCisJCQkJdXNhZ2UoZ2l0X2NvbmZpZ19zZXRfdXNhZ2UpOworCQkJcmV0ID0gZ2l0X2NvbmZpZ19yZW5hbWVfc2VjdGlvbihhcmd2WzJdLCBOVUxMKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCQlpZiAocmV0ID09IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHN1Y2ggc2VjdGlvbiFcbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1nZXQtY29sb3IiKSkgeworCQkJcmV0dXJuIGdldF9jb2xvcihhcmdjLTIsIGFyZ3YrMik7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1nZXQtY29sb3Jib29sIikpIHsKKwkJCXJldHVybiBnZXRfY29sb3Jib29sKGFyZ2MtMiwgYXJndisyKTsKKwkJfSBlbHNlCisJCQlicmVhazsKKwkJYXJnYy0tOworCQlhcmd2Kys7CisJfQorCisJc3dpdGNoIChhcmdjKSB7CisJY2FzZSAyOgorCQlyZXR1cm4gZ2V0X3ZhbHVlKGFyZ3ZbMV0sIE5VTEwpOworCWNhc2UgMzoKKwkJaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tdW5zZXQiKSkKKwkJCXJldHVybiBnaXRfY29uZmlnX3NldChhcmd2WzJdLCBOVUxMKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS11bnNldC1hbGwiKSkKKwkJCXJldHVybiBnaXRfY29uZmlnX3NldF9tdWx0aXZhcihhcmd2WzJdLCBOVUxMLCBOVUxMLCAxKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1nZXQiKSkKKwkJCXJldHVybiBnZXRfdmFsdWUoYXJndlsyXSwgTlVMTCk7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tZ2V0LWFsbCIpKSB7CisJCQlkb19hbGwgPSAxOworCQkJcmV0dXJuIGdldF92YWx1ZShhcmd2WzJdLCBOVUxMKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItLWdldC1yZWdleHAiKSkgeworCQkJc2hvd19rZXlzID0gMTsKKwkJCXVzZV9rZXlfcmVnZXhwID0gMTsKKwkJCWRvX2FsbCA9IDE7CisJCQlyZXR1cm4gZ2V0X3ZhbHVlKGFyZ3ZbMl0sIE5VTEwpOworCQl9IGVsc2UgeworCQkJdmFsdWUgPSBub3JtYWxpemVfdmFsdWUoYXJndlsxXSwgYXJndlsyXSk7CisJCQlyZXR1cm4gZ2l0X2NvbmZpZ19zZXQoYXJndlsxXSwgdmFsdWUpOworCQl9CisJY2FzZSA0OgorCQlpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS11bnNldCIpKQorCQkJcmV0dXJuIGdpdF9jb25maWdfc2V0X211bHRpdmFyKGFyZ3ZbMl0sIE5VTEwsIGFyZ3ZbM10sIDApOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItLXVuc2V0LWFsbCIpKQorCQkJcmV0dXJuIGdpdF9jb25maWdfc2V0X211bHRpdmFyKGFyZ3ZbMl0sIE5VTEwsIGFyZ3ZbM10sIDEpOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItLWdldCIpKQorCQkJcmV0dXJuIGdldF92YWx1ZShhcmd2WzJdLCBhcmd2WzNdKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1nZXQtYWxsIikpIHsKKwkJCWRvX2FsbCA9IDE7CisJCQlyZXR1cm4gZ2V0X3ZhbHVlKGFyZ3ZbMl0sIGFyZ3ZbM10pOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tZ2V0LXJlZ2V4cCIpKSB7CisJCQlzaG93X2tleXMgPSAxOworCQkJdXNlX2tleV9yZWdleHAgPSAxOworCQkJZG9fYWxsID0gMTsKKwkJCXJldHVybiBnZXRfdmFsdWUoYXJndlsyXSwgYXJndlszXSk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1hZGQiKSkgeworCQkJdmFsdWUgPSBub3JtYWxpemVfdmFsdWUoYXJndlsyXSwgYXJndlszXSk7CisJCQlyZXR1cm4gZ2l0X2NvbmZpZ19zZXRfbXVsdGl2YXIoYXJndlsyXSwgdmFsdWUsICJeJCIsIDApOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tcmVwbGFjZS1hbGwiKSkgeworCQkJdmFsdWUgPSBub3JtYWxpemVfdmFsdWUoYXJndlsyXSwgYXJndlszXSk7CisJCQlyZXR1cm4gZ2l0X2NvbmZpZ19zZXRfbXVsdGl2YXIoYXJndlsyXSwgdmFsdWUsIE5VTEwsIDEpOworCQl9IGVsc2UgeworCQkJdmFsdWUgPSBub3JtYWxpemVfdmFsdWUoYXJndlsxXSwgYXJndlsyXSk7CisJCQlyZXR1cm4gZ2l0X2NvbmZpZ19zZXRfbXVsdGl2YXIoYXJndlsxXSwgdmFsdWUsIGFyZ3ZbM10sIDApOworCQl9CisJY2FzZSA1OgorCQlpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1yZXBsYWNlLWFsbCIpKSB7CisJCQl2YWx1ZSA9IG5vcm1hbGl6ZV92YWx1ZShhcmd2WzJdLCBhcmd2WzNdKTsKKwkJCXJldHVybiBnaXRfY29uZmlnX3NldF9tdWx0aXZhcihhcmd2WzJdLCB2YWx1ZSwgYXJndls0XSwgMSk7CisJCX0KKwljYXNlIDE6CisJZGVmYXVsdDoKKwkJdXNhZ2UoZ2l0X2NvbmZpZ19zZXRfdXNhZ2UpOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tY291bnQtb2JqZWN0cy5jIGIvYnVpbHRpbi1jb3VudC1vYmplY3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwMzA2ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tY291bnQtb2JqZWN0cy5jCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQnVpbHRpbiAiZ2l0IGNvdW50LW9iamVjdHMiLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBKdW5pbyBDIEhhbWFubworICovCisKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJwYXJzZS1vcHRpb25zLmgiCisKK3N0YXRpYyB2b2lkIGNvdW50X29iamVjdHMoRElSICpkLCBjaGFyICpwYXRoLCBpbnQgbGVuLCBpbnQgdmVyYm9zZSwKKwkJCSAgdW5zaWduZWQgbG9uZyAqbG9vc2UsCisJCQkgIHVuc2lnbmVkIGxvbmcgKmxvb3NlX3NpemUsCisJCQkgIHVuc2lnbmVkIGxvbmcgKnBhY2tlZF9sb29zZSwKKwkJCSAgdW5zaWduZWQgbG9uZyAqZ2FyYmFnZSkKK3sKKwlzdHJ1Y3QgZGlyZW50ICplbnQ7CisJd2hpbGUgKChlbnQgPSByZWFkZGlyKGQpKSAhPSBOVUxMKSB7CisJCWNoYXIgaGV4WzQxXTsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJY29uc3QgY2hhciAqY3A7CisJCWludCBiYWQgPSAwOworCisJCWlmICgoZW50LT5kX25hbWVbMF0gPT0gJy4nKSAmJgorCQkgICAgKGVudC0+ZF9uYW1lWzFdID09IDAgfHwKKwkJICAgICAoKGVudC0+ZF9uYW1lWzFdID09ICcuJykgJiYgKGVudC0+ZF9uYW1lWzJdID09IDApKSkpCisJCQljb250aW51ZTsKKwkJZm9yIChjcCA9IGVudC0+ZF9uYW1lOyAqY3A7IGNwKyspIHsKKwkJCWludCBjaCA9ICpjcDsKKwkJCWlmICgoJzAnIDw9IGNoICYmIGNoIDw9ICc5JykgfHwKKwkJCSAgICAoJ2EnIDw9IGNoICYmIGNoIDw9ICdmJykpCisJCQkJY29udGludWU7CisJCQliYWQgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNwIC0gZW50LT5kX25hbWUgIT0gMzgpCisJCQliYWQgPSAxOworCQllbHNlIHsKKwkJCXN0cnVjdCBzdGF0IHN0OworCQkJbWVtY3B5KHBhdGggKyBsZW4gKyAzLCBlbnQtPmRfbmFtZSwgMzgpOworCQkJcGF0aFtsZW4gKyAyXSA9ICcvJzsKKwkJCXBhdGhbbGVuICsgNDFdID0gMDsKKwkJCWlmIChsc3RhdChwYXRoLCAmc3QpIHx8ICFTX0lTUkVHKHN0LnN0X21vZGUpKQorCQkJCWJhZCA9IDE7CisJCQllbHNlCisJCQkJKCpsb29zZV9zaXplKSArPSB4c2l6ZV90KHN0LnN0X2Jsb2Nrcyk7CisJCX0KKwkJaWYgKGJhZCkgeworCQkJaWYgKHZlcmJvc2UpIHsKKwkJCQllcnJvcigiZ2FyYmFnZSBmb3VuZDogJS4qcy8lcyIsCisJCQkJICAgICAgbGVuICsgMiwgcGF0aCwgZW50LT5kX25hbWUpOworCQkJCSgqZ2FyYmFnZSkrKzsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCSgqbG9vc2UpKys7CisJCWlmICghdmVyYm9zZSkKKwkJCWNvbnRpbnVlOworCQltZW1jcHkoaGV4LCBwYXRoK2xlbiwgMik7CisJCW1lbWNweShoZXgrMiwgZW50LT5kX25hbWUsIDM4KTsKKwkJaGV4WzQwXSA9IDA7CisJCWlmIChnZXRfc2hhMV9oZXgoaGV4LCBzaGExKSkKKwkJCWRpZSgiaW50ZXJuYWwgZXJyb3IiKTsKKwkJaWYgKGhhc19zaGExX3BhY2soc2hhMSwgTlVMTCkpCisJCQkoKnBhY2tlZF9sb29zZSkrKzsKKwl9Cit9CisKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgY291bnRfb2JqZWN0c191c2FnZVtdID0geworCSJnaXQtY291bnQtb2JqZWN0cyBbLXZdIiwKKwlOVUxMCit9OworCitpbnQgY21kX2NvdW50X29iamVjdHMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGksIHZlcmJvc2UgPSAwOworCWNvbnN0IGNoYXIgKm9iamRpciA9IGdldF9vYmplY3RfZGlyZWN0b3J5KCk7CisJaW50IGxlbiA9IHN0cmxlbihvYmpkaXIpOworCWNoYXIgKnBhdGggPSB4bWFsbG9jKGxlbiArIDUwKTsKKwl1bnNpZ25lZCBsb25nIGxvb3NlID0gMCwgcGFja2VkID0gMCwgcGFja2VkX2xvb3NlID0gMCwgZ2FyYmFnZSA9IDA7CisJdW5zaWduZWQgbG9uZyBsb29zZV9zaXplID0gMDsKKwlzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9IHsKKwkJT1BUX19WRVJCT1NFKCZ2ZXJib3NlKSwKKwkJT1BUX0VORCgpLAorCX07CisKKwlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBvcHRzLCBjb3VudF9vYmplY3RzX3VzYWdlLCAwKTsKKwkvKiB3ZSBkbyBub3QgdGFrZSBhcmd1bWVudHMgb3RoZXIgdGhhbiBmbGFncyBmb3Igbm93ICovCisJaWYgKGFyZ2MpCisJCXVzYWdlX3dpdGhfb3B0aW9ucyhjb3VudF9vYmplY3RzX3VzYWdlLCBvcHRzKTsKKwltZW1jcHkocGF0aCwgb2JqZGlyLCBsZW4pOworCWlmIChsZW4gJiYgb2JqZGlyW2xlbi0xXSAhPSAnLycpCisJCXBhdGhbbGVuKytdID0gJy8nOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlESVIgKmQ7CisJCXNwcmludGYocGF0aCArIGxlbiwgIiUwMngiLCBpKTsKKwkJZCA9IG9wZW5kaXIocGF0aCk7CisJCWlmICghZCkKKwkJCWNvbnRpbnVlOworCQljb3VudF9vYmplY3RzKGQsIHBhdGgsIGxlbiwgdmVyYm9zZSwKKwkJCSAgICAgICZsb29zZSwgJmxvb3NlX3NpemUsICZwYWNrZWRfbG9vc2UsICZnYXJiYWdlKTsKKwkJY2xvc2VkaXIoZCk7CisJfQorCWlmICh2ZXJib3NlKSB7CisJCXN0cnVjdCBwYWNrZWRfZ2l0ICpwOworCQl1bnNpZ25lZCBsb25nIG51bV9wYWNrID0gMDsKKwkJaWYgKCFwYWNrZWRfZ2l0KQorCQkJcHJlcGFyZV9wYWNrZWRfZ2l0KCk7CisJCWZvciAocCA9IHBhY2tlZF9naXQ7IHA7IHAgPSBwLT5uZXh0KSB7CisJCQlpZiAoIXAtPnBhY2tfbG9jYWwpCisJCQkJY29udGludWU7CisJCQlpZiAob3Blbl9wYWNrX2luZGV4KHApKQorCQkJCWNvbnRpbnVlOworCQkJcGFja2VkICs9IHAtPm51bV9vYmplY3RzOworCQkJbnVtX3BhY2srKzsKKwkJfQorCQlwcmludGYoImNvdW50OiAlbHVcbiIsIGxvb3NlKTsKKwkJcHJpbnRmKCJzaXplOiAlbHVcbiIsIGxvb3NlX3NpemUgLyAyKTsKKwkJcHJpbnRmKCJpbi1wYWNrOiAlbHVcbiIsIHBhY2tlZCk7CisJCXByaW50ZigicGFja3M6ICVsdVxuIiwgbnVtX3BhY2spOworCQlwcmludGYoInBydW5lLXBhY2thYmxlOiAlbHVcbiIsIHBhY2tlZF9sb29zZSk7CisJCXByaW50ZigiZ2FyYmFnZTogJWx1XG4iLCBnYXJiYWdlKTsKKwl9CisJZWxzZQorCQlwcmludGYoIiVsdSBvYmplY3RzLCAlbHUga2lsb2J5dGVzXG4iLAorCQkgICAgICAgbG9vc2UsIGxvb3NlX3NpemUgLyAyKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tZGVzY3JpYmUuYyBiL2J1aWx0aW4tZGVzY3JpYmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjU1NGIzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1kZXNjcmliZS5jCkBAIC0wLDAgKzEsMzY2IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisjaW5jbHVkZSAicGFyc2Utb3B0aW9ucy5oIgorCisjZGVmaW5lIFNFRU4JCSgxdTw8MCkKKyNkZWZpbmUgTUFYX1RBR1MJKEZMQUdfQklUUyAtIDEpCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGVzY3JpYmVfdXNhZ2VbXSA9IHsKKwkiZ2l0LWRlc2NyaWJlIFtvcHRpb25zXSA8Y29tbWl0dGlzaD4qIiwKKwlOVUxMCit9OworCitzdGF0aWMgaW50IGRlYnVnOwkvKiBEaXNwbGF5IGxvdHMgb2YgdmVyYm9zZSBpbmZvICovCitzdGF0aWMgaW50IGFsbDsJLyogRGVmYXVsdCB0byBhbm5vdGF0ZWQgdGFncyBvbmx5ICovCitzdGF0aWMgaW50IHRhZ3M7CS8qIEJ1dCBhbGxvdyBhbnkgdGFncyBpZiAtLXRhZ3MgaXMgc3BlY2lmaWVkICovCitzdGF0aWMgaW50IGxvbmdmb3JtYXQ7CitzdGF0aWMgaW50IGFiYnJldiA9IERFRkFVTFRfQUJCUkVWOworc3RhdGljIGludCBtYXhfY2FuZGlkYXRlcyA9IDEwOworY29uc3QgY2hhciAqcGF0dGVybiA9IE5VTEw7CitzdGF0aWMgaW50IGFsd2F5czsKKworc3RydWN0IGNvbW1pdF9uYW1lIHsKKwlzdHJ1Y3QgdGFnICp0YWc7CisJaW50IHByaW87IC8qIGFubm90YXRlZCB0YWcgPSAyLCB0YWcgPSAxLCBoZWFkID0gMCAqLworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY2hhciBwYXRoW0ZMRVhfQVJSQVldOyAvKiBtb3JlICovCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKnByaW9fbmFtZXNbXSA9IHsKKwkiaGVhZCIsICJsaWdodHdlaWdodCIsICJhbm5vdGF0ZWQiLAorfTsKKworc3RhdGljIHZvaWQgYWRkX3RvX2tub3duX25hbWVzKGNvbnN0IGNoYXIgKnBhdGgsCisJCQkgICAgICAgc3RydWN0IGNvbW1pdCAqY29tbWl0LAorCQkJICAgICAgIGludCBwcmlvLAorCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IGNvbW1pdF9uYW1lICplID0gY29tbWl0LT51dGlsOworCWlmICghZSB8fCBlLT5wcmlvIDwgcHJpbykgeworCQlzaXplX3QgbGVuID0gc3RybGVuKHBhdGgpKzE7CisJCWZyZWUoZSk7CisJCWUgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgY29tbWl0X25hbWUpICsgbGVuKTsKKwkJZS0+dGFnID0gTlVMTDsKKwkJZS0+cHJpbyA9IHByaW87CisJCWhhc2hjcHkoZS0+c2hhMSwgc2hhMSk7CisJCW1lbWNweShlLT5wYXRoLCBwYXRoLCBsZW4pOworCQljb21taXQtPnV0aWwgPSBlOworCX0KK30KKworc3RhdGljIGludCBnZXRfbmFtZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmxhZywgdm9pZCAqY2JfZGF0YSkKK3sKKwlpbnQgbWlnaHRfYmVfdGFnID0gIXByZWZpeGNtcChwYXRoLCAicmVmcy90YWdzLyIpOworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmplY3Q7CisJdW5zaWduZWQgY2hhciBwZWVsZWRbMjBdOworCWludCBpc190YWcsIHByaW87CisKKwlpZiAoIWFsbCAmJiAhbWlnaHRfYmVfdGFnKQorCQlyZXR1cm4gMDsKKworCWlmICghcGVlbF9yZWYocGF0aCwgcGVlbGVkKSAmJiAhaXNfbnVsbF9zaGExKHBlZWxlZCkpIHsKKwkJY29tbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2VfZ2VudGx5KHBlZWxlZCwgMSk7CisJCWlmICghY29tbWl0KQorCQkJcmV0dXJuIDA7CisJCWlzX3RhZyA9ICEhaGFzaGNtcChzaGExLCBjb21taXQtPm9iamVjdC5zaGExKTsKKwl9IGVsc2UgeworCQljb21taXQgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZV9nZW50bHkoc2hhMSwgMSk7CisJCW9iamVjdCA9IHBhcnNlX29iamVjdChzaGExKTsKKwkJaWYgKCFjb21taXQgfHwgIW9iamVjdCkKKwkJCXJldHVybiAwOworCQlpc190YWcgPSBvYmplY3QtPnR5cGUgPT0gT0JKX1RBRzsKKwl9CisKKwkvKiBJZiAtLWFsbCwgdGhlbiBhbnkgcmVmcyBhcmUgdXNlZC4KKwkgKiBJZiAtLXRhZ3MsIHRoZW4gYW55IHRhZ3MgYXJlIHVzZWQuCisJICogT3RoZXJ3aXNlIG9ubHkgYW5ub3RhdGVkIHRhZ3MgYXJlIHVzZWQuCisJICovCisJaWYgKG1pZ2h0X2JlX3RhZykgeworCQlpZiAoaXNfdGFnKSB7CisJCQlwcmlvID0gMjsKKwkJCWlmIChwYXR0ZXJuICYmIGZubWF0Y2gocGF0dGVybiwgcGF0aCArIDEwLCAwKSkKKwkJCQlwcmlvID0gMDsKKwkJfSBlbHNlCisJCQlwcmlvID0gMTsKKwl9CisJZWxzZQorCQlwcmlvID0gMDsKKworCWlmICghYWxsKSB7CisJCWlmICghcHJpbykKKwkJCXJldHVybiAwOworCQlpZiAoIXRhZ3MgJiYgcHJpbyA8IDIpCisJCQlyZXR1cm4gMDsKKwl9CisJYWRkX3RvX2tub3duX25hbWVzKGFsbCA/IHBhdGggKyA1IDogcGF0aCArIDEwLCBjb21taXQsIHByaW8sIHNoYTEpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcG9zc2libGVfdGFnIHsKKwlzdHJ1Y3QgY29tbWl0X25hbWUgKm5hbWU7CisJaW50IGRlcHRoOworCWludCBmb3VuZF9vcmRlcjsKKwl1bnNpZ25lZCBmbGFnX3dpdGhpbjsKK307CisKK3N0YXRpYyBpbnQgY29tcGFyZV9wdChjb25zdCB2b2lkICphXywgY29uc3Qgdm9pZCAqYl8pCit7CisJc3RydWN0IHBvc3NpYmxlX3RhZyAqYSA9IChzdHJ1Y3QgcG9zc2libGVfdGFnICopYV87CisJc3RydWN0IHBvc3NpYmxlX3RhZyAqYiA9IChzdHJ1Y3QgcG9zc2libGVfdGFnICopYl87CisJaWYgKGEtPm5hbWUtPnByaW8gIT0gYi0+bmFtZS0+cHJpbykKKwkJcmV0dXJuIGItPm5hbWUtPnByaW8gLSBhLT5uYW1lLT5wcmlvOworCWlmIChhLT5kZXB0aCAhPSBiLT5kZXB0aCkKKwkJcmV0dXJuIGEtPmRlcHRoIC0gYi0+ZGVwdGg7CisJaWYgKGEtPmZvdW5kX29yZGVyICE9IGItPmZvdW5kX29yZGVyKQorCQlyZXR1cm4gYS0+Zm91bmRfb3JkZXIgLSBiLT5mb3VuZF9vcmRlcjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZmluaXNoX2RlcHRoX2NvbXB1dGF0aW9uKAorCXN0cnVjdCBjb21taXRfbGlzdCAqKmxpc3QsCisJc3RydWN0IHBvc3NpYmxlX3RhZyAqYmVzdCkKK3sKKwl1bnNpZ25lZCBsb25nIHNlZW5fY29tbWl0cyA9IDA7CisJd2hpbGUgKCpsaXN0KSB7CisJCXN0cnVjdCBjb21taXQgKmMgPSBwb3BfY29tbWl0KGxpc3QpOworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHMgPSBjLT5wYXJlbnRzOworCQlzZWVuX2NvbW1pdHMrKzsKKwkJaWYgKGMtPm9iamVjdC5mbGFncyAmIGJlc3QtPmZsYWdfd2l0aGluKSB7CisJCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKmEgPSAqbGlzdDsKKwkJCXdoaWxlIChhKSB7CisJCQkJc3RydWN0IGNvbW1pdCAqaSA9IGEtPml0ZW07CisJCQkJaWYgKCEoaS0+b2JqZWN0LmZsYWdzICYgYmVzdC0+ZmxhZ193aXRoaW4pKQorCQkJCQlicmVhazsKKwkJCQlhID0gYS0+bmV4dDsKKwkJCX0KKwkJCWlmICghYSkKKwkJCQlicmVhazsKKwkJfSBlbHNlCisJCQliZXN0LT5kZXB0aCsrOworCQl3aGlsZSAocGFyZW50cykgeworCQkJc3RydWN0IGNvbW1pdCAqcCA9IHBhcmVudHMtPml0ZW07CisJCQlwYXJzZV9jb21taXQocCk7CisJCQlpZiAoIShwLT5vYmplY3QuZmxhZ3MgJiBTRUVOKSkKKwkJCQlpbnNlcnRfYnlfZGF0ZShwLCBsaXN0KTsKKwkJCXAtPm9iamVjdC5mbGFncyB8PSBjLT5vYmplY3QuZmxhZ3M7CisJCQlwYXJlbnRzID0gcGFyZW50cy0+bmV4dDsKKwkJfQorCX0KKwlyZXR1cm4gc2Vlbl9jb21taXRzOworfQorCitzdGF0aWMgdm9pZCBkaXNwbGF5X25hbWUoc3RydWN0IGNvbW1pdF9uYW1lICpuKQoreworCWlmIChuLT5wcmlvID09IDIgJiYgIW4tPnRhZykgeworCQluLT50YWcgPSBsb29rdXBfdGFnKG4tPnNoYTEpOworCQlpZiAoIW4tPnRhZyB8fCBwYXJzZV90YWcobi0+dGFnKSB8fCAhbi0+dGFnLT50YWcpCisJCQlkaWUoImFubm90YXRlZCB0YWcgJXMgbm90IGF2YWlsYWJsZSIsIG4tPnBhdGgpOworCQlpZiAoc3RyY21wKG4tPnRhZy0+dGFnLCBuLT5wYXRoKSkKKwkJCXdhcm5pbmcoInRhZyAnJXMnIGlzIHJlYWxseSAnJXMnIGhlcmUiLCBuLT50YWctPnRhZywgbi0+cGF0aCk7CisJfQorCisJaWYgKG4tPnRhZykKKwkJcHJpbnRmKCIlcyIsIG4tPnRhZy0+dGFnKTsKKwllbHNlCisJCXByaW50ZigiJXMiLCBuLT5wYXRoKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19zdWZmaXgoaW50IGRlcHRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXByaW50ZigiLSVkLWclcyIsIGRlcHRoLCBmaW5kX3VuaXF1ZV9hYmJyZXYoc2hhMSwgYWJicmV2KSk7Cit9CisKK3N0YXRpYyB2b2lkIGRlc2NyaWJlKGNvbnN0IGNoYXIgKmFyZywgaW50IGxhc3Rfb25lKQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJc3RydWN0IGNvbW1pdCAqY21pdCwgKmdhdmVfdXBfb24gPSBOVUxMOworCXN0cnVjdCBjb21taXRfbGlzdCAqbGlzdDsKKwlzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKwlzdHJ1Y3QgY29tbWl0X25hbWUgKm47CisJc3RydWN0IHBvc3NpYmxlX3RhZyBhbGxfbWF0Y2hlc1tNQVhfVEFHU107CisJdW5zaWduZWQgaW50IG1hdGNoX2NudCA9IDAsIGFubm90YXRlZF9jbnQgPSAwLCBjdXJfbWF0Y2g7CisJdW5zaWduZWQgbG9uZyBzZWVuX2NvbW1pdHMgPSAwOworCisJaWYgKGdldF9zaGExKGFyZywgc2hhMSkpCisJCWRpZSgiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWUgJXMiLCBhcmcpOworCWNtaXQgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShzaGExKTsKKwlpZiAoIWNtaXQpCisJCWRpZSgiJXMgaXMgbm90IGEgdmFsaWQgJyVzJyBvYmplY3QiLCBhcmcsIGNvbW1pdF90eXBlKTsKKworCWlmICghaW5pdGlhbGl6ZWQpIHsKKwkJaW5pdGlhbGl6ZWQgPSAxOworCQlmb3JfZWFjaF9yZWYoZ2V0X25hbWUsIE5VTEwpOworCX0KKworCW4gPSBjbWl0LT51dGlsOworCWlmIChuKSB7CisJCS8qCisJCSAqIEV4YWN0IG1hdGNoIHRvIGFuIGV4aXN0aW5nIHJlZi4KKwkJICovCisJCWRpc3BsYXlfbmFtZShuKTsKKwkJaWYgKGxvbmdmb3JtYXQpCisJCQlzaG93X3N1ZmZpeCgwLCBuLT50YWctPnRhZ2dlZC0+c2hhMSk7CisJCXByaW50ZigiXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghbWF4X2NhbmRpZGF0ZXMpCisJCWRpZSgibm8gdGFnIGV4YWN0bHkgbWF0Y2hlcyAnJXMnIiwgc2hhMV90b19oZXgoY21pdC0+b2JqZWN0LnNoYTEpKTsKKwlpZiAoZGVidWcpCisJCWZwcmludGYoc3RkZXJyLCAic2VhcmNoaW5nIHRvIGRlc2NyaWJlICVzXG4iLCBhcmcpOworCisJbGlzdCA9IE5VTEw7CisJY21pdC0+b2JqZWN0LmZsYWdzID0gU0VFTjsKKwljb21taXRfbGlzdF9pbnNlcnQoY21pdCwgJmxpc3QpOworCXdoaWxlIChsaXN0KSB7CisJCXN0cnVjdCBjb21taXQgKmMgPSBwb3BfY29tbWl0KCZsaXN0KTsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzID0gYy0+cGFyZW50czsKKwkJc2Vlbl9jb21taXRzKys7CisJCW4gPSBjLT51dGlsOworCQlpZiAobikgeworCQkJaWYgKG1hdGNoX2NudCA8IG1heF9jYW5kaWRhdGVzKSB7CisJCQkJc3RydWN0IHBvc3NpYmxlX3RhZyAqdCA9ICZhbGxfbWF0Y2hlc1ttYXRjaF9jbnQrK107CisJCQkJdC0+bmFtZSA9IG47CisJCQkJdC0+ZGVwdGggPSBzZWVuX2NvbW1pdHMgLSAxOworCQkJCXQtPmZsYWdfd2l0aGluID0gMXUgPDwgbWF0Y2hfY250OworCQkJCXQtPmZvdW5kX29yZGVyID0gbWF0Y2hfY250OworCQkJCWMtPm9iamVjdC5mbGFncyB8PSB0LT5mbGFnX3dpdGhpbjsKKwkJCQlpZiAobi0+cHJpbyA9PSAyKQorCQkJCQlhbm5vdGF0ZWRfY250Kys7CisJCQl9CisJCQllbHNlIHsKKwkJCQlnYXZlX3VwX29uID0gYzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlmb3IgKGN1cl9tYXRjaCA9IDA7IGN1cl9tYXRjaCA8IG1hdGNoX2NudDsgY3VyX21hdGNoKyspIHsKKwkJCXN0cnVjdCBwb3NzaWJsZV90YWcgKnQgPSAmYWxsX21hdGNoZXNbY3VyX21hdGNoXTsKKwkJCWlmICghKGMtPm9iamVjdC5mbGFncyAmIHQtPmZsYWdfd2l0aGluKSkKKwkJCQl0LT5kZXB0aCsrOworCQl9CisJCWlmIChhbm5vdGF0ZWRfY250ICYmICFsaXN0KSB7CisJCQlpZiAoZGVidWcpCisJCQkJZnByaW50ZihzdGRlcnIsICJmaW5pc2hlZCBzZWFyY2ggYXQgJXNcbiIsCisJCQkJCXNoYTFfdG9faGV4KGMtPm9iamVjdC5zaGExKSk7CisJCQlicmVhazsKKwkJfQorCQl3aGlsZSAocGFyZW50cykgeworCQkJc3RydWN0IGNvbW1pdCAqcCA9IHBhcmVudHMtPml0ZW07CisJCQlwYXJzZV9jb21taXQocCk7CisJCQlpZiAoIShwLT5vYmplY3QuZmxhZ3MgJiBTRUVOKSkKKwkJCQlpbnNlcnRfYnlfZGF0ZShwLCAmbGlzdCk7CisJCQlwLT5vYmplY3QuZmxhZ3MgfD0gYy0+b2JqZWN0LmZsYWdzOworCQkJcGFyZW50cyA9IHBhcmVudHMtPm5leHQ7CisJCX0KKwl9CisKKwlpZiAoIW1hdGNoX2NudCkgeworCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExID0gY21pdC0+b2JqZWN0LnNoYTE7CisJCWlmIChhbHdheXMpIHsKKwkJCXByaW50ZigiJXNcbiIsIGZpbmRfdW5pcXVlX2FiYnJldihzaGExLCBhYmJyZXYpKTsKKwkJCXJldHVybjsKKwkJfQorCQlkaWUoImNhbm5vdCBkZXNjcmliZSAnJXMnIiwgc2hhMV90b19oZXgoc2hhMSkpOworCX0KKworCXFzb3J0KGFsbF9tYXRjaGVzLCBtYXRjaF9jbnQsIHNpemVvZihhbGxfbWF0Y2hlc1swXSksIGNvbXBhcmVfcHQpOworCisJaWYgKGdhdmVfdXBfb24pIHsKKwkJaW5zZXJ0X2J5X2RhdGUoZ2F2ZV91cF9vbiwgJmxpc3QpOworCQlzZWVuX2NvbW1pdHMtLTsKKwl9CisJc2Vlbl9jb21taXRzICs9IGZpbmlzaF9kZXB0aF9jb21wdXRhdGlvbigmbGlzdCwgJmFsbF9tYXRjaGVzWzBdKTsKKwlmcmVlX2NvbW1pdF9saXN0KGxpc3QpOworCisJaWYgKGRlYnVnKSB7CisJCWZvciAoY3VyX21hdGNoID0gMDsgY3VyX21hdGNoIDwgbWF0Y2hfY250OyBjdXJfbWF0Y2grKykgeworCQkJc3RydWN0IHBvc3NpYmxlX3RhZyAqdCA9ICZhbGxfbWF0Y2hlc1tjdXJfbWF0Y2hdOworCQkJZnByaW50ZihzdGRlcnIsICIgJS0xMXMgJThkICVzXG4iLAorCQkJCXByaW9fbmFtZXNbdC0+bmFtZS0+cHJpb10sCisJCQkJdC0+ZGVwdGgsIHQtPm5hbWUtPnBhdGgpOworCQl9CisJCWZwcmludGYoc3RkZXJyLCAidHJhdmVyc2VkICVsdSBjb21taXRzXG4iLCBzZWVuX2NvbW1pdHMpOworCQlpZiAoZ2F2ZV91cF9vbikgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIm1vcmUgdGhhbiAlaSB0YWdzIGZvdW5kOyBsaXN0ZWQgJWkgbW9zdCByZWNlbnRcbiIKKwkJCQkiZ2F2ZSB1cCBzZWFyY2ggYXQgJXNcbiIsCisJCQkJbWF4X2NhbmRpZGF0ZXMsIG1heF9jYW5kaWRhdGVzLAorCQkJCXNoYTFfdG9faGV4KGdhdmVfdXBfb24tPm9iamVjdC5zaGExKSk7CisJCX0KKwl9CisKKwlkaXNwbGF5X25hbWUoYWxsX21hdGNoZXNbMF0ubmFtZSk7CisJaWYgKGFiYnJldikKKwkJc2hvd19zdWZmaXgoYWxsX21hdGNoZXNbMF0uZGVwdGgsIGNtaXQtPm9iamVjdC5zaGExKTsKKwlwcmludGYoIlxuIik7CisKKwlpZiAoIWxhc3Rfb25lKQorCQljbGVhcl9jb21taXRfbWFya3MoY21pdCwgLTEpOworfQorCitpbnQgY21kX2Rlc2NyaWJlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBjb250YWlucyA9IDA7CisJc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisJCU9QVF9CT09MRUFOKDAsICJjb250YWlucyIsICAgJmNvbnRhaW5zLCAiZmluZCB0aGUgdGFnIHRoYXQgY29tZXMgYWZ0ZXIgdGhlIGNvbW1pdCIpLAorCQlPUFRfQk9PTEVBTigwLCAiZGVidWciLCAgICAgICZkZWJ1ZywgImRlYnVnIHNlYXJjaCBzdHJhdGVneSBvbiBzdGRlcnIiKSwKKwkJT1BUX0JPT0xFQU4oMCwgImFsbCIsICAgICAgICAmYWxsLCAidXNlIGFueSByZWYgaW4gLmdpdC9yZWZzIiksCisJCU9QVF9CT09MRUFOKDAsICJ0YWdzIiwgICAgICAgJnRhZ3MsICJ1c2UgYW55IHRhZyBpbiAuZ2l0L3JlZnMvdGFncyIpLAorCQlPUFRfQk9PTEVBTigwLCAibG9uZyIsICAgICAgICZsb25nZm9ybWF0LCAiYWx3YXlzIHVzZSBsb25nIGZvcm1hdCIpLAorCQlPUFRfX0FCQlJFVigmYWJicmV2KSwKKwkJT1BUX1NFVF9JTlQoMCwgImV4YWN0LW1hdGNoIiwgJm1heF9jYW5kaWRhdGVzLAorCQkJICAgICJvbmx5IG91dHB1dCBleGFjdCBtYXRjaGVzIiwgMCksCisJCU9QVF9JTlRFR0VSKDAsICJjYW5kaWRhdGVzIiwgJm1heF9jYW5kaWRhdGVzLAorCQkJICAgICJjb25zaWRlciA8bj4gbW9zdCByZWNlbnQgdGFncyAoZGVmYXVsdDogMTApIiksCisJCU9QVF9TVFJJTkcoMCwgIm1hdGNoIiwgICAgICAgJnBhdHRlcm4sICJwYXR0ZXJuIiwKKwkJCSAgICJvbmx5IGNvbnNpZGVyIHRhZ3MgbWF0Y2hpbmcgPHBhdHRlcm4+IiksCisJCU9QVF9CT09MRUFOKDAsICJhbHdheXMiLCAgICAgJmFsd2F5cywKKwkJCSAgICJzaG93IGFiYnJldmlhdGVkIGNvbW1pdCBvYmplY3QgYXMgZmFsbGJhY2siKSwKKwkJT1BUX0VORCgpLAorCX07CisKKwlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBvcHRpb25zLCBkZXNjcmliZV91c2FnZSwgMCk7CisJaWYgKG1heF9jYW5kaWRhdGVzIDwgMCkKKwkJbWF4X2NhbmRpZGF0ZXMgPSAwOworCWVsc2UgaWYgKG1heF9jYW5kaWRhdGVzID4gTUFYX1RBR1MpCisJCW1heF9jYW5kaWRhdGVzID0gTUFYX1RBR1M7CisKKwlzYXZlX2NvbW1pdF9idWZmZXIgPSAwOworCisJaWYgKGxvbmdmb3JtYXQgJiYgYWJicmV2ID09IDApCisJCWRpZSgiLS1sb25nIGlzIGluY29tcGF0aWJsZSB3aXRoIC0tYWJicmV2PTAiKTsKKworCWlmIChjb250YWlucykgeworCQljb25zdCBjaGFyICoqYXJncyA9IHhtYWxsb2MoKDcgKyBhcmdjKSAqIHNpemVvZihjaGFyKikpOworCQlpbnQgaSA9IDA7CisJCWFyZ3NbaSsrXSA9ICJuYW1lLXJldiI7CisJCWFyZ3NbaSsrXSA9ICItLW5hbWUtb25seSI7CisJCWFyZ3NbaSsrXSA9ICItLW5vLXVuZGVmaW5lZCI7CisJCWlmIChhbHdheXMpCisJCQlhcmdzW2krK10gPSAiLS1hbHdheXMiOworCQlpZiAoIWFsbCkgeworCQkJYXJnc1tpKytdID0gIi0tdGFncyI7CisJCQlpZiAocGF0dGVybikgeworCQkJCWNoYXIgKnMgPSB4bWFsbG9jKHN0cmxlbigiLS1yZWZzPXJlZnMvdGFncy8iKSArIHN0cmxlbihwYXR0ZXJuKSArIDEpOworCQkJCXNwcmludGYocywgIi0tcmVmcz1yZWZzL3RhZ3MvJXMiLCBwYXR0ZXJuKTsKKwkJCQlhcmdzW2krK10gPSBzOworCQkJfQorCQl9CisJCW1lbWNweShhcmdzICsgaSwgYXJndiwgYXJnYyAqIHNpemVvZihjaGFyKikpOworCQlhcmdzW2kgKyBhcmdjXSA9IE5VTEw7CisJCXJldHVybiBjbWRfbmFtZV9yZXYoaSArIGFyZ2MsIGFyZ3MsIHByZWZpeCk7CisJfQorCisJaWYgKGFyZ2MgPT0gMCkgeworCQlkZXNjcmliZSgiSEVBRCIsIDEpOworCX0gZWxzZSB7CisJCXdoaWxlIChhcmdjLS0gPiAwKSB7CisJCQlkZXNjcmliZSgqYXJndisrLCBhcmdjID09IDApOworCQl9CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1kaWZmLWZpbGVzLmMgYi9idWlsdGluLWRpZmYtZmlsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjMwNmMxCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1kaWZmLWZpbGVzLmMKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInJldmlzaW9uLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCitzdGF0aWMgY29uc3QgY2hhciBkaWZmX2ZpbGVzX3VzYWdlW10gPQorImdpdC1kaWZmLWZpbGVzIFstcV0gWy0wLy0xLzIvMyB8LWN8LS1jY3wtLW5vLWluZGV4XSBbPGNvbW1vbiBkaWZmIG9wdGlvbnM+XSBbPHBhdGg+Li4uXSIKK0NPTU1PTl9ESUZGX09QVElPTlNfSEVMUDsKKworaW50IGNtZF9kaWZmX2ZpbGVzKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXN0cnVjdCByZXZfaW5mbyByZXY7CisJaW50IG5vbmdpdDsKKwlpbnQgcmVzdWx0OworCisJcHJlZml4ID0gc2V0dXBfZ2l0X2RpcmVjdG9yeV9nZW50bHkoJm5vbmdpdCk7CisJaW5pdF9yZXZpc2lvbnMoJnJldiwgcHJlZml4KTsKKwlnaXRfY29uZmlnKGdpdF9kaWZmX2Jhc2ljX2NvbmZpZyk7IC8qIG5vICJkaWZmIiBVSSBvcHRpb25zICovCisJcmV2LmFiYnJldiA9IDA7CisKKwlpZiAoIXNldHVwX2RpZmZfbm9faW5kZXgoJnJldiwgYXJnYywgYXJndiwgbm9uZ2l0LCBwcmVmaXgpKQorCQlhcmdjID0gMDsKKwllbHNlCisJCWFyZ2MgPSBzZXR1cF9yZXZpc2lvbnMoYXJnYywgYXJndiwgJnJldiwgTlVMTCk7CisJaWYgKCFyZXYuZGlmZm9wdC5vdXRwdXRfZm9ybWF0KQorCQlyZXYuZGlmZm9wdC5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfUkFXOworCXJlc3VsdCA9IHJ1bl9kaWZmX2ZpbGVzX2NtZCgmcmV2LCBhcmdjLCBhcmd2KTsKKwlyZXR1cm4gZGlmZl9yZXN1bHRfY29kZSgmcmV2LmRpZmZvcHQsIHJlc3VsdCk7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWRpZmYtaW5kZXguYyBiL2J1aWx0aW4tZGlmZi1pbmRleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiOTU1ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWRpZmYtaW5kZXguYwpAQCAtMCwwICsxLDQ4IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGRpZmZfY2FjaGVfdXNhZ2VbXSA9CisiZ2l0LWRpZmYtaW5kZXggWy1tXSBbLS1jYWNoZWRdICIKKyJbPGNvbW1vbiBkaWZmIG9wdGlvbnM+XSA8dHJlZS1pc2g+IFs8cGF0aD4uLi5dIgorQ09NTU9OX0RJRkZfT1BUSU9OU19IRUxQOworCitpbnQgY21kX2RpZmZfaW5kZXgoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IHJldl9pbmZvIHJldjsKKwlpbnQgY2FjaGVkID0gMDsKKwlpbnQgaTsKKwlpbnQgcmVzdWx0OworCisJaW5pdF9yZXZpc2lvbnMoJnJldiwgcHJlZml4KTsKKwlnaXRfY29uZmlnKGdpdF9kaWZmX2Jhc2ljX2NvbmZpZyk7IC8qIG5vICJkaWZmIiBVSSBvcHRpb25zICovCisJcmV2LmFiYnJldiA9IDA7CisKKwlhcmdjID0gc2V0dXBfcmV2aXNpb25zKGFyZ2MsIGFyZ3YsICZyZXYsIE5VTEwpOworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoIXN0cmNtcChhcmcsICItLWNhY2hlZCIpKQorCQkJY2FjaGVkID0gMTsKKwkJZWxzZQorCQkJdXNhZ2UoZGlmZl9jYWNoZV91c2FnZSk7CisJfQorCWlmICghcmV2LmRpZmZvcHQub3V0cHV0X2Zvcm1hdCkKKwkJcmV2LmRpZmZvcHQub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX1JBVzsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZXJlIGlzIG9uZSByZXZpc2lvbiAoaS5lLiBwZW5kaW5nIG9iamVjdCksCisJICogYW5kIHRoZXJlIGlzIG5vIHJldmlzaW9uIGZpbHRlcmluZyBwYXJhbWV0ZXJzLgorCSAqLworCWlmIChyZXYucGVuZGluZy5uciAhPSAxIHx8CisJICAgIHJldi5tYXhfY291bnQgIT0gLTEgfHwgcmV2Lm1pbl9hZ2UgIT0gLTEgfHwgcmV2Lm1heF9hZ2UgIT0gLTEpCisJCXVzYWdlKGRpZmZfY2FjaGVfdXNhZ2UpOworCWlmIChyZWFkX2NhY2hlKCkgPCAwKSB7CisJCXBlcnJvcigicmVhZF9jYWNoZSIpOworCQlyZXR1cm4gLTE7CisJfQorCXJlc3VsdCA9IHJ1bl9kaWZmX2luZGV4KCZyZXYsIGNhY2hlZCk7CisJcmV0dXJuIGRpZmZfcmVzdWx0X2NvZGUoJnJldi5kaWZmb3B0LCByZXN1bHQpOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1kaWZmLXRyZWUuYyBiL2J1aWx0aW4tZGlmZi10cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMyNzk3ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tZGlmZi10cmVlLmMKQEAgLTAsMCArMSwxMzcgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJsb2ctdHJlZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworc3RhdGljIHN0cnVjdCByZXZfaW5mbyBsb2dfdHJlZV9vcHQ7CisKK3N0YXRpYyBpbnQgZGlmZl90cmVlX2NvbW1pdF9zaGExKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2Uoc2hhMSk7CisJaWYgKCFjb21taXQpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gbG9nX3RyZWVfY29tbWl0KCZsb2dfdHJlZV9vcHQsIGNvbW1pdCk7Cit9CisKK3N0YXRpYyBpbnQgZGlmZl90cmVlX3N0ZGluKGNoYXIgKmxpbmUpCit7CisJaW50IGxlbiA9IHN0cmxlbihsaW5lKTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKworCWlmICghbGVuIHx8IGxpbmVbbGVuLTFdICE9ICdcbicpCisJCXJldHVybiAtMTsKKwlsaW5lW2xlbi0xXSA9IDA7CisJaWYgKGdldF9zaGExX2hleChsaW5lLCBzaGExKSkKKwkJcmV0dXJuIC0xOworCWNvbW1pdCA9IGxvb2t1cF9jb21taXQoc2hhMSk7CisJaWYgKCFjb21taXQgfHwgcGFyc2VfY29tbWl0KGNvbW1pdCkpCisJCXJldHVybiAtMTsKKwlpZiAoaXNzcGFjZShsaW5lWzQwXSkgJiYgIWdldF9zaGExX2hleChsaW5lKzQxLCBzaGExKSkgeworCQkvKiBHcmFmdCB0aGUgZmFrZSBwYXJlbnRzIGxvY2FsbHkgdG8gdGhlIGNvbW1pdCAqLworCQlpbnQgcG9zID0gNDE7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqKnBwdHIsICpwYXJlbnRzOworCisJCS8qIEZyZWUgdGhlIHJlYWwgcGFyZW50IGxpc3QgKi8KKwkJZm9yIChwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOyBwYXJlbnRzOyApIHsKKwkJCXN0cnVjdCBjb21taXRfbGlzdCAqdG1wID0gcGFyZW50cy0+bmV4dDsKKwkJCWZyZWUocGFyZW50cyk7CisJCQlwYXJlbnRzID0gdG1wOworCQl9CisJCWNvbW1pdC0+cGFyZW50cyA9IE5VTEw7CisJCXBwdHIgPSAmKGNvbW1pdC0+cGFyZW50cyk7CisJCXdoaWxlIChsaW5lW3Bvc10gJiYgIWdldF9zaGExX2hleChsaW5lICsgcG9zLCBzaGExKSkgeworCQkJc3RydWN0IGNvbW1pdCAqcGFyZW50ID0gbG9va3VwX2NvbW1pdChzaGExKTsKKwkJCWlmIChwYXJlbnQpIHsKKwkJCQlwcHRyID0gJmNvbW1pdF9saXN0X2luc2VydChwYXJlbnQsIHBwdHIpLT5uZXh0OworCQkJfQorCQkJcG9zICs9IDQxOworCQl9CisJfQorCXJldHVybiBsb2dfdHJlZV9jb21taXQoJmxvZ190cmVlX29wdCwgY29tbWl0KTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgZGlmZl90cmVlX3VzYWdlW10gPQorImdpdC1kaWZmLXRyZWUgWy0tc3RkaW5dIFstbV0gWy1jXSBbLS1jY10gWy1zXSBbLXZdIFstLXByZXR0eV0gWy10XSBbLXJdIFstLXJvb3RdICIKKyJbPGNvbW1vbiBkaWZmIG9wdGlvbnM+XSA8dHJlZS1pc2g+IFs8dHJlZS1pc2g+XSBbPHBhdGg+Li4uXVxuIgorIiAgLXIgICAgICAgICAgICBkaWZmIHJlY3Vyc2l2ZWx5XG4iCisiICAtLXJvb3QgICAgICAgIGluY2x1ZGUgdGhlIGluaXRpYWwgY29tbWl0IGFzIGRpZmYgYWdhaW5zdCAvZGV2L251bGxcbiIKK0NPTU1PTl9ESUZGX09QVElPTlNfSEVMUDsKKworaW50IGNtZF9kaWZmX3RyZWUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IG5yX3NoYTE7CisJY2hhciBsaW5lWzEwMDBdOworCXN0cnVjdCBvYmplY3QgKnRyZWUxLCAqdHJlZTI7CisJc3RhdGljIHN0cnVjdCByZXZfaW5mbyAqb3B0ID0gJmxvZ190cmVlX29wdDsKKwlpbnQgcmVhZF9zdGRpbiA9IDA7CisKKwlpbml0X3JldmlzaW9ucyhvcHQsIHByZWZpeCk7CisJZ2l0X2NvbmZpZyhnaXRfZGlmZl9iYXNpY19jb25maWcpOyAvKiBubyAiZGlmZiIgVUkgb3B0aW9ucyAqLworCW5yX3NoYTEgPSAwOworCW9wdC0+YWJicmV2ID0gMDsKKwlvcHQtPmRpZmYgPSAxOworCWFyZ2MgPSBzZXR1cF9yZXZpc2lvbnMoYXJnYywgYXJndiwgb3B0LCBOVUxMKTsKKworCXdoaWxlICgtLWFyZ2MgPiAwKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9ICorK2FyZ3Y7CisKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1zdGRpbiIpKSB7CisJCQlyZWFkX3N0ZGluID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXVzYWdlKGRpZmZfdHJlZV91c2FnZSk7CisJfQorCisJaWYgKCFvcHQtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCkKKwkJb3B0LT5kaWZmb3B0Lm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9SQVc7CisKKwkvKgorCSAqIE5PVEUhIFdlIGV4cGVjdCAiYSBeYiIgdG8gYmUgZXF1YWwgdG8gImEuLmIiLCBzbyB3ZQorCSAqIHJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSBvYmplY3RzIGlmIHRoZSBzZWNvbmQgb25lCisJICogaXMgbWFya2VkIFVOSU5URVJFU1RJTkcuCisJICovCisJbnJfc2hhMSA9IG9wdC0+cGVuZGluZy5ucjsKKwlzd2l0Y2ggKG5yX3NoYTEpIHsKKwljYXNlIDA6CisJCWlmICghcmVhZF9zdGRpbikKKwkJCXVzYWdlKGRpZmZfdHJlZV91c2FnZSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdHJlZTEgPSBvcHQtPnBlbmRpbmcub2JqZWN0c1swXS5pdGVtOworCQlkaWZmX3RyZWVfY29tbWl0X3NoYTEodHJlZTEtPnNoYTEpOworCQlicmVhazsKKwljYXNlIDI6CisJCXRyZWUxID0gb3B0LT5wZW5kaW5nLm9iamVjdHNbMF0uaXRlbTsKKwkJdHJlZTIgPSBvcHQtPnBlbmRpbmcub2JqZWN0c1sxXS5pdGVtOworCQlpZiAodHJlZTItPmZsYWdzICYgVU5JTlRFUkVTVElORykgeworCQkJc3RydWN0IG9iamVjdCAqdG1wID0gdHJlZTI7CisJCQl0cmVlMiA9IHRyZWUxOworCQkJdHJlZTEgPSB0bXA7CisJCX0KKwkJZGlmZl90cmVlX3NoYTEodHJlZTEtPnNoYTEsCisJCQkgICAgICAgdHJlZTItPnNoYTEsCisJCQkgICAgICAgIiIsICZvcHQtPmRpZmZvcHQpOworCQlsb2dfdHJlZV9kaWZmX2ZsdXNoKG9wdCk7CisJCWJyZWFrOworCX0KKworCWlmIChyZWFkX3N0ZGluKSB7CisJCWlmIChvcHQtPmRpZmZvcHQuZGV0ZWN0X3JlbmFtZSkKKwkJCW9wdC0+ZGlmZm9wdC5zZXR1cCB8PSAoRElGRl9TRVRVUF9VU0VfU0laRV9DQUNIRSB8CisJCQkJCSAgICAgICBESUZGX1NFVFVQX1VTRV9DQUNIRSk7CisJCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIHN0ZGluKSkgeworCQkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKworCQkJaWYgKGdldF9zaGExX2hleChsaW5lLCBzaGExKSkgeworCQkJCWZwdXRzKGxpbmUsIHN0ZG91dCk7CisJCQkJZmZsdXNoKHN0ZG91dCk7CisJCQl9CisJCQllbHNlCisJCQkJZGlmZl90cmVlX3N0ZGluKGxpbmUpOworCQl9CisJfQorCisJcmV0dXJuIGRpZmZfcmVzdWx0X2NvZGUoJm9wdC0+ZGlmZm9wdCwgMCk7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWRpZmYuYyBiL2J1aWx0aW4tZGlmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMmE4NDEKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWRpZmYuYwpAQCAtMCwwICsxLDM3MyBAQAorLyoKKyAqIEJ1aWx0aW4gImdpdCBkaWZmIgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBKdW5pbyBDIEhhbWFubworICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb2xvci5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiZGlmZmNvcmUuaCIKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorI2luY2x1ZGUgImxvZy10cmVlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCitzdHJ1Y3QgYmxvYmluZm8geworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBtb2RlOworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgYnVpbHRpbl9kaWZmX3VzYWdlW10gPQorImdpdC1kaWZmIDxvcHRpb25zPiA8cmV2PnswLDJ9IC0tIDxwYXRoPioiOworCitzdGF0aWMgdm9pZCBzdHVmZl9jaGFuZ2Uoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0LAorCQkJIHVuc2lnbmVkIG9sZF9tb2RlLCB1bnNpZ25lZCBuZXdfbW9kZSwKKwkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpvbGRfc2hhMSwKKwkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpuZXdfc2hhMSwKKwkJCSBjb25zdCBjaGFyICpvbGRfbmFtZSwKKwkJCSBjb25zdCBjaGFyICpuZXdfbmFtZSkKK3sKKwlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLCAqdHdvOworCisJaWYgKCFpc19udWxsX3NoYTEob2xkX3NoYTEpICYmICFpc19udWxsX3NoYTEobmV3X3NoYTEpICYmCisJICAgICFoYXNoY21wKG9sZF9zaGExLCBuZXdfc2hhMSkgJiYgKG9sZF9tb2RlID09IG5ld19tb2RlKSkKKwkJcmV0dXJuOworCisJaWYgKERJRkZfT1BUX1RTVChvcHQsIFJFVkVSU0VfRElGRikpIHsKKwkJdW5zaWduZWQgdG1wOworCQljb25zdCB1bnNpZ25lZCBjaGFyICp0bXBfdTsKKwkJY29uc3QgY2hhciAqdG1wX2M7CisJCXRtcCA9IG9sZF9tb2RlOyBvbGRfbW9kZSA9IG5ld19tb2RlOyBuZXdfbW9kZSA9IHRtcDsKKwkJdG1wX3UgPSBvbGRfc2hhMTsgb2xkX3NoYTEgPSBuZXdfc2hhMTsgbmV3X3NoYTEgPSB0bXBfdTsKKwkJdG1wX2MgPSBvbGRfbmFtZTsgb2xkX25hbWUgPSBuZXdfbmFtZTsgbmV3X25hbWUgPSB0bXBfYzsKKwl9CisKKwlpZiAob3B0LT5wcmVmaXggJiYKKwkgICAgKHN0cm5jbXAob2xkX25hbWUsIG9wdC0+cHJlZml4LCBvcHQtPnByZWZpeF9sZW5ndGgpIHx8CisJICAgICBzdHJuY21wKG5ld19uYW1lLCBvcHQtPnByZWZpeCwgb3B0LT5wcmVmaXhfbGVuZ3RoKSkpCisJCXJldHVybjsKKworCW9uZSA9IGFsbG9jX2ZpbGVzcGVjKG9sZF9uYW1lKTsKKwl0d28gPSBhbGxvY19maWxlc3BlYyhuZXdfbmFtZSk7CisJZmlsbF9maWxlc3BlYyhvbmUsIG9sZF9zaGExLCBvbGRfbW9kZSk7CisJZmlsbF9maWxlc3BlYyh0d28sIG5ld19zaGExLCBuZXdfbW9kZSk7CisKKwlkaWZmX3F1ZXVlKCZkaWZmX3F1ZXVlZF9kaWZmLCBvbmUsIHR3byk7Cit9CisKK3N0YXRpYyBpbnQgYnVpbHRpbl9kaWZmX2JfZihzdHJ1Y3QgcmV2X2luZm8gKnJldnMsCisJCQkgICAgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LAorCQkJICAgIHN0cnVjdCBibG9iaW5mbyAqYmxvYiwKKwkJCSAgICBjb25zdCBjaGFyICpwYXRoKQoreworCS8qIEJsb2IgdnMgZmlsZSBpbiB0aGUgd29ya2luZyB0cmVlKi8KKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChhcmdjID4gMSkKKwkJdXNhZ2UoYnVpbHRpbl9kaWZmX3VzYWdlKTsKKworCWlmIChsc3RhdChwYXRoLCAmc3QpKQorCQlkaWUoIiclcyc6ICVzIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwlpZiAoIShTX0lTUkVHKHN0LnN0X21vZGUpIHx8IFNfSVNMTksoc3Quc3RfbW9kZSkpKQorCQlkaWUoIiclcyc6IG5vdCBhIHJlZ3VsYXIgZmlsZSBvciBzeW1saW5rIiwgcGF0aCk7CisKKwlpZiAoYmxvYlswXS5tb2RlID09IFNfSUZJTlZBTElEKQorCQlibG9iWzBdLm1vZGUgPSBjYW5vbl9tb2RlKHN0LnN0X21vZGUpOworCisJc3R1ZmZfY2hhbmdlKCZyZXZzLT5kaWZmb3B0LAorCQkgICAgIGJsb2JbMF0ubW9kZSwgY2Fub25fbW9kZShzdC5zdF9tb2RlKSwKKwkJICAgICBibG9iWzBdLnNoYTEsIG51bGxfc2hhMSwKKwkJICAgICBwYXRoLCBwYXRoKTsKKwlkaWZmY29yZV9zdGQoJnJldnMtPmRpZmZvcHQpOworCWRpZmZfZmx1c2goJnJldnMtPmRpZmZvcHQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ1aWx0aW5fZGlmZl9ibG9icyhzdHJ1Y3QgcmV2X2luZm8gKnJldnMsCisJCQkgICAgICBpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsCisJCQkgICAgICBzdHJ1Y3QgYmxvYmluZm8gKmJsb2IpCit7CisJdW5zaWduZWQgbW9kZSA9IGNhbm9uX21vZGUoU19JRlJFRyB8IDA2NDQpOworCisJaWYgKGFyZ2MgPiAxKQorCQl1c2FnZShidWlsdGluX2RpZmZfdXNhZ2UpOworCisJaWYgKGJsb2JbMF0ubW9kZSA9PSBTX0lGSU5WQUxJRCkKKwkJYmxvYlswXS5tb2RlID0gbW9kZTsKKworCWlmIChibG9iWzFdLm1vZGUgPT0gU19JRklOVkFMSUQpCisJCWJsb2JbMV0ubW9kZSA9IG1vZGU7CisKKwlzdHVmZl9jaGFuZ2UoJnJldnMtPmRpZmZvcHQsCisJCSAgICAgYmxvYlswXS5tb2RlLCBibG9iWzFdLm1vZGUsCisJCSAgICAgYmxvYlswXS5zaGExLCBibG9iWzFdLnNoYTEsCisJCSAgICAgYmxvYlswXS5uYW1lLCBibG9iWzFdLm5hbWUpOworCWRpZmZjb3JlX3N0ZCgmcmV2cy0+ZGlmZm9wdCk7CisJZGlmZl9mbHVzaCgmcmV2cy0+ZGlmZm9wdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnVpbHRpbl9kaWZmX2luZGV4KHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJCSAgICAgIGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwlpbnQgY2FjaGVkID0gMDsKKwl3aGlsZSAoMSA8IGFyZ2MpIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndlsxXTsKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1jYWNoZWQiKSkKKwkJCWNhY2hlZCA9IDE7CisJCWVsc2UKKwkJCXVzYWdlKGJ1aWx0aW5fZGlmZl91c2FnZSk7CisJCWFyZ3YrKzsgYXJnYy0tOworCX0KKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGVyZSBpcyBvbmUgcmV2aXNpb24gKGkuZS4gcGVuZGluZyBvYmplY3QpLAorCSAqIGFuZCB0aGVyZSBpcyBubyByZXZpc2lvbiBmaWx0ZXJpbmcgcGFyYW1ldGVycy4KKwkgKi8KKwlpZiAocmV2cy0+cGVuZGluZy5uciAhPSAxIHx8CisJICAgIHJldnMtPm1heF9jb3VudCAhPSAtMSB8fCByZXZzLT5taW5fYWdlICE9IC0xIHx8CisJICAgIHJldnMtPm1heF9hZ2UgIT0gLTEpCisJCXVzYWdlKGJ1aWx0aW5fZGlmZl91c2FnZSk7CisJaWYgKHJlYWRfY2FjaGUoKSA8IDApIHsKKwkJcGVycm9yKCJyZWFkX2NhY2hlIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIHJ1bl9kaWZmX2luZGV4KHJldnMsIGNhY2hlZCk7Cit9CisKK3N0YXRpYyBpbnQgYnVpbHRpbl9kaWZmX3RyZWUoc3RydWN0IHJldl9pbmZvICpyZXZzLAorCQkJICAgICBpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsCisJCQkgICAgIHN0cnVjdCBvYmplY3RfYXJyYXlfZW50cnkgKmVudCkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICooc2hhMVsyXSk7CisJaW50IHN3YXAgPSAwOworCisJaWYgKGFyZ2MgPiAxKQorCQl1c2FnZShidWlsdGluX2RpZmZfdXNhZ2UpOworCisJLyogV2Ugc2F3IHR3byB0cmVlcywgZW50WzBdIGFuZCBlbnRbMV0uCisJICogaWYgZW50WzFdIGlzIHVuaW50ZXJlc3RpbmcsIHRoZXkgYXJlIHN3YXBwZWQKKwkgKi8KKwlpZiAoZW50WzFdLml0ZW0tPmZsYWdzICYgVU5JTlRFUkVTVElORykKKwkJc3dhcCA9IDE7CisJc2hhMVtzd2FwXSA9IGVudFswXS5pdGVtLT5zaGExOworCXNoYTFbMS1zd2FwXSA9IGVudFsxXS5pdGVtLT5zaGExOworCWRpZmZfdHJlZV9zaGExKHNoYTFbMF0sIHNoYTFbMV0sICIiLCAmcmV2cy0+ZGlmZm9wdCk7CisJbG9nX3RyZWVfZGlmZl9mbHVzaChyZXZzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidWlsdGluX2RpZmZfY29tYmluZWQoc3RydWN0IHJldl9pbmZvICpyZXZzLAorCQkJCSBpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsCisJCQkJIHN0cnVjdCBvYmplY3RfYXJyYXlfZW50cnkgKmVudCwKKwkJCQkgaW50IGVudHMpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAoKnBhcmVudClbMjBdOworCWludCBpOworCisJaWYgKGFyZ2MgPiAxKQorCQl1c2FnZShidWlsdGluX2RpZmZfdXNhZ2UpOworCisJaWYgKCFyZXZzLT5kZW5zZV9jb21iaW5lZF9tZXJnZXMgJiYgIXJldnMtPmNvbWJpbmVfbWVyZ2VzKQorCQlyZXZzLT5kZW5zZV9jb21iaW5lZF9tZXJnZXMgPSByZXZzLT5jb21iaW5lX21lcmdlcyA9IDE7CisJcGFyZW50ID0geG1hbGxvYyhlbnRzICogc2l6ZW9mKCpwYXJlbnQpKTsKKwkvKiBBZ2FpbiwgdGhlIHJldnMgYXJlIGFsbCByZXZlcnNlICovCisJZm9yIChpID0gMDsgaSA8IGVudHM7IGkrKykKKwkJaGFzaGNweSgodW5zaWduZWQgY2hhciAqKShwYXJlbnQgKyBpKSwKKwkJCWVudFtlbnRzIC0gMSAtIGldLml0ZW0tPnNoYTEpOworCWRpZmZfdHJlZV9jb21iaW5lZChwYXJlbnRbMF0sIHBhcmVudCArIDEsIGVudHMgLSAxLAorCQkJICAgcmV2cy0+ZGVuc2VfY29tYmluZWRfbWVyZ2VzLCByZXZzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmVmcmVzaF9pbmRleF9xdWlldGx5KHZvaWQpCit7CisJc3RydWN0IGxvY2tfZmlsZSAqbG9ja19maWxlOworCWludCBmZDsKKworCWxvY2tfZmlsZSA9IHhjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBsb2NrX2ZpbGUpKTsKKwlmZCA9IGhvbGRfbG9ja2VkX2luZGV4KGxvY2tfZmlsZSwgMCk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuOworCWRpc2NhcmRfY2FjaGUoKTsKKwlyZWFkX2NhY2hlKCk7CisJcmVmcmVzaF9jYWNoZShSRUZSRVNIX1FVSUVUfFJFRlJFU0hfVU5NRVJHRUQpOworCisJaWYgKGFjdGl2ZV9jYWNoZV9jaGFuZ2VkICYmCisJICAgICF3cml0ZV9jYWNoZShmZCwgYWN0aXZlX2NhY2hlLCBhY3RpdmVfbnIpKQorCQljb21taXRfbG9ja2VkX2luZGV4KGxvY2tfZmlsZSk7CisKKwlyb2xsYmFja19sb2NrX2ZpbGUobG9ja19maWxlKTsKK30KKworaW50IGNtZF9kaWZmKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBpOworCXN0cnVjdCByZXZfaW5mbyByZXY7CisJc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSBlbnRbMTAwXTsKKwlpbnQgZW50cyA9IDAsIGJsb2JzID0gMCwgcGF0aHMgPSAwOworCWNvbnN0IGNoYXIgKnBhdGggPSBOVUxMOworCXN0cnVjdCBibG9iaW5mbyBibG9iWzJdOworCWludCBub25naXQ7CisJaW50IHJlc3VsdCA9IDA7CisKKwkvKgorCSAqIFdlIGNvdWxkIGdldCBOIHRyZWUtaXNoIGluIHRoZSByZXYucGVuZGluZ19vYmplY3RzIGxpc3QuCisJICogQWxzbyB0aGVyZSBjb3VsZCBiZSBNIGJsb2JzIHRoZXJlLCBhbmQgUCBwYXRoc3BlY3MuCisJICoKKwkgKiBOPTAsIE09MDoKKwkgKgljYWNoZSB2cyBmaWxlcyAoZGlmZi1maWxlcykKKwkgKiBOPTAsIE09MjoKKwkgKiAgICAgIGNvbXBhcmUgdHdvIHJhbmRvbSBibG9icy4gIFAgbXVzdCBiZSB6ZXJvLgorCSAqIE49MCwgTT0xLCBQPTE6CisJICoJY29tcGFyZSBhIGJsb2Igd2l0aCBhIHdvcmtpbmcgdHJlZSBmaWxlLgorCSAqCisJICogTj0xLCBNPTA6CisJICogICAgICB0cmVlIHZzIGNhY2hlIChkaWZmLWluZGV4IC0tY2FjaGVkKQorCSAqCisJICogTj0yLCBNPTA6CisJICogICAgICB0cmVlIHZzIHRyZWUgKGRpZmYtdHJlZSkKKwkgKgorCSAqIE90aGVyIGNhc2VzIGFyZSBlcnJvcnMuCisJICovCisKKwlwcmVmaXggPSBzZXR1cF9naXRfZGlyZWN0b3J5X2dlbnRseSgmbm9uZ2l0KTsKKwlnaXRfY29uZmlnKGdpdF9kaWZmX3VpX2NvbmZpZyk7CisKKwlpZiAoZGlmZl91c2VfY29sb3JfZGVmYXVsdCA9PSAtMSkKKwkJZGlmZl91c2VfY29sb3JfZGVmYXVsdCA9IGdpdF91c2VfY29sb3JfZGVmYXVsdDsKKworCWluaXRfcmV2aXNpb25zKCZyZXYsIHByZWZpeCk7CisJcmV2LmRpZmZvcHQuc2tpcF9zdGF0X3VubWF0Y2ggPSAhIWRpZmZfYXV0b19yZWZyZXNoX2luZGV4OworCisJaWYgKCFzZXR1cF9kaWZmX25vX2luZGV4KCZyZXYsIGFyZ2MsIGFyZ3YsIG5vbmdpdCwgcHJlZml4KSkKKwkJYXJnYyA9IDA7CisJZWxzZQorCQlhcmdjID0gc2V0dXBfcmV2aXNpb25zKGFyZ2MsIGFyZ3YsICZyZXYsIE5VTEwpOworCWlmICghcmV2LmRpZmZvcHQub3V0cHV0X2Zvcm1hdCkgeworCQlyZXYuZGlmZm9wdC5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfUEFUQ0g7CisJCWlmIChkaWZmX3NldHVwX2RvbmUoJnJldi5kaWZmb3B0KSA8IDApCisJCQlkaWUoImRpZmZfc2V0dXBfZG9uZSBmYWlsZWQiKTsKKwl9CisJaWYgKHJldi5kaWZmb3B0LnByZWZpeCAmJiBub25naXQpIHsKKwkJcmV2LmRpZmZvcHQucHJlZml4ID0gTlVMTDsKKwkJcmV2LmRpZmZvcHQucHJlZml4X2xlbmd0aCA9IDA7CisJfQorCURJRkZfT1BUX1NFVCgmcmV2LmRpZmZvcHQsIEFMTE9XX0VYVEVSTkFMKTsKKwlESUZGX09QVF9TRVQoJnJldi5kaWZmb3B0LCBSRUNVUlNJVkUpOworCisJLyoKKwkgKiBJZiB0aGUgdXNlciBhc2tlZCBmb3Igb3VyIGV4aXQgY29kZSB0aGVuIGRvbid0IHN0YXJ0IGEKKwkgKiBwYWdlciBvciB3ZSB3b3VsZCBlbmQgdXAgcmVwb3J0aW5nIGl0cyBleGl0IGNvZGUgaW5zdGVhZC4KKwkgKi8KKwlpZiAoIURJRkZfT1BUX1RTVCgmcmV2LmRpZmZvcHQsIEVYSVRfV0lUSF9TVEFUVVMpKQorCQlzZXR1cF9wYWdlcigpOworCisJLyogRG8gd2UgaGF2ZSAtLWNhY2hlZCBhbmQgbm90IGhhdmUgYSBwZW5kaW5nIG9iamVjdCwgdGhlbgorCSAqIGRlZmF1bHQgdG8gSEVBRCBieSBoYW5kLiAgRWVrLgorCSAqLworCWlmICghcmV2LnBlbmRpbmcubnIpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCQlpZiAoIXN0cmNtcChhcmcsICItLSIpKQorCQkJCWJyZWFrOworCQkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWNhY2hlZCIpKSB7CisJCQkJYWRkX2hlYWRfdG9fcGVuZGluZygmcmV2KTsKKwkJCQlpZiAoIXJldi5wZW5kaW5nLm5yKQorCQkJCQlkaWUoIk5vIEhFQUQgY29tbWl0IHRvIGNvbXBhcmUgd2l0aCAoeWV0KSIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IHJldi5wZW5kaW5nLm5yOyBpKyspIHsKKwkJc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSAqbGlzdCA9IHJldi5wZW5kaW5nLm9iamVjdHMraTsKKwkJc3RydWN0IG9iamVjdCAqb2JqID0gbGlzdC0+aXRlbTsKKwkJY29uc3QgY2hhciAqbmFtZSA9IGxpc3QtPm5hbWU7CisJCWludCBmbGFncyA9IChvYmotPmZsYWdzICYgVU5JTlRFUkVTVElORyk7CisJCWlmICghb2JqLT5wYXJzZWQpCisJCQlvYmogPSBwYXJzZV9vYmplY3Qob2JqLT5zaGExKTsKKwkJb2JqID0gZGVyZWZfdGFnKG9iaiwgTlVMTCwgMCk7CisJCWlmICghb2JqKQorCQkJZGllKCJpbnZhbGlkIG9iamVjdCAnJXMnIGdpdmVuLiIsIG5hbWUpOworCQlpZiAob2JqLT50eXBlID09IE9CSl9DT01NSVQpCisJCQlvYmogPSAmKChzdHJ1Y3QgY29tbWl0ICopb2JqKS0+dHJlZS0+b2JqZWN0OworCQlpZiAob2JqLT50eXBlID09IE9CSl9UUkVFKSB7CisJCQlpZiAoQVJSQVlfU0laRShlbnQpIDw9IGVudHMpCisJCQkJZGllKCJtb3JlIHRoYW4gJWQgdHJlZXMgZ2l2ZW46ICclcyciLAorCQkJCSAgICAoaW50KSBBUlJBWV9TSVpFKGVudCksIG5hbWUpOworCQkJb2JqLT5mbGFncyB8PSBmbGFnczsKKwkJCWVudFtlbnRzXS5pdGVtID0gb2JqOworCQkJZW50W2VudHNdLm5hbWUgPSBuYW1lOworCQkJZW50cysrOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG9iai0+dHlwZSA9PSBPQkpfQkxPQikgeworCQkJaWYgKDIgPD0gYmxvYnMpCisJCQkJZGllKCJtb3JlIHRoYW4gdHdvIGJsb2JzIGdpdmVuOiAnJXMnIiwgbmFtZSk7CisJCQloYXNoY3B5KGJsb2JbYmxvYnNdLnNoYTEsIG9iai0+c2hhMSk7CisJCQlibG9iW2Jsb2JzXS5uYW1lID0gbmFtZTsKKwkJCWJsb2JbYmxvYnNdLm1vZGUgPSBsaXN0LT5tb2RlOworCQkJYmxvYnMrKzsKKwkJCWNvbnRpbnVlOworCisJCX0KKwkJZGllKCJ1bmhhbmRsZWQgb2JqZWN0ICclcycgZ2l2ZW4uIiwgbmFtZSk7CisJfQorCWlmIChyZXYucHJ1bmVfZGF0YSkgeworCQljb25zdCBjaGFyICoqcGF0aHNwZWMgPSByZXYucHJ1bmVfZGF0YTsKKwkJd2hpbGUgKCpwYXRoc3BlYykgeworCQkJaWYgKCFwYXRoKQorCQkJCXBhdGggPSAqcGF0aHNwZWM7CisJCQlwYXRocysrOworCQkJcGF0aHNwZWMrKzsKKwkJfQorCX0KKworCS8qCisJICogTm93LCBkbyB0aGUgYXJndW1lbnRzIGxvb2sgcmVhc29uYWJsZT8KKwkgKi8KKwlpZiAoIWVudHMpIHsKKwkJc3dpdGNoIChibG9icykgeworCQljYXNlIDA6CisJCQlyZXN1bHQgPSBydW5fZGlmZl9maWxlc19jbWQoJnJldiwgYXJnYywgYXJndik7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJaWYgKHBhdGhzICE9IDEpCisJCQkJdXNhZ2UoYnVpbHRpbl9kaWZmX3VzYWdlKTsKKwkJCXJlc3VsdCA9IGJ1aWx0aW5fZGlmZl9iX2YoJnJldiwgYXJnYywgYXJndiwgYmxvYiwgcGF0aCk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJaWYgKHBhdGhzKQorCQkJCXVzYWdlKGJ1aWx0aW5fZGlmZl91c2FnZSk7CisJCQlyZXN1bHQgPSBidWlsdGluX2RpZmZfYmxvYnMoJnJldiwgYXJnYywgYXJndiwgYmxvYik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKGJ1aWx0aW5fZGlmZl91c2FnZSk7CisJCX0KKwl9CisJZWxzZSBpZiAoYmxvYnMpCisJCXVzYWdlKGJ1aWx0aW5fZGlmZl91c2FnZSk7CisJZWxzZSBpZiAoZW50cyA9PSAxKQorCQlyZXN1bHQgPSBidWlsdGluX2RpZmZfaW5kZXgoJnJldiwgYXJnYywgYXJndik7CisJZWxzZSBpZiAoZW50cyA9PSAyKQorCQlyZXN1bHQgPSBidWlsdGluX2RpZmZfdHJlZSgmcmV2LCBhcmdjLCBhcmd2LCBlbnQpOworCWVsc2UgaWYgKChlbnRzID09IDMpICYmIChlbnRbMF0uaXRlbS0+ZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSkgeworCQkvKiBkaWZmIEEuLi5CIHdoZXJlIHRoZXJlIGlzIG9uZSBzYW5lIG1lcmdlIGJhc2UgYmV0d2VlbgorCQkgKiBBIGFuZCBCLiAgV2UgaGF2ZSBlbnRbMF0gPT0gbWVyZ2UtYmFzZSwgZW50WzFdID09IEEsCisJCSAqIGFuZCBlbnRbMl0gPT0gQi4gIFNob3cgZGlmZiBiZXR3ZWVuIHRoZSBiYXNlIGFuZCBCLgorCQkgKi8KKwkJZW50WzFdID0gZW50WzJdOworCQlyZXN1bHQgPSBidWlsdGluX2RpZmZfdHJlZSgmcmV2LCBhcmdjLCBhcmd2LCBlbnQpOworCX0KKwllbHNlCisJCXJlc3VsdCA9IGJ1aWx0aW5fZGlmZl9jb21iaW5lZCgmcmV2LCBhcmdjLCBhcmd2LAorCQkJCQkgICAgIGVudCwgZW50cyk7CisJcmVzdWx0ID0gZGlmZl9yZXN1bHRfY29kZSgmcmV2LmRpZmZvcHQsIHJlc3VsdCk7CisJaWYgKDEgPCByZXYuZGlmZm9wdC5za2lwX3N0YXRfdW5tYXRjaCkKKwkJcmVmcmVzaF9pbmRleF9xdWlldGx5KCk7CisJcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tZmFzdC1leHBvcnQuYyBiL2J1aWx0aW4tZmFzdC1leHBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMWM1NjMwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1mYXN0LWV4cG9ydC5jCkBAIC0wLDAgKzEsNDA2IEBACisvKgorICogImdpdCBmYXN0LWV4cG9ydCIgYnVpbHRpbiBjb21tYW5kCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEpvaGFubmVzIEUuIFNjaGluZGVsaW4KKyAqLworI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJkaWZmY29yZS5oIgorI2luY2x1ZGUgImxvZy10cmVlLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJkZWNvcmF0ZS5oIgorI2luY2x1ZGUgInBhdGgtbGlzdC5oIgorI2luY2x1ZGUgInV0ZjguaCIKKyNpbmNsdWRlICJwYXJzZS1vcHRpb25zLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICpmYXN0X2V4cG9ydF91c2FnZVtdID0geworCSJnaXQtZmFzdC1leHBvcnQgW3Jldi1saXN0LW9wdHNdIiwKKwlOVUxMCit9OworCitzdGF0aWMgaW50IHByb2dyZXNzOworc3RhdGljIGVudW0geyBWRVJCQVRJTSwgV0FSTiwgU1RSSVAsIEFCT1JUIH0gc2lnbmVkX3RhZ19tb2RlID0gQUJPUlQ7CisKK3N0YXRpYyBpbnQgcGFyc2Vfb3B0X3NpZ25lZF90YWdfbW9kZShjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHQsCisJCQkJICAgICBjb25zdCBjaGFyICphcmcsIGludCB1bnNldCkKK3sKKwlpZiAodW5zZXQgfHwgIXN0cmNtcChhcmcsICJhYm9ydCIpKQorCQlzaWduZWRfdGFnX21vZGUgPSBBQk9SVDsKKwllbHNlIGlmICghc3RyY21wKGFyZywgInZlcmJhdGltIikgfHwgIXN0cmNtcChhcmcsICJpZ25vcmUiKSkKKwkJc2lnbmVkX3RhZ19tb2RlID0gVkVSQkFUSU07CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJ3YXJuIikpCisJCXNpZ25lZF90YWdfbW9kZSA9IFdBUk47CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJzdHJpcCIpKQorCQlzaWduZWRfdGFnX21vZGUgPSBTVFJJUDsKKwllbHNlCisJCXJldHVybiBlcnJvcigiVW5rbm93biBzaWduZWQtdGFnIG1vZGU6ICVzIiwgYXJnKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZWNvcmF0aW9uIGlkbnVtczsKK3N0YXRpYyB1aW50MzJfdCBsYXN0X2lkbnVtOworCitzdGF0aWMgaW50IGhhc191bnNob3duX3BhcmVudChzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnQ7CisKKwlmb3IgKHBhcmVudCA9IGNvbW1pdC0+cGFyZW50czsgcGFyZW50OyBwYXJlbnQgPSBwYXJlbnQtPm5leHQpCisJCWlmICghKHBhcmVudC0+aXRlbS0+b2JqZWN0LmZsYWdzICYgU0hPV04pICYmCisJCSAgICAhKHBhcmVudC0+aXRlbS0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykpCisJCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyogU2luY2UgaW50cHRyX3QgaXMgQzk5LCB3ZSBkbyBub3QgdXNlIGl0IGhlcmUgKi8KK3N0YXRpYyB2b2lkIG1hcmtfb2JqZWN0KHN0cnVjdCBvYmplY3QgKm9iamVjdCkKK3sKKwlsYXN0X2lkbnVtKys7CisJYWRkX2RlY29yYXRpb24oJmlkbnVtcywgb2JqZWN0LCAoKHVpbnQzMl90ICopTlVMTCkgKyBsYXN0X2lkbnVtKTsKK30KKworc3RhdGljIGludCBnZXRfb2JqZWN0X21hcmsoc3RydWN0IG9iamVjdCAqb2JqZWN0KQoreworCXZvaWQgKmRlY29yYXRpb24gPSBsb29rdXBfZGVjb3JhdGlvbigmaWRudW1zLCBvYmplY3QpOworCWlmICghZGVjb3JhdGlvbikKKwkJcmV0dXJuIDA7CisJcmV0dXJuICh1aW50MzJfdCAqKWRlY29yYXRpb24gLSAodWludDMyX3QgKilOVUxMOworfQorCitzdGF0aWMgdm9pZCBzaG93X3Byb2dyZXNzKHZvaWQpCit7CisJc3RhdGljIGludCBjb3VudGVyID0gMDsKKwlpZiAoIXByb2dyZXNzKQorCQlyZXR1cm47CisJaWYgKCgrK2NvdW50ZXIgJSBwcm9ncmVzcykgPT0gMCkKKwkJcHJpbnRmKCJwcm9ncmVzcyAlZCBvYmplY3RzXG4iLCBjb3VudGVyKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX29iamVjdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJY2hhciAqYnVmOworCXN0cnVjdCBvYmplY3QgKm9iamVjdDsKKworCWlmIChpc19udWxsX3NoYTEoc2hhMSkpCisJCXJldHVybjsKKworCW9iamVjdCA9IHBhcnNlX29iamVjdChzaGExKTsKKwlpZiAoIW9iamVjdCkKKwkJZGllICgiQ291bGQgbm90IHJlYWQgYmxvYiAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKworCWlmIChvYmplY3QtPmZsYWdzICYgU0hPV04pCisJCXJldHVybjsKKworCWJ1ZiA9IHJlYWRfc2hhMV9maWxlKHNoYTEsICZ0eXBlLCAmc2l6ZSk7CisJaWYgKCFidWYpCisJCWRpZSAoIkNvdWxkIG5vdCByZWFkIGJsb2IgJXMiLCBzaGExX3RvX2hleChzaGExKSk7CisKKwltYXJrX29iamVjdChvYmplY3QpOworCisJcHJpbnRmKCJibG9iXG5tYXJrIDolZFxuZGF0YSAlbHVcbiIsIGxhc3RfaWRudW0sIHNpemUpOworCWlmIChzaXplICYmIGZ3cml0ZShidWYsIHNpemUsIDEsIHN0ZG91dCkgIT0gMSkKKwkJZGllICgiQ291bGQgbm90IHdyaXRlIGJsb2IgJXMiLCBzaGExX3RvX2hleChzaGExKSk7CisJcHJpbnRmKCJcbiIpOworCisJc2hvd19wcm9ncmVzcygpOworCisJb2JqZWN0LT5mbGFncyB8PSBTSE9XTjsKKwlmcmVlKGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfZmlsZW1vZGlmeShzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKnEsCisJCQkgICAgc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywgdm9pZCAqZGF0YSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqc3BlYyA9IHEtPnF1ZXVlW2ldLT50d287CisJCWlmIChpc19udWxsX3NoYTEoc3BlYy0+c2hhMSkpCisJCQlwcmludGYoIkQgJXNcbiIsIHNwZWMtPnBhdGgpOworCQllbHNlIHsKKwkJCXN0cnVjdCBvYmplY3QgKm9iamVjdCA9IGxvb2t1cF9vYmplY3Qoc3BlYy0+c2hhMSk7CisJCQlwcmludGYoIk0gJTA2byA6JWQgJXNcbiIsIHNwZWMtPm1vZGUsCisJCQkgICAgICAgZ2V0X29iamVjdF9tYXJrKG9iamVjdCksIHNwZWMtPnBhdGgpOworCQl9CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqZmluZF9lbmNvZGluZyhjb25zdCBjaGFyICpiZWdpbiwgY29uc3QgY2hhciAqZW5kKQoreworCWNvbnN0IGNoYXIgKm5lZWRsZSA9ICJcbmVuY29kaW5nICI7CisJY2hhciAqYm9sLCAqZW9sOworCisJYm9sID0gbWVtbWVtKGJlZ2luLCBlbmQgPyBlbmQgLSBiZWdpbiA6IHN0cmxlbihiZWdpbiksCisJCSAgICAgbmVlZGxlLCBzdHJsZW4obmVlZGxlKSk7CisJaWYgKCFib2wpCisJCXJldHVybiBnaXRfY29tbWl0X2VuY29kaW5nOworCWJvbCArPSBzdHJsZW4obmVlZGxlKTsKKwllb2wgPSBzdHJjaHJudWwoYm9sLCAnXG4nKTsKKwkqZW9sID0gJ1wwJzsKKwlyZXR1cm4gYm9sOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfY29tbWl0KHN0cnVjdCBjb21taXQgKmNvbW1pdCwgc3RydWN0IHJldl9pbmZvICpyZXYpCit7CisJaW50IHNhdmVkX291dHB1dF9mb3JtYXQgPSByZXYtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdDsKKwljb25zdCBjaGFyICphdXRob3IsICphdXRob3JfZW5kLCAqY29tbWl0dGVyLCAqY29tbWl0dGVyX2VuZDsKKwljb25zdCBjaGFyICplbmNvZGluZywgKm1lc3NhZ2U7CisJY2hhciAqcmVlbmNvZGVkID0gTlVMTDsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnA7CisJaW50IGk7CisKKwlyZXYtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX0NBTExCQUNLOworCisJcGFyc2VfY29tbWl0KGNvbW1pdCk7CisJYXV0aG9yID0gc3Ryc3RyKGNvbW1pdC0+YnVmZmVyLCAiXG5hdXRob3IgIik7CisJaWYgKCFhdXRob3IpCisJCWRpZSAoIkNvdWxkIG5vdCBmaW5kIGF1dGhvciBpbiBjb21taXQgJXMiLAorCQkgICAgIHNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKwlhdXRob3IrKzsKKwlhdXRob3JfZW5kID0gc3RyY2hybnVsKGF1dGhvciwgJ1xuJyk7CisJY29tbWl0dGVyID0gc3Ryc3RyKGF1dGhvcl9lbmQsICJcbmNvbW1pdHRlciAiKTsKKwlpZiAoIWNvbW1pdHRlcikKKwkJZGllICgiQ291bGQgbm90IGZpbmQgY29tbWl0dGVyIGluIGNvbW1pdCAlcyIsCisJCSAgICAgc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCWNvbW1pdHRlcisrOworCWNvbW1pdHRlcl9lbmQgPSBzdHJjaHJudWwoY29tbWl0dGVyLCAnXG4nKTsKKwltZXNzYWdlID0gc3Ryc3RyKGNvbW1pdHRlcl9lbmQsICJcblxuIik7CisJZW5jb2RpbmcgPSBmaW5kX2VuY29kaW5nKGNvbW1pdHRlcl9lbmQsIG1lc3NhZ2UpOworCWlmIChtZXNzYWdlKQorCQltZXNzYWdlICs9IDI7CisKKwlpZiAoY29tbWl0LT5wYXJlbnRzKSB7CisJCXBhcnNlX2NvbW1pdChjb21taXQtPnBhcmVudHMtPml0ZW0pOworCQlkaWZmX3RyZWVfc2hhMShjb21taXQtPnBhcmVudHMtPml0ZW0tPnRyZWUtPm9iamVjdC5zaGExLAorCQkJICAgICAgIGNvbW1pdC0+dHJlZS0+b2JqZWN0LnNoYTEsICIiLCAmcmV2LT5kaWZmb3B0KTsKKwl9CisJZWxzZQorCQlkaWZmX3Jvb3RfdHJlZV9zaGExKGNvbW1pdC0+dHJlZS0+b2JqZWN0LnNoYTEsCisJCQkJICAgICIiLCAmcmV2LT5kaWZmb3B0KTsKKworCWZvciAoaSA9IDA7IGkgPCBkaWZmX3F1ZXVlZF9kaWZmLm5yOyBpKyspCisJCWhhbmRsZV9vYmplY3QoZGlmZl9xdWV1ZWRfZGlmZi5xdWV1ZVtpXS0+dHdvLT5zaGExKTsKKworCW1hcmtfb2JqZWN0KCZjb21taXQtPm9iamVjdCk7CisJaWYgKCFpc19lbmNvZGluZ191dGY4KGVuY29kaW5nKSkKKwkJcmVlbmNvZGVkID0gcmVlbmNvZGVfc3RyaW5nKG1lc3NhZ2UsICJVVEYtOCIsIGVuY29kaW5nKTsKKwlwcmludGYoImNvbW1pdCAlc1xubWFyayA6JWRcbiUuKnNcbiUuKnNcbmRhdGEgJXVcbiVzIiwKKwkgICAgICAgKGNvbnN0IGNoYXIgKiljb21taXQtPnV0aWwsIGxhc3RfaWRudW0sCisJICAgICAgIChpbnQpKGF1dGhvcl9lbmQgLSBhdXRob3IpLCBhdXRob3IsCisJICAgICAgIChpbnQpKGNvbW1pdHRlcl9lbmQgLSBjb21taXR0ZXIpLCBjb21taXR0ZXIsCisJICAgICAgICh1bnNpZ25lZCkocmVlbmNvZGVkCisJCQkgID8gc3RybGVuKHJlZW5jb2RlZCkgOiBtZXNzYWdlCisJCQkgID8gc3RybGVuKG1lc3NhZ2UpIDogMCksCisJICAgICAgIHJlZW5jb2RlZCA/IHJlZW5jb2RlZCA6IG1lc3NhZ2UgPyBtZXNzYWdlIDogIiIpOworCWZyZWUocmVlbmNvZGVkKTsKKworCWZvciAoaSA9IDAsIHAgPSBjb21taXQtPnBhcmVudHM7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWludCBtYXJrID0gZ2V0X29iamVjdF9tYXJrKCZwLT5pdGVtLT5vYmplY3QpOworCQlpZiAoIW1hcmspCisJCQljb250aW51ZTsKKwkJaWYgKGkgPT0gMCkKKwkJCXByaW50ZigiZnJvbSA6JWRcbiIsIG1hcmspOworCQllbHNlIGlmIChpID09IDEpCisJCQlwcmludGYoIm1lcmdlIDolZCIsIG1hcmspOworCQllbHNlCisJCQlwcmludGYoIiA6JWQiLCBtYXJrKTsKKwkJaSsrOworCX0KKwlpZiAoaSA+IDEpCisJCXByaW50ZigiXG4iKTsKKworCWxvZ190cmVlX2RpZmZfZmx1c2gocmV2KTsKKwlyZXYtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCA9IHNhdmVkX291dHB1dF9mb3JtYXQ7CisKKwlwcmludGYoIlxuIik7CisKKwlzaG93X3Byb2dyZXNzKCk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV90YWlsKHN0cnVjdCBvYmplY3RfYXJyYXkgKmNvbW1pdHMsIHN0cnVjdCByZXZfaW5mbyAqcmV2cykKK3sKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisJd2hpbGUgKGNvbW1pdHMtPm5yKSB7CisJCWNvbW1pdCA9IChzdHJ1Y3QgY29tbWl0ICopY29tbWl0cy0+b2JqZWN0c1tjb21taXRzLT5uciAtIDFdLml0ZW07CisJCWlmIChoYXNfdW5zaG93bl9wYXJlbnQoY29tbWl0KSkKKwkJCXJldHVybjsKKwkJaGFuZGxlX2NvbW1pdChjb21taXQsIHJldnMpOworCQljb21taXRzLT5uci0tOworCX0KK30KKworc3RhdGljIHZvaWQgaGFuZGxlX3RhZyhjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgdGFnICp0YWcpCit7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwljaGFyICpidWY7CisJY29uc3QgY2hhciAqdGFnZ2VyLCAqdGFnZ2VyX2VuZCwgKm1lc3NhZ2U7CisJc2l6ZV90IG1lc3NhZ2Vfc2l6ZSA9IDA7CisKKwlidWYgPSByZWFkX3NoYTFfZmlsZSh0YWctPm9iamVjdC5zaGExLCAmdHlwZSwgJnNpemUpOworCWlmICghYnVmKQorCQlkaWUgKCJDb3VsZCBub3QgcmVhZCB0YWcgJXMiLCBzaGExX3RvX2hleCh0YWctPm9iamVjdC5zaGExKSk7CisJbWVzc2FnZSA9IG1lbW1lbShidWYsIHNpemUsICJcblxuIiwgMik7CisJaWYgKG1lc3NhZ2UpIHsKKwkJbWVzc2FnZSArPSAyOworCQltZXNzYWdlX3NpemUgPSBzdHJsZW4obWVzc2FnZSk7CisJfQorCXRhZ2dlciA9IG1lbW1lbShidWYsIG1lc3NhZ2UgPyBtZXNzYWdlIC0gYnVmIDogc2l6ZSwgIlxudGFnZ2VyICIsIDgpOworCWlmICghdGFnZ2VyKQorCQlkaWUgKCJObyB0YWdnZXIgZm9yIHRhZyAlcyIsIHNoYTFfdG9faGV4KHRhZy0+b2JqZWN0LnNoYTEpKTsKKwl0YWdnZXIrKzsKKwl0YWdnZXJfZW5kID0gc3RyY2hybnVsKHRhZ2dlciwgJ1xuJyk7CisKKwkvKiBoYW5kbGUgc2lnbmVkIHRhZ3MgKi8KKwlpZiAobWVzc2FnZSkgeworCQljb25zdCBjaGFyICpzaWduYXR1cmUgPSBzdHJzdHIobWVzc2FnZSwKKwkJCQkJICAgICAgICJcbi0tLS0tQkVHSU4gUEdQIFNJR05BVFVSRS0tLS0tXG4iKTsKKwkJaWYgKHNpZ25hdHVyZSkKKwkJCXN3aXRjaChzaWduZWRfdGFnX21vZGUpIHsKKwkJCWNhc2UgQUJPUlQ6CisJCQkJZGllICgiRW5jb3VudGVyZWQgc2lnbmVkIHRhZyAlczsgdXNlICIKKwkJCQkgICAgICItLXNpZ25lZC10YWc9PG1vZGU+IHRvIGhhbmRsZSBpdC4iLAorCQkJCSAgICAgc2hhMV90b19oZXgodGFnLT5vYmplY3Quc2hhMSkpOworCQkJY2FzZSBXQVJOOgorCQkJCXdhcm5pbmcgKCJFeHBvcnRpbmcgc2lnbmVkIHRhZyAlcyIsCisJCQkJCSBzaGExX3RvX2hleCh0YWctPm9iamVjdC5zaGExKSk7CisJCQkJLyogZmFsbHRocnUgKi8KKwkJCWNhc2UgVkVSQkFUSU06CisJCQkJYnJlYWs7CisJCQljYXNlIFNUUklQOgorCQkJCW1lc3NhZ2Vfc2l6ZSA9IHNpZ25hdHVyZSArIDEgLSBtZXNzYWdlOworCQkJCWJyZWFrOworCQkJfQorCX0KKworCWlmICghcHJlZml4Y21wKG5hbWUsICJyZWZzL3RhZ3MvIikpCisJCW5hbWUgKz0gMTA7CisJcHJpbnRmKCJ0YWcgJXNcbmZyb20gOiVkXG4lLipzXG5kYXRhICVkXG4lLipzXG4iLAorCSAgICAgICBuYW1lLCBnZXRfb2JqZWN0X21hcmsodGFnLT50YWdnZWQpLAorCSAgICAgICAoaW50KSh0YWdnZXJfZW5kIC0gdGFnZ2VyKSwgdGFnZ2VyLAorCSAgICAgICAoaW50KW1lc3NhZ2Vfc2l6ZSwgKGludCltZXNzYWdlX3NpemUsIG1lc3NhZ2UgPyBtZXNzYWdlIDogIiIpOworfQorCitzdGF0aWMgdm9pZCBnZXRfdGFnc19hbmRfZHVwbGljYXRlcyhzdHJ1Y3Qgb2JqZWN0X2FycmF5ICpwZW5kaW5nLAorCQkJCSAgICBzdHJ1Y3QgcGF0aF9saXN0ICpleHRyYV9yZWZzKQoreworCXN0cnVjdCB0YWcgKnRhZzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwZW5kaW5nLT5ucjsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3RfYXJyYXlfZW50cnkgKmUgPSBwZW5kaW5nLT5vYmplY3RzICsgaTsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gY29tbWl0OworCQljaGFyICpmdWxsX25hbWU7CisKKwkJaWYgKGR3aW1fcmVmKGUtPm5hbWUsIHN0cmxlbihlLT5uYW1lKSwgc2hhMSwgJmZ1bGxfbmFtZSkgIT0gMSkKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAoZS0+aXRlbS0+dHlwZSkgeworCQljYXNlIE9CSl9DT01NSVQ6CisJCQljb21taXQgPSAoc3RydWN0IGNvbW1pdCAqKWUtPml0ZW07CisJCQlicmVhazsKKwkJY2FzZSBPQkpfVEFHOgorCQkJdGFnID0gKHN0cnVjdCB0YWcgKillLT5pdGVtOworCQkJd2hpbGUgKHRhZyAmJiB0YWctPm9iamVjdC50eXBlID09IE9CSl9UQUcpIHsKKwkJCQlwYXRoX2xpc3RfaW5zZXJ0KGZ1bGxfbmFtZSwgZXh0cmFfcmVmcyktPnV0aWwgPSB0YWc7CisJCQkJdGFnID0gKHN0cnVjdCB0YWcgKil0YWctPnRhZ2dlZDsKKwkJCX0KKwkJCWlmICghdGFnKQorCQkJCWRpZSAoIlRhZyAlcyBwb2ludHMgbm93aGVyZT8iLCBlLT5uYW1lKTsKKwkJCXN3aXRjaCh0YWctPm9iamVjdC50eXBlKSB7CisJCQljYXNlIE9CSl9DT01NSVQ6CisJCQkJY29tbWl0ID0gKHN0cnVjdCBjb21taXQgKil0YWc7CisJCQkJYnJlYWs7CisJCQljYXNlIE9CSl9CTE9COgorCQkJCWhhbmRsZV9vYmplY3QodGFnLT5vYmplY3Quc2hhMSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRpZSAoIlVuZXhwZWN0ZWQgb2JqZWN0IG9mIHR5cGUgJXMiLAorCQkJICAgICB0eXBlbmFtZShlLT5pdGVtLT50eXBlKSk7CisJCX0KKwkJaWYgKGNvbW1pdC0+dXRpbCkKKwkJCS8qIG1vcmUgdGhhbiBvbmUgbmFtZSBmb3IgdGhlIHNhbWUgb2JqZWN0ICovCisJCQlwYXRoX2xpc3RfaW5zZXJ0KGZ1bGxfbmFtZSwgZXh0cmFfcmVmcyktPnV0aWwgPSBjb21taXQ7CisJCWVsc2UKKwkJCWNvbW1pdC0+dXRpbCA9IGZ1bGxfbmFtZTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV90YWdzX2FuZF9kdXBsaWNhdGVzKHN0cnVjdCBwYXRoX2xpc3QgKmV4dHJhX3JlZnMpCit7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCWludCBpOworCisJZm9yIChpID0gZXh0cmFfcmVmcy0+bnIgLSAxOyBpID49IDA7IGktLSkgeworCQljb25zdCBjaGFyICpuYW1lID0gZXh0cmFfcmVmcy0+aXRlbXNbaV0ucGF0aDsKKwkJc3RydWN0IG9iamVjdCAqb2JqZWN0ID0gZXh0cmFfcmVmcy0+aXRlbXNbaV0udXRpbDsKKwkJc3dpdGNoIChvYmplY3QtPnR5cGUpIHsKKwkJY2FzZSBPQkpfVEFHOgorCQkJaGFuZGxlX3RhZyhuYW1lLCAoc3RydWN0IHRhZyAqKW9iamVjdCk7CisJCQlicmVhazsKKwkJY2FzZSBPQkpfQ09NTUlUOgorCQkJLyogY3JlYXRlIHJlZnMgcG9pbnRpbmcgdG8gYWxyZWFkeSBzZWVuIGNvbW1pdHMgKi8KKwkJCWNvbW1pdCA9IChzdHJ1Y3QgY29tbWl0ICopb2JqZWN0OworCQkJcHJpbnRmKCJyZXNldCAlc1xuZnJvbSA6JWRcblxuIiwgbmFtZSwKKwkJCSAgICAgICBnZXRfb2JqZWN0X21hcmsoJmNvbW1pdC0+b2JqZWN0KSk7CisJCQlzaG93X3Byb2dyZXNzKCk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworaW50IGNtZF9mYXN0X2V4cG9ydChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgcmV2X2luZm8gcmV2czsKKwlzdHJ1Y3Qgb2JqZWN0X2FycmF5IGNvbW1pdHMgPSB7IDAsIDAsIE5VTEwgfTsKKwlzdHJ1Y3QgcGF0aF9saXN0IGV4dHJhX3JlZnMgPSB7IE5VTEwsIDAsIDAsIDAgfTsKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisJc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisJCU9QVF9JTlRFR0VSKDAsICJwcm9ncmVzcyIsICZwcm9ncmVzcywKKwkJCSAgICAic2hvdyBwcm9ncmVzcyBhZnRlciA8bj4gb2JqZWN0cyIpLAorCQlPUFRfQ0FMTEJBQ0soMCwgInNpZ25lZC10YWdzIiwgJnNpZ25lZF90YWdfbW9kZSwgIm1vZGUiLAorCQkJICAgICAic2VsZWN0IGhhbmRsaW5nIG9mIHNpZ25lZCB0YWdzIiwKKwkJCSAgICAgcGFyc2Vfb3B0X3NpZ25lZF90YWdfbW9kZSksCisJCU9QVF9FTkQoKQorCX07CisKKwkvKiB3ZSBoYW5kbGUgZW5jb2RpbmdzICovCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJaW5pdF9yZXZpc2lvbnMoJnJldnMsIHByZWZpeCk7CisJYXJnYyA9IHNldHVwX3JldmlzaW9ucyhhcmdjLCBhcmd2LCAmcmV2cywgTlVMTCk7CisJYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgb3B0aW9ucywgZmFzdF9leHBvcnRfdXNhZ2UsIDApOworCWlmIChhcmdjID4gMSkKKwkJdXNhZ2Vfd2l0aF9vcHRpb25zIChmYXN0X2V4cG9ydF91c2FnZSwgb3B0aW9ucyk7CisKKwlnZXRfdGFnc19hbmRfZHVwbGljYXRlcygmcmV2cy5wZW5kaW5nLCAmZXh0cmFfcmVmcyk7CisKKwlpZiAocHJlcGFyZV9yZXZpc2lvbl93YWxrKCZyZXZzKSkKKwkJZGllKCJyZXZpc2lvbiB3YWxrIHNldHVwIGZhaWxlZCIpOworCXJldnMuZGlmZm9wdC5mb3JtYXRfY2FsbGJhY2sgPSBzaG93X2ZpbGVtb2RpZnk7CisJRElGRl9PUFRfU0VUKCZyZXZzLmRpZmZvcHQsIFJFQ1VSU0lWRSk7CisJd2hpbGUgKChjb21taXQgPSBnZXRfcmV2aXNpb24oJnJldnMpKSkgeworCQlpZiAoaGFzX3Vuc2hvd25fcGFyZW50KGNvbW1pdCkpIHsKKwkJCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50ID0gY29tbWl0LT5wYXJlbnRzOworCQkJYWRkX29iamVjdF9hcnJheSgmY29tbWl0LT5vYmplY3QsIE5VTEwsICZjb21taXRzKTsKKwkJCWZvciAoOyBwYXJlbnQ7IHBhcmVudCA9IHBhcmVudC0+bmV4dCkKKwkJCQlpZiAoIXBhcmVudC0+aXRlbS0+dXRpbCkKKwkJCQkJcGFyZW50LT5pdGVtLT51dGlsID0gY29tbWl0LT51dGlsOworCQl9CisJCWVsc2UgeworCQkJaGFuZGxlX2NvbW1pdChjb21taXQsICZyZXZzKTsKKwkJCWhhbmRsZV90YWlsKCZjb21taXRzLCAmcmV2cyk7CisJCX0KKwl9CisKKwloYW5kbGVfdGFnc19hbmRfZHVwbGljYXRlcygmZXh0cmFfcmVmcyk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tZmV0Y2gtLXRvb2wuYyBiL2J1aWx0aW4tZmV0Y2gtLXRvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDYwYWI3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1mZXRjaC0tdG9vbC5jCkBAIC0wLDAgKzEsNTc0IEBACisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorCitzdGF0aWMgY2hhciAqZ2V0X3N0ZGluKHZvaWQpCit7CisJc3RydWN0IHN0cmJ1ZiBidWY7CisJc3RyYnVmX2luaXQoJmJ1ZiwgMCk7CisJaWYgKHN0cmJ1Zl9yZWFkKCZidWYsIDAsIDEwMjQpIDwgMCkgeworCQlkaWUoImVycm9yIHJlYWRpbmcgc3RhbmRhcmQgaW5wdXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisJcmV0dXJuIHN0cmJ1Zl9kZXRhY2goJmJ1ZiwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfbmV3KGVudW0gb2JqZWN0X3R5cGUgdHlwZSwgdW5zaWduZWQgY2hhciAqc2hhMV9uZXcpCit7CisJZnByaW50ZihzdGRlcnIsICIgICVzOiAlc1xuIiwgdHlwZW5hbWUodHlwZSksCisJCWZpbmRfdW5pcXVlX2FiYnJldihzaGExX25ldywgREVGQVVMVF9BQkJSRVYpKTsKK30KKworc3RhdGljIGludCB1cGRhdGVfcmVmX2Vudihjb25zdCBjaGFyICphY3Rpb24sCisJCSAgICAgIGNvbnN0IGNoYXIgKnJlZm5hbWUsCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgKm9sZHZhbCkKK3sKKwljaGFyIG1zZ1sxMDI0XTsKKwljb25zdCBjaGFyICpybGEgPSBnZXRlbnYoIkdJVF9SRUZMT0dfQUNUSU9OIik7CisKKwlpZiAoIXJsYSkKKwkJcmxhID0gIihyZWZsb2cgdXBkYXRlKSI7CisJaWYgKHNucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksICIlczogJXMiLCBybGEsIGFjdGlvbikgPj0gc2l6ZW9mKG1zZykpCisJCXdhcm5pbmcoInJlZmxvZyBtZXNzYWdlIHRvbyBsb25nOiAlLipzLi4uIiwgNTAsIG1zZyk7CisJcmV0dXJuIHVwZGF0ZV9yZWYobXNnLCByZWZuYW1lLCBzaGExLCBvbGR2YWwsIDAsIFFVSUVUX09OX0VSUik7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX2xvY2FsX3JlZihjb25zdCBjaGFyICpuYW1lLAorCQkJICAgIGNvbnN0IGNoYXIgKm5ld19oZWFkLAorCQkJICAgIGNvbnN0IGNoYXIgKm5vdGUsCisJCQkgICAgaW50IHZlcmJvc2UsIGludCBmb3JjZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFfb2xkWzIwXSwgc2hhMV9uZXdbMjBdOworCWNoYXIgb2xkaFs0MV0sIG5ld2hbNDFdOworCXN0cnVjdCBjb21taXQgKmN1cnJlbnQsICp1cGRhdGVkOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKworCWlmIChnZXRfc2hhMV9oZXgobmV3X2hlYWQsIHNoYTFfbmV3KSkKKwkJZGllKCJtYWxmb3JtZWQgb2JqZWN0IG5hbWUgJXMiLCBuZXdfaGVhZCk7CisKKwl0eXBlID0gc2hhMV9vYmplY3RfaW5mbyhzaGExX25ldywgTlVMTCk7CisJaWYgKHR5cGUgPCAwKQorCQlkaWUoIm9iamVjdCAlcyBub3QgZm91bmQiLCBuZXdfaGVhZCk7CisKKwlpZiAoISpuYW1lKSB7CisJCS8qIE5vdCBzdG9yaW5nICovCisJCWlmICh2ZXJib3NlKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiogZmV0Y2hlZCAlc1xuIiwgbm90ZSk7CisJCQlzaG93X25ldyh0eXBlLCBzaGExX25ldyk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGdldF9zaGExKG5hbWUsIHNoYTFfb2xkKSkgeworCQljb25zdCBjaGFyICptc2c7CisJanVzdF9zdG9yZToKKwkJLyogbmV3IHJlZiAqLworCQlpZiAoIXN0cm5jbXAobmFtZSwgInJlZnMvdGFncy8iLCAxMCkpCisJCQltc2cgPSAic3RvcmluZyB0YWciOworCQllbHNlCisJCQltc2cgPSAic3RvcmluZyBoZWFkIjsKKwkJZnByaW50ZihzdGRlcnIsICIqICVzOiBzdG9yaW5nICVzXG4iLAorCQkJbmFtZSwgbm90ZSk7CisJCXNob3dfbmV3KHR5cGUsIHNoYTFfbmV3KTsKKwkJcmV0dXJuIHVwZGF0ZV9yZWZfZW52KG1zZywgbmFtZSwgc2hhMV9uZXcsIE5VTEwpOworCX0KKworCWlmICghaGFzaGNtcChzaGExX29sZCwgc2hhMV9uZXcpKSB7CisJCWlmICh2ZXJib3NlKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiogJXM6IHNhbWUgYXMgJXNcbiIsIG5hbWUsIG5vdGUpOworCQkJc2hvd19uZXcodHlwZSwgc2hhMV9uZXcpOworCQl9CisJCXJldHVybiAwOworCX0KKworCWlmICghc3RybmNtcChuYW1lLCAicmVmcy90YWdzLyIsIDEwKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiogJXM6IHVwZGF0aW5nIHdpdGggJXNcbiIsIG5hbWUsIG5vdGUpOworCQlzaG93X25ldyh0eXBlLCBzaGExX25ldyk7CisJCXJldHVybiB1cGRhdGVfcmVmX2VudigidXBkYXRpbmcgdGFnIiwgbmFtZSwgc2hhMV9uZXcsIE5VTEwpOworCX0KKworCWN1cnJlbnQgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShzaGExX29sZCk7CisJdXBkYXRlZCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKHNoYTFfbmV3KTsKKwlpZiAoIWN1cnJlbnQgfHwgIXVwZGF0ZWQpCisJCWdvdG8ganVzdF9zdG9yZTsKKworCXN0cmNweShvbGRoLCBmaW5kX3VuaXF1ZV9hYmJyZXYoY3VycmVudC0+b2JqZWN0LnNoYTEsIERFRkFVTFRfQUJCUkVWKSk7CisJc3RyY3B5KG5ld2gsIGZpbmRfdW5pcXVlX2FiYnJldihzaGExX25ldywgREVGQVVMVF9BQkJSRVYpKTsKKworCWlmIChpbl9tZXJnZV9iYXNlcyhjdXJyZW50LCAmdXBkYXRlZCwgMSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICIqICVzOiBmYXN0IGZvcndhcmQgdG8gJXNcbiIsCisJCQluYW1lLCBub3RlKTsKKwkJZnByaW50ZihzdGRlcnIsICIgIG9sZC4ubmV3OiAlcy4uJXNcbiIsIG9sZGgsIG5ld2gpOworCQlyZXR1cm4gdXBkYXRlX3JlZl9lbnYoImZhc3QgZm9yd2FyZCIsIG5hbWUsIHNoYTFfbmV3LCBzaGExX29sZCk7CisJfQorCWlmICghZm9yY2UpIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiKiAlczogbm90IHVwZGF0aW5nIHRvIG5vbi1mYXN0IGZvcndhcmQgJXNcbiIsCisJCQluYW1lLCBub3RlKTsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiICBvbGQuLi5uZXc6ICVzLi4uJXNcbiIsIG9sZGgsIG5ld2gpOworCQlyZXR1cm4gMTsKKwl9CisJZnByaW50ZihzdGRlcnIsCisJCSIqICVzOiBmb3JjaW5nIHVwZGF0ZSB0byBub24tZmFzdCBmb3J3YXJkICVzXG4iLAorCQluYW1lLCBub3RlKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgb2xkLi4ubmV3OiAlcy4uLiVzXG4iLCBvbGRoLCBuZXdoKTsKKwlyZXR1cm4gdXBkYXRlX3JlZl9lbnYoImZvcmNlZC11cGRhdGUiLCBuYW1lLCBzaGExX25ldywgc2hhMV9vbGQpOworfQorCitzdGF0aWMgaW50IGFwcGVuZF9mZXRjaF9oZWFkKEZJTEUgKmZwLAorCQkJICAgICBjb25zdCBjaGFyICpoZWFkLCBjb25zdCBjaGFyICpyZW1vdGUsCisJCQkgICAgIGNvbnN0IGNoYXIgKnJlbW90ZV9uYW1lLCBjb25zdCBjaGFyICpyZW1vdGVfbmljaywKKwkJCSAgICAgY29uc3QgY2hhciAqbG9jYWxfbmFtZSwgaW50IG5vdF9mb3JfbWVyZ2UsCisJCQkgICAgIGludCB2ZXJib3NlLCBpbnQgZm9yY2UpCit7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCWludCByZW1vdGVfbGVuLCBpLCBub3RlX2xlbjsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWNoYXIgbm90ZVsxMDI0XTsKKwljb25zdCBjaGFyICp3aGF0LCAqa2luZDsKKworCWlmIChnZXRfc2hhMShoZWFkLCBzaGExKSkKKwkJcmV0dXJuIGVycm9yKCJOb3QgYSB2YWxpZCBvYmplY3QgbmFtZTogJXMiLCBoZWFkKTsKKwljb21taXQgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZV9nZW50bHkoc2hhMSwgMSk7CisJaWYgKCFjb21taXQpCisJCW5vdF9mb3JfbWVyZ2UgPSAxOworCisJaWYgKCFzdHJjbXAocmVtb3RlX25hbWUsICJIRUFEIikpIHsKKwkJa2luZCA9ICIiOworCQl3aGF0ID0gIiI7CisJfQorCWVsc2UgaWYgKCFzdHJuY21wKHJlbW90ZV9uYW1lLCAicmVmcy9oZWFkcy8iLCAxMSkpIHsKKwkJa2luZCA9ICJicmFuY2giOworCQl3aGF0ID0gcmVtb3RlX25hbWUgKyAxMTsKKwl9CisJZWxzZSBpZiAoIXN0cm5jbXAocmVtb3RlX25hbWUsICJyZWZzL3RhZ3MvIiwgMTApKSB7CisJCWtpbmQgPSAidGFnIjsKKwkJd2hhdCA9IHJlbW90ZV9uYW1lICsgMTA7CisJfQorCWVsc2UgaWYgKCFzdHJuY21wKHJlbW90ZV9uYW1lLCAicmVmcy9yZW1vdGVzLyIsIDEzKSkgeworCQlraW5kID0gInJlbW90ZSBicmFuY2giOworCQl3aGF0ID0gcmVtb3RlX25hbWUgKyAxMzsKKwl9CisJZWxzZSB7CisJCWtpbmQgPSAiIjsKKwkJd2hhdCA9IHJlbW90ZV9uYW1lOworCX0KKworCXJlbW90ZV9sZW4gPSBzdHJsZW4ocmVtb3RlKTsKKwlmb3IgKGkgPSByZW1vdGVfbGVuIC0gMTsgcmVtb3RlW2ldID09ICcvJyAmJiAwIDw9IGk7IGktLSkKKwkJOworCXJlbW90ZV9sZW4gPSBpICsgMTsKKwlpZiAoNCA8IGkgJiYgIXN0cm5jbXAoIi5naXQiLCByZW1vdGUgKyBpIC0gMywgNCkpCisJCXJlbW90ZV9sZW4gPSBpIC0gMzsKKworCW5vdGVfbGVuID0gMDsKKwlpZiAoKndoYXQpIHsKKwkJaWYgKCpraW5kKQorCQkJbm90ZV9sZW4gKz0gc3ByaW50Zihub3RlICsgbm90ZV9sZW4sICIlcyAiLCBraW5kKTsKKwkJbm90ZV9sZW4gKz0gc3ByaW50Zihub3RlICsgbm90ZV9sZW4sICInJXMnIG9mICIsIHdoYXQpOworCX0KKwlub3RlX2xlbiArPSBzcHJpbnRmKG5vdGUgKyBub3RlX2xlbiwgIiUuKnMiLCByZW1vdGVfbGVuLCByZW1vdGUpOworCWZwcmludGYoZnAsICIlc1x0JXNcdCVzXG4iLAorCQlzaGExX3RvX2hleChjb21taXQgPyBjb21taXQtPm9iamVjdC5zaGExIDogc2hhMSksCisJCW5vdF9mb3JfbWVyZ2UgPyAibm90LWZvci1tZXJnZSIgOiAiIiwKKwkJbm90ZSk7CisJcmV0dXJuIHVwZGF0ZV9sb2NhbF9yZWYobG9jYWxfbmFtZSwgaGVhZCwgbm90ZSwgdmVyYm9zZSwgZm9yY2UpOworfQorCitzdGF0aWMgY2hhciAqa2VlcDsKK3N0YXRpYyB2b2lkIHJlbW92ZV9rZWVwKHZvaWQpCit7CisJaWYgKGtlZXAgJiYgKmtlZXApCisJCXVubGluayhrZWVwKTsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2tlZXBfb25fc2lnbmFsKGludCBzaWdubykKK3sKKwlyZW1vdmVfa2VlcCgpOworCXNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworCXJhaXNlKHNpZ25vKTsKK30KKworc3RhdGljIGNoYXIgKmZpbmRfbG9jYWxfbmFtZShjb25zdCBjaGFyICpyZW1vdGVfbmFtZSwgY29uc3QgY2hhciAqcmVmcywKKwkJCSAgICAgaW50ICpmb3JjZV9wLCBpbnQgKm5vdF9mb3JfbWVyZ2VfcCkKK3sKKwljb25zdCBjaGFyICpyZWYgPSByZWZzOworCWludCBsZW4gPSBzdHJsZW4ocmVtb3RlX25hbWUpOworCisJd2hpbGUgKHJlZikgeworCQljb25zdCBjaGFyICpuZXh0OworCQlpbnQgc2luZ2xlX2ZvcmNlLCBub3RfZm9yX21lcmdlOworCisJCXdoaWxlICgqcmVmID09ICdcbicpCisJCQlyZWYrKzsKKwkJaWYgKCEqcmVmKQorCQkJYnJlYWs7CisJCW5leHQgPSBzdHJjaHIocmVmLCAnXG4nKTsKKworCQlzaW5nbGVfZm9yY2UgPSBub3RfZm9yX21lcmdlID0gMDsKKwkJaWYgKCpyZWYgPT0gJysnKSB7CisJCQlzaW5nbGVfZm9yY2UgPSAxOworCQkJcmVmKys7CisJCX0KKwkJaWYgKCpyZWYgPT0gJy4nKSB7CisJCQlub3RfZm9yX21lcmdlID0gMTsKKwkJCXJlZisrOworCQkJaWYgKCpyZWYgPT0gJysnKSB7CisJCQkJc2luZ2xlX2ZvcmNlID0gMTsKKwkJCQlyZWYrKzsKKwkJCX0KKwkJfQorCQlpZiAoIXN0cm5jbXAocmVtb3RlX25hbWUsIHJlZiwgbGVuKSAmJiByZWZbbGVuXSA9PSAnOicpIHsKKwkJCWNvbnN0IGNoYXIgKmxvY2FsX3BhcnQgPSByZWYgKyBsZW4gKyAxOworCQkJaW50IHJldGxlbjsKKworCQkJaWYgKCFuZXh0KQorCQkJCXJldGxlbiA9IHN0cmxlbihsb2NhbF9wYXJ0KTsKKwkJCWVsc2UKKwkJCQlyZXRsZW4gPSBuZXh0IC0gbG9jYWxfcGFydDsKKwkJCSpmb3JjZV9wID0gc2luZ2xlX2ZvcmNlOworCQkJKm5vdF9mb3JfbWVyZ2VfcCA9IG5vdF9mb3JfbWVyZ2U7CisJCQlyZXR1cm4geG1lbWR1cHoobG9jYWxfcGFydCwgcmV0bGVuKTsKKwkJfQorCQlyZWYgPSBuZXh0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBmZXRjaF9uYXRpdmVfc3RvcmUoRklMRSAqZnAsCisJCQkgICAgICBjb25zdCBjaGFyICpyZW1vdGUsCisJCQkgICAgICBjb25zdCBjaGFyICpyZW1vdGVfbmljaywKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnJlZnMsCisJCQkgICAgICBpbnQgdmVyYm9zZSwgaW50IGZvcmNlKQoreworCWNoYXIgYnVmZmVyWzEwMjRdOworCWludCBlcnIgPSAwOworCisJc2lnbmFsKFNJR0lOVCwgcmVtb3ZlX2tlZXBfb25fc2lnbmFsKTsKKwlhdGV4aXQocmVtb3ZlX2tlZXApOworCisJd2hpbGUgKGZnZXRzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIHN0ZGluKSkgeworCQlpbnQgbGVuOworCQljaGFyICpjcDsKKwkJY2hhciAqbG9jYWxfbmFtZTsKKwkJaW50IHNpbmdsZV9mb3JjZSwgbm90X2Zvcl9tZXJnZTsKKworCQlmb3IgKGNwID0gYnVmZmVyOyAqY3AgJiYgIWlzc3BhY2UoKmNwKTsgY3ArKykKKwkJCTsKKwkJaWYgKCpjcCkKKwkJCSpjcCsrID0gMDsKKwkJbGVuID0gc3RybGVuKGNwKTsKKwkJaWYgKGxlbiAmJiBjcFtsZW4tMV0gPT0gJ1xuJykKKwkJCWNwWy0tbGVuXSA9IDA7CisJCWlmICghc3RyY21wKGJ1ZmZlciwgImZhaWxlZCIpKQorCQkJZGllKCJGZXRjaCBmYWlsdXJlOiAlcyIsIHJlbW90ZSk7CisJCWlmICghc3RyY21wKGJ1ZmZlciwgInBhY2siKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXN0cmNtcChidWZmZXIsICJrZWVwIikpIHsKKwkJCWNoYXIgKm9kID0gZ2V0X29iamVjdF9kaXJlY3RvcnkoKTsKKwkJCWludCBsZW4gPSBzdHJsZW4ob2QpICsgc3RybGVuKGNwKSArIDUwOworCQkJa2VlcCA9IHhtYWxsb2MobGVuKTsKKwkJCXNwcmludGYoa2VlcCwgIiVzL3BhY2svcGFjay0lcy5rZWVwIiwgb2QsIGNwKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbG9jYWxfbmFtZSA9IGZpbmRfbG9jYWxfbmFtZShjcCwgcmVmcywKKwkJCQkJICAgICAmc2luZ2xlX2ZvcmNlLCAmbm90X2Zvcl9tZXJnZSk7CisJCWlmICghbG9jYWxfbmFtZSkKKwkJCWNvbnRpbnVlOworCQllcnIgfD0gYXBwZW5kX2ZldGNoX2hlYWQoZnAsCisJCQkJCSBidWZmZXIsIHJlbW90ZSwgY3AsIHJlbW90ZV9uaWNrLAorCQkJCQkgbG9jYWxfbmFtZSwgbm90X2Zvcl9tZXJnZSwKKwkJCQkJIHZlcmJvc2UsIGZvcmNlIHx8IHNpbmdsZV9mb3JjZSk7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfcmVmbGlzdChjb25zdCBjaGFyICpyZWZsaXN0KQoreworCWNvbnN0IGNoYXIgKnJlZjsKKworCXByaW50ZigicmVmcz0nIik7CisJZm9yIChyZWYgPSByZWZsaXN0OyByZWY7ICkgeworCQljb25zdCBjaGFyICpuZXh0OworCQl3aGlsZSAoKnJlZiAmJiBpc3NwYWNlKCpyZWYpKQorCQkJcmVmKys7CisJCWlmICghKnJlZikKKwkJCWJyZWFrOworCQlmb3IgKG5leHQgPSByZWY7ICpuZXh0ICYmICFpc3NwYWNlKCpuZXh0KTsgbmV4dCsrKQorCQkJOworCQlwcmludGYoIlxuJS4qcyIsIChpbnQpKG5leHQgLSByZWYpLCByZWYpOworCQlyZWYgPSBuZXh0OworCX0KKwlwcmludGYoIidcbiIpOworCisJcHJpbnRmKCJycmVmPSciKTsKKwlmb3IgKHJlZiA9IHJlZmxpc3Q7IHJlZjsgKSB7CisJCWNvbnN0IGNoYXIgKm5leHQsICpjb2xvbjsKKwkJd2hpbGUgKCpyZWYgJiYgaXNzcGFjZSgqcmVmKSkKKwkJCXJlZisrOworCQlpZiAoISpyZWYpCisJCQlicmVhazsKKwkJZm9yIChuZXh0ID0gcmVmOyAqbmV4dCAmJiAhaXNzcGFjZSgqbmV4dCk7IG5leHQrKykKKwkJCTsKKwkJaWYgKCpyZWYgPT0gJy4nKQorCQkJcmVmKys7CisJCWlmICgqcmVmID09ICcrJykKKwkJCXJlZisrOworCQljb2xvbiA9IHN0cmNocihyZWYsICc6Jyk7CisJCXB1dGNoYXIoJ1xuJyk7CisJCXByaW50ZigiJS4qcyIsIChpbnQpKChjb2xvbiA/IGNvbG9uIDogbmV4dCkgLSByZWYpLCByZWYpOworCQlyZWYgPSBuZXh0OworCX0KKwlwcmludGYoIidcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4cGFuZF9yZWZzX3dpbGRjYXJkKGNvbnN0IGNoYXIgKmxzX3JlbW90ZV9yZXN1bHQsIGludCBudW1yZWZzLAorCQkJCWNvbnN0IGNoYXIgKipyZWZzKQoreworCWludCBpLCBtYXRjaGxlbiwgcmVwbGFjZWxlbjsKKwlpbnQgZm91bmRfb25lID0gMDsKKwljb25zdCBjaGFyICpyZW1vdGUgPSAqcmVmcysrOworCW51bXJlZnMtLTsKKworCWlmIChudW1yZWZzID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJOb3RoaW5nIHNwZWNpZmllZCBmb3IgZmV0Y2hpbmcgd2l0aCByZW1vdGUuJXMuZmV0Y2hcbiIsCisJCQlyZW1vdGUpOworCQlwcmludGYoImVtcHR5XG4iKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtcmVmczsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKnJlZiA9IHJlZnNbaV07CisJCWNvbnN0IGNoYXIgKmxyZWYgPSByZWY7CisJCWNvbnN0IGNoYXIgKmNvbG9uOworCQljb25zdCBjaGFyICp0YWlsOworCQljb25zdCBjaGFyICpsczsKKwkJY29uc3QgY2hhciAqbmV4dDsKKworCQlpZiAoKmxyZWYgPT0gJysnKQorCQkJbHJlZisrOworCQljb2xvbiA9IHN0cmNocihscmVmLCAnOicpOworCQl0YWlsID0gbHJlZiArIHN0cmxlbihscmVmKTsKKwkJaWYgKCEoY29sb24gJiYKKwkJICAgICAgMiA8IGNvbG9uIC0gbHJlZiAmJgorCQkgICAgICBjb2xvblstMV0gPT0gJyonICYmCisJCSAgICAgIGNvbG9uWy0yXSA9PSAnLycgJiYKKwkJICAgICAgMiA8IHRhaWwgLSAoY29sb24gKyAxKSAmJgorCQkgICAgICB0YWlsWy0xXSA9PSAnKicgJiYKKwkJICAgICAgdGFpbFstMl0gPT0gJy8nKSkgeworCQkJLyogbm90IGEgZ2xvYiAqLworCQkJaWYgKCFmb3VuZF9vbmUrKykKKwkJCQlwcmludGYoImV4cGxpY2l0XG4iKTsKKwkJCXByaW50ZigiJXNcbiIsIHJlZik7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIGdsb2IgKi8KKwkJaWYgKCFmb3VuZF9vbmUrKykKKwkJCXByaW50ZigiZ2xvYlxuIik7CisKKwkJLyogbHJlZiB0byBjb2xvbi0yIGlzIHJlbW90ZSBoaWVyYXJjaHkgbmFtZTsKKwkJICogY29sb24rMSB0byB0YWlsLTIgaXMgbG9jYWwuCisJCSAqLworCQltYXRjaGxlbiA9IChjb2xvbi0xKSAtIGxyZWY7CisJCXJlcGxhY2VsZW4gPSAodGFpbC0xKSAtIChjb2xvbisxKTsKKwkJZm9yIChscyA9IGxzX3JlbW90ZV9yZXN1bHQ7IGxzOyBscyA9IG5leHQpIHsKKwkJCWNvbnN0IGNoYXIgKmVvbDsKKwkJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCQlpbnQgbmFtZWxlbjsKKworCQkJd2hpbGUgKCpscyAmJiBpc3NwYWNlKCpscykpCisJCQkJbHMrKzsKKwkJCW5leHQgPSBzdHJjaHIobHMsICdcbicpOworCQkJZW9sID0gIW5leHQgPyAobHMgKyBzdHJsZW4obHMpKSA6IG5leHQ7CisJCQlpZiAoIW1lbWNtcCgiXnt9IiwgZW9sLTMsIDMpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGVvbCAtIGxzIDwgNDApCisJCQkJY29udGludWU7CisJCQlpZiAoZ2V0X3NoYTFfaGV4KGxzLCBzaGExKSkKKwkJCQljb250aW51ZTsKKwkJCWxzICs9IDQwOworCQkJd2hpbGUgKGxzIDwgZW9sICYmIGlzc3BhY2UoKmxzKSkKKwkJCQlscysrOworCQkJLyogbHMgdG8gbmV4dCAob3IgZW9sKSBpcyB0aGUgbmFtZS4KKwkJCSAqIGlzIGl0IGlkZW50aWNhbCB0byBscmVmIHRvIGNvbG9uLTI/CisJCQkgKi8KKwkJCWlmICgoZW9sIC0gbHMpIDw9IG1hdGNobGVuIHx8CisJCQkgICAgc3RybmNtcChscywgbHJlZiwgbWF0Y2hsZW4pKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBZZXMsIGl0IGlzIGEgbWF0Y2ggKi8KKwkJCW5hbWVsZW4gPSBlb2wgLSBsczsKKwkJCWlmIChscmVmICE9IHJlZikKKwkJCQlwdXRjaGFyKCcrJyk7CisJCQlwcmludGYoIiUuKnM6JS4qcyUuKnNcbiIsCisJCQkgICAgICAgbmFtZWxlbiwgbHMsCisJCQkgICAgICAgcmVwbGFjZWxlbiwgY29sb24gKyAxLAorCQkJICAgICAgIG5hbWVsZW4gLSBtYXRjaGxlbiwgbHMgKyBtYXRjaGxlbik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGlja19ycmVmKGludCBzaGExX29ubHksIGNvbnN0IGNoYXIgKnJyZWYsIGNvbnN0IGNoYXIgKmxzX3JlbW90ZV9yZXN1bHQpCit7CisJaW50IGVyciA9IDA7CisJaW50IGxycl9jb3VudCA9IGxycl9jb3VudCwgaSwgcGFzczsKKwljb25zdCBjaGFyICpjcDsKKwlzdHJ1Y3QgbHJyIHsKKwkJY29uc3QgY2hhciAqbGluZTsKKwkJY29uc3QgY2hhciAqbmFtZTsKKwkJaW50IG5hbWVsZW47CisJCWludCBzaG93bjsKKwl9ICpscnJfbGlzdCA9IGxycl9saXN0OworCisJZm9yIChwYXNzID0gMDsgcGFzcyA8IDI7IHBhc3MrKykgeworCQkvKiBwYXNzIDAgY291bnRzIGFuZCBhbGxvY2F0ZXMsIHBhc3MgMSBmaWxscy4uLiAqLworCQljcCA9IGxzX3JlbW90ZV9yZXN1bHQ7CisJCWkgPSAwOworCQl3aGlsZSAoMSkgeworCQkJY29uc3QgY2hhciAqbnA7CisJCQl3aGlsZSAoKmNwICYmIGlzc3BhY2UoKmNwKSkKKwkJCQljcCsrOworCQkJaWYgKCEqY3ApCisJCQkJYnJlYWs7CisJCQlucCA9IHN0cmNocm51bChjcCwgJ1xuJyk7CisJCQlpZiAocGFzcykgeworCQkJCWxycl9saXN0W2ldLmxpbmUgPSBjcDsKKwkJCQlscnJfbGlzdFtpXS5uYW1lID0gY3AgKyA0MTsKKwkJCQlscnJfbGlzdFtpXS5uYW1lbGVuID0gbnAgLSAoY3AgKyA0MSk7CisJCQl9CisJCQlpKys7CisJCQljcCA9IG5wOworCQl9CisJCWlmICghcGFzcykgeworCQkJbHJyX2NvdW50ID0gaTsKKwkJCWxycl9saXN0ID0geGNhbGxvYyhscnJfY291bnQsIHNpemVvZigqbHJyX2xpc3QpKTsKKwkJfQorCX0KKworCXdoaWxlICgxKSB7CisJCWNvbnN0IGNoYXIgKm5leHQ7CisJCWludCBycmVmbGVuOworCQlpbnQgaTsKKworCQl3aGlsZSAoKnJyZWYgJiYgaXNzcGFjZSgqcnJlZikpCisJCQlycmVmKys7CisJCWlmICghKnJyZWYpCisJCQlicmVhazsKKwkJbmV4dCA9IHN0cmNocm51bChycmVmLCAnXG4nKTsKKwkJcnJlZmxlbiA9IG5leHQgLSBycmVmOworCisJCWZvciAoaSA9IDA7IGkgPCBscnJfY291bnQ7IGkrKykgeworCQkJc3RydWN0IGxyciAqbHJyID0gJihscnJfbGlzdFtpXSk7CisKKwkJCWlmIChycmVmbGVuID09IGxyci0+bmFtZWxlbiAmJgorCQkJICAgICFtZW1jbXAobHJyLT5uYW1lLCBycmVmLCBycmVmbGVuKSkgeworCQkJCWlmICghbHJyLT5zaG93bikKKwkJCQkJcHJpbnRmKCIlLipzXG4iLAorCQkJCQkgICAgICAgc2hhMV9vbmx5ID8gNDAgOiBscnItPm5hbWVsZW4gKyA0MSwKKwkJCQkJICAgICAgIGxyci0+bGluZSk7CisJCQkJbHJyLT5zaG93biA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGxycl9jb3VudCA8PSBpKSB7CisJCQllcnJvcigicGljay1ycmVmOiAlLipzIG5vdCBmb3VuZCIsIHJyZWZsZW4sIHJyZWYpOworCQkJZXJyID0gMTsKKwkJfQorCQlycmVmID0gbmV4dDsKKwl9CisJZnJlZShscnJfbGlzdCk7CisJcmV0dXJuIGVycjsKK30KKworaW50IGNtZF9mZXRjaF9fdG9vbChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgdmVyYm9zZSA9IDA7CisJaW50IGZvcmNlID0gMDsKKwlpbnQgc29wdCA9IDA7CisKKwl3aGlsZSAoMSA8IGFyZ2MpIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndlsxXTsKKwkJaWYgKCFzdHJjbXAoIi12IiwgYXJnKSkKKwkJCXZlcmJvc2UgPSAxOworCQllbHNlIGlmICghc3RyY21wKCItZiIsIGFyZykpCisJCQlmb3JjZSA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoIi1zIiwgYXJnKSkKKwkJCXNvcHQgPSAxOworCQllbHNlCisJCQlicmVhazsKKwkJYXJnYy0tOworCQlhcmd2Kys7CisJfQorCisJaWYgKGFyZ2MgPD0gMSkKKwkJcmV0dXJuIGVycm9yKCJNaXNzaW5nIHN1YmNvbW1hbmQiKTsKKworCWlmICghc3RyY21wKCJhcHBlbmQtZmV0Y2gtaGVhZCIsIGFyZ3ZbMV0pKSB7CisJCWludCByZXN1bHQ7CisJCUZJTEUgKmZwOworCQljaGFyICpmaWxlbmFtZTsKKworCQlpZiAoYXJnYyAhPSA4KQorCQkJcmV0dXJuIGVycm9yKCJhcHBlbmQtZmV0Y2gtaGVhZCB0YWtlcyA2IGFyZ3MiKTsKKwkJZmlsZW5hbWUgPSBnaXRfcGF0aCgiRkVUQ0hfSEVBRCIpOworCQlmcCA9IGZvcGVuKGZpbGVuYW1lLCAiYSIpOworCQlpZiAoIWZwKQorCQkJcmV0dXJuIGVycm9yKCJjYW5ub3Qgb3BlbiAlczogJXNcbiIsIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlyZXN1bHQgPSBhcHBlbmRfZmV0Y2hfaGVhZChmcCwgYXJndlsyXSwgYXJndlszXSwKKwkJCQkJICAgYXJndls0XSwgYXJndls1XSwKKwkJCQkJICAgYXJndls2XSwgISFhcmd2WzddWzBdLAorCQkJCQkgICB2ZXJib3NlLCBmb3JjZSk7CisJCWZjbG9zZShmcCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCWlmICghc3RyY21wKCJuYXRpdmUtc3RvcmUiLCBhcmd2WzFdKSkgeworCQlpbnQgcmVzdWx0OworCQlGSUxFICpmcDsKKwkJY2hhciAqZmlsZW5hbWU7CisKKwkJaWYgKGFyZ2MgIT0gNSkKKwkJCXJldHVybiBlcnJvcigiZmV0Y2gtbmF0aXZlLXN0b3JlIHRha2VzIDMgYXJncyIpOworCQlmaWxlbmFtZSA9IGdpdF9wYXRoKCJGRVRDSF9IRUFEIik7CisJCWZwID0gZm9wZW4oZmlsZW5hbWUsICJhIik7CisJCWlmICghZnApCisJCQlyZXR1cm4gZXJyb3IoImNhbm5vdCBvcGVuICVzOiAlc1xuIiwgZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJlc3VsdCA9IGZldGNoX25hdGl2ZV9zdG9yZShmcCwgYXJndlsyXSwgYXJndlszXSwgYXJndls0XSwKKwkJCQkJICAgIHZlcmJvc2UsIGZvcmNlKTsKKwkJZmNsb3NlKGZwKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJaWYgKCFzdHJjbXAoInBhcnNlLXJlZmxpc3QiLCBhcmd2WzFdKSkgeworCQljb25zdCBjaGFyICpyZWZsaXN0OworCQlpZiAoYXJnYyAhPSAzKQorCQkJcmV0dXJuIGVycm9yKCJwYXJzZS1yZWZsaXN0IHRha2VzIDEgYXJnIik7CisJCXJlZmxpc3QgPSBhcmd2WzJdOworCQlpZiAoIXN0cmNtcChyZWZsaXN0LCAiLSIpKQorCQkJcmVmbGlzdCA9IGdldF9zdGRpbigpOworCQlyZXR1cm4gcGFyc2VfcmVmbGlzdChyZWZsaXN0KTsKKwl9CisJaWYgKCFzdHJjbXAoInBpY2stcnJlZiIsIGFyZ3ZbMV0pKSB7CisJCWNvbnN0IGNoYXIgKmxzX3JlbW90ZV9yZXN1bHQ7CisJCWlmIChhcmdjICE9IDQpCisJCQlyZXR1cm4gZXJyb3IoInBpY2stcnJlZiB0YWtlcyAyIGFyZ3MiKTsKKwkJbHNfcmVtb3RlX3Jlc3VsdCA9IGFyZ3ZbM107CisJCWlmICghc3RyY21wKGxzX3JlbW90ZV9yZXN1bHQsICItIikpCisJCQlsc19yZW1vdGVfcmVzdWx0ID0gZ2V0X3N0ZGluKCk7CisJCXJldHVybiBwaWNrX3JyZWYoc29wdCwgYXJndlsyXSwgbHNfcmVtb3RlX3Jlc3VsdCk7CisJfQorCWlmICghc3RyY21wKCJleHBhbmQtcmVmcy13aWxkY2FyZCIsIGFyZ3ZbMV0pKSB7CisJCWNvbnN0IGNoYXIgKnJlZmxpc3Q7CisJCWlmIChhcmdjIDwgNCkKKwkJCXJldHVybiBlcnJvcigiZXhwYW5kLXJlZnMtd2lsZGNhcmQgdGFrZXMgYXQgbGVhc3QgMiBhcmdzIik7CisJCXJlZmxpc3QgPSBhcmd2WzJdOworCQlpZiAoIXN0cmNtcChyZWZsaXN0LCAiLSIpKQorCQkJcmVmbGlzdCA9IGdldF9zdGRpbigpOworCQlyZXR1cm4gZXhwYW5kX3JlZnNfd2lsZGNhcmQocmVmbGlzdCwgYXJnYyAtIDMsIGFyZ3YgKyAzKTsKKwl9CisKKwlyZXR1cm4gZXJyb3IoIlVua25vd24gc3ViY29tbWFuZDogJXMiLCBhcmd2WzFdKTsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tZmV0Y2gtcGFjay5jIGIvYnVpbHRpbi1mZXRjaC1wYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUzNTBjYQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tZmV0Y2gtcGFjay5jCkBAIC0wLDAgKzEsODI0IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAicGt0LWxpbmUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJleGVjX2NtZC5oIgorI2luY2x1ZGUgInBhY2suaCIKKyNpbmNsdWRlICJzaWRlYmFuZC5oIgorI2luY2x1ZGUgImZldGNoLXBhY2suaCIKKyNpbmNsdWRlICJyZW1vdGUuaCIKKyNpbmNsdWRlICJydW4tY29tbWFuZC5oIgorCitzdGF0aWMgaW50IHRyYW5zZmVyX3VucGFja19saW1pdCA9IC0xOworc3RhdGljIGludCBmZXRjaF91bnBhY2tfbGltaXQgPSAtMTsKK3N0YXRpYyBpbnQgdW5wYWNrX2xpbWl0ID0gMTAwOworc3RhdGljIHN0cnVjdCBmZXRjaF9wYWNrX2FyZ3MgYXJncyA9IHsKKwkvKiAudXBsb2FkcGFjayA9ICovICJnaXQtdXBsb2FkLXBhY2siLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgZmV0Y2hfcGFja191c2FnZVtdID0KKyJnaXQtZmV0Y2gtcGFjayBbLS1hbGxdIFstLXF1aWV0fC1xXSBbLS1rZWVwfC1rXSBbLS10aGluXSBbLS1pbmNsdWRlLXRhZ10gWy0tdXBsb2FkLXBhY2s9PGdpdC11cGxvYWQtcGFjaz5dIFstLWRlcHRoPTxuPl0gWy0tbm8tcHJvZ3Jlc3NdIFstdl0gWzxob3N0PjpdPGRpcmVjdG9yeT4gWzxyZWZzPi4uLl0iOworCisjZGVmaW5lIENPTVBMRVRFCSgxVSA8PCAwKQorI2RlZmluZSBDT01NT04JCSgxVSA8PCAxKQorI2RlZmluZSBDT01NT05fUkVGCSgxVSA8PCAyKQorI2RlZmluZSBTRUVOCQkoMVUgPDwgMykKKyNkZWZpbmUgUE9QUEVECQkoMVUgPDwgNCkKKworc3RhdGljIGludCBtYXJrZWQ7CisKKy8qCisgKiBBZnRlciBzZW5kaW5nIHRoaXMgbWFueSAiaGF2ZSJzIGlmIHdlIGRvIG5vdCBnZXQgYW55IG5ldyBBQ0sgLCB3ZQorICogZ2l2ZSB1cCB0cmF2ZXJzaW5nIG91ciBoaXN0b3J5LgorICovCisjZGVmaW5lIE1BWF9JTl9WQUlOIDI1NgorCitzdGF0aWMgc3RydWN0IGNvbW1pdF9saXN0ICpyZXZfbGlzdDsKK3N0YXRpYyBpbnQgbm9uX2NvbW1vbl9yZXZzLCBtdWx0aV9hY2ssIHVzZV9zaWRlYmFuZDsKKworc3RhdGljIHZvaWQgcmV2X2xpc3RfcHVzaChzdHJ1Y3QgY29tbWl0ICpjb21taXQsIGludCBtYXJrKQoreworCWlmICghKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgbWFyaykpIHsKKwkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gbWFyazsKKworCQlpZiAoIShjb21taXQtPm9iamVjdC5wYXJzZWQpKQorCQkJaWYgKHBhcnNlX2NvbW1pdChjb21taXQpKQorCQkJCXJldHVybjsKKworCQlpbnNlcnRfYnlfZGF0ZShjb21taXQsICZyZXZfbGlzdCk7CisKKwkJaWYgKCEoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBDT01NT04pKQorCQkJbm9uX2NvbW1vbl9yZXZzKys7CisJfQorfQorCitzdGF0aWMgaW50IHJldl9saXN0X2luc2VydF9yZWYoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZsYWcsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IG9iamVjdCAqbyA9IGRlcmVmX3RhZyhwYXJzZV9vYmplY3Qoc2hhMSksIHBhdGgsIDApOworCisJaWYgKG8gJiYgby0+dHlwZSA9PSBPQkpfQ09NTUlUKQorCQlyZXZfbGlzdF9wdXNoKChzdHJ1Y3QgY29tbWl0ICopbywgU0VFTik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbGVhcl9tYXJrcyhjb25zdCBjaGFyICpwYXRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmxhZywgdm9pZCAqY2JfZGF0YSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvID0gZGVyZWZfdGFnKHBhcnNlX29iamVjdChzaGExKSwgcGF0aCwgMCk7CisKKwlpZiAobyAmJiBvLT50eXBlID09IE9CSl9DT01NSVQpCisJCWNsZWFyX2NvbW1pdF9tYXJrcygoc3RydWN0IGNvbW1pdCAqKW8sCisJCQkJICAgQ09NTU9OIHwgQ09NTU9OX1JFRiB8IFNFRU4gfCBQT1BQRUQpOworCXJldHVybiAwOworfQorCisvKgorICAgVGhpcyBmdW5jdGlvbiBtYXJrcyBhIHJldiBhbmQgaXRzIGFuY2VzdG9ycyBhcyBjb21tb24uCisgICBJbiBzb21lIGNhc2VzLCBpdCBpcyBkZXNpcmFibGUgdG8gbWFyayBvbmx5IHRoZSBhbmNlc3RvcnMgKGZvciBleGFtcGxlCisgICB3aGVuIG9ubHkgdGhlIHNlcnZlciBkb2VzIG5vdCB5ZXQga25vdyB0aGF0IHRoZXkgYXJlIGNvbW1vbikuCisqLworCitzdGF0aWMgdm9pZCBtYXJrX2NvbW1vbihzdHJ1Y3QgY29tbWl0ICpjb21taXQsCisJCWludCBhbmNlc3RvcnNfb25seSwgaW50IGRvbnRfcGFyc2UpCit7CisJaWYgKGNvbW1pdCAhPSBOVUxMICYmICEoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBDT01NT04pKSB7CisJCXN0cnVjdCBvYmplY3QgKm8gPSAoc3RydWN0IG9iamVjdCAqKWNvbW1pdDsKKworCQlpZiAoIWFuY2VzdG9yc19vbmx5KQorCQkJby0+ZmxhZ3MgfD0gQ09NTU9OOworCisJCWlmICghKG8tPmZsYWdzICYgU0VFTikpCisJCQlyZXZfbGlzdF9wdXNoKGNvbW1pdCwgU0VFTik7CisJCWVsc2UgeworCQkJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCisJCQlpZiAoIWFuY2VzdG9yc19vbmx5ICYmICEoby0+ZmxhZ3MgJiBQT1BQRUQpKQorCQkJCW5vbl9jb21tb25fcmV2cy0tOworCQkJaWYgKCFvLT5wYXJzZWQgJiYgIWRvbnRfcGFyc2UpCisJCQkJaWYgKHBhcnNlX2NvbW1pdChjb21taXQpKQorCQkJCQlyZXR1cm47CisKKwkJCWZvciAocGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsKKwkJCQkJcGFyZW50czsKKwkJCQkJcGFyZW50cyA9IHBhcmVudHMtPm5leHQpCisJCQkJbWFya19jb21tb24ocGFyZW50cy0+aXRlbSwgMCwgZG9udF9wYXJzZSk7CisJCX0KKwl9Cit9CisKKy8qCisgIEdldCB0aGUgbmV4dCByZXYgdG8gc2VuZCwgaWdub3JpbmcgdGhlIGNvbW1vbi4KKyovCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyKiBnZXRfcmV2KHZvaWQpCit7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gTlVMTDsKKworCXdoaWxlIChjb21taXQgPT0gTlVMTCkgeworCQl1bnNpZ25lZCBpbnQgbWFyazsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzID0gTlVMTDsKKworCQlpZiAocmV2X2xpc3QgPT0gTlVMTCB8fCBub25fY29tbW9uX3JldnMgPT0gMCkKKwkJCXJldHVybiBOVUxMOworCisJCWNvbW1pdCA9IHJldl9saXN0LT5pdGVtOworCQlpZiAoIShjb21taXQtPm9iamVjdC5wYXJzZWQpKQorCQkJaWYgKCFwYXJzZV9jb21taXQoY29tbWl0KSkKKwkJCQlwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOworCisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFBPUFBFRDsKKwkJaWYgKCEoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBDT01NT04pKQorCQkJbm9uX2NvbW1vbl9yZXZzLS07CisKKwkJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgQ09NTU9OKSB7CisJCQkvKiBkbyBub3Qgc2VuZCAiaGF2ZSIsIGFuZCBpZ25vcmUgYW5jZXN0b3JzICovCisJCQljb21taXQgPSBOVUxMOworCQkJbWFyayA9IENPTU1PTiB8IFNFRU47CisJCX0gZWxzZSBpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBDT01NT05fUkVGKQorCQkJLyogc2VuZCAiaGF2ZSIsIGFuZCBpZ25vcmUgYW5jZXN0b3JzICovCisJCQltYXJrID0gQ09NTU9OIHwgU0VFTjsKKwkJZWxzZQorCQkJLyogc2VuZCAiaGF2ZSIsIGFsc28gZm9yIGl0cyBhbmNlc3RvcnMgKi8KKwkJCW1hcmsgPSBTRUVOOworCisJCXdoaWxlIChwYXJlbnRzKSB7CisJCQlpZiAoIShwYXJlbnRzLT5pdGVtLT5vYmplY3QuZmxhZ3MgJiBTRUVOKSkKKwkJCQlyZXZfbGlzdF9wdXNoKHBhcmVudHMtPml0ZW0sIG1hcmspOworCQkJaWYgKG1hcmsgJiBDT01NT04pCisJCQkJbWFya19jb21tb24ocGFyZW50cy0+aXRlbSwgMSwgMCk7CisJCQlwYXJlbnRzID0gcGFyZW50cy0+bmV4dDsKKwkJfQorCisJCXJldl9saXN0ID0gcmV2X2xpc3QtPm5leHQ7CisJfQorCisJcmV0dXJuIGNvbW1pdC0+b2JqZWN0LnNoYTE7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9jb21tb24oaW50IGZkWzJdLCB1bnNpZ25lZCBjaGFyICpyZXN1bHRfc2hhMSwKKwkJICAgICAgIHN0cnVjdCByZWYgKnJlZnMpCit7CisJaW50IGZldGNoaW5nOworCWludCBjb3VudCA9IDAsIGZsdXNoZXMgPSAwLCByZXR2YWw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMTsKKwl1bnNpZ25lZCBpbl92YWluID0gMDsKKwlpbnQgZ290X2NvbnRpbnVlID0gMDsKKworCWlmIChtYXJrZWQpCisJCWZvcl9lYWNoX3JlZihjbGVhcl9tYXJrcywgTlVMTCk7CisJbWFya2VkID0gMTsKKworCWZvcl9lYWNoX3JlZihyZXZfbGlzdF9pbnNlcnRfcmVmLCBOVUxMKTsKKworCWZldGNoaW5nID0gMDsKKwlmb3IgKCA7IHJlZnMgOyByZWZzID0gcmVmcy0+bmV4dCkgeworCQl1bnNpZ25lZCBjaGFyICpyZW1vdGUgPSByZWZzLT5vbGRfc2hhMTsKKwkJc3RydWN0IG9iamVjdCAqbzsKKworCQkvKgorCQkgKiBJZiB0aGF0IG9iamVjdCBpcyBjb21wbGV0ZSAoaS5lLiBpdCBpcyBhbiBhbmNlc3RvciBvZiBhCisJCSAqIGxvY2FsIHJlZiksIHdlIHRlbGwgdGhlbSB3ZSBoYXZlIGl0IGJ1dCBkbyBub3QgaGF2ZSB0bworCQkgKiB0ZWxsIHRoZW0gYWJvdXQgaXRzIGFuY2VzdG9ycywgd2hpY2ggdGhleSBhbHJlYWR5IGtub3cKKwkJICogYWJvdXQuCisJCSAqCisJCSAqIFdlIHVzZSBsb29rdXBfb2JqZWN0IGhlcmUgYmVjYXVzZSB3ZSBhcmUgb25seQorCQkgKiBpbnRlcmVzdGVkIGluIHRoZSBjYXNlIHdlICprbm93KiB0aGUgb2JqZWN0IGlzCisJCSAqIHJlYWNoYWJsZSBhbmQgd2UgaGF2ZSBhbHJlYWR5IHNjYW5uZWQgaXQuCisJCSAqLworCQlpZiAoKChvID0gbG9va3VwX29iamVjdChyZW1vdGUpKSAhPSBOVUxMKSAmJgorCQkJCShvLT5mbGFncyAmIENPTVBMRVRFKSkgeworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIWZldGNoaW5nKQorCQkJcGFja2V0X3dyaXRlKGZkWzFdLCAid2FudCAlcyVzJXMlcyVzJXMlcyVzXG4iLAorCQkJCSAgICAgc2hhMV90b19oZXgocmVtb3RlKSwKKwkJCQkgICAgIChtdWx0aV9hY2sgPyAiIG11bHRpX2FjayIgOiAiIiksCisJCQkJICAgICAodXNlX3NpZGViYW5kID09IDIgPyAiIHNpZGUtYmFuZC02NGsiIDogIiIpLAorCQkJCSAgICAgKHVzZV9zaWRlYmFuZCA9PSAxID8gIiBzaWRlLWJhbmQiIDogIiIpLAorCQkJCSAgICAgKGFyZ3MudXNlX3RoaW5fcGFjayA/ICIgdGhpbi1wYWNrIiA6ICIiKSwKKwkJCQkgICAgIChhcmdzLm5vX3Byb2dyZXNzID8gIiBuby1wcm9ncmVzcyIgOiAiIiksCisJCQkJICAgICAoYXJncy5pbmNsdWRlX3RhZyA/ICIgaW5jbHVkZS10YWciIDogIiIpLAorCQkJCSAgICAgIiBvZnMtZGVsdGEiKTsKKwkJZWxzZQorCQkJcGFja2V0X3dyaXRlKGZkWzFdLCAid2FudCAlc1xuIiwgc2hhMV90b19oZXgocmVtb3RlKSk7CisJCWZldGNoaW5nKys7CisJfQorCWlmIChpc19yZXBvc2l0b3J5X3NoYWxsb3coKSkKKwkJd3JpdGVfc2hhbGxvd19jb21taXRzKGZkWzFdLCAxKTsKKwlpZiAoYXJncy5kZXB0aCA+IDApCisJCXBhY2tldF93cml0ZShmZFsxXSwgImRlZXBlbiAlZCIsIGFyZ3MuZGVwdGgpOworCXBhY2tldF9mbHVzaChmZFsxXSk7CisJaWYgKCFmZXRjaGluZykKKwkJcmV0dXJuIDE7CisKKwlpZiAoYXJncy5kZXB0aCA+IDApIHsKKwkJY2hhciBsaW5lWzEwMjRdOworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQlpbnQgbGVuOworCisJCXdoaWxlICgobGVuID0gcGFja2V0X3JlYWRfbGluZShmZFswXSwgbGluZSwgc2l6ZW9mKGxpbmUpKSkpIHsKKwkJCWlmICghcHJlZml4Y21wKGxpbmUsICJzaGFsbG93ICIpKSB7CisJCQkJaWYgKGdldF9zaGExX2hleChsaW5lICsgOCwgc2hhMSkpCisJCQkJCWRpZSgiaW52YWxpZCBzaGFsbG93IGxpbmU6ICVzIiwgbGluZSk7CisJCQkJcmVnaXN0ZXJfc2hhbGxvdyhzaGExKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcHJlZml4Y21wKGxpbmUsICJ1bnNoYWxsb3cgIikpIHsKKwkJCQlpZiAoZ2V0X3NoYTFfaGV4KGxpbmUgKyAxMCwgc2hhMSkpCisJCQkJCWRpZSgiaW52YWxpZCB1bnNoYWxsb3cgbGluZTogJXMiLCBsaW5lKTsKKwkJCQlpZiAoIWxvb2t1cF9vYmplY3Qoc2hhMSkpCisJCQkJCWRpZSgib2JqZWN0IG5vdCBmb3VuZDogJXMiLCBsaW5lKTsKKwkJCQkvKiBtYWtlIHN1cmUgdGhhdCBpdCBpcyBwYXJzZWQgYXMgc2hhbGxvdyAqLworCQkJCWlmICghcGFyc2Vfb2JqZWN0KHNoYTEpKQorCQkJCQlkaWUoImVycm9yIGluIG9iamVjdDogJXMiLCBsaW5lKTsKKwkJCQlpZiAodW5yZWdpc3Rlcl9zaGFsbG93KHNoYTEpKQorCQkJCQlkaWUoIm5vIHNoYWxsb3cgZm91bmQ6ICVzIiwgbGluZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlkaWUoImV4cGVjdGVkIHNoYWxsb3cvdW5zaGFsbG93LCBnb3QgJXMiLCBsaW5lKTsKKwkJfQorCX0KKworCWZsdXNoZXMgPSAwOworCXJldHZhbCA9IC0xOworCXdoaWxlICgoc2hhMSA9IGdldF9yZXYoKSkpIHsKKwkJcGFja2V0X3dyaXRlKGZkWzFdLCAiaGF2ZSAlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOworCQlpZiAoYXJncy52ZXJib3NlKQorCQkJZnByaW50ZihzdGRlcnIsICJoYXZlICVzXG4iLCBzaGExX3RvX2hleChzaGExKSk7CisJCWluX3ZhaW4rKzsKKwkJaWYgKCEoMzEgJiArK2NvdW50KSkgeworCQkJaW50IGFjazsKKworCQkJcGFja2V0X2ZsdXNoKGZkWzFdKTsKKwkJCWZsdXNoZXMrKzsKKworCQkJLyoKKwkJCSAqIFdlIGtlZXAgb25lIHdpbmRvdyAiYWhlYWQiIG9mIHRoZSBvdGhlciBzaWRlLCBhbmQKKwkJCSAqIHdpbGwgd2FpdCBmb3IgYW4gQUNLIG9ubHkgb24gdGhlIG5leHQgb25lCisJCQkgKi8KKwkJCWlmIChjb3VudCA9PSAzMikKKwkJCQljb250aW51ZTsKKworCQkJZG8geworCQkJCWFjayA9IGdldF9hY2soZmRbMF0sIHJlc3VsdF9zaGExKTsKKwkJCQlpZiAoYXJncy52ZXJib3NlICYmIGFjaykKKwkJCQkJZnByaW50ZihzdGRlcnIsICJnb3QgYWNrICVkICVzXG4iLCBhY2ssCisJCQkJCQkJc2hhMV90b19oZXgocmVzdWx0X3NoYTEpKTsKKwkJCQlpZiAoYWNrID09IDEpIHsKKwkJCQkJZmx1c2hlcyA9IDA7CisJCQkJCW11bHRpX2FjayA9IDA7CisJCQkJCXJldHZhbCA9IDA7CisJCQkJCWdvdG8gZG9uZTsKKwkJCQl9IGVsc2UgaWYgKGFjayA9PSAyKSB7CisJCQkJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9CisJCQkJCQlsb29rdXBfY29tbWl0KHJlc3VsdF9zaGExKTsKKwkJCQkJbWFya19jb21tb24oY29tbWl0LCAwLCAxKTsKKwkJCQkJcmV0dmFsID0gMDsKKwkJCQkJaW5fdmFpbiA9IDA7CisJCQkJCWdvdF9jb250aW51ZSA9IDE7CisJCQkJfQorCQkJfSB3aGlsZSAoYWNrKTsKKwkJCWZsdXNoZXMtLTsKKwkJCWlmIChnb3RfY29udGludWUgJiYgTUFYX0lOX1ZBSU4gPCBpbl92YWluKSB7CisJCQkJaWYgKGFyZ3MudmVyYm9zZSkKKwkJCQkJZnByaW50ZihzdGRlcnIsICJnaXZpbmcgdXBcbiIpOworCQkJCWJyZWFrOyAvKiBnaXZlIHVwICovCisJCQl9CisJCX0KKwl9Citkb25lOgorCXBhY2tldF93cml0ZShmZFsxXSwgImRvbmVcbiIpOworCWlmIChhcmdzLnZlcmJvc2UpCisJCWZwcmludGYoc3RkZXJyLCAiZG9uZVxuIik7CisJaWYgKHJldHZhbCAhPSAwKSB7CisJCW11bHRpX2FjayA9IDA7CisJCWZsdXNoZXMrKzsKKwl9CisJd2hpbGUgKGZsdXNoZXMgfHwgbXVsdGlfYWNrKSB7CisJCWludCBhY2sgPSBnZXRfYWNrKGZkWzBdLCByZXN1bHRfc2hhMSk7CisJCWlmIChhY2spIHsKKwkJCWlmIChhcmdzLnZlcmJvc2UpCisJCQkJZnByaW50ZihzdGRlcnIsICJnb3QgYWNrICglZCkgJXNcbiIsIGFjaywKKwkJCQkJc2hhMV90b19oZXgocmVzdWx0X3NoYTEpKTsKKwkJCWlmIChhY2sgPT0gMSkKKwkJCQlyZXR1cm4gMDsKKwkJCW11bHRpX2FjayA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlmbHVzaGVzLS07CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0X2xpc3QgKmNvbXBsZXRlOworCitzdGF0aWMgaW50IG1hcmtfY29tcGxldGUoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZsYWcsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IG9iamVjdCAqbyA9IHBhcnNlX29iamVjdChzaGExKTsKKworCXdoaWxlIChvICYmIG8tPnR5cGUgPT0gT0JKX1RBRykgeworCQlzdHJ1Y3QgdGFnICp0ID0gKHN0cnVjdCB0YWcgKikgbzsKKwkJaWYgKCF0LT50YWdnZWQpCisJCQlicmVhazsgLyogYnJva2VuIHJlcG9zaXRvcnkgKi8KKwkJby0+ZmxhZ3MgfD0gQ09NUExFVEU7CisJCW8gPSBwYXJzZV9vYmplY3QodC0+dGFnZ2VkLT5zaGExKTsKKwl9CisJaWYgKG8gJiYgby0+dHlwZSA9PSBPQkpfQ09NTUlUKSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IChzdHJ1Y3QgY29tbWl0ICopbzsKKwkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gQ09NUExFVEU7CisJCWluc2VydF9ieV9kYXRlKGNvbW1pdCwgJmNvbXBsZXRlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1hcmtfcmVjZW50X2NvbXBsZXRlX2NvbW1pdHModW5zaWduZWQgbG9uZyBjdXRvZmYpCit7CisJd2hpbGUgKGNvbXBsZXRlICYmIGN1dG9mZiA8PSBjb21wbGV0ZS0+aXRlbS0+ZGF0ZSkgeworCQlpZiAoYXJncy52ZXJib3NlKQorCQkJZnByaW50ZihzdGRlcnIsICJNYXJraW5nICVzIGFzIGNvbXBsZXRlXG4iLAorCQkJCXNoYTFfdG9faGV4KGNvbXBsZXRlLT5pdGVtLT5vYmplY3Quc2hhMSkpOworCQlwb3BfbW9zdF9yZWNlbnRfY29tbWl0KCZjb21wbGV0ZSwgQ09NUExFVEUpOworCX0KK30KKworc3RhdGljIHZvaWQgZmlsdGVyX3JlZnMoc3RydWN0IHJlZiAqKnJlZnMsIGludCBucl9tYXRjaCwgY2hhciAqKm1hdGNoKQoreworCXN0cnVjdCByZWYgKipyZXR1cm5fcmVmczsKKwlzdHJ1Y3QgcmVmICpuZXdsaXN0ID0gTlVMTDsKKwlzdHJ1Y3QgcmVmICoqbmV3dGFpbCA9ICZuZXdsaXN0OworCXN0cnVjdCByZWYgKnJlZiwgKm5leHQ7CisJc3RydWN0IHJlZiAqZmFzdGFycmF5WzMyXTsKKworCWlmIChucl9tYXRjaCAmJiAhYXJncy5mZXRjaF9hbGwpIHsKKwkJaWYgKEFSUkFZX1NJWkUoZmFzdGFycmF5KSA8IG5yX21hdGNoKQorCQkJcmV0dXJuX3JlZnMgPSB4Y2FsbG9jKG5yX21hdGNoLCBzaXplb2Yoc3RydWN0IHJlZiAqKSk7CisJCWVsc2UgeworCQkJcmV0dXJuX3JlZnMgPSBmYXN0YXJyYXk7CisJCQltZW1zZXQocmV0dXJuX3JlZnMsIDAsIHNpemVvZihzdHJ1Y3QgcmVmICopICogbnJfbWF0Y2gpOworCQl9CisJfQorCWVsc2UKKwkJcmV0dXJuX3JlZnMgPSBOVUxMOworCisJZm9yIChyZWYgPSAqcmVmczsgcmVmOyByZWYgPSBuZXh0KSB7CisJCW5leHQgPSByZWYtPm5leHQ7CisJCWlmICghbWVtY21wKHJlZi0+bmFtZSwgInJlZnMvIiwgNSkgJiYKKwkJICAgIGNoZWNrX3JlZl9mb3JtYXQocmVmLT5uYW1lICsgNSkpCisJCQk7IC8qIHRyYXNoICovCisJCWVsc2UgaWYgKGFyZ3MuZmV0Y2hfYWxsICYmCisJCQkgKCFhcmdzLmRlcHRoIHx8IHByZWZpeGNtcChyZWYtPm5hbWUsICJyZWZzL3RhZ3MvIikgKSkgeworCQkJKm5ld3RhaWwgPSByZWY7CisJCQlyZWYtPm5leHQgPSBOVUxMOworCQkJbmV3dGFpbCA9ICZyZWYtPm5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQllbHNlIHsKKwkJCWludCBvcmRlciA9IHBhdGhfbWF0Y2gocmVmLT5uYW1lLCBucl9tYXRjaCwgbWF0Y2gpOworCQkJaWYgKG9yZGVyKSB7CisJCQkJcmV0dXJuX3JlZnNbb3JkZXItMV0gPSByZWY7CisJCQkJY29udGludWU7IC8qIHdlIHdpbGwgbGluayBpdCBsYXRlciAqLworCQkJfQorCQl9CisJCWZyZWUocmVmKTsKKwl9CisKKwlpZiAoIWFyZ3MuZmV0Y2hfYWxsKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgbnJfbWF0Y2g7IGkrKykgeworCQkJcmVmID0gcmV0dXJuX3JlZnNbaV07CisJCQlpZiAocmVmKSB7CisJCQkJKm5ld3RhaWwgPSByZWY7CisJCQkJcmVmLT5uZXh0ID0gTlVMTDsKKwkJCQluZXd0YWlsID0gJnJlZi0+bmV4dDsKKwkJCX0KKwkJfQorCQlpZiAocmV0dXJuX3JlZnMgIT0gZmFzdGFycmF5KQorCQkJZnJlZShyZXR1cm5fcmVmcyk7CisJfQorCSpyZWZzID0gbmV3bGlzdDsKK30KKworc3RhdGljIGludCBldmVyeXRoaW5nX2xvY2FsKHN0cnVjdCByZWYgKipyZWZzLCBpbnQgbnJfbWF0Y2gsIGNoYXIgKiptYXRjaCkKK3sKKwlzdHJ1Y3QgcmVmICpyZWY7CisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBsb25nIGN1dG9mZiA9IDA7CisKKwlzYXZlX2NvbW1pdF9idWZmZXIgPSAwOworCisJZm9yIChyZWYgPSAqcmVmczsgcmVmOyByZWYgPSByZWYtPm5leHQpIHsKKwkJc3RydWN0IG9iamVjdCAqbzsKKworCQlvID0gcGFyc2Vfb2JqZWN0KHJlZi0+b2xkX3NoYTEpOworCQlpZiAoIW8pCisJCQljb250aW51ZTsKKworCQkvKiBXZSBhbHJlYWR5IGhhdmUgaXQgLS0gd2hpY2ggbWF5IG1lYW4gdGhhdCB3ZSB3ZXJlCisJCSAqIGluIHN5bmMgd2l0aCB0aGUgb3RoZXIgc2lkZSBhdCBzb21lIHRpbWUgYWZ0ZXIKKwkJICogdGhhdCAoaXQgaXMgT0sgaWYgd2UgZ3Vlc3Mgd3JvbmcgaGVyZSkuCisJCSAqLworCQlpZiAoby0+dHlwZSA9PSBPQkpfQ09NTUlUKSB7CisJCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSAoc3RydWN0IGNvbW1pdCAqKW87CisJCQlpZiAoIWN1dG9mZiB8fCBjdXRvZmYgPCBjb21taXQtPmRhdGUpCisJCQkJY3V0b2ZmID0gY29tbWl0LT5kYXRlOworCQl9CisJfQorCisJaWYgKCFhcmdzLmRlcHRoKSB7CisJCWZvcl9lYWNoX3JlZihtYXJrX2NvbXBsZXRlLCBOVUxMKTsKKwkJaWYgKGN1dG9mZikKKwkJCW1hcmtfcmVjZW50X2NvbXBsZXRlX2NvbW1pdHMoY3V0b2ZmKTsKKwl9CisKKwkvKgorCSAqIE1hcmsgYWxsIGNvbXBsZXRlIHJlbW90ZSByZWZzIGFzIGNvbW1vbiByZWZzLgorCSAqIERvbid0IG1hcmsgdGhlbSBjb21tb24geWV0OyB0aGUgc2VydmVyIGhhcyB0byBiZSB0b2xkIHNvIGZpcnN0LgorCSAqLworCWZvciAocmVmID0gKnJlZnM7IHJlZjsgcmVmID0gcmVmLT5uZXh0KSB7CisJCXN0cnVjdCBvYmplY3QgKm8gPSBkZXJlZl90YWcobG9va3VwX29iamVjdChyZWYtPm9sZF9zaGExKSwKKwkJCQkJICAgICBOVUxMLCAwKTsKKworCQlpZiAoIW8gfHwgby0+dHlwZSAhPSBPQkpfQ09NTUlUIHx8ICEoby0+ZmxhZ3MgJiBDT01QTEVURSkpCisJCQljb250aW51ZTsKKworCQlpZiAoIShvLT5mbGFncyAmIFNFRU4pKSB7CisJCQlyZXZfbGlzdF9wdXNoKChzdHJ1Y3QgY29tbWl0ICopbywgQ09NTU9OX1JFRiB8IFNFRU4pOworCisJCQltYXJrX2NvbW1vbigoc3RydWN0IGNvbW1pdCAqKW8sIDEsIDEpOworCQl9CisJfQorCisJZmlsdGVyX3JlZnMocmVmcywgbnJfbWF0Y2gsIG1hdGNoKTsKKworCWZvciAocmV0dmFsID0gMSwgcmVmID0gKnJlZnM7IHJlZiA7IHJlZiA9IHJlZi0+bmV4dCkgeworCQljb25zdCB1bnNpZ25lZCBjaGFyICpyZW1vdGUgPSByZWYtPm9sZF9zaGExOworCQl1bnNpZ25lZCBjaGFyIGxvY2FsWzIwXTsKKwkJc3RydWN0IG9iamVjdCAqbzsKKworCQlvID0gbG9va3VwX29iamVjdChyZW1vdGUpOworCQlpZiAoIW8gfHwgIShvLT5mbGFncyAmIENPTVBMRVRFKSkgeworCQkJcmV0dmFsID0gMDsKKwkJCWlmICghYXJncy52ZXJib3NlKQorCQkJCWNvbnRpbnVlOworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIndhbnQgJXMgKCVzKVxuIiwgc2hhMV90b19oZXgocmVtb3RlKSwKKwkJCQlyZWYtPm5hbWUpOworCQkJY29udGludWU7CisJCX0KKworCQloYXNoY3B5KHJlZi0+bmV3X3NoYTEsIGxvY2FsKTsKKwkJaWYgKCFhcmdzLnZlcmJvc2UpCisJCQljb250aW51ZTsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiYWxyZWFkeSBoYXZlICVzICglcylcbiIsIHNoYTFfdG9faGV4KHJlbW90ZSksCisJCQlyZWYtPm5hbWUpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHNpZGViYW5kX2RlbXV4KGludCBmZCwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgKnhkID0gZGF0YTsKKworCXJldHVybiByZWN2X3NpZGViYW5kKCJmZXRjaC1wYWNrIiwgeGRbMF0sIGZkLCAyKTsKK30KKworc3RhdGljIGludCBnZXRfcGFjayhpbnQgeGRbMl0sIGNoYXIgKipwYWNrX2xvY2tmaWxlKQoreworCXN0cnVjdCBhc3luYyBkZW11eDsKKwljb25zdCBjaGFyICphcmd2WzIwXTsKKwljaGFyIGtlZXBfYXJnWzI1Nl07CisJY2hhciBoZHJfYXJnWzI1Nl07CisJY29uc3QgY2hhciAqKmF2OworCWludCBkb19rZWVwID0gYXJncy5rZWVwX3BhY2s7CisJc3RydWN0IGNoaWxkX3Byb2Nlc3MgY21kOworCisJbWVtc2V0KCZkZW11eCwgMCwgc2l6ZW9mKGRlbXV4KSk7CisJaWYgKHVzZV9zaWRlYmFuZCkgeworCQkvKiB4ZFtdIGlzIHRhbGtpbmcgd2l0aCB1cGxvYWQtcGFjazsgc3VicHJvY2VzcyByZWFkcyBmcm9tCisJCSAqIHhkWzBdLCBzcGl0cyBvdXQgYmFuZCMyIHRvIHN0ZGVyciwgYW5kIGZlZWRzIHVzIGJhbmQjMQorCQkgKiB0aHJvdWdoIGRlbXV4LT5vdXQuCisJCSAqLworCQlkZW11eC5wcm9jID0gc2lkZWJhbmRfZGVtdXg7CisJCWRlbXV4LmRhdGEgPSB4ZDsKKwkJaWYgKHN0YXJ0X2FzeW5jKCZkZW11eCkpCisJCQlkaWUoImZldGNoLXBhY2s6IHVuYWJsZSB0byBmb3JrIG9mZiBzaWRlYmFuZCIKKwkJCSAgICAiIGRlbXVsdGlwbGV4ZXIiKTsKKwl9CisJZWxzZQorCQlkZW11eC5vdXQgPSB4ZFswXTsKKworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLmFyZ3YgPSBhcmd2OworCWF2ID0gYXJndjsKKwkqaGRyX2FyZyA9IDA7CisJaWYgKCFhcmdzLmtlZXBfcGFjayAmJiB1bnBhY2tfbGltaXQpIHsKKwkJc3RydWN0IHBhY2tfaGVhZGVyIGhlYWRlcjsKKworCQlpZiAocmVhZF9wYWNrX2hlYWRlcihkZW11eC5vdXQsICZoZWFkZXIpKQorCQkJZGllKCJwcm90b2NvbCBlcnJvcjogYmFkIHBhY2sgaGVhZGVyIik7CisJCXNucHJpbnRmKGhkcl9hcmcsIHNpemVvZihoZHJfYXJnKSwgIi0tcGFja19oZWFkZXI9JXUsJXUiLAorCQkJIG50b2hsKGhlYWRlci5oZHJfdmVyc2lvbiksIG50b2hsKGhlYWRlci5oZHJfZW50cmllcykpOworCQlpZiAobnRvaGwoaGVhZGVyLmhkcl9lbnRyaWVzKSA8IHVucGFja19saW1pdCkKKwkJCWRvX2tlZXAgPSAwOworCQllbHNlCisJCQlkb19rZWVwID0gMTsKKwl9CisKKwlpZiAoZG9fa2VlcCkgeworCQlpZiAocGFja19sb2NrZmlsZSkKKwkJCWNtZC5vdXQgPSAtMTsKKwkJKmF2KysgPSAiaW5kZXgtcGFjayI7CisJCSphdisrID0gIi0tc3RkaW4iOworCQlpZiAoIWFyZ3MucXVpZXQgJiYgIWFyZ3Mubm9fcHJvZ3Jlc3MpCisJCQkqYXYrKyA9ICItdiI7CisJCWlmIChhcmdzLnVzZV90aGluX3BhY2spCisJCQkqYXYrKyA9ICItLWZpeC10aGluIjsKKwkJaWYgKGFyZ3MubG9ja19wYWNrIHx8IHVucGFja19saW1pdCkgeworCQkJaW50IHMgPSBzcHJpbnRmKGtlZXBfYXJnLAorCQkJCQkiLS1rZWVwPWZldGNoLXBhY2sgJWQgb24gIiwgZ2V0cGlkKCkpOworCQkJaWYgKGdldGhvc3RuYW1lKGtlZXBfYXJnICsgcywgc2l6ZW9mKGtlZXBfYXJnKSAtIHMpKQorCQkJCXN0cmNweShrZWVwX2FyZyArIHMsICJsb2NhbGhvc3QiKTsKKwkJCSphdisrID0ga2VlcF9hcmc7CisJCX0KKwl9CisJZWxzZSB7CisJCSphdisrID0gInVucGFjay1vYmplY3RzIjsKKwkJaWYgKGFyZ3MucXVpZXQpCisJCQkqYXYrKyA9ICItcSI7CisJfQorCWlmICgqaGRyX2FyZykKKwkJKmF2KysgPSBoZHJfYXJnOworCSphdisrID0gTlVMTDsKKworCWNtZC5pbiA9IGRlbXV4Lm91dDsKKwljbWQuZ2l0X2NtZCA9IDE7CisJaWYgKHN0YXJ0X2NvbW1hbmQoJmNtZCkpCisJCWRpZSgiZmV0Y2gtcGFjazogdW5hYmxlIHRvIGZvcmsgb2ZmICVzIiwgYXJndlswXSk7CisJaWYgKGRvX2tlZXAgJiYgcGFja19sb2NrZmlsZSkgeworCQkqcGFja19sb2NrZmlsZSA9IGluZGV4X3BhY2tfbG9ja2ZpbGUoY21kLm91dCk7CisJCWNsb3NlKGNtZC5vdXQpOworCX0KKworCWlmIChmaW5pc2hfY29tbWFuZCgmY21kKSkKKwkJZGllKCIlcyBmYWlsZWQiLCBhcmd2WzBdKTsKKwlpZiAodXNlX3NpZGViYW5kICYmIGZpbmlzaF9hc3luYygmZGVtdXgpKQorCQlkaWUoImVycm9yIGluIHNpZGViYW5kIGRlbXVsdGlwbGV4ZXIiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCByZWYgKmRvX2ZldGNoX3BhY2soaW50IGZkWzJdLAorCQljb25zdCBzdHJ1Y3QgcmVmICpvcmlnX3JlZiwKKwkJaW50IG5yX21hdGNoLAorCQljaGFyICoqbWF0Y2gsCisJCWNoYXIgKipwYWNrX2xvY2tmaWxlKQoreworCXN0cnVjdCByZWYgKnJlZiA9IGNvcHlfcmVmX2xpc3Qob3JpZ19yZWYpOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisKKwlpZiAoaXNfcmVwb3NpdG9yeV9zaGFsbG93KCkgJiYgIXNlcnZlcl9zdXBwb3J0cygic2hhbGxvdyIpKQorCQlkaWUoIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNoYWxsb3cgY2xpZW50cyIpOworCWlmIChzZXJ2ZXJfc3VwcG9ydHMoIm11bHRpX2FjayIpKSB7CisJCWlmIChhcmdzLnZlcmJvc2UpCisJCQlmcHJpbnRmKHN0ZGVyciwgIlNlcnZlciBzdXBwb3J0cyBtdWx0aV9hY2tcbiIpOworCQltdWx0aV9hY2sgPSAxOworCX0KKwlpZiAoc2VydmVyX3N1cHBvcnRzKCJzaWRlLWJhbmQtNjRrIikpIHsKKwkJaWYgKGFyZ3MudmVyYm9zZSkKKwkJCWZwcmludGYoc3RkZXJyLCAiU2VydmVyIHN1cHBvcnRzIHNpZGUtYmFuZC02NGtcbiIpOworCQl1c2Vfc2lkZWJhbmQgPSAyOworCX0KKwllbHNlIGlmIChzZXJ2ZXJfc3VwcG9ydHMoInNpZGUtYmFuZCIpKSB7CisJCWlmIChhcmdzLnZlcmJvc2UpCisJCQlmcHJpbnRmKHN0ZGVyciwgIlNlcnZlciBzdXBwb3J0cyBzaWRlLWJhbmRcbiIpOworCQl1c2Vfc2lkZWJhbmQgPSAxOworCX0KKwlpZiAoZXZlcnl0aGluZ19sb2NhbCgmcmVmLCBucl9tYXRjaCwgbWF0Y2gpKSB7CisJCXBhY2tldF9mbHVzaChmZFsxXSk7CisJCWdvdG8gYWxsX2RvbmU7CisJfQorCWlmIChmaW5kX2NvbW1vbihmZCwgc2hhMSwgcmVmKSA8IDApCisJCWlmICghYXJncy5rZWVwX3BhY2spCisJCQkvKiBXaGVuIGNsb25pbmcsIGl0IGlzIG5vdCB1bnVzdWFsIHRvIGhhdmUKKwkJCSAqIG5vIGNvbW1vbiBjb21taXQuCisJCQkgKi8KKwkJCWZwcmludGYoc3RkZXJyLCAid2FybmluZzogbm8gY29tbW9uIGNvbW1pdHNcbiIpOworCisJaWYgKGdldF9wYWNrKGZkLCBwYWNrX2xvY2tmaWxlKSkKKwkJZGllKCJnaXQtZmV0Y2gtcGFjazogZmV0Y2ggZmFpbGVkLiIpOworCisgYWxsX2RvbmU6CisJcmV0dXJuIHJlZjsKK30KKworc3RhdGljIGludCByZW1vdmVfZHVwbGljYXRlcyhpbnQgbnJfaGVhZHMsIGNoYXIgKipoZWFkcykKK3sKKwlpbnQgc3JjLCBkc3Q7CisKKwlmb3IgKHNyYyA9IGRzdCA9IDA7IHNyYyA8IG5yX2hlYWRzOyBzcmMrKykgeworCQkvKiBJZiBoZWFkc1tzcmNdIGlzIGRpZmZlcmVudCBmcm9tIGFueSBvZgorCQkgKiBoZWFkc1swLi5kc3RdLCBwdXNoIGl0IGluLgorCQkgKi8KKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBkc3Q7IGkrKykgeworCQkJaWYgKCFzdHJjbXAoaGVhZHNbaV0sIGhlYWRzW3NyY10pKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChpIDwgZHN0KQorCQkJY29udGludWU7CisJCWlmIChzcmMgIT0gZHN0KQorCQkJaGVhZHNbZHN0XSA9IGhlYWRzW3NyY107CisJCWRzdCsrOworCX0KKwlyZXR1cm4gZHN0OworfQorCitzdGF0aWMgaW50IGZldGNoX3BhY2tfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKHN0cmNtcCh2YXIsICJmZXRjaC51bnBhY2tsaW1pdCIpID09IDApIHsKKwkJZmV0Y2hfdW5wYWNrX2xpbWl0ID0gZ2l0X2NvbmZpZ19pbnQodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChzdHJjbXAodmFyLCAidHJhbnNmZXIudW5wYWNrbGltaXQiKSA9PSAwKSB7CisJCXRyYW5zZmVyX3VucGFja19saW1pdCA9IGdpdF9jb25maWdfaW50KHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gZ2l0X2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUpOworfQorCitzdGF0aWMgc3RydWN0IGxvY2tfZmlsZSBsb2NrOworCitzdGF0aWMgdm9pZCBmZXRjaF9wYWNrX3NldHVwKHZvaWQpCit7CisJc3RhdGljIGludCBkaWRfc2V0dXA7CisJaWYgKGRpZF9zZXR1cCkKKwkJcmV0dXJuOworCWdpdF9jb25maWcoZmV0Y2hfcGFja19jb25maWcpOworCWlmICgwIDw9IHRyYW5zZmVyX3VucGFja19saW1pdCkKKwkJdW5wYWNrX2xpbWl0ID0gdHJhbnNmZXJfdW5wYWNrX2xpbWl0OworCWVsc2UgaWYgKDAgPD0gZmV0Y2hfdW5wYWNrX2xpbWl0KQorCQl1bnBhY2tfbGltaXQgPSBmZXRjaF91bnBhY2tfbGltaXQ7CisJZGlkX3NldHVwID0gMTsKK30KKworaW50IGNtZF9mZXRjaF9wYWNrKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBpLCByZXQsIG5yX2hlYWRzOworCXN0cnVjdCByZWYgKnJlZiA9IE5VTEw7CisJY2hhciAqZGVzdCA9IE5VTEwsICoqaGVhZHM7CisJaW50IGZkWzJdOworCXN0cnVjdCBjaGlsZF9wcm9jZXNzICpjb25uOworCisJbnJfaGVhZHMgPSAwOworCWhlYWRzID0gTlVMTDsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJaWYgKCphcmcgPT0gJy0nKSB7CisJCQlpZiAoIXByZWZpeGNtcChhcmcsICItLXVwbG9hZC1wYWNrPSIpKSB7CisJCQkJYXJncy51cGxvYWRwYWNrID0gYXJnICsgMTQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXByZWZpeGNtcChhcmcsICItLWV4ZWM9IikpIHsKKwkJCQlhcmdzLnVwbG9hZHBhY2sgPSBhcmcgKyA3OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoIi0tcXVpZXQiLCBhcmcpIHx8ICFzdHJjbXAoIi1xIiwgYXJnKSkgeworCQkJCWFyZ3MucXVpZXQgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoIi0ta2VlcCIsIGFyZykgfHwgIXN0cmNtcCgiLWsiLCBhcmcpKSB7CisJCQkJYXJncy5sb2NrX3BhY2sgPSBhcmdzLmtlZXBfcGFjazsKKwkJCQlhcmdzLmtlZXBfcGFjayA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcCgiLS10aGluIiwgYXJnKSkgeworCQkJCWFyZ3MudXNlX3RoaW5fcGFjayA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcCgiLS1pbmNsdWRlLXRhZyIsIGFyZykpIHsKKwkJCQlhcmdzLmluY2x1ZGVfdGFnID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKCItLWFsbCIsIGFyZykpIHsKKwkJCQlhcmdzLmZldGNoX2FsbCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcCgiLXYiLCBhcmcpKSB7CisJCQkJYXJncy52ZXJib3NlID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcHJlZml4Y21wKGFyZywgIi0tZGVwdGg9IikpIHsKKwkJCQlhcmdzLmRlcHRoID0gc3RydG9sKGFyZyArIDgsIE5VTEwsIDApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoIi0tbm8tcHJvZ3Jlc3MiLCBhcmcpKSB7CisJCQkJYXJncy5ub19wcm9ncmVzcyA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQl1c2FnZShmZXRjaF9wYWNrX3VzYWdlKTsKKwkJfQorCQlkZXN0ID0gKGNoYXIgKilhcmc7CisJCWhlYWRzID0gKGNoYXIgKiopKGFyZ3YgKyBpICsgMSk7CisJCW5yX2hlYWRzID0gYXJnYyAtIGkgLSAxOworCQlicmVhazsKKwl9CisJaWYgKCFkZXN0KQorCQl1c2FnZShmZXRjaF9wYWNrX3VzYWdlKTsKKworCWNvbm4gPSBnaXRfY29ubmVjdChmZCwgKGNoYXIgKilkZXN0LCBhcmdzLnVwbG9hZHBhY2ssCisJCQkgICBhcmdzLnZlcmJvc2UgPyBDT05ORUNUX1ZFUkJPU0UgOiAwKTsKKwlpZiAoY29ubikgeworCQlnZXRfcmVtb3RlX2hlYWRzKGZkWzBdLCAmcmVmLCAwLCBOVUxMLCAwKTsKKworCQlyZWYgPSBmZXRjaF9wYWNrKCZhcmdzLCBmZCwgY29ubiwgcmVmLCBkZXN0LCBucl9oZWFkcywgaGVhZHMsIE5VTEwpOworCQljbG9zZShmZFswXSk7CisJCWNsb3NlKGZkWzFdKTsKKwkJaWYgKGZpbmlzaF9jb25uZWN0KGNvbm4pKQorCQkJcmVmID0gTlVMTDsKKwl9IGVsc2UgeworCQlyZWYgPSBOVUxMOworCX0KKwlyZXQgPSAhcmVmOworCisJaWYgKCFyZXQgJiYgbnJfaGVhZHMpIHsKKwkJLyogSWYgdGhlIGhlYWRzIHRvIHB1bGwgd2VyZSBnaXZlbiwgd2Ugc2hvdWxkIGhhdmUKKwkJICogY29uc3VtZWQgYWxsIG9mIHRoZW0gYnkgbWF0Y2hpbmcgdGhlIHJlbW90ZS4KKwkJICogT3RoZXJ3aXNlLCAnZ2l0LWZldGNoIHJlbW90ZSBuby1zdWNoLXJlZicgd291bGQKKwkJICogc2lsZW50bHkgc3VjY2VlZCB3aXRob3V0IGlzc3VpbmcgYW4gZXJyb3IuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnJfaGVhZHM7IGkrKykKKwkJCWlmIChoZWFkc1tpXSAmJiBoZWFkc1tpXVswXSkgeworCQkJCWVycm9yKCJubyBzdWNoIHJlbW90ZSByZWYgJXMiLCBoZWFkc1tpXSk7CisJCQkJcmV0ID0gMTsKKwkJCX0KKwl9CisJd2hpbGUgKHJlZikgeworCQlwcmludGYoIiVzICVzXG4iLAorCQkgICAgICAgc2hhMV90b19oZXgocmVmLT5vbGRfc2hhMSksIHJlZi0+bmFtZSk7CisJCXJlZiA9IHJlZi0+bmV4dDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgcmVmICpmZXRjaF9wYWNrKHN0cnVjdCBmZXRjaF9wYWNrX2FyZ3MgKm15X2FyZ3MsCisJCSAgICAgICBpbnQgZmRbXSwgc3RydWN0IGNoaWxkX3Byb2Nlc3MgKmNvbm4sCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgcmVmICpyZWYsCisJCWNvbnN0IGNoYXIgKmRlc3QsCisJCWludCBucl9oZWFkcywKKwkJY2hhciAqKmhlYWRzLAorCQljaGFyICoqcGFja19sb2NrZmlsZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlzdHJ1Y3QgcmVmICpyZWZfY3B5OworCisJZmV0Y2hfcGFja19zZXR1cCgpOworCW1lbWNweSgmYXJncywgbXlfYXJncywgc2l6ZW9mKGFyZ3MpKTsKKwlpZiAoYXJncy5kZXB0aCA+IDApIHsKKwkJaWYgKHN0YXQoZ2l0X3BhdGgoInNoYWxsb3ciKSwgJnN0KSkKKwkJCXN0LnN0X210aW1lID0gMDsKKwl9CisKKwlpZiAoaGVhZHMgJiYgbnJfaGVhZHMpCisJCW5yX2hlYWRzID0gcmVtb3ZlX2R1cGxpY2F0ZXMobnJfaGVhZHMsIGhlYWRzKTsKKwlpZiAoIXJlZikgeworCQlwYWNrZXRfZmx1c2goZmRbMV0pOworCQlkaWUoIm5vIG1hdGNoaW5nIHJlbW90ZSBoZWFkIik7CisJfQorCXJlZl9jcHkgPSBkb19mZXRjaF9wYWNrKGZkLCByZWYsIG5yX2hlYWRzLCBoZWFkcywgcGFja19sb2NrZmlsZSk7CisKKwlpZiAoYXJncy5kZXB0aCA+IDApIHsKKwkJc3RydWN0IGNhY2hlX3RpbWUgbXRpbWU7CisJCWNoYXIgKnNoYWxsb3cgPSBnaXRfcGF0aCgic2hhbGxvdyIpOworCQlpbnQgZmQ7CisKKwkJbXRpbWUuc2VjID0gc3Quc3RfbXRpbWU7CisjaWZkZWYgVVNFX05TRUMKKwkJbXRpbWUudXNlYyA9IHN0LnN0X210aW0udXNlYzsKKyNlbmRpZgorCQlpZiAoc3RhdChzaGFsbG93LCAmc3QpKSB7CisJCQlpZiAobXRpbWUuc2VjKQorCQkJCWRpZSgic2hhbGxvdyBmaWxlIHdhcyByZW1vdmVkIGR1cmluZyBmZXRjaCIpOworCQl9IGVsc2UgaWYgKHN0LnN0X210aW1lICE9IG10aW1lLnNlYworI2lmZGVmIFVTRV9OU0VDCisJCQkJfHwgc3Quc3RfbXRpbS51c2VjICE9IG10aW1lLnVzZWMKKyNlbmRpZgorCQkJICApCisJCQlkaWUoInNoYWxsb3cgZmlsZSB3YXMgY2hhbmdlZCBkdXJpbmcgZmV0Y2giKTsKKworCQlmZCA9IGhvbGRfbG9ja19maWxlX2Zvcl91cGRhdGUoJmxvY2ssIHNoYWxsb3csIDEpOworCQlpZiAoIXdyaXRlX3NoYWxsb3dfY29tbWl0cyhmZCwgMCkpIHsKKwkJCXVubGluayhzaGFsbG93KTsKKwkJCXJvbGxiYWNrX2xvY2tfZmlsZSgmbG9jayk7CisJCX0gZWxzZSB7CisJCQljb21taXRfbG9ja19maWxlKCZsb2NrKTsKKwkJfQorCX0KKworCXJldHVybiByZWZfY3B5OworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1mZXRjaC5jIGIvYnVpbHRpbi1mZXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NDFiM2UKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWZldGNoLmMKQEAgLTAsMCArMSw2NTkgQEAKKy8qCisgKiAiZ2l0IGZldGNoIgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgInBhdGgtbGlzdC5oIgorI2luY2x1ZGUgInJlbW90ZS5oIgorI2luY2x1ZGUgInRyYW5zcG9ydC5oIgorI2luY2x1ZGUgInJ1bi1jb21tYW5kLmgiCisjaW5jbHVkZSAicGFyc2Utb3B0aW9ucy5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJ1aWx0aW5fZmV0Y2hfdXNhZ2VbXSA9IHsKKwkiZ2l0LWZldGNoIFtvcHRpb25zXSBbPHJlcG9zaXRvcnk+IDxyZWZzcGVjPi4uLl0iLAorCU5VTEwKK307CisKK2VudW0geworCVRBR1NfVU5TRVQgPSAwLAorCVRBR1NfREVGQVVMVCA9IDEsCisJVEFHU19TRVQgPSAyCit9OworCitzdGF0aWMgaW50IGFwcGVuZCwgZm9yY2UsIGtlZXAsIHVwZGF0ZV9oZWFkX29rLCB2ZXJib3NlLCBxdWlldDsKK3N0YXRpYyBpbnQgdGFncyA9IFRBR1NfREVGQVVMVDsKK3N0YXRpYyBjb25zdCBjaGFyICpkZXB0aDsKK3N0YXRpYyBjb25zdCBjaGFyICp1cGxvYWRfcGFjazsKK3N0YXRpYyBzdHJ1Y3Qgc3RyYnVmIGRlZmF1bHRfcmxhID0gU1RSQlVGX0lOSVQ7CitzdGF0aWMgc3RydWN0IHRyYW5zcG9ydCAqdHJhbnNwb3J0OworCitzdGF0aWMgc3RydWN0IG9wdGlvbiBidWlsdGluX2ZldGNoX29wdGlvbnNbXSA9IHsKKwlPUFRfX1FVSUVUKCZxdWlldCksCisJT1BUX19WRVJCT1NFKCZ2ZXJib3NlKSwKKwlPUFRfQk9PTEVBTignYScsICJhcHBlbmQiLCAmYXBwZW5kLAorCQkgICAgImFwcGVuZCB0byAuZ2l0L0ZFVENIX0hFQUQgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyIpLAorCU9QVF9TVFJJTkcoMCwgInVwbG9hZC1wYWNrIiwgJnVwbG9hZF9wYWNrLCAiUEFUSCIsCisJCSAgICJwYXRoIHRvIHVwbG9hZCBwYWNrIG9uIHJlbW90ZSBlbmQiKSwKKwlPUFRfQk9PTEVBTignZicsICJmb3JjZSIsICZmb3JjZSwKKwkJICAgICJmb3JjZSBvdmVyd3JpdGUgb2YgbG9jYWwgYnJhbmNoIiksCisJT1BUX1NFVF9JTlQoJ3QnLCAidGFncyIsICZ0YWdzLAorCQkgICAgImZldGNoIGFsbCB0YWdzIGFuZCBhc3NvY2lhdGVkIG9iamVjdHMiLCBUQUdTX1NFVCksCisJT1BUX1NFVF9JTlQoJ24nLCBOVUxMLCAmdGFncywKKwkJICAgICJkbyBub3QgZmV0Y2ggYWxsIHRhZ3MgKC0tbm8tdGFncykiLCBUQUdTX1VOU0VUKSwKKwlPUFRfQk9PTEVBTignaycsICJrZWVwIiwgJmtlZXAsICJrZWVwIGRvd25sb2FkZWQgcGFjayIpLAorCU9QVF9CT09MRUFOKCd1JywgInVwZGF0ZS1oZWFkLW9rIiwgJnVwZGF0ZV9oZWFkX29rLAorCQkgICAgImFsbG93IHVwZGF0aW5nIG9mIEhFQUQgcmVmIiksCisJT1BUX1NUUklORygwLCAiZGVwdGgiLCAmZGVwdGgsICJERVBUSCIsCisJCSAgICJkZWVwZW4gaGlzdG9yeSBvZiBzaGFsbG93IGNsb25lIiksCisJT1BUX0VORCgpCit9OworCitzdGF0aWMgdm9pZCB1bmxvY2tfcGFjayh2b2lkKQoreworCWlmICh0cmFuc3BvcnQpCisJCXRyYW5zcG9ydF91bmxvY2tfcGFjayh0cmFuc3BvcnQpOworfQorCitzdGF0aWMgdm9pZCB1bmxvY2tfcGFja19vbl9zaWduYWwoaW50IHNpZ25vKQoreworCXVubG9ja19wYWNrKCk7CisJc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7CisJcmFpc2Uoc2lnbm8pOworfQorCitzdGF0aWMgdm9pZCBhZGRfbWVyZ2VfY29uZmlnKHN0cnVjdCByZWYgKipoZWFkLAorCQkJICAgY29uc3Qgc3RydWN0IHJlZiAqcmVtb3RlX3JlZnMsCisJCSAgICAgICAgICAgc3RydWN0IGJyYW5jaCAqYnJhbmNoLAorCQkgICAgICAgICAgIHN0cnVjdCByZWYgKioqdGFpbCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBicmFuY2gtPm1lcmdlX25yOyBpKyspIHsKKwkJc3RydWN0IHJlZiAqcm0sICoqb2xkX3RhaWwgPSAqdGFpbDsKKwkJc3RydWN0IHJlZnNwZWMgcmVmc3BlYzsKKworCQlmb3IgKHJtID0gKmhlYWQ7IHJtOyBybSA9IHJtLT5uZXh0KSB7CisJCQlpZiAoYnJhbmNoX21lcmdlX21hdGNoZXMoYnJhbmNoLCBpLCBybS0+bmFtZSkpIHsKKwkJCQlybS0+bWVyZ2UgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChybSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIE5vdCBmZXRjaGVkIHRvIGEgdHJhY2tpbmcgYnJhbmNoPyAgV2UgbmVlZCB0byBmZXRjaAorCQkgKiBpdCBhbnl3YXkgdG8gYWxsb3cgdGhpcyBicmFuY2gncyAiYnJhbmNoLiRuYW1lLm1lcmdlIgorCQkgKiB0byBiZSBob25vcmVkIGJ5IGdpdC1wdWxsLCBidXQgd2UgZG8gbm90IGhhdmUgdG8KKwkJICogZmFpbCBpZiBicmFuY2guJG5hbWUubWVyZ2UgaXMgbWlzY29uZmlndXJlZCB0byBwb2ludAorCQkgKiBhdCBhIG5vbmV4aXN0aW5nIGJyYW5jaC4gIElmIHdlIHdlcmUgaW5kZWVkIGNhbGxlZCBieQorCQkgKiBnaXQtcHVsbCwgaXQgd2lsbCBub3RpY2UgdGhlIG1pc2NvbmZpZ3VyYXRpb24gYmVjYXVzZQorCQkgKiB0aGVyZSBpcyBubyBlbnRyeSBpbiB0aGUgcmVzdWx0aW5nIEZFVENIX0hFQUQgbWFya2VkCisJCSAqIGZvciBtZXJnaW5nLgorCQkgKi8KKwkJcmVmc3BlYy5zcmMgPSBicmFuY2gtPm1lcmdlW2ldLT5zcmM7CisJCXJlZnNwZWMuZHN0ID0gTlVMTDsKKwkJcmVmc3BlYy5wYXR0ZXJuID0gMDsKKwkJcmVmc3BlYy5mb3JjZSA9IDA7CisJCWdldF9mZXRjaF9tYXAocmVtb3RlX3JlZnMsICZyZWZzcGVjLCB0YWlsLCAxKTsKKwkJZm9yIChybSA9ICpvbGRfdGFpbDsgcm07IHJtID0gcm0tPm5leHQpCisJCQlybS0+bWVyZ2UgPSAxOworCX0KK30KKworc3RhdGljIHZvaWQgZmluZF9ub25fbG9jYWxfdGFncyhzdHJ1Y3QgdHJhbnNwb3J0ICp0cmFuc3BvcnQsCisJCQlzdHJ1Y3QgcmVmICoqaGVhZCwKKwkJCXN0cnVjdCByZWYgKioqdGFpbCk7CisKK3N0YXRpYyBzdHJ1Y3QgcmVmICpnZXRfcmVmX21hcChzdHJ1Y3QgdHJhbnNwb3J0ICp0cmFuc3BvcnQsCisJCQkgICAgICAgc3RydWN0IHJlZnNwZWMgKnJlZnMsIGludCByZWZfY291bnQsIGludCB0YWdzLAorCQkJICAgICAgIGludCAqYXV0b3RhZ3MpCit7CisJaW50IGk7CisJc3RydWN0IHJlZiAqcm07CisJc3RydWN0IHJlZiAqcmVmX21hcCA9IE5VTEw7CisJc3RydWN0IHJlZiAqKnRhaWwgPSAmcmVmX21hcDsKKworCWNvbnN0IHN0cnVjdCByZWYgKnJlbW90ZV9yZWZzID0gdHJhbnNwb3J0X2dldF9yZW1vdGVfcmVmcyh0cmFuc3BvcnQpOworCisJaWYgKHJlZl9jb3VudCB8fCB0YWdzID09IFRBR1NfU0VUKSB7CisJCWZvciAoaSA9IDA7IGkgPCByZWZfY291bnQ7IGkrKykgeworCQkJZ2V0X2ZldGNoX21hcChyZW1vdGVfcmVmcywgJnJlZnNbaV0sICZ0YWlsLCAwKTsKKwkJCWlmIChyZWZzW2ldLmRzdCAmJiByZWZzW2ldLmRzdFswXSkKKwkJCQkqYXV0b3RhZ3MgPSAxOworCQl9CisJCS8qIE1lcmdlIGV2ZXJ5dGhpbmcgb24gdGhlIGNvbW1hbmQgbGluZSwgYnV0IG5vdCAtLXRhZ3MgKi8KKwkJZm9yIChybSA9IHJlZl9tYXA7IHJtOyBybSA9IHJtLT5uZXh0KQorCQkJcm0tPm1lcmdlID0gMTsKKwkJaWYgKHRhZ3MgPT0gVEFHU19TRVQpIHsKKwkJCXN0cnVjdCByZWZzcGVjIHJlZnNwZWM7CisJCQlyZWZzcGVjLnNyYyA9ICJyZWZzL3RhZ3MvIjsKKwkJCXJlZnNwZWMuZHN0ID0gInJlZnMvdGFncy8iOworCQkJcmVmc3BlYy5wYXR0ZXJuID0gMTsKKwkJCXJlZnNwZWMuZm9yY2UgPSAwOworCQkJZ2V0X2ZldGNoX21hcChyZW1vdGVfcmVmcywgJnJlZnNwZWMsICZ0YWlsLCAwKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFVzZSB0aGUgZGVmYXVsdHMgKi8KKwkJc3RydWN0IHJlbW90ZSAqcmVtb3RlID0gdHJhbnNwb3J0LT5yZW1vdGU7CisJCXN0cnVjdCBicmFuY2ggKmJyYW5jaCA9IGJyYW5jaF9nZXQoTlVMTCk7CisJCWludCBoYXNfbWVyZ2UgPSBicmFuY2hfaGFzX21lcmdlX2NvbmZpZyhicmFuY2gpOworCQlpZiAocmVtb3RlICYmIChyZW1vdGUtPmZldGNoX3JlZnNwZWNfbnIgfHwgaGFzX21lcmdlKSkgeworCQkJZm9yIChpID0gMDsgaSA8IHJlbW90ZS0+ZmV0Y2hfcmVmc3BlY19ucjsgaSsrKSB7CisJCQkJZ2V0X2ZldGNoX21hcChyZW1vdGVfcmVmcywgJnJlbW90ZS0+ZmV0Y2hbaV0sICZ0YWlsLCAwKTsKKwkJCQlpZiAocmVtb3RlLT5mZXRjaFtpXS5kc3QgJiYKKwkJCQkgICAgcmVtb3RlLT5mZXRjaFtpXS5kc3RbMF0pCisJCQkJCSphdXRvdGFncyA9IDE7CisJCQkJaWYgKCFpICYmICFoYXNfbWVyZ2UgJiYgcmVmX21hcCAmJgorCQkJCSAgICAhcmVtb3RlLT5mZXRjaFswXS5wYXR0ZXJuKQorCQkJCQlyZWZfbWFwLT5tZXJnZSA9IDE7CisJCQl9CisJCQkvKgorCQkJICogaWYgdGhlIHJlbW90ZSB3ZSdyZSBmZXRjaGluZyBmcm9tIGlzIHRoZSBzYW1lCisJCQkgKiBhcyBnaXZlbiBpbiBicmFuY2guPG5hbWU+LnJlbW90ZSwgd2UgYWRkIHRoZQorCQkJICogcmVmIGdpdmVuIGluIGJyYW5jaC48bmFtZT4ubWVyZ2UsIHRvby4KKwkJCSAqLworCQkJaWYgKGhhc19tZXJnZSAmJgorCQkJICAgICFzdHJjbXAoYnJhbmNoLT5yZW1vdGVfbmFtZSwgcmVtb3RlLT5uYW1lKSkKKwkJCQlhZGRfbWVyZ2VfY29uZmlnKCZyZWZfbWFwLCByZW1vdGVfcmVmcywgYnJhbmNoLCAmdGFpbCk7CisJCX0gZWxzZSB7CisJCQlyZWZfbWFwID0gZ2V0X3JlbW90ZV9yZWYocmVtb3RlX3JlZnMsICJIRUFEIik7CisJCQlpZiAoIXJlZl9tYXApCisJCQkJZGllKCJDb3VsZG4ndCBmaW5kIHJlbW90ZSByZWYgSEVBRCIpOworCQkJcmVmX21hcC0+bWVyZ2UgPSAxOworCQkJdGFpbCA9ICZyZWZfbWFwLT5uZXh0OworCQl9CisJfQorCWlmICh0YWdzID09IFRBR1NfREVGQVVMVCAmJiAqYXV0b3RhZ3MpCisJCWZpbmRfbm9uX2xvY2FsX3RhZ3ModHJhbnNwb3J0LCAmcmVmX21hcCwgJnRhaWwpOworCXJlZl9yZW1vdmVfZHVwbGljYXRlcyhyZWZfbWFwKTsKKworCXJldHVybiByZWZfbWFwOworfQorCitzdGF0aWMgaW50IHNfdXBkYXRlX3JlZihjb25zdCBjaGFyICphY3Rpb24sCisJCQlzdHJ1Y3QgcmVmICpyZWYsCisJCQlpbnQgY2hlY2tfb2xkKQoreworCWNoYXIgbXNnWzEwMjRdOworCWNoYXIgKnJsYSA9IGdldGVudigiR0lUX1JFRkxPR19BQ1RJT04iKTsKKwlzdGF0aWMgc3RydWN0IHJlZl9sb2NrICpsb2NrOworCisJaWYgKCFybGEpCisJCXJsYSA9IGRlZmF1bHRfcmxhLmJ1ZjsKKwlzbnByaW50Zihtc2csIHNpemVvZihtc2cpLCAiJXM6ICVzIiwgcmxhLCBhY3Rpb24pOworCWxvY2sgPSBsb2NrX2FueV9yZWZfZm9yX3VwZGF0ZShyZWYtPm5hbWUsCisJCQkJICAgICAgIGNoZWNrX29sZCA/IHJlZi0+b2xkX3NoYTEgOiBOVUxMLCAwKTsKKwlpZiAoIWxvY2spCisJCXJldHVybiAxOworCWlmICh3cml0ZV9yZWZfc2hhMShsb2NrLCByZWYtPm5ld19zaGExLCBtc2cpIDwgMCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgU1VNTUFSWV9XSURUSCAoMiAqIERFRkFVTFRfQUJCUkVWICsgMykKKyNkZWZpbmUgUkVGQ09MX1dJRFRIICAxMAorCitzdGF0aWMgaW50IHVwZGF0ZV9sb2NhbF9yZWYoc3RydWN0IHJlZiAqcmVmLAorCQkJICAgIGNvbnN0IGNoYXIgKnJlbW90ZSwKKwkJCSAgICBpbnQgdmVyYm9zZSwKKwkJCSAgICBjaGFyICpkaXNwbGF5KQoreworCXN0cnVjdCBjb21taXQgKmN1cnJlbnQgPSBOVUxMLCAqdXBkYXRlZDsKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJc3RydWN0IGJyYW5jaCAqY3VycmVudF9icmFuY2ggPSBicmFuY2hfZ2V0KE5VTEwpOworCWNvbnN0IGNoYXIgKnByZXR0eV9yZWYgPSByZWYtPm5hbWUgKyAoCisJCSFwcmVmaXhjbXAocmVmLT5uYW1lLCAicmVmcy9oZWFkcy8iKSA/IDExIDoKKwkJIXByZWZpeGNtcChyZWYtPm5hbWUsICJyZWZzL3RhZ3MvIikgPyAxMCA6CisJCSFwcmVmaXhjbXAocmVmLT5uYW1lLCAicmVmcy9yZW1vdGVzLyIpID8gMTMgOgorCQkwKTsKKworCSpkaXNwbGF5ID0gMDsKKwl0eXBlID0gc2hhMV9vYmplY3RfaW5mbyhyZWYtPm5ld19zaGExLCBOVUxMKTsKKwlpZiAodHlwZSA8IDApCisJCWRpZSgib2JqZWN0ICVzIG5vdCBmb3VuZCIsIHNoYTFfdG9faGV4KHJlZi0+bmV3X3NoYTEpKTsKKworCWlmICghKnJlZi0+bmFtZSkgeworCQkvKiBOb3Qgc3RvcmluZyAqLworCQlpZiAodmVyYm9zZSkKKwkJCXNwcmludGYoZGlzcGxheSwgIiogYnJhbmNoICVzIC0+IEZFVENIX0hFQUQiLCByZW1vdGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWhhc2hjbXAocmVmLT5vbGRfc2hhMSwgcmVmLT5uZXdfc2hhMSkpIHsKKwkJaWYgKHZlcmJvc2UpCisJCQlzcHJpbnRmKGRpc3BsYXksICI9ICUtKnMgJS0qcyAtPiAlcyIsIFNVTU1BUllfV0lEVEgsCisJCQkJIlt1cCB0byBkYXRlXSIsIFJFRkNPTF9XSURUSCwgcmVtb3RlLAorCQkJCXByZXR0eV9yZWYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoY3VycmVudF9icmFuY2ggJiYKKwkgICAgIXN0cmNtcChyZWYtPm5hbWUsIGN1cnJlbnRfYnJhbmNoLT5uYW1lKSAmJgorCSAgICAhKHVwZGF0ZV9oZWFkX29rIHx8IGlzX2JhcmVfcmVwb3NpdG9yeSgpKSAmJgorCSAgICAhaXNfbnVsbF9zaGExKHJlZi0+b2xkX3NoYTEpKSB7CisJCS8qCisJCSAqIElmIHRoaXMgaXMgdGhlIGhlYWQsIGFuZCBpdCdzIG5vdCBva2F5IHRvIHVwZGF0ZQorCQkgKiB0aGUgaGVhZCwgYW5kIHRoZSBvbGQgdmFsdWUgb2YgdGhlIGhlYWQgaXNuJ3QgZW1wdHkuLi4KKwkJICovCisJCXNwcmludGYoZGlzcGxheSwgIiEgJS0qcyAlLSpzIC0+ICVzICAoY2FuJ3QgZmV0Y2ggaW4gY3VycmVudCBicmFuY2gpIiwKKwkJCVNVTU1BUllfV0lEVEgsICJbcmVqZWN0ZWRdIiwgUkVGQ09MX1dJRFRILCByZW1vdGUsCisJCQlwcmV0dHlfcmVmKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCFpc19udWxsX3NoYTEocmVmLT5vbGRfc2hhMSkgJiYKKwkgICAgIXByZWZpeGNtcChyZWYtPm5hbWUsICJyZWZzL3RhZ3MvIikpIHsKKwkJc3ByaW50ZihkaXNwbGF5LCAiLSAlLSpzICUtKnMgLT4gJXMiLAorCQkJU1VNTUFSWV9XSURUSCwgIlt0YWcgdXBkYXRlXSIsIFJFRkNPTF9XSURUSCwgcmVtb3RlLAorCQkJcHJldHR5X3JlZik7CisJCXJldHVybiBzX3VwZGF0ZV9yZWYoInVwZGF0aW5nIHRhZyIsIHJlZiwgMCk7CisJfQorCisJY3VycmVudCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlX2dlbnRseShyZWYtPm9sZF9zaGExLCAxKTsKKwl1cGRhdGVkID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2VfZ2VudGx5KHJlZi0+bmV3X3NoYTEsIDEpOworCWlmICghY3VycmVudCB8fCAhdXBkYXRlZCkgeworCQljb25zdCBjaGFyICptc2c7CisJCWNvbnN0IGNoYXIgKndoYXQ7CisJCWlmICghc3RybmNtcChyZWYtPm5hbWUsICJyZWZzL3RhZ3MvIiwgMTApKSB7CisJCQltc2cgPSAic3RvcmluZyB0YWciOworCQkJd2hhdCA9ICJbbmV3IHRhZ10iOworCQl9CisJCWVsc2UgeworCQkJbXNnID0gInN0b3JpbmcgaGVhZCI7CisJCQl3aGF0ID0gIltuZXcgYnJhbmNoXSI7CisJCX0KKworCQlzcHJpbnRmKGRpc3BsYXksICIqICUtKnMgJS0qcyAtPiAlcyIsIFNVTU1BUllfV0lEVEgsIHdoYXQsCisJCQlSRUZDT0xfV0lEVEgsIHJlbW90ZSwgcHJldHR5X3JlZik7CisJCXJldHVybiBzX3VwZGF0ZV9yZWYobXNnLCByZWYsIDApOworCX0KKworCWlmIChpbl9tZXJnZV9iYXNlcyhjdXJyZW50LCAmdXBkYXRlZCwgMSkpIHsKKwkJY2hhciBxdWlja3JlZls4M107CisJCXN0cmNweShxdWlja3JlZiwgZmluZF91bmlxdWVfYWJicmV2KGN1cnJlbnQtPm9iamVjdC5zaGExLCBERUZBVUxUX0FCQlJFVikpOworCQlzdHJjYXQocXVpY2tyZWYsICIuLiIpOworCQlzdHJjYXQocXVpY2tyZWYsIGZpbmRfdW5pcXVlX2FiYnJldihyZWYtPm5ld19zaGExLCBERUZBVUxUX0FCQlJFVikpOworCQlzcHJpbnRmKGRpc3BsYXksICIgICUtKnMgJS0qcyAtPiAlcyIsIFNVTU1BUllfV0lEVEgsIHF1aWNrcmVmLAorCQkJUkVGQ09MX1dJRFRILCByZW1vdGUsIHByZXR0eV9yZWYpOworCQlyZXR1cm4gc191cGRhdGVfcmVmKCJmYXN0IGZvcndhcmQiLCByZWYsIDEpOworCX0gZWxzZSBpZiAoZm9yY2UgfHwgcmVmLT5mb3JjZSkgeworCQljaGFyIHF1aWNrcmVmWzg0XTsKKwkJc3RyY3B5KHF1aWNrcmVmLCBmaW5kX3VuaXF1ZV9hYmJyZXYoY3VycmVudC0+b2JqZWN0LnNoYTEsIERFRkFVTFRfQUJCUkVWKSk7CisJCXN0cmNhdChxdWlja3JlZiwgIi4uLiIpOworCQlzdHJjYXQocXVpY2tyZWYsIGZpbmRfdW5pcXVlX2FiYnJldihyZWYtPm5ld19zaGExLCBERUZBVUxUX0FCQlJFVikpOworCQlzcHJpbnRmKGRpc3BsYXksICIrICUtKnMgJS0qcyAtPiAlcyAgKGZvcmNlZCB1cGRhdGUpIiwKKwkJCVNVTU1BUllfV0lEVEgsIHF1aWNrcmVmLCBSRUZDT0xfV0lEVEgsIHJlbW90ZSwgcHJldHR5X3JlZik7CisJCXJldHVybiBzX3VwZGF0ZV9yZWYoImZvcmNlZC11cGRhdGUiLCByZWYsIDEpOworCX0gZWxzZSB7CisJCXNwcmludGYoZGlzcGxheSwgIiEgJS0qcyAlLSpzIC0+ICVzICAobm9uIGZhc3QgZm9yd2FyZCkiLAorCQkJU1VNTUFSWV9XSURUSCwgIltyZWplY3RlZF0iLCBSRUZDT0xfV0lEVEgsIHJlbW90ZSwKKwkJCXByZXR0eV9yZWYpOworCQlyZXR1cm4gMTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc3RvcmVfdXBkYXRlZF9yZWZzKGNvbnN0IGNoYXIgKnVybCwgc3RydWN0IHJlZiAqcmVmX21hcCkKK3sKKwlGSUxFICpmcDsKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisJaW50IHVybF9sZW4sIGksIG5vdGVfbGVuLCBzaG93bl91cmwgPSAwOworCWNoYXIgbm90ZVsxMDI0XTsKKwljb25zdCBjaGFyICp3aGF0LCAqa2luZDsKKwlzdHJ1Y3QgcmVmICpybTsKKwljaGFyICpmaWxlbmFtZSA9IGdpdF9wYXRoKCJGRVRDSF9IRUFEIik7CisKKwlmcCA9IGZvcGVuKGZpbGVuYW1lLCAiYSIpOworCWlmICghZnApCisJCXJldHVybiBlcnJvcigiY2Fubm90IG9wZW4gJXM6ICVzXG4iLCBmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwlmb3IgKHJtID0gcmVmX21hcDsgcm07IHJtID0gcm0tPm5leHQpIHsKKwkJc3RydWN0IHJlZiAqcmVmID0gTlVMTDsKKworCQlpZiAocm0tPnBlZXJfcmVmKSB7CisJCQlyZWYgPSB4Y2FsbG9jKDEsIHNpemVvZigqcmVmKSArIHN0cmxlbihybS0+cGVlcl9yZWYtPm5hbWUpICsgMSk7CisJCQlzdHJjcHkocmVmLT5uYW1lLCBybS0+cGVlcl9yZWYtPm5hbWUpOworCQkJaGFzaGNweShyZWYtPm9sZF9zaGExLCBybS0+cGVlcl9yZWYtPm9sZF9zaGExKTsKKwkJCWhhc2hjcHkocmVmLT5uZXdfc2hhMSwgcm0tPm9sZF9zaGExKTsKKwkJCXJlZi0+Zm9yY2UgPSBybS0+cGVlcl9yZWYtPmZvcmNlOworCQl9CisKKwkJY29tbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2VfZ2VudGx5KHJtLT5vbGRfc2hhMSwgMSk7CisJCWlmICghY29tbWl0KQorCQkJcm0tPm1lcmdlID0gMDsKKworCQlpZiAoIXN0cmNtcChybS0+bmFtZSwgIkhFQUQiKSkgeworCQkJa2luZCA9ICIiOworCQkJd2hhdCA9ICIiOworCQl9CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAocm0tPm5hbWUsICJyZWZzL2hlYWRzLyIpKSB7CisJCQlraW5kID0gImJyYW5jaCI7CisJCQl3aGF0ID0gcm0tPm5hbWUgKyAxMTsKKwkJfQorCQllbHNlIGlmICghcHJlZml4Y21wKHJtLT5uYW1lLCAicmVmcy90YWdzLyIpKSB7CisJCQlraW5kID0gInRhZyI7CisJCQl3aGF0ID0gcm0tPm5hbWUgKyAxMDsKKwkJfQorCQllbHNlIGlmICghcHJlZml4Y21wKHJtLT5uYW1lLCAicmVmcy9yZW1vdGVzLyIpKSB7CisJCQlraW5kID0gInJlbW90ZSBicmFuY2giOworCQkJd2hhdCA9IHJtLT5uYW1lICsgMTM7CisJCX0KKwkJZWxzZSB7CisJCQlraW5kID0gIiI7CisJCQl3aGF0ID0gcm0tPm5hbWU7CisJCX0KKworCQl1cmxfbGVuID0gc3RybGVuKHVybCk7CisJCWZvciAoaSA9IHVybF9sZW4gLSAxOyB1cmxbaV0gPT0gJy8nICYmIDAgPD0gaTsgaS0tKQorCQkJOworCQl1cmxfbGVuID0gaSArIDE7CisJCWlmICg0IDwgaSAmJiAhc3RybmNtcCgiLmdpdCIsIHVybCArIGkgLSAzLCA0KSkKKwkJCXVybF9sZW4gPSBpIC0gMzsKKworCQlub3RlX2xlbiA9IDA7CisJCWlmICgqd2hhdCkgeworCQkJaWYgKCpraW5kKQorCQkJCW5vdGVfbGVuICs9IHNwcmludGYobm90ZSArIG5vdGVfbGVuLCAiJXMgIiwKKwkJCQkJCSAgICBraW5kKTsKKwkJCW5vdGVfbGVuICs9IHNwcmludGYobm90ZSArIG5vdGVfbGVuLCAiJyVzJyBvZiAiLCB3aGF0KTsKKwkJfQorCQlub3RlX2xlbiArPSBzcHJpbnRmKG5vdGUgKyBub3RlX2xlbiwgIiUuKnMiLCB1cmxfbGVuLCB1cmwpOworCQlmcHJpbnRmKGZwLCAiJXNcdCVzXHQlc1xuIiwKKwkJCXNoYTFfdG9faGV4KGNvbW1pdCA/IGNvbW1pdC0+b2JqZWN0LnNoYTEgOgorCQkJCSAgICBybS0+b2xkX3NoYTEpLAorCQkJcm0tPm1lcmdlID8gIiIgOiAibm90LWZvci1tZXJnZSIsCisJCQlub3RlKTsKKworCQlpZiAocmVmKSB7CisJCQl1cGRhdGVfbG9jYWxfcmVmKHJlZiwgd2hhdCwgdmVyYm9zZSwgbm90ZSk7CisJCQlpZiAoKm5vdGUpIHsKKwkJCQlpZiAoIXNob3duX3VybCkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIkZyb20gJS4qc1xuIiwKKwkJCQkJCQl1cmxfbGVuLCB1cmwpOworCQkJCQlzaG93bl91cmwgPSAxOworCQkJCX0KKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiAlc1xuIiwgbm90ZSk7CisJCQl9CisJCX0KKwl9CisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdlIHdvdWxkIHdhbnQgdG8gYnlwYXNzIHRoZSBvYmplY3QgdHJhbnNmZXIgYWx0b2dldGhlciBpZgorICogZXZlcnl0aGluZyB3ZSBhcmUgZ29pbmcgdG8gZmV0Y2ggYWxyZWFkeSBleGlzdHMgYW5kIGNvbm5lY3RlZAorICogbG9jYWxseS4KKyAqCisgKiBUaGUgcmVmcyB3ZSBhcmUgZ29pbmcgdG8gZmV0Y2ggYXJlIGluIHRvX2ZldGNoIChucl9oZWFkcyBpbgorICogdG90YWwpLiAgSWYgcnVubmluZworICoKKyAqICAkIGdpdC1yZXYtbGlzdCAtLW9iamVjdHMgdG9fZmV0Y2hbMF0gdG9fZmV0Y2hbMV0gLi4uIC0tbm90IC0tYWxsCisgKgorICogZG9lcyBub3QgZXJyb3Igb3V0LCB0aGF0IG1lYW5zIGV2ZXJ5dGhpbmcgcmVhY2hhYmxlIGZyb20gdGhlCisgKiByZWZzIHdlIGFyZSBnb2luZyB0byBmZXRjaCBleGlzdHMgYW5kIGlzIGNvbm5lY3RlZCB0byBzb21lIG9mCisgKiBvdXIgZXhpc3RpbmcgcmVmcy4KKyAqLworc3RhdGljIGludCBxdWlja2ZldGNoKHN0cnVjdCByZWYgKnJlZl9tYXApCit7CisJc3RydWN0IGNoaWxkX3Byb2Nlc3MgcmV2bGlzdDsKKwlzdHJ1Y3QgcmVmICpyZWY7CisJY2hhciAqKmFyZ3Y7CisJaW50IGksIGVycjsKKworCS8qCisJICogSWYgd2UgYXJlIGRlZXBlbmluZyBhIHNoYWxsb3cgY2xvbmUgd2UgYWxyZWFkeSBoYXZlIHRoZXNlCisJICogb2JqZWN0cyByZWFjaGFibGUuICBSdW5uaW5nIHJldi1saXN0IGhlcmUgd2lsbCByZXR1cm4gd2l0aAorCSAqIGEgZ29vZCAoMCkgZXhpdCBzdGF0dXMgYW5kIHdlJ2xsIGJ5cGFzcyB0aGUgZmV0Y2ggdGhhdCB3ZQorCSAqIHJlYWxseSBuZWVkIHRvIHBlcmZvcm0uICBDbGFpbWluZyBmYWlsdXJlIG5vdyB3aWxsIGVuc3VyZQorCSAqIHdlIHBlcmZvcm0gdGhlIG5ldHdvcmsgZXhjaGFuZ2UgdG8gZGVlcGVuIG91ciBoaXN0b3J5LgorCSAqLworCWlmIChkZXB0aCkKKwkJcmV0dXJuIC0xOworCisJZm9yIChpID0gMCwgcmVmID0gcmVmX21hcDsgcmVmOyByZWYgPSByZWYtPm5leHQpCisJCWkrKzsKKwlpZiAoIWkpCisJCXJldHVybiAwOworCisJYXJndiA9IHhtYWxsb2Moc2l6ZW9mKCphcmd2KSAqIChpICsgNikpOworCWkgPSAwOworCWFyZ3ZbaSsrXSA9IHhzdHJkdXAoInJldi1saXN0Iik7CisJYXJndltpKytdID0geHN0cmR1cCgiLS1xdWlldCIpOworCWFyZ3ZbaSsrXSA9IHhzdHJkdXAoIi0tb2JqZWN0cyIpOworCWZvciAocmVmID0gcmVmX21hcDsgcmVmOyByZWYgPSByZWYtPm5leHQpCisJCWFyZ3ZbaSsrXSA9IHhzdHJkdXAoc2hhMV90b19oZXgocmVmLT5vbGRfc2hhMSkpOworCWFyZ3ZbaSsrXSA9IHhzdHJkdXAoIi0tbm90Iik7CisJYXJndltpKytdID0geHN0cmR1cCgiLS1hbGwiKTsKKwlhcmd2W2krK10gPSBOVUxMOworCisJbWVtc2V0KCZyZXZsaXN0LCAwLCBzaXplb2YocmV2bGlzdCkpOworCXJldmxpc3QuYXJndiA9IChjb25zdCBjaGFyKiopYXJndjsKKwlyZXZsaXN0LmdpdF9jbWQgPSAxOworCXJldmxpc3Qubm9fc3RkaW4gPSAxOworCXJldmxpc3Qubm9fc3Rkb3V0ID0gMTsKKwlyZXZsaXN0Lm5vX3N0ZGVyciA9IDE7CisJZXJyID0gcnVuX2NvbW1hbmQoJnJldmxpc3QpOworCisJZm9yIChpID0gMDsgYXJndltpXTsgaSsrKQorCQlmcmVlKGFyZ3ZbaV0pOworCWZyZWUoYXJndik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBmZXRjaF9yZWZzKHN0cnVjdCB0cmFuc3BvcnQgKnRyYW5zcG9ydCwgc3RydWN0IHJlZiAqcmVmX21hcCkKK3sKKwlpbnQgcmV0ID0gcXVpY2tmZXRjaChyZWZfbWFwKTsKKwlpZiAocmV0KQorCQlyZXQgPSB0cmFuc3BvcnRfZmV0Y2hfcmVmcyh0cmFuc3BvcnQsIHJlZl9tYXApOworCWlmICghcmV0KQorCQlyZXQgfD0gc3RvcmVfdXBkYXRlZF9yZWZzKHRyYW5zcG9ydC0+dXJsLCByZWZfbWFwKTsKKwl0cmFuc3BvcnRfdW5sb2NrX3BhY2sodHJhbnNwb3J0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZF9leGlzdGluZyhjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkJaW50IGZsYWcsIHZvaWQgKmNiZGF0YSkKK3sKKwlzdHJ1Y3QgcGF0aF9saXN0ICpsaXN0ID0gKHN0cnVjdCBwYXRoX2xpc3QgKiljYmRhdGE7CisJcGF0aF9saXN0X2luc2VydChyZWZuYW1lLCBsaXN0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3aWxsX2ZldGNoKHN0cnVjdCByZWYgKipoZWFkLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCByZWYgKnJtID0gKmhlYWQ7CisJd2hpbGUgKHJtKSB7CisJCWlmICghaGFzaGNtcChybS0+b2xkX3NoYTEsIHNoYTEpKQorCQkJcmV0dXJuIDE7CisJCXJtID0gcm0tPm5leHQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmaW5kX25vbl9sb2NhbF90YWdzKHN0cnVjdCB0cmFuc3BvcnQgKnRyYW5zcG9ydCwKKwkJCXN0cnVjdCByZWYgKipoZWFkLAorCQkJc3RydWN0IHJlZiAqKip0YWlsKQoreworCXN0cnVjdCBwYXRoX2xpc3QgZXhpc3RpbmdfcmVmcyA9IHsgTlVMTCwgMCwgMCwgMCB9OworCXN0cnVjdCBwYXRoX2xpc3QgbmV3X3JlZnMgPSB7IE5VTEwsIDAsIDAsIDEgfTsKKwljaGFyICpyZWZfbmFtZTsKKwlpbnQgcmVmX25hbWVfbGVuOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlZl9zaGExOworCWNvbnN0IHN0cnVjdCByZWYgKnRhZ19yZWY7CisJc3RydWN0IHJlZiAqcm0gPSBOVUxMOworCWNvbnN0IHN0cnVjdCByZWYgKnJlZjsKKworCWZvcl9lYWNoX3JlZihhZGRfZXhpc3RpbmcsICZleGlzdGluZ19yZWZzKTsKKwlmb3IgKHJlZiA9IHRyYW5zcG9ydF9nZXRfcmVtb3RlX3JlZnModHJhbnNwb3J0KTsgcmVmOyByZWYgPSByZWYtPm5leHQpIHsKKwkJaWYgKHByZWZpeGNtcChyZWYtPm5hbWUsICJyZWZzL3RhZ3MiKSkKKwkJCWNvbnRpbnVlOworCisJCXJlZl9uYW1lID0geHN0cmR1cChyZWYtPm5hbWUpOworCQlyZWZfbmFtZV9sZW4gPSBzdHJsZW4ocmVmX25hbWUpOworCQlyZWZfc2hhMSA9IHJlZi0+b2xkX3NoYTE7CisKKwkJaWYgKCFzdHJjbXAocmVmX25hbWUgKyByZWZfbmFtZV9sZW4gLSAzLCAiXnt9IikpIHsKKwkJCXJlZl9uYW1lW3JlZl9uYW1lX2xlbiAtIDNdID0gMDsKKwkJCXRhZ19yZWYgPSB0cmFuc3BvcnRfZ2V0X3JlbW90ZV9yZWZzKHRyYW5zcG9ydCk7CisJCQl3aGlsZSAodGFnX3JlZikgeworCQkJCWlmICghc3RyY21wKHRhZ19yZWYtPm5hbWUsIHJlZl9uYW1lKSkgeworCQkJCQlyZWZfc2hhMSA9IHRhZ19yZWYtPm9sZF9zaGExOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJdGFnX3JlZiA9IHRhZ19yZWYtPm5leHQ7CisJCQl9CisJCX0KKworCQlpZiAoIXBhdGhfbGlzdF9oYXNfcGF0aCgmZXhpc3RpbmdfcmVmcywgcmVmX25hbWUpICYmCisJCSAgICAhcGF0aF9saXN0X2hhc19wYXRoKCZuZXdfcmVmcywgcmVmX25hbWUpICYmCisJCSAgICAoaGFzX3NoYTFfZmlsZShyZWYtPm9sZF9zaGExKSB8fAorCQkgICAgIHdpbGxfZmV0Y2goaGVhZCwgcmVmLT5vbGRfc2hhMSkpKSB7CisJCQlwYXRoX2xpc3RfaW5zZXJ0KHJlZl9uYW1lLCAmbmV3X3JlZnMpOworCisJCQlybSA9IGFsbG9jX3JlZihzdHJsZW4ocmVmX25hbWUpICsgMSk7CisJCQlzdHJjcHkocm0tPm5hbWUsIHJlZl9uYW1lKTsKKwkJCXJtLT5wZWVyX3JlZiA9IGFsbG9jX3JlZihzdHJsZW4ocmVmX25hbWUpICsgMSk7CisJCQlzdHJjcHkocm0tPnBlZXJfcmVmLT5uYW1lLCByZWZfbmFtZSk7CisJCQloYXNoY3B5KHJtLT5vbGRfc2hhMSwgcmVmX3NoYTEpOworCisJCQkqKnRhaWwgPSBybTsKKwkJCSp0YWlsID0gJnJtLT5uZXh0OworCQl9CisJCWZyZWUocmVmX25hbWUpOworCX0KKwlwYXRoX2xpc3RfY2xlYXIoJmV4aXN0aW5nX3JlZnMsIDApOworCXBhdGhfbGlzdF9jbGVhcigmbmV3X3JlZnMsIDApOworfQorCitzdGF0aWMgaW50IGRvX2ZldGNoKHN0cnVjdCB0cmFuc3BvcnQgKnRyYW5zcG9ydCwKKwkJICAgIHN0cnVjdCByZWZzcGVjICpyZWZzLCBpbnQgcmVmX2NvdW50KQoreworCXN0cnVjdCByZWYgKnJlZl9tYXA7CisJc3RydWN0IHJlZiAqcm07CisJaW50IGF1dG90YWdzID0gKHRyYW5zcG9ydC0+cmVtb3RlLT5mZXRjaF90YWdzID09IDEpOworCWlmICh0cmFuc3BvcnQtPnJlbW90ZS0+ZmV0Y2hfdGFncyA9PSAyICYmIHRhZ3MgIT0gVEFHU19VTlNFVCkKKwkJdGFncyA9IFRBR1NfU0VUOworCWlmICh0cmFuc3BvcnQtPnJlbW90ZS0+ZmV0Y2hfdGFncyA9PSAtMSkKKwkJdGFncyA9IFRBR1NfVU5TRVQ7CisKKwlpZiAoIXRyYW5zcG9ydC0+Z2V0X3JlZnNfbGlzdCB8fCAhdHJhbnNwb3J0LT5mZXRjaCkKKwkJZGllKCJEb24ndCBrbm93IGhvdyB0byBmZXRjaCBmcm9tICVzIiwgdHJhbnNwb3J0LT51cmwpOworCisJLyogaWYgbm90IGFwcGVuZGluZywgdHJ1bmNhdGUgRkVUQ0hfSEVBRCAqLworCWlmICghYXBwZW5kKSB7CisJCWNoYXIgKmZpbGVuYW1lID0gZ2l0X3BhdGgoIkZFVENIX0hFQUQiKTsKKwkJRklMRSAqZnAgPSBmb3BlbihmaWxlbmFtZSwgInciKTsKKwkJaWYgKCFmcCkKKwkJCXJldHVybiBlcnJvcigiY2Fubm90IG9wZW4gJXM6ICVzXG4iLCBmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZmNsb3NlKGZwKTsKKwl9CisKKwlyZWZfbWFwID0gZ2V0X3JlZl9tYXAodHJhbnNwb3J0LCByZWZzLCByZWZfY291bnQsIHRhZ3MsICZhdXRvdGFncyk7CisKKwlmb3IgKHJtID0gcmVmX21hcDsgcm07IHJtID0gcm0tPm5leHQpIHsKKwkJaWYgKHJtLT5wZWVyX3JlZikKKwkJCXJlYWRfcmVmKHJtLT5wZWVyX3JlZi0+bmFtZSwgcm0tPnBlZXJfcmVmLT5vbGRfc2hhMSk7CisJfQorCisJaWYgKHRhZ3MgPT0gVEFHU19ERUZBVUxUICYmIGF1dG90YWdzKQorCQl0cmFuc3BvcnRfc2V0X29wdGlvbih0cmFuc3BvcnQsIFRSQU5TX09QVF9GT0xMT1dUQUdTLCAiMSIpOworCWlmIChmZXRjaF9yZWZzKHRyYW5zcG9ydCwgcmVmX21hcCkpIHsKKwkJZnJlZV9yZWZzKHJlZl9tYXApOworCQlyZXR1cm4gMTsKKwl9CisJZnJlZV9yZWZzKHJlZl9tYXApOworCisJLyogaWYgbmVpdGhlciAtLW5vLXRhZ3Mgbm9yIC0tdGFncyB3YXMgc3BlY2lmaWVkLCBkbyBhdXRvbWF0ZWQgdGFnCisJICogZm9sbG93aW5nIC4uLiAqLworCWlmICh0YWdzID09IFRBR1NfREVGQVVMVCAmJiBhdXRvdGFncykgeworCQlzdHJ1Y3QgcmVmICoqdGFpbCA9ICZyZWZfbWFwOworCQlyZWZfbWFwID0gTlVMTDsKKwkJZmluZF9ub25fbG9jYWxfdGFncyh0cmFuc3BvcnQsICZyZWZfbWFwLCAmdGFpbCk7CisJCWlmIChyZWZfbWFwKSB7CisJCQl0cmFuc3BvcnRfc2V0X29wdGlvbih0cmFuc3BvcnQsIFRSQU5TX09QVF9GT0xMT1dUQUdTLCBOVUxMKTsKKwkJCXRyYW5zcG9ydF9zZXRfb3B0aW9uKHRyYW5zcG9ydCwgVFJBTlNfT1BUX0RFUFRILCAiMCIpOworCQkJZmV0Y2hfcmVmcyh0cmFuc3BvcnQsIHJlZl9tYXApOworCQl9CisJCWZyZWVfcmVmcyhyZWZfbWFwKTsKKwl9CisKKwl0cmFuc3BvcnRfZGlzY29ubmVjdCh0cmFuc3BvcnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9vcHRpb24oY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaW50IHIgPSB0cmFuc3BvcnRfc2V0X29wdGlvbih0cmFuc3BvcnQsIG5hbWUsIHZhbHVlKTsKKwlpZiAociA8IDApCisJCWRpZSgiT3B0aW9uIFwiJXNcIiB2YWx1ZSBcIiVzXCIgaXMgbm90IHZhbGlkIGZvciAlc1xuIiwKKwkJCW5hbWUsIHZhbHVlLCB0cmFuc3BvcnQtPnVybCk7CisJaWYgKHIgPiAwKQorCQl3YXJuaW5nKCJPcHRpb24gXCIlc1wiIGlzIGlnbm9yZWQgZm9yICVzXG4iLAorCQkJbmFtZSwgdHJhbnNwb3J0LT51cmwpOworfQorCitpbnQgY21kX2ZldGNoKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXN0cnVjdCByZW1vdGUgKnJlbW90ZTsKKwlpbnQgaTsKKwlzdGF0aWMgY29uc3QgY2hhciAqKnJlZnMgPSBOVUxMOworCWludCByZWZfbnIgPSAwOworCisJLyogUmVjb3JkIHRoZSBjb21tYW5kIGxpbmUgZm9yIHRoZSByZWZsb2cgKi8KKwlzdHJidWZfYWRkc3RyKCZkZWZhdWx0X3JsYSwgImZldGNoIik7CisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKwkJc3RyYnVmX2FkZGYoJmRlZmF1bHRfcmxhLCAiICVzIiwgYXJndltpXSk7CisKKwlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LAorCQkJICAgICBidWlsdGluX2ZldGNoX29wdGlvbnMsIGJ1aWx0aW5fZmV0Y2hfdXNhZ2UsIDApOworCisJaWYgKGFyZ2MgPT0gMCkKKwkJcmVtb3RlID0gcmVtb3RlX2dldChOVUxMKTsKKwllbHNlCisJCXJlbW90ZSA9IHJlbW90ZV9nZXQoYXJndlswXSk7CisKKwl0cmFuc3BvcnQgPSB0cmFuc3BvcnRfZ2V0KHJlbW90ZSwgcmVtb3RlLT51cmxbMF0pOworCWlmICh2ZXJib3NlID49IDIpCisJCXRyYW5zcG9ydC0+dmVyYm9zZSA9IDE7CisJaWYgKHF1aWV0KQorCQl0cmFuc3BvcnQtPnZlcmJvc2UgPSAtMTsKKwlpZiAodXBsb2FkX3BhY2spCisJCXNldF9vcHRpb24oVFJBTlNfT1BUX1VQTE9BRFBBQ0ssIHVwbG9hZF9wYWNrKTsKKwlpZiAoa2VlcCkKKwkJc2V0X29wdGlvbihUUkFOU19PUFRfS0VFUCwgInllcyIpOworCWlmIChkZXB0aCkKKwkJc2V0X29wdGlvbihUUkFOU19PUFRfREVQVEgsIGRlcHRoKTsKKworCWlmICghdHJhbnNwb3J0LT51cmwpCisJCWRpZSgiV2hlcmUgZG8geW91IHdhbnQgdG8gZmV0Y2ggZnJvbSB0b2RheT8iKTsKKworCWlmIChhcmdjID4gMSkgeworCQlpbnQgaiA9IDA7CisJCXJlZnMgPSB4Y2FsbG9jKGFyZ2MgKyAxLCBzaXplb2YoY29uc3QgY2hhciAqKSk7CisJCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJCWlmICghc3RyY21wKGFyZ3ZbaV0sICJ0YWciKSkgeworCQkJCWNoYXIgKnJlZjsKKwkJCQlpKys7CisJCQkJaWYgKGkgPj0gYXJnYykKKwkJCQkJZGllKCJZb3UgbmVlZCB0byBzcGVjaWZ5IGEgdGFnIG5hbWUuIik7CisJCQkJcmVmID0geG1hbGxvYyhzdHJsZW4oYXJndltpXSkgKiAyICsgMjIpOworCQkJCXN0cmNweShyZWYsICJyZWZzL3RhZ3MvIik7CisJCQkJc3RyY2F0KHJlZiwgYXJndltpXSk7CisJCQkJc3RyY2F0KHJlZiwgIjpyZWZzL3RhZ3MvIik7CisJCQkJc3RyY2F0KHJlZiwgYXJndltpXSk7CisJCQkJcmVmc1tqKytdID0gcmVmOworCQkJfSBlbHNlCisJCQkJcmVmc1tqKytdID0gYXJndltpXTsKKwkJfQorCQlyZWZzW2pdID0gTlVMTDsKKwkJcmVmX25yID0gajsKKwl9CisKKwlzaWduYWwoU0lHSU5ULCB1bmxvY2tfcGFja19vbl9zaWduYWwpOworCWF0ZXhpdCh1bmxvY2tfcGFjayk7CisJcmV0dXJuIGRvX2ZldGNoKHRyYW5zcG9ydCwKKwkJCXBhcnNlX2ZldGNoX3JlZnNwZWMocmVmX25yLCByZWZzKSwgcmVmX25yKTsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tZm10LW1lcmdlLW1zZy5jIGIvYnVpbHRpbi1mbXQtbWVyZ2UtbXNnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJiM2YzNwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tZm10LW1lcmdlLW1zZy5jCkBAIC0wLDAgKzEsMzU1IEBACisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgInJldmlzaW9uLmgiCisjaW5jbHVkZSAidGFnLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICpmbXRfbWVyZ2VfbXNnX3VzYWdlID0KKwkiZ2l0LWZtdC1tZXJnZS1tc2cgWy0tc3VtbWFyeV0gWy0tbm8tc3VtbWFyeV0gWy0tZmlsZSA8ZmlsZT5dIjsKKworc3RhdGljIGludCBtZXJnZV9zdW1tYXJ5OworCitzdGF0aWMgaW50IGZtdF9tZXJnZV9tc2dfY29uZmlnKGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCFzdHJjbXAoIm1lcmdlLnN1bW1hcnkiLCBrZXkpKQorCQltZXJnZV9zdW1tYXJ5ID0gZ2l0X2NvbmZpZ19ib29sKGtleSwgdmFsdWUpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbGlzdCB7CisJY2hhciAqKmxpc3Q7CisJdm9pZCAqKnBheWxvYWQ7CisJdW5zaWduZWQgbnIsIGFsbG9jOworfTsKKworc3RhdGljIHZvaWQgYXBwZW5kX3RvX2xpc3Qoc3RydWN0IGxpc3QgKmxpc3QsIGNoYXIgKnZhbHVlLCB2b2lkICpwYXlsb2FkKQoreworCWlmIChsaXN0LT5uciA9PSBsaXN0LT5hbGxvYykgeworCQlsaXN0LT5hbGxvYyArPSAzMjsKKwkJbGlzdC0+bGlzdCA9IHhyZWFsbG9jKGxpc3QtPmxpc3QsIHNpemVvZihjaGFyICopICogbGlzdC0+YWxsb2MpOworCQlsaXN0LT5wYXlsb2FkID0geHJlYWxsb2MobGlzdC0+cGF5bG9hZCwKKwkJCQlzaXplb2YoY2hhciAqKSAqIGxpc3QtPmFsbG9jKTsKKwl9CisJbGlzdC0+cGF5bG9hZFtsaXN0LT5ucl0gPSBwYXlsb2FkOworCWxpc3QtPmxpc3RbbGlzdC0+bnIrK10gPSB2YWx1ZTsKK30KKworc3RhdGljIGludCBmaW5kX2luX2xpc3Qoc3RydWN0IGxpc3QgKmxpc3QsIGNoYXIgKnZhbHVlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxpc3QtPm5yOyBpKyspCisJCWlmICghc3RyY21wKGxpc3QtPmxpc3RbaV0sIHZhbHVlKSkKKwkJCXJldHVybiBpOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2xpc3Qoc3RydWN0IGxpc3QgKmxpc3QpCit7CisJaW50IGk7CisKKwlpZiAobGlzdC0+YWxsb2MgPT0gMCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IGxpc3QtPm5yOyBpKyspIHsKKwkJZnJlZShsaXN0LT5saXN0W2ldKTsKKwkJZnJlZShsaXN0LT5wYXlsb2FkW2ldKTsKKwl9CisJZnJlZShsaXN0LT5saXN0KTsKKwlmcmVlKGxpc3QtPnBheWxvYWQpOworCWxpc3QtPm5yID0gbGlzdC0+YWxsb2MgPSAwOworfQorCitzdHJ1Y3Qgc3JjX2RhdGEgeworCXN0cnVjdCBsaXN0IGJyYW5jaCwgdGFnLCByX2JyYW5jaCwgZ2VuZXJpYzsKKwlpbnQgaGVhZF9zdGF0dXM7Cit9OworCitzdGF0aWMgc3RydWN0IGxpc3Qgc3JjcyA9IHsgTlVMTCwgTlVMTCwgMCwgMH07CitzdGF0aWMgc3RydWN0IGxpc3Qgb3JpZ2lucyA9IHsgTlVMTCwgTlVMTCwgMCwgMH07CisKK3N0YXRpYyBpbnQgaGFuZGxlX2xpbmUoY2hhciAqbGluZSkKK3sKKwlpbnQgaSwgbGVuID0gc3RybGVuKGxpbmUpOworCXVuc2lnbmVkIGNoYXIgKnNoYTE7CisJY2hhciAqc3JjLCAqb3JpZ2luOworCXN0cnVjdCBzcmNfZGF0YSAqc3JjX2RhdGE7CisJaW50IHB1bGxpbmdfaGVhZCA9IDA7CisKKwlpZiAobGVuIDwgNDMgfHwgbGluZVs0MF0gIT0gJ1x0JykKKwkJcmV0dXJuIDE7CisKKwlpZiAoIXByZWZpeGNtcChsaW5lICsgNDEsICJub3QtZm9yLW1lcmdlIikpCisJCXJldHVybiAwOworCisJaWYgKGxpbmVbNDFdICE9ICdcdCcpCisJCXJldHVybiAyOworCisJbGluZVs0MF0gPSAwOworCXNoYTEgPSB4bWFsbG9jKDIwKTsKKwlpID0gZ2V0X3NoYTEobGluZSwgc2hhMSk7CisJbGluZVs0MF0gPSAnXHQnOworCWlmIChpKQorCQlyZXR1cm4gMzsKKworCWlmIChsaW5lW2xlbiAtIDFdID09ICdcbicpCisJCWxpbmVbbGVuIC0gMV0gPSAwOworCWxpbmUgKz0gNDI7CisKKwlzcmMgPSBzdHJzdHIobGluZSwgIiBvZiAiKTsKKwlpZiAoc3JjKSB7CisJCSpzcmMgPSAwOworCQlzcmMgKz0gNDsKKwkJcHVsbGluZ19oZWFkID0gMDsKKwl9IGVsc2UgeworCQlzcmMgPSBsaW5lOworCQlwdWxsaW5nX2hlYWQgPSAxOworCX0KKworCWkgPSBmaW5kX2luX2xpc3QoJnNyY3MsIHNyYyk7CisJaWYgKGkgPCAwKSB7CisJCWkgPSBzcmNzLm5yOworCQlhcHBlbmRfdG9fbGlzdCgmc3JjcywgeHN0cmR1cChzcmMpLAorCQkJCXhjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzcmNfZGF0YSkpKTsKKwl9CisJc3JjX2RhdGEgPSBzcmNzLnBheWxvYWRbaV07CisKKwlpZiAocHVsbGluZ19oZWFkKSB7CisJCW9yaWdpbiA9IHhzdHJkdXAoc3JjKTsKKwkJc3JjX2RhdGEtPmhlYWRfc3RhdHVzIHw9IDE7CisJfSBlbHNlIGlmICghcHJlZml4Y21wKGxpbmUsICJicmFuY2ggIikpIHsKKwkJb3JpZ2luID0geHN0cmR1cChsaW5lICsgNyk7CisJCWFwcGVuZF90b19saXN0KCZzcmNfZGF0YS0+YnJhbmNoLCBvcmlnaW4sIE5VTEwpOworCQlzcmNfZGF0YS0+aGVhZF9zdGF0dXMgfD0gMjsKKwl9IGVsc2UgaWYgKCFwcmVmaXhjbXAobGluZSwgInRhZyAiKSkgeworCQlvcmlnaW4gPSBsaW5lOworCQlhcHBlbmRfdG9fbGlzdCgmc3JjX2RhdGEtPnRhZywgeHN0cmR1cChvcmlnaW4gKyA0KSwgTlVMTCk7CisJCXNyY19kYXRhLT5oZWFkX3N0YXR1cyB8PSAyOworCX0gZWxzZSBpZiAoIXByZWZpeGNtcChsaW5lLCAicmVtb3RlIGJyYW5jaCAiKSkgeworCQlvcmlnaW4gPSB4c3RyZHVwKGxpbmUgKyAxNCk7CisJCWFwcGVuZF90b19saXN0KCZzcmNfZGF0YS0+cl9icmFuY2gsIG9yaWdpbiwgTlVMTCk7CisJCXNyY19kYXRhLT5oZWFkX3N0YXR1cyB8PSAyOworCX0gZWxzZSB7CisJCW9yaWdpbiA9IHhzdHJkdXAoc3JjKTsKKwkJYXBwZW5kX3RvX2xpc3QoJnNyY19kYXRhLT5nZW5lcmljLCB4c3RyZHVwKGxpbmUpLCBOVUxMKTsKKwkJc3JjX2RhdGEtPmhlYWRfc3RhdHVzIHw9IDI7CisJfQorCisJaWYgKCFzdHJjbXAoIi4iLCBzcmMpIHx8ICFzdHJjbXAoc3JjLCBvcmlnaW4pKSB7CisJCWludCBsZW4gPSBzdHJsZW4ob3JpZ2luKTsKKwkJaWYgKG9yaWdpblswXSA9PSAnXCcnICYmIG9yaWdpbltsZW4gLSAxXSA9PSAnXCcnKSB7CisJCQlvcmlnaW4gPSB4bWVtZHVweihvcmlnaW4gKyAxLCBsZW4gLSAyKTsKKwkJfSBlbHNlIHsKKwkJCW9yaWdpbiA9IHhzdHJkdXAob3JpZ2luKTsKKwkJfQorCX0gZWxzZSB7CisJCWNoYXIgKm5ld19vcmlnaW4gPSB4bWFsbG9jKHN0cmxlbihvcmlnaW4pICsgc3RybGVuKHNyYykgKyA1KTsKKwkJc3ByaW50ZihuZXdfb3JpZ2luLCAiJXMgb2YgJXMiLCBvcmlnaW4sIHNyYyk7CisJCW9yaWdpbiA9IG5ld19vcmlnaW47CisJfQorCWFwcGVuZF90b19saXN0KCZvcmlnaW5zLCBvcmlnaW4sIHNoYTEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcmludF9qb2luZWQoY29uc3QgY2hhciAqc2luZ3VsYXIsIGNvbnN0IGNoYXIgKnBsdXJhbCwKKwkJc3RydWN0IGxpc3QgKmxpc3QpCit7CisJaWYgKGxpc3QtPm5yID09IDApCisJCXJldHVybjsKKwlpZiAobGlzdC0+bnIgPT0gMSkgeworCQlwcmludGYoIiVzJXMiLCBzaW5ndWxhciwgbGlzdC0+bGlzdFswXSk7CisJfSBlbHNlIHsKKwkJaW50IGk7CisJCXByaW50ZigiJXMiLCBwbHVyYWwpOworCQlmb3IgKGkgPSAwOyBpIDwgbGlzdC0+bnIgLSAxOyBpKyspCisJCQlwcmludGYoIiVzJXMiLCBpID4gMCA/ICIsICIgOiAiIiwgbGlzdC0+bGlzdFtpXSk7CisJCXByaW50ZigiIGFuZCAlcyIsIGxpc3QtPmxpc3RbbGlzdC0+bnIgLSAxXSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzaG9ydGxvZyhjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQlzdHJ1Y3QgY29tbWl0ICpoZWFkLCBzdHJ1Y3QgcmV2X2luZm8gKnJldiwgaW50IGxpbWl0KQoreworCWludCBpLCBjb3VudCA9IDA7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCXN0cnVjdCBvYmplY3QgKmJyYW5jaDsKKwlzdHJ1Y3QgbGlzdCBzdWJqZWN0cyA9IHsgTlVMTCwgTlVMTCwgMCwgMCB9OworCWludCBmbGFncyA9IFVOSU5URVJFU1RJTkcgfCBUUkVFU0FNRSB8IFNFRU4gfCBTSE9XTiB8IEFEREVEOworCisJYnJhbmNoID0gZGVyZWZfdGFnKHBhcnNlX29iamVjdChzaGExKSwgc2hhMV90b19oZXgoc2hhMSksIDQwKTsKKwlpZiAoIWJyYW5jaCB8fCBicmFuY2gtPnR5cGUgIT0gT0JKX0NPTU1JVCkKKwkJcmV0dXJuOworCisJc2V0dXBfcmV2aXNpb25zKDAsIE5VTEwsIHJldiwgTlVMTCk7CisJcmV2LT5pZ25vcmVfbWVyZ2VzID0gMTsKKwlhZGRfcGVuZGluZ19vYmplY3QocmV2LCBicmFuY2gsIG5hbWUpOworCWFkZF9wZW5kaW5nX29iamVjdChyZXYsICZoZWFkLT5vYmplY3QsICJeSEVBRCIpOworCWhlYWQtPm9iamVjdC5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworCWlmIChwcmVwYXJlX3JldmlzaW9uX3dhbGsocmV2KSkKKwkJZGllKCJyZXZpc2lvbiB3YWxrIHNldHVwIGZhaWxlZCIpOworCXdoaWxlICgoY29tbWl0ID0gZ2V0X3JldmlzaW9uKHJldikpICE9IE5VTEwpIHsKKwkJY2hhciAqb25lbGluZSwgKmJvbCwgKmVvbDsKKworCQkvKiBpZ25vcmUgbWVyZ2VzICovCisJCWlmIChjb21taXQtPnBhcmVudHMgJiYgY29tbWl0LT5wYXJlbnRzLT5uZXh0KQorCQkJY29udGludWU7CisKKwkJY291bnQrKzsKKwkJaWYgKHN1YmplY3RzLm5yID4gbGltaXQpCisJCQljb250aW51ZTsKKworCQlib2wgPSBzdHJzdHIoY29tbWl0LT5idWZmZXIsICJcblxuIik7CisJCWlmICghYm9sKSB7CisJCQlhcHBlbmRfdG9fbGlzdCgmc3ViamVjdHMsIHhzdHJkdXAoc2hhMV90b19oZXgoCisJCQkJCQkJY29tbWl0LT5vYmplY3Quc2hhMSkpLAorCQkJCQlOVUxMKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYm9sICs9IDI7CisJCWVvbCA9IHN0cmNocihib2wsICdcbicpOworCQlpZiAoZW9sKSB7CisJCQlvbmVsaW5lID0geG1lbWR1cHooYm9sLCBlb2wgLSBib2wpOworCQl9IGVsc2UgeworCQkJb25lbGluZSA9IHhzdHJkdXAoYm9sKTsKKwkJfQorCQlhcHBlbmRfdG9fbGlzdCgmc3ViamVjdHMsIG9uZWxpbmUsIE5VTEwpOworCX0KKworCWlmIChjb3VudCA+IGxpbWl0KQorCQlwcmludGYoIlxuKiAlczogKCVkIGNvbW1pdHMpXG4iLCBuYW1lLCBjb3VudCk7CisJZWxzZQorCQlwcmludGYoIlxuKiAlczpcbiIsIG5hbWUpOworCisJZm9yIChpID0gMDsgaSA8IHN1YmplY3RzLm5yOyBpKyspCisJCWlmIChpID49IGxpbWl0KQorCQkJcHJpbnRmKCIgIC4uLlxuIik7CisJCWVsc2UKKwkJCXByaW50ZigiICAlc1xuIiwgc3ViamVjdHMubGlzdFtpXSk7CisKKwljbGVhcl9jb21taXRfbWFya3MoKHN0cnVjdCBjb21taXQgKilicmFuY2gsIGZsYWdzKTsKKwljbGVhcl9jb21taXRfbWFya3MoaGVhZCwgZmxhZ3MpOworCWZyZWVfY29tbWl0X2xpc3QocmV2LT5jb21taXRzKTsKKwlyZXYtPmNvbW1pdHMgPSBOVUxMOworCXJldi0+cGVuZGluZy5uciA9IDA7CisKKwlmcmVlX2xpc3QoJnN1YmplY3RzKTsKK30KKworaW50IGNtZF9mbXRfbWVyZ2VfbXNnKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBsaW1pdCA9IDIwLCBpID0gMDsKKwljaGFyIGxpbmVbMTAyNF07CisJRklMRSAqaW4gPSBzdGRpbjsKKwljb25zdCBjaGFyICpzZXAgPSAiIjsKKwl1bnNpZ25lZCBjaGFyIGhlYWRfc2hhMVsyMF07CisJY29uc3QgY2hhciAqY3VycmVudF9icmFuY2g7CisKKwlnaXRfY29uZmlnKGZtdF9tZXJnZV9tc2dfY29uZmlnKTsKKworCXdoaWxlIChhcmdjID4gMSkgeworCQlpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1zdW1tYXJ5IikpCisJCQltZXJnZV9zdW1tYXJ5ID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1uby1zdW1tYXJ5IikpCisJCQltZXJnZV9zdW1tYXJ5ID0gMDsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLUYiKSB8fCAhc3RyY21wKGFyZ3ZbMV0sICItLWZpbGUiKSkgeworCQkJaWYgKGFyZ2MgPCAzKQorCQkJCWRpZSAoIldoaWNoIGZpbGU/Iik7CisJCQlpZiAoIXN0cmNtcChhcmd2WzJdLCAiLSIpKQorCQkJCWluID0gc3RkaW47CisJCQllbHNlIHsKKwkJCQlmY2xvc2UoaW4pOworCQkJCWluID0gZm9wZW4oYXJndlsyXSwgInIiKTsKKwkJCQlpZiAoIWluKQorCQkJCQlkaWUoImNhbm5vdCBvcGVuICVzIiwgYXJndlsyXSk7CisJCQl9CisJCQlhcmdjLS07IGFyZ3YrKzsKKwkJfSBlbHNlCisJCQlicmVhazsKKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJaWYgKGFyZ2MgPiAxKQorCQl1c2FnZShmbXRfbWVyZ2VfbXNnX3VzYWdlKTsKKworCS8qIGdldCBjdXJyZW50IGJyYW5jaCAqLworCWN1cnJlbnRfYnJhbmNoID0gcmVzb2x2ZV9yZWYoIkhFQUQiLCBoZWFkX3NoYTEsIDEsIE5VTEwpOworCWlmICghY3VycmVudF9icmFuY2gpCisJCWRpZSgiTm8gY3VycmVudCBicmFuY2giKTsKKwlpZiAoIXByZWZpeGNtcChjdXJyZW50X2JyYW5jaCwgInJlZnMvaGVhZHMvIikpCisJCWN1cnJlbnRfYnJhbmNoICs9IDExOworCisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgaW4pKSB7CisJCWkrKzsKKwkJaWYgKGxpbmVbMF0gPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoaGFuZGxlX2xpbmUobGluZSkpCisJCQlkaWUgKCJFcnJvciBpbiBsaW5lICVkOiAlcyIsIGksIGxpbmUpOworCX0KKworCXByaW50ZigiTWVyZ2UgIik7CisJZm9yIChpID0gMDsgaSA8IHNyY3MubnI7IGkrKykgeworCQlzdHJ1Y3Qgc3JjX2RhdGEgKnNyY19kYXRhID0gc3Jjcy5wYXlsb2FkW2ldOworCQljb25zdCBjaGFyICpzdWJzZXAgPSAiIjsKKworCQlwcmludGYoc2VwKTsKKwkJc2VwID0gIjsgIjsKKworCQlpZiAoc3JjX2RhdGEtPmhlYWRfc3RhdHVzID09IDEpIHsKKwkJCXByaW50ZihzcmNzLmxpc3RbaV0pOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHNyY19kYXRhLT5oZWFkX3N0YXR1cyA9PSAzKSB7CisJCQlzdWJzZXAgPSAiLCAiOworCQkJcHJpbnRmKCJIRUFEIik7CisJCX0KKwkJaWYgKHNyY19kYXRhLT5icmFuY2gubnIpIHsKKwkJCXByaW50ZihzdWJzZXApOworCQkJc3Vic2VwID0gIiwgIjsKKwkJCXByaW50X2pvaW5lZCgiYnJhbmNoICIsICJicmFuY2hlcyAiLCAmc3JjX2RhdGEtPmJyYW5jaCk7CisJCX0KKwkJaWYgKHNyY19kYXRhLT5yX2JyYW5jaC5ucikgeworCQkJcHJpbnRmKHN1YnNlcCk7CisJCQlzdWJzZXAgPSAiLCAiOworCQkJcHJpbnRfam9pbmVkKCJyZW1vdGUgYnJhbmNoICIsICJyZW1vdGUgYnJhbmNoZXMgIiwKKwkJCQkJJnNyY19kYXRhLT5yX2JyYW5jaCk7CisJCX0KKwkJaWYgKHNyY19kYXRhLT50YWcubnIpIHsKKwkJCXByaW50ZihzdWJzZXApOworCQkJc3Vic2VwID0gIiwgIjsKKwkJCXByaW50X2pvaW5lZCgidGFnICIsICJ0YWdzICIsICZzcmNfZGF0YS0+dGFnKTsKKwkJfQorCQlpZiAoc3JjX2RhdGEtPmdlbmVyaWMubnIpIHsKKwkJCXByaW50ZihzdWJzZXApOworCQkJcHJpbnRfam9pbmVkKCJjb21taXQgIiwgImNvbW1pdHMgIiwgJnNyY19kYXRhLT5nZW5lcmljKTsKKwkJfQorCQlpZiAoc3RyY21wKCIuIiwgc3Jjcy5saXN0W2ldKSkKKwkJCXByaW50ZigiIG9mICVzIiwgc3Jjcy5saXN0W2ldKTsKKwl9CisKKwlpZiAoIXN0cmNtcCgibWFzdGVyIiwgY3VycmVudF9icmFuY2gpKQorCQlwdXRjaGFyKCdcbicpOworCWVsc2UKKwkJcHJpbnRmKCIgaW50byAlc1xuIiwgY3VycmVudF9icmFuY2gpOworCisJaWYgKG1lcmdlX3N1bW1hcnkpIHsKKwkJc3RydWN0IGNvbW1pdCAqaGVhZDsKKwkJc3RydWN0IHJldl9pbmZvIHJldjsKKworCQloZWFkID0gbG9va3VwX2NvbW1pdChoZWFkX3NoYTEpOworCQlpbml0X3JldmlzaW9ucygmcmV2LCBwcmVmaXgpOworCQlyZXYuY29tbWl0X2Zvcm1hdCA9IENNSVRfRk1UX09ORUxJTkU7CisJCXJldi5pZ25vcmVfbWVyZ2VzID0gMTsKKwkJcmV2LmxpbWl0ZWQgPSAxOworCisJCWZvciAoaSA9IDA7IGkgPCBvcmlnaW5zLm5yOyBpKyspCisJCQlzaG9ydGxvZyhvcmlnaW5zLmxpc3RbaV0sIG9yaWdpbnMucGF5bG9hZFtpXSwKKwkJCQkJaGVhZCwgJnJldiwgbGltaXQpOworCX0KKworCS8qIE5vIGNsZWFudXAgeWV0OyBpcyBzdGFuZGFsb25lIGFueXdheSAqLworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWZvci1lYWNoLXJlZi5jIGIvYnVpbHRpbi1mb3ItZWFjaC1yZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2Q5YzU3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1mb3ItZWFjaC1yZWYuYwpAQCAtMCwwICsxLDg5NCBAQAorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisjaW5jbHVkZSAicGFyc2Utb3B0aW9ucy5oIgorCisvKiBRdW90aW5nIHN0eWxlcyAqLworI2RlZmluZSBRVU9URV9OT05FIDAKKyNkZWZpbmUgUVVPVEVfU0hFTEwgMQorI2RlZmluZSBRVU9URV9QRVJMIDIKKyNkZWZpbmUgUVVPVEVfUFlUSE9OIDQKKyNkZWZpbmUgUVVPVEVfVENMIDgKKwordHlwZWRlZiBlbnVtIHsgRklFTERfU1RSLCBGSUVMRF9VTE9ORywgRklFTERfVElNRSB9IGNtcF90eXBlOworCitzdHJ1Y3QgYXRvbV92YWx1ZSB7CisJY29uc3QgY2hhciAqczsKKwl1bnNpZ25lZCBsb25nIHVsOyAvKiB1c2VkIGZvciBzb3J0aW5nIHdoZW4gbm90IEZJRUxEX1NUUiAqLworfTsKKworc3RydWN0IHJlZl9zb3J0IHsKKwlzdHJ1Y3QgcmVmX3NvcnQgKm5leHQ7CisJaW50IGF0b207IC8qIGluZGV4IGludG8gdXNlZF9hdG9tIGFycmF5ICovCisJdW5zaWduZWQgcmV2ZXJzZSA6IDE7Cit9OworCitzdHJ1Y3QgcmVmaW5mbyB7CisJY2hhciAqcmVmbmFtZTsKKwl1bnNpZ25lZCBjaGFyIG9iamVjdG5hbWVbMjBdOworCXN0cnVjdCBhdG9tX3ZhbHVlICp2YWx1ZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY21wX3R5cGUgY21wX3R5cGU7Cit9IHZhbGlkX2F0b21bXSA9IHsKKwl7ICJyZWZuYW1lIiB9LAorCXsgIm9iamVjdHR5cGUiIH0sCisJeyAib2JqZWN0c2l6ZSIsIEZJRUxEX1VMT05HIH0sCisJeyAib2JqZWN0bmFtZSIgfSwKKwl7ICJ0cmVlIiB9LAorCXsgInBhcmVudCIgfSwKKwl7ICJudW1wYXJlbnQiLCBGSUVMRF9VTE9ORyB9LAorCXsgIm9iamVjdCIgfSwKKwl7ICJ0eXBlIiB9LAorCXsgInRhZyIgfSwKKwl7ICJhdXRob3IiIH0sCisJeyAiYXV0aG9ybmFtZSIgfSwKKwl7ICJhdXRob3JlbWFpbCIgfSwKKwl7ICJhdXRob3JkYXRlIiwgRklFTERfVElNRSB9LAorCXsgImNvbW1pdHRlciIgfSwKKwl7ICJjb21taXR0ZXJuYW1lIiB9LAorCXsgImNvbW1pdHRlcmVtYWlsIiB9LAorCXsgImNvbW1pdHRlcmRhdGUiLCBGSUVMRF9USU1FIH0sCisJeyAidGFnZ2VyIiB9LAorCXsgInRhZ2dlcm5hbWUiIH0sCisJeyAidGFnZ2VyZW1haWwiIH0sCisJeyAidGFnZ2VyZGF0ZSIsIEZJRUxEX1RJTUUgfSwKKwl7ICJjcmVhdG9yIiB9LAorCXsgImNyZWF0b3JkYXRlIiwgRklFTERfVElNRSB9LAorCXsgInN1YmplY3QiIH0sCisJeyAiYm9keSIgfSwKKwl7ICJjb250ZW50cyIgfSwKK307CisKKy8qCisgKiBBbiBhdG9tIGlzIGEgdmFsaWQgZmllbGQgYXRvbSBsaXN0ZWQgYWJvdmUsIHBvc3NpYmx5IHByZWZpeGVkIHdpdGgKKyAqIGEgIioiIHRvIGRlbm90ZSBkZXJlZl90YWcoKS4KKyAqCisgKiBXZSBwYXJzZSBnaXZlbiBmb3JtYXQgc3RyaW5nIGFuZCBzb3J0IHNwZWNpZmllcnMsIGFuZCBtYWtlIGEgbGlzdAorICogb2YgcHJvcGVydGllcyB0aGF0IHdlIG5lZWQgdG8gZXh0cmFjdCBvdXQgb2Ygb2JqZWN0cy4gIHJlZmluZm8KKyAqIHN0cnVjdHVyZSB3aWxsIGhvbGQgYW4gYXJyYXkgb2YgdmFsdWVzIGV4dHJhY3RlZCB0aGF0IGNhbiBiZQorICogaW5kZXhlZCB3aXRoIHRoZSAiYXRvbSBudW1iZXIiLCB3aGljaCBpcyBhbiBpbmRleCBpbnRvIHRoaXMKKyAqIGFycmF5LgorICovCitzdGF0aWMgY29uc3QgY2hhciAqKnVzZWRfYXRvbTsKK3N0YXRpYyBjbXBfdHlwZSAqdXNlZF9hdG9tX3R5cGU7CitzdGF0aWMgaW50IHVzZWRfYXRvbV9jbnQsIHNvcnRfYXRvbV9saW1pdCwgbmVlZF90YWdnZWQ7CisKKy8qCisgKiBVc2VkIHRvIHBhcnNlIGZvcm1hdCBzdHJpbmcgYW5kIHNvcnQgc3BlY2lmaWVycworICovCitzdGF0aWMgaW50IHBhcnNlX2F0b20oY29uc3QgY2hhciAqYXRvbSwgY29uc3QgY2hhciAqZXApCit7CisJY29uc3QgY2hhciAqc3A7CisJaW50IGksIGF0OworCisJc3AgPSBhdG9tOworCWlmICgqc3AgPT0gJyonICYmIHNwIDwgZXApCisJCXNwKys7IC8qIGRlcmVmICovCisJaWYgKGVwIDw9IHNwKQorCQlkaWUoIm1hbGZvcm1lZCBmaWVsZCBuYW1lOiAlLipzIiwgKGludCkoZXAtYXRvbSksIGF0b20pOworCisJLyogRG8gd2UgaGF2ZSB0aGUgYXRvbSBhbHJlYWR5IHVzZWQgZWxzZXdoZXJlPyAqLworCWZvciAoaSA9IDA7IGkgPCB1c2VkX2F0b21fY250OyBpKyspIHsKKwkJaW50IGxlbiA9IHN0cmxlbih1c2VkX2F0b21baV0pOworCQlpZiAobGVuID09IGVwIC0gYXRvbSAmJiAhbWVtY21wKHVzZWRfYXRvbVtpXSwgYXRvbSwgbGVuKSkKKwkJCXJldHVybiBpOworCX0KKworCS8qIElzIHRoZSBhdG9tIGEgdmFsaWQgb25lPyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZhbGlkX2F0b20pOyBpKyspIHsKKwkJaW50IGxlbiA9IHN0cmxlbih2YWxpZF9hdG9tW2ldLm5hbWUpOworCQkvKgorCQkgKiBJZiB0aGUgYXRvbSBuYW1lIGhhcyBhIGNvbG9uLCBzdHJpcCBpdCBhbmQgZXZlcnl0aGluZyBhZnRlcgorCQkgKiBpdCBvZmYgLSBpdCBzcGVjaWZpZXMgdGhlIGZvcm1hdCBmb3IgdGhpcyBlbnRyeSwgYW5kCisJCSAqIHNob3VsZG4ndCBiZSB1c2VkIGZvciBjaGVja2luZyBhZ2FpbnN0IHRoZSB2YWxpZF9hdG9tCisJCSAqIHRhYmxlLgorCQkgKi8KKwkJY29uc3QgY2hhciAqZm9ybWF0cCA9IHN0cmNocihzcCwgJzonKTsKKwkJaWYgKCFmb3JtYXRwIHx8IGVwIDwgZm9ybWF0cCkKKwkJCWZvcm1hdHAgPSBlcDsKKwkJaWYgKGxlbiA9PSBmb3JtYXRwIC0gc3AgJiYgIW1lbWNtcCh2YWxpZF9hdG9tW2ldLm5hbWUsIHNwLCBsZW4pKQorCQkJYnJlYWs7CisJfQorCisJaWYgKEFSUkFZX1NJWkUodmFsaWRfYXRvbSkgPD0gaSkKKwkJZGllKCJ1bmtub3duIGZpZWxkIG5hbWU6ICUuKnMiLCAoaW50KShlcC1hdG9tKSwgYXRvbSk7CisKKwkvKiBBZGQgaXQgaW4sIGluY2x1ZGluZyB0aGUgZGVyZWYgcHJlZml4ICovCisJYXQgPSB1c2VkX2F0b21fY250OworCXVzZWRfYXRvbV9jbnQrKzsKKwl1c2VkX2F0b20gPSB4cmVhbGxvYyh1c2VkX2F0b20sCisJCQkgICAgIChzaXplb2YgKnVzZWRfYXRvbSkgKiB1c2VkX2F0b21fY250KTsKKwl1c2VkX2F0b21fdHlwZSA9IHhyZWFsbG9jKHVzZWRfYXRvbV90eXBlLAorCQkJCSAgKHNpemVvZigqdXNlZF9hdG9tX3R5cGUpICogdXNlZF9hdG9tX2NudCkpOworCXVzZWRfYXRvbVthdF0gPSB4bWVtZHVweihhdG9tLCBlcCAtIGF0b20pOworCXVzZWRfYXRvbV90eXBlW2F0XSA9IHZhbGlkX2F0b21baV0uY21wX3R5cGU7CisJcmV0dXJuIGF0OworfQorCisvKgorICogSW4gYSBmb3JtYXQgc3RyaW5nLCBmaW5kIHRoZSBuZXh0IG9jY3VycmVuY2Ugb2YgJShhdG9tKS4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmZpbmRfbmV4dChjb25zdCBjaGFyICpjcCkKK3sKKwl3aGlsZSAoKmNwKSB7CisJCWlmICgqY3AgPT0gJyUnKSB7CisJCQkvKiAlKCBpcyB0aGUgc3RhcnQgb2YgYW4gYXRvbTsKKwkJCSAqICUlIGlzIGEgcXVvdGVkIHBlci1jZW50LgorCQkJICovCisJCQlpZiAoY3BbMV0gPT0gJygnKQorCQkJCXJldHVybiBjcDsKKwkJCWVsc2UgaWYgKGNwWzFdID09ICclJykKKwkJCQljcCsrOyAvKiBza2lwIG92ZXIgdHdvICUgKi8KKwkJCS8qIG90aGVyd2lzZSB0aGlzIGlzIGEgc2luZ2xldG9uLCBsaXRlcmFsICUgKi8KKwkJfQorCQljcCsrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIE1ha2Ugc3VyZSB0aGUgZm9ybWF0IHN0cmluZyBpcyB3ZWxsIGZvcm1lZCwgYW5kIHBhcnNlIG91dAorICogdGhlIHVzZWQgYXRvbXMuCisgKi8KK3N0YXRpYyBpbnQgdmVyaWZ5X2Zvcm1hdChjb25zdCBjaGFyICpmb3JtYXQpCit7CisJY29uc3QgY2hhciAqY3AsICpzcDsKKwlmb3IgKGNwID0gZm9ybWF0OyAqY3AgJiYgKHNwID0gZmluZF9uZXh0KGNwKSk7ICkgeworCQljb25zdCBjaGFyICplcCA9IHN0cmNocihzcCwgJyknKTsKKwkJaWYgKCFlcCkKKwkJCXJldHVybiBlcnJvcigibWFsZm9ybWVkIGZvcm1hdCBzdHJpbmcgJXMiLCBzcCk7CisJCS8qIHNwIHBvaW50cyBhdCAiJSgiIGFuZCBlcCBwb2ludHMgYXQgdGhlIGNsb3NpbmcgIikiICovCisJCXBhcnNlX2F0b20oc3AgKyAyLCBlcCk7CisJCWNwID0gZXAgKyAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEdpdmVuIGFuIG9iamVjdCBuYW1lLCByZWFkIHRoZSBvYmplY3QgZGF0YSBhbmQgc2l6ZSwgYW5kIHJldHVybiBhCisgKiAic3RydWN0IG9iamVjdCIuICBJZiB0aGUgb2JqZWN0IGRhdGEgd2UgYXJlIHJldHVybmluZyBpcyBhbHNvIGJvcnJvd2VkCisgKiBieSB0aGUgInN0cnVjdCBvYmplY3QiIHJlcHJlc2VudGF0aW9uLCBzZXQgKmVhdGVuIGFzIHdlbGwtLS1pdCBpcyBhCisgKiBzaWduYWwgZnJvbSBwYXJzZV9vYmplY3RfYnVmZmVyIHRvIHVzIG5vdCB0byBmcmVlIHRoZSBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkICpnZXRfb2JqKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHN0cnVjdCBvYmplY3QgKipvYmosIHVuc2lnbmVkIGxvbmcgKnN6LCBpbnQgKmVhdGVuKQoreworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwl2b2lkICpidWYgPSByZWFkX3NoYTFfZmlsZShzaGExLCAmdHlwZSwgc3opOworCisJaWYgKGJ1ZikKKwkJKm9iaiA9IHBhcnNlX29iamVjdF9idWZmZXIoc2hhMSwgdHlwZSwgKnN6LCBidWYsIGVhdGVuKTsKKwllbHNlCisJCSpvYmogPSBOVUxMOworCXJldHVybiBidWY7Cit9CisKKy8qIFNlZSBncmFiX3ZhbHVlcyAqLworc3RhdGljIHZvaWQgZ3JhYl9jb21tb25fdmFsdWVzKHN0cnVjdCBhdG9tX3ZhbHVlICp2YWwsIGludCBkZXJlZiwgc3RydWN0IG9iamVjdCAqb2JqLCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgc3opCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdXNlZF9hdG9tX2NudDsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKm5hbWUgPSB1c2VkX2F0b21baV07CisJCXN0cnVjdCBhdG9tX3ZhbHVlICp2ID0gJnZhbFtpXTsKKwkJaWYgKCEhZGVyZWYgIT0gKCpuYW1lID09ICcqJykpCisJCQljb250aW51ZTsKKwkJaWYgKGRlcmVmKQorCQkJbmFtZSsrOworCQlpZiAoIXN0cmNtcChuYW1lLCAib2JqZWN0dHlwZSIpKQorCQkJdi0+cyA9IHR5cGVuYW1lKG9iai0+dHlwZSk7CisJCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIm9iamVjdHNpemUiKSkgeworCQkJY2hhciAqcyA9IHhtYWxsb2MoNDApOworCQkJc3ByaW50ZihzLCAiJWx1Iiwgc3opOworCQkJdi0+dWwgPSBzejsKKwkJCXYtPnMgPSBzOworCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIm9iamVjdG5hbWUiKSkgeworCQkJY2hhciAqcyA9IHhtYWxsb2MoNDEpOworCQkJc3RyY3B5KHMsIHNoYTFfdG9faGV4KG9iai0+c2hhMSkpOworCQkJdi0+cyA9IHM7CisJCX0KKwl9Cit9CisKKy8qIFNlZSBncmFiX3ZhbHVlcyAqLworc3RhdGljIHZvaWQgZ3JhYl90YWdfdmFsdWVzKHN0cnVjdCBhdG9tX3ZhbHVlICp2YWwsIGludCBkZXJlZiwgc3RydWN0IG9iamVjdCAqb2JqLCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgc3opCit7CisJaW50IGk7CisJc3RydWN0IHRhZyAqdGFnID0gKHN0cnVjdCB0YWcgKikgb2JqOworCisJZm9yIChpID0gMDsgaSA8IHVzZWRfYXRvbV9jbnQ7IGkrKykgeworCQljb25zdCBjaGFyICpuYW1lID0gdXNlZF9hdG9tW2ldOworCQlzdHJ1Y3QgYXRvbV92YWx1ZSAqdiA9ICZ2YWxbaV07CisJCWlmICghIWRlcmVmICE9ICgqbmFtZSA9PSAnKicpKQorCQkJY29udGludWU7CisJCWlmIChkZXJlZikKKwkJCW5hbWUrKzsKKwkJaWYgKCFzdHJjbXAobmFtZSwgInRhZyIpKQorCQkJdi0+cyA9IHRhZy0+dGFnOworCX0KK30KKworc3RhdGljIGludCBudW1fcGFyZW50cyhzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCWludCBpOworCisJZm9yIChpID0gMCwgcGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsKKwkgICAgIHBhcmVudHM7CisJICAgICBwYXJlbnRzID0gcGFyZW50cy0+bmV4dCkKKwkJaSsrOworCXJldHVybiBpOworfQorCisvKiBTZWUgZ3JhYl92YWx1ZXMgKi8KK3N0YXRpYyB2b2lkIGdyYWJfY29tbWl0X3ZhbHVlcyhzdHJ1Y3QgYXRvbV92YWx1ZSAqdmFsLCBpbnQgZGVyZWYsIHN0cnVjdCBvYmplY3QgKm9iaiwgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIHN6KQoreworCWludCBpOworCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IChzdHJ1Y3QgY29tbWl0ICopIG9iajsKKworCWZvciAoaSA9IDA7IGkgPCB1c2VkX2F0b21fY250OyBpKyspIHsKKwkJY29uc3QgY2hhciAqbmFtZSA9IHVzZWRfYXRvbVtpXTsKKwkJc3RydWN0IGF0b21fdmFsdWUgKnYgPSAmdmFsW2ldOworCQlpZiAoISFkZXJlZiAhPSAoKm5hbWUgPT0gJyonKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZGVyZWYpCisJCQluYW1lKys7CisJCWlmICghc3RyY21wKG5hbWUsICJ0cmVlIikpIHsKKwkJCWNoYXIgKnMgPSB4bWFsbG9jKDQxKTsKKwkJCXN0cmNweShzLCBzaGExX3RvX2hleChjb21taXQtPnRyZWUtPm9iamVjdC5zaGExKSk7CisJCQl2LT5zID0gczsKKwkJfQorCQlpZiAoIXN0cmNtcChuYW1lLCAibnVtcGFyZW50IikpIHsKKwkJCWNoYXIgKnMgPSB4bWFsbG9jKDQwKTsKKwkJCXYtPnVsID0gbnVtX3BhcmVudHMoY29tbWl0KTsKKwkJCXNwcmludGYocywgIiVsdSIsIHYtPnVsKTsKKwkJCXYtPnMgPSBzOworCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInBhcmVudCIpKSB7CisJCQlpbnQgbnVtID0gbnVtX3BhcmVudHMoY29tbWl0KTsKKwkJCWludCBpOworCQkJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCQkJY2hhciAqcyA9IHhtYWxsb2MoNDEgKiBudW0gKyAxKTsKKwkJCXYtPnMgPSBzOworCQkJZm9yIChpID0gMCwgcGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsKKwkJCSAgICAgcGFyZW50czsKKwkJCSAgICAgcGFyZW50cyA9IHBhcmVudHMtPm5leHQsIGkgPSBpICsgNDEpIHsKKwkJCQlzdHJ1Y3QgY29tbWl0ICpwYXJlbnQgPSBwYXJlbnRzLT5pdGVtOworCQkJCXN0cmNweShzK2ksIHNoYTFfdG9faGV4KHBhcmVudC0+b2JqZWN0LnNoYTEpKTsKKwkJCQlpZiAocGFyZW50cy0+bmV4dCkKKwkJCQkJc1tpKzQwXSA9ICcgJzsKKwkJCX0KKwkJCWlmICghaSkKKwkJCQkqcyA9ICdcMCc7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpmaW5kX3dob2xpbmUoY29uc3QgY2hhciAqd2hvLCBpbnQgd2hvbGVuLCBjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgc3opCit7CisJY29uc3QgY2hhciAqZW9sOworCXdoaWxlICgqYnVmKSB7CisJCWlmICghc3RybmNtcChidWYsIHdobywgd2hvbGVuKSAmJgorCQkgICAgYnVmW3dob2xlbl0gPT0gJyAnKQorCQkJcmV0dXJuIGJ1ZiArIHdob2xlbiArIDE7CisJCWVvbCA9IHN0cmNocihidWYsICdcbicpOworCQlpZiAoIWVvbCkKKwkJCXJldHVybiAiIjsKKwkJZW9sKys7CisJCWlmICgqZW9sID09ICdcbicpCisJCQlyZXR1cm4gIiI7IC8qIGVuZCBvZiBoZWFkZXIgKi8KKwkJYnVmID0gZW9sOworCX0KKwlyZXR1cm4gIiI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb3B5X2xpbmUoY29uc3QgY2hhciAqYnVmKQoreworCWNvbnN0IGNoYXIgKmVvbCA9IHN0cmNocihidWYsICdcbicpOworCWlmICghZW9sKQorCQlyZXR1cm4gIiI7CisJcmV0dXJuIHhtZW1kdXB6KGJ1ZiwgZW9sIC0gYnVmKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvcHlfbmFtZShjb25zdCBjaGFyICpidWYpCit7CisJY29uc3QgY2hhciAqY3A7CisJZm9yIChjcCA9IGJ1ZjsgKmNwICYmICpjcCAhPSAnXG4nOyBjcCsrKSB7CisJCWlmICghc3RybmNtcChjcCwgIiA8IiwgMikpCisJCQlyZXR1cm4geG1lbWR1cHooYnVmLCBjcCAtIGJ1Zik7CisJfQorCXJldHVybiAiIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvcHlfZW1haWwoY29uc3QgY2hhciAqYnVmKQoreworCWNvbnN0IGNoYXIgKmVtYWlsID0gc3RyY2hyKGJ1ZiwgJzwnKTsKKwljb25zdCBjaGFyICplb2VtYWlsID0gc3RyY2hyKGVtYWlsLCAnPicpOworCWlmICghZW1haWwgfHwgIWVvZW1haWwpCisJCXJldHVybiAiIjsKKwlyZXR1cm4geG1lbWR1cHooZW1haWwsIGVvZW1haWwgKyAxIC0gZW1haWwpOworfQorCitzdGF0aWMgdm9pZCBncmFiX2RhdGUoY29uc3QgY2hhciAqYnVmLCBzdHJ1Y3QgYXRvbV92YWx1ZSAqdiwgY29uc3QgY2hhciAqYXRvbW5hbWUpCit7CisJY29uc3QgY2hhciAqZW9lbWFpbCA9IHN0cnN0cihidWYsICI+ICIpOworCWNoYXIgKnpvbmU7CisJdW5zaWduZWQgbG9uZyB0aW1lc3RhbXA7CisJbG9uZyB0ejsKKwllbnVtIGRhdGVfbW9kZSBkYXRlX21vZGUgPSBEQVRFX05PUk1BTDsKKwljb25zdCBjaGFyICpmb3JtYXRwOworCisJLyoKKwkgKiBXZSBnb3QgaGVyZSBiZWNhdXNlIGF0b21uYW1lIGVuZHMgaW4gImRhdGUiIG9yICJkYXRlPHNvbWV0aGluZz4iOworCSAqIGl0J3Mgbm90IHBvc3NpYmxlIHRoYXQgPHNvbWV0aGluZz4gaXMgbm90ICI6PGZvcm1hdD4iIGJlY2F1c2UKKwkgKiBwYXJzZV9hdG9tKCkgd291bGRuJ3QgaGF2ZSBhbGxvd2VkIGl0LCBzbyB3ZSBjYW4gYXNzdW1lIHRoYXQgbm8KKwkgKiAiOiIgbWVhbnMgbm8gZm9ybWF0IGlzIHNwZWNpZmllZCwgYW5kIHVzZSB0aGUgZGVmYXVsdC4KKwkgKi8KKwlmb3JtYXRwID0gc3RyY2hyKGF0b21uYW1lLCAnOicpOworCWlmIChmb3JtYXRwICE9IE5VTEwpIHsKKwkJZm9ybWF0cCsrOworCQlkYXRlX21vZGUgPSBwYXJzZV9kYXRlX2Zvcm1hdChmb3JtYXRwKTsKKwl9CisKKwlpZiAoIWVvZW1haWwpCisJCWdvdG8gYmFkOworCXRpbWVzdGFtcCA9IHN0cnRvdWwoZW9lbWFpbCArIDIsICZ6b25lLCAxMCk7CisJaWYgKHRpbWVzdGFtcCA9PSBVTE9OR19NQVgpCisJCWdvdG8gYmFkOworCXR6ID0gc3RydG9sKHpvbmUsIE5VTEwsIDEwKTsKKwlpZiAoKHR6ID09IExPTkdfTUlOIHx8IHR6ID09IExPTkdfTUFYKSAmJiBlcnJubyA9PSBFUkFOR0UpCisJCWdvdG8gYmFkOworCXYtPnMgPSB4c3RyZHVwKHNob3dfZGF0ZSh0aW1lc3RhbXAsIHR6LCBkYXRlX21vZGUpKTsKKwl2LT51bCA9IHRpbWVzdGFtcDsKKwlyZXR1cm47CisgYmFkOgorCXYtPnMgPSAiIjsKKwl2LT51bCA9IDA7Cit9CisKKy8qIFNlZSBncmFiX3ZhbHVlcyAqLworc3RhdGljIHZvaWQgZ3JhYl9wZXJzb24oY29uc3QgY2hhciAqd2hvLCBzdHJ1Y3QgYXRvbV92YWx1ZSAqdmFsLCBpbnQgZGVyZWYsIHN0cnVjdCBvYmplY3QgKm9iaiwgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIHN6KQoreworCWludCBpOworCWludCB3aG9sZW4gPSBzdHJsZW4od2hvKTsKKwljb25zdCBjaGFyICp3aG9saW5lID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCB1c2VkX2F0b21fY250OyBpKyspIHsKKwkJY29uc3QgY2hhciAqbmFtZSA9IHVzZWRfYXRvbVtpXTsKKwkJc3RydWN0IGF0b21fdmFsdWUgKnYgPSAmdmFsW2ldOworCQlpZiAoISFkZXJlZiAhPSAoKm5hbWUgPT0gJyonKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZGVyZWYpCisJCQluYW1lKys7CisJCWlmIChzdHJuY21wKHdobywgbmFtZSwgd2hvbGVuKSkKKwkJCWNvbnRpbnVlOworCQlpZiAobmFtZVt3aG9sZW5dICE9IDAgJiYKKwkJICAgIHN0cmNtcChuYW1lICsgd2hvbGVuLCAibmFtZSIpICYmCisJCSAgICBzdHJjbXAobmFtZSArIHdob2xlbiwgImVtYWlsIikgJiYKKwkJICAgIHByZWZpeGNtcChuYW1lICsgd2hvbGVuLCAiZGF0ZSIpKQorCQkJY29udGludWU7CisJCWlmICghd2hvbGluZSkKKwkJCXdob2xpbmUgPSBmaW5kX3dob2xpbmUod2hvLCB3aG9sZW4sIGJ1Ziwgc3opOworCQlpZiAoIXdob2xpbmUpCisJCQlyZXR1cm47IC8qIG5vIHBvaW50IGxvb2tpbmcgZm9yIGl0ICovCisJCWlmIChuYW1lW3dob2xlbl0gPT0gMCkKKwkJCXYtPnMgPSBjb3B5X2xpbmUod2hvbGluZSk7CisJCWVsc2UgaWYgKCFzdHJjbXAobmFtZSArIHdob2xlbiwgIm5hbWUiKSkKKwkJCXYtPnMgPSBjb3B5X25hbWUod2hvbGluZSk7CisJCWVsc2UgaWYgKCFzdHJjbXAobmFtZSArIHdob2xlbiwgImVtYWlsIikpCisJCQl2LT5zID0gY29weV9lbWFpbCh3aG9saW5lKTsKKwkJZWxzZSBpZiAoIXByZWZpeGNtcChuYW1lICsgd2hvbGVuLCAiZGF0ZSIpKQorCQkJZ3JhYl9kYXRlKHdob2xpbmUsIHYsIG5hbWUpOworCX0KKworCS8qIEZvciBhIHRhZyBvciBhIGNvbW1pdCBvYmplY3QsIGlmICJjcmVhdG9yIiBvciAiY3JlYXRvcmRhdGUiIGlzCisJICogcmVxdWVzdGVkLCBkbyBzb21ldGhpbmcgc3BlY2lhbC4KKwkgKi8KKwlpZiAoc3RyY21wKHdobywgInRhZ2dlciIpICYmIHN0cmNtcCh3aG8sICJjb21taXR0ZXIiKSkKKwkJcmV0dXJuOyAvKiAiYXV0aG9yIiBmb3IgY29tbWl0IG9iamVjdCBpcyBub3Qgd2FudGVkICovCisJaWYgKCF3aG9saW5lKQorCQl3aG9saW5lID0gZmluZF93aG9saW5lKHdobywgd2hvbGVuLCBidWYsIHN6KTsKKwlpZiAoIXdob2xpbmUpCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgdXNlZF9hdG9tX2NudDsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKm5hbWUgPSB1c2VkX2F0b21baV07CisJCXN0cnVjdCBhdG9tX3ZhbHVlICp2ID0gJnZhbFtpXTsKKwkJaWYgKCEhZGVyZWYgIT0gKCpuYW1lID09ICcqJykpCisJCQljb250aW51ZTsKKwkJaWYgKGRlcmVmKQorCQkJbmFtZSsrOworCisJCWlmICghcHJlZml4Y21wKG5hbWUsICJjcmVhdG9yZGF0ZSIpKQorCQkJZ3JhYl9kYXRlKHdob2xpbmUsIHYsIG5hbWUpOworCQllbHNlIGlmICghc3RyY21wKG5hbWUsICJjcmVhdG9yIikpCisJCQl2LT5zID0gY29weV9saW5lKHdob2xpbmUpOworCX0KK30KKworc3RhdGljIHZvaWQgZmluZF9zdWJwb3MoY29uc3QgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIHN6LCBjb25zdCBjaGFyICoqc3ViLCBjb25zdCBjaGFyICoqYm9keSkKK3sKKwl3aGlsZSAoKmJ1ZikgeworCQljb25zdCBjaGFyICplb2wgPSBzdHJjaHIoYnVmLCAnXG4nKTsKKwkJaWYgKCFlb2wpCisJCQlyZXR1cm47CisJCWlmIChlb2xbMV0gPT0gJ1xuJykgeworCQkJYnVmID0gZW9sICsgMTsKKwkJCWJyZWFrOyAvKiBmb3VuZCBlbmQgb2YgaGVhZGVyICovCisJCX0KKwkJYnVmID0gZW9sICsgMTsKKwl9CisJd2hpbGUgKCpidWYgPT0gJ1xuJykKKwkJYnVmKys7CisJaWYgKCEqYnVmKQorCQlyZXR1cm47CisJKnN1YiA9IGJ1ZjsgLyogZmlyc3Qgbm9uLWVtcHR5IGxpbmUgKi8KKwlidWYgPSBzdHJjaHIoYnVmLCAnXG4nKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOyAvKiBubyBib2R5ICovCisJd2hpbGUgKCpidWYgPT0gJ1xuJykKKwkJYnVmKys7IC8qIHNraXAgYmxhbmsgYmV0d2VlbiBzdWJqZWN0IGFuZCBib2R5ICovCisJKmJvZHkgPSBidWY7Cit9CisKKy8qIFNlZSBncmFiX3ZhbHVlcyAqLworc3RhdGljIHZvaWQgZ3JhYl9zdWJfYm9keV9jb250ZW50cyhzdHJ1Y3QgYXRvbV92YWx1ZSAqdmFsLCBpbnQgZGVyZWYsIHN0cnVjdCBvYmplY3QgKm9iaiwgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIHN6KQoreworCWludCBpOworCWNvbnN0IGNoYXIgKnN1YnBvcyA9IE5VTEwsICpib2R5cG9zID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCB1c2VkX2F0b21fY250OyBpKyspIHsKKwkJY29uc3QgY2hhciAqbmFtZSA9IHVzZWRfYXRvbVtpXTsKKwkJc3RydWN0IGF0b21fdmFsdWUgKnYgPSAmdmFsW2ldOworCQlpZiAoISFkZXJlZiAhPSAoKm5hbWUgPT0gJyonKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZGVyZWYpCisJCQluYW1lKys7CisJCWlmIChzdHJjbXAobmFtZSwgInN1YmplY3QiKSAmJgorCQkgICAgc3RyY21wKG5hbWUsICJib2R5IikgJiYKKwkJICAgIHN0cmNtcChuYW1lLCAiY29udGVudHMiKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXN1YnBvcykKKwkJCWZpbmRfc3VicG9zKGJ1Ziwgc3osICZzdWJwb3MsICZib2R5cG9zKTsKKwkJaWYgKCFzdWJwb3MpCisJCQlyZXR1cm47CisKKwkJaWYgKCFzdHJjbXAobmFtZSwgInN1YmplY3QiKSkKKwkJCXYtPnMgPSBjb3B5X2xpbmUoc3VicG9zKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiYm9keSIpKQorCQkJdi0+cyA9IHhzdHJkdXAoYm9keXBvcyk7CisJCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImNvbnRlbnRzIikpCisJCQl2LT5zID0geHN0cmR1cChzdWJwb3MpOworCX0KK30KKworLyogV2Ugd2FudCB0byBoYXZlIGVtcHR5IHByaW50LXN0cmluZyBmb3IgZmllbGQgcmVxdWVzdHMKKyAqIHRoYXQgZG8gbm90IGFwcGx5IChlLmcuICJhdXRob3JkYXRlIiBmb3IgYSB0YWcgb2JqZWN0KQorICovCitzdGF0aWMgdm9pZCBmaWxsX21pc3NpbmdfdmFsdWVzKHN0cnVjdCBhdG9tX3ZhbHVlICp2YWwpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHVzZWRfYXRvbV9jbnQ7IGkrKykgeworCQlzdHJ1Y3QgYXRvbV92YWx1ZSAqdiA9ICZ2YWxbaV07CisJCWlmICh2LT5zID09IE5VTEwpCisJCQl2LT5zID0gIiI7CisJfQorfQorCisvKgorICogdmFsIGlzIGEgbGlzdCBvZiBhdG9tX3ZhbHVlIHRvIGhvbGQgcmV0dXJuZWQgdmFsdWVzLiAgRXh0cmFjdAorICogdGhlIHZhbHVlcyBmb3IgYXRvbXMgaW4gdXNlZF9hdG9tIGFycmF5IG91dCBvZiAob2JqLCBidWYsIHN6KS4KKyAqIHdoZW4gZGVyZWYgaXMgZmFsc2UsIChvYmosIGJ1Ziwgc3opIGlzIHRoZSBvYmplY3QgdGhhdCBpcworICogcG9pbnRlZCBhdCBieSB0aGUgcmVmIGl0c2VsZjsgb3RoZXJ3aXNlIGl0IGlzIHRoZSBvYmplY3QgdGhlCisgKiByZWYgKHdoaWNoIGlzIGEgdGFnKSByZWZlcnMgdG8uCisgKi8KK3N0YXRpYyB2b2lkIGdyYWJfdmFsdWVzKHN0cnVjdCBhdG9tX3ZhbHVlICp2YWwsIGludCBkZXJlZiwgc3RydWN0IG9iamVjdCAqb2JqLCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgc3opCit7CisJZ3JhYl9jb21tb25fdmFsdWVzKHZhbCwgZGVyZWYsIG9iaiwgYnVmLCBzeik7CisJc3dpdGNoIChvYmotPnR5cGUpIHsKKwljYXNlIE9CSl9UQUc6CisJCWdyYWJfdGFnX3ZhbHVlcyh2YWwsIGRlcmVmLCBvYmosIGJ1Ziwgc3opOworCQlncmFiX3N1Yl9ib2R5X2NvbnRlbnRzKHZhbCwgZGVyZWYsIG9iaiwgYnVmLCBzeik7CisJCWdyYWJfcGVyc29uKCJ0YWdnZXIiLCB2YWwsIGRlcmVmLCBvYmosIGJ1Ziwgc3opOworCQlicmVhazsKKwljYXNlIE9CSl9DT01NSVQ6CisJCWdyYWJfY29tbWl0X3ZhbHVlcyh2YWwsIGRlcmVmLCBvYmosIGJ1Ziwgc3opOworCQlncmFiX3N1Yl9ib2R5X2NvbnRlbnRzKHZhbCwgZGVyZWYsIG9iaiwgYnVmLCBzeik7CisJCWdyYWJfcGVyc29uKCJhdXRob3IiLCB2YWwsIGRlcmVmLCBvYmosIGJ1Ziwgc3opOworCQlncmFiX3BlcnNvbigiY29tbWl0dGVyIiwgdmFsLCBkZXJlZiwgb2JqLCBidWYsIHN6KTsKKwkJYnJlYWs7CisJY2FzZSBPQkpfVFJFRToKKwkJLy8gZ3JhYl90cmVlX3ZhbHVlcyh2YWwsIGRlcmVmLCBvYmosIGJ1Ziwgc3opOworCQlicmVhazsKKwljYXNlIE9CSl9CTE9COgorCQkvLyBncmFiX2Jsb2JfdmFsdWVzKHZhbCwgZGVyZWYsIG9iaiwgYnVmLCBzeik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRpZSgiRWg/ICBPYmplY3Qgb2YgdHlwZSAlZD8iLCBvYmotPnR5cGUpOworCX0KK30KKworLyoKKyAqIFBhcnNlIHRoZSBvYmplY3QgcmVmZXJyZWQgYnkgcmVmLCBhbmQgZ3JhYiBuZWVkZWQgdmFsdWUuCisgKi8KK3N0YXRpYyB2b2lkIHBvcHVsYXRlX3ZhbHVlKHN0cnVjdCByZWZpbmZvICpyZWYpCit7CisJdm9pZCAqYnVmOworCXN0cnVjdCBvYmplY3QgKm9iajsKKwlpbnQgZWF0ZW4sIGk7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnRhZ2dlZDsKKworCXJlZi0+dmFsdWUgPSB4Y2FsbG9jKHNpemVvZihzdHJ1Y3QgYXRvbV92YWx1ZSksIHVzZWRfYXRvbV9jbnQpOworCisJYnVmID0gZ2V0X29iaihyZWYtPm9iamVjdG5hbWUsICZvYmosICZzaXplLCAmZWF0ZW4pOworCWlmICghYnVmKQorCQlkaWUoIm1pc3Npbmcgb2JqZWN0ICVzIGZvciAlcyIsCisJCSAgICBzaGExX3RvX2hleChyZWYtPm9iamVjdG5hbWUpLCByZWYtPnJlZm5hbWUpOworCWlmICghb2JqKQorCQlkaWUoInBhcnNlX29iamVjdF9idWZmZXIgZmFpbGVkIG9uICVzIGZvciAlcyIsCisJCSAgICBzaGExX3RvX2hleChyZWYtPm9iamVjdG5hbWUpLCByZWYtPnJlZm5hbWUpOworCisJLyogRmlsbCBpbiBzcGVjaWFscyBmaXJzdCAqLworCWZvciAoaSA9IDA7IGkgPCB1c2VkX2F0b21fY250OyBpKyspIHsKKwkJY29uc3QgY2hhciAqbmFtZSA9IHVzZWRfYXRvbVtpXTsKKwkJc3RydWN0IGF0b21fdmFsdWUgKnYgPSAmcmVmLT52YWx1ZVtpXTsKKwkJaWYgKCFzdHJjbXAobmFtZSwgInJlZm5hbWUiKSkKKwkJCXYtPnMgPSByZWYtPnJlZm5hbWU7CisJCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIipyZWZuYW1lIikpIHsKKwkJCWludCBsZW4gPSBzdHJsZW4ocmVmLT5yZWZuYW1lKTsKKwkJCWNoYXIgKnMgPSB4bWFsbG9jKGxlbiArIDQpOworCQkJc3ByaW50ZihzLCAiJXNee30iLCByZWYtPnJlZm5hbWUpOworCQkJdi0+cyA9IHM7CisJCX0KKwl9CisKKwlncmFiX3ZhbHVlcyhyZWYtPnZhbHVlLCAwLCBvYmosIGJ1Ziwgc2l6ZSk7CisJaWYgKCFlYXRlbikKKwkJZnJlZShidWYpOworCisJLyogSWYgdGhlcmUgaXMgbm8gYXRvbSB0aGF0IHdhbnRzIHRvIGtub3cgYWJvdXQgdGFnZ2VkCisJICogb2JqZWN0LCB3ZSBhcmUgZG9uZS4KKwkgKi8KKwlpZiAoIW5lZWRfdGFnZ2VkIHx8IChvYmotPnR5cGUgIT0gT0JKX1RBRykpCisJCXJldHVybjsKKworCS8qIElmIGl0IGlzIGEgdGFnIG9iamVjdCwgc2VlIGlmIHdlIHVzZSBhIHZhbHVlIHRoYXQgZGVyZWZzCisJICogdGhlIG9iamVjdCwgYW5kIGlmIHdlIGRvIGdyYWIgdGhlIG9iamVjdCBpdCByZWZlcnMgdG8uCisJICovCisJdGFnZ2VkID0gKChzdHJ1Y3QgdGFnICopb2JqKS0+dGFnZ2VkLT5zaGExOworCisJLyogTkVFRFNXT1JLOiBUaGlzIGRlcmVmcyB0YWcgb25seSBvbmNlLCB3aGljaAorCSAqIGlzIGdvb2QgdG8gZGVhbCB3aXRoIGNoYWlucyBvZiB0cnVzdCwgYnV0CisJICogaXMgbm90IGNvbnNpc3RlbnQgd2l0aCB3aGF0IGRlcmVmX3RhZygpIGRvZXMKKwkgKiB3aGljaCBwZWVscyB0aGUgb25pb24gdG8gdGhlIGNvcmUuCisJICovCisJYnVmID0gZ2V0X29iaih0YWdnZWQsICZvYmosICZzaXplLCAmZWF0ZW4pOworCWlmICghYnVmKQorCQlkaWUoIm1pc3Npbmcgb2JqZWN0ICVzIGZvciAlcyIsCisJCSAgICBzaGExX3RvX2hleCh0YWdnZWQpLCByZWYtPnJlZm5hbWUpOworCWlmICghb2JqKQorCQlkaWUoInBhcnNlX29iamVjdF9idWZmZXIgZmFpbGVkIG9uICVzIGZvciAlcyIsCisJCSAgICBzaGExX3RvX2hleCh0YWdnZWQpLCByZWYtPnJlZm5hbWUpOworCWdyYWJfdmFsdWVzKHJlZi0+dmFsdWUsIDEsIG9iaiwgYnVmLCBzaXplKTsKKwlpZiAoIWVhdGVuKQorCQlmcmVlKGJ1Zik7Cit9CisKKy8qCisgKiBHaXZlbiBhIHJlZiwgcmV0dXJuIHRoZSB2YWx1ZSBmb3IgdGhlIGF0b20uICBUaGlzIGxhemlseSBnZXRzIHZhbHVlCisgKiBvdXQgb2YgdGhlIG9iamVjdCBieSBjYWxsaW5nIHBvcHVsYXRlIHZhbHVlLgorICovCitzdGF0aWMgdm9pZCBnZXRfdmFsdWUoc3RydWN0IHJlZmluZm8gKnJlZiwgaW50IGF0b20sIHN0cnVjdCBhdG9tX3ZhbHVlICoqdikKK3sKKwlpZiAoIXJlZi0+dmFsdWUpIHsKKwkJcG9wdWxhdGVfdmFsdWUocmVmKTsKKwkJZmlsbF9taXNzaW5nX3ZhbHVlcyhyZWYtPnZhbHVlKTsKKwl9CisJKnYgPSAmcmVmLT52YWx1ZVthdG9tXTsKK30KKworc3RydWN0IGdyYWJfcmVmX2NiZGF0YSB7CisJc3RydWN0IHJlZmluZm8gKipncmFiX2FycmF5OworCWNvbnN0IGNoYXIgKipncmFiX3BhdHRlcm47CisJaW50IGdyYWJfY250OworfTsKKworLyoKKyAqIEEgY2FsbC1iYWNrIGdpdmVuIHRvIGZvcl9lYWNoX3JlZigpLiAgSXQgaXMgdW5mb3J0dW5hdGUgdGhhdCB3ZQorICogbmVlZCB0byB1c2UgZ2xvYmFsIHZhcmlhYmxlcyB0byBwYXNzIGV4dHJhIGluZm9ybWF0aW9uIHRvIHRoaXMKKyAqIGZ1bmN0aW9uLgorICovCitzdGF0aWMgaW50IGdyYWJfc2luZ2xlX3JlZihjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmxhZywgdm9pZCAqY2JfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3JhYl9yZWZfY2JkYXRhICpjYiA9IGNiX2RhdGE7CisJc3RydWN0IHJlZmluZm8gKnJlZjsKKwlpbnQgY250OworCisJaWYgKCpjYi0+Z3JhYl9wYXR0ZXJuKSB7CisJCWNvbnN0IGNoYXIgKipwYXR0ZXJuOworCQlpbnQgbmFtZWxlbiA9IHN0cmxlbihyZWZuYW1lKTsKKwkJZm9yIChwYXR0ZXJuID0gY2ItPmdyYWJfcGF0dGVybjsgKnBhdHRlcm47IHBhdHRlcm4rKykgeworCQkJY29uc3QgY2hhciAqcCA9ICpwYXR0ZXJuOworCQkJaW50IHBsZW4gPSBzdHJsZW4ocCk7CisKKwkJCWlmICgocGxlbiA8PSBuYW1lbGVuKSAmJgorCQkJICAgICFzdHJuY21wKHJlZm5hbWUsIHAsIHBsZW4pICYmCisJCQkgICAgKHJlZm5hbWVbcGxlbl0gPT0gJ1wwJyB8fAorCQkJICAgICByZWZuYW1lW3BsZW5dID09ICcvJykpCisJCQkJYnJlYWs7CisJCQlpZiAoIWZubWF0Y2gocCwgcmVmbmFtZSwgRk5NX1BBVEhOQU1FKSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoISpwYXR0ZXJuKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyogV2UgZG8gbm90IG9wZW4gdGhlIG9iamVjdCB5ZXQ7IHNvcnQgbWF5IG9ubHkgbmVlZCByZWZuYW1lCisJICogdG8gZG8gaXRzIGpvYiBhbmQgdGhlIHJlc3VsdGluZyBsaXN0IG1heSB5ZXQgdG8gYmUgcHJ1bmVkCisJICogYnkgbWF4Y291bnQgbG9naWMuCisJICovCisJcmVmID0geGNhbGxvYygxLCBzaXplb2YoKnJlZikpOworCXJlZi0+cmVmbmFtZSA9IHhzdHJkdXAocmVmbmFtZSk7CisJaGFzaGNweShyZWYtPm9iamVjdG5hbWUsIHNoYTEpOworCisJY250ID0gY2ItPmdyYWJfY250OworCWNiLT5ncmFiX2FycmF5ID0geHJlYWxsb2MoY2ItPmdyYWJfYXJyYXksCisJCQkJICBzaXplb2YoKmNiLT5ncmFiX2FycmF5KSAqIChjbnQgKyAxKSk7CisJY2ItPmdyYWJfYXJyYXlbY250KytdID0gcmVmOworCWNiLT5ncmFiX2NudCA9IGNudDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbXBfcmVmX3NvcnQoc3RydWN0IHJlZl9zb3J0ICpzLCBzdHJ1Y3QgcmVmaW5mbyAqYSwgc3RydWN0IHJlZmluZm8gKmIpCit7CisJc3RydWN0IGF0b21fdmFsdWUgKnZhLCAqdmI7CisJaW50IGNtcDsKKwljbXBfdHlwZSBjbXBfdHlwZSA9IHVzZWRfYXRvbV90eXBlW3MtPmF0b21dOworCisJZ2V0X3ZhbHVlKGEsIHMtPmF0b20sICZ2YSk7CisJZ2V0X3ZhbHVlKGIsIHMtPmF0b20sICZ2Yik7CisJc3dpdGNoIChjbXBfdHlwZSkgeworCWNhc2UgRklFTERfU1RSOgorCQljbXAgPSBzdHJjbXAodmEtPnMsIHZiLT5zKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKHZhLT51bCA8IHZiLT51bCkKKwkJCWNtcCA9IC0xOworCQllbHNlIGlmICh2YS0+dWwgPT0gdmItPnVsKQorCQkJY21wID0gMDsKKwkJZWxzZQorCQkJY21wID0gMTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAocy0+cmV2ZXJzZSkgPyAtY21wIDogY21wOworfQorCitzdGF0aWMgc3RydWN0IHJlZl9zb3J0ICpyZWZfc29ydDsKK3N0YXRpYyBpbnQgY29tcGFyZV9yZWZzKGNvbnN0IHZvaWQgKmFfLCBjb25zdCB2b2lkICpiXykKK3sKKwlzdHJ1Y3QgcmVmaW5mbyAqYSA9ICooKHN0cnVjdCByZWZpbmZvICoqKWFfKTsKKwlzdHJ1Y3QgcmVmaW5mbyAqYiA9ICooKHN0cnVjdCByZWZpbmZvICoqKWJfKTsKKwlzdHJ1Y3QgcmVmX3NvcnQgKnM7CisKKwlmb3IgKHMgPSByZWZfc29ydDsgczsgcyA9IHMtPm5leHQpIHsKKwkJaW50IGNtcCA9IGNtcF9yZWZfc29ydChzLCBhLCBiKTsKKwkJaWYgKGNtcCkKKwkJCXJldHVybiBjbXA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzb3J0X3JlZnMoc3RydWN0IHJlZl9zb3J0ICpzb3J0LCBzdHJ1Y3QgcmVmaW5mbyAqKnJlZnMsIGludCBudW1fcmVmcykKK3sKKwlyZWZfc29ydCA9IHNvcnQ7CisJcXNvcnQocmVmcywgbnVtX3JlZnMsIHNpemVvZihzdHJ1Y3QgcmVmaW5mbyAqKSwgY29tcGFyZV9yZWZzKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfdmFsdWUoc3RydWN0IHJlZmluZm8gKnJlZiwgaW50IGF0b20sIGludCBxdW90ZV9zdHlsZSkKK3sKKwlzdHJ1Y3QgYXRvbV92YWx1ZSAqdjsKKwlnZXRfdmFsdWUocmVmLCBhdG9tLCAmdik7CisJc3dpdGNoIChxdW90ZV9zdHlsZSkgeworCWNhc2UgUVVPVEVfTk9ORToKKwkJZnB1dHModi0+cywgc3Rkb3V0KTsKKwkJYnJlYWs7CisJY2FzZSBRVU9URV9TSEVMTDoKKwkJc3FfcXVvdGVfcHJpbnQoc3Rkb3V0LCB2LT5zKTsKKwkJYnJlYWs7CisJY2FzZSBRVU9URV9QRVJMOgorCQlwZXJsX3F1b3RlX3ByaW50KHN0ZG91dCwgdi0+cyk7CisJCWJyZWFrOworCWNhc2UgUVVPVEVfUFlUSE9OOgorCQlweXRob25fcXVvdGVfcHJpbnQoc3Rkb3V0LCB2LT5zKTsKKwkJYnJlYWs7CisJY2FzZSBRVU9URV9UQ0w6CisJCXRjbF9xdW90ZV9wcmludChzdGRvdXQsIHYtPnMpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaGV4MShjaGFyIGNoKQoreworCWlmICgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKQorCQlyZXR1cm4gY2ggLSAnMCc7CisJZWxzZSBpZiAoJ2EnIDw9IGNoICYmIGNoIDw9ICdmJykKKwkJcmV0dXJuIGNoIC0gJ2EnICsgMTA7CisJZWxzZSBpZiAoJ0EnIDw9IGNoICYmIGNoIDw9ICdGJykKKwkJcmV0dXJuIGNoIC0gJ0EnICsgMTA7CisJcmV0dXJuIC0xOworfQorc3RhdGljIGludCBoZXgyKGNvbnN0IGNoYXIgKmNwKQoreworCWlmIChjcFswXSAmJiBjcFsxXSkKKwkJcmV0dXJuIChoZXgxKGNwWzBdKSA8PCA0KSB8IGhleDEoY3BbMV0pOworCWVsc2UKKwkJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBlbWl0KGNvbnN0IGNoYXIgKmNwLCBjb25zdCBjaGFyICplcCkKK3sKKwl3aGlsZSAoKmNwICYmICghZXAgfHwgY3AgPCBlcCkpIHsKKwkJaWYgKCpjcCA9PSAnJScpIHsKKwkJCWlmIChjcFsxXSA9PSAnJScpCisJCQkJY3ArKzsKKwkJCWVsc2UgeworCQkJCWludCBjaCA9IGhleDIoY3AgKyAxKTsKKwkJCQlpZiAoMCA8PSBjaCkgeworCQkJCQlwdXRjaGFyKGNoKTsKKwkJCQkJY3AgKz0gMzsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQl9CisJCXB1dGNoYXIoKmNwKTsKKwkJY3ArKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfcmVmKHN0cnVjdCByZWZpbmZvICppbmZvLCBjb25zdCBjaGFyICpmb3JtYXQsIGludCBxdW90ZV9zdHlsZSkKK3sKKwljb25zdCBjaGFyICpjcCwgKnNwLCAqZXA7CisKKwlmb3IgKGNwID0gZm9ybWF0OyAqY3AgJiYgKHNwID0gZmluZF9uZXh0KGNwKSk7IGNwID0gZXAgKyAxKSB7CisJCWVwID0gc3RyY2hyKHNwLCAnKScpOworCQlpZiAoY3AgPCBzcCkKKwkJCWVtaXQoY3AsIHNwKTsKKwkJcHJpbnRfdmFsdWUoaW5mbywgcGFyc2VfYXRvbShzcCArIDIsIGVwKSwgcXVvdGVfc3R5bGUpOworCX0KKwlpZiAoKmNwKSB7CisJCXNwID0gY3AgKyBzdHJsZW4oY3ApOworCQllbWl0KGNwLCBzcCk7CisJfQorCXB1dGNoYXIoJ1xuJyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVmX3NvcnQgKmRlZmF1bHRfc29ydCh2b2lkKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGNzdHJfbmFtZVtdID0gInJlZm5hbWUiOworCisJc3RydWN0IHJlZl9zb3J0ICpzb3J0ID0geGNhbGxvYygxLCBzaXplb2YoKnNvcnQpKTsKKworCXNvcnQtPm5leHQgPSBOVUxMOworCXNvcnQtPmF0b20gPSBwYXJzZV9hdG9tKGNzdHJfbmFtZSwgY3N0cl9uYW1lICsgc3RybGVuKGNzdHJfbmFtZSkpOworCXJldHVybiBzb3J0OworfQorCitpbnQgb3B0X3BhcnNlX3NvcnQoY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0LCBjb25zdCBjaGFyICphcmcsIGludCB1bnNldCkKK3sKKwlzdHJ1Y3QgcmVmX3NvcnQgKipzb3J0X3RhaWwgPSBvcHQtPnZhbHVlOworCXN0cnVjdCByZWZfc29ydCAqczsKKwlpbnQgbGVuOworCisJaWYgKCFhcmcpIC8qIHNob3VsZCAtLW5vLXNvcnQgdm9pZCB0aGUgbGlzdCA/ICovCisJCXJldHVybiAtMTsKKworCSpzb3J0X3RhaWwgPSBzID0geGNhbGxvYygxLCBzaXplb2YoKnMpKTsKKwlzb3J0X3RhaWwgPSAmcy0+bmV4dDsKKworCWlmICgqYXJnID09ICctJykgeworCQlzLT5yZXZlcnNlID0gMTsKKwkJYXJnKys7CisJfQorCWxlbiA9IHN0cmxlbihhcmcpOworCXMtPmF0b20gPSBwYXJzZV9hdG9tKGFyZywgYXJnK2xlbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZm9yX2VhY2hfcmVmX3VzYWdlW10gPSB7CisJImdpdC1mb3ItZWFjaC1yZWYgW29wdGlvbnNdIFs8cGF0dGVybj5dIiwKKwlOVUxMCit9OworCitpbnQgY21kX2Zvcl9lYWNoX3JlZihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaSwgbnVtX3JlZnM7CisJY29uc3QgY2hhciAqZm9ybWF0ID0gIiUob2JqZWN0bmFtZSkgJShvYmplY3R0eXBlKVx0JShyZWZuYW1lKSI7CisJc3RydWN0IHJlZl9zb3J0ICpzb3J0ID0gTlVMTCwgKipzb3J0X3RhaWwgPSAmc29ydDsKKwlpbnQgbWF4Y291bnQgPSAwLCBxdW90ZV9zdHlsZSA9IDA7CisJc3RydWN0IHJlZmluZm8gKipyZWZzOworCXN0cnVjdCBncmFiX3JlZl9jYmRhdGEgY2JkYXRhOworCisJc3RydWN0IG9wdGlvbiBvcHRzW10gPSB7CisJCU9QVF9CSVQoJ3MnLCAic2hlbGwiLCAmcXVvdGVfc3R5bGUsCisJCSAgICAgICAgInF1b3RlIHBsYWNlaG9sZGVycyBzdWl0YWJseSBmb3Igc2hlbGxzIiwgUVVPVEVfU0hFTEwpLAorCQlPUFRfQklUKCdwJywgInBlcmwiLCAgJnF1b3RlX3N0eWxlLAorCQkgICAgICAgICJxdW90ZSBwbGFjZWhvbGRlcnMgc3VpdGFibHkgZm9yIHBlcmwiLCBRVU9URV9QRVJMKSwKKwkJT1BUX0JJVCgwICwgInB5dGhvbiIsICZxdW90ZV9zdHlsZSwKKwkJICAgICAgICAicXVvdGUgcGxhY2Vob2xkZXJzIHN1aXRhYmx5IGZvciBweXRob24iLCBRVU9URV9QWVRIT04pLAorCQlPUFRfQklUKDAgLCAidGNsIiwgICZxdW90ZV9zdHlsZSwKKwkJICAgICAgICAicXVvdGUgcGxhY2Vob2xkZXJzIHN1aXRhYmx5IGZvciB0Y2wiLCBRVU9URV9UQ0wpLAorCisJCU9QVF9HUk9VUCgiIiksCisJCU9QVF9JTlRFR0VSKCAwICwgImNvdW50IiwgJm1heGNvdW50LCAic2hvdyBvbmx5IDxuPiBtYXRjaGVkIHJlZnMiKSwKKwkJT1BUX1NUUklORyggIDAgLCAiZm9ybWF0IiwgJmZvcm1hdCwgImZvcm1hdCIsICJmb3JtYXQgdG8gdXNlIGZvciB0aGUgb3V0cHV0IiksCisJCU9QVF9DQUxMQkFDSygwICwgInNvcnQiLCBzb3J0X3RhaWwsICJrZXkiLAorCQkgICAgICAgICAgICAiZmllbGQgbmFtZSB0byBzb3J0IG9uIiwgJm9wdF9wYXJzZV9zb3J0KSwKKwkJT1BUX0VORCgpLAorCX07CisKKwlwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIG9wdHMsIGZvcl9lYWNoX3JlZl91c2FnZSwgMCk7CisJaWYgKG1heGNvdW50IDwgMCkgeworCQllcnJvcigiaW52YWxpZCAtLWNvdW50IGFyZ3VtZW50OiBgJWQnIiwgbWF4Y291bnQpOworCQl1c2FnZV93aXRoX29wdGlvbnMoZm9yX2VhY2hfcmVmX3VzYWdlLCBvcHRzKTsKKwl9CisJaWYgKEhBU19NVUxUSV9CSVRTKHF1b3RlX3N0eWxlKSkgeworCQllcnJvcigibW9yZSB0aGFuIG9uZSBxdW90aW5nIHN0eWxlPyIpOworCQl1c2FnZV93aXRoX29wdGlvbnMoZm9yX2VhY2hfcmVmX3VzYWdlLCBvcHRzKTsKKwl9CisJaWYgKHZlcmlmeV9mb3JtYXQoZm9ybWF0KSkKKwkJdXNhZ2Vfd2l0aF9vcHRpb25zKGZvcl9lYWNoX3JlZl91c2FnZSwgb3B0cyk7CisKKwlpZiAoIXNvcnQpCisJCXNvcnQgPSBkZWZhdWx0X3NvcnQoKTsKKwlzb3J0X2F0b21fbGltaXQgPSB1c2VkX2F0b21fY250OworCisJbWVtc2V0KCZjYmRhdGEsIDAsIHNpemVvZihjYmRhdGEpKTsKKwljYmRhdGEuZ3JhYl9wYXR0ZXJuID0gYXJndjsKKwlmb3JfZWFjaF9yZWYoZ3JhYl9zaW5nbGVfcmVmLCAmY2JkYXRhKTsKKwlyZWZzID0gY2JkYXRhLmdyYWJfYXJyYXk7CisJbnVtX3JlZnMgPSBjYmRhdGEuZ3JhYl9jbnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgdXNlZF9hdG9tX2NudDsgaSsrKSB7CisJCWlmICh1c2VkX2F0b21baV1bMF0gPT0gJyonKSB7CisJCQluZWVkX3RhZ2dlZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCXNvcnRfcmVmcyhzb3J0LCByZWZzLCBudW1fcmVmcyk7CisKKwlpZiAoIW1heGNvdW50IHx8IG51bV9yZWZzIDwgbWF4Y291bnQpCisJCW1heGNvdW50ID0gbnVtX3JlZnM7CisJZm9yIChpID0gMDsgaSA8IG1heGNvdW50OyBpKyspCisJCXNob3dfcmVmKHJlZnNbaV0sIGZvcm1hdCwgcXVvdGVfc3R5bGUpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1mc2NrLmMgYi9idWlsdGluLWZzY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGE2ZTFmCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1mc2NrLmMKQEAgLTAsMCArMSw2NTEgQEAKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJwYWNrLmgiCisjaW5jbHVkZSAiY2FjaGUtdHJlZS5oIgorI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorI2luY2x1ZGUgImZzY2suaCIKKyNpbmNsdWRlICJwYXJzZS1vcHRpb25zLmgiCisKKyNkZWZpbmUgUkVBQ0hBQkxFIDB4MDAwMQorI2RlZmluZSBTRUVOICAgICAgMHgwMDAyCisKK3N0YXRpYyBpbnQgc2hvd19yb290Oworc3RhdGljIGludCBzaG93X3RhZ3M7CitzdGF0aWMgaW50IHNob3dfdW5yZWFjaGFibGU7CitzdGF0aWMgaW50IGluY2x1ZGVfcmVmbG9ncyA9IDE7CitzdGF0aWMgaW50IGNoZWNrX2Z1bGw7CitzdGF0aWMgaW50IGNoZWNrX3N0cmljdDsKK3N0YXRpYyBpbnQga2VlcF9jYWNoZV9vYmplY3RzOworc3RhdGljIHVuc2lnbmVkIGNoYXIgaGVhZF9zaGExWzIwXTsKK3N0YXRpYyBpbnQgZXJyb3JzX2ZvdW5kOworc3RhdGljIGludCB3cml0ZV9sb3N0X2FuZF9mb3VuZDsKK3N0YXRpYyBpbnQgdmVyYm9zZTsKKyNkZWZpbmUgRVJST1JfT0JKRUNUIDAxCisjZGVmaW5lIEVSUk9SX1JFQUNIQUJMRSAwMgorCisjaWZkZWYgTk9fRF9JTk9fSU5fRElSRU5UCisjZGVmaW5lIFNPUlRfRElSRU5UIDAKKyNkZWZpbmUgRElSRU5UX1NPUlRfSElOVChkZSkgMAorI2Vsc2UKKyNkZWZpbmUgU09SVF9ESVJFTlQgMQorI2RlZmluZSBESVJFTlRfU09SVF9ISU5UKGRlKSAoKGRlKS0+ZF9pbm8pCisjZW5kaWYKKworc3RhdGljIHZvaWQgb2JqcmVwb3J0KHN0cnVjdCBvYmplY3QgKm9iaiwgY29uc3QgY2hhciAqc2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyLCB2YV9saXN0IHBhcmFtcykKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIiVzIGluICVzICVzOiAiLAorCSAgICAgICAgc2V2ZXJpdHksIHR5cGVuYW1lKG9iai0+dHlwZSksIHNoYTFfdG9faGV4KG9iai0+c2hhMSkpOworCXZmcHJpbnRmKHN0ZGVyciwgZXJyLCBwYXJhbXMpOworCWZwdXRzKCJcbiIsIHN0ZGVycik7Cit9CisKK3N0YXRpYyBpbnQgb2JqZXJyb3Ioc3RydWN0IG9iamVjdCAqb2JqLCBjb25zdCBjaGFyICplcnIsIC4uLikKK3sKKwl2YV9saXN0IHBhcmFtczsKKwl2YV9zdGFydChwYXJhbXMsIGVycik7CisJZXJyb3JzX2ZvdW5kIHw9IEVSUk9SX09CSkVDVDsKKwlvYmpyZXBvcnQob2JqLCAiZXJyb3IiLCBlcnIsIHBhcmFtcyk7CisJdmFfZW5kKHBhcmFtcyk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGZzY2tfZXJyb3JfZnVuYyhzdHJ1Y3Qgb2JqZWN0ICpvYmosIGludCB0eXBlLCBjb25zdCBjaGFyICplcnIsIC4uLikKK3sKKwl2YV9saXN0IHBhcmFtczsKKwl2YV9zdGFydChwYXJhbXMsIGVycik7CisJb2JqcmVwb3J0KG9iaiwgKHR5cGUgPT0gRlNDS19XQVJOKSA/ICJ3YXJuaW5nIiA6ICJlcnJvciIsIGVyciwgcGFyYW1zKTsKKwl2YV9lbmQocGFyYW1zKTsKKwlyZXR1cm4gKHR5cGUgPT0gRlNDS19XQVJOKSA/IDAgOiAxOworfQorCitzdGF0aWMgaW50IG1hcmtfb2JqZWN0KHN0cnVjdCBvYmplY3QgKm9iaiwgaW50IHR5cGUsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHRyZWUgKnRyZWUgPSBOVUxMOworCXN0cnVjdCBvYmplY3QgKnBhcmVudCA9IGRhdGE7CisJaW50IHJlc3VsdDsKKworCWlmICghb2JqKSB7CisJCXByaW50ZigiYnJva2VuIGxpbmsgZnJvbSAlN3MgJXNcbiIsCisJCQkgICB0eXBlbmFtZShwYXJlbnQtPnR5cGUpLCBzaGExX3RvX2hleChwYXJlbnQtPnNoYTEpKTsKKwkJcHJpbnRmKCJicm9rZW4gbGluayBmcm9tICU3cyAlc1xuIiwKKwkJCSAgICh0eXBlID09IE9CSl9BTlkgPyAidW5rbm93biIgOiB0eXBlbmFtZSh0eXBlKSksICJ1bmtub3duIik7CisJCWVycm9yc19mb3VuZCB8PSBFUlJPUl9SRUFDSEFCTEU7CisJCXJldHVybiAxOworCX0KKworCWlmICh0eXBlICE9IE9CSl9BTlkgJiYgb2JqLT50eXBlICE9IHR5cGUpCisJCW9iamVycm9yKHBhcmVudCwgIndyb25nIG9iamVjdCB0eXBlIGluIGxpbmsiKTsKKworCWlmIChvYmotPmZsYWdzICYgUkVBQ0hBQkxFKQorCQlyZXR1cm4gMDsKKwlvYmotPmZsYWdzIHw9IFJFQUNIQUJMRTsKKwlpZiAoIW9iai0+cGFyc2VkKSB7CisJCWlmIChwYXJlbnQgJiYgIWhhc19zaGExX2ZpbGUob2JqLT5zaGExKSkgeworCQkJcHJpbnRmKCJicm9rZW4gbGluayBmcm9tICU3cyAlc1xuIiwKKwkJCQkgdHlwZW5hbWUocGFyZW50LT50eXBlKSwgc2hhMV90b19oZXgocGFyZW50LT5zaGExKSk7CisJCQlwcmludGYoIiAgICAgICAgICAgICAgdG8gJTdzICVzXG4iLAorCQkJCSB0eXBlbmFtZShvYmotPnR5cGUpLCBzaGExX3RvX2hleChvYmotPnNoYTEpKTsKKwkJCWVycm9yc19mb3VuZCB8PSBFUlJPUl9SRUFDSEFCTEU7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKG9iai0+dHlwZSA9PSBPQkpfVFJFRSkgeworCQlvYmotPnBhcnNlZCA9IDA7CisJCXRyZWUgPSAoc3RydWN0IHRyZWUgKilvYmo7CisJCWlmIChwYXJzZV90cmVlKHRyZWUpIDwgMCkKKwkJCXJldHVybiAxOyAvKiBlcnJvciBhbHJlYWR5IGRpc3BsYXllZCAqLworCX0KKwlyZXN1bHQgPSBmc2NrX3dhbGsob2JqLCBtYXJrX29iamVjdCwgb2JqKTsKKwlpZiAodHJlZSkgeworCQlmcmVlKHRyZWUtPmJ1ZmZlcik7CisJCXRyZWUtPmJ1ZmZlciA9IE5VTEw7CisJfQorCWlmIChyZXN1bHQgPCAwKQorCQlyZXN1bHQgPSAxOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgbWFya19vYmplY3RfcmVhY2hhYmxlKHN0cnVjdCBvYmplY3QgKm9iaikKK3sKKwltYXJrX29iamVjdChvYmosIE9CSl9BTlksIDApOworfQorCitzdGF0aWMgaW50IG1hcmtfdXNlZChzdHJ1Y3Qgb2JqZWN0ICpvYmosIGludCB0eXBlLCB2b2lkICpkYXRhKQoreworCWlmICghb2JqKQorCQlyZXR1cm4gMTsKKwlvYmotPnVzZWQgPSAxOworCXJldHVybiAwOworfQorCisvKgorICogQ2hlY2sgYSBzaW5nbGUgcmVhY2hhYmxlIG9iamVjdAorICovCitzdGF0aWMgdm9pZCBjaGVja19yZWFjaGFibGVfb2JqZWN0KHN0cnVjdCBvYmplY3QgKm9iaikKK3sKKwkvKgorCSAqIFdlIG9idmlvdXNseSB3YW50IHRoZSBvYmplY3QgdG8gYmUgcGFyc2VkLAorCSAqIGV4Y2VwdCBpZiBpdCB3YXMgaW4gYSBwYWNrLWZpbGUgYW5kIHdlIGRpZG4ndAorCSAqIGRvIGEgZnVsbCBmc2NrCisJICovCisJaWYgKCFvYmotPnBhcnNlZCkgeworCQlpZiAoaGFzX3NoYTFfcGFjayhvYmotPnNoYTEsIE5VTEwpKQorCQkJcmV0dXJuOyAvKiBpdCBpcyBpbiBwYWNrIC0gZm9yZ2V0IGFib3V0IGl0ICovCisJCXByaW50ZigibWlzc2luZyAlcyAlc1xuIiwgdHlwZW5hbWUob2JqLT50eXBlKSwgc2hhMV90b19oZXgob2JqLT5zaGExKSk7CisJCWVycm9yc19mb3VuZCB8PSBFUlJPUl9SRUFDSEFCTEU7CisJCXJldHVybjsKKwl9Cit9CisKKy8qCisgKiBDaGVjayBhIHNpbmdsZSB1bnJlYWNoYWJsZSBvYmplY3QKKyAqLworc3RhdGljIHZvaWQgY2hlY2tfdW5yZWFjaGFibGVfb2JqZWN0KHN0cnVjdCBvYmplY3QgKm9iaikKK3sKKwkvKgorCSAqIE1pc3NpbmcgdW5yZWFjaGFibGUgb2JqZWN0PyBJZ25vcmUgaXQuIEl0J3Mgbm90IGxpa2UKKwkgKiB3ZSBtaXNzIGl0IChzaW5jZSBpdCBjYW4ndCBiZSByZWFjaGVkKSwgbm9yIGRvIHdlIHdhbnQKKwkgKiB0byBjb21wbGFpbiBhYm91dCBpdCBiZWluZyB1bnJlYWNoYWJsZSAoc2luY2UgaXQgZG9lcworCSAqIG5vdCBleGlzdCkuCisJICovCisJaWYgKCFvYmotPnBhcnNlZCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBVbnJlYWNoYWJsZSBvYmplY3QgdGhhdCBleGlzdHM/IFNob3cgaXQgaWYgYXNrZWQgdG8sCisJICogc2luY2UgdGhpcyBpcyBzb21ldGhpbmcgdGhhdCBpcyBwcnVuYWJsZS4KKwkgKi8KKwlpZiAoc2hvd191bnJlYWNoYWJsZSkgeworCQlwcmludGYoInVucmVhY2hhYmxlICVzICVzXG4iLCB0eXBlbmFtZShvYmotPnR5cGUpLCBzaGExX3RvX2hleChvYmotPnNoYTEpKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogIiF1c2VkIiBtZWFucyB0aGF0IG5vdGhpbmcgYXQgYWxsIHBvaW50cyB0byBpdCwgaW5jbHVkaW5nCisJICogb3RoZXIgdW5yZWFjaGFibGUgb2JqZWN0cy4gSW4gb3RoZXIgd29yZHMsIGl0J3MgdGhlICJ0aXAiCisJICogb2Ygc29tZSBzZXQgb2YgdW5yZWFjaGFibGUgb2JqZWN0cywgdXN1YWxseSBhIGNvbW1pdCB0aGF0CisJICogZ290IGRyb3BwZWQuCisJICoKKwkgKiBTdWNoIHN0YXJ0aW5nIHBvaW50cyBhcmUgbW9yZSBpbnRlcmVzdGluZyB0aGFuIHNvbWUgcmFuZG9tCisJICogc2V0IG9mIHVucmVhY2hhYmxlIG9iamVjdHMsIHNvIHdlIHNob3cgdGhlbSBldmVuIGlmIHRoZSB1c2VyCisJICogaGFzbid0IGFza2VkIGZvciBfYWxsXyB1bnJlYWNoYWJsZSBvYmplY3RzLiBJZiB5b3UgaGF2ZQorCSAqIGRlbGV0ZWQgYSBicmFuY2ggYnkgbWlzdGFrZSwgdGhpcyBpcyBhIHByaW1lIGNhbmRpZGF0ZSB0bworCSAqIHN0YXJ0IGxvb2tpbmcgYXQsIGZvciBleGFtcGxlLgorCSAqLworCWlmICghb2JqLT51c2VkKSB7CisJCXByaW50ZigiZGFuZ2xpbmcgJXMgJXNcbiIsIHR5cGVuYW1lKG9iai0+dHlwZSksCisJCSAgICAgICBzaGExX3RvX2hleChvYmotPnNoYTEpKTsKKwkJaWYgKHdyaXRlX2xvc3RfYW5kX2ZvdW5kKSB7CisJCQljaGFyICpmaWxlbmFtZSA9IGdpdF9wYXRoKCJsb3N0LWZvdW5kLyVzLyVzIiwKKwkJCQlvYmotPnR5cGUgPT0gT0JKX0NPTU1JVCA/ICJjb21taXQiIDogIm90aGVyIiwKKwkJCQlzaGExX3RvX2hleChvYmotPnNoYTEpKTsKKwkJCUZJTEUgKmY7CisKKwkJCWlmIChzYWZlX2NyZWF0ZV9sZWFkaW5nX2RpcmVjdG9yaWVzKGZpbGVuYW1lKSkgeworCQkJCWVycm9yKCJDb3VsZCBub3QgY3JlYXRlIGxvc3QtZm91bmQiKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAoIShmID0gZm9wZW4oZmlsZW5hbWUsICJ3IikpKQorCQkJCWRpZSgiQ291bGQgbm90IG9wZW4gJXMiLCBmaWxlbmFtZSk7CisJCQlpZiAob2JqLT50eXBlID09IE9CSl9CTE9CKSB7CisJCQkJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwkJCQljaGFyICpidWYgPSByZWFkX3NoYTFfZmlsZShvYmotPnNoYTEsCisJCQkJCQkmdHlwZSwgJnNpemUpOworCQkJCWlmIChidWYpIHsKKwkJCQkJZndyaXRlKGJ1Ziwgc2l6ZSwgMSwgZik7CisJCQkJCWZyZWUoYnVmKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlmcHJpbnRmKGYsICIlc1xuIiwgc2hhMV90b19oZXgob2JqLT5zaGExKSk7CisJCQlmY2xvc2UoZik7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qCisJICogT3RoZXJ3aXNlPyBJdCdzIHRoZXJlLCBpdCdzIHVucmVhY2hhYmxlLCBhbmQgc29tZSBvdGhlciB1bnJlYWNoYWJsZQorCSAqIG9iamVjdCBwb2ludHMgdG8gaXQuIElnbm9yZSBpdCAtIGl0J3Mgbm90IGludGVyZXN0aW5nLCBhbmQgd2Ugc2hvd2VkCisJICogYWxsIHRoZSBpbnRlcmVzdGluZyBjYXNlcyBhYm92ZS4KKwkgKi8KK30KKworc3RhdGljIHZvaWQgY2hlY2tfb2JqZWN0KHN0cnVjdCBvYmplY3QgKm9iaikKK3sKKwlpZiAodmVyYm9zZSkKKwkJZnByaW50ZihzdGRlcnIsICJDaGVja2luZyAlc1xuIiwgc2hhMV90b19oZXgob2JqLT5zaGExKSk7CisKKwlpZiAob2JqLT5mbGFncyAmIFJFQUNIQUJMRSkKKwkJY2hlY2tfcmVhY2hhYmxlX29iamVjdChvYmopOworCWVsc2UKKwkJY2hlY2tfdW5yZWFjaGFibGVfb2JqZWN0KG9iaik7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2Nvbm5lY3Rpdml0eSh2b2lkKQoreworCWludCBpLCBtYXg7CisKKwkvKiBMb29rIHVwIGFsbCB0aGUgcmVxdWlyZW1lbnRzLCB3YXJuIGFib3V0IG1pc3Npbmcgb2JqZWN0cy4uICovCisJbWF4ID0gZ2V0X21heF9vYmplY3RfaW5kZXgoKTsKKwlpZiAodmVyYm9zZSkKKwkJZnByaW50ZihzdGRlcnIsICJDaGVja2luZyBjb25uZWN0aXZpdHkgKCVkIG9iamVjdHMpXG4iLCBtYXgpOworCisJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3QgKm9iaiA9IGdldF9pbmRleGVkX29iamVjdChpKTsKKworCQlpZiAob2JqKQorCQkJY2hlY2tfb2JqZWN0KG9iaik7CisJfQorfQorCitzdGF0aWMgaW50IGZzY2tfc2hhMShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBvYmplY3QgKm9iaiA9IHBhcnNlX29iamVjdChzaGExKTsKKwlpZiAoIW9iaikgeworCQllcnJvcnNfZm91bmQgfD0gRVJST1JfT0JKRUNUOworCQlyZXR1cm4gZXJyb3IoIiVzOiBvYmplY3QgY29ycnVwdCBvciBtaXNzaW5nIiwKKwkJCSAgICAgc2hhMV90b19oZXgoc2hhMSkpOworCX0KKwlpZiAob2JqLT5mbGFncyAmIFNFRU4pCisJCXJldHVybiAwOworCW9iai0+ZmxhZ3MgfD0gU0VFTjsKKworCWlmICh2ZXJib3NlKQorCQlmcHJpbnRmKHN0ZGVyciwgIkNoZWNraW5nICVzICVzXG4iLAorCQkJdHlwZW5hbWUob2JqLT50eXBlKSwgc2hhMV90b19oZXgob2JqLT5zaGExKSk7CisKKwlpZiAoZnNja193YWxrKG9iaiwgbWFya191c2VkLCAwKSkKKwkJb2JqZXJyb3Iob2JqLCAiYnJva2VuIGxpbmtzIik7CisJaWYgKGZzY2tfb2JqZWN0KG9iaiwgY2hlY2tfc3RyaWN0LCBmc2NrX2Vycm9yX2Z1bmMpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAob2JqLT50eXBlID09IE9CSl9UUkVFKSB7CisJCXN0cnVjdCB0cmVlICppdGVtID0gKHN0cnVjdCB0cmVlICopIG9iajsKKworCQlmcmVlKGl0ZW0tPmJ1ZmZlcik7CisJCWl0ZW0tPmJ1ZmZlciA9IE5VTEw7CisJfQorCisJaWYgKG9iai0+dHlwZSA9PSBPQkpfQ09NTUlUKSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IChzdHJ1Y3QgY29tbWl0ICopIG9iajsKKworCQlmcmVlKGNvbW1pdC0+YnVmZmVyKTsKKwkJY29tbWl0LT5idWZmZXIgPSBOVUxMOworCisJCWlmICghY29tbWl0LT5wYXJlbnRzICYmIHNob3dfcm9vdCkKKwkJCXByaW50Zigicm9vdCAlc1xuIiwgc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCX0KKworCWlmIChvYmotPnR5cGUgPT0gT0JKX1RBRykgeworCQlzdHJ1Y3QgdGFnICp0YWcgPSAoc3RydWN0IHRhZyAqKSBvYmo7CisKKwkJaWYgKHNob3dfdGFncyAmJiB0YWctPnRhZ2dlZCkgeworCQkJcHJpbnRmKCJ0YWdnZWQgJXMgJXMiLCB0eXBlbmFtZSh0YWctPnRhZ2dlZC0+dHlwZSksIHNoYTFfdG9faGV4KHRhZy0+dGFnZ2VkLT5zaGExKSk7CisJCQlwcmludGYoIiAoJXMpIGluICVzXG4iLCB0YWctPnRhZywgc2hhMV90b19oZXgodGFnLT5vYmplY3Quc2hhMSkpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBzb3J0aW5nIGNodW5rIHNpemU6IG1ha2UgaXQgcmVhc29uYWJseQorICogYmlnIHNvIHRoYXQgd2UgY2FuIHNvcnQgd2VsbC4uCisgKi8KKyNkZWZpbmUgTUFYX1NIQTFfRU5UUklFUyAoMTAyNCkKKworc3RydWN0IHNoYTFfZW50cnkgeworCXVuc2lnbmVkIGxvbmcgaW5vOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07Cit9OworCitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIG5yOworCXN0cnVjdCBzaGExX2VudHJ5ICplbnRyeVtNQVhfU0hBMV9FTlRSSUVTXTsKK30gc2hhMV9saXN0OworCitzdGF0aWMgaW50IGlub19jb21wYXJlKGNvbnN0IHZvaWQgKl9hLCBjb25zdCB2b2lkICpfYikKK3sKKwljb25zdCBzdHJ1Y3Qgc2hhMV9lbnRyeSAqYSA9IF9hLCAqYiA9IF9iOworCXVuc2lnbmVkIGxvbmcgaW5vMSA9IGEtPmlubywgaW5vMiA9IGItPmlubzsKKwlyZXR1cm4gaW5vMSA8IGlubzIgPyAtMSA6IGlubzEgPiBpbm8yID8gMSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIGZzY2tfc2hhMV9saXN0KHZvaWQpCit7CisJaW50IGksIG5yID0gc2hhMV9saXN0Lm5yOworCisJaWYgKFNPUlRfRElSRU5UKQorCQlxc29ydChzaGExX2xpc3QuZW50cnksIG5yLAorCQkgICAgICBzaXplb2Yoc3RydWN0IHNoYTFfZW50cnkgKiksIGlub19jb21wYXJlKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworCQlzdHJ1Y3Qgc2hhMV9lbnRyeSAqZW50cnkgPSBzaGExX2xpc3QuZW50cnlbaV07CisJCXVuc2lnbmVkIGNoYXIgKnNoYTEgPSBlbnRyeS0+c2hhMTsKKworCQlzaGExX2xpc3QuZW50cnlbaV0gPSBOVUxMOworCQlmc2NrX3NoYTEoc2hhMSk7CisJCWZyZWUoZW50cnkpOworCX0KKwlzaGExX2xpc3QubnIgPSAwOworfQorCitzdGF0aWMgdm9pZCBhZGRfc2hhMV9saXN0KHVuc2lnbmVkIGNoYXIgKnNoYTEsIHVuc2lnbmVkIGxvbmcgaW5vKQoreworCXN0cnVjdCBzaGExX2VudHJ5ICplbnRyeSA9IHhtYWxsb2Moc2l6ZW9mKCplbnRyeSkpOworCWludCBucjsKKworCWVudHJ5LT5pbm8gPSBpbm87CisJaGFzaGNweShlbnRyeS0+c2hhMSwgc2hhMSk7CisJbnIgPSBzaGExX2xpc3QubnI7CisJaWYgKG5yID09IE1BWF9TSEExX0VOVFJJRVMpIHsKKwkJZnNja19zaGExX2xpc3QoKTsKKwkJbnIgPSAwOworCX0KKwlzaGExX2xpc3QuZW50cnlbbnJdID0gZW50cnk7CisJc2hhMV9saXN0Lm5yID0gKytucjsKK30KKworc3RhdGljIHZvaWQgZnNja19kaXIoaW50IGksIGNoYXIgKnBhdGgpCit7CisJRElSICpkaXIgPSBvcGVuZGlyKHBhdGgpOworCXN0cnVjdCBkaXJlbnQgKmRlOworCisJaWYgKCFkaXIpCisJCXJldHVybjsKKworCWlmICh2ZXJib3NlKQorCQlmcHJpbnRmKHN0ZGVyciwgIkNoZWNraW5nIGRpcmVjdG9yeSAlc1xuIiwgcGF0aCk7CisKKwl3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCWNoYXIgbmFtZVsxMDBdOworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQlpbnQgbGVuID0gc3RybGVuKGRlLT5kX25hbWUpOworCisJCXN3aXRjaCAobGVuKSB7CisJCWNhc2UgMjoKKwkJCWlmIChkZS0+ZF9uYW1lWzFdICE9ICcuJykKKwkJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJaWYgKGRlLT5kX25hbWVbMF0gIT0gJy4nKQorCQkJCWJyZWFrOworCQkJY29udGludWU7CisJCWNhc2UgMzg6CisJCQlzcHJpbnRmKG5hbWUsICIlMDJ4IiwgaSk7CisJCQltZW1jcHkobmFtZSsyLCBkZS0+ZF9uYW1lLCBsZW4rMSk7CisJCQlpZiAoZ2V0X3NoYTFfaGV4KG5hbWUsIHNoYTEpIDwgMCkKKwkJCQlicmVhazsKKwkJCWFkZF9zaGExX2xpc3Qoc2hhMSwgRElSRU5UX1NPUlRfSElOVChkZSkpOworCQkJY29udGludWU7CisJCX0KKwkJZnByaW50ZihzdGRlcnIsICJiYWQgc2hhMSBmaWxlOiAlcy8lc1xuIiwgcGF0aCwgZGUtPmRfbmFtZSk7CisJfQorCWNsb3NlZGlyKGRpcik7Cit9CisKK3N0YXRpYyBpbnQgZGVmYXVsdF9yZWZzOworCitzdGF0aWMgaW50IGZzY2tfaGFuZGxlX3JlZmxvZ19lbnQodW5zaWduZWQgY2hhciAqb3NoYTEsIHVuc2lnbmVkIGNoYXIgKm5zaGExLAorCQljb25zdCBjaGFyICplbWFpbCwgdW5zaWduZWQgbG9uZyB0aW1lc3RhbXAsIGludCB0eiwKKwkJY29uc3QgY2hhciAqbWVzc2FnZSwgdm9pZCAqY2JfZGF0YSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmo7CisKKwlpZiAodmVyYm9zZSkKKwkJZnByaW50ZihzdGRlcnIsICJDaGVja2luZyByZWZsb2cgJXMtPiVzXG4iLAorCQkJc2hhMV90b19oZXgob3NoYTEpLCBzaGExX3RvX2hleChuc2hhMSkpOworCisJaWYgKCFpc19udWxsX3NoYTEob3NoYTEpKSB7CisJCW9iaiA9IGxvb2t1cF9vYmplY3Qob3NoYTEpOworCQlpZiAob2JqKSB7CisJCQlvYmotPnVzZWQgPSAxOworCQkJbWFya19vYmplY3RfcmVhY2hhYmxlKG9iaik7CisJCX0KKwl9CisJb2JqID0gbG9va3VwX29iamVjdChuc2hhMSk7CisJaWYgKG9iaikgeworCQlvYmotPnVzZWQgPSAxOworCQltYXJrX29iamVjdF9yZWFjaGFibGUob2JqKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnNja19oYW5kbGVfcmVmbG9nKGNvbnN0IGNoYXIgKmxvZ25hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFnLCB2b2lkICpjYl9kYXRhKQoreworCWZvcl9lYWNoX3JlZmxvZ19lbnQobG9nbmFtZSwgZnNja19oYW5kbGVfcmVmbG9nX2VudCwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNfYnJhbmNoKGNvbnN0IGNoYXIgKnJlZm5hbWUpCit7CisJcmV0dXJuICFzdHJjbXAocmVmbmFtZSwgIkhFQUQiKSB8fCAhcHJlZml4Y21wKHJlZm5hbWUsICJyZWZzL2hlYWRzLyIpOworfQorCitzdGF0aWMgaW50IGZzY2tfaGFuZGxlX3JlZihjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmxhZywgdm9pZCAqY2JfZGF0YSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmo7CisKKwlvYmogPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJaWYgKCFvYmopIHsKKwkJZXJyb3IoIiVzOiBpbnZhbGlkIHNoYTEgcG9pbnRlciAlcyIsIHJlZm5hbWUsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJLyogV2UnbGwgY29udGludWUgd2l0aCB0aGUgcmVzdCBkZXNwaXRlIHRoZSBlcnJvci4uICovCisJCXJldHVybiAwOworCX0KKwlpZiAob2JqLT50eXBlICE9IE9CSl9DT01NSVQgJiYgaXNfYnJhbmNoKHJlZm5hbWUpKQorCQllcnJvcigiJXM6IG5vdCBhIGNvbW1pdCIsIHJlZm5hbWUpOworCWRlZmF1bHRfcmVmcysrOworCW9iai0+dXNlZCA9IDE7CisJbWFya19vYmplY3RfcmVhY2hhYmxlKG9iaik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2V0X2RlZmF1bHRfaGVhZHModm9pZCkKK3sKKwlmb3JfZWFjaF9yZWYoZnNja19oYW5kbGVfcmVmLCBOVUxMKTsKKwlpZiAoaW5jbHVkZV9yZWZsb2dzKQorCQlmb3JfZWFjaF9yZWZsb2coZnNja19oYW5kbGVfcmVmbG9nLCBOVUxMKTsKKworCS8qCisJICogTm90IGhhdmluZyBhbnkgZGVmYXVsdCBoZWFkcyBpc24ndCByZWFsbHkgZmF0YWwsIGJ1dAorCSAqIGl0IGRvZXMgbWVhbiB0aGF0ICItLXVucmVhY2hhYmxlIiBubyBsb25nZXIgbWFrZXMgYW55CisJICogc2Vuc2UgKHNpbmNlIGluIHRoaXMgY2FzZSBldmVyeXRoaW5nIHdpbGwgb2J2aW91c2x5CisJICogYmUgdW5yZWFjaGFibGUgYnkgZGVmaW5pdGlvbi4KKwkgKgorCSAqIFNob3dpbmcgZGFuZ2xpbmcgb2JqZWN0cyBpcyB2YWxpZCwgdGhvdWdoIChhcyB0aG9zZQorCSAqIGRhbmdsaW5nIG9iamVjdHMgYXJlIGxpa2VseSBsb3N0IGhlYWRzKS4KKwkgKgorCSAqIFNvIHdlIGp1c3QgcHJpbnQgYSB3YXJuaW5nIGFib3V0IGl0LCBhbmQgY2xlYXIgdGhlCisJICogInNob3dfdW5yZWFjaGFibGUiIGZsYWcuCisJICovCisJaWYgKCFkZWZhdWx0X3JlZnMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJub3RpY2U6IE5vIGRlZmF1bHQgcmVmZXJlbmNlc1xuIik7CisJCXNob3dfdW5yZWFjaGFibGUgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgZnNja19vYmplY3RfZGlyKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IGk7CisKKwlpZiAodmVyYm9zZSkKKwkJZnByaW50ZihzdGRlcnIsICJDaGVja2luZyBvYmplY3QgZGlyZWN0b3J5XG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlzdGF0aWMgY2hhciBkaXJbNDA5Nl07CisJCXNwcmludGYoZGlyLCAiJXMvJTAyeCIsIHBhdGgsIGkpOworCQlmc2NrX2RpcihpLCBkaXIpOworCX0KKwlmc2NrX3NoYTFfbGlzdCgpOworfQorCitzdGF0aWMgaW50IGZzY2tfaGVhZF9saW5rKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlpbnQgZmxhZzsKKwlpbnQgbnVsbF9pc19lcnJvciA9IDA7CisJY29uc3QgY2hhciAqaGVhZF9wb2ludHNfYXQgPSByZXNvbHZlX3JlZigiSEVBRCIsIHNoYTEsIDAsICZmbGFnKTsKKworCWlmICh2ZXJib3NlKQorCQlmcHJpbnRmKHN0ZGVyciwgIkNoZWNraW5nIEhFQUQgbGlua1xuIik7CisKKwlpZiAoIWhlYWRfcG9pbnRzX2F0KQorCQlyZXR1cm4gZXJyb3IoIkludmFsaWQgSEVBRCIpOworCWlmICghc3RyY21wKGhlYWRfcG9pbnRzX2F0LCAiSEVBRCIpKQorCQkvKiBkZXRhY2hlZCBIRUFEICovCisJCW51bGxfaXNfZXJyb3IgPSAxOworCWVsc2UgaWYgKHByZWZpeGNtcChoZWFkX3BvaW50c19hdCwgInJlZnMvaGVhZHMvIikpCisJCXJldHVybiBlcnJvcigiSEVBRCBwb2ludHMgdG8gc29tZXRoaW5nIHN0cmFuZ2UgKCVzKSIsCisJCQkgICAgIGhlYWRfcG9pbnRzX2F0KTsKKwlpZiAoaXNfbnVsbF9zaGExKHNoYTEpKSB7CisJCWlmIChudWxsX2lzX2Vycm9yKQorCQkJcmV0dXJuIGVycm9yKCJIRUFEOiBkZXRhY2hlZCBIRUFEIHBvaW50cyBhdCBub3RoaW5nIik7CisJCWZwcmludGYoc3RkZXJyLCAibm90aWNlOiBIRUFEIHBvaW50cyB0byBhbiB1bmJvcm4gYnJhbmNoICglcylcbiIsCisJCQloZWFkX3BvaW50c19hdCArIDExKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnNja19jYWNoZV90cmVlKHN0cnVjdCBjYWNoZV90cmVlICppdCkKK3sKKwlpbnQgaTsKKwlpbnQgZXJyID0gMDsKKworCWlmICh2ZXJib3NlKQorCQlmcHJpbnRmKHN0ZGVyciwgIkNoZWNraW5nIGNhY2hlIHRyZWVcbiIpOworCisJaWYgKDAgPD0gaXQtPmVudHJ5X2NvdW50KSB7CisJCXN0cnVjdCBvYmplY3QgKm9iaiA9IHBhcnNlX29iamVjdChpdC0+c2hhMSk7CisJCWlmICghb2JqKSB7CisJCQllcnJvcigiJXM6IGludmFsaWQgc2hhMSBwb2ludGVyIGluIGNhY2hlLXRyZWUiLAorCQkJICAgICAgc2hhMV90b19oZXgoaXQtPnNoYTEpKTsKKwkJCXJldHVybiAxOworCQl9CisJCW1hcmtfb2JqZWN0X3JlYWNoYWJsZShvYmopOworCQlvYmotPnVzZWQgPSAxOworCQlpZiAob2JqLT50eXBlICE9IE9CSl9UUkVFKQorCQkJZXJyIHw9IG9iamVycm9yKG9iaiwgIm5vbi10cmVlIGluIGNhY2hlLXRyZWUiKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGl0LT5zdWJ0cmVlX25yOyBpKyspCisJCWVyciB8PSBmc2NrX2NhY2hlX3RyZWUoaXQtPmRvd25baV0tPmNhY2hlX3RyZWUpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZnNja191c2FnZVtdID0geworCSJnaXQtZnNjayBbb3B0aW9uc10gWzxvYmplY3Q+Li4uXSIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBvcHRpb24gZnNja19vcHRzW10gPSB7CisJT1BUX19WRVJCT1NFKCZ2ZXJib3NlKSwKKwlPUFRfQk9PTEVBTigwLCAidW5yZWFjaGFibGUiLCAmc2hvd191bnJlYWNoYWJsZSwgInNob3cgdW5yZWFjaGFibGUgb2JqZWN0cyIpLAorCU9QVF9CT09MRUFOKDAsICJ0YWdzIiwgJnNob3dfdGFncywgInJlcG9ydCB0YWdzIiksCisJT1BUX0JPT0xFQU4oMCwgInJvb3QiLCAmc2hvd19yb290LCAicmVwb3J0IHJvb3Qgbm9kZXMiKSwKKwlPUFRfQk9PTEVBTigwLCAiY2FjaGUiLCAma2VlcF9jYWNoZV9vYmplY3RzLCAibWFrZSBpbmRleCBvYmplY3RzIGhlYWQgbm9kZXMiKSwKKwlPUFRfQk9PTEVBTigwLCAicmVmbG9ncyIsICZpbmNsdWRlX3JlZmxvZ3MsICJtYWtlIHJlZmxvZ3MgaGVhZCBub2RlcyAoZGVmYXVsdCkiKSwKKwlPUFRfQk9PTEVBTigwLCAiZnVsbCIsICZjaGVja19mdWxsLCAiYWxzbyBjb25zaWRlciBhbHRlcm5hdGUgb2JqZWN0cyIpLAorCU9QVF9CT09MRUFOKDAsICJzdHJpY3QiLCAmY2hlY2tfc3RyaWN0LCAiZW5hYmxlIG1vcmUgc3RyaWN0IGNoZWNraW5nIiksCisJT1BUX0JPT0xFQU4oMCwgImxvc3QtZm91bmQiLCAmd3JpdGVfbG9zdF9hbmRfZm91bmQsCisJCQkJIndyaXRlIGRhbmdsaW5nIG9iamVjdHMgaW4gLmdpdC9sb3N0LWZvdW5kIiksCisJT1BUX0VORCgpLAorfTsKKworaW50IGNtZF9mc2NrKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBpLCBoZWFkczsKKworCWVycm9yc19mb3VuZCA9IDA7CisKKwlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBmc2NrX29wdHMsIGZzY2tfdXNhZ2UsIDApOworCWlmICh3cml0ZV9sb3N0X2FuZF9mb3VuZCkgeworCQljaGVja19mdWxsID0gMTsKKwkJaW5jbHVkZV9yZWZsb2dzID0gMDsKKwl9CisKKwlmc2NrX2hlYWRfbGluaygpOworCWZzY2tfb2JqZWN0X2RpcihnZXRfb2JqZWN0X2RpcmVjdG9yeSgpKTsKKwlpZiAoY2hlY2tfZnVsbCkgeworCQlzdHJ1Y3QgYWx0ZXJuYXRlX29iamVjdF9kYXRhYmFzZSAqYWx0OworCQlzdHJ1Y3QgcGFja2VkX2dpdCAqcDsKKwkJcHJlcGFyZV9hbHRfb2RiKCk7CisJCWZvciAoYWx0ID0gYWx0X29kYl9saXN0OyBhbHQ7IGFsdCA9IGFsdC0+bmV4dCkgeworCQkJY2hhciBuYW1lYnVmW1BBVEhfTUFYXTsKKwkJCWludCBuYW1lbGVuID0gYWx0LT5uYW1lIC0gYWx0LT5iYXNlOworCQkJbWVtY3B5KG5hbWVidWYsIGFsdC0+YmFzZSwgbmFtZWxlbik7CisJCQluYW1lYnVmW25hbWVsZW4gLSAxXSA9IDA7CisJCQlmc2NrX29iamVjdF9kaXIobmFtZWJ1Zik7CisJCX0KKwkJcHJlcGFyZV9wYWNrZWRfZ2l0KCk7CisJCWZvciAocCA9IHBhY2tlZF9naXQ7IHA7IHAgPSBwLT5uZXh0KQorCQkJLyogdmVyaWZ5IGdpdmVzIGVycm9yIG1lc3NhZ2VzIGl0c2VsZiAqLworCQkJdmVyaWZ5X3BhY2socCwgMCk7CisKKwkJZm9yIChwID0gcGFja2VkX2dpdDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJCXVpbnQzMl90IGosIG51bTsKKwkJCWlmIChvcGVuX3BhY2tfaW5kZXgocCkpCisJCQkJY29udGludWU7CisJCQludW0gPSBwLT5udW1fb2JqZWN0czsKKwkJCWZvciAoaiA9IDA7IGogPCBudW07IGorKykKKwkJCQlmc2NrX3NoYTEobnRoX3BhY2tlZF9vYmplY3Rfc2hhMShwLCBqKSk7CisJCX0KKwl9CisKKwloZWFkcyA9IDA7CisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCQlpZiAoIWdldF9zaGExKGFyZywgaGVhZF9zaGExKSkgeworCQkJc3RydWN0IG9iamVjdCAqb2JqID0gbG9va3VwX29iamVjdChoZWFkX3NoYTEpOworCisJCQkvKiBFcnJvciBpcyBwcmludGVkIGJ5IGxvb2t1cF9vYmplY3QoKS4gKi8KKwkJCWlmICghb2JqKQorCQkJCWNvbnRpbnVlOworCisJCQlvYmotPnVzZWQgPSAxOworCQkJbWFya19vYmplY3RfcmVhY2hhYmxlKG9iaik7CisJCQloZWFkcysrOworCQkJY29udGludWU7CisJCX0KKwkJZXJyb3IoImludmFsaWQgcGFyYW1ldGVyOiBleHBlY3RlZCBzaGExLCBnb3QgJyVzJyIsIGFyZyk7CisJfQorCisJLyoKKwkgKiBJZiB3ZSd2ZSBub3QgYmVlbiBnaXZlbiBhbnkgZXhwbGljaXQgaGVhZCBpbmZvcm1hdGlvbiwgZG8gdGhlCisJICogZGVmYXVsdCBvbmVzIGZyb20gLmdpdC9yZWZzLiBXZSBhbHNvIGNvbnNpZGVyIHRoZSBpbmRleCBmaWxlCisJICogaW4gdGhpcyBjYXNlIChpZSB0aGlzIGltcGxpZXMgLS1jYWNoZSkuCisJICovCisJaWYgKCFoZWFkcykgeworCQlnZXRfZGVmYXVsdF9oZWFkcygpOworCQlrZWVwX2NhY2hlX29iamVjdHMgPSAxOworCX0KKworCWlmIChrZWVwX2NhY2hlX29iamVjdHMpIHsKKwkJcmVhZF9jYWNoZSgpOworCQlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yOyBpKyspIHsKKwkJCXVuc2lnbmVkIGludCBtb2RlOworCQkJc3RydWN0IGJsb2IgKmJsb2I7CisJCQlzdHJ1Y3Qgb2JqZWN0ICpvYmo7CisKKwkJCW1vZGUgPSBhY3RpdmVfY2FjaGVbaV0tPmNlX21vZGU7CisJCQlpZiAoU19JU0dJVExJTksobW9kZSkpCisJCQkJY29udGludWU7CisJCQlibG9iID0gbG9va3VwX2Jsb2IoYWN0aXZlX2NhY2hlW2ldLT5zaGExKTsKKwkJCWlmICghYmxvYikKKwkJCQljb250aW51ZTsKKwkJCW9iaiA9ICZibG9iLT5vYmplY3Q7CisJCQlvYmotPnVzZWQgPSAxOworCQkJbWFya19vYmplY3RfcmVhY2hhYmxlKG9iaik7CisJCX0KKwkJaWYgKGFjdGl2ZV9jYWNoZV90cmVlKQorCQkJZnNja19jYWNoZV90cmVlKGFjdGl2ZV9jYWNoZV90cmVlKTsKKwl9CisKKwljaGVja19jb25uZWN0aXZpdHkoKTsKKwlyZXR1cm4gZXJyb3JzX2ZvdW5kOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1nYy5jIGIvYnVpbHRpbi1nYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZWYzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWdjLmMKQEAgLTAsMCArMSwyNjEgQEAKKy8qCisgKiBnaXQgZ2MgYnVpbHRpbiBjb21tYW5kCisgKgorICogQ2xlYW51cCB1bnJlYWNoYWJsZSBmaWxlcyBhbmQgb3B0aW1pemUgdGhlIHJlcG9zaXRvcnkuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IEphbWVzIEJvd2VzCisgKgorICogQmFzZWQgb24gZ2l0LWdjLnNoLCB3aGljaCBpcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBTaGF3biBPLiBQZWFyY2UKKyAqLworCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicGFyc2Utb3B0aW9ucy5oIgorI2luY2x1ZGUgInJ1bi1jb21tYW5kLmgiCisKKyNkZWZpbmUgRkFJTEVEX1JVTiAiZmFpbGVkIHRvIHJ1biAlcyIKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBidWlsdGluX2djX3VzYWdlW10gPSB7CisJImdpdC1nYyBbb3B0aW9uc10iLAorCU5VTEwKK307CisKK3N0YXRpYyBpbnQgcGFja19yZWZzID0gMTsKK3N0YXRpYyBpbnQgYWdncmVzc2l2ZV93aW5kb3cgPSAtMTsKK3N0YXRpYyBpbnQgZ2NfYXV0b190aHJlc2hvbGQgPSA2NzAwOworc3RhdGljIGludCBnY19hdXRvX3BhY2tfbGltaXQgPSA1MDsKK3N0YXRpYyBjaGFyICpwcnVuZV9leHBpcmUgPSAiMi53ZWVrcy5hZ28iOworCisjZGVmaW5lIE1BWF9BREQgMTAKK3N0YXRpYyBjb25zdCBjaGFyICphcmd2X3BhY2tfcmVmc1tdID0geyJwYWNrLXJlZnMiLCAiLS1hbGwiLCAiLS1wcnVuZSIsIE5VTEx9Oworc3RhdGljIGNvbnN0IGNoYXIgKmFyZ3ZfcmVmbG9nW10gPSB7InJlZmxvZyIsICJleHBpcmUiLCAiLS1hbGwiLCBOVUxMfTsKK3N0YXRpYyBjb25zdCBjaGFyICphcmd2X3JlcGFja1tNQVhfQUREXSA9IHsicmVwYWNrIiwgIi1kIiwgIi1sIiwgTlVMTH07CitzdGF0aWMgY29uc3QgY2hhciAqYXJndl9wcnVuZVtdID0geyJwcnVuZSIsICItLWV4cGlyZSIsIE5VTEwsIE5VTEx9Oworc3RhdGljIGNvbnN0IGNoYXIgKmFyZ3ZfcmVyZXJlW10gPSB7InJlcmVyZSIsICJnYyIsIE5VTEx9OworCitzdGF0aWMgaW50IGdjX2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICghc3RyY21wKHZhciwgImdjLnBhY2tyZWZzIikpIHsKKwkJaWYgKHZhbHVlICYmICFzdHJjbXAodmFsdWUsICJub3RiYXJlIikpCisJCQlwYWNrX3JlZnMgPSAtMTsKKwkJZWxzZQorCQkJcGFja19yZWZzID0gZ2l0X2NvbmZpZ19ib29sKHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAodmFyLCAiZ2MuYWdncmVzc2l2ZXdpbmRvdyIpKSB7CisJCWFnZ3Jlc3NpdmVfd2luZG93ID0gZ2l0X2NvbmZpZ19pbnQodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXN0cmNtcCh2YXIsICJnYy5hdXRvIikpIHsKKwkJZ2NfYXV0b190aHJlc2hvbGQgPSBnaXRfY29uZmlnX2ludCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKHZhciwgImdjLmF1dG9wYWNrbGltaXQiKSkgeworCQlnY19hdXRvX3BhY2tfbGltaXQgPSBnaXRfY29uZmlnX2ludCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKHZhciwgImdjLnBydW5lZXhwaXJlIikpIHsKKwkJaWYgKCF2YWx1ZSkKKwkJCXJldHVybiBjb25maWdfZXJyb3Jfbm9uYm9vbCh2YXIpOworCQlpZiAoc3RyY21wKHZhbHVlLCAibm93IikpIHsKKwkJCXVuc2lnbmVkIGxvbmcgbm93ID0gYXBwcm94aWRhdGUoIm5vdyIpOworCQkJaWYgKGFwcHJveGlkYXRlKHZhbHVlKSA+PSBub3cpCisJCQkJcmV0dXJuIGVycm9yKCJJbnZhbGlkICVzOiAnJXMnIiwgdmFyLCB2YWx1ZSk7CisJCX0KKwkJcHJ1bmVfZXhwaXJlID0geHN0cmR1cCh2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gZ2l0X2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBhcHBlbmRfb3B0aW9uKGNvbnN0IGNoYXIgKipjbWQsIGNvbnN0IGNoYXIgKm9wdCwgaW50IG1heF9sZW5ndGgpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBjbWRbaV07IGkrKykKKwkJOworCisJaWYgKGkgKyAyID49IG1heF9sZW5ndGgpCisJCWRpZSgiVG9vIG1hbnkgb3B0aW9ucyBzcGVjaWZpZWQiKTsKKwljbWRbaSsrXSA9IG9wdDsKKwljbWRbaV0gPSBOVUxMOworfQorCitzdGF0aWMgaW50IHRvb19tYW55X2xvb3NlX29iamVjdHModm9pZCkKK3sKKwkvKgorCSAqIFF1aWNrbHkgY2hlY2sgaWYgYSAiZ2MiIGlzIG5lZWRlZCwgYnkgZXN0aW1hdGluZyBob3cKKwkgKiBtYW55IGxvb3NlIG9iamVjdHMgdGhlcmUgYXJlLiAgQmVjYXVzZSBTSEEtMSBpcyBldmVubHkKKwkgKiBkaXN0cmlidXRlZCwgd2UgY2FuIGNoZWNrIG9ubHkgb25lIGFuZCBnZXQgYSByZWFzb25hYmxlCisJICogZXN0aW1hdGUuCisJICovCisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwljb25zdCBjaGFyICpvYmpkaXIgPSBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpOworCURJUiAqZGlyOworCXN0cnVjdCBkaXJlbnQgKmVudDsKKwlpbnQgYXV0b190aHJlc2hvbGQ7CisJaW50IG51bV9sb29zZSA9IDA7CisJaW50IG5lZWRlZCA9IDA7CisKKwlpZiAoZ2NfYXV0b190aHJlc2hvbGQgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2l6ZW9mKHBhdGgpIDw9IHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIiVzLzE3Iiwgb2JqZGlyKSkgeworCQl3YXJuaW5nKCJpbnNhbmVseSBsb25nIG9iamVjdCBkaXJlY3RvcnkgJS4qcyIsIDUwLCBvYmpkaXIpOworCQlyZXR1cm4gMDsKKwl9CisJZGlyID0gb3BlbmRpcihwYXRoKTsKKwlpZiAoIWRpcikKKwkJcmV0dXJuIDA7CisKKwlhdXRvX3RocmVzaG9sZCA9IChnY19hdXRvX3RocmVzaG9sZCArIDI1NSkgLyAyNTY7CisJd2hpbGUgKChlbnQgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJaWYgKHN0cnNwbihlbnQtPmRfbmFtZSwgIjAxMjM0NTY3ODlhYmNkZWYiKSAhPSAzOCB8fAorCQkgICAgZW50LT5kX25hbWVbMzhdICE9ICdcMCcpCisJCQljb250aW51ZTsKKwkJaWYgKCsrbnVtX2xvb3NlID4gYXV0b190aHJlc2hvbGQpIHsKKwkJCW5lZWRlZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwljbG9zZWRpcihkaXIpOworCXJldHVybiBuZWVkZWQ7Cit9CisKK3N0YXRpYyBpbnQgdG9vX21hbnlfcGFja3Modm9pZCkKK3sKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcDsKKwlpbnQgY250OworCisJaWYgKGdjX2F1dG9fcGFja19saW1pdCA8PSAwKQorCQlyZXR1cm4gMDsKKworCXByZXBhcmVfcGFja2VkX2dpdCgpOworCWZvciAoY250ID0gMCwgcCA9IHBhY2tlZF9naXQ7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWNoYXIgcGF0aFtQQVRIX01BWF07CisJCXNpemVfdCBsZW47CisJCWludCBrZWVwOworCisJCWlmICghcC0+cGFja19sb2NhbCkKKwkJCWNvbnRpbnVlOworCQlsZW4gPSBzdHJsZW4ocC0+cGFja19uYW1lKTsKKwkJaWYgKFBBVEhfTUFYIDw9IGxlbiArIDEpCisJCQljb250aW51ZTsgLyogb29wcywgZ2l2ZSB1cCAqLworCQltZW1jcHkocGF0aCwgcC0+cGFja19uYW1lLCBsZW4tNSk7CisJCW1lbWNweShwYXRoICsgbGVuIC0gNSwgIi5rZWVwIiwgNik7CisJCWtlZXAgPSBhY2Nlc3MocC0+cGFja19uYW1lLCBGX09LKSAmJiAoZXJybm8gPT0gRU5PRU5UKTsKKwkJaWYgKGtlZXApCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogUGVyaGFwcyBjaGVjayB0aGUgc2l6ZSBvZiB0aGUgcGFjayBhbmQgY291bnQgb25seQorCQkgKiB2ZXJ5IHNtYWxsIG9uZXMgaGVyZT8KKwkJICovCisJCWNudCsrOworCX0KKwlyZXR1cm4gZ2NfYXV0b19wYWNrX2xpbWl0IDw9IGNudDsKK30KKworc3RhdGljIGludCBuZWVkX3RvX2djKHZvaWQpCit7CisJLyoKKwkgKiBTZXR0aW5nIGdjLmF1dG8gdG8gMCBvciBuZWdhdGl2ZSBjYW4gZGlzYWJsZSB0aGUKKwkgKiBhdXRvbWF0aWMgZ2MuCisJICovCisJaWYgKGdjX2F1dG9fdGhyZXNob2xkIDw9IDApCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgdG9vIG1hbnkgbG9vc2Ugb2JqZWN0cywgYnV0IG5vdCB0b28gbWFueQorCSAqIHBhY2tzLCB3ZSBydW4gInJlcGFjayAtZCAtbCIuICBJZiB0aGVyZSBhcmUgdG9vIG1hbnkgcGFja3MsCisJICogd2UgcnVuICJyZXBhY2sgLUEgLWQgLWwiLiAgT3RoZXJ3aXNlIHdlIHRlbGwgdGhlIGNhbGxlcgorCSAqIHRoZXJlIGlzIG5vIG5lZWQuCisJICovCisJaWYgKHRvb19tYW55X3BhY2tzKCkpCisJCWFwcGVuZF9vcHRpb24oYXJndl9yZXBhY2ssICItQSIsIE1BWF9BREQpOworCWVsc2UgaWYgKCF0b29fbWFueV9sb29zZV9vYmplY3RzKCkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitpbnQgY21kX2djKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBwcnVuZSA9IDA7CisJaW50IGFnZ3Jlc3NpdmUgPSAwOworCWludCBhdXRvX2djID0gMDsKKwlpbnQgcXVpZXQgPSAwOworCWNoYXIgYnVmWzgwXTsKKworCXN0cnVjdCBvcHRpb24gYnVpbHRpbl9nY19vcHRpb25zW10gPSB7CisJCU9QVF9CT09MRUFOKDAsICJwcnVuZSIsICZwcnVuZSwgInBydW5lIHVucmVmZXJlbmNlZCBvYmplY3RzIiksCisJCU9QVF9CT09MRUFOKDAsICJhZ2dyZXNzaXZlIiwgJmFnZ3Jlc3NpdmUsICJiZSBtb3JlIHRob3JvdWdoIChpbmNyZWFzZWQgcnVudGltZSkiKSwKKwkJT1BUX0JPT0xFQU4oMCwgImF1dG8iLCAmYXV0b19nYywgImVuYWJsZSBhdXRvLWdjIG1vZGUiKSwKKwkJT1BUX0JPT0xFQU4oJ3EnLCAicXVpZXQiLCAmcXVpZXQsICJzdXBwcmVzcyBwcm9ncmVzcyByZXBvcnRzIiksCisJCU9QVF9FTkQoKQorCX07CisKKwlnaXRfY29uZmlnKGdjX2NvbmZpZyk7CisKKwlpZiAocGFja19yZWZzIDwgMCkKKwkJcGFja19yZWZzID0gIWlzX2JhcmVfcmVwb3NpdG9yeSgpOworCisJYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgYnVpbHRpbl9nY19vcHRpb25zLCBidWlsdGluX2djX3VzYWdlLCAwKTsKKwlpZiAoYXJnYyA+IDApCisJCXVzYWdlX3dpdGhfb3B0aW9ucyhidWlsdGluX2djX3VzYWdlLCBidWlsdGluX2djX29wdGlvbnMpOworCisJaWYgKGFnZ3Jlc3NpdmUpIHsKKwkJYXBwZW5kX29wdGlvbihhcmd2X3JlcGFjaywgIi1mIiwgTUFYX0FERCk7CisJCWlmIChhZ2dyZXNzaXZlX3dpbmRvdyA+IDApIHsKKwkJCXNwcmludGYoYnVmLCAiLS13aW5kb3c9JWQiLCBhZ2dyZXNzaXZlX3dpbmRvdyk7CisJCQlhcHBlbmRfb3B0aW9uKGFyZ3ZfcmVwYWNrLCBidWYsIE1BWF9BREQpOworCQl9CisJfQorCWlmIChxdWlldCkKKwkJYXBwZW5kX29wdGlvbihhcmd2X3JlcGFjaywgIi1xIiwgTUFYX0FERCk7CisKKwlpZiAoYXV0b19nYykgeworCQkvKgorCQkgKiBBdXRvLWdjIHNob3VsZCBiZSBsZWFzdCBpbnRydXNpdmUgYXMgcG9zc2libGUuCisJCSAqLworCQlwcnVuZSA9IDA7CisJCWlmICghbmVlZF90b19nYygpKQorCQkJcmV0dXJuIDA7CisJCWZwcmludGYoc3RkZXJyLCAiQXV0byBwYWNraW5nIHlvdXIgcmVwb3NpdG9yeSBmb3Igb3B0aW11bSAiCisJCQkicGVyZm9ybWFuY2UuIFlvdSBtYXkgYWxzb1xuIgorCQkJInJ1biBcImdpdCBnY1wiIG1hbnVhbGx5LiBTZWUgIgorCQkJIlwiZ2l0IGhlbHAgZ2NcIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiIpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFVzZSBzYWZlciAoZm9yIHNoYXJlZCByZXBvcykgIi1BIiBvcHRpb24gdG8KKwkJICogcmVwYWNrIHdoZW4gbm90IHBydW5pbmcuIEF1dG8tZ2MgbWFrZXMgaXRzCisJCSAqIG93biBkZWNpc2lvbi4KKwkJICovCisJCWlmIChwcnVuZSkKKwkJCWFwcGVuZF9vcHRpb24oYXJndl9yZXBhY2ssICItYSIsIE1BWF9BREQpOworCQllbHNlCisJCQlhcHBlbmRfb3B0aW9uKGFyZ3ZfcmVwYWNrLCAiLUEiLCBNQVhfQUREKTsKKwl9CisKKwlpZiAocGFja19yZWZzICYmIHJ1bl9jb21tYW5kX3Zfb3B0KGFyZ3ZfcGFja19yZWZzLCBSVU5fR0lUX0NNRCkpCisJCXJldHVybiBlcnJvcihGQUlMRURfUlVOLCBhcmd2X3BhY2tfcmVmc1swXSk7CisKKwlpZiAocnVuX2NvbW1hbmRfdl9vcHQoYXJndl9yZWZsb2csIFJVTl9HSVRfQ01EKSkKKwkJcmV0dXJuIGVycm9yKEZBSUxFRF9SVU4sIGFyZ3ZfcmVmbG9nWzBdKTsKKworCWlmIChydW5fY29tbWFuZF92X29wdChhcmd2X3JlcGFjaywgUlVOX0dJVF9DTUQpKQorCQlyZXR1cm4gZXJyb3IoRkFJTEVEX1JVTiwgYXJndl9yZXBhY2tbMF0pOworCisJYXJndl9wcnVuZVsyXSA9IHBydW5lX2V4cGlyZTsKKwlpZiAocnVuX2NvbW1hbmRfdl9vcHQoYXJndl9wcnVuZSwgUlVOX0dJVF9DTUQpKQorCQlyZXR1cm4gZXJyb3IoRkFJTEVEX1JVTiwgYXJndl9wcnVuZVswXSk7CisKKwlpZiAocnVuX2NvbW1hbmRfdl9vcHQoYXJndl9yZXJlcmUsIFJVTl9HSVRfQ01EKSkKKwkJcmV0dXJuIGVycm9yKEZBSUxFRF9SVU4sIGFyZ3ZfcmVyZXJlWzBdKTsKKworCWlmIChhdXRvX2djICYmIHRvb19tYW55X2xvb3NlX29iamVjdHMoKSkKKwkJd2FybmluZygiVGhlcmUgYXJlIHRvbyBtYW55IHVucmVhY2hhYmxlIGxvb3NlIG9iamVjdHM7ICIKKwkJCSJydW4gJ2dpdCBwcnVuZScgdG8gcmVtb3ZlIHRoZW0uIik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tZ3JlcC5jIGIvYnVpbHRpbi1ncmVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyOTkxMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tZ3JlcC5jCkBAIC0wLDAgKzEsNzk3IEBACisvKgorICogQnVpbHRpbiAiZ2l0IGdyZXAiCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEp1bmlvIEMgSGFtYW5vCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImdyZXAuaCIKKworI2lmbmRlZiBOT19FWFRFUk5BTF9HUkVQCisjaWZkZWYgX191bml4X18KKyNkZWZpbmUgTk9fRVhURVJOQUxfR1JFUCAwCisjZWxzZQorI2RlZmluZSBOT19FWFRFUk5BTF9HUkVQIDEKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiBnaXQgZ3JlcCBwYXRoc3BlY3MgYXJlIHNvbWV3aGF0IGRpZmZlcmVudCBmcm9tIGRpZmYtdHJlZSBwYXRoc3BlY3M7CisgKiBwYXRobmFtZSB3aWxkY2FyZHMgYXJlIGFsbG93ZWQuCisgKi8KK3N0YXRpYyBpbnQgcGF0aHNwZWNfbWF0Y2hlcyhjb25zdCBjaGFyICoqcGF0aHMsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IG5hbWVsZW4sIGk7CisJaWYgKCFwYXRocyB8fCAhKnBhdGhzKQorCQlyZXR1cm4gMTsKKwluYW1lbGVuID0gc3RybGVuKG5hbWUpOworCWZvciAoaSA9IDA7IHBhdGhzW2ldOyBpKyspIHsKKwkJY29uc3QgY2hhciAqbWF0Y2ggPSBwYXRoc1tpXTsKKwkJaW50IG1hdGNobGVuID0gc3RybGVuKG1hdGNoKTsKKwkJY29uc3QgY2hhciAqY3AsICptZXRhOworCisJCWlmICghbWF0Y2hsZW4gfHwKKwkJICAgICgobWF0Y2hsZW4gPD0gbmFtZWxlbikgJiYKKwkJICAgICAhc3RybmNtcChuYW1lLCBtYXRjaCwgbWF0Y2hsZW4pICYmCisJCSAgICAgKG1hdGNoW21hdGNobGVuLTFdID09ICcvJyB8fAorCQkgICAgICBuYW1lW21hdGNobGVuXSA9PSAnXDAnIHx8IG5hbWVbbWF0Y2hsZW5dID09ICcvJykpKQorCQkJcmV0dXJuIDE7CisJCWlmICghZm5tYXRjaChtYXRjaCwgbmFtZSwgMCkpCisJCQlyZXR1cm4gMTsKKwkJaWYgKG5hbWVbbmFtZWxlbi0xXSAhPSAnLycpCisJCQljb250aW51ZTsKKworCQkvKiBXZSBhcmUgYmVpbmcgYXNrZWQgaWYgdGhlIGRpcmVjdG9yeSAoIm5hbWUiKSBpcyB3b3J0aAorCQkgKiBkZXNjZW5kaW5nIGludG8uCisJCSAqCisJCSAqIEZpbmQgdGhlIGxvbmdlc3QgbGVhZGluZyBkaXJlY3RvcnkgbmFtZSB0aGF0IGRvZXMKKwkJICogbm90IGhhdmUgbWV0YWNoYXJhY3RlciBpbiB0aGUgcGF0aHNwZWM7IHRoZSBuYW1lCisJCSAqIHdlIGFyZSBsb29raW5nIGF0IG11c3Qgb3ZlcmxhcCB3aXRoIHRoYXQgZGlyZWN0b3J5LgorCQkgKi8KKwkJZm9yIChjcCA9IG1hdGNoLCBtZXRhID0gTlVMTDsgY3AgLSBtYXRjaCA8IG1hdGNobGVuOyBjcCsrKSB7CisJCQljaGFyIGNoID0gKmNwOworCQkJaWYgKGNoID09ICcqJyB8fCBjaCA9PSAnWycgfHwgY2ggPT0gJz8nKSB7CisJCQkJbWV0YSA9IGNwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghbWV0YSkKKwkJCW1ldGEgPSBjcDsgLyogZnVsbHkgbGl0ZXJhbCAqLworCisJCWlmIChuYW1lbGVuIDw9IG1ldGEgLSBtYXRjaCkgeworCQkJLyogTG9va2luZyBhdCAiRG9jdW1lbnRhdGlvbi8iIGFuZAorCQkJICogdGhlIHBhdHRlcm4gc2F5cyAiRG9jdW1lbnRhdGlvbi9ob3d0by8iLCBvcgorCQkJICogIkRvY3VtZW50YXRpb24vZGlmZioudHh0Ii4gIFRoZSBuYW1lIHdlCisJCQkgKiBoYXZlIHNob3VsZCBtYXRjaCBwcmVmaXguCisJCQkgKi8KKwkJCWlmICghbWVtY21wKG1hdGNoLCBuYW1lLCBuYW1lbGVuKSkKKwkJCQlyZXR1cm4gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKG1ldGEgLSBtYXRjaCA8IG5hbWVsZW4pIHsKKwkJCS8qIExvb2tpbmcgYXQgIkRvY3VtZW50YXRpb24vaG93dG8vIiBhbmQKKwkJCSAqIHRoZSBwYXR0ZXJuIHNheXMgIkRvY3VtZW50YXRpb24vaCoiOworCQkJICogbWF0Y2ggdXAgdG8gIkRvLi4uL2giOyB0aGlzIGF2b2lkcyBkZXNjZW5kaW5nCisJCQkgKiBpbnRvICJEb2N1bWVudGF0aW9uL3RlY2huaWNhbC8iLgorCQkJICovCisJCQlpZiAoIW1lbWNtcChtYXRjaCwgbmFtZSwgbWV0YSAtIG1hdGNoKSkKKwkJCQlyZXR1cm4gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdyZXBfc2hhMShzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqbmFtZSwgaW50IHRyZWVfbmFtZV9sZW4pCit7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWNoYXIgKmRhdGE7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCWNoYXIgKnRvX2ZyZWUgPSBOVUxMOworCWludCBoaXQ7CisKKwlkYXRhID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgJnR5cGUsICZzaXplKTsKKwlpZiAoIWRhdGEpIHsKKwkJZXJyb3IoIiclcyc6IHVuYWJsZSB0byByZWFkICVzIiwgbmFtZSwgc2hhMV90b19oZXgoc2hhMSkpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKG9wdC0+cmVsYXRpdmUgJiYgb3B0LT5wcmVmaXhfbGVuZ3RoKSB7CisJCXN0YXRpYyBjaGFyIG5hbWVfYnVmW1BBVEhfTUFYXTsKKwkJY2hhciAqY3A7CisJCWludCBuYW1lX2xlbiA9IHN0cmxlbihuYW1lKSAtIG9wdC0+cHJlZml4X2xlbmd0aCArIDE7CisKKwkJaWYgKCF0cmVlX25hbWVfbGVuKQorCQkJbmFtZSArPSBvcHQtPnByZWZpeF9sZW5ndGg7CisJCWVsc2UgeworCQkJaWYgKEFSUkFZX1NJWkUobmFtZV9idWYpIDw9IG5hbWVfbGVuKQorCQkJCWNwID0gdG9fZnJlZSA9IHhtYWxsb2MobmFtZV9sZW4pOworCQkJZWxzZQorCQkJCWNwID0gbmFtZV9idWY7CisJCQltZW1jcHkoY3AsIG5hbWUsIHRyZWVfbmFtZV9sZW4pOworCQkJc3RyY3B5KGNwICsgdHJlZV9uYW1lX2xlbiwKKwkJCSAgICAgICBuYW1lICsgdHJlZV9uYW1lX2xlbiArIG9wdC0+cHJlZml4X2xlbmd0aCk7CisJCQluYW1lID0gY3A7CisJCX0KKwl9CisJaGl0ID0gZ3JlcF9idWZmZXIob3B0LCBuYW1lLCBkYXRhLCBzaXplKTsKKwlmcmVlKGRhdGEpOworCWZyZWUodG9fZnJlZSk7CisJcmV0dXJuIGhpdDsKK30KKworc3RhdGljIGludCBncmVwX2ZpbGUoc3RydWN0IGdyZXBfb3B0ICpvcHQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCXN0cnVjdCBzdGF0IHN0OworCWludCBpOworCWNoYXIgKmRhdGE7CisJc2l6ZV90IHN6OworCisJaWYgKGxzdGF0KGZpbGVuYW1lLCAmc3QpIDwgMCkgeworCWVycl9yZXQ6CisJCWlmIChlcnJubyAhPSBFTk9FTlQpCisJCQllcnJvcigiJyVzJzogJXMiLCBmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3Quc3Rfc2l6ZSkKKwkJcmV0dXJuIDA7IC8qIGVtcHR5IGZpbGUgLS0gbm8gZ3JlcCBoaXQgKi8KKwlpZiAoIVNfSVNSRUcoc3Quc3RfbW9kZSkpCisJCXJldHVybiAwOworCXN6ID0geHNpemVfdChzdC5zdF9zaXplKTsKKwlpID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWlmIChpIDwgMCkKKwkJZ290byBlcnJfcmV0OworCWRhdGEgPSB4bWFsbG9jKHN6ICsgMSk7CisJaWYgKHN0LnN0X3NpemUgIT0gcmVhZF9pbl9mdWxsKGksIGRhdGEsIHN6KSkgeworCQllcnJvcigiJyVzJzogc2hvcnQgcmVhZCAlcyIsIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQljbG9zZShpKTsKKwkJZnJlZShkYXRhKTsKKwkJcmV0dXJuIDA7CisJfQorCWNsb3NlKGkpOworCWlmIChvcHQtPnJlbGF0aXZlICYmIG9wdC0+cHJlZml4X2xlbmd0aCkKKwkJZmlsZW5hbWUgKz0gb3B0LT5wcmVmaXhfbGVuZ3RoOworCWkgPSBncmVwX2J1ZmZlcihvcHQsIGZpbGVuYW1lLCBkYXRhLCBzeik7CisJZnJlZShkYXRhKTsKKwlyZXR1cm4gaTsKK30KKworI2lmICFOT19FWFRFUk5BTF9HUkVQCitzdGF0aWMgaW50IGV4ZWNfZ3JlcChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisJcGlkX3QgcGlkOworCWludCBzdGF0dXM7CisKKwlhcmd2W2FyZ2NdID0gTlVMTDsKKwlwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA8IDApCisJCXJldHVybiBwaWQ7CisJaWYgKCFwaWQpIHsKKwkJZXhlY3ZwKCJncmVwIiwgKGNoYXIgKiopIGFyZ3YpOworCQlleGl0KDI1NSk7CisJfQorCXdoaWxlICh3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCkgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChXSUZFWElURUQoc3RhdHVzKSkgeworCQlpZiAoIVdFWElUU1RBVFVTKHN0YXR1cykpCisJCQlyZXR1cm4gMTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtMTsKK30KKworI2RlZmluZSBNQVhBUkdTIDEwMDAKKyNkZWZpbmUgQVJHQlVGIDQwOTYKKyNkZWZpbmUgcHVzaF9hcmcoYSkgZG8geyBcCisJaWYgKG5yIDwgTUFYQVJHUykgYXJndltucisrXSA9IChhKTsgXAorCWVsc2UgZGllKCJtYXhpbXVtIG51bWJlciBvZiBhcmdzIGV4Y2VlZGVkIik7IFwKKwl9IHdoaWxlICgwKQorCisvKgorICogSWYgeW91IHNlbmQgYSBzaW5nbGV0b24gZmlsZW5hbWUgdG8gZ3JlcCwgaXQgZG9lcyBub3QgZ2l2ZQorICogdGhlIG5hbWUgb2YgdGhlIGZpbGUuICBHTlUgZ3JlcCBoYXMgIi1IIiBidXQgd2Ugd291bGQgd2FudAorICogdGhhdCBiZWhhdmlvdXIgaW4gYSBwb3J0YWJsZSB3YXkuCisgKgorICogU28gd2Uga2VlcCB0d28gcGF0aG5hbWVzIGluIGFyZ3YgYnVmZmVyIHVuc2VudCB0byBncmVwIGluCisgKiB0aGUgbWFpbiBsb29wIGlmIHdlIG5lZWQgdG8gZG8gbW9yZSB0aGFuIG9uZSBncmVwLgorICovCitzdGF0aWMgaW50IGZsdXNoX2dyZXAoc3RydWN0IGdyZXBfb3B0ICpvcHQsCisJCSAgICAgIGludCBhcmdjLCBpbnQgYXJnMCwgY29uc3QgY2hhciAqKmFyZ3YsIGludCAqa2VwdCkKK3sKKwlpbnQgc3RhdHVzOworCWludCBjb3VudCA9IGFyZ2MgLSBhcmcwOworCWNvbnN0IGNoYXIgKmtlcHRfMCA9IE5VTEw7CisKKwlpZiAoY291bnQgPD0gMikgeworCQkvKgorCQkgKiBCZWNhdXNlIHdlIGtlZXAgYXQgbGVhc3QgMiBwYXRocyBpbiB0aGUgY2FsbCBmcm9tCisJCSAqIHRoZSBtYWluIGxvb3AgKGkuZS4ga2VwdCAhPSBOVUxMKSwgYW5kIE1BWEFSR1MgaXMKKwkJICogZmFyIGdyZWF0ZXIgdGhhbiAyLCB0aGlzIHVzdWFsbHkgaXMgYSBjYWxsIHRvCisJCSAqIGNvbmNsdWRlIHRoZSBncmVwLiAgSG93ZXZlciwgdGhlIHVzZXIgY291bGQgYXR0ZW1wdAorCQkgKiB0byBvdmVyZmxvdyB0aGUgYXJndiBidWZmZXIgYnkgZ2l2aW5nIHRvbyBtYW55CisJCSAqIG9wdGlvbnMgdG8gbGVhdmUgdmVyeSBzbWFsbCBudW1iZXIgb2YgcmVhbAorCQkgKiBhcmd1bWVudHMgZXZlbiBmb3IgdGhlIGNhbGwgaW4gdGhlIG1haW4gbG9vcC4KKwkJICovCisJCWlmIChrZXB0KQorCQkJZGllKCJpbnNhbmVseSBtYW55IG9wdGlvbnMgdG8gZ3JlcCIpOworCisJCS8qCisJCSAqIElmIHdlIGhhdmUgdHdvIG9yIG1vcmUgcGF0aHMsIHdlIGRvIG5vdCBoYXZlIHRvIGRvCisJCSAqIGFueXRoaW5nIHNwZWNpYWwsIGJ1dCB3ZSBuZWVkIHRvIHB1c2ggL2Rldi9udWxsIHRvCisJCSAqIGdldCAiLUgiIGJlaGF2aW91ciBvZiBHTlUgZ3JlcCBwb3J0YWJseSBidXQgd2hlbiB3ZQorCQkgKiBhcmUgbm90IGRvaW5nICItbCIgbm9yICItTCIgbm9yICItYyIuCisJCSAqLworCQlpZiAoY291bnQgPT0gMSAmJgorCQkgICAgIW9wdC0+bmFtZV9vbmx5ICYmCisJCSAgICAhb3B0LT51bm1hdGNoX25hbWVfb25seSAmJgorCQkgICAgIW9wdC0+Y291bnQpIHsKKwkJCWFyZ3ZbYXJnYysrXSA9ICIvZGV2L251bGwiOworCQkJYXJndlthcmdjXSA9IE5VTEw7CisJCX0KKwl9CisKKwllbHNlIGlmIChrZXB0KSB7CisJCS8qCisJCSAqIENhbGxlZCBiZWNhdXNlIHdlIGZvdW5kIG1hbnkgcGF0aHMgYW5kIGhhdmVuJ3QgZmluaXNoZWQKKwkJICogaXRlcmF0aW5nIG92ZXIgdGhlIGNhY2hlIHlldC4gIFdlIGtlZXAgdHdvIHBhdGhzCisJCSAqIGZvciB0aGUgY29uY2x1ZGluZyBjYWxsLiAgYXJndlthcmdjLTJdIGFuZCBhcmd2W2FyZ2MtMV0KKwkJICogaGFzIHRoZSBsYXN0IHR3byBwYXRocywgc28gc2F2ZSB0aGUgZmlyc3Qgb25lIGF3YXksCisJCSAqIHJlcGxhY2UgaXQgd2l0aCBOVUxMIHdoaWxlIHNlbmRpbmcgdGhlIGxpc3QgdG8gZ3JlcCwKKwkJICogYW5kIHJlY292ZXIgdGhlbSBhZnRlciB3ZSBhcmUgZG9uZS4KKwkJICovCisJCSprZXB0ID0gMjsKKwkJa2VwdF8wID0gYXJndlthcmdjLTJdOworCQlhcmd2W2FyZ2MtMl0gPSBOVUxMOworCQlhcmdjIC09IDI7CisJfQorCisJc3RhdHVzID0gZXhlY19ncmVwKGFyZ2MsIGFyZ3YpOworCisJaWYgKGtlcHRfMCkgeworCQkvKgorCQkgKiBUaGVuIHJlY292ZXIgdGhlbS4gIE5vdyB0aGUgbGFzdCBhcmcgaXMgYmV5b25kIHRoZQorCQkgKiB0ZXJtaW5hdGluZyBOVUxMIHdoaWNoIGlzIGF0IGFyZ2MsIGFuZCB0aGUgc2Vjb25kCisJCSAqIGZyb20gdGhlIGxhc3QgaXMgd2hhdCB3ZSBzYXZlZCBhd2F5IGluIGtlcHRfMAorCQkgKi8KKwkJYXJndlthcmcwKytdID0ga2VwdF8wOworCQlhcmd2W2FyZzBdID0gYXJndlthcmdjKzFdOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGV4dGVybmFsX2dyZXAoc3RydWN0IGdyZXBfb3B0ICpvcHQsIGNvbnN0IGNoYXIgKipwYXRocywgaW50IGNhY2hlZCkKK3sKKwlpbnQgaSwgbnIsIGFyZ2MsIGhpdCwgbGVuLCBzdGF0dXM7CisJY29uc3QgY2hhciAqYXJndltNQVhBUkdTKzFdOworCWNoYXIgcmFuZGFyZ1tBUkdCVUZdOworCWNoYXIgKmFyZ3B0ciA9IHJhbmRhcmc7CisJc3RydWN0IGdyZXBfcGF0ICpwOworCisJaWYgKG9wdC0+ZXh0ZW5kZWQgfHwgKG9wdC0+cmVsYXRpdmUgJiYgb3B0LT5wcmVmaXhfbGVuZ3RoKSkKKwkJcmV0dXJuIC0xOworCWxlbiA9IG5yID0gMDsKKwlwdXNoX2FyZygiZ3JlcCIpOworCWlmIChvcHQtPmZpeGVkKQorCQlwdXNoX2FyZygiLUYiKTsKKwlpZiAob3B0LT5saW5lbnVtKQorCQlwdXNoX2FyZygiLW4iKTsKKwlpZiAoIW9wdC0+cGF0aG5hbWUpCisJCXB1c2hfYXJnKCItaCIpOworCWlmIChvcHQtPnJlZ2ZsYWdzICYgUkVHX0VYVEVOREVEKQorCQlwdXNoX2FyZygiLUUiKTsKKwlpZiAob3B0LT5yZWdmbGFncyAmIFJFR19JQ0FTRSkKKwkJcHVzaF9hcmcoIi1pIik7CisJaWYgKG9wdC0+d29yZF9yZWdleHApCisJCXB1c2hfYXJnKCItdyIpOworCWlmIChvcHQtPm5hbWVfb25seSkKKwkJcHVzaF9hcmcoIi1sIik7CisJaWYgKG9wdC0+dW5tYXRjaF9uYW1lX29ubHkpCisJCXB1c2hfYXJnKCItTCIpOworCWlmIChvcHQtPmNvdW50KQorCQlwdXNoX2FyZygiLWMiKTsKKwlpZiAob3B0LT5wb3N0X2NvbnRleHQgfHwgb3B0LT5wcmVfY29udGV4dCkgeworCQlpZiAob3B0LT5wb3N0X2NvbnRleHQgIT0gb3B0LT5wcmVfY29udGV4dCkgeworCQkJaWYgKG9wdC0+cHJlX2NvbnRleHQpIHsKKwkJCQlwdXNoX2FyZygiLUIiKTsKKwkJCQlsZW4gKz0gc25wcmludGYoYXJncHRyLCBzaXplb2YocmFuZGFyZyktbGVuLAorCQkJCQkJIiV1Iiwgb3B0LT5wcmVfY29udGV4dCkgKyAxOworCQkJCWlmIChzaXplb2YocmFuZGFyZykgPD0gbGVuKQorCQkJCQlkaWUoIm1heGltdW0gbGVuZ3RoIG9mIGFyZ3MgZXhjZWVkZWQiKTsKKwkJCQlwdXNoX2FyZyhhcmdwdHIpOworCQkJCWFyZ3B0ciArPSBsZW47CisJCQl9CisJCQlpZiAob3B0LT5wb3N0X2NvbnRleHQpIHsKKwkJCQlwdXNoX2FyZygiLUEiKTsKKwkJCQlsZW4gKz0gc25wcmludGYoYXJncHRyLCBzaXplb2YocmFuZGFyZyktbGVuLAorCQkJCQkJIiV1Iiwgb3B0LT5wb3N0X2NvbnRleHQpICsgMTsKKwkJCQlpZiAoc2l6ZW9mKHJhbmRhcmcpIDw9IGxlbikKKwkJCQkJZGllKCJtYXhpbXVtIGxlbmd0aCBvZiBhcmdzIGV4Y2VlZGVkIik7CisJCQkJcHVzaF9hcmcoYXJncHRyKTsKKwkJCQlhcmdwdHIgKz0gbGVuOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJcHVzaF9hcmcoIi1DIik7CisJCQlsZW4gKz0gc25wcmludGYoYXJncHRyLCBzaXplb2YocmFuZGFyZyktbGVuLAorCQkJCQkiJXUiLCBvcHQtPnBvc3RfY29udGV4dCkgKyAxOworCQkJaWYgKHNpemVvZihyYW5kYXJnKSA8PSBsZW4pCisJCQkJZGllKCJtYXhpbXVtIGxlbmd0aCBvZiBhcmdzIGV4Y2VlZGVkIik7CisJCQlwdXNoX2FyZyhhcmdwdHIpOworCQkJYXJncHRyICs9IGxlbjsKKwkJfQorCX0KKwlmb3IgKHAgPSBvcHQtPnBhdHRlcm5fbGlzdDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJcHVzaF9hcmcoIi1lIik7CisJCXB1c2hfYXJnKHAtPnBhdHRlcm4pOworCX0KKworCWhpdCA9IDA7CisJYXJnYyA9IG5yOworCWZvciAoaSA9IDA7IGkgPCBhY3RpdmVfbnI7IGkrKykgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW2ldOworCQljaGFyICpuYW1lOworCQlpbnQga2VwdDsKKwkJaWYgKCFTX0lTUkVHKGNlLT5jZV9tb2RlKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXBhdGhzcGVjX21hdGNoZXMocGF0aHMsIGNlLT5uYW1lKSkKKwkJCWNvbnRpbnVlOworCQluYW1lID0gY2UtPm5hbWU7CisJCWlmIChuYW1lWzBdID09ICctJykgeworCQkJaW50IGxlbiA9IGNlX25hbWVsZW4oY2UpOworCQkJbmFtZSA9IHhtYWxsb2MobGVuICsgMyk7CisJCQltZW1jcHkobmFtZSwgIi4vIiwgMik7CisJCQltZW1jcHkobmFtZSArIDIsIGNlLT5uYW1lLCBsZW4gKyAxKTsKKwkJfQorCQlhcmd2W2FyZ2MrK10gPSBuYW1lOworCQlpZiAoTUFYQVJHUyA8PSBhcmdjKSB7CisJCQlzdGF0dXMgPSBmbHVzaF9ncmVwKG9wdCwgYXJnYywgbnIsIGFyZ3YsICZrZXB0KTsKKwkJCWlmICgwIDwgc3RhdHVzKQorCQkJCWhpdCA9IDE7CisJCQlhcmdjID0gbnIgKyBrZXB0OworCQl9CisJCWlmIChjZV9zdGFnZShjZSkpIHsKKwkJCWRvIHsKKwkJCQlpKys7CisJCQl9IHdoaWxlIChpIDwgYWN0aXZlX25yICYmCisJCQkJICFzdHJjbXAoY2UtPm5hbWUsIGFjdGl2ZV9jYWNoZVtpXS0+bmFtZSkpOworCQkJaS0tOyAvKiBjb21wZW5zYXRlIGZvciBsb29wIGNvbnRyb2wgKi8KKwkJfQorCX0KKwlpZiAoYXJnYyA+IG5yKSB7CisJCXN0YXR1cyA9IGZsdXNoX2dyZXAob3B0LCBhcmdjLCBuciwgYXJndiwgTlVMTCk7CisJCWlmICgwIDwgc3RhdHVzKQorCQkJaGl0ID0gMTsKKwl9CisJcmV0dXJuIGhpdDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGdyZXBfY2FjaGUoc3RydWN0IGdyZXBfb3B0ICpvcHQsIGNvbnN0IGNoYXIgKipwYXRocywgaW50IGNhY2hlZCkKK3sKKwlpbnQgaGl0ID0gMDsKKwlpbnQgbnI7CisJcmVhZF9jYWNoZSgpOworCisjaWYgIU5PX0VYVEVSTkFMX0dSRVAKKwkvKgorCSAqIFVzZSB0aGUgZXh0ZXJuYWwgImdyZXAiIGNvbW1hbmQgZm9yIHRoZSBjYXNlIHdoZXJlCisJICogd2UgZ3JlcCB0aHJvdWdoIHRoZSBjaGVja2VkLW91dCBmaWxlcy4gSXQgdGVuZHMgdG8KKwkgKiBiZSBhIGxvdCBtb3JlIG9wdGltaXplZAorCSAqLworCWlmICghY2FjaGVkKSB7CisJCWhpdCA9IGV4dGVybmFsX2dyZXAob3B0LCBwYXRocywgY2FjaGVkKTsKKwkJaWYgKGhpdCA+PSAwKQorCQkJcmV0dXJuIGhpdDsKKwl9CisjZW5kaWYKKworCWZvciAobnIgPSAwOyBuciA8IGFjdGl2ZV9ucjsgbnIrKykgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW25yXTsKKwkJaWYgKCFTX0lTUkVHKGNlLT5jZV9tb2RlKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXBhdGhzcGVjX21hdGNoZXMocGF0aHMsIGNlLT5uYW1lKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoY2FjaGVkKSB7CisJCQlpZiAoY2Vfc3RhZ2UoY2UpKQorCQkJCWNvbnRpbnVlOworCQkJaGl0IHw9IGdyZXBfc2hhMShvcHQsIGNlLT5zaGExLCBjZS0+bmFtZSwgMCk7CisJCX0KKwkJZWxzZQorCQkJaGl0IHw9IGdyZXBfZmlsZShvcHQsIGNlLT5uYW1lKTsKKwkJaWYgKGNlX3N0YWdlKGNlKSkgeworCQkJZG8geworCQkJCW5yKys7CisJCQl9IHdoaWxlIChuciA8IGFjdGl2ZV9uciAmJgorCQkJCSAhc3RyY21wKGNlLT5uYW1lLCBhY3RpdmVfY2FjaGVbbnJdLT5uYW1lKSk7CisJCQluci0tOyAvKiBjb21wZW5zYXRlIGZvciBsb29wIGNvbnRyb2wgKi8KKwkJfQorCX0KKwlmcmVlX2dyZXBfcGF0dGVybnMob3B0KTsKKwlyZXR1cm4gaGl0OworfQorCitzdGF0aWMgaW50IGdyZXBfdHJlZShzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCwgY29uc3QgY2hhciAqKnBhdGhzLAorCQkgICAgIHN0cnVjdCB0cmVlX2Rlc2MgKnRyZWUsCisJCSAgICAgY29uc3QgY2hhciAqdHJlZV9uYW1lLCBjb25zdCBjaGFyICpiYXNlKQoreworCWludCBsZW47CisJaW50IGhpdCA9IDA7CisJc3RydWN0IG5hbWVfZW50cnkgZW50cnk7CisJY2hhciAqZG93bjsKKwlpbnQgdG5fbGVuID0gc3RybGVuKHRyZWVfbmFtZSk7CisJY2hhciAqcGF0aF9idWYgPSB4bWFsbG9jKFBBVEhfTUFYICsgdG5fbGVuICsgMTAwKTsKKworCWlmICh0bl9sZW4pIHsKKwkJdG5fbGVuID0gc3ByaW50ZihwYXRoX2J1ZiwgIiVzOiIsIHRyZWVfbmFtZSk7CisJCWRvd24gPSBwYXRoX2J1ZiArIHRuX2xlbjsKKwkJc3RyY2F0KGRvd24sIGJhc2UpOworCX0KKwllbHNlIHsKKwkJZG93biA9IHBhdGhfYnVmOworCQlzdHJjcHkoZG93biwgYmFzZSk7CisJfQorCWxlbiA9IHN0cmxlbihwYXRoX2J1Zik7CisKKwl3aGlsZSAodHJlZV9lbnRyeSh0cmVlLCAmZW50cnkpKSB7CisJCXN0cmNweShwYXRoX2J1ZiArIGxlbiwgZW50cnkucGF0aCk7CisKKwkJaWYgKFNfSVNESVIoZW50cnkubW9kZSkpCisJCQkvKiBNYXRjaCAiYWJjLyIgYWdhaW5zdCBwYXRoc3BlYyB0bworCQkJICogZGVjaWRlIGlmIHdlIHdhbnQgdG8gZGVzY2VuZCBpbnRvICJhYmMiCisJCQkgKiBkaXJlY3RvcnkuCisJCQkgKi8KKwkJCXN0cmNweShwYXRoX2J1ZiArIGxlbiArIHRyZWVfZW50cnlfbGVuKGVudHJ5LnBhdGgsIGVudHJ5LnNoYTEpLCAiLyIpOworCisJCWlmICghcGF0aHNwZWNfbWF0Y2hlcyhwYXRocywgZG93bikpCisJCQk7CisJCWVsc2UgaWYgKFNfSVNSRUcoZW50cnkubW9kZSkpCisJCQloaXQgfD0gZ3JlcF9zaGExKG9wdCwgZW50cnkuc2hhMSwgcGF0aF9idWYsIHRuX2xlbik7CisJCWVsc2UgaWYgKFNfSVNESVIoZW50cnkubW9kZSkpIHsKKwkJCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwkJCXN0cnVjdCB0cmVlX2Rlc2Mgc3ViOworCQkJdm9pZCAqZGF0YTsKKwkJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCQkJZGF0YSA9IHJlYWRfc2hhMV9maWxlKGVudHJ5LnNoYTEsICZ0eXBlLCAmc2l6ZSk7CisJCQlpZiAoIWRhdGEpCisJCQkJZGllKCJ1bmFibGUgdG8gcmVhZCB0cmVlICglcykiLAorCQkJCSAgICBzaGExX3RvX2hleChlbnRyeS5zaGExKSk7CisJCQlpbml0X3RyZWVfZGVzYygmc3ViLCBkYXRhLCBzaXplKTsKKwkJCWhpdCB8PSBncmVwX3RyZWUob3B0LCBwYXRocywgJnN1YiwgdHJlZV9uYW1lLCBkb3duKTsKKwkJCWZyZWUoZGF0YSk7CisJCX0KKwl9CisJcmV0dXJuIGhpdDsKK30KKworc3RhdGljIGludCBncmVwX29iamVjdChzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCwgY29uc3QgY2hhciAqKnBhdGhzLAorCQkgICAgICAgc3RydWN0IG9iamVjdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lKQoreworCWlmIChvYmotPnR5cGUgPT0gT0JKX0JMT0IpCisJCXJldHVybiBncmVwX3NoYTEob3B0LCBvYmotPnNoYTEsIG5hbWUsIDApOworCWlmIChvYmotPnR5cGUgPT0gT0JKX0NPTU1JVCB8fCBvYmotPnR5cGUgPT0gT0JKX1RSRUUpIHsKKwkJc3RydWN0IHRyZWVfZGVzYyB0cmVlOworCQl2b2lkICpkYXRhOworCQl1bnNpZ25lZCBsb25nIHNpemU7CisJCWludCBoaXQ7CisJCWRhdGEgPSByZWFkX29iamVjdF93aXRoX3JlZmVyZW5jZShvYmotPnNoYTEsIHRyZWVfdHlwZSwKKwkJCQkJCSAgJnNpemUsIE5VTEwpOworCQlpZiAoIWRhdGEpCisJCQlkaWUoInVuYWJsZSB0byByZWFkIHRyZWUgKCVzKSIsIHNoYTFfdG9faGV4KG9iai0+c2hhMSkpOworCQlpbml0X3RyZWVfZGVzYygmdHJlZSwgZGF0YSwgc2l6ZSk7CisJCWhpdCA9IGdyZXBfdHJlZShvcHQsIHBhdGhzLCAmdHJlZSwgbmFtZSwgIiIpOworCQlmcmVlKGRhdGEpOworCQlyZXR1cm4gaGl0OworCX0KKwlkaWUoInVuYWJsZSB0byBncmVwIGZyb20gb2JqZWN0IG9mIHR5cGUgJXMiLCB0eXBlbmFtZShvYmotPnR5cGUpKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgYnVpbHRpbl9ncmVwX3VzYWdlW10gPQorImdpdC1ncmVwIDxvcHRpb24+KiA8cmV2PiogWy1lXSA8cGF0dGVybj4gWzxwYXRoPi4uLl0iOworCitzdGF0aWMgY29uc3QgY2hhciBlbXNnX2ludmFsaWRfY29udGV4dF9sZW5bXSA9CisiJXM6IGludmFsaWQgY29udGV4dCBsZW5ndGggYXJndW1lbnQiOworc3RhdGljIGNvbnN0IGNoYXIgZW1zZ19taXNzaW5nX2NvbnRleHRfbGVuW10gPQorIm1pc3NpbmcgY29udGV4dCBsZW5ndGggYXJndW1lbnQiOworc3RhdGljIGNvbnN0IGNoYXIgZW1zZ19taXNzaW5nX2FyZ3VtZW50W10gPQorIm9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCAtJXMiOworCitpbnQgY21kX2dyZXAoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGhpdCA9IDA7CisJaW50IGNhY2hlZCA9IDA7CisJaW50IHNlZW5fZGFzaGRhc2ggPSAwOworCXN0cnVjdCBncmVwX29wdCBvcHQ7CisJc3RydWN0IG9iamVjdF9hcnJheSBsaXN0ID0geyAwLCAwLCBOVUxMIH07CisJY29uc3QgY2hhciAqKnBhdGhzID0gTlVMTDsKKwlpbnQgaTsKKworCW1lbXNldCgmb3B0LCAwLCBzaXplb2Yob3B0KSk7CisJb3B0LnByZWZpeF9sZW5ndGggPSAocHJlZml4ICYmICpwcmVmaXgpID8gc3RybGVuKHByZWZpeCkgOiAwOworCW9wdC5yZWxhdGl2ZSA9IDE7CisJb3B0LnBhdGhuYW1lID0gMTsKKwlvcHQucGF0dGVybl90YWlsID0gJm9wdC5wYXR0ZXJuX2xpc3Q7CisJb3B0LnJlZ2ZsYWdzID0gUkVHX05FV0xJTkU7CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIG5vIC0tIHRoZW4gdGhlIHBhdGhzIG11c3QgZXhpc3QgaW4gdGhlIHdvcmtpbmcKKwkgKiB0cmVlLiAgSWYgdGhlcmUgaXMgbm8gZXhwbGljaXQgcGF0dGVybiBzcGVjaWZpZWQgd2l0aCAtZSBvcgorCSAqIC1mLCB3ZSB0YWtlIHRoZSBmaXJzdCB1bnJlY29nbml6ZWQgbm9uIG9wdGlvbiB0byBiZSB0aGUKKwkgKiBwYXR0ZXJuLCBidXQgdGhlbiB3aGF0IGZvbGxvd3MgaXQgbXVzdCBiZSB6ZXJvIG9yIG1vcmUKKwkgKiB2YWxpZCByZWZzIHVwIHRvIHRoZSAtLSAoaWYgZXhpc3RzKSwgYW5kIHRoZW4gZXhpc3RpbmcKKwkgKiBwYXRocy4gIElmIHRoZXJlIGlzIGFuIGV4cGxpY2l0IHBhdHRlcm4sIHRoZW4gdGhlIGZpcnN0CisJICogdW5yZWNvZ25pemVkIG5vbiBvcHRpb24gaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVmcyBsaXN0CisJICogdGhhdCBjb250aW51ZXMgdXAgdG8gdGhlIC0tIChpZiBleGlzdHMpLCBhbmQgdGhlbiBwYXRocy4KKwkgKi8KKworCXdoaWxlICgxIDwgYXJnYykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2WzFdOworCQlhcmdjLS07IGFyZ3YrKzsKKwkJaWYgKCFzdHJjbXAoIi0tY2FjaGVkIiwgYXJnKSkgeworCQkJY2FjaGVkID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItYSIsIGFyZykgfHwKKwkJICAgICFzdHJjbXAoIi0tdGV4dCIsIGFyZykpIHsKKwkJCW9wdC5iaW5hcnkgPSBHUkVQX0JJTkFSWV9URVhUOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi1pIiwgYXJnKSB8fAorCQkgICAgIXN0cmNtcCgiLS1pZ25vcmUtY2FzZSIsIGFyZykpIHsKKwkJCW9wdC5yZWdmbGFncyB8PSBSRUdfSUNBU0U7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLUkiLCBhcmcpKSB7CisJCQlvcHQuYmluYXJ5ID0gR1JFUF9CSU5BUllfTk9NQVRDSDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItdiIsIGFyZykgfHwKKwkJICAgICFzdHJjbXAoIi0taW52ZXJ0LW1hdGNoIiwgYXJnKSkgeworCQkJb3B0LmludmVydCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLUUiLCBhcmcpIHx8CisJCSAgICAhc3RyY21wKCItLWV4dGVuZGVkLXJlZ2V4cCIsIGFyZykpIHsKKwkJCW9wdC5yZWdmbGFncyB8PSBSRUdfRVhURU5ERUQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLUYiLCBhcmcpIHx8CisJCSAgICAhc3RyY21wKCItLWZpeGVkLXN0cmluZ3MiLCBhcmcpKSB7CisJCQlvcHQuZml4ZWQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi1HIiwgYXJnKSB8fAorCQkgICAgIXN0cmNtcCgiLS1iYXNpYy1yZWdleHAiLCBhcmcpKSB7CisJCQlvcHQucmVnZmxhZ3MgJj0gflJFR19FWFRFTkRFRDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItbiIsIGFyZykpIHsKKwkJCW9wdC5saW5lbnVtID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItaCIsIGFyZykpIHsKKwkJCW9wdC5wYXRobmFtZSA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLUgiLCBhcmcpKSB7CisJCQlvcHQucGF0aG5hbWUgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi1sIiwgYXJnKSB8fAorCQkgICAgIXN0cmNtcCgiLS1uYW1lLW9ubHkiLCBhcmcpIHx8CisJCSAgICAhc3RyY21wKCItLWZpbGVzLXdpdGgtbWF0Y2hlcyIsIGFyZykpIHsKKwkJCW9wdC5uYW1lX29ubHkgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi1MIiwgYXJnKSB8fAorCQkgICAgIXN0cmNtcCgiLS1maWxlcy13aXRob3V0LW1hdGNoIiwgYXJnKSkgeworCQkJb3B0LnVubWF0Y2hfbmFtZV9vbmx5ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItYyIsIGFyZykgfHwKKwkJICAgICFzdHJjbXAoIi0tY291bnQiLCBhcmcpKSB7CisJCQlvcHQuY291bnQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi13IiwgYXJnKSB8fAorCQkgICAgIXN0cmNtcCgiLS13b3JkLXJlZ2V4cCIsIGFyZykpIHsKKwkJCW9wdC53b3JkX3JlZ2V4cCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItQSIpIHx8CisJCSAgICAhcHJlZml4Y21wKGFyZywgIi1CIikgfHwKKwkJICAgICFwcmVmaXhjbXAoYXJnLCAiLUMiKSB8fAorCQkgICAgKGFyZ1swXSA9PSAnLScgJiYgJzEnIDw9IGFyZ1sxXSAmJiBhcmdbMV0gPD0gJzknKSkgeworCQkJdW5zaWduZWQgbnVtOworCQkJY29uc3QgY2hhciAqc2NhbjsKKwkJCXN3aXRjaCAoYXJnWzFdKSB7CisJCQljYXNlICdBJzogY2FzZSAnQic6IGNhc2UgJ0MnOgorCQkJCWlmICghYXJnWzJdKSB7CisJCQkJCWlmIChhcmdjIDw9IDEpCisJCQkJCQlkaWUoZW1zZ19taXNzaW5nX2NvbnRleHRfbGVuKTsKKwkJCQkJc2NhbiA9ICorK2FyZ3Y7CisJCQkJCWFyZ2MtLTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlzY2FuID0gYXJnICsgMjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJc2NhbiA9IGFyZyArIDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc3RydG91bF91aShzY2FuLCAxMCwgJm51bSkpCisJCQkJZGllKGVtc2dfaW52YWxpZF9jb250ZXh0X2xlbiwgc2Nhbik7CisJCQlzd2l0Y2ggKGFyZ1sxXSkgeworCQkJY2FzZSAnQSc6CisJCQkJb3B0LnBvc3RfY29udGV4dCA9IG51bTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQljYXNlICdDJzoKKwkJCQlvcHQucG9zdF9jb250ZXh0ID0gbnVtOworCQkJY2FzZSAnQic6CisJCQkJb3B0LnByZV9jb250ZXh0ID0gbnVtOworCQkJCWJyZWFrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi1mIiwgYXJnKSkgeworCQkJRklMRSAqcGF0dGVybnM7CisJCQlpbnQgbG5vID0gMDsKKwkJCWNoYXIgYnVmWzEwMjRdOworCQkJaWYgKGFyZ2MgPD0gMSkKKwkJCQlkaWUoZW1zZ19taXNzaW5nX2FyZ3VtZW50LCBhcmcpOworCQkJcGF0dGVybnMgPSBmb3Blbihhcmd2WzFdLCAiciIpOworCQkJaWYgKCFwYXR0ZXJucykKKwkJCQlkaWUoIiclcyc6ICVzIiwgYXJndlsxXSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBwYXR0ZXJucykpIHsKKwkJCQlpbnQgbGVuID0gc3RybGVuKGJ1Zik7CisJCQkJaWYgKGxlbiAmJiBidWZbbGVuLTFdID09ICdcbicpCisJCQkJCWJ1ZltsZW4tMV0gPSAwOworCQkJCS8qIGlnbm9yZSBlbXB0eSBsaW5lIGxpa2UgZ3JlcCBkb2VzICovCisJCQkJaWYgKCFidWZbMF0pCisJCQkJCWNvbnRpbnVlOworCQkJCWFwcGVuZF9ncmVwX3BhdHRlcm4oJm9wdCwgeHN0cmR1cChidWYpLAorCQkJCQkJICAgIGFyZ3ZbMV0sICsrbG5vLAorCQkJCQkJICAgIEdSRVBfUEFUVEVSTik7CisJCQl9CisJCQlmY2xvc2UocGF0dGVybnMpOworCQkJYXJndisrOworCQkJYXJnYy0tOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi0tbm90IiwgYXJnKSkgeworCQkJYXBwZW5kX2dyZXBfcGF0dGVybigmb3B0LCBhcmcsICJjb21tYW5kIGxpbmUiLCAwLAorCQkJCQkgICAgR1JFUF9OT1QpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi0tYW5kIiwgYXJnKSkgeworCQkJYXBwZW5kX2dyZXBfcGF0dGVybigmb3B0LCBhcmcsICJjb21tYW5kIGxpbmUiLCAwLAorCQkJCQkgICAgR1JFUF9BTkQpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi0tb3IiLCBhcmcpKQorCQkJY29udGludWU7IC8qIG5vLW9wICovCisJCWlmICghc3RyY21wKCIoIiwgYXJnKSkgeworCQkJYXBwZW5kX2dyZXBfcGF0dGVybigmb3B0LCBhcmcsICJjb21tYW5kIGxpbmUiLCAwLAorCQkJCQkgICAgR1JFUF9PUEVOX1BBUkVOKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCIpIiwgYXJnKSkgeworCQkJYXBwZW5kX2dyZXBfcGF0dGVybigmb3B0LCBhcmcsICJjb21tYW5kIGxpbmUiLCAwLAorCQkJCQkgICAgR1JFUF9DTE9TRV9QQVJFTik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLS1hbGwtbWF0Y2giLCBhcmcpKSB7CisJCQlvcHQuYWxsX21hdGNoID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItZSIsIGFyZykpIHsKKwkJCWlmICgxIDwgYXJnYykgeworCQkJCWFwcGVuZF9ncmVwX3BhdHRlcm4oJm9wdCwgYXJndlsxXSwKKwkJCQkJCSAgICAiLWUgb3B0aW9uIiwgMCwKKwkJCQkJCSAgICBHUkVQX1BBVFRFUk4pOworCQkJCWFyZ3YrKzsKKwkJCQlhcmdjLS07CisJCQkJY29udGludWU7CisJCQl9CisJCQlkaWUoZW1zZ19taXNzaW5nX2FyZ3VtZW50LCBhcmcpOworCQl9CisJCWlmICghc3RyY21wKCItLWZ1bGwtbmFtZSIsIGFyZykpIHsKKwkJCW9wdC5yZWxhdGl2ZSA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLS0iLCBhcmcpKSB7CisJCQkvKiBsYXRlciBwcm9jZXNzaW5nIHdhbnRzIHRvIGhhdmUgdGhpcyBhdCBhcmd2WzFdICovCisJCQlhcmd2LS07CisJCQlhcmdjKys7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKmFyZyA9PSAnLScpCisJCQl1c2FnZShidWlsdGluX2dyZXBfdXNhZ2UpOworCisJCS8qIEZpcnN0IHVucmVjb2duaXplZCBub24tb3B0aW9uIHRva2VuICovCisJCWlmICghb3B0LnBhdHRlcm5fbGlzdCkgeworCQkJYXBwZW5kX2dyZXBfcGF0dGVybigmb3B0LCBhcmcsICJjb21tYW5kIGxpbmUiLCAwLAorCQkJCQkgICAgR1JFUF9QQVRURVJOKTsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UgeworCQkJLyogV2UgYXJlIGxvb2tpbmcgYXQgdGhlIGZpcnN0IHBhdGggb3IgcmV2OworCQkJICogaXQgaXMgZm91bmQgYXQgYXJndlsxXSBhZnRlciBsZWF2aW5nIHRoZQorCQkJICogbG9vcC4KKwkJCSAqLworCQkJYXJnYysrOyBhcmd2LS07CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghb3B0LnBhdHRlcm5fbGlzdCkKKwkJZGllKCJubyBwYXR0ZXJuIGdpdmVuLiIpOworCWlmICgob3B0LnJlZ2ZsYWdzICE9IFJFR19ORVdMSU5FKSAmJiBvcHQuZml4ZWQpCisJCWRpZSgiY2Fubm90IG1peCAtLWZpeGVkLXN0cmluZ3MgYW5kIHJlZ2V4cCIpOworCWNvbXBpbGVfZ3JlcF9wYXR0ZXJucygmb3B0KTsKKworCS8qIENoZWNrIHJldnMgYW5kIHRoZW4gcGF0aHMgKi8KKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCS8qIElzIGl0IGEgcmV2PyAqLworCQlpZiAoIWdldF9zaGExKGFyZywgc2hhMSkpIHsKKwkJCXN0cnVjdCBvYmplY3QgKm9iamVjdCA9IHBhcnNlX29iamVjdChzaGExKTsKKwkJCWlmICghb2JqZWN0KQorCQkJCWRpZSgiYmFkIG9iamVjdCAlcyIsIGFyZyk7CisJCQlhZGRfb2JqZWN0X2FycmF5KG9iamVjdCwgYXJnLCAmbGlzdCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLSIpKSB7CisJCQlpKys7CisJCQlzZWVuX2Rhc2hkYXNoID0gMTsKKwkJfQorCQlicmVhazsKKwl9CisKKwkvKiBUaGUgcmVzdCBhcmUgcGF0aHMgKi8KKwlpZiAoIXNlZW5fZGFzaGRhc2gpIHsKKwkJaW50IGo7CisJCWZvciAoaiA9IGk7IGogPCBhcmdjOyBqKyspCisJCQl2ZXJpZnlfZmlsZW5hbWUocHJlZml4LCBhcmd2W2pdKTsKKwl9CisKKwlpZiAoaSA8IGFyZ2MpIHsKKwkJcGF0aHMgPSBnZXRfcGF0aHNwZWMocHJlZml4LCBhcmd2ICsgaSk7CisJCWlmIChvcHQucHJlZml4X2xlbmd0aCAmJiBvcHQucmVsYXRpdmUpIHsKKwkJCS8qIE1ha2Ugc3VyZSB3ZSBkbyBub3QgZ2V0IG91dHNpZGUgb2YgcGF0aHMgKi8KKwkJCWZvciAoaSA9IDA7IHBhdGhzW2ldOyBpKyspCisJCQkJaWYgKHN0cm5jbXAocHJlZml4LCBwYXRoc1tpXSwgb3B0LnByZWZpeF9sZW5ndGgpKQorCQkJCQlkaWUoImdpdC1ncmVwOiBjYW5ub3QgZ2VuZXJhdGUgcmVsYXRpdmUgZmlsZW5hbWVzIGNvbnRhaW5pbmcgJy4uJyIpOworCQl9CisJfQorCWVsc2UgaWYgKHByZWZpeCkgeworCQlwYXRocyA9IHhjYWxsb2MoMiwgc2l6ZW9mKGNvbnN0IGNoYXIgKikpOworCQlwYXRoc1swXSA9IHByZWZpeDsKKwkJcGF0aHNbMV0gPSBOVUxMOworCX0KKworCWlmICghbGlzdC5ucikKKwkJcmV0dXJuICFncmVwX2NhY2hlKCZvcHQsIHBhdGhzLCBjYWNoZWQpOworCisJaWYgKGNhY2hlZCkKKwkJZGllKCJib3RoIC0tY2FjaGVkIGFuZCB0cmVlcyBhcmUgZ2l2ZW4uIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGlzdC5ucjsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3QgKnJlYWxfb2JqOworCQlyZWFsX29iaiA9IGRlcmVmX3RhZyhsaXN0Lm9iamVjdHNbaV0uaXRlbSwgTlVMTCwgMCk7CisJCWlmIChncmVwX29iamVjdCgmb3B0LCBwYXRocywgcmVhbF9vYmosIGxpc3Qub2JqZWN0c1tpXS5uYW1lKSkKKwkJCWhpdCA9IDE7CisJfQorCWZyZWVfZ3JlcF9wYXR0ZXJucygmb3B0KTsKKwlyZXR1cm4gIWhpdDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4taHR0cC1mZXRjaC5jIGIvYnVpbHRpbi1odHRwLWZldGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFmMzM4OQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4taHR0cC1mZXRjaC5jCkBAIC0wLDAgKzEsODYgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgIndhbGtlci5oIgorCitpbnQgY21kX2h0dHBfZmV0Y2goaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IHdhbGtlciAqd2Fsa2VyOworCWludCBjb21taXRzX29uX3N0ZGluID0gMDsKKwlpbnQgY29tbWl0czsKKwljb25zdCBjaGFyICoqd3JpdGVfcmVmID0gTlVMTDsKKwljaGFyICoqY29tbWl0X2lkOworCWNvbnN0IGNoYXIgKnVybDsKKwljaGFyICpyZXdyaXR0ZW5fdXJsID0gTlVMTDsKKwlpbnQgYXJnID0gMTsKKwlpbnQgcmMgPSAwOworCWludCBnZXRfdHJlZSA9IDA7CisJaW50IGdldF9oaXN0b3J5ID0gMDsKKwlpbnQgZ2V0X2FsbCA9IDA7CisJaW50IGdldF92ZXJib3NlbHkgPSAwOworCWludCBnZXRfcmVjb3ZlciA9IDA7CisKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwl3aGlsZSAoYXJnIDwgYXJnYyAmJiBhcmd2W2FyZ11bMF0gPT0gJy0nKSB7CisJCWlmIChhcmd2W2FyZ11bMV0gPT0gJ3QnKSB7CisJCQlnZXRfdHJlZSA9IDE7CisJCX0gZWxzZSBpZiAoYXJndlthcmddWzFdID09ICdjJykgeworCQkJZ2V0X2hpc3RvcnkgPSAxOworCQl9IGVsc2UgaWYgKGFyZ3ZbYXJnXVsxXSA9PSAnYScpIHsKKwkJCWdldF9hbGwgPSAxOworCQkJZ2V0X3RyZWUgPSAxOworCQkJZ2V0X2hpc3RvcnkgPSAxOworCQl9IGVsc2UgaWYgKGFyZ3ZbYXJnXVsxXSA9PSAndicpIHsKKwkJCWdldF92ZXJib3NlbHkgPSAxOworCQl9IGVsc2UgaWYgKGFyZ3ZbYXJnXVsxXSA9PSAndycpIHsKKwkJCXdyaXRlX3JlZiA9ICZhcmd2W2FyZyArIDFdOworCQkJYXJnKys7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2FyZ10sICItLXJlY292ZXIiKSkgeworCQkJZ2V0X3JlY292ZXIgPSAxOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlthcmddLCAiLS1zdGRpbiIpKSB7CisJCQljb21taXRzX29uX3N0ZGluID0gMTsKKwkJfQorCQlhcmcrKzsKKwl9CisJaWYgKGFyZ2MgPCBhcmcgKyAyIC0gY29tbWl0c19vbl9zdGRpbikgeworCQl1c2FnZSgiZ2l0LWh0dHAtZmV0Y2ggWy1jXSBbLXRdIFstYV0gWy12XSBbLS1yZWNvdmVyXSBbLXcgcmVmXSBbLS1zdGRpbl0gY29tbWl0LWlkIHVybCIpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGNvbW1pdHNfb25fc3RkaW4pIHsKKwkJY29tbWl0cyA9IHdhbGtlcl90YXJnZXRzX3N0ZGluKCZjb21taXRfaWQsICZ3cml0ZV9yZWYpOworCX0gZWxzZSB7CisJCWNvbW1pdF9pZCA9IChjaGFyICoqKSAmYXJndlthcmcrK107CisJCWNvbW1pdHMgPSAxOworCX0KKwl1cmwgPSBhcmd2W2FyZ107CisJaWYgKHVybCAmJiB1cmxbc3RybGVuKHVybCktMV0gIT0gJy8nKSB7CisJCXJld3JpdHRlbl91cmwgPSBtYWxsb2Moc3RybGVuKHVybCkrMik7CisJCXN0cmNweShyZXdyaXR0ZW5fdXJsLCB1cmwpOworCQlzdHJjYXQocmV3cml0dGVuX3VybCwgIi8iKTsKKwkJdXJsID0gcmV3cml0dGVuX3VybDsKKwl9CisKKwl3YWxrZXIgPSBnZXRfaHR0cF93YWxrZXIodXJsLCBOVUxMKTsKKwl3YWxrZXItPmdldF90cmVlID0gZ2V0X3RyZWU7CisJd2Fsa2VyLT5nZXRfaGlzdG9yeSA9IGdldF9oaXN0b3J5OworCXdhbGtlci0+Z2V0X2FsbCA9IGdldF9hbGw7CisJd2Fsa2VyLT5nZXRfdmVyYm9zZWx5ID0gZ2V0X3ZlcmJvc2VseTsKKwl3YWxrZXItPmdldF9yZWNvdmVyID0gZ2V0X3JlY292ZXI7CisKKwlyYyA9IHdhbGtlcl9mZXRjaCh3YWxrZXIsIGNvbW1pdHMsIGNvbW1pdF9pZCwgd3JpdGVfcmVmLCB1cmwpOworCisJaWYgKGNvbW1pdHNfb25fc3RkaW4pCisJCXdhbGtlcl90YXJnZXRzX2ZyZWUoY29tbWl0cywgY29tbWl0X2lkLCB3cml0ZV9yZWYpOworCisJaWYgKHdhbGtlci0+Y29ycnVwdF9vYmplY3RfZm91bmQpIHsKKwkJZnByaW50ZihzdGRlcnIsCisiU29tZSBsb29zZSBvYmplY3Qgd2VyZSBmb3VuZCB0byBiZSBjb3JydXB0LCBidXQgdGhleSBtaWdodCBiZSBqdXN0XG4iCisiYSBmYWxzZSAnNDA0IE5vdCBGb3VuZCcgZXJyb3IgbWVzc2FnZSBzZW50IHdpdGggaW5jb3JyZWN0IEhUVFBcbiIKKyJzdGF0dXMgY29kZS4gIFN1Z2dlc3QgcnVubmluZyBnaXQtZnNjay5cbiIpOworCX0KKworCXdhbGtlcl9mcmVlKHdhbGtlcik7CisKKwlmcmVlKHJld3JpdHRlbl91cmwpOworCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1pbml0LWRiLmMgYi9idWlsdGluLWluaXQtZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODU0ODY4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1pbml0LWRiLmMKQEAgLTAsMCArMSw0MTcgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJleGVjX2NtZC5oIgorCisjaWZuZGVmIERFRkFVTFRfR0lUX1RFTVBMQVRFX0RJUgorI2RlZmluZSBERUZBVUxUX0dJVF9URU1QTEFURV9ESVIgIi91c3Ivc2hhcmUvZ2l0LWNvcmUvdGVtcGxhdGVzIgorI2VuZGlmCisKKyNpZmRlZiBOT19UUlVTVEFCTEVfRklMRU1PREUKKyNkZWZpbmUgVEVTVF9GSUxFTU9ERSAwCisjZWxzZQorI2RlZmluZSBURVNUX0ZJTEVNT0RFIDEKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzYWZlX2NyZWF0ZV9kaXIoY29uc3QgY2hhciAqZGlyLCBpbnQgc2hhcmUpCit7CisJaWYgKG1rZGlyKGRpciwgMDc3NykgPCAwKSB7CisJCWlmIChlcnJubyAhPSBFRVhJU1QpIHsKKwkJCXBlcnJvcihkaXIpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKwllbHNlIGlmIChzaGFyZSAmJiBhZGp1c3Rfc2hhcmVkX3Blcm0oZGlyKSkKKwkJZGllKCJDb3VsZCBub3QgbWFrZSAlcyB3cml0YWJsZSBieSBncm91cFxuIiwgZGlyKTsKK30KKworc3RhdGljIHZvaWQgY29weV90ZW1wbGF0ZXNfMShjaGFyICpwYXRoLCBpbnQgYmFzZWxlbiwKKwkJCSAgICAgY2hhciAqdGVtcGxhdGUsIGludCB0ZW1wbGF0ZV9iYXNlbGVuLAorCQkJICAgICBESVIgKmRpcikKK3sKKwlzdHJ1Y3QgZGlyZW50ICpkZTsKKworCS8qIE5vdGU6IGlmICIuZ2l0L2hvb2tzIiBmaWxlIGV4aXN0cyBpbiB0aGUgcmVwb3NpdG9yeSBiZWluZworCSAqIHJlLWluaXRpYWxpemVkLCAvZXRjL2NvcmUtZ2l0L3RlbXBsYXRlcy9ob29rcy91cGRhdGUgd291bGQKKwkgKiBjYXVzZSBnaXQtaW5pdCB0byBmYWlsIGhlcmUuICBJIHRoaW5rIHRoaXMgaXMgc2FuZSBidXQKKwkgKiBpdCBtZWFucyB0aGF0IHRoZSBzZXQgb2YgdGVtcGxhdGVzIHdlIHNoaXAgYnkgZGVmYXVsdCwgYWxvbmcKKwkgKiB3aXRoIHRoZSB3YXkgdGhlIG5hbWVzcGFjZSB1bmRlciAuZ2l0LyBpcyBvcmdhbml6ZWQsIHNob3VsZAorCSAqIGJlIHJlYWxseSBjYXJlZnVsbHkgY2hvc2VuLgorCSAqLworCXNhZmVfY3JlYXRlX2RpcihwYXRoLCAxKTsKKwl3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCXN0cnVjdCBzdGF0IHN0X2dpdCwgc3RfdGVtcGxhdGU7CisJCWludCBuYW1lbGVuOworCQlpbnQgZXhpc3RzID0gMDsKKworCQlpZiAoZGUtPmRfbmFtZVswXSA9PSAnLicpCisJCQljb250aW51ZTsKKwkJbmFtZWxlbiA9IHN0cmxlbihkZS0+ZF9uYW1lKTsKKwkJaWYgKChQQVRIX01BWCA8PSBiYXNlbGVuICsgbmFtZWxlbikgfHwKKwkJICAgIChQQVRIX01BWCA8PSB0ZW1wbGF0ZV9iYXNlbGVuICsgbmFtZWxlbikpCisJCQlkaWUoImluc2FuZWx5IGxvbmcgdGVtcGxhdGUgbmFtZSAlcyIsIGRlLT5kX25hbWUpOworCQltZW1jcHkocGF0aCArIGJhc2VsZW4sIGRlLT5kX25hbWUsIG5hbWVsZW4rMSk7CisJCW1lbWNweSh0ZW1wbGF0ZSArIHRlbXBsYXRlX2Jhc2VsZW4sIGRlLT5kX25hbWUsIG5hbWVsZW4rMSk7CisJCWlmIChsc3RhdChwYXRoLCAmc3RfZ2l0KSkgeworCQkJaWYgKGVycm5vICE9IEVOT0VOVCkKKwkJCQlkaWUoImNhbm5vdCBzdGF0ICVzIiwgcGF0aCk7CisJCX0KKwkJZWxzZQorCQkJZXhpc3RzID0gMTsKKworCQlpZiAobHN0YXQodGVtcGxhdGUsICZzdF90ZW1wbGF0ZSkpCisJCQlkaWUoImNhbm5vdCBzdGF0IHRlbXBsYXRlICVzIiwgdGVtcGxhdGUpOworCisJCWlmIChTX0lTRElSKHN0X3RlbXBsYXRlLnN0X21vZGUpKSB7CisJCQlESVIgKnN1YmRpciA9IG9wZW5kaXIodGVtcGxhdGUpOworCQkJaW50IGJhc2VsZW5fc3ViID0gYmFzZWxlbiArIG5hbWVsZW47CisJCQlpbnQgdGVtcGxhdGVfYmFzZWxlbl9zdWIgPSB0ZW1wbGF0ZV9iYXNlbGVuICsgbmFtZWxlbjsKKwkJCWlmICghc3ViZGlyKQorCQkJCWRpZSgiY2Fubm90IG9wZW5kaXIgJXMiLCB0ZW1wbGF0ZSk7CisJCQlwYXRoW2Jhc2VsZW5fc3ViKytdID0KKwkJCQl0ZW1wbGF0ZVt0ZW1wbGF0ZV9iYXNlbGVuX3N1YisrXSA9ICcvJzsKKwkJCXBhdGhbYmFzZWxlbl9zdWJdID0KKwkJCQl0ZW1wbGF0ZVt0ZW1wbGF0ZV9iYXNlbGVuX3N1Yl0gPSAwOworCQkJY29weV90ZW1wbGF0ZXNfMShwYXRoLCBiYXNlbGVuX3N1YiwKKwkJCQkJIHRlbXBsYXRlLCB0ZW1wbGF0ZV9iYXNlbGVuX3N1YiwKKwkJCQkJIHN1YmRpcik7CisJCQljbG9zZWRpcihzdWJkaXIpOworCQl9CisJCWVsc2UgaWYgKGV4aXN0cykKKwkJCWNvbnRpbnVlOworCQllbHNlIGlmIChTX0lTTE5LKHN0X3RlbXBsYXRlLnN0X21vZGUpKSB7CisJCQljaGFyIGxua1syNTZdOworCQkJaW50IGxlbjsKKwkJCWxlbiA9IHJlYWRsaW5rKHRlbXBsYXRlLCBsbmssIHNpemVvZihsbmspKTsKKwkJCWlmIChsZW4gPCAwKQorCQkJCWRpZSgiY2Fubm90IHJlYWRsaW5rICVzIiwgdGVtcGxhdGUpOworCQkJaWYgKHNpemVvZihsbmspIDw9IGxlbikKKwkJCQlkaWUoImluc2FuZWx5IGxvbmcgc3ltbGluayAlcyIsIHRlbXBsYXRlKTsKKwkJCWxua1tsZW5dID0gMDsKKwkJCWlmIChzeW1saW5rKGxuaywgcGF0aCkpCisJCQkJZGllKCJjYW5ub3Qgc3ltbGluayAlcyAlcyIsIGxuaywgcGF0aCk7CisJCX0KKwkJZWxzZSBpZiAoU19JU1JFRyhzdF90ZW1wbGF0ZS5zdF9tb2RlKSkgeworCQkJaWYgKGNvcHlfZmlsZShwYXRoLCB0ZW1wbGF0ZSwgc3RfdGVtcGxhdGUuc3RfbW9kZSkpCisJCQkJZGllKCJjYW5ub3QgY29weSAlcyB0byAlcyIsIHRlbXBsYXRlLCBwYXRoKTsKKwkJfQorCQllbHNlCisJCQllcnJvcigiaWdub3JpbmcgdGVtcGxhdGUgJXMiLCB0ZW1wbGF0ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjb3B5X3RlbXBsYXRlcyhjb25zdCBjaGFyICpnaXRfZGlyLCBpbnQgbGVuLCBjb25zdCBjaGFyICp0ZW1wbGF0ZV9kaXIpCit7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwljaGFyIHRlbXBsYXRlX3BhdGhbUEFUSF9NQVhdOworCWludCB0ZW1wbGF0ZV9sZW47CisJRElSICpkaXI7CisKKwlpZiAoIXRlbXBsYXRlX2RpcikKKwkJdGVtcGxhdGVfZGlyID0gZ2V0ZW52KFRFTVBMQVRFX0RJUl9FTlZJUk9OTUVOVCk7CisJaWYgKCF0ZW1wbGF0ZV9kaXIpIHsKKwkJLyoKKwkJICogaWYgdGhlIGhhcmQtY29kZWQgdGVtcGxhdGUgaXMgcmVsYXRpdmUsIGl0IGlzCisJCSAqIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSBleGVjX2RpcgorCQkgKi8KKwkJdGVtcGxhdGVfZGlyID0gREVGQVVMVF9HSVRfVEVNUExBVEVfRElSOworCQlpZiAoIWlzX2Fic29sdXRlX3BhdGgodGVtcGxhdGVfZGlyKSkgeworCQkJc3RydWN0IHN0cmJ1ZiBkID0gU1RSQlVGX0lOSVQ7CisJCQlzdHJidWZfYWRkZigmZCwgIiVzLyVzIiwgZ2l0X2V4ZWNfcGF0aCgpLCB0ZW1wbGF0ZV9kaXIpOworCQkJdGVtcGxhdGVfZGlyID0gc3RyYnVmX2RldGFjaCgmZCwgTlVMTCk7CisJCX0KKwl9CisJc3RyY3B5KHRlbXBsYXRlX3BhdGgsIHRlbXBsYXRlX2Rpcik7CisJdGVtcGxhdGVfbGVuID0gc3RybGVuKHRlbXBsYXRlX3BhdGgpOworCWlmICh0ZW1wbGF0ZV9wYXRoW3RlbXBsYXRlX2xlbi0xXSAhPSAnLycpIHsKKwkJdGVtcGxhdGVfcGF0aFt0ZW1wbGF0ZV9sZW4rK10gPSAnLyc7CisJCXRlbXBsYXRlX3BhdGhbdGVtcGxhdGVfbGVuXSA9IDA7CisJfQorCWRpciA9IG9wZW5kaXIodGVtcGxhdGVfcGF0aCk7CisJaWYgKCFkaXIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJ3YXJuaW5nOiB0ZW1wbGF0ZXMgbm90IGZvdW5kICVzXG4iLAorCQkJdGVtcGxhdGVfZGlyKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGF0IHRlbXBsYXRlIGlzIGZyb20gdGhlIGNvcnJlY3QgdmludGFnZSAqLworCXN0cmNweSh0ZW1wbGF0ZV9wYXRoICsgdGVtcGxhdGVfbGVuLCAiY29uZmlnIik7CisJcmVwb3NpdG9yeV9mb3JtYXRfdmVyc2lvbiA9IDA7CisJZ2l0X2NvbmZpZ19mcm9tX2ZpbGUoY2hlY2tfcmVwb3NpdG9yeV9mb3JtYXRfdmVyc2lvbiwKKwkJCSAgICAgdGVtcGxhdGVfcGF0aCk7CisJdGVtcGxhdGVfcGF0aFt0ZW1wbGF0ZV9sZW5dID0gMDsKKworCWlmIChyZXBvc2l0b3J5X2Zvcm1hdF92ZXJzaW9uICYmCisJICAgIHJlcG9zaXRvcnlfZm9ybWF0X3ZlcnNpb24gIT0gR0lUX1JFUE9fVkVSU0lPTikgeworCQlmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6IG5vdCBjb3B5aW5nIHRlbXBsYXRlcyBvZiAiCisJCQkiYSB3cm9uZyBmb3JtYXQgdmVyc2lvbiAlZCBmcm9tICclcydcbiIsCisJCQlyZXBvc2l0b3J5X2Zvcm1hdF92ZXJzaW9uLAorCQkJdGVtcGxhdGVfZGlyKTsKKwkJY2xvc2VkaXIoZGlyKTsKKwkJcmV0dXJuOworCX0KKworCW1lbWNweShwYXRoLCBnaXRfZGlyLCBsZW4pOworCXBhdGhbbGVuXSA9IDA7CisJY29weV90ZW1wbGF0ZXNfMShwYXRoLCBsZW4sCisJCQkgdGVtcGxhdGVfcGF0aCwgdGVtcGxhdGVfbGVuLAorCQkJIGRpcik7CisJY2xvc2VkaXIoZGlyKTsKK30KKworc3RhdGljIGludCBjcmVhdGVfZGVmYXVsdF9maWxlcyhjb25zdCBjaGFyICpnaXRfZGlyLCBjb25zdCBjaGFyICp0ZW1wbGF0ZV9wYXRoKQoreworCXVuc2lnbmVkIGxlbiA9IHN0cmxlbihnaXRfZGlyKTsKKwlzdGF0aWMgY2hhciBwYXRoW1BBVEhfTUFYXTsKKwlzdHJ1Y3Qgc3RhdCBzdDE7CisJY2hhciByZXBvX3ZlcnNpb25fc3RyaW5nWzEwXTsKKwljaGFyIGp1bmtbMl07CisJaW50IHJlaW5pdDsKKwlpbnQgZmlsZW1vZGU7CisKKwlpZiAobGVuID4gc2l6ZW9mKHBhdGgpLTUwKQorCQlkaWUoImluc2FuZSBnaXQgZGlyZWN0b3J5ICVzIiwgZ2l0X2Rpcik7CisJbWVtY3B5KHBhdGgsIGdpdF9kaXIsIGxlbik7CisKKwlpZiAobGVuICYmIHBhdGhbbGVuLTFdICE9ICcvJykKKwkJcGF0aFtsZW4rK10gPSAnLyc7CisKKwkvKgorCSAqIENyZWF0ZSAuZ2l0L3JlZnMve2hlYWRzLHRhZ3N9CisJICovCisJc3RyY3B5KHBhdGggKyBsZW4sICJyZWZzIik7CisJc2FmZV9jcmVhdGVfZGlyKHBhdGgsIDEpOworCXN0cmNweShwYXRoICsgbGVuLCAicmVmcy9oZWFkcyIpOworCXNhZmVfY3JlYXRlX2RpcihwYXRoLCAxKTsKKwlzdHJjcHkocGF0aCArIGxlbiwgInJlZnMvdGFncyIpOworCXNhZmVfY3JlYXRlX2RpcihwYXRoLCAxKTsKKworCS8qIEZpcnN0IGNvcHkgdGhlIHRlbXBsYXRlcyAtLSB3ZSBtaWdodCBoYXZlIHRoZSBkZWZhdWx0CisJICogY29uZmlnIGZpbGUgdGhlcmUsIGluIHdoaWNoIGNhc2Ugd2Ugd291bGQgd2FudCB0byByZWFkCisJICogZnJvbSBpdCBhZnRlciBpbnN0YWxsaW5nLgorCSAqLworCXBhdGhbbGVuXSA9IDA7CisJY29weV90ZW1wbGF0ZXMocGF0aCwgbGVuLCB0ZW1wbGF0ZV9wYXRoKTsKKworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCS8qCisJICogV2Ugd291bGQgaGF2ZSBjcmVhdGVkIHRoZSBhYm92ZSB1bmRlciB1c2VyJ3MgdW1hc2sgLS0gdW5kZXIKKwkgKiBzaGFyZWQtcmVwb3NpdG9yeSBzZXR0aW5ncywgd2Ugd291bGQgbmVlZCB0byBmaXggdGhlbSB1cC4KKwkgKi8KKwlpZiAoc2hhcmVkX3JlcG9zaXRvcnkpIHsKKwkJcGF0aFtsZW5dID0gMDsKKwkJYWRqdXN0X3NoYXJlZF9wZXJtKHBhdGgpOworCQlzdHJjcHkocGF0aCArIGxlbiwgInJlZnMiKTsKKwkJYWRqdXN0X3NoYXJlZF9wZXJtKHBhdGgpOworCQlzdHJjcHkocGF0aCArIGxlbiwgInJlZnMvaGVhZHMiKTsKKwkJYWRqdXN0X3NoYXJlZF9wZXJtKHBhdGgpOworCQlzdHJjcHkocGF0aCArIGxlbiwgInJlZnMvdGFncyIpOworCQlhZGp1c3Rfc2hhcmVkX3Blcm0ocGF0aCk7CisJfQorCisJLyoKKwkgKiBDcmVhdGUgdGhlIGRlZmF1bHQgc3ltbGluayBmcm9tICIuZ2l0L0hFQUQiIHRvIHRoZSAibWFzdGVyIgorCSAqIGJyYW5jaCwgaWYgaXQgZG9lcyBub3QgZXhpc3QgeWV0LgorCSAqLworCXN0cmNweShwYXRoICsgbGVuLCAiSEVBRCIpOworCXJlaW5pdCA9ICghYWNjZXNzKHBhdGgsIFJfT0spCisJCSAgfHwgcmVhZGxpbmsocGF0aCwganVuaywgc2l6ZW9mKGp1bmspLTEpICE9IC0xKTsKKwlpZiAoIXJlaW5pdCkgeworCQlpZiAoY3JlYXRlX3N5bXJlZigiSEVBRCIsICJyZWZzL2hlYWRzL21hc3RlciIsIE5VTEwpIDwgMCkKKwkJCWV4aXQoMSk7CisJfQorCisJLyogVGhpcyBmb3JjZXMgY3JlYXRpb24gb2YgbmV3IGNvbmZpZyBmaWxlICovCisJc3ByaW50ZihyZXBvX3ZlcnNpb25fc3RyaW5nLCAiJWQiLCBHSVRfUkVQT19WRVJTSU9OKTsKKwlnaXRfY29uZmlnX3NldCgiY29yZS5yZXBvc2l0b3J5Zm9ybWF0dmVyc2lvbiIsIHJlcG9fdmVyc2lvbl9zdHJpbmcpOworCisJcGF0aFtsZW5dID0gMDsKKwlzdHJjcHkocGF0aCArIGxlbiwgImNvbmZpZyIpOworCisJLyogQ2hlY2sgZmlsZW1vZGUgdHJ1c3RhYmlsaXR5ICovCisJZmlsZW1vZGUgPSBURVNUX0ZJTEVNT0RFOworCWlmIChURVNUX0ZJTEVNT0RFICYmICFsc3RhdChwYXRoLCAmc3QxKSkgeworCQlzdHJ1Y3Qgc3RhdCBzdDI7CisJCWZpbGVtb2RlID0gKCFjaG1vZChwYXRoLCBzdDEuc3RfbW9kZSBeIFNfSVhVU1IpICYmCisJCQkJIWxzdGF0KHBhdGgsICZzdDIpICYmCisJCQkJc3QxLnN0X21vZGUgIT0gc3QyLnN0X21vZGUpOworCX0KKwlnaXRfY29uZmlnX3NldCgiY29yZS5maWxlbW9kZSIsIGZpbGVtb2RlID8gInRydWUiIDogImZhbHNlIik7CisKKwlpZiAoaXNfYmFyZV9yZXBvc2l0b3J5KCkpCisJCWdpdF9jb25maWdfc2V0KCJjb3JlLmJhcmUiLCAidHJ1ZSIpOworCWVsc2UgeworCQljb25zdCBjaGFyICp3b3JrX3RyZWUgPSBnZXRfZ2l0X3dvcmtfdHJlZSgpOworCQlnaXRfY29uZmlnX3NldCgiY29yZS5iYXJlIiwgImZhbHNlIik7CisJCS8qIGFsbG93IHRlbXBsYXRlIGNvbmZpZyBmaWxlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0ICovCisJCWlmIChsb2dfYWxsX3JlZl91cGRhdGVzID09IC0xKQorCQkgICAgZ2l0X2NvbmZpZ19zZXQoImNvcmUubG9nYWxscmVmdXBkYXRlcyIsICJ0cnVlIik7CisJCWlmICh3b3JrX3RyZWUgIT0gZ2l0X3dvcmtfdHJlZV9jZmcpCisJCQlnaXRfY29uZmlnX3NldCgiY29yZS53b3JrdHJlZSIsIHdvcmtfdHJlZSk7CisJfQorCisJLyogQ2hlY2sgaWYgc3ltbGluayBpcyBzdXBwb3J0ZWQgaW4gdGhlIHdvcmsgdHJlZSAqLworCWlmICghcmVpbml0KSB7CisJCXBhdGhbbGVuXSA9IDA7CisJCXN0cmNweShwYXRoICsgbGVuLCAidFhYWFhYWCIpOworCQlpZiAoIWNsb3NlKHhta3N0ZW1wKHBhdGgpKSAmJgorCQkgICAgIXVubGluayhwYXRoKSAmJgorCQkgICAgIXN5bWxpbmsoInRlc3RpbmciLCBwYXRoKSAmJgorCQkgICAgIWxzdGF0KHBhdGgsICZzdDEpICYmCisJCSAgICBTX0lTTE5LKHN0MS5zdF9tb2RlKSkKKwkJCXVubGluayhwYXRoKTsgLyogZ29vZCAqLworCQllbHNlCisJCQlnaXRfY29uZmlnX3NldCgiY29yZS5zeW1saW5rcyIsICJmYWxzZSIpOworCX0KKworCXJldHVybiByZWluaXQ7Cit9CisKK3N0YXRpYyB2b2lkIGd1ZXNzX3JlcG9zaXRvcnlfdHlwZShjb25zdCBjaGFyICpnaXRfZGlyKQoreworCWNoYXIgY3dkW1BBVEhfTUFYXTsKKwljb25zdCBjaGFyICpzbGFzaDsKKworCWlmICgwIDw9IGlzX2JhcmVfcmVwb3NpdG9yeV9jZmcpCisJCXJldHVybjsKKwlpZiAoIWdpdF9kaXIpCisJCXJldHVybjsKKworCS8qCisJICogIkdJVF9ESVI9LiBnaXQgaW5pdCIgaXMgYWx3YXlzIGJhcmUuCisJICogIkdJVF9ESVI9YHB3ZGAgZ2l0IGluaXQiIHRvby4KKwkgKi8KKwlpZiAoIXN0cmNtcCgiLiIsIGdpdF9kaXIpKQorCQlnb3RvIGZvcmNlX2JhcmU7CisJaWYgKCFnZXRjd2QoY3dkLCBzaXplb2YoY3dkKSkpCisJCWRpZSgiY2Fubm90IHRlbGwgY3dkIik7CisJaWYgKCFzdHJjbXAoZ2l0X2RpciwgY3dkKSkKKwkJZ290byBmb3JjZV9iYXJlOworCS8qCisJICogIkdJVF9ESVI9LmdpdCBvciBHSVRfRElSPXNvbWV0aGluZy8uZ2l0IGlzIHVzdWFsbHkgbm90LgorCSAqLworCWlmICghc3RyY21wKGdpdF9kaXIsICIuZ2l0IikpCisJCXJldHVybjsKKwlzbGFzaCA9IHN0cnJjaHIoZ2l0X2RpciwgJy8nKTsKKwlpZiAoc2xhc2ggJiYgIXN0cmNtcChzbGFzaCwgIi8uZ2l0IikpCisJCXJldHVybjsKKworCS8qCisJICogT3RoZXJ3aXNlIGl0IGlzIG9mdGVuIGJhcmUuICBBdCB0aGlzIHBvaW50CisJICogd2UgYXJlIGp1c3QgZ3Vlc3NpbmcuCisJICovCisgZm9yY2VfYmFyZToKKwlpc19iYXJlX3JlcG9zaXRvcnlfY2ZnID0gMTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGluaXRfZGJfdXNhZ2VbXSA9CisiZ2l0LWluaXQgWy1xIHwgLS1xdWlldF0gWy0tdGVtcGxhdGU9PHRlbXBsYXRlLWRpcmVjdG9yeT5dIFstLXNoYXJlZF0iOworCisvKgorICogSWYgeW91IHdhbnQgdG8sIHlvdSBjYW4gc2hhcmUgdGhlIERCIGFyZWEgd2l0aCBhbnkgbnVtYmVyIG9mIGJyYW5jaGVzLgorICogVGhhdCBoYXMgYWR2YW50YWdlczogeW91IGNhbiBzYXZlIHNwYWNlIGJ5IHNoYXJpbmcgYWxsIHRoZSBTSEExIG9iamVjdHMuCisgKiBPbiB0aGUgb3RoZXIgaGFuZCwgaXQgbWlnaHQganVzdCBtYWtlIGxvb2t1cCBzbG93ZXIgYW5kIG1lc3NpZXIuIFlvdQorICogYmUgdGhlIGp1ZGdlLiAgVGhlIGRlZmF1bHQgY2FzZSBpcyB0byBoYXZlIG9uZSBEQiBwZXIgbWFuYWdlZCBkaXJlY3RvcnkuCisgKi8KK2ludCBjbWRfaW5pdF9kYihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwljb25zdCBjaGFyICpnaXRfZGlyOworCWNvbnN0IGNoYXIgKnNoYTFfZGlyOworCWNvbnN0IGNoYXIgKnRlbXBsYXRlX2RpciA9IE5VTEw7CisJY2hhciAqcGF0aDsKKwlpbnQgbGVuLCBpLCByZWluaXQ7CisJaW50IHF1aWV0ID0gMDsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyssIGFyZ3YrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2WzFdOworCQlpZiAoIXByZWZpeGNtcChhcmcsICItLXRlbXBsYXRlPSIpKQorCQkJdGVtcGxhdGVfZGlyID0gYXJnKzExOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tc2hhcmVkIikpCisJCQlzaGFyZWRfcmVwb3NpdG9yeSA9IFBFUk1fR1JPVVA7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1zaGFyZWQ9IikpCisJCQlzaGFyZWRfcmVwb3NpdG9yeSA9IGdpdF9jb25maWdfcGVybSgiYXJnIiwgYXJnKzkpOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi1xIikgfHwgIXN0cmNtcChhcmcsICItLXF1aWV0IikpCisJCSAgICAgICAgcXVpZXQgPSAxOworCQllbHNlCisJCQl1c2FnZShpbml0X2RiX3VzYWdlKTsKKwl9CisKKwkvKgorCSAqIEdJVF9XT1JLX1RSRUUgbWFrZXMgc2Vuc2Ugb25seSBpbiBjb25qdW5jdGlvbiB3aXRoIEdJVF9ESVIKKwkgKiB3aXRob3V0IC0tYmFyZS4gIENhdGNoIHRoZSBlcnJvciBlYXJseS4KKwkgKi8KKwlnaXRfZGlyID0gZ2V0ZW52KEdJVF9ESVJfRU5WSVJPTk1FTlQpOworCWlmICgoIWdpdF9kaXIgfHwgaXNfYmFyZV9yZXBvc2l0b3J5X2NmZyA9PSAxKQorCSAgICAmJiBnZXRlbnYoR0lUX1dPUktfVFJFRV9FTlZJUk9OTUVOVCkpCisJCWRpZSgiJXMgKG9yIC0td29yay10cmVlPTxkaXJlY3Rvcnk+KSBub3QgYWxsb3dlZCB3aXRob3V0ICIKKwkJICAgICJzcGVjaWZ5aW5nICVzIChvciAtLWdpdC1kaXI9PGRpcmVjdG9yeT4pIiwKKwkJICAgIEdJVF9XT1JLX1RSRUVfRU5WSVJPTk1FTlQsCisJCSAgICBHSVRfRElSX0VOVklST05NRU5UKTsKKworCWd1ZXNzX3JlcG9zaXRvcnlfdHlwZShnaXRfZGlyKTsKKworCWlmIChpc19iYXJlX3JlcG9zaXRvcnlfY2ZnIDw9IDApIHsKKwkJZ2l0X3dvcmtfdHJlZV9jZmcgPSB4Y2FsbG9jKFBBVEhfTUFYLCAxKTsKKwkJaWYgKCFnZXRjd2QoZ2l0X3dvcmtfdHJlZV9jZmcsIFBBVEhfTUFYKSkKKwkJCWRpZSAoIkNhbm5vdCBhY2Nlc3MgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4iKTsKKwkJaWYgKGFjY2VzcyhnZXRfZ2l0X3dvcmtfdHJlZSgpLCBYX09LKSkKKwkJCWRpZSAoIkNhbm5vdCBhY2Nlc3Mgd29yayB0cmVlICclcyciLAorCQkJICAgICBnZXRfZ2l0X3dvcmtfdHJlZSgpKTsKKwl9CisKKwkvKgorCSAqIFNldCB1cCB0aGUgZGVmYXVsdCAuZ2l0IGRpcmVjdG9yeSBjb250ZW50cworCSAqLworCWdpdF9kaXIgPSBnZXRlbnYoR0lUX0RJUl9FTlZJUk9OTUVOVCk7CisJaWYgKCFnaXRfZGlyKQorCQlnaXRfZGlyID0gREVGQVVMVF9HSVRfRElSX0VOVklST05NRU5UOworCXNhZmVfY3JlYXRlX2RpcihnaXRfZGlyLCAwKTsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgcmVwb3NpdG9yeSB2ZXJzaW9uIGlzIHJpZ2h0LgorCSAqIE5vdGUgdGhhdCBhIG5ld2x5IGNyZWF0ZWQgcmVwb3NpdG9yeSBkb2VzIG5vdCBoYXZlCisJICogY29uZmlnIGZpbGUsIHNvIHRoaXMgd2lsbCBub3QgZmFpbC4gIFdoYXQgd2UgYXJlIGNhdGNoaW5nCisJICogaXMgYW4gYXR0ZW1wdCB0byByZWluaXRpYWxpemUgbmV3IHJlcG9zaXRvcnkgd2l0aCBhbiBvbGQgdG9vbC4KKwkgKi8KKwljaGVja19yZXBvc2l0b3J5X2Zvcm1hdCgpOworCisJcmVpbml0ID0gY3JlYXRlX2RlZmF1bHRfZmlsZXMoZ2l0X2RpciwgdGVtcGxhdGVfZGlyKTsKKworCS8qCisJICogQW5kIHNldCB1cCB0aGUgb2JqZWN0IHN0b3JlLgorCSAqLworCXNoYTFfZGlyID0gZ2V0X29iamVjdF9kaXJlY3RvcnkoKTsKKwlsZW4gPSBzdHJsZW4oc2hhMV9kaXIpOworCXBhdGggPSB4bWFsbG9jKGxlbiArIDQwKTsKKwltZW1jcHkocGF0aCwgc2hhMV9kaXIsIGxlbik7CisKKwlzYWZlX2NyZWF0ZV9kaXIoc2hhMV9kaXIsIDEpOworCXN0cmNweShwYXRoK2xlbiwgIi9wYWNrIik7CisJc2FmZV9jcmVhdGVfZGlyKHBhdGgsIDEpOworCXN0cmNweShwYXRoK2xlbiwgIi9pbmZvIik7CisJc2FmZV9jcmVhdGVfZGlyKHBhdGgsIDEpOworCisJaWYgKHNoYXJlZF9yZXBvc2l0b3J5KSB7CisJCWNoYXIgYnVmWzEwXTsKKwkJLyogV2UgZG8gbm90IHNwZWxsICJncm91cCIgYW5kIHN1Y2gsIHNvIHRoYXQKKwkJICogdGhlIGNvbmZpZ3VyYXRpb24gY2FuIGJlIHJlYWQgYnkgb2xkZXIgdmVyc2lvbgorCQkgKiBvZiBnaXQuCisJCSAqLworCQlzcHJpbnRmKGJ1ZiwgIiVkIiwgc2hhcmVkX3JlcG9zaXRvcnkpOworCQlnaXRfY29uZmlnX3NldCgiY29yZS5zaGFyZWRyZXBvc2l0b3J5IiwgYnVmKTsKKwkJZ2l0X2NvbmZpZ19zZXQoInJlY2VpdmUuZGVueU5vbkZhc3Rmb3J3YXJkcyIsICJ0cnVlIik7CisJfQorCisJaWYgKCFxdWlldCkKKwkJcHJpbnRmKCIlcyVzIEdpdCByZXBvc2l0b3J5IGluICVzL1xuIiwKKwkJICAgICAgIHJlaW5pdCA/ICJSZWluaXRpYWxpemVkIGV4aXN0aW5nIiA6ICJJbml0aWFsaXplZCBlbXB0eSIsCisJCSAgICAgICBzaGFyZWRfcmVwb3NpdG9yeSA/ICIgc2hhcmVkIiA6ICIiLAorCQkgICAgICAgZ2l0X2Rpcik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tbG9nLmMgYi9idWlsdGluLWxvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMDA3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWxvZy5jCkBAIC0wLDAgKzEsMTE2NSBAQAorLyoKKyAqIEJ1aWx0aW4gImdpdCBsb2ciIGFuZCByZWxhdGVkIGNvbW1hbmRzIChzaG93LCB3aGF0Y2hhbmdlZCkKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDYgTGludXMgVG9ydmFsZHMKKyAqCQkgMjAwNiBKdW5pbyBIYW1hbm8KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29sb3IuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJsb2ctdHJlZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJyZWZsb2ctd2Fsay5oIgorI2luY2x1ZGUgInBhdGNoLWlkcy5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJydW4tY29tbWFuZC5oIgorI2luY2x1ZGUgInNob3J0bG9nLmgiCisKK3N0YXRpYyBpbnQgZGVmYXVsdF9zaG93X3Jvb3QgPSAxOworc3RhdGljIGNvbnN0IGNoYXIgKmZtdF9wYXRjaF9zdWJqZWN0X3ByZWZpeCA9ICJQQVRDSCI7CitzdGF0aWMgY29uc3QgY2hhciAqZm10X3ByZXR0eTsKKworc3RhdGljIHZvaWQgYWRkX25hbWVfZGVjb3JhdGlvbihjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBvYmplY3QgKm9iaikKK3sKKwlpbnQgcGxlbiA9IHN0cmxlbihwcmVmaXgpOworCWludCBubGVuID0gc3RybGVuKG5hbWUpOworCXN0cnVjdCBuYW1lX2RlY29yYXRpb24gKnJlcyA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBuYW1lX2RlY29yYXRpb24pICsgcGxlbiArIG5sZW4pOworCW1lbWNweShyZXMtPm5hbWUsIHByZWZpeCwgcGxlbik7CisJbWVtY3B5KHJlcy0+bmFtZSArIHBsZW4sIG5hbWUsIG5sZW4gKyAxKTsKKwlyZXMtPm5leHQgPSBhZGRfZGVjb3JhdGlvbigmbmFtZV9kZWNvcmF0aW9uLCBvYmosIHJlcyk7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3JlZl9kZWNvcmF0aW9uKGNvbnN0IGNoYXIgKnJlZm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFncywgdm9pZCAqY2JfZGF0YSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJaWYgKCFvYmopCisJCXJldHVybiAwOworCWFkZF9uYW1lX2RlY29yYXRpb24oIiIsIHJlZm5hbWUsIG9iaik7CisJd2hpbGUgKG9iai0+dHlwZSA9PSBPQkpfVEFHKSB7CisJCW9iaiA9ICgoc3RydWN0IHRhZyAqKW9iaiktPnRhZ2dlZDsKKwkJaWYgKCFvYmopCisJCQlicmVhazsKKwkJYWRkX25hbWVfZGVjb3JhdGlvbigidGFnOiAiLCByZWZuYW1lLCBvYmopOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY21kX2xvZ19pbml0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4LAorCQkgICAgICBzdHJ1Y3QgcmV2X2luZm8gKnJldikKK3sKKwlpbnQgaTsKKwlpbnQgZGVjb3JhdGUgPSAwOworCisJcmV2LT5hYmJyZXYgPSBERUZBVUxUX0FCQlJFVjsKKwlyZXYtPmNvbW1pdF9mb3JtYXQgPSBDTUlUX0ZNVF9ERUZBVUxUOworCWlmIChmbXRfcHJldHR5KQorCQlyZXYtPmNvbW1pdF9mb3JtYXQgPSBnZXRfY29tbWl0X2Zvcm1hdChmbXRfcHJldHR5KTsKKwlyZXYtPnZlcmJvc2VfaGVhZGVyID0gMTsKKwlESUZGX09QVF9TRVQoJnJldi0+ZGlmZm9wdCwgUkVDVVJTSVZFKTsKKwlyZXYtPnNob3dfcm9vdF9kaWZmID0gZGVmYXVsdF9zaG93X3Jvb3Q7CisJcmV2LT5zdWJqZWN0X3ByZWZpeCA9IGZtdF9wYXRjaF9zdWJqZWN0X3ByZWZpeDsKKwlhcmdjID0gc2V0dXBfcmV2aXNpb25zKGFyZ2MsIGFyZ3YsIHJldiwgIkhFQUQiKTsKKwlpZiAocmV2LT5kaWZmb3B0LnBpY2theGUgfHwgcmV2LT5kaWZmb3B0LmZpbHRlcikKKwkJcmV2LT5hbHdheXNfc2hvd19oZWFkZXIgPSAwOworCWlmIChESUZGX09QVF9UU1QoJnJldi0+ZGlmZm9wdCwgRk9MTE9XX1JFTkFNRVMpKSB7CisJCXJldi0+YWx3YXlzX3Nob3dfaGVhZGVyID0gMDsKKwkJaWYgKHJldi0+ZGlmZm9wdC5ucl9wYXRocyAhPSAxKQorCQkJdXNhZ2UoImdpdCBsb2dzIGNhbiBvbmx5IGZvbGxvdyByZW5hbWVzIG9uIG9uZSBwYXRobmFtZSBhdCBhIHRpbWUiKTsKKwl9CisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCQlpZiAoIXN0cmNtcChhcmcsICItLWRlY29yYXRlIikpIHsKKwkJCWlmICghZGVjb3JhdGUpCisJCQkJZm9yX2VhY2hfcmVmKGFkZF9yZWZfZGVjb3JhdGlvbiwgTlVMTCk7CisJCQlkZWNvcmF0ZSA9IDE7CisJCX0gZWxzZQorCQkJZGllKCJ1bnJlY29nbml6ZWQgYXJndW1lbnQ6ICVzIiwgYXJnKTsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGdpdmVzIGEgcm91Z2ggZXN0aW1hdGUgZm9yIGhvdyBtYW55IGNvbW1pdHMgd2UKKyAqIHdpbGwgcHJpbnQgb3V0IGluIHRoZSBsaXN0LgorICovCitzdGF0aWMgaW50IGVzdGltYXRlX2NvbW1pdF9jb3VudChzdHJ1Y3QgcmV2X2luZm8gKnJldiwgc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0KQoreworCWludCBuID0gMDsKKworCXdoaWxlIChsaXN0KSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxpc3QtPml0ZW07CisJCXVuc2lnbmVkIGludCBmbGFncyA9IGNvbW1pdC0+b2JqZWN0LmZsYWdzOworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJaWYgKCEoZmxhZ3MgJiAoVFJFRVNBTUUgfCBVTklOVEVSRVNUSU5HKSkpCisJCQluKys7CisJfQorCXJldHVybiBuOworfQorCitzdGF0aWMgdm9pZCBzaG93X2Vhcmx5X2hlYWRlcihzdHJ1Y3QgcmV2X2luZm8gKnJldiwgY29uc3QgY2hhciAqc3RhZ2UsIGludCBucikKK3sKKwlpZiAocmV2LT5zaG93bl9vbmUpIHsKKwkJcmV2LT5zaG93bl9vbmUgPSAwOworCQlpZiAocmV2LT5jb21taXRfZm9ybWF0ICE9IENNSVRfRk1UX09ORUxJTkUpCisJCQlwdXRjaGFyKHJldi0+ZGlmZm9wdC5saW5lX3Rlcm1pbmF0aW9uKTsKKwl9CisJcHJpbnRmKCJGaW5hbCBvdXRwdXQ6ICVkICVzXG4iLCBuciwgc3RhZ2UpOworfQorCitzdHJ1Y3QgaXRpbWVydmFsIGVhcmx5X291dHB1dF90aW1lcjsKKworc3RhdGljIHZvaWQgbG9nX3Nob3dfZWFybHkoc3RydWN0IHJldl9pbmZvICpyZXZzLCBzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3QpCit7CisJaW50IGkgPSByZXZzLT5lYXJseV9vdXRwdXQ7CisJaW50IHNob3dfaGVhZGVyID0gMTsKKworCXNvcnRfaW5fdG9wb2xvZ2ljYWxfb3JkZXIoJmxpc3QsIHJldnMtPmxpZm8pOworCXdoaWxlIChsaXN0ICYmIGkpIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gbGlzdC0+aXRlbTsKKwkJc3dpdGNoIChzaW1wbGlmeV9jb21taXQocmV2cywgY29tbWl0KSkgeworCQljYXNlIGNvbW1pdF9zaG93OgorCQkJaWYgKHNob3dfaGVhZGVyKSB7CisJCQkJaW50IG4gPSBlc3RpbWF0ZV9jb21taXRfY291bnQocmV2cywgbGlzdCk7CisJCQkJc2hvd19lYXJseV9oZWFkZXIocmV2cywgImluY29tcGxldGUiLCBuKTsKKwkJCQlzaG93X2hlYWRlciA9IDA7CisJCQl9CisJCQlsb2dfdHJlZV9jb21taXQocmV2cywgY29tbWl0KTsKKwkJCWktLTsKKwkJCWJyZWFrOworCQljYXNlIGNvbW1pdF9pZ25vcmU6CisJCQlicmVhazsKKwkJY2FzZSBjb21taXRfZXJyb3I6CisJCQlyZXR1cm47CisJCX0KKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJfQorCisJLyogRGlkIHdlIGFscmVhZHkgZ2V0IGVub3VnaCBjb21taXRzIGZvciB0aGUgZWFybHkgb3V0cHV0PyAqLworCWlmICghaSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiAuLmlmIG5vLCB0aGVuIHJlcGVhdCBpdCB0d2ljZSBhIHNlY29uZCB1bnRpbCB3ZQorCSAqIGRvLgorCSAqCisJICogTk9URSEgV2UgZG9uJ3QgdXNlICJpdF9pbnRlcnZhbCIsIGJlY2F1c2UgaWYgdGhlCisJICogcmVhZGVyIGlzbid0IGxpc3RlbmluZywgd2Ugd2FudCBvdXIgb3V0cHV0IHRvIGJlCisJICogdGhyb3R0bGVkIGJ5IHRoZSB3cml0aW5nLCBhbmQgbm90IGhhdmUgdGhlIHRpbWVyCisJICogdHJpZ2dlciBldmVyeSBzZWNvbmQgZXZlbiBpZiB3ZSdyZSBibG9ja2VkIG9uIGEKKwkgKiByZWFkZXIhCisJICovCisJZWFybHlfb3V0cHV0X3RpbWVyLml0X3ZhbHVlLnR2X3NlYyA9IDA7CisJZWFybHlfb3V0cHV0X3RpbWVyLml0X3ZhbHVlLnR2X3VzZWMgPSA1MDAwMDA7CisJc2V0aXRpbWVyKElUSU1FUl9SRUFMLCAmZWFybHlfb3V0cHV0X3RpbWVyLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgZWFybHlfb3V0cHV0KGludCBzaWduYWwpCit7CisJc2hvd19lYXJseV9vdXRwdXQgPSBsb2dfc2hvd19lYXJseTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfZWFybHlfb3V0cHV0KHN0cnVjdCByZXZfaW5mbyAqcmV2KQoreworCXN0cnVjdCBzaWdhY3Rpb24gc2E7CisKKwkvKgorCSAqIFNldCB1cCB0aGUgc2lnbmFsIGhhbmRsZXIsIG1pbmltYWxseSBpbnRydXNpdmVseToKKwkgKiB3ZSBvbmx5IHNldCBhIHNpbmdsZSB2b2xhdGlsZSBpbnRlZ2VyIHdvcmQgKG5vdAorCSAqIHVzaW5nIHNpZ2F0b21pY190IC0gdHJ5aW5nIHRvIGF2b2lkIHVubmVjZXNzYXJ5CisJICogc3lzdGVtIGRlcGVuZGVuY2llcyBhbmQgaGVhZGVycyksIGFuZCB1c2luZworCSAqIFNBX1JFU1RBUlQuCisJICovCisJbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7CisJc2Euc2FfaGFuZGxlciA9IGVhcmx5X291dHB1dDsKKwlzaWdlbXB0eXNldCgmc2Euc2FfbWFzayk7CisJc2Euc2FfZmxhZ3MgPSBTQV9SRVNUQVJUOworCXNpZ2FjdGlvbihTSUdBTFJNLCAmc2EsIE5VTEwpOworCisJLyoKKwkgKiBJZiB3ZSBjYW4gZ2V0IHRoZSB3aG9sZSBvdXRwdXQgaW4gbGVzcyB0aGFuIGEKKwkgKiB0ZW50aCBvZiBhIHNlY29uZCwgZG9uJ3QgZXZlbiBib3RoZXIgZG9pbmcgdGhlCisJICogZWFybHktb3V0cHV0IHRoaW5nLi4KKwkgKgorCSAqIFRoaXMgaXMgYSBvbmUtdGltZS1vbmx5IHRyaWdnZXIuCisJICovCisJZWFybHlfb3V0cHV0X3RpbWVyLml0X3ZhbHVlLnR2X3NlYyA9IDA7CisJZWFybHlfb3V0cHV0X3RpbWVyLml0X3ZhbHVlLnR2X3VzZWMgPSAxMDAwMDA7CisJc2V0aXRpbWVyKElUSU1FUl9SRUFMLCAmZWFybHlfb3V0cHV0X3RpbWVyLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgZmluaXNoX2Vhcmx5X291dHB1dChzdHJ1Y3QgcmV2X2luZm8gKnJldikKK3sKKwlpbnQgbiA9IGVzdGltYXRlX2NvbW1pdF9jb3VudChyZXYsIHJldi0+Y29tbWl0cyk7CisJc2lnbmFsKFNJR0FMUk0sIFNJR19JR04pOworCXNob3dfZWFybHlfaGVhZGVyKHJldiwgImRvbmUiLCBuKTsKK30KKworc3RhdGljIGludCBjbWRfbG9nX3dhbGsoc3RydWN0IHJldl9pbmZvICpyZXYpCit7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCisJaWYgKHJldi0+ZWFybHlfb3V0cHV0KQorCQlzZXR1cF9lYXJseV9vdXRwdXQocmV2KTsKKworCWlmIChwcmVwYXJlX3JldmlzaW9uX3dhbGsocmV2KSkKKwkJZGllKCJyZXZpc2lvbiB3YWxrIHNldHVwIGZhaWxlZCIpOworCisJaWYgKHJldi0+ZWFybHlfb3V0cHV0KQorCQlmaW5pc2hfZWFybHlfb3V0cHV0KHJldik7CisKKwl3aGlsZSAoKGNvbW1pdCA9IGdldF9yZXZpc2lvbihyZXYpKSAhPSBOVUxMKSB7CisJCWxvZ190cmVlX2NvbW1pdChyZXYsIGNvbW1pdCk7CisJCWlmICghcmV2LT5yZWZsb2dfaW5mbykgeworCQkJLyogd2UgYWxsb3cgY3ljbGVzIGluIHJlZmxvZyBhbmNlc3RyeSAqLworCQkJZnJlZShjb21taXQtPmJ1ZmZlcik7CisJCQljb21taXQtPmJ1ZmZlciA9IE5VTEw7CisJCX0KKwkJZnJlZV9jb21taXRfbGlzdChjb21taXQtPnBhcmVudHMpOworCQljb21taXQtPnBhcmVudHMgPSBOVUxMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnaXRfbG9nX2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICghc3RyY21wKHZhciwgImZvcm1hdC5wcmV0dHkiKSkKKwkJcmV0dXJuIGdpdF9jb25maWdfc3RyaW5nKCZmbXRfcHJldHR5LCB2YXIsIHZhbHVlKTsKKwlpZiAoIXN0cmNtcCh2YXIsICJmb3JtYXQuc3ViamVjdHByZWZpeCIpKSB7CisJCWlmICghdmFsdWUpCisJCQljb25maWdfZXJyb3Jfbm9uYm9vbCh2YXIpOworCQlmbXRfcGF0Y2hfc3ViamVjdF9wcmVmaXggPSB4c3RyZHVwKHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKHZhciwgImxvZy5zaG93cm9vdCIpKSB7CisJCWRlZmF1bHRfc2hvd19yb290ID0gZ2l0X2NvbmZpZ19ib29sKHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGdpdF9kaWZmX3VpX2NvbmZpZyh2YXIsIHZhbHVlKTsKK30KKworaW50IGNtZF93aGF0Y2hhbmdlZChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgcmV2X2luZm8gcmV2OworCisJZ2l0X2NvbmZpZyhnaXRfbG9nX2NvbmZpZyk7CisKKwlpZiAoZGlmZl91c2VfY29sb3JfZGVmYXVsdCA9PSAtMSkKKwkJZGlmZl91c2VfY29sb3JfZGVmYXVsdCA9IGdpdF91c2VfY29sb3JfZGVmYXVsdDsKKworCWluaXRfcmV2aXNpb25zKCZyZXYsIHByZWZpeCk7CisJcmV2LmRpZmYgPSAxOworCXJldi5zaW1wbGlmeV9oaXN0b3J5ID0gMDsKKwljbWRfbG9nX2luaXQoYXJnYywgYXJndiwgcHJlZml4LCAmcmV2KTsKKwlpZiAoIXJldi5kaWZmb3B0Lm91dHB1dF9mb3JtYXQpCisJCXJldi5kaWZmb3B0Lm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9SQVc7CisJcmV0dXJuIGNtZF9sb2dfd2FsaygmcmV2KTsKK30KKworc3RhdGljIHZvaWQgc2hvd190YWdnZXIoY2hhciAqYnVmLCBpbnQgbGVuLCBzdHJ1Y3QgcmV2X2luZm8gKnJldikKK3sKKwljaGFyICplbWFpbF9lbmQsICpwOworCXVuc2lnbmVkIGxvbmcgZGF0ZTsKKwlpbnQgdHo7CisKKwllbWFpbF9lbmQgPSBtZW1jaHIoYnVmLCAnPicsIGxlbik7CisJaWYgKCFlbWFpbF9lbmQpCisJCXJldHVybjsKKwlwID0gKytlbWFpbF9lbmQ7CisJd2hpbGUgKGlzc3BhY2UoKnApKQorCQlwKys7CisJZGF0ZSA9IHN0cnRvdWwocCwgJnAsIDEwKTsKKwl3aGlsZSAoaXNzcGFjZSgqcCkpCisJCXArKzsKKwl0eiA9IChpbnQpc3RydG9sKHAsIE5VTEwsIDEwKTsKKwlwcmludGYoIlRhZ2dlcjogJS4qc1xuRGF0ZTogICAlc1xuIiwgKGludCkoZW1haWxfZW5kIC0gYnVmKSwgYnVmLAorCSAgICAgICBzaG93X2RhdGUoZGF0ZSwgdHosIHJldi0+ZGF0ZV9tb2RlKSk7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19vYmplY3QoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IHNob3dfdGFnX29iamVjdCwKKwlzdHJ1Y3QgcmV2X2luZm8gKnJldikKK3sKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCWNoYXIgKmJ1ZiA9IHJlYWRfc2hhMV9maWxlKHNoYTEsICZ0eXBlLCAmc2l6ZSk7CisJaW50IG9mZnNldCA9IDA7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIGVycm9yKCJDb3VsZCBub3QgcmVhZCBvYmplY3QgJXMiLCBzaGExX3RvX2hleChzaGExKSk7CisKKwlpZiAoc2hvd190YWdfb2JqZWN0KQorCQl3aGlsZSAob2Zmc2V0IDwgc2l6ZSAmJiBidWZbb2Zmc2V0XSAhPSAnXG4nKSB7CisJCQlpbnQgbmV3X29mZnNldCA9IG9mZnNldCArIDE7CisJCQl3aGlsZSAobmV3X29mZnNldCA8IHNpemUgJiYgYnVmW25ld19vZmZzZXQrK10gIT0gJ1xuJykKKwkJCQk7IC8qIGRvIG5vdGhpbmcgKi8KKwkJCWlmICghcHJlZml4Y21wKGJ1ZiArIG9mZnNldCwgInRhZ2dlciAiKSkKKwkJCQlzaG93X3RhZ2dlcihidWYgKyBvZmZzZXQgKyA3LAorCQkJCQkgICAgbmV3X29mZnNldCAtIG9mZnNldCAtIDcsIHJldik7CisJCQlvZmZzZXQgPSBuZXdfb2Zmc2V0OworCQl9CisKKwlpZiAob2Zmc2V0IDwgc2l6ZSkKKwkJZndyaXRlKGJ1ZiArIG9mZnNldCwgc2l6ZSAtIG9mZnNldCwgMSwgc3Rkb3V0KTsKKwlmcmVlKGJ1Zik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hvd190cmVlX29iamVjdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQljb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbiwKKwkJY29uc3QgY2hhciAqcGF0aG5hbWUsIHVuc2lnbmVkIG1vZGUsIGludCBzdGFnZSkKK3sKKwlwcmludGYoIiVzJXNcbiIsIHBhdGhuYW1lLCBTX0lTRElSKG1vZGUpID8gIi8iIDogIiIpOworCXJldHVybiAwOworfQorCitpbnQgY21kX3Nob3coaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IHJldl9pbmZvIHJldjsKKwlzdHJ1Y3Qgb2JqZWN0X2FycmF5X2VudHJ5ICpvYmplY3RzOworCWludCBpLCBjb3VudCwgcmV0ID0gMDsKKworCWdpdF9jb25maWcoZ2l0X2xvZ19jb25maWcpOworCisJaWYgKGRpZmZfdXNlX2NvbG9yX2RlZmF1bHQgPT0gLTEpCisJCWRpZmZfdXNlX2NvbG9yX2RlZmF1bHQgPSBnaXRfdXNlX2NvbG9yX2RlZmF1bHQ7CisKKwlpbml0X3JldmlzaW9ucygmcmV2LCBwcmVmaXgpOworCXJldi5kaWZmID0gMTsKKwlyZXYuY29tYmluZV9tZXJnZXMgPSAxOworCXJldi5kZW5zZV9jb21iaW5lZF9tZXJnZXMgPSAxOworCXJldi5hbHdheXNfc2hvd19oZWFkZXIgPSAxOworCXJldi5pZ25vcmVfbWVyZ2VzID0gMDsKKwlyZXYubm9fd2FsayA9IDE7CisJY21kX2xvZ19pbml0KGFyZ2MsIGFyZ3YsIHByZWZpeCwgJnJldik7CisKKwljb3VudCA9IHJldi5wZW5kaW5nLm5yOworCW9iamVjdHMgPSByZXYucGVuZGluZy5vYmplY3RzOworCWZvciAoaSA9IDA7IGkgPCBjb3VudCAmJiAhcmV0OyBpKyspIHsKKwkJc3RydWN0IG9iamVjdCAqbyA9IG9iamVjdHNbaV0uaXRlbTsKKwkJY29uc3QgY2hhciAqbmFtZSA9IG9iamVjdHNbaV0ubmFtZTsKKwkJc3dpdGNoIChvLT50eXBlKSB7CisJCWNhc2UgT0JKX0JMT0I6CisJCQlyZXQgPSBzaG93X29iamVjdChvLT5zaGExLCAwLCBOVUxMKTsKKwkJCWJyZWFrOworCQljYXNlIE9CSl9UQUc6IHsKKwkJCXN0cnVjdCB0YWcgKnQgPSAoc3RydWN0IHRhZyAqKW87CisKKwkJCXByaW50ZigiJXN0YWcgJXMlc1xuIiwKKwkJCQkJZGlmZl9nZXRfY29sb3Jfb3B0KCZyZXYuZGlmZm9wdCwgRElGRl9DT01NSVQpLAorCQkJCQl0LT50YWcsCisJCQkJCWRpZmZfZ2V0X2NvbG9yX29wdCgmcmV2LmRpZmZvcHQsIERJRkZfUkVTRVQpKTsKKwkJCXJldCA9IHNob3dfb2JqZWN0KG8tPnNoYTEsIDEsICZyZXYpOworCQkJb2JqZWN0c1tpXS5pdGVtID0gKHN0cnVjdCBvYmplY3QgKil0LT50YWdnZWQ7CisJCQlpLS07CisJCQlicmVhazsKKwkJfQorCQljYXNlIE9CSl9UUkVFOgorCQkJcHJpbnRmKCIlc3RyZWUgJXMlc1xuXG4iLAorCQkJCQlkaWZmX2dldF9jb2xvcl9vcHQoJnJldi5kaWZmb3B0LCBESUZGX0NPTU1JVCksCisJCQkJCW5hbWUsCisJCQkJCWRpZmZfZ2V0X2NvbG9yX29wdCgmcmV2LmRpZmZvcHQsIERJRkZfUkVTRVQpKTsKKwkJCXJlYWRfdHJlZV9yZWN1cnNpdmUoKHN0cnVjdCB0cmVlICopbywgIiIsIDAsIDAsIE5VTEwsCisJCQkJCXNob3dfdHJlZV9vYmplY3QpOworCQkJYnJlYWs7CisJCWNhc2UgT0JKX0NPTU1JVDoKKwkJCXJldi5wZW5kaW5nLm5yID0gcmV2LnBlbmRpbmcuYWxsb2MgPSAwOworCQkJcmV2LnBlbmRpbmcub2JqZWN0cyA9IE5VTEw7CisJCQlhZGRfb2JqZWN0X2FycmF5KG8sIG5hbWUsICZyZXYucGVuZGluZyk7CisJCQlyZXQgPSBjbWRfbG9nX3dhbGsoJnJldik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IGVycm9yKCJVbmtub3duIHR5cGU6ICVkIiwgby0+dHlwZSk7CisJCX0KKwl9CisJZnJlZShvYmplY3RzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhpcyBpcyBlcXVpdmFsZW50IHRvICJnaXQgbG9nIC1nIC0tYWJicmV2LWNvbW1pdCAtLXByZXR0eT1vbmVsaW5lIgorICovCitpbnQgY21kX2xvZ19yZWZsb2coaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IHJldl9pbmZvIHJldjsKKworCWdpdF9jb25maWcoZ2l0X2xvZ19jb25maWcpOworCisJaWYgKGRpZmZfdXNlX2NvbG9yX2RlZmF1bHQgPT0gLTEpCisJCWRpZmZfdXNlX2NvbG9yX2RlZmF1bHQgPSBnaXRfdXNlX2NvbG9yX2RlZmF1bHQ7CisKKwlpbml0X3JldmlzaW9ucygmcmV2LCBwcmVmaXgpOworCWluaXRfcmVmbG9nX3dhbGsoJnJldi5yZWZsb2dfaW5mbyk7CisJcmV2LmFiYnJldl9jb21taXQgPSAxOworCXJldi52ZXJib3NlX2hlYWRlciA9IDE7CisJY21kX2xvZ19pbml0KGFyZ2MsIGFyZ3YsIHByZWZpeCwgJnJldik7CisKKwkvKgorCSAqIFRoaXMgbWVhbnMgdGhhdCB3ZSBvdmVycmlkZSB3aGF0ZXZlciBjb21taXQgZm9ybWF0IHRoZSB1c2VyIGdhdmUKKwkgKiBvbiB0aGUgY21kIGxpbmUuICBTYWQsIGJ1dCBjbWRfbG9nX2luaXQoKSBjdXJyZW50bHkgZG9lc24ndAorCSAqIGFsbG93IHVzIHRvIHNldCBhIGRpZmZlcmVudCBkZWZhdWx0LgorCSAqLworCXJldi5jb21taXRfZm9ybWF0ID0gQ01JVF9GTVRfT05FTElORTsKKwlyZXYuYWx3YXlzX3Nob3dfaGVhZGVyID0gMTsKKworCS8qCisJICogV2UgZ2V0IGNhbGxlZCB0aHJvdWdoICJnaXQgcmVmbG9nIiwgc28gdW5saWtlIHRoZSBvdGhlciBsb2cKKwkgKiByb3V0aW5lcywgd2UgbmVlZCB0byBzZXQgdXAgb3VyIHBhZ2VyIG1hbnVhbGx5Li4KKwkgKi8KKwlzZXR1cF9wYWdlcigpOworCisJcmV0dXJuIGNtZF9sb2dfd2FsaygmcmV2KTsKK30KKworaW50IGNtZF9sb2coaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IHJldl9pbmZvIHJldjsKKworCWdpdF9jb25maWcoZ2l0X2xvZ19jb25maWcpOworCisJaWYgKGRpZmZfdXNlX2NvbG9yX2RlZmF1bHQgPT0gLTEpCisJCWRpZmZfdXNlX2NvbG9yX2RlZmF1bHQgPSBnaXRfdXNlX2NvbG9yX2RlZmF1bHQ7CisKKwlpbml0X3JldmlzaW9ucygmcmV2LCBwcmVmaXgpOworCXJldi5hbHdheXNfc2hvd19oZWFkZXIgPSAxOworCWNtZF9sb2dfaW5pdChhcmdjLCBhcmd2LCBwcmVmaXgsICZyZXYpOworCXJldHVybiBjbWRfbG9nX3dhbGsoJnJldik7Cit9CisKKy8qIGZvcm1hdC1wYXRjaCAqLworI2RlZmluZSBGT1JNQVRfUEFUQ0hfTkFNRV9NQVggNjQKKworc3RhdGljIGludCBpc3RpdGxlY2hhcihjaGFyIGMpCit7CisJcmV0dXJuIChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB8fAorCQkoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHx8IGMgPT0gJy4nIHx8IGMgPT0gJ18nOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZm10X3BhdGNoX3N1ZmZpeCA9ICIucGF0Y2giOworc3RhdGljIGludCBudW1iZXJlZCA9IDA7CitzdGF0aWMgaW50IGF1dG9fbnVtYmVyID0gMDsKKworc3RhdGljIGNoYXIgKipleHRyYV9oZHI7CitzdGF0aWMgaW50IGV4dHJhX2hkcl9ucjsKK3N0YXRpYyBpbnQgZXh0cmFfaGRyX2FsbG9jOworCitzdGF0aWMgY2hhciAqKmV4dHJhX3RvOworc3RhdGljIGludCBleHRyYV90b19ucjsKK3N0YXRpYyBpbnQgZXh0cmFfdG9fYWxsb2M7CisKK3N0YXRpYyBjaGFyICoqZXh0cmFfY2M7CitzdGF0aWMgaW50IGV4dHJhX2NjX25yOworc3RhdGljIGludCBleHRyYV9jY19hbGxvYzsKKworc3RhdGljIHZvaWQgYWRkX2hlYWRlcihjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpbnQgbGVuID0gc3RybGVuKHZhbHVlKTsKKwl3aGlsZSAodmFsdWVbbGVuIC0gMV0gPT0gJ1xuJykKKwkJbGVuLS07CisJaWYgKCFzdHJuY2FzZWNtcCh2YWx1ZSwgInRvOiAiLCA0KSkgeworCQlBTExPQ19HUk9XKGV4dHJhX3RvLCBleHRyYV90b19uciArIDEsIGV4dHJhX3RvX2FsbG9jKTsKKwkJZXh0cmFfdG9bZXh0cmFfdG9fbnIrK10gPSB4c3RybmR1cCh2YWx1ZSArIDQsIGxlbiAtIDQpOworCQlyZXR1cm47CisJfQorCWlmICghc3RybmNhc2VjbXAodmFsdWUsICJjYzogIiwgNCkpIHsKKwkJQUxMT0NfR1JPVyhleHRyYV9jYywgZXh0cmFfY2NfbnIgKyAxLCBleHRyYV9jY19hbGxvYyk7CisJCWV4dHJhX2NjW2V4dHJhX2NjX25yKytdID0geHN0cm5kdXAodmFsdWUgKyA0LCBsZW4gLSA0KTsKKwkJcmV0dXJuOworCX0KKwlBTExPQ19HUk9XKGV4dHJhX2hkciwgZXh0cmFfaGRyX25yICsgMSwgZXh0cmFfaGRyX2FsbG9jKTsKKwlleHRyYV9oZHJbZXh0cmFfaGRyX25yKytdID0geHN0cm5kdXAodmFsdWUsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgZ2l0X2Zvcm1hdF9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXN0cmNtcCh2YXIsICJmb3JtYXQuaGVhZGVycyIpKSB7CisJCWlmICghdmFsdWUpCisJCQlkaWUoImZvcm1hdC5oZWFkZXJzIHdpdGhvdXQgdmFsdWUiKTsKKwkJYWRkX2hlYWRlcih2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXN0cmNtcCh2YXIsICJmb3JtYXQuc3VmZml4IikpIHsKKwkJaWYgKCF2YWx1ZSkKKwkJCXJldHVybiBjb25maWdfZXJyb3Jfbm9uYm9vbCh2YXIpOworCQlmbXRfcGF0Y2hfc3VmZml4ID0geHN0cmR1cCh2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXN0cmNtcCh2YXIsICJkaWZmLmNvbG9yIikgfHwgIXN0cmNtcCh2YXIsICJjb2xvci5kaWZmIikpIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKHZhciwgImZvcm1hdC5udW1iZXJlZCIpKSB7CisJCWlmICh2YWx1ZSAmJiAhc3RyY2FzZWNtcCh2YWx1ZSwgImF1dG8iKSkgeworCQkJYXV0b19udW1iZXIgPSAxOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbnVtYmVyZWQgPSBnaXRfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBnaXRfbG9nX2NvbmZpZyh2YXIsIHZhbHVlKTsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X29uZWxpbmVfZm9yX2ZpbGVuYW1lKHN0cnVjdCBjb21taXQgKmNvbW1pdCwKKwkJCQkJICAgIGludCBrZWVwX3N1YmplY3QpCit7CisJc3RhdGljIGNoYXIgZmlsZW5hbWVbUEFUSF9NQVhdOworCWNoYXIgKnNvbDsKKwlpbnQgbGVuID0gMDsKKwlpbnQgc3VmZml4X2xlbiA9IHN0cmxlbihmbXRfcGF0Y2hfc3VmZml4KSArIDE7CisKKwlzb2wgPSBzdHJzdHIoY29tbWl0LT5idWZmZXIsICJcblxuIik7CisJaWYgKCFzb2wpCisJCWZpbGVuYW1lWzBdID0gJ1wwJzsKKwllbHNlIHsKKwkJaW50IGosIHNwYWNlID0gMDsKKworCQlzb2wgKz0gMjsKKwkJLyogc3RyaXAgW1BBVENIXSBvciBbUEFUQ0ggYmxhYmxhXSAqLworCQlpZiAoIWtlZXBfc3ViamVjdCAmJiAhcHJlZml4Y21wKHNvbCwgIltQQVRDSCIpKSB7CisJCQljaGFyICplb3MgPSBzdHJjaHIoc29sICsgNiwgJ10nKTsKKwkJCWlmIChlb3MpIHsKKwkJCQl3aGlsZSAoaXNzcGFjZSgqZW9zKSkKKwkJCQkJZW9zKys7CisJCQkJc29sID0gZW9zOworCQkJfQorCQl9CisKKwkJZm9yIChqID0gMDsKKwkJICAgICBqIDwgRk9STUFUX1BBVENIX05BTUVfTUFYIC0gc3VmZml4X2xlbiAtIDUgJiYKKwkJCSAgICAgbGVuIDwgc2l6ZW9mKGZpbGVuYW1lKSAtIHN1ZmZpeF9sZW4gJiYKKwkJCSAgICAgc29sW2pdICYmIHNvbFtqXSAhPSAnXG4nOworCQkgICAgIGorKykgeworCQkJaWYgKGlzdGl0bGVjaGFyKHNvbFtqXSkpIHsKKwkJCQlpZiAoc3BhY2UpIHsKKwkJCQkJZmlsZW5hbWVbbGVuKytdID0gJy0nOworCQkJCQlzcGFjZSA9IDA7CisJCQkJfQorCQkJCWZpbGVuYW1lW2xlbisrXSA9IHNvbFtqXTsKKwkJCQlpZiAoc29sW2pdID09ICcuJykKKwkJCQkJd2hpbGUgKHNvbFtqICsgMV0gPT0gJy4nKQorCQkJCQkJaisrOworCQkJfSBlbHNlCisJCQkJc3BhY2UgPSAxOworCQl9CisJCXdoaWxlIChmaWxlbmFtZVtsZW4gLSAxXSA9PSAnLicKKwkJICAgICAgIHx8IGZpbGVuYW1lW2xlbiAtIDFdID09ICctJykKKwkJCWxlbi0tOworCQlmaWxlbmFtZVtsZW5dID0gJ1wwJzsKKwl9CisJcmV0dXJuIGZpbGVuYW1lOworfQorCitzdGF0aWMgRklMRSAqcmVhbHN0ZG91dCA9IE5VTEw7CitzdGF0aWMgY29uc3QgY2hhciAqb3V0cHV0X2RpcmVjdG9yeSA9IE5VTEw7CisKK3N0YXRpYyBpbnQgcmVvcGVuX3N0ZG91dChjb25zdCBjaGFyICpvbmVsaW5lLCBpbnQgbnIsIGludCB0b3RhbCkKK3sKKwljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKKwlpbnQgbGVuID0gMDsKKwlpbnQgc3VmZml4X2xlbiA9IHN0cmxlbihmbXRfcGF0Y2hfc3VmZml4KSArIDE7CisKKwlpZiAob3V0cHV0X2RpcmVjdG9yeSkgeworCQlsZW4gPSBzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiVzIiwKKwkJCQlvdXRwdXRfZGlyZWN0b3J5KTsKKwkJaWYgKGxlbiA+PQorCQkgICAgc2l6ZW9mKGZpbGVuYW1lKSAtIEZPUk1BVF9QQVRDSF9OQU1FX01BWCAtIHN1ZmZpeF9sZW4pCisJCQlyZXR1cm4gZXJyb3IoIm5hbWUgb2Ygb3V0cHV0IGRpcmVjdG9yeSBpcyB0b28gbG9uZyIpOworCQlpZiAoZmlsZW5hbWVbbGVuIC0gMV0gIT0gJy8nKQorCQkJZmlsZW5hbWVbbGVuKytdID0gJy8nOworCX0KKworCWlmICghb25lbGluZSkKKwkJbGVuICs9IHNwcmludGYoZmlsZW5hbWUgKyBsZW4sICIlZCIsIG5yKTsKKwllbHNlIHsKKwkJbGVuICs9IHNwcmludGYoZmlsZW5hbWUgKyBsZW4sICIlMDRkLSIsIG5yKTsKKwkJbGVuICs9IHNucHJpbnRmKGZpbGVuYW1lICsgbGVuLCBzaXplb2YoZmlsZW5hbWUpIC0gbGVuIC0gMQorCQkJCS0gc3VmZml4X2xlbiwgIiVzIiwgb25lbGluZSk7CisJCXN0cmNweShmaWxlbmFtZSArIGxlbiwgZm10X3BhdGNoX3N1ZmZpeCk7CisJfQorCisJZnByaW50ZihyZWFsc3Rkb3V0LCAiJXNcbiIsIGZpbGVuYW1lKTsKKwlpZiAoZnJlb3BlbihmaWxlbmFtZSwgInciLCBzdGRvdXQpID09IE5VTEwpCisJCXJldHVybiBlcnJvcigiQ2Fubm90IG9wZW4gcGF0Y2ggZmlsZSAlcyIsZmlsZW5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9wYXRjaF9pZHMoc3RydWN0IHJldl9pbmZvICpyZXYsIHN0cnVjdCBwYXRjaF9pZHMgKmlkcywgY29uc3QgY2hhciAqcHJlZml4KQoreworCXN0cnVjdCByZXZfaW5mbyBjaGVja19yZXY7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCXN0cnVjdCBvYmplY3QgKm8xLCAqbzI7CisJdW5zaWduZWQgZmxhZ3MxLCBmbGFnczI7CisKKwlpZiAocmV2LT5wZW5kaW5nLm5yICE9IDIpCisJCWRpZSgiTmVlZCBleGFjdGx5IG9uZSByYW5nZS4iKTsKKworCW8xID0gcmV2LT5wZW5kaW5nLm9iamVjdHNbMF0uaXRlbTsKKwlmbGFnczEgPSBvMS0+ZmxhZ3M7CisJbzIgPSByZXYtPnBlbmRpbmcub2JqZWN0c1sxXS5pdGVtOworCWZsYWdzMiA9IG8yLT5mbGFnczsKKworCWlmICgoZmxhZ3MxICYgVU5JTlRFUkVTVElORykgPT0gKGZsYWdzMiAmIFVOSU5URVJFU1RJTkcpKQorCQlkaWUoIk5vdCBhIHJhbmdlLiIpOworCisJaW5pdF9wYXRjaF9pZHMoaWRzKTsKKworCS8qIGdpdmVuIGEgcmFuZ2UgYS4uYiBnZXQgYWxsIHBhdGNoIGlkcyBmb3IgYi4uYSAqLworCWluaXRfcmV2aXNpb25zKCZjaGVja19yZXYsIHByZWZpeCk7CisJbzEtPmZsYWdzIF49IFVOSU5URVJFU1RJTkc7CisJbzItPmZsYWdzIF49IFVOSU5URVJFU1RJTkc7CisJYWRkX3BlbmRpbmdfb2JqZWN0KCZjaGVja19yZXYsIG8xLCAibzEiKTsKKwlhZGRfcGVuZGluZ19vYmplY3QoJmNoZWNrX3JldiwgbzIsICJvMiIpOworCWlmIChwcmVwYXJlX3JldmlzaW9uX3dhbGsoJmNoZWNrX3JldikpCisJCWRpZSgicmV2aXNpb24gd2FsayBzZXR1cCBmYWlsZWQiKTsKKworCXdoaWxlICgoY29tbWl0ID0gZ2V0X3JldmlzaW9uKCZjaGVja19yZXYpKSAhPSBOVUxMKSB7CisJCS8qIGlnbm9yZSBtZXJnZXMgKi8KKwkJaWYgKGNvbW1pdC0+cGFyZW50cyAmJiBjb21taXQtPnBhcmVudHMtPm5leHQpCisJCQljb250aW51ZTsKKworCQlhZGRfY29tbWl0X3BhdGNoX2lkKGNvbW1pdCwgaWRzKTsKKwl9CisKKwkvKiByZXNldCBmb3IgbmV4dCByZXZpc2lvbiB3YWxrICovCisJY2xlYXJfY29tbWl0X21hcmtzKChzdHJ1Y3QgY29tbWl0ICopbzEsCisJCQlTRUVOIHwgVU5JTlRFUkVTVElORyB8IFNIT1dOIHwgQURERUQpOworCWNsZWFyX2NvbW1pdF9tYXJrcygoc3RydWN0IGNvbW1pdCAqKW8yLAorCQkJU0VFTiB8IFVOSU5URVJFU1RJTkcgfCBTSE9XTiB8IEFEREVEKTsKKwlvMS0+ZmxhZ3MgPSBmbGFnczE7CisJbzItPmZsYWdzID0gZmxhZ3MyOworfQorCitzdGF0aWMgdm9pZCBnZW5fbWVzc2FnZV9pZChzdHJ1Y3QgcmV2X2luZm8gKmluZm8sIGNoYXIgKmJhc2UpCit7CisJY29uc3QgY2hhciAqY29tbWl0dGVyID0gZ2l0X2NvbW1pdHRlcl9pbmZvKElERU5UX1dBUk5fT05fTk9fTkFNRSk7CisJY29uc3QgY2hhciAqZW1haWxfc3RhcnQgPSBzdHJyY2hyKGNvbW1pdHRlciwgJzwnKTsKKwljb25zdCBjaGFyICplbWFpbF9lbmQgPSBzdHJyY2hyKGNvbW1pdHRlciwgJz4nKTsKKwlzdHJ1Y3Qgc3RyYnVmIGJ1ZjsKKwlpZiAoIWVtYWlsX3N0YXJ0IHx8ICFlbWFpbF9lbmQgfHwgZW1haWxfc3RhcnQgPiBlbWFpbF9lbmQgLSAxKQorCQlkaWUoIkNvdWxkIG5vdCBleHRyYWN0IGVtYWlsIGZyb20gY29tbWl0dGVyIGlkZW50aXR5LiIpOworCXN0cmJ1Zl9pbml0KCZidWYsIDApOworCXN0cmJ1Zl9hZGRmKCZidWYsICIlcy4lbHUuZ2l0LiUuKnMiLCBiYXNlLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpIHRpbWUoTlVMTCksCisJCSAgICAoaW50KShlbWFpbF9lbmQgLSBlbWFpbF9zdGFydCAtIDEpLCBlbWFpbF9zdGFydCArIDEpOworCWluZm8tPm1lc3NhZ2VfaWQgPSBzdHJidWZfZGV0YWNoKCZidWYsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBtYWtlX2NvdmVyX2xldHRlcihzdHJ1Y3QgcmV2X2luZm8gKnJldiwgaW50IHVzZV9zdGRvdXQsCisJCQkgICAgICBpbnQgbnVtYmVyZWQsIGludCBudW1iZXJlZF9maWxlcywKKwkJCSAgICAgIHN0cnVjdCBjb21taXQgKm9yaWdpbiwKKwkJCSAgICAgIGludCBuciwgc3RydWN0IGNvbW1pdCAqKmxpc3QsIHN0cnVjdCBjb21taXQgKmhlYWQpCit7CisJY29uc3QgY2hhciAqY29tbWl0dGVyOworCWNoYXIgKmhlYWRfc2hhMTsKKwljb25zdCBjaGFyICpzdWJqZWN0X3N0YXJ0ID0gTlVMTDsKKwljb25zdCBjaGFyICpib2R5ID0gIioqKiBTVUJKRUNUIEhFUkUgKioqXG5cbioqKiBCTFVSQiBIRVJFICoqKlxuIjsKKwljb25zdCBjaGFyICptc2c7CisJY29uc3QgY2hhciAqZXh0cmFfaGVhZGVycyA9IHJldi0+ZXh0cmFfaGVhZGVyczsKKwlzdHJ1Y3Qgc2hvcnRsb2cgbG9nOworCXN0cnVjdCBzdHJidWYgc2I7CisJaW50IGk7CisJY29uc3QgY2hhciAqZW5jb2RpbmcgPSAidXRmLTgiOworCXN0cnVjdCBkaWZmX29wdGlvbnMgb3B0czsKKwlpbnQgbmVlZF84Yml0X2N0ZSA9IDA7CisKKwlpZiAocmV2LT5jb21taXRfZm9ybWF0ICE9IENNSVRfRk1UX0VNQUlMKQorCQlkaWUoIkNvdmVyIGxldHRlciBuZWVkcyBlbWFpbCBmb3JtYXQiKTsKKworCWlmICghdXNlX3N0ZG91dCAmJiByZW9wZW5fc3Rkb3V0KG51bWJlcmVkX2ZpbGVzID8KKwkJCQlOVUxMIDogImNvdmVyLWxldHRlciIsIDAsIHJldi0+dG90YWwpKQorCQlyZXR1cm47CisKKwloZWFkX3NoYTEgPSBzaGExX3RvX2hleChoZWFkLT5vYmplY3Quc2hhMSk7CisKKwlsb2dfd3JpdGVfZW1haWxfaGVhZGVycyhyZXYsIGhlYWRfc2hhMSwgJnN1YmplY3Rfc3RhcnQsICZleHRyYV9oZWFkZXJzLAorCQkJCSZuZWVkXzhiaXRfY3RlKTsKKworCWNvbW1pdHRlciA9IGdpdF9jb21taXR0ZXJfaW5mbygwKTsKKworCW1zZyA9IGJvZHk7CisJc3RyYnVmX2luaXQoJnNiLCAwKTsKKwlwcF91c2VyX2luZm8oTlVMTCwgQ01JVF9GTVRfRU1BSUwsICZzYiwgY29tbWl0dGVyLCBEQVRFX1JGQzI4MjIsCisJCSAgICAgZW5jb2RpbmcpOworCXBwX3RpdGxlX2xpbmUoQ01JVF9GTVRfRU1BSUwsICZtc2csICZzYiwgc3ViamVjdF9zdGFydCwgZXh0cmFfaGVhZGVycywKKwkJICAgICAgZW5jb2RpbmcsIG5lZWRfOGJpdF9jdGUpOworCXBwX3JlbWFpbmRlcihDTUlUX0ZNVF9FTUFJTCwgJm1zZywgJnNiLCAwKTsKKwlwcmludGYoIiVzXG4iLCBzYi5idWYpOworCisJc3RyYnVmX3JlbGVhc2UoJnNiKTsKKworCXNob3J0bG9nX2luaXQoJmxvZyk7CisJbG9nLndyYXBfbGluZXMgPSAxOworCWxvZy53cmFwID0gNzI7CisJbG9nLmluMSA9IDI7CisJbG9nLmluMiA9IDQ7CisJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspCisJCXNob3J0bG9nX2FkZF9jb21taXQoJmxvZywgbGlzdFtpXSk7CisKKwlzaG9ydGxvZ19vdXRwdXQoJmxvZyk7CisKKwkvKgorCSAqIFdlIGNhbiBvbmx5IGRvIGRpZmZzdGF0IHdpdGggYSB1bmlxdWUgcmVmZXJlbmNlIHBvaW50CisJICovCisJaWYgKCFvcmlnaW4pCisJCXJldHVybjsKKworCW1lbWNweSgmb3B0cywgJnJldi0+ZGlmZm9wdCwgc2l6ZW9mKG9wdHMpKTsKKwlvcHRzLm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9TVU1NQVJZIHwgRElGRl9GT1JNQVRfRElGRlNUQVQ7CisKKwlkaWZmX3NldHVwX2RvbmUoJm9wdHMpOworCisJZGlmZl90cmVlX3NoYTEob3JpZ2luLT50cmVlLT5vYmplY3Quc2hhMSwKKwkJICAgICAgIGhlYWQtPnRyZWUtPm9iamVjdC5zaGExLAorCQkgICAgICAgIiIsICZvcHRzKTsKKwlkaWZmY29yZV9zdGQoJm9wdHMpOworCWRpZmZfZmx1c2goJm9wdHMpOworCisJcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqY2xlYW5fbWVzc2FnZV9pZChjb25zdCBjaGFyICptc2dfaWQpCit7CisJY2hhciBjaDsKKwljb25zdCBjaGFyICphLCAqeiwgKm07CisKKwltID0gbXNnX2lkOworCXdoaWxlICgoY2ggPSAqbSkgJiYgKGlzc3BhY2UoY2gpIHx8IChjaCA9PSAnPCcpKSkKKwkJbSsrOworCWEgPSBtOworCXogPSBOVUxMOworCXdoaWxlICgoY2ggPSAqbSkpIHsKKwkJaWYgKCFpc3NwYWNlKGNoKSAmJiAoY2ggIT0gJz4nKSkKKwkJCXogPSBtOworCQltKys7CisJfQorCWlmICgheikKKwkJZGllKCJpbnNhbmUgaW4tcmVwbHktdG86ICVzIiwgbXNnX2lkKTsKKwlpZiAoKyt6ID09IG0pCisJCXJldHVybiBhOworCXJldHVybiB4bWVtZHVweihhLCB6IC0gYSk7Cit9CisKK2ludCBjbWRfZm9ybWF0X3BhdGNoKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwlzdHJ1Y3QgY29tbWl0ICoqbGlzdCA9IE5VTEw7CisJc3RydWN0IHJldl9pbmZvIHJldjsKKwlpbnQgbnIgPSAwLCB0b3RhbCwgaSwgajsKKwlpbnQgdXNlX3N0ZG91dCA9IDA7CisJaW50IHN0YXJ0X251bWJlciA9IC0xOworCWludCBrZWVwX3N1YmplY3QgPSAwOworCWludCBudW1iZXJlZF9maWxlcyA9IDA7CQkvKiBfanVzdF8gbnVtYmVycyAqLworCWludCBzdWJqZWN0X3ByZWZpeCA9IDA7CisJaW50IGlnbm9yZV9pZl9pbl91cHN0cmVhbSA9IDA7CisJaW50IHRocmVhZCA9IDA7CisJaW50IGNvdmVyX2xldHRlciA9IDA7CisJaW50IGJvdW5kYXJ5X2NvdW50ID0gMDsKKwlzdHJ1Y3QgY29tbWl0ICpvcmlnaW4gPSBOVUxMLCAqaGVhZCA9IE5VTEw7CisJY29uc3QgY2hhciAqaW5fcmVwbHlfdG8gPSBOVUxMOworCXN0cnVjdCBwYXRjaF9pZHMgaWRzOworCWNoYXIgKmFkZF9zaWdub2ZmID0gTlVMTDsKKwlzdHJ1Y3Qgc3RyYnVmIGJ1ZjsKKworCWdpdF9jb25maWcoZ2l0X2Zvcm1hdF9jb25maWcpOworCWluaXRfcmV2aXNpb25zKCZyZXYsIHByZWZpeCk7CisJcmV2LmNvbW1pdF9mb3JtYXQgPSBDTUlUX0ZNVF9FTUFJTDsKKwlyZXYudmVyYm9zZV9oZWFkZXIgPSAxOworCXJldi5kaWZmID0gMTsKKwlyZXYuY29tYmluZV9tZXJnZXMgPSAwOworCXJldi5pZ25vcmVfbWVyZ2VzID0gMTsKKwlyZXYuZGlmZm9wdC5tc2dfc2VwID0gIiI7CisJRElGRl9PUFRfU0VUKCZyZXYuZGlmZm9wdCwgUkVDVVJTSVZFKTsKKworCXJldi5zdWJqZWN0X3ByZWZpeCA9IGZtdF9wYXRjaF9zdWJqZWN0X3ByZWZpeDsKKworCS8qCisJICogUGFyc2UgdGhlIGFyZ3VtZW50cyBiZWZvcmUgc2V0dXBfcmV2aXNpb25zKCksIG9yIHNvbWV0aGluZworCSAqIGxpa2UgImdpdCBmb3JtYXQtcGF0Y2ggLW8gYTEyMyBIRUFEXi4uIiBtYXkgZmFpbDsgYTEyMyBpcworCSAqIHBvc3NpYmx5IGEgdmFsaWQgU0hBMS4KKwkgKi8KKwlmb3IgKGkgPSAxLCBqID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS1zdGRvdXQiKSkKKwkJCXVzZV9zdGRvdXQgPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItbiIpIHx8CisJCQkJIXN0cmNtcChhcmd2W2ldLCAiLS1udW1iZXJlZCIpKQorCQkJbnVtYmVyZWQgPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItTiIpIHx8CisJCQkJIXN0cmNtcChhcmd2W2ldLCAiLS1uby1udW1iZXJlZCIpKSB7CisJCQludW1iZXJlZCA9IDA7CisJCQlhdXRvX251bWJlciA9IDA7CisJCX0KKwkJZWxzZSBpZiAoIXByZWZpeGNtcChhcmd2W2ldLCAiLS1zdGFydC1udW1iZXI9IikpCisJCQlzdGFydF9udW1iZXIgPSBzdHJ0b2woYXJndltpXSArIDE1LCBOVUxMLCAxMCk7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tbnVtYmVyZWQtZmlsZXMiKSkKKwkJCW51bWJlcmVkX2ZpbGVzID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS1zdGFydC1udW1iZXIiKSkgeworCQkJaSsrOworCQkJaWYgKGkgPT0gYXJnYykKKwkJCQlkaWUoIk5lZWQgYSBudW1iZXIgZm9yIC0tc3RhcnQtbnVtYmVyIik7CisJCQlzdGFydF9udW1iZXIgPSBzdHJ0b2woYXJndltpXSwgTlVMTCwgMTApOworCQl9CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJndltpXSwgIi0tY2M9IikpIHsKKwkJCUFMTE9DX0dST1coZXh0cmFfY2MsIGV4dHJhX2NjX25yICsgMSwgZXh0cmFfY2NfYWxsb2MpOworCQkJZXh0cmFfY2NbZXh0cmFfY2NfbnIrK10gPSB4c3RyZHVwKGFyZ3ZbaV0gKyA1KTsKKwkJfQorCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItayIpIHx8CisJCQkJIXN0cmNtcChhcmd2W2ldLCAiLS1rZWVwLXN1YmplY3QiKSkgeworCQkJa2VlcF9zdWJqZWN0ID0gMTsKKwkJCXJldi50b3RhbCA9IC0xOworCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tb3V0cHV0LWRpcmVjdG9yeSIpIHx8CisJCQkgIXN0cmNtcChhcmd2W2ldLCAiLW8iKSkgeworCQkJaSsrOworCQkJaWYgKGFyZ2MgPD0gaSkKKwkJCQlkaWUoIldoaWNoIGRpcmVjdG9yeT8iKTsKKwkJCWlmIChvdXRwdXRfZGlyZWN0b3J5KQorCQkJCWRpZSgiVHdvIG91dHB1dCBkaXJlY3Rvcmllcz8iKTsKKwkJCW91dHB1dF9kaXJlY3RvcnkgPSBhcmd2W2ldOworCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tc2lnbm9mZiIpIHx8CisJCQkgIXN0cmNtcChhcmd2W2ldLCAiLXMiKSkgeworCQkJY29uc3QgY2hhciAqY29tbWl0dGVyOworCQkJY29uc3QgY2hhciAqZW5kcG9zOworCQkJY29tbWl0dGVyID0gZ2l0X2NvbW1pdHRlcl9pbmZvKElERU5UX0VSUk9SX09OX05PX05BTUUpOworCQkJZW5kcG9zID0gc3RyY2hyKGNvbW1pdHRlciwgJz4nKTsKKwkJCWlmICghZW5kcG9zKQorCQkJCWRpZSgiYm9nb3MgY29tbWl0dGVyIGluZm8gJXNcbiIsIGNvbW1pdHRlcik7CisJCQlhZGRfc2lnbm9mZiA9IHhtZW1kdXB6KGNvbW1pdHRlciwgZW5kcG9zIC0gY29tbWl0dGVyICsgMSk7CisJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS1hdHRhY2giKSkgeworCQkJcmV2Lm1pbWVfYm91bmRhcnkgPSBnaXRfdmVyc2lvbl9zdHJpbmc7CisJCQlyZXYubm9faW5saW5lID0gMTsKKwkJfQorCQllbHNlIGlmICghcHJlZml4Y21wKGFyZ3ZbaV0sICItLWF0dGFjaD0iKSkgeworCQkJcmV2Lm1pbWVfYm91bmRhcnkgPSBhcmd2W2ldICsgOTsKKwkJCXJldi5ub19pbmxpbmUgPSAxOworCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0taW5saW5lIikpIHsKKwkJCXJldi5taW1lX2JvdW5kYXJ5ID0gZ2l0X3ZlcnNpb25fc3RyaW5nOworCQkJcmV2Lm5vX2lubGluZSA9IDA7CisJCX0KKwkJZWxzZSBpZiAoIXByZWZpeGNtcChhcmd2W2ldLCAiLS1pbmxpbmU9IikpIHsKKwkJCXJldi5taW1lX2JvdW5kYXJ5ID0gYXJndltpXSArIDk7CisJCQlyZXYubm9faW5saW5lID0gMDsKKwkJfQorCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItLWlnbm9yZS1pZi1pbi11cHN0cmVhbSIpKQorCQkJaWdub3JlX2lmX2luX3Vwc3RyZWFtID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS10aHJlYWQiKSkKKwkJCXRocmVhZCA9IDE7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJndltpXSwgIi0taW4tcmVwbHktdG89IikpCisJCQlpbl9yZXBseV90byA9IGFyZ3ZbaV0gKyAxNDsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS1pbi1yZXBseS10byIpKSB7CisJCQlpKys7CisJCQlpZiAoaSA9PSBhcmdjKQorCQkJCWRpZSgiTmVlZCBhIE1lc3NhZ2UtSWQgZm9yIC0taW4tcmVwbHktdG8iKTsKKwkJCWluX3JlcGx5X3RvID0gYXJndltpXTsKKwkJfSBlbHNlIGlmICghcHJlZml4Y21wKGFyZ3ZbaV0sICItLXN1YmplY3QtcHJlZml4PSIpKSB7CisJCQlzdWJqZWN0X3ByZWZpeCA9IDE7CisJCQlyZXYuc3ViamVjdF9wcmVmaXggPSBhcmd2W2ldICsgMTc7CisJCX0gZWxzZSBpZiAoIXByZWZpeGNtcChhcmd2W2ldLCAiLS1zdWZmaXg9IikpCisJCQlmbXRfcGF0Y2hfc3VmZml4ID0gYXJndltpXSArIDk7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tY292ZXItbGV0dGVyIikpCisJCQljb3Zlcl9sZXR0ZXIgPSAxOworCQllbHNlCisJCQlhcmd2W2orK10gPSBhcmd2W2ldOworCX0KKwlhcmdjID0gajsKKworCXN0cmJ1Zl9pbml0KCZidWYsIDApOworCisJZm9yIChpID0gMDsgaSA8IGV4dHJhX2hkcl9ucjsgaSsrKSB7CisJCXN0cmJ1Zl9hZGRzdHIoJmJ1ZiwgZXh0cmFfaGRyW2ldKTsKKwkJc3RyYnVmX2FkZGNoKCZidWYsICdcbicpOworCX0KKworCWlmIChleHRyYV90b19ucikKKwkJc3RyYnVmX2FkZHN0cigmYnVmLCAiVG86ICIpOworCWZvciAoaSA9IDA7IGkgPCBleHRyYV90b19ucjsgaSsrKSB7CisJCWlmIChpKQorCQkJc3RyYnVmX2FkZHN0cigmYnVmLCAiICAgICIpOworCQlzdHJidWZfYWRkc3RyKCZidWYsIGV4dHJhX3RvW2ldKTsKKwkJaWYgKGkgKyAxIDwgZXh0cmFfdG9fbnIpCisJCQlzdHJidWZfYWRkY2goJmJ1ZiwgJywnKTsKKwkJc3RyYnVmX2FkZGNoKCZidWYsICdcbicpOworCX0KKworCWlmIChleHRyYV9jY19ucikKKwkJc3RyYnVmX2FkZHN0cigmYnVmLCAiQ2M6ICIpOworCWZvciAoaSA9IDA7IGkgPCBleHRyYV9jY19ucjsgaSsrKSB7CisJCWlmIChpKQorCQkJc3RyYnVmX2FkZHN0cigmYnVmLCAiICAgICIpOworCQlzdHJidWZfYWRkc3RyKCZidWYsIGV4dHJhX2NjW2ldKTsKKwkJaWYgKGkgKyAxIDwgZXh0cmFfY2NfbnIpCisJCQlzdHJidWZfYWRkY2goJmJ1ZiwgJywnKTsKKwkJc3RyYnVmX2FkZGNoKCZidWYsICdcbicpOworCX0KKworCXJldi5leHRyYV9oZWFkZXJzID0gc3RyYnVmX2RldGFjaCgmYnVmLCAwKTsKKworCWlmIChzdGFydF9udW1iZXIgPCAwKQorCQlzdGFydF9udW1iZXIgPSAxOworCWlmIChudW1iZXJlZCAmJiBrZWVwX3N1YmplY3QpCisJCWRpZSAoIi1uIGFuZCAtayBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiIpOworCWlmIChrZWVwX3N1YmplY3QgJiYgc3ViamVjdF9wcmVmaXgpCisJCWRpZSAoIi0tc3ViamVjdC1wcmVmaXggYW5kIC1rIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIik7CisJaWYgKG51bWJlcmVkX2ZpbGVzICYmIHVzZV9zdGRvdXQpCisJCWRpZSAoIi0tbnVtYmVyZWQtZmlsZXMgYW5kIC0tc3Rkb3V0IGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIik7CisKKwlhcmdjID0gc2V0dXBfcmV2aXNpb25zKGFyZ2MsIGFyZ3YsICZyZXYsICJIRUFEIik7CisJaWYgKGFyZ2MgPiAxKQorCQlkaWUgKCJ1bnJlY29nbml6ZWQgYXJndW1lbnQ6ICVzIiwgYXJndlsxXSk7CisKKwlpZiAoIXJldi5kaWZmb3B0Lm91dHB1dF9mb3JtYXQpCisJCXJldi5kaWZmb3B0Lm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9ESUZGU1RBVCB8IERJRkZfRk9STUFUX1NVTU1BUlkgfCBESUZGX0ZPUk1BVF9QQVRDSDsKKworCWlmICghRElGRl9PUFRfVFNUKCZyZXYuZGlmZm9wdCwgVEVYVCkpCisJCURJRkZfT1BUX1NFVCgmcmV2LmRpZmZvcHQsIEJJTkFSWSk7CisKKwlpZiAoIW91dHB1dF9kaXJlY3RvcnkgJiYgIXVzZV9zdGRvdXQpCisJCW91dHB1dF9kaXJlY3RvcnkgPSBwcmVmaXg7CisKKwlpZiAob3V0cHV0X2RpcmVjdG9yeSkgeworCQlpZiAodXNlX3N0ZG91dCkKKwkJCWRpZSgic3RhbmRhcmQgb3V0cHV0LCBvciBkaXJlY3RvcnksIHdoaWNoIG9uZT8iKTsKKwkJaWYgKG1rZGlyKG91dHB1dF9kaXJlY3RvcnksIDA3NzcpIDwgMCAmJiBlcnJubyAhPSBFRVhJU1QpCisJCQlkaWUoIkNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5ICVzIiwKKwkJCSAgICBvdXRwdXRfZGlyZWN0b3J5KTsKKwl9CisKKwlpZiAocmV2LnBlbmRpbmcubnIgPT0gMSkgeworCQlpZiAocmV2Lm1heF9jb3VudCA8IDAgJiYgIXJldi5zaG93X3Jvb3RfZGlmZikgeworCQkJLyoKKwkJCSAqIFRoaXMgaXMgdHJhZGl0aW9uYWwgYmVoYXZpb3VyIG9mICJnaXQgZm9ybWF0LXBhdGNoCisJCQkgKiBvcmlnaW4iIHRoYXQgcHJlcGFyZXMgd2hhdCB0aGUgb3JpZ2luIHNpZGUgc3RpbGwKKwkJCSAqIGRvZXMgbm90IGhhdmUuCisJCQkgKi8KKwkJCXJldi5wZW5kaW5nLm9iamVjdHNbMF0uaXRlbS0+ZmxhZ3MgfD0gVU5JTlRFUkVTVElORzsKKwkJCWFkZF9oZWFkX3RvX3BlbmRpbmcoJnJldik7CisJCX0KKwkJLyoKKwkJICogT3RoZXJ3aXNlLCBpdCBpcyAiZm9ybWF0LXBhdGNoIC0yMiBIRUFEIiwgYW5kL29yCisJCSAqICJmb3JtYXQtcGF0Y2ggLS1yb290IEhFQUQiLiAgVGhlIHVzZXIgd2FudHMKKwkJICogZ2V0X3JldmlzaW9uKCkgdG8gZG8gdGhlIHVzdWFsIHRyYXZlcnNhbC4KKwkJICovCisJfQorCWlmIChjb3Zlcl9sZXR0ZXIpIHsKKwkJLyogcmVtZW1iZXIgdGhlIHJhbmdlICovCisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgcmV2LnBlbmRpbmcubnI7IGkrKykgeworCQkJc3RydWN0IG9iamVjdCAqbyA9IHJldi5wZW5kaW5nLm9iamVjdHNbaV0uaXRlbTsKKwkJCWlmICghKG8tPmZsYWdzICYgVU5JTlRFUkVTVElORykpCisJCQkJaGVhZCA9IChzdHJ1Y3QgY29tbWl0ICopbzsKKwkJfQorCQkvKiBXZSBjYW4ndCBnZW5lcmF0ZSBhIGNvdmVyIGxldHRlciB3aXRob3V0IGFueSBwYXRjaGVzICovCisJCWlmICghaGVhZCkKKwkJCXJldHVybiAwOworCX0KKworCWlmIChpZ25vcmVfaWZfaW5fdXBzdHJlYW0pCisJCWdldF9wYXRjaF9pZHMoJnJldiwgJmlkcywgcHJlZml4KTsKKworCWlmICghdXNlX3N0ZG91dCkKKwkJcmVhbHN0ZG91dCA9IHhmZG9wZW4oeGR1cCgxKSwgInciKTsKKworCWlmIChwcmVwYXJlX3JldmlzaW9uX3dhbGsoJnJldikpCisJCWRpZSgicmV2aXNpb24gd2FsayBzZXR1cCBmYWlsZWQiKTsKKwlyZXYuYm91bmRhcnkgPSAxOworCXdoaWxlICgoY29tbWl0ID0gZ2V0X3JldmlzaW9uKCZyZXYpKSAhPSBOVUxMKSB7CisJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIEJPVU5EQVJZKSB7CisJCQlib3VuZGFyeV9jb3VudCsrOworCQkJb3JpZ2luID0gKGJvdW5kYXJ5X2NvdW50ID09IDEpID8gY29tbWl0IDogTlVMTDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogaWdub3JlIG1lcmdlcyAqLworCQlpZiAoY29tbWl0LT5wYXJlbnRzICYmIGNvbW1pdC0+cGFyZW50cy0+bmV4dCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChpZ25vcmVfaWZfaW5fdXBzdHJlYW0gJiYKKwkJCQloYXNfY29tbWl0X3BhdGNoX2lkKGNvbW1pdCwgJmlkcykpCisJCQljb250aW51ZTsKKworCQlucisrOworCQlsaXN0ID0geHJlYWxsb2MobGlzdCwgbnIgKiBzaXplb2YobGlzdFswXSkpOworCQlsaXN0W25yIC0gMV0gPSBjb21taXQ7CisJfQorCXRvdGFsID0gbnI7CisJaWYgKCFrZWVwX3N1YmplY3QgJiYgYXV0b19udW1iZXIgJiYgdG90YWwgPiAxKQorCQludW1iZXJlZCA9IDE7CisJaWYgKG51bWJlcmVkKQorCQlyZXYudG90YWwgPSB0b3RhbCArIHN0YXJ0X251bWJlciAtIDE7CisJaWYgKGluX3JlcGx5X3RvKQorCQlyZXYucmVmX21lc3NhZ2VfaWQgPSBjbGVhbl9tZXNzYWdlX2lkKGluX3JlcGx5X3RvKTsKKwlpZiAoY292ZXJfbGV0dGVyKSB7CisJCWlmICh0aHJlYWQpCisJCQlnZW5fbWVzc2FnZV9pZCgmcmV2LCAiY292ZXIiKTsKKwkJbWFrZV9jb3Zlcl9sZXR0ZXIoJnJldiwgdXNlX3N0ZG91dCwgbnVtYmVyZWQsIG51bWJlcmVkX2ZpbGVzLAorCQkJCSAgb3JpZ2luLCBuciwgbGlzdCwgaGVhZCk7CisJCXRvdGFsKys7CisJCXN0YXJ0X251bWJlci0tOworCX0KKwlyZXYuYWRkX3NpZ25vZmYgPSBhZGRfc2lnbm9mZjsKKwl3aGlsZSAoMCA8PSAtLW5yKSB7CisJCWludCBzaG93bjsKKwkJY29tbWl0ID0gbGlzdFtucl07CisJCXJldi5uciA9IHRvdGFsIC0gbnIgKyAoc3RhcnRfbnVtYmVyIC0gMSk7CisJCS8qIE1ha2UgdGhlIHNlY29uZCBhbmQgc3Vic2VxdWVudCBtYWlscyByZXBsaWVzIHRvIHRoZSBmaXJzdCAqLworCQlpZiAodGhyZWFkKSB7CisJCQkvKiBIYXZlIHdlIGFscmVhZHkgaGFkIGEgbWVzc2FnZSBJRD8gKi8KKwkJCWlmIChyZXYubWVzc2FnZV9pZCkgeworCQkJCS8qCisJCQkJICogSWYgd2UndmUgZ290IHRoZSBJRCB0byBiZSBhIHJlcGx5CisJCQkJICogdG8sIGRpc2NhcmQgdGhlIGN1cnJlbnQgSUQ7CisJCQkJICogb3RoZXJ3aXNlLCBtYWtlIGV2ZXJ5dGhpbmcgYSByZXBseQorCQkJCSAqIHRvIHRoYXQuCisJCQkJICovCisJCQkJaWYgKHJldi5yZWZfbWVzc2FnZV9pZCkKKwkJCQkJZnJlZShyZXYubWVzc2FnZV9pZCk7CisJCQkJZWxzZQorCQkJCQlyZXYucmVmX21lc3NhZ2VfaWQgPSByZXYubWVzc2FnZV9pZDsKKwkJCX0KKwkJCWdlbl9tZXNzYWdlX2lkKCZyZXYsIHNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKwkJfQorCQlpZiAoIXVzZV9zdGRvdXQgJiYgcmVvcGVuX3N0ZG91dChudW1iZXJlZF9maWxlcyA/IE5VTEwgOgorCQkJCWdldF9vbmVsaW5lX2Zvcl9maWxlbmFtZShjb21taXQsIGtlZXBfc3ViamVjdCksCisJCQkJcmV2Lm5yLCByZXYudG90YWwpKQorCQkJZGllKCJGYWlsZWQgdG8gY3JlYXRlIG91dHB1dCBmaWxlcyIpOworCQlzaG93biA9IGxvZ190cmVlX2NvbW1pdCgmcmV2LCBjb21taXQpOworCQlmcmVlKGNvbW1pdC0+YnVmZmVyKTsKKwkJY29tbWl0LT5idWZmZXIgPSBOVUxMOworCisJCS8qIFdlIHB1dCBvbmUgZXh0cmEgYmxhbmsgbGluZSBiZXR3ZWVuIGZvcm1hdHRlZAorCQkgKiBwYXRjaGVzIGFuZCB0aGlzIGZsYWcgaXMgdXNlZCBieSBsb2ctdHJlZSBjb2RlCisJCSAqIHRvIHNlZSBpZiBpdCBuZWVkcyB0byBlbWl0IGEgTEYgYmVmb3JlIHNob3dpbmcKKwkJICogdGhlIGxvZzsgd2hlbiB1c2luZyBvbmUgZmlsZSBwZXIgcGF0Y2gsIHdlIGRvCisJCSAqIG5vdCB3YW50IHRoZSBleHRyYSBibGFuayBsaW5lLgorCQkgKi8KKwkJaWYgKCF1c2Vfc3Rkb3V0KQorCQkJcmV2LnNob3duX29uZSA9IDA7CisJCWlmIChzaG93bikgeworCQkJaWYgKHJldi5taW1lX2JvdW5kYXJ5KQorCQkJCXByaW50ZigiXG4tLSVzJXMtLVxuXG5cbiIsCisJCQkJICAgICAgIG1pbWVfYm91bmRhcnlfbGVhZGVyLAorCQkJCSAgICAgICByZXYubWltZV9ib3VuZGFyeSk7CisJCQllbHNlCisJCQkJcHJpbnRmKCItLSBcbiVzXG5cbiIsIGdpdF92ZXJzaW9uX3N0cmluZyk7CisJCX0KKwkJaWYgKCF1c2Vfc3Rkb3V0KQorCQkJZmNsb3NlKHN0ZG91dCk7CisJfQorCWZyZWUobGlzdCk7CisJaWYgKGlnbm9yZV9pZl9pbl91cHN0cmVhbSkKKwkJZnJlZV9wYXRjaF9pZHMoJmlkcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3BlbmRpbmdfY29tbWl0KGNvbnN0IGNoYXIgKmFyZywgc3RydWN0IHJldl9pbmZvICpyZXZzLCBpbnQgZmxhZ3MpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlpZiAoZ2V0X3NoYTEoYXJnLCBzaGExKSA9PSAwKSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKHNoYTEpOworCQlpZiAoY29tbWl0KSB7CisJCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBmbGFnczsKKwkJCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCAmY29tbWl0LT5vYmplY3QsIGFyZyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGNoZXJyeV91c2FnZVtdID0KKyJnaXQtY2hlcnJ5IFstdl0gPHVwc3RyZWFtPiBbPGhlYWQ+XSBbPGxpbWl0Pl0iOworaW50IGNtZF9jaGVycnkoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IHJldl9pbmZvIHJldnM7CisJc3RydWN0IHBhdGNoX2lkcyBpZHM7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCXN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCA9IE5VTEw7CisJY29uc3QgY2hhciAqdXBzdHJlYW07CisJY29uc3QgY2hhciAqaGVhZCA9ICJIRUFEIjsKKwljb25zdCBjaGFyICpsaW1pdCA9IE5VTEw7CisJaW50IHZlcmJvc2UgPSAwOworCisJaWYgKGFyZ2MgPiAxICYmICFzdHJjbXAoYXJndlsxXSwgIi12IikpIHsKKwkJdmVyYm9zZSA9IDE7CisJCWFyZ2MtLTsKKwkJYXJndisrOworCX0KKworCXN3aXRjaCAoYXJnYykgeworCWNhc2UgNDoKKwkJbGltaXQgPSBhcmd2WzNdOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgMzoKKwkJaGVhZCA9IGFyZ3ZbMl07CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSAyOgorCQl1cHN0cmVhbSA9IGFyZ3ZbMV07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXVzYWdlKGNoZXJyeV91c2FnZSk7CisJfQorCisJaW5pdF9yZXZpc2lvbnMoJnJldnMsIHByZWZpeCk7CisJcmV2cy5kaWZmID0gMTsKKwlyZXZzLmNvbWJpbmVfbWVyZ2VzID0gMDsKKwlyZXZzLmlnbm9yZV9tZXJnZXMgPSAxOworCURJRkZfT1BUX1NFVCgmcmV2cy5kaWZmb3B0LCBSRUNVUlNJVkUpOworCisJaWYgKGFkZF9wZW5kaW5nX2NvbW1pdChoZWFkLCAmcmV2cywgMCkpCisJCWRpZSgiVW5rbm93biBjb21taXQgJXMiLCBoZWFkKTsKKwlpZiAoYWRkX3BlbmRpbmdfY29tbWl0KHVwc3RyZWFtLCAmcmV2cywgVU5JTlRFUkVTVElORykpCisJCWRpZSgiVW5rbm93biBjb21taXQgJXMiLCB1cHN0cmVhbSk7CisKKwkvKiBEb24ndCBzYXkgYW55dGhpbmcgaWYgaGVhZCBhbmQgdXBzdHJlYW0gYXJlIHRoZSBzYW1lLiAqLworCWlmIChyZXZzLnBlbmRpbmcubnIgPT0gMikgeworCQlzdHJ1Y3Qgb2JqZWN0X2FycmF5X2VudHJ5ICpvID0gcmV2cy5wZW5kaW5nLm9iamVjdHM7CisJCWlmIChoYXNoY21wKG9bMF0uaXRlbS0+c2hhMSwgb1sxXS5pdGVtLT5zaGExKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJfQorCisJZ2V0X3BhdGNoX2lkcygmcmV2cywgJmlkcywgcHJlZml4KTsKKworCWlmIChsaW1pdCAmJiBhZGRfcGVuZGluZ19jb21taXQobGltaXQsICZyZXZzLCBVTklOVEVSRVNUSU5HKSkKKwkJZGllKCJVbmtub3duIGNvbW1pdCAlcyIsIGxpbWl0KTsKKworCS8qIHJldmVyc2UgdGhlIGxpc3Qgb2YgY29tbWl0cyAqLworCWlmIChwcmVwYXJlX3JldmlzaW9uX3dhbGsoJnJldnMpKQorCQlkaWUoInJldmlzaW9uIHdhbGsgc2V0dXAgZmFpbGVkIik7CisJd2hpbGUgKChjb21taXQgPSBnZXRfcmV2aXNpb24oJnJldnMpKSAhPSBOVUxMKSB7CisJCS8qIGlnbm9yZSBtZXJnZXMgKi8KKwkJaWYgKGNvbW1pdC0+cGFyZW50cyAmJiBjb21taXQtPnBhcmVudHMtPm5leHQpCisJCQljb250aW51ZTsKKworCQljb21taXRfbGlzdF9pbnNlcnQoY29tbWl0LCAmbGlzdCk7CisJfQorCisJd2hpbGUgKGxpc3QpIHsKKwkJY2hhciBzaWduID0gJysnOworCisJCWNvbW1pdCA9IGxpc3QtPml0ZW07CisJCWlmIChoYXNfY29tbWl0X3BhdGNoX2lkKGNvbW1pdCwgJmlkcykpCisJCQlzaWduID0gJy0nOworCisJCWlmICh2ZXJib3NlKSB7CisJCQlzdHJ1Y3Qgc3RyYnVmIGJ1ZjsKKwkJCXN0cmJ1Zl9pbml0KCZidWYsIDApOworCQkJcHJldHR5X3ByaW50X2NvbW1pdChDTUlUX0ZNVF9PTkVMSU5FLCBjb21taXQsCisJCQkgICAgICAgICAgICAgICAgICAgICZidWYsIDAsIE5VTEwsIE5VTEwsIDAsIDApOworCQkJcHJpbnRmKCIlYyAlcyAlc1xuIiwgc2lnbiwKKwkJCSAgICAgICBzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSwgYnVmLmJ1Zik7CisJCQlzdHJidWZfcmVsZWFzZSgmYnVmKTsKKwkJfQorCQllbHNlIHsKKwkJCXByaW50ZigiJWMgJXNcbiIsIHNpZ24sCisJCQkgICAgICAgc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCQl9CisKKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJfQorCisJZnJlZV9wYXRjaF9pZHMoJmlkcyk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWxzLWZpbGVzLmMgYi9idWlsdGluLWxzLWZpbGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM3ZWFiOAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tbHMtZmlsZXMuYwpAQCAtMCwwICsxLDYyMyBAQAorLyoKKyAqIFRoaXMgbWVyZ2VzIHRoZSBmaWxlIGxpc3RpbmcgaW4gdGhlIGRpcmVjdG9yeSBjYWNoZSBpbmRleAorICogd2l0aCB0aGUgYWN0dWFsIHdvcmtpbmcgZGlyZWN0b3J5IGxpc3QsIGFuZCBzaG93cyBkaWZmZXJlbnQKKyAqIGNvbWJpbmF0aW9ucyBvZiB0aGUgdHdvLgorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKyNpbmNsdWRlICJkaXIuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAidHJlZS5oIgorCitzdGF0aWMgaW50IGFiYnJldjsKK3N0YXRpYyBpbnQgc2hvd19kZWxldGVkOworc3RhdGljIGludCBzaG93X2NhY2hlZDsKK3N0YXRpYyBpbnQgc2hvd19vdGhlcnM7CitzdGF0aWMgaW50IHNob3dfc3RhZ2U7CitzdGF0aWMgaW50IHNob3dfdW5tZXJnZWQ7CitzdGF0aWMgaW50IHNob3dfbW9kaWZpZWQ7CitzdGF0aWMgaW50IHNob3dfa2lsbGVkOworc3RhdGljIGludCBzaG93X3ZhbGlkX2JpdDsKK3N0YXRpYyBpbnQgbGluZV90ZXJtaW5hdG9yID0gJ1xuJzsKKworc3RhdGljIGludCBwcmVmaXhfbGVuOworc3RhdGljIGludCBwcmVmaXhfb2Zmc2V0Oworc3RhdGljIGNvbnN0IGNoYXIgKipwYXRoc3BlYzsKK3N0YXRpYyBpbnQgZXJyb3JfdW5tYXRjaDsKK3N0YXRpYyBjaGFyICpwc19tYXRjaGVkOworc3RhdGljIGNvbnN0IGNoYXIgKndpdGhfdHJlZTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnRhZ19jYWNoZWQgPSAiIjsKK3N0YXRpYyBjb25zdCBjaGFyICp0YWdfdW5tZXJnZWQgPSAiIjsKK3N0YXRpYyBjb25zdCBjaGFyICp0YWdfcmVtb3ZlZCA9ICIiOworc3RhdGljIGNvbnN0IGNoYXIgKnRhZ19vdGhlciA9ICIiOworc3RhdGljIGNvbnN0IGNoYXIgKnRhZ19raWxsZWQgPSAiIjsKK3N0YXRpYyBjb25zdCBjaGFyICp0YWdfbW9kaWZpZWQgPSAiIjsKKworCisvKgorICogTWF0Y2ggYSBwYXRoc3BlYyBhZ2FpbnN0IGEgZmlsZW5hbWUuIFRoZSBmaXJzdCAic2tpcGxlbiIgY2hhcmFjdGVycworICogYXJlIHRoZSBjb21tb24gcHJlZml4CisgKi8KK2ludCBwYXRoc3BlY19tYXRjaChjb25zdCBjaGFyICoqc3BlYywgY2hhciAqcHNfbWF0Y2hlZCwKKwkJICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBza2lwbGVuKQoreworCWNvbnN0IGNoYXIgKm07CisKKwl3aGlsZSAoKG0gPSAqc3BlYysrKSAhPSBOVUxMKSB7CisJCWludCBtYXRjaGxlbiA9IHN0cmxlbihtICsgc2tpcGxlbik7CisKKwkJaWYgKCFtYXRjaGxlbikKKwkJCWdvdG8gbWF0Y2hlZDsKKwkJaWYgKCFzdHJuY21wKG0gKyBza2lwbGVuLCBmaWxlbmFtZSArIHNraXBsZW4sIG1hdGNobGVuKSkgeworCQkJaWYgKG1bc2tpcGxlbiArIG1hdGNobGVuIC0gMV0gPT0gJy8nKQorCQkJCWdvdG8gbWF0Y2hlZDsKKwkJCXN3aXRjaCAoZmlsZW5hbWVbc2tpcGxlbiArIG1hdGNobGVuXSkgeworCQkJY2FzZSAnLyc6IGNhc2UgJ1wwJzoKKwkJCQlnb3RvIG1hdGNoZWQ7CisJCQl9CisJCX0KKwkJaWYgKCFmbm1hdGNoKG0gKyBza2lwbGVuLCBmaWxlbmFtZSArIHNraXBsZW4sIDApKQorCQkJZ290byBtYXRjaGVkOworCQlpZiAocHNfbWF0Y2hlZCkKKwkJCXBzX21hdGNoZWQrKzsKKwkJY29udGludWU7CisJbWF0Y2hlZDoKKwkJaWYgKHBzX21hdGNoZWQpCisJCQkqcHNfbWF0Y2hlZCA9IDE7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2hvd19kaXJfZW50cnkoY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgZGlyX2VudHJ5ICplbnQpCit7CisJaW50IGxlbiA9IHByZWZpeF9sZW47CisJaW50IG9mZnNldCA9IHByZWZpeF9vZmZzZXQ7CisKKwlpZiAobGVuID49IGVudC0+bGVuKQorCQlkaWUoImdpdC1scy1maWxlczogaW50ZXJuYWwgZXJyb3IgLSBkaXJlY3RvcnkgZW50cnkgbm90IHN1cGVyc2V0IG9mIHByZWZpeCIpOworCisJaWYgKHBhdGhzcGVjICYmICFwYXRoc3BlY19tYXRjaChwYXRoc3BlYywgcHNfbWF0Y2hlZCwgZW50LT5uYW1lLCBsZW4pKQorCQlyZXR1cm47CisKKwlmcHV0cyh0YWcsIHN0ZG91dCk7CisJd3JpdGVfbmFtZV9xdW90ZWQoZW50LT5uYW1lICsgb2Zmc2V0LCBzdGRvdXQsIGxpbmVfdGVybWluYXRvcik7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfb3RoZXJfZmlsZXMoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpcikKK3sKKwlpbnQgaTsKKworCisJLyoKKwkgKiBTa2lwIG1hdGNoaW5nIGFuZCB1bm1lcmdlZCBlbnRyaWVzIGZvciB0aGUgcGF0aHMsCisJICogc2luY2Ugd2Ugd2FudCBqdXN0ICJvdGhlcnMiLgorCSAqCisJICogKE1hdGNoaW5nIGVudHJpZXMgYXJlIG5vcm1hbGx5IHBydW5lZCBkdXJpbmcKKwkgKiB0aGUgZGlyZWN0b3J5IHRyZWUgd2FsaywgYnV0IHdpbGwgc2hvdyB1cCBmb3IKKwkgKiBnaXRsaW5rcyBiZWNhdXNlIHdlIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUKKwkgKiBkaXItPnNob3dfb3RoZXJfZGlyZWN0b3JpZXMgc2V0IHRvIHN1cHByZXNzCisJICogdGhlbSkuCisJICovCisJZm9yIChpID0gMDsgaSA8IGRpci0+bnI7IGkrKykgeworCQlzdHJ1Y3QgZGlyX2VudHJ5ICplbnQgPSBkaXItPmVudHJpZXNbaV07CisJCWludCBsZW4sIHBvczsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZTsKKworCQkvKgorCQkgKiBSZW1vdmUgdGhlICcvJyBhdCB0aGUgZW5kIHRoYXQgZGlyZWN0b3J5CisJCSAqIHdhbGtpbmcgYWRkcyBmb3IgZGlyZWN0b3J5IGVudHJpZXMuCisJCSAqLworCQlsZW4gPSBlbnQtPmxlbjsKKwkJaWYgKGxlbiAmJiBlbnQtPm5hbWVbbGVuLTFdID09ICcvJykKKwkJCWxlbi0tOworCQlwb3MgPSBjYWNoZV9uYW1lX3BvcyhlbnQtPm5hbWUsIGxlbik7CisJCWlmICgwIDw9IHBvcykKKwkJCWNvbnRpbnVlOwkvKiBleGFjdCBtYXRjaCAqLworCQlwb3MgPSAtcG9zIC0gMTsKKwkJaWYgKHBvcyA8IGFjdGl2ZV9ucikgeworCQkJY2UgPSBhY3RpdmVfY2FjaGVbcG9zXTsKKwkJCWlmIChjZV9uYW1lbGVuKGNlKSA9PSBsZW4gJiYKKwkJCSAgICAhbWVtY21wKGNlLT5uYW1lLCBlbnQtPm5hbWUsIGxlbikpCisJCQkJY29udGludWU7IC8qIFl1cCwgdGhpcyBvbmUgZXhpc3RzIHVubWVyZ2VkICovCisJCX0KKwkJc2hvd19kaXJfZW50cnkodGFnX290aGVyLCBlbnQpOworCX0KK30KKworc3RhdGljIHZvaWQgc2hvd19raWxsZWRfZmlsZXMoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpcikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgZGlyLT5ucjsgaSsrKSB7CisJCXN0cnVjdCBkaXJfZW50cnkgKmVudCA9IGRpci0+ZW50cmllc1tpXTsKKwkJY2hhciAqY3AsICpzcDsKKwkJaW50IHBvcywgbGVuLCBraWxsZWQgPSAwOworCisJCWZvciAoY3AgPSBlbnQtPm5hbWU7IGNwIC0gZW50LT5uYW1lIDwgZW50LT5sZW47IGNwID0gc3AgKyAxKSB7CisJCQlzcCA9IHN0cmNocihjcCwgJy8nKTsKKwkJCWlmICghc3ApIHsKKwkJCQkvKiBJZiBlbnQtPm5hbWUgaXMgcHJlZml4IG9mIGFuIGVudHJ5IGluIHRoZQorCQkJCSAqIGNhY2hlLCBpdCB3aWxsIGJlIGtpbGxlZC4KKwkJCQkgKi8KKwkJCQlwb3MgPSBjYWNoZV9uYW1lX3BvcyhlbnQtPm5hbWUsIGVudC0+bGVuKTsKKwkJCQlpZiAoMCA8PSBwb3MpCisJCQkJCWRpZSgiYnVnIGluIHNob3cta2lsbGVkLWZpbGVzIik7CisJCQkJcG9zID0gLXBvcyAtIDE7CisJCQkJd2hpbGUgKHBvcyA8IGFjdGl2ZV9uciAmJgorCQkJCSAgICAgICBjZV9zdGFnZShhY3RpdmVfY2FjaGVbcG9zXSkpCisJCQkJCXBvcysrOyAvKiBza2lwIHVubWVyZ2VkICovCisJCQkJaWYgKGFjdGl2ZV9uciA8PSBwb3MpCisJCQkJCWJyZWFrOworCQkJCS8qIHBvcyBwb2ludHMgYXQgYSBuYW1lIGltbWVkaWF0ZWx5IGFmdGVyCisJCQkJICogZW50LT5uYW1lIGluIHRoZSBjYWNoZS4gIERvZXMgaXQgZXhwZWN0CisJCQkJICogZW50LT5uYW1lIHRvIGJlIGEgZGlyZWN0b3J5PworCQkJCSAqLworCQkJCWxlbiA9IGNlX25hbWVsZW4oYWN0aXZlX2NhY2hlW3Bvc10pOworCQkJCWlmICgoZW50LT5sZW4gPCBsZW4pICYmCisJCQkJICAgICFzdHJuY21wKGFjdGl2ZV9jYWNoZVtwb3NdLT5uYW1lLAorCQkJCQkgICAgIGVudC0+bmFtZSwgZW50LT5sZW4pICYmCisJCQkJICAgIGFjdGl2ZV9jYWNoZVtwb3NdLT5uYW1lW2VudC0+bGVuXSA9PSAnLycpCisJCQkJCWtpbGxlZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoMCA8PSBjYWNoZV9uYW1lX3BvcyhlbnQtPm5hbWUsIHNwIC0gZW50LT5uYW1lKSkgeworCQkJCS8qIElmIGFueSBvZiB0aGUgbGVhZGluZyBkaXJlY3RvcmllcyBpbgorCQkJCSAqIGVudC0+bmFtZSBpcyByZWdpc3RlcmVkIGluIHRoZSBjYWNoZSwKKwkJCQkgKiBlbnQtPm5hbWUgd2lsbCBiZSBraWxsZWQuCisJCQkJICovCisJCQkJa2lsbGVkID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoa2lsbGVkKQorCQkJc2hvd19kaXJfZW50cnkodGFnX2tpbGxlZCwgZGlyLT5lbnRyaWVzW2ldKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfY2VfZW50cnkoY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlKQoreworCWludCBsZW4gPSBwcmVmaXhfbGVuOworCWludCBvZmZzZXQgPSBwcmVmaXhfb2Zmc2V0OworCisJaWYgKGxlbiA+PSBjZV9uYW1lbGVuKGNlKSkKKwkJZGllKCJnaXQtbHMtZmlsZXM6IGludGVybmFsIGVycm9yIC0gY2FjaGUgZW50cnkgbm90IHN1cGVyc2V0IG9mIHByZWZpeCIpOworCisJaWYgKHBhdGhzcGVjICYmICFwYXRoc3BlY19tYXRjaChwYXRoc3BlYywgcHNfbWF0Y2hlZCwgY2UtPm5hbWUsIGxlbikpCisJCXJldHVybjsKKworCWlmICh0YWcgJiYgKnRhZyAmJiBzaG93X3ZhbGlkX2JpdCAmJgorCSAgICAoY2UtPmNlX2ZsYWdzICYgQ0VfVkFMSUQpKSB7CisJCXN0YXRpYyBjaGFyIGFsdHRhZ1s0XTsKKwkJbWVtY3B5KGFsdHRhZywgdGFnLCAzKTsKKwkJaWYgKGlzYWxwaGEodGFnWzBdKSkKKwkJCWFsdHRhZ1swXSA9IHRvbG93ZXIodGFnWzBdKTsKKwkJZWxzZSBpZiAodGFnWzBdID09ICc/JykKKwkJCWFsdHRhZ1swXSA9ICchJzsKKwkJZWxzZSB7CisJCQlhbHR0YWdbMF0gPSAndic7CisJCQlhbHR0YWdbMV0gPSB0YWdbMF07CisJCQlhbHR0YWdbMl0gPSAnICc7CisJCQlhbHR0YWdbM10gPSAwOworCQl9CisJCXRhZyA9IGFsdHRhZzsKKwl9CisKKwlpZiAoIXNob3dfc3RhZ2UpIHsKKwkJZnB1dHModGFnLCBzdGRvdXQpOworCX0gZWxzZSB7CisJCXByaW50ZigiJXMlMDZvICVzICVkXHQiLAorCQkgICAgICAgdGFnLAorCQkgICAgICAgY2UtPmNlX21vZGUsCisJCSAgICAgICBhYmJyZXYgPyBmaW5kX3VuaXF1ZV9hYmJyZXYoY2UtPnNoYTEsYWJicmV2KQorCQkJCTogc2hhMV90b19oZXgoY2UtPnNoYTEpLAorCQkgICAgICAgY2Vfc3RhZ2UoY2UpKTsKKwl9CisJd3JpdGVfbmFtZV9xdW90ZWQoY2UtPm5hbWUgKyBvZmZzZXQsIHN0ZG91dCwgbGluZV90ZXJtaW5hdG9yKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19maWxlcyhzdHJ1Y3QgZGlyX3N0cnVjdCAqZGlyLCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGk7CisKKwkvKiBGb3IgY2FjaGVkL2RlbGV0ZWQgZmlsZXMgd2UgZG9uJ3QgbmVlZCB0byBldmVuIGRvIHRoZSByZWFkZGlyICovCisJaWYgKHNob3dfb3RoZXJzIHx8IHNob3dfa2lsbGVkKSB7CisJCWNvbnN0IGNoYXIgKnBhdGggPSAiLiIsICpiYXNlID0gIiI7CisJCWludCBiYXNlbGVuID0gcHJlZml4X2xlbjsKKworCQlpZiAoYmFzZWxlbikKKwkJCXBhdGggPSBiYXNlID0gcHJlZml4OworCQlyZWFkX2RpcmVjdG9yeShkaXIsIHBhdGgsIGJhc2UsIGJhc2VsZW4sIHBhdGhzcGVjKTsKKwkJaWYgKHNob3dfb3RoZXJzKQorCQkJc2hvd19vdGhlcl9maWxlcyhkaXIpOworCQlpZiAoc2hvd19raWxsZWQpCisJCQlzaG93X2tpbGxlZF9maWxlcyhkaXIpOworCX0KKwlpZiAoc2hvd19jYWNoZWQgfCBzaG93X3N0YWdlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBhY3RpdmVfbnI7IGkrKykgeworCQkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtpXTsKKwkJCWludCBkdHlwZSA9IGNlX3RvX2R0eXBlKGNlKTsKKwkJCWlmIChleGNsdWRlZChkaXIsIGNlLT5uYW1lLCAmZHR5cGUpICE9IGRpci0+c2hvd19pZ25vcmVkKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHNob3dfdW5tZXJnZWQgJiYgIWNlX3N0YWdlKGNlKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChjZS0+Y2VfZmxhZ3MgJiBDRV9VUERBVEUpCisJCQkJY29udGludWU7CisJCQlzaG93X2NlX2VudHJ5KGNlX3N0YWdlKGNlKSA/IHRhZ191bm1lcmdlZCA6IHRhZ19jYWNoZWQsIGNlKTsKKwkJfQorCX0KKwlpZiAoc2hvd19kZWxldGVkIHwgc2hvd19tb2RpZmllZCkgeworCQlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yOyBpKyspIHsKKwkJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJCWludCBlcnI7CisJCQlpbnQgZHR5cGUgPSBjZV90b19kdHlwZShjZSk7CisJCQlpZiAoZXhjbHVkZWQoZGlyLCBjZS0+bmFtZSwgJmR0eXBlKSAhPSBkaXItPnNob3dfaWdub3JlZCkKKwkJCQljb250aW51ZTsKKwkJCWVyciA9IGxzdGF0KGNlLT5uYW1lLCAmc3QpOworCQkJaWYgKHNob3dfZGVsZXRlZCAmJiBlcnIpCisJCQkJc2hvd19jZV9lbnRyeSh0YWdfcmVtb3ZlZCwgY2UpOworCQkJaWYgKHNob3dfbW9kaWZpZWQgJiYgY2VfbW9kaWZpZWQoY2UsICZzdCwgMCkpCisJCQkJc2hvd19jZV9lbnRyeSh0YWdfbW9kaWZpZWQsIGNlKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFBydW5lIHRoZSBpbmRleCB0byBvbmx5IGNvbnRhaW4gc3R1ZmYgc3RhcnRpbmcgd2l0aCAicHJlZml4IgorICovCitzdGF0aWMgdm9pZCBwcnVuZV9jYWNoZShjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IHBvcyA9IGNhY2hlX25hbWVfcG9zKHByZWZpeCwgcHJlZml4X2xlbik7CisJdW5zaWduZWQgaW50IGZpcnN0LCBsYXN0OworCisJaWYgKHBvcyA8IDApCisJCXBvcyA9IC1wb3MtMTsKKwltZW1tb3ZlKGFjdGl2ZV9jYWNoZSwgYWN0aXZlX2NhY2hlICsgcG9zLAorCQkoYWN0aXZlX25yIC0gcG9zKSAqIHNpemVvZihzdHJ1Y3QgY2FjaGVfZW50cnkgKikpOworCWFjdGl2ZV9uciAtPSBwb3M7CisJZmlyc3QgPSAwOworCWxhc3QgPSBhY3RpdmVfbnI7CisJd2hpbGUgKGxhc3QgPiBmaXJzdCkgeworCQlpbnQgbmV4dCA9IChsYXN0ICsgZmlyc3QpID4+IDE7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbbmV4dF07CisJCWlmICghc3RybmNtcChjZS0+bmFtZSwgcHJlZml4LCBwcmVmaXhfbGVuKSkgeworCQkJZmlyc3QgPSBuZXh0KzE7CisJCQljb250aW51ZTsKKwkJfQorCQlsYXN0ID0gbmV4dDsKKwl9CisJYWN0aXZlX25yID0gbGFzdDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnZlcmlmeV9wYXRoc3BlYyhjb25zdCBjaGFyICpwcmVmaXgpCit7CisJY29uc3QgY2hhciAqKnAsICpuLCAqcHJldjsKKwl1bnNpZ25lZCBsb25nIG1heDsKKworCXByZXYgPSBOVUxMOworCW1heCA9IFBBVEhfTUFYOworCWZvciAocCA9IHBhdGhzcGVjOyAobiA9ICpwKSAhPSBOVUxMOyBwKyspIHsKKwkJaW50IGksIGxlbiA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgeworCQkJY2hhciBjID0gbltpXTsKKwkJCWlmIChwcmV2ICYmIHByZXZbaV0gIT0gYykKKwkJCQlicmVhazsKKwkJCWlmICghYyB8fCBjID09ICcqJyB8fCBjID09ICc/JykKKwkJCQlicmVhazsKKwkJCWlmIChjID09ICcvJykKKwkJCQlsZW4gPSBpKzE7CisJCX0KKwkJcHJldiA9IG47CisJCWlmIChsZW4gPCBtYXgpIHsKKwkJCW1heCA9IGxlbjsKKwkJCWlmICghbWF4KQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHByZWZpeF9vZmZzZXQgPiBtYXggfHwgbWVtY21wKHByZXYsIHByZWZpeCwgcHJlZml4X29mZnNldCkpCisJCWRpZSgiZ2l0LWxzLWZpbGVzOiBjYW5ub3QgZ2VuZXJhdGUgcmVsYXRpdmUgZmlsZW5hbWVzIGNvbnRhaW5pbmcgJy4uJyIpOworCisJcHJlZml4X2xlbiA9IG1heDsKKwlyZXR1cm4gbWF4ID8geG1lbWR1cHoocHJldiwgbWF4KSA6IE5VTEw7Cit9CisKKy8qCisgKiBSZWFkIHRoZSB0cmVlIHNwZWNpZmllZCB3aXRoIC0td2l0aC10cmVlIG9wdGlvbgorICogKHR5cGljYWxseSwgSEVBRCkgaW50byBzdGFnZSAjMSBhbmQgdGhlbgorICogc3F1YXNoIHRoZW0gZG93biB0byBzdGFnZSAjMC4gIFRoaXMgaXMgdXNlZCBmb3IKKyAqIC0tZXJyb3ItdW5tYXRjaCB0byBsaXN0IGFuZCBjaGVjayB0aGUgcGF0aCBwYXR0ZXJucworICogdGhhdCB3ZXJlIGdpdmVuIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gIFdlIGFyZSBub3QKKyAqIGdvaW5nIHRvIHdyaXRlIHRoaXMgaW5kZXggb3V0LgorICovCit2b2lkIG92ZXJsYXlfdHJlZV9vbl9jYWNoZShjb25zdCBjaGFyICp0cmVlX25hbWUsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgdHJlZSAqdHJlZTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWNvbnN0IGNoYXIgKiptYXRjaDsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmxhc3Rfc3RhZ2UwID0gTlVMTDsKKwlpbnQgaTsKKworCWlmIChnZXRfc2hhMSh0cmVlX25hbWUsIHNoYTEpKQorCQlkaWUoInRyZWUtaXNoICVzIG5vdCBmb3VuZC4iLCB0cmVlX25hbWUpOworCXRyZWUgPSBwYXJzZV90cmVlX2luZGlyZWN0KHNoYTEpOworCWlmICghdHJlZSkKKwkJZGllKCJiYWQgdHJlZS1pc2ggJXMiLCB0cmVlX25hbWUpOworCisJLyogSG9pc3QgdGhlIHVubWVyZ2VkIGVudHJpZXMgdXAgdG8gc3RhZ2UgIzMgdG8gbWFrZSByb29tICovCisJZm9yIChpID0gMDsgaSA8IGFjdGl2ZV9ucjsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCWlmICghY2Vfc3RhZ2UoY2UpKQorCQkJY29udGludWU7CisJCWNlLT5jZV9mbGFncyB8PSBDRV9TVEFHRU1BU0s7CisJfQorCisJaWYgKHByZWZpeCkgeworCQlzdGF0aWMgY29uc3QgY2hhciAqKG1hdGNoYnVmWzJdKTsKKwkJbWF0Y2hidWZbMF0gPSBwcmVmaXg7CisJCW1hdGNoYnVmIFsxXSA9IE5VTEw7CisJCW1hdGNoID0gbWF0Y2hidWY7CisJfSBlbHNlCisJCW1hdGNoID0gTlVMTDsKKwlpZiAocmVhZF90cmVlKHRyZWUsIDEsIG1hdGNoKSkKKwkJZGllKCJ1bmFibGUgdG8gcmVhZCB0cmVlIGVudHJpZXMgJXMiLCB0cmVlX25hbWUpOworCisJZm9yIChpID0gMDsgaSA8IGFjdGl2ZV9ucjsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCXN3aXRjaCAoY2Vfc3RhZ2UoY2UpKSB7CisJCWNhc2UgMDoKKwkJCWxhc3Rfc3RhZ2UwID0gY2U7CisJCQkvKiBmYWxsdGhydSAqLworCQlkZWZhdWx0OgorCQkJY29udGludWU7CisJCWNhc2UgMToKKwkJCS8qCisJCQkgKiBJZiB0aGVyZSBpcyBzdGFnZSAjMCBlbnRyeSBmb3IgdGhpcywgd2UgZG8gbm90CisJCQkgKiBuZWVkIHRvIHNob3cgaXQuICBXZSB1c2UgQ0VfVVBEQVRFIGJpdCB0byBtYXJrCisJCQkgKiBzdWNoIGFuIGVudHJ5LgorCQkJICovCisJCQlpZiAobGFzdF9zdGFnZTAgJiYKKwkJCSAgICAhc3RyY21wKGxhc3Rfc3RhZ2UwLT5uYW1lLCBjZS0+bmFtZSkpCisJCQkJY2UtPmNlX2ZsYWdzIHw9IENFX1VQREFURTsKKwkJfQorCX0KK30KKworaW50IHJlcG9ydF9wYXRoX2Vycm9yKGNvbnN0IGNoYXIgKnBzX21hdGNoZWQsIGNvbnN0IGNoYXIgKipwYXRoc3BlYywgaW50IHByZWZpeF9vZmZzZXQpCit7CisJLyoKKwkgKiBNYWtlIHN1cmUgYWxsIHBhdGhzcGVjIG1hdGNoZWQ7IG90aGVyd2lzZSBpdCBpcyBhbiBlcnJvci4KKwkgKi8KKwlpbnQgbnVtLCBlcnJvcnMgPSAwOworCWZvciAobnVtID0gMDsgcGF0aHNwZWNbbnVtXTsgbnVtKyspIHsKKwkJaW50IG90aGVyLCBmb3VuZF9kdXA7CisKKwkJaWYgKHBzX21hdGNoZWRbbnVtXSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBUaGUgY2FsbGVyIG1pZ2h0IGhhdmUgZmVkIGlkZW50aWNhbCBwYXRoc3BlYworCQkgKiB0d2ljZS4gIERvIG5vdCBiYXJmIG9uIHN1Y2ggYSBtaXN0YWtlLgorCQkgKi8KKwkJZm9yIChmb3VuZF9kdXAgPSBvdGhlciA9IDA7CisJCSAgICAgIWZvdW5kX2R1cCAmJiBwYXRoc3BlY1tvdGhlcl07CisJCSAgICAgb3RoZXIrKykgeworCQkJaWYgKG90aGVyID09IG51bSB8fCAhcHNfbWF0Y2hlZFtvdGhlcl0pCisJCQkJY29udGludWU7CisJCQlpZiAoIXN0cmNtcChwYXRoc3BlY1tvdGhlcl0sIHBhdGhzcGVjW251bV0pKQorCQkJCS8qCisJCQkJICogT2ssIHdlIGhhdmUgYSBtYXRjaCBhbHJlYWR5LgorCQkJCSAqLworCQkJCWZvdW5kX2R1cCA9IDE7CisJCX0KKwkJaWYgKGZvdW5kX2R1cCkKKwkJCWNvbnRpbnVlOworCisJCWVycm9yKCJwYXRoc3BlYyAnJXMnIGRpZCBub3QgbWF0Y2ggYW55IGZpbGUocykga25vd24gdG8gZ2l0LiIsCisJCSAgICAgIHBhdGhzcGVjW251bV0gKyBwcmVmaXhfb2Zmc2V0KTsKKwkJZXJyb3JzKys7CisJfQorCXJldHVybiBlcnJvcnM7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGxzX2ZpbGVzX3VzYWdlW10gPQorCSJnaXQtbHMtZmlsZXMgWy16XSBbLXRdIFstdl0gKC0tW2NhY2hlZHxkZWxldGVkfG90aGVyc3xzdGFnZXx1bm1lcmdlZHxraWxsZWR8bW9kaWZpZWRdKSogIgorCSJbIC0taWdub3JlZCBdIFstLWV4Y2x1ZGU9PHBhdHRlcm4+XSBbLS1leGNsdWRlLWZyb209PGZpbGU+XSAiCisJIlsgLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9PGZpbGVuYW1lPiBdIFstLWV4Y2x1ZGUtc3RhbmRhcmRdICIKKwkiWy0tZnVsbC1uYW1lXSBbLS1hYmJyZXZdIFstLV0gWzxmaWxlPl0qIjsKKworaW50IGNtZF9sc19maWxlcyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaTsKKwlpbnQgZXhjX2dpdmVuID0gMCwgcmVxdWlyZV93b3JrX3RyZWUgPSAwOworCXN0cnVjdCBkaXJfc3RydWN0IGRpcjsKKworCW1lbXNldCgmZGlyLCAwLCBzaXplb2YoZGlyKSk7CisJaWYgKHByZWZpeCkKKwkJcHJlZml4X29mZnNldCA9IHN0cmxlbihwcmVmaXgpOworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoIXN0cmNtcChhcmcsICItLSIpKSB7CisJCQlpKys7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICIteiIpKSB7CisJCQlsaW5lX3Rlcm1pbmF0b3IgPSAwOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXQiKSB8fCAhc3RyY21wKGFyZywgIi12IikpIHsKKwkJCXRhZ19jYWNoZWQgPSAiSCAiOworCQkJdGFnX3VubWVyZ2VkID0gIk0gIjsKKwkJCXRhZ19yZW1vdmVkID0gIlIgIjsKKwkJCXRhZ19tb2RpZmllZCA9ICJDICI7CisJCQl0YWdfb3RoZXIgPSAiPyAiOworCQkJdGFnX2tpbGxlZCA9ICJLICI7CisJCQlpZiAoYXJnWzFdID09ICd2JykKKwkJCQlzaG93X3ZhbGlkX2JpdCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItYyIpIHx8ICFzdHJjbXAoYXJnLCAiLS1jYWNoZWQiKSkgeworCQkJc2hvd19jYWNoZWQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLWQiKSB8fCAhc3RyY21wKGFyZywgIi0tZGVsZXRlZCIpKSB7CisJCQlzaG93X2RlbGV0ZWQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLW0iKSB8fCAhc3RyY21wKGFyZywgIi0tbW9kaWZpZWQiKSkgeworCQkJc2hvd19tb2RpZmllZCA9IDE7CisJCQlyZXF1aXJlX3dvcmtfdHJlZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItbyIpIHx8ICFzdHJjbXAoYXJnLCAiLS1vdGhlcnMiKSkgeworCQkJc2hvd19vdGhlcnMgPSAxOworCQkJcmVxdWlyZV93b3JrX3RyZWUgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLWkiKSB8fCAhc3RyY21wKGFyZywgIi0taWdub3JlZCIpKSB7CisJCQlkaXIuc2hvd19pZ25vcmVkID0gMTsKKwkJCXJlcXVpcmVfd29ya190cmVlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1zIikgfHwgIXN0cmNtcChhcmcsICItLXN0YWdlIikpIHsKKwkJCXNob3dfc3RhZ2UgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLWsiKSB8fCAhc3RyY21wKGFyZywgIi0ta2lsbGVkIikpIHsKKwkJCXNob3dfa2lsbGVkID0gMTsKKwkJCXJlcXVpcmVfd29ya190cmVlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tZGlyZWN0b3J5IikpIHsKKwkJCWRpci5zaG93X290aGVyX2RpcmVjdG9yaWVzID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tbm8tZW1wdHktZGlyZWN0b3J5IikpIHsKKwkJCWRpci5oaWRlX2VtcHR5X2RpcmVjdG9yaWVzID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi11IikgfHwgIXN0cmNtcChhcmcsICItLXVubWVyZ2VkIikpIHsKKwkJCS8qIFRoZXJlJ3Mgbm8gcG9pbnQgaW4gc2hvd2luZyB1bm1lcmdlZCB1bmxlc3MKKwkJCSAqIHlvdSBhbHNvIHNob3cgdGhlIHN0YWdlIGluZm9ybWF0aW9uLgorCQkJICovCisJCQlzaG93X3N0YWdlID0gMTsKKwkJCXNob3dfdW5tZXJnZWQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXgiKSAmJiBpKzEgPCBhcmdjKSB7CisJCQlleGNfZ2l2ZW4gPSAxOworCQkJYWRkX2V4Y2x1ZGUoYXJndlsrK2ldLCAiIiwgMCwgJmRpci5leGNsdWRlX2xpc3RbRVhDX0NNRExdKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tZXhjbHVkZT0iKSkgeworCQkJZXhjX2dpdmVuID0gMTsKKwkJCWFkZF9leGNsdWRlKGFyZysxMCwgIiIsIDAsICZkaXIuZXhjbHVkZV9saXN0W0VYQ19DTURMXSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItWCIpICYmIGkrMSA8IGFyZ2MpIHsKKwkJCWV4Y19naXZlbiA9IDE7CisJCQlhZGRfZXhjbHVkZXNfZnJvbV9maWxlKCZkaXIsIGFyZ3ZbKytpXSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItLWV4Y2x1ZGUtZnJvbT0iKSkgeworCQkJZXhjX2dpdmVuID0gMTsKKwkJCWFkZF9leGNsdWRlc19mcm9tX2ZpbGUoJmRpciwgYXJnKzE1KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PSIpKSB7CisJCQlleGNfZ2l2ZW4gPSAxOworCQkJZGlyLmV4Y2x1ZGVfcGVyX2RpciA9IGFyZyArIDI0OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1leGNsdWRlLXN0YW5kYXJkIikpIHsKKwkJCWV4Y19naXZlbiA9IDE7CisJCQlzZXR1cF9zdGFuZGFyZF9leGNsdWRlcygmZGlyKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tZnVsbC1uYW1lIikpIHsKKwkJCXByZWZpeF9vZmZzZXQgPSAwOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1lcnJvci11bm1hdGNoIikpIHsKKwkJCWVycm9yX3VubWF0Y2ggPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS13aXRoLXRyZWU9IikpIHsKKwkJCXdpdGhfdHJlZSA9IGFyZyArIDEyOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1hYmJyZXY9IikpIHsKKwkJCWFiYnJldiA9IHN0cnRvdWwoYXJnKzksIE5VTEwsIDEwKTsKKwkJCWlmIChhYmJyZXYgJiYgYWJicmV2IDwgTUlOSU1VTV9BQkJSRVYpCisJCQkJYWJicmV2ID0gTUlOSU1VTV9BQkJSRVY7CisJCQllbHNlIGlmIChhYmJyZXYgPiA0MCkKKwkJCQlhYmJyZXYgPSA0MDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tYWJicmV2IikpIHsKKwkJCWFiYnJldiA9IERFRkFVTFRfQUJCUkVWOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCphcmcgPT0gJy0nKQorCQkJdXNhZ2UobHNfZmlsZXNfdXNhZ2UpOworCQlicmVhazsKKwl9CisKKwlpZiAocmVxdWlyZV93b3JrX3RyZWUgJiYgIWlzX2luc2lkZV93b3JrX3RyZWUoKSkKKwkJc2V0dXBfd29ya190cmVlKCk7CisKKwlwYXRoc3BlYyA9IGdldF9wYXRoc3BlYyhwcmVmaXgsIGFyZ3YgKyBpKTsKKworCS8qIFZlcmlmeSB0aGF0IHRoZSBwYXRoc3BlYyBtYXRjaGVzIHRoZSBwcmVmaXggKi8KKwlpZiAocGF0aHNwZWMpCisJCXByZWZpeCA9IHZlcmlmeV9wYXRoc3BlYyhwcmVmaXgpOworCisJLyogVHJlYXQgdW5tYXRjaGluZyBwYXRoc3BlYyBlbGVtZW50cyBhcyBlcnJvcnMgKi8KKwlpZiAocGF0aHNwZWMgJiYgZXJyb3JfdW5tYXRjaCkgeworCQlpbnQgbnVtOworCQlmb3IgKG51bSA9IDA7IHBhdGhzcGVjW251bV07IG51bSsrKQorCQkJOworCQlwc19tYXRjaGVkID0geGNhbGxvYygxLCBudW0pOworCX0KKworCWlmIChkaXIuc2hvd19pZ25vcmVkICYmICFleGNfZ2l2ZW4pIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogLS1pZ25vcmVkIG5lZWRzIHNvbWUgZXhjbHVkZSBwYXR0ZXJuXG4iLAorCQkJYXJndlswXSk7CisJCWV4aXQoMSk7CisJfQorCisJLyogV2l0aCBubyBmbGFncywgd2UgZGVmYXVsdCB0byBzaG93aW5nIHRoZSBjYWNoZWQgZmlsZXMgKi8KKwlpZiAoIShzaG93X3N0YWdlIHwgc2hvd19kZWxldGVkIHwgc2hvd19vdGhlcnMgfCBzaG93X3VubWVyZ2VkIHwKKwkgICAgICBzaG93X2tpbGxlZCB8IHNob3dfbW9kaWZpZWQpKQorCQlzaG93X2NhY2hlZCA9IDE7CisKKwlyZWFkX2NhY2hlKCk7CisJaWYgKHByZWZpeCkKKwkJcHJ1bmVfY2FjaGUocHJlZml4KTsKKwlpZiAod2l0aF90cmVlKSB7CisJCS8qCisJCSAqIEJhc2ljIHNhbml0eSBjaGVjazsgc2hvdy1zdGFnZXMgYW5kIHNob3ctdW5tZXJnZWQKKwkJICogd291bGQgbm90IG1ha2UgYW55IHNlbnNlIHdpdGggdGhpcyBvcHRpb24uCisJCSAqLworCQlpZiAoc2hvd19zdGFnZSB8fCBzaG93X3VubWVyZ2VkKQorCQkJZGllKCJscy1maWxlcyAtLXdpdGgtdHJlZSBpcyBpbmNvbXBhdGlibGUgd2l0aCAtcyBvciAtdSIpOworCQlvdmVybGF5X3RyZWVfb25fY2FjaGUod2l0aF90cmVlLCBwcmVmaXgpOworCX0KKwlzaG93X2ZpbGVzKCZkaXIsIHByZWZpeCk7CisKKwlpZiAocHNfbWF0Y2hlZCkgeworCQlpbnQgYmFkOworCQliYWQgPSByZXBvcnRfcGF0aF9lcnJvcihwc19tYXRjaGVkLCBwYXRoc3BlYywgcHJlZml4X29mZnNldCk7CisJCWlmIChiYWQpCisJCQlmcHJpbnRmKHN0ZGVyciwgIkRpZCB5b3UgZm9yZ2V0IHRvICdnaXQgYWRkJz9cbiIpOworCisJCXJldHVybiBiYWQgPyAxIDogMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tbHMtcmVtb3RlLmMgYi9idWlsdGluLWxzLXJlbW90ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YWI4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWxzLXJlbW90ZS5jCkBAIC0wLDAgKzEsMTA3IEBACisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAidHJhbnNwb3J0LmgiCisjaW5jbHVkZSAicmVtb3RlLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGxzX3JlbW90ZV91c2FnZVtdID0KKyJnaXQtbHMtcmVtb3RlIFstLXVwbG9hZC1wYWNrPTxnaXQtdXBsb2FkLXBhY2s+XSBbPGhvc3Q+Ol08ZGlyZWN0b3J5PiI7CisKKy8qCisgKiBJcyB0aGVyZSBvbmUgYW1vbmcgdGhlIGxpc3Qgb2YgcGF0dGVybnMgdGhhdCBtYXRjaCB0aGUgdGFpbCBwYXJ0CisgKiBvZiB0aGUgcGF0aD8KKyAqLworc3RhdGljIGludCB0YWlsX21hdGNoKGNvbnN0IGNoYXIgKipwYXR0ZXJuLCBjb25zdCBjaGFyICpwYXRoKQoreworCWNvbnN0IGNoYXIgKnA7CisJY2hhciBwYXRoYnVmW1BBVEhfTUFYXTsKKworCWlmICghcGF0dGVybikKKwkJcmV0dXJuIDE7IC8qIG5vIHJlc3RyaWN0aW9uICovCisKKwlpZiAoc25wcmludGYocGF0aGJ1Ziwgc2l6ZW9mKHBhdGhidWYpLCAiLyVzIiwgcGF0aCkgPiBzaXplb2YocGF0aGJ1ZikpCisJCXJldHVybiBlcnJvcigiaW5zYW5lbHkgbG9uZyByZWYgJS4qcy4uLiIsIDIwLCBwYXRoKTsKKwl3aGlsZSAoKHAgPSAqKHBhdHRlcm4rKykpICE9IE5VTEwpIHsKKwkJaWYgKCFmbm1hdGNoKHAsIHBhdGhidWYsIDApKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitpbnQgY21kX2xzX3JlbW90ZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaTsKKwljb25zdCBjaGFyICpkZXN0ID0gTlVMTDsKKwlpbnQgbm9uZ2l0OworCXVuc2lnbmVkIGZsYWdzID0gMDsKKwljb25zdCBjaGFyICp1cGxvYWRwYWNrID0gTlVMTDsKKwljb25zdCBjaGFyICoqcGF0dGVybiA9IE5VTEw7CisKKwlzdHJ1Y3QgcmVtb3RlICpyZW1vdGU7CisJc3RydWN0IHRyYW5zcG9ydCAqdHJhbnNwb3J0OworCWNvbnN0IHN0cnVjdCByZWYgKnJlZjsKKworCXNldHVwX2dpdF9kaXJlY3RvcnlfZ2VudGx5KCZub25naXQpOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCisJCWlmICgqYXJnID09ICctJykgeworCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS11cGxvYWQtcGFjaz0iKSkgeworCQkJCXVwbG9hZHBhY2sgPSBhcmcgKyAxNDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcHJlZml4Y21wKGFyZywgIi0tZXhlYz0iKSkgeworCQkJCXVwbG9hZHBhY2sgPSBhcmcgKyA3OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoIi0tdGFncyIsIGFyZykgfHwgIXN0cmNtcCgiLXQiLCBhcmcpKSB7CisJCQkJZmxhZ3MgfD0gUkVGX1RBR1M7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcCgiLS1oZWFkcyIsIGFyZykgfHwgIXN0cmNtcCgiLWgiLCBhcmcpKSB7CisJCQkJZmxhZ3MgfD0gUkVGX0hFQURTOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoIi0tcmVmcyIsIGFyZykpIHsKKwkJCQlmbGFncyB8PSBSRUZfTk9STUFMOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJdXNhZ2UobHNfcmVtb3RlX3VzYWdlKTsKKwkJfQorCQlkZXN0ID0gYXJnOworCQlpKys7CisJCWJyZWFrOworCX0KKworCWlmICghZGVzdCkKKwkJdXNhZ2UobHNfcmVtb3RlX3VzYWdlKTsKKworCWlmIChhcmd2W2ldKSB7CisJCWludCBqOworCQlwYXR0ZXJuID0geGNhbGxvYyhzaXplb2YoY29uc3QgY2hhciAqKSwgYXJnYyAtIGkgKyAxKTsKKwkJZm9yIChqID0gaTsgaiA8IGFyZ2M7IGorKykgeworCQkJaW50IGxlbiA9IHN0cmxlbihhcmd2W2pdKTsKKwkJCWNoYXIgKnAgPSB4bWFsbG9jKGxlbiArIDMpOworCQkJc3ByaW50ZihwLCAiKi8lcyIsIGFyZ3Zbal0pOworCQkJcGF0dGVybltqIC0gaV0gPSBwOworCQl9CisJfQorCXJlbW90ZSA9IG5vbmdpdCA/IE5VTEwgOiByZW1vdGVfZ2V0KGRlc3QpOworCWlmIChyZW1vdGUgJiYgIXJlbW90ZS0+dXJsX25yKQorCQlkaWUoInJlbW90ZSAlcyBoYXMgbm8gY29uZmlndXJlZCBVUkwiLCBkZXN0KTsKKwl0cmFuc3BvcnQgPSB0cmFuc3BvcnRfZ2V0KHJlbW90ZSwgcmVtb3RlID8gcmVtb3RlLT51cmxbMF0gOiBkZXN0KTsKKwlpZiAodXBsb2FkcGFjayAhPSBOVUxMKQorCQl0cmFuc3BvcnRfc2V0X29wdGlvbih0cmFuc3BvcnQsIFRSQU5TX09QVF9VUExPQURQQUNLLCB1cGxvYWRwYWNrKTsKKworCXJlZiA9IHRyYW5zcG9ydF9nZXRfcmVtb3RlX3JlZnModHJhbnNwb3J0KTsKKwlpZiAodHJhbnNwb3J0X2Rpc2Nvbm5lY3QodHJhbnNwb3J0KSkKKwkJcmV0dXJuIDE7CisJZm9yICggOyByZWY7IHJlZiA9IHJlZi0+bmV4dCkgeworCQlpZiAoIWNoZWNrX3JlZl90eXBlKHJlZiwgZmxhZ3MpKQorCQkJY29udGludWU7CisJCWlmICghdGFpbF9tYXRjaChwYXR0ZXJuLCByZWYtPm5hbWUpKQorCQkJY29udGludWU7CisJCXByaW50ZigiJXMJJXNcbiIsIHNoYTFfdG9faGV4KHJlZi0+b2xkX3NoYTEpLCByZWYtPm5hbWUpOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tbHMtdHJlZS5jIGIvYnVpbHRpbi1scy10cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiZTMzMwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tbHMtdHJlZS5jCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogR0lUIC0gVGhlIGluZm9ybWF0aW9uIG1hbmFnZXIgZnJvbSBoZWxsCisgKgorICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCitzdGF0aWMgaW50IGxpbmVfdGVybWluYXRpb24gPSAnXG4nOworI2RlZmluZSBMU19SRUNVUlNJVkUgMQorI2RlZmluZSBMU19UUkVFX09OTFkgMgorI2RlZmluZSBMU19TSE9XX1RSRUVTIDQKKyNkZWZpbmUgTFNfTkFNRV9PTkxZIDgKKyNkZWZpbmUgTFNfU0hPV19TSVpFIDE2CitzdGF0aWMgaW50IGFiYnJldjsKK3N0YXRpYyBpbnQgbHNfb3B0aW9uczsKK3N0YXRpYyBjb25zdCBjaGFyICoqcGF0aHNwZWM7CitzdGF0aWMgaW50IGNob21wX3ByZWZpeDsKK3N0YXRpYyBjb25zdCBjaGFyICpsc190cmVlX3ByZWZpeDsKKworc3RhdGljIGNvbnN0IGNoYXIgbHNfdHJlZV91c2FnZVtdID0KKwkiZ2l0LWxzLXRyZWUgWy1kXSBbLXJdIFstdF0gWy1sXSBbLXpdIFstLW5hbWUtb25seV0gWy0tbmFtZS1zdGF0dXNdIFstLWZ1bGwtbmFtZV0gWy0tYWJicmV2Wz08bj5dXSA8dHJlZS1pc2g+IFtwYXRoLi4uXSI7CisKK3N0YXRpYyBpbnQgc2hvd19yZWN1cnNpdmUoY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4sIGNvbnN0IGNoYXIgKnBhdGhuYW1lKQoreworCWNvbnN0IGNoYXIgKipzOworCisJaWYgKGxzX29wdGlvbnMgJiBMU19SRUNVUlNJVkUpCisJCXJldHVybiAxOworCisJcyA9IHBhdGhzcGVjOworCWlmICghcykKKwkJcmV0dXJuIDA7CisKKwlmb3IgKDs7KSB7CisJCWNvbnN0IGNoYXIgKnNwZWMgPSAqcysrOworCQlpbnQgbGVuLCBzcGVjbGVuOworCisJCWlmICghc3BlYykKKwkJCXJldHVybiAwOworCQlpZiAoc3RybmNtcChiYXNlLCBzcGVjLCBiYXNlbGVuKSkKKwkJCWNvbnRpbnVlOworCQlsZW4gPSBzdHJsZW4ocGF0aG5hbWUpOworCQlzcGVjICs9IGJhc2VsZW47CisJCXNwZWNsZW4gPSBzdHJsZW4oc3BlYyk7CisJCWlmIChzcGVjbGVuIDw9IGxlbikKKwkJCWNvbnRpbnVlOworCQlpZiAobWVtY21wKHBhdGhuYW1lLCBzcGVjLCBsZW4pKQorCQkJY29udGludWU7CisJCXJldHVybiAxOworCX0KK30KKworc3RhdGljIGludCBzaG93X3RyZWUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4sCisJCSAgICAgY29uc3QgY2hhciAqcGF0aG5hbWUsIHVuc2lnbmVkIG1vZGUsIGludCBzdGFnZSkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwljb25zdCBjaGFyICp0eXBlID0gYmxvYl90eXBlOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCWlmIChTX0lTR0lUTElOSyhtb2RlKSkgeworCQkvKgorCQkgKiBNYXliZSB3ZSB3YW50IHRvIGhhdmUgc29tZSByZWN1cnNpdmUgdmVyc2lvbiBoZXJlPworCQkgKgorCQkgKiBTb21ldGhpbmcgbGlrZToKKwkJICoKKwkJaWYgKHNob3dfc3VicHJvamVjdHMoYmFzZSwgYmFzZWxlbiwgcGF0aG5hbWUpKSB7CisJCQlpZiAoZm9yaygpKSB7CisJCQkJY2hkaXIoYmFzZSk7CisJCQkJZXhlYyBscy10cmVlOworCQkJfQorCQkJd2FpdHBpZCgpOworCQl9CisJCSAqCisJCSAqIC4ub3Igc2ltaWxhci4uCisJCSAqLworCQl0eXBlID0gY29tbWl0X3R5cGU7CisJfSBlbHNlIGlmIChTX0lTRElSKG1vZGUpKSB7CisJCWlmIChzaG93X3JlY3Vyc2l2ZShiYXNlLCBiYXNlbGVuLCBwYXRobmFtZSkpIHsKKwkJCXJldHZhbCA9IFJFQURfVFJFRV9SRUNVUlNJVkU7CisJCQlpZiAoIShsc19vcHRpb25zICYgTFNfU0hPV19UUkVFUykpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQl0eXBlID0gdHJlZV90eXBlOworCX0KKwllbHNlIGlmIChsc19vcHRpb25zICYgTFNfVFJFRV9PTkxZKQorCQlyZXR1cm4gMDsKKworCWlmIChjaG9tcF9wcmVmaXggJiYKKwkgICAgKGJhc2VsZW4gPCBjaG9tcF9wcmVmaXggfHwgbWVtY21wKGxzX3RyZWVfcHJlZml4LCBiYXNlLCBjaG9tcF9wcmVmaXgpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIShsc19vcHRpb25zICYgTFNfTkFNRV9PTkxZKSkgeworCQlpZiAobHNfb3B0aW9ucyAmIExTX1NIT1dfU0laRSkgeworCQkJaWYgKCFzdHJjbXAodHlwZSwgYmxvYl90eXBlKSkgeworCQkJCXNoYTFfb2JqZWN0X2luZm8oc2hhMSwgJnNpemUpOworCQkJCXByaW50ZigiJTA2byAlcyAlcyAlN2x1XHQiLCBtb2RlLCB0eXBlLAorCQkJCSAgICAgICBhYmJyZXYgPyBmaW5kX3VuaXF1ZV9hYmJyZXYoc2hhMSwgYWJicmV2KQorCQkJCSAgICAgICAgICAgICAgOiBzaGExX3RvX2hleChzaGExKSwKKwkJCQkgICAgICAgc2l6ZSk7CisJCQl9IGVsc2UKKwkJCQlwcmludGYoIiUwNm8gJXMgJXMgJTdjXHQiLCBtb2RlLCB0eXBlLAorCQkJCSAgICAgICBhYmJyZXYgPyBmaW5kX3VuaXF1ZV9hYmJyZXYoc2hhMSwgYWJicmV2KQorCQkJCSAgICAgICAgICAgICAgOiBzaGExX3RvX2hleChzaGExKSwKKwkJCQkgICAgICAgJy0nKTsKKwkJfSBlbHNlCisJCQlwcmludGYoIiUwNm8gJXMgJXNcdCIsIG1vZGUsIHR5cGUsCisJCQkgICAgICAgYWJicmV2ID8gZmluZF91bmlxdWVfYWJicmV2KHNoYTEsIGFiYnJldikKKwkJCSAgICAgICAgICAgICAgOiBzaGExX3RvX2hleChzaGExKSk7CisJfQorCXdyaXRlX25hbWVfcXVvdGVkcGZ4KGJhc2UgKyBjaG9tcF9wcmVmaXgsIGJhc2VsZW4gLSBjaG9tcF9wcmVmaXgsCisJCQkgIHBhdGhuYW1lLCBzdGRvdXQsIGxpbmVfdGVybWluYXRpb24pOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBjbWRfbHNfdHJlZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXN0cnVjdCB0cmVlICp0cmVlOworCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCWxzX3RyZWVfcHJlZml4ID0gcHJlZml4OworCWlmIChwcmVmaXggJiYgKnByZWZpeCkKKwkJY2hvbXBfcHJlZml4ID0gc3RybGVuKHByZWZpeCk7CisJd2hpbGUgKDEgPCBhcmdjICYmIGFyZ3ZbMV1bMF0gPT0gJy0nKSB7CisJCXN3aXRjaCAoYXJndlsxXVsxXSkgeworCQljYXNlICd6JzoKKwkJCWxpbmVfdGVybWluYXRpb24gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJbHNfb3B0aW9ucyB8PSBMU19SRUNVUlNJVkU7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlsc19vcHRpb25zIHw9IExTX1RSRUVfT05MWTsKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCWxzX29wdGlvbnMgfD0gTFNfU0hPV19UUkVFUzsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCWxzX29wdGlvbnMgfD0gTFNfU0hPV19TSVpFOworCQkJYnJlYWs7CisJCWNhc2UgJy0nOgorCQkJaWYgKCFzdHJjbXAoYXJndlsxXSsyLCAibmFtZS1vbmx5IikgfHwKKwkJCSAgICAhc3RyY21wKGFyZ3ZbMV0rMiwgIm5hbWUtc3RhdHVzIikpIHsKKwkJCQlsc19vcHRpb25zIHw9IExTX05BTUVfT05MWTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZ3ZbMV0rMiwgImxvbmciKSkgeworCQkJCWxzX29wdGlvbnMgfD0gTFNfU0hPV19TSVpFOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJndlsxXSsyLCAiZnVsbC1uYW1lIikpIHsKKwkJCQljaG9tcF9wcmVmaXggPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFwcmVmaXhjbXAoYXJndlsxXSsyLCAiYWJicmV2PSIpKSB7CisJCQkJYWJicmV2ID0gc3RydG91bChhcmd2WzFdKzksIE5VTEwsIDEwKTsKKwkJCQlpZiAoYWJicmV2ICYmIGFiYnJldiA8IE1JTklNVU1fQUJCUkVWKQorCQkJCQlhYmJyZXYgPSBNSU5JTVVNX0FCQlJFVjsKKwkJCQllbHNlIGlmIChhYmJyZXYgPiA0MCkKKwkJCQkJYWJicmV2ID0gNDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmd2WzFdKzIsICJhYmJyZXYiKSkgeworCQkJCWFiYnJldiA9IERFRkFVTFRfQUJCUkVWOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogb3RoZXJ3aXNlIGZhbGx0aHJ1ICovCisJCWRlZmF1bHQ6CisJCQl1c2FnZShsc190cmVlX3VzYWdlKTsKKwkJfQorCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisJLyogLWQgLXIgc2hvdWxkIGltcGx5IC10LCBidXQgLWQgYnkgaXRzZWxmIHNob3VsZCBub3QgaGF2ZSB0by4gKi8KKwlpZiAoIChMU19UUkVFX09OTFl8TFNfUkVDVVJTSVZFKSA9PQorCSAgICAoKExTX1RSRUVfT05MWXxMU19SRUNVUlNJVkUpICYgbHNfb3B0aW9ucykpCisJCWxzX29wdGlvbnMgfD0gTFNfU0hPV19UUkVFUzsKKworCWlmIChhcmdjIDwgMikKKwkJdXNhZ2UobHNfdHJlZV91c2FnZSk7CisJaWYgKGdldF9zaGExKGFyZ3ZbMV0sIHNoYTEpKQorCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lICVzIiwgYXJndlsxXSk7CisKKwlwYXRoc3BlYyA9IGdldF9wYXRoc3BlYyhwcmVmaXgsIGFyZ3YgKyAyKTsKKwl0cmVlID0gcGFyc2VfdHJlZV9pbmRpcmVjdChzaGExKTsKKwlpZiAoIXRyZWUpCisJCWRpZSgibm90IGEgdHJlZSBvYmplY3QiKTsKKwlyZWFkX3RyZWVfcmVjdXJzaXZlKHRyZWUsICIiLCAwLCAwLCBwYXRoc3BlYywgc2hvd190cmVlKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1tYWlsaW5mby5jIGIvYnVpbHRpbi1tYWlsaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZjE1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLW1haWxpbmZvLmMKQEAgLTAsMCArMSw5ODggQEAKKy8qCisgKiBBbm90aGVyIHN0dXBpZCBwcm9ncmFtLCB0aGlzIG9uZSBwYXJzaW5nIHRoZSBoZWFkZXJzIG9mIGFuCisgKiBlbWFpbCB0byBmaWd1cmUgb3V0IGF1dGhvcnNoaXAgYW5kIHN1YmplY3QKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgInV0ZjguaCIKKworc3RhdGljIEZJTEUgKmNtaXRtc2csICpwYXRjaGZpbGUsICpmaW4sICpmb3V0OworCitzdGF0aWMgaW50IGtlZXBfc3ViamVjdDsKK3N0YXRpYyBjb25zdCBjaGFyICptZXRhaW5mb19jaGFyc2V0Oworc3RhdGljIGNoYXIgbGluZVsxMDAwXTsKK3N0YXRpYyBjaGFyIG5hbWVbMTAwMF07CitzdGF0aWMgY2hhciBlbWFpbFsxMDAwXTsKKworc3RhdGljIGVudW0gIHsKKwlURV9ET05UQ0FSRSwgVEVfUVAsIFRFX0JBU0U2NCwKK30gdHJhbnNmZXJfZW5jb2Rpbmc7CitzdGF0aWMgZW51bSAgeworCVRZUEVfVEVYVCwgVFlQRV9PVEhFUiwKK30gbWVzc2FnZV90eXBlOworCitzdGF0aWMgY2hhciBjaGFyc2V0WzI1Nl07CitzdGF0aWMgaW50IHBhdGNoX2xpbmVzOworc3RhdGljIGNoYXIgKipwX2hkcl9kYXRhLCAqKnNfaGRyX2RhdGE7CisKKyNkZWZpbmUgTUFYX0hEUl9QQVJTRUQgMTAKKyNkZWZpbmUgTUFYX0JPVU5EQVJJRVMgNQorCitzdGF0aWMgY2hhciAqc2FuaXR5X2NoZWNrKGNoYXIgKm5hbWUsIGNoYXIgKmVtYWlsKQoreworCWludCBsZW4gPSBzdHJsZW4obmFtZSk7CisJaWYgKGxlbiA8IDMgfHwgbGVuID4gNjApCisJCXJldHVybiBlbWFpbDsKKwlpZiAoc3RyY2hyKG5hbWUsICdAJykgfHwgc3RyY2hyKG5hbWUsICc8JykgfHwgc3RyY2hyKG5hbWUsICc+JykpCisJCXJldHVybiBlbWFpbDsKKwlyZXR1cm4gbmFtZTsKK30KKworc3RhdGljIGludCBib2d1c19mcm9tKGNoYXIgKmxpbmUpCit7CisJLyogSm9obiBEb2UgPGpvaG5kb2U+ICovCisJY2hhciAqYnJhLCAqa2V0LCAqZHN0LCAqY3A7CisKKwkvKiBUaGlzIGlzIGZhbGxiYWNrLCBzbyBkbyBub3QgYm90aGVyIGlmIHdlIGFscmVhZHkgaGF2ZSBhbgorCSAqIGUtbWFpbCBhZGRyZXNzLgorCSAqLworCWlmICgqZW1haWwpCisJCXJldHVybiAwOworCisJYnJhID0gc3RyY2hyKGxpbmUsICc8Jyk7CisJaWYgKCFicmEpCisJCXJldHVybiAwOworCWtldCA9IHN0cmNocihicmEsICc+Jyk7CisJaWYgKCFrZXQpCisJCXJldHVybiAwOworCisJZm9yIChkc3QgPSBlbWFpbCwgY3AgPSBicmErMTsgY3AgPCBrZXQ7ICkKKwkJKmRzdCsrID0gKmNwKys7CisJKmRzdCA9IDA7CisJZm9yIChjcCA9IGxpbmU7IGlzc3BhY2UoKmNwKTsgY3ArKykKKwkJOworCWZvciAoYnJhLS07IGlzc3BhY2UoKmJyYSk7IGJyYS0tKQorCQkqYnJhID0gMDsKKwljcCA9IHNhbml0eV9jaGVjayhjcCwgZW1haWwpOworCXN0cmNweShuYW1lLCBjcCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2Zyb20oY2hhciAqaW5fbGluZSkKK3sKKwljaGFyIGxpbmVbMTAwMF07CisJY2hhciAqYXQ7CisJY2hhciAqZHN0OworCisJc3RyY3B5KGxpbmUsIGluX2xpbmUpOworCWF0ID0gc3RyY2hyKGxpbmUsICdAJyk7CisJaWYgKCFhdCkKKwkJcmV0dXJuIGJvZ3VzX2Zyb20obGluZSk7CisKKwkvKgorCSAqIElmIHdlIGFscmVhZHkgaGF2ZSBvbmUgZW1haWwsIGRvbid0IHRha2UgYW55IGNvbmZ1c2luZyBsaW5lcworCSAqLworCWlmICgqZW1haWwgJiYgc3RyY2hyKGF0KzEsICdAJykpCisJCXJldHVybiAwOworCisJLyogUGljayB1cCB0aGUgc3RyaW5nIGFyb3VuZCAnQCcsIHBvc3NpYmx5IGRlbGltaXRlZCB3aXRoIDw+CisJICogcGFpcjsgdGhhdCBpcyB0aGUgZW1haWwgcGFydC4gIFdoaXRlIHRoZW0gb3V0IHdoaWxlIGNvcHlpbmcuCisJICovCisJd2hpbGUgKGF0ID4gbGluZSkgeworCQljaGFyIGMgPSBhdFstMV07CisJCWlmIChpc3NwYWNlKGMpKQorCQkJYnJlYWs7CisJCWlmIChjID09ICc8JykgeworCQkJYXRbLTFdID0gJyAnOworCQkJYnJlYWs7CisJCX0KKwkJYXQtLTsKKwl9CisJZHN0ID0gZW1haWw7CisJZm9yICg7OykgeworCQl1bnNpZ25lZCBjaGFyIGMgPSAqYXQ7CisJCWlmICghYyB8fCBjID09ICc+JyB8fCBpc3NwYWNlKGMpKSB7CisJCQlpZiAoYyA9PSAnPicpCisJCQkJKmF0ID0gJyAnOworCQkJYnJlYWs7CisJCX0KKwkJKmF0KysgPSAnICc7CisJCSpkc3QrKyA9IGM7CisJfQorCSpkc3QrKyA9IDA7CisKKwkvKiBUaGUgcmVtYWluZGVyIGlzIG5hbWUuICBJdCBjb3VsZCBiZSAiSm9obiBEb2UgPGpvaG4uZG9lQHh6PiIKKwkgKiBvciAiam9obi5kb2VAeHogKEpvaG4gRG9lKSIsIGJ1dCB3ZSBoYXZlIHdoaXRlZCBvdXQgdGhlCisJICogZW1haWwgcGFydCwgc28gdHJpbSBmcm9tIGJvdGggZW5kcywgcG9zc2libHkgcmVtb3ZpbmcKKwkgKiB0aGUgKCkgcGFpciBhdCB0aGUgZW5kLgorCSAqLworCWF0ID0gbGluZSArIHN0cmxlbihsaW5lKTsKKwl3aGlsZSAoYXQgPiBsaW5lKSB7CisJCXVuc2lnbmVkIGNoYXIgYyA9ICotLWF0OworCQlpZiAoIWlzc3BhY2UoYykpIHsKKwkJCWF0WyhjID09ICcpJykgPyAwIDogMV0gPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlhdCA9IGxpbmU7CisJZm9yICg7OykgeworCQl1bnNpZ25lZCBjaGFyIGMgPSAqYXQ7CisJCWlmICghYyB8fCAhaXNzcGFjZShjKSkgeworCQkJaWYgKGMgPT0gJygnKQorCQkJCWF0Kys7CisJCQlicmVhazsKKwkJfQorCQlhdCsrOworCX0KKwlhdCA9IHNhbml0eV9jaGVjayhhdCwgZW1haWwpOworCXN0cmNweShuYW1lLCBhdCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2hlYWRlcihjaGFyICpsaW5lLCBjaGFyICpkYXRhLCBpbnQgb2ZzKQoreworCWlmICghbGluZSB8fCAhZGF0YSkKKwkJcmV0dXJuIDE7CisKKwlzdHJjcHkoZGF0YSwgbGluZStvZnMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE5PVEUgTk9URSBOT1RFLiAgV2UgZG8gbm90IGNsYWltIHdlIGRvIGZ1bGwgTUlNRS4gIFdlIGp1c3QgYXR0ZW1wdAorICogdG8gaGF2ZSBlbm91Z2ggaGV1cmlzdGljcyB0byBncm9rIE1JTUUgZW5jb2RlZCBwYXRjaGVzIG9mdGVuIGZvdW5kCisgKiBvbiBvdXIgbWFpbGluZyBsaXN0cy4gIEZvciBleGFtcGxlLCB3ZSBkbyBub3QgZXZlbiB0cmVhdCBoZWFkZXIgbGluZXMKKyAqIGNhc2UgaW5zZW5zaXRpdmVseS4KKyAqLworCitzdGF0aWMgaW50IHNsdXJwX2F0dHIoY29uc3QgY2hhciAqbGluZSwgY29uc3QgY2hhciAqbmFtZSwgY2hhciAqYXR0cikKK3sKKwljb25zdCBjaGFyICplbmRzLCAqYXAgPSBzdHJjYXNlc3RyKGxpbmUsIG5hbWUpOworCXNpemVfdCBzejsKKworCWlmICghYXApIHsKKwkJKmF0dHIgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJYXAgKz0gc3RybGVuKG5hbWUpOworCWlmICgqYXAgPT0gJyInKSB7CisJCWFwKys7CisJCWVuZHMgPSAiXCIiOworCX0KKwllbHNlCisJCWVuZHMgPSAiOyBcdCI7CisJc3ogPSBzdHJjc3BuKGFwLCBlbmRzKTsKKwltZW1jcHkoYXR0ciwgYXAsIHN6KTsKKwlhdHRyW3N6XSA9IDA7CisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBjb250ZW50X3R5cGUgeworCWNoYXIgKmJvdW5kYXJ5OworCWludCBib3VuZGFyeV9sZW47Cit9OworCitzdGF0aWMgc3RydWN0IGNvbnRlbnRfdHlwZSBjb250ZW50W01BWF9CT1VOREFSSUVTXTsKKworc3RhdGljIHN0cnVjdCBjb250ZW50X3R5cGUgKmNvbnRlbnRfdG9wID0gY29udGVudDsKKworc3RhdGljIGludCBoYW5kbGVfY29udGVudF90eXBlKGNoYXIgKmxpbmUpCit7CisJY2hhciBib3VuZGFyeVsyNTZdOworCisJaWYgKHN0cmNhc2VzdHIobGluZSwgInRleHQvIikgPT0gTlVMTCkKKwkJIG1lc3NhZ2VfdHlwZSA9IFRZUEVfT1RIRVI7CisJaWYgKHNsdXJwX2F0dHIobGluZSwgImJvdW5kYXJ5PSIsIGJvdW5kYXJ5ICsgMikpIHsKKwkJbWVtY3B5KGJvdW5kYXJ5LCAiLS0iLCAyKTsKKwkJaWYgKGNvbnRlbnRfdG9wKysgPj0gJmNvbnRlbnRbTUFYX0JPVU5EQVJJRVNdKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlRvbyBtYW55IGJvdW5kYXJpZXMgdG8gaGFuZGxlXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJY29udGVudF90b3AtPmJvdW5kYXJ5X2xlbiA9IHN0cmxlbihib3VuZGFyeSk7CisJCWNvbnRlbnRfdG9wLT5ib3VuZGFyeSA9IHhtYWxsb2MoY29udGVudF90b3AtPmJvdW5kYXJ5X2xlbisxKTsKKwkJc3RyY3B5KGNvbnRlbnRfdG9wLT5ib3VuZGFyeSwgYm91bmRhcnkpOworCX0KKwlpZiAoc2x1cnBfYXR0cihsaW5lLCAiY2hhcnNldD0iLCBjaGFyc2V0KSkgeworCQlpbnQgaSwgYzsKKwkJZm9yIChpID0gMDsgKGMgPSBjaGFyc2V0W2ldKSAhPSAwOyBpKyspCisJCQljaGFyc2V0W2ldID0gdG9sb3dlcihjKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2NvbnRlbnRfdHJhbnNmZXJfZW5jb2RpbmcoY2hhciAqbGluZSkKK3sKKwlpZiAoc3RyY2FzZXN0cihsaW5lLCAiYmFzZTY0IikpCisJCXRyYW5zZmVyX2VuY29kaW5nID0gVEVfQkFTRTY0OworCWVsc2UgaWYgKHN0cmNhc2VzdHIobGluZSwgInF1b3RlZC1wcmludGFibGUiKSkKKwkJdHJhbnNmZXJfZW5jb2RpbmcgPSBURV9RUDsKKwllbHNlCisJCXRyYW5zZmVyX2VuY29kaW5nID0gVEVfRE9OVENBUkU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNfbXVsdGlwYXJ0X2JvdW5kYXJ5KGNvbnN0IGNoYXIgKmxpbmUpCit7CisJcmV0dXJuICghbWVtY21wKGxpbmUsIGNvbnRlbnRfdG9wLT5ib3VuZGFyeSwgY29udGVudF90b3AtPmJvdW5kYXJ5X2xlbikpOworfQorCitzdGF0aWMgaW50IGVhdHNwYWNlKGNoYXIgKmxpbmUpCit7CisJaW50IGxlbiA9IHN0cmxlbihsaW5lKTsKKwl3aGlsZSAobGVuID4gMCAmJiBpc3NwYWNlKGxpbmVbbGVuLTFdKSkKKwkJbGluZVstLWxlbl0gPSAwOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBjaGFyICpjbGVhbnVwX3N1YmplY3QoY2hhciAqc3ViamVjdCkKK3sKKwlmb3IgKDs7KSB7CisJCWNoYXIgKnA7CisJCWludCBsZW4sIHJlbW92ZTsKKwkJc3dpdGNoICgqc3ViamVjdCkgeworCQljYXNlICdyJzogY2FzZSAnUic6CisJCQlpZiAoIW1lbWNtcCgiZToiLCBzdWJqZWN0KzEsIDIpKSB7CisJCQkJc3ViamVjdCArPSAzOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJyAnOiBjYXNlICdcdCc6IGNhc2UgJzonOgorCQkJc3ViamVjdCsrOworCQkJY29udGludWU7CisKKwkJY2FzZSAnWyc6CisJCQlwID0gc3RyY2hyKHN1YmplY3QsICddJyk7CisJCQlpZiAoIXApIHsKKwkJCQlzdWJqZWN0Kys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlsZW4gPSBzdHJsZW4ocCk7CisJCQlyZW1vdmUgPSBwIC0gc3ViamVjdDsKKwkJCWlmIChyZW1vdmUgPD0gbGVuICoyKSB7CisJCQkJc3ViamVjdCA9IHArMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWVhdHNwYWNlKHN1YmplY3QpOworCQlyZXR1cm4gc3ViamVjdDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfc3BhY2UoY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGNoYXIgYzsKKwl3aGlsZSAoKGMgPSAqYnVmKSAhPSAwKSB7CisJCWJ1ZisrOworCQlpZiAoaXNzcGFjZShjKSkgeworCQkJYnVmWy0xXSA9ICcgJzsKKwkJCWMgPSAqYnVmOworCQkJd2hpbGUgKGlzc3BhY2UoYykpIHsKKwkJCQlpbnQgbGVuID0gc3RybGVuKGJ1Zik7CisJCQkJbWVtbW92ZShidWYsIGJ1ZisxLCBsZW4pOworCQkJCWMgPSAqYnVmOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfaGVhZGVyKGNoYXIgKml0LCB1bnNpZ25lZCBpdHNpemUpOworc3RhdGljIGNvbnN0IGNoYXIgKmhlYWRlcltNQVhfSERSX1BBUlNFRF0gPSB7CisJIkZyb20iLCJTdWJqZWN0IiwiRGF0ZSIsCit9OworCitzdGF0aWMgaW50IGNoZWNrX2hlYWRlcihjaGFyICpsaW5lLCB1bnNpZ25lZCBsaW5lc2l6ZSwgY2hhciAqKmhkcl9kYXRhLCBpbnQgb3ZlcndyaXRlKQoreworCWludCBpOworCisJLyogc2VhcmNoIGZvciB0aGUgaW50ZXJlc3RpbmcgcGFydHMgKi8KKwlmb3IgKGkgPSAwOyBoZWFkZXJbaV07IGkrKykgeworCQlpbnQgbGVuID0gc3RybGVuKGhlYWRlcltpXSk7CisJCWlmICgoIWhkcl9kYXRhW2ldIHx8IG92ZXJ3cml0ZSkgJiYKKwkJICAgICFzdHJuY2FzZWNtcChsaW5lLCBoZWFkZXJbaV0sIGxlbikgJiYKKwkJICAgIGxpbmVbbGVuXSA9PSAnOicgJiYgaXNzcGFjZShsaW5lW2xlbiArIDFdKSkgeworCQkJLyogVW53cmFwIGlubGluZSBCIGFuZCBRIGVuY29kaW5nLCBhbmQgb3B0aW9uYWxseQorCQkJICogbm9ybWFsaXplIHRoZSBtZXRhIGluZm9ybWF0aW9uIHRvIHV0ZjguCisJCQkgKi8KKwkJCWRlY29kZV9oZWFkZXIobGluZSArIGxlbiArIDIsIGxpbmVzaXplIC0gbGVuIC0gMik7CisJCQloZHJfZGF0YVtpXSA9IHhtYWxsb2MoMTAwMCAqIHNpemVvZihjaGFyKSk7CisJCQlpZiAoISBoYW5kbGVfaGVhZGVyKGxpbmUsIGhkcl9kYXRhW2ldLCBsZW4gKyAyKSkgeworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCisJLyogQ29udGVudCBzdHVmZiAqLworCWlmICghc3RybmNhc2VjbXAobGluZSwgIkNvbnRlbnQtVHlwZSIsIDEyKSAmJgorCQlsaW5lWzEyXSA9PSAnOicgJiYgaXNzcGFjZShsaW5lWzEyICsgMV0pKSB7CisJCWRlY29kZV9oZWFkZXIobGluZSArIDEyICsgMiwgbGluZXNpemUgLSAxMiAtIDIpOworCQlpZiAoISBoYW5kbGVfY29udGVudF90eXBlKGxpbmUpKSB7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlpZiAoIXN0cm5jYXNlY21wKGxpbmUsICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIiwgMjUpICYmCisJCWxpbmVbMjVdID09ICc6JyAmJiBpc3NwYWNlKGxpbmVbMjUgKyAxXSkpIHsKKwkJZGVjb2RlX2hlYWRlcihsaW5lICsgMjUgKyAyLCBsaW5lc2l6ZSAtIDI1IC0gMik7CisJCWlmICghIGhhbmRsZV9jb250ZW50X3RyYW5zZmVyX2VuY29kaW5nKGxpbmUpKSB7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCS8qIGZvciBpbmJvZHkgc3R1ZmYgKi8KKwlpZiAoIW1lbWNtcCgiPkZyb20iLCBsaW5lLCA1KSAmJiBpc3NwYWNlKGxpbmVbNV0pKQorCQlyZXR1cm4gMTsKKwlpZiAoIW1lbWNtcCgiW1BBVENIXSIsIGxpbmUsIDcpICYmIGlzc3BhY2UobGluZVs3XSkpIHsKKwkJZm9yIChpID0gMDsgaGVhZGVyW2ldOyBpKyspIHsKKwkJCWlmICghbWVtY21wKCJTdWJqZWN0OiAiLCBoZWFkZXJbaV0sIDkpKSB7CisJCQkJaWYgKCEgaGFuZGxlX2hlYWRlcihsaW5lLCBoZHJfZGF0YVtpXSwgMCkpIHsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyogbm8gbWF0Y2ggKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc19yZmMyODIyX2hlYWRlcihjaGFyICpsaW5lKQoreworCS8qCisJICogVGhlIHNlY3Rpb24gdGhhdCBkZWZpbmVzIHRoZSBsb29zZXN0IHBvc3NpYmxlCisJICogZmllbGQgbmFtZSBpcyAiMy42LjggT3B0aW9uYWwgZmllbGRzIi4KKwkgKgorCSAqIG9wdGlvbmFsLWZpZWxkID0gZmllbGQtbmFtZSAiOiIgdW5zdHJ1Y3R1cmVkIENSTEYKKwkgKiBmaWVsZC1uYW1lID0gMSpmdGV4dAorCSAqIGZ0ZXh0ID0gJWQzMy01NyAvICU1OS0xMjYKKwkgKi8KKwlpbnQgY2g7CisJY2hhciAqY3AgPSBsaW5lOworCisJLyogQ291bnQgbWJveCBGcm9tIGhlYWRlcnMgYXMgaGVhZGVycyAqLworCWlmICghbWVtY21wKGxpbmUsICJGcm9tICIsIDUpIHx8ICFtZW1jbXAobGluZSwgIj5Gcm9tICIsIDYpKQorCQlyZXR1cm4gMTsKKworCXdoaWxlICgoY2ggPSAqY3ArKykpIHsKKwkJaWYgKGNoID09ICc6JykKKwkJCXJldHVybiBjcCAhPSBsaW5lOworCQlpZiAoKDMzIDw9IGNoICYmIGNoIDw9IDU3KSB8fAorCQkgICAgKDU5IDw9IGNoICYmIGNoIDw9IDEyNikpCisJCQljb250aW51ZTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogc3ogaXMgc2l6ZSBvZiAnbGluZScgYnVmZmVyIGluIGJ5dGVzLiAgTXVzdCBiZSByZWFzb25hYmx5CisgKiBsb25nIGVub3VnaCB0byBob2xkIG9uZSBwaHlzaWNhbCByZWFsLXdvcmxkIGUtbWFpbCBsaW5lLgorICovCitzdGF0aWMgaW50IHJlYWRfb25lX2hlYWRlcl9saW5lKGNoYXIgKmxpbmUsIGludCBzeiwgRklMRSAqaW4pCit7CisJaW50IGxlbjsKKworCS8qCisJICogV2Ugd2lsbCByZWFkIGF0IG1vc3QgKHN6LTEpIGJ5dGVzIGFuZCB0aGVuIHBvdGVudGlhbGx5CisJICogcmUtYWRkIE5VTCBhZnRlciBpdC4gIEFjY2Vzc2luZyBsaW5lW3N6XSBhZnRlciB0aGlzIGlzIHNhZmUKKwkgKiBhbmQgd2UgY2FuIGFsbG93IGxlbiB0byBncm93IHVwIHRvIGFuZCBpbmNsdWRpbmcgc3ouCisJICovCisJc3otLTsKKworCS8qIEdldCB0aGUgZmlyc3QgcGFydCBvZiB0aGUgbGluZS4gKi8KKwlpZiAoIWZnZXRzKGxpbmUsIHN6LCBpbikpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJcyBpdCBhbiBlbXB0eSBsaW5lIG9yIG5vdCBhIHZhbGlkIHJmYzI4MjIgaGVhZGVyPworCSAqIElmIHNvLCBzdG9wIGhlcmUsIGFuZCByZXR1cm4gZmFsc2UgKCJub3QgYSBoZWFkZXIiKQorCSAqLworCWxlbiA9IGVhdHNwYWNlKGxpbmUpOworCWlmICghbGVuIHx8ICFpc19yZmMyODIyX2hlYWRlcihsaW5lKSkgeworCQkvKiBSZS1hZGQgdGhlIG5ld2xpbmUgKi8KKwkJbGluZVtsZW5dID0gJ1xuJzsKKwkJbGluZVtsZW4gKyAxXSA9ICdcMCc7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogTm93IHdlIG5lZWQgdG8gZWF0IGFsbCB0aGUgY29udGludWF0aW9uIGxpbmVzLi4KKwkgKiBZdWNrLCAyODIyIGhlYWRlciAiZm9sZGluZyIKKwkgKi8KKwlmb3IgKDs7KSB7CisJCWludCBwZWVrLCBhZGRsZW47CisJCXN0YXRpYyBjaGFyIGNvbnRpbnVhdGlvblsxMDAwXTsKKworCQlwZWVrID0gZmdldGMoaW4pOyB1bmdldGMocGVlaywgaW4pOworCQlpZiAocGVlayAhPSAnICcgJiYgcGVlayAhPSAnXHQnKQorCQkJYnJlYWs7CisJCWlmICghZmdldHMoY29udGludWF0aW9uLCBzaXplb2YoY29udGludWF0aW9uKSwgaW4pKQorCQkJYnJlYWs7CisJCWFkZGxlbiA9IGVhdHNwYWNlKGNvbnRpbnVhdGlvbik7CisJCWlmIChsZW4gPCBzeiAtIDEpIHsKKwkJCWlmIChhZGRsZW4gPj0gc3ogLSBsZW4pCisJCQkJYWRkbGVuID0gc3ogLSBsZW4gLSAxOworCQkJbWVtY3B5KGxpbmUgKyBsZW4sIGNvbnRpbnVhdGlvbiwgYWRkbGVuKTsKKwkJCWxpbmVbbGVuXSA9ICdcbic7CisJCQlsZW4gKz0gYWRkbGVuOworCQl9CisJfQorCWxpbmVbbGVuXSA9IDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBkZWNvZGVfcV9zZWdtZW50KGNoYXIgKmluLCBjaGFyICpvdCwgdW5zaWduZWQgb3RzaXplLCBjaGFyICplcCwgaW50IHJmYzIwNDcpCit7CisJY2hhciAqb3RlbmQgPSBvdCArIG90c2l6ZTsKKwlpbnQgYzsKKwl3aGlsZSAoKGMgPSAqaW4rKykgIT0gMCAmJiAoaW4gPD0gZXApKSB7CisJCWlmIChvdCA9PSBvdGVuZCkgeworCQkJKi0tb3QgPSAnXDAnOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChjID09ICc9JykgeworCQkJaW50IGQgPSAqaW4rKzsKKwkJCWlmIChkID09ICdcbicgfHwgIWQpCisJCQkJYnJlYWs7IC8qIGRyb3AgdHJhaWxpbmcgbmV3bGluZSAqLworCQkJKm90KysgPSAoKGhleHZhbChkKSA8PCA0KSB8IGhleHZhbCgqaW4rKykpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHJmYzIwNDcgJiYgYyA9PSAnXycpIC8qIHJmYzIwNDcgNC4yICgyKSAqLworCQkJYyA9IDB4MjA7CisJCSpvdCsrID0gYzsKKwl9CisJKm90ID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfYl9zZWdtZW50KGNoYXIgKmluLCBjaGFyICpvdCwgdW5zaWduZWQgb3RzaXplLCBjaGFyICplcCkKK3sKKwkvKiBEZWNvZGUgaW4uLmVwLCBwb3NzaWJseSBpbi1wbGFjZSB0byBvdCAqLworCWludCBjLCBwb3MgPSAwLCBhY2MgPSAwOworCWNoYXIgKm90ZW5kID0gb3QgKyBvdHNpemU7CisKKwl3aGlsZSAoKGMgPSAqaW4rKykgIT0gMCAmJiAoaW4gPD0gZXApKSB7CisJCWlmIChvdCA9PSBvdGVuZCkgeworCQkJKi0tb3QgPSAnXDAnOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChjID09ICcrJykKKwkJCWMgPSA2MjsKKwkJZWxzZSBpZiAoYyA9PSAnLycpCisJCQljID0gNjM7CisJCWVsc2UgaWYgKCdBJyA8PSBjICYmIGMgPD0gJ1onKQorCQkJYyAtPSAnQSc7CisJCWVsc2UgaWYgKCdhJyA8PSBjICYmIGMgPD0gJ3onKQorCQkJYyAtPSAnYScgLSAyNjsKKwkJZWxzZSBpZiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpCisJCQljIC09ICcwJyAtIDUyOworCQllbHNlIGlmIChjID09ICc9JykgeworCQkJLyogcGFkZGluZyBpcyBhbG1vc3QgbGlrZSAoYyA9PSAwKSwgZXhjZXB0IHdlIGRvCisJCQkgKiBub3Qgb3V0cHV0IE5VTCByZXN1bHRpbmcgb25seSBmcm9tIGl0OworCQkJICogZm9yIG5vdyB3ZSBqdXN0IHRydXN0IHRoZSBkYXRhLgorCQkJICovCisJCQljID0gMDsKKwkJfQorCQllbHNlCisJCQljb250aW51ZTsgLyogZ2FyYmFnZSAqLworCQlzd2l0Y2ggKHBvcysrKSB7CisJCWNhc2UgMDoKKwkJCWFjYyA9IChjIDw8IDIpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCSpvdCsrID0gKGFjYyB8IChjID4+IDQpKTsKKwkJCWFjYyA9IChjICYgMTUpIDw8IDQ7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJKm90KysgPSAoYWNjIHwgKGMgPj4gMikpOworCQkJYWNjID0gKGMgJiAzKSA8PCA2OworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCSpvdCsrID0gKGFjYyB8IGMpOworCQkJYWNjID0gcG9zID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCSpvdCA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXaGVuIHRoZXJlIGlzIG5vIGtub3duIGNoYXJzZXQsIGd1ZXNzLgorICoKKyAqIFJpZ2h0IG5vdyB3ZSBhc3N1bWUgdGhhdCBpZiB0aGUgdGFyZ2V0IGlzIFVURi04ICh0aGUgZGVmYXVsdCksCisgKiBhbmQgaXQgYWxyZWFkeSBsb29rcyBsaWtlIFVURi04ICh3aGljaCBpbmNsdWRlcyBVUy1BU0NJSSBhcyBpdHMKKyAqIHN1YnNldCwgb2YgY291cnNlKSB0aGVuIHRoYXQgaXMgd2hhdCBpdCBpcyBhbmQgdGhlcmUgaXMgbm90aGluZworICogdG8gZG8uCisgKgorICogT3RoZXJ3aXNlLCB3ZSBkZWZhdWx0IHRvIGFzc3VtaW5nIGl0IGlzIExhdGluMSBmb3IgaGlzdG9yaWNhbAorICogcmVhc29ucy4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmd1ZXNzX2NoYXJzZXQoY29uc3QgY2hhciAqbGluZSwgY29uc3QgY2hhciAqdGFyZ2V0X2NoYXJzZXQpCit7CisJaWYgKGlzX2VuY29kaW5nX3V0ZjgodGFyZ2V0X2NoYXJzZXQpKSB7CisJCWlmIChpc191dGY4KGxpbmUpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiAibGF0aW4xIjsKK30KKworc3RhdGljIHZvaWQgY29udmVydF90b191dGY4KGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxpbmVzaXplLCBjb25zdCBjaGFyICpjaGFyc2V0KQoreworCWNoYXIgKm91dDsKKworCWlmICghY2hhcnNldCB8fCAhKmNoYXJzZXQpIHsKKwkJY2hhcnNldCA9IGd1ZXNzX2NoYXJzZXQobGluZSwgbWV0YWluZm9fY2hhcnNldCk7CisJCWlmICghY2hhcnNldCkKKwkJCXJldHVybjsKKwl9CisKKwlpZiAoIXN0cmNtcChtZXRhaW5mb19jaGFyc2V0LCBjaGFyc2V0KSkKKwkJcmV0dXJuOworCW91dCA9IHJlZW5jb2RlX3N0cmluZyhsaW5lLCBtZXRhaW5mb19jaGFyc2V0LCBjaGFyc2V0KTsKKwlpZiAoIW91dCkKKwkJZGllKCJjYW5ub3QgY29udmVydCBmcm9tICVzIHRvICVzXG4iLAorCQkgICAgY2hhcnNldCwgbWV0YWluZm9fY2hhcnNldCk7CisJc3RybGNweShsaW5lLCBvdXQsIGxpbmVzaXplKTsKKwlmcmVlKG91dCk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2hlYWRlcl9icShjaGFyICppdCwgdW5zaWduZWQgaXRzaXplKQoreworCWNoYXIgKmluLCAqb3V0LCAqZXAsICpjcCwgKnNwOworCWNoYXIgb3V0YnVmWzEwMDBdOworCWludCByZmMyMDQ3ID0gMDsKKworCWluID0gaXQ7CisJb3V0ID0gb3V0YnVmOworCXdoaWxlICgoZXAgPSBzdHJzdHIoaW4sICI9PyIpKSAhPSBOVUxMKSB7CisJCWludCBzeiwgZW5jb2Rpbmc7CisJCWNoYXIgY2hhcnNldF9xWzI1Nl0sIHBpZWNlYnVmWzI1Nl07CisJCXJmYzIwNDcgPSAxOworCisJCWlmIChpbiAhPSBlcCkgeworCQkJc3ogPSBlcCAtIGluOworCQkJbWVtY3B5KG91dCwgaW4sIHN6KTsKKwkJCW91dCArPSBzejsKKwkJCWluICs9IHN6OworCQl9CisJCS8qIEUuZy4KKwkJICogZXAgOiAiPT9pc28tMjAyMi1qcD9CP0d5Ui4uLj89IGZvbyIKKwkJICogZXAgOiAiPT9JU08tODg1OS0xP1E/Rm9vPUZDYmFyPz0gYmF6IgorCQkgKi8KKwkJZXAgKz0gMjsKKwkJY3AgPSBzdHJjaHIoZXAsICc/Jyk7CisJCWlmICghY3ApCisJCQlyZXR1cm4gcmZjMjA0NzsgLyogbm8gbXVuZ2luZyAqLworCQlmb3IgKHNwID0gZXA7IHNwIDwgY3A7IHNwKyspCisJCQljaGFyc2V0X3Fbc3AgLSBlcF0gPSB0b2xvd2VyKCpzcCk7CisJCWNoYXJzZXRfcVtjcCAtIGVwXSA9IDA7CisJCWVuY29kaW5nID0gY3BbMV07CisJCWlmICghZW5jb2RpbmcgfHwgY3BbMl0gIT0gJz8nKQorCQkJcmV0dXJuIHJmYzIwNDc7IC8qIG5vIG11bmdpbmcgKi8KKwkJZXAgPSBzdHJzdHIoY3AgKyAzLCAiPz0iKTsKKwkJaWYgKCFlcCkKKwkJCXJldHVybiByZmMyMDQ3OyAvKiBubyBtdW5naW5nICovCisJCXN3aXRjaCAodG9sb3dlcihlbmNvZGluZykpIHsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiByZmMyMDQ3OyAvKiBubyBtdW5naW5nICovCisJCWNhc2UgJ2InOgorCQkJc3ogPSBkZWNvZGVfYl9zZWdtZW50KGNwICsgMywgcGllY2VidWYsIHNpemVvZihwaWVjZWJ1ZiksIGVwKTsKKwkJCWJyZWFrOworCQljYXNlICdxJzoKKwkJCXN6ID0gZGVjb2RlX3Ffc2VnbWVudChjcCArIDMsIHBpZWNlYnVmLCBzaXplb2YocGllY2VidWYpLCBlcCwgMSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoc3ogPCAwKQorCQkJcmV0dXJuIHJmYzIwNDc7CisJCWlmIChtZXRhaW5mb19jaGFyc2V0KQorCQkJY29udmVydF90b191dGY4KHBpZWNlYnVmLCBzaXplb2YocGllY2VidWYpLCBjaGFyc2V0X3EpOworCisJCXN6ID0gc3RybGVuKHBpZWNlYnVmKTsKKwkJaWYgKG91dGJ1ZiArIHNpemVvZihvdXRidWYpIDw9IG91dCArIHN6KQorCQkJcmV0dXJuIHJmYzIwNDc7IC8qIG5vIG11bmdpbmcgKi8KKwkJc3RyY3B5KG91dCwgcGllY2VidWYpOworCQlvdXQgKz0gc3o7CisJCWluID0gZXAgKyAyOworCX0KKwlzdHJjcHkob3V0LCBpbik7CisJc3RybGNweShpdCwgb3V0YnVmLCBpdHNpemUpOworCXJldHVybiByZmMyMDQ3OworfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfaGVhZGVyKGNoYXIgKml0LCB1bnNpZ25lZCBpdHNpemUpCit7CisKKwlpZiAoZGVjb2RlX2hlYWRlcl9icShpdCwgaXRzaXplKSkKKwkJcmV0dXJuOworCS8qIG90aGVyd2lzZSAiaXQiIGlzIGEgc3RyYWlnaHQgY29weSBvZiB0aGUgaW5wdXQuCisJICogVGhpcyBjYW4gYmUgYmluYXJ5IGd1Y2sgYnV0IHRoZXJlIGlzIG5vIGNoYXJzZXQgc3BlY2lmaWVkLgorCSAqLworCWlmIChtZXRhaW5mb19jaGFyc2V0KQorCQljb252ZXJ0X3RvX3V0ZjgoaXQsIGl0c2l6ZSwgIiIpOworfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfdHJhbnNmZXJfZW5jb2RpbmcoY2hhciAqbGluZSwgdW5zaWduZWQgbGluZXNpemUpCit7CisJY2hhciAqZXA7CisKKwlzd2l0Y2ggKHRyYW5zZmVyX2VuY29kaW5nKSB7CisJY2FzZSBURV9RUDoKKwkJZXAgPSBsaW5lICsgc3RybGVuKGxpbmUpOworCQlkZWNvZGVfcV9zZWdtZW50KGxpbmUsIGxpbmUsIGxpbmVzaXplLCBlcCwgMCk7CisJCWJyZWFrOworCWNhc2UgVEVfQkFTRTY0OgorCQllcCA9IGxpbmUgKyBzdHJsZW4obGluZSk7CisJCWRlY29kZV9iX3NlZ21lbnQobGluZSwgbGluZSwgbGluZXNpemUsIGVwKTsKKwkJYnJlYWs7CisJY2FzZSBURV9ET05UQ0FSRToKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGhhbmRsZV9maWx0ZXIoY2hhciAqbGluZSwgdW5zaWduZWQgbGluZXNpemUpOworCitzdGF0aWMgaW50IGZpbmRfYm91bmRhcnkodm9pZCkKK3sKKwl3aGlsZShmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZpbikgIT0gTlVMTCkgeworCQlpZiAoaXNfbXVsdGlwYXJ0X2JvdW5kYXJ5KGxpbmUpKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9ib3VuZGFyeSh2b2lkKQoreworCWNoYXIgbmV3bGluZVtdPSJcbiI7CithZ2FpbjoKKwlpZiAoIW1lbWNtcChsaW5lK2NvbnRlbnRfdG9wLT5ib3VuZGFyeV9sZW4sICItLSIsIDIpKSB7CisJCS8qIHdlIGhpdCBhbiBlbmQgYm91bmRhcnkgKi8KKwkJLyogcG9wIHRoZSBjdXJyZW50IGJvdW5kYXJ5IG9mZiB0aGUgc3RhY2sgKi8KKwkJZnJlZShjb250ZW50X3RvcC0+Ym91bmRhcnkpOworCisJCS8qIHRlY2huaWNhbGx5IHdvbid0IGhhcHBlbiBhcyBpc19tdWx0aXBhcnRfYm91bmRhcnkoKQorCQkgICB3aWxsIGZhaWwgZmlyc3QuICBCdXQganVzdCBpbiBjYXNlLi4KKwkJICovCisJCWlmIChjb250ZW50X3RvcC0tIDwgY29udGVudCkgeworCQkJZnByaW50ZihzdGRlcnIsICJEZXRlY3RlZCBtaXNtYXRjaGVkIGJvdW5kYXJpZXMsICIKKwkJCQkJImNhbid0IHJlY292ZXJcbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCQloYW5kbGVfZmlsdGVyKG5ld2xpbmUsIHNpemVvZihuZXdsaW5lKSk7CisKKwkJLyogc2tpcCB0byB0aGUgbmV4dCBib3VuZGFyeSAqLworCQlpZiAoIWZpbmRfYm91bmRhcnkoKSkKKwkJCXJldHVybiAwOworCQlnb3RvIGFnYWluOworCX0KKworCS8qIHNldCBzb21lIGRlZmF1bHRzICovCisJdHJhbnNmZXJfZW5jb2RpbmcgPSBURV9ET05UQ0FSRTsKKwljaGFyc2V0WzBdID0gMDsKKwltZXNzYWdlX3R5cGUgPSBUWVBFX1RFWFQ7CisKKwkvKiBzbHVycCBpbiB0aGlzIHNlY3Rpb24ncyBpbmZvICovCisJd2hpbGUgKHJlYWRfb25lX2hlYWRlcl9saW5lKGxpbmUsIHNpemVvZihsaW5lKSwgZmluKSkKKwkJY2hlY2tfaGVhZGVyKGxpbmUsIHNpemVvZihsaW5lKSwgcF9oZHJfZGF0YSwgMCk7CisKKwkvKiBlYXQgdGhlIGJsYW5rIGxpbmUgYWZ0ZXIgc2VjdGlvbiBpbmZvICovCisJcmV0dXJuIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZpbikgIT0gTlVMTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBhdGNoYnJlYWsoY29uc3QgY2hhciAqbGluZSkKK3sKKwkvKiBCZWdpbm5pbmcgb2YgYSAiZGlmZiAtIiBoZWFkZXI/ICovCisJaWYgKCFtZW1jbXAoImRpZmYgLSIsIGxpbmUsIDYpKQorCQlyZXR1cm4gMTsKKworCS8qIENWUyAiSW5kZXg6ICIgbGluZT8gKi8KKwlpZiAoIW1lbWNtcCgiSW5kZXg6ICIsIGxpbmUsIDcpKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogIi0tLSA8ZmlsZW5hbWU+IiBzdGFydHMgcGF0Y2hlcyB3aXRob3V0IGhlYWRlcnMKKwkgKiAiLS0tPHNwPioiIGlzIGEgbWFudWFsIHNlcGFyYXRvcgorCSAqLworCWlmICghbWVtY21wKCItLS0iLCBsaW5lLCAzKSkgeworCQlsaW5lICs9IDM7CisJCS8qIHNwYWNlIGZvbGxvd2VkIGJ5IGEgZmlsZW5hbWU/ICovCisJCWlmIChsaW5lWzBdID09ICcgJyAmJiAhaXNzcGFjZShsaW5lWzFdKSkKKwkJCXJldHVybiAxOworCQkvKiBKdXN0IHdoaXRlc3BhY2U/ICovCisJCWZvciAoOzspIHsKKwkJCXVuc2lnbmVkIGNoYXIgYyA9ICpsaW5lKys7CisJCQlpZiAoYyA9PSAnXG4nKQorCQkJCXJldHVybiAxOworCQkJaWYgKCFpc3NwYWNlKGMpKQorCQkJCWJyZWFrOworCQl9CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGhhbmRsZV9jb21taXRfbXNnKGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxpbmVzaXplKQoreworCXN0YXRpYyBpbnQgc3RpbGxfbG9va2luZyA9IDE7CisJY2hhciAqZW5kbGluZSA9IGxpbmUgKyBsaW5lc2l6ZTsKKworCWlmICghY21pdG1zZykKKwkJcmV0dXJuIDA7CisKKwlpZiAoc3RpbGxfbG9va2luZykgeworCQljaGFyICpjcCA9IGxpbmU7CisJCWlmIChpc3NwYWNlKCpsaW5lKSkgeworCQkJZm9yIChjcCA9IGxpbmUgKyAxOyAqY3A7IGNwKyspIHsKKwkJCQlpZiAoIWlzc3BhY2UoKmNwKSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoISpjcCkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoKHN0aWxsX2xvb2tpbmcgPSBjaGVja19oZWFkZXIoY3AsIGVuZGxpbmUgLSBjcCwgc19oZHJfZGF0YSwgMCkpICE9IDApCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBub3JtYWxpemUgdGhlIGxvZyBtZXNzYWdlIHRvIFVURi04LiAqLworCWlmIChtZXRhaW5mb19jaGFyc2V0KQorCQljb252ZXJ0X3RvX3V0ZjgobGluZSwgZW5kbGluZSAtIGxpbmUsIGNoYXJzZXQpOworCisJaWYgKHBhdGNoYnJlYWsobGluZSkpIHsKKwkJZmNsb3NlKGNtaXRtc2cpOworCQljbWl0bXNnID0gTlVMTDsKKwkJcmV0dXJuIDE7CisJfQorCisJZnB1dHMobGluZSwgY21pdG1zZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3BhdGNoKGNoYXIgKmxpbmUpCit7CisJZnB1dHMobGluZSwgcGF0Y2hmaWxlKTsKKwlwYXRjaF9saW5lcysrOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9maWx0ZXIoY2hhciAqbGluZSwgdW5zaWduZWQgbGluZXNpemUpCit7CisJc3RhdGljIGludCBmaWx0ZXIgPSAwOworCisJLyogZmlsdGVyIHRlbGxzIHVzIHdoaWNoIHBhcnQgd2UgbGVmdCBvZmYgb24KKwkgKiBhIG5vbi16ZXJvIHJldHVybiBpbmRpY2F0ZXMgd2UgaGl0IGEgZmlsdGVyIHBvaW50CisJICovCisJc3dpdGNoIChmaWx0ZXIpIHsKKwljYXNlIDA6CisJCWlmICghaGFuZGxlX2NvbW1pdF9tc2cobGluZSwgbGluZXNpemUpKQorCQkJYnJlYWs7CisJCWZpbHRlcisrOworCWNhc2UgMToKKwkJaWYgKCFoYW5kbGVfcGF0Y2gobGluZSkpCisJCQlicmVhazsKKwkJZmlsdGVyKys7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9ib2R5KHZvaWQpCit7CisJaW50IHJjID0gMDsKKwlzdGF0aWMgY2hhciBuZXdsaW5lWzIwMDBdOworCXN0YXRpYyBjaGFyICpucCA9IG5ld2xpbmU7CisKKwkvKiBTa2lwIHVwIHRvIHRoZSBmaXJzdCBib3VuZGFyeSAqLworCWlmIChjb250ZW50X3RvcC0+Ym91bmRhcnkpIHsKKwkJaWYgKCFmaW5kX2JvdW5kYXJ5KCkpCisJCQlyZXR1cm47CisJfQorCisJZG8geworCQkvKiBwcm9jZXNzIGFueSBib3VuZGFyeSBsaW5lcyAqLworCQlpZiAoY29udGVudF90b3AtPmJvdW5kYXJ5ICYmIGlzX211bHRpcGFydF9ib3VuZGFyeShsaW5lKSkgeworCQkJLyogZmx1c2ggYW55IGxlZnRvdmVyICovCisJCQlpZiAoKHRyYW5zZmVyX2VuY29kaW5nID09IFRFX0JBU0U2NCkgICYmCisJCQkgICAgKG5wICE9IG5ld2xpbmUpKSB7CisJCQkJaGFuZGxlX2ZpbHRlcihuZXdsaW5lLCBzaXplb2YobmV3bGluZSkpOworCQkJfQorCQkJaWYgKCFoYW5kbGVfYm91bmRhcnkoKSkKKwkJCQlyZXR1cm47CisJCX0KKworCQkvKiBVbndyYXAgdHJhbnNmZXIgZW5jb2RpbmcgKi8KKwkJZGVjb2RlX3RyYW5zZmVyX2VuY29kaW5nKGxpbmUsIHNpemVvZihsaW5lKSk7CisKKwkJc3dpdGNoICh0cmFuc2Zlcl9lbmNvZGluZykgeworCQljYXNlIFRFX0JBU0U2NDoKKwkJY2FzZSBURV9RUDoKKwkJeworCQkJY2hhciAqb3AgPSBsaW5lOworCisJCQkvKiBiaW5hcnkgZGF0YSBtb3N0IGxpa2VseSBkb2Vzbid0IGhhdmUgbmV3bGluZXMgKi8KKwkJCWlmIChtZXNzYWdlX3R5cGUgIT0gVFlQRV9URVhUKSB7CisJCQkJcmMgPSBoYW5kbGVfZmlsdGVyKGxpbmUsIHNpemVvZihuZXdsaW5lKSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIHRoaXMgaXMgYSBkZWNvZGVkIGxpbmUgdGhhdCBtYXkgY29udGFpbgorCQkJICogbXVsdGlwbGUgbmV3IGxpbmVzLiAgUGFzcyBvbmx5IG9uZSBjaHVuaworCQkJICogYXQgYSB0aW1lIHRvIGhhbmRsZV9maWx0ZXIoKQorCQkJICovCisKKwkJCWRvIHsKKwkJCQl3aGlsZSAoKm9wICE9ICdcbicgJiYgKm9wICE9IDApCisJCQkJCSpucCsrID0gKm9wKys7CisJCQkJKm5wID0gKm9wOworCQkJCWlmICgqbnAgIT0gMCkgeworCQkJCQkvKiBzaG91bGQgYmUgc2l0dGluZyBvbiBhIG5ldyBsaW5lICovCisJCQkJCSooKytucCkgPSAwOworCQkJCQlvcCsrOworCQkJCQlyYyA9IGhhbmRsZV9maWx0ZXIobmV3bGluZSwgc2l6ZW9mKG5ld2xpbmUpKTsKKwkJCQkJbnAgPSBuZXdsaW5lOworCQkJCX0KKwkJCX0gd2hpbGUgKCpvcCAhPSAwKTsKKwkJCS8qIHRoZSBwYXJ0aWFsIGNodW5rIGlzIHNhdmVkIGluIG5ld2xpbmUgYW5kCisJCQkgKiB3aWxsIGJlIGFwcGVuZGVkIGJ5IHRoZSBuZXh0IGl0ZXJhdGlvbiBvZiBmZ2V0cworCQkJICovCisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJcmMgPSBoYW5kbGVfZmlsdGVyKGxpbmUsIHNpemVvZihuZXdsaW5lKSk7CisJCX0KKwkJaWYgKHJjKQorCQkJLyogbm90aGluZyBsZWZ0IHRvIGZpbHRlciAqLworCQkJYnJlYWs7CisJfSB3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmaW4pKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgb3V0cHV0X2hlYWRlcl9saW5lcyhGSUxFICpmb3V0LCBjb25zdCBjaGFyICpoZHIsIGNoYXIgKmRhdGEpCit7CisJd2hpbGUgKDEpIHsKKwkJY2hhciAqZXAgPSBzdHJjaHIoZGF0YSwgJ1xuJyk7CisJCWludCBsZW47CisJCWlmICghZXApCisJCQlsZW4gPSBzdHJsZW4oZGF0YSk7CisJCWVsc2UKKwkJCWxlbiA9IGVwIC0gZGF0YTsKKwkJZnByaW50Zihmb3V0LCAiJXM6ICUuKnNcbiIsIGhkciwgbGVuLCBkYXRhKTsKKwkJaWYgKCFlcCkKKwkJCWJyZWFrOworCQlkYXRhID0gZXAgKyAxOworCX0KK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2luZm8odm9pZCkKK3sKKwljaGFyICpzdWI7CisJY2hhciAqaGRyOworCWludCBpOworCisJZm9yIChpID0gMDsgaGVhZGVyW2ldOyBpKyspIHsKKworCQkvKiBvbmx5IHByaW50IGluYm9keSBoZWFkZXJzIGlmIHdlIG91dHB1dCBhIHBhdGNoIGZpbGUgKi8KKwkJaWYgKHBhdGNoX2xpbmVzICYmIHNfaGRyX2RhdGFbaV0pCisJCQloZHIgPSBzX2hkcl9kYXRhW2ldOworCQllbHNlIGlmIChwX2hkcl9kYXRhW2ldKQorCQkJaGRyID0gcF9oZHJfZGF0YVtpXTsKKwkJZWxzZQorCQkJY29udGludWU7CisKKwkJaWYgKCFtZW1jbXAoaGVhZGVyW2ldLCAiU3ViamVjdCIsIDcpKSB7CisJCQlpZiAoa2VlcF9zdWJqZWN0KQorCQkJCXN1YiA9IGhkcjsKKwkJCWVsc2UgeworCQkJCXN1YiA9IGNsZWFudXBfc3ViamVjdChoZHIpOworCQkJCWNsZWFudXBfc3BhY2Uoc3ViKTsKKwkJCX0KKwkJCW91dHB1dF9oZWFkZXJfbGluZXMoZm91dCwgIlN1YmplY3QiLCBzdWIpOworCQl9IGVsc2UgaWYgKCFtZW1jbXAoaGVhZGVyW2ldLCAiRnJvbSIsIDQpKSB7CisJCQloYW5kbGVfZnJvbShoZHIpOworCQkJZnByaW50Zihmb3V0LCAiQXV0aG9yOiAlc1xuIiwgbmFtZSk7CisJCQlmcHJpbnRmKGZvdXQsICJFbWFpbDogJXNcbiIsIGVtYWlsKTsKKwkJfSBlbHNlIHsKKwkJCWNsZWFudXBfc3BhY2UoaGRyKTsKKwkJCWZwcmludGYoZm91dCwgIiVzOiAlc1xuIiwgaGVhZGVyW2ldLCBoZHIpOworCQl9CisJfQorCWZwcmludGYoZm91dCwgIlxuIik7Cit9CisKK3N0YXRpYyBpbnQgbWFpbGluZm8oRklMRSAqaW4sIEZJTEUgKm91dCwgaW50IGtzLCBjb25zdCBjaGFyICplbmNvZGluZywKKwkJICAgIGNvbnN0IGNoYXIgKm1zZywgY29uc3QgY2hhciAqcGF0Y2gpCit7CisJaW50IHBlZWs7CisJa2VlcF9zdWJqZWN0ID0ga3M7CisJbWV0YWluZm9fY2hhcnNldCA9IGVuY29kaW5nOworCWZpbiA9IGluOworCWZvdXQgPSBvdXQ7CisKKwljbWl0bXNnID0gZm9wZW4obXNnLCAidyIpOworCWlmICghY21pdG1zZykgeworCQlwZXJyb3IobXNnKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwYXRjaGZpbGUgPSBmb3BlbihwYXRjaCwgInciKTsKKwlpZiAoIXBhdGNoZmlsZSkgeworCQlwZXJyb3IocGF0Y2gpOworCQlmY2xvc2UoY21pdG1zZyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwX2hkcl9kYXRhID0geGNhbGxvYyhNQVhfSERSX1BBUlNFRCwgc2l6ZW9mKGNoYXIgKikpOworCXNfaGRyX2RhdGEgPSB4Y2FsbG9jKE1BWF9IRFJfUEFSU0VELCBzaXplb2YoY2hhciAqKSk7CisKKwlkbyB7CisJCXBlZWsgPSBmZ2V0Yyhpbik7CisJfSB3aGlsZSAoaXNzcGFjZShwZWVrKSk7CisJdW5nZXRjKHBlZWssIGluKTsKKworCS8qIHByb2Nlc3MgdGhlIGVtYWlsIGhlYWRlciAqLworCXdoaWxlIChyZWFkX29uZV9oZWFkZXJfbGluZShsaW5lLCBzaXplb2YobGluZSksIGZpbikpCisJCWNoZWNrX2hlYWRlcihsaW5lLCBzaXplb2YobGluZSksIHBfaGRyX2RhdGEsIDEpOworCisJaGFuZGxlX2JvZHkoKTsKKwloYW5kbGVfaW5mbygpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIG1haWxpbmZvX3VzYWdlW10gPQorCSJnaXQtbWFpbGluZm8gWy1rXSBbLXUgfCAtLWVuY29kaW5nPTxlbmNvZGluZz5dIG1zZyBwYXRjaCA8bWFpbCA+aW5mbyI7CisKK2ludCBjbWRfbWFpbGluZm8oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJY29uc3QgY2hhciAqZGVmX2NoYXJzZXQ7CisKKwkvKiBORUVEU1dPUks6IG1pZ2h0IHdhbnQgdG8gZG8gdGhlIG9wdGlvbmFsIC5naXQvIGRpcmVjdG9yeQorCSAqIGRpc2NvdmVyeQorCSAqLworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCWRlZl9jaGFyc2V0ID0gKGdpdF9jb21taXRfZW5jb2RpbmcgPyBnaXRfY29tbWl0X2VuY29kaW5nIDogInV0Zi04Iik7CisJbWV0YWluZm9fY2hhcnNldCA9IGRlZl9jaGFyc2V0OworCisJd2hpbGUgKDEgPCBhcmdjICYmIGFyZ3ZbMV1bMF0gPT0gJy0nKSB7CisJCWlmICghc3RyY21wKGFyZ3ZbMV0sICItayIpKQorCQkJa2VlcF9zdWJqZWN0ID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLXUiKSkKKwkJCW1ldGFpbmZvX2NoYXJzZXQgPSBkZWZfY2hhcnNldDsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLW4iKSkKKwkJCW1ldGFpbmZvX2NoYXJzZXQgPSBOVUxMOworCQllbHNlIGlmICghcHJlZml4Y21wKGFyZ3ZbMV0sICItLWVuY29kaW5nPSIpKQorCQkJbWV0YWluZm9fY2hhcnNldCA9IGFyZ3ZbMV0gKyAxMTsKKwkJZWxzZQorCQkJdXNhZ2UobWFpbGluZm9fdXNhZ2UpOworCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKwlpZiAoYXJnYyAhPSAzKQorCQl1c2FnZShtYWlsaW5mb191c2FnZSk7CisKKwlyZXR1cm4gISFtYWlsaW5mbyhzdGRpbiwgc3Rkb3V0LCBrZWVwX3N1YmplY3QsIG1ldGFpbmZvX2NoYXJzZXQsIGFyZ3ZbMV0sIGFyZ3ZbMl0pOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1tYWlsc3BsaXQuYyBiL2J1aWx0aW4tbWFpbHNwbGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZiMjdjZAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tbWFpbHNwbGl0LmMKQEAgLTAsMCArMSwzMDIgQEAKKy8qCisgKiBUb3RhbGx5IGJyYWluZGFtYWdlZCBtYm94IHNwbGl0dGVyIHByb2dyYW0uCisgKgorICogSXQganVzdCBzcGxpdHMgYSBtYm94IGludG8gYSBsaXN0IG9mIGZpbGVzOiAiMDAwMSIgIjAwMDIiIC4uCisgKiBzbyB5b3UgY2FuIHByb2Nlc3MgdGhlbSBmdXJ0aGVyIGZyb20gdGhlcmUuCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJwYXRoLWxpc3QuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgZ2l0X21haWxzcGxpdF91c2FnZVtdID0KKyJnaXQtbWFpbHNwbGl0IFstZDxwcmVjPl0gWy1mPG4+XSBbLWJdIC1vPGRpcmVjdG9yeT4gPG1ib3g+fDxNYWlsZGlyPi4uLiI7CisKK3N0YXRpYyBpbnQgaXNfZnJvbV9saW5lKGNvbnN0IGNoYXIgKmxpbmUsIGludCBsZW4pCit7CisJY29uc3QgY2hhciAqY29sb247CisKKwlpZiAobGVuIDwgMjAgfHwgbWVtY21wKCJGcm9tICIsIGxpbmUsIDUpKQorCQlyZXR1cm4gMDsKKworCWNvbG9uID0gbGluZSArIGxlbiAtIDI7CisJbGluZSArPSA1OworCWZvciAoOzspIHsKKwkJaWYgKGNvbG9uIDwgbGluZSkKKwkJCXJldHVybiAwOworCQlpZiAoKi0tY29sb24gPT0gJzonKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCFpc2RpZ2l0KGNvbG9uWy00XSkgfHwKKwkgICAgIWlzZGlnaXQoY29sb25bLTJdKSB8fAorCSAgICAhaXNkaWdpdChjb2xvblstMV0pIHx8CisJICAgICFpc2RpZ2l0KGNvbG9uWyAxXSkgfHwKKwkgICAgIWlzZGlnaXQoY29sb25bIDJdKSkKKwkJcmV0dXJuIDA7CisKKwkvKiB5ZWFyICovCisJaWYgKHN0cnRvbChjb2xvbiszLCBOVUxMLCAxMCkgPD0gOTApCisJCXJldHVybiAwOworCisJLyogT2ssIGNsb3NlIGVub3VnaCAqLworCXJldHVybiAxOworfQorCisvKiBDb3VsZCBiZSBhcyBzbWFsbCBhcyA2NCwgZW5vdWdoIHRvIGhvbGQgYSBVbml4ICJGcm9tICIgbGluZS4gKi8KK3N0YXRpYyBjaGFyIGJ1Zls0MDk2XTsKKworLyogQ2FsbGVkIHdpdGggdGhlIGZpcnN0IGxpbmUgKHBvdGVudGlhbGx5IHBhcnRpYWwpCisgKiBhbHJlYWR5IGluIGJ1ZltdIC0tIG5vcm1hbGx5IHRoYXQgc2hvdWxkIGJlZ2luIHdpdGgKKyAqIHRoZSBVbml4ICJGcm9tICIgbGluZS4gIFdyaXRlIGl0IGludG8gdGhlIHNwZWNpZmllZAorICogZmlsZS4KKyAqLworc3RhdGljIGludCBzcGxpdF9vbmUoRklMRSAqbWJveCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGFsbG93X2JhcmUpCit7CisJRklMRSAqb3V0cHV0ID0gTlVMTDsKKwlpbnQgbGVuID0gc3RybGVuKGJ1Zik7CisJaW50IGZkOworCWludCBzdGF0dXMgPSAwOworCWludCBpc19iYXJlID0gIWlzX2Zyb21fbGluZShidWYsIGxlbik7CisKKwlpZiAoaXNfYmFyZSAmJiAhYWxsb3dfYmFyZSkKKwkJZ290byBjb3JydXB0OworCisJZmQgPSBvcGVuKG5hbWUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCwgMDY2Nik7CisJaWYgKGZkIDwgMCkKKwkJZGllKCJjYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAlcyIsIG5hbWUpOworCW91dHB1dCA9IGZkb3BlbihmZCwgInciKTsKKworCS8qIENvcHkgaXQgb3V0LCB3aGlsZSBzZWFyY2hpbmcgZm9yIGEgbGluZSB0aGF0IGJlZ2lucyB3aXRoCisJICogIkZyb20gIiBhbmQgaGF2aW5nIHNvbWV0aGluZyB0aGF0IGxvb2tzIGxpa2UgYSBkYXRlIGZvcm1hdC4KKwkgKi8KKwlmb3IgKDs7KSB7CisJCWludCBpc19wYXJ0aWFsID0gKGJ1ZltsZW4tMV0gIT0gJ1xuJyk7CisKKwkJaWYgKGZwdXRzKGJ1Ziwgb3V0cHV0KSA9PSBFT0YpCisJCQlkaWUoImNhbm5vdCB3cml0ZSBvdXRwdXQiKTsKKworCQlpZiAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgbWJveCkgPT0gTlVMTCkgeworCQkJaWYgKGZlb2YobWJveCkpIHsKKwkJCQlzdGF0dXMgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQkJZGllKCJjYW5ub3QgcmVhZCBtYm94Iik7CisJCX0KKwkJbGVuID0gc3RybGVuKGJ1Zik7CisJCWlmICghaXNfcGFydGlhbCAmJiAhaXNfYmFyZSAmJiBpc19mcm9tX2xpbmUoYnVmLCBsZW4pKQorCQkJYnJlYWs7IC8qIGRvbmUgd2l0aCBvbmUgbWVzc2FnZSAqLworCX0KKwlmY2xvc2Uob3V0cHV0KTsKKwlyZXR1cm4gc3RhdHVzOworCisgY29ycnVwdDoKKwlpZiAob3V0cHV0KQorCQlmY2xvc2Uob3V0cHV0KTsKKwl1bmxpbmsobmFtZSk7CisJZnByaW50ZihzdGRlcnIsICJjb3JydXB0IG1haWxib3hcbiIpOworCWV4aXQoMSk7Cit9CisKK3N0YXRpYyBpbnQgcG9wdWxhdGVfbWFpbGRpcl9saXN0KHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJRElSICpkaXI7CisJc3RydWN0IGRpcmVudCAqZGVudDsKKwljaGFyIG5hbWVbUEFUSF9NQVhdOworCWNoYXIgKnN1YnNbXSA9IHsgImN1ciIsICJuZXciLCBOVUxMIH07CisJY2hhciAqKnN1YjsKKworCWZvciAoc3ViID0gc3ViczsgKnN1YjsgKytzdWIpIHsKKwkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMvJXMiLCBwYXRoLCAqc3ViKTsKKwkJaWYgKChkaXIgPSBvcGVuZGlyKG5hbWUpKSA9PSBOVUxMKSB7CisJCQlpZiAoZXJybm8gPT0gRU5PRU5UKQorCQkJCWNvbnRpbnVlOworCQkJZXJyb3IoImNhbm5vdCBvcGVuZGlyICVzICglcykiLCBuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJd2hpbGUgKChkZW50ID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCQlpZiAoZGVudC0+ZF9uYW1lWzBdID09ICcuJykKKwkJCQljb250aW51ZTsKKwkJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzLyVzIiwgKnN1YiwgZGVudC0+ZF9uYW1lKTsKKwkJCXBhdGhfbGlzdF9pbnNlcnQobmFtZSwgbGlzdCk7CisJCX0KKworCQljbG9zZWRpcihkaXIpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNwbGl0X21haWxkaXIoY29uc3QgY2hhciAqbWFpbGRpciwgY29uc3QgY2hhciAqZGlyLAorCWludCBucl9wcmVjLCBpbnQgc2tpcCkKK3sKKwljaGFyIGZpbGVbUEFUSF9NQVhdOworCWNoYXIgbmFtZVtQQVRIX01BWF07CisJaW50IHJldCA9IC0xOworCWludCBpOworCXN0cnVjdCBwYXRoX2xpc3QgbGlzdCA9IHtOVUxMLCAwLCAwLCAxfTsKKworCWlmIChwb3B1bGF0ZV9tYWlsZGlyX2xpc3QoJmxpc3QsIG1haWxkaXIpIDwgMCkKKwkJZ290byBvdXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGlzdC5ucjsgaSsrKSB7CisJCUZJTEUgKmY7CisJCXNucHJpbnRmKGZpbGUsIHNpemVvZihmaWxlKSwgIiVzLyVzIiwgbWFpbGRpciwgbGlzdC5pdGVtc1tpXS5wYXRoKTsKKwkJZiA9IGZvcGVuKGZpbGUsICJyIik7CisJCWlmICghZikgeworCQkJZXJyb3IoImNhbm5vdCBvcGVuIG1haWwgJXMgKCVzKSIsIGZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKSA9PSBOVUxMKSB7CisJCQllcnJvcigiY2Fubm90IHJlYWQgbWFpbCAlcyAoJXMpIiwgZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJc3ByaW50ZihuYW1lLCAiJXMvJTAqZCIsIGRpciwgbnJfcHJlYywgKytza2lwKTsKKwkJc3BsaXRfb25lKGYsIG5hbWUsIDEpOworCisJCWZjbG9zZShmKTsKKwl9CisKKwlyZXQgPSBza2lwOworb3V0OgorCXBhdGhfbGlzdF9jbGVhcigmbGlzdCwgMSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzcGxpdF9tYm94KGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKmRpciwgaW50IGFsbG93X2JhcmUsCisJCSAgICAgIGludCBucl9wcmVjLCBpbnQgc2tpcCkKK3sKKwljaGFyIG5hbWVbUEFUSF9NQVhdOworCWludCByZXQgPSAtMTsKKwlpbnQgcGVlazsKKworCUZJTEUgKmYgPSAhc3RyY21wKGZpbGUsICItIikgPyBzdGRpbiA6IGZvcGVuKGZpbGUsICJyIik7CisJaW50IGZpbGVfZG9uZSA9IDA7CisKKwlpZiAoIWYpIHsKKwkJZXJyb3IoImNhbm5vdCBvcGVuIG1ib3ggJXMiLCBmaWxlKTsKKwkJZ290byBvdXQ7CisJfQorCisJZG8geworCQlwZWVrID0gZmdldGMoZik7CisJfSB3aGlsZSAoaXNzcGFjZShwZWVrKSk7CisJdW5nZXRjKHBlZWssIGYpOworCisJaWYgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGYpID09IE5VTEwpIHsKKwkJLyogZW1wdHkgc3RkaW4gaXMgT0sgKi8KKwkJaWYgKGYgIT0gc3RkaW4pIHsKKwkJCWVycm9yKCJjYW5ub3QgcmVhZCBtYm94ICVzIiwgZmlsZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlmaWxlX2RvbmUgPSAxOworCX0KKworCXdoaWxlICghZmlsZV9kb25lKSB7CisJCXNwcmludGYobmFtZSwgIiVzLyUwKmQiLCBkaXIsIG5yX3ByZWMsICsrc2tpcCk7CisJCWZpbGVfZG9uZSA9IHNwbGl0X29uZShmLCBuYW1lLCBhbGxvd19iYXJlKTsKKwl9CisKKwlpZiAoZiAhPSBzdGRpbikKKwkJZmNsb3NlKGYpOworCisJcmV0ID0gc2tpcDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgY21kX21haWxzcGxpdChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgbnIgPSAwLCBucl9wcmVjID0gNCwgbnVtID0gMDsKKwlpbnQgYWxsb3dfYmFyZSA9IDA7CisJY29uc3QgY2hhciAqZGlyID0gTlVMTDsKKwljb25zdCBjaGFyICoqYXJncDsKKwlzdGF0aWMgY29uc3QgY2hhciAqc3RkaW5fb25seVtdID0geyAiLSIsIE5VTEwgfTsKKworCWZvciAoYXJncCA9IGFyZ3YrMTsgKmFyZ3A7IGFyZ3ArKykgeworCQljb25zdCBjaGFyICphcmcgPSAqYXJncDsKKworCQlpZiAoYXJnWzBdICE9ICctJykKKwkJCWJyZWFrOworCQkvKiBkbyBmbGFncyBoZXJlICovCisJCWlmICggYXJnWzFdID09ICdkJyApIHsKKwkJCW5yX3ByZWMgPSBzdHJ0b2woYXJnKzIsIE5VTEwsIDEwKTsKKwkJCWlmIChucl9wcmVjIDwgMyB8fCAxMCA8PSBucl9wcmVjKQorCQkJCXVzYWdlKGdpdF9tYWlsc3BsaXRfdXNhZ2UpOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoIGFyZ1sxXSA9PSAnZicgKSB7CisJCQluciA9IHN0cnRvbChhcmcrMiwgTlVMTCwgMTApOworCQl9IGVsc2UgaWYgKCBhcmdbMV0gPT0gJ2InICYmICFhcmdbMl0gKSB7CisJCQlhbGxvd19iYXJlID0gMTsKKwkJfSBlbHNlIGlmICggYXJnWzFdID09ICdvJyAmJiBhcmdbMl0gKSB7CisJCQlkaXIgPSBhcmcrMjsKKwkJfSBlbHNlIGlmICggYXJnWzFdID09ICctJyAmJiAhYXJnWzJdICkgeworCQkJYXJncCsrOwkvKiAtLSBtYXJrcyBlbmQgb2Ygb3B0aW9ucyAqLworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlkaWUoInVua25vd24gb3B0aW9uOiAlcyIsIGFyZyk7CisJCX0KKwl9CisKKwlpZiAoICFkaXIgKSB7CisJCS8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OiBpZiBubyAtbyBzcGVjaWZpZWQsIGFjY2VwdAorCQkgICA8bWJveD4gPGRpcj4gb3IganVzdCA8ZGlyPiAqLworCQlzd2l0Y2ggKGFyZ2MgLSAoYXJncC1hcmd2KSkgeworCQljYXNlIDE6CisJCQlkaXIgPSBhcmdwWzBdOworCQkJYXJncCA9IHN0ZGluX29ubHk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJc3RkaW5fb25seVswXSA9IGFyZ3BbMF07CisJCQlkaXIgPSBhcmdwWzFdOworCQkJYXJncCA9IHN0ZGluX29ubHk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKGdpdF9tYWlsc3BsaXRfdXNhZ2UpOworCQl9CisJfSBlbHNlIHsKKwkJLyogTmV3IHVzYWdlOiBpZiBubyBtb3JlIGFyZ3VtZW50LCBwYXJzZSBzdGRpbiAqLworCQlpZiAoICEqYXJncCApCisJCQlhcmdwID0gc3RkaW5fb25seTsKKwl9CisKKwl3aGlsZSAoKmFyZ3ApIHsKKwkJY29uc3QgY2hhciAqYXJnID0gKmFyZ3ArKzsKKwkJc3RydWN0IHN0YXQgYXJnc3RhdDsKKwkJaW50IHJldCA9IDA7CisKKwkJaWYgKGFyZ1swXSA9PSAnLScgJiYgYXJnWzFdID09IDApIHsKKwkJCXJldCA9IHNwbGl0X21ib3goYXJnLCBkaXIsIGFsbG93X2JhcmUsIG5yX3ByZWMsIG5yKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZXJyb3IoImNhbm5vdCBzcGxpdCBwYXRjaGVzIGZyb20gc3RkaW4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCW51bSArPSAocmV0IC0gbnIpOworCQkJbnIgPSByZXQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChzdGF0KGFyZywgJmFyZ3N0YXQpID09IC0xKSB7CisJCQllcnJvcigiY2Fubm90IHN0YXQgJXMgKCVzKSIsIGFyZywgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJaWYgKFNfSVNESVIoYXJnc3RhdC5zdF9tb2RlKSkKKwkJCXJldCA9IHNwbGl0X21haWxkaXIoYXJnLCBkaXIsIG5yX3ByZWMsIG5yKTsKKwkJZWxzZQorCQkJcmV0ID0gc3BsaXRfbWJveChhcmcsIGRpciwgYWxsb3dfYmFyZSwgbnJfcHJlYywgbnIpOworCisJCWlmIChyZXQgPCAwKSB7CisJCQllcnJvcigiY2Fubm90IHNwbGl0IHBhdGNoZXMgZnJvbSAlcyIsIGFyZyk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQludW0gKz0gKHJldCAtIG5yKTsKKwkJbnIgPSByZXQ7CisJfQorCisJcHJpbnRmKCIlZFxuIiwgbnVtKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1tZXJnZS1iYXNlLmMgYi9idWlsdGluLW1lcmdlLWJhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTA4ZTIyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1tZXJnZS1iYXNlLmMKQEAgLTAsMCArMSw1MiBAQAorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorCitzdGF0aWMgaW50IHNob3dfbWVyZ2VfYmFzZShzdHJ1Y3QgY29tbWl0ICpyZXYxLCBzdHJ1Y3QgY29tbWl0ICpyZXYyLCBpbnQgc2hvd19hbGwpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpyZXN1bHQgPSBnZXRfbWVyZ2VfYmFzZXMocmV2MSwgcmV2MiwgMCk7CisKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIDE7CisKKwl3aGlsZSAocmVzdWx0KSB7CisJCXByaW50ZigiJXNcbiIsIHNoYTFfdG9faGV4KHJlc3VsdC0+aXRlbS0+b2JqZWN0LnNoYTEpKTsKKwkJaWYgKCFzaG93X2FsbCkKKwkJCXJldHVybiAwOworCQlyZXN1bHQgPSByZXN1bHQtPm5leHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIG1lcmdlX2Jhc2VfdXNhZ2VbXSA9CisiZ2l0LW1lcmdlLWJhc2UgWy0tYWxsXSA8Y29tbWl0LWlkPiA8Y29tbWl0LWlkPiI7CisKK2ludCBjbWRfbWVyZ2VfYmFzZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgY29tbWl0ICpyZXYxLCAqcmV2MjsKKwl1bnNpZ25lZCBjaGFyIHJldjFrZXlbMjBdLCByZXYya2V5WzIwXTsKKwlpbnQgc2hvd19hbGwgPSAwOworCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJd2hpbGUgKDEgPCBhcmdjICYmIGFyZ3ZbMV1bMF0gPT0gJy0nKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbMV07CisJCWlmICghc3RyY21wKGFyZywgIi1hIikgfHwgIXN0cmNtcChhcmcsICItLWFsbCIpKQorCQkJc2hvd19hbGwgPSAxOworCQllbHNlCisJCQl1c2FnZShtZXJnZV9iYXNlX3VzYWdlKTsKKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCWlmIChhcmdjICE9IDMpCisJCXVzYWdlKG1lcmdlX2Jhc2VfdXNhZ2UpOworCWlmIChnZXRfc2hhMShhcmd2WzFdLCByZXYxa2V5KSkKKwkJZGllKCJOb3QgYSB2YWxpZCBvYmplY3QgbmFtZSAlcyIsIGFyZ3ZbMV0pOworCWlmIChnZXRfc2hhMShhcmd2WzJdLCByZXYya2V5KSkKKwkJZGllKCJOb3QgYSB2YWxpZCBvYmplY3QgbmFtZSAlcyIsIGFyZ3ZbMl0pOworCXJldjEgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShyZXYxa2V5KTsKKwlyZXYyID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2UocmV2MmtleSk7CisJaWYgKCFyZXYxIHx8ICFyZXYyKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gc2hvd19tZXJnZV9iYXNlKHJldjEsIHJldjIsIHNob3dfYWxsKTsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tbWVyZ2UtZmlsZS5jIGIvYnVpbHRpbi1tZXJnZS1maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwNTk2MAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tbWVyZ2UtZmlsZS5jCkBAIC0wLDAgKzEsNjkgQEAKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ4ZGlmZi94ZGlmZi5oIgorI2luY2x1ZGUgInhkaWZmLWludGVyZmFjZS5oIgorCitzdGF0aWMgY29uc3QgY2hhciBtZXJnZV9maWxlX3VzYWdlW10gPQorImdpdCBtZXJnZS1maWxlIFstcCB8IC0tc3Rkb3V0XSBbLXEgfCAtLXF1aWV0XSBbLUwgbmFtZTEgWy1MIG9yaWcgWy1MIG5hbWUyXV1dIGZpbGUxIG9yaWdfZmlsZSBmaWxlMiI7CisKK2ludCBjbWRfbWVyZ2VfZmlsZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwljb25zdCBjaGFyICpuYW1lc1szXTsKKwltbWZpbGVfdCBtbWZzWzNdOworCW1tYnVmZmVyX3QgcmVzdWx0ID0ge05VTEwsIDB9OworCXhwcGFyYW1fdCB4cHAgPSB7WERGX05FRURfTUlOSU1BTH07CisJaW50IHJldCA9IDAsIGkgPSAwLCB0b19zdGRvdXQgPSAwOworCisJd2hpbGUgKGFyZ2MgPiA0KSB7CisJCWlmICghc3RyY21wKGFyZ3ZbMV0sICItTCIpICYmIGkgPCAzKSB7CisJCQluYW1lc1tpKytdID0gYXJndlsyXTsKKwkJCWFyZ2MtLTsKKwkJCWFyZ3YrKzsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItcCIpIHx8CisJCQkJIXN0cmNtcChhcmd2WzFdLCAiLS1zdGRvdXQiKSkKKwkJCXRvX3N0ZG91dCA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi1xIikgfHwKKwkJCQkhc3RyY21wKGFyZ3ZbMV0sICItLXF1aWV0IikpCisJCQlmcmVvcGVuKCIvZGV2L251bGwiLCAidyIsIHN0ZGVycik7CisJCWVsc2UKKwkJCXVzYWdlKG1lcmdlX2ZpbGVfdXNhZ2UpOworCQlhcmdjLS07CisJCWFyZ3YrKzsKKwl9CisKKwlpZiAoYXJnYyAhPSA0KQorCQl1c2FnZShtZXJnZV9maWxlX3VzYWdlKTsKKworCWZvciAoOyBpIDwgMzsgaSsrKQorCQluYW1lc1tpXSA9IGFyZ3ZbaSArIDFdOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlpZiAocmVhZF9tbWZpbGUobW1mcyArIGksIGFyZ3ZbaSArIDFdKSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKGJ1ZmZlcl9pc19iaW5hcnkobW1mc1tpXS5wdHIsIG1tZnNbaV0uc2l6ZSkpCisJCQlyZXR1cm4gZXJyb3IoIkNhbm5vdCBtZXJnZSBiaW5hcnkgZmlsZXM6ICVzXG4iLAorCQkJCQlhcmd2W2kgKyAxXSk7CisJfQorCisJcmV0ID0geGRsX21lcmdlKG1tZnMgKyAxLCBtbWZzICsgMCwgbmFtZXNbMF0sIG1tZnMgKyAyLCBuYW1lc1syXSwKKwkJCSZ4cHAsIFhETF9NRVJHRV9aRUFMT1VTX0FMTlVNLCAmcmVzdWx0KTsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCWZyZWUobW1mc1tpXS5wdHIpOworCisJaWYgKHJldCA+PSAwKSB7CisJCWNvbnN0IGNoYXIgKmZpbGVuYW1lID0gYXJndlsxXTsKKwkJRklMRSAqZiA9IHRvX3N0ZG91dCA/IHN0ZG91dCA6IGZvcGVuKGZpbGVuYW1lLCAid2IiKTsKKworCQlpZiAoIWYpCisJCQlyZXQgPSBlcnJvcigiQ291bGQgbm90IG9wZW4gJXMgZm9yIHdyaXRpbmciLCBmaWxlbmFtZSk7CisJCWVsc2UgaWYgKHJlc3VsdC5zaXplICYmCisJCQkgZndyaXRlKHJlc3VsdC5wdHIsIHJlc3VsdC5zaXplLCAxLCBmKSAhPSAxKQorCQkJcmV0ID0gZXJyb3IoIkNvdWxkIG5vdCB3cml0ZSB0byAlcyIsIGZpbGVuYW1lKTsKKwkJZWxzZSBpZiAoZmNsb3NlKGYpKQorCQkJcmV0ID0gZXJyb3IoIkNvdWxkIG5vdCBjbG9zZSAlcyIsIGZpbGVuYW1lKTsKKwkJZnJlZShyZXN1bHQucHRyKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1tZXJnZS1vdXJzLmMgYi9idWlsdGluLW1lcmdlLW91cnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjViYmFmCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1tZXJnZS1vdXJzLmMKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mIGdpdC1tZXJnZS1vdXJzLnNoIGFzIGJ1aWx0aW4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgVGhvbWFzIEhhcm5pbmcgSnIKKyAqIE9yaWdpbmFsOgorICogT3JpZ2luYWwgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisgKgorICogUHJldGVuZCB3ZSByZXNvbHZlZCB0aGUgaGVhZHMsIGJ1dCBkZWNsYXJlIG91ciB0cmVlIHRydW1wcyBldmVyeWJvZHkgZWxzZS4KKyAqLworI2luY2x1ZGUgImdpdC1jb21wYXQtdXRpbC5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKmRpZmZfaW5kZXhfYXJnc1tdID0geworCSJkaWZmLWluZGV4IiwgIi0tcXVpZXQiLCAiLS1jYWNoZWQiLCAiSEVBRCIsICItLSIsIE5VTEwKK307CisjZGVmaW5lIE5BUkdTIChBUlJBWV9TSVpFKGRpZmZfaW5kZXhfYXJncykgLSAxKQorCitpbnQgY21kX21lcmdlX291cnMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJLyoKKwkgKiBXZSBuZWVkIHRvIGV4aXQgd2l0aCAyIGlmIHRoZSBpbmRleCBkb2VzIG5vdCBtYXRjaCBvdXIgSEVBRCB0cmVlLAorCSAqIGJlY2F1c2UgdGhlIGN1cnJlbnQgaW5kZXggaXMgd2hhdCB3ZSB3aWxsIGJlIGNvbW1pdHRpbmcgYXMgdGhlCisJICogbWVyZ2UgcmVzdWx0LgorCSAqLworCWlmIChjbWRfZGlmZl9pbmRleChOQVJHUywgZGlmZl9pbmRleF9hcmdzLCBwcmVmaXgpKQorCQlleGl0KDIpOworCWV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLW1lcmdlLXJlY3Vyc2l2ZS5jIGIvYnVpbHRpbi1tZXJnZS1yZWN1cnNpdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTBjMGQyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1tZXJnZS1yZWN1cnNpdmUuYwpAQCAtMCwwICsxLDE0MTQgQEAKKy8qCisgKiBSZWN1cnNpdmUgTWVyZ2UgYWxnb3JpdGhtIHN0b2xlbiBmcm9tIGdpdC1tZXJnZS1yZWN1cnNpdmUucHkgYnkKKyAqIEZyZWRyaWsgS3VpdmluZW4uCisgKiBUaGUgdGhpZXZlcyB3ZXJlIEFsZXggUmllc2VuIGFuZCBKb2hhbm5lcyBTY2hpbmRlbGluLCBpbiBKdW5lL0p1bHkgMjAwNgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjYWNoZS10cmVlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJ0cmVlLXdhbGsuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiZGlmZmNvcmUuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJ1bnBhY2stdHJlZXMuaCIKKyNpbmNsdWRlICJwYXRoLWxpc3QuaCIKKyNpbmNsdWRlICJ4ZGlmZi1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJsbC1tZXJnZS5oIgorI2luY2x1ZGUgImludGVycG9sYXRlLmgiCisjaW5jbHVkZSAiYXR0ci5oIgorI2luY2x1ZGUgIm1lcmdlLXJlY3Vyc2l2ZS5oIgorCitzdGF0aWMgaW50IHN1YnRyZWVfbWVyZ2U7CisKK3N0YXRpYyBzdHJ1Y3QgdHJlZSAqc2hpZnRfdHJlZV9vYmplY3Qoc3RydWN0IHRyZWUgKm9uZSwgc3RydWN0IHRyZWUgKnR3bykKK3sKKwl1bnNpZ25lZCBjaGFyIHNoaWZ0ZWRbMjBdOworCisJLyoKKwkgKiBORUVEU1dPUks6IHRoaXMgbGltaXRzIHRoZSByZWN1cnNpb24gZGVwdGggdG8gaGFyZGNvZGVkCisJICogdmFsdWUgJzInIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBvdmVyaGVhZC4KKwkgKi8KKwlzaGlmdF90cmVlKG9uZS0+b2JqZWN0LnNoYTEsIHR3by0+b2JqZWN0LnNoYTEsIHNoaWZ0ZWQsIDIpOworCWlmICghaGFzaGNtcCh0d28tPm9iamVjdC5zaGExLCBzaGlmdGVkKSkKKwkJcmV0dXJuIHR3bzsKKwlyZXR1cm4gbG9va3VwX3RyZWUoc2hpZnRlZCk7Cit9CisKKy8qCisgKiBBIHZpcnR1YWwgY29tbWl0IGhhcworICogLSAoY29uc3QgY2hhciAqKWNvbW1pdC0+dXRpbCBzZXQgdG8gdGhlIG5hbWUsIGFuZAorICogLSAqKGludCAqKWNvbW1pdC0+b2JqZWN0LnNoYTEgc2V0IHRvIHRoZSB2aXJ0dWFsIGlkLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBjb21taXRfbGlzdF9jb3VudChjb25zdCBzdHJ1Y3QgY29tbWl0X2xpc3QgKmwpCit7CisJdW5zaWduZWQgYyA9IDA7CisJZm9yICg7IGw7IGwgPSBsLT5uZXh0ICkKKwkJYysrOworCXJldHVybiBjOworfQorCitzdGF0aWMgc3RydWN0IGNvbW1pdCAqbWFrZV92aXJ0dWFsX2NvbW1pdChzdHJ1Y3QgdHJlZSAqdHJlZSwgY29uc3QgY2hhciAqY29tbWVudCkKK3sKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSB4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgY29tbWl0KSk7CisJc3RhdGljIHVuc2lnbmVkIHZpcnR1YWxfaWQgPSAxOworCWNvbW1pdC0+dHJlZSA9IHRyZWU7CisJY29tbWl0LT51dGlsID0gKHZvaWQqKWNvbW1lbnQ7CisJKihpbnQqKWNvbW1pdC0+b2JqZWN0LnNoYTEgPSB2aXJ0dWFsX2lkKys7CisJLyogYXZvaWQgd2FybmluZ3MgKi8KKwljb21taXQtPm9iamVjdC5wYXJzZWQgPSAxOworCXJldHVybiBjb21taXQ7Cit9CisKKy8qCisgKiBTaW5jZSB3ZSB1c2UgZ2V0X3RyZWVfZW50cnkoKSwgd2hpY2ggZG9lcyBub3QgcHV0IHRoZSByZWFkIG9iamVjdCBpbnRvCisgKiB0aGUgb2JqZWN0IHBvb2wsIHdlIGNhbm5vdCByZWx5IG9uIGEgPT0gYi4KKyAqLworc3RhdGljIGludCBzaGFfZXEoY29uc3QgdW5zaWduZWQgY2hhciAqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqYikKK3sKKwlpZiAoIWEgJiYgIWIpCisJCXJldHVybiAyOworCXJldHVybiBhICYmIGIgJiYgaGFzaGNtcChhLCBiKSA9PSAwOworfQorCisvKgorICogU2luY2Ugd2Ugd2FudCB0byB3cml0ZSB0aGUgaW5kZXggZXZlbnR1YWxseSwgd2UgY2Fubm90IHJldXNlIHRoZSBpbmRleAorICogZm9yIHRoZXNlICh0ZW1wb3JhcnkpIGRhdGEuCisgKi8KK3N0cnVjdCBzdGFnZV9kYXRhCit7CisJc3RydWN0CisJeworCQl1bnNpZ25lZCBtb2RlOworCQl1bnNpZ25lZCBjaGFyIHNoYVsyMF07CisJfSBzdGFnZXNbNF07CisJdW5zaWduZWQgcHJvY2Vzc2VkOjE7Cit9OworCitzdGF0aWMgc3RydWN0IHBhdGhfbGlzdCBjdXJyZW50X2ZpbGVfc2V0ID0ge05VTEwsIDAsIDAsIDF9Oworc3RhdGljIHN0cnVjdCBwYXRoX2xpc3QgY3VycmVudF9kaXJlY3Rvcnlfc2V0ID0ge05VTEwsIDAsIDAsIDF9OworCitzdGF0aWMgaW50IGNhbGxfZGVwdGggPSAwOworc3RhdGljIGludCB2ZXJib3NpdHkgPSAyOworc3RhdGljIGludCByZW5hbWVfbGltaXQgPSAtMTsKK3N0YXRpYyBpbnQgYnVmZmVyX291dHB1dCA9IDE7CitzdGF0aWMgc3RydWN0IHN0cmJ1ZiBvYnVmID0gU1RSQlVGX0lOSVQ7CisKK3N0YXRpYyBpbnQgc2hvdyhpbnQgdikKK3sKKwlyZXR1cm4gKCFjYWxsX2RlcHRoICYmIHZlcmJvc2l0eSA+PSB2KSB8fCB2ZXJib3NpdHkgPj0gNTsKK30KKworc3RhdGljIHZvaWQgZmx1c2hfb3V0cHV0KHZvaWQpCit7CisJaWYgKG9idWYubGVuKSB7CisJCWZwdXRzKG9idWYuYnVmLCBzdGRvdXQpOworCQlzdHJidWZfcmVzZXQoJm9idWYpOworCX0KK30KKworc3RhdGljIHZvaWQgb3V0cHV0KGludCB2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlpbnQgbGVuOworCXZhX2xpc3QgYXA7CisKKwlpZiAoIXNob3codikpCisJCXJldHVybjsKKworCXN0cmJ1Zl9ncm93KCZvYnVmLCBjYWxsX2RlcHRoICogMiArIDIpOworCW1lbXNldChvYnVmLmJ1ZiArIG9idWYubGVuLCAnICcsIGNhbGxfZGVwdGggKiAyKTsKKwlzdHJidWZfc2V0bGVuKCZvYnVmLCBvYnVmLmxlbiArIGNhbGxfZGVwdGggKiAyKTsKKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCWxlbiA9IHZzbnByaW50ZihvYnVmLmJ1ZiArIG9idWYubGVuLCBzdHJidWZfYXZhaWwoJm9idWYpLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCisJaWYgKGxlbiA8IDApCisJCWxlbiA9IDA7CisJaWYgKGxlbiA+PSBzdHJidWZfYXZhaWwoJm9idWYpKSB7CisJCXN0cmJ1Zl9ncm93KCZvYnVmLCBsZW4gKyAyKTsKKwkJdmFfc3RhcnQoYXAsIGZtdCk7CisJCWxlbiA9IHZzbnByaW50ZihvYnVmLmJ1ZiArIG9idWYubGVuLCBzdHJidWZfYXZhaWwoJm9idWYpLCBmbXQsIGFwKTsKKwkJdmFfZW5kKGFwKTsKKwkJaWYgKGxlbiA+PSBzdHJidWZfYXZhaWwoJm9idWYpKSB7CisJCQlkaWUoInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIHlvdXIgc25wcmludGYgaXMgYnJva2VuIik7CisJCX0KKwl9CisJc3RyYnVmX3NldGxlbigmb2J1Ziwgb2J1Zi5sZW4gKyBsZW4pOworCXN0cmJ1Zl9hZGQoJm9idWYsICJcbiIsIDEpOworCWlmICghYnVmZmVyX291dHB1dCkKKwkJZmx1c2hfb3V0cHV0KCk7Cit9CisKK3N0YXRpYyB2b2lkIG91dHB1dF9jb21taXRfdGl0bGUoc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCWludCBpOworCWZsdXNoX291dHB1dCgpOworCWZvciAoaSA9IGNhbGxfZGVwdGg7IGktLTspCisJCWZwdXRzKCIgICIsIHN0ZG91dCk7CisJaWYgKGNvbW1pdC0+dXRpbCkKKwkJcHJpbnRmKCJ2aXJ0dWFsICVzXG4iLCAoY2hhciAqKWNvbW1pdC0+dXRpbCk7CisJZWxzZSB7CisJCXByaW50ZigiJXMgIiwgZmluZF91bmlxdWVfYWJicmV2KGNvbW1pdC0+b2JqZWN0LnNoYTEsIERFRkFVTFRfQUJCUkVWKSk7CisJCWlmIChwYXJzZV9jb21taXQoY29tbWl0KSAhPSAwKQorCQkJcHJpbnRmKCIoYmFkIGNvbW1pdClcbiIpOworCQllbHNlIHsKKwkJCWNvbnN0IGNoYXIgKnM7CisJCQlpbnQgbGVuOworCQkJZm9yIChzID0gY29tbWl0LT5idWZmZXI7ICpzOyBzKyspCisJCQkJaWYgKCpzID09ICdcbicgJiYgc1sxXSA9PSAnXG4nKSB7CisJCQkJCXMgKz0gMjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJZm9yIChsZW4gPSAwOyBzW2xlbl0gJiYgJ1xuJyAhPSBzW2xlbl07IGxlbisrKQorCQkJCTsgLyogZG8gbm90aGluZyAqLworCQkJcHJpbnRmKCIlLipzXG4iLCBsZW4sIHMpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGFkZF9jYWNoZWluZm8odW5zaWduZWQgaW50IG1vZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCWNvbnN0IGNoYXIgKnBhdGgsIGludCBzdGFnZSwgaW50IHJlZnJlc2gsIGludCBvcHRpb25zKQoreworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisJY2UgPSBtYWtlX2NhY2hlX2VudHJ5KG1vZGUsIHNoYTEgPyBzaGExIDogbnVsbF9zaGExLCBwYXRoLCBzdGFnZSwgcmVmcmVzaCk7CisJaWYgKCFjZSkKKwkJcmV0dXJuIGVycm9yKCJhZGRpbmZvX2NhY2hlIGZhaWxlZCBmb3IgcGF0aCAnJXMnIiwgcGF0aCk7CisJcmV0dXJuIGFkZF9jYWNoZV9lbnRyeShjZSwgb3B0aW9ucyk7Cit9CisKKy8qCisgKiBUaGlzIGlzIGEgZ2xvYmFsIHZhcmlhYmxlIHdoaWNoIGlzIHVzZWQgaW4gYSBudW1iZXIgb2YgcGxhY2VzIGJ1dAorICogb25seSB3cml0dGVuIHRvIGluIHRoZSAnbWVyZ2UnIGZ1bmN0aW9uLgorICoKKyAqIGluZGV4X29ubHkgPT0gMSAgICA9PiBEb24ndCBsZWF2ZSBhbnkgbm9uLXN0YWdlIDAgZW50cmllcyBpbiB0aGUgY2FjaGUgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgdXBkYXRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4KKyAqICAgICAgICAgICAgICAgMCAgICA9PiBMZWF2ZSB1bm1lcmdlZCBlbnRyaWVzIGluIHRoZSBjYWNoZSBhbmQgdXBkYXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LgorICovCitzdGF0aWMgaW50IGluZGV4X29ubHkgPSAwOworCitzdGF0aWMgdm9pZCBpbml0X3RyZWVfZGVzY19mcm9tX3RyZWUoc3RydWN0IHRyZWVfZGVzYyAqZGVzYywgc3RydWN0IHRyZWUgKnRyZWUpCit7CisJcGFyc2VfdHJlZSh0cmVlKTsKKwlpbml0X3RyZWVfZGVzYyhkZXNjLCB0cmVlLT5idWZmZXIsIHRyZWUtPnNpemUpOworfQorCitzdGF0aWMgaW50IGdpdF9tZXJnZV90cmVlcyhpbnQgaW5kZXhfb25seSwKKwkJCSAgIHN0cnVjdCB0cmVlICpjb21tb24sCisJCQkgICBzdHJ1Y3QgdHJlZSAqaGVhZCwKKwkJCSAgIHN0cnVjdCB0cmVlICptZXJnZSkKK3sKKwlpbnQgcmM7CisJc3RydWN0IHRyZWVfZGVzYyB0WzNdOworCXN0cnVjdCB1bnBhY2tfdHJlZXNfb3B0aW9ucyBvcHRzOworCisJbWVtc2V0KCZvcHRzLCAwLCBzaXplb2Yob3B0cykpOworCWlmIChpbmRleF9vbmx5KQorCQlvcHRzLmluZGV4X29ubHkgPSAxOworCWVsc2UKKwkJb3B0cy51cGRhdGUgPSAxOworCW9wdHMubWVyZ2UgPSAxOworCW9wdHMuaGVhZF9pZHggPSAyOworCW9wdHMuZm4gPSB0aHJlZXdheV9tZXJnZTsKKwlvcHRzLnNyY19pbmRleCA9ICZ0aGVfaW5kZXg7CisJb3B0cy5kc3RfaW5kZXggPSAmdGhlX2luZGV4OworCisJaW5pdF90cmVlX2Rlc2NfZnJvbV90cmVlKHQrMCwgY29tbW9uKTsKKwlpbml0X3RyZWVfZGVzY19mcm9tX3RyZWUodCsxLCBoZWFkKTsKKwlpbml0X3RyZWVfZGVzY19mcm9tX3RyZWUodCsyLCBtZXJnZSk7CisKKwlyYyA9IHVucGFja190cmVlcygzLCB0LCAmb3B0cyk7CisJY2FjaGVfdHJlZV9mcmVlKCZhY3RpdmVfY2FjaGVfdHJlZSk7CisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgdHJlZSAqd3JpdGVfdHJlZV9mcm9tX21lbW9yeSh2b2lkKQoreworCXN0cnVjdCB0cmVlICpyZXN1bHQgPSBOVUxMOworCisJaWYgKHVubWVyZ2VkX2NhY2hlKCkpIHsKKwkJaW50IGk7CisJCW91dHB1dCgwLCAiVGhlcmUgYXJlIHVubWVyZ2VkIGluZGV4IGVudHJpZXM6Iik7CisJCWZvciAoaSA9IDA7IGkgPCBhY3RpdmVfbnI7IGkrKykgeworCQkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtpXTsKKwkJCWlmIChjZV9zdGFnZShjZSkpCisJCQkJb3V0cHV0KDAsICIlZCAlLipzIiwgY2Vfc3RhZ2UoY2UpLCBjZV9uYW1lbGVuKGNlKSwgY2UtPm5hbWUpOworCQl9CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghYWN0aXZlX2NhY2hlX3RyZWUpCisJCWFjdGl2ZV9jYWNoZV90cmVlID0gY2FjaGVfdHJlZSgpOworCisJaWYgKCFjYWNoZV90cmVlX2Z1bGx5X3ZhbGlkKGFjdGl2ZV9jYWNoZV90cmVlKSAmJgorCSAgICBjYWNoZV90cmVlX3VwZGF0ZShhY3RpdmVfY2FjaGVfdHJlZSwKKwkJCSAgICAgIGFjdGl2ZV9jYWNoZSwgYWN0aXZlX25yLCAwLCAwKSA8IDApCisJCWRpZSgiZXJyb3IgYnVpbGRpbmcgdHJlZXMiKTsKKworCXJlc3VsdCA9IGxvb2t1cF90cmVlKGFjdGl2ZV9jYWNoZV90cmVlLT5zaGExKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgc2F2ZV9maWxlc19kaXJzKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCWNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLCBjb25zdCBjaGFyICpwYXRoLAorCQl1bnNpZ25lZCBpbnQgbW9kZSwgaW50IHN0YWdlKQoreworCWludCBsZW4gPSBzdHJsZW4ocGF0aCk7CisJY2hhciAqbmV3cGF0aCA9IHhtYWxsb2MoYmFzZWxlbiArIGxlbiArIDEpOworCW1lbWNweShuZXdwYXRoLCBiYXNlLCBiYXNlbGVuKTsKKwltZW1jcHkobmV3cGF0aCArIGJhc2VsZW4sIHBhdGgsIGxlbik7CisJbmV3cGF0aFtiYXNlbGVuICsgbGVuXSA9ICdcMCc7CisKKwlpZiAoU19JU0RJUihtb2RlKSkKKwkJcGF0aF9saXN0X2luc2VydChuZXdwYXRoLCAmY3VycmVudF9kaXJlY3Rvcnlfc2V0KTsKKwllbHNlCisJCXBhdGhfbGlzdF9pbnNlcnQobmV3cGF0aCwgJmN1cnJlbnRfZmlsZV9zZXQpOworCWZyZWUobmV3cGF0aCk7CisKKwlyZXR1cm4gUkVBRF9UUkVFX1JFQ1VSU0lWRTsKK30KKworc3RhdGljIGludCBnZXRfZmlsZXNfZGlycyhzdHJ1Y3QgdHJlZSAqdHJlZSkKK3sKKwlpbnQgbjsKKwlpZiAocmVhZF90cmVlX3JlY3Vyc2l2ZSh0cmVlLCAiIiwgMCwgMCwgTlVMTCwgc2F2ZV9maWxlc19kaXJzKSAhPSAwKQorCQlyZXR1cm4gMDsKKwluID0gY3VycmVudF9maWxlX3NldC5uciArIGN1cnJlbnRfZGlyZWN0b3J5X3NldC5ucjsKKwlyZXR1cm4gbjsKK30KKworLyoKKyAqIFJldHVybnMgYW4gaW5kZXhfZW50cnkgaW5zdGFuY2Ugd2hpY2ggZG9lc24ndCBoYXZlIHRvIGNvcnJlc3BvbmQgdG8KKyAqIGEgcmVhbCBjYWNoZSBlbnRyeSBpbiBHaXQncyBpbmRleC4KKyAqLworc3RhdGljIHN0cnVjdCBzdGFnZV9kYXRhICppbnNlcnRfc3RhZ2VfZGF0YShjb25zdCBjaGFyICpwYXRoLAorCQlzdHJ1Y3QgdHJlZSAqbywgc3RydWN0IHRyZWUgKmEsIHN0cnVjdCB0cmVlICpiLAorCQlzdHJ1Y3QgcGF0aF9saXN0ICplbnRyaWVzKQoreworCXN0cnVjdCBwYXRoX2xpc3RfaXRlbSAqaXRlbTsKKwlzdHJ1Y3Qgc3RhZ2VfZGF0YSAqZSA9IHhjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzdGFnZV9kYXRhKSk7CisJZ2V0X3RyZWVfZW50cnkoby0+b2JqZWN0LnNoYTEsIHBhdGgsCisJCQllLT5zdGFnZXNbMV0uc2hhLCAmZS0+c3RhZ2VzWzFdLm1vZGUpOworCWdldF90cmVlX2VudHJ5KGEtPm9iamVjdC5zaGExLCBwYXRoLAorCQkJZS0+c3RhZ2VzWzJdLnNoYSwgJmUtPnN0YWdlc1syXS5tb2RlKTsKKwlnZXRfdHJlZV9lbnRyeShiLT5vYmplY3Quc2hhMSwgcGF0aCwKKwkJCWUtPnN0YWdlc1szXS5zaGEsICZlLT5zdGFnZXNbM10ubW9kZSk7CisJaXRlbSA9IHBhdGhfbGlzdF9pbnNlcnQocGF0aCwgZW50cmllcyk7CisJaXRlbS0+dXRpbCA9IGU7CisJcmV0dXJuIGU7Cit9CisKKy8qCisgKiBDcmVhdGUgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgZmlsZSBuYW1lcyB0byBzdGFnZV9kYXRhIG9iamVjdHMuIFRoZQorICogZGljdGlvbmFyeSBjb250YWlucyBvbmUgZW50cnkgZm9yIGV2ZXJ5IHBhdGggd2l0aCBhIG5vbi16ZXJvIHN0YWdlIGVudHJ5LgorICovCitzdGF0aWMgc3RydWN0IHBhdGhfbGlzdCAqZ2V0X3VubWVyZ2VkKHZvaWQpCit7CisJc3RydWN0IHBhdGhfbGlzdCAqdW5tZXJnZWQgPSB4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcGF0aF9saXN0KSk7CisJaW50IGk7CisKKwl1bm1lcmdlZC0+c3RyZHVwX3BhdGhzID0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBhY3RpdmVfbnI7IGkrKykgeworCQlzdHJ1Y3QgcGF0aF9saXN0X2l0ZW0gKml0ZW07CisJCXN0cnVjdCBzdGFnZV9kYXRhICplOworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW2ldOworCQlpZiAoIWNlX3N0YWdlKGNlKSkKKwkJCWNvbnRpbnVlOworCisJCWl0ZW0gPSBwYXRoX2xpc3RfbG9va3VwKGNlLT5uYW1lLCB1bm1lcmdlZCk7CisJCWlmICghaXRlbSkgeworCQkJaXRlbSA9IHBhdGhfbGlzdF9pbnNlcnQoY2UtPm5hbWUsIHVubWVyZ2VkKTsKKwkJCWl0ZW0tPnV0aWwgPSB4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgc3RhZ2VfZGF0YSkpOworCQl9CisJCWUgPSBpdGVtLT51dGlsOworCQllLT5zdGFnZXNbY2Vfc3RhZ2UoY2UpXS5tb2RlID0gY2UtPmNlX21vZGU7CisJCWhhc2hjcHkoZS0+c3RhZ2VzW2NlX3N0YWdlKGNlKV0uc2hhLCBjZS0+c2hhMSk7CisJfQorCisJcmV0dXJuIHVubWVyZ2VkOworfQorCitzdHJ1Y3QgcmVuYW1lCit7CisJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnBhaXI7CisJc3RydWN0IHN0YWdlX2RhdGEgKnNyY19lbnRyeTsKKwlzdHJ1Y3Qgc3RhZ2VfZGF0YSAqZHN0X2VudHJ5OworCXVuc2lnbmVkIHByb2Nlc3NlZDoxOworfTsKKworLyoKKyAqIEdldCBpbmZvcm1hdGlvbiBvZiBhbGwgcmVuYW1lcyB3aGljaCBvY2N1cnJlZCBiZXR3ZWVuICdvX3RyZWUnIGFuZAorICogJ3RyZWUnLiBXZSBuZWVkIHRoZSB0aHJlZSB0cmVlcyBpbiB0aGUgbWVyZ2UgKCdvX3RyZWUnLCAnYV90cmVlJyBhbmQKKyAqICdiX3RyZWUnKSB0byBiZSBhYmxlIHRvIGFzc29jaWF0ZSB0aGUgY29ycmVjdCBjYWNoZSBlbnRyaWVzIHdpdGgKKyAqIHRoZSByZW5hbWUgaW5mb3JtYXRpb24uICd0cmVlJyBpcyBhbHdheXMgZXF1YWwgdG8gZWl0aGVyIGFfdHJlZSBvciBiX3RyZWUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGF0aF9saXN0ICpnZXRfcmVuYW1lcyhzdHJ1Y3QgdHJlZSAqdHJlZSwKKwkJCQkJc3RydWN0IHRyZWUgKm9fdHJlZSwKKwkJCQkJc3RydWN0IHRyZWUgKmFfdHJlZSwKKwkJCQkJc3RydWN0IHRyZWUgKmJfdHJlZSwKKwkJCQkJc3RydWN0IHBhdGhfbGlzdCAqZW50cmllcykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcGF0aF9saXN0ICpyZW5hbWVzOworCXN0cnVjdCBkaWZmX29wdGlvbnMgb3B0czsKKworCXJlbmFtZXMgPSB4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcGF0aF9saXN0KSk7CisJZGlmZl9zZXR1cCgmb3B0cyk7CisJRElGRl9PUFRfU0VUKCZvcHRzLCBSRUNVUlNJVkUpOworCW9wdHMuZGV0ZWN0X3JlbmFtZSA9IERJRkZfREVURUNUX1JFTkFNRTsKKwlvcHRzLnJlbmFtZV9saW1pdCA9IHJlbmFtZV9saW1pdDsKKwlvcHRzLm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9OT19PVVRQVVQ7CisJaWYgKGRpZmZfc2V0dXBfZG9uZSgmb3B0cykgPCAwKQorCQlkaWUoImRpZmYgc2V0dXAgZmFpbGVkIik7CisJZGlmZl90cmVlX3NoYTEob190cmVlLT5vYmplY3Quc2hhMSwgdHJlZS0+b2JqZWN0LnNoYTEsICIiLCAmb3B0cyk7CisJZGlmZmNvcmVfc3RkKCZvcHRzKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGlmZl9xdWV1ZWRfZGlmZi5ucjsgKytpKSB7CisJCXN0cnVjdCBwYXRoX2xpc3RfaXRlbSAqaXRlbTsKKwkJc3RydWN0IHJlbmFtZSAqcmU7CisJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwYWlyID0gZGlmZl9xdWV1ZWRfZGlmZi5xdWV1ZVtpXTsKKwkJaWYgKHBhaXItPnN0YXR1cyAhPSAnUicpIHsKKwkJCWRpZmZfZnJlZV9maWxlcGFpcihwYWlyKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXJlID0geG1hbGxvYyhzaXplb2YoKnJlKSk7CisJCXJlLT5wcm9jZXNzZWQgPSAwOworCQlyZS0+cGFpciA9IHBhaXI7CisJCWl0ZW0gPSBwYXRoX2xpc3RfbG9va3VwKHJlLT5wYWlyLT5vbmUtPnBhdGgsIGVudHJpZXMpOworCQlpZiAoIWl0ZW0pCisJCQlyZS0+c3JjX2VudHJ5ID0gaW5zZXJ0X3N0YWdlX2RhdGEocmUtPnBhaXItPm9uZS0+cGF0aCwKKwkJCQkJb190cmVlLCBhX3RyZWUsIGJfdHJlZSwgZW50cmllcyk7CisJCWVsc2UKKwkJCXJlLT5zcmNfZW50cnkgPSBpdGVtLT51dGlsOworCisJCWl0ZW0gPSBwYXRoX2xpc3RfbG9va3VwKHJlLT5wYWlyLT50d28tPnBhdGgsIGVudHJpZXMpOworCQlpZiAoIWl0ZW0pCisJCQlyZS0+ZHN0X2VudHJ5ID0gaW5zZXJ0X3N0YWdlX2RhdGEocmUtPnBhaXItPnR3by0+cGF0aCwKKwkJCQkJb190cmVlLCBhX3RyZWUsIGJfdHJlZSwgZW50cmllcyk7CisJCWVsc2UKKwkJCXJlLT5kc3RfZW50cnkgPSBpdGVtLT51dGlsOworCQlpdGVtID0gcGF0aF9saXN0X2luc2VydChwYWlyLT5vbmUtPnBhdGgsIHJlbmFtZXMpOworCQlpdGVtLT51dGlsID0gcmU7CisJfQorCW9wdHMub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX05PX09VVFBVVDsKKwlkaWZmX3F1ZXVlZF9kaWZmLm5yID0gMDsKKwlkaWZmX2ZsdXNoKCZvcHRzKTsKKwlyZXR1cm4gcmVuYW1lczsKK30KKworc3RhdGljIGludCB1cGRhdGVfc3RhZ2VzKGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvLAorCQkJIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICphLCBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqYiwKKwkJCSBpbnQgY2xlYXIpCit7CisJaW50IG9wdGlvbnMgPSBBRERfQ0FDSEVfT0tfVE9fQUREIHwgQUREX0NBQ0hFX09LX1RPX1JFUExBQ0U7CisJaWYgKGNsZWFyKQorCQlpZiAocmVtb3ZlX2ZpbGVfZnJvbV9jYWNoZShwYXRoKSkKKwkJCXJldHVybiAtMTsKKwlpZiAobykKKwkJaWYgKGFkZF9jYWNoZWluZm8oby0+bW9kZSwgby0+c2hhMSwgcGF0aCwgMSwgMCwgb3B0aW9ucykpCisJCQlyZXR1cm4gLTE7CisJaWYgKGEpCisJCWlmIChhZGRfY2FjaGVpbmZvKGEtPm1vZGUsIGEtPnNoYTEsIHBhdGgsIDIsIDAsIG9wdGlvbnMpKQorCQkJcmV0dXJuIC0xOworCWlmIChiKQorCQlpZiAoYWRkX2NhY2hlaW5mbyhiLT5tb2RlLCBiLT5zaGExLCBwYXRoLCAzLCAwLCBvcHRpb25zKSkKKwkJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZW1vdmVfcGF0aChjb25zdCBjaGFyICpuYW1lKQoreworCWludCByZXQ7CisJY2hhciAqc2xhc2gsICpkaXJzOworCisJcmV0ID0gdW5saW5rKG5hbWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJZGlycyA9IHhzdHJkdXAobmFtZSk7CisJd2hpbGUgKChzbGFzaCA9IHN0cnJjaHIobmFtZSwgJy8nKSkpIHsKKwkJKnNsYXNoID0gJ1wwJzsKKwkJaWYgKHJtZGlyKG5hbWUpICE9IDApCisJCQlicmVhazsKKwl9CisJZnJlZShkaXJzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJlbW92ZV9maWxlKGludCBjbGVhbiwgY29uc3QgY2hhciAqcGF0aCwgaW50IG5vX3dkKQoreworCWludCB1cGRhdGVfY2FjaGUgPSBpbmRleF9vbmx5IHx8IGNsZWFuOworCWludCB1cGRhdGVfd29ya2luZ19kaXJlY3RvcnkgPSAhaW5kZXhfb25seSAmJiAhbm9fd2Q7CisKKwlpZiAodXBkYXRlX2NhY2hlKSB7CisJCWlmIChyZW1vdmVfZmlsZV9mcm9tX2NhY2hlKHBhdGgpKQorCQkJcmV0dXJuIC0xOworCX0KKwlpZiAodXBkYXRlX3dvcmtpbmdfZGlyZWN0b3J5KSB7CisJCXVubGluayhwYXRoKTsKKwkJaWYgKGVycm5vICE9IEVOT0VOVCB8fCBlcnJubyAhPSBFSVNESVIpCisJCQlyZXR1cm4gLTE7CisJCXJlbW92ZV9wYXRoKHBhdGgpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgKnVuaXF1ZV9wYXRoKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmJyYW5jaCkKK3sKKwljaGFyICpuZXdwYXRoID0geG1hbGxvYyhzdHJsZW4ocGF0aCkgKyAxICsgc3RybGVuKGJyYW5jaCkgKyA4ICsgMSk7CisJaW50IHN1ZmZpeCA9IDA7CisJc3RydWN0IHN0YXQgc3Q7CisJY2hhciAqcCA9IG5ld3BhdGggKyBzdHJsZW4ocGF0aCk7CisJc3RyY3B5KG5ld3BhdGgsIHBhdGgpOworCSoocCsrKSA9ICd+JzsKKwlzdHJjcHkocCwgYnJhbmNoKTsKKwlmb3IgKDsgKnA7ICsrcCkKKwkJaWYgKCcvJyA9PSAqcCkKKwkJCSpwID0gJ18nOworCXdoaWxlIChwYXRoX2xpc3RfaGFzX3BhdGgoJmN1cnJlbnRfZmlsZV9zZXQsIG5ld3BhdGgpIHx8CisJICAgICAgIHBhdGhfbGlzdF9oYXNfcGF0aCgmY3VycmVudF9kaXJlY3Rvcnlfc2V0LCBuZXdwYXRoKSB8fAorCSAgICAgICBsc3RhdChuZXdwYXRoLCAmc3QpID09IDApCisJCXNwcmludGYocCwgIl8lZCIsIHN1ZmZpeCsrKTsKKworCXBhdGhfbGlzdF9pbnNlcnQobmV3cGF0aCwgJmN1cnJlbnRfZmlsZV9zZXQpOworCXJldHVybiBuZXdwYXRoOworfQorCitzdGF0aWMgaW50IG1rZGlyX3AoY29uc3QgY2hhciAqcGF0aCwgdW5zaWduZWQgbG9uZyBtb2RlKQoreworCS8qIHBhdGggcG9pbnRzIHRvIGNhY2hlIGVudHJpZXMsIHNvIHhzdHJkdXAgYmVmb3JlIG1lc3Npbmcgd2l0aCBpdCAqLworCWNoYXIgKmJ1ZiA9IHhzdHJkdXAocGF0aCk7CisJaW50IHJlc3VsdCA9IHNhZmVfY3JlYXRlX2xlYWRpbmdfZGlyZWN0b3JpZXMoYnVmKTsKKwlmcmVlKGJ1Zik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgZmx1c2hfYnVmZmVyKGludCBmZCwgY29uc3QgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJd2hpbGUgKHNpemUgPiAwKSB7CisJCWxvbmcgcmV0ID0gd3JpdGVfaW5fZnVsbChmZCwgYnVmLCBzaXplKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCS8qIElnbm9yZSBlcGlwZSAqLworCQkJaWYgKGVycm5vID09IEVQSVBFKQorCQkJCWJyZWFrOworCQkJZGllKCJtZXJnZS1yZWN1cnNpdmU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfSBlbHNlIGlmICghcmV0KSB7CisJCQlkaWUoIm1lcmdlLXJlY3Vyc2l2ZTogZGlzayBmdWxsPyIpOworCQl9CisJCXNpemUgLT0gcmV0OworCQlidWYgKz0gcmV0OworCX0KK30KKworc3RhdGljIGludCBtYWtlX3Jvb21fZm9yX3BhdGgoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgc3RhdHVzOworCWNvbnN0IGNoYXIgKm1zZyA9ICJmYWlsZWQgdG8gY3JlYXRlIHBhdGggJyVzJyVzIjsKKworCXN0YXR1cyA9IG1rZGlyX3AocGF0aCwgMDc3Nyk7CisJaWYgKHN0YXR1cykgeworCQlpZiAoc3RhdHVzID09IC0zKSB7CisJCQkvKiBzb21ldGhpbmcgZWxzZSBleGlzdHMgKi8KKwkJCWVycm9yKG1zZywgcGF0aCwgIjogcGVyaGFwcyBhIEQvRiBjb25mbGljdD8iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlkaWUobXNnLCBwYXRoLCAiIik7CisJfQorCisJLyogU3VjY2Vzc2Z1bCB1bmxpbmsgaXMgZ29vZC4uICovCisJaWYgKCF1bmxpbmsocGF0aCkpCisJCXJldHVybiAwOworCS8qIC4uIGFuZCBzbyBpcyBubyBleGlzdGluZyBmaWxlICovCisJaWYgKGVycm5vID09IEVOT0VOVCkKKwkJcmV0dXJuIDA7CisJLyogLi4gYnV0IG5vdCBzb21lIG90aGVyIGVycm9yICh3aG8gcmVhbGx5IGNhcmVzIHdoYXQ/KSAqLworCXJldHVybiBlcnJvcihtc2csIHBhdGgsICI6IHBlcmhhcHMgYSBEL0YgY29uZmxpY3Q/Iik7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9maWxlX2ZsYWdzKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYSwKKwkJCSAgICAgIHVuc2lnbmVkIG1vZGUsCisJCQkgICAgICBjb25zdCBjaGFyICpwYXRoLAorCQkJICAgICAgaW50IHVwZGF0ZV9jYWNoZSwKKwkJCSAgICAgIGludCB1cGRhdGVfd2QpCit7CisJaWYgKGluZGV4X29ubHkpCisJCXVwZGF0ZV93ZCA9IDA7CisKKwlpZiAodXBkYXRlX3dkKSB7CisJCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwkJdm9pZCAqYnVmOworCQl1bnNpZ25lZCBsb25nIHNpemU7CisKKwkJaWYgKFNfSVNHSVRMSU5LKG1vZGUpKQorCQkJZGllKCJjYW5ub3QgcmVhZCBvYmplY3QgJXMgJyVzJzogSXQgaXMgYSBzdWJtb2R1bGUhIiwKKwkJCSAgICBzaGExX3RvX2hleChzaGEpLCBwYXRoKTsKKworCQlidWYgPSByZWFkX3NoYTFfZmlsZShzaGEsICZ0eXBlLCAmc2l6ZSk7CisJCWlmICghYnVmKQorCQkJZGllKCJjYW5ub3QgcmVhZCBvYmplY3QgJXMgJyVzJyIsIHNoYTFfdG9faGV4KHNoYSksIHBhdGgpOworCQlpZiAodHlwZSAhPSBPQkpfQkxPQikKKwkJCWRpZSgiYmxvYiBleHBlY3RlZCBmb3IgJXMgJyVzJyIsIHNoYTFfdG9faGV4KHNoYSksIHBhdGgpOworCisJCWlmIChtYWtlX3Jvb21fZm9yX3BhdGgocGF0aCkgPCAwKSB7CisJCQl1cGRhdGVfd2QgPSAwOworCQkJZ290byB1cGRhdGVfaW5kZXg7CisJCX0KKwkJaWYgKFNfSVNSRUcobW9kZSkgfHwgKCFoYXNfc3ltbGlua3MgJiYgU19JU0xOSyhtb2RlKSkpIHsKKwkJCWludCBmZDsKKwkJCWlmIChtb2RlICYgMDEwMCkKKwkJCQltb2RlID0gMDc3NzsKKwkJCWVsc2UKKwkJCQltb2RlID0gMDY2NjsKKwkJCWZkID0gb3BlbihwYXRoLCBPX1dST05MWSB8IE9fVFJVTkMgfCBPX0NSRUFULCBtb2RlKTsKKwkJCWlmIChmZCA8IDApCisJCQkJZGllKCJmYWlsZWQgdG8gb3BlbiAlczogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworCQkJZmx1c2hfYnVmZmVyKGZkLCBidWYsIHNpemUpOworCQkJY2xvc2UoZmQpOworCQl9IGVsc2UgaWYgKFNfSVNMTksobW9kZSkpIHsKKwkJCWNoYXIgKmxuayA9IHhtZW1kdXB6KGJ1Ziwgc2l6ZSk7CisJCQlta2Rpcl9wKHBhdGgsIDA3NzcpOworCQkJdW5saW5rKHBhdGgpOworCQkJc3ltbGluayhsbmssIHBhdGgpOworCQkJZnJlZShsbmspOworCQl9IGVsc2UKKwkJCWRpZSgiZG8gbm90IGtub3cgd2hhdCB0byBkbyB3aXRoICUwNm8gJXMgJyVzJyIsCisJCQkgICAgbW9kZSwgc2hhMV90b19oZXgoc2hhKSwgcGF0aCk7CisJfQorIHVwZGF0ZV9pbmRleDoKKwlpZiAodXBkYXRlX2NhY2hlKQorCQlhZGRfY2FjaGVpbmZvKG1vZGUsIHNoYSwgcGF0aCwgMCwgdXBkYXRlX3dkLCBBRERfQ0FDSEVfT0tfVE9fQUREKTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX2ZpbGUoaW50IGNsZWFuLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhLAorCQkJdW5zaWduZWQgbW9kZSwKKwkJCWNvbnN0IGNoYXIgKnBhdGgpCit7CisJdXBkYXRlX2ZpbGVfZmxhZ3Moc2hhLCBtb2RlLCBwYXRoLCBpbmRleF9vbmx5IHx8IGNsZWFuLCAhaW5kZXhfb25seSk7Cit9CisKKy8qIExvdyBsZXZlbCBmaWxlIG1lcmdpbmcsIHVwZGF0ZSBhbmQgcmVtb3ZhbCAqLworCitzdHJ1Y3QgbWVyZ2VfZmlsZV9pbmZvCit7CisJdW5zaWduZWQgY2hhciBzaGFbMjBdOworCXVuc2lnbmVkIG1vZGU7CisJdW5zaWduZWQgY2xlYW46MSwKKwkJIG1lcmdlOjE7Cit9OworCitzdGF0aWMgdm9pZCBmaWxsX21tKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIG1tZmlsZV90ICptbSkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCisJaWYgKCFoYXNoY21wKHNoYTEsIG51bGxfc2hhMSkpIHsKKwkJbW0tPnB0ciA9IHhzdHJkdXAoIiIpOworCQltbS0+c2l6ZSA9IDA7CisJCXJldHVybjsKKwl9CisKKwltbS0+cHRyID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgJnR5cGUsICZzaXplKTsKKwlpZiAoIW1tLT5wdHIgfHwgdHlwZSAhPSBPQkpfQkxPQikKKwkJZGllKCJ1bmFibGUgdG8gcmVhZCBibG9iIG9iamVjdCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwltbS0+c2l6ZSA9IHNpemU7Cit9CisKK3N0YXRpYyBpbnQgbWVyZ2VfM3dheShtbWJ1ZmZlcl90ICpyZXN1bHRfYnVmLAorCQkgICAgICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqbywKKwkJICAgICAgc3RydWN0IGRpZmZfZmlsZXNwZWMgKmEsCisJCSAgICAgIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpiLAorCQkgICAgICBjb25zdCBjaGFyICpicmFuY2gxLAorCQkgICAgICBjb25zdCBjaGFyICpicmFuY2gyKQoreworCW1tZmlsZV90IG9yaWcsIHNyYzEsIHNyYzI7CisJY2hhciAqbmFtZTEsICpuYW1lMjsKKwlpbnQgbWVyZ2Vfc3RhdHVzOworCisJbmFtZTEgPSB4c3RyZHVwKG1rcGF0aCgiJXM6JXMiLCBicmFuY2gxLCBhLT5wYXRoKSk7CisJbmFtZTIgPSB4c3RyZHVwKG1rcGF0aCgiJXM6JXMiLCBicmFuY2gyLCBiLT5wYXRoKSk7CisKKwlmaWxsX21tKG8tPnNoYTEsICZvcmlnKTsKKwlmaWxsX21tKGEtPnNoYTEsICZzcmMxKTsKKwlmaWxsX21tKGItPnNoYTEsICZzcmMyKTsKKworCW1lcmdlX3N0YXR1cyA9IGxsX21lcmdlKHJlc3VsdF9idWYsIGEtPnBhdGgsICZvcmlnLAorCQkJCSZzcmMxLCBuYW1lMSwgJnNyYzIsIG5hbWUyLAorCQkJCWluZGV4X29ubHkpOworCisJZnJlZShuYW1lMSk7CisJZnJlZShuYW1lMik7CisJZnJlZShvcmlnLnB0cik7CisJZnJlZShzcmMxLnB0cik7CisJZnJlZShzcmMyLnB0cik7CisJcmV0dXJuIG1lcmdlX3N0YXR1czsKK30KKworc3RhdGljIHN0cnVjdCBtZXJnZV9maWxlX2luZm8gbWVyZ2VfZmlsZShzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqbywKKwkJc3RydWN0IGRpZmZfZmlsZXNwZWMgKmEsIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpiLAorCQljb25zdCBjaGFyICpicmFuY2gxLCBjb25zdCBjaGFyICpicmFuY2gyKQoreworCXN0cnVjdCBtZXJnZV9maWxlX2luZm8gcmVzdWx0OworCXJlc3VsdC5tZXJnZSA9IDA7CisJcmVzdWx0LmNsZWFuID0gMTsKKworCWlmICgoU19JRk1UICYgYS0+bW9kZSkgIT0gKFNfSUZNVCAmIGItPm1vZGUpKSB7CisJCXJlc3VsdC5jbGVhbiA9IDA7CisJCWlmIChTX0lTUkVHKGEtPm1vZGUpKSB7CisJCQlyZXN1bHQubW9kZSA9IGEtPm1vZGU7CisJCQloYXNoY3B5KHJlc3VsdC5zaGEsIGEtPnNoYTEpOworCQl9IGVsc2UgeworCQkJcmVzdWx0Lm1vZGUgPSBiLT5tb2RlOworCQkJaGFzaGNweShyZXN1bHQuc2hhLCBiLT5zaGExKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghc2hhX2VxKGEtPnNoYTEsIG8tPnNoYTEpICYmICFzaGFfZXEoYi0+c2hhMSwgby0+c2hhMSkpCisJCQlyZXN1bHQubWVyZ2UgPSAxOworCisJCS8qCisJCSAqIE1lcmdlIG1vZGVzCisJCSAqLworCQlpZiAoYS0+bW9kZSA9PSBiLT5tb2RlIHx8IGEtPm1vZGUgPT0gby0+bW9kZSkKKwkJCXJlc3VsdC5tb2RlID0gYi0+bW9kZTsKKwkJZWxzZSB7CisJCQlyZXN1bHQubW9kZSA9IGEtPm1vZGU7CisJCQlpZiAoYi0+bW9kZSAhPSBvLT5tb2RlKSB7CisJCQkJcmVzdWx0LmNsZWFuID0gMDsKKwkJCQlyZXN1bHQubWVyZ2UgPSAxOworCQkJfQorCQl9CisKKwkJaWYgKHNoYV9lcShhLT5zaGExLCBiLT5zaGExKSB8fCBzaGFfZXEoYS0+c2hhMSwgby0+c2hhMSkpCisJCQloYXNoY3B5KHJlc3VsdC5zaGEsIGItPnNoYTEpOworCQllbHNlIGlmIChzaGFfZXEoYi0+c2hhMSwgby0+c2hhMSkpCisJCQloYXNoY3B5KHJlc3VsdC5zaGEsIGEtPnNoYTEpOworCQllbHNlIGlmIChTX0lTUkVHKGEtPm1vZGUpKSB7CisJCQltbWJ1ZmZlcl90IHJlc3VsdF9idWY7CisJCQlpbnQgbWVyZ2Vfc3RhdHVzOworCisJCQltZXJnZV9zdGF0dXMgPSBtZXJnZV8zd2F5KCZyZXN1bHRfYnVmLCBvLCBhLCBiLAorCQkJCQkJICBicmFuY2gxLCBicmFuY2gyKTsKKworCQkJaWYgKChtZXJnZV9zdGF0dXMgPCAwKSB8fCAhcmVzdWx0X2J1Zi5wdHIpCisJCQkJZGllKCJGYWlsZWQgdG8gZXhlY3V0ZSBpbnRlcm5hbCBtZXJnZSIpOworCisJCQlpZiAod3JpdGVfc2hhMV9maWxlKHJlc3VsdF9idWYucHRyLCByZXN1bHRfYnVmLnNpemUsCisJCQkJCSAgICBibG9iX3R5cGUsIHJlc3VsdC5zaGEpKQorCQkJCWRpZSgiVW5hYmxlIHRvIGFkZCAlcyB0byBkYXRhYmFzZSIsCisJCQkJICAgIGEtPnBhdGgpOworCisJCQlmcmVlKHJlc3VsdF9idWYucHRyKTsKKwkJCXJlc3VsdC5jbGVhbiA9IChtZXJnZV9zdGF0dXMgPT0gMCk7CisJCX0gZWxzZSBpZiAoU19JU0dJVExJTksoYS0+bW9kZSkpIHsKKwkJCXJlc3VsdC5jbGVhbiA9IDA7CisJCQloYXNoY3B5KHJlc3VsdC5zaGEsIGEtPnNoYTEpOworCQl9IGVsc2UgaWYgKFNfSVNMTksoYS0+bW9kZSkpIHsKKwkJCWhhc2hjcHkocmVzdWx0LnNoYSwgYS0+c2hhMSk7CisKKwkJCWlmICghc2hhX2VxKGEtPnNoYTEsIGItPnNoYTEpKQorCQkJCXJlc3VsdC5jbGVhbiA9IDA7CisJCX0gZWxzZSB7CisJCQlkaWUoInVuc3VwcG9ydGVkIG9iamVjdCB0eXBlIGluIHRoZSB0cmVlIik7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBjb25mbGljdF9yZW5hbWVfcmVuYW1lKHN0cnVjdCByZW5hbWUgKnJlbjEsCisJCQkJICAgY29uc3QgY2hhciAqYnJhbmNoMSwKKwkJCQkgICBzdHJ1Y3QgcmVuYW1lICpyZW4yLAorCQkJCSAgIGNvbnN0IGNoYXIgKmJyYW5jaDIpCit7CisJY2hhciAqZGVsWzJdOworCWludCBkZWxwID0gMDsKKwljb25zdCBjaGFyICpyZW4xX2RzdCA9IHJlbjEtPnBhaXItPnR3by0+cGF0aDsKKwljb25zdCBjaGFyICpyZW4yX2RzdCA9IHJlbjItPnBhaXItPnR3by0+cGF0aDsKKwljb25zdCBjaGFyICpkc3RfbmFtZTEgPSByZW4xX2RzdDsKKwljb25zdCBjaGFyICpkc3RfbmFtZTIgPSByZW4yX2RzdDsKKwlpZiAocGF0aF9saXN0X2hhc19wYXRoKCZjdXJyZW50X2RpcmVjdG9yeV9zZXQsIHJlbjFfZHN0KSkgeworCQlkc3RfbmFtZTEgPSBkZWxbZGVscCsrXSA9IHVuaXF1ZV9wYXRoKHJlbjFfZHN0LCBicmFuY2gxKTsKKwkJb3V0cHV0KDEsICIlcyBpcyBhIGRpcmVjdG9yeSBpbiAlcyBhZGRlZCBhcyAlcyBpbnN0ZWFkIiwKKwkJICAgICAgIHJlbjFfZHN0LCBicmFuY2gyLCBkc3RfbmFtZTEpOworCQlyZW1vdmVfZmlsZSgwLCByZW4xX2RzdCwgMCk7CisJfQorCWlmIChwYXRoX2xpc3RfaGFzX3BhdGgoJmN1cnJlbnRfZGlyZWN0b3J5X3NldCwgcmVuMl9kc3QpKSB7CisJCWRzdF9uYW1lMiA9IGRlbFtkZWxwKytdID0gdW5pcXVlX3BhdGgocmVuMl9kc3QsIGJyYW5jaDIpOworCQlvdXRwdXQoMSwgIiVzIGlzIGEgZGlyZWN0b3J5IGluICVzIGFkZGVkIGFzICVzIGluc3RlYWQiLAorCQkgICAgICAgcmVuMl9kc3QsIGJyYW5jaDEsIGRzdF9uYW1lMik7CisJCXJlbW92ZV9maWxlKDAsIHJlbjJfZHN0LCAwKTsKKwl9CisJaWYgKGluZGV4X29ubHkpIHsKKwkJcmVtb3ZlX2ZpbGVfZnJvbV9jYWNoZShkc3RfbmFtZTEpOworCQlyZW1vdmVfZmlsZV9mcm9tX2NhY2hlKGRzdF9uYW1lMik7CisJCS8qCisJCSAqIFVuY29tbWVudCB0byBsZWF2ZSB0aGUgY29uZmxpY3RpbmcgbmFtZXMgaW4gdGhlIHJlc3VsdGluZyB0cmVlCisJCSAqCisJCSAqIHVwZGF0ZV9maWxlKDAsIHJlbjEtPnBhaXItPnR3by0+c2hhMSwgcmVuMS0+cGFpci0+dHdvLT5tb2RlLCBkc3RfbmFtZTEpOworCQkgKiB1cGRhdGVfZmlsZSgwLCByZW4yLT5wYWlyLT50d28tPnNoYTEsIHJlbjItPnBhaXItPnR3by0+bW9kZSwgZHN0X25hbWUyKTsKKwkJICovCisJfSBlbHNlIHsKKwkJdXBkYXRlX3N0YWdlcyhkc3RfbmFtZTEsIE5VTEwsIHJlbjEtPnBhaXItPnR3bywgTlVMTCwgMSk7CisJCXVwZGF0ZV9zdGFnZXMoZHN0X25hbWUyLCBOVUxMLCBOVUxMLCByZW4yLT5wYWlyLT50d28sIDEpOworCX0KKwl3aGlsZSAoZGVscC0tKQorCQlmcmVlKGRlbFtkZWxwXSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZsaWN0X3JlbmFtZV9kaXIoc3RydWN0IHJlbmFtZSAqcmVuMSwKKwkJCQljb25zdCBjaGFyICpicmFuY2gxKQoreworCWNoYXIgKm5ld19wYXRoID0gdW5pcXVlX3BhdGgocmVuMS0+cGFpci0+dHdvLT5wYXRoLCBicmFuY2gxKTsKKwlvdXRwdXQoMSwgIlJlbmFtZWQgJXMgdG8gJXMgaW5zdGVhZCIsIHJlbjEtPnBhaXItPm9uZS0+cGF0aCwgbmV3X3BhdGgpOworCXJlbW92ZV9maWxlKDAsIHJlbjEtPnBhaXItPnR3by0+cGF0aCwgMCk7CisJdXBkYXRlX2ZpbGUoMCwgcmVuMS0+cGFpci0+dHdvLT5zaGExLCByZW4xLT5wYWlyLT50d28tPm1vZGUsIG5ld19wYXRoKTsKKwlmcmVlKG5ld19wYXRoKTsKK30KKworc3RhdGljIHZvaWQgY29uZmxpY3RfcmVuYW1lX3JlbmFtZV8yKHN0cnVjdCByZW5hbWUgKnJlbjEsCisJCQkJICAgICBjb25zdCBjaGFyICpicmFuY2gxLAorCQkJCSAgICAgc3RydWN0IHJlbmFtZSAqcmVuMiwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJyYW5jaDIpCit7CisJY2hhciAqbmV3X3BhdGgxID0gdW5pcXVlX3BhdGgocmVuMS0+cGFpci0+dHdvLT5wYXRoLCBicmFuY2gxKTsKKwljaGFyICpuZXdfcGF0aDIgPSB1bmlxdWVfcGF0aChyZW4yLT5wYWlyLT50d28tPnBhdGgsIGJyYW5jaDIpOworCW91dHB1dCgxLCAiUmVuYW1lZCAlcyB0byAlcyBhbmQgJXMgdG8gJXMgaW5zdGVhZCIsCisJICAgICAgIHJlbjEtPnBhaXItPm9uZS0+cGF0aCwgbmV3X3BhdGgxLAorCSAgICAgICByZW4yLT5wYWlyLT5vbmUtPnBhdGgsIG5ld19wYXRoMik7CisJcmVtb3ZlX2ZpbGUoMCwgcmVuMS0+cGFpci0+dHdvLT5wYXRoLCAwKTsKKwl1cGRhdGVfZmlsZSgwLCByZW4xLT5wYWlyLT50d28tPnNoYTEsIHJlbjEtPnBhaXItPnR3by0+bW9kZSwgbmV3X3BhdGgxKTsKKwl1cGRhdGVfZmlsZSgwLCByZW4yLT5wYWlyLT50d28tPnNoYTEsIHJlbjItPnBhaXItPnR3by0+bW9kZSwgbmV3X3BhdGgyKTsKKwlmcmVlKG5ld19wYXRoMik7CisJZnJlZShuZXdfcGF0aDEpOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfcmVuYW1lcyhzdHJ1Y3QgcGF0aF9saXN0ICphX3JlbmFtZXMsCisJCQkgICBzdHJ1Y3QgcGF0aF9saXN0ICpiX3JlbmFtZXMsCisJCQkgICBjb25zdCBjaGFyICphX2JyYW5jaCwKKwkJCSAgIGNvbnN0IGNoYXIgKmJfYnJhbmNoKQoreworCWludCBjbGVhbl9tZXJnZSA9IDEsIGksIGo7CisJc3RydWN0IHBhdGhfbGlzdCBhX2J5X2RzdCA9IHtOVUxMLCAwLCAwLCAwfSwgYl9ieV9kc3QgPSB7TlVMTCwgMCwgMCwgMH07CisJY29uc3Qgc3RydWN0IHJlbmFtZSAqc3JlOworCisJZm9yIChpID0gMDsgaSA8IGFfcmVuYW1lcy0+bnI7IGkrKykgeworCQlzcmUgPSBhX3JlbmFtZXMtPml0ZW1zW2ldLnV0aWw7CisJCXBhdGhfbGlzdF9pbnNlcnQoc3JlLT5wYWlyLT50d28tPnBhdGgsICZhX2J5X2RzdCktPnV0aWwKKwkJCT0gc3JlLT5kc3RfZW50cnk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBiX3JlbmFtZXMtPm5yOyBpKyspIHsKKwkJc3JlID0gYl9yZW5hbWVzLT5pdGVtc1tpXS51dGlsOworCQlwYXRoX2xpc3RfaW5zZXJ0KHNyZS0+cGFpci0+dHdvLT5wYXRoLCAmYl9ieV9kc3QpLT51dGlsCisJCQk9IHNyZS0+ZHN0X2VudHJ5OworCX0KKworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgYV9yZW5hbWVzLT5uciB8fCBqIDwgYl9yZW5hbWVzLT5ucjspIHsKKwkJaW50IGNvbXBhcmU7CisJCWNoYXIgKnNyYzsKKwkJc3RydWN0IHBhdGhfbGlzdCAqcmVuYW1lczEsICpyZW5hbWVzMiwgKnJlbmFtZXMyRHN0OworCQlzdHJ1Y3QgcmVuYW1lICpyZW4xID0gTlVMTCwgKnJlbjIgPSBOVUxMOworCQljb25zdCBjaGFyICpicmFuY2gxLCAqYnJhbmNoMjsKKwkJY29uc3QgY2hhciAqcmVuMV9zcmMsICpyZW4xX2RzdDsKKworCQlpZiAoaSA+PSBhX3JlbmFtZXMtPm5yKSB7CisJCQljb21wYXJlID0gMTsKKwkJCXJlbjIgPSBiX3JlbmFtZXMtPml0ZW1zW2orK10udXRpbDsKKwkJfSBlbHNlIGlmIChqID49IGJfcmVuYW1lcy0+bnIpIHsKKwkJCWNvbXBhcmUgPSAtMTsKKwkJCXJlbjEgPSBhX3JlbmFtZXMtPml0ZW1zW2krK10udXRpbDsKKwkJfSBlbHNlIHsKKwkJCWNvbXBhcmUgPSBzdHJjbXAoYV9yZW5hbWVzLT5pdGVtc1tpXS5wYXRoLAorCQkJCQliX3JlbmFtZXMtPml0ZW1zW2pdLnBhdGgpOworCQkJaWYgKGNvbXBhcmUgPD0gMCkKKwkJCQlyZW4xID0gYV9yZW5hbWVzLT5pdGVtc1tpKytdLnV0aWw7CisJCQlpZiAoY29tcGFyZSA+PSAwKQorCQkJCXJlbjIgPSBiX3JlbmFtZXMtPml0ZW1zW2orK10udXRpbDsKKwkJfQorCisJCS8qIFRPRE86IHJlZmFjdG9yLCBzbyB0aGF0IDEvMiBhcmUgbm90IG5lZWRlZCAqLworCQlpZiAocmVuMSkgeworCQkJcmVuYW1lczEgPSBhX3JlbmFtZXM7CisJCQlyZW5hbWVzMiA9IGJfcmVuYW1lczsKKwkJCXJlbmFtZXMyRHN0ID0gJmJfYnlfZHN0OworCQkJYnJhbmNoMSA9IGFfYnJhbmNoOworCQkJYnJhbmNoMiA9IGJfYnJhbmNoOworCQl9IGVsc2UgeworCQkJc3RydWN0IHJlbmFtZSAqdG1wOworCQkJcmVuYW1lczEgPSBiX3JlbmFtZXM7CisJCQlyZW5hbWVzMiA9IGFfcmVuYW1lczsKKwkJCXJlbmFtZXMyRHN0ID0gJmFfYnlfZHN0OworCQkJYnJhbmNoMSA9IGJfYnJhbmNoOworCQkJYnJhbmNoMiA9IGFfYnJhbmNoOworCQkJdG1wID0gcmVuMjsKKwkJCXJlbjIgPSByZW4xOworCQkJcmVuMSA9IHRtcDsKKwkJfQorCQlzcmMgPSByZW4xLT5wYWlyLT5vbmUtPnBhdGg7CisKKwkJcmVuMS0+ZHN0X2VudHJ5LT5wcm9jZXNzZWQgPSAxOworCQlyZW4xLT5zcmNfZW50cnktPnByb2Nlc3NlZCA9IDE7CisKKwkJaWYgKHJlbjEtPnByb2Nlc3NlZCkKKwkJCWNvbnRpbnVlOworCQlyZW4xLT5wcm9jZXNzZWQgPSAxOworCisJCXJlbjFfc3JjID0gcmVuMS0+cGFpci0+b25lLT5wYXRoOworCQlyZW4xX2RzdCA9IHJlbjEtPnBhaXItPnR3by0+cGF0aDsKKworCQlpZiAocmVuMikgeworCQkJY29uc3QgY2hhciAqcmVuMl9zcmMgPSByZW4yLT5wYWlyLT5vbmUtPnBhdGg7CisJCQljb25zdCBjaGFyICpyZW4yX2RzdCA9IHJlbjItPnBhaXItPnR3by0+cGF0aDsKKwkJCS8qIFJlbmFtZWQgaW4gMSBhbmQgcmVuYW1lZCBpbiAyICovCisJCQlpZiAoc3RyY21wKHJlbjFfc3JjLCByZW4yX3NyYykgIT0gMCkKKwkJCQlkaWUoInJlbjEuc3JjICE9IHJlbjIuc3JjIik7CisJCQlyZW4yLT5kc3RfZW50cnktPnByb2Nlc3NlZCA9IDE7CisJCQlyZW4yLT5wcm9jZXNzZWQgPSAxOworCQkJaWYgKHN0cmNtcChyZW4xX2RzdCwgcmVuMl9kc3QpICE9IDApIHsKKwkJCQljbGVhbl9tZXJnZSA9IDA7CisJCQkJb3V0cHV0KDEsICJDT05GTElDVCAocmVuYW1lL3JlbmFtZSk6ICIKKwkJCQkgICAgICAgIlJlbmFtZSBcIiVzXCItPlwiJXNcIiBpbiBicmFuY2ggXCIlc1wiICIKKwkJCQkgICAgICAgInJlbmFtZSBcIiVzXCItPlwiJXNcIiBpbiBcIiVzXCIlcyIsCisJCQkJICAgICAgIHNyYywgcmVuMV9kc3QsIGJyYW5jaDEsCisJCQkJICAgICAgIHNyYywgcmVuMl9kc3QsIGJyYW5jaDIsCisJCQkJICAgICAgIGluZGV4X29ubHkgPyAiIChsZWZ0IHVucmVzb2x2ZWQpIjogIiIpOworCQkJCWlmIChpbmRleF9vbmx5KSB7CisJCQkJCXJlbW92ZV9maWxlX2Zyb21fY2FjaGUoc3JjKTsKKwkJCQkJdXBkYXRlX2ZpbGUoMCwgcmVuMS0+cGFpci0+b25lLT5zaGExLAorCQkJCQkJICAgIHJlbjEtPnBhaXItPm9uZS0+bW9kZSwgc3JjKTsKKwkJCQl9CisJCQkJY29uZmxpY3RfcmVuYW1lX3JlbmFtZShyZW4xLCBicmFuY2gxLCByZW4yLCBicmFuY2gyKTsKKwkJCX0gZWxzZSB7CisJCQkJc3RydWN0IG1lcmdlX2ZpbGVfaW5mbyBtZmk7CisJCQkJcmVtb3ZlX2ZpbGUoMSwgcmVuMV9zcmMsIDEpOworCQkJCW1maSA9IG1lcmdlX2ZpbGUocmVuMS0+cGFpci0+b25lLAorCQkJCQkJIHJlbjEtPnBhaXItPnR3bywKKwkJCQkJCSByZW4yLT5wYWlyLT50d28sCisJCQkJCQkgYnJhbmNoMSwKKwkJCQkJCSBicmFuY2gyKTsKKwkJCQlpZiAobWZpLm1lcmdlIHx8ICFtZmkuY2xlYW4pCisJCQkJCW91dHB1dCgxLCAiUmVuYW1lZCAlcy0+JXMiLCBzcmMsIHJlbjFfZHN0KTsKKworCQkJCWlmIChtZmkubWVyZ2UpCisJCQkJCW91dHB1dCgyLCAiQXV0by1tZXJnZWQgJXMiLCByZW4xX2RzdCk7CisKKwkJCQlpZiAoIW1maS5jbGVhbikgeworCQkJCQlvdXRwdXQoMSwgIkNPTkZMSUNUIChjb250ZW50KTogbWVyZ2UgY29uZmxpY3QgaW4gJXMiLAorCQkJCQkgICAgICAgcmVuMV9kc3QpOworCQkJCQljbGVhbl9tZXJnZSA9IDA7CisKKwkJCQkJaWYgKCFpbmRleF9vbmx5KQorCQkJCQkJdXBkYXRlX3N0YWdlcyhyZW4xX2RzdCwKKwkJCQkJCQkgICAgICByZW4xLT5wYWlyLT5vbmUsCisJCQkJCQkJICAgICAgcmVuMS0+cGFpci0+dHdvLAorCQkJCQkJCSAgICAgIHJlbjItPnBhaXItPnR3bywKKwkJCQkJCQkgICAgICAxIC8qIGNsZWFyICovKTsKKwkJCQl9CisJCQkJdXBkYXRlX2ZpbGUobWZpLmNsZWFuLCBtZmkuc2hhLCBtZmkubW9kZSwgcmVuMV9kc3QpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogUmVuYW1lZCBpbiAxLCBtYXliZSBjaGFuZ2VkIGluIDIgKi8KKwkJCXN0cnVjdCBwYXRoX2xpc3RfaXRlbSAqaXRlbTsKKwkJCS8qIHdlIG9ubHkgdXNlIHNoYTEgYW5kIG1vZGUgb2YgdGhlc2UgKi8KKwkJCXN0cnVjdCBkaWZmX2ZpbGVzcGVjIHNyY19vdGhlciwgZHN0X290aGVyOworCQkJaW50IHRyeV9tZXJnZSwgc3RhZ2UgPSBhX3JlbmFtZXMgPT0gcmVuYW1lczEgPyAzOiAyOworCisJCQlyZW1vdmVfZmlsZSgxLCByZW4xX3NyYywgaW5kZXhfb25seSB8fCBzdGFnZSA9PSAzKTsKKworCQkJaGFzaGNweShzcmNfb3RoZXIuc2hhMSwgcmVuMS0+c3JjX2VudHJ5LT5zdGFnZXNbc3RhZ2VdLnNoYSk7CisJCQlzcmNfb3RoZXIubW9kZSA9IHJlbjEtPnNyY19lbnRyeS0+c3RhZ2VzW3N0YWdlXS5tb2RlOworCQkJaGFzaGNweShkc3Rfb3RoZXIuc2hhMSwgcmVuMS0+ZHN0X2VudHJ5LT5zdGFnZXNbc3RhZ2VdLnNoYSk7CisJCQlkc3Rfb3RoZXIubW9kZSA9IHJlbjEtPmRzdF9lbnRyeS0+c3RhZ2VzW3N0YWdlXS5tb2RlOworCisJCQl0cnlfbWVyZ2UgPSAwOworCisJCQlpZiAocGF0aF9saXN0X2hhc19wYXRoKCZjdXJyZW50X2RpcmVjdG9yeV9zZXQsIHJlbjFfZHN0KSkgeworCQkJCWNsZWFuX21lcmdlID0gMDsKKwkJCQlvdXRwdXQoMSwgIkNPTkZMSUNUIChyZW5hbWUvZGlyZWN0b3J5KTogUmVuYW1lZCAlcy0+JXMgaW4gJXMgIgorCQkJCSAgICAgICAiIGRpcmVjdG9yeSAlcyBhZGRlZCBpbiAlcyIsCisJCQkJICAgICAgIHJlbjFfc3JjLCByZW4xX2RzdCwgYnJhbmNoMSwKKwkJCQkgICAgICAgcmVuMV9kc3QsIGJyYW5jaDIpOworCQkJCWNvbmZsaWN0X3JlbmFtZV9kaXIocmVuMSwgYnJhbmNoMSk7CisJCQl9IGVsc2UgaWYgKHNoYV9lcShzcmNfb3RoZXIuc2hhMSwgbnVsbF9zaGExKSkgeworCQkJCWNsZWFuX21lcmdlID0gMDsKKwkJCQlvdXRwdXQoMSwgIkNPTkZMSUNUIChyZW5hbWUvZGVsZXRlKTogUmVuYW1lZCAlcy0+JXMgaW4gJXMgIgorCQkJCSAgICAgICAiYW5kIGRlbGV0ZWQgaW4gJXMiLAorCQkJCSAgICAgICByZW4xX3NyYywgcmVuMV9kc3QsIGJyYW5jaDEsCisJCQkJICAgICAgIGJyYW5jaDIpOworCQkJCXVwZGF0ZV9maWxlKDAsIHJlbjEtPnBhaXItPnR3by0+c2hhMSwgcmVuMS0+cGFpci0+dHdvLT5tb2RlLCByZW4xX2RzdCk7CisJCQl9IGVsc2UgaWYgKCFzaGFfZXEoZHN0X290aGVyLnNoYTEsIG51bGxfc2hhMSkpIHsKKwkJCQljb25zdCBjaGFyICpuZXdfcGF0aDsKKwkJCQljbGVhbl9tZXJnZSA9IDA7CisJCQkJdHJ5X21lcmdlID0gMTsKKwkJCQlvdXRwdXQoMSwgIkNPTkZMSUNUIChyZW5hbWUvYWRkKTogUmVuYW1lZCAlcy0+JXMgaW4gJXMuICIKKwkJCQkgICAgICAgIiVzIGFkZGVkIGluICVzIiwKKwkJCQkgICAgICAgcmVuMV9zcmMsIHJlbjFfZHN0LCBicmFuY2gxLAorCQkJCSAgICAgICByZW4xX2RzdCwgYnJhbmNoMik7CisJCQkJbmV3X3BhdGggPSB1bmlxdWVfcGF0aChyZW4xX2RzdCwgYnJhbmNoMik7CisJCQkJb3V0cHV0KDEsICJBZGRlZCBhcyAlcyBpbnN0ZWFkIiwgbmV3X3BhdGgpOworCQkJCXVwZGF0ZV9maWxlKDAsIGRzdF9vdGhlci5zaGExLCBkc3Rfb3RoZXIubW9kZSwgbmV3X3BhdGgpOworCQkJfSBlbHNlIGlmICgoaXRlbSA9IHBhdGhfbGlzdF9sb29rdXAocmVuMV9kc3QsIHJlbmFtZXMyRHN0KSkpIHsKKwkJCQlyZW4yID0gaXRlbS0+dXRpbDsKKwkJCQljbGVhbl9tZXJnZSA9IDA7CisJCQkJcmVuMi0+cHJvY2Vzc2VkID0gMTsKKwkJCQlvdXRwdXQoMSwgIkNPTkZMSUNUIChyZW5hbWUvcmVuYW1lKTogUmVuYW1lZCAlcy0+JXMgaW4gJXMuICIKKwkJCQkgICAgICAgIlJlbmFtZWQgJXMtPiVzIGluICVzIiwKKwkJCQkgICAgICAgcmVuMV9zcmMsIHJlbjFfZHN0LCBicmFuY2gxLAorCQkJCSAgICAgICByZW4yLT5wYWlyLT5vbmUtPnBhdGgsIHJlbjItPnBhaXItPnR3by0+cGF0aCwgYnJhbmNoMik7CisJCQkJY29uZmxpY3RfcmVuYW1lX3JlbmFtZV8yKHJlbjEsIGJyYW5jaDEsIHJlbjIsIGJyYW5jaDIpOworCQkJfSBlbHNlCisJCQkJdHJ5X21lcmdlID0gMTsKKworCQkJaWYgKHRyeV9tZXJnZSkgeworCQkJCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvLCAqYSwgKmI7CisJCQkJc3RydWN0IG1lcmdlX2ZpbGVfaW5mbyBtZmk7CisJCQkJc3JjX290aGVyLnBhdGggPSAoY2hhciAqKXJlbjFfc3JjOworCisJCQkJbyA9IHJlbjEtPnBhaXItPm9uZTsKKwkJCQlpZiAoYV9yZW5hbWVzID09IHJlbmFtZXMxKSB7CisJCQkJCWEgPSByZW4xLT5wYWlyLT50d287CisJCQkJCWIgPSAmc3JjX290aGVyOworCQkJCX0gZWxzZSB7CisJCQkJCWIgPSByZW4xLT5wYWlyLT50d287CisJCQkJCWEgPSAmc3JjX290aGVyOworCQkJCX0KKwkJCQltZmkgPSBtZXJnZV9maWxlKG8sIGEsIGIsCisJCQkJCQlhX2JyYW5jaCwgYl9icmFuY2gpOworCisJCQkJaWYgKG1maS5jbGVhbiAmJgorCQkJCSAgICBzaGFfZXEobWZpLnNoYSwgcmVuMS0+cGFpci0+dHdvLT5zaGExKSAmJgorCQkJCSAgICBtZmkubW9kZSA9PSByZW4xLT5wYWlyLT50d28tPm1vZGUpCisJCQkJCS8qCisJCQkJCSAqIFRoaXMgbWVzc2FnZWQgaXMgcGFydCBvZgorCQkJCQkgKiB0NjAyMiB0ZXN0LiBJZiB5b3UgY2hhbmdlCisJCQkJCSAqIGl0IHVwZGF0ZSB0aGUgdGVzdCB0b28uCisJCQkJCSAqLworCQkJCQlvdXRwdXQoMywgIlNraXBwZWQgJXMgKG1lcmdlZCBzYW1lIGFzIGV4aXN0aW5nKSIsIHJlbjFfZHN0KTsKKwkJCQllbHNlIHsKKwkJCQkJaWYgKG1maS5tZXJnZSB8fCAhbWZpLmNsZWFuKQorCQkJCQkJb3V0cHV0KDEsICJSZW5hbWVkICVzID0+ICVzIiwgcmVuMV9zcmMsIHJlbjFfZHN0KTsKKwkJCQkJaWYgKG1maS5tZXJnZSkKKwkJCQkJCW91dHB1dCgyLCAiQXV0by1tZXJnZWQgJXMiLCByZW4xX2RzdCk7CisJCQkJCWlmICghbWZpLmNsZWFuKSB7CisJCQkJCQlvdXRwdXQoMSwgIkNPTkZMSUNUIChyZW5hbWUvbW9kaWZ5KTogTWVyZ2UgY29uZmxpY3QgaW4gJXMiLAorCQkJCQkJICAgICAgIHJlbjFfZHN0KTsKKwkJCQkJCWNsZWFuX21lcmdlID0gMDsKKworCQkJCQkJaWYgKCFpbmRleF9vbmx5KQorCQkJCQkJCXVwZGF0ZV9zdGFnZXMocmVuMV9kc3QsCisJCQkJCQkJCSAgICAgIG8sIGEsIGIsIDEpOworCQkJCQl9CisJCQkJCXVwZGF0ZV9maWxlKG1maS5jbGVhbiwgbWZpLnNoYSwgbWZpLm1vZGUsIHJlbjFfZHN0KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcGF0aF9saXN0X2NsZWFyKCZhX2J5X2RzdCwgMCk7CisJcGF0aF9saXN0X2NsZWFyKCZiX2J5X2RzdCwgMCk7CisKKwlyZXR1cm4gY2xlYW5fbWVyZ2U7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpzdGFnZV9zaGEoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhLCB1bnNpZ25lZCBtb2RlKQoreworCXJldHVybiAoaXNfbnVsbF9zaGExKHNoYSkgfHwgbW9kZSA9PSAwKSA/IE5VTEw6ICh1bnNpZ25lZCBjaGFyICopc2hhOworfQorCisvKiBQZXIgZW50cnkgbWVyZ2UgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19lbnRyeShjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3Qgc3RhZ2VfZGF0YSAqZW50cnksCisJCQkgY29uc3QgY2hhciAqYnJhbmNoMSwKKwkJCSBjb25zdCBjaGFyICpicmFuY2gyKQoreworCS8qCisJcHJpbnRmKCJwcm9jZXNzaW5nIGVudHJ5LCBjbGVhbiBjYWNoZTogJXNcbiIsIGluZGV4X29ubHkgPyAieWVzIjogIm5vIik7CisJcHJpbnRfaW5kZXhfZW50cnkoIlx0cGF0aDogIiwgZW50cnkpOworCSovCisJaW50IGNsZWFuX21lcmdlID0gMTsKKwl1bnNpZ25lZCBvX21vZGUgPSBlbnRyeS0+c3RhZ2VzWzFdLm1vZGU7CisJdW5zaWduZWQgYV9tb2RlID0gZW50cnktPnN0YWdlc1syXS5tb2RlOworCXVuc2lnbmVkIGJfbW9kZSA9IGVudHJ5LT5zdGFnZXNbM10ubW9kZTsKKwl1bnNpZ25lZCBjaGFyICpvX3NoYSA9IHN0YWdlX3NoYShlbnRyeS0+c3RhZ2VzWzFdLnNoYSwgb19tb2RlKTsKKwl1bnNpZ25lZCBjaGFyICphX3NoYSA9IHN0YWdlX3NoYShlbnRyeS0+c3RhZ2VzWzJdLnNoYSwgYV9tb2RlKTsKKwl1bnNpZ25lZCBjaGFyICpiX3NoYSA9IHN0YWdlX3NoYShlbnRyeS0+c3RhZ2VzWzNdLnNoYSwgYl9tb2RlKTsKKworCWlmIChvX3NoYSAmJiAoIWFfc2hhIHx8ICFiX3NoYSkpIHsKKwkJLyogQ2FzZSBBOiBEZWxldGVkIGluIG9uZSAqLworCQlpZiAoKCFhX3NoYSAmJiAhYl9zaGEpIHx8CisJCSAgICAoc2hhX2VxKGFfc2hhLCBvX3NoYSkgJiYgIWJfc2hhKSB8fAorCQkgICAgKCFhX3NoYSAmJiBzaGFfZXEoYl9zaGEsIG9fc2hhKSkpIHsKKwkJCS8qIERlbGV0ZWQgaW4gYm90aCBvciBkZWxldGVkIGluIG9uZSBhbmQKKwkJCSAqIHVuY2hhbmdlZCBpbiB0aGUgb3RoZXIgKi8KKwkJCWlmIChhX3NoYSkKKwkJCQlvdXRwdXQoMiwgIlJlbW92ZWQgJXMiLCBwYXRoKTsKKwkJCS8qIGRvIG5vdCB0b3VjaCB3b3JraW5nIGZpbGUgaWYgaXQgZGlkIG5vdCBleGlzdCAqLworCQkJcmVtb3ZlX2ZpbGUoMSwgcGF0aCwgIWFfc2hhKTsKKwkJfSBlbHNlIHsKKwkJCS8qIERlbGV0ZWQgaW4gb25lIGFuZCBjaGFuZ2VkIGluIHRoZSBvdGhlciAqLworCQkJY2xlYW5fbWVyZ2UgPSAwOworCQkJaWYgKCFhX3NoYSkgeworCQkJCW91dHB1dCgxLCAiQ09ORkxJQ1QgKGRlbGV0ZS9tb2RpZnkpOiAlcyBkZWxldGVkIGluICVzICIKKwkJCQkgICAgICAgImFuZCBtb2RpZmllZCBpbiAlcy4gVmVyc2lvbiAlcyBvZiAlcyBsZWZ0IGluIHRyZWUuIiwKKwkJCQkgICAgICAgcGF0aCwgYnJhbmNoMSwKKwkJCQkgICAgICAgYnJhbmNoMiwgYnJhbmNoMiwgcGF0aCk7CisJCQkJdXBkYXRlX2ZpbGUoMCwgYl9zaGEsIGJfbW9kZSwgcGF0aCk7CisJCQl9IGVsc2UgeworCQkJCW91dHB1dCgxLCAiQ09ORkxJQ1QgKGRlbGV0ZS9tb2RpZnkpOiAlcyBkZWxldGVkIGluICVzICIKKwkJCQkgICAgICAgImFuZCBtb2RpZmllZCBpbiAlcy4gVmVyc2lvbiAlcyBvZiAlcyBsZWZ0IGluIHRyZWUuIiwKKwkJCQkgICAgICAgcGF0aCwgYnJhbmNoMiwKKwkJCQkgICAgICAgYnJhbmNoMSwgYnJhbmNoMSwgcGF0aCk7CisJCQkJdXBkYXRlX2ZpbGUoMCwgYV9zaGEsIGFfbW9kZSwgcGF0aCk7CisJCQl9CisJCX0KKworCX0gZWxzZSBpZiAoKCFvX3NoYSAmJiBhX3NoYSAmJiAhYl9zaGEpIHx8CisJCSAgICghb19zaGEgJiYgIWFfc2hhICYmIGJfc2hhKSkgeworCQkvKiBDYXNlIEI6IEFkZGVkIGluIG9uZS4gKi8KKwkJY29uc3QgY2hhciAqYWRkX2JyYW5jaDsKKwkJY29uc3QgY2hhciAqb3RoZXJfYnJhbmNoOworCQl1bnNpZ25lZCBtb2RlOworCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaGE7CisJCWNvbnN0IGNoYXIgKmNvbmY7CisKKwkJaWYgKGFfc2hhKSB7CisJCQlhZGRfYnJhbmNoID0gYnJhbmNoMTsKKwkJCW90aGVyX2JyYW5jaCA9IGJyYW5jaDI7CisJCQltb2RlID0gYV9tb2RlOworCQkJc2hhID0gYV9zaGE7CisJCQljb25mID0gImZpbGUvZGlyZWN0b3J5IjsKKwkJfSBlbHNlIHsKKwkJCWFkZF9icmFuY2ggPSBicmFuY2gyOworCQkJb3RoZXJfYnJhbmNoID0gYnJhbmNoMTsKKwkJCW1vZGUgPSBiX21vZGU7CisJCQlzaGEgPSBiX3NoYTsKKwkJCWNvbmYgPSAiZGlyZWN0b3J5L2ZpbGUiOworCQl9CisJCWlmIChwYXRoX2xpc3RfaGFzX3BhdGgoJmN1cnJlbnRfZGlyZWN0b3J5X3NldCwgcGF0aCkpIHsKKwkJCWNvbnN0IGNoYXIgKm5ld19wYXRoID0gdW5pcXVlX3BhdGgocGF0aCwgYWRkX2JyYW5jaCk7CisJCQljbGVhbl9tZXJnZSA9IDA7CisJCQlvdXRwdXQoMSwgIkNPTkZMSUNUICglcyk6IFRoZXJlIGlzIGEgZGlyZWN0b3J5IHdpdGggbmFtZSAlcyBpbiAlcy4gIgorCQkJICAgICAgICJBZGRlZCAlcyBhcyAlcyIsCisJCQkgICAgICAgY29uZiwgcGF0aCwgb3RoZXJfYnJhbmNoLCBwYXRoLCBuZXdfcGF0aCk7CisJCQlyZW1vdmVfZmlsZSgwLCBwYXRoLCAwKTsKKwkJCXVwZGF0ZV9maWxlKDAsIHNoYSwgbW9kZSwgbmV3X3BhdGgpOworCQl9IGVsc2UgeworCQkJb3V0cHV0KDIsICJBZGRlZCAlcyIsIHBhdGgpOworCQkJdXBkYXRlX2ZpbGUoMSwgc2hhLCBtb2RlLCBwYXRoKTsKKwkJfQorCX0gZWxzZSBpZiAoYV9zaGEgJiYgYl9zaGEpIHsKKwkJLyogQ2FzZSBDOiBBZGRlZCBpbiBib3RoIChjaGVjayBmb3Igc2FtZSBwZXJtaXNzaW9ucykgYW5kICovCisJCS8qIGNhc2UgRDogTW9kaWZpZWQgaW4gYm90aCwgYnV0IGRpZmZlcmVudGx5LiAqLworCQljb25zdCBjaGFyICpyZWFzb24gPSAiY29udGVudCI7CisJCXN0cnVjdCBtZXJnZV9maWxlX2luZm8gbWZpOworCQlzdHJ1Y3QgZGlmZl9maWxlc3BlYyBvLCBhLCBiOworCisJCWlmICghb19zaGEpIHsKKwkJCXJlYXNvbiA9ICJhZGQvYWRkIjsKKwkJCW9fc2hhID0gKHVuc2lnbmVkIGNoYXIgKiludWxsX3NoYTE7CisJCX0KKwkJb3V0cHV0KDIsICJBdXRvLW1lcmdlZCAlcyIsIHBhdGgpOworCQlvLnBhdGggPSBhLnBhdGggPSBiLnBhdGggPSAoY2hhciAqKXBhdGg7CisJCWhhc2hjcHkoby5zaGExLCBvX3NoYSk7CisJCW8ubW9kZSA9IG9fbW9kZTsKKwkJaGFzaGNweShhLnNoYTEsIGFfc2hhKTsKKwkJYS5tb2RlID0gYV9tb2RlOworCQloYXNoY3B5KGIuc2hhMSwgYl9zaGEpOworCQliLm1vZGUgPSBiX21vZGU7CisKKwkJbWZpID0gbWVyZ2VfZmlsZSgmbywgJmEsICZiLAorCQkJCSBicmFuY2gxLCBicmFuY2gyKTsKKworCQljbGVhbl9tZXJnZSA9IG1maS5jbGVhbjsKKwkJaWYgKG1maS5jbGVhbikKKwkJCXVwZGF0ZV9maWxlKDEsIG1maS5zaGEsIG1maS5tb2RlLCBwYXRoKTsKKwkJZWxzZSBpZiAoU19JU0dJVExJTksobWZpLm1vZGUpKQorCQkJb3V0cHV0KDEsICJDT05GTElDVCAoc3VibW9kdWxlKTogTWVyZ2UgY29uZmxpY3QgaW4gJXMgIgorCQkJICAgICAgICItIG5lZWRzICVzIiwgcGF0aCwgc2hhMV90b19oZXgoYi5zaGExKSk7CisJCWVsc2UgeworCQkJb3V0cHV0KDEsICJDT05GTElDVCAoJXMpOiBNZXJnZSBjb25mbGljdCBpbiAlcyIsCisJCQkJCXJlYXNvbiwgcGF0aCk7CisKKwkJCWlmIChpbmRleF9vbmx5KQorCQkJCXVwZGF0ZV9maWxlKDAsIG1maS5zaGEsIG1maS5tb2RlLCBwYXRoKTsKKwkJCWVsc2UKKwkJCQl1cGRhdGVfZmlsZV9mbGFncyhtZmkuc2hhLCBtZmkubW9kZSwgcGF0aCwKKwkJCQkJICAgICAgMCAvKiB1cGRhdGVfY2FjaGUgKi8sIDEgLyogdXBkYXRlX3dvcmtpbmdfZGlyZWN0b3J5ICovKTsKKwkJfQorCX0gZWxzZSBpZiAoIW9fc2hhICYmICFhX3NoYSAmJiAhYl9zaGEpIHsKKwkJLyoKKwkJICogdGhpcyBlbnRyeSB3YXMgZGVsZXRlZCBhbHRvZ2V0aGVyLiBhX21vZGUgPT0gMCBtZWFucworCQkgKiB3ZSBoYWQgdGhhdCBwYXRoIGFuZCB3YW50IHRvIGFjdGl2ZWx5IHJlbW92ZSBpdC4KKwkJICovCisJCXJlbW92ZV9maWxlKDEsIHBhdGgsICFhX21vZGUpOworCX0gZWxzZQorCQlkaWUoIkZhdGFsIG1lcmdlIGZhaWx1cmUsIHNob3VsZG4ndCBoYXBwZW4uIik7CisKKwlyZXR1cm4gY2xlYW5fbWVyZ2U7Cit9CisKK2ludCBtZXJnZV90cmVlcyhzdHJ1Y3QgdHJlZSAqaGVhZCwKKwkJc3RydWN0IHRyZWUgKm1lcmdlLAorCQlzdHJ1Y3QgdHJlZSAqY29tbW9uLAorCQljb25zdCBjaGFyICpicmFuY2gxLAorCQljb25zdCBjaGFyICpicmFuY2gyLAorCQlzdHJ1Y3QgdHJlZSAqKnJlc3VsdCkKK3sKKwlpbnQgY29kZSwgY2xlYW47CisKKwlpZiAoc3VidHJlZV9tZXJnZSkgeworCQltZXJnZSA9IHNoaWZ0X3RyZWVfb2JqZWN0KGhlYWQsIG1lcmdlKTsKKwkJY29tbW9uID0gc2hpZnRfdHJlZV9vYmplY3QoaGVhZCwgY29tbW9uKTsKKwl9CisKKwlpZiAoc2hhX2VxKGNvbW1vbi0+b2JqZWN0LnNoYTEsIG1lcmdlLT5vYmplY3Quc2hhMSkpIHsKKwkJb3V0cHV0KDAsICJBbHJlYWR5IHVwdG9kYXRlISIpOworCQkqcmVzdWx0ID0gaGVhZDsKKwkJcmV0dXJuIDE7CisJfQorCisJY29kZSA9IGdpdF9tZXJnZV90cmVlcyhpbmRleF9vbmx5LCBjb21tb24sIGhlYWQsIG1lcmdlKTsKKworCWlmIChjb2RlICE9IDApCisJCWRpZSgibWVyZ2luZyBvZiB0cmVlcyAlcyBhbmQgJXMgZmFpbGVkIiwKKwkJICAgIHNoYTFfdG9faGV4KGhlYWQtPm9iamVjdC5zaGExKSwKKwkJICAgIHNoYTFfdG9faGV4KG1lcmdlLT5vYmplY3Quc2hhMSkpOworCisJaWYgKHVubWVyZ2VkX2NhY2hlKCkpIHsKKwkJc3RydWN0IHBhdGhfbGlzdCAqZW50cmllcywgKnJlX2hlYWQsICpyZV9tZXJnZTsKKwkJaW50IGk7CisJCXBhdGhfbGlzdF9jbGVhcigmY3VycmVudF9maWxlX3NldCwgMSk7CisJCXBhdGhfbGlzdF9jbGVhcigmY3VycmVudF9kaXJlY3Rvcnlfc2V0LCAxKTsKKwkJZ2V0X2ZpbGVzX2RpcnMoaGVhZCk7CisJCWdldF9maWxlc19kaXJzKG1lcmdlKTsKKworCQllbnRyaWVzID0gZ2V0X3VubWVyZ2VkKCk7CisJCXJlX2hlYWQgID0gZ2V0X3JlbmFtZXMoaGVhZCwgY29tbW9uLCBoZWFkLCBtZXJnZSwgZW50cmllcyk7CisJCXJlX21lcmdlID0gZ2V0X3JlbmFtZXMobWVyZ2UsIGNvbW1vbiwgaGVhZCwgbWVyZ2UsIGVudHJpZXMpOworCQljbGVhbiA9IHByb2Nlc3NfcmVuYW1lcyhyZV9oZWFkLCByZV9tZXJnZSwKKwkJCQlicmFuY2gxLCBicmFuY2gyKTsKKwkJZm9yIChpID0gMDsgaSA8IGVudHJpZXMtPm5yOyBpKyspIHsKKwkJCWNvbnN0IGNoYXIgKnBhdGggPSBlbnRyaWVzLT5pdGVtc1tpXS5wYXRoOworCQkJc3RydWN0IHN0YWdlX2RhdGEgKmUgPSBlbnRyaWVzLT5pdGVtc1tpXS51dGlsOworCQkJaWYgKCFlLT5wcm9jZXNzZWQKKwkJCQkmJiAhcHJvY2Vzc19lbnRyeShwYXRoLCBlLCBicmFuY2gxLCBicmFuY2gyKSkKKwkJCQljbGVhbiA9IDA7CisJCX0KKworCQlwYXRoX2xpc3RfY2xlYXIocmVfbWVyZ2UsIDApOworCQlwYXRoX2xpc3RfY2xlYXIocmVfaGVhZCwgMCk7CisJCXBhdGhfbGlzdF9jbGVhcihlbnRyaWVzLCAxKTsKKworCX0KKwllbHNlCisJCWNsZWFuID0gMTsKKworCWlmIChpbmRleF9vbmx5KQorCQkqcmVzdWx0ID0gd3JpdGVfdHJlZV9mcm9tX21lbW9yeSgpOworCisJcmV0dXJuIGNsZWFuOworfQorCitzdGF0aWMgc3RydWN0IGNvbW1pdF9saXN0ICpyZXZlcnNlX2NvbW1pdF9saXN0KHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKm5leHQgPSBOVUxMLCAqY3VycmVudCwgKmJhY2t1cDsKKwlmb3IgKGN1cnJlbnQgPSBsaXN0OyBjdXJyZW50OyBjdXJyZW50ID0gYmFja3VwKSB7CisJCWJhY2t1cCA9IGN1cnJlbnQtPm5leHQ7CisJCWN1cnJlbnQtPm5leHQgPSBuZXh0OworCQluZXh0ID0gY3VycmVudDsKKwl9CisJcmV0dXJuIG5leHQ7Cit9CisKKy8qCisgKiBNZXJnZSB0aGUgY29tbWl0cyBoMSBhbmQgaDIsIHJldHVybiB0aGUgcmVzdWx0aW5nIHZpcnR1YWwKKyAqIGNvbW1pdCBvYmplY3QgYW5kIGEgZmxhZyBpbmRpY2F0aW5nIHRoZSBjbGVhbm5lc3Mgb2YgdGhlIG1lcmdlLgorICovCitpbnQgbWVyZ2VfcmVjdXJzaXZlKHN0cnVjdCBjb21taXQgKmgxLAorCQkgICAgc3RydWN0IGNvbW1pdCAqaDIsCisJCSAgICBjb25zdCBjaGFyICpicmFuY2gxLAorCQkgICAgY29uc3QgY2hhciAqYnJhbmNoMiwKKwkJICAgIHN0cnVjdCBjb21taXRfbGlzdCAqY2EsCisJCSAgICBzdHJ1Y3QgY29tbWl0ICoqcmVzdWx0KQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqaXRlcjsKKwlzdHJ1Y3QgY29tbWl0ICptZXJnZWRfY29tbW9uX2FuY2VzdG9yczsKKwlzdHJ1Y3QgdHJlZSAqbXJ0cmVlID0gbXJ0cmVlOworCWludCBjbGVhbjsKKworCWlmIChzaG93KDQpKSB7CisJCW91dHB1dCg0LCAiTWVyZ2luZzoiKTsKKwkJb3V0cHV0X2NvbW1pdF90aXRsZShoMSk7CisJCW91dHB1dF9jb21taXRfdGl0bGUoaDIpOworCX0KKworCWlmICghY2EpIHsKKwkJY2EgPSBnZXRfbWVyZ2VfYmFzZXMoaDEsIGgyLCAxKTsKKwkJY2EgPSByZXZlcnNlX2NvbW1pdF9saXN0KGNhKTsKKwl9CisKKwlpZiAoc2hvdyg1KSkgeworCQlvdXRwdXQoNSwgImZvdW5kICV1IGNvbW1vbiBhbmNlc3RvcihzKToiLCBjb21taXRfbGlzdF9jb3VudChjYSkpOworCQlmb3IgKGl0ZXIgPSBjYTsgaXRlcjsgaXRlciA9IGl0ZXItPm5leHQpCisJCQlvdXRwdXRfY29tbWl0X3RpdGxlKGl0ZXItPml0ZW0pOworCX0KKworCW1lcmdlZF9jb21tb25fYW5jZXN0b3JzID0gcG9wX2NvbW1pdCgmY2EpOworCWlmIChtZXJnZWRfY29tbW9uX2FuY2VzdG9ycyA9PSBOVUxMKSB7CisJCS8qIGlmIHRoZXJlIGlzIG5vIGNvbW1vbiBhbmNlc3RvciwgbWFrZSBhbiBlbXB0eSB0cmVlICovCisJCXN0cnVjdCB0cmVlICp0cmVlID0geGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRyZWUpKTsKKworCQl0cmVlLT5vYmplY3QucGFyc2VkID0gMTsKKwkJdHJlZS0+b2JqZWN0LnR5cGUgPSBPQkpfVFJFRTsKKwkJcHJldGVuZF9zaGExX2ZpbGUoTlVMTCwgMCwgT0JKX1RSRUUsIHRyZWUtPm9iamVjdC5zaGExKTsKKwkJbWVyZ2VkX2NvbW1vbl9hbmNlc3RvcnMgPSBtYWtlX3ZpcnR1YWxfY29tbWl0KHRyZWUsICJhbmNlc3RvciIpOworCX0KKworCWZvciAoaXRlciA9IGNhOyBpdGVyOyBpdGVyID0gaXRlci0+bmV4dCkgeworCQljYWxsX2RlcHRoKys7CisJCS8qCisJCSAqIFdoZW4gdGhlIG1lcmdlIGZhaWxzLCB0aGUgcmVzdWx0IGNvbnRhaW5zIGZpbGVzCisJCSAqIHdpdGggY29uZmxpY3QgbWFya2Vycy4gVGhlIGNsZWFubmVzcyBmbGFnIGlzCisJCSAqIGlnbm9yZWQsIGl0IHdhcyBuZXZlciBhY3R1YWxseSB1c2VkLCBhcyByZXN1bHQgb2YKKwkJICogbWVyZ2VfdHJlZXMgaGFzIGFsd2F5cyBvdmVyd3JpdHRlbiBpdDogdGhlIGNvbW1pdHRlZAorCQkgKiAiY29uZmxpY3RzIiB3ZXJlIGFscmVhZHkgcmVzb2x2ZWQuCisJCSAqLworCQlkaXNjYXJkX2NhY2hlKCk7CisJCW1lcmdlX3JlY3Vyc2l2ZShtZXJnZWRfY29tbW9uX2FuY2VzdG9ycywgaXRlci0+aXRlbSwKKwkJCQkiVGVtcG9yYXJ5IG1lcmdlIGJyYW5jaCAxIiwKKwkJCQkiVGVtcG9yYXJ5IG1lcmdlIGJyYW5jaCAyIiwKKwkJCQlOVUxMLAorCQkJCSZtZXJnZWRfY29tbW9uX2FuY2VzdG9ycyk7CisJCWNhbGxfZGVwdGgtLTsKKworCQlpZiAoIW1lcmdlZF9jb21tb25fYW5jZXN0b3JzKQorCQkJZGllKCJtZXJnZSByZXR1cm5lZCBubyBjb21taXQiKTsKKwl9CisKKwlkaXNjYXJkX2NhY2hlKCk7CisJaWYgKCFjYWxsX2RlcHRoKSB7CisJCXJlYWRfY2FjaGUoKTsKKwkJaW5kZXhfb25seSA9IDA7CisJfSBlbHNlCisJCWluZGV4X29ubHkgPSAxOworCisJY2xlYW4gPSBtZXJnZV90cmVlcyhoMS0+dHJlZSwgaDItPnRyZWUsIG1lcmdlZF9jb21tb25fYW5jZXN0b3JzLT50cmVlLAorCQkJICAgIGJyYW5jaDEsIGJyYW5jaDIsICZtcnRyZWUpOworCisJaWYgKGluZGV4X29ubHkpIHsKKwkJKnJlc3VsdCA9IG1ha2VfdmlydHVhbF9jb21taXQobXJ0cmVlLCAibWVyZ2VkIHRyZWUiKTsKKwkJY29tbWl0X2xpc3RfaW5zZXJ0KGgxLCAmKCpyZXN1bHQpLT5wYXJlbnRzKTsKKwkJY29tbWl0X2xpc3RfaW5zZXJ0KGgyLCAmKCpyZXN1bHQpLT5wYXJlbnRzLT5uZXh0KTsKKwl9CisJZmx1c2hfb3V0cHV0KCk7CisJcmV0dXJuIGNsZWFuOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYmV0dGVyX2JyYW5jaF9uYW1lKGNvbnN0IGNoYXIgKmJyYW5jaCkKK3sKKwlzdGF0aWMgY2hhciBnaXRoZWFkX2Vudls4ICsgNDAgKyAxXTsKKwljaGFyICpuYW1lOworCisJaWYgKHN0cmxlbihicmFuY2gpICE9IDQwKQorCQlyZXR1cm4gYnJhbmNoOworCXNwcmludGYoZ2l0aGVhZF9lbnYsICJHSVRIRUFEXyVzIiwgYnJhbmNoKTsKKwluYW1lID0gZ2V0ZW52KGdpdGhlYWRfZW52KTsKKwlyZXR1cm4gbmFtZSA/IG5hbWUgOiBicmFuY2g7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0ICpnZXRfcmVmKGNvbnN0IGNoYXIgKnJlZikKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXN0cnVjdCBvYmplY3QgKm9iamVjdDsKKworCWlmIChnZXRfc2hhMShyZWYsIHNoYTEpKQorCQlkaWUoIkNvdWxkIG5vdCByZXNvbHZlIHJlZiAnJXMnIiwgcmVmKTsKKwlvYmplY3QgPSBkZXJlZl90YWcocGFyc2Vfb2JqZWN0KHNoYTEpLCByZWYsIHN0cmxlbihyZWYpKTsKKwlpZiAoIW9iamVjdCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG9iamVjdC0+dHlwZSA9PSBPQkpfVFJFRSkKKwkJcmV0dXJuIG1ha2VfdmlydHVhbF9jb21taXQoKHN0cnVjdCB0cmVlKilvYmplY3QsCisJCQliZXR0ZXJfYnJhbmNoX25hbWUocmVmKSk7CisJaWYgKG9iamVjdC0+dHlwZSAhPSBPQkpfQ09NTUlUKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAocGFyc2VfY29tbWl0KChzdHJ1Y3QgY29tbWl0ICopb2JqZWN0KSkKKwkJZGllKCJDb3VsZCBub3QgcGFyc2UgY29tbWl0ICclcyciLCBzaGExX3RvX2hleChvYmplY3QtPnNoYTEpKTsKKwlyZXR1cm4gKHN0cnVjdCBjb21taXQgKilvYmplY3Q7Cit9CisKK3N0YXRpYyBpbnQgbWVyZ2VfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCFzdHJjYXNlY21wKHZhciwgIm1lcmdlLnZlcmJvc2l0eSIpKSB7CisJCXZlcmJvc2l0eSA9IGdpdF9jb25maWdfaW50KHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjYXNlY21wKHZhciwgImRpZmYucmVuYW1lbGltaXQiKSkgeworCQlyZW5hbWVfbGltaXQgPSBnaXRfY29uZmlnX2ludCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBnaXRfZGVmYXVsdF9jb25maWcodmFyLCB2YWx1ZSk7Cit9CisKK2ludCBjbWRfbWVyZ2VfcmVjdXJzaXZlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXN0YXRpYyBjb25zdCBjaGFyICpiYXNlc1syMF07CisJc3RhdGljIHVuc2lnbmVkIGJhc2VzX2NvdW50ID0gMDsKKwlpbnQgaSwgY2xlYW47CisJY29uc3QgY2hhciAqYnJhbmNoMSwgKmJyYW5jaDI7CisJc3RydWN0IGNvbW1pdCAqcmVzdWx0LCAqaDEsICpoMjsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKmNhID0gTlVMTDsKKwlzdHJ1Y3QgbG9ja19maWxlICpsb2NrID0geGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGxvY2tfZmlsZSkpOworCWludCBpbmRleF9mZDsKKworCWlmIChhcmd2WzBdKSB7CisJCWludCBuYW1lbGVuID0gc3RybGVuKGFyZ3ZbMF0pOworCQlpZiAoOCA8IG5hbWVsZW4gJiYKKwkJICAgICFzdHJjbXAoYXJndlswXSArIG5hbWVsZW4gLSA4LCAiLXN1YnRyZWUiKSkKKwkJCXN1YnRyZWVfbWVyZ2UgPSAxOworCX0KKworCWdpdF9jb25maWcobWVyZ2VfY29uZmlnKTsKKwlpZiAoZ2V0ZW52KCJHSVRfTUVSR0VfVkVSQk9TSVRZIikpCisJCXZlcmJvc2l0eSA9IHN0cnRvbChnZXRlbnYoIkdJVF9NRVJHRV9WRVJCT1NJVFkiKSwgTlVMTCwgMTApOworCisJaWYgKGFyZ2MgPCA0KQorCQlkaWUoIlVzYWdlOiAlcyA8YmFzZT4uLi4gLS0gPGhlYWQ+IDxyZW1vdGU+IC4uLlxuIiwgYXJndlswXSk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgKytpKSB7CisJCWlmICghc3RyY21wKGFyZ3ZbaV0sICItLSIpKQorCQkJYnJlYWs7CisJCWlmIChiYXNlc19jb3VudCA8IHNpemVvZihiYXNlcykvc2l6ZW9mKCpiYXNlcykpCisJCQliYXNlc1tiYXNlc19jb3VudCsrXSA9IGFyZ3ZbaV07CisJfQorCWlmIChhcmdjIC0gaSAhPSAzKSAvKiAiLS0iICI8aGVhZD4iICI8cmVtb3RlPiIgKi8KKwkJZGllKCJOb3QgaGFuZGxpbmcgYW55dGhpbmcgb3RoZXIgdGhhbiB0d28gaGVhZHMgbWVyZ2UuIik7CisJaWYgKHZlcmJvc2l0eSA+PSA1KQorCQlidWZmZXJfb3V0cHV0ID0gMDsKKworCWJyYW5jaDEgPSBhcmd2WysraV07CisJYnJhbmNoMiA9IGFyZ3ZbKytpXTsKKworCWgxID0gZ2V0X3JlZihicmFuY2gxKTsKKwloMiA9IGdldF9yZWYoYnJhbmNoMik7CisKKwlicmFuY2gxID0gYmV0dGVyX2JyYW5jaF9uYW1lKGJyYW5jaDEpOworCWJyYW5jaDIgPSBiZXR0ZXJfYnJhbmNoX25hbWUoYnJhbmNoMik7CisKKwlpZiAoc2hvdygzKSkKKwkJcHJpbnRmKCJNZXJnaW5nICVzIHdpdGggJXNcbiIsIGJyYW5jaDEsIGJyYW5jaDIpOworCisJaW5kZXhfZmQgPSBob2xkX2xvY2tlZF9pbmRleChsb2NrLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBiYXNlc19jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBjb21taXQgKmFuY2VzdG9yID0gZ2V0X3JlZihiYXNlc1tpXSk7CisJCWNhID0gY29tbWl0X2xpc3RfaW5zZXJ0KGFuY2VzdG9yLCAmY2EpOworCX0KKwljbGVhbiA9IG1lcmdlX3JlY3Vyc2l2ZShoMSwgaDIsIGJyYW5jaDEsIGJyYW5jaDIsIGNhLCAmcmVzdWx0KTsKKworCWlmIChhY3RpdmVfY2FjaGVfY2hhbmdlZCAmJgorCSAgICAod3JpdGVfY2FjaGUoaW5kZXhfZmQsIGFjdGl2ZV9jYWNoZSwgYWN0aXZlX25yKSB8fAorCSAgICAgY29tbWl0X2xvY2tlZF9pbmRleChsb2NrKSkpCisJCQlkaWUgKCJ1bmFibGUgdG8gd3JpdGUgJXMiLCBnZXRfaW5kZXhfZmlsZSgpKTsKKworCXJldHVybiBjbGVhbiA/IDA6IDE7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLW12LmMgYi9idWlsdGluLW12LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRmNmRkMgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tbXYuYwpAQCAtMCwwICsxLDI3MyBAQAorLyoKKyAqICJnaXQgbXYiIGJ1aWx0aW4gY29tbWFuZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBKb2hhbm5lcyBTY2hpbmRlbGluCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJkaXIuaCIKKyNpbmNsdWRlICJjYWNoZS10cmVlLmgiCisjaW5jbHVkZSAicGF0aC1saXN0LmgiCisjaW5jbHVkZSAicGFyc2Utb3B0aW9ucy5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJ1aWx0aW5fbXZfdXNhZ2VbXSA9IHsKKwkiZ2l0LW12IFtvcHRpb25zXSA8c291cmNlPi4uLiA8ZGVzdGluYXRpb24+IiwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqKmNvcHlfcGF0aHNwZWMoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICoqcGF0aHNwZWMsCisJCQkJICBpbnQgY291bnQsIGludCBiYXNlX25hbWUpCit7CisJaW50IGk7CisJY29uc3QgY2hhciAqKnJlc3VsdCA9IHhtYWxsb2MoKGNvdW50ICsgMSkgKiBzaXplb2YoY29uc3QgY2hhciAqKSk7CisJbWVtY3B5KHJlc3VsdCwgcGF0aHNwZWMsIGNvdW50ICogc2l6ZW9mKGNvbnN0IGNoYXIgKikpOworCXJlc3VsdFtjb3VudF0gPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWludCBsZW5ndGggPSBzdHJsZW4ocmVzdWx0W2ldKTsKKwkJaWYgKGxlbmd0aCA+IDAgJiYgcmVzdWx0W2ldW2xlbmd0aCAtIDFdID09ICcvJykgeworCQkJcmVzdWx0W2ldID0geG1lbWR1cHoocmVzdWx0W2ldLCBsZW5ndGggLSAxKTsKKwkJfQorCQlpZiAoYmFzZV9uYW1lKSB7CisJCQljb25zdCBjaGFyICpsYXN0X3NsYXNoID0gc3RycmNocihyZXN1bHRbaV0sICcvJyk7CisJCQlpZiAobGFzdF9zbGFzaCkKKwkJCQlyZXN1bHRbaV0gPSBsYXN0X3NsYXNoICsgMTsKKwkJfQorCX0KKwlyZXR1cm4gZ2V0X3BhdGhzcGVjKHByZWZpeCwgcmVzdWx0KTsKK30KKworc3RhdGljIHZvaWQgc2hvd19saXN0KGNvbnN0IGNoYXIgKmxhYmVsLCBzdHJ1Y3QgcGF0aF9saXN0ICpsaXN0KQoreworCWlmIChsaXN0LT5uciA+IDApIHsKKwkJaW50IGk7CisJCXByaW50ZigiJXMiLCBsYWJlbCk7CisJCWZvciAoaSA9IDA7IGkgPCBsaXN0LT5ucjsgaSsrKQorCQkJcHJpbnRmKCIlcyVzIiwgaSA+IDAgPyAiLCAiIDogIiIsIGxpc3QtPml0ZW1zW2ldLnBhdGgpOworCQlwdXRjaGFyKCdcbicpOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmFkZF9zbGFzaChjb25zdCBjaGFyICpwYXRoKQoreworCWludCBsZW4gPSBzdHJsZW4ocGF0aCk7CisJaWYgKHBhdGhbbGVuIC0gMV0gIT0gJy8nKSB7CisJCWNoYXIgKndpdGhfc2xhc2ggPSB4bWFsbG9jKGxlbiArIDIpOworCQltZW1jcHkod2l0aF9zbGFzaCwgcGF0aCwgbGVuKTsKKwkJd2l0aF9zbGFzaFtsZW4rK10gPSAnLyc7CisJCXdpdGhfc2xhc2hbbGVuXSA9IDA7CisJCXJldHVybiB3aXRoX3NsYXNoOworCX0KKwlyZXR1cm4gcGF0aDsKK30KKworc3RhdGljIHN0cnVjdCBsb2NrX2ZpbGUgbG9ja19maWxlOworCitpbnQgY21kX212KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBpLCBuZXdmZDsKKwlpbnQgdmVyYm9zZSA9IDAsIHNob3dfb25seSA9IDAsIGZvcmNlID0gMCwgaWdub3JlX2Vycm9ycyA9IDA7CisJc3RydWN0IG9wdGlvbiBidWlsdGluX212X29wdGlvbnNbXSA9IHsKKwkJT1BUX19EUllfUlVOKCZzaG93X29ubHkpLAorCQlPUFRfQk9PTEVBTignZicsIE5VTEwsICZmb3JjZSwgImZvcmNlIG1vdmUvcmVuYW1lIGV2ZW4gaWYgdGFyZ2V0IGV4aXN0cyIpLAorCQlPUFRfQk9PTEVBTignaycsIE5VTEwsICZpZ25vcmVfZXJyb3JzLCAic2tpcCBtb3ZlL3JlbmFtZSBlcnJvcnMiKSwKKwkJT1BUX0VORCgpLAorCX07CisJY29uc3QgY2hhciAqKnNvdXJjZSwgKipkZXN0aW5hdGlvbiwgKipkZXN0X3BhdGg7CisJZW51bSB1cGRhdGVfbW9kZSB7IEJPVEggPSAwLCBXT1JLSU5HX0RJUkVDVE9SWSwgSU5ERVggfSAqbW9kZXM7CisJc3RydWN0IHN0YXQgc3Q7CisJc3RydWN0IHBhdGhfbGlzdCBvdmVyd3JpdHRlbiA9IHtOVUxMLCAwLCAwLCAwfTsKKwlzdHJ1Y3QgcGF0aF9saXN0IHNyY19mb3JfZHN0ID0ge05VTEwsIDAsIDAsIDB9OworCXN0cnVjdCBwYXRoX2xpc3QgYWRkZWQgPSB7TlVMTCwgMCwgMCwgMH07CisJc3RydWN0IHBhdGhfbGlzdCBkZWxldGVkID0ge05VTEwsIDAsIDAsIDB9OworCXN0cnVjdCBwYXRoX2xpc3QgY2hhbmdlZCA9IHtOVUxMLCAwLCAwLCAwfTsKKworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCW5ld2ZkID0gaG9sZF9sb2NrZWRfaW5kZXgoJmxvY2tfZmlsZSwgMSk7CisJaWYgKHJlYWRfY2FjaGUoKSA8IDApCisJCWRpZSgiaW5kZXggZmlsZSBjb3JydXB0Iik7CisKKwlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBidWlsdGluX212X29wdGlvbnMsIGJ1aWx0aW5fbXZfdXNhZ2UsIDApOworCWlmICgtLWFyZ2MgPCAxKQorCQl1c2FnZV93aXRoX29wdGlvbnMoYnVpbHRpbl9tdl91c2FnZSwgYnVpbHRpbl9tdl9vcHRpb25zKTsKKworCXNvdXJjZSA9IGNvcHlfcGF0aHNwZWMocHJlZml4LCBhcmd2LCBhcmdjLCAwKTsKKwltb2RlcyA9IHhjYWxsb2MoYXJnYywgc2l6ZW9mKGVudW0gdXBkYXRlX21vZGUpKTsKKwlkZXN0X3BhdGggPSBjb3B5X3BhdGhzcGVjKHByZWZpeCwgYXJndiArIGFyZ2MsIDEsIDApOworCisJaWYgKGRlc3RfcGF0aFswXVswXSA9PSAnXDAnKQorCQkvKiBzcGVjaWFsIGNhc2U6ICIuIiB3YXMgbm9ybWFsaXplZCB0byAiIiAqLworCQlkZXN0aW5hdGlvbiA9IGNvcHlfcGF0aHNwZWMoZGVzdF9wYXRoWzBdLCBhcmd2LCBhcmdjLCAxKTsKKwllbHNlIGlmICghbHN0YXQoZGVzdF9wYXRoWzBdLCAmc3QpICYmCisJCQlTX0lTRElSKHN0LnN0X21vZGUpKSB7CisJCWRlc3RfcGF0aFswXSA9IGFkZF9zbGFzaChkZXN0X3BhdGhbMF0pOworCQlkZXN0aW5hdGlvbiA9IGNvcHlfcGF0aHNwZWMoZGVzdF9wYXRoWzBdLCBhcmd2LCBhcmdjLCAxKTsKKwl9IGVsc2UgeworCQlpZiAoYXJnYyAhPSAxKQorCQkJdXNhZ2Vfd2l0aF9vcHRpb25zKGJ1aWx0aW5fbXZfdXNhZ2UsIGJ1aWx0aW5fbXZfb3B0aW9ucyk7CisJCWRlc3RpbmF0aW9uID0gZGVzdF9wYXRoOworCX0KKworCS8qIENoZWNraW5nICovCisJZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICpzcmMgPSBzb3VyY2VbaV0sICpkc3QgPSBkZXN0aW5hdGlvbltpXTsKKwkJaW50IGxlbmd0aCwgc3JjX2lzX2RpcjsKKwkJY29uc3QgY2hhciAqYmFkID0gTlVMTDsKKworCQlpZiAoc2hvd19vbmx5KQorCQkJcHJpbnRmKCJDaGVja2luZyByZW5hbWUgb2YgJyVzJyB0byAnJXMnXG4iLCBzcmMsIGRzdCk7CisKKwkJbGVuZ3RoID0gc3RybGVuKHNyYyk7CisJCWlmIChsc3RhdChzcmMsICZzdCkgPCAwKQorCQkJYmFkID0gImJhZCBzb3VyY2UiOworCQllbHNlIGlmICghc3RybmNtcChzcmMsIGRzdCwgbGVuZ3RoKSAmJgorCQkJCShkc3RbbGVuZ3RoXSA9PSAwIHx8IGRzdFtsZW5ndGhdID09ICcvJykpIHsKKwkJCWJhZCA9ICJjYW4gbm90IG1vdmUgZGlyZWN0b3J5IGludG8gaXRzZWxmIjsKKwkJfSBlbHNlIGlmICgoc3JjX2lzX2RpciA9IFNfSVNESVIoc3Quc3RfbW9kZSkpCisJCQkJJiYgbHN0YXQoZHN0LCAmc3QpID09IDApCisJCQliYWQgPSAiY2Fubm90IG1vdmUgZGlyZWN0b3J5IG92ZXIgZmlsZSI7CisJCWVsc2UgaWYgKHNyY19pc19kaXIpIHsKKwkJCWNvbnN0IGNoYXIgKnNyY193X3NsYXNoID0gYWRkX3NsYXNoKHNyYyk7CisJCQlpbnQgbGVuX3dfc2xhc2ggPSBsZW5ndGggKyAxOworCQkJaW50IGZpcnN0LCBsYXN0OworCisJCQltb2Rlc1tpXSA9IFdPUktJTkdfRElSRUNUT1JZOworCisJCQlmaXJzdCA9IGNhY2hlX25hbWVfcG9zKHNyY193X3NsYXNoLCBsZW5fd19zbGFzaCk7CisJCQlpZiAoZmlyc3QgPj0gMCkKKwkJCQlkaWUgKCJIdWg/ICUuKnMgaXMgaW4gaW5kZXg/IiwKKwkJCQkJCWxlbl93X3NsYXNoLCBzcmNfd19zbGFzaCk7CisKKwkJCWZpcnN0ID0gLTEgLSBmaXJzdDsKKwkJCWZvciAobGFzdCA9IGZpcnN0OyBsYXN0IDwgYWN0aXZlX25yOyBsYXN0KyspIHsKKwkJCQljb25zdCBjaGFyICpwYXRoID0gYWN0aXZlX2NhY2hlW2xhc3RdLT5uYW1lOworCQkJCWlmIChzdHJuY21wKHBhdGgsIHNyY193X3NsYXNoLCBsZW5fd19zbGFzaCkpCisJCQkJCWJyZWFrOworCQkJfQorCQkJZnJlZSgoY2hhciAqKXNyY193X3NsYXNoKTsKKworCQkJaWYgKGxhc3QgLSBmaXJzdCA8IDEpCisJCQkJYmFkID0gInNvdXJjZSBkaXJlY3RvcnkgaXMgZW1wdHkiOworCQkJZWxzZSB7CisJCQkJaW50IGosIGRzdF9sZW47CisKKwkJCQlpZiAobGFzdCAtIGZpcnN0ID4gMCkgeworCQkJCQlzb3VyY2UgPSB4cmVhbGxvYyhzb3VyY2UsCisJCQkJCQkJKGFyZ2MgKyBsYXN0IC0gZmlyc3QpCisJCQkJCQkJKiBzaXplb2YoY2hhciAqKSk7CisJCQkJCWRlc3RpbmF0aW9uID0geHJlYWxsb2MoZGVzdGluYXRpb24sCisJCQkJCQkJKGFyZ2MgKyBsYXN0IC0gZmlyc3QpCisJCQkJCQkJKiBzaXplb2YoY2hhciAqKSk7CisJCQkJCW1vZGVzID0geHJlYWxsb2MobW9kZXMsCisJCQkJCQkJKGFyZ2MgKyBsYXN0IC0gZmlyc3QpCisJCQkJCQkJKiBzaXplb2YoZW51bSB1cGRhdGVfbW9kZSkpOworCQkJCX0KKworCQkJCWRzdCA9IGFkZF9zbGFzaChkc3QpOworCQkJCWRzdF9sZW4gPSBzdHJsZW4oZHN0KTsKKworCQkJCWZvciAoaiA9IDA7IGogPCBsYXN0IC0gZmlyc3Q7IGorKykgeworCQkJCQljb25zdCBjaGFyICpwYXRoID0KKwkJCQkJCWFjdGl2ZV9jYWNoZVtmaXJzdCArIGpdLT5uYW1lOworCQkJCQlzb3VyY2VbYXJnYyArIGpdID0gcGF0aDsKKwkJCQkJZGVzdGluYXRpb25bYXJnYyArIGpdID0KKwkJCQkJCXByZWZpeF9wYXRoKGRzdCwgZHN0X2xlbiwKKwkJCQkJCQlwYXRoICsgbGVuZ3RoICsgMSk7CisJCQkJCW1vZGVzW2FyZ2MgKyBqXSA9IElOREVYOworCQkJCX0KKwkJCQlhcmdjICs9IGxhc3QgLSBmaXJzdDsKKwkJCX0KKwkJfSBlbHNlIGlmIChsc3RhdChkc3QsICZzdCkgPT0gMCkgeworCQkJYmFkID0gImRlc3RpbmF0aW9uIGV4aXN0cyI7CisJCQlpZiAoZm9yY2UpIHsKKwkJCQkvKgorCQkJCSAqIG9ubHkgZmlsZXMgY2FuIG92ZXJ3cml0ZSBlYWNoIG90aGVyOgorCQkJCSAqIGNoZWNrIGJvdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbgorCQkJCSAqLworCQkJCWlmIChTX0lTUkVHKHN0LnN0X21vZGUpKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiV2FybmluZzogJXM7IgorCQkJCQkJCSIgd2lsbCBvdmVyd3JpdGUhXG4iLAorCQkJCQkJCWJhZCk7CisJCQkJCWJhZCA9IE5VTEw7CisJCQkJCXBhdGhfbGlzdF9pbnNlcnQoZHN0LCAmb3ZlcndyaXR0ZW4pOworCQkJCX0gZWxzZQorCQkJCQliYWQgPSAiQ2Fubm90IG92ZXJ3cml0ZSI7CisJCQl9CisJCX0gZWxzZSBpZiAoY2FjaGVfbmFtZV9wb3Moc3JjLCBsZW5ndGgpIDwgMCkKKwkJCWJhZCA9ICJub3QgdW5kZXIgdmVyc2lvbiBjb250cm9sIjsKKwkJZWxzZSBpZiAocGF0aF9saXN0X2hhc19wYXRoKCZzcmNfZm9yX2RzdCwgZHN0KSkKKwkJCWJhZCA9ICJtdWx0aXBsZSBzb3VyY2VzIGZvciB0aGUgc2FtZSB0YXJnZXQiOworCQllbHNlCisJCQlwYXRoX2xpc3RfaW5zZXJ0KGRzdCwgJnNyY19mb3JfZHN0KTsKKworCQlpZiAoYmFkKSB7CisJCQlpZiAoaWdub3JlX2Vycm9ycykgeworCQkJCWlmICgtLWFyZ2MgPiAwKSB7CisJCQkJCW1lbW1vdmUoc291cmNlICsgaSwgc291cmNlICsgaSArIDEsCisJCQkJCQkoYXJnYyAtIGkpICogc2l6ZW9mKGNoYXIgKikpOworCQkJCQltZW1tb3ZlKGRlc3RpbmF0aW9uICsgaSwKKwkJCQkJCWRlc3RpbmF0aW9uICsgaSArIDEsCisJCQkJCQkoYXJnYyAtIGkpICogc2l6ZW9mKGNoYXIgKikpOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWRpZSAoIiVzLCBzb3VyY2U9JXMsIGRlc3RpbmF0aW9uPSVzIiwKKwkJCQkgICAgIGJhZCwgc3JjLCBkc3QpOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICpzcmMgPSBzb3VyY2VbaV0sICpkc3QgPSBkZXN0aW5hdGlvbltpXTsKKwkJZW51bSB1cGRhdGVfbW9kZSBtb2RlID0gbW9kZXNbaV07CisJCWlmIChzaG93X29ubHkgfHwgdmVyYm9zZSkKKwkJCXByaW50ZigiUmVuYW1pbmcgJXMgdG8gJXNcbiIsIHNyYywgZHN0KTsKKwkJaWYgKCFzaG93X29ubHkgJiYgbW9kZSAhPSBJTkRFWCAmJgorCQkJCXJlbmFtZShzcmMsIGRzdCkgPCAwICYmICFpZ25vcmVfZXJyb3JzKQorCQkJZGllICgicmVuYW1pbmcgJXMgZmFpbGVkOiAlcyIsIHNyYywgc3RyZXJyb3IoZXJybm8pKTsKKworCQlpZiAobW9kZSA9PSBXT1JLSU5HX0RJUkVDVE9SWSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjYWNoZV9uYW1lX3BvcyhzcmMsIHN0cmxlbihzcmMpKSA+PSAwKSB7CisJCQlwYXRoX2xpc3RfaW5zZXJ0KHNyYywgJmRlbGV0ZWQpOworCisJCQkvKiBkZXN0aW5hdGlvbiBjYW4gYmUgYSBkaXJlY3Rvcnkgd2l0aCAxIGZpbGUgaW5zaWRlICovCisJCQlpZiAocGF0aF9saXN0X2hhc19wYXRoKCZvdmVyd3JpdHRlbiwgZHN0KSkKKwkJCQlwYXRoX2xpc3RfaW5zZXJ0KGRzdCwgJmNoYW5nZWQpOworCQkJZWxzZQorCQkJCXBhdGhfbGlzdF9pbnNlcnQoZHN0LCAmYWRkZWQpOworCQl9IGVsc2UKKwkJCXBhdGhfbGlzdF9pbnNlcnQoZHN0LCAmYWRkZWQpOworCX0KKworCWlmIChzaG93X29ubHkpIHsKKwkJc2hvd19saXN0KCJDaGFuZ2VkICA6ICIsICZjaGFuZ2VkKTsKKwkJc2hvd19saXN0KCJBZGRpbmcgICA6ICIsICZhZGRlZCk7CisJCXNob3dfbGlzdCgiRGVsZXRpbmcgOiAiLCAmZGVsZXRlZCk7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IGNoYW5nZWQubnI7IGkrKykgeworCQkJY29uc3QgY2hhciAqcGF0aCA9IGNoYW5nZWQuaXRlbXNbaV0ucGF0aDsKKwkJCWludCBqID0gY2FjaGVfbmFtZV9wb3MocGF0aCwgc3RybGVuKHBhdGgpKTsKKwkJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbal07CisKKwkJCWlmIChqIDwgMCkKKwkJCQlkaWUgKCJIdWg/IENhY2hlIGVudHJ5IGZvciAlcyB1bmtub3duPyIsIHBhdGgpOworCQkJcmVmcmVzaF9jYWNoZV9lbnRyeShjZSwgMCk7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgYWRkZWQubnI7IGkrKykgeworCQkJY29uc3QgY2hhciAqcGF0aCA9IGFkZGVkLml0ZW1zW2ldLnBhdGg7CisJCQlhZGRfZmlsZV90b19jYWNoZShwYXRoLCB2ZXJib3NlKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBkZWxldGVkLm5yOyBpKyspCisJCQlyZW1vdmVfZmlsZV9mcm9tX2NhY2hlKGRlbGV0ZWQuaXRlbXNbaV0ucGF0aCk7CisKKwkJaWYgKGFjdGl2ZV9jYWNoZV9jaGFuZ2VkKSB7CisJCQlpZiAod3JpdGVfY2FjaGUobmV3ZmQsIGFjdGl2ZV9jYWNoZSwgYWN0aXZlX25yKSB8fAorCQkJICAgIGNvbW1pdF9sb2NrZWRfaW5kZXgoJmxvY2tfZmlsZSkpCisJCQkJZGllKCJVbmFibGUgdG8gd3JpdGUgbmV3IGluZGV4IGZpbGUiKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1uYW1lLXJldi5jIGIvYnVpbHRpbi1uYW1lLXJldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NGRhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLW5hbWUtcmV2LmMKQEAgLTAsMCArMSwyOTQgQEAKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAicGFyc2Utb3B0aW9ucy5oIgorCisjZGVmaW5lIENVVE9GRl9EQVRFX1NMT1AgODY0MDAgLyogb25lIGRheSAqLworCit0eXBlZGVmIHN0cnVjdCByZXZfbmFtZSB7CisJY29uc3QgY2hhciAqdGlwX25hbWU7CisJaW50IGdlbmVyYXRpb247CisJaW50IGRpc3RhbmNlOworfSByZXZfbmFtZTsKKworc3RhdGljIGxvbmcgY3V0b2ZmID0gTE9OR19NQVg7CisKKy8qIEhvdyBtYW55IGdlbmVyYXRpb25zIGFyZSBtYXhpbWFsbHkgcHJlZmVycmVkIG92ZXIgX29uZV8gbWVyZ2UgdHJhdmVyc2FsPyAqLworI2RlZmluZSBNRVJHRV9UUkFWRVJTQUxfV0VJR0hUIDY1NTM1CisKK3N0YXRpYyB2b2lkIG5hbWVfcmV2KHN0cnVjdCBjb21taXQgKmNvbW1pdCwKKwkJY29uc3QgY2hhciAqdGlwX25hbWUsIGludCBnZW5lcmF0aW9uLCBpbnQgZGlzdGFuY2UsCisJCWludCBkZXJlZikKK3sKKwlzdHJ1Y3QgcmV2X25hbWUgKm5hbWUgPSAoc3RydWN0IHJldl9uYW1lICopY29tbWl0LT51dGlsOworCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50czsKKwlpbnQgcGFyZW50X251bWJlciA9IDE7CisKKwlpZiAoIWNvbW1pdC0+b2JqZWN0LnBhcnNlZCkKKwkJcGFyc2VfY29tbWl0KGNvbW1pdCk7CisKKwlpZiAoY29tbWl0LT5kYXRlIDwgY3V0b2ZmKQorCQlyZXR1cm47CisKKwlpZiAoZGVyZWYpIHsKKwkJY2hhciAqbmV3X25hbWUgPSB4bWFsbG9jKHN0cmxlbih0aXBfbmFtZSkrMyk7CisJCXN0cmNweShuZXdfbmFtZSwgdGlwX25hbWUpOworCQlzdHJjYXQobmV3X25hbWUsICJeMCIpOworCQl0aXBfbmFtZSA9IG5ld19uYW1lOworCisJCWlmIChnZW5lcmF0aW9uKQorCQkJZGllKCJnZW5lcmF0aW9uOiAlZCwgYnV0IGRlcmVmPyIsIGdlbmVyYXRpb24pOworCX0KKworCWlmIChuYW1lID09IE5VTEwpIHsKKwkJbmFtZSA9IHhtYWxsb2Moc2l6ZW9mKHJldl9uYW1lKSk7CisJCWNvbW1pdC0+dXRpbCA9IG5hbWU7CisJCWdvdG8gY29weV9kYXRhOworCX0gZWxzZSBpZiAobmFtZS0+ZGlzdGFuY2UgPiBkaXN0YW5jZSkgeworY29weV9kYXRhOgorCQluYW1lLT50aXBfbmFtZSA9IHRpcF9uYW1lOworCQluYW1lLT5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKwkJbmFtZS0+ZGlzdGFuY2UgPSBkaXN0YW5jZTsKKwl9IGVsc2UKKwkJcmV0dXJuOworCisJZm9yIChwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOworCQkJcGFyZW50czsKKwkJCXBhcmVudHMgPSBwYXJlbnRzLT5uZXh0LCBwYXJlbnRfbnVtYmVyKyspIHsKKwkJaWYgKHBhcmVudF9udW1iZXIgPiAxKSB7CisJCQlpbnQgbGVuID0gc3RybGVuKHRpcF9uYW1lKTsKKwkJCWNoYXIgKm5ld19uYW1lID0geG1hbGxvYyhsZW4gKworCQkJCTEgKyBkZWNpbWFsX2xlbmd0aChnZW5lcmF0aW9uKSArICAvKiB+PG4+ICovCisJCQkJMSArIDIgKwkJCQkgIC8qIF5OTiAqLworCQkJCTEpOworCisJCQlpZiAobGVuID4gMiAmJiAhc3RyY21wKHRpcF9uYW1lICsgbGVuIC0gMiwgIl4wIikpCisJCQkJbGVuIC09IDI7CisJCQlpZiAoZ2VuZXJhdGlvbiA+IDApCisJCQkJc3ByaW50ZihuZXdfbmFtZSwgIiUuKnN+JWReJWQiLCBsZW4sIHRpcF9uYW1lLAorCQkJCQkJZ2VuZXJhdGlvbiwgcGFyZW50X251bWJlcik7CisJCQllbHNlCisJCQkJc3ByaW50ZihuZXdfbmFtZSwgIiUuKnNeJWQiLCBsZW4sIHRpcF9uYW1lLAorCQkJCQkJcGFyZW50X251bWJlcik7CisKKwkJCW5hbWVfcmV2KHBhcmVudHMtPml0ZW0sIG5ld19uYW1lLCAwLAorCQkJCWRpc3RhbmNlICsgTUVSR0VfVFJBVkVSU0FMX1dFSUdIVCwgMCk7CisJCX0gZWxzZSB7CisJCQluYW1lX3JldihwYXJlbnRzLT5pdGVtLCB0aXBfbmFtZSwgZ2VuZXJhdGlvbiArIDEsCisJCQkJZGlzdGFuY2UgKyAxLCAwKTsKKwkJfQorCX0KK30KKworc3RydWN0IG5hbWVfcmVmX2RhdGEgeworCWludCB0YWdzX29ubHk7CisJaW50IG5hbWVfb25seTsKKwljb25zdCBjaGFyICpyZWZfZmlsdGVyOworfTsKKworc3RhdGljIGludCBuYW1lX3JlZihjb25zdCBjaGFyICpwYXRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmxhZ3MsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IG9iamVjdCAqbyA9IHBhcnNlX29iamVjdChzaGExKTsKKwlzdHJ1Y3QgbmFtZV9yZWZfZGF0YSAqZGF0YSA9IGNiX2RhdGE7CisJaW50IGRlcmVmID0gMDsKKworCWlmIChkYXRhLT50YWdzX29ubHkgJiYgcHJlZml4Y21wKHBhdGgsICJyZWZzL3RhZ3MvIikpCisJCXJldHVybiAwOworCisJaWYgKGRhdGEtPnJlZl9maWx0ZXIgJiYgZm5tYXRjaChkYXRhLT5yZWZfZmlsdGVyLCBwYXRoLCAwKSkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAobyAmJiBvLT50eXBlID09IE9CSl9UQUcpIHsKKwkJc3RydWN0IHRhZyAqdCA9IChzdHJ1Y3QgdGFnICopIG87CisJCWlmICghdC0+dGFnZ2VkKQorCQkJYnJlYWs7IC8qIGJyb2tlbiByZXBvc2l0b3J5ICovCisJCW8gPSBwYXJzZV9vYmplY3QodC0+dGFnZ2VkLT5zaGExKTsKKwkJZGVyZWYgPSAxOworCX0KKwlpZiAobyAmJiBvLT50eXBlID09IE9CSl9DT01NSVQpIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gKHN0cnVjdCBjb21taXQgKilvOworCisJCWlmICghcHJlZml4Y21wKHBhdGgsICJyZWZzL2hlYWRzLyIpKQorCQkJcGF0aCA9IHBhdGggKyAxMTsKKwkJZWxzZSBpZiAoZGF0YS0+dGFnc19vbmx5CisJCSAgICAmJiBkYXRhLT5uYW1lX29ubHkKKwkJICAgICYmICFwcmVmaXhjbXAocGF0aCwgInJlZnMvdGFncy8iKSkKKwkJCXBhdGggPSBwYXRoICsgMTA7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAocGF0aCwgInJlZnMvIikpCisJCQlwYXRoID0gcGF0aCArIDU7CisKKwkJbmFtZV9yZXYoY29tbWl0LCB4c3RyZHVwKHBhdGgpLCAwLCAwLCBkZXJlZik7CisJfQorCXJldHVybiAwOworfQorCisvKiByZXR1cm5zIGEgc3RhdGljIGJ1ZmZlciAqLworc3RhdGljIGNvbnN0IGNoYXIgKmdldF9yZXZfbmFtZShjb25zdCBzdHJ1Y3Qgb2JqZWN0ICpvKQoreworCXN0YXRpYyBjaGFyIGJ1ZmZlclsxMDI0XTsKKwlzdHJ1Y3QgcmV2X25hbWUgKm47CisJc3RydWN0IGNvbW1pdCAqYzsKKworCWlmIChvLT50eXBlICE9IE9CSl9DT01NSVQpCisJCXJldHVybiBOVUxMOworCWMgPSAoc3RydWN0IGNvbW1pdCAqKSBvOworCW4gPSBjLT51dGlsOworCWlmICghbikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIW4tPmdlbmVyYXRpb24pCisJCXJldHVybiBuLT50aXBfbmFtZTsKKwllbHNlIHsKKwkJaW50IGxlbiA9IHN0cmxlbihuLT50aXBfbmFtZSk7CisJCWlmIChsZW4gPiAyICYmICFzdHJjbXAobi0+dGlwX25hbWUgKyBsZW4gLSAyLCAiXjAiKSkKKwkJCWxlbiAtPSAyOworCQlzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJS4qc34lZCIsIGxlbiwgbi0+dGlwX25hbWUsCisJCQkJbi0+Z2VuZXJhdGlvbik7CisKKwkJcmV0dXJuIGJ1ZmZlcjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfbmFtZShjb25zdCBzdHJ1Y3Qgb2JqZWN0ICpvYmosCisJCSAgICAgIGNvbnN0IGNoYXIgKmNhbGxlcl9uYW1lLAorCQkgICAgICBpbnQgYWx3YXlzLCBpbnQgYWxsb3dfdW5kZWZpbmVkLCBpbnQgbmFtZV9vbmx5KQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSA9IG9iai0+c2hhMTsKKworCWlmICghbmFtZV9vbmx5KQorCQlwcmludGYoIiVzICIsIGNhbGxlcl9uYW1lID8gY2FsbGVyX25hbWUgOiBzaGExX3RvX2hleChzaGExKSk7CisJbmFtZSA9IGdldF9yZXZfbmFtZShvYmopOworCWlmIChuYW1lKQorCQlwcmludGYoIiVzXG4iLCBuYW1lKTsKKwllbHNlIGlmIChhbGxvd191bmRlZmluZWQpCisJCXByaW50ZigidW5kZWZpbmVkXG4iKTsKKwllbHNlIGlmIChhbHdheXMpCisJCXByaW50ZigiJXNcbiIsIGZpbmRfdW5pcXVlX2FiYnJldihzaGExLCBERUZBVUxUX0FCQlJFVikpOworCWVsc2UKKwkJZGllKCJjYW5ub3QgZGVzY3JpYmUgJyVzJyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKK30KKworc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBuYW1lX3Jldl91c2FnZVtdID0geworCSJnaXQtbmFtZS1yZXYgW29wdGlvbnNdICggLS1hbGwgfCAtLXN0ZGluIHwgPGNvbW1pdD4uLi4gKSIsCisJTlVMTAorfTsKKworaW50IGNtZF9uYW1lX3JldihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2FycmF5IHJldnMgPSB7IDAsIDAsIE5VTEwgfTsKKwlpbnQgYWxsID0gMCwgdHJhbnNmb3JtX3N0ZGluID0gMCwgYWxsb3dfdW5kZWZpbmVkID0gMSwgYWx3YXlzID0gMDsKKwlzdHJ1Y3QgbmFtZV9yZWZfZGF0YSBkYXRhID0geyAwLCAwLCBOVUxMIH07CisJc3RydWN0IG9wdGlvbiBvcHRzW10gPSB7CisJCU9QVF9CT09MRUFOKDAsICJuYW1lLW9ubHkiLCAmZGF0YS5uYW1lX29ubHksICJwcmludCBvbmx5IG5hbWVzIChubyBTSEEtMSkiKSwKKwkJT1BUX0JPT0xFQU4oMCwgInRhZ3MiLCAmZGF0YS50YWdzX29ubHksICJvbmx5IHVzZSB0YWdzIHRvIG5hbWUgdGhlIGNvbW1pdHMiKSwKKwkJT1BUX1NUUklORygwLCAicmVmcyIsICZkYXRhLnJlZl9maWx0ZXIsICJwYXR0ZXJuIiwKKwkJCQkgICAib25seSB1c2UgcmVmcyBtYXRjaGluZyA8cGF0dGVybj4iKSwKKwkJT1BUX0dST1VQKCIiKSwKKwkJT1BUX0JPT0xFQU4oMCwgImFsbCIsICZhbGwsICJsaXN0IGFsbCBjb21taXRzIHJlYWNoYWJsZSBmcm9tIGFsbCByZWZzIiksCisJCU9QVF9CT09MRUFOKDAsICJzdGRpbiIsICZ0cmFuc2Zvcm1fc3RkaW4sICJyZWFkIGZyb20gc3RkaW4iKSwKKwkJT1BUX0JPT0xFQU4oMCwgInVuZGVmaW5lZCIsICZhbGxvd191bmRlZmluZWQsICJhbGxvdyB0byBwcmludCBgdW5kZWZpbmVkYCBuYW1lcyIpLAorCQlPUFRfQk9PTEVBTigwLCAiYWx3YXlzIiwgICAgICZhbHdheXMsCisJCQkgICAic2hvdyBhYmJyZXZpYXRlZCBjb21taXQgb2JqZWN0IGFzIGZhbGxiYWNrIiksCisJCU9QVF9FTkQoKSwKKwl9OworCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCWFyZ2MgPSBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIG9wdHMsIG5hbWVfcmV2X3VzYWdlLCAwKTsKKwlpZiAoISFhbGwgKyAhIXRyYW5zZm9ybV9zdGRpbiArICEhYXJnYyA+IDEpIHsKKwkJZXJyb3IoIlNwZWNpZnkgZWl0aGVyIGEgbGlzdCwgb3IgLS1hbGwsIG5vdCBib3RoISIpOworCQl1c2FnZV93aXRoX29wdGlvbnMobmFtZV9yZXZfdXNhZ2UsIG9wdHMpOworCX0KKwlpZiAoYWxsIHx8IHRyYW5zZm9ybV9zdGRpbikKKwkJY3V0b2ZmID0gMDsKKworCWZvciAoOyBhcmdjOyBhcmdjLS0sIGFyZ3YrKykgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQlzdHJ1Y3Qgb2JqZWN0ICpvOworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisKKwkJaWYgKGdldF9zaGExKCphcmd2LCBzaGExKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZ2V0IHNoYTEgZm9yICVzLiBTa2lwcGluZy5cbiIsCisJCQkJCSphcmd2KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbyA9IGRlcmVmX3RhZyhwYXJzZV9vYmplY3Qoc2hhMSksICphcmd2LCAwKTsKKwkJaWYgKCFvIHx8IG8tPnR5cGUgIT0gT0JKX0NPTU1JVCkgeworCQkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZ2V0IGNvbW1pdCBmb3IgJXMuIFNraXBwaW5nLlxuIiwKKwkJCQkJKmFyZ3YpOworCQkJY29udGludWU7CisJCX0KKworCQljb21taXQgPSAoc3RydWN0IGNvbW1pdCAqKW87CisJCWlmIChjdXRvZmYgPiBjb21taXQtPmRhdGUpCisJCQljdXRvZmYgPSBjb21taXQtPmRhdGU7CisJCWFkZF9vYmplY3RfYXJyYXkoKHN0cnVjdCBvYmplY3QgKiljb21taXQsICphcmd2LCAmcmV2cyk7CisJfQorCisJaWYgKGN1dG9mZikKKwkJY3V0b2ZmID0gY3V0b2ZmIC0gQ1VUT0ZGX0RBVEVfU0xPUDsKKwlmb3JfZWFjaF9yZWYobmFtZV9yZWYsICZkYXRhKTsKKworCWlmICh0cmFuc2Zvcm1fc3RkaW4pIHsKKwkJY2hhciBidWZmZXJbMjA0OF07CisJCWNoYXIgKnAsICpwX3N0YXJ0OworCisJCXdoaWxlICghZmVvZihzdGRpbikpIHsKKwkJCWludCBmb3J0eSA9IDA7CisJCQlwID0gZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgc3RkaW4pOworCQkJaWYgKCFwKQorCQkJCWJyZWFrOworCisJCQlmb3IgKHBfc3RhcnQgPSBwOyAqcDsgcCsrKSB7CisjZGVmaW5lIGlzaGV4KHgpIChpc2RpZ2l0KCh4KSkgfHwgKCh4KSA+PSAnYScgJiYgKHgpIDw9ICdmJykpCisJCQkJaWYgKCFpc2hleCgqcCkpCisJCQkJCWZvcnR5ID0gMDsKKwkJCQllbHNlIGlmICgrK2ZvcnR5ID09IDQwICYmCisJCQkJCQkhaXNoZXgoKihwKzEpKSkgeworCQkJCQl1bnNpZ25lZCBjaGFyIHNoYTFbNDBdOworCQkJCQljb25zdCBjaGFyICpuYW1lID0gTlVMTDsKKwkJCQkJY2hhciBjID0gKihwKzEpOworCisJCQkJCWZvcnR5ID0gMDsKKworCQkJCQkqKHArMSkgPSAwOworCQkJCQlpZiAoIWdldF9zaGExKHAgLSAzOSwgc2hhMSkpIHsKKwkJCQkJCXN0cnVjdCBvYmplY3QgKm8gPQorCQkJCQkJCWxvb2t1cF9vYmplY3Qoc2hhMSk7CisJCQkJCQlpZiAobykKKwkJCQkJCQluYW1lID0gZ2V0X3Jldl9uYW1lKG8pOworCQkJCQl9CisJCQkJCSoocCsxKSA9IGM7CisKKwkJCQkJaWYgKCFuYW1lKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJZndyaXRlKHBfc3RhcnQsIHAgLSBwX3N0YXJ0ICsgMSwgMSwgc3Rkb3V0KTsKKwkJCQkJcHJpbnRmKCIgKCVzKSIsIG5hbWUpOworCQkJCQlwX3N0YXJ0ID0gcCArIDE7CisJCQkJfQorCQkJfQorCisJCQkvKiBmbHVzaCAqLworCQkJaWYgKHBfc3RhcnQgIT0gcCkKKwkJCQlmd3JpdGUocF9zdGFydCwgcCAtIHBfc3RhcnQsIDEsIHN0ZG91dCk7CisJCX0KKwl9IGVsc2UgaWYgKGFsbCkgeworCQlpbnQgaSwgbWF4OworCisJCW1heCA9IGdldF9tYXhfb2JqZWN0X2luZGV4KCk7CisJCWZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykKKwkJCXNob3dfbmFtZShnZXRfaW5kZXhlZF9vYmplY3QoaSksIE5VTEwsCisJCQkJICBhbHdheXMsIGFsbG93X3VuZGVmaW5lZCwgZGF0YS5uYW1lX29ubHkpOworCX0gZWxzZSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgcmV2cy5ucjsgaSsrKQorCQkJc2hvd19uYW1lKHJldnMub2JqZWN0c1tpXS5pdGVtLCByZXZzLm9iamVjdHNbaV0ubmFtZSwKKwkJCQkgIGFsd2F5cywgYWxsb3dfdW5kZWZpbmVkLCBkYXRhLm5hbWVfb25seSk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXBhY2stb2JqZWN0cy5jIGIvYnVpbHRpbi1wYWNrLW9iamVjdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzdmMjcyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1wYWNrLW9iamVjdHMuYwpAQCAtMCwwICsxLDIxNjkgQEAKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJhdHRyLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJkZWx0YS5oIgorI2luY2x1ZGUgInBhY2suaCIKKyNpbmNsdWRlICJwYWNrLXJldmluZGV4LmgiCisjaW5jbHVkZSAiY3N1bS1maWxlLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgInJldmlzaW9uLmgiCisjaW5jbHVkZSAibGlzdC1vYmplY3RzLmgiCisjaW5jbHVkZSAicHJvZ3Jlc3MuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisKKyNpZmRlZiBUSFJFQURFRF9ERUxUQV9TRUFSQ0gKKyNpbmNsdWRlICJ0aHJlYWQtdXRpbHMuaCIKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgcGFja191c2FnZVtdID0gIlwKK2dpdC1wYWNrLW9iamVjdHMgW3sgLXEgfCAtLXByb2dyZXNzIHwgLS1hbGwtcHJvZ3Jlc3MgfV0gXG5cCisJWy0tbWF4LXBhY2stc2l6ZT1OXSBbLS1sb2NhbF0gWy0taW5jcmVtZW50YWxdIFxuXAorCVstLXdpbmRvdz1OXSBbLS13aW5kb3ctbWVtb3J5PU5dIFstLWRlcHRoPU5dIFxuXAorCVstLW5vLXJldXNlLWRlbHRhXSBbLS1uby1yZXVzZS1vYmplY3RdIFstLWRlbHRhLWJhc2Utb2Zmc2V0XSBcblwKKwlbLS10aHJlYWRzPU5dIFstLW5vbi1lbXB0eV0gWy0tcmV2cyBbLS11bnBhY2tlZCB8IC0tYWxsXSpdIFstLXJlZmxvZ10gXG5cCisJWy0tc3Rkb3V0IHwgYmFzZS1uYW1lXSBbLS1pbmNsdWRlLXRhZ10gWy0ta2VlcC11bnJlYWNoYWJsZV0gXG5cCisJWzxyZWYtbGlzdCB8IDxvYmplY3QtbGlzdF0iOworCitzdHJ1Y3Qgb2JqZWN0X2VudHJ5IHsKKwlzdHJ1Y3QgcGFja19pZHhfZW50cnkgaWR4OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsJLyogdW5jb21wcmVzc2VkIHNpemUgKi8KKwlzdHJ1Y3QgcGFja2VkX2dpdCAqaW5fcGFjazsgCS8qIGFscmVhZHkgaW4gcGFjayAqLworCW9mZl90IGluX3BhY2tfb2Zmc2V0OworCXN0cnVjdCBvYmplY3RfZW50cnkgKmRlbHRhOwkvKiBkZWx0YSBiYXNlIG9iamVjdCAqLworCXN0cnVjdCBvYmplY3RfZW50cnkgKmRlbHRhX2NoaWxkOyAvKiBkZWx0aWZpZWQgb2JqZWN0cyB3aG8gYmFzZXMgbWUgKi8KKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpkZWx0YV9zaWJsaW5nOyAvKiBvdGhlciBkZWx0aWZpZWQgb2JqZWN0cyB3aG8KKwkJCQkJICAgICAqIHVzZXMgdGhlIHNhbWUgYmFzZSBhcyBtZQorCQkJCQkgICAgICovCisJdm9pZCAqZGVsdGFfZGF0YTsJLyogY2FjaGVkIGRlbHRhICh1bmNvbXByZXNzZWQpICovCisJdW5zaWduZWQgbG9uZyBkZWx0YV9zaXplOwkvKiBkZWx0YSBkYXRhIHNpemUgKHVuY29tcHJlc3NlZCkgKi8KKwl1bnNpZ25lZCBpbnQgaGFzaDsJLyogbmFtZSBoaW50IGhhc2ggKi8KKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJZW51bSBvYmplY3RfdHlwZSBpbl9wYWNrX3R5cGU7CS8qIGNvdWxkIGJlIGRlbHRhICovCisJdW5zaWduZWQgY2hhciBpbl9wYWNrX2hlYWRlcl9zaXplOworCXVuc2lnbmVkIGNoYXIgcHJlZmVycmVkX2Jhc2U7IC8qIHdlIGRvIG5vdCBwYWNrIHRoaXMsIGJ1dCBpcyBhdmFpbGFibGUKKwkJCQkgICAgICAgKiB0byBiZSB1c2VkIGFzIHRoZSBiYXNlIG9iamVjdCB0byBkZWx0YQorCQkJCSAgICAgICAqIG9iamVjdHMgYWdhaW5zdC4KKwkJCQkgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyIG5vX3RyeV9kZWx0YTsKK307CisKKy8qCisgKiBPYmplY3RzIHdlIGFyZSBnb2luZyB0byBwYWNrIGFyZSBjb2xsZWN0ZWQgaW4gb2JqZWN0cyBhcnJheSAoZHluYW1pY2FsbHkKKyAqIGV4cGFuZGVkKS4gIG5yX29iamVjdHMgJiBucl9hbGxvYyBjb250cm9scyB0aGlzIGFycmF5LiAgVGhleSBhcmUgc3RvcmVkCisgKiBpbiB0aGUgb3JkZXIgd2Ugc2VlIC0tIHR5cGljYWxseSByZXYtbGlzdCAtLW9iamVjdHMgb3JkZXIgdGhhdCBnaXZlcyB1cworICogbmljZSAibWluaW11bSBzZWVrIiBvcmRlci4KKyAqLworc3RhdGljIHN0cnVjdCBvYmplY3RfZW50cnkgKm9iamVjdHM7CitzdGF0aWMgc3RydWN0IHBhY2tfaWR4X2VudHJ5ICoqd3JpdHRlbl9saXN0Oworc3RhdGljIHVpbnQzMl90IG5yX29iamVjdHMsIG5yX2FsbG9jLCBucl9yZXN1bHQsIG5yX3dyaXR0ZW47CisKK3N0YXRpYyBpbnQgbm9uX2VtcHR5Oworc3RhdGljIGludCBub19yZXVzZV9kZWx0YSwgbm9fcmV1c2Vfb2JqZWN0LCBrZWVwX3VucmVhY2hhYmxlLCBpbmNsdWRlX3RhZzsKK3N0YXRpYyBpbnQgbG9jYWw7CitzdGF0aWMgaW50IGluY3JlbWVudGFsOworc3RhdGljIGludCBhbGxvd19vZnNfZGVsdGE7CitzdGF0aWMgY29uc3QgY2hhciAqYmFzZV9uYW1lOworc3RhdGljIGludCBwcm9ncmVzcyA9IDE7CitzdGF0aWMgaW50IHdpbmRvdyA9IDEwOworc3RhdGljIHVpbnQzMl90IHBhY2tfc2l6ZV9saW1pdCwgcGFja19zaXplX2xpbWl0X2NmZzsKK3N0YXRpYyBpbnQgZGVwdGggPSA1MDsKK3N0YXRpYyBpbnQgZGVsdGFfc2VhcmNoX3RocmVhZHMgPSAxOworc3RhdGljIGludCBwYWNrX3RvX3N0ZG91dDsKK3N0YXRpYyBpbnQgbnVtX3ByZWZlcnJlZF9iYXNlOworc3RhdGljIHN0cnVjdCBwcm9ncmVzcyAqcHJvZ3Jlc3Nfc3RhdGU7CitzdGF0aWMgaW50IHBhY2tfY29tcHJlc3Npb25fbGV2ZWwgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT047CitzdGF0aWMgaW50IHBhY2tfY29tcHJlc3Npb25fc2VlbjsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZGVsdGFfY2FjaGVfc2l6ZSA9IDA7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBtYXhfZGVsdGFfY2FjaGVfc2l6ZSA9IDA7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBjYWNoZV9tYXhfc21hbGxfZGVsdGFfc2l6ZSA9IDEwMDA7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdpbmRvd19tZW1vcnlfbGltaXQgPSAwOworCisvKgorICogVGhlIG9iamVjdCBuYW1lcyBpbiBvYmplY3RzIGFycmF5IGFyZSBoYXNoZWQgd2l0aCB0aGlzIGhhc2h0YWJsZSwKKyAqIHRvIGhlbHAgbG9va2luZyB1cCB0aGUgZW50cnkgYnkgb2JqZWN0IG5hbWUuCisgKiBUaGlzIGhhc2h0YWJsZSBpcyBidWlsdCBhZnRlciBhbGwgdGhlIG9iamVjdHMgYXJlIHNlZW4uCisgKi8KK3N0YXRpYyBpbnQgKm9iamVjdF9peDsKK3N0YXRpYyBpbnQgb2JqZWN0X2l4X2hhc2hzejsKKworLyoKKyAqIHN0YXRzCisgKi8KK3N0YXRpYyB1aW50MzJfdCB3cml0dGVuLCB3cml0dGVuX2RlbHRhOworc3RhdGljIHVpbnQzMl90IHJldXNlZCwgcmV1c2VkX2RlbHRhOworCisKK3N0YXRpYyB2b2lkICpkZWx0YV9hZ2FpbnN0KHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplLCBzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICplbnRyeSkKK3sKKwl1bnNpZ25lZCBsb25nIG90aGVyc2l6ZSwgZGVsdGFfc2l6ZTsKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJdm9pZCAqb3RoZXJidWYgPSByZWFkX3NoYTFfZmlsZShlbnRyeS0+ZGVsdGEtPmlkeC5zaGExLCAmdHlwZSwgJm90aGVyc2l6ZSk7CisJdm9pZCAqZGVsdGFfYnVmOworCisJaWYgKCFvdGhlcmJ1ZikKKwkJZGllKCJ1bmFibGUgdG8gcmVhZCAlcyIsIHNoYTFfdG9faGV4KGVudHJ5LT5kZWx0YS0+aWR4LnNoYTEpKTsKKyAgICAgICAgZGVsdGFfYnVmID0gZGlmZl9kZWx0YShvdGhlcmJ1Ziwgb3RoZXJzaXplLAorCQkJICAgICAgIGJ1Ziwgc2l6ZSwgJmRlbHRhX3NpemUsIDApOworICAgICAgICBpZiAoIWRlbHRhX2J1ZiB8fCBkZWx0YV9zaXplICE9IGVudHJ5LT5kZWx0YV9zaXplKQorCQlkaWUoImRlbHRhIHNpemUgY2hhbmdlZCIpOworICAgICAgICBmcmVlKGJ1Zik7CisgICAgICAgIGZyZWUob3RoZXJidWYpOworCXJldHVybiBkZWx0YV9idWY7Cit9CisKKy8qCisgKiBUaGUgcGVyLW9iamVjdCBoZWFkZXIgaXMgYSBwcmV0dHkgZGVuc2UgdGhpbmcsIHdoaWNoIGlzCisgKiAgLSBmaXJzdCBieXRlOiBsb3cgZm91ciBiaXRzIGFyZSAic2l6ZSIsIHRoZW4gdGhyZWUgYml0cyBvZiAidHlwZSIsCisgKiAgICBhbmQgdGhlIGhpZ2ggYml0IGlzICJzaXplIGNvbnRpbnVlcyIuCisgKiAgLSBlYWNoIGJ5dGUgYWZ0ZXJ3YXJkczogbG93IHNldmVuIGJpdHMgYXJlIHNpemUgY29udGludWF0aW9uLAorICogICAgd2l0aCB0aGUgaGlnaCBiaXQgYmVpbmcgInNpemUgY29udGludWVzIgorICovCitzdGF0aWMgaW50IGVuY29kZV9oZWFkZXIoZW51bSBvYmplY3RfdHlwZSB0eXBlLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGNoYXIgKmhkcikKK3sKKwlpbnQgbiA9IDE7CisJdW5zaWduZWQgY2hhciBjOworCisJaWYgKHR5cGUgPCBPQkpfQ09NTUlUIHx8IHR5cGUgPiBPQkpfUkVGX0RFTFRBKQorCQlkaWUoImJhZCB0eXBlICVkIiwgdHlwZSk7CisKKwljID0gKHR5cGUgPDwgNCkgfCAoc2l6ZSAmIDE1KTsKKwlzaXplID4+PSA0OworCXdoaWxlIChzaXplKSB7CisJCSpoZHIrKyA9IGMgfCAweDgwOworCQljID0gc2l6ZSAmIDB4N2Y7CisJCXNpemUgPj49IDc7CisJCW4rKzsKKwl9CisJKmhkciA9IGM7CisJcmV0dXJuIG47Cit9CisKKy8qCisgKiB3ZSBhcmUgZ29pbmcgdG8gcmV1c2UgdGhlIGV4aXN0aW5nIG9iamVjdCBkYXRhIGFzIGlzLiAgbWFrZQorICogc3VyZSBpdCBpcyBub3QgY29ycnVwdC4KKyAqLworc3RhdGljIGludCBjaGVja19wYWNrX2luZmxhdGUoc3RydWN0IHBhY2tlZF9naXQgKnAsCisJCXN0cnVjdCBwYWNrX3dpbmRvdyAqKndfY3VycywKKwkJb2ZmX3Qgb2Zmc2V0LAorCQlvZmZfdCBsZW4sCisJCXVuc2lnbmVkIGxvbmcgZXhwZWN0KQoreworCXpfc3RyZWFtIHN0cmVhbTsKKwl1bnNpZ25lZCBjaGFyIGZha2VidWZbNDA5Nl0sICppbjsKKwlpbnQgc3Q7CisKKwltZW1zZXQoJnN0cmVhbSwgMCwgc2l6ZW9mKHN0cmVhbSkpOworCWluZmxhdGVJbml0KCZzdHJlYW0pOworCWRvIHsKKwkJaW4gPSB1c2VfcGFjayhwLCB3X2N1cnMsIG9mZnNldCwgJnN0cmVhbS5hdmFpbF9pbik7CisJCXN0cmVhbS5uZXh0X2luID0gaW47CisJCXN0cmVhbS5uZXh0X291dCA9IGZha2VidWY7CisJCXN0cmVhbS5hdmFpbF9vdXQgPSBzaXplb2YoZmFrZWJ1Zik7CisJCXN0ID0gaW5mbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCk7CisJCW9mZnNldCArPSBzdHJlYW0ubmV4dF9pbiAtIGluOworCX0gd2hpbGUgKHN0ID09IFpfT0sgfHwgc3QgPT0gWl9CVUZfRVJST1IpOworCWluZmxhdGVFbmQoJnN0cmVhbSk7CisJcmV0dXJuIChzdCA9PSBaX1NUUkVBTV9FTkQgJiYKKwkJc3RyZWFtLnRvdGFsX291dCA9PSBleHBlY3QgJiYKKwkJc3RyZWFtLnRvdGFsX2luID09IGxlbikgPyAwIDogLTE7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfcGFja19jcmMoc3RydWN0IHBhY2tlZF9naXQgKnAsIHN0cnVjdCBwYWNrX3dpbmRvdyAqKndfY3VycywKKwkJCSAgb2ZmX3Qgb2Zmc2V0LCBvZmZfdCBsZW4sIHVuc2lnbmVkIGludCBucikKK3sKKwljb25zdCB1aW50MzJfdCAqaW5kZXhfY3JjOworCXVpbnQzMl90IGRhdGFfY3JjID0gY3JjMzIoMCwgWl9OVUxMLCAwKTsKKworCWRvIHsKKwkJdW5zaWduZWQgaW50IGF2YWlsOworCQl2b2lkICpkYXRhID0gdXNlX3BhY2socCwgd19jdXJzLCBvZmZzZXQsICZhdmFpbCk7CisJCWlmIChhdmFpbCA+IGxlbikKKwkJCWF2YWlsID0gbGVuOworCQlkYXRhX2NyYyA9IGNyYzMyKGRhdGFfY3JjLCBkYXRhLCBhdmFpbCk7CisJCW9mZnNldCArPSBhdmFpbDsKKwkJbGVuIC09IGF2YWlsOworCX0gd2hpbGUgKGxlbik7CisKKwlpbmRleF9jcmMgPSBwLT5pbmRleF9kYXRhOworCWluZGV4X2NyYyArPSAyICsgMjU2ICsgcC0+bnVtX29iamVjdHMgKiAoMjAvNCkgKyBucjsKKworCXJldHVybiBkYXRhX2NyYyAhPSBudG9obCgqaW5kZXhfY3JjKTsKK30KKworc3RhdGljIHZvaWQgY29weV9wYWNrX2RhdGEoc3RydWN0IHNoYTFmaWxlICpmLAorCQlzdHJ1Y3QgcGFja2VkX2dpdCAqcCwKKwkJc3RydWN0IHBhY2tfd2luZG93ICoqd19jdXJzLAorCQlvZmZfdCBvZmZzZXQsCisJCW9mZl90IGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICppbjsKKwl1bnNpZ25lZCBpbnQgYXZhaWw7CisKKwl3aGlsZSAobGVuKSB7CisJCWluID0gdXNlX3BhY2socCwgd19jdXJzLCBvZmZzZXQsICZhdmFpbCk7CisJCWlmIChhdmFpbCA+IGxlbikKKwkJCWF2YWlsID0gKHVuc2lnbmVkIGludClsZW47CisJCXNoYTF3cml0ZShmLCBpbiwgYXZhaWwpOworCQlvZmZzZXQgKz0gYXZhaWw7CisJCWxlbiAtPSBhdmFpbDsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdyaXRlX29iamVjdChzdHJ1Y3Qgc2hhMWZpbGUgKmYsCisJCQkJICBzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICplbnRyeSwKKwkJCQkgIG9mZl90IHdyaXRlX29mZnNldCkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCXZvaWQgKmJ1ZjsKKwl1bnNpZ25lZCBjaGFyIGhlYWRlclsxMF07CisJdW5zaWduZWQgY2hhciBkaGVhZGVyWzEwXTsKKwl1bnNpZ25lZCBoZHJsZW47CisJb2ZmX3QgZGF0YWxlbjsKKwllbnVtIG9iamVjdF90eXBlIG9ial90eXBlOworCWludCB0b19yZXVzZSA9IDA7CisJLyogd3JpdGUgbGltaXQgaWYgbGltaXRlZCBwYWNrc2l6ZSBhbmQgbm90IGZpcnN0IG9iamVjdCAqLworCXVuc2lnbmVkIGxvbmcgbGltaXQgPSBwYWNrX3NpemVfbGltaXQgJiYgbnJfd3JpdHRlbiA/CisJCQkJcGFja19zaXplX2xpbWl0IC0gd3JpdGVfb2Zmc2V0IDogMDsKKwkJCQkvKiBubyBpZiBubyBkZWx0YSAqLworCWludCB1c2FibGVfZGVsdGEgPQkhZW50cnktPmRlbHRhID8gMCA6CisJCQkJLyogeWVzIGlmIHVubGltaXRlZCBwYWNrZmlsZSAqLworCQkJCSFwYWNrX3NpemVfbGltaXQgPyAxIDoKKwkJCQkvKiBubyBpZiBiYXNlIHdyaXR0ZW4gdG8gcHJldmlvdXMgcGFjayAqLworCQkJCWVudHJ5LT5kZWx0YS0+aWR4Lm9mZnNldCA9PSAob2ZmX3QpLTEgPyAwIDoKKwkJCQkvKiBvdGhlcndpc2UgZG91YmxlLWNoZWNrIHdyaXR0ZW4gdG8gdGhpcworCQkJCSAqIHBhY2ssICBsaWtlIHdlIGRvIGJlbG93CisJCQkJICovCisJCQkJZW50cnktPmRlbHRhLT5pZHgub2Zmc2V0ID8gMSA6IDA7CisKKwlpZiAoIXBhY2tfdG9fc3Rkb3V0KQorCQljcmMzMl9iZWdpbihmKTsKKworCW9ial90eXBlID0gZW50cnktPnR5cGU7CisJaWYgKG5vX3JldXNlX29iamVjdCkKKwkJdG9fcmV1c2UgPSAwOwkvKiBleHBsaWNpdCAqLworCWVsc2UgaWYgKCFlbnRyeS0+aW5fcGFjaykKKwkJdG9fcmV1c2UgPSAwOwkvKiBjYW4ndCByZXVzZSB3aGF0IHdlIGRvbid0IGhhdmUgKi8KKwllbHNlIGlmIChvYmpfdHlwZSA9PSBPQkpfUkVGX0RFTFRBIHx8IG9ial90eXBlID09IE9CSl9PRlNfREVMVEEpCisJCQkJLyogY2hlY2tfb2JqZWN0KCkgZGVjaWRlZCBpdCBmb3IgdXMgLi4uICovCisJCXRvX3JldXNlID0gdXNhYmxlX2RlbHRhOworCQkJCS8qIC4uLiBidXQgcGFjayBzcGxpdCBtYXkgb3ZlcnJpZGUgdGhhdCAqLworCWVsc2UgaWYgKG9ial90eXBlICE9IGVudHJ5LT5pbl9wYWNrX3R5cGUpCisJCXRvX3JldXNlID0gMDsJLyogcGFjayBoYXMgZGVsdGEgd2hpY2ggaXMgdW51c2FibGUgKi8KKwllbHNlIGlmIChlbnRyeS0+ZGVsdGEpCisJCXRvX3JldXNlID0gMDsJLyogd2Ugd2FudCB0byBwYWNrIGFmcmVzaCAqLworCWVsc2UKKwkJdG9fcmV1c2UgPSAxOwkvKiB3ZSBoYXZlIGl0IGluLXBhY2sgdW5kZWx0aWZpZWQsCisJCQkJICogYW5kIHdlIGRvIG5vdCBuZWVkIHRvIGRlbHRpZnkgaXQuCisJCQkJICovCisKKwlpZiAoIXRvX3JldXNlKSB7CisJCXpfc3RyZWFtIHN0cmVhbTsKKwkJdW5zaWduZWQgbG9uZyBtYXhzaXplOworCQl2b2lkICpvdXQ7CisJCWlmICghdXNhYmxlX2RlbHRhKSB7CisJCQlidWYgPSByZWFkX3NoYTFfZmlsZShlbnRyeS0+aWR4LnNoYTEsICZvYmpfdHlwZSwgJnNpemUpOworCQkJaWYgKCFidWYpCisJCQkJZGllKCJ1bmFibGUgdG8gcmVhZCAlcyIsIHNoYTFfdG9faGV4KGVudHJ5LT5pZHguc2hhMSkpOworCQl9IGVsc2UgaWYgKGVudHJ5LT5kZWx0YV9kYXRhKSB7CisJCQlzaXplID0gZW50cnktPmRlbHRhX3NpemU7CisJCQlidWYgPSBlbnRyeS0+ZGVsdGFfZGF0YTsKKwkJCWVudHJ5LT5kZWx0YV9kYXRhID0gTlVMTDsKKwkJCW9ial90eXBlID0gKGFsbG93X29mc19kZWx0YSAmJiBlbnRyeS0+ZGVsdGEtPmlkeC5vZmZzZXQpID8KKwkJCQlPQkpfT0ZTX0RFTFRBIDogT0JKX1JFRl9ERUxUQTsKKwkJfSBlbHNlIHsKKwkJCWJ1ZiA9IHJlYWRfc2hhMV9maWxlKGVudHJ5LT5pZHguc2hhMSwgJnR5cGUsICZzaXplKTsKKwkJCWlmICghYnVmKQorCQkJCWRpZSgidW5hYmxlIHRvIHJlYWQgJXMiLCBzaGExX3RvX2hleChlbnRyeS0+aWR4LnNoYTEpKTsKKwkJCWJ1ZiA9IGRlbHRhX2FnYWluc3QoYnVmLCBzaXplLCBlbnRyeSk7CisJCQlzaXplID0gZW50cnktPmRlbHRhX3NpemU7CisJCQlvYmpfdHlwZSA9IChhbGxvd19vZnNfZGVsdGEgJiYgZW50cnktPmRlbHRhLT5pZHgub2Zmc2V0KSA/CisJCQkJT0JKX09GU19ERUxUQSA6IE9CSl9SRUZfREVMVEE7CisJCX0KKwkJLyogY29tcHJlc3MgdGhlIGRhdGEgdG8gc3RvcmUgYW5kIHB1dCBjb21wcmVzc2VkIGxlbmd0aCBpbiBkYXRhbGVuICovCisJCW1lbXNldCgmc3RyZWFtLCAwLCBzaXplb2Yoc3RyZWFtKSk7CisJCWRlZmxhdGVJbml0KCZzdHJlYW0sIHBhY2tfY29tcHJlc3Npb25fbGV2ZWwpOworCQltYXhzaXplID0gZGVmbGF0ZUJvdW5kKCZzdHJlYW0sIHNpemUpOworCQlvdXQgPSB4bWFsbG9jKG1heHNpemUpOworCQkvKiBDb21wcmVzcyBpdCAqLworCQlzdHJlYW0ubmV4dF9pbiA9IGJ1ZjsKKwkJc3RyZWFtLmF2YWlsX2luID0gc2l6ZTsKKwkJc3RyZWFtLm5leHRfb3V0ID0gb3V0OworCQlzdHJlYW0uYXZhaWxfb3V0ID0gbWF4c2l6ZTsKKwkJd2hpbGUgKGRlZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpID09IFpfT0spCisJCQkvKiBub3RoaW5nICovOworCQlkZWZsYXRlRW5kKCZzdHJlYW0pOworCQlkYXRhbGVuID0gc3RyZWFtLnRvdGFsX291dDsKKworCQkvKgorCQkgKiBUaGUgb2JqZWN0IGhlYWRlciBpcyBhIGJ5dGUgb2YgJ3R5cGUnIGZvbGxvd2VkIGJ5IHplcm8gb3IKKwkJICogbW9yZSBieXRlcyBvZiBsZW5ndGguCisJCSAqLworCQloZHJsZW4gPSBlbmNvZGVfaGVhZGVyKG9ial90eXBlLCBzaXplLCBoZWFkZXIpOworCisJCWlmIChvYmpfdHlwZSA9PSBPQkpfT0ZTX0RFTFRBKSB7CisJCQkvKgorCQkJICogRGVsdGFzIHdpdGggcmVsYXRpdmUgYmFzZSBjb250YWluIGFuIGFkZGl0aW9uYWwKKwkJCSAqIGVuY29kaW5nIG9mIHRoZSByZWxhdGl2ZSBvZmZzZXQgZm9yIHRoZSBkZWx0YQorCQkJICogYmFzZSBmcm9tIHRoaXMgb2JqZWN0J3MgcG9zaXRpb24gaW4gdGhlIHBhY2suCisJCQkgKi8KKwkJCW9mZl90IG9mcyA9IGVudHJ5LT5pZHgub2Zmc2V0IC0gZW50cnktPmRlbHRhLT5pZHgub2Zmc2V0OworCQkJdW5zaWduZWQgcG9zID0gc2l6ZW9mKGRoZWFkZXIpIC0gMTsKKwkJCWRoZWFkZXJbcG9zXSA9IG9mcyAmIDEyNzsKKwkJCXdoaWxlIChvZnMgPj49IDcpCisJCQkJZGhlYWRlclstLXBvc10gPSAxMjggfCAoLS1vZnMgJiAxMjcpOworCQkJaWYgKGxpbWl0ICYmIGhkcmxlbiArIHNpemVvZihkaGVhZGVyKSAtIHBvcyArIGRhdGFsZW4gKyAyMCA+PSBsaW1pdCkgeworCQkJCWZyZWUob3V0KTsKKwkJCQlmcmVlKGJ1Zik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlzaGExd3JpdGUoZiwgaGVhZGVyLCBoZHJsZW4pOworCQkJc2hhMXdyaXRlKGYsIGRoZWFkZXIgKyBwb3MsIHNpemVvZihkaGVhZGVyKSAtIHBvcyk7CisJCQloZHJsZW4gKz0gc2l6ZW9mKGRoZWFkZXIpIC0gcG9zOworCQl9IGVsc2UgaWYgKG9ial90eXBlID09IE9CSl9SRUZfREVMVEEpIHsKKwkJCS8qCisJCQkgKiBEZWx0YXMgd2l0aCBhIGJhc2UgcmVmZXJlbmNlIGNvbnRhaW4KKwkJCSAqIGFuIGFkZGl0aW9uYWwgMjAgYnl0ZXMgZm9yIHRoZSBiYXNlIHNoYTEuCisJCQkgKi8KKwkJCWlmIChsaW1pdCAmJiBoZHJsZW4gKyAyMCArIGRhdGFsZW4gKyAyMCA+PSBsaW1pdCkgeworCQkJCWZyZWUob3V0KTsKKwkJCQlmcmVlKGJ1Zik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlzaGExd3JpdGUoZiwgaGVhZGVyLCBoZHJsZW4pOworCQkJc2hhMXdyaXRlKGYsIGVudHJ5LT5kZWx0YS0+aWR4LnNoYTEsIDIwKTsKKwkJCWhkcmxlbiArPSAyMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChsaW1pdCAmJiBoZHJsZW4gKyBkYXRhbGVuICsgMjAgPj0gbGltaXQpIHsKKwkJCQlmcmVlKG91dCk7CisJCQkJZnJlZShidWYpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJc2hhMXdyaXRlKGYsIGhlYWRlciwgaGRybGVuKTsKKwkJfQorCQlzaGExd3JpdGUoZiwgb3V0LCBkYXRhbGVuKTsKKwkJZnJlZShvdXQpOworCQlmcmVlKGJ1Zik7CisJfQorCWVsc2UgeworCQlzdHJ1Y3QgcGFja2VkX2dpdCAqcCA9IGVudHJ5LT5pbl9wYWNrOworCQlzdHJ1Y3QgcGFja193aW5kb3cgKndfY3VycyA9IE5VTEw7CisJCXN0cnVjdCByZXZpbmRleF9lbnRyeSAqcmV2aWR4OworCQlvZmZfdCBvZmZzZXQ7CisKKwkJaWYgKGVudHJ5LT5kZWx0YSkgeworCQkJb2JqX3R5cGUgPSAoYWxsb3dfb2ZzX2RlbHRhICYmIGVudHJ5LT5kZWx0YS0+aWR4Lm9mZnNldCkgPworCQkJCU9CSl9PRlNfREVMVEEgOiBPQkpfUkVGX0RFTFRBOworCQkJcmV1c2VkX2RlbHRhKys7CisJCX0KKwkJaGRybGVuID0gZW5jb2RlX2hlYWRlcihvYmpfdHlwZSwgZW50cnktPnNpemUsIGhlYWRlcik7CisJCW9mZnNldCA9IGVudHJ5LT5pbl9wYWNrX29mZnNldDsKKwkJcmV2aWR4ID0gZmluZF9wYWNrX3JldmluZGV4KHAsIG9mZnNldCk7CisJCWRhdGFsZW4gPSByZXZpZHhbMV0ub2Zmc2V0IC0gb2Zmc2V0OworCQlpZiAoIXBhY2tfdG9fc3Rkb3V0ICYmIHAtPmluZGV4X3ZlcnNpb24gPiAxICYmCisJCSAgICBjaGVja19wYWNrX2NyYyhwLCAmd19jdXJzLCBvZmZzZXQsIGRhdGFsZW4sIHJldmlkeC0+bnIpKQorCQkJZGllKCJiYWQgcGFja2VkIG9iamVjdCBDUkMgZm9yICVzIiwgc2hhMV90b19oZXgoZW50cnktPmlkeC5zaGExKSk7CisJCW9mZnNldCArPSBlbnRyeS0+aW5fcGFja19oZWFkZXJfc2l6ZTsKKwkJZGF0YWxlbiAtPSBlbnRyeS0+aW5fcGFja19oZWFkZXJfc2l6ZTsKKwkJaWYgKG9ial90eXBlID09IE9CSl9PRlNfREVMVEEpIHsKKwkJCW9mZl90IG9mcyA9IGVudHJ5LT5pZHgub2Zmc2V0IC0gZW50cnktPmRlbHRhLT5pZHgub2Zmc2V0OworCQkJdW5zaWduZWQgcG9zID0gc2l6ZW9mKGRoZWFkZXIpIC0gMTsKKwkJCWRoZWFkZXJbcG9zXSA9IG9mcyAmIDEyNzsKKwkJCXdoaWxlIChvZnMgPj49IDcpCisJCQkJZGhlYWRlclstLXBvc10gPSAxMjggfCAoLS1vZnMgJiAxMjcpOworCQkJaWYgKGxpbWl0ICYmIGhkcmxlbiArIHNpemVvZihkaGVhZGVyKSAtIHBvcyArIGRhdGFsZW4gKyAyMCA+PSBsaW1pdCkKKwkJCQlyZXR1cm4gMDsKKwkJCXNoYTF3cml0ZShmLCBoZWFkZXIsIGhkcmxlbik7CisJCQlzaGExd3JpdGUoZiwgZGhlYWRlciArIHBvcywgc2l6ZW9mKGRoZWFkZXIpIC0gcG9zKTsKKwkJCWhkcmxlbiArPSBzaXplb2YoZGhlYWRlcikgLSBwb3M7CisJCX0gZWxzZSBpZiAob2JqX3R5cGUgPT0gT0JKX1JFRl9ERUxUQSkgeworCQkJaWYgKGxpbWl0ICYmIGhkcmxlbiArIDIwICsgZGF0YWxlbiArIDIwID49IGxpbWl0KQorCQkJCXJldHVybiAwOworCQkJc2hhMXdyaXRlKGYsIGhlYWRlciwgaGRybGVuKTsKKwkJCXNoYTF3cml0ZShmLCBlbnRyeS0+ZGVsdGEtPmlkeC5zaGExLCAyMCk7CisJCQloZHJsZW4gKz0gMjA7CisJCX0gZWxzZSB7CisJCQlpZiAobGltaXQgJiYgaGRybGVuICsgZGF0YWxlbiArIDIwID49IGxpbWl0KQorCQkJCXJldHVybiAwOworCQkJc2hhMXdyaXRlKGYsIGhlYWRlciwgaGRybGVuKTsKKwkJfQorCisJCWlmICghcGFja190b19zdGRvdXQgJiYgcC0+aW5kZXhfdmVyc2lvbiA9PSAxICYmCisJCSAgICBjaGVja19wYWNrX2luZmxhdGUocCwgJndfY3Vycywgb2Zmc2V0LCBkYXRhbGVuLCBlbnRyeS0+c2l6ZSkpCisJCQlkaWUoImNvcnJ1cHQgcGFja2VkIG9iamVjdCBmb3IgJXMiLCBzaGExX3RvX2hleChlbnRyeS0+aWR4LnNoYTEpKTsKKwkJY29weV9wYWNrX2RhdGEoZiwgcCwgJndfY3Vycywgb2Zmc2V0LCBkYXRhbGVuKTsKKwkJdW51c2VfcGFjaygmd19jdXJzKTsKKwkJcmV1c2VkKys7CisJfQorCWlmICh1c2FibGVfZGVsdGEpCisJCXdyaXR0ZW5fZGVsdGErKzsKKwl3cml0dGVuKys7CisJaWYgKCFwYWNrX3RvX3N0ZG91dCkKKwkJZW50cnktPmlkeC5jcmMzMiA9IGNyYzMyX2VuZChmKTsKKwlyZXR1cm4gaGRybGVuICsgZGF0YWxlbjsKK30KKworc3RhdGljIG9mZl90IHdyaXRlX29uZShzdHJ1Y3Qgc2hhMWZpbGUgKmYsCisJCQkgICAgICAgc3RydWN0IG9iamVjdF9lbnRyeSAqZSwKKwkJCSAgICAgICBvZmZfdCBvZmZzZXQpCit7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJLyogb2Zmc2V0IGlzIG5vbiB6ZXJvIGlmIG9iamVjdCBpcyB3cml0dGVuIGFscmVhZHkuICovCisJaWYgKGUtPmlkeC5vZmZzZXQgfHwgZS0+cHJlZmVycmVkX2Jhc2UpCisJCXJldHVybiBvZmZzZXQ7CisKKwkvKiBpZiB3ZSBhcmUgZGVsdGlmaWVkLCB3cml0ZSBvdXQgYmFzZSBvYmplY3QgZmlyc3QuICovCisJaWYgKGUtPmRlbHRhKSB7CisJCW9mZnNldCA9IHdyaXRlX29uZShmLCBlLT5kZWx0YSwgb2Zmc2V0KTsKKwkJaWYgKCFvZmZzZXQpCisJCQlyZXR1cm4gMDsKKwl9CisKKwllLT5pZHgub2Zmc2V0ID0gb2Zmc2V0OworCXNpemUgPSB3cml0ZV9vYmplY3QoZiwgZSwgb2Zmc2V0KTsKKwlpZiAoIXNpemUpIHsKKwkJZS0+aWR4Lm9mZnNldCA9IDA7CisJCXJldHVybiAwOworCX0KKwl3cml0dGVuX2xpc3RbbnJfd3JpdHRlbisrXSA9ICZlLT5pZHg7CisKKwkvKiBtYWtlIHN1cmUgb2ZmX3QgaXMgc3VmZmljaWVudGx5IGxhcmdlIG5vdCB0byB3cmFwICovCisJaWYgKG9mZnNldCA+IG9mZnNldCArIHNpemUpCisJCWRpZSgicGFjayB0b28gbGFyZ2UgZm9yIGN1cnJlbnQgZGVmaW5pdGlvbiBvZiBvZmZfdCIpOworCXJldHVybiBvZmZzZXQgKyBzaXplOworfQorCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIGZvciB3cml0ZV9wYWNrX2ZpbGUgKi8KK3N0YXRpYyBpbnQgYWRqdXN0X3Blcm0oY29uc3QgY2hhciAqcGF0aCwgbW9kZV90IG1vZGUpOworCitzdGF0aWMgdm9pZCB3cml0ZV9wYWNrX2ZpbGUodm9pZCkKK3sKKwl1aW50MzJfdCBpID0gMCwgajsKKwlzdHJ1Y3Qgc2hhMWZpbGUgKmY7CisJb2ZmX3Qgb2Zmc2V0LCBvZmZzZXRfb25lLCBsYXN0X29ial9vZmZzZXQgPSAwOworCXN0cnVjdCBwYWNrX2hlYWRlciBoZHI7CisJaW50IGRvX3Byb2dyZXNzID0gcHJvZ3Jlc3MgPj4gcGFja190b19zdGRvdXQ7CisJdWludDMyX3QgbnJfcmVtYWluaW5nID0gbnJfcmVzdWx0OworCXRpbWVfdCBsYXN0X210aW1lID0gMDsKKworCWlmIChkb19wcm9ncmVzcykKKwkJcHJvZ3Jlc3Nfc3RhdGUgPSBzdGFydF9wcm9ncmVzcygiV3JpdGluZyBvYmplY3RzIiwgbnJfcmVzdWx0KTsKKwl3cml0dGVuX2xpc3QgPSB4bWFsbG9jKG5yX29iamVjdHMgKiBzaXplb2YoKndyaXR0ZW5fbGlzdCkpOworCisJZG8geworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQljaGFyICpwYWNrX3RtcF9uYW1lID0gTlVMTDsKKworCQlpZiAocGFja190b19zdGRvdXQpIHsKKwkJCWYgPSBzaGExZmRfdGhyb3VnaHB1dCgxLCAiPHN0ZG91dD4iLCBwcm9ncmVzc19zdGF0ZSk7CisJCX0gZWxzZSB7CisJCQljaGFyIHRtcG5hbWVbUEFUSF9NQVhdOworCQkJaW50IGZkOworCQkJc25wcmludGYodG1wbmFtZSwgc2l6ZW9mKHRtcG5hbWUpLAorCQkJCSAiJXMvdG1wX3BhY2tfWFhYWFhYIiwgZ2V0X29iamVjdF9kaXJlY3RvcnkoKSk7CisJCQlmZCA9IHhta3N0ZW1wKHRtcG5hbWUpOworCQkJcGFja190bXBfbmFtZSA9IHhzdHJkdXAodG1wbmFtZSk7CisJCQlmID0gc2hhMWZkKGZkLCBwYWNrX3RtcF9uYW1lKTsKKwkJfQorCisJCWhkci5oZHJfc2lnbmF0dXJlID0gaHRvbmwoUEFDS19TSUdOQVRVUkUpOworCQloZHIuaGRyX3ZlcnNpb24gPSBodG9ubChQQUNLX1ZFUlNJT04pOworCQloZHIuaGRyX2VudHJpZXMgPSBodG9ubChucl9yZW1haW5pbmcpOworCQlzaGExd3JpdGUoZiwgJmhkciwgc2l6ZW9mKGhkcikpOworCQlvZmZzZXQgPSBzaXplb2YoaGRyKTsKKwkJbnJfd3JpdHRlbiA9IDA7CisJCWZvciAoOyBpIDwgbnJfb2JqZWN0czsgaSsrKSB7CisJCQlsYXN0X29ial9vZmZzZXQgPSBvZmZzZXQ7CisJCQlvZmZzZXRfb25lID0gd3JpdGVfb25lKGYsIG9iamVjdHMgKyBpLCBvZmZzZXQpOworCQkJaWYgKCFvZmZzZXRfb25lKQorCQkJCWJyZWFrOworCQkJb2Zmc2V0ID0gb2Zmc2V0X29uZTsKKwkJCWRpc3BsYXlfcHJvZ3Jlc3MocHJvZ3Jlc3Nfc3RhdGUsIHdyaXR0ZW4pOworCQl9CisKKwkJLyoKKwkJICogRGlkIHdlIHdyaXRlIHRoZSB3cm9uZyAjIGVudHJpZXMgaW4gdGhlIGhlYWRlcj8KKwkJICogSWYgc28sIHJld3JpdGUgaXQgbGlrZSBpbiBmYXN0LWltcG9ydAorCQkgKi8KKwkJaWYgKHBhY2tfdG9fc3Rkb3V0IHx8IG5yX3dyaXR0ZW4gPT0gbnJfcmVtYWluaW5nKSB7CisJCQlzaGExY2xvc2UoZiwgc2hhMSwgMSk7CisJCX0gZWxzZSB7CisJCQlpbnQgZmQgPSBzaGExY2xvc2UoZiwgTlVMTCwgMCk7CisJCQlmaXh1cF9wYWNrX2hlYWRlcl9mb290ZXIoZmQsIHNoYTEsIHBhY2tfdG1wX25hbWUsIG5yX3dyaXR0ZW4pOworCQkJY2xvc2UoZmQpOworCQl9CisKKwkJaWYgKCFwYWNrX3RvX3N0ZG91dCkgeworCQkJbW9kZV90IG1vZGUgPSB1bWFzaygwKTsKKwkJCXN0cnVjdCBzdGF0IHN0OworCQkJY2hhciAqaWR4X3RtcF9uYW1lLCB0bXBuYW1lW1BBVEhfTUFYXTsKKworCQkJdW1hc2sobW9kZSk7CisJCQltb2RlID0gMDQ0NCAmIH5tb2RlOworCisJCQlpZHhfdG1wX25hbWUgPSB3cml0ZV9pZHhfZmlsZShOVUxMLCB3cml0dGVuX2xpc3QsCisJCQkJCQkgICAgICBucl93cml0dGVuLCBzaGExKTsKKworCQkJc25wcmludGYodG1wbmFtZSwgc2l6ZW9mKHRtcG5hbWUpLCAiJXMtJXMucGFjayIsCisJCQkJIGJhc2VfbmFtZSwgc2hhMV90b19oZXgoc2hhMSkpOworCQkJaWYgKGFkanVzdF9wZXJtKHBhY2tfdG1wX25hbWUsIG1vZGUpKQorCQkJCWRpZSgidW5hYmxlIHRvIG1ha2UgdGVtcG9yYXJ5IHBhY2sgZmlsZSByZWFkYWJsZTogJXMiLAorCQkJCSAgICBzdHJlcnJvcihlcnJubykpOworCQkJaWYgKHJlbmFtZShwYWNrX3RtcF9uYW1lLCB0bXBuYW1lKSkKKwkJCQlkaWUoInVuYWJsZSB0byByZW5hbWUgdGVtcG9yYXJ5IHBhY2sgZmlsZTogJXMiLAorCQkJCSAgICBzdHJlcnJvcihlcnJubykpOworCisJCQkvKgorCQkJICogUGFja3MgYXJlIHJ1bnRpbWUgYWNjZXNzZWQgaW4gdGhlaXIgbXRpbWUKKwkJCSAqIG9yZGVyIHNpbmNlIG5ld2VyIHBhY2tzIGFyZSBtb3JlIGxpa2VseSB0byBjb250YWluCisJCQkgKiB5b3VuZ2VyIG9iamVjdHMuICBTbyBpZiB3ZSBhcmUgY3JlYXRpbmcgbXVsdGlwbGUKKwkJCSAqIHBhY2tzIHRoZW4gd2Ugc2hvdWxkIG1vZGlmeSB0aGUgbXRpbWUgb2YgbGF0ZXIgb25lcworCQkJICogdG8gcHJlc2VydmUgdGhpcyBwcm9wZXJ0eS4KKwkJCSAqLworCQkJaWYgKHN0YXQodG1wbmFtZSwgJnN0KSA8IDApIHsKKwkJCQl3YXJuaW5nKCJmYWlsZWQgdG8gc3RhdCAlczogJXMiLAorCQkJCQl0bXBuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQkJfSBlbHNlIGlmICghbGFzdF9tdGltZSkgeworCQkJCWxhc3RfbXRpbWUgPSBzdC5zdF9tdGltZTsKKwkJCX0gZWxzZSB7CisJCQkJc3RydWN0IHV0aW1idWYgdXRiOworCQkJCXV0Yi5hY3RpbWUgPSBzdC5zdF9hdGltZTsKKwkJCQl1dGIubW9kdGltZSA9IC0tbGFzdF9tdGltZTsKKwkJCQlpZiAodXRpbWUodG1wbmFtZSwgJnV0YikgPCAwKQorCQkJCQl3YXJuaW5nKCJmYWlsZWQgdXRpbWUoKSBvbiAlczogJXMiLAorCQkJCQkJdG1wbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0KKworCQkJc25wcmludGYodG1wbmFtZSwgc2l6ZW9mKHRtcG5hbWUpLCAiJXMtJXMuaWR4IiwKKwkJCQkgYmFzZV9uYW1lLCBzaGExX3RvX2hleChzaGExKSk7CisJCQlpZiAoYWRqdXN0X3Blcm0oaWR4X3RtcF9uYW1lLCBtb2RlKSkKKwkJCQlkaWUoInVuYWJsZSB0byBtYWtlIHRlbXBvcmFyeSBpbmRleCBmaWxlIHJlYWRhYmxlOiAlcyIsCisJCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCQlpZiAocmVuYW1lKGlkeF90bXBfbmFtZSwgdG1wbmFtZSkpCisJCQkJZGllKCJ1bmFibGUgdG8gcmVuYW1lIHRlbXBvcmFyeSBpbmRleCBmaWxlOiAlcyIsCisJCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisKKwkJCWZyZWUoaWR4X3RtcF9uYW1lKTsKKwkJCWZyZWUocGFja190bXBfbmFtZSk7CisJCQlwdXRzKHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJfQorCisJCS8qIG1hcmsgd3JpdHRlbiBvYmplY3RzIGFzIHdyaXR0ZW4gdG8gcHJldmlvdXMgcGFjayAqLworCQlmb3IgKGogPSAwOyBqIDwgbnJfd3JpdHRlbjsgaisrKSB7CisJCQl3cml0dGVuX2xpc3Rbal0tPm9mZnNldCA9IChvZmZfdCktMTsKKwkJfQorCQlucl9yZW1haW5pbmcgLT0gbnJfd3JpdHRlbjsKKwl9IHdoaWxlIChucl9yZW1haW5pbmcgJiYgaSA8IG5yX29iamVjdHMpOworCisJZnJlZSh3cml0dGVuX2xpc3QpOworCXN0b3BfcHJvZ3Jlc3MoJnByb2dyZXNzX3N0YXRlKTsKKwlpZiAod3JpdHRlbiAhPSBucl9yZXN1bHQpCisJCWRpZSgid3JvdGUgJXUgb2JqZWN0cyB3aGlsZSBleHBlY3RpbmcgJXUiLCB3cml0dGVuLCBucl9yZXN1bHQpOworCS8qCisJICogV2UgaGF2ZSBzY2FubmVkIHRocm91Z2ggWzAgLi4uIGkpLiAgU2luY2Ugd2UgaGF2ZSB3cml0dGVuCisJICogdGhlIGNvcnJlY3QgbnVtYmVyIG9mIG9iamVjdHMsICB0aGUgcmVtYWluaW5nIFtpIC4uLiBucl9vYmplY3RzKQorCSAqIGl0ZW1zIG11c3QgYmUgZWl0aGVyIGFscmVhZHkgd3JpdHRlbiAoZHVlIHRvIG91dC1vZi1vcmRlciBkZWx0YSBiYXNlKQorCSAqIG9yIGEgcHJlZmVycmVkIGJhc2UuICBDb3VudCB0aG9zZSB3aGljaCBhcmUgbmVpdGhlciBhbmQgY29tcGxhaW4gaWYgYW55LgorCSAqLworCWZvciAoaiA9IDA7IGkgPCBucl9vYmplY3RzOyBpKyspIHsKKwkJc3RydWN0IG9iamVjdF9lbnRyeSAqZSA9IG9iamVjdHMgKyBpOworCQlqICs9ICFlLT5pZHgub2Zmc2V0ICYmICFlLT5wcmVmZXJyZWRfYmFzZTsKKwl9CisJaWYgKGopCisJCWRpZSgid3JvdGUgJXUgb2JqZWN0cyBhcyBleHBlY3RlZCBidXQgJXUgdW53cml0dGVuIiwgd3JpdHRlbiwgaik7Cit9CisKK3N0YXRpYyBpbnQgbG9jYXRlX29iamVjdF9lbnRyeV9oYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IHVpOworCW1lbWNweSgmdWksIHNoYTEsIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKwlpID0gdWkgJSBvYmplY3RfaXhfaGFzaHN6OworCXdoaWxlICgwIDwgb2JqZWN0X2l4W2ldKSB7CisJCWlmICghaGFzaGNtcChzaGExLCBvYmplY3RzW29iamVjdF9peFtpXSAtIDFdLmlkeC5zaGExKSkKKwkJCXJldHVybiBpOworCQlpZiAoKytpID09IG9iamVjdF9peF9oYXNoc3opCisJCQlpID0gMDsKKwl9CisJcmV0dXJuIC0xIC0gaTsKK30KKworc3RhdGljIHN0cnVjdCBvYmplY3RfZW50cnkgKmxvY2F0ZV9vYmplY3RfZW50cnkoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpbnQgaTsKKworCWlmICghb2JqZWN0X2l4X2hhc2hzeikKKwkJcmV0dXJuIE5VTEw7CisKKwlpID0gbG9jYXRlX29iamVjdF9lbnRyeV9oYXNoKHNoYTEpOworCWlmICgwIDw9IGkpCisJCXJldHVybiAmb2JqZWN0c1tvYmplY3RfaXhbaV0tMV07CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHJlaGFzaF9vYmplY3RzKHZvaWQpCit7CisJdWludDMyX3QgaTsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpvZTsKKworCW9iamVjdF9peF9oYXNoc3ogPSBucl9vYmplY3RzICogMzsKKwlpZiAob2JqZWN0X2l4X2hhc2hzeiA8IDEwMjQpCisJCW9iamVjdF9peF9oYXNoc3ogPSAxMDI0OworCW9iamVjdF9peCA9IHhyZWFsbG9jKG9iamVjdF9peCwgc2l6ZW9mKGludCkgKiBvYmplY3RfaXhfaGFzaHN6KTsKKwltZW1zZXQob2JqZWN0X2l4LCAwLCBzaXplb2YoaW50KSAqIG9iamVjdF9peF9oYXNoc3opOworCWZvciAoaSA9IDAsIG9lID0gb2JqZWN0czsgaSA8IG5yX29iamVjdHM7IGkrKywgb2UrKykgeworCQlpbnQgaXggPSBsb2NhdGVfb2JqZWN0X2VudHJ5X2hhc2gob2UtPmlkeC5zaGExKTsKKwkJaWYgKDAgPD0gaXgpCisJCQljb250aW51ZTsKKwkJaXggPSAtMSAtIGl4OworCQlvYmplY3RfaXhbaXhdID0gaSArIDE7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgbmFtZV9oYXNoKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgY2hhciBjOworCXVuc2lnbmVkIGhhc2ggPSAwOworCisJaWYgKCFuYW1lKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogVGhpcyBlZmZlY3RpdmVseSBqdXN0IGNyZWF0ZXMgYSBzb3J0YWJsZSBudW1iZXIgZnJvbSB0aGUKKwkgKiBsYXN0IHNpeHRlZW4gbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycy4gTGFzdCBjaGFyYWN0ZXJzCisJICogY291bnQgIm1vc3QiLCBzbyB0aGluZ3MgdGhhdCBlbmQgaW4gIi5jIiBzb3J0IHRvZ2V0aGVyLgorCSAqLworCXdoaWxlICgoYyA9ICpuYW1lKyspICE9IDApIHsKKwkJaWYgKGlzc3BhY2UoYykpCisJCQljb250aW51ZTsKKwkJaGFzaCA9IChoYXNoID4+IDIpICsgKGMgPDwgMjQpOworCX0KKwlyZXR1cm4gaGFzaDsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfZGVsdGFfYXR0cl9jaGVjayhzdHJ1Y3QgZ2l0X2F0dHJfY2hlY2sgKmNoZWNrKQoreworCXN0YXRpYyBzdHJ1Y3QgZ2l0X2F0dHIgKmF0dHJfZGVsdGE7CisKKwlpZiAoIWF0dHJfZGVsdGEpCisJCWF0dHJfZGVsdGEgPSBnaXRfYXR0cigiZGVsdGEiLCA1KTsKKworCWNoZWNrWzBdLmF0dHIgPSBhdHRyX2RlbHRhOworfQorCitzdGF0aWMgaW50IG5vX3RyeV9kZWx0YShjb25zdCBjaGFyICpwYXRoKQoreworCXN0cnVjdCBnaXRfYXR0cl9jaGVjayBjaGVja1sxXTsKKworCXNldHVwX2RlbHRhX2F0dHJfY2hlY2soY2hlY2spOworCWlmIChnaXRfY2hlY2thdHRyKHBhdGgsIEFSUkFZX1NJWkUoY2hlY2spLCBjaGVjaykpCisJCXJldHVybiAwOworCWlmIChBVFRSX0ZBTFNFKGNoZWNrLT52YWx1ZSkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZF9vYmplY3RfZW50cnkoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgZW51bSBvYmplY3RfdHlwZSB0eXBlLAorCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBleGNsdWRlKQoreworCXN0cnVjdCBvYmplY3RfZW50cnkgKmVudHJ5OworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwLCAqZm91bmRfcGFjayA9IE5VTEw7CisJb2ZmX3QgZm91bmRfb2Zmc2V0ID0gMDsKKwlpbnQgaXg7CisJdW5zaWduZWQgaGFzaCA9IG5hbWVfaGFzaChuYW1lKTsKKworCWl4ID0gbnJfb2JqZWN0cyA/IGxvY2F0ZV9vYmplY3RfZW50cnlfaGFzaChzaGExKSA6IC0xOworCWlmIChpeCA+PSAwKSB7CisJCWlmIChleGNsdWRlKSB7CisJCQllbnRyeSA9IG9iamVjdHMgKyBvYmplY3RfaXhbaXhdIC0gMTsKKwkJCWlmICghZW50cnktPnByZWZlcnJlZF9iYXNlKQorCQkJCW5yX3Jlc3VsdC0tOworCQkJZW50cnktPnByZWZlcnJlZF9iYXNlID0gMTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKHAgPSBwYWNrZWRfZ2l0OyBwOyBwID0gcC0+bmV4dCkgeworCQlvZmZfdCBvZmZzZXQgPSBmaW5kX3BhY2tfZW50cnlfb25lKHNoYTEsIHApOworCQlpZiAob2Zmc2V0KSB7CisJCQlpZiAoIWZvdW5kX3BhY2spIHsKKwkJCQlmb3VuZF9vZmZzZXQgPSBvZmZzZXQ7CisJCQkJZm91bmRfcGFjayA9IHA7CisJCQl9CisJCQlpZiAoZXhjbHVkZSkKKwkJCQlicmVhazsKKwkJCWlmIChpbmNyZW1lbnRhbCkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChsb2NhbCAmJiAhcC0+cGFja19sb2NhbCkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmIChucl9vYmplY3RzID49IG5yX2FsbG9jKSB7CisJCW5yX2FsbG9jID0gKG5yX2FsbG9jICArIDEwMjQpICogMyAvIDI7CisJCW9iamVjdHMgPSB4cmVhbGxvYyhvYmplY3RzLCBucl9hbGxvYyAqIHNpemVvZigqZW50cnkpKTsKKwl9CisKKwllbnRyeSA9IG9iamVjdHMgKyBucl9vYmplY3RzKys7CisJbWVtc2V0KGVudHJ5LCAwLCBzaXplb2YoKmVudHJ5KSk7CisJaGFzaGNweShlbnRyeS0+aWR4LnNoYTEsIHNoYTEpOworCWVudHJ5LT5oYXNoID0gaGFzaDsKKwlpZiAodHlwZSkKKwkJZW50cnktPnR5cGUgPSB0eXBlOworCWlmIChleGNsdWRlKQorCQllbnRyeS0+cHJlZmVycmVkX2Jhc2UgPSAxOworCWVsc2UKKwkJbnJfcmVzdWx0Kys7CisJaWYgKGZvdW5kX3BhY2spIHsKKwkJZW50cnktPmluX3BhY2sgPSBmb3VuZF9wYWNrOworCQllbnRyeS0+aW5fcGFja19vZmZzZXQgPSBmb3VuZF9vZmZzZXQ7CisJfQorCisJaWYgKG9iamVjdF9peF9oYXNoc3ogKiAzIDw9IG5yX29iamVjdHMgKiA0KQorCQlyZWhhc2hfb2JqZWN0cygpOworCWVsc2UKKwkJb2JqZWN0X2l4Wy0xIC0gaXhdID0gbnJfb2JqZWN0czsKKworCWRpc3BsYXlfcHJvZ3Jlc3MocHJvZ3Jlc3Nfc3RhdGUsIG5yX29iamVjdHMpOworCisJaWYgKG5hbWUgJiYgbm9fdHJ5X2RlbHRhKG5hbWUpKQorCQllbnRyeS0+bm9fdHJ5X2RlbHRhID0gMTsKKworCXJldHVybiAxOworfQorCitzdHJ1Y3QgcGJhc2VfdHJlZV9jYWNoZSB7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlpbnQgcmVmOworCWludCB0ZW1wb3Jhcnk7CisJdm9pZCAqdHJlZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgdHJlZV9zaXplOworfTsKKworc3RhdGljIHN0cnVjdCBwYmFzZV90cmVlX2NhY2hlICoocGJhc2VfdHJlZV9jYWNoZVsyNTZdKTsKK3N0YXRpYyBpbnQgcGJhc2VfdHJlZV9jYWNoZV9peChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXJldHVybiBzaGExWzBdICUgQVJSQVlfU0laRShwYmFzZV90cmVlX2NhY2hlKTsKK30KK3N0YXRpYyBpbnQgcGJhc2VfdHJlZV9jYWNoZV9peF9pbmNyKGludCBpeCkKK3sKKwlyZXR1cm4gKGl4KzEpICUgQVJSQVlfU0laRShwYmFzZV90cmVlX2NhY2hlKTsKK30KKworc3RhdGljIHN0cnVjdCBwYmFzZV90cmVlIHsKKwlzdHJ1Y3QgcGJhc2VfdHJlZSAqbmV4dDsKKwkvKiBUaGlzIGlzIGEgcGhvbnkgImNhY2hlIiBlbnRyeTsgd2UgYXJlIG5vdAorCSAqIGdvaW5nIHRvIGV2aWN0IGl0IG5vciBmaW5kIGl0IHRocm91Z2ggX2dldCgpCisJICogbWVjaGFuaXNtIC0tIHRoaXMgaXMgZm9yIHRoZSB0b3BsZXZlbCBub2RlIHRoYXQKKwkgKiB3b3VsZCBhbG1vc3QgYWx3YXlzIGNoYW5nZSB3aXRoIGFueSBjb21taXQuCisJICovCisJc3RydWN0IHBiYXNlX3RyZWVfY2FjaGUgcGNhY2hlOworfSAqcGJhc2VfdHJlZTsKKworc3RhdGljIHN0cnVjdCBwYmFzZV90cmVlX2NhY2hlICpwYmFzZV90cmVlX2dldChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBwYmFzZV90cmVlX2NhY2hlICplbnQsICpuZW50OworCXZvaWQgKmRhdGE7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwlpbnQgbmVpZ2g7CisJaW50IG15X2l4ID0gcGJhc2VfdHJlZV9jYWNoZV9peChzaGExKTsKKwlpbnQgYXZhaWxhYmxlX2l4ID0gLTE7CisKKwkvKiBwYmFzZS10cmVlLWNhY2hlIGFjdHMgYXMgYSBsaW1pdGVkIGhhc2h0YWJsZS4KKwkgKiB5b3VyIG9iamVjdCB3aWxsIGJlIGZvdW5kIGF0IHlvdXIgaW5kZXggb3Igd2l0aGluIGEgZmV3CisJICogc2xvdHMgYWZ0ZXIgdGhhdCBzbG90IGlmIGl0IGlzIGNhY2hlZC4KKwkgKi8KKwlmb3IgKG5laWdoID0gMDsgbmVpZ2ggPCA4OyBuZWlnaCsrKSB7CisJCWVudCA9IHBiYXNlX3RyZWVfY2FjaGVbbXlfaXhdOworCQlpZiAoZW50ICYmICFoYXNoY21wKGVudC0+c2hhMSwgc2hhMSkpIHsKKwkJCWVudC0+cmVmKys7CisJCQlyZXR1cm4gZW50OworCQl9CisJCWVsc2UgaWYgKCgoYXZhaWxhYmxlX2l4IDwgMCkgJiYgKCFlbnQgfHwgIWVudC0+cmVmKSkgfHwKKwkJCSAoKDAgPD0gYXZhaWxhYmxlX2l4KSAmJgorCQkJICAoIWVudCAmJiBwYmFzZV90cmVlX2NhY2hlW2F2YWlsYWJsZV9peF0pKSkKKwkJCWF2YWlsYWJsZV9peCA9IG15X2l4OworCQlpZiAoIWVudCkKKwkJCWJyZWFrOworCQlteV9peCA9IHBiYXNlX3RyZWVfY2FjaGVfaXhfaW5jcihteV9peCk7CisJfQorCisJLyogRGlkIG5vdCBmaW5kIG9uZS4gIEVpdGhlciB3ZSBnb3QgYSBib2d1cyByZXF1ZXN0IG9yCisJICogd2UgbmVlZCB0byByZWFkIGFuZCBwZXJoYXBzIGNhY2hlLgorCSAqLworCWRhdGEgPSByZWFkX3NoYTFfZmlsZShzaGExLCAmdHlwZSwgJnNpemUpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHR5cGUgIT0gT0JKX1RSRUUpIHsKKwkJZnJlZShkYXRhKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogV2UgbmVlZCB0byBlaXRoZXIgY2FjaGUgb3IgcmV0dXJuIGEgdGhyb3dhd2F5IGNvcHkgKi8KKworCWlmIChhdmFpbGFibGVfaXggPCAwKQorCQllbnQgPSBOVUxMOworCWVsc2UgeworCQllbnQgPSBwYmFzZV90cmVlX2NhY2hlW2F2YWlsYWJsZV9peF07CisJCW15X2l4ID0gYXZhaWxhYmxlX2l4OworCX0KKworCWlmICghZW50KSB7CisJCW5lbnQgPSB4bWFsbG9jKHNpemVvZigqbmVudCkpOworCQluZW50LT50ZW1wb3JhcnkgPSAoYXZhaWxhYmxlX2l4IDwgMCk7CisJfQorCWVsc2UgeworCQkvKiBldmljdCBhbmQgcmV1c2UgKi8KKwkJZnJlZShlbnQtPnRyZWVfZGF0YSk7CisJCW5lbnQgPSBlbnQ7CisJfQorCWhhc2hjcHkobmVudC0+c2hhMSwgc2hhMSk7CisJbmVudC0+dHJlZV9kYXRhID0gZGF0YTsKKwluZW50LT50cmVlX3NpemUgPSBzaXplOworCW5lbnQtPnJlZiA9IDE7CisJaWYgKCFuZW50LT50ZW1wb3JhcnkpCisJCXBiYXNlX3RyZWVfY2FjaGVbbXlfaXhdID0gbmVudDsKKwlyZXR1cm4gbmVudDsKK30KKworc3RhdGljIHZvaWQgcGJhc2VfdHJlZV9wdXQoc3RydWN0IHBiYXNlX3RyZWVfY2FjaGUgKmNhY2hlKQoreworCWlmICghY2FjaGUtPnRlbXBvcmFyeSkgeworCQljYWNoZS0+cmVmLS07CisJCXJldHVybjsKKwl9CisJZnJlZShjYWNoZS0+dHJlZV9kYXRhKTsKKwlmcmVlKGNhY2hlKTsKK30KKworc3RhdGljIGludCBuYW1lX2NtcF9sZW4oY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBuYW1lW2ldICYmIG5hbWVbaV0gIT0gJ1xuJyAmJiBuYW1lW2ldICE9ICcvJzsgaSsrKQorCQk7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9wYmFzZV9vYmplY3Qoc3RydWN0IHRyZWVfZGVzYyAqdHJlZSwKKwkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgaW50IGNtcGxlbiwKKwkJCSAgICAgY29uc3QgY2hhciAqZnVsbG5hbWUpCit7CisJc3RydWN0IG5hbWVfZW50cnkgZW50cnk7CisJaW50IGNtcDsKKworCXdoaWxlICh0cmVlX2VudHJ5KHRyZWUsJmVudHJ5KSkgeworCQlpZiAoU19JU0dJVExJTksoZW50cnkubW9kZSkpCisJCQljb250aW51ZTsKKwkJY21wID0gdHJlZV9lbnRyeV9sZW4oZW50cnkucGF0aCwgZW50cnkuc2hhMSkgIT0gY21wbGVuID8gMSA6CisJCSAgICAgIG1lbWNtcChuYW1lLCBlbnRyeS5wYXRoLCBjbXBsZW4pOworCQlpZiAoY21wID4gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoY21wIDwgMCkKKwkJCXJldHVybjsKKwkJaWYgKG5hbWVbY21wbGVuXSAhPSAnLycpIHsKKwkJCWFkZF9vYmplY3RfZW50cnkoZW50cnkuc2hhMSwKKwkJCQkJIG9iamVjdF90eXBlKGVudHJ5Lm1vZGUpLAorCQkJCQkgZnVsbG5hbWUsIDEpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChTX0lTRElSKGVudHJ5Lm1vZGUpKSB7CisJCQlzdHJ1Y3QgdHJlZV9kZXNjIHN1YjsKKwkJCXN0cnVjdCBwYmFzZV90cmVlX2NhY2hlICp0cmVlOworCQkJY29uc3QgY2hhciAqZG93biA9IG5hbWUrY21wbGVuKzE7CisJCQlpbnQgZG93bmxlbiA9IG5hbWVfY21wX2xlbihkb3duKTsKKworCQkJdHJlZSA9IHBiYXNlX3RyZWVfZ2V0KGVudHJ5LnNoYTEpOworCQkJaWYgKCF0cmVlKQorCQkJCXJldHVybjsKKwkJCWluaXRfdHJlZV9kZXNjKCZzdWIsIHRyZWUtPnRyZWVfZGF0YSwgdHJlZS0+dHJlZV9zaXplKTsKKworCQkJYWRkX3BiYXNlX29iamVjdCgmc3ViLCBkb3duLCBkb3dubGVuLCBmdWxsbmFtZSk7CisJCQlwYmFzZV90cmVlX3B1dCh0cmVlKTsKKwkJfQorCX0KK30KKworc3RhdGljIHVuc2lnbmVkICpkb25lX3BiYXNlX3BhdGhzOworc3RhdGljIGludCBkb25lX3BiYXNlX3BhdGhzX251bTsKK3N0YXRpYyBpbnQgZG9uZV9wYmFzZV9wYXRoc19hbGxvYzsKK3N0YXRpYyBpbnQgZG9uZV9wYmFzZV9wYXRoX3Bvcyh1bnNpZ25lZCBoYXNoKQoreworCWludCBsbyA9IDA7CisJaW50IGhpID0gZG9uZV9wYmFzZV9wYXRoc19udW07CisJd2hpbGUgKGxvIDwgaGkpIHsKKwkJaW50IG1pID0gKGhpICsgbG8pIC8gMjsKKwkJaWYgKGRvbmVfcGJhc2VfcGF0aHNbbWldID09IGhhc2gpCisJCQlyZXR1cm4gbWk7CisJCWlmIChkb25lX3BiYXNlX3BhdGhzW21pXSA8IGhhc2gpCisJCQloaSA9IG1pOworCQllbHNlCisJCQlsbyA9IG1pICsgMTsKKwl9CisJcmV0dXJuIC1sby0xOworfQorCitzdGF0aWMgaW50IGNoZWNrX3BiYXNlX3BhdGgodW5zaWduZWQgaGFzaCkKK3sKKwlpbnQgcG9zID0gKCFkb25lX3BiYXNlX3BhdGhzKSA/IC0xIDogZG9uZV9wYmFzZV9wYXRoX3BvcyhoYXNoKTsKKwlpZiAoMCA8PSBwb3MpCisJCXJldHVybiAxOworCXBvcyA9IC1wb3MgLSAxOworCWlmIChkb25lX3BiYXNlX3BhdGhzX2FsbG9jIDw9IGRvbmVfcGJhc2VfcGF0aHNfbnVtKSB7CisJCWRvbmVfcGJhc2VfcGF0aHNfYWxsb2MgPSBhbGxvY19ucihkb25lX3BiYXNlX3BhdGhzX2FsbG9jKTsKKwkJZG9uZV9wYmFzZV9wYXRocyA9IHhyZWFsbG9jKGRvbmVfcGJhc2VfcGF0aHMsCisJCQkJCSAgICBkb25lX3BiYXNlX3BhdGhzX2FsbG9jICoKKwkJCQkJICAgIHNpemVvZih1bnNpZ25lZCkpOworCX0KKwlkb25lX3BiYXNlX3BhdGhzX251bSsrOworCWlmIChwb3MgPCBkb25lX3BiYXNlX3BhdGhzX251bSkKKwkJbWVtbW92ZShkb25lX3BiYXNlX3BhdGhzICsgcG9zICsgMSwKKwkJCWRvbmVfcGJhc2VfcGF0aHMgKyBwb3MsCisJCQkoZG9uZV9wYmFzZV9wYXRoc19udW0gLSBwb3MgLSAxKSAqIHNpemVvZih1bnNpZ25lZCkpOworCWRvbmVfcGJhc2VfcGF0aHNbcG9zXSA9IGhhc2g7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9wcmVmZXJyZWRfYmFzZV9vYmplY3QoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgcGJhc2VfdHJlZSAqaXQ7CisJaW50IGNtcGxlbjsKKwl1bnNpZ25lZCBoYXNoID0gbmFtZV9oYXNoKG5hbWUpOworCisJaWYgKCFudW1fcHJlZmVycmVkX2Jhc2UgfHwgY2hlY2tfcGJhc2VfcGF0aChoYXNoKSkKKwkJcmV0dXJuOworCisJY21wbGVuID0gbmFtZV9jbXBfbGVuKG5hbWUpOworCWZvciAoaXQgPSBwYmFzZV90cmVlOyBpdDsgaXQgPSBpdC0+bmV4dCkgeworCQlpZiAoY21wbGVuID09IDApIHsKKwkJCWFkZF9vYmplY3RfZW50cnkoaXQtPnBjYWNoZS5zaGExLCBPQkpfVFJFRSwgTlVMTCwgMSk7CisJCX0KKwkJZWxzZSB7CisJCQlzdHJ1Y3QgdHJlZV9kZXNjIHRyZWU7CisJCQlpbml0X3RyZWVfZGVzYygmdHJlZSwgaXQtPnBjYWNoZS50cmVlX2RhdGEsIGl0LT5wY2FjaGUudHJlZV9zaXplKTsKKwkJCWFkZF9wYmFzZV9vYmplY3QoJnRyZWUsIG5hbWUsIGNtcGxlbiwgbmFtZSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9wcmVmZXJyZWRfYmFzZSh1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBwYmFzZV90cmVlICppdDsKKwl2b2lkICpkYXRhOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIHRyZWVfc2hhMVsyMF07CisKKwlpZiAod2luZG93IDw9IG51bV9wcmVmZXJyZWRfYmFzZSsrKQorCQlyZXR1cm47CisKKwlkYXRhID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2Uoc2hhMSwgdHJlZV90eXBlLCAmc2l6ZSwgdHJlZV9zaGExKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybjsKKworCWZvciAoaXQgPSBwYmFzZV90cmVlOyBpdDsgaXQgPSBpdC0+bmV4dCkgeworCQlpZiAoIWhhc2hjbXAoaXQtPnBjYWNoZS5zaGExLCB0cmVlX3NoYTEpKSB7CisJCQlmcmVlKGRhdGEpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaXQgPSB4Y2FsbG9jKDEsIHNpemVvZigqaXQpKTsKKwlpdC0+bmV4dCA9IHBiYXNlX3RyZWU7CisJcGJhc2VfdHJlZSA9IGl0OworCisJaGFzaGNweShpdC0+cGNhY2hlLnNoYTEsIHRyZWVfc2hhMSk7CisJaXQtPnBjYWNoZS50cmVlX2RhdGEgPSBkYXRhOworCWl0LT5wY2FjaGUudHJlZV9zaXplID0gc2l6ZTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfb2JqZWN0KHN0cnVjdCBvYmplY3RfZW50cnkgKmVudHJ5KQoreworCWlmIChlbnRyeS0+aW5fcGFjaykgeworCQlzdHJ1Y3QgcGFja2VkX2dpdCAqcCA9IGVudHJ5LT5pbl9wYWNrOworCQlzdHJ1Y3QgcGFja193aW5kb3cgKndfY3VycyA9IE5VTEw7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJhc2VfcmVmID0gTlVMTDsKKwkJc3RydWN0IG9iamVjdF9lbnRyeSAqYmFzZV9lbnRyeTsKKwkJdW5zaWduZWQgbG9uZyB1c2VkLCB1c2VkXzA7CisJCXVuc2lnbmVkIGludCBhdmFpbDsKKwkJb2ZmX3Qgb2ZzOworCQl1bnNpZ25lZCBjaGFyICpidWYsIGM7CisKKwkJYnVmID0gdXNlX3BhY2socCwgJndfY3VycywgZW50cnktPmluX3BhY2tfb2Zmc2V0LCAmYXZhaWwpOworCisJCS8qCisJCSAqIFdlIHdhbnQgaW5fcGFja190eXBlIGV2ZW4gaWYgd2UgZG8gbm90IHJldXNlIGRlbHRhCisJCSAqIHNpbmNlIG5vbi1kZWx0YSByZXByZXNlbnRhdGlvbnMgY291bGQgc3RpbGwgYmUgcmV1c2VkLgorCQkgKi8KKwkJdXNlZCA9IHVucGFja19vYmplY3RfaGVhZGVyX2dlbnRseShidWYsIGF2YWlsLAorCQkJCQkJICAgJmVudHJ5LT5pbl9wYWNrX3R5cGUsCisJCQkJCQkgICAmZW50cnktPnNpemUpOworCisJCS8qCisJCSAqIERldGVybWluZSBpZiB0aGlzIGlzIGEgZGVsdGEgYW5kIGlmIHNvIHdoZXRoZXIgd2UgY2FuCisJCSAqIHJldXNlIGl0IG9yIG5vdC4gIE90aGVyd2lzZSBsZXQncyBmaW5kIG91dCBhcyBjaGVhcGx5IGFzCisJCSAqIHBvc3NpYmxlIHdoYXQgdGhlIGFjdHVhbCB0eXBlIGFuZCBzaXplIGZvciB0aGlzIG9iamVjdCBpcy4KKwkJICovCisJCXN3aXRjaCAoZW50cnktPmluX3BhY2tfdHlwZSkgeworCQlkZWZhdWx0OgorCQkJLyogTm90IGEgZGVsdGEgaGVuY2Ugd2UndmUgYWxyZWFkeSBnb3QgYWxsIHdlIG5lZWQuICovCisJCQllbnRyeS0+dHlwZSA9IGVudHJ5LT5pbl9wYWNrX3R5cGU7CisJCQllbnRyeS0+aW5fcGFja19oZWFkZXJfc2l6ZSA9IHVzZWQ7CisJCQl1bnVzZV9wYWNrKCZ3X2N1cnMpOworCQkJcmV0dXJuOworCQljYXNlIE9CSl9SRUZfREVMVEE6CisJCQlpZiAoIW5vX3JldXNlX2RlbHRhICYmICFlbnRyeS0+cHJlZmVycmVkX2Jhc2UpCisJCQkJYmFzZV9yZWYgPSB1c2VfcGFjayhwLCAmd19jdXJzLAorCQkJCQkJZW50cnktPmluX3BhY2tfb2Zmc2V0ICsgdXNlZCwgTlVMTCk7CisJCQllbnRyeS0+aW5fcGFja19oZWFkZXJfc2l6ZSA9IHVzZWQgKyAyMDsKKwkJCWJyZWFrOworCQljYXNlIE9CSl9PRlNfREVMVEE6CisJCQlidWYgPSB1c2VfcGFjayhwLCAmd19jdXJzLAorCQkJCSAgICAgICBlbnRyeS0+aW5fcGFja19vZmZzZXQgKyB1c2VkLCBOVUxMKTsKKwkJCXVzZWRfMCA9IDA7CisJCQljID0gYnVmW3VzZWRfMCsrXTsKKwkJCW9mcyA9IGMgJiAxMjc7CisJCQl3aGlsZSAoYyAmIDEyOCkgeworCQkJCW9mcyArPSAxOworCQkJCWlmICghb2ZzIHx8IE1TQihvZnMsIDcpKQorCQkJCQlkaWUoImRlbHRhIGJhc2Ugb2Zmc2V0IG92ZXJmbG93IGluIHBhY2sgZm9yICVzIiwKKwkJCQkJICAgIHNoYTFfdG9faGV4KGVudHJ5LT5pZHguc2hhMSkpOworCQkJCWMgPSBidWZbdXNlZF8wKytdOworCQkJCW9mcyA9IChvZnMgPDwgNykgKyAoYyAmIDEyNyk7CisJCQl9CisJCQlpZiAob2ZzID49IGVudHJ5LT5pbl9wYWNrX29mZnNldCkKKwkJCQlkaWUoImRlbHRhIGJhc2Ugb2Zmc2V0IG91dCBvZiBib3VuZCBmb3IgJXMiLAorCQkJCSAgICBzaGExX3RvX2hleChlbnRyeS0+aWR4LnNoYTEpKTsKKwkJCW9mcyA9IGVudHJ5LT5pbl9wYWNrX29mZnNldCAtIG9mczsKKwkJCWlmICghbm9fcmV1c2VfZGVsdGEgJiYgIWVudHJ5LT5wcmVmZXJyZWRfYmFzZSkgeworCQkJCXN0cnVjdCByZXZpbmRleF9lbnRyeSAqcmV2aWR4OworCQkJCXJldmlkeCA9IGZpbmRfcGFja19yZXZpbmRleChwLCBvZnMpOworCQkJCWJhc2VfcmVmID0gbnRoX3BhY2tlZF9vYmplY3Rfc2hhMShwLCByZXZpZHgtPm5yKTsKKwkJCX0KKwkJCWVudHJ5LT5pbl9wYWNrX2hlYWRlcl9zaXplID0gdXNlZCArIHVzZWRfMDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGJhc2VfcmVmICYmIChiYXNlX2VudHJ5ID0gbG9jYXRlX29iamVjdF9lbnRyeShiYXNlX3JlZikpKSB7CisJCQkvKgorCQkJICogSWYgYmFzZV9yZWYgd2FzIHNldCBhYm92ZSB0aGF0IG1lYW5zIHdlIHdpc2ggdG8KKwkJCSAqIHJldXNlIGRlbHRhIGRhdGEsIGFuZCB3ZSBldmVuIGZvdW5kIHRoYXQgYmFzZQorCQkJICogaW4gdGhlIGxpc3Qgb2Ygb2JqZWN0cyB3ZSB3YW50IHRvIHBhY2suIEdvb2RpZSEKKwkJCSAqCisJCQkgKiBEZXB0aCB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIgLSBmaW5kX2RlbHRhcygpIHdpbGwKKwkJCSAqIG5ldmVyIGNvbnNpZGVyIHJldXNlZCBkZWx0YSBhcyB0aGUgYmFzZSBvYmplY3QgdG8KKwkJCSAqIGRlbHRpZnkgb3RoZXIgb2JqZWN0cyBhZ2FpbnN0LCBpbiBvcmRlciB0byBhdm9pZAorCQkJICogY2lyY3VsYXIgZGVsdGFzLgorCQkJICovCisJCQllbnRyeS0+dHlwZSA9IGVudHJ5LT5pbl9wYWNrX3R5cGU7CisJCQllbnRyeS0+ZGVsdGEgPSBiYXNlX2VudHJ5OworCQkJZW50cnktPmRlbHRhX3NpYmxpbmcgPSBiYXNlX2VudHJ5LT5kZWx0YV9jaGlsZDsKKwkJCWJhc2VfZW50cnktPmRlbHRhX2NoaWxkID0gZW50cnk7CisJCQl1bnVzZV9wYWNrKCZ3X2N1cnMpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKGVudHJ5LT50eXBlKSB7CisJCQkvKgorCQkJICogVGhpcyBtdXN0IGJlIGEgZGVsdGEgYW5kIHdlIGFscmVhZHkga25vdyB3aGF0IHRoZQorCQkJICogZmluYWwgb2JqZWN0IHR5cGUgaXMuICBMZXQncyBleHRyYWN0IHRoZSBhY3R1YWwKKwkJCSAqIG9iamVjdCBzaXplIGZyb20gdGhlIGRlbHRhIGhlYWRlci4KKwkJCSAqLworCQkJZW50cnktPnNpemUgPSBnZXRfc2l6ZV9mcm9tX2RlbHRhKHAsICZ3X2N1cnMsCisJCQkJCWVudHJ5LT5pbl9wYWNrX29mZnNldCArIGVudHJ5LT5pbl9wYWNrX2hlYWRlcl9zaXplKTsKKwkJCXVudXNlX3BhY2soJndfY3Vycyk7CisJCQlyZXR1cm47CisJCX0KKworCQkvKgorCQkgKiBObyBjaG9pY2UgYnV0IHRvIGZhbGwgYmFjayB0byB0aGUgcmVjdXJzaXZlIGRlbHRhIHdhbGsKKwkJICogd2l0aCBzaGExX29iamVjdF9pbmZvKCkgdG8gZmluZCBhYm91dCB0aGUgb2JqZWN0IHR5cGUKKwkJICogYXQgdGhpcyBwb2ludC4uLgorCQkgKi8KKwkJdW51c2VfcGFjaygmd19jdXJzKTsKKwl9CisKKwllbnRyeS0+dHlwZSA9IHNoYTFfb2JqZWN0X2luZm8oZW50cnktPmlkeC5zaGExLCAmZW50cnktPnNpemUpOworCWlmIChlbnRyeS0+dHlwZSA8IDApCisJCWRpZSgidW5hYmxlIHRvIGdldCB0eXBlIG9mIG9iamVjdCAlcyIsCisJCSAgICBzaGExX3RvX2hleChlbnRyeS0+aWR4LnNoYTEpKTsKK30KKworc3RhdGljIGludCBwYWNrX29mZnNldF9zb3J0KGNvbnN0IHZvaWQgKl9hLCBjb25zdCB2b2lkICpfYikKK3sKKwljb25zdCBzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICphID0gKihzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqKV9hOworCWNvbnN0IHN0cnVjdCBvYmplY3RfZW50cnkgKmIgPSAqKHN0cnVjdCBvYmplY3RfZW50cnkgKiopX2I7CisKKwkvKiBhdm9pZCBmaWxlc3lzdGVtIHRyYXNoaW5nIHdpdGggbG9vc2Ugb2JqZWN0cyAqLworCWlmICghYS0+aW5fcGFjayAmJiAhYi0+aW5fcGFjaykKKwkJcmV0dXJuIGhhc2hjbXAoYS0+aWR4LnNoYTEsIGItPmlkeC5zaGExKTsKKworCWlmIChhLT5pbl9wYWNrIDwgYi0+aW5fcGFjaykKKwkJcmV0dXJuIC0xOworCWlmIChhLT5pbl9wYWNrID4gYi0+aW5fcGFjaykKKwkJcmV0dXJuIDE7CisJcmV0dXJuIGEtPmluX3BhY2tfb2Zmc2V0IDwgYi0+aW5fcGFja19vZmZzZXQgPyAtMSA6CisJCQkoYS0+aW5fcGFja19vZmZzZXQgPiBiLT5pbl9wYWNrX29mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9vYmplY3RfZGV0YWlscyh2b2lkKQoreworCXVpbnQzMl90IGk7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqKnNvcnRlZF9ieV9vZmZzZXQ7CisKKwlzb3J0ZWRfYnlfb2Zmc2V0ID0geGNhbGxvYyhucl9vYmplY3RzLCBzaXplb2Yoc3RydWN0IG9iamVjdF9lbnRyeSAqKSk7CisJZm9yIChpID0gMDsgaSA8IG5yX29iamVjdHM7IGkrKykKKwkJc29ydGVkX2J5X29mZnNldFtpXSA9IG9iamVjdHMgKyBpOworCXFzb3J0KHNvcnRlZF9ieV9vZmZzZXQsIG5yX29iamVjdHMsIHNpemVvZigqc29ydGVkX2J5X29mZnNldCksIHBhY2tfb2Zmc2V0X3NvcnQpOworCisJaW5pdF9wYWNrX3JldmluZGV4KCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfb2JqZWN0czsgaSsrKQorCQljaGVja19vYmplY3Qoc29ydGVkX2J5X29mZnNldFtpXSk7CisKKwlmcmVlKHNvcnRlZF9ieV9vZmZzZXQpOworfQorCisvKgorICogV2Ugc2VhcmNoIGZvciBkZWx0YXMgaW4gYSBsaXN0IHNvcnRlZCBieSB0eXBlLCBieSBmaWxlbmFtZSBoYXNoLCBhbmQgdGhlbgorICogYnkgc2l6ZSwgc28gdGhhdCB3ZSBzZWUgcHJvZ3Jlc3NpdmVseSBzbWFsbGVyIGFuZCBzbWFsbGVyIGZpbGVzLgorICogVGhhdCdzIGJlY2F1c2Ugd2UgcHJlZmVyIGRlbHRhcyB0byBiZSBmcm9tIHRoZSBiaWdnZXIgZmlsZQorICogdG8gdGhlIHNtYWxsZXIgLS0gZGVsZXRlcyBhcmUgcG90ZW50aWFsbHkgY2hlYXBlciwgYnV0IHBlcmhhcHMKKyAqIG1vcmUgaW1wb3J0YW50bHksIHRoZSBiaWdnZXIgZmlsZSBpcyBsaWtlbHkgdGhlIG1vcmUgcmVjZW50CisgKiBvbmUuICBUaGUgZGVlcGVzdCBkZWx0YXMgYXJlIHRoZXJlZm9yZSB0aGUgb2xkZXN0IG9iamVjdHMgd2hpY2ggYXJlCisgKiBsZXNzIHN1c2NlcHRpYmxlIHRvIGJlIGFjY2Vzc2VkIG9mdGVuLgorICovCitzdGF0aWMgaW50IHR5cGVfc2l6ZV9zb3J0KGNvbnN0IHZvaWQgKl9hLCBjb25zdCB2b2lkICpfYikKK3sKKwljb25zdCBzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICphID0gKihzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqKV9hOworCWNvbnN0IHN0cnVjdCBvYmplY3RfZW50cnkgKmIgPSAqKHN0cnVjdCBvYmplY3RfZW50cnkgKiopX2I7CisKKwlpZiAoYS0+dHlwZSA+IGItPnR5cGUpCisJCXJldHVybiAtMTsKKwlpZiAoYS0+dHlwZSA8IGItPnR5cGUpCisJCXJldHVybiAxOworCWlmIChhLT5oYXNoID4gYi0+aGFzaCkKKwkJcmV0dXJuIC0xOworCWlmIChhLT5oYXNoIDwgYi0+aGFzaCkKKwkJcmV0dXJuIDE7CisJaWYgKGEtPnByZWZlcnJlZF9iYXNlID4gYi0+cHJlZmVycmVkX2Jhc2UpCisJCXJldHVybiAtMTsKKwlpZiAoYS0+cHJlZmVycmVkX2Jhc2UgPCBiLT5wcmVmZXJyZWRfYmFzZSkKKwkJcmV0dXJuIDE7CisJaWYgKGEtPnNpemUgPiBiLT5zaXplKQorCQlyZXR1cm4gLTE7CisJaWYgKGEtPnNpemUgPCBiLT5zaXplKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gYSA8IGIgPyAtMSA6IChhID4gYik7ICAvKiBuZXdlc3QgZmlyc3QgKi8KK30KKworc3RydWN0IHVucGFja2VkIHsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICplbnRyeTsKKwl2b2lkICpkYXRhOworCXN0cnVjdCBkZWx0YV9pbmRleCAqaW5kZXg7CisJdW5zaWduZWQgZGVwdGg7Cit9OworCitzdGF0aWMgaW50IGRlbHRhX2NhY2hlYWJsZSh1bnNpZ25lZCBsb25nIHNyY19zaXplLCB1bnNpZ25lZCBsb25nIHRyZ19zaXplLAorCQkJICAgdW5zaWduZWQgbG9uZyBkZWx0YV9zaXplKQoreworCWlmIChtYXhfZGVsdGFfY2FjaGVfc2l6ZSAmJiBkZWx0YV9jYWNoZV9zaXplICsgZGVsdGFfc2l6ZSA+IG1heF9kZWx0YV9jYWNoZV9zaXplKQorCQlyZXR1cm4gMDsKKworCWlmIChkZWx0YV9zaXplIDwgY2FjaGVfbWF4X3NtYWxsX2RlbHRhX3NpemUpCisJCXJldHVybiAxOworCisJLyogY2FjaGUgZGVsdGEsIGlmIG9iamVjdHMgYXJlIGxhcmdlIGVub3VnaCBjb21wYXJlZCB0byBkZWx0YSBzaXplICovCisJaWYgKChzcmNfc2l6ZSA+PiAyMCkgKyAodHJnX3NpemUgPj4gMjEpID4gKGRlbHRhX3NpemUgPj4gMTApKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgVEhSRUFERURfREVMVEFfU0VBUkNICisKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgcmVhZF9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisjZGVmaW5lIHJlYWRfbG9jaygpCQlwdGhyZWFkX211dGV4X2xvY2soJnJlYWRfbXV0ZXgpCisjZGVmaW5lIHJlYWRfdW5sb2NrKCkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZyZWFkX211dGV4KQorCitzdGF0aWMgcHRocmVhZF9tdXRleF90IGNhY2hlX211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKyNkZWZpbmUgY2FjaGVfbG9jaygpCQlwdGhyZWFkX211dGV4X2xvY2soJmNhY2hlX211dGV4KQorI2RlZmluZSBjYWNoZV91bmxvY2soKQkJcHRocmVhZF9tdXRleF91bmxvY2soJmNhY2hlX211dGV4KQorCitzdGF0aWMgcHRocmVhZF9tdXRleF90IHByb2dyZXNzX211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKyNkZWZpbmUgcHJvZ3Jlc3NfbG9jaygpCQlwdGhyZWFkX211dGV4X2xvY2soJnByb2dyZXNzX211dGV4KQorI2RlZmluZSBwcm9ncmVzc191bmxvY2soKQlwdGhyZWFkX211dGV4X3VubG9jaygmcHJvZ3Jlc3NfbXV0ZXgpCisKKyNlbHNlCisKKyNkZWZpbmUgcmVhZF9sb2NrKCkJCSh2b2lkKTAKKyNkZWZpbmUgcmVhZF91bmxvY2soKQkJKHZvaWQpMAorI2RlZmluZSBjYWNoZV9sb2NrKCkJCSh2b2lkKTAKKyNkZWZpbmUgY2FjaGVfdW5sb2NrKCkJCSh2b2lkKTAKKyNkZWZpbmUgcHJvZ3Jlc3NfbG9jaygpCQkodm9pZCkwCisjZGVmaW5lIHByb2dyZXNzX3VubG9jaygpCSh2b2lkKTAKKworI2VuZGlmCisKK3N0YXRpYyBpbnQgdHJ5X2RlbHRhKHN0cnVjdCB1bnBhY2tlZCAqdHJnLCBzdHJ1Y3QgdW5wYWNrZWQgKnNyYywKKwkJICAgICB1bnNpZ25lZCBtYXhfZGVwdGgsIHVuc2lnbmVkIGxvbmcgKm1lbV91c2FnZSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICp0cmdfZW50cnkgPSB0cmctPmVudHJ5OworCXN0cnVjdCBvYmplY3RfZW50cnkgKnNyY19lbnRyeSA9IHNyYy0+ZW50cnk7CisJdW5zaWduZWQgbG9uZyB0cmdfc2l6ZSwgc3JjX3NpemUsIGRlbHRhX3NpemUsIHNpemVkaWZmLCBtYXhfc2l6ZSwgc3o7CisJdW5zaWduZWQgcmVmX2RlcHRoOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwl2b2lkICpkZWx0YV9idWY7CisKKwkvKiBEb24ndCBib3RoZXIgZG9pbmcgZGlmZnMgYmV0d2VlbiBkaWZmZXJlbnQgdHlwZXMgKi8KKwlpZiAodHJnX2VudHJ5LT50eXBlICE9IHNyY19lbnRyeS0+dHlwZSkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBXZSBkbyBub3QgYm90aGVyIHRvIHRyeSBhIGRlbHRhIHRoYXQgd2UgZGlzY2FyZGVkCisJICogb24gYW4gZWFybGllciB0cnksIGJ1dCBvbmx5IHdoZW4gcmV1c2luZyBkZWx0YSBkYXRhLgorCSAqLworCWlmICghbm9fcmV1c2VfZGVsdGEgJiYgdHJnX2VudHJ5LT5pbl9wYWNrICYmCisJICAgIHRyZ19lbnRyeS0+aW5fcGFjayA9PSBzcmNfZW50cnktPmluX3BhY2sgJiYKKwkgICAgdHJnX2VudHJ5LT5pbl9wYWNrX3R5cGUgIT0gT0JKX1JFRl9ERUxUQSAmJgorCSAgICB0cmdfZW50cnktPmluX3BhY2tfdHlwZSAhPSBPQkpfT0ZTX0RFTFRBKQorCQlyZXR1cm4gMDsKKworCS8qIExldCdzIG5vdCBidXN0IHRoZSBhbGxvd2VkIGRlcHRoLiAqLworCWlmIChzcmMtPmRlcHRoID49IG1heF9kZXB0aCkKKwkJcmV0dXJuIDA7CisKKwkvKiBOb3cgc29tZSBzaXplIGZpbHRlcmluZyBoZXVyaXN0aWNzLiAqLworCXRyZ19zaXplID0gdHJnX2VudHJ5LT5zaXplOworCWlmICghdHJnX2VudHJ5LT5kZWx0YSkgeworCQltYXhfc2l6ZSA9IHRyZ19zaXplLzIgLSAyMDsKKwkJcmVmX2RlcHRoID0gMTsKKwl9IGVsc2UgeworCQltYXhfc2l6ZSA9IHRyZ19lbnRyeS0+ZGVsdGFfc2l6ZTsKKwkJcmVmX2RlcHRoID0gdHJnLT5kZXB0aDsKKwl9CisJbWF4X3NpemUgPSBtYXhfc2l6ZSAqIChtYXhfZGVwdGggLSBzcmMtPmRlcHRoKSAvCisJCQkJCQkobWF4X2RlcHRoIC0gcmVmX2RlcHRoICsgMSk7CisJaWYgKG1heF9zaXplID09IDApCisJCXJldHVybiAwOworCXNyY19zaXplID0gc3JjX2VudHJ5LT5zaXplOworCXNpemVkaWZmID0gc3JjX3NpemUgPCB0cmdfc2l6ZSA/IHRyZ19zaXplIC0gc3JjX3NpemUgOiAwOworCWlmIChzaXplZGlmZiA+PSBtYXhfc2l6ZSkKKwkJcmV0dXJuIDA7CisJaWYgKHRyZ19zaXplIDwgc3JjX3NpemUgLyAzMikKKwkJcmV0dXJuIDA7CisKKwkvKiBMb2FkIGRhdGEgaWYgbm90IGFscmVhZHkgZG9uZSAqLworCWlmICghdHJnLT5kYXRhKSB7CisJCXJlYWRfbG9jaygpOworCQl0cmctPmRhdGEgPSByZWFkX3NoYTFfZmlsZSh0cmdfZW50cnktPmlkeC5zaGExLCAmdHlwZSwgJnN6KTsKKwkJcmVhZF91bmxvY2soKTsKKwkJaWYgKCF0cmctPmRhdGEpCisJCQlkaWUoIm9iamVjdCAlcyBjYW5ub3QgYmUgcmVhZCIsCisJCQkgICAgc2hhMV90b19oZXgodHJnX2VudHJ5LT5pZHguc2hhMSkpOworCQlpZiAoc3ogIT0gdHJnX3NpemUpCisJCQlkaWUoIm9iamVjdCAlcyBpbmNvbnNpc3RlbnQgb2JqZWN0IGxlbmd0aCAoJWx1IHZzICVsdSkiLAorCQkJICAgIHNoYTFfdG9faGV4KHRyZ19lbnRyeS0+aWR4LnNoYTEpLCBzeiwgdHJnX3NpemUpOworCQkqbWVtX3VzYWdlICs9IHN6OworCX0KKwlpZiAoIXNyYy0+ZGF0YSkgeworCQlyZWFkX2xvY2soKTsKKwkJc3JjLT5kYXRhID0gcmVhZF9zaGExX2ZpbGUoc3JjX2VudHJ5LT5pZHguc2hhMSwgJnR5cGUsICZzeik7CisJCXJlYWRfdW5sb2NrKCk7CisJCWlmICghc3JjLT5kYXRhKQorCQkJZGllKCJvYmplY3QgJXMgY2Fubm90IGJlIHJlYWQiLAorCQkJICAgIHNoYTFfdG9faGV4KHNyY19lbnRyeS0+aWR4LnNoYTEpKTsKKwkJaWYgKHN6ICE9IHNyY19zaXplKQorCQkJZGllKCJvYmplY3QgJXMgaW5jb25zaXN0ZW50IG9iamVjdCBsZW5ndGggKCVsdSB2cyAlbHUpIiwKKwkJCSAgICBzaGExX3RvX2hleChzcmNfZW50cnktPmlkeC5zaGExKSwgc3osIHNyY19zaXplKTsKKwkJKm1lbV91c2FnZSArPSBzejsKKwl9CisJaWYgKCFzcmMtPmluZGV4KSB7CisJCXNyYy0+aW5kZXggPSBjcmVhdGVfZGVsdGFfaW5kZXgoc3JjLT5kYXRhLCBzcmNfc2l6ZSk7CisJCWlmICghc3JjLT5pbmRleCkgeworCQkJc3RhdGljIGludCB3YXJuZWQgPSAwOworCQkJaWYgKCF3YXJuZWQrKykKKwkJCQl3YXJuaW5nKCJzdWJvcHRpbWFsIHBhY2sgLSBvdXQgb2YgbWVtb3J5Iik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkqbWVtX3VzYWdlICs9IHNpemVvZl9kZWx0YV9pbmRleChzcmMtPmluZGV4KTsKKwl9CisKKwlkZWx0YV9idWYgPSBjcmVhdGVfZGVsdGEoc3JjLT5pbmRleCwgdHJnLT5kYXRhLCB0cmdfc2l6ZSwgJmRlbHRhX3NpemUsIG1heF9zaXplKTsKKwlpZiAoIWRlbHRhX2J1ZikKKwkJcmV0dXJuIDA7CisKKwlpZiAodHJnX2VudHJ5LT5kZWx0YSkgeworCQkvKiBQcmVmZXIgb25seSBzaGFsbG93ZXIgc2FtZS1zaXplZCBkZWx0YXMuICovCisJCWlmIChkZWx0YV9zaXplID09IHRyZ19lbnRyeS0+ZGVsdGFfc2l6ZSAmJgorCQkgICAgc3JjLT5kZXB0aCArIDEgPj0gdHJnLT5kZXB0aCkgeworCQkJZnJlZShkZWx0YV9idWYpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKgorCSAqIEhhbmRsZSBtZW1vcnkgYWxsb2NhdGlvbiBvdXRzaWRlIG9mIHRoZSBjYWNoZQorCSAqIGFjY291bnRpbmcgbG9jay4gIENvbXBpbGVyIHdpbGwgb3B0aW1pemUgdGhlIHN0cmFuZ2VuZXNzCisJICogYXdheSB3aGVuIFRIUkVBREVEX0RFTFRBX1NFQVJDSCBpcyBub3QgZGVmaW5lZC4KKwkgKi8KKwlmcmVlKHRyZ19lbnRyeS0+ZGVsdGFfZGF0YSk7CisJY2FjaGVfbG9jaygpOworCWlmICh0cmdfZW50cnktPmRlbHRhX2RhdGEpIHsKKwkJZGVsdGFfY2FjaGVfc2l6ZSAtPSB0cmdfZW50cnktPmRlbHRhX3NpemU7CisJCXRyZ19lbnRyeS0+ZGVsdGFfZGF0YSA9IE5VTEw7CisJfQorCWlmIChkZWx0YV9jYWNoZWFibGUoc3JjX3NpemUsIHRyZ19zaXplLCBkZWx0YV9zaXplKSkgeworCQlkZWx0YV9jYWNoZV9zaXplICs9IGRlbHRhX3NpemU7CisJCWNhY2hlX3VubG9jaygpOworCQl0cmdfZW50cnktPmRlbHRhX2RhdGEgPSB4cmVhbGxvYyhkZWx0YV9idWYsIGRlbHRhX3NpemUpOworCX0gZWxzZSB7CisJCWNhY2hlX3VubG9jaygpOworCQlmcmVlKGRlbHRhX2J1Zik7CisJfQorCisJdHJnX2VudHJ5LT5kZWx0YSA9IHNyY19lbnRyeTsKKwl0cmdfZW50cnktPmRlbHRhX3NpemUgPSBkZWx0YV9zaXplOworCXRyZy0+ZGVwdGggPSBzcmMtPmRlcHRoICsgMTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGNoZWNrX2RlbHRhX2xpbWl0KHN0cnVjdCBvYmplY3RfZW50cnkgKm1lLCB1bnNpZ25lZCBpbnQgbikKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpjaGlsZCA9IG1lLT5kZWx0YV9jaGlsZDsKKwl1bnNpZ25lZCBpbnQgbSA9IG47CisJd2hpbGUgKGNoaWxkKSB7CisJCXVuc2lnbmVkIGludCBjID0gY2hlY2tfZGVsdGFfbGltaXQoY2hpbGQsIG4gKyAxKTsKKwkJaWYgKG0gPCBjKQorCQkJbSA9IGM7CisJCWNoaWxkID0gY2hpbGQtPmRlbHRhX3NpYmxpbmc7CisJfQorCXJldHVybiBtOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBmcmVlX3VucGFja2VkKHN0cnVjdCB1bnBhY2tlZCAqbikKK3sKKwl1bnNpZ25lZCBsb25nIGZyZWVkX21lbSA9IHNpemVvZl9kZWx0YV9pbmRleChuLT5pbmRleCk7CisJZnJlZV9kZWx0YV9pbmRleChuLT5pbmRleCk7CisJbi0+aW5kZXggPSBOVUxMOworCWlmIChuLT5kYXRhKSB7CisJCWZyZWVkX21lbSArPSBuLT5lbnRyeS0+c2l6ZTsKKwkJZnJlZShuLT5kYXRhKTsKKwkJbi0+ZGF0YSA9IE5VTEw7CisJfQorCW4tPmVudHJ5ID0gTlVMTDsKKwluLT5kZXB0aCA9IDA7CisJcmV0dXJuIGZyZWVkX21lbTsKK30KKworc3RhdGljIHZvaWQgZmluZF9kZWx0YXMoc3RydWN0IG9iamVjdF9lbnRyeSAqKmxpc3QsIHVuc2lnbmVkICpsaXN0X3NpemUsCisJCQlpbnQgd2luZG93LCBpbnQgZGVwdGgsIHVuc2lnbmVkICpwcm9jZXNzZWQpCit7CisJdWludDMyX3QgaSwgaWR4ID0gMCwgY291bnQgPSAwOworCXVuc2lnbmVkIGludCBhcnJheV9zaXplID0gd2luZG93ICogc2l6ZW9mKHN0cnVjdCB1bnBhY2tlZCk7CisJc3RydWN0IHVucGFja2VkICphcnJheTsKKwl1bnNpZ25lZCBsb25nIG1lbV91c2FnZSA9IDA7CisKKwlhcnJheSA9IHhtYWxsb2MoYXJyYXlfc2l6ZSk7CisJbWVtc2V0KGFycmF5LCAwLCBhcnJheV9zaXplKTsKKworCWZvciAoOzspIHsKKwkJc3RydWN0IG9iamVjdF9lbnRyeSAqZW50cnkgPSAqbGlzdCsrOworCQlzdHJ1Y3QgdW5wYWNrZWQgKm4gPSBhcnJheSArIGlkeDsKKwkJaW50IGosIG1heF9kZXB0aCwgYmVzdF9iYXNlID0gLTE7CisKKwkJcHJvZ3Jlc3NfbG9jaygpOworCQlpZiAoISpsaXN0X3NpemUpIHsKKwkJCXByb2dyZXNzX3VubG9jaygpOworCQkJYnJlYWs7CisJCX0KKwkJKCpsaXN0X3NpemUpLS07CisJCWlmICghZW50cnktPnByZWZlcnJlZF9iYXNlKSB7CisJCQkoKnByb2Nlc3NlZCkrKzsKKwkJCWRpc3BsYXlfcHJvZ3Jlc3MocHJvZ3Jlc3Nfc3RhdGUsICpwcm9jZXNzZWQpOworCQl9CisJCXByb2dyZXNzX3VubG9jaygpOworCisJCW1lbV91c2FnZSAtPSBmcmVlX3VucGFja2VkKG4pOworCQluLT5lbnRyeSA9IGVudHJ5OworCisJCXdoaWxlICh3aW5kb3dfbWVtb3J5X2xpbWl0ICYmCisJCSAgICAgICBtZW1fdXNhZ2UgPiB3aW5kb3dfbWVtb3J5X2xpbWl0ICYmCisJCSAgICAgICBjb3VudCA+IDEpIHsKKwkJCXVpbnQzMl90IHRhaWwgPSAoaWR4ICsgd2luZG93IC0gY291bnQpICUgd2luZG93OworCQkJbWVtX3VzYWdlIC09IGZyZWVfdW5wYWNrZWQoYXJyYXkgKyB0YWlsKTsKKwkJCWNvdW50LS07CisJCX0KKworCQkvKiBXZSBkbyBub3QgY29tcHV0ZSBkZWx0YSB0byAqY3JlYXRlKiBvYmplY3RzIHdlIGFyZSBub3QKKwkJICogZ29pbmcgdG8gcGFjay4KKwkJICovCisJCWlmIChlbnRyeS0+cHJlZmVycmVkX2Jhc2UpCisJCQlnb3RvIG5leHQ7CisKKwkJLyoKKwkJICogSWYgdGhlIGN1cnJlbnQgb2JqZWN0IGlzIGF0IHBhY2sgZWRnZSwgdGFrZSB0aGUgZGVwdGggdGhlCisJCSAqIG9iamVjdHMgdGhhdCBkZXBlbmQgb24gdGhlIGN1cnJlbnQgb2JqZWN0IGludG8gYWNjb3VudAorCQkgKiBvdGhlcndpc2UgdGhleSB3b3VsZCBiZWNvbWUgdG9vIGRlZXAuCisJCSAqLworCQltYXhfZGVwdGggPSBkZXB0aDsKKwkJaWYgKGVudHJ5LT5kZWx0YV9jaGlsZCkgeworCQkJbWF4X2RlcHRoIC09IGNoZWNrX2RlbHRhX2xpbWl0KGVudHJ5LCAwKTsKKwkJCWlmIChtYXhfZGVwdGggPD0gMCkKKwkJCQlnb3RvIG5leHQ7CisJCX0KKworCQlqID0gd2luZG93OworCQl3aGlsZSAoLS1qID4gMCkgeworCQkJaW50IHJldDsKKwkJCXVpbnQzMl90IG90aGVyX2lkeCA9IGlkeCArIGo7CisJCQlzdHJ1Y3QgdW5wYWNrZWQgKm07CisJCQlpZiAob3RoZXJfaWR4ID49IHdpbmRvdykKKwkJCQlvdGhlcl9pZHggLT0gd2luZG93OworCQkJbSA9IGFycmF5ICsgb3RoZXJfaWR4OworCQkJaWYgKCFtLT5lbnRyeSkKKwkJCQlicmVhazsKKwkJCXJldCA9IHRyeV9kZWx0YShuLCBtLCBtYXhfZGVwdGgsICZtZW1fdXNhZ2UpOworCQkJaWYgKHJldCA8IDApCisJCQkJYnJlYWs7CisJCQllbHNlIGlmIChyZXQgPiAwKQorCQkJCWJlc3RfYmFzZSA9IG90aGVyX2lkeDsKKwkJfQorCisJCS8qIGlmIHdlIG1hZGUgbiBhIGRlbHRhLCBhbmQgaWYgbiBpcyBhbHJlYWR5IGF0IG1heAorCQkgKiBkZXB0aCwgbGVhdmluZyBpdCBpbiB0aGUgd2luZG93IGlzIHBvaW50bGVzcy4gIHdlCisJCSAqIHNob3VsZCBldmljdCBpdCBmaXJzdC4KKwkJICovCisJCWlmIChlbnRyeS0+ZGVsdGEgJiYgZGVwdGggPD0gbi0+ZGVwdGgpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBNb3ZlIHRoZSBiZXN0IGRlbHRhIGJhc2UgdXAgaW4gdGhlIHdpbmRvdywgYWZ0ZXIgdGhlCisJCSAqIGN1cnJlbnRseSBkZWx0aWZpZWQgb2JqZWN0LCB0byBrZWVwIGl0IGxvbmdlci4gIEl0IHdpbGwKKwkJICogYmUgdGhlIGZpcnN0IGJhc2Ugb2JqZWN0IHRvIGJlIGF0dGVtcHRlZCBuZXh0LgorCQkgKi8KKwkJaWYgKGVudHJ5LT5kZWx0YSkgeworCQkJc3RydWN0IHVucGFja2VkIHN3YXAgPSBhcnJheVtiZXN0X2Jhc2VdOworCQkJaW50IGRpc3QgPSAod2luZG93ICsgaWR4IC0gYmVzdF9iYXNlKSAlIHdpbmRvdzsKKwkJCWludCBkc3QgPSBiZXN0X2Jhc2U7CisJCQl3aGlsZSAoZGlzdC0tKSB7CisJCQkJaW50IHNyYyA9IChkc3QgKyAxKSAlIHdpbmRvdzsKKwkJCQlhcnJheVtkc3RdID0gYXJyYXlbc3JjXTsKKwkJCQlkc3QgPSBzcmM7CisJCQl9CisJCQlhcnJheVtkc3RdID0gc3dhcDsKKwkJfQorCisJCW5leHQ6CisJCWlkeCsrOworCQlpZiAoY291bnQgKyAxIDwgd2luZG93KQorCQkJY291bnQrKzsKKwkJaWYgKGlkeCA+PSB3aW5kb3cpCisJCQlpZHggPSAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCB3aW5kb3c7ICsraSkgeworCQlmcmVlX2RlbHRhX2luZGV4KGFycmF5W2ldLmluZGV4KTsKKwkJZnJlZShhcnJheVtpXS5kYXRhKTsKKwl9CisJZnJlZShhcnJheSk7Cit9CisKKyNpZmRlZiBUSFJFQURFRF9ERUxUQV9TRUFSQ0gKKworLyoKKyAqIFRoZSBtYWluIHRocmVhZCB3YWl0cyBvbiB0aGUgY29uZGl0aW9uIHRoYXQgKGF0IGxlYXN0KSBvbmUgb2YgdGhlIHdvcmtlcnMKKyAqIGhhcyBzdG9wcGVkIHdvcmtpbmcgKHdoaWNoIGlzIGluZGljYXRlZCBpbiB0aGUgLndvcmtpbmcgbWVtYmVyIG9mCisgKiBzdHJ1Y3QgdGhyZWFkX3BhcmFtcykuCisgKiBXaGVuIGEgd29yayB0aHJlYWQgaGFzIGNvbXBsZXRlZCBpdHMgd29yaywgaXQgc2V0cyAud29ya2luZyB0byAwIGFuZAorICogc2lnbmFscyB0aGUgbWFpbiB0aHJlYWQgYW5kIHdhaXRzIG9uIHRoZSBjb25kaXRpb24gdGhhdCAuZGF0YV9yZWFkeQorICogYmVjb21lcyAxLgorICovCisKK3N0cnVjdCB0aHJlYWRfcGFyYW1zIHsKKwlwdGhyZWFkX3QgdGhyZWFkOworCXN0cnVjdCBvYmplY3RfZW50cnkgKipsaXN0OworCXVuc2lnbmVkIGxpc3Rfc2l6ZTsKKwl1bnNpZ25lZCByZW1haW5pbmc7CisJaW50IHdpbmRvdzsKKwlpbnQgZGVwdGg7CisJaW50IHdvcmtpbmc7CisJaW50IGRhdGFfcmVhZHk7CisJcHRocmVhZF9tdXRleF90IG11dGV4OworCXB0aHJlYWRfY29uZF90IGNvbmQ7CisJdW5zaWduZWQgKnByb2Nlc3NlZDsKK307CisKK3N0YXRpYyBwdGhyZWFkX2NvbmRfdCBwcm9ncmVzc19jb25kID0gUFRIUkVBRF9DT05EX0lOSVRJQUxJWkVSOworCitzdGF0aWMgdm9pZCAqdGhyZWFkZWRfZmluZF9kZWx0YXModm9pZCAqYXJnKQoreworCXN0cnVjdCB0aHJlYWRfcGFyYW1zICptZSA9IGFyZzsKKworCXdoaWxlIChtZS0+cmVtYWluaW5nKSB7CisJCWZpbmRfZGVsdGFzKG1lLT5saXN0LCAmbWUtPnJlbWFpbmluZywKKwkJCSAgICBtZS0+d2luZG93LCBtZS0+ZGVwdGgsIG1lLT5wcm9jZXNzZWQpOworCisJCXByb2dyZXNzX2xvY2soKTsKKwkJbWUtPndvcmtpbmcgPSAwOworCQlwdGhyZWFkX2NvbmRfc2lnbmFsKCZwcm9ncmVzc19jb25kKTsKKwkJcHJvZ3Jlc3NfdW5sb2NrKCk7CisKKwkJLyoKKwkJICogV2UgbXVzdCBub3Qgc2V0IC0+ZGF0YV9yZWFkeSBiZWZvcmUgd2Ugd2FpdCBvbiB0aGUKKwkJICogY29uZGl0aW9uIGJlY2F1c2UgdGhlIG1haW4gdGhyZWFkIG1heSBoYXZlIHNldCBpdCB0byAxCisJCSAqIGJlZm9yZSB3ZSBnZXQgaGVyZS4gSW4gb3JkZXIgdG8gYmUgc3VyZSB0aGF0IG5ldworCQkgKiB3b3JrIGlzIGF2YWlsYWJsZSBpZiB3ZSBzZWUgMSBpbiAtPmRhdGFfcmVhZHksIGl0CisJCSAqIHdhcyBpbml0aWFsaXplZCB0byAwIGJlZm9yZSB0aGlzIHRocmVhZCB3YXMgc3Bhd25lZAorCQkgKiBhbmQgd2UgcmVzZXQgaXQgdG8gMCByaWdodCBhd2F5LgorCQkgKi8KKwkJcHRocmVhZF9tdXRleF9sb2NrKCZtZS0+bXV0ZXgpOworCQl3aGlsZSAoIW1lLT5kYXRhX3JlYWR5KQorCQkJcHRocmVhZF9jb25kX3dhaXQoJm1lLT5jb25kLCAmbWUtPm11dGV4KTsKKwkJbWUtPmRhdGFfcmVhZHkgPSAwOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmbWUtPm11dGV4KTsKKwl9CisJLyogbGVhdmUgLT53b3JraW5nIDEgc28gdGhhdCB0aGlzIGRvZXNuJ3QgZ2V0IG1vcmUgd29yayBhc3NpZ25lZCAqLworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBsbF9maW5kX2RlbHRhcyhzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqbGlzdCwgdW5zaWduZWQgbGlzdF9zaXplLAorCQkJICAgaW50IHdpbmRvdywgaW50IGRlcHRoLCB1bnNpZ25lZCAqcHJvY2Vzc2VkKQoreworCXN0cnVjdCB0aHJlYWRfcGFyYW1zIHBbZGVsdGFfc2VhcmNoX3RocmVhZHNdOworCWludCBpLCByZXQsIGFjdGl2ZV90aHJlYWRzID0gMDsKKworCWlmIChkZWx0YV9zZWFyY2hfdGhyZWFkcyA8PSAxKSB7CisJCWZpbmRfZGVsdGFzKGxpc3QsICZsaXN0X3NpemUsIHdpbmRvdywgZGVwdGgsIHByb2Nlc3NlZCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBQYXJ0aXRpb24gdGhlIHdvcmsgYW1vbmdzdCB3b3JrIHRocmVhZHMuICovCisJZm9yIChpID0gMDsgaSA8IGRlbHRhX3NlYXJjaF90aHJlYWRzOyBpKyspIHsKKwkJdW5zaWduZWQgc3ViX3NpemUgPSBsaXN0X3NpemUgLyAoZGVsdGFfc2VhcmNoX3RocmVhZHMgLSBpKTsKKworCQlwW2ldLndpbmRvdyA9IHdpbmRvdzsKKwkJcFtpXS5kZXB0aCA9IGRlcHRoOworCQlwW2ldLnByb2Nlc3NlZCA9IHByb2Nlc3NlZDsKKwkJcFtpXS53b3JraW5nID0gMTsKKwkJcFtpXS5kYXRhX3JlYWR5ID0gMDsKKworCQkvKiB0cnkgdG8gc3BsaXQgY2h1bmtzIG9uICJwYXRoIiBib3VuZGFyaWVzICovCisJCXdoaWxlIChzdWJfc2l6ZSAmJiBzdWJfc2l6ZSA8IGxpc3Rfc2l6ZSAmJgorCQkgICAgICAgbGlzdFtzdWJfc2l6ZV0tPmhhc2ggJiYKKwkJICAgICAgIGxpc3Rbc3ViX3NpemVdLT5oYXNoID09IGxpc3Rbc3ViX3NpemUtMV0tPmhhc2gpCisJCQlzdWJfc2l6ZSsrOworCisJCXBbaV0ubGlzdCA9IGxpc3Q7CisJCXBbaV0ubGlzdF9zaXplID0gc3ViX3NpemU7CisJCXBbaV0ucmVtYWluaW5nID0gc3ViX3NpemU7CisKKwkJbGlzdCArPSBzdWJfc2l6ZTsKKwkJbGlzdF9zaXplIC09IHN1Yl9zaXplOworCX0KKworCS8qIFN0YXJ0IHdvcmsgdGhyZWFkcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGVsdGFfc2VhcmNoX3RocmVhZHM7IGkrKykgeworCQlpZiAoIXBbaV0ubGlzdF9zaXplKQorCQkJY29udGludWU7CisJCXB0aHJlYWRfbXV0ZXhfaW5pdCgmcFtpXS5tdXRleCwgTlVMTCk7CisJCXB0aHJlYWRfY29uZF9pbml0KCZwW2ldLmNvbmQsIE5VTEwpOworCQlyZXQgPSBwdGhyZWFkX2NyZWF0ZSgmcFtpXS50aHJlYWQsIE5VTEwsCisJCQkJICAgICB0aHJlYWRlZF9maW5kX2RlbHRhcywgJnBbaV0pOworCQlpZiAocmV0KQorCQkJZGllKCJ1bmFibGUgdG8gY3JlYXRlIHRocmVhZDogJXMiLCBzdHJlcnJvcihyZXQpKTsKKwkJYWN0aXZlX3RocmVhZHMrKzsKKwl9CisKKwkvKgorCSAqIE5vdyBsZXQncyB3YWl0IGZvciB3b3JrIGNvbXBsZXRpb24uICBFYWNoIHRpbWUgYSB0aHJlYWQgaXMgZG9uZQorCSAqIHdpdGggaXRzIHdvcmssIHdlIHN0ZWFsIGhhbGYgb2YgdGhlIHJlbWFpbmluZyB3b3JrIGZyb20gdGhlCisJICogdGhyZWFkIHdpdGggdGhlIGxhcmdlc3QgbnVtYmVyIG9mIHVucHJvY2Vzc2VkIG9iamVjdHMgYW5kIGdpdmUKKwkgKiBpdCB0byB0aGF0IG5ld2x5IGlkbGUgdGhyZWFkLiAgVGhpcyBlbnN1cmUgZ29vZCBsb2FkIGJhbGFuY2luZworCSAqIHVudGlsIHRoZSByZW1haW5pbmcgb2JqZWN0IGxpc3Qgc2VnbWVudHMgYXJlIHNpbXBseSB0b28gc2hvcnQKKwkgKiB0byBiZSB3b3J0aCBzcGxpdHRpbmcgYW55bW9yZS4KKwkgKi8KKwl3aGlsZSAoYWN0aXZlX3RocmVhZHMpIHsKKwkJc3RydWN0IHRocmVhZF9wYXJhbXMgKnRhcmdldCA9IE5VTEw7CisJCXN0cnVjdCB0aHJlYWRfcGFyYW1zICp2aWN0aW0gPSBOVUxMOworCQl1bnNpZ25lZCBzdWJfc2l6ZSA9IDA7CisKKwkJcHJvZ3Jlc3NfbG9jaygpOworCQlmb3IgKDs7KSB7CisJCQlmb3IgKGkgPSAwOyAhdGFyZ2V0ICYmIGkgPCBkZWx0YV9zZWFyY2hfdGhyZWFkczsgaSsrKQorCQkJCWlmICghcFtpXS53b3JraW5nKQorCQkJCQl0YXJnZXQgPSAmcFtpXTsKKwkJCWlmICh0YXJnZXQpCisJCQkJYnJlYWs7CisJCQlwdGhyZWFkX2NvbmRfd2FpdCgmcHJvZ3Jlc3NfY29uZCwgJnByb2dyZXNzX211dGV4KTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBkZWx0YV9zZWFyY2hfdGhyZWFkczsgaSsrKQorCQkJaWYgKHBbaV0ucmVtYWluaW5nID4gMip3aW5kb3cgJiYKKwkJCSAgICAoIXZpY3RpbSB8fCB2aWN0aW0tPnJlbWFpbmluZyA8IHBbaV0ucmVtYWluaW5nKSkKKwkJCQl2aWN0aW0gPSAmcFtpXTsKKwkJaWYgKHZpY3RpbSkgeworCQkJc3ViX3NpemUgPSB2aWN0aW0tPnJlbWFpbmluZyAvIDI7CisJCQlsaXN0ID0gdmljdGltLT5saXN0ICsgdmljdGltLT5saXN0X3NpemUgLSBzdWJfc2l6ZTsKKwkJCXdoaWxlIChzdWJfc2l6ZSAmJiBsaXN0WzBdLT5oYXNoICYmCisJCQkgICAgICAgbGlzdFswXS0+aGFzaCA9PSBsaXN0Wy0xXS0+aGFzaCkgeworCQkJCWxpc3QrKzsKKwkJCQlzdWJfc2l6ZS0tOworCQkJfQorCQkJaWYgKCFzdWJfc2l6ZSkgeworCQkJCS8qCisJCQkJICogSXQgaXMgcG9zc2libGUgZm9yIHNvbWUgInBhdGhzIiB0byBoYXZlCisJCQkJICogc28gbWFueSBvYmplY3RzIHRoYXQgbm8gaGFzaCBib3VuZGFyeQorCQkJCSAqIG1pZ2h0IGJlIGZvdW5kLiAgTGV0J3MganVzdCBzdGVhbCB0aGUKKwkJCQkgKiBleGFjdCBoYWxmIGluIHRoYXQgY2FzZS4KKwkJCQkgKi8KKwkJCQlzdWJfc2l6ZSA9IHZpY3RpbS0+cmVtYWluaW5nIC8gMjsKKwkJCQlsaXN0IC09IHN1Yl9zaXplOworCQkJfQorCQkJdGFyZ2V0LT5saXN0ID0gbGlzdDsKKwkJCXZpY3RpbS0+bGlzdF9zaXplIC09IHN1Yl9zaXplOworCQkJdmljdGltLT5yZW1haW5pbmcgLT0gc3ViX3NpemU7CisJCX0KKwkJdGFyZ2V0LT5saXN0X3NpemUgPSBzdWJfc2l6ZTsKKwkJdGFyZ2V0LT5yZW1haW5pbmcgPSBzdWJfc2l6ZTsKKwkJdGFyZ2V0LT53b3JraW5nID0gMTsKKwkJcHJvZ3Jlc3NfdW5sb2NrKCk7CisKKwkJcHRocmVhZF9tdXRleF9sb2NrKCZ0YXJnZXQtPm11dGV4KTsKKwkJdGFyZ2V0LT5kYXRhX3JlYWR5ID0gMTsKKwkJcHRocmVhZF9jb25kX3NpZ25hbCgmdGFyZ2V0LT5jb25kKTsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJnRhcmdldC0+bXV0ZXgpOworCisJCWlmICghc3ViX3NpemUpIHsKKwkJCXB0aHJlYWRfam9pbih0YXJnZXQtPnRocmVhZCwgTlVMTCk7CisJCQlwdGhyZWFkX2NvbmRfZGVzdHJveSgmdGFyZ2V0LT5jb25kKTsKKwkJCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmdGFyZ2V0LT5tdXRleCk7CisJCQlhY3RpdmVfdGhyZWFkcy0tOworCQl9CisJfQorfQorCisjZWxzZQorI2RlZmluZSBsbF9maW5kX2RlbHRhcyhsLCBzLCB3LCBkLCBwKQlmaW5kX2RlbHRhcyhsLCAmcywgdywgZCwgcCkKKyNlbmRpZgorCitzdGF0aWMgaW50IGFkZF9yZWZfdGFnKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFnLCB2b2lkICpjYl9kYXRhKQoreworCXVuc2lnbmVkIGNoYXIgcGVlbGVkWzIwXTsKKworCWlmICghcHJlZml4Y21wKHBhdGgsICJyZWZzL3RhZ3MvIikgJiYgLyogaXMgYSB0YWc/ICovCisJICAgICFwZWVsX3JlZihwYXRoLCBwZWVsZWQpICAgICAgICAmJiAvKiBwZWVsYWJsZT8gKi8KKwkgICAgIWlzX251bGxfc2hhMShwZWVsZWQpICAgICAgICAgICYmIC8qIGFubm90YXRlZCB0YWc/ICovCisJICAgIGxvY2F0ZV9vYmplY3RfZW50cnkocGVlbGVkKSkgICAgICAvKiBvYmplY3QgcGFja2VkPyAqLworCQlhZGRfb2JqZWN0X2VudHJ5KHNoYTEsIE9CSl9UQUcsIE5VTEwsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcmVwYXJlX3BhY2soaW50IHdpbmRvdywgaW50IGRlcHRoKQoreworCXN0cnVjdCBvYmplY3RfZW50cnkgKipkZWx0YV9saXN0OworCXVpbnQzMl90IGksIG4sIG5yX2RlbHRhczsKKworCWdldF9vYmplY3RfZGV0YWlscygpOworCisJaWYgKCFucl9vYmplY3RzIHx8ICF3aW5kb3cgfHwgIWRlcHRoKQorCQlyZXR1cm47CisKKwlkZWx0YV9saXN0ID0geG1hbGxvYyhucl9vYmplY3RzICogc2l6ZW9mKCpkZWx0YV9saXN0KSk7CisJbnJfZGVsdGFzID0gbiA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfb2JqZWN0czsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3RfZW50cnkgKmVudHJ5ID0gb2JqZWN0cyArIGk7CisKKwkJaWYgKGVudHJ5LT5kZWx0YSkKKwkJCS8qIFRoaXMgaGFwcGVucyBpZiB3ZSBkZWNpZGVkIHRvIHJldXNlIGV4aXN0aW5nCisJCQkgKiBkZWx0YSBmcm9tIGEgcGFjay4gICIhbm9fcmV1c2VfZGVsdGEgJiYiIGlzIGltcGxpZWQuCisJCQkgKi8KKwkJCWNvbnRpbnVlOworCisJCWlmIChlbnRyeS0+c2l6ZSA8IDUwKQorCQkJY29udGludWU7CisKKwkJaWYgKGVudHJ5LT5ub190cnlfZGVsdGEpCisJCQljb250aW51ZTsKKworCQlpZiAoIWVudHJ5LT5wcmVmZXJyZWRfYmFzZSkKKwkJCW5yX2RlbHRhcysrOworCisJCWRlbHRhX2xpc3RbbisrXSA9IGVudHJ5OworCX0KKworCWlmIChucl9kZWx0YXMgJiYgbiA+IDEpIHsKKwkJdW5zaWduZWQgbnJfZG9uZSA9IDA7CisJCWlmIChwcm9ncmVzcykKKwkJCXByb2dyZXNzX3N0YXRlID0gc3RhcnRfcHJvZ3Jlc3MoIkNvbXByZXNzaW5nIG9iamVjdHMiLAorCQkJCQkJCW5yX2RlbHRhcyk7CisJCXFzb3J0KGRlbHRhX2xpc3QsIG4sIHNpemVvZigqZGVsdGFfbGlzdCksIHR5cGVfc2l6ZV9zb3J0KTsKKwkJbGxfZmluZF9kZWx0YXMoZGVsdGFfbGlzdCwgbiwgd2luZG93KzEsIGRlcHRoLCAmbnJfZG9uZSk7CisJCXN0b3BfcHJvZ3Jlc3MoJnByb2dyZXNzX3N0YXRlKTsKKwkJaWYgKG5yX2RvbmUgIT0gbnJfZGVsdGFzKQorCQkJZGllKCJpbmNvbnNpc3RlbmN5IHdpdGggZGVsdGEgY291bnQiKTsKKwl9CisJZnJlZShkZWx0YV9saXN0KTsKK30KKworc3RhdGljIGludCBnaXRfcGFja19jb25maWcoY29uc3QgY2hhciAqaywgY29uc3QgY2hhciAqdikKK3sKKwlpZighc3RyY21wKGssICJwYWNrLndpbmRvdyIpKSB7CisJCXdpbmRvdyA9IGdpdF9jb25maWdfaW50KGssIHYpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAoaywgInBhY2sud2luZG93bWVtb3J5IikpIHsKKwkJd2luZG93X21lbW9yeV9saW1pdCA9IGdpdF9jb25maWdfdWxvbmcoaywgdik7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXN0cmNtcChrLCAicGFjay5kZXB0aCIpKSB7CisJCWRlcHRoID0gZ2l0X2NvbmZpZ19pbnQoaywgdik7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXN0cmNtcChrLCAicGFjay5jb21wcmVzc2lvbiIpKSB7CisJCWludCBsZXZlbCA9IGdpdF9jb25maWdfaW50KGssIHYpOworCQlpZiAobGV2ZWwgPT0gLTEpCisJCQlsZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTjsKKwkJZWxzZSBpZiAobGV2ZWwgPCAwIHx8IGxldmVsID4gWl9CRVNUX0NPTVBSRVNTSU9OKQorCQkJZGllKCJiYWQgcGFjayBjb21wcmVzc2lvbiBsZXZlbCAlZCIsIGxldmVsKTsKKwkJcGFja19jb21wcmVzc2lvbl9sZXZlbCA9IGxldmVsOworCQlwYWNrX2NvbXByZXNzaW9uX3NlZW4gPSAxOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAoaywgInBhY2suZGVsdGFjYWNoZXNpemUiKSkgeworCQltYXhfZGVsdGFfY2FjaGVfc2l6ZSA9IGdpdF9jb25maWdfaW50KGssIHYpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAoaywgInBhY2suZGVsdGFjYWNoZWxpbWl0IikpIHsKKwkJY2FjaGVfbWF4X3NtYWxsX2RlbHRhX3NpemUgPSBnaXRfY29uZmlnX2ludChrLCB2KTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKGssICJwYWNrLnRocmVhZHMiKSkgeworCQlkZWx0YV9zZWFyY2hfdGhyZWFkcyA9IGdpdF9jb25maWdfaW50KGssIHYpOworCQlpZiAoZGVsdGFfc2VhcmNoX3RocmVhZHMgPCAwKQorCQkJZGllKCJpbnZhbGlkIG51bWJlciBvZiB0aHJlYWRzIHNwZWNpZmllZCAoJWQpIiwKKwkJCSAgICBkZWx0YV9zZWFyY2hfdGhyZWFkcyk7CisjaWZuZGVmIFRIUkVBREVEX0RFTFRBX1NFQVJDSAorCQlpZiAoZGVsdGFfc2VhcmNoX3RocmVhZHMgIT0gMSkKKwkJCXdhcm5pbmcoIm5vIHRocmVhZHMgc3VwcG9ydCwgaWdub3JpbmcgJXMiLCBrKTsKKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAoaywgInBhY2suaW5kZXh2ZXJzaW9uIikpIHsKKwkJcGFja19pZHhfZGVmYXVsdF92ZXJzaW9uID0gZ2l0X2NvbmZpZ19pbnQoaywgdik7CisJCWlmIChwYWNrX2lkeF9kZWZhdWx0X3ZlcnNpb24gPiAyKQorCQkJZGllKCJiYWQgcGFjay5pbmRleHZlcnNpb249JWQiLCBwYWNrX2lkeF9kZWZhdWx0X3ZlcnNpb24pOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAoaywgInBhY2sucGFja3NpemVsaW1pdCIpKSB7CisJCXBhY2tfc2l6ZV9saW1pdF9jZmcgPSBnaXRfY29uZmlnX3Vsb25nKGssIHYpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGdpdF9kZWZhdWx0X2NvbmZpZyhrLCB2KTsKK30KKworc3RhdGljIHZvaWQgcmVhZF9vYmplY3RfbGlzdF9mcm9tX3N0ZGluKHZvaWQpCit7CisJY2hhciBsaW5lWzQwICsgMSArIFBBVEhfTUFYICsgMl07CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKworCWZvciAoOzspIHsKKwkJaWYgKCFmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIHN0ZGluKSkgeworCQkJaWYgKGZlb2Yoc3RkaW4pKQorCQkJCWJyZWFrOworCQkJaWYgKCFmZXJyb3Ioc3RkaW4pKQorCQkJCWRpZSgiZmdldHMgcmV0dXJuZWQgTlVMTCwgbm90IEVPRiwgbm90IGVycm9yISIpOworCQkJaWYgKGVycm5vICE9IEVJTlRSKQorCQkJCWRpZSgiZmdldHM6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWNsZWFyZXJyKHN0ZGluKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChsaW5lWzBdID09ICctJykgeworCQkJaWYgKGdldF9zaGExX2hleChsaW5lKzEsIHNoYTEpKQorCQkJCWRpZSgiZXhwZWN0ZWQgZWRnZSBzaGExLCBnb3QgZ2FyYmFnZTpcbiAlcyIsCisJCQkJICAgIGxpbmUpOworCQkJYWRkX3ByZWZlcnJlZF9iYXNlKHNoYTEpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGdldF9zaGExX2hleChsaW5lLCBzaGExKSkKKwkJCWRpZSgiZXhwZWN0ZWQgc2hhMSwgZ290IGdhcmJhZ2U6XG4gJXMiLCBsaW5lKTsKKworCQlhZGRfcHJlZmVycmVkX2Jhc2Vfb2JqZWN0KGxpbmUrNDEpOworCQlhZGRfb2JqZWN0X2VudHJ5KHNoYTEsIDAsIGxpbmUrNDEsIDApOworCX0KK30KKworI2RlZmluZSBPQkpFQ1RfQURERUQgKDF1PDwyMCkKKworc3RhdGljIHZvaWQgc2hvd19jb21taXQoc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCWFkZF9vYmplY3RfZW50cnkoY29tbWl0LT5vYmplY3Quc2hhMSwgT0JKX0NPTU1JVCwgTlVMTCwgMCk7CisJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gT0JKRUNUX0FEREVEOworfQorCitzdGF0aWMgdm9pZCBzaG93X29iamVjdChzdHJ1Y3Qgb2JqZWN0X2FycmF5X2VudHJ5ICpwKQoreworCWFkZF9wcmVmZXJyZWRfYmFzZV9vYmplY3QocC0+bmFtZSk7CisJYWRkX29iamVjdF9lbnRyeShwLT5pdGVtLT5zaGExLCBwLT5pdGVtLT50eXBlLCBwLT5uYW1lLCAwKTsKKwlwLT5pdGVtLT5mbGFncyB8PSBPQkpFQ1RfQURERUQ7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfZWRnZShzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJYWRkX3ByZWZlcnJlZF9iYXNlKGNvbW1pdC0+b2JqZWN0LnNoYTEpOworfQorCitzdHJ1Y3QgaW5fcGFja19vYmplY3QgeworCW9mZl90IG9mZnNldDsKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmplY3Q7Cit9OworCitzdHJ1Y3QgaW5fcGFjayB7CisJaW50IGFsbG9jOworCWludCBucjsKKwlzdHJ1Y3QgaW5fcGFja19vYmplY3QgKmFycmF5OworfTsKKworc3RhdGljIHZvaWQgbWFya19pbl9wYWNrX29iamVjdChzdHJ1Y3Qgb2JqZWN0ICpvYmplY3QsIHN0cnVjdCBwYWNrZWRfZ2l0ICpwLCBzdHJ1Y3QgaW5fcGFjayAqaW5fcGFjaykKK3sKKwlpbl9wYWNrLT5hcnJheVtpbl9wYWNrLT5ucl0ub2Zmc2V0ID0gZmluZF9wYWNrX2VudHJ5X29uZShvYmplY3QtPnNoYTEsIHApOworCWluX3BhY2stPmFycmF5W2luX3BhY2stPm5yXS5vYmplY3QgPSBvYmplY3Q7CisJaW5fcGFjay0+bnIrKzsKK30KKworLyoKKyAqIENvbXBhcmUgdGhlIG9iamVjdHMgaW4gdGhlIG9mZnNldCBvcmRlciwgaW4gb3JkZXIgdG8gZW11bGF0ZSB0aGUKKyAqICJnaXQtcmV2LWxpc3QgLS1vYmplY3RzIiBvdXRwdXQgdGhhdCBwcm9kdWNlZCB0aGUgcGFjayBvcmlnaW5hbGx5LgorICovCitzdGF0aWMgaW50IG9mc2NtcChjb25zdCB2b2lkICphXywgY29uc3Qgdm9pZCAqYl8pCit7CisJc3RydWN0IGluX3BhY2tfb2JqZWN0ICphID0gKHN0cnVjdCBpbl9wYWNrX29iamVjdCAqKWFfOworCXN0cnVjdCBpbl9wYWNrX29iamVjdCAqYiA9IChzdHJ1Y3QgaW5fcGFja19vYmplY3QgKiliXzsKKworCWlmIChhLT5vZmZzZXQgPCBiLT5vZmZzZXQpCisJCXJldHVybiAtMTsKKwllbHNlIGlmIChhLT5vZmZzZXQgPiBiLT5vZmZzZXQpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIGhhc2hjbXAoYS0+b2JqZWN0LT5zaGExLCBiLT5vYmplY3QtPnNoYTEpOworfQorCitzdGF0aWMgdm9pZCBhZGRfb2JqZWN0c19pbl91bnBhY2tlZF9wYWNrcyhzdHJ1Y3QgcmV2X2luZm8gKnJldnMpCit7CisJc3RydWN0IHBhY2tlZF9naXQgKnA7CisJc3RydWN0IGluX3BhY2sgaW5fcGFjazsKKwl1aW50MzJfdCBpOworCisJbWVtc2V0KCZpbl9wYWNrLCAwLCBzaXplb2YoaW5fcGFjaykpOworCisJZm9yIChwID0gcGFja2VkX2dpdDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMTsKKwkJc3RydWN0IG9iamVjdCAqbzsKKworCQlmb3IgKGkgPSAwOyBpIDwgcmV2cy0+bnVtX2lnbm9yZV9wYWNrZWQ7IGkrKykgeworCQkJaWYgKG1hdGNoZXNfcGFja19uYW1lKHAsIHJldnMtPmlnbm9yZV9wYWNrZWRbaV0pKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChyZXZzLT5udW1faWdub3JlX3BhY2tlZCA8PSBpKQorCQkJY29udGludWU7CisJCWlmIChvcGVuX3BhY2tfaW5kZXgocCkpCisJCQlkaWUoImNhbm5vdCBvcGVuIHBhY2sgaW5kZXgiKTsKKworCQlBTExPQ19HUk9XKGluX3BhY2suYXJyYXksCisJCQkgICBpbl9wYWNrLm5yICsgcC0+bnVtX29iamVjdHMsCisJCQkgICBpbl9wYWNrLmFsbG9jKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgcC0+bnVtX29iamVjdHM7IGkrKykgeworCQkJc2hhMSA9IG50aF9wYWNrZWRfb2JqZWN0X3NoYTEocCwgaSk7CisJCQlvID0gbG9va3VwX3Vua25vd25fb2JqZWN0KHNoYTEpOworCQkJaWYgKCEoby0+ZmxhZ3MgJiBPQkpFQ1RfQURERUQpKQorCQkJCW1hcmtfaW5fcGFja19vYmplY3QobywgcCwgJmluX3BhY2spOworCQkJby0+ZmxhZ3MgfD0gT0JKRUNUX0FEREVEOworCQl9CisJfQorCisJaWYgKGluX3BhY2subnIpIHsKKwkJcXNvcnQoaW5fcGFjay5hcnJheSwgaW5fcGFjay5uciwgc2l6ZW9mKGluX3BhY2suYXJyYXlbMF0pLAorCQkgICAgICBvZnNjbXApOworCQlmb3IgKGkgPSAwOyBpIDwgaW5fcGFjay5ucjsgaSsrKSB7CisJCQlzdHJ1Y3Qgb2JqZWN0ICpvID0gaW5fcGFjay5hcnJheVtpXS5vYmplY3Q7CisJCQlhZGRfb2JqZWN0X2VudHJ5KG8tPnNoYTEsIG8tPnR5cGUsICIiLCAwKTsKKwkJfQorCX0KKwlmcmVlKGluX3BhY2suYXJyYXkpOworfQorCitzdGF0aWMgdm9pZCBnZXRfb2JqZWN0X2xpc3QoaW50IGFjLCBjb25zdCBjaGFyICoqYXYpCit7CisJc3RydWN0IHJldl9pbmZvIHJldnM7CisJY2hhciBsaW5lWzEwMDBdOworCWludCBmbGFncyA9IDA7CisKKwlpbml0X3JldmlzaW9ucygmcmV2cywgTlVMTCk7CisJc2F2ZV9jb21taXRfYnVmZmVyID0gMDsKKwlzZXR1cF9yZXZpc2lvbnMoYWMsIGF2LCAmcmV2cywgTlVMTCk7CisKKwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBzdGRpbikgIT0gTlVMTCkgeworCQlpbnQgbGVuID0gc3RybGVuKGxpbmUpOworCQlpZiAobGVuICYmIGxpbmVbbGVuIC0gMV0gPT0gJ1xuJykKKwkJCWxpbmVbLS1sZW5dID0gMDsKKwkJaWYgKCFsZW4pCisJCQlicmVhazsKKwkJaWYgKCpsaW5lID09ICctJykgeworCQkJaWYgKCFzdHJjbXAobGluZSwgIi0tbm90IikpIHsKKwkJCQlmbGFncyBePSBVTklOVEVSRVNUSU5HOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZGllKCJub3QgYSByZXYgJyVzJyIsIGxpbmUpOworCQl9CisJCWlmIChoYW5kbGVfcmV2aXNpb25fYXJnKGxpbmUsICZyZXZzLCBmbGFncywgMSkpCisJCQlkaWUoImJhZCByZXZpc2lvbiAnJXMnIiwgbGluZSk7CisJfQorCisJaWYgKHByZXBhcmVfcmV2aXNpb25fd2FsaygmcmV2cykpCisJCWRpZSgicmV2aXNpb24gd2FsayBzZXR1cCBmYWlsZWQiKTsKKwltYXJrX2VkZ2VzX3VuaW50ZXJlc3RpbmcocmV2cy5jb21taXRzLCAmcmV2cywgc2hvd19lZGdlKTsKKwl0cmF2ZXJzZV9jb21taXRfbGlzdCgmcmV2cywgc2hvd19jb21taXQsIHNob3dfb2JqZWN0KTsKKworCWlmIChrZWVwX3VucmVhY2hhYmxlKQorCQlhZGRfb2JqZWN0c19pbl91bnBhY2tlZF9wYWNrcygmcmV2cyk7Cit9CisKK3N0YXRpYyBpbnQgYWRqdXN0X3Blcm0oY29uc3QgY2hhciAqcGF0aCwgbW9kZV90IG1vZGUpCit7CisJaWYgKGNobW9kKHBhdGgsIG1vZGUpKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIGFkanVzdF9zaGFyZWRfcGVybShwYXRoKTsKK30KKworaW50IGNtZF9wYWNrX29iamVjdHMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IHVzZV9pbnRlcm5hbF9yZXZfbGlzdCA9IDA7CisJaW50IHRoaW4gPSAwOworCXVpbnQzMl90IGk7CisJY29uc3QgY2hhciAqKnJwX2F2OworCWludCBycF9hY19hbGxvYyA9IDY0OworCWludCBycF9hYzsKKworCXJwX2F2ID0geGNhbGxvYyhycF9hY19hbGxvYywgc2l6ZW9mKCpycF9hdikpOworCisJcnBfYXZbMF0gPSAicGFjay1vYmplY3RzIjsKKwlycF9hdlsxXSA9ICItLW9iamVjdHMiOyAvKiAtLXRoaW4gd2lsbCBtYWtlIGl0IC0tb2JqZWN0cy1lZGdlICovCisJcnBfYWMgPSAyOworCisJZ2l0X2NvbmZpZyhnaXRfcGFja19jb25maWcpOworCWlmICghcGFja19jb21wcmVzc2lvbl9zZWVuICYmIGNvcmVfY29tcHJlc3Npb25fc2VlbikKKwkJcGFja19jb21wcmVzc2lvbl9sZXZlbCA9IGNvcmVfY29tcHJlc3Npb25fbGV2ZWw7CisKKwlwcm9ncmVzcyA9IGlzYXR0eSgyKTsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJaWYgKCphcmcgIT0gJy0nKQorCQkJYnJlYWs7CisKKwkJaWYgKCFzdHJjbXAoIi0tbm9uLWVtcHR5IiwgYXJnKSkgeworCQkJbm9uX2VtcHR5ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItLWxvY2FsIiwgYXJnKSkgeworCQkJbG9jYWwgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi0taW5jcmVtZW50YWwiLCBhcmcpKSB7CisJCQlpbmNyZW1lbnRhbCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItLWNvbXByZXNzaW9uPSIpKSB7CisJCQljaGFyICplbmQ7CisJCQlpbnQgbGV2ZWwgPSBzdHJ0b3VsKGFyZysxNCwgJmVuZCwgMCk7CisJCQlpZiAoIWFyZ1sxNF0gfHwgKmVuZCkKKwkJCQl1c2FnZShwYWNrX3VzYWdlKTsKKwkJCWlmIChsZXZlbCA9PSAtMSkKKwkJCQlsZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTjsKKwkJCWVsc2UgaWYgKGxldmVsIDwgMCB8fCBsZXZlbCA+IFpfQkVTVF9DT01QUkVTU0lPTikKKwkJCQlkaWUoImJhZCBwYWNrIGNvbXByZXNzaW9uIGxldmVsICVkIiwgbGV2ZWwpOworCQkJcGFja19jb21wcmVzc2lvbl9sZXZlbCA9IGxldmVsOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1tYXgtcGFjay1zaXplPSIpKSB7CisJCQljaGFyICplbmQ7CisJCQlwYWNrX3NpemVfbGltaXRfY2ZnID0gMDsKKwkJCXBhY2tfc2l6ZV9saW1pdCA9IHN0cnRvdWwoYXJnKzE2LCAmZW5kLCAwKSAqIDEwMjQgKiAxMDI0OworCQkJaWYgKCFhcmdbMTZdIHx8ICplbmQpCisJCQkJdXNhZ2UocGFja191c2FnZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItLXdpbmRvdz0iKSkgeworCQkJY2hhciAqZW5kOworCQkJd2luZG93ID0gc3RydG91bChhcmcrOSwgJmVuZCwgMCk7CisJCQlpZiAoIWFyZ1s5XSB8fCAqZW5kKQorCQkJCXVzYWdlKHBhY2tfdXNhZ2UpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS13aW5kb3ctbWVtb3J5PSIpKSB7CisJCQlpZiAoIWdpdF9wYXJzZV91bG9uZyhhcmcrMTYsICZ3aW5kb3dfbWVtb3J5X2xpbWl0KSkKKwkJCQl1c2FnZShwYWNrX3VzYWdlKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tdGhyZWFkcz0iKSkgeworCQkJY2hhciAqZW5kOworCQkJZGVsdGFfc2VhcmNoX3RocmVhZHMgPSBzdHJ0b3VsKGFyZysxMCwgJmVuZCwgMCk7CisJCQlpZiAoIWFyZ1sxMF0gfHwgKmVuZCB8fCBkZWx0YV9zZWFyY2hfdGhyZWFkcyA8IDApCisJCQkJdXNhZ2UocGFja191c2FnZSk7CisjaWZuZGVmIFRIUkVBREVEX0RFTFRBX1NFQVJDSAorCQkJaWYgKGRlbHRhX3NlYXJjaF90aHJlYWRzICE9IDEpCisJCQkJd2FybmluZygibm8gdGhyZWFkcyBzdXBwb3J0LCAiCisJCQkJCSJpZ25vcmluZyAlcyIsIGFyZyk7CisjZW5kaWYKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tZGVwdGg9IikpIHsKKwkJCWNoYXIgKmVuZDsKKwkJCWRlcHRoID0gc3RydG91bChhcmcrOCwgJmVuZCwgMCk7CisJCQlpZiAoIWFyZ1s4XSB8fCAqZW5kKQorCQkJCXVzYWdlKHBhY2tfdXNhZ2UpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi0tcHJvZ3Jlc3MiLCBhcmcpKSB7CisJCQlwcm9ncmVzcyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLS1hbGwtcHJvZ3Jlc3MiLCBhcmcpKSB7CisJCQlwcm9ncmVzcyA9IDI7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLXEiLCBhcmcpKSB7CisJCQlwcm9ncmVzcyA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLS1uby1yZXVzZS1kZWx0YSIsIGFyZykpIHsKKwkJCW5vX3JldXNlX2RlbHRhID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItLW5vLXJldXNlLW9iamVjdCIsIGFyZykpIHsKKwkJCW5vX3JldXNlX29iamVjdCA9IG5vX3JldXNlX2RlbHRhID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItLWRlbHRhLWJhc2Utb2Zmc2V0IiwgYXJnKSkgeworCQkJYWxsb3dfb2ZzX2RlbHRhID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItLXN0ZG91dCIsIGFyZykpIHsKKwkJCXBhY2tfdG9fc3Rkb3V0ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItLXJldnMiLCBhcmcpKSB7CisJCQl1c2VfaW50ZXJuYWxfcmV2X2xpc3QgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi0ta2VlcC11bnJlYWNoYWJsZSIsIGFyZykpIHsKKwkJCWtlZXBfdW5yZWFjaGFibGUgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi0taW5jbHVkZS10YWciLCBhcmcpKSB7CisJCQlpbmNsdWRlX3RhZyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLS11bnBhY2tlZCIsIGFyZykgfHwKKwkJICAgICFwcmVmaXhjbXAoYXJnLCAiLS11bnBhY2tlZD0iKSB8fAorCQkgICAgIXN0cmNtcCgiLS1yZWZsb2ciLCBhcmcpIHx8CisJCSAgICAhc3RyY21wKCItLWFsbCIsIGFyZykpIHsKKwkJCXVzZV9pbnRlcm5hbF9yZXZfbGlzdCA9IDE7CisJCQlpZiAocnBfYWMgPj0gcnBfYWNfYWxsb2MgLSAxKSB7CisJCQkJcnBfYWNfYWxsb2MgPSBhbGxvY19ucihycF9hY19hbGxvYyk7CisJCQkJcnBfYXYgPSB4cmVhbGxvYyhycF9hdiwKKwkJCQkJCSBycF9hY19hbGxvYyAqIHNpemVvZigqcnBfYXYpKTsKKwkJCX0KKwkJCXJwX2F2W3JwX2FjKytdID0gYXJnOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi0tdGhpbiIsIGFyZykpIHsKKwkJCXVzZV9pbnRlcm5hbF9yZXZfbGlzdCA9IDE7CisJCQl0aGluID0gMTsKKwkJCXJwX2F2WzFdID0gIi0tb2JqZWN0cy1lZGdlIjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0taW5kZXgtdmVyc2lvbj0iKSkgeworCQkJY2hhciAqYzsKKwkJCXBhY2tfaWR4X2RlZmF1bHRfdmVyc2lvbiA9IHN0cnRvdWwoYXJnICsgMTYsICZjLCAxMCk7CisJCQlpZiAocGFja19pZHhfZGVmYXVsdF92ZXJzaW9uID4gMikKKwkJCQlkaWUoImJhZCAlcyIsIGFyZyk7CisJCQlpZiAoKmMgPT0gJywnKQorCQkJCXBhY2tfaWR4X29mZjMyX2xpbWl0ID0gc3RydG91bChjKzEsICZjLCAwKTsKKwkJCWlmICgqYyB8fCBwYWNrX2lkeF9vZmYzMl9saW1pdCAmIDB4ODAwMDAwMDApCisJCQkJZGllKCJiYWQgJXMiLCBhcmcpOworCQkJY29udGludWU7CisJCX0KKwkJdXNhZ2UocGFja191c2FnZSk7CisJfQorCisJLyogVHJhZGl0aW9uYWxseSAicGFjay1vYmplY3RzIFtvcHRpb25zXSBiYXNlIGV4dHJhIiBmYWlsZWQ7CisJICogd2Ugd291bGQgaG93ZXZlciB3YW50IHRvIHRha2UgcmVmcyBwYXJhbWV0ZXIgdGhhdCB3b3VsZAorCSAqIGhhdmUgYmVlbiBnaXZlbiB0byB1cHN0cmVhbSByZXYtbGlzdCBvdXJzZWx2ZXMsIHdoaWNoIG1lYW5zCisJICogd2Ugc29tZWhvdyB3YW50IHRvIHNheSB3aGF0IHRoZSBiYXNlIG5hbWUgaXMuICBTbyB0aGUKKwkgKiBzeW50YXggd291bGQgYmU6CisJICoKKwkgKiBwYWNrLW9iamVjdHMgW29wdGlvbnNdIGJhc2UgPHJlZnMuLi4+CisJICoKKwkgKiBpbiBvdGhlciB3b3Jkcywgd2Ugd291bGQgdHJlYXQgdGhlIGZpcnN0IG5vbi1vcHRpb24gYXMgdGhlCisJICogYmFzZV9uYW1lIGFuZCBzZW5kIGV2ZXJ5dGhpbmcgZWxzZSB0byB0aGUgaW50ZXJuYWwgcmV2aXNpb24KKwkgKiB3YWxrZXIuCisJICovCisKKwlpZiAoIXBhY2tfdG9fc3Rkb3V0KQorCQliYXNlX25hbWUgPSBhcmd2W2krK107CisKKwlpZiAocGFja190b19zdGRvdXQgIT0gIWJhc2VfbmFtZSkKKwkJdXNhZ2UocGFja191c2FnZSk7CisKKwlpZiAoIXBhY2tfdG9fc3Rkb3V0ICYmICFwYWNrX3NpemVfbGltaXQpCisJCXBhY2tfc2l6ZV9saW1pdCA9IHBhY2tfc2l6ZV9saW1pdF9jZmc7CisKKwlpZiAocGFja190b19zdGRvdXQgJiYgcGFja19zaXplX2xpbWl0KQorCQlkaWUoIi0tbWF4LXBhY2stc2l6ZSBjYW5ub3QgYmUgdXNlZCB0byBidWlsZCBhIHBhY2sgZm9yIHRyYW5zZmVyLiIpOworCisJaWYgKCFwYWNrX3RvX3N0ZG91dCAmJiB0aGluKQorCQlkaWUoIi0tdGhpbiBjYW5ub3QgYmUgdXNlZCB0byBidWlsZCBhbiBpbmRleGFibGUgcGFjay4iKTsKKworI2lmZGVmIFRIUkVBREVEX0RFTFRBX1NFQVJDSAorCWlmICghZGVsdGFfc2VhcmNoX3RocmVhZHMpCS8qIC0tdGhyZWFkcz0wIG1lYW5zIGF1dG9kZXRlY3QgKi8KKwkJZGVsdGFfc2VhcmNoX3RocmVhZHMgPSBvbmxpbmVfY3B1cygpOworI2VuZGlmCisKKwlwcmVwYXJlX3BhY2tlZF9naXQoKTsKKworCWlmIChwcm9ncmVzcykKKwkJcHJvZ3Jlc3Nfc3RhdGUgPSBzdGFydF9wcm9ncmVzcygiQ291bnRpbmcgb2JqZWN0cyIsIDApOworCWlmICghdXNlX2ludGVybmFsX3Jldl9saXN0KQorCQlyZWFkX29iamVjdF9saXN0X2Zyb21fc3RkaW4oKTsKKwllbHNlIHsKKwkJcnBfYXZbcnBfYWNdID0gTlVMTDsKKwkJZ2V0X29iamVjdF9saXN0KHJwX2FjLCBycF9hdik7CisJfQorCWlmIChpbmNsdWRlX3RhZyAmJiBucl9yZXN1bHQpCisJCWZvcl9lYWNoX3JlZihhZGRfcmVmX3RhZywgTlVMTCk7CisJc3RvcF9wcm9ncmVzcygmcHJvZ3Jlc3Nfc3RhdGUpOworCisJaWYgKG5vbl9lbXB0eSAmJiAhbnJfcmVzdWx0KQorCQlyZXR1cm4gMDsKKwlpZiAobnJfcmVzdWx0KQorCQlwcmVwYXJlX3BhY2sod2luZG93LCBkZXB0aCk7CisJd3JpdGVfcGFja19maWxlKCk7CisJaWYgKHByb2dyZXNzKQorCQlmcHJpbnRmKHN0ZGVyciwgIlRvdGFsICV1IChkZWx0YSAldSksIHJldXNlZCAldSAoZGVsdGEgJXUpXG4iLAorCQkJd3JpdHRlbiwgd3JpdHRlbl9kZWx0YSwgcmV1c2VkLCByZXVzZWRfZGVsdGEpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1wYWNrLXJlZnMuYyBiL2J1aWx0aW4tcGFjay1yZWZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFhYTc2ZAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tcGFjay1yZWZzLmMKQEAgLTAsMCArMSwxNDAgQEAKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAicGFyc2Utb3B0aW9ucy5oIgorCitzdHJ1Y3QgcmVmX3RvX3BydW5lIHsKKwlzdHJ1Y3QgcmVmX3RvX3BydW5lICpuZXh0OworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY2hhciBuYW1lW0ZMRVhfQVJSQVldOworfTsKKworI2RlZmluZSBQQUNLX1JFRlNfUFJVTkUJMHgwMDAxCisjZGVmaW5lIFBBQ0tfUkVGU19BTEwJMHgwMDAyCisKK3N0cnVjdCBwYWNrX3JlZnNfY2JfZGF0YSB7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXN0cnVjdCByZWZfdG9fcHJ1bmUgKnJlZl90b19wcnVuZTsKKwlGSUxFICpyZWZzX2ZpbGU7Cit9OworCitzdGF0aWMgaW50IGRvX25vdF9wcnVuZShpbnQgZmxhZ3MpCit7CisJLyogSWYgaXQgaXMgYWxyZWFkeSBwYWNrZWQgb3IgaWYgaXQgaXMgYSBzeW1yZWYsCisJICogZG8gbm90IHBydW5lIGl0LgorCSAqLworCXJldHVybiAoZmxhZ3MgJiAoUkVGX0lTU1lNUkVGfFJFRl9JU1BBQ0tFRCkpOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9vbmVfcmVmKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkgIGludCBmbGFncywgdm9pZCAqY2JfZGF0YSkKK3sKKwlzdHJ1Y3QgcGFja19yZWZzX2NiX2RhdGEgKmNiID0gY2JfZGF0YTsKKwlpbnQgaXNfdGFnX3JlZjsKKworCS8qIERvIG5vdCBwYWNrIHRoZSBzeW1ib2xpYyByZWZzICovCisJaWYgKChmbGFncyAmIFJFRl9JU1NZTVJFRikpCisJCXJldHVybiAwOworCWlzX3RhZ19yZWYgPSAhcHJlZml4Y21wKHBhdGgsICJyZWZzL3RhZ3MvIik7CisKKwkvKiBBTFdBWVMgcGFjayByZWZzIHRoYXQgd2VyZSBhbHJlYWR5IHBhY2tlZCBvciBhcmUgdGFncyAqLworCWlmICghKGNiLT5mbGFncyAmIFBBQ0tfUkVGU19BTEwpICYmICFpc190YWdfcmVmICYmICEoZmxhZ3MgJiBSRUZfSVNQQUNLRUQpKQorCQlyZXR1cm4gMDsKKworCWZwcmludGYoY2ItPnJlZnNfZmlsZSwgIiVzICVzXG4iLCBzaGExX3RvX2hleChzaGExKSwgcGF0aCk7CisJaWYgKGlzX3RhZ19yZWYpIHsKKwkJc3RydWN0IG9iamVjdCAqbyA9IHBhcnNlX29iamVjdChzaGExKTsKKwkJaWYgKG8tPnR5cGUgPT0gT0JKX1RBRykgeworCQkJbyA9IGRlcmVmX3RhZyhvLCBwYXRoLCAwKTsKKwkJCWlmIChvKQorCQkJCWZwcmludGYoY2ItPnJlZnNfZmlsZSwgIl4lc1xuIiwKKwkJCQkJc2hhMV90b19oZXgoby0+c2hhMSkpOworCQl9CisJfQorCisJaWYgKChjYi0+ZmxhZ3MgJiBQQUNLX1JFRlNfUFJVTkUpICYmICFkb19ub3RfcHJ1bmUoZmxhZ3MpKSB7CisJCWludCBuYW1lbGVuID0gc3RybGVuKHBhdGgpICsgMTsKKwkJc3RydWN0IHJlZl90b19wcnVuZSAqbiA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpuKSArIG5hbWVsZW4pOworCQloYXNoY3B5KG4tPnNoYTEsIHNoYTEpOworCQlzdHJjcHkobi0+bmFtZSwgcGF0aCk7CisJCW4tPm5leHQgPSBjYi0+cmVmX3RvX3BydW5lOworCQljYi0+cmVmX3RvX3BydW5lID0gbjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIG1ha2Ugc3VyZSBub2JvZHkgdG91Y2hlZCB0aGUgcmVmLCBhbmQgdW5saW5rICovCitzdGF0aWMgdm9pZCBwcnVuZV9yZWYoc3RydWN0IHJlZl90b19wcnVuZSAqcikKK3sKKwlzdHJ1Y3QgcmVmX2xvY2sgKmxvY2sgPSBsb2NrX3JlZl9zaGExKHItPm5hbWUgKyA1LCByLT5zaGExKTsKKworCWlmIChsb2NrKSB7CisJCXVubGluayhnaXRfcGF0aCgiJXMiLCByLT5uYW1lKSk7CisJCXVubG9ja19yZWYobG9jayk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcnVuZV9yZWZzKHN0cnVjdCByZWZfdG9fcHJ1bmUgKnIpCit7CisJd2hpbGUgKHIpIHsKKwkJcHJ1bmVfcmVmKHIpOworCQlyID0gci0+bmV4dDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG9ja19maWxlIHBhY2tlZDsKKworc3RhdGljIGludCBwYWNrX3JlZnModW5zaWduZWQgaW50IGZsYWdzKQoreworCWludCBmZDsKKwlzdHJ1Y3QgcGFja19yZWZzX2NiX2RhdGEgY2JkYXRhOworCisJbWVtc2V0KCZjYmRhdGEsIDAsIHNpemVvZihjYmRhdGEpKTsKKwljYmRhdGEuZmxhZ3MgPSBmbGFnczsKKworCWZkID0gaG9sZF9sb2NrX2ZpbGVfZm9yX3VwZGF0ZSgmcGFja2VkLCBnaXRfcGF0aCgicGFja2VkLXJlZnMiKSwgMSk7CisJY2JkYXRhLnJlZnNfZmlsZSA9IGZkb3BlbihmZCwgInciKTsKKwlpZiAoIWNiZGF0YS5yZWZzX2ZpbGUpCisJCWRpZSgidW5hYmxlIHRvIGNyZWF0ZSByZWYtcGFjayBmaWxlIHN0cnVjdHVyZSAoJXMpIiwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CisKKwkvKiBwZXJoYXBzIG90aGVyIHRyYWl0cyBsYXRlciBhcyB3ZWxsICovCisJZnByaW50ZihjYmRhdGEucmVmc19maWxlLCAiIyBwYWNrLXJlZnMgd2l0aDogcGVlbGVkIFxuIik7CisKKwlmb3JfZWFjaF9yZWYoaGFuZGxlX29uZV9yZWYsICZjYmRhdGEpOworCWlmIChmZXJyb3IoY2JkYXRhLnJlZnNfZmlsZSkpCisJCWRpZSgiZmFpbGVkIHRvIHdyaXRlIHJlZi1wYWNrIGZpbGUiKTsKKwlpZiAoZmZsdXNoKGNiZGF0YS5yZWZzX2ZpbGUpIHx8IGZzeW5jKGZkKSB8fCBmY2xvc2UoY2JkYXRhLnJlZnNfZmlsZSkpCisJCWRpZSgiZmFpbGVkIHRvIHdyaXRlIHJlZi1wYWNrIGZpbGUgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CisJLyoKKwkgKiBTaW5jZSB0aGUgbG9jayBmaWxlIHdhcyBmZG9wZW4oKSdlZCBhbmQgdGhlbiBmY2xvc2UoKSdlZCBhYm92ZSwKKwkgKiBhc3NpZ24gLTEgdG8gdGhlIGxvY2sgZmlsZSBkZXNjcmlwdG9yIHNvIHRoYXQgY29tbWl0X2xvY2tfZmlsZSgpCisJICogd29uJ3QgdHJ5IHRvIGNsb3NlKCkgaXQuCisJICovCisJcGFja2VkLmZkID0gLTE7CisJaWYgKGNvbW1pdF9sb2NrX2ZpbGUoJnBhY2tlZCkgPCAwKQorCQlkaWUoInVuYWJsZSB0byBvdmVyd3JpdGUgb2xkIHJlZi1wYWNrIGZpbGUgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKGNiZGF0YS5mbGFncyAmIFBBQ0tfUkVGU19QUlVORSkKKwkJcHJ1bmVfcmVmcyhjYmRhdGEucmVmX3RvX3BydW5lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBwYWNrX3JlZnNfdXNhZ2VbXSA9IHsKKwkiZ2l0LXBhY2stcmVmcyBbb3B0aW9uc10iLAorCU5VTEwKK307CisKK2ludCBjbWRfcGFja19yZWZzKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXVuc2lnbmVkIGludCBmbGFncyA9IFBBQ0tfUkVGU19QUlVORTsKKwlzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9IHsKKwkJT1BUX0JJVCgwLCAiYWxsIiwgICAmZmxhZ3MsICJwYWNrIGV2ZXJ5dGhpbmciLCBQQUNLX1JFRlNfQUxMKSwKKwkJT1BUX0JJVCgwLCAicHJ1bmUiLCAmZmxhZ3MsICJwcnVuZSBsb29zZSByZWZzIChkZWZhdWx0KSIsIFBBQ0tfUkVGU19QUlVORSksCisJCU9QVF9FTkQoKSwKKwl9OworCWlmIChwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIG9wdHMsIHBhY2tfcmVmc191c2FnZSwgMCkpCisJCXVzYWdlX3dpdGhfb3B0aW9ucyhwYWNrX3JlZnNfdXNhZ2UsIG9wdHMpOworCXJldHVybiBwYWNrX3JlZnMoZmxhZ3MpOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1wcnVuZS1wYWNrZWQuYyBiL2J1aWx0aW4tcHJ1bmUtcGFja2VkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNmYWYzMQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tcHJ1bmUtcGFja2VkLmMKQEAgLTAsMCArMSw5MSBAQAorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInByb2dyZXNzLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIHBydW5lX3BhY2tlZF91c2FnZVtdID0KKyJnaXQtcHJ1bmUtcGFja2VkIFstbl0gWy1xXSI7CisKKyNkZWZpbmUgRFJZX1JVTiAwMQorI2RlZmluZSBWRVJCT1NFIDAyCisKK3N0YXRpYyBzdHJ1Y3QgcHJvZ3Jlc3MgKnByb2dyZXNzOworCitzdGF0aWMgdm9pZCBwcnVuZV9kaXIoaW50IGksIERJUiAqZGlyLCBjaGFyICpwYXRobmFtZSwgaW50IGxlbiwgaW50IG9wdHMpCit7CisJc3RydWN0IGRpcmVudCAqZGU7CisJY2hhciBoZXhbNDBdOworCisJc3ByaW50ZihoZXgsICIlMDJ4IiwgaSk7CisJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQlpZiAoc3RybGVuKGRlLT5kX25hbWUpICE9IDM4KQorCQkJY29udGludWU7CisJCW1lbWNweShoZXgrMiwgZGUtPmRfbmFtZSwgMzgpOworCQlpZiAoZ2V0X3NoYTFfaGV4KGhleCwgc2hhMSkpCisJCQljb250aW51ZTsKKwkJaWYgKCFoYXNfc2hhMV9wYWNrKHNoYTEsIE5VTEwpKQorCQkJY29udGludWU7CisJCW1lbWNweShwYXRobmFtZSArIGxlbiwgZGUtPmRfbmFtZSwgMzgpOworCQlpZiAob3B0cyAmIERSWV9SVU4pCisJCQlwcmludGYoInJtIC1mICVzXG4iLCBwYXRobmFtZSk7CisJCWVsc2UgaWYgKHVubGluayhwYXRobmFtZSkgPCAwKQorCQkJZXJyb3IoInVuYWJsZSB0byB1bmxpbmsgJXMiLCBwYXRobmFtZSk7CisJCWRpc3BsYXlfcHJvZ3Jlc3MocHJvZ3Jlc3MsIGkgKyAxKTsKKwl9CisJcGF0aG5hbWVbbGVuXSA9IDA7CisJcm1kaXIocGF0aG5hbWUpOworfQorCit2b2lkIHBydW5lX3BhY2tlZF9vYmplY3RzKGludCBvcHRzKQoreworCWludCBpOworCXN0YXRpYyBjaGFyIHBhdGhuYW1lW1BBVEhfTUFYXTsKKwljb25zdCBjaGFyICpkaXIgPSBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpOworCWludCBsZW4gPSBzdHJsZW4oZGlyKTsKKworCWlmIChvcHRzID09IFZFUkJPU0UpCisJCXByb2dyZXNzID0gc3RhcnRfcHJvZ3Jlc3NfZGVsYXkoIlJlbW92aW5nIGR1cGxpY2F0ZSBvYmplY3RzIiwKKwkJCTI1NiwgOTUsIDIpOworCisJaWYgKGxlbiA+IFBBVEhfTUFYIC0gNDIpCisJCWRpZSgiaW1wb3NzaWJsZSBvYmplY3QgZGlyZWN0b3J5Iik7CisJbWVtY3B5KHBhdGhuYW1lLCBkaXIsIGxlbik7CisJaWYgKGxlbiAmJiBwYXRobmFtZVtsZW4tMV0gIT0gJy8nKQorCQlwYXRobmFtZVtsZW4rK10gPSAnLyc7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCURJUiAqZDsKKworCQlzcHJpbnRmKHBhdGhuYW1lICsgbGVuLCAiJTAyeC8iLCBpKTsKKwkJZCA9IG9wZW5kaXIocGF0aG5hbWUpOworCQlpZiAoIWQpCisJCQljb250aW51ZTsKKwkJcHJ1bmVfZGlyKGksIGQsIHBhdGhuYW1lLCBsZW4gKyAzLCBvcHRzKTsKKwkJY2xvc2VkaXIoZCk7CisJfQorCXN0b3BfcHJvZ3Jlc3MoJnByb2dyZXNzKTsKK30KKworaW50IGNtZF9wcnVuZV9wYWNrZWQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGk7CisJaW50IG9wdHMgPSBWRVJCT1NFOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCisJCWlmICgqYXJnID09ICctJykgeworCQkJaWYgKCFzdHJjbXAoYXJnLCAiLW4iKSkKKwkJCQlvcHRzIHw9IERSWV9SVU47CisJCQllbHNlIGlmICghc3RyY21wKGFyZywgIi1xIikpCisJCQkJb3B0cyAmPSB+VkVSQk9TRTsKKwkJCWVsc2UKKwkJCQl1c2FnZShwcnVuZV9wYWNrZWRfdXNhZ2UpOworCQkJY29udGludWU7CisJCX0KKwkJLyogSGFuZGxlIGFyZ3VtZW50cyBoZXJlIC4uICovCisJCXVzYWdlKHBydW5lX3BhY2tlZF91c2FnZSk7CisJfQorCXN5bmMoKTsKKwlwcnVuZV9wYWNrZWRfb2JqZWN0cyhvcHRzKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tcHJ1bmUuYyBiL2J1aWx0aW4tcHJ1bmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWY5MzA0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1wcnVuZS5jCkBAIC0wLDAgKzEsMTYzIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAicmVhY2hhYmxlLmgiCisjaW5jbHVkZSAicGFyc2Utb3B0aW9ucy5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBydW5lX3VzYWdlW10gPSB7CisJImdpdC1wcnVuZSBbLW5dIFstLWV4cGlyZSA8dGltZT5dIFstLV0gWzxoZWFkPi4uLl0iLAorCU5VTEwKK307CitzdGF0aWMgaW50IHNob3dfb25seTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGV4cGlyZTsKKworc3RhdGljIGludCBwcnVuZV9vYmplY3QoY2hhciAqcGF0aCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJY29uc3QgY2hhciAqZnVsbHBhdGggPSBta3BhdGgoIiVzLyVzIiwgcGF0aCwgZmlsZW5hbWUpOworCWlmIChleHBpcmUpIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWlmIChsc3RhdChmdWxscGF0aCwgJnN0KSkKKwkJCXJldHVybiBlcnJvcigiQ291bGQgbm90IHN0YXQgJyVzJyIsIGZ1bGxwYXRoKTsKKwkJaWYgKHN0LnN0X210aW1lID4gZXhwaXJlKQorCQkJcmV0dXJuIDA7CisJfQorCWlmIChzaG93X29ubHkpIHsKKwkJZW51bSBvYmplY3RfdHlwZSB0eXBlID0gc2hhMV9vYmplY3RfaW5mbyhzaGExLCBOVUxMKTsKKwkJcHJpbnRmKCIlcyAlc1xuIiwgc2hhMV90b19oZXgoc2hhMSksCisJCSAgICAgICAodHlwZSA+IDApID8gdHlwZW5hbWUodHlwZSkgOiAidW5rbm93biIpOworCX0gZWxzZQorCQl1bmxpbmsoZnVsbHBhdGgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBydW5lX2RpcihpbnQgaSwgY2hhciAqcGF0aCkKK3sKKwlESVIgKmRpciA9IG9wZW5kaXIocGF0aCk7CisJc3RydWN0IGRpcmVudCAqZGU7CisKKwlpZiAoIWRpcikKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCWNoYXIgbmFtZVsxMDBdOworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQlpbnQgbGVuID0gc3RybGVuKGRlLT5kX25hbWUpOworCisJCXN3aXRjaCAobGVuKSB7CisJCWNhc2UgMjoKKwkJCWlmIChkZS0+ZF9uYW1lWzFdICE9ICcuJykKKwkJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJaWYgKGRlLT5kX25hbWVbMF0gIT0gJy4nKQorCQkJCWJyZWFrOworCQkJY29udGludWU7CisJCWNhc2UgMzg6CisJCQlzcHJpbnRmKG5hbWUsICIlMDJ4IiwgaSk7CisJCQltZW1jcHkobmFtZSsyLCBkZS0+ZF9uYW1lLCBsZW4rMSk7CisJCQlpZiAoZ2V0X3NoYTFfaGV4KG5hbWUsIHNoYTEpIDwgMCkKKwkJCQlicmVhazsKKworCQkJLyoKKwkJCSAqIERvIHdlIGtub3cgYWJvdXQgdGhpcyBvYmplY3Q/CisJCQkgKiBJdCBtdXN0IGhhdmUgYmVlbiByZWFjaGFibGUKKwkJCSAqLworCQkJaWYgKGxvb2t1cF9vYmplY3Qoc2hhMSkpCisJCQkJY29udGludWU7CisKKwkJCXBydW5lX29iamVjdChwYXRoLCBkZS0+ZF9uYW1lLCBzaGExKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZwcmludGYoc3RkZXJyLCAiYmFkIHNoYTEgZmlsZTogJXMvJXNcbiIsIHBhdGgsIGRlLT5kX25hbWUpOworCX0KKwlpZiAoIXNob3dfb25seSkKKwkJcm1kaXIocGF0aCk7CisJY2xvc2VkaXIoZGlyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJ1bmVfb2JqZWN0X2Rpcihjb25zdCBjaGFyICpwYXRoKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlzdGF0aWMgY2hhciBkaXJbNDA5Nl07CisJCXNwcmludGYoZGlyLCAiJXMvJTAyeCIsIHBhdGgsIGkpOworCQlwcnVuZV9kaXIoaSwgZGlyKTsKKwl9Cit9CisKKy8qCisgKiBXcml0ZSBlcnJvcnMgKHBhcnRpY3VsYXJseSBvdXQgb2Ygc3BhY2UpIGNhbiByZXN1bHQgaW4KKyAqIGZhaWxlZCB0ZW1wb3JhcnkgcGFja3MgKGFuZCBtb3JlIHJhcmVseSBpbmRleGVzIGFuZCBvdGhlcgorICogZmlsZXMgYmVnaW5pbmcgd2l0aCAidG1wXyIpIGFjY3VtdWxhdGluZyBpbiB0aGUKKyAqIG9iamVjdCBkaXJlY3RvcnkuCisgKi8KK3N0YXRpYyB2b2lkIHJlbW92ZV90ZW1wb3JhcnlfZmlsZXModm9pZCkKK3sKKwlESVIgKmRpcjsKKwlzdHJ1Y3QgZGlyZW50ICpkZTsKKwljaGFyKiBkaXJuYW1lPWdldF9vYmplY3RfZGlyZWN0b3J5KCk7CisKKwlkaXIgPSBvcGVuZGlyKGRpcm5hbWUpOworCWlmICghZGlyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIG9wZW4gb2JqZWN0IGRpcmVjdG9yeSAlc1xuIiwKKwkJCWRpcm5hbWUpOworCQlyZXR1cm47CisJfQorCXdoaWxlICgoZGUgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJaWYgKCFwcmVmaXhjbXAoZGUtPmRfbmFtZSwgInRtcF8iKSkgeworCQkJY2hhciBuYW1lW1BBVEhfTUFYXTsKKwkJCWludCBjID0gc25wcmludGYobmFtZSwgUEFUSF9NQVgsICIlcy8lcyIsCisJCQkJCSBkaXJuYW1lLCBkZS0+ZF9uYW1lKTsKKwkJCWlmIChjIDwgMCB8fCBjID49IFBBVEhfTUFYKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGV4cGlyZSkgeworCQkJCXN0cnVjdCBzdGF0IHN0OworCQkJCWlmIChzdGF0KG5hbWUsICZzdCkgIT0gMCB8fCBzdC5zdF9tdGltZSA+PSBleHBpcmUpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcHJpbnRmKCJSZW1vdmluZyBzdGFsZSB0ZW1wb3JhcnkgZmlsZSAlc1xuIiwgbmFtZSk7CisJCQlpZiAoIXNob3dfb25seSkKKwkJCQl1bmxpbmsobmFtZSk7CisJCX0KKwl9CisJY2xvc2VkaXIoZGlyKTsKK30KKworaW50IGNtZF9wcnVuZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgcmV2X2luZm8gcmV2czsKKwljb25zdCBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKKwkJT1BUX0JPT0xFQU4oJ24nLCBOVUxMLCAmc2hvd19vbmx5LAorCQkJICAgICJkbyBub3QgcmVtb3ZlLCBzaG93IG9ubHkiKSwKKwkJT1BUX0RBVEUoMCwgImV4cGlyZSIsICZleHBpcmUsCisJCQkgImV4cGlyZSBvYmplY3RzIG9sZGVyIHRoYW4gPHRpbWU+IiksCisJCU9QVF9FTkQoKQorCX07CisKKwlzYXZlX2NvbW1pdF9idWZmZXIgPSAwOworCWluaXRfcmV2aXNpb25zKCZyZXZzLCBwcmVmaXgpOworCisJYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgb3B0aW9ucywgcHJ1bmVfdXNhZ2UsIDApOworCXdoaWxlIChhcmdjLS0pIHsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJY29uc3QgY2hhciAqbmFtZSA9ICphcmd2Kys7CisKKwkJaWYgKCFnZXRfc2hhMShuYW1lLCBzaGExKSkgeworCQkJc3RydWN0IG9iamVjdCAqb2JqZWN0ID0gcGFyc2Vfb2JqZWN0KHNoYTEpOworCQkJaWYgKCFvYmplY3QpCisJCQkJZGllKCJiYWQgb2JqZWN0OiAlcyIsIG5hbWUpOworCQkJYWRkX3BlbmRpbmdfb2JqZWN0KCZyZXZzLCBvYmplY3QsICIiKTsKKwkJfQorCQllbHNlCisJCQlkaWUoInVucmVjb2duaXplZCBhcmd1bWVudDogJXMiLCBuYW1lKTsKKwl9CisJbWFya19yZWFjaGFibGVfb2JqZWN0cygmcmV2cywgMSk7CisJcHJ1bmVfb2JqZWN0X2RpcihnZXRfb2JqZWN0X2RpcmVjdG9yeSgpKTsKKworCXN5bmMoKTsKKwlwcnVuZV9wYWNrZWRfb2JqZWN0cyhzaG93X29ubHkpOworCXJlbW92ZV90ZW1wb3JhcnlfZmlsZXMoKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tcHVzaC5jIGIvYnVpbHRpbi1wdXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY4YzY4MQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tcHVzaC5jCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogImdpdCBwdXNoIgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAicnVuLWNvbW1hbmQuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAicmVtb3RlLmgiCisjaW5jbHVkZSAidHJhbnNwb3J0LmgiCisjaW5jbHVkZSAicGFyc2Utb3B0aW9ucy5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB1c2hfdXNhZ2VbXSA9IHsKKwkiZ2l0LXB1c2ggWy0tYWxsIHwgLS1taXJyb3JdIFstLWRyeS1ydW5dIFstLXRhZ3NdIFstLXJlY2VpdmUtcGFjaz08Z2l0LXJlY2VpdmUtcGFjaz5dIFstLXJlcG89YWxsXSBbLWYgfCAtLWZvcmNlXSBbLXZdIFs8cmVwb3NpdG9yeT4gPHJlZnNwZWM+Li4uXSIsCisJTlVMTCwKK307CisKK3N0YXRpYyBpbnQgdGhpbiwgdmVyYm9zZTsKK3N0YXRpYyBjb25zdCBjaGFyICpyZWNlaXZlcGFjazsKKworc3RhdGljIGNvbnN0IGNoYXIgKipyZWZzcGVjOworc3RhdGljIGludCByZWZzcGVjX25yOworCitzdGF0aWMgdm9pZCBhZGRfcmVmc3BlYyhjb25zdCBjaGFyICpyZWYpCit7CisJaW50IG5yID0gcmVmc3BlY19uciArIDE7CisJcmVmc3BlYyA9IHhyZWFsbG9jKHJlZnNwZWMsIG5yICogc2l6ZW9mKGNoYXIgKikpOworCXJlZnNwZWNbbnItMV0gPSByZWY7CisJcmVmc3BlY19uciA9IG5yOworfQorCitzdGF0aWMgdm9pZCBzZXRfcmVmc3BlY3MoY29uc3QgY2hhciAqKnJlZnMsIGludCBucikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworCQljb25zdCBjaGFyICpyZWYgPSByZWZzW2ldOworCQlpZiAoIXN0cmNtcCgidGFnIiwgcmVmKSkgeworCQkJY2hhciAqdGFnOworCQkJaW50IGxlbjsKKwkJCWlmIChuciA8PSArK2kpCisJCQkJZGllKCJ0YWcgc2hvcnRoYW5kIHdpdGhvdXQgPHRhZz4iKTsKKwkJCWxlbiA9IHN0cmxlbihyZWZzW2ldKSArIDExOworCQkJdGFnID0geG1hbGxvYyhsZW4pOworCQkJc3RyY3B5KHRhZywgInJlZnMvdGFncy8iKTsKKwkJCXN0cmNhdCh0YWcsIHJlZnNbaV0pOworCQkJcmVmID0gdGFnOworCQl9CisJCWFkZF9yZWZzcGVjKHJlZik7CisJfQorfQorCitzdGF0aWMgaW50IGRvX3B1c2goY29uc3QgY2hhciAqcmVwbywgaW50IGZsYWdzKQoreworCWludCBpLCBlcnJzOworCXN0cnVjdCByZW1vdGUgKnJlbW90ZSA9IHJlbW90ZV9nZXQocmVwbyk7CisKKwlpZiAoIXJlbW90ZSkKKwkJZGllKCJiYWQgcmVwb3NpdG9yeSAnJXMnIiwgcmVwbyk7CisKKwlpZiAoIXJlZnNwZWMKKwkJJiYgIShmbGFncyAmIFRSQU5TUE9SVF9QVVNIX0FMTCkKKwkJJiYgcmVtb3RlLT5wdXNoX3JlZnNwZWNfbnIpIHsKKwkJcmVmc3BlYyA9IHJlbW90ZS0+cHVzaF9yZWZzcGVjOworCQlyZWZzcGVjX25yID0gcmVtb3RlLT5wdXNoX3JlZnNwZWNfbnI7CisJfQorCWVycnMgPSAwOworCWZvciAoaSA9IDA7IGkgPCByZW1vdGUtPnVybF9ucjsgaSsrKSB7CisJCXN0cnVjdCB0cmFuc3BvcnQgKnRyYW5zcG9ydCA9CisJCQl0cmFuc3BvcnRfZ2V0KHJlbW90ZSwgcmVtb3RlLT51cmxbaV0pOworCQlpbnQgZXJyOworCQlpZiAocmVjZWl2ZXBhY2spCisJCQl0cmFuc3BvcnRfc2V0X29wdGlvbih0cmFuc3BvcnQsCisJCQkJCSAgICAgVFJBTlNfT1BUX1JFQ0VJVkVQQUNLLCByZWNlaXZlcGFjayk7CisJCWlmICh0aGluKQorCQkJdHJhbnNwb3J0X3NldF9vcHRpb24odHJhbnNwb3J0LCBUUkFOU19PUFRfVEhJTiwgInllcyIpOworCisJCWlmICh2ZXJib3NlKQorCQkJZnByaW50ZihzdGRlcnIsICJQdXNoaW5nIHRvICVzXG4iLCByZW1vdGUtPnVybFtpXSk7CisJCWVyciA9IHRyYW5zcG9ydF9wdXNoKHRyYW5zcG9ydCwgcmVmc3BlY19uciwgcmVmc3BlYywgZmxhZ3MpOworCQllcnIgfD0gdHJhbnNwb3J0X2Rpc2Nvbm5lY3QodHJhbnNwb3J0KTsKKworCQlpZiAoIWVycikKKwkJCWNvbnRpbnVlOworCisJCWVycm9yKCJmYWlsZWQgdG8gcHVzaCBzb21lIHJlZnMgdG8gJyVzJyIsIHJlbW90ZS0+dXJsW2ldKTsKKwkJZXJycysrOworCX0KKwlyZXR1cm4gISFlcnJzOworfQorCitpbnQgY21kX3B1c2goaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGZsYWdzID0gMDsKKwlpbnQgYWxsID0gMDsKKwlpbnQgbWlycm9yID0gMDsKKwlpbnQgZHJ5X3J1biA9IDA7CisJaW50IGZvcmNlID0gMDsKKwlpbnQgdGFncyA9IDA7CisJY29uc3QgY2hhciAqcmVwbyA9IE5VTEw7CS8qIGRlZmF1bHQgcmVwb3NpdG9yeSAqLworCisJc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisJCU9QVF9fVkVSQk9TRSgmdmVyYm9zZSksCisJCU9QVF9TVFJJTkcoIDAgLCAicmVwbyIsICZyZXBvLCAicmVwb3NpdG9yeSIsICJyZXBvc2l0b3J5IiksCisJCU9QVF9CT09MRUFOKCAwICwgImFsbCIsICZhbGwsICJwdXNoIGFsbCByZWZzIiksCisJCU9QVF9CT09MRUFOKCAwICwgIm1pcnJvciIsICZtaXJyb3IsICJtaXJyb3IgYWxsIHJlZnMiKSwKKwkJT1BUX0JPT0xFQU4oIDAgLCAidGFncyIsICZ0YWdzLCAicHVzaCB0YWdzIiksCisJCU9QVF9CT09MRUFOKCAwICwgImRyeS1ydW4iLCAmZHJ5X3J1biwgImRyeSBydW4iKSwKKwkJT1BUX0JPT0xFQU4oJ2YnLCAiZm9yY2UiLCAmZm9yY2UsICJmb3JjZSB1cGRhdGVzIiksCisJCU9QVF9CT09MRUFOKCAwICwgInRoaW4iLCAmdGhpbiwgInVzZSB0aGluIHBhY2siKSwKKwkJT1BUX1NUUklORyggMCAsICJyZWNlaXZlLXBhY2siLCAmcmVjZWl2ZXBhY2ssICJyZWNlaXZlLXBhY2siLCAicmVjZWl2ZSBwYWNrIHByb2dyYW0iKSwKKwkJT1BUX1NUUklORyggMCAsICJleGVjIiwgJnJlY2VpdmVwYWNrLCAicmVjZWl2ZS1wYWNrIiwgInJlY2VpdmUgcGFjayBwcm9ncmFtIiksCisJCU9QVF9FTkQoKQorCX07CisKKwlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBvcHRpb25zLCBwdXNoX3VzYWdlLCAwKTsKKworCWlmIChmb3JjZSkKKwkJZmxhZ3MgfD0gVFJBTlNQT1JUX1BVU0hfRk9SQ0U7CisJaWYgKGRyeV9ydW4pCisJCWZsYWdzIHw9IFRSQU5TUE9SVF9QVVNIX0RSWV9SVU47CisJaWYgKHZlcmJvc2UpCisJCWZsYWdzIHw9IFRSQU5TUE9SVF9QVVNIX1ZFUkJPU0U7CisJaWYgKHRhZ3MpCisJCWFkZF9yZWZzcGVjKCJyZWZzL3RhZ3MvKiIpOworCWlmIChhbGwpCisJCWZsYWdzIHw9IFRSQU5TUE9SVF9QVVNIX0FMTDsKKwlpZiAobWlycm9yKQorCQlmbGFncyB8PSAoVFJBTlNQT1JUX1BVU0hfTUlSUk9SfFRSQU5TUE9SVF9QVVNIX0ZPUkNFKTsKKworCWlmIChhcmdjID4gMCkgeworCQlyZXBvID0gYXJndlswXTsKKwkJc2V0X3JlZnNwZWNzKGFyZ3YgKyAxLCBhcmdjIC0gMSk7CisJfQorCWlmICgoZmxhZ3MgJiAoVFJBTlNQT1JUX1BVU0hfQUxMfFRSQU5TUE9SVF9QVVNIX01JUlJPUikpICYmIHJlZnNwZWMpCisJCXVzYWdlX3dpdGhfb3B0aW9ucyhwdXNoX3VzYWdlLCBvcHRpb25zKTsKKworCWlmICgoZmxhZ3MgJiAoVFJBTlNQT1JUX1BVU0hfQUxMfFRSQU5TUE9SVF9QVVNIX01JUlJPUikpID09CisJCQkJKFRSQU5TUE9SVF9QVVNIX0FMTHxUUkFOU1BPUlRfUFVTSF9NSVJST1IpKSB7CisJCWVycm9yKCItLWFsbCBhbmQgLS1taXJyb3IgYXJlIGluY29tcGF0aWJsZSIpOworCQl1c2FnZV93aXRoX29wdGlvbnMocHVzaF91c2FnZSwgb3B0aW9ucyk7CisJfQorCisJcmV0dXJuIGRvX3B1c2gocmVwbywgZmxhZ3MpOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1yZWFkLXRyZWUuYyBiL2J1aWx0aW4tcmVhZC10cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTljZmQyYgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tcmVhZC10cmVlLmMKQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKi8KKworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorI2luY2x1ZGUgImNhY2hlLXRyZWUuaCIKKyNpbmNsdWRlICJ1bnBhY2stdHJlZXMuaCIKKyNpbmNsdWRlICJkaXIuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKK3N0YXRpYyBpbnQgbnJfdHJlZXM7CitzdGF0aWMgc3RydWN0IHRyZWUgKnRyZWVzW01BWF9VTlBBQ0tfVFJFRVNdOworCitzdGF0aWMgaW50IGxpc3RfdHJlZSh1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCB0cmVlICp0cmVlOworCisJaWYgKG5yX3RyZWVzID49IE1BWF9VTlBBQ0tfVFJFRVMpCisJCWRpZSgiSSBjYW5ub3QgcmVhZCBtb3JlIHRoYW4gJWQgdHJlZXMiLCBNQVhfVU5QQUNLX1RSRUVTKTsKKwl0cmVlID0gcGFyc2VfdHJlZV9pbmRpcmVjdChzaGExKTsKKwlpZiAoIXRyZWUpCisJCXJldHVybiAtMTsKKwl0cmVlc1tucl90cmVlcysrXSA9IHRyZWU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9jYWNoZV91bm1lcmdlZCh2b2lkKQoreworCWludCBpOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqKmRzdDsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmxhc3QgPSBOVUxMOworCisJcmVhZF9jYWNoZSgpOworCWRzdCA9IGFjdGl2ZV9jYWNoZTsKKwlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yOyBpKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtpXTsKKwkJaWYgKGNlX3N0YWdlKGNlKSkgeworCQkJcmVtb3ZlX2luZGV4X2VudHJ5KGNlKTsKKwkJCWlmIChsYXN0ICYmICFzdHJjbXAoY2UtPm5hbWUsIGxhc3QtPm5hbWUpKQorCQkJCWNvbnRpbnVlOworCQkJY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoYWN0aXZlX2NhY2hlX3RyZWUsIGNlLT5uYW1lKTsKKwkJCWxhc3QgPSBjZTsKKwkJCWNvbnRpbnVlOworCQl9CisJCSpkc3QrKyA9IGNlOworCX0KKwlhY3RpdmVfbnIgPSBkc3QgLSBhY3RpdmVfY2FjaGU7CisJcmV0dXJuICEhbGFzdDsKK30KKworc3RhdGljIHZvaWQgcHJpbWVfY2FjaGVfdHJlZV9yZWMoc3RydWN0IGNhY2hlX3RyZWUgKml0LCBzdHJ1Y3QgdHJlZSAqdHJlZSkKK3sKKwlzdHJ1Y3QgdHJlZV9kZXNjIGRlc2M7CisJc3RydWN0IG5hbWVfZW50cnkgZW50cnk7CisJaW50IGNudDsKKworCWhhc2hjcHkoaXQtPnNoYTEsIHRyZWUtPm9iamVjdC5zaGExKTsKKwlpbml0X3RyZWVfZGVzYygmZGVzYywgdHJlZS0+YnVmZmVyLCB0cmVlLT5zaXplKTsKKwljbnQgPSAwOworCXdoaWxlICh0cmVlX2VudHJ5KCZkZXNjLCAmZW50cnkpKSB7CisJCWlmICghU19JU0RJUihlbnRyeS5tb2RlKSkKKwkJCWNudCsrOworCQllbHNlIHsKKwkJCXN0cnVjdCBjYWNoZV90cmVlX3N1YiAqc3ViOworCQkJc3RydWN0IHRyZWUgKnN1YnRyZWUgPSBsb29rdXBfdHJlZShlbnRyeS5zaGExKTsKKwkJCWlmICghc3VidHJlZS0+b2JqZWN0LnBhcnNlZCkKKwkJCQlwYXJzZV90cmVlKHN1YnRyZWUpOworCQkJc3ViID0gY2FjaGVfdHJlZV9zdWIoaXQsIGVudHJ5LnBhdGgpOworCQkJc3ViLT5jYWNoZV90cmVlID0gY2FjaGVfdHJlZSgpOworCQkJcHJpbWVfY2FjaGVfdHJlZV9yZWMoc3ViLT5jYWNoZV90cmVlLCBzdWJ0cmVlKTsKKwkJCWNudCArPSBzdWItPmNhY2hlX3RyZWUtPmVudHJ5X2NvdW50OworCQl9CisJfQorCWl0LT5lbnRyeV9jb3VudCA9IGNudDsKK30KKworc3RhdGljIHZvaWQgcHJpbWVfY2FjaGVfdHJlZSh2b2lkKQoreworCWlmICghbnJfdHJlZXMpCisJCXJldHVybjsKKwlhY3RpdmVfY2FjaGVfdHJlZSA9IGNhY2hlX3RyZWUoKTsKKwlwcmltZV9jYWNoZV90cmVlX3JlYyhhY3RpdmVfY2FjaGVfdHJlZSwgdHJlZXNbMF0pOworCit9CisKK3N0YXRpYyBjb25zdCBjaGFyIHJlYWRfdHJlZV91c2FnZVtdID0gImdpdC1yZWFkLXRyZWUgKDxzaGE+IHwgW1stbSBbLS10cml2aWFsXSBbLS1hZ2dyZXNzaXZlXSB8IC0tcmVzZXQgfCAtLXByZWZpeD08cHJlZml4Pl0gWy11IHwgLWldXSBbLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9PGdpdGlnbm9yZT5dIFstLWluZGV4LW91dHB1dD08ZmlsZT5dIDxzaGExPiBbPHNoYTI+IFs8c2hhMz5dXSkiOworCitzdGF0aWMgc3RydWN0IGxvY2tfZmlsZSBsb2NrX2ZpbGU7CisKK2ludCBjbWRfcmVhZF90cmVlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqdW51c2VkX3ByZWZpeCkKK3sKKwlpbnQgaSwgbmV3ZmQsIHN0YWdlID0gMDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXN0cnVjdCB0cmVlX2Rlc2MgdFtNQVhfVU5QQUNLX1RSRUVTXTsKKwlzdHJ1Y3QgdW5wYWNrX3RyZWVzX29wdGlvbnMgb3B0czsKKworCW1lbXNldCgmb3B0cywgMCwgc2l6ZW9mKG9wdHMpKTsKKwlvcHRzLmhlYWRfaWR4ID0gLTE7CisJb3B0cy5zcmNfaW5kZXggPSAmdGhlX2luZGV4OworCW9wdHMuZHN0X2luZGV4ID0gJnRoZV9pbmRleDsKKworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCW5ld2ZkID0gaG9sZF9sb2NrZWRfaW5kZXgoJmxvY2tfZmlsZSwgMSk7CisKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJLyogIi11IiBtZWFucyAidXBkYXRlIiwgbWVhbmluZyB0aGF0IGEgbWVyZ2Ugd2lsbCB1cGRhdGUKKwkJICogdGhlIHdvcmtpbmcgdHJlZS4KKwkJICovCisJCWlmICghc3RyY21wKGFyZywgIi11IikpIHsKKwkJCW9wdHMudXBkYXRlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXYiKSkgeworCQkJb3B0cy52ZXJib3NlX3VwZGF0ZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qICItaSIgbWVhbnMgImluZGV4IG9ubHkiLCBtZWFuaW5nIHRoYXQgYSBtZXJnZSB3aWxsCisJCSAqIG5vdCBldmVuIGxvb2sgYXQgdGhlIHdvcmtpbmcgdHJlZS4KKwkJICovCisJCWlmICghc3RyY21wKGFyZywgIi1pIikpIHsKKwkJCW9wdHMuaW5kZXhfb25seSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghcHJlZml4Y21wKGFyZywgIi0taW5kZXgtb3V0cHV0PSIpKSB7CisJCQlzZXRfYWx0ZXJuYXRlX2luZGV4X291dHB1dChhcmcgKyAxNSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qICItLXByZWZpeD08c3ViZGlyZWN0b3J5Pi8iIG1lYW5zIGtlZXAgdGhlIGN1cnJlbnQgaW5kZXgKKwkJICogIGVudHJpZXMgYW5kIHB1dCB0aGUgZW50cmllcyBmcm9tIHRoZSB0cmVlIHVuZGVyIHRoZQorCQkgKiBnaXZlbiBzdWJkaXJlY3RvcnkuCisJCSAqLworCQlpZiAoIXByZWZpeGNtcChhcmcsICItLXByZWZpeD0iKSkgeworCQkJaWYgKHN0YWdlIHx8IG9wdHMubWVyZ2UgfHwgb3B0cy5wcmVmaXgpCisJCQkJdXNhZ2UocmVhZF90cmVlX3VzYWdlKTsKKwkJCW9wdHMucHJlZml4ID0gYXJnICsgOTsKKwkJCW9wdHMubWVyZ2UgPSAxOworCQkJc3RhZ2UgPSAxOworCQkJaWYgKHJlYWRfY2FjaGVfdW5tZXJnZWQoKSkKKwkJCQlkaWUoInlvdSBuZWVkIHRvIHJlc29sdmUgeW91ciBjdXJyZW50IGluZGV4IGZpcnN0Iik7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFRoaXMgZGlmZmVycyBmcm9tICItbSIgaW4gdGhhdCB3ZSdsbCBzaWxlbnRseSBpZ25vcmUKKwkJICogdW5tZXJnZWQgZW50cmllcyBhbmQgb3ZlcndyaXRlIHdvcmtpbmcgdHJlZSBmaWxlcyB0aGF0CisJCSAqIGNvcnJlc3BvbmQgdG8gdGhlbS4KKwkJICovCisJCWlmICghc3RyY21wKGFyZywgIi0tcmVzZXQiKSkgeworCQkJaWYgKHN0YWdlIHx8IG9wdHMubWVyZ2UgfHwgb3B0cy5wcmVmaXgpCisJCQkJdXNhZ2UocmVhZF90cmVlX3VzYWdlKTsKKwkJCW9wdHMucmVzZXQgPSAxOworCQkJb3B0cy5tZXJnZSA9IDE7CisJCQlzdGFnZSA9IDE7CisJCQlyZWFkX2NhY2hlX3VubWVyZ2VkKCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghc3RyY21wKGFyZywgIi0tdHJpdmlhbCIpKSB7CisJCQlvcHRzLnRyaXZpYWxfbWVyZ2VzX29ubHkgPSAxOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIXN0cmNtcChhcmcsICItLWFnZ3Jlc3NpdmUiKSkgeworCQkJb3B0cy5hZ2dyZXNzaXZlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogIi1tIiBzdGFuZHMgZm9yICJtZXJnZSIsIG1lYW5pbmcgd2Ugc3RhcnQgaW4gc3RhZ2UgMSAqLworCQlpZiAoIXN0cmNtcChhcmcsICItbSIpKSB7CisJCQlpZiAoc3RhZ2UgfHwgb3B0cy5tZXJnZSB8fCBvcHRzLnByZWZpeCkKKwkJCQl1c2FnZShyZWFkX3RyZWVfdXNhZ2UpOworCQkJaWYgKHJlYWRfY2FjaGVfdW5tZXJnZWQoKSkKKwkJCQlkaWUoInlvdSBuZWVkIHRvIHJlc29sdmUgeW91ciBjdXJyZW50IGluZGV4IGZpcnN0Iik7CisJCQlzdGFnZSA9IDE7CisJCQlvcHRzLm1lcmdlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9IikpIHsKKwkJCXN0cnVjdCBkaXJfc3RydWN0ICpkaXI7CisKKwkJCWlmIChvcHRzLmRpcikKKwkJCQlkaWUoIm1vcmUgdGhhbiBvbmUgLS1leGNsdWRlLXBlci1kaXJlY3RvcnkgYXJlIGdpdmVuLiIpOworCisJCQlkaXIgPSB4Y2FsbG9jKDEsIHNpemVvZigqb3B0cy5kaXIpKTsKKwkJCWRpci0+c2hvd19pZ25vcmVkID0gMTsKKwkJCWRpci0+ZXhjbHVkZV9wZXJfZGlyID0gYXJnICsgMjQ7CisJCQlvcHRzLmRpciA9IGRpcjsKKwkJCS8qIFdlIGRvIG5vdCBuZWVkIHRvIG5vciB3YW50IHRvIGRvIHJlYWQtZGlyZWN0b3J5CisJCQkgKiBoZXJlOyB3ZSBhcmUgbWVyZWx5IGludGVyZXN0ZWQgaW4gcmV1c2luZyB0aGUKKwkJCSAqIHBlciBkaXJlY3RvcnkgaWdub3JlIHN0YWNrIG1lY2hhbmlzbS4KKwkJCSAqLworCQkJY29udGludWU7CisJCX0KKworCQkvKiB1c2luZyAtdSBhbmQgLWkgYXQgdGhlIHNhbWUgdGltZSBtYWtlcyBubyBzZW5zZSAqLworCQlpZiAoMSA8IG9wdHMuaW5kZXhfb25seSArIG9wdHMudXBkYXRlKQorCQkJdXNhZ2UocmVhZF90cmVlX3VzYWdlKTsKKworCQlpZiAoZ2V0X3NoYTEoYXJnLCBzaGExKSkKKwkJCWRpZSgiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWUgJXMiLCBhcmcpOworCQlpZiAobGlzdF90cmVlKHNoYTEpIDwgMCkKKwkJCWRpZSgiZmFpbGVkIHRvIHVucGFjayB0cmVlIG9iamVjdCAlcyIsIGFyZyk7CisJCXN0YWdlKys7CisJfQorCWlmICgob3B0cy51cGRhdGV8fG9wdHMuaW5kZXhfb25seSkgJiYgIW9wdHMubWVyZ2UpCisJCXVzYWdlKHJlYWRfdHJlZV91c2FnZSk7CisJaWYgKChvcHRzLmRpciAmJiAhb3B0cy51cGRhdGUpKQorCQlkaWUoIi0tZXhjbHVkZS1wZXItZGlyZWN0b3J5IGlzIG1lYW5pbmdsZXNzIHVubGVzcyAtdSIpOworCisJaWYgKG9wdHMubWVyZ2UpIHsKKwkJaWYgKHN0YWdlIDwgMikKKwkJCWRpZSgianVzdCBob3cgZG8geW91IGV4cGVjdCBtZSB0byBtZXJnZSAlZCB0cmVlcz8iLCBzdGFnZS0xKTsKKwkJc3dpdGNoIChzdGFnZSAtIDEpIHsKKwkJY2FzZSAxOgorCQkJb3B0cy5mbiA9IG9wdHMucHJlZml4ID8gYmluZF9tZXJnZSA6IG9uZXdheV9tZXJnZTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlvcHRzLmZuID0gdHdvd2F5X21lcmdlOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJZGVmYXVsdDoKKwkJCW9wdHMuZm4gPSB0aHJlZXdheV9tZXJnZTsKKwkJCWNhY2hlX3RyZWVfZnJlZSgmYWN0aXZlX2NhY2hlX3RyZWUpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc3RhZ2UgLSAxID49IDMpCisJCQlvcHRzLmhlYWRfaWR4ID0gc3RhZ2UgLSAyOworCQllbHNlCisJCQlvcHRzLmhlYWRfaWR4ID0gMTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfdHJlZXM7IGkrKykgeworCQlzdHJ1Y3QgdHJlZSAqdHJlZSA9IHRyZWVzW2ldOworCQlwYXJzZV90cmVlKHRyZWUpOworCQlpbml0X3RyZWVfZGVzYyh0K2ksIHRyZWUtPmJ1ZmZlciwgdHJlZS0+c2l6ZSk7CisJfQorCWlmICh1bnBhY2tfdHJlZXMobnJfdHJlZXMsIHQsICZvcHRzKSkKKwkJcmV0dXJuIDEyODsKKworCS8qCisJICogV2hlbiByZWFkaW5nIG9ubHkgb25lIHRyZWUgKGVpdGhlciB0aGUgbW9zdCBiYXNpYyBmb3JtLAorCSAqICItbSBlbnQiIG9yICItLXJlc2V0IGVudCIgZm9ybSksIHdlIGNhbiBvYnRhaW4gYSBmdWxseQorCSAqIHZhbGlkIGNhY2hlLXRyZWUgYmVjYXVzZSB0aGUgaW5kZXggbXVzdCBtYXRjaCBleGFjdGx5CisJICogd2hhdCBjYW1lIGZyb20gdGhlIHRyZWUuCisJICovCisJaWYgKG5yX3RyZWVzICYmICFvcHRzLnByZWZpeCAmJiAoIW9wdHMubWVyZ2UgfHwgKHN0YWdlID09IDIpKSkgeworCQljYWNoZV90cmVlX2ZyZWUoJmFjdGl2ZV9jYWNoZV90cmVlKTsKKwkJcHJpbWVfY2FjaGVfdHJlZSgpOworCX0KKworCWlmICh3cml0ZV9jYWNoZShuZXdmZCwgYWN0aXZlX2NhY2hlLCBhY3RpdmVfbnIpIHx8CisJICAgIGNvbW1pdF9sb2NrZWRfaW5kZXgoJmxvY2tfZmlsZSkpCisJCWRpZSgidW5hYmxlIHRvIHdyaXRlIG5ldyBpbmRleCBmaWxlIik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXJlZmxvZy5jIGIvYnVpbHRpbi1yZWZsb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODBlMjRlCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1yZWZsb2cuYwpAQCAtMCwwICsxLDUzMiBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJkaXIuaCIKKyNpbmNsdWRlICJ0cmVlLXdhbGsuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJyZWFjaGFibGUuaCIKKworLyoKKyAqIHJlZmxvZyBleHBpcmUKKyAqLworCitzdGF0aWMgY29uc3QgY2hhciByZWZsb2dfZXhwaXJlX3VzYWdlW10gPQorImdpdC1yZWZsb2cgKHNob3d8ZXhwaXJlKSBbLS12ZXJib3NlXSBbLS1kcnktcnVuXSBbLS1zdGFsZS1maXhdIFstLWV4cGlyZT08dGltZT5dIFstLWV4cGlyZS11bnJlYWNoYWJsZT08dGltZT5dIFstLWFsbF0gPHJlZnM+Li4uIjsKK3N0YXRpYyBjb25zdCBjaGFyIHJlZmxvZ19kZWxldGVfdXNhZ2VbXSA9CisiZ2l0LXJlZmxvZyBkZWxldGUgWy0tdmVyYm9zZV0gWy0tZHJ5LXJ1bl0gWy0tcmV3cml0ZV0gWy0tdXBkYXRlcmVmXSA8cmVmcz4uLi4iOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkZWZhdWx0X3JlZmxvZ19leHBpcmU7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBkZWZhdWx0X3JlZmxvZ19leHBpcmVfdW5yZWFjaGFibGU7CisKK3N0cnVjdCBjbWRfcmVmbG9nX2V4cGlyZV9jYiB7CisJc3RydWN0IHJldl9pbmZvIHJldnM7CisJaW50IGRyeV9ydW47CisJaW50IHN0YWxlZml4OworCWludCByZXdyaXRlOworCWludCB1cGRhdGVyZWY7CisJaW50IHZlcmJvc2U7CisJdW5zaWduZWQgbG9uZyBleHBpcmVfdG90YWw7CisJdW5zaWduZWQgbG9uZyBleHBpcmVfdW5yZWFjaGFibGU7CisJaW50IHJlY25vOworfTsKKworc3RydWN0IGV4cGlyZV9yZWZsb2dfY2IgeworCUZJTEUgKm5ld2xvZzsKKwljb25zdCBjaGFyICpyZWY7CisJc3RydWN0IGNvbW1pdCAqcmVmX2NvbW1pdDsKKwlzdHJ1Y3QgY21kX3JlZmxvZ19leHBpcmVfY2IgKmNtZDsKKwl1bnNpZ25lZCBjaGFyIGxhc3Rfa2VwdF9zaGExWzIwXTsKK307CisKK3N0cnVjdCBjb2xsZWN0ZWRfcmVmbG9nIHsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWNoYXIgcmVmbG9nW0ZMRVhfQVJSQVldOworfTsKK3N0cnVjdCBjb2xsZWN0X3JlZmxvZ19jYiB7CisJc3RydWN0IGNvbGxlY3RlZF9yZWZsb2cgKiplOworCWludCBhbGxvYzsKKwlpbnQgbnI7Cit9OworCisjZGVmaW5lIElOQ09NUExFVEUJKDF1PDwxMCkKKyNkZWZpbmUgU1RVRFlJTkcJKDF1PDwxMSkKKworc3RhdGljIGludCB0cmVlX2lzX2NvbXBsZXRlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHRyZWVfZGVzYyBkZXNjOworCXN0cnVjdCBuYW1lX2VudHJ5IGVudHJ5OworCWludCBjb21wbGV0ZTsKKwlzdHJ1Y3QgdHJlZSAqdHJlZTsKKworCXRyZWUgPSBsb29rdXBfdHJlZShzaGExKTsKKwlpZiAoIXRyZWUpCisJCXJldHVybiAwOworCWlmICh0cmVlLT5vYmplY3QuZmxhZ3MgJiBTRUVOKQorCQlyZXR1cm4gMTsKKwlpZiAodHJlZS0+b2JqZWN0LmZsYWdzICYgSU5DT01QTEVURSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXRyZWUtPmJ1ZmZlcikgeworCQllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwkJdm9pZCAqZGF0YSA9IHJlYWRfc2hhMV9maWxlKHNoYTEsICZ0eXBlLCAmc2l6ZSk7CisJCWlmICghZGF0YSkgeworCQkJdHJlZS0+b2JqZWN0LmZsYWdzIHw9IElOQ09NUExFVEU7CisJCQlyZXR1cm4gMDsKKwkJfQorCQl0cmVlLT5idWZmZXIgPSBkYXRhOworCQl0cmVlLT5zaXplID0gc2l6ZTsKKwl9CisJaW5pdF90cmVlX2Rlc2MoJmRlc2MsIHRyZWUtPmJ1ZmZlciwgdHJlZS0+c2l6ZSk7CisJY29tcGxldGUgPSAxOworCXdoaWxlICh0cmVlX2VudHJ5KCZkZXNjLCAmZW50cnkpKSB7CisJCWlmICghaGFzX3NoYTFfZmlsZShlbnRyeS5zaGExKSB8fAorCQkgICAgKFNfSVNESVIoZW50cnkubW9kZSkgJiYgIXRyZWVfaXNfY29tcGxldGUoZW50cnkuc2hhMSkpKSB7CisJCQl0cmVlLT5vYmplY3QuZmxhZ3MgfD0gSU5DT01QTEVURTsKKwkJCWNvbXBsZXRlID0gMDsKKwkJfQorCX0KKwlmcmVlKHRyZWUtPmJ1ZmZlcik7CisJdHJlZS0+YnVmZmVyID0gTlVMTDsKKworCWlmIChjb21wbGV0ZSkKKwkJdHJlZS0+b2JqZWN0LmZsYWdzIHw9IFNFRU47CisJcmV0dXJuIGNvbXBsZXRlOworfQorCitzdGF0aWMgaW50IGNvbW1pdF9pc19jb21wbGV0ZShzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJc3RydWN0IG9iamVjdF9hcnJheSBzdHVkeTsKKwlzdHJ1Y3Qgb2JqZWN0X2FycmF5IGZvdW5kOworCWludCBpc19pbmNvbXBsZXRlID0gMDsKKwlpbnQgaTsKKworCS8qIGVhcmx5IHJldHVybiAqLworCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIFNFRU4pCisJCXJldHVybiAxOworCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIElOQ09NUExFVEUpCisJCXJldHVybiAwOworCS8qCisJICogRmluZCBhbGwgY29tbWl0cyB0aGF0IGFyZSByZWFjaGFibGUgYW5kIGFyZSBub3QgbWFya2VkIGFzCisJICogU0VFTi4gIFRoZW4gbWFrZSBzdXJlIHRoZSB0cmVlcyBhbmQgYmxvYnMgY29udGFpbmVkIGFyZQorCSAqIGNvbXBsZXRlLiAgQWZ0ZXIgdGhhdCwgbWFyayB0aGVzZSBjb21taXRzIGFsc28gYXMgU0VFTi4KKwkgKiBJZiBzb21lIG9mIHRoZSBvYmplY3RzIHRoYXQgYXJlIG5lZWRlZCB0byBjb21wbGV0ZSB0aGlzCisJICogY29tbWl0IGFyZSBtaXNzaW5nLCBtYXJrIHRoaXMgY29tbWl0IGFzIElOQ09NUExFVEUuCisJICovCisJbWVtc2V0KCZzdHVkeSwgMCwgc2l6ZW9mKHN0dWR5KSk7CisJbWVtc2V0KCZmb3VuZCwgMCwgc2l6ZW9mKGZvdW5kKSk7CisJYWRkX29iamVjdF9hcnJheSgmY29tbWl0LT5vYmplY3QsIE5VTEwsICZzdHVkeSk7CisJYWRkX29iamVjdF9hcnJheSgmY29tbWl0LT5vYmplY3QsIE5VTEwsICZmb3VuZCk7CisJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gU1RVRFlJTkc7CisJd2hpbGUgKHN0dWR5Lm5yKSB7CisJCXN0cnVjdCBjb21taXQgKmM7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50OworCisJCWMgPSAoc3RydWN0IGNvbW1pdCAqKXN0dWR5Lm9iamVjdHNbLS1zdHVkeS5ucl0uaXRlbTsKKwkJaWYgKCFjLT5vYmplY3QucGFyc2VkICYmICFwYXJzZV9vYmplY3QoYy0+b2JqZWN0LnNoYTEpKQorCQkJYy0+b2JqZWN0LmZsYWdzIHw9IElOQ09NUExFVEU7CisKKwkJaWYgKGMtPm9iamVjdC5mbGFncyAmIElOQ09NUExFVEUpIHsKKwkJCWlzX2luY29tcGxldGUgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJZWxzZSBpZiAoYy0+b2JqZWN0LmZsYWdzICYgU0VFTikKKwkJCWNvbnRpbnVlOworCQlmb3IgKHBhcmVudCA9IGMtPnBhcmVudHM7IHBhcmVudDsgcGFyZW50ID0gcGFyZW50LT5uZXh0KSB7CisJCQlzdHJ1Y3QgY29tbWl0ICpwID0gcGFyZW50LT5pdGVtOworCQkJaWYgKHAtPm9iamVjdC5mbGFncyAmIFNUVURZSU5HKQorCQkJCWNvbnRpbnVlOworCQkJcC0+b2JqZWN0LmZsYWdzIHw9IFNUVURZSU5HOworCQkJYWRkX29iamVjdF9hcnJheSgmcC0+b2JqZWN0LCBOVUxMLCAmc3R1ZHkpOworCQkJYWRkX29iamVjdF9hcnJheSgmcC0+b2JqZWN0LCBOVUxMLCAmZm91bmQpOworCQl9CisJfQorCWlmICghaXNfaW5jb21wbGV0ZSkgeworCQkvKgorCQkgKiBtYWtlIHN1cmUgYWxsIGNvbW1pdHMgaW4gImZvdW5kIiBhcnJheSBoYXZlIGFsbCB0aGUKKwkJICogbmVjZXNzYXJ5IG9iamVjdHMuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgZm91bmQubnI7IGkrKykgeworCQkJc3RydWN0IGNvbW1pdCAqYyA9CisJCQkJKHN0cnVjdCBjb21taXQgKilmb3VuZC5vYmplY3RzW2ldLml0ZW07CisJCQlpZiAoIXRyZWVfaXNfY29tcGxldGUoYy0+dHJlZS0+b2JqZWN0LnNoYTEpKSB7CisJCQkJaXNfaW5jb21wbGV0ZSA9IDE7CisJCQkJYy0+b2JqZWN0LmZsYWdzIHw9IElOQ09NUExFVEU7CisJCQl9CisJCX0KKwkJaWYgKCFpc19pbmNvbXBsZXRlKSB7CisJCQkvKiBtYXJrIGFsbCBmb3VuZCBjb21taXRzIGFzIGNvbXBsZXRlLCBpb3cgU0VFTiAqLworCQkJZm9yIChpID0gMDsgaSA8IGZvdW5kLm5yOyBpKyspCisJCQkJZm91bmQub2JqZWN0c1tpXS5pdGVtLT5mbGFncyB8PSBTRUVOOworCQl9CisJfQorCS8qIGNsZWFyIGZsYWdzIGZyb20gdGhlIG9iamVjdHMgd2UgdHJhdmVyc2VkICovCisJZm9yIChpID0gMDsgaSA8IGZvdW5kLm5yOyBpKyspCisJCWZvdW5kLm9iamVjdHNbaV0uaXRlbS0+ZmxhZ3MgJj0gflNUVURZSU5HOworCWlmIChpc19pbmNvbXBsZXRlKQorCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBJTkNPTVBMRVRFOworCWVsc2UgeworCQkvKgorCQkgKiBJZiB3ZSBjb21lIGhlcmUsIHdlIGhhdmUgKDEpIHRyYXZlcnNlZCB0aGUgYW5jZXN0cnkgY2hhaW4KKwkJICogZnJvbSB0aGUgImNvbW1pdCIgdW50aWwgd2UgcmVhY2ggU0VFTiBjb21taXRzICh3aGljaCBhcmUKKwkJICoga25vd24gdG8gYmUgY29tcGxldGUpLCBhbmQgKDIpIG1hZGUgc3VyZSB0aGF0IHRoZSBjb21taXRzCisJCSAqIGVuY291bnRlcmVkIGR1cmluZyB0aGUgYWJvdmUgdHJhdmVyc2FsIHJlZmVyIHRvIHRyZWVzIHRoYXQKKwkJICogYXJlIGNvbXBsZXRlLiAgV2hpY2ggbWVhbnMgdGhhdCB3ZSBrbm93ICphbGwqIHRoZSBjb21taXRzCisJCSAqIHdlIGhhdmUgc2VlbiBkdXJpbmcgdGhpcyBwcm9jZXNzIGFyZSBjb21wbGV0ZS4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBmb3VuZC5ucjsgaSsrKQorCQkJZm91bmQub2JqZWN0c1tpXS5pdGVtLT5mbGFncyB8PSBTRUVOOworCX0KKwkvKiBmcmVlIG9iamVjdCBhcnJheXMgKi8KKwlmcmVlKHN0dWR5Lm9iamVjdHMpOworCWZyZWUoZm91bmQub2JqZWN0cyk7CisJcmV0dXJuICFpc19pbmNvbXBsZXRlOworfQorCitzdGF0aWMgaW50IGtlZXBfZW50cnkoc3RydWN0IGNvbW1pdCAqKml0LCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKworCWlmIChpc19udWxsX3NoYTEoc2hhMSkpCisJCXJldHVybiAxOworCWNvbW1pdCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlX2dlbnRseShzaGExLCAxKTsKKwlpZiAoIWNvbW1pdCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSBldmVyeXRoaW5nIGluIHRoaXMgY29tbWl0IGV4aXN0cy4KKwkgKgorCSAqIFdlIGhhdmUgd2Fsa2VkIGFsbCB0aGUgb2JqZWN0cyByZWFjaGFibGUgZnJvbSB0aGUgcmVmcworCSAqIGFuZCBjYWNoZSBlYXJsaWVyLiAgVGhlIGNvbW1pdHMgcmVhY2hhYmxlIGJ5IHRoaXMgY29tbWl0CisJICogbXVzdCBtZWV0IFNFRU4gY29tbWl0cyAtLSBhbmQgdGhlbiB3ZSBzaG91bGQgbWFyayB0aGVtIGFzCisJICogU0VFTiBhcyB3ZWxsLgorCSAqLworCWlmICghY29tbWl0X2lzX2NvbXBsZXRlKGNvbW1pdCkpCisJCXJldHVybiAwOworCSppdCA9IGNvbW1pdDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBleHBpcmVfcmVmbG9nX2VudCh1bnNpZ25lZCBjaGFyICpvc2hhMSwgdW5zaWduZWQgY2hhciAqbnNoYTEsCisJCWNvbnN0IGNoYXIgKmVtYWlsLCB1bnNpZ25lZCBsb25nIHRpbWVzdGFtcCwgaW50IHR6LAorCQljb25zdCBjaGFyICptZXNzYWdlLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCBleHBpcmVfcmVmbG9nX2NiICpjYiA9IGNiX2RhdGE7CisJc3RydWN0IGNvbW1pdCAqb2xkLCAqbmV3OworCisJaWYgKHRpbWVzdGFtcCA8IGNiLT5jbWQtPmV4cGlyZV90b3RhbCkKKwkJZ290byBwcnVuZTsKKworCWlmIChjYi0+Y21kLT5yZXdyaXRlKQorCQlvc2hhMSA9IGNiLT5sYXN0X2tlcHRfc2hhMTsKKworCW9sZCA9IG5ldyA9IE5VTEw7CisJaWYgKGNiLT5jbWQtPnN0YWxlZml4ICYmCisJICAgICgha2VlcF9lbnRyeSgmb2xkLCBvc2hhMSkgfHwgIWtlZXBfZW50cnkoJm5ldywgbnNoYTEpKSkKKwkJZ290byBwcnVuZTsKKworCWlmICh0aW1lc3RhbXAgPCBjYi0+Y21kLT5leHBpcmVfdW5yZWFjaGFibGUpIHsKKwkJaWYgKCFjYi0+cmVmX2NvbW1pdCkKKwkJCWdvdG8gcHJ1bmU7CisJCWlmICghb2xkICYmICFpc19udWxsX3NoYTEob3NoYTEpKQorCQkJb2xkID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2VfZ2VudGx5KG9zaGExLCAxKTsKKwkJaWYgKCFuZXcgJiYgIWlzX251bGxfc2hhMShuc2hhMSkpCisJCQluZXcgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZV9nZW50bHkobnNoYTEsIDEpOworCQlpZiAoKG9sZCAmJiAhaW5fbWVyZ2VfYmFzZXMob2xkLCAmY2ItPnJlZl9jb21taXQsIDEpKSB8fAorCQkgICAgKG5ldyAmJiAhaW5fbWVyZ2VfYmFzZXMobmV3LCAmY2ItPnJlZl9jb21taXQsIDEpKSkKKwkJCWdvdG8gcHJ1bmU7CisJfQorCisJaWYgKGNiLT5jbWQtPnJlY25vICYmIC0tKGNiLT5jbWQtPnJlY25vKSA9PSAwKQorCQlnb3RvIHBydW5lOworCisJaWYgKGNiLT5uZXdsb2cpIHsKKwkJY2hhciBzaWduID0gKHR6IDwgMCkgPyAnLScgOiAnKyc7CisJCWludCB6b25lID0gKHR6IDwgMCkgPyAoLXR6KSA6IHR6OworCQlmcHJpbnRmKGNiLT5uZXdsb2csICIlcyAlcyAlcyAlbHUgJWMlMDRkXHQlcyIsCisJCQlzaGExX3RvX2hleChvc2hhMSksIHNoYTFfdG9faGV4KG5zaGExKSwKKwkJCWVtYWlsLCB0aW1lc3RhbXAsIHNpZ24sIHpvbmUsCisJCQltZXNzYWdlKTsKKwkJaGFzaGNweShjYi0+bGFzdF9rZXB0X3NoYTEsIG5zaGExKTsKKwl9CisJaWYgKGNiLT5jbWQtPnZlcmJvc2UpCisJCXByaW50Zigia2VlcCAlcyIsIG1lc3NhZ2UpOworCXJldHVybiAwOworIHBydW5lOgorCWlmICghY2ItPm5ld2xvZyB8fCBjYi0+Y21kLT52ZXJib3NlKQorCQlwcmludGYoIiVzcHJ1bmUgJXMiLCBjYi0+bmV3bG9nID8gIiIgOiAid291bGQgIiwgbWVzc2FnZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXhwaXJlX3JlZmxvZyhjb25zdCBjaGFyICpyZWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCB1bnVzZWQsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IGNtZF9yZWZsb2dfZXhwaXJlX2NiICpjbWQgPSBjYl9kYXRhOworCXN0cnVjdCBleHBpcmVfcmVmbG9nX2NiIGNiOworCXN0cnVjdCByZWZfbG9jayAqbG9jazsKKwljaGFyICpsb2dfZmlsZSwgKm5ld2xvZ19wYXRoID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKworCW1lbXNldCgmY2IsIDAsIHNpemVvZihjYikpOworCS8qIHdlIHRha2UgdGhlIGxvY2sgZm9yIHRoZSByZWYgaXRzZWxmIHRvIHByZXZlbnQgaXQgZnJvbQorCSAqIGdldHRpbmcgdXBkYXRlZC4KKwkgKi8KKwlsb2NrID0gbG9ja19hbnlfcmVmX2Zvcl91cGRhdGUocmVmLCBzaGExLCAwKTsKKwlpZiAoIWxvY2spCisJCXJldHVybiBlcnJvcigiY2Fubm90IGxvY2sgcmVmICclcyciLCByZWYpOworCWxvZ19maWxlID0geHN0cmR1cChnaXRfcGF0aCgibG9ncy8lcyIsIHJlZikpOworCWlmICghZmlsZV9leGlzdHMobG9nX2ZpbGUpKQorCQlnb3RvIGZpbmlzaDsKKwlpZiAoIWNtZC0+ZHJ5X3J1bikgeworCQluZXdsb2dfcGF0aCA9IHhzdHJkdXAoZ2l0X3BhdGgoImxvZ3MvJXMubG9jayIsIHJlZikpOworCQljYi5uZXdsb2cgPSBmb3BlbihuZXdsb2dfcGF0aCwgInciKTsKKwl9CisKKwljYi5yZWZfY29tbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2VfZ2VudGx5KHNoYTEsIDEpOworCWNiLnJlZiA9IHJlZjsKKwljYi5jbWQgPSBjbWQ7CisJZm9yX2VhY2hfcmVmbG9nX2VudChyZWYsIGV4cGlyZV9yZWZsb2dfZW50LCAmY2IpOworIGZpbmlzaDoKKwlpZiAoY2IubmV3bG9nKSB7CisJCWlmIChmY2xvc2UoY2IubmV3bG9nKSkgeworCQkJc3RhdHVzIHw9IGVycm9yKCIlczogJXMiLCBzdHJlcnJvcihlcnJubyksCisJCQkJCW5ld2xvZ19wYXRoKTsKKwkJCXVubGluayhuZXdsb2dfcGF0aCk7CisJCX0gZWxzZSBpZiAoY21kLT51cGRhdGVyZWYgJiYKKwkJCSh3cml0ZV9pbl9mdWxsKGxvY2stPmxvY2tfZmQsCisJCQkJc2hhMV90b19oZXgoY2IubGFzdF9rZXB0X3NoYTEpLCA0MCkgIT0gNDAgfHwKKwkJCSB3cml0ZV9pbl9mdWxsKGxvY2stPmxvY2tfZmQsICJcbiIsIDEpICE9IDEgfHwKKwkJCSBjbG9zZV9yZWYobG9jaykgPCAwKSkgeworCQkJc3RhdHVzIHw9IGVycm9yKCJDb3VsZG4ndCB3cml0ZSAlcyIsCisJCQkJbG9jay0+bGstPmZpbGVuYW1lKTsKKwkJCXVubGluayhuZXdsb2dfcGF0aCk7CisJCX0gZWxzZSBpZiAocmVuYW1lKG5ld2xvZ19wYXRoLCBsb2dfZmlsZSkpIHsKKwkJCXN0YXR1cyB8PSBlcnJvcigiY2Fubm90IHJlbmFtZSAlcyB0byAlcyIsCisJCQkJCW5ld2xvZ19wYXRoLCBsb2dfZmlsZSk7CisJCQl1bmxpbmsobmV3bG9nX3BhdGgpOworCQl9IGVsc2UgaWYgKGNtZC0+dXBkYXRlcmVmICYmIGNvbW1pdF9yZWYobG9jaykpIHsKKwkJCXN0YXR1cyB8PSBlcnJvcigiQ291bGRuJ3Qgc2V0ICVzIiwgbG9jay0+cmVmX25hbWUpOworCQl9CisJfQorCWZyZWUobmV3bG9nX3BhdGgpOworCWZyZWUobG9nX2ZpbGUpOworCXVubG9ja19yZWYobG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBjb2xsZWN0X3JlZmxvZyhjb25zdCBjaGFyICpyZWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCB1bnVzZWQsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IGNvbGxlY3RlZF9yZWZsb2cgKmU7CisJc3RydWN0IGNvbGxlY3RfcmVmbG9nX2NiICpjYiA9IGNiX2RhdGE7CisJc2l6ZV90IG5hbWVsZW4gPSBzdHJsZW4ocmVmKTsKKworCWUgPSB4bWFsbG9jKHNpemVvZigqZSkgKyBuYW1lbGVuICsgMSk7CisJaGFzaGNweShlLT5zaGExLCBzaGExKTsKKwltZW1jcHkoZS0+cmVmbG9nLCByZWYsIG5hbWVsZW4gKyAxKTsKKwlBTExPQ19HUk9XKGNiLT5lLCBjYi0+bnIgKyAxLCBjYi0+YWxsb2MpOworCWNiLT5lW2NiLT5ucisrXSA9IGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVmbG9nX2V4cGlyZV9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXN0cmNtcCh2YXIsICJnYy5yZWZsb2dleHBpcmUiKSkgeworCQlpZiAoIXZhbHVlKQorCQkJY29uZmlnX2Vycm9yX25vbmJvb2wodmFyKTsKKwkJZGVmYXVsdF9yZWZsb2dfZXhwaXJlID0gYXBwcm94aWRhdGUodmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAodmFyLCAiZ2MucmVmbG9nZXhwaXJldW5yZWFjaGFibGUiKSkgeworCQlpZiAoIXZhbHVlKQorCQkJY29uZmlnX2Vycm9yX25vbmJvb2wodmFyKTsKKwkJZGVmYXVsdF9yZWZsb2dfZXhwaXJlX3VucmVhY2hhYmxlID0gYXBwcm94aWRhdGUodmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGdpdF9kZWZhdWx0X2NvbmZpZyh2YXIsIHZhbHVlKTsKK30KKworc3RhdGljIGludCBjbWRfcmVmbG9nX2V4cGlyZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgY21kX3JlZmxvZ19leHBpcmVfY2IgY2I7CisJdW5zaWduZWQgbG9uZyBub3cgPSB0aW1lKE5VTEwpOworCWludCBpLCBzdGF0dXMsIGRvX2FsbDsKKworCWdpdF9jb25maWcocmVmbG9nX2V4cGlyZV9jb25maWcpOworCisJc2F2ZV9jb21taXRfYnVmZmVyID0gMDsKKwlkb19hbGwgPSBzdGF0dXMgPSAwOworCW1lbXNldCgmY2IsIDAsIHNpemVvZihjYikpOworCisJaWYgKCFkZWZhdWx0X3JlZmxvZ19leHBpcmVfdW5yZWFjaGFibGUpCisJCWRlZmF1bHRfcmVmbG9nX2V4cGlyZV91bnJlYWNoYWJsZSA9IG5vdyAtIDMwICogMjQgKiAzNjAwOworCWlmICghZGVmYXVsdF9yZWZsb2dfZXhwaXJlKQorCQlkZWZhdWx0X3JlZmxvZ19leHBpcmUgPSBub3cgLSA5MCAqIDI0ICogMzYwMDsKKwljYi5leHBpcmVfdG90YWwgPSBkZWZhdWx0X3JlZmxvZ19leHBpcmU7CisJY2IuZXhwaXJlX3VucmVhY2hhYmxlID0gZGVmYXVsdF9yZWZsb2dfZXhwaXJlX3VucmVhY2hhYmxlOworCisJLyoKKwkgKiBXZSBjYW4gdHJ1c3QgdGhlIGNvbW1pdHMgYW5kIG9iamVjdHMgcmVhY2hhYmxlIGZyb20gcmVmcworCSAqIGV2ZW4gaW4gb2xkZXIgcmVwb3NpdG9yeS4gIFdlIGNhbm5vdCB0cnVzdCB3aGF0J3MgcmVhY2hhYmxlCisJICogZnJvbSByZWZsb2cgaWYgdGhlIHJlcG9zaXRvcnkgd2FzIHBydW5lZCB3aXRoIG9sZGVyIGdpdC4KKwkgKi8KKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1kcnktcnVuIikgfHwgIXN0cmNtcChhcmcsICItbiIpKQorCQkJY2IuZHJ5X3J1biA9IDE7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1leHBpcmU9IikpCisJCQljYi5leHBpcmVfdG90YWwgPSBhcHByb3hpZGF0ZShhcmcgKyA5KTsKKwkJZWxzZSBpZiAoIXByZWZpeGNtcChhcmcsICItLWV4cGlyZS11bnJlYWNoYWJsZT0iKSkKKwkJCWNiLmV4cGlyZV91bnJlYWNoYWJsZSA9IGFwcHJveGlkYXRlKGFyZyArIDIxKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXN0YWxlLWZpeCIpKQorCQkJY2Iuc3RhbGVmaXggPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tcmV3cml0ZSIpKQorCQkJY2IucmV3cml0ZSA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS11cGRhdGVyZWYiKSkKKwkJCWNiLnVwZGF0ZXJlZiA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1hbGwiKSkKKwkJCWRvX2FsbCA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS12ZXJib3NlIikpCisJCQljYi52ZXJib3NlID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLSIpKSB7CisJCQlpKys7CisJCQlicmVhazsKKwkJfQorCQllbHNlIGlmIChhcmdbMF0gPT0gJy0nKQorCQkJdXNhZ2UocmVmbG9nX2V4cGlyZV91c2FnZSk7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwlpZiAoY2Iuc3RhbGVmaXgpIHsKKwkJaW5pdF9yZXZpc2lvbnMoJmNiLnJldnMsIHByZWZpeCk7CisJCWlmIChjYi52ZXJib3NlKQorCQkJcHJpbnRmKCJNYXJraW5nIHJlYWNoYWJsZSBvYmplY3RzLi4uIik7CisJCW1hcmtfcmVhY2hhYmxlX29iamVjdHMoJmNiLnJldnMsIDApOworCQlpZiAoY2IudmVyYm9zZSkKKwkJCXB1dGNoYXIoJ1xuJyk7CisJfQorCisJaWYgKGRvX2FsbCkgeworCQlzdHJ1Y3QgY29sbGVjdF9yZWZsb2dfY2IgY29sbGVjdGVkOworCQlpbnQgaTsKKworCQltZW1zZXQoJmNvbGxlY3RlZCwgMCwgc2l6ZW9mKGNvbGxlY3RlZCkpOworCQlmb3JfZWFjaF9yZWZsb2coY29sbGVjdF9yZWZsb2csICZjb2xsZWN0ZWQpOworCQlmb3IgKGkgPSAwOyBpIDwgY29sbGVjdGVkLm5yOyBpKyspIHsKKwkJCXN0cnVjdCBjb2xsZWN0ZWRfcmVmbG9nICplID0gY29sbGVjdGVkLmVbaV07CisJCQlzdGF0dXMgfD0gZXhwaXJlX3JlZmxvZyhlLT5yZWZsb2csIGUtPnNoYTEsIDAsICZjYik7CisJCQlmcmVlKGUpOworCQl9CisJCWZyZWUoY29sbGVjdGVkLmUpOworCX0KKworCXdoaWxlIChpIDwgYXJnYykgeworCQljb25zdCBjaGFyICpyZWYgPSBhcmd2W2krK107CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCWlmICghcmVzb2x2ZV9yZWYocmVmLCBzaGExLCAxLCBOVUxMKSkgeworCQkJc3RhdHVzIHw9IGVycm9yKCIlcyBwb2ludHMgbm93aGVyZSEiLCByZWYpOworCQkJY29udGludWU7CisJCX0KKwkJc3RhdHVzIHw9IGV4cGlyZV9yZWZsb2cocmVmLCBzaGExLCAwLCAmY2IpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGNvdW50X3JlZmxvZ19lbnQodW5zaWduZWQgY2hhciAqb3NoYTEsIHVuc2lnbmVkIGNoYXIgKm5zaGExLAorCQljb25zdCBjaGFyICplbWFpbCwgdW5zaWduZWQgbG9uZyB0aW1lc3RhbXAsIGludCB0eiwKKwkJY29uc3QgY2hhciAqbWVzc2FnZSwgdm9pZCAqY2JfZGF0YSkKK3sKKwlzdHJ1Y3QgY21kX3JlZmxvZ19leHBpcmVfY2IgKmNiID0gY2JfZGF0YTsKKwlpZiAoIWNiLT5leHBpcmVfdG90YWwgfHwgdGltZXN0YW1wIDwgY2ItPmV4cGlyZV90b3RhbCkKKwkJY2ItPnJlY25vKys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY21kX3JlZmxvZ19kZWxldGUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IGNtZF9yZWZsb2dfZXhwaXJlX2NiIGNiOworCWludCBpLCBzdGF0dXMgPSAwOworCisJbWVtc2V0KCZjYiwgMCwgc2l6ZW9mKGNiKSk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCWlmICghc3RyY21wKGFyZywgIi0tZHJ5LXJ1biIpIHx8ICFzdHJjbXAoYXJnLCAiLW4iKSkKKwkJCWNiLmRyeV9ydW4gPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tcmV3cml0ZSIpKQorCQkJY2IucmV3cml0ZSA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS11cGRhdGVyZWYiKSkKKwkJCWNiLnVwZGF0ZXJlZiA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS12ZXJib3NlIikpCisJCQljYi52ZXJib3NlID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLSIpKSB7CisJCQlpKys7CisJCQlicmVhazsKKwkJfQorCQllbHNlIGlmIChhcmdbMF0gPT0gJy0nKQorCQkJdXNhZ2UocmVmbG9nX2RlbGV0ZV91c2FnZSk7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKworCWlmIChhcmdjIC0gaSA8IDEpCisJCXJldHVybiBlcnJvcigiTm90aGluZyB0byBkZWxldGU/Iik7CisKKwlmb3IgKCA7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqc3BlYyA9IHN0cnN0cihhcmd2W2ldLCAiQHsiKTsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJY2hhciAqZXAsICpyZWY7CisJCWludCByZWNubzsKKworCQlpZiAoIXNwZWMpIHsKKwkJCXN0YXR1cyB8PSBlcnJvcigiTm90IGEgcmVmbG9nOiAlcyIsIGFyZ3ZbaV0pOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIWR3aW1fcmVmKGFyZ3ZbaV0sIHNwZWMgLSBhcmd2W2ldLCBzaGExLCAmcmVmKSkgeworCQkJc3RhdHVzIHw9IGVycm9yKCIlcyBwb2ludHMgbm93aGVyZSEiLCBhcmd2W2ldKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmVjbm8gPSBzdHJ0b3VsKHNwZWMgKyAyLCAmZXAsIDEwKTsKKwkJaWYgKCplcCA9PSAnfScpIHsKKwkJCWNiLnJlY25vID0gLXJlY25vOworCQkJZm9yX2VhY2hfcmVmbG9nX2VudChyZWYsIGNvdW50X3JlZmxvZ19lbnQsICZjYik7CisJCX0gZWxzZSB7CisJCQljYi5leHBpcmVfdG90YWwgPSBhcHByb3hpZGF0ZShzcGVjICsgMik7CisJCQlmb3JfZWFjaF9yZWZsb2dfZW50KHJlZiwgY291bnRfcmVmbG9nX2VudCwgJmNiKTsKKwkJCWNiLmV4cGlyZV90b3RhbCA9IDA7CisJCX0KKworCQlzdGF0dXMgfD0gZXhwaXJlX3JlZmxvZyhyZWYsIHNoYTEsIDAsICZjYik7CisJCWZyZWUocmVmKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIG1haW4gInJlZmxvZyIKKyAqLworCitzdGF0aWMgY29uc3QgY2hhciByZWZsb2dfdXNhZ2VbXSA9CisiZ2l0LXJlZmxvZyAoZXhwaXJlIHwgLi4uKSI7CisKK2ludCBjbWRfcmVmbG9nKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCS8qIFdpdGggbm8gY29tbWFuZCwgd2UgZGVmYXVsdCB0byBzaG93aW5nIGl0LiAqLworCWlmIChhcmdjIDwgMiB8fCAqYXJndlsxXSA9PSAnLScpCisJCXJldHVybiBjbWRfbG9nX3JlZmxvZyhhcmdjLCBhcmd2LCBwcmVmaXgpOworCisJaWYgKCFzdHJjbXAoYXJndlsxXSwgInNob3ciKSkKKwkJcmV0dXJuIGNtZF9sb2dfcmVmbG9nKGFyZ2MgLSAxLCBhcmd2ICsgMSwgcHJlZml4KTsKKworCWlmICghc3RyY21wKGFyZ3ZbMV0sICJleHBpcmUiKSkKKwkJcmV0dXJuIGNtZF9yZWZsb2dfZXhwaXJlKGFyZ2MgLSAxLCBhcmd2ICsgMSwgcHJlZml4KTsKKworCWlmICghc3RyY21wKGFyZ3ZbMV0sICJkZWxldGUiKSkKKwkJcmV0dXJuIGNtZF9yZWZsb2dfZGVsZXRlKGFyZ2MgLSAxLCBhcmd2ICsgMSwgcHJlZml4KTsKKworCS8qIE5vdCBhIHJlY29nbml6ZWQgcmVmbG9nIGNvbW1hbmQuLiovCisJdXNhZ2UocmVmbG9nX3VzYWdlKTsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tcmVtb3RlLmMgYi9idWlsdGluLXJlbW90ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3N2YxMGEKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLXJlbW90ZS5jCkBAIC0wLDAgKzEsNjA5IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJwYXJzZS1vcHRpb25zLmgiCisjaW5jbHVkZSAidHJhbnNwb3J0LmgiCisjaW5jbHVkZSAicmVtb3RlLmgiCisjaW5jbHVkZSAicGF0aC1saXN0LmgiCisjaW5jbHVkZSAic3RyYnVmLmgiCisjaW5jbHVkZSAicnVuLWNvbW1hbmQuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYnVpbHRpbl9yZW1vdGVfdXNhZ2VbXSA9IHsKKwkiZ2l0IHJlbW90ZSIsCisJImdpdCByZW1vdGUgYWRkIDxuYW1lPiA8dXJsPiIsCisJImdpdCByZW1vdGUgcm0gPG5hbWU+IiwKKwkiZ2l0IHJlbW90ZSBzaG93IDxuYW1lPiIsCisJImdpdCByZW1vdGUgcHJ1bmUgPG5hbWU+IiwKKwkiZ2l0IHJlbW90ZSB1cGRhdGUgW2dyb3VwXSIsCisJTlVMTAorfTsKKworc3RhdGljIGludCB2ZXJib3NlOworCitzdGF0aWMgaW5saW5lIGludCBwb3N0Zml4Y21wKGNvbnN0IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqcG9zdGZpeCkKK3sKKwlpbnQgbGVuMSA9IHN0cmxlbihzdHJpbmcpLCBsZW4yID0gc3RybGVuKHBvc3RmaXgpOworCWlmIChsZW4xIDwgbGVuMikKKwkJcmV0dXJuIDE7CisJcmV0dXJuIHN0cmNtcChzdHJpbmcgKyBsZW4xIC0gbGVuMiwgcG9zdGZpeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqc2tpcF9wcmVmaXgoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXJldHVybiAhbmFtZSA/ICIiIDoKKwkJcHJlZml4Y21wKG5hbWUsIHByZWZpeCkgPyAgbmFtZSA6IG5hbWUgKyBzdHJsZW4ocHJlZml4KTsKK30KKworc3RhdGljIGludCBvcHRfcGFyc2VfdHJhY2soY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0LCBjb25zdCBjaGFyICphcmcsIGludCBub3QpCit7CisJc3RydWN0IHBhdGhfbGlzdCAqbGlzdCA9IG9wdC0+dmFsdWU7CisJaWYgKG5vdCkKKwkJcGF0aF9saXN0X2NsZWFyKGxpc3QsIDApOworCWVsc2UKKwkJcGF0aF9saXN0X2FwcGVuZChhcmcsIGxpc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZldGNoX3JlbW90ZShjb25zdCBjaGFyICpuYW1lKQoreworCWNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsgImZldGNoIiwgbmFtZSwgTlVMTCB9OworCXByaW50ZigiVXBkYXRpbmcgJXNcbiIsIG5hbWUpOworCWlmIChydW5fY29tbWFuZF92X29wdChhcmd2LCBSVU5fR0lUX0NNRCkpCisJCXJldHVybiBlcnJvcigiQ291bGQgbm90IGZldGNoICVzIiwgbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwlpbnQgZmV0Y2ggPSAwLCBtaXJyb3IgPSAwOworCXN0cnVjdCBwYXRoX2xpc3QgdHJhY2sgPSB7IE5VTEwsIDAsIDAgfTsKKwljb25zdCBjaGFyICptYXN0ZXIgPSBOVUxMOworCXN0cnVjdCByZW1vdGUgKnJlbW90ZTsKKwlzdHJ1Y3Qgc3RyYnVmIGJ1ZiwgYnVmMjsKKwljb25zdCBjaGFyICpuYW1lLCAqdXJsOworCWludCBpOworCisJc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisJCU9QVF9HUk9VUCgiYWRkIHNwZWNpZmljIG9wdGlvbnMiKSwKKwkJT1BUX0JPT0xFQU4oJ2YnLCAiZmV0Y2giLCAmZmV0Y2gsICJmZXRjaCB0aGUgcmVtb3RlIGJyYW5jaGVzIiksCisJCU9QVF9DQUxMQkFDSygndCcsICJ0cmFjayIsICZ0cmFjaywgImJyYW5jaCIsCisJCQkiYnJhbmNoKGVzKSB0byB0cmFjayIsIG9wdF9wYXJzZV90cmFjayksCisJCU9QVF9TVFJJTkcoJ20nLCAibWFzdGVyIiwgJm1hc3RlciwgImJyYW5jaCIsICJtYXN0ZXIgYnJhbmNoIiksCisJCU9QVF9CT09MRUFOKDAsICJtaXJyb3IiLCAmbWlycm9yLCAibm8gc2VwYXJhdGUgcmVtb3RlcyIpLAorCQlPUFRfRU5EKCkKKwl9OworCisJYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgb3B0aW9ucywgYnVpbHRpbl9yZW1vdGVfdXNhZ2UsIDApOworCisJaWYgKGFyZ2MgPCAyKQorCQl1c2FnZV93aXRoX29wdGlvbnMoYnVpbHRpbl9yZW1vdGVfdXNhZ2UsIG9wdGlvbnMpOworCisJbmFtZSA9IGFyZ3ZbMF07CisJdXJsID0gYXJndlsxXTsKKworCXJlbW90ZSA9IHJlbW90ZV9nZXQobmFtZSk7CisJaWYgKHJlbW90ZSAmJiAocmVtb3RlLT51cmxfbnIgPiAxIHx8IHN0cmNtcChuYW1lLCByZW1vdGUtPnVybFswXSkgfHwKKwkJCXJlbW90ZS0+ZmV0Y2hfcmVmc3BlY19ucikpCisJCWRpZSgicmVtb3RlICVzIGFscmVhZHkgZXhpc3RzLiIsIG5hbWUpOworCisJc3RyYnVmX2luaXQoJmJ1ZiwgMCk7CisJc3RyYnVmX2luaXQoJmJ1ZjIsIDApOworCisJc3RyYnVmX2FkZGYoJmJ1ZiwgInJlbW90ZS4lcy51cmwiLCBuYW1lKTsKKwlpZiAoZ2l0X2NvbmZpZ19zZXQoYnVmLmJ1ZiwgdXJsKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAodHJhY2subnIgPT0gMCkKKwkJcGF0aF9saXN0X2FwcGVuZCgiKiIsICZ0cmFjayk7CisJZm9yIChpID0gMDsgaSA8IHRyYWNrLm5yOyBpKyspIHsKKwkJc3RydWN0IHBhdGhfbGlzdF9pdGVtICppdGVtID0gdHJhY2suaXRlbXMgKyBpOworCisJCXN0cmJ1Zl9yZXNldCgmYnVmKTsKKwkJc3RyYnVmX2FkZGYoJmJ1ZiwgInJlbW90ZS4lcy5mZXRjaCIsIG5hbWUpOworCisJCXN0cmJ1Zl9yZXNldCgmYnVmMik7CisJCWlmIChtaXJyb3IpCisJCQlzdHJidWZfYWRkZigmYnVmMiwgInJlZnMvJXM6cmVmcy8lcyIsCisJCQkJCWl0ZW0tPnBhdGgsIGl0ZW0tPnBhdGgpOworCQllbHNlCisJCQlzdHJidWZfYWRkZigmYnVmMiwgInJlZnMvaGVhZHMvJXM6cmVmcy9yZW1vdGVzLyVzLyVzIiwKKwkJCQkJaXRlbS0+cGF0aCwgbmFtZSwgaXRlbS0+cGF0aCk7CisJCWlmIChnaXRfY29uZmlnX3NldF9tdWx0aXZhcihidWYuYnVmLCBidWYyLmJ1ZiwgIl4kIiwgMCkpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoZmV0Y2ggJiYgZmV0Y2hfcmVtb3RlKG5hbWUpKQorCQlyZXR1cm4gMTsKKworCWlmIChtYXN0ZXIpIHsKKwkJc3RyYnVmX3Jlc2V0KCZidWYpOworCQlzdHJidWZfYWRkZigmYnVmLCAicmVmcy9yZW1vdGVzLyVzL0hFQUQiLCBuYW1lKTsKKworCQlzdHJidWZfcmVzZXQoJmJ1ZjIpOworCQlzdHJidWZfYWRkZigmYnVmMiwgInJlZnMvcmVtb3Rlcy8lcy8lcyIsIG5hbWUsIG1hc3Rlcik7CisKKwkJaWYgKGNyZWF0ZV9zeW1yZWYoYnVmLmJ1ZiwgYnVmMi5idWYsICJyZW1vdGUgYWRkIikpCisJCQlyZXR1cm4gZXJyb3IoIkNvdWxkIG5vdCBzZXR1cCBtYXN0ZXIgJyVzJyIsIG1hc3Rlcik7CisJfQorCisJc3RyYnVmX3JlbGVhc2UoJmJ1Zik7CisJc3RyYnVmX3JlbGVhc2UoJmJ1ZjIpOworCXBhdGhfbGlzdF9jbGVhcigmdHJhY2ssIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBicmFuY2hfaW5mbyB7CisJY2hhciAqcmVtb3RlOworCXN0cnVjdCBwYXRoX2xpc3QgbWVyZ2U7Cit9OworCitzdGF0aWMgc3RydWN0IHBhdGhfbGlzdCBicmFuY2hfbGlzdDsKKworc3RhdGljIGludCBjb25maWdfcmVhZF9icmFuY2hlcyhjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICghcHJlZml4Y21wKGtleSwgImJyYW5jaC4iKSkgeworCQljaGFyICpuYW1lOworCQlzdHJ1Y3QgcGF0aF9saXN0X2l0ZW0gKml0ZW07CisJCXN0cnVjdCBicmFuY2hfaW5mbyAqaW5mbzsKKwkJZW51bSB7IFJFTU9URSwgTUVSR0UgfSB0eXBlOworCisJCWtleSArPSA3OworCQlpZiAoIXBvc3RmaXhjbXAoa2V5LCAiLnJlbW90ZSIpKSB7CisJCQluYW1lID0geHN0cm5kdXAoa2V5LCBzdHJsZW4oa2V5KSAtIDcpOworCQkJdHlwZSA9IFJFTU9URTsKKwkJfSBlbHNlIGlmICghcG9zdGZpeGNtcChrZXksICIubWVyZ2UiKSkgeworCQkJbmFtZSA9IHhzdHJuZHVwKGtleSwgc3RybGVuKGtleSkgLSA2KTsKKwkJCXR5cGUgPSBNRVJHRTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gMDsKKworCQlpdGVtID0gcGF0aF9saXN0X2luc2VydChuYW1lLCAmYnJhbmNoX2xpc3QpOworCisJCWlmICghaXRlbS0+dXRpbCkKKwkJCWl0ZW0tPnV0aWwgPSB4Y2FsbG9jKHNpemVvZihzdHJ1Y3QgYnJhbmNoX2luZm8pLCAxKTsKKwkJaW5mbyA9IGl0ZW0tPnV0aWw7CisJCWlmICh0eXBlID09IFJFTU9URSkgeworCQkJaWYgKGluZm8tPnJlbW90ZSkKKwkJCQl3YXJuaW5nKCJtb3JlIHRoYW4gb25lIGJyYW5jaC4lcyIsIGtleSk7CisJCQlpbmZvLT5yZW1vdGUgPSB4c3RyZHVwKHZhbHVlKTsKKwkJfSBlbHNlIHsKKwkJCWNoYXIgKnNwYWNlID0gc3RyY2hyKHZhbHVlLCAnICcpOworCQkJdmFsdWUgPSBza2lwX3ByZWZpeCh2YWx1ZSwgInJlZnMvaGVhZHMvIik7CisJCQl3aGlsZSAoc3BhY2UpIHsKKwkJCQljaGFyICptZXJnZTsKKwkJCQltZXJnZSA9IHhzdHJuZHVwKHZhbHVlLCBzcGFjZSAtIHZhbHVlKTsKKwkJCQlwYXRoX2xpc3RfYXBwZW5kKG1lcmdlLCAmaW5mby0+bWVyZ2UpOworCQkJCXZhbHVlID0gc2tpcF9wcmVmaXgoc3BhY2UgKyAxLCAicmVmcy9oZWFkcy8iKTsKKwkJCQlzcGFjZSA9IHN0cmNocih2YWx1ZSwgJyAnKTsKKwkJCX0KKwkJCXBhdGhfbGlzdF9hcHBlbmQoeHN0cmR1cCh2YWx1ZSksICZpbmZvLT5tZXJnZSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfYnJhbmNoZXModm9pZCkKK3sKKwlpZiAoYnJhbmNoX2xpc3QubnIpCisJCXJldHVybjsKKwlnaXRfY29uZmlnKGNvbmZpZ19yZWFkX2JyYW5jaGVzKTsKKwlzb3J0X3BhdGhfbGlzdCgmYnJhbmNoX2xpc3QpOworfQorCitzdHJ1Y3QgcmVmX3N0YXRlcyB7CisJc3RydWN0IHJlbW90ZSAqcmVtb3RlOworCXN0cnVjdCBzdHJidWYgcmVtb3RlX3ByZWZpeDsKKwlzdHJ1Y3QgcGF0aF9saXN0IG5ldywgc3RhbGUsIHRyYWNrZWQ7Cit9OworCitzdGF0aWMgaW50IGhhbmRsZV9vbmVfYnJhbmNoKGNvbnN0IGNoYXIgKnJlZm5hbWUsCisJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZsYWdzLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCByZWZfc3RhdGVzICpzdGF0ZXMgPSBjYl9kYXRhOworCXN0cnVjdCByZWZzcGVjIHJlZnNwZWM7CisKKwltZW1zZXQoJnJlZnNwZWMsIDAsIHNpemVvZihyZWZzcGVjKSk7CisJcmVmc3BlYy5kc3QgPSAoY2hhciAqKXJlZm5hbWU7CisJaWYgKCFyZW1vdGVfZmluZF90cmFja2luZyhzdGF0ZXMtPnJlbW90ZSwgJnJlZnNwZWMpKSB7CisJCXN0cnVjdCBwYXRoX2xpc3RfaXRlbSAqaXRlbTsKKwkJY29uc3QgY2hhciAqbmFtZSA9IHNraXBfcHJlZml4KHJlZnNwZWMuc3JjLCAicmVmcy9oZWFkcy8iKTsKKwkJLyogc3ltYm9saWMgcmVmcyBwb2ludGluZyBub3doZXJlIHdlcmUgaGFuZGxlZCBhbHJlYWR5ICovCisJCWlmICgoZmxhZ3MgJiBSRUZfSVNTWU1SRUYpIHx8CisJCQkJdW5zb3J0ZWRfcGF0aF9saXN0X2hhc19wYXRoKCZzdGF0ZXMtPnRyYWNrZWQsCisJCQkJCW5hbWUpIHx8CisJCQkJdW5zb3J0ZWRfcGF0aF9saXN0X2hhc19wYXRoKCZzdGF0ZXMtPm5ldywKKwkJCQkJbmFtZSkpCisJCQlyZXR1cm4gMDsKKwkJaXRlbSA9IHBhdGhfbGlzdF9hcHBlbmQobmFtZSwgJnN0YXRlcy0+c3RhbGUpOworCQlpdGVtLT51dGlsID0geHN0cmR1cChyZWZuYW1lKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3JlZl9zdGF0ZXMoY29uc3Qgc3RydWN0IHJlZiAqcmVmLCBzdHJ1Y3QgcmVmX3N0YXRlcyAqc3RhdGVzKQoreworCXN0cnVjdCByZWYgKmZldGNoX21hcCA9IE5VTEwsICoqdGFpbCA9ICZmZXRjaF9tYXA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3RhdGVzLT5yZW1vdGUtPmZldGNoX3JlZnNwZWNfbnI7IGkrKykKKwkJaWYgKGdldF9mZXRjaF9tYXAocmVmLCBzdGF0ZXMtPnJlbW90ZS0+ZmV0Y2ggKyBpLCAmdGFpbCwgMSkpCisJCQlkaWUoIkNvdWxkIG5vdCBnZXQgZmV0Y2ggbWFwIGZvciByZWZzcGVjICVzIiwKKwkJCQlzdGF0ZXMtPnJlbW90ZS0+ZmV0Y2hfcmVmc3BlY1tpXSk7CisKKwlzdGF0ZXMtPm5ldy5zdHJkdXBfcGF0aHMgPSBzdGF0ZXMtPnRyYWNrZWQuc3RyZHVwX3BhdGhzID0gMTsKKwlmb3IgKHJlZiA9IGZldGNoX21hcDsgcmVmOyByZWYgPSByZWYtPm5leHQpIHsKKwkJc3RydWN0IHBhdGhfbGlzdCAqdGFyZ2V0ID0gJnN0YXRlcy0+dHJhY2tlZDsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJdm9pZCAqdXRpbCA9IE5VTEw7CisKKwkJaWYgKCFyZWYtPnBlZXJfcmVmIHx8IHJlYWRfcmVmKHJlZi0+cGVlcl9yZWYtPm5hbWUsIHNoYTEpKQorCQkJdGFyZ2V0ID0gJnN0YXRlcy0+bmV3OworCQllbHNlIHsKKwkJCXRhcmdldCA9ICZzdGF0ZXMtPnRyYWNrZWQ7CisJCQlpZiAoaGFzaGNtcChzaGExLCByZWYtPm5ld19zaGExKSkKKwkJCQl1dGlsID0gJnN0YXRlczsKKwkJfQorCQlwYXRoX2xpc3RfYXBwZW5kKHNraXBfcHJlZml4KHJlZi0+bmFtZSwgInJlZnMvaGVhZHMvIiksCisJCQkJdGFyZ2V0KS0+dXRpbCA9IHV0aWw7CisJfQorCWZyZWVfcmVmcyhmZXRjaF9tYXApOworCisJc3RyYnVmX2FkZGYoJnN0YXRlcy0+cmVtb3RlX3ByZWZpeCwKKwkJInJlZnMvcmVtb3Rlcy8lcy8iLCBzdGF0ZXMtPnJlbW90ZS0+bmFtZSk7CisJZm9yX2VhY2hfcmVmKGhhbmRsZV9vbmVfYnJhbmNoLCBzdGF0ZXMpOworCXNvcnRfcGF0aF9saXN0KCZzdGF0ZXMtPnN0YWxlKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgYnJhbmNoZXNfZm9yX3JlbW90ZSB7CisJY29uc3QgY2hhciAqcHJlZml4OworCXN0cnVjdCBwYXRoX2xpc3QgKmJyYW5jaGVzOworfTsKKworc3RhdGljIGludCBhZGRfYnJhbmNoX2Zvcl9yZW1vdmFsKGNvbnN0IGNoYXIgKnJlZm5hbWUsCisJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZsYWdzLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCBicmFuY2hlc19mb3JfcmVtb3RlICpicmFuY2hlcyA9IGNiX2RhdGE7CisKKwlpZiAoIXByZWZpeGNtcChyZWZuYW1lLCBicmFuY2hlcy0+cHJlZml4KSkgeworCQlzdHJ1Y3QgcGF0aF9saXN0X2l0ZW0gKml0ZW07CisKKwkJLyogbWFrZSBzdXJlIHRoYXQgc3ltcmVmcyBhcmUgZGVsZXRlZCAqLworCQlpZiAoZmxhZ3MgJiBSRUZfSVNTWU1SRUYpCisJCQlyZXR1cm4gdW5saW5rKGdpdF9wYXRoKHJlZm5hbWUpKTsKKworCQlpdGVtID0gcGF0aF9saXN0X2FwcGVuZChyZWZuYW1lLCBicmFuY2hlcy0+YnJhbmNoZXMpOworCQlpdGVtLT51dGlsID0geG1hbGxvYygyMCk7CisJCWhhc2hjcHkoaXRlbS0+dXRpbCwgc2hhMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVtb3ZlX2JyYW5jaGVzKHN0cnVjdCBwYXRoX2xpc3QgKmJyYW5jaGVzKQoreworCWludCBpLCByZXN1bHQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBicmFuY2hlcy0+bnI7IGkrKykgeworCQlzdHJ1Y3QgcGF0aF9saXN0X2l0ZW0gKml0ZW0gPSBicmFuY2hlcy0+aXRlbXMgKyBpOworCQljb25zdCBjaGFyICpyZWZuYW1lID0gaXRlbS0+cGF0aDsKKwkJdW5zaWduZWQgY2hhciAqc2hhMSA9IGl0ZW0tPnV0aWw7CisKKwkJaWYgKGRlbGV0ZV9yZWYocmVmbmFtZSwgc2hhMSkpCisJCQlyZXN1bHQgfD0gZXJyb3IoIkNvdWxkIG5vdCByZW1vdmUgYnJhbmNoICVzIiwgcmVmbmFtZSk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcm0oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0geworCQlPUFRfRU5EKCkKKwl9OworCXN0cnVjdCByZW1vdGUgKnJlbW90ZTsKKwlzdHJ1Y3Qgc3RyYnVmIGJ1ZjsKKwlzdHJ1Y3QgcGF0aF9saXN0IGJyYW5jaGVzID0geyBOVUxMLCAwLCAwLCAxIH07CisJc3RydWN0IGJyYW5jaGVzX2Zvcl9yZW1vdGUgY2JfZGF0YSA9IHsgTlVMTCwgJmJyYW5jaGVzIH07CisJaW50IGk7CisKKwlpZiAoYXJnYyAhPSAyKQorCQl1c2FnZV93aXRoX29wdGlvbnMoYnVpbHRpbl9yZW1vdGVfdXNhZ2UsIG9wdGlvbnMpOworCisJcmVtb3RlID0gcmVtb3RlX2dldChhcmd2WzFdKTsKKwlpZiAoIXJlbW90ZSkKKwkJZGllKCJObyBzdWNoIHJlbW90ZTogJXMiLCBhcmd2WzFdKTsKKworCXN0cmJ1Zl9pbml0KCZidWYsIDApOworCXN0cmJ1Zl9hZGRmKCZidWYsICJyZW1vdGUuJXMiLCByZW1vdGUtPm5hbWUpOworCWlmIChnaXRfY29uZmlnX3JlbmFtZV9zZWN0aW9uKGJ1Zi5idWYsIE5VTEwpIDwgMSkKKwkJcmV0dXJuIGVycm9yKCJDb3VsZCBub3QgcmVtb3ZlIGNvbmZpZyBzZWN0aW9uICclcyciLCBidWYuYnVmKTsKKworCXJlYWRfYnJhbmNoZXMoKTsKKwlmb3IgKGkgPSAwOyBpIDwgYnJhbmNoX2xpc3QubnI7IGkrKykgeworCQlzdHJ1Y3QgcGF0aF9saXN0X2l0ZW0gKml0ZW0gPSBicmFuY2hfbGlzdC5pdGVtcyArIGk7CisJCXN0cnVjdCBicmFuY2hfaW5mbyAqaW5mbyA9IGl0ZW0tPnV0aWw7CisJCWlmIChpbmZvLT5yZW1vdGUgJiYgIXN0cmNtcChpbmZvLT5yZW1vdGUsIHJlbW90ZS0+bmFtZSkpIHsKKwkJCWNvbnN0IGNoYXIgKmtleXNbXSA9IHsgInJlbW90ZSIsICJtZXJnZSIsIE5VTEwgfSwgKiprOworCQkJZm9yIChrID0ga2V5czsgKms7IGsrKykgeworCQkJCXN0cmJ1Zl9yZXNldCgmYnVmKTsKKwkJCQlzdHJidWZfYWRkZigmYnVmLCAiYnJhbmNoLiVzLiVzIiwKKwkJCQkJCWl0ZW0tPnBhdGgsICprKTsKKwkJCQlpZiAoZ2l0X2NvbmZpZ19zZXQoYnVmLmJ1ZiwgTlVMTCkpIHsKKwkJCQkJc3RyYnVmX3JlbGVhc2UoJmJ1Zik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIFdlIGNhbm5vdCBqdXN0IHBhc3MgYSBmdW5jdGlvbiB0byBmb3JfZWFjaF9yZWYoKSB3aGljaCBkZWxldGVzCisJICogdGhlIGJyYW5jaGVzIG9uZSBieSBvbmUsIHNpbmNlIGZvcl9lYWNoX3JlZigpIHJlbGllcyBvbiBjYWNoZWQKKwkgKiByZWZzLCB3aGljaCBhcmUgaW52YWxpZGF0ZWQgd2hlbiBkZWxldGluZyBhIGJyYW5jaC4KKwkgKi8KKwlzdHJidWZfcmVzZXQoJmJ1Zik7CisJc3RyYnVmX2FkZGYoJmJ1ZiwgInJlZnMvcmVtb3Rlcy8lcy8iLCByZW1vdGUtPm5hbWUpOworCWNiX2RhdGEucHJlZml4ID0gYnVmLmJ1ZjsKKwlpID0gZm9yX2VhY2hfcmVmKGFkZF9icmFuY2hfZm9yX3JlbW92YWwsICZjYl9kYXRhKTsKKwlzdHJidWZfcmVsZWFzZSgmYnVmKTsKKworCWlmICghaSkKKwkJaSA9IHJlbW92ZV9icmFuY2hlcygmYnJhbmNoZXMpOworCXBhdGhfbGlzdF9jbGVhcigmYnJhbmNoZXMsIDEpOworCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfbGlzdChjb25zdCBjaGFyICp0aXRsZSwgc3RydWN0IHBhdGhfbGlzdCAqbGlzdCkKK3sKKwlpbnQgaTsKKworCWlmICghbGlzdC0+bnIpCisJCXJldHVybjsKKworCXByaW50Zih0aXRsZSwgbGlzdC0+bnIgPiAxID8gImVzIiA6ICIiKTsKKwlwcmludGYoIlxuICAgICIpOworCWZvciAoaSA9IDA7IGkgPCBsaXN0LT5ucjsgaSsrKQorCQlwcmludGYoIiVzJXMiLCBpID8gIiAiIDogIiIsIGxpc3QtPml0ZW1zW2ldLnBhdGgpOworCXByaW50ZigiXG4iKTsKK30KKworc3RhdGljIGludCBzaG93X29yX3BydW5lKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgaW50IHBydW5lKQoreworCWludCBkcnlfcnVuID0gMCwgcmVzdWx0ID0gMDsKKwlzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKKwkJT1BUX0dST1VQKCJzaG93IHNwZWNpZmljIG9wdGlvbnMiKSwKKwkJT1BUX19EUllfUlVOKCZkcnlfcnVuKSwKKwkJT1BUX0VORCgpCisJfTsKKwlzdHJ1Y3QgcmVmX3N0YXRlcyBzdGF0ZXM7CisKKwlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBvcHRpb25zLCBidWlsdGluX3JlbW90ZV91c2FnZSwgMCk7CisKKwlpZiAoYXJnYyA8IDEpCisJCXVzYWdlX3dpdGhfb3B0aW9ucyhidWlsdGluX3JlbW90ZV91c2FnZSwgb3B0aW9ucyk7CisKKwltZW1zZXQoJnN0YXRlcywgMCwgc2l6ZW9mKHN0YXRlcykpOworCWZvciAoOyBhcmdjOyBhcmdjLS0sIGFyZ3YrKykgeworCQlzdHJ1Y3QgdHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisJCWNvbnN0IHN0cnVjdCByZWYgKnJlZjsKKwkJc3RydWN0IHN0cmJ1ZiBidWY7CisJCWludCBpLCBnb3Rfc3RhdGVzOworCisJCXN0YXRlcy5yZW1vdGUgPSByZW1vdGVfZ2V0KCphcmd2KTsKKwkJaWYgKCFzdGF0ZXMucmVtb3RlKQorCQkJcmV0dXJuIGVycm9yKCJObyBzdWNoIHJlbW90ZTogJXMiLCAqYXJndik7CisJCXRyYW5zcG9ydCA9IHRyYW5zcG9ydF9nZXQoTlVMTCwgc3RhdGVzLnJlbW90ZS0+dXJsX25yID4gMCA/CisJCQlzdGF0ZXMucmVtb3RlLT51cmxbMF0gOiBOVUxMKTsKKwkJcmVmID0gdHJhbnNwb3J0X2dldF9yZW1vdGVfcmVmcyh0cmFuc3BvcnQpOworCQl0cmFuc3BvcnRfZGlzY29ubmVjdCh0cmFuc3BvcnQpOworCisJCXJlYWRfYnJhbmNoZXMoKTsKKwkJZ290X3N0YXRlcyA9IGdldF9yZWZfc3RhdGVzKHJlZiwgJnN0YXRlcyk7CisJCWlmIChnb3Rfc3RhdGVzKQorCQkJcmVzdWx0ID0gZXJyb3IoIkVycm9yIGdldHRpbmcgbG9jYWwgaW5mbyBmb3IgJyVzJyIsCisJCQkJCXN0YXRlcy5yZW1vdGUtPm5hbWUpOworCisJCWlmIChwcnVuZSkgeworCQkJc3RydWN0IHN0cmJ1ZiBidWY7CisJCQlpbnQgcHJlZml4X2xlbjsKKworCQkJc3RyYnVmX2luaXQoJmJ1ZiwgMCk7CisJCQlpZiAoc3RhdGVzLnJlbW90ZS0+ZmV0Y2hfcmVmc3BlY19uciA9PSAxICYmCisJCQkJCXN0YXRlcy5yZW1vdGUtPmZldGNoLT5wYXR0ZXJuICYmCisJCQkJCSFzdHJjbXAoc3RhdGVzLnJlbW90ZS0+ZmV0Y2gtPnNyYywKKwkJCQkJCXN0YXRlcy5yZW1vdGUtPmZldGNoLT5kc3QpKQorCQkJCS8qIGhhbmRsZSAtLW1pcnJvciByZW1vdGUgKi8KKwkJCQlzdHJidWZfYWRkc3RyKCZidWYsICJyZWZzL2hlYWRzLyIpOworCQkJZWxzZQorCQkJCXN0cmJ1Zl9hZGRmKCZidWYsICJyZWZzL3JlbW90ZXMvJXMvIiwgKmFyZ3YpOworCQkJcHJlZml4X2xlbiA9IGJ1Zi5sZW47CisKKwkJCWZvciAoaSA9IDA7IGkgPCBzdGF0ZXMuc3RhbGUubnI7IGkrKykgeworCQkJCXN0cmJ1Zl9zZXRsZW4oJmJ1ZiwgcHJlZml4X2xlbik7CisJCQkJc3RyYnVmX2FkZHN0cigmYnVmLCBzdGF0ZXMuc3RhbGUuaXRlbXNbaV0ucGF0aCk7CisJCQkJcmVzdWx0IHw9IGRlbGV0ZV9yZWYoYnVmLmJ1ZiwgTlVMTCk7CisJCQl9CisKKwkJCXN0cmJ1Zl9yZWxlYXNlKCZidWYpOworCQkJZ290byBjbGVhbnVwX3N0YXRlczsKKwkJfQorCisJCXByaW50ZigiKiByZW1vdGUgJXNcbiAgVVJMOiAlc1xuIiwgKmFyZ3YsCisJCQlzdGF0ZXMucmVtb3RlLT51cmxfbnIgPiAwID8KKwkJCQlzdGF0ZXMucmVtb3RlLT51cmxbMF0gOiAiKG5vIFVSTCkiKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgYnJhbmNoX2xpc3QubnI7IGkrKykgeworCQkJc3RydWN0IHBhdGhfbGlzdF9pdGVtICpicmFuY2ggPSBicmFuY2hfbGlzdC5pdGVtcyArIGk7CisJCQlzdHJ1Y3QgYnJhbmNoX2luZm8gKmluZm8gPSBicmFuY2gtPnV0aWw7CisJCQlpbnQgajsKKworCQkJaWYgKCFpbmZvLT5tZXJnZS5uciB8fCBzdHJjbXAoKmFyZ3YsIGluZm8tPnJlbW90ZSkpCisJCQkJY29udGludWU7CisJCQlwcmludGYoIiAgUmVtb3RlIGJyYW5jaCVzIG1lcmdlZCB3aXRoICdnaXQgcHVsbCcgIgorCQkJCSJ3aGlsZSBvbiBicmFuY2ggJXNcbiAgICIsCisJCQkJaW5mby0+bWVyZ2UubnIgPiAxID8gImVzIiA6ICIiLAorCQkJCWJyYW5jaC0+cGF0aCk7CisJCQlmb3IgKGogPSAwOyBqIDwgaW5mby0+bWVyZ2UubnI7IGorKykKKwkJCQlwcmludGYoIiAlcyIsIGluZm8tPm1lcmdlLml0ZW1zW2pdLnBhdGgpOworCQkJcHJpbnRmKCJcbiIpOworCQl9CisKKwkJaWYgKGdvdF9zdGF0ZXMpCisJCQljb250aW51ZTsKKwkJc3RyYnVmX2luaXQoJmJ1ZiwgMCk7CisJCXN0cmJ1Zl9hZGRmKCZidWYsICIgIE5ldyByZW1vdGUgYnJhbmNoJSVzIChuZXh0IGZldGNoIHdpbGwgIgorCQkJInN0b3JlIGluIHJlbW90ZXMvJXMpIiwgc3RhdGVzLnJlbW90ZS0+bmFtZSk7CisJCXNob3dfbGlzdChidWYuYnVmLCAmc3RhdGVzLm5ldyk7CisJCXN0cmJ1Zl9yZWxlYXNlKCZidWYpOworCQlzaG93X2xpc3QoIiAgU3RhbGUgdHJhY2tpbmcgYnJhbmNoJXMgKHVzZSAnZ2l0IHJlbW90ZSBwcnVuZScpIiwKKwkJCQkmc3RhdGVzLnN0YWxlKTsKKwkJc2hvd19saXN0KCIgIFRyYWNrZWQgcmVtb3RlIGJyYW5jaCVzIiwKKwkJCQkmc3RhdGVzLnRyYWNrZWQpOworCisJCWlmIChzdGF0ZXMucmVtb3RlLT5wdXNoX3JlZnNwZWNfbnIpIHsKKwkJCXByaW50ZigiICBMb2NhbCBicmFuY2glcyBwdXNoZWQgd2l0aCAnZ2l0IHB1c2gnXG4gICAiLAorCQkJCXN0YXRlcy5yZW1vdGUtPnB1c2hfcmVmc3BlY19uciA+IDEgPworCQkJCQkiZXMiIDogIiIpOworCQkJZm9yIChpID0gMDsgaSA8IHN0YXRlcy5yZW1vdGUtPnB1c2hfcmVmc3BlY19ucjsgaSsrKSB7CisJCQkJc3RydWN0IHJlZnNwZWMgKnNwZWMgPSBzdGF0ZXMucmVtb3RlLT5wdXNoICsgaTsKKwkJCQlwcmludGYoIiAlcyVzJXMlcyIsIHNwZWMtPmZvcmNlID8gIisiIDogIiIsCisJCQkJCXNraXBfcHJlZml4KHNwZWMtPnNyYywgInJlZnMvaGVhZHMvIiksCisJCQkJCXNwZWMtPmRzdCA/ICI6IiA6ICIiLAorCQkJCQlza2lwX3ByZWZpeChzcGVjLT5kc3QsICJyZWZzL2hlYWRzLyIpKTsKKwkJCX0KKwkJCXByaW50ZigiXG4iKTsKKwkJfQorY2xlYW51cF9zdGF0ZXM6CisJCS8qIE5FRURTV09SSzogZnJlZSByZW1vdGUgKi8KKwkJcGF0aF9saXN0X2NsZWFyKCZzdGF0ZXMubmV3LCAwKTsKKwkJcGF0aF9saXN0X2NsZWFyKCZzdGF0ZXMuc3RhbGUsIDApOworCQlwYXRoX2xpc3RfY2xlYXIoJnN0YXRlcy50cmFja2VkLCAwKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGdldF9vbmVfcmVtb3RlX2Zvcl91cGRhdGUoc3RydWN0IHJlbW90ZSAqcmVtb3RlLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBwYXRoX2xpc3QgKmxpc3QgPSBwcml2OworCWlmICghcmVtb3RlLT5za2lwX2RlZmF1bHRfdXBkYXRlKQorCQlwYXRoX2xpc3RfYXBwZW5kKHhzdHJkdXAocmVtb3RlLT5uYW1lKSwgbGlzdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCByZW1vdGVfZ3JvdXAgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IHBhdGhfbGlzdCAqbGlzdDsKK30gcmVtb3RlX2dyb3VwOworCitzdGF0aWMgaW50IGdldF9yZW1vdGVfZ3JvdXAoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXByZWZpeGNtcChrZXksICJyZW1vdGVzLiIpICYmCisJCQkhc3RyY21wKGtleSArIDgsIHJlbW90ZV9ncm91cC5uYW1lKSkgeworCQkvKiBzcGxpdCBsaXN0IGJ5IHdoaXRlIHNwYWNlICovCisJCWludCBzcGFjZSA9IHN0cmNzcG4odmFsdWUsICIgXHRcbiIpOworCQl3aGlsZSAoKnZhbHVlKSB7CisJCQlpZiAoc3BhY2UgPiAxKQorCQkJCXBhdGhfbGlzdF9hcHBlbmQoeHN0cm5kdXAodmFsdWUsIHNwYWNlKSwKKwkJCQkJCXJlbW90ZV9ncm91cC5saXN0KTsKKwkJCXZhbHVlICs9IHNwYWNlICsgKHZhbHVlW3NwYWNlXSAhPSAnXDAnKTsKKwkJCXNwYWNlID0gc3RyY3Nwbih2YWx1ZSwgIiBcdFxuIik7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1cGRhdGUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCWludCBpLCByZXN1bHQgPSAwOworCXN0cnVjdCBwYXRoX2xpc3QgbGlzdCA9IHsgTlVMTCwgMCwgMCwgMCB9OworCXN0YXRpYyBjb25zdCBjaGFyICpkZWZhdWx0X2FyZ3ZbXSA9IHsgTlVMTCwgImRlZmF1bHQiLCBOVUxMIH07CisKKwlpZiAoYXJnYyA8IDIpIHsKKwkJYXJnYyA9IDI7CisJCWFyZ3YgPSBkZWZhdWx0X2FyZ3Y7CisJfQorCisJcmVtb3RlX2dyb3VwLmxpc3QgPSAmbGlzdDsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCXJlbW90ZV9ncm91cC5uYW1lID0gYXJndltpXTsKKwkJcmVzdWx0ID0gZ2l0X2NvbmZpZyhnZXRfcmVtb3RlX2dyb3VwKTsKKwl9CisKKwlpZiAoIXJlc3VsdCAmJiAhbGlzdC5uciAgJiYgYXJnYyA9PSAyICYmICFzdHJjbXAoYXJndlsxXSwgImRlZmF1bHQiKSkKKwkJcmVzdWx0ID0gZm9yX2VhY2hfcmVtb3RlKGdldF9vbmVfcmVtb3RlX2Zvcl91cGRhdGUsICZsaXN0KTsKKworCWZvciAoaSA9IDA7IGkgPCBsaXN0Lm5yOyBpKyspCisJCXJlc3VsdCB8PSBmZXRjaF9yZW1vdGUobGlzdC5pdGVtc1tpXS5wYXRoKTsKKworCS8qIGFsbCBuYW1lcyB3ZXJlIHN0cmR1cCgpZWQgb3Igc3RybmR1cCgpZWQgKi8KKwlsaXN0LnN0cmR1cF9wYXRocyA9IDE7CisJcGF0aF9saXN0X2NsZWFyKCZsaXN0LCAwKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X29uZV9lbnRyeShzdHJ1Y3QgcmVtb3RlICpyZW1vdGUsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IHBhdGhfbGlzdCAqbGlzdCA9IHByaXY7CisKKwlwYXRoX2xpc3RfYXBwZW5kKHJlbW90ZS0+bmFtZSwgbGlzdCktPnV0aWwgPSByZW1vdGUtPnVybF9uciA/CisJCSh2b2lkICopcmVtb3RlLT51cmxbMF0gOiBOVUxMOworCWlmIChyZW1vdGUtPnVybF9uciA+IDEpCisJCXdhcm5pbmcoIlJlbW90ZSAlcyBoYXMgbW9yZSB0aGFuIG9uZSBVUkwiLCByZW1vdGUtPm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19hbGwodm9pZCkKK3sKKwlzdHJ1Y3QgcGF0aF9saXN0IGxpc3QgPSB7IE5VTEwsIDAsIDAgfTsKKwlpbnQgcmVzdWx0ID0gZm9yX2VhY2hfcmVtb3RlKGdldF9vbmVfZW50cnksICZsaXN0KTsKKworCWlmICghcmVzdWx0KSB7CisJCWludCBpOworCisJCXNvcnRfcGF0aF9saXN0KCZsaXN0KTsKKwkJZm9yIChpID0gMDsgaSA8IGxpc3QubnI7IGkrKykgeworCQkJc3RydWN0IHBhdGhfbGlzdF9pdGVtICppdGVtID0gbGlzdC5pdGVtcyArIGk7CisJCQlwcmludGYoIiVzJXMlc1xuIiwgaXRlbS0+cGF0aCwKKwkJCQl2ZXJib3NlID8gIlx0IiA6ICIiLAorCQkJCXZlcmJvc2UgJiYgaXRlbS0+dXRpbCA/CisJCQkJCShjb25zdCBjaGFyICopaXRlbS0+dXRpbCA6ICIiKTsKKwkJfQorCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgY21kX3JlbW90ZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKKwkJT1BUX19WRVJCT1NFKCZ2ZXJib3NlKSwKKwkJT1BUX0VORCgpCisJfTsKKwlpbnQgcmVzdWx0OworCisJYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgb3B0aW9ucywgYnVpbHRpbl9yZW1vdGVfdXNhZ2UsCisJCVBBUlNFX09QVF9TVE9QX0FUX05PTl9PUFRJT04pOworCisJaWYgKGFyZ2MgPCAxKQorCQlyZXN1bHQgPSBzaG93X2FsbCgpOworCWVsc2UgaWYgKCFzdHJjbXAoYXJndlswXSwgImFkZCIpKQorCQlyZXN1bHQgPSBhZGQoYXJnYywgYXJndik7CisJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAicm0iKSkKKwkJcmVzdWx0ID0gcm0oYXJnYywgYXJndik7CisJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAic2hvdyIpKQorCQlyZXN1bHQgPSBzaG93X29yX3BydW5lKGFyZ2MsIGFyZ3YsIDApOworCWVsc2UgaWYgKCFzdHJjbXAoYXJndlswXSwgInBydW5lIikpCisJCXJlc3VsdCA9IHNob3dfb3JfcHJ1bmUoYXJnYywgYXJndiwgMSk7CisJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAidXBkYXRlIikpCisJCXJlc3VsdCA9IHVwZGF0ZShhcmdjLCBhcmd2KTsKKwllbHNlIHsKKwkJZXJyb3IoIlVua25vd24gc3ViY29tbWFuZDogJXMiLCBhcmd2WzBdKTsKKwkJdXNhZ2Vfd2l0aF9vcHRpb25zKGJ1aWx0aW5fcmVtb3RlX3VzYWdlLCBvcHRpb25zKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0ID8gMSA6IDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXJlcmVyZS5jIGIvYnVpbHRpbi1yZXJlcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjA3YWFkCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1yZXJlcmUuYwpAQCAtMCwwICsxLDQzNyBAQAorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInBhdGgtbGlzdC5oIgorI2luY2x1ZGUgInhkaWZmL3hkaWZmLmgiCisjaW5jbHVkZSAieGRpZmYtaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlIDx0aW1lLmg+CisKK3N0YXRpYyBjb25zdCBjaGFyIGdpdF9yZXJlcmVfdXNhZ2VbXSA9CisiZ2l0LXJlcmVyZSBbY2xlYXIgfCBzdGF0dXMgfCBkaWZmIHwgZ2NdIjsKKworLyogdGhlc2UgdmFsdWVzIGFyZSBkYXlzICovCitzdGF0aWMgaW50IGN1dG9mZl9ub3Jlc29sdmUgPSAxNTsKK3N0YXRpYyBpbnQgY3V0b2ZmX3Jlc29sdmUgPSA2MDsKKworLyogaWYgcmVyZXJlX2VuYWJsZWQgPT0gLTEsIGZhbGwgYmFjayB0byBkZXRlY3Rpb24gb2YgLmdpdC9yci1jYWNoZSAqLworc3RhdGljIGludCByZXJlcmVfZW5hYmxlZCA9IC0xOworCitzdGF0aWMgY2hhciAqbWVyZ2VfcnJfcGF0aDsKKworc3RhdGljIGNvbnN0IGNoYXIgKnJyX3BhdGgoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZmlsZSkKK3sKKwlyZXR1cm4gZ2l0X3BhdGgoInJyLWNhY2hlLyVzLyVzIiwgbmFtZSwgZmlsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfcnIoc3RydWN0IHBhdGhfbGlzdCAqcnIpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljaGFyIGJ1ZltQQVRIX01BWF07CisJRklMRSAqaW4gPSBmb3BlbihtZXJnZV9ycl9wYXRoLCAiciIpOworCWlmICghaW4pCisJCXJldHVybjsKKwl3aGlsZSAoZnJlYWQoYnVmLCA0MCwgMSwgaW4pID09IDEpIHsKKwkJaW50IGk7CisJCWNoYXIgKm5hbWU7CisJCWlmIChnZXRfc2hhMV9oZXgoYnVmLCBzaGExKSkKKwkJCWRpZSgiY29ycnVwdCBNRVJHRV9SUiIpOworCQlidWZbNDBdID0gJ1wwJzsKKwkJbmFtZSA9IHhzdHJkdXAoYnVmKTsKKwkJaWYgKGZnZXRjKGluKSAhPSAnXHQnKQorCQkJZGllKCJjb3JydXB0IE1FUkdFX1JSIik7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoYnVmKSAmJiAoYnVmW2ldID0gZmdldGMoaW4pKTsgaSsrKQorCQkJOyAvKiBkbyBub3RoaW5nICovCisJCWlmIChpID09IHNpemVvZihidWYpKQorCQkJZGllKCJmaWxlbmFtZSB0b28gbG9uZyIpOworCQlwYXRoX2xpc3RfaW5zZXJ0KGJ1ZiwgcnIpLT51dGlsID0geHN0cmR1cChuYW1lKTsKKwl9CisJZmNsb3NlKGluKTsKK30KKworc3RhdGljIHN0cnVjdCBsb2NrX2ZpbGUgd3JpdGVfbG9jazsKKworc3RhdGljIGludCB3cml0ZV9ycihzdHJ1Y3QgcGF0aF9saXN0ICpyciwgaW50IG91dF9mZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgcnItPm5yOyBpKyspIHsKKwkJY29uc3QgY2hhciAqcGF0aCA9IHJyLT5pdGVtc1tpXS5wYXRoOworCQlpbnQgbGVuZ3RoID0gc3RybGVuKHBhdGgpICsgMTsKKwkJaWYgKHdyaXRlX2luX2Z1bGwob3V0X2ZkLCByci0+aXRlbXNbaV0udXRpbCwgNDApICE9IDQwIHx8CisJCSAgICB3cml0ZV9pbl9mdWxsKG91dF9mZCwgIlx0IiwgMSkgIT0gMSB8fAorCQkgICAgd3JpdGVfaW5fZnVsbChvdXRfZmQsIHBhdGgsIGxlbmd0aCkgIT0gbGVuZ3RoKQorCQkJZGllKCJ1bmFibGUgdG8gd3JpdGUgcmVyZXJlIHJlY29yZCIpOworCX0KKwlpZiAoY29tbWl0X2xvY2tfZmlsZSgmd3JpdGVfbG9jaykgIT0gMCkKKwkJZGllKCJ1bmFibGUgdG8gd3JpdGUgcmVyZXJlIHJlY29yZCIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9maWxlKGNvbnN0IGNoYXIgKnBhdGgsCisJIHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKm91dHB1dCkKK3sKKwlTSEFfQ1RYIGN0eDsKKwljaGFyIGJ1ZlsxMDI0XTsKKwlpbnQgaHVuayA9IDAsIGh1bmtfbm8gPSAwOworCXN0cnVjdCBzdHJidWYgb25lLCB0d287CisJRklMRSAqZiA9IGZvcGVuKHBhdGgsICJyIik7CisJRklMRSAqb3V0ID0gTlVMTDsKKworCWlmICghZikKKwkJcmV0dXJuIGVycm9yKCJDb3VsZCBub3Qgb3BlbiAlcyIsIHBhdGgpOworCisJaWYgKG91dHB1dCkgeworCQlvdXQgPSBmb3BlbihvdXRwdXQsICJ3Iik7CisJCWlmICghb3V0KSB7CisJCQlmY2xvc2UoZik7CisJCQlyZXR1cm4gZXJyb3IoIkNvdWxkIG5vdCB3cml0ZSAlcyIsIG91dHB1dCk7CisJCX0KKwl9CisKKwlpZiAoc2hhMSkKKwkJU0hBMV9Jbml0KCZjdHgpOworCisJc3RyYnVmX2luaXQoJm9uZSwgMCk7CisJc3RyYnVmX2luaXQoJnR3bywgIDApOworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKSkgeworCQlpZiAoIXByZWZpeGNtcChidWYsICI8PDw8PDw8ICIpKQorCQkJaHVuayA9IDE7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYnVmLCAiPT09PT09PSIpKQorCQkJaHVuayA9IDI7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYnVmLCAiPj4+Pj4+PiAiKSkgeworCQkJaW50IGNtcCA9IHN0cmJ1Zl9jbXAoJm9uZSwgJnR3byk7CisKKwkJCWh1bmtfbm8rKzsKKwkJCWh1bmsgPSAwOworCQkJaWYgKGNtcCA+IDApIHsKKwkJCQlzdHJidWZfc3dhcCgmb25lLCAmdHdvKTsKKwkJCX0KKwkJCWlmIChvdXQpIHsKKwkJCQlmcHV0cygiPDw8PDw8PFxuIiwgb3V0KTsKKwkJCQlmd3JpdGUob25lLmJ1Ziwgb25lLmxlbiwgMSwgb3V0KTsKKwkJCQlmcHV0cygiPT09PT09PVxuIiwgb3V0KTsKKwkJCQlmd3JpdGUodHdvLmJ1ZiwgdHdvLmxlbiwgMSwgb3V0KTsKKwkJCQlmcHV0cygiPj4+Pj4+PlxuIiwgb3V0KTsKKwkJCX0KKwkJCWlmIChzaGExKSB7CisJCQkJU0hBMV9VcGRhdGUoJmN0eCwgb25lLmJ1ZiA/IG9uZS5idWYgOiAiIiwKKwkJCQkJICAgIG9uZS5sZW4gKyAxKTsKKwkJCQlTSEExX1VwZGF0ZSgmY3R4LCB0d28uYnVmID8gdHdvLmJ1ZiA6ICIiLAorCQkJCQkgICAgdHdvLmxlbiArIDEpOworCQkJfQorCQkJc3RyYnVmX3Jlc2V0KCZvbmUpOworCQkJc3RyYnVmX3Jlc2V0KCZ0d28pOworCQl9IGVsc2UgaWYgKGh1bmsgPT0gMSkKKwkJCXN0cmJ1Zl9hZGRzdHIoJm9uZSwgYnVmKTsKKwkJZWxzZSBpZiAoaHVuayA9PSAyKQorCQkJc3RyYnVmX2FkZHN0cigmdHdvLCBidWYpOworCQllbHNlIGlmIChvdXQpCisJCQlmcHV0cyhidWYsIG91dCk7CisJfQorCXN0cmJ1Zl9yZWxlYXNlKCZvbmUpOworCXN0cmJ1Zl9yZWxlYXNlKCZ0d28pOworCisJZmNsb3NlKGYpOworCWlmIChvdXQpCisJCWZjbG9zZShvdXQpOworCWlmIChzaGExKQorCQlTSEExX0ZpbmFsKHNoYTEsICZjdHgpOworCXJldHVybiBodW5rX25vOworfQorCitzdGF0aWMgaW50IGZpbmRfY29uZmxpY3Qoc3RydWN0IHBhdGhfbGlzdCAqY29uZmxpY3QpCit7CisJaW50IGk7CisJaWYgKHJlYWRfY2FjaGUoKSA8IDApCisJCXJldHVybiBlcnJvcigiQ291bGQgbm90IHJlYWQgaW5kZXgiKTsKKwlmb3IgKGkgPSAwOyBpKzEgPCBhY3RpdmVfbnI7IGkrKykgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmUyID0gYWN0aXZlX2NhY2hlW2ldOworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmUzID0gYWN0aXZlX2NhY2hlW2krMV07CisJCWlmIChjZV9zdGFnZShlMikgPT0gMiAmJgorCQkgICAgY2Vfc3RhZ2UoZTMpID09IDMgJiYKKwkJICAgIGNlX3NhbWVfbmFtZShlMiwgZTMpICYmCisJCSAgICBTX0lTUkVHKGUyLT5jZV9tb2RlKSAmJgorCQkgICAgU19JU1JFRyhlMy0+Y2VfbW9kZSkpIHsKKwkJCXBhdGhfbGlzdF9pbnNlcnQoKGNvbnN0IGNoYXIgKillMi0+bmFtZSwgY29uZmxpY3QpOworCQkJaSsrOyAvKiBza2lwIG92ZXIgYm90aCAjMiBhbmQgIzMgKi8KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZXJnZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpwYXRoKQoreworCWludCByZXQ7CisJbW1maWxlX3QgY3VyLCBiYXNlLCBvdGhlcjsKKwltbWJ1ZmZlcl90IHJlc3VsdCA9IHtOVUxMLCAwfTsKKwl4cHBhcmFtX3QgeHBwID0ge1hERl9ORUVEX01JTklNQUx9OworCisJaWYgKGhhbmRsZV9maWxlKHBhdGgsIE5VTEwsIHJyX3BhdGgobmFtZSwgInRoaXNpbWFnZSIpKSA8IDApCisJCXJldHVybiAxOworCisJaWYgKHJlYWRfbW1maWxlKCZjdXIsIHJyX3BhdGgobmFtZSwgInRoaXNpbWFnZSIpKSB8fAorCQkJcmVhZF9tbWZpbGUoJmJhc2UsIHJyX3BhdGgobmFtZSwgInByZWltYWdlIikpIHx8CisJCQlyZWFkX21tZmlsZSgmb3RoZXIsIHJyX3BhdGgobmFtZSwgInBvc3RpbWFnZSIpKSkKKwkJcmV0dXJuIDE7CisJcmV0ID0geGRsX21lcmdlKCZiYXNlLCAmY3VyLCAiIiwgJm90aGVyLCAiIiwKKwkJCSZ4cHAsIFhETF9NRVJHRV9aRUFMT1VTLCAmcmVzdWx0KTsKKwlpZiAoIXJldCkgeworCQlGSUxFICpmID0gZm9wZW4ocGF0aCwgInciKTsKKwkJaWYgKCFmKQorCQkJcmV0dXJuIGVycm9yKCJDb3VsZCBub3Qgd3JpdGUgdG8gJXMiLCBwYXRoKTsKKwkJZndyaXRlKHJlc3VsdC5wdHIsIHJlc3VsdC5zaXplLCAxLCBmKTsKKwkJZmNsb3NlKGYpOworCX0KKworCWZyZWUoY3VyLnB0cik7CisJZnJlZShiYXNlLnB0cik7CisJZnJlZShvdGhlci5wdHIpOworCWZyZWUocmVzdWx0LnB0cik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB1bmxpbmtfcnJfaXRlbShjb25zdCBjaGFyICpuYW1lKQoreworCXVubGluayhycl9wYXRoKG5hbWUsICJ0aGlzaW1hZ2UiKSk7CisJdW5saW5rKHJyX3BhdGgobmFtZSwgInByZWltYWdlIikpOworCXVubGluayhycl9wYXRoKG5hbWUsICJwb3N0aW1hZ2UiKSk7CisJcm1kaXIoZ2l0X3BhdGgoInJyLWNhY2hlLyVzIiwgbmFtZSkpOworfQorCitzdGF0aWMgdm9pZCBnYXJiYWdlX2NvbGxlY3Qoc3RydWN0IHBhdGhfbGlzdCAqcnIpCit7CisJc3RydWN0IHBhdGhfbGlzdCB0b19yZW1vdmUgPSB7IE5VTEwsIDAsIDAsIDEgfTsKKwljaGFyIGJ1ZlsxMDI0XTsKKwlESVIgKmRpcjsKKwlzdHJ1Y3QgZGlyZW50ICplOworCWludCBsZW4sIGksIGN1dG9mZjsKKwl0aW1lX3Qgbm93ID0gdGltZShOVUxMKSwgdGhlbjsKKworCXN0cmxjcHkoYnVmLCBnaXRfcGF0aCgicnItY2FjaGUiKSwgc2l6ZW9mKGJ1ZikpOworCWxlbiA9IHN0cmxlbihidWYpOworCWRpciA9IG9wZW5kaXIoYnVmKTsKKwlzdHJjcHkoYnVmICsgbGVuKyssICIvIik7CisJd2hpbGUgKChlID0gcmVhZGRpcihkaXIpKSkgeworCQljb25zdCBjaGFyICpuYW1lID0gZS0+ZF9uYW1lOworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJaWYgKG5hbWVbMF0gPT0gJy4nICYmIChuYW1lWzFdID09ICdcMCcgfHwKKwkJCQkJKG5hbWVbMV0gPT0gJy4nICYmIG5hbWVbMl0gPT0gJ1wwJykpKQorCQkJY29udGludWU7CisJCWkgPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLCAiJXMiLCBuYW1lKTsKKwkJc3RybGNweShidWYgKyBsZW4gKyBpLCAiL3ByZWltYWdlIiwgc2l6ZW9mKGJ1ZikgLSBsZW4gLSBpKTsKKwkJaWYgKHN0YXQoYnVmLCAmc3QpKQorCQkJY29udGludWU7CisJCXRoZW4gPSBzdC5zdF9tdGltZTsKKwkJc3RybGNweShidWYgKyBsZW4gKyBpLCAiL3Bvc3RpbWFnZSIsIHNpemVvZihidWYpIC0gbGVuIC0gaSk7CisJCWN1dG9mZiA9IHN0YXQoYnVmLCAmc3QpID8gY3V0b2ZmX25vcmVzb2x2ZSA6IGN1dG9mZl9yZXNvbHZlOworCQlpZiAodGhlbiA8IG5vdyAtIGN1dG9mZiAqIDg2NDAwKSB7CisJCQlidWZbbGVuICsgaV0gPSAnXDAnOworCQkJcGF0aF9saXN0X2luc2VydCh4c3RyZHVwKG5hbWUpLCAmdG9fcmVtb3ZlKTsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgdG9fcmVtb3ZlLm5yOyBpKyspCisJCXVubGlua19ycl9pdGVtKHRvX3JlbW92ZS5pdGVtc1tpXS5wYXRoKTsKKwlwYXRoX2xpc3RfY2xlYXIoJnRvX3JlbW92ZSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgb3V0Zih2b2lkICpkdW1teSwgbW1idWZmZXJfdCAqcHRyLCBpbnQgbmJ1ZikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbmJ1ZjsgaSsrKQorCQlpZiAod3JpdGVfaW5fZnVsbCgxLCBwdHJbaV0ucHRyLCBwdHJbaV0uc2l6ZSkgIT0gcHRyW2ldLnNpemUpCisJCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGlmZl90d28oY29uc3QgY2hhciAqZmlsZTEsIGNvbnN0IGNoYXIgKmxhYmVsMSwKKwkJY29uc3QgY2hhciAqZmlsZTIsIGNvbnN0IGNoYXIgKmxhYmVsMikKK3sKKwl4cHBhcmFtX3QgeHBwOworCXhkZW1pdGNvbmZfdCB4ZWNmZzsKKwl4ZGVtaXRjYl90IGVjYjsKKwltbWZpbGVfdCBtaW51cywgcGx1czsKKworCWlmIChyZWFkX21tZmlsZSgmbWludXMsIGZpbGUxKSB8fCByZWFkX21tZmlsZSgmcGx1cywgZmlsZTIpKQorCQlyZXR1cm4gMTsKKworCXByaW50ZigiLS0tIGEvJXNcbisrKyBiLyVzXG4iLCBsYWJlbDEsIGxhYmVsMik7CisJZmZsdXNoKHN0ZG91dCk7CisJeHBwLmZsYWdzID0gWERGX05FRURfTUlOSU1BTDsKKwltZW1zZXQoJnhlY2ZnLCAwLCBzaXplb2YoeGVjZmcpKTsKKwl4ZWNmZy5jdHhsZW4gPSAzOworCWVjYi5vdXRmID0gb3V0ZjsKKwl4ZGlfZGlmZigmbWludXMsICZwbHVzLCAmeHBwLCAmeGVjZmcsICZlY2IpOworCisJZnJlZShtaW51cy5wdHIpOworCWZyZWUocGx1cy5wdHIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX3BsYWluX3JlcmVyZShzdHJ1Y3QgcGF0aF9saXN0ICpyciwgaW50IGZkKQoreworCXN0cnVjdCBwYXRoX2xpc3QgY29uZmxpY3QgPSB7IE5VTEwsIDAsIDAsIDEgfTsKKwlpbnQgaTsKKworCWZpbmRfY29uZmxpY3QoJmNvbmZsaWN0KTsKKworCS8qCisJICogTUVSR0VfUlIgcmVjb3JkcyBwYXRocyB3aXRoIGNvbmZsaWN0cyBpbW1lZGlhdGVseSBhZnRlciBtZXJnZQorCSAqIGZhaWxlZC4gIFNvbWUgb2YgdGhlIGNvbmZsaWN0ZWQgcGF0aHMgbWlnaHQgaGF2ZSBiZWVuIGhhbmQgcmVzb2x2ZWQKKwkgKiBpbiB0aGUgd29ya2luZyB0cmVlIHNpbmNlIHRoZW4sIGJ1dCB0aGUgaW5pdGlhbCBydW4gd291bGQgY2F0Y2ggYWxsCisJICogYW5kIHJlZ2lzdGVyIHRoZWlyIHByZWltYWdlcy4KKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCBjb25mbGljdC5ucjsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKnBhdGggPSBjb25mbGljdC5pdGVtc1tpXS5wYXRoOworCQlpZiAoIXBhdGhfbGlzdF9oYXNfcGF0aChyciwgcGF0aCkpIHsKKwkJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCQljaGFyICpoZXg7CisJCQlpbnQgcmV0OworCQkJcmV0ID0gaGFuZGxlX2ZpbGUocGF0aCwgc2hhMSwgTlVMTCk7CisJCQlpZiAocmV0IDwgMSkKKwkJCQljb250aW51ZTsKKwkJCWhleCA9IHhzdHJkdXAoc2hhMV90b19oZXgoc2hhMSkpOworCQkJcGF0aF9saXN0X2luc2VydChwYXRoLCByciktPnV0aWwgPSBoZXg7CisJCQlpZiAobWtkaXIoZ2l0X3BhdGgoInJyLWNhY2hlLyVzIiwgaGV4KSwgMDc1NSkpCisJCQkJY29udGludWU7OworCQkJaGFuZGxlX2ZpbGUocGF0aCwgTlVMTCwgcnJfcGF0aChoZXgsICJwcmVpbWFnZSIpKTsKKwkJCWZwcmludGYoc3RkZXJyLCAiUmVjb3JkZWQgcHJlaW1hZ2UgZm9yICclcydcbiIsIHBhdGgpOworCQl9CisJfQorCisJLyoKKwkgKiBOb3cgc29tZSBvZiB0aGUgcGF0aHMgdGhhdCBoYWQgY29uZmxpY3RzIGVhcmxpZXIgbWlnaHQgaGF2ZSBiZWVuCisJICogaGFuZCByZXNvbHZlZC4gIE90aGVycyBtYXkgYmUgc2ltaWxhciB0byBhIGNvbmZsaWN0IGFscmVhZHkgdGhhdAorCSAqIHdhcyByZXNvbHZlZCBiZWZvcmUuCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgcnItPm5yOyBpKyspIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWludCByZXQ7CisJCWNvbnN0IGNoYXIgKnBhdGggPSByci0+aXRlbXNbaV0ucGF0aDsKKwkJY29uc3QgY2hhciAqbmFtZSA9IChjb25zdCBjaGFyICopcnItPml0ZW1zW2ldLnV0aWw7CisKKwkJaWYgKCFzdGF0KHJyX3BhdGgobmFtZSwgInByZWltYWdlIiksICZzdCkgJiYKKwkJCQkhc3RhdChycl9wYXRoKG5hbWUsICJwb3N0aW1hZ2UiKSwgJnN0KSkgeworCQkJaWYgKCFtZXJnZShuYW1lLCBwYXRoKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiUmVzb2x2ZWQgJyVzJyB1c2luZyAiCisJCQkJCQkicHJldmlvdXMgcmVzb2x1dGlvbi5cbiIsIHBhdGgpOworCQkJCWdvdG8gdGFpbF9vcHRpbWl6YXRpb247CisJCQl9CisJCX0KKworCQkvKiBMZXQncyBzZWUgaWYgd2UgaGF2ZSByZXNvbHZlZCBpdC4gKi8KKwkJcmV0ID0gaGFuZGxlX2ZpbGUocGF0aCwgTlVMTCwgTlVMTCk7CisJCWlmIChyZXQpCisJCQljb250aW51ZTsKKworCQlmcHJpbnRmKHN0ZGVyciwgIlJlY29yZGVkIHJlc29sdXRpb24gZm9yICclcycuXG4iLCBwYXRoKTsKKwkJY29weV9maWxlKHJyX3BhdGgobmFtZSwgInBvc3RpbWFnZSIpLCBwYXRoLCAwNjY2KTsKK3RhaWxfb3B0aW1pemF0aW9uOgorCQlpZiAoaSA8IHJyLT5uciAtIDEpCisJCQltZW1tb3ZlKHJyLT5pdGVtcyArIGksCisJCQkJcnItPml0ZW1zICsgaSArIDEsCisJCQkJc2l6ZW9mKHJyLT5pdGVtc1swXSkgKiAocnItPm5yIC0gaSAtIDEpKTsKKwkJcnItPm5yLS07CisJCWktLTsKKwl9CisKKwlyZXR1cm4gd3JpdGVfcnIocnIsIGZkKTsKK30KKworc3RhdGljIGludCBnaXRfcmVyZXJlX2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICghc3RyY21wKHZhciwgImdjLnJlcmVyZXJlc29sdmVkIikpCisJCWN1dG9mZl9yZXNvbHZlID0gZ2l0X2NvbmZpZ19pbnQodmFyLCB2YWx1ZSk7CisJZWxzZSBpZiAoIXN0cmNtcCh2YXIsICJnYy5yZXJlcmV1bnJlc29sdmVkIikpCisJCWN1dG9mZl9ub3Jlc29sdmUgPSBnaXRfY29uZmlnX2ludCh2YXIsIHZhbHVlKTsKKwllbHNlIGlmICghc3RyY21wKHZhciwgInJlcmVyZS5lbmFibGVkIikpCisJCXJlcmVyZV9lbmFibGVkID0gZ2l0X2NvbmZpZ19ib29sKHZhciwgdmFsdWUpOworCWVsc2UKKwkJcmV0dXJuIGdpdF9kZWZhdWx0X2NvbmZpZyh2YXIsIHZhbHVlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc19yZXJlcmVfZW5hYmxlZCh2b2lkKQoreworCXN0cnVjdCBzdGF0IHN0OworCWNvbnN0IGNoYXIgKnJyX2NhY2hlOworCWludCBycl9jYWNoZV9leGlzdHM7CisKKwlpZiAoIXJlcmVyZV9lbmFibGVkKQorCQlyZXR1cm4gMDsKKworCXJyX2NhY2hlID0gZ2l0X3BhdGgoInJyLWNhY2hlIik7CisJcnJfY2FjaGVfZXhpc3RzID0gIXN0YXQocnJfY2FjaGUsICZzdCkgJiYgU19JU0RJUihzdC5zdF9tb2RlKTsKKwlpZiAocmVyZXJlX2VuYWJsZWQgPCAwKQorCQlyZXR1cm4gcnJfY2FjaGVfZXhpc3RzOworCisJaWYgKCFycl9jYWNoZV9leGlzdHMgJiYKKwkgICAgKG1rZGlyKHJyX2NhY2hlLCAwNzc3KSB8fCBhZGp1c3Rfc2hhcmVkX3Blcm0ocnJfY2FjaGUpKSkKKwkJZGllKCJDb3VsZCBub3QgY3JlYXRlIGRpcmVjdG9yeSAlcyIsIHJyX2NhY2hlKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzZXR1cF9yZXJlcmUoc3RydWN0IHBhdGhfbGlzdCAqbWVyZ2VfcnIpCit7CisJaW50IGZkOworCisJZ2l0X2NvbmZpZyhnaXRfcmVyZXJlX2NvbmZpZyk7CisJaWYgKCFpc19yZXJlcmVfZW5hYmxlZCgpKQorCQlyZXR1cm4gLTE7CisKKwltZXJnZV9ycl9wYXRoID0geHN0cmR1cChnaXRfcGF0aCgicnItY2FjaGUvTUVSR0VfUlIiKSk7CisJZmQgPSBob2xkX2xvY2tfZmlsZV9mb3JfdXBkYXRlKCZ3cml0ZV9sb2NrLCBtZXJnZV9ycl9wYXRoLCAxKTsKKwlyZWFkX3JyKG1lcmdlX3JyKTsKKwlyZXR1cm4gZmQ7Cit9CisKK2ludCByZXJlcmUodm9pZCkKK3sKKwlzdHJ1Y3QgcGF0aF9saXN0IG1lcmdlX3JyID0geyBOVUxMLCAwLCAwLCAxIH07CisJaW50IGZkOworCisJZmQgPSBzZXR1cF9yZXJlcmUoJm1lcmdlX3JyKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gZG9fcGxhaW5fcmVyZXJlKCZtZXJnZV9yciwgZmQpOworfQorCitpbnQgY21kX3JlcmVyZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgcGF0aF9saXN0IG1lcmdlX3JyID0geyBOVUxMLCAwLCAwLCAxIH07CisJaW50IGksIGZkOworCisJZmQgPSBzZXR1cF9yZXJlcmUoJm1lcmdlX3JyKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gMDsKKworCWlmIChhcmdjIDwgMikKKwkJcmV0dXJuIGRvX3BsYWluX3JlcmVyZSgmbWVyZ2VfcnIsIGZkKTsKKwllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICJjbGVhciIpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBtZXJnZV9yci5ucjsgaSsrKSB7CisJCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJCWNvbnN0IGNoYXIgKm5hbWUgPSAoY29uc3QgY2hhciAqKW1lcmdlX3JyLml0ZW1zW2ldLnV0aWw7CisJCQlpZiAoIXN0YXQoZ2l0X3BhdGgoInJyLWNhY2hlLyVzIiwgbmFtZSksICZzdCkgJiYKKwkJCQkJU19JU0RJUihzdC5zdF9tb2RlKSAmJgorCQkJCQlzdGF0KHJyX3BhdGgobmFtZSwgInBvc3RpbWFnZSIpLCAmc3QpKQorCQkJCXVubGlua19ycl9pdGVtKG5hbWUpOworCQl9CisJCXVubGluayhtZXJnZV9ycl9wYXRoKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgImdjIikpCisJCWdhcmJhZ2VfY29sbGVjdCgmbWVyZ2VfcnIpOworCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgInN0YXR1cyIpKQorCQlmb3IgKGkgPSAwOyBpIDwgbWVyZ2VfcnIubnI7IGkrKykKKwkJCXByaW50ZigiJXNcbiIsIG1lcmdlX3JyLml0ZW1zW2ldLnBhdGgpOworCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgImRpZmYiKSkKKwkJZm9yIChpID0gMDsgaSA8IG1lcmdlX3JyLm5yOyBpKyspIHsKKwkJCWNvbnN0IGNoYXIgKnBhdGggPSBtZXJnZV9yci5pdGVtc1tpXS5wYXRoOworCQkJY29uc3QgY2hhciAqbmFtZSA9IChjb25zdCBjaGFyICopbWVyZ2VfcnIuaXRlbXNbaV0udXRpbDsKKwkJCWRpZmZfdHdvKHJyX3BhdGgobmFtZSwgInByZWltYWdlIiksIHBhdGgsIHBhdGgsIHBhdGgpOworCQl9CisJZWxzZQorCQl1c2FnZShnaXRfcmVyZXJlX3VzYWdlKTsKKworCXBhdGhfbGlzdF9jbGVhcigmbWVyZ2VfcnIsIDEpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1yZXNldC5jIGIvYnVpbHRpbi1yZXNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NDI0YmIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLXJlc2V0LmMKQEAgLTAsMCArMSwyNjggQEAKKy8qCisgKiAiZ2l0IHJlc2V0IiBidWlsdGluIGNvbW1hbmQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2FybG9zIFJpY2EKKyAqCisgKiBCYXNlZCBvbiBnaXQtcmVzZXQuc2gsIHdoaWNoIGlzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IExpbnVzIFRvcnZhbGRzIGFuZCBKdW5pbyBDIEhhbWFubworICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJydW4tY29tbWFuZC5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiZGlmZmNvcmUuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiYnJhbmNoLmgiCisjaW5jbHVkZSAicGFyc2Utb3B0aW9ucy5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdpdF9yZXNldF91c2FnZVtdID0geworCSJnaXQtcmVzZXQgWy0tbWl4ZWQgfCAtLXNvZnQgfCAtLWhhcmRdIFstcV0gWzxjb21taXQ+XSIsCisJImdpdC1yZXNldCBbLS1taXhlZF0gPGNvbW1pdD4gWy0tXSA8cGF0aHM+Li4uIiwKKwlOVUxMCit9OworCitzdGF0aWMgY2hhciAqYXJnc190b19zdHIoY29uc3QgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqYnVmID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGxlbiwgc3BhY2UgPSAwLCBuciA9IDA7CisKKwlmb3IgKDsgKmFyZ3Y7IGFyZ3YrKykgeworCQlsZW4gPSBzdHJsZW4oKmFyZ3YpOworCQlBTExPQ19HUk9XKGJ1ZiwgbnIgKyAxICsgbGVuLCBzcGFjZSk7CisJCWlmIChucikKKwkJCWJ1ZltucisrXSA9ICcgJzsKKwkJbWVtY3B5KGJ1ZiArIG5yLCAqYXJndiwgbGVuKTsKKwkJbnIgKz0gbGVuOworCX0KKwlBTExPQ19HUk9XKGJ1ZiwgbnIgKyAxLCBzcGFjZSk7CisJYnVmW25yXSA9ICdcMCc7CisKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19tZXJnZSh2b2lkKQoreworCXJldHVybiAhYWNjZXNzKGdpdF9wYXRoKCJNRVJHRV9IRUFEIiksIEZfT0spOworfQorCitzdGF0aWMgaW50IHJlc2V0X2luZGV4X2ZpbGUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGlzX2hhcmRfcmVzZXQpCit7CisJaW50IGkgPSAwOworCWNvbnN0IGNoYXIgKmFyZ3NbNl07CisKKwlhcmdzW2krK10gPSAicmVhZC10cmVlIjsKKwlhcmdzW2krK10gPSAiLXYiOworCWFyZ3NbaSsrXSA9ICItLXJlc2V0IjsKKwlpZiAoaXNfaGFyZF9yZXNldCkKKwkJYXJnc1tpKytdID0gIi11IjsKKwlhcmdzW2krK10gPSBzaGExX3RvX2hleChzaGExKTsKKwlhcmdzW2ldID0gTlVMTDsKKworCXJldHVybiBydW5fY29tbWFuZF92X29wdChhcmdzLCBSVU5fR0lUX0NNRCk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X25ld19oZWFkX2xpbmUoc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCWNvbnN0IGNoYXIgKmhleCwgKmJvZHk7CisKKwloZXggPSBmaW5kX3VuaXF1ZV9hYmJyZXYoY29tbWl0LT5vYmplY3Quc2hhMSwgREVGQVVMVF9BQkJSRVYpOworCXByaW50ZigiSEVBRCBpcyBub3cgYXQgJXMiLCBoZXgpOworCWJvZHkgPSBzdHJzdHIoY29tbWl0LT5idWZmZXIsICJcblxuIik7CisJaWYgKGJvZHkpIHsKKwkJY29uc3QgY2hhciAqZW9sOworCQlzaXplX3QgbGVuOworCQlib2R5ICs9IDI7CisJCWVvbCA9IHN0cmNocihib2R5LCAnXG4nKTsKKwkJbGVuID0gZW9sID8gZW9sIC0gYm9keSA6IHN0cmxlbihib2R5KTsKKwkJcHJpbnRmKCIgJS4qc1xuIiwgKGludCkgbGVuLCBib2R5KTsKKwl9CisJZWxzZQorCQlwcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX2luZGV4X3JlZnJlc2goaW50IGZkLCBzdHJ1Y3QgbG9ja19maWxlICppbmRleF9sb2NrKQoreworCWludCByZXN1bHQ7CisKKwlpZiAoIWluZGV4X2xvY2spIHsKKwkJaW5kZXhfbG9jayA9IHhjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBsb2NrX2ZpbGUpKTsKKwkJZmQgPSBob2xkX2xvY2tlZF9pbmRleChpbmRleF9sb2NrLCAxKTsKKwl9CisKKwlpZiAocmVhZF9jYWNoZSgpIDwgMCkKKwkJcmV0dXJuIGVycm9yKCJDb3VsZCBub3QgcmVhZCBpbmRleCIpOworCXJlc3VsdCA9IHJlZnJlc2hfY2FjaGUoMCkgPyAxIDogMDsKKwlpZiAod3JpdGVfY2FjaGUoZmQsIGFjdGl2ZV9jYWNoZSwgYWN0aXZlX25yKSB8fAorCQkJY29tbWl0X2xvY2tlZF9pbmRleChpbmRleF9sb2NrKSkKKwkJcmV0dXJuIGVycm9yICgiQ291bGQgbm90IHJlZnJlc2ggaW5kZXgiKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfaW5kZXhfZnJvbV9kaWZmKHN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSwKKwkJc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0LCB2b2lkICpkYXRhKQoreworCWludCBpOworCWludCAqZGlzY2FyZF9mbGFnID0gZGF0YTsKKworCS8qIGRvX2RpZmZfY2FjaGUoKSBtYW5nbGVkIHRoZSBpbmRleCAqLworCWRpc2NhcmRfY2FjaGUoKTsKKwkqZGlzY2FyZF9mbGFnID0gMTsKKwlyZWFkX2NhY2hlKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lID0gcS0+cXVldWVbaV0tPm9uZTsKKwkJaWYgKG9uZS0+bW9kZSkgeworCQkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZTsKKwkJCWNlID0gbWFrZV9jYWNoZV9lbnRyeShvbmUtPm1vZGUsIG9uZS0+c2hhMSwgb25lLT5wYXRoLAorCQkJCTAsIDApOworCQkJYWRkX2NhY2hlX2VudHJ5KGNlLCBBRERfQ0FDSEVfT0tfVE9fQUREIHwKKwkJCQlBRERfQ0FDSEVfT0tfVE9fUkVQTEFDRSk7CisJCX0gZWxzZQorCQkJcmVtb3ZlX2ZpbGVfZnJvbV9jYWNoZShvbmUtPnBhdGgpOworCX0KK30KKworc3RhdGljIGludCByZWFkX2Zyb21fdHJlZShjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKiphcmd2LAorCQl1bnNpZ25lZCBjaGFyICp0cmVlX3NoYTEpCit7CisJc3RydWN0IGxvY2tfZmlsZSAqbG9jayA9IHhjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBsb2NrX2ZpbGUpKTsKKwlpbnQgaW5kZXhfZmQsIGluZGV4X3dhc19kaXNjYXJkZWQgPSAwOworCXN0cnVjdCBkaWZmX29wdGlvbnMgb3B0OworCisJbWVtc2V0KCZvcHQsIDAsIHNpemVvZihvcHQpKTsKKwlkaWZmX3RyZWVfc2V0dXBfcGF0aHMoZ2V0X3BhdGhzcGVjKHByZWZpeCwgKGNvbnN0IGNoYXIgKiopYXJndiksICZvcHQpOworCW9wdC5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfQ0FMTEJBQ0s7CisJb3B0LmZvcm1hdF9jYWxsYmFjayA9IHVwZGF0ZV9pbmRleF9mcm9tX2RpZmY7CisJb3B0LmZvcm1hdF9jYWxsYmFja19kYXRhID0gJmluZGV4X3dhc19kaXNjYXJkZWQ7CisKKwlpbmRleF9mZCA9IGhvbGRfbG9ja2VkX2luZGV4KGxvY2ssIDEpOworCWluZGV4X3dhc19kaXNjYXJkZWQgPSAwOworCXJlYWRfY2FjaGUoKTsKKwlpZiAoZG9fZGlmZl9jYWNoZSh0cmVlX3NoYTEsICZvcHQpKQorCQlyZXR1cm4gMTsKKwlkaWZmY29yZV9zdGQoJm9wdCk7CisJZGlmZl9mbHVzaCgmb3B0KTsKKwlkaWZmX3RyZWVfcmVsZWFzZV9wYXRocygmb3B0KTsKKworCWlmICghaW5kZXhfd2FzX2Rpc2NhcmRlZCkKKwkJLyogVGhlIGluZGV4IGlzIHN0aWxsIGNsb2JiZXJlZCBmcm9tIGRvX2RpZmZfY2FjaGUoKSAqLworCQlkaXNjYXJkX2NhY2hlKCk7CisJcmV0dXJuIHVwZGF0ZV9pbmRleF9yZWZyZXNoKGluZGV4X2ZkLCBsb2NrKTsKK30KKworc3RhdGljIHZvaWQgcHJlcGVuZF9yZWZsb2dfYWN0aW9uKGNvbnN0IGNoYXIgKmFjdGlvbiwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwljb25zdCBjaGFyICpzZXAgPSAiOiAiOworCWNvbnN0IGNoYXIgKnJsYSA9IGdldGVudigiR0lUX1JFRkxPR19BQ1RJT04iKTsKKwlpZiAoIXJsYSkKKwkJcmxhID0gc2VwID0gIiI7CisJaWYgKHNucHJpbnRmKGJ1Ziwgc2l6ZSwgIiVzJXMlcyIsIHJsYSwgc2VwLCBhY3Rpb24pID49IHNpemUpCisJCXdhcm5pbmcoIlJlZmxvZyBhY3Rpb24gbWVzc2FnZSB0b28gbG9uZzogJS4qcy4uLiIsIDUwLCBidWYpOworfQorCitlbnVtIHJlc2V0X3R5cGUgeyBNSVhFRCwgU09GVCwgSEFSRCwgTk9ORSB9Oworc3RhdGljIGNvbnN0IGNoYXIgKnJlc2V0X3R5cGVfbmFtZXNbXSA9IHsgIm1peGVkIiwgInNvZnQiLCAiaGFyZCIsIE5VTEwgfTsKKworaW50IGNtZF9yZXNldChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaSA9IDAsIHJlc2V0X3R5cGUgPSBOT05FLCB1cGRhdGVfcmVmX3N0YXR1cyA9IDAsIHF1aWV0ID0gMDsKKwljb25zdCBjaGFyICpyZXYgPSAiSEVBRCI7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXSwgKm9yaWcgPSBOVUxMLCBzaGExX29yaWdbMjBdLAorCQkJCSpvbGRfb3JpZyA9IE5VTEwsIHNoYTFfb2xkX29yaWdbMjBdOworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwljaGFyICpyZWZsb2dfYWN0aW9uLCBtc2dbMTAyNF07CisJY29uc3Qgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisJCU9QVF9TRVRfSU5UKDAsICJtaXhlZCIsICZyZXNldF90eXBlLAorCQkJCQkJInJlc2V0IEhFQUQgYW5kIGluZGV4IiwgTUlYRUQpLAorCQlPUFRfU0VUX0lOVCgwLCAic29mdCIsICZyZXNldF90eXBlLCAicmVzZXQgb25seSBIRUFEIiwgU09GVCksCisJCU9QVF9TRVRfSU5UKDAsICJoYXJkIiwgJnJlc2V0X3R5cGUsCisJCQkJInJlc2V0IEhFQUQsIGluZGV4IGFuZCB3b3JraW5nIHRyZWUiLCBIQVJEKSwKKwkJT1BUX0JPT0xFQU4oJ3EnLCBOVUxMLCAmcXVpZXQsCisJCQkJImRpc2FibGUgc2hvd2luZyBuZXcgSEVBRCBpbiBoYXJkIHJlc2V0IiksCisJCU9QVF9FTkQoKQorCX07CisKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBvcHRpb25zLCBnaXRfcmVzZXRfdXNhZ2UsCisJCQkJCQlQQVJTRV9PUFRfS0VFUF9EQVNIREFTSCk7CisJcmVmbG9nX2FjdGlvbiA9IGFyZ3NfdG9fc3RyKGFyZ3YpOworCXNldGVudigiR0lUX1JFRkxPR19BQ1RJT04iLCByZWZsb2dfYWN0aW9uLCAwKTsKKworCWlmIChpIDwgYXJnYyAmJiBzdHJjbXAoYXJndltpXSwgIi0tIikpCisJCXJldiA9IGFyZ3ZbaSsrXTsKKworCWlmIChnZXRfc2hhMShyZXYsIHNoYTEpKQorCQlkaWUoIkZhaWxlZCB0byByZXNvbHZlICclcycgYXMgYSB2YWxpZCByZWYuIiwgcmV2KTsKKworCWNvbW1pdCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKHNoYTEpOworCWlmICghY29tbWl0KQorCQlkaWUoIkNvdWxkIG5vdCBwYXJzZSBvYmplY3QgJyVzJy4iLCByZXYpOworCWhhc2hjcHkoc2hhMSwgY29tbWl0LT5vYmplY3Quc2hhMSk7CisKKwlpZiAoaSA8IGFyZ2MgJiYgIXN0cmNtcChhcmd2W2ldLCAiLS0iKSkKKwkJaSsrOworCisJLyogZ2l0IHJlc2V0IHRyZWUgWy0tXSBwYXRocy4uLiBjYW4gYmUgdXNlZCB0bworCSAqIGxvYWQgY2hvc2VuIHBhdGhzIGZyb20gdGhlIHRyZWUgaW50byB0aGUgaW5kZXggd2l0aG91dAorCSAqIGFmZmVjdGluZyB0aGUgd29ya2luZyB0cmVlIG5vciBIRUFELiAqLworCWlmIChpIDwgYXJnYykgeworCQlpZiAocmVzZXRfdHlwZSA9PSBNSVhFRCkKKwkJCXdhcm5pbmcoIi0tbWl4ZWQgb3B0aW9uIGlzIGRlcHJlY2F0ZWQgd2l0aCBwYXRocy4iKTsKKwkJZWxzZSBpZiAocmVzZXRfdHlwZSAhPSBOT05FKQorCQkJZGllKCJDYW5ub3QgZG8gJXMgcmVzZXQgd2l0aCBwYXRocy4iLAorCQkJCQlyZXNldF90eXBlX25hbWVzW3Jlc2V0X3R5cGVdKTsKKwkJcmV0dXJuIHJlYWRfZnJvbV90cmVlKHByZWZpeCwgYXJndiArIGksIHNoYTEpOworCX0KKwlpZiAocmVzZXRfdHlwZSA9PSBOT05FKQorCQlyZXNldF90eXBlID0gTUlYRUQ7IC8qIGJ5IGRlZmF1bHQgKi8KKworCWlmIChyZXNldF90eXBlID09IEhBUkQgJiYgaXNfYmFyZV9yZXBvc2l0b3J5KCkpCisJCWRpZSgiaGFyZCByZXNldCBtYWtlcyBubyBzZW5zZSBpbiBhIGJhcmUgcmVwb3NpdG9yeSIpOworCisJLyogU29mdCByZXNldCBkb2VzIG5vdCB0b3VjaCB0aGUgaW5kZXggZmlsZSBub3IgdGhlIHdvcmtpbmcgdHJlZQorCSAqIGF0IGFsbCwgYnV0IHJlcXVpcmVzIHRoZW0gaW4gYSBnb29kIG9yZGVyLiAgT3RoZXIgcmVzZXRzIHJlc2V0CisJICogdGhlIGluZGV4IGZpbGUgdG8gdGhlIHRyZWUgb2JqZWN0IHdlIGFyZSBzd2l0Y2hpbmcgdG8uICovCisJaWYgKHJlc2V0X3R5cGUgPT0gU09GVCkgeworCQlpZiAoaXNfbWVyZ2UoKSB8fCByZWFkX2NhY2hlKCkgPCAwIHx8IHVubWVyZ2VkX2NhY2hlKCkpCisJCQlkaWUoIkNhbm5vdCBkbyBhIHNvZnQgcmVzZXQgaW4gdGhlIG1pZGRsZSBvZiBhIG1lcmdlLiIpOworCX0KKwllbHNlIGlmIChyZXNldF9pbmRleF9maWxlKHNoYTEsIChyZXNldF90eXBlID09IEhBUkQpKSkKKwkJZGllKCJDb3VsZCBub3QgcmVzZXQgaW5kZXggZmlsZSB0byByZXZpc2lvbiAnJXMnLiIsIHJldik7CisKKwkvKiBBbnkgcmVzZXRzIHVwZGF0ZSBIRUFEIHRvIHRoZSBoZWFkIGJlaW5nIHN3aXRjaGVkIHRvLAorCSAqIHNhdmluZyB0aGUgcHJldmlvdXMgaGVhZCBpbiBPUklHX0hFQUQgYmVmb3JlLiAqLworCWlmICghZ2V0X3NoYTEoIk9SSUdfSEVBRCIsIHNoYTFfb2xkX29yaWcpKQorCQlvbGRfb3JpZyA9IHNoYTFfb2xkX29yaWc7CisJaWYgKCFnZXRfc2hhMSgiSEVBRCIsIHNoYTFfb3JpZykpIHsKKwkJb3JpZyA9IHNoYTFfb3JpZzsKKwkJcHJlcGVuZF9yZWZsb2dfYWN0aW9uKCJ1cGRhdGluZyBPUklHX0hFQUQiLCBtc2csIHNpemVvZihtc2cpKTsKKwkJdXBkYXRlX3JlZihtc2csICJPUklHX0hFQUQiLCBvcmlnLCBvbGRfb3JpZywgMCwgTVNHX09OX0VSUik7CisJfQorCWVsc2UgaWYgKG9sZF9vcmlnKQorCQlkZWxldGVfcmVmKCJPUklHX0hFQUQiLCBvbGRfb3JpZyk7CisJcHJlcGVuZF9yZWZsb2dfYWN0aW9uKCJ1cGRhdGluZyBIRUFEIiwgbXNnLCBzaXplb2YobXNnKSk7CisJdXBkYXRlX3JlZl9zdGF0dXMgPSB1cGRhdGVfcmVmKG1zZywgIkhFQUQiLCBzaGExLCBvcmlnLCAwLCBNU0dfT05fRVJSKTsKKworCXN3aXRjaCAocmVzZXRfdHlwZSkgeworCWNhc2UgSEFSRDoKKwkJaWYgKCF1cGRhdGVfcmVmX3N0YXR1cyAmJiAhcXVpZXQpCisJCQlwcmludF9uZXdfaGVhZF9saW5lKGNvbW1pdCk7CisJCWJyZWFrOworCWNhc2UgU09GVDogLyogTm90aGluZyBlbHNlIHRvIGRvLiAqLworCQlicmVhazsKKwljYXNlIE1JWEVEOiAvKiBSZXBvcnQgd2hhdCBoYXMgbm90IGJlZW4gdXBkYXRlZC4gKi8KKwkJdXBkYXRlX2luZGV4X3JlZnJlc2goMCwgTlVMTCk7CisJCWJyZWFrOworCX0KKworCXJlbW92ZV9icmFuY2hfc3RhdGUoKTsKKworCWZyZWUocmVmbG9nX2FjdGlvbik7CisKKwlyZXR1cm4gdXBkYXRlX3JlZl9zdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXJldi1saXN0LmMgYi9idWlsdGluLXJldi1saXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRjMGJkMwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tcmV2LWxpc3QuYwpAQCAtMCwwICsxLDY3MCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgInJldmlzaW9uLmgiCisjaW5jbHVkZSAibGlzdC1vYmplY3RzLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImxvZy10cmVlLmgiCisKKy8qIGJpdHMgIzAtMTUgaW4gcmV2aXNpb24uaCAqLworCisjZGVmaW5lIENPVU5URUQJCSgxdTw8MTYpCisKK3N0YXRpYyBjb25zdCBjaGFyIHJldl9saXN0X3VzYWdlW10gPQorImdpdC1yZXYtbGlzdCBbT1BUSU9OXSA8Y29tbWl0LWlkPi4uLiBbIC0tIHBhdGhzLi4uIF1cbiIKKyIgIGxpbWl0aW5nIG91dHB1dDpcbiIKKyIgICAgLS1tYXgtY291bnQ9bnJcbiIKKyIgICAgLS1tYXgtYWdlPWVwb2NoXG4iCisiICAgIC0tbWluLWFnZT1lcG9jaFxuIgorIiAgICAtLXNwYXJzZVxuIgorIiAgICAtLW5vLW1lcmdlc1xuIgorIiAgICAtLXJlbW92ZS1lbXB0eVxuIgorIiAgICAtLWFsbFxuIgorIiAgICAtLWJyYW5jaGVzXG4iCisiICAgIC0tdGFnc1xuIgorIiAgICAtLXJlbW90ZXNcbiIKKyIgICAgLS1zdGRpblxuIgorIiAgICAtLXF1aWV0XG4iCisiICBvcmRlcmluZyBvdXRwdXQ6XG4iCisiICAgIC0tdG9wby1vcmRlclxuIgorIiAgICAtLWRhdGUtb3JkZXJcbiIKKyIgICAgLS1yZXZlcnNlXG4iCisiICBmb3JtYXR0aW5nIG91dHB1dDpcbiIKKyIgICAgLS1wYXJlbnRzXG4iCisiICAgIC0tb2JqZWN0cyB8IC0tb2JqZWN0cy1lZGdlXG4iCisiICAgIC0tdW5wYWNrZWRcbiIKKyIgICAgLS1oZWFkZXIgfCAtLXByZXR0eVxuIgorIiAgICAtLWFiYnJldj1uciB8IC0tbm8tYWJicmV2XG4iCisiICAgIC0tYWJicmV2LWNvbW1pdFxuIgorIiAgICAtLWxlZnQtcmlnaHRcbiIKKyIgIHNwZWNpYWwgcHVycG9zZTpcbiIKKyIgICAgLS1iaXNlY3RcbiIKKyIgICAgLS1iaXNlY3QtdmFyc1xuIgorIiAgICAtLWJpc2VjdC1hbGwiCis7CisKK3N0YXRpYyBzdHJ1Y3QgcmV2X2luZm8gcmV2czsKKworc3RhdGljIGludCBiaXNlY3RfbGlzdDsKK3N0YXRpYyBpbnQgc2hvd190aW1lc3RhbXA7CitzdGF0aWMgaW50IGhkcl90ZXJtaW5hdGlvbjsKK3N0YXRpYyBjb25zdCBjaGFyICpoZWFkZXJfcHJlZml4OworCitzdGF0aWMgdm9pZCBmaW5pc2hfY29tbWl0KHN0cnVjdCBjb21taXQgKmNvbW1pdCk7CitzdGF0aWMgdm9pZCBzaG93X2NvbW1pdChzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJaWYgKHNob3dfdGltZXN0YW1wKQorCQlwcmludGYoIiVsdSAiLCBjb21taXQtPmRhdGUpOworCWlmIChoZWFkZXJfcHJlZml4KQorCQlmcHV0cyhoZWFkZXJfcHJlZml4LCBzdGRvdXQpOworCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIEJPVU5EQVJZKQorCQlwdXRjaGFyKCctJyk7CisJZWxzZSBpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQlwdXRjaGFyKCdeJyk7CisJZWxzZSBpZiAocmV2cy5sZWZ0X3JpZ2h0KSB7CisJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIFNZTU1FVFJJQ19MRUZUKQorCQkJcHV0Y2hhcignPCcpOworCQllbHNlCisJCQlwdXRjaGFyKCc+Jyk7CisJfQorCWlmIChyZXZzLmFiYnJldl9jb21taXQgJiYgcmV2cy5hYmJyZXYpCisJCWZwdXRzKGZpbmRfdW5pcXVlX2FiYnJldihjb21taXQtPm9iamVjdC5zaGExLCByZXZzLmFiYnJldiksCisJCSAgICAgIHN0ZG91dCk7CisJZWxzZQorCQlmcHV0cyhzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSwgc3Rkb3V0KTsKKwlpZiAocmV2cy5wYXJlbnRzKSB7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsKKwkJd2hpbGUgKHBhcmVudHMpIHsKKwkJCXByaW50ZigiICVzIiwgc2hhMV90b19oZXgocGFyZW50cy0+aXRlbS0+b2JqZWN0LnNoYTEpKTsKKwkJCXBhcmVudHMgPSBwYXJlbnRzLT5uZXh0OworCQl9CisJfQorCXNob3dfZGVjb3JhdGlvbnMoY29tbWl0KTsKKwlpZiAocmV2cy5jb21taXRfZm9ybWF0ID09IENNSVRfRk1UX09ORUxJTkUpCisJCXB1dGNoYXIoJyAnKTsKKwllbHNlCisJCXB1dGNoYXIoJ1xuJyk7CisKKwlpZiAocmV2cy52ZXJib3NlX2hlYWRlciAmJiBjb21taXQtPmJ1ZmZlcikgeworCQlzdHJ1Y3Qgc3RyYnVmIGJ1ZjsKKwkJc3RyYnVmX2luaXQoJmJ1ZiwgMCk7CisJCXByZXR0eV9wcmludF9jb21taXQocmV2cy5jb21taXRfZm9ybWF0LCBjb21taXQsCisJCQkJICAgICZidWYsIHJldnMuYWJicmV2LCBOVUxMLCBOVUxMLAorCQkJCSAgICByZXZzLmRhdGVfbW9kZSwgMCk7CisJCWlmIChidWYubGVuKQorCQkJcHJpbnRmKCIlcyVjIiwgYnVmLmJ1ZiwgaGRyX3Rlcm1pbmF0aW9uKTsKKwkJc3RyYnVmX3JlbGVhc2UoJmJ1Zik7CisJfQorCW1heWJlX2ZsdXNoX29yX2RpZShzdGRvdXQsICJzdGRvdXQiKTsKKwlmaW5pc2hfY29tbWl0KGNvbW1pdCk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmlzaF9jb21taXQoc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCWlmIChjb21taXQtPnBhcmVudHMpIHsKKwkJZnJlZV9jb21taXRfbGlzdChjb21taXQtPnBhcmVudHMpOworCQljb21taXQtPnBhcmVudHMgPSBOVUxMOworCX0KKwlmcmVlKGNvbW1pdC0+YnVmZmVyKTsKKwljb21taXQtPmJ1ZmZlciA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmlzaF9vYmplY3Qoc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSAqcCkKK3sKKwlpZiAocC0+aXRlbS0+dHlwZSA9PSBPQkpfQkxPQiAmJiAhaGFzX3NoYTFfZmlsZShwLT5pdGVtLT5zaGExKSkKKwkJZGllKCJtaXNzaW5nIGJsb2Igb2JqZWN0ICclcyciLCBzaGExX3RvX2hleChwLT5pdGVtLT5zaGExKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfb2JqZWN0KHN0cnVjdCBvYmplY3RfYXJyYXlfZW50cnkgKnApCit7CisJLyogQW4gb2JqZWN0IHdpdGggbmFtZSAiZm9vXG4wMDAwMDAwLi4uIiBjYW4gYmUgdXNlZCB0bworCSAqIGNvbmZ1c2UgZG93bnN0cmVhbSBnaXQtcGFjay1vYmplY3RzIHZlcnkgYmFkbHkuCisJICovCisJY29uc3QgY2hhciAqZXAgPSBzdHJjaHIocC0+bmFtZSwgJ1xuJyk7CisKKwlmaW5pc2hfb2JqZWN0KHApOworCWlmIChlcCkgeworCQlwcmludGYoIiVzICUuKnNcbiIsIHNoYTFfdG9faGV4KHAtPml0ZW0tPnNoYTEpLAorCQkgICAgICAgKGludCkgKGVwIC0gcC0+bmFtZSksCisJCSAgICAgICBwLT5uYW1lKTsKKwl9CisJZWxzZQorCQlwcmludGYoIiVzICVzXG4iLCBzaGExX3RvX2hleChwLT5pdGVtLT5zaGExKSwgcC0+bmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfZWRnZShzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJcHJpbnRmKCItJXNcbiIsIHNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKK30KKworLyoKKyAqIFRoaXMgaXMgYSB0cnVseSBzdHVwaWQgYWxnb3JpdGhtLCBidXQgaXQncyBvbmx5CisgKiB1c2VkIGZvciBiaXNlY3Rpb24sIGFuZCB3ZSBqdXN0IGRvbid0IGNhcmUgZW5vdWdoLgorICoKKyAqIFdlIGNhcmUganVzdCBiYXJlbHkgZW5vdWdoIHRvIGF2b2lkIHJlY3Vyc2luZyBmb3IKKyAqIG5vbi1tZXJnZSBlbnRyaWVzLgorICovCitzdGF0aWMgaW50IGNvdW50X2Rpc3RhbmNlKHN0cnVjdCBjb21taXRfbGlzdCAqZW50cnkpCit7CisJaW50IG5yID0gMDsKKworCXdoaWxlIChlbnRyeSkgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBlbnRyeS0+aXRlbTsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICpwOworCisJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIChVTklOVEVSRVNUSU5HIHwgQ09VTlRFRCkpCisJCQlicmVhazsKKwkJaWYgKCEoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBUUkVFU0FNRSkpCisJCQlucisrOworCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBDT1VOVEVEOworCQlwID0gY29tbWl0LT5wYXJlbnRzOworCQllbnRyeSA9IHA7CisJCWlmIChwKSB7CisJCQlwID0gcC0+bmV4dDsKKwkJCXdoaWxlIChwKSB7CisJCQkJbnIgKz0gY291bnRfZGlzdGFuY2UocCk7CisJCQkJcCA9IHAtPm5leHQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gbnI7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX2Rpc3RhbmNlKHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCkKK3sKKwl3aGlsZSAobGlzdCkgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsaXN0LT5pdGVtOworCQljb21taXQtPm9iamVjdC5mbGFncyAmPSB+Q09VTlRFRDsKKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJfQorfQorCisjZGVmaW5lIERFQlVHX0JJU0VDVCAwCisKK3N0YXRpYyBpbmxpbmUgaW50IHdlaWdodChzdHJ1Y3QgY29tbWl0X2xpc3QgKmVsZW0pCit7CisJcmV0dXJuICooKGludCopKGVsZW0tPml0ZW0tPnV0aWwpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdlaWdodF9zZXQoc3RydWN0IGNvbW1pdF9saXN0ICplbGVtLCBpbnQgd2VpZ2h0KQoreworCSooKGludCopKGVsZW0tPml0ZW0tPnV0aWwpKSA9IHdlaWdodDsKK30KKworc3RhdGljIGludCBjb3VudF9pbnRlcmVzdGluZ19wYXJlbnRzKHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnA7CisJaW50IGNvdW50OworCisJZm9yIChjb3VudCA9IDAsIHAgPSBjb21taXQtPnBhcmVudHM7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWlmIChwLT5pdGVtLT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQkJY29udGludWU7CisJCWNvdW50Kys7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGFsZndheShzdHJ1Y3QgY29tbWl0X2xpc3QgKnAsIGludCBucikKK3sKKwkvKgorCSAqIERvbid0IHNob3J0LWN1dCBzb21ldGhpbmcgd2UgYXJlIG5vdCBnb2luZyB0byByZXR1cm4hCisJICovCisJaWYgKHAtPml0ZW0tPm9iamVjdC5mbGFncyAmIFRSRUVTQU1FKQorCQlyZXR1cm4gMDsKKwlpZiAoREVCVUdfQklTRUNUKQorCQlyZXR1cm4gMDsKKwkvKgorCSAqIDIgYW5kIDMgYXJlIGhhbGZ3YXkgb2YgNS4KKwkgKiAzIGlzIGhhbGZ3YXkgb2YgNiBidXQgMiBhbmQgNCBhcmUgbm90LgorCSAqLworCXN3aXRjaCAoMiAqIHdlaWdodChwKSAtIG5yKSB7CisJY2FzZSAtMTogY2FzZSAwOiBjYXNlIDE6CisJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworI2lmICFERUJVR19CSVNFQ1QKKyNkZWZpbmUgc2hvd19saXN0KGEsYixjLGQpIGRvIHsgOyB9IHdoaWxlICgwKQorI2Vsc2UKK3N0YXRpYyB2b2lkIHNob3dfbGlzdChjb25zdCBjaGFyICpkZWJ1ZywgaW50IGNvdW50ZWQsIGludCBuciwKKwkJICAgICAgc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0KQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqcDsKKworCWZwcmludGYoc3RkZXJyLCAiJXMgKCVkLyVkKVxuIiwgZGVidWcsIGNvdW50ZWQsIG5yKTsKKworCWZvciAocCA9IGxpc3Q7IHA7IHAgPSBwLT5uZXh0KSB7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqcHA7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IHAtPml0ZW07CisJCXVuc2lnbmVkIGZsYWdzID0gY29tbWl0LT5vYmplY3QuZmxhZ3M7CisJCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwkJdW5zaWduZWQgbG9uZyBzaXplOworCQljaGFyICpidWYgPSByZWFkX3NoYTFfZmlsZShjb21taXQtPm9iamVjdC5zaGExLCAmdHlwZSwgJnNpemUpOworCQljaGFyICplcCwgKnNwOworCisJCWZwcmludGYoc3RkZXJyLCAiJWMlYyVjICIsCisJCQkoZmxhZ3MgJiBUUkVFU0FNRSkgPyAnICcgOiAnVCcsCisJCQkoZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSA/ICdVJyA6ICcgJywKKwkJCShmbGFncyAmIENPVU5URUQpID8gJ0MnIDogJyAnKTsKKwkJaWYgKGNvbW1pdC0+dXRpbCkKKwkJCWZwcmludGYoc3RkZXJyLCAiJTNkIiwgd2VpZ2h0KHApKTsKKwkJZWxzZQorCQkJZnByaW50ZihzdGRlcnIsICItLS0iKTsKKwkJZnByaW50ZihzdGRlcnIsICIgJS4qcyIsIDgsIHNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKwkJZm9yIChwcCA9IGNvbW1pdC0+cGFyZW50czsgcHA7IHBwID0gcHAtPm5leHQpCisJCQlmcHJpbnRmKHN0ZGVyciwgIiAlLipzIiwgOCwKKwkJCQlzaGExX3RvX2hleChwcC0+aXRlbS0+b2JqZWN0LnNoYTEpKTsKKworCQlzcCA9IHN0cnN0cihidWYsICJcblxuIik7CisJCWlmIChzcCkgeworCQkJc3AgKz0gMjsKKwkJCWZvciAoZXAgPSBzcDsgKmVwICYmICplcCAhPSAnXG4nOyBlcCsrKQorCQkJCTsKKwkJCWZwcmludGYoc3RkZXJyLCAiICUuKnMiLCAoaW50KShlcCAtIHNwKSwgc3ApOworCQl9CisJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwl9Cit9CisjZW5kaWYgLyogREVCVUdfQklTRUNUICovCisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0X2xpc3QgKmJlc3RfYmlzZWN0aW9uKHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCwgaW50IG5yKQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqcCwgKmJlc3Q7CisJaW50IGJlc3RfZGlzdGFuY2UgPSAtMTsKKworCWJlc3QgPSBsaXN0OworCWZvciAocCA9IGxpc3Q7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWludCBkaXN0YW5jZTsKKwkJdW5zaWduZWQgZmxhZ3MgPSBwLT5pdGVtLT5vYmplY3QuZmxhZ3M7CisKKwkJaWYgKGZsYWdzICYgVFJFRVNBTUUpCisJCQljb250aW51ZTsKKwkJZGlzdGFuY2UgPSB3ZWlnaHQocCk7CisJCWlmIChuciAtIGRpc3RhbmNlIDwgZGlzdGFuY2UpCisJCQlkaXN0YW5jZSA9IG5yIC0gZGlzdGFuY2U7CisJCWlmIChkaXN0YW5jZSA+IGJlc3RfZGlzdGFuY2UpIHsKKwkJCWJlc3QgPSBwOworCQkJYmVzdF9kaXN0YW5jZSA9IGRpc3RhbmNlOworCQl9CisJfQorCisJcmV0dXJuIGJlc3Q7Cit9CisKK3N0cnVjdCBjb21taXRfZGlzdCB7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCWludCBkaXN0YW5jZTsKK307CisKK3N0YXRpYyBpbnQgY29tcGFyZV9jb21taXRfZGlzdChjb25zdCB2b2lkICphXywgY29uc3Qgdm9pZCAqYl8pCit7CisJc3RydWN0IGNvbW1pdF9kaXN0ICphLCAqYjsKKworCWEgPSAoc3RydWN0IGNvbW1pdF9kaXN0ICopYV87CisJYiA9IChzdHJ1Y3QgY29tbWl0X2Rpc3QgKiliXzsKKwlpZiAoYS0+ZGlzdGFuY2UgIT0gYi0+ZGlzdGFuY2UpCisJCXJldHVybiBiLT5kaXN0YW5jZSAtIGEtPmRpc3RhbmNlOyAvKiBkZXNjIHNvcnQgKi8KKwlyZXR1cm4gaGFzaGNtcChhLT5jb21taXQtPm9iamVjdC5zaGExLCBiLT5jb21taXQtPm9iamVjdC5zaGExKTsKK30KKworc3RhdGljIHN0cnVjdCBjb21taXRfbGlzdCAqYmVzdF9iaXNlY3Rpb25fc29ydGVkKHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCwgaW50IG5yKQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqcDsKKwlzdHJ1Y3QgY29tbWl0X2Rpc3QgKmFycmF5ID0geGNhbGxvYyhuciwgc2l6ZW9mKCphcnJheSkpOworCWludCBjbnQsIGk7CisKKwlmb3IgKHAgPSBsaXN0LCBjbnQgPSAwOyBwOyBwID0gcC0+bmV4dCkgeworCQlpbnQgZGlzdGFuY2U7CisJCXVuc2lnbmVkIGZsYWdzID0gcC0+aXRlbS0+b2JqZWN0LmZsYWdzOworCisJCWlmIChmbGFncyAmIFRSRUVTQU1FKQorCQkJY29udGludWU7CisJCWRpc3RhbmNlID0gd2VpZ2h0KHApOworCQlpZiAobnIgLSBkaXN0YW5jZSA8IGRpc3RhbmNlKQorCQkJZGlzdGFuY2UgPSBuciAtIGRpc3RhbmNlOworCQlhcnJheVtjbnRdLmNvbW1pdCA9IHAtPml0ZW07CisJCWFycmF5W2NudF0uZGlzdGFuY2UgPSBkaXN0YW5jZTsKKwkJY250Kys7CisJfQorCXFzb3J0KGFycmF5LCBjbnQsIHNpemVvZigqYXJyYXkpLCBjb21wYXJlX2NvbW1pdF9kaXN0KTsKKwlmb3IgKHAgPSBsaXN0LCBpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCXN0cnVjdCBuYW1lX2RlY29yYXRpb24gKnIgPSB4bWFsbG9jKHNpemVvZigqcikgKyAxMDApOworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSAmKGFycmF5W2ldLmNvbW1pdC0+b2JqZWN0KTsKKworCQlzcHJpbnRmKHItPm5hbWUsICJkaXN0PSVkIiwgYXJyYXlbaV0uZGlzdGFuY2UpOworCQlyLT5uZXh0ID0gYWRkX2RlY29yYXRpb24oJm5hbWVfZGVjb3JhdGlvbiwgb2JqLCByKTsKKwkJcC0+aXRlbSA9IGFycmF5W2ldLmNvbW1pdDsKKwkJcCA9IHAtPm5leHQ7CisJfQorCWlmIChwKQorCQlwLT5uZXh0ID0gTlVMTDsKKwlmcmVlKGFycmF5KTsKKwlyZXR1cm4gbGlzdDsKK30KKworLyoKKyAqIHplcm8gb3IgcG9zaXRpdmUgd2VpZ2h0IGlzIHRoZSBudW1iZXIgb2YgaW50ZXJlc3RpbmcgY29tbWl0cyBpdCBjYW4KKyAqIHJlYWNoLCBpbmNsdWRpbmcgaXRzZWxmLiAgRXNwZWNpYWxseSwgd2VpZ2h0ID0gMCBtZWFucyBpdCBkb2VzIG5vdAorICogcmVhY2ggYW55IHRyZWUtY2hhbmdpbmcgY29tbWl0cyAoZS5nLiBqdXN0IGFib3ZlIHVuaW50ZXJlc3Rpbmcgb25lCisgKiBidXQgdHJhdmVyc2FsIGlzIHdpdGggcGF0aHNwZWMpLgorICoKKyAqIHdlaWdodCA9IC0xIG1lYW5zIGl0IGhhcyBvbmUgcGFyZW50IGFuZCBpdHMgZGlzdGFuY2UgaXMgeWV0IHRvCisgKiBiZSBjb21wdXRlZC4KKyAqCisgKiB3ZWlnaHQgPSAtMiBtZWFucyBpdCBoYXMgbW9yZSB0aGFuIG9uZSBwYXJlbnQgYW5kIGl0cyBkaXN0YW5jZSBpcworICogdW5rbm93bi4gIEFmdGVyIHJ1bm5pbmcgY291bnRfZGlzdGFuY2UoKSBmaXJzdCwgdGhleSB3aWxsIGdldCB6ZXJvCisgKiBvciBwb3NpdGl2ZSBkaXN0YW5jZS4KKyAqLworc3RhdGljIHN0cnVjdCBjb21taXRfbGlzdCAqZG9fZmluZF9iaXNlY3Rpb24oc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0LAorCQkJCQkgICAgIGludCBuciwgaW50ICp3ZWlnaHRzLAorCQkJCQkgICAgIGludCBmaW5kX2FsbCkKK3sKKwlpbnQgbiwgY291bnRlZDsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnA7CisKKwljb3VudGVkID0gMDsKKworCWZvciAobiA9IDAsIHAgPSBsaXN0OyBwOyBwID0gcC0+bmV4dCkgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBwLT5pdGVtOworCQl1bnNpZ25lZCBmbGFncyA9IGNvbW1pdC0+b2JqZWN0LmZsYWdzOworCisJCXAtPml0ZW0tPnV0aWwgPSAmd2VpZ2h0c1tuKytdOworCQlzd2l0Y2ggKGNvdW50X2ludGVyZXN0aW5nX3BhcmVudHMoY29tbWl0KSkgeworCQljYXNlIDA6CisJCQlpZiAoIShmbGFncyAmIFRSRUVTQU1FKSkgeworCQkJCXdlaWdodF9zZXQocCwgMSk7CisJCQkJY291bnRlZCsrOworCQkJCXNob3dfbGlzdCgiYmlzZWN0aW9uIDIgY291bnQgb25lIiwKKwkJCQkJICBjb3VudGVkLCBuciwgbGlzdCk7CisJCQl9CisJCQkvKgorCQkJICogb3RoZXJ3aXNlLCBpdCBpcyBrbm93biBub3QgdG8gcmVhY2ggYW55CisJCQkgKiB0cmVlLWNoYW5naW5nIGNvbW1pdCBhbmQgZ2V0cyB3ZWlnaHQgMC4KKwkJCSAqLworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXdlaWdodF9zZXQocCwgLTEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl3ZWlnaHRfc2V0KHAsIC0yKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJc2hvd19saXN0KCJiaXNlY3Rpb24gMiBpbml0aWFsaXplIiwgY291bnRlZCwgbnIsIGxpc3QpOworCisJLyoKKwkgKiBJZiB5b3UgaGF2ZSBvbmx5IG9uZSBwYXJlbnQgaW4gdGhlIHJlc3VsdGluZyBzZXQKKwkgKiB0aGVuIHlvdSBjYW4gcmVhY2ggb25lIGNvbW1pdCBtb3JlIHRoYW4gdGhhdCBwYXJlbnQKKwkgKiBjYW4gcmVhY2guICBTbyB3ZSBkbyBub3QgaGF2ZSB0byBydW4gdGhlIGV4cGVuc2l2ZQorCSAqIGNvdW50X2Rpc3RhbmNlKCkgZm9yIHNpbmdsZSBzdHJhbmQgb2YgcGVhcmxzLgorCSAqCisJICogSG93ZXZlciwgaWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBwYXJlbnRzLCB5b3UgY2Fubm90CisJICoganVzdCBhZGQgdGhlaXIgZGlzdGFuY2UgYW5kIG9uZSBmb3IgeW91cnNlbGYsIHNpbmNlCisJICogdGhleSB1c3VhbGx5IHJlYWNoIHRoZSBzYW1lIGFuY2VzdG9yIGFuZCB5b3Ugd291bGQKKwkgKiBlbmQgdXAgY291bnRpbmcgdGhlbSB0d2ljZSB0aGF0IHdheS4KKwkgKgorCSAqIFNvIHdlIHdpbGwgZmlyc3QgY291bnQgZGlzdGFuY2Ugb2YgbWVyZ2VzIHRoZSB1c3VhbAorCSAqIHdheSwgYW5kIHRoZW4gZmlsbCB0aGUgYmxhbmtzIHVzaW5nIGNoZWFwZXIgYWxnb3JpdGhtLgorCSAqLworCWZvciAocCA9IGxpc3Q7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWlmIChwLT5pdGVtLT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQkJY29udGludWU7CisJCWlmICh3ZWlnaHQocCkgIT0gLTIpCisJCQljb250aW51ZTsKKwkJd2VpZ2h0X3NldChwLCBjb3VudF9kaXN0YW5jZShwKSk7CisJCWNsZWFyX2Rpc3RhbmNlKGxpc3QpOworCisJCS8qIERvZXMgaXQgaGFwcGVuIHRvIGJlIGF0IGV4YWN0bHkgaGFsZi13YXk/ICovCisJCWlmICghZmluZF9hbGwgJiYgaGFsZndheShwLCBucikpCisJCQlyZXR1cm4gcDsKKwkJY291bnRlZCsrOworCX0KKworCXNob3dfbGlzdCgiYmlzZWN0aW9uIDIgY291bnRfZGlzdGFuY2UiLCBjb3VudGVkLCBuciwgbGlzdCk7CisKKwl3aGlsZSAoY291bnRlZCA8IG5yKSB7CisJCWZvciAocCA9IGxpc3Q7IHA7IHAgPSBwLT5uZXh0KSB7CisJCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnE7CisJCQl1bnNpZ25lZCBmbGFncyA9IHAtPml0ZW0tPm9iamVjdC5mbGFnczsKKworCQkJaWYgKDAgPD0gd2VpZ2h0KHApKQorCQkJCWNvbnRpbnVlOworCQkJZm9yIChxID0gcC0+aXRlbS0+cGFyZW50czsgcTsgcSA9IHEtPm5leHQpIHsKKwkJCQlpZiAocS0+aXRlbS0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykKKwkJCQkJY29udGludWU7CisJCQkJaWYgKDAgPD0gd2VpZ2h0KHEpKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghcSkKKwkJCQljb250aW51ZTsKKworCQkJLyoKKwkJCSAqIHdlaWdodCBmb3IgcCBpcyB1bmtub3duIGJ1dCBxIGlzIGtub3duLgorCQkJICogYWRkIG9uZSBmb3IgcCBpdHNlbGYgaWYgcCBpcyB0byBiZSBjb3VudGVkLAorCQkJICogb3RoZXJ3aXNlIGluaGVyaXQgaXQgZnJvbSBxIGRpcmVjdGx5LgorCQkJICovCisJCQlpZiAoIShmbGFncyAmIFRSRUVTQU1FKSkgeworCQkJCXdlaWdodF9zZXQocCwgd2VpZ2h0KHEpKzEpOworCQkJCWNvdW50ZWQrKzsKKwkJCQlzaG93X2xpc3QoImJpc2VjdGlvbiAyIGNvdW50IG9uZSIsCisJCQkJCSAgY291bnRlZCwgbnIsIGxpc3QpOworCQkJfQorCQkJZWxzZQorCQkJCXdlaWdodF9zZXQocCwgd2VpZ2h0KHEpKTsKKworCQkJLyogRG9lcyBpdCBoYXBwZW4gdG8gYmUgYXQgZXhhY3RseSBoYWxmLXdheT8gKi8KKwkJCWlmICghZmluZF9hbGwgJiYgaGFsZndheShwLCBucikpCisJCQkJcmV0dXJuIHA7CisJCX0KKwl9CisKKwlzaG93X2xpc3QoImJpc2VjdGlvbiAyIGNvdW50ZWQgYWxsIiwgY291bnRlZCwgbnIsIGxpc3QpOworCisJaWYgKCFmaW5kX2FsbCkKKwkJcmV0dXJuIGJlc3RfYmlzZWN0aW9uKGxpc3QsIG5yKTsKKwllbHNlCisJCXJldHVybiBiZXN0X2Jpc2VjdGlvbl9zb3J0ZWQobGlzdCwgbnIpOworfQorCitzdGF0aWMgc3RydWN0IGNvbW1pdF9saXN0ICpmaW5kX2Jpc2VjdGlvbihzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3QsCisJCQkJCSAgaW50ICpyZWFjaGVzLCBpbnQgKmFsbCwKKwkJCQkJICBpbnQgZmluZF9hbGwpCit7CisJaW50IG5yLCBvbl9saXN0OworCXN0cnVjdCBjb21taXRfbGlzdCAqcCwgKmJlc3QsICpuZXh0LCAqbGFzdDsKKwlpbnQgKndlaWdodHM7CisKKwlzaG93X2xpc3QoImJpc2VjdGlvbiAyIGVudHJ5IiwgMCwgMCwgbGlzdCk7CisKKwkvKgorCSAqIENvdW50IHRoZSBudW1iZXIgb2YgdG90YWwgYW5kIHRyZWUtY2hhbmdpbmcgaXRlbXMgb24gdGhlCisJICogbGlzdCwgd2hpbGUgcmV2ZXJzaW5nIHRoZSBsaXN0LgorCSAqLworCWZvciAobnIgPSBvbl9saXN0ID0gMCwgbGFzdCA9IE5VTEwsIHAgPSBsaXN0OworCSAgICAgcDsKKwkgICAgIHAgPSBuZXh0KSB7CisJCXVuc2lnbmVkIGZsYWdzID0gcC0+aXRlbS0+b2JqZWN0LmZsYWdzOworCisJCW5leHQgPSBwLT5uZXh0OworCQlpZiAoZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQkJY29udGludWU7CisJCXAtPm5leHQgPSBsYXN0OworCQlsYXN0ID0gcDsKKwkJaWYgKCEoZmxhZ3MgJiBUUkVFU0FNRSkpCisJCQlucisrOworCQlvbl9saXN0Kys7CisJfQorCWxpc3QgPSBsYXN0OworCXNob3dfbGlzdCgiYmlzZWN0aW9uIDIgc29ydGVkIiwgMCwgbnIsIGxpc3QpOworCisJKmFsbCA9IG5yOworCXdlaWdodHMgPSB4Y2FsbG9jKG9uX2xpc3QsIHNpemVvZigqd2VpZ2h0cykpOworCisJLyogRG8gdGhlIHJlYWwgd29yayBvZiBmaW5kaW5nIGJpc2VjdGlvbiBjb21taXQuICovCisJYmVzdCA9IGRvX2ZpbmRfYmlzZWN0aW9uKGxpc3QsIG5yLCB3ZWlnaHRzLCBmaW5kX2FsbCk7CisJaWYgKGJlc3QpIHsKKwkJaWYgKCFmaW5kX2FsbCkKKwkJCWJlc3QtPm5leHQgPSBOVUxMOworCQkqcmVhY2hlcyA9IHdlaWdodChiZXN0KTsKKwl9CisJZnJlZSh3ZWlnaHRzKTsKKwlyZXR1cm4gYmVzdDsKK30KKworc3RhdGljIHZvaWQgcmVhZF9yZXZpc2lvbnNfZnJvbV9zdGRpbihzdHJ1Y3QgcmV2X2luZm8gKnJldnMpCit7CisJY2hhciBsaW5lWzEwMDBdOworCisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgc3RkaW4pICE9IE5VTEwpIHsKKwkJaW50IGxlbiA9IHN0cmxlbihsaW5lKTsKKwkJaWYgKGxlbiAmJiBsaW5lW2xlbiAtIDFdID09ICdcbicpCisJCQlsaW5lWy0tbGVuXSA9IDA7CisJCWlmICghbGVuKQorCQkJYnJlYWs7CisJCWlmIChsaW5lWzBdID09ICctJykKKwkJCWRpZSgib3B0aW9ucyBub3Qgc3VwcG9ydGVkIGluIC0tc3RkaW4gbW9kZSIpOworCQlpZiAoaGFuZGxlX3JldmlzaW9uX2FyZyhsaW5lLCByZXZzLCAwLCAxKSkKKwkJCWRpZSgiYmFkIHJldmlzaW9uICclcyciLCBsaW5lKTsKKwl9Cit9CisKK2ludCBjbWRfcmV2X2xpc3QoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0OworCWludCBpOworCWludCByZWFkX2Zyb21fc3RkaW4gPSAwOworCWludCBiaXNlY3Rfc2hvd192YXJzID0gMDsKKwlpbnQgYmlzZWN0X2ZpbmRfYWxsID0gMDsKKwlpbnQgcXVpZXQgPSAwOworCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCWluaXRfcmV2aXNpb25zKCZyZXZzLCBwcmVmaXgpOworCXJldnMuYWJicmV2ID0gMDsKKwlyZXZzLmNvbW1pdF9mb3JtYXQgPSBDTUlUX0ZNVF9VTlNQRUNJRklFRDsKKwlhcmdjID0gc2V0dXBfcmV2aXNpb25zKGFyZ2MsIGFyZ3YsICZyZXZzLCBOVUxMKTsKKworCWZvciAoaSA9IDEgOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1oZWFkZXIiKSkgeworCQkJcmV2cy52ZXJib3NlX2hlYWRlciA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLXRpbWVzdGFtcCIpKSB7CisJCQlzaG93X3RpbWVzdGFtcCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWJpc2VjdCIpKSB7CisJCQliaXNlY3RfbGlzdCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWJpc2VjdC1hbGwiKSkgeworCQkJYmlzZWN0X2xpc3QgPSAxOworCQkJYmlzZWN0X2ZpbmRfYWxsID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tYmlzZWN0LXZhcnMiKSkgeworCQkJYmlzZWN0X2xpc3QgPSAxOworCQkJYmlzZWN0X3Nob3dfdmFycyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLXN0ZGluIikpIHsKKwkJCWlmIChyZWFkX2Zyb21fc3RkaW4rKykKKwkJCQlkaWUoIi0tc3RkaW4gZ2l2ZW4gdHdpY2U/Iik7CisJCQlyZWFkX3JldmlzaW9uc19mcm9tX3N0ZGluKCZyZXZzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tcXVpZXQiKSkgeworCQkJcXVpZXQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJdXNhZ2UocmV2X2xpc3RfdXNhZ2UpOworCisJfQorCWlmIChyZXZzLmNvbW1pdF9mb3JtYXQgIT0gQ01JVF9GTVRfVU5TUEVDSUZJRUQpIHsKKwkJLyogVGhlIGNvbW1hbmQgbGluZSBoYXMgYSAtLXByZXR0eSAgKi8KKwkJaGRyX3Rlcm1pbmF0aW9uID0gJ1xuJzsKKwkJaWYgKHJldnMuY29tbWl0X2Zvcm1hdCA9PSBDTUlUX0ZNVF9PTkVMSU5FKQorCQkJaGVhZGVyX3ByZWZpeCA9ICIiOworCQllbHNlCisJCQloZWFkZXJfcHJlZml4ID0gImNvbW1pdCAiOworCX0KKwllbHNlIGlmIChyZXZzLnZlcmJvc2VfaGVhZGVyKQorCQkvKiBPbmx5IC0taGVhZGVyIHdhcyBzcGVjaWZpZWQgKi8KKwkJcmV2cy5jb21taXRfZm9ybWF0ID0gQ01JVF9GTVRfUkFXOworCisJbGlzdCA9IHJldnMuY29tbWl0czsKKworCWlmICgoIWxpc3QgJiYKKwkgICAgICghKHJldnMudGFnX29iamVjdHN8fHJldnMudHJlZV9vYmplY3RzfHxyZXZzLmJsb2Jfb2JqZWN0cykgJiYKKwkgICAgICAhcmV2cy5wZW5kaW5nLm5yKSkgfHwKKwkgICAgcmV2cy5kaWZmKQorCQl1c2FnZShyZXZfbGlzdF91c2FnZSk7CisKKwlzYXZlX2NvbW1pdF9idWZmZXIgPSByZXZzLnZlcmJvc2VfaGVhZGVyIHx8IHJldnMuZ3JlcF9maWx0ZXI7CisJaWYgKGJpc2VjdF9saXN0KQorCQlyZXZzLmxpbWl0ZWQgPSAxOworCisJaWYgKHByZXBhcmVfcmV2aXNpb25fd2FsaygmcmV2cykpCisJCWRpZSgicmV2aXNpb24gd2FsayBzZXR1cCBmYWlsZWQiKTsKKwlpZiAocmV2cy50cmVlX29iamVjdHMpCisJCW1hcmtfZWRnZXNfdW5pbnRlcmVzdGluZyhyZXZzLmNvbW1pdHMsICZyZXZzLCBzaG93X2VkZ2UpOworCisJaWYgKGJpc2VjdF9saXN0KSB7CisJCWludCByZWFjaGVzID0gcmVhY2hlcywgYWxsID0gYWxsOworCisJCXJldnMuY29tbWl0cyA9IGZpbmRfYmlzZWN0aW9uKHJldnMuY29tbWl0cywgJnJlYWNoZXMsICZhbGwsCisJCQkJCSAgICAgIGJpc2VjdF9maW5kX2FsbCk7CisJCWlmIChiaXNlY3Rfc2hvd192YXJzKSB7CisJCQlpbnQgY250OworCQkJY2hhciBoZXhbNDFdOworCQkJaWYgKCFyZXZzLmNvbW1pdHMpCisJCQkJcmV0dXJuIDE7CisJCQkvKgorCQkJICogcmV2cy5jb21taXRzIGNhbiByZWFjaCAicmVhY2hlcyIgY29tbWl0cyBhbW9uZworCQkJICogImFsbCIgY29tbWl0cy4gIElmIGl0IGlzIGdvb2QsIHRoZW4gdGhlcmUgYXJlCisJCQkgKiAoYWxsLXJlYWNoZXMpIGNvbW1pdHMgbGVmdCB0byBiZSBiaXNlY3RlZC4KKwkJCSAqIE9uIHRoZSBvdGhlciBoYW5kLCBpZiBpdCBpcyBiYWQsIHRoZW4gdGhlIHNldAorCQkJICogdG8gYmlzZWN0IGlzICJyZWFjaGVzIi4KKwkJCSAqIEEgYmlzZWN0IHNldCBvZiBzaXplIE4gaGFzIChOLTEpIGNvbW1pdHMgZnVydGhlcgorCQkJICogdG8gdGVzdCwgYXMgd2UgYWxyZWFkeSBrbm93IG9uZSBiYWQgb25lLgorCQkJICovCisJCQljbnQgPSBhbGwgLSByZWFjaGVzOworCQkJaWYgKGNudCA8IHJlYWNoZXMpCisJCQkJY250ID0gcmVhY2hlczsKKwkJCXN0cmNweShoZXgsIHNoYTFfdG9faGV4KHJldnMuY29tbWl0cy0+aXRlbS0+b2JqZWN0LnNoYTEpKTsKKworCQkJaWYgKGJpc2VjdF9maW5kX2FsbCkgeworCQkJCXRyYXZlcnNlX2NvbW1pdF9saXN0KCZyZXZzLCBzaG93X2NvbW1pdCwgc2hvd19vYmplY3QpOworCQkJCXByaW50ZigiLS0tLS0tXG4iKTsKKwkJCX0KKworCQkJcHJpbnRmKCJiaXNlY3RfcmV2PSVzXG4iCisJCQkgICAgICAgImJpc2VjdF9ucj0lZFxuIgorCQkJICAgICAgICJiaXNlY3RfZ29vZD0lZFxuIgorCQkJICAgICAgICJiaXNlY3RfYmFkPSVkXG4iCisJCQkgICAgICAgImJpc2VjdF9hbGw9JWRcbiIsCisJCQkgICAgICAgaGV4LAorCQkJICAgICAgIGNudCAtIDEsCisJCQkgICAgICAgYWxsIC0gcmVhY2hlcyAtIDEsCisJCQkgICAgICAgcmVhY2hlcyAtIDEsCisJCQkgICAgICAgYWxsKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJdHJhdmVyc2VfY29tbWl0X2xpc3QoJnJldnMsCisJCXF1aWV0ID8gZmluaXNoX2NvbW1pdCA6IHNob3dfY29tbWl0LAorCQlxdWlldCA/IGZpbmlzaF9vYmplY3QgOiBzaG93X29iamVjdCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tcmV2LXBhcnNlLmMgYi9idWlsdGluLXJldi1wYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNTFkNTQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLXJldi1wYXJzZS5jCkBAIC0wLDAgKzEsNTc4IEBACisvKgorICogcmV2LXBhcnNlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJwYXJzZS1vcHRpb25zLmgiCisKKyNkZWZpbmUgRE9fUkVWUwkJMQorI2RlZmluZSBET19OT1JFVgkyCisjZGVmaW5lIERPX0ZMQUdTCTQKKyNkZWZpbmUgRE9fTk9ORkxBR1MJOAorc3RhdGljIGludCBmaWx0ZXIgPSB+MDsKKworc3RhdGljIGNvbnN0IGNoYXIgKmRlZjsKKworI2RlZmluZSBOT1JNQUwgMAorI2RlZmluZSBSRVZFUlNFRCAxCitzdGF0aWMgaW50IHNob3dfdHlwZSA9IE5PUk1BTDsKKworI2RlZmluZSBTSE9XX1NZTUJPTElDX0FTSVMgMQorI2RlZmluZSBTSE9XX1NZTUJPTElDX0ZVTEwgMgorc3RhdGljIGludCBzeW1ib2xpYzsKK3N0YXRpYyBpbnQgYWJicmV2Oworc3RhdGljIGludCBvdXRwdXRfc3E7CisKK3N0YXRpYyBpbnQgcmV2c19jb3VudDsKKworLyoKKyAqIFNvbWUgYXJndW1lbnRzIGFyZSByZWxldmFudCAicmV2aXNpb24iIGFyZ3VtZW50cywKKyAqIG90aGVycyBhcmUgYWJvdXQgb3V0cHV0IGZvcm1hdCBvciBvdGhlciBkZXRhaWxzLgorICogVGhpcyBzb3J0cyBpdCBhbGwgb3V0LgorICovCitzdGF0aWMgaW50IGlzX3Jldl9hcmd1bWVudChjb25zdCBjaGFyICphcmcpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKnJldl9hcmdzW10gPSB7CisJCSItLWFsbCIsCisJCSItLWJpc2VjdCIsCisJCSItLWRlbnNlIiwKKwkJIi0tYnJhbmNoZXMiLAorCQkiLS1oZWFkZXIiLAorCQkiLS1tYXgtYWdlPSIsCisJCSItLW1heC1jb3VudD0iLAorCQkiLS1taW4tYWdlPSIsCisJCSItLW5vLW1lcmdlcyIsCisJCSItLW9iamVjdHMiLAorCQkiLS1vYmplY3RzLWVkZ2UiLAorCQkiLS1wYXJlbnRzIiwKKwkJIi0tcHJldHR5IiwKKwkJIi0tcmVtb3RlcyIsCisJCSItLXNwYXJzZSIsCisJCSItLXRhZ3MiLAorCQkiLS10b3BvLW9yZGVyIiwKKwkJIi0tZGF0ZS1vcmRlciIsCisJCSItLXVucGFja2VkIiwKKwkJTlVMTAorCX07CisJY29uc3QgY2hhciAqKnAgPSByZXZfYXJnczsKKworCS8qIGFjY2VwdCAtPGRpZ2l0PiwgbGlrZSB0cmFkaXRpb25hbCAiaGVhZCIgKi8KKwlpZiAoKCphcmcgPT0gJy0nKSAmJiBpc2RpZ2l0KGFyZ1sxXSkpCisJCXJldHVybiAxOworCisJZm9yICg7OykgeworCQljb25zdCBjaGFyICpzdHIgPSAqcCsrOworCQlpbnQgbGVuOworCQlpZiAoIXN0cikKKwkJCXJldHVybiAwOworCQlsZW4gPSBzdHJsZW4oc3RyKTsKKwkJaWYgKCFzdHJjbXAoYXJnLCBzdHIpIHx8CisJCSAgICAoc3RyW2xlbi0xXSA9PSAnPScgJiYgIXN0cm5jbXAoYXJnLCBzdHIsIGxlbikpKQorCQkJcmV0dXJuIDE7CisJfQorfQorCisvKiBPdXRwdXQgYXJndW1lbnQgYXMgYSBzdHJpbmcsIGVpdGhlciBTUSBvciBub3JtYWwgKi8KK3N0YXRpYyB2b2lkIHNob3coY29uc3QgY2hhciAqYXJnKQoreworCWlmIChvdXRwdXRfc3EpIHsKKwkJaW50IHNxID0gJ1wnJywgY2g7CisKKwkJcHV0Y2hhcihzcSk7CisJCXdoaWxlICgoY2ggPSAqYXJnKyspKSB7CisJCQlpZiAoY2ggPT0gc3EpCisJCQkJZnB1dHMoIidcXCciLCBzdGRvdXQpOworCQkJcHV0Y2hhcihjaCk7CisJCX0KKwkJcHV0Y2hhcihzcSk7CisJCXB1dGNoYXIoJyAnKTsKKwl9CisJZWxzZQorCQlwdXRzKGFyZyk7Cit9CisKKy8qIE91dHB1dCBhIHJldmlzaW9uLCBvbmx5IGlmIGZpbHRlciBhbGxvd3MgaXQgKi8KK3N0YXRpYyB2b2lkIHNob3dfcmV2KGludCB0eXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCBjaGFyICpuYW1lKQoreworCWlmICghKGZpbHRlciAmIERPX1JFVlMpKQorCQlyZXR1cm47CisJZGVmID0gTlVMTDsKKwlyZXZzX2NvdW50Kys7CisKKwlpZiAodHlwZSAhPSBzaG93X3R5cGUpCisJCXB1dGNoYXIoJ14nKTsKKwlpZiAoc3ltYm9saWMgJiYgbmFtZSkgeworCQlpZiAoc3ltYm9saWMgPT0gU0hPV19TWU1CT0xJQ19GVUxMKSB7CisJCQl1bnNpZ25lZCBjaGFyIGRpc2NhcmRbMjBdOworCQkJY2hhciAqZnVsbDsKKworCQkJc3dpdGNoIChkd2ltX3JlZihuYW1lLCBzdHJsZW4obmFtZSksIGRpc2NhcmQsICZmdWxsKSkgeworCQkJY2FzZSAwOgorCQkJCS8qCisJCQkJICogTm90IGZvdW5kIC0tIG5vdCBhIHJlZi4gIFdlIGNvdWxkCisJCQkJICogZW1pdCAibmFtZSIgaGVyZSwgYnV0IHN5bWJvbGljLWZ1bGwKKwkJCQkgKiB1c2VycyBhcmUgaW50ZXJlc3RlZCBpbiBmaW5kaW5nIHRoZQorCQkJCSAqIHJlZnMgc3BlbGxlZCBpbiBmdWxsLCBhbmQgdGhleSB3b3VsZAorCQkJCSAqIG5lZWQgdG8gZmlsdGVyIG5vbi1yZWZzIGlmIHdlIGRpZCBzby4KKwkJCQkgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgMTogLyogaGFwcHkgKi8KKwkJCQlzaG93KGZ1bGwpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDogLyogYW1iaWd1b3VzICovCisJCQkJZXJyb3IoInJlZm5hbWUgJyVzJyBpcyBhbWJpZ3VvdXMiLCBuYW1lKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNob3cobmFtZSk7CisJCX0KKwl9CisJZWxzZSBpZiAoYWJicmV2KQorCQlzaG93KGZpbmRfdW5pcXVlX2FiYnJldihzaGExLCBhYmJyZXYpKTsKKwllbHNlCisJCXNob3coc2hhMV90b19oZXgoc2hhMSkpOworfQorCisvKiBPdXRwdXQgYSBmbGFnLCBvbmx5IGlmIGZpbHRlciBhbGxvd3MgaXQuICovCitzdGF0aWMgaW50IHNob3dfZmxhZyhjb25zdCBjaGFyICphcmcpCit7CisJaWYgKCEoZmlsdGVyICYgRE9fRkxBR1MpKQorCQlyZXR1cm4gMDsKKwlpZiAoZmlsdGVyICYgKGlzX3Jldl9hcmd1bWVudChhcmcpID8gRE9fUkVWUyA6IERPX05PUkVWKSkgeworCQlzaG93KGFyZyk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2hvd19kZWZhdWx0KHZvaWQpCit7CisJY29uc3QgY2hhciAqcyA9IGRlZjsKKworCWlmIChzKSB7CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisKKwkJZGVmID0gTlVMTDsKKwkJaWYgKCFnZXRfc2hhMShzLCBzaGExKSkgeworCQkJc2hvd19yZXYoTk9STUFMLCBzaGExLCBzKTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBzaG93X3JlZmVyZW5jZShjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmxhZywgdm9pZCAqY2JfZGF0YSkKK3sKKwlzaG93X3JldihOT1JNQUwsIHNoYTEsIHJlZm5hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzaG93X2RhdGVzdHJpbmcoY29uc3QgY2hhciAqZmxhZywgY29uc3QgY2hhciAqZGF0ZXN0cikKK3sKKwlzdGF0aWMgY2hhciBidWZmZXJbMTAwXTsKKworCS8qIGRhdGUgaGFuZGxpbmcgcmVxdWlyZXMgYm90aCBmbGFncyBhbmQgcmV2cyAqLworCWlmICgoZmlsdGVyICYgKERPX0ZMQUdTIHwgRE9fUkVWUykpICE9IChET19GTEFHUyB8IERPX1JFVlMpKQorCQlyZXR1cm47CisJc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVzJWx1IiwgZmxhZywgYXBwcm94aWRhdGUoZGF0ZXN0cikpOworCXNob3coYnVmZmVyKTsKK30KKworc3RhdGljIGludCBzaG93X2ZpbGUoY29uc3QgY2hhciAqYXJnKQoreworCXNob3dfZGVmYXVsdCgpOworCWlmICgoZmlsdGVyICYgKERPX05PTkZMQUdTfERPX05PUkVWKSkgPT0gKERPX05PTkZMQUdTfERPX05PUkVWKSkgeworCQlzaG93KGFyZyk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0cnlfZGlmZmVyZW5jZShjb25zdCBjaGFyICphcmcpCit7CisJY2hhciAqZG90ZG90OworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJdW5zaWduZWQgY2hhciBlbmRbMjBdOworCWNvbnN0IGNoYXIgKm5leHQ7CisJY29uc3QgY2hhciAqdGhpczsKKwlpbnQgc3ltbWV0cmljOworCisJaWYgKCEoZG90ZG90ID0gc3Ryc3RyKGFyZywgIi4uIikpKQorCQlyZXR1cm4gMDsKKwluZXh0ID0gZG90ZG90ICsgMjsKKwl0aGlzID0gYXJnOworCXN5bW1ldHJpYyA9ICgqbmV4dCA9PSAnLicpOworCisJKmRvdGRvdCA9IDA7CisJbmV4dCArPSBzeW1tZXRyaWM7CisKKwlpZiAoISpuZXh0KQorCQluZXh0ID0gIkhFQUQiOworCWlmIChkb3Rkb3QgPT0gYXJnKQorCQl0aGlzID0gIkhFQUQiOworCWlmICghZ2V0X3NoYTEodGhpcywgc2hhMSkgJiYgIWdldF9zaGExKG5leHQsIGVuZCkpIHsKKwkJc2hvd19yZXYoTk9STUFMLCBlbmQsIG5leHQpOworCQlzaG93X3JldihzeW1tZXRyaWMgPyBOT1JNQUwgOiBSRVZFUlNFRCwgc2hhMSwgdGhpcyk7CisJCWlmIChzeW1tZXRyaWMpIHsKKwkJCXN0cnVjdCBjb21taXRfbGlzdCAqZXhjbHVkZTsKKwkJCXN0cnVjdCBjb21taXQgKmEsICpiOworCQkJYSA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKHNoYTEpOworCQkJYiA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKGVuZCk7CisJCQlleGNsdWRlID0gZ2V0X21lcmdlX2Jhc2VzKGEsIGIsIDEpOworCQkJd2hpbGUgKGV4Y2x1ZGUpIHsKKwkJCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKm4gPSBleGNsdWRlLT5uZXh0OworCQkJCXNob3dfcmV2KFJFVkVSU0VELAorCQkJCQkgZXhjbHVkZS0+aXRlbS0+b2JqZWN0LnNoYTEsTlVMTCk7CisJCQkJZnJlZShleGNsdWRlKTsKKwkJCQlleGNsdWRlID0gbjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMTsKKwl9CisJKmRvdGRvdCA9ICcuJzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZW9wdF9kdW1wKGNvbnN0IHN0cnVjdCBvcHRpb24gKm8sIGNvbnN0IGNoYXIgKmFyZywgaW50IHVuc2V0KQoreworCXN0cnVjdCBzdHJidWYgKnBhcnNlZCA9IG8tPnZhbHVlOworCWlmICh1bnNldCkKKwkJc3RyYnVmX2FkZGYocGFyc2VkLCAiIC0tbm8tJXMiLCBvLT5sb25nX25hbWUpOworCWVsc2UgaWYgKG8tPnNob3J0X25hbWUpCisJCXN0cmJ1Zl9hZGRmKHBhcnNlZCwgIiAtJWMiLCBvLT5zaG9ydF9uYW1lKTsKKwllbHNlCisJCXN0cmJ1Zl9hZGRmKHBhcnNlZCwgIiAtLSVzIiwgby0+bG9uZ19uYW1lKTsKKwlpZiAoYXJnKSB7CisJCXN0cmJ1Zl9hZGRjaChwYXJzZWQsICcgJyk7CisJCXNxX3F1b3RlX2J1ZihwYXJzZWQsIGFyZyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc2tpcHNwYWNlcyhjb25zdCBjaGFyICpzKQoreworCXdoaWxlIChpc3NwYWNlKCpzKSkKKwkJcysrOworCXJldHVybiBzOworfQorCitzdGF0aWMgaW50IGNtZF9wYXJzZW9wdChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdGF0aWMgaW50IGtlZXBfZGFzaGRhc2ggPSAwOworCXN0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgcGFyc2VvcHRfdXNhZ2VbXSA9IHsKKwkJImdpdC1yZXYtcGFyc2UgLS1wYXJzZW9wdCBbb3B0aW9uc10gLS0gWzxhcmdzPi4uLl0iLAorCQlOVUxMCisJfTsKKwlzdGF0aWMgc3RydWN0IG9wdGlvbiBwYXJzZW9wdF9vcHRzW10gPSB7CisJCU9QVF9CT09MRUFOKDAsICJrZWVwLWRhc2hkYXNoIiwgJmtlZXBfZGFzaGRhc2gsCisJCQkJCSJrZWVwIHRoZSBgLS1gIHBhc3NlZCBhcyBhbiBhcmciKSwKKwkJT1BUX0VORCgpLAorCX07CisKKwlzdHJ1Y3Qgc3RyYnVmIHNiLCBwYXJzZWQ7CisJY29uc3QgY2hhciAqKnVzYWdlID0gTlVMTDsKKwlzdHJ1Y3Qgb3B0aW9uICpvcHRzID0gTlVMTDsKKwlpbnQgb25iID0gMCwgb3N6ID0gMCwgdW5iID0gMCwgdXN6ID0gMDsKKworCXN0cmJ1Zl9pbml0KCZwYXJzZWQsIDApOworCXN0cmJ1Zl9hZGRzdHIoJnBhcnNlZCwgInNldCAtLSIpOworCWFyZ2MgPSBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIHBhcnNlb3B0X29wdHMsIHBhcnNlb3B0X3VzYWdlLAorCSAgICAgICAgICAgICAgICAgICAgIFBBUlNFX09QVF9LRUVQX0RBU0hEQVNIKTsKKwlpZiAoYXJnYyA8IDEgfHwgc3RyY21wKGFyZ3ZbMF0sICItLSIpKQorCQl1c2FnZV93aXRoX29wdGlvbnMocGFyc2VvcHRfdXNhZ2UsIHBhcnNlb3B0X29wdHMpOworCisJc3RyYnVmX2luaXQoJnNiLCAwKTsKKwkvKiBnZXQgdGhlIHVzYWdlIHVwIHRvIHRoZSBmaXJzdCBsaW5lIHdpdGggYSAtLSBvbiBpdCAqLworCWZvciAoOzspIHsKKwkJaWYgKHN0cmJ1Zl9nZXRsaW5lKCZzYiwgc3RkaW4sICdcbicpID09IEVPRikKKwkJCWRpZSgicHJlbWF0dXJlIGVuZCBvZiBpbnB1dCIpOworCQlBTExPQ19HUk9XKHVzYWdlLCB1bmIgKyAxLCB1c3opOworCQlpZiAoIXN0cmNtcCgiLS0iLCBzYi5idWYpKSB7CisJCQlpZiAodW5iIDwgMSkKKwkJCQlkaWUoIm5vIHVzYWdlIHN0cmluZyBnaXZlbiBiZWZvcmUgdGhlIGAtLScgc2VwYXJhdG9yIik7CisJCQl1c2FnZVt1bmJdID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCXVzYWdlW3VuYisrXSA9IHN0cmJ1Zl9kZXRhY2goJnNiLCBOVUxMKTsKKwl9CisKKwkvKiBwYXJzZTogKDxzaG9ydD58PHNob3J0Piw8bG9uZz58PGxvbmc+KVs9P10/IFNQKyA8aGVscD4gKi8KKwl3aGlsZSAoc3RyYnVmX2dldGxpbmUoJnNiLCBzdGRpbiwgJ1xuJykgIT0gRU9GKSB7CisJCWNvbnN0IGNoYXIgKnM7CisJCXN0cnVjdCBvcHRpb24gKm87CisKKwkJaWYgKCFzYi5sZW4pCisJCQljb250aW51ZTsKKworCQlBTExPQ19HUk9XKG9wdHMsIG9uYiArIDEsIG9zeik7CisJCW1lbXNldChvcHRzICsgb25iLCAwLCBzaXplb2Yob3B0c1tvbmJdKSk7CisKKwkJbyA9ICZvcHRzW29uYisrXTsKKwkJcyA9IHN0cmNocihzYi5idWYsICcgJyk7CisJCWlmICghcyB8fCAqc2IuYnVmID09ICcgJykgeworCQkJby0+dHlwZSA9IE9QVElPTl9HUk9VUDsKKwkJCW8tPmhlbHAgPSB4c3RyZHVwKHNraXBzcGFjZXMoc2IuYnVmKSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCW8tPnR5cGUgPSBPUFRJT05fQ0FMTEJBQ0s7CisJCW8tPmhlbHAgPSB4c3RyZHVwKHNraXBzcGFjZXMocykpOworCQlvLT52YWx1ZSA9ICZwYXJzZWQ7CisJCW8tPmZsYWdzID0gUEFSU0VfT1BUX05PQVJHOworCQlvLT5jYWxsYmFjayA9ICZwYXJzZW9wdF9kdW1wOworCQl3aGlsZSAocyA+IHNiLmJ1ZiAmJiBzdHJjaHIoIio9PyEiLCBzWy0xXSkpIHsKKwkJCXN3aXRjaCAoKi0tcykgeworCQkJY2FzZSAnPSc6CisJCQkJby0+ZmxhZ3MgJj0gflBBUlNFX09QVF9OT0FSRzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJz8nOgorCQkJCW8tPmZsYWdzICY9IH5QQVJTRV9PUFRfTk9BUkc7CisJCQkJby0+ZmxhZ3MgfD0gUEFSU0VfT1BUX09QVEFSRzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJyEnOgorCQkJCW8tPmZsYWdzIHw9IFBBUlNFX09QVF9OT05FRzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJyonOgorCQkJCW8tPmZsYWdzIHw9IFBBUlNFX09QVF9ISURERU47CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAocyAtIHNiLmJ1ZiA9PSAxKSAvKiBzaG9ydCBvcHRpb24gb25seSAqLworCQkJby0+c2hvcnRfbmFtZSA9ICpzYi5idWY7CisJCWVsc2UgaWYgKHNiLmJ1ZlsxXSAhPSAnLCcpIC8qIGxvbmcgb3B0aW9uIG9ubHkgKi8KKwkJCW8tPmxvbmdfbmFtZSA9IHhtZW1kdXB6KHNiLmJ1ZiwgcyAtIHNiLmJ1Zik7CisJCWVsc2UgeworCQkJby0+c2hvcnRfbmFtZSA9ICpzYi5idWY7CisJCQlvLT5sb25nX25hbWUgPSB4bWVtZHVweihzYi5idWYgKyAyLCBzIC0gc2IuYnVmIC0gMik7CisJCX0KKwl9CisJc3RyYnVmX3JlbGVhc2UoJnNiKTsKKworCS8qIHB1dCBhbiBPUFRfRU5EKCkgKi8KKwlBTExPQ19HUk9XKG9wdHMsIG9uYiArIDEsIG9zeik7CisJbWVtc2V0KG9wdHMgKyBvbmIsIDAsIHNpemVvZihvcHRzW29uYl0pKTsKKwlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBvcHRzLCB1c2FnZSwKKwkgICAgICAgICAgICAgICAgICAgICBrZWVwX2Rhc2hkYXNoID8gUEFSU0VfT1BUX0tFRVBfREFTSERBU0ggOiAwKTsKKworCXN0cmJ1Zl9hZGRmKCZwYXJzZWQsICIgLS0iKTsKKwlzcV9xdW90ZV9hcmd2KCZwYXJzZWQsIGFyZ3YsIDApOworCXB1dHMocGFyc2VkLmJ1Zik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjbWRfcmV2X3BhcnNlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBpLCBhc19pcyA9IDAsIHZlcmlmeSA9IDA7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKworCWlmIChhcmdjID4gMSAmJiAhc3RyY21wKCItLXBhcnNlb3B0IiwgYXJndlsxXSkpCisJCXJldHVybiBjbWRfcGFyc2VvcHQoYXJnYyAtIDEsIGFyZ3YgKyAxLCBwcmVmaXgpOworCisJcHJlZml4ID0gc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJaWYgKGFzX2lzKSB7CisJCQlpZiAoc2hvd19maWxlKGFyZykgJiYgYXNfaXMgPCAyKQorCQkJCXZlcmlmeV9maWxlbmFtZShwcmVmaXgsIGFyZyk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsIi1uIikpIHsKKwkJCWlmICgrK2kgPj0gYXJnYykKKwkJCQlkaWUoIi1uIHJlcXVpcmVzIGFuIGFyZ3VtZW50Iik7CisJCQlpZiAoKGZpbHRlciAmIERPX0ZMQUdTKSAmJiAoZmlsdGVyICYgRE9fUkVWUykpIHsKKwkJCQlzaG93KGFyZyk7CisJCQkJc2hvdyhhcmd2W2ldKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi1uIikpIHsKKwkJCWlmICgoZmlsdGVyICYgRE9fRkxBR1MpICYmIChmaWx0ZXIgJiBET19SRVZTKSkKKwkJCQlzaG93KGFyZyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgqYXJnID09ICctJykgeworCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkgeworCQkJCWFzX2lzID0gMjsKKwkJCQkvKiBQYXNzIG9uIHRoZSAiLS0iIGlmIHdlIHNob3cgYW55dGhpbmcgYnV0IGZpbGVzLi4gKi8KKwkJCQlpZiAoZmlsdGVyICYgKERPX0ZMQUdTIHwgRE9fUkVWUykpCisJCQkJCXNob3dfZmlsZShhcmcpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1kZWZhdWx0IikpIHsKKwkJCQlkZWYgPSBhcmd2W2krMV07CisJCQkJaSsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1yZXZzLW9ubHkiKSkgeworCQkJCWZpbHRlciAmPSB+RE9fTk9SRVY7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLW5vLXJldnMiKSkgeworCQkJCWZpbHRlciAmPSB+RE9fUkVWUzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tZmxhZ3MiKSkgeworCQkJCWZpbHRlciAmPSB+RE9fTk9ORkxBR1M7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLW5vLWZsYWdzIikpIHsKKwkJCQlmaWx0ZXIgJj0gfkRPX0ZMQUdTOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS12ZXJpZnkiKSkgeworCQkJCWZpbHRlciAmPSB+KERPX0ZMQUdTfERPX05PUkVWKTsKKwkJCQl2ZXJpZnkgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1zaG9ydCIpIHx8CisJCQkgICAgIXByZWZpeGNtcChhcmcsICItLXNob3J0PSIpKSB7CisJCQkJZmlsdGVyICY9IH4oRE9fRkxBR1N8RE9fTk9SRVYpOworCQkJCXZlcmlmeSA9IDE7CisJCQkJYWJicmV2ID0gREVGQVVMVF9BQkJSRVY7CisJCQkJaWYgKGFyZ1s3XSA9PSAnPScpCisJCQkJCWFiYnJldiA9IHN0cnRvdWwoYXJnICsgOCwgTlVMTCwgMTApOworCQkJCWlmIChhYmJyZXYgPCBNSU5JTVVNX0FCQlJFVikKKwkJCQkJYWJicmV2ID0gTUlOSU1VTV9BQkJSRVY7CisJCQkJZWxzZSBpZiAoNDAgPD0gYWJicmV2KQorCQkJCQlhYmJyZXYgPSA0MDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tc3EiKSkgeworCQkJCW91dHB1dF9zcSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLW5vdCIpKSB7CisJCQkJc2hvd190eXBlIF49IFJFVkVSU0VEOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1zeW1ib2xpYyIpKSB7CisJCQkJc3ltYm9saWMgPSBTSE9XX1NZTUJPTElDX0FTSVM7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXN5bWJvbGljLWZ1bGwtbmFtZSIpKSB7CisJCQkJc3ltYm9saWMgPSBTSE9XX1NZTUJPTElDX0ZVTEw7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWFsbCIpKSB7CisJCQkJZm9yX2VhY2hfcmVmKHNob3dfcmVmZXJlbmNlLCBOVUxMKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tYnJhbmNoZXMiKSkgeworCQkJCWZvcl9lYWNoX2JyYW5jaF9yZWYoc2hvd19yZWZlcmVuY2UsIE5VTEwpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS10YWdzIikpIHsKKwkJCQlmb3JfZWFjaF90YWdfcmVmKHNob3dfcmVmZXJlbmNlLCBOVUxMKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tcmVtb3RlcyIpKSB7CisJCQkJZm9yX2VhY2hfcmVtb3RlX3JlZihzaG93X3JlZmVyZW5jZSwgTlVMTCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXNob3ctcHJlZml4IikpIHsKKwkJCQlpZiAocHJlZml4KQorCQkJCQlwdXRzKHByZWZpeCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXNob3ctY2R1cCIpKSB7CisJCQkJY29uc3QgY2hhciAqcGZ4ID0gcHJlZml4OworCQkJCWlmICghaXNfaW5zaWRlX3dvcmtfdHJlZSgpKSB7CisJCQkJCWNvbnN0IGNoYXIgKndvcmtfdHJlZSA9CisJCQkJCQlnZXRfZ2l0X3dvcmtfdHJlZSgpOworCQkJCQlpZiAod29ya190cmVlKQorCQkJCQkJcHJpbnRmKCIlc1xuIiwgd29ya190cmVlKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCXdoaWxlIChwZngpIHsKKwkJCQkJcGZ4ID0gc3RyY2hyKHBmeCwgJy8nKTsKKwkJCQkJaWYgKHBmeCkgeworCQkJCQkJcGZ4Kys7CisJCQkJCQlwcmludGYoIi4uLyIpOworCQkJCQl9CisJCQkJfQorCQkJCXB1dGNoYXIoJ1xuJyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWdpdC1kaXIiKSkgeworCQkJCWNvbnN0IGNoYXIgKmdpdGRpciA9IGdldGVudihHSVRfRElSX0VOVklST05NRU5UKTsKKwkJCQlzdGF0aWMgY2hhciBjd2RbUEFUSF9NQVhdOworCQkJCWlmIChnaXRkaXIpIHsKKwkJCQkJcHV0cyhnaXRkaXIpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKCFwcmVmaXgpIHsKKwkJCQkJcHV0cygiLmdpdCIpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKCFnZXRjd2QoY3dkLCBQQVRIX01BWCkpCisJCQkJCWRpZSgidW5hYmxlIHRvIGdldCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Iik7CisJCQkJcHJpbnRmKCIlcy8uZ2l0XG4iLCBjd2QpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1pcy1pbnNpZGUtZ2l0LWRpciIpKSB7CisJCQkJcHJpbnRmKCIlc1xuIiwgaXNfaW5zaWRlX2dpdF9kaXIoKSA/ICJ0cnVlIgorCQkJCQkJOiAiZmFsc2UiKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0taXMtaW5zaWRlLXdvcmstdHJlZSIpKSB7CisJCQkJcHJpbnRmKCIlc1xuIiwgaXNfaW5zaWRlX3dvcmtfdHJlZSgpID8gInRydWUiCisJCQkJCQk6ICJmYWxzZSIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1pcy1iYXJlLXJlcG9zaXRvcnkiKSkgeworCQkJCXByaW50ZigiJXNcbiIsIGlzX2JhcmVfcmVwb3NpdG9yeSgpID8gInRydWUiCisJCQkJCQk6ICJmYWxzZSIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1zaW5jZT0iKSkgeworCQkJCXNob3dfZGF0ZXN0cmluZygiLS1tYXgtYWdlPSIsIGFyZys4KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcHJlZml4Y21wKGFyZywgIi0tYWZ0ZXI9IikpIHsKKwkJCQlzaG93X2RhdGVzdHJpbmcoIi0tbWF4LWFnZT0iLCBhcmcrOCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXByZWZpeGNtcChhcmcsICItLWJlZm9yZT0iKSkgeworCQkJCXNob3dfZGF0ZXN0cmluZygiLS1taW4tYWdlPSIsIGFyZys5KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcHJlZml4Y21wKGFyZywgIi0tdW50aWw9IikpIHsKKwkJCQlzaG93X2RhdGVzdHJpbmcoIi0tbWluLWFnZT0iLCBhcmcrOCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoc2hvd19mbGFnKGFyZykgJiYgdmVyaWZ5KQorCQkJCWRpZSgiTmVlZGVkIGEgc2luZ2xlIHJldmlzaW9uIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIE5vdCBhIGZsYWcgYXJndW1lbnQgKi8KKwkJaWYgKHRyeV9kaWZmZXJlbmNlKGFyZykpCisJCQljb250aW51ZTsKKwkJaWYgKCFnZXRfc2hhMShhcmcsIHNoYTEpKSB7CisJCQlzaG93X3JldihOT1JNQUwsIHNoYTEsIGFyZyk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKmFyZyA9PSAnXicgJiYgIWdldF9zaGExKGFyZysxLCBzaGExKSkgeworCQkJc2hvd19yZXYoUkVWRVJTRUQsIHNoYTEsIGFyZysxKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWFzX2lzID0gMTsKKwkJaWYgKCFzaG93X2ZpbGUoYXJnKSkKKwkJCWNvbnRpbnVlOworCQlpZiAodmVyaWZ5KQorCQkJZGllKCJOZWVkZWQgYSBzaW5nbGUgcmV2aXNpb24iKTsKKwkJdmVyaWZ5X2ZpbGVuYW1lKHByZWZpeCwgYXJnKTsKKwl9CisJc2hvd19kZWZhdWx0KCk7CisJaWYgKHZlcmlmeSAmJiByZXZzX2NvdW50ICE9IDEpCisJCWRpZSgiTmVlZGVkIGEgc2luZ2xlIHJldmlzaW9uIik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXJldmVydC5jIGIvYnVpbHRpbi1yZXZlcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDdhMmYwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1yZXZlcnQuYwpAQCAtMCwwICsxLDQzMSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgInd0LXN0YXR1cy5oIgorI2luY2x1ZGUgInJ1bi1jb21tYW5kLmgiCisjaW5jbHVkZSAiZXhlY19jbWQuaCIKKyNpbmNsdWRlICJ1dGY4LmgiCisjaW5jbHVkZSAicGFyc2Utb3B0aW9ucy5oIgorI2luY2x1ZGUgImNhY2hlLXRyZWUuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKworLyoKKyAqIFRoaXMgaW1wbGVtZW50cyB0aGUgYnVpbHRpbnMgcmV2ZXJ0IGFuZCBjaGVycnktcGljay4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSm9oYW5uZXMgRS4gU2NoaW5kZWxpbgorICoKKyAqIEJhc2VkIG9uIGdpdC1yZXZlcnQuc2gsIHdoaWNoIGlzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IExpbnVzIFRvcnZhbGRzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJldmVydF91c2FnZVtdID0geworCSJnaXQtcmV2ZXJ0IFtvcHRpb25zXSA8Y29tbWl0LWlzaD4iLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2hlcnJ5X3BpY2tfdXNhZ2VbXSA9IHsKKwkiZ2l0LWNoZXJyeS1waWNrIFtvcHRpb25zXSA8Y29tbWl0LWlzaD4iLAorCU5VTEwKK307CisKK3N0YXRpYyBpbnQgZWRpdCwgbm9fcmVwbGF5LCBub19jb21taXQsIG1haW5saW5lOworc3RhdGljIGVudW0geyBSRVZFUlQsIENIRVJSWV9QSUNLIH0gYWN0aW9uOworc3RhdGljIHN0cnVjdCBjb21taXQgKmNvbW1pdDsKKworc3RhdGljIGNvbnN0IGNoYXIgKm1lOworCisjZGVmaW5lIEdJVF9SRUZMT0dfQUNUSU9OICJHSVRfUkVGTE9HX0FDVElPTiIKKworc3RhdGljIHZvaWQgcGFyc2VfYXJncyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqIGNvbnN0ICogdXNhZ2Vfc3RyID0KKwkJYWN0aW9uID09IFJFVkVSVCA/ICByZXZlcnRfdXNhZ2UgOiBjaGVycnlfcGlja191c2FnZTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWNvbnN0IGNoYXIgKmFyZzsKKwlpbnQgbm9vcDsKKwlzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKKwkJT1BUX0JPT0xFQU4oJ24nLCAibm8tY29tbWl0IiwgJm5vX2NvbW1pdCwgImRvbid0IGF1dG9tYXRpY2FsbHkgY29tbWl0IiksCisJCU9QVF9CT09MRUFOKCdlJywgImVkaXQiLCAmZWRpdCwgImVkaXQgdGhlIGNvbW1pdCBtZXNzYWdlIiksCisJCU9QVF9CT09MRUFOKCd4JywgTlVMTCwgJm5vX3JlcGxheSwgImFwcGVuZCBjb21taXQgbmFtZSB3aGVuIGNoZXJyeS1waWNraW5nIiksCisJCU9QVF9CT09MRUFOKCdyJywgTlVMTCwgJm5vb3AsICJuby1vcCAoYmFja3dhcmQgY29tcGF0aWJpbGl0eSkiKSwKKwkJT1BUX0lOVEVHRVIoJ20nLCAibWFpbmxpbmUiLCAmbWFpbmxpbmUsICJwYXJlbnQgbnVtYmVyIiksCisJCU9QVF9FTkQoKSwKKwl9OworCisJaWYgKHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgb3B0aW9ucywgdXNhZ2Vfc3RyLCAwKSAhPSAxKQorCQl1c2FnZV93aXRoX29wdGlvbnModXNhZ2Vfc3RyLCBvcHRpb25zKTsKKwlhcmcgPSBhcmd2WzBdOworCisJaWYgKGdldF9zaGExKGFyZywgc2hhMSkpCisJCWRpZSAoIkNhbm5vdCBmaW5kICclcyciLCBhcmcpOworCWNvbW1pdCA9IChzdHJ1Y3QgY29tbWl0ICopcGFyc2Vfb2JqZWN0KHNoYTEpOworCWlmICghY29tbWl0KQorCQlkaWUgKCJDb3VsZCBub3QgZmluZCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwlpZiAoY29tbWl0LT5vYmplY3QudHlwZSA9PSBPQkpfVEFHKSB7CisJCWNvbW1pdCA9IChzdHJ1Y3QgY29tbWl0ICopCisJCQlkZXJlZl90YWcoKHN0cnVjdCBvYmplY3QgKiljb21taXQsIGFyZywgc3RybGVuKGFyZykpOworCX0KKwlpZiAoY29tbWl0LT5vYmplY3QudHlwZSAhPSBPQkpfQ09NTUlUKQorCQlkaWUgKCInJXMnIGRvZXMgbm90IHBvaW50IHRvIGEgY29tbWl0IiwgYXJnKTsKK30KKworc3RhdGljIGNoYXIgKmdldF9vbmVsaW5lKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisJY2hhciAqcmVzdWx0OworCWNvbnN0IGNoYXIgKnAgPSBtZXNzYWdlLCAqYWJicmV2LCAqZW9sOworCWludCBhYmJyZXZfbGVuLCBvbmVsaW5lX2xlbjsKKworCWlmICghcCkKKwkJZGllICgiQ291bGQgbm90IHJlYWQgY29tbWl0IG1lc3NhZ2Ugb2YgJXMiLAorCQkJCXNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKwl3aGlsZSAoKnAgJiYgKCpwICE9ICdcbicgfHwgcFsxXSAhPSAnXG4nKSkKKwkJcCsrOworCisJaWYgKCpwKSB7CisJCXAgKz0gMjsKKwkJZm9yIChlb2wgPSBwICsgMTsgKmVvbCAmJiAqZW9sICE9ICdcbic7IGVvbCsrKQorCQkJOyAvKiBkbyBub3RoaW5nICovCisJfSBlbHNlCisJCWVvbCA9IHA7CisJYWJicmV2ID0gZmluZF91bmlxdWVfYWJicmV2KGNvbW1pdC0+b2JqZWN0LnNoYTEsIERFRkFVTFRfQUJCUkVWKTsKKwlhYmJyZXZfbGVuID0gc3RybGVuKGFiYnJldik7CisJb25lbGluZV9sZW4gPSBlb2wgLSBwOworCXJlc3VsdCA9IHhtYWxsb2MoYWJicmV2X2xlbiArIDUgKyBvbmVsaW5lX2xlbik7CisJbWVtY3B5KHJlc3VsdCwgYWJicmV2LCBhYmJyZXZfbGVuKTsKKwltZW1jcHkocmVzdWx0ICsgYWJicmV2X2xlbiwgIi4uLiAiLCA0KTsKKwltZW1jcHkocmVzdWx0ICsgYWJicmV2X2xlbiArIDQsIHAsIG9uZWxpbmVfbGVuKTsKKwlyZXN1bHRbYWJicmV2X2xlbiArIDQgKyBvbmVsaW5lX2xlbl0gPSAnXDAnOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBjaGFyICpnZXRfZW5jb2RpbmcoY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKwljb25zdCBjaGFyICpwID0gbWVzc2FnZSwgKmVvbDsKKworCWlmICghcCkKKwkJZGllICgiQ291bGQgbm90IHJlYWQgY29tbWl0IG1lc3NhZ2Ugb2YgJXMiLAorCQkJCXNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKwl3aGlsZSAoKnAgJiYgKnAgIT0gJ1xuJykgeworCQlmb3IgKGVvbCA9IHAgKyAxOyAqZW9sICYmICplb2wgIT0gJ1xuJzsgZW9sKyspCisJCQk7IC8qIGRvIG5vdGhpbmcgKi8KKwkJaWYgKCFwcmVmaXhjbXAocCwgImVuY29kaW5nICIpKSB7CisJCQljaGFyICpyZXN1bHQgPSB4bWFsbG9jKGVvbCAtIDggLSBwKTsKKwkJCXN0cmxjcHkocmVzdWx0LCBwICsgOSwgZW9sIC0gOCAtIHApOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlwID0gZW9sOworCQlpZiAoKnAgPT0gJ1xuJykKKwkJCXArKzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG9ja19maWxlIG1zZ19maWxlOworc3RhdGljIGludCBtc2dfZmQ7CisKK3N0YXRpYyB2b2lkIGFkZF90b19tc2coY29uc3QgY2hhciAqc3RyaW5nKQoreworCWludCBsZW4gPSBzdHJsZW4oc3RyaW5nKTsKKwlpZiAod3JpdGVfaW5fZnVsbChtc2dfZmQsIHN0cmluZywgbGVuKSA8IDApCisJCWRpZSAoIkNvdWxkIG5vdCB3cml0ZSB0byBNRVJHRV9NU0ciKTsKK30KKworc3RhdGljIHZvaWQgYWRkX21lc3NhZ2VfdG9fbXNnKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisJY29uc3QgY2hhciAqcCA9IG1lc3NhZ2U7CisJd2hpbGUgKCpwICYmICgqcCAhPSAnXG4nIHx8IHBbMV0gIT0gJ1xuJykpCisJCXArKzsKKworCWlmICghKnApCisJCWFkZF90b19tc2coc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCisJcCArPSAyOworCWFkZF90b19tc2cocCk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBzZXRfYXV0aG9yX2lkZW50X2Vudihjb25zdCBjaGFyICptZXNzYWdlKQoreworCWNvbnN0IGNoYXIgKnAgPSBtZXNzYWdlOworCWlmICghcCkKKwkJZGllICgiQ291bGQgbm90IHJlYWQgY29tbWl0IG1lc3NhZ2Ugb2YgJXMiLAorCQkJCXNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKwl3aGlsZSAoKnAgJiYgKnAgIT0gJ1xuJykgeworCQljb25zdCBjaGFyICplb2w7CisKKwkJZm9yIChlb2wgPSBwOyAqZW9sICYmICplb2wgIT0gJ1xuJzsgZW9sKyspCisJCQk7IC8qIGRvIG5vdGhpbmcgKi8KKwkJaWYgKCFwcmVmaXhjbXAocCwgImF1dGhvciAiKSkgeworCQkJY2hhciAqbGluZSwgKnBlbmQsICplbWFpbCwgKnRpbWVzdGFtcDsKKworCQkJcCArPSA3OworCQkJbGluZSA9IHhtZW1kdXB6KHAsIGVvbCAtIHApOworCQkJZW1haWwgPSBzdHJjaHIobGluZSwgJzwnKTsKKwkJCWlmICghZW1haWwpCisJCQkJZGllICgiQ291bGQgbm90IGV4dHJhY3QgYXV0aG9yIGVtYWlsIGZyb20gJXMiLAorCQkJCQlzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisJCQlpZiAoZW1haWwgPT0gbGluZSkKKwkJCQlwZW5kID0gbGluZTsKKwkJCWVsc2UKKwkJCQlmb3IgKHBlbmQgPSBlbWFpbDsgcGVuZCAhPSBsaW5lICsgMSAmJgorCQkJCQkJaXNzcGFjZShwZW5kWy0xXSk7IHBlbmQtLSk7CisJCQkJCTsgLyogZG8gbm90aGluZyAqLworCQkJKnBlbmQgPSAnXDAnOworCQkJZW1haWwrKzsKKwkJCXRpbWVzdGFtcCA9IHN0cmNocihlbWFpbCwgJz4nKTsKKwkJCWlmICghdGltZXN0YW1wKQorCQkJCWRpZSAoIkNvdWxkIG5vdCBleHRyYWN0IGF1dGhvciBlbWFpbCBmcm9tICVzIiwKKwkJCQkJc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCQkJKnRpbWVzdGFtcCA9ICdcMCc7CisJCQlmb3IgKHRpbWVzdGFtcCsrOyAqdGltZXN0YW1wICYmIGlzc3BhY2UoKnRpbWVzdGFtcCk7CisJCQkJCXRpbWVzdGFtcCsrKQorCQkJCTsgLyogZG8gbm90aGluZyAqLworCQkJc2V0ZW52KCJHSVRfQVVUSE9SX05BTUUiLCBsaW5lLCAxKTsKKwkJCXNldGVudigiR0lUX0FVVEhPUl9FTUFJTCIsIGVtYWlsLCAxKTsKKwkJCXNldGVudigiR0lUX0FVVEhPUl9EQVRFIiwgdGltZXN0YW1wLCAxKTsKKwkJCWZyZWUobGluZSk7CisJCQlyZXR1cm47CisJCX0KKwkJcCA9IGVvbDsKKwkJaWYgKCpwID09ICdcbicpCisJCQlwKys7CisJfQorCWRpZSAoIk5vIGF1dGhvciBpbmZvcm1hdGlvbiBmb3VuZCBpbiAlcyIsCisJCQlzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7Cit9CisKK3N0YXRpYyBpbnQgbWVyZ2VfcmVjdXJzaXZlKGNvbnN0IGNoYXIgKmJhc2Vfc2hhMSwKKwkJY29uc3QgY2hhciAqaGVhZF9zaGExLCBjb25zdCBjaGFyICpoZWFkX25hbWUsCisJCWNvbnN0IGNoYXIgKm5leHRfc2hhMSwgY29uc3QgY2hhciAqbmV4dF9uYW1lKQoreworCWNoYXIgYnVmZmVyWzI1Nl07CisJY29uc3QgY2hhciAqYXJndls2XTsKKworCXNwcmludGYoYnVmZmVyLCAiR0lUSEVBRF8lcyIsIGhlYWRfc2hhMSk7CisJc2V0ZW52KGJ1ZmZlciwgaGVhZF9uYW1lLCAxKTsKKwlzcHJpbnRmKGJ1ZmZlciwgIkdJVEhFQURfJXMiLCBuZXh0X3NoYTEpOworCXNldGVudihidWZmZXIsIG5leHRfbmFtZSwgMSk7CisKKwkvKgorCSAqIFRoaXMgdGhyZWUgd2F5IG1lcmdlIGlzIGFuIGludGVyZXN0aW5nIG9uZS4gIFdlIGFyZSBhdAorCSAqICRoZWFkLCBhbmQgd291bGQgd2FudCB0byBhcHBseSB0aGUgY2hhbmdlIGJldHdlZW4gJGNvbW1pdAorCSAqIGFuZCAkcHJldiBvbiB0b3Agb2YgdXMgKHdoZW4gcmV2ZXJ0aW5nKSwgb3IgdGhlIGNoYW5nZSBiZXR3ZWVuCisJICogJHByZXYgYW5kICRjb21taXQgb24gdG9wIG9mIHVzICh3aGVuIGNoZXJyeS1waWNraW5nIG9yIHJlcGxheWluZykuCisJICovCisJYXJndlswXSA9ICJtZXJnZS1yZWN1cnNpdmUiOworCWFyZ3ZbMV0gPSBiYXNlX3NoYTE7CisJYXJndlsyXSA9ICItLSI7CisJYXJndlszXSA9IGhlYWRfc2hhMTsKKwlhcmd2WzRdID0gbmV4dF9zaGExOworCWFyZ3ZbNV0gPSBOVUxMOworCisJcmV0dXJuIHJ1bl9jb21tYW5kX3Zfb3B0KGFyZ3YsIFJVTl9DT01NQU5EX05PX1NURElOIHwgUlVOX0dJVF9DTUQpOworfQorCitzdGF0aWMgY2hhciAqaGVscF9tc2coY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdGF0aWMgY2hhciBoZWxwYnVmWzEwMjRdOworCWNoYXIgKm1zZyA9IGdldGVudigiR0lUX0NIRVJSWV9QSUNLX0hFTFAiKTsKKworCWlmIChtc2cpCisJCXJldHVybiBtc2c7CisKKwlzdHJjcHkoaGVscGJ1ZiwgIiAgQWZ0ZXIgcmVzb2x2aW5nIHRoZSBjb25mbGljdHMsXG4iCisJICAgICAgICJtYXJrIHRoZSBjb3JyZWN0ZWQgcGF0aHMgd2l0aCAnZ2l0IGFkZCA8cGF0aHM+JyAiCisJICAgICAgICJvciAnZ2l0IHJtIDxwYXRocz4nIGFuZCBjb21taXQgdGhlIHJlc3VsdC4iKTsKKworCWlmIChhY3Rpb24gPT0gQ0hFUlJZX1BJQ0spIHsKKwkJc3ByaW50ZihoZWxwYnVmICsgc3RybGVuKGhlbHBidWYpLAorCQkJIlxuV2hlbiBjb21taXRpbmcsIHVzZSB0aGUgb3B0aW9uICIKKwkJCSInLWMgJXMnIHRvIHJldGFpbiBhdXRob3JzaGlwIGFuZCBtZXNzYWdlLiIsCisJCQlmaW5kX3VuaXF1ZV9hYmJyZXYoc2hhMSwgREVGQVVMVF9BQkJSRVYpKTsKKwl9CisJcmV0dXJuIGhlbHBidWY7Cit9CisKK3N0YXRpYyBpbnQgaW5kZXhfaXNfZGlydHkodm9pZCkKK3sKKwlzdHJ1Y3QgcmV2X2luZm8gcmV2OworCWluaXRfcmV2aXNpb25zKCZyZXYsIE5VTEwpOworCXNldHVwX3JldmlzaW9ucygwLCBOVUxMLCAmcmV2LCAiSEVBRCIpOworCURJRkZfT1BUX1NFVCgmcmV2LmRpZmZvcHQsIFFVSUVUKTsKKwlESUZGX09QVF9TRVQoJnJldi5kaWZmb3B0LCBFWElUX1dJVEhfU1RBVFVTKTsKKwlydW5fZGlmZl9pbmRleCgmcmV2LCAxKTsKKwlyZXR1cm4gISFESUZGX09QVF9UU1QoJnJldi5kaWZmb3B0LCBIQVNfQ0hBTkdFUyk7Cit9CisKK3N0YXRpYyBpbnQgcmV2ZXJ0X29yX2NoZXJyeV9waWNrKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBjaGFyIGhlYWRbMjBdOworCXN0cnVjdCBjb21taXQgKmJhc2UsICpuZXh0LCAqcGFyZW50OworCWludCBpOworCWNoYXIgKm9uZWxpbmUsICpyZWVuY29kZWRfbWVzc2FnZSA9IE5VTEw7CisJY29uc3QgY2hhciAqbWVzc2FnZSwgKmVuY29kaW5nOworCWNvbnN0IGNoYXIgKmRlZm1zZyA9IHhzdHJkdXAoZ2l0X3BhdGgoIk1FUkdFX01TRyIpKTsKKworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKwltZSA9IGFjdGlvbiA9PSBSRVZFUlQgPyAicmV2ZXJ0IiA6ICJjaGVycnktcGljayI7CisJc2V0ZW52KEdJVF9SRUZMT0dfQUNUSU9OLCBtZSwgMCk7CisJcGFyc2VfYXJncyhhcmdjLCBhcmd2KTsKKworCS8qIHRoaXMgaXMgY29waWVkIGZyb20gdGhlIHNoZWxsIHNjcmlwdCwgYnV0IGl0J3MgbmV2ZXIgdHJpZ2dlcmVkLi4uICovCisJaWYgKGFjdGlvbiA9PSBSRVZFUlQgJiYgIW5vX3JlcGxheSkKKwkJZGllKCJyZXZlcnQgaXMgaW5jb21wYXRpYmxlIHdpdGggcmVwbGF5Iik7CisKKwlpZiAobm9fY29tbWl0KSB7CisJCS8qCisJCSAqIFdlIGRvIG5vdCBpbnRlbmQgdG8gY29tbWl0IGltbWVkaWF0ZWx5LiAgV2UganVzdCB3YW50IHRvCisJCSAqIG1lcmdlIHRoZSBkaWZmZXJlbmNlcyBpbiwgc28gbGV0J3MgY29tcHV0ZSB0aGUgdHJlZQorCQkgKiB0aGF0IHJlcHJlc2VudHMgdGhlICJjdXJyZW50IiBzdGF0ZSBmb3IgbWVyZ2UtcmVjdXJzaXZlCisJCSAqIHRvIHdvcmsgb24uCisJCSAqLworCQlpZiAod3JpdGVfY2FjaGVfYXNfdHJlZShoZWFkLCAwLCBOVUxMKSkKKwkJCWRpZSAoIllvdXIgaW5kZXggZmlsZSBpcyB1bm1lcmdlZC4iKTsKKwl9IGVsc2UgeworCQlpZiAoZ2V0X3NoYTEoIkhFQUQiLCBoZWFkKSkKKwkJCWRpZSAoIllvdSBkbyBub3QgaGF2ZSBhIHZhbGlkIEhFQUQiKTsKKwkJaWYgKHJlYWRfY2FjaGUoKSA8IDApCisJCQlkaWUoImNvdWxkIG5vdCByZWFkIHRoZSBpbmRleCIpOworCQlpZiAoaW5kZXhfaXNfZGlydHkoKSkKKwkJCWRpZSAoIkRpcnR5IGluZGV4OiBjYW5ub3QgJXMiLCBtZSk7CisJCWRpc2NhcmRfY2FjaGUoKTsKKwl9CisKKwlpZiAoIWNvbW1pdC0+cGFyZW50cykKKwkJZGllICgiQ2Fubm90ICVzIGEgcm9vdCBjb21taXQiLCBtZSk7CisJaWYgKGNvbW1pdC0+cGFyZW50cy0+bmV4dCkgeworCQkvKiBSZXZlcnRpbmcgb3IgY2hlcnJ5LXBpY2tpbmcgYSBtZXJnZSBjb21taXQgKi8KKwkJaW50IGNudDsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICpwOworCisJCWlmICghbWFpbmxpbmUpCisJCQlkaWUoIkNvbW1pdCAlcyBpcyBhIG1lcmdlIGJ1dCBubyAtbSBvcHRpb24gd2FzIGdpdmVuLiIsCisJCQkgICAgc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCisJCWZvciAoY250ID0gMSwgcCA9IGNvbW1pdC0+cGFyZW50czsKKwkJICAgICBjbnQgIT0gbWFpbmxpbmUgJiYgcDsKKwkJICAgICBjbnQrKykKKwkJCXAgPSBwLT5uZXh0OworCQlpZiAoY250ICE9IG1haW5saW5lIHx8ICFwKQorCQkJZGllKCJDb21taXQgJXMgZG9lcyBub3QgaGF2ZSBwYXJlbnQgJWQiLAorCQkJICAgIHNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpLCBtYWlubGluZSk7CisJCXBhcmVudCA9IHAtPml0ZW07CisJfSBlbHNlIGlmICgwIDwgbWFpbmxpbmUpCisJCWRpZSgiTWFpbmxpbmUgd2FzIHNwZWNpZmllZCBidXQgY29tbWl0ICVzIGlzIG5vdCBhIG1lcmdlLiIsCisJCSAgICBzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisJZWxzZQorCQlwYXJlbnQgPSBjb21taXQtPnBhcmVudHMtPml0ZW07CisKKwlpZiAoIShtZXNzYWdlID0gY29tbWl0LT5idWZmZXIpKQorCQlkaWUgKCJDYW5ub3QgZ2V0IGNvbW1pdCBtZXNzYWdlIGZvciAlcyIsCisJCQkJc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCisJLyoKKwkgKiAiY29tbWl0IiBpcyBhbiBleGlzdGluZyBjb21taXQuICBXZSB3b3VsZCB3YW50IHRvIGFwcGx5CisJICogdGhlIGRpZmZlcmVuY2UgaXQgaW50cm9kdWNlcyBzaW5jZSBpdHMgZmlyc3QgcGFyZW50ICJwcmV2IgorCSAqIG9uIHRvcCBvZiB0aGUgY3VycmVudCBIRUFEIGlmIHdlIGFyZSBjaGVycnktcGljay4gIE9yIHRoZQorCSAqIHJldmVyc2Ugb2YgaXQgaWYgd2UgYXJlIHJldmVydC4KKwkgKi8KKworCW1zZ19mZCA9IGhvbGRfbG9ja19maWxlX2Zvcl91cGRhdGUoJm1zZ19maWxlLCBkZWZtc2csIDEpOworCisJZW5jb2RpbmcgPSBnZXRfZW5jb2RpbmcobWVzc2FnZSk7CisJaWYgKCFlbmNvZGluZykKKwkJZW5jb2RpbmcgPSAidXRmLTgiOworCWlmICghZ2l0X2NvbW1pdF9lbmNvZGluZykKKwkJZ2l0X2NvbW1pdF9lbmNvZGluZyA9ICJ1dGYtOCI7CisJaWYgKChyZWVuY29kZWRfbWVzc2FnZSA9IHJlZW5jb2RlX3N0cmluZyhtZXNzYWdlLAorCQkJCQlnaXRfY29tbWl0X2VuY29kaW5nLCBlbmNvZGluZykpKQorCQltZXNzYWdlID0gcmVlbmNvZGVkX21lc3NhZ2U7CisKKwlvbmVsaW5lID0gZ2V0X29uZWxpbmUobWVzc2FnZSk7CisKKwlpZiAoYWN0aW9uID09IFJFVkVSVCkgeworCQljaGFyICpvbmVsaW5lX2JvZHkgPSBzdHJjaHIob25lbGluZSwgJyAnKTsKKworCQliYXNlID0gY29tbWl0OworCQluZXh0ID0gcGFyZW50OworCQlhZGRfdG9fbXNnKCJSZXZlcnQgXCIiKTsKKwkJYWRkX3RvX21zZyhvbmVsaW5lX2JvZHkgKyAxKTsKKwkJYWRkX3RvX21zZygiXCJcblxuVGhpcyByZXZlcnRzIGNvbW1pdCAiKTsKKwkJYWRkX3RvX21zZyhzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisJCWFkZF90b19tc2coIi5cbiIpOworCX0gZWxzZSB7CisJCWJhc2UgPSBwYXJlbnQ7CisJCW5leHQgPSBjb21taXQ7CisJCXNldF9hdXRob3JfaWRlbnRfZW52KG1lc3NhZ2UpOworCQlhZGRfbWVzc2FnZV90b19tc2cobWVzc2FnZSk7CisJCWlmIChub19yZXBsYXkpIHsKKwkJCWFkZF90b19tc2coIihjaGVycnkgcGlja2VkIGZyb20gY29tbWl0ICIpOworCQkJYWRkX3RvX21zZyhzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisJCQlhZGRfdG9fbXNnKCIpXG4iKTsKKwkJfQorCX0KKworCWlmIChtZXJnZV9yZWN1cnNpdmUoc2hhMV90b19oZXgoYmFzZS0+b2JqZWN0LnNoYTEpLAorCQkJCXNoYTFfdG9faGV4KGhlYWQpLCAiSEVBRCIsCisJCQkJc2hhMV90b19oZXgobmV4dC0+b2JqZWN0LnNoYTEpLCBvbmVsaW5lKSB8fAorCQkJd3JpdGVfY2FjaGVfYXNfdHJlZShoZWFkLCAwLCBOVUxMKSkgeworCQlhZGRfdG9fbXNnKCJcbkNvbmZsaWN0czpcblxuIik7CisJCXJlYWRfY2FjaGUoKTsKKwkJZm9yIChpID0gMDsgaSA8IGFjdGl2ZV9ucjspIHsKKwkJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaSsrXTsKKwkJCWlmIChjZV9zdGFnZShjZSkpIHsKKwkJCQlhZGRfdG9fbXNnKCJcdCIpOworCQkJCWFkZF90b19tc2coY2UtPm5hbWUpOworCQkJCWFkZF90b19tc2coIlxuIik7CisJCQkJd2hpbGUgKGkgPCBhY3RpdmVfbnIgJiYgIXN0cmNtcChjZS0+bmFtZSwKKwkJCQkJCWFjdGl2ZV9jYWNoZVtpXS0+bmFtZSkpCisJCQkJCWkrKzsKKwkJCX0KKwkJfQorCQlpZiAoY29tbWl0X2xvY2tfZmlsZSgmbXNnX2ZpbGUpIDwgMCkKKwkJCWRpZSAoIkVycm9yIHdyYXBwaW5nIHVwICVzIiwgZGVmbXNnKTsKKwkJZnByaW50ZihzdGRlcnIsICJBdXRvbWF0aWMgJXMgZmFpbGVkLiVzXG4iLAorCQkJbWUsIGhlbHBfbXNnKGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKGNvbW1pdF9sb2NrX2ZpbGUoJm1zZ19maWxlKSA8IDApCisJCWRpZSAoIkVycm9yIHdyYXBwaW5nIHVwICVzIiwgZGVmbXNnKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkZpbmlzaGVkIG9uZSAlcy5cbiIsIG1lKTsKKworCS8qCisJICoKKwkgKiBJZiB3ZSBhcmUgY2hlcnJ5LXBpY2ssIGFuZCBpZiB0aGUgbWVyZ2UgZGlkIG5vdCByZXN1bHQgaW4KKwkgKiBoYW5kLWVkaXRpbmcsIHdlIHdpbGwgaGl0IHRoaXMgY29tbWl0IGFuZCBpbmhlcml0IHRoZSBvcmlnaW5hbAorCSAqIGF1dGhvciBkYXRlIGFuZCBuYW1lLgorCSAqIElmIHdlIGFyZSByZXZlcnQsIG9yIGlmIG91ciBjaGVycnktcGljayByZXN1bHRzIGluIGEgaGFuZCBtZXJnZSwKKwkgKiB3ZSBoYWQgYmV0dGVyIHNheSB0aGF0IHRoZSBjdXJyZW50IHVzZXIgaXMgcmVzcG9uc2libGUgZm9yIHRoYXQuCisJICovCisKKwlpZiAoIW5vX2NvbW1pdCkgeworCQlpZiAoZWRpdCkKKwkJCXJldHVybiBleGVjbF9naXRfY21kKCJjb21taXQiLCAiLW4iLCBOVUxMKTsKKwkJZWxzZQorCQkJcmV0dXJuIGV4ZWNsX2dpdF9jbWQoImNvbW1pdCIsICItbiIsICItRiIsIGRlZm1zZywgTlVMTCk7CisJfQorCWZyZWUocmVlbmNvZGVkX21lc3NhZ2UpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjbWRfcmV2ZXJ0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWlmIChpc2F0dHkoMCkpCisJCWVkaXQgPSAxOworCW5vX3JlcGxheSA9IDE7CisJYWN0aW9uID0gUkVWRVJUOworCXJldHVybiByZXZlcnRfb3JfY2hlcnJ5X3BpY2soYXJnYywgYXJndik7Cit9CisKK2ludCBjbWRfY2hlcnJ5X3BpY2soaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJbm9fcmVwbGF5ID0gMDsKKwlhY3Rpb24gPSBDSEVSUllfUElDSzsKKwlyZXR1cm4gcmV2ZXJ0X29yX2NoZXJyeV9waWNrKGFyZ2MsIGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1ybS5jIGIvYnVpbHRpbi1ybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYThiYjYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLXJtLmMKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKiAiZ2l0IHJtIiBidWlsdGluIGNvbW1hbmQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzIDIwMDYKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImRpci5oIgorI2luY2x1ZGUgImNhY2hlLXRyZWUuaCIKKyNpbmNsdWRlICJ0cmVlLXdhbGsuaCIKKyNpbmNsdWRlICJwYXJzZS1vcHRpb25zLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYnVpbHRpbl9ybV91c2FnZVtdID0geworCSJnaXQtcm0gW29wdGlvbnNdIFstLV0gPGZpbGU+Li4uIiwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgbnIsIGFsbG9jOworCWNvbnN0IGNoYXIgKipuYW1lOworfSBsaXN0OworCitzdGF0aWMgdm9pZCBhZGRfbGlzdChjb25zdCBjaGFyICpuYW1lKQoreworCWlmIChsaXN0Lm5yID49IGxpc3QuYWxsb2MpIHsKKwkJbGlzdC5hbGxvYyA9IGFsbG9jX25yKGxpc3QuYWxsb2MpOworCQlsaXN0Lm5hbWUgPSB4cmVhbGxvYyhsaXN0Lm5hbWUsIGxpc3QuYWxsb2MgKiBzaXplb2YoY29uc3QgY2hhciAqKSk7CisJfQorCWxpc3QubmFtZVtsaXN0Lm5yKytdID0gbmFtZTsKK30KKworc3RhdGljIGludCByZW1vdmVfZmlsZShjb25zdCBjaGFyICpuYW1lKQoreworCWludCByZXQ7CisJY2hhciAqc2xhc2g7CisKKwlyZXQgPSB1bmxpbmsobmFtZSk7CisJaWYgKHJldCAmJiBlcnJubyA9PSBFTk9FTlQpCisJCS8qIFRoZSB1c2VyIGhhcyByZW1vdmVkIGl0IGZyb20gdGhlIGZpbGVzeXN0ZW0gYnkgaGFuZCAqLworCQlyZXQgPSBlcnJubyA9IDA7CisKKwlpZiAoIXJldCAmJiAoc2xhc2ggPSBzdHJyY2hyKG5hbWUsICcvJykpKSB7CisJCWNoYXIgKm4gPSB4c3RyZHVwKG5hbWUpOworCQlkbyB7CisJCQluW3NsYXNoIC0gbmFtZV0gPSAwOworCQkJbmFtZSA9IG47CisJCX0gd2hpbGUgKCFybWRpcihuYW1lKSAmJiAoc2xhc2ggPSBzdHJyY2hyKG5hbWUsICcvJykpKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjaGVja19sb2NhbF9tb2QodW5zaWduZWQgY2hhciAqaGVhZCwgaW50IGluZGV4X29ubHkpCit7CisJLyogaXRlbXMgaW4gbGlzdCBhcmUgYWxyZWFkeSBzb3J0ZWQgaW4gdGhlIGNhY2hlIG9yZGVyLAorCSAqIHNvIHdlIGNvdWxkIGRvIHRoaXMgYSBsb3QgbW9yZSBlZmZpY2llbnRseSBieSB1c2luZworCSAqIHRyZWVfZGVzYyBiYXNlZCB0cmF2ZXJzYWwgaWYgd2Ugd2FudGVkIHRvLCBidXQgSSBhbQorCSAqIGxhenksIGFuZCB3aG8gY2FyZXMgaWYgcmVtb3ZhbCBvZiBmaWxlcyBpcyBhIHRhZAorCSAqIHNsb3dlciB0aGFuIHRoZSB0aGVvcmV0aWNhbCBtYXhpbXVtIHNwZWVkPworCSAqLworCWludCBpLCBub19oZWFkOworCWludCBlcnJzID0gMDsKKworCW5vX2hlYWQgPSBpc19udWxsX3NoYTEoaGVhZCk7CisJZm9yIChpID0gMDsgaSA8IGxpc3QubnI7IGkrKykgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJaW50IHBvczsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZTsKKwkJY29uc3QgY2hhciAqbmFtZSA9IGxpc3QubmFtZVtpXTsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJdW5zaWduZWQgbW9kZTsKKwkJaW50IGxvY2FsX2NoYW5nZXMgPSAwOworCQlpbnQgc3RhZ2VkX2NoYW5nZXMgPSAwOworCisJCXBvcyA9IGNhY2hlX25hbWVfcG9zKG5hbWUsIHN0cmxlbihuYW1lKSk7CisJCWlmIChwb3MgPCAwKQorCQkJY29udGludWU7IC8qIHJlbW92aW5nIHVubWVyZ2VkIGVudHJ5ICovCisJCWNlID0gYWN0aXZlX2NhY2hlW3Bvc107CisKKwkJaWYgKGxzdGF0KGNlLT5uYW1lLCAmc3QpIDwgMCkgeworCQkJaWYgKGVycm5vICE9IEVOT0VOVCkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6ICclcyc6ICVzIiwKKwkJCQkJY2UtPm5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCQkvKiBJdCBhbHJlYWR5IHZhbmlzaGVkIGZyb20gdGhlIHdvcmtpbmcgdHJlZSAqLworCQkJY29udGludWU7CisJCX0KKwkJZWxzZSBpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJLyogaWYgYSBmaWxlIHdhcyByZW1vdmVkIGFuZCBpdCBpcyBub3cgYQorCQkJICogZGlyZWN0b3J5LCB0aGF0IGlzIHRoZSBzYW1lIGFzIEVOT0VOVCBhcworCQkJICogZmFyIGFzIGdpdCBpcyBjb25jZXJuZWQ7IHdlIGRvIG5vdCB0cmFjaworCQkJICogZGlyZWN0b3JpZXMuCisJCQkgKi8KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjZV9tYXRjaF9zdGF0KGNlLCAmc3QsIDApKQorCQkJbG9jYWxfY2hhbmdlcyA9IDE7CisJCWlmIChub19oZWFkCisJCSAgICAgfHwgZ2V0X3RyZWVfZW50cnkoaGVhZCwgbmFtZSwgc2hhMSwgJm1vZGUpCisJCSAgICAgfHwgY2UtPmNlX21vZGUgIT0gY3JlYXRlX2NlX21vZGUobW9kZSkKKwkJICAgICB8fCBoYXNoY21wKGNlLT5zaGExLCBzaGExKSkKKwkJCXN0YWdlZF9jaGFuZ2VzID0gMTsKKworCQlpZiAobG9jYWxfY2hhbmdlcyAmJiBzdGFnZWRfY2hhbmdlcykKKwkJCWVycnMgPSBlcnJvcigiJyVzJyBoYXMgc3RhZ2VkIGNvbnRlbnQgZGlmZmVyZW50ICIKKwkJCQkgICAgICJmcm9tIGJvdGggdGhlIGZpbGUgYW5kIHRoZSBIRUFEXG4iCisJCQkJICAgICAiKHVzZSAtZiB0byBmb3JjZSByZW1vdmFsKSIsIG5hbWUpOworCQllbHNlIGlmICghaW5kZXhfb25seSkgeworCQkJLyogSXQncyBub3QgZGFuZ2Vyb3VzIHRvIGdpdC1ybSAtLWNhY2hlZCBhCisJCQkgKiBmaWxlIGlmIHRoZSBpbmRleCBtYXRjaGVzIHRoZSBmaWxlIG9yIHRoZQorCQkJICogSEVBRCwgc2luY2UgaXQgbWVhbnMgdGhlIGRlbGV0ZWQgY29udGVudCBpcworCQkJICogc3RpbGwgYXZhaWxhYmxlIHNvbWV3aGVyZS4KKwkJCSAqLworCQkJaWYgKHN0YWdlZF9jaGFuZ2VzKQorCQkJCWVycnMgPSBlcnJvcigiJyVzJyBoYXMgY2hhbmdlcyBzdGFnZWQgaW4gdGhlIGluZGV4XG4iCisJCQkJCSAgICAgIih1c2UgLS1jYWNoZWQgdG8ga2VlcCB0aGUgZmlsZSwgIgorCQkJCQkgICAgICJvciAtZiB0byBmb3JjZSByZW1vdmFsKSIsIG5hbWUpOworCQkJaWYgKGxvY2FsX2NoYW5nZXMpCisJCQkJZXJycyA9IGVycm9yKCInJXMnIGhhcyBsb2NhbCBtb2RpZmljYXRpb25zXG4iCisJCQkJCSAgICAgIih1c2UgLS1jYWNoZWQgdG8ga2VlcCB0aGUgZmlsZSwgIgorCQkJCQkgICAgICJvciAtZiB0byBmb3JjZSByZW1vdmFsKSIsIG5hbWUpOworCQl9CisJfQorCXJldHVybiBlcnJzOworfQorCitzdGF0aWMgc3RydWN0IGxvY2tfZmlsZSBsb2NrX2ZpbGU7CisKK3N0YXRpYyBpbnQgc2hvd19vbmx5ID0gMCwgZm9yY2UgPSAwLCBpbmRleF9vbmx5ID0gMCwgcmVjdXJzaXZlID0gMCwgcXVpZXQgPSAwOworc3RhdGljIGludCBpZ25vcmVfdW5tYXRjaCA9IDA7CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGJ1aWx0aW5fcm1fb3B0aW9uc1tdID0geworCU9QVF9fRFJZX1JVTigmc2hvd19vbmx5KSwKKwlPUFRfX1FVSUVUKCZxdWlldCksCisJT1BUX0JPT0xFQU4oIDAgLCAiY2FjaGVkIiwgICAgICAgICAmaW5kZXhfb25seSwgIm9ubHkgcmVtb3ZlIGZyb20gdGhlIGluZGV4IiksCisJT1BUX0JPT0xFQU4oJ2YnLCBOVUxMLCAgICAgICAgICAgICAmZm9yY2UsICAgICAgIm92ZXJyaWRlIHRoZSB1cC10by1kYXRlIGNoZWNrIiksCisJT1BUX0JPT0xFQU4oJ3InLCBOVUxMLCAgICAgICAgICAgICAmcmVjdXJzaXZlLCAgImFsbG93IHJlY3Vyc2l2ZSByZW1vdmFsIiksCisJT1BUX0JPT0xFQU4oIDAgLCAiaWdub3JlLXVubWF0Y2giLCAmaWdub3JlX3VubWF0Y2gsCisJCQkJImV4aXQgd2l0aCBhIHplcm8gc3RhdHVzIGV2ZW4gaWYgbm90aGluZyBtYXRjaGVkIiksCisJT1BUX0VORCgpLAorfTsKKworaW50IGNtZF9ybShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaSwgbmV3ZmQ7CisJY29uc3QgY2hhciAqKnBhdGhzcGVjOworCWNoYXIgKnNlZW47CisKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwluZXdmZCA9IGhvbGRfbG9ja2VkX2luZGV4KCZsb2NrX2ZpbGUsIDEpOworCisJaWYgKHJlYWRfY2FjaGUoKSA8IDApCisJCWRpZSgiaW5kZXggZmlsZSBjb3JydXB0Iik7CisKKwlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBidWlsdGluX3JtX29wdGlvbnMsIGJ1aWx0aW5fcm1fdXNhZ2UsIDApOworCWlmICghYXJnYykKKwkJdXNhZ2Vfd2l0aF9vcHRpb25zKGJ1aWx0aW5fcm1fdXNhZ2UsIGJ1aWx0aW5fcm1fb3B0aW9ucyk7CisKKwlpZiAoIWluZGV4X29ubHkpCisJCXNldHVwX3dvcmtfdHJlZSgpOworCisJcGF0aHNwZWMgPSBnZXRfcGF0aHNwZWMocHJlZml4LCBhcmd2KTsKKwlzZWVuID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBwYXRoc3BlY1tpXSA7IGkrKykKKwkJLyogbm90aGluZyAqLzsKKwlzZWVuID0geGNhbGxvYyhpLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBhY3RpdmVfbnI7IGkrKykgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW2ldOworCQlpZiAoIW1hdGNoX3BhdGhzcGVjKHBhdGhzcGVjLCBjZS0+bmFtZSwgY2VfbmFtZWxlbihjZSksIDAsIHNlZW4pKQorCQkJY29udGludWU7CisJCWFkZF9saXN0KGNlLT5uYW1lKTsKKwl9CisKKwlpZiAocGF0aHNwZWMpIHsKKwkJY29uc3QgY2hhciAqbWF0Y2g7CisJCWludCBzZWVuX2FueSA9IDA7CisJCWZvciAoaSA9IDA7IChtYXRjaCA9IHBhdGhzcGVjW2ldKSAhPSBOVUxMIDsgaSsrKSB7CisJCQlpZiAoIXNlZW5baV0pIHsKKwkJCQlpZiAoIWlnbm9yZV91bm1hdGNoKSB7CisJCQkJCWRpZSgicGF0aHNwZWMgJyVzJyBkaWQgbm90IG1hdGNoIGFueSBmaWxlcyIsCisJCQkJCSAgICBtYXRjaCk7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJc2Vlbl9hbnkgPSAxOworCQkJfQorCQkJaWYgKCFyZWN1cnNpdmUgJiYgc2VlbltpXSA9PSBNQVRDSEVEX1JFQ1VSU0lWRUxZKQorCQkJCWRpZSgibm90IHJlbW92aW5nICclcycgcmVjdXJzaXZlbHkgd2l0aG91dCAtciIsCisJCQkJICAgICptYXRjaCA/IG1hdGNoIDogIi4iKTsKKwkJfQorCisJCWlmICghIHNlZW5fYW55KQorCQkJZXhpdCgwKTsKKwl9CisKKwkvKgorCSAqIElmIG5vdCBmb3JjZWQsIHRoZSBmaWxlLCB0aGUgaW5kZXggYW5kIHRoZSBIRUFEIChpZiBleGlzdHMpCisJICogbXVzdCBtYXRjaDsgYnV0IHRoZSBmaWxlIGNhbiBhbHJlYWR5IGJlZW4gcmVtb3ZlZCwgc2luY2UKKwkgKiB0aGlzIHNlcXVlbmNlIGlzIGEgbmF0dXJhbCAibm92aWNlIiB3YXk6CisJICoKKwkgKglybSBGOyBnaXQgcm0gRgorCSAqCisJICogRnVydGhlciwgaWYgSEVBRCBjb21taXQgZXhpc3RzLCAiZGlmZi1pbmRleCAtLWNhY2hlZCIgbXVzdAorCSAqIHJlcG9ydCBubyBjaGFuZ2VzIHVubGVzcyBmb3JjZWQuCisJICovCisJaWYgKCFmb3JjZSkgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQlpZiAoZ2V0X3NoYTEoIkhFQUQiLCBzaGExKSkKKwkJCWhhc2hjbHIoc2hhMSk7CisJCWlmIChjaGVja19sb2NhbF9tb2Qoc2hhMSwgaW5kZXhfb25seSkpCisJCQlleGl0KDEpOworCX0KKworCS8qCisJICogRmlyc3QgcmVtb3ZlIHRoZSBuYW1lcyBmcm9tIHRoZSBpbmRleDogd2Ugd29uJ3QgY29tbWl0CisJICogdGhlIGluZGV4IHVubGVzcyBhbGwgb2YgdGhlbSBzdWNjZWVkLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBsaXN0Lm5yOyBpKyspIHsKKwkJY29uc3QgY2hhciAqcGF0aCA9IGxpc3QubmFtZVtpXTsKKwkJaWYgKCFxdWlldCkKKwkJCXByaW50Zigicm0gJyVzJ1xuIiwgcGF0aCk7CisKKwkJaWYgKHJlbW92ZV9maWxlX2Zyb21fY2FjaGUocGF0aCkpCisJCQlkaWUoImdpdC1ybTogdW5hYmxlIHRvIHJlbW92ZSAlcyIsIHBhdGgpOworCX0KKworCWlmIChzaG93X29ubHkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBUaGVuLCB1bmxlc3Mgd2UgdXNlZCAiLS1jYWNoZWQiLCByZW1vdmUgdGhlIGZpbGVuYW1lcyBmcm9tCisJICogdGhlIHdvcmtzcGFjZS4gSWYgd2UgZmFpbCB0byByZW1vdmUgdGhlIGZpcnN0IG9uZSwgd2UKKwkgKiBhYm9ydCB0aGUgImdpdCBybSIgKGJ1dCBvbmNlIHdlJ3ZlIHN1Y2Nlc3NmdWxseSByZW1vdmVkCisJICogYW55IGZpbGUgYXQgYWxsLCB3ZSdsbCBnbyBhaGVhZCBhbmQgY29tbWl0IHRvIGl0IGFsbDoKKwkgKiBieSB0aGVuIHdlJ3ZlIGFscmVhZHkgY29tbWl0dGVkIG91cnNlbHZlcyBhbmQgY2FuJ3QgZmFpbAorCSAqIGluIHRoZSBtaWRkbGUpCisJICovCisJaWYgKCFpbmRleF9vbmx5KSB7CisJCWludCByZW1vdmVkID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IGxpc3QubnI7IGkrKykgeworCQkJY29uc3QgY2hhciAqcGF0aCA9IGxpc3QubmFtZVtpXTsKKwkJCWlmICghcmVtb3ZlX2ZpbGUocGF0aCkpIHsKKwkJCQlyZW1vdmVkID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcmVtb3ZlZCkKKwkJCQlkaWUoImdpdC1ybTogJXM6ICVzIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCX0KKworCWlmIChhY3RpdmVfY2FjaGVfY2hhbmdlZCkgeworCQlpZiAod3JpdGVfY2FjaGUobmV3ZmQsIGFjdGl2ZV9jYWNoZSwgYWN0aXZlX25yKSB8fAorCQkgICAgY29tbWl0X2xvY2tlZF9pbmRleCgmbG9ja19maWxlKSkKKwkJCWRpZSgiVW5hYmxlIHRvIHdyaXRlIG5ldyBpbmRleCBmaWxlIik7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXNlbmQtcGFjay5jIGIvYnVpbHRpbi1zZW5kLXBhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjljMzNhCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1zZW5kLXBhY2suYwpAQCAtMCwwICsxLDY1NSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgInBrdC1saW5lLmgiCisjaW5jbHVkZSAicnVuLWNvbW1hbmQuaCIKKyNpbmNsdWRlICJyZW1vdGUuaCIKKyNpbmNsdWRlICJzZW5kLXBhY2suaCIKKworc3RhdGljIGNvbnN0IGNoYXIgc2VuZF9wYWNrX3VzYWdlW10gPQorImdpdC1zZW5kLXBhY2sgWy0tYWxsIHwgLS1taXJyb3JdIFstLWRyeS1ydW5dIFstLWZvcmNlXSBbLS1yZWNlaXZlLXBhY2s9PGdpdC1yZWNlaXZlLXBhY2s+XSBbLS12ZXJib3NlXSBbLS10aGluXSBbPGhvc3Q+Ol08ZGlyZWN0b3J5PiBbPHJlZj4uLi5dXG4iCisiICAtLWFsbCBhbmQgZXhwbGljaXQgPHJlZj4gc3BlY2lmaWNhdGlvbiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiI7CisKK3N0YXRpYyBzdHJ1Y3Qgc2VuZF9wYWNrX2FyZ3MgYXJncyA9IHsKKwkvKiAucmVjZWl2ZXBhY2sgPSAqLyAiZ2l0LXJlY2VpdmUtcGFjayIsCit9OworCisvKgorICogTWFrZSBhIHBhY2sgc3RyZWFtIGFuZCBzcGl0IGl0IG91dCBpbnRvIGZpbGUgZGVzY3JpcHRvciBmZAorICovCitzdGF0aWMgaW50IHBhY2tfb2JqZWN0cyhpbnQgZmQsIHN0cnVjdCByZWYgKnJlZnMpCit7CisJLyoKKwkgKiBUaGUgY2hpbGQgYmVjb21lcyBwYWNrLW9iamVjdHMgLS1yZXZzOyB3ZSBmZWVkCisJICogdGhlIHJldmlzaW9uIHBhcmFtZXRlcnMgdG8gaXQgdmlhIGl0cyBzdGRpbiBhbmQKKwkgKiBsZXQgaXRzIHN0ZG91dCBnbyBiYWNrIHRvIHRoZSBvdGhlciBlbmQuCisJICovCisJY29uc3QgY2hhciAqYXJndltdID0geworCQkicGFjay1vYmplY3RzIiwKKwkJIi0tYWxsLXByb2dyZXNzIiwKKwkJIi0tcmV2cyIsCisJCSItLXN0ZG91dCIsCisJCU5VTEwsCisJCU5VTEwsCisJfTsKKwlzdHJ1Y3QgY2hpbGRfcHJvY2VzcyBwbzsKKworCWlmIChhcmdzLnVzZV90aGluX3BhY2spCisJCWFyZ3ZbNF0gPSAiLS10aGluIjsKKwltZW1zZXQoJnBvLCAwLCBzaXplb2YocG8pKTsKKwlwby5hcmd2ID0gYXJndjsKKwlwby5pbiA9IC0xOworCXBvLm91dCA9IGZkOworCXBvLmdpdF9jbWQgPSAxOworCWlmIChzdGFydF9jb21tYW5kKCZwbykpCisJCWRpZSgiZ2l0LXBhY2stb2JqZWN0cyBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CisKKwkvKgorCSAqIFdlIGZlZWQgdGhlIHBhY2stb2JqZWN0cyB3ZSBqdXN0IHNwYXduZWQgd2l0aCByZXZpc2lvbgorCSAqIHBhcmFtZXRlcnMgYnkgd3JpdGluZyB0byB0aGUgcGlwZS4KKwkgKi8KKwl3aGlsZSAocmVmcykgeworCQljaGFyIGJ1Zls0Ml07CisKKwkJaWYgKCFpc19udWxsX3NoYTEocmVmcy0+b2xkX3NoYTEpICYmCisJCSAgICBoYXNfc2hhMV9maWxlKHJlZnMtPm9sZF9zaGExKSkgeworCQkJbWVtY3B5KGJ1ZiArIDEsIHNoYTFfdG9faGV4KHJlZnMtPm9sZF9zaGExKSwgNDApOworCQkJYnVmWzBdID0gJ14nOworCQkJYnVmWzQxXSA9ICdcbic7CisJCQlpZiAoIXdyaXRlX29yX3doaW5lKHBvLmluLCBidWYsIDQyLAorCQkJCQkJInNlbmQtcGFjazogc2VuZCByZWZzIikpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFpc19udWxsX3NoYTEocmVmcy0+bmV3X3NoYTEpKSB7CisJCQltZW1jcHkoYnVmLCBzaGExX3RvX2hleChyZWZzLT5uZXdfc2hhMSksIDQwKTsKKwkJCWJ1Zls0MF0gPSAnXG4nOworCQkJaWYgKCF3cml0ZV9vcl93aGluZShwby5pbiwgYnVmLCA0MSwKKwkJCQkJCSJzZW5kLXBhY2s6IHNlbmQgcmVmcyIpKQorCQkJCWJyZWFrOworCQl9CisJCXJlZnMgPSByZWZzLT5uZXh0OworCX0KKworCWNsb3NlKHBvLmluKTsKKwlpZiAoZmluaXNoX2NvbW1hbmQoJnBvKSkKKwkJcmV0dXJuIGVycm9yKCJwYWNrLW9iamVjdHMgZGllZCB3aXRoIHN0cmFuZ2UgZXJyb3IiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdW5tYXJrX2FuZF9mcmVlKHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCwgdW5zaWduZWQgaW50IG1hcmspCit7CisJd2hpbGUgKGxpc3QpIHsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICp0ZW1wID0gbGlzdDsKKwkJdGVtcC0+aXRlbS0+b2JqZWN0LmZsYWdzICY9IH5tYXJrOworCQlsaXN0ID0gdGVtcC0+bmV4dDsKKwkJZnJlZSh0ZW1wKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmVmX25ld2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ld19zaGExLAorCQkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZF9zaGExKQoreworCXN0cnVjdCBvYmplY3QgKm87CisJc3RydWN0IGNvbW1pdCAqb2xkLCAqbmV3OworCXN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCwgKnVzZWQ7CisJaW50IGZvdW5kID0gMDsKKworCS8qIEJvdGggbmV3IGFuZCBvbGQgbXVzdCBiZSBjb21taXQtaXNoIGFuZCBuZXcgaXMgZGVzY2VuZGFudCBvZgorCSAqIG9sZC4gIE90aGVyd2lzZSB3ZSByZXF1aXJlIC0tZm9yY2UuCisJICovCisJbyA9IGRlcmVmX3RhZyhwYXJzZV9vYmplY3Qob2xkX3NoYTEpLCBOVUxMLCAwKTsKKwlpZiAoIW8gfHwgby0+dHlwZSAhPSBPQkpfQ09NTUlUKQorCQlyZXR1cm4gMDsKKwlvbGQgPSAoc3RydWN0IGNvbW1pdCAqKSBvOworCisJbyA9IGRlcmVmX3RhZyhwYXJzZV9vYmplY3QobmV3X3NoYTEpLCBOVUxMLCAwKTsKKwlpZiAoIW8gfHwgby0+dHlwZSAhPSBPQkpfQ09NTUlUKQorCQlyZXR1cm4gMDsKKwluZXcgPSAoc3RydWN0IGNvbW1pdCAqKSBvOworCisJaWYgKHBhcnNlX2NvbW1pdChuZXcpIDwgMCkKKwkJcmV0dXJuIDA7CisKKwl1c2VkID0gbGlzdCA9IE5VTEw7CisJY29tbWl0X2xpc3RfaW5zZXJ0KG5ldywgJmxpc3QpOworCXdoaWxlIChsaXN0KSB7CisJCW5ldyA9IHBvcF9tb3N0X3JlY2VudF9jb21taXQoJmxpc3QsIDEpOworCQljb21taXRfbGlzdF9pbnNlcnQobmV3LCAmdXNlZCk7CisJCWlmIChuZXcgPT0gb2xkKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwl1bm1hcmtfYW5kX2ZyZWUobGlzdCwgMSk7CisJdW5tYXJrX2FuZF9mcmVlKHVzZWQsIDEpOworCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIHN0cnVjdCByZWYgKmxvY2FsX3JlZnMsICoqbG9jYWxfdGFpbDsKK3N0YXRpYyBzdHJ1Y3QgcmVmICpyZW1vdGVfcmVmcywgKipyZW1vdGVfdGFpbDsKKworc3RhdGljIGludCBvbmVfbG9jYWxfcmVmKGNvbnN0IGNoYXIgKnJlZm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFnLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCByZWYgKnJlZjsKKwlpbnQgbGVuID0gc3RybGVuKHJlZm5hbWUpICsgMTsKKwlyZWYgPSB4Y2FsbG9jKDEsIHNpemVvZigqcmVmKSArIGxlbik7CisJaGFzaGNweShyZWYtPm5ld19zaGExLCBzaGExKTsKKwltZW1jcHkocmVmLT5uYW1lLCByZWZuYW1lLCBsZW4pOworCSpsb2NhbF90YWlsID0gcmVmOworCWxvY2FsX3RhaWwgPSAmcmVmLT5uZXh0OworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnZXRfbG9jYWxfaGVhZHModm9pZCkKK3sKKwlsb2NhbF90YWlsID0gJmxvY2FsX3JlZnM7CisJZm9yX2VhY2hfcmVmKG9uZV9sb2NhbF9yZWYsIE5VTEwpOworfQorCitzdGF0aWMgaW50IHJlY2VpdmVfc3RhdHVzKGludCBpbiwgc3RydWN0IHJlZiAqcmVmcykKK3sKKwlzdHJ1Y3QgcmVmICpoaW50OworCWNoYXIgbGluZVsxMDAwXTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgbGVuID0gcGFja2V0X3JlYWRfbGluZShpbiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKwlpZiAobGVuIDwgMTAgfHwgbWVtY21wKGxpbmUsICJ1bnBhY2sgIiwgNykpCisJCXJldHVybiBlcnJvcigiZGlkIG5vdCByZWNlaXZlIHJlbW90ZSBzdGF0dXMiKTsKKwlpZiAobWVtY21wKGxpbmUsICJ1bnBhY2sgb2tcbiIsIDEwKSkgeworCQljaGFyICpwID0gbGluZSArIHN0cmxlbihsaW5lKSAtIDE7CisJCWlmICgqcCA9PSAnXG4nKQorCQkJKnAgPSAnXDAnOworCQllcnJvcigidW5wYWNrIGZhaWxlZDogJXMiLCBsaW5lICsgNyk7CisJCXJldCA9IC0xOworCX0KKwloaW50ID0gTlVMTDsKKwl3aGlsZSAoMSkgeworCQljaGFyICpyZWZuYW1lOworCQljaGFyICptc2c7CisJCWxlbiA9IHBhY2tldF9yZWFkX2xpbmUoaW4sIGxpbmUsIHNpemVvZihsaW5lKSk7CisJCWlmICghbGVuKQorCQkJYnJlYWs7CisJCWlmIChsZW4gPCAzIHx8CisJCSAgICAobWVtY21wKGxpbmUsICJvayAiLCAzKSAmJiBtZW1jbXAobGluZSwgIm5nICIsIDMpKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJwcm90b2NvbCBlcnJvcjogJXNcbiIsIGxpbmUpOworCQkJcmV0ID0gLTE7CisJCQlicmVhazsKKwkJfQorCisJCWxpbmVbc3RybGVuKGxpbmUpLTFdID0gJ1wwJzsKKwkJcmVmbmFtZSA9IGxpbmUgKyAzOworCQltc2cgPSBzdHJjaHIocmVmbmFtZSwgJyAnKTsKKwkJaWYgKG1zZykKKwkJCSptc2crKyA9ICdcMCc7CisKKwkJLyogZmlyc3QgdHJ5IHNlYXJjaGluZyBhdCBvdXIgaGludCwgZmFsbGluZyBiYWNrIHRvIGFsbCByZWZzICovCisJCWlmIChoaW50KQorCQkJaGludCA9IGZpbmRfcmVmX2J5X25hbWUoaGludCwgcmVmbmFtZSk7CisJCWlmICghaGludCkKKwkJCWhpbnQgPSBmaW5kX3JlZl9ieV9uYW1lKHJlZnMsIHJlZm5hbWUpOworCQlpZiAoIWhpbnQpIHsKKwkJCXdhcm5pbmcoInJlbW90ZSByZXBvcnRlZCBzdGF0dXMgb24gdW5rbm93biByZWY6ICVzIiwKKwkJCQkJcmVmbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoaGludC0+c3RhdHVzICE9IFJFRl9TVEFUVVNfRVhQRUNUSU5HX1JFUE9SVCkgeworCQkJd2FybmluZygicmVtb3RlIHJlcG9ydGVkIHN0YXR1cyBvbiB1bmV4cGVjdGVkIHJlZjogJXMiLAorCQkJCQlyZWZuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGxpbmVbMF0gPT0gJ28nICYmIGxpbmVbMV0gPT0gJ2snKQorCQkJaGludC0+c3RhdHVzID0gUkVGX1NUQVRVU19PSzsKKwkJZWxzZSB7CisJCQloaW50LT5zdGF0dXMgPSBSRUZfU1RBVFVTX1JFTU9URV9SRUpFQ1Q7CisJCQlyZXQgPSAtMTsKKwkJfQorCQlpZiAobXNnKQorCQkJaGludC0+cmVtb3RlX3N0YXR1cyA9IHhzdHJkdXAobXNnKTsKKwkJLyogc3RhcnQgb3VyIG5leHQgc2VhcmNoIGZyb20gdGhlIG5leHQgcmVmICovCisJCWhpbnQgPSBoaW50LT5uZXh0OworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfdHJhY2tpbmdfcmVmKHN0cnVjdCByZW1vdGUgKnJlbW90ZSwgc3RydWN0IHJlZiAqcmVmKQoreworCXN0cnVjdCByZWZzcGVjIHJzOworCisJaWYgKHJlZi0+c3RhdHVzICE9IFJFRl9TVEFUVVNfT0spCisJCXJldHVybjsKKworCXJzLnNyYyA9IHJlZi0+bmFtZTsKKwlycy5kc3QgPSBOVUxMOworCisJaWYgKCFyZW1vdGVfZmluZF90cmFja2luZyhyZW1vdGUsICZycykpIHsKKwkJaWYgKGFyZ3MudmVyYm9zZSkKKwkJCWZwcmludGYoc3RkZXJyLCAidXBkYXRpbmcgbG9jYWwgdHJhY2tpbmcgcmVmICclcydcbiIsIHJzLmRzdCk7CisJCWlmIChyZWYtPmRlbGV0aW9uKSB7CisJCQlpZiAoZGVsZXRlX3JlZihycy5kc3QsIE5VTEwpKQorCQkJCWVycm9yKCJGYWlsZWQgdG8gZGVsZXRlIik7CisJCX0gZWxzZQorCQkJdXBkYXRlX3JlZigidXBkYXRlIGJ5IHB1c2giLCBycy5kc3QsCisJCQkJCXJlZi0+bmV3X3NoYTEsIE5VTEwsIDAsIDApOworCQlmcmVlKHJzLmRzdCk7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqcHJldHRpZnlfcmVmKGNvbnN0IHN0cnVjdCByZWYgKnJlZikKK3sKKwljb25zdCBjaGFyICpuYW1lID0gcmVmLT5uYW1lOworCXJldHVybiBuYW1lICsgKAorCQkhcHJlZml4Y21wKG5hbWUsICJyZWZzL2hlYWRzLyIpID8gMTEgOgorCQkhcHJlZml4Y21wKG5hbWUsICJyZWZzL3RhZ3MvIikgPyAxMCA6CisJCSFwcmVmaXhjbXAobmFtZSwgInJlZnMvcmVtb3Rlcy8iKSA/IDEzIDoKKwkJMCk7Cit9CisKKyNkZWZpbmUgU1VNTUFSWV9XSURUSCAoMiAqIERFRkFVTFRfQUJCUkVWICsgMykKKworc3RhdGljIHZvaWQgcHJpbnRfcmVmX3N0YXR1cyhjaGFyIGZsYWcsIGNvbnN0IGNoYXIgKnN1bW1hcnksIHN0cnVjdCByZWYgKnRvLCBzdHJ1Y3QgcmVmICpmcm9tLCBjb25zdCBjaGFyICptc2cpCit7CisJZnByaW50ZihzdGRlcnIsICIgJWMgJS0qcyAiLCBmbGFnLCBTVU1NQVJZX1dJRFRILCBzdW1tYXJ5KTsKKwlpZiAoZnJvbSkKKwkJZnByaW50ZihzdGRlcnIsICIlcyAtPiAlcyIsIHByZXR0aWZ5X3JlZihmcm9tKSwgcHJldHRpZnlfcmVmKHRvKSk7CisJZWxzZQorCQlmcHV0cyhwcmV0dGlmeV9yZWYodG8pLCBzdGRlcnIpOworCWlmIChtc2cpIHsKKwkJZnB1dHMoIiAoIiwgc3RkZXJyKTsKKwkJZnB1dHMobXNnLCBzdGRlcnIpOworCQlmcHV0YygnKScsIHN0ZGVycik7CisJfQorCWZwdXRjKCdcbicsIHN0ZGVycik7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpzdGF0dXNfYWJicmV2KHVuc2lnbmVkIGNoYXIgc2hhMVsyMF0pCit7CisJcmV0dXJuIGZpbmRfdW5pcXVlX2FiYnJldihzaGExLCBERUZBVUxUX0FCQlJFVik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X29rX3JlZl9zdGF0dXMoc3RydWN0IHJlZiAqcmVmKQoreworCWlmIChyZWYtPmRlbGV0aW9uKQorCQlwcmludF9yZWZfc3RhdHVzKCctJywgIltkZWxldGVkXSIsIHJlZiwgTlVMTCwgTlVMTCk7CisJZWxzZSBpZiAoaXNfbnVsbF9zaGExKHJlZi0+b2xkX3NoYTEpKQorCQlwcmludF9yZWZfc3RhdHVzKCcqJywKKwkJCSghcHJlZml4Y21wKHJlZi0+bmFtZSwgInJlZnMvdGFncy8iKSA/ICJbbmV3IHRhZ10iIDoKKwkJCSAgIltuZXcgYnJhbmNoXSIpLAorCQkJcmVmLCByZWYtPnBlZXJfcmVmLCBOVUxMKTsKKwllbHNlIHsKKwkJY2hhciBxdWlja3JlZls4NF07CisJCWNoYXIgdHlwZTsKKwkJY29uc3QgY2hhciAqbXNnOworCisJCXN0cmNweShxdWlja3JlZiwgc3RhdHVzX2FiYnJldihyZWYtPm9sZF9zaGExKSk7CisJCWlmIChyZWYtPm5vbmZhc3Rmb3J3YXJkKSB7CisJCQlzdHJjYXQocXVpY2tyZWYsICIuLi4iKTsKKwkJCXR5cGUgPSAnKyc7CisJCQltc2cgPSAiZm9yY2VkIHVwZGF0ZSI7CisJCX0gZWxzZSB7CisJCQlzdHJjYXQocXVpY2tyZWYsICIuLiIpOworCQkJdHlwZSA9ICcgJzsKKwkJCW1zZyA9IE5VTEw7CisJCX0KKwkJc3RyY2F0KHF1aWNrcmVmLCBzdGF0dXNfYWJicmV2KHJlZi0+bmV3X3NoYTEpKTsKKworCQlwcmludF9yZWZfc3RhdHVzKHR5cGUsIHF1aWNrcmVmLCByZWYsIHJlZi0+cGVlcl9yZWYsIG1zZyk7CisJfQorfQorCitzdGF0aWMgaW50IHByaW50X29uZV9wdXNoX3N0YXR1cyhzdHJ1Y3QgcmVmICpyZWYsIGNvbnN0IGNoYXIgKmRlc3QsIGludCBjb3VudCkKK3sKKwlpZiAoIWNvdW50KQorCQlmcHJpbnRmKHN0ZGVyciwgIlRvICVzXG4iLCBkZXN0KTsKKworCXN3aXRjaChyZWYtPnN0YXR1cykgeworCWNhc2UgUkVGX1NUQVRVU19OT05FOgorCQlwcmludF9yZWZfc3RhdHVzKCdYJywgIltubyBtYXRjaF0iLCByZWYsIE5VTEwsIE5VTEwpOworCQlicmVhazsKKwljYXNlIFJFRl9TVEFUVVNfUkVKRUNUX05PREVMRVRFOgorCQlwcmludF9yZWZfc3RhdHVzKCchJywgIltyZWplY3RlZF0iLCByZWYsIE5VTEwsCisJCQkJInJlbW90ZSBkb2VzIG5vdCBzdXBwb3J0IGRlbGV0aW5nIHJlZnMiKTsKKwkJYnJlYWs7CisJY2FzZSBSRUZfU1RBVFVTX1VQVE9EQVRFOgorCQlwcmludF9yZWZfc3RhdHVzKCc9JywgIlt1cCB0byBkYXRlXSIsIHJlZiwKKwkJCQlyZWYtPnBlZXJfcmVmLCBOVUxMKTsKKwkJYnJlYWs7CisJY2FzZSBSRUZfU1RBVFVTX1JFSkVDVF9OT05GQVNURk9SV0FSRDoKKwkJcHJpbnRfcmVmX3N0YXR1cygnIScsICJbcmVqZWN0ZWRdIiwgcmVmLCByZWYtPnBlZXJfcmVmLAorCQkJCSJub24tZmFzdCBmb3J3YXJkIik7CisJCWJyZWFrOworCWNhc2UgUkVGX1NUQVRVU19SRU1PVEVfUkVKRUNUOgorCQlwcmludF9yZWZfc3RhdHVzKCchJywgIltyZW1vdGUgcmVqZWN0ZWRdIiwgcmVmLAorCQkJCXJlZi0+ZGVsZXRpb24gPyBOVUxMIDogcmVmLT5wZWVyX3JlZiwKKwkJCQlyZWYtPnJlbW90ZV9zdGF0dXMpOworCQlicmVhazsKKwljYXNlIFJFRl9TVEFUVVNfRVhQRUNUSU5HX1JFUE9SVDoKKwkJcHJpbnRfcmVmX3N0YXR1cygnIScsICJbcmVtb3RlIGZhaWx1cmVdIiwgcmVmLAorCQkJCXJlZi0+ZGVsZXRpb24gPyBOVUxMIDogcmVmLT5wZWVyX3JlZiwKKwkJCQkicmVtb3RlIGZhaWxlZCB0byByZXBvcnQgc3RhdHVzIik7CisJCWJyZWFrOworCWNhc2UgUkVGX1NUQVRVU19PSzoKKwkJcHJpbnRfb2tfcmVmX3N0YXR1cyhyZWYpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcHVzaF9zdGF0dXMoY29uc3QgY2hhciAqZGVzdCwgc3RydWN0IHJlZiAqcmVmcykKK3sKKwlzdHJ1Y3QgcmVmICpyZWY7CisJaW50IG4gPSAwOworCisJaWYgKGFyZ3MudmVyYm9zZSkgeworCQlmb3IgKHJlZiA9IHJlZnM7IHJlZjsgcmVmID0gcmVmLT5uZXh0KQorCQkJaWYgKHJlZi0+c3RhdHVzID09IFJFRl9TVEFUVVNfVVBUT0RBVEUpCisJCQkJbiArPSBwcmludF9vbmVfcHVzaF9zdGF0dXMocmVmLCBkZXN0LCBuKTsKKwl9CisKKwlmb3IgKHJlZiA9IHJlZnM7IHJlZjsgcmVmID0gcmVmLT5uZXh0KQorCQlpZiAocmVmLT5zdGF0dXMgPT0gUkVGX1NUQVRVU19PSykKKwkJCW4gKz0gcHJpbnRfb25lX3B1c2hfc3RhdHVzKHJlZiwgZGVzdCwgbik7CisKKwlmb3IgKHJlZiA9IHJlZnM7IHJlZjsgcmVmID0gcmVmLT5uZXh0KSB7CisJCWlmIChyZWYtPnN0YXR1cyAhPSBSRUZfU1RBVFVTX05PTkUgJiYKKwkJICAgIHJlZi0+c3RhdHVzICE9IFJFRl9TVEFUVVNfVVBUT0RBVEUgJiYKKwkJICAgIHJlZi0+c3RhdHVzICE9IFJFRl9TVEFUVVNfT0spCisJCQluICs9IHByaW50X29uZV9wdXNoX3N0YXR1cyhyZWYsIGRlc3QsIG4pOworCX0KK30KKworc3RhdGljIGludCByZWZzX3B1c2hlZChzdHJ1Y3QgcmVmICpyZWYpCit7CisJZm9yICg7IHJlZjsgcmVmID0gcmVmLT5uZXh0KSB7CisJCXN3aXRjaChyZWYtPnN0YXR1cykgeworCQljYXNlIFJFRl9TVEFUVVNfTk9ORToKKwkJY2FzZSBSRUZfU1RBVFVTX1VQVE9EQVRFOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19zZW5kX3BhY2soaW50IGluLCBpbnQgb3V0LCBzdHJ1Y3QgcmVtb3RlICpyZW1vdGUsIGNvbnN0IGNoYXIgKmRlc3QsIGludCBucl9yZWZzcGVjLCBjb25zdCBjaGFyICoqcmVmc3BlYykKK3sKKwlzdHJ1Y3QgcmVmICpyZWY7CisJaW50IG5ld19yZWZzOworCWludCBhc2tfZm9yX3N0YXR1c19yZXBvcnQgPSAwOworCWludCBhbGxvd19kZWxldGluZ19yZWZzID0gMDsKKwlpbnQgZXhwZWN0X3N0YXR1c19yZXBvcnQgPSAwOworCWludCBmbGFncyA9IE1BVENIX1JFRlNfTk9ORTsKKwlpbnQgcmV0OworCisJaWYgKGFyZ3Muc2VuZF9hbGwpCisJCWZsYWdzIHw9IE1BVENIX1JFRlNfQUxMOworCWlmIChhcmdzLnNlbmRfbWlycm9yKQorCQlmbGFncyB8PSBNQVRDSF9SRUZTX01JUlJPUjsKKworCS8qIE5vIGZ1bm55IGJ1c2luZXNzIHdpdGggdGhlIG1hdGNoZXIgKi8KKwlyZW1vdGVfdGFpbCA9IGdldF9yZW1vdGVfaGVhZHMoaW4sICZyZW1vdGVfcmVmcywgMCwgTlVMTCwgUkVGX05PUk1BTCk7CisJZ2V0X2xvY2FsX2hlYWRzKCk7CisKKwkvKiBEb2VzIHRoZSBvdGhlciBlbmQgc3VwcG9ydCB0aGUgcmVwb3J0aW5nPyAqLworCWlmIChzZXJ2ZXJfc3VwcG9ydHMoInJlcG9ydC1zdGF0dXMiKSkKKwkJYXNrX2Zvcl9zdGF0dXNfcmVwb3J0ID0gMTsKKwlpZiAoc2VydmVyX3N1cHBvcnRzKCJkZWxldGUtcmVmcyIpKQorCQlhbGxvd19kZWxldGluZ19yZWZzID0gMTsKKworCS8qIG1hdGNoIHRoZW0gdXAgKi8KKwlpZiAoIXJlbW90ZV90YWlsKQorCQlyZW1vdGVfdGFpbCA9ICZyZW1vdGVfcmVmczsKKwlpZiAobWF0Y2hfcmVmcyhsb2NhbF9yZWZzLCByZW1vdGVfcmVmcywgJnJlbW90ZV90YWlsLAorCQkgICAgICAgbnJfcmVmc3BlYywgcmVmc3BlYywgZmxhZ3MpKSB7CisJCWNsb3NlKG91dCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIXJlbW90ZV9yZWZzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm8gcmVmcyBpbiBjb21tb24gYW5kIG5vbmUgc3BlY2lmaWVkOyBkb2luZyBub3RoaW5nLlxuIgorCQkJIlBlcmhhcHMgeW91IHNob3VsZCBzcGVjaWZ5IGEgYnJhbmNoIHN1Y2ggYXMgJ21hc3RlcicuXG4iKTsKKwkJY2xvc2Uob3V0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBGaW5hbGx5LCB0ZWxsIHRoZSBvdGhlciBlbmQhCisJICovCisJbmV3X3JlZnMgPSAwOworCWZvciAocmVmID0gcmVtb3RlX3JlZnM7IHJlZjsgcmVmID0gcmVmLT5uZXh0KSB7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ld19zaGExOworCisJCWlmICghcmVmLT5wZWVyX3JlZikgeworCQkJaWYgKCFhcmdzLnNlbmRfbWlycm9yKQorCQkJCWNvbnRpbnVlOworCQkJbmV3X3NoYTEgPSBudWxsX3NoYTE7CisJCX0KKwkJZWxzZQorCQkJbmV3X3NoYTEgPSByZWYtPnBlZXJfcmVmLT5uZXdfc2hhMTsKKworCisJCXJlZi0+ZGVsZXRpb24gPSBpc19udWxsX3NoYTEobmV3X3NoYTEpOworCQlpZiAocmVmLT5kZWxldGlvbiAmJiAhYWxsb3dfZGVsZXRpbmdfcmVmcykgeworCQkJcmVmLT5zdGF0dXMgPSBSRUZfU1RBVFVTX1JFSkVDVF9OT0RFTEVURTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcmVmLT5kZWxldGlvbiAmJgorCQkgICAgIWhhc2hjbXAocmVmLT5vbGRfc2hhMSwgbmV3X3NoYTEpKSB7CisJCQlyZWYtPnN0YXR1cyA9IFJFRl9TVEFUVVNfVVBUT0RBVEU7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFRoaXMgcGFydCBkZXRlcm1pbmVzIHdoYXQgY2FuIG92ZXJ3cml0ZSB3aGF0LgorCQkgKiBUaGUgcnVsZXMgYXJlOgorCQkgKgorCQkgKiAoMCkgeW91IGNhbiBhbHdheXMgdXNlIC0tZm9yY2Ugb3IgK0E6QiBub3RhdGlvbiB0bworCQkgKiAgICAgc2VsZWN0aXZlbHkgZm9yY2UgaW5kaXZpZHVhbCByZWYgcGFpcnMuCisJCSAqCisJCSAqICgxKSBpZiB0aGUgb2xkIHRoaW5nIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBPSy4KKwkJICoKKwkJICogKDIpIGlmIHlvdSBkbyBub3QgaGF2ZSB0aGUgb2xkIHRoaW5nLCB5b3UgYXJlIG5vdCBhbGxvd2VkCisJCSAqICAgICB0byBvdmVyd3JpdGUgaXQ7IHlvdSB3b3VsZCBub3Qga25vdyB3aGF0IHlvdSBhcmUgbG9zaW5nCisJCSAqICAgICBvdGhlcndpc2UuCisJCSAqCisJCSAqICgzKSBpZiBib3RoIG5ldyBhbmQgb2xkIGFyZSBjb21taXQtaXNoLCBhbmQgbmV3IGlzIGEKKwkJICogICAgIGRlc2NlbmRhbnQgb2Ygb2xkLCBpdCBpcyBPSy4KKwkJICoKKwkJICogKDQpIHJlZ2FyZGxlc3Mgb2YgYWxsIG9mIHRoZSBhYm92ZSwgcmVtb3ZpbmcgOkIgaXMKKwkJICogICAgIGFsd2F5cyBhbGxvd2VkLgorCQkgKi8KKworCQlyZWYtPm5vbmZhc3Rmb3J3YXJkID0KKwkJICAgICFyZWYtPmRlbGV0aW9uICYmCisJCSAgICAhaXNfbnVsbF9zaGExKHJlZi0+b2xkX3NoYTEpICYmCisJCSAgICAoIWhhc19zaGExX2ZpbGUocmVmLT5vbGRfc2hhMSkKKwkJICAgICAgfHwgIXJlZl9uZXdlcihuZXdfc2hhMSwgcmVmLT5vbGRfc2hhMSkpOworCisJCWlmIChyZWYtPm5vbmZhc3Rmb3J3YXJkICYmICFyZWYtPmZvcmNlICYmICFhcmdzLmZvcmNlX3VwZGF0ZSkgeworCQkJcmVmLT5zdGF0dXMgPSBSRUZfU1RBVFVTX1JFSkVDVF9OT05GQVNURk9SV0FSRDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaGFzaGNweShyZWYtPm5ld19zaGExLCBuZXdfc2hhMSk7CisJCWlmICghcmVmLT5kZWxldGlvbikKKwkJCW5ld19yZWZzKys7CisKKwkJaWYgKCFhcmdzLmRyeV9ydW4pIHsKKwkJCWNoYXIgKm9sZF9oZXggPSBzaGExX3RvX2hleChyZWYtPm9sZF9zaGExKTsKKwkJCWNoYXIgKm5ld19oZXggPSBzaGExX3RvX2hleChyZWYtPm5ld19zaGExKTsKKworCQkJaWYgKGFza19mb3Jfc3RhdHVzX3JlcG9ydCkgeworCQkJCXBhY2tldF93cml0ZShvdXQsICIlcyAlcyAlcyVjJXMiLAorCQkJCQlvbGRfaGV4LCBuZXdfaGV4LCByZWYtPm5hbWUsIDAsCisJCQkJCSJyZXBvcnQtc3RhdHVzIik7CisJCQkJYXNrX2Zvcl9zdGF0dXNfcmVwb3J0ID0gMDsKKwkJCQlleHBlY3Rfc3RhdHVzX3JlcG9ydCA9IDE7CisJCQl9CisJCQllbHNlCisJCQkJcGFja2V0X3dyaXRlKG91dCwgIiVzICVzICVzIiwKKwkJCQkJb2xkX2hleCwgbmV3X2hleCwgcmVmLT5uYW1lKTsKKwkJfQorCQlyZWYtPnN0YXR1cyA9IGV4cGVjdF9zdGF0dXNfcmVwb3J0ID8KKwkJCVJFRl9TVEFUVVNfRVhQRUNUSU5HX1JFUE9SVCA6CisJCQlSRUZfU1RBVFVTX09LOworCX0KKworCXBhY2tldF9mbHVzaChvdXQpOworCWlmIChuZXdfcmVmcyAmJiAhYXJncy5kcnlfcnVuKSB7CisJCWlmIChwYWNrX29iamVjdHMob3V0LCByZW1vdGVfcmVmcykgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KKwllbHNlCisJCWNsb3NlKG91dCk7CisKKwlpZiAoZXhwZWN0X3N0YXR1c19yZXBvcnQpCisJCXJldCA9IHJlY2VpdmVfc3RhdHVzKGluLCByZW1vdGVfcmVmcyk7CisJZWxzZQorCQlyZXQgPSAwOworCisJcHJpbnRfcHVzaF9zdGF0dXMoZGVzdCwgcmVtb3RlX3JlZnMpOworCisJaWYgKCFhcmdzLmRyeV9ydW4gJiYgcmVtb3RlKSB7CisJCWZvciAocmVmID0gcmVtb3RlX3JlZnM7IHJlZjsgcmVmID0gcmVmLT5uZXh0KQorCQkJdXBkYXRlX3RyYWNraW5nX3JlZihyZW1vdGUsIHJlZik7CisJfQorCisJaWYgKCFyZWZzX3B1c2hlZChyZW1vdGVfcmVmcykpCisJCWZwcmludGYoc3RkZXJyLCAiRXZlcnl0aGluZyB1cC10by1kYXRlXG4iKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlmb3IgKHJlZiA9IHJlbW90ZV9yZWZzOyByZWY7IHJlZiA9IHJlZi0+bmV4dCkgeworCQlzd2l0Y2ggKHJlZi0+c3RhdHVzKSB7CisJCWNhc2UgUkVGX1NUQVRVU19OT05FOgorCQljYXNlIFJFRl9TVEFUVVNfVVBUT0RBVEU6CisJCWNhc2UgUkVGX1NUQVRVU19PSzoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2ZXJpZnlfcmVtb3RlX25hbWVzKGludCBucl9oZWFkcywgY29uc3QgY2hhciAqKmhlYWRzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5yX2hlYWRzOyBpKyspIHsKKwkJY29uc3QgY2hhciAqcmVtb3RlID0gc3RycmNocihoZWFkc1tpXSwgJzonKTsKKworCQlyZW1vdGUgPSByZW1vdGUgPyAocmVtb3RlICsgMSkgOiBoZWFkc1tpXTsKKwkJc3dpdGNoIChjaGVja19yZWZfZm9ybWF0KHJlbW90ZSkpIHsKKwkJY2FzZSAwOiAvKiBvayAqLworCQljYXNlIENIRUNLX1JFRl9GT1JNQVRfT05FTEVWRUw6CisJCQkvKiBvayBidXQgYSBzaW5nbGUgbGV2ZWwgLS0gdGhhdCBpcyBmaW5lIGZvcgorCQkJICogYSBtYXRjaCBwYXR0ZXJuLgorCQkJICovCisJCWNhc2UgQ0hFQ0tfUkVGX0ZPUk1BVF9XSUxEQ0FSRDoKKwkJCS8qIG9rIGJ1dCBlbmRzIHdpdGggYSBwYXR0ZXJuLW1hdGNoIGNoYXJhY3RlciAqLworCQkJY29udGludWU7CisJCX0KKwkJZGllKCJyZW1vdGUgcGFydCBvZiByZWZzcGVjIGlzIG5vdCBhIHZhbGlkIG5hbWUgaW4gJXMiLAorCQkgICAgaGVhZHNbaV0pOworCX0KK30KKworaW50IGNtZF9zZW5kX3BhY2soaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGksIG5yX2hlYWRzID0gMDsKKwljb25zdCBjaGFyICoqaGVhZHMgPSBOVUxMOworCWNvbnN0IGNoYXIgKnJlbW90ZV9uYW1lID0gTlVMTDsKKwlzdHJ1Y3QgcmVtb3RlICpyZW1vdGUgPSBOVUxMOworCWNvbnN0IGNoYXIgKmRlc3QgPSBOVUxMOworCisJYXJndisrOworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyssIGFyZ3YrKykgeworCQljb25zdCBjaGFyICphcmcgPSAqYXJndjsKKworCQlpZiAoKmFyZyA9PSAnLScpIHsKKwkJCWlmICghcHJlZml4Y21wKGFyZywgIi0tcmVjZWl2ZS1wYWNrPSIpKSB7CisJCQkJYXJncy5yZWNlaXZlcGFjayA9IGFyZyArIDE1OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1leGVjPSIpKSB7CisJCQkJYXJncy5yZWNlaXZlcGFjayA9IGFyZyArIDc7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXByZWZpeGNtcChhcmcsICItLXJlbW90ZT0iKSkgeworCQkJCXJlbW90ZV9uYW1lID0gYXJnICsgOTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tYWxsIikpIHsKKwkJCQlhcmdzLnNlbmRfYWxsID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tZHJ5LXJ1biIpKSB7CisJCQkJYXJncy5kcnlfcnVuID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tbWlycm9yIikpIHsKKwkJCQlhcmdzLnNlbmRfbWlycm9yID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tZm9yY2UiKSkgeworCQkJCWFyZ3MuZm9yY2VfdXBkYXRlID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tdmVyYm9zZSIpKSB7CisJCQkJYXJncy52ZXJib3NlID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tdGhpbiIpKSB7CisJCQkJYXJncy51c2VfdGhpbl9wYWNrID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXVzYWdlKHNlbmRfcGFja191c2FnZSk7CisJCX0KKwkJaWYgKCFkZXN0KSB7CisJCQlkZXN0ID0gYXJnOworCQkJY29udGludWU7CisJCX0KKwkJaGVhZHMgPSAoY29uc3QgY2hhciAqKikgYXJndjsKKwkJbnJfaGVhZHMgPSBhcmdjIC0gaTsKKwkJYnJlYWs7CisJfQorCWlmICghZGVzdCkKKwkJdXNhZ2Uoc2VuZF9wYWNrX3VzYWdlKTsKKwkvKgorCSAqIC0tYWxsIGFuZCAtLW1pcnJvciBhcmUgaW5jb21wYXRpYmxlOyBuZWl0aGVyIG1ha2VzIHNlbnNlCisJICogd2l0aCBhbnkgcmVmc3BlY3MuCisJICovCisJaWYgKChoZWFkcyAmJiAoYXJncy5zZW5kX2FsbCB8fCBhcmdzLnNlbmRfbWlycm9yKSkgfHwKKwkJCQkJKGFyZ3Muc2VuZF9hbGwgJiYgYXJncy5zZW5kX21pcnJvcikpCisJCXVzYWdlKHNlbmRfcGFja191c2FnZSk7CisKKwlpZiAocmVtb3RlX25hbWUpIHsKKwkJcmVtb3RlID0gcmVtb3RlX2dldChyZW1vdGVfbmFtZSk7CisJCWlmICghcmVtb3RlX2hhc191cmwocmVtb3RlLCBkZXN0KSkgeworCQkJZGllKCJEZXN0aW5hdGlvbiAlcyBpcyBub3QgYSB1cmkgZm9yICVzIiwKKwkJCSAgICBkZXN0LCByZW1vdGVfbmFtZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gc2VuZF9wYWNrKCZhcmdzLCBkZXN0LCByZW1vdGUsIG5yX2hlYWRzLCBoZWFkcyk7Cit9CisKK2ludCBzZW5kX3BhY2soc3RydWN0IHNlbmRfcGFja19hcmdzICpteV9hcmdzLAorCSAgICAgIGNvbnN0IGNoYXIgKmRlc3QsIHN0cnVjdCByZW1vdGUgKnJlbW90ZSwKKwkgICAgICBpbnQgbnJfaGVhZHMsIGNvbnN0IGNoYXIgKipoZWFkcykKK3sKKwlpbnQgZmRbMl0sIHJldDsKKwlzdHJ1Y3QgY2hpbGRfcHJvY2VzcyAqY29ubjsKKworCW1lbWNweSgmYXJncywgbXlfYXJncywgc2l6ZW9mKGFyZ3MpKTsKKworCXZlcmlmeV9yZW1vdGVfbmFtZXMobnJfaGVhZHMsIGhlYWRzKTsKKworCWNvbm4gPSBnaXRfY29ubmVjdChmZCwgZGVzdCwgYXJncy5yZWNlaXZlcGFjaywgYXJncy52ZXJib3NlID8gQ09OTkVDVF9WRVJCT1NFIDogMCk7CisJcmV0ID0gZG9fc2VuZF9wYWNrKGZkWzBdLCBmZFsxXSwgcmVtb3RlLCBkZXN0LCBucl9oZWFkcywgaGVhZHMpOworCWNsb3NlKGZkWzBdKTsKKwkvKiBkb19zZW5kX3BhY2sgYWx3YXlzIGNsb3NlcyBmZFsxXSAqLworCXJldCB8PSBmaW5pc2hfY29ubmVjdChjb25uKTsKKwlyZXR1cm4gISFyZXQ7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXNob3J0bG9nLmMgYi9idWlsdGluLXNob3J0bG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ3OTViMQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tc2hvcnRsb2cuYwpAQCAtMCwwICsxLDMxMyBAQAorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJwYXRoLWxpc3QuaCIKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorI2luY2x1ZGUgInV0ZjguaCIKKyNpbmNsdWRlICJtYWlsbWFwLmgiCisjaW5jbHVkZSAic2hvcnRsb2cuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgc2hvcnRsb2dfdXNhZ2VbXSA9CisiZ2l0LXNob3J0bG9nIFstbl0gWy1zXSBbLWVdIFs8Y29tbWl0LWlkPi4uLiBdIjsKKworc3RhdGljIGludCBjb21wYXJlX2J5X251bWJlcihjb25zdCB2b2lkICphMSwgY29uc3Qgdm9pZCAqYTIpCit7CisJY29uc3Qgc3RydWN0IHBhdGhfbGlzdF9pdGVtICppMSA9IGExLCAqaTIgPSBhMjsKKwljb25zdCBzdHJ1Y3QgcGF0aF9saXN0ICpsMSA9IGkxLT51dGlsLCAqbDIgPSBpMi0+dXRpbDsKKworCWlmIChsMS0+bnIgPCBsMi0+bnIpCisJCXJldHVybiAxOworCWVsc2UgaWYgKGwxLT5uciA9PSBsMi0+bnIpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBpbnNlcnRfb25lX3JlY29yZChzdHJ1Y3Qgc2hvcnRsb2cgKmxvZywKKwkJCSAgICAgIGNvbnN0IGNoYXIgKmF1dGhvciwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKm9uZWxpbmUpCit7CisJY29uc3QgY2hhciAqZG90MyA9IGxvZy0+Y29tbW9uX3JlcG9fcHJlZml4OworCWNoYXIgKmJ1ZmZlciwgKnA7CisJc3RydWN0IHBhdGhfbGlzdF9pdGVtICppdGVtOworCXN0cnVjdCBwYXRoX2xpc3QgKm9uZWxpbmVzOworCWNoYXIgbmFtZWJ1ZlsxMDI0XTsKKwlzaXplX3QgbGVuOworCWNvbnN0IGNoYXIgKmVvbDsKKwljb25zdCBjaGFyICpib2VtYWlsLCAqZW9lbWFpbDsKKworCWJvZW1haWwgPSBzdHJjaHIoYXV0aG9yLCAnPCcpOworCWlmICghYm9lbWFpbCkKKwkJcmV0dXJuOworCWVvZW1haWwgPSBzdHJjaHIoYm9lbWFpbCwgJz4nKTsKKwlpZiAoIWVvZW1haWwpCisJCXJldHVybjsKKwlpZiAoIW1hcF9lbWFpbCgmbG9nLT5tYWlsbWFwLCBib2VtYWlsKzEsIG5hbWVidWYsIHNpemVvZihuYW1lYnVmKSkpIHsKKwkJd2hpbGUgKGF1dGhvciA8IGJvZW1haWwgJiYgaXNzcGFjZSgqYXV0aG9yKSkKKwkJCWF1dGhvcisrOworCQlmb3IgKGxlbiA9IDA7CisJCSAgICAgbGVuIDwgc2l6ZW9mKG5hbWVidWYpIC0gMSAmJiBhdXRob3IgKyBsZW4gPCBib2VtYWlsOworCQkgICAgIGxlbisrKQorCQkJbmFtZWJ1ZltsZW5dID0gYXV0aG9yW2xlbl07CisJCXdoaWxlICgwIDwgbGVuICYmIGlzc3BhY2UobmFtZWJ1ZltsZW4tMV0pKQorCQkJbGVuLS07CisJCW5hbWVidWZbbGVuXSA9ICdcMCc7CisJfQorCWVsc2UKKwkJbGVuID0gc3RybGVuKG5hbWVidWYpOworCisJaWYgKGxvZy0+ZW1haWwpIHsKKwkJc2l6ZV90IHJvb20gPSBzaXplb2YobmFtZWJ1ZikgLSBsZW4gLSAxOworCQlpbnQgbWFpbGxlbiA9IGVvZW1haWwgLSBib2VtYWlsICsgMTsKKwkJc25wcmludGYobmFtZWJ1ZiArIGxlbiwgcm9vbSwgIiAlLipzIiwgbWFpbGxlbiwgYm9lbWFpbCk7CisJfQorCisJYnVmZmVyID0geHN0cmR1cChuYW1lYnVmKTsKKwlpdGVtID0gcGF0aF9saXN0X2luc2VydChidWZmZXIsICZsb2ctPmxpc3QpOworCWlmIChpdGVtLT51dGlsID09IE5VTEwpCisJCWl0ZW0tPnV0aWwgPSB4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcGF0aF9saXN0KSk7CisJZWxzZQorCQlmcmVlKGJ1ZmZlcik7CisKKwkvKiBTa2lwIGFueSBsZWFkaW5nIHdoaXRlc3BhY2UsIGluY2x1ZGluZyBhbnkgYmxhbmsgbGluZXMuICovCisJd2hpbGUgKCpvbmVsaW5lICYmIGlzc3BhY2UoKm9uZWxpbmUpKQorCQlvbmVsaW5lKys7CisJZW9sID0gc3RyY2hyKG9uZWxpbmUsICdcbicpOworCWlmICghZW9sKQorCQllb2wgPSBvbmVsaW5lICsgc3RybGVuKG9uZWxpbmUpOworCWlmICghcHJlZml4Y21wKG9uZWxpbmUsICJbUEFUQ0giKSkgeworCQljaGFyICplb2IgPSBzdHJjaHIob25lbGluZSwgJ10nKTsKKwkJaWYgKGVvYiAmJiAoIWVvbCB8fCBlb2IgPCBlb2wpKQorCQkJb25lbGluZSA9IGVvYiArIDE7CisJfQorCXdoaWxlICgqb25lbGluZSAmJiBpc3NwYWNlKCpvbmVsaW5lKSAmJiAqb25lbGluZSAhPSAnXG4nKQorCQlvbmVsaW5lKys7CisJbGVuID0gZW9sIC0gb25lbGluZTsKKwl3aGlsZSAobGVuICYmIGlzc3BhY2Uob25lbGluZVtsZW4tMV0pKQorCQlsZW4tLTsKKwlidWZmZXIgPSB4bWVtZHVweihvbmVsaW5lLCBsZW4pOworCisJaWYgKGRvdDMpIHsKKwkJaW50IGRvdDNsZW4gPSBzdHJsZW4oZG90Myk7CisJCWlmIChkb3QzbGVuID4gNSkgeworCQkJd2hpbGUgKChwID0gc3Ryc3RyKGJ1ZmZlciwgZG90MykpICE9IE5VTEwpIHsKKwkJCQlpbnQgdGFpbGxlbiA9IHN0cmxlbihwKSAtIGRvdDNsZW47CisJCQkJbWVtY3B5KHAsICIvLi4uLyIsIDUpOworCQkJCW1lbW1vdmUocCArIDUsIHAgKyBkb3QzbGVuLCB0YWlsbGVuICsgMSk7CisJCQl9CisJCX0KKwl9CisKKwlvbmVsaW5lcyA9IGl0ZW0tPnV0aWw7CisJaWYgKG9uZWxpbmVzLT5uciA+PSBvbmVsaW5lcy0+YWxsb2MpIHsKKwkJb25lbGluZXMtPmFsbG9jID0gYWxsb2NfbnIob25lbGluZXMtPm5yKTsKKwkJb25lbGluZXMtPml0ZW1zID0geHJlYWxsb2Mob25lbGluZXMtPml0ZW1zLAorCQkJCW9uZWxpbmVzLT5hbGxvYworCQkJCSogc2l6ZW9mKHN0cnVjdCBwYXRoX2xpc3RfaXRlbSkpOworCX0KKworCW9uZWxpbmVzLT5pdGVtc1tvbmVsaW5lcy0+bnJdLnV0aWwgPSBOVUxMOworCW9uZWxpbmVzLT5pdGVtc1tvbmVsaW5lcy0+bnIrK10ucGF0aCA9IGJ1ZmZlcjsKK30KKworc3RhdGljIHZvaWQgcmVhZF9mcm9tX3N0ZGluKHN0cnVjdCBzaG9ydGxvZyAqbG9nKQoreworCWNoYXIgYXV0aG9yWzEwMjRdLCBvbmVsaW5lWzEwMjRdOworCisJd2hpbGUgKGZnZXRzKGF1dGhvciwgc2l6ZW9mKGF1dGhvciksIHN0ZGluKSAhPSBOVUxMKSB7CisJCWlmICghKGF1dGhvclswXSA9PSAnQScgfHwgYXV0aG9yWzBdID09ICdhJykgfHwKKwkJICAgIHByZWZpeGNtcChhdXRob3IgKyAxLCAidXRob3I6ICIpKQorCQkJY29udGludWU7CisJCXdoaWxlIChmZ2V0cyhvbmVsaW5lLCBzaXplb2Yob25lbGluZSksIHN0ZGluKSAmJgorCQkgICAgICAgb25lbGluZVswXSAhPSAnXG4nKQorCQkJOyAvKiBkaXNjYXJkIGhlYWRlcnMgKi8KKwkJd2hpbGUgKGZnZXRzKG9uZWxpbmUsIHNpemVvZihvbmVsaW5lKSwgc3RkaW4pICYmCisJCSAgICAgICBvbmVsaW5lWzBdID09ICdcbicpCisJCQk7IC8qIGRpc2NhcmQgYmxhbmtzICovCisJCWluc2VydF9vbmVfcmVjb3JkKGxvZywgYXV0aG9yICsgOCwgb25lbGluZSk7CisJfQorfQorCit2b2lkIHNob3J0bG9nX2FkZF9jb21taXQoc3RydWN0IHNob3J0bG9nICpsb2csIHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwljb25zdCBjaGFyICphdXRob3IgPSBOVUxMLCAqYnVmZmVyOworCisJYnVmZmVyID0gY29tbWl0LT5idWZmZXI7CisJd2hpbGUgKCpidWZmZXIgJiYgKmJ1ZmZlciAhPSAnXG4nKSB7CisJCWNvbnN0IGNoYXIgKmVvbCA9IHN0cmNocihidWZmZXIsICdcbicpOworCisJCWlmIChlb2wgPT0gTlVMTCkKKwkJCWVvbCA9IGJ1ZmZlciArIHN0cmxlbihidWZmZXIpOworCQllbHNlCisJCQllb2wrKzsKKworCQlpZiAoIXByZWZpeGNtcChidWZmZXIsICJhdXRob3IgIikpCisJCQlhdXRob3IgPSBidWZmZXIgKyA3OworCQlidWZmZXIgPSBlb2w7CisJfQorCWlmICghYXV0aG9yKQorCQlkaWUoIk1pc3NpbmcgYXV0aG9yOiAlcyIsCisJCSAgICBzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisJaWYgKCpidWZmZXIpCisJCWJ1ZmZlcisrOworCWluc2VydF9vbmVfcmVjb3JkKGxvZywgYXV0aG9yLCAhKmJ1ZmZlciA/ICI8bm9uZT4iIDogYnVmZmVyKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X2Zyb21fcmV2KHN0cnVjdCByZXZfaW5mbyAqcmV2LCBzdHJ1Y3Qgc2hvcnRsb2cgKmxvZykKK3sKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisKKwlpZiAocHJlcGFyZV9yZXZpc2lvbl93YWxrKHJldikpCisJCWRpZSgicmV2aXNpb24gd2FsayBzZXR1cCBmYWlsZWQiKTsKKwl3aGlsZSAoKGNvbW1pdCA9IGdldF9yZXZpc2lvbihyZXYpKSAhPSBOVUxMKQorCQlzaG9ydGxvZ19hZGRfY29tbWl0KGxvZywgY29tbWl0KTsKK30KKworc3RhdGljIGludCBwYXJzZV91aW50KGNoYXIgY29uc3QgKiphcmcsIGludCBjb21tYSkKK3sKKwl1bnNpZ25lZCBsb25nIHVsOworCWludCByZXQ7CisJY2hhciAqZW5kcDsKKworCXVsID0gc3RydG91bCgqYXJnLCAmZW5kcCwgMTApOworCWlmIChlbmRwICE9ICphcmcgJiYgKmVuZHAgJiYgKmVuZHAgIT0gY29tbWEpCisJCXJldHVybiAtMTsKKwlyZXQgPSAoaW50KSB1bDsKKwlpZiAocmV0ICE9IHVsKQorCQlyZXR1cm4gLTE7CisJKmFyZyA9IGVuZHA7CisJaWYgKCoqYXJnKQorCQkoKmFyZykrKzsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgY2hhciB3cmFwX2FyZ191c2FnZVtdID0gIi13Wzx3aWR0aD5bLDxpbmRlbnQxPlssPGluZGVudDI+XV1dIjsKKyNkZWZpbmUgREVGQVVMVF9XUkFQTEVOIDc2CisjZGVmaW5lIERFRkFVTFRfSU5ERU5UMSA2CisjZGVmaW5lIERFRkFVTFRfSU5ERU5UMiA5CisKK3N0YXRpYyB2b2lkIHBhcnNlX3dyYXBfYXJncyhjb25zdCBjaGFyICphcmcsIGludCAqaW4xLCBpbnQgKmluMiwgaW50ICp3cmFwKQoreworCWFyZyArPSAyOyAvKiBza2lwIC13ICovCisKKwkqd3JhcCA9IHBhcnNlX3VpbnQoJmFyZywgJywnKTsKKwlpZiAoKndyYXAgPCAwKQorCQlkaWUod3JhcF9hcmdfdXNhZ2UpOworCSppbjEgPSBwYXJzZV91aW50KCZhcmcsICcsJyk7CisJaWYgKCppbjEgPCAwKQorCQlkaWUod3JhcF9hcmdfdXNhZ2UpOworCSppbjIgPSBwYXJzZV91aW50KCZhcmcsICdcMCcpOworCWlmICgqaW4yIDwgMCkKKwkJZGllKHdyYXBfYXJnX3VzYWdlKTsKKworCWlmICghKndyYXApCisJCSp3cmFwID0gREVGQVVMVF9XUkFQTEVOOworCWlmICghKmluMSkKKwkJKmluMSA9IERFRkFVTFRfSU5ERU5UMTsKKwlpZiAoISppbjIpCisJCSppbjIgPSBERUZBVUxUX0lOREVOVDI7CisJaWYgKCp3cmFwICYmCisJICAgICgoKmluMSAmJiAqd3JhcCA8PSAqaW4xKSB8fAorCSAgICAgKCppbjIgJiYgKndyYXAgPD0gKmluMikpKQorCQlkaWUod3JhcF9hcmdfdXNhZ2UpOworfQorCit2b2lkIHNob3J0bG9nX2luaXQoc3RydWN0IHNob3J0bG9nICpsb2cpCit7CisJbWVtc2V0KGxvZywgMCwgc2l6ZW9mKCpsb2cpKTsKKworCXJlYWRfbWFpbG1hcCgmbG9nLT5tYWlsbWFwLCAiLm1haWxtYXAiLCAmbG9nLT5jb21tb25fcmVwb19wcmVmaXgpOworCisJbG9nLT5saXN0LnN0cmR1cF9wYXRocyA9IDE7CisJbG9nLT53cmFwID0gREVGQVVMVF9XUkFQTEVOOworCWxvZy0+aW4xID0gREVGQVVMVF9JTkRFTlQxOworCWxvZy0+aW4yID0gREVGQVVMVF9JTkRFTlQyOworfQorCitpbnQgY21kX3Nob3J0bG9nKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXN0cnVjdCBzaG9ydGxvZyBsb2c7CisJc3RydWN0IHJldl9pbmZvIHJldjsKKwlpbnQgbm9uZ2l0OworCisJcHJlZml4ID0gc2V0dXBfZ2l0X2RpcmVjdG9yeV9nZW50bHkoJm5vbmdpdCk7CisJc2hvcnRsb2dfaW5pdCgmbG9nKTsKKworCS8qIHNpbmNlIC1uIGlzIGEgc2hhZG93ZWQgcmV2IGFyZ3VtZW50LCBwYXJzZSBvdXIgYXJncyBmaXJzdCAqLworCXdoaWxlIChhcmdjID4gMSkgeworCQlpZiAoIXN0cmNtcChhcmd2WzFdLCAiLW4iKSB8fCAhc3RyY21wKGFyZ3ZbMV0sICItLW51bWJlcmVkIikpCisJCQlsb2cuc29ydF9ieV9udW1iZXIgPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItcyIpIHx8CisJCQkJIXN0cmNtcChhcmd2WzFdLCAiLS1zdW1tYXJ5IikpCisJCQlsb2cuc3VtbWFyeSA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi1lIikgfHwKKwkJCSAhc3RyY21wKGFyZ3ZbMV0sICItLWVtYWlsIikpCisJCQlsb2cuZW1haWwgPSAxOworCQllbHNlIGlmICghcHJlZml4Y21wKGFyZ3ZbMV0sICItdyIpKSB7CisJCQlsb2cud3JhcF9saW5lcyA9IDE7CisJCQlwYXJzZV93cmFwX2FyZ3MoYXJndlsxXSwgJmxvZy5pbjEsICZsb2cuaW4yLCAmbG9nLndyYXApOworCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi1oIikgfHwgIXN0cmNtcChhcmd2WzFdLCAiLS1oZWxwIikpCisJCQl1c2FnZShzaG9ydGxvZ191c2FnZSk7CisJCWVsc2UKKwkJCWJyZWFrOworCQlhcmd2Kys7CisJCWFyZ2MtLTsKKwl9CisJaW5pdF9yZXZpc2lvbnMoJnJldiwgcHJlZml4KTsKKwlhcmdjID0gc2V0dXBfcmV2aXNpb25zKGFyZ2MsIGFyZ3YsICZyZXYsIE5VTEwpOworCWlmIChhcmdjID4gMSkKKwkJZGllICgidW5yZWNvZ25pemVkIGFyZ3VtZW50OiAlcyIsIGFyZ3ZbMV0pOworCisJLyogYXNzdW1lIEhFQUQgaWYgZnJvbSBhIHR0eSAqLworCWlmICghbm9uZ2l0ICYmICFyZXYucGVuZGluZy5uciAmJiBpc2F0dHkoMCkpCisJCWFkZF9oZWFkX3RvX3BlbmRpbmcoJnJldik7CisJaWYgKHJldi5wZW5kaW5nLm5yID09IDApIHsKKwkJcmVhZF9mcm9tX3N0ZGluKCZsb2cpOworCX0KKwllbHNlCisJCWdldF9mcm9tX3JldigmcmV2LCAmbG9nKTsKKworCXNob3J0bG9nX291dHB1dCgmbG9nKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzaG9ydGxvZ19vdXRwdXQoc3RydWN0IHNob3J0bG9nICpsb2cpCit7CisJaW50IGksIGo7CisJaWYgKGxvZy0+c29ydF9ieV9udW1iZXIpCisJCXFzb3J0KGxvZy0+bGlzdC5pdGVtcywgbG9nLT5saXN0Lm5yLCBzaXplb2Yoc3RydWN0IHBhdGhfbGlzdF9pdGVtKSwKKwkJCWNvbXBhcmVfYnlfbnVtYmVyKTsKKwlmb3IgKGkgPSAwOyBpIDwgbG9nLT5saXN0Lm5yOyBpKyspIHsKKwkJc3RydWN0IHBhdGhfbGlzdCAqb25lbGluZXMgPSBsb2ctPmxpc3QuaXRlbXNbaV0udXRpbDsKKworCQlpZiAobG9nLT5zdW1tYXJ5KSB7CisJCQlwcmludGYoIiU2ZFx0JXNcbiIsIG9uZWxpbmVzLT5uciwgbG9nLT5saXN0Lml0ZW1zW2ldLnBhdGgpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCIlcyAoJWQpOlxuIiwgbG9nLT5saXN0Lml0ZW1zW2ldLnBhdGgsIG9uZWxpbmVzLT5ucik7CisJCQlmb3IgKGogPSBvbmVsaW5lcy0+bnIgLSAxOyBqID49IDA7IGotLSkgeworCQkJCWNvbnN0IGNoYXIgKm1zZyA9IG9uZWxpbmVzLT5pdGVtc1tqXS5wYXRoOworCisJCQkJaWYgKGxvZy0+d3JhcF9saW5lcykgeworCQkJCQlpbnQgY29sID0gcHJpbnRfd3JhcHBlZF90ZXh0KG1zZywgbG9nLT5pbjEsIGxvZy0+aW4yLCBsb2ctPndyYXApOworCQkJCQlpZiAoY29sICE9IGxvZy0+d3JhcCkKKwkJCQkJCXB1dGNoYXIoJ1xuJyk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJcHJpbnRmKCIgICAgICAlc1xuIiwgbXNnKTsKKwkJCX0KKwkJCXB1dGNoYXIoJ1xuJyk7CisJCX0KKworCQlvbmVsaW5lcy0+c3RyZHVwX3BhdGhzID0gMTsKKwkJcGF0aF9saXN0X2NsZWFyKG9uZWxpbmVzLCAxKTsKKwkJZnJlZShvbmVsaW5lcyk7CisJCWxvZy0+bGlzdC5pdGVtc1tpXS51dGlsID0gTlVMTDsKKwl9CisKKwlsb2ctPmxpc3Quc3RyZHVwX3BhdGhzID0gMTsKKwlwYXRoX2xpc3RfY2xlYXIoJmxvZy0+bGlzdCwgMSk7CisJbG9nLT5tYWlsbWFwLnN0cmR1cF9wYXRocyA9IDE7CisJcGF0aF9saXN0X2NsZWFyKCZsb2ctPm1haWxtYXAsIDEpOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1zaG93LWJyYW5jaC5jIGIvYnVpbHRpbi1zaG93LWJyYW5jaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxOWFiZDMKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLXNob3ctYnJhbmNoLmMKQEAgLTAsMCArMSw5MTggQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIHNob3dfYnJhbmNoX3VzYWdlW10gPQorImdpdC1zaG93LWJyYW5jaCBbLS1zcGFyc2VdIFstLWN1cnJlbnRdIFstLWFsbF0gWy0tcmVtb3Rlc10gWy0tdG9wby1vcmRlcl0gWy0tbW9yZT1jb3VudCB8IC0tbGlzdCB8IC0taW5kZXBlbmRlbnQgfCAtLW1lcmdlLWJhc2UgXSBbLS10b3BpY3NdIFs8cmVmcz4uLi5dIHwgLS1yZWZsb2dbPW5bLGJdXSA8YnJhbmNoPiI7CitzdGF0aWMgY29uc3QgY2hhciBzaG93X2JyYW5jaF91c2FnZV9yZWZsb2dbXSA9CisiLS1yZWZsb2cgaXMgaW5jb21wYXRpYmxlIHdpdGggLS1hbGwsIC0tcmVtb3RlcywgLS1pbmRlcGVuZGVudCBvciAtLW1lcmdlLWJhc2UiOworCitzdGF0aWMgaW50IGRlZmF1bHRfbnVtOworc3RhdGljIGludCBkZWZhdWx0X2FsbG9jOworc3RhdGljIGNvbnN0IGNoYXIgKipkZWZhdWx0X2FyZzsKKworI2RlZmluZSBVTklOVEVSRVNUSU5HCTAxCisKKyNkZWZpbmUgUkVWX1NISUZUCSAyCisjZGVmaW5lIE1BWF9SRVZTCShGTEFHX0JJVFMgLSBSRVZfU0hJRlQpIC8qIHNob3VsZCBub3QgZXhjZWVkIGJpdHNfcGVyX2ludCAtIFJFVl9TSElGVCAqLworCisjZGVmaW5lIERFRkFVTFRfUkVGTE9HCTQKKworc3RhdGljIHN0cnVjdCBjb21taXQgKmludGVyZXN0aW5nKHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCkKK3sKKwl3aGlsZSAobGlzdCkgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsaXN0LT5pdGVtOworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gY29tbWl0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBjb21taXQgKnBvcF9vbmVfY29tbWl0KHN0cnVjdCBjb21taXRfbGlzdCAqKmxpc3RfcCkKK3sKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisJc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0OworCWxpc3QgPSAqbGlzdF9wOworCWNvbW1pdCA9IGxpc3QtPml0ZW07CisJKmxpc3RfcCA9IGxpc3QtPm5leHQ7CisJZnJlZShsaXN0KTsKKwlyZXR1cm4gY29tbWl0OworfQorCitzdHJ1Y3QgY29tbWl0X25hbWUgeworCWNvbnN0IGNoYXIgKmhlYWRfbmFtZTsgLyogd2hpY2ggaGVhZCdzIGFuY2VzdG9yPyAqLworCWludCBnZW5lcmF0aW9uOyAvKiBob3cgbWFueSBwYXJlbnRzIGF3YXkgZnJvbSBoZWFkX25hbWUgKi8KK307CisKKy8qIE5hbWUgdGhlIGNvbW1pdCBhcyBudGggZ2VuZXJhdGlvbiBhbmNlc3RvciBvZiBoZWFkX25hbWU7CisgKiB3ZSBjb3VudCBvbmx5IHRoZSBmaXJzdC1wYXJlbnQgcmVsYXRpb25zaGlwIGZvciBuYW1pbmcgcHVycG9zZXMuCisgKi8KK3N0YXRpYyB2b2lkIG5hbWVfY29tbWl0KHN0cnVjdCBjb21taXQgKmNvbW1pdCwgY29uc3QgY2hhciAqaGVhZF9uYW1lLCBpbnQgbnRoKQoreworCXN0cnVjdCBjb21taXRfbmFtZSAqbmFtZTsKKwlpZiAoIWNvbW1pdC0+dXRpbCkKKwkJY29tbWl0LT51dGlsID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGNvbW1pdF9uYW1lKSk7CisJbmFtZSA9IGNvbW1pdC0+dXRpbDsKKwluYW1lLT5oZWFkX25hbWUgPSBoZWFkX25hbWU7CisJbmFtZS0+Z2VuZXJhdGlvbiA9IG50aDsKK30KKworLyogUGFyZW50IGlzIHRoZSBmaXJzdCBwYXJlbnQgb2YgdGhlIGNvbW1pdC4gIFdlIG1heSBuYW1lIGl0CisgKiBhcyAobisxKXRoIGdlbmVyYXRpb24gYW5jZXN0b3Igb2YgdGhlIHNhbWUgaGVhZF9uYW1lIGFzCisgKiBjb21taXQgaXMgbnRoIGdlbmVyYXRpb24gYW5jZXN0b3Igb2YsIGlmIHRoYXQgZ2VuZXJhdGlvbgorICogbnVtYmVyIGlzIGJldHRlciB0aGFuIHRoZSBuYW1lIGl0IGFscmVhZHkgaGFzLgorICovCitzdGF0aWMgdm9pZCBuYW1lX3BhcmVudChzdHJ1Y3QgY29tbWl0ICpjb21taXQsIHN0cnVjdCBjb21taXQgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgY29tbWl0X25hbWUgKmNvbW1pdF9uYW1lID0gY29tbWl0LT51dGlsOworCXN0cnVjdCBjb21taXRfbmFtZSAqcGFyZW50X25hbWUgPSBwYXJlbnQtPnV0aWw7CisJaWYgKCFjb21taXRfbmFtZSkKKwkJcmV0dXJuOworCWlmICghcGFyZW50X25hbWUgfHwKKwkgICAgY29tbWl0X25hbWUtPmdlbmVyYXRpb24gKyAxIDwgcGFyZW50X25hbWUtPmdlbmVyYXRpb24pCisJCW5hbWVfY29tbWl0KHBhcmVudCwgY29tbWl0X25hbWUtPmhlYWRfbmFtZSwKKwkJCSAgICBjb21taXRfbmFtZS0+Z2VuZXJhdGlvbiArIDEpOworfQorCitzdGF0aWMgaW50IG5hbWVfZmlyc3RfcGFyZW50X2NoYWluKHN0cnVjdCBjb21taXQgKmMpCit7CisJaW50IGkgPSAwOworCXdoaWxlIChjKSB7CisJCXN0cnVjdCBjb21taXQgKnA7CisJCWlmICghYy0+dXRpbCkKKwkJCWJyZWFrOworCQlpZiAoIWMtPnBhcmVudHMpCisJCQlicmVhazsKKwkJcCA9IGMtPnBhcmVudHMtPml0ZW07CisJCWlmICghcC0+dXRpbCkgeworCQkJbmFtZV9wYXJlbnQoYywgcCk7CisJCQlpKys7CisJCX0KKwkJZWxzZQorCQkJYnJlYWs7CisJCWMgPSBwOworCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQgbmFtZV9jb21taXRzKHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCwKKwkJCSBzdHJ1Y3QgY29tbWl0ICoqcmV2LAorCQkJIGNoYXIgKipyZWZfbmFtZSwKKwkJCSBpbnQgbnVtX3JldikKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKmNsOworCXN0cnVjdCBjb21taXQgKmM7CisJaW50IGk7CisKKwkvKiBGaXJzdCBnaXZlIG5hbWVzIHRvIHRoZSBnaXZlbiBoZWFkcyAqLworCWZvciAoY2wgPSBsaXN0OyBjbDsgY2wgPSBjbC0+bmV4dCkgeworCQljID0gY2wtPml0ZW07CisJCWlmIChjLT51dGlsKQorCQkJY29udGludWU7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fcmV2OyBpKyspIHsKKwkJCWlmIChyZXZbaV0gPT0gYykgeworCQkJCW5hbWVfY29tbWl0KGMsIHJlZl9uYW1lW2ldLCAwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIFRoZW4gY29tbWl0cyBvbiB0aGUgZmlyc3QgcGFyZW50IGFuY2VzdHJ5IGNoYWluICovCisJZG8geworCQlpID0gMDsKKwkJZm9yIChjbCA9IGxpc3Q7IGNsOyBjbCA9IGNsLT5uZXh0KSB7CisJCQlpICs9IG5hbWVfZmlyc3RfcGFyZW50X2NoYWluKGNsLT5pdGVtKTsKKwkJfQorCX0gd2hpbGUgKGkpOworCisJLyogRmluYWxseSwgYW55IHVubmFtZWQgY29tbWl0cyAqLworCWRvIHsKKwkJaSA9IDA7CisJCWZvciAoY2wgPSBsaXN0OyBjbDsgY2wgPSBjbC0+bmV4dCkgeworCQkJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCQkJc3RydWN0IGNvbW1pdF9uYW1lICpuOworCQkJaW50IG50aDsKKwkJCWMgPSBjbC0+aXRlbTsKKwkJCWlmICghYy0+dXRpbCkKKwkJCQljb250aW51ZTsKKwkJCW4gPSBjLT51dGlsOworCQkJcGFyZW50cyA9IGMtPnBhcmVudHM7CisJCQludGggPSAwOworCQkJd2hpbGUgKHBhcmVudHMpIHsKKwkJCQlzdHJ1Y3QgY29tbWl0ICpwID0gcGFyZW50cy0+aXRlbTsKKwkJCQljaGFyIG5ld25hbWVbMTAwMF0sICplbjsKKwkJCQlwYXJlbnRzID0gcGFyZW50cy0+bmV4dDsKKwkJCQludGgrKzsKKwkJCQlpZiAocC0+dXRpbCkKKwkJCQkJY29udGludWU7CisJCQkJZW4gPSBuZXduYW1lOworCQkJCXN3aXRjaCAobi0+Z2VuZXJhdGlvbikgeworCQkJCWNhc2UgMDoKKwkJCQkJZW4gKz0gc3ByaW50ZihlbiwgIiVzIiwgbi0+aGVhZF9uYW1lKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAxOgorCQkJCQllbiArPSBzcHJpbnRmKGVuLCAiJXNeIiwgbi0+aGVhZF9uYW1lKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJZW4gKz0gc3ByaW50ZihlbiwgIiVzfiVkIiwKKwkJCQkJCW4tPmhlYWRfbmFtZSwgbi0+Z2VuZXJhdGlvbik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAobnRoID09IDEpCisJCQkJCWVuICs9IHNwcmludGYoZW4sICJeIik7CisJCQkJZWxzZQorCQkJCQllbiArPSBzcHJpbnRmKGVuLCAiXiVkIiwgbnRoKTsKKwkJCQluYW1lX2NvbW1pdChwLCB4c3RyZHVwKG5ld25hbWUpLCAwKTsKKwkJCQlpKys7CisJCQkJbmFtZV9maXJzdF9wYXJlbnRfY2hhaW4ocCk7CisJCQl9CisJCX0KKwl9IHdoaWxlIChpKTsKK30KKworc3RhdGljIGludCBtYXJrX3NlZW4oc3RydWN0IGNvbW1pdCAqY29tbWl0LCBzdHJ1Y3QgY29tbWl0X2xpc3QgKipzZWVuX3ApCit7CisJaWYgKCFjb21taXQtPm9iamVjdC5mbGFncykgeworCQljb21taXRfbGlzdF9pbnNlcnQoY29tbWl0LCBzZWVuX3ApOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGpvaW5fcmV2cyhzdHJ1Y3QgY29tbWl0X2xpc3QgKipsaXN0X3AsCisJCSAgICAgIHN0cnVjdCBjb21taXRfbGlzdCAqKnNlZW5fcCwKKwkJICAgICAgaW50IG51bV9yZXYsIGludCBleHRyYSkKK3sKKwlpbnQgYWxsX21hc2sgPSAoKDF1IDw8IChSRVZfU0hJRlQgKyBudW1fcmV2KSkgLSAxKTsKKwlpbnQgYWxsX3JldnMgPSBhbGxfbWFzayAmIH4oKDF1IDw8IFJFVl9TSElGVCkgLSAxKTsKKworCXdoaWxlICgqbGlzdF9wKSB7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50czsKKwkJaW50IHN0aWxsX2ludGVyZXN0aW5nID0gISFpbnRlcmVzdGluZygqbGlzdF9wKTsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gcG9wX29uZV9jb21taXQobGlzdF9wKTsKKwkJaW50IGZsYWdzID0gY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBhbGxfbWFzazsKKworCQlpZiAoIXN0aWxsX2ludGVyZXN0aW5nICYmIGV4dHJhIDw9IDApCisJCQlicmVhazsKKworCQltYXJrX3NlZW4oY29tbWl0LCBzZWVuX3ApOworCQlpZiAoKGZsYWdzICYgYWxsX3JldnMpID09IGFsbF9yZXZzKQorCQkJZmxhZ3MgfD0gVU5JTlRFUkVTVElORzsKKwkJcGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsKKworCQl3aGlsZSAocGFyZW50cykgeworCQkJc3RydWN0IGNvbW1pdCAqcCA9IHBhcmVudHMtPml0ZW07CisJCQlpbnQgdGhpc19mbGFnID0gcC0+b2JqZWN0LmZsYWdzOworCQkJcGFyZW50cyA9IHBhcmVudHMtPm5leHQ7CisJCQlpZiAoKHRoaXNfZmxhZyAmIGZsYWdzKSA9PSBmbGFncykKKwkJCQljb250aW51ZTsKKwkJCWlmICghcC0+b2JqZWN0LnBhcnNlZCkKKwkJCQlwYXJzZV9jb21taXQocCk7CisJCQlpZiAobWFya19zZWVuKHAsIHNlZW5fcCkgJiYgIXN0aWxsX2ludGVyZXN0aW5nKQorCQkJCWV4dHJhLS07CisJCQlwLT5vYmplY3QuZmxhZ3MgfD0gZmxhZ3M7CisJCQlpbnNlcnRfYnlfZGF0ZShwLCBsaXN0X3ApOworCQl9CisJfQorCisJLyoKKwkgKiBQb3N0cHJvY2VzcyB0byBjb21wbGV0ZSB3ZWxsLXBvaXNvbmluZy4KKwkgKgorCSAqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbGwgdGhlIGNvbW1pdHMgd2UgaGF2ZSBzZWVuIGluCisJICogc2Vlbl9wIGxpc3QuICBNYXJrIGFueXRoaW5nIHRoYXQgY2FuIGJlIHJlYWNoZWQgZnJvbQorCSAqIHVuaW50ZXJlc3RpbmcgY29tbWl0cyBub3QgaW50ZXJlc3RpbmcuCisJICovCisJZm9yICg7OykgeworCQlpbnQgY2hhbmdlZCA9IDA7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqczsKKwkJZm9yIChzID0gKnNlZW5fcDsgczsgcyA9IHMtPm5leHQpIHsKKwkJCXN0cnVjdCBjb21taXQgKmMgPSBzLT5pdGVtOworCQkJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCisJCQlpZiAoKChjLT5vYmplY3QuZmxhZ3MgJiBhbGxfcmV2cykgIT0gYWxsX3JldnMpICYmCisJCQkgICAgIShjLT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSkKKwkJCQljb250aW51ZTsKKworCQkJLyogVGhlIGN1cnJlbnQgY29tbWl0IGlzIGVpdGhlciBhIG1lcmdlIGJhc2Ugb3IKKwkJCSAqIGFscmVhZHkgdW5pbnRlcmVzdGluZyBvbmUuICBNYXJrIGl0cyBwYXJlbnRzCisJCQkgKiBhcyB1bmludGVyZXN0aW5nIGNvbW1pdHMgX29ubHlfIGlmIHRoZXkgYXJlCisJCQkgKiBhbHJlYWR5IHBhcnNlZC4gIE5vIHJlYXNvbiB0byBmaW5kIG5ldyBvbmVzCisJCQkgKiBoZXJlLgorCQkJICovCisJCQlwYXJlbnRzID0gYy0+cGFyZW50czsKKwkJCXdoaWxlIChwYXJlbnRzKSB7CisJCQkJc3RydWN0IGNvbW1pdCAqcCA9IHBhcmVudHMtPml0ZW07CisJCQkJcGFyZW50cyA9IHBhcmVudHMtPm5leHQ7CisJCQkJaWYgKCEocC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykpIHsKKwkJCQkJcC0+b2JqZWN0LmZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CisJCQkJCWNoYW5nZWQgPSAxOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoIWNoYW5nZWQpCisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfb25lX2NvbW1pdChzdHJ1Y3QgY29tbWl0ICpjb21taXQsIGludCBub19uYW1lKQoreworCXN0cnVjdCBzdHJidWYgcHJldHR5OworCWNvbnN0IGNoYXIgKnByZXR0eV9zdHIgPSAiKHVuYXZhaWxhYmxlKSI7CisJc3RydWN0IGNvbW1pdF9uYW1lICpuYW1lID0gY29tbWl0LT51dGlsOworCisJc3RyYnVmX2luaXQoJnByZXR0eSwgMCk7CisJaWYgKGNvbW1pdC0+b2JqZWN0LnBhcnNlZCkgeworCQlwcmV0dHlfcHJpbnRfY29tbWl0KENNSVRfRk1UX09ORUxJTkUsIGNvbW1pdCwKKwkJCQkgICAgJnByZXR0eSwgMCwgTlVMTCwgTlVMTCwgMCwgMCk7CisJCXByZXR0eV9zdHIgPSBwcmV0dHkuYnVmOworCX0KKwlpZiAoIXByZWZpeGNtcChwcmV0dHlfc3RyLCAiW1BBVENIXSAiKSkKKwkJcHJldHR5X3N0ciArPSA4OworCisJaWYgKCFub19uYW1lKSB7CisJCWlmIChuYW1lICYmIG5hbWUtPmhlYWRfbmFtZSkgeworCQkJcHJpbnRmKCJbJXMiLCBuYW1lLT5oZWFkX25hbWUpOworCQkJaWYgKG5hbWUtPmdlbmVyYXRpb24pIHsKKwkJCQlpZiAobmFtZS0+Z2VuZXJhdGlvbiA9PSAxKQorCQkJCQlwcmludGYoIl4iKTsKKwkJCQllbHNlCisJCQkJCXByaW50ZigifiVkIiwgbmFtZS0+Z2VuZXJhdGlvbik7CisJCQl9CisJCQlwcmludGYoIl0gIik7CisJCX0KKwkJZWxzZQorCQkJcHJpbnRmKCJbJXNdICIsCisJCQkgICAgICAgZmluZF91bmlxdWVfYWJicmV2KGNvbW1pdC0+b2JqZWN0LnNoYTEsIDcpKTsKKwl9CisJcHV0cyhwcmV0dHlfc3RyKTsKKwlzdHJidWZfcmVsZWFzZSgmcHJldHR5KTsKK30KKworc3RhdGljIGNoYXIgKnJlZl9uYW1lW01BWF9SRVZTICsgMV07CitzdGF0aWMgaW50IHJlZl9uYW1lX2NudDsKKworc3RhdGljIGNvbnN0IGNoYXIgKmZpbmRfZGlnaXRfcHJlZml4KGNvbnN0IGNoYXIgKnMsIGludCAqdikKK3sKKwljb25zdCBjaGFyICpwOworCWludCB2ZXI7CisJY2hhciBjaDsKKworCWZvciAocCA9IHMsIHZlciA9IDA7CisJICAgICAnMCcgPD0gKGNoID0gKnApICYmIGNoIDw9ICc5JzsKKwkgICAgIHArKykKKwkJdmVyID0gdmVyICogMTAgKyBjaCAtICcwJzsKKwkqdiA9IHZlcjsKKwlyZXR1cm4gcDsKK30KKworCitzdGF0aWMgaW50IHZlcnNpb25fY21wKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIpCit7CisJd2hpbGUgKDEpIHsKKwkJaW50IHZhLCB2YjsKKworCQlhID0gZmluZF9kaWdpdF9wcmVmaXgoYSwgJnZhKTsKKwkJYiA9IGZpbmRfZGlnaXRfcHJlZml4KGIsICZ2Yik7CisJCWlmICh2YSAhPSB2YikKKwkJCXJldHVybiB2YSAtIHZiOworCisJCXdoaWxlICgxKSB7CisJCQlpbnQgY2EgPSAqYTsKKwkJCWludCBjYiA9ICpiOworCQkJaWYgKCcwJyA8PSBjYSAmJiBjYSA8PSAnOScpCisJCQkJY2EgPSAwOworCQkJaWYgKCcwJyA8PSBjYiAmJiBjYiA8PSAnOScpCisJCQkJY2IgPSAwOworCQkJaWYgKGNhICE9IGNiKQorCQkJCXJldHVybiBjYSAtIGNiOworCQkJaWYgKCFjYSkKKwkJCQlicmVhazsKKwkJCWErKzsKKwkJCWIrKzsKKwkJfQorCQlpZiAoISphICYmICEqYikKKwkJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludCBjb21wYXJlX3JlZl9uYW1lKGNvbnN0IHZvaWQgKmFfLCBjb25zdCB2b2lkICpiXykKK3sKKwljb25zdCBjaGFyICogY29uc3QqYSA9IGFfLCAqIGNvbnN0KmIgPSBiXzsKKwlyZXR1cm4gdmVyc2lvbl9jbXAoKmEsICpiKTsKK30KKworc3RhdGljIHZvaWQgc29ydF9yZWZfcmFuZ2UoaW50IGJvdHRvbSwgaW50IHRvcCkKK3sKKwlxc29ydChyZWZfbmFtZSArIGJvdHRvbSwgdG9wIC0gYm90dG9tLCBzaXplb2YocmVmX25hbWVbMF0pLAorCSAgICAgIGNvbXBhcmVfcmVmX25hbWUpOworfQorCitzdGF0aWMgaW50IGFwcGVuZF9yZWYoY29uc3QgY2hhciAqcmVmbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJICAgICAgaW50IGFsbG93X2R1cHMpCit7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2VfZ2VudGx5KHNoYTEsIDEpOworCWludCBpOworCisJaWYgKCFjb21taXQpCisJCXJldHVybiAwOworCisJaWYgKCFhbGxvd19kdXBzKSB7CisJCS8qIEF2b2lkIGFkZGluZyB0aGUgc2FtZSB0aGluZyB0d2ljZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgcmVmX25hbWVfY250OyBpKyspCisJCQlpZiAoIXN0cmNtcChyZWZuYW1lLCByZWZfbmFtZVtpXSkpCisJCQkJcmV0dXJuIDA7CisJfQorCWlmIChNQVhfUkVWUyA8PSByZWZfbmFtZV9jbnQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJ3YXJuaW5nOiBpZ25vcmluZyAlczsgIgorCQkJImNhbm5vdCBoYW5kbGUgbW9yZSB0aGFuICVkIHJlZnNcbiIsCisJCQlyZWZuYW1lLCBNQVhfUkVWUyk7CisJCXJldHVybiAwOworCX0KKwlyZWZfbmFtZVtyZWZfbmFtZV9jbnQrK10gPSB4c3RyZHVwKHJlZm5hbWUpOworCXJlZl9uYW1lW3JlZl9uYW1lX2NudF0gPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFwcGVuZF9oZWFkX3JlZihjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmxhZywgdm9pZCAqY2JfZGF0YSkKK3sKKwl1bnNpZ25lZCBjaGFyIHRtcFsyMF07CisJaW50IG9mcyA9IDExOworCWlmIChwcmVmaXhjbXAocmVmbmFtZSwgInJlZnMvaGVhZHMvIikpCisJCXJldHVybiAwOworCS8qIElmIGJvdGggaGVhZHMvZm9vIGFuZCB0YWdzL2ZvbyBleGlzdHMsIGdldF9zaGExIHdvdWxkCisJICogZ2V0IGNvbmZ1c2VkLgorCSAqLworCWlmIChnZXRfc2hhMShyZWZuYW1lICsgb2ZzLCB0bXApIHx8IGhhc2hjbXAodG1wLCBzaGExKSkKKwkJb2ZzID0gNTsKKwlyZXR1cm4gYXBwZW5kX3JlZihyZWZuYW1lICsgb2ZzLCBzaGExLCAwKTsKK30KKworc3RhdGljIGludCBhcHBlbmRfcmVtb3RlX3JlZihjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmxhZywgdm9pZCAqY2JfZGF0YSkKK3sKKwl1bnNpZ25lZCBjaGFyIHRtcFsyMF07CisJaW50IG9mcyA9IDEzOworCWlmIChwcmVmaXhjbXAocmVmbmFtZSwgInJlZnMvcmVtb3Rlcy8iKSkKKwkJcmV0dXJuIDA7CisJLyogSWYgYm90aCBoZWFkcy9mb28gYW5kIHRhZ3MvZm9vIGV4aXN0cywgZ2V0X3NoYTEgd291bGQKKwkgKiBnZXQgY29uZnVzZWQuCisJICovCisJaWYgKGdldF9zaGExKHJlZm5hbWUgKyBvZnMsIHRtcCkgfHwgaGFzaGNtcCh0bXAsIHNoYTEpKQorCQlvZnMgPSA1OworCXJldHVybiBhcHBlbmRfcmVmKHJlZm5hbWUgKyBvZnMsIHNoYTEsIDApOworfQorCitzdGF0aWMgaW50IGFwcGVuZF90YWdfcmVmKGNvbnN0IGNoYXIgKnJlZm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFnLCB2b2lkICpjYl9kYXRhKQoreworCWlmIChwcmVmaXhjbXAocmVmbmFtZSwgInJlZnMvdGFncy8iKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGFwcGVuZF9yZWYocmVmbmFtZSArIDUsIHNoYTEsIDApOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqbWF0Y2hfcmVmX3BhdHRlcm4gPSBOVUxMOworc3RhdGljIGludCBtYXRjaF9yZWZfc2xhc2ggPSAwOworc3RhdGljIGludCBjb3VudF9zbGFzaChjb25zdCBjaGFyICpzKQoreworCWludCBjbnQgPSAwOworCXdoaWxlICgqcykKKwkJaWYgKCpzKysgPT0gJy8nKQorCQkJY250Kys7CisJcmV0dXJuIGNudDsKK30KKworc3RhdGljIGludCBhcHBlbmRfbWF0Y2hpbmdfcmVmKGNvbnN0IGNoYXIgKnJlZm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFnLCB2b2lkICpjYl9kYXRhKQoreworCS8qIHdlIHdhbnQgdG8gYWxsb3cgcGF0dGVybiBob2xkLzxhc3Rlcmlzaz4gdG8gc2hvdyBhbGwKKwkgKiBicmFuY2hlcyB1bmRlciByZWZzL2hlYWRzL2hvbGQvLCBhbmQgdjAuOTkuOT8gdG8gc2hvdworCSAqIHJlZnMvdGFncy92MC45OS45YSBhbmQgZnJpZW5kcy4KKwkgKi8KKwljb25zdCBjaGFyICp0YWlsOworCWludCBzbGFzaCA9IGNvdW50X3NsYXNoKHJlZm5hbWUpOworCWZvciAodGFpbCA9IHJlZm5hbWU7ICp0YWlsICYmIG1hdGNoX3JlZl9zbGFzaCA8IHNsYXNoOyApCisJCWlmICgqdGFpbCsrID09ICcvJykKKwkJCXNsYXNoLS07CisJaWYgKCEqdGFpbCkKKwkJcmV0dXJuIDA7CisJaWYgKGZubWF0Y2gobWF0Y2hfcmVmX3BhdHRlcm4sIHRhaWwsIDApKQorCQlyZXR1cm4gMDsKKwlpZiAoIXByZWZpeGNtcChyZWZuYW1lLCAicmVmcy9oZWFkcy8iKSkKKwkJcmV0dXJuIGFwcGVuZF9oZWFkX3JlZihyZWZuYW1lLCBzaGExLCBmbGFnLCBjYl9kYXRhKTsKKwlpZiAoIXByZWZpeGNtcChyZWZuYW1lLCAicmVmcy90YWdzLyIpKQorCQlyZXR1cm4gYXBwZW5kX3RhZ19yZWYocmVmbmFtZSwgc2hhMSwgZmxhZywgY2JfZGF0YSk7CisJcmV0dXJuIGFwcGVuZF9yZWYocmVmbmFtZSwgc2hhMSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNuYXJmX3JlZnMoaW50IGhlYWQsIGludCByZW1vdGVzKQoreworCWlmIChoZWFkKSB7CisJCWludCBvcmlnX2NudCA9IHJlZl9uYW1lX2NudDsKKwkJZm9yX2VhY2hfcmVmKGFwcGVuZF9oZWFkX3JlZiwgTlVMTCk7CisJCXNvcnRfcmVmX3JhbmdlKG9yaWdfY250LCByZWZfbmFtZV9jbnQpOworCX0KKwlpZiAocmVtb3RlcykgeworCQlpbnQgb3JpZ19jbnQgPSByZWZfbmFtZV9jbnQ7CisJCWZvcl9lYWNoX3JlZihhcHBlbmRfcmVtb3RlX3JlZiwgTlVMTCk7CisJCXNvcnRfcmVmX3JhbmdlKG9yaWdfY250LCByZWZfbmFtZV9jbnQpOworCX0KK30KKworc3RhdGljIGludCByZXZfaXNfaGVhZChjaGFyICpoZWFkLCBpbnQgaGVhZGxlbiwgY2hhciAqbmFtZSwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmhlYWRfc2hhMSwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpZiAoKCFoZWFkWzBdKSB8fAorCSAgICAoaGVhZF9zaGExICYmIHNoYTEgJiYgaGFzaGNtcChoZWFkX3NoYTEsIHNoYTEpKSkKKwkJcmV0dXJuIDA7CisJaWYgKCFwcmVmaXhjbXAoaGVhZCwgInJlZnMvaGVhZHMvIikpCisJCWhlYWQgKz0gMTE7CisJaWYgKCFwcmVmaXhjbXAobmFtZSwgInJlZnMvaGVhZHMvIikpCisJCW5hbWUgKz0gMTE7CisJZWxzZSBpZiAoIXByZWZpeGNtcChuYW1lLCAiaGVhZHMvIikpCisJCW5hbWUgKz0gNjsKKwlyZXR1cm4gIXN0cmNtcChoZWFkLCBuYW1lKTsKK30KKworc3RhdGljIGludCBzaG93X21lcmdlX2Jhc2Uoc3RydWN0IGNvbW1pdF9saXN0ICpzZWVuLCBpbnQgbnVtX3JldikKK3sKKwlpbnQgYWxsX21hc2sgPSAoKDF1IDw8IChSRVZfU0hJRlQgKyBudW1fcmV2KSkgLSAxKTsKKwlpbnQgYWxsX3JldnMgPSBhbGxfbWFzayAmIH4oKDF1IDw8IFJFVl9TSElGVCkgLSAxKTsKKwlpbnQgZXhpdF9zdGF0dXMgPSAxOworCisJd2hpbGUgKHNlZW4pIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gcG9wX29uZV9jb21taXQoJnNlZW4pOworCQlpbnQgZmxhZ3MgPSBjb21taXQtPm9iamVjdC5mbGFncyAmIGFsbF9tYXNrOworCQlpZiAoIShmbGFncyAmIFVOSU5URVJFU1RJTkcpICYmCisJCSAgICAoKGZsYWdzICYgYWxsX3JldnMpID09IGFsbF9yZXZzKSkgeworCQkJcHV0cyhzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisJCQlleGl0X3N0YXR1cyA9IDA7CisJCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworCQl9CisJfQorCXJldHVybiBleGl0X3N0YXR1czsKK30KKworc3RhdGljIGludCBzaG93X2luZGVwZW5kZW50KHN0cnVjdCBjb21taXQgKipyZXYsCisJCQkgICAgaW50IG51bV9yZXYsCisJCQkgICAgY2hhciAqKnJlZl9uYW1lLAorCQkJICAgIHVuc2lnbmVkIGludCAqcmV2X21hc2spCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3JldjsgaSsrKSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IHJldltpXTsKKwkJdW5zaWduZWQgaW50IGZsYWcgPSByZXZfbWFza1tpXTsKKworCQlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgPT0gZmxhZykKKwkJCXB1dHMoc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXBwZW5kX29uZV9yZXYoY29uc3QgY2hhciAqYXYpCit7CisJdW5zaWduZWQgY2hhciByZXZrZXlbMjBdOworCWlmICghZ2V0X3NoYTEoYXYsIHJldmtleSkpIHsKKwkJYXBwZW5kX3JlZihhdiwgcmV2a2V5LCAwKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoc3RyY2hyKGF2LCAnKicpIHx8IHN0cmNocihhdiwgJz8nKSB8fCBzdHJjaHIoYXYsICdbJykpIHsKKwkJLyogZ2xvYiBzdHlsZSBtYXRjaCAqLworCQlpbnQgc2F2ZWRfbWF0Y2hlcyA9IHJlZl9uYW1lX2NudDsKKwkJbWF0Y2hfcmVmX3BhdHRlcm4gPSBhdjsKKwkJbWF0Y2hfcmVmX3NsYXNoID0gY291bnRfc2xhc2goYXYpOworCQlmb3JfZWFjaF9yZWYoYXBwZW5kX21hdGNoaW5nX3JlZiwgTlVMTCk7CisJCWlmIChzYXZlZF9tYXRjaGVzID09IHJlZl9uYW1lX2NudCAmJgorCQkgICAgcmVmX25hbWVfY250IDwgTUFYX1JFVlMpCisJCQllcnJvcigibm8gbWF0Y2hpbmcgcmVmcyB3aXRoICVzIiwgYXYpOworCQlpZiAoc2F2ZWRfbWF0Y2hlcyArIDEgPCByZWZfbmFtZV9jbnQpCisJCQlzb3J0X3JlZl9yYW5nZShzYXZlZF9tYXRjaGVzLCByZWZfbmFtZV9jbnQpOworCQlyZXR1cm47CisJfQorCWRpZSgiYmFkIHNoYTEgcmVmZXJlbmNlICVzIiwgYXYpOworfQorCitzdGF0aWMgaW50IGdpdF9zaG93X2JyYW5jaF9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXN0cmNtcCh2YXIsICJzaG93YnJhbmNoLmRlZmF1bHQiKSkgeworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIGNvbmZpZ19lcnJvcl9ub25ib29sKHZhcik7CisJCWlmIChkZWZhdWx0X2FsbG9jIDw9IGRlZmF1bHRfbnVtICsgMSkgeworCQkJZGVmYXVsdF9hbGxvYyA9IGRlZmF1bHRfYWxsb2MgKiAzIC8gMiArIDIwOworCQkJZGVmYXVsdF9hcmcgPSB4cmVhbGxvYyhkZWZhdWx0X2FyZywgc2l6ZW9mICpkZWZhdWx0X2FyZyAqIGRlZmF1bHRfYWxsb2MpOworCQl9CisJCWRlZmF1bHRfYXJnW2RlZmF1bHRfbnVtKytdID0geHN0cmR1cCh2YWx1ZSk7CisJCWRlZmF1bHRfYXJnW2RlZmF1bHRfbnVtXSA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBnaXRfZGVmYXVsdF9jb25maWcodmFyLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgb21pdF9pbl9kZW5zZShzdHJ1Y3QgY29tbWl0ICpjb21taXQsIHN0cnVjdCBjb21taXQgKipyZXYsIGludCBuKQoreworCS8qIElmIHRoZSBjb21taXQgaXMgdGlwIG9mIHRoZSBuYW1lZCBicmFuY2hlcywgZG8gbm90CisJICogb21pdCBpdC4KKwkgKiBPdGhlcndpc2UsIGlmIGl0IGlzIGEgbWVyZ2UgdGhhdCBpcyByZWFjaGFibGUgZnJvbSBvbmx5IG9uZQorCSAqIHRpcCwgaXQgaXMgbm90IHRoYXQgaW50ZXJlc3RpbmcuCisJICovCisJaW50IGksIGZsYWcsIGNvdW50OworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCWlmIChyZXZbaV0gPT0gY29tbWl0KQorCQkJcmV0dXJuIDA7CisJZmxhZyA9IGNvbW1pdC0+b2JqZWN0LmZsYWdzOworCWZvciAoaSA9IGNvdW50ID0gMDsgaSA8IG47IGkrKykgeworCQlpZiAoZmxhZyAmICgxdSA8PCAoaSArIFJFVl9TSElGVCkpKQorCQkJY291bnQrKzsKKwl9CisJaWYgKGNvdW50ID09IDEpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9yZWZsb2dfcGFyYW0oY29uc3QgY2hhciAqYXJnLCBpbnQgKmNudCwgY29uc3QgY2hhciAqKmJhc2UpCit7CisJY2hhciAqZXA7CisJKmNudCA9IHN0cnRvdWwoYXJnLCAmZXAsIDEwKTsKKwlpZiAoKmVwID09ICcsJykKKwkJKmJhc2UgPSBlcCArIDE7CisJZWxzZSBpZiAoKmVwKQorCQlkaWUoInVucmVjb2duaXplZCByZWZsb2cgcGFyYW0gJyVzJyIsIGFyZyArIDkpOworCWVsc2UKKwkJKmJhc2UgPSBOVUxMOworCWlmICgqY250IDw9IDApCisJCSpjbnQgPSBERUZBVUxUX1JFRkxPRzsKK30KKworaW50IGNtZF9zaG93X2JyYW5jaChpbnQgYWMsIGNvbnN0IGNoYXIgKiphdiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXN0cnVjdCBjb21taXQgKnJldltNQVhfUkVWU10sICpjb21taXQ7CisJY2hhciAqcmVmbG9nX21zZ1tNQVhfUkVWU107CisJc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0ID0gTlVMTCwgKnNlZW4gPSBOVUxMOworCXVuc2lnbmVkIGludCByZXZfbWFza1tNQVhfUkVWU107CisJaW50IG51bV9yZXYsIGksIGV4dHJhID0gMDsKKwlpbnQgYWxsX2hlYWRzID0gMCwgYWxsX3JlbW90ZXMgPSAwOworCWludCBhbGxfbWFzaywgYWxsX3JldnM7CisJaW50IGxpZm8gPSAxOworCWNoYXIgaGVhZFsxMjhdOworCWNvbnN0IGNoYXIgKmhlYWRfcDsKKwlpbnQgaGVhZF9sZW47CisJdW5zaWduZWQgY2hhciBoZWFkX3NoYTFbMjBdOworCWludCBtZXJnZV9iYXNlID0gMDsKKwlpbnQgaW5kZXBlbmRlbnQgPSAwOworCWludCBub19uYW1lID0gMDsKKwlpbnQgc2hhMV9uYW1lID0gMDsKKwlpbnQgc2hvd25fbWVyZ2VfcG9pbnQgPSAwOworCWludCB3aXRoX2N1cnJlbnRfYnJhbmNoID0gMDsKKwlpbnQgaGVhZF9hdCA9IC0xOworCWludCB0b3BpY3MgPSAwOworCWludCBkZW5zZSA9IDE7CisJaW50IHJlZmxvZyA9IDA7CisJY29uc3QgY2hhciAqcmVmbG9nX2Jhc2UgPSBOVUxMOworCisJZ2l0X2NvbmZpZyhnaXRfc2hvd19icmFuY2hfY29uZmlnKTsKKworCS8qIElmIG5vdGhpbmcgaXMgc3BlY2lmaWVkLCB0cnkgdGhlIGRlZmF1bHQgZmlyc3QgKi8KKwlpZiAoYWMgPT0gMSAmJiBkZWZhdWx0X251bSkgeworCQlhYyA9IGRlZmF1bHRfbnVtICsgMTsKKwkJYXYgPSBkZWZhdWx0X2FyZyAtIDE7IC8qIGljazsgd2Ugd291bGQgbm90IGFkZHJlc3MgYXZbMF0gKi8KKwl9CisKKwl3aGlsZSAoMSA8IGFjICYmIGF2WzFdWzBdID09ICctJykgeworCQljb25zdCBjaGFyICphcmcgPSBhdlsxXTsKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkgeworCQkJYWMtLTsgYXYrKzsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1hbGwiKSB8fCAhc3RyY21wKGFyZywgIi1hIikpCisJCQlhbGxfaGVhZHMgPSBhbGxfcmVtb3RlcyA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1yZW1vdGVzIikgfHwgIXN0cmNtcChhcmcsICItciIpKQorCQkJYWxsX3JlbW90ZXMgPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tbW9yZSIpKQorCQkJZXh0cmEgPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tbGlzdCIpKQorCQkJZXh0cmEgPSAtMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLW5vLW5hbWUiKSkKKwkJCW5vX25hbWUgPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tY3VycmVudCIpKQorCQkJd2l0aF9jdXJyZW50X2JyYW5jaCA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1zaGExLW5hbWUiKSkKKwkJCXNoYTFfbmFtZSA9IDE7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1tb3JlPSIpKQorCQkJZXh0cmEgPSBhdG9pKGFyZyArIDcpOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tbWVyZ2UtYmFzZSIpKQorCQkJbWVyZ2VfYmFzZSA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1pbmRlcGVuZGVudCIpKQorCQkJaW5kZXBlbmRlbnQgPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tdG9wby1vcmRlciIpKQorCQkJbGlmbyA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS10b3BpY3MiKSkKKwkJCXRvcGljcyA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1zcGFyc2UiKSkKKwkJCWRlbnNlID0gMDsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWRhdGUtb3JkZXIiKSkKKwkJCWxpZm8gPSAwOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tcmVmbG9nIikgfHwgIXN0cmNtcChhcmcsICItZyIpKSB7CisJCQlyZWZsb2cgPSBERUZBVUxUX1JFRkxPRzsKKwkJfQorCQllbHNlIGlmICghcHJlZml4Y21wKGFyZywgIi0tcmVmbG9nPSIpKQorCQkJcGFyc2VfcmVmbG9nX3BhcmFtKGFyZyArIDksICZyZWZsb2csICZyZWZsb2dfYmFzZSk7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLWc9IikpCisJCQlwYXJzZV9yZWZsb2dfcGFyYW0oYXJnICsgMywgJnJlZmxvZywgJnJlZmxvZ19iYXNlKTsKKwkJZWxzZQorCQkJdXNhZ2Uoc2hvd19icmFuY2hfdXNhZ2UpOworCQlhYy0tOyBhdisrOworCX0KKwlhYy0tOyBhdisrOworCisJaWYgKGV4dHJhIHx8IHJlZmxvZykgeworCQkvKiAibGlzdGluZyIgbW9kZSBpcyBpbmNvbXBhdGlibGUgd2l0aAorCQkgKiBpbmRlcGVuZGVudCBub3IgbWVyZ2UtYmFzZSBtb2Rlcy4KKwkJICovCisJCWlmIChpbmRlcGVuZGVudCB8fCBtZXJnZV9iYXNlKQorCQkJdXNhZ2Uoc2hvd19icmFuY2hfdXNhZ2UpOworCQlpZiAocmVmbG9nICYmICgoMCA8IGV4dHJhKSB8fCBhbGxfaGVhZHMgfHwgYWxsX3JlbW90ZXMpKQorCQkJLyoKKwkJCSAqIEFza2luZyBmb3IgLS1tb3JlIGluIHJlZmxvZyBtb2RlIGRvZXMgbm90CisJCQkgKiBtYWtlIHNlbnNlLiAgLS1saXN0IGlzIE9rLgorCQkJICoKKwkJCSAqIEFsc28gLS1hbGwgYW5kIC0tcmVtb3RlcyBkbyBub3QgbWFrZSBzZW5zZSBlaXRoZXIuCisJCQkgKi8KKwkJCXVzYWdlKHNob3dfYnJhbmNoX3VzYWdlX3JlZmxvZyk7CisJfQorCisJLyogSWYgbm90aGluZyBpcyBzcGVjaWZpZWQsIHNob3cgYWxsIGJyYW5jaGVzIGJ5IGRlZmF1bHQgKi8KKwlpZiAoYWMgKyBhbGxfaGVhZHMgKyBhbGxfcmVtb3RlcyA9PSAwKQorCQlhbGxfaGVhZHMgPSAxOworCisJaWYgKHJlZmxvZykgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQljaGFyIG50aF9kZXNjWzI1Nl07CisJCWNoYXIgKnJlZjsKKwkJaW50IGJhc2UgPSAwOworCisJCWlmIChhYyA9PSAwKSB7CisJCQlzdGF0aWMgY29uc3QgY2hhciAqZmFrZV9hdlsyXTsKKwkJCWNvbnN0IGNoYXIgKnJlZm5hbWU7CisKKwkJCXJlZm5hbWUgPSByZXNvbHZlX3JlZigiSEVBRCIsIHNoYTEsIDEsIE5VTEwpOworCQkJZmFrZV9hdlswXSA9IHhzdHJkdXAocmVmbmFtZSk7CisJCQlmYWtlX2F2WzFdID0gTlVMTDsKKwkJCWF2ID0gZmFrZV9hdjsKKwkJCWFjID0gMTsKKwkJfQorCQlpZiAoYWMgIT0gMSkKKwkJCWRpZSgiLS1yZWZsb2cgb3B0aW9uIG5lZWRzIG9uZSBicmFuY2ggbmFtZSIpOworCisJCWlmIChNQVhfUkVWUyA8IHJlZmxvZykKKwkJCWRpZSgiT25seSAlZCBlbnRyaWVzIGNhbiBiZSBzaG93biBhdCBvbmUgdGltZS4iLAorCQkJICAgIE1BWF9SRVZTKTsKKwkJaWYgKCFkd2ltX3JlZigqYXYsIHN0cmxlbigqYXYpLCBzaGExLCAmcmVmKSkKKwkJCWRpZSgiTm8gc3VjaCByZWYgJXMiLCAqYXYpOworCisJCS8qIEhhcyB0aGUgYmFzZSBiZWVuIHNwZWNpZmllZD8gKi8KKwkJaWYgKHJlZmxvZ19iYXNlKSB7CisJCQljaGFyICplcDsKKwkJCWJhc2UgPSBzdHJ0b3VsKHJlZmxvZ19iYXNlLCAmZXAsIDEwKTsKKwkJCWlmICgqZXApIHsKKwkJCQkvKiBBaCwgdGhhdCBpcyBhIGRhdGUgc3BlYy4uLiAqLworCQkJCXVuc2lnbmVkIGxvbmcgYXQ7CisJCQkJYXQgPSBhcHByb3hpZGF0ZShyZWZsb2dfYmFzZSk7CisJCQkJcmVhZF9yZWZfYXQocmVmLCBhdCwgLTEsIHNoYTEsIE5VTEwsCisJCQkJCSAgICBOVUxMLCBOVUxMLCAmYmFzZSk7CisJCQl9CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgcmVmbG9nOyBpKyspIHsKKwkJCWNoYXIgKmxvZ21zZywgKm07CisJCQljb25zdCBjaGFyICptc2c7CisJCQl1bnNpZ25lZCBsb25nIHRpbWVzdGFtcDsKKwkJCWludCB0ejsKKworCQkJaWYgKHJlYWRfcmVmX2F0KHJlZiwgMCwgYmFzZStpLCBzaGExLCAmbG9nbXNnLAorCQkJCQkmdGltZXN0YW1wLCAmdHosIE5VTEwpKSB7CisJCQkJcmVmbG9nID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW1zZyA9IHN0cmNocihsb2dtc2csICdcdCcpOworCQkJaWYgKCFtc2cpCisJCQkJbXNnID0gIihub25lKSI7CisJCQllbHNlCisJCQkJbXNnKys7CisJCQltID0geG1hbGxvYyhzdHJsZW4obXNnKSArIDIwMCk7CisJCQlzcHJpbnRmKG0sICIoJXMpICVzIiwKKwkJCQlzaG93X2RhdGUodGltZXN0YW1wLCB0eiwgMSksCisJCQkJbXNnKTsKKwkJCXJlZmxvZ19tc2dbaV0gPSBtOworCQkJZnJlZShsb2dtc2cpOworCQkJc3ByaW50ZihudGhfZGVzYywgIiVzQHslZH0iLCAqYXYsIGJhc2UraSk7CisJCQlhcHBlbmRfcmVmKG50aF9kZXNjLCBzaGExLCAxKTsKKwkJfQorCX0KKwllbHNlIGlmIChhbGxfaGVhZHMgKyBhbGxfcmVtb3RlcykKKwkJc25hcmZfcmVmcyhhbGxfaGVhZHMsIGFsbF9yZW1vdGVzKTsKKwllbHNlIHsKKwkJd2hpbGUgKDAgPCBhYykgeworCQkJYXBwZW5kX29uZV9yZXYoKmF2KTsKKwkJCWFjLS07IGF2Kys7CisJCX0KKwl9CisKKwloZWFkX3AgPSByZXNvbHZlX3JlZigiSEVBRCIsIGhlYWRfc2hhMSwgMSwgTlVMTCk7CisJaWYgKGhlYWRfcCkgeworCQloZWFkX2xlbiA9IHN0cmxlbihoZWFkX3ApOworCQltZW1jcHkoaGVhZCwgaGVhZF9wLCBoZWFkX2xlbiArIDEpOworCX0KKwllbHNlIHsKKwkJaGVhZF9sZW4gPSAwOworCQloZWFkWzBdID0gMDsKKwl9CisKKwlpZiAod2l0aF9jdXJyZW50X2JyYW5jaCAmJiBoZWFkX3ApIHsKKwkJaW50IGhhc19oZWFkID0gMDsKKwkJZm9yIChpID0gMDsgIWhhc19oZWFkICYmIGkgPCByZWZfbmFtZV9jbnQ7IGkrKykgeworCQkJLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBhZGRpbmcgdGhlIGJyYW5jaAorCQkJICogSEVBRCBwb2ludHMgYXQuCisJCQkgKi8KKwkJCWlmIChyZXZfaXNfaGVhZChoZWFkLAorCQkJCQloZWFkX2xlbiwKKwkJCQkJcmVmX25hbWVbaV0sCisJCQkJCWhlYWRfc2hhMSwgTlVMTCkpCisJCQkJaGFzX2hlYWQrKzsKKwkJfQorCQlpZiAoIWhhc19oZWFkKSB7CisJCQlpbnQgcGZ4bGVuID0gc3RybGVuKCJyZWZzL2hlYWRzLyIpOworCQkJYXBwZW5kX29uZV9yZXYoaGVhZCArIHBmeGxlbik7CisJCX0KKwl9CisKKwlpZiAoIXJlZl9uYW1lX2NudCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHJldnMgdG8gYmUgc2hvd24uXG4iKTsKKwkJZXhpdCgwKTsKKwl9CisKKwlmb3IgKG51bV9yZXYgPSAwOyByZWZfbmFtZVtudW1fcmV2XTsgbnVtX3JldisrKSB7CisJCXVuc2lnbmVkIGNoYXIgcmV2a2V5WzIwXTsKKwkJdW5zaWduZWQgaW50IGZsYWcgPSAxdSA8PCAobnVtX3JldiArIFJFVl9TSElGVCk7CisKKwkJaWYgKE1BWF9SRVZTIDw9IG51bV9yZXYpCisJCQlkaWUoImNhbm5vdCBoYW5kbGUgbW9yZSB0aGFuICVkIHJldnMuIiwgTUFYX1JFVlMpOworCQlpZiAoZ2V0X3NoYTEocmVmX25hbWVbbnVtX3Jldl0sIHJldmtleSkpCisJCQlkaWUoIiclcycgaXMgbm90IGEgdmFsaWQgcmVmLiIsIHJlZl9uYW1lW251bV9yZXZdKTsKKwkJY29tbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2UocmV2a2V5KTsKKwkJaWYgKCFjb21taXQpCisJCQlkaWUoImNhbm5vdCBmaW5kIGNvbW1pdCAlcyAoJXMpIiwKKwkJCSAgICByZWZfbmFtZVtudW1fcmV2XSwgcmV2a2V5KTsKKwkJcGFyc2VfY29tbWl0KGNvbW1pdCk7CisJCW1hcmtfc2Vlbihjb21taXQsICZzZWVuKTsKKworCQkvKiByZXYjMCB1c2VzIGJpdCBSRVZfU0hJRlQsIHJldiMxIHVzZXMgYml0IFJFVl9TSElGVCsxLAorCQkgKiBhbmQgc28gb24uICBSRVZfU0hJRlQgYml0cyBmcm9tIGJpdCAwIGFyZSB1c2VkIGZvcgorCQkgKiBpbnRlcm5hbCBib29ra2VlcGluZy4KKwkJICovCisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IGZsYWc7CisJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyA9PSBmbGFnKQorCQkJaW5zZXJ0X2J5X2RhdGUoY29tbWl0LCAmbGlzdCk7CisJCXJldltudW1fcmV2XSA9IGNvbW1pdDsKKwl9CisJZm9yIChpID0gMDsgaSA8IG51bV9yZXY7IGkrKykKKwkJcmV2X21hc2tbaV0gPSByZXZbaV0tPm9iamVjdC5mbGFnczsKKworCWlmICgwIDw9IGV4dHJhKQorCQlqb2luX3JldnMoJmxpc3QsICZzZWVuLCBudW1fcmV2LCBleHRyYSk7CisKKwlzb3J0X2J5X2RhdGUoJnNlZW4pOworCisJaWYgKG1lcmdlX2Jhc2UpCisJCXJldHVybiBzaG93X21lcmdlX2Jhc2Uoc2VlbiwgbnVtX3Jldik7CisKKwlpZiAoaW5kZXBlbmRlbnQpCisJCXJldHVybiBzaG93X2luZGVwZW5kZW50KHJldiwgbnVtX3JldiwgcmVmX25hbWUsIHJldl9tYXNrKTsKKworCS8qIFNob3cgbGlzdDsgLS1tb3JlPS0xIG1lYW5zIGxpc3Qtb25seSAqLworCWlmICgxIDwgbnVtX3JldiB8fCBleHRyYSA8IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9yZXY7IGkrKykgeworCQkJaW50IGo7CisJCQlpbnQgaXNfaGVhZCA9IHJldl9pc19oZWFkKGhlYWQsCisJCQkJCQkgIGhlYWRfbGVuLAorCQkJCQkJICByZWZfbmFtZVtpXSwKKwkJCQkJCSAgaGVhZF9zaGExLAorCQkJCQkJICByZXZbaV0tPm9iamVjdC5zaGExKTsKKwkJCWlmIChleHRyYSA8IDApCisJCQkJcHJpbnRmKCIlYyBbJXNdICIsCisJCQkJICAgICAgIGlzX2hlYWQgPyAnKicgOiAnICcsIHJlZl9uYW1lW2ldKTsKKwkJCWVsc2UgeworCQkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJCQkJCXB1dGNoYXIoJyAnKTsKKwkJCQlwcmludGYoIiVjIFslc10gIiwKKwkJCQkgICAgICAgaXNfaGVhZCA/ICcqJyA6ICchJywgcmVmX25hbWVbaV0pOworCQkJfQorCisJCQlpZiAoIXJlZmxvZykgeworCQkJCS8qIGhlYWRlciBsaW5lcyBuZXZlciBuZWVkIG5hbWUgKi8KKwkJCQlzaG93X29uZV9jb21taXQocmV2W2ldLCAxKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlwdXRzKHJlZmxvZ19tc2dbaV0pOworCisJCQlpZiAoaXNfaGVhZCkKKwkJCQloZWFkX2F0ID0gaTsKKwkJfQorCQlpZiAoMCA8PSBleHRyYSkgeworCQkJZm9yIChpID0gMDsgaSA8IG51bV9yZXY7IGkrKykKKwkJCQlwdXRjaGFyKCctJyk7CisJCQlwdXRjaGFyKCdcbicpOworCQl9CisJfQorCWlmIChleHRyYSA8IDApCisJCWV4aXQoMCk7CisKKwkvKiBTb3J0IHRvcG9sb2dpY2FsbHkgKi8KKwlzb3J0X2luX3RvcG9sb2dpY2FsX29yZGVyKCZzZWVuLCBsaWZvKTsKKworCS8qIEdpdmUgbmFtZXMgdG8gY29tbWl0cyAqLworCWlmICghc2hhMV9uYW1lICYmICFub19uYW1lKQorCQluYW1lX2NvbW1pdHMoc2VlbiwgcmV2LCByZWZfbmFtZSwgbnVtX3Jldik7CisKKwlhbGxfbWFzayA9ICgoMXUgPDwgKFJFVl9TSElGVCArIG51bV9yZXYpKSAtIDEpOworCWFsbF9yZXZzID0gYWxsX21hc2sgJiB+KCgxdSA8PCBSRVZfU0hJRlQpIC0gMSk7CisKKwl3aGlsZSAoc2VlbikgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBwb3Bfb25lX2NvbW1pdCgmc2Vlbik7CisJCWludCB0aGlzX2ZsYWcgPSBjb21taXQtPm9iamVjdC5mbGFnczsKKwkJaW50IGlzX21lcmdlX3BvaW50ID0gKCh0aGlzX2ZsYWcgJiBhbGxfcmV2cykgPT0gYWxsX3JldnMpOworCisJCXNob3duX21lcmdlX3BvaW50IHw9IGlzX21lcmdlX3BvaW50OworCisJCWlmICgxIDwgbnVtX3JldikgeworCQkJaW50IGlzX21lcmdlID0gISEoY29tbWl0LT5wYXJlbnRzICYmCisJCQkJCSAgY29tbWl0LT5wYXJlbnRzLT5uZXh0KTsKKwkJCWlmICh0b3BpY3MgJiYKKwkJCSAgICAhaXNfbWVyZ2VfcG9pbnQgJiYKKwkJCSAgICAodGhpc19mbGFnICYgKDF1IDw8IFJFVl9TSElGVCkpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGRlbnNlICYmIGlzX21lcmdlICYmCisJCQkgICAgb21pdF9pbl9kZW5zZShjb21taXQsIHJldiwgbnVtX3JldikpCisJCQkJY29udGludWU7CisJCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3JldjsgaSsrKSB7CisJCQkJaW50IG1hcms7CisJCQkJaWYgKCEodGhpc19mbGFnICYgKDF1IDw8IChpICsgUkVWX1NISUZUKSkpKQorCQkJCQltYXJrID0gJyAnOworCQkJCWVsc2UgaWYgKGlzX21lcmdlKQorCQkJCQltYXJrID0gJy0nOworCQkJCWVsc2UgaWYgKGkgPT0gaGVhZF9hdCkKKwkJCQkJbWFyayA9ICcqJzsKKwkJCQllbHNlCisJCQkJCW1hcmsgPSAnKyc7CisJCQkJcHV0Y2hhcihtYXJrKTsKKwkJCX0KKwkJCXB1dGNoYXIoJyAnKTsKKwkJfQorCQlzaG93X29uZV9jb21taXQoY29tbWl0LCBub19uYW1lKTsKKworCQlpZiAoc2hvd25fbWVyZ2VfcG9pbnQgJiYgLS1leHRyYSA8IDApCisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXNob3ctcmVmLmMgYi9idWlsdGluLXNob3ctcmVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMyMzYzMwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tc2hvdy1yZWYuYwpAQCAtMCwwICsxLDI1NiBAQAorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJwYXRoLWxpc3QuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgc2hvd19yZWZfdXNhZ2VbXSA9ICJnaXQgc2hvdy1yZWYgWy1xfC0tcXVpZXRdIFstLXZlcmlmeV0gWy1ofC0taGVhZF0gWy1kfC0tZGVyZWZlcmVuY2VdIFstc3wtLWhhc2hbPTxsZW5ndGg+XV0gWy0tYWJicmV2Wz08bGVuZ3RoPl1dIFstLXRhZ3NdIFstLWhlYWRzXSBbLS1dIFtwYXR0ZXJuKl0gPCByZWYtbGlzdCI7CisKK3N0YXRpYyBpbnQgZGVyZWZfdGFncyA9IDAsIHNob3dfaGVhZCA9IDAsIHRhZ3Nfb25seSA9IDAsIGhlYWRzX29ubHkgPSAwLAorCWZvdW5kX21hdGNoID0gMCwgdmVyaWZ5ID0gMCwgcXVpZXQgPSAwLCBoYXNoX29ubHkgPSAwLCBhYmJyZXYgPSAwOworc3RhdGljIGNvbnN0IGNoYXIgKipwYXR0ZXJuOworCitzdGF0aWMgdm9pZCBzaG93X29uZShjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWNvbnN0IGNoYXIgKmhleCA9IGZpbmRfdW5pcXVlX2FiYnJldihzaGExLCBhYmJyZXYpOworCWlmIChoYXNoX29ubHkpCisJCXByaW50ZigiJXNcbiIsIGhleCk7CisJZWxzZQorCQlwcmludGYoIiVzICVzXG4iLCBoZXgsIHJlZm5hbWUpOworfQorCitzdGF0aWMgaW50IHNob3dfcmVmKGNvbnN0IGNoYXIgKnJlZm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFnLCB2b2lkICpjYmRhdGEpCit7CisJc3RydWN0IG9iamVjdCAqb2JqOworCWNvbnN0IGNoYXIgKmhleDsKKwl1bnNpZ25lZCBjaGFyIHBlZWxlZFsyMF07CisKKwlpZiAodGFnc19vbmx5IHx8IGhlYWRzX29ubHkpIHsKKwkJaW50IG1hdGNoOworCisJCW1hdGNoID0gaGVhZHNfb25seSAmJiAhcHJlZml4Y21wKHJlZm5hbWUsICJyZWZzL2hlYWRzLyIpOworCQltYXRjaCB8PSB0YWdzX29ubHkgJiYgIXByZWZpeGNtcChyZWZuYW1lLCAicmVmcy90YWdzLyIpOworCQlpZiAoIW1hdGNoKQorCQkJcmV0dXJuIDA7CisJfQorCWlmIChwYXR0ZXJuKSB7CisJCWludCByZWZsZW4gPSBzdHJsZW4ocmVmbmFtZSk7CisJCWNvbnN0IGNoYXIgKipwID0gcGF0dGVybiwgKm07CisJCXdoaWxlICgobSA9ICpwKyspICE9IE5VTEwpIHsKKwkJCWludCBsZW4gPSBzdHJsZW4obSk7CisJCQlpZiAobGVuID4gcmVmbGVuKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKG1lbWNtcChtLCByZWZuYW1lICsgcmVmbGVuIC0gbGVuLCBsZW4pKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGxlbiA9PSByZWZsZW4pCisJCQkJZ290byBtYXRjaDsKKwkJCS8qICItLXZlcmlmeSIgcmVxdWlyZXMgYW4gZXhhY3QgbWF0Y2ggKi8KKwkJCWlmICh2ZXJpZnkpCisJCQkJY29udGludWU7CisJCQlpZiAocmVmbmFtZVtyZWZsZW4gLSBsZW4gLSAxXSA9PSAnLycpCisJCQkJZ290byBtYXRjaDsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKK21hdGNoOgorCWZvdW5kX21hdGNoKys7CisKKwkvKiBUaGlzIGNoYW5nZXMgdGhlIHNlbWFudGljcyBzbGlnaHRseSB0aGF0IGV2ZW4gdW5kZXIgcXVpZXQgd2UKKwkgKiBkZXRlY3QgYW5kIHJldHVybiBlcnJvciBpZiB0aGUgcmVwb3NpdG9yeSBpcyBjb3JydXB0IGFuZAorCSAqIHJlZiBwb2ludHMgYXQgYSBub25leGlzdGVudCBvYmplY3QuCisJICovCisJaWYgKCFoYXNfc2hhMV9maWxlKHNoYTEpKQorCQlkaWUoImdpdC1zaG93LXJlZjogYmFkIHJlZiAlcyAoJXMpIiwgcmVmbmFtZSwKKwkJICAgIHNoYTFfdG9faGV4KHNoYTEpKTsKKworCWlmIChxdWlldCkKKwkJcmV0dXJuIDA7CisKKwlzaG93X29uZShyZWZuYW1lLCBzaGExKTsKKworCWlmICghZGVyZWZfdGFncykKKwkJcmV0dXJuIDA7CisKKwlpZiAoKGZsYWcgJiBSRUZfSVNQQUNLRUQpICYmICFwZWVsX3JlZihyZWZuYW1lLCBwZWVsZWQpKSB7CisJCWlmICghaXNfbnVsbF9zaGExKHBlZWxlZCkpIHsKKwkJCWhleCA9IGZpbmRfdW5pcXVlX2FiYnJldihwZWVsZWQsIGFiYnJldik7CisJCQlwcmludGYoIiVzICVzXnt9XG4iLCBoZXgsIHJlZm5hbWUpOworCQl9CisJfQorCWVsc2UgeworCQlvYmogPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJCWlmICghb2JqKQorCQkJZGllKCJnaXQtc2hvdy1yZWY6IGJhZCByZWYgJXMgKCVzKSIsIHJlZm5hbWUsCisJCQkgICAgc2hhMV90b19oZXgoc2hhMSkpOworCQlpZiAob2JqLT50eXBlID09IE9CSl9UQUcpIHsKKwkJCW9iaiA9IGRlcmVmX3RhZyhvYmosIHJlZm5hbWUsIDApOworCQkJaWYgKCFvYmopCisJCQkJZGllKCJnaXQtc2hvdy1yZWY6IGJhZCB0YWcgYXQgcmVmICVzICglcykiLCByZWZuYW1lLAorCQkJCSAgICBzaGExX3RvX2hleChzaGExKSk7CisJCQloZXggPSBmaW5kX3VuaXF1ZV9hYmJyZXYob2JqLT5zaGExLCBhYmJyZXYpOworCQkJcHJpbnRmKCIlcyAlc157fVxuIiwgaGV4LCByZWZuYW1lKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGRfZXhpc3RpbmcoY29uc3QgY2hhciAqcmVmbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZsYWcsIHZvaWQgKmNiZGF0YSkKK3sKKwlzdHJ1Y3QgcGF0aF9saXN0ICpsaXN0ID0gKHN0cnVjdCBwYXRoX2xpc3QgKiljYmRhdGE7CisJcGF0aF9saXN0X2luc2VydChyZWZuYW1lLCBsaXN0KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHJlYWQgIl4oPzo8YW55dGhpbmc+XHMpPzxyZWZuYW1lPig/OlxeXHtcfSk/JCIgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQsCisgKiBhbmQKKyAqICgxKSBzdHJpcCAiXnt9IiBhdCB0aGUgZW5kIG9mIGxpbmUgaWYgYW55OworICogKDIpIGlnbm9yZSBpZiBtYXRjaCBpcyBwcm92aWRlZCBhbmQgZG9lcyBub3QgaGVhZC1tYXRjaCByZWZuYW1lOworICogKDMpIHdhcm4gaWYgcmVmbmFtZSBpcyBub3QgYSB3ZWxsLWZvcm1lZCByZWZuYW1lIGFuZCBza2lwOworICogKDQpIGlnbm9yZSBpZiByZWZuYW1lIGlzIGEgcmVmIHRoYXQgZXhpc3RzIGluIHRoZSBsb2NhbCByZXBvc2l0b3J5OworICogKDUpIG90aGVyd2lzZSBvdXRwdXQgdGhlIGxpbmUuCisgKi8KK3N0YXRpYyBpbnQgZXhjbHVkZV9leGlzdGluZyhjb25zdCBjaGFyICptYXRjaCkKK3sKKwlzdGF0aWMgc3RydWN0IHBhdGhfbGlzdCBleGlzdGluZ19yZWZzID0geyBOVUxMLCAwLCAwLCAwIH07CisJY2hhciBidWZbMTAyNF07CisJaW50IG1hdGNobGVuID0gbWF0Y2ggPyBzdHJsZW4obWF0Y2gpIDogMDsKKworCWZvcl9lYWNoX3JlZihhZGRfZXhpc3RpbmcsICZleGlzdGluZ19yZWZzKTsKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgc3RkaW4pKSB7CisJCWNoYXIgKnJlZjsKKwkJaW50IGxlbiA9IHN0cmxlbihidWYpOworCisJCWlmIChsZW4gPiAwICYmIGJ1ZltsZW4gLSAxXSA9PSAnXG4nKQorCQkJYnVmWy0tbGVuXSA9ICdcMCc7CisJCWlmICgzIDw9IGxlbiAmJiAhc3RyY21wKGJ1ZiArIGxlbiAtIDMsICJee30iKSkgeworCQkJbGVuIC09IDM7CisJCQlidWZbbGVuXSA9ICdcMCc7CisJCX0KKwkJZm9yIChyZWYgPSBidWYgKyBsZW47IGJ1ZiA8IHJlZjsgcmVmLS0pCisJCQlpZiAoaXNzcGFjZShyZWZbLTFdKSkKKwkJCQlicmVhazsKKwkJaWYgKG1hdGNoKSB7CisJCQlpbnQgcmVmbGVuID0gYnVmICsgbGVuIC0gcmVmOworCQkJaWYgKHJlZmxlbiA8IG1hdGNobGVuKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHN0cm5jbXAocmVmLCBtYXRjaCwgbWF0Y2hsZW4pKQorCQkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjaGVja19yZWZfZm9ybWF0KHJlZikpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAid2FybmluZzogcmVmICclcycgaWdub3JlZFxuIiwgcmVmKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcGF0aF9saXN0X2hhc19wYXRoKCZleGlzdGluZ19yZWZzLCByZWYpKSB7CisJCQlwcmludGYoIiVzXG4iLCBidWYpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitpbnQgY21kX3Nob3dfcmVmKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBpOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCQlpZiAoKmFyZyAhPSAnLScpIHsKKwkJCXBhdHRlcm4gPSBhcmd2ICsgaTsKKwkJCWJyZWFrOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tIikpIHsKKwkJCXBhdHRlcm4gPSBhcmd2ICsgaSArIDE7CisJCQlpZiAoISpwYXR0ZXJuKQorCQkJCXBhdHRlcm4gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXEiKSB8fCAhc3RyY21wKGFyZywgIi0tcXVpZXQiKSkgeworCQkJcXVpZXQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLWgiKSB8fCAhc3RyY21wKGFyZywgIi0taGVhZCIpKSB7CisJCQlzaG93X2hlYWQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLWQiKSB8fCAhc3RyY21wKGFyZywgIi0tZGVyZWZlcmVuY2UiKSkgeworCQkJZGVyZWZfdGFncyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItcyIpIHx8ICFzdHJjbXAoYXJnLCAiLS1oYXNoIikpIHsKKwkJCWhhc2hfb25seSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItLWhhc2g9IikgfHwKKwkJICAgICghcHJlZml4Y21wKGFyZywgIi0tYWJicmV2IikgJiYKKwkJICAgICAoYXJnWzhdID09ICc9JyB8fCBhcmdbOF0gPT0gJ1wwJykpKSB7CisJCQlpZiAoYXJnWzJdICE9ICdoJyAmJiAhYXJnWzhdKQorCQkJCS8qIC0tYWJicmV2IG9ubHkgKi8KKwkJCQlhYmJyZXYgPSBERUZBVUxUX0FCQlJFVjsKKwkJCWVsc2UgeworCQkJCS8qIC0taGFzaD0gb3IgLS1hYmJyZXY9ICovCisJCQkJY2hhciAqZW5kOworCQkJCWlmIChhcmdbMl0gPT0gJ2gnKSB7CisJCQkJCWhhc2hfb25seSA9IDE7CisJCQkJCWFyZyArPSA3OworCQkJCX0KKwkJCQllbHNlCisJCQkJCWFyZyArPSA5OworCQkJCWFiYnJldiA9IHN0cnRvdWwoYXJnLCAmZW5kLCAxMCk7CisJCQkJaWYgKCplbmQgfHwgYWJicmV2ID4gNDApCisJCQkJCXVzYWdlKHNob3dfcmVmX3VzYWdlKTsKKwkJCQlpZiAoYWJicmV2IDwgTUlOSU1VTV9BQkJSRVYpCisJCQkJCWFiYnJldiA9IE1JTklNVU1fQUJCUkVWOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS12ZXJpZnkiKSkgeworCQkJdmVyaWZ5ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tdGFncyIpKSB7CisJCQl0YWdzX29ubHkgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1oZWFkcyIpKSB7CisJCQloZWFkc19vbmx5ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tZXhjbHVkZS1leGlzdGluZyIpKQorCQkJcmV0dXJuIGV4Y2x1ZGVfZXhpc3RpbmcoTlVMTCk7CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tZXhjbHVkZS1leGlzdGluZz0iKSkKKwkJCXJldHVybiBleGNsdWRlX2V4aXN0aW5nKGFyZyArIDE5KTsKKwkJdXNhZ2Uoc2hvd19yZWZfdXNhZ2UpOworCX0KKworCWlmICh2ZXJpZnkpIHsKKwkJaWYgKCFwYXR0ZXJuKQorCQkJZGllKCItLXZlcmlmeSByZXF1aXJlcyBhIHJlZmVyZW5jZSIpOworCQl3aGlsZSAoKnBhdHRlcm4pIHsKKwkJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisKKwkJCWlmICghcHJlZml4Y21wKCpwYXR0ZXJuLCAicmVmcy8iKSAmJgorCQkJICAgIHJlc29sdmVfcmVmKCpwYXR0ZXJuLCBzaGExLCAxLCBOVUxMKSkgeworCQkJCWlmICghcXVpZXQpCisJCQkJCXNob3dfb25lKCpwYXR0ZXJuLCBzaGExKTsKKwkJCX0KKwkJCWVsc2UgaWYgKCFxdWlldCkKKwkJCQlkaWUoIiclcycgLSBub3QgYSB2YWxpZCByZWYiLCAqcGF0dGVybik7CisJCQllbHNlCisJCQkJcmV0dXJuIDE7CisJCQlwYXR0ZXJuKys7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHNob3dfaGVhZCkKKwkJaGVhZF9yZWYoc2hvd19yZWYsIE5VTEwpOworCWZvcl9lYWNoX3JlZihzaG93X3JlZiwgTlVMTCk7CisJaWYgKCFmb3VuZF9tYXRjaCkgeworCQlpZiAodmVyaWZ5ICYmICFxdWlldCkKKwkJCWRpZSgiTm8gbWF0Y2giKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1zdHJpcHNwYWNlLmMgYi9idWlsdGluLXN0cmlwc3BhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGIyMTMwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1zdHJpcHNwYWNlLmMKQEAgLTAsMCArMSw4OSBAQAorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorCisvKgorICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIGEgbGluZSwgd2l0aG91dCB0cmFpbGluZyBzcGFjZXMuCisgKgorICogSWYgdGhlIGxpbmUgZW5kcyB3aXRoIG5ld2xpbmUsIGl0IHdpbGwgYmUgcmVtb3ZlZCB0b28uCisgKi8KK3N0YXRpYyBzaXplX3QgY2xlYW51cChjaGFyICpsaW5lLCBzaXplX3QgbGVuKQoreworCXdoaWxlIChsZW4pIHsKKwkJdW5zaWduZWQgY2hhciBjID0gbGluZVtsZW4gLSAxXTsKKwkJaWYgKCFpc3NwYWNlKGMpKQorCQkJYnJlYWs7CisJCWxlbi0tOworCX0KKworCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBSZW1vdmUgZW1wdHkgbGluZXMgZnJvbSB0aGUgYmVnaW5uaW5nIGFuZCBlbmQKKyAqIGFuZCBhbHNvIHRyYWlsaW5nIHNwYWNlcyBmcm9tIGV2ZXJ5IGxpbmUuCisgKgorICogTm90ZSB0aGF0IHRoZSBidWZmZXIgd2lsbCBub3QgYmUgTlVMLXRlcm1pbmF0ZWQuCisgKgorICogVHVybiBtdWx0aXBsZSBjb25zZWN1dGl2ZSBlbXB0eSBsaW5lcyBiZXR3ZWVuIHBhcmFncmFwaHMKKyAqIGludG8ganVzdCBvbmUgZW1wdHkgbGluZS4KKyAqCisgKiBJZiB0aGUgaW5wdXQgaGFzIG9ubHkgZW1wdHkgbGluZXMgYW5kIHNwYWNlcywKKyAqIG5vIG91dHB1dCB3aWxsIGJlIHByb2R1Y2VkLgorICoKKyAqIElmIGxhc3QgbGluZSBkb2VzIG5vdCBoYXZlIGEgbmV3bGluZSBhdCB0aGUgZW5kLCBvbmUgaXMgYWRkZWQuCisgKgorICogRW5hYmxlIHNraXBfY29tbWVudHMgdG8gc2tpcCBldmVyeSBsaW5lIHN0YXJ0aW5nIHdpdGggIiMiLgorICovCit2b2lkIHN0cmlwc3BhY2Uoc3RydWN0IHN0cmJ1ZiAqc2IsIGludCBza2lwX2NvbW1lbnRzKQoreworCWludCBlbXB0aWVzID0gMDsKKwlzaXplX3QgaSwgaiwgbGVuLCBuZXdsZW47CisJY2hhciAqZW9sOworCisJLyogV2UgbWF5IGhhdmUgdG8gYWRkIGEgbmV3bGluZS4gKi8KKwlzdHJidWZfZ3JvdyhzYiwgMSk7CisKKwlmb3IgKGkgPSBqID0gMDsgaSA8IHNiLT5sZW47IGkgKz0gbGVuLCBqICs9IG5ld2xlbikgeworCQllb2wgPSBtZW1jaHIoc2ItPmJ1ZiArIGksICdcbicsIHNiLT5sZW4gLSBpKTsKKwkJbGVuID0gZW9sID8gZW9sIC0gKHNiLT5idWYgKyBpKSArIDEgOiBzYi0+bGVuIC0gaTsKKworCQlpZiAoc2tpcF9jb21tZW50cyAmJiBsZW4gJiYgc2ItPmJ1ZltpXSA9PSAnIycpIHsKKwkJCW5ld2xlbiA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQluZXdsZW4gPSBjbGVhbnVwKHNiLT5idWYgKyBpLCBsZW4pOworCisJCS8qIE5vdCBqdXN0IGFuIGVtcHR5IGxpbmU/ICovCisJCWlmIChuZXdsZW4pIHsKKwkJCWlmIChlbXB0aWVzID4gMCAmJiBqID4gMCkKKwkJCQlzYi0+YnVmW2orK10gPSAnXG4nOworCQkJZW1wdGllcyA9IDA7CisJCQltZW1tb3ZlKHNiLT5idWYgKyBqLCBzYi0+YnVmICsgaSwgbmV3bGVuKTsKKwkJCXNiLT5idWZbbmV3bGVuICsgaisrXSA9ICdcbic7CisJCX0gZWxzZSB7CisJCQllbXB0aWVzKys7CisJCX0KKwl9CisKKwlzdHJidWZfc2V0bGVuKHNiLCBqKTsKK30KKworaW50IGNtZF9zdHJpcHNwYWNlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXN0cnVjdCBzdHJidWYgYnVmOworCWludCBzdHJpcF9jb21tZW50cyA9IDA7CisKKwlpZiAoYXJnYyA+IDEgJiYgKCFzdHJjbXAoYXJndlsxXSwgIi1zIikgfHwKKwkJCQkhc3RyY21wKGFyZ3ZbMV0sICItLXN0cmlwLWNvbW1lbnRzIikpKQorCQlzdHJpcF9jb21tZW50cyA9IDE7CisKKwlzdHJidWZfaW5pdCgmYnVmLCAwKTsKKwlpZiAoc3RyYnVmX3JlYWQoJmJ1ZiwgMCwgMTAyNCkgPCAwKQorCQlkaWUoImNvdWxkIG5vdCByZWFkIHRoZSBpbnB1dCIpOworCisJc3RyaXBzcGFjZSgmYnVmLCBzdHJpcF9jb21tZW50cyk7CisKKwl3cml0ZV9vcl9kaWUoMSwgYnVmLmJ1ZiwgYnVmLmxlbik7CisJc3RyYnVmX3JlbGVhc2UoJmJ1Zik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXN5bWJvbGljLXJlZi5jIGIvYnVpbHRpbi1zeW1ib2xpYy1yZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzM5ODJiCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1zeW1ib2xpYy1yZWYuYwpAQCAtMCwwICsxLDUzIEBACisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgInBhcnNlLW9wdGlvbnMuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBnaXRfc3ltYm9saWNfcmVmX3VzYWdlW10gPSB7CisJImdpdC1zeW1ib2xpYy1yZWYgW29wdGlvbnNdIG5hbWUgW3JlZl0iLAorCU5VTEwKK307CisKK3N0YXRpYyB2b2lkIGNoZWNrX3N5bXJlZihjb25zdCBjaGFyICpIRUFELCBpbnQgcXVpZXQpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlpbnQgZmxhZzsKKwljb25zdCBjaGFyICpyZWZzX2hlYWRzX21hc3RlciA9IHJlc29sdmVfcmVmKEhFQUQsIHNoYTEsIDAsICZmbGFnKTsKKworCWlmICghcmVmc19oZWFkc19tYXN0ZXIpCisJCWRpZSgiTm8gc3VjaCByZWY6ICVzIiwgSEVBRCk7CisJZWxzZSBpZiAoIShmbGFnICYgUkVGX0lTU1lNUkVGKSkgeworCQlpZiAoIXF1aWV0KQorCQkJZGllKCJyZWYgJXMgaXMgbm90IGEgc3ltYm9saWMgcmVmIiwgSEVBRCk7CisJCWVsc2UKKwkJCWV4aXQoMSk7CisJfQorCXB1dHMocmVmc19oZWFkc19tYXN0ZXIpOworfQorCitpbnQgY21kX3N5bWJvbGljX3JlZihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgcXVpZXQgPSAwOworCWNvbnN0IGNoYXIgKm1zZyA9IE5VTEw7CisJc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisJCU9QVF9fUVVJRVQoJnF1aWV0KSwKKwkJT1BUX1NUUklORygnbScsIE5VTEwsICZtc2csICJyZWFzb24iLCAicmVhc29uIG9mIHRoZSB1cGRhdGUiKSwKKwkJT1BUX0VORCgpLAorCX07CisKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisJYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgb3B0aW9ucywgZ2l0X3N5bWJvbGljX3JlZl91c2FnZSwgMCk7CisJaWYgKG1zZyAmJiEqbXNnKQorCQlkaWUoIlJlZnVzaW5nIHRvIHBlcmZvcm0gdXBkYXRlIHdpdGggZW1wdHkgbWVzc2FnZSIpOworCXN3aXRjaCAoYXJnYykgeworCWNhc2UgMToKKwkJY2hlY2tfc3ltcmVmKGFyZ3ZbMF0sIHF1aWV0KTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQljcmVhdGVfc3ltcmVmKGFyZ3ZbMF0sIGFyZ3ZbMV0sIG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXVzYWdlX3dpdGhfb3B0aW9ucyhnaXRfc3ltYm9saWNfcmVmX3VzYWdlLCBvcHRpb25zKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXRhZy5jIGIvYnVpbHRpbi10YWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGQ5NTlmCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi10YWcuYwpAQCAtMCwwICsxLDQ4NCBAQAorLyoKKyAqIEJ1aWx0aW4gImdpdCB0YWciCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IEtyaXN0aWFuIEjDuGdzYmVyZyA8a3JoQHJlZGhhdC5jb20+LAorICogICAgICAgICAgICAgICAgICAgIENhcmxvcyBSaWNhIDxqYXNhbXBsZXJAZ21haWwuY29tPgorICogQmFzZWQgb24gZ2l0LXRhZy5zaCBhbmQgbWt0YWcuYyBieSBMaW51cyBUb3J2YWxkcy4KKyAqLworCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgInJ1bi1jb21tYW5kLmgiCisjaW5jbHVkZSAicGFyc2Utb3B0aW9ucy5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdpdF90YWdfdXNhZ2VbXSA9IHsKKwkiZ2l0LXRhZyBbLWF8LXN8LXUgPGtleS1pZD5dIFstZl0gWy1tIDxtc2c+fC1GIDxmaWxlPl0gPHRhZ25hbWU+IFs8aGVhZD5dIiwKKwkiZ2l0LXRhZyAtZCA8dGFnbmFtZT4uLi4iLAorCSJnaXQtdGFnIC1sIFstbiBbPG51bT5dXSBbPHBhdHRlcm4+XSIsCisJImdpdC10YWcgLXYgPHRhZ25hbWU+Li4uIiwKKwlOVUxMCit9OworCitzdGF0aWMgY2hhciBzaWduaW5na2V5WzEwMDBdOworCit2b2lkIGxhdW5jaF9lZGl0b3IoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IHN0cmJ1ZiAqYnVmZmVyLCBjb25zdCBjaGFyICpjb25zdCAqZW52KQoreworCWNvbnN0IGNoYXIgKmVkaXRvciwgKnRlcm1pbmFsOworCisJZWRpdG9yID0gZ2V0ZW52KCJHSVRfRURJVE9SIik7CisJaWYgKCFlZGl0b3IgJiYgZWRpdG9yX3Byb2dyYW0pCisJCWVkaXRvciA9IGVkaXRvcl9wcm9ncmFtOworCWlmICghZWRpdG9yKQorCQllZGl0b3IgPSBnZXRlbnYoIlZJU1VBTCIpOworCWlmICghZWRpdG9yKQorCQllZGl0b3IgPSBnZXRlbnYoIkVESVRPUiIpOworCisJdGVybWluYWwgPSBnZXRlbnYoIlRFUk0iKTsKKwlpZiAoIWVkaXRvciAmJiAoIXRlcm1pbmFsIHx8ICFzdHJjbXAodGVybWluYWwsICJkdW1iIikpKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkiVGVybWluYWwgaXMgZHVtYiBidXQgbm8gVklTVUFMIG5vciBFRElUT1IgZGVmaW5lZC5cbiIKKwkJIlBsZWFzZSBzdXBwbHkgdGhlIG1lc3NhZ2UgdXNpbmcgZWl0aGVyIC1tIG9yIC1GIG9wdGlvbi5cbiIpOworCQlleGl0KDEpOworCX0KKworCWlmICghZWRpdG9yKQorCQllZGl0b3IgPSAidmkiOworCisJaWYgKHN0cmNtcChlZGl0b3IsICI6IikpIHsKKwkJc2l6ZV90IGxlbiA9IHN0cmxlbihlZGl0b3IpOworCQlpbnQgaSA9IDA7CisJCWNvbnN0IGNoYXIgKmFyZ3NbNl07CisJCXN0cnVjdCBzdHJidWYgYXJnMDsKKworCQlzdHJidWZfaW5pdCgmYXJnMCwgMCk7CisJCWlmIChzdHJjc3BuKGVkaXRvciwgIiQgXHQnIikgIT0gbGVuKSB7CisJCQkvKiB0aGVyZSBhcmUgc3BlY2lhbHMgKi8KKwkJCXN0cmJ1Zl9hZGRmKCZhcmcwLCAiJXMgXCIkQFwiIiwgZWRpdG9yKTsKKwkJCWFyZ3NbaSsrXSA9ICJzaCI7CisJCQlhcmdzW2krK10gPSAiLWMiOworCQkJYXJnc1tpKytdID0gYXJnMC5idWY7CisJCX0KKwkJYXJnc1tpKytdID0gZWRpdG9yOworCQlhcmdzW2krK10gPSBwYXRoOworCQlhcmdzW2ldID0gTlVMTDsKKworCQlpZiAocnVuX2NvbW1hbmRfdl9vcHRfY2RfZW52KGFyZ3MsIDAsIE5VTEwsIGVudikpCisJCQlkaWUoIlRoZXJlIHdhcyBhIHByb2JsZW0gd2l0aCB0aGUgZWRpdG9yICVzLiIsIGVkaXRvcik7CisJCXN0cmJ1Zl9yZWxlYXNlKCZhcmcwKTsKKwl9CisKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuOworCWlmIChzdHJidWZfcmVhZF9maWxlKGJ1ZmZlciwgcGF0aCwgMCkgPCAwKQorCQlkaWUoImNvdWxkIG5vdCByZWFkIG1lc3NhZ2UgZmlsZSAnJXMnOiAlcyIsCisJCSAgICBwYXRoLCBzdHJlcnJvcihlcnJubykpOworfQorCitzdHJ1Y3QgdGFnX2ZpbHRlciB7CisJY29uc3QgY2hhciAqcGF0dGVybjsKKwlpbnQgbGluZXM7Cit9OworCisjZGVmaW5lIFBHUF9TSUdOQVRVUkUgIi0tLS0tQkVHSU4gUEdQIFNJR05BVFVSRS0tLS0tIgorCitzdGF0aWMgaW50IHNob3dfcmVmZXJlbmNlKGNvbnN0IGNoYXIgKnJlZm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkgIGludCBmbGFnLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCB0YWdfZmlsdGVyICpmaWx0ZXIgPSBjYl9kYXRhOworCisJaWYgKCFmbm1hdGNoKGZpbHRlci0+cGF0dGVybiwgcmVmbmFtZSwgMCkpIHsKKwkJaW50IGk7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwkJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCQljaGFyICpidWYsICpzcCwgKmVvbDsKKwkJc2l6ZV90IGxlbjsKKworCQlpZiAoIWZpbHRlci0+bGluZXMpIHsKKwkJCXByaW50ZigiJXNcbiIsIHJlZm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcHJpbnRmKCIlLTE1cyAiLCByZWZuYW1lKTsKKworCQlidWYgPSByZWFkX3NoYTFfZmlsZShzaGExLCAmdHlwZSwgJnNpemUpOworCQlpZiAoIWJ1ZiB8fCAhc2l6ZSkKKwkJCXJldHVybiAwOworCisJCS8qIHNraXAgaGVhZGVyICovCisJCXNwID0gc3Ryc3RyKGJ1ZiwgIlxuXG4iKTsKKwkJaWYgKCFzcCkgeworCQkJZnJlZShidWYpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyogb25seSB0YWtlIHVwIHRvICJsaW5lcyIgbGluZXMsIGFuZCBzdHJpcCB0aGUgc2lnbmF0dXJlICovCisJCWZvciAoaSA9IDAsIHNwICs9IDI7CisJCQkJaSA8IGZpbHRlci0+bGluZXMgJiYgc3AgPCBidWYgKyBzaXplICYmCisJCQkJcHJlZml4Y21wKHNwLCBQR1BfU0lHTkFUVVJFICJcbiIpOworCQkJCWkrKykgeworCQkJaWYgKGkpCisJCQkJcHJpbnRmKCJcbiAgICAiKTsKKwkJCWVvbCA9IG1lbWNocihzcCwgJ1xuJywgc2l6ZSAtIChzcCAtIGJ1ZikpOworCQkJbGVuID0gZW9sID8gZW9sIC0gc3AgOiBzaXplIC0gKHNwIC0gYnVmKTsKKwkJCWZ3cml0ZShzcCwgbGVuLCAxLCBzdGRvdXQpOworCQkJaWYgKCFlb2wpCisJCQkJYnJlYWs7CisJCQlzcCA9IGVvbCArIDE7CisJCX0KKwkJcHV0Y2hhcignXG4nKTsKKwkJZnJlZShidWYpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxpc3RfdGFncyhjb25zdCBjaGFyICpwYXR0ZXJuLCBpbnQgbGluZXMpCit7CisJc3RydWN0IHRhZ19maWx0ZXIgZmlsdGVyOworCisJaWYgKHBhdHRlcm4gPT0gTlVMTCkKKwkJcGF0dGVybiA9ICIqIjsKKworCWZpbHRlci5wYXR0ZXJuID0gcGF0dGVybjsKKwlmaWx0ZXIubGluZXMgPSBsaW5lczsKKworCWZvcl9lYWNoX3RhZ19yZWYoc2hvd19yZWZlcmVuY2UsICh2b2lkICopICZmaWx0ZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3R5cGVkZWYgaW50ICgqZWFjaF90YWdfbmFtZV9mbikoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcmVmLAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCitzdGF0aWMgaW50IGZvcl9lYWNoX3RhZ19uYW1lKGNvbnN0IGNoYXIgKiphcmd2LCBlYWNoX3RhZ19uYW1lX2ZuIGZuKQoreworCWNvbnN0IGNoYXIgKipwOworCWNoYXIgcmVmW1BBVEhfTUFYXTsKKwlpbnQgaGFkX2Vycm9yID0gMDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCisJZm9yIChwID0gYXJndjsgKnA7IHArKykgeworCQlpZiAoc25wcmludGYocmVmLCBzaXplb2YocmVmKSwgInJlZnMvdGFncy8lcyIsICpwKQorCQkJCQk+PSBzaXplb2YocmVmKSkgeworCQkJZXJyb3IoInRhZyBuYW1lIHRvbyBsb25nOiAlLipzLi4uIiwgNTAsICpwKTsKKwkJCWhhZF9lcnJvciA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXJlc29sdmVfcmVmKHJlZiwgc2hhMSwgMSwgTlVMTCkpIHsKKwkJCWVycm9yKCJ0YWcgJyVzJyBub3QgZm91bmQuIiwgKnApOworCQkJaGFkX2Vycm9yID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChmbigqcCwgcmVmLCBzaGExKSkKKwkJCWhhZF9lcnJvciA9IDE7CisJfQorCXJldHVybiBoYWRfZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgZGVsZXRlX3RhZyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpyZWYsCisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpZiAoZGVsZXRlX3JlZihyZWYsIHNoYTEpKQorCQlyZXR1cm4gMTsKKwlwcmludGYoIkRlbGV0ZWQgdGFnICclcydcbiIsIG5hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZlcmlmeV90YWcoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcmVmLAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJY29uc3QgY2hhciAqYXJndl92ZXJpZnlfdGFnW10gPSB7ImdpdC12ZXJpZnktdGFnIiwKKwkJCQkJIi12IiwgIlNIQTFfSEVYIiwgTlVMTH07CisJYXJndl92ZXJpZnlfdGFnWzJdID0gc2hhMV90b19oZXgoc2hhMSk7CisKKwlpZiAocnVuX2NvbW1hbmRfdl9vcHQoYXJndl92ZXJpZnlfdGFnLCAwKSkKKwkJcmV0dXJuIGVycm9yKCJjb3VsZCBub3QgdmVyaWZ5IHRoZSB0YWcgJyVzJyIsIG5hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX3NpZ24oc3RydWN0IHN0cmJ1ZiAqYnVmZmVyKQoreworCXN0cnVjdCBjaGlsZF9wcm9jZXNzIGdwZzsKKwljb25zdCBjaGFyICphcmdzWzRdOworCWNoYXIgKmJyYWNrZXQ7CisJaW50IGxlbjsKKworCWlmICghKnNpZ25pbmdrZXkpIHsKKwkJaWYgKHN0cmxjcHkoc2lnbmluZ2tleSwgZ2l0X2NvbW1pdHRlcl9pbmZvKElERU5UX0VSUk9SX09OX05PX05BTUUpLAorCQkJCXNpemVvZihzaWduaW5na2V5KSkgPiBzaXplb2Yoc2lnbmluZ2tleSkgLSAxKQorCQkJcmV0dXJuIGVycm9yKCJjb21taXR0ZXIgaW5mbyB0b28gbG9uZy4iKTsKKwkJYnJhY2tldCA9IHN0cmNocihzaWduaW5na2V5LCAnPicpOworCQlpZiAoYnJhY2tldCkKKwkJCWJyYWNrZXRbMV0gPSAnXDAnOworCX0KKworCS8qIFdoZW4gdGhlIHVzZXJuYW1lIHNpZ25pbmdrZXkgaXMgYmFkLCBwcm9ncmFtIGNvdWxkIGJlIHRlcm1pbmF0ZWQKKwkgKiBiZWNhdXNlIGdwZyBleGl0cyB3aXRob3V0IHJlYWRpbmcgYW5kIHRoZW4gd3JpdGUgZ2V0cyBTSUdQSVBFLiAqLworCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKworCW1lbXNldCgmZ3BnLCAwLCBzaXplb2YoZ3BnKSk7CisJZ3BnLmFyZ3YgPSBhcmdzOworCWdwZy5pbiA9IC0xOworCWdwZy5vdXQgPSAtMTsKKwlhcmdzWzBdID0gImdwZyI7CisJYXJnc1sxXSA9ICItYnNhdSI7CisJYXJnc1syXSA9IHNpZ25pbmdrZXk7CisJYXJnc1szXSA9IE5VTEw7CisKKwlpZiAoc3RhcnRfY29tbWFuZCgmZ3BnKSkKKwkJcmV0dXJuIGVycm9yKCJjb3VsZCBub3QgcnVuIGdwZy4iKTsKKworCWlmICh3cml0ZV9pbl9mdWxsKGdwZy5pbiwgYnVmZmVyLT5idWYsIGJ1ZmZlci0+bGVuKSAhPSBidWZmZXItPmxlbikgeworCQljbG9zZShncGcuaW4pOworCQljbG9zZShncGcub3V0KTsKKwkJZmluaXNoX2NvbW1hbmQoJmdwZyk7CisJCXJldHVybiBlcnJvcigiZ3BnIGRpZCBub3QgYWNjZXB0IHRoZSB0YWcgZGF0YSIpOworCX0KKwljbG9zZShncGcuaW4pOworCWxlbiA9IHN0cmJ1Zl9yZWFkKGJ1ZmZlciwgZ3BnLm91dCwgMTAyNCk7CisJY2xvc2UoZ3BnLm91dCk7CisKKwlpZiAoZmluaXNoX2NvbW1hbmQoJmdwZykgfHwgIWxlbiB8fCBsZW4gPCAwKQorCQlyZXR1cm4gZXJyb3IoImdwZyBmYWlsZWQgdG8gc2lnbiB0aGUgdGFnIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgdGFnX3RlbXBsYXRlW10gPQorCSJcbiIKKwkiI1xuIgorCSIjIFdyaXRlIGEgdGFnIG1lc3NhZ2VcbiIKKwkiI1xuIjsKKworc3RhdGljIHZvaWQgc2V0X3NpZ25pbmdrZXkoY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKHN0cmxjcHkoc2lnbmluZ2tleSwgdmFsdWUsIHNpemVvZihzaWduaW5na2V5KSkgPj0gc2l6ZW9mKHNpZ25pbmdrZXkpKQorCQlkaWUoInNpZ25pbmcga2V5IHZhbHVlIHRvbyBsb25nICglLjEwcy4uLikiLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgZ2l0X3RhZ19jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXN0cmNtcCh2YXIsICJ1c2VyLnNpZ25pbmdrZXkiKSkgeworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIGNvbmZpZ19lcnJvcl9ub25ib29sKHZhbHVlKTsKKwkJc2V0X3NpZ25pbmdrZXkodmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gZ2l0X2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV90YWdfYm9keShpbnQgZmQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwljaGFyICpidWYsICpzcCwgKmVvYjsKKwlzaXplX3QgbGVuOworCisJYnVmID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgJnR5cGUsICZzaXplKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCS8qIHNraXAgaGVhZGVyICovCisJc3AgPSBzdHJzdHIoYnVmLCAiXG5cbiIpOworCisJaWYgKCFzcCB8fCAhc2l6ZSB8fCB0eXBlICE9IE9CSl9UQUcpIHsKKwkJZnJlZShidWYpOworCQlyZXR1cm47CisJfQorCXNwICs9IDI7IC8qIHNraXAgdGhlIDIgTEZzICovCisJZW9iID0gc3Ryc3RyKHNwLCAiXG4iIFBHUF9TSUdOQVRVUkUgIlxuIik7CisJaWYgKGVvYikKKwkJbGVuID0gZW9iIC0gc3A7CisJZWxzZQorCQlsZW4gPSBidWYgKyBzaXplIC0gc3A7CisJd3JpdGVfb3JfZGllKGZkLCBzcCwgbGVuKTsKKworCWZyZWUoYnVmKTsKK30KKworc3RhdGljIHZvaWQgY3JlYXRlX3RhZyhjb25zdCB1bnNpZ25lZCBjaGFyICpvYmplY3QsIGNvbnN0IGNoYXIgKnRhZywKKwkJICAgICAgIHN0cnVjdCBzdHJidWYgKmJ1ZiwgaW50IG1lc3NhZ2UsIGludCBzaWduLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqcHJldiwgdW5zaWduZWQgY2hhciAqcmVzdWx0KQoreworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwljaGFyIGhlYWRlcl9idWZbMTAyNF07CisJaW50IGhlYWRlcl9sZW47CisKKwl0eXBlID0gc2hhMV9vYmplY3RfaW5mbyhvYmplY3QsIE5VTEwpOworCWlmICh0eXBlIDw9IE9CSl9OT05FKQorCSAgICBkaWUoImJhZCBvYmplY3QgdHlwZS4iKTsKKworCWhlYWRlcl9sZW4gPSBzbnByaW50ZihoZWFkZXJfYnVmLCBzaXplb2YoaGVhZGVyX2J1ZiksCisJCQkgICJvYmplY3QgJXNcbiIKKwkJCSAgInR5cGUgJXNcbiIKKwkJCSAgInRhZyAlc1xuIgorCQkJICAidGFnZ2VyICVzXG5cbiIsCisJCQkgIHNoYTFfdG9faGV4KG9iamVjdCksCisJCQkgIHR5cGVuYW1lKHR5cGUpLAorCQkJICB0YWcsCisJCQkgIGdpdF9jb21taXR0ZXJfaW5mbyhJREVOVF9FUlJPUl9PTl9OT19OQU1FKSk7CisKKwlpZiAoaGVhZGVyX2xlbiA+IHNpemVvZihoZWFkZXJfYnVmKSAtIDEpCisJCWRpZSgidGFnIGhlYWRlciB0b28gYmlnLiIpOworCisJaWYgKCFtZXNzYWdlKSB7CisJCWNoYXIgKnBhdGg7CisJCWludCBmZDsKKworCQkvKiB3cml0ZSB0aGUgdGVtcGxhdGUgbWVzc2FnZSBiZWZvcmUgZWRpdGluZzogKi8KKwkJcGF0aCA9IHhzdHJkdXAoZ2l0X3BhdGgoIlRBR19FRElUTVNHIikpOworCQlmZCA9IG9wZW4ocGF0aCwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX1dST05MWSwgMDYwMCk7CisJCWlmIChmZCA8IDApCisJCQlkaWUoImNvdWxkIG5vdCBjcmVhdGUgZmlsZSAnJXMnOiAlcyIsCisJCQkJCQlwYXRoLCBzdHJlcnJvcihlcnJubykpOworCisJCWlmICghaXNfbnVsbF9zaGExKHByZXYpKQorCQkJd3JpdGVfdGFnX2JvZHkoZmQsIHByZXYpOworCQllbHNlCisJCQl3cml0ZV9vcl9kaWUoZmQsIHRhZ190ZW1wbGF0ZSwgc3RybGVuKHRhZ190ZW1wbGF0ZSkpOworCQljbG9zZShmZCk7CisKKwkJbGF1bmNoX2VkaXRvcihwYXRoLCBidWYsIE5VTEwpOworCisJCXVubGluayhwYXRoKTsKKwkJZnJlZShwYXRoKTsKKwl9CisKKwlzdHJpcHNwYWNlKGJ1ZiwgMSk7CisKKwlpZiAoIW1lc3NhZ2UgJiYgIWJ1Zi0+bGVuKQorCQlkaWUoIm5vIHRhZyBtZXNzYWdlPyIpOworCisJc3RyYnVmX2luc2VydChidWYsIDAsIGhlYWRlcl9idWYsIGhlYWRlcl9sZW4pOworCisJaWYgKHNpZ24gJiYgZG9fc2lnbihidWYpIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gc2lnbiB0aGUgdGFnIik7CisJaWYgKHdyaXRlX3NoYTFfZmlsZShidWYtPmJ1ZiwgYnVmLT5sZW4sIHRhZ190eXBlLCByZXN1bHQpIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gd3JpdGUgdGFnIGZpbGUiKTsKK30KKworc3RydWN0IG1zZ19hcmcgeworCWludCBnaXZlbjsKKwlzdHJ1Y3Qgc3RyYnVmIGJ1ZjsKK307CisKK3N0YXRpYyBpbnQgcGFyc2VfbXNnX2FyZyhjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHQsIGNvbnN0IGNoYXIgKmFyZywgaW50IHVuc2V0KQoreworCXN0cnVjdCBtc2dfYXJnICptc2cgPSBvcHQtPnZhbHVlOworCisJaWYgKCFhcmcpCisJCXJldHVybiAtMTsKKwlpZiAobXNnLT5idWYubGVuKQorCQlzdHJidWZfYWRkc3RyKCYobXNnLT5idWYpLCAiXG5cbiIpOworCXN0cmJ1Zl9hZGRzdHIoJihtc2ctPmJ1ZiksIGFyZyk7CisJbXNnLT5naXZlbiA9IDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjbWRfdGFnKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXN0cnVjdCBzdHJidWYgYnVmOworCXVuc2lnbmVkIGNoYXIgb2JqZWN0WzIwXSwgcHJldlsyMF07CisJY2hhciByZWZbUEFUSF9NQVhdOworCWNvbnN0IGNoYXIgKm9iamVjdF9yZWYsICp0YWc7CisJc3RydWN0IHJlZl9sb2NrICpsb2NrOworCisJaW50IGFubm90YXRlID0gMCwgc2lnbiA9IDAsIGZvcmNlID0gMCwgbGluZXMgPSAwLAorCQlsaXN0ID0gMCwgZGVsZXRlID0gMCwgdmVyaWZ5ID0gMDsKKwljaGFyICptc2dmaWxlID0gTlVMTCwgKmtleWlkID0gTlVMTDsKKwlzdHJ1Y3QgbXNnX2FyZyBtc2cgPSB7IDAsIFNUUkJVRl9JTklUIH07CisJc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisJCU9QVF9CT09MRUFOKCdsJywgTlVMTCwgJmxpc3QsICJsaXN0IHRhZyBuYW1lcyIpLAorCQl7IE9QVElPTl9JTlRFR0VSLCAnbicsIE5VTEwsICZsaW5lcywgTlVMTCwKKwkJCQkicHJpbnQgbiBsaW5lcyBvZiBlYWNoIHRhZyBtZXNzYWdlIiwKKwkJCQlQQVJTRV9PUFRfT1BUQVJHLCBOVUxMLCAxIH0sCisJCU9QVF9CT09MRUFOKCdkJywgTlVMTCwgJmRlbGV0ZSwgImRlbGV0ZSB0YWdzIiksCisJCU9QVF9CT09MRUFOKCd2JywgTlVMTCwgJnZlcmlmeSwgInZlcmlmeSB0YWdzIiksCisKKwkJT1BUX0dST1VQKCJUYWcgY3JlYXRpb24gb3B0aW9ucyIpLAorCQlPUFRfQk9PTEVBTignYScsIE5VTEwsICZhbm5vdGF0ZSwKKwkJCQkJImFubm90YXRlZCB0YWcsIG5lZWRzIGEgbWVzc2FnZSIpLAorCQlPUFRfQ0FMTEJBQ0soJ20nLCBOVUxMLCAmbXNnLCAibXNnIiwKKwkJCSAgICAgIm1lc3NhZ2UgZm9yIHRoZSB0YWciLCBwYXJzZV9tc2dfYXJnKSwKKwkJT1BUX1NUUklORygnRicsIE5VTEwsICZtc2dmaWxlLCAiZmlsZSIsICJtZXNzYWdlIGluIGEgZmlsZSIpLAorCQlPUFRfQk9PTEVBTigncycsIE5VTEwsICZzaWduLCAiYW5ub3RhdGVkIGFuZCBHUEctc2lnbmVkIHRhZyIpLAorCQlPUFRfU1RSSU5HKCd1JywgTlVMTCwgJmtleWlkLCAia2V5LWlkIiwKKwkJCQkJInVzZSBhbm90aGVyIGtleSB0byBzaWduIHRoZSB0YWciKSwKKwkJT1BUX0JPT0xFQU4oJ2YnLCBOVUxMLCAmZm9yY2UsICJyZXBsYWNlIHRoZSB0YWcgaWYgZXhpc3RzIiksCisJCU9QVF9FTkQoKQorCX07CisKKwlnaXRfY29uZmlnKGdpdF90YWdfY29uZmlnKTsKKworCWFyZ2MgPSBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIG9wdGlvbnMsIGdpdF90YWdfdXNhZ2UsIDApOworCisJaWYgKGtleWlkKSB7CisJCXNpZ24gPSAxOworCQlzZXRfc2lnbmluZ2tleShrZXlpZCk7CisJfQorCWlmIChzaWduKQorCQlhbm5vdGF0ZSA9IDE7CisKKwlpZiAobGlzdCkKKwkJcmV0dXJuIGxpc3RfdGFncyhhcmd2WzBdLCBsaW5lcyk7CisJaWYgKGRlbGV0ZSkKKwkJcmV0dXJuIGZvcl9lYWNoX3RhZ19uYW1lKGFyZ3YsIGRlbGV0ZV90YWcpOworCWlmICh2ZXJpZnkpCisJCXJldHVybiBmb3JfZWFjaF90YWdfbmFtZShhcmd2LCB2ZXJpZnlfdGFnKTsKKworCXN0cmJ1Zl9pbml0KCZidWYsIDApOworCWlmIChtc2cuZ2l2ZW4gfHwgbXNnZmlsZSkgeworCQlpZiAobXNnLmdpdmVuICYmIG1zZ2ZpbGUpCisJCQlkaWUoIm9ubHkgb25lIC1GIG9yIC1tIG9wdGlvbiBpcyBhbGxvd2VkLiIpOworCQlhbm5vdGF0ZSA9IDE7CisJCWlmIChtc2cuZ2l2ZW4pCisJCQlzdHJidWZfYWRkYnVmKCZidWYsICYobXNnLmJ1ZikpOworCQllbHNlIHsKKwkJCWlmICghc3RyY21wKG1zZ2ZpbGUsICItIikpIHsKKwkJCQlpZiAoc3RyYnVmX3JlYWQoJmJ1ZiwgMCwgMTAyNCkgPCAwKQorCQkJCQlkaWUoImNhbm5vdCByZWFkICVzIiwgbXNnZmlsZSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChzdHJidWZfcmVhZF9maWxlKCZidWYsIG1zZ2ZpbGUsIDEwMjQpIDwgMCkKKwkJCQkJZGllKCJjb3VsZCBub3Qgb3BlbiBvciByZWFkICclcyc6ICVzIiwKKwkJCQkJCW1zZ2ZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoYXJnYyA9PSAwKSB7CisJCWlmIChhbm5vdGF0ZSkKKwkJCXVzYWdlX3dpdGhfb3B0aW9ucyhnaXRfdGFnX3VzYWdlLCBvcHRpb25zKTsKKwkJcmV0dXJuIGxpc3RfdGFncyhOVUxMLCBsaW5lcyk7CisJfQorCXRhZyA9IGFyZ3ZbMF07CisKKwlvYmplY3RfcmVmID0gYXJnYyA9PSAyID8gYXJndlsxXSA6ICJIRUFEIjsKKwlpZiAoYXJnYyA+IDIpCisJCWRpZSgidG9vIG1hbnkgcGFyYW1zIik7CisKKwlpZiAoZ2V0X3NoYTEob2JqZWN0X3JlZiwgb2JqZWN0KSkKKwkJZGllKCJGYWlsZWQgdG8gcmVzb2x2ZSAnJXMnIGFzIGEgdmFsaWQgcmVmLiIsIG9iamVjdF9yZWYpOworCisJaWYgKHNucHJpbnRmKHJlZiwgc2l6ZW9mKHJlZiksICJyZWZzL3RhZ3MvJXMiLCB0YWcpID4gc2l6ZW9mKHJlZikgLSAxKQorCQlkaWUoInRhZyBuYW1lIHRvbyBsb25nOiAlLipzLi4uIiwgNTAsIHRhZyk7CisJaWYgKGNoZWNrX3JlZl9mb3JtYXQocmVmKSkKKwkJZGllKCInJXMnIGlzIG5vdCBhIHZhbGlkIHRhZyBuYW1lLiIsIHRhZyk7CisKKwlpZiAoIXJlc29sdmVfcmVmKHJlZiwgcHJldiwgMSwgTlVMTCkpCisJCWhhc2hjbHIocHJldik7CisJZWxzZSBpZiAoIWZvcmNlKQorCQlkaWUoInRhZyAnJXMnIGFscmVhZHkgZXhpc3RzIiwgdGFnKTsKKworCWlmIChhbm5vdGF0ZSkKKwkJY3JlYXRlX3RhZyhvYmplY3QsIHRhZywgJmJ1ZiwgbXNnLmdpdmVuIHx8IG1zZ2ZpbGUsCisJCQkgICBzaWduLCBwcmV2LCBvYmplY3QpOworCisJbG9jayA9IGxvY2tfYW55X3JlZl9mb3JfdXBkYXRlKHJlZiwgcHJldiwgMCk7CisJaWYgKCFsb2NrKQorCQlkaWUoIiVzOiBjYW5ub3QgbG9jayB0aGUgcmVmIiwgcmVmKTsKKwlpZiAod3JpdGVfcmVmX3NoYTEobG9jaywgb2JqZWN0LCBOVUxMKSA8IDApCisJCWRpZSgiJXM6IGNhbm5vdCB1cGRhdGUgdGhlIHJlZiIsIHJlZik7CisKKwlzdHJidWZfcmVsZWFzZSgmYnVmKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tdGFyLXRyZWUuYyBiL2J1aWx0aW4tdGFyLXRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDQ3MTllCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi10YXItdHJlZS5jCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgUmVuZSBTY2hhcmZlCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRhci5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorCitzdGF0aWMgY29uc3QgY2hhciB0YXJfdHJlZV91c2FnZVtdID0KKyJnaXQtdGFyLXRyZWUgWy0tcmVtb3RlPTxyZXBvPl0gPHRyZWUtaXNoPiBbYmFzZWRpcl1cbiIKKyIqKiogTm90ZSB0aGF0IHRoaXMgY29tbWFuZCBpcyBub3cgZGVwcmVjYXRlZDsgdXNlIGdpdC1hcmNoaXZlIGluc3RlYWQuIjsKKworaW50IGNtZF90YXJfdHJlZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwkvKgorCSAqIGdpdC10YXItdHJlZSBpcyBub3cgYSB3cmFwcGVyIGFyb3VuZCBnaXQtYXJjaGl2ZSAtLWZvcm1hdD10YXIKKwkgKgorCSAqICQwIC0tcmVtb3RlPTxyZXBvPiBhcmcuLi4gPT0+CisJICoJZ2l0LWFyY2hpdmUgLS1mb3JtYXQ9dGFyIC0tcmVtb3RlPTxyZXBvPiBhcmcuLi4KKwkgKiAkMCB0cmVlLWlzaCA9PT4KKwkgKglnaXQtYXJjaGl2ZSAtLWZvcm1hdD10YXIgdHJlZS1pc2gKKwkgKiAkMCB0cmVlLWlzaCBiYXNlZGlyID09PgorCSAqIAlnaXQtYXJjaGl2ZSAtLWZvcm1hdC10YXIgLS1wcmVmaXg9YmFzZWRpciB0cmVlLWlzaAorCSAqLworCWludCBpOworCWNvbnN0IGNoYXIgKipuYXJndiA9IHhjYWxsb2Moc2l6ZW9mKCpuYXJndiksIGFyZ2MgKyAyKTsKKwljaGFyICpiYXNlZGlyX2FyZzsKKwlpbnQgbmFyZ2MgPSAwOworCisJbmFyZ3ZbbmFyZ2MrK10gPSAiZ2l0LWFyY2hpdmUiOworCW5hcmd2W25hcmdjKytdID0gIi0tZm9ybWF0PXRhciI7CisKKwlpZiAoMiA8PSBhcmdjICYmICFwcmVmaXhjbXAoYXJndlsxXSwgIi0tcmVtb3RlPSIpKSB7CisJCW5hcmd2W25hcmdjKytdID0gYXJndlsxXTsKKwkJYXJndisrOworCQlhcmdjLS07CisJfQorCXN3aXRjaCAoYXJnYykgeworCWRlZmF1bHQ6CisJCXVzYWdlKHRhcl90cmVlX3VzYWdlKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQkvKiBiYXNlLXBhdGggKi8KKwkJYmFzZWRpcl9hcmcgPSB4bWFsbG9jKHN0cmxlbihhcmd2WzJdKSArIDExKTsKKwkJc3ByaW50ZihiYXNlZGlyX2FyZywgIi0tcHJlZml4PSVzLyIsIGFyZ3ZbMl0pOworCQluYXJndltuYXJnYysrXSA9IGJhc2VkaXJfYXJnOworCQkvKiBmYWxsdGhydSAqLworCWNhc2UgMjoKKwkJLyogdHJlZS1pc2ggKi8KKwkJbmFyZ3ZbbmFyZ2MrK10gPSBhcmd2WzFdOworCX0KKwluYXJndltuYXJnY10gPSBOVUxMOworCisJZnByaW50ZihzdGRlcnIsCisJCSIqKiogZ2l0LXRhci10cmVlIGlzIG5vdyBkZXByZWNhdGVkLlxuIgorCQkiKioqIFJ1bm5pbmcgZ2l0LWFyY2hpdmUgaW5zdGVhZC5cbioqKiIpOworCWZvciAoaSA9IDA7IGkgPCBuYXJnYzsgaSsrKSB7CisJCWZwdXRjKCcgJywgc3RkZXJyKTsKKwkJc3FfcXVvdGVfcHJpbnQoc3RkZXJyLCBuYXJndltpXSk7CisJfQorCWZwdXRjKCdcbicsIHN0ZGVycik7CisJcmV0dXJuIGNtZF9hcmNoaXZlKG5hcmdjLCBuYXJndiwgcHJlZml4KTsKK30KKworLyogdXN0YXIgaGVhZGVyICsgZXh0ZW5kZWQgZ2xvYmFsIGhlYWRlciBjb250ZW50ICovCisjZGVmaW5lIFJFQ09SRFNJWkUJKDUxMikKKyNkZWZpbmUgSEVBREVSU0laRSAoMiAqIFJFQ09SRFNJWkUpCisKK2ludCBjbWRfZ2V0X3Rhcl9jb21taXRfaWQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJY2hhciBidWZmZXJbSEVBREVSU0laRV07CisJc3RydWN0IHVzdGFyX2hlYWRlciAqaGVhZGVyID0gKHN0cnVjdCB1c3Rhcl9oZWFkZXIgKilidWZmZXI7CisJY2hhciAqY29udGVudCA9IGJ1ZmZlciArIFJFQ09SRFNJWkU7CisJc3NpemVfdCBuOworCisJbiA9IHJlYWRfaW5fZnVsbCgwLCBidWZmZXIsIEhFQURFUlNJWkUpOworCWlmIChuIDwgSEVBREVSU0laRSkKKwkJZGllKCJnaXQtZ2V0LXRhci1jb21taXQtaWQ6IHJlYWQgZXJyb3IiKTsKKwlpZiAoaGVhZGVyLT50eXBlZmxhZ1swXSAhPSAnZycpCisJCXJldHVybiAxOworCWlmIChtZW1jbXAoY29udGVudCwgIjUyIGNvbW1lbnQ9IiwgMTEpKQorCQlyZXR1cm4gMTsKKworCW4gPSB3cml0ZV9pbl9mdWxsKDEsIGNvbnRlbnQgKyAxMSwgNDEpOworCWlmIChuIDwgNDEpCisJCWRpZSgiZ2l0LWdldC10YXItY29tbWl0LWlkOiB3cml0ZSBlcnJvciIpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXVucGFjay1vYmplY3RzLmMgYi9idWlsdGluLXVucGFjay1vYmplY3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBlMDdmYQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tdW5wYWNrLW9iamVjdHMuYwpAQCAtMCwwICsxLDQyNSBAQAorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgImRlbHRhLmgiCisjaW5jbHVkZSAicGFjay5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAicHJvZ3Jlc3MuaCIKKyNpbmNsdWRlICJkZWNvcmF0ZS5oIgorCitzdGF0aWMgaW50IGRyeV9ydW4sIHF1aWV0LCByZWNvdmVyLCBoYXNfZXJyb3JzOworc3RhdGljIGNvbnN0IGNoYXIgdW5wYWNrX3VzYWdlW10gPSAiZ2l0LXVucGFjay1vYmplY3RzIFstbl0gWy1xXSBbLXJdIDwgcGFjay1maWxlIjsKKworLyogV2UgYWx3YXlzIHJlYWQgaW4gNGtCIGNodW5rcy4gKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZmZlcls0MDk2XTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBsZW47CitzdGF0aWMgb2ZmX3QgY29uc3VtZWRfYnl0ZXM7CitzdGF0aWMgU0hBX0NUWCBjdHg7CisKK3N0cnVjdCBvYmpfYnVmZmVyIHsKKwljaGFyICpidWZmZXI7CisJdW5zaWduZWQgbG9uZyBzaXplOworfTsKKworc3RhdGljIHN0cnVjdCBkZWNvcmF0aW9uIG9ial9kZWNvcmF0ZTsKKworc3RhdGljIHN0cnVjdCBvYmpfYnVmZmVyICpsb29rdXBfb2JqZWN0X2J1ZmZlcihzdHJ1Y3Qgb2JqZWN0ICpiYXNlKQoreworCXJldHVybiBsb29rdXBfZGVjb3JhdGlvbigmb2JqX2RlY29yYXRlLCBiYXNlKTsKK30KKworLyoKKyAqIE1ha2Ugc3VyZSBhdCBsZWFzdCAibWluIiBieXRlcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBidWZmZXIsIGFuZAorICogcmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZSBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkICpmaWxsKGludCBtaW4pCit7CisJaWYgKG1pbiA8PSBsZW4pCisJCXJldHVybiBidWZmZXIgKyBvZmZzZXQ7CisJaWYgKG1pbiA+IHNpemVvZihidWZmZXIpKQorCQlkaWUoImNhbm5vdCBmaWxsICVkIGJ5dGVzIiwgbWluKTsKKwlpZiAob2Zmc2V0KSB7CisJCVNIQTFfVXBkYXRlKCZjdHgsIGJ1ZmZlciwgb2Zmc2V0KTsKKwkJbWVtbW92ZShidWZmZXIsIGJ1ZmZlciArIG9mZnNldCwgbGVuKTsKKwkJb2Zmc2V0ID0gMDsKKwl9CisJZG8geworCQlzc2l6ZV90IHJldCA9IHhyZWFkKDAsIGJ1ZmZlciArIGxlbiwgc2l6ZW9mKGJ1ZmZlcikgLSBsZW4pOworCQlpZiAocmV0IDw9IDApIHsKKwkJCWlmICghcmV0KQorCQkJCWRpZSgiZWFybHkgRU9GIik7CisJCQlkaWUoInJlYWQgZXJyb3Igb24gaW5wdXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCQlsZW4gKz0gcmV0OworCX0gd2hpbGUgKGxlbiA8IG1pbik7CisJcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RhdGljIHZvaWQgdXNlKGludCBieXRlcykKK3sKKwlpZiAoYnl0ZXMgPiBsZW4pCisJCWRpZSgidXNlZCBtb3JlIGJ5dGVzIHRoYW4gd2VyZSBhdmFpbGFibGUiKTsKKwlsZW4gLT0gYnl0ZXM7CisJb2Zmc2V0ICs9IGJ5dGVzOworCisJLyogbWFrZSBzdXJlIG9mZl90IGlzIHN1ZmZpY2llbnRseSBsYXJnZSBub3QgdG8gd3JhcCAqLworCWlmIChjb25zdW1lZF9ieXRlcyA+IGNvbnN1bWVkX2J5dGVzICsgYnl0ZXMpCisJCWRpZSgicGFjayB0b28gbGFyZ2UgZm9yIGN1cnJlbnQgZGVmaW5pdGlvbiBvZiBvZmZfdCIpOworCWNvbnN1bWVkX2J5dGVzICs9IGJ5dGVzOworfQorCitzdGF0aWMgdm9pZCAqZ2V0X2RhdGEodW5zaWduZWQgbG9uZyBzaXplKQoreworCXpfc3RyZWFtIHN0cmVhbTsKKwl2b2lkICpidWYgPSB4bWFsbG9jKHNpemUpOworCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKworCXN0cmVhbS5uZXh0X291dCA9IGJ1ZjsKKwlzdHJlYW0uYXZhaWxfb3V0ID0gc2l6ZTsKKwlzdHJlYW0ubmV4dF9pbiA9IGZpbGwoMSk7CisJc3RyZWFtLmF2YWlsX2luID0gbGVuOworCWluZmxhdGVJbml0KCZzdHJlYW0pOworCisJZm9yICg7OykgeworCQlpbnQgcmV0ID0gaW5mbGF0ZSgmc3RyZWFtLCAwKTsKKwkJdXNlKGxlbiAtIHN0cmVhbS5hdmFpbF9pbik7CisJCWlmIChzdHJlYW0udG90YWxfb3V0ID09IHNpemUgJiYgcmV0ID09IFpfU1RSRUFNX0VORCkKKwkJCWJyZWFrOworCQlpZiAocmV0ICE9IFpfT0spIHsKKwkJCWVycm9yKCJpbmZsYXRlIHJldHVybmVkICVkXG4iLCByZXQpOworCQkJZnJlZShidWYpOworCQkJYnVmID0gTlVMTDsKKwkJCWlmICghcmVjb3ZlcikKKwkJCQlleGl0KDEpOworCQkJaGFzX2Vycm9ycyA9IDE7CisJCQlicmVhazsKKwkJfQorCQlzdHJlYW0ubmV4dF9pbiA9IGZpbGwoMSk7CisJCXN0cmVhbS5hdmFpbF9pbiA9IGxlbjsKKwl9CisJaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKwlyZXR1cm4gYnVmOworfQorCitzdHJ1Y3QgZGVsdGFfaW5mbyB7CisJdW5zaWduZWQgY2hhciBiYXNlX3NoYTFbMjBdOworCXVuc2lnbmVkIG5yOworCW9mZl90IGJhc2Vfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl2b2lkICpkZWx0YTsKKwlzdHJ1Y3QgZGVsdGFfaW5mbyAqbmV4dDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVsdGFfaW5mbyAqZGVsdGFfbGlzdDsKKworc3RhdGljIHZvaWQgYWRkX2RlbHRhX3RvX2xpc3QodW5zaWduZWQgbnIsIHVuc2lnbmVkIGNvbnN0IGNoYXIgKmJhc2Vfc2hhMSwKKwkJCSAgICAgIG9mZl90IGJhc2Vfb2Zmc2V0LAorCQkJICAgICAgdm9pZCAqZGVsdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3QgZGVsdGFfaW5mbyAqaW5mbyA9IHhtYWxsb2Moc2l6ZW9mKCppbmZvKSk7CisKKwloYXNoY3B5KGluZm8tPmJhc2Vfc2hhMSwgYmFzZV9zaGExKTsKKwlpbmZvLT5iYXNlX29mZnNldCA9IGJhc2Vfb2Zmc2V0OworCWluZm8tPnNpemUgPSBzaXplOworCWluZm8tPmRlbHRhID0gZGVsdGE7CisJaW5mby0+bnIgPSBucjsKKwlpbmZvLT5uZXh0ID0gZGVsdGFfbGlzdDsKKwlkZWx0YV9saXN0ID0gaW5mbzsKK30KKworc3RydWN0IG9ial9pbmZvIHsKKwlvZmZfdCBvZmZzZXQ7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqX2luZm8gKm9ial9saXN0OworCitzdGF0aWMgdm9pZCBhZGRlZF9vYmplY3QodW5zaWduZWQgbnIsIGVudW0gb2JqZWN0X3R5cGUgdHlwZSwKKwkJCSB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUpOworCitzdGF0aWMgdm9pZCB3cml0ZV9vYmplY3QodW5zaWduZWQgbnIsIGVudW0gb2JqZWN0X3R5cGUgdHlwZSwKKwkJCSB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpZiAod3JpdGVfc2hhMV9maWxlKGJ1Ziwgc2l6ZSwgdHlwZW5hbWUodHlwZSksIG9ial9saXN0W25yXS5zaGExKSA8IDApCisJCWRpZSgiZmFpbGVkIHRvIHdyaXRlIG9iamVjdCIpOworCWFkZGVkX29iamVjdChuciwgdHlwZSwgYnVmLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQgcmVzb2x2ZV9kZWx0YSh1bnNpZ25lZCBuciwgZW51bSBvYmplY3RfdHlwZSB0eXBlLAorCQkJICB2b2lkICpiYXNlLCB1bnNpZ25lZCBsb25nIGJhc2Vfc2l6ZSwKKwkJCSAgdm9pZCAqZGVsdGEsIHVuc2lnbmVkIGxvbmcgZGVsdGFfc2l6ZSkKK3sKKwl2b2lkICpyZXN1bHQ7CisJdW5zaWduZWQgbG9uZyByZXN1bHRfc2l6ZTsKKworCXJlc3VsdCA9IHBhdGNoX2RlbHRhKGJhc2UsIGJhc2Vfc2l6ZSwKKwkJCSAgICAgZGVsdGEsIGRlbHRhX3NpemUsCisJCQkgICAgICZyZXN1bHRfc2l6ZSk7CisJaWYgKCFyZXN1bHQpCisJCWRpZSgiZmFpbGVkIHRvIGFwcGx5IGRlbHRhIik7CisJZnJlZShkZWx0YSk7CisJd3JpdGVfb2JqZWN0KG5yLCB0eXBlLCByZXN1bHQsIHJlc3VsdF9zaXplKTsKKwlmcmVlKHJlc3VsdCk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZGVkX29iamVjdCh1bnNpZ25lZCBuciwgZW51bSBvYmplY3RfdHlwZSB0eXBlLAorCQkJIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3QgZGVsdGFfaW5mbyAqKnAgPSAmZGVsdGFfbGlzdDsKKwlzdHJ1Y3QgZGVsdGFfaW5mbyAqaW5mbzsKKworCXdoaWxlICgoaW5mbyA9ICpwKSAhPSBOVUxMKSB7CisJCWlmICghaGFzaGNtcChpbmZvLT5iYXNlX3NoYTEsIG9ial9saXN0W25yXS5zaGExKSB8fAorCQkgICAgaW5mby0+YmFzZV9vZmZzZXQgPT0gb2JqX2xpc3RbbnJdLm9mZnNldCkgeworCQkJKnAgPSBpbmZvLT5uZXh0OworCQkJcCA9ICZkZWx0YV9saXN0OworCQkJcmVzb2x2ZV9kZWx0YShpbmZvLT5uciwgdHlwZSwgZGF0YSwgc2l6ZSwKKwkJCQkgICAgICBpbmZvLT5kZWx0YSwgaW5mby0+c2l6ZSk7CisJCQlmcmVlKGluZm8pOworCQkJY29udGludWU7CisJCX0KKwkJcCA9ICZpbmZvLT5uZXh0OworCX0KK30KKworc3RhdGljIHZvaWQgdW5wYWNrX25vbl9kZWx0YV9lbnRyeShlbnVtIG9iamVjdF90eXBlIHR5cGUsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkgICB1bnNpZ25lZCBucikKK3sKKwl2b2lkICpidWYgPSBnZXRfZGF0YShzaXplKTsKKworCWlmICghZHJ5X3J1biAmJiBidWYpCisJCXdyaXRlX29iamVjdChuciwgdHlwZSwgYnVmLCBzaXplKTsKKwlmcmVlKGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIHVucGFja19kZWx0YV9lbnRyeShlbnVtIG9iamVjdF90eXBlIHR5cGUsIHVuc2lnbmVkIGxvbmcgZGVsdGFfc2l6ZSwKKwkJCSAgICAgICB1bnNpZ25lZCBucikKK3sKKwl2b2lkICpkZWx0YV9kYXRhLCAqYmFzZTsKKwl1bnNpZ25lZCBsb25nIGJhc2Vfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIGJhc2Vfc2hhMVsyMF07CisJc3RydWN0IG9iamVjdCAqb2JqOworCisJaWYgKHR5cGUgPT0gT0JKX1JFRl9ERUxUQSkgeworCQloYXNoY3B5KGJhc2Vfc2hhMSwgZmlsbCgyMCkpOworCQl1c2UoMjApOworCQlkZWx0YV9kYXRhID0gZ2V0X2RhdGEoZGVsdGFfc2l6ZSk7CisJCWlmIChkcnlfcnVuIHx8ICFkZWx0YV9kYXRhKSB7CisJCQlmcmVlKGRlbHRhX2RhdGEpOworCQkJcmV0dXJuOworCQl9CisJCWlmICghaGFzX3NoYTFfZmlsZShiYXNlX3NoYTEpKSB7CisJCQloYXNoY3B5KG9ial9saXN0W25yXS5zaGExLCBudWxsX3NoYTEpOworCQkJYWRkX2RlbHRhX3RvX2xpc3QobnIsIGJhc2Vfc2hhMSwgMCwgZGVsdGFfZGF0YSwgZGVsdGFfc2l6ZSk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQl1bnNpZ25lZCBiYXNlX2ZvdW5kID0gMDsKKwkJdW5zaWduZWQgY2hhciAqcGFjaywgYzsKKwkJb2ZmX3QgYmFzZV9vZmZzZXQ7CisJCXVuc2lnbmVkIGxvLCBtaWQsIGhpOworCisJCXBhY2sgPSBmaWxsKDEpOworCQljID0gKnBhY2s7CisJCXVzZSgxKTsKKwkJYmFzZV9vZmZzZXQgPSBjICYgMTI3OworCQl3aGlsZSAoYyAmIDEyOCkgeworCQkJYmFzZV9vZmZzZXQgKz0gMTsKKwkJCWlmICghYmFzZV9vZmZzZXQgfHwgTVNCKGJhc2Vfb2Zmc2V0LCA3KSkKKwkJCQlkaWUoIm9mZnNldCB2YWx1ZSBvdmVyZmxvdyBmb3IgZGVsdGEgYmFzZSBvYmplY3QiKTsKKwkJCXBhY2sgPSBmaWxsKDEpOworCQkJYyA9ICpwYWNrOworCQkJdXNlKDEpOworCQkJYmFzZV9vZmZzZXQgPSAoYmFzZV9vZmZzZXQgPDwgNykgKyAoYyAmIDEyNyk7CisJCX0KKwkJYmFzZV9vZmZzZXQgPSBvYmpfbGlzdFtucl0ub2Zmc2V0IC0gYmFzZV9vZmZzZXQ7CisKKwkJZGVsdGFfZGF0YSA9IGdldF9kYXRhKGRlbHRhX3NpemUpOworCQlpZiAoZHJ5X3J1biB8fCAhZGVsdGFfZGF0YSkgeworCQkJZnJlZShkZWx0YV9kYXRhKTsKKwkJCXJldHVybjsKKwkJfQorCQlsbyA9IDA7CisJCWhpID0gbnI7CisJCXdoaWxlIChsbyA8IGhpKSB7CisJCQltaWQgPSAobG8gKyBoaSkvMjsKKwkJCWlmIChiYXNlX29mZnNldCA8IG9ial9saXN0W21pZF0ub2Zmc2V0KSB7CisJCQkJaGkgPSBtaWQ7CisJCQl9IGVsc2UgaWYgKGJhc2Vfb2Zmc2V0ID4gb2JqX2xpc3RbbWlkXS5vZmZzZXQpIHsKKwkJCQlsbyA9IG1pZCArIDE7CisJCQl9IGVsc2UgeworCQkJCWhhc2hjcHkoYmFzZV9zaGExLCBvYmpfbGlzdFttaWRdLnNoYTEpOworCQkJCWJhc2VfZm91bmQgPSAhaXNfbnVsbF9zaGExKGJhc2Vfc2hhMSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCFiYXNlX2ZvdW5kKSB7CisJCQkvKiBUaGUgZGVsdGEgYmFzZSBvYmplY3QgaXMgaXRzZWxmIGEgZGVsdGEgdGhhdAorCQkJICAgaGFzIG5vdCBiZWVuCXJlc29sdmVkIHlldC4gKi8KKwkJCWhhc2hjcHkob2JqX2xpc3RbbnJdLnNoYTEsIG51bGxfc2hhMSk7CisJCQlhZGRfZGVsdGFfdG9fbGlzdChuciwgbnVsbF9zaGExLCBiYXNlX29mZnNldCwgZGVsdGFfZGF0YSwgZGVsdGFfc2l6ZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlvYmogPSBsb29rdXBfb2JqZWN0KGJhc2Vfc2hhMSk7CisJaWYgKG9iaikgeworCQlzdHJ1Y3Qgb2JqX2J1ZmZlciAqb2JqX2J1ZiA9IGxvb2t1cF9vYmplY3RfYnVmZmVyKG9iaik7CisJCWlmIChvYmpfYnVmKSB7CisJCQlyZXNvbHZlX2RlbHRhKG5yLCBvYmotPnR5cGUsIG9ial9idWYtPmJ1ZmZlciwgb2JqX2J1Zi0+c2l6ZSwgZGVsdGFfZGF0YSwgZGVsdGFfc2l6ZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwliYXNlID0gcmVhZF9zaGExX2ZpbGUoYmFzZV9zaGExLCAmdHlwZSwgJmJhc2Vfc2l6ZSk7CisJaWYgKCFiYXNlKSB7CisJCWVycm9yKCJmYWlsZWQgdG8gcmVhZCBkZWx0YS1wYWNrIGJhc2Ugb2JqZWN0ICVzIiwKKwkJICAgICAgc2hhMV90b19oZXgoYmFzZV9zaGExKSk7CisJCWlmICghcmVjb3ZlcikKKwkJCWV4aXQoMSk7CisJCWhhc19lcnJvcnMgPSAxOworCQlyZXR1cm47CisJfQorCXJlc29sdmVfZGVsdGEobnIsIHR5cGUsIGJhc2UsIGJhc2Vfc2l6ZSwgZGVsdGFfZGF0YSwgZGVsdGFfc2l6ZSk7CisJZnJlZShiYXNlKTsKK30KKworc3RhdGljIHZvaWQgdW5wYWNrX29uZSh1bnNpZ25lZCBucikKK3sKKwl1bnNpZ25lZCBzaGlmdDsKKwl1bnNpZ25lZCBjaGFyICpwYWNrLCBjOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisKKwlvYmpfbGlzdFtucl0ub2Zmc2V0ID0gY29uc3VtZWRfYnl0ZXM7CisKKwlwYWNrID0gZmlsbCgxKTsKKwljID0gKnBhY2s7CisJdXNlKDEpOworCXR5cGUgPSAoYyA+PiA0KSAmIDc7CisJc2l6ZSA9IChjICYgMTUpOworCXNoaWZ0ID0gNDsKKwl3aGlsZSAoYyAmIDB4ODApIHsKKwkJcGFjayA9IGZpbGwoMSk7CisJCWMgPSAqcGFjazsKKwkJdXNlKDEpOworCQlzaXplICs9IChjICYgMHg3ZikgPDwgc2hpZnQ7CisJCXNoaWZ0ICs9IDc7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBPQkpfQ09NTUlUOgorCWNhc2UgT0JKX1RSRUU6CisJY2FzZSBPQkpfQkxPQjoKKwljYXNlIE9CSl9UQUc6CisJCXVucGFja19ub25fZGVsdGFfZW50cnkodHlwZSwgc2l6ZSwgbnIpOworCQlyZXR1cm47CisJY2FzZSBPQkpfUkVGX0RFTFRBOgorCWNhc2UgT0JKX09GU19ERUxUQToKKwkJdW5wYWNrX2RlbHRhX2VudHJ5KHR5cGUsIHNpemUsIG5yKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWVycm9yKCJiYWQgb2JqZWN0IHR5cGUgJWQiLCB0eXBlKTsKKwkJaGFzX2Vycm9ycyA9IDE7CisJCWlmIChyZWNvdmVyKQorCQkJcmV0dXJuOworCQlleGl0KDEpOworCX0KK30KKworc3RhdGljIHZvaWQgdW5wYWNrX2FsbCh2b2lkKQoreworCWludCBpOworCXN0cnVjdCBwcm9ncmVzcyAqcHJvZ3Jlc3MgPSBOVUxMOworCXN0cnVjdCBwYWNrX2hlYWRlciAqaGRyID0gZmlsbChzaXplb2Yoc3RydWN0IHBhY2tfaGVhZGVyKSk7CisJdW5zaWduZWQgbnJfb2JqZWN0cyA9IG50b2hsKGhkci0+aGRyX2VudHJpZXMpOworCisJaWYgKG50b2hsKGhkci0+aGRyX3NpZ25hdHVyZSkgIT0gUEFDS19TSUdOQVRVUkUpCisJCWRpZSgiYmFkIHBhY2sgZmlsZSIpOworCWlmICghcGFja192ZXJzaW9uX29rKGhkci0+aGRyX3ZlcnNpb24pKQorCQlkaWUoInVua25vd24gcGFjayBmaWxlIHZlcnNpb24gJWQiLCBudG9obChoZHItPmhkcl92ZXJzaW9uKSk7CisJdXNlKHNpemVvZihzdHJ1Y3QgcGFja19oZWFkZXIpKTsKKworCWlmICghcXVpZXQpCisJCXByb2dyZXNzID0gc3RhcnRfcHJvZ3Jlc3MoIlVucGFja2luZyBvYmplY3RzIiwgbnJfb2JqZWN0cyk7CisJb2JqX2xpc3QgPSB4bWFsbG9jKG5yX29iamVjdHMgKiBzaXplb2YoKm9ial9saXN0KSk7CisJZm9yIChpID0gMDsgaSA8IG5yX29iamVjdHM7IGkrKykgeworCQl1bnBhY2tfb25lKGkpOworCQlkaXNwbGF5X3Byb2dyZXNzKHByb2dyZXNzLCBpICsgMSk7CisJfQorCXN0b3BfcHJvZ3Jlc3MoJnByb2dyZXNzKTsKKworCWlmIChkZWx0YV9saXN0KQorCQlkaWUoInVucmVzb2x2ZWQgZGVsdGFzIGxlZnQgYWZ0ZXIgdW5wYWNraW5nIik7Cit9CisKK2ludCBjbWRfdW5wYWNrX29iamVjdHMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCXF1aWV0ID0gIWlzYXR0eSgyKTsKKworCWZvciAoaSA9IDEgOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJaWYgKCphcmcgPT0gJy0nKSB7CisJCQlpZiAoIXN0cmNtcChhcmcsICItbiIpKSB7CisJCQkJZHJ5X3J1biA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItcSIpKSB7CisJCQkJcXVpZXQgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLXIiKSkgeworCQkJCXJlY292ZXIgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1wYWNrX2hlYWRlcj0iKSkgeworCQkJCXN0cnVjdCBwYWNrX2hlYWRlciAqaGRyOworCQkJCWNoYXIgKmM7CisKKwkJCQloZHIgPSAoc3RydWN0IHBhY2tfaGVhZGVyICopYnVmZmVyOworCQkJCWhkci0+aGRyX3NpZ25hdHVyZSA9IGh0b25sKFBBQ0tfU0lHTkFUVVJFKTsKKwkJCQloZHItPmhkcl92ZXJzaW9uID0gaHRvbmwoc3RydG91bChhcmcgKyAxNCwgJmMsIDEwKSk7CisJCQkJaWYgKCpjICE9ICcsJykKKwkJCQkJZGllKCJiYWQgJXMiLCBhcmcpOworCQkJCWhkci0+aGRyX2VudHJpZXMgPSBodG9ubChzdHJ0b3VsKGMgKyAxLCAmYywgMTApKTsKKwkJCQlpZiAoKmMpCisJCQkJCWRpZSgiYmFkICVzIiwgYXJnKTsKKwkJCQlsZW4gPSBzaXplb2YoKmhkcik7CisJCQkJY29udGludWU7CisJCQl9CisJCQl1c2FnZSh1bnBhY2tfdXNhZ2UpOworCQl9CisKKwkJLyogV2UgZG9uJ3QgdGFrZSBhbnkgbm9uLWZsYWcgYXJndW1lbnRzIG5vdy4uIE1heWJlIHNvbWUgZGF5ICovCisJCXVzYWdlKHVucGFja191c2FnZSk7CisJfQorCVNIQTFfSW5pdCgmY3R4KTsKKwl1bnBhY2tfYWxsKCk7CisJU0hBMV9VcGRhdGUoJmN0eCwgYnVmZmVyLCBvZmZzZXQpOworCVNIQTFfRmluYWwoc2hhMSwgJmN0eCk7CisJaWYgKGhhc2hjbXAoZmlsbCgyMCksIHNoYTEpKQorCQlkaWUoImZpbmFsIHNoYTEgZGlkIG5vdCBtYXRjaCIpOworCXVzZSgyMCk7CisKKwkvKiBXcml0ZSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBidWZmZXIgdG8gc3Rkb3V0ICovCisJd2hpbGUgKGxlbikgeworCQlpbnQgcmV0ID0geHdyaXRlKDEsIGJ1ZmZlciArIG9mZnNldCwgbGVuKTsKKwkJaWYgKHJldCA8PSAwKQorCQkJYnJlYWs7CisJCWxlbiAtPSByZXQ7CisJCW9mZnNldCArPSByZXQ7CisJfQorCisJLyogQWxsIGRvbmUgKi8KKwlyZXR1cm4gaGFzX2Vycm9yczsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tdXBkYXRlLWluZGV4LmMgYi9idWlsdGluLXVwZGF0ZS1pbmRleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4Nzk1ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLXVwZGF0ZS1pbmRleC5jCkBAIC0wLDAgKzEsNzQ4IEBACisvKgorICogR0lUIC0gVGhlIGluZm9ybWF0aW9uIG1hbmFnZXIgZnJvbSBoZWxsCisgKgorICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorI2luY2x1ZGUgImNhY2hlLXRyZWUuaCIKKyNpbmNsdWRlICJ0cmVlLXdhbGsuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAicmVmcy5oIgorCisvKgorICogRGVmYXVsdCB0byBub3QgYWxsb3dpbmcgY2hhbmdlcyB0byB0aGUgbGlzdCBvZiBmaWxlcy4gVGhlCisgKiB0b29sIGRvZXNuJ3QgYWN0dWFsbHkgY2FyZSwgYnV0IHRoaXMgbWFrZXMgaXQgaGFyZGVyIHRvIGFkZAorICogZmlsZXMgdG8gdGhlIHJldmlzaW9uIGNvbnRyb2wgYnkgbWlzdGFrZSBieSBkb2luZyBzb21ldGhpbmcKKyAqIGxpa2UgImdpdC11cGRhdGUtaW5kZXggKiIgYW5kIHN1ZGRlbmx5IGhhdmluZyBhbGwgdGhlIG9iamVjdAorICogZmlsZXMgYmUgcmV2aXNpb24gY29udHJvbGxlZC4KKyAqLworc3RhdGljIGludCBhbGxvd19hZGQ7CitzdGF0aWMgaW50IGFsbG93X3JlbW92ZTsKK3N0YXRpYyBpbnQgYWxsb3dfcmVwbGFjZTsKK3N0YXRpYyBpbnQgaW5mb19vbmx5Oworc3RhdGljIGludCBmb3JjZV9yZW1vdmU7CitzdGF0aWMgaW50IHZlcmJvc2U7CitzdGF0aWMgaW50IG1hcmtfdmFsaWRfb25seTsKKyNkZWZpbmUgTUFSS19WQUxJRCAxCisjZGVmaW5lIFVOTUFSS19WQUxJRCAyCisKK3N0YXRpYyB2b2lkIHJlcG9ydChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IHZwOworCisJaWYgKCF2ZXJib3NlKQorCQlyZXR1cm47CisKKwl2YV9zdGFydCh2cCwgZm10KTsKKwl2cHJpbnRmKGZtdCwgdnApOworCXB1dGNoYXIoJ1xuJyk7CisJdmFfZW5kKHZwKTsKK30KKworc3RhdGljIGludCBtYXJrX3ZhbGlkKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IG5hbWVsZW4gPSBzdHJsZW4ocGF0aCk7CisJaW50IHBvcyA9IGNhY2hlX25hbWVfcG9zKHBhdGgsIG5hbWVsZW4pOworCWlmICgwIDw9IHBvcykgeworCQlzd2l0Y2ggKG1hcmtfdmFsaWRfb25seSkgeworCQljYXNlIE1BUktfVkFMSUQ6CisJCQlhY3RpdmVfY2FjaGVbcG9zXS0+Y2VfZmxhZ3MgfD0gQ0VfVkFMSUQ7CisJCQlicmVhazsKKwkJY2FzZSBVTk1BUktfVkFMSUQ6CisJCQlhY3RpdmVfY2FjaGVbcG9zXS0+Y2VfZmxhZ3MgJj0gfkNFX1ZBTElEOworCQkJYnJlYWs7CisJCX0KKwkJY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoYWN0aXZlX2NhY2hlX3RyZWUsIHBhdGgpOworCQlhY3RpdmVfY2FjaGVfY2hhbmdlZCA9IDE7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgcmVtb3ZlX29uZV9wYXRoKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaWYgKCFhbGxvd19yZW1vdmUpCisJCXJldHVybiBlcnJvcigiJXM6IGRvZXMgbm90IGV4aXN0IGFuZCAtLXJlbW92ZSBub3QgcGFzc2VkIiwgcGF0aCk7CisJaWYgKHJlbW92ZV9maWxlX2Zyb21fY2FjaGUocGF0aCkpCisJCXJldHVybiBlcnJvcigiJXM6IGNhbm5vdCByZW1vdmUgZnJvbSB0aGUgaW5kZXgiLCBwYXRoKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEhhbmRsZSBhIHBhdGggdGhhdCBjb3VsZG4ndCBiZSBsc3RhdCdlZC4gSXQncyBlaXRoZXI6CisgKiAgLSBtaXNzaW5nIGZpbGUgKEVOT0VOVCBvciBFTk9URElSKS4gVGhhdCdzIG9rIGlmIHdlJ3JlCisgKiAgICBzdXBwb3NlZCB0byBiZSByZW1vdmluZyBpdCBhbmQgdGhlIHJlbW92YWwgYWN0dWFsbHkKKyAqICAgIHN1Y2NlZWRzLgorICogIC0gcGVybWlzc2lvbiBlcnJvci4gVGhhdCdzIG5ldmVyIG9rLgorICovCitzdGF0aWMgaW50IHByb2Nlc3NfbHN0YXRfZXJyb3IoY29uc3QgY2hhciAqcGF0aCwgaW50IGVycikKK3sKKwlpZiAoZXJyID09IEVOT0VOVCB8fCBlcnIgPT0gRU5PVERJUikKKwkJcmV0dXJuIHJlbW92ZV9vbmVfcGF0aChwYXRoKTsKKwlyZXR1cm4gZXJyb3IoImxzdGF0KFwiJXNcIik6ICVzIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKK30KKworc3RhdGljIGludCBhZGRfb25lX3BhdGgoc3RydWN0IGNhY2hlX2VudHJ5ICpvbGQsIGNvbnN0IGNoYXIgKnBhdGgsIGludCBsZW4sIHN0cnVjdCBzdGF0ICpzdCkKK3sKKwlpbnQgb3B0aW9uLCBzaXplOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisKKwkvKiBXYXMgdGhlIG9sZCBpbmRleCBlbnRyeSBhbHJlYWR5IHVwLXRvLWRhdGU/ICovCisJaWYgKG9sZCAmJiAhY2Vfc3RhZ2Uob2xkKSAmJiAhY2VfbWF0Y2hfc3RhdChvbGQsIHN0LCAwKSkKKwkJcmV0dXJuIDA7CisKKwlzaXplID0gY2FjaGVfZW50cnlfc2l6ZShsZW4pOworCWNlID0geGNhbGxvYygxLCBzaXplKTsKKwltZW1jcHkoY2UtPm5hbWUsIHBhdGgsIGxlbik7CisJY2UtPmNlX2ZsYWdzID0gbGVuOworCWZpbGxfc3RhdF9jYWNoZV9pbmZvKGNlLCBzdCk7CisJY2UtPmNlX21vZGUgPSBjZV9tb2RlX2Zyb21fc3RhdChvbGQsIHN0LT5zdF9tb2RlKTsKKworCWlmIChpbmRleF9wYXRoKGNlLT5zaGExLCBwYXRoLCBzdCwgIWluZm9fb25seSkpCisJCXJldHVybiAtMTsKKwlvcHRpb24gPSBhbGxvd19hZGQgPyBBRERfQ0FDSEVfT0tfVE9fQUREIDogMDsKKwlvcHRpb24gfD0gYWxsb3dfcmVwbGFjZSA/IEFERF9DQUNIRV9PS19UT19SRVBMQUNFIDogMDsKKwlpZiAoYWRkX2NhY2hlX2VudHJ5KGNlLCBvcHRpb24pKQorCQlyZXR1cm4gZXJyb3IoIiVzOiBjYW5ub3QgYWRkIHRvIHRoZSBpbmRleCAtIG1pc3NpbmcgLS1hZGQgb3B0aW9uPyIsIHBhdGgpOworCXJldHVybiAwOworfQorCisvKgorICogSGFuZGxlIGEgcGF0aCB0aGF0IHdhcyBhIGRpcmVjdG9yeS4gRm91ciBjYXNlczoKKyAqCisgKiAgLSBpdCdzIGFscmVhZHkgYSBnaXRsaW5rIGluIHRoZSBpbmRleCwgYW5kIHdlIGtlZXAgaXQgdGhhdAorICogICAgd2F5LCBhbmQgdXBkYXRlIGl0IGlmIHdlIGNhbiAoaWYgd2UgY2Fubm90IGZpbmQgdGhlIEhFQUQsCisgKiAgICB3ZSdyZSBnb2luZyB0byBrZWVwIGl0IHVuY2hhbmdlZCBpbiB0aGUgaW5kZXghKQorICoKKyAqICAtIGl0J3MgYSAqZmlsZSogaW4gdGhlIGluZGV4LCBpbiB3aGljaCBjYXNlIGl0IHNob3VsZCBiZQorICogICAgcmVtb3ZlZCBhcyBhIGZpbGUgaWYgcmVtb3ZhbCBpcyBhbGxvd2VkLCBzaW5jZSBpdCBkb2Vzbid0CisgKiAgICBleGlzdCBhcyBzdWNoIGFueSBtb3JlLiBJZiByZW1vdmFsIGlzbid0IGFsbG93ZWQsIGl0J3MKKyAqICAgIGFuIGVycm9yLgorICoKKyAqICAgIChOT1RFISBUaGlzIGlzIG9sZCBhbmQgYXJndWFibHkgZmFpcmx5IHN0cmFuZ2UgYmVoYXZpb3VyLgorICogICAgV2UgbWlnaHQgd2FudCB0byBtYWtlIHRoaXMgYW4gZXJyb3IgdW5jb25kaXRpb25hbGx5LCBhbmQKKyAqICAgIHVzZSAiLS1mb3JjZS1yZW1vdmUiIGlmIHlvdSBhY3R1YWxseSB3YW50IHRvIGZvcmNlIHJlbW92YWwpLgorICoKKyAqICAtIGl0IHVzZWQgdG8gZXhpc3QgYXMgYSBzdWJkaXJlY3RvcnkgKGllIG11bHRpcGxlIGZpbGVzIHdpdGgKKyAqICAgIHRoaXMgcGFydGljdWxhciBwcmVmaXgpIGluIHRoZSBpbmRleCwgaW4gd2hpY2ggY2FzZSBpdCdzIHdyb25nCisgKiAgICB0byB0cnkgdG8gdXBkYXRlIGl0IGFzIGEgZGlyZWN0b3J5LgorICoKKyAqICAtIGl0IGRvZXNuJ3QgZXhpc3QgYXQgYWxsIGluIHRoZSBpbmRleCwgYnV0IGl0IGlzIGEgdmFsaWQKKyAqICAgIGdpdCBkaXJlY3RvcnksIGFuZCBpdCBzaG91bGQgYmUgKmFkZGVkKiBhcyBhIGdpdGxpbmsuCisgKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19kaXJlY3RvcnkoY29uc3QgY2hhciAqcGF0aCwgaW50IGxlbiwgc3RydWN0IHN0YXQgKnN0KQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaW50IHBvcyA9IGNhY2hlX25hbWVfcG9zKHBhdGgsIGxlbik7CisKKwkvKiBFeGFjdCBtYXRjaDogZmlsZSBvciBleGlzdGluZyBnaXRsaW5rICovCisJaWYgKHBvcyA+PSAwKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbcG9zXTsKKwkJaWYgKFNfSVNHSVRMSU5LKGNlLT5jZV9tb2RlKSkgeworCisJCQkvKiBEbyBub3RoaW5nIHRvIHRoZSBpbmRleCBpZiB0aGVyZSBpcyBubyBIRUFEISAqLworCQkJaWYgKHJlc29sdmVfZ2l0bGlua19yZWYocGF0aCwgIkhFQUQiLCBzaGExKSA8IDApCisJCQkJcmV0dXJuIDA7CisKKwkJCXJldHVybiBhZGRfb25lX3BhdGgoY2UsIHBhdGgsIGxlbiwgc3QpOworCQl9CisJCS8qIFNob3VsZCB0aGlzIGJlIGFuIHVuY29uZGl0aW9uYWwgZXJyb3I/ICovCisJCXJldHVybiByZW1vdmVfb25lX3BhdGgocGF0aCk7CisJfQorCisJLyogSW5leGFjdCBtYXRjaDogaXMgdGhlcmUgcGVyaGFwcyBhIHN1YmRpcmVjdG9yeSBtYXRjaD8gKi8KKwlwb3MgPSAtcG9zLTE7CisJd2hpbGUgKHBvcyA8IGFjdGl2ZV9ucikgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW3BvcysrXTsKKworCQlpZiAoc3RybmNtcChjZS0+bmFtZSwgcGF0aCwgbGVuKSkKKwkJCWJyZWFrOworCQlpZiAoY2UtPm5hbWVbbGVuXSA+ICcvJykKKwkJCWJyZWFrOworCQlpZiAoY2UtPm5hbWVbbGVuXSA8ICcvJykKKwkJCWNvbnRpbnVlOworCisJCS8qIFN1YmRpcmVjdG9yeSBtYXRjaCAtIGVycm9yIG91dCAqLworCQlyZXR1cm4gZXJyb3IoIiVzOiBpcyBhIGRpcmVjdG9yeSAtIGFkZCBpbmRpdmlkdWFsIGZpbGVzIGluc3RlYWQiLCBwYXRoKTsKKwl9CisKKwkvKiBObyBtYXRjaCAtIHNob3VsZCB3ZSBhZGQgaXQgYXMgYSBnaXRsaW5rPyAqLworCWlmICghcmVzb2x2ZV9naXRsaW5rX3JlZihwYXRoLCAiSEVBRCIsIHNoYTEpKQorCQlyZXR1cm4gYWRkX29uZV9wYXRoKE5VTEwsIHBhdGgsIGxlbiwgc3QpOworCisJLyogRXJyb3Igb3V0LiAqLworCXJldHVybiBlcnJvcigiJXM6IGlzIGEgZGlyZWN0b3J5IC0gYWRkIGZpbGVzIGluc2lkZSBpbnN0ZWFkIiwgcGF0aCk7Cit9CisKKy8qCisgKiBQcm9jZXNzIGEgcmVndWxhciBmaWxlCisgKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19maWxlKGNvbnN0IGNoYXIgKnBhdGgsIGludCBsZW4sIHN0cnVjdCBzdGF0ICpzdCkKK3sKKwlpbnQgcG9zID0gY2FjaGVfbmFtZV9wb3MocGF0aCwgbGVuKTsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gcG9zIDwgMCA/IE5VTEwgOiBhY3RpdmVfY2FjaGVbcG9zXTsKKworCWlmIChjZSAmJiBTX0lTR0lUTElOSyhjZS0+Y2VfbW9kZSkpCisJCXJldHVybiBlcnJvcigiJXMgaXMgYWxyZWFkeSBhIGdpdGxpbmssIG5vdCByZXBsYWNpbmciLCBwYXRoKTsKKworCXJldHVybiBhZGRfb25lX3BhdGgoY2UsIHBhdGgsIGxlbiwgc3QpOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfcGF0aChjb25zdCBjaGFyICpwYXRoKQoreworCWludCBsZW47CisJc3RydWN0IHN0YXQgc3Q7CisKKwkvKgorCSAqIEZpcnN0IHRoaW5ncyBmaXJzdDogZ2V0IHRoZSBzdGF0IGluZm9ybWF0aW9uLCB0byBkZWNpZGUKKwkgKiB3aGF0IHRvIGRvIGFib3V0IHRoZSBwYXRobmFtZSEKKwkgKi8KKwlpZiAobHN0YXQocGF0aCwgJnN0KSA8IDApCisJCXJldHVybiBwcm9jZXNzX2xzdGF0X2Vycm9yKHBhdGgsIGVycm5vKTsKKworCWxlbiA9IHN0cmxlbihwYXRoKTsKKwlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkKKwkJcmV0dXJuIHByb2Nlc3NfZGlyZWN0b3J5KHBhdGgsIGxlbiwgJnN0KTsKKworCXJldHVybiBwcm9jZXNzX2ZpbGUocGF0aCwgbGVuLCAmc3QpOworfQorCitzdGF0aWMgaW50IGFkZF9jYWNoZWluZm8odW5zaWduZWQgaW50IG1vZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkgY29uc3QgY2hhciAqcGF0aCwgaW50IHN0YWdlKQoreworCWludCBzaXplLCBsZW4sIG9wdGlvbjsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlOworCisJaWYgKCF2ZXJpZnlfcGF0aChwYXRoKSkKKwkJcmV0dXJuIC0xOworCisJbGVuID0gc3RybGVuKHBhdGgpOworCXNpemUgPSBjYWNoZV9lbnRyeV9zaXplKGxlbik7CisJY2UgPSB4Y2FsbG9jKDEsIHNpemUpOworCisJaGFzaGNweShjZS0+c2hhMSwgc2hhMSk7CisJbWVtY3B5KGNlLT5uYW1lLCBwYXRoLCBsZW4pOworCWNlLT5jZV9mbGFncyA9IGNyZWF0ZV9jZV9mbGFncyhsZW4sIHN0YWdlKTsKKwljZS0+Y2VfbW9kZSA9IGNyZWF0ZV9jZV9tb2RlKG1vZGUpOworCWlmIChhc3N1bWVfdW5jaGFuZ2VkKQorCQljZS0+Y2VfZmxhZ3MgfD0gQ0VfVkFMSUQ7CisJb3B0aW9uID0gYWxsb3dfYWRkID8gQUREX0NBQ0hFX09LX1RPX0FERCA6IDA7CisJb3B0aW9uIHw9IGFsbG93X3JlcGxhY2UgPyBBRERfQ0FDSEVfT0tfVE9fUkVQTEFDRSA6IDA7CisJaWYgKGFkZF9jYWNoZV9lbnRyeShjZSwgb3B0aW9uKSkKKwkJcmV0dXJuIGVycm9yKCIlczogY2Fubm90IGFkZCB0byB0aGUgaW5kZXggLSBtaXNzaW5nIC0tYWRkIG9wdGlvbj8iLAorCQkJICAgICBwYXRoKTsKKwlyZXBvcnQoImFkZCAnJXMnIiwgcGF0aCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNobW9kX3BhdGgoaW50IGZsaXAsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IHBvczsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlOworCXVuc2lnbmVkIGludCBtb2RlOworCisJcG9zID0gY2FjaGVfbmFtZV9wb3MocGF0aCwgc3RybGVuKHBhdGgpKTsKKwlpZiAocG9zIDwgMCkKKwkJZ290byBmYWlsOworCWNlID0gYWN0aXZlX2NhY2hlW3Bvc107CisJbW9kZSA9IGNlLT5jZV9tb2RlOworCWlmICghU19JU1JFRyhtb2RlKSkKKwkJZ290byBmYWlsOworCXN3aXRjaCAoZmxpcCkgeworCWNhc2UgJysnOgorCQljZS0+Y2VfbW9kZSB8PSAwMTExOyBicmVhazsKKwljYXNlICctJzoKKwkJY2UtPmNlX21vZGUgJj0gfjAxMTE7IGJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gZmFpbDsKKwl9CisJY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoYWN0aXZlX2NhY2hlX3RyZWUsIHBhdGgpOworCWFjdGl2ZV9jYWNoZV9jaGFuZ2VkID0gMTsKKwlyZXBvcnQoImNobW9kICVjeCAnJXMnIiwgZmxpcCwgcGF0aCk7CisJcmV0dXJuOworIGZhaWw6CisJZGllKCJnaXQtdXBkYXRlLWluZGV4OiBjYW5ub3QgY2htb2QgJWN4ICclcyciLCBmbGlwLCBwYXRoKTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX29uZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpwcmVmaXgsIGludCBwcmVmaXhfbGVuZ3RoKQoreworCWNvbnN0IGNoYXIgKnAgPSBwcmVmaXhfcGF0aChwcmVmaXgsIHByZWZpeF9sZW5ndGgsIHBhdGgpOworCWlmICghdmVyaWZ5X3BhdGgocCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJJZ25vcmluZyBwYXRoICVzXG4iLCBwYXRoKTsKKwkJZ290byBmcmVlX3JldHVybjsKKwl9CisJaWYgKG1hcmtfdmFsaWRfb25seSkgeworCQlpZiAobWFya192YWxpZChwKSkKKwkJCWRpZSgiVW5hYmxlIHRvIG1hcmsgZmlsZSAlcyIsIHBhdGgpOworCQlnb3RvIGZyZWVfcmV0dXJuOworCX0KKworCWlmIChmb3JjZV9yZW1vdmUpIHsKKwkJaWYgKHJlbW92ZV9maWxlX2Zyb21fY2FjaGUocCkpCisJCQlkaWUoImdpdC11cGRhdGUtaW5kZXg6IHVuYWJsZSB0byByZW1vdmUgJXMiLCBwYXRoKTsKKwkJcmVwb3J0KCJyZW1vdmUgJyVzJyIsIHBhdGgpOworCQlnb3RvIGZyZWVfcmV0dXJuOworCX0KKwlpZiAocHJvY2Vzc19wYXRoKHApKQorCQlkaWUoIlVuYWJsZSB0byBwcm9jZXNzIHBhdGggJXMiLCBwYXRoKTsKKwlyZXBvcnQoImFkZCAnJXMnIiwgcGF0aCk7CisgZnJlZV9yZXR1cm46CisJaWYgKHAgPCBwYXRoIHx8IHAgPiBwYXRoICsgc3RybGVuKHBhdGgpKQorCQlmcmVlKChjaGFyKilwKTsKK30KKworc3RhdGljIHZvaWQgcmVhZF9pbmRleF9pbmZvKGludCBsaW5lX3Rlcm1pbmF0aW9uKQoreworCXN0cnVjdCBzdHJidWYgYnVmOworCXN0cnVjdCBzdHJidWYgdXE7CisKKwlzdHJidWZfaW5pdCgmYnVmLCAwKTsKKwlzdHJidWZfaW5pdCgmdXEsIDApOworCXdoaWxlIChzdHJidWZfZ2V0bGluZSgmYnVmLCBzdGRpbiwgbGluZV90ZXJtaW5hdGlvbikgIT0gRU9GKSB7CisJCWNoYXIgKnB0ciwgKnRhYjsKKwkJY2hhciAqcGF0aF9uYW1lOworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQl1bnNpZ25lZCBpbnQgbW9kZTsKKwkJdW5zaWduZWQgbG9uZyB1bDsKKwkJaW50IHN0YWdlOworCisJCS8qIFRoaXMgcmVhZHMgbGluZXMgZm9ybWF0dGVkIGluIG9uZSBvZiB0aHJlZSBmb3JtYXRzOgorCQkgKgorCQkgKiAoMSkgbW9kZSAgICAgICAgIFNQIHNoYTEgICAgICAgICAgVEFCIHBhdGgKKwkJICogVGhlIGZpcnN0IGZvcm1hdCBpcyB3aGF0ICJnaXQtYXBwbHkgLS1pbmRleC1pbmZvIgorCQkgKiByZXBvcnRzLCBhbmQgdXNlZCB0byByZWNvbnN0cnVjdCBhIHBhcnRpYWwgdHJlZQorCQkgKiB0aGF0IGlzIHVzZWQgZm9yIHBob255IG1lcmdlIGJhc2UgdHJlZSB3aGVuIGZhbGxpbmcKKwkJICogYmFjayBvbiAzLXdheSBtZXJnZS4KKwkJICoKKwkJICogKDIpIG1vZGUgU1AgdHlwZSBTUCBzaGExICAgICAgICAgIFRBQiBwYXRoCisJCSAqIFRoZSBzZWNvbmQgZm9ybWF0IGlzIHRvIHN0dWZmIGdpdC1scy10cmVlIG91dHB1dAorCQkgKiBpbnRvIHRoZSBpbmRleCBmaWxlLgorCQkgKgorCQkgKiAoMykgbW9kZSAgICAgICAgIFNQIHNoYTEgU1Agc3RhZ2UgVEFCIHBhdGgKKwkJICogVGhpcyBmb3JtYXQgaXMgdG8gcHV0IGhpZ2hlciBvcmRlciBzdGFnZXMgaW50byB0aGUKKwkJICogaW5kZXggZmlsZSBhbmQgbWF0Y2hlcyBnaXQtbHMtZmlsZXMgLS1zdGFnZSBvdXRwdXQuCisJCSAqLworCQllcnJubyA9IDA7CisJCXVsID0gc3RydG91bChidWYuYnVmLCAmcHRyLCA4KTsKKwkJaWYgKHB0ciA9PSBidWYuYnVmIHx8ICpwdHIgIT0gJyAnCisJCSAgICB8fCBlcnJubyB8fCAodW5zaWduZWQgaW50KSB1bCAhPSB1bCkKKwkJCWdvdG8gYmFkX2xpbmU7CisJCW1vZGUgPSB1bDsKKworCQl0YWIgPSBzdHJjaHIocHRyLCAnXHQnKTsKKwkJaWYgKCF0YWIgfHwgdGFiIC0gcHRyIDwgNDEpCisJCQlnb3RvIGJhZF9saW5lOworCisJCWlmICh0YWJbLTJdID09ICcgJyAmJiAnMCcgPD0gdGFiWy0xXSAmJiB0YWJbLTFdIDw9ICczJykgeworCQkJc3RhZ2UgPSB0YWJbLTFdIC0gJzAnOworCQkJcHRyID0gdGFiICsgMTsgLyogcG9pbnQgYXQgdGhlIGhlYWQgb2YgcGF0aCAqLworCQkJdGFiID0gdGFiIC0gMjsgLyogcG9pbnQgYXQgdGFpbCBvZiBzaGExICovCisJCX0KKwkJZWxzZSB7CisJCQlzdGFnZSA9IDA7CisJCQlwdHIgPSB0YWIgKyAxOyAvKiBwb2ludCBhdCB0aGUgaGVhZCBvZiBwYXRoICovCisJCX0KKworCQlpZiAoZ2V0X3NoYTFfaGV4KHRhYiAtIDQwLCBzaGExKSB8fCB0YWJbLTQxXSAhPSAnICcpCisJCQlnb3RvIGJhZF9saW5lOworCisJCXBhdGhfbmFtZSA9IHB0cjsKKwkJaWYgKGxpbmVfdGVybWluYXRpb24gJiYgcGF0aF9uYW1lWzBdID09ICciJykgeworCQkJc3RyYnVmX3Jlc2V0KCZ1cSk7CisJCQlpZiAodW5xdW90ZV9jX3N0eWxlKCZ1cSwgcGF0aF9uYW1lLCBOVUxMKSkgeworCQkJCWRpZSgiZ2l0LXVwZGF0ZS1pbmRleDogYmFkIHF1b3Rpbmcgb2YgcGF0aCBuYW1lIik7CisJCQl9CisJCQlwYXRoX25hbWUgPSB1cS5idWY7CisJCX0KKworCQlpZiAoIXZlcmlmeV9wYXRoKHBhdGhfbmFtZSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiSWdub3JpbmcgcGF0aCAlc1xuIiwgcGF0aF9uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFtb2RlKSB7CisJCQkvKiBtb2RlID09IDAgbWVhbnMgdGhlcmUgaXMgbm8gc3VjaCBwYXRoIC0tIHJlbW92ZSAqLworCQkJaWYgKHJlbW92ZV9maWxlX2Zyb21fY2FjaGUocGF0aF9uYW1lKSkKKwkJCQlkaWUoImdpdC11cGRhdGUtaW5kZXg6IHVuYWJsZSB0byByZW1vdmUgJXMiLAorCQkJCSAgICBwdHIpOworCQl9CisJCWVsc2UgeworCQkJLyogbW9kZSAnICcgc2hhMSAnXHQnIG5hbWUKKwkJCSAqIHB0clstMV0gcG9pbnRzIGF0IHRhYiwKKwkJCSAqIHB0clstNDFdIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2Ygc2hhMQorCQkJICovCisJCQlwdHJbLTQyXSA9IHB0clstMV0gPSAwOworCQkJaWYgKGFkZF9jYWNoZWluZm8obW9kZSwgc2hhMSwgcGF0aF9uYW1lLCBzdGFnZSkpCisJCQkJZGllKCJnaXQtdXBkYXRlLWluZGV4OiB1bmFibGUgdG8gdXBkYXRlICVzIiwKKwkJCQkgICAgcGF0aF9uYW1lKTsKKwkJfQorCQljb250aW51ZTsKKworCWJhZF9saW5lOgorCQlkaWUoIm1hbGZvcm1lZCBpbmRleCBpbmZvICVzIiwgYnVmLmJ1Zik7CisJfQorCXN0cmJ1Zl9yZWxlYXNlKCZidWYpOworCXN0cmJ1Zl9yZWxlYXNlKCZ1cSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIHVwZGF0ZV9pbmRleF91c2FnZVtdID0KKyJnaXQtdXBkYXRlLWluZGV4IFstcV0gWy0tYWRkXSBbLS1yZXBsYWNlXSBbLS1yZW1vdmVdIFstLXVubWVyZ2VkXSBbLS1yZWZyZXNoXSBbLS1yZWFsbHktcmVmcmVzaF0gWy0tY2FjaGVpbmZvXSBbLS1jaG1vZD0oK3wtKXhdIFstLWFzc3VtZS11bmNoYW5nZWRdIFstLWluZm8tb25seV0gWy0tZm9yY2UtcmVtb3ZlXSBbLS1zdGRpbl0gWy0taW5kZXgtaW5mb10gWy0tdW5yZXNvbHZlXSBbLS1hZ2FpbiB8IC1nXSBbLS1pZ25vcmUtbWlzc2luZ10gWy16XSBbLS12ZXJib3NlXSBbLS1dIDxmaWxlPi4uLiI7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGhlYWRfc2hhMVsyMF07CitzdGF0aWMgdW5zaWduZWQgY2hhciBtZXJnZV9oZWFkX3NoYTFbMjBdOworCitzdGF0aWMgc3RydWN0IGNhY2hlX2VudHJ5ICpyZWFkX29uZV9lbnQoY29uc3QgY2hhciAqd2hpY2gsCisJCQkJCXVuc2lnbmVkIGNoYXIgKmVudCwgY29uc3QgY2hhciAqcGF0aCwKKwkJCQkJaW50IG5hbWVsZW4sIGludCBzdGFnZSkKK3sKKwl1bnNpZ25lZCBtb2RlOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaW50IHNpemU7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpjZTsKKworCWlmIChnZXRfdHJlZV9lbnRyeShlbnQsIHBhdGgsIHNoYTEsICZtb2RlKSkgeworCQlpZiAod2hpY2gpCisJCQllcnJvcigiJXM6IG5vdCBpbiAlcyBicmFuY2guIiwgcGF0aCwgd2hpY2gpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKG1vZGUgPT0gU19JRkRJUikgeworCQlpZiAod2hpY2gpCisJCQllcnJvcigiJXM6IG5vdCBhIGJsb2IgaW4gJXMgYnJhbmNoLiIsIHBhdGgsIHdoaWNoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXNpemUgPSBjYWNoZV9lbnRyeV9zaXplKG5hbWVsZW4pOworCWNlID0geGNhbGxvYygxLCBzaXplKTsKKworCWhhc2hjcHkoY2UtPnNoYTEsIHNoYTEpOworCW1lbWNweShjZS0+bmFtZSwgcGF0aCwgbmFtZWxlbik7CisJY2UtPmNlX2ZsYWdzID0gY3JlYXRlX2NlX2ZsYWdzKG5hbWVsZW4sIHN0YWdlKTsKKwljZS0+Y2VfbW9kZSA9IGNyZWF0ZV9jZV9tb2RlKG1vZGUpOworCXJldHVybiBjZTsKK30KKworc3RhdGljIGludCB1bnJlc29sdmVfb25lKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IG5hbWVsZW4gPSBzdHJsZW4ocGF0aCk7CisJaW50IHBvczsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlXzIgPSBOVUxMLCAqY2VfMyA9IE5VTEw7CisKKwkvKiBTZWUgaWYgdGhlcmUgaXMgc3VjaCBlbnRyeSBpbiB0aGUgaW5kZXguICovCisJcG9zID0gY2FjaGVfbmFtZV9wb3MocGF0aCwgbmFtZWxlbik7CisJaWYgKHBvcyA8IDApIHsKKwkJLyogSWYgdGhlcmUgaXNuJ3QsIGVpdGhlciBpdCBpcyB1bm1lcmdlZCwgb3IKKwkJICogcmVzb2x2ZWQgYXMgInJlbW92ZWQiIGJ5IG1pc3Rha2UuICBXZSBkbyBub3QKKwkJICogd2FudCB0byBkbyBhbnl0aGluZyBpbiB0aGUgZm9ybWVyIGNhc2UuCisJCSAqLworCQlwb3MgPSAtcG9zLTE7CisJCWlmIChwb3MgPCBhY3RpdmVfbnIpIHsKKwkJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbcG9zXTsKKwkJCWlmIChjZV9uYW1lbGVuKGNlKSA9PSBuYW1lbGVuICYmCisJCQkgICAgIW1lbWNtcChjZS0+bmFtZSwgcGF0aCwgbmFtZWxlbikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJIiVzOiBza2lwcGluZyBzdGlsbCB1bm1lcmdlZCBwYXRoLlxuIiwKKwkJCQkJcGF0aCk7CisJCQkJZ290byBmcmVlX3JldHVybjsKKwkJCX0KKwkJfQorCX0KKworCS8qIEdyYWIgYmxvYnMgZnJvbSBnaXZlbiBwYXRoIGZyb20gSEVBRCBhbmQgTUVSR0VfSEVBRCwKKwkgKiBzdHVmZiBIRUFEIHZlcnNpb24gaW4gc3RhZ2UgIzIsCisJICogc3R1ZmYgTUVSR0VfSEVBRCB2ZXJzaW9uIGluIHN0YWdlICMzLgorCSAqLworCWNlXzIgPSByZWFkX29uZV9lbnQoIm91ciIsIGhlYWRfc2hhMSwgcGF0aCwgbmFtZWxlbiwgMik7CisJY2VfMyA9IHJlYWRfb25lX2VudCgidGhlaXIiLCBtZXJnZV9oZWFkX3NoYTEsIHBhdGgsIG5hbWVsZW4sIDMpOworCisJaWYgKCFjZV8yIHx8ICFjZV8zKSB7CisJCXJldCA9IC0xOworCQlnb3RvIGZyZWVfcmV0dXJuOworCX0KKwlpZiAoIWhhc2hjbXAoY2VfMi0+c2hhMSwgY2VfMy0+c2hhMSkgJiYKKwkgICAgY2VfMi0+Y2VfbW9kZSA9PSBjZV8zLT5jZV9tb2RlKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGlkZW50aWNhbCBpbiBib3RoLCBza2lwcGluZy5cbiIsCisJCQlwYXRoKTsKKwkJZ290byBmcmVlX3JldHVybjsKKwl9CisKKwlyZW1vdmVfZmlsZV9mcm9tX2NhY2hlKHBhdGgpOworCWlmIChhZGRfY2FjaGVfZW50cnkoY2VfMiwgQUREX0NBQ0hFX09LX1RPX0FERCkpIHsKKwkJZXJyb3IoIiVzOiBjYW5ub3QgYWRkIG91ciB2ZXJzaW9uIHRvIHRoZSBpbmRleC4iLCBwYXRoKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZnJlZV9yZXR1cm47CisJfQorCWlmICghYWRkX2NhY2hlX2VudHJ5KGNlXzMsIEFERF9DQUNIRV9PS19UT19BREQpKQorCQlyZXR1cm4gMDsKKwllcnJvcigiJXM6IGNhbm5vdCBhZGQgdGhlaXIgdmVyc2lvbiB0byB0aGUgaW5kZXguIiwgcGF0aCk7CisJcmV0ID0gLTE7CisgZnJlZV9yZXR1cm46CisJZnJlZShjZV8yKTsKKwlmcmVlKGNlXzMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfaGVhZF9wb2ludGVycyh2b2lkKQoreworCWlmIChyZWFkX3JlZigiSEVBRCIsIGhlYWRfc2hhMSkpCisJCWRpZSgiTm8gSEVBRCAtLSBubyBpbml0aWFsIGNvbW1pdCB5ZXQ/XG4iKTsKKwlpZiAocmVhZF9yZWYoIk1FUkdFX0hFQUQiLCBtZXJnZV9oZWFkX3NoYTEpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm90IGluIHRoZSBtaWRkbGUgb2YgYSBtZXJnZS5cbiIpOworCQlleGl0KDApOworCX0KK30KKworc3RhdGljIGludCBkb191bnJlc29sdmUoaW50IGFjLCBjb25zdCBjaGFyICoqYXYsCisJCQljb25zdCBjaGFyICpwcmVmaXgsIGludCBwcmVmaXhfbGVuZ3RoKQoreworCWludCBpOworCWludCBlcnIgPSAwOworCisJLyogUmVhZCBIRUFEIGFuZCBNRVJHRV9IRUFEOyBpZiBNRVJHRV9IRUFEIGRvZXMgbm90IGV4aXN0LCB3ZQorCSAqIGFyZSBub3QgZG9pbmcgYSBtZXJnZSwgc28gZXhpdCB3aXRoIHN1Y2Nlc3Mgc3RhdHVzLgorCSAqLworCXJlYWRfaGVhZF9wb2ludGVycygpOworCisJZm9yIChpID0gMTsgaSA8IGFjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXZbaV07CisJCWNvbnN0IGNoYXIgKnAgPSBwcmVmaXhfcGF0aChwcmVmaXgsIHByZWZpeF9sZW5ndGgsIGFyZyk7CisJCWVyciB8PSB1bnJlc29sdmVfb25lKHApOworCQlpZiAocCA8IGFyZyB8fCBwID4gYXJnICsgc3RybGVuKGFyZykpCisJCQlmcmVlKChjaGFyKilwKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkb19yZXVwZGF0ZShpbnQgYWMsIGNvbnN0IGNoYXIgKiphdiwKKwkJICAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCwgaW50IHByZWZpeF9sZW5ndGgpCit7CisJLyogUmVhZCBIRUFEIGFuZCBydW4gdXBkYXRlLWluZGV4IG9uIHBhdGhzIHRoYXQgYXJlCisJICogbWVyZ2VkIGFuZCBhbHJlYWR5IGRpZmZlcmVudCBiZXR3ZWVuIGluZGV4IGFuZCBIRUFELgorCSAqLworCWludCBwb3M7CisJaW50IGhhc19oZWFkID0gMTsKKwljb25zdCBjaGFyICoqcGF0aHNwZWMgPSBnZXRfcGF0aHNwZWMocHJlZml4LCBhdiArIDEpOworCisJaWYgKHJlYWRfcmVmKCJIRUFEIiwgaGVhZF9zaGExKSkKKwkJLyogSWYgdGhlcmUgaXMgbm8gSEVBRCwgdGhhdCBtZWFucyBpdCBpcyBhbiBpbml0aWFsCisJCSAqIGNvbW1pdC4gIFVwZGF0ZSBldmVyeXRoaW5nIGluIHRoZSBpbmRleC4KKwkJICovCisJCWhhc19oZWFkID0gMDsKKyByZWRvOgorCWZvciAocG9zID0gMDsgcG9zIDwgYWN0aXZlX25yOyBwb3MrKykgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW3Bvc107CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqb2xkID0gTlVMTDsKKwkJaW50IHNhdmVfbnI7CisKKwkJaWYgKGNlX3N0YWdlKGNlKSB8fCAhY2VfcGF0aF9tYXRjaChjZSwgcGF0aHNwZWMpKQorCQkJY29udGludWU7CisJCWlmIChoYXNfaGVhZCkKKwkJCW9sZCA9IHJlYWRfb25lX2VudChOVUxMLCBoZWFkX3NoYTEsCisJCQkJCSAgIGNlLT5uYW1lLCBjZV9uYW1lbGVuKGNlKSwgMCk7CisJCWlmIChvbGQgJiYgY2UtPmNlX21vZGUgPT0gb2xkLT5jZV9tb2RlICYmCisJCSAgICAhaGFzaGNtcChjZS0+c2hhMSwgb2xkLT5zaGExKSkgeworCQkJZnJlZShvbGQpOworCQkJY29udGludWU7IC8qIHVuY2hhbmdlZCAqLworCQl9CisJCS8qIEJlIGNhcmVmdWwuICBUaGUgd29ya2luZyB0cmVlIG1heSBub3QgaGF2ZSB0aGUKKwkJICogcGF0aCBhbnltb3JlLCBpbiB3aGljaCBjYXNlLCB1bmRlciAnYWxsb3dfcmVtb3ZlJywKKwkJICogb3Igd29yc2UgeWV0ICdhbGxvd19yZXBsYWNlJywgYWN0aXZlX25yIG1heSBkZWNyZWFzZS4KKwkJICovCisJCXNhdmVfbnIgPSBhY3RpdmVfbnI7CisJCXVwZGF0ZV9vbmUoY2UtPm5hbWUgKyBwcmVmaXhfbGVuZ3RoLCBwcmVmaXgsIHByZWZpeF9sZW5ndGgpOworCQlpZiAoc2F2ZV9uciAhPSBhY3RpdmVfbnIpCisJCQlnb3RvIHJlZG87CisJfQorCXJldHVybiAwOworfQorCitpbnQgY21kX3VwZGF0ZV9pbmRleChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaSwgbmV3ZmQsIGVudHJpZXMsIGhhc19lcnJvcnMgPSAwLCBsaW5lX3Rlcm1pbmF0aW9uID0gJ1xuJzsKKwlpbnQgYWxsb3dfb3B0aW9ucyA9IDE7CisJaW50IHJlYWRfZnJvbV9zdGRpbiA9IDA7CisJaW50IHByZWZpeF9sZW5ndGggPSBwcmVmaXggPyBzdHJsZW4ocHJlZml4KSA6IDA7CisJY2hhciBzZXRfZXhlY3V0YWJsZV9iaXQgPSAwOworCXVuc2lnbmVkIGludCByZWZyZXNoX2ZsYWdzID0gMDsKKwlpbnQgbG9ja19lcnJvciA9IDA7CisJc3RydWN0IGxvY2tfZmlsZSAqbG9ja19maWxlOworCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJLyogV2UgY2FuJ3QgZnJlZSB0aGlzIG1lbW9yeSwgaXQgYmVjb21lcyBwYXJ0IG9mIGEgbGlua2VkIGxpc3QgcGFyc2VkIGF0ZXhpdCgpICovCisJbG9ja19maWxlID0geGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGxvY2tfZmlsZSkpOworCisJbmV3ZmQgPSBob2xkX2xvY2tlZF9pbmRleChsb2NrX2ZpbGUsIDApOworCWlmIChuZXdmZCA8IDApCisJCWxvY2tfZXJyb3IgPSBlcnJubzsKKworCWVudHJpZXMgPSByZWFkX2NhY2hlKCk7CisJaWYgKGVudHJpZXMgPCAwKQorCQlkaWUoImNhY2hlIGNvcnJ1cHRlZCIpOworCisJZm9yIChpID0gMSA7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqcGF0aCA9IGFyZ3ZbaV07CisJCWNvbnN0IGNoYXIgKnA7CisKKwkJaWYgKGFsbG93X29wdGlvbnMgJiYgKnBhdGggPT0gJy0nKSB7CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS0iKSkgeworCQkJCWFsbG93X29wdGlvbnMgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi1xIikpIHsKKwkJCQlyZWZyZXNoX2ZsYWdzIHw9IFJFRlJFU0hfUVVJRVQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS1hZGQiKSkgeworCQkJCWFsbG93X2FkZCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS1yZXBsYWNlIikpIHsKKwkJCQlhbGxvd19yZXBsYWNlID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItLXJlbW92ZSIpKSB7CisJCQkJYWxsb3dfcmVtb3ZlID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItLXVubWVyZ2VkIikpIHsKKwkJCQlyZWZyZXNoX2ZsYWdzIHw9IFJFRlJFU0hfVU5NRVJHRUQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS1yZWZyZXNoIikpIHsKKwkJCQloYXNfZXJyb3JzIHw9IHJlZnJlc2hfY2FjaGUocmVmcmVzaF9mbGFncyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS1yZWFsbHktcmVmcmVzaCIpKSB7CisJCQkJaGFzX2Vycm9ycyB8PSByZWZyZXNoX2NhY2hlKFJFRlJFU0hfUkVBTExZIHwgcmVmcmVzaF9mbGFncyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS1jYWNoZWluZm8iKSkgeworCQkJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCQkJdW5zaWduZWQgaW50IG1vZGU7CisKKwkJCQlpZiAoaSszID49IGFyZ2MpCisJCQkJCWRpZSgiZ2l0LXVwZGF0ZS1pbmRleDogLS1jYWNoZWluZm8gPG1vZGU+IDxzaGExPiA8cGF0aD4iKTsKKworCQkJCWlmIChzdHJ0b3VsX3VpKGFyZ3ZbaSsxXSwgOCwgJm1vZGUpIHx8CisJCQkJICAgIGdldF9zaGExX2hleChhcmd2W2krMl0sIHNoYTEpIHx8CisJCQkJICAgIGFkZF9jYWNoZWluZm8obW9kZSwgc2hhMSwgYXJndltpKzNdLCAwKSkKKwkJCQkJZGllKCJnaXQtdXBkYXRlLWluZGV4OiAtLWNhY2hlaW5mbyIKKwkJCQkJICAgICIgY2Fubm90IGFkZCAlcyIsIGFyZ3ZbaSszXSk7CisJCQkJaSArPSAzOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tY2htb2Q9LXgiKSB8fAorCQkJICAgICFzdHJjbXAocGF0aCwgIi0tY2htb2Q9K3giKSkgeworCQkJCWlmIChhcmdjIDw9IGkrMSkKKwkJCQkJZGllKCJnaXQtdXBkYXRlLWluZGV4OiAlcyA8cGF0aD4iLCBwYXRoKTsKKwkJCQlzZXRfZXhlY3V0YWJsZV9iaXQgPSBwYXRoWzhdOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tYXNzdW1lLXVuY2hhbmdlZCIpKSB7CisJCQkJbWFya192YWxpZF9vbmx5ID0gTUFSS19WQUxJRDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItLW5vLWFzc3VtZS11bmNoYW5nZWQiKSkgeworCQkJCW1hcmtfdmFsaWRfb25seSA9IFVOTUFSS19WQUxJRDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItLWluZm8tb25seSIpKSB7CisJCQkJaW5mb19vbmx5ID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItLWZvcmNlLXJlbW92ZSIpKSB7CisJCQkJZm9yY2VfcmVtb3ZlID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICIteiIpKSB7CisJCQkJbGluZV90ZXJtaW5hdGlvbiA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS1zdGRpbiIpKSB7CisJCQkJaWYgKGkgIT0gYXJnYyAtIDEpCisJCQkJCWRpZSgiLS1zdGRpbiBtdXN0IGJlIGF0IHRoZSBlbmQiKTsKKwkJCQlyZWFkX2Zyb21fc3RkaW4gPSAxOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0taW5kZXgtaW5mbyIpKSB7CisJCQkJaWYgKGkgIT0gYXJnYyAtIDEpCisJCQkJCWRpZSgiLS1pbmRleC1pbmZvIG11c3QgYmUgYXQgdGhlIGVuZCIpOworCQkJCWFsbG93X2FkZCA9IGFsbG93X3JlcGxhY2UgPSBhbGxvd19yZW1vdmUgPSAxOworCQkJCXJlYWRfaW5kZXhfaW5mbyhsaW5lX3Rlcm1pbmF0aW9uKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItLXVucmVzb2x2ZSIpKSB7CisJCQkJaGFzX2Vycm9ycyA9IGRvX3VucmVzb2x2ZShhcmdjIC0gaSwgYXJndiArIGksCisJCQkJCQkJICBwcmVmaXgsIHByZWZpeF9sZW5ndGgpOworCQkJCWlmIChoYXNfZXJyb3JzKQorCQkJCQlhY3RpdmVfY2FjaGVfY2hhbmdlZCA9IDA7CisJCQkJZ290byBmaW5pc2g7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS1hZ2FpbiIpIHx8ICFzdHJjbXAocGF0aCwgIi1nIikpIHsKKwkJCQloYXNfZXJyb3JzID0gZG9fcmV1cGRhdGUoYXJnYyAtIGksIGFyZ3YgKyBpLAorCQkJCQkJCSBwcmVmaXgsIHByZWZpeF9sZW5ndGgpOworCQkJCWlmIChoYXNfZXJyb3JzKQorCQkJCQlhY3RpdmVfY2FjaGVfY2hhbmdlZCA9IDA7CisJCQkJZ290byBmaW5pc2g7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS1pZ25vcmUtbWlzc2luZyIpKSB7CisJCQkJcmVmcmVzaF9mbGFncyB8PSBSRUZSRVNIX0lHTk9SRV9NSVNTSU5HOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tdmVyYm9zZSIpKSB7CisJCQkJdmVyYm9zZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLWgiKSB8fCAhc3RyY21wKHBhdGgsICItLWhlbHAiKSkKKwkJCQl1c2FnZSh1cGRhdGVfaW5kZXhfdXNhZ2UpOworCQkJZGllKCJ1bmtub3duIG9wdGlvbiAlcyIsIHBhdGgpOworCQl9CisJCXAgPSBwcmVmaXhfcGF0aChwcmVmaXgsIHByZWZpeF9sZW5ndGgsIHBhdGgpOworCQl1cGRhdGVfb25lKHAsIE5VTEwsIDApOworCQlpZiAoc2V0X2V4ZWN1dGFibGVfYml0KQorCQkJY2htb2RfcGF0aChzZXRfZXhlY3V0YWJsZV9iaXQsIHApOworCQlpZiAocCA8IHBhdGggfHwgcCA+IHBhdGggKyBzdHJsZW4ocGF0aCkpCisJCQlmcmVlKChjaGFyKilwKTsKKwl9CisJaWYgKHJlYWRfZnJvbV9zdGRpbikgeworCQlzdHJ1Y3Qgc3RyYnVmIGJ1ZiwgbmJ1ZjsKKworCQlzdHJidWZfaW5pdCgmYnVmLCAwKTsKKwkJc3RyYnVmX2luaXQoJm5idWYsIDApOworCQl3aGlsZSAoc3RyYnVmX2dldGxpbmUoJmJ1Ziwgc3RkaW4sIGxpbmVfdGVybWluYXRpb24pICE9IEVPRikgeworCQkJY29uc3QgY2hhciAqcDsKKwkJCWlmIChsaW5lX3Rlcm1pbmF0aW9uICYmIGJ1Zi5idWZbMF0gPT0gJyInKSB7CisJCQkJc3RyYnVmX3Jlc2V0KCZuYnVmKTsKKwkJCQlpZiAodW5xdW90ZV9jX3N0eWxlKCZuYnVmLCBidWYuYnVmLCBOVUxMKSkKKwkJCQkJZGllKCJsaW5lIGlzIGJhZGx5IHF1b3RlZCIpOworCQkJCXN0cmJ1Zl9zd2FwKCZidWYsICZuYnVmKTsKKwkJCX0KKwkJCXAgPSBwcmVmaXhfcGF0aChwcmVmaXgsIHByZWZpeF9sZW5ndGgsIGJ1Zi5idWYpOworCQkJdXBkYXRlX29uZShwLCBOVUxMLCAwKTsKKwkJCWlmIChzZXRfZXhlY3V0YWJsZV9iaXQpCisJCQkJY2htb2RfcGF0aChzZXRfZXhlY3V0YWJsZV9iaXQsIHApOworCQkJaWYgKHAgPCBidWYuYnVmIHx8IHAgPiBidWYuYnVmICsgYnVmLmxlbikKKwkJCQlmcmVlKChjaGFyICopcCk7CisJCX0KKwkJc3RyYnVmX3JlbGVhc2UoJm5idWYpOworCQlzdHJidWZfcmVsZWFzZSgmYnVmKTsKKwl9CisKKyBmaW5pc2g6CisJaWYgKGFjdGl2ZV9jYWNoZV9jaGFuZ2VkKSB7CisJCWlmIChuZXdmZCA8IDApIHsKKwkJCWlmIChyZWZyZXNoX2ZsYWdzICYgUkVGUkVTSF9RVUlFVCkKKwkJCQlleGl0KDEyOCk7CisJCQlkaWUoInVuYWJsZSB0byBjcmVhdGUgJyVzLmxvY2snOiAlcyIsCisJCQkgICAgZ2V0X2luZGV4X2ZpbGUoKSwgc3RyZXJyb3IobG9ja19lcnJvcikpOworCQl9CisJCWlmICh3cml0ZV9jYWNoZShuZXdmZCwgYWN0aXZlX2NhY2hlLCBhY3RpdmVfbnIpIHx8CisJCSAgICBjb21taXRfbG9ja2VkX2luZGV4KGxvY2tfZmlsZSkpCisJCQlkaWUoIlVuYWJsZSB0byB3cml0ZSBuZXcgaW5kZXggZmlsZSIpOworCX0KKworCXJvbGxiYWNrX2xvY2tfZmlsZShsb2NrX2ZpbGUpOworCisJcmV0dXJuIGhhc19lcnJvcnMgPyAxIDogMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tdXBkYXRlLXJlZi5jIGIvYnVpbHRpbi11cGRhdGUtcmVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkwNzM3YwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tdXBkYXRlLXJlZi5jCkBAIC0wLDAgKzEsNTEgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAicGFyc2Utb3B0aW9ucy5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdpdF91cGRhdGVfcmVmX3VzYWdlW10gPSB7CisJImdpdC11cGRhdGUtcmVmIFtvcHRpb25zXSAtZCA8cmVmbmFtZT4gPG9sZHZhbD4iLAorCSJnaXQtdXBkYXRlLXJlZiBbb3B0aW9uc10gICAgPHJlZm5hbWU+IDxuZXd2YWw+IFs8b2xkdmFsPl0iLAorCU5VTEwKK307CisKK2ludCBjbWRfdXBkYXRlX3JlZihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwljb25zdCBjaGFyICpyZWZuYW1lLCAqdmFsdWUsICpvbGR2YWwsICptc2c9TlVMTDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdLCBvbGRzaGExWzIwXTsKKwlpbnQgZGVsZXRlID0gMCwgbm9fZGVyZWYgPSAwOworCXN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0geworCQlPUFRfU1RSSU5HKCAnbScsIE5VTEwsICZtc2csICJyZWFzb24iLCAicmVhc29uIG9mIHRoZSB1cGRhdGUiKSwKKwkJT1BUX0JPT0xFQU4oJ2QnLCBOVUxMLCAmZGVsZXRlLCAiZGVsZXRlcyB0aGUgcmVmZXJlbmNlIiksCisJCU9QVF9CT09MRUFOKCAwICwgIm5vLWRlcmVmIiwgJm5vX2RlcmVmLAorCQkJCQkidXBkYXRlIDxyZWZuYW1lPiBub3QgdGhlIG9uZSBpdCBwb2ludHMgdG8iKSwKKwkJT1BUX0VORCgpLAorCX07CisKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisJYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgb3B0aW9ucywgZ2l0X3VwZGF0ZV9yZWZfdXNhZ2UsIDApOworCWlmIChtc2cgJiYgISptc2cpCisJCWRpZSgiUmVmdXNpbmcgdG8gcGVyZm9ybSB1cGRhdGUgd2l0aCBlbXB0eSBtZXNzYWdlLiIpOworCisJaWYgKGFyZ2MgPCAyIHx8IGFyZ2MgPiAzKQorCQl1c2FnZV93aXRoX29wdGlvbnMoZ2l0X3VwZGF0ZV9yZWZfdXNhZ2UsIG9wdGlvbnMpOworCXJlZm5hbWUgPSBhcmd2WzBdOworCXZhbHVlICAgPSBhcmd2WzFdOworCW9sZHZhbCAgPSBhcmd2WzJdOworCisJaWYgKGdldF9zaGExKHZhbHVlLCBzaGExKSkKKwkJZGllKCIlczogbm90IGEgdmFsaWQgU0hBMSIsIHZhbHVlKTsKKworCWlmIChkZWxldGUpIHsKKwkJaWYgKG9sZHZhbCkKKwkJCXVzYWdlX3dpdGhfb3B0aW9ucyhnaXRfdXBkYXRlX3JlZl91c2FnZSwgb3B0aW9ucyk7CisJCXJldHVybiBkZWxldGVfcmVmKHJlZm5hbWUsIHNoYTEpOworCX0KKworCWhhc2hjbHIob2xkc2hhMSk7CisJaWYgKG9sZHZhbCAmJiAqb2xkdmFsICYmIGdldF9zaGExKG9sZHZhbCwgb2xkc2hhMSkpCisJCWRpZSgiJXM6IG5vdCBhIHZhbGlkIG9sZCBTSEExIiwgb2xkdmFsKTsKKworCXJldHVybiB1cGRhdGVfcmVmKG1zZywgcmVmbmFtZSwgc2hhMSwgb2xkdmFsID8gb2xkc2hhMSA6IE5VTEwsCisJCQkgIG5vX2RlcmVmID8gUkVGX05PREVSRUYgOiAwLCBESUVfT05fRVJSKTsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tdXBsb2FkLWFyY2hpdmUuYyBiL2J1aWx0aW4tdXBsb2FkLWFyY2hpdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGFlMDllCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi11cGxvYWQtYXJjaGl2ZS5jCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEZyYW5jayBCdWktSHV1CisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisjaW5jbHVkZSAicGt0LWxpbmUuaCIKKyNpbmNsdWRlICJzaWRlYmFuZC5oIgorCitzdGF0aWMgY29uc3QgY2hhciB1cGxvYWRfYXJjaGl2ZV91c2FnZVtdID0KKwkiZ2l0LXVwbG9hZC1hcmNoaXZlIDxyZXBvPiI7CisKK3N0YXRpYyBjb25zdCBjaGFyIGRlYWRjaGlsZFtdID0KKyJnaXQtdXBsb2FkLWFyY2hpdmU6IGFyY2hpdmVyIGRpZWQgd2l0aCBlcnJvciI7CisKK3N0YXRpYyBjb25zdCBjaGFyIGxvc3RjaGlsZFtdID0KKyJnaXQtdXBsb2FkLWFyY2hpdmU6IGFyY2hpdmVyIHByb2Nlc3Mgd2FzIGxvc3QiOworCisKK3N0YXRpYyBpbnQgcnVuX3VwbG9hZF9hcmNoaXZlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXN0cnVjdCBhcmNoaXZlciBhcjsKKwljb25zdCBjaGFyICpzZW50X2FyZ3ZbTUFYX0FSR1NdOworCWNvbnN0IGNoYXIgKmFyZ19jbWQgPSAiYXJndW1lbnQgIjsKKwljaGFyICpwLCBidWZbNDA5Nl07CisJaW50IHRyZWVpc2hfaWR4OworCWludCBzZW50X2FyZ2M7CisJaW50IGxlbjsKKworCWlmIChhcmdjICE9IDIpCisJCXVzYWdlKHVwbG9hZF9hcmNoaXZlX3VzYWdlKTsKKworCWlmIChzdHJsZW4oYXJndlsxXSkgPiBzaXplb2YoYnVmKSkKKwkJZGllKCJpbnNhbmVseSBsb25nIHJlcG9zaXRvcnkgbmFtZSIpOworCisJc3RyY3B5KGJ1ZiwgYXJndlsxXSk7IC8qIGVudGVyLXJlcG8gc211ZGdlcyBpdHMgYXJndW1lbnQgKi8KKworCWlmICghZW50ZXJfcmVwbyhidWYsIDApKQorCQlkaWUoIm5vdCBhIGdpdCBhcmNoaXZlIik7CisKKwkvKiBwdXQgcmVjZWl2ZWQgb3B0aW9ucyBpbiBzZW50X2FyZ3ZbXSAqLworCXNlbnRfYXJnYyA9IDE7CisJc2VudF9hcmd2WzBdID0gImdpdC11cGxvYWQtYXJjaGl2ZSI7CisJZm9yIChwID0gYnVmOzspIHsKKwkJLyogVGhpcyB3aWxsIGRpZSBpZiBub3QgZW5vdWdoIGZyZWUgc3BhY2UgaW4gYnVmICovCisJCWxlbiA9IHBhY2tldF9yZWFkX2xpbmUoMCwgcCwgKGJ1ZiArIHNpemVvZiBidWYpIC0gcCk7CisJCWlmIChsZW4gPT0gMCkKKwkJCWJyZWFrOwkvKiBnb3QgYSBmbHVzaCAqLworCQlpZiAoc2VudF9hcmdjID4gTUFYX0FSR1MgLSAyKQorCQkJZGllKCJUb28gbWFueSBvcHRpb25zICg+MjkpIik7CisKKwkJaWYgKHBbbGVuLTFdID09ICdcbicpIHsKKwkJCXBbLS1sZW5dID0gMDsKKwkJfQorCQlpZiAobGVuIDwgc3RybGVuKGFyZ19jbWQpIHx8CisJCSAgICBzdHJuY21wKGFyZ19jbWQsIHAsIHN0cmxlbihhcmdfY21kKSkpCisJCQlkaWUoIidhcmd1bWVudCcgdG9rZW4gb3IgZmx1c2ggZXhwZWN0ZWQiKTsKKworCQlsZW4gLT0gc3RybGVuKGFyZ19jbWQpOworCQltZW1tb3ZlKHAsIHAgKyBzdHJsZW4oYXJnX2NtZCksIGxlbik7CisJCXNlbnRfYXJndltzZW50X2FyZ2MrK10gPSBwOworCQlwICs9IGxlbjsKKwkJKnArKyA9IDA7CisJfQorCXNlbnRfYXJndltzZW50X2FyZ2NdID0gTlVMTDsKKworCS8qIHBhcnNlIGFsbCBvcHRpb25zIHNlbnQgYnkgdGhlIGNsaWVudCAqLworCXRyZWVpc2hfaWR4ID0gcGFyc2VfYXJjaGl2ZV9hcmdzKHNlbnRfYXJnYywgc2VudF9hcmd2LCAmYXIpOworCisJcGFyc2VfdHJlZWlzaF9hcmcoc2VudF9hcmd2ICsgdHJlZWlzaF9pZHgsICZhci5hcmdzLCBwcmVmaXgpOworCXBhcnNlX3BhdGhzcGVjX2FyZyhzZW50X2FyZ3YgKyB0cmVlaXNoX2lkeCArIDEsICZhci5hcmdzKTsKKworCXJldHVybiBhci53cml0ZV9hcmNoaXZlKCZhci5hcmdzKTsKK30KKworc3RhdGljIHZvaWQgZXJyb3JfY2xudChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwljaGFyIGJ1ZlsxMDI0XTsKKwl2YV9saXN0IHBhcmFtczsKKwlpbnQgbGVuOworCisJdmFfc3RhcnQocGFyYW1zLCBmbXQpOworCWxlbiA9IHZzcHJpbnRmKGJ1ZiwgZm10LCBwYXJhbXMpOworCXZhX2VuZChwYXJhbXMpOworCXNlbmRfc2lkZWJhbmQoMSwgMywgYnVmLCBsZW4sIExBUkdFX1BBQ0tFVF9NQVgpOworCWRpZSgic2VudCBlcnJvciB0byB0aGUgY2xpZW50OiAlcyIsIGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfaW5wdXQoaW50IGNoaWxkX2ZkLCBpbnQgYmFuZCkKK3sKKwljaGFyIGJ1ZlsxNjM4NF07CisJc3NpemVfdCBzeiA9IHJlYWQoY2hpbGRfZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWlmIChzeiA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVBR0FJTiAmJiBlcnJubyAhPSBFSU5UUikKKwkJCWVycm9yX2NsbnQoInJlYWQgZXJyb3I6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm47CisJfQorCXNlbmRfc2lkZWJhbmQoMSwgYmFuZCwgYnVmLCBzeiwgTEFSR0VfUEFDS0VUX01BWCk7Cit9CisKK2ludCBjbWRfdXBsb2FkX2FyY2hpdmUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJcGlkX3Qgd3JpdGVyOworCWludCBmZDFbMl0sIGZkMlsyXTsKKwkvKgorCSAqIFNldCB1cCBzaWRlYmFuZCBzdWJwcm9jZXNzLgorCSAqCisJICogV2UgKHBhcmVudCkgbW9uaXRvciBhbmQgcmVhZCBmcm9tIGNoaWxkLCBzZW5kaW5nIGl0cyBmZCMxIGFuZCBmZCMyCisJICogbXVsdGlwbGV4ZWQgb3V0IHRvIG91ciBmZCMxLiAgSWYgdGhlIGNoaWxkIGRpZXMsIHdlIHRlbGwgdGhlIG90aGVyCisJICogZW5kIG92ZXIgY2hhbm5lbCAjMy4KKwkgKi8KKwlpZiAocGlwZShmZDEpIDwgMCB8fCBwaXBlKGZkMikgPCAwKSB7CisJCWludCBlcnIgPSBlcnJubzsKKwkJcGFja2V0X3dyaXRlKDEsICJOQUNLIHBpcGUgZmFpbGVkIG9uIHRoZSByZW1vdGUgc2lkZVxuIik7CisJCWRpZSgidXBsb2FkLWFyY2hpdmU6ICVzIiwgc3RyZXJyb3IoZXJyKSk7CisJfQorCXdyaXRlciA9IGZvcmsoKTsKKwlpZiAod3JpdGVyIDwgMCkgeworCQlpbnQgZXJyID0gZXJybm87CisJCXBhY2tldF93cml0ZSgxLCAiTkFDSyBmb3JrIGZhaWxlZCBvbiB0aGUgcmVtb3RlIHNpZGVcbiIpOworCQlkaWUoInVwbG9hZC1hcmNoaXZlOiAlcyIsIHN0cmVycm9yKGVycikpOworCX0KKwlpZiAoIXdyaXRlcikgeworCQkvKiBjaGlsZCAtIGNvbm5lY3QgZmQjMSBhbmQgZmQjMiB0byB0aGUgcGlwZSAqLworCQlkdXAyKGZkMVsxXSwgMSk7CisJCWR1cDIoZmQyWzFdLCAyKTsKKwkJY2xvc2UoZmQxWzFdKTsgY2xvc2UoZmQyWzFdKTsKKwkJY2xvc2UoZmQxWzBdKTsgY2xvc2UoZmQyWzBdKTsgLyogd2UgZG8gbm90IHJlYWQgZnJvbSBwaXBlICovCisKKwkJZXhpdChydW5fdXBsb2FkX2FyY2hpdmUoYXJnYywgYXJndiwgcHJlZml4KSk7CisJfQorCisJLyogcGFyZW50IC0gcmVhZCBmcm9tIGNoaWxkLCBtdWx0aXBsZXggYW5kIHNlbmQgb3V0IHRvIGZkIzEgKi8KKwljbG9zZShmZDFbMV0pOyBjbG9zZShmZDJbMV0pOyAvKiB3ZSBkbyBub3Qgd3JpdGUgdG8gcGlwZSAqLworCXBhY2tldF93cml0ZSgxLCAiQUNLXG4iKTsKKwlwYWNrZXRfZmx1c2goMSk7CisKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgcG9sbGZkIHBmZFsyXTsKKwkJaW50IHN0YXR1czsKKworCQlwZmRbMF0uZmQgPSBmZDFbMF07CisJCXBmZFswXS5ldmVudHMgPSBQT0xMSU47CisJCXBmZFsxXS5mZCA9IGZkMlswXTsKKwkJcGZkWzFdLmV2ZW50cyA9IFBPTExJTjsKKwkJaWYgKHBvbGwocGZkLCAyLCAtMSkgPCAwKSB7CisJCQlpZiAoZXJybm8gIT0gRUlOVFIpIHsKKwkJCQllcnJvcigicG9sbCBmYWlsZWQgcmVzdW1pbmc6ICVzIiwKKwkJCQkgICAgICBzdHJlcnJvcihlcnJubykpOworCQkJCXNsZWVwKDEpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKHBmZFswXS5yZXZlbnRzICYgUE9MTElOKQorCQkJLyogRGF0YSBzdHJlYW0gcmVhZHkgKi8KKwkJCXByb2Nlc3NfaW5wdXQocGZkWzBdLmZkLCAxKTsKKwkJaWYgKHBmZFsxXS5yZXZlbnRzICYgUE9MTElOKQorCQkJLyogU3RhdHVzIHN0cmVhbSByZWFkeSAqLworCQkJcHJvY2Vzc19pbnB1dChwZmRbMV0uZmQsIDIpOworCQkvKiBBbHdheXMgZmluaXNoIHRvIHJlYWQgZGF0YSB3aGVuIGF2YWlsYWJsZSAqLworCQlpZiAoKHBmZFswXS5yZXZlbnRzIHwgcGZkWzFdLnJldmVudHMpICYgUE9MTElOKQorCQkJY29udGludWU7CisKKwkJaWYgKHdhaXRwaWQod3JpdGVyLCAmc3RhdHVzLCAwKSA8IDApCisJCQllcnJvcl9jbG50KCIlcyIsIGxvc3RjaGlsZCk7CisJCWVsc2UgaWYgKCFXSUZFWElURUQoc3RhdHVzKSB8fCBXRVhJVFNUQVRVUyhzdGF0dXMpID4gMCkKKwkJCWVycm9yX2NsbnQoIiVzIiwgZGVhZGNoaWxkKTsKKwkJcGFja2V0X2ZsdXNoKDEpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXZlcmlmeS1wYWNrLmMgYi9idWlsdGluLXZlcmlmeS1wYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk1OGJiYgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tdmVyaWZ5LXBhY2suYwpAQCAtMCwwICsxLDgwIEBACisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicGFjay5oIgorCitzdGF0aWMgaW50IHZlcmlmeV9vbmVfcGFjayhjb25zdCBjaGFyICpwYXRoLCBpbnQgdmVyYm9zZSkKK3sKKwljaGFyIGFyZ1tQQVRIX01BWF07CisJaW50IGxlbjsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcGFjazsKKwlpbnQgZXJyOworCisJbGVuID0gc3RybGNweShhcmcsIHBhdGgsIFBBVEhfTUFYKTsKKwlpZiAobGVuID49IFBBVEhfTUFYKQorCQlyZXR1cm4gZXJyb3IoIm5hbWUgdG9vIGxvbmc6ICVzIiwgcGF0aCk7CisKKwkvKgorCSAqIEluIGFkZGl0aW9uIHRvICJmb28uaWR4IiB3ZSBhY2NlcHQgImZvby5wYWNrIiBhbmQgImZvbyI7CisJICogbm9ybWFsaXplIHRoZXNlIGZvcm1zIHRvICJmb28uaWR4IiBmb3IgYWRkX3BhY2tlZF9naXQoKS4KKwkgKi8KKwlpZiAoaGFzX2V4dGVuc2lvbihhcmcsICIucGFjayIpKSB7CisJCXN0cmNweShhcmcgKyBsZW4gLSA1LCAiLmlkeCIpOworCQlsZW4tLTsKKwl9IGVsc2UgaWYgKCFoYXNfZXh0ZW5zaW9uKGFyZywgIi5pZHgiKSkgeworCQlpZiAobGVuICsgNCA+PSBQQVRIX01BWCkKKwkJCXJldHVybiBlcnJvcigibmFtZSB0b28gbG9uZzogJXMuaWR4IiwgYXJnKTsKKwkJc3RyY3B5KGFyZyArIGxlbiwgIi5pZHgiKTsKKwkJbGVuICs9IDQ7CisJfQorCisJLyoKKwkgKiBhZGRfcGFja2VkX2dpdCgpIHVzZXMgb3VyIGJ1ZmZlciAoY29udGFpbmluZyAiZm9vLmlkeCIpIHRvCisJICogYnVpbGQgdGhlIHBhY2sgZmlsZW5hbWUgKCJmb28ucGFjayIpLiAgTWFrZSBzdXJlIGl0IGZpdHMuCisJICovCisJaWYgKGxlbiArIDEgPj0gUEFUSF9NQVgpIHsKKwkJYXJnW2xlbiAtIDRdID0gJ1wwJzsKKwkJcmV0dXJuIGVycm9yKCJuYW1lIHRvbyBsb25nOiAlcy5wYWNrIiwgYXJnKTsKKwl9CisKKwlwYWNrID0gYWRkX3BhY2tlZF9naXQoYXJnLCBsZW4sIDEpOworCWlmICghcGFjaykKKwkJcmV0dXJuIGVycm9yKCJwYWNrZmlsZSAlcyBub3QgZm91bmQuIiwgYXJnKTsKKworCWluc3RhbGxfcGFja2VkX2dpdChwYWNrKTsKKwllcnIgPSB2ZXJpZnlfcGFjayhwYWNrLCB2ZXJib3NlKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcmlmeV9wYWNrX3VzYWdlW10gPSAiZ2l0LXZlcmlmeS1wYWNrIFstdl0gPHBhY2s+Li4uIjsKKworaW50IGNtZF92ZXJpZnlfcGFjayhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgZXJyID0gMDsKKwlpbnQgdmVyYm9zZSA9IDA7CisJaW50IG5vX21vcmVfb3B0aW9ucyA9IDA7CisJaW50IG5vdGhpbmdfZG9uZSA9IDE7CisKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisJd2hpbGUgKDEgPCBhcmdjKSB7CisJCWlmICghbm9fbW9yZV9vcHRpb25zICYmIGFyZ3ZbMV1bMF0gPT0gJy0nKSB7CisJCQlpZiAoIXN0cmNtcCgiLXYiLCBhcmd2WzFdKSkKKwkJCQl2ZXJib3NlID0gMTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoIi0tIiwgYXJndlsxXSkpCisJCQkJbm9fbW9yZV9vcHRpb25zID0gMTsKKwkJCWVsc2UKKwkJCQl1c2FnZSh2ZXJpZnlfcGFja191c2FnZSk7CisJCX0KKwkJZWxzZSB7CisJCQlpZiAodmVyaWZ5X29uZV9wYWNrKGFyZ3ZbMV0sIHZlcmJvc2UpKQorCQkJCWVyciA9IDE7CisJCQlub3RoaW5nX2RvbmUgPSAwOworCQl9CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCWlmIChub3RoaW5nX2RvbmUpCisJCXVzYWdlKHZlcmlmeV9wYWNrX3VzYWdlKTsKKworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXZlcmlmeS10YWcuYyBiL2J1aWx0aW4tdmVyaWZ5LXRhZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiODE0OTYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLXZlcmlmeS10YWcuYwpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIEJ1aWx0aW4gImdpdCB2ZXJpZnktdGFnIgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBDYXJsb3MgUmljYSA8amFzYW1wbGVyQGdtYWlsLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBnaXQtdmVyaWZ5LXRhZy5zaAorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAicnVuLWNvbW1hbmQuaCIKKyNpbmNsdWRlIDxzaWduYWwuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgYnVpbHRpbl92ZXJpZnlfdGFnX3VzYWdlW10gPQorCQkiZ2l0LXZlcmlmeS10YWcgWy12fC0tdmVyYm9zZV0gPHRhZz4uLi4iOworCisjZGVmaW5lIFBHUF9TSUdOQVRVUkUgIi0tLS0tQkVHSU4gUEdQIFNJR05BVFVSRS0tLS0tIgorCitzdGF0aWMgaW50IHJ1bl9ncGdfdmVyaWZ5KGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgdmVyYm9zZSkKK3sKKwlzdHJ1Y3QgY2hpbGRfcHJvY2VzcyBncGc7CisJY29uc3QgY2hhciAqYXJnc19ncGdbXSA9IHsiZ3BnIiwgIi0tdmVyaWZ5IiwgIkZJTEUiLCAiLSIsIE5VTEx9OworCWNoYXIgcGF0aFtQQVRIX01BWF0sICplb2w7CisJc2l6ZV90IGxlbjsKKwlpbnQgZmQsIHJldDsKKworCWZkID0gZ2l0X21rc3RlbXAocGF0aCwgUEFUSF9NQVgsICIuZ2l0X3Z0YWdfdG1wWFhYWFhYIik7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGVycm9yKCJjb3VsZCBub3QgY3JlYXRlIHRlbXBvcmFyeSBmaWxlICclcyc6ICVzIiwKKwkJCQkJCXBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKHdyaXRlX2luX2Z1bGwoZmQsIGJ1Ziwgc2l6ZSkgPCAwKQorCQlyZXR1cm4gZXJyb3IoImZhaWxlZCB3cml0aW5nIHRlbXBvcmFyeSBmaWxlICclcyc6ICVzIiwKKwkJCQkJCXBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJY2xvc2UoZmQpOworCisJLyogZmluZCB0aGUgbGVuZ3RoIHdpdGhvdXQgc2lnbmF0dXJlICovCisJbGVuID0gMDsKKwl3aGlsZSAobGVuIDwgc2l6ZSAmJiBwcmVmaXhjbXAoYnVmICsgbGVuLCBQR1BfU0lHTkFUVVJFKSkgeworCQllb2wgPSBtZW1jaHIoYnVmICsgbGVuLCAnXG4nLCBzaXplIC0gbGVuKTsKKwkJbGVuICs9IGVvbCA/IGVvbCAtIChidWYgKyBsZW4pICsgMSA6IHNpemUgLSBsZW47CisJfQorCWlmICh2ZXJib3NlKQorCQl3cml0ZV9pbl9mdWxsKDEsIGJ1ZiwgbGVuKTsKKworCW1lbXNldCgmZ3BnLCAwLCBzaXplb2YoZ3BnKSk7CisJZ3BnLmFyZ3YgPSBhcmdzX2dwZzsKKwlncGcuaW4gPSAtMTsKKwlhcmdzX2dwZ1syXSA9IHBhdGg7CisJaWYgKHN0YXJ0X2NvbW1hbmQoJmdwZykpIHsKKwkJdW5saW5rKHBhdGgpOworCQlyZXR1cm4gZXJyb3IoImNvdWxkIG5vdCBydW4gZ3BnLiIpOworCX0KKworCXdyaXRlX2luX2Z1bGwoZ3BnLmluLCBidWYsIGxlbik7CisJY2xvc2UoZ3BnLmluKTsKKwlyZXQgPSBmaW5pc2hfY29tbWFuZCgmZ3BnKTsKKworCXVubGluayhwYXRoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X3RhZyhjb25zdCBjaGFyICpuYW1lLCBpbnQgdmVyYm9zZSkKK3sKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljaGFyICpidWY7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCByZXQ7CisKKwlpZiAoZ2V0X3NoYTEobmFtZSwgc2hhMSkpCisJCXJldHVybiBlcnJvcigidGFnICclcycgbm90IGZvdW5kLiIsIG5hbWUpOworCisJdHlwZSA9IHNoYTFfb2JqZWN0X2luZm8oc2hhMSwgTlVMTCk7CisJaWYgKHR5cGUgIT0gT0JKX1RBRykKKwkJcmV0dXJuIGVycm9yKCIlczogY2Fubm90IHZlcmlmeSBhIG5vbi10YWcgb2JqZWN0IG9mIHR5cGUgJXMuIiwKKwkJCQluYW1lLCB0eXBlbmFtZSh0eXBlKSk7CisKKwlidWYgPSByZWFkX3NoYTFfZmlsZShzaGExLCAmdHlwZSwgJnNpemUpOworCWlmICghYnVmKQorCQlyZXR1cm4gZXJyb3IoIiVzOiB1bmFibGUgdG8gcmVhZCBmaWxlLiIsIG5hbWUpOworCisJcmV0ID0gcnVuX2dwZ192ZXJpZnkoYnVmLCBzaXplLCB2ZXJib3NlKTsKKworCWZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgY21kX3ZlcmlmeV90YWcoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGkgPSAxLCB2ZXJib3NlID0gMCwgaGFkX2Vycm9yID0gMDsKKworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCWlmIChhcmdjID09IDEpCisJCXVzYWdlKGJ1aWx0aW5fdmVyaWZ5X3RhZ191c2FnZSk7CisKKwlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXYiKSB8fCAhc3RyY21wKGFyZ3ZbaV0sICItLXZlcmJvc2UiKSkgeworCQl2ZXJib3NlID0gMTsKKwkJaSsrOworCX0KKworCS8qIHNvbWV0aW1lcyB0aGUgcHJvZ3JhbSB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoaXMgc2lnbmFsCisJICogd2FzIHJlY2VpdmVkIGluIHRoZSBwcm9jZXNzIG9mIHdyaXRpbmcgdGhlIGdwZyBpbnB1dDogKi8KKwlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisJd2hpbGUgKGkgPCBhcmdjKQorCQlpZiAodmVyaWZ5X3RhZyhhcmd2W2krK10sIHZlcmJvc2UpKQorCQkJaGFkX2Vycm9yID0gMTsKKwlyZXR1cm4gaGFkX2Vycm9yOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi13cml0ZS10cmVlLmMgYi9idWlsdGluLXdyaXRlLXRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODM4ZDAxCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi13cml0ZS10cmVlLmMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqLworI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJjYWNoZS10cmVlLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIHdyaXRlX3RyZWVfdXNhZ2VbXSA9CisiZ2l0LXdyaXRlLXRyZWUgWy0tbWlzc2luZy1va10gWy0tcHJlZml4PTxwcmVmaXg+L10iOworCitpbnQgY21kX3dyaXRlX3RyZWUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICp1bnVzZWRfcHJlZml4KQoreworCWludCBtaXNzaW5nX29rID0gMCwgcmV0OworCWNvbnN0IGNoYXIgKnByZWZpeCA9IE5VTEw7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljb25zdCBjaGFyICptZSA9ICJnaXQtd3JpdGUtdHJlZSI7CisKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisJd2hpbGUgKDEgPCBhcmdjKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbMV07CisJCWlmICghc3RyY21wKGFyZywgIi0tbWlzc2luZy1vayIpKQorCQkJbWlzc2luZ19vayA9IDE7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1wcmVmaXg9IikpCisJCQlwcmVmaXggPSBhcmcgKyA5OworCQllbHNlCisJCQl1c2FnZSh3cml0ZV90cmVlX3VzYWdlKTsKKwkJYXJnYy0tOyBhcmd2Kys7CisJfQorCisJaWYgKGFyZ2MgPiAyKQorCQlkaWUoInRvbyBtYW55IG9wdGlvbnMiKTsKKworCXJldCA9IHdyaXRlX2NhY2hlX2FzX3RyZWUoc2hhMSwgbWlzc2luZ19vaywgcHJlZml4KTsKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgMDoKKwkJcHJpbnRmKCIlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOworCQlicmVhazsKKwljYXNlIFdSSVRFX1RSRUVfVU5SRUFEQUJMRV9JTkRFWDoKKwkJZGllKCIlczogZXJyb3IgcmVhZGluZyB0aGUgaW5kZXgiLCBtZSk7CisJCWJyZWFrOworCWNhc2UgV1JJVEVfVFJFRV9VTk1FUkdFRF9JTkRFWDoKKwkJZGllKCIlczogZXJyb3IgYnVpbGRpbmcgdHJlZXM7IHRoZSBpbmRleCBpcyB1bm1lcmdlZD8iLCBtZSk7CisJCWJyZWFrOworCWNhc2UgV1JJVEVfVFJFRV9QUkVGSVhfRVJST1I6CisJCWRpZSgiJXM6IHByZWZpeCAlcyBub3QgZm91bmQiLCBtZSwgcHJlZml4KTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLmggYi9idWlsdGluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUxMjZmZAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4uaApAQCAtMCwwICsxLDEwMCBAQAorI2lmbmRlZiBCVUlMVElOX0gKKyNkZWZpbmUgQlVJTFRJTl9ICisKKyNpbmNsdWRlICJnaXQtY29tcGF0LXV0aWwuaCIKKworZXh0ZXJuIGNvbnN0IGNoYXIgZ2l0X3ZlcnNpb25fc3RyaW5nW107CitleHRlcm4gY29uc3QgY2hhciBnaXRfdXNhZ2Vfc3RyaW5nW107CisKK2V4dGVybiB2b2lkIGxpc3RfY29tbW9uX2NtZHNfaGVscCh2b2lkKTsKK2V4dGVybiB2b2lkIGhlbHBfdW5rbm93bl9jbWQoY29uc3QgY2hhciAqY21kKTsKK2V4dGVybiB2b2lkIHBydW5lX3BhY2tlZF9vYmplY3RzKGludCk7CisKK2V4dGVybiBpbnQgY21kX2FkZChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9hbm5vdGF0ZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9hcHBseShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9hcmNoaXZlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2JsYW1lKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2JyYW5jaChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9idW5kbGUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfY2F0X2ZpbGUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfY2hlY2tvdXQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfY2hlY2tvdXRfaW5kZXgoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfY2hlY2tfYXR0cihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9jaGVja19yZWZfZm9ybWF0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2NoZXJyeShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9jaGVycnlfcGljayhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9jbGVhbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9jb21taXQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfY29tbWl0X3RyZWUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfY291bnRfb2JqZWN0cyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9kZXNjcmliZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9kaWZmX2ZpbGVzKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2RpZmZfaW5kZXgoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfZGlmZihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9kaWZmX3RyZWUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfZmFzdF9leHBvcnQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfZmV0Y2goaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfZmV0Y2hfcGFjayhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9mZXRjaF9fdG9vbChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9mbXRfbWVyZ2VfbXNnKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2Zvcl9lYWNoX3JlZihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9mb3JtYXRfcGF0Y2goaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfZnNjayhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9nYyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9nZXRfdGFyX2NvbW1pdF9pZChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9ncmVwKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2hlbHAoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfaHR0cF9mZXRjaChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9pbml0X2RiKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2xvZyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9sb2dfcmVmbG9nKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2xzX2ZpbGVzKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2xzX3RyZWUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfbHNfcmVtb3RlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX21haWxpbmZvKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX21haWxzcGxpdChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9tZXJnZV9iYXNlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX21lcmdlX291cnMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfbWVyZ2VfZmlsZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9tZXJnZV9yZWN1cnNpdmUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfbXYoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfbmFtZV9yZXYoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfcGFja19vYmplY3RzKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX3BpY2theGUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfcHJ1bmUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfcHJ1bmVfcGFja2VkKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX3B1c2goaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfcmVhZF90cmVlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX3JlZmxvZyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9yZW1vdGUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfY29uZmlnKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX3JlcmVyZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9yZXNldChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9yZXZfbGlzdChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9yZXZfcGFyc2UoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfcmV2ZXJ0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX3JtKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX3NlbmRfcGFjayhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9zaG9ydGxvZyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9zaG93KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX3Nob3dfYnJhbmNoKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX3N0YXR1cyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9zdHJpcHNwYWNlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX3N5bWJvbGljX3JlZihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF90YWcoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfdGFyX3RyZWUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfdW5wYWNrX29iamVjdHMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfdXBkYXRlX2luZGV4KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX3VwZGF0ZV9yZWYoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfdXBsb2FkX2FyY2hpdmUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfdXBsb2FkX3RhcihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF92ZXJpZnlfdGFnKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX3ZlcnNpb24oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfd2hhdGNoYW5nZWQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfd3JpdGVfdHJlZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF92ZXJpZnlfcGFjayhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9zaG93X3JlZihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9wYWNrX3JlZnMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1bmRsZS5jIGIvYnVuZGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhNWRmMQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZS5jCkBAIC0wLDAgKzEsMzYwIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJidW5kbGUuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJsaXN0LW9iamVjdHMuaCIKKyNpbmNsdWRlICJydW4tY29tbWFuZC5oIgorI2luY2x1ZGUgInJlZnMuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgYnVuZGxlX3NpZ25hdHVyZVtdID0gIiMgdjIgZ2l0IGJ1bmRsZVxuIjsKKworc3RhdGljIHZvaWQgYWRkX3RvX3JlZl9saXN0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKm5hbWUsCisJCXN0cnVjdCByZWZfbGlzdCAqbGlzdCkKK3sKKwlpZiAobGlzdC0+bnIgKyAxID49IGxpc3QtPmFsbG9jKSB7CisJCWxpc3QtPmFsbG9jID0gYWxsb2NfbnIobGlzdC0+bnIgKyAxKTsKKwkJbGlzdC0+bGlzdCA9IHhyZWFsbG9jKGxpc3QtPmxpc3QsCisJCQkJbGlzdC0+YWxsb2MgKiBzaXplb2YobGlzdC0+bGlzdFswXSkpOworCX0KKwltZW1jcHkobGlzdC0+bGlzdFtsaXN0LT5ucl0uc2hhMSwgc2hhMSwgMjApOworCWxpc3QtPmxpc3RbbGlzdC0+bnJdLm5hbWUgPSB4c3RyZHVwKG5hbWUpOworCWxpc3QtPm5yKys7Cit9CisKKy8qIHJldHVybnMgYW4gZmQgKi8KK2ludCByZWFkX2J1bmRsZV9oZWFkZXIoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IGJ1bmRsZV9oZWFkZXIgKmhlYWRlcikKK3sKKwljaGFyIGJ1ZmZlclsxMDI0XTsKKwlpbnQgZmQ7CisJbG9uZyBmcG9zOworCUZJTEUgKmZmZCA9IGZvcGVuKHBhdGgsICJyYiIpOworCisJaWYgKCFmZmQpCisJCXJldHVybiBlcnJvcigiY291bGQgbm90IG9wZW4gJyVzJyIsIHBhdGgpOworCWlmICghZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgZmZkKSB8fAorCQkJc3RyY21wKGJ1ZmZlciwgYnVuZGxlX3NpZ25hdHVyZSkpIHsKKwkJZmNsb3NlKGZmZCk7CisJCXJldHVybiBlcnJvcigiJyVzJyBkb2VzIG5vdCBsb29rIGxpa2UgYSB2MiBidW5kbGUgZmlsZSIsIHBhdGgpOworCX0KKwl3aGlsZSAoZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgZmZkKQorCQkJJiYgYnVmZmVyWzBdICE9ICdcbicpIHsKKwkJaW50IGlzX3ByZXJlcSA9IGJ1ZmZlclswXSA9PSAnLSc7CisJCWludCBvZmZzZXQgPSBpc19wcmVyZXEgPyAxIDogMDsKKwkJaW50IGxlbiA9IHN0cmxlbihidWZmZXIpOworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQlzdHJ1Y3QgcmVmX2xpc3QgKmxpc3QgPSBpc19wcmVyZXEgPyAmaGVhZGVyLT5wcmVyZXF1aXNpdGVzCisJCQk6ICZoZWFkZXItPnJlZmVyZW5jZXM7CisJCWNoYXIgZGVsaW07CisKKwkJaWYgKGxlbiAmJiBidWZmZXJbbGVuIC0gMV0gPT0gJ1xuJykKKwkJCWJ1ZmZlcltsZW4gLSAxXSA9ICdcMCc7CisJCWlmIChnZXRfc2hhMV9oZXgoYnVmZmVyICsgb2Zmc2V0LCBzaGExKSkgeworCQkJd2FybmluZygidW5yZWNvZ25pemVkIGhlYWRlcjogJXMiLCBidWZmZXIpOworCQkJY29udGludWU7CisJCX0KKwkJZGVsaW0gPSBidWZmZXJbNDAgKyBvZmZzZXRdOworCQlpZiAoIWlzc3BhY2UoZGVsaW0pICYmIChkZWxpbSAhPSAnXDAnIHx8ICFpc19wcmVyZXEpKQorCQkJZGllICgiaW52YWxpZCBoZWFkZXI6ICVzIiwgYnVmZmVyKTsKKwkJYWRkX3RvX3JlZl9saXN0KHNoYTEsIGlzc3BhY2UoZGVsaW0pID8KKwkJCQlidWZmZXIgKyA0MSArIG9mZnNldCA6ICIiLCBsaXN0KTsKKwl9CisJZnBvcyA9IGZ0ZWxsKGZmZCk7CisJZmNsb3NlKGZmZCk7CisJZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gZXJyb3IoImNvdWxkIG5vdCBvcGVuICclcyciLCBwYXRoKTsKKwlsc2VlayhmZCwgZnBvcywgU0VFS19TRVQpOworCXJldHVybiBmZDsKK30KKworc3RhdGljIGludCBsaXN0X3JlZnMoc3RydWN0IHJlZl9saXN0ICpyLCBpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgci0+bnI7IGkrKykgeworCQlpZiAoYXJnYyA+IDEpIHsKKwkJCWludCBqOworCQkJZm9yIChqID0gMTsgaiA8IGFyZ2M7IGorKykKKwkJCQlpZiAoIXN0cmNtcChyLT5saXN0W2ldLm5hbWUsIGFyZ3Zbal0pKQorCQkJCQlicmVhazsKKwkJCWlmIChqID09IGFyZ2MpCisJCQkJY29udGludWU7CisJCX0KKwkJcHJpbnRmKCIlcyAlc1xuIiwgc2hhMV90b19oZXgoci0+bGlzdFtpXS5zaGExKSwKKwkJCQlyLT5saXN0W2ldLm5hbWUpOworCX0KKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBQUkVSRVFfTUFSSyAoMXU8PDE2KQorCitpbnQgdmVyaWZ5X2J1bmRsZShzdHJ1Y3QgYnVuZGxlX2hlYWRlciAqaGVhZGVyLCBpbnQgdmVyYm9zZSkKK3sKKwkvKgorCSAqIERvIGZhc3QgY2hlY2ssIHRoZW4gaWYgYW55IHByZXJlcXMgYXJlIG1pc3NpbmcgdGhlbiBnbyBsaW5lIGJ5IGxpbmUKKwkgKiB0byBiZSB2ZXJib3NlIGFib3V0IHRoZSBlcnJvcnMKKwkgKi8KKwlzdHJ1Y3QgcmVmX2xpc3QgKnAgPSAmaGVhZGVyLT5wcmVyZXF1aXNpdGVzOworCXN0cnVjdCByZXZfaW5mbyByZXZzOworCWNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHtOVUxMLCAiLS1hbGwifTsKKwlzdHJ1Y3Qgb2JqZWN0X2FycmF5IHJlZnM7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCWludCBpLCByZXQgPSAwLCByZXFfbnI7CisJY29uc3QgY2hhciAqbWVzc2FnZSA9ICJSZXBvc2l0b3J5IGxhY2tzIHRoZXNlIHByZXJlcXVpc2l0ZSBjb21taXRzOiI7CisKKwlpbml0X3JldmlzaW9ucygmcmV2cywgTlVMTCk7CisJZm9yIChpID0gMDsgaSA8IHAtPm5yOyBpKyspIHsKKwkJc3RydWN0IHJlZl9saXN0X2VudHJ5ICplID0gcC0+bGlzdCArIGk7CisJCXN0cnVjdCBvYmplY3QgKm8gPSBwYXJzZV9vYmplY3QoZS0+c2hhMSk7CisJCWlmIChvKSB7CisJCQlvLT5mbGFncyB8PSBQUkVSRVFfTUFSSzsKKwkJCWFkZF9wZW5kaW5nX29iamVjdCgmcmV2cywgbywgZS0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKytyZXQgPT0gMSkKKwkJCWVycm9yKG1lc3NhZ2UpOworCQllcnJvcigiJXMgJXMiLCBzaGExX3RvX2hleChlLT5zaGExKSwgZS0+bmFtZSk7CisJfQorCWlmIChyZXZzLnBlbmRpbmcubnIgIT0gcC0+bnIpCisJCXJldHVybiByZXQ7CisJcmVxX25yID0gcmV2cy5wZW5kaW5nLm5yOworCXNldHVwX3JldmlzaW9ucygyLCBhcmd2LCAmcmV2cywgTlVMTCk7CisKKwltZW1zZXQoJnJlZnMsIDAsIHNpemVvZihzdHJ1Y3Qgb2JqZWN0X2FycmF5KSk7CisJZm9yIChpID0gMDsgaSA8IHJldnMucGVuZGluZy5ucjsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3RfYXJyYXlfZW50cnkgKmUgPSByZXZzLnBlbmRpbmcub2JqZWN0cyArIGk7CisJCWFkZF9vYmplY3RfYXJyYXkoZS0+aXRlbSwgZS0+bmFtZSwgJnJlZnMpOworCX0KKworCWlmIChwcmVwYXJlX3JldmlzaW9uX3dhbGsoJnJldnMpKQorCQlkaWUoInJldmlzaW9uIHdhbGsgc2V0dXAgZmFpbGVkIik7CisKKwlpID0gcmVxX25yOworCXdoaWxlIChpICYmIChjb21taXQgPSBnZXRfcmV2aXNpb24oJnJldnMpKSkKKwkJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgUFJFUkVRX01BUkspCisJCQlpLS07CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVxX25yOyBpKyspCisJCWlmICghKHJlZnMub2JqZWN0c1tpXS5pdGVtLT5mbGFncyAmIFNIT1dOKSkgeworCQkJaWYgKCsrcmV0ID09IDEpCisJCQkJZXJyb3IobWVzc2FnZSk7CisJCQllcnJvcigiJXMgJXMiLCBzaGExX3RvX2hleChyZWZzLm9iamVjdHNbaV0uaXRlbS0+c2hhMSksCisJCQkJcmVmcy5vYmplY3RzW2ldLm5hbWUpOworCQl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVmcy5ucjsgaSsrKQorCQljbGVhcl9jb21taXRfbWFya3MoKHN0cnVjdCBjb21taXQgKilyZWZzLm9iamVjdHNbaV0uaXRlbSwgLTEpOworCisJaWYgKHZlcmJvc2UpIHsKKwkJc3RydWN0IHJlZl9saXN0ICpyOworCisJCXIgPSAmaGVhZGVyLT5yZWZlcmVuY2VzOworCQlwcmludGYoIlRoZSBidW5kbGUgY29udGFpbnMgJWQgcmVmJXNcbiIsCisJCSAgICAgICByLT5uciwgKDEgPCByLT5ucikgPyAicyIgOiAiIik7CisJCWxpc3RfcmVmcyhyLCAwLCBOVUxMKTsKKwkJciA9ICZoZWFkZXItPnByZXJlcXVpc2l0ZXM7CisJCXByaW50ZigiVGhlIGJ1bmRsZSByZXF1aXJlcyB0aGVzZSAlZCByZWYlc1xuIiwKKwkJICAgICAgIHItPm5yLCAoMSA8IHItPm5yKSA/ICJzIiA6ICIiKTsKKwkJbGlzdF9yZWZzKHIsIDAsIE5VTEwpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgbGlzdF9idW5kbGVfcmVmcyhzdHJ1Y3QgYnVuZGxlX2hlYWRlciAqaGVhZGVyLCBpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIGxpc3RfcmVmcygmaGVhZGVyLT5yZWZlcmVuY2VzLCBhcmdjLCBhcmd2KTsKK30KKworaW50IGNyZWF0ZV9idW5kbGUoc3RydWN0IGJ1bmRsZV9oZWFkZXIgKmhlYWRlciwgY29uc3QgY2hhciAqcGF0aCwKKwkJaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCXN0YXRpYyBzdHJ1Y3QgbG9ja19maWxlIGxvY2s7CisJaW50IGJ1bmRsZV9mZCA9IC0xOworCWludCBidW5kbGVfdG9fc3Rkb3V0OworCWNvbnN0IGNoYXIgKiphcmd2X2JvdW5kYXJ5ID0geG1hbGxvYygoYXJnYyArIDQpICogc2l6ZW9mKGNvbnN0IGNoYXIgKikpOworCWNvbnN0IGNoYXIgKiphcmd2X3BhY2sgPSB4bWFsbG9jKDUgKiBzaXplb2YoY29uc3QgY2hhciAqKSk7CisJaW50IGksIHJlZl9jb3VudCA9IDA7CisJY2hhciBidWZmZXJbMTAyNF07CisJc3RydWN0IHJldl9pbmZvIHJldnM7CisJc3RydWN0IGNoaWxkX3Byb2Nlc3MgcmxzOworCUZJTEUgKnJsc19mb3V0OworCisJYnVuZGxlX3RvX3N0ZG91dCA9ICFzdHJjbXAocGF0aCwgIi0iKTsKKwlpZiAoYnVuZGxlX3RvX3N0ZG91dCkKKwkJYnVuZGxlX2ZkID0gMTsKKwllbHNlCisJCWJ1bmRsZV9mZCA9IGhvbGRfbG9ja19maWxlX2Zvcl91cGRhdGUoJmxvY2ssIHBhdGgsIDEpOworCisJLyogd3JpdGUgc2lnbmF0dXJlICovCisJd3JpdGVfb3JfZGllKGJ1bmRsZV9mZCwgYnVuZGxlX3NpZ25hdHVyZSwgc3RybGVuKGJ1bmRsZV9zaWduYXR1cmUpKTsKKworCS8qIGluaXQgcmV2cyB0byBsaXN0IG9iamVjdHMgZm9yIHBhY2stb2JqZWN0cyBsYXRlciAqLworCXNhdmVfY29tbWl0X2J1ZmZlciA9IDA7CisJaW5pdF9yZXZpc2lvbnMoJnJldnMsIE5VTEwpOworCisJLyogd3JpdGUgcHJlcmVxdWlzaXRlcyAqLworCW1lbWNweShhcmd2X2JvdW5kYXJ5ICsgMywgYXJndiArIDEsIGFyZ2MgKiBzaXplb2YoY29uc3QgY2hhciAqKSk7CisJYXJndl9ib3VuZGFyeVswXSA9ICJyZXYtbGlzdCI7CisJYXJndl9ib3VuZGFyeVsxXSA9ICItLWJvdW5kYXJ5IjsKKwlhcmd2X2JvdW5kYXJ5WzJdID0gIi0tcHJldHR5PW9uZWxpbmUiOworCWFyZ3ZfYm91bmRhcnlbYXJnYyArIDJdID0gTlVMTDsKKwltZW1zZXQoJnJscywgMCwgc2l6ZW9mKHJscykpOworCXJscy5hcmd2ID0gYXJndl9ib3VuZGFyeTsKKwlybHMub3V0ID0gLTE7CisJcmxzLmdpdF9jbWQgPSAxOworCWlmIChzdGFydF9jb21tYW5kKCZybHMpKQorCQlyZXR1cm4gLTE7CisJcmxzX2ZvdXQgPSBmZG9wZW4ocmxzLm91dCwgInIiKTsKKwl3aGlsZSAoZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgcmxzX2ZvdXQpKSB7CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCWlmIChidWZmZXJbMF0gPT0gJy0nKSB7CisJCQl3cml0ZV9vcl9kaWUoYnVuZGxlX2ZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKwkJCWlmICghZ2V0X3NoYTFfaGV4KGJ1ZmZlciArIDEsIHNoYTEpKSB7CisJCQkJc3RydWN0IG9iamVjdCAqb2JqZWN0ID0gcGFyc2Vfb2JqZWN0KHNoYTEpOworCQkJCW9iamVjdC0+ZmxhZ3MgfD0gVU5JTlRFUkVTVElORzsKKwkJCQlhZGRfcGVuZGluZ19vYmplY3QoJnJldnMsIG9iamVjdCwgYnVmZmVyKTsKKwkJCX0KKwkJfSBlbHNlIGlmICghZ2V0X3NoYTFfaGV4KGJ1ZmZlciwgc2hhMSkpIHsKKwkJCXN0cnVjdCBvYmplY3QgKm9iamVjdCA9IHBhcnNlX29iamVjdChzaGExKTsKKwkJCW9iamVjdC0+ZmxhZ3MgfD0gU0hPV047CisJCX0KKwl9CisJZmNsb3NlKHJsc19mb3V0KTsKKwlpZiAoZmluaXNoX2NvbW1hbmQoJnJscykpCisJCXJldHVybiBlcnJvcigicmV2LWxpc3QgZGllZCIpOworCisJLyogd3JpdGUgcmVmZXJlbmNlcyAqLworCWFyZ2MgPSBzZXR1cF9yZXZpc2lvbnMoYXJnYywgYXJndiwgJnJldnMsIE5VTEwpOworCWlmIChhcmdjID4gMSkKKwkJcmV0dXJuIGVycm9yKCJ1bnJlY29nbml6ZWQgYXJndW1lbnQ6ICVzJyIsIGFyZ3ZbMV0pOworCisJZm9yIChpID0gMDsgaSA8IHJldnMucGVuZGluZy5ucjsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3RfYXJyYXlfZW50cnkgKmUgPSByZXZzLnBlbmRpbmcub2JqZWN0cyArIGk7CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCWNoYXIgKnJlZjsKKwkJY29uc3QgY2hhciAqZGlzcGxheV9yZWY7CisJCWludCBmbGFnOworCisJCWlmIChlLT5pdGVtLT5mbGFncyAmIFVOSU5URVJFU1RJTkcpCisJCQljb250aW51ZTsKKwkJaWYgKGR3aW1fcmVmKGUtPm5hbWUsIHN0cmxlbihlLT5uYW1lKSwgc2hhMSwgJnJlZikgIT0gMSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXJlc29sdmVfcmVmKGUtPm5hbWUsIHNoYTEsIDEsICZmbGFnKSkKKwkJCWZsYWcgPSAwOworCQlkaXNwbGF5X3JlZiA9IChmbGFnICYgUkVGX0lTU1lNUkVGKSA/IGUtPm5hbWUgOiByZWY7CisKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoZSByZWZzIHdlIHdyb3RlIG91dCBpcyBjb3JyZWN0OyAtLW1heC1jb3VudCBhbmQKKwkJICogb3RoZXIgbGltaXRpbmcgb3B0aW9ucyBjb3VsZCBoYXZlIHByZXZlbnRlZCBhbGwgdGhlIHRpcHMKKwkJICogZnJvbSBnZXR0aW5nIG91dHB1dC4KKwkJICoKKwkJICogTm9uIGNvbW1pdCBvYmplY3RzIHN1Y2ggYXMgdGFncyBhbmQgYmxvYnMgZG8gbm90IGhhdmUKKwkJICogdGhpcyBpc3N1ZSBhcyB0aGV5IGFyZSBub3QgYWZmZWN0ZWQgYnkgdGhvc2UgZXh0cmEKKwkJICogY29uc3RyYWludHMuCisJCSAqLworCQlpZiAoIShlLT5pdGVtLT5mbGFncyAmIFNIT1dOKSAmJiBlLT5pdGVtLT50eXBlID09IE9CSl9DT01NSVQpIHsKKwkJCXdhcm5pbmcoInJlZiAnJXMnIGlzIGV4Y2x1ZGVkIGJ5IHRoZSByZXYtbGlzdCBvcHRpb25zIiwKKwkJCQllLT5uYW1lKTsKKwkJCWZyZWUocmVmKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIElmIHlvdSBydW4gImdpdCBidW5kbGUgY3JlYXRlIGJuZGwgdjEuMC4udjIuMCIsIHRoZQorCQkgKiBuYW1lIG9mIHRoZSBwb3NpdGl2ZSByZWYgaXMgInYyLjAiIGJ1dCB0aGF0IGlzIHRoZQorCQkgKiBjb21taXQgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IHRoZSB0YWcsIGFuZCBub3QgdGhlIHRhZworCQkgKiBpdHNlbGYuCisJCSAqLworCQlpZiAoaGFzaGNtcChzaGExLCBlLT5pdGVtLT5zaGExKSkgeworCQkJLyoKKwkJCSAqIElzIHRoaXMgdGhlIHBvc2l0aXZlIGVuZCBvZiBhIHJhbmdlIGV4cHJlc3NlZAorCQkJICogaW4gdGVybXMgb2YgYSB0YWcgKGUuZy4gdjIuMCBmcm9tIHRoZSByYW5nZQorCQkJICogInYxLjAuLnYyLjAiKT8KKwkJCSAqLworCQkJc3RydWN0IGNvbW1pdCAqb25lID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2Uoc2hhMSk7CisJCQlzdHJ1Y3Qgb2JqZWN0ICpvYmo7CisKKwkJCWlmIChlLT5pdGVtID09ICYob25lLT5vYmplY3QpKSB7CisJCQkJLyoKKwkJCQkgKiBOZWVkIHRvIGluY2x1ZGUgZS0+bmFtZSBhcyBhbgorCQkJCSAqIGluZGVwZW5kZW50IHJlZiB0byB0aGUgcGFjay1vYmplY3RzCisJCQkJICogaW5wdXQsIHNvIHRoYXQgdGhlIHRhZyBpcyBpbmNsdWRlZAorCQkJCSAqIGluIHRoZSBvdXRwdXQ7IG90aGVyd2lzZSB3ZSB3b3VsZAorCQkJCSAqIGVuZCB1cCB0cmlnZ2VyaW5nICJlbXB0eSBidW5kbGUiCisJCQkJICogZXJyb3IuCisJCQkJICovCisJCQkJb2JqID0gcGFyc2Vfb2JqZWN0KHNoYTEpOworCQkJCW9iai0+ZmxhZ3MgfD0gU0hPV047CisJCQkJYWRkX3BlbmRpbmdfb2JqZWN0KCZyZXZzLCBvYmosIGUtPm5hbWUpOworCQkJfQorCQkJZnJlZShyZWYpOworCQkJY29udGludWU7CisJCX0KKworCQlyZWZfY291bnQrKzsKKwkJd3JpdGVfb3JfZGllKGJ1bmRsZV9mZCwgc2hhMV90b19oZXgoZS0+aXRlbS0+c2hhMSksIDQwKTsKKwkJd3JpdGVfb3JfZGllKGJ1bmRsZV9mZCwgIiAiLCAxKTsKKwkJd3JpdGVfb3JfZGllKGJ1bmRsZV9mZCwgZGlzcGxheV9yZWYsIHN0cmxlbihkaXNwbGF5X3JlZikpOworCQl3cml0ZV9vcl9kaWUoYnVuZGxlX2ZkLCAiXG4iLCAxKTsKKwkJZnJlZShyZWYpOworCX0KKwlpZiAoIXJlZl9jb3VudCkKKwkJZGllICgiUmVmdXNpbmcgdG8gY3JlYXRlIGVtcHR5IGJ1bmRsZS4iKTsKKworCS8qIGVuZCBoZWFkZXIgKi8KKwl3cml0ZV9vcl9kaWUoYnVuZGxlX2ZkLCAiXG4iLCAxKTsKKworCS8qIHdyaXRlIHBhY2sgKi8KKwlhcmd2X3BhY2tbMF0gPSAicGFjay1vYmplY3RzIjsKKwlhcmd2X3BhY2tbMV0gPSAiLS1hbGwtcHJvZ3Jlc3MiOworCWFyZ3ZfcGFja1syXSA9ICItLXN0ZG91dCI7CisJYXJndl9wYWNrWzNdID0gIi0tdGhpbiI7CisJYXJndl9wYWNrWzRdID0gTlVMTDsKKwltZW1zZXQoJnJscywgMCwgc2l6ZW9mKHJscykpOworCXJscy5hcmd2ID0gYXJndl9wYWNrOworCXJscy5pbiA9IC0xOworCXJscy5vdXQgPSBidW5kbGVfZmQ7CisJcmxzLmdpdF9jbWQgPSAxOworCWlmIChzdGFydF9jb21tYW5kKCZybHMpKQorCQlyZXR1cm4gZXJyb3IoIkNvdWxkIG5vdCBzcGF3biBwYWNrLW9iamVjdHMiKTsKKworCS8qCisJICogc3RhcnRfY29tbWFuZCBjbG9zZWQgYnVuZGxlX2ZkIGlmIGl0IHdhcyA+IDEKKwkgKiBzbyBzZXQgdGhlIGxvY2sgZmQgdG8gLTEgc28gY29tbWl0X2xvY2tfZmlsZSgpCisJICogd29uJ3QgZmFpbCB0cnlpbmcgdG8gY2xvc2UgaXQuCisJICovCisJbG9jay5mZCA9IC0xOworCisJZm9yIChpID0gMDsgaSA8IHJldnMucGVuZGluZy5ucjsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3QgKm9iamVjdCA9IHJldnMucGVuZGluZy5vYmplY3RzW2ldLml0ZW07CisJCWlmIChvYmplY3QtPmZsYWdzICYgVU5JTlRFUkVTVElORykKKwkJCXdyaXRlX29yX2RpZShybHMuaW4sICJeIiwgMSk7CisJCXdyaXRlX29yX2RpZShybHMuaW4sIHNoYTFfdG9faGV4KG9iamVjdC0+c2hhMSksIDQwKTsKKwkJd3JpdGVfb3JfZGllKHJscy5pbiwgIlxuIiwgMSk7CisJfQorCWNsb3NlKHJscy5pbik7CisJaWYgKGZpbmlzaF9jb21tYW5kKCZybHMpKQorCQlyZXR1cm4gZXJyb3IgKCJwYWNrLW9iamVjdHMgZGllZCIpOworCWlmICghYnVuZGxlX3RvX3N0ZG91dCkKKwkJY29tbWl0X2xvY2tfZmlsZSgmbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK2ludCB1bmJ1bmRsZShzdHJ1Y3QgYnVuZGxlX2hlYWRlciAqaGVhZGVyLCBpbnQgYnVuZGxlX2ZkKQoreworCWNvbnN0IGNoYXIgKmFyZ3ZfaW5kZXhfcGFja1tdID0geyJpbmRleC1wYWNrIiwKKwkJIi0tZml4LXRoaW4iLCAiLS1zdGRpbiIsIE5VTEx9OworCXN0cnVjdCBjaGlsZF9wcm9jZXNzIGlwOworCisJaWYgKHZlcmlmeV9idW5kbGUoaGVhZGVyLCAwKSkKKwkJcmV0dXJuIC0xOworCW1lbXNldCgmaXAsIDAsIHNpemVvZihpcCkpOworCWlwLmFyZ3YgPSBhcmd2X2luZGV4X3BhY2s7CisJaXAuaW4gPSBidW5kbGVfZmQ7CisJaXAubm9fc3Rkb3V0ID0gMTsKKwlpcC5naXRfY21kID0gMTsKKwlpZiAocnVuX2NvbW1hbmQoJmlwKSkKKwkJcmV0dXJuIGVycm9yKCJpbmRleC1wYWNrIGRpZWQiKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1bmRsZS5oIGIvYnVuZGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJhZWRkNgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZS5oCkBAIC0wLDAgKzEsMjUgQEAKKyNpZm5kZWYgQlVORExFX0gKKyNkZWZpbmUgQlVORExFX0gKKworc3RydWN0IHJlZl9saXN0IHsKKwl1bnNpZ25lZCBpbnQgbnIsIGFsbG9jOworCXN0cnVjdCByZWZfbGlzdF9lbnRyeSB7CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCWNoYXIgKm5hbWU7CisJfSAqbGlzdDsKK307CisKK3N0cnVjdCBidW5kbGVfaGVhZGVyIHsKKwlzdHJ1Y3QgcmVmX2xpc3QgcHJlcmVxdWlzaXRlczsKKwlzdHJ1Y3QgcmVmX2xpc3QgcmVmZXJlbmNlczsKK307CisKK2ludCByZWFkX2J1bmRsZV9oZWFkZXIoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IGJ1bmRsZV9oZWFkZXIgKmhlYWRlcik7CitpbnQgY3JlYXRlX2J1bmRsZShzdHJ1Y3QgYnVuZGxlX2hlYWRlciAqaGVhZGVyLCBjb25zdCBjaGFyICpwYXRoLAorCQlpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpOworaW50IHZlcmlmeV9idW5kbGUoc3RydWN0IGJ1bmRsZV9oZWFkZXIgKmhlYWRlciwgaW50IHZlcmJvc2UpOworaW50IHVuYnVuZGxlKHN0cnVjdCBidW5kbGVfaGVhZGVyICpoZWFkZXIsIGludCBidW5kbGVfZmQpOworaW50IGxpc3RfYnVuZGxlX3JlZnMoc3RydWN0IGJ1bmRsZV9oZWFkZXIgKmhlYWRlciwKKwkJaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jYWNoZS10cmVlLmMgYi9jYWNoZS10cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlkYTU0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NhY2hlLXRyZWUuYwpAQCAtMCwwICsxLDU4NiBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgImNhY2hlLXRyZWUuaCIKKworI2lmbmRlZiBERUJVRworI2RlZmluZSBERUJVRyAwCisjZW5kaWYKKworc3RydWN0IGNhY2hlX3RyZWUgKmNhY2hlX3RyZWUodm9pZCkKK3sKKwlzdHJ1Y3QgY2FjaGVfdHJlZSAqaXQgPSB4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgY2FjaGVfdHJlZSkpOworCWl0LT5lbnRyeV9jb3VudCA9IC0xOworCXJldHVybiBpdDsKK30KKwordm9pZCBjYWNoZV90cmVlX2ZyZWUoc3RydWN0IGNhY2hlX3RyZWUgKippdF9wKQoreworCWludCBpOworCXN0cnVjdCBjYWNoZV90cmVlICppdCA9ICppdF9wOworCisJaWYgKCFpdCkKKwkJcmV0dXJuOworCWZvciAoaSA9IDA7IGkgPCBpdC0+c3VidHJlZV9ucjsgaSsrKQorCQlpZiAoaXQtPmRvd25baV0pCisJCQljYWNoZV90cmVlX2ZyZWUoJml0LT5kb3duW2ldLT5jYWNoZV90cmVlKTsKKwlmcmVlKGl0LT5kb3duKTsKKwlmcmVlKGl0KTsKKwkqaXRfcCA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgc3VidHJlZV9uYW1lX2NtcChjb25zdCBjaGFyICpvbmUsIGludCBvbmVsZW4sCisJCQkgICAgY29uc3QgY2hhciAqdHdvLCBpbnQgdHdvbGVuKQoreworCWlmIChvbmVsZW4gPCB0d29sZW4pCisJCXJldHVybiAtMTsKKwlpZiAodHdvbGVuIDwgb25lbGVuKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gbWVtY21wKG9uZSwgdHdvLCBvbmVsZW4pOworfQorCitzdGF0aWMgaW50IHN1YnRyZWVfcG9zKHN0cnVjdCBjYWNoZV90cmVlICppdCwgY29uc3QgY2hhciAqcGF0aCwgaW50IHBhdGhsZW4pCit7CisJc3RydWN0IGNhY2hlX3RyZWVfc3ViICoqZG93biA9IGl0LT5kb3duOworCWludCBsbywgaGk7CisJbG8gPSAwOworCWhpID0gaXQtPnN1YnRyZWVfbnI7CisJd2hpbGUgKGxvIDwgaGkpIHsKKwkJaW50IG1pID0gKGxvICsgaGkpIC8gMjsKKwkJc3RydWN0IGNhY2hlX3RyZWVfc3ViICptZGwgPSBkb3duW21pXTsKKwkJaW50IGNtcCA9IHN1YnRyZWVfbmFtZV9jbXAocGF0aCwgcGF0aGxlbiwKKwkJCQkJICAgbWRsLT5uYW1lLCBtZGwtPm5hbWVsZW4pOworCQlpZiAoIWNtcCkKKwkJCXJldHVybiBtaTsKKwkJaWYgKGNtcCA8IDApCisJCQloaSA9IG1pOworCQllbHNlCisJCQlsbyA9IG1pICsgMTsKKwl9CisJcmV0dXJuIC1sby0xOworfQorCitzdGF0aWMgc3RydWN0IGNhY2hlX3RyZWVfc3ViICpmaW5kX3N1YnRyZWUoc3RydWN0IGNhY2hlX3RyZWUgKml0LAorCQkJCQkgICBjb25zdCBjaGFyICpwYXRoLAorCQkJCQkgICBpbnQgcGF0aGxlbiwKKwkJCQkJICAgaW50IGNyZWF0ZSkKK3sKKwlzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKmRvd247CisJaW50IHBvcyA9IHN1YnRyZWVfcG9zKGl0LCBwYXRoLCBwYXRobGVuKTsKKwlpZiAoMCA8PSBwb3MpCisJCXJldHVybiBpdC0+ZG93bltwb3NdOworCWlmICghY3JlYXRlKQorCQlyZXR1cm4gTlVMTDsKKworCXBvcyA9IC1wb3MtMTsKKwlpZiAoaXQtPnN1YnRyZWVfYWxsb2MgPD0gaXQtPnN1YnRyZWVfbnIpIHsKKwkJaXQtPnN1YnRyZWVfYWxsb2MgPSBhbGxvY19ucihpdC0+c3VidHJlZV9hbGxvYyk7CisJCWl0LT5kb3duID0geHJlYWxsb2MoaXQtPmRvd24sIGl0LT5zdWJ0cmVlX2FsbG9jICoKKwkJCQkgICAgc2l6ZW9mKCppdC0+ZG93bikpOworCX0KKwlpdC0+c3VidHJlZV9ucisrOworCisJZG93biA9IHhtYWxsb2Moc2l6ZW9mKCpkb3duKSArIHBhdGhsZW4gKyAxKTsKKwlkb3duLT5jYWNoZV90cmVlID0gTlVMTDsKKwlkb3duLT5uYW1lbGVuID0gcGF0aGxlbjsKKwltZW1jcHkoZG93bi0+bmFtZSwgcGF0aCwgcGF0aGxlbik7CisJZG93bi0+bmFtZVtwYXRobGVuXSA9IDA7CisKKwlpZiAocG9zIDwgaXQtPnN1YnRyZWVfbnIpCisJCW1lbW1vdmUoaXQtPmRvd24gKyBwb3MgKyAxLAorCQkJaXQtPmRvd24gKyBwb3MsCisJCQlzaXplb2YoZG93bikgKiAoaXQtPnN1YnRyZWVfbnIgLSBwb3MgLSAxKSk7CisJaXQtPmRvd25bcG9zXSA9IGRvd247CisJcmV0dXJuIGRvd247Cit9CisKK3N0cnVjdCBjYWNoZV90cmVlX3N1YiAqY2FjaGVfdHJlZV9zdWIoc3RydWN0IGNhY2hlX3RyZWUgKml0LCBjb25zdCBjaGFyICpwYXRoKQoreworCWludCBwYXRobGVuID0gc3RybGVuKHBhdGgpOworCXJldHVybiBmaW5kX3N1YnRyZWUoaXQsIHBhdGgsIHBhdGhsZW4sIDEpOworfQorCit2b2lkIGNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKHN0cnVjdCBjYWNoZV90cmVlICppdCwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwkvKiBhL2IvYworCSAqID09PiBpbnZhbGlkYXRlIHNlbGYKKwkgKiA9PT4gZmluZCAiYSIsIGhhdmUgaXQgaW52YWxpZGF0ZSAiYi9jIgorCSAqIGEKKwkgKiA9PT4gaW52YWxpZGF0ZSBzZWxmCisJICogPT0+IGlmICJhIiBleGlzdHMgYXMgYSBzdWJ0cmVlLCByZW1vdmUgaXQuCisJICovCisJY29uc3QgY2hhciAqc2xhc2g7CisJaW50IG5hbWVsZW47CisJc3RydWN0IGNhY2hlX3RyZWVfc3ViICpkb3duOworCisjaWYgREVCVUcKKwlmcHJpbnRmKHN0ZGVyciwgImNhY2hlLXRyZWUgaW52YWxpZGF0ZSA8JXM+XG4iLCBwYXRoKTsKKyNlbmRpZgorCisJaWYgKCFpdCkKKwkJcmV0dXJuOworCXNsYXNoID0gc3RyY2hyKHBhdGgsICcvJyk7CisJaXQtPmVudHJ5X2NvdW50ID0gLTE7CisJaWYgKCFzbGFzaCkgeworCQlpbnQgcG9zOworCQluYW1lbGVuID0gc3RybGVuKHBhdGgpOworCQlwb3MgPSBzdWJ0cmVlX3BvcyhpdCwgcGF0aCwgbmFtZWxlbik7CisJCWlmICgwIDw9IHBvcykgeworCQkJY2FjaGVfdHJlZV9mcmVlKCZpdC0+ZG93bltwb3NdLT5jYWNoZV90cmVlKTsKKwkJCWZyZWUoaXQtPmRvd25bcG9zXSk7CisJCQkvKiAwIDEgMiAzIDQgNQorCQkJICogICAgICAgXiAgICAgXnN1YnRyZWVfbnIgPSA2CisJCQkgKiAgICAgICBwb3MKKwkJCSAqIG1vdmUgNCBhbmQgNSB1cCBvbmUgcGxhY2UgKDIgZW50cmllcykKKwkJCSAqIDIgPSA2IC0gMyAtIDEgPSBzdWJ0cmVlX25yIC0gcG9zIC0gMQorCQkJICovCisJCQltZW1tb3ZlKGl0LT5kb3duK3BvcywgaXQtPmRvd24rcG9zKzEsCisJCQkJc2l6ZW9mKHN0cnVjdCBjYWNoZV90cmVlX3N1YiAqKSAqCisJCQkJKGl0LT5zdWJ0cmVlX25yIC0gcG9zIC0gMSkpOworCQkJaXQtPnN1YnRyZWVfbnItLTsKKwkJfQorCQlyZXR1cm47CisJfQorCW5hbWVsZW4gPSBzbGFzaCAtIHBhdGg7CisJZG93biA9IGZpbmRfc3VidHJlZShpdCwgcGF0aCwgbmFtZWxlbiwgMCk7CisJaWYgKGRvd24pCisJCWNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKGRvd24tPmNhY2hlX3RyZWUsIHNsYXNoICsgMSk7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X2NhY2hlKHN0cnVjdCBjYWNoZV9lbnRyeSAqKmNhY2hlLAorCQkJaW50IGVudHJpZXMpCit7CisJaW50IGksIGZ1bm55OworCisJLyogVmVyaWZ5IHRoYXQgdGhlIHRyZWUgaXMgbWVyZ2VkICovCisJZnVubnkgPSAwOworCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGNhY2hlW2ldOworCQlpZiAoY2Vfc3RhZ2UoY2UpKSB7CisJCQlpZiAoMTAgPCArK2Z1bm55KSB7CisJCQkJZnByaW50ZihzdGRlcnIsICIuLi5cbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJZnByaW50ZihzdGRlcnIsICIlczogdW5tZXJnZWQgKCVzKVxuIiwKKwkJCQljZS0+bmFtZSwgc2hhMV90b19oZXgoY2UtPnNoYTEpKTsKKwkJfQorCX0KKwlpZiAoZnVubnkpCisJCXJldHVybiAtMTsKKworCS8qIEFsc28gdmVyaWZ5IHRoYXQgdGhlIGNhY2hlIGRvZXMgbm90IGhhdmUgcGF0aCBhbmQgcGF0aC9maWxlCisJICogYXQgdGhlIHNhbWUgdGltZS4gIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGUgY2FjaGUgaGFzIG9ubHkKKwkgKiBzdGFnZSAwIGVudHJpZXMuCisJICovCisJZnVubnkgPSAwOworCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzIC0gMTsgaSsrKSB7CisJCS8qIHBhdGgvZmlsZSBhbHdheXMgY29tZXMgYWZ0ZXIgcGF0aCBiZWNhdXNlIG9mIHRoZSB3YXkKKwkJICogdGhlIGNhY2hlIGlzIHNvcnRlZC4gIEFsc28gcGF0aCBjYW4gYXBwZWFyIG9ubHkgb25jZSwKKwkJICogd2hpY2ggbWVhbnMgY29uZmxpY3Rpbmcgb25lIHdvdWxkIGltbWVkaWF0ZWx5IGZvbGxvdy4KKwkJICovCisJCWNvbnN0IGNoYXIgKnRoaXNfbmFtZSA9IGNhY2hlW2ldLT5uYW1lOworCQljb25zdCBjaGFyICpuZXh0X25hbWUgPSBjYWNoZVtpKzFdLT5uYW1lOworCQlpbnQgdGhpc19sZW4gPSBzdHJsZW4odGhpc19uYW1lKTsKKwkJaWYgKHRoaXNfbGVuIDwgc3RybGVuKG5leHRfbmFtZSkgJiYKKwkJICAgIHN0cm5jbXAodGhpc19uYW1lLCBuZXh0X25hbWUsIHRoaXNfbGVuKSA9PSAwICYmCisJCSAgICBuZXh0X25hbWVbdGhpc19sZW5dID09ICcvJykgeworCQkJaWYgKDEwIDwgKytmdW5ueSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiLi4uXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWZwcmludGYoc3RkZXJyLCAiWW91IGhhdmUgYm90aCAlcyBhbmQgJXNcbiIsCisJCQkJdGhpc19uYW1lLCBuZXh0X25hbWUpOworCQl9CisJfQorCWlmIChmdW5ueSkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkaXNjYXJkX3VudXNlZF9zdWJ0cmVlcyhzdHJ1Y3QgY2FjaGVfdHJlZSAqaXQpCit7CisJc3RydWN0IGNhY2hlX3RyZWVfc3ViICoqZG93biA9IGl0LT5kb3duOworCWludCBuciA9IGl0LT5zdWJ0cmVlX25yOworCWludCBkc3QsIHNyYzsKKwlmb3IgKGRzdCA9IHNyYyA9IDA7IHNyYyA8IG5yOyBzcmMrKykgeworCQlzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKnMgPSBkb3duW3NyY107CisJCWlmIChzLT51c2VkKQorCQkJZG93bltkc3QrK10gPSBzOworCQllbHNlIHsKKwkJCWNhY2hlX3RyZWVfZnJlZSgmcy0+Y2FjaGVfdHJlZSk7CisJCQlmcmVlKHMpOworCQkJaXQtPnN1YnRyZWVfbnItLTsKKwkJfQorCX0KK30KKworaW50IGNhY2hlX3RyZWVfZnVsbHlfdmFsaWQoc3RydWN0IGNhY2hlX3RyZWUgKml0KQoreworCWludCBpOworCWlmICghaXQpCisJCXJldHVybiAwOworCWlmIChpdC0+ZW50cnlfY291bnQgPCAwIHx8ICFoYXNfc2hhMV9maWxlKGl0LT5zaGExKSkKKwkJcmV0dXJuIDA7CisJZm9yIChpID0gMDsgaSA8IGl0LT5zdWJ0cmVlX25yOyBpKyspIHsKKwkJaWYgKCFjYWNoZV90cmVlX2Z1bGx5X3ZhbGlkKGl0LT5kb3duW2ldLT5jYWNoZV90cmVlKSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB1cGRhdGVfb25lKHN0cnVjdCBjYWNoZV90cmVlICppdCwKKwkJICAgICAgc3RydWN0IGNhY2hlX2VudHJ5ICoqY2FjaGUsCisJCSAgICAgIGludCBlbnRyaWVzLAorCQkgICAgICBjb25zdCBjaGFyICpiYXNlLAorCQkgICAgICBpbnQgYmFzZWxlbiwKKwkJICAgICAgaW50IG1pc3Npbmdfb2ssCisJCSAgICAgIGludCBkcnlydW4pCit7CisJc3RydWN0IHN0cmJ1ZiBidWZmZXI7CisJaW50IGk7CisKKwlpZiAoMCA8PSBpdC0+ZW50cnlfY291bnQgJiYgaGFzX3NoYTFfZmlsZShpdC0+c2hhMSkpCisJCXJldHVybiBpdC0+ZW50cnlfY291bnQ7CisKKwkvKgorCSAqIFdlIGZpcnN0IHNjYW4gZm9yIHN1YnRyZWVzIGFuZCB1cGRhdGUgdGhlbTsgd2Ugc3RhcnQgYnkKKwkgKiBtYXJraW5nIGV4aXN0aW5nIHN1YnRyZWVzIC0tIHRoZSBvbmVzIHRoYXQgYXJlIHVubWFya2VkCisJICogc2hvdWxkIG5vdCBiZSBpbiB0aGUgcmVzdWx0LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBpdC0+c3VidHJlZV9ucjsgaSsrKQorCQlpdC0+ZG93bltpXS0+dXNlZCA9IDA7CisKKwkvKgorCSAqIEZpbmQgdGhlIHN1YnRyZWVzIGFuZCB1cGRhdGUgdGhlbS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBjYWNoZVtpXTsKKwkJc3RydWN0IGNhY2hlX3RyZWVfc3ViICpzdWI7CisJCWNvbnN0IGNoYXIgKnBhdGgsICpzbGFzaDsKKwkJaW50IHBhdGhsZW4sIHN1Ymxlbiwgc3ViY250OworCisJCXBhdGggPSBjZS0+bmFtZTsKKwkJcGF0aGxlbiA9IGNlX25hbWVsZW4oY2UpOworCQlpZiAocGF0aGxlbiA8PSBiYXNlbGVuIHx8IG1lbWNtcChiYXNlLCBwYXRoLCBiYXNlbGVuKSkKKwkJCWJyZWFrOyAvKiBhdCB0aGUgZW5kIG9mIHRoaXMgbGV2ZWwgKi8KKworCQlzbGFzaCA9IHN0cmNocihwYXRoICsgYmFzZWxlbiwgJy8nKTsKKwkJaWYgKCFzbGFzaCkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBhL2JiYi9jIChiYXNlID0gYS8sIHNsYXNoID0gL2MpCisJCSAqID09PgorCQkgKiBwYXRoK2Jhc2VsZW4gPSBiYmIvYywgc3VibGVuID0gMworCQkgKi8KKwkJc3VibGVuID0gc2xhc2ggLSAocGF0aCArIGJhc2VsZW4pOworCQlzdWIgPSBmaW5kX3N1YnRyZWUoaXQsIHBhdGggKyBiYXNlbGVuLCBzdWJsZW4sIDEpOworCQlpZiAoIXN1Yi0+Y2FjaGVfdHJlZSkKKwkJCXN1Yi0+Y2FjaGVfdHJlZSA9IGNhY2hlX3RyZWUoKTsKKwkJc3ViY250ID0gdXBkYXRlX29uZShzdWItPmNhY2hlX3RyZWUsCisJCQkJICAgIGNhY2hlICsgaSwgZW50cmllcyAtIGksCisJCQkJICAgIHBhdGgsCisJCQkJICAgIGJhc2VsZW4gKyBzdWJsZW4gKyAxLAorCQkJCSAgICBtaXNzaW5nX29rLAorCQkJCSAgICBkcnlydW4pOworCQlpZiAoc3ViY250IDwgMCkKKwkJCXJldHVybiBzdWJjbnQ7CisJCWkgKz0gc3ViY250IC0gMTsKKwkJc3ViLT51c2VkID0gMTsKKwl9CisKKwlkaXNjYXJkX3VudXNlZF9zdWJ0cmVlcyhpdCk7CisKKwkvKgorCSAqIFRoZW4gd3JpdGUgb3V0IHRoZSB0cmVlIG9iamVjdCBmb3IgdGhpcyBsZXZlbC4KKwkgKi8KKwlzdHJidWZfaW5pdCgmYnVmZmVyLCA4MTkyKTsKKworCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGNhY2hlW2ldOworCQlzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKnN1YjsKKwkJY29uc3QgY2hhciAqcGF0aCwgKnNsYXNoOworCQlpbnQgcGF0aGxlbiwgZW50bGVuOworCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExOworCQl1bnNpZ25lZCBtb2RlOworCisJCXBhdGggPSBjZS0+bmFtZTsKKwkJcGF0aGxlbiA9IGNlX25hbWVsZW4oY2UpOworCQlpZiAocGF0aGxlbiA8PSBiYXNlbGVuIHx8IG1lbWNtcChiYXNlLCBwYXRoLCBiYXNlbGVuKSkKKwkJCWJyZWFrOyAvKiBhdCB0aGUgZW5kIG9mIHRoaXMgbGV2ZWwgKi8KKworCQlzbGFzaCA9IHN0cmNocihwYXRoICsgYmFzZWxlbiwgJy8nKTsKKwkJaWYgKHNsYXNoKSB7CisJCQllbnRsZW4gPSBzbGFzaCAtIChwYXRoICsgYmFzZWxlbik7CisJCQlzdWIgPSBmaW5kX3N1YnRyZWUoaXQsIHBhdGggKyBiYXNlbGVuLCBlbnRsZW4sIDApOworCQkJaWYgKCFzdWIpCisJCQkJZGllKCJjYWNoZS10cmVlLmM6ICclLipzJyBpbiAnJXMnIG5vdCBmb3VuZCIsCisJCQkJICAgIGVudGxlbiwgcGF0aCArIGJhc2VsZW4sIHBhdGgpOworCQkJaSArPSBzdWItPmNhY2hlX3RyZWUtPmVudHJ5X2NvdW50IC0gMTsKKwkJCXNoYTEgPSBzdWItPmNhY2hlX3RyZWUtPnNoYTE7CisJCQltb2RlID0gU19JRkRJUjsKKwkJfQorCQllbHNlIHsKKwkJCXNoYTEgPSBjZS0+c2hhMTsKKwkJCW1vZGUgPSBjZS0+Y2VfbW9kZTsKKwkJCWVudGxlbiA9IHBhdGhsZW4gLSBiYXNlbGVuOworCQl9CisJCWlmIChtb2RlICE9IFNfSUZHSVRMSU5LICYmICFtaXNzaW5nX29rICYmICFoYXNfc2hhMV9maWxlKHNoYTEpKQorCQkJcmV0dXJuIGVycm9yKCJpbnZhbGlkIG9iamVjdCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKworCQlpZiAoY2UtPmNlX2ZsYWdzICYgQ0VfUkVNT1ZFKQorCQkJY29udGludWU7IC8qIGVudHJ5IGJlaW5nIHJlbW92ZWQgKi8KKworCQlzdHJidWZfZ3JvdygmYnVmZmVyLCBlbnRsZW4gKyAxMDApOworCQlzdHJidWZfYWRkZigmYnVmZmVyLCAiJW8gJS4qcyVjIiwgbW9kZSwgZW50bGVuLCBwYXRoICsgYmFzZWxlbiwgJ1wwJyk7CisJCXN0cmJ1Zl9hZGQoJmJ1ZmZlciwgc2hhMSwgMjApOworCisjaWYgREVCVUcKKwkJZnByaW50ZihzdGRlcnIsICJjYWNoZS10cmVlIHVwZGF0ZS1vbmUgJW8gJS4qc1xuIiwKKwkJCW1vZGUsIGVudGxlbiwgcGF0aCArIGJhc2VsZW4pOworI2VuZGlmCisJfQorCisJaWYgKGRyeXJ1bikKKwkJaGFzaF9zaGExX2ZpbGUoYnVmZmVyLmJ1ZiwgYnVmZmVyLmxlbiwgdHJlZV90eXBlLCBpdC0+c2hhMSk7CisJZWxzZQorCQl3cml0ZV9zaGExX2ZpbGUoYnVmZmVyLmJ1ZiwgYnVmZmVyLmxlbiwgdHJlZV90eXBlLCBpdC0+c2hhMSk7CisJc3RyYnVmX3JlbGVhc2UoJmJ1ZmZlcik7CisJaXQtPmVudHJ5X2NvdW50ID0gaTsKKyNpZiBERUJVRworCWZwcmludGYoc3RkZXJyLCAiY2FjaGUtdHJlZSB1cGRhdGUtb25lICglZCBlbnQsICVkIHN1YnRyZWUpICVzXG4iLAorCQlpdC0+ZW50cnlfY291bnQsIGl0LT5zdWJ0cmVlX25yLAorCQlzaGExX3RvX2hleChpdC0+c2hhMSkpOworI2VuZGlmCisJcmV0dXJuIGk7Cit9CisKK2ludCBjYWNoZV90cmVlX3VwZGF0ZShzdHJ1Y3QgY2FjaGVfdHJlZSAqaXQsCisJCSAgICAgIHN0cnVjdCBjYWNoZV9lbnRyeSAqKmNhY2hlLAorCQkgICAgICBpbnQgZW50cmllcywKKwkJICAgICAgaW50IG1pc3Npbmdfb2ssCisJCSAgICAgIGludCBkcnlydW4pCit7CisJaW50IGk7CisJaSA9IHZlcmlmeV9jYWNoZShjYWNoZSwgZW50cmllcyk7CisJaWYgKGkpCisJCXJldHVybiBpOworCWkgPSB1cGRhdGVfb25lKGl0LCBjYWNoZSwgZW50cmllcywgIiIsIDAsIG1pc3Npbmdfb2ssIGRyeXJ1bik7CisJaWYgKGkgPCAwKQorCQlyZXR1cm4gaTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfb25lKHN0cnVjdCBzdHJidWYgKmJ1ZmZlciwgc3RydWN0IGNhY2hlX3RyZWUgKml0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIGludCBwYXRobGVuKQoreworCWludCBpOworCisJLyogT25lICJjYWNoZS10cmVlIiBlbnRyeSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nOgorCSAqIHBhdGggKE5VTCB0ZXJtaW5hdGVkKQorCSAqIGVudHJ5X2NvdW50LCBzdWJ0cmVlX25yICgiJWQgJWRcbiIpCisJICogdHJlZS1zaGExIChtaXNzaW5nIGlmIGludmFsaWQpCisJICogc3VidHJlZV9uciAiY2FjaGUtdHJlZSIgZW50cmllcyBmb3Igc3VidHJlZXMuCisJICovCisJc3RyYnVmX2dyb3coYnVmZmVyLCBwYXRobGVuICsgMTAwKTsKKwlzdHJidWZfYWRkKGJ1ZmZlciwgcGF0aCwgcGF0aGxlbik7CisJc3RyYnVmX2FkZGYoYnVmZmVyLCAiJWMlZCAlZFxuIiwgMCwgaXQtPmVudHJ5X2NvdW50LCBpdC0+c3VidHJlZV9ucik7CisKKyNpZiBERUJVRworCWlmICgwIDw9IGl0LT5lbnRyeV9jb3VudCkKKwkJZnByaW50ZihzdGRlcnIsICJjYWNoZS10cmVlIDwlLipzPiAoJWQgZW50LCAlZCBzdWJ0cmVlKSAlc1xuIiwKKwkJCXBhdGhsZW4sIHBhdGgsIGl0LT5lbnRyeV9jb3VudCwgaXQtPnN1YnRyZWVfbnIsCisJCQlzaGExX3RvX2hleChpdC0+c2hhMSkpOworCWVsc2UKKwkJZnByaW50ZihzdGRlcnIsICJjYWNoZS10cmVlIDwlLipzPiAoJWQgc3VidHJlZSkgaW52YWxpZFxuIiwKKwkJCXBhdGhsZW4sIHBhdGgsIGl0LT5zdWJ0cmVlX25yKTsKKyNlbmRpZgorCisJaWYgKDAgPD0gaXQtPmVudHJ5X2NvdW50KSB7CisJCXN0cmJ1Zl9hZGQoYnVmZmVyLCBpdC0+c2hhMSwgMjApOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgaXQtPnN1YnRyZWVfbnI7IGkrKykgeworCQlzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKmRvd24gPSBpdC0+ZG93bltpXTsKKwkJaWYgKGkpIHsKKwkJCXN0cnVjdCBjYWNoZV90cmVlX3N1YiAqcHJldiA9IGl0LT5kb3duW2ktMV07CisJCQlpZiAoc3VidHJlZV9uYW1lX2NtcChkb3duLT5uYW1lLCBkb3duLT5uYW1lbGVuLAorCQkJCQkgICAgIHByZXYtPm5hbWUsIHByZXYtPm5hbWVsZW4pIDw9IDApCisJCQkJZGllKCJmYXRhbCAtIHVuc29ydGVkIGNhY2hlIHN1YnRyZWUiKTsKKwkJfQorCQl3cml0ZV9vbmUoYnVmZmVyLCBkb3duLT5jYWNoZV90cmVlLCBkb3duLT5uYW1lLCBkb3duLT5uYW1lbGVuKTsKKwl9Cit9CisKK3ZvaWQgY2FjaGVfdHJlZV93cml0ZShzdHJ1Y3Qgc3RyYnVmICpzYiwgc3RydWN0IGNhY2hlX3RyZWUgKnJvb3QpCit7CisJd3JpdGVfb25lKHNiLCByb290LCAiIiwgMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2FjaGVfdHJlZSAqcmVhZF9vbmUoY29uc3QgY2hhciAqKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyAqc2l6ZV9wKQoreworCWNvbnN0IGNoYXIgKmJ1ZiA9ICpidWZmZXI7CisJdW5zaWduZWQgbG9uZyBzaXplID0gKnNpemVfcDsKKwljb25zdCBjaGFyICpjcDsKKwljaGFyICplcDsKKwlzdHJ1Y3QgY2FjaGVfdHJlZSAqaXQ7CisJaW50IGksIHN1YnRyZWVfbnI7CisKKwlpdCA9IE5VTEw7CisJLyogc2tpcCBuYW1lLCBidXQgbWFrZSBzdXJlIG5hbWUgZXhpc3RzICovCisJd2hpbGUgKHNpemUgJiYgKmJ1ZikgeworCQlzaXplLS07CisJCWJ1ZisrOworCX0KKwlpZiAoIXNpemUpCisJCWdvdG8gZnJlZV9yZXR1cm47CisJYnVmKys7IHNpemUtLTsKKwlpdCA9IGNhY2hlX3RyZWUoKTsKKworCWNwID0gYnVmOworCWl0LT5lbnRyeV9jb3VudCA9IHN0cnRvbChjcCwgJmVwLCAxMCk7CisJaWYgKGNwID09IGVwKQorCQlnb3RvIGZyZWVfcmV0dXJuOworCWNwID0gZXA7CisJc3VidHJlZV9uciA9IHN0cnRvbChjcCwgJmVwLCAxMCk7CisJaWYgKGNwID09IGVwKQorCQlnb3RvIGZyZWVfcmV0dXJuOworCXdoaWxlIChzaXplICYmICpidWYgJiYgKmJ1ZiAhPSAnXG4nKSB7CisJCXNpemUtLTsKKwkJYnVmKys7CisJfQorCWlmICghc2l6ZSkKKwkJZ290byBmcmVlX3JldHVybjsKKwlidWYrKzsgc2l6ZS0tOworCWlmICgwIDw9IGl0LT5lbnRyeV9jb3VudCkgeworCQlpZiAoc2l6ZSA8IDIwKQorCQkJZ290byBmcmVlX3JldHVybjsKKwkJaGFzaGNweShpdC0+c2hhMSwgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKWJ1Zik7CisJCWJ1ZiArPSAyMDsKKwkJc2l6ZSAtPSAyMDsKKwl9CisKKyNpZiBERUJVRworCWlmICgwIDw9IGl0LT5lbnRyeV9jb3VudCkKKwkJZnByaW50ZihzdGRlcnIsICJjYWNoZS10cmVlIDwlcz4gKCVkIGVudCwgJWQgc3VidHJlZSkgJXNcbiIsCisJCQkqYnVmZmVyLCBpdC0+ZW50cnlfY291bnQsIHN1YnRyZWVfbnIsCisJCQlzaGExX3RvX2hleChpdC0+c2hhMSkpOworCWVsc2UKKwkJZnByaW50ZihzdGRlcnIsICJjYWNoZS10cmVlIDwlcz4gKCVkIHN1YnRyZWVzKSBpbnZhbGlkXG4iLAorCQkJKmJ1ZmZlciwgc3VidHJlZV9ucik7CisjZW5kaWYKKworCS8qCisJICogSnVzdCBhIGhldXJpc3RpYyAtLSB3ZSBkbyBub3QgYWRkIGRpcmVjdG9yaWVzIHRoYXQgb2Z0ZW4gYnV0CisJICogd2UgZG8gbm90IHdhbnQgdG8gaGF2ZSB0byBleHRlbmQgaXQgaW1tZWRpYXRlbHkgd2hlbiB3ZSBkbywKKwkgKiBoZW5jZSArMi4KKwkgKi8KKwlpdC0+c3VidHJlZV9hbGxvYyA9IHN1YnRyZWVfbnIgKyAyOworCWl0LT5kb3duID0geGNhbGxvYyhpdC0+c3VidHJlZV9hbGxvYywgc2l6ZW9mKHN0cnVjdCBjYWNoZV90cmVlX3N1YiAqKSk7CisJZm9yIChpID0gMDsgaSA8IHN1YnRyZWVfbnI7IGkrKykgeworCQkvKiByZWFkIGVhY2ggc3VidHJlZSAqLworCQlzdHJ1Y3QgY2FjaGVfdHJlZSAqc3ViOworCQlzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKnN1YnRyZWU7CisJCWNvbnN0IGNoYXIgKm5hbWUgPSBidWY7CisKKwkJc3ViID0gcmVhZF9vbmUoJmJ1ZiwgJnNpemUpOworCQlpZiAoIXN1YikKKwkJCWdvdG8gZnJlZV9yZXR1cm47CisJCXN1YnRyZWUgPSBjYWNoZV90cmVlX3N1YihpdCwgbmFtZSk7CisJCXN1YnRyZWUtPmNhY2hlX3RyZWUgPSBzdWI7CisJfQorCWlmIChzdWJ0cmVlX25yICE9IGl0LT5zdWJ0cmVlX25yKQorCQlkaWUoImNhY2hlLXRyZWU6IGludGVybmFsIGVycm9yIik7CisJKmJ1ZmZlciA9IGJ1ZjsKKwkqc2l6ZV9wID0gc2l6ZTsKKwlyZXR1cm4gaXQ7CisKKyBmcmVlX3JldHVybjoKKwljYWNoZV90cmVlX2ZyZWUoJml0KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGNhY2hlX3RyZWUgKmNhY2hlX3RyZWVfcmVhZChjb25zdCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpZiAoYnVmZmVyWzBdKQorCQlyZXR1cm4gTlVMTDsgLyogbm90IHRoZSB3aG9sZSB0cmVlICovCisJcmV0dXJuIHJlYWRfb25lKCZidWZmZXIsICZzaXplKTsKK30KKworc3RydWN0IGNhY2hlX3RyZWUgKmNhY2hlX3RyZWVfZmluZChzdHJ1Y3QgY2FjaGVfdHJlZSAqaXQsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJd2hpbGUgKCpwYXRoKSB7CisJCWNvbnN0IGNoYXIgKnNsYXNoOworCQlzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKnN1YjsKKworCQlzbGFzaCA9IHN0cmNocihwYXRoLCAnLycpOworCQlpZiAoIXNsYXNoKQorCQkJc2xhc2ggPSBwYXRoICsgc3RybGVuKHBhdGgpOworCQkvKiBiZXR3ZWVuIHBhdGggYW5kIHNsYXNoIGlzIHRoZSBuYW1lIG9mIHRoZQorCQkgKiBzdWJ0cmVlIHRvIGxvb2sgZm9yLgorCQkgKi8KKwkJc3ViID0gZmluZF9zdWJ0cmVlKGl0LCBwYXRoLCBzbGFzaCAtIHBhdGgsIDApOworCQlpZiAoIXN1YikKKwkJCXJldHVybiBOVUxMOworCQlpdCA9IHN1Yi0+Y2FjaGVfdHJlZTsKKwkJaWYgKHNsYXNoKQorCQkJd2hpbGUgKCpzbGFzaCAmJiAqc2xhc2ggPT0gJy8nKQorCQkJCXNsYXNoKys7CisJCWlmICghc2xhc2ggfHwgISpzbGFzaCkKKwkJCXJldHVybiBpdDsgLyogcHJlZml4IGVuZGVkIHdpdGggc2xhc2hlcyAqLworCQlwYXRoID0gc2xhc2g7CisJfQorCXJldHVybiBpdDsKK30KKworaW50IHdyaXRlX2NhY2hlX2FzX3RyZWUodW5zaWduZWQgY2hhciAqc2hhMSwgaW50IG1pc3Npbmdfb2ssIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgZW50cmllcywgd2FzX3ZhbGlkLCBuZXdmZDsKKworCS8qCisJICogV2UgY2FuJ3QgZnJlZSB0aGlzIG1lbW9yeSwgaXQgYmVjb21lcyBwYXJ0IG9mIGEgbGlua2VkIGxpc3QKKwkgKiBwYXJzZWQgYXRleGl0KCkKKwkgKi8KKwlzdHJ1Y3QgbG9ja19maWxlICpsb2NrX2ZpbGUgPSB4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgbG9ja19maWxlKSk7CisKKwluZXdmZCA9IGhvbGRfbG9ja2VkX2luZGV4KGxvY2tfZmlsZSwgMSk7CisKKwllbnRyaWVzID0gcmVhZF9jYWNoZSgpOworCWlmIChlbnRyaWVzIDwgMCkKKwkJcmV0dXJuIFdSSVRFX1RSRUVfVU5SRUFEQUJMRV9JTkRFWDsKKworCWlmICghYWN0aXZlX2NhY2hlX3RyZWUpCisJCWFjdGl2ZV9jYWNoZV90cmVlID0gY2FjaGVfdHJlZSgpOworCisJd2FzX3ZhbGlkID0gY2FjaGVfdHJlZV9mdWxseV92YWxpZChhY3RpdmVfY2FjaGVfdHJlZSk7CisKKwlpZiAoIXdhc192YWxpZCkgeworCQlpZiAoY2FjaGVfdHJlZV91cGRhdGUoYWN0aXZlX2NhY2hlX3RyZWUsCisJCQkJICAgICAgYWN0aXZlX2NhY2hlLCBhY3RpdmVfbnIsCisJCQkJICAgICAgbWlzc2luZ19vaywgMCkgPCAwKQorCQkJcmV0dXJuIFdSSVRFX1RSRUVfVU5NRVJHRURfSU5ERVg7CisJCWlmICgwIDw9IG5ld2ZkKSB7CisJCQlpZiAoIXdyaXRlX2NhY2hlKG5ld2ZkLCBhY3RpdmVfY2FjaGUsIGFjdGl2ZV9ucikgJiYKKwkJCSAgICAhY29tbWl0X2xvY2tfZmlsZShsb2NrX2ZpbGUpKQorCQkJCW5ld2ZkID0gLTE7CisJCX0KKwkJLyogTm90IGJlaW5nIGFibGUgdG8gd3JpdGUgaXMgZmluZSAtLSB3ZSBhcmUgb25seSBpbnRlcmVzdGVkCisJCSAqIGluIHVwZGF0aW5nIHRoZSBjYWNoZS10cmVlIHBhcnQsIGFuZCBpZiB0aGUgbmV4dCBjYWxsZXIKKwkJICogZW5kcyB1cCB1c2luZyB0aGUgb2xkIGluZGV4IHdpdGggdW51cGRhdGVkIGNhY2hlLXRyZWUgcGFydAorCQkgKiBpdCBtaXNzZXMgdGhlIHdvcmsgd2UgZGlkIGhlcmUsIGJ1dCB0aGF0IGlzIGp1c3QgYQorCQkgKiBwZXJmb3JtYW5jZSBwZW5hbHR5IGFuZCBub3QgYSBiaWcgZGVhbC4KKwkJICovCisJfQorCisJaWYgKHByZWZpeCkgeworCQlzdHJ1Y3QgY2FjaGVfdHJlZSAqc3VidHJlZSA9CisJCQljYWNoZV90cmVlX2ZpbmQoYWN0aXZlX2NhY2hlX3RyZWUsIHByZWZpeCk7CisJCWlmICghc3VidHJlZSkKKwkJCXJldHVybiBXUklURV9UUkVFX1BSRUZJWF9FUlJPUjsKKwkJaGFzaGNweShzaGExLCBzdWJ0cmVlLT5zaGExKTsKKwl9CisJZWxzZQorCQloYXNoY3B5KHNoYTEsIGFjdGl2ZV9jYWNoZV90cmVlLT5zaGExKTsKKworCWlmICgwIDw9IG5ld2ZkKQorCQlyb2xsYmFja19sb2NrX2ZpbGUobG9ja19maWxlKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY2FjaGUtdHJlZS5oIGIvY2FjaGUtdHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YWFkNDIKLS0tIC9kZXYvbnVsbAorKysgYi9jYWNoZS10cmVlLmgKQEAgLTAsMCArMSwzOCBAQAorI2lmbmRlZiBDQUNIRV9UUkVFX0gKKyNkZWZpbmUgQ0FDSEVfVFJFRV9ICisKK3N0cnVjdCBjYWNoZV90cmVlOworc3RydWN0IGNhY2hlX3RyZWVfc3ViIHsKKwlzdHJ1Y3QgY2FjaGVfdHJlZSAqY2FjaGVfdHJlZTsKKwlpbnQgbmFtZWxlbjsKKwlpbnQgdXNlZDsKKwljaGFyIG5hbWVbRkxFWF9BUlJBWV07Cit9OworCitzdHJ1Y3QgY2FjaGVfdHJlZSB7CisJaW50IGVudHJ5X2NvdW50OyAvKiBuZWdhdGl2ZSBtZWFucyAiaW52YWxpZCIgKi8KKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWludCBzdWJ0cmVlX25yOworCWludCBzdWJ0cmVlX2FsbG9jOworCXN0cnVjdCBjYWNoZV90cmVlX3N1YiAqKmRvd247Cit9OworCitzdHJ1Y3QgY2FjaGVfdHJlZSAqY2FjaGVfdHJlZSh2b2lkKTsKK3ZvaWQgY2FjaGVfdHJlZV9mcmVlKHN0cnVjdCBjYWNoZV90cmVlICoqKTsKK3ZvaWQgY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoc3RydWN0IGNhY2hlX3RyZWUgKiwgY29uc3QgY2hhciAqKTsKK3N0cnVjdCBjYWNoZV90cmVlX3N1YiAqY2FjaGVfdHJlZV9zdWIoc3RydWN0IGNhY2hlX3RyZWUgKiwgY29uc3QgY2hhciAqKTsKKwordm9pZCBjYWNoZV90cmVlX3dyaXRlKHN0cnVjdCBzdHJidWYgKiwgc3RydWN0IGNhY2hlX3RyZWUgKnJvb3QpOworc3RydWN0IGNhY2hlX3RyZWUgKmNhY2hlX3RyZWVfcmVhZChjb25zdCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CisKK2ludCBjYWNoZV90cmVlX2Z1bGx5X3ZhbGlkKHN0cnVjdCBjYWNoZV90cmVlICopOworaW50IGNhY2hlX3RyZWVfdXBkYXRlKHN0cnVjdCBjYWNoZV90cmVlICosIHN0cnVjdCBjYWNoZV9lbnRyeSAqKiwgaW50LCBpbnQsIGludCk7CisKK3N0cnVjdCBjYWNoZV90cmVlICpjYWNoZV90cmVlX2ZpbmQoc3RydWN0IGNhY2hlX3RyZWUgKiwgY29uc3QgY2hhciAqKTsKKworI2RlZmluZSBXUklURV9UUkVFX1VOUkVBREFCTEVfSU5ERVggKC0xKQorI2RlZmluZSBXUklURV9UUkVFX1VOTUVSR0VEX0lOREVYICgtMikKKyNkZWZpbmUgV1JJVEVfVFJFRV9QUkVGSVhfRVJST1IgKC0zKQorCitpbnQgd3JpdGVfY2FjaGVfYXNfdHJlZSh1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgbWlzc2luZ19vaywgY29uc3QgY2hhciAqcHJlZml4KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY2FjaGUuaCBiL2NhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExZTdlYwotLS0gL2Rldi9udWxsCisrKyBiL2NhY2hlLmgKQEAgLTAsMCArMSw3ODkgQEAKKyNpZm5kZWYgQ0FDSEVfSAorI2RlZmluZSBDQUNIRV9ICisKKyNpbmNsdWRlICJnaXQtY29tcGF0LXV0aWwuaCIKKyNpbmNsdWRlICJzdHJidWYuaCIKKyNpbmNsdWRlICJoYXNoLmgiCisKKyNpbmNsdWRlIFNIQTFfSEVBREVSCisjaW5jbHVkZSA8emxpYi5oPgorCisjaWYgZGVmaW5lZChOT19ERUZMQVRFX0JPVU5EKSB8fCBaTElCX1ZFUk5VTSA8IDB4MTIwMAorI2RlZmluZSBkZWZsYXRlQm91bmQoYyxzKSAgKChzKSArICgoKHMpICsgNykgPj4gMykgKyAoKChzKSArIDYzKSA+PiA2KSArIDExKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERUX1VOS05PV04pICYmICFkZWZpbmVkKE5PX0RfVFlQRV9JTl9ESVJFTlQpCisjZGVmaW5lIERUWVBFKGRlKQkoKGRlKS0+ZF90eXBlKQorI2Vsc2UKKyN1bmRlZiBEVF9VTktOT1dOCisjdW5kZWYgRFRfRElSCisjdW5kZWYgRFRfUkVHCisjdW5kZWYgRFRfTE5LCisjZGVmaW5lIERUX1VOS05PV04JMAorI2RlZmluZSBEVF9ESVIJCTEKKyNkZWZpbmUgRFRfUkVHCQkyCisjZGVmaW5lIERUX0xOSwkJMworI2RlZmluZSBEVFlQRShkZSkJRFRfVU5LTk9XTgorI2VuZGlmCisKKy8qIHVua25vd24gbW9kZSAoaW1wb3NzaWJsZSBjb21iaW5hdGlvbiBTX0lGSUZPfFNfSUZDSFIpICovCisjZGVmaW5lIFNfSUZJTlZBTElEICAgICAwMDMwMDAwCisKKy8qCisgKiBBICJkaXJlY3RvcnkgbGluayIgaXMgYSBsaW5rIHRvIGFub3RoZXIgZ2l0IGRpcmVjdG9yeS4KKyAqCisgKiBUaGUgdmFsdWUgMDE2MDAwMCBpcyBub3Qgbm9ybWFsbHkgYSB2YWxpZCBtb2RlLCBhbmQKKyAqIGFsc28ganVzdCBoYXBwZW5zIHRvIGJlIFNfSUZESVIgKyBTX0lGTE5LCisgKgorICogTk9URSEgV2UgKnJlYWxseSogc2hvdWxkbid0IGRlcGVuZCBvbiB0aGUgU19JRnh4eCBtYWNyb3MKKyAqIGFsd2F5cyBoYXZpbmcgdGhlIHNhbWUgdmFsdWVzIGV2ZXJ5d2hlcmUuIFdlIHNob3VsZCB1c2UKKyAqIG91ciBpbnRlcm5hbCBnaXQgdmFsdWVzIGZvciB0aGVzZSB0aGluZ3MsIGFuZCB0aGVuIHdlIGNhbgorICogdHJhbnNsYXRlIHRoYXQgdG8gdGhlIE9TLXNwZWNpZmljIHZhbHVlLiBJdCBqdXN0IHNvCisgKiBoYXBwZW5zIHRoYXQgZXZlcnlib2R5IHNoYXJlcyB0aGUgc2FtZSBiaXQgcmVwcmVzZW50YXRpb24KKyAqIGluIHRoZSBVTklYIHdvcmxkIChhbmQgYXBwYXJlbnRseSB3aWRlciB0b28uLikKKyAqLworI2RlZmluZSBTX0lGR0lUTElOSwkwMTYwMDAwCisjZGVmaW5lIFNfSVNHSVRMSU5LKG0pCSgoKG0pICYgU19JRk1UKSA9PSBTX0lGR0lUTElOSykKKworLyoKKyAqIEludGVuc2l2ZSByZXNlYXJjaCBvdmVyIHRoZSBjb3Vyc2Ugb2YgbWFueSB5ZWFycyBoYXMgc2hvd24gdGhhdAorICogcG9ydCA5NDE4IGlzIHRvdGFsbHkgdW51c2VkIGJ5IGFueXRoaW5nIGVsc2UuIE9yCisgKgorICoJWW91ciBzZWFyY2ggLSAicG9ydCA5NDE4IiAtIGRpZCBub3QgbWF0Y2ggYW55IGRvY3VtZW50cy4KKyAqCisgKiBhcyB3d3cuZ29vZ2xlLmNvbSBwdXRzIGl0LgorICoKKyAqIFRoaXMgcG9ydCBoYXMgYmVlbiBwcm9wZXJseSBhc3NpZ25lZCBmb3IgZ2l0IHVzZSBieSBJQU5BOgorICogZ2l0IChBc3NpZ25lZC05NDE4KSBbSTA2LTA1MDcyOC0wMDAxXS4KKyAqCisgKglnaXQgIDk0MTgvdGNwICAgZ2l0IHBhY2sgdHJhbnNmZXIgc2VydmljZQorICoJZ2l0ICA5NDE4L3VkcCAgIGdpdCBwYWNrIHRyYW5zZmVyIHNlcnZpY2UKKyAqCisgKiB3aXRoIExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4gYXMgdGhlIHBvaW50IG9mCisgKiBjb250YWN0LiBTZXB0ZW1iZXIgMjAwNS4KKyAqCisgKiBTZWUgaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9wb3J0LW51bWJlcnMKKyAqLworI2RlZmluZSBERUZBVUxUX0dJVF9QT1JUIDk0MTgKKworLyoKKyAqIEJhc2ljIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhlIGRpcmVjdG9yeSBjYWNoZQorICovCisKKyNkZWZpbmUgQ0FDSEVfU0lHTkFUVVJFIDB4NDQ0OTUyNDMJLyogIkRJUkMiICovCitzdHJ1Y3QgY2FjaGVfaGVhZGVyIHsKKwl1bnNpZ25lZCBpbnQgaGRyX3NpZ25hdHVyZTsKKwl1bnNpZ25lZCBpbnQgaGRyX3ZlcnNpb247CisJdW5zaWduZWQgaW50IGhkcl9lbnRyaWVzOworfTsKKworLyoKKyAqIFRoZSAiY2FjaGVfdGltZSIgaXMganVzdCB0aGUgbG93IDMyIGJpdHMgb2YgdGhlCisgKiB0aW1lLiBJdCBkb2Vzbid0IG1hdHRlciBpZiBpdCBvdmVyZmxvd3MgLSB3ZSBvbmx5CisgKiBjaGVjayBpdCBmb3IgZXF1YWxpdHkgaW4gdGhlIDMyIGJpdHMgd2Ugc2F2ZS4KKyAqLworc3RydWN0IGNhY2hlX3RpbWUgeworCXVuc2lnbmVkIGludCBzZWM7CisJdW5zaWduZWQgaW50IG5zZWM7Cit9OworCisvKgorICogZGV2L2luby91aWQvZ2lkL3NpemUgYXJlIGFsc28ganVzdCB0cmFja2VkIHRvIHRoZSBsb3cgMzIgYml0cworICogQWdhaW4gLSB0aGlzIGlzIGp1c3QgYSAodmVyeSBzdHJvbmcgaW4gcHJhY3RpY2UpIGhldXJpc3RpYyB0aGF0CisgKiB0aGUgaW5vZGUgaGFzbid0IGNoYW5nZWQuCisgKgorICogV2Ugc2F2ZSB0aGUgZmllbGRzIGluIGJpZy1lbmRpYW4gb3JkZXIgdG8gYWxsb3cgdXNpbmcgdGhlCisgKiBpbmRleCBmaWxlIG92ZXIgTkZTIHRyYW5zcGFyZW50bHkuCisgKi8KK3N0cnVjdCBvbmRpc2tfY2FjaGVfZW50cnkgeworCXN0cnVjdCBjYWNoZV90aW1lIGN0aW1lOworCXN0cnVjdCBjYWNoZV90aW1lIG10aW1lOworCXVuc2lnbmVkIGludCBkZXY7CisJdW5zaWduZWQgaW50IGlubzsKKwl1bnNpZ25lZCBpbnQgbW9kZTsKKwl1bnNpZ25lZCBpbnQgdWlkOworCXVuc2lnbmVkIGludCBnaWQ7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwl1bnNpZ25lZCBzaG9ydCBmbGFnczsKKwljaGFyIG5hbWVbRkxFWF9BUlJBWV07IC8qIG1vcmUgKi8KK307CisKK3N0cnVjdCBjYWNoZV9lbnRyeSB7CisJdW5zaWduZWQgaW50IGNlX2N0aW1lOworCXVuc2lnbmVkIGludCBjZV9tdGltZTsKKwl1bnNpZ25lZCBpbnQgY2VfZGV2OworCXVuc2lnbmVkIGludCBjZV9pbm87CisJdW5zaWduZWQgaW50IGNlX21vZGU7CisJdW5zaWduZWQgaW50IGNlX3VpZDsKKwl1bnNpZ25lZCBpbnQgY2VfZ2lkOworCXVuc2lnbmVkIGludCBjZV9zaXplOworCXVuc2lnbmVkIGludCBjZV9mbGFnczsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqbmV4dDsKKwljaGFyIG5hbWVbRkxFWF9BUlJBWV07IC8qIG1vcmUgKi8KK307CisKKyNkZWZpbmUgQ0VfTkFNRU1BU0sgICgweDBmZmYpCisjZGVmaW5lIENFX1NUQUdFTUFTSyAoMHgzMDAwKQorI2RlZmluZSBDRV9WQUxJRCAgICAgKDB4ODAwMCkKKyNkZWZpbmUgQ0VfU1RBR0VTSElGVCAxMgorCisvKiBJbi1tZW1vcnkgb25seSAqLworI2RlZmluZSBDRV9VUERBVEUgICAgKDB4MTAwMDApCisjZGVmaW5lIENFX1JFTU9WRSAgICAoMHgyMDAwMCkKKyNkZWZpbmUgQ0VfVVBUT0RBVEUgICgweDQwMDAwKQorCisjZGVmaW5lIENFX0hBU0hFRCAgICAoMHgxMDAwMDApCisjZGVmaW5lIENFX1VOSEFTSEVEICAoMHgyMDAwMDApCisKKy8qCisgKiBDb3B5IHRoZSBzaGExIGFuZCBzdGF0IHN0YXRlIG9mIGEgY2FjaGUgZW50cnkgZnJvbSBvbmUgdG8KKyAqIGFub3RoZXIuIEJ1dCB3ZSBuZXZlciBjaGFuZ2UgdGhlIG5hbWUsIG9yIHRoZSBoYXNoIHN0YXRlIQorICovCisjZGVmaW5lIENFX1NUQVRFX01BU0sgKENFX0hBU0hFRCB8IENFX1VOSEFTSEVEKQorc3RhdGljIGlubGluZSB2b2lkIGNvcHlfY2FjaGVfZW50cnkoc3RydWN0IGNhY2hlX2VudHJ5ICpkc3QsIHN0cnVjdCBjYWNoZV9lbnRyeSAqc3JjKQoreworCXVuc2lnbmVkIGludCBzdGF0ZSA9IGRzdC0+Y2VfZmxhZ3MgJiBDRV9TVEFURV9NQVNLOworCisJLyogRG9uJ3QgY29weSBoYXNoIGNoYWluIGFuZCBuYW1lICovCisJbWVtY3B5KGRzdCwgc3JjLCBvZmZzZXRvZihzdHJ1Y3QgY2FjaGVfZW50cnksIG5leHQpKTsKKworCS8qIFJlc3RvcmUgdGhlIGhhc2ggc3RhdGUgKi8KKwlkc3QtPmNlX2ZsYWdzID0gKGRzdC0+Y2VfZmxhZ3MgJiB+Q0VfU1RBVEVfTUFTSykgfCBzdGF0ZTsKK30KKworLyoKKyAqIFdlIGRvbid0IGFjdHVhbGx5ICpyZW1vdmUqIGl0LCB3ZSBjYW4ganVzdCBtYXJrIGl0IGludmFsaWQgc28gdGhhdAorICogd2Ugd29uJ3QgZmluZCBpdCBpbiBsb29rdXBzLgorICoKKyAqIE5vdCBvbmx5IHdvdWxkIHdlIGhhdmUgdG8gc2VhcmNoIHRoZSBsaXN0cyAoc2ltcGxlIGVub3VnaCksIGJ1dAorICogd2UnZCBhbHNvIGhhdmUgdG8gcmVoYXNoIG90aGVyIGhhc2ggYnVja2V0cyBpbiBjYXNlIHRoaXMgbWFrZXMgdGhlCisgKiBoYXNoIGJ1Y2tldCBlbXB0eSAoY29tbW9uKS4gU28gaXQncyBtdWNoIGJldHRlciB0byBqdXN0IG1hcmsKKyAqIGl0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmVtb3ZlX2luZGV4X2VudHJ5KHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UpCit7CisJY2UtPmNlX2ZsYWdzIHw9IENFX1VOSEFTSEVEOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNyZWF0ZV9jZV9mbGFncyhzaXplX3QgbGVuLCB1bnNpZ25lZCBzdGFnZSkKK3sKKwlpZiAobGVuID49IENFX05BTUVNQVNLKQorCQlsZW4gPSBDRV9OQU1FTUFTSzsKKwlyZXR1cm4gKGxlbiB8IChzdGFnZSA8PCBDRV9TVEFHRVNISUZUKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGNlX25hbWVsZW4oY29uc3Qgc3RydWN0IGNhY2hlX2VudHJ5ICpjZSkKK3sKKwlzaXplX3QgbGVuID0gY2UtPmNlX2ZsYWdzICYgQ0VfTkFNRU1BU0s7CisJaWYgKGxlbiA8IENFX05BTUVNQVNLKQorCQlyZXR1cm4gbGVuOworCXJldHVybiBzdHJsZW4oY2UtPm5hbWUgKyBDRV9OQU1FTUFTSykgKyBDRV9OQU1FTUFTSzsKK30KKworI2RlZmluZSBjZV9zaXplKGNlKSBjYWNoZV9lbnRyeV9zaXplKGNlX25hbWVsZW4oY2UpKQorI2RlZmluZSBvbmRpc2tfY2Vfc2l6ZShjZSkgb25kaXNrX2NhY2hlX2VudHJ5X3NpemUoY2VfbmFtZWxlbihjZSkpCisjZGVmaW5lIGNlX3N0YWdlKGNlKSAoKENFX1NUQUdFTUFTSyAmIChjZSktPmNlX2ZsYWdzKSA+PiBDRV9TVEFHRVNISUZUKQorI2RlZmluZSBjZV91cHRvZGF0ZShjZSkgKChjZSktPmNlX2ZsYWdzICYgQ0VfVVBUT0RBVEUpCisjZGVmaW5lIGNlX21hcmtfdXB0b2RhdGUoY2UpICgoY2UpLT5jZV9mbGFncyB8PSBDRV9VUFRPREFURSkKKworI2RlZmluZSBjZV9wZXJtaXNzaW9ucyhtb2RlKSAoKChtb2RlKSAmIDAxMDApID8gMDc1NSA6IDA2NDQpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcmVhdGVfY2VfbW9kZSh1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwlpZiAoU19JU0xOSyhtb2RlKSkKKwkJcmV0dXJuIFNfSUZMTks7CisJaWYgKFNfSVNESVIobW9kZSkgfHwgU19JU0dJVExJTksobW9kZSkpCisJCXJldHVybiBTX0lGR0lUTElOSzsKKwlyZXR1cm4gU19JRlJFRyB8IGNlX3Blcm1pc3Npb25zKG1vZGUpOworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2VfbW9kZV9mcm9tX3N0YXQoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgdW5zaWduZWQgaW50IG1vZGUpCit7CisJZXh0ZXJuIGludCB0cnVzdF9leGVjdXRhYmxlX2JpdCwgaGFzX3N5bWxpbmtzOworCWlmICghaGFzX3N5bWxpbmtzICYmIFNfSVNSRUcobW9kZSkgJiYKKwkgICAgY2UgJiYgU19JU0xOSyhjZS0+Y2VfbW9kZSkpCisJCXJldHVybiBjZS0+Y2VfbW9kZTsKKwlpZiAoIXRydXN0X2V4ZWN1dGFibGVfYml0ICYmIFNfSVNSRUcobW9kZSkpIHsKKwkJaWYgKGNlICYmIFNfSVNSRUcoY2UtPmNlX21vZGUpKQorCQkJcmV0dXJuIGNlLT5jZV9tb2RlOworCQlyZXR1cm4gY3JlYXRlX2NlX21vZGUoMDY2Nik7CisJfQorCXJldHVybiBjcmVhdGVfY2VfbW9kZShtb2RlKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGNlX3RvX2R0eXBlKGNvbnN0IHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UpCit7CisJdW5zaWduZWQgY2VfbW9kZSA9IG50b2hsKGNlLT5jZV9tb2RlKTsKKwlpZiAoU19JU1JFRyhjZV9tb2RlKSkKKwkJcmV0dXJuIERUX1JFRzsKKwllbHNlIGlmIChTX0lTRElSKGNlX21vZGUpIHx8IFNfSVNHSVRMSU5LKGNlX21vZGUpKQorCQlyZXR1cm4gRFRfRElSOworCWVsc2UgaWYgKFNfSVNMTksoY2VfbW9kZSkpCisJCXJldHVybiBEVF9MTks7CisJZWxzZQorCQlyZXR1cm4gRFRfVU5LTk9XTjsKK30KKyNkZWZpbmUgY2Fub25fbW9kZShtb2RlKSBcCisJKFNfSVNSRUcobW9kZSkgPyAoU19JRlJFRyB8IGNlX3Blcm1pc3Npb25zKG1vZGUpKSA6IFwKKwlTX0lTTE5LKG1vZGUpID8gU19JRkxOSyA6IFNfSVNESVIobW9kZSkgPyBTX0lGRElSIDogU19JRkdJVExJTkspCisKKyNkZWZpbmUgY2FjaGVfZW50cnlfc2l6ZShsZW4pICgob2Zmc2V0b2Yoc3RydWN0IGNhY2hlX2VudHJ5LG5hbWUpICsgKGxlbikgKyA4KSAmIH43KQorI2RlZmluZSBvbmRpc2tfY2FjaGVfZW50cnlfc2l6ZShsZW4pICgob2Zmc2V0b2Yoc3RydWN0IG9uZGlza19jYWNoZV9lbnRyeSxuYW1lKSArIChsZW4pICsgOCkgJiB+NykKKworc3RydWN0IGluZGV4X3N0YXRlIHsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKipjYWNoZTsKKwl1bnNpZ25lZCBpbnQgY2FjaGVfbnIsIGNhY2hlX2FsbG9jLCBjYWNoZV9jaGFuZ2VkOworCXN0cnVjdCBjYWNoZV90cmVlICpjYWNoZV90cmVlOworCXRpbWVfdCB0aW1lc3RhbXA7CisJdm9pZCAqYWxsb2M7CisJdW5zaWduZWQgbmFtZV9oYXNoX2luaXRpYWxpemVkIDogMTsKKwlzdHJ1Y3QgaGFzaF90YWJsZSBuYW1lX2hhc2g7Cit9OworCitleHRlcm4gc3RydWN0IGluZGV4X3N0YXRlIHRoZV9pbmRleDsKKworI2lmbmRlZiBOT19USEVfSU5ERVhfQ09NUEFUSUJJTElUWV9NQUNST1MKKyNkZWZpbmUgYWN0aXZlX2NhY2hlICh0aGVfaW5kZXguY2FjaGUpCisjZGVmaW5lIGFjdGl2ZV9uciAodGhlX2luZGV4LmNhY2hlX25yKQorI2RlZmluZSBhY3RpdmVfYWxsb2MgKHRoZV9pbmRleC5jYWNoZV9hbGxvYykKKyNkZWZpbmUgYWN0aXZlX2NhY2hlX2NoYW5nZWQgKHRoZV9pbmRleC5jYWNoZV9jaGFuZ2VkKQorI2RlZmluZSBhY3RpdmVfY2FjaGVfdHJlZSAodGhlX2luZGV4LmNhY2hlX3RyZWUpCisKKyNkZWZpbmUgcmVhZF9jYWNoZSgpIHJlYWRfaW5kZXgoJnRoZV9pbmRleCkKKyNkZWZpbmUgcmVhZF9jYWNoZV9mcm9tKHBhdGgpIHJlYWRfaW5kZXhfZnJvbSgmdGhlX2luZGV4LCAocGF0aCkpCisjZGVmaW5lIHdyaXRlX2NhY2hlKG5ld2ZkLCBjYWNoZSwgZW50cmllcykgd3JpdGVfaW5kZXgoJnRoZV9pbmRleCwgKG5ld2ZkKSkKKyNkZWZpbmUgZGlzY2FyZF9jYWNoZSgpIGRpc2NhcmRfaW5kZXgoJnRoZV9pbmRleCkKKyNkZWZpbmUgdW5tZXJnZWRfY2FjaGUoKSB1bm1lcmdlZF9pbmRleCgmdGhlX2luZGV4KQorI2RlZmluZSBjYWNoZV9uYW1lX3BvcyhuYW1lLCBuYW1lbGVuKSBpbmRleF9uYW1lX3BvcygmdGhlX2luZGV4LChuYW1lKSwobmFtZWxlbikpCisjZGVmaW5lIGFkZF9jYWNoZV9lbnRyeShjZSwgb3B0aW9uKSBhZGRfaW5kZXhfZW50cnkoJnRoZV9pbmRleCwgKGNlKSwgKG9wdGlvbikpCisjZGVmaW5lIHJlbW92ZV9jYWNoZV9lbnRyeV9hdChwb3MpIHJlbW92ZV9pbmRleF9lbnRyeV9hdCgmdGhlX2luZGV4LCAocG9zKSkKKyNkZWZpbmUgcmVtb3ZlX2ZpbGVfZnJvbV9jYWNoZShwYXRoKSByZW1vdmVfZmlsZV9mcm9tX2luZGV4KCZ0aGVfaW5kZXgsIChwYXRoKSkKKyNkZWZpbmUgYWRkX2ZpbGVfdG9fY2FjaGUocGF0aCwgdmVyYm9zZSkgYWRkX2ZpbGVfdG9faW5kZXgoJnRoZV9pbmRleCwgKHBhdGgpLCAodmVyYm9zZSkpCisjZGVmaW5lIHJlZnJlc2hfY2FjaGUoZmxhZ3MpIHJlZnJlc2hfaW5kZXgoJnRoZV9pbmRleCwgKGZsYWdzKSwgTlVMTCwgTlVMTCkKKyNkZWZpbmUgY2VfbWF0Y2hfc3RhdChjZSwgc3QsIG9wdGlvbnMpIGllX21hdGNoX3N0YXQoJnRoZV9pbmRleCwgKGNlKSwgKHN0KSwgKG9wdGlvbnMpKQorI2RlZmluZSBjZV9tb2RpZmllZChjZSwgc3QsIG9wdGlvbnMpIGllX21vZGlmaWVkKCZ0aGVfaW5kZXgsIChjZSksIChzdCksIChvcHRpb25zKSkKKyNkZWZpbmUgY2FjaGVfbmFtZV9leGlzdHMobmFtZSwgbmFtZWxlbikgaW5kZXhfbmFtZV9leGlzdHMoJnRoZV9pbmRleCwgKG5hbWUpLCAobmFtZWxlbikpCisjZW5kaWYKKworZW51bSBvYmplY3RfdHlwZSB7CisJT0JKX0JBRCA9IC0xLAorCU9CSl9OT05FID0gMCwKKwlPQkpfQ09NTUlUID0gMSwKKwlPQkpfVFJFRSA9IDIsCisJT0JKX0JMT0IgPSAzLAorCU9CSl9UQUcgPSA0LAorCS8qIDUgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKwlPQkpfT0ZTX0RFTFRBID0gNiwKKwlPQkpfUkVGX0RFTFRBID0gNywKKwlPQkpfQU5ZLAorCU9CSl9NQVgsCit9OworCitzdGF0aWMgaW5saW5lIGVudW0gb2JqZWN0X3R5cGUgb2JqZWN0X3R5cGUodW5zaWduZWQgaW50IG1vZGUpCit7CisJcmV0dXJuIFNfSVNESVIobW9kZSkgPyBPQkpfVFJFRSA6CisJCVNfSVNHSVRMSU5LKG1vZGUpID8gT0JKX0NPTU1JVCA6CisJCU9CSl9CTE9COworfQorCisjZGVmaW5lIEdJVF9ESVJfRU5WSVJPTk1FTlQgIkdJVF9ESVIiCisjZGVmaW5lIEdJVF9XT1JLX1RSRUVfRU5WSVJPTk1FTlQgIkdJVF9XT1JLX1RSRUUiCisjZGVmaW5lIERFRkFVTFRfR0lUX0RJUl9FTlZJUk9OTUVOVCAiLmdpdCIKKyNkZWZpbmUgREJfRU5WSVJPTk1FTlQgIkdJVF9PQkpFQ1RfRElSRUNUT1JZIgorI2RlZmluZSBJTkRFWF9FTlZJUk9OTUVOVCAiR0lUX0lOREVYX0ZJTEUiCisjZGVmaW5lIEdSQUZUX0VOVklST05NRU5UICJHSVRfR1JBRlRfRklMRSIKKyNkZWZpbmUgVEVNUExBVEVfRElSX0VOVklST05NRU5UICJHSVRfVEVNUExBVEVfRElSIgorI2RlZmluZSBDT05GSUdfRU5WSVJPTk1FTlQgIkdJVF9DT05GSUciCisjZGVmaW5lIENPTkZJR19MT0NBTF9FTlZJUk9OTUVOVCAiR0lUX0NPTkZJR19MT0NBTCIKKyNkZWZpbmUgRVhFQ19QQVRIX0VOVklST05NRU5UICJHSVRfRVhFQ19QQVRIIgorI2RlZmluZSBHSVRBVFRSSUJVVEVTX0ZJTEUgIi5naXRhdHRyaWJ1dGVzIgorI2RlZmluZSBJTkZPQVRUUklCVVRFU19GSUxFICJpbmZvL2F0dHJpYnV0ZXMiCisjZGVmaW5lIEFUVFJJQlVURV9NQUNST19QUkVGSVggIlthdHRyXSIKKworZXh0ZXJuIGludCBpc19iYXJlX3JlcG9zaXRvcnlfY2ZnOworZXh0ZXJuIGludCBpc19iYXJlX3JlcG9zaXRvcnkodm9pZCk7CitleHRlcm4gaW50IGlzX2luc2lkZV9naXRfZGlyKHZvaWQpOworZXh0ZXJuIGNoYXIgKmdpdF93b3JrX3RyZWVfY2ZnOworZXh0ZXJuIGludCBpc19pbnNpZGVfd29ya190cmVlKHZvaWQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKmdldF9naXRfZGlyKHZvaWQpOworZXh0ZXJuIGNoYXIgKmdldF9vYmplY3RfZGlyZWN0b3J5KHZvaWQpOworZXh0ZXJuIGNoYXIgKmdldF9yZWZzX2RpcmVjdG9yeSh2b2lkKTsKK2V4dGVybiBjaGFyICpnZXRfaW5kZXhfZmlsZSh2b2lkKTsKK2V4dGVybiBjaGFyICpnZXRfZ3JhZnRfZmlsZSh2b2lkKTsKK2V4dGVybiBpbnQgc2V0X2dpdF9kaXIoY29uc3QgY2hhciAqcGF0aCk7CitleHRlcm4gY29uc3QgY2hhciAqZ2V0X2dpdF93b3JrX3RyZWUodm9pZCk7CisKKyNkZWZpbmUgQUxURVJOQVRFX0RCX0VOVklST05NRU5UICJHSVRfQUxURVJOQVRFX09CSkVDVF9ESVJFQ1RPUklFUyIKKworZXh0ZXJuIGNvbnN0IGNoYXIgKipnZXRfcGF0aHNwZWMoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICoqcGF0aHNwZWMpOworZXh0ZXJuIHZvaWQgc2V0dXBfd29ya190cmVlKHZvaWQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKnNldHVwX2dpdF9kaXJlY3RvcnlfZ2VudGx5KGludCAqKTsKK2V4dGVybiBjb25zdCBjaGFyICpzZXR1cF9naXRfZGlyZWN0b3J5KHZvaWQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKnByZWZpeF9wYXRoKGNvbnN0IGNoYXIgKnByZWZpeCwgaW50IGxlbiwgY29uc3QgY2hhciAqcGF0aCk7CitleHRlcm4gY29uc3QgY2hhciAqcHJlZml4X2ZpbGVuYW1lKGNvbnN0IGNoYXIgKnByZWZpeCwgaW50IGxlbiwgY29uc3QgY2hhciAqcGF0aCk7CitleHRlcm4gdm9pZCB2ZXJpZnlfZmlsZW5hbWUoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiB2b2lkIHZlcmlmeV9ub25fZmlsZW5hbWUoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpuYW1lKTsKKworI2RlZmluZSBhbGxvY19ucih4KSAoKCh4KSsxNikqMy8yKQorCisvKgorICogUmVhbGxvYyB0aGUgYnVmZmVyIHBvaW50ZWQgYXQgYnkgdmFyaWFibGUgJ3gnIHNvIHRoYXQgaXQgY2FuIGhvbGQKKyAqIGF0IGxlYXN0ICducicgZW50cmllczsgdGhlIG51bWJlciBvZiBlbnRyaWVzIGN1cnJlbnRseSBhbGxvY2F0ZWQKKyAqIGlzICdhbGxvYycsIHVzaW5nIHRoZSBzdGFuZGFyZCBncm93aW5nIGZhY3RvciBhbGxvY19ucigpIG1hY3JvLgorICoKKyAqIERPIE5PVCBVU0UgYW55IGV4cHJlc3Npb24gd2l0aCBzaWRlLWVmZmVjdCBmb3IgJ3gnIG9yICdhbGxvYycuCisgKi8KKyNkZWZpbmUgQUxMT0NfR1JPVyh4LCBuciwgYWxsb2MpIFwKKwlkbyB7IFwKKwkJaWYgKChucikgPiBhbGxvYykgeyBcCisJCQlpZiAoYWxsb2NfbnIoYWxsb2MpIDwgKG5yKSkgXAorCQkJCWFsbG9jID0gKG5yKTsgXAorCQkJZWxzZSBcCisJCQkJYWxsb2MgPSBhbGxvY19ucihhbGxvYyk7IFwKKwkJCXggPSB4cmVhbGxvYygoeCksIGFsbG9jICogc2l6ZW9mKCooeCkpKTsgXAorCQl9IFwKKwl9IHdoaWxlKDApCisKKy8qIEluaXRpYWxpemUgYW5kIHVzZSB0aGUgY2FjaGUgaW5mb3JtYXRpb24gKi8KK2V4dGVybiBpbnQgcmVhZF9pbmRleChzdHJ1Y3QgaW5kZXhfc3RhdGUgKik7CitleHRlcm4gaW50IHJlYWRfaW5kZXhfZnJvbShzdHJ1Y3QgaW5kZXhfc3RhdGUgKiwgY29uc3QgY2hhciAqcGF0aCk7CitleHRlcm4gaW50IHdyaXRlX2luZGV4KGNvbnN0IHN0cnVjdCBpbmRleF9zdGF0ZSAqLCBpbnQgbmV3ZmQpOworZXh0ZXJuIGludCBkaXNjYXJkX2luZGV4KHN0cnVjdCBpbmRleF9zdGF0ZSAqKTsKK2V4dGVybiBpbnQgdW5tZXJnZWRfaW5kZXgoY29uc3Qgc3RydWN0IGluZGV4X3N0YXRlICopOworZXh0ZXJuIGludCB2ZXJpZnlfcGF0aChjb25zdCBjaGFyICpwYXRoKTsKK2V4dGVybiBpbnQgaW5kZXhfbmFtZV9leGlzdHMoc3RydWN0IGluZGV4X3N0YXRlICppc3RhdGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKTsKK2V4dGVybiBpbnQgaW5kZXhfbmFtZV9wb3MoY29uc3Qgc3RydWN0IGluZGV4X3N0YXRlICosIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNkZWZpbmUgQUREX0NBQ0hFX09LX1RPX0FERCAxCQkvKiBPayB0byBhZGQgKi8KKyNkZWZpbmUgQUREX0NBQ0hFX09LX1RPX1JFUExBQ0UgMgkvKiBPayB0byByZXBsYWNlIGZpbGUvZGlyZWN0b3J5ICovCisjZGVmaW5lIEFERF9DQUNIRV9TS0lQX0RGQ0hFQ0sgNAkvKiBPayB0byBza2lwIERGIGNvbmZsaWN0IGNoZWNrcyAqLworI2RlZmluZSBBRERfQ0FDSEVfSlVTVF9BUFBFTkQgOAkJLyogQXBwZW5kIG9ubHk7IHRyZWUuYzo6cmVhZF90cmVlKCkgKi8KK2V4dGVybiBpbnQgYWRkX2luZGV4X2VudHJ5KHN0cnVjdCBpbmRleF9zdGF0ZSAqLCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBpbnQgb3B0aW9uKTsKK2V4dGVybiBzdHJ1Y3QgY2FjaGVfZW50cnkgKnJlZnJlc2hfY2FjaGVfZW50cnkoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgaW50IHJlYWxseSk7CitleHRlcm4gaW50IHJlbW92ZV9pbmRleF9lbnRyeV9hdChzdHJ1Y3QgaW5kZXhfc3RhdGUgKiwgaW50IHBvcyk7CitleHRlcm4gaW50IHJlbW92ZV9maWxlX2Zyb21faW5kZXgoc3RydWN0IGluZGV4X3N0YXRlICosIGNvbnN0IGNoYXIgKnBhdGgpOworZXh0ZXJuIGludCBhZGRfZmlsZV90b19pbmRleChzdHJ1Y3QgaW5kZXhfc3RhdGUgKiwgY29uc3QgY2hhciAqcGF0aCwgaW50IHZlcmJvc2UpOworZXh0ZXJuIHN0cnVjdCBjYWNoZV9lbnRyeSAqbWFrZV9jYWNoZV9lbnRyeSh1bnNpZ25lZCBpbnQgbW9kZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqcGF0aCwgaW50IHN0YWdlLCBpbnQgcmVmcmVzaCk7CitleHRlcm4gaW50IGNlX3NhbWVfbmFtZShzdHJ1Y3QgY2FjaGVfZW50cnkgKmEsIHN0cnVjdCBjYWNoZV9lbnRyeSAqYik7CisKKy8qIGRvIHN0YXQgY29tcGFyaXNvbiBldmVuIGlmIENFX1ZBTElEIGlzIHRydWUgKi8KKyNkZWZpbmUgQ0VfTUFUQ0hfSUdOT1JFX1ZBTElECQkwMQorLyogZG8gbm90IGNoZWNrIHRoZSBjb250ZW50cyBidXQgcmVwb3J0IGRpcnR5IG9uIHJhY2lseS1jbGVhbiBlbnRyaWVzICovCisjZGVmaW5lIENFX01BVENIX1JBQ1lfSVNfRElSVFkJMDIKK2V4dGVybiBpbnQgaWVfbWF0Y2hfc3RhdChjb25zdCBzdHJ1Y3QgaW5kZXhfc3RhdGUgKiwgc3RydWN0IGNhY2hlX2VudHJ5ICosIHN0cnVjdCBzdGF0ICosIHVuc2lnbmVkIGludCk7CitleHRlcm4gaW50IGllX21vZGlmaWVkKGNvbnN0IHN0cnVjdCBpbmRleF9zdGF0ZSAqLCBzdHJ1Y3QgY2FjaGVfZW50cnkgKiwgc3RydWN0IHN0YXQgKiwgdW5zaWduZWQgaW50KTsKKworZXh0ZXJuIGludCBjZV9wYXRoX21hdGNoKGNvbnN0IHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIGNvbnN0IGNoYXIgKipwYXRoc3BlYyk7CitleHRlcm4gaW50IGluZGV4X2ZkKHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmZCwgc3RydWN0IHN0YXQgKnN0LCBpbnQgd3JpdGVfb2JqZWN0LCBlbnVtIG9iamVjdF90eXBlIHR5cGUsIGNvbnN0IGNoYXIgKnBhdGgpOworZXh0ZXJuIGludCBpbmRleF9waXBlKHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmZCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHdyaXRlX29iamVjdCk7CitleHRlcm4gaW50IGluZGV4X3BhdGgodW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IHN0YXQgKnN0LCBpbnQgd3JpdGVfb2JqZWN0KTsKK2V4dGVybiB2b2lkIGZpbGxfc3RhdF9jYWNoZV9pbmZvKHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIHN0cnVjdCBzdGF0ICpzdCk7CisKKyNkZWZpbmUgUkVGUkVTSF9SRUFMTFkJCTB4MDAwMQkvKiBpZ25vcmVfdmFsaWQgKi8KKyNkZWZpbmUgUkVGUkVTSF9VTk1FUkdFRAkweDAwMDIJLyogYWxsb3cgdW5tZXJnZWQgKi8KKyNkZWZpbmUgUkVGUkVTSF9RVUlFVAkJMHgwMDA0CS8qIGJlIHF1aWV0IGFib3V0IGl0ICovCisjZGVmaW5lIFJFRlJFU0hfSUdOT1JFX01JU1NJTkcJMHgwMDA4CS8qIGlnbm9yZSBub24tZXhpc3RlbnQgKi8KK2V4dGVybiBpbnQgcmVmcmVzaF9pbmRleChzdHJ1Y3QgaW5kZXhfc3RhdGUgKiwgdW5zaWduZWQgaW50IGZsYWdzLCBjb25zdCBjaGFyICoqcGF0aHNwZWMsIGNoYXIgKnNlZW4pOworCitzdHJ1Y3QgbG9ja19maWxlIHsKKwlzdHJ1Y3QgbG9ja19maWxlICpuZXh0OworCWludCBmZDsKKwlwaWRfdCBvd25lcjsKKwljaGFyIG9uX2xpc3Q7CisJY2hhciBmaWxlbmFtZVtQQVRIX01BWF07Cit9OworZXh0ZXJuIGludCBob2xkX2xvY2tfZmlsZV9mb3JfdXBkYXRlKHN0cnVjdCBsb2NrX2ZpbGUgKiwgY29uc3QgY2hhciAqcGF0aCwgaW50KTsKK2V4dGVybiBpbnQgY29tbWl0X2xvY2tfZmlsZShzdHJ1Y3QgbG9ja19maWxlICopOworCitleHRlcm4gaW50IGhvbGRfbG9ja2VkX2luZGV4KHN0cnVjdCBsb2NrX2ZpbGUgKiwgaW50KTsKK2V4dGVybiBpbnQgY29tbWl0X2xvY2tlZF9pbmRleChzdHJ1Y3QgbG9ja19maWxlICopOworZXh0ZXJuIHZvaWQgc2V0X2FsdGVybmF0ZV9pbmRleF9vdXRwdXQoY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgY2xvc2VfbG9ja19maWxlKHN0cnVjdCBsb2NrX2ZpbGUgKik7CitleHRlcm4gdm9pZCByb2xsYmFja19sb2NrX2ZpbGUoc3RydWN0IGxvY2tfZmlsZSAqKTsKK2V4dGVybiBpbnQgZGVsZXRlX3JlZihjb25zdCBjaGFyICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCisvKiBFbnZpcm9ubWVudCBiaXRzIGZyb20gY29uZmlndXJhdGlvbiBtZWNoYW5pc20gKi8KK2V4dGVybiBpbnQgdHJ1c3RfZXhlY3V0YWJsZV9iaXQ7CitleHRlcm4gaW50IHF1b3RlX3BhdGhfZnVsbHk7CitleHRlcm4gaW50IGhhc19zeW1saW5rczsKK2V4dGVybiBpbnQgYXNzdW1lX3VuY2hhbmdlZDsKK2V4dGVybiBpbnQgcHJlZmVyX3N5bWxpbmtfcmVmczsKK2V4dGVybiBpbnQgbG9nX2FsbF9yZWZfdXBkYXRlczsKK2V4dGVybiBpbnQgd2Fybl9hbWJpZ3VvdXNfcmVmczsKK2V4dGVybiBpbnQgc2hhcmVkX3JlcG9zaXRvcnk7CitleHRlcm4gY29uc3QgY2hhciAqYXBwbHlfZGVmYXVsdF93aGl0ZXNwYWNlOworZXh0ZXJuIGludCB6bGliX2NvbXByZXNzaW9uX2xldmVsOworZXh0ZXJuIGludCBjb3JlX2NvbXByZXNzaW9uX2xldmVsOworZXh0ZXJuIGludCBjb3JlX2NvbXByZXNzaW9uX3NlZW47CitleHRlcm4gc2l6ZV90IHBhY2tlZF9naXRfd2luZG93X3NpemU7CitleHRlcm4gc2l6ZV90IHBhY2tlZF9naXRfbGltaXQ7CitleHRlcm4gc2l6ZV90IGRlbHRhX2Jhc2VfY2FjaGVfbGltaXQ7CitleHRlcm4gaW50IGF1dG9fY3JsZjsKKworZW51bSBzYWZlX2NybGYgeworCVNBRkVfQ1JMRl9GQUxTRSA9IDAsCisJU0FGRV9DUkxGX0ZBSUwgPSAxLAorCVNBRkVfQ1JMRl9XQVJOID0gMiwKK307CisKK2V4dGVybiBlbnVtIHNhZmVfY3JsZiBzYWZlX2NybGY7CisKK2VudW0gYnJhbmNoX3RyYWNrIHsKKwlCUkFOQ0hfVFJBQ0tfTkVWRVIgPSAwLAorCUJSQU5DSF9UUkFDS19SRU1PVEUsCisJQlJBTkNIX1RSQUNLX0FMV0FZUywKKwlCUkFOQ0hfVFJBQ0tfRVhQTElDSVQsCit9OworCitleHRlcm4gZW51bSBicmFuY2hfdHJhY2sgZ2l0X2JyYW5jaF90cmFjazsKKworI2RlZmluZSBHSVRfUkVQT19WRVJTSU9OIDAKK2V4dGVybiBpbnQgcmVwb3NpdG9yeV9mb3JtYXRfdmVyc2lvbjsKK2V4dGVybiBpbnQgY2hlY2tfcmVwb3NpdG9yeV9mb3JtYXQodm9pZCk7CisKKyNkZWZpbmUgTVRJTUVfQ0hBTkdFRAkweDAwMDEKKyNkZWZpbmUgQ1RJTUVfQ0hBTkdFRAkweDAwMDIKKyNkZWZpbmUgT1dORVJfQ0hBTkdFRAkweDAwMDQKKyNkZWZpbmUgTU9ERV9DSEFOR0VEICAgIDB4MDAwOAorI2RlZmluZSBJTk9ERV9DSEFOR0VEICAgMHgwMDEwCisjZGVmaW5lIERBVEFfQ0hBTkdFRCAgICAweDAwMjAKKyNkZWZpbmUgVFlQRV9DSEFOR0VEICAgIDB4MDA0MAorCisvKiBSZXR1cm4gYSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBmaWxlbmFtZSBtYXRjaGluZyB0aGUgc2hhMSBzaWduYXR1cmUgKi8KK2V4dGVybiBjaGFyICpta3BhdGgoY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOworZXh0ZXJuIGNoYXIgKmdpdF9wYXRoKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKK2V4dGVybiBjaGFyICpzaGExX2ZpbGVfbmFtZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK2V4dGVybiBjaGFyICpzaGExX3BhY2tfbmFtZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK2V4dGVybiBjaGFyICpzaGExX3BhY2tfaW5kZXhfbmFtZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK2V4dGVybiBjb25zdCBjaGFyICpmaW5kX3VuaXF1ZV9hYmJyZXYoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50KTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIG51bGxfc2hhMVsyMF07CitzdGF0aWMgaW5saW5lIGludCBpc19udWxsX3NoYTEoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlyZXR1cm4gIW1lbWNtcChzaGExLCBudWxsX3NoYTEsIDIwKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGhhc2hjbXAoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMikKK3sKKwlyZXR1cm4gbWVtY21wKHNoYTEsIHNoYTIsIDIwKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBoYXNoY3B5KHVuc2lnbmVkIGNoYXIgKnNoYV9kc3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYV9zcmMpCit7CisJbWVtY3B5KHNoYV9kc3QsIHNoYV9zcmMsIDIwKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBoYXNoY2xyKHVuc2lnbmVkIGNoYXIgKmhhc2gpCit7CisJbWVtc2V0KGhhc2gsIDAsIDIwKTsKK30KKworaW50IGdpdF9ta3N0ZW1wKGNoYXIgKnBhdGgsIHNpemVfdCBuLCBjb25zdCBjaGFyICp0ZW1wbGF0ZSk7CisKK2VudW0gc2hhcmVkcmVwbyB7CisJUEVSTV9VTUFTSyA9IDAsCisJUEVSTV9HUk9VUCwKKwlQRVJNX0VWRVJZQk9EWQorfTsKK2ludCBnaXRfY29uZmlnX3Blcm0oY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSk7CitpbnQgYWRqdXN0X3NoYXJlZF9wZXJtKGNvbnN0IGNoYXIgKnBhdGgpOworaW50IHNhZmVfY3JlYXRlX2xlYWRpbmdfZGlyZWN0b3JpZXMoY2hhciAqcGF0aCk7CitjaGFyICplbnRlcl9yZXBvKGNoYXIgKnBhdGgsIGludCBzdHJpY3QpOworc3RhdGljIGlubGluZSBpbnQgaXNfYWJzb2x1dGVfcGF0aChjb25zdCBjaGFyICpwYXRoKQoreworCXJldHVybiBwYXRoWzBdID09ICcvJzsKK30KK2NvbnN0IGNoYXIgKm1ha2VfYWJzb2x1dGVfcGF0aChjb25zdCBjaGFyICpwYXRoKTsKKworLyogUmVhZCBhbmQgdW5wYWNrIGEgc2hhMSBmaWxlIGludG8gbWVtb3J5LCB3cml0ZSBtZW1vcnkgdG8gYSBzaGExIGZpbGUgKi8KK2V4dGVybiBpbnQgc2hhMV9vYmplY3RfaW5mbyhjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcgKik7CitleHRlcm4gdm9pZCAqIHJlYWRfc2hhMV9maWxlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGVudW0gb2JqZWN0X3R5cGUgKnR5cGUsIHVuc2lnbmVkIGxvbmcgKnNpemUpOworZXh0ZXJuIGludCBoYXNoX3NoYTFfZmlsZShjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuLCBjb25zdCBjaGFyICp0eXBlLCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK2V4dGVybiBpbnQgd3JpdGVfc2hhMV9maWxlKHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsZW4sIGNvbnN0IGNoYXIgKnR5cGUsIHVuc2lnbmVkIGNoYXIgKnJldHVybl9zaGExKTsKK2V4dGVybiBpbnQgcHJldGVuZF9zaGExX2ZpbGUodm9pZCAqLCB1bnNpZ25lZCBsb25nLCBlbnVtIG9iamVjdF90eXBlLCB1bnNpZ25lZCBjaGFyICopOworCitleHRlcm4gaW50IGNoZWNrX3NoYTFfc2lnbmF0dXJlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplLCBjb25zdCBjaGFyICp0eXBlKTsKKworZXh0ZXJuIGludCB3cml0ZV9zaGExX2Zyb21fZmQoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZkLCBjaGFyICpidWZmZXIsCisJCQkgICAgICBzaXplX3QgYnVmc2l6ZSwgc2l6ZV90ICpidWZwb3NuKTsKK2V4dGVybiBpbnQgd3JpdGVfc2hhMV90b19mZChpbnQgZmQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworZXh0ZXJuIGludCBtb3ZlX3RlbXBfdG9fZmlsZShjb25zdCBjaGFyICp0bXBmaWxlLCBjb25zdCBjaGFyICpmaWxlbmFtZSk7CisKK2V4dGVybiBpbnQgaGFzX3NoYTFfcGFjayhjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCBjaGFyICoqaWdub3JlKTsKK2V4dGVybiBpbnQgaGFzX3NoYTFfZmlsZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKKworZXh0ZXJuIGludCBoYXNfcGFja19maWxlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworZXh0ZXJuIGludCBoYXNfcGFja19pbmRleChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKKworZXh0ZXJuIGNvbnN0IHNpZ25lZCBjaGFyIGhleHZhbF90YWJsZVsyNTZdOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaGV4dmFsKHVuc2lnbmVkIGNoYXIgYykKK3sKKwlyZXR1cm4gaGV4dmFsX3RhYmxlW2NdOworfQorCisvKiBDb252ZXJ0IHRvL2Zyb20gaGV4L3NoYTEgcmVwcmVzZW50YXRpb24gKi8KKyNkZWZpbmUgTUlOSU1VTV9BQkJSRVYgNAorI2RlZmluZSBERUZBVUxUX0FCQlJFViA3CisKK2V4dGVybiBpbnQgZ2V0X3NoYTEoY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK2V4dGVybiBpbnQgZ2V0X3NoYTFfd2l0aF9tb2RlKGNvbnN0IGNoYXIgKnN0ciwgdW5zaWduZWQgY2hhciAqc2hhMSwgdW5zaWduZWQgKm1vZGUpOworZXh0ZXJuIGludCBnZXRfc2hhMV9oZXgoY29uc3QgY2hhciAqaGV4LCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK2V4dGVybiBjaGFyICpzaGExX3RvX2hleChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsJLyogc3RhdGljIGJ1ZmZlciByZXN1bHQhICovCitleHRlcm4gaW50IHJlYWRfcmVmKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK2V4dGVybiBjb25zdCBjaGFyICpyZXNvbHZlX3JlZihjb25zdCBjaGFyICpwYXRoLCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQsIGludCAqKTsKK2V4dGVybiBpbnQgZHdpbV9yZWYoY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpzaGExLCBjaGFyICoqcmVmKTsKK2V4dGVybiBpbnQgZHdpbV9sb2coY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpzaGExLCBjaGFyICoqcmVmKTsKKworZXh0ZXJuIGludCByZWZuYW1lX21hdGNoKGNvbnN0IGNoYXIgKmFiYnJldl9uYW1lLCBjb25zdCBjaGFyICpmdWxsX25hbWUsIGNvbnN0IGNoYXIgKipydWxlcyk7CitleHRlcm4gY29uc3QgY2hhciAqcmVmX3Jldl9wYXJzZV9ydWxlc1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgKnJlZl9mZXRjaF9ydWxlc1tdOworCitleHRlcm4gaW50IGNyZWF0ZV9zeW1yZWYoY29uc3QgY2hhciAqcmVmLCBjb25zdCBjaGFyICpyZWZzX2hlYWRzX21hc3RlciwgY29uc3QgY2hhciAqbG9nbXNnKTsKK2V4dGVybiBpbnQgdmFsaWRhdGVfaGVhZHJlZihjb25zdCBjaGFyICpyZWYpOworCitleHRlcm4gaW50IGJhc2VfbmFtZV9jb21wYXJlKGNvbnN0IGNoYXIgKm5hbWUxLCBpbnQgbGVuMSwgaW50IG1vZGUxLCBjb25zdCBjaGFyICpuYW1lMiwgaW50IGxlbjIsIGludCBtb2RlMik7CitleHRlcm4gaW50IGRmX25hbWVfY29tcGFyZShjb25zdCBjaGFyICpuYW1lMSwgaW50IGxlbjEsIGludCBtb2RlMSwgY29uc3QgY2hhciAqbmFtZTIsIGludCBsZW4yLCBpbnQgbW9kZTIpOworZXh0ZXJuIGludCBjYWNoZV9uYW1lX2NvbXBhcmUoY29uc3QgY2hhciAqbmFtZTEsIGludCBsZW4xLCBjb25zdCBjaGFyICpuYW1lMiwgaW50IGxlbjIpOworCitleHRlcm4gdm9pZCAqcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2UoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCQkJY29uc3QgY2hhciAqcmVxdWlyZWRfdHlwZSwKKwkJCQkJdW5zaWduZWQgbG9uZyAqc2l6ZSwKKwkJCQkJdW5zaWduZWQgY2hhciAqc2hhMV9yZXQpOworCitleHRlcm4gc3RydWN0IG9iamVjdCAqcGVlbF90b190eXBlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAorCQkJCSAgIHN0cnVjdCBvYmplY3QgKm8sIGVudW0gb2JqZWN0X3R5cGUpOworCitlbnVtIGRhdGVfbW9kZSB7CisJREFURV9OT1JNQUwgPSAwLAorCURBVEVfUkVMQVRJVkUsCisJREFURV9TSE9SVCwKKwlEQVRFX0xPQ0FMLAorCURBVEVfSVNPODYwMSwKKwlEQVRFX1JGQzI4MjIKK307CisKK2NvbnN0IGNoYXIgKnNob3dfZGF0ZSh1bnNpZ25lZCBsb25nIHRpbWUsIGludCB0aW1lem9uZSwgZW51bSBkYXRlX21vZGUgbW9kZSk7CitpbnQgcGFyc2VfZGF0ZShjb25zdCBjaGFyICpkYXRlLCBjaGFyICpidWYsIGludCBidWZzaXplKTsKK3ZvaWQgZGF0ZXN0YW1wKGNoYXIgKmJ1ZiwgaW50IGJ1ZnNpemUpOwordW5zaWduZWQgbG9uZyBhcHByb3hpZGF0ZShjb25zdCBjaGFyICopOworZW51bSBkYXRlX21vZGUgcGFyc2VfZGF0ZV9mb3JtYXQoY29uc3QgY2hhciAqZm9ybWF0KTsKKworI2RlZmluZSBJREVOVF9XQVJOX09OX05PX05BTUUgIDEKKyNkZWZpbmUgSURFTlRfRVJST1JfT05fTk9fTkFNRSAyCisjZGVmaW5lIElERU5UX05PX0RBVEUJICAgICAgIDQKK2V4dGVybiBjb25zdCBjaGFyICpnaXRfYXV0aG9yX2luZm8oaW50KTsKK2V4dGVybiBjb25zdCBjaGFyICpnaXRfY29tbWl0dGVyX2luZm8oaW50KTsKK2V4dGVybiBjb25zdCBjaGFyICpmbXRfaWRlbnQoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZW1haWwsIGNvbnN0IGNoYXIgKmRhdGVfc3RyLCBpbnQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKmZtdF9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmVtYWlsKTsKKworc3RydWN0IGNoZWNrb3V0IHsKKwljb25zdCBjaGFyICpiYXNlX2RpcjsKKwlpbnQgYmFzZV9kaXJfbGVuOworCXVuc2lnbmVkIGZvcmNlOjEsCisJCSBxdWlldDoxLAorCQkgbm90X25ldzoxLAorCQkgcmVmcmVzaF9jYWNoZToxOworfTsKKworZXh0ZXJuIGludCBjaGVja291dF9lbnRyeShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBjb25zdCBzdHJ1Y3QgY2hlY2tvdXQgKnN0YXRlLCBjaGFyICp0b3BhdGgpOworZXh0ZXJuIGludCBoYXNfc3ltbGlua19sZWFkaW5nX3BhdGgoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqbGFzdF9zeW1saW5rKTsKKworZXh0ZXJuIHN0cnVjdCBhbHRlcm5hdGVfb2JqZWN0X2RhdGFiYXNlIHsKKwlzdHJ1Y3QgYWx0ZXJuYXRlX29iamVjdF9kYXRhYmFzZSAqbmV4dDsKKwljaGFyICpuYW1lOworCWNoYXIgYmFzZVtGTEVYX0FSUkFZXTsgLyogbW9yZSAqLworfSAqYWx0X29kYl9saXN0OworZXh0ZXJuIHZvaWQgcHJlcGFyZV9hbHRfb2RiKHZvaWQpOworCitzdHJ1Y3QgcGFja193aW5kb3cgeworCXN0cnVjdCBwYWNrX3dpbmRvdyAqbmV4dDsKKwl1bnNpZ25lZCBjaGFyICpiYXNlOworCW9mZl90IG9mZnNldDsKKwlzaXplX3QgbGVuOworCXVuc2lnbmVkIGludCBsYXN0X3VzZWQ7CisJdW5zaWduZWQgaW50IGludXNlX2NudDsKK307CisKK2V4dGVybiBzdHJ1Y3QgcGFja2VkX2dpdCB7CisJc3RydWN0IHBhY2tlZF9naXQgKm5leHQ7CisJc3RydWN0IHBhY2tfd2luZG93ICp3aW5kb3dzOworCW9mZl90IHBhY2tfc2l6ZTsKKwljb25zdCB2b2lkICppbmRleF9kYXRhOworCXNpemVfdCBpbmRleF9zaXplOworCXVpbnQzMl90IG51bV9vYmplY3RzOworCWludCBpbmRleF92ZXJzaW9uOworCXRpbWVfdCBtdGltZTsKKwlpbnQgcGFja19mZDsKKwlpbnQgcGFja19sb2NhbDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCS8qIHNvbWV0aGluZyBsaWtlICIuZ2l0L29iamVjdHMvcGFjay94eHh4eC5wYWNrIiAqLworCWNoYXIgcGFja19uYW1lW0ZMRVhfQVJSQVldOyAvKiBtb3JlICovCit9ICpwYWNrZWRfZ2l0OworCitzdHJ1Y3QgcGFja19lbnRyeSB7CisJb2ZmX3Qgb2Zmc2V0OworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJc3RydWN0IHBhY2tlZF9naXQgKnA7Cit9OworCitzdHJ1Y3QgcmVmIHsKKwlzdHJ1Y3QgcmVmICpuZXh0OworCXVuc2lnbmVkIGNoYXIgb2xkX3NoYTFbMjBdOworCXVuc2lnbmVkIGNoYXIgbmV3X3NoYTFbMjBdOworCXVuc2lnbmVkIGludCBmb3JjZToxLAorCQltZXJnZToxLAorCQlub25mYXN0Zm9yd2FyZDoxLAorCQlkZWxldGlvbjoxOworCWVudW0geworCQlSRUZfU1RBVFVTX05PTkUgPSAwLAorCQlSRUZfU1RBVFVTX09LLAorCQlSRUZfU1RBVFVTX1JFSkVDVF9OT05GQVNURk9SV0FSRCwKKwkJUkVGX1NUQVRVU19SRUpFQ1RfTk9ERUxFVEUsCisJCVJFRl9TVEFUVVNfVVBUT0RBVEUsCisJCVJFRl9TVEFUVVNfUkVNT1RFX1JFSkVDVCwKKwkJUkVGX1NUQVRVU19FWFBFQ1RJTkdfUkVQT1JULAorCX0gc3RhdHVzOworCWNoYXIgKnJlbW90ZV9zdGF0dXM7CisJc3RydWN0IHJlZiAqcGVlcl9yZWY7IC8qIHdoZW4gcmVuYW1pbmcgKi8KKwljaGFyIG5hbWVbRkxFWF9BUlJBWV07IC8qIG1vcmUgKi8KK307CisKKyNkZWZpbmUgUkVGX05PUk1BTAkoMXUgPDwgMCkKKyNkZWZpbmUgUkVGX0hFQURTCSgxdSA8PCAxKQorI2RlZmluZSBSRUZfVEFHUwkoMXUgPDwgMikKKworZXh0ZXJuIHN0cnVjdCByZWYgKmZpbmRfcmVmX2J5X25hbWUoc3RydWN0IHJlZiAqbGlzdCwgY29uc3QgY2hhciAqbmFtZSk7CisKKyNkZWZpbmUgQ09OTkVDVF9WRVJCT1NFICAgICAgICgxdSA8PCAwKQorZXh0ZXJuIHN0cnVjdCBjaGlsZF9wcm9jZXNzICpnaXRfY29ubmVjdChpbnQgZmRbMl0sIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgY2hhciAqcHJvZywgaW50IGZsYWdzKTsKK2V4dGVybiBpbnQgZmluaXNoX2Nvbm5lY3Qoc3RydWN0IGNoaWxkX3Byb2Nlc3MgKmNvbm4pOworZXh0ZXJuIGludCBwYXRoX21hdGNoKGNvbnN0IGNoYXIgKnBhdGgsIGludCBuciwgY2hhciAqKm1hdGNoKTsKK2V4dGVybiBpbnQgZ2V0X2FjayhpbnQgZmQsIHVuc2lnbmVkIGNoYXIgKnJlc3VsdF9zaGExKTsKK2V4dGVybiBzdHJ1Y3QgcmVmICoqZ2V0X3JlbW90ZV9oZWFkcyhpbnQgaW4sIHN0cnVjdCByZWYgKipsaXN0LCBpbnQgbnJfbWF0Y2gsIGNoYXIgKiptYXRjaCwgdW5zaWduZWQgaW50IGZsYWdzKTsKK2V4dGVybiBpbnQgc2VydmVyX3N1cHBvcnRzKGNvbnN0IGNoYXIgKmZlYXR1cmUpOworCitleHRlcm4gc3RydWN0IHBhY2tlZF9naXQgKnBhcnNlX3BhY2tfaW5kZXgodW5zaWduZWQgY2hhciAqc2hhMSk7CitleHRlcm4gc3RydWN0IHBhY2tlZF9naXQgKnBhcnNlX3BhY2tfaW5kZXhfZmlsZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkJCQkJY29uc3QgY2hhciAqaWR4X3BhdGgpOworCitleHRlcm4gdm9pZCBwcmVwYXJlX3BhY2tlZF9naXQodm9pZCk7CitleHRlcm4gdm9pZCByZXByZXBhcmVfcGFja2VkX2dpdCh2b2lkKTsKK2V4dGVybiB2b2lkIGluc3RhbGxfcGFja2VkX2dpdChzdHJ1Y3QgcGFja2VkX2dpdCAqcGFjayk7CisKK2V4dGVybiBzdHJ1Y3QgcGFja2VkX2dpdCAqZmluZF9zaGExX3BhY2soY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCQkJIHN0cnVjdCBwYWNrZWRfZ2l0ICpwYWNrcyk7CisKK2V4dGVybiB2b2lkIHBhY2tfcmVwb3J0KHZvaWQpOworZXh0ZXJuIGludCBvcGVuX3BhY2tfaW5kZXgoc3RydWN0IHBhY2tlZF9naXQgKik7CitleHRlcm4gdW5zaWduZWQgY2hhciogdXNlX3BhY2soc3RydWN0IHBhY2tlZF9naXQgKiwgc3RydWN0IHBhY2tfd2luZG93ICoqLCBvZmZfdCwgdW5zaWduZWQgaW50ICopOworZXh0ZXJuIHZvaWQgY2xvc2VfcGFja193aW5kb3dzKHN0cnVjdCBwYWNrZWRfZ2l0ICopOworZXh0ZXJuIHZvaWQgdW51c2VfcGFjayhzdHJ1Y3QgcGFja193aW5kb3cgKiopOworZXh0ZXJuIHN0cnVjdCBwYWNrZWRfZ2l0ICphZGRfcGFja2VkX2dpdChjb25zdCBjaGFyICosIGludCwgaW50KTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyICpudGhfcGFja2VkX29iamVjdF9zaGExKHN0cnVjdCBwYWNrZWRfZ2l0ICosIHVpbnQzMl90KTsKK2V4dGVybiBvZmZfdCBmaW5kX3BhY2tfZW50cnlfb25lKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgc3RydWN0IHBhY2tlZF9naXQgKik7CitleHRlcm4gdm9pZCAqdW5wYWNrX2VudHJ5KHN0cnVjdCBwYWNrZWRfZ2l0ICosIG9mZl90LCBlbnVtIG9iamVjdF90eXBlICosIHVuc2lnbmVkIGxvbmcgKik7CitleHRlcm4gdW5zaWduZWQgbG9uZyB1bnBhY2tfb2JqZWN0X2hlYWRlcl9nZW50bHkoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGxlbiwgZW51bSBvYmplY3RfdHlwZSAqdHlwZSwgdW5zaWduZWQgbG9uZyAqc2l6ZXApOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X3NpemVfZnJvbV9kZWx0YShzdHJ1Y3QgcGFja2VkX2dpdCAqLCBzdHJ1Y3QgcGFja193aW5kb3cgKiosIG9mZl90KTsKK2V4dGVybiBjb25zdCBjaGFyICpwYWNrZWRfb2JqZWN0X2luZm9fZGV0YWlsKHN0cnVjdCBwYWNrZWRfZ2l0ICosIG9mZl90LCB1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgaW50ICosIHVuc2lnbmVkIGNoYXIgKik7CitleHRlcm4gaW50IG1hdGNoZXNfcGFja19uYW1lKHN0cnVjdCBwYWNrZWRfZ2l0ICpwLCBjb25zdCBjaGFyICpuYW1lKTsKKworLyogRHVtYiBzZXJ2ZXJzIHN1cHBvcnQgKi8KK2V4dGVybiBpbnQgdXBkYXRlX3NlcnZlcl9pbmZvKGludCk7CisKK3R5cGVkZWYgaW50ICgqY29uZmlnX2ZuX3QpKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgZ2l0X2RlZmF1bHRfY29uZmlnKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgZ2l0X2NvbmZpZ19mcm9tX2ZpbGUoY29uZmlnX2ZuX3QgZm4sIGNvbnN0IGNoYXIgKik7CitleHRlcm4gaW50IGdpdF9jb25maWcoY29uZmlnX2ZuX3QgZm4pOworZXh0ZXJuIGludCBnaXRfcGFyc2VfbG9uZyhjb25zdCBjaGFyICosIGxvbmcgKik7CitleHRlcm4gaW50IGdpdF9wYXJzZV91bG9uZyhjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcgKik7CitleHRlcm4gaW50IGdpdF9jb25maWdfaW50KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGdpdF9jb25maWdfdWxvbmcoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIGludCBnaXRfY29uZmlnX2Jvb2woY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIGludCBnaXRfY29uZmlnX3N0cmluZyhjb25zdCBjaGFyICoqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gaW50IGdpdF9jb25maWdfc2V0KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgZ2l0X2NvbmZpZ19zZXRfbXVsdGl2YXIoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKK2V4dGVybiBpbnQgZ2l0X2NvbmZpZ19yZW5hbWVfc2VjdGlvbihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gY29uc3QgY2hhciAqZ2l0X2V0Y19naXRjb25maWcodm9pZCk7CitleHRlcm4gaW50IGNoZWNrX3JlcG9zaXRvcnlfZm9ybWF0X3ZlcnNpb24oY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSk7CitleHRlcm4gaW50IGdpdF9lbnZfYm9vbChjb25zdCBjaGFyICosIGludCk7CitleHRlcm4gaW50IGdpdF9jb25maWdfc3lzdGVtKHZvaWQpOworZXh0ZXJuIGludCBnaXRfY29uZmlnX2dsb2JhbCh2b2lkKTsKK2V4dGVybiBpbnQgY29uZmlnX2Vycm9yX25vbmJvb2woY29uc3QgY2hhciAqKTsKKworI2RlZmluZSBNQVhfR0lUTkFNRSAoMTAwMCkKK2V4dGVybiBjaGFyIGdpdF9kZWZhdWx0X2VtYWlsW01BWF9HSVROQU1FXTsKK2V4dGVybiBjaGFyIGdpdF9kZWZhdWx0X25hbWVbTUFYX0dJVE5BTUVdOworCitleHRlcm4gY29uc3QgY2hhciAqZ2l0X2NvbW1pdF9lbmNvZGluZzsKK2V4dGVybiBjb25zdCBjaGFyICpnaXRfbG9nX291dHB1dF9lbmNvZGluZzsKKworLyogSU8gaGVscGVyIGZ1bmN0aW9ucyAqLworZXh0ZXJuIHZvaWQgbWF5YmVfZmx1c2hfb3JfZGllKEZJTEUgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgY29weV9mZChpbnQgaWZkLCBpbnQgb2ZkKTsKK2V4dGVybiBpbnQgY29weV9maWxlKGNvbnN0IGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBpbnQgbW9kZSk7CitleHRlcm4gaW50IHJlYWRfaW5fZnVsbChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK2V4dGVybiBpbnQgd3JpdGVfaW5fZnVsbChpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK2V4dGVybiB2b2lkIHdyaXRlX29yX2RpZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK2V4dGVybiBpbnQgd3JpdGVfb3Jfd2hpbmUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgY29uc3QgY2hhciAqbXNnKTsKK2V4dGVybiBpbnQgd3JpdGVfb3Jfd2hpbmVfcGlwZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LCBjb25zdCBjaGFyICptc2cpOworCisvKiBwYWdlci5jICovCitleHRlcm4gdm9pZCBzZXR1cF9wYWdlcih2b2lkKTsKK2V4dGVybiBjb25zdCBjaGFyICpwYWdlcl9wcm9ncmFtOworZXh0ZXJuIGludCBwYWdlcl9pbl91c2Uodm9pZCk7CitleHRlcm4gaW50IHBhZ2VyX3VzZV9jb2xvcjsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmVkaXRvcl9wcm9ncmFtOworZXh0ZXJuIGNvbnN0IGNoYXIgKmV4Y2x1ZGVzX2ZpbGU7CisKKy8qIGJhc2U4NSAqLworaW50IGRlY29kZV84NShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKmxpbmUsIGludCBsaW5lbGVuKTsKK3ZvaWQgZW5jb2RlXzg1KGNoYXIgKmJ1ZiwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGJ5dGVzKTsKKworLyogYWxsb2MuYyAqLworZXh0ZXJuIHZvaWQgKmFsbG9jX2Jsb2Jfbm9kZSh2b2lkKTsKK2V4dGVybiB2b2lkICphbGxvY190cmVlX25vZGUodm9pZCk7CitleHRlcm4gdm9pZCAqYWxsb2NfY29tbWl0X25vZGUodm9pZCk7CitleHRlcm4gdm9pZCAqYWxsb2NfdGFnX25vZGUodm9pZCk7CitleHRlcm4gdm9pZCAqYWxsb2Nfb2JqZWN0X25vZGUodm9pZCk7CitleHRlcm4gdm9pZCBhbGxvY19yZXBvcnQodm9pZCk7CisKKy8qIHRyYWNlLmMgKi8KK2V4dGVybiB2b2lkIHRyYWNlX3ByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CitleHRlcm4gdm9pZCB0cmFjZV9hcmd2X3ByaW50Zihjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworCisvKiBjb252ZXJ0LmMgKi8KKy8qIHJldHVybnMgMSBpZiAqZHN0IHdhcyB1c2VkICovCitleHRlcm4gaW50IGNvbnZlcnRfdG9fZ2l0KGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN0cmJ1ZiAqZHN0LCBlbnVtIHNhZmVfY3JsZiBjaGVja3NhZmUpOworZXh0ZXJuIGludCBjb252ZXJ0X3RvX3dvcmtpbmdfdHJlZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBsZW4sIHN0cnVjdCBzdHJidWYgKmRzdCk7CisKKy8qIGFkZCAqLwordm9pZCBhZGRfZmlsZXNfdG9fY2FjaGUoaW50IHZlcmJvc2UsIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqKnBhdGhzcGVjKTsKKworLyogZGlmZi5jICovCitleHRlcm4gaW50IGRpZmZfYXV0b19yZWZyZXNoX2luZGV4OworCisvKiBtYXRjaC10cmVlcy5jICovCit2b2lkIHNoaWZ0X3RyZWUoY29uc3QgdW5zaWduZWQgY2hhciAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKKworLyoKKyAqIHdoaXRlc3BhY2UgcnVsZXMuCisgKiB1c2VkIGJ5IGJvdGggZGlmZiBhbmQgYXBwbHkKKyAqLworI2RlZmluZSBXU19UUkFJTElOR19TUEFDRQkwMQorI2RlZmluZSBXU19TUEFDRV9CRUZPUkVfVEFCCTAyCisjZGVmaW5lIFdTX0lOREVOVF9XSVRIX05PTl9UQUIJMDQKKyNkZWZpbmUgV1NfQ1JfQVRfRU9MICAgICAgICAgICAwMTAKKyNkZWZpbmUgV1NfREVGQVVMVF9SVUxFIChXU19UUkFJTElOR19TUEFDRXxXU19TUEFDRV9CRUZPUkVfVEFCKQorZXh0ZXJuIHVuc2lnbmVkIHdoaXRlc3BhY2VfcnVsZV9jZmc7CitleHRlcm4gdW5zaWduZWQgd2hpdGVzcGFjZV9ydWxlKGNvbnN0IGNoYXIgKik7CitleHRlcm4gdW5zaWduZWQgcGFyc2Vfd2hpdGVzcGFjZV9ydWxlKGNvbnN0IGNoYXIgKik7CitleHRlcm4gdW5zaWduZWQgY2hlY2tfYW5kX2VtaXRfbGluZShjb25zdCBjaGFyICpsaW5lLCBpbnQgbGVuLCB1bnNpZ25lZCB3c19ydWxlLAorICAgIEZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqc2V0LAorICAgIGNvbnN0IGNoYXIgKnJlc2V0LCBjb25zdCBjaGFyICp3cyk7CitleHRlcm4gY2hhciAqd2hpdGVzcGFjZV9lcnJvcl9zdHJpbmcodW5zaWduZWQgd3MpOworZXh0ZXJuIGludCB3c19maXhfY29weShjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LCB1bnNpZ25lZCwgaW50ICopOworCisvKiBscy1maWxlcyAqLworaW50IHBhdGhzcGVjX21hdGNoKGNvbnN0IGNoYXIgKipzcGVjLCBjaGFyICptYXRjaGVkLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IHNraXBsZW4pOworaW50IHJlcG9ydF9wYXRoX2Vycm9yKGNvbnN0IGNoYXIgKnBzX21hdGNoZWQsIGNvbnN0IGNoYXIgKipwYXRoc3BlYywgaW50IHByZWZpeF9vZmZzZXQpOwordm9pZCBvdmVybGF5X3RyZWVfb25fY2FjaGUoY29uc3QgY2hhciAqdHJlZV9uYW1lLCBjb25zdCBjaGFyICpwcmVmaXgpOworCitjaGFyICphbGlhc19sb29rdXAoY29uc3QgY2hhciAqYWxpYXMpOworCisjZW5kaWYgLyogQ0FDSEVfSCAqLwpkaWZmIC0tZ2l0IGEvY2hlY2stYnVpbHRpbnMuc2ggYi9jaGVjay1idWlsdGlucy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNmZlNmNmCi0tLSAvZGV2L251bGwKKysrIGIvY2hlY2stYnVpbHRpbnMuc2gKQEAgLTAsMCArMSwzNCBAQAorIyEvYmluL3NoCisKK3sKKwljYXQgPDxcRU9GCitzYXlJdDoKKwkkKGZvcmVhY2ggYiwkKEJVSUxUX0lOUyksZWNobyBYWFggJGIgWVlZOykKK0VPRgorCWNhdCBNYWtlZmlsZQorfSB8CittYWtlIC1mIC0gc2F5SXQgMj4vZGV2L251bGwgfAorc2VkIC1uIC1lICdzLy4qWFhYIFwoLipcKSBZWVkuKi9cMS9wJyB8Citzb3J0IHwKK3sKKyAgICBiYWQ9MAorICAgIHdoaWxlIHJlYWQgYnVpbHRpbgorICAgIGRvCisJYmFzZT1gZXhwciAiJGJ1aWx0aW4iIDogJ2dpdC1cKC4qXCknYAorCXg9YHNlZCAtbmUgJ3MvLip7ICInJGJhc2UnIiwgXChjbWRfW14sIF0qXCkuKi8nJGJhc2UnCVwxL3AnIGdpdC5jYAorCWlmIHRlc3QgLXogIiR4IgorCXRoZW4KKwkJZWNobyAiJGJhc2UgaXMgYnVpbHRpbiBidXQgbm90IGxpc3RlZCBpbiBnaXQuYyBjb21tYW5kIGxpc3QiCisJCWJhZD0xCisJZmkKKwlmb3Igc2Z4IGluIHNoIHBlcmwgcHkKKwlkbworCQlpZiB0ZXN0IC1mICIkYnVpbHRpbi4kc2Z4IgorCQl0aGVuCisJCQllY2hvICIkYmFzZSBpcyBidWlsdGluIGJ1dCAkYnVpbHRpbi4kc2Z4IHN0aWxsIGV4aXN0cyIKKwkJCWJhZD0xCisJCWZpCisJZG9uZQorICAgIGRvbmUKKyAgICBleGl0ICRiYWQKK30KZGlmZiAtLWdpdCBhL2NoZWNrLXJhY3kuYyBiL2NoZWNrLXJhY3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGQ5MmExCi0tLSAvZGV2L251bGwKKysrIGIvY2hlY2stcmFjeS5jCkBAIC0wLDAgKzEsMjggQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorCitpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikKK3sKKwlpbnQgaTsKKwlpbnQgZGlydHksIGNsZWFuLCByYWN5OworCisJZGlydHkgPSBjbGVhbiA9IHJhY3kgPSAwOworCXJlYWRfY2FjaGUoKTsKKwlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yOyBpKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtpXTsKKwkJc3RydWN0IHN0YXQgc3Q7CisKKwkJaWYgKGxzdGF0KGNlLT5uYW1lLCAmc3QpKSB7CisJCQllcnJvcigibHN0YXQoJXMpOiAlcyIsIGNlLT5uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoY2VfbWF0Y2hfc3RhdChjZSwgJnN0LCAwKSkKKwkJCWRpcnR5Kys7CisJCWVsc2UgaWYgKGNlX21hdGNoX3N0YXQoY2UsICZzdCwgQ0VfTUFUQ0hfUkFDWV9JU19ESVJUWSkpCisJCQlyYWN5Kys7CisJCWVsc2UKKwkJCWNsZWFuKys7CisJfQorCXByaW50ZigiZGlydHkgJWQsIGNsZWFuICVkLCByYWN5ICVkXG4iLCBkaXJ0eSwgY2xlYW4sIHJhY3kpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29sb3IuYyBiL2NvbG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJhNjQ1MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbG9yLmMKQEAgLTAsMCArMSwxOTMgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbG9yLmgiCisKKyNkZWZpbmUgQ09MT1JfUkVTRVQgIlwwMzNbbSIKKworaW50IGdpdF91c2VfY29sb3JfZGVmYXVsdCA9IDA7CisKK3N0YXRpYyBpbnQgcGFyc2VfY29sb3IoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNvbG9yX25hbWVzW10gPSB7CisJCSJub3JtYWwiLCAiYmxhY2siLCAicmVkIiwgImdyZWVuIiwgInllbGxvdyIsCisJCSJibHVlIiwgIm1hZ2VudGEiLCAiY3lhbiIsICJ3aGl0ZSIKKwl9OworCWNoYXIgKmVuZDsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb2xvcl9uYW1lcyk7IGkrKykgeworCQljb25zdCBjaGFyICpzdHIgPSBjb2xvcl9uYW1lc1tpXTsKKwkJaWYgKCFzdHJuY2FzZWNtcChuYW1lLCBzdHIsIGxlbikgJiYgIXN0cltsZW5dKQorCQkJcmV0dXJuIGkgLSAxOworCX0KKwlpID0gc3RydG9sKG5hbWUsICZlbmQsIDEwKTsKKwlpZiAoZW5kIC0gbmFtZSA9PSBsZW4gJiYgaSA+PSAtMSAmJiBpIDw9IDI1NSkKKwkJcmV0dXJuIGk7CisJcmV0dXJuIC0yOworfQorCitzdGF0aWMgaW50IHBhcnNlX2F0dHIoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKK3sKKwlzdGF0aWMgY29uc3QgaW50IGF0dHJfdmFsdWVzW10gPSB7IDEsIDIsIDQsIDUsIDcgfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0dHJfbmFtZXNbXSA9IHsKKwkJImJvbGQiLCAiZGltIiwgInVsIiwgImJsaW5rIiwgInJldmVyc2UiCisJfTsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhdHRyX25hbWVzKTsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKnN0ciA9IGF0dHJfbmFtZXNbaV07CisJCWlmICghc3RybmNhc2VjbXAobmFtZSwgc3RyLCBsZW4pICYmICFzdHJbbGVuXSkKKwkJCXJldHVybiBhdHRyX3ZhbHVlc1tpXTsKKwl9CisJcmV0dXJuIC0xOworfQorCit2b2lkIGNvbG9yX3BhcnNlKGNvbnN0IGNoYXIgKnZhbHVlLCBjb25zdCBjaGFyICp2YXIsIGNoYXIgKmRzdCkKK3sKKwljb25zdCBjaGFyICpwdHIgPSB2YWx1ZTsKKwlpbnQgYXR0ciA9IC0xOworCWludCBmZyA9IC0yOworCWludCBiZyA9IC0yOworCisJaWYgKCFzdHJjYXNlY21wKHZhbHVlLCAicmVzZXQiKSkgeworCQlzdHJjcHkoZHN0LCAiXDAzM1ttIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBbZmcgW2JnXV0gW2F0dHJdICovCisJd2hpbGUgKCpwdHIpIHsKKwkJY29uc3QgY2hhciAqd29yZCA9IHB0cjsKKwkJaW50IHZhbCwgbGVuID0gMDsKKworCQl3aGlsZSAod29yZFtsZW5dICYmICFpc3NwYWNlKHdvcmRbbGVuXSkpCisJCQlsZW4rKzsKKworCQlwdHIgPSB3b3JkICsgbGVuOworCQl3aGlsZSAoKnB0ciAmJiBpc3NwYWNlKCpwdHIpKQorCQkJcHRyKys7CisKKwkJdmFsID0gcGFyc2VfY29sb3Iod29yZCwgbGVuKTsKKwkJaWYgKHZhbCA+PSAtMSkgeworCQkJaWYgKGZnID09IC0yKSB7CisJCQkJZmcgPSB2YWw7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoYmcgPT0gLTIpIHsKKwkJCQliZyA9IHZhbDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWdvdG8gYmFkOworCQl9CisJCXZhbCA9IHBhcnNlX2F0dHIod29yZCwgbGVuKTsKKwkJaWYgKHZhbCA8IDAgfHwgYXR0ciAhPSAtMSkKKwkJCWdvdG8gYmFkOworCQlhdHRyID0gdmFsOworCX0KKworCWlmIChhdHRyID49IDAgfHwgZmcgPj0gMCB8fCBiZyA+PSAwKSB7CisJCWludCBzZXAgPSAwOworCisJCSpkc3QrKyA9ICdcMDMzJzsKKwkJKmRzdCsrID0gJ1snOworCQlpZiAoYXR0ciA+PSAwKSB7CisJCQkqZHN0KysgPSAnMCcgKyBhdHRyOworCQkJc2VwKys7CisJCX0KKwkJaWYgKGZnID49IDApIHsKKwkJCWlmIChzZXArKykKKwkJCQkqZHN0KysgPSAnOyc7CisJCQlpZiAoZmcgPCA4KSB7CisJCQkJKmRzdCsrID0gJzMnOworCQkJCSpkc3QrKyA9ICcwJyArIGZnOworCQkJfSBlbHNlIHsKKwkJCQlkc3QgKz0gc3ByaW50Zihkc3QsICIzODs1OyVkIiwgZmcpOworCQkJfQorCQl9CisJCWlmIChiZyA+PSAwKSB7CisJCQlpZiAoc2VwKyspCisJCQkJKmRzdCsrID0gJzsnOworCQkJaWYgKGJnIDwgOCkgeworCQkJCSpkc3QrKyA9ICc0JzsKKwkJCQkqZHN0KysgPSAnMCcgKyBiZzsKKwkJCX0gZWxzZSB7CisJCQkJZHN0ICs9IHNwcmludGYoZHN0LCAiNDg7NTslZCIsIGJnKTsKKwkJCX0KKwkJfQorCQkqZHN0KysgPSAnbSc7CisJfQorCSpkc3QgPSAwOworCXJldHVybjsKK2JhZDoKKwlkaWUoImJhZCBjb25maWcgdmFsdWUgJyVzJyBmb3IgdmFyaWFibGUgJyVzJyIsIHZhbHVlLCB2YXIpOworfQorCitpbnQgZ2l0X2NvbmZpZ19jb2xvcmJvb2woY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSwgaW50IHN0ZG91dF9pc190dHkpCit7CisJaWYgKHZhbHVlKSB7CisJCWlmICghc3RyY2FzZWNtcCh2YWx1ZSwgIm5ldmVyIikpCisJCQlyZXR1cm4gMDsKKwkJaWYgKCFzdHJjYXNlY21wKHZhbHVlLCAiYWx3YXlzIikpCisJCQlyZXR1cm4gMTsKKwkJaWYgKCFzdHJjYXNlY21wKHZhbHVlLCAiYXV0byIpKQorCQkJZ290byBhdXRvX2NvbG9yOworCX0KKworCS8qIE1pc3Npbmcgb3IgZXhwbGljaXQgZmFsc2UgdG8gdHVybiBvZmYgY29sb3JpemF0aW9uICovCisJaWYgKCFnaXRfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSkpCisJCXJldHVybiAwOworCisJLyogYW55IG5vcm1hbCB0cnV0aCB2YWx1ZSBkZWZhdWx0cyB0byAnYXV0bycgKi8KKyBhdXRvX2NvbG9yOgorCWlmIChzdGRvdXRfaXNfdHR5IDwgMCkKKwkJc3Rkb3V0X2lzX3R0eSA9IGlzYXR0eSgxKTsKKwlpZiAoc3Rkb3V0X2lzX3R0eSB8fCAocGFnZXJfaW5fdXNlKCkgJiYgcGFnZXJfdXNlX2NvbG9yKSkgeworCQljaGFyICp0ZXJtID0gZ2V0ZW52KCJURVJNIik7CisJCWlmICh0ZXJtICYmIHN0cmNtcCh0ZXJtLCAiZHVtYiIpKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitpbnQgZ2l0X2NvbG9yX2RlZmF1bHRfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCFzdHJjbXAodmFyLCAiY29sb3IudWkiKSkgeworCQlnaXRfdXNlX2NvbG9yX2RlZmF1bHQgPSBnaXRfY29uZmlnX2NvbG9yYm9vbCh2YXIsIHZhbHVlLCAtMSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBnaXRfZGVmYXVsdF9jb25maWcodmFyLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgY29sb3JfdmZwcmludGYoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmNvbG9yLCBjb25zdCBjaGFyICpmbXQsCisJCXZhX2xpc3QgYXJncywgY29uc3QgY2hhciAqdHJhaWwpCit7CisJaW50IHIgPSAwOworCisJaWYgKCpjb2xvcikKKwkJciArPSBmcHJpbnRmKGZwLCAiJXMiLCBjb2xvcik7CisJciArPSB2ZnByaW50ZihmcCwgZm10LCBhcmdzKTsKKwlpZiAoKmNvbG9yKQorCQlyICs9IGZwcmludGYoZnAsICIlcyIsIENPTE9SX1JFU0VUKTsKKwlpZiAodHJhaWwpCisJCXIgKz0gZnByaW50ZihmcCwgIiVzIiwgdHJhaWwpOworCXJldHVybiByOworfQorCisKKworaW50IGNvbG9yX2ZwcmludGYoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmNvbG9yLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJaW50IHI7CisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlyID0gY29sb3JfdmZwcmludGYoZnAsIGNvbG9yLCBmbXQsIGFyZ3MsIE5VTEwpOworCXZhX2VuZChhcmdzKTsKKwlyZXR1cm4gcjsKK30KKworaW50IGNvbG9yX2ZwcmludGZfbG4oRklMRSAqZnAsIGNvbnN0IGNoYXIgKmNvbG9yLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJaW50IHI7CisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlyID0gY29sb3JfdmZwcmludGYoZnAsIGNvbG9yLCBmbXQsIGFyZ3MsICJcbiIpOworCXZhX2VuZChhcmdzKTsKKwlyZXR1cm4gcjsKK30KZGlmZiAtLWdpdCBhL2NvbG9yLmggYi9jb2xvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZGE1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb2xvci5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgQ09MT1JfSAorI2RlZmluZSBDT0xPUl9ICisKKy8qICJcMDMzWzE7Mzg7NTsyeHg7NDg7NTsyeHhtXDAiIGlzIDIzIGJ5dGVzICovCisjZGVmaW5lIENPTE9SX01BWExFTiAyNAorCisvKgorICogVGhpcyB2YXJpYWJsZSBzdG9yZXMgdGhlIHZhbHVlIG9mIGNvbG9yLnVpCisgKi8KK2V4dGVybiBpbnQgZ2l0X3VzZV9jb2xvcl9kZWZhdWx0OworCisKKy8qCisgKiBVc2UgdGhpcyBpbnN0ZWFkIG9mIGdpdF9kZWZhdWx0X2NvbmZpZyBpZiB5b3UgbmVlZCB0aGUgdmFsdWUgb2YgY29sb3IudWkuCisgKi8KK2ludCBnaXRfY29sb3JfZGVmYXVsdF9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSk7CisKK2ludCBnaXRfY29uZmlnX2NvbG9yYm9vbChjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlLCBpbnQgc3Rkb3V0X2lzX3R0eSk7Cit2b2lkIGNvbG9yX3BhcnNlKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUsIGNoYXIgKmRzdCk7CitpbnQgY29sb3JfZnByaW50ZihGSUxFICpmcCwgY29uc3QgY2hhciAqY29sb3IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2ludCBjb2xvcl9mcHJpbnRmX2xuKEZJTEUgKmZwLCBjb25zdCBjaGFyICpjb2xvciwgY29uc3QgY2hhciAqZm10LCAuLi4pOworCisjZW5kaWYgLyogQ09MT1JfSCAqLwpkaWZmIC0tZ2l0IGEvY29tYmluZS1kaWZmLmMgYi9jb21iaW5lLWRpZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTE5Y2JhCi0tLSAvZGV2L251bGwKKysrIGIvY29tYmluZS1kaWZmLmMKQEAgLTAsMCArMSwxMDMwIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgImRpZmZjb3JlLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKyNpbmNsdWRlICJ4ZGlmZi1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJsb2ctdHJlZS5oIgorCitzdGF0aWMgc3RydWN0IGNvbWJpbmVfZGlmZl9wYXRoICppbnRlcnNlY3RfcGF0aHMoc3RydWN0IGNvbWJpbmVfZGlmZl9wYXRoICpjdXJyLCBpbnQgbiwgaW50IG51bV9wYXJlbnQpCit7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxID0gJmRpZmZfcXVldWVkX2RpZmY7CisJc3RydWN0IGNvbWJpbmVfZGlmZl9wYXRoICpwOworCWludCBpOworCisJaWYgKCFuKSB7CisJCXN0cnVjdCBjb21iaW5lX2RpZmZfcGF0aCAqbGlzdCA9IE5VTEwsICoqdGFpbCA9ICZsaXN0OworCQlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQkJaW50IGxlbjsKKwkJCWNvbnN0IGNoYXIgKnBhdGg7CisJCQlpZiAoZGlmZl91bm1vZGlmaWVkX3BhaXIocS0+cXVldWVbaV0pKQorCQkJCWNvbnRpbnVlOworCQkJcGF0aCA9IHEtPnF1ZXVlW2ldLT50d28tPnBhdGg7CisJCQlsZW4gPSBzdHJsZW4ocGF0aCk7CisJCQlwID0geG1hbGxvYyhjb21iaW5lX2RpZmZfcGF0aF9zaXplKG51bV9wYXJlbnQsIGxlbikpOworCQkJcC0+cGF0aCA9IChjaGFyKikgJihwLT5wYXJlbnRbbnVtX3BhcmVudF0pOworCQkJbWVtY3B5KHAtPnBhdGgsIHBhdGgsIGxlbik7CisJCQlwLT5wYXRoW2xlbl0gPSAwOworCQkJcC0+bGVuID0gbGVuOworCQkJcC0+bmV4dCA9IE5VTEw7CisJCQltZW1zZXQocC0+cGFyZW50LCAwLAorCQkJICAgICAgIHNpemVvZihwLT5wYXJlbnRbMF0pICogbnVtX3BhcmVudCk7CisKKwkJCWhhc2hjcHkocC0+c2hhMSwgcS0+cXVldWVbaV0tPnR3by0+c2hhMSk7CisJCQlwLT5tb2RlID0gcS0+cXVldWVbaV0tPnR3by0+bW9kZTsKKwkJCWhhc2hjcHkocC0+cGFyZW50W25dLnNoYTEsIHEtPnF1ZXVlW2ldLT5vbmUtPnNoYTEpOworCQkJcC0+cGFyZW50W25dLm1vZGUgPSBxLT5xdWV1ZVtpXS0+b25lLT5tb2RlOworCQkJcC0+cGFyZW50W25dLnN0YXR1cyA9IHEtPnF1ZXVlW2ldLT5zdGF0dXM7CisJCQkqdGFpbCA9IHA7CisJCQl0YWlsID0gJnAtPm5leHQ7CisJCX0KKwkJcmV0dXJuIGxpc3Q7CisJfQorCisJZm9yIChwID0gY3VycjsgcDsgcCA9IHAtPm5leHQpIHsKKwkJaW50IGZvdW5kID0gMDsKKwkJaWYgKCFwLT5sZW4pCisJCQljb250aW51ZTsKKwkJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJCWNvbnN0IGNoYXIgKnBhdGg7CisJCQlpbnQgbGVuOworCisJCQlpZiAoZGlmZl91bm1vZGlmaWVkX3BhaXIocS0+cXVldWVbaV0pKQorCQkJCWNvbnRpbnVlOworCQkJcGF0aCA9IHEtPnF1ZXVlW2ldLT50d28tPnBhdGg7CisJCQlsZW4gPSBzdHJsZW4ocGF0aCk7CisJCQlpZiAobGVuID09IHAtPmxlbiAmJiAhbWVtY21wKHBhdGgsIHAtPnBhdGgsIGxlbikpIHsKKwkJCQlmb3VuZCA9IDE7CisJCQkJaGFzaGNweShwLT5wYXJlbnRbbl0uc2hhMSwgcS0+cXVldWVbaV0tPm9uZS0+c2hhMSk7CisJCQkJcC0+cGFyZW50W25dLm1vZGUgPSBxLT5xdWV1ZVtpXS0+b25lLT5tb2RlOworCQkJCXAtPnBhcmVudFtuXS5zdGF0dXMgPSBxLT5xdWV1ZVtpXS0+c3RhdHVzOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghZm91bmQpCisJCQlwLT5sZW4gPSAwOworCX0KKwlyZXR1cm4gY3VycjsKK30KKworLyogTGluZXMgbG9zdCBmcm9tIHBhcmVudCAqLworc3RydWN0IGxsaW5lIHsKKwlzdHJ1Y3QgbGxpbmUgKm5leHQ7CisJaW50IGxlbjsKKwl1bnNpZ25lZCBsb25nIHBhcmVudF9tYXA7CisJY2hhciBsaW5lW0ZMRVhfQVJSQVldOworfTsKKworLyogTGluZXMgc3Vydml2aW5nIGluIHRoZSBtZXJnZSByZXN1bHQgKi8KK3N0cnVjdCBzbGluZSB7CisJc3RydWN0IGxsaW5lICpsb3N0X2hlYWQsICoqbG9zdF90YWlsOworCWNoYXIgKmJvbDsKKwlpbnQgbGVuOworCS8qIGJpdCAwIHVwIHRvIChOLTEpIGFyZSBvbiBpZiB0aGUgcGFyZW50IGhhcyB0aGlzIGxpbmUgKGkuZS4KKwkgKiB3ZSBkaWQgbm90IGNoYW5nZSBpdCkuCisJICogYml0IE4gaXMgdXNlZCBmb3IgImludGVyZXN0aW5nIiBsaW5lcywgaW5jbHVkaW5nIGNvbnRleHQuCisJICovCisJdW5zaWduZWQgbG9uZyBmbGFnOworCXVuc2lnbmVkIGxvbmcgKnBfbG5vOworfTsKKworc3RhdGljIGNoYXIgKmdyYWJfYmxvYihjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCB1bnNpZ25lZCBsb25nICpzaXplKQoreworCWNoYXIgKmJsb2I7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCWlmIChpc19udWxsX3NoYTEoc2hhMSkpIHsKKwkJLyogZGVsZXRlZCBibG9iICovCisJCSpzaXplID0gMDsKKwkJcmV0dXJuIHhjYWxsb2MoMSwgMSk7CisJfQorCWJsb2IgPSByZWFkX3NoYTFfZmlsZShzaGExLCAmdHlwZSwgc2l6ZSk7CisJaWYgKHR5cGUgIT0gT0JKX0JMT0IpCisJCWRpZSgib2JqZWN0ICclcycgaXMgbm90IGEgYmxvYiEiLCBzaGExX3RvX2hleChzaGExKSk7CisJcmV0dXJuIGJsb2I7Cit9CisKK3N0YXRpYyB2b2lkIGFwcGVuZF9sb3N0KHN0cnVjdCBzbGluZSAqc2xpbmUsIGludCBuLCBjb25zdCBjaGFyICpsaW5lLCBpbnQgbGVuKQoreworCXN0cnVjdCBsbGluZSAqbGxpbmU7CisJdW5zaWduZWQgbG9uZyB0aGlzX21hc2sgPSAoMVVMPDxuKTsKKwlpZiAobGluZVtsZW4tMV0gPT0gJ1xuJykKKwkJbGVuLS07CisKKwkvKiBDaGVjayB0byBzZWUgaWYgd2UgY2FuIHNxdWFzaCB0aGluZ3MgKi8KKwlpZiAoc2xpbmUtPmxvc3RfaGVhZCkgeworCQlzdHJ1Y3QgbGxpbmUgKmxhc3Rfb25lID0gTlVMTDsKKwkJLyogV2UgY2Fubm90IHNxdWFzaCBpdCB3aXRoIGVhcmxpZXIgb25lICovCisJCWZvciAobGxpbmUgPSBzbGluZS0+bG9zdF9oZWFkOworCQkgICAgIGxsaW5lOworCQkgICAgIGxsaW5lID0gbGxpbmUtPm5leHQpCisJCQlpZiAobGxpbmUtPnBhcmVudF9tYXAgJiB0aGlzX21hc2spCisJCQkJbGFzdF9vbmUgPSBsbGluZTsKKwkJbGxpbmUgPSBsYXN0X29uZSA/IGxhc3Rfb25lLT5uZXh0IDogc2xpbmUtPmxvc3RfaGVhZDsKKwkJd2hpbGUgKGxsaW5lKSB7CisJCQlpZiAobGxpbmUtPmxlbiA9PSBsZW4gJiYKKwkJCSAgICAhbWVtY21wKGxsaW5lLT5saW5lLCBsaW5lLCBsZW4pKSB7CisJCQkJbGxpbmUtPnBhcmVudF9tYXAgfD0gdGhpc19tYXNrOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWxsaW5lID0gbGxpbmUtPm5leHQ7CisJCX0KKwl9CisKKwlsbGluZSA9IHhtYWxsb2Moc2l6ZW9mKCpsbGluZSkgKyBsZW4gKyAxKTsKKwlsbGluZS0+bGVuID0gbGVuOworCWxsaW5lLT5uZXh0ID0gTlVMTDsKKwlsbGluZS0+cGFyZW50X21hcCA9IHRoaXNfbWFzazsKKwltZW1jcHkobGxpbmUtPmxpbmUsIGxpbmUsIGxlbik7CisJbGxpbmUtPmxpbmVbbGVuXSA9IDA7CisJKnNsaW5lLT5sb3N0X3RhaWwgPSBsbGluZTsKKwlzbGluZS0+bG9zdF90YWlsID0gJmxsaW5lLT5uZXh0OworfQorCitzdHJ1Y3QgY29tYmluZV9kaWZmX3N0YXRlIHsKKwlzdHJ1Y3QgeGRpZmZfZW1pdF9zdGF0ZSB4bTsKKworCXVuc2lnbmVkIGludCBsbm87CisJaW50IG9iLCBvbiwgbmIsIG5uOworCXVuc2lnbmVkIGxvbmcgbm1hc2s7CisJaW50IG51bV9wYXJlbnQ7CisJaW50IG47CisJc3RydWN0IHNsaW5lICpzbGluZTsKKwlzdHJ1Y3Qgc2xpbmUgKmxvc3RfYnVja2V0OworfTsKKworc3RhdGljIHZvaWQgY29uc3VtZV9saW5lKHZvaWQgKnN0YXRlXywgY2hhciAqbGluZSwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJc3RydWN0IGNvbWJpbmVfZGlmZl9zdGF0ZSAqc3RhdGUgPSBzdGF0ZV87CisJaWYgKDUgPCBsZW4gJiYgIW1lbWNtcCgiQEAgLSIsIGxpbmUsIDQpKSB7CisJCWlmIChwYXJzZV9odW5rX2hlYWRlcihsaW5lLCBsZW4sCisJCQkJICAgICAgJnN0YXRlLT5vYiwgJnN0YXRlLT5vbiwKKwkJCQkgICAgICAmc3RhdGUtPm5iLCAmc3RhdGUtPm5uKSkKKwkJCXJldHVybjsKKwkJc3RhdGUtPmxubyA9IHN0YXRlLT5uYjsKKwkJaWYgKCFzdGF0ZS0+bmIpCisJCQkvKiBAQCAtMSwyICswLDAgQEAgdG8gcmVtb3ZlIHRoZQorCQkJICogZmlyc3QgdHdvIGxpbmVzLi4uCisJCQkgKi8KKwkJCXN0YXRlLT5uYiA9IDE7CisJCWlmIChzdGF0ZS0+bm4gPT0gMCkKKwkJCS8qIEBAIC1YLFkgK04sMCBAQCByZW1vdmVkIFkgbGluZXMKKwkJCSAqIHRoYXQgd291bGQgaGF2ZSBjb21lICphZnRlciogbGluZSBOCisJCQkgKiBpbiB0aGUgcmVzdWx0LiAgT3VyIGxvc3QgYnVja2V0cyBoYW5nCisJCQkgKiB0byB0aGUgbGluZSBhZnRlciB0aGUgcmVtb3ZlZCBsaW5lcywKKwkJCSAqLworCQkJc3RhdGUtPmxvc3RfYnVja2V0ID0gJnN0YXRlLT5zbGluZVtzdGF0ZS0+bmJdOworCQllbHNlCisJCQlzdGF0ZS0+bG9zdF9idWNrZXQgPSAmc3RhdGUtPnNsaW5lW3N0YXRlLT5uYi0xXTsKKwkJaWYgKCFzdGF0ZS0+c2xpbmVbc3RhdGUtPm5iLTFdLnBfbG5vKQorCQkJc3RhdGUtPnNsaW5lW3N0YXRlLT5uYi0xXS5wX2xubyA9CisJCQkJeGNhbGxvYyhzdGF0ZS0+bnVtX3BhcmVudCwKKwkJCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwkJc3RhdGUtPnNsaW5lW3N0YXRlLT5uYi0xXS5wX2xub1tzdGF0ZS0+bl0gPSBzdGF0ZS0+b2I7CisJCXJldHVybjsKKwl9CisJaWYgKCFzdGF0ZS0+bG9zdF9idWNrZXQpCisJCXJldHVybjsgLyogbm90IGluIGFueSBodW5rIHlldCAqLworCXN3aXRjaCAobGluZVswXSkgeworCWNhc2UgJy0nOgorCQlhcHBlbmRfbG9zdChzdGF0ZS0+bG9zdF9idWNrZXQsIHN0YXRlLT5uLCBsaW5lKzEsIGxlbi0xKTsKKwkJYnJlYWs7CisJY2FzZSAnKyc6CisJCXN0YXRlLT5zbGluZVtzdGF0ZS0+bG5vLTFdLmZsYWcgfD0gc3RhdGUtPm5tYXNrOworCQlzdGF0ZS0+bG5vKys7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgY29tYmluZV9kaWZmKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhcmVudCwgbW1maWxlX3QgKnJlc3VsdF9maWxlLAorCQkJIHN0cnVjdCBzbGluZSAqc2xpbmUsIHVuc2lnbmVkIGludCBjbnQsIGludCBuLAorCQkJIGludCBudW1fcGFyZW50KQoreworCXVuc2lnbmVkIGludCBwX2xubywgbG5vOworCXVuc2lnbmVkIGxvbmcgbm1hc2sgPSAoMVVMIDw8IG4pOworCXhwcGFyYW1fdCB4cHA7CisJeGRlbWl0Y29uZl90IHhlY2ZnOworCW1tZmlsZV90IHBhcmVudF9maWxlOworCXhkZW1pdGNiX3QgZWNiOworCXN0cnVjdCBjb21iaW5lX2RpZmZfc3RhdGUgc3RhdGU7CisJdW5zaWduZWQgbG9uZyBzejsKKworCWlmICghY250KQorCQlyZXR1cm47IC8qIHJlc3VsdCBkZWxldGVkICovCisKKwlwYXJlbnRfZmlsZS5wdHIgPSBncmFiX2Jsb2IocGFyZW50LCAmc3opOworCXBhcmVudF9maWxlLnNpemUgPSBzejsKKwl4cHAuZmxhZ3MgPSBYREZfTkVFRF9NSU5JTUFMOworCW1lbXNldCgmeGVjZmcsIDAsIHNpemVvZih4ZWNmZykpOworCWVjYi5vdXRmID0geGRpZmZfb3V0ZjsKKwllY2IucHJpdiA9ICZzdGF0ZTsKKwltZW1zZXQoJnN0YXRlLCAwLCBzaXplb2Yoc3RhdGUpKTsKKwlzdGF0ZS54bS5jb25zdW1lID0gY29uc3VtZV9saW5lOworCXN0YXRlLm5tYXNrID0gbm1hc2s7CisJc3RhdGUuc2xpbmUgPSBzbGluZTsKKwlzdGF0ZS5sbm8gPSAxOworCXN0YXRlLm51bV9wYXJlbnQgPSBudW1fcGFyZW50OworCXN0YXRlLm4gPSBuOworCisJeGRpX2RpZmYoJnBhcmVudF9maWxlLCByZXN1bHRfZmlsZSwgJnhwcCwgJnhlY2ZnLCAmZWNiKTsKKwlmcmVlKHBhcmVudF9maWxlLnB0cik7CisKKwkvKiBBc3NpZ24gbGluZSBudW1iZXJzIGZvciB0aGlzIHBhcmVudC4KKwkgKgorCSAqIHNsaW5lW2xub10ucF9sbm9bbl0gcmVjb3JkcyB0aGUgZmlyc3QgbGluZSBudW1iZXIKKwkgKiAoY291bnRpbmcgZnJvbSAxKSBmb3IgcGFyZW50IE4gaWYgdGhlIGZpbmFsIGh1bmsgZGlzcGxheQorCSAqIHN0YXJ0ZWQgYnkgc2hvd2luZyBzbGluZVtsbm9dIChwb3NzaWJseSBzaG93aW5nIHRoZSBsb3N0CisJICogbGluZXMgYXR0YWNoZWQgdG8gaXQgZmlyc3QpLgorCSAqLworCWZvciAobG5vID0gMCwgIHBfbG5vID0gMTsgbG5vIDw9IGNudDsgbG5vKyspIHsKKwkJc3RydWN0IGxsaW5lICpsbDsKKwkJc2xpbmVbbG5vXS5wX2xub1tuXSA9IHBfbG5vOworCisJCS8qIEhvdyBtYW55IGxpbmVzIHdvdWxkIHRoaXMgc2xpbmUgYWR2YW5jZSB0aGUgcF9sbm8/ICovCisJCWxsID0gc2xpbmVbbG5vXS5sb3N0X2hlYWQ7CisJCXdoaWxlIChsbCkgeworCQkJaWYgKGxsLT5wYXJlbnRfbWFwICYgbm1hc2spCisJCQkJcF9sbm8rKzsgLyogJy0nIG1lYW5zIHBhcmVudCBoYWQgaXQgKi8KKwkJCWxsID0gbGwtPm5leHQ7CisJCX0KKwkJaWYgKGxubyA8IGNudCAmJiAhKHNsaW5lW2xub10uZmxhZyAmIG5tYXNrKSkKKwkJCXBfbG5vKys7IC8qIG5vICcrJyBtZWFucyBwYXJlbnQgaGFkIGl0ICovCisJfQorCXNsaW5lW2xub10ucF9sbm9bbl0gPSBwX2xubzsgLyogdHJhaWxlciAqLworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjb250ZXh0ID0gMzsKK3N0YXRpYyBjaGFyIGNvbWJpbmVfbWFya2VyID0gJ0AnOworCitzdGF0aWMgaW50IGludGVyZXN0aW5nKHN0cnVjdCBzbGluZSAqc2xpbmUsIHVuc2lnbmVkIGxvbmcgYWxsX21hc2spCit7CisJLyogSWYgc29tZSBwYXJlbnRzIGxvc3QgbGluZXMgaGVyZSwgb3IgaWYgd2UgaGF2ZSBhZGRlZCB0bworCSAqIHNvbWUgcGFyZW50LCBpdCBpcyBpbnRlcmVzdGluZy4KKwkgKi8KKwlyZXR1cm4gKChzbGluZS0+ZmxhZyAmIGFsbF9tYXNrKSB8fCBzbGluZS0+bG9zdF9oZWFkKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYWRqdXN0X2h1bmtfdGFpbChzdHJ1Y3Qgc2xpbmUgKnNsaW5lLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWxsX21hc2ssCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBodW5rX2JlZ2luLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgaSkKK3sKKwkvKiBpIHBvaW50cyBhdCB0aGUgZmlyc3QgdW5pbnRlcmVzdGluZyBsaW5lLiAgSWYgdGhlIGxhc3QgbGluZQorCSAqIG9mIHRoZSBodW5rIHdhcyBpbnRlcmVzdGluZyBvbmx5IGJlY2F1c2UgaXQgaGFzIHNvbWUKKwkgKiBkZWxldGlvbiwgdGhlbiBpdCBpcyBub3QgYWxsIHRoYXQgaW50ZXJlc3RpbmcgZm9yIHRoZQorCSAqIHB1cnBvc2Ugb2YgZ2l2aW5nIHRyYWlsaW5nIGNvbnRleHQgbGluZXMuICBUaGlzIGlzIGJlY2F1c2UKKwkgKiB3ZSBvdXRwdXQgJy0nIGxpbmUgYW5kIHRoZW4gdW5tb2RpZmllZCBzbGluZVtpLTFdIGl0c2VsZiBpbgorCSAqIHRoYXQgY2FzZSB3aGljaCBnaXZlcyB1cyBvbmUgZXh0cmEgY29udGV4dCBsaW5lLgorCSAqLworCWlmICgoaHVua19iZWdpbiArIDEgPD0gaSkgJiYgIShzbGluZVtpLTFdLmZsYWcgJiBhbGxfbWFzaykpCisJCWktLTsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZmluZF9uZXh0KHN0cnVjdCBzbGluZSAqc2xpbmUsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBtYXJrLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgaSwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGNudCwKKwkJCSAgICAgICBpbnQgbG9va19mb3JfdW5pbnRlcmVzdGluZykKK3sKKwkvKiBXZSBoYXZlIGV4YW1pbmVkIHVwIHRvIGktMSBhbmQgYXJlIGFib3V0IHRvIGxvb2sgYXQgaS4KKwkgKiBGaW5kIG5leHQgaW50ZXJlc3Rpbmcgb3IgdW5pbnRlcmVzdGluZyBsaW5lLiAgSGVyZSwKKwkgKiAiaW50ZXJlc3RpbmciIGRvZXMgbm90IG1lYW4gaW50ZXJlc3RpbmcoKSwgYnV0IG1hcmtlZCBieQorCSAqIHRoZSBnaXZlX2NvbnRleHQoKSBmdW5jdGlvbiBiZWxvdyAoaS5lLiBpdCBpbmNsdWRlcyBjb250ZXh0CisJICogbGluZXMgdGhhdCBhcmUgbm90IGludGVyZXN0aW5nIHRvIGludGVyZXN0aW5nKCkgZnVuY3Rpb24KKwkgKiB0aGF0IGFyZSBzdXJyb3VuZGVkIGJ5IGludGVyZXN0aW5nKCkgb25lcy4KKwkgKi8KKwl3aGlsZSAoaSA8PSBjbnQpCisJCWlmIChsb29rX2Zvcl91bmludGVyZXN0aW5nCisJCSAgICA/ICEoc2xpbmVbaV0uZmxhZyAmIG1hcmspCisJCSAgICA6IChzbGluZVtpXS5mbGFnICYgbWFyaykpCisJCQlyZXR1cm4gaTsKKwkJZWxzZQorCQkJaSsrOworCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IGdpdmVfY29udGV4dChzdHJ1Y3Qgc2xpbmUgKnNsaW5lLCB1bnNpZ25lZCBsb25nIGNudCwgaW50IG51bV9wYXJlbnQpCit7CisJdW5zaWduZWQgbG9uZyBhbGxfbWFzayA9ICgxVUw8PG51bV9wYXJlbnQpIC0gMTsKKwl1bnNpZ25lZCBsb25nIG1hcmsgPSAoMVVMPDxudW1fcGFyZW50KTsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwkvKiBUd28gZ3JvdXBzIG9mIGludGVyZXN0aW5nIGxpbmVzIG1heSBoYXZlIGEgc2hvcnQgZ2FwIG9mCisJICogdW5pbnRlcmVzdGluZyBsaW5lcy4gIENvbm5lY3Qgc3VjaCBncm91cHMgdG8gZ2l2ZSB0aGVtIGEKKwkgKiBiaXQgb2YgY29udGV4dC4KKwkgKgorCSAqIFdlIGZpcnN0IHN0YXJ0IGZyb20gd2hhdCB0aGUgaW50ZXJlc3RpbmcoKSBmdW5jdGlvbiBzYXlzLAorCSAqIGFuZCBtYXJrIHRoZW0gd2l0aCAibWFyayIsIGFuZCBwYWludCBjb250ZXh0IGxpbmVzIHdpdGggdGhlCisJICogbWFyay4gIFNvIGludGVyZXN0aW5nKCkgd291bGQgc3RpbGwgc2F5IGZhbHNlIGZvciBzdWNoIGNvbnRleHQKKwkgKiBsaW5lcyBidXQgdGhleSBhcmUgdHJlYXRlZCBhcyAiaW50ZXJlc3RpbmciIGluIHRoZSBlbmQuCisJICovCisJaSA9IGZpbmRfbmV4dChzbGluZSwgbWFyaywgMCwgY250LCAwKTsKKwlpZiAoY250IDwgaSkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoaSA8PSBjbnQpIHsKKwkJdW5zaWduZWQgbG9uZyBqID0gKGNvbnRleHQgPCBpKSA/IChpIC0gY29udGV4dCkgOiAwOworCQl1bnNpZ25lZCBsb25nIGs7CisKKwkJLyogUGFpbnQgYSBmZXcgbGluZXMgYmVmb3JlIHRoZSBmaXJzdCBpbnRlcmVzdGluZyBsaW5lLiAqLworCQl3aGlsZSAoaiA8IGkpCisJCQlzbGluZVtqKytdLmZsYWcgfD0gbWFyazsKKworCWFnYWluOgorCQkvKiB3ZSBrbm93IHVwIHRvIGkgaXMgdG8gYmUgaW5jbHVkZWQuICB3aGVyZSBkb2VzIHRoZQorCQkgKiBuZXh0IHVuaW50ZXJlc3Rpbmcgb25lIHN0YXJ0PworCQkgKi8KKwkJaiA9IGZpbmRfbmV4dChzbGluZSwgbWFyaywgaSwgY250LCAxKTsKKwkJaWYgKGNudCA8IGopCisJCQlicmVhazsgLyogdGhlIHJlc3QgYXJlIGFsbCBpbnRlcmVzdGluZyAqLworCisJCS8qIGxvb2thaGVhZCBjb250ZXh0IGxpbmVzICovCisJCWsgPSBmaW5kX25leHQoc2xpbmUsIG1hcmssIGosIGNudCwgMCk7CisJCWogPSBhZGp1c3RfaHVua190YWlsKHNsaW5lLCBhbGxfbWFzaywgaSwgaik7CisKKwkJaWYgKGsgPCBqICsgY29udGV4dCkgeworCQkJLyogayBpcyBpbnRlcmVzdGluZyBhbmQgW2osaykgYXJlIG5vdCwgYnV0CisJCQkgKiBwYWludCB0aGVtIGludGVyZXN0aW5nIGJlY2F1c2UgdGhlIGdhcCBpcyBzbWFsbC4KKwkJCSAqLworCQkJd2hpbGUgKGogPCBrKQorCQkJCXNsaW5lW2orK10uZmxhZyB8PSBtYXJrOworCQkJaSA9IGs7CisJCQlnb3RvIGFnYWluOworCQl9CisKKwkJLyogaiBpcyB0aGUgZmlyc3QgdW5pbnRlcmVzdGluZyBsaW5lIGFuZCB0aGVyZSBpcworCQkgKiBubyBvdmVybGFwIGJleW9uZCBpdCB3aXRoaW4gY29udGV4dCBsaW5lcy4gIFBhaW50CisJCSAqIHRoZSB0cmFpbGluZyBlZGdlIGEgYml0LgorCQkgKi8KKwkJaSA9IGs7CisJCWsgPSAoaiArIGNvbnRleHQgPCBjbnQrMSkgPyBqICsgY29udGV4dCA6IGNudCsxOworCQl3aGlsZSAoaiA8IGspCisJCQlzbGluZVtqKytdLmZsYWcgfD0gbWFyazsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWFrZV9odW5rcyhzdHJ1Y3Qgc2xpbmUgKnNsaW5lLCB1bnNpZ25lZCBsb25nIGNudCwKKwkJICAgICAgIGludCBudW1fcGFyZW50LCBpbnQgZGVuc2UpCit7CisJdW5zaWduZWQgbG9uZyBhbGxfbWFzayA9ICgxVUw8PG51bV9wYXJlbnQpIC0gMTsKKwl1bnNpZ25lZCBsb25nIG1hcmsgPSAoMVVMPDxudW1fcGFyZW50KTsKKwl1bnNpZ25lZCBsb25nIGk7CisJaW50IGhhc19pbnRlcmVzdGluZyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDw9IGNudDsgaSsrKSB7CisJCWlmIChpbnRlcmVzdGluZygmc2xpbmVbaV0sIGFsbF9tYXNrKSkKKwkJCXNsaW5lW2ldLmZsYWcgfD0gbWFyazsKKwkJZWxzZQorCQkJc2xpbmVbaV0uZmxhZyAmPSB+bWFyazsKKwl9CisJaWYgKCFkZW5zZSkKKwkJcmV0dXJuIGdpdmVfY29udGV4dChzbGluZSwgY250LCBudW1fcGFyZW50KTsKKworCS8qIExvb2sgYXQgZWFjaCBodW5rLCBhbmQgaWYgd2UgaGF2ZSBjaGFuZ2VzIGZyb20gb25seSBvbmUKKwkgKiBwYXJlbnQsIG9yIHRoZSBjaGFuZ2VzIGFyZSB0aGUgc2FtZSBmcm9tIGFsbCBidXQgb25lCisJICogcGFyZW50LCBtYXJrIHRoYXQgdW5pbnRlcmVzdGluZy4KKwkgKi8KKwlpID0gMDsKKwl3aGlsZSAoaSA8PSBjbnQpIHsKKwkJdW5zaWduZWQgbG9uZyBqLCBodW5rX2JlZ2luLCBodW5rX2VuZDsKKwkJdW5zaWduZWQgbG9uZyBzYW1lX2RpZmY7CisJCXdoaWxlIChpIDw9IGNudCAmJiAhKHNsaW5lW2ldLmZsYWcgJiBtYXJrKSkKKwkJCWkrKzsKKwkJaWYgKGNudCA8IGkpCisJCQlicmVhazsgLyogTm8gbW9yZSBpbnRlcmVzdGluZyBodW5rcyAqLworCQlodW5rX2JlZ2luID0gaTsKKwkJZm9yIChqID0gaSArIDE7IGogPD0gY250OyBqKyspIHsKKwkJCWlmICghKHNsaW5lW2pdLmZsYWcgJiBtYXJrKSkgeworCQkJCS8qIExvb2sgYmV5b25kIHRoZSBlbmQgdG8gc2VlIGlmIHRoZXJlCisJCQkJICogaXMgYW4gaW50ZXJlc3RpbmcgbGluZSBhZnRlciB0aGlzCisJCQkJICogaHVuayB3aXRoaW4gY29udGV4dCBzcGFuLgorCQkJCSAqLworCQkJCXVuc2lnbmVkIGxvbmcgbGE7IC8qIGxvb2thaGVhZCAqLworCQkJCWludCBjb250aW4gPSAwOworCQkJCWxhID0gYWRqdXN0X2h1bmtfdGFpbChzbGluZSwgYWxsX21hc2ssCisJCQkJCQkgICAgIGh1bmtfYmVnaW4sIGopOworCQkJCWxhID0gKGxhICsgY29udGV4dCA8IGNudCArIDEpID8KKwkJCQkJKGxhICsgY29udGV4dCkgOiBjbnQgKyAxOworCQkJCXdoaWxlIChqIDw9IC0tbGEpIHsKKwkJCQkJaWYgKHNsaW5lW2xhXS5mbGFnICYgbWFyaykgeworCQkJCQkJY29udGluID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCWlmICghY29udGluKQorCQkJCQlicmVhazsKKwkJCQlqID0gbGE7CisJCQl9CisJCX0KKwkJaHVua19lbmQgPSBqOworCisJCS8qIFtpLi5odW5rX2VuZCkgYXJlIGludGVyZXN0aW5nLiAgTm93IGlzIGl0IHJlYWxseQorCQkgKiBpbnRlcmVzdGluZz8gIFdlIGNoZWNrIGlmIHRoZXJlIGFyZSBvbmx5IHR3byB2ZXJzaW9ucworCQkgKiBhbmQgdGhlIHJlc3VsdCBtYXRjaGVzIG9uZSBvZiB0aGVtLiAgVGhhdCBpcywgd2UgbG9vaworCQkgKiBhdDoKKwkJICogICAoKykgbGluZSwgd2hpY2ggcmVjb3JkcyBsaW5lcyBhZGRlZCB0byB3aGljaCBwYXJlbnRzOworCQkgKiAgICAgICB0aGlzIGxpbmUgYXBwZWFycyBpbiB0aGUgcmVzdWx0LgorCQkgKiAgICgtKSBsaW5lLCB3aGljaCByZWNvcmRzIGZyb20gd2hhdCBwYXJlbnRzIHRoZSBsaW5lCisJCSAqICAgICAgIHdhcyByZW1vdmVkOyB0aGlzIGxpbmUgZG9lcyBub3QgYXBwZWFyIGluIHRoZSByZXN1bHQuCisJCSAqIHRoZW4gY2hlY2sgdGhlIHNldCBvZiBwYXJlbnRzIHRoZSByZXN1bHQgaGFzIGRpZmZlcmVuY2UKKwkJICogZnJvbSwgZnJvbSBhbGwgbGluZXMuICBJZiB0aGVyZSBhcmUgbGluZXMgdGhhdCBoYXMKKwkJICogZGlmZmVyZW50IHNldCBvZiBwYXJlbnRzIHRoYXQgdGhlIHJlc3VsdCBoYXMgZGlmZmVyZW5jZXMKKwkJICogZnJvbSwgdGhhdCBtZWFucyB3ZSBoYXZlIG1vcmUgdGhhbiB0d28gdmVyc2lvbnMuCisJCSAqCisJCSAqIEV2ZW4gd2hlbiB3ZSBoYXZlIG9ubHkgdHdvIHZlcnNpb25zLCBpZiB0aGUgcmVzdWx0IGRvZXMKKwkJICogbm90IG1hdGNoIGFueSBvZiB0aGUgcGFyZW50cywgdGhlIGl0IHNob3VsZCBiZSBjb25zaWRlcmVkCisJCSAqIGludGVyZXN0aW5nLiAgSW4gc3VjaCBhIGNhc2UsIHdlIHdvdWxkIGhhdmUgYWxsICcrJyBsaW5lLgorCQkgKiBBZnRlciBwYXNzaW5nIHRoZSBhYm92ZSAidHdvIHZlcnNpb25zIiB0ZXN0LCB0aGF0IHdvdWxkCisJCSAqIGFwcGVhciBhcyAidGhlIHNhbWUgc2V0IG9mIHBhcmVudHMiIHRvIGJlICJhbGwgcGFyZW50cyIuCisJCSAqLworCQlzYW1lX2RpZmYgPSAwOworCQloYXNfaW50ZXJlc3RpbmcgPSAwOworCQlmb3IgKGogPSBpOyBqIDwgaHVua19lbmQgJiYgIWhhc19pbnRlcmVzdGluZzsgaisrKSB7CisJCQl1bnNpZ25lZCBsb25nIHRoaXNfZGlmZiA9IHNsaW5lW2pdLmZsYWcgJiBhbGxfbWFzazsKKwkJCXN0cnVjdCBsbGluZSAqbGwgPSBzbGluZVtqXS5sb3N0X2hlYWQ7CisJCQlpZiAodGhpc19kaWZmKSB7CisJCQkJLyogVGhpcyBoYXMgc29tZSBjaGFuZ2VzLiAgSXMgaXQgdGhlCisJCQkJICogc2FtZSBhcyBvdGhlcnM/CisJCQkJICovCisJCQkJaWYgKCFzYW1lX2RpZmYpCisJCQkJCXNhbWVfZGlmZiA9IHRoaXNfZGlmZjsKKwkJCQllbHNlIGlmIChzYW1lX2RpZmYgIT0gdGhpc19kaWZmKSB7CisJCQkJCWhhc19pbnRlcmVzdGluZyA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCXdoaWxlIChsbCAmJiAhaGFzX2ludGVyZXN0aW5nKSB7CisJCQkJLyogTG9zdCB0aGlzIGxpbmUgZnJvbSB0aGVzZSBwYXJlbnRzOworCQkJCSAqIHdobyBhcmUgdGhleT8gIEFyZSB0aGV5IHRoZSBzYW1lPworCQkJCSAqLworCQkJCXRoaXNfZGlmZiA9IGxsLT5wYXJlbnRfbWFwOworCQkJCWlmICghc2FtZV9kaWZmKQorCQkJCQlzYW1lX2RpZmYgPSB0aGlzX2RpZmY7CisJCQkJZWxzZSBpZiAoc2FtZV9kaWZmICE9IHRoaXNfZGlmZikgeworCQkJCQloYXNfaW50ZXJlc3RpbmcgPSAxOworCQkJCX0KKwkJCQlsbCA9IGxsLT5uZXh0OworCQkJfQorCQl9CisKKwkJaWYgKCFoYXNfaW50ZXJlc3RpbmcgJiYgc2FtZV9kaWZmICE9IGFsbF9tYXNrKSB7CisJCQkvKiBUaGlzIGh1bmsgaXMgbm90IHRoYXQgaW50ZXJlc3RpbmcgYWZ0ZXIgYWxsICovCisJCQlmb3IgKGogPSBodW5rX2JlZ2luOyBqIDwgaHVua19lbmQ7IGorKykKKwkJCQlzbGluZVtqXS5mbGFnICY9IH5tYXJrOworCQl9CisJCWkgPSBodW5rX2VuZDsKKwl9CisKKwloYXNfaW50ZXJlc3RpbmcgPSBnaXZlX2NvbnRleHQoc2xpbmUsIGNudCwgbnVtX3BhcmVudCk7CisJcmV0dXJuIGhhc19pbnRlcmVzdGluZzsKK30KKworc3RhdGljIHZvaWQgc2hvd19wYXJlbnRfbG5vKHN0cnVjdCBzbGluZSAqc2xpbmUsIHVuc2lnbmVkIGxvbmcgbDAsIHVuc2lnbmVkIGxvbmcgbDEsIGludCBuLCB1bnNpZ25lZCBsb25nIG51bGxfY29udGV4dCkKK3sKKwlsMCA9IHNsaW5lW2wwXS5wX2xub1tuXTsKKwlsMSA9IHNsaW5lW2wxXS5wX2xub1tuXTsKKwlwcmludGYoIiAtJWx1LCVsdSIsIGwwLCBsMS1sMC1udWxsX2NvbnRleHQpOworfQorCitzdGF0aWMgaW50IGh1bmtfY29tbWVudF9saW5lKGNvbnN0IGNoYXIgKmJvbCkKK3sKKwlpbnQgY2g7CisKKwlpZiAoIWJvbCkKKwkJcmV0dXJuIDA7CisJY2ggPSAqYm9sICYgMHhmZjsKKwlyZXR1cm4gKGlzYWxwaGEoY2gpIHx8IGNoID09ICdfJyB8fCBjaCA9PSAnJCcpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3NsaW5lKHN0cnVjdCBzbGluZSAqc2xpbmUsIHVuc2lnbmVkIGxvbmcgY250LCBpbnQgbnVtX3BhcmVudCwKKwkJICAgICAgIGludCB1c2VfY29sb3IpCit7CisJdW5zaWduZWQgbG9uZyBtYXJrID0gKDFVTDw8bnVtX3BhcmVudCk7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBsbm8gPSAwOworCWNvbnN0IGNoYXIgKmNfZnJhZyA9IGRpZmZfZ2V0X2NvbG9yKHVzZV9jb2xvciwgRElGRl9GUkFHSU5GTyk7CisJY29uc3QgY2hhciAqY19uZXcgPSBkaWZmX2dldF9jb2xvcih1c2VfY29sb3IsIERJRkZfRklMRV9ORVcpOworCWNvbnN0IGNoYXIgKmNfb2xkID0gZGlmZl9nZXRfY29sb3IodXNlX2NvbG9yLCBESUZGX0ZJTEVfT0xEKTsKKwljb25zdCBjaGFyICpjX3BsYWluID0gZGlmZl9nZXRfY29sb3IodXNlX2NvbG9yLCBESUZGX1BMQUlOKTsKKwljb25zdCBjaGFyICpjX3Jlc2V0ID0gZGlmZl9nZXRfY29sb3IodXNlX2NvbG9yLCBESUZGX1JFU0VUKTsKKworCWlmICghY250KQorCQlyZXR1cm47IC8qIHJlc3VsdCBkZWxldGVkICovCisKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3Qgc2xpbmUgKnNsID0gJnNsaW5lW2xub107CisJCXVuc2lnbmVkIGxvbmcgaHVua19lbmQ7CisJCXVuc2lnbmVkIGxvbmcgcmxpbmVzOworCQljb25zdCBjaGFyICpodW5rX2NvbW1lbnQgPSBOVUxMOworCQl1bnNpZ25lZCBsb25nIG51bGxfY29udGV4dCA9IDA7CisKKwkJd2hpbGUgKGxubyA8PSBjbnQgJiYgIShzbGluZVtsbm9dLmZsYWcgJiBtYXJrKSkgeworCQkJaWYgKGh1bmtfY29tbWVudF9saW5lKHNsaW5lW2xub10uYm9sKSkKKwkJCQlodW5rX2NvbW1lbnQgPSBzbGluZVtsbm9dLmJvbDsKKwkJCWxubysrOworCQl9CisJCWlmIChjbnQgPCBsbm8pCisJCQlicmVhazsKKwkJZWxzZSB7CisJCQlmb3IgKGh1bmtfZW5kID0gbG5vICsgMTsgaHVua19lbmQgPD0gY250OyBodW5rX2VuZCsrKQorCQkJCWlmICghKHNsaW5lW2h1bmtfZW5kXS5mbGFnICYgbWFyaykpCisJCQkJCWJyZWFrOworCQl9CisJCXJsaW5lcyA9IGh1bmtfZW5kIC0gbG5vOworCQlpZiAoY250IDwgaHVua19lbmQpCisJCQlybGluZXMtLTsgLyogcG9pbnRpbmcgYXQgdGhlIGxhc3QgZGVsZXRlIGh1bmsgKi8KKworCQlpZiAoIWNvbnRleHQpIHsKKwkJCS8qCisJCQkgKiBFdmVuIHdoZW4gcnVubmluZyB3aXRoIC0tdW5pZmllZD0wLCBhbGwKKwkJCSAqIGxpbmVzIGluIHRoZSBodW5rIG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBpbgorCQkJICogdGhlIGxvb3AgYmVsb3cgaW4gb3JkZXIgdG8gc2hvdyB0aGUKKwkJCSAqIGRlbGV0aW9uIHJlY29yZGVkIGluIGxvc3RfaGVhZC4gIEhvd2V2ZXIsCisJCQkgKiB3ZSBkbyBub3Qgd2FudCB0byBzaG93IHRoZSByZXN1bHRpbmcgbGluZQorCQkJICogd2l0aCBhbGwgYmxhbmsgY29udGV4dCBtYXJrZXJzIGluIHN1Y2ggYQorCQkJICogY2FzZS4gIENvbXBlbnNhdGUuCisJCQkgKi8KKwkJCXVuc2lnbmVkIGxvbmcgajsKKwkJCWZvciAoaiA9IGxubzsgaiA8IGh1bmtfZW5kOyBqKyspCisJCQkJaWYgKCEoc2xpbmVbal0uZmxhZyAmIChtYXJrLTEpKSkKKwkJCQkJbnVsbF9jb250ZXh0Kys7CisJCQlybGluZXMgLT0gbnVsbF9jb250ZXh0OworCQl9CisKKwkJZnB1dHMoY19mcmFnLCBzdGRvdXQpOworCQlmb3IgKGkgPSAwOyBpIDw9IG51bV9wYXJlbnQ7IGkrKykgcHV0Y2hhcihjb21iaW5lX21hcmtlcik7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fcGFyZW50OyBpKyspCisJCQlzaG93X3BhcmVudF9sbm8oc2xpbmUsIGxubywgaHVua19lbmQsIGksIG51bGxfY29udGV4dCk7CisJCXByaW50ZigiICslbHUsJWx1ICIsIGxubysxLCBybGluZXMpOworCQlmb3IgKGkgPSAwOyBpIDw9IG51bV9wYXJlbnQ7IGkrKykgcHV0Y2hhcihjb21iaW5lX21hcmtlcik7CisKKwkJaWYgKGh1bmtfY29tbWVudCkgeworCQkJaW50IGNvbW1lbnRfZW5kID0gMDsKKwkJCWZvciAoaSA9IDA7IGkgPCA0MDsgaSsrKSB7CisJCQkJaW50IGNoID0gaHVua19jb21tZW50W2ldICYgMHhmZjsKKwkJCQlpZiAoIWNoIHx8IGNoID09ICdcbicpCisJCQkJCWJyZWFrOworCQkJCWlmICghaXNzcGFjZShjaCkpCisJCQkJICAgIGNvbW1lbnRfZW5kID0gaTsKKwkJCX0KKwkJCWlmIChjb21tZW50X2VuZCkKKwkJCQlwdXRjaGFyKCcgJyk7CisJCQlmb3IgKGkgPSAwOyBpIDwgY29tbWVudF9lbmQ7IGkrKykKKwkJCQlwdXRjaGFyKGh1bmtfY29tbWVudFtpXSk7CisJCX0KKworCQlwcmludGYoIiVzXG4iLCBjX3Jlc2V0KTsKKwkJd2hpbGUgKGxubyA8IGh1bmtfZW5kKSB7CisJCQlzdHJ1Y3QgbGxpbmUgKmxsOworCQkJaW50IGo7CisJCQl1bnNpZ25lZCBsb25nIHBfbWFzazsKKwkJCXNsID0gJnNsaW5lW2xubysrXTsKKwkJCWxsID0gc2wtPmxvc3RfaGVhZDsKKwkJCXdoaWxlIChsbCkgeworCQkJCWZwdXRzKGNfb2xkLCBzdGRvdXQpOworCQkJCWZvciAoaiA9IDA7IGogPCBudW1fcGFyZW50OyBqKyspIHsKKwkJCQkJaWYgKGxsLT5wYXJlbnRfbWFwICYgKDFVTDw8aikpCisJCQkJCQlwdXRjaGFyKCctJyk7CisJCQkJCWVsc2UKKwkJCQkJCXB1dGNoYXIoJyAnKTsKKwkJCQl9CisJCQkJcHJpbnRmKCIlcyVzXG4iLCBsbC0+bGluZSwgY19yZXNldCk7CisJCQkJbGwgPSBsbC0+bmV4dDsKKwkJCX0KKwkJCWlmIChjbnQgPCBsbm8pCisJCQkJYnJlYWs7CisJCQlwX21hc2sgPSAxOworCQkJaWYgKCEoc2wtPmZsYWcgJiAobWFyay0xKSkpIHsKKwkJCQkvKgorCQkJCSAqIFRoaXMgc2xpbmUgd2FzIGhlcmUgdG8gaGFuZyB0aGUKKwkJCQkgKiBsb3N0IGxpbmVzIGluIGZyb250IG9mIGl0LgorCQkJCSAqLworCQkJCWlmICghY29udGV4dCkKKwkJCQkJY29udGludWU7CisJCQkJZnB1dHMoY19wbGFpbiwgc3Rkb3V0KTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlmcHV0cyhjX25ldywgc3Rkb3V0KTsKKwkJCWZvciAoaiA9IDA7IGogPCBudW1fcGFyZW50OyBqKyspIHsKKwkJCQlpZiAocF9tYXNrICYgc2wtPmZsYWcpCisJCQkJCXB1dGNoYXIoJysnKTsKKwkJCQllbHNlCisJCQkJCXB1dGNoYXIoJyAnKTsKKwkJCQlwX21hc2sgPDw9IDE7CisJCQl9CisJCQlwcmludGYoIiUuKnMlc1xuIiwgc2wtPmxlbiwgc2wtPmJvbCwgY19yZXNldCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJldXNlX2NvbWJpbmVfZGlmZihzdHJ1Y3Qgc2xpbmUgKnNsaW5lLCB1bnNpZ25lZCBsb25nIGNudCwKKwkJCSAgICAgICBpbnQgaSwgaW50IGopCit7CisJLyogV2UgaGF2ZSBhbHJlYWR5IGV4YW1pbmVkIHBhcmVudCBqIGFuZCB3ZSBrbm93IHBhcmVudCBpCisJICogYW5kIHBhcmVudCBqIGFyZSB0aGUgc2FtZSwgc28gcmV1c2UgdGhlIGNvbWJpbmVkIHJlc3VsdAorCSAqIG9mIHBhcmVudCBqIGZvciBwYXJlbnQgaS4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIGxubywgaW1hc2ssIGptYXNrOworCWltYXNrID0gKDFVTDw8aSk7CisJam1hc2sgPSAoMVVMPDxqKTsKKworCWZvciAobG5vID0gMDsgbG5vIDw9IGNudDsgbG5vKyspIHsKKwkJc3RydWN0IGxsaW5lICpsbCA9IHNsaW5lLT5sb3N0X2hlYWQ7CisJCXNsaW5lLT5wX2xub1tpXSA9IHNsaW5lLT5wX2xub1tqXTsKKwkJd2hpbGUgKGxsKSB7CisJCQlpZiAobGwtPnBhcmVudF9tYXAgJiBqbWFzaykKKwkJCQlsbC0+cGFyZW50X21hcCB8PSBpbWFzazsKKwkJCWxsID0gbGwtPm5leHQ7CisJCX0KKwkJaWYgKHNsaW5lLT5mbGFnICYgam1hc2spCisJCQlzbGluZS0+ZmxhZyB8PSBpbWFzazsKKwkJc2xpbmUrKzsKKwl9CisJLyogdGhlIG92ZXJhbGwgc2l6ZSBvZiB0aGUgZmlsZSAoc2xpbmVbY250XSkgKi8KKwlzbGluZS0+cF9sbm9baV0gPSBzbGluZS0+cF9sbm9bal07Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfcXVvdGVkX3BhdGgoY29uc3QgY2hhciAqaGVhZCwKKwkJCSAgICAgY29uc3QgY2hhciAqcHJlZml4LAorCQkJICAgICBjb25zdCBjaGFyICpwYXRoLAorCQkJICAgICBjb25zdCBjaGFyICpjX21ldGEsIGNvbnN0IGNoYXIgKmNfcmVzZXQpCit7CisJc3RhdGljIHN0cnVjdCBzdHJidWYgYnVmID0gU1RSQlVGX0lOSVQ7CisKKwlzdHJidWZfcmVzZXQoJmJ1Zik7CisJc3RyYnVmX2FkZHN0cigmYnVmLCBjX21ldGEpOworCXN0cmJ1Zl9hZGRzdHIoJmJ1ZiwgaGVhZCk7CisJcXVvdGVfdHdvX2Nfc3R5bGUoJmJ1ZiwgcHJlZml4LCBwYXRoLCAwKTsKKwlzdHJidWZfYWRkc3RyKCZidWYsIGNfcmVzZXQpOworCXB1dHMoYnVmLmJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfcGF0Y2hfZGlmZihzdHJ1Y3QgY29tYmluZV9kaWZmX3BhdGggKmVsZW0sIGludCBudW1fcGFyZW50LAorCQkJICAgIGludCBkZW5zZSwgc3RydWN0IHJldl9pbmZvICpyZXYpCit7CisJc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0ID0gJnJldi0+ZGlmZm9wdDsKKwl1bnNpZ25lZCBsb25nIHJlc3VsdF9zaXplLCBjbnQsIGxubzsKKwljaGFyICpyZXN1bHQsICpjcDsKKwlzdHJ1Y3Qgc2xpbmUgKnNsaW5lOyAvKiBzdXJ2aXZlZCBsaW5lcyAqLworCWludCBtb2RlX2RpZmZlcnMgPSAwOworCWludCBpLCBzaG93X2h1bmtzOworCWludCB3b3JraW5nX3RyZWVfZmlsZSA9IGlzX251bGxfc2hhMShlbGVtLT5zaGExKTsKKwlpbnQgYWJicmV2ID0gRElGRl9PUFRfVFNUKG9wdCwgRlVMTF9JTkRFWCkgPyA0MCA6IERFRkFVTFRfQUJCUkVWOworCW1tZmlsZV90IHJlc3VsdF9maWxlOworCisJY29udGV4dCA9IG9wdC0+Y29udGV4dDsKKwkvKiBSZWFkIHRoZSByZXN1bHQgb2YgbWVyZ2UgZmlyc3QgKi8KKwlpZiAoIXdvcmtpbmdfdHJlZV9maWxlKQorCQlyZXN1bHQgPSBncmFiX2Jsb2IoZWxlbS0+c2hhMSwgJnJlc3VsdF9zaXplKTsKKwllbHNlIHsKKwkJLyogVXNlZCBieSBkaWZmLXRyZWUgdG8gcmVhZCBmcm9tIHRoZSB3b3JraW5nIHRyZWUgKi8KKwkJc3RydWN0IHN0YXQgc3Q7CisJCWludCBmZCA9IC0xOworCisJCWlmIChsc3RhdChlbGVtLT5wYXRoLCAmc3QpIDwgMCkKKwkJCWdvdG8gZGVsZXRlZF9maWxlOworCisJCWlmIChTX0lTTE5LKHN0LnN0X21vZGUpKSB7CisJCQlzaXplX3QgbGVuID0geHNpemVfdChzdC5zdF9zaXplKTsKKwkJCXJlc3VsdF9zaXplID0gbGVuOworCQkJcmVzdWx0ID0geG1hbGxvYyhsZW4gKyAxKTsKKwkJCWlmIChyZXN1bHRfc2l6ZSAhPSByZWFkbGluayhlbGVtLT5wYXRoLCByZXN1bHQsIGxlbikpIHsKKwkJCQllcnJvcigicmVhZGxpbmsoJXMpOiAlcyIsIGVsZW0tPnBhdGgsCisJCQkJICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlyZXN1bHRbbGVuXSA9IDA7CisJCQllbGVtLT5tb2RlID0gY2Fub25fbW9kZShzdC5zdF9tb2RlKTsKKwkJfQorCQllbHNlIGlmICgwIDw9IChmZCA9IG9wZW4oZWxlbS0+cGF0aCwgT19SRE9OTFkpKSAmJgorCQkJICFmc3RhdChmZCwgJnN0KSkgeworCQkJc2l6ZV90IGxlbiA9IHhzaXplX3Qoc3Quc3Rfc2l6ZSk7CisJCQlzaXplX3Qgc3ogPSAwOworCQkJaW50IGlzX2ZpbGUsIGk7CisKKwkJCWVsZW0tPm1vZGUgPSBjYW5vbl9tb2RlKHN0LnN0X21vZGUpOworCQkJLyogaWYgc3ltbGlua3MgZG9uJ3Qgd29yaywgYXNzdW1lIHN5bWxpbmsgaWYgYWxsIHBhcmVudHMKKwkJCSAqIGFyZSBzeW1saW5rcworCQkJICovCisJCQlpc19maWxlID0gaGFzX3N5bWxpbmtzOworCQkJZm9yIChpID0gMDsgIWlzX2ZpbGUgJiYgaSA8IG51bV9wYXJlbnQ7IGkrKykKKwkJCQlpc19maWxlID0gIVNfSVNMTksoZWxlbS0+cGFyZW50W2ldLm1vZGUpOworCQkJaWYgKCFpc19maWxlKQorCQkJCWVsZW0tPm1vZGUgPSBjYW5vbl9tb2RlKFNfSUZMTkspOworCisJCQlyZXN1bHRfc2l6ZSA9IGxlbjsKKwkJCXJlc3VsdCA9IHhtYWxsb2MobGVuICsgMSk7CisJCQl3aGlsZSAoc3ogPCBsZW4pIHsKKwkJCQlzc2l6ZV90IGRvbmUgPSB4cmVhZChmZCwgcmVzdWx0K3N6LCBsZW4tc3opOworCQkJCWlmIChkb25lID09IDApCisJCQkJCWJyZWFrOworCQkJCWlmIChkb25lIDwgMCkKKwkJCQkJZGllKCJyZWFkIGVycm9yICclcyciLCBlbGVtLT5wYXRoKTsKKwkJCQlzeiArPSBkb25lOworCQkJfQorCQkJcmVzdWx0W2xlbl0gPSAwOworCQl9CisJCWVsc2UgeworCQlkZWxldGVkX2ZpbGU6CisJCQlyZXN1bHRfc2l6ZSA9IDA7CisJCQllbGVtLT5tb2RlID0gMDsKKwkJCXJlc3VsdCA9IHhjYWxsb2MoMSwgMSk7CisJCX0KKworCQlpZiAoMCA8PSBmZCkKKwkJCWNsb3NlKGZkKTsKKwl9CisKKwlmb3IgKGNudCA9IDAsIGNwID0gcmVzdWx0OyBjcCA8IHJlc3VsdCArIHJlc3VsdF9zaXplOyBjcCsrKSB7CisJCWlmICgqY3AgPT0gJ1xuJykKKwkJCWNudCsrOworCX0KKwlpZiAocmVzdWx0X3NpemUgJiYgcmVzdWx0W3Jlc3VsdF9zaXplLTFdICE9ICdcbicpCisJCWNudCsrOyAvKiBpbmNvbXBsZXRlIGxpbmUgKi8KKworCXNsaW5lID0geGNhbGxvYyhjbnQrMiwgc2l6ZW9mKCpzbGluZSkpOworCXNsaW5lWzBdLmJvbCA9IHJlc3VsdDsKKwlmb3IgKGxubyA9IDA7IGxubyA8PSBjbnQgKyAxOyBsbm8rKykgeworCQlzbGluZVtsbm9dLmxvc3RfdGFpbCA9ICZzbGluZVtsbm9dLmxvc3RfaGVhZDsKKwkJc2xpbmVbbG5vXS5mbGFnID0gMDsKKwl9CisJZm9yIChsbm8gPSAwLCBjcCA9IHJlc3VsdDsgY3AgPCByZXN1bHQgKyByZXN1bHRfc2l6ZTsgY3ArKykgeworCQlpZiAoKmNwID09ICdcbicpIHsKKwkJCXNsaW5lW2xub10ubGVuID0gY3AgLSBzbGluZVtsbm9dLmJvbDsKKwkJCWxubysrOworCQkJaWYgKGxubyA8IGNudCkKKwkJCQlzbGluZVtsbm9dLmJvbCA9IGNwICsgMTsKKwkJfQorCX0KKwlpZiAocmVzdWx0X3NpemUgJiYgcmVzdWx0W3Jlc3VsdF9zaXplLTFdICE9ICdcbicpCisJCXNsaW5lW2NudC0xXS5sZW4gPSByZXN1bHRfc2l6ZSAtIChzbGluZVtjbnQtMV0uYm9sIC0gcmVzdWx0KTsKKworCXJlc3VsdF9maWxlLnB0ciA9IHJlc3VsdDsKKwlyZXN1bHRfZmlsZS5zaXplID0gcmVzdWx0X3NpemU7CisKKwkvKiBFdmVuIHBfbG5vW2NudCsxXSBpcyB2YWxpZCAtLSB0aGF0IGlzIGZvciB0aGUgZW5kIGxpbmUgbnVtYmVyCisJICogZm9yIGRlbGV0aW9uIGh1bmsgYXQgdGhlIGVuZC4KKwkgKi8KKwlzbGluZVswXS5wX2xubyA9IHhjYWxsb2MoKGNudCsyKSAqIG51bV9wYXJlbnQsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJZm9yIChsbm8gPSAwOyBsbm8gPD0gY250OyBsbm8rKykKKwkJc2xpbmVbbG5vKzFdLnBfbG5vID0gc2xpbmVbbG5vXS5wX2xubyArIG51bV9wYXJlbnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhcmVudDsgaSsrKSB7CisJCWludCBqOworCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisJCQlpZiAoIWhhc2hjbXAoZWxlbS0+cGFyZW50W2ldLnNoYTEsCisJCQkJICAgICBlbGVtLT5wYXJlbnRbal0uc2hhMSkpIHsKKwkJCQlyZXVzZV9jb21iaW5lX2RpZmYoc2xpbmUsIGNudCwgaSwgaik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGkgPD0gaikKKwkJCWNvbWJpbmVfZGlmZihlbGVtLT5wYXJlbnRbaV0uc2hhMSwgJnJlc3VsdF9maWxlLCBzbGluZSwKKwkJCQkgICAgIGNudCwgaSwgbnVtX3BhcmVudCk7CisJCWlmIChlbGVtLT5wYXJlbnRbaV0ubW9kZSAhPSBlbGVtLT5tb2RlKQorCQkJbW9kZV9kaWZmZXJzID0gMTsKKwl9CisKKwlzaG93X2h1bmtzID0gbWFrZV9odW5rcyhzbGluZSwgY250LCBudW1fcGFyZW50LCBkZW5zZSk7CisKKwlpZiAoc2hvd19odW5rcyB8fCBtb2RlX2RpZmZlcnMgfHwgd29ya2luZ190cmVlX2ZpbGUpIHsKKwkJY29uc3QgY2hhciAqYWJiOworCQlpbnQgdXNlX2NvbG9yID0gRElGRl9PUFRfVFNUKG9wdCwgQ09MT1JfRElGRik7CisJCWNvbnN0IGNoYXIgKmNfbWV0YSA9IGRpZmZfZ2V0X2NvbG9yKHVzZV9jb2xvciwgRElGRl9NRVRBSU5GTyk7CisJCWNvbnN0IGNoYXIgKmNfcmVzZXQgPSBkaWZmX2dldF9jb2xvcih1c2VfY29sb3IsIERJRkZfUkVTRVQpOworCQlpbnQgYWRkZWQgPSAwOworCQlpbnQgZGVsZXRlZCA9IDA7CisKKwkJaWYgKHJldi0+bG9naW5mbyAmJiAhcmV2LT5ub19jb21taXRfaWQpCisJCQlzaG93X2xvZyhyZXYsIG9wdC0+bXNnX3NlcCk7CisJCWR1bXBfcXVvdGVkX3BhdGgoZGVuc2UgPyAiZGlmZiAtLWNjICIgOiAiZGlmZiAtLWNvbWJpbmVkICIsCisJCQkJICIiLCBlbGVtLT5wYXRoLCBjX21ldGEsIGNfcmVzZXQpOworCQlwcmludGYoIiVzaW5kZXggIiwgY19tZXRhKTsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9wYXJlbnQ7IGkrKykgeworCQkJYWJiID0gZmluZF91bmlxdWVfYWJicmV2KGVsZW0tPnBhcmVudFtpXS5zaGExLAorCQkJCQkJIGFiYnJldik7CisJCQlwcmludGYoIiVzJXMiLCBpID8gIiwiIDogIiIsIGFiYik7CisJCX0KKwkJYWJiID0gZmluZF91bmlxdWVfYWJicmV2KGVsZW0tPnNoYTEsIGFiYnJldik7CisJCXByaW50ZigiLi4lcyVzXG4iLCBhYmIsIGNfcmVzZXQpOworCisJCWlmIChtb2RlX2RpZmZlcnMpIHsKKwkJCWRlbGV0ZWQgPSAhZWxlbS0+bW9kZTsKKworCQkJLyogV2Ugc2F5IGl0IHdhcyBhZGRlZCBpZiBub2JvZHkgaGFkIGl0ICovCisJCQlhZGRlZCA9ICFkZWxldGVkOworCQkJZm9yIChpID0gMDsgYWRkZWQgJiYgaSA8IG51bV9wYXJlbnQ7IGkrKykKKwkJCQlpZiAoZWxlbS0+cGFyZW50W2ldLnN0YXR1cyAhPQorCQkJCSAgICBESUZGX1NUQVRVU19BRERFRCkKKwkJCQkJYWRkZWQgPSAwOworCQkJaWYgKGFkZGVkKQorCQkJCXByaW50ZigiJXNuZXcgZmlsZSBtb2RlICUwNm8iLAorCQkJCSAgICAgICBjX21ldGEsIGVsZW0tPm1vZGUpOworCQkJZWxzZSB7CisJCQkJaWYgKGRlbGV0ZWQpCisJCQkJCXByaW50ZigiJXNkZWxldGVkIGZpbGUgIiwgY19tZXRhKTsKKwkJCQlwcmludGYoIm1vZGUgIik7CisJCQkJZm9yIChpID0gMDsgaSA8IG51bV9wYXJlbnQ7IGkrKykgeworCQkJCQlwcmludGYoIiVzJTA2byIsIGkgPyAiLCIgOiAiIiwKKwkJCQkJICAgICAgIGVsZW0tPnBhcmVudFtpXS5tb2RlKTsKKwkJCQl9CisJCQkJaWYgKGVsZW0tPm1vZGUpCisJCQkJCXByaW50ZigiLi4lMDZvIiwgZWxlbS0+bW9kZSk7CisJCQl9CisJCQlwcmludGYoIiVzXG4iLCBjX3Jlc2V0KTsKKwkJfQorCQlpZiAoYWRkZWQpCisJCQlkdW1wX3F1b3RlZF9wYXRoKCItLS0gIiwgIiIsICIvZGV2L251bGwiLAorCQkJCQkgY19tZXRhLCBjX3Jlc2V0KTsKKwkJZWxzZQorCQkJZHVtcF9xdW90ZWRfcGF0aCgiLS0tICIsIG9wdC0+YV9wcmVmaXgsIGVsZW0tPnBhdGgsCisJCQkJCSBjX21ldGEsIGNfcmVzZXQpOworCQlpZiAoZGVsZXRlZCkKKwkJCWR1bXBfcXVvdGVkX3BhdGgoIisrKyAiLCAiIiwgIi9kZXYvbnVsbCIsCisJCQkJCSBjX21ldGEsIGNfcmVzZXQpOworCQllbHNlCisJCQlkdW1wX3F1b3RlZF9wYXRoKCIrKysgIiwgb3B0LT5iX3ByZWZpeCwgZWxlbS0+cGF0aCwKKwkJCQkJIGNfbWV0YSwgY19yZXNldCk7CisJCWR1bXBfc2xpbmUoc2xpbmUsIGNudCwgbnVtX3BhcmVudCwKKwkJCSAgIERJRkZfT1BUX1RTVChvcHQsIENPTE9SX0RJRkYpKTsKKwl9CisJZnJlZShyZXN1bHQpOworCisJZm9yIChsbm8gPSAwOyBsbm8gPCBjbnQ7IGxubysrKSB7CisJCWlmIChzbGluZVtsbm9dLmxvc3RfaGVhZCkgeworCQkJc3RydWN0IGxsaW5lICpsbCA9IHNsaW5lW2xub10ubG9zdF9oZWFkOworCQkJd2hpbGUgKGxsKSB7CisJCQkJc3RydWN0IGxsaW5lICp0bXAgPSBsbDsKKwkJCQlsbCA9IGxsLT5uZXh0OworCQkJCWZyZWUodG1wKTsKKwkJCX0KKwkJfQorCX0KKwlmcmVlKHNsaW5lWzBdLnBfbG5vKTsKKwlmcmVlKHNsaW5lKTsKK30KKworI2RlZmluZSBDT0xPTlMgIjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6IgorCitzdGF0aWMgdm9pZCBzaG93X3Jhd19kaWZmKHN0cnVjdCBjb21iaW5lX2RpZmZfcGF0aCAqcCwgaW50IG51bV9wYXJlbnQsIHN0cnVjdCByZXZfaW5mbyAqcmV2KQoreworCXN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCA9ICZyZXYtPmRpZmZvcHQ7CisJaW50IGksIG9mZnNldDsKKwljb25zdCBjaGFyICpwcmVmaXg7CisJaW50IGxpbmVfdGVybWluYXRpb24sIGludGVyX25hbWVfdGVybWluYXRpb247CisKKwlsaW5lX3Rlcm1pbmF0aW9uID0gb3B0LT5saW5lX3Rlcm1pbmF0aW9uOworCWludGVyX25hbWVfdGVybWluYXRpb24gPSAnXHQnOworCWlmICghbGluZV90ZXJtaW5hdGlvbikKKwkJaW50ZXJfbmFtZV90ZXJtaW5hdGlvbiA9IDA7CisKKwlpZiAocmV2LT5sb2dpbmZvICYmICFyZXYtPm5vX2NvbW1pdF9pZCkKKwkJc2hvd19sb2cocmV2LCBvcHQtPm1zZ19zZXApOworCisJaWYgKG9wdC0+b3V0cHV0X2Zvcm1hdCAmIERJRkZfRk9STUFUX1JBVykgeworCQlvZmZzZXQgPSBzdHJsZW4oQ09MT05TKSAtIG51bV9wYXJlbnQ7CisJCWlmIChvZmZzZXQgPCAwKQorCQkJb2Zmc2V0ID0gMDsKKwkJcHJlZml4ID0gQ09MT05TICsgb2Zmc2V0OworCisJCS8qIFNob3cgdGhlIG1vZGVzICovCisJCWZvciAoaSA9IDA7IGkgPCBudW1fcGFyZW50OyBpKyspIHsKKwkJCXByaW50ZigiJXMlMDZvIiwgcHJlZml4LCBwLT5wYXJlbnRbaV0ubW9kZSk7CisJCQlwcmVmaXggPSAiICI7CisJCX0KKwkJcHJpbnRmKCIlcyUwNm8iLCBwcmVmaXgsIHAtPm1vZGUpOworCisJCS8qIFNob3cgc2hhMSdzICovCisJCWZvciAoaSA9IDA7IGkgPCBudW1fcGFyZW50OyBpKyspCisJCQlwcmludGYoIiAlcyIsIGRpZmZfdW5pcXVlX2FiYnJldihwLT5wYXJlbnRbaV0uc2hhMSwKKwkJCQkJCQkgb3B0LT5hYmJyZXYpKTsKKwkJcHJpbnRmKCIgJXMgIiwgZGlmZl91bmlxdWVfYWJicmV2KHAtPnNoYTEsIG9wdC0+YWJicmV2KSk7CisJfQorCisJaWYgKG9wdC0+b3V0cHV0X2Zvcm1hdCAmIChESUZGX0ZPUk1BVF9SQVcgfCBESUZGX0ZPUk1BVF9OQU1FX1NUQVRVUykpIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9wYXJlbnQ7IGkrKykKKwkJCXB1dGNoYXIocC0+cGFyZW50W2ldLnN0YXR1cyk7CisJCXB1dGNoYXIoaW50ZXJfbmFtZV90ZXJtaW5hdGlvbik7CisJfQorCisJd3JpdGVfbmFtZV9xdW90ZWQocC0+cGF0aCwgc3Rkb3V0LCBsaW5lX3Rlcm1pbmF0aW9uKTsKK30KKwordm9pZCBzaG93X2NvbWJpbmVkX2RpZmYoc3RydWN0IGNvbWJpbmVfZGlmZl9wYXRoICpwLAorCQkgICAgICAgaW50IG51bV9wYXJlbnQsCisJCSAgICAgICBpbnQgZGVuc2UsCisJCSAgICAgICBzdHJ1Y3QgcmV2X2luZm8gKnJldikKK3sKKwlzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQgPSAmcmV2LT5kaWZmb3B0OworCWlmICghcC0+bGVuKQorCQlyZXR1cm47CisJaWYgKG9wdC0+b3V0cHV0X2Zvcm1hdCAmIChESUZGX0ZPUk1BVF9SQVcgfAorCQkJCSAgRElGRl9GT1JNQVRfTkFNRSB8CisJCQkJICBESUZGX0ZPUk1BVF9OQU1FX1NUQVRVUykpCisJCXNob3dfcmF3X2RpZmYocCwgbnVtX3BhcmVudCwgcmV2KTsKKwllbHNlIGlmIChvcHQtPm91dHB1dF9mb3JtYXQgJiBESUZGX0ZPUk1BVF9QQVRDSCkKKwkJc2hvd19wYXRjaF9kaWZmKHAsIG51bV9wYXJlbnQsIGRlbnNlLCByZXYpOworfQorCit2b2lkIGRpZmZfdHJlZV9jb21iaW5lZChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciBwYXJlbnRbXVsyMF0sCisJCQlpbnQgbnVtX3BhcmVudCwKKwkJCWludCBkZW5zZSwKKwkJCXN0cnVjdCByZXZfaW5mbyAqcmV2KQoreworCXN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCA9ICZyZXYtPmRpZmZvcHQ7CisJc3RydWN0IGRpZmZfb3B0aW9ucyBkaWZmb3B0czsKKwlzdHJ1Y3QgY29tYmluZV9kaWZmX3BhdGggKnAsICpwYXRocyA9IE5VTEw7CisJaW50IGksIG51bV9wYXRocywgbmVlZHNlcCwgc2hvd19sb2dfZmlyc3Q7CisKKwlkaWZmb3B0cyA9ICpvcHQ7CisJZGlmZm9wdHMub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX05PX09VVFBVVDsKKwlESUZGX09QVF9TRVQoJmRpZmZvcHRzLCBSRUNVUlNJVkUpOworCURJRkZfT1BUX0NMUigmZGlmZm9wdHMsIEFMTE9XX0VYVEVSTkFMKTsKKworCXNob3dfbG9nX2ZpcnN0ID0gISFyZXYtPmxvZ2luZm8gJiYgIXJldi0+bm9fY29tbWl0X2lkOworCW5lZWRzZXAgPSAwOworCS8qIGZpbmQgc2V0IG9mIHBhdGhzIHRoYXQgZXZlcnlib2R5IHRvdWNoZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhcmVudDsgaSsrKSB7CisJCS8qIHNob3cgc3RhdCBhZ2FpbnN0IHRoZSBmaXJzdCBwYXJlbnQgZXZlbgorCQkgKiB3aGVuIGRvaW5nIGNvbWJpbmVkIGRpZmYuCisJCSAqLworCQlpbnQgc3RhdF9vcHQgPSAob3B0LT5vdXRwdXRfZm9ybWF0ICYKKwkJCQkoRElGRl9GT1JNQVRfTlVNU1RBVHxESUZGX0ZPUk1BVF9ESUZGU1RBVCkpOworCQlpZiAoaSA9PSAwICYmIHN0YXRfb3B0KQorCQkJZGlmZm9wdHMub3V0cHV0X2Zvcm1hdCA9IHN0YXRfb3B0OworCQllbHNlCisJCQlkaWZmb3B0cy5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfTk9fT1VUUFVUOworCQlkaWZmX3RyZWVfc2hhMShwYXJlbnRbaV0sIHNoYTEsICIiLCAmZGlmZm9wdHMpOworCQlkaWZmY29yZV9zdGQoJmRpZmZvcHRzKTsKKwkJcGF0aHMgPSBpbnRlcnNlY3RfcGF0aHMocGF0aHMsIGksIG51bV9wYXJlbnQpOworCisJCWlmIChzaG93X2xvZ19maXJzdCAmJiBpID09IDApIHsKKwkJCXNob3dfbG9nKHJldiwgb3B0LT5tc2dfc2VwKTsKKwkJCWlmIChyZXYtPnZlcmJvc2VfaGVhZGVyICYmIG9wdC0+b3V0cHV0X2Zvcm1hdCkKKwkJCQlwdXRjaGFyKG9wdC0+bGluZV90ZXJtaW5hdGlvbik7CisJCX0KKwkJZGlmZl9mbHVzaCgmZGlmZm9wdHMpOworCX0KKworCS8qIGZpbmQgb3V0IHN1cnZpdmluZyBwYXRocyAqLworCWZvciAobnVtX3BhdGhzID0gMCwgcCA9IHBhdGhzOyBwOyBwID0gcC0+bmV4dCkgeworCQlpZiAocC0+bGVuKQorCQkJbnVtX3BhdGhzKys7CisJfQorCWlmIChudW1fcGF0aHMpIHsKKwkJaWYgKG9wdC0+b3V0cHV0X2Zvcm1hdCAmIChESUZGX0ZPUk1BVF9SQVcgfAorCQkJCQkgIERJRkZfRk9STUFUX05BTUUgfAorCQkJCQkgIERJRkZfRk9STUFUX05BTUVfU1RBVFVTKSkgeworCQkJZm9yIChwID0gcGF0aHM7IHA7IHAgPSBwLT5uZXh0KSB7CisJCQkJaWYgKHAtPmxlbikKKwkJCQkJc2hvd19yYXdfZGlmZihwLCBudW1fcGFyZW50LCByZXYpOworCQkJfQorCQkJbmVlZHNlcCA9IDE7CisJCX0KKwkJZWxzZSBpZiAob3B0LT5vdXRwdXRfZm9ybWF0ICYKKwkJCSAoRElGRl9GT1JNQVRfTlVNU1RBVHxESUZGX0ZPUk1BVF9ESUZGU1RBVCkpCisJCQluZWVkc2VwID0gMTsKKwkJaWYgKG9wdC0+b3V0cHV0X2Zvcm1hdCAmIERJRkZfRk9STUFUX1BBVENIKSB7CisJCQlpZiAobmVlZHNlcCkKKwkJCQlwdXRjaGFyKG9wdC0+bGluZV90ZXJtaW5hdGlvbik7CisJCQlmb3IgKHAgPSBwYXRoczsgcDsgcCA9IHAtPm5leHQpIHsKKwkJCQlpZiAocC0+bGVuKQorCQkJCQlzaG93X3BhdGNoX2RpZmYocCwgbnVtX3BhcmVudCwgZGVuc2UsCisJCQkJCQkJcmV2KTsKKwkJCX0KKwkJfQorCX0KKworCS8qIENsZWFuIHRoaW5ncyB1cCAqLworCXdoaWxlIChwYXRocykgeworCQlzdHJ1Y3QgY29tYmluZV9kaWZmX3BhdGggKnRtcCA9IHBhdGhzOworCQlwYXRocyA9IHBhdGhzLT5uZXh0OworCQlmcmVlKHRtcCk7CisJfQorfQorCit2b2lkIGRpZmZfdHJlZV9jb21iaW5lZF9tZXJnZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkJICAgICBpbnQgZGVuc2UsIHN0cnVjdCByZXZfaW5mbyAqcmV2KQoreworCWludCBudW1fcGFyZW50OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKCpwYXJlbnQpWzIwXTsKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsb29rdXBfY29tbWl0KHNoYTEpOworCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50czsKKworCS8qIGNvdW50IHBhcmVudHMgKi8KKwlmb3IgKHBhcmVudHMgPSBjb21taXQtPnBhcmVudHMsIG51bV9wYXJlbnQgPSAwOworCSAgICAgcGFyZW50czsKKwkgICAgIHBhcmVudHMgPSBwYXJlbnRzLT5uZXh0LCBudW1fcGFyZW50KyspCisJCTsgLyogbm90aGluZyAqLworCisJcGFyZW50ID0geG1hbGxvYyhudW1fcGFyZW50ICogc2l6ZW9mKCpwYXJlbnQpKTsKKwlmb3IgKHBhcmVudHMgPSBjb21taXQtPnBhcmVudHMsIG51bV9wYXJlbnQgPSAwOworCSAgICAgcGFyZW50czsKKwkgICAgIHBhcmVudHMgPSBwYXJlbnRzLT5uZXh0LCBudW1fcGFyZW50KyspCisJCWhhc2hjcHkoKHVuc2lnbmVkIGNoYXIqKShwYXJlbnQgKyBudW1fcGFyZW50KSwKKwkJCXBhcmVudHMtPml0ZW0tPm9iamVjdC5zaGExKTsKKwlkaWZmX3RyZWVfY29tYmluZWQoc2hhMSwgcGFyZW50LCBudW1fcGFyZW50LCBkZW5zZSwgcmV2KTsKK30KZGlmZiAtLWdpdCBhL2NvbW1hbmQtbGlzdC50eHQgYi9jb21tYW5kLWxpc3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ODNhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tYW5kLWxpc3QudHh0CkBAIC0wLDAgKzEsMTMwIEBACisjIExpc3Qgb2Yga25vd24gZ2l0IGNvbW1hbmRzLgorIyBjb21tYW5kIG5hbWUJCQkJY2F0ZWdvcnkgW2RlcHJlY2F0ZWRdIFtjb21tb25dCitnaXQtYWRkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBvcmNlbGFpbiBjb21tb24KK2dpdC1hbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluCitnaXQtYW5ub3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaWxsYXJ5aW50ZXJyb2dhdG9ycworZ2l0LWFwcGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdW1iaW5nbWFuaXB1bGF0b3JzCitnaXQtYXJjaGltcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbnNjbWludGVyZmFjZQorZ2l0LWFyY2hpdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wb3JjZWxhaW4KK2dpdC1iaXNlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluIGNvbW1vbgorZ2l0LWJsYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeWludGVycm9nYXRvcnMKK2dpdC1icmFuY2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluIGNvbW1vbgorZ2l0LWJ1bmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wb3JjZWxhaW4KK2dpdC1jYXQtZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ2ludGVycm9nYXRvcnMKK2dpdC1jaGVjay1hdHRyICAgICAgICAgICAgICAgICAgICAgICAgICBwdXJlaGVscGVycworZ2l0LWNoZWNrb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wb3JjZWxhaW4gY29tbW9uCitnaXQtY2hlY2tvdXQtaW5kZXggICAgICAgICAgICAgICAgICAgICAgcGx1bWJpbmdtYW5pcHVsYXRvcnMKK2dpdC1jaGVjay1yZWYtZm9ybWF0ICAgICAgICAgICAgICAgICAgICBwdXJlaGVscGVycworZ2l0LWNoZXJyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeWludGVycm9nYXRvcnMKK2dpdC1jaGVycnktcGljayAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluCitnaXQtY2l0b29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBvcmNlbGFpbgorZ2l0LWNsZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wb3JjZWxhaW4KK2dpdC1jbG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluIGNvbW1vbgorZ2l0LWNvbW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wb3JjZWxhaW4gY29tbW9uCitnaXQtY29tbWl0LXRyZWUgICAgICAgICAgICAgICAgICAgICAgICAgcGx1bWJpbmdtYW5pcHVsYXRvcnMKK2dpdC1jb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNpbGxhcnltYW5pcHVsYXRvcnMKK2dpdC1jb3VudC1vYmplY3RzICAgICAgICAgICAgICAgICAgICAgICBhbmNpbGxhcnlpbnRlcnJvZ2F0b3JzCitnaXQtY3ZzZXhwb3J0Y29tbWl0ICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbnNjbWludGVyZmFjZQorZ2l0LWN2c2ltcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ25zY21pbnRlcmZhY2UKK2dpdC1jdnNzZXJ2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduc2NtaW50ZXJmYWNlCitnaXQtZGFlbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hpbmdyZXBvc2l0b3JpZXMKK2dpdC1kZXNjcmliZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluCitnaXQtZGlmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBvcmNlbGFpbiBjb21tb24KK2dpdC1kaWZmLWZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ2ludGVycm9nYXRvcnMKK2dpdC1kaWZmLWluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ2ludGVycm9nYXRvcnMKK2dpdC1kaWZmLXRyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ2ludGVycm9nYXRvcnMKK2dpdC1mYXN0LWV4cG9ydAkJCQlhbmNpbGxhcnltYW5pcHVsYXRvcnMKK2dpdC1mYXN0LWltcG9ydAkJCQlhbmNpbGxhcnltYW5pcHVsYXRvcnMKK2dpdC1mZXRjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluIGNvbW1vbgorZ2l0LWZldGNoLXBhY2sgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNoaW5ncmVwb3NpdG9yaWVzCitnaXQtZmlsdGVyLWJyYW5jaCAgICAgICAgICAgICAgICAgICAgICAgYW5jaWxsYXJ5bWFuaXB1bGF0b3JzCitnaXQtZm10LW1lcmdlLW1zZyAgICAgICAgICAgICAgICAgICAgICAgcHVyZWhlbHBlcnMKK2dpdC1mb3ItZWFjaC1yZWYgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ2ludGVycm9nYXRvcnMKK2dpdC1mb3JtYXQtcGF0Y2ggICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluCitnaXQtZnNjawkgICAgICAgICAgICAgICAgICAgICAgICBhbmNpbGxhcnlpbnRlcnJvZ2F0b3JzCitnaXQtZ2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBvcmNlbGFpbgorZ2l0LWdldC10YXItY29tbWl0LWlkICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeWludGVycm9nYXRvcnMKK2dpdC1ncmVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluIGNvbW1vbgorZ2l0LWd1aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wb3JjZWxhaW4KK2dpdC1oYXNoLW9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ21hbmlwdWxhdG9ycworZ2l0LWhlbHAJCQkJYW5jaWxsYXJ5aW50ZXJyb2dhdG9ycworZ2l0LWh0dHAtZmV0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNoZWxwZXJzCitnaXQtaHR0cC1wdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hlbHBlcnMKK2dpdC1pbWFwLXNlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduc2NtaW50ZXJmYWNlCitnaXQtaW5kZXgtcGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1bWJpbmdtYW5pcHVsYXRvcnMKK2dpdC1pbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluIGNvbW1vbgorZ2l0LWluc3Rhd2ViICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeWludGVycm9nYXRvcnMKK2dpdGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluCitnaXQtbG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBvcmNlbGFpbiBjb21tb24KK2dpdC1sb3N0LWZvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNpbGxhcnltYW5pcHVsYXRvcnMJZGVwcmVjYXRlZAorZ2l0LWxzLWZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdW1iaW5naW50ZXJyb2dhdG9ycworZ2l0LWxzLXJlbW90ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdW1iaW5naW50ZXJyb2dhdG9ycworZ2l0LWxzLXRyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdW1iaW5naW50ZXJyb2dhdG9ycworZ2l0LW1haWxpbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cmVoZWxwZXJzCitnaXQtbWFpbHNwbGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVyZWhlbHBlcnMKK2dpdC1tZXJnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluIGNvbW1vbgorZ2l0LW1lcmdlLWJhc2UgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdW1iaW5naW50ZXJyb2dhdG9ycworZ2l0LW1lcmdlLWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdW1iaW5nbWFuaXB1bGF0b3JzCitnaXQtbWVyZ2UtaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgcGx1bWJpbmdtYW5pcHVsYXRvcnMKK2dpdC1tZXJnZS1vbmUtZmlsZSAgICAgICAgICAgICAgICAgICAgICBwdXJlaGVscGVycworZ2l0LW1lcmdldG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeW1hbmlwdWxhdG9ycworZ2l0LW1lcmdlLXRyZWUgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeWludGVycm9nYXRvcnMKK2dpdC1ta3RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ21hbmlwdWxhdG9ycworZ2l0LW1rdHJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdW1iaW5nbWFuaXB1bGF0b3JzCitnaXQtbXYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBvcmNlbGFpbiBjb21tb24KK2dpdC1uYW1lLXJldiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ2ludGVycm9nYXRvcnMKK2dpdC1wYWNrLW9iamVjdHMgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ21hbmlwdWxhdG9ycworZ2l0LXBhY2stcmVkdW5kYW50ICAgICAgICAgICAgICAgICAgICAgIHBsdW1iaW5naW50ZXJyb2dhdG9ycworZ2l0LXBhY2stcmVmcyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeW1hbmlwdWxhdG9ycworZ2l0LXBhcnNlLXJlbW90ZSAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNoZWxwZXJzCitnaXQtcGF0Y2gtaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVyZWhlbHBlcnMKK2dpdC1wZWVrLXJlbW90ZSAgICAgICAgICAgICAgICAgICAgICAgICBwdXJlaGVscGVycwlkZXByZWNhdGVkCitnaXQtcHJ1bmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaWxsYXJ5bWFuaXB1bGF0b3JzCitnaXQtcHJ1bmUtcGFja2VkICAgICAgICAgICAgICAgICAgICAgICAgcGx1bWJpbmdtYW5pcHVsYXRvcnMKK2dpdC1wdWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluIGNvbW1vbgorZ2l0LXB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wb3JjZWxhaW4gY29tbW9uCitnaXQtcXVpbHRpbXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbnNjbWludGVyZmFjZQorZ2l0LXJlYWQtdHJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdW1iaW5nbWFuaXB1bGF0b3JzCitnaXQtcmViYXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBvcmNlbGFpbiBjb21tb24KK2dpdC1yZWNlaXZlLXBhY2sgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaGVscGVycworZ2l0LXJlZmxvZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeW1hbmlwdWxhdG9ycworZ2l0LXJlbGluayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeW1hbmlwdWxhdG9ycworZ2l0LXJlbW90ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeW1hbmlwdWxhdG9ycworZ2l0LXJlcGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeW1hbmlwdWxhdG9ycworZ2l0LXJlcG8tY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeW1hbmlwdWxhdG9ycwlkZXByZWNhdGVkCitnaXQtcmVxdWVzdC1wdWxsICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbnNjbWludGVyZmFjZQorZ2l0LXJlcmVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeWludGVycm9nYXRvcnMKK2dpdC1yZXNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluIGNvbW1vbgorZ2l0LXJldmVydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wb3JjZWxhaW4KK2dpdC1yZXYtbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ2ludGVycm9nYXRvcnMKK2dpdC1yZXYtcGFyc2UgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNpbGxhcnlpbnRlcnJvZ2F0b3JzCitnaXQtcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBvcmNlbGFpbiBjb21tb24KK2dpdC1zZW5kLWVtYWlsICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduc2NtaW50ZXJmYWNlCitnaXQtc2VuZC1wYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hpbmdyZXBvc2l0b3JpZXMKK2dpdC1zaGVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaGVscGVycworZ2l0LXNob3J0bG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wb3JjZWxhaW4KK2dpdC1zaG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluIGNvbW1vbgorZ2l0LXNob3ctYnJhbmNoICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeWludGVycm9nYXRvcnMKK2dpdC1zaG93LWluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ2ludGVycm9nYXRvcnMKK2dpdC1zaG93LXJlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ2ludGVycm9nYXRvcnMKK2dpdC1zaC1zZXR1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXJlaGVscGVycworZ2l0LXN0YXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wb3JjZWxhaW4KK2dpdC1zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucG9yY2VsYWluIGNvbW1vbgorZ2l0LXN0cmlwc3BhY2UgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cmVoZWxwZXJzCitnaXQtc3VibW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBvcmNlbGFpbgorZ2l0LXN2biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ25zY21pbnRlcmZhY2UKK2dpdC1zeW1ib2xpYy1yZWYgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ21hbmlwdWxhdG9ycworZ2l0LXRhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wb3JjZWxhaW4gY29tbW9uCitnaXQtdGFyLXRyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1bWJpbmdpbnRlcnJvZ2F0b3JzCWRlcHJlY2F0ZWQKK2dpdC11bnBhY2stZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ2ludGVycm9nYXRvcnMKK2dpdC11bnBhY2stb2JqZWN0cyAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ21hbmlwdWxhdG9ycworZ2l0LXVwZGF0ZS1pbmRleCAgICAgICAgICAgICAgICAgICAgICAgIHBsdW1iaW5nbWFuaXB1bGF0b3JzCitnaXQtdXBkYXRlLXJlZiAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1bWJpbmdtYW5pcHVsYXRvcnMKK2dpdC11cGRhdGUtc2VydmVyLWluZm8gICAgICAgICAgICAgICAgICBzeW5jaGluZ3JlcG9zaXRvcmllcworZ2l0LXVwbG9hZC1hcmNoaXZlICAgICAgICAgICAgICAgICAgICAgIHN5bmNoZWxwZXJzCitnaXQtdXBsb2FkLXBhY2sgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hlbHBlcnMKK2dpdC12YXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ2ludGVycm9nYXRvcnMKK2dpdC12ZXJpZnktcGFjayAgICAgICAgICAgICAgICAgICAgICAgICBwbHVtYmluZ2ludGVycm9nYXRvcnMKK2dpdC12ZXJpZnktdGFnICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNpbGxhcnlpbnRlcnJvZ2F0b3JzCitnaXQtd2hhdGNoYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaWxsYXJ5aW50ZXJyb2dhdG9ycworZ2l0LXdyaXRlLXRyZWUgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdW1iaW5nbWFuaXB1bGF0b3JzCmRpZmYgLS1naXQgYS9jb21taXQuYyBiL2NvbW1pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZDViM2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb21taXQuYwpAQCAtMCwwICsxLDY3OCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAicGt0LWxpbmUuaCIKKyNpbmNsdWRlICJ1dGY4LmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgInJldmlzaW9uLmgiCisKK2ludCBzYXZlX2NvbW1pdF9idWZmZXIgPSAxOworCitjb25zdCBjaGFyICpjb21taXRfdHlwZSA9ICJjb21taXQiOworCitzdGF0aWMgc3RydWN0IGNvbW1pdCAqY2hlY2tfY29tbWl0KHN0cnVjdCBvYmplY3QgKm9iaiwKKwkJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkJCSAgIGludCBxdWlldCkKK3sKKwlpZiAob2JqLT50eXBlICE9IE9CSl9DT01NSVQpIHsKKwkJaWYgKCFxdWlldCkKKwkJCWVycm9yKCJPYmplY3QgJXMgaXMgYSAlcywgbm90IGEgY29tbWl0IiwKKwkJCSAgICAgIHNoYTFfdG9faGV4KHNoYTEpLCB0eXBlbmFtZShvYmotPnR5cGUpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiAoc3RydWN0IGNvbW1pdCAqKSBvYmo7Cit9CisKK3N0cnVjdCBjb21taXQgKmxvb2t1cF9jb21taXRfcmVmZXJlbmNlX2dlbnRseShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkJCQkgICAgICBpbnQgcXVpZXQpCit7CisJc3RydWN0IG9iamVjdCAqb2JqID0gZGVyZWZfdGFnKHBhcnNlX29iamVjdChzaGExKSwgTlVMTCwgMCk7CisKKwlpZiAoIW9iaikKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGNoZWNrX2NvbW1pdChvYmosIHNoYTEsIHF1aWV0KTsKK30KKworc3RydWN0IGNvbW1pdCAqbG9va3VwX2NvbW1pdF9yZWZlcmVuY2UoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlyZXR1cm4gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2VfZ2VudGx5KHNoYTEsIDApOworfQorCitzdHJ1Y3QgY29tbWl0ICpsb29rdXBfY29tbWl0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IG9iamVjdCAqb2JqID0gbG9va3VwX29iamVjdChzaGExKTsKKwlpZiAoIW9iaikKKwkJcmV0dXJuIGNyZWF0ZV9vYmplY3Qoc2hhMSwgT0JKX0NPTU1JVCwgYWxsb2NfY29tbWl0X25vZGUoKSk7CisJaWYgKCFvYmotPnR5cGUpCisJCW9iai0+dHlwZSA9IE9CSl9DT01NSVQ7CisJcmV0dXJuIGNoZWNrX2NvbW1pdChvYmosIHNoYTEsIDApOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYXJzZV9jb21taXRfZGF0ZShjb25zdCBjaGFyICpidWYsIGNvbnN0IGNoYXIgKnRhaWwpCit7CisJdW5zaWduZWQgbG9uZyBkYXRlOworCWNvbnN0IGNoYXIgKmRhdGVwdHI7CisKKwlpZiAoYnVmICsgNiA+PSB0YWlsKQorCQlyZXR1cm4gMDsKKwlpZiAobWVtY21wKGJ1ZiwgImF1dGhvciIsIDYpKQorCQlyZXR1cm4gMDsKKwl3aGlsZSAoYnVmIDwgdGFpbCAmJiAqYnVmKysgIT0gJ1xuJykKKwkJLyogbmFkYSAqLzsKKwlpZiAoYnVmICsgOSA+PSB0YWlsKQorCQlyZXR1cm4gMDsKKwlpZiAobWVtY21wKGJ1ZiwgImNvbW1pdHRlciIsIDkpKQorCQlyZXR1cm4gMDsKKwl3aGlsZSAoYnVmIDwgdGFpbCAmJiAqYnVmKysgIT0gJz4nKQorCQkvKiBuYWRhICovOworCWlmIChidWYgPj0gdGFpbCkKKwkJcmV0dXJuIDA7CisJZGF0ZXB0ciA9IGJ1ZjsKKwl3aGlsZSAoYnVmIDwgdGFpbCAmJiAqYnVmKysgIT0gJ1xuJykKKwkJLyogbmFkYSAqLzsKKwlpZiAoYnVmID49IHRhaWwpCisJCXJldHVybiAwOworCS8qIGRhdGVwdHIgPCBidWYgJiYgYnVmWy0xXSA9PSAnXG4nLCBzbyBzdHJ0b3VsIHdpbGwgc3RvcCBhdCBidWYtMSAqLworCWRhdGUgPSBzdHJ0b3VsKGRhdGVwdHIsIE5VTEwsIDEwKTsKKwlpZiAoZGF0ZSA9PSBVTE9OR19NQVgpCisJCWRhdGUgPSAwOworCXJldHVybiBkYXRlOworfQorCitzdGF0aWMgc3RydWN0IGNvbW1pdF9ncmFmdCAqKmNvbW1pdF9ncmFmdDsKK3N0YXRpYyBpbnQgY29tbWl0X2dyYWZ0X2FsbG9jLCBjb21taXRfZ3JhZnRfbnI7CisKK3N0YXRpYyBpbnQgY29tbWl0X2dyYWZ0X3Bvcyhjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBsbywgaGk7CisJbG8gPSAwOworCWhpID0gY29tbWl0X2dyYWZ0X25yOworCXdoaWxlIChsbyA8IGhpKSB7CisJCWludCBtaSA9IChsbyArIGhpKSAvIDI7CisJCXN0cnVjdCBjb21taXRfZ3JhZnQgKmdyYWZ0ID0gY29tbWl0X2dyYWZ0W21pXTsKKwkJaW50IGNtcCA9IGhhc2hjbXAoc2hhMSwgZ3JhZnQtPnNoYTEpOworCQlpZiAoIWNtcCkKKwkJCXJldHVybiBtaTsKKwkJaWYgKGNtcCA8IDApCisJCQloaSA9IG1pOworCQllbHNlCisJCQlsbyA9IG1pICsgMTsKKwl9CisJcmV0dXJuIC1sbyAtIDE7Cit9CisKK2ludCByZWdpc3Rlcl9jb21taXRfZ3JhZnQoc3RydWN0IGNvbW1pdF9ncmFmdCAqZ3JhZnQsIGludCBpZ25vcmVfZHVwcykKK3sKKwlpbnQgcG9zID0gY29tbWl0X2dyYWZ0X3BvcyhncmFmdC0+c2hhMSk7CisKKwlpZiAoMCA8PSBwb3MpIHsKKwkJaWYgKGlnbm9yZV9kdXBzKQorCQkJZnJlZShncmFmdCk7CisJCWVsc2UgeworCQkJZnJlZShjb21taXRfZ3JhZnRbcG9zXSk7CisJCQljb21taXRfZ3JhZnRbcG9zXSA9IGdyYWZ0OworCQl9CisJCXJldHVybiAxOworCX0KKwlwb3MgPSAtcG9zIC0gMTsKKwlpZiAoY29tbWl0X2dyYWZ0X2FsbG9jIDw9ICsrY29tbWl0X2dyYWZ0X25yKSB7CisJCWNvbW1pdF9ncmFmdF9hbGxvYyA9IGFsbG9jX25yKGNvbW1pdF9ncmFmdF9hbGxvYyk7CisJCWNvbW1pdF9ncmFmdCA9IHhyZWFsbG9jKGNvbW1pdF9ncmFmdCwKKwkJCQkJc2l6ZW9mKCpjb21taXRfZ3JhZnQpICoKKwkJCQkJY29tbWl0X2dyYWZ0X2FsbG9jKTsKKwl9CisJaWYgKHBvcyA8IGNvbW1pdF9ncmFmdF9ucikKKwkJbWVtbW92ZShjb21taXRfZ3JhZnQgKyBwb3MgKyAxLAorCQkJY29tbWl0X2dyYWZ0ICsgcG9zLAorCQkJKGNvbW1pdF9ncmFmdF9uciAtIHBvcyAtIDEpICoKKwkJCXNpemVvZigqY29tbWl0X2dyYWZ0KSk7CisJY29tbWl0X2dyYWZ0W3Bvc10gPSBncmFmdDsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGNvbW1pdF9ncmFmdCAqcmVhZF9ncmFmdF9saW5lKGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwkvKiBUaGUgZm9ybWF0IGlzIGp1c3QgIkNvbW1pdCBQYXJlbnQxIFBhcmVudDIgLi4uXG4iICovCisJaW50IGk7CisJc3RydWN0IGNvbW1pdF9ncmFmdCAqZ3JhZnQgPSBOVUxMOworCisJaWYgKGJ1ZltsZW4tMV0gPT0gJ1xuJykKKwkJYnVmWy0tbGVuXSA9IDA7CisJaWYgKGJ1ZlswXSA9PSAnIycgfHwgYnVmWzBdID09ICdcMCcpCisJCXJldHVybiBOVUxMOworCWlmICgobGVuICsgMSkgJSA0MSkgeworCWJhZF9ncmFmdF9kYXRhOgorCQllcnJvcigiYmFkIGdyYWZ0IGRhdGE6ICVzIiwgYnVmKTsKKwkJZnJlZShncmFmdCk7CisJCXJldHVybiBOVUxMOworCX0KKwlpID0gKGxlbiArIDEpIC8gNDEgLSAxOworCWdyYWZ0ID0geG1hbGxvYyhzaXplb2YoKmdyYWZ0KSArIDIwICogaSk7CisJZ3JhZnQtPm5yX3BhcmVudCA9IGk7CisJaWYgKGdldF9zaGExX2hleChidWYsIGdyYWZ0LT5zaGExKSkKKwkJZ290byBiYWRfZ3JhZnRfZGF0YTsKKwlmb3IgKGkgPSA0MDsgaSA8IGxlbjsgaSArPSA0MSkgeworCQlpZiAoYnVmW2ldICE9ICcgJykKKwkJCWdvdG8gYmFkX2dyYWZ0X2RhdGE7CisJCWlmIChnZXRfc2hhMV9oZXgoYnVmICsgaSArIDEsIGdyYWZ0LT5wYXJlbnRbaS80MV0pKQorCQkJZ290byBiYWRfZ3JhZnRfZGF0YTsKKwl9CisJcmV0dXJuIGdyYWZ0OworfQorCitpbnQgcmVhZF9ncmFmdF9maWxlKGNvbnN0IGNoYXIgKmdyYWZ0X2ZpbGUpCit7CisJRklMRSAqZnAgPSBmb3BlbihncmFmdF9maWxlLCAiciIpOworCWNoYXIgYnVmWzEwMjRdOworCWlmICghZnApCisJCXJldHVybiAtMTsKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCS8qIFRoZSBmb3JtYXQgaXMganVzdCAiQ29tbWl0IFBhcmVudDEgUGFyZW50MiAuLi5cbiIgKi8KKwkJaW50IGxlbiA9IHN0cmxlbihidWYpOworCQlzdHJ1Y3QgY29tbWl0X2dyYWZ0ICpncmFmdCA9IHJlYWRfZ3JhZnRfbGluZShidWYsIGxlbik7CisJCWlmICghZ3JhZnQpCisJCQljb250aW51ZTsKKwkJaWYgKHJlZ2lzdGVyX2NvbW1pdF9ncmFmdChncmFmdCwgMSkpCisJCQllcnJvcigiZHVwbGljYXRlIGdyYWZ0IGRhdGE6ICVzIiwgYnVmKTsKKwl9CisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJlcGFyZV9jb21taXRfZ3JhZnQodm9pZCkKK3sKKwlzdGF0aWMgaW50IGNvbW1pdF9ncmFmdF9wcmVwYXJlZDsKKwljaGFyICpncmFmdF9maWxlOworCisJaWYgKGNvbW1pdF9ncmFmdF9wcmVwYXJlZCkKKwkJcmV0dXJuOworCWdyYWZ0X2ZpbGUgPSBnZXRfZ3JhZnRfZmlsZSgpOworCXJlYWRfZ3JhZnRfZmlsZShncmFmdF9maWxlKTsKKwkvKiBtYWtlIHN1cmUgc2hhbGxvd3MgYXJlIHJlYWQgKi8KKwlpc19yZXBvc2l0b3J5X3NoYWxsb3coKTsKKwljb21taXRfZ3JhZnRfcHJlcGFyZWQgPSAxOworfQorCitzdHJ1Y3QgY29tbWl0X2dyYWZ0ICpsb29rdXBfY29tbWl0X2dyYWZ0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaW50IHBvczsKKwlwcmVwYXJlX2NvbW1pdF9ncmFmdCgpOworCXBvcyA9IGNvbW1pdF9ncmFmdF9wb3Moc2hhMSk7CisJaWYgKHBvcyA8IDApCisJCXJldHVybiBOVUxMOworCXJldHVybiBjb21taXRfZ3JhZnRbcG9zXTsKK30KKworaW50IHdyaXRlX3NoYWxsb3dfY29tbWl0cyhpbnQgZmQsIGludCB1c2VfcGFja19wcm90b2NvbCkKK3sKKwlpbnQgaSwgY291bnQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBjb21taXRfZ3JhZnRfbnI7IGkrKykKKwkJaWYgKGNvbW1pdF9ncmFmdFtpXS0+bnJfcGFyZW50IDwgMCkgeworCQkJY29uc3QgY2hhciAqaGV4ID0KKwkJCQlzaGExX3RvX2hleChjb21taXRfZ3JhZnRbaV0tPnNoYTEpOworCQkJY291bnQrKzsKKwkJCWlmICh1c2VfcGFja19wcm90b2NvbCkKKwkJCQlwYWNrZXRfd3JpdGUoZmQsICJzaGFsbG93ICVzIiwgaGV4KTsKKwkJCWVsc2UgeworCQkJCWlmICh3cml0ZV9pbl9mdWxsKGZkLCBoZXgsICA0MCkgIT0gNDApCisJCQkJCWJyZWFrOworCQkJCWlmICh3cml0ZV9pbl9mdWxsKGZkLCAiXG4iLCAxKSAhPSAxKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCXJldHVybiBjb3VudDsKK30KKworaW50IHVucmVnaXN0ZXJfc2hhbGxvdyhjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBwb3MgPSBjb21taXRfZ3JhZnRfcG9zKHNoYTEpOworCWlmIChwb3MgPCAwKQorCQlyZXR1cm4gLTE7CisJaWYgKHBvcyArIDEgPCBjb21taXRfZ3JhZnRfbnIpCisJCW1lbWNweShjb21taXRfZ3JhZnQgKyBwb3MsIGNvbW1pdF9ncmFmdCArIHBvcyArIDEsCisJCQkJc2l6ZW9mKHN0cnVjdCBjb21taXRfZ3JhZnQgKikKKwkJCQkqIChjb21taXRfZ3JhZnRfbnIgLSBwb3MgLSAxKSk7CisJY29tbWl0X2dyYWZ0X25yLS07CisJcmV0dXJuIDA7Cit9CisKK2ludCBwYXJzZV9jb21taXRfYnVmZmVyKHN0cnVjdCBjb21taXQgKml0ZW0sIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWNoYXIgKnRhaWwgPSBidWZmZXI7CisJY2hhciAqYnVmcHRyID0gYnVmZmVyOworCXVuc2lnbmVkIGNoYXIgcGFyZW50WzIwXTsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKipwcHRyOworCXN0cnVjdCBjb21taXRfZ3JhZnQgKmdyYWZ0OworCXVuc2lnbmVkIG5fcmVmcyA9IDA7CisKKwlpZiAoaXRlbS0+b2JqZWN0LnBhcnNlZCkKKwkJcmV0dXJuIDA7CisJaXRlbS0+b2JqZWN0LnBhcnNlZCA9IDE7CisJdGFpbCArPSBzaXplOworCWlmICh0YWlsIDw9IGJ1ZnB0ciArIDQ2IHx8IG1lbWNtcChidWZwdHIsICJ0cmVlICIsIDUpIHx8IGJ1ZnB0cls0NV0gIT0gJ1xuJykKKwkJcmV0dXJuIGVycm9yKCJib2d1cyBjb21taXQgb2JqZWN0ICVzIiwgc2hhMV90b19oZXgoaXRlbS0+b2JqZWN0LnNoYTEpKTsKKwlpZiAoZ2V0X3NoYTFfaGV4KGJ1ZnB0ciArIDUsIHBhcmVudCkgPCAwKQorCQlyZXR1cm4gZXJyb3IoImJhZCB0cmVlIHBvaW50ZXIgaW4gY29tbWl0ICVzIiwKKwkJCSAgICAgc2hhMV90b19oZXgoaXRlbS0+b2JqZWN0LnNoYTEpKTsKKwlpdGVtLT50cmVlID0gbG9va3VwX3RyZWUocGFyZW50KTsKKwlpZiAoaXRlbS0+dHJlZSkKKwkJbl9yZWZzKys7CisJYnVmcHRyICs9IDQ2OyAvKiAidHJlZSAiICsgImhleCBzaGExIiArICJcbiIgKi8KKwlwcHRyID0gJml0ZW0tPnBhcmVudHM7CisKKwlncmFmdCA9IGxvb2t1cF9jb21taXRfZ3JhZnQoaXRlbS0+b2JqZWN0LnNoYTEpOworCXdoaWxlIChidWZwdHIgKyA0OCA8IHRhaWwgJiYgIW1lbWNtcChidWZwdHIsICJwYXJlbnQgIiwgNykpIHsKKwkJc3RydWN0IGNvbW1pdCAqbmV3X3BhcmVudDsKKworCQlpZiAodGFpbCA8PSBidWZwdHIgKyA0OCB8fAorCQkgICAgZ2V0X3NoYTFfaGV4KGJ1ZnB0ciArIDcsIHBhcmVudCkgfHwKKwkJICAgIGJ1ZnB0cls0N10gIT0gJ1xuJykKKwkJCXJldHVybiBlcnJvcigiYmFkIHBhcmVudHMgaW4gY29tbWl0ICVzIiwgc2hhMV90b19oZXgoaXRlbS0+b2JqZWN0LnNoYTEpKTsKKwkJYnVmcHRyICs9IDQ4OworCQlpZiAoZ3JhZnQpCisJCQljb250aW51ZTsKKwkJbmV3X3BhcmVudCA9IGxvb2t1cF9jb21taXQocGFyZW50KTsKKwkJaWYgKG5ld19wYXJlbnQpIHsKKwkJCXBwdHIgPSAmY29tbWl0X2xpc3RfaW5zZXJ0KG5ld19wYXJlbnQsIHBwdHIpLT5uZXh0OworCQkJbl9yZWZzKys7CisJCX0KKwl9CisJaWYgKGdyYWZ0KSB7CisJCWludCBpOworCQlzdHJ1Y3QgY29tbWl0ICpuZXdfcGFyZW50OworCQlmb3IgKGkgPSAwOyBpIDwgZ3JhZnQtPm5yX3BhcmVudDsgaSsrKSB7CisJCQluZXdfcGFyZW50ID0gbG9va3VwX2NvbW1pdChncmFmdC0+cGFyZW50W2ldKTsKKwkJCWlmICghbmV3X3BhcmVudCkKKwkJCQljb250aW51ZTsKKwkJCXBwdHIgPSAmY29tbWl0X2xpc3RfaW5zZXJ0KG5ld19wYXJlbnQsIHBwdHIpLT5uZXh0OworCQkJbl9yZWZzKys7CisJCX0KKwl9CisJaXRlbS0+ZGF0ZSA9IHBhcnNlX2NvbW1pdF9kYXRlKGJ1ZnB0ciwgdGFpbCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHBhcnNlX2NvbW1pdChzdHJ1Y3QgY29tbWl0ICppdGVtKQoreworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwl2b2lkICpidWZmZXI7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCByZXQ7CisKKwlpZiAoIWl0ZW0pCisJCXJldHVybiAtMTsKKwlpZiAoaXRlbS0+b2JqZWN0LnBhcnNlZCkKKwkJcmV0dXJuIDA7CisJYnVmZmVyID0gcmVhZF9zaGExX2ZpbGUoaXRlbS0+b2JqZWN0LnNoYTEsICZ0eXBlLCAmc2l6ZSk7CisJaWYgKCFidWZmZXIpCisJCXJldHVybiBlcnJvcigiQ291bGQgbm90IHJlYWQgJXMiLAorCQkJICAgICBzaGExX3RvX2hleChpdGVtLT5vYmplY3Quc2hhMSkpOworCWlmICh0eXBlICE9IE9CSl9DT01NSVQpIHsKKwkJZnJlZShidWZmZXIpOworCQlyZXR1cm4gZXJyb3IoIk9iamVjdCAlcyBub3QgYSBjb21taXQiLAorCQkJICAgICBzaGExX3RvX2hleChpdGVtLT5vYmplY3Quc2hhMSkpOworCX0KKwlyZXQgPSBwYXJzZV9jb21taXRfYnVmZmVyKGl0ZW0sIGJ1ZmZlciwgc2l6ZSk7CisJaWYgKHNhdmVfY29tbWl0X2J1ZmZlciAmJiAhcmV0KSB7CisJCWl0ZW0tPmJ1ZmZlciA9IGJ1ZmZlcjsKKwkJcmV0dXJuIDA7CisJfQorCWZyZWUoYnVmZmVyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgY29tbWl0X2xpc3QgKmNvbW1pdF9saXN0X2luc2VydChzdHJ1Y3QgY29tbWl0ICppdGVtLCBzdHJ1Y3QgY29tbWl0X2xpc3QgKipsaXN0X3ApCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpuZXdfbGlzdCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21taXRfbGlzdCkpOworCW5ld19saXN0LT5pdGVtID0gaXRlbTsKKwluZXdfbGlzdC0+bmV4dCA9ICpsaXN0X3A7CisJKmxpc3RfcCA9IG5ld19saXN0OworCXJldHVybiBuZXdfbGlzdDsKK30KKwordm9pZCBmcmVlX2NvbW1pdF9saXN0KHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCkKK3sKKwl3aGlsZSAobGlzdCkgeworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnRlbXAgPSBsaXN0OworCQlsaXN0ID0gdGVtcC0+bmV4dDsKKwkJZnJlZSh0ZW1wKTsKKwl9Cit9CisKK3N0cnVjdCBjb21taXRfbGlzdCAqIGluc2VydF9ieV9kYXRlKHN0cnVjdCBjb21taXQgKml0ZW0sIHN0cnVjdCBjb21taXRfbGlzdCAqKmxpc3QpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICoqcHAgPSBsaXN0OworCXN0cnVjdCBjb21taXRfbGlzdCAqcDsKKwl3aGlsZSAoKHAgPSAqcHApICE9IE5VTEwpIHsKKwkJaWYgKHAtPml0ZW0tPmRhdGUgPCBpdGVtLT5kYXRlKSB7CisJCQlicmVhazsKKwkJfQorCQlwcCA9ICZwLT5uZXh0OworCX0KKwlyZXR1cm4gY29tbWl0X2xpc3RfaW5zZXJ0KGl0ZW0sIHBwKTsKK30KKworCit2b2lkIHNvcnRfYnlfZGF0ZShzdHJ1Y3QgY29tbWl0X2xpc3QgKipsaXN0KQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqcmV0ID0gTlVMTDsKKwl3aGlsZSAoKmxpc3QpIHsKKwkJaW5zZXJ0X2J5X2RhdGUoKCpsaXN0KS0+aXRlbSwgJnJldCk7CisJCSpsaXN0ID0gKCpsaXN0KS0+bmV4dDsKKwl9CisJKmxpc3QgPSByZXQ7Cit9CisKK3N0cnVjdCBjb21taXQgKnBvcF9tb3N0X3JlY2VudF9jb21taXQoc3RydWN0IGNvbW1pdF9saXN0ICoqbGlzdCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgbWFyaykKK3sKKwlzdHJ1Y3QgY29tbWl0ICpyZXQgPSAoKmxpc3QpLT5pdGVtOworCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50cyA9IHJldC0+cGFyZW50czsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKm9sZCA9ICpsaXN0OworCisJKmxpc3QgPSAoKmxpc3QpLT5uZXh0OworCWZyZWUob2xkKTsKKworCXdoaWxlIChwYXJlbnRzKSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IHBhcmVudHMtPml0ZW07CisJCWlmICghcGFyc2VfY29tbWl0KGNvbW1pdCkgJiYgIShjb21taXQtPm9iamVjdC5mbGFncyAmIG1hcmspKSB7CisJCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBtYXJrOworCQkJaW5zZXJ0X2J5X2RhdGUoY29tbWl0LCBsaXN0KTsKKwkJfQorCQlwYXJlbnRzID0gcGFyZW50cy0+bmV4dDsKKwl9CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBjbGVhcl9jb21taXRfbWFya3Moc3RydWN0IGNvbW1pdCAqY29tbWl0LCB1bnNpZ25lZCBpbnQgbWFyaykKK3sKKwl3aGlsZSAoY29tbWl0KSB7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50czsKKworCQlpZiAoIShtYXJrICYgY29tbWl0LT5vYmplY3QuZmxhZ3MpKQorCQkJcmV0dXJuOworCisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzICY9IH5tYXJrOworCisJCXBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7CisJCWlmICghcGFyZW50cykKKwkJCXJldHVybjsKKworCQl3aGlsZSAoKHBhcmVudHMgPSBwYXJlbnRzLT5uZXh0KSkKKwkJCWNsZWFyX2NvbW1pdF9tYXJrcyhwYXJlbnRzLT5pdGVtLCBtYXJrKTsKKworCQljb21taXQgPSBjb21taXQtPnBhcmVudHMtPml0ZW07CisJfQorfQorCitzdHJ1Y3QgY29tbWl0ICpwb3BfY29tbWl0KHN0cnVjdCBjb21taXRfbGlzdCAqKnN0YWNrKQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqdG9wID0gKnN0YWNrOworCXN0cnVjdCBjb21taXQgKml0ZW0gPSB0b3AgPyB0b3AtPml0ZW0gOiBOVUxMOworCisJaWYgKHRvcCkgeworCQkqc3RhY2sgPSB0b3AtPm5leHQ7CisJCWZyZWUodG9wKTsKKwl9CisJcmV0dXJuIGl0ZW07Cit9CisKKy8qCisgKiBQZXJmb3JtcyBhbiBpbi1wbGFjZSB0b3BvbG9naWNhbCBzb3J0IG9uIHRoZSBsaXN0IHN1cHBsaWVkLgorICovCit2b2lkIHNvcnRfaW5fdG9wb2xvZ2ljYWxfb3JkZXIoc3RydWN0IGNvbW1pdF9saXN0ICoqIGxpc3QsIGludCBsaWZvKQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqbmV4dCwgKm9yaWcgPSAqbGlzdDsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKndvcmssICoqaW5zZXJ0OworCXN0cnVjdCBjb21taXRfbGlzdCAqKnBwdHI7CisKKwlpZiAoIW9yaWcpCisJCXJldHVybjsKKwkqbGlzdCA9IE5VTEw7CisKKwkvKiBNYXJrIHRoZW0gYW5kIGNsZWFyIHRoZSBpbmRlZ3JlZSAqLworCWZvciAobmV4dCA9IG9yaWc7IG5leHQ7IG5leHQgPSBuZXh0LT5uZXh0KSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IG5leHQtPml0ZW07CisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFRPUE9TT1JUOworCQljb21taXQtPmluZGVncmVlID0gMDsKKwl9CisKKwkvKiB1cGRhdGUgdGhlIGluZGVncmVlICovCisJZm9yIChuZXh0ID0gb3JpZzsgbmV4dDsgbmV4dCA9IG5leHQtPm5leHQpIHsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICogcGFyZW50cyA9IG5leHQtPml0ZW0tPnBhcmVudHM7CisJCXdoaWxlIChwYXJlbnRzKSB7CisJCQlzdHJ1Y3QgY29tbWl0ICpwYXJlbnQgPSBwYXJlbnRzLT5pdGVtOworCisJCQlpZiAocGFyZW50LT5vYmplY3QuZmxhZ3MgJiBUT1BPU09SVCkKKwkJCQlwYXJlbnQtPmluZGVncmVlKys7CisJCQlwYXJlbnRzID0gcGFyZW50cy0+bmV4dDsKKwkJfQorCX0KKworCS8qCisJICogZmluZCB0aGUgdGlwcworCSAqCisJICogdGlwcyBhcmUgbm9kZXMgbm90IHJlYWNoYWJsZSBmcm9tIGFueSBvdGhlciBub2RlIGluIHRoZSBsaXN0CisJICoKKwkgKiB0aGUgdGlwcyBzZXJ2ZSBhcyBhIHN0YXJ0aW5nIHNldCBmb3IgdGhlIHdvcmsgcXVldWUuCisJICovCisJd29yayA9IE5VTEw7CisJaW5zZXJ0ID0gJndvcms7CisJZm9yIChuZXh0ID0gb3JpZzsgbmV4dDsgbmV4dCA9IG5leHQtPm5leHQpIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gbmV4dC0+aXRlbTsKKworCQlpZiAoIWNvbW1pdC0+aW5kZWdyZWUpCisJCQlpbnNlcnQgPSAmY29tbWl0X2xpc3RfaW5zZXJ0KGNvbW1pdCwgaW5zZXJ0KS0+bmV4dDsKKwl9CisKKwkvKiBwcm9jZXNzIHRoZSBsaXN0IGluIHRvcG9sb2dpY2FsIG9yZGVyICovCisJaWYgKCFsaWZvKQorCQlzb3J0X2J5X2RhdGUoJndvcmspOworCisJcHB0ciA9IGxpc3Q7CisJKmxpc3QgPSBOVUxMOworCXdoaWxlICh3b3JrKSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzLCAqd29ya19pdGVtOworCisJCXdvcmtfaXRlbSA9IHdvcms7CisJCXdvcmsgPSB3b3JrX2l0ZW0tPm5leHQ7CisJCXdvcmtfaXRlbS0+bmV4dCA9IE5VTEw7CisKKwkJY29tbWl0ID0gd29ya19pdGVtLT5pdGVtOworCQlmb3IgKHBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7IHBhcmVudHMgOyBwYXJlbnRzID0gcGFyZW50cy0+bmV4dCkgeworCQkJc3RydWN0IGNvbW1pdCAqcGFyZW50PXBhcmVudHMtPml0ZW07CisKKwkJCWlmICghKHBhcmVudC0+b2JqZWN0LmZsYWdzICYgVE9QT1NPUlQpKQorCQkJCWNvbnRpbnVlOworCisJCQkvKgorCQkJICogcGFyZW50cyBhcmUgb25seSBlbnF1ZXVlZCBmb3IgZW1pc3Npb24KKwkJCSAqIHdoZW4gYWxsIHRoZWlyIGNoaWxkcmVuIGhhdmUgYmVlbiBlbWl0dGVkIHRoZXJlYnkKKwkJCSAqIGd1YXJhbnRlZWluZyB0b3BvbG9naWNhbCBvcmRlci4KKwkJCSAqLworCQkJaWYgKCEtLXBhcmVudC0+aW5kZWdyZWUpIHsKKwkJCQlpZiAoIWxpZm8pCisJCQkJCWluc2VydF9ieV9kYXRlKHBhcmVudCwgJndvcmspOworCQkJCWVsc2UKKwkJCQkJY29tbWl0X2xpc3RfaW5zZXJ0KHBhcmVudCwgJndvcmspOworCQkJfQorCQl9CisJCS8qCisJCSAqIHdvcmtfaXRlbSBpcyBhIGNvbW1pdCBhbGwgb2Ygd2hvc2UgY2hpbGRyZW4KKwkJICogaGF2ZSBhbHJlYWR5IGJlZW4gZW1pdHRlZC4gd2UgY2FuIGVtaXQgaXQgbm93LgorCQkgKi8KKwkJY29tbWl0LT5vYmplY3QuZmxhZ3MgJj0gflRPUE9TT1JUOworCQkqcHB0ciA9IHdvcmtfaXRlbTsKKwkJcHB0ciA9ICZ3b3JrX2l0ZW0tPm5leHQ7CisJfQorfQorCisvKiBtZXJnZS1iYXNlIHN0dWZmICovCisKKy8qIGJpdHMgIzAuLjE1IGluIHJldmlzaW9uLmggKi8KKyNkZWZpbmUgUEFSRU5UMQkJKDF1PDwxNikKKyNkZWZpbmUgUEFSRU5UMgkJKDF1PDwxNykKKyNkZWZpbmUgU1RBTEUJCSgxdTw8MTgpCisjZGVmaW5lIFJFU1VMVAkJKDF1PDwxOSkKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGFsbF9mbGFncyA9IChQQVJFTlQxIHwgUEFSRU5UMiB8IFNUQUxFIHwgUkVTVUxUKTsKKworc3RhdGljIHN0cnVjdCBjb21taXQgKmludGVyZXN0aW5nKHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCkKK3sKKwl3aGlsZSAobGlzdCkgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsaXN0LT5pdGVtOworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgU1RBTEUpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIGNvbW1pdDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0X2xpc3QgKm1lcmdlX2Jhc2VzKHN0cnVjdCBjb21taXQgKm9uZSwgc3RydWN0IGNvbW1pdCAqdHdvKQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCA9IE5VTEw7CisJc3RydWN0IGNvbW1pdF9saXN0ICpyZXN1bHQgPSBOVUxMOworCisJaWYgKG9uZSA9PSB0d28pCisJCS8qIFdlIGRvIG5vdCBtYXJrIHRoaXMgZXZlbiB3aXRoIFJFU1VMVCBzbyB3ZSBkbyBub3QKKwkJICogaGF2ZSB0byBjbGVhbiBpdCB1cC4KKwkJICovCisJCXJldHVybiBjb21taXRfbGlzdF9pbnNlcnQob25lLCAmcmVzdWx0KTsKKworCWlmIChwYXJzZV9jb21taXQob25lKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHBhcnNlX2NvbW1pdCh0d28pKQorCQlyZXR1cm4gTlVMTDsKKworCW9uZS0+b2JqZWN0LmZsYWdzIHw9IFBBUkVOVDE7CisJdHdvLT5vYmplY3QuZmxhZ3MgfD0gUEFSRU5UMjsKKwlpbnNlcnRfYnlfZGF0ZShvbmUsICZsaXN0KTsKKwlpbnNlcnRfYnlfZGF0ZSh0d28sICZsaXN0KTsKKworCXdoaWxlIChpbnRlcmVzdGluZyhsaXN0KSkgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50czsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICpuOworCQlpbnQgZmxhZ3M7CisKKwkJY29tbWl0ID0gbGlzdC0+aXRlbTsKKwkJbiA9IGxpc3QtPm5leHQ7CisJCWZyZWUobGlzdCk7CisJCWxpc3QgPSBuOworCisJCWZsYWdzID0gY29tbWl0LT5vYmplY3QuZmxhZ3MgJiAoUEFSRU5UMSB8IFBBUkVOVDIgfCBTVEFMRSk7CisJCWlmIChmbGFncyA9PSAoUEFSRU5UMSB8IFBBUkVOVDIpKSB7CisJCQlpZiAoIShjb21taXQtPm9iamVjdC5mbGFncyAmIFJFU1VMVCkpIHsKKwkJCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBSRVNVTFQ7CisJCQkJaW5zZXJ0X2J5X2RhdGUoY29tbWl0LCAmcmVzdWx0KTsKKwkJCX0KKwkJCS8qIE1hcmsgcGFyZW50cyBvZiBhIGZvdW5kIG1lcmdlIHN0YWxlICovCisJCQlmbGFncyB8PSBTVEFMRTsKKwkJfQorCQlwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOworCQl3aGlsZSAocGFyZW50cykgeworCQkJc3RydWN0IGNvbW1pdCAqcCA9IHBhcmVudHMtPml0ZW07CisJCQlwYXJlbnRzID0gcGFyZW50cy0+bmV4dDsKKwkJCWlmICgocC0+b2JqZWN0LmZsYWdzICYgZmxhZ3MpID09IGZsYWdzKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHBhcnNlX2NvbW1pdChwKSkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCXAtPm9iamVjdC5mbGFncyB8PSBmbGFnczsKKwkJCWluc2VydF9ieV9kYXRlKHAsICZsaXN0KTsKKwkJfQorCX0KKworCS8qIENsZWFuIHVwIHRoZSByZXN1bHQgdG8gcmVtb3ZlIHN0YWxlIG9uZXMgKi8KKwlmcmVlX2NvbW1pdF9saXN0KGxpc3QpOworCWxpc3QgPSByZXN1bHQ7IHJlc3VsdCA9IE5VTEw7CisJd2hpbGUgKGxpc3QpIHsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICpuID0gbGlzdC0+bmV4dDsKKwkJaWYgKCEobGlzdC0+aXRlbS0+b2JqZWN0LmZsYWdzICYgU1RBTEUpKQorCQkJaW5zZXJ0X2J5X2RhdGUobGlzdC0+aXRlbSwgJnJlc3VsdCk7CisJCWZyZWUobGlzdCk7CisJCWxpc3QgPSBuOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCitzdHJ1Y3QgY29tbWl0X2xpc3QgKmdldF9tZXJnZV9iYXNlcyhzdHJ1Y3QgY29tbWl0ICpvbmUsCisJCQkJCXN0cnVjdCBjb21taXQgKnR3bywgaW50IGNsZWFudXApCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0OworCXN0cnVjdCBjb21taXQgKipyc2x0OworCXN0cnVjdCBjb21taXRfbGlzdCAqcmVzdWx0OworCWludCBjbnQsIGksIGo7CisKKwlyZXN1bHQgPSBtZXJnZV9iYXNlcyhvbmUsIHR3byk7CisJaWYgKG9uZSA9PSB0d28pCisJCXJldHVybiByZXN1bHQ7CisJaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC0+bmV4dCkgeworCQlpZiAoY2xlYW51cCkgeworCQkJY2xlYXJfY29tbWl0X21hcmtzKG9uZSwgYWxsX2ZsYWdzKTsKKwkJCWNsZWFyX2NvbW1pdF9tYXJrcyh0d28sIGFsbF9mbGFncyk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiBUaGVyZSBhcmUgbW9yZSB0aGFuIG9uZSAqLworCWNudCA9IDA7CisJbGlzdCA9IHJlc3VsdDsKKwl3aGlsZSAobGlzdCkgeworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJY250Kys7CisJfQorCXJzbHQgPSB4Y2FsbG9jKGNudCwgc2l6ZW9mKCpyc2x0KSk7CisJZm9yIChsaXN0ID0gcmVzdWx0LCBpID0gMDsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpCisJCXJzbHRbaSsrXSA9IGxpc3QtPml0ZW07CisJZnJlZV9jb21taXRfbGlzdChyZXN1bHQpOworCisJY2xlYXJfY29tbWl0X21hcmtzKG9uZSwgYWxsX2ZsYWdzKTsKKwljbGVhcl9jb21taXRfbWFya3ModHdvLCBhbGxfZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBjbnQgLSAxOyBpKyspIHsKKwkJZm9yIChqID0gaSsxOyBqIDwgY250OyBqKyspIHsKKwkJCWlmICghcnNsdFtpXSB8fCAhcnNsdFtqXSkKKwkJCQljb250aW51ZTsKKwkJCXJlc3VsdCA9IG1lcmdlX2Jhc2VzKHJzbHRbaV0sIHJzbHRbal0pOworCQkJY2xlYXJfY29tbWl0X21hcmtzKHJzbHRbaV0sIGFsbF9mbGFncyk7CisJCQljbGVhcl9jb21taXRfbWFya3MocnNsdFtqXSwgYWxsX2ZsYWdzKTsKKwkJCWZvciAobGlzdCA9IHJlc3VsdDsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJCQlpZiAocnNsdFtpXSA9PSBsaXN0LT5pdGVtKQorCQkJCQlyc2x0W2ldID0gTlVMTDsKKwkJCQlpZiAocnNsdFtqXSA9PSBsaXN0LT5pdGVtKQorCQkJCQlyc2x0W2pdID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKworCS8qIFN1cnZpdmluZyBvbmVzIGluIHJzbHRbXSBhcmUgdGhlIGluZGVwZW5kZW50IHJlc3VsdHMgKi8KKwlyZXN1bHQgPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworCQlpZiAocnNsdFtpXSkKKwkJCWluc2VydF9ieV9kYXRlKHJzbHRbaV0sICZyZXN1bHQpOworCX0KKwlmcmVlKHJzbHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBpbl9tZXJnZV9iYXNlcyhzdHJ1Y3QgY29tbWl0ICpjb21taXQsIHN0cnVjdCBjb21taXQgKipyZWZlcmVuY2UsIGludCBudW0pCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpiYXNlcywgKmI7CisJaW50IHJldCA9IDA7CisKKwlpZiAobnVtID09IDEpCisJCWJhc2VzID0gZ2V0X21lcmdlX2Jhc2VzKGNvbW1pdCwgKnJlZmVyZW5jZSwgMSk7CisJZWxzZQorCQlkaWUoIm5vdCB5ZXQiKTsKKwlmb3IgKGIgPSBiYXNlczsgYjsgYiA9IGItPm5leHQpIHsKKwkJaWYgKCFoYXNoY21wKGNvbW1pdC0+b2JqZWN0LnNoYTEsIGItPml0ZW0tPm9iamVjdC5zaGExKSkgeworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZnJlZV9jb21taXRfbGlzdChiYXNlcyk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2NvbW1pdC5oIGIvY29tbWl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY2M2JjOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1pdC5oCkBAIC0wLDAgKzEsMTQwIEBACisjaWZuZGVmIENPTU1JVF9ICisjZGVmaW5lIENPTU1JVF9ICisKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAic3RyYnVmLmgiCisjaW5jbHVkZSAiZGVjb3JhdGUuaCIKKworc3RydWN0IGNvbW1pdF9saXN0IHsKKwlzdHJ1Y3QgY29tbWl0ICppdGVtOworCXN0cnVjdCBjb21taXRfbGlzdCAqbmV4dDsKK307CisKK3N0cnVjdCBjb21taXQgeworCXN0cnVjdCBvYmplY3Qgb2JqZWN0OworCXZvaWQgKnV0aWw7CisJdW5zaWduZWQgaW50IGluZGVncmVlOworCXVuc2lnbmVkIGxvbmcgZGF0ZTsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHM7CisJc3RydWN0IHRyZWUgKnRyZWU7CisJY2hhciAqYnVmZmVyOworfTsKKworZXh0ZXJuIGludCBzYXZlX2NvbW1pdF9idWZmZXI7CitleHRlcm4gY29uc3QgY2hhciAqY29tbWl0X3R5cGU7CisKKy8qIFdoaWxlIHdlIGNhbiBkZWNvcmF0ZSBhbnkgb2JqZWN0IHdpdGggYSBuYW1lLCBpdCdzIG9ubHkgdXNlZCBmb3IgY29tbWl0cy4uICovCitleHRlcm4gc3RydWN0IGRlY29yYXRpb24gbmFtZV9kZWNvcmF0aW9uOworc3RydWN0IG5hbWVfZGVjb3JhdGlvbiB7CisJc3RydWN0IG5hbWVfZGVjb3JhdGlvbiAqbmV4dDsKKwljaGFyIG5hbWVbMV07Cit9OworCitzdHJ1Y3QgY29tbWl0ICpsb29rdXBfY29tbWl0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworc3RydWN0IGNvbW1pdCAqbG9va3VwX2NvbW1pdF9yZWZlcmVuY2UoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSk7CitzdHJ1Y3QgY29tbWl0ICpsb29rdXBfY29tbWl0X3JlZmVyZW5jZV9nZW50bHkoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCQkJICAgICAgaW50IHF1aWV0KTsKKworaW50IHBhcnNlX2NvbW1pdF9idWZmZXIoc3RydWN0IGNvbW1pdCAqaXRlbSwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUpOworCitpbnQgcGFyc2VfY29tbWl0KHN0cnVjdCBjb21taXQgKml0ZW0pOworCitzdHJ1Y3QgY29tbWl0X2xpc3QgKiBjb21taXRfbGlzdF9pbnNlcnQoc3RydWN0IGNvbW1pdCAqaXRlbSwgc3RydWN0IGNvbW1pdF9saXN0ICoqbGlzdF9wKTsKK3N0cnVjdCBjb21taXRfbGlzdCAqIGluc2VydF9ieV9kYXRlKHN0cnVjdCBjb21taXQgKml0ZW0sIHN0cnVjdCBjb21taXRfbGlzdCAqKmxpc3QpOworCit2b2lkIGZyZWVfY29tbWl0X2xpc3Qoc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0KTsKKwordm9pZCBzb3J0X2J5X2RhdGUoc3RydWN0IGNvbW1pdF9saXN0ICoqbGlzdCk7CisKKy8qIENvbW1pdCBmb3JtYXRzICovCitlbnVtIGNtaXRfZm10IHsKKwlDTUlUX0ZNVF9SQVcsCisJQ01JVF9GTVRfTUVESVVNLAorCUNNSVRfRk1UX0RFRkFVTFQgPSBDTUlUX0ZNVF9NRURJVU0sCisJQ01JVF9GTVRfU0hPUlQsCisJQ01JVF9GTVRfRlVMTCwKKwlDTUlUX0ZNVF9GVUxMRVIsCisJQ01JVF9GTVRfT05FTElORSwKKwlDTUlUX0ZNVF9FTUFJTCwKKwlDTUlUX0ZNVF9VU0VSRk9STUFULAorCisJQ01JVF9GTVRfVU5TUEVDSUZJRUQsCit9OworCitleHRlcm4gaW50IG5vbl9hc2NpaShpbnQpOworZXh0ZXJuIGVudW0gY21pdF9mbXQgZ2V0X2NvbW1pdF9mb3JtYXQoY29uc3QgY2hhciAqYXJnKTsKK2V4dGVybiB2b2lkIGZvcm1hdF9jb21taXRfbWVzc2FnZShjb25zdCBzdHJ1Y3QgY29tbWl0ICpjb21taXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZm9ybWF0LCBzdHJ1Y3Qgc3RyYnVmICpzYik7CitleHRlcm4gdm9pZCBwcmV0dHlfcHJpbnRfY29tbWl0KGVudW0gY21pdF9mbXQgZm10LCBjb25zdCBzdHJ1Y3QgY29tbWl0KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN0cmJ1ZiAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWJicmV2LCBjb25zdCBjaGFyICpzdWJqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZnRlcl9zdWJqZWN0LCBlbnVtIGRhdGVfbW9kZSwKKwkJCQlpbnQgbmVlZF84Yml0X2N0ZSk7Cit2b2lkIHBwX3VzZXJfaW5mbyhjb25zdCBjaGFyICp3aGF0LCBlbnVtIGNtaXRfZm10IGZtdCwgc3RydWN0IHN0cmJ1ZiAqc2IsCisJCSAgIGNvbnN0IGNoYXIgKmxpbmUsIGVudW0gZGF0ZV9tb2RlIGRtb2RlLAorCQkgICBjb25zdCBjaGFyICplbmNvZGluZyk7Cit2b2lkIHBwX3RpdGxlX2xpbmUoZW51bSBjbWl0X2ZtdCBmbXQsCisJCSAgIGNvbnN0IGNoYXIgKiptc2dfcCwKKwkJICAgc3RydWN0IHN0cmJ1ZiAqc2IsCisJCSAgIGNvbnN0IGNoYXIgKnN1YmplY3QsCisJCSAgIGNvbnN0IGNoYXIgKmFmdGVyX3N1YmplY3QsCisJCSAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAorCQkgICBpbnQgbmVlZF84Yml0X2N0ZSk7Cit2b2lkIHBwX3JlbWFpbmRlcihlbnVtIGNtaXRfZm10IGZtdCwKKwkJICBjb25zdCBjaGFyICoqbXNnX3AsCisJCSAgc3RydWN0IHN0cmJ1ZiAqc2IsCisJCSAgaW50IGluZGVudCk7CisKKworLyoqIFJlbW92ZXMgdGhlIGZpcnN0IGNvbW1pdCBmcm9tIGEgbGlzdCBzb3J0ZWQgYnkgZGF0ZSwgYW5kIGFkZHMgYWxsCisgKiBvZiBpdHMgcGFyZW50cy4KKyAqKi8KK3N0cnVjdCBjb21taXQgKnBvcF9tb3N0X3JlY2VudF9jb21taXQoc3RydWN0IGNvbW1pdF9saXN0ICoqbGlzdCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgbWFyayk7CisKK3N0cnVjdCBjb21taXQgKnBvcF9jb21taXQoc3RydWN0IGNvbW1pdF9saXN0ICoqc3RhY2spOworCit2b2lkIGNsZWFyX2NvbW1pdF9tYXJrcyhzdHJ1Y3QgY29tbWl0ICpjb21taXQsIHVuc2lnbmVkIGludCBtYXJrKTsKKworLyoKKyAqIFBlcmZvcm1zIGFuIGluLXBsYWNlIHRvcG9sb2dpY2FsIHNvcnQgb2YgbGlzdCBzdXBwbGllZC4KKyAqCisgKiAgIGludmFyaWFudCBvZiByZXN1bHRpbmcgbGlzdCBpczoKKyAqICAgICAgYSByZWFjaGFibGUgZnJvbSBiID0+IG9yZChiKSA8IG9yZChhKQorICogICBpbiBhZGRpdGlvbiwgd2hlbiBsaWZvID09IDAsIGNvbW1pdHMgb24gcGFyYWxsZWwgdHJhY2tzIGFyZQorICogICBzb3J0ZWQgaW4gdGhlIGRhdGVzIG9yZGVyLgorICovCit2b2lkIHNvcnRfaW5fdG9wb2xvZ2ljYWxfb3JkZXIoc3RydWN0IGNvbW1pdF9saXN0ICoqIGxpc3QsIGludCBsaWZvKTsKKworc3RydWN0IGNvbW1pdF9ncmFmdCB7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlpbnQgbnJfcGFyZW50OyAvKiA8IDAgaWYgc2hhbGxvdyBjb21taXQgKi8KKwl1bnNpZ25lZCBjaGFyIHBhcmVudFtGTEVYX0FSUkFZXVsyMF07IC8qIG1vcmUgKi8KK307CisKK3N0cnVjdCBjb21taXRfZ3JhZnQgKnJlYWRfZ3JhZnRfbGluZShjaGFyICpidWYsIGludCBsZW4pOworaW50IHJlZ2lzdGVyX2NvbW1pdF9ncmFmdChzdHJ1Y3QgY29tbWl0X2dyYWZ0ICosIGludCk7CitpbnQgcmVhZF9ncmFmdF9maWxlKGNvbnN0IGNoYXIgKmdyYWZ0X2ZpbGUpOworc3RydWN0IGNvbW1pdF9ncmFmdCAqbG9va3VwX2NvbW1pdF9ncmFmdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKKworZXh0ZXJuIHN0cnVjdCBjb21taXRfbGlzdCAqZ2V0X21lcmdlX2Jhc2VzKHN0cnVjdCBjb21taXQgKnJldjEsIHN0cnVjdCBjb21taXQgKnJldjIsIGludCBjbGVhbnVwKTsKKworZXh0ZXJuIGludCByZWdpc3Rlcl9zaGFsbG93KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworZXh0ZXJuIGludCB1bnJlZ2lzdGVyX3NoYWxsb3coY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSk7CitleHRlcm4gaW50IHdyaXRlX3NoYWxsb3dfY29tbWl0cyhpbnQgZmQsIGludCB1c2VfcGFja19wcm90b2NvbCk7CitleHRlcm4gaW50IGlzX3JlcG9zaXRvcnlfc2hhbGxvdyh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgY29tbWl0X2xpc3QgKmdldF9zaGFsbG93X2NvbW1pdHMoc3RydWN0IG9iamVjdF9hcnJheSAqaGVhZHMsCisJCWludCBkZXB0aCwgaW50IHNoYWxsb3dfZmxhZywgaW50IG5vdF9zaGFsbG93X2ZsYWcpOworCitpbnQgaW5fbWVyZ2VfYmFzZXMoc3RydWN0IGNvbW1pdCAqLCBzdHJ1Y3QgY29tbWl0ICoqLCBpbnQpOworCitleHRlcm4gaW50IGludGVyYWN0aXZlX2FkZChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IHJlcmVyZSh2b2lkKTsKKworc3RhdGljIGlubGluZSBpbnQgc2luZ2xlX3BhcmVudChzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJcmV0dXJuIGNvbW1pdC0+cGFyZW50cyAmJiAhY29tbWl0LT5wYXJlbnRzLT5uZXh0OworfQorCisjZW5kaWYgLyogQ09NTUlUX0ggKi8KZGlmZiAtLWdpdCBhL2NvbXBhdC9mb3Blbi5jIGIvY29tcGF0L2ZvcGVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NiOWU4OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBhdC9mb3Blbi5jCkBAIC0wLDAgKzEsMjYgQEAKKyNpbmNsdWRlICIuLi9naXQtY29tcGF0LXV0aWwuaCIKKyN1bmRlZiBmb3BlbgorRklMRSAqZ2l0X2ZvcGVuKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1vZGUpCit7CisJRklMRSAqZnA7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAobW9kZVswXSA9PSAndycgfHwgbW9kZVswXSA9PSAnYScpCisJCXJldHVybiBmb3BlbihwYXRoLCBtb2RlKTsKKworCWlmICghKGZwID0gZm9wZW4ocGF0aCwgbW9kZSkpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChmc3RhdChmaWxlbm8oZnApLCAmc3QpKSB7CisJCWZjbG9zZShmcCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChTX0lTRElSKHN0LnN0X21vZGUpKSB7CisJCWZjbG9zZShmcCk7CisJCWVycm5vID0gRUlTRElSOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gZnA7Cit9CmRpZmYgLS1naXQgYS9jb21wYXQvaHN0cmVycm9yLmMgYi9jb21wYXQvaHN0cmVycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY5YzU1NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBhdC9oc3RyZXJyb3IuYwpAQCAtMCwwICsxLDIxIEBACisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorCitjb25zdCBjaGFyICpnaXRoc3RyZXJyb3IoaW50IGVycikKK3sKKwlzdGF0aWMgY2hhciBidWZmZXJbNDhdOworCXN3aXRjaCAoZXJyKQorCXsKKwljYXNlIEhPU1RfTk9UX0ZPVU5EOgorCQlyZXR1cm4gIkF1dGhvcml0YXRpdmUgYW5zd2VyOiBob3N0IG5vdCBmb3VuZCI7CisJY2FzZSBOT19EQVRBOgorCQlyZXR1cm4gIlZhbGlkIG5hbWUsIG5vIGRhdGEgcmVjb3JkIG9mIHJlcXVlc3RlZCB0eXBlIjsKKwljYXNlIE5PX1JFQ09WRVJZOgorCQlyZXR1cm4gIk5vbiByZWNvdmVyYWJsZSBlcnJvcnMsIEZPUk1FUlIsIFJFRlVTRUQsIE5PVElNUCI7CisJY2FzZSBUUllfQUdBSU46CisJCXJldHVybiAiTm9uLWF1dGhvcml0YXRpdmUgXCJob3N0IG5vdCBmb3VuZFwiLCBvciBTRVJWRVJGQUlMIjsKKwl9CisJc3ByaW50ZihidWZmZXIsICJOYW1lIHJlc29sdXRpb24gZXJyb3IgJWQiLCBlcnIpOworCXJldHVybiBidWZmZXI7Cit9CmRpZmYgLS1naXQgYS9jb21wYXQvaW5ldF9udG9wLmMgYi9jb21wYXQvaW5ldF9udG9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ0NDk4MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBhdC9pbmV0X250b3AuYwpAQCAtMCwwICsxLDE5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk5IGJ5IEludGVybmV0IFNvZnR3YXJlIENvbnNvcnRpdW0uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBJTlRFUk5FVCBTT0ZUV0FSRSBDT05TT1JUSVVNIERJU0NMQUlNUworICogQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBJTlRFUk5FVCBTT0ZUV0FSRQorICogQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTCisgKiBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmbmRlZiBOU19JTkFERFJTWgorI2RlZmluZSBOU19JTkFERFJTWgk0CisjZW5kaWYKKyNpZm5kZWYgTlNfSU42QUREUlNaCisjZGVmaW5lIE5TX0lONkFERFJTWgkxNgorI2VuZGlmCisjaWZuZGVmIE5TX0lOVDE2U1oKKyNkZWZpbmUgTlNfSU5UMTZTWgkyCisjZW5kaWYKKworLyoKKyAqIFdBUk5JTkc6IERvbid0IGV2ZW4gY29uc2lkZXIgdHJ5aW5nIHRvIGNvbXBpbGUgdGhpcyBvbiBhIHN5c3RlbSB3aGVyZQorICogc2l6ZW9mKGludCkgPCA0LiAgc2l6ZW9mKGludCkgPiA0IGlzIGZpbmU7IGFsbCB0aGUgd29ybGQncyBub3QgYSBWQVguCisgKi8KKworLyogY29uc3QgY2hhciAqCisgKiBpbmV0X250b3A0KHNyYywgZHN0LCBzaXplKQorICoJZm9ybWF0IGFuIElQdjQgYWRkcmVzcworICogcmV0dXJuOgorICoJYGRzdCcgKGFzIGEgY29uc3QpCisgKiBub3RlczoKKyAqCSgxKSB1c2VzIG5vIHN0YXRpY3MKKyAqCSgyKSB0YWtlcyBhIHVfY2hhciogbm90IGFuIGluX2FkZHIgYXMgaW5wdXQKKyAqIGF1dGhvcjoKKyAqCVBhdWwgVml4aWUsIDE5OTYuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK2luZXRfbnRvcDQoc3JjLCBkc3QsIHNpemUpCisJY29uc3QgdV9jaGFyICpzcmM7CisJY2hhciAqZHN0OworCXNpemVfdCBzaXplOworeworCXN0YXRpYyBjb25zdCBjaGFyIGZtdFtdID0gIiV1LiV1LiV1LiV1IjsKKwljaGFyIHRtcFtzaXplb2YgIjI1NS4yNTUuMjU1LjI1NSJdOworCWludCBucHJpbnRlZDsKKworCW5wcmludGVkID0gc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgZm10LCBzcmNbMF0sIHNyY1sxXSwgc3JjWzJdLCBzcmNbM10pOworCWlmIChucHJpbnRlZCA8IDApCisJCXJldHVybiAoTlVMTCk7CS8qIHdlIGFzc3VtZSAiZXJybm8iIHdhcyBzZXQgYnkgInNucHJpbnRmKCkiICovCisJaWYgKChzaXplX3QpbnByaW50ZWQgPiBzaXplKSB7CisJCWVycm5vID0gRU5PU1BDOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlzdHJjcHkoZHN0LCB0bXApOworCXJldHVybiAoZHN0KTsKK30KKworI2lmbmRlZiBOT19JUFY2CisvKiBjb25zdCBjaGFyICoKKyAqIGluZXRfbnRvcDYoc3JjLCBkc3QsIHNpemUpCisgKgljb252ZXJ0IElQdjYgYmluYXJ5IGFkZHJlc3MgaW50byBwcmVzZW50YXRpb24gKHByaW50YWJsZSkgZm9ybWF0CisgKiBhdXRob3I6CisgKglQYXVsIFZpeGllLCAxOTk2LgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCitpbmV0X250b3A2KHNyYywgZHN0LCBzaXplKQorCWNvbnN0IHVfY2hhciAqc3JjOworCWNoYXIgKmRzdDsKKwlzaXplX3Qgc2l6ZTsKK3sKKwkvKgorCSAqIE5vdGUgdGhhdCBpbnQzMl90IGFuZCBpbnQxNl90IG5lZWQgb25seSBiZSAiYXQgbGVhc3QiIGxhcmdlIGVub3VnaAorCSAqIHRvIGNvbnRhaW4gYSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHNpemUuICBPbiBzb21lIHN5c3RlbXMsIGxpa2UKKwkgKiBDcmF5cywgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBhbiBpbnRlZ2VyIHZhcmlhYmxlIHdpdGggMTYgYml0cy4KKwkgKiBLZWVwIHRoaXMgaW4gbWluZCBpZiB5b3UgdGhpbmsgdGhpcyBmdW5jdGlvbiBzaG91bGQgaGF2ZSBiZWVuIGNvZGVkCisJICogdG8gdXNlIHBvaW50ZXIgb3ZlcmxheXMuICBBbGwgdGhlIHdvcmxkJ3Mgbm90IGEgVkFYLgorCSAqLworCWNoYXIgdG1wW3NpemVvZiAiZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6MjU1LjI1NS4yNTUuMjU1Il0sICp0cDsKKwlzdHJ1Y3QgeyBpbnQgYmFzZSwgbGVuOyB9IGJlc3QsIGN1cjsKKwl1bnNpZ25lZCBpbnQgd29yZHNbTlNfSU42QUREUlNaIC8gTlNfSU5UMTZTWl07CisJaW50IGk7CisKKwkvKgorCSAqIFByZXByb2Nlc3M6CisJICoJQ29weSB0aGUgaW5wdXQgKGJ5dGV3aXNlKSBhcnJheSBpbnRvIGEgd29yZHdpc2UgYXJyYXkuCisJICoJRmluZCB0aGUgbG9uZ2VzdCBydW4gb2YgMHgwMCdzIGluIHNyY1tdIGZvciA6OiBzaG9ydGhhbmRpbmcuCisJICovCisJbWVtc2V0KHdvcmRzLCAnXDAnLCBzaXplb2Ygd29yZHMpOworCWZvciAoaSA9IDA7IGkgPCBOU19JTjZBRERSU1o7IGkrKykKKwkJd29yZHNbaSAvIDJdIHw9IChzcmNbaV0gPDwgKCgxIC0gKGkgJSAyKSkgPDwgMykpOworCWJlc3QuYmFzZSA9IC0xOworCWN1ci5iYXNlID0gLTE7CisJZm9yIChpID0gMDsgaSA8IChOU19JTjZBRERSU1ogLyBOU19JTlQxNlNaKTsgaSsrKSB7CisJCWlmICh3b3Jkc1tpXSA9PSAwKSB7CisJCQlpZiAoY3VyLmJhc2UgPT0gLTEpCisJCQkJY3VyLmJhc2UgPSBpLCBjdXIubGVuID0gMTsKKwkJCWVsc2UKKwkJCQljdXIubGVuKys7CisJCX0gZWxzZSB7CisJCQlpZiAoY3VyLmJhc2UgIT0gLTEpIHsKKwkJCQlpZiAoYmVzdC5iYXNlID09IC0xIHx8IGN1ci5sZW4gPiBiZXN0LmxlbikKKwkJCQkJYmVzdCA9IGN1cjsKKwkJCQljdXIuYmFzZSA9IC0xOworCQkJfQorCQl9CisJfQorCWlmIChjdXIuYmFzZSAhPSAtMSkgeworCQlpZiAoYmVzdC5iYXNlID09IC0xIHx8IGN1ci5sZW4gPiBiZXN0LmxlbikKKwkJCWJlc3QgPSBjdXI7CisJfQorCWlmIChiZXN0LmJhc2UgIT0gLTEgJiYgYmVzdC5sZW4gPCAyKQorCQliZXN0LmJhc2UgPSAtMTsKKworCS8qCisJICogRm9ybWF0IHRoZSByZXN1bHQuCisJICovCisJdHAgPSB0bXA7CisJZm9yIChpID0gMDsgaSA8IChOU19JTjZBRERSU1ogLyBOU19JTlQxNlNaKTsgaSsrKSB7CisJCS8qIEFyZSB3ZSBpbnNpZGUgdGhlIGJlc3QgcnVuIG9mIDB4MDAncz8gKi8KKwkJaWYgKGJlc3QuYmFzZSAhPSAtMSAmJiBpID49IGJlc3QuYmFzZSAmJgorCQkgICAgaSA8IChiZXN0LmJhc2UgKyBiZXN0LmxlbikpIHsKKwkJCWlmIChpID09IGJlc3QuYmFzZSkKKwkJCQkqdHArKyA9ICc6JzsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIEFyZSB3ZSBmb2xsb3dpbmcgYW4gaW5pdGlhbCBydW4gb2YgMHgwMHMgb3IgYW55IHJlYWwgaGV4PyAqLworCQlpZiAoaSAhPSAwKQorCQkJKnRwKysgPSAnOic7CisJCS8qIElzIHRoaXMgYWRkcmVzcyBhbiBlbmNhcHN1bGF0ZWQgSVB2ND8gKi8KKwkJaWYgKGkgPT0gNiAmJiBiZXN0LmJhc2UgPT0gMCAmJgorCQkgICAgKGJlc3QubGVuID09IDYgfHwgKGJlc3QubGVuID09IDUgJiYgd29yZHNbNV0gPT0gMHhmZmZmKSkpIHsKKwkJCWlmICghaW5ldF9udG9wNChzcmMrMTIsIHRwLCBzaXplb2YgdG1wIC0gKHRwIC0gdG1wKSkpCisJCQkJcmV0dXJuIChOVUxMKTsKKwkJCXRwICs9IHN0cmxlbih0cCk7CisJCQlicmVhazsKKwkJfQorCQl0cCArPSBzbnByaW50Zih0cCwgc2l6ZW9mIHRtcCAtICh0cCAtIHRtcCksICIleCIsIHdvcmRzW2ldKTsKKwl9CisJLyogV2FzIGl0IGEgdHJhaWxpbmcgcnVuIG9mIDB4MDAncz8gKi8KKwlpZiAoYmVzdC5iYXNlICE9IC0xICYmIChiZXN0LmJhc2UgKyBiZXN0LmxlbikgPT0KKwkgICAgKE5TX0lONkFERFJTWiAvIE5TX0lOVDE2U1opKQorCQkqdHArKyA9ICc6JzsKKwkqdHArKyA9ICdcMCc7CisKKwkvKgorCSAqIENoZWNrIGZvciBvdmVyZmxvdywgY29weSwgYW5kIHdlJ3JlIGRvbmUuCisJICovCisJaWYgKChzaXplX3QpKHRwIC0gdG1wKSA+IHNpemUpIHsKKwkJZXJybm8gPSBFTk9TUEM7CisJCXJldHVybiAoTlVMTCk7CisJfQorCXN0cmNweShkc3QsIHRtcCk7CisJcmV0dXJuIChkc3QpOworfQorI2VuZGlmCisKKy8qIGNoYXIgKgorICogaW5ldF9udG9wKGFmLCBzcmMsIGRzdCwgc2l6ZSkKKyAqCWNvbnZlcnQgYSBuZXR3b3JrIGZvcm1hdCBhZGRyZXNzIHRvIHByZXNlbnRhdGlvbiBmb3JtYXQuCisgKiByZXR1cm46CisgKglwb2ludGVyIHRvIHByZXNlbnRhdGlvbiBmb3JtYXQgYWRkcmVzcyAoYGRzdCcpLCBvciBOVUxMIChzZWUgZXJybm8pLgorICogYXV0aG9yOgorICoJUGF1bCBWaXhpZSwgMTk5Ni4KKyAqLworY29uc3QgY2hhciAqCitpbmV0X250b3AoYWYsIHNyYywgZHN0LCBzaXplKQorCWludCBhZjsKKwljb25zdCB2b2lkICpzcmM7CisJY2hhciAqZHN0OworCXNpemVfdCBzaXplOworeworCXN3aXRjaCAoYWYpIHsKKwljYXNlIEFGX0lORVQ6CisJCXJldHVybiAoaW5ldF9udG9wNChzcmMsIGRzdCwgc2l6ZSkpOworI2lmbmRlZiBOT19JUFY2CisJY2FzZSBBRl9JTkVUNjoKKwkJcmV0dXJuIChpbmV0X250b3A2KHNyYywgZHN0LCBzaXplKSk7CisjZW5kaWYKKwlkZWZhdWx0OgorCQllcnJubyA9IEVBRk5PU1VQUE9SVDsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJLyogTk9UUkVBQ0hFRCAqLworfQpkaWZmIC0tZ2l0IGEvY29tcGF0L2luZXRfcHRvbi5jIGIvY29tcGF0L2luZXRfcHRvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNzhmYzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wYXQvaW5ldF9wdG9uLmMKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMSAgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1bS4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIElOVEVSTkVUIFNPRlRXQVJFIENPTlNPUlRJVU0KKyAqIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBJTlRFUk5FVCBTT0ZUV0FSRSBDT05TT1JUSVVNIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwKKyAqIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcKKyAqIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZuZGVmIE5TX0lOVDE2U1oKKyNkZWZpbmUgTlNfSU5UMTZTWiAgICAgICAyCisjZW5kaWYKKworI2lmbmRlZiBOU19JTkFERFJTWgorI2RlZmluZSBOU19JTkFERFJTWiAgICAgIDQKKyNlbmRpZgorCisjaWZuZGVmIE5TX0lONkFERFJTWgorI2RlZmluZSBOU19JTjZBRERSU1ogICAgMTYKKyNlbmRpZgorCisvKgorICogV0FSTklORzogRG9uJ3QgZXZlbiBjb25zaWRlciB0cnlpbmcgdG8gY29tcGlsZSB0aGlzIG9uIGEgc3lzdGVtIHdoZXJlCisgKiBzaXplb2YoaW50KSA8IDQuICBzaXplb2YoaW50KSA+IDQgaXMgZmluZTsgYWxsIHRoZSB3b3JsZCdzIG5vdCBhIFZBWC4KKyAqLworCitzdGF0aWMgaW50IGluZXRfcHRvbjQoY29uc3QgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QpOworc3RhdGljIGludCBpbmV0X3B0b242KGNvbnN0IGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0KTsKKworLyogaW50CisgKiBpbmV0X3B0b240KHNyYywgZHN0KQorICogICAgICBsaWtlIGluZXRfYXRvbigpIGJ1dCB3aXRob3V0IGFsbCB0aGUgaGV4YWRlY2ltYWwgYW5kIHNob3J0aGFuZC4KKyAqIHJldHVybjoKKyAqICAgICAgMSBpZiBgc3JjJyBpcyBhIHZhbGlkIGRvdHRlZCBxdWFkLCBlbHNlIDAuCisgKiBub3RpY2U6CisgKiAgICAgIGRvZXMgbm90IHRvdWNoIGBkc3QnIHVubGVzcyBpdCdzIHJldHVybmluZyAxLgorICogYXV0aG9yOgorICogICAgICBQYXVsIFZpeGllLCAxOTk2LgorICovCitzdGF0aWMgaW50CitpbmV0X3B0b240KGNvbnN0IGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0KQoreworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBkaWdpdHNbXSA9ICIwMTIzNDU2Nzg5IjsKKyAgICAgICAgaW50IHNhd19kaWdpdCwgb2N0ZXRzLCBjaDsKKyAgICAgICAgdW5zaWduZWQgY2hhciB0bXBbTlNfSU5BRERSU1pdLCAqdHA7CisKKyAgICAgICAgc2F3X2RpZ2l0ID0gMDsKKyAgICAgICAgb2N0ZXRzID0gMDsKKyAgICAgICAgKih0cCA9IHRtcCkgPSAwOworICAgICAgICB3aGlsZSAoKGNoID0gKnNyYysrKSAhPSAnXDAnKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGNoOworCisgICAgICAgICAgICAgICAgaWYgKChwY2ggPSBzdHJjaHIoZGlnaXRzLCBjaCkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuZXcgPSAqdHAgKiAxMCArIChwY2ggLSBkaWdpdHMpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3ID4gMjU1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgICAgICAgICAgICAgKnRwID0gbmV3OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgc2F3X2RpZ2l0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgrK29jdGV0cyA+IDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F3X2RpZ2l0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcuJyAmJiBzYXdfZGlnaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvY3RldHMgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICorK3RwID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhd19kaWdpdCA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisgICAgICAgIGlmIChvY3RldHMgPCA0KQorICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIG1lbWNweShkc3QsIHRtcCwgTlNfSU5BRERSU1opOworICAgICAgICByZXR1cm4gKDEpOworfQorCisvKiBpbnQKKyAqIGluZXRfcHRvbjYoc3JjLCBkc3QpCisgKiAgICAgIGNvbnZlcnQgcHJlc2VudGF0aW9uIGxldmVsIGFkZHJlc3MgdG8gbmV0d29yayBvcmRlciBiaW5hcnkgZm9ybS4KKyAqIHJldHVybjoKKyAqICAgICAgMSBpZiBgc3JjJyBpcyBhIHZhbGlkIFtSRkMxODg0IDIuMl0gYWRkcmVzcywgZWxzZSAwLgorICogbm90aWNlOgorICogICAgICAoMSkgZG9lcyBub3QgdG91Y2ggYGRzdCcgdW5sZXNzIGl0J3MgcmV0dXJuaW5nIDEuCisgKiAgICAgICgyKSA6OiBpbiBhIGZ1bGwgYWRkcmVzcyBpcyBzaWxlbnRseSBpZ25vcmVkLgorICogY3JlZGl0OgorICogICAgICBpbnNwaXJlZCBieSBNYXJrIEFuZHJld3MuCisgKiBhdXRob3I6CisgKiAgICAgIFBhdWwgVml4aWUsIDE5OTYuCisgKi8KKworI2lmbmRlZiBOT19JUFY2CitzdGF0aWMgaW50CitpbmV0X3B0b242KGNvbnN0IGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0KQoreworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciB4ZGlnaXRzX2xbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeGRpZ2l0c191W10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgdG1wW05TX0lONkFERFJTWl0sICp0cCwgKmVuZHAsICpjb2xvbnA7CisgICAgICAgIGNvbnN0IGNoYXIgKnhkaWdpdHMsICpjdXJ0b2s7CisgICAgICAgIGludCBjaCwgc2F3X3hkaWdpdDsKKyAgICAgICAgdW5zaWduZWQgaW50IHZhbDsKKworICAgICAgICBtZW1zZXQoKHRwID0gdG1wKSwgJ1wwJywgTlNfSU42QUREUlNaKTsKKyAgICAgICAgZW5kcCA9IHRwICsgTlNfSU42QUREUlNaOworICAgICAgICBjb2xvbnAgPSBOVUxMOworICAgICAgICAvKiBMZWFkaW5nIDo6IHJlcXVpcmVzIHNvbWUgc3BlY2lhbCBoYW5kbGluZy4gKi8KKyAgICAgICAgaWYgKCpzcmMgPT0gJzonKQorICAgICAgICAgICAgICAgIGlmICgqKytzcmMgIT0gJzonKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgY3VydG9rID0gc3JjOworICAgICAgICBzYXdfeGRpZ2l0ID0gMDsKKyAgICAgICAgdmFsID0gMDsKKyAgICAgICAgd2hpbGUgKChjaCA9ICpzcmMrKykgIT0gJ1wwJykgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBjaDsKKworICAgICAgICAgICAgICAgIGlmICgocGNoID0gc3RyY2hyKCh4ZGlnaXRzID0geGRpZ2l0c19sKSwgY2gpKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgcGNoID0gc3RyY2hyKCh4ZGlnaXRzID0geGRpZ2l0c191KSwgY2gpOworICAgICAgICAgICAgICAgIGlmIChwY2ggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsIDw8PSA0OworICAgICAgICAgICAgICAgICAgICAgICAgdmFsIHw9IChwY2ggLSB4ZGlnaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPiAweGZmZmYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYXdfeGRpZ2l0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJzonKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJ0b2sgPSBzcmM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNhd194ZGlnaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9ucCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvbnAgPSB0cDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHAgKyBOU19JTlQxNlNaID4gZW5kcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICp0cCsrID0gKHVuc2lnbmVkIGNoYXIpICh2YWwgPj4gOCkgJiAweGZmOworICAgICAgICAgICAgICAgICAgICAgICAgKnRwKysgPSAodW5zaWduZWQgY2hhcikgdmFsICYgMHhmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhd194ZGlnaXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJy4nICYmICgodHAgKyBOU19JTkFERFJTWikgPD0gZW5kcCkgJiYKKyAgICAgICAgICAgICAgICAgICAgaW5ldF9wdG9uNChjdXJ0b2ssIHRwKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwICs9IE5TX0lOQUREUlNaOworICAgICAgICAgICAgICAgICAgICAgICAgc2F3X3hkaWdpdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIC8qICdcMCcgd2FzIHNlZW4gYnkgaW5ldF9wdG9uNCgpLiAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisgICAgICAgIGlmIChzYXdfeGRpZ2l0KSB7CisgICAgICAgICAgICAgICAgaWYgKHRwICsgTlNfSU5UMTZTWiA+IGVuZHApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgICAgICp0cCsrID0gKHVuc2lnbmVkIGNoYXIpICh2YWwgPj4gOCkgJiAweGZmOworICAgICAgICAgICAgICAgICp0cCsrID0gKHVuc2lnbmVkIGNoYXIpIHZhbCAmIDB4ZmY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbG9ucCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBTaW5jZSBzb21lIG1lbW1vdmUoKSdzIGVycm9uZW91c2x5IGZhaWwgdG8gaGFuZGxlCisgICAgICAgICAgICAgICAgICogb3ZlcmxhcHBpbmcgcmVnaW9ucywgd2UnbGwgZG8gdGhlIHNoaWZ0IGJ5IGhhbmQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgY29uc3QgaW50IG4gPSB0cCAtIGNvbG9ucDsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmRwWy0gaV0gPSBjb2xvbnBbbiAtIGldOworICAgICAgICAgICAgICAgICAgICAgICAgY29sb25wW24gLSBpXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRwID0gZW5kcDsKKyAgICAgICAgfQorICAgICAgICBpZiAodHAgIT0gZW5kcCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICBtZW1jcHkoZHN0LCB0bXAsIE5TX0lONkFERFJTWik7CisgICAgICAgIHJldHVybiAoMSk7Cit9CisjZW5kaWYKKworLyogaW50CisgKiBpc2NfbmV0X3B0b24oYWYsIHNyYywgZHN0KQorICogICAgICBjb252ZXJ0IGZyb20gcHJlc2VudGF0aW9uIGZvcm1hdCAod2hpY2ggdXN1YWxseSBtZWFucyBBU0NJSSBwcmludGFibGUpCisgKiAgICAgIHRvIG5ldHdvcmsgZm9ybWF0ICh3aGljaCBpcyB1c3VhbGx5IHNvbWUga2luZCBvZiBiaW5hcnkgZm9ybWF0KS4KKyAqIHJldHVybjoKKyAqICAgICAgMSBpZiB0aGUgYWRkcmVzcyB3YXMgdmFsaWQgZm9yIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBmYW1pbHkKKyAqICAgICAgMCBpZiB0aGUgYWRkcmVzcyB3YXNuJ3QgdmFsaWQgKGBkc3QnIGlzIHVudG91Y2hlZCBpbiB0aGlzIGNhc2UpCisgKiAgICAgIC0xIGlmIHNvbWUgb3RoZXIgZXJyb3Igb2NjdXJyZWQgKGBkc3QnIGlzIHVudG91Y2hlZCBpbiB0aGlzIGNhc2UsIHRvbykKKyAqIGF1dGhvcjoKKyAqICAgICAgUGF1bCBWaXhpZSwgMTk5Ni4KKyAqLworaW50CitpbmV0X3B0b24oaW50IGFmLCBjb25zdCBjaGFyICpzcmMsIHZvaWQgKmRzdCkKK3sKKyAgICAgICAgc3dpdGNoIChhZikgeworICAgICAgICBjYXNlIEFGX0lORVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIChpbmV0X3B0b240KHNyYywgZHN0KSk7CisjaWZuZGVmIE5PX0lQVjYKKyAgICAgICAgY2FzZSBBRl9JTkVUNjoKKyAgICAgICAgICAgICAgICByZXR1cm4gKGluZXRfcHRvbjYoc3JjLCBkc3QpKTsKKyNlbmRpZgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGVycm5vID0gRUFGTk9TVVBQT1JUOworICAgICAgICAgICAgICAgIHJldHVybiAoLTEpOworICAgICAgICB9CisgICAgICAgIC8qIE5PVFJFQUNIRUQgKi8KK30KZGlmZiAtLWdpdCBhL2NvbXBhdC9tZW1tZW0uYyBiL2NvbXBhdC9tZW1tZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDBkODc3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGF0L21lbW1lbS5jCkBAIC0wLDAgKzEsMjkgQEAKKyNpbmNsdWRlICIuLi9naXQtY29tcGF0LXV0aWwuaCIKKwordm9pZCAqZ2l0bWVtbWVtKGNvbnN0IHZvaWQgKmhheXN0YWNrLCBzaXplX3QgaGF5c3RhY2tfbGVuLAorICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKm5lZWRsZSwgc2l6ZV90IG5lZWRsZV9sZW4pCit7CisJY29uc3QgY2hhciAqYmVnaW4gPSBoYXlzdGFjazsKKwljb25zdCBjaGFyICpsYXN0X3Bvc3NpYmxlID0gYmVnaW4gKyBoYXlzdGFja19sZW4gLSBuZWVkbGVfbGVuOworCisJLyoKKwkgKiBUaGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgZW1wdHkgc3RyaW5nIGlzIGRlZW1lZCB0byBvY2N1ciBhdAorCSAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZy4KKwkgKi8KKwlpZiAobmVlZGxlX2xlbiA9PSAwKQorCQlyZXR1cm4gKHZvaWQgKiliZWdpbjsKKworCS8qCisJICogU2FuaXR5IGNoZWNrLCBvdGhlcndpc2UgdGhlIGxvb3AgbWlnaHQgc2VhcmNoIHRocm91Z2ggdGhlIHdob2xlCisJICogbWVtb3J5LgorCSAqLworCWlmIChoYXlzdGFja19sZW4gPCBuZWVkbGVfbGVuKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoOyBiZWdpbiA8PSBsYXN0X3Bvc3NpYmxlOyBiZWdpbisrKSB7CisJCWlmICghbWVtY21wKGJlZ2luLCBuZWVkbGUsIG5lZWRsZV9sZW4pKQorCQkJcmV0dXJuICh2b2lkICopYmVnaW47CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9jb21wYXQvbWtkdGVtcC5jIGIvY29tcGF0L21rZHRlbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGQ0YjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGF0L21rZHRlbXAuYwpAQCAtMCwwICsxLDggQEAKKyNpbmNsdWRlICIuLi9naXQtY29tcGF0LXV0aWwuaCIKKworY2hhciAqZ2l0bWtkdGVtcChjaGFyICp0ZW1wbGF0ZSkKK3sKKwlpZiAoIW1rdGVtcCh0ZW1wbGF0ZSkgfHwgbWtkaXIodGVtcGxhdGUsIDA3MDApKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gdGVtcGxhdGU7Cit9CmRpZmYgLS1naXQgYS9jb21wYXQvbW1hcC5jIGIvY29tcGF0L21tYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWQ0NmQxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGF0L21tYXAuYwpAQCAtMCwwICsxLDQyIEBACisjaW5jbHVkZSAiLi4vZ2l0LWNvbXBhdC11dGlsLmgiCisKK3ZvaWQgKmdpdF9tbWFwKHZvaWQgKnN0YXJ0LCBzaXplX3QgbGVuZ3RoLCBpbnQgcHJvdCwgaW50IGZsYWdzLCBpbnQgZmQsIG9mZl90IG9mZnNldCkKK3sKKwlzaXplX3QgbiA9IDA7CisKKwlpZiAoc3RhcnQgIT0gTlVMTCB8fCAhKGZsYWdzICYgTUFQX1BSSVZBVEUpKQorCQlkaWUoIkludmFsaWQgdXNhZ2Ugb2YgbW1hcCB3aGVuIGJ1aWx0IHdpdGggTk9fTU1BUCIpOworCisJc3RhcnQgPSB4bWFsbG9jKGxlbmd0aCk7CisJaWYgKHN0YXJ0ID09IE5VTEwpIHsKKwkJZXJybm8gPSBFTk9NRU07CisJCXJldHVybiBNQVBfRkFJTEVEOworCX0KKworCXdoaWxlIChuIDwgbGVuZ3RoKSB7CisJCXNzaXplX3QgY291bnQgPSBwcmVhZChmZCwgKGNoYXIgKilzdGFydCArIG4sIGxlbmd0aCAtIG4sIG9mZnNldCArIG4pOworCisJCWlmIChjb3VudCA9PSAwKSB7CisJCQltZW1zZXQoKGNoYXIgKilzdGFydCtuLCAwLCBsZW5ndGgtbik7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChjb3VudCA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CisJCQlmcmVlKHN0YXJ0KTsKKwkJCWVycm5vID0gRUFDQ0VTOworCQkJcmV0dXJuIE1BUF9GQUlMRUQ7CisJCX0KKworCQluICs9IGNvdW50OworCX0KKworCXJldHVybiBzdGFydDsKK30KKworaW50IGdpdF9tdW5tYXAodm9pZCAqc3RhcnQsIHNpemVfdCBsZW5ndGgpCit7CisJZnJlZShzdGFydCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb21wYXQvcHJlYWQuYyBiL2NvbXBhdC9wcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OGNhYzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wYXQvcHJlYWQuYwpAQCAtMCwwICsxLDE4IEBACisjaW5jbHVkZSAiLi4vZ2l0LWNvbXBhdC11dGlsLmgiCisKK3NzaXplX3QgZ2l0X3ByZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIG9mZl90IG9mZnNldCkKK3sKKyAgICAgICAgb2ZmX3QgY3VycmVudF9vZmZzZXQ7CisgICAgICAgIHNzaXplX3QgcmM7CisKKyAgICAgICAgY3VycmVudF9vZmZzZXQgPSBsc2VlayhmZCwgMCwgU0VFS19DVVIpOworCisgICAgICAgIGlmIChsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICByYyA9IHJlYWRfaW5fZnVsbChmZCwgYnVmLCBjb3VudCk7CisKKyAgICAgICAgaWYgKGN1cnJlbnRfb2Zmc2V0ICE9IGxzZWVrKGZkLCBjdXJyZW50X29mZnNldCwgU0VFS19TRVQpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvY29tcGF0L3Fzb3J0LmMgYi9jb21wYXQvcXNvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTNkY2UyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGF0L3Fzb3J0LmMKQEAgLTAsMCArMSw2MiBAQAorI2luY2x1ZGUgIi4uL2dpdC1jb21wYXQtdXRpbC5oIgorCisvKgorICogQSBtZXJnZSBzb3J0IGltcGxlbWVudGF0aW9uLCBzaW1wbGlmaWVkIGZyb20gdGhlIHFzb3J0IGltcGxlbWVudGF0aW9uCisgKiBieSBNaWtlIEhhZXJ0ZWwsIHdoaWNoIGlzIGEgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAqLworCitzdGF0aWMgdm9pZCBtc29ydF93aXRoX3RtcCh2b2lkICpiLCBzaXplX3Qgbiwgc2l6ZV90IHMsCisJCQkgICBpbnQgKCpjbXApKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSwKKwkJCSAgIGNoYXIgKnQpCit7CisJY2hhciAqdG1wOworCWNoYXIgKmIxLCAqYjI7CisJc2l6ZV90IG4xLCBuMjsKKworCWlmIChuIDw9IDEpCisJCXJldHVybjsKKworCW4xID0gbiAvIDI7CisJbjIgPSBuIC0gbjE7CisJYjEgPSBiOworCWIyID0gKGNoYXIgKiliICsgKG4xICogcyk7CisKKwltc29ydF93aXRoX3RtcChiMSwgbjEsIHMsIGNtcCwgdCk7CisJbXNvcnRfd2l0aF90bXAoYjIsIG4yLCBzLCBjbXAsIHQpOworCisJdG1wID0gdDsKKworCXdoaWxlIChuMSA+IDAgJiYgbjIgPiAwKSB7CisJCWlmIChjbXAoYjEsIGIyKSA8PSAwKSB7CisJCQltZW1jcHkodG1wLCBiMSwgcyk7CisJCQl0bXAgKz0gczsKKwkJCWIxICs9IHM7CisJCQktLW4xOworCQl9IGVsc2UgeworCQkJbWVtY3B5KHRtcCwgYjIsIHMpOworCQkJdG1wICs9IHM7CisJCQliMiArPSBzOworCQkJLS1uMjsKKwkJfQorCX0KKwlpZiAobjEgPiAwKQorCQltZW1jcHkodG1wLCBiMSwgbjEgKiBzKTsKKwltZW1jcHkoYiwgdCwgKG4gLSBuMikgKiBzKTsKK30KKwordm9pZCBnaXRfcXNvcnQodm9pZCAqYiwgc2l6ZV90IG4sIHNpemVfdCBzLAorCSAgICAgICBpbnQgKCpjbXApKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkKK3sKKwljb25zdCBzaXplX3Qgc2l6ZSA9IG4gKiBzOworCWNoYXIgYnVmWzEwMjRdOworCisJaWYgKHNpemUgPCBzaXplb2YoYnVmKSkgeworCQkvKiBUaGUgdGVtcG9yYXJ5IGFycmF5IGZpdHMgb24gdGhlIHNtYWxsIG9uLXN0YWNrIGJ1ZmZlci4gKi8KKwkJbXNvcnRfd2l0aF90bXAoYiwgbiwgcywgY21wLCBidWYpOworCX0gZWxzZSB7CisJCS8qIEl0J3Mgc29tZXdoYXQgbGFyZ2UsIHNvIG1hbGxvYyBpdC4gICovCisJCWNoYXIgKnRtcCA9IG1hbGxvYyhzaXplKTsKKwkJbXNvcnRfd2l0aF90bXAoYiwgbiwgcywgY21wLCB0bXApOworCQlmcmVlKHRtcCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tcGF0L3NldGVudi5jIGIvY29tcGF0L3NldGVudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMjJlYTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wYXQvc2V0ZW52LmMKQEAgLTAsMCArMSwzNCBAQAorI2luY2x1ZGUgIi4uL2dpdC1jb21wYXQtdXRpbC5oIgorCitpbnQgZ2l0c2V0ZW52KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlLCBpbnQgcmVwbGFjZSkKK3sKKwlpbnQgb3V0OworCXNpemVfdCBuYW1lbGVuLCB2YWx1ZWxlbjsKKwljaGFyICplbnZzdHI7CisKKwlpZiAoIW5hbWUgfHwgIXZhbHVlKSByZXR1cm4gLTE7CisJaWYgKCFyZXBsYWNlKSB7CisJCWNoYXIgKm9sZHZhbCA9IE5VTEw7CisJCW9sZHZhbCA9IGdldGVudihuYW1lKTsKKwkJaWYgKG9sZHZhbCkgcmV0dXJuIDA7CisJfQorCisJbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKwl2YWx1ZWxlbiA9IHN0cmxlbih2YWx1ZSk7CisJZW52c3RyID0gbWFsbG9jKChuYW1lbGVuICsgdmFsdWVsZW4gKyAyKSk7CisJaWYgKCFlbnZzdHIpIHJldHVybiAtMTsKKworCW1lbWNweShlbnZzdHIsIG5hbWUsIG5hbWVsZW4pOworCWVudnN0cltuYW1lbGVuXSA9ICc9JzsKKwltZW1jcHkoZW52c3RyICsgbmFtZWxlbiArIDEsIHZhbHVlLCB2YWx1ZWxlbik7CisJZW52c3RyW25hbWVsZW4gKyB2YWx1ZWxlbiArIDFdID0gMDsKKworCW91dCA9IHB1dGVudihlbnZzdHIpOworCS8qIHB1dGVudigzKSBtYWtlcyB0aGUgYXJndW1lbnQgc3RyaW5nIHBhcnQgb2YgdGhlIGVudmlyb25tZW50LAorCSAqIGFuZCBjaGFuZ2luZyB0aGF0IHN0cmluZyBtb2RpZmllcyB0aGUgZW52aXJvbm1lbnQgLS0tIHdoaWNoCisJICogbWVhbnMgd2UgZG8gbm90IG93biB0aGF0IHN0b3JhZ2UgYW55bW9yZS4gIERvIG5vdCBmcmVlCisJICogZW52c3RyLgorCSAqLworCisJcmV0dXJuIG91dDsKK30KZGlmZiAtLWdpdCBhL2NvbXBhdC9zbnByaW50Zi5jIGIvY29tcGF0L3NucHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJmYzJkNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBhdC9zbnByaW50Zi5jCkBAIC0wLDAgKzEsNDAgQEAKKyNpbmNsdWRlICIuLi9naXQtY29tcGF0LXV0aWwuaCIKKworI3VuZGVmIHZzbnByaW50ZgoraW50IGdpdF92c25wcmludGYoY2hhciAqc3RyLCBzaXplX3QgbWF4c2l6ZSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKQoreworCWNoYXIgKnM7CisJaW50IHJldDsKKworCXJldCA9IHZzbnByaW50ZihzdHIsIG1heHNpemUsIGZvcm1hdCwgYXApOworCWlmIChyZXQgIT0gLTEpCisJCXJldHVybiByZXQ7CisKKwlzID0gTlVMTDsKKwlpZiAobWF4c2l6ZSA8IDEyOCkKKwkJbWF4c2l6ZSA9IDEyODsKKworCXdoaWxlIChyZXQgPT0gLTEpIHsKKwkJbWF4c2l6ZSAqPSA0OworCQlzdHIgPSByZWFsbG9jKHMsIG1heHNpemUpOworCQlpZiAoISBzdHIpCisJCQlicmVhazsKKwkJcyA9IHN0cjsKKwkJcmV0ID0gdnNucHJpbnRmKHN0ciwgbWF4c2l6ZSwgZm9ybWF0LCBhcCk7CisJfQorCWZyZWUocyk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGdpdF9zbnByaW50ZihjaGFyICpzdHIsIHNpemVfdCBtYXhzaXplLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWludCByZXQ7CisKKwl2YV9zdGFydChhcCwgZm9ybWF0KTsKKwlyZXQgPSBnaXRfdnNucHJpbnRmKHN0ciwgbWF4c2l6ZSwgZm9ybWF0LCBhcCk7CisJdmFfZW5kKGFwKTsKKworCXJldHVybiByZXQ7Cit9CisKZGlmZiAtLWdpdCBhL2NvbXBhdC9zdHJjYXNlc3RyLmMgYi9jb21wYXQvc3RyY2FzZXN0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ODk2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wYXQvc3RyY2FzZXN0ci5jCkBAIC0wLDAgKzEsMjIgQEAKKyNpbmNsdWRlICIuLi9naXQtY29tcGF0LXV0aWwuaCIKKworY2hhciAqZ2l0c3RyY2FzZXN0cihjb25zdCBjaGFyICpoYXlzdGFjaywgY29uc3QgY2hhciAqbmVlZGxlKQoreworCWludCBubGVuID0gc3RybGVuKG5lZWRsZSk7CisJaW50IGhsZW4gPSBzdHJsZW4oaGF5c3RhY2spIC0gbmxlbiArIDE7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaGxlbjsgaSsrKSB7CisJCWludCBqOworCQlmb3IgKGogPSAwOyBqIDwgbmxlbjsgaisrKSB7CisJCQl1bnNpZ25lZCBjaGFyIGMxID0gaGF5c3RhY2tbaStqXTsKKwkJCXVuc2lnbmVkIGNoYXIgYzIgPSBuZWVkbGVbal07CisJCQlpZiAodG91cHBlcihjMSkgIT0gdG91cHBlcihjMikpCisJCQkJZ290byBuZXh0OworCQl9CisJCXJldHVybiAoY2hhciAqKSBoYXlzdGFjayArIGk7CisJbmV4dDoKKwkJOworCX0KKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2NvbXBhdC9zdHJsY3B5LmMgYi9jb21wYXQvc3RybGNweS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMjRjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wYXQvc3RybGNweS5jCkBAIC0wLDAgKzEsMTMgQEAKKyNpbmNsdWRlICIuLi9naXQtY29tcGF0LXV0aWwuaCIKKworc2l6ZV90IGdpdHN0cmxjcHkoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3QgcmV0ID0gc3RybGVuKHNyYyk7CisKKwlpZiAoc2l6ZSkgeworCQlzaXplX3QgbGVuID0gKHJldCA+PSBzaXplKSA/IHNpemUgLSAxIDogcmV0OworCQltZW1jcHkoZGVzdCwgc3JjLCBsZW4pOworCQlkZXN0W2xlbl0gPSAnXDAnOworCX0KKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY29tcGF0L3N0cnRvdW1heC5jIGIvY29tcGF0L3N0cnRvdW1heC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NDEzNTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wYXQvc3RydG91bWF4LmMKQEAgLTAsMCArMSwxMCBAQAorI2luY2x1ZGUgIi4uL2dpdC1jb21wYXQtdXRpbC5oIgorCit1aW50bWF4X3QgZ2l0c3RydG91bWF4IChjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSkKK3sKKyNpZiBkZWZpbmVkKE5PX1NUUlRPVUxMKQorCXJldHVybiBzdHJ0b3VsKG5wdHIsIGVuZHB0ciwgYmFzZSk7CisjZWxzZQorCXJldHVybiBzdHJ0b3VsbChucHRyLCBlbmRwdHIsIGJhc2UpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9jb21wYXQvdW5zZXRlbnYuYyBiL2NvbXBhdC91bnNldGVudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMjlmNWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wYXQvdW5zZXRlbnYuYwpAQCAtMCwwICsxLDI1IEBACisjaW5jbHVkZSAiLi4vZ2l0LWNvbXBhdC11dGlsLmgiCisKK3ZvaWQgZ2l0dW5zZXRlbnYgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgIGV4dGVybiBjaGFyICoqZW52aXJvbjsKKyAgICAgaW50IHNyYywgZHN0OworICAgICBzaXplX3Qgbm1sbjsKKworICAgICBubWxuID0gc3RybGVuKG5hbWUpOworCisgICAgIGZvciAoc3JjID0gZHN0ID0gMDsgZW52aXJvbltzcmNdOyArK3NyYykgeworCSAgc2l6ZV90IGVubG47CisJICBlbmxuID0gc3RybGVuKGVudmlyb25bc3JjXSk7CisJICBpZiAoZW5sbiA+IG5tbG4pIHsKKyAgICAgICAgICAgICAgIC8qIG1pZ2h0IG1hdGNoLCBhbmQgY2FuIHRlc3QgZm9yICc9JyBzYWZlbHkgKi8KKwkgICAgICAgaWYgKDAgPT0gc3RybmNtcCAoZW52aXJvbltzcmNdLCBuYW1lLCBubWxuKQorCQkgICAmJiAnPScgPT0gZW52aXJvbltzcmNdW25tbG5dKQorCQkgICAgLyogbWF0Y2hlcywgc28gc2tpcCAqLworCQkgICAgY29udGludWU7CisJICB9CisJICBlbnZpcm9uW2RzdF0gPSBlbnZpcm9uW3NyY107CisJICArK2RzdDsKKyAgICAgfQorICAgICBlbnZpcm9uW2RzdF0gPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvY29uZmlnLmMgYi9jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjI0NDk0Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnLmMKQEAgLTAsMCArMSwxMTMxIEBACisvKgorICogR0lUIC0gVGhlIGluZm9ybWF0aW9uIG1hbmFnZXIgZnJvbSBoZWxsCisgKgorICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorICogQ29weXJpZ2h0IChDKSBKb2hhbm5lcyBTY2hpbmRlbGluLCAyMDA1CisgKgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJleGVjX2NtZC5oIgorCisjZGVmaW5lIE1BWE5BTUUgKDI1NikKKworc3RhdGljIEZJTEUgKmNvbmZpZ19maWxlOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlX25hbWU7CitzdGF0aWMgaW50IGNvbmZpZ19saW5lbnI7CitzdGF0aWMgaW50IGNvbmZpZ19maWxlX2VvZjsKK3N0YXRpYyBpbnQgemxpYl9jb21wcmVzc2lvbl9zZWVuOworCitzdGF0aWMgaW50IGdldF9uZXh0X2NoYXIodm9pZCkKK3sKKwlpbnQgYzsKKwlGSUxFICpmOworCisJYyA9ICdcbic7CisJaWYgKChmID0gY29uZmlnX2ZpbGUpICE9IE5VTEwpIHsKKwkJYyA9IGZnZXRjKGYpOworCQlpZiAoYyA9PSAnXHInKSB7CisJCQkvKiBET1MgbGlrZSBzeXN0ZW1zICovCisJCQljID0gZmdldGMoZik7CisJCQlpZiAoYyAhPSAnXG4nKSB7CisJCQkJdW5nZXRjKGMsIGYpOworCQkJCWMgPSAnXHInOworCQkJfQorCQl9CisJCWlmIChjID09ICdcbicpCisJCQljb25maWdfbGluZW5yKys7CisJCWlmIChjID09IEVPRikgeworCQkJY29uZmlnX2ZpbGVfZW9mID0gMTsKKwkJCWMgPSAnXG4nOworCQl9CisJfQorCXJldHVybiBjOworfQorCitzdGF0aWMgY2hhciAqcGFyc2VfdmFsdWUodm9pZCkKK3sKKwlzdGF0aWMgY2hhciB2YWx1ZVsxMDI0XTsKKwlpbnQgcXVvdGUgPSAwLCBjb21tZW50ID0gMCwgbGVuID0gMCwgc3BhY2UgPSAwOworCisJZm9yICg7OykgeworCQlpbnQgYyA9IGdldF9uZXh0X2NoYXIoKTsKKwkJaWYgKGxlbiA+PSBzaXplb2YodmFsdWUpKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmIChjID09ICdcbicpIHsKKwkJCWlmIChxdW90ZSkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCXZhbHVlW2xlbl0gPSAwOworCQkJcmV0dXJuIHZhbHVlOworCQl9CisJCWlmIChjb21tZW50KQorCQkJY29udGludWU7CisJCWlmIChpc3NwYWNlKGMpICYmICFxdW90ZSkgeworCQkJc3BhY2UgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFxdW90ZSkgeworCQkJaWYgKGMgPT0gJzsnIHx8IGMgPT0gJyMnKSB7CisJCQkJY29tbWVudCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJaWYgKHNwYWNlKSB7CisJCQlpZiAobGVuKQorCQkJCXZhbHVlW2xlbisrXSA9ICcgJzsKKwkJCXNwYWNlID0gMDsKKwkJfQorCQlpZiAoYyA9PSAnXFwnKSB7CisJCQljID0gZ2V0X25leHRfY2hhcigpOworCQkJc3dpdGNoIChjKSB7CisJCQljYXNlICdcbic6CisJCQkJY29udGludWU7CisJCQljYXNlICd0JzoKKwkJCQljID0gJ1x0JzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2InOgorCQkJCWMgPSAnXGInOworCQkJCWJyZWFrOworCQkJY2FzZSAnbic6CisJCQkJYyA9ICdcbic7CisJCQkJYnJlYWs7CisJCQkvKiBTb21lIGNoYXJhY3RlcnMgZXNjYXBlIGFzIHRoZW1zZWx2ZXMgKi8KKwkJCWNhc2UgJ1xcJzogY2FzZSAnIic6CisJCQkJYnJlYWs7CisJCQkvKiBSZWplY3QgdW5rbm93biBlc2NhcGUgc2VxdWVuY2VzICovCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJdmFsdWVbbGVuKytdID0gYzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID09ICciJykgeworCQkJcXVvdGUgPSAxLXF1b3RlOworCQkJY29udGludWU7CisJCX0KKwkJdmFsdWVbbGVuKytdID0gYzsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlza2V5Y2hhcihpbnQgYykKK3sKKwlyZXR1cm4gaXNhbG51bShjKSB8fCBjID09ICctJzsKK30KKworc3RhdGljIGludCBnZXRfdmFsdWUoY29uZmlnX2ZuX3QgZm4sIGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBsZW4pCit7CisJaW50IGM7CisJY2hhciAqdmFsdWU7CisKKwkvKiBHZXQgdGhlIGZ1bGwgbmFtZSAqLworCWZvciAoOzspIHsKKwkJYyA9IGdldF9uZXh0X2NoYXIoKTsKKwkJaWYgKGNvbmZpZ19maWxlX2VvZikKKwkJCWJyZWFrOworCQlpZiAoIWlza2V5Y2hhcihjKSkKKwkJCWJyZWFrOworCQluYW1lW2xlbisrXSA9IHRvbG93ZXIoYyk7CisJCWlmIChsZW4gPj0gTUFYTkFNRSkKKwkJCXJldHVybiAtMTsKKwl9CisJbmFtZVtsZW5dID0gMDsKKwl3aGlsZSAoYyA9PSAnICcgfHwgYyA9PSAnXHQnKQorCQljID0gZ2V0X25leHRfY2hhcigpOworCisJdmFsdWUgPSBOVUxMOworCWlmIChjICE9ICdcbicpIHsKKwkJaWYgKGMgIT0gJz0nKQorCQkJcmV0dXJuIC0xOworCQl2YWx1ZSA9IHBhcnNlX3ZhbHVlKCk7CisJCWlmICghdmFsdWUpCisJCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiBmbihuYW1lLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2V4dGVuZGVkX2Jhc2VfdmFyKGNoYXIgKm5hbWUsIGludCBiYXNlbGVuLCBpbnQgYykKK3sKKwlkbyB7CisJCWlmIChjID09ICdcbicpCisJCQlyZXR1cm4gLTE7CisJCWMgPSBnZXRfbmV4dF9jaGFyKCk7CisJfSB3aGlsZSAoaXNzcGFjZShjKSk7CisKKwkvKiBXZSByZXF1aXJlIHRoZSBmb3JtYXQgdG8gYmUgJ1tiYXNlICJleHRlbnNpb24iXScgKi8KKwlpZiAoYyAhPSAnIicpCisJCXJldHVybiAtMTsKKwluYW1lW2Jhc2VsZW4rK10gPSAnLic7CisKKwlmb3IgKDs7KSB7CisJCWludCBjID0gZ2V0X25leHRfY2hhcigpOworCQlpZiAoYyA9PSAnXG4nKQorCQkJcmV0dXJuIC0xOworCQlpZiAoYyA9PSAnIicpCisJCQlicmVhazsKKwkJaWYgKGMgPT0gJ1xcJykgeworCQkJYyA9IGdldF9uZXh0X2NoYXIoKTsKKwkJCWlmIChjID09ICdcbicpCisJCQkJcmV0dXJuIC0xOworCQl9CisJCW5hbWVbYmFzZWxlbisrXSA9IGM7CisJCWlmIChiYXNlbGVuID4gTUFYTkFNRSAvIDIpCisJCQlyZXR1cm4gLTE7CisJfQorCisJLyogRmluYWwgJ10nICovCisJaWYgKGdldF9uZXh0X2NoYXIoKSAhPSAnXScpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gYmFzZWxlbjsKK30KKworc3RhdGljIGludCBnZXRfYmFzZV92YXIoY2hhciAqbmFtZSkKK3sKKwlpbnQgYmFzZWxlbiA9IDA7CisKKwlmb3IgKDs7KSB7CisJCWludCBjID0gZ2V0X25leHRfY2hhcigpOworCQlpZiAoY29uZmlnX2ZpbGVfZW9mKQorCQkJcmV0dXJuIC0xOworCQlpZiAoYyA9PSAnXScpCisJCQlyZXR1cm4gYmFzZWxlbjsKKwkJaWYgKGlzc3BhY2UoYykpCisJCQlyZXR1cm4gZ2V0X2V4dGVuZGVkX2Jhc2VfdmFyKG5hbWUsIGJhc2VsZW4sIGMpOworCQlpZiAoIWlza2V5Y2hhcihjKSAmJiBjICE9ICcuJykKKwkJCXJldHVybiAtMTsKKwkJaWYgKGJhc2VsZW4gPiBNQVhOQU1FIC8gMikKKwkJCXJldHVybiAtMTsKKwkJbmFtZVtiYXNlbGVuKytdID0gdG9sb3dlcihjKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZ2l0X3BhcnNlX2ZpbGUoY29uZmlnX2ZuX3QgZm4pCit7CisJaW50IGNvbW1lbnQgPSAwOworCWludCBiYXNlbGVuID0gMDsKKwlzdGF0aWMgY2hhciB2YXJbTUFYTkFNRV07CisKKwlmb3IgKDs7KSB7CisJCWludCBjID0gZ2V0X25leHRfY2hhcigpOworCQlpZiAoYyA9PSAnXG4nKSB7CisJCQlpZiAoY29uZmlnX2ZpbGVfZW9mKQorCQkJCXJldHVybiAwOworCQkJY29tbWVudCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29tbWVudCB8fCBpc3NwYWNlKGMpKQorCQkJY29udGludWU7CisJCWlmIChjID09ICcjJyB8fCBjID09ICc7JykgeworCQkJY29tbWVudCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA9PSAnWycpIHsKKwkJCWJhc2VsZW4gPSBnZXRfYmFzZV92YXIodmFyKTsKKwkJCWlmIChiYXNlbGVuIDw9IDApCisJCQkJYnJlYWs7CisJCQl2YXJbYmFzZWxlbisrXSA9ICcuJzsKKwkJCXZhcltiYXNlbGVuXSA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIWlzYWxwaGEoYykpCisJCQlicmVhazsKKwkJdmFyW2Jhc2VsZW5dID0gdG9sb3dlcihjKTsKKwkJaWYgKGdldF92YWx1ZShmbiwgdmFyLCBiYXNlbGVuKzEpIDwgMCkKKwkJCWJyZWFrOworCX0KKwlkaWUoImJhZCBjb25maWcgZmlsZSBsaW5lICVkIGluICVzIiwgY29uZmlnX2xpbmVuciwgY29uZmlnX2ZpbGVfbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfdW5pdF9mYWN0b3IoY29uc3QgY2hhciAqZW5kLCB1bnNpZ25lZCBsb25nICp2YWwpCit7CisJaWYgKCEqZW5kKQorCQlyZXR1cm4gMTsKKwllbHNlIGlmICghc3RyY2FzZWNtcChlbmQsICJrIikpIHsKKwkJKnZhbCAqPSAxMDI0OworCQlyZXR1cm4gMTsKKwl9CisJZWxzZSBpZiAoIXN0cmNhc2VjbXAoZW5kLCAibSIpKSB7CisJCSp2YWwgKj0gMTAyNCAqIDEwMjQ7CisJCXJldHVybiAxOworCX0KKwllbHNlIGlmICghc3RyY2FzZWNtcChlbmQsICJnIikpIHsKKwkJKnZhbCAqPSAxMDI0ICogMTAyNCAqIDEwMjQ7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGdpdF9wYXJzZV9sb25nKGNvbnN0IGNoYXIgKnZhbHVlLCBsb25nICpyZXQpCit7CisJaWYgKHZhbHVlICYmICp2YWx1ZSkgeworCQljaGFyICplbmQ7CisJCWxvbmcgdmFsID0gc3RydG9sKHZhbHVlLCAmZW5kLCAwKTsKKwkJdW5zaWduZWQgbG9uZyBmYWN0b3IgPSAxOworCQlpZiAoIXBhcnNlX3VuaXRfZmFjdG9yKGVuZCwgJmZhY3RvcikpCisJCQlyZXR1cm4gMDsKKwkJKnJldCA9IHZhbCAqIGZhY3RvcjsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitpbnQgZ2l0X3BhcnNlX3Vsb25nKGNvbnN0IGNoYXIgKnZhbHVlLCB1bnNpZ25lZCBsb25nICpyZXQpCit7CisJaWYgKHZhbHVlICYmICp2YWx1ZSkgeworCQljaGFyICplbmQ7CisJCXVuc2lnbmVkIGxvbmcgdmFsID0gc3RydG91bCh2YWx1ZSwgJmVuZCwgMCk7CisJCWlmICghcGFyc2VfdW5pdF9mYWN0b3IoZW5kLCAmdmFsKSkKKwkJCXJldHVybiAwOworCQkqcmV0ID0gdmFsOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRpZV9iYWRfY29uZmlnKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaWYgKGNvbmZpZ19maWxlX25hbWUpCisJCWRpZSgiYmFkIGNvbmZpZyB2YWx1ZSBmb3IgJyVzJyBpbiAlcyIsIG5hbWUsIGNvbmZpZ19maWxlX25hbWUpOworCWRpZSgiYmFkIGNvbmZpZyB2YWx1ZSBmb3IgJyVzJyIsIG5hbWUpOworfQorCitpbnQgZ2l0X2NvbmZpZ19pbnQoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJbG9uZyByZXQ7CisJaWYgKCFnaXRfcGFyc2VfbG9uZyh2YWx1ZSwgJnJldCkpCisJCWRpZV9iYWRfY29uZmlnKG5hbWUpOworCXJldHVybiByZXQ7Cit9CisKK3Vuc2lnbmVkIGxvbmcgZ2l0X2NvbmZpZ191bG9uZyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJldDsKKwlpZiAoIWdpdF9wYXJzZV91bG9uZyh2YWx1ZSwgJnJldCkpCisJCWRpZV9iYWRfY29uZmlnKG5hbWUpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBnaXRfY29uZmlnX2Jvb2woY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCF2YWx1ZSkKKwkJcmV0dXJuIDE7CisJaWYgKCEqdmFsdWUpCisJCXJldHVybiAwOworCWlmICghc3RyY2FzZWNtcCh2YWx1ZSwgInRydWUiKSB8fCAhc3RyY2FzZWNtcCh2YWx1ZSwgInllcyIpKQorCQlyZXR1cm4gMTsKKwlpZiAoIXN0cmNhc2VjbXAodmFsdWUsICJmYWxzZSIpIHx8ICFzdHJjYXNlY21wKHZhbHVlLCAibm8iKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGdpdF9jb25maWdfaW50KG5hbWUsIHZhbHVlKSAhPSAwOworfQorCitpbnQgZ2l0X2NvbmZpZ19zdHJpbmcoY29uc3QgY2hhciAqKmRlc3QsIGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCF2YWx1ZSkKKwkJcmV0dXJuIGNvbmZpZ19lcnJvcl9ub25ib29sKHZhcik7CisJKmRlc3QgPSB4c3RyZHVwKHZhbHVlKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGdpdF9kZWZhdWx0X2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCS8qIFRoaXMgbmVlZHMgYSBiZXR0ZXIgbmFtZSAqLworCWlmICghc3RyY21wKHZhciwgImNvcmUuZmlsZW1vZGUiKSkgeworCQl0cnVzdF9leGVjdXRhYmxlX2JpdCA9IGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAodmFyLCAiY29yZS5xdW90ZXBhdGgiKSkgeworCQlxdW90ZV9wYXRoX2Z1bGx5ID0gZ2l0X2NvbmZpZ19ib29sKHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcCh2YXIsICJjb3JlLnN5bWxpbmtzIikpIHsKKwkJaGFzX3N5bWxpbmtzID0gZ2l0X2NvbmZpZ19ib29sKHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcCh2YXIsICJjb3JlLmJhcmUiKSkgeworCQlpc19iYXJlX3JlcG9zaXRvcnlfY2ZnID0gZ2l0X2NvbmZpZ19ib29sKHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcCh2YXIsICJjb3JlLmlnbm9yZXN0YXQiKSkgeworCQlhc3N1bWVfdW5jaGFuZ2VkID0gZ2l0X2NvbmZpZ19ib29sKHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcCh2YXIsICJjb3JlLnByZWZlcnN5bWxpbmtyZWZzIikpIHsKKwkJcHJlZmVyX3N5bWxpbmtfcmVmcyA9IGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAodmFyLCAiY29yZS5sb2dhbGxyZWZ1cGRhdGVzIikpIHsKKwkJbG9nX2FsbF9yZWZfdXBkYXRlcyA9IGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAodmFyLCAiY29yZS53YXJuYW1iaWd1b3VzcmVmcyIpKSB7CisJCXdhcm5fYW1iaWd1b3VzX3JlZnMgPSBnaXRfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghc3RyY21wKHZhciwgImNvcmUubG9vc2Vjb21wcmVzc2lvbiIpKSB7CisJCWludCBsZXZlbCA9IGdpdF9jb25maWdfaW50KHZhciwgdmFsdWUpOworCQlpZiAobGV2ZWwgPT0gLTEpCisJCQlsZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTjsKKwkJZWxzZSBpZiAobGV2ZWwgPCAwIHx8IGxldmVsID4gWl9CRVNUX0NPTVBSRVNTSU9OKQorCQkJZGllKCJiYWQgemxpYiBjb21wcmVzc2lvbiBsZXZlbCAlZCIsIGxldmVsKTsKKwkJemxpYl9jb21wcmVzc2lvbl9sZXZlbCA9IGxldmVsOworCQl6bGliX2NvbXByZXNzaW9uX3NlZW4gPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcCh2YXIsICJjb3JlLmNvbXByZXNzaW9uIikpIHsKKwkJaW50IGxldmVsID0gZ2l0X2NvbmZpZ19pbnQodmFyLCB2YWx1ZSk7CisJCWlmIChsZXZlbCA9PSAtMSkKKwkJCWxldmVsID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OOworCQllbHNlIGlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPiBaX0JFU1RfQ09NUFJFU1NJT04pCisJCQlkaWUoImJhZCB6bGliIGNvbXByZXNzaW9uIGxldmVsICVkIiwgbGV2ZWwpOworCQljb3JlX2NvbXByZXNzaW9uX2xldmVsID0gbGV2ZWw7CisJCWNvcmVfY29tcHJlc3Npb25fc2VlbiA9IDE7CisJCWlmICghemxpYl9jb21wcmVzc2lvbl9zZWVuKQorCQkJemxpYl9jb21wcmVzc2lvbl9sZXZlbCA9IGxldmVsOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcCh2YXIsICJjb3JlLnBhY2tlZGdpdHdpbmRvd3NpemUiKSkgeworCQlpbnQgcGdzel94MiA9IGdldHBhZ2VzaXplKCkgKiAyOworCQlwYWNrZWRfZ2l0X3dpbmRvd19zaXplID0gZ2l0X2NvbmZpZ19pbnQodmFyLCB2YWx1ZSk7CisKKwkJLyogVGhpcyB2YWx1ZSBtdXN0IGJlIG11bHRpcGxlIG9mIChwYWdlc2l6ZSAqIDIpICovCisJCXBhY2tlZF9naXRfd2luZG93X3NpemUgLz0gcGdzel94MjsKKwkJaWYgKHBhY2tlZF9naXRfd2luZG93X3NpemUgPCAxKQorCQkJcGFja2VkX2dpdF93aW5kb3dfc2l6ZSA9IDE7CisJCXBhY2tlZF9naXRfd2luZG93X3NpemUgKj0gcGdzel94MjsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAodmFyLCAiY29yZS5wYWNrZWRnaXRsaW1pdCIpKSB7CisJCXBhY2tlZF9naXRfbGltaXQgPSBnaXRfY29uZmlnX2ludCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAodmFyLCAiY29yZS5kZWx0YWJhc2VjYWNoZWxpbWl0IikpIHsKKwkJZGVsdGFfYmFzZV9jYWNoZV9saW1pdCA9IGdpdF9jb25maWdfaW50KHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcCh2YXIsICJjb3JlLmF1dG9jcmxmIikpIHsKKwkJaWYgKHZhbHVlICYmICFzdHJjYXNlY21wKHZhbHVlLCAiaW5wdXQiKSkgeworCQkJYXV0b19jcmxmID0gLTE7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlhdXRvX2NybGYgPSBnaXRfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghc3RyY21wKHZhciwgImNvcmUuc2FmZWNybGYiKSkgeworCQlpZiAodmFsdWUgJiYgIXN0cmNhc2VjbXAodmFsdWUsICJ3YXJuIikpIHsKKwkJCXNhZmVfY3JsZiA9IFNBRkVfQ1JMRl9XQVJOOworCQkJcmV0dXJuIDA7CisJCX0KKwkJc2FmZV9jcmxmID0gZ2l0X2NvbmZpZ19ib29sKHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcCh2YXIsICJ1c2VyLm5hbWUiKSkgeworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIGNvbmZpZ19lcnJvcl9ub25ib29sKHZhcik7CisJCXN0cmxjcHkoZ2l0X2RlZmF1bHRfbmFtZSwgdmFsdWUsIHNpemVvZihnaXRfZGVmYXVsdF9uYW1lKSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghc3RyY21wKHZhciwgInVzZXIuZW1haWwiKSkgeworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIGNvbmZpZ19lcnJvcl9ub25ib29sKHZhcik7CisJCXN0cmxjcHkoZ2l0X2RlZmF1bHRfZW1haWwsIHZhbHVlLCBzaXplb2YoZ2l0X2RlZmF1bHRfZW1haWwpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAodmFyLCAiaTE4bi5jb21taXRlbmNvZGluZyIpKQorCQlyZXR1cm4gZ2l0X2NvbmZpZ19zdHJpbmcoJmdpdF9jb21taXRfZW5jb2RpbmcsIHZhciwgdmFsdWUpOworCisJaWYgKCFzdHJjbXAodmFyLCAiaTE4bi5sb2dvdXRwdXRlbmNvZGluZyIpKQorCQlyZXR1cm4gZ2l0X2NvbmZpZ19zdHJpbmcoJmdpdF9sb2dfb3V0cHV0X2VuY29kaW5nLCB2YXIsIHZhbHVlKTsKKworCWlmICghc3RyY21wKHZhciwgInBhZ2VyLmNvbG9yIikgfHwgIXN0cmNtcCh2YXIsICJjb2xvci5wYWdlciIpKSB7CisJCXBhZ2VyX3VzZV9jb2xvciA9IGdpdF9jb25maWdfYm9vbCh2YXIsdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcCh2YXIsICJjb3JlLnBhZ2VyIikpCisJCXJldHVybiBnaXRfY29uZmlnX3N0cmluZygmcGFnZXJfcHJvZ3JhbSwgdmFyLCB2YWx1ZSk7CisKKwlpZiAoIXN0cmNtcCh2YXIsICJjb3JlLmVkaXRvciIpKQorCQlyZXR1cm4gZ2l0X2NvbmZpZ19zdHJpbmcoJmVkaXRvcl9wcm9ncmFtLCB2YXIsIHZhbHVlKTsKKworCWlmICghc3RyY21wKHZhciwgImNvcmUuZXhjbHVkZXNmaWxlIikpCisJCXJldHVybiBnaXRfY29uZmlnX3N0cmluZygmZXhjbHVkZXNfZmlsZSwgdmFyLCB2YWx1ZSk7CisKKwlpZiAoIXN0cmNtcCh2YXIsICJjb3JlLndoaXRlc3BhY2UiKSkgeworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIGNvbmZpZ19lcnJvcl9ub25ib29sKHZhcik7CisJCXdoaXRlc3BhY2VfcnVsZV9jZmcgPSBwYXJzZV93aGl0ZXNwYWNlX3J1bGUodmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAodmFyLCAiYnJhbmNoLmF1dG9zZXR1cG1lcmdlIikpIHsKKwkJaWYgKHZhbHVlICYmICFzdHJjYXNlY21wKHZhbHVlLCAiYWx3YXlzIikpIHsKKwkJCWdpdF9icmFuY2hfdHJhY2sgPSBCUkFOQ0hfVFJBQ0tfQUxXQVlTOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZ2l0X2JyYW5jaF90cmFjayA9IGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQWRkIG90aGVyIGNvbmZpZyB2YXJpYWJsZXMgaGVyZSBhbmQgdG8gRG9jdW1lbnRhdGlvbi9jb25maWcudHh0LiAqLworCXJldHVybiAwOworfQorCitpbnQgZ2l0X2NvbmZpZ19mcm9tX2ZpbGUoY29uZmlnX2ZuX3QgZm4sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWludCByZXQ7CisJRklMRSAqZiA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworCisJcmV0ID0gLTE7CisJaWYgKGYpIHsKKwkJY29uZmlnX2ZpbGUgPSBmOworCQljb25maWdfZmlsZV9uYW1lID0gZmlsZW5hbWU7CisJCWNvbmZpZ19saW5lbnIgPSAxOworCQljb25maWdfZmlsZV9lb2YgPSAwOworCQlyZXQgPSBnaXRfcGFyc2VfZmlsZShmbik7CisJCWZjbG9zZShmKTsKKwkJY29uZmlnX2ZpbGVfbmFtZSA9IE5VTEw7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2NvbnN0IGNoYXIgKmdpdF9ldGNfZ2l0Y29uZmlnKHZvaWQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKnN5c3RlbV93aWRlOworCWlmICghc3lzdGVtX3dpZGUpIHsKKwkJc3lzdGVtX3dpZGUgPSBFVENfR0lUQ09ORklHOworCQlpZiAoIWlzX2Fic29sdXRlX3BhdGgoc3lzdGVtX3dpZGUpKSB7CisJCQkvKiBpbnRlcnByZXQgcGF0aCByZWxhdGl2ZSB0byBleGVjLWRpciAqLworCQkJc3RydWN0IHN0cmJ1ZiBkID0gU1RSQlVGX0lOSVQ7CisJCQlzdHJidWZfYWRkZigmZCwgIiVzLyVzIiwgZ2l0X2V4ZWNfcGF0aCgpLCBzeXN0ZW1fd2lkZSk7CisJCQlzeXN0ZW1fd2lkZSA9IHN0cmJ1Zl9kZXRhY2goJmQsIE5VTEwpOworCQl9CisJfQorCXJldHVybiBzeXN0ZW1fd2lkZTsKK30KKworaW50IGdpdF9lbnZfYm9vbChjb25zdCBjaGFyICprLCBpbnQgZGVmKQoreworCWNvbnN0IGNoYXIgKnYgPSBnZXRlbnYoayk7CisJcmV0dXJuIHYgPyBnaXRfY29uZmlnX2Jvb2woaywgdikgOiBkZWY7Cit9CisKK2ludCBnaXRfY29uZmlnX3N5c3RlbSh2b2lkKQoreworCXJldHVybiAhZ2l0X2Vudl9ib29sKCJHSVRfQ09ORklHX05PU1lTVEVNIiwgMCk7Cit9CisKK2ludCBnaXRfY29uZmlnX2dsb2JhbCh2b2lkKQoreworCXJldHVybiAhZ2l0X2Vudl9ib29sKCJHSVRfQ09ORklHX05PR0xPQkFMIiwgMCk7Cit9CisKK2ludCBnaXRfY29uZmlnKGNvbmZpZ19mbl90IGZuKQoreworCWludCByZXQgPSAwOworCWNoYXIgKnJlcG9fY29uZmlnID0gTlVMTDsKKwljb25zdCBjaGFyICpob21lID0gTlVMTCwgKmZpbGVuYW1lOworCisJLyogJEdJVF9DT05GSUcgbWFrZXMgZ2l0IHJlYWQgX29ubHlfIHRoZSBnaXZlbiBjb25maWcgZmlsZSwKKwkgKiAkR0lUX0NPTkZJR19MT0NBTCB3aWxsIG1ha2UgaXQgcHJvY2VzcyBpdCBpbiBhZGRpdGlvbiB0byB0aGUKKwkgKiBnbG9iYWwgY29uZmlnIGZpbGUsIHRoZSBzYW1lIHdheSBpdCB3b3VsZCB0aGUgcGVyLXJlcG9zaXRvcnkKKwkgKiBjb25maWcgZmlsZSBvdGhlcndpc2UuICovCisJZmlsZW5hbWUgPSBnZXRlbnYoQ09ORklHX0VOVklST05NRU5UKTsKKwlpZiAoIWZpbGVuYW1lKSB7CisJCWlmIChnaXRfY29uZmlnX3N5c3RlbSgpICYmICFhY2Nlc3MoZ2l0X2V0Y19naXRjb25maWcoKSwgUl9PSykpCisJCQlyZXQgKz0gZ2l0X2NvbmZpZ19mcm9tX2ZpbGUoZm4sIGdpdF9ldGNfZ2l0Y29uZmlnKCkpOworCQlob21lID0gZ2V0ZW52KCJIT01FIik7CisJCWZpbGVuYW1lID0gZ2V0ZW52KENPTkZJR19MT0NBTF9FTlZJUk9OTUVOVCk7CisJCWlmICghZmlsZW5hbWUpCisJCQlmaWxlbmFtZSA9IHJlcG9fY29uZmlnID0geHN0cmR1cChnaXRfcGF0aCgiY29uZmlnIikpOworCX0KKworCWlmIChnaXRfY29uZmlnX2dsb2JhbCgpICYmIGhvbWUpIHsKKwkJY2hhciAqdXNlcl9jb25maWcgPSB4c3RyZHVwKG1rcGF0aCgiJXMvLmdpdGNvbmZpZyIsIGhvbWUpKTsKKwkJaWYgKCFhY2Nlc3ModXNlcl9jb25maWcsIFJfT0spKQorCQkJcmV0ID0gZ2l0X2NvbmZpZ19mcm9tX2ZpbGUoZm4sIHVzZXJfY29uZmlnKTsKKwkJZnJlZSh1c2VyX2NvbmZpZyk7CisJfQorCisJcmV0ICs9IGdpdF9jb25maWdfZnJvbV9maWxlKGZuLCBmaWxlbmFtZSk7CisJZnJlZShyZXBvX2NvbmZpZyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZpbmQgYWxsIHRoZSBzdHVmZiBmb3IgZ2l0X2NvbmZpZ19zZXQoKSBiZWxvdy4KKyAqLworCisjZGVmaW5lIE1BWF9NQVRDSEVTIDUxMgorCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgYmFzZWxlbjsKKwljaGFyKiBrZXk7CisJaW50IGRvX25vdF9tYXRjaDsKKwlyZWdleF90KiB2YWx1ZV9yZWdleDsKKwlpbnQgbXVsdGlfcmVwbGFjZTsKKwlzaXplX3Qgb2Zmc2V0W01BWF9NQVRDSEVTXTsKKwllbnVtIHsgU1RBUlQsIFNFQ1RJT05fU0VFTiwgU0VDVElPTl9FTkRfU0VFTiwgS0VZX1NFRU4gfSBzdGF0ZTsKKwlpbnQgc2VlbjsKK30gc3RvcmU7CisKK3N0YXRpYyBpbnQgbWF0Y2hlcyhjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlKQoreworCXJldHVybiAhc3RyY21wKGtleSwgc3RvcmUua2V5KSAmJgorCQkoc3RvcmUudmFsdWVfcmVnZXggPT0gTlVMTCB8fAorCQkgKHN0b3JlLmRvX25vdF9tYXRjaCBeCisJCSAgIXJlZ2V4ZWMoc3RvcmUudmFsdWVfcmVnZXgsIHZhbHVlLCAwLCBOVUxMLCAwKSkpOworfQorCitzdGF0aWMgaW50IHN0b3JlX2F1eChjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlKQoreworCWNvbnN0IGNoYXIgKmVwOworCXNpemVfdCBzZWN0aW9uX2xlbjsKKworCXN3aXRjaCAoc3RvcmUuc3RhdGUpIHsKKwljYXNlIEtFWV9TRUVOOgorCQlpZiAobWF0Y2hlcyhrZXksIHZhbHVlKSkgeworCQkJaWYgKHN0b3JlLnNlZW4gPT0gMSAmJiBzdG9yZS5tdWx0aV9yZXBsYWNlID09IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJIldhcm5pbmc6ICVzIGhhcyBtdWx0aXBsZSB2YWx1ZXNcbiIsCisJCQkJCWtleSk7CisJCQl9IGVsc2UgaWYgKHN0b3JlLnNlZW4gPj0gTUFYX01BVENIRVMpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlRvbyBtYW55IG1hdGNoZXNcbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCisJCQlzdG9yZS5vZmZzZXRbc3RvcmUuc2Vlbl0gPSBmdGVsbChjb25maWdfZmlsZSk7CisJCQlzdG9yZS5zZWVuKys7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTRUNUSU9OX1NFRU46CisJCS8qCisJCSAqIFdoYXQgd2UgYXJlIGxvb2tpbmcgZm9yIGlzIGluIHN0b3JlLmtleSAoYm90aAorCQkgKiBzZWN0aW9uIGFuZCB2YXIpLCBhbmQgaXRzIHNlY3Rpb24gcGFydCBpcyBiYXNlbGVuCisJCSAqIGxvbmcuICBXZSBmb3VuZCBrZXkgKGFnYWluLCBib3RoIHNlY3Rpb24gYW5kIHZhcikuCisJCSAqIFdlIHdvdWxkIHdhbnQgdG8ga25vdyBpZiB0aGlzIGtleSBpcyBpbiB0aGUgc2FtZQorCQkgKiBzZWN0aW9uIGFzIHdoYXQgd2UgYXJlIGxvb2tpbmcgZm9yLiAgV2UgYWxyZWFkeQorCQkgKiBrbm93IHdlIGFyZSBpbiB0aGUgc2FtZSBzZWN0aW9uIGFzIHdoYXQgc2hvdWxkCisJCSAqIGhvbGQgc3RvcmUua2V5LgorCQkgKi8KKwkJZXAgPSBzdHJyY2hyKGtleSwgJy4nKTsKKwkJc2VjdGlvbl9sZW4gPSBlcCAtIGtleTsKKworCQlpZiAoKHNlY3Rpb25fbGVuICE9IHN0b3JlLmJhc2VsZW4pIHx8CisJCSAgICBtZW1jbXAoa2V5LCBzdG9yZS5rZXksIHNlY3Rpb25fbGVuKzEpKSB7CisJCQlzdG9yZS5zdGF0ZSA9IFNFQ1RJT05fRU5EX1NFRU47CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIERvIG5vdCBpbmNyZW1lbnQgbWF0Y2hlczogdGhpcyBpcyBubyBtYXRjaCwgYnV0IHdlCisJCSAqIGp1c3QgbWFkZSBzdXJlIHdlIGFyZSBpbiB0aGUgZGVzaXJlZCBzZWN0aW9uLgorCQkgKi8KKwkJc3RvcmUub2Zmc2V0W3N0b3JlLnNlZW5dID0gZnRlbGwoY29uZmlnX2ZpbGUpOworCQkvKiBmYWxsdGhydSAqLworCWNhc2UgU0VDVElPTl9FTkRfU0VFTjoKKwljYXNlIFNUQVJUOgorCQlpZiAobWF0Y2hlcyhrZXksIHZhbHVlKSkgeworCQkJc3RvcmUub2Zmc2V0W3N0b3JlLnNlZW5dID0gZnRlbGwoY29uZmlnX2ZpbGUpOworCQkJc3RvcmUuc3RhdGUgPSBLRVlfU0VFTjsKKwkJCXN0b3JlLnNlZW4rKzsKKwkJfSBlbHNlIHsKKwkJCWlmIChzdHJyY2hyKGtleSwgJy4nKSAtIGtleSA9PSBzdG9yZS5iYXNlbGVuICYmCisJCQkgICAgICAhc3RybmNtcChrZXksIHN0b3JlLmtleSwgc3RvcmUuYmFzZWxlbikpIHsKKwkJCQkJc3RvcmUuc3RhdGUgPSBTRUNUSU9OX1NFRU47CisJCQkJCXN0b3JlLm9mZnNldFtzdG9yZS5zZWVuXSA9IGZ0ZWxsKGNvbmZpZ19maWxlKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3cml0ZV9lcnJvcih2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHdyaXRlIG5ldyBjb25maWd1cmF0aW9uIGZpbGVcbiIpOworCisJLyogU2FtZSBlcnJvciBjb2RlIGFzICJmYWlsZWQgdG8gcmVuYW1lIi4gKi8KKwlyZXR1cm4gNDsKK30KKworc3RhdGljIGludCBzdG9yZV93cml0ZV9zZWN0aW9uKGludCBmZCwgY29uc3QgY2hhcioga2V5KQoreworCWNvbnN0IGNoYXIgKmRvdDsKKwlpbnQgaSwgc3VjY2VzczsKKwlzdHJ1Y3Qgc3RyYnVmIHNiOworCisJc3RyYnVmX2luaXQoJnNiLCAwKTsKKwlkb3QgPSBtZW1jaHIoa2V5LCAnLicsIHN0b3JlLmJhc2VsZW4pOworCWlmIChkb3QpIHsKKwkJc3RyYnVmX2FkZGYoJnNiLCAiWyUuKnMgXCIiLCAoaW50KShkb3QgLSBrZXkpLCBrZXkpOworCQlmb3IgKGkgPSBkb3QgLSBrZXkgKyAxOyBpIDwgc3RvcmUuYmFzZWxlbjsgaSsrKSB7CisJCQlpZiAoa2V5W2ldID09ICciJykKKwkJCQlzdHJidWZfYWRkY2goJnNiLCAnXFwnKTsKKwkJCXN0cmJ1Zl9hZGRjaCgmc2IsIGtleVtpXSk7CisJCX0KKwkJc3RyYnVmX2FkZHN0cigmc2IsICJcIl1cbiIpOworCX0gZWxzZSB7CisJCXN0cmJ1Zl9hZGRmKCZzYiwgIlslLipzXVxuIiwgc3RvcmUuYmFzZWxlbiwga2V5KTsKKwl9CisKKwlzdWNjZXNzID0gd3JpdGVfaW5fZnVsbChmZCwgc2IuYnVmLCBzYi5sZW4pID09IHNiLmxlbjsKKwlzdHJidWZfcmVsZWFzZSgmc2IpOworCisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK3N0YXRpYyBpbnQgc3RvcmVfd3JpdGVfcGFpcihpbnQgZmQsIGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpCit7CisJaW50IGksIHN1Y2Nlc3M7CisJaW50IGxlbmd0aCA9IHN0cmxlbihrZXkgKyBzdG9yZS5iYXNlbGVuICsgMSk7CisJY29uc3QgY2hhciAqcXVvdGUgPSAiIjsKKwlzdHJ1Y3Qgc3RyYnVmIHNiOworCisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgdGhlIHZhbHVlIG5lZWRzIHRvIGJlIHN1cnJvdW5kZWQgd2l0aCBhIGRxIHBhaXIuCisJICogTm90ZSB0aGF0IHByb2JsZW1hdGljIGNoYXJhY3RlcnMgYXJlIGFsd2F5cyBiYWNrc2xhc2gtcXVvdGVkOyB0aGlzCisJICogY2hlY2sgaXMgYWJvdXQgbm90IGxvc2luZyBsZWFkaW5nIG9yIHRyYWlsaW5nIFNQIGFuZCBzdHJpbmdzIHRoYXQKKwkgKiBmb2xsb3cgYmVnaW5uaW5nLW9mLWNvbW1lbnQgY2hhcmFjdGVycyAoaS5lLiAnOycgYW5kICcjJykgYnkgdGhlCisJICogY29uZmlndXJhdGlvbiBwYXJzZXIuCisJICovCisJaWYgKHZhbHVlWzBdID09ICcgJykKKwkJcXVvdGUgPSAiXCIiOworCWZvciAoaSA9IDA7IHZhbHVlW2ldOyBpKyspCisJCWlmICh2YWx1ZVtpXSA9PSAnOycgfHwgdmFsdWVbaV0gPT0gJyMnKQorCQkJcXVvdGUgPSAiXCIiOworCWlmIChpICYmIHZhbHVlW2kgLSAxXSA9PSAnICcpCisJCXF1b3RlID0gIlwiIjsKKworCXN0cmJ1Zl9pbml0KCZzYiwgMCk7CisJc3RyYnVmX2FkZGYoJnNiLCAiXHQlLipzID0gJXMiLAorCQkgICAgbGVuZ3RoLCBrZXkgKyBzdG9yZS5iYXNlbGVuICsgMSwgcXVvdGUpOworCisJZm9yIChpID0gMDsgdmFsdWVbaV07IGkrKykKKwkJc3dpdGNoICh2YWx1ZVtpXSkgeworCQljYXNlICdcbic6CisJCQlzdHJidWZfYWRkc3RyKCZzYiwgIlxcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgJ1x0JzoKKwkJCXN0cmJ1Zl9hZGRzdHIoJnNiLCAiXFx0Iik7CisJCQlicmVhazsKKwkJY2FzZSAnIic6CisJCWNhc2UgJ1xcJzoKKwkJCXN0cmJ1Zl9hZGRjaCgmc2IsICdcXCcpOworCQlkZWZhdWx0OgorCQkJc3RyYnVmX2FkZGNoKCZzYiwgdmFsdWVbaV0pOworCQkJYnJlYWs7CisJCX0KKwlzdHJidWZfYWRkZigmc2IsICIlc1xuIiwgcXVvdGUpOworCisJc3VjY2VzcyA9IHdyaXRlX2luX2Z1bGwoZmQsIHNiLmJ1Ziwgc2IubGVuKSA9PSBzYi5sZW47CisJc3RyYnVmX3JlbGVhc2UoJnNiKTsKKworCXJldHVybiBzdWNjZXNzOworfQorCitzdGF0aWMgc3NpemVfdCBmaW5kX2JlZ2lubmluZ19vZl9saW5lKGNvbnN0IGNoYXIqIGNvbnRlbnRzLCBzaXplX3Qgc2l6ZSwKKwlzaXplX3Qgb2Zmc2V0XywgaW50KiBmb3VuZF9icmFja2V0KQoreworCXNpemVfdCBlcXVhbF9vZmZzZXQgPSBzaXplLCBicmFja2V0X29mZnNldCA9IHNpemU7CisJc3NpemVfdCBvZmZzZXQ7CisKK2NvbnRsaW5lOgorCWZvciAob2Zmc2V0ID0gb2Zmc2V0Xy0yOyBvZmZzZXQgPiAwCisJCQkmJiBjb250ZW50c1tvZmZzZXRdICE9ICdcbic7IG9mZnNldC0tKQorCQlzd2l0Y2ggKGNvbnRlbnRzW29mZnNldF0pIHsKKwkJCWNhc2UgJz0nOiBlcXVhbF9vZmZzZXQgPSBvZmZzZXQ7IGJyZWFrOworCQkJY2FzZSAnXSc6IGJyYWNrZXRfb2Zmc2V0ID0gb2Zmc2V0OyBicmVhazsKKwkJfQorCWlmIChvZmZzZXQgPiAwICYmIGNvbnRlbnRzW29mZnNldC0xXSA9PSAnXFwnKSB7CisJCW9mZnNldF8gPSBvZmZzZXQ7CisJCWdvdG8gY29udGxpbmU7CisJfQorCWlmIChicmFja2V0X29mZnNldCA8IGVxdWFsX29mZnNldCkgeworCQkqZm91bmRfYnJhY2tldCA9IDE7CisJCW9mZnNldCA9IGJyYWNrZXRfb2Zmc2V0KzE7CisJfSBlbHNlCisJCW9mZnNldCsrOworCisJcmV0dXJuIG9mZnNldDsKK30KKworaW50IGdpdF9jb25maWdfc2V0KGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpCit7CisJcmV0dXJuIGdpdF9jb25maWdfc2V0X211bHRpdmFyKGtleSwgdmFsdWUsIE5VTEwsIDApOworfQorCisvKgorICogSWYgdmFsdWU9PU5VTEwsIHVuc2V0IGluIChyZW1vdmUgZnJvbSkgY29uZmlnLAorICogaWYgdmFsdWVfcmVnZXghPU5VTEwsIGRpc3JlZ2FyZCBrZXkvdmFsdWUgcGFpcnMgd2hlcmUgdmFsdWUgZG9lcyBub3QgbWF0Y2guCisgKiBpZiBtdWx0aV9yZXBsYWNlPT0wLCBub3RoaW5nLCBvciBvbmx5IG9uZSBtYXRjaGluZyBrZXkvdmFsdWUgaXMgcmVwbGFjZWQsCisgKiAgICAgZWxzZSBhbGwgbWF0Y2hpbmcga2V5L3ZhbHVlcyAocmVnYXJkbGVzcyBob3cgbWFueSkgYXJlIHJlbW92ZWQsCisgKiAgICAgYmVmb3JlIHRoZSBuZXcgcGFpciBpcyB3cml0dGVuLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGlzOgorICoKKyAqIC0gaXQgbG9ja3MgdGhlIGNvbmZpZyBmaWxlIGJ5IGNyZWF0aW5nICIuZ2l0L2NvbmZpZy5sb2NrIgorICoKKyAqIC0gaXQgdGhlbiBwYXJzZXMgdGhlIGNvbmZpZyB1c2luZyBzdG9yZV9hdXgoKSBhcyB2YWxpZGF0b3IgdG8gZmluZAorICogICB0aGUgcG9zaXRpb24gb24gdGhlIGtleS92YWx1ZSBwYWlyIHRvIHJlcGxhY2UuIElmIGl0IGlzIHRvIGJlIHVuc2V0LAorICogICBpdCBtdXN0IGJlIGZvdW5kIGV4YWN0bHkgb25jZS4KKyAqCisgKiAtIHRoZSBjb25maWcgZmlsZSBpcyBtbWFwKCllZCBhbmQgdGhlIHBhcnQgYmVmb3JlIHRoZSBtYXRjaCAoaWYgYW55KSBpcworICogICB3cml0dGVuIHRvIHRoZSBsb2NrIGZpbGUsIHRoZW4gdGhlIGNoYW5nZWQgcGFydCBhbmQgdGhlIHJlc3QuCisgKgorICogLSB0aGUgY29uZmlnIGZpbGUgaXMgcmVtb3ZlZCBhbmQgdGhlIGxvY2sgZmlsZSByZW5hbWUoKWQgdG8gaXQuCisgKgorICovCitpbnQgZ2l0X2NvbmZpZ19zZXRfbXVsdGl2YXIoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSwKKwljb25zdCBjaGFyKiB2YWx1ZV9yZWdleCwgaW50IG11bHRpX3JlcGxhY2UpCit7CisJaW50IGksIGRvdDsKKwlpbnQgZmQgPSAtMSwgaW5fZmQ7CisJaW50IHJldDsKKwljaGFyKiBjb25maWdfZmlsZW5hbWU7CisJc3RydWN0IGxvY2tfZmlsZSAqbG9jayA9IE5VTEw7CisJY29uc3QgY2hhciogbGFzdF9kb3QgPSBzdHJyY2hyKGtleSwgJy4nKTsKKworCWNvbmZpZ19maWxlbmFtZSA9IGdldGVudihDT05GSUdfRU5WSVJPTk1FTlQpOworCWlmICghY29uZmlnX2ZpbGVuYW1lKSB7CisJCWNvbmZpZ19maWxlbmFtZSA9IGdldGVudihDT05GSUdfTE9DQUxfRU5WSVJPTk1FTlQpOworCQlpZiAoIWNvbmZpZ19maWxlbmFtZSkKKwkJCWNvbmZpZ19maWxlbmFtZSAgPSBnaXRfcGF0aCgiY29uZmlnIik7CisJfQorCWNvbmZpZ19maWxlbmFtZSA9IHhzdHJkdXAoY29uZmlnX2ZpbGVuYW1lKTsKKworCS8qCisJICogU2luY2UgImtleSIgYWN0dWFsbHkgY29udGFpbnMgdGhlIHNlY3Rpb24gbmFtZSBhbmQgdGhlIHJlYWwKKwkgKiBrZXkgbmFtZSBzZXBhcmF0ZWQgYnkgYSBkb3QsIHdlIGhhdmUgdG8ga25vdyB3aGVyZSB0aGUgZG90IGlzLgorCSAqLworCisJaWYgKGxhc3RfZG90ID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJrZXkgZG9lcyBub3QgY29udGFpbiBhIHNlY3Rpb246ICVzXG4iLCBrZXkpOworCQlyZXQgPSAyOworCQlnb3RvIG91dF9mcmVlOworCX0KKwlzdG9yZS5iYXNlbGVuID0gbGFzdF9kb3QgLSBrZXk7CisKKwlzdG9yZS5tdWx0aV9yZXBsYWNlID0gbXVsdGlfcmVwbGFjZTsKKworCS8qCisJICogVmFsaWRhdGUgdGhlIGtleSBhbmQgd2hpbGUgYXQgaXQsIGxvd2VyIGNhc2UgaXQgZm9yIG1hdGNoaW5nLgorCSAqLworCXN0b3JlLmtleSA9IHhtYWxsb2Moc3RybGVuKGtleSkgKyAxKTsKKwlkb3QgPSAwOworCWZvciAoaSA9IDA7IGtleVtpXTsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgYyA9IGtleVtpXTsKKwkJaWYgKGMgPT0gJy4nKQorCQkJZG90ID0gMTsKKwkJLyogTGVhdmUgdGhlIGV4dGVuZGVkIGJhc2VuYW1lIHVudG91Y2hlZC4uICovCisJCWlmICghZG90IHx8IGkgPiBzdG9yZS5iYXNlbGVuKSB7CisJCQlpZiAoIWlza2V5Y2hhcihjKSB8fCAoaSA9PSBzdG9yZS5iYXNlbGVuKzEgJiYgIWlzYWxwaGEoYykpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIGtleTogJXNcbiIsIGtleSk7CisJCQkJZnJlZShzdG9yZS5rZXkpOworCQkJCXJldCA9IDE7CisJCQkJZ290byBvdXRfZnJlZTsKKwkJCX0KKwkJCWMgPSB0b2xvd2VyKGMpOworCQl9IGVsc2UgaWYgKGMgPT0gJ1xuJykgeworCQkJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIGtleSAobmV3bGluZSk6ICVzXG4iLCBrZXkpOworCQkJZnJlZShzdG9yZS5rZXkpOworCQkJcmV0ID0gMTsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwkJc3RvcmUua2V5W2ldID0gYzsKKwl9CisJc3RvcmUua2V5W2ldID0gMDsKKworCS8qCisJICogVGhlIGxvY2sgc2VydmVzIGEgcHVycG9zZSBpbiBhZGRpdGlvbiB0byBsb2NraW5nOiB0aGUgbmV3CisJICogY29udGVudHMgb2YgLmdpdC9jb25maWcgd2lsbCBiZSB3cml0dGVuIGludG8gaXQuCisJICovCisJbG9jayA9IHhjYWxsb2Moc2l6ZW9mKHN0cnVjdCBsb2NrX2ZpbGUpLCAxKTsKKwlmZCA9IGhvbGRfbG9ja19maWxlX2Zvcl91cGRhdGUobG9jaywgY29uZmlnX2ZpbGVuYW1lLCAwKTsKKwlpZiAoZmQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGxvY2sgY29uZmlnIGZpbGVcbiIpOworCQlmcmVlKHN0b3JlLmtleSk7CisJCXJldCA9IC0xOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCS8qCisJICogSWYgLmdpdC9jb25maWcgZG9lcyBub3QgZXhpc3QgeWV0LCB3cml0ZSBhIG1pbmltYWwgdmVyc2lvbi4KKwkgKi8KKwlpbl9mZCA9IG9wZW4oY29uZmlnX2ZpbGVuYW1lLCBPX1JET05MWSk7CisJaWYgKCBpbl9mZCA8IDAgKSB7CisJCWZyZWUoc3RvcmUua2V5KTsKKworCQlpZiAoIEVOT0VOVCAhPSBlcnJubyApIHsKKwkJCWVycm9yKCJvcGVuaW5nICVzOiAlcyIsIGNvbmZpZ19maWxlbmFtZSwKKwkJCSAgICAgIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXQgPSAzOyAvKiBzYW1lIGFzICJpbnZhbGlkIGNvbmZpZyBmaWxlIiAqLworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCQkvKiBpZiBub3RoaW5nIHRvIHVuc2V0LCBlcnJvciBvdXQgKi8KKwkJaWYgKHZhbHVlID09IE5VTEwpIHsKKwkJCXJldCA9IDU7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisKKwkJc3RvcmUua2V5ID0gKGNoYXIqKWtleTsKKwkJaWYgKCFzdG9yZV93cml0ZV9zZWN0aW9uKGZkLCBrZXkpIHx8CisJCSAgICAhc3RvcmVfd3JpdGVfcGFpcihmZCwga2V5LCB2YWx1ZSkpCisJCQlnb3RvIHdyaXRlX2Vycl9vdXQ7CisJfSBlbHNlIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWNoYXIqIGNvbnRlbnRzOworCQlzaXplX3QgY29udGVudHNfc3osIGNvcHlfYmVnaW4sIGNvcHlfZW5kOworCQlpbnQgaSwgbmV3X2xpbmUgPSAwOworCisJCWlmICh2YWx1ZV9yZWdleCA9PSBOVUxMKQorCQkJc3RvcmUudmFsdWVfcmVnZXggPSBOVUxMOworCQllbHNlIHsKKwkJCWlmICh2YWx1ZV9yZWdleFswXSA9PSAnIScpIHsKKwkJCQlzdG9yZS5kb19ub3RfbWF0Y2ggPSAxOworCQkJCXZhbHVlX3JlZ2V4Kys7CisJCQl9IGVsc2UKKwkJCQlzdG9yZS5kb19ub3RfbWF0Y2ggPSAwOworCisJCQlzdG9yZS52YWx1ZV9yZWdleCA9IChyZWdleF90Kil4bWFsbG9jKHNpemVvZihyZWdleF90KSk7CisJCQlpZiAocmVnY29tcChzdG9yZS52YWx1ZV9yZWdleCwgdmFsdWVfcmVnZXgsCisJCQkJCVJFR19FWFRFTkRFRCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgcGF0dGVybjogJXNcbiIsCisJCQkJCXZhbHVlX3JlZ2V4KTsKKwkJCQlmcmVlKHN0b3JlLnZhbHVlX3JlZ2V4KTsKKwkJCQlyZXQgPSA2OworCQkJCWdvdG8gb3V0X2ZyZWU7CisJCQl9CisJCX0KKworCQlzdG9yZS5vZmZzZXRbMF0gPSAwOworCQlzdG9yZS5zdGF0ZSA9IFNUQVJUOworCQlzdG9yZS5zZWVuID0gMDsKKworCQkvKgorCQkgKiBBZnRlciB0aGlzLCBzdG9yZS5vZmZzZXQgd2lsbCBjb250YWluIHRoZSAqZW5kKiBvZmZzZXQKKwkJICogb2YgdGhlIGxhc3QgbWF0Y2gsIG9yIHJlbWFpbiBhdCAwIGlmIG5vIG1hdGNoIHdhcyBmb3VuZC4KKwkJICogQXMgYSBzaWRlIGVmZmVjdCwgd2UgbWFrZSBzdXJlIHRvIHRyYW5zZm9ybSBvbmx5IGEgdmFsaWQKKwkJICogZXhpc3RpbmcgY29uZmlnIGZpbGUuCisJCSAqLworCQlpZiAoZ2l0X2NvbmZpZ19mcm9tX2ZpbGUoc3RvcmVfYXV4LCBjb25maWdfZmlsZW5hbWUpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgY29uZmlnIGZpbGVcbiIpOworCQkJZnJlZShzdG9yZS5rZXkpOworCQkJaWYgKHN0b3JlLnZhbHVlX3JlZ2V4ICE9IE5VTEwpIHsKKwkJCQlyZWdmcmVlKHN0b3JlLnZhbHVlX3JlZ2V4KTsKKwkJCQlmcmVlKHN0b3JlLnZhbHVlX3JlZ2V4KTsKKwkJCX0KKwkJCXJldCA9IDM7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisKKwkJZnJlZShzdG9yZS5rZXkpOworCQlpZiAoc3RvcmUudmFsdWVfcmVnZXggIT0gTlVMTCkgeworCQkJcmVnZnJlZShzdG9yZS52YWx1ZV9yZWdleCk7CisJCQlmcmVlKHN0b3JlLnZhbHVlX3JlZ2V4KTsKKwkJfQorCisJCS8qIGlmIG5vdGhpbmcgdG8gdW5zZXQsIG9yIHRvbyBtYW55IG1hdGNoZXMsIGVycm9yIG91dCAqLworCQlpZiAoKHN0b3JlLnNlZW4gPT0gMCAmJiB2YWx1ZSA9PSBOVUxMKSB8fAorCQkJCShzdG9yZS5zZWVuID4gMSAmJiBtdWx0aV9yZXBsYWNlID09IDApKSB7CisJCQlyZXQgPSA1OworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCisJCWZzdGF0KGluX2ZkLCAmc3QpOworCQljb250ZW50c19zeiA9IHhzaXplX3Qoc3Quc3Rfc2l6ZSk7CisJCWNvbnRlbnRzID0geG1tYXAoTlVMTCwgY29udGVudHNfc3osIFBST1RfUkVBRCwKKwkJCU1BUF9QUklWQVRFLCBpbl9mZCwgMCk7CisJCWNsb3NlKGluX2ZkKTsKKworCQlpZiAoc3RvcmUuc2VlbiA9PSAwKQorCQkJc3RvcmUuc2VlbiA9IDE7CisKKwkJZm9yIChpID0gMCwgY29weV9iZWdpbiA9IDA7IGkgPCBzdG9yZS5zZWVuOyBpKyspIHsKKwkJCWlmIChzdG9yZS5vZmZzZXRbaV0gPT0gMCkgeworCQkJCXN0b3JlLm9mZnNldFtpXSA9IGNvcHlfZW5kID0gY29udGVudHNfc3o7CisJCQl9IGVsc2UgaWYgKHN0b3JlLnN0YXRlICE9IEtFWV9TRUVOKSB7CisJCQkJY29weV9lbmQgPSBzdG9yZS5vZmZzZXRbaV07CisJCQl9IGVsc2UKKwkJCQljb3B5X2VuZCA9IGZpbmRfYmVnaW5uaW5nX29mX2xpbmUoCisJCQkJCWNvbnRlbnRzLCBjb250ZW50c19zeiwKKwkJCQkJc3RvcmUub2Zmc2V0W2ldLTIsICZuZXdfbGluZSk7CisKKwkJCWlmIChjb3B5X2VuZCA+IDAgJiYgY29udGVudHNbY29weV9lbmQtMV0gIT0gJ1xuJykKKwkJCQluZXdfbGluZSA9IDE7CisKKwkJCS8qIHdyaXRlIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBjb25maWcgKi8KKwkJCWlmIChjb3B5X2VuZCA+IGNvcHlfYmVnaW4pIHsKKwkJCQlpZiAod3JpdGVfaW5fZnVsbChmZCwgY29udGVudHMgKyBjb3B5X2JlZ2luLAorCQkJCQkJICBjb3B5X2VuZCAtIGNvcHlfYmVnaW4pIDwKKwkJCQkgICAgY29weV9lbmQgLSBjb3B5X2JlZ2luKQorCQkJCQlnb3RvIHdyaXRlX2Vycl9vdXQ7CisJCQkJaWYgKG5ld19saW5lICYmCisJCQkJICAgIHdyaXRlX2luX2Z1bGwoZmQsICJcbiIsIDEpICE9IDEpCisJCQkJCWdvdG8gd3JpdGVfZXJyX291dDsKKwkJCX0KKwkJCWNvcHlfYmVnaW4gPSBzdG9yZS5vZmZzZXRbaV07CisJCX0KKworCQkvKiB3cml0ZSB0aGUgcGFpciAodmFsdWUgPT0gTlVMTCBtZWFucyB1bnNldCkgKi8KKwkJaWYgKHZhbHVlICE9IE5VTEwpIHsKKwkJCWlmIChzdG9yZS5zdGF0ZSA9PSBTVEFSVCkgeworCQkJCWlmICghc3RvcmVfd3JpdGVfc2VjdGlvbihmZCwga2V5KSkKKwkJCQkJZ290byB3cml0ZV9lcnJfb3V0OworCQkJfQorCQkJaWYgKCFzdG9yZV93cml0ZV9wYWlyKGZkLCBrZXksIHZhbHVlKSkKKwkJCQlnb3RvIHdyaXRlX2Vycl9vdXQ7CisJCX0KKworCQkvKiB3cml0ZSB0aGUgcmVzdCBvZiB0aGUgY29uZmlnICovCisJCWlmIChjb3B5X2JlZ2luIDwgY29udGVudHNfc3opCisJCQlpZiAod3JpdGVfaW5fZnVsbChmZCwgY29udGVudHMgKyBjb3B5X2JlZ2luLAorCQkJCQkgIGNvbnRlbnRzX3N6IC0gY29weV9iZWdpbikgPAorCQkJICAgIGNvbnRlbnRzX3N6IC0gY29weV9iZWdpbikKKwkJCQlnb3RvIHdyaXRlX2Vycl9vdXQ7CisKKwkJbXVubWFwKGNvbnRlbnRzLCBjb250ZW50c19zeik7CisJfQorCisJaWYgKGNvbW1pdF9sb2NrX2ZpbGUobG9jaykgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGNvbW1pdCBjb25maWcgZmlsZSFcbiIpOworCQlyZXQgPSA0OworCQlnb3RvIG91dF9mcmVlOworCX0KKworCS8qCisJICogbG9jayBpcyBjb21taXR0ZWQsIHNvIGRvbid0IHRyeSB0byByb2xsIGl0IGJhY2sgYmVsb3cuCisJICogTk9URTogU2luY2UgbG9ja2ZpbGUuYyBrZWVwcyBhIGxpbmtlZCBsaXN0IG9mIGFsbCBjcmVhdGVkCisJICogbG9ja19maWxlIHN0cnVjdHVyZXMsIGl0IGlzbid0IHNhZmUgdG8gZnJlZShsb2NrKS4gIEl0J3MKKwkgKiBiZXR0ZXIgdG8ganVzdCBsZWF2ZSBpdCBoYW5naW5nIGFyb3VuZC4KKwkgKi8KKwlsb2NrID0gTlVMTDsKKwlyZXQgPSAwOworCitvdXRfZnJlZToKKwlpZiAobG9jaykKKwkJcm9sbGJhY2tfbG9ja19maWxlKGxvY2spOworCWZyZWUoY29uZmlnX2ZpbGVuYW1lKTsKKwlyZXR1cm4gcmV0OworCit3cml0ZV9lcnJfb3V0OgorCXJldCA9IHdyaXRlX2Vycm9yKCk7CisJZ290byBvdXRfZnJlZTsKKworfQorCitzdGF0aWMgaW50IHNlY3Rpb25fbmFtZV9tYXRjaCAoY29uc3QgY2hhciAqYnVmLCBjb25zdCBjaGFyICpuYW1lKQoreworCWludCBpID0gMCwgaiA9IDAsIGRvdCA9IDA7CisJZm9yICg7IGJ1ZltpXSAmJiBidWZbaV0gIT0gJ10nOyBpKyspIHsKKwkJaWYgKCFkb3QgJiYgaXNzcGFjZShidWZbaV0pKSB7CisJCQlkb3QgPSAxOworCQkJaWYgKG5hbWVbaisrXSAhPSAnLicpCisJCQkJYnJlYWs7CisJCQlmb3IgKGkrKzsgaXNzcGFjZShidWZbaV0pOyBpKyspCisJCQkJOyAvKiBkbyBub3RoaW5nICovCisJCQlpZiAoYnVmW2ldICE9ICciJykKKwkJCQlicmVhazsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChidWZbaV0gPT0gJ1xcJyAmJiBkb3QpCisJCQlpKys7CisJCWVsc2UgaWYgKGJ1ZltpXSA9PSAnIicgJiYgZG90KSB7CisJCQlmb3IgKGkrKzsgaXNzcGFjZShidWZbaV0pOyBpKyspCisJCQkJOyAvKiBkb19ub3RoaW5nICovCisJCQlicmVhazsKKwkJfQorCQlpZiAoYnVmW2ldICE9IG5hbWVbaisrXSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gKGJ1ZltpXSA9PSAnXScgJiYgbmFtZVtqXSA9PSAwKTsKK30KKworLyogaWYgbmV3X25hbWUgPT0gTlVMTCwgdGhlIHNlY3Rpb24gaXMgcmVtb3ZlZCBpbnN0ZWFkICovCitpbnQgZ2l0X2NvbmZpZ19yZW5hbWVfc2VjdGlvbihjb25zdCBjaGFyICpvbGRfbmFtZSwgY29uc3QgY2hhciAqbmV3X25hbWUpCit7CisJaW50IHJldCA9IDAsIHJlbW92ZSA9IDA7CisJY2hhciAqY29uZmlnX2ZpbGVuYW1lOworCXN0cnVjdCBsb2NrX2ZpbGUgKmxvY2sgPSB4Y2FsbG9jKHNpemVvZihzdHJ1Y3QgbG9ja19maWxlKSwgMSk7CisJaW50IG91dF9mZDsKKwljaGFyIGJ1ZlsxMDI0XTsKKworCWNvbmZpZ19maWxlbmFtZSA9IGdldGVudihDT05GSUdfRU5WSVJPTk1FTlQpOworCWlmICghY29uZmlnX2ZpbGVuYW1lKSB7CisJCWNvbmZpZ19maWxlbmFtZSA9IGdldGVudihDT05GSUdfTE9DQUxfRU5WSVJPTk1FTlQpOworCQlpZiAoIWNvbmZpZ19maWxlbmFtZSkKKwkJCWNvbmZpZ19maWxlbmFtZSAgPSBnaXRfcGF0aCgiY29uZmlnIik7CisJfQorCWNvbmZpZ19maWxlbmFtZSA9IHhzdHJkdXAoY29uZmlnX2ZpbGVuYW1lKTsKKwlvdXRfZmQgPSBob2xkX2xvY2tfZmlsZV9mb3JfdXBkYXRlKGxvY2ssIGNvbmZpZ19maWxlbmFtZSwgMCk7CisJaWYgKG91dF9mZCA8IDApIHsKKwkJcmV0ID0gZXJyb3IoIkNvdWxkIG5vdCBsb2NrIGNvbmZpZyBmaWxlISIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIShjb25maWdfZmlsZSA9IGZvcGVuKGNvbmZpZ19maWxlbmFtZSwgInJiIikpKSB7CisJCS8qIG5vIGNvbmZpZyBmaWxlIG1lYW5zIG5vdGhpbmcgdG8gcmVuYW1lLCBubyBlcnJvciAqLworCQlnb3RvIHVubG9ja19hbmRfb3V0OworCX0KKworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBjb25maWdfZmlsZSkpIHsKKwkJaW50IGk7CisJCWludCBsZW5ndGg7CisJCWZvciAoaSA9IDA7IGJ1ZltpXSAmJiBpc3NwYWNlKGJ1ZltpXSk7IGkrKykKKwkJCTsgLyogZG8gbm90aGluZyAqLworCQlpZiAoYnVmW2ldID09ICdbJykgeworCQkJLyogaXQncyBhIHNlY3Rpb24gKi8KKwkJCWlmIChzZWN0aW9uX25hbWVfbWF0Y2ggKCZidWZbaSsxXSwgb2xkX25hbWUpKSB7CisJCQkJcmV0Kys7CisJCQkJaWYgKG5ld19uYW1lID09IE5VTEwpIHsKKwkJCQkJcmVtb3ZlID0gMTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCXN0b3JlLmJhc2VsZW4gPSBzdHJsZW4obmV3X25hbWUpOworCQkJCWlmICghc3RvcmVfd3JpdGVfc2VjdGlvbihvdXRfZmQsIG5ld19uYW1lKSkgeworCQkJCQlyZXQgPSB3cml0ZV9lcnJvcigpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQlyZW1vdmUgPSAwOworCQl9CisJCWlmIChyZW1vdmUpCisJCQljb250aW51ZTsKKwkJbGVuZ3RoID0gc3RybGVuKGJ1Zik7CisJCWlmICh3cml0ZV9pbl9mdWxsKG91dF9mZCwgYnVmLCBsZW5ndGgpICE9IGxlbmd0aCkgeworCQkJcmV0ID0gd3JpdGVfZXJyb3IoKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWZjbG9zZShjb25maWdfZmlsZSk7CisgdW5sb2NrX2FuZF9vdXQ6CisJaWYgKGNvbW1pdF9sb2NrX2ZpbGUobG9jaykgPCAwKQorCQkJcmV0ID0gZXJyb3IoIkNhbm5vdCBjb21taXQgY29uZmlnIGZpbGUhIik7Cisgb3V0OgorCWZyZWUoY29uZmlnX2ZpbGVuYW1lKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQ2FsbCB0aGlzIHRvIHJlcG9ydCBlcnJvciBmb3IgeW91ciB2YXJpYWJsZSB0aGF0IHNob3VsZCBub3QKKyAqIGdldCBhIGJvb2xlYW4gdmFsdWUgKGkuZS4gIltteV0gdmFyIiBtZWFucyAidHJ1ZSIpLgorICovCitpbnQgY29uZmlnX2Vycm9yX25vbmJvb2woY29uc3QgY2hhciAqdmFyKQoreworCXJldHVybiBlcnJvcigiTWlzc2luZyB2YWx1ZSBmb3IgJyVzJyIsIHZhcik7Cit9CmRpZmYgLS1naXQgYS9jb25maWcubWFrLmluIGIvY29uZmlnLm1hay5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODY4ZGZkCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnLm1hay5pbgpAQCAtMCwwICsxLDUwIEBACisjIGdpdCBNYWtlZmlsZSBjb25maWd1cmF0aW9uLCBpbmNsdWRlZCBpbiBtYWluIE1ha2VmaWxlCisjIEBjb25maWd1cmVfaW5wdXRACisKK0NDID0gQENDQAorQ0ZMQUdTID0gQENGTEFHU0AKK0FSID0gQEFSQAorVEFSID0gQFRBUkAKKyNJTlNUQUxMID0gQElOU1RBTExACQkjIG5lZWRzIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBzb3VyY2VzCitUQ0xUS19QQVRIID0gQFRDTFRLX1BBVEhACisKK3ByZWZpeCA9IEBwcmVmaXhACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2JpbmRpciA9IEBiaW5kaXJACisjZ2l0ZXhlY2RpciA9IEBsaWJleGVjZGlyQC9naXQtY29yZS8KK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAordGVtcGxhdGVfZGlyID0gQGRhdGFkaXJAL2dpdC1jb3JlL3RlbXBsYXRlcy8KKworbWFuZGlyPUBtYW5kaXJACisKK3NyY2RpciA9IEBzcmNkaXJACitWUEFUSCA9IEBzcmNkaXJACisKK2V4cG9ydCBleGVjX3ByZWZpeCBtYW5kaXIKK2V4cG9ydCBzcmNkaXIgVlBBVEgKKworQVNDSUlET0M4PUBBU0NJSURPQzhACitORUVEU19TU0xfV0lUSF9DUllQVE89QE5FRURTX1NTTF9XSVRIX0NSWVBUT0AKK05PX09QRU5TU0w9QE5PX09QRU5TU0xACitOT19DVVJMPUBOT19DVVJMQAorTk9fRVhQQVQ9QE5PX0VYUEFUQAorTkVFRFNfTElCSUNPTlY9QE5FRURTX0xJQklDT05WQAorTkVFRFNfU09DS0VUPUBORUVEU19TT0NLRVRACitOT19TWVNfU0VMRUNUX0g9QE5PX1NZU19TRUxFQ1RfSEAKK05PX0RfSU5PX0lOX0RJUkVOVD1ATk9fRF9JTk9fSU5fRElSRU5UQAorTk9fRF9UWVBFX0lOX0RJUkVOVD1ATk9fRF9UWVBFX0lOX0RJUkVOVEAKK05PX1NPQ0tBRERSX1NUT1JBR0U9QE5PX1NPQ0tBRERSX1NUT1JBR0VACitOT19JUFY2PUBOT19JUFY2QAorTk9fQzk5X0ZPUk1BVD1ATk9fQzk5X0ZPUk1BVEAKK05PX1NUUkNBU0VTVFI9QE5PX1NUUkNBU0VTVFJACitOT19NRU1NRU09QE5PX01FTU1FTUAKK05PX1NUUkxDUFk9QE5PX1NUUkxDUFlACitOT19TVFJUT1VNQVg9QE5PX1NUUlRPVU1BWEAKK05PX1NFVEVOVj1ATk9fU0VURU5WQAorTk9fVU5TRVRFTlY9QE5PX1VOU0VURU5WQAorTk9fTUtEVEVNUD1ATk9fTUtEVEVNUEAKK05PX0lDT05WPUBOT19JQ09OVkAKK09MRF9JQ09OVj1AT0xEX0lDT05WQAorTk9fREVGTEFURV9CT1VORD1ATk9fREVGTEFURV9CT1VOREAKK0ZSRUFEX1JFQURTX0RJUkVDVE9SSUVTPUBGUkVBRF9SRUFEU19ESVJFQ1RPUklFU0AKK1NOUFJJTlRGX1JFVFVSTlNfQk9HVVM9QFNOUFJJTlRGX1JFVFVSTlNfQk9HVVNACmRpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI1ODRlOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3VyZS5hYwpAQCAtMCwwICsxLDUzNiBAQAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgorCitBQ19QUkVSRVEoMi41OSkKK0FDX0lOSVQoW2dpdF0sIFtAQEdJVF9WRVJTSU9OQEBdLCBbZ2l0QHZnZXIua2VybmVsLm9yZ10pCisKK0FDX0NPTkZJR19TUkNESVIoW2dpdC5jXSkKKworY29uZmlnX2ZpbGU9Y29uZmlnLm1hay5hdXRvZ2VuCitjb25maWdfYXBwZW5kPWNvbmZpZy5tYWsuYXBwZW5kCitjb25maWdfaW49Y29uZmlnLm1hay5pbgorCitlY2hvICIjICR7Y29uZmlnX2FwcGVuZH0uICBHZW5lcmF0ZWQgYnkgY29uZmlndXJlLiIgPiAiJHtjb25maWdfYXBwZW5kfSIKKworCisjIyBEZWZpbml0aW9ucyBvZiBtYWNyb3MKKyMgR0lUX0NPTkZfQVBQRU5EX0xJTkUoTElORSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXBwZW5kIExJTkUgdG8gZmlsZSAke2NvbmZpZ19hcHBlbmR9CitBQ19ERUZVTihbR0lUX0NPTkZfQVBQRU5EX0xJTkVdLAorW2VjaG8gIiQxIiA+PiAiJHtjb25maWdfYXBwZW5kfSJdKSMgR0lUX0NPTkZfQVBQRU5EX0xJTkUKKyMKKyMgR0lUX0FSR19TRVRfUEFUSChQUk9HUkFNKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb3ZpZGUgLS13aXRoLVBST0dSQU09UEFUSCBvcHRpb24gdG8gc2V0IFBBVEggdG8gUFJPR1JBTQorQUNfREVGVU4oW0dJVF9BUkdfU0VUX1BBVEhdLAorW0FDX0FSR19XSVRIKFskMV0sCisgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtJDE9UEFUSF0sCisgICAgICAgICAgICAgICAgIFtwcm92aWRlIFBBVEggdG8gJDFdKV0sCisgW0dJVF9DT05GX0FQUEVORF9QQVRIKCQxKV0sW10pCitdKSMgR0lUX0FSR19TRVRfUEFUSAorIworIyBHSVRfQ09ORl9BUFBFTkRfUEFUSChQUk9HUkFNKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUGFyc2UgLS13aXRoLVBST0dSQU09UEFUSCBvcHRpb24gdG8gc2V0IFBST0dSQU1fUEFUSD1QQVRICisjIFVzZWQgYnkgR0lUX0FSR19TRVRfUEFUSChQUk9HUkFNKQorQUNfREVGVU4oW0dJVF9DT05GX0FQUEVORF9QQVRIXSwKK1tQUk9HUkFNPW00X3RvdXBwZXIoJDEpOyBcCitpZiB0ZXN0ICIkd2l0aHZhbCIgPSAibm8iOyB0aGVuIFwKKwlBQ19NU0dfRVJST1IoW1lvdSBjYW5ub3QgdXNlIGdpdCB3aXRob3V0ICQxXSk7IFwKK2Vsc2UgXAorCWlmIHRlc3QgIiR3aXRodmFsIiA9ICJ5ZXMiOyB0aGVuIFwKKwkJQUNfTVNHX1dBUk4oW1lvdSBzaG91bGQgcHJvdmlkZSBwYXRoIGZvciAtLXdpdGgtJDE9UEFUSF0pOyBcCisJZWxzZSBcCisJCUdJVF9DT05GX0FQUEVORF9MSU5FKCR7UFJPR1JBTX1fUEFUSD0kd2l0aHZhbCk7IFwKKwlmaTsgXAorZmk7IFwKK10pICMgR0lUX0NPTkZfQVBQRU5EX1BBVEgKKyMKKyMgR0lUX1BBUlNFX1dJVEgoUEFDS0FHRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRm9yIHVzZSBpbiBBQ19BUkdfV0lUSCBhY3Rpb24taWYtZm91bmQsIGZvciBwYWNrYWdlcyBkZWZhdWx0IE9OLgorIyAqIFNldCBOT19QQUNLQUdFPVllc1BsZWFzZSBmb3IgLS13aXRob3V0LVBBQ0tBR0UKKyMgKiBTZXQgUEFDS0FHRURJUj1QQVRIIGZvciAtLXdpdGgtUEFDS0FHRT1QQVRICisjICogVW5zZXQgTk9fUEFDS0FHRSBmb3IgLS13aXRoLVBBQ0tBR0Ugd2l0aG91dCBBUkcKK0FDX0RFRlVOKFtHSVRfUEFSU0VfV0lUSF0sCitbUEFDS0FHRT1tNF90b3VwcGVyKCQxKTsgXAoraWYgdGVzdCAiJHdpdGh2YWwiID0gIm5vIjsgdGhlbiBcCisJbTRfdG91cHBlcihOT18kMSk9WWVzUGxlYXNlOyBcCitlbGlmIHRlc3QgIiR3aXRodmFsIiA9ICJ5ZXMiOyB0aGVuIFwKKwltNF90b3VwcGVyKE5PXyQxKT07IFwKK2Vsc2UgXAorCW00X3RvdXBwZXIoTk9fJDEpPTsgXAorCUdJVF9DT05GX0FQUEVORF9MSU5FKCR7UEFDS0FHRX1ESVI9JHdpdGh2YWwpOyBcCitmaSBcCitdKSMgR0lUX1BBUlNFX1dJVEgKKworCisjIyBTaXRlIGNvbmZpZ3VyYXRpb24gcmVsYXRlZCB0byBwcm9ncmFtcyAoYmVmb3JlIHRlc3RzKQorIyMgLS13aXRoLVBBQ0tBR0VbPUFSR10gYW5kIC0td2l0aG91dC1QQUNLQUdFCisjCisjIFNldCBsaWIgdG8gYWx0ZXJuYXRpdmUgbmFtZSBvZiBsaWIgZGlyZWN0b3J5IChlLmcuIGxpYjY0KQorQUNfQVJHX1dJVEgoW2xpYl0sCisgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtbGliPUFSR10sCisgICAgICAgICAgICAgICAgIFtBUkcgc3BlY2lmaWVzIGFsdGVybmF0aXZlIG5hbWUgZm9yIGxpYiBkaXJlY3RvcnldKV0sCisgW2lmIHRlc3QgIiR3aXRodmFsIiA9ICJubyIgfHwgdGVzdCAiJHdpdGh2YWwiID0gInllcyI7IHRoZW4gXAorCUFDX01TR19XQVJOKFtZb3Ugc2hvdWxkIHByb3ZpZGUgbmFtZSBmb3IgLS13aXRoLWxpYj1BUkddKTsgXAorZWxzZSBcCisJR0lUX0NPTkZfQVBQRU5EX0xJTkUobGliPSR3aXRodmFsKTsgXAorZmk7IFwKK10sW10pCisjCisjIERlZmluZSBTSEVMTF9QQVRIIHRvIHByb3ZpZGUgcGF0aCB0byBzaGVsbC4KK0dJVF9BUkdfU0VUX1BBVEgoc2hlbGwpCisjCisjIERlZmluZSBQRVJMX1BBVEggdG8gcHJvdmlkZSBwYXRoIHRvIFBlcmwuCitHSVRfQVJHX1NFVF9QQVRIKHBlcmwpCisjCisjIERlZmluZSBaTElCX1BBVEggdG8gcHJvdmlkZSBwYXRoIHRvIHpsaWIuCitHSVRfQVJHX1NFVF9QQVRIKHpsaWIpCisjCisjIERlY2xhcmUgdGhlIHdpdGgtdGNsdGsvd2l0aG91dC10Y2x0ayBvcHRpb25zLgorQUNfQVJHX1dJVEgodGNsdGssCitBU19IRUxQX1NUUklORyhbLS13aXRoLXRjbHRrXSxbdXNlIFRjbC9UayBHVUkgKGRlZmF1bHQgaXMgWUVTKV0pCitBU19IRUxQX1NUUklORyhbXSxbQVJHIGlzIHRoZSBmdWxsIHBhdGggdG8gdGhlIFRjbC9UayBpbnRlcnByZXRlci5dKQorQVNfSEVMUF9TVFJJTkcoW10sW0JhcmUgLS13aXRoLXRjbHRrIHdpbGwgbWFrZSB0aGUgR1VJIHBhcnQgb25seSBpZl0pCitBU19IRUxQX1NUUklORyhbXSxbVGNsL1RrIGludGVycHJldGVyIHdpbGwgYmUgZm91bmQgaW4gYSBzeXN0ZW0uXSksXAorR0lUX1BBUlNFX1dJVEgodGNsdGspKQorIworCisKKyMjIENoZWNrcyBmb3IgcHJvZ3JhbXMuCitBQ19NU0dfTk9USUNFKFtDSEVDS1MgZm9yIHByb2dyYW1zXSkKKyMKK0FDX1BST0dfQ0MoW2NjIGdjY10pCisjQUNfUFJPR19JTlNUQUxMCQkjIG5lZWRzIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBzb3VyY2VzCitBQ19DSEVDS19UT09MUyhBUiwgW2dhciBhcl0sIDopCitBQ19DSEVDS19QUk9HUyhUQVIsIFtndGFyIHRhcl0pCisjIFRDTFRLX1BBVEggd2lsbCBiZSBzZXQgdG8gc29tZSB2YWx1ZSBpZiB3ZSB3YW50IFRjbC9UaworIyBvciB3aWxsIGJlIGVtcHR5IG90aGVyd2lzZS4KK2lmIHRlc3QgLXogIiROT19UQ0xUSyI7IHRoZW4KKyAgaWYgdGVzdCAiJHdpdGhfdGNsdGsiID0gIiI7IHRoZW4KKyAgIyBObyBUY2wvVGsgc3dpdGNoZXMgZ2l2ZW4uIERvIG5vdCBjaGVjayBmb3IgVGNsL1RrLCB1c2UgYmFyZSAnd2lzaCcuCisgICAgVENMVEtfUEFUSD13aXNoCisgICAgQUNfU1VCU1QoVENMVEtfUEFUSCkKKyAgZWxpZiB0ZXN0ICIkd2l0aF90Y2x0ayIgPSAieWVzIjsgdGhlbgorICAjIFRjbC9UayBjaGVjayByZXF1ZXN0ZWQuCisgICAgQUNfQ0hFQ0tfUFJPR1MoVENMVEtfUEFUSCwgW3dpc2hdLCApCisgIGVsc2UKKyAgICBBQ19NU0dfUkVTVUxUKFtVc2luZyBUY2wvVGsgaW50ZXJwcmV0ZXIgJHdpdGhfdGNsdGtdKQorICAgIFRDTFRLX1BBVEg9IiR3aXRoX3RjbHRrIgorICAgIEFDX1NVQlNUKFRDTFRLX1BBVEgpCisgIGZpCitmaQorQUNfQ0hFQ0tfUFJPR1MoQVNDSUlET0MsIFthc2NpaWRvY10pCitpZiB0ZXN0IC1uICIkQVNDSUlET0MiOyB0aGVuCisJQUNfTVNHX0NIRUNLSU5HKFtmb3IgYXNjaWlkb2MgdmVyc2lvbl0pCisJYXNjaWlkb2NfdmVyc2lvbj1gJEFTQ0lJRE9DIC0tdmVyc2lvbiAyPiYxYAorCWNhc2UgIiR7YXNjaWlkb2NfdmVyc2lvbn0iIGluCisJYXNjaWlkb2MnICc4KikKKwkJQVNDSUlET0M4PVllc1BsZWFzZQorCQlBQ19NU0dfUkVTVUxUKFske2FzY2lpZG9jX3ZlcnNpb259ID4gN10pCisJCTs7CisJYXNjaWlkb2MnICc3KikKKwkJQVNDSUlET0M4PQorCQlBQ19NU0dfUkVTVUxUKFske2FzY2lpZG9jX3ZlcnNpb259XSkKKwkJOzsKKwkqKQorCQlBU0NJSURPQzg9CisJCUFDX01TR19SRVNVTFQoWyR7YXNjaWlkb2NfdmVyc2lvbn0gKHVua25vd24pXSkKKwkJOzsKKwllc2FjCitmaQorQUNfU1VCU1QoQVNDSUlET0M4KQorCisKKyMjIENoZWNrcyBmb3IgbGlicmFyaWVzLgorQUNfTVNHX05PVElDRShbQ0hFQ0tTIGZvciBsaWJyYXJpZXNdKQorIworIyBEZWZpbmUgTk9fT1BFTlNTTCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiB5b3UgZG8gbm90IGhhdmUgT3BlblNTTC4KKyMgRGVmaW5lIE5FRURTX1NTTF9XSVRIX0NSWVBUTyBpZiB5b3UgbmVlZCAtbGNyeXB0byB3aXRoIC1sc3NsIChEYXJ3aW4pLgorQUNfQ0hFQ0tfTElCKFtjcnlwdG9dLCBbU0hBMV9Jbml0XSwKK1tORUVEU19TU0xfV0lUSF9DUllQVE89XSwKK1tBQ19DSEVDS19MSUIoW3NzbF0sIFtTSEExX0luaXRdLAorIFtORUVEU19TU0xfV0lUSF9DUllQVE89WWVzUGxlYXNlCisgIE5FRURTX1NTTF9XSVRIX0NSWVBUTz1dLAorIFtOT19PUEVOU1NMPVllc1BsZWFzZV0pXSkKK0FDX1NVQlNUKE5FRURTX1NTTF9XSVRIX0NSWVBUTykKK0FDX1NVQlNUKE5PX09QRU5TU0wpCisjCisjIERlZmluZSBOT19DVVJMIGlmIHlvdSBkbyBub3QgaGF2ZSBjdXJsIGluc3RhbGxlZC4gIGdpdC1odHRwLXB1bGwgYW5kCisjIGdpdC1odHRwLXB1c2ggYXJlIG5vdCBidWlsdCwgYW5kIHlvdSBjYW5ub3QgdXNlIGh0dHA6Ly8gYW5kIGh0dHBzOi8vCisjIHRyYW5zcG9ydHMuCitBQ19DSEVDS19MSUIoW2N1cmxdLCBbY3VybF9nbG9iYWxfaW5pdF0sCitbTk9fQ1VSTD1dLAorW05PX0NVUkw9WWVzUGxlYXNlXSkKK0FDX1NVQlNUKE5PX0NVUkwpCisjCisjIERlZmluZSBOT19FWFBBVCBpZiB5b3UgZG8gbm90IGhhdmUgZXhwYXQgaW5zdGFsbGVkLiAgZ2l0LWh0dHAtcHVzaCBpcworIyBub3QgYnVpbHQsIGFuZCB5b3UgY2Fubm90IHB1c2ggdXNpbmcgaHR0cDovLyBhbmQgaHR0cHM6Ly8gdHJhbnNwb3J0cy4KK0FDX0NIRUNLX0xJQihbZXhwYXRdLCBbWE1MX1BhcnNlckNyZWF0ZV0sCitbTk9fRVhQQVQ9XSwKK1tOT19FWFBBVD1ZZXNQbGVhc2VdKQorQUNfU1VCU1QoTk9fRVhQQVQpCisjCisjIERlZmluZSBORUVEU19MSUJJQ09OViBpZiBsaW5raW5nIHdpdGggbGliYyBpcyBub3QgZW5vdWdoIChEYXJ3aW4gYW5kCisjIHNvbWUgU29sYXJpcyBpbnN0YWxsYXRpb25zKS4KKyMgRGVmaW5lIE5PX0lDT05WIGlmIG5laXRoZXIgbGliYyBub3IgbGliaWNvbnYgc3VwcG9ydCBpY29udi4KK0FDX0RFRlVOKFtJQ09OVlRFU1RfU1JDXSwgWworI2luY2x1ZGUgPGljb252Lmg+CisKK2ludCBtYWluKHZvaWQpCit7CisJaWNvbnZfb3BlbigiIiwgIiIpOworCXJldHVybiAwOworfQorXSkKK0FDX01TR19DSEVDS0lORyhbZm9yIGljb252IGluIC1sY10pCitBQ19MSU5LX0lGRUxTRShJQ09OVlRFU1RfU1JDLAorCVtBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCU5FRURTX0xJQklDT05WPV0sCisJW0FDX01TR19SRVNVTFQoW25vXSkKKwlvbGRfTElCUz0iJExJQlMiCisJTElCUz0iJExJQlMgLWxpY29udiIKKwlBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBpY29udiBpbiAtbGljb252XSkKKwlBQ19MSU5LX0lGRUxTRShJQ09OVlRFU1RfU1JDLAorCQlbQUNfTVNHX1JFU1VMVChbeWVzXSkKKwkJTkVFRFNfTElCSUNPTlY9WWVzUGxlYXNlXSwKKwkJW0FDX01TR19SRVNVTFQoW25vXSkKKwkJTk9fSUNPTlY9WWVzUGxlYXNlXSkKKwlMSUJTPSIkb2xkX0xJQlMiXSkKK0FDX1NVQlNUKE5FRURTX0xJQklDT05WKQorQUNfU1VCU1QoTk9fSUNPTlYpCit0ZXN0IC1uICIkTkVFRFNfTElCSUNPTlYiICYmIExJQlM9IiRMSUJTIC1saWNvbnYiCisjCisjIERlZmluZSBOT19ERUZMQVRFX0JPVU5EIGlmIGRlZmxhdGVCb3VuZCBpcyBtaXNzaW5nIGZyb20gemxpYi4KK0FDX0RFRlVOKFtaTElCVEVTVF9TUkNdLCBbCisjaW5jbHVkZSA8emxpYi5oPgorCitpbnQgbWFpbih2b2lkKQoreworCWRlZmxhdGVCb3VuZCgwLCAwKTsKKwlyZXR1cm4gMDsKK30KK10pCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBkZWZsYXRlQm91bmQgaW4gLWx6XSkKK29sZF9MSUJTPSIkTElCUyIKK0xJQlM9IiRMSUJTIC1seiIKK0FDX0xJTktfSUZFTFNFKFpMSUJURVNUX1NSQywKKwlbQUNfTVNHX1JFU1VMVChbeWVzXSldLAorCVtBQ19NU0dfUkVTVUxUKFtub10pCisJTk9fREVGTEFURV9CT1VORD15ZXNdKQorTElCUz0iJG9sZF9MSUJTIgorQUNfU1VCU1QoTk9fREVGTEFURV9CT1VORCkKKyMKKyMgRGVmaW5lIE5FRURTX1NPQ0tFVCBpZiBsaW5raW5nIHdpdGggbGliYyBpcyBub3QgZW5vdWdoIChTdW5PUywKKyMgUGF0cmljayBNYXVyaXR6KS4KK0FDX0NIRUNLX0xJQihbY10sIFtzb2NrZXRdLAorW05FRURTX1NPQ0tFVD1dLAorW05FRURTX1NPQ0tFVD1ZZXNQbGVhc2VdKQorQUNfU1VCU1QoTkVFRFNfU09DS0VUKQordGVzdCAtbiAiJE5FRURTX1NPQ0tFVCIgJiYgTElCUz0iJExJQlMgLWxzb2NrZXQiCisKKworIyMgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCitBQ19NU0dfTk9USUNFKFtDSEVDS1MgZm9yIGhlYWRlciBmaWxlc10pCisjCisjIERlZmluZSBOT19TWVNfU0VMRUNUX0ggaWYgeW91IGRvbid0IGhhdmUgc3lzL3NlbGVjdC5oLgorQUNfQ0hFQ0tfSEVBREVSKFtzeXMvc2VsZWN0LmhdLAorW05PX1NZU19TRUxFQ1RfSD1dLAorW05PX1NZU19TRUxFQ1RfSD1VbmZvcnR1bmF0ZWx5WWVzXSkKK0FDX1NVQlNUKE5PX1NZU19TRUxFQ1RfSCkKKyMKKyMgRGVmaW5lIE9MRF9JQ09OViBpZiB5b3VyIGxpYnJhcnkgaGFzIGFuIG9sZCBpY29udigpLCB3aGVyZSB0aGUgc2Vjb25kCisjIChpbnB1dCBidWZmZXIgcG9pbnRlcikgcGFyYW1ldGVyIGlzIGRlY2xhcmVkIHdpdGggdHlwZSAoY29uc3QgY2hhciAqKikuCitBQ19ERUZVTihbT0xESUNPTlZURVNUX1NSQ10sIFtbCisjaW5jbHVkZSA8aWNvbnYuaD4KKworZXh0ZXJuIHNpemVfdCBpY29udihpY29udl90IGNkLAorCQkgICAgY2hhciAqKmluYnVmLCBzaXplX3QgKmluYnl0ZXNsZWZ0LAorCQkgICAgY2hhciAqKm91dGJ1Ziwgc2l6ZV90ICpvdXRieXRlc2xlZnQpOworCitpbnQgbWFpbih2b2lkKQoreworCXJldHVybiAwOworfQorXV0pCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBvbGQgaWNvbnYoKV0pCitBQ19DT01QSUxFX0lGRUxTRShPTERJQ09OVlRFU1RfU1JDLAorCVtBQ19NU0dfUkVTVUxUKFtub10pXSwKKwlbQUNfTVNHX1JFU1VMVChbeWVzXSkKKwlPTERfSUNPTlY9VW5mb3J0dW5hdGVseVllc10pCitBQ19TVUJTVChPTERfSUNPTlYpCisKKworIyMgQ2hlY2tzIGZvciB0eXBlZGVmcywgc3RydWN0dXJlcywgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcy4KK0FDX01TR19OT1RJQ0UoW0NIRUNLUyBmb3IgdHlwZWRlZnMsIHN0cnVjdHVyZXMsIGFuZCBjb21waWxlciBjaGFyYWN0ZXJpc3RpY3NdKQorIworIyBEZWZpbmUgTk9fRF9JTk9fSU5fRElSRU5UIGlmIHlvdSBkb24ndCBoYXZlIGRfaW5vIGluIHlvdXIgc3RydWN0IGRpcmVudC4KK0FDX0NIRUNLX01FTUJFUihzdHJ1Y3QgZGlyZW50LmRfaW5vLAorW05PX0RfSU5PX0lOX0RJUkVOVD1dLAorW05PX0RfSU5PX0lOX0RJUkVOVD1ZZXNQbGVhc2VdLAorWyNpbmNsdWRlIDxkaXJlbnQuaD5dKQorQUNfU1VCU1QoTk9fRF9JTk9fSU5fRElSRU5UKQorIworIyBEZWZpbmUgTk9fRF9UWVBFX0lOX0RJUkVOVCBpZiB5b3VyIHBsYXRmb3JtIGRlZmluZXMgRFRfVU5LTk9XTiBidXQgbGFja3MKKyMgZF90eXBlIGluIHN0cnVjdCBkaXJlbnQgKGxhdGVzdCBDeWd3aW4gLS0gd2lsbCBiZSBmaXhlZCBzb29uaXNoKS4KK0FDX0NIRUNLX01FTUJFUihzdHJ1Y3QgZGlyZW50LmRfdHlwZSwKK1tOT19EX1RZUEVfSU5fRElSRU5UPV0sCitbTk9fRF9UWVBFX0lOX0RJUkVOVD1ZZXNQbGVhc2VdLAorWyNpbmNsdWRlIDxkaXJlbnQuaD5dKQorQUNfU1VCU1QoTk9fRF9UWVBFX0lOX0RJUkVOVCkKKyMKKyMgRGVmaW5lIE5PX1NPQ0tBRERSX1NUT1JBR0UgaWYgeW91ciBwbGF0Zm9ybSBkb2VzIG5vdCBoYXZlIHN0cnVjdAorIyBzb2NrYWRkcl9zdG9yYWdlLgorQUNfQ0hFQ0tfVFlQRShzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSwKK1tOT19TT0NLQUREUl9TVE9SQUdFPV0sCitbTk9fU09DS0FERFJfU1RPUkFHRT1ZZXNQbGVhc2VdLFsKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CitdKQorQUNfU1VCU1QoTk9fU09DS0FERFJfU1RPUkFHRSkKKyMKKyMgRGVmaW5lIE5PX0lQVjYgaWYgeW91IGxhY2sgSVB2NiBzdXBwb3J0IGFuZCBnZXRhZGRyaW5mbygpLgorQUNfQ0hFQ0tfVFlQRShbc3RydWN0IGFkZHJpbmZvXSxbCisgQUNfQ0hFQ0tfRlVOQyhbZ2V0YWRkcmluZm9dLAorICBbTk9fSVBWNj1dLAorICBbTk9fSVBWNj1ZZXNQbGVhc2VdKQorXSxbTk9fSVBWNj1ZZXNQbGVhc2VdLFsKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KK10pCitBQ19TVUJTVChOT19JUFY2KQorIworIyBEZWZpbmUgTk9fQzk5X0ZPUk1BVCBpZiB5b3VyIGZvcm1hdHRlZCBJTyBmdW5jdGlvbnMgKHByaW50Zi9zY2FuZiBldC5hbC4pCisjIGRvIG5vdCBzdXBwb3J0IHRoZSAnc2l6ZSBzcGVjaWZpZXJzJyBpbnRyb2R1Y2VkIGJ5IEM5OSwgbmFtZWx5IGxsLCBoaCwKKyMgaiwgeiwgdC4gKHJlcHJlc2VudGluZyBsb25nIGxvbmcgaW50LCBjaGFyLCBpbnRtYXhfdCwgc2l6ZV90LCBwdHJkaWZmX3QpLgorIyBzb21lIEMgY29tcGlsZXJzIHN1cHBvcnRlZCB0aGVzZSBzcGVjaWZpZXJzIHByaW9yIHRvIEM5OSBhcyBhbiBleHRlbnNpb24uCitBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBmb3JtYXR0ZWQgSU8gZnVuY3Rpb25zIHN1cHBvcnQgQzk5IHNpemUgc3BlY2lmaWVyc10sCisgW2FjX2N2X2NfYzk5X2Zvcm1hdF0sCitbIyBBY3R1YWxseSBnaXQgdXNlcyBvbmx5ICV6ICglenUpIGluIGFsbG9jLmMsIGFuZCAldCAoJXRkKSBpbiBta3RhZy5jCitBQ19SVU5fSUZFTFNFKAorCVtBQ19MQU5HX1BST0dSQU0oW0FDX0lOQ0xVREVTX0RFRkFVTFRdLAorCQlbW2NoYXIgYnVmWzY0XTsKKwkJaWYgKHNwcmludGYoYnVmLCAiJWxsZCVoaGQlamQlemQldGQiLCAobG9uZyBsb25nIGludCkxLCAoY2hhcikyLCAoaW50bWF4X3QpMywgKHNpemVfdCk0LCAocHRyZGlmZl90KTUpICE9IDUpCisJCSAgcmV0dXJuIDE7CisJCWVsc2UgaWYgKHN0cmNtcChidWYsICIxMjM0NSIpKQorCQkgIHJldHVybiAyO11dKV0sCisJW2FjX2N2X2NfYzk5X2Zvcm1hdD15ZXNdLAorCVthY19jdl9jX2M5OV9mb3JtYXQ9bm9dKQorXSkKK2lmIHRlc3QgJGFjX2N2X2NfYzk5X2Zvcm1hdCA9IG5vOyB0aGVuCisJTk9fQzk5X0ZPUk1BVD1ZZXNQbGVhc2UKK2Vsc2UKKwlOT19DOTlfRk9STUFUPQorZmkKK0FDX1NVQlNUKE5PX0M5OV9GT1JNQVQpCisjCisjIERlZmluZSBGUkVBRF9SRUFEU19ESVJFQ1RPUklFUyBpZiB5b3VyIGFyZSBvbiBhIHN5c3RlbSB3aGljaCBzdWNjZWVkcworIyB3aGVuIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIGFuIGZvcGVuJ2VkIGRpcmVjdG9yeS4KK0FDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHN5c3RlbSBzdWNjZWVkcyB0byByZWFkIGZvcGVuJ2VkIGRpcmVjdG9yeV0sCisgW2FjX2N2X2ZyZWFkX3JlYWRzX2RpcmVjdG9yaWVzXSwKK1sKK0FDX1JVTl9JRkVMU0UoCisJW0FDX0xBTkdfUFJPR1JBTShbQUNfSU5DTFVERVNfREVGQVVMVF0sCisJCVtbY2hhciBjOworCQlGSUxFICpmID0gZm9wZW4oIi4iLCAiciIpOworCQlyZXR1cm4gZiAmJiBmcmVhZCgmYywgMSwgMSwgZildXSldLAorCVthY19jdl9mcmVhZF9yZWFkc19kaXJlY3Rvcmllcz1ub10sCisJW2FjX2N2X2ZyZWFkX3JlYWRzX2RpcmVjdG9yaWVzPXllc10pCitdKQoraWYgdGVzdCAkYWNfY3ZfZnJlYWRfcmVhZHNfZGlyZWN0b3JpZXMgPSB5ZXM7IHRoZW4KKwlGUkVBRF9SRUFEU19ESVJFQ1RPUklFUz1VbmZvcnR1bmF0ZWx5WWVzCitlbHNlCisJRlJFQURfUkVBRFNfRElSRUNUT1JJRVM9CitmaQorQUNfU1VCU1QoRlJFQURfUkVBRFNfRElSRUNUT1JJRVMpCisjCisjIERlZmluZSBTTlBSSU5URl9SRVRVUk5TX0JPR1VTIGlmIHlvdXIgYXJlIG9uIGEgc3lzdGVtIHdoaWNoIHNucHJpbnRmKCkKKyMgb3IgdnNucHJpbnRmKCkgcmV0dXJuIC0xIGluc3RlYWQgb2YgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2hpY2ggd291bGQKKyMgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gdGhlIGZpbmFsIHN0cmluZyBpZiBlbm91Z2ggc3BhY2UgaGFkIGJlZW4gYXZhaWxhYmxlLgorQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgc25wcmludGYoKSBhbmQvb3IgdnNucHJpbnRmKCkgcmV0dXJuIGJvZ3VzIHZhbHVlXSwKKyBbYWNfY3Zfc25wcmludGZfcmV0dXJuc19ib2d1c10sCitbCitBQ19SVU5fSUZFTFNFKAorCVtBQ19MQU5HX1BST0dSQU0oW0FDX0lOQ0xVREVTX0RFRkFVTFQKKwkJI2luY2x1ZGUgInN0ZGFyZy5oIgorCisJCWludCB0ZXN0X3ZzbnByaW50ZihjaGFyICpzdHIsIHNpemVfdCBtYXhzaXplLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKwkJeworCQkgIGludCByZXQ7CisJCSAgdmFfbGlzdCBhcDsKKwkJICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKwkJICByZXQgPSB2c25wcmludGYoc3RyLCBtYXhzaXplLCBmb3JtYXQsIGFwKTsKKwkJICB2YV9lbmQoYXApOworCQkgIHJldHVybiByZXQ7CisJCX1dLAorCQlbW2NoYXIgYnVmWzZdOworCQkgIGlmICh0ZXN0X3ZzbnByaW50ZihidWYsIDMsICIlcyIsICIxMjM0NSIpICE9IDUKKwkJICAgICAgfHwgc3RyY21wKGJ1ZiwgIjEyIikpIHJldHVybiAxOworCQkgIGlmIChzbnByaW50ZihidWYsIDMsICIlcyIsICIxMjM0NSIpICE9IDUKKwkJICAgICAgfHwgc3RyY21wKGJ1ZiwgIjEyIikpIHJldHVybiAxXV0pXSwKKwlbYWNfY3Zfc25wcmludGZfcmV0dXJuc19ib2d1cz1ub10sCisJW2FjX2N2X3NucHJpbnRmX3JldHVybnNfYm9ndXM9eWVzXSkKK10pCitpZiB0ZXN0ICRhY19jdl9zbnByaW50Zl9yZXR1cm5zX2JvZ3VzID0geWVzOyB0aGVuCisJU05QUklOVEZfUkVUVVJOU19CT0dVUz1VbmZvcnR1bmF0ZWx5WWVzCitlbHNlCisJU05QUklOVEZfUkVUVVJOU19CT0dVUz0KK2ZpCitBQ19TVUJTVChTTlBSSU5URl9SRVRVUk5TX0JPR1VTKQorCisKKyMjIENoZWNrcyBmb3IgbGlicmFyeSBmdW5jdGlvbnMuCisjIyAoaW4gZGVmYXVsdCBDIGxpYnJhcnkgYW5kIGxpYnJhcmllcyBjaGVja2VkIGJ5IEFDX0NIRUNLX0xJQikKK0FDX01TR19OT1RJQ0UoW0NIRUNLUyBmb3IgbGlicmFyeSBmdW5jdGlvbnNdKQorIworIyBEZWZpbmUgTk9fU1RSQ0FTRVNUUiBpZiB5b3UgZG9uJ3QgaGF2ZSBzdHJjYXNlc3RyLgorQUNfQ0hFQ0tfRlVOQyhzdHJjYXNlc3RyLAorW05PX1NUUkNBU0VTVFI9XSwKK1tOT19TVFJDQVNFU1RSPVllc1BsZWFzZV0pCitBQ19TVUJTVChOT19TVFJDQVNFU1RSKQorIworIyBEZWZpbmUgTk9fTUVNTUVNIGlmIHlvdSBkb24ndCBoYXZlIG1lbW1lbS4KK0FDX0NIRUNLX0ZVTkMobWVtbWVtLAorW05PX01FTU1FTT1dLAorW05PX01FTU1FTT1ZZXNQbGVhc2VdKQorQUNfU1VCU1QoTk9fTUVNTUVNKQorIworIyBEZWZpbmUgTk9fU1RSTENQWSBpZiB5b3UgZG9uJ3QgaGF2ZSBzdHJsY3B5LgorQUNfQ0hFQ0tfRlVOQyhzdHJsY3B5LAorW05PX1NUUkxDUFk9XSwKK1tOT19TVFJMQ1BZPVllc1BsZWFzZV0pCitBQ19TVUJTVChOT19TVFJMQ1BZKQorIworIyBEZWZpbmUgTk9fU1RSVE9VTUFYIGlmIHlvdSBkb24ndCBoYXZlIHN0cnRvdW1heCBpbiB0aGUgQyBsaWJyYXJ5LgorQUNfQ0hFQ0tfRlVOQyhzdHJ0b3VtYXgsCitbTk9fU1RSVE9VTUFYPV0sCitbTk9fU1RSVE9VTUFYPVllc1BsZWFzZV0pCitBQ19TVUJTVChOT19TVFJUT1VNQVgpCisjCisjIERlZmluZSBOT19TRVRFTlYgaWYgeW91IGRvbid0IGhhdmUgc2V0ZW52IGluIHRoZSBDIGxpYnJhcnkuCitBQ19DSEVDS19GVU5DKHNldGVudiwKK1tOT19TRVRFTlY9XSwKK1tOT19TRVRFTlY9WWVzUGxlYXNlXSkKK0FDX1NVQlNUKE5PX1NFVEVOVikKKyMKKyMgRGVmaW5lIE5PX1VOU0VURU5WIGlmIHlvdSBkb24ndCBoYXZlIHVuc2V0ZW52IGluIHRoZSBDIGxpYnJhcnkuCitBQ19DSEVDS19GVU5DKHVuc2V0ZW52LAorW05PX1VOU0VURU5WPV0sCitbTk9fVU5TRVRFTlY9WWVzUGxlYXNlXSkKK0FDX1NVQlNUKE5PX1VOU0VURU5WKQorIworIyBEZWZpbmUgTk9fTUtEVEVNUCBpZiB5b3UgZG9uJ3QgaGF2ZSBta2R0ZW1wIGluIHRoZSBDIGxpYnJhcnkuCitBQ19DSEVDS19GVU5DKG1rZHRlbXAsCitbTk9fTUtEVEVNUD1dLAorW05PX01LRFRFTVA9WWVzUGxlYXNlXSkKK0FDX1NVQlNUKE5PX01LRFRFTVApCisjCisjIERlZmluZSBOT19NTUFQIGlmIHlvdSB3YW50IHRvIGF2b2lkIG1tYXAuCisjCisjIERlZmluZSBOT19JQ09OViBpZiB5b3VyIGxpYmMgZG9lcyBub3QgcHJvcGVybHkgc3VwcG9ydCBpY29udi4KKworCisjIyBPdGhlciBjaGVja3MuCisjIERlZmluZSBVU0VfUElDIGlmIHlvdSBuZWVkIHRoZSBtYWluIGdpdCBvYmplY3RzIHRvIGJlIGJ1aWx0IHdpdGggLWZQSUMKKyMgaW4gb3JkZXIgdG8gYnVpbGQgYW5kIGxpbmsgcGVybC9HaXQuc28uICB4ODYtNjQgc2VlbXMgdG8gbmVlZCB0aGlzLgorIworIyBEZWZpbmUgTk9fU1lNTElOS19IRUFEIGlmIHlvdSBuZXZlciB3YW50IC5naXQvSEVBRCB0byBiZSBhIHN5bWJvbGljIGxpbmsuCisjIEVuYWJsZSBpdCBvbiBXaW5kb3dzLiAgQnkgZGVmYXVsdCwgc3ltcmVmcyBhcmUgc3RpbGwgdXNlZC4KKworIyMgU2l0ZSBjb25maWd1cmF0aW9uIChvdmVycmlkZSBhdXRvZGV0ZWN0aW9uKQorIyMgLS13aXRoLVBBQ0tBR0VbPUFSR10gYW5kIC0td2l0aG91dC1QQUNLQUdFCitBQ19NU0dfTk9USUNFKFtDSEVDS1MgZm9yIHNpdGUgY29uZmlndXJhdGlvbl0pCisjCisjIERlZmluZSBOT19TVk5fVEVTVFMgaWYgeW91IHdhbnQgdG8gc2tpcCB0aW1lLWNvbnN1bWluZyBTVk4gaW50ZXJvcGVyYWJpbGl0eQorIyB0ZXN0cy4gIFRoZXNlIHRlc3RzIHRha2UgdXAgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgdGhlIHRvdGFsIHRlc3QgdGltZQorIyBidXQgYXJlIG5vdCBuZWVkZWQgdW5sZXNzIHlvdSBwbGFuIHRvIHRhbGsgdG8gU1ZOIHJlcG9zLgorIworIyBEZWZpbmUgTU9aSUxMQV9TSEExIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gcnVubmluZyBtYWtlIHRvIG1ha2UgdXNlIG9mCisjIGEgYnVuZGxlZCBTSEExIHJvdXRpbmUgY29taW5nIGZyb20gTW96aWxsYS4gSXQgaXMgR1BMJ2QgYW5kIHNob3VsZCBiZSBmYXN0CisjIG9uIG5vbi14ODYgYXJjaGl0ZWN0dXJlcyAoZS5nLiBQb3dlclBDKSwgd2hpbGUgdGhlIE9wZW5TU0wgdmVyc2lvbiAoZGVmYXVsdAorIyBjaG9pY2UpIGhhcyB2ZXJ5IGZhc3QgdmVyc2lvbiBvcHRpbWl6ZWQgZm9yIGk1ODYuCisjCisjIERlZmluZSBQUENfU0hBMSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIHJ1bm5pbmcgbWFrZSB0byBtYWtlIHVzZSBvZgorIyBhIGJ1bmRsZWQgU0hBMSByb3V0aW5lIG9wdGltaXplZCBmb3IgUG93ZXJQQy4KKyMKKyMgRGVmaW5lIEFSTV9TSEExIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gcnVubmluZyBtYWtlIHRvIG1ha2UgdXNlIG9mCisjIGEgYnVuZGxlZCBTSEExIHJvdXRpbmUgb3B0aW1pemVkIGZvciBBUk0uCisjCisjIERlZmluZSBOT19PUEVOU1NMIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIHlvdSBkbyBub3QgaGF2ZSBPcGVuU1NMLgorIyBUaGlzIGFsc28gaW1wbGllcyBNT1pJTExBX1NIQTEuCisjCisjIERlZmluZSBPUEVOU1NMRElSPS9mb28vYmFyIGlmIHlvdXIgb3BlbnNzbCBoZWFkZXIgYW5kIGxpYnJhcnkgZmlsZXMgYXJlIGluCisjIC9mb28vYmFyL2luY2x1ZGUgYW5kIC9mb28vYmFyL2xpYiBkaXJlY3Rvcmllcy4KK0FDX0FSR19XSVRIKG9wZW5zc2wsCitBU19IRUxQX1NUUklORyhbLS13aXRoLW9wZW5zc2xdLFt1c2UgT3BlblNTTCBsaWJyYXJ5IChkZWZhdWx0IGlzIFlFUyldKQorQVNfSEVMUF9TVFJJTkcoW10sICAgICAgICAgICAgICBbQVJHIGNhbiBiZSBwcmVmaXggZm9yIG9wZW5zc2wgbGlicmFyeSBhbmQgaGVhZGVyc10pLFwKK0dJVF9QQVJTRV9XSVRIKG9wZW5zc2wpKQorIworIyBEZWZpbmUgTk9fQ1VSTCBpZiB5b3UgZG8gbm90IGhhdmUgY3VybCBpbnN0YWxsZWQuICBnaXQtaHR0cC1wdWxsIGFuZAorIyBnaXQtaHR0cC1wdXNoIGFyZSBub3QgYnVpbHQsIGFuZCB5b3UgY2Fubm90IHVzZSBodHRwOi8vIGFuZCBodHRwczovLworIyB0cmFuc3BvcnRzLgorIworIyBEZWZpbmUgQ1VSTERJUj0vZm9vL2JhciBpZiB5b3VyIGN1cmwgaGVhZGVyIGFuZCBsaWJyYXJ5IGZpbGVzIGFyZSBpbgorIyAvZm9vL2Jhci9pbmNsdWRlIGFuZCAvZm9vL2Jhci9saWIgZGlyZWN0b3JpZXMuCitBQ19BUkdfV0lUSChjdXJsLAorQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1jdXJsXSxbc3VwcG9ydCBodHRwKHMpOi8vIHRyYW5zcG9ydHMgKGRlZmF1bHQgaXMgWUVTKV0pCitBU19IRUxQX1NUUklORyhbXSwgICAgICAgICAgIFtBUkcgY2FuIGJlIGFsc28gcHJlZml4IGZvciBjdXJsIGxpYnJhcnkgYW5kIGhlYWRlcnNdKSwKK0dJVF9QQVJTRV9XSVRIKGN1cmwpKQorIworIyBEZWZpbmUgTk9fRVhQQVQgaWYgeW91IGRvIG5vdCBoYXZlIGV4cGF0IGluc3RhbGxlZC4gIGdpdC1odHRwLXB1c2ggaXMKKyMgbm90IGJ1aWx0LCBhbmQgeW91IGNhbm5vdCBwdXNoIHVzaW5nIGh0dHA6Ly8gYW5kIGh0dHBzOi8vIHRyYW5zcG9ydHMuCisjCisjIERlZmluZSBFWFBBVERJUj0vZm9vL2JhciBpZiB5b3VyIGV4cGF0IGhlYWRlciBhbmQgbGlicmFyeSBmaWxlcyBhcmUgaW4KKyMgL2Zvby9iYXIvaW5jbHVkZSBhbmQgL2Zvby9iYXIvbGliIGRpcmVjdG9yaWVzLgorQUNfQVJHX1dJVEgoZXhwYXQsCitBU19IRUxQX1NUUklORyhbLS13aXRoLWV4cGF0XSwKK1tzdXBwb3J0IGdpdC1wdXNoIHVzaW5nIGh0dHA6Ly8gYW5kIGh0dHBzOi8vIHRyYW5zcG9ydHMgdmlhIFdlYkRBViAoZGVmYXVsdCBpcyBZRVMpXSkKK0FTX0hFTFBfU1RSSU5HKFtdLCAgICAgICAgICAgIFtBUkcgY2FuIGJlIGFsc28gcHJlZml4IGZvciBleHBhdCBsaWJyYXJ5IGFuZCBoZWFkZXJzXSksCitHSVRfUEFSU0VfV0lUSChleHBhdCkpCisjCisjIERlZmluZSBOT19GSU5LIGlmIHlvdSBhcmUgYnVpbGRpbmcgb24gRGFyd2luL01hYyBPUyBYLCBoYXZlIEZpbmsKKyMgaW5zdGFsbGVkIGluIC9zdywgYnV0IGRvbid0IHdhbnQgR0lUIHRvIGxpbmsgYWdhaW5zdCBhbnkgbGlicmFyaWVzCisjIGluc3RhbGxlZCB0aGVyZS4gIElmIGRlZmluZWQgeW91IG1heSBzcGVjaWZ5IHlvdXIgb3duIChvciBGaW5rJ3MpCisjIGluY2x1ZGUgZGlyZWN0b3JpZXMgYW5kIGxpYnJhcnkgZGlyZWN0b3JpZXMgYnkgZGVmaW5pbmcgQ0ZMQUdTCisjIGFuZCBMREZMQUdTIGFwcHJvcHJpYXRlbHkuCisjCisjIERlZmluZSBOT19EQVJXSU5fUE9SVFMgaWYgeW91IGFyZSBidWlsZGluZyBvbiBEYXJ3aW4vTWFjIE9TIFgsCisjIGhhdmUgRGFyd2luUG9ydHMgaW5zdGFsbGVkIGluIC9vcHQvbG9jYWwsIGJ1dCBkb24ndCB3YW50IEdJVCB0bworIyBsaW5rIGFnYWluc3QgYW55IGxpYnJhcmllcyBpbnN0YWxsZWQgdGhlcmUuICBJZiBkZWZpbmVkIHlvdSBtYXkKKyMgc3BlY2lmeSB5b3VyIG93biAob3IgRGFyd2luUG9ydCdzKSBpbmNsdWRlIGRpcmVjdG9yaWVzIGFuZAorIyBsaWJyYXJ5IGRpcmVjdG9yaWVzIGJ5IGRlZmluaW5nIENGTEFHUyBhbmQgTERGTEFHUyBhcHByb3ByaWF0ZWx5LgorIworIyBEZWZpbmUgTk9fTU1BUCBpZiB5b3Ugd2FudCB0byBhdm9pZCBtbWFwLgorIworIyBEZWZpbmUgTk9fSUNPTlYgaWYgeW91ciBsaWJjIGRvZXMgbm90IHByb3Blcmx5IHN1cHBvcnQgaWNvbnYuCitBQ19BUkdfV0lUSChpY29udiwKK0FTX0hFTFBfU1RSSU5HKFstLXdpdGhvdXQtaWNvbnZdLAorW2lmIHlvdXIgYXJjaGl0ZWN0dXJlIGRvZXNuJ3QgcHJvcGVybHkgc3VwcG9ydCBpY29udl0pCitBU19IRUxQX1NUUklORyhbLS13aXRoLWljb252PVBBVEhdLAorW1BBVEggaXMgcHJlZml4IGZvciBsaWJpY29udiBsaWJyYXJ5IGFuZCBoZWFkZXJzXSkKK0FTX0hFTFBfU1RSSU5HKFtdLAorW3VzZWQgb25seSBpZiB5b3UgbmVlZCBsaW5raW5nIHdpdGggbGliaWNvbnZdKSwKK0dJVF9QQVJTRV9XSVRIKGljb252KSkKKworIyMgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSBhbmQgLS1kaXNhYmxlLUZFQVRVUkUKKyMKKyMgRGVmaW5lIFVTRV9OU0VDIGJlbG93IGlmIHlvdSB3YW50IGdpdCB0byBjYXJlIGFib3V0IHN1Yi1zZWNvbmQgZmlsZSBtdGltZXMKKyMgYW5kIGN0aW1lcy4gTm90ZSB0aGF0IHlvdSBuZWVkIHJlY2VudCBnbGliYyAoYXQgbGVhc3QgMi4yLjQpIGZvciB0aGlzLCBhbmQKKyMgaXQgd2lsbCBCUkVBSyBZT1VSIExPQ0FMIERJRkZTISBzaG93LWRpZmYgYW5kIGFueXRoaW5nIHVzaW5nIGl0IHdpbGwgbGlrZWx5CisjIHJhbmRvbWx5IGJyZWFrIHVubGVzcyB5b3VyIHVuZGVybHlpbmcgZmlsZXN5c3RlbSBzdXBwb3J0cyB0aG9zZSBzdWItc2Vjb25kCisjIHRpbWVzIChteSBleHQzIGRvZXNuJ3QpLgorIworIyBEZWZpbmUgVVNFX1NUREVWIGJlbG93IGlmIHlvdSB3YW50IGdpdCB0byBjYXJlIGFib3V0IHRoZSB1bmRlcmx5aW5nIGRldmljZQorIyBjaGFuZ2UgYmVpbmcgY29uc2lkZXJlZCBhbiBpbm9kZSBjaGFuZ2UgZnJvbSB0aGUgdXBkYXRlLWluZGV4IHBlcnNwZWN0aXZlLgorCisKKyMjIE91dHB1dCBmaWxlcworQUNfQ09ORklHX0ZJTEVTKFsiJHtjb25maWdfZmlsZX0iOiIke2NvbmZpZ19pbn0iOiIke2NvbmZpZ19hcHBlbmR9Il0pCitBQ19PVVRQVVQKKworCisjIyBDbGVhbnVwCitybSAtZiAiJHtjb25maWdfYXBwZW5kfSIKZGlmZiAtLWdpdCBhL2Nvbm5lY3QuYyBiL2Nvbm5lY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTJiMTA1Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdC5jCkBAIC0wLDAgKzEsNjUwIEBACisjaW5jbHVkZSAiZ2l0LWNvbXBhdC11dGlsLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJwa3QtbGluZS5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgInJ1bi1jb21tYW5kLmgiCisjaW5jbHVkZSAicmVtb3RlLmgiCisKK3N0YXRpYyBjaGFyICpzZXJ2ZXJfY2FwYWJpbGl0aWVzOworCitzdGF0aWMgaW50IGNoZWNrX3JlZihjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaWYgKCFmbGFncykKKwkJcmV0dXJuIDE7CisKKwlpZiAobGVuIDwgNSB8fCBtZW1jbXAobmFtZSwgInJlZnMvIiwgNSkpCisJCXJldHVybiAwOworCisJLyogU2tpcCB0aGUgInJlZnMvIiBwYXJ0ICovCisJbmFtZSArPSA1OworCWxlbiAtPSA1OworCisJLyogUkVGX05PUk1BTCBtZWFucyB0aGF0IHdlIGRvbid0IHdhbnQgdGhlIG1hZ2ljIGZha2UgdGFnIHJlZnMgKi8KKwlpZiAoKGZsYWdzICYgUkVGX05PUk1BTCkgJiYgY2hlY2tfcmVmX2Zvcm1hdChuYW1lKSA8IDApCisJCXJldHVybiAwOworCisJLyogUkVGX0hFQURTIG1lYW5zIHRoYXQgd2Ugd2FudCByZWd1bGFyIGJyYW5jaCBoZWFkcyAqLworCWlmICgoZmxhZ3MgJiBSRUZfSEVBRFMpICYmICFtZW1jbXAobmFtZSwgImhlYWRzLyIsIDYpKQorCQlyZXR1cm4gMTsKKworCS8qIFJFRl9UQUdTIG1lYW5zIHRoYXQgd2Ugd2FudCB0YWdzICovCisJaWYgKChmbGFncyAmIFJFRl9UQUdTKSAmJiAhbWVtY21wKG5hbWUsICJ0YWdzLyIsIDUpKQorCQlyZXR1cm4gMTsKKworCS8qIEFsbCB0eXBlIGJpdHMgY2xlYXIgbWVhbnMgdGhhdCB3ZSBhcmUgb2sgd2l0aCBhbnl0aGluZyAqLworCXJldHVybiAhKGZsYWdzICYgflJFRl9OT1JNQUwpOworfQorCitpbnQgY2hlY2tfcmVmX3R5cGUoY29uc3Qgc3RydWN0IHJlZiAqcmVmLCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIGNoZWNrX3JlZihyZWYtPm5hbWUsIHN0cmxlbihyZWYtPm5hbWUpLCBmbGFncyk7Cit9CisKKy8qCisgKiBSZWFkIGFsbCB0aGUgcmVmcyBmcm9tIHRoZSBvdGhlciBlbmQKKyAqLworc3RydWN0IHJlZiAqKmdldF9yZW1vdGVfaGVhZHMoaW50IGluLCBzdHJ1Y3QgcmVmICoqbGlzdCwKKwkJCSAgICAgIGludCBucl9tYXRjaCwgY2hhciAqKm1hdGNoLAorCQkJICAgICAgdW5zaWduZWQgaW50IGZsYWdzKQoreworCSpsaXN0ID0gTlVMTDsKKwlmb3IgKDs7KSB7CisJCXN0cnVjdCByZWYgKnJlZjsKKwkJdW5zaWduZWQgY2hhciBvbGRfc2hhMVsyMF07CisJCXN0YXRpYyBjaGFyIGJ1ZmZlclsxMDAwXTsKKwkJY2hhciAqbmFtZTsKKwkJaW50IGxlbiwgbmFtZV9sZW47CisKKwkJbGVuID0gcGFja2V0X3JlYWRfbGluZShpbiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisJCWlmICghbGVuKQorCQkJYnJlYWs7CisJCWlmIChidWZmZXJbbGVuLTFdID09ICdcbicpCisJCQlidWZmZXJbLS1sZW5dID0gMDsKKworCQlpZiAobGVuIDwgNDIgfHwgZ2V0X3NoYTFfaGV4KGJ1ZmZlciwgb2xkX3NoYTEpIHx8IGJ1ZmZlcls0MF0gIT0gJyAnKQorCQkJZGllKCJwcm90b2NvbCBlcnJvcjogZXhwZWN0ZWQgc2hhL3JlZiwgZ290ICclcyciLCBidWZmZXIpOworCQluYW1lID0gYnVmZmVyICsgNDE7CisKKwkJbmFtZV9sZW4gPSBzdHJsZW4obmFtZSk7CisJCWlmIChsZW4gIT0gbmFtZV9sZW4gKyA0MSkgeworCQkJZnJlZShzZXJ2ZXJfY2FwYWJpbGl0aWVzKTsKKwkJCXNlcnZlcl9jYXBhYmlsaXRpZXMgPSB4c3RyZHVwKG5hbWUgKyBuYW1lX2xlbiArIDEpOworCQl9CisKKwkJaWYgKCFjaGVja19yZWYobmFtZSwgbmFtZV9sZW4sIGZsYWdzKSkKKwkJCWNvbnRpbnVlOworCQlpZiAobnJfbWF0Y2ggJiYgIXBhdGhfbWF0Y2gobmFtZSwgbnJfbWF0Y2gsIG1hdGNoKSkKKwkJCWNvbnRpbnVlOworCQlyZWYgPSBhbGxvY19yZWYobmFtZV9sZW4gKyAxKTsKKwkJaGFzaGNweShyZWYtPm9sZF9zaGExLCBvbGRfc2hhMSk7CisJCW1lbWNweShyZWYtPm5hbWUsIGJ1ZmZlciArIDQxLCBuYW1lX2xlbiArIDEpOworCQkqbGlzdCA9IHJlZjsKKwkJbGlzdCA9ICZyZWYtPm5leHQ7CisJfQorCXJldHVybiBsaXN0OworfQorCitpbnQgc2VydmVyX3N1cHBvcnRzKGNvbnN0IGNoYXIgKmZlYXR1cmUpCit7CisJcmV0dXJuIHNlcnZlcl9jYXBhYmlsaXRpZXMgJiYKKwkJc3Ryc3RyKHNlcnZlcl9jYXBhYmlsaXRpZXMsIGZlYXR1cmUpICE9IE5VTEw7Cit9CisKK2ludCBnZXRfYWNrKGludCBmZCwgdW5zaWduZWQgY2hhciAqcmVzdWx0X3NoYTEpCit7CisJc3RhdGljIGNoYXIgbGluZVsxMDAwXTsKKwlpbnQgbGVuID0gcGFja2V0X3JlYWRfbGluZShmZCwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKworCWlmICghbGVuKQorCQlkaWUoImdpdC1mZXRjaC1wYWNrOiBleHBlY3RlZCBBQ0svTkFLLCBnb3QgRU9GIik7CisJaWYgKGxpbmVbbGVuLTFdID09ICdcbicpCisJCWxpbmVbLS1sZW5dID0gMDsKKwlpZiAoIXN0cmNtcChsaW5lLCAiTkFLIikpCisJCXJldHVybiAwOworCWlmICghcHJlZml4Y21wKGxpbmUsICJBQ0sgIikpIHsKKwkJaWYgKCFnZXRfc2hhMV9oZXgobGluZSs0LCByZXN1bHRfc2hhMSkpIHsKKwkJCWlmIChzdHJzdHIobGluZSs0NSwgImNvbnRpbnVlIikpCisJCQkJcmV0dXJuIDI7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlkaWUoImdpdC1mZXRjaF9wYWNrOiBleHBlY3RlZCBBQ0svTkFLLCBnb3QgJyVzJyIsIGxpbmUpOworfQorCitpbnQgcGF0aF9tYXRjaChjb25zdCBjaGFyICpwYXRoLCBpbnQgbnIsIGNoYXIgKiptYXRjaCkKK3sKKwlpbnQgaTsKKwlpbnQgcGF0aGxlbiA9IHN0cmxlbihwYXRoKTsKKworCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKSB7CisJCWNoYXIgKnMgPSBtYXRjaFtpXTsKKwkJaW50IGxlbiA9IHN0cmxlbihzKTsKKworCQlpZiAoIWxlbiB8fCBsZW4gPiBwYXRobGVuKQorCQkJY29udGludWU7CisJCWlmIChtZW1jbXAocGF0aCArIHBhdGhsZW4gLSBsZW4sIHMsIGxlbikpCisJCQljb250aW51ZTsKKwkJaWYgKHBhdGhsZW4gPiBsZW4gJiYgcGF0aFtwYXRobGVuIC0gbGVuIC0gMV0gIT0gJy8nKQorCQkJY29udGludWU7CisJCSpzID0gMDsKKwkJcmV0dXJuIChpICsgMSk7CisJfQorCXJldHVybiAwOworfQorCitlbnVtIHByb3RvY29sIHsKKwlQUk9UT19MT0NBTCA9IDEsCisJUFJPVE9fU1NILAorCVBST1RPX0dJVCwKK307CisKK3N0YXRpYyBlbnVtIHByb3RvY29sIGdldF9wcm90b2NvbChjb25zdCBjaGFyICpuYW1lKQoreworCWlmICghc3RyY21wKG5hbWUsICJzc2giKSkKKwkJcmV0dXJuIFBST1RPX1NTSDsKKwlpZiAoIXN0cmNtcChuYW1lLCAiZ2l0IikpCisJCXJldHVybiBQUk9UT19HSVQ7CisJaWYgKCFzdHJjbXAobmFtZSwgImdpdCtzc2giKSkKKwkJcmV0dXJuIFBST1RPX1NTSDsKKwlpZiAoIXN0cmNtcChuYW1lLCAic3NoK2dpdCIpKQorCQlyZXR1cm4gUFJPVE9fU1NIOworCWlmICghc3RyY21wKG5hbWUsICJmaWxlIikpCisJCXJldHVybiBQUk9UT19MT0NBTDsKKwlkaWUoIkkgZG9uJ3QgaGFuZGxlIHByb3RvY29sICclcyciLCBuYW1lKTsKK30KKworI2RlZmluZSBTVFJfKHMpCSMgcworI2RlZmluZSBTVFIocykJU1RSXyhzKQorCisjaWZuZGVmIE5PX0lQVjYKKworc3RhdGljIGNvbnN0IGNoYXIgKmFpX25hbWUoY29uc3Qgc3RydWN0IGFkZHJpbmZvICphaSkKK3sKKwlzdGF0aWMgY2hhciBhZGRyW0lORVRfQUREUlNUUkxFTl07CisJaWYgKCBBRl9JTkVUID09IGFpLT5haV9mYW1pbHkgKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiAqaW47CisJCWluID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFpLT5haV9hZGRyOworCQlpbmV0X250b3AoYWktPmFpX2ZhbWlseSwgJmluLT5zaW5fYWRkciwgYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwl9IGVsc2UgaWYgKCBBRl9JTkVUNiA9PSBhaS0+YWlfZmFtaWx5ICkgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICppbjsKKwkJaW4gPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKWFpLT5haV9hZGRyOworCQlpbmV0X250b3AoYWktPmFpX2ZhbWlseSwgJmluLT5zaW42X2FkZHIsIGFkZHIsIHNpemVvZihhZGRyKSk7CisJfSBlbHNlIHsKKwkJc3RyY3B5KGFkZHIsICIodW5rbm93bikiKTsKKwl9CisJcmV0dXJuIGFkZHI7Cit9CisKKy8qCisgKiBSZXR1cm5zIGEgY29ubmVjdGVkIHNvY2tldCgpIGZkLCBvciBlbHNlIGRpZSgpcy4KKyAqLworc3RhdGljIGludCBnaXRfdGNwX2Nvbm5lY3Rfc29jayhjaGFyICpob3N0LCBpbnQgZmxhZ3MpCit7CisJaW50IHNvY2tmZCA9IC0xLCBzYXZlZF9lcnJubyA9IDA7CisJY2hhciAqY29sb24sICplbmQ7CisJY29uc3QgY2hhciAqcG9ydCA9IFNUUihERUZBVUxUX0dJVF9QT1JUKTsKKwlzdHJ1Y3QgYWRkcmluZm8gaGludHMsICphaTAsICphaTsKKwlpbnQgZ2FpOworCWludCBjbnQgPSAwOworCisJaWYgKGhvc3RbMF0gPT0gJ1snKSB7CisJCWVuZCA9IHN0cmNocihob3N0ICsgMSwgJ10nKTsKKwkJaWYgKGVuZCkgeworCQkJKmVuZCA9IDA7CisJCQllbmQrKzsKKwkJCWhvc3QrKzsKKwkJfSBlbHNlCisJCQllbmQgPSBob3N0OworCX0gZWxzZQorCQllbmQgPSBob3N0OworCWNvbG9uID0gc3RyY2hyKGVuZCwgJzonKTsKKworCWlmIChjb2xvbikgeworCQkqY29sb24gPSAwOworCQlwb3J0ID0gY29sb24gKyAxOworCQlpZiAoISpwb3J0KQorCQkJcG9ydCA9ICI8bm9uZT4iOworCX0KKworCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisJaGludHMuYWlfcHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKworCWlmIChmbGFncyAmIENPTk5FQ1RfVkVSQk9TRSkKKwkJZnByaW50ZihzdGRlcnIsICJMb29raW5nIHVwICVzIC4uLiAiLCBob3N0KTsKKworCWdhaSA9IGdldGFkZHJpbmZvKGhvc3QsIHBvcnQsICZoaW50cywgJmFpKTsKKwlpZiAoZ2FpKQorCQlkaWUoIlVuYWJsZSB0byBsb29rIHVwICVzIChwb3J0ICVzKSAoJXMpIiwgaG9zdCwgcG9ydCwgZ2FpX3N0cmVycm9yKGdhaSkpOworCisJaWYgKGZsYWdzICYgQ09OTkVDVF9WRVJCT1NFKQorCQlmcHJpbnRmKHN0ZGVyciwgImRvbmUuXG5Db25uZWN0aW5nIHRvICVzIChwb3J0ICVzKSAuLi4gIiwgaG9zdCwgcG9ydCk7CisKKwlmb3IgKGFpMCA9IGFpOyBhaTsgYWkgPSBhaS0+YWlfbmV4dCkgeworCQlzb2NrZmQgPSBzb2NrZXQoYWktPmFpX2ZhbWlseSwKKwkJCQlhaS0+YWlfc29ja3R5cGUsIGFpLT5haV9wcm90b2NvbCk7CisJCWlmIChzb2NrZmQgPCAwKSB7CisJCQlzYXZlZF9lcnJubyA9IGVycm5vOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvbm5lY3Qoc29ja2ZkLCBhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4pIDwgMCkgeworCQkJc2F2ZWRfZXJybm8gPSBlcnJubzsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXNbJWQ6ICVzXTogZXJybm89JXNcbiIsCisJCQkJaG9zdCwKKwkJCQljbnQsCisJCQkJYWlfbmFtZShhaSksCisJCQkJc3RyZXJyb3Ioc2F2ZWRfZXJybm8pKTsKKwkJCWNsb3NlKHNvY2tmZCk7CisJCQlzb2NrZmQgPSAtMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChmbGFncyAmIENPTk5FQ1RfVkVSQk9TRSkKKwkJCWZwcmludGYoc3RkZXJyLCAiJXMgIiwgYWlfbmFtZShhaSkpOworCQlicmVhazsKKwl9CisKKwlmcmVlYWRkcmluZm8oYWkwKTsKKworCWlmIChzb2NrZmQgPCAwKQorCQlkaWUoInVuYWJsZSB0byBjb25uZWN0IGEgc29ja2V0ICglcykiLCBzdHJlcnJvcihzYXZlZF9lcnJubykpOworCisJaWYgKGZsYWdzICYgQ09OTkVDVF9WRVJCT1NFKQorCQlmcHJpbnRmKHN0ZGVyciwgImRvbmUuXG4iKTsKKworCXJldHVybiBzb2NrZmQ7Cit9CisKKyNlbHNlIC8qIE5PX0lQVjYgKi8KKworLyoKKyAqIFJldHVybnMgYSBjb25uZWN0ZWQgc29ja2V0KCkgZmQsIG9yIGVsc2UgZGllKClzLgorICovCitzdGF0aWMgaW50IGdpdF90Y3BfY29ubmVjdF9zb2NrKGNoYXIgKmhvc3QsIGludCBmbGFncykKK3sKKwlpbnQgc29ja2ZkID0gLTEsIHNhdmVkX2Vycm5vID0gMDsKKwljaGFyICpjb2xvbiwgKmVuZDsKKwljaGFyICpwb3J0ID0gU1RSKERFRkFVTFRfR0lUX1BPUlQpLCAqZXA7CisJc3RydWN0IGhvc3RlbnQgKmhlOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzYTsKKwljaGFyICoqYXA7CisJdW5zaWduZWQgaW50IG5wb3J0OworCWludCBjbnQ7CisKKwlpZiAoaG9zdFswXSA9PSAnWycpIHsKKwkJZW5kID0gc3RyY2hyKGhvc3QgKyAxLCAnXScpOworCQlpZiAoZW5kKSB7CisJCQkqZW5kID0gMDsKKwkJCWVuZCsrOworCQkJaG9zdCsrOworCQl9IGVsc2UKKwkJCWVuZCA9IGhvc3Q7CisJfSBlbHNlCisJCWVuZCA9IGhvc3Q7CisJY29sb24gPSBzdHJjaHIoZW5kLCAnOicpOworCisJaWYgKGNvbG9uKSB7CisJCSpjb2xvbiA9IDA7CisJCXBvcnQgPSBjb2xvbiArIDE7CisJfQorCisJaWYgKGZsYWdzICYgQ09OTkVDVF9WRVJCT1NFKQorCQlmcHJpbnRmKHN0ZGVyciwgIkxvb2tpbmcgdXAgJXMgLi4uICIsIGhvc3QpOworCisJaGUgPSBnZXRob3N0YnluYW1lKGhvc3QpOworCWlmICghaGUpCisJCWRpZSgiVW5hYmxlIHRvIGxvb2sgdXAgJXMgKCVzKSIsIGhvc3QsIGhzdHJlcnJvcihoX2Vycm5vKSk7CisJbnBvcnQgPSBzdHJ0b3VsKHBvcnQsICZlcCwgMTApOworCWlmICggZXAgPT0gcG9ydCB8fCAqZXAgKSB7CisJCS8qIE5vdCBudW1lcmljICovCisJCXN0cnVjdCBzZXJ2ZW50ICpzZSA9IGdldHNlcnZieW5hbWUocG9ydCwidGNwIik7CisJCWlmICggIXNlICkKKwkJCWRpZSgiVW5rbm93biBwb3J0ICVzXG4iLCBwb3J0KTsKKwkJbnBvcnQgPSBzZS0+c19wb3J0OworCX0KKworCWlmIChmbGFncyAmIENPTk5FQ1RfVkVSQk9TRSkKKwkJZnByaW50ZihzdGRlcnIsICJkb25lLlxuQ29ubmVjdGluZyB0byAlcyAocG9ydCAlcykgLi4uICIsIGhvc3QsIHBvcnQpOworCisJZm9yIChjbnQgPSAwLCBhcCA9IGhlLT5oX2FkZHJfbGlzdDsgKmFwOyBhcCsrLCBjbnQrKykgeworCQlzb2NrZmQgPSBzb2NrZXQoaGUtPmhfYWRkcnR5cGUsIFNPQ0tfU1RSRUFNLCAwKTsKKwkJaWYgKHNvY2tmZCA8IDApIHsKKwkJCXNhdmVkX2Vycm5vID0gZXJybm87CisJCQljb250aW51ZTsKKwkJfQorCisJCW1lbXNldCgmc2EsIDAsIHNpemVvZiBzYSk7CisJCXNhLnNpbl9mYW1pbHkgPSBoZS0+aF9hZGRydHlwZTsKKwkJc2Euc2luX3BvcnQgPSBodG9ucyhucG9ydCk7CisJCW1lbWNweSgmc2Euc2luX2FkZHIsICphcCwgaGUtPmhfbGVuZ3RoKTsKKworCQlpZiAoY29ubmVjdChzb2NrZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2EsIHNpemVvZiBzYSkgPCAwKSB7CisJCQlzYXZlZF9lcnJubyA9IGVycm5vOworCQkJZnByaW50ZihzdGRlcnIsICIlc1slZDogJXNdOiBlcnJubz0lc1xuIiwKKwkJCQlob3N0LAorCQkJCWNudCwKKwkJCQlpbmV0X250b2EoKihzdHJ1Y3QgaW5fYWRkciAqKSZzYS5zaW5fYWRkciksCisJCQkJc3RyZXJyb3Ioc2F2ZWRfZXJybm8pKTsKKwkJCWNsb3NlKHNvY2tmZCk7CisJCQlzb2NrZmQgPSAtMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChmbGFncyAmIENPTk5FQ1RfVkVSQk9TRSkKKwkJCWZwcmludGYoc3RkZXJyLCAiJXMgIiwKKwkJCQlpbmV0X250b2EoKihzdHJ1Y3QgaW5fYWRkciAqKSZzYS5zaW5fYWRkcikpOworCQlicmVhazsKKwl9CisKKwlpZiAoc29ja2ZkIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gY29ubmVjdCBhIHNvY2tldCAoJXMpIiwgc3RyZXJyb3Ioc2F2ZWRfZXJybm8pKTsKKworCWlmIChmbGFncyAmIENPTk5FQ1RfVkVSQk9TRSkKKwkJZnByaW50ZihzdGRlcnIsICJkb25lLlxuIik7CisKKwlyZXR1cm4gc29ja2ZkOworfQorCisjZW5kaWYgLyogTk9fSVBWNiAqLworCisKK3N0YXRpYyB2b2lkIGdpdF90Y3BfY29ubmVjdChpbnQgZmRbMl0sIGNoYXIgKmhvc3QsIGludCBmbGFncykKK3sKKwlpbnQgc29ja2ZkID0gZ2l0X3RjcF9jb25uZWN0X3NvY2soaG9zdCwgZmxhZ3MpOworCisJZmRbMF0gPSBzb2NrZmQ7CisJZmRbMV0gPSBkdXAoc29ja2ZkKTsKK30KKworCitzdGF0aWMgY2hhciAqZ2l0X3Byb3h5X2NvbW1hbmQ7CitzdGF0aWMgY29uc3QgY2hhciAqcmhvc3RfbmFtZTsKK3N0YXRpYyBpbnQgcmhvc3RfbGVuOworCitzdGF0aWMgaW50IGdpdF9wcm94eV9jb21tYW5kX29wdGlvbnMoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXN0cmNtcCh2YXIsICJjb3JlLmdpdHByb3h5IikpIHsKKwkJY29uc3QgY2hhciAqZm9yX3BvczsKKwkJaW50IG1hdGNobGVuID0gLTE7CisJCWludCBob3N0bGVuOworCisJCWlmIChnaXRfcHJveHlfY29tbWFuZCkKKwkJCXJldHVybiAwOworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIGNvbmZpZ19lcnJvcl9ub25ib29sKHZhcik7CisJCS8qIFtjb3JlXQorCQkgKiA7IyBtYXRjaGVzIHd3dy5rZXJuZWwub3JnIGFzIHdlbGwKKwkJICogZ2l0cHJveHkgPSBuZXRjYXR0ZXItMSBmb3Iga2VybmVsLm9yZworCQkgKiBnaXRwcm94eSA9IG5ldGNhdHRlci0yIGZvciBzYW1wbGUueHoKKwkJICogZ2l0cHJveHkgPSBuZXRjYXR0ZXItZGVmYXVsdAorCQkgKi8KKwkJZm9yX3BvcyA9IHN0cnN0cih2YWx1ZSwgIiBmb3IgIik7CisJCWlmICghZm9yX3BvcykKKwkJCS8qIG1hdGNoZXMgZXZlcnlib2R5ICovCisJCQltYXRjaGxlbiA9IHN0cmxlbih2YWx1ZSk7CisJCWVsc2UgeworCQkJaG9zdGxlbiA9IHN0cmxlbihmb3JfcG9zICsgNSk7CisJCQlpZiAocmhvc3RfbGVuIDwgaG9zdGxlbikKKwkJCQltYXRjaGxlbiA9IC0xOworCQkJZWxzZSBpZiAoIXN0cm5jbXAoZm9yX3BvcyArIDUsCisJCQkJCSAgcmhvc3RfbmFtZSArIHJob3N0X2xlbiAtIGhvc3RsZW4sCisJCQkJCSAgaG9zdGxlbikgJiYKKwkJCQkgKChyaG9zdF9sZW4gPT0gaG9zdGxlbikgfHwKKwkJCQkgIHJob3N0X25hbWVbcmhvc3RfbGVuIC0gaG9zdGxlbiAtMV0gPT0gJy4nKSkKKwkJCQltYXRjaGxlbiA9IGZvcl9wb3MgLSB2YWx1ZTsKKwkJCWVsc2UKKwkJCQltYXRjaGxlbiA9IC0xOworCQl9CisJCWlmICgwIDw9IG1hdGNobGVuKSB7CisJCQkvKiBjb3JlLmdpdHByb3h5ID0gbm9uZSBmb3Iga2VybmVsLm9yZyAqLworCQkJaWYgKG1hdGNobGVuID09IDQgJiYKKwkJCSAgICAhbWVtY21wKHZhbHVlLCAibm9uZSIsIDQpKQorCQkJCW1hdGNobGVuID0gMDsKKwkJCWdpdF9wcm94eV9jb21tYW5kID0geG1lbWR1cHoodmFsdWUsIG1hdGNobGVuKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gZ2l0X2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUpOworfQorCitzdGF0aWMgaW50IGdpdF91c2VfcHJveHkoY29uc3QgY2hhciAqaG9zdCkKK3sKKwlyaG9zdF9uYW1lID0gaG9zdDsKKwlyaG9zdF9sZW4gPSBzdHJsZW4oaG9zdCk7CisJZ2l0X3Byb3h5X2NvbW1hbmQgPSBnZXRlbnYoIkdJVF9QUk9YWV9DT01NQU5EIik7CisJZ2l0X2NvbmZpZyhnaXRfcHJveHlfY29tbWFuZF9vcHRpb25zKTsKKwlyaG9zdF9uYW1lID0gTlVMTDsKKwlyZXR1cm4gKGdpdF9wcm94eV9jb21tYW5kICYmICpnaXRfcHJveHlfY29tbWFuZCk7Cit9CisKK3N0YXRpYyB2b2lkIGdpdF9wcm94eV9jb25uZWN0KGludCBmZFsyXSwgY2hhciAqaG9zdCkKK3sKKwljb25zdCBjaGFyICpwb3J0ID0gU1RSKERFRkFVTFRfR0lUX1BPUlQpOworCWNoYXIgKmNvbG9uLCAqZW5kOworCWNvbnN0IGNoYXIgKmFyZ3ZbNF07CisJc3RydWN0IGNoaWxkX3Byb2Nlc3MgcHJveHk7CisKKwlpZiAoaG9zdFswXSA9PSAnWycpIHsKKwkJZW5kID0gc3RyY2hyKGhvc3QgKyAxLCAnXScpOworCQlpZiAoZW5kKSB7CisJCQkqZW5kID0gMDsKKwkJCWVuZCsrOworCQkJaG9zdCsrOworCQl9IGVsc2UKKwkJCWVuZCA9IGhvc3Q7CisJfSBlbHNlCisJCWVuZCA9IGhvc3Q7CisJY29sb24gPSBzdHJjaHIoZW5kLCAnOicpOworCisJaWYgKGNvbG9uKSB7CisJCSpjb2xvbiA9IDA7CisJCXBvcnQgPSBjb2xvbiArIDE7CisJfQorCisJYXJndlswXSA9IGdpdF9wcm94eV9jb21tYW5kOworCWFyZ3ZbMV0gPSBob3N0OworCWFyZ3ZbMl0gPSBwb3J0OworCWFyZ3ZbM10gPSBOVUxMOworCW1lbXNldCgmcHJveHksIDAsIHNpemVvZihwcm94eSkpOworCXByb3h5LmFyZ3YgPSBhcmd2OworCXByb3h5LmluID0gLTE7CisJcHJveHkub3V0ID0gLTE7CisJaWYgKHN0YXJ0X2NvbW1hbmQoJnByb3h5KSkKKwkJZGllKCJjYW5ub3Qgc3RhcnQgcHJveHkgJXMiLCBhcmd2WzBdKTsKKwlmZFswXSA9IHByb3h5Lm91dDsgLyogcmVhZCBmcm9tIHByb3h5IHN0ZG91dCAqLworCWZkWzFdID0gcHJveHkuaW47ICAvKiB3cml0ZSB0byBwcm94eSBzdGRpbiAqLworfQorCisjZGVmaW5lIE1BWF9DTURfTEVOIDEwMjQKKworY2hhciAqZ2V0X3BvcnQoY2hhciAqaG9zdCkKK3sKKwljaGFyICplbmQ7CisJY2hhciAqcCA9IHN0cmNocihob3N0LCAnOicpOworCisJaWYgKHApIHsKKwkJc3RydG9sKHArMSwgJmVuZCwgMTApOworCQlpZiAoKmVuZCA9PSAnXDAnKSB7CisJCQkqcCA9ICdcMCc7CisJCQlyZXR1cm4gcCsxOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2hpbGRfcHJvY2VzcyBub19mb3JrOworCisvKgorICogVGhpcyByZXR1cm5zIGEgZHVtbXkgY2hpbGRfcHJvY2VzcyBpZiB0aGUgdHJhbnNwb3J0IHByb3RvY29sIGRvZXMgbm90CisgKiBuZWVkIGZvcmsoMiksIG9yIGEgc3RydWN0IGNoaWxkX3Byb2Nlc3Mgb2JqZWN0IGlmIGl0IGRvZXMuICBPbmNlIGRvbmUsCisgKiBmaW5pc2ggdGhlIGNvbm5lY3Rpb24gd2l0aCBmaW5pc2hfY29ubmVjdCgpIHdpdGggdGhlIHZhbHVlIHJldHVybmVkIGZyb20KKyAqIHRoaXMgZnVuY3Rpb24gKGl0IGlzIHNhZmUgdG8gY2FsbCBmaW5pc2hfY29ubmVjdCgpIHdpdGggTlVMTCB0byBzdXBwb3J0CisgKiB0aGUgZm9ybWVyIGNhc2UpLgorICoKKyAqIElmIGl0IHJldHVybnMsIHRoZSBjb25uZWN0IGlzIHN1Y2Nlc3NmdWw7IGl0IGp1c3QgZGllcyBvbiBlcnJvcnMgKHRoaXMKKyAqIHdpbGwgaG9wZWZ1bGx5IGJlIGNoYW5nZWQgaW4gYSBsaWJpZmljYXRpb24gZWZmb3J0LCB0byByZXR1cm4gTlVMTCB3aGVuCisgKiB0aGUgY29ubmVjdGlvbiBmYWlsZWQpLgorICovCitzdHJ1Y3QgY2hpbGRfcHJvY2VzcyAqZ2l0X2Nvbm5lY3QoaW50IGZkWzJdLCBjb25zdCBjaGFyICp1cmxfb3JpZywKKwkJCQkgIGNvbnN0IGNoYXIgKnByb2csIGludCBmbGFncykKK3sKKwljaGFyICp1cmwgPSB4c3RyZHVwKHVybF9vcmlnKTsKKwljaGFyICpob3N0LCAqcGF0aCA9IHVybDsKKwljaGFyICplbmQ7CisJaW50IGM7CisJc3RydWN0IGNoaWxkX3Byb2Nlc3MgKmNvbm47CisJZW51bSBwcm90b2NvbCBwcm90b2NvbCA9IFBST1RPX0xPQ0FMOworCWludCBmcmVlX3BhdGggPSAwOworCWNoYXIgKnBvcnQgPSBOVUxMOworCWNvbnN0IGNoYXIgKiphcmc7CisJc3RydWN0IHN0cmJ1ZiBjbWQ7CisKKwkvKiBXaXRob3V0IHRoaXMgd2UgY2Fubm90IHJlbHkgb24gd2FpdHBpZCgpIHRvIHRlbGwKKwkgKiB3aGF0IGhhcHBlbmVkIHRvIG91ciBjaGlsZHJlbi4KKwkgKi8KKwlzaWduYWwoU0lHQ0hMRCwgU0lHX0RGTCk7CisKKwlob3N0ID0gc3Ryc3RyKHVybCwgIjovLyIpOworCWlmKGhvc3QpIHsKKwkJKmhvc3QgPSAnXDAnOworCQlwcm90b2NvbCA9IGdldF9wcm90b2NvbCh1cmwpOworCQlob3N0ICs9IDM7CisJCWMgPSAnLyc7CisJfSBlbHNlIHsKKwkJaG9zdCA9IHVybDsKKwkJYyA9ICc6JzsKKwl9CisKKwlpZiAoaG9zdFswXSA9PSAnWycpIHsKKwkJZW5kID0gc3RyY2hyKGhvc3QgKyAxLCAnXScpOworCQlpZiAoZW5kKSB7CisJCQkqZW5kID0gMDsKKwkJCWVuZCsrOworCQkJaG9zdCsrOworCQl9IGVsc2UKKwkJCWVuZCA9IGhvc3Q7CisJfSBlbHNlCisJCWVuZCA9IGhvc3Q7CisKKwlwYXRoID0gc3RyY2hyKGVuZCwgYyk7CisJaWYgKHBhdGgpIHsKKwkJaWYgKGMgPT0gJzonKSB7CisJCQlwcm90b2NvbCA9IFBST1RPX1NTSDsKKwkJCSpwYXRoKysgPSAnXDAnOworCQl9CisJfSBlbHNlCisJCXBhdGggPSBlbmQ7CisKKwlpZiAoIXBhdGggfHwgISpwYXRoKQorCQlkaWUoIk5vIHBhdGggc3BlY2lmaWVkLiBTZWUgJ21hbiBnaXQtcHVsbCcgZm9yIHZhbGlkIHVybCBzeW50YXgiKTsKKworCS8qCisJICogbnVsbC10ZXJtaW5hdGUgaG9zdG5hbWUgYW5kIHBvaW50IHBhdGggdG8gfiBmb3IgVVJMJ3MgbGlrZSB0aGlzOgorCSAqICAgIHNzaDovL2hvc3QueHovfnVzZXIvcmVwbworCSAqLworCWlmIChwcm90b2NvbCAhPSBQUk9UT19MT0NBTCAmJiBob3N0ICE9IHVybCkgeworCQljaGFyICpwdHIgPSBwYXRoOworCQlpZiAocGF0aFsxXSA9PSAnficpCisJCQlwYXRoKys7CisJCWVsc2UgeworCQkJcGF0aCA9IHhzdHJkdXAocHRyKTsKKwkJCWZyZWVfcGF0aCA9IDE7CisJCX0KKworCQkqcHRyID0gJ1wwJzsKKwl9CisKKwkvKgorCSAqIEFkZCBzdXBwb3J0IGZvciBzc2ggcG9ydDogc3NoOi8vaG9zdC54eTo8cG9ydD4vLi4uCisJICovCisJaWYgKHByb3RvY29sID09IFBST1RPX1NTSCAmJiBob3N0ICE9IHVybCkKKwkJcG9ydCA9IGdldF9wb3J0KGhvc3QpOworCisJaWYgKHByb3RvY29sID09IFBST1RPX0dJVCkgeworCQkvKiBUaGVzZSB1bmRlcmx5aW5nIGNvbm5lY3Rpb24gY29tbWFuZHMgZGllKCkgaWYgdGhleQorCQkgKiBjYW5ub3QgY29ubmVjdC4KKwkJICovCisJCWNoYXIgKnRhcmdldF9ob3N0ID0geHN0cmR1cChob3N0KTsKKwkJaWYgKGdpdF91c2VfcHJveHkoaG9zdCkpCisJCQlnaXRfcHJveHlfY29ubmVjdChmZCwgaG9zdCk7CisJCWVsc2UKKwkJCWdpdF90Y3BfY29ubmVjdChmZCwgaG9zdCwgZmxhZ3MpOworCQkvKgorCQkgKiBTZXBhcmF0ZSBvcmlnaW5hbCBwcm90b2NvbCBjb21wb25lbnRzIHByb2cgYW5kIHBhdGgKKwkJICogZnJvbSBleHRlbmRlZCBjb21wb25lbnRzIHdpdGggYSBOVUwgYnl0ZS4KKwkJICovCisJCXBhY2tldF93cml0ZShmZFsxXSwKKwkJCSAgICAgIiVzICVzJWNob3N0PSVzJWMiLAorCQkJICAgICBwcm9nLCBwYXRoLCAwLAorCQkJICAgICB0YXJnZXRfaG9zdCwgMCk7CisJCWZyZWUodGFyZ2V0X2hvc3QpOworCQlmcmVlKHVybCk7CisJCWlmIChmcmVlX3BhdGgpCisJCQlmcmVlKHBhdGgpOworCQlyZXR1cm4gJm5vX2Zvcms7CisJfQorCisJY29ubiA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpjb25uKSk7CisKKwlzdHJidWZfaW5pdCgmY21kLCBNQVhfQ01EX0xFTik7CisJc3RyYnVmX2FkZHN0cigmY21kLCBwcm9nKTsKKwlzdHJidWZfYWRkY2goJmNtZCwgJyAnKTsKKwlzcV9xdW90ZV9idWYoJmNtZCwgcGF0aCk7CisJaWYgKGNtZC5sZW4gPj0gTUFYX0NNRF9MRU4pCisJCWRpZSgiY29tbWFuZCBsaW5lIHRvbyBsb25nIik7CisKKwljb25uLT5pbiA9IGNvbm4tPm91dCA9IC0xOworCWNvbm4tPmFyZ3YgPSBhcmcgPSB4Y2FsbG9jKDYsIHNpemVvZigqYXJnKSk7CisJaWYgKHByb3RvY29sID09IFBST1RPX1NTSCkgeworCQljb25zdCBjaGFyICpzc2ggPSBnZXRlbnYoIkdJVF9TU0giKTsKKwkJaWYgKCFzc2gpIHNzaCA9ICJzc2giOworCisJCSphcmcrKyA9IHNzaDsKKwkJaWYgKHBvcnQpIHsKKwkJCSphcmcrKyA9ICItcCI7CisJCQkqYXJnKysgPSBwb3J0OworCQl9CisJCSphcmcrKyA9IGhvc3Q7CisJfQorCWVsc2UgeworCQkvKiByZW1vdmUgdGhlc2UgZnJvbSB0aGUgZW52aXJvbm1lbnQgKi8KKwkJY29uc3QgY2hhciAqZW52W10gPSB7CisJCQlBTFRFUk5BVEVfREJfRU5WSVJPTk1FTlQsCisJCQlEQl9FTlZJUk9OTUVOVCwKKwkJCUdJVF9ESVJfRU5WSVJPTk1FTlQsCisJCQlHSVRfV09SS19UUkVFX0VOVklST05NRU5ULAorCQkJR1JBRlRfRU5WSVJPTk1FTlQsCisJCQlJTkRFWF9FTlZJUk9OTUVOVCwKKwkJCU5VTEwKKwkJfTsKKwkJY29ubi0+ZW52ID0gZW52OworCQkqYXJnKysgPSAic2giOworCQkqYXJnKysgPSAiLWMiOworCX0KKwkqYXJnKysgPSBjbWQuYnVmOworCSphcmcgPSBOVUxMOworCisJaWYgKHN0YXJ0X2NvbW1hbmQoY29ubikpCisJCWRpZSgidW5hYmxlIHRvIGZvcmsiKTsKKworCWZkWzBdID0gY29ubi0+b3V0OyAvKiByZWFkIGZyb20gY2hpbGQncyBzdGRvdXQgKi8KKwlmZFsxXSA9IGNvbm4tPmluOyAgLyogd3JpdGUgdG8gY2hpbGQncyBzdGRpbiAqLworCXN0cmJ1Zl9yZWxlYXNlKCZjbWQpOworCWZyZWUodXJsKTsKKwlpZiAoZnJlZV9wYXRoKQorCQlmcmVlKHBhdGgpOworCXJldHVybiBjb25uOworfQorCitpbnQgZmluaXNoX2Nvbm5lY3Qoc3RydWN0IGNoaWxkX3Byb2Nlc3MgKmNvbm4pCit7CisJaW50IGNvZGU7CisJaWYgKCFjb25uIHx8IGNvbm4gPT0gJm5vX2ZvcmspCisJCXJldHVybiAwOworCisJY29kZSA9IGZpbmlzaF9jb21tYW5kKGNvbm4pOworCWZyZWUoY29ubi0+YXJndik7CisJZnJlZShjb25uKTsKKwlyZXR1cm4gY29kZTsKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvUkVBRE1FIGIvY29udHJpYi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVmMjkxYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvUkVBRE1FCkBAIC0wLDAgKzEsNDMgQEAKK0NvbnRyaWJ1dGVkIFNvZnR3YXJlCisKK0FsdGhvdWdoIHRoZXNlIHBpZWNlcyBhcmUgYXZhaWxhYmxlIGFzIHBhcnQgb2YgdGhlIG9mZmljaWFsIGdpdAorc291cmNlIHRyZWUsIHRoZXkgYXJlIGluIHNvbWV3aGF0IGRpZmZlcmVudCBzdGF0dXMuICBUaGUKK2ludGVudGlvbiBpcyB0byBrZWVwIGludGVyZXN0aW5nIHRvb2xzIGFyb3VuZCBnaXQgaGVyZSwgbWF5YmUKK2V2ZW4gZXhwZXJpbWVudGFsIG9uZXMsIHRvIGdpdmUgdXNlcnMgYW4gZWFzaWVyIGFjY2VzcyB0byB0aGVtLAorYW5kIHRvIGdpdmUgdG9vbHMgd2lkZXIgZXhwb3N1cmUsIHNvIHRoYXQgdGhleSBjYW4gYmUgaW1wcm92ZWQKK2Zhc3Rlci4KKworSSBhbSBub3QgZXhwZWN0aW5nIHRvIHRvdWNoIHRoZXNlIG15c2VsZiB0aGF0IG11Y2guICBBcyBmYXIgYXMKK215IGRheS10by1kYXkgb3BlcmF0aW9uIGlzIGNvbmNlcm5lZCwgdGhlc2Ugc3ViZGlyZWN0b3JpZXMgYXJlCitvd25lZCBieSB0aGVpciByZXNwZWN0aXZlIHByaW1hcnkgYXV0aG9ycy4gIEkgYW0gd2lsbGluZyB0byBoZWxwCitpZiB1c2VycyBvZiB0aGVzZSBjb21wb25lbnRzIGFuZCB0aGUgY29udHJpYi8gc3VidHJlZSAib3duZXJzIgoraGF2ZSB0ZWNobmljYWwvZGVzaWduIGlzc3VlcyB0byByZXNvbHZlLCBidXQgdGhlIGluaXRpYXRpdmUgdG8KK2ZpeCBhbmQvb3IgZW5oYW5jZSB0aGluZ3MgX211c3RfIGJlIG9uIHRoZSBzaWRlIG9mIHRoZSBzdWJ0cmVlCitvd25lcnMuICBJT1csIEkgd29uJ3QgYmUgYWN0aXZlbHkgbG9va2luZyBmb3IgYnVncyBhbmQgcm9vbXMgZm9yCitlbmhhbmNlbWVudHMgaW4gdGhlbSBhcyB0aGUgZ2l0IG1haW50YWluZXIgLS0gSSBtYXkgb25seSBkbyBzbworanVzdCBhcyBvbmUgb2YgdGhlIHVzZXJzIHdoZW4gSSB3YW50IHRvIHNjcmF0Y2ggbXkgb3duIGl0Y2guICBJZgoreW91IGhhdmUgcGF0Y2hlcyB0byB0aGluZ3MgaW4gY29udHJpYi8gYXJlYSwgdGhlIHBhdGNoIHNob3VsZCBiZQorZmlyc3Qgc2VudCB0byB0aGUgcHJpbWFyeSBhdXRob3IsIGFuZCB0aGVuIHRoZSBwcmltYXJ5IGF1dGhvcgorc2hvdWxkIGFjayBhbmQgZm9yd2FyZCBpdCB0byBtZSAoZ2l0IHB1bGwgcmVxdWVzdCBpcyBuaWNlcikuCitUaGlzIGlzIHRoZSBzYW1lIHdheSBhcyBob3cgSSBoYXZlIGJlZW4gdHJlYXRpbmcgZ2l0aywgYW5kIHRvIGEKK2xlc3NlciBkZWdyZWUgdmFyaW91cyBmb3JlaWduIFNDTSBpbnRlcmZhY2VzLCBzbyB5b3Uga25vdyB0aGUKK2RyaWxsLgorCitJIGV4cGVjdCB0aGF0IHRoaW5ncyB0aGF0IHN0YXJ0IHRoZWlyIGxpZmUgaW4gdGhlIGNvbnRyaWIvIGFyZWEKK3RvIGdyYWR1YXRlIG91dCBvZiBjb250cmliLyBvbmNlIHRoZXkgbWF0dXJlLCBlaXRoZXIgYnkgYmVjb21pbmcKK3Byb2plY3RzIG9uIHRoZWlyIG93biwgb3IgbW92aW5nIHRvIHRoZSB0b3BsZXZlbCBkaXJlY3RvcnkuICBPbgordGhlIG90aGVyIGhhbmQsIEkgZXhwZWN0IEknbGwgYmUgcHJvcG9zaW5nIHJlbW92YWwgb2YgZGlzdXNlZAorYW5kIGluYWN0aXZlIG9uZXMgZnJvbSB0aW1lIHRvIHRpbWUuCisKK0lmIHlvdSBoYXZlIG5ldyB0aGluZ3MgdG8gYWRkIHRvIHRoaXMgYXJlYSwgcGxlYXNlIGZpcnN0IHByb3Bvc2UKK2l0IG9uIHRoZSBnaXQgbWFpbGluZyBsaXN0LCBhbmQgYWZ0ZXIgYSBsaXN0IGRpc2N1c3Npb24gcHJvdmVzCit0aGVyZSBhcmUgc29tZSBnZW5lcmFsIGludGVyZXN0cyAoaXQgZG9lcyBub3QgaGF2ZSB0byBiZSBhCitsaXN0LXdpZGUgY29uc2Vuc3VzIGZvciBhIHRvb2wgdGFyZ2V0ZWQgdG8gYSByZWxhdGl2ZWx5IG5hcnJvdworYXVkaWVuY2UgLS0gZm9yIGV4YW1wbGUgSSBkbyBub3Qgd29yayB3aXRoIHByb2plY3RzIHdob3NlCit1cHN0cmVhbSBpcyBzdm4sIHNvIEkgaGF2ZSBubyB1c2UgZm9yIGdpdC1zdm4gbXlzZWxmLCBidXQgaXQgaXMKK29mIGdlbmVyYWwgaW50ZXJlc3QgZm9yIHBlb3BsZSB3aG8gbmVlZCB0byBpbnRlcm9wZXJhdGUgd2l0aCBTVk4KK3JlcG9zaXRvcmllcyBpbiBhIHdheSBnaXQtc3ZuIHdvcmtzIGJldHRlciB0aGFuIGdpdC1zdm5pbXBvcnQpLAorc3VibWl0IGEgcGF0Y2ggdG8gY3JlYXRlIGEgc3ViZGlyZWN0b3J5IG9mIGNvbnRyaWIvIGFuZCBwdXQgeW91cgorc3R1ZmYgdGhlcmUuCisKKy1qYwpkaWZmIC0tZ2l0IGEvY29udHJpYi9ibGFtZXZpZXcvUkVBRE1FIGIvY29udHJpYi9ibGFtZXZpZXcvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZGE1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2JsYW1ldmlldy9SRUFETUUKQEAgLTAsMCArMSw5IEBACitUaGlzIGlzIGEgc2FtcGxlIHByb2dyYW0gdG8gdXNlICdnaXQtYmxhbWUgLS1pbmNyZW1lbnRhbCcsIGJhc2VkCitvbiB0aGlzIG1lc3NhZ2UuCisKK0Zyb206IEplZmYgS2luZyA8cGVmZkBwZWZmLm5ldD4KK1N1YmplY3Q6IFJlOiBNb3JlIHByZWNpc2UgdGFnIGZvbGxvd2luZworVG86IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0BsaW51eC1mb3VuZGF0aW9uLm9yZz4KK0NjOiBnaXRAdmdlci5rZXJuZWwub3JnCitEYXRlOiBTYXQsIDI3IEphbiAyMDA3IDE4OjUyOjM4IC0wNTAwCitNZXNzYWdlLUlEOiA8MjAwNzAxMjcyMzUyMzguR0EyODcwNkBjb3JlZHVtcC5pbnRyYS5wZWZmLm5ldD4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvYmxhbWV2aWV3L2JsYW1ldmlldy5wZXJsIGIvY29udHJpYi9ibGFtZXZpZXcvYmxhbWV2aWV3LnBlcmwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWRlYzAwMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvYmxhbWV2aWV3L2JsYW1ldmlldy5wZXJsCkBAIC0wLDAgKzEsMTU1IEBACisjIS91c3IvYmluL3BlcmwKKwordXNlIEd0azIgLWluaXQ7Cit1c2UgR3RrMjo6U2ltcGxlTGlzdDsKKworbXkgJGhhc2g7CitteSAkZm47CitpZiAoIEBBUkdWID09IDEgKSB7CisJJGhhc2ggPSAiSEVBRCI7CisJJGZuID0gc2hpZnQ7Cit9IGVsc2lmICggQEFSR1YgPT0gMiApIHsKKwkkaGFzaCA9IHNoaWZ0OworCSRmbiA9IHNoaWZ0OworfSBlbHNlIHsKKwlkaWUgIlVzYWdlIGJsYW1ldmlldyBbPHJldj5dIDxmaWxlbmFtZT4iOworfQorCitHdGsyOjpSYy0+cGFyc2Vfc3RyaW5nKDw8J0VPUycpOworc3R5bGUgInRyZWV2aWV3X3N0eWxlIgoreworICBHdGtUcmVlVmlldzo6dmVydGljYWwtc2VwYXJhdG9yID0gMAorfQorY2xhc3MgIkd0a1RyZWVWaWV3IiBzdHlsZSAidHJlZXZpZXdfc3R5bGUiCitFT1MKKworbXkgJHdpbmRvdyA9IEd0azI6OldpbmRvdy0+bmV3KCd0b3BsZXZlbCcpOworJHdpbmRvdy0+c2lnbmFsX2Nvbm5lY3QoZGVzdHJveSA9PiBzdWIgeyBHdGsyLT5tYWluX3F1aXQgfSk7CitteSAkdnBhbiA9IEd0azI6OlZQYW5lZC0+bmV3KCk7Ciskd2luZG93LT5hZGQoJHZwYW4pOworbXkgJHNjcm9sbGVkX3dpbmRvdyA9IEd0azI6OlNjcm9sbGVkV2luZG93LT5uZXc7CiskdnBhbi0+cGFjazEoJHNjcm9sbGVkX3dpbmRvdywgMSwgMSk7CitteSAkZmlsZXZpZXcgPSBHdGsyOjpTaW1wbGVMaXN0LT5uZXcoCisgICAgJ0NvbW1pdCcgPT4gJ3RleHQnLAorICAgICdGaWxlTGluZScgPT4gJ3RleHQnLAorICAgICdEYXRhJyA9PiAndGV4dCcKKyk7Ciskc2Nyb2xsZWRfd2luZG93LT5hZGQoJGZpbGV2aWV3KTsKKyRmaWxldmlldy0+Z2V0X2NvbHVtbigwKS0+c2V0X3NwYWNpbmcoMCk7CiskZmlsZXZpZXctPnNldF9zaXplX3JlcXVlc3QoMTAyNCwgNzY4KTsKKyRmaWxldmlldy0+c2V0X3J1bGVzX2hpbnQoMSk7CiskZmlsZXZpZXctPnNpZ25hbF9jb25uZWN0IChyb3dfYWN0aXZhdGVkID0+IHN1YiB7CisJCW15ICgkc2wsICRwYXRoLCAkY29sdW1uKSA9IEBfOworCQlteSAkcm93X3JlZiA9ICRzbC0+Z2V0X3Jvd19kYXRhX2Zyb21fcGF0aCAoJHBhdGgpOworCQlzeXN0ZW0oImJsYW1ldmlldyBAJHJvd19yZWZbMF1+MSAkZm4gJiIpOworCQl9KTsKKworbXkgJGNvbW1pdHdpbmRvdyA9IEd0azI6OlNjcm9sbGVkV2luZG93LT5uZXcoKTsKKyRjb21taXR3aW5kb3ctPnNldF9wb2xpY3kgKCdHVEtfUE9MSUNZX0FVVE9NQVRJQycsJ0dUS19QT0xJQ1lfQVVUT01BVElDJyk7CiskdnBhbi0+cGFjazIoJGNvbW1pdHdpbmRvdywgMSwgMSk7CitteSAkY29tbWl0X3RleHQgPSBHdGsyOjpUZXh0Vmlldy0+bmV3KCk7CitteSAkY29tbWl0X2J1ZmZlciA9IEd0azI6OlRleHRCdWZmZXItPm5ldygpOworJGNvbW1pdF90ZXh0LT5zZXRfYnVmZmVyKCRjb21taXRfYnVmZmVyKTsKKyRjb21taXR3aW5kb3ctPmFkZCgkY29tbWl0X3RleHQpOworCiskZmlsZXZpZXctPnNpZ25hbF9jb25uZWN0IChjdXJzb3JfY2hhbmdlZCA9PiBzdWIgeworCQlteSAoJHNsKSA9IEBfOworCQlteSAoJHBhdGgsICRmb2N1c19jb2x1bW4pID0gJHNsLT5nZXRfY3Vyc29yKCk7CisJCW15ICRyb3dfcmVmID0gJHNsLT5nZXRfcm93X2RhdGFfZnJvbV9wYXRoICgkcGF0aCk7CisJCW15ICRjX2ZoOworCQlvcGVuKCRjX2ZoLCAgJy18JywgImdpdCBjYXQtZmlsZSBjb21taXQgQCRyb3dfcmVmWzBdIikKKwkJCQkJb3IgZGllICJ1bmFibGUgdG8gZmluZCBjb21taXQgQCRyb3dfcmVmWzBdIjsKKwkJbXkgQGJ1ZmZlciA9IDwkY19maD47CisJCSRjb21taXRfYnVmZmVyLT5zZXRfdGV4dCgiQGJ1ZmZlciIpOworCQljbG9zZSgkY19maCk7CisJCX0pOworCitteSAkZmg7CitvcGVuKCRmaCwgJy18JywgImdpdCBjYXQtZmlsZSBibG9iICRoYXNoOiRmbiIpCisgIG9yIGRpZSAidW5hYmxlIHRvIG9wZW4gJGZuOiAkISI7CisKK3doaWxlKDwkZmg+KSB7CisgIGNob21wOworICAkZmlsZXZpZXctPntkYXRhfS0+WyQuXSA9IFsnSEVBRCcsICIkZm46JC4iLCAkX107Cit9CisKK215ICRibGFtZTsKK29wZW4oJGJsYW1lLCAnLXwnLCBxdyhnaXQgYmxhbWUgLS1pbmNyZW1lbnRhbCAtLSksICRmbiwgJGhhc2gpCisgICAgb3IgZGllICJjYW5ub3Qgc3RhcnQgZ2l0LWJsYW1lICRmbiI7CisKK0dsaWI6OklPLT5hZGRfd2F0Y2goZmlsZW5vKCRibGFtZSksICdpbicsIFwmcmVhZF9ibGFtZV9saW5lKTsKKworJHdpbmRvdy0+c2hvd19hbGw7CitHdGsyLT5tYWluOworZXhpdCAwOworCitteSAlY29tbWl0aW5mbyA9ICgpOworCitzdWIgZmx1c2hfYmxhbWVfbGluZSB7CisJbXkgKCRhdHRyKSA9IEBfOworCisJcmV0dXJuIHVubGVzcyBkZWZpbmVkICRhdHRyOworCisJbXkgKCRjb21taXQsICRzX2xubywgJGxubywgJGNudCkgPQorCSAgICBAeyRhdHRyfXtxdyhDT01NSVQgU19MTk8gTE5PIENOVCl9OworCisJbXkgKCRmaWxlbmFtZSwgJGF1dGhvciwgJGF1dGhvcl90aW1lLCAkYXV0aG9yX3R6KSA9CisJICAgIEB7JGNvbW1pdGluZm97JGNvbW1pdH19e3F3KEZJTEVOQU1FIEFVVEhPUiBBVVRIT1ItVElNRSBBVVRIT1ItVFopfTsKKwlteSAkaW5mbyA9ICRhdXRob3IgLiAnICcgLiBmb3JtYXRfdGltZSgkYXV0aG9yX3RpbWUsICRhdXRob3JfdHopOworCisJZm9yKG15ICRpID0gMDsgJGkgPCAkY250OyAkaSsrKSB7CisJCUB7JGZpbGV2aWV3LT57ZGF0YX0tPlskbG5vKyRpLTFdfVswLDEsMl0gPQorCQkoc3Vic3RyKCRjb21taXQsIDAsIDgpLCAkZmlsZW5hbWUgLiAnOicgLiAoJHNfbG5vKyRpKSk7CisJfQorfQorCitteSAkYnVmOworbXkgJGN1cnJlbnQ7CitzdWIgcmVhZF9ibGFtZV9saW5lIHsKKworCW15ICRyID0gc3lzcmVhZCgkYmxhbWUsICRidWYsIDEwMjQsIGxlbmd0aCgkYnVmKSk7CisJZGllICJJL08gZXJyb3IiIHVubGVzcyBkZWZpbmVkICRyOworCisJaWYgKCRyID09IDApIHsKKwkJZmx1c2hfYmxhbWVfbGluZSgkY3VycmVudCk7CisJCSRjdXJyZW50ID0gdW5kZWY7CisJCXJldHVybiAwOworCX0KKworCXdoaWxlICgkYnVmID1+IHMvKFteXG5dKilcbi8vKSB7CisJCW15ICRsaW5lID0gJDE7CisKKwkJaWYgKCgkY29tbWl0LCAkc19sbm8sICRsbm8sICRjbnQpID0KKwkJICAgICgkbGluZSA9fiAvXihbMC05YS1mXXs0MH0pIChcZCspIChcZCspIChcZCspJC8pKSB7CisJCQlmbHVzaF9ibGFtZV9saW5lKCRjdXJyZW50KTsKKwkJCSRjdXJyZW50ID0gK3sKKwkJCQlDT01NSVQgPT4gJDEsCisJCQkJU19MTk8gPT4gJDIsCisJCQkJTE5PID0+ICQzLAorCQkJCUNOVCA9PiAkNCwKKwkJCX07CisJCQluZXh0OworCQl9CisKKwkJIyBleHRlbmRlZCBhdHRyaWJ1dGUgdmFsdWVzCisJCWlmICgkbGluZSA9fiAvXihhdXRob3J8YXV0aG9yLW1haWx8YXV0aG9yLXRpbWV8YXV0aG9yLXR6fGNvbW1pdHRlcnxjb21taXR0ZXItbWFpbHxjb21taXR0ZXItdGltZXxjb21taXR0ZXItdHp8c3VtbWFyeXxmaWxlbmFtZSkgKC4qKSQvKSB7CisJCQlteSAkY29tbWl0ID0gJGN1cnJlbnQtPntDT01NSVR9OworCQkJJGNvbW1pdGluZm97JGNvbW1pdH17dWMoJDEpfSA9ICQyOworCQkJbmV4dDsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworc3ViIGZvcm1hdF90aW1lIHsKKyAgbXkgJHRpbWUgPSBzaGlmdDsKKyAgbXkgJHR6ID0gc2hpZnQ7CisKKyAgbXkgJG1pbnV0ZXMgPSAkdHogPCAwID8gMC0kdHogOiAkdHo7CisgICRtaW51dGVzID0gKCRtaW51dGVzIC8gMTAwKSo2MCArICgkbWludXRlcyAlIDEwMCk7CisgICRtaW51dGVzID0gJHR6IDwgMCA/IDAtJG1pbnV0ZXMgOiAkbWludXRlczsKKyAgJHRpbWUgKz0gJG1pbnV0ZXMgKiA2MDsKKyAgbXkgQHQgPSBnbXRpbWUoJHRpbWUpOworICByZXR1cm4gc3ByaW50ZignJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQgJXMnLAorCQkgJHRbNV0gKyAxOTAwLCBAdFs0LDMsMiwxLDBdLCAkdHopOworfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9jb21wbGV0aW9uL2dpdC1jb21wbGV0aW9uLmJhc2ggYi9jb250cmliL2NvbXBsZXRpb24vZ2l0LWNvbXBsZXRpb24uYmFzaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZDgxOTYzCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9jb21wbGV0aW9uL2dpdC1jb21wbGV0aW9uLmJhc2gKQEAgLTAsMCArMSwxNDE4IEBACisjCisjIGJhc2ggY29tcGxldGlvbiBzdXBwb3J0IGZvciBjb3JlIEdpdC4KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA2LDIwMDcgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPgorIyBDb25jZXB0dWFsbHkgYmFzZWQgb24gZ2l0Y29tcGxldGlvbiAoaHR0cDovL2dpdHdlYi5oYXdhZ2Eub3JnLnVrLykuCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLjAuCisjCisjIFRoZSBjb250YWluZWQgY29tcGxldGlvbiByb3V0aW5lcyBwcm92aWRlIHN1cHBvcnQgZm9yIGNvbXBsZXRpbmc6CisjCisjICAgICopIGxvY2FsIGFuZCByZW1vdGUgYnJhbmNoIG5hbWVzCisjICAgICopIGxvY2FsIGFuZCByZW1vdGUgdGFnIG5hbWVzCisjICAgICopIC5naXQvcmVtb3RlcyBmaWxlIG5hbWVzCisjICAgICopIGdpdCAnc3ViY29tbWFuZHMnCisjICAgICopIHRyZWUgcGF0aHMgd2l0aGluICdyZWY6cGF0aC90by9maWxlJyBleHByZXNzaW9ucworIyAgICAqKSBjb21tb24gLS1sb25nLW9wdGlvbnMKKyMKKyMgVG8gdXNlIHRoZXNlIHJvdXRpbmVzOgorIworIyAgICAxKSBDb3B5IHRoaXMgZmlsZSB0byBzb21ld2hlcmUgKGUuZy4gfi8uZ2l0LWNvbXBsZXRpb24uc2gpLgorIyAgICAyKSBBZGRlZCB0aGUgZm9sbG93aW5nIGxpbmUgdG8geW91ciAuYmFzaHJjOgorIyAgICAgICAgc291cmNlIH4vLmdpdC1jb21wbGV0aW9uLnNoCisjCisjICAgIDMpIFlvdSBtYXkgd2FudCB0byBtYWtlIHN1cmUgdGhlIGdpdCBleGVjdXRhYmxlIGlzIGF2YWlsYWJsZQorIyAgICAgICBpbiB5b3VyIFBBVEggYmVmb3JlIHRoaXMgc2NyaXB0IGlzIHNvdXJjZWQsIGFzIHNvbWUgY2FjaGluZworIyAgICAgICBpcyBwZXJmb3JtZWQgd2hpbGUgdGhlIHNjcmlwdCBsb2Fkcy4gIElmIGdpdCBpc24ndCBmb3VuZAorIyAgICAgICBhdCBzb3VyY2UgdGltZSB0aGVuIGFsbCBsb29rdXBzIHdpbGwgYmUgZG9uZSBvbiBkZW1hbmQsCisjICAgICAgIHdoaWNoIG1heSBiZSBzbGlnaHRseSBzbG93ZXIuCisjCisjICAgIDQpIENvbnNpZGVyIGNoYW5naW5nIHlvdXIgUFMxIHRvIGFsc28gc2hvdyB0aGUgY3VycmVudCBicmFuY2g6CisjICAgICAgICBQUzE9J1tcdUBcaCBcVyQoX19naXRfcHMxICIgKCVzKSIpXVwkICcKKyMKKyMgICAgICAgVGhlIGFyZ3VtZW50IHRvIF9fZ2l0X3BzMSB3aWxsIGJlIGRpc3BsYXllZCBvbmx5IGlmIHlvdQorIyAgICAgICBhcmUgY3VycmVudGx5IGluIGEgZ2l0IHJlcG9zaXRvcnkuICBUaGUgJXMgdG9rZW4gd2lsbCBiZQorIyAgICAgICB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBicmFuY2guCisjCisjIFRvIHN1Ym1pdCBwYXRjaGVzOgorIworIyAgICAqKSBSZWFkIERvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMKKyMgICAgKikgU2VuZCBhbGwgcGF0Y2hlcyB0byB0aGUgY3VycmVudCBtYWludGFpbmVyOgorIworIyAgICAgICAiU2hhd24gTy4gUGVhcmNlIiA8c3BlYXJjZUBzcGVhcmNlLm9yZz4KKyMKKyMgICAgKikgQWx3YXlzIENDIHRoZSBHaXQgbWFpbGluZyBsaXN0OgorIworIyAgICAgICBnaXRAdmdlci5rZXJuZWwub3JnCisjCisKK19fZ2l0ZGlyICgpCit7CisJaWYgWyAteiAiJDEiIF07IHRoZW4KKwkJaWYgWyAtbiAiJF9fZ2l0X2RpciIgXTsgdGhlbgorCQkJZWNobyAiJF9fZ2l0X2RpciIKKwkJZWxpZiBbIC1kIC5naXQgXTsgdGhlbgorCQkJZWNobyAuZ2l0CisJCWVsc2UKKwkJCWdpdCByZXYtcGFyc2UgLS1naXQtZGlyIDI+L2Rldi9udWxsCisJCWZpCisJZWxpZiBbIC1kICIkMS8uZ2l0IiBdOyB0aGVuCisJCWVjaG8gIiQxLy5naXQiCisJZWxzZQorCQllY2hvICIkMSIKKwlmaQorfQorCitfX2dpdF9wczEgKCkKK3sKKwlsb2NhbCBnPSIkKGdpdCByZXYtcGFyc2UgLS1naXQtZGlyIDI+L2Rldi9udWxsKSIKKwlpZiBbIC1uICIkZyIgXTsgdGhlbgorCQlsb2NhbCByCisJCWxvY2FsIGIKKwkJaWYgWyAtZCAiJGcvLi4vLmRvdGVzdCIgXQorCQl0aGVuCisJCQlpZiB0ZXN0IC1mICIkZy8uLi8uZG90ZXN0L3JlYmFzaW5nIgorCQkJdGhlbgorCQkJCXI9InxSRUJBU0UiCisJCQllbGlmIHRlc3QgLWYgIiRnLy4uLy5kb3Rlc3QvYXBwbHlpbmciCisJCQl0aGVuCisJCQkJcj0ifEFNIgorCQkJZWxzZQorCQkJCXI9InxBTS9SRUJBU0UiCisJCQlmaQorCQkJYj0iJChnaXQgc3ltYm9saWMtcmVmIEhFQUQgMj4vZGV2L251bGwpIgorCQllbGlmIFsgLWYgIiRnLy5kb3Rlc3QtbWVyZ2UvaW50ZXJhY3RpdmUiIF0KKwkJdGhlbgorCQkJcj0ifFJFQkFTRS1pIgorCQkJYj0iJChjYXQgIiRnLy5kb3Rlc3QtbWVyZ2UvaGVhZC1uYW1lIikiCisJCWVsaWYgWyAtZCAiJGcvLmRvdGVzdC1tZXJnZSIgXQorCQl0aGVuCisJCQlyPSJ8UkVCQVNFLW0iCisJCQliPSIkKGNhdCAiJGcvLmRvdGVzdC1tZXJnZS9oZWFkLW5hbWUiKSIKKwkJZWxpZiBbIC1mICIkZy9NRVJHRV9IRUFEIiBdCisJCXRoZW4KKwkJCXI9InxNRVJHSU5HIgorCQkJYj0iJChnaXQgc3ltYm9saWMtcmVmIEhFQUQgMj4vZGV2L251bGwpIgorCQllbHNlCisJCQlpZiBbIC1mICIkZy9CSVNFQ1RfTE9HIiBdCisJCQl0aGVuCisJCQkJcj0ifEJJU0VDVElORyIKKwkJCWZpCisJCQlpZiAhIGI9IiQoZ2l0IHN5bWJvbGljLXJlZiBIRUFEIDI+L2Rldi9udWxsKSIKKwkJCXRoZW4KKwkJCQlpZiAhIGI9IiQoZ2l0IGRlc2NyaWJlIC0tZXhhY3QtbWF0Y2ggSEVBRCAyPi9kZXYvbnVsbCkiCisJCQkJdGhlbgorCQkJCQliPSIkKGN1dCAtYzEtNyAiJGcvSEVBRCIpLi4uIgorCQkJCWZpCisJCQlmaQorCQlmaQorCisJCWlmIFsgLW4gIiQxIiBdOyB0aGVuCisJCQlwcmludGYgIiQxIiAiJHtiIyNyZWZzL2hlYWRzL30kciIKKwkJZWxzZQorCQkJcHJpbnRmICIgKCVzKSIgIiR7YiMjcmVmcy9oZWFkcy99JHIiCisJCWZpCisJZmkKK30KKworX19naXRjb21wICgpCit7CisJbG9jYWwgYWxsIGMgcz0kJ1xuJyBJRlM9JyAnJCdcdCckJ1xuJworCWxvY2FsIGN1cj0iJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfSIKKwlpZiBbICQjIC1ndCAyIF07IHRoZW4KKwkJY3VyPSIkMyIKKwlmaQorCWNhc2UgIiRjdXIiIGluCisJLS0qPSkKKwkJQ09NUFJFUExZPSgpCisJCXJldHVybgorCQk7OworCSopCisJCWZvciBjIGluICQxOyBkbworCQkJY2FzZSAiJGMkNCIgaW4KKwkJCS0tKj0qKSBhbGw9IiRhbGwkYyQ0JHMiIDs7CisJCQkqLikgICAgYWxsPSIkYWxsJGMkNCRzIiA7OworCQkJKikgICAgIGFsbD0iJGFsbCRjJDQgJHMiIDs7CisJCQllc2FjCisJCWRvbmUKKwkJOzsKKwllc2FjCisJSUZTPSRzCisJQ09NUFJFUExZPSgkKGNvbXBnZW4gLVAgIiQyIiAtVyAiJGFsbCIgLS0gIiRjdXIiKSkKKwlyZXR1cm4KK30KKworX19naXRfaGVhZHMgKCkKK3sKKwlsb2NhbCBjbWQgaSBpc19oYXNoPXkgZGlyPSIkKF9fZ2l0ZGlyICIkMSIpIgorCWlmIFsgLWQgIiRkaXIiIF07IHRoZW4KKwkJZm9yIGkgaW4gJChnaXQgLS1naXQtZGlyPSIkZGlyIiBcCisJCQlmb3ItZWFjaC1yZWYgLS1mb3JtYXQ9JyUocmVmbmFtZSknIFwKKwkJCXJlZnMvaGVhZHMgKTsgZG8KKwkJCWVjaG8gIiR7aSNyZWZzL2hlYWRzL30iCisJCWRvbmUKKwkJcmV0dXJuCisJZmkKKwlmb3IgaSBpbiAkKGdpdC1scy1yZW1vdGUgIiQxIiAyPi9kZXYvbnVsbCk7IGRvCisJCWNhc2UgIiRpc19oYXNoLCRpIiBpbgorCQl5LCopIGlzX2hhc2g9biA7OworCQluLCpee30pIGlzX2hhc2g9eSA7OworCQluLHJlZnMvaGVhZHMvKikgaXNfaGFzaD15OyBlY2hvICIke2kjcmVmcy9oZWFkcy99IiA7OworCQluLCopIGlzX2hhc2g9eTsgZWNobyAiJGkiIDs7CisJCWVzYWMKKwlkb25lCit9CisKK19fZ2l0X3RhZ3MgKCkKK3sKKwlsb2NhbCBjbWQgaSBpc19oYXNoPXkgZGlyPSIkKF9fZ2l0ZGlyICIkMSIpIgorCWlmIFsgLWQgIiRkaXIiIF07IHRoZW4KKwkJZm9yIGkgaW4gJChnaXQgLS1naXQtZGlyPSIkZGlyIiBcCisJCQlmb3ItZWFjaC1yZWYgLS1mb3JtYXQ9JyUocmVmbmFtZSknIFwKKwkJCXJlZnMvdGFncyApOyBkbworCQkJZWNobyAiJHtpI3JlZnMvdGFncy99IgorCQlkb25lCisJCXJldHVybgorCWZpCisJZm9yIGkgaW4gJChnaXQtbHMtcmVtb3RlICIkMSIgMj4vZGV2L251bGwpOyBkbworCQljYXNlICIkaXNfaGFzaCwkaSIgaW4KKwkJeSwqKSBpc19oYXNoPW4gOzsKKwkJbiwqXnt9KSBpc19oYXNoPXkgOzsKKwkJbixyZWZzL3RhZ3MvKikgaXNfaGFzaD15OyBlY2hvICIke2kjcmVmcy90YWdzL30iIDs7CisJCW4sKikgaXNfaGFzaD15OyBlY2hvICIkaSIgOzsKKwkJZXNhYworCWRvbmUKK30KKworX19naXRfcmVmcyAoKQoreworCWxvY2FsIGNtZCBpIGlzX2hhc2g9eSBkaXI9IiQoX19naXRkaXIgIiQxIikiCisJaWYgWyAtZCAiJGRpciIgXTsgdGhlbgorCQlpZiBbIC1lICIkZGlyL0hFQUQiIF07IHRoZW4gZWNobyBIRUFEOyBmaQorCQlmb3IgaSBpbiAkKGdpdCAtLWdpdC1kaXI9IiRkaXIiIFwKKwkJCWZvci1lYWNoLXJlZiAtLWZvcm1hdD0nJShyZWZuYW1lKScgXAorCQkJcmVmcy90YWdzIHJlZnMvaGVhZHMgcmVmcy9yZW1vdGVzKTsgZG8KKwkJCWNhc2UgIiRpIiBpbgorCQkJCXJlZnMvdGFncy8qKSAgICBlY2hvICIke2kjcmVmcy90YWdzL30iIDs7CisJCQkJcmVmcy9oZWFkcy8qKSAgIGVjaG8gIiR7aSNyZWZzL2hlYWRzL30iIDs7CisJCQkJcmVmcy9yZW1vdGVzLyopIGVjaG8gIiR7aSNyZWZzL3JlbW90ZXMvfSIgOzsKKwkJCQkqKSAgICAgICAgICAgICAgZWNobyAiJGkiIDs7CisJCQllc2FjCisJCWRvbmUKKwkJcmV0dXJuCisJZmkKKwlmb3IgaSBpbiAkKGdpdC1scy1yZW1vdGUgIiRkaXIiIDI+L2Rldi9udWxsKTsgZG8KKwkJY2FzZSAiJGlzX2hhc2gsJGkiIGluCisJCXksKikgaXNfaGFzaD1uIDs7CisJCW4sKl57fSkgaXNfaGFzaD15IDs7CisJCW4scmVmcy90YWdzLyopIGlzX2hhc2g9eTsgZWNobyAiJHtpI3JlZnMvdGFncy99IiA7OworCQluLHJlZnMvaGVhZHMvKikgaXNfaGFzaD15OyBlY2hvICIke2kjcmVmcy9oZWFkcy99IiA7OworCQluLHJlZnMvcmVtb3Rlcy8qKSBpc19oYXNoPXk7IGVjaG8gIiR7aSNyZWZzL3JlbW90ZXMvfSIgOzsKKwkJbiwqKSBpc19oYXNoPXk7IGVjaG8gIiRpIiA7OworCQllc2FjCisJZG9uZQorfQorCitfX2dpdF9yZWZzMiAoKQoreworCWxvY2FsIGkKKwlmb3IgaSBpbiAkKF9fZ2l0X3JlZnMgIiQxIik7IGRvCisJCWVjaG8gIiRpOiRpIgorCWRvbmUKK30KKworX19naXRfcmVmc19yZW1vdGVzICgpCit7CisJbG9jYWwgY21kIGkgaXNfaGFzaD15CisJZm9yIGkgaW4gJChnaXQtbHMtcmVtb3RlICIkMSIgMj4vZGV2L251bGwpOyBkbworCQljYXNlICIkaXNfaGFzaCwkaSIgaW4KKwkJbixyZWZzL2hlYWRzLyopCisJCQlpc19oYXNoPXkKKwkJCWVjaG8gIiRpOnJlZnMvcmVtb3Rlcy8kMS8ke2kjcmVmcy9oZWFkcy99IgorCQkJOzsKKwkJeSwqKSBpc19oYXNoPW4gOzsKKwkJbiwqXnt9KSBpc19oYXNoPXkgOzsKKwkJbixyZWZzL3RhZ3MvKikgaXNfaGFzaD15OzsKKwkJbiwqKSBpc19oYXNoPXk7IDs7CisJCWVzYWMKKwlkb25lCit9CisKK19fZ2l0X3JlbW90ZXMgKCkKK3sKKwlsb2NhbCBpIG5nb2ZmIElGUz0kJ1xuJyBkPSIkKF9fZ2l0ZGlyKSIKKwlzaG9wdCAtcSBudWxsZ2xvYiB8fCBuZ29mZj0xCisJc2hvcHQgLXMgbnVsbGdsb2IKKwlmb3IgaSBpbiAiJGQvcmVtb3RlcyIvKjsgZG8KKwkJZWNobyAke2kjJGQvcmVtb3Rlcy99CisJZG9uZQorCVsgIiRuZ29mZiIgXSAmJiBzaG9wdCAtdSBudWxsZ2xvYgorCWZvciBpIGluICQoZ2l0IC0tZ2l0LWRpcj0iJGQiIGNvbmZpZyAtLWxpc3QpOyBkbworCQljYXNlICIkaSIgaW4KKwkJcmVtb3RlLioudXJsPSopCisJCQlpPSIke2kjcmVtb3RlLn0iCisJCQllY2hvICIke2kvLnVybD0qL30iCisJCQk7OworCQllc2FjCisJZG9uZQorfQorCitfX2dpdF9tZXJnZV9zdHJhdGVnaWVzICgpCit7CisJaWYgWyAtbiAiJF9fZ2l0X21lcmdlX3N0cmF0ZWd5bGlzdCIgXTsgdGhlbgorCQllY2hvICIkX19naXRfbWVyZ2Vfc3RyYXRlZ3lsaXN0IgorCQlyZXR1cm4KKwlmaQorCXNlZCAtbiAiL15hbGxfc3RyYXRlZ2llcz0nL3sKKwkJcy9eYWxsX3N0cmF0ZWdpZXM9Jy8vCisJCXMvJy8vCisJCXAKKwkJcQorCQl9IiAiJChnaXQgLS1leGVjLXBhdGgpL2dpdC1tZXJnZSIKK30KK19fZ2l0X21lcmdlX3N0cmF0ZWd5bGlzdD0KK19fZ2l0X21lcmdlX3N0cmF0ZWd5bGlzdD0iJChfX2dpdF9tZXJnZV9zdHJhdGVnaWVzIDI+L2Rldi9udWxsKSIKKworX19naXRfY29tcGxldGVfZmlsZSAoKQoreworCWxvY2FsIHBmeCBscyByZWYgY3VyPSIke0NPTVBfV09SRFNbQ09NUF9DV09SRF19IgorCWNhc2UgIiRjdXIiIGluCisJPyo6KikKKwkJcmVmPSIke2N1ciUlOip9IgorCQljdXI9IiR7Y3VyIyo6fSIKKwkJY2FzZSAiJGN1ciIgaW4KKwkJPyovKikKKwkJCXBmeD0iJHtjdXIlLyp9IgorCQkJY3VyPSIke2N1ciMjKi99IgorCQkJbHM9IiRyZWY6JHBmeCIKKwkJCXBmeD0iJHBmeC8iCisJCQk7OworCQkqKQorCQkJbHM9IiRyZWYiCisJCQk7OworCSAgICBlc2FjCisJCUNPTVBSRVBMWT0oJChjb21wZ2VuIC1QICIkcGZ4IiBcCisJCQktVyAiJChnaXQgLS1naXQtZGlyPSIkKF9fZ2l0ZGlyKSIgbHMtdHJlZSAiJGxzIiBcCisJCQkJfCBzZWQgJy9eMTAwLi4uIGJsb2IgL3MsXi4qCSwsCisJCQkJICAgICAgIC9eMDQwMDAwIHRyZWUgL3sKKwkJCQkgICAgICAgICAgIHMsXi4qCSwsCisJCQkJICAgICAgICAgICBzLCQsLywKKwkJCQkgICAgICAgfQorCQkJCSAgICAgICBzL14uKgkvLycpIiBcCisJCQktLSAiJGN1ciIpKQorCQk7OworCSopCisJCV9fZ2l0Y29tcCAiJChfX2dpdF9yZWZzKSIKKwkJOzsKKwllc2FjCit9CisKK19fZ2l0X2NvbXBsZXRlX3Jldmxpc3QgKCkKK3sKKwlsb2NhbCBwZnggY3VyPSIke0NPTVBfV09SRFNbQ09NUF9DV09SRF19IgorCWNhc2UgIiRjdXIiIGluCisJKi4uLiopCisJCXBmeD0iJHtjdXIlLi4uKn0uLi4iCisJCWN1cj0iJHtjdXIjKi4uLn0iCisJCV9fZ2l0Y29tcCAiJChfX2dpdF9yZWZzKSIgIiRwZngiICIkY3VyIgorCQk7OworCSouLiopCisJCXBmeD0iJHtjdXIlLi4qfS4uIgorCQljdXI9IiR7Y3VyIyouLn0iCisJCV9fZ2l0Y29tcCAiJChfX2dpdF9yZWZzKSIgIiRwZngiICIkY3VyIgorCQk7OworCSouKQorCQlfX2dpdGNvbXAgIiRjdXIuIgorCQk7OworCSopCisJCV9fZ2l0Y29tcCAiJChfX2dpdF9yZWZzKSIKKwkJOzsKKwllc2FjCit9CisKK19fZ2l0X2NvbW1hbmRzICgpCit7CisJaWYgWyAtbiAiJF9fZ2l0X2NvbW1hbmRsaXN0IiBdOyB0aGVuCisJCWVjaG8gIiRfX2dpdF9jb21tYW5kbGlzdCIKKwkJcmV0dXJuCisJZmkKKwlsb2NhbCBpIElGUz0iICIkJ1xuJworCWZvciBpIGluICQoZ2l0IGhlbHAgLWF8ZWdyZXAgJ14gJykKKwlkbworCQljYXNlICRpIGluCisJCSotLSopICAgICAgICAgICAgIDogaGVscGVyIHBhdHRlcm47OworCQlhcHBseW1ib3gpICAgICAgICA6IGFzayBnaXR0dXM7OworCQlhcHBseXBhdGNoKSAgICAgICA6IGFzayBnaXR0dXM7OworCQlhcmNoaW1wb3J0KSAgICAgICA6IGltcG9ydDs7CisJCWNhdC1maWxlKSAgICAgICAgIDogcGx1bWJpbmc7OworCQljaGVjay1hdHRyKSAgICAgICA6IHBsdW1iaW5nOzsKKwkJY2hlY2stcmVmLWZvcm1hdCkgOiBwbHVtYmluZzs7CisJCWNvbW1pdC10cmVlKSAgICAgIDogcGx1bWJpbmc7OworCQljdnNleHBvcnRjb21taXQpICA6IGV4cG9ydDs7CisJCWN2c2ltcG9ydCkgICAgICAgIDogaW1wb3J0OzsKKwkJY3Zzc2VydmVyKSAgICAgICAgOiBkYWVtb247OworCQlkYWVtb24pICAgICAgICAgICA6IGRhZW1vbjs7CisJCWRpZmYtZmlsZXMpICAgICAgIDogcGx1bWJpbmc7OworCQlkaWZmLWluZGV4KSAgICAgICA6IHBsdW1iaW5nOzsKKwkJZGlmZi10cmVlKSAgICAgICAgOiBwbHVtYmluZzs7CisJCWZhc3QtaW1wb3J0KSAgICAgIDogaW1wb3J0OzsKKwkJZnNjay1vYmplY3RzKSAgICAgOiBwbHVtYmluZzs7CisJCWZldGNoLXBhY2spICAgICAgIDogcGx1bWJpbmc7OworCQlmbXQtbWVyZ2UtbXNnKSAgICA6IHBsdW1iaW5nOzsKKwkJZm9yLWVhY2gtcmVmKSAgICAgOiBwbHVtYmluZzs7CisJCWhhc2gtb2JqZWN0KSAgICAgIDogcGx1bWJpbmc7OworCQlodHRwLSopICAgICAgICAgICA6IHRyYW5zcG9ydDs7CisJCWluZGV4LXBhY2spICAgICAgIDogcGx1bWJpbmc7OworCQlpbml0LWRiKSAgICAgICAgICA6IGRlcHJlY2F0ZWQ7OworCQlsb2NhbC1mZXRjaCkgICAgICA6IHBsdW1iaW5nOzsKKwkJbWFpbGluZm8pICAgICAgICAgOiBwbHVtYmluZzs7CisJCW1haWxzcGxpdCkgICAgICAgIDogcGx1bWJpbmc7OworCQltZXJnZS0qKSAgICAgICAgICA6IHBsdW1iaW5nOzsKKwkJbWt0cmVlKSAgICAgICAgICAgOiBwbHVtYmluZzs7CisJCW1rdGFnKSAgICAgICAgICAgIDogcGx1bWJpbmc7OworCQlwYWNrLW9iamVjdHMpICAgICA6IHBsdW1iaW5nOzsKKwkJcGFjay1yZWR1bmRhbnQpICAgOiBwbHVtYmluZzs7CisJCXBhY2stcmVmcykgICAgICAgIDogcGx1bWJpbmc7OworCQlwYXJzZS1yZW1vdGUpICAgICA6IHBsdW1iaW5nOzsKKwkJcGF0Y2gtaWQpICAgICAgICAgOiBwbHVtYmluZzs7CisJCXBlZWstcmVtb3RlKSAgICAgIDogcGx1bWJpbmc7OworCQlwcnVuZSkgICAgICAgICAgICA6IHBsdW1iaW5nOzsKKwkJcHJ1bmUtcGFja2VkKSAgICAgOiBwbHVtYmluZzs7CisJCXF1aWx0aW1wb3J0KSAgICAgIDogaW1wb3J0OzsKKwkJcmVhZC10cmVlKSAgICAgICAgOiBwbHVtYmluZzs7CisJCXJlY2VpdmUtcGFjaykgICAgIDogcGx1bWJpbmc7OworCQlyZWZsb2cpICAgICAgICAgICA6IHBsdW1iaW5nOzsKKwkJcmVwby1jb25maWcpICAgICAgOiBkZXByZWNhdGVkOzsKKwkJcmVyZXJlKSAgICAgICAgICAgOiBwbHVtYmluZzs7CisJCXJldi1saXN0KSAgICAgICAgIDogcGx1bWJpbmc7OworCQlyZXYtcGFyc2UpICAgICAgICA6IHBsdW1iaW5nOzsKKwkJcnVuc3RhdHVzKSAgICAgICAgOiBwbHVtYmluZzs7CisJCXNoLXNldHVwKSAgICAgICAgIDogaW50ZXJuYWw7OworCQlzaGVsbCkgICAgICAgICAgICA6IGRhZW1vbjs7CisJCXNlbmQtcGFjaykgICAgICAgIDogcGx1bWJpbmc7OworCQlzaG93LWluZGV4KSAgICAgICA6IHBsdW1iaW5nOzsKKwkJc3NoLSopICAgICAgICAgICAgOiB0cmFuc3BvcnQ7OworCQlzdHJpcHNwYWNlKSAgICAgICA6IHBsdW1iaW5nOzsKKwkJc3ltYm9saWMtcmVmKSAgICAgOiBwbHVtYmluZzs7CisJCXRhci10cmVlKSAgICAgICAgIDogZGVwcmVjYXRlZDs7CisJCXVucGFjay1maWxlKSAgICAgIDogcGx1bWJpbmc7OworCQl1bnBhY2stb2JqZWN0cykgICA6IHBsdW1iaW5nOzsKKwkJdXBkYXRlLWluZGV4KSAgICAgOiBwbHVtYmluZzs7CisJCXVwZGF0ZS1yZWYpICAgICAgIDogcGx1bWJpbmc7OworCQl1cGRhdGUtc2VydmVyLWluZm8pIDogZGFlbW9uOzsKKwkJdXBsb2FkLWFyY2hpdmUpICAgOiBwbHVtYmluZzs7CisJCXVwbG9hZC1wYWNrKSAgICAgIDogcGx1bWJpbmc7OworCQl3cml0ZS10cmVlKSAgICAgICA6IHBsdW1iaW5nOzsKKwkJdmVyaWZ5LXRhZykgICAgICAgOiBwbHVtYmluZzs7CisJCSopIGVjaG8gJGk7OworCQllc2FjCisJZG9uZQorfQorX19naXRfY29tbWFuZGxpc3Q9CitfX2dpdF9jb21tYW5kbGlzdD0iJChfX2dpdF9jb21tYW5kcyAyPi9kZXYvbnVsbCkiCisKK19fZ2l0X2FsaWFzZXMgKCkKK3sKKwlsb2NhbCBpIElGUz0kJ1xuJworCWZvciBpIGluICQoZ2l0IC0tZ2l0LWRpcj0iJChfX2dpdGRpcikiIGNvbmZpZyAtLWxpc3QpOyBkbworCQljYXNlICIkaSIgaW4KKwkJYWxpYXMuKikKKwkJCWk9IiR7aSNhbGlhcy59IgorCQkJZWNobyAiJHtpLz0qL30iCisJCQk7OworCQllc2FjCisJZG9uZQorfQorCitfX2dpdF9hbGlhc2VkX2NvbW1hbmQgKCkKK3sKKwlsb2NhbCB3b3JkIGNtZGxpbmU9JChnaXQgLS1naXQtZGlyPSIkKF9fZ2l0ZGlyKSIgXAorCQljb25maWcgLS1nZXQgImFsaWFzLiQxIikKKwlmb3Igd29yZCBpbiAkY21kbGluZTsgZG8KKwkJaWYgWyAiJHt3b3JkIyMtKn0iIF07IHRoZW4KKwkJCWVjaG8gJHdvcmQKKwkJCXJldHVybgorCQlmaQorCWRvbmUKK30KKworX19naXRfZmluZF9zdWJjb21tYW5kICgpCit7CisJbG9jYWwgd29yZCBzdWJjb21tYW5kIGM9MQorCisJd2hpbGUgWyAkYyAtbHQgJENPTVBfQ1dPUkQgXTsgZG8KKwkJd29yZD0iJHtDT01QX1dPUkRTW2NdfSIKKwkJZm9yIHN1YmNvbW1hbmQgaW4gJDE7IGRvCisJCQlpZiBbICIkc3ViY29tbWFuZCIgPSAiJHdvcmQiIF07IHRoZW4KKwkJCQllY2hvICIkc3ViY29tbWFuZCIKKwkJCQlyZXR1cm4KKwkJCWZpCisJCWRvbmUKKwkJYz0kKCgrK2MpKQorCWRvbmUKK30KKworX19naXRfd2hpdGVzcGFjZWxpc3Q9Im5vd2FybiB3YXJuIGVycm9yIGVycm9yLWFsbCBzdHJpcCIKKworX2dpdF9hbSAoKQoreworCWxvY2FsIGN1cj0iJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfSIKKwlpZiBbIC1kIC5kb3Rlc3QgXTsgdGhlbgorCQlfX2dpdGNvbXAgIi0tc2tpcCAtLXJlc29sdmVkIgorCQlyZXR1cm4KKwlmaQorCWNhc2UgIiRjdXIiIGluCisJLS13aGl0ZXNwYWNlPSopCisJCV9fZ2l0Y29tcCAiJF9fZ2l0X3doaXRlc3BhY2VsaXN0IiAiIiAiJHtjdXIjIy0td2hpdGVzcGFjZT19IgorCQlyZXR1cm4KKwkJOzsKKwktLSopCisJCV9fZ2l0Y29tcCAiCisJCQktLXNpZ25vZmYgLS11dGY4IC0tYmluYXJ5IC0tM3dheSAtLWludGVyYWN0aXZlCisJCQktLXdoaXRlc3BhY2U9CisJCQkiCisJCXJldHVybgorCWVzYWMKKwlDT01QUkVQTFk9KCkKK30KKworX2dpdF9hcHBseSAoKQoreworCWxvY2FsIGN1cj0iJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfSIKKwljYXNlICIkY3VyIiBpbgorCS0td2hpdGVzcGFjZT0qKQorCQlfX2dpdGNvbXAgIiRfX2dpdF93aGl0ZXNwYWNlbGlzdCIgIiIgIiR7Y3VyIyMtLXdoaXRlc3BhY2U9fSIKKwkJcmV0dXJuCisJCTs7CisJLS0qKQorCQlfX2dpdGNvbXAgIgorCQkJLS1zdGF0IC0tbnVtc3RhdCAtLXN1bW1hcnkgLS1jaGVjayAtLWluZGV4CisJCQktLWNhY2hlZCAtLWluZGV4LWluZm8gLS1yZXZlcnNlIC0tcmVqZWN0IC0tdW5pZGlmZi16ZXJvCisJCQktLWFwcGx5IC0tbm8tYWRkIC0tZXhjbHVkZT0KKwkJCS0td2hpdGVzcGFjZT0gLS1pbmFjY3VyYXRlLWVvZiAtLXZlcmJvc2UKKwkJCSIKKwkJcmV0dXJuCisJZXNhYworCUNPTVBSRVBMWT0oKQorfQorCitfZ2l0X2FkZCAoKQoreworCWxvY2FsIGN1cj0iJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfSIKKwljYXNlICIkY3VyIiBpbgorCS0tKikKKwkJX19naXRjb21wICItLWludGVyYWN0aXZlIC0tcmVmcmVzaCIKKwkJcmV0dXJuCisJZXNhYworCUNPTVBSRVBMWT0oKQorfQorCitfZ2l0X2Jpc2VjdCAoKQoreworCWxvY2FsIHN1YmNvbW1hbmRzPSJzdGFydCBiYWQgZ29vZCByZXNldCB2aXN1YWxpemUgcmVwbGF5IGxvZyIKKwlsb2NhbCBzdWJjb21tYW5kPSIkKF9fZ2l0X2ZpbmRfc3ViY29tbWFuZCAiJHN1YmNvbW1hbmRzIikiCisJaWYgWyAteiAiJHN1YmNvbW1hbmQiIF07IHRoZW4KKwkJX19naXRjb21wICIkc3ViY29tbWFuZHMiCisJCXJldHVybgorCWZpCisKKwljYXNlICIkc3ViY29tbWFuZCIgaW4KKwliYWR8Z29vZHxyZXNldCkKKwkJX19naXRjb21wICIkKF9fZ2l0X3JlZnMpIgorCQk7OworCSopCisJCUNPTVBSRVBMWT0oKQorCQk7OworCWVzYWMKK30KKworX2dpdF9icmFuY2ggKCkKK3sKKwlsb2NhbCBpIGM9MSBvbmx5X2xvY2FsX3JlZj0ibiIgaGFzX3I9Im4iCisKKwl3aGlsZSBbICRjIC1sdCAkQ09NUF9DV09SRCBdOyBkbworCQlpPSIke0NPTVBfV09SRFNbY119IgorCQljYXNlICIkaSIgaW4KKwkJLWR8LW0pCW9ubHlfbG9jYWxfcmVmPSJ5IiA7OworCQktcikJaGFzX3I9InkiIDs7CisJCWVzYWMKKwkJYz0kKCgrK2MpKQorCWRvbmUKKworCWNhc2UgIiR7Q09NUF9XT1JEU1tDT01QX0NXT1JEXX0iIGluCisJLS0qPSopCUNPTVBSRVBMWT0oKSA7OworCS0tKikKKwkJX19naXRjb21wICIKKwkJCS0tY29sb3IgLS1uby1jb2xvciAtLXZlcmJvc2UgLS1hYmJyZXY9IC0tbm8tYWJicmV2CisJCQktLXRyYWNrIC0tbm8tdHJhY2sKKwkJCSIKKwkJOzsKKwkqKQorCQlpZiBbICRvbmx5X2xvY2FsX3JlZiA9ICJ5IiAtYSAkaGFzX3IgPSAibiIgXTsgdGhlbgorCQkJX19naXRjb21wICIkKF9fZ2l0X2hlYWRzKSIKKwkJZWxzZQorCQkJX19naXRjb21wICIkKF9fZ2l0X3JlZnMpIgorCQlmaQorCQk7OworCWVzYWMKK30KKworX2dpdF9idW5kbGUgKCkKK3sKKwlsb2NhbCBteWN3b3JkPSIkQ09NUF9DV09SRCIKKwljYXNlICIke0NPTVBfV09SRFNbMF19IiBpbgorCWdpdCkKKwkJbG9jYWwgY21kPSIke0NPTVBfV09SRFNbMl19IgorCQlteWN3b3JkPSIkKChteWN3b3JkLTEpKSIKKwkJOzsKKwlnaXQtYnVuZGxlKikKKwkJbG9jYWwgY21kPSIke0NPTVBfV09SRFNbMV19IgorCQk7OworCWVzYWMKKwljYXNlICIkbXljd29yZCIgaW4KKwkxKQorCQlfX2dpdGNvbXAgImNyZWF0ZSBsaXN0LWhlYWRzIHZlcmlmeSB1bmJ1bmRsZSIKKwkJOzsKKwkyKQorCQkjIGxvb2tpbmcgZm9yIGEgZmlsZQorCQk7OworCSopCisJCWNhc2UgIiRjbWQiIGluCisJCQljcmVhdGUpCisJCQkJX19naXRfY29tcGxldGVfcmV2bGlzdAorCQkJOzsKKwkJZXNhYworCQk7OworCWVzYWMKK30KKworX2dpdF9jaGVja291dCAoKQoreworCV9fZ2l0Y29tcCAiJChfX2dpdF9yZWZzKSIKK30KKworX2dpdF9jaGVycnkgKCkKK3sKKwlfX2dpdGNvbXAgIiQoX19naXRfcmVmcykiCit9CisKK19naXRfY2hlcnJ5X3BpY2sgKCkKK3sKKwlsb2NhbCBjdXI9IiR7Q09NUF9XT1JEU1tDT01QX0NXT1JEXX0iCisJY2FzZSAiJGN1ciIgaW4KKwktLSopCisJCV9fZ2l0Y29tcCAiLS1lZGl0IC0tbm8tY29tbWl0IgorCQk7OworCSopCisJCV9fZ2l0Y29tcCAiJChfX2dpdF9yZWZzKSIKKwkJOzsKKwllc2FjCit9CisKK19naXRfY29tbWl0ICgpCit7CisJbG9jYWwgY3VyPSIke0NPTVBfV09SRFNbQ09NUF9DV09SRF19IgorCWNhc2UgIiRjdXIiIGluCisJLS0qKQorCQlfX2dpdGNvbXAgIgorCQkJLS1hbGwgLS1hdXRob3I9IC0tc2lnbm9mZiAtLXZlcmlmeSAtLW5vLXZlcmlmeQorCQkJLS1lZGl0IC0tYW1lbmQgLS1pbmNsdWRlIC0tb25seQorCQkJIgorCQlyZXR1cm4KKwllc2FjCisJQ09NUFJFUExZPSgpCit9CisKK19naXRfZGVzY3JpYmUgKCkKK3sKKwlfX2dpdGNvbXAgIiQoX19naXRfcmVmcykiCit9CisKK19naXRfZGlmZiAoKQoreworCWxvY2FsIGN1cj0iJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfSIKKwljYXNlICIkY3VyIiBpbgorCS0tKikKKwkJX19naXRjb21wICItLWNhY2hlZCAtLXN0YXQgLS1udW1zdGF0IC0tc2hvcnRzdGF0IC0tc3VtbWFyeQorCQkJLS1wYXRjaC13aXRoLXN0YXQgLS1uYW1lLW9ubHkgLS1uYW1lLXN0YXR1cyAtLWNvbG9yCisJCQktLW5vLWNvbG9yIC0tY29sb3Itd29yZHMgLS1uby1yZW5hbWVzIC0tY2hlY2sKKwkJCS0tZnVsbC1pbmRleCAtLWJpbmFyeSAtLWFiYnJldiAtLWRpZmYtZmlsdGVyCisJCQktLWZpbmQtY29waWVzLWhhcmRlciAtLXBpY2theGUtYWxsIC0tcGlja2F4ZS1yZWdleAorCQkJLS10ZXh0IC0taWdub3JlLXNwYWNlLWF0LWVvbCAtLWlnbm9yZS1zcGFjZS1jaGFuZ2UKKwkJCS0taWdub3JlLWFsbC1zcGFjZSAtLWV4aXQtY29kZSAtLXF1aWV0IC0tZXh0LWRpZmYKKwkJCS0tbm8tZXh0LWRpZmYKKwkJCS0tbm8tcHJlZml4IC0tc3JjLXByZWZpeD0gLS1kc3QtcHJlZml4PQorCQkJIgorCQlyZXR1cm4KKwkJOzsKKwllc2FjCisJX19naXRfY29tcGxldGVfZmlsZQorfQorCitfZ2l0X2RpZmZfdHJlZSAoKQoreworCV9fZ2l0Y29tcCAiJChfX2dpdF9yZWZzKSIKK30KKworX2dpdF9mZXRjaCAoKQoreworCWxvY2FsIGN1cj0iJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfSIKKworCWNhc2UgIiR7Q09NUF9XT1JEU1swXX0sJENPTVBfQ1dPUkQiIGluCisJZ2l0LWZldGNoKiwxKQorCQlfX2dpdGNvbXAgIiQoX19naXRfcmVtb3RlcykiCisJCTs7CisJZ2l0LDIpCisJCV9fZ2l0Y29tcCAiJChfX2dpdF9yZW1vdGVzKSIKKwkJOzsKKwkqKQorCQljYXNlICIkY3VyIiBpbgorCQkqOiopCisJCQlfX2dpdGNvbXAgIiQoX19naXRfcmVmcykiICIiICIke2N1ciMqOn0iCisJCQk7OworCQkqKQorCQkJbG9jYWwgcmVtb3RlCisJCQljYXNlICIke0NPTVBfV09SRFNbMF19IiBpbgorCQkJZ2l0LWZldGNoKSByZW1vdGU9IiR7Q09NUF9XT1JEU1sxXX0iIDs7CisJCQlnaXQpICAgICAgIHJlbW90ZT0iJHtDT01QX1dPUkRTWzJdfSIgOzsKKwkJCWVzYWMKKwkJCV9fZ2l0Y29tcCAiJChfX2dpdF9yZWZzMiAiJHJlbW90ZSIpIgorCQkJOzsKKwkJZXNhYworCQk7OworCWVzYWMKK30KKworX2dpdF9mb3JtYXRfcGF0Y2ggKCkKK3sKKwlsb2NhbCBjdXI9IiR7Q09NUF9XT1JEU1tDT01QX0NXT1JEXX0iCisJY2FzZSAiJGN1ciIgaW4KKwktLSopCisJCV9fZ2l0Y29tcCAiCisJCQktLXN0ZG91dCAtLWF0dGFjaCAtLXRocmVhZAorCQkJLS1vdXRwdXQtZGlyZWN0b3J5CisJCQktLW51bWJlcmVkIC0tc3RhcnQtbnVtYmVyCisJCQktLW51bWJlcmVkLWZpbGVzCisJCQktLWtlZXAtc3ViamVjdAorCQkJLS1zaWdub2ZmCisJCQktLWluLXJlcGx5LXRvPQorCQkJLS1mdWxsLWluZGV4IC0tYmluYXJ5CisJCQktLW5vdCAtLWFsbAorCQkJLS1jb3Zlci1sZXR0ZXIKKwkJCS0tbm8tcHJlZml4IC0tc3JjLXByZWZpeD0gLS1kc3QtcHJlZml4PQorCQkJIgorCQlyZXR1cm4KKwkJOzsKKwllc2FjCisJX19naXRfY29tcGxldGVfcmV2bGlzdAorfQorCitfZ2l0X2djICgpCit7CisJbG9jYWwgY3VyPSIke0NPTVBfV09SRFNbQ09NUF9DV09SRF19IgorCWNhc2UgIiRjdXIiIGluCisJLS0qKQorCQlfX2dpdGNvbXAgIi0tcHJ1bmUgLS1hZ2dyZXNzaXZlIgorCQlyZXR1cm4KKwkJOzsKKwllc2FjCisJQ09NUFJFUExZPSgpCit9CisKK19naXRfbHNfcmVtb3RlICgpCit7CisJX19naXRjb21wICIkKF9fZ2l0X3JlbW90ZXMpIgorfQorCitfZ2l0X2xzX3RyZWUgKCkKK3sKKwlfX2dpdF9jb21wbGV0ZV9maWxlCit9CisKK19naXRfbG9nICgpCit7CisJbG9jYWwgY3VyPSIke0NPTVBfV09SRFNbQ09NUF9DV09SRF19IgorCWNhc2UgIiRjdXIiIGluCisJLS1wcmV0dHk9KikKKwkJX19naXRjb21wICIKKwkJCW9uZWxpbmUgc2hvcnQgbWVkaXVtIGZ1bGwgZnVsbGVyIGVtYWlsIHJhdworCQkJIiAiIiAiJHtjdXIjIy0tcHJldHR5PX0iCisJCXJldHVybgorCQk7OworCS0tZGF0ZT0qKQorCQlfX2dpdGNvbXAgIgorCQkJcmVsYXRpdmUgaXNvODYwMSByZmMyODIyIHNob3J0IGxvY2FsIGRlZmF1bHQKKwkJIiAiIiAiJHtjdXIjIy0tZGF0ZT19IgorCQlyZXR1cm4KKwkJOzsKKwktLSopCisJCV9fZ2l0Y29tcCAiCisJCQktLW1heC1jb3VudD0gLS1tYXgtYWdlPSAtLXNpbmNlPSAtLWFmdGVyPQorCQkJLS1taW4tYWdlPSAtLWJlZm9yZT0gLS11bnRpbD0KKwkJCS0tcm9vdCAtLXRvcG8tb3JkZXIgLS1kYXRlLW9yZGVyIC0tcmV2ZXJzZQorCQkJLS1uby1tZXJnZXMgLS1mb2xsb3cKKwkJCS0tYWJicmV2LWNvbW1pdCAtLWFiYnJldj0KKwkJCS0tcmVsYXRpdmUtZGF0ZSAtLWRhdGU9CisJCQktLWF1dGhvcj0gLS1jb21taXR0ZXI9IC0tZ3JlcD0KKwkJCS0tYWxsLW1hdGNoCisJCQktLXByZXR0eT0gLS1uYW1lLXN0YXR1cyAtLW5hbWUtb25seSAtLXJhdworCQkJLS1ub3QgLS1hbGwKKwkJCS0tbGVmdC1yaWdodCAtLWNoZXJyeS1waWNrCisJCQkiCisJCXJldHVybgorCQk7OworCWVzYWMKKwlfX2dpdF9jb21wbGV0ZV9yZXZsaXN0Cit9CisKK19naXRfbWVyZ2UgKCkKK3sKKwlsb2NhbCBjdXI9IiR7Q09NUF9XT1JEU1tDT01QX0NXT1JEXX0iCisJY2FzZSAiJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkQtMV19IiBpbgorCS1zfC0tc3RyYXRlZ3kpCisJCV9fZ2l0Y29tcCAiJChfX2dpdF9tZXJnZV9zdHJhdGVnaWVzKSIKKwkJcmV0dXJuCisJZXNhYworCWNhc2UgIiRjdXIiIGluCisJLS1zdHJhdGVneT0qKQorCQlfX2dpdGNvbXAgIiQoX19naXRfbWVyZ2Vfc3RyYXRlZ2llcykiICIiICIke2N1ciMjLS1zdHJhdGVneT19IgorCQlyZXR1cm4KKwkJOzsKKwktLSopCisJCV9fZ2l0Y29tcCAiCisJCQktLW5vLWNvbW1pdCAtLW5vLXN1bW1hcnkgLS1zcXVhc2ggLS1zdHJhdGVneQorCQkJIgorCQlyZXR1cm4KKwllc2FjCisJX19naXRjb21wICIkKF9fZ2l0X3JlZnMpIgorfQorCitfZ2l0X21lcmdlX2Jhc2UgKCkKK3sKKwlfX2dpdGNvbXAgIiQoX19naXRfcmVmcykiCit9CisKK19naXRfbmFtZV9yZXYgKCkKK3sKKwlfX2dpdGNvbXAgIi0tdGFncyAtLWFsbCAtLXN0ZGluIgorfQorCitfZ2l0X3B1bGwgKCkKK3sKKwlsb2NhbCBjdXI9IiR7Q09NUF9XT1JEU1tDT01QX0NXT1JEXX0iCisKKwljYXNlICIke0NPTVBfV09SRFNbMF19LCRDT01QX0NXT1JEIiBpbgorCWdpdC1wdWxsKiwxKQorCQlfX2dpdGNvbXAgIiQoX19naXRfcmVtb3RlcykiCisJCTs7CisJZ2l0LDIpCisJCV9fZ2l0Y29tcCAiJChfX2dpdF9yZW1vdGVzKSIKKwkJOzsKKwkqKQorCQlsb2NhbCByZW1vdGUKKwkJY2FzZSAiJHtDT01QX1dPUkRTWzBdfSIgaW4KKwkJZ2l0LXB1bGwpICByZW1vdGU9IiR7Q09NUF9XT1JEU1sxXX0iIDs7CisJCWdpdCkgICAgICAgcmVtb3RlPSIke0NPTVBfV09SRFNbMl19IiA7OworCQllc2FjCisJCV9fZ2l0Y29tcCAiJChfX2dpdF9yZWZzICIkcmVtb3RlIikiCisJCTs7CisJZXNhYworfQorCitfZ2l0X3B1c2ggKCkKK3sKKwlsb2NhbCBjdXI9IiR7Q09NUF9XT1JEU1tDT01QX0NXT1JEXX0iCisKKwljYXNlICIke0NPTVBfV09SRFNbMF19LCRDT01QX0NXT1JEIiBpbgorCWdpdC1wdXNoKiwxKQorCQlfX2dpdGNvbXAgIiQoX19naXRfcmVtb3RlcykiCisJCTs7CisJZ2l0LDIpCisJCV9fZ2l0Y29tcCAiJChfX2dpdF9yZW1vdGVzKSIKKwkJOzsKKwkqKQorCQljYXNlICIkY3VyIiBpbgorCQkqOiopCisJCQlsb2NhbCByZW1vdGUKKwkJCWNhc2UgIiR7Q09NUF9XT1JEU1swXX0iIGluCisJCQlnaXQtcHVzaCkgIHJlbW90ZT0iJHtDT01QX1dPUkRTWzFdfSIgOzsKKwkJCWdpdCkgICAgICAgcmVtb3RlPSIke0NPTVBfV09SRFNbMl19IiA7OworCQkJZXNhYworCQkJX19naXRjb21wICIkKF9fZ2l0X3JlZnMgIiRyZW1vdGUiKSIgIiIgIiR7Y3VyIyo6fSIKKwkJCTs7CisJCSsqKQorCQkJX19naXRjb21wICIkKF9fZ2l0X3JlZnMpIiArICIke2N1ciMrfSIKKwkJCTs7CisJCSopCisJCQlfX2dpdGNvbXAgIiQoX19naXRfcmVmcykiCisJCQk7OworCQllc2FjCisJCTs7CisJZXNhYworfQorCitfZ2l0X3JlYmFzZSAoKQoreworCWxvY2FsIGN1cj0iJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfSIgZGlyPSIkKF9fZ2l0ZGlyKSIKKwlpZiBbIC1kIC5kb3Rlc3QgXSB8fCBbIC1kICIkZGlyIi8uZG90ZXN0LW1lcmdlIF07IHRoZW4KKwkJX19naXRjb21wICItLWNvbnRpbnVlIC0tc2tpcCAtLWFib3J0IgorCQlyZXR1cm4KKwlmaQorCWNhc2UgIiR7Q09NUF9XT1JEU1tDT01QX0NXT1JELTFdfSIgaW4KKwktc3wtLXN0cmF0ZWd5KQorCQlfX2dpdGNvbXAgIiQoX19naXRfbWVyZ2Vfc3RyYXRlZ2llcykiCisJCXJldHVybgorCWVzYWMKKwljYXNlICIkY3VyIiBpbgorCS0tc3RyYXRlZ3k9KikKKwkJX19naXRjb21wICIkKF9fZ2l0X21lcmdlX3N0cmF0ZWdpZXMpIiAiIiAiJHtjdXIjIy0tc3RyYXRlZ3k9fSIKKwkJcmV0dXJuCisJCTs7CisJLS0qKQorCQlfX2dpdGNvbXAgIi0tb250byAtLW1lcmdlIC0tc3RyYXRlZ3kgLS1pbnRlcmFjdGl2ZSIKKwkJcmV0dXJuCisJZXNhYworCV9fZ2l0Y29tcCAiJChfX2dpdF9yZWZzKSIKK30KKworX2dpdF9jb25maWcgKCkKK3sKKwlsb2NhbCBjdXI9IiR7Q09NUF9XT1JEU1tDT01QX0NXT1JEXX0iCisJbG9jYWwgcHJ2PSIke0NPTVBfV09SRFNbQ09NUF9DV09SRC0xXX0iCisJY2FzZSAiJHBydiIgaW4KKwlicmFuY2guKi5yZW1vdGUpCisJCV9fZ2l0Y29tcCAiJChfX2dpdF9yZW1vdGVzKSIKKwkJcmV0dXJuCisJCTs7CisJYnJhbmNoLioubWVyZ2UpCisJCV9fZ2l0Y29tcCAiJChfX2dpdF9yZWZzKSIKKwkJcmV0dXJuCisJCTs7CisJcmVtb3RlLiouZmV0Y2gpCisJCWxvY2FsIHJlbW90ZT0iJHtwcnYjcmVtb3RlLn0iCisJCXJlbW90ZT0iJHtyZW1vdGUlLmZldGNofSIKKwkJX19naXRjb21wICIkKF9fZ2l0X3JlZnNfcmVtb3RlcyAiJHJlbW90ZSIpIgorCQlyZXR1cm4KKwkJOzsKKwlyZW1vdGUuKi5wdXNoKQorCQlsb2NhbCByZW1vdGU9IiR7cHJ2I3JlbW90ZS59IgorCQlyZW1vdGU9IiR7cmVtb3RlJS5wdXNofSIKKwkJX19naXRjb21wICIkKGdpdCAtLWdpdC1kaXI9IiQoX19naXRkaXIpIiBcCisJCQlmb3ItZWFjaC1yZWYgLS1mb3JtYXQ9JyUocmVmbmFtZSk6JShyZWZuYW1lKScgXAorCQkJcmVmcy9oZWFkcykiCisJCXJldHVybgorCQk7OworCXB1bGwudHdvaGVhZHxwdWxsLm9jdG9wdXMpCisJCV9fZ2l0Y29tcCAiJChfX2dpdF9tZXJnZV9zdHJhdGVnaWVzKSIKKwkJcmV0dXJuCisJCTs7CisJY29sb3IuYnJhbmNofGNvbG9yLmRpZmZ8Y29sb3Iuc3RhdHVzKQorCQlfX2dpdGNvbXAgImFsd2F5cyBuZXZlciBhdXRvIgorCQlyZXR1cm4KKwkJOzsKKwljb2xvci4qLiopCisJCV9fZ2l0Y29tcCAiCisJCQlibGFjayByZWQgZ3JlZW4geWVsbG93IGJsdWUgbWFnZW50YSBjeWFuIHdoaXRlCisJCQlib2xkIGRpbSB1bCBibGluayByZXZlcnNlCisJCQkiCisJCXJldHVybgorCQk7OworCSouKikKKwkJQ09NUFJFUExZPSgpCisJCXJldHVybgorCQk7OworCWVzYWMKKwljYXNlICIkY3VyIiBpbgorCS0tKikKKwkJX19naXRjb21wICIKKwkJCS0tZ2xvYmFsIC0tc3lzdGVtIC0tZmlsZT0KKwkJCS0tbGlzdCAtLXJlcGxhY2UtYWxsCisJCQktLWdldCAtLWdldC1hbGwgLS1nZXQtcmVnZXhwCisJCQktLWFkZCAtLXVuc2V0IC0tdW5zZXQtYWxsCisJCQktLXJlbW92ZS1zZWN0aW9uIC0tcmVuYW1lLXNlY3Rpb24KKwkJCSIKKwkJcmV0dXJuCisJCTs7CisJYnJhbmNoLiouKikKKwkJbG9jYWwgcGZ4PSIke2N1ciUuKn0uIgorCQljdXI9IiR7Y3VyIyMqLn0iCisJCV9fZ2l0Y29tcCAicmVtb3RlIG1lcmdlIiAiJHBmeCIgIiRjdXIiCisJCXJldHVybgorCQk7OworCWJyYW5jaC4qKQorCQlsb2NhbCBwZng9IiR7Y3VyJS4qfS4iCisJCWN1cj0iJHtjdXIjKi59IgorCQlfX2dpdGNvbXAgIiQoX19naXRfaGVhZHMpIiAiJHBmeCIgIiRjdXIiICIuIgorCQlyZXR1cm4KKwkJOzsKKwlyZW1vdGUuKi4qKQorCQlsb2NhbCBwZng9IiR7Y3VyJS4qfS4iCisJCWN1cj0iJHtjdXIjIyoufSIKKwkJX19naXRjb21wICIKKwkJCXVybCBmZXRjaCBwdXNoIHNraXBEZWZhdWx0VXBkYXRlCisJCQlyZWNlaXZlcGFjayB1cGxvYWRwYWNrIHRhZ29wdAorCQkJIiAiJHBmeCIgIiRjdXIiCisJCXJldHVybgorCQk7OworCXJlbW90ZS4qKQorCQlsb2NhbCBwZng9IiR7Y3VyJS4qfS4iCisJCWN1cj0iJHtjdXIjKi59IgorCQlfX2dpdGNvbXAgIiQoX19naXRfcmVtb3RlcykiICIkcGZ4IiAiJGN1ciIgIi4iCisJCXJldHVybgorCQk7OworCWVzYWMKKwlfX2dpdGNvbXAgIgorCQlhcHBseS53aGl0ZXNwYWNlCisJCWNvcmUuZmlsZU1vZGUKKwkJY29yZS5naXRQcm94eQorCQljb3JlLmlnbm9yZVN0YXQKKwkJY29yZS5wcmVmZXJTeW1saW5rUmVmcworCQljb3JlLmxvZ0FsbFJlZlVwZGF0ZXMKKwkJY29yZS5sb29zZWNvbXByZXNzaW9uCisJCWNvcmUucmVwb3NpdG9yeUZvcm1hdFZlcnNpb24KKwkJY29yZS5zaGFyZWRSZXBvc2l0b3J5CisJCWNvcmUud2FybkFtYmlndW91c1JlZnMKKwkJY29yZS5jb21wcmVzc2lvbgorCQljb3JlLnBhY2tlZEdpdFdpbmRvd1NpemUKKwkJY29yZS5wYWNrZWRHaXRMaW1pdAorCQljbGVhbi5yZXF1aXJlRm9yY2UKKwkJY29sb3IuYnJhbmNoCisJCWNvbG9yLmJyYW5jaC5jdXJyZW50CisJCWNvbG9yLmJyYW5jaC5sb2NhbAorCQljb2xvci5icmFuY2gucmVtb3RlCisJCWNvbG9yLmJyYW5jaC5wbGFpbgorCQljb2xvci5kaWZmCisJCWNvbG9yLmRpZmYucGxhaW4KKwkJY29sb3IuZGlmZi5tZXRhCisJCWNvbG9yLmRpZmYuZnJhZworCQljb2xvci5kaWZmLm9sZAorCQljb2xvci5kaWZmLm5ldworCQljb2xvci5kaWZmLmNvbW1pdAorCQljb2xvci5kaWZmLndoaXRlc3BhY2UKKwkJY29sb3IucGFnZXIKKwkJY29sb3Iuc3RhdHVzCisJCWNvbG9yLnN0YXR1cy5oZWFkZXIKKwkJY29sb3Iuc3RhdHVzLmFkZGVkCisJCWNvbG9yLnN0YXR1cy5jaGFuZ2VkCisJCWNvbG9yLnN0YXR1cy51bnRyYWNrZWQKKwkJZGlmZi5yZW5hbWVMaW1pdAorCQlkaWZmLnJlbmFtZXMKKwkJZmV0Y2gudW5wYWNrTGltaXQKKwkJZm9ybWF0LmhlYWRlcnMKKwkJZm9ybWF0LnN1YmplY3RwcmVmaXgKKwkJZ2l0Y3ZzLmVuYWJsZWQKKwkJZ2l0Y3ZzLmxvZ2ZpbGUKKwkJZ2l0Y3ZzLmFsbGJpbmFyeQorCQlnaXRjdnMuZGJuYW1lIGdpdGN2cy5kYmRyaXZlciBnaXRjdnMuZGJ1c2VyIGdpdGN2cy5kYnBhc3MKKwkJZ2l0Y3ZzLmRidGFibGVuYW1lcHJlZml4CisJCWdjLnBhY2tyZWZzCisJCWdjLnJlZmxvZ2V4cGlyZQorCQlnYy5yZWZsb2dleHBpcmV1bnJlYWNoYWJsZQorCQlnYy5yZXJlcmVyZXNvbHZlZAorCQlnYy5yZXJlcmV1bnJlc29sdmVkCisJCWh0dHAuc3NsVmVyaWZ5CisJCWh0dHAuc3NsQ2VydAorCQlodHRwLnNzbEtleQorCQlodHRwLnNzbENBSW5mbworCQlodHRwLnNzbENBUGF0aAorCQlodHRwLm1heFJlcXVlc3RzCisJCWh0dHAubG93U3BlZWRMaW1pdAorCQlodHRwLmxvd1NwZWVkVGltZQorCQlodHRwLm5vRVBTVgorCQlpMThuLmNvbW1pdEVuY29kaW5nCisJCWkxOG4ubG9nT3V0cHV0RW5jb2RpbmcKKwkJbG9nLnNob3dyb290CisJCW1lcmdlLnRvb2wKKwkJbWVyZ2Uuc3VtbWFyeQorCQltZXJnZS52ZXJib3NpdHkKKwkJcGFjay53aW5kb3cKKwkJcGFjay5kZXB0aAorCQlwYWNrLndpbmRvd01lbW9yeQorCQlwYWNrLmNvbXByZXNzaW9uCisJCXBhY2suZGVsdGFDYWNoZVNpemUKKwkJcGFjay5kZWx0YUNhY2hlTGltaXQKKwkJcHVsbC5vY3RvcHVzCisJCXB1bGwudHdvaGVhZAorCQlyZXBhY2sudXNlRGVsdGFCYXNlT2Zmc2V0CisJCXNob3cuZGlmZnRyZWUKKwkJc2hvd2JyYW5jaC5kZWZhdWx0CisJCXRhci51bWFzaworCQl0cmFuc2Zlci51bnBhY2tMaW1pdAorCQlyZWNlaXZlLnVucGFja0xpbWl0CisJCXJlY2VpdmUuZGVueU5vbkZhc3RGb3J3YXJkcworCQl1c2VyLm5hbWUKKwkJdXNlci5lbWFpbAorCQl1c2VyLnNpZ25pbmdrZXkKKwkJd2hhdGNoYW5nZWQuZGlmZnRyZWUKKwkJYnJhbmNoLiByZW1vdGUuCisJIgorfQorCitfZ2l0X3JlbW90ZSAoKQoreworCWxvY2FsIHN1YmNvbW1hbmRzPSJhZGQgcm0gc2hvdyBwcnVuZSB1cGRhdGUiCisJbG9jYWwgc3ViY29tbWFuZD0iJChfX2dpdF9maW5kX3N1YmNvbW1hbmQgIiRzdWJjb21tYW5kcyIpIgorCWlmIFsgLXogIiRzdWJjb21tYW5kIiBdOyB0aGVuCisJCXJldHVybgorCWZpCisKKwljYXNlICIkc3ViY29tbWFuZCIgaW4KKwlybXxzaG93fHBydW5lKQorCQlfX2dpdGNvbXAgIiQoX19naXRfcmVtb3RlcykiCisJCTs7CisJdXBkYXRlKQorCQlsb2NhbCBpIGM9JycgSUZTPSQnXG4nCisJCWZvciBpIGluICQoZ2l0IC0tZ2l0LWRpcj0iJChfX2dpdGRpcikiIGNvbmZpZyAtLWxpc3QpOyBkbworCQkJY2FzZSAiJGkiIGluCisJCQlyZW1vdGVzLiopCisJCQkJaT0iJHtpI3JlbW90ZXMufSIKKwkJCQljPSIkYyAke2kvPSovfSIKKwkJCQk7OworCQkJZXNhYworCQlkb25lCisJCV9fZ2l0Y29tcCAiJGMiCisJCTs7CisJKikKKwkJQ09NUFJFUExZPSgpCisJCTs7CisJZXNhYworfQorCitfZ2l0X3Jlc2V0ICgpCit7CisJbG9jYWwgY3VyPSIke0NPTVBfV09SRFNbQ09NUF9DV09SRF19IgorCWNhc2UgIiRjdXIiIGluCisJLS0qKQorCQlfX2dpdGNvbXAgIi0tbWl4ZWQgLS1oYXJkIC0tc29mdCIKKwkJcmV0dXJuCisJCTs7CisJZXNhYworCV9fZ2l0Y29tcCAiJChfX2dpdF9yZWZzKSIKK30KKworX2dpdF9zaG9ydGxvZyAoKQoreworCWxvY2FsIGN1cj0iJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfSIKKwljYXNlICIkY3VyIiBpbgorCS0tKikKKwkJX19naXRjb21wICIKKwkJCS0tbWF4LWNvdW50PSAtLW1heC1hZ2U9IC0tc2luY2U9IC0tYWZ0ZXI9CisJCQktLW1pbi1hZ2U9IC0tYmVmb3JlPSAtLXVudGlsPQorCQkJLS1uby1tZXJnZXMKKwkJCS0tYXV0aG9yPSAtLWNvbW1pdHRlcj0gLS1ncmVwPQorCQkJLS1hbGwtbWF0Y2gKKwkJCS0tbm90IC0tYWxsCisJCQktLW51bWJlcmVkIC0tc3VtbWFyeQorCQkJIgorCQlyZXR1cm4KKwkJOzsKKwllc2FjCisJX19naXRfY29tcGxldGVfcmV2bGlzdAorfQorCitfZ2l0X3Nob3cgKCkKK3sKKwlsb2NhbCBjdXI9IiR7Q09NUF9XT1JEU1tDT01QX0NXT1JEXX0iCisJY2FzZSAiJGN1ciIgaW4KKwktLXByZXR0eT0qKQorCQlfX2dpdGNvbXAgIgorCQkJb25lbGluZSBzaG9ydCBtZWRpdW0gZnVsbCBmdWxsZXIgZW1haWwgcmF3CisJCQkiICIiICIke2N1ciMjLS1wcmV0dHk9fSIKKwkJcmV0dXJuCisJCTs7CisJLS0qKQorCQlfX2dpdGNvbXAgIi0tcHJldHR5PSIKKwkJcmV0dXJuCisJCTs7CisJZXNhYworCV9fZ2l0X2NvbXBsZXRlX2ZpbGUKK30KKworX2dpdF9zdGFzaCAoKQoreworCWxvY2FsIHN1YmNvbW1hbmRzPSdzYXZlIGxpc3Qgc2hvdyBhcHBseSBjbGVhciBkcm9wIHBvcCBjcmVhdGUnCisJaWYgWyAteiAiJChfX2dpdF9maW5kX3N1YmNvbW1hbmQgIiRzdWJjb21tYW5kcyIpIiBdOyB0aGVuCisJCV9fZ2l0Y29tcCAiJHN1YmNvbW1hbmRzIgorCWZpCit9CisKK19naXRfc3VibW9kdWxlICgpCit7CisJbG9jYWwgc3ViY29tbWFuZHM9ImFkZCBzdGF0dXMgaW5pdCB1cGRhdGUiCisJaWYgWyAteiAiJChfX2dpdF9maW5kX3N1YmNvbW1hbmQgIiRzdWJjb21tYW5kcyIpIiBdOyB0aGVuCisJCWxvY2FsIGN1cj0iJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfSIKKwkJY2FzZSAiJGN1ciIgaW4KKwkJLS0qKQorCQkJX19naXRjb21wICItLXF1aWV0IC0tY2FjaGVkIgorCQkJOzsKKwkJKikKKwkJCV9fZ2l0Y29tcCAiJHN1YmNvbW1hbmRzIgorCQkJOzsKKwkJZXNhYworCQlyZXR1cm4KKwlmaQorfQorCitfZ2l0X3N2biAoKQoreworCWxvY2FsIHN1YmNvbW1hbmRzPSIKKwkJaW5pdCBmZXRjaCBjbG9uZSByZWJhc2UgZGNvbW1pdCBsb2cgZmluZC1yZXYKKwkJc2V0LXRyZWUgY29tbWl0LWRpZmYgaW5mbyBjcmVhdGUtaWdub3JlIHByb3BnZXQKKwkJcHJvcGxpc3Qgc2hvdy1pZ25vcmUgc2hvdy1leHRlcm5hbHMKKwkJIgorCWxvY2FsIHN1YmNvbW1hbmQ9IiQoX19naXRfZmluZF9zdWJjb21tYW5kICIkc3ViY29tbWFuZHMiKSIKKwlpZiBbIC16ICIkc3ViY29tbWFuZCIgXTsgdGhlbgorCQlfX2dpdGNvbXAgIiRzdWJjb21tYW5kcyIKKwllbHNlCisJCWxvY2FsIHJlbW90ZV9vcHRzPSItLXVzZXJuYW1lPSAtLWNvbmZpZy1kaXI9IC0tbm8tYXV0aC1jYWNoZSIKKwkJbG9jYWwgZmNfb3B0cz0iCisJCQktLWZvbGxvdy1wYXJlbnQgLS1hdXRob3JzLWZpbGU9IC0tcmVwYWNrPQorCQkJLS1uby1tZXRhZGF0YSAtLXVzZS1zdm0tcHJvcHMgLS11c2Utc3Zuc3luYy1wcm9wcworCQkJLS1sb2ctd2luZG93LXNpemU9IC0tbm8tY2hlY2tvdXQgLS1xdWlldAorCQkJLS1yZXBhY2stZmxhZ3MgLS11c2VyLWxvZy1hdXRob3IgJHJlbW90ZV9vcHRzCisJCQkiCisJCWxvY2FsIGluaXRfb3B0cz0iCisJCQktLXRlbXBsYXRlPSAtLXNoYXJlZD0gLS10cnVuaz0gLS10YWdzPQorCQkJLS1icmFuY2hlcz0gLS1zdGRsYXlvdXQgLS1taW5pbWl6ZS11cmwKKwkJCS0tbm8tbWV0YWRhdGEgLS11c2Utc3ZtLXByb3BzIC0tdXNlLXN2bnN5bmMtcHJvcHMKKwkJCS0tcmV3cml0ZS1yb290PSAkcmVtb3RlX29wdHMKKwkJCSIKKwkJbG9jYWwgY210X29wdHM9IgorCQkJLS1lZGl0IC0tcm1kaXIgLS1maW5kLWNvcGllcy1oYXJkZXIgLS1jb3B5LXNpbWlsYXJpdHk9CisJCQkiCisKKwkJbG9jYWwgY3VyPSIke0NPTVBfV09SRFNbQ09NUF9DV09SRF19IgorCQljYXNlICIkc3ViY29tbWFuZCwkY3VyIiBpbgorCQlmZXRjaCwtLSopCisJCQlfX2dpdGNvbXAgIi0tcmV2aXNpb249IC0tZmV0Y2gtYWxsICRmY19vcHRzIgorCQkJOzsKKwkJY2xvbmUsLS0qKQorCQkJX19naXRjb21wICItLXJldmlzaW9uPSAkZmNfb3B0cyAkaW5pdF9vcHRzIgorCQkJOzsKKwkJaW5pdCwtLSopCisJCQlfX2dpdGNvbXAgIiRpbml0X29wdHMiCisJCQk7OworCQlkY29tbWl0LC0tKikKKwkJCV9fZ2l0Y29tcCAiCisJCQkJLS1tZXJnZSAtLXN0cmF0ZWd5PSAtLXZlcmJvc2UgLS1kcnktcnVuCisJCQkJLS1mZXRjaC1hbGwgLS1uby1yZWJhc2UgJGNtdF9vcHRzICRmY19vcHRzCisJCQkJIgorCQkJOzsKKwkJc2V0LXRyZWUsLS0qKQorCQkJX19naXRjb21wICItLXN0ZGluICRjbXRfb3B0cyAkZmNfb3B0cyIKKwkJCTs7CisJCWNyZWF0ZS1pZ25vcmUsLS0qfHByb3BnZXQsLS0qfHByb3BsaXN0LC0tKnxzaG93LWlnbm9yZSwtLSp8XAorCQlzaG93LWV4dGVybmFscywtLSopCisJCQlfX2dpdGNvbXAgIi0tcmV2aXNpb249IgorCQkJOzsKKwkJbG9nLC0tKikKKwkJCV9fZ2l0Y29tcCAiCisJCQkJLS1saW1pdD0gLS1yZXZpc2lvbj0gLS12ZXJib3NlIC0taW5jcmVtZW50YWwKKwkJCQktLW9uZWxpbmUgLS1zaG93LWNvbW1pdCAtLW5vbi1yZWN1cnNpdmUKKwkJCQktLWF1dGhvcnMtZmlsZT0KKwkJCQkiCisJCQk7OworCQlyZWJhc2UsLS0qKQorCQkJX19naXRjb21wICIKKwkJCQktLW1lcmdlIC0tdmVyYm9zZSAtLXN0cmF0ZWd5PSAtLWxvY2FsCisJCQkJLS1mZXRjaC1hbGwgJGZjX29wdHMKKwkJCQkiCisJCQk7OworCQljb21taXQtZGlmZiwtLSopCisJCQlfX2dpdGNvbXAgIi0tbWVzc2FnZT0gLS1maWxlPSAtLXJldmlzaW9uPSAkY210X29wdHMiCisJCQk7OworCQlpbmZvLC0tKikKKwkJCV9fZ2l0Y29tcCAiLS11cmwiCisJCQk7OworCQkqKQorCQkJQ09NUFJFUExZPSgpCisJCQk7OworCQllc2FjCisJZmkKK30KKworX2dpdF90YWcgKCkKK3sKKwlsb2NhbCBpIGM9MSBmPTAKKwl3aGlsZSBbICRjIC1sdCAkQ09NUF9DV09SRCBdOyBkbworCQlpPSIke0NPTVBfV09SRFNbY119IgorCQljYXNlICIkaSIgaW4KKwkJLWR8LXYpCisJCQlfX2dpdGNvbXAgIiQoX19naXRfdGFncykiCisJCQlyZXR1cm4KKwkJCTs7CisJCS1mKQorCQkJZj0xCisJCQk7OworCQllc2FjCisJCWM9JCgoKytjKSkKKwlkb25lCisKKwljYXNlICIke0NPTVBfV09SRFNbQ09NUF9DV09SRC0xXX0iIGluCisJLW18LUYpCisJCUNPTVBSRVBMWT0oKQorCQk7OworCS0qfHRhZ3xnaXQtdGFnKQorCQlpZiBbICRmID0gMSBdOyB0aGVuCisJCQlfX2dpdGNvbXAgIiQoX19naXRfdGFncykiCisJCWVsc2UKKwkJCUNPTVBSRVBMWT0oKQorCQlmaQorCQk7OworCSopCisJCV9fZ2l0Y29tcCAiJChfX2dpdF9yZWZzKSIKKwkJOzsKKwllc2FjCit9CisKK19naXQgKCkKK3sKKwlsb2NhbCBpIGM9MSBjb21tYW5kIF9fZ2l0X2RpcgorCisJd2hpbGUgWyAkYyAtbHQgJENPTVBfQ1dPUkQgXTsgZG8KKwkJaT0iJHtDT01QX1dPUkRTW2NdfSIKKwkJY2FzZSAiJGkiIGluCisJCS0tZ2l0LWRpcj0qKSBfX2dpdF9kaXI9IiR7aSMtLWdpdC1kaXI9fSIgOzsKKwkJLS1iYXJlKSAgICAgIF9fZ2l0X2Rpcj0iLiIgOzsKKwkJLS12ZXJzaW9ufC0taGVscHwtcHwtLXBhZ2luYXRlKSA7OworCQkqKSBjb21tYW5kPSIkaSI7IGJyZWFrIDs7CisJCWVzYWMKKwkJYz0kKCgrK2MpKQorCWRvbmUKKworCWlmIFsgLXogIiRjb21tYW5kIiBdOyB0aGVuCisJCWNhc2UgIiR7Q09NUF9XT1JEU1tDT01QX0NXT1JEXX0iIGluCisJCS0tKj0qKSBDT01QUkVQTFk9KCkgOzsKKwkJLS0qKSAgIF9fZ2l0Y29tcCAiCisJCQktLXBhZ2luYXRlCisJCQktLW5vLXBhZ2VyCisJCQktLWdpdC1kaXI9CisJCQktLWJhcmUKKwkJCS0tdmVyc2lvbgorCQkJLS1leGVjLXBhdGgKKwkJCS0td29yay10cmVlPQorCQkJLS1oZWxwCisJCQkiCisJCQk7OworCQkqKSAgICAgX19naXRjb21wICIkKF9fZ2l0X2NvbW1hbmRzKSAkKF9fZ2l0X2FsaWFzZXMpIiA7OworCQllc2FjCisJCXJldHVybgorCWZpCisKKwlsb2NhbCBleHBhbnNpb249JChfX2dpdF9hbGlhc2VkX2NvbW1hbmQgIiRjb21tYW5kIikKKwlbICIkZXhwYW5zaW9uIiBdICYmIGNvbW1hbmQ9IiRleHBhbnNpb24iCisKKwljYXNlICIkY29tbWFuZCIgaW4KKwlhbSkgICAgICAgICAgX2dpdF9hbSA7OworCWFkZCkgICAgICAgICBfZ2l0X2FkZCA7OworCWFwcGx5KSAgICAgICBfZ2l0X2FwcGx5IDs7CisJYmlzZWN0KSAgICAgIF9naXRfYmlzZWN0IDs7CisJYnVuZGxlKSAgICAgIF9naXRfYnVuZGxlIDs7CisJYnJhbmNoKSAgICAgIF9naXRfYnJhbmNoIDs7CisJY2hlY2tvdXQpICAgIF9naXRfY2hlY2tvdXQgOzsKKwljaGVycnkpICAgICAgX2dpdF9jaGVycnkgOzsKKwljaGVycnktcGljaykgX2dpdF9jaGVycnlfcGljayA7OworCWNvbW1pdCkgICAgICBfZ2l0X2NvbW1pdCA7OworCWNvbmZpZykgICAgICBfZ2l0X2NvbmZpZyA7OworCWRlc2NyaWJlKSAgICBfZ2l0X2Rlc2NyaWJlIDs7CisJZGlmZikgICAgICAgIF9naXRfZGlmZiA7OworCWZldGNoKSAgICAgICBfZ2l0X2ZldGNoIDs7CisJZm9ybWF0LXBhdGNoKSBfZ2l0X2Zvcm1hdF9wYXRjaCA7OworCWdjKSAgICAgICAgICBfZ2l0X2djIDs7CisJbG9nKSAgICAgICAgIF9naXRfbG9nIDs7CisJbHMtcmVtb3RlKSAgIF9naXRfbHNfcmVtb3RlIDs7CisJbHMtdHJlZSkgICAgIF9naXRfbHNfdHJlZSA7OworCW1lcmdlKSAgICAgICBfZ2l0X21lcmdlOzsKKwltZXJnZS1iYXNlKSAgX2dpdF9tZXJnZV9iYXNlIDs7CisJbmFtZS1yZXYpICAgIF9naXRfbmFtZV9yZXYgOzsKKwlwdWxsKSAgICAgICAgX2dpdF9wdWxsIDs7CisJcHVzaCkgICAgICAgIF9naXRfcHVzaCA7OworCXJlYmFzZSkgICAgICBfZ2l0X3JlYmFzZSA7OworCXJlbW90ZSkgICAgICBfZ2l0X3JlbW90ZSA7OworCXJlc2V0KSAgICAgICBfZ2l0X3Jlc2V0IDs7CisJc2hvcnRsb2cpICAgIF9naXRfc2hvcnRsb2cgOzsKKwlzaG93KSAgICAgICAgX2dpdF9zaG93IDs7CisJc2hvdy1icmFuY2gpIF9naXRfbG9nIDs7CisJc3Rhc2gpICAgICAgIF9naXRfc3Rhc2ggOzsKKwlzdWJtb2R1bGUpICAgX2dpdF9zdWJtb2R1bGUgOzsKKwlzdm4pICAgICAgICAgX2dpdF9zdm4gOzsKKwl0YWcpICAgICAgICAgX2dpdF90YWcgOzsKKwl3aGF0Y2hhbmdlZCkgX2dpdF9sb2cgOzsKKwkqKSAgICAgICAgICAgQ09NUFJFUExZPSgpIDs7CisJZXNhYworfQorCitfZ2l0ayAoKQoreworCWxvY2FsIGN1cj0iJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfSIKKwljYXNlICIkY3VyIiBpbgorCS0tKikKKwkJX19naXRjb21wICItLW5vdCAtLWFsbCIKKwkJcmV0dXJuCisJCTs7CisJZXNhYworCV9fZ2l0X2NvbXBsZXRlX3Jldmxpc3QKK30KKworY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXQgZ2l0Citjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdGsgZ2l0aworY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfYW0gZ2l0LWFtCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9hcHBseSBnaXQtYXBwbHkKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2Jpc2VjdCBnaXQtYmlzZWN0Citjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9icmFuY2ggZ2l0LWJyYW5jaAorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfYnVuZGxlIGdpdC1idW5kbGUKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2NoZWNrb3V0IGdpdC1jaGVja291dAorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfY2hlcnJ5IGdpdC1jaGVycnkKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2NoZXJyeV9waWNrIGdpdC1jaGVycnktcGljaworY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfY29tbWl0IGdpdC1jb21taXQKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2Rlc2NyaWJlIGdpdC1kZXNjcmliZQorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfZGlmZiBnaXQtZGlmZgorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfZmV0Y2ggZ2l0LWZldGNoCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9mb3JtYXRfcGF0Y2ggZ2l0LWZvcm1hdC1wYXRjaAorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfZ2MgZ2l0LWdjCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9sb2cgZ2l0LWxvZworY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfbHNfcmVtb3RlIGdpdC1scy1yZW1vdGUKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2xzX3RyZWUgZ2l0LWxzLXRyZWUKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X21lcmdlIGdpdC1tZXJnZQorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfbWVyZ2VfYmFzZSBnaXQtbWVyZ2UtYmFzZQorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfbmFtZV9yZXYgZ2l0LW5hbWUtcmV2Citjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9wdWxsIGdpdC1wdWxsCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9wdXNoIGdpdC1wdXNoCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9yZWJhc2UgZ2l0LXJlYmFzZQorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfY29uZmlnIGdpdC1jb25maWcKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X3JlbW90ZSBnaXQtcmVtb3RlCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9yZXNldCBnaXQtcmVzZXQKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X3Nob3J0bG9nIGdpdC1zaG9ydGxvZworY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfc2hvdyBnaXQtc2hvdworY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfc3Rhc2ggZ2l0LXN0YXNoCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9zdWJtb2R1bGUgZ2l0LXN1Ym1vZHVsZQorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfc3ZuIGdpdC1zdm4KK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2xvZyBnaXQtc2hvdy1icmFuY2gKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X3RhZyBnaXQtdGFnCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9sb2cgZ2l0LXdoYXRjaGFuZ2VkCisKKyMgVGhlIGZvbGxvd2luZyBhcmUgbmVjZXNzYXJ5IG9ubHkgZm9yIEN5Z3dpbiwgYW5kIG9ubHkgYXJlIG5lZWRlZAorIyB3aGVuIHRoZSB1c2VyIGhhcyB0YWItY29tcGxldGVkIHRoZSBleGVjdXRhYmxlIG5hbWUgYW5kIGNvbnNlcXVlbnRseQorIyBpbmNsdWRlZCB0aGUgJy5leGUnIHN1ZmZpeC4KKyMKK2lmIFsgQ3lnd2luID0gIiQodW5hbWUgLW8gMj4vZGV2L251bGwpIiBdOyB0aGVuCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9hZGQgZ2l0LWFkZC5leGUKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2FwcGx5IGdpdC1hcHBseS5leGUKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0IGdpdC5leGUKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2JyYW5jaCBnaXQtYnJhbmNoLmV4ZQorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfYnVuZGxlIGdpdC1idW5kbGUuZXhlCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9jaGVycnkgZ2l0LWNoZXJyeS5leGUKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2Rlc2NyaWJlIGdpdC1kZXNjcmliZS5leGUKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2RpZmYgZ2l0LWRpZmYuZXhlCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9mb3JtYXRfcGF0Y2ggZ2l0LWZvcm1hdC1wYXRjaC5leGUKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X2xvZyBnaXQtbG9nLmV4ZQorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfbHNfdHJlZSBnaXQtbHMtdHJlZS5leGUKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X21lcmdlX2Jhc2UgZ2l0LW1lcmdlLWJhc2UuZXhlCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9uYW1lX3JldiBnaXQtbmFtZS1yZXYuZXhlCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9wdXNoIGdpdC1wdXNoLmV4ZQorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfY29uZmlnIGdpdC1jb25maWcKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X3Nob3J0bG9nIGdpdC1zaG9ydGxvZy5leGUKK2NvbXBsZXRlIC1vIGRlZmF1bHQgLW8gbm9zcGFjZSAtRiBfZ2l0X3Nob3cgZ2l0LXNob3cuZXhlCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9sb2cgZ2l0LXNob3ctYnJhbmNoLmV4ZQorY29tcGxldGUgLW8gZGVmYXVsdCAtbyBub3NwYWNlIC1GIF9naXRfdGFnIGdpdC10YWcuZXhlCitjb21wbGV0ZSAtbyBkZWZhdWx0IC1vIG5vc3BhY2UgLUYgX2dpdF9sb2cgZ2l0LXdoYXRjaGFuZ2VkLmV4ZQorZmkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvY29udGludW91cy9jaWRhZW1vbiBiL2NvbnRyaWIvY29udGludW91cy9jaWRhZW1vbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDA5YTE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9jb250aW51b3VzL2NpZGFlbW9uCkBAIC0wLDAgKzEsNTAzIEBACisjIS91c3IvYmluL3BlcmwKKyMKKyMgQSBkYWVtb24gdGhhdCB3YWl0cyBmb3IgdXBkYXRlIGV2ZW50cyBzZW50IGJ5IGl0cyBjb21wYW5pb24KKyMgcG9zdC1yZWNlaXZlLWNpbm90aWZ5IGhvb2ssIGNoZWNrcyBvdXQgYSBuZXcgY29weSBvZiBzb3VyY2UsCisjIGNvbXBpbGVzIGl0LCBhbmQgZW1haWxzIHRoZSBndWlsdHkgcGFydGllcyBpZiB0aGUgY29tcGlsZQorIyAoYW5kIG9wdGlvbmFsbHkgdGVzdCBzdWl0ZSkgZmFpbHMuCisjCisjIFRvIHVzZSB0aGlzIGRhZW1vbiwgY29uZmlndXJlIGl0IGFuZCBydW4gaXQuICBJdCB3aWxsIGRpc2Nvbm5lY3QKKyMgZnJvbSB5b3VyIHRlcm1pbmFsIGFuZCBmb3JrIGludG8gdGhlIGJhY2tncm91bmQuICBUaGUgZGFlbW9uIG11c3QKKyMgaGF2ZSBsb2NhbCBmaWxlc3lzdGVtIGFjY2VzcyB0byB0aGUgc291cmNlIHJlcG9zaXRvcmllcywgYXMgaXQKKyMgdXNlcyBvYmplY3RzL2luZm8vYWx0ZXJuYXRlcyB0byBhdm9pZCBjb3B5aW5nIG9iamVjdHMuCisjCisjIEFkZCBpdHMgY29tcGFuaW9uIHBvc3QtcmVjZWl2ZS1jaW5vdGlmeSBob29rIGFzIHRoZSBwb3N0LXJlY2VpdmUKKyMgaG9vayB0byBlYWNoIHJlcG9zaXRvcnkgdGhhdCB0aGUgZGFlbW9uIHNob3VsZCBtb25pdG9yLiAgWWVzLCBhCisjIHNpbmdsZSBkYWVtb24gY2FuIG1vbml0b3IgbW9yZSB0aGFuIG9uZSByZXBvc2l0b3J5LgorIworIyBUbyB1c2UgbXVsdGlwbGUgZGFlbW9ucyBvbiB0aGUgc2FtZSBzeXN0ZW0sIGdpdmUgdGhlbSBlYWNoIGEKKyMgdW5pcXVlIHF1ZXVlIGZpbGUgYW5kIHRtcGRpci4KKyMKKyMgR2xvYmFsIENvbmZpZworIyAtLS0tLS0tLS0tLS0tCisjIFJlYWRzIGZyb20gYSBHaXQgc3R5bGUgY29uZmlndXJhdGlvbiBmaWxlLiAgVGhpcyB3aWxsIGJlCisjIH4vLmdpdGNvbmZpZyBieSBkZWZhdWx0IGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzZXR0aW5nCisjIHRoZSBHSVRfQ09ORklHX0ZJTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgYmVmb3JlIHN0YXJ0aW5nLgorIworIyBjaWRhZW1vbi5zbXRwSG9zdAorIyAgIEhvc3RuYW1lIG9mIHRoZSBTTVRQIHNlcnZlciB0aGUgZGFlbW9uIHdpbGwgc2VuZCBlbWFpbAorIyAgIHRocm91Z2guICBEZWZhdWx0cyB0byAnbG9jYWxob3N0Jy4KKyMKKyMgY2lkYWVtb24uc210cFVzZXIKKyMgICBVc2VybmFtZSB0byBhdXRoZW50aWNhdGUgdG8gdGhlIFNNVFAgc2VydmVyIGFzLiAgVGhpcworIyAgIHZhcmlhYmxlIGlzIG9wdGlvbmFsOyBpZiBpdCBpcyBub3Qgc3VwcGxpZWQgdGhlbiBubworIyAgIGF1dGhlbnRpY2F0aW9uIHdpbGwgYmUgcGVyZm9ybWVkLgorIworIyBjaWRhZW1vbi5zbXRwUGFzc3dvcmQKKyMgICBQYXNzd29yZCB0byBhdXRoZW50aWNhdGUgdG8gdGhlIFNNVFAgc2VydmVyIGFzLiAgVGhpcworIyAgIHZhcmlhYmxlIGlzIG9wdGlvbmFsLiAgSWYgbm90IHN1cHBsaWVkIGJ1dCBzbXRwVXNlciB3YXMsCisjICAgdGhlIGRhZW1vbiBwcm9tcHRzIGZvciB0aGUgcGFzc3dvcmQgYmVmb3JlIGZvcmtpbmcgaW50bworIyAgIHRoZSBiYWNrZ3JvdW5kLgorIworIyBjaWRhZW1vbi5zbXRwQXV0aAorIyAgIFR5cGUgb2YgYXV0aGVudGljYXRpb24gdG8gcGVyZm9ybSB3aXRoIHRoZSBTTVRQIHNlcnZlci4KKyMgICBJZiBzZXQgdG8gJ2xvZ2luJyBhbmQgc210cFVzZXIgd2FzIGRlZmluZWQsIHRoaXMgd2lsbAorIyAgIHVzZSB0aGUgQVVUSCBMT0dJTiBjb21tYW5kLCB3aGljaCBpcyBzdWl0YWJsZSBmb3IgdXNlCisjICAgd2l0aCBhdCBsZWFzdCBvbmUgdmVyc2lvbiBvZiBNaWNyb3NvZnQgRXhjaGFuZ2UgU2VydmVyLgorIyAgIElmIG5vdCBzZXQgdGhlIGRhZW1vbiB3aWxsIHVzZSB3aGF0ZXZlciBhdXRoIG1ldGhvZHMKKyMgICBhcmUgc3VwcG9ydGVkIGJ5IHlvdXIgdmVyc2lvbiBvZiBOZXQ6OlNNVFAuCisjCisjIGNpZGFlbW9uLmVtYWlsCisjICAgRW1haWwgYWRkcmVzcyB0aGF0IGRhZW1vbiBnZW5lcmF0ZWQgZW1haWxzIHdpbGwgYmUgc2VudAorIyAgIGZyb20uICBUaGlzIHNob3VsZCBiZSBhIHVzZWZ1bCBlbWFpbCBhZGRyZXNzIHdpdGhpbiB5b3VyCisjICAgb3JnYW5pemF0aW9uLiAgUmVxdWlyZWQuCisjCisjIGNpZGFlbW9uLm5hbWUKKyMgICBIdW1hbiBmcmllbmRseSBuYW1lIHRoYXQgdGhlIGRhZW1vbiB3aWxsIHNlbmQgZW1haWxzIGFzLgorIyAgIERlZmF1bHRzIHRvICdjaWRhZW1vbicuCisjCisjIGNpZGFlbW9uLnNjYW5EZWxheQorIyAgIE51bWJlciBvZiBzZWNvbmRzIHRvIHNsZWVwIGJldHdlZW4gcG9sbHMgb2YgdGhlIHF1ZXVlIGZpbGUuCisjICAgRGVmYXVsdHMgdG8gNjAuCisjCisjIGNpZGFlbW9uLnJlY2VudENhY2hlCisjICAgTnVtYmVyIG9mIHJlY2VudCBjb21taXQgU0hBLTFzIHBlciByZXBvc2l0b3J5IHRvIGNhY2hlIGFuZAorIyAgIHNraXAgYnVpbGRpbmcgaWYgdGhleSBhcHBlYXIgYWdhaW4uICBUaGlzIGlzIHVzZWZ1bCB0byBhdm9pZAorIyAgIHJlYnVpbGRpbmcgdGhlIHNhbWUgY29tbWl0IG11bHRpcGxlIHRpbWVzIGp1c3QgYmVjYXVzZSBpdCB3YXMKKyMgICBwdXNoZWQgaW50byBtb3JlIHRoYW4gb25lIGJyYW5jaC4gIERlZmF1bHRzIHRvIDEwMC4KKyMKKyMgY2lkYWVtb24udG1wZGlyCisjICAgU2NyYXRjaCBkaXJlY3RvcnkgdG8gY3JlYXRlIHRoZSBidWlsZHMgd2l0aGluLiAgVGhlIGRhZW1vbgorIyAgIG1ha2VzIGEgbmV3IHN1YmRpcmVjdG9yeSBmb3IgZWFjaCBidWlsZCwgdGhlbiBkZWxldGVzIGl0IHdoZW4KKyMgICB0aGUgYnVpbGQgaGFzIGZpbmlzaGVkLiAgVGhlIHBpZCBmaWxlIGlzIGFsc28gcGxhY2VkIGhlcmUuCisjICAgRGVmYXVsdHMgdG8gJy90bXAnLgorIworIyBjaWRhZW1vbi5xdWV1ZQorIyAgIFBhdGggdG8gdGhlIHF1ZXVlIGZpbGUgdGhhdCB0aGUgcG9zdC1yZWNlaXZlLWNpbm90aWZ5IGhvb2sKKyMgICBhcHBlbmRzIGV2ZW50cyB0by4gIFRoaXMgZmlsZSBpcyBwb2xsZWQgYnkgdGhlIGRhZW1vbi4gIEl0CisjICAgbXVzdCBub3QgYmUgb24gYW4gTkZTIG1vdW50ICh1c2VzIGZsb2NrKS4gIFJlcXVpcmVkLgorIworIyBjaWRhZW1vbi5ub2NjCisjICAgUGVybCByZWdleCBwYXR0ZXJucyB0byBtYXRjaCBhZ2FpbnN0IGF1dGhvciBhbmQgY29tbWl0dGVyCisjICAgbGluZXMuICBJZiBhIHBhdHRlcm4gbWF0Y2hlcywgdGhhdCBhdXRob3Igb3IgY29tbWl0dGVyIHdpbGwKKyMgICBub3QgYmUgbm90aWZpZWQgb2YgYSBidWlsZCBmYWlsdXJlLgorIworIyBQZXIgUmVwb3NpdG9yeSBDb25maWcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSZWFkIGZyb20gdGhlIHNvdXJjZSByZXBvc2l0b3J5J3MgY29uZmlnIGZpbGUuCisjCisjIGJ1aWxkZXIuY29tbWFuZAorIyAgIFNoZWxsIGNvbW1hbmQgdG8gZXhlY3V0ZSB0aGUgYnVpbGQuICBUaGlzIGNvbW1hbmQgbXVzdAorIyAgIHJldHVybiAwIG9uICJzdWNjZXNzIiBhbmQgbm9uLXplcm8gb24gZmFpbHVyZS4gIElmIHlvdQorIyAgIGFsc28gd2FudCB0byBydW4gYSB0ZXN0IHN1aXRlLCBtYWtlIHN1cmUgeW91ciBjb21tYW5kCisjICAgZG9lcyB0aGF0IHRvby4gIFJlcXVpcmVkLgorIworIyBidWlsZGVyLnF1ZXVlCisjICAgUXVldWUgZmlsZSB0byBub3RpZnkgdGhlIGNpZGFlbW9uIHRocm91Z2guICBTaG91bGQgbWF0Y2gKKyMgICBjaWRhZW1vbi5xdWV1ZS4gIElmIG5vdCBzZXQgdGhlIGhvb2sgd2lsbCBub3Qgbm90aWZ5IHRoZQorIyAgIGNpZGFlbW9uLgorIworIyBidWlsZGVyLnNraXAKKyMgICBQZXJsIHJlZ2V4IHBhdHRlcm5zIG9mIHJlZnMgdGhhdCBzaG91bGQgbm90IGJlIHNlbnQgdG8KKyMgICBjaWRhZW1vbi4gIFVwZGF0ZXMgb2YgdGhlc2UgcmVmcyB3aWxsIGJlIGlnbm9yZWQuCisjCisjIGJ1aWxkZXIubmV3QnJhbmNoQmFzZQorIyAgIEdsb2IgcGF0dGVybnMgb2YgcmVmcyB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGZvcm0gdGhlCisjICAgJ29sZCcgcmV2aW9ucyBvZiBhIG5ld2x5IGNyZWF0ZWQgcmVmLiAgVGhpcyBzaG91bGQgc2V0CisjICAgdG8gYmUgZ2xvYnMgdGhhdCBtYXRjaCB5b3VyICdtYWlubGluZScgYnJhbmNoZXMuICBUaGlzCisjICAgd2F5IGEgYnVpbGQgZmFpbHVyZSBvZiBhIGJyYW5kIG5ldyB0b3BpYyBicmFuY2ggZG9lcyBub3QKKyMgICBhdHRlbXB0IHRvIGVtYWlsIGV2ZXJ5b25lIHNpbmNlIHRoZSBiZWdpbm5pbmcgb2YgdGltZTsKKyMgICBpbnN0ZWFkIGl0IG9ubHkgZW1haWxzIHRob3NlIGF1dGhvcnMgb2YgY29tbWl0cyBub3QgaW4KKyMgICB0aGVzZSAnbWFpbmxpbmUnIGJyYW5jaGVzLgorCitsb2NhbCAkRU5We1BBVEh9ID0gam9pbiAnOicsIHF3KAorCS9vcHQvZ2l0L2JpbgorCS91c3IvYmluCisJL2JpbgorCSk7CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgRmluZEJpbiBxdygkUmVhbEJpbik7Cit1c2UgRmlsZTo6U3BlYzsKK3VzZSBsaWIgRmlsZTo6U3BlYy0+Y2F0ZmlsZSgkUmVhbEJpbiwgJy4uJywgJ3Blcmw1Jyk7Cit1c2UgU3RvcmFibGUgcXcocmV0cmlldmUgbnN0b3JlKTsKK3VzZSBGY250bCAnOmZsb2NrJzsKK3VzZSBQT1NJWCBxdyhzdHJmdGltZSk7Cit1c2UgR2V0b3B0OjpMb25nIHF3KDpjb25maWcgbm9fYXV0b19hYmJyZXYgYXV0b19oZWxwKTsKKworc3ViIGdpdF9jb25maWcgKCQ7JCkKK3sKKwlteSAkdmFyID0gc2hpZnQ7CisJbXkgJHJlcXVpcmVkID0gc2hpZnQgfHwgMDsKKwlsb2NhbCAqR0lUOworCW9wZW4gR0lULCAnLXwnLCdnaXQnLCdjb25maWcnLCctLWdldCcsJHZhcjsKKwlteSAkciA9IDxHSVQ+OworCWNob3AgJHIgaWYgJHI7CisJY2xvc2UgR0lUOworCWRpZSAiZXJyb3I6ICR2YXIgbm90IHNldC5cbiIgaWYgKCRyZXF1aXJlZCAmJiAhJHIpOworCXJldHVybiAkcjsKK30KKworcGFja2FnZSBFWENIQU5HRV9ORVRfU01UUDsKKworIyBNaWNyb3NvZnQgRXhjaGFuZ2UgU2VydmVyIHJlcXVpcmVzIGFuICdBVVRIIExPR0lOJworIyBzdHlsZSBvZiBhdXRoZW50aWNhdGlvbi4gIFRoaXMgaXMgZGlmZmVyZW50IGZyb20KKyMgdGhlIGRlZmF1bHQgc3VwcG9ydGVkIGJ5IE5ldDo6U01UUCBzbyB3ZSBzdWJjbGFzcworIyBhbmQgb3ZlcnJpZGUgdGhlIGF1dGggbWV0aG9kIHRvIHN1cHBvcnQgdGhhdC4KKwordXNlIE5ldDo6U01UUDsKK3VzZSBOZXQ6OkNtZDsKK3VzZSBNSU1FOjpCYXNlNjQgcXcoZW5jb2RlX2Jhc2U2NCk7CitvdXIgQElTQSA9IHF3KE5ldDo6U01UUCk7CitvdXIgJGF1dGhfdHlwZSA9IDo6Z2l0X2NvbmZpZyAnY2lkYWVtb24uc210cEF1dGgnOworCitzdWIgbmV3Cit7CisJbXkgJHNlbGYgPSBzaGlmdDsKKwlteSAkdHlwZSA9IHJlZigkc2VsZikgfHwgJHNlbGY7CisJJHR5cGUtPlNVUEVSOjpuZXcoQF8pOworfQorCitzdWIgYXV0aAoreworCW15ICRzZWxmID0gc2hpZnQ7CisJcmV0dXJuICRzZWxmLT5TVVBFUjo6YXV0aChAXykgdW5sZXNzICRhdXRoX3R5cGUgZXEgJ2xvZ2luJzsKKworCW15ICR1c2VyID0gZW5jb2RlX2Jhc2U2NCBzaGlmdCwgJyc7CisJbXkgJHBhc3MgPSBlbmNvZGVfYmFzZTY0IHNoaWZ0LCAnJzsKKwlyZXR1cm4gMCB1bmxlc3MgQ01EX01PUkUgPT0gJHNlbGYtPmNvbW1hbmQoIkFVVEggTE9HSU4iKS0+cmVzcG9uc2U7CisJcmV0dXJuIDAgdW5sZXNzIENNRF9NT1JFID09ICRzZWxmLT5jb21tYW5kKCR1c2VyKS0+cmVzcG9uc2U7CisJQ01EX09LID09ICRzZWxmLT5jb21tYW5kKCRwYXNzKS0+cmVzcG9uc2U7Cit9CisKK3BhY2thZ2UgbWFpbjsKKworbXkgKCRkZWJ1Z19mbGFnLCAlcmVjZW50KTsKKworbXkgJGV4X2hvc3QgPSBnaXRfY29uZmlnKCdjaWRhZW1vbi5zbXRwSG9zdCcpIHx8ICdsb2NhbGhvc3QnOworbXkgJGV4X3VzZXIgPSBnaXRfY29uZmlnKCdjaWRhZW1vbi5zbXRwVXNlcicpOworbXkgJGV4X3Bhc3MgPSBnaXRfY29uZmlnKCdjaWRhZW1vbi5zbXRwUGFzc3dvcmQnKTsKKworbXkgJGV4X2Zyb21fYWRkciA9IGdpdF9jb25maWcoJ2NpZGFlbW9uLmVtYWlsJywgMSk7CitteSAkZXhfZnJvbV9uYW1lID0gZ2l0X2NvbmZpZygnY2lkYWVtb24ubmFtZScpIHx8ICdjaWRhZW1vbic7CisKK215ICRzY2FuX2RlbGF5ID0gZ2l0X2NvbmZpZygnY2lkYWVtb24uc2NhbkRlbGF5JykgfHwgNjA7CitteSAkcmVjZW50X3NpemUgPSBnaXRfY29uZmlnKCdjaWRhZW1vbi5yZWNlbnRDYWNoZScpIHx8IDEwMDsKK215ICR0bXBkaXIgPSBnaXRfY29uZmlnKCdjaWRhZW1vbi50bXBkaXInKSB8fCAnL3RtcCc7CitteSAkcXVldWVfbmFtZSA9IGdpdF9jb25maWcoJ2NpZGFlbW9uLnF1ZXVlJywgMSk7CitteSAkcXVldWVfbG9jayA9ICIkcXVldWVfbmFtZS5sb2NrIjsKKworbXkgQG5vY2NfbGlzdDsKK29wZW4gR0lULCdnaXQgY29uZmlnIC0tZ2V0LWFsbCBjaWRhZW1vbi5ub2NjfCc7Cit3aGlsZSAoPEdJVD4pIHsKKwljaG9wOworCXB1c2ggQG5vY2NfbGlzdCwgJF87Cit9CitjbG9zZSBHSVQ7CisKK3N1YiBub2NjX2F1dGhvciAoJCkKK3sKKwlsb2NhbCAkXyA9IHNoaWZ0OworCWZvcmVhY2ggbXkgJHBhdCAoQG5vY2NfbGlzdCkgeworCQlyZXR1cm4gMSBpZiAvJHBhdC87CisJfQorCTA7Cit9CisKK3N1YiBpbnB1dF9lY2hvICgkKQoreworCW15ICRwcm9tcHQgPSBzaGlmdDsKKworCWxvY2FsICR8ID0gMTsKKwlwcmludCAkcHJvbXB0OworCW15ICRpbnB1dCA9IDxTVERJTj47CisJY2hvcCAkaW5wdXQ7CisJcmV0dXJuICRpbnB1dDsKK30KKworc3ViIGlucHV0X25vZWNobyAoJCkKK3sKKwlteSAkcHJvbXB0ID0gc2hpZnQ7CisKKwlteSAkZW5kID0gc3ViIHtzeXN0ZW0oJ3N0dHknLCdlY2hvJyk7cHJpbnQgIlxuIjtleGl0fTsKKwlsb2NhbCAkU0lHe1RFUk19ID0gJGVuZDsKKwlsb2NhbCAkU0lHe0lOVH0gPSAkZW5kOworCXN5c3RlbSgnc3R0eScsJy1lY2hvJyk7CisKKwlsb2NhbCAkfCA9IDE7CisJcHJpbnQgJHByb21wdDsKKwlteSAkaW5wdXQgPSA8U1RESU4+OworCXN5c3RlbSgnc3R0eScsJ2VjaG8nKTsKKwlwcmludCAiXG4iOworCWNob3AgJGlucHV0OworCXJldHVybiAkaW5wdXQ7Cit9CisKK3N1YiByZmMyODIyX2RhdGUgKCkKK3sKKwkgc3RyZnRpbWUoIiVhLCAlZCAlYiAlWSAlSDolTTolUyAlWiIsIGxvY2FsdGltZSk7Cit9CisKK3N1YiBzZW5kX2VtYWlsICgkJCQpCit7CisJbXkgKCRzdWJqLCAkYm9keSwgJHRvKSA9IEBfOworCW15ICRub3cgPSByZmMyODIyX2RhdGU7CisJbXkgJHRvX3N0ciA9ICcnOworCW15IEByY3B0X3RvOworCWZvcmVhY2ggKEAkdG8pIHsKKwkJbXkgJHMgPSAkXzsKKwkJJHMgPX4gcy9eLyIvOworCQkkcyA9fiBzLyhccys8KS8iJDEvOworCQkkdG9fc3RyIC49ICcsICcgaWYgJHRvX3N0cjsKKwkJJHRvX3N0ciAuPSAkczsKKwkJcHVzaCBAcmNwdF90bywgJDEgaWYgJHMgPX4gLzwoLiopPi87CisJfQorCWRpZSAiTm9ib2R5IHRvIHNlbmQgdG8uXG4iIHVubGVzcyBAcmNwdF90bzsKKwlteSAkbXNnID0gPDxFT0Y7CitGcm9tOiAiJGV4X2Zyb21fbmFtZSIgPCRleF9mcm9tX2FkZHI+CitUbzogJHRvX3N0cgorRGF0ZTogJG5vdworU3ViamVjdDogJHN1YmoKKworJGJvZHkKK0VPRgorCisJbXkgJHNtdHAgPSBFWENIQU5HRV9ORVRfU01UUC0+bmV3KEhvc3QgPT4gJGV4X2hvc3QpCisJCW9yIGRpZSAiQ2Fubm90IGNvbm5lY3QgdG8gJGV4X2hvc3Q6ICQhXG4iOworCWlmICgkZXhfdXNlciAmJiAkZXhfcGFzcykgeworCQkkc210cC0+YXV0aCgkZXhfdXNlciwkZXhfcGFzcykKKwkJCW9yIGRpZSAiJGV4X2hvc3QgcmVqZWN0ZWQgJGV4X3VzZXJcbiI7CisJfQorCSRzbXRwLT5tYWlsKCRleF9mcm9tX2FkZHIpCisJCW9yIGRpZSAiJGV4X2hvc3QgcmVqZWN0ZWQgJGV4X2Zyb21fYWRkclxuIjsKKwlzY2FsYXIoJHNtdHAtPnJlY2lwaWVudChAcmNwdF90bywgeyBTa2lwQmFkID0+IDEgfSkpCisJCW9yIGRpZSAiJGV4X2hvc3QgZGlkIG5vdCBhY2NlcHQgYW55IGFkZHJlc3Nlcy5cbiI7CisJJHNtdHAtPmRhdGEoJG1zZykKKwkJb3IgZGllICIkZXhfaG9zdCByZWplY3RlZCBtZXNzYWdlIGRhdGFcbiI7CisJJHNtdHAtPnF1aXQ7Cit9CisKK3N1YiBwb3BfcXVldWUgKCkKK3sKKwlvcGVuIExPQ0ssICI+JHF1ZXVlX2xvY2siIG9yIGRpZSAiQ2FuJ3Qgb3BlbiAkcXVldWVfbG9jazogJCEiOworCWZsb2NrIExPQ0ssIExPQ0tfRVg7CisKKwlteSAkcXVldWUgPSAtZiAkcXVldWVfbmFtZSA/IHJldHJpZXZlICRxdWV1ZV9uYW1lIDogW107CisJbXkgJGVudCA9IHNoaWZ0IEAkcXVldWU7CisJbnN0b3JlICRxdWV1ZSwgJHF1ZXVlX25hbWU7CisKKwlmbG9jayBMT0NLLCBMT0NLX1VOOworCWNsb3NlIExPQ0s7CisJJGVudDsKK30KKworc3ViIGdpdF9leGVjIChAKQoreworCXN5c3RlbSgnZ2l0JyxAXykgPT0gMCBvciBkaWUgIkNhbm5vdCBnaXQgIiAuIGpvaW4oJyAnLCBAXykgLiAiXG4iOworfQorCitzdWIgZ2l0X3ZhbCAoQCkKK3sKKwlvcGVuKEMsICctfCcsJ2dpdCcsQF8pOworCW15ICRyID0gPEM+OworCWNob3AgJHIgaWYgJHI7CisJY2xvc2UgQzsKKwkkcjsKK30KKworc3ViIGRvX2J1aWxkICgkJCkKK3sKKwlteSAoJGdpdF9kaXIsICRuZXcpID0gQF87CisKKwlteSAkdG1wID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSgkdG1wZGlyLCAiYnVpbGRlciQkIik7CisJc3lzdGVtKCdybScsJy1yZicsJHRtcCkgPT0gMCBvciBkaWUgIkNhbm5vdCBjbGVhciAkdG1wXG4iOworCWRpZSAiQ2Fubm90IGNsZWFyICR0bXAuXG4iIGlmIC1lICR0bXA7CisKKwlteSAkcmVzdWx0ID0gMTsKKwlldmFsIHsKKwkJbXkgJGNvbW1hbmQ7CisJCXsKKwkJCWxvY2FsICRFTlZ7R0lUX0RJUn0gPSAkZ2l0X2RpcjsKKwkJCSRjb21tYW5kID0gZ2l0X3ZhbCAnY29uZmlnJywnYnVpbGRlci5jb21tYW5kJzsKKwkJfQorCQlkaWUgIk5vIGJ1aWxkZXIuY29tbWFuZCBmb3IgJGdpdF9kaXIuXG4iIHVubGVzcyAkY29tbWFuZDsKKworCQlnaXRfZXhlYyAnY2xvbmUnLCctbicsJy1sJywnLXMnLCRnaXRfZGlyLCR0bXA7CisJCWNobW9kIDA3MDAsICR0bXAgb3IgZGllICJDYW5ub3QgbG9jayAkdG1wXG4iOworCQljaGRpciAkdG1wIG9yIGRpZSAiQ2Fubm90IGVudGVyICR0bXBcbiI7CisKKwkJZ2l0X2V4ZWMgJ3VwZGF0ZS1yZWYnLCdIRUFEJywkbmV3OworCQlnaXRfZXhlYyAncmVhZC10cmVlJywnLW0nLCctdScsJ0hFQUQnLCdIRUFEJzsKKwkJc3lzdGVtICRjb21tYW5kOworCQlpZiAoJD8gPT0gLTEpIHsKKwkJCXByaW50IFNUREVSUiAiZmFpbGVkIHRvIGV4ZWN1dGUgJyRjb21tYW5kJzogJCFcbiI7CisJCQkkcmVzdWx0ID0gMTsKKwkJfSBlbHNpZiAoJD8gJiAxMjcpIHsKKwkJCW15ICRzaWcgPSAkPyAmIDEyNzsKKwkJCXByaW50IFNUREVSUiAiJyRjb21tYW5kJyBkaWVkIGZyb20gc2lnbmFsICRzaWdcbiI7CisJCQkkcmVzdWx0ID0gMTsKKwkJfSBlbHNlIHsKKwkJCW15ICRyID0gJD8gPj4gODsKKwkJCXByaW50IFNUREVSUiAiJyRjb21tYW5kJyBleGl0ZWQgd2l0aCAkclxuIiBpZiAkcjsKKwkJCSRyZXN1bHQgPSAkcjsKKwkJfQorCX07CisJaWYgKCRAKSB7CisJCSRyZXN1bHQgPSAyOworCQlwcmludCBTVERFUlIgIiRAXG4iOworCX0KKworCWNoZGlyICcvJzsKKwlzeXN0ZW0oJ3JtJywnLXJmJywkdG1wKTsKKwlybWRpciAkdG1wOworCSRyZXN1bHQ7Cit9CisKK3N1YiBidWlsZF9mYWlsZWQgKCQkJCQkKQoreworCW15ICgkZ2l0X2RpciwgJHJlZiwgJG9sZCwgJG5ldywgJG1zZykgPSBAXzsKKworCSRnaXRfZGlyID1+IG0sLyhbXi9dKykkLDsKKwlteSAkcmVwb19uYW1lID0gJDE7CisJJHJlZiA9fiBzLF5yZWZzLyhoZWFkc3x0YWdzKS8sLDsKKworCW15ICVhdXRob3JzOworCW15ICRzaG9ydGxvZzsKKwlteSAkcmV2c3RyOworCXsKKwkJbG9jYWwgJEVOVntHSVRfRElSfSA9ICRnaXRfZGlyOworCQlteSBAcmV2cyA9ICgkbmV3KTsKKwkJcHVzaCBAcmV2cywgJy0tbm90JywgQCRvbGQgaWYgQCRvbGQ7CisJCW9wZW4gTE9HLCctfCcsJ2dpdCcsJ3Jldi1saXN0JywnLS1wcmV0dHk9cmF3JyxAcmV2czsKKwkJd2hpbGUgKDxMT0c+KSB7CisJCQlpZiAocy9eKGF1dGhvcnxjb21taXR0ZXIpIC8vKSB7CisJCQkJY2hvbXA7CisJCQkJcy8+LiokLz4vOworCQkJCSRhdXRob3JzeyRffSA9IDEgdW5sZXNzIG5vY2NfYXV0aG9yICRfOworCQkJfQorCQl9CisJCWNsb3NlIExPRzsKKwkJb3BlbiBMT0csJy18JywnZ2l0Jywnc2hvcnRsb2cnLEByZXZzOworCQkkc2hvcnRsb2cgLj0gJF8gd2hpbGUgPExPRz47CisJCWNsb3NlIExPRzsKKwkJJHJldnN0ciA9IGpvaW4oJyAnLCBAcmV2cyk7CisJfQorCisJbXkgQHRvID0gc29ydCBrZXlzICVhdXRob3JzOworCXVubGVzcyAoQHRvKSB7CisJCXByaW50IFNUREVSUiAiZXJyb3I6IE5vIGF1dGhvcnMgaW4gJHJldnN0clxuIjsKKwkJcmV0dXJuOworCX0KKworCW15ICRzdWJqZWN0ID0gIlskcmVwb19uYW1lXSAkcmVmIDogQnVpbGQgRmFpbGVkIjsKKwlteSAkYm9keSA9IDw8RU9GOworUHJvamVjdDogJGdpdF9kaXIKK0JyYW5jaDogICRyZWYKK0NvbW1pdHM6ICRyZXZzdHIKKworJHNob3J0bG9nCitCdWlsZCBPdXRwdXQ6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJG1zZworRU9GCisJc2VuZF9lbWFpbCgkc3ViamVjdCwgJGJvZHksIFxAdG8pOworfQorCitzdWIgcnVuX2J1aWxkICgkJCQkKQoreworCW15ICgkZ2l0X2RpciwgJHJlZiwgJG9sZCwgJG5ldykgPSBAXzsKKworCWlmICgkZGVidWdfZmxhZykgeworCQlteSBAcmV2cyA9ICgkbmV3KTsKKwkJcHVzaCBAcmV2cywgJy0tbm90JywgQCRvbGQgaWYgQCRvbGQ7CisJCXByaW50ICJCVUlMRElORyAkZ2l0X2RpclxuIjsKKwkJcHJpbnQgIiAgQlJBTkNIOiAkcmVmXG4iOworCQlwcmludCAiICBDT01NSVRTOiAiLCBqb2luKCcgJywgQHJldnMpLCAiXG4iOworCX0KKworCWxvY2FsKCpSLCAqVyk7CisJcGlwZSBSLCBXIG9yIGRpZSAiY2Fubm90IHBpcGUgYnVpbGRlcjogJCEiOworCisJbXkgJGJ1aWxkZXIgPSBmb3JrKCk7CisJaWYgKCFkZWZpbmVkICRidWlsZGVyKSB7CisJCWRpZSAiY2Fubm90IGZvcmsgYnVpbGRlcjogJCEiOworCX0gZWxzaWYgKDAgPT0gJGJ1aWxkZXIpIHsKKwkJY2xvc2UgUjsKKwkJY2xvc2UgU1RESU47b3BlbihTVERJTiwgJy9kZXYvbnVsbCcpOworCQlvcGVuKFNURE9VVCwgJz4mVycpOworCQlvcGVuKFNUREVSUiwgJz4mVycpOworCQlleGl0IGRvX2J1aWxkICRnaXRfZGlyLCAkbmV3OworCX0gZWxzZSB7CisJCWNsb3NlIFc7CisJCW15ICRvdXQgPSAnJzsKKwkJJG91dCAuPSAkXyB3aGlsZSA8Uj47CisJCWNsb3NlIFI7CisJCXdhaXRwaWQgJGJ1aWxkZXIsIDA7CisJCWJ1aWxkX2ZhaWxlZCAkZ2l0X2RpciwgJHJlZiwgJG9sZCwgJG5ldywgJG91dCBpZiAkPzsKKwl9CisKKwlwcmludCAiRE9ORVxuXG4iIGlmICRkZWJ1Z19mbGFnOworfQorCitzdWIgZGFlbW9uX2xvb3AgKCkKK3sKKwlteSAkcnVuID0gMTsKKwlteSAkc3RvcF9zdWIgPSBzdWIgeyRydW4gPSAwfTsKKwkkU0lHe0hVUH0gPSAkc3RvcF9zdWI7CisJJFNJR3tJTlR9ID0gJHN0b3Bfc3ViOworCSRTSUd7VEVSTX0gPSAkc3RvcF9zdWI7CisKKwlta2RpciAkdG1wZGlyLCAwNzU1OworCW15ICRwaWRmaWxlID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSgkdG1wZGlyLCAiY2lkYWVtb24ucGlkIik7CisJb3BlbihPLCAiPiRwaWRmaWxlIik7IHByaW50IE8gIiQkXG4iOyBjbG9zZSBPOworCisJd2hpbGUgKCRydW4pIHsKKwkJbXkgJGVudCA9IHBvcF9xdWV1ZTsKKwkJaWYgKCRlbnQpIHsKKwkJCW15ICgkZ2l0X2RpciwgJHJlZiwgJG9sZCwgJG5ldykgPSBAJGVudDsKKworCQkJJGVudCA9ICRyZWNlbnR7JGdpdF9kaXJ9OworCQkJJHJlY2VudHskZ2l0X2Rpcn0gPSAkZW50ID0gW1tdLCB7fV0gdW5sZXNzICRlbnQ7CisJCQlteSAoJHJlY19hcnIsICRyZWNfaGFzaCkgPSBAJGVudDsKKwkJCW5leHQgaWYgJHJlY19oYXNoLT57JG5ld30rKzsKKwkJCXdoaWxlIChAJHJlY19hcnIgPj0gJHJlY2VudF9zaXplKSB7CisJCQkJbXkgJHRvX2tpbGwgPSBzaGlmdCBAJHJlY19hcnI7CisJCQkJZGVsZXRlICRyZWNfaGFzaC0+eyR0b19raWxsfTsKKwkJCX0KKwkJCXB1c2ggQCRyZWNfYXJyLCAkbmV3OworCisJCQlydW5fYnVpbGQgJGdpdF9kaXIsICRyZWYsICRvbGQsICRuZXc7CisJCX0gZWxzZSB7CisJCQlzbGVlcCAkc2Nhbl9kZWxheTsKKwkJfQorCX0KKworCXVubGluayAkcGlkZmlsZTsKK30KKworJGRlYnVnX2ZsYWcgPSAwOworR2V0T3B0aW9ucygKKwknZGVidWd8ZCcgPT4gXCRkZWJ1Z19mbGFnLAorCSdzbXRwLXVzZXI9cycgPT4gXCRleF91c2VyLAorKSBvciBkaWUgInVzYWdlOiAkMCBbLS1kZWJ1Z10gWy0tc210cC11c2VyPXVzZXJdXG4iOworCiskZXhfcGFzcyA9IGlucHV0X25vZWNobygiJGV4X3VzZXIgU01UUCBwYXNzd29yZDogIikKKwlpZiAoJGV4X3VzZXIgJiYgISRleF9wYXNzKTsKKworaWYgKCRkZWJ1Z19mbGFnKSB7CisJZGFlbW9uX2xvb3A7CisJZXhpdCAwOworfQorCitteSAkZGFlbW9uID0gZm9yaygpOworaWYgKCFkZWZpbmVkICRkYWVtb24pIHsKKwlkaWUgImNhbm5vdCBmb3JrIGRhZW1vbjogJCEiOworfSBlbHNpZiAoMCA9PSAkZGFlbW9uKSB7CisJY2xvc2UgU1RESU47b3BlbihTVERJTiwgJy9kZXYvbnVsbCcpOworCWNsb3NlIFNURE9VVDtvcGVuKFNURE9VVCwgJz4vZGV2L251bGwnKTsKKwljbG9zZSBTVERFUlI7b3BlbihTVERFUlIsICc+L2Rldi9udWxsJyk7CisJZGFlbW9uX2xvb3A7CisJZXhpdCAwOworfSBlbHNlIHsKKwlwcmludCAiRGFlbW9uICRkYWVtb24gcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZC5cbiI7Cit9CmRpZmYgLS1naXQgYS9jb250cmliL2NvbnRpbnVvdXMvcG9zdC1yZWNlaXZlLWNpbm90aWZ5IGIvY29udHJpYi9jb250aW51b3VzL3Bvc3QtcmVjZWl2ZS1jaW5vdGlmeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGY1YTYwCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9jb250aW51b3VzL3Bvc3QtcmVjZWl2ZS1jaW5vdGlmeQpAQCAtMCwwICsxLDEwNCBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjIEEgaG9vayB0aGF0IG5vdGlmaWVzIGl0cyBjb21wYW5pb24gY2lkYWVtb24gdGhyb3VnaCBhIHNpbXBsZQorIyBxdWV1ZSBmaWxlIHRoYXQgYSByZWYgaGFzIGJlZW4gdXBkYXRlZCB2aWEgYSBwdXNoIChhY3R1YWxseQorIyBieSBhIHJlY2VpdmUtcGFjayBydW5uaW5nIG9uIHRoZSBzZXJ2ZXIpLgorIworIyBTZWUgY2lkYWVtb24gZm9yIHBlci1yZXBvc2l0b3J5IGNvbmZpZ3VyYXRpb24gZGV0YWlscy4KKyMKKyMgVG8gdXNlIHRoaXMgaG9vaywgYWRkIGl0IGFzIHRoZSBwb3N0LXJlY2VpdmUgaG9vaywgbWFrZSBpdAorIyBleGVjdXRhYmxlLCBhbmQgc2V0IGl0cyBjb25maWd1cmF0aW9uIG9wdGlvbnMuCisjCisKK2xvY2FsICRFTlZ7UEFUSH0gPSAnL29wdC9naXQvYmluJzsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBGaWxlOjpTcGVjOwordXNlIFN0b3JhYmxlIHF3KHJldHJpZXZlIG5zdG9yZSk7Cit1c2UgRmNudGwgJzpmbG9jayc7CisKK215ICRnaXRfZGlyID0gRmlsZTo6U3BlYy0+cmVsMmFicygkRU5We0dJVF9ESVJ9KTsKK215ICRxdWV1ZV9uYW1lID0gYGdpdCBjb25maWcgLS1nZXQgYnVpbGRlci5xdWV1ZWA7Y2hvcCAkcXVldWVfbmFtZTsKKyRxdWV1ZV9uYW1lID1+IG0sXihbXlxzXSspJCw7ICRxdWV1ZV9uYW1lID0gJDE7ICMgdW50YWludAordW5sZXNzICgkcXVldWVfbmFtZSkgeworCTEgd2hpbGUgPFNURElOPjsKKwlwcmludCBTVERFUlIgIlxuZXJyb3I6IGJ1aWxkZXIucXVldWUgbm90IHNldC4gIE5vdCBlbnF1ZWluZy5cblxuIjsKKwlleGl0OworfQorbXkgJHF1ZXVlX2xvY2sgPSAiJHF1ZXVlX25hbWUubG9jayI7CisKK215IEBza2lwOworb3BlbiBTLCAiZ2l0IGNvbmZpZyAtLWdldC1hbGwgYnVpbGRlci5za2lwfCI7Cit3aGlsZSAoPFM+KSB7CisJY2hvcDsKKwlwdXNoIEBza2lwLCAkXzsKK30KK2Nsb3NlIFM7CisKK215IEBuZXdfYnJhbmNoX2Jhc2U7CitvcGVuIFMsICJnaXQgY29uZmlnIC0tZ2V0LWFsbCBidWlsZGVyLm5ld0JyYW5jaEJhc2V8IjsKK3doaWxlICg8Uz4pIHsKKwljaG9wOworCXB1c2ggQG5ld19icmFuY2hfYmFzZSwgJF87Cit9CitjbG9zZSBTOworCitzdWIgc2tpcCAoJCkKK3sKKwlsb2NhbCAkXyA9IHNoaWZ0OworCWZvcmVhY2ggbXkgJHAgKEBza2lwKSB7CisJCXJldHVybiAxIGlmIC9eJHAvOworCX0KKwkwOworfQorCitvcGVuIExPQ0ssICI+JHF1ZXVlX2xvY2siIG9yIGRpZSAiQ2FuJ3Qgb3BlbiAkcXVldWVfbG9jazogJCEiOworZmxvY2sgTE9DSywgTE9DS19FWDsKKworbXkgJHF1ZXVlID0gLWYgJHF1ZXVlX25hbWUgPyByZXRyaWV2ZSAkcXVldWVfbmFtZSA6IFtdOworbXkgJWV4aXN0aW5nOworZm9yZWFjaCBteSAkciAoQCRxdWV1ZSkgeworCW15ICgkZ2QsICRyZWYpID0gQCRyOworCSRleGlzdGluZ3skZ2R9eyRyZWZ9ID0gJHI7Cit9CisKK215IEBuZXdfYnJhbmNoX2NvbW1pdHM7CitteSAkbG9hZGVkX25ld19icmFuY2hfY29tbWl0cyA9IDA7CisKK3doaWxlICg8U1RESU4+KSB7CisJY2hvcDsKKwlteSAoJG9sZCwgJG5ldywgJHJlZikgPSBzcGxpdCAvIC8sICRfLCAzOworCisJbmV4dCBpZiAkb2xkIGVxICRuZXc7CisJbmV4dCBpZiAkbmV3ID1+IC9eMHs0MH0kLzsKKwluZXh0IGlmIHNraXAgJHJlZjsKKworCW15ICRyID0gJGV4aXN0aW5neyRnaXRfZGlyfXskcmVmfTsKKwlpZiAoJHIpIHsKKwkJJHItPlszXSA9ICRuZXc7CisJfSBlbHNlIHsKKwkJaWYgKCRvbGQgPX4gL14wezQwfSQvKSB7CisJCQlpZiAoISRsb2FkZWRfbmV3X2JyYW5jaF9jb21taXRzICYmIEBuZXdfYnJhbmNoX2Jhc2UpIHsKKwkJCQlvcGVuIE0sJy18JywnZ2l0Jywnc2hvdy1yZWYnLEBuZXdfYnJhbmNoX2Jhc2U7CisJCQkJd2hpbGUgKDxNPikgeworCQkJCQkoJF8pID0gc3BsaXQgLyAvLCAkXzsKKwkJCQkJcHVzaCBAbmV3X2JyYW5jaF9jb21taXRzLCAkXzsKKwkJCQl9CisJCQkJY2xvc2UgTTsKKwkJCQkkbG9hZGVkX25ld19icmFuY2hfY29tbWl0cyA9IDE7CisJCQl9CisJCQkkb2xkID0gW0BuZXdfYnJhbmNoX2NvbW1pdHNdOworCQl9IGVsc2UgeworCQkJJG9sZCA9IFskb2xkXTsKKwkJfQorCisJCSRyID0gWyRnaXRfZGlyLCAkcmVmLCAkb2xkLCAkbmV3XTsKKwkJJGV4aXN0aW5neyRnaXRfZGlyfXskcmVmfSA9ICRyOworCQlwdXNoIEAkcXVldWUsICRyOworCX0KK30KK25zdG9yZSAkcXVldWUsICRxdWV1ZV9uYW1lOworCitmbG9jayBMT0NLLCBMT0NLX1VOOworY2xvc2UgTE9DSzsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvY29udmVydC1vYmplY3RzL2NvbnZlcnQtb2JqZWN0cy5jIGIvY29udHJpYi9jb252ZXJ0LW9iamVjdHMvY29udmVydC1vYmplY3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBlNzkwMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvY29udmVydC1vYmplY3RzL2NvbnZlcnQtb2JqZWN0cy5jCkBAIC0wLDAgKzEsMzI5IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidHJlZS5oIgorCitzdHJ1Y3QgZW50cnkgeworCXVuc2lnbmVkIGNoYXIgb2xkX3NoYTFbMjBdOworCXVuc2lnbmVkIGNoYXIgbmV3X3NoYTFbMjBdOworCWludCBjb252ZXJ0ZWQ7Cit9OworCisjZGVmaW5lIE1BWE9CSkVDVFMgKDEwMDAwMDApCisKK3N0YXRpYyBzdHJ1Y3QgZW50cnkgKmNvbnZlcnRbTUFYT0JKRUNUU107CitzdGF0aWMgaW50IG5yX2NvbnZlcnQ7CisKK3N0YXRpYyBzdHJ1Y3QgZW50cnkgKiBjb252ZXJ0X2VudHJ5KHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCitzdGF0aWMgc3RydWN0IGVudHJ5ICppbnNlcnRfbmV3KHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBwb3MpCit7CisJc3RydWN0IGVudHJ5ICpuZXcgPSB4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgZW50cnkpKTsKKwloYXNoY3B5KG5ldy0+b2xkX3NoYTEsIHNoYTEpOworCW1lbW1vdmUoY29udmVydCArIHBvcyArIDEsIGNvbnZlcnQgKyBwb3MsIChucl9jb252ZXJ0IC0gcG9zKSAqIHNpemVvZihzdHJ1Y3QgZW50cnkgKikpOworCWNvbnZlcnRbcG9zXSA9IG5ldzsKKwlucl9jb252ZXJ0Kys7CisJaWYgKG5yX2NvbnZlcnQgPT0gTUFYT0JKRUNUUykKKwkJZGllKCJ5b3UncmUga2lkZGluZyBtZSAtIGhpdCBtYXhpbXVtIG9iamVjdCBsaW1pdCIpOworCXJldHVybiBuZXc7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZW50cnkgKmxvb2t1cF9lbnRyeSh1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBsb3cgPSAwLCBoaWdoID0gbnJfY29udmVydDsKKworCXdoaWxlIChsb3cgPCBoaWdoKSB7CisJCWludCBuZXh0ID0gKGxvdyArIGhpZ2gpIC8gMjsKKwkJc3RydWN0IGVudHJ5ICpuID0gY29udmVydFtuZXh0XTsKKwkJaW50IGNtcCA9IGhhc2hjbXAoc2hhMSwgbi0+b2xkX3NoYTEpOworCQlpZiAoIWNtcCkKKwkJCXJldHVybiBuOworCQlpZiAoY21wIDwgMCkgeworCQkJaGlnaCA9IG5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQlsb3cgPSBuZXh0KzE7CisJfQorCXJldHVybiBpbnNlcnRfbmV3KHNoYTEsIGxvdyk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRfYmluYXJ5X3NoYTEodm9pZCAqYnVmZmVyKQoreworCXN0cnVjdCBlbnRyeSAqZW50cnkgPSBjb252ZXJ0X2VudHJ5KGJ1ZmZlcik7CisJaGFzaGNweShidWZmZXIsIGVudHJ5LT5uZXdfc2hhMSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRfYXNjaWlfc2hhMSh2b2lkICpidWZmZXIpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3QgZW50cnkgKmVudHJ5OworCisJaWYgKGdldF9zaGExX2hleChidWZmZXIsIHNoYTEpKQorCQlkaWUoImV4cGVjdGVkIHNoYTEsIGdvdCAnJXMnIiwgKGNoYXIqKSBidWZmZXIpOworCWVudHJ5ID0gY29udmVydF9lbnRyeShzaGExKTsKKwltZW1jcHkoYnVmZmVyLCBzaGExX3RvX2hleChlbnRyeS0+bmV3X3NoYTEpLCA0MCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29udmVydF9tb2RlKHVuc2lnbmVkIGludCBtb2RlKQoreworCXVuc2lnbmVkIGludCBuZXdtb2RlOworCisJbmV3bW9kZSA9IG1vZGUgJiBTX0lGTVQ7CisJaWYgKFNfSVNSRUcobW9kZSkpCisJCW5ld21vZGUgfD0gKG1vZGUgJiAwMTAwKSA/IDA3NTUgOiAwNjQ0OworCXJldHVybiBuZXdtb2RlOworfQorCitzdGF0aWMgaW50IHdyaXRlX3N1YmRpcmVjdG9yeSh2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4sIHVuc2lnbmVkIGNoYXIgKnJlc3VsdF9zaGExKQoreworCWNoYXIgKm5ldyA9IHhtYWxsb2Moc2l6ZSk7CisJdW5zaWduZWQgbG9uZyBuZXdsZW4gPSAwOworCXVuc2lnbmVkIGxvbmcgdXNlZDsKKworCXVzZWQgPSAwOworCXdoaWxlIChzaXplKSB7CisJCWludCBsZW4gPSAyMSArIHN0cmxlbihidWZmZXIpOworCQljaGFyICpwYXRoID0gc3RyY2hyKGJ1ZmZlciwgJyAnKTsKKwkJdW5zaWduZWQgY2hhciAqc2hhMTsKKwkJdW5zaWduZWQgaW50IG1vZGU7CisJCWNoYXIgKnNsYXNoLCAqb3JpZ3BhdGg7CisKKwkJaWYgKCFwYXRoIHx8IHN0cnRvdWxfdWkoYnVmZmVyLCA4LCAmbW9kZSkpCisJCQlkaWUoImJhZCB0cmVlIGNvbnZlcnNpb24iKTsKKwkJbW9kZSA9IGNvbnZlcnRfbW9kZShtb2RlKTsKKwkJcGF0aCsrOworCQlpZiAobWVtY21wKHBhdGgsIGJhc2UsIGJhc2VsZW4pKQorCQkJYnJlYWs7CisJCW9yaWdwYXRoID0gcGF0aDsKKwkJcGF0aCArPSBiYXNlbGVuOworCQlzbGFzaCA9IHN0cmNocihwYXRoLCAnLycpOworCQlpZiAoIXNsYXNoKSB7CisJCQluZXdsZW4gKz0gc3ByaW50ZihuZXcgKyBuZXdsZW4sICIlbyAlcyIsIG1vZGUsIHBhdGgpOworCQkJbmV3W25ld2xlbisrXSA9ICdcMCc7CisJCQloYXNoY3B5KCh1bnNpZ25lZCBjaGFyKiluZXcgKyBuZXdsZW4sICh1bnNpZ25lZCBjaGFyICopIGJ1ZmZlciArIGxlbiAtIDIwKTsKKwkJCW5ld2xlbiArPSAyMDsKKworCQkJdXNlZCArPSBsZW47CisJCQlzaXplIC09IGxlbjsKKwkJCWJ1ZmZlciA9IChjaGFyICopIGJ1ZmZlciArIGxlbjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbmV3bGVuICs9IHNwcmludGYobmV3ICsgbmV3bGVuLCAiJW8gJS4qcyIsIFNfSUZESVIsIChpbnQpKHNsYXNoIC0gcGF0aCksIHBhdGgpOworCQluZXdbbmV3bGVuKytdID0gMDsKKwkJc2hhMSA9ICh1bnNpZ25lZCBjaGFyICopKG5ldyArIG5ld2xlbik7CisJCW5ld2xlbiArPSAyMDsKKworCQlsZW4gPSB3cml0ZV9zdWJkaXJlY3RvcnkoYnVmZmVyLCBzaXplLCBvcmlncGF0aCwgc2xhc2gtb3JpZ3BhdGgrMSwgc2hhMSk7CisKKwkJdXNlZCArPSBsZW47CisJCXNpemUgLT0gbGVuOworCQlidWZmZXIgPSAoY2hhciAqKSBidWZmZXIgKyBsZW47CisJfQorCisJd3JpdGVfc2hhMV9maWxlKG5ldywgbmV3bGVuLCB0cmVlX3R5cGUsIHJlc3VsdF9zaGExKTsKKwlmcmVlKG5ldyk7CisJcmV0dXJuIHVzZWQ7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRfdHJlZSh2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgY2hhciAqcmVzdWx0X3NoYTEpCit7CisJdm9pZCAqb3JpZ19idWZmZXIgPSBidWZmZXI7CisJdW5zaWduZWQgbG9uZyBvcmlnX3NpemUgPSBzaXplOworCisJd2hpbGUgKHNpemUpIHsKKwkJc2l6ZV90IGxlbiA9IDErc3RybGVuKGJ1ZmZlcik7CisKKwkJY29udmVydF9iaW5hcnlfc2hhMSgoY2hhciAqKSBidWZmZXIgKyBsZW4pOworCisJCWxlbiArPSAyMDsKKwkJaWYgKGxlbiA+IHNpemUpCisJCQlkaWUoImNvcnJ1cHQgdHJlZSBvYmplY3QiKTsKKwkJc2l6ZSAtPSBsZW47CisJCWJ1ZmZlciA9IChjaGFyICopIGJ1ZmZlciArIGxlbjsKKwl9CisKKwl3cml0ZV9zdWJkaXJlY3Rvcnkob3JpZ19idWZmZXIsIG9yaWdfc2l6ZSwgIiIsIDAsIHJlc3VsdF9zaGExKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFyc2Vfb2xkc3R5bGVfZGF0ZShjb25zdCBjaGFyICpidWYpCit7CisJY2hhciBjLCAqcDsKKwljaGFyIGJ1ZmZlclsxMDBdOworCXN0cnVjdCB0bSB0bTsKKwljb25zdCBjaGFyICpmb3JtYXRzW10gPSB7CisJCSIlYyIsCisJCSIlYSAlYiAlZCAlVCIsCisJCSIlWiIsCisJCSIlWSIsCisJCSIgJVkiLAorCQlOVUxMCisJfTsKKwkvKiBXZSBvbmx5IGV2ZXIgZGlkIHR3byB0aW1lem9uZXMgaW4gdGhlIGJhZCBvbGQgZm9ybWF0IC4uICovCisJY29uc3QgY2hhciAqdGltZXpvbmVzW10gPSB7CisJCSJQRFQiLCAiUFNUIiwgIkNFU1QiLCBOVUxMCisJfTsKKwljb25zdCBjaGFyICoqZm10ID0gZm9ybWF0czsKKworCXAgPSBidWZmZXI7CisJd2hpbGUgKGlzc3BhY2UoYyA9ICpidWYpKQorCQlidWYrKzsKKwl3aGlsZSAoKGMgPSAqYnVmKyspICE9ICdcbicpCisJCSpwKysgPSBjOworCSpwKysgPSAwOworCWJ1ZiA9IGJ1ZmZlcjsKKwltZW1zZXQoJnRtLCAwLCBzaXplb2YodG0pKTsKKwlkbyB7CisJCWNvbnN0IGNoYXIgKm5leHQgPSBzdHJwdGltZShidWYsICpmbXQsICZ0bSk7CisJCWlmIChuZXh0KSB7CisJCQlpZiAoISpuZXh0KQorCQkJCXJldHVybiBta3RpbWUoJnRtKTsKKwkJCWJ1ZiA9IG5leHQ7CisJCX0gZWxzZSB7CisJCQljb25zdCBjaGFyICoqcCA9IHRpbWV6b25lczsKKwkJCXdoaWxlIChpc3NwYWNlKCpidWYpKQorCQkJCWJ1ZisrOworCQkJd2hpbGUgKCpwKSB7CisJCQkJaWYgKCFtZW1jbXAoYnVmLCAqcCwgc3RybGVuKCpwKSkpIHsKKwkJCQkJYnVmICs9IHN0cmxlbigqcCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlwKys7CisJCQl9CisJCX0KKwkJZm10Kys7CisJfSB3aGlsZSAoKmJ1ZiAmJiAqZm10KTsKKwlwcmludGYoImxlZnQ6ICVzXG4iLCBidWYpOworCXJldHVybiBta3RpbWUoJnRtKTsKK30KKworc3RhdGljIGludCBjb252ZXJ0X2RhdGVfbGluZShjaGFyICpkc3QsIHZvaWQgKipidWYsIHVuc2lnbmVkIGxvbmcgKnNwKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9ICpzcDsKKwljaGFyICpsaW5lID0gKmJ1ZjsKKwljaGFyICpuZXh0ID0gc3RyY2hyKGxpbmUsICdcbicpOworCWNoYXIgKmRhdGUgPSBzdHJjaHIobGluZSwgJz4nKTsKKwlpbnQgbGVuOworCisJaWYgKCFuZXh0IHx8ICFkYXRlKQorCQlkaWUoIm1pc3Npbmcgb3IgYmFkIGF1dGhvci9jb21taXR0ZXIgbGluZSAlcyIsIGxpbmUpOworCW5leHQrKzsgZGF0ZSArPSAyOworCisJKmJ1ZiA9IG5leHQ7CisJKnNwID0gc2l6ZSAtIChuZXh0IC0gbGluZSk7CisKKwlsZW4gPSBkYXRlIC0gbGluZTsKKwltZW1jcHkoZHN0LCBsaW5lLCBsZW4pOworCWRzdCArPSBsZW47CisKKwkvKiBJcyBpdCBhbHJlYWR5IGluIG5ldyBmb3JtYXQ/ICovCisJaWYgKGlzZGlnaXQoKmRhdGUpKSB7CisJCWludCBkYXRlbGVuID0gbmV4dCAtIGRhdGU7CisJCW1lbWNweShkc3QsIGRhdGUsIGRhdGVsZW4pOworCQlyZXR1cm4gbGVuICsgZGF0ZWxlbjsKKwl9CisKKwkvKgorCSAqIEhhY2t5IGhhY2t5OiBvbmUgb2YgdGhlIHNwYXJzZSBvbGQtc3R5bGUgY29tbWl0cyBkb2VzIG5vdCBoYXZlCisJICogYW55IGRhdGUgYXQgYWxsLCBidXQgd2UgY2FuIGZha2UgaXQgYnkgdXNpbmcgdGhlIGNvbW1pdHRlciBkYXRlLgorCSAqLworCWlmICgqZGF0ZSA9PSAnXG4nICYmIHN0cmNocihuZXh0LCAnPicpKQorCQlkYXRlID0gc3RyY2hyKG5leHQsICc+JykrMjsKKworCXJldHVybiBsZW4gKyBzcHJpbnRmKGRzdCwgIiVsdSAtMDcwMFxuIiwgcGFyc2Vfb2xkc3R5bGVfZGF0ZShkYXRlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRfZGF0ZSh2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgY2hhciAqcmVzdWx0X3NoYTEpCit7CisJY2hhciAqbmV3ID0geG1hbGxvYyhzaXplICsgMTAwKTsKKwl1bnNpZ25lZCBsb25nIG5ld2xlbiA9IDA7CisKKwkvKiAidHJlZSA8c2hhMT5cbiIgKi8KKwltZW1jcHkobmV3ICsgbmV3bGVuLCBidWZmZXIsIDQ2KTsKKwluZXdsZW4gKz0gNDY7CisJYnVmZmVyID0gKGNoYXIgKikgYnVmZmVyICsgNDY7CisJc2l6ZSAtPSA0NjsKKworCS8qICJwYXJlbnQgPHNoYTE+XG4iICovCisJd2hpbGUgKCFtZW1jbXAoYnVmZmVyLCAicGFyZW50ICIsIDcpKSB7CisJCW1lbWNweShuZXcgKyBuZXdsZW4sIGJ1ZmZlciwgNDgpOworCQluZXdsZW4gKz0gNDg7CisJCWJ1ZmZlciA9IChjaGFyICopIGJ1ZmZlciArIDQ4OworCQlzaXplIC09IDQ4OworCX0KKworCS8qICJhdXRob3IgeHl6IDx4eXo+IGRhdGUiICovCisJbmV3bGVuICs9IGNvbnZlcnRfZGF0ZV9saW5lKG5ldyArIG5ld2xlbiwgJmJ1ZmZlciwgJnNpemUpOworCS8qICJjb21taXR0ZXIgeHl6IDx4eXo+IGRhdGUiICovCisJbmV3bGVuICs9IGNvbnZlcnRfZGF0ZV9saW5lKG5ldyArIG5ld2xlbiwgJmJ1ZmZlciwgJnNpemUpOworCisJLyogUmVzdCAqLworCW1lbWNweShuZXcgKyBuZXdsZW4sIGJ1ZmZlciwgc2l6ZSk7CisJbmV3bGVuICs9IHNpemU7CisKKwl3cml0ZV9zaGExX2ZpbGUobmV3LCBuZXdsZW4sIGNvbW1pdF90eXBlLCByZXN1bHRfc2hhMSk7CisJZnJlZShuZXcpOworfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0X2NvbW1pdCh2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgY2hhciAqcmVzdWx0X3NoYTEpCit7CisJdm9pZCAqb3JpZ19idWZmZXIgPSBidWZmZXI7CisJdW5zaWduZWQgbG9uZyBvcmlnX3NpemUgPSBzaXplOworCisJaWYgKG1lbWNtcChidWZmZXIsICJ0cmVlICIsIDUpKQorCQlkaWUoIkJhZCBjb21taXQgJyVzJyIsIChjaGFyKikgYnVmZmVyKTsKKwljb252ZXJ0X2FzY2lpX3NoYTEoKGNoYXIgKikgYnVmZmVyICsgNSk7CisJYnVmZmVyID0gKGNoYXIgKikgYnVmZmVyICsgNDY7ICAgIC8qICJ0cmVlICIgKyAiaGV4IHNoYTEiICsgIlxuIiAqLworCXdoaWxlICghbWVtY21wKGJ1ZmZlciwgInBhcmVudCAiLCA3KSkgeworCQljb252ZXJ0X2FzY2lpX3NoYTEoKGNoYXIgKikgYnVmZmVyICsgNyk7CisJCWJ1ZmZlciA9IChjaGFyICopIGJ1ZmZlciArIDQ4OworCX0KKwljb252ZXJ0X2RhdGUob3JpZ19idWZmZXIsIG9yaWdfc2l6ZSwgcmVzdWx0X3NoYTEpOworfQorCitzdGF0aWMgc3RydWN0IGVudHJ5ICogY29udmVydF9lbnRyeSh1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBlbnRyeSAqZW50cnkgPSBsb29rdXBfZW50cnkoc2hhMSk7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCXZvaWQgKmJ1ZmZlciwgKmRhdGE7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJaWYgKGVudHJ5LT5jb252ZXJ0ZWQpCisJCXJldHVybiBlbnRyeTsKKwlkYXRhID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgJnR5cGUsICZzaXplKTsKKwlpZiAoIWRhdGEpCisJCWRpZSgidW5hYmxlIHRvIHJlYWQgb2JqZWN0ICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworCisJYnVmZmVyID0geG1hbGxvYyhzaXplKTsKKwltZW1jcHkoYnVmZmVyLCBkYXRhLCBzaXplKTsKKworCWlmICh0eXBlID09IE9CSl9CTE9CKSB7CisJCXdyaXRlX3NoYTFfZmlsZShidWZmZXIsIHNpemUsIGJsb2JfdHlwZSwgZW50cnktPm5ld19zaGExKTsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gT0JKX1RSRUUpCisJCWNvbnZlcnRfdHJlZShidWZmZXIsIHNpemUsIGVudHJ5LT5uZXdfc2hhMSk7CisJZWxzZSBpZiAodHlwZSA9PSBPQkpfQ09NTUlUKQorCQljb252ZXJ0X2NvbW1pdChidWZmZXIsIHNpemUsIGVudHJ5LT5uZXdfc2hhMSk7CisJZWxzZQorCQlkaWUoInVua25vd24gb2JqZWN0IHR5cGUgJWQgaW4gJXMiLCB0eXBlLCBzaGExX3RvX2hleChzaGExKSk7CisJZW50cnktPmNvbnZlcnRlZCA9IDE7CisJZnJlZShidWZmZXIpOworCWZyZWUoZGF0YSk7CisJcmV0dXJuIGVudHJ5OworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3QgZW50cnkgKmVudHJ5OworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCisJaWYgKGFyZ2MgIT0gMikKKwkJdXNhZ2UoImdpdC1jb252ZXJ0LW9iamVjdHMgPHNoYTE+Iik7CisJaWYgKGdldF9zaGExKGFyZ3ZbMV0sIHNoYTEpKQorCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lICVzIiwgYXJndlsxXSk7CisKKwllbnRyeSA9IGNvbnZlcnRfZW50cnkoc2hhMSk7CisJcHJpbnRmKCJuZXcgc2hhMTogJXNcbiIsIHNoYTFfdG9faGV4KGVudHJ5LT5uZXdfc2hhMSkpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9jb252ZXJ0LW9iamVjdHMvZ2l0LWNvbnZlcnQtb2JqZWN0cy50eHQgYi9jb250cmliL2NvbnZlcnQtb2JqZWN0cy9naXQtY29udmVydC1vYmplY3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzE4YWJmCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9jb252ZXJ0LW9iamVjdHMvZ2l0LWNvbnZlcnQtb2JqZWN0cy50eHQKQEAgLTAsMCArMSwyOCBAQAorZ2l0LWNvbnZlcnQtb2JqZWN0cygxKQorPT09PT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtY29udmVydC1vYmplY3RzIC0gQ29udmVydHMgb2xkLXN0eWxlIGdpdCByZXBvc2l0b3J5CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWNvbnZlcnQtb2JqZWN0cycKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitDb252ZXJ0cyBvbGQtc3R5bGUgZ2l0IHJlcG9zaXRvcnkgdG8gdGhlIGxhdGVzdCBmb3JtYXQKKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZW1hY3MvLmdpdGlnbm9yZSBiL2NvbnRyaWIvZW1hY3MvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTMxZDk4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9lbWFjcy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKKyouZWxjCmRpZmYgLS1naXQgYS9jb250cmliL2VtYWNzL01ha2VmaWxlIGIvY29udHJpYi9lbWFjcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDg1NDBhCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9lbWFjcy9NYWtlZmlsZQpAQCAtMCwwICsxLDIxIEBACisjIyBCdWlsZCBhbmQgaW5zdGFsbCBzdHVmZgorCitFTUFDUyA9IGVtYWNzCisKK0VMQyA9IGdpdC5lbGMgdmMtZ2l0LmVsYyBnaXQtYmxhbWUuZWxjCitJTlNUQUxMID89IGluc3RhbGwKK0lOU1RBTExfRUxDID0gJChJTlNUQUxMKSAtbSA2NDQKK3ByZWZpeCA/PSAkKEhPTUUpCitlbWFjc2RpciA9ICQocHJlZml4KS9zaGFyZS9lbWFjcy9zaXRlLWxpc3AKK1JNID89IHJtIC1mCisKK2FsbDogJChFTEMpCisKK2luc3RhbGw6IGFsbAorCSQoSU5TVEFMTCkgLWQgJChERVNURElSKSQoZW1hY3NkaXIpCisJJChJTlNUQUxMX0VMQykgJChFTEM6LmVsYz0uZWwpICQoRUxDKSAkKERFU1RESVIpJChlbWFjc2RpcikKKworJS5lbGM6ICUuZWwKKwkkKEVNQUNTKSAtYmF0Y2ggLWYgYmF0Y2gtYnl0ZS1jb21waWxlICQ8CisKK2NsZWFuOjsgJChSTSkgJChFTEMpCmRpZmYgLS1naXQgYS9jb250cmliL2VtYWNzL2dpdC1ibGFtZS5lbCBiL2NvbnRyaWIvZW1hY3MvZ2l0LWJsYW1lLmVsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOTJjZDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2VtYWNzL2dpdC1ibGFtZS5lbApAQCAtMCwwICsxLDQzNCBAQAorOzs7IGdpdC1ibGFtZS5lbCAtLS0gTWlub3IgbW9kZSBmb3IgaW5jcmVtZW50YWwgYmxhbWUgZm9yIEdpdCAgLSotIGNvZGluZzogdXRmLTggLSotCis7OworOzsgQ29weXJpZ2h0IChDKSAyMDA3ICBEYXZpZCBLw6VnZWRhbAorOzsKKzs7IEF1dGhvcnM6ICAgIERhdmlkIEvDpWdlZGFsIDxkYXZpZGtAbHlzYXRvci5saXUuc2U+Cis7OyBDcmVhdGVkOiAgICAzMSBKYW4gMjAwNworOzsgTWVzc2FnZS1JRDogPDg3aXJlbjJ2cXguZnNmQG1vcnBoZXVzLmxvY2FsPgorOzsgTGljZW5zZTogICAgR1BMCis7OyBLZXl3b3JkczogICBnaXQsIHZlcnNpb24gY29udHJvbCwgcmVsZWFzZSBtYW5hZ2VtZW50Cis7OworOzsgQ29tcGF0aWJpbGl0eTogRW1hY3MyMSwgRW1hY3MyMiBhbmQgRW1hY3NDVlMKKzs7ICAgICAgICAgICAgICAgIEdpdCAxLjUgYW5kIHVwCisKKzs7IFRoaXMgZmlsZSBpcyAqTk9UKiBwYXJ0IG9mIEdOVSBFbWFjcy4KKzs7IFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBHTlUgRW1hY3MuCisKKzs7IFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzs7IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCis7OyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorOzsgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKzs7IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKzs7IHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKzs7IHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKzs7IFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKzs7IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworOzsgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorOzsgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKzs7IE1BIDAyMTExLTEzMDcgVVNBCisKKzs7IGh0dHA6Ly93d3cuZnNmLm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorCisKKzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKKzs7Cis7OzsgQ29tbWVudGFyeToKKzs7Cis7OyBIZXJlIGlzIGFuIEVtYWNzIGltcGxlbWVudGF0aW9uIG9mIGluY3JlbWVudGFsIGdpdC1ibGFtZS4gIFdoZW4geW91Cis7OyB0dXJuIGl0IG9uIHdoaWxlIHZpZXdpbmcgYSBmaWxlLCB0aGUgZWRpdG9yIGJ1ZmZlciB3aWxsIGJlIHVwZGF0ZWQgYnkKKzs7IHNldHRpbmcgdGhlIGJhY2tncm91bmQgb2YgaW5kaXZpZHVhbCBsaW5lcyB0byBhIGNvbG9yIHRoYXQgcmVmbGVjdHMKKzs7IHdoaWNoIGNvbW1pdCBpdCBjb21lcyBmcm9tLiAgQW5kIHdoZW4geW91IG1vdmUgYXJvdW5kIHRoZSBidWZmZXIsIGEKKzs7IG9uZS1saW5lIHN1bW1hcnkgd2lsbCBiZSBzaG93biBpbiB0aGUgZWNobyBhcmVhLgorCis7OzsgSW5zdGFsbGF0aW9uOgorOzsKKzs7IFRvIHVzZSB0aGlzIHBhY2thZ2UsIHB1dCBpdCBzb21ld2hlcmUgaW4gYGxvYWQtcGF0aCcgKG9yIGFkZAorOzsgZGlyZWN0b3J5IHdpdGggZ2l0LWJsYW1lLmVsIHRvIGBsb2FkLXBhdGgnKSwgYW5kIGFkZCB0aGUgZm9sbG93aW5nCis7OyBsaW5lIHRvIHlvdXIgLmVtYWNzOgorOzsKKzs7ICAgIChyZXF1aXJlICdnaXQtYmxhbWUpCis7OworOzsgSWYgeW91IGRvIG5vdCB3YW50IHRvIGxvYWQgdGhpcyBwYWNrYWdlIGJlZm9yZSBpdCBpcyBuZWNlc3NhcnksIHlvdQorOzsgY2FuIG1ha2UgdXNlIG9mIHRoZSBgYXV0b2xvYWQnIGZlYXR1cmUsIGUuZy4gYnkgYWRkaW5nIHRvIHlvdXIgLmVtYWNzCis7OyB0aGUgZm9sbG93aW5nIGxpbmVzCis7OworOzsgICAgKGF1dG9sb2FkICdnaXQtYmxhbWUtbW9kZSAiZ2l0LWJsYW1lIgorOzsgICAgICAgICAgICAgICJNaW5vciBtb2RlIGZvciBpbmNyZW1lbnRhbCBibGFtZSBmb3IgR2l0LiIgdCkKKzs7Cis7OyBUaGVuIGZpcnN0IHVzZSBvZiBgTS14IGdpdC1ibGFtZS1tb2RlJyB3b3VsZCBsb2FkIHRoZSBwYWNrYWdlLgorCis7OzsgQ29tcGF0aWJpbGl0eToKKzs7Cis7OyBJdCByZXF1aXJlcyBHTlUgRW1hY3MgMjEgb3IgbGF0ZXIgYW5kIEdpdCAxLjUuMCBhbmQgdXAKKzs7Cis7OyBJZiB5b3UnYXJlIHVzaW5nIEVtYWNzIDIwLCB0cnkgY2hhbmdpbmcgdGhpczoKKzs7Cis7OyAgICAgICAgICAgIChvdmVybGF5LXB1dCBvdmwgJ2ZhY2UgKGxpc3QgOmJhY2tncm91bmQKKzs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2RyIChhc3NxICdjb2xvciAoY2RkZGRyIGluZm8pKSkpKQorOzsKKzs7IHRvCis7OworOzsgICAgICAgICAgICAob3ZlcmxheS1wdXQgb3ZsICdmYWNlIChjb25zICdiYWNrZ3JvdW5kLWNvbG9yCis7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNkciAoYXNzcSAnY29sb3IgKGNkZGRkciBpbmZvKSkpKSkKKworCis7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Cis7OworOzs7IENvZGU6CisKKyhldmFsLXdoZW4tY29tcGlsZSAocmVxdWlyZSAnY2wpKQkJCSAgICAgIDsgdG8gdXNlIGBwdXNoJywgYHBvcCcKKworCisoZGVmdW4gZ2l0LWJsYW1lLWNvbG9yLXNjYWxlICgmcmVzdCBlbGVtZW50cykKKyAgIkdpdmVuIGEgbGlzdCwgcmV0dXJucyBhIGxpc3Qgb2YgdHJpcGxlcyBmb3JtZWQgd2l0aCBlYWNoCitlbGVtZW50cyBvZiB0aGUgbGlzdC4KKworYSBiID0+IGJiYiBiYmEgYmFiIGJhYSBhYmIgYWJhIGFhYSBhYWIiCisgIChsZXQgKHJlc3VsdCkKKyAgICAoZG9saXN0IChhIGVsZW1lbnRzKQorICAgICAgKGRvbGlzdCAoYiBlbGVtZW50cykKKyAgICAgICAgKGRvbGlzdCAoYyBlbGVtZW50cykKKyAgICAgICAgICAoc2V0cSByZXN1bHQgKGNvbnMgKGZvcm1hdCAiIyVzJXMlcyIgYSBiIGMpIHJlc3VsdCkpKSkpCisgICAgcmVzdWx0KSkKKworOzsgKGdpdC1ibGFtZS1jb2xvci1zY2FsZSAiMGMiICIwNCIgIjI0IiAiMWMiICIyYyIgIjM0IiAiMTQiICIzYyIpID0+Cis7OyAoIiMzYzNjM2MiICIjM2MzYzE0IiAiIzNjM2MzNCIgIiMzYzNjMmMiICIjM2MzYzFjIiAiIzNjM2MyNCIKKzs7ICIjM2MzYzA0IiAiIzNjM2MwYyIgIiMzYzE0M2MiICIjM2MxNDE0IiAiIzNjMTQzNCIgIiMzYzE0MmMiIC4uLikKKworKGRlZm1hY3JvIGdpdC1ibGFtZS1yYW5kb20tcG9wIChsKQorICAiU2VsZWN0IGEgcmFuZG9tIGVsZW1lbnQgZnJvbSBMIGFuZCByZXR1cm5zIGl0LiBBbHNvIHJlbW92ZQorc2VsZWN0ZWQgZWxlbWVudCBmcm9tIGwuIgorICA7OyBvbmx5IHdvcmtzIG9uIGxpc3RzIHdpdGggdW5pcXVlIGVsZW1lbnRzCisgIGAobGV0ICgoZSAoZWx0ICxsIChyYW5kb20gKGxlbmd0aCAsbCkpKSkpCisgICAgIChzZXRxICxsIChyZW1vdmUgZSAsbCkpCisgICAgIGUpKQorCisoZGVmdmFyIGdpdC1ibGFtZS1sb2ctb25lbGluZS1mb3JtYXQKKyAgImZvcm1hdDpbJWNyXSAlY246ICVzIgorICAiKkZvcm1hdHRpbmcgb3B0aW9uIHVzZWQgZm9yIGRlc2NyaWJpbmcgY3VycmVudCBsaW5lIGluIHRoZSBtaW5pYnVmZmVyLgorCitUaGlzIG9wdGlvbiBpcyB1c2VkIHRvIHBhc3MgdG8gZ2l0IGxvZyAtLXByZXR0eT0gY29tbWFuZC1saW5lIG9wdGlvbiwKK2FuZCBkZXNjcmliZSB3aGljaCBjb21taXQgdGhlIGN1cnJlbnQgbGluZSB3YXMgbWFkZS4iKQorCisoZGVmdmFyIGdpdC1ibGFtZS1kYXJrLWNvbG9ycworICAoZ2l0LWJsYW1lLWNvbG9yLXNjYWxlICIwYyIgIjA0IiAiMjQiICIxYyIgIjJjIiAiMzQiICIxNCIgIjNjIikKKyAgIipMaXN0IG9mIGNvbG9ycyAoZm9ybWF0ICNSR0IpIHRvIHVzZSBpbiBhIGRhcmsgZW52aXJvbm1lbnQuCisKK1RvIGNoZWNrIG91dCB0aGUgbGlzdCwgZXZhbHVhdGUgKGxpc3QtY29sb3JzLWRpc3BsYXkgZ2l0LWJsYW1lLWRhcmstY29sb3JzKS4iKQorCisoZGVmdmFyIGdpdC1ibGFtZS1saWdodC1jb2xvcnMKKyAgKGdpdC1ibGFtZS1jb2xvci1zY2FsZSAiYzQiICJkNCIgImNjIiAiZGMiICJmNCIgImU0IiAiZmMiICJlYyIpCisgICIqTGlzdCBvZiBjb2xvcnMgKGZvcm1hdCAjUkdCKSB0byB1c2UgaW4gYSBsaWdodCBlbnZpcm9ubWVudC4KKworVG8gY2hlY2sgb3V0IHRoZSBsaXN0LCBldmFsdWF0ZSAobGlzdC1jb2xvcnMtZGlzcGxheSBnaXQtYmxhbWUtbGlnaHQtY29sb3JzKS4iKQorCisoZGVmdmFyIGdpdC1ibGFtZS1jb2xvcnMgJygpCisgICJDb2xvcnMgdXNlZCBieSBnaXQtYmxhbWUuIFRoZSBsaXN0IGlzIGJ1aWx0IG9uY2Ugd2hlbiBhY3RpdmF0aW5nIGdpdC1ibGFtZQorbWlub3IgbW9kZS4iKQorCisoZGVmdmFyIGdpdC1ibGFtZS1hbmNpZW50LWNvbG9yICJkYXJrIGdyZWVuIgorICAiKkNvbG9yIHRvIGJlIHVzZWQgZm9yIGFuY2llbnQgY29tbWl0LiIpCisKKyhkZWZ2YXIgZ2l0LWJsYW1lLWF1dG91cGRhdGUgdAorICAiKkF1dG9tYXRpY2FsbHkgdXBkYXRlIHRoZSBibGFtZSBkaXNwbGF5IHdoaWxlIGVkaXRpbmciKQorCisoZGVmdmFyIGdpdC1ibGFtZS1wcm9jIG5pbAorICAiVGhlIHJ1bm5pbmcgZ2l0LWJsYW1lIHByb2Nlc3MiKQorKG1ha2UtdmFyaWFibGUtYnVmZmVyLWxvY2FsICdnaXQtYmxhbWUtcHJvYykKKworKGRlZnZhciBnaXQtYmxhbWUtb3ZlcmxheXMgbmlsCisgICJUaGUgZ2l0LWJsYW1lIG92ZXJsYXlzIHVzZWQgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLiIpCisobWFrZS12YXJpYWJsZS1idWZmZXItbG9jYWwgJ2dpdC1ibGFtZS1vdmVybGF5cykKKworKGRlZnZhciBnaXQtYmxhbWUtY2FjaGUgbmlsCisgICJBIGNhY2hlIG9mIGdpdC1ibGFtZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyIikKKyhtYWtlLXZhcmlhYmxlLWJ1ZmZlci1sb2NhbCAnZ2l0LWJsYW1lLWNhY2hlKQorCisoZGVmdmFyIGdpdC1ibGFtZS1pZGxlLXRpbWVyIG5pbAorICAiQW4gaWRsZSB0aW1lciB0aGF0IHVwZGF0ZXMgdGhlIGJsYW1lIikKKyhtYWtlLXZhcmlhYmxlLWJ1ZmZlci1sb2NhbCAnZ2l0LWJsYW1lLWNhY2hlKQorCisoZGVmdmFyIGdpdC1ibGFtZS11cGRhdGUtcXVldWUgbmlsCisgICJBIHF1ZXVlIG9mIHVwZGF0ZSByZXF1ZXN0cyIpCisobWFrZS12YXJpYWJsZS1idWZmZXItbG9jYWwgJ2dpdC1ibGFtZS11cGRhdGUtcXVldWUpCisKKzs7IEZJWE1FOiBkb2NzdHJpbmdzCisoZGVmdmFyIGdpdC1ibGFtZS1maWxlIG5pbCkKKyhkZWZ2YXIgZ2l0LWJsYW1lLWN1cnJlbnQgbmlsKQorCisoZGVmdmFyIGdpdC1ibGFtZS1tb2RlIG5pbCkKKyhtYWtlLXZhcmlhYmxlLWJ1ZmZlci1sb2NhbCAnZ2l0LWJsYW1lLW1vZGUpCisKKyhkZWZ2YXIgZ2l0LWJsYW1lLW1vZGUtbGluZS1zdHJpbmcgIiBibGFtZSIKKyAgIlN0cmluZyB0byBkaXNwbGF5IG9uIHRoZSBtb2RlIGxpbmUgd2hlbiBnaXQtYmxhbWUgaXMgYWN0aXZlLiIpCisKKyhvciAoYXNzcSAnZ2l0LWJsYW1lLW1vZGUgbWlub3ItbW9kZS1hbGlzdCkKKyAgICAoc2V0cSBtaW5vci1tb2RlLWFsaXN0CisJICAoY29ucyAnKGdpdC1ibGFtZS1tb2RlIGdpdC1ibGFtZS1tb2RlLWxpbmUtc3RyaW5nKSBtaW5vci1tb2RlLWFsaXN0KSkpCisKKzs7OyMjI2F1dG9sb2FkCisoZGVmdW4gZ2l0LWJsYW1lLW1vZGUgKCZvcHRpb25hbCBhcmcpCisgICJUb2dnbGUgbWlub3IgbW9kZSBmb3IgZGlzcGxheWluZyBHaXQgYmxhbWUKKworV2l0aCBwcmVmaXggQVJHLCB0dXJuIHRoZSBtb2RlIG9uIGlmIEFSRyBpcyBwb3NpdGl2ZS4iCisgIChpbnRlcmFjdGl2ZSAiUCIpCisgIChjb25kCisgICAoKG51bGwgYXJnKQorICAgIChpZiBnaXQtYmxhbWUtbW9kZSAoZ2l0LWJsYW1lLW1vZGUtb2ZmKSAoZ2l0LWJsYW1lLW1vZGUtb24pKSkKKyAgICgoPiAocHJlZml4LW51bWVyaWMtdmFsdWUgYXJnKSAwKSAoZ2l0LWJsYW1lLW1vZGUtb24pKQorICAgKHQgKGdpdC1ibGFtZS1tb2RlLW9mZikpKSkKKworKGRlZnVuIGdpdC1ibGFtZS1tb2RlLW9uICgpCisgICJUdXJuIG9uIGdpdC1ibGFtZSBtb2RlLgorCitTZWUgYWxzbyBmdW5jdGlvbiBgZ2l0LWJsYW1lLW1vZGUnLiIKKyAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2dpdC1ibGFtZS1jb2xvcnMpCisgIChpZiBnaXQtYmxhbWUtYXV0b3VwZGF0ZQorICAgICAgKGFkZC1ob29rICdhZnRlci1jaGFuZ2UtZnVuY3Rpb25zICdnaXQtYmxhbWUtYWZ0ZXItY2hhbmdlIG5pbCB0KQorICAgIChyZW1vdmUtaG9vayAnYWZ0ZXItY2hhbmdlLWZ1bmN0aW9ucyAnZ2l0LWJsYW1lLWFmdGVyLWNoYW5nZSB0KSkKKyAgKGdpdC1ibGFtZS1jbGVhbnVwKQorICAobGV0ICgoYmdtb2RlIChjZHIgKGFzc29jICdiYWNrZ3JvdW5kLW1vZGUgKGZyYW1lLXBhcmFtZXRlcnMpKSkpKQorICAgIChpZiAoZXEgYmdtb2RlICdkYXJrKQorCShzZXRxIGdpdC1ibGFtZS1jb2xvcnMgZ2l0LWJsYW1lLWRhcmstY29sb3JzKQorICAgICAgKHNldHEgZ2l0LWJsYW1lLWNvbG9ycyBnaXQtYmxhbWUtbGlnaHQtY29sb3JzKSkpCisgIChzZXRxIGdpdC1ibGFtZS1jYWNoZSAobWFrZS1oYXNoLXRhYmxlIDp0ZXN0ICdlcXVhbCkpCisgIChzZXRxIGdpdC1ibGFtZS1tb2RlIHQpCisgIChnaXQtYmxhbWUtcnVuKSkKKworKGRlZnVuIGdpdC1ibGFtZS1tb2RlLW9mZiAoKQorICAiVHVybiBvZmYgZ2l0LWJsYW1lIG1vZGUuCisKK1NlZSBhbHNvIGZ1bmN0aW9uIGBnaXQtYmxhbWUtbW9kZScuIgorICAoZ2l0LWJsYW1lLWNsZWFudXApCisgIChpZiBnaXQtYmxhbWUtaWRsZS10aW1lciAoY2FuY2VsLXRpbWVyIGdpdC1ibGFtZS1pZGxlLXRpbWVyKSkKKyAgKHNldHEgZ2l0LWJsYW1lLW1vZGUgbmlsKSkKKworOzs7IyMjYXV0b2xvYWQKKyhkZWZ1biBnaXQtcmVibGFtZSAoKQorICAiUmVjYWxjdWxhdGUgYWxsIGJsYW1lIGluZm9ybWF0aW9uIGluIHRoZSBjdXJyZW50IGJ1ZmZlciIKKyAgKGludGVyYWN0aXZlKQorICAodW5sZXNzIGdpdC1ibGFtZS1tb2RlCisgICAgKGVycm9yICJHaXQtYmxhbWUgaXMgbm90IGFjdGl2ZSIpKQorCisgIChnaXQtYmxhbWUtY2xlYW51cCkKKyAgKGdpdC1ibGFtZS1ydW4pKQorCisoZGVmdW4gZ2l0LWJsYW1lLXJ1biAoJm9wdGlvbmFsIHN0YXJ0bGluZSBlbmRsaW5lKQorICAoaWYgZ2l0LWJsYW1lLXByb2MKKyAgICAgIDs7IFNob3VsZCBtYXliZSBxdWV1ZSB1cCBhIG5ldyBydW4gaGVyZQorICAgICAgKG1lc3NhZ2UgIkFscmVhZHkgcnVubmluZyBnaXQgYmxhbWUiKQorICAgIChsZXQgKChkaXNwbGF5LWJ1ZiAoY3VycmVudC1idWZmZXIpKQorICAgICAgICAgIChibGFtZS1idWYgKGdldC1idWZmZXItY3JlYXRlCisgICAgICAgICAgICAgICAgICAgICAgKGNvbmNhdCAiIGdpdCBibGFtZSBmb3IgIiAoYnVmZmVyLW5hbWUpKSkpCisgICAgICAgICAgKGFyZ3MgJygiLS1pbmNyZW1lbnRhbCIgIi0tY29udGVudHMiICItIikpKQorICAgICAgKGlmIHN0YXJ0bGluZQorICAgICAgICAgIChzZXRxIGFyZ3MgKGFwcGVuZCBhcmdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaXN0ICItTCIgKGZvcm1hdCAiJWQsJWQiIHN0YXJ0bGluZSBlbmRsaW5lKSkpKSkKKyAgICAgIChzZXRxIGFyZ3MgKGFwcGVuZCBhcmdzCisgICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3QgKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgYnVmZmVyLWZpbGUtbmFtZSkpKSkKKyAgICAgIChzZXRxIGdpdC1ibGFtZS1wcm9jCisgICAgICAgICAgICAoYXBwbHkgJ3N0YXJ0LXByb2Nlc3MKKyAgICAgICAgICAgICAgICAgICAiZ2l0LWJsYW1lIiBibGFtZS1idWYKKyAgICAgICAgICAgICAgICAgICAiZ2l0IiAiYmxhbWUiCisgICAgICAgICAgICAgICAgICAgYXJncykpCisgICAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciBibGFtZS1idWYKKyAgICAgICAgKGVyYXNlLWJ1ZmZlcikKKyAgICAgICAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2dpdC1ibGFtZS1maWxlKQorICAgICAgICAobWFrZS1sb2NhbC12YXJpYWJsZSAnZ2l0LWJsYW1lLWN1cnJlbnQpCisgICAgICAgIChzZXRxIGdpdC1ibGFtZS1maWxlIGRpc3BsYXktYnVmKQorICAgICAgICAoc2V0cSBnaXQtYmxhbWUtY3VycmVudCBuaWwpKQorICAgICAgKHNldC1wcm9jZXNzLWZpbHRlciBnaXQtYmxhbWUtcHJvYyAnZ2l0LWJsYW1lLWZpbHRlcikKKyAgICAgIChzZXQtcHJvY2Vzcy1zZW50aW5lbCBnaXQtYmxhbWUtcHJvYyAnZ2l0LWJsYW1lLXNlbnRpbmVsKQorICAgICAgKHByb2Nlc3Mtc2VuZC1yZWdpb24gZ2l0LWJsYW1lLXByb2MgKHBvaW50LW1pbikgKHBvaW50LW1heCkpCisgICAgICAocHJvY2Vzcy1zZW5kLWVvZiBnaXQtYmxhbWUtcHJvYykpKSkKKworKGRlZnVuIHJlbW92ZS1naXQtYmxhbWUtdGV4dC1wcm9wZXJ0aWVzIChzdGFydCBlbmQpCisgIChsZXQgKChtb2RpZmllZCAoYnVmZmVyLW1vZGlmaWVkLXApKQorICAgICAgICAoaW5oaWJpdC1yZWFkLW9ubHkgdCkpCisgICAgKHJlbW92ZS10ZXh0LXByb3BlcnRpZXMgc3RhcnQgZW5kICcocG9pbnQtZW50ZXJlZCBuaWwpKQorICAgIChzZXQtYnVmZmVyLW1vZGlmaWVkLXAgbW9kaWZpZWQpKSkKKworKGRlZnVuIGdpdC1ibGFtZS1jbGVhbnVwICgpCisgICJSZW1vdmUgYWxsIGJsYW1lIHByb3BlcnRpZXMiCisgICAgKG1hcGNhciAnZGVsZXRlLW92ZXJsYXkgZ2l0LWJsYW1lLW92ZXJsYXlzKQorICAgIChzZXRxIGdpdC1ibGFtZS1vdmVybGF5cyBuaWwpCisgICAgKHJlbW92ZS1naXQtYmxhbWUtdGV4dC1wcm9wZXJ0aWVzIChwb2ludC1taW4pIChwb2ludC1tYXgpKSkKKworKGRlZnVuIGdpdC1ibGFtZS11cGRhdGUtcmVnaW9uIChzdGFydCBlbmQpCisgICJSZXJ1biBibGFtZSB0byBnZXQgdXBkYXRlcyBiZXR3ZWVuIFNUQVJUIGFuZCBFTkQiCisgIChsZXQgKChvdmVybGF5cyAob3ZlcmxheXMtaW4gc3RhcnQgZW5kKSkpCisgICAgKHdoaWxlIG92ZXJsYXlzCisgICAgICAobGV0ICgob3ZlcmxheSAocG9wIG92ZXJsYXlzKSkpCisgICAgICAgIChpZiAoPCAob3ZlcmxheS1zdGFydCBvdmVybGF5KSBzdGFydCkKKyAgICAgICAgICAgIChzZXRxIHN0YXJ0IChvdmVybGF5LXN0YXJ0IG92ZXJsYXkpKSkKKyAgICAgICAgKGlmICg+IChvdmVybGF5LWVuZCBvdmVybGF5KSBlbmQpCisgICAgICAgICAgICAoc2V0cSBlbmQgKG92ZXJsYXktZW5kIG92ZXJsYXkpKSkKKyAgICAgICAgKHNldHEgZ2l0LWJsYW1lLW92ZXJsYXlzIChkZWxldGUgb3ZlcmxheSBnaXQtYmxhbWUtb3ZlcmxheXMpKQorICAgICAgICAoZGVsZXRlLW92ZXJsYXkgb3ZlcmxheSkpKSkKKyAgKHJlbW92ZS1naXQtYmxhbWUtdGV4dC1wcm9wZXJ0aWVzIHN0YXJ0IGVuZCkKKyAgOzsgV2UgY2FuIGJlIHN1cmUgdGhhdCBzdGFydCBhbmQgZW5kIGFyZSBhdCBsaW5lIGJyZWFrcworICAoZ2l0LWJsYW1lLXJ1biAoMSsgKGNvdW50LWxpbmVzIChwb2ludC1taW4pIHN0YXJ0KSkKKyAgICAgICAgICAgICAgICAgKGNvdW50LWxpbmVzIChwb2ludC1taW4pIGVuZCkpKQorCisoZGVmdW4gZ2l0LWJsYW1lLXNlbnRpbmVsIChwcm9jIHN0YXR1cykKKyAgKHdpdGgtY3VycmVudC1idWZmZXIgKHByb2Nlc3MtYnVmZmVyIHByb2MpCisgICAgKHdpdGgtY3VycmVudC1idWZmZXIgZ2l0LWJsYW1lLWZpbGUKKyAgICAgIChzZXRxIGdpdC1ibGFtZS1wcm9jIG5pbCkKKyAgICAgIChpZiBnaXQtYmxhbWUtdXBkYXRlLXF1ZXVlCisgICAgICAgICAgKGdpdC1ibGFtZS1kZWxheWVkLXVwZGF0ZSkpKSkKKyAgOzsoa2lsbC1idWZmZXIgKHByb2Nlc3MtYnVmZmVyIHByb2MpKQorICA7OyhtZXNzYWdlICJnaXQgYmxhbWUgZmluaXNoZWQiKQorICApCisKKyhkZWZ2YXIgaW4tYmxhbWUtZmlsdGVyIG5pbCkKKworKGRlZnVuIGdpdC1ibGFtZS1maWx0ZXIgKHByb2Mgc3RyKQorICAoc2F2ZS1leGN1cnNpb24KKyAgICAoc2V0LWJ1ZmZlciAocHJvY2Vzcy1idWZmZXIgcHJvYykpCisgICAgKGdvdG8tY2hhciAocHJvY2Vzcy1tYXJrIHByb2MpKQorICAgIChpbnNlcnQtYmVmb3JlLW1hcmtlcnMgc3RyKQorICAgIChnb3RvLWNoYXIgMCkKKyAgICAodW5sZXNzIGluLWJsYW1lLWZpbHRlcgorICAgICAgKGxldCAoKG1vcmUgdCkKKyAgICAgICAgICAgIChpbi1ibGFtZS1maWx0ZXIgdCkpCisgICAgICAgICh3aGlsZSBtb3JlCisgICAgICAgICAgKHNldHEgbW9yZSAoZ2l0LWJsYW1lLXBhcnNlKSkpKSkpKQorCisoZGVmdW4gZ2l0LWJsYW1lLXBhcnNlICgpCisgIChjb25kICgobG9va2luZy1hdCAiXFwoWzAtOWEtZl1cXHs0MFxcfVxcKSBcXChbMC05XStcXCkgXFwoWzAtOV0rXFwpIFxcKFswLTldK1xcKVxuIikKKyAgICAgICAgIChsZXQgKChoYXNoIChtYXRjaC1zdHJpbmcgMSkpCisgICAgICAgICAgICAgICAoc3JjLWxpbmUgKHN0cmluZy10by1udW1iZXIgKG1hdGNoLXN0cmluZyAyKSkpCisgICAgICAgICAgICAgICAocmVzLWxpbmUgKHN0cmluZy10by1udW1iZXIgKG1hdGNoLXN0cmluZyAzKSkpCisgICAgICAgICAgICAgICAobnVtLWxpbmVzIChzdHJpbmctdG8tbnVtYmVyIChtYXRjaC1zdHJpbmcgNCkpKSkKKyAgICAgICAgICAgKHNldHEgZ2l0LWJsYW1lLWN1cnJlbnQKKyAgICAgICAgICAgICAgICAgKGlmIChzdHJpbmc9IGhhc2ggIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiKQorICAgICAgICAgICAgICAgICAgICAgbmlsCisgICAgICAgICAgICAgICAgICAgKGdpdC1ibGFtZS1uZXctY29tbWl0CisgICAgICAgICAgICAgICAgICAgIGhhc2ggc3JjLWxpbmUgcmVzLWxpbmUgbnVtLWxpbmVzKSkpKQorICAgICAgICAgKGRlbGV0ZS1yZWdpb24gKHBvaW50KSAobWF0Y2gtZW5kIDApKQorICAgICAgICAgdCkKKyAgICAgICAgKChsb29raW5nLWF0ICJmaWxlbmFtZSBcXCguK1xcKVxuIikKKyAgICAgICAgIChsZXQgKChmaWxlbmFtZSAobWF0Y2gtc3RyaW5nIDEpKSkKKyAgICAgICAgICAgKGdpdC1ibGFtZS1hZGQtaW5mbyAiZmlsZW5hbWUiIGZpbGVuYW1lKSkKKyAgICAgICAgIChkZWxldGUtcmVnaW9uIChwb2ludCkgKG1hdGNoLWVuZCAwKSkKKyAgICAgICAgIHQpCisgICAgICAgICgobG9va2luZy1hdCAiXFwoW2Etei1dK1xcKSBcXCguK1xcKVxuIikKKyAgICAgICAgIChsZXQgKChrZXkgKG1hdGNoLXN0cmluZyAxKSkKKyAgICAgICAgICAgICAgICh2YWx1ZSAobWF0Y2gtc3RyaW5nIDIpKSkKKyAgICAgICAgICAgKGdpdC1ibGFtZS1hZGQtaW5mbyBrZXkgdmFsdWUpKQorICAgICAgICAgKGRlbGV0ZS1yZWdpb24gKHBvaW50KSAobWF0Y2gtZW5kIDApKQorICAgICAgICAgdCkKKyAgICAgICAgKChsb29raW5nLWF0ICJib3VuZGFyeVxuIikKKyAgICAgICAgIChzZXRxIGdpdC1ibGFtZS1jdXJyZW50IG5pbCkKKyAgICAgICAgIChkZWxldGUtcmVnaW9uIChwb2ludCkgKG1hdGNoLWVuZCAwKSkKKyAgICAgICAgIHQpCisgICAgICAgICh0CisgICAgICAgICBuaWwpKSkKKworKGRlZnVuIGdpdC1ibGFtZS1uZXctY29tbWl0IChoYXNoIHNyYy1saW5lIHJlcy1saW5lIG51bS1saW5lcykKKyAgKHNhdmUtZXhjdXJzaW9uCisgICAgKHNldC1idWZmZXIgZ2l0LWJsYW1lLWZpbGUpCisgICAgKGxldCAoKGluZm8gKGdldGhhc2ggaGFzaCBnaXQtYmxhbWUtY2FjaGUpKQorICAgICAgICAgIChpbmhpYml0LXBvaW50LW1vdGlvbi1ob29rcyB0KQorICAgICAgICAgIChpbmhpYml0LW1vZGlmaWNhdGlvbi1ob29rcyB0KSkKKyAgICAgICh3aGVuIChub3QgaW5mbykKKwk7OyBBc3NpZ24gYSByYW5kb20gY29sb3IgdG8gZWFjaCBuZXcgY29tbWl0IGluZm8KKwk7OyBUYWtlIGNhcmUgbm90IHRvIHNlbGVjdCB0aGUgc2FtZSBjb2xvciBtdWx0aXBsZSB0aW1lcworCShsZXQgKChjb2xvciAoaWYgZ2l0LWJsYW1lLWNvbG9ycworCQkJIChnaXQtYmxhbWUtcmFuZG9tLXBvcCBnaXQtYmxhbWUtY29sb3JzKQorCQkgICAgICAgZ2l0LWJsYW1lLWFuY2llbnQtY29sb3IpKSkKKyAgICAgICAgICAoc2V0cSBpbmZvIChsaXN0IGhhc2ggc3JjLWxpbmUgcmVzLWxpbmUgbnVtLWxpbmVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2l0LWRlc2NyaWJlLWNvbW1pdCBoYXNoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnMgJ2NvbG9yIGNvbG9yKSkpKQorICAgICAgICAocHV0aGFzaCBoYXNoIGluZm8gZ2l0LWJsYW1lLWNhY2hlKSkKKyAgICAgIChnb3RvLWxpbmUgcmVzLWxpbmUpCisgICAgICAod2hpbGUgKD4gbnVtLWxpbmVzIDApCisgICAgICAgIChpZiAoZ2V0LXRleHQtcHJvcGVydHkgKHBvaW50KSAnZ2l0LWJsYW1lKQorICAgICAgICAgICAgKGZvcndhcmQtbGluZSkKKyAgICAgICAgICAobGV0KiAoKHN0YXJ0IChwb2ludCkpCisgICAgICAgICAgICAgICAgIChlbmQgKHByb2duIChmb3J3YXJkLWxpbmUgMSkgKHBvaW50KSkpCisgICAgICAgICAgICAgICAgIChvdmwgKG1ha2Utb3ZlcmxheSBzdGFydCBlbmQpKSkKKyAgICAgICAgICAgIChwdXNoIG92bCBnaXQtYmxhbWUtb3ZlcmxheXMpCisgICAgICAgICAgICAob3ZlcmxheS1wdXQgb3ZsICdnaXQtYmxhbWUgaW5mbykKKyAgICAgICAgICAgIChvdmVybGF5LXB1dCBvdmwgJ2hlbHAtZWNobyBoYXNoKQorICAgICAgICAgICAgKG92ZXJsYXktcHV0IG92bCAnZmFjZSAobGlzdCA6YmFja2dyb3VuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2RyIChhc3NxICdjb2xvciAobnRoY2RyIDUgaW5mbykpKSkpCisgICAgICAgICAgICA7OyB0aGUgcG9pbnQtZW50ZXJlZCBwcm9wZXJ0eSBkb2Vzbid0IHNlZW0gdG8gd29yayBpbiBvdmVybGF5cworICAgICAgICAgICAgOzsob3ZlcmxheS1wdXQgb3ZsICdwb2ludC1lbnRlcmVkCisgICAgICAgICAgICA7OyAgICAgICAgICAgICBgKGxhbWJkYSAoeCB5KSAoZ2l0LWJsYW1lLWlkZW50aWZ5ICxoYXNoKSkpCisgICAgICAgICAgICAobGV0ICgobW9kaWZpZWQgKGJ1ZmZlci1tb2RpZmllZC1wKSkpCisgICAgICAgICAgICAgIChwdXQtdGV4dC1wcm9wZXJ0eSAoaWYgKD0gc3RhcnQgMSkgc3RhcnQgKDEtIHN0YXJ0KSkgKDEtIGVuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwb2ludC1lbnRlcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgKGxhbWJkYSAoeCB5KSAoZ2l0LWJsYW1lLWlkZW50aWZ5ICxoYXNoKSkpCisgICAgICAgICAgICAgIChzZXQtYnVmZmVyLW1vZGlmaWVkLXAgbW9kaWZpZWQpKSkpCisgICAgICAgIChzZXRxIG51bS1saW5lcyAoMS0gbnVtLWxpbmVzKSkpKSkpCisKKyhkZWZ1biBnaXQtYmxhbWUtYWRkLWluZm8gKGtleSB2YWx1ZSkKKyAgKGlmIGdpdC1ibGFtZS1jdXJyZW50CisgICAgICAobmNvbmMgZ2l0LWJsYW1lLWN1cnJlbnQgKGxpc3QgKGNvbnMgKGludGVybiBrZXkpIHZhbHVlKSkpKSkKKworKGRlZnVuIGdpdC1ibGFtZS1jdXJyZW50LWNvbW1pdCAoKQorICAobGV0ICgoaW5mbyAoZ2V0LWNoYXItcHJvcGVydHkgKHBvaW50KSAnZ2l0LWJsYW1lKSkpCisgICAgKGlmIGluZm8KKyAgICAgICAgKGNhciBpbmZvKQorICAgICAgKGVycm9yICJObyBjb21taXQgaW5mbyIpKSkpCisKKyhkZWZ1biBnaXQtZGVzY3JpYmUtY29tbWl0IChoYXNoKQorICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgIChjYWxsLXByb2Nlc3MgImdpdCIgbmlsIHQgbmlsCisgICAgICAgICAgICAgICAgICAibG9nIiAiLTEiCisJCSAgKGNvbmNhdCAiLS1wcmV0dHk9IiBnaXQtYmxhbWUtbG9nLW9uZWxpbmUtZm9ybWF0KQorICAgICAgICAgICAgICAgICAgaGFzaCkKKyAgICAoYnVmZmVyLXN1YnN0cmluZyAocG9pbnQtbWluKSAoMS0gKHBvaW50LW1heCkpKSkpCisKKyhkZWZ2YXIgZ2l0LWJsYW1lLWxhc3QtaWRlbnRpZmljYXRpb24gbmlsKQorKG1ha2UtdmFyaWFibGUtYnVmZmVyLWxvY2FsICdnaXQtYmxhbWUtbGFzdC1pZGVudGlmaWNhdGlvbikKKyhkZWZ1biBnaXQtYmxhbWUtaWRlbnRpZnkgKCZvcHRpb25hbCBoYXNoKQorICAoaW50ZXJhY3RpdmUpCisgIChsZXQgKChpbmZvIChnZXRoYXNoIChvciBoYXNoIChnaXQtYmxhbWUtY3VycmVudC1jb21taXQpKSBnaXQtYmxhbWUtY2FjaGUpKSkKKyAgICAod2hlbiAoYW5kIGluZm8gKG5vdCAoZXEgaW5mbyBnaXQtYmxhbWUtbGFzdC1pZGVudGlmaWNhdGlvbikpKQorICAgICAgKG1lc3NhZ2UgIiVzIiAobnRoIDQgaW5mbykpCisgICAgICAoc2V0cSBnaXQtYmxhbWUtbGFzdC1pZGVudGlmaWNhdGlvbiBpbmZvKSkpKQorCis7OyAoZGVmdW4gZ2l0LWJsYW1lLWFmdGVyLXNhdmUgKCkKKzs7ICAgKHdoZW4gZ2l0LWJsYW1lLW1vZGUKKzs7ICAgICAoZ2l0LWJsYW1lLWNsZWFudXApCis7OyAgICAgKGdpdC1ibGFtZS1ydW4pKSkKKzs7IChhZGQtaG9vayAnYWZ0ZXItc2F2ZS1ob29rICdnaXQtYmxhbWUtYWZ0ZXItc2F2ZSkKKworKGRlZnVuIGdpdC1ibGFtZS1hZnRlci1jaGFuZ2UgKHN0YXJ0IGVuZCBsZW5ndGgpCisgICh3aGVuIGdpdC1ibGFtZS1tb2RlCisgICAgKGdpdC1ibGFtZS1lbnEtdXBkYXRlIHN0YXJ0IGVuZCkpKQorCisoZGVmdmFyIGdpdC1ibGFtZS1sYXN0LXVwZGF0ZSBuaWwpCisobWFrZS12YXJpYWJsZS1idWZmZXItbG9jYWwgJ2dpdC1ibGFtZS1sYXN0LXVwZGF0ZSkKKyhkZWZ1biBnaXQtYmxhbWUtZW5xLXVwZGF0ZSAoc3RhcnQgZW5kKQorICAiTWFyayB0aGUgcmVnaW9uIGJldHdlZW4gU1RBUlQgYW5kIEVORCBhcyBuZWVkaW5nIGJsYW1lIHVwZGF0ZSIKKyAgOzsgVHJ5IHRvIGJlIHNtYXJ0IGFuZCBhdm9pZCBtdWx0aXBsZSBjYWxsb3V0cyBmb3Igc2VxdWVudGlhbAorICA7OyBlZGl0aW5nCisgIChjb25kICgoYW5kIGdpdC1ibGFtZS1sYXN0LXVwZGF0ZQorICAgICAgICAgICAgICAoPSBzdGFydCAoY2RyIGdpdC1ibGFtZS1sYXN0LXVwZGF0ZSkpKQorICAgICAgICAgKHNldGNkciBnaXQtYmxhbWUtbGFzdC11cGRhdGUgZW5kKSkKKyAgICAgICAgKChhbmQgZ2l0LWJsYW1lLWxhc3QtdXBkYXRlCisgICAgICAgICAgICAgICg9IGVuZCAoY2FyIGdpdC1ibGFtZS1sYXN0LXVwZGF0ZSkpKQorICAgICAgICAgKHNldGNhciBnaXQtYmxhbWUtbGFzdC11cGRhdGUgc3RhcnQpKQorICAgICAgICAodAorICAgICAgICAgKHNldHEgZ2l0LWJsYW1lLWxhc3QtdXBkYXRlIChjb25zIHN0YXJ0IGVuZCkpCisgICAgICAgICAoc2V0cSBnaXQtYmxhbWUtdXBkYXRlLXF1ZXVlIChuY29uYyBnaXQtYmxhbWUtdXBkYXRlLXF1ZXVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGlzdCBnaXQtYmxhbWUtbGFzdC11cGRhdGUpKSkpKQorICAodW5sZXNzIChvciBnaXQtYmxhbWUtcHJvYyBnaXQtYmxhbWUtaWRsZS10aW1lcikKKyAgICAoc2V0cSBnaXQtYmxhbWUtaWRsZS10aW1lcgorICAgICAgICAgIChydW4td2l0aC1pZGxlLXRpbWVyIDAuNSBuaWwgJ2dpdC1ibGFtZS1kZWxheWVkLXVwZGF0ZSkpKSkKKworKGRlZnVuIGdpdC1ibGFtZS1kZWxheWVkLXVwZGF0ZSAoKQorICAoc2V0cSBnaXQtYmxhbWUtaWRsZS10aW1lciBuaWwpCisgIChpZiBnaXQtYmxhbWUtdXBkYXRlLXF1ZXVlCisgICAgICAobGV0ICgoZmlyc3QgKHBvcCBnaXQtYmxhbWUtdXBkYXRlLXF1ZXVlKSkKKyAgICAgICAgICAgIChpbmhpYml0LXBvaW50LW1vdGlvbi1ob29rcyB0KSkKKyAgICAgICAgKGdpdC1ibGFtZS11cGRhdGUtcmVnaW9uIChjYXIgZmlyc3QpIChjZHIgZmlyc3QpKSkpKQorCisocHJvdmlkZSAnZ2l0LWJsYW1lKQorCis7OzsgZ2l0LWJsYW1lLmVsIGVuZHMgaGVyZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9lbWFjcy9naXQuZWwgYi9jb250cmliL2VtYWNzL2dpdC5lbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmE4NTNmCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9lbWFjcy9naXQuZWwKQEAgLTAsMCArMSwxNTg4IEBACis7OzsgZ2l0LmVsIC0tLSBBIHVzZXIgaW50ZXJmYWNlIGZvciBnaXQKKworOzsgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3IEFsZXhhbmRyZSBKdWxsaWFyZCA8anVsbGlhcmRAd2luZWhxLm9yZz4KKworOzsgVmVyc2lvbjogMS4wCisKKzs7IFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzs7IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCis7OyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorOzsgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7OworOzsgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorOzsgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorOzsgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorOzsgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzs7Cis7OyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKzs7IExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKzs7IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCis7OyBNQSAwMjExMS0xMzA3IFVTQQorCis7OzsgQ29tbWVudGFyeToKKworOzsgVGhpcyBmaWxlIGNvbnRhaW5zIGFuIGludGVyZmFjZSBmb3IgdGhlIGdpdCB2ZXJzaW9uIGNvbnRyb2wKKzs7IHN5c3RlbS4gSXQgcHJvdmlkZXMgZWFzeSBhY2Nlc3MgdG8gdGhlIG1vc3QgZnJlcXVlbnRseSB1c2VkIGdpdAorOzsgY29tbWFuZHMuIFRoZSB1c2VyIGludGVyZmFjZSBpcyBhcyBmYXIgYXMgcG9zc2libGUgaWRlbnRpY2FsIHRvCis7OyB0aGF0IG9mIHRoZSBQQ0wtQ1ZTIG1vZGUuCis7OworOzsgVG8gaW5zdGFsbDogcHV0IHRoaXMgZmlsZSBvbiB0aGUgbG9hZC1wYXRoIGFuZCBwbGFjZSB0aGUgZm9sbG93aW5nCis7OyBpbiB5b3VyIC5lbWFjcyBmaWxlOgorOzsKKzs7ICAgIChyZXF1aXJlICdnaXQpCis7OworOzsgVG8gc3RhcnQ6IGBNLXggZ2l0LXN0YXR1cycKKzs7Cis7OyBUT0RPCis7OyAgLSBwb3J0YWJpbGl0eSB0byBYRW1hY3MKKzs7ICAtIGRpZmYgYWdhaW5zdCBvdGhlciBicmFuY2gKKzs7ICAtIHJlbmFtaW5nIGZpbGVzIGZyb20gdGhlIHN0YXR1cyBidWZmZXIKKzs7ICAtIGNyZWF0aW5nIHRhZ3MKKzs7ICAtIGZldGNoL3B1bGwKKzs7ICAtIHN3aXRjaGluZyBicmFuY2hlcworOzsgIC0gcmV2bGlzdCBicm93c2VyCis7OyAgLSBnaXQtc2hvdy1icmFuY2ggYnJvd3NlcgorOzsgIC0gbWVudXMKKzs7CisKKyhldmFsLXdoZW4tY29tcGlsZSAocmVxdWlyZSAnY2wpKQorKHJlcXVpcmUgJ2V3b2MpCisocmVxdWlyZSAnbG9nLWVkaXQpCisocmVxdWlyZSAnZWFzeW1lbnUpCisKKworOzs7OyBDdXN0b21pemF0aW9ucworOzs7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKGRlZmdyb3VwIGdpdCBuaWwKKyAgIkEgdXNlciBpbnRlcmZhY2UgZm9yIHRoZSBnaXQgdmVyc2lvbmluZyBzeXN0ZW0uIgorICA6Z3JvdXAgJ3Rvb2xzKQorCisoZGVmY3VzdG9tIGdpdC1jb21taXR0ZXItbmFtZSBuaWwKKyAgIlVzZXIgbmFtZSB0byB1c2UgZm9yIGNvbW1pdHMuCitUaGUgZGVmYXVsdCBpcyB0byBmYWxsIGJhY2sgdG8gdGhlIHJlcG9zaXRvcnkgY29uZmlnLAordGhlbiB0byBgYWRkLWxvZy1mdWxsLW5hbWUnIGFuZCB0aGVuIHRvIGB1c2VyLWZ1bGwtbmFtZScuIgorICA6Z3JvdXAgJ2dpdAorICA6dHlwZSAnKGNob2ljZSAoY29uc3QgOnRhZyAiRGVmYXVsdCIgbmlsKQorICAgICAgICAgICAgICAgICAoc3RyaW5nIDp0YWcgIk5hbWUiKSkpCisKKyhkZWZjdXN0b20gZ2l0LWNvbW1pdHRlci1lbWFpbCBuaWwKKyAgIkVtYWlsIGFkZHJlc3MgdG8gdXNlIGZvciBjb21taXRzLgorVGhlIGRlZmF1bHQgaXMgdG8gZmFsbCBiYWNrIHRvIHRoZSBnaXQgcmVwb3NpdG9yeSBjb25maWcsCit0aGVuIHRvIGBhZGQtbG9nLW1haWxpbmctYWRkcmVzcycgYW5kIHRoZW4gdG8gYHVzZXItbWFpbC1hZGRyZXNzJy4iCisgIDpncm91cCAnZ2l0CisgIDp0eXBlICcoY2hvaWNlIChjb25zdCA6dGFnICJEZWZhdWx0IiBuaWwpCisgICAgICAgICAgICAgICAgIChzdHJpbmcgOnRhZyAiRW1haWwiKSkpCisKKyhkZWZjdXN0b20gZ2l0LWNvbW1pdHMtY29kaW5nLXN5c3RlbSBuaWwKKyAgIkRlZmF1bHQgY29kaW5nIHN5c3RlbSBmb3IgdGhlIGxvZyBtZXNzYWdlIG9mIGdpdCBjb21taXRzLiIKKyAgOmdyb3VwICdnaXQKKyAgOnR5cGUgJyhjaG9pY2UgKGNvbnN0IDp0YWcgIkZyb20gcmVwb3NpdG9yeSBjb25maWciIG5pbCkKKyAgICAgICAgICAgICAgICAgKGNvZGluZy1zeXN0ZW0pKSkKKworKGRlZmN1c3RvbSBnaXQtYXBwZW5kLXNpZ25lZC1vZmYtYnkgbmlsCisgICJXaGV0aGVyIHRvIGFwcGVuZCBhIFNpZ25lZC1vZmYtYnkgbGluZSB0byB0aGUgY29tbWl0IG1lc3NhZ2UgYmVmb3JlIGVkaXRpbmcuIgorICA6Z3JvdXAgJ2dpdAorICA6dHlwZSAnYm9vbGVhbikKKworKGRlZmN1c3RvbSBnaXQtcmV1c2Utc3RhdHVzLWJ1ZmZlciB0CisgICJXaGV0aGVyIGBnaXQtc3RhdHVzJyBzaG91bGQgdHJ5IHRvIHJldXNlIGFuIGV4aXN0aW5nIGJ1ZmZlcgoraWYgdGhlcmUgaXMgYWxyZWFkeSBvbmUgdGhhdCBkaXNwbGF5cyB0aGUgc2FtZSBkaXJlY3RvcnkuIgorICA6Z3JvdXAgJ2dpdAorICA6dHlwZSAnYm9vbGVhbikKKworKGRlZmN1c3RvbSBnaXQtcGVyLWRpci1pZ25vcmUtZmlsZSAiLmdpdGlnbm9yZSIKKyAgIk5hbWUgb2YgdGhlIHBlci1kaXJlY3RvcnkgaWdub3JlIGZpbGUuIgorICA6Z3JvdXAgJ2dpdAorICA6dHlwZSAnc3RyaW5nKQorCisoZGVmY3VzdG9tIGdpdC1zaG93LXVwdG9kYXRlIG5pbAorICAiV2hldGhlciB0byBkaXNwbGF5IHVwLXRvLWRhdGUgZmlsZXMuIgorICA6Z3JvdXAgJ2dpdAorICA6dHlwZSAnYm9vbGVhbikKKworKGRlZmN1c3RvbSBnaXQtc2hvdy1pZ25vcmVkIG5pbAorICAiV2hldGhlciB0byBkaXNwbGF5IGlnbm9yZWQgZmlsZXMuIgorICA6Z3JvdXAgJ2dpdAorICA6dHlwZSAnYm9vbGVhbikKKworKGRlZmN1c3RvbSBnaXQtc2hvdy11bmtub3duIHQKKyAgIldoZXRoZXIgdG8gZGlzcGxheSB1bmtub3duIGZpbGVzLiIKKyAgOmdyb3VwICdnaXQKKyAgOnR5cGUgJ2Jvb2xlYW4pCisKKworKGRlZmZhY2UgZ2l0LXN0YXR1cy1mYWNlCisgICcoKCgoY2xhc3MgY29sb3IpIChiYWNrZ3JvdW5kIGxpZ2h0KSkgKDpmb3JlZ3JvdW5kICJwdXJwbGUiKSkKKyAgICAoKChjbGFzcyBjb2xvcikgKGJhY2tncm91bmQgZGFyaykpICg6Zm9yZWdyb3VuZCAic2FsbW9uIikpKQorICAiR2l0IG1vZGUgZmFjZSB1c2VkIHRvIGhpZ2hsaWdodCBhZGRlZCBhbmQgbW9kaWZpZWQgZmlsZXMuIgorICA6Z3JvdXAgJ2dpdCkKKworKGRlZmZhY2UgZ2l0LXVubWVyZ2VkLWZhY2UKKyAgJygoKChjbGFzcyBjb2xvcikgKGJhY2tncm91bmQgbGlnaHQpKSAoOmZvcmVncm91bmQgInJlZCIgOmJvbGQgdCkpCisgICAgKCgoY2xhc3MgY29sb3IpIChiYWNrZ3JvdW5kIGRhcmspKSAoOmZvcmVncm91bmQgInJlZCIgOmJvbGQgdCkpKQorICAiR2l0IG1vZGUgZmFjZSB1c2VkIHRvIGhpZ2hsaWdodCB1bm1lcmdlZCBmaWxlcy4iCisgIDpncm91cCAnZ2l0KQorCisoZGVmZmFjZSBnaXQtdW5rbm93bi1mYWNlCisgICcoKCgoY2xhc3MgY29sb3IpIChiYWNrZ3JvdW5kIGxpZ2h0KSkgKDpmb3JlZ3JvdW5kICJnb2xkZW5yb2QiIDpib2xkIHQpKQorICAgICgoKGNsYXNzIGNvbG9yKSAoYmFja2dyb3VuZCBkYXJrKSkgKDpmb3JlZ3JvdW5kICJnb2xkZW5yb2QiIDpib2xkIHQpKSkKKyAgIkdpdCBtb2RlIGZhY2UgdXNlZCB0byBoaWdobGlnaHQgdW5rbm93biBmaWxlcy4iCisgIDpncm91cCAnZ2l0KQorCisoZGVmZmFjZSBnaXQtdXB0b2RhdGUtZmFjZQorICAnKCgoKGNsYXNzIGNvbG9yKSAoYmFja2dyb3VuZCBsaWdodCkpICg6Zm9yZWdyb3VuZCAiZ3JleTYwIikpCisgICAgKCgoY2xhc3MgY29sb3IpIChiYWNrZ3JvdW5kIGRhcmspKSAoOmZvcmVncm91bmQgImdyZXk0MCIpKSkKKyAgIkdpdCBtb2RlIGZhY2UgdXNlZCB0byBoaWdobGlnaHQgdXAtdG8tZGF0ZSBmaWxlcy4iCisgIDpncm91cCAnZ2l0KQorCisoZGVmZmFjZSBnaXQtaWdub3JlZC1mYWNlCisgICcoKCgoY2xhc3MgY29sb3IpIChiYWNrZ3JvdW5kIGxpZ2h0KSkgKDpmb3JlZ3JvdW5kICJncmV5NjAiKSkKKyAgICAoKChjbGFzcyBjb2xvcikgKGJhY2tncm91bmQgZGFyaykpICg6Zm9yZWdyb3VuZCAiZ3JleTQwIikpKQorICAiR2l0IG1vZGUgZmFjZSB1c2VkIHRvIGhpZ2hsaWdodCBpZ25vcmVkIGZpbGVzLiIKKyAgOmdyb3VwICdnaXQpCisKKyhkZWZmYWNlIGdpdC1tYXJrLWZhY2UKKyAgJygoKChjbGFzcyBjb2xvcikgKGJhY2tncm91bmQgbGlnaHQpKSAoOmZvcmVncm91bmQgInJlZCIgOmJvbGQgdCkpCisgICAgKCgoY2xhc3MgY29sb3IpIChiYWNrZ3JvdW5kIGRhcmspKSAoOmZvcmVncm91bmQgInRvbWF0byIgOmJvbGQgdCkpKQorICAiR2l0IG1vZGUgZmFjZSB1c2VkIGZvciB0aGUgZmlsZSBtYXJrcy4iCisgIDpncm91cCAnZ2l0KQorCisoZGVmZmFjZSBnaXQtaGVhZGVyLWZhY2UKKyAgJygoKChjbGFzcyBjb2xvcikgKGJhY2tncm91bmQgbGlnaHQpKSAoOmZvcmVncm91bmQgImJsdWUiKSkKKyAgICAoKChjbGFzcyBjb2xvcikgKGJhY2tncm91bmQgZGFyaykpICg6Zm9yZWdyb3VuZCAiYmx1ZSIpKSkKKyAgIkdpdCBtb2RlIGZhY2UgdXNlZCBmb3IgY29tbWl0IGhlYWRlcnMuIgorICA6Z3JvdXAgJ2dpdCkKKworKGRlZmZhY2UgZ2l0LXNlcGFyYXRvci1mYWNlCisgICcoKCgoY2xhc3MgY29sb3IpIChiYWNrZ3JvdW5kIGxpZ2h0KSkgKDpmb3JlZ3JvdW5kICJicm93biIpKQorICAgICgoKGNsYXNzIGNvbG9yKSAoYmFja2dyb3VuZCBkYXJrKSkgKDpmb3JlZ3JvdW5kICJicm93biIpKSkKKyAgIkdpdCBtb2RlIGZhY2UgdXNlZCBmb3IgY29tbWl0IHNlcGFyYXRvci4iCisgIDpncm91cCAnZ2l0KQorCisoZGVmZmFjZSBnaXQtcGVybWlzc2lvbi1mYWNlCisgICcoKCgoY2xhc3MgY29sb3IpIChiYWNrZ3JvdW5kIGxpZ2h0KSkgKDpmb3JlZ3JvdW5kICJncmVlbiIgOmJvbGQgdCkpCisgICAgKCgoY2xhc3MgY29sb3IpIChiYWNrZ3JvdW5kIGRhcmspKSAoOmZvcmVncm91bmQgImdyZWVuIiA6Ym9sZCB0KSkpCisgICJHaXQgbW9kZSBmYWNlIHVzZWQgZm9yIHBlcm1pc3Npb24gY2hhbmdlcy4iCisgIDpncm91cCAnZ2l0KQorCisKKzs7OzsgVXRpbGl0aWVzCis7Ozs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoZGVmY29uc3QgZ2l0LWxvZy1tc2ctc2VwYXJhdG9yICItLS0gbG9nIG1lc3NhZ2UgZm9sbG93cyB0aGlzIGxpbmUgLS0tIikKKworKGRlZnZhciBnaXQtbG9nLWVkaXQtZm9udC1sb2NrLWtleXdvcmRzCisgIGAoKCJeXFwoQXV0aG9yOlxcfERhdGU6XFx8UGFyZW50OlxcfFNpZ25lZC1vZmYtYnk6XFwpXFwoLipcXCkkIgorICAgICAoMSBmb250LWxvY2sta2V5d29yZC1mYWNlKQorICAgICAoMiBmb250LWxvY2stZnVuY3Rpb24tbmFtZS1mYWNlKSkKKyAgICAoLChjb25jYXQgIl5cXCgiIChyZWdleHAtcXVvdGUgZ2l0LWxvZy1tc2ctc2VwYXJhdG9yKSAiXFwpJCIpCisgICAgICgxIGZvbnQtbG9jay1jb21tZW50LWZhY2UpKSkpCisKKyhkZWZ1biBnaXQtZ2V0LWVudi1zdHJpbmdzIChlbnYpCisgICJCdWlsZCBhIGxpc3Qgb2YgTkFNRT1WQUxVRSBzdHJpbmdzIGZyb20gYSBsaXN0IG9mIGVudmlyb25tZW50IHN0cmluZ3MuIgorICAobWFwY2FyIChsYW1iZGEgKGVudHJ5KSAoY29uY2F0IChjYXIgZW50cnkpICI9IiAoY2RyIGVudHJ5KSkpIGVudikpCisKKyhkZWZ1biBnaXQtY2FsbC1wcm9jZXNzLWVudiAoYnVmZmVyIGVudiAmcmVzdCBhcmdzKQorICAiV3JhcHBlciBmb3IgY2FsbC1wcm9jZXNzIHRoYXQgc2V0cyBlbnZpcm9ubWVudCBzdHJpbmdzLiIKKyAgKGxldCAoKHByb2Nlc3MtZW52aXJvbm1lbnQgKGFwcGVuZCAoZ2l0LWdldC1lbnYtc3RyaW5ncyBlbnYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy1lbnZpcm9ubWVudCkpKQorICAgIChhcHBseSAjJ2NhbGwtcHJvY2VzcyAiZ2l0IiBuaWwgYnVmZmVyIG5pbCBhcmdzKSkpCisKKyhkZWZ1biBnaXQtY2FsbC1wcm9jZXNzLWRpc3BsYXktZXJyb3IgKCZyZXN0IGFyZ3MpCisgICJXcmFwcGVyIGZvciBjYWxsLXByb2Nlc3MgdGhhdCBkaXNwbGF5cyBlcnJvciBtZXNzYWdlcy4iCisgIChsZXQqICgoZGlyIGRlZmF1bHQtZGlyZWN0b3J5KQorICAgICAgICAgKGJ1ZmZlciAoZ2V0LWJ1ZmZlci1jcmVhdGUgIipHaXQgQ29tbWFuZCBPdXRwdXQqIikpCisgICAgICAgICAob2sgKHdpdGgtY3VycmVudC1idWZmZXIgYnVmZmVyCisgICAgICAgICAgICAgICAobGV0ICgoZGVmYXVsdC1kaXJlY3RvcnkgZGlyKQorICAgICAgICAgICAgICAgICAgICAgKGJ1ZmZlci1yZWFkLW9ubHkgbmlsKSkKKyAgICAgICAgICAgICAgICAgKGVyYXNlLWJ1ZmZlcikKKyAgICAgICAgICAgICAgICAgKGVxIDAgKGFwcGx5ICdjYWxsLXByb2Nlc3MgImdpdCIgbmlsIChsaXN0IGJ1ZmZlciB0KSBuaWwgYXJncykpKSkpKQorICAgICh1bmxlc3Mgb2sgKGRpc3BsYXktbWVzc2FnZS1vci1idWZmZXIgYnVmZmVyKSkKKyAgICBvaykpCisKKyhkZWZ1biBnaXQtY2FsbC1wcm9jZXNzLWVudi1zdHJpbmcgKGVudiAmcmVzdCBhcmdzKQorICAiV3JhcHBlciBmb3IgY2FsbC1wcm9jZXNzIHRoYXQgc2V0cyBlbnZpcm9ubWVudCBzdHJpbmdzLAorYW5kIHJldHVybnMgdGhlIHByb2Nlc3Mgb3V0cHV0IGFzIGEgc3RyaW5nLCBvciBuaWwgaWYgdGhlIGdpdCBmYWlsZWQuIgorICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgIChhbmQgKGVxIDAgKGFwcGx5ICMnIGdpdC1jYWxsLXByb2Nlc3MtZW52IHQgZW52IGFyZ3MpKQorICAgICAgICAgKGJ1ZmZlci1zdHJpbmcpKSkpCisKKyhkZWZ1biBnaXQtcnVuLXByb2Nlc3MtcmVnaW9uIChidWZmZXIgc3RhcnQgZW5kIHByb2dyYW0gYXJncykKKyAgIlJ1biBhIGdpdCBwcm9jZXNzIHdpdGggYSBidWZmZXIgcmVnaW9uIGFzIGlucHV0LiIKKyAgKGxldCAoKG91dHB1dC1idWZmZXIgKGN1cnJlbnQtYnVmZmVyKSkKKyAgICAgICAgKGRpciBkZWZhdWx0LWRpcmVjdG9yeSkpCisgICAgKHdpdGgtY3VycmVudC1idWZmZXIgYnVmZmVyCisgICAgICAoY2QgZGlyKQorICAgICAgKGFwcGx5ICMnY2FsbC1wcm9jZXNzLXJlZ2lvbiBzdGFydCBlbmQgcHJvZ3JhbQorICAgICAgICAgICAgIG5pbCAobGlzdCBvdXRwdXQtYnVmZmVyIG5pbCkgbmlsIGFyZ3MpKSkpCisKKyhkZWZ1biBnaXQtcnVuLWNvbW1hbmQtYnVmZmVyIChidWZmZXItbmFtZSAmcmVzdCBhcmdzKQorICAiUnVuIGEgZ2l0IGNvbW1hbmQsIHNlbmRpbmcgdGhlIG91dHB1dCB0byBhIGJ1ZmZlciBuYW1lZCBCVUZGRVItTkFNRS4iCisgIChsZXQgKChkaXIgZGVmYXVsdC1kaXJlY3RvcnkpCisgICAgICAgIChidWZmZXIgKGdldC1idWZmZXItY3JlYXRlIGJ1ZmZlci1uYW1lKSkpCisgICAgKG1lc3NhZ2UgIlJ1bm5pbmcgZ2l0ICVzLi4uIiAoY2FyIGFyZ3MpKQorICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGJ1ZmZlcgorICAgICAgKGxldCAoKGRlZmF1bHQtZGlyZWN0b3J5IGRpcikKKyAgICAgICAgICAgIChidWZmZXItcmVhZC1vbmx5IG5pbCkpCisgICAgICAgIChlcmFzZS1idWZmZXIpCisgICAgICAgIChhcHBseSAjJ2dpdC1jYWxsLXByb2Nlc3MtZW52IGJ1ZmZlciBuaWwgYXJncykpKQorICAgIChtZXNzYWdlICJSdW5uaW5nIGdpdCAlcy4uLmRvbmUiIChjYXIgYXJncykpCisgICAgYnVmZmVyKSkKKworKGRlZnVuIGdpdC1ydW4tY29tbWFuZC1yZWdpb24gKGJ1ZmZlciBzdGFydCBlbmQgZW52ICZyZXN0IGFyZ3MpCisgICJSdW4gYSBnaXQgY29tbWFuZCB3aXRoIHNwZWNpZmllZCBidWZmZXIgcmVnaW9uIGFzIGlucHV0LiIKKyAgKHVubGVzcyAoZXEgMCAoaWYgZW52CisgICAgICAgICAgICAgICAgICAgIChnaXQtcnVuLXByb2Nlc3MtcmVnaW9uCisgICAgICAgICAgICAgICAgICAgICBidWZmZXIgc3RhcnQgZW5kICJlbnYiCisgICAgICAgICAgICAgICAgICAgICAoYXBwZW5kIChnaXQtZ2V0LWVudi1zdHJpbmdzIGVudikgKGxpc3QgImdpdCIpIGFyZ3MpKQorICAgICAgICAgICAgICAgICAgKGdpdC1ydW4tcHJvY2Vzcy1yZWdpb24KKyAgICAgICAgICAgICAgICAgICBidWZmZXIgc3RhcnQgZW5kICJnaXQiIGFyZ3MpKSkKKyAgICAoZXJyb3IgIkZhaWxlZCB0byBydW4gXCJnaXQgJXNcIjpcbiVzIiAobWFwY29uY2F0IChsYW1iZGEgKHgpIHgpIGFyZ3MgIiAiKSAoYnVmZmVyLXN0cmluZykpKSkKKworKGRlZnVuIGdpdC1ydW4taG9vayAoaG9vayBlbnYgJnJlc3QgYXJncykKKyAgIlJ1biBhIGdpdCBob29rIGFuZCBkaXNwbGF5IGl0cyBvdXRwdXQgaWYgYW55LiIKKyAgKGxldCAoKGRpciBkZWZhdWx0LWRpcmVjdG9yeSkKKyAgICAgICAgKGhvb2stbmFtZSAoZXhwYW5kLWZpbGUtbmFtZSAoY29uY2F0ICIuZ2l0L2hvb2tzLyIgaG9vaykpKSkKKyAgICAob3IgKG5vdCAoZmlsZS1leGVjdXRhYmxlLXAgaG9vay1uYW1lKSkKKyAgICAgICAgKGxldCAoc3RhdHVzIChidWZmZXIgKGdldC1idWZmZXItY3JlYXRlICIqR2l0IEhvb2sgT3V0cHV0KiIpKSkKKyAgICAgICAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciBidWZmZXIKKyAgICAgICAgICAgIChlcmFzZS1idWZmZXIpCisgICAgICAgICAgICAoY2QgZGlyKQorICAgICAgICAgICAgKHNldHEgc3RhdHVzCisgICAgICAgICAgICAgICAgICAoaWYgZW52CisgICAgICAgICAgICAgICAgICAgICAgKGFwcGx5ICMnY2FsbC1wcm9jZXNzICJlbnYiIG5pbCAobGlzdCBidWZmZXIgdCkgbmlsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcHBlbmQgKGdpdC1nZXQtZW52LXN0cmluZ3MgZW52KSAobGlzdCBob29rLW5hbWUpIGFyZ3MpKQorICAgICAgICAgICAgICAgICAgICAoYXBwbHkgIydjYWxsLXByb2Nlc3MgaG9vay1uYW1lIG5pbCAobGlzdCBidWZmZXIgdCkgbmlsIGFyZ3MpKSkpCisgICAgICAgICAgKGRpc3BsYXktbWVzc2FnZS1vci1idWZmZXIgYnVmZmVyKQorICAgICAgICAgIChlcSAwIHN0YXR1cykpKSkpCisKKyhkZWZ1biBnaXQtZ2V0LXN0cmluZy1zaGExIChzdHJpbmcpCisgICJSZWFkIGEgU0hBMSBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLiIKKyAgKGFuZCBzdHJpbmcKKyAgICAgICAoc3RyaW5nLW1hdGNoICJbMC05YS1mXVxcezQwXFx9IiBzdHJpbmcpCisgICAgICAgKG1hdGNoLXN0cmluZyAwIHN0cmluZykpKQorCisoZGVmdW4gZ2l0LWdldC1jb21taXR0ZXItbmFtZSAoKQorICAiUmV0dXJuIHRoZSBuYW1lIHRvIHVzZSBhcyBHSVRfQ09NTUlUVEVSX05BTUUuIgorICA7IGNvcGllZCBmcm9tIGxvZy1lZGl0CisgIChvciBnaXQtY29tbWl0dGVyLW5hbWUKKyAgICAgIChnaXQtY29uZmlnICJ1c2VyLm5hbWUiKQorICAgICAgKGFuZCAoYm91bmRwICdhZGQtbG9nLWZ1bGwtbmFtZSkgYWRkLWxvZy1mdWxsLW5hbWUpCisgICAgICAoYW5kIChmYm91bmRwICd1c2VyLWZ1bGwtbmFtZSkgKHVzZXItZnVsbC1uYW1lKSkKKyAgICAgIChhbmQgKGJvdW5kcCAndXNlci1mdWxsLW5hbWUpIHVzZXItZnVsbC1uYW1lKSkpCisKKyhkZWZ1biBnaXQtZ2V0LWNvbW1pdHRlci1lbWFpbCAoKQorICAiUmV0dXJuIHRoZSBlbWFpbCBhZGRyZXNzIHRvIHVzZSBhcyBHSVRfQ09NTUlUVEVSX0VNQUlMLiIKKyAgOyBjb3BpZWQgZnJvbSBsb2ctZWRpdAorICAob3IgZ2l0LWNvbW1pdHRlci1lbWFpbAorICAgICAgKGdpdC1jb25maWcgInVzZXIuZW1haWwiKQorICAgICAgKGFuZCAoYm91bmRwICdhZGQtbG9nLW1haWxpbmctYWRkcmVzcykgYWRkLWxvZy1tYWlsaW5nLWFkZHJlc3MpCisgICAgICAoYW5kIChmYm91bmRwICd1c2VyLW1haWwtYWRkcmVzcykgKHVzZXItbWFpbC1hZGRyZXNzKSkKKyAgICAgIChhbmQgKGJvdW5kcCAndXNlci1tYWlsLWFkZHJlc3MpIHVzZXItbWFpbC1hZGRyZXNzKSkpCisKKyhkZWZ1biBnaXQtZ2V0LWNvbW1pdHMtY29kaW5nLXN5c3RlbSAoKQorICAiUmV0dXJuIHRoZSBjb2Rpbmcgc3lzdGVtIHRvIHVzZSBmb3IgY29tbWl0cy4iCisgIChsZXQgKChyZXBvLWNvbmZpZyAoZ2l0LWNvbmZpZyAiaTE4bi5jb21taXRlbmNvZGluZyIpKSkKKyAgICAob3IgZ2l0LWNvbW1pdHMtY29kaW5nLXN5c3RlbQorICAgICAgICAoYW5kIHJlcG8tY29uZmlnCisgICAgICAgICAgICAgKGZib3VuZHAgJ2xvY2FsZS1jaGFyc2V0LXRvLWNvZGluZy1zeXN0ZW0pCisgICAgICAgICAgICAgKGxvY2FsZS1jaGFyc2V0LXRvLWNvZGluZy1zeXN0ZW0gcmVwby1jb25maWcpKQorICAgICAgJ3V0Zi04KSkpCisKKyhkZWZ1biBnaXQtZ2V0LWxvZ291dHB1dC1jb2Rpbmctc3lzdGVtICgpCisgICJSZXR1cm4gdGhlIGNvZGluZyBzeXN0ZW0gdXNlZCBmb3IgZ2l0LWxvZyBvdXRwdXQuIgorICAobGV0ICgocmVwby1jb25maWcgKG9yIChnaXQtY29uZmlnICJpMThuLmxvZ291dHB1dGVuY29kaW5nIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZ2l0LWNvbmZpZyAiaTE4bi5jb21taXRlbmNvZGluZyIpKSkpCisgICAgKG9yIGdpdC1jb21taXRzLWNvZGluZy1zeXN0ZW0KKyAgICAgICAgKGFuZCByZXBvLWNvbmZpZworICAgICAgICAgICAgIChmYm91bmRwICdsb2NhbGUtY2hhcnNldC10by1jb2Rpbmctc3lzdGVtKQorICAgICAgICAgICAgIChsb2NhbGUtY2hhcnNldC10by1jb2Rpbmctc3lzdGVtIHJlcG8tY29uZmlnKSkKKyAgICAgICd1dGYtOCkpKQorCisoZGVmdW4gZ2l0LWVzY2FwZS1maWxlLW5hbWUgKG5hbWUpCisgICJFc2NhcGUgYSBmaWxlIG5hbWUgaWYgbmVjZXNzYXJ5LiIKKyAgKGlmIChzdHJpbmctbWF0Y2ggIltcblx0XCJcXF0iIG5hbWUpCisgICAgICAoY29uY2F0ICJcIiIKKyAgICAgICAgICAgICAgKG1hcGNvbmNhdCAobGFtYmRhIChjKQorICAgICAgICAgICAgICAgICAgIChjYXNlIGMKKyAgICAgICAgICAgICAgICAgICAgICg/XG4gIlxcbiIpCisgICAgICAgICAgICAgICAgICAgICAoP1x0ICJcXHQiKQorICAgICAgICAgICAgICAgICAgICAgKD9cXCAiXFxcXCIpCisgICAgICAgICAgICAgICAgICAgICAoP1wiICJcXFwiIikKKyAgICAgICAgICAgICAgICAgICAgICh0IChjaGFyLXRvLXN0cmluZyBjKSkpKQorICAgICAgICAgICAgICAgICBuYW1lICIiKQorICAgICAgICAgICAgICAiXCIiKQorICAgIG5hbWUpKQorCisoZGVmdW4gZ2l0LXN1Y2Nlc3MtbWVzc2FnZSAodGV4dCBmaWxlcykKKyAgIlByaW50IGEgc3VjY2VzcyBtZXNzYWdlIGFmdGVyIGhhdmluZyBoYW5kbGVkIEZJTEVTLiIKKyAgKGxldCAoKG4gKGxlbmd0aCBmaWxlcykpKQorICAgIChpZiAoZXF1YWwgbiAxKQorICAgICAgICAobWVzc2FnZSAiJXMgJXMiIHRleHQgKGNhciBmaWxlcykpCisgICAgICAobWVzc2FnZSAiJXMgJWQgZmlsZXMiIHRleHQgbikpKSkKKworKGRlZnVuIGdpdC1nZXQtdG9wLWRpciAoZGlyKQorICAiUmV0cmlldmUgdGhlIHRvcC1sZXZlbCBkaXJlY3Rvcnkgb2YgYSBnaXQgdHJlZS4iCisgIChsZXQgKChjZHVwICh3aXRoLW91dHB1dC10by1zdHJpbmcKKyAgICAgICAgICAgICAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciBzdGFuZGFyZC1vdXRwdXQKKyAgICAgICAgICAgICAgICAgIChjZCBkaXIpCisgICAgICAgICAgICAgICAgICAodW5sZXNzIChlcSAwIChjYWxsLXByb2Nlc3MgImdpdCIgbmlsIHQgbmlsICJyZXYtcGFyc2UiICItLXNob3ctY2R1cCIpKQorICAgICAgICAgICAgICAgICAgICAoZXJyb3IgImNhbm5vdCBmaW5kIHRvcC1sZXZlbCBnaXQgdHJlZSBmb3IgJXMuIiBkaXIpKSkpKSkKKyAgICAoZXhwYW5kLWZpbGUtbmFtZSAoY29uY2F0IChmaWxlLW5hbWUtYXMtZGlyZWN0b3J5IGRpcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYXIgKHNwbGl0LXN0cmluZyBjZHVwICJcbiIpKSkpKSkKKworO3N0b2xlbiBmcm9tIHBjbC1jdnMKKyhkZWZ1biBnaXQtYXBwZW5kLXRvLWlnbm9yZSAoZmlsZSkKKyAgIkFkZCBhIGZpbGUgbmFtZSB0byB0aGUgaWdub3JlIGZpbGUgaW4gaXRzIGRpcmVjdG9yeS4iCisgIChsZXQqICgoZnVsbG5hbWUgKGV4cGFuZC1maWxlLW5hbWUgZmlsZSkpCisgICAgICAgICAoZGlyIChmaWxlLW5hbWUtZGlyZWN0b3J5IGZ1bGxuYW1lKSkKKyAgICAgICAgIChuYW1lIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IGZ1bGxuYW1lKSkKKyAgICAgICAgIChpZ25vcmUtbmFtZSAoZXhwYW5kLWZpbGUtbmFtZSBnaXQtcGVyLWRpci1pZ25vcmUtZmlsZSBkaXIpKQorICAgICAgICAgKGNyZWF0ZWQgKG5vdCAoZmlsZS1leGlzdHMtcCBpZ25vcmUtbmFtZSkpKSkKKyAgKHNhdmUtd2luZG93LWV4Y3Vyc2lvbgorICAgIChzZXQtYnVmZmVyIChmaW5kLWZpbGUtbm9zZWxlY3QgaWdub3JlLW5hbWUpKQorICAgIChnb3RvLWNoYXIgKHBvaW50LW1heCkpCisgICAgKHVubGVzcyAoemVyb3AgKGN1cnJlbnQtY29sdW1uKSkgKGluc2VydCAiXG4iKSkKKyAgICAoaW5zZXJ0ICIvIiBuYW1lICJcbiIpCisgICAgKHNvcnQtbGluZXMgbmlsIChwb2ludC1taW4pIChwb2ludC1tYXgpKQorICAgIChzYXZlLWJ1ZmZlcikpCisgICh3aGVuIGNyZWF0ZWQKKyAgICAoZ2l0LWNhbGwtcHJvY2Vzcy1lbnYgbmlsIG5pbCAidXBkYXRlLWluZGV4IiAiLS1hZGQiICItLSIgKGZpbGUtcmVsYXRpdmUtbmFtZSBpZ25vcmUtbmFtZSkpKQorICAoZ2l0LXVwZGF0ZS1zdGF0dXMtZmlsZXMgKGxpc3QgKGZpbGUtcmVsYXRpdmUtbmFtZSBpZ25vcmUtbmFtZSkpICd1bmtub3duKSkpCisKKzsgcHJvcGVydGl6ZSBkZWZpbml0aW9uIGZvciBYRW1hY3MsIHN0b2xlbiBmcm9tIGVyYy1jb21wYXQKKyhldmFsLXdoZW4tY29tcGlsZQorICAodW5sZXNzIChmYm91bmRwICdwcm9wZXJ0aXplKQorICAgIChkZWZ1biBwcm9wZXJ0aXplIChzdHJpbmcgJnJlc3QgcHJvcHMpCisgICAgICAobGV0ICgoc3RyaW5nIChjb3B5LXNlcXVlbmNlIHN0cmluZykpKQorICAgICAgICAod2hpbGUgcHJvcHMKKyAgICAgICAgICAocHV0LXRleHQtcHJvcGVydHkgMCAobGVuZ3RoIHN0cmluZykgKG50aCAwIHByb3BzKSAobnRoIDEgcHJvcHMpIHN0cmluZykKKyAgICAgICAgICAoc2V0cSBwcm9wcyAoY2RkciBwcm9wcykpKQorICAgICAgICBzdHJpbmcpKSkpCisKKzs7OzsgV3JhcHBlcnMgZm9yIGJhc2ljIGdpdCBjb21tYW5kcworOzs7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKGRlZnVuIGdpdC1yZXYtcGFyc2UgKHJldikKKyAgIlBhcnNlIGEgcmV2aXNpb24gbmFtZSBhbmQgcmV0dXJuIGl0cyBTSEExLiIKKyAgKGdpdC1nZXQtc3RyaW5nLXNoYTEKKyAgIChnaXQtY2FsbC1wcm9jZXNzLWVudi1zdHJpbmcgbmlsICJyZXYtcGFyc2UiIHJldikpKQorCisoZGVmdW4gZ2l0LWNvbmZpZyAoa2V5KQorICAiUmV0cmlldmUgdGhlIHZhbHVlIGFzc29jaWF0ZWQgdG8gS0VZIGluIHRoZSBnaXQgcmVwb3NpdG9yeSBjb25maWcgZmlsZS4iCisgIChsZXQgKChzdHIgKGdpdC1jYWxsLXByb2Nlc3MtZW52LXN0cmluZyBuaWwgImNvbmZpZyIga2V5KSkpCisgICAgKGFuZCBzdHIgKGNhciAoc3BsaXQtc3RyaW5nIHN0ciAiXG4iKSkpKSkKKworKGRlZnVuIGdpdC1zeW1ib2xpYy1yZWYgKHJlZikKKyAgIldyYXBwZXIgZm9yIHRoZSBnaXQtc3ltYm9saWMtcmVmIGNvbW1hbmQuIgorICAobGV0ICgoc3RyIChnaXQtY2FsbC1wcm9jZXNzLWVudi1zdHJpbmcgbmlsICJzeW1ib2xpYy1yZWYiIHJlZikpKQorICAgIChhbmQgc3RyIChjYXIgKHNwbGl0LXN0cmluZyBzdHIgIlxuIikpKSkpCisKKyhkZWZ1biBnaXQtdXBkYXRlLXJlZiAocmVmIG5ld3ZhbCAmb3B0aW9uYWwgb2xkdmFsIHJlYXNvbikKKyAgIlVwZGF0ZSBhIHJlZmVyZW5jZSBieSBjYWxsaW5nIGdpdC11cGRhdGUtcmVmLiIKKyAgKGxldCAoKGFyZ3MgKGFuZCBvbGR2YWwgKGxpc3Qgb2xkdmFsKSkpKQorICAgIChwdXNoIG5ld3ZhbCBhcmdzKQorICAgIChwdXNoIHJlZiBhcmdzKQorICAgICh3aGVuIHJlYXNvbgorICAgICAocHVzaCByZWFzb24gYXJncykKKyAgICAgKHB1c2ggIi1tIiBhcmdzKSkKKyAgICAoYXBwbHkgJ2dpdC1jYWxsLXByb2Nlc3MtZGlzcGxheS1lcnJvciAidXBkYXRlLXJlZiIgYXJncykpKQorCisoZGVmdW4gZ2l0LXJlYWQtdHJlZSAodHJlZSAmb3B0aW9uYWwgaW5kZXgtZmlsZSkKKyAgIlJlYWQgYSB0cmVlIGludG8gdGhlIGluZGV4IGZpbGUuIgorICAoYXBwbHkgIydnaXQtY2FsbC1wcm9jZXNzLWVudiBuaWwKKyAgICAgICAgIChpZiBpbmRleC1maWxlIGAoKCJHSVRfSU5ERVhfRklMRSIgLiAsaW5kZXgtZmlsZSkpIG5pbCkKKyAgICAgICAgICJyZWFkLXRyZWUiIChpZiB0cmVlIChsaXN0IHRyZWUpKSkpCisKKyhkZWZ1biBnaXQtd3JpdGUtdHJlZSAoJm9wdGlvbmFsIGluZGV4LWZpbGUpCisgICJDYWxsIGdpdC13cml0ZS10cmVlIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyB0cmVlIFNIQTEgYXMgYSBzdHJpbmcuIgorICAoZ2l0LWdldC1zdHJpbmctc2hhMQorICAgKGdpdC1jYWxsLXByb2Nlc3MtZW52LXN0cmluZyAoYW5kIGluZGV4LWZpbGUgYCgoIkdJVF9JTkRFWF9GSUxFIiAuICxpbmRleC1maWxlKSkpICJ3cml0ZS10cmVlIikpKQorCisoZGVmdW4gZ2l0LWNvbW1pdC10cmVlIChidWZmZXIgdHJlZSBoZWFkKQorICAiQ2FsbCBnaXQtY29tbWl0LXRyZWUgd2l0aCBidWZmZXIgYXMgaW5wdXQgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIGNvbW1pdCBTSEExLiIKKyAgKGxldCAoKGF1dGhvci1uYW1lIChnaXQtZ2V0LWNvbW1pdHRlci1uYW1lKSkKKyAgICAgICAgKGF1dGhvci1lbWFpbCAoZ2l0LWdldC1jb21taXR0ZXItZW1haWwpKQorICAgICAgICAoc3ViamVjdCAiY29tbWl0IChpbml0aWFsKTogIikKKyAgICAgICAgYXV0aG9yLWRhdGUgbG9nLXN0YXJ0IGxvZy1lbmQgYXJncyBjb2Rpbmctc3lzdGVtLWZvci13cml0ZSkKKyAgICAod2hlbiBoZWFkCisgICAgICAoc2V0cSBzdWJqZWN0ICJjb21taXQ6ICIpCisgICAgICAocHVzaCAiLXAiIGFyZ3MpCisgICAgICAocHVzaCBoZWFkIGFyZ3MpKQorICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGJ1ZmZlcgorICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAgICAgIChpZgorICAgICAgICAgIChzZXRxIGxvZy1zdGFydCAocmUtc2VhcmNoLWZvcndhcmQgKGNvbmNhdCAiXiIgKHJlZ2V4cC1xdW90ZSBnaXQtbG9nLW1zZy1zZXBhcmF0b3IpICJcbiIpIG5pbCB0KSkKKyAgICAgICAgICAoc2F2ZS1yZXN0cmljdGlvbgorICAgICAgICAgICAgKG5hcnJvdy10by1yZWdpb24gKHBvaW50LW1pbikgbG9nLXN0YXJ0KQorICAgICAgICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAgICAgICAgICAgICh3aGVuIChyZS1zZWFyY2gtZm9yd2FyZCAiXkF1dGhvcjogK1xcKC4qP1xcKSAqPFxcKC4qXFwpPiAqJCIgbmlsIHQpCisgICAgICAgICAgICAgIChzZXRxIGF1dGhvci1uYW1lIChtYXRjaC1zdHJpbmcgMSkKKyAgICAgICAgICAgICAgICAgICAgYXV0aG9yLWVtYWlsIChtYXRjaC1zdHJpbmcgMikpKQorICAgICAgICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAgICAgICAgICAgICh3aGVuIChyZS1zZWFyY2gtZm9yd2FyZCAiXkRhdGU6ICtcXCguKlxcKSQiIG5pbCB0KQorICAgICAgICAgICAgICAoc2V0cSBhdXRob3ItZGF0ZSAobWF0Y2gtc3RyaW5nIDEpKSkKKyAgICAgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAgICAgICAod2hpbGUgKHJlLXNlYXJjaC1mb3J3YXJkICJeUGFyZW50OiArXFwoWzAtOWEtZl0rXFwpIiBuaWwgdCkKKyAgICAgICAgICAgICAgKHVubGVzcyAoc3RyaW5nLWVxdWFsIGhlYWQgKG1hdGNoLXN0cmluZyAxKSkKKyAgICAgICAgICAgICAgICAoc2V0cSBzdWJqZWN0ICJjb21taXQgKG1lcmdlKTogIikKKyAgICAgICAgICAgICAgICAocHVzaCAiLXAiIGFyZ3MpCisgICAgICAgICAgICAgICAgKHB1c2ggKG1hdGNoLXN0cmluZyAxKSBhcmdzKSkpKQorICAgICAgICAoc2V0cSBsb2ctc3RhcnQgKHBvaW50LW1pbikpKQorICAgICAgKHNldHEgbG9nLWVuZCAocG9pbnQtbWF4KSkKKyAgICAgIChnb3RvLWNoYXIgbG9nLXN0YXJ0KQorICAgICAgKHdoZW4gKHJlLXNlYXJjaC1mb3J3YXJkICIuKiQiIG5pbCB0KQorICAgICAgICAoc2V0cSBzdWJqZWN0IChjb25jYXQgc3ViamVjdCAobWF0Y2gtc3RyaW5nIDApKSkpCisgICAgICAoc2V0cSBjb2Rpbmctc3lzdGVtLWZvci13cml0ZSBidWZmZXItZmlsZS1jb2Rpbmctc3lzdGVtKSkKKyAgICAobGV0ICgoY29tbWl0CisgICAgICAgICAgIChnaXQtZ2V0LXN0cmluZy1zaGExCisgICAgICAgICAgICAod2l0aC1vdXRwdXQtdG8tc3RyaW5nCisgICAgICAgICAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIHN0YW5kYXJkLW91dHB1dAorICAgICAgICAgICAgICAgIChsZXQgKChlbnYgYCgoIkdJVF9BVVRIT1JfTkFNRSIgLiAsYXV0aG9yLW5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiR0lUX0FVVEhPUl9FTUFJTCIgLiAsYXV0aG9yLWVtYWlsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIkdJVF9DT01NSVRURVJfTkFNRSIgLiAsKGdpdC1nZXQtY29tbWl0dGVyLW5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIkdJVF9DT01NSVRURVJfRU1BSUwiIC4gLChnaXQtZ2V0LWNvbW1pdHRlci1lbWFpbCkpKSkpCisgICAgICAgICAgICAgICAgICAod2hlbiBhdXRob3ItZGF0ZSAocHVzaCBgKCJHSVRfQVVUSE9SX0RBVEUiIC4gLGF1dGhvci1kYXRlKSBlbnYpKQorICAgICAgICAgICAgICAgICAgKGFwcGx5ICMnZ2l0LXJ1bi1jb21tYW5kLXJlZ2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBsb2ctc3RhcnQgbG9nLWVuZCBlbnYKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbWl0LXRyZWUiIHRyZWUgKG5yZXZlcnNlIGFyZ3MpKSkpKSkpKQorICAgICAgKGFuZCAoZ2l0LXVwZGF0ZS1yZWYgIkhFQUQiIGNvbW1pdCBoZWFkIHN1YmplY3QpCisgICAgICAgICAgIGNvbW1pdCkpKSkKKworKGRlZnVuIGdpdC1lbXB0eS1kYi1wICgpCisgICJDaGVjayBpZiB0aGUgZ2l0IGRiIGlzIGVtcHR5IChubyBjb21taXQgZG9uZSB5ZXQpLiIKKyAgKG5vdCAoZXEgMCAoY2FsbC1wcm9jZXNzICJnaXQiIG5pbCBuaWwgbmlsICJyZXYtcGFyc2UiICItLXZlcmlmeSIgIkhFQUQiKSkpKQorCisoZGVmdW4gZ2l0LWdldC1tZXJnZS1oZWFkcyAoKQorICAiUmV0cmlldmUgdGhlIG1lcmdlIGhlYWRzIGZyb20gdGhlIE1FUkdFX0hFQUQgZmlsZSBpZiBwcmVzZW50LiIKKyAgKGxldCAoaGVhZHMpCisgICAgKHdoZW4gKGZpbGUtcmVhZGFibGUtcCAiLmdpdC9NRVJHRV9IRUFEIikKKyAgICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAgIChpbnNlcnQtZmlsZS1jb250ZW50cyAiLmdpdC9NRVJHRV9IRUFEIiBuaWwgbmlsIG5pbCB0KQorICAgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgICAgICAod2hpbGUgKHJlLXNlYXJjaC1mb3J3YXJkICJbMC05YS1mXVxcezQwXFx9IiBuaWwgdCkKKyAgICAgICAgICAocHVzaCAobWF0Y2gtc3RyaW5nIDApIGhlYWRzKSkpKQorICAgIChucmV2ZXJzZSBoZWFkcykpKQorCisoZGVmdW4gZ2l0LWdldC1jb21taXQtZGVzY3JpcHRpb24gKGNvbW1pdCkKKyAgIkdldCBhIG9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIENPTU1JVC4iCisgIChsZXQgKChjb2Rpbmctc3lzdGVtLWZvci1yZWFkIChnaXQtZ2V0LWxvZ291dHB1dC1jb2Rpbmctc3lzdGVtKSkpCisgICAgKGxldCAoKGRlc2NyIChnaXQtY2FsbC1wcm9jZXNzLWVudi1zdHJpbmcgbmlsICJsb2ciICItLW1heC1jb3VudD0xIiAiLS1wcmV0dHk9b25lbGluZSIgY29tbWl0KSkpCisgICAgICAoaWYgKGFuZCBkZXNjciAoc3RyaW5nLW1hdGNoICJcXGBcXChbMC05YS1mXVxcezQwXFx9XFwpICpcXCguKlxcKSQiIGRlc2NyKSkKKyAgICAgICAgICAoY29uY2F0IChzdWJzdHJpbmcgKG1hdGNoLXN0cmluZyAxIGRlc2NyKSAwIDEwKSAiIC0gIiAobWF0Y2gtc3RyaW5nIDIgZGVzY3IpKQorICAgICAgICBkZXNjcikpKSkKKworOzs7OyBGaWxlIGluZm8gc3RydWN0dXJlCis7Ozs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7IGZpbGVpbmZvIHN0cnVjdHVyZSBzdG9sZW4gZnJvbSBwY2wtY3ZzCisoZGVmc3RydWN0IChnaXQtZmlsZWluZm8KKyAgICAgICAgICAgICg6Y29waWVyIG5pbCkKKyAgICAgICAgICAgICg6Y29uc3RydWN0b3IgZ2l0LWNyZWF0ZS1maWxlaW5mbyAoc3RhdGUgbmFtZSAmb3B0aW9uYWwgb2xkLXBlcm0gbmV3LXBlcm0gcmVuYW1lLXN0YXRlIG9yaWctbmFtZSBtYXJrZWQpKQorICAgICAgICAgICAgKDpjb25jLW5hbWUgZ2l0LWZpbGVpbmZvLT4pKQorICBtYXJrZWQgICAgICAgICAgICAgIDs7IHQvbmlsCisgIHN0YXRlICAgICAgICAgICAgICAgOzsgY3VycmVudCBzdGF0ZQorICBuYW1lICAgICAgICAgICAgICAgIDs7IGZpbGUgbmFtZQorICBvbGQtcGVybSBuZXctcGVybSAgIDs7IHBlcm1pc3Npb24gZmxhZ3MKKyAgcmVuYW1lLXN0YXRlICAgICAgICA7OyByZW5hbWUgb3IgY29weSBzdGF0ZQorICBvcmlnLW5hbWUgICAgICAgICAgIDs7IG9yaWdpbmFsIG5hbWUgZm9yIHJlbmFtZXMgb3IgY29waWVzCisgIG5lZWRzLXJlZnJlc2gpICAgICAgOzsgd2hldGhlciBmaWxlIG5lZWRzIHRvIGJlIHJlZnJlc2hlZAorCisoZGVmdmFyIGdpdC1zdGF0dXMgbmlsKQorCisoZGVmdW4gZ2l0LWNsZWFyLXN0YXR1cyAoc3RhdHVzKQorICAiUmVtb3ZlIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgc3RhdHVzIGxpc3QuIgorICAoZXdvYy1maWx0ZXIgc3RhdHVzIChsYW1iZGEgKGluZm8pIG5pbCkpKQorCisoZGVmdW4gZ2l0LXNldC1maWxlaW5mby1zdGF0ZSAoaW5mbyBzdGF0ZSkKKyAgIlNldCB0aGUgc3RhdGUgb2YgYSBmaWxlIGluZm8uIgorICAodW5sZXNzIChlcSAoZ2l0LWZpbGVpbmZvLT5zdGF0ZSBpbmZvKSBzdGF0ZSkKKyAgICAoc2V0ZiAoZ2l0LWZpbGVpbmZvLT5zdGF0ZSBpbmZvKSBzdGF0ZQorCSAgKGdpdC1maWxlaW5mby0+bmV3LXBlcm0gaW5mbykgKGdpdC1maWxlaW5mby0+b2xkLXBlcm0gaW5mbykKKyAgICAgICAgICAoZ2l0LWZpbGVpbmZvLT5yZW5hbWUtc3RhdGUgaW5mbykgbmlsCisgICAgICAgICAgKGdpdC1maWxlaW5mby0+b3JpZy1uYW1lIGluZm8pIG5pbAorICAgICAgICAgIChnaXQtZmlsZWluZm8tPm5lZWRzLXJlZnJlc2ggaW5mbykgdCkpKQorCisoZGVmdW4gZ2l0LXN0YXR1cy1maWxlbmFtZXMtbWFwIChzdGF0dXMgZnVuYyBmaWxlcyAmcmVzdCBhcmdzKQorICAiQXBwbHkgRlVOQyB0byB0aGUgc3RhdHVzIGZpbGVzIG5hbWVzIGluIHRoZSBGSUxFUyBsaXN0LiIKKyAgKHdoZW4gZmlsZXMKKyAgICAoc2V0cSBmaWxlcyAoc29ydCBmaWxlcyAjJ3N0cmluZy1sZXNzcCkpCisgICAgKGxldCAoKGZpbGUgKHBvcCBmaWxlcykpCisgICAgICAgICAgKG5vZGUgKGV3b2MtbnRoIHN0YXR1cyAwKSkpCisgICAgICAod2hpbGUgKGFuZCBmaWxlIG5vZGUpCisgICAgICAgIChsZXQgKChpbmZvIChld29jLWRhdGEgbm9kZSkpKQorICAgICAgICAgIChpZiAoc3RyaW5nLWxlc3NwIChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbykgZmlsZSkKKyAgICAgICAgICAgICAgKHNldHEgbm9kZSAoZXdvYy1uZXh0IHN0YXR1cyBub2RlKSkKKyAgICAgICAgICAgIChpZiAoc3RyaW5nLWVxdWFsIChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbykgZmlsZSkKKyAgICAgICAgICAgICAgICAoYXBwbHkgZnVuYyBpbmZvIGFyZ3MpKQorICAgICAgICAgICAgKHNldHEgZmlsZSAocG9wIGZpbGVzKSkpKSkpKSkKKworKGRlZnVuIGdpdC1zZXQtZmlsZW5hbWVzLXN0YXRlIChzdGF0dXMgZmlsZXMgc3RhdGUpCisgICJTZXQgdGhlIHN0YXRlIG9mIGEgbGlzdCBvZiBuYW1lZCBmaWxlcy4iCisgICh3aGVuIGZpbGVzCisgICAgKGdpdC1zdGF0dXMtZmlsZW5hbWVzLW1hcCBzdGF0dXMgIydnaXQtc2V0LWZpbGVpbmZvLXN0YXRlIGZpbGVzIHN0YXRlKQorICAgICh1bmxlc3Mgc3RhdGUgIDs7IGRlbGV0ZSBmaWxlcyB3aG9zZSBzdGF0ZSBoYXMgYmVlbiBzZXQgdG8gbmlsCisgICAgICAoZXdvYy1maWx0ZXIgc3RhdHVzIChsYW1iZGEgKGluZm8pIChnaXQtZmlsZWluZm8tPnN0YXRlIGluZm8pKSkpKSkKKworKGRlZnVuIGdpdC1zdGF0ZS1jb2RlIChjb2RlKQorICAiQ29udmVydCBmcm9tIGEgc3RyaW5nIHRvIGEgYWRkZWQvZGVsZXRlZC9tb2RpZmllZCBzdGF0ZS4iCisgIChjYXNlIChzdHJpbmctdG8tY2hhciBjb2RlKQorICAgICg/TSAnbW9kaWZpZWQpCisgICAgKD8/ICd1bmtub3duKQorICAgICg/QSAnYWRkZWQpCisgICAgKD9EICdkZWxldGVkKQorICAgICg/VSAndW5tZXJnZWQpCisgICAgKD9UICdtb2RpZmllZCkKKyAgICAodCBuaWwpKSkKKworKGRlZnVuIGdpdC1zdGF0dXMtY29kZS1hcy1zdHJpbmcgKGNvZGUpCisgICJGb3JtYXQgYSBnaXQgc3RhdHVzIGNvZGUgYXMgc3RyaW5nLiIKKyAgKGNhc2UgY29kZQorICAgICgnbW9kaWZpZWQgKHByb3BlcnRpemUgIk1vZGlmaWVkIiAnZmFjZSAnZ2l0LXN0YXR1cy1mYWNlKSkKKyAgICAoJ3Vua25vd24gIChwcm9wZXJ0aXplICJVbmtub3duICIgJ2ZhY2UgJ2dpdC11bmtub3duLWZhY2UpKQorICAgICgnYWRkZWQgICAgKHByb3BlcnRpemUgIkFkZGVkICAgIiAnZmFjZSAnZ2l0LXN0YXR1cy1mYWNlKSkKKyAgICAoJ2RlbGV0ZWQgIChwcm9wZXJ0aXplICJEZWxldGVkICIgJ2ZhY2UgJ2dpdC1zdGF0dXMtZmFjZSkpCisgICAgKCd1bm1lcmdlZCAocHJvcGVydGl6ZSAiVW5tZXJnZWQiICdmYWNlICdnaXQtdW5tZXJnZWQtZmFjZSkpCisgICAgKCd1cHRvZGF0ZSAocHJvcGVydGl6ZSAiVXB0b2RhdGUiICdmYWNlICdnaXQtdXB0b2RhdGUtZmFjZSkpCisgICAgKCdpZ25vcmVkICAocHJvcGVydGl6ZSAiSWdub3JlZCAiICdmYWNlICdnaXQtaWdub3JlZC1mYWNlKSkKKyAgICAodCAiPyAgICAgICAiKSkpCisKKyhkZWZ1biBnaXQtZmlsZS10eXBlLWFzLXN0cmluZyAob2xkLXBlcm0gbmV3LXBlcm0pCisgICJSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZmlsZSB0eXBlIGJhc2VkIG9uIGl0cyBwZXJtaXNzaW9ucy4iCisgIChsZXQqICgob2xkLXR5cGUgKGxzaCAob3Igb2xkLXBlcm0gMCkgLTkpKQorCSAobmV3LXR5cGUgKGxzaCAob3IgbmV3LXBlcm0gMCkgLTkpKQorCSAoc3RyIChjYXNlIG5ldy10eXBlCisJCSg/XDEwMCAgOzsgZmlsZQorCQkgKGNhc2Ugb2xkLXR5cGUKKwkJICAgKD9cMTAwIG5pbCkKKwkJICAgKD9cMTIwICIgICAodHlwZSBjaGFuZ2Ugc3ltbGluayAtPiBmaWxlKSIpCisJCSAgICg/XDE2MCAiICAgKHR5cGUgY2hhbmdlIHN1YnByb2plY3QgLT4gZmlsZSkiKSkpCisJCSAoP1wxMjAgIDs7IHN5bWxpbmsKKwkJICAoY2FzZSBvbGQtdHlwZQorCQkgICAgKD9cMTAwICIgICAodHlwZSBjaGFuZ2UgZmlsZSAtPiBzeW1saW5rKSIpCisJCSAgICAoP1wxNjAgIiAgICh0eXBlIGNoYW5nZSBzdWJwcm9qZWN0IC0+IHN5bWxpbmspIikKKwkJICAgICh0ICIgICAoc3ltbGluaykiKSkpCisJCSAgKD9cMTYwICA7OyBzdWJwcm9qZWN0CisJCSAgIChjYXNlIG9sZC10eXBlCisJCSAgICAgKD9cMTAwICIgICAodHlwZSBjaGFuZ2UgZmlsZSAtPiBzdWJwcm9qZWN0KSIpCisJCSAgICAgKD9cMTIwICIgICAodHlwZSBjaGFuZ2Ugc3ltbGluayAtPiBzdWJwcm9qZWN0KSIpCisJCSAgICAgKHQgIiAgIChzdWJwcm9qZWN0KSIpKSkKKyAgICAgICAgICAgICAgICAgICg/XDExMCBuaWwpICA7OyBkaXJlY3RvcnkgKGludGVybmFsLCBub3QgYSByZWFsIGdpdCBzdGF0ZSkKKwkJICAoP1wwMDAgIDs7IGRlbGV0ZWQgb3IgdW5rbm93bgorCQkgICAoY2FzZSBvbGQtdHlwZQorCQkgICAgICg/XDEyMCAiICAgKHN5bWxpbmspIikKKwkJICAgICAoP1wxNjAgIiAgIChzdWJwcm9qZWN0KSIpKSkKKwkJICAodCAoZm9ybWF0ICIgICAodW5rbm93biB0eXBlICVvKSIgbmV3LXR5cGUpKSkpKQorICAgIChjb25kIChzdHIgKHByb3BlcnRpemUgc3RyICdmYWNlICdnaXQtc3RhdHVzLWZhY2UpKQorICAgICAgICAgICgoZXEgbmV3LXR5cGUgP1wxMTApICIvIikKKyAgICAgICAgICAodCAiIikpKSkKKworKGRlZnVuIGdpdC1yZW5hbWUtYXMtc3RyaW5nIChpbmZvKQorICAiUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNvcHkgb3IgcmVuYW1lIGFzc29jaWF0ZWQgd2l0aCBJTkZPLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgbm9uZS4iCisgIChsZXQgKChzdGF0ZSAoZ2l0LWZpbGVpbmZvLT5yZW5hbWUtc3RhdGUgaW5mbykpKQorICAgIChpZiBzdGF0ZQorICAgICAgICAocHJvcGVydGl6ZQorICAgICAgICAgKGNvbmNhdCAiICAgKCIKKyAgICAgICAgICAgICAgICAgKGlmIChlcSBzdGF0ZSAnY29weSkgImNvcGllZCBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAoaWYgKGVxIChnaXQtZmlsZWluZm8tPnN0YXRlIGluZm8pICdhZGRlZCkgInJlbmFtZWQgZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICAicmVuYW1lZCB0byAiKSkKKyAgICAgICAgICAgICAgICAgKGdpdC1lc2NhcGUtZmlsZS1uYW1lIChnaXQtZmlsZWluZm8tPm9yaWctbmFtZSBpbmZvKSkKKyAgICAgICAgICAgICAgICAgIikiKSAnZmFjZSAnZ2l0LXN0YXR1cy1mYWNlKQorICAgICAgIiIpKSkKKworKGRlZnVuIGdpdC1wZXJtaXNzaW9ucy1hcy1zdHJpbmcgKG9sZC1wZXJtIG5ldy1wZXJtKQorICAiRm9ybWF0IGEgcGVybWlzc2lvbiBjaGFuZ2UgYXMgc3RyaW5nLiIKKyAgKHByb3BlcnRpemUKKyAgIChpZiAob3IgKG5vdCBvbGQtcGVybSkKKyAgICAgICAgICAgKG5vdCBuZXctcGVybSkKKyAgICAgICAgICAgKGVxIDAgKGxvZ2FuZCA/XDExMSAobG9neG9yIG9sZC1wZXJtIG5ldy1wZXJtKSkpKQorICAgICAgICIgICIKKyAgICAgKGlmIChlcSAwIChsb2dhbmQgP1wxMTEgb2xkLXBlcm0pKSAiK3giICIteCIpKQorICAnZmFjZSAnZ2l0LXBlcm1pc3Npb24tZmFjZSkpCisKKyhkZWZ1biBnaXQtZmlsZWluZm8tcHJldHR5cHJpbnQgKGluZm8pCisgICJQcmV0dHktcHJpbnRlciBmb3IgdGhlIGdpdC1maWxlaW5mbyBzdHJ1Y3R1cmUuIgorICAobGV0ICgob2xkLXBlcm0gKGdpdC1maWxlaW5mby0+b2xkLXBlcm0gaW5mbykpCisJKG5ldy1wZXJtIChnaXQtZmlsZWluZm8tPm5ldy1wZXJtIGluZm8pKSkKKyAgICAoaW5zZXJ0IChjb25jYXQgIiAgICIgKGlmIChnaXQtZmlsZWluZm8tPm1hcmtlZCBpbmZvKSAocHJvcGVydGl6ZSAiKiIgJ2ZhY2UgJ2dpdC1tYXJrLWZhY2UpICIgIikKKwkJICAgICIgIiAoZ2l0LXN0YXR1cy1jb2RlLWFzLXN0cmluZyAoZ2l0LWZpbGVpbmZvLT5zdGF0ZSBpbmZvKSkKKwkJICAgICIgIiAoZ2l0LXBlcm1pc3Npb25zLWFzLXN0cmluZyBvbGQtcGVybSBuZXctcGVybSkKKwkJICAgICIgICIgKGdpdC1lc2NhcGUtZmlsZS1uYW1lIChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbykpCisJCSAgICAoZ2l0LWZpbGUtdHlwZS1hcy1zdHJpbmcgb2xkLXBlcm0gbmV3LXBlcm0pCisJCSAgICAoZ2l0LXJlbmFtZS1hcy1zdHJpbmcgaW5mbykpKSkpCisKKyhkZWZ1biBnaXQtaW5zZXJ0LWluZm8tbGlzdCAoc3RhdHVzIGluZm9saXN0KQorICAiSW5zZXJ0IGEgbGlzdCBvZiBmaWxlIGluZm9zIGluIHRoZSBzdGF0dXMgYnVmZmVyLCByZXBsYWNpbmcgZXhpc3Rpbmcgb25lcyBpZiBhbnkuIgorICAoc2V0cSBpbmZvbGlzdCAoc29ydCBpbmZvbGlzdAorICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChpbmZvMSBpbmZvMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLWxlc3NwIChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbzEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2l0LWZpbGVpbmZvLT5uYW1lIGluZm8yKSkpKSkKKyAgKGxldCAoKGluZm8gKHBvcCBpbmZvbGlzdCkpCisgICAgICAgIChub2RlIChld29jLW50aCBzdGF0dXMgMCkpKQorICAgICh3aGlsZSBpbmZvCisgICAgICAoY29uZCAoKG5vdCBub2RlKQorCSAgICAgKHNldHEgbm9kZSAoZXdvYy1lbnRlci1sYXN0IHN0YXR1cyBpbmZvKSkKKyAgICAgICAgICAgICAoc2V0cSBpbmZvIChwb3AgaW5mb2xpc3QpKSkKKyAgICAgICAgICAgICgoc3RyaW5nLWxlc3NwIChnaXQtZmlsZWluZm8tPm5hbWUgKGV3b2MtZGF0YSBub2RlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbykpCisgICAgICAgICAgICAgKHNldHEgbm9kZSAoZXdvYy1uZXh0IHN0YXR1cyBub2RlKSkpCisgICAgICAgICAgICAoKHN0cmluZy1lcXVhbCAoZ2l0LWZpbGVpbmZvLT5uYW1lIChld29jLWRhdGEgbm9kZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2l0LWZpbGVpbmZvLT5uYW1lIGluZm8pKQorICAgICAgICAgICAgICA7OyBwcmVzZXJ2ZSB0aGUgbWFya2VkIGZsYWcKKyAgICAgICAgICAgICAgKHNldGYgKGdpdC1maWxlaW5mby0+bWFya2VkIGluZm8pIChnaXQtZmlsZWluZm8tPm1hcmtlZCAoZXdvYy1kYXRhIG5vZGUpKSkKKwkgICAgICAoc2V0ZiAoZ2l0LWZpbGVpbmZvLT5uZWVkcy1yZWZyZXNoIGluZm8pIHQpCisgICAgICAgICAgICAgIChzZXRmIChld29jLWRhdGEgbm9kZSkgaW5mbykKKyAgICAgICAgICAgICAgKHNldHEgaW5mbyAocG9wIGluZm9saXN0KSkpCisgICAgICAgICAgICAodAorCSAgICAgKHNldHEgbm9kZSAoZXdvYy1lbnRlci1iZWZvcmUgc3RhdHVzIG5vZGUgaW5mbykpCisgICAgICAgICAgICAgKHNldHEgaW5mbyAocG9wIGluZm9saXN0KSkpKSkpKQorCisoZGVmdW4gZ2l0LXJ1bi1kaWZmLWluZGV4IChzdGF0dXMgZmlsZXMpCisgICJSdW4gZ2l0LWRpZmYtaW5kZXggb24gRklMRVMgYW5kIHBhcnNlIHRoZSByZXN1bHRzIGludG8gU1RBVFVTLgorUmV0dXJuIHRoZSBsaXN0IG9mIGZpbGVzIHRoYXQgaGF2ZW4ndCBiZWVuIGhhbmRsZWQuIgorICAobGV0ICgocmVtYWluaW5nIChjb3B5LXNlcXVlbmNlIGZpbGVzKSkKKwlpbmZvbGlzdCkKKyAgICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgICAgKGFwcGx5ICMnZ2l0LWNhbGwtcHJvY2Vzcy1lbnYgdCBuaWwgImRpZmYtaW5kZXgiICIteiIgIi1NIiAiSEVBRCIgIi0tIiBmaWxlcykKKyAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAod2hpbGUgKHJlLXNlYXJjaC1mb3J3YXJkCisJICAgICAgIjpcXChbMC03XVxcezZcXH1cXCkgXFwoWzAtN11cXHs2XFx9XFwpIFswLTlhLWZdXFx7NDBcXH0gWzAtOWEtZl1cXHs0MFxcfSBcXChcXChbQURNVVRdXFwpXDBcXChbXlwwXStcXClcXHxcXChbQ1JdXFwpWzAtOV0qXDBcXChbXlwwXStcXClcMFxcKFteXDBdK1xcKVxcKVwwIgorICAgICAgICAgICAgICBuaWwgdCAxKQorICAgICAgICAobGV0ICgob2xkLXBlcm0gKHN0cmluZy10by1udW1iZXIgKG1hdGNoLXN0cmluZyAxKSA4KSkKKyAgICAgICAgICAgICAgKG5ldy1wZXJtIChzdHJpbmctdG8tbnVtYmVyIChtYXRjaC1zdHJpbmcgMikgOCkpCisgICAgICAgICAgICAgIChzdGF0ZSAob3IgKG1hdGNoLXN0cmluZyA0KSAobWF0Y2gtc3RyaW5nIDYpKSkKKyAgICAgICAgICAgICAgKG5hbWUgKG9yIChtYXRjaC1zdHJpbmcgNSkgKG1hdGNoLXN0cmluZyA3KSkpCisgICAgICAgICAgICAgIChuZXctbmFtZSAobWF0Y2gtc3RyaW5nIDgpKSkKKyAgICAgICAgICAoaWYgbmV3LW5hbWUgIDsgY29weSBvciByZW5hbWUKKyAgICAgICAgICAgICAgKGlmIChlcSA/QyAoc3RyaW5nLXRvLWNoYXIgc3RhdGUpKQorICAgICAgICAgICAgICAgICAgKHB1c2ggKGdpdC1jcmVhdGUtZmlsZWluZm8gJ2FkZGVkIG5ldy1uYW1lIG9sZC1wZXJtIG5ldy1wZXJtICdjb3B5IG5hbWUpIGluZm9saXN0KQorICAgICAgICAgICAgICAgIChwdXNoIChnaXQtY3JlYXRlLWZpbGVpbmZvICdkZWxldGVkIG5hbWUgMCAwICdyZW5hbWUgbmV3LW5hbWUpIGluZm9saXN0KQorICAgICAgICAgICAgICAgIChwdXNoIChnaXQtY3JlYXRlLWZpbGVpbmZvICdhZGRlZCBuZXctbmFtZSBvbGQtcGVybSBuZXctcGVybSAncmVuYW1lIG5hbWUpIGluZm9saXN0KSkKKyAgICAgICAgICAgIChwdXNoIChnaXQtY3JlYXRlLWZpbGVpbmZvIChnaXQtc3RhdGUtY29kZSBzdGF0ZSkgbmFtZSBvbGQtcGVybSBuZXctcGVybSkgaW5mb2xpc3QpKQorCSAgKHNldHEgcmVtYWluaW5nIChkZWxldGUgbmFtZSByZW1haW5pbmcpKQorCSAgKHdoZW4gbmV3LW5hbWUgKHNldHEgcmVtYWluaW5nIChkZWxldGUgbmV3LW5hbWUgcmVtYWluaW5nKSkpKSkpCisgICAgKGdpdC1pbnNlcnQtaW5mby1saXN0IHN0YXR1cyBpbmZvbGlzdCkKKyAgICByZW1haW5pbmcpKQorCisoZGVmdW4gZ2l0LWZpbmQtc3RhdHVzLWZpbGUgKHN0YXR1cyBmaWxlKQorICAiRmluZCBhIGdpdmVuIGZpbGUgaW4gdGhlIHN0YXR1cyBld29jIGFuZCByZXR1cm4gaXRzIG5vZGUuIgorICAobGV0ICgobm9kZSAoZXdvYy1udGggc3RhdHVzIDApKSkKKyAgICAod2hpbGUgKGFuZCBub2RlIChub3QgKHN0cmluZz0gZmlsZSAoZ2l0LWZpbGVpbmZvLT5uYW1lIChld29jLWRhdGEgbm9kZSkpKSkpCisgICAgICAoc2V0cSBub2RlIChld29jLW5leHQgc3RhdHVzIG5vZGUpKSkKKyAgICBub2RlKSkKKworKGRlZnVuIGdpdC1ydW4tbHMtZmlsZXMgKHN0YXR1cyBmaWxlcyBkZWZhdWx0LXN0YXRlICZyZXN0IG9wdGlvbnMpCisgICJSdW4gZ2l0LWxzLWZpbGVzIG9uIEZJTEVTIGFuZCBwYXJzZSB0aGUgcmVzdWx0cyBpbnRvIFNUQVRVUy4KK1JldHVybiB0aGUgbGlzdCBvZiBmaWxlcyB0aGF0IGhhdmVuJ3QgYmVlbiBoYW5kbGVkLiIKKyAgKGxldCAoaW5mb2xpc3QpCisgICAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAgIChhcHBseSAjJ2dpdC1jYWxsLXByb2Nlc3MtZW52IHQgbmlsICJscy1maWxlcyIgIi16IiAoYXBwZW5kIG9wdGlvbnMgKGxpc3QgIi0tIikgZmlsZXMpKQorICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAgICAgICh3aGlsZSAocmUtc2VhcmNoLWZvcndhcmQgIlxcKFteXDBdKj9cXClcXCgvP1xcKVwwIiBuaWwgdCAxKQorICAgICAgICAobGV0ICgobmFtZSAobWF0Y2gtc3RyaW5nIDEpKSkKKyAgICAgICAgICAocHVzaCAoZ2l0LWNyZWF0ZS1maWxlaW5mbyBkZWZhdWx0LXN0YXRlIG5hbWUgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAoc3RyaW5nLWVxdWFsICIvIiAobWF0Y2gtc3RyaW5nIDIpKSAobHNoID9cMTEwIDkpIDApKQorICAgICAgICAgICAgICAgIGluZm9saXN0KQorICAgICAgICAgIChzZXRxIGZpbGVzIChkZWxldGUgbmFtZSBmaWxlcykpKSkpCisgICAgKGdpdC1pbnNlcnQtaW5mby1saXN0IHN0YXR1cyBpbmZvbGlzdCkKKyAgICBmaWxlcykpCisKKyhkZWZ1biBnaXQtcnVuLWxzLWZpbGVzLWNhY2hlZCAoc3RhdHVzIGZpbGVzIGRlZmF1bHQtc3RhdGUpCisgICJSdW4gZ2l0LWxzLWZpbGVzIC1jIG9uIEZJTEVTIGFuZCBwYXJzZSB0aGUgcmVzdWx0cyBpbnRvIFNUQVRVUy4KK1JldHVybiB0aGUgbGlzdCBvZiBmaWxlcyB0aGF0IGhhdmVuJ3QgYmVlbiBoYW5kbGVkLiIKKyAgKGxldCAoKHJlbWFpbmluZyAoY29weS1zZXF1ZW5jZSBmaWxlcykpCisJaW5mb2xpc3QpCisgICAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAgIChhcHBseSAjJ2dpdC1jYWxsLXByb2Nlc3MtZW52IHQgbmlsICJscy1maWxlcyIgIi16IiAiLXMiICItYyIgIi0tIiBmaWxlcykKKyAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAod2hpbGUgKHJlLXNlYXJjaC1mb3J3YXJkICJcXChbMC03XVxcezZcXH1cXCkgWzAtOWEtZl1cXHs0MFxcfSAwXHRcXChbXlwwXStcXClcMCIgbmlsIHQpCisJKGxldCogKChuZXctcGVybSAoc3RyaW5nLXRvLW51bWJlciAobWF0Y2gtc3RyaW5nIDEpIDgpKQorCSAgICAgICAob2xkLXBlcm0gKGlmIChlcSBkZWZhdWx0LXN0YXRlICdhZGRlZCkgMCBuZXctcGVybSkpCisJICAgICAgIChuYW1lIChtYXRjaC1zdHJpbmcgMikpKQorCSAgKHB1c2ggKGdpdC1jcmVhdGUtZmlsZWluZm8gZGVmYXVsdC1zdGF0ZSBuYW1lIG9sZC1wZXJtIG5ldy1wZXJtKSBpbmZvbGlzdCkKKwkgIChzZXRxIHJlbWFpbmluZyAoZGVsZXRlIG5hbWUgcmVtYWluaW5nKSkpKSkKKyAgICAoZ2l0LWluc2VydC1pbmZvLWxpc3Qgc3RhdHVzIGluZm9saXN0KQorICAgIHJlbWFpbmluZykpCisKKyhkZWZ1biBnaXQtcnVuLWxzLXVubWVyZ2VkIChzdGF0dXMgZmlsZXMpCisgICJSdW4gZ2l0LWxzLWZpbGVzIC11IG9uIEZJTEVTIGFuZCBwYXJzZSB0aGUgcmVzdWx0cyBpbnRvIFNUQVRVUy4iCisgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgKGFwcGx5ICMnZ2l0LWNhbGwtcHJvY2Vzcy1lbnYgdCBuaWwgImxzLWZpbGVzIiAiLXoiICItdSIgIi0tIiBmaWxlcykKKyAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgIChsZXQgKHVubWVyZ2VkLWZpbGVzKQorICAgICAgKHdoaWxlIChyZS1zZWFyY2gtZm9yd2FyZCAiWzAtN11cXHs2XFx9IFswLTlhLWZdXFx7NDBcXH0gWzEyM11cdFxcKFteXDBdK1xcKVwwIiBuaWwgdCkKKyAgICAgICAgKHB1c2ggKG1hdGNoLXN0cmluZyAxKSB1bm1lcmdlZC1maWxlcykpCisgICAgICAoZ2l0LXNldC1maWxlbmFtZXMtc3RhdGUgc3RhdHVzIHVubWVyZ2VkLWZpbGVzICd1bm1lcmdlZCkpKSkKKworKGRlZnVuIGdpdC1nZXQtZXhjbHVkZS1maWxlcyAoKQorICAiR2V0IHRoZSBsaXN0IG9mIGV4Y2x1ZGUgZmlsZXMgdG8gcGFzcyB0byBnaXQtbHMtZmlsZXMuIgorICAobGV0IChmaWxlcworICAgICAgICAoY29uZmlnIChnaXQtY29uZmlnICJjb3JlLmV4Y2x1ZGVzZmlsZSIpKSkKKyAgICAod2hlbiAoZmlsZS1yZWFkYWJsZS1wICIuZ2l0L2luZm8vZXhjbHVkZSIpCisgICAgICAocHVzaCAiLmdpdC9pbmZvL2V4Y2x1ZGUiIGZpbGVzKSkKKyAgICAod2hlbiAoYW5kIGNvbmZpZyAoZmlsZS1yZWFkYWJsZS1wIGNvbmZpZykpCisgICAgICAocHVzaCBjb25maWcgZmlsZXMpKQorICAgIGZpbGVzKSkKKworKGRlZnVuIGdpdC1ydW4tbHMtZmlsZXMtd2l0aC1leGNsdWRlcyAoc3RhdHVzIGZpbGVzIGRlZmF1bHQtc3RhdGUgJnJlc3Qgb3B0aW9ucykKKyAgIlJ1biBnaXQtbHMtZmlsZXMgb24gRklMRVMgd2l0aCBhcHByb3ByaWF0ZSAtLWV4Y2x1ZGUtZnJvbSBvcHRpb25zLiIKKyAgKGxldCAoKGV4Y2x1ZGUtZmlsZXMgKGdpdC1nZXQtZXhjbHVkZS1maWxlcykpKQorICAgIChhcHBseSAjJ2dpdC1ydW4tbHMtZmlsZXMgc3RhdHVzIGZpbGVzIGRlZmF1bHQtc3RhdGUgIi0tZGlyZWN0b3J5IiAiLS1uby1lbXB0eS1kaXJlY3RvcnkiCisgICAgICAgICAgIChjb25jYXQgIi0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PSIgZ2l0LXBlci1kaXItaWdub3JlLWZpbGUpCisgICAgICAgICAgIChhcHBlbmQgb3B0aW9ucyAobWFwY2FyIChsYW1iZGEgKGYpIChjb25jYXQgIi0tZXhjbHVkZS1mcm9tPSIgZikpIGV4Y2x1ZGUtZmlsZXMpKSkpKQorCisoZGVmdW4gZ2l0LXVwZGF0ZS1zdGF0dXMtZmlsZXMgKGZpbGVzICZvcHRpb25hbCBkZWZhdWx0LXN0YXRlKQorICAiVXBkYXRlIHRoZSBzdGF0dXMgb2YgRklMRVMgZnJvbSB0aGUgaW5kZXguIgorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgICh3aGVuIChvciBnaXQtc2hvdy11cHRvZGF0ZSBmaWxlcykKKyAgICAoZ2l0LXJ1bi1scy1maWxlcy1jYWNoZWQgZ2l0LXN0YXR1cyBmaWxlcyAndXB0b2RhdGUpKQorICAobGV0KiAoKHJlbWFpbmluZy1maWxlcworICAgICAgICAgIChpZiAoZ2l0LWVtcHR5LWRiLXApIDsgd2UgbmVlZCBzb21lIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGFuIGVtcHR5IGRiCisJICAgICAgKGdpdC1ydW4tbHMtZmlsZXMtY2FjaGVkIGdpdC1zdGF0dXMgZmlsZXMgJ2FkZGVkKQorICAgICAgICAgICAgKGdpdC1ydW4tZGlmZi1pbmRleCBnaXQtc3RhdHVzIGZpbGVzKSkpKQorICAgIChnaXQtcnVuLWxzLXVubWVyZ2VkIGdpdC1zdGF0dXMgZmlsZXMpCisgICAgKHdoZW4gKG9yIHJlbWFpbmluZy1maWxlcyAoYW5kIGdpdC1zaG93LXVua25vd24gKG5vdCBmaWxlcykpKQorICAgICAgKHNldHEgcmVtYWluaW5nLWZpbGVzIChnaXQtcnVuLWxzLWZpbGVzLXdpdGgtZXhjbHVkZXMgZ2l0LXN0YXR1cyByZW1haW5pbmctZmlsZXMgJ3Vua25vd24gIi1vIikpKQorICAgICh3aGVuIChvciByZW1haW5pbmctZmlsZXMgKGFuZCBnaXQtc2hvdy1pZ25vcmVkIChub3QgZmlsZXMpKSkKKyAgICAgIChzZXRxIHJlbWFpbmluZy1maWxlcyAoZ2l0LXJ1bi1scy1maWxlcy13aXRoLWV4Y2x1ZGVzIGdpdC1zdGF0dXMgcmVtYWluaW5nLWZpbGVzICdpZ25vcmVkICItbyIgIi1pIikpKQorICAgIChnaXQtc2V0LWZpbGVuYW1lcy1zdGF0ZSBnaXQtc3RhdHVzIHJlbWFpbmluZy1maWxlcyBkZWZhdWx0LXN0YXRlKQorICAgIChnaXQtcmVmcmVzaC1maWxlcykKKyAgICAoZ2l0LXJlZnJlc2gtZXdvYy1oZiBnaXQtc3RhdHVzKSkpCisKKyhkZWZ1biBnaXQtbWFyay1maWxlcyAoc3RhdHVzIGZpbGVzKQorICAiTWFyayBhbGwgdGhlIHNwZWNpZmllZCBGSUxFUywgYW5kIHVubWFyayB0aGUgb3RoZXJzLiIKKyAgKHNldHEgZmlsZXMgKHNvcnQgZmlsZXMgIydzdHJpbmctbGVzc3ApKQorICAobGV0ICgoZmlsZSAoYW5kIGZpbGVzIChwb3AgZmlsZXMpKSkKKyAgICAgICAgKG5vZGUgKGV3b2MtbnRoIHN0YXR1cyAwKSkpCisgICAgKHdoaWxlIG5vZGUKKyAgICAgIChsZXQgKChpbmZvIChld29jLWRhdGEgbm9kZSkpKQorICAgICAgICAoaWYgKGFuZCBmaWxlIChzdHJpbmctZXF1YWwgKGdpdC1maWxlaW5mby0+bmFtZSBpbmZvKSBmaWxlKSkKKyAgICAgICAgICAgIChwcm9nbgorICAgICAgICAgICAgICAodW5sZXNzIChnaXQtZmlsZWluZm8tPm1hcmtlZCBpbmZvKQorICAgICAgICAgICAgICAgIChzZXRmIChnaXQtZmlsZWluZm8tPm1hcmtlZCBpbmZvKSB0KQorICAgICAgICAgICAgICAgIChzZXRmIChnaXQtZmlsZWluZm8tPm5lZWRzLXJlZnJlc2ggaW5mbykgdCkpCisgICAgICAgICAgICAgIChzZXRxIGZpbGUgKHBvcCBmaWxlcykpCisgICAgICAgICAgICAgIChzZXRxIG5vZGUgKGV3b2MtbmV4dCBzdGF0dXMgbm9kZSkpKQorICAgICAgICAgICh3aGVuIChnaXQtZmlsZWluZm8tPm1hcmtlZCBpbmZvKQorICAgICAgICAgICAgKHNldGYgKGdpdC1maWxlaW5mby0+bWFya2VkIGluZm8pIG5pbCkKKyAgICAgICAgICAgIChzZXRmIChnaXQtZmlsZWluZm8tPm5lZWRzLXJlZnJlc2ggaW5mbykgdCkpCisgICAgICAgICAgKGlmIChhbmQgZmlsZSAoc3RyaW5nLWxlc3NwIGZpbGUgKGdpdC1maWxlaW5mby0+bmFtZSBpbmZvKSkpCisgICAgICAgICAgICAgIChzZXRxIGZpbGUgKHBvcCBmaWxlcykpCisgICAgICAgICAgICAoc2V0cSBub2RlIChld29jLW5leHQgc3RhdHVzIG5vZGUpKSkpKSkpKQorCisoZGVmdW4gZ2l0LW1hcmtlZC1maWxlcyAoKQorICAiUmV0dXJuIGEgbGlzdCBvZiBhbGwgbWFya2VkIGZpbGVzLCBvciBpZiBub25lIGEgbGlzdCBjb250YWluaW5nIGp1c3QgdGhlIGZpbGUgYXQgY3Vyc29yIHBvc2l0aW9uLiIKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAob3IgKGV3b2MtY29sbGVjdCBnaXQtc3RhdHVzIChsYW1iZGEgKGluZm8pIChnaXQtZmlsZWluZm8tPm1hcmtlZCBpbmZvKSkpCisgICAgICAobGlzdCAoZXdvYy1kYXRhIChld29jLWxvY2F0ZSBnaXQtc3RhdHVzKSkpKSkKKworKGRlZnVuIGdpdC1tYXJrZWQtZmlsZXMtc3RhdGUgKCZyZXN0IHN0YXRlcykKKyAgIlJldHVybiBtYXJrZWQgZmlsZXMgdGhhdCBhcmUgaW4gdGhlIHNwZWNpZmllZCBzdGF0ZXMuIgorICAobGV0ICgoZmlsZXMgKGdpdC1tYXJrZWQtZmlsZXMpKQorICAgICAgICByZXN1bHQpCisgICAgKGRvbGlzdCAoaW5mbyBmaWxlcykKKyAgICAgICh3aGVuIChtZW1xIChnaXQtZmlsZWluZm8tPnN0YXRlIGluZm8pIHN0YXRlcykKKyAgICAgICAgKHB1c2ggaW5mbyByZXN1bHQpKSkKKyAgICByZXN1bHQpKQorCisoZGVmdW4gZ2l0LXJlZnJlc2gtZmlsZXMgKCkKKyAgIlJlZnJlc2ggYWxsIGZpbGVzIHRoYXQgbmVlZCBpdCBhbmQgY2xlYXIgdGhlIG5lZWRzLXJlZnJlc2ggZmxhZy4iCisgICh1bmxlc3MgZ2l0LXN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgKGV3b2MtbWFwCisgICAobGFtYmRhIChpbmZvKQorICAgICAobGV0ICgocmVmcmVzaCAoZ2l0LWZpbGVpbmZvLT5uZWVkcy1yZWZyZXNoIGluZm8pKSkKKyAgICAgICAoc2V0ZiAoZ2l0LWZpbGVpbmZvLT5uZWVkcy1yZWZyZXNoIGluZm8pIG5pbCkKKyAgICAgICByZWZyZXNoKSkKKyAgIGdpdC1zdGF0dXMpCisgIDsgbW92ZSBiYWNrIHRvIGdvYWwgY29sdW1uCisgICh3aGVuIGdvYWwtY29sdW1uIChtb3ZlLXRvLWNvbHVtbiBnb2FsLWNvbHVtbikpKQorCisoZGVmdW4gZ2l0LXJlZnJlc2gtZXdvYy1oZiAoc3RhdHVzKQorICAiUmVmcmVzaCB0aGUgZXdvYyBoZWFkZXIgYW5kIGZvb3Rlci4iCisgIChsZXQgKChicmFuY2ggKGdpdC1zeW1ib2xpYy1yZWYgIkhFQUQiKSkKKyAgICAgICAgKGhlYWQgKGlmIChnaXQtZW1wdHktZGItcCkgIk5vdGhpbmcgY29tbWl0dGVkIHlldCIKKyAgICAgICAgICAgICAgICAoZ2l0LWdldC1jb21taXQtZGVzY3JpcHRpb24gIkhFQUQiKSkpCisgICAgICAgIChtZXJnZS1oZWFkcyAoZ2l0LWdldC1tZXJnZS1oZWFkcykpKQorICAgIChld29jLXNldC1oZiBzdGF0dXMKKyAgICAgICAgICAgICAgICAgKGZvcm1hdCAiRGlyZWN0b3J5OiAgJXNcbkJyYW5jaDogICAgICVzXG5IZWFkOiAgICAgICAlcyVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdC1kaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgYnJhbmNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAoc3RyaW5nLW1hdGNoICJecmVmcy9oZWFkcy8iIGJyYW5jaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdWJzdHJpbmcgYnJhbmNoIChtYXRjaC1lbmQgMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmNoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbmUgKGRldGFjaGVkIEhFQUQpIikKKyAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIG1lcmdlLWhlYWRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25jYXQgIlxuTWVyZ2luZzogICAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXBjb25jYXQgKGxhbWJkYSAoc3RyKSAoZ2l0LWdldC1jb21taXQtZGVzY3JpcHRpb24gc3RyKSkgbWVyZ2UtaGVhZHMgIlxuICAgICAgICAgICAgIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIikpCisgICAgICAgICAgICAgICAgIChpZiAoZXdvYy1udGggc3RhdHVzIDApICIiICIgICAgTm8gY2hhbmdlcy4iKSkpKQorCisoZGVmdW4gZ2l0LWdldC1maWxlbmFtZXMgKGZpbGVzKQorICAobWFwY2FyIChsYW1iZGEgKGluZm8pIChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbykpIGZpbGVzKSkKKworKGRlZnVuIGdpdC11cGRhdGUtaW5kZXggKGluZGV4LWZpbGUgZmlsZXMpCisgICJSdW4gZ2l0LXVwZGF0ZS1pbmRleCBvbiBhIGxpc3Qgb2YgZmlsZXMuIgorICAobGV0ICgoZW52IChhbmQgaW5kZXgtZmlsZSBgKCgiR0lUX0lOREVYX0ZJTEUiIC4gLGluZGV4LWZpbGUpKSkpCisgICAgICAgIGFkZGVkIGRlbGV0ZWQgbW9kaWZpZWQpCisgICAgKGRvbGlzdCAoaW5mbyBmaWxlcykKKyAgICAgIChjYXNlIChnaXQtZmlsZWluZm8tPnN0YXRlIGluZm8pCisgICAgICAgICgnYWRkZWQgKHB1c2ggaW5mbyBhZGRlZCkpCisgICAgICAgICgnZGVsZXRlZCAocHVzaCBpbmZvIGRlbGV0ZWQpKQorICAgICAgICAoJ21vZGlmaWVkIChwdXNoIGluZm8gbW9kaWZpZWQpKSkpCisgICAgKHdoZW4gYWRkZWQKKyAgICAgIChhcHBseSAjJ2dpdC1jYWxsLXByb2Nlc3MtZW52IG5pbCBlbnYgInVwZGF0ZS1pbmRleCIgIi0tYWRkIiAiLS0iIChnaXQtZ2V0LWZpbGVuYW1lcyBhZGRlZCkpKQorICAgICh3aGVuIGRlbGV0ZWQKKyAgICAgIChhcHBseSAjJ2dpdC1jYWxsLXByb2Nlc3MtZW52IG5pbCBlbnYgInVwZGF0ZS1pbmRleCIgIi0tcmVtb3ZlIiAiLS0iIChnaXQtZ2V0LWZpbGVuYW1lcyBkZWxldGVkKSkpCisgICAgKHdoZW4gbW9kaWZpZWQKKyAgICAgIChhcHBseSAjJ2dpdC1jYWxsLXByb2Nlc3MtZW52IG5pbCBlbnYgInVwZGF0ZS1pbmRleCIgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgbW9kaWZpZWQpKSkpKQorCisoZGVmdW4gZ2l0LXJ1bi1wcmUtY29tbWl0LWhvb2sgKCkKKyAgIlJ1biB0aGUgcHJlLWNvbW1pdCBob29rIGlmIGFueS4iCisgICh1bmxlc3MgZ2l0LXN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgKGxldCAoKGZpbGVzIChnaXQtbWFya2VkLWZpbGVzLXN0YXRlICdhZGRlZCAnZGVsZXRlZCAnbW9kaWZpZWQpKSkKKyAgICAob3IgKG5vdCBmaWxlcykKKyAgICAgICAgKG5vdCAoZmlsZS1leGVjdXRhYmxlLXAgIi5naXQvaG9va3MvcHJlLWNvbW1pdCIpKQorICAgICAgICAobGV0ICgoaW5kZXgtZmlsZSAobWFrZS10ZW1wLWZpbGUgImdpdGlkeCIpKSkKKyAgICAgICAgICAodW53aW5kLXByb3RlY3QKKyAgICAgICAgICAgIChsZXQgKChoZWFkLXRyZWUgKHVubGVzcyAoZ2l0LWVtcHR5LWRiLXApIChnaXQtcmV2LXBhcnNlICJIRUFEXnt0cmVlfSIpKSkpCisgICAgICAgICAgICAgIChnaXQtcmVhZC10cmVlIGhlYWQtdHJlZSBpbmRleC1maWxlKQorICAgICAgICAgICAgICAoZ2l0LXVwZGF0ZS1pbmRleCBpbmRleC1maWxlIGZpbGVzKQorICAgICAgICAgICAgICAoZ2l0LXJ1bi1ob29rICJwcmUtY29tbWl0IiBgKCgiR0lUX0lOREVYX0ZJTEUiIC4gLGluZGV4LWZpbGUpKSkpCisgICAgICAgICAgKGRlbGV0ZS1maWxlIGluZGV4LWZpbGUpKSkpKSkKKworKGRlZnVuIGdpdC1kby1jb21taXQgKCkKKyAgIlBlcmZvcm0gdGhlIGFjdHVhbCBjb21taXQgdXNpbmcgdGhlIGN1cnJlbnQgYnVmZmVyIGFzIGxvZyBtZXNzYWdlLiIKKyAgKGludGVyYWN0aXZlKQorICAobGV0ICgoYnVmZmVyIChjdXJyZW50LWJ1ZmZlcikpCisgICAgICAgIChpbmRleC1maWxlIChtYWtlLXRlbXAtZmlsZSAiZ2l0aWR4IikpKQorICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGxvZy1lZGl0LXBhcmVudC1idWZmZXIKKyAgICAgIChpZiAoZ2l0LW1hcmtlZC1maWxlcy1zdGF0ZSAndW5tZXJnZWQpCisgICAgICAgICAgKG1lc3NhZ2UgIllvdSBjYW5ub3QgY29tbWl0IHVubWVyZ2VkIGZpbGVzLCByZXNvbHZlIHRoZW0gZmlyc3QuIikKKyAgICAgICAgKHVud2luZC1wcm90ZWN0CisgICAgICAgICAgICAobGV0ICgoZmlsZXMgKGdpdC1tYXJrZWQtZmlsZXMtc3RhdGUgJ2FkZGVkICdkZWxldGVkICdtb2RpZmllZCkpCisgICAgICAgICAgICAgICAgICBoZWFkIGhlYWQtdHJlZSkKKyAgICAgICAgICAgICAgKHVubGVzcyAoZ2l0LWVtcHR5LWRiLXApCisgICAgICAgICAgICAgICAgKHNldHEgaGVhZCAoZ2l0LXJldi1wYXJzZSAiSEVBRCIpCisgICAgICAgICAgICAgICAgICAgICAgaGVhZC10cmVlIChnaXQtcmV2LXBhcnNlICJIRUFEXnt0cmVlfSIpKSkKKyAgICAgICAgICAgICAgKGlmIGZpbGVzCisgICAgICAgICAgICAgICAgICAocHJvZ24KKyAgICAgICAgICAgICAgICAgICAgKG1lc3NhZ2UgIlJ1bm5pbmcgZ2l0IGNvbW1pdC4uLiIpCisgICAgICAgICAgICAgICAgICAgIChnaXQtcmVhZC10cmVlIGhlYWQtdHJlZSBpbmRleC1maWxlKQorICAgICAgICAgICAgICAgICAgICAoZ2l0LXVwZGF0ZS1pbmRleCBuaWwgZmlsZXMpICAgICAgICAgO3VwZGF0ZSBib3RoIHRoZSBkZWZhdWx0IGluZGV4CisgICAgICAgICAgICAgICAgICAgIChnaXQtdXBkYXRlLWluZGV4IGluZGV4LWZpbGUgZmlsZXMpICA7YW5kIHRoZSB0ZW1wb3Jhcnkgb25lCisgICAgICAgICAgICAgICAgICAgIChsZXQgKCh0cmVlIChnaXQtd3JpdGUtdHJlZSBpbmRleC1maWxlKSkpCisgICAgICAgICAgICAgICAgICAgICAgKGlmIChvciAobm90IChzdHJpbmctZXF1YWwgdHJlZSBoZWFkLXRyZWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHllcy1vci1uby1wICJUaGUgdHJlZSB3YXMgbm90IG1vZGlmaWVkLCBkbyB5b3UgcmVhbGx5IHdhbnQgdG8gcGVyZm9ybSBhbiBlbXB0eSBjb21taXQ/ICIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAobGV0ICgoY29tbWl0IChnaXQtY29tbWl0LXRyZWUgYnVmZmVyIHRyZWUgaGVhZCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGVuIGNvbW1pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmRpdGlvbi1jYXNlIG5pbCAoZGVsZXRlLWZpbGUgIi5naXQvTUVSR0VfSEVBRCIpIChlcnJvciBuaWwpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmRpdGlvbi1jYXNlIG5pbCAoZGVsZXRlLWZpbGUgIi5naXQvTUVSR0VfTVNHIikgKGVycm9yIG5pbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciBidWZmZXIgKGVyYXNlLWJ1ZmZlcikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2l0LXVwZGF0ZS1zdGF0dXMtZmlsZXMgKGdpdC1nZXQtZmlsZW5hbWVzIGZpbGVzKSAndXB0b2RhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2l0LWNhbGwtcHJvY2Vzcy1lbnYgbmlsIG5pbCAicmVyZXJlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaXQtY2FsbC1wcm9jZXNzLWVudiBuaWwgbmlsICJnYyIgIi0tYXV0byIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2l0LXJlZnJlc2gtZmlsZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2l0LXJlZnJlc2gtZXdvYy1oZiBnaXQtc3RhdHVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1lc3NhZ2UgIkNvbW1pdHRlZCAlcy4iIGNvbW1pdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaXQtcnVuLWhvb2sgInBvc3QtY29tbWl0IiBuaWwpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIChtZXNzYWdlICJDb21taXQgYWJvcnRlZC4iKSkpKQorICAgICAgICAgICAgICAgIChtZXNzYWdlICJObyBmaWxlcyB0byBjb21taXQuIikpKQorICAgICAgICAgIChkZWxldGUtZmlsZSBpbmRleC1maWxlKSkpKSkpCisKKworOzs7OyBJbnRlcmFjdGl2ZSBmdW5jdGlvbnMKKzs7OzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyhkZWZ1biBnaXQtbWFyay1maWxlICgpCisgICJNYXJrIHRoZSBmaWxlIHRoYXQgdGhlIGN1cnNvciBpcyBvbiBhbmQgbW92ZSB0byB0aGUgbmV4dCBvbmUuIgorICAoaW50ZXJhY3RpdmUpCisgICh1bmxlc3MgZ2l0LXN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgKGxldCogKChwb3MgKGV3b2MtbG9jYXRlIGdpdC1zdGF0dXMpKQorICAgICAgICAgKGluZm8gKGV3b2MtZGF0YSBwb3MpKSkKKyAgICAoc2V0ZiAoZ2l0LWZpbGVpbmZvLT5tYXJrZWQgaW5mbykgdCkKKyAgICAoZXdvYy1pbnZhbGlkYXRlIGdpdC1zdGF0dXMgcG9zKQorICAgIChld29jLWdvdG8tbmV4dCBnaXQtc3RhdHVzIDEpKSkKKworKGRlZnVuIGdpdC11bm1hcmstZmlsZSAoKQorICAiVW5tYXJrIHRoZSBmaWxlIHRoYXQgdGhlIGN1cnNvciBpcyBvbiBhbmQgbW92ZSB0byB0aGUgbmV4dCBvbmUuIgorICAoaW50ZXJhY3RpdmUpCisgICh1bmxlc3MgZ2l0LXN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgKGxldCogKChwb3MgKGV3b2MtbG9jYXRlIGdpdC1zdGF0dXMpKQorICAgICAgICAgKGluZm8gKGV3b2MtZGF0YSBwb3MpKSkKKyAgICAoc2V0ZiAoZ2l0LWZpbGVpbmZvLT5tYXJrZWQgaW5mbykgbmlsKQorICAgIChld29jLWludmFsaWRhdGUgZ2l0LXN0YXR1cyBwb3MpCisgICAgKGV3b2MtZ290by1uZXh0IGdpdC1zdGF0dXMgMSkpKQorCisoZGVmdW4gZ2l0LXVubWFyay1maWxlLXVwICgpCisgICJVbm1hcmsgdGhlIGZpbGUgdGhhdCB0aGUgY3Vyc29yIGlzIG9uIGFuZCBtb3ZlIHRvIHRoZSBwcmV2aW91cyBvbmUuIgorICAoaW50ZXJhY3RpdmUpCisgICh1bmxlc3MgZ2l0LXN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgKGxldCogKChwb3MgKGV3b2MtbG9jYXRlIGdpdC1zdGF0dXMpKQorICAgICAgICAgKGluZm8gKGV3b2MtZGF0YSBwb3MpKSkKKyAgICAoc2V0ZiAoZ2l0LWZpbGVpbmZvLT5tYXJrZWQgaW5mbykgbmlsKQorICAgIChld29jLWludmFsaWRhdGUgZ2l0LXN0YXR1cyBwb3MpCisgICAgKGV3b2MtZ290by1wcmV2IGdpdC1zdGF0dXMgMSkpKQorCisoZGVmdW4gZ2l0LW1hcmstYWxsICgpCisgICJNYXJrIGFsbCBmaWxlcy4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAoZXdvYy1tYXAgKGxhbWJkYSAoaW5mbykgKHVubGVzcyAoZ2l0LWZpbGVpbmZvLT5tYXJrZWQgaW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldGYgKGdpdC1maWxlaW5mby0+bWFya2VkIGluZm8pIHQpKSkgZ2l0LXN0YXR1cykKKyAgOyBtb3ZlIGJhY2sgdG8gZ29hbCBjb2x1bW4gYWZ0ZXIgaW52YWxpZGF0ZQorICAod2hlbiBnb2FsLWNvbHVtbiAobW92ZS10by1jb2x1bW4gZ29hbC1jb2x1bW4pKSkKKworKGRlZnVuIGdpdC11bm1hcmstYWxsICgpCisgICJVbm1hcmsgYWxsIGZpbGVzLiIKKyAgKGludGVyYWN0aXZlKQorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgIChld29jLW1hcCAobGFtYmRhIChpbmZvKSAod2hlbiAoZ2l0LWZpbGVpbmZvLT5tYXJrZWQgaW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldGYgKGdpdC1maWxlaW5mby0+bWFya2VkIGluZm8pIG5pbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCkpIGdpdC1zdGF0dXMpCisgIDsgbW92ZSBiYWNrIHRvIGdvYWwgY29sdW1uIGFmdGVyIGludmFsaWRhdGUKKyAgKHdoZW4gZ29hbC1jb2x1bW4gKG1vdmUtdG8tY29sdW1uIGdvYWwtY29sdW1uKSkpCisKKyhkZWZ1biBnaXQtdG9nZ2xlLWFsbC1tYXJrcyAoKQorICAiVG9nZ2xlIGFsbCBmaWxlIG1hcmtzLiIKKyAgKGludGVyYWN0aXZlKQorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgIChld29jLW1hcCAobGFtYmRhIChpbmZvKSAoc2V0ZiAoZ2l0LWZpbGVpbmZvLT5tYXJrZWQgaW5mbykgKG5vdCAoZ2l0LWZpbGVpbmZvLT5tYXJrZWQgaW5mbykpKSB0KSBnaXQtc3RhdHVzKQorICA7IG1vdmUgYmFjayB0byBnb2FsIGNvbHVtbiBhZnRlciBpbnZhbGlkYXRlCisgICh3aGVuIGdvYWwtY29sdW1uIChtb3ZlLXRvLWNvbHVtbiBnb2FsLWNvbHVtbikpKQorCisoZGVmdW4gZ2l0LW5leHQtZmlsZSAoJm9wdGlvbmFsIG4pCisgICJNb3ZlIHRoZSBzZWxlY3Rpb24gZG93biBOIGZpbGVzLiIKKyAgKGludGVyYWN0aXZlICJwIikKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAoZXdvYy1nb3RvLW5leHQgZ2l0LXN0YXR1cyBuKSkKKworKGRlZnVuIGdpdC1wcmV2LWZpbGUgKCZvcHRpb25hbCBuKQorICAiTW92ZSB0aGUgc2VsZWN0aW9uIHVwIE4gZmlsZXMuIgorICAoaW50ZXJhY3RpdmUgInAiKQorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgIChld29jLWdvdG8tcHJldiBnaXQtc3RhdHVzIG4pKQorCisoZGVmdW4gZ2l0LW5leHQtdW5tZXJnZWQtZmlsZSAoJm9wdGlvbmFsIG4pCisgICJNb3ZlIHRoZSBzZWxlY3Rpb24gZG93biBOIHVubWVyZ2VkIGZpbGVzLiIKKyAgKGludGVyYWN0aXZlICJwIikKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAobGV0KiAoKGxhc3QgKGV3b2MtbG9jYXRlIGdpdC1zdGF0dXMpKQorICAgICAgICAgKG5vZGUgKGV3b2MtbmV4dCBnaXQtc3RhdHVzIGxhc3QpKSkKKyAgICAod2hpbGUgKGFuZCBub2RlICg+IG4gMCkpCisgICAgICAod2hlbiAoZXEgJ3VubWVyZ2VkIChnaXQtZmlsZWluZm8tPnN0YXRlIChld29jLWRhdGEgbm9kZSkpKQorICAgICAgICAoc2V0cSBuICgxLSBuKSkKKyAgICAgICAgKHNldHEgbGFzdCBub2RlKSkKKyAgICAgIChzZXRxIG5vZGUgKGV3b2MtbmV4dCBnaXQtc3RhdHVzIG5vZGUpKSkKKyAgICAoZXdvYy1nb3RvLW5vZGUgZ2l0LXN0YXR1cyBsYXN0KSkpCisKKyhkZWZ1biBnaXQtcHJldi11bm1lcmdlZC1maWxlICgmb3B0aW9uYWwgbikKKyAgIk1vdmUgdGhlIHNlbGVjdGlvbiB1cCBOIHVubWVyZ2VkIGZpbGVzLiIKKyAgKGludGVyYWN0aXZlICJwIikKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAobGV0KiAoKGxhc3QgKGV3b2MtbG9jYXRlIGdpdC1zdGF0dXMpKQorICAgICAgICAgKG5vZGUgKGV3b2MtcHJldiBnaXQtc3RhdHVzIGxhc3QpKSkKKyAgICAod2hpbGUgKGFuZCBub2RlICg+IG4gMCkpCisgICAgICAod2hlbiAoZXEgJ3VubWVyZ2VkIChnaXQtZmlsZWluZm8tPnN0YXRlIChld29jLWRhdGEgbm9kZSkpKQorICAgICAgICAoc2V0cSBuICgxLSBuKSkKKyAgICAgICAgKHNldHEgbGFzdCBub2RlKSkKKyAgICAgIChzZXRxIG5vZGUgKGV3b2MtcHJldiBnaXQtc3RhdHVzIG5vZGUpKSkKKyAgICAoZXdvYy1nb3RvLW5vZGUgZ2l0LXN0YXR1cyBsYXN0KSkpCisKKyhkZWZ1biBnaXQtYWRkLWZpbGUgKCkKKyAgIkFkZCBtYXJrZWQgZmlsZShzKSB0byB0aGUgaW5kZXggY2FjaGUuIgorICAoaW50ZXJhY3RpdmUpCisgIChsZXQgKChmaWxlcyAoZ2l0LWdldC1maWxlbmFtZXMgKGdpdC1tYXJrZWQtZmlsZXMtc3RhdGUgJ3Vua25vd24gJ2lnbm9yZWQpKSkpCisgICAgOzsgRklYTUU6IGFkZCBzdXBwb3J0IGZvciBkaXJlY3RvcmllcworICAgICh1bmxlc3MgZmlsZXMKKyAgICAgIChwdXNoIChmaWxlLXJlbGF0aXZlLW5hbWUgKHJlYWQtZmlsZS1uYW1lICJGaWxlIHRvIGFkZDogIiBuaWwgbmlsIHQpKSBmaWxlcykpCisgICAgKHdoZW4gKGFwcGx5ICdnaXQtY2FsbC1wcm9jZXNzLWRpc3BsYXktZXJyb3IgInVwZGF0ZS1pbmRleCIgIi0tYWRkIiAiLS0iIGZpbGVzKQorICAgICAgKGdpdC11cGRhdGUtc3RhdHVzLWZpbGVzIGZpbGVzICd1cHRvZGF0ZSkKKyAgICAgIChnaXQtc3VjY2Vzcy1tZXNzYWdlICJBZGRlZCIgZmlsZXMpKSkpCisKKyhkZWZ1biBnaXQtaWdub3JlLWZpbGUgKCkKKyAgIkFkZCBtYXJrZWQgZmlsZShzKSB0byB0aGUgaWdub3JlIGxpc3QuIgorICAoaW50ZXJhY3RpdmUpCisgIChsZXQgKChmaWxlcyAoZ2l0LWdldC1maWxlbmFtZXMgKGdpdC1tYXJrZWQtZmlsZXMtc3RhdGUgJ3Vua25vd24pKSkpCisgICAgKHVubGVzcyBmaWxlcworICAgICAgKHB1c2ggKGZpbGUtcmVsYXRpdmUtbmFtZSAocmVhZC1maWxlLW5hbWUgIkZpbGUgdG8gaWdub3JlOiAiIG5pbCBuaWwgdCkpIGZpbGVzKSkKKyAgICAoZG9saXN0IChmIGZpbGVzKSAoZ2l0LWFwcGVuZC10by1pZ25vcmUgZikpCisgICAgKGdpdC11cGRhdGUtc3RhdHVzLWZpbGVzIGZpbGVzICdpZ25vcmVkKQorICAgIChnaXQtc3VjY2Vzcy1tZXNzYWdlICJJZ25vcmVkIiBmaWxlcykpKQorCisoZGVmdW4gZ2l0LXJlbW92ZS1maWxlICgpCisgICJSZW1vdmUgdGhlIG1hcmtlZCBmaWxlKHMpLiIKKyAgKGludGVyYWN0aXZlKQorICAobGV0ICgoZmlsZXMgKGdpdC1nZXQtZmlsZW5hbWVzIChnaXQtbWFya2VkLWZpbGVzLXN0YXRlICdhZGRlZCAnbW9kaWZpZWQgJ3Vua25vd24gJ3VwdG9kYXRlICdpZ25vcmVkKSkpKQorICAgICh1bmxlc3MgZmlsZXMKKyAgICAgIChwdXNoIChmaWxlLXJlbGF0aXZlLW5hbWUgKHJlYWQtZmlsZS1uYW1lICJGaWxlIHRvIHJlbW92ZTogIiBuaWwgbmlsIHQpKSBmaWxlcykpCisgICAgKGlmICh5ZXMtb3Itbm8tcAorICAgICAgICAgKGZvcm1hdCAiUmVtb3ZlICVkIGZpbGUlcz8gIiAobGVuZ3RoIGZpbGVzKSAoaWYgKD4gKGxlbmd0aCBmaWxlcykgMSkgInMiICIiKSkpCisgICAgICAgIChwcm9nbgorICAgICAgICAgIChkb2xpc3QgKG5hbWUgZmlsZXMpCisgICAgICAgICAgICAoaWdub3JlLWVycm9ycworICAgICAgICAgICAgICAoaWYgKGZpbGUtZGlyZWN0b3J5LXAgbmFtZSkKKyAgICAgICAgICAgICAgICAgIChkZWxldGUtZGlyZWN0b3J5IG5hbWUpCisgICAgICAgICAgICAgICAgKGRlbGV0ZS1maWxlIG5hbWUpKSkpCisgICAgICAgICAgKHdoZW4gKGFwcGx5ICdnaXQtY2FsbC1wcm9jZXNzLWRpc3BsYXktZXJyb3IgInVwZGF0ZS1pbmRleCIgIi0tcmVtb3ZlIiAiLS0iIGZpbGVzKQorICAgICAgICAgICAgKGdpdC11cGRhdGUtc3RhdHVzLWZpbGVzIGZpbGVzIG5pbCkKKyAgICAgICAgICAgIChnaXQtc3VjY2Vzcy1tZXNzYWdlICJSZW1vdmVkIiBmaWxlcykpKQorICAgICAgKG1lc3NhZ2UgIkFib3J0aW5nIikpKSkKKworKGRlZnVuIGdpdC1yZXZlcnQtZmlsZSAoKQorICAiUmV2ZXJ0IGNoYW5nZXMgdG8gdGhlIG1hcmtlZCBmaWxlKHMpLiIKKyAgKGludGVyYWN0aXZlKQorICAobGV0ICgoZmlsZXMgKGdpdC1tYXJrZWQtZmlsZXMtc3RhdGUgJ2FkZGVkICdkZWxldGVkICdtb2RpZmllZCAndW5tZXJnZWQpKQorICAgICAgICBhZGRlZCBtb2RpZmllZCkKKyAgICAod2hlbiAoYW5kIGZpbGVzCisgICAgICAgICAgICAgICAoeWVzLW9yLW5vLXAKKyAgICAgICAgICAgICAgICAoZm9ybWF0ICJSZXZlcnQgJWQgZmlsZSVzPyAiIChsZW5ndGggZmlsZXMpIChpZiAoPiAobGVuZ3RoIGZpbGVzKSAxKSAicyIgIiIpKSkpCisgICAgICAoZG9saXN0IChpbmZvIGZpbGVzKQorICAgICAgICAoY2FzZSAoZ2l0LWZpbGVpbmZvLT5zdGF0ZSBpbmZvKQorICAgICAgICAgICgnYWRkZWQgKHB1c2ggKGdpdC1maWxlaW5mby0+bmFtZSBpbmZvKSBhZGRlZCkpCisgICAgICAgICAgKCdkZWxldGVkIChwdXNoIChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbykgbW9kaWZpZWQpKQorICAgICAgICAgICgndW5tZXJnZWQgKHB1c2ggKGdpdC1maWxlaW5mby0+bmFtZSBpbmZvKSBtb2RpZmllZCkpCisgICAgICAgICAgKCdtb2RpZmllZCAocHVzaCAoZ2l0LWZpbGVpbmZvLT5uYW1lIGluZm8pIG1vZGlmaWVkKSkpKQorICAgICAgOzsgY2hlY2sgaWYgYSBidWZmZXIgY29udGFpbnMgb25lIG9mIHRoZSBmaWxlcyBhbmQgaXNuJ3Qgc2F2ZWQKKyAgICAgIChkb2xpc3QgKGZpbGUgbW9kaWZpZWQpCisgICAgICAgIChsZXQgKChidWZmZXIgKGdldC1maWxlLWJ1ZmZlciBmaWxlKSkpCisgICAgICAgICAgKHdoZW4gKGFuZCBidWZmZXIgKGJ1ZmZlci1tb2RpZmllZC1wIGJ1ZmZlcikpCisgICAgICAgICAgICAoZXJyb3IgIkJ1ZmZlciAlcyBpcyBtb2RpZmllZC4gUGxlYXNlIGtpbGwgb3Igc2F2ZSBtb2RpZmllZCBidWZmZXJzIGJlZm9yZSByZXZlcnRpbmcuIiAoYnVmZmVyLW5hbWUgYnVmZmVyKSkpKSkKKyAgICAgIChsZXQgKChvayAoYW5kCisgICAgICAgICAgICAgICAgIChvciAobm90IGFkZGVkKQorICAgICAgICAgICAgICAgICAgICAgKGFwcGx5ICdnaXQtY2FsbC1wcm9jZXNzLWRpc3BsYXktZXJyb3IgInVwZGF0ZS1pbmRleCIgIi0tZm9yY2UtcmVtb3ZlIiAiLS0iIGFkZGVkKSkKKyAgICAgICAgICAgICAgICAgKG9yIChub3QgbW9kaWZpZWQpCisgICAgICAgICAgICAgICAgICAgICAoYXBwbHkgJ2dpdC1jYWxsLXByb2Nlc3MtZGlzcGxheS1lcnJvciAiY2hlY2tvdXQiICJIRUFEIiBtb2RpZmllZCkpKSkpCisgICAgICAgIChnaXQtdXBkYXRlLXN0YXR1cy1maWxlcyAoYXBwZW5kIGFkZGVkIG1vZGlmaWVkKSAndXB0b2RhdGUpCisgICAgICAgICh3aGVuIG9rCisgICAgICAgICAgKGRvbGlzdCAoZmlsZSBtb2RpZmllZCkKKyAgICAgICAgICAgIChsZXQgKChidWZmZXIgKGdldC1maWxlLWJ1ZmZlciBmaWxlKSkpCisgICAgICAgICAgICAgICh3aGVuIGJ1ZmZlciAod2l0aC1jdXJyZW50LWJ1ZmZlciBidWZmZXIgKHJldmVydC1idWZmZXIgdCB0IHQpKSkpKQorICAgICAgICAgIChnaXQtc3VjY2Vzcy1tZXNzYWdlICJSZXZlcnRlZCIgKGdpdC1nZXQtZmlsZW5hbWVzIGZpbGVzKSkpKSkpKQorCisoZGVmdW4gZ2l0LXJlc29sdmUtZmlsZSAoKQorICAiUmVzb2x2ZSBjb25mbGljdHMgaW4gbWFya2VkIGZpbGUocykuIgorICAoaW50ZXJhY3RpdmUpCisgIChsZXQgKChmaWxlcyAoZ2l0LWdldC1maWxlbmFtZXMgKGdpdC1tYXJrZWQtZmlsZXMtc3RhdGUgJ3VubWVyZ2VkKSkpKQorICAgICh3aGVuIGZpbGVzCisgICAgICAod2hlbiAoYXBwbHkgJ2dpdC1jYWxsLXByb2Nlc3MtZGlzcGxheS1lcnJvciAidXBkYXRlLWluZGV4IiAiLS0iIGZpbGVzKQorICAgICAgICAoZ2l0LXVwZGF0ZS1zdGF0dXMtZmlsZXMgZmlsZXMgJ3VwdG9kYXRlKQorICAgICAgICAoZ2l0LXN1Y2Nlc3MtbWVzc2FnZSAiUmVzb2x2ZWQiIGZpbGVzKSkpKSkKKworKGRlZnVuIGdpdC1yZW1vdmUtaGFuZGxlZCAoKQorICAiUmVtb3ZlIGhhbmRsZWQgZmlsZXMgZnJvbSB0aGUgc3RhdHVzIGxpc3QuIgorICAoaW50ZXJhY3RpdmUpCisgIChld29jLWZpbHRlciBnaXQtc3RhdHVzCisgICAgICAgICAgICAgICAobGFtYmRhIChpbmZvKQorICAgICAgICAgICAgICAgICAoY2FzZSAoZ2l0LWZpbGVpbmZvLT5zdGF0ZSBpbmZvKQorICAgICAgICAgICAgICAgICAgICgnaWdub3JlZCBnaXQtc2hvdy1pZ25vcmVkKQorICAgICAgICAgICAgICAgICAgICgndXB0b2RhdGUgZ2l0LXNob3ctdXB0b2RhdGUpCisgICAgICAgICAgICAgICAgICAgKCd1bmtub3duIGdpdC1zaG93LXVua25vd24pCisgICAgICAgICAgICAgICAgICAgKHQgdCkpKSkKKyAgKHVubGVzcyAoZXdvYy1udGggZ2l0LXN0YXR1cyAwKSAgOyByZWZyZXNoIGhlYWRlciBpZiBsaXN0IGlzIGVtcHR5CisgICAgKGdpdC1yZWZyZXNoLWV3b2MtaGYgZ2l0LXN0YXR1cykpKQorCisoZGVmdW4gZ2l0LXRvZ2dsZS1zaG93LXVwdG9kYXRlICgpCisgICJUb29nbGUgdGhlIG9wdGlvbiBmb3Igc2hvd2luZyB1cC10by1kYXRlIGZpbGVzLiIKKyAgKGludGVyYWN0aXZlKQorICAoaWYgKHNldHEgZ2l0LXNob3ctdXB0b2RhdGUgKG5vdCBnaXQtc2hvdy11cHRvZGF0ZSkpCisgICAgICAoZ2l0LXJlZnJlc2gtc3RhdHVzKQorICAgIChnaXQtcmVtb3ZlLWhhbmRsZWQpKSkKKworKGRlZnVuIGdpdC10b2dnbGUtc2hvdy1pZ25vcmVkICgpCisgICJUb29nbGUgdGhlIG9wdGlvbiBmb3Igc2hvd2luZyBpZ25vcmVkIGZpbGVzLiIKKyAgKGludGVyYWN0aXZlKQorICAoaWYgKHNldHEgZ2l0LXNob3ctaWdub3JlZCAobm90IGdpdC1zaG93LWlnbm9yZWQpKQorICAgICAgKHByb2duCisgICAgICAgIChtZXNzYWdlICJJbnNlcnRpbmcgaWdub3JlZCBmaWxlcy4uLiIpCisgICAgICAgIChnaXQtcnVuLWxzLWZpbGVzLXdpdGgtZXhjbHVkZXMgZ2l0LXN0YXR1cyBuaWwgJ2lnbm9yZWQgIi1vIiAiLWkiKQorICAgICAgICAoZ2l0LXJlZnJlc2gtZmlsZXMpCisgICAgICAgIChnaXQtcmVmcmVzaC1ld29jLWhmIGdpdC1zdGF0dXMpCisgICAgICAgIChtZXNzYWdlICJJbnNlcnRpbmcgaWdub3JlZCBmaWxlcy4uLmRvbmUiKSkKKyAgICAoZ2l0LXJlbW92ZS1oYW5kbGVkKSkpCisKKyhkZWZ1biBnaXQtdG9nZ2xlLXNob3ctdW5rbm93biAoKQorICAiVG9vZ2xlIHRoZSBvcHRpb24gZm9yIHNob3dpbmcgdW5rbm93biBmaWxlcy4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGlmIChzZXRxIGdpdC1zaG93LXVua25vd24gKG5vdCBnaXQtc2hvdy11bmtub3duKSkKKyAgICAgIChwcm9nbgorICAgICAgICAobWVzc2FnZSAiSW5zZXJ0aW5nIHVua25vd24gZmlsZXMuLi4iKQorICAgICAgICAoZ2l0LXJ1bi1scy1maWxlcy13aXRoLWV4Y2x1ZGVzIGdpdC1zdGF0dXMgbmlsICd1bmtub3duICItbyIpCisgICAgICAgIChnaXQtcmVmcmVzaC1maWxlcykKKyAgICAgICAgKGdpdC1yZWZyZXNoLWV3b2MtaGYgZ2l0LXN0YXR1cykKKyAgICAgICAgKG1lc3NhZ2UgIkluc2VydGluZyB1bmtub3duIGZpbGVzLi4uZG9uZSIpKQorICAgIChnaXQtcmVtb3ZlLWhhbmRsZWQpKSkKKworKGRlZnVuIGdpdC1leHBhbmQtZGlyZWN0b3J5IChpbmZvKQorICAiRXhwYW5kIHRoZSBkaXJlY3RvcnkgcmVwcmVzZW50ZWQgYnkgSU5GTyB0byBsaXN0IGl0cyBmaWxlcy4iCisgICh3aGVuIChlcSAobHNoIChnaXQtZmlsZWluZm8tPm5ldy1wZXJtIGluZm8pIC05KSA/XDExMCkKKyAgICAobGV0ICgoZGlyIChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbykpKQorICAgICAgKGdpdC1zZXQtZmlsZW5hbWVzLXN0YXRlIGdpdC1zdGF0dXMgKGxpc3QgZGlyKSBuaWwpCisgICAgICAoZ2l0LXJ1bi1scy1maWxlcy13aXRoLWV4Y2x1ZGVzIGdpdC1zdGF0dXMgKGxpc3QgKGNvbmNhdCBkaXIgIi8iKSkgJ3Vua25vd24gIi1vIikKKyAgICAgIChnaXQtcmVmcmVzaC1maWxlcykKKyAgICAgIChnaXQtcmVmcmVzaC1ld29jLWhmIGdpdC1zdGF0dXMpCisgICAgICB0KSkpCisKKyhkZWZ1biBnaXQtc2V0dXAtZGlmZi1idWZmZXIgKGJ1ZmZlcikKKyAgIlNldHVwIGEgYnVmZmVyIGZvciBkaXNwbGF5aW5nIGEgZGlmZi4iCisgIChsZXQgKChkaXIgZGVmYXVsdC1kaXJlY3RvcnkpKQorICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGJ1ZmZlcgorICAgICAgKGRpZmYtbW9kZSkKKyAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAoc2V0cSBkZWZhdWx0LWRpcmVjdG9yeSBkaXIpCisgICAgICAoc2V0cSBidWZmZXItcmVhZC1vbmx5IHQpKSkKKyAgKGRpc3BsYXktYnVmZmVyIGJ1ZmZlcikKKyAgOyBzaHJpbmsgd2luZG93IG9ubHkgaWYgaXQgZGlzcGxheXMgdGhlIHN0YXR1cyBidWZmZXIKKyAgKHdoZW4gKGVxICh3aW5kb3ctYnVmZmVyKSAoY3VycmVudC1idWZmZXIpKQorICAgIChzaHJpbmstd2luZG93LWlmLWxhcmdlci10aGFuLWJ1ZmZlcikpKQorCisoZGVmdW4gZ2l0LWRpZmYtZmlsZSAoKQorICAiRGlmZiB0aGUgbWFya2VkIGZpbGUocykgYWdhaW5zdCBIRUFELiIKKyAgKGludGVyYWN0aXZlKQorICAobGV0ICgoZmlsZXMgKGdpdC1tYXJrZWQtZmlsZXMpKSkKKyAgICAoZ2l0LXNldHVwLWRpZmYtYnVmZmVyCisgICAgIChhcHBseSAjJ2dpdC1ydW4tY29tbWFuZC1idWZmZXIgIipnaXQtZGlmZioiICJkaWZmLWluZGV4IiAiLXAiICItTSIgIkhFQUQiICItLSIgKGdpdC1nZXQtZmlsZW5hbWVzIGZpbGVzKSkpKSkKKworKGRlZnVuIGdpdC1kaWZmLWZpbGUtbWVyZ2UtaGVhZCAoYXJnKQorICAiRGlmZiB0aGUgbWFya2VkIGZpbGUocykgYWdhaW5zdCB0aGUgZmlyc3QgbWVyZ2UgaGVhZCAob3IgdGhlIG50aCBvbmUgd2l0aCBhIG51bWVyaWMgcHJlZml4KS4iCisgIChpbnRlcmFjdGl2ZSAicCIpCisgIChsZXQgKChmaWxlcyAoZ2l0LW1hcmtlZC1maWxlcykpCisgICAgICAgIChtZXJnZS1oZWFkcyAoZ2l0LWdldC1tZXJnZS1oZWFkcykpKQorICAgICh1bmxlc3MgbWVyZ2UtaGVhZHMgKGVycm9yICJObyBtZXJnZSBpbiBwcm9ncmVzcyIpKQorICAgIChnaXQtc2V0dXAtZGlmZi1idWZmZXIKKyAgICAgKGFwcGx5ICMnZ2l0LXJ1bi1jb21tYW5kLWJ1ZmZlciAiKmdpdC1kaWZmKiIgImRpZmYtaW5kZXgiICItcCIgIi1NIgorICAgICAgICAgICAgKG9yIChudGggKDEtIGFyZykgbWVyZ2UtaGVhZHMpICJIRUFEIikgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgZmlsZXMpKSkpKQorCisoZGVmdW4gZ2l0LWRpZmYtdW5tZXJnZWQtZmlsZSAoc3RhZ2UpCisgICJEaWZmIHRoZSBtYXJrZWQgdW5tZXJnZWQgZmlsZShzKSBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgc3RhZ2UuIgorICAobGV0ICgoZmlsZXMgKGdpdC1tYXJrZWQtZmlsZXMpKSkKKyAgICAoZ2l0LXNldHVwLWRpZmYtYnVmZmVyCisgICAgIChhcHBseSAjJ2dpdC1ydW4tY29tbWFuZC1idWZmZXIgIipnaXQtZGlmZioiICJkaWZmLWZpbGVzIiAiLXAiIHN0YWdlICItLSIgKGdpdC1nZXQtZmlsZW5hbWVzIGZpbGVzKSkpKSkKKworKGRlZnVuIGdpdC1kaWZmLWZpbGUtYmFzZSAoKQorICAiRGlmZiB0aGUgbWFya2VkIHVubWVyZ2VkIGZpbGUocykgYWdhaW5zdCB0aGUgY29tbW9uIGJhc2UgZmlsZS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGdpdC1kaWZmLXVubWVyZ2VkLWZpbGUgIi0xIikpCisKKyhkZWZ1biBnaXQtZGlmZi1maWxlLW1pbmUgKCkKKyAgIkRpZmYgdGhlIG1hcmtlZCB1bm1lcmdlZCBmaWxlKHMpIGFnYWluc3QgbXkgcHJlLW1lcmdlIHZlcnNpb24uIgorICAoaW50ZXJhY3RpdmUpCisgIChnaXQtZGlmZi11bm1lcmdlZC1maWxlICItMiIpKQorCisoZGVmdW4gZ2l0LWRpZmYtZmlsZS1vdGhlciAoKQorICAiRGlmZiB0aGUgbWFya2VkIHVubWVyZ2VkIGZpbGUocykgYWdhaW5zdCB0aGUgb3RoZXIncyBwcmUtbWVyZ2UgdmVyc2lvbi4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGdpdC1kaWZmLXVubWVyZ2VkLWZpbGUgIi0zIikpCisKKyhkZWZ1biBnaXQtZGlmZi1maWxlLWNvbWJpbmVkICgpCisgICJEbyBhIGNvbWJpbmVkIGRpZmYgb2YgdGhlIG1hcmtlZCB1bm1lcmdlZCBmaWxlKHMpLiIKKyAgKGludGVyYWN0aXZlKQorICAoZ2l0LWRpZmYtdW5tZXJnZWQtZmlsZSAiLWMiKSkKKworKGRlZnVuIGdpdC1kaWZmLWZpbGUtaWRpZmYgKCkKKyAgIlBlcmZvcm0gYW4gaW50ZXJhY3RpdmUgZGlmZiBvbiB0aGUgY3VycmVudCBmaWxlLiIKKyAgKGludGVyYWN0aXZlKQorICAobGV0ICgoZmlsZXMgKGdpdC1tYXJrZWQtZmlsZXMtc3RhdGUgJ2FkZGVkICdkZWxldGVkICdtb2RpZmllZCkpKQorICAgICh1bmxlc3MgKGVxIDEgKGxlbmd0aCBmaWxlcykpCisgICAgICAoZXJyb3IgIkNhbm5vdCBwZXJmb3JtIGFuIGludGVyYWN0aXZlIGRpZmYgb24gbXVsdGlwbGUgZmlsZXMuIikpCisgICAgKGxldCogKChmaWxlbmFtZSAoY2FyIChnaXQtZ2V0LWZpbGVuYW1lcyBmaWxlcykpKQorICAgICAgICAgICAoYnVmZjEgKGZpbmQtZmlsZS1ub3NlbGVjdCBmaWxlbmFtZSkpCisgICAgICAgICAgIChidWZmMiAoZ2l0LXJ1bi1jb21tYW5kLWJ1ZmZlciAoY29uY2F0IGZpbGVuYW1lICIufkhFQUR+IikgImNhdC1maWxlIiAiYmxvYiIgKGNvbmNhdCAiSEVBRDoiIGZpbGVuYW1lKSkpKQorICAgICAgKGVkaWZmLWJ1ZmZlcnMgYnVmZjEgYnVmZjIpKSkpCisKKyhkZWZ1biBnaXQtbG9nLWZpbGUgKCkKKyAgIkRpc3BsYXkgYSBsb2cgb2YgY2hhbmdlcyB0byB0aGUgbWFya2VkIGZpbGUocykuIgorICAoaW50ZXJhY3RpdmUpCisgIChsZXQqICgoZmlsZXMgKGdpdC1tYXJrZWQtZmlsZXMpKQorICAgICAgICAgKGNvZGluZy1zeXN0ZW0tZm9yLXJlYWQgZ2l0LWNvbW1pdHMtY29kaW5nLXN5c3RlbSkKKyAgICAgICAgIChidWZmZXIgKGFwcGx5ICMnZ2l0LXJ1bi1jb21tYW5kLWJ1ZmZlciAiKmdpdC1sb2cqIiAicmV2LWxpc3QiICItLXByZXR0eSIgIkhFQUQiICItLSIgKGdpdC1nZXQtZmlsZW5hbWVzIGZpbGVzKSkpKQorICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGJ1ZmZlcgorICAgICAgOyAoZ2l0LWxvZy1tb2RlKSAgRklYTUU6IGltcGxlbWVudCBsb2cgbW9kZQorICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAgICAgIChzZXRxIGJ1ZmZlci1yZWFkLW9ubHkgdCkpCisgICAgKGRpc3BsYXktYnVmZmVyIGJ1ZmZlcikpKQorCisoZGVmdW4gZ2l0LWxvZy1lZGl0LWZpbGVzICgpCisgICJSZXR1cm4gYSBsaXN0IG9mIG1hcmtlZCBmaWxlcyBmb3IgdXNlIGluIHRoZSBsb2ctZWRpdCBidWZmZXIuIgorICAod2l0aC1jdXJyZW50LWJ1ZmZlciBsb2ctZWRpdC1wYXJlbnQtYnVmZmVyCisgICAgKGdpdC1nZXQtZmlsZW5hbWVzIChnaXQtbWFya2VkLWZpbGVzLXN0YXRlICdhZGRlZCAnZGVsZXRlZCAnbW9kaWZpZWQpKSkpCisKKyhkZWZ1biBnaXQtbG9nLWVkaXQtZGlmZiAoKQorICAiUnVuIGEgZGlmZiBvZiB0aGUgY3VycmVudCBmaWxlcyBiZWluZyBjb21taXR0ZWQgZnJvbSBhIGxvZy1lZGl0IGJ1ZmZlci4iCisgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGxvZy1lZGl0LXBhcmVudC1idWZmZXIKKyAgICAoZ2l0LWRpZmYtZmlsZSkpKQorCisoZGVmdW4gZ2l0LWFwcGVuZC1zaWduLW9mZiAobmFtZSBlbWFpbCkKKyAgIkFwcGVuZCBhIFNpZ25lZC1vZmYtYnkgZW50cnkgdG8gdGhlIGN1cnJlbnQgYnVmZmVyLCBhdm9pZGluZyBkdXBsaWNhdGVzLiIKKyAgKGxldCAoKHNpZ24tb2ZmIChmb3JtYXQgIlNpZ25lZC1vZmYtYnk6ICVzIDwlcz4iIG5hbWUgZW1haWwpKQorICAgICAgICAoY2FzZS1mb2xkLXNlYXJjaCB0KSkKKyAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgICh1bmxlc3MgKHJlLXNlYXJjaC1mb3J3YXJkIChjb25jYXQgIl4iIChyZWdleHAtcXVvdGUgc2lnbi1vZmYpKSBuaWwgdCkKKyAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAodW5sZXNzIChyZS1zZWFyY2gtZm9yd2FyZCAiXlNpZ25lZC1vZmYtYnk6ICIgbmlsIHQpCisgICAgICAgIChzZXRxIHNpZ24tb2ZmIChjb25jYXQgIlxuIiBzaWduLW9mZikpKQorICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWF4KSkKKyAgICAgIChpbnNlcnQgc2lnbi1vZmYgIlxuIikpKSkKKworKGRlZnVuIGdpdC1zZXR1cC1sb2ctYnVmZmVyIChidWZmZXIgJm9wdGlvbmFsIGF1dGhvci1uYW1lIGF1dGhvci1lbWFpbCBzdWJqZWN0IGRhdGUgbXNnKQorICAiU2V0dXAgdGhlIGxvZyBidWZmZXIgZm9yIGEgY29tbWl0LiIKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAobGV0ICgobWVyZ2UtaGVhZHMgKGdpdC1nZXQtbWVyZ2UtaGVhZHMpKQorICAgICAgICAoZGlyIGRlZmF1bHQtZGlyZWN0b3J5KQorICAgICAgICAoY29tbWl0dGVyLW5hbWUgKGdpdC1nZXQtY29tbWl0dGVyLW5hbWUpKQorICAgICAgICAoY29tbWl0dGVyLWVtYWlsIChnaXQtZ2V0LWNvbW1pdHRlci1lbWFpbCkpCisgICAgICAgIChzaWduLW9mZiBnaXQtYXBwZW5kLXNpZ25lZC1vZmYtYnkpKQorICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGJ1ZmZlcgorICAgICAgKGNkIGRpcikKKyAgICAgIChlcmFzZS1idWZmZXIpCisgICAgICAoaW5zZXJ0CisgICAgICAgKHByb3BlcnRpemUKKyAgICAgICAgKGZvcm1hdCAiQXV0aG9yOiAlcyA8JXM+XG4lcyVzIgorICAgICAgICAgICAgICAgIChvciBhdXRob3ItbmFtZSBjb21taXR0ZXItbmFtZSkKKyAgICAgICAgICAgICAgICAob3IgYXV0aG9yLWVtYWlsIGNvbW1pdHRlci1lbWFpbCkKKyAgICAgICAgICAgICAgICAoaWYgZGF0ZSAoZm9ybWF0ICJEYXRlOiAlc1xuIiBkYXRlKSAiIikKKyAgICAgICAgICAgICAgICAoaWYgbWVyZ2UtaGVhZHMKKyAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCAiUGFyZW50OiAlc1xuJXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2l0LXJldi1wYXJzZSAiSEVBRCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hcGNvbmNhdCAobGFtYmRhIChzdHIpIChjb25jYXQgIlBhcmVudDogIiBzdHIpKSBtZXJnZS1oZWFkcyAiXG4iKSkKKyAgICAgICAgICAgICAgICAgICIiKSkKKyAgICAgICAgJ2ZhY2UgJ2dpdC1oZWFkZXItZmFjZSkKKyAgICAgICAocHJvcGVydGl6ZSBnaXQtbG9nLW1zZy1zZXBhcmF0b3IgJ2ZhY2UgJ2dpdC1zZXBhcmF0b3ItZmFjZSkKKyAgICAgICAiXG4iKQorICAgICAgKHdoZW4gc3ViamVjdCAoaW5zZXJ0IHN1YmplY3QgIlxuXG4iKSkKKyAgICAgIChjb25kIChtc2cgKGluc2VydCBtc2cgIlxuIikpCisgICAgICAgICAgICAoKGZpbGUtcmVhZGFibGUtcCAiLmRvdGVzdC9tc2ciKQorICAgICAgICAgICAgIChpbnNlcnQtZmlsZS1jb250ZW50cyAiLmRvdGVzdC9tc2ciKSkKKyAgICAgICAgICAgICgoZmlsZS1yZWFkYWJsZS1wICIuZ2l0L01FUkdFX01TRyIpCisgICAgICAgICAgICAgKGluc2VydC1maWxlLWNvbnRlbnRzICIuZ2l0L01FUkdFX01TRyIpKSkKKyAgICAgIDsgZGVsZXRlIGVtcHR5IGxpbmVzIGF0IGVuZAorICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAgICAgICh3aGVuIChyZS1zZWFyY2gtZm9yd2FyZCAiXG4rXFwnIiBuaWwgdCkKKyAgICAgICAgKHJlcGxhY2UtbWF0Y2ggIlxuIiB0IHQpKQorICAgICAgKHdoZW4gc2lnbi1vZmYgKGdpdC1hcHBlbmQtc2lnbi1vZmYgY29tbWl0dGVyLW5hbWUgY29tbWl0dGVyLWVtYWlsKSkpCisgICAgYnVmZmVyKSkKKworKGRlZnVuIGdpdC1jb21taXQtZmlsZSAoKQorICAiQ29tbWl0IHRoZSBtYXJrZWQgZmlsZShzKSwgYXNraW5nIGZvciBhIGNvbW1pdCBtZXNzYWdlLiIKKyAgKGludGVyYWN0aXZlKQorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgICh3aGVuIChnaXQtcnVuLXByZS1jb21taXQtaG9vaykKKyAgICAobGV0ICgoYnVmZmVyIChnZXQtYnVmZmVyLWNyZWF0ZSAiKmdpdC1jb21taXQqIikpCisgICAgICAgICAgKGNvZGluZy1zeXN0ZW0gKGdpdC1nZXQtY29tbWl0cy1jb2Rpbmctc3lzdGVtKSkKKyAgICAgICAgICBhdXRob3ItbmFtZSBhdXRob3ItZW1haWwgc3ViamVjdCBkYXRlKQorICAgICAgKHdoZW4gKGVxIDAgKGJ1ZmZlci1zaXplIGJ1ZmZlcikpCisgICAgICAgICh3aGVuIChmaWxlLXJlYWRhYmxlLXAgIi5kb3Rlc3QvaW5mbyIpCisgICAgICAgICAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAgICAgICAgIChpbnNlcnQtZmlsZS1jb250ZW50cyAiLmRvdGVzdC9pbmZvIikKKyAgICAgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAgICAgICAod2hlbiAocmUtc2VhcmNoLWZvcndhcmQgIl5BdXRob3I6IFxcKC4qXFwpXG5FbWFpbDogXFwoLipcXCkkIiBuaWwgdCkKKyAgICAgICAgICAgICAgKHNldHEgYXV0aG9yLW5hbWUgKG1hdGNoLXN0cmluZyAxKSkKKyAgICAgICAgICAgICAgKHNldHEgYXV0aG9yLWVtYWlsIChtYXRjaC1zdHJpbmcgMikpKQorICAgICAgICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAgICAgICAgICAgICh3aGVuIChyZS1zZWFyY2gtZm9yd2FyZCAiXlN1YmplY3Q6IFxcKC4qXFwpJCIgbmlsIHQpCisgICAgICAgICAgICAgIChzZXRxIHN1YmplY3QgKG1hdGNoLXN0cmluZyAxKSkpCisgICAgICAgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgICAgICAgICAgKHdoZW4gKHJlLXNlYXJjaC1mb3J3YXJkICJeRGF0ZTogXFwoLipcXCkkIiBuaWwgdCkKKyAgICAgICAgICAgICAgKHNldHEgZGF0ZSAobWF0Y2gtc3RyaW5nIDEpKSkpKQorICAgICAgICAoZ2l0LXNldHVwLWxvZy1idWZmZXIgYnVmZmVyIGF1dGhvci1uYW1lIGF1dGhvci1lbWFpbCBzdWJqZWN0IGRhdGUpKQorICAgICAgKGlmIChib3VuZHAgJ2xvZy1lZGl0LWRpZmYtZnVuY3Rpb24pCisJICAobG9nLWVkaXQgJ2dpdC1kby1jb21taXQgbmlsICcoKGxvZy1lZGl0LWxpc3RmdW4gLiBnaXQtbG9nLWVkaXQtZmlsZXMpCisJCQkJCSAobG9nLWVkaXQtZGlmZi1mdW5jdGlvbiAuIGdpdC1sb2ctZWRpdC1kaWZmKSkgYnVmZmVyKQorCShsb2ctZWRpdCAnZ2l0LWRvLWNvbW1pdCBuaWwgJ2dpdC1sb2ctZWRpdC1maWxlcyBidWZmZXIpKQorICAgICAgKHNldHEgZm9udC1sb2NrLWtleXdvcmRzIChmb250LWxvY2stY29tcGlsZS1rZXl3b3JkcyBnaXQtbG9nLWVkaXQtZm9udC1sb2NrLWtleXdvcmRzKSkKKyAgICAgIChzZXRxIGJ1ZmZlci1maWxlLWNvZGluZy1zeXN0ZW0gY29kaW5nLXN5c3RlbSkKKyAgICAgIChyZS1zZWFyY2gtZm9yd2FyZCAocmVnZXhwLXF1b3RlIChjb25jYXQgZ2l0LWxvZy1tc2ctc2VwYXJhdG9yICJcbiIpKSBuaWwgdCkpKSkKKworKGRlZnVuIGdpdC1zZXR1cC1jb21taXQtYnVmZmVyIChjb21taXQpCisgICJTZXR1cCB0aGUgY29tbWl0IGJ1ZmZlciB3aXRoIHRoZSBjb250ZW50cyBvZiBDT01NSVQuIgorICAobGV0IChhdXRob3ItbmFtZSBhdXRob3ItZW1haWwgc3ViamVjdCBkYXRlIG1zZykKKyAgICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgICAgKGxldCAoKGNvZGluZy1zeXN0ZW0gKGdpdC1nZXQtbG9nb3V0cHV0LWNvZGluZy1zeXN0ZW0pKSkKKyAgICAgICAgKGdpdC1jYWxsLXByb2Nlc3MtZW52IHQgbmlsICJsb2ciICItMSIgIi0tcHJldHR5PW1lZGl1bSIgY29tbWl0KQorICAgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgICAgICAod2hlbiAocmUtc2VhcmNoLWZvcndhcmQgIl5BdXRob3I6ICpcXCguKlxcKSA8XFwoLipcXCk+JCIgbmlsIHQpCisgICAgICAgICAgKHNldHEgYXV0aG9yLW5hbWUgKG1hdGNoLXN0cmluZyAxKSkKKyAgICAgICAgICAoc2V0cSBhdXRob3ItZW1haWwgKG1hdGNoLXN0cmluZyAyKSkpCisgICAgICAgICh3aGVuIChyZS1zZWFyY2gtZm9yd2FyZCAiXkRhdGU6ICpcXCguKlxcKSQiIG5pbCB0KQorICAgICAgICAgIChzZXRxIGRhdGUgKG1hdGNoLXN0cmluZyAxKSkpCisgICAgICAgICh3aGlsZSAocmUtc2VhcmNoLWZvcndhcmQgIl4gICAgXFwoLipcXCkkIiBuaWwgdCkKKyAgICAgICAgICAocHVzaCAobWF0Y2gtc3RyaW5nIDEpIG1zZykpCisgICAgICAgIChzZXRxIG1zZyAobnJldmVyc2UgbXNnKSkKKyAgICAgICAgKHNldHEgc3ViamVjdCAocG9wIG1zZykpCisgICAgICAgICh3aGlsZSAoYW5kIG1zZyAoemVyb3AgKGxlbmd0aCAoY2FyIG1zZykpKSAocG9wIG1zZykpKSkpCisgICAgKGdpdC1zZXR1cC1sb2ctYnVmZmVyIChnZXQtYnVmZmVyLWNyZWF0ZSAiKmdpdC1jb21taXQqIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yLW5hbWUgYXV0aG9yLWVtYWlsIHN1YmplY3QgZGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAobWFwY29uY2F0ICMnaWRlbnRpdHkgbXNnICJcbiIpKSkpCisKKyhkZWZ1biBnaXQtZ2V0LWNvbW1pdC1maWxlcyAoY29tbWl0KQorICAiUmV0cmlldmUgdGhlIGxpc3Qgb2YgZmlsZXMgbW9kaWZpZWQgYnkgQ09NTUlULiIKKyAgKGxldCAoZmlsZXMpCisgICAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAgIChnaXQtY2FsbC1wcm9jZXNzLWVudiB0IG5pbCAiZGlmZi10cmVlIiAiLXIiICIteiIgIi0tbmFtZS1vbmx5IiAiLS1uby1jb21taXQtaWQiIGNvbW1pdCkKKyAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAod2hpbGUgKHJlLXNlYXJjaC1mb3J3YXJkICJcXChbXlwwXSpcXClcMCIgbmlsIHQgMSkKKyAgICAgICAgKHB1c2ggKG1hdGNoLXN0cmluZyAxKSBmaWxlcykpKQorICAgIGZpbGVzKSkKKworKGRlZnVuIGdpdC1hbWVuZC1jb21taXQgKCkKKyAgIlVuZG8gdGhlIGxhc3QgY29tbWl0IG9uIEhFQUQsIGFuZCBzZXQgdGhpbmdzIHVwIHRvIGNvbW1pdCBhbgorYW1lbmRlZCB2ZXJzaW9uIG9mIGl0LiIKKyAgKGludGVyYWN0aXZlKQorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgICh3aGVuIChnaXQtZW1wdHktZGItcCkgKGVycm9yICJObyBjb21taXQgdG8gYW1lbmQuIikpCisgIChsZXQqICgoY29tbWl0IChnaXQtcmV2LXBhcnNlICJIRUFEIikpCisgICAgICAgICAoZmlsZXMgKGdpdC1nZXQtY29tbWl0LWZpbGVzIGNvbW1pdCkpKQorICAgICh3aGVuIChnaXQtY2FsbC1wcm9jZXNzLWRpc3BsYXktZXJyb3IgInJlc2V0IiAiLS1zb2Z0IiAiSEVBRF4iKQorICAgICAgKGdpdC11cGRhdGUtc3RhdHVzLWZpbGVzIChjb3B5LXNlcXVlbmNlIGZpbGVzKSAndXB0b2RhdGUpCisgICAgICAoZ2l0LW1hcmstZmlsZXMgZ2l0LXN0YXR1cyBmaWxlcykKKyAgICAgIChnaXQtcmVmcmVzaC1maWxlcykKKyAgICAgIChnaXQtc2V0dXAtY29tbWl0LWJ1ZmZlciBjb21taXQpCisgICAgICAoZ2l0LWNvbW1pdC1maWxlKSkpKQorCisoZGVmdW4gZ2l0LWZpbmQtZmlsZSAoKQorICAiVmlzaXQgdGhlIGN1cnJlbnQgZmlsZSBpbiBpdHMgb3duIGJ1ZmZlci4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAobGV0ICgoaW5mbyAoZXdvYy1kYXRhIChld29jLWxvY2F0ZSBnaXQtc3RhdHVzKSkpKQorICAgICh1bmxlc3MgKGdpdC1leHBhbmQtZGlyZWN0b3J5IGluZm8pCisgICAgICAoZmluZC1maWxlIChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbykpCisgICAgICAod2hlbiAoZXEgJ3VubWVyZ2VkIChnaXQtZmlsZWluZm8tPnN0YXRlIGluZm8pKQorICAgICAgICAoc21lcmdlLW1vZGUgMSkpKSkpCisKKyhkZWZ1biBnaXQtZmluZC1maWxlLW90aGVyLXdpbmRvdyAoKQorICAiVmlzaXQgdGhlIGN1cnJlbnQgZmlsZSBpbiBpdHMgb3duIGJ1ZmZlciBpbiBhbm90aGVyIHdpbmRvdy4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAobGV0ICgoaW5mbyAoZXdvYy1kYXRhIChld29jLWxvY2F0ZSBnaXQtc3RhdHVzKSkpKQorICAgIChmaW5kLWZpbGUtb3RoZXItd2luZG93IChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbykpCisgICAgKHdoZW4gKGVxICd1bm1lcmdlZCAoZ2l0LWZpbGVpbmZvLT5zdGF0ZSBpbmZvKSkKKyAgICAgIChzbWVyZ2UtbW9kZSkpKSkKKworKGRlZnVuIGdpdC1maW5kLWZpbGUtaW1lcmdlICgpCisgICJWaXNpdCB0aGUgY3VycmVudCBmaWxlIGluIGludGVyYWN0aXZlIG1lcmdlIG1vZGUuIgorICAoaW50ZXJhY3RpdmUpCisgICh1bmxlc3MgZ2l0LXN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgKGxldCAoKGluZm8gKGV3b2MtZGF0YSAoZXdvYy1sb2NhdGUgZ2l0LXN0YXR1cykpKSkKKyAgICAoZmluZC1maWxlIChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbykpCisgICAgKHNtZXJnZS1lZGlmZikpKQorCisoZGVmdW4gZ2l0LXZpZXctZmlsZSAoKQorICAiVmlldyB0aGUgY3VycmVudCBmaWxlIGluIGl0cyBvd24gYnVmZmVyLiIKKyAgKGludGVyYWN0aXZlKQorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgIChsZXQgKChpbmZvIChld29jLWRhdGEgKGV3b2MtbG9jYXRlIGdpdC1zdGF0dXMpKSkpCisgICAgKHZpZXctZmlsZSAoZ2l0LWZpbGVpbmZvLT5uYW1lIGluZm8pKSkpCisKKyhkZWZ1biBnaXQtcmVmcmVzaC1zdGF0dXMgKCkKKyAgIlJlZnJlc2ggdGhlIGdpdCBzdGF0dXMgYnVmZmVyLiIKKyAgKGludGVyYWN0aXZlKQorICAobGV0KiAoKHN0YXR1cyBnaXQtc3RhdHVzKQorICAgICAgICAgKHBvcyAoZXdvYy1sb2NhdGUgc3RhdHVzKSkKKyAgICAgICAgIChtYXJrZWQtZmlsZXMgKGdpdC1nZXQtZmlsZW5hbWVzIChld29jLWNvbGxlY3Qgc3RhdHVzIChsYW1iZGEgKGluZm8pIChnaXQtZmlsZWluZm8tPm1hcmtlZCBpbmZvKSkpKSkKKyAgICAgICAgIChjdXItbmFtZSAoYW5kIHBvcyAoZ2l0LWZpbGVpbmZvLT5uYW1lIChld29jLWRhdGEgcG9zKSkpKSkKKyAgICAodW5sZXNzIHN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgICAobWVzc2FnZSAiUmVmcmVzaGluZyBnaXQgc3RhdHVzLi4uIikKKyAgICAoZ2l0LWNhbGwtcHJvY2Vzcy1lbnYgbmlsIG5pbCAidXBkYXRlLWluZGV4IiAiLS1yZWZyZXNoIikKKyAgICAoZ2l0LWNsZWFyLXN0YXR1cyBzdGF0dXMpCisgICAgKGdpdC11cGRhdGUtc3RhdHVzLWZpbGVzIG5pbCkKKyAgICA7IHJlc3RvcmUgZmlsZSBtYXJrcworICAgICh3aGVuIG1hcmtlZC1maWxlcworICAgICAgKGdpdC1zdGF0dXMtZmlsZW5hbWVzLW1hcCBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAoaW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0ZiAoZ2l0LWZpbGVpbmZvLT5tYXJrZWQgaW5mbykgdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0ZiAoZ2l0LWZpbGVpbmZvLT5uZWVkcy1yZWZyZXNoIGluZm8pIHQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZWQtZmlsZXMpCisgICAgICAoZ2l0LXJlZnJlc2gtZmlsZXMpKQorICAgIDsgbW92ZSBwb2ludCB0byB0aGUgY3VycmVudCBmaWxlIG5hbWUgaWYgYW55CisgICAgKG1lc3NhZ2UgIlJlZnJlc2hpbmcgZ2l0IHN0YXR1cy4uLmRvbmUiKQorICAgIChsZXQgKChub2RlIChhbmQgY3VyLW5hbWUgKGdpdC1maW5kLXN0YXR1cy1maWxlIHN0YXR1cyBjdXItbmFtZSkpKSkKKyAgICAgICh3aGVuIG5vZGUgKGV3b2MtZ290by1ub2RlIHN0YXR1cyBub2RlKSkpKSkKKworKGRlZnVuIGdpdC1zdGF0dXMtcXVpdCAoKQorICAiUXVpdCBnaXQtc3RhdHVzIG1vZGUuIgorICAoaW50ZXJhY3RpdmUpCisgIChidXJ5LWJ1ZmZlcikpCisKKzs7OzsgTWFqb3IgTW9kZQorOzs7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKGRlZnZhciBnaXQtc3RhdHVzLW1vZGUtaG9vayBuaWwKKyAgIlJ1biBhZnRlciBgZ2l0LXN0YXR1cy1tb2RlJyBpcyBzZXR1cC4iKQorCisoZGVmdmFyIGdpdC1zdGF0dXMtbW9kZS1tYXAgbmlsCisgICJLZXltYXAgZm9yIGdpdCBtYWpvciBtb2RlLiIpCisKKyhkZWZ2YXIgZ2l0LXN0YXR1cyBuaWwKKyAgIkxpc3Qgb2YgYWxsIGZpbGVzIG1hbmFnZWQgYnkgdGhlIGdpdC1zdGF0dXMgbW9kZS4iKQorCisodW5sZXNzIGdpdC1zdGF0dXMtbW9kZS1tYXAKKyAgKGxldCAoKG1hcCAobWFrZS1rZXltYXApKQorICAgICAgICAoY29tbWl0LW1hcCAobWFrZS1zcGFyc2Uta2V5bWFwKSkKKyAgICAgICAgKGRpZmYtbWFwIChtYWtlLXNwYXJzZS1rZXltYXApKQorICAgICAgICAodG9nZ2xlLW1hcCAobWFrZS1zcGFyc2Uta2V5bWFwKSkpCisgICAgKHN1cHByZXNzLWtleW1hcCBtYXApCisgICAgKGRlZmluZS1rZXkgbWFwICI/IiAgICdnaXQtaGVscCkKKyAgICAoZGVmaW5lLWtleSBtYXAgImgiICAgJ2dpdC1oZWxwKQorICAgIChkZWZpbmUta2V5IG1hcCAiICIgICAnZ2l0LW5leHQtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgImEiICAgJ2dpdC1hZGQtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgImMiICAgJ2dpdC1jb21taXQtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgIlxDLWMiIGNvbW1pdC1tYXApCisgICAgKGRlZmluZS1rZXkgbWFwICJkIiAgICBkaWZmLW1hcCkKKyAgICAoZGVmaW5lLWtleSBtYXAgIj0iICAgJ2dpdC1kaWZmLWZpbGUpCisgICAgKGRlZmluZS1rZXkgbWFwICJmIiAgICdnaXQtZmluZC1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAiXHIiICAnZ2l0LWZpbmQtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgImciICAgJ2dpdC1yZWZyZXNoLXN0YXR1cykKKyAgICAoZGVmaW5lLWtleSBtYXAgImkiICAgJ2dpdC1pZ25vcmUtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgImwiICAgJ2dpdC1sb2ctZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgIm0iICAgJ2dpdC1tYXJrLWZpbGUpCisgICAgKGRlZmluZS1rZXkgbWFwICJNIiAgICdnaXQtbWFyay1hbGwpCisgICAgKGRlZmluZS1rZXkgbWFwICJuIiAgICdnaXQtbmV4dC1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAiTiIgICAnZ2l0LW5leHQtdW5tZXJnZWQtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgIm8iICAgJ2dpdC1maW5kLWZpbGUtb3RoZXItd2luZG93KQorICAgIChkZWZpbmUta2V5IG1hcCAicCIgICAnZ2l0LXByZXYtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgIlAiICAgJ2dpdC1wcmV2LXVubWVyZ2VkLWZpbGUpCisgICAgKGRlZmluZS1rZXkgbWFwICJxIiAgICdnaXQtc3RhdHVzLXF1aXQpCisgICAgKGRlZmluZS1rZXkgbWFwICJyIiAgICdnaXQtcmVtb3ZlLWZpbGUpCisgICAgKGRlZmluZS1rZXkgbWFwICJSIiAgICdnaXQtcmVzb2x2ZS1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAidCIgICAgdG9nZ2xlLW1hcCkKKyAgICAoZGVmaW5lLWtleSBtYXAgIlQiICAgJ2dpdC10b2dnbGUtYWxsLW1hcmtzKQorICAgIChkZWZpbmUta2V5IG1hcCAidSIgICAnZ2l0LXVubWFyay1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAiVSIgICAnZ2l0LXJldmVydC1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAidiIgICAnZ2l0LXZpZXctZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgIngiICAgJ2dpdC1yZW1vdmUtaGFuZGxlZCkKKyAgICAoZGVmaW5lLWtleSBtYXAgIlxDLT8iICdnaXQtdW5tYXJrLWZpbGUtdXApCisgICAgKGRlZmluZS1rZXkgbWFwICJcTS1cQy0/IiAnZ2l0LXVubWFyay1hbGwpCisgICAgOyB0aGUgY29tbWl0IHN1Ym1hcAorICAgIChkZWZpbmUta2V5IGNvbW1pdC1tYXAgIlxDLWEiICdnaXQtYW1lbmQtY29tbWl0KQorICAgIDsgdGhlIGRpZmYgc3VibWFwCisgICAgKGRlZmluZS1rZXkgZGlmZi1tYXAgImIiICdnaXQtZGlmZi1maWxlLWJhc2UpCisgICAgKGRlZmluZS1rZXkgZGlmZi1tYXAgImMiICdnaXQtZGlmZi1maWxlLWNvbWJpbmVkKQorICAgIChkZWZpbmUta2V5IGRpZmYtbWFwICI9IiAnZ2l0LWRpZmYtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBkaWZmLW1hcCAiZSIgJ2dpdC1kaWZmLWZpbGUtaWRpZmYpCisgICAgKGRlZmluZS1rZXkgZGlmZi1tYXAgIkUiICdnaXQtZmluZC1maWxlLWltZXJnZSkKKyAgICAoZGVmaW5lLWtleSBkaWZmLW1hcCAiaCIgJ2dpdC1kaWZmLWZpbGUtbWVyZ2UtaGVhZCkKKyAgICAoZGVmaW5lLWtleSBkaWZmLW1hcCAibSIgJ2dpdC1kaWZmLWZpbGUtbWluZSkKKyAgICAoZGVmaW5lLWtleSBkaWZmLW1hcCAibyIgJ2dpdC1kaWZmLWZpbGUtb3RoZXIpCisgICAgOyB0aGUgdG9nZ2xlIHN1Ym1hcAorICAgIChkZWZpbmUta2V5IHRvZ2dsZS1tYXAgInUiICdnaXQtdG9nZ2xlLXNob3ctdXB0b2RhdGUpCisgICAgKGRlZmluZS1rZXkgdG9nZ2xlLW1hcCAiaSIgJ2dpdC10b2dnbGUtc2hvdy1pZ25vcmVkKQorICAgIChkZWZpbmUta2V5IHRvZ2dsZS1tYXAgImsiICdnaXQtdG9nZ2xlLXNob3ctdW5rbm93bikKKyAgICAoZGVmaW5lLWtleSB0b2dnbGUtbWFwICJtIiAnZ2l0LXRvZ2dsZS1hbGwtbWFya3MpCisgICAgKHNldHEgZ2l0LXN0YXR1cy1tb2RlLW1hcCBtYXApKQorICAoZWFzeS1tZW51LWRlZmluZSBnaXQtbWVudSBnaXQtc3RhdHVzLW1vZGUtbWFwCisgICAgIkdpdCBNZW51IgorICAgIGAoIkdpdCIKKyAgICAgIFsiUmVmcmVzaCIgZ2l0LXJlZnJlc2gtc3RhdHVzIHRdCisgICAgICBbIkNvbW1pdCIgZ2l0LWNvbW1pdC1maWxlIHRdCisgICAgICAoIk1lcmdlIgorCVsiTmV4dCBVbm1lcmdlZCBGaWxlIiBnaXQtbmV4dC11bm1lcmdlZC1maWxlIHRdCisJWyJQcmV2IFVubWVyZ2VkIEZpbGUiIGdpdC1wcmV2LXVubWVyZ2VkLWZpbGUgdF0KKwlbIk1hcmsgYXMgUmVzb2x2ZWQiIGdpdC1yZXNvbHZlLWZpbGUgdF0KKwlbIkludGVyYWN0aXZlIE1lcmdlIEZpbGUiIGdpdC1maW5kLWZpbGUtaW1lcmdlIHRdCisJWyJEaWZmIEFnYWluc3QgQ29tbW9uIEJhc2UgRmlsZSIgZ2l0LWRpZmYtZmlsZS1iYXNlIHRdCisJWyJEaWZmIENvbWJpbmVkIiBnaXQtZGlmZi1maWxlLWNvbWJpbmVkIHRdCisJWyJEaWZmIEFnYWluc3QgTWVyZ2UgSGVhZCIgZ2l0LWRpZmYtZmlsZS1tZXJnZS1oZWFkIHRdCisJWyJEaWZmIEFnYWluc3QgTWluZSIgZ2l0LWRpZmYtZmlsZS1taW5lIHRdCisJWyJEaWZmIEFnYWluc3QgT3RoZXIiIGdpdC1kaWZmLWZpbGUtb3RoZXIgdF0pCisgICAgICAiLS0tLS0tLS0iCisgICAgICBbIkFkZCBGaWxlIiBnaXQtYWRkLWZpbGUgdF0KKyAgICAgIFsiUmV2ZXJ0IEZpbGUiIGdpdC1yZXZlcnQtZmlsZSB0XQorICAgICAgWyJJZ25vcmUgRmlsZSIgZ2l0LWlnbm9yZS1maWxlIHRdCisgICAgICBbIlJlbW92ZSBGaWxlIiBnaXQtcmVtb3ZlLWZpbGUgdF0KKyAgICAgICItLS0tLS0tLSIKKyAgICAgIFsiRmluZCBGaWxlIiBnaXQtZmluZC1maWxlIHRdCisgICAgICBbIlZpZXcgRmlsZSIgZ2l0LXZpZXctZmlsZSB0XQorICAgICAgWyJEaWZmIEZpbGUiIGdpdC1kaWZmLWZpbGUgdF0KKyAgICAgIFsiSW50ZXJhY3RpdmUgRGlmZiBGaWxlIiBnaXQtZGlmZi1maWxlLWlkaWZmIHRdCisgICAgICBbIkxvZyIgZ2l0LWxvZy1maWxlIHRdCisgICAgICAiLS0tLS0tLS0iCisgICAgICBbIk1hcmsiIGdpdC1tYXJrLWZpbGUgdF0KKyAgICAgIFsiTWFyayBBbGwiIGdpdC1tYXJrLWFsbCB0XQorICAgICAgWyJVbm1hcmsiIGdpdC11bm1hcmstZmlsZSB0XQorICAgICAgWyJVbm1hcmsgQWxsIiBnaXQtdW5tYXJrLWFsbCB0XQorICAgICAgWyJUb2dnbGUgQWxsIE1hcmtzIiBnaXQtdG9nZ2xlLWFsbC1tYXJrcyB0XQorICAgICAgWyJIaWRlIEhhbmRsZWQgRmlsZXMiIGdpdC1yZW1vdmUtaGFuZGxlZCB0XQorICAgICAgIi0tLS0tLS0tIgorICAgICAgWyJTaG93IFVwdG9kYXRlIEZpbGVzIiBnaXQtdG9nZ2xlLXNob3ctdXB0b2RhdGUgOnN0eWxlIHRvZ2dsZSA6c2VsZWN0ZWQgZ2l0LXNob3ctdXB0b2RhdGVdCisgICAgICBbIlNob3cgSWdub3JlZCBGaWxlcyIgZ2l0LXRvZ2dsZS1zaG93LWlnbm9yZWQgOnN0eWxlIHRvZ2dsZSA6c2VsZWN0ZWQgZ2l0LXNob3ctaWdub3JlZF0KKyAgICAgIFsiU2hvdyBVbmtub3duIEZpbGVzIiBnaXQtdG9nZ2xlLXNob3ctdW5rbm93biA6c3R5bGUgdG9nZ2xlIDpzZWxlY3RlZCBnaXQtc2hvdy11bmtub3duXQorICAgICAgIi0tLS0tLS0tIgorICAgICAgWyJRdWl0IiBnaXQtc3RhdHVzLXF1aXQgdF0pKSkKKworCis7OyBnaXQgbW9kZSBzaG91bGQgb25seSBydW4gaW4gdGhlICpnaXQgc3RhdHVzKiBidWZmZXIKKyhwdXQgJ2dpdC1zdGF0dXMtbW9kZSAnbW9kZS1jbGFzcyAnc3BlY2lhbCkKKworKGRlZnVuIGdpdC1zdGF0dXMtbW9kZSAoKQorICAiTWFqb3IgbW9kZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBHaXQuCitDb21tYW5kczoKK1xce2dpdC1zdGF0dXMtbW9kZS1tYXB9IgorICAoa2lsbC1hbGwtbG9jYWwtdmFyaWFibGVzKQorICAoYnVmZmVyLWRpc2FibGUtdW5kbykKKyAgKHNldHEgbW9kZS1uYW1lICJnaXQgc3RhdHVzIgorICAgICAgICBtYWpvci1tb2RlICdnaXQtc3RhdHVzLW1vZGUKKyAgICAgICAgZ29hbC1jb2x1bW4gMTcKKyAgICAgICAgYnVmZmVyLXJlYWQtb25seSB0KQorICAodXNlLWxvY2FsLW1hcCBnaXQtc3RhdHVzLW1vZGUtbWFwKQorICAobGV0ICgoYnVmZmVyLXJlYWQtb25seSBuaWwpKQorICAgIChlcmFzZS1idWZmZXIpCisgIChsZXQgKChzdGF0dXMgKGV3b2MtY3JlYXRlICdnaXQtZmlsZWluZm8tcHJldHR5cHJpbnQgIiIgIiIpKSkKKyAgICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdnaXQtc3RhdHVzKSBzdGF0dXMpKQorICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdsaXN0LWJ1ZmZlcnMtZGlyZWN0b3J5KSBkZWZhdWx0LWRpcmVjdG9yeSkKKyAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2dpdC1zaG93LXVwdG9kYXRlKQorICAobWFrZS1sb2NhbC12YXJpYWJsZSAnZ2l0LXNob3ctaWdub3JlZCkKKyAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2dpdC1zaG93LXVua25vd24pCisgIChydW4taG9va3MgJ2dpdC1zdGF0dXMtbW9kZS1ob29rKSkpCisKKyhkZWZ1biBnaXQtZmluZC1zdGF0dXMtYnVmZmVyIChkaXIpCisgICJGaW5kIHRoZSBnaXQgc3RhdHVzIGJ1ZmZlciBoYW5kbGluZyBhIHNwZWNpZmllZCBkaXJlY3RvcnkuIgorICAobGV0ICgobGlzdCAoYnVmZmVyLWxpc3QpKQorICAgICAgICAoZnVsbGRpciAoZXhwYW5kLWZpbGUtbmFtZSBkaXIpKQorICAgICAgICBmb3VuZCkKKyAgICAod2hpbGUgKGFuZCBsaXN0IChub3QgZm91bmQpKQorICAgICAgKGxldCAoKGJ1ZmZlciAoY2FyIGxpc3QpKSkKKyAgICAgICAgKHdpdGgtY3VycmVudC1idWZmZXIgYnVmZmVyCisgICAgICAgICAgKHdoZW4gKGFuZCBsaXN0LWJ1ZmZlcnMtZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLWVxdWFsIGZ1bGxkaXIgKGV4cGFuZC1maWxlLW5hbWUgbGlzdC1idWZmZXJzLWRpcmVjdG9yeSkpCisJCSAgICAgKGVxIG1ham9yLW1vZGUgJ2dpdC1zdGF0dXMtbW9kZSkpCisgICAgICAgICAgICAoc2V0cSBmb3VuZCBidWZmZXIpKSkpCisgICAgICAoc2V0cSBsaXN0IChjZHIgbGlzdCkpKQorICAgIGZvdW5kKSkKKworKGRlZnVuIGdpdC1zdGF0dXMgKGRpcikKKyAgIkVudHJ5IHBvaW50IGludG8gZ2l0LXN0YXR1cyBtb2RlLiIKKyAgKGludGVyYWN0aXZlICJEU2VsZWN0IGRpcmVjdG9yeTogIikKKyAgKHNldHEgZGlyIChnaXQtZ2V0LXRvcC1kaXIgZGlyKSkKKyAgKGlmIChmaWxlLWRpcmVjdG9yeS1wIChjb25jYXQgKGZpbGUtbmFtZS1hcy1kaXJlY3RvcnkgZGlyKSAiLmdpdCIpKQorICAgICAgKGxldCAoKGJ1ZmZlciAob3IgKGFuZCBnaXQtcmV1c2Utc3RhdHVzLWJ1ZmZlciAoZ2l0LWZpbmQtc3RhdHVzLWJ1ZmZlciBkaXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgKGNyZWF0ZS1maWxlLWJ1ZmZlciAoZXhwYW5kLWZpbGUtbmFtZSAiKmdpdC1zdGF0dXMqIiBkaXIpKSkpKQorICAgICAgICAoc3dpdGNoLXRvLWJ1ZmZlciBidWZmZXIpCisgICAgICAgIChjZCBkaXIpCisgICAgICAgIChnaXQtc3RhdHVzLW1vZGUpCisgICAgICAgIChnaXQtcmVmcmVzaC1zdGF0dXMpCisgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAgIChhZGQtaG9vayAnYWZ0ZXItc2F2ZS1ob29rICdnaXQtdXBkYXRlLXNhdmVkLWZpbGUpKQorICAgIChtZXNzYWdlICIlcyBpcyBub3QgYSBnaXQgd29ya2luZyB0cmVlLiIgZGlyKSkpCisKKyhkZWZ1biBnaXQtdXBkYXRlLXNhdmVkLWZpbGUgKCkKKyAgIlVwZGF0ZSB0aGUgY29ycmVzcG9uZGluZyBnaXQtc3RhdHVzIGJ1ZmZlciB3aGVuIGEgZmlsZSBpcyBzYXZlZC4KK01lYW50IHRvIGJlIHVzZWQgaW4gYGFmdGVyLXNhdmUtaG9vaycuIgorICAobGV0KiAoKGZpbGUgKGV4cGFuZC1maWxlLW5hbWUgYnVmZmVyLWZpbGUtbmFtZSkpCisgICAgICAgICAoZGlyIChjb25kaXRpb24tY2FzZSBuaWwgKGdpdC1nZXQtdG9wLWRpciAoZmlsZS1uYW1lLWRpcmVjdG9yeSBmaWxlKSkgKGVycm9yIG5pbCkpKQorICAgICAgICAgKGJ1ZmZlciAoYW5kIGRpciAoZ2l0LWZpbmQtc3RhdHVzLWJ1ZmZlciBkaXIpKSkpCisgICAgKHdoZW4gYnVmZmVyCisgICAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciBidWZmZXIKKyAgICAgICAgKGxldCAoKGZpbGVuYW1lIChmaWxlLXJlbGF0aXZlLW5hbWUgZmlsZSBkaXIpKSkKKyAgICAgICAgICA7IHNraXAgZmlsZXMgbG9jYXRlZCBpbnNpZGUgdGhlIC5naXQgZGlyZWN0b3J5CisgICAgICAgICAgKHVubGVzcyAoc3RyaW5nLW1hdGNoICJeXFwuZ2l0LyIgZmlsZW5hbWUpCisgICAgICAgICAgICAoZ2l0LWNhbGwtcHJvY2Vzcy1lbnYgbmlsIG5pbCAiYWRkIiAiLS1yZWZyZXNoIiAiLS0iIGZpbGVuYW1lKQorICAgICAgICAgICAgKGdpdC11cGRhdGUtc3RhdHVzLWZpbGVzIChsaXN0IGZpbGVuYW1lKSAndXB0b2RhdGUpKSkpKSkpCisKKyhkZWZ1biBnaXQtaGVscCAoKQorICAiRGlzcGxheSBoZWxwIGZvciBHaXQgbW9kZS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGRlc2NyaWJlLWZ1bmN0aW9uICdnaXQtc3RhdHVzLW1vZGUpKQorCisocHJvdmlkZSAnZ2l0KQorOzs7IGdpdC5lbCBlbmRzIGhlcmUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZW1hY3MvdmMtZ2l0LmVsIGIvY29udHJpYi9lbWFjcy92Yy1naXQuZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhmNmJlNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZW1hY3MvdmMtZ2l0LmVsCkBAIC0wLDAgKzEsMjE2IEBACis7OzsgdmMtZ2l0LmVsIC0tLSBWQyBiYWNrZW5kIGZvciB0aGUgZ2l0IHZlcnNpb24gY29udHJvbCBzeXN0ZW0KKworOzsgQ29weXJpZ2h0IChDKSAyMDA2IEFsZXhhbmRyZSBKdWxsaWFyZAorCis7OyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7OyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworOzsgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKzs7IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOzsKKzs7IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKzs7IHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKzs7IHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKzs7IFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7OworOzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCis7OyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCis7OyBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorOzsgTUEgMDIxMTEtMTMwNyBVU0EKKworOzs7IENvbW1lbnRhcnk6CisKKzs7IFRoaXMgZmlsZSBjb250YWlucyBhIFZDIGJhY2tlbmQgZm9yIHRoZSBnaXQgdmVyc2lvbiBjb250cm9sCis7OyBzeXN0ZW0uCis7OworOzsgVG8gaW5zdGFsbDogcHV0IHRoaXMgZmlsZSBvbiB0aGUgbG9hZC1wYXRoIGFuZCBhZGQgR0lUIHRvIHRoZSBsaXN0Cis7OyBvZiBzdXBwb3J0ZWQgYmFja2VuZHMgaW4gYHZjLWhhbmRsZWQtYmFja2VuZHMnOyB0aGUgZm9sbG93aW5nIGxpbmUsCis7OyBwbGFjZWQgaW4geW91ciB+Ly5lbWFjcywgd2lsbCBhY2NvbXBsaXNoIHRoaXM6Cis7OworOzsgICAgIChhZGQtdG8tbGlzdCAndmMtaGFuZGxlZC1iYWNrZW5kcyAnR0lUKQorOzsKKzs7IFRPRE8KKzs7ICAtIGNoYW5nZWxvZyBnZW5lcmF0aW9uCis7OyAgLSB3b3JraW5nIHdpdGggcmV2aXNpb25zIG90aGVyIHRoYW4gSEVBRAorOzsKKworKGV2YWwtd2hlbi1jb21waWxlIChyZXF1aXJlICdjbCkpCisKKyhkZWZ2YXIgZ2l0LWNvbW1pdHMtY29kaW5nLXN5c3RlbSAndXRmLTgKKyAgIkRlZmF1bHQgY29kaW5nIHN5c3RlbSBmb3IgZ2l0IGNvbW1pdHMuIikKKworKGRlZnVuIHZjLWdpdC0tcnVuLWNvbW1hbmQtc3RyaW5nIChmaWxlICZyZXN0IGFyZ3MpCisgICJSdW4gYSBnaXQgY29tbWFuZCBvbiBGSUxFIGFuZCByZXR1cm4gaXRzIG91dHB1dCBhcyBzdHJpbmcuIgorICAobGV0KiAoKG9rIHQpCisgICAgICAgICAoc3RyICh3aXRoLW91dHB1dC10by1zdHJpbmcKKyAgICAgICAgICAgICAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciBzdGFuZGFyZC1vdXRwdXQKKyAgICAgICAgICAgICAgICAgICh1bmxlc3MgKGVxIDAgKGFwcGx5ICMnY2FsbC1wcm9jZXNzICJnaXQiIG5pbCAnKHQgbmlsKSBuaWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcHBlbmQgYXJncyAobGlzdCAoZmlsZS1yZWxhdGl2ZS1uYW1lIGZpbGUpKSkpKQorICAgICAgICAgICAgICAgICAgICAoc2V0cSBvayBuaWwpKSkpKSkKKyAgICAoYW5kIG9rIHN0cikpKQorCisoZGVmdW4gdmMtZ2l0LS1ydW4tY29tbWFuZCAoZmlsZSAmcmVzdCBhcmdzKQorICAiUnVuIGEgZ2l0IGNvbW1hbmQgb24gRklMRSwgZGlzY2FyZGluZyBhbnkgb3V0cHV0LiIKKyAgKGxldCAoKG5hbWUgKGZpbGUtcmVsYXRpdmUtbmFtZSBmaWxlKSkpCisgICAgKGVxIDAgKGFwcGx5ICMnY2FsbC1wcm9jZXNzICJnaXQiIG5pbCAoZ2V0LWJ1ZmZlciAiKk1lc3NhZ2VzIikgbmlsIChhcHBlbmQgYXJncyAobGlzdCBuYW1lKSkpKSkpCisKKyhkZWZ1biB2Yy1naXQtcmVnaXN0ZXJlZCAoZmlsZSkKKyAgIkNoZWNrIHdoZXRoZXIgRklMRSBpcyByZWdpc3RlcmVkIHdpdGggZ2l0LiIKKyAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAobGV0KiAoKGRpciAoZmlsZS1uYW1lLWRpcmVjdG9yeSBmaWxlKSkKKyAgICAgICAgICAgKG5hbWUgKGZpbGUtcmVsYXRpdmUtbmFtZSBmaWxlIGRpcikpKQorICAgICAgKGFuZCAoaWdub3JlLWVycm9ycworICAgICAgICAgICAgICh3aGVuIGRpciAoY2QgZGlyKSkKKyAgICAgICAgICAgICAoZXEgMCAoY2FsbC1wcm9jZXNzICJnaXQiIG5pbCAnKHQgbmlsKSBuaWwgImxzLWZpbGVzIiAiLWMiICIteiIgIi0tIiBuYW1lKSkpCisgICAgICAgICAgIChsZXQgKChzdHIgKGJ1ZmZlci1zdHJpbmcpKSkKKyAgICAgICAgICAgICAoYW5kICg+IChsZW5ndGggc3RyKSAobGVuZ3RoIG5hbWUpKQorICAgICAgICAgICAgICAgICAgKHN0cmluZz0gKHN1YnN0cmluZyBzdHIgMCAoMSsgKGxlbmd0aCBuYW1lKSkpIChjb25jYXQgbmFtZSAiXDAiKSkpKSkpKSkKKworKGRlZnVuIHZjLWdpdC1zdGF0ZSAoZmlsZSkKKyAgImdpdC1zcGVjaWZpYyB2ZXJzaW9uIG9mIGB2Yy1zdGF0ZScuIgorICAobGV0ICgoZGlmZiAodmMtZ2l0LS1ydW4tY29tbWFuZC1zdHJpbmcgZmlsZSAiZGlmZi1pbmRleCIgIi16IiAiSEVBRCIgIi0tIikpKQorICAgIChpZiAoYW5kIGRpZmYgKHN0cmluZy1tYXRjaCAiOlswLTddXFx7NlxcfSBbMC03XVxcezZcXH0gWzAtOWEtZl1cXHs0MFxcfSBbMC05YS1mXVxcezQwXFx9IFtBRE1VXVwwW15cMF0rXDAiIGRpZmYpKQorICAgICAgICAnZWRpdGVkCisgICAgICAndXAtdG8tZGF0ZSkpKQorCisoZGVmdW4gdmMtZ2l0LXdvcmtmaWxlLXZlcnNpb24gKGZpbGUpCisgICJnaXQtc3BlY2lmaWMgdmVyc2lvbiBvZiBgdmMtd29ya2ZpbGUtdmVyc2lvbicuIgorICAobGV0ICgoc3RyICh3aXRoLW91dHB1dC10by1zdHJpbmcKKyAgICAgICAgICAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIHN0YW5kYXJkLW91dHB1dAorICAgICAgICAgICAgICAgICAoY2FsbC1wcm9jZXNzICJnaXQiIG5pbCAnKHQgbmlsKSBuaWwgInN5bWJvbGljLXJlZiIgIkhFQUQiKSkpKSkKKyAgICAoaWYgKHN0cmluZy1tYXRjaCAiXlxcKHJlZnMvaGVhZHMvXFwpP1xcKC4rXFwpJCIgc3RyKQorICAgICAgICAobWF0Y2gtc3RyaW5nIDIgc3RyKQorICAgICAgc3RyKSkpCisKKyhkZWZ1biB2Yy1naXQtc3ltYm9saWMtY29tbWl0IChjb21taXQpCisgICJUcmFuc2xhdGUgQ09NTUlUIHN0cmluZyBpbnRvIHN5bWJvbGljIGZvcm0uCitSZXR1cm5zIG5pbCBpZiBub3QgcG9zc2libGUuIgorICAoYW5kIGNvbW1pdAorICAgICAgICh3aXRoLXRlbXAtYnVmZmVyCisJIChhbmQKKwkgICh6ZXJvcAorCSAgIChjYWxsLXByb2Nlc3MgImdpdCIgbmlsICcodCBuaWwpIG5pbCAibmFtZS1yZXYiCisJCQkgIi0tbmFtZS1vbmx5IiAiLS10YWdzIgorCQkJIGNvbW1pdCkpCisJICAoZ290by1jaGFyIChwb2ludC1taW4pKQorCSAgKD0gKGZvcndhcmQtbGluZSAyKSAxKQorCSAgKGJvbHApCisJICAoYnVmZmVyLXN1YnN0cmluZy1uby1wcm9wZXJ0aWVzIChwb2ludC1taW4pICgxLSAocG9pbnQtbWF4KSkpKSkpKQorCisoZGVmdW4gdmMtZ2l0LXByZXZpb3VzLXZlcnNpb24gKGZpbGUgcmV2KQorICAiZ2l0LXNwZWNpZmljIHZlcnNpb24gb2YgYHZjLXByZXZpb3VzLXZlcnNpb24nLiIKKyAgKGxldCAoKGRlZmF1bHQtZGlyZWN0b3J5IChmaWxlLW5hbWUtZGlyZWN0b3J5IChleHBhbmQtZmlsZS1uYW1lIGZpbGUpKSkKKwkoZmlsZSAoZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSBmaWxlKSkpCisgICAgKHZjLWdpdC1zeW1ib2xpYy1jb21taXQKKyAgICAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAgICAoYW5kCisJKHplcm9wCisJIChjYWxsLXByb2Nlc3MgImdpdCIgbmlsICcodCBuaWwpIG5pbCAicmV2LWxpc3QiCisJCSAgICAgICAiLTIiIHJldiAiLS0iIGZpbGUpKQorCShnb3RvLWNoYXIgKHBvaW50LW1heCkpCisJKGJvbHApCisJKHplcm9wIChmb3J3YXJkLWxpbmUgLTEpKQorCShub3QgKGJvYnApKQorCShidWZmZXItc3Vic3RyaW5nLW5vLXByb3BlcnRpZXMKKwkgICAocG9pbnQpCisJICAgKDEtIChwb2ludC1tYXgpKSkpKSkpKQorCisoZGVmdW4gdmMtZ2l0LW5leHQtdmVyc2lvbiAoZmlsZSByZXYpCisgICJnaXQtc3BlY2lmaWMgdmVyc2lvbiBvZiBgdmMtbmV4dC12ZXJzaW9uJy4iCisgIChsZXQqICgoZGVmYXVsdC1kaXJlY3RvcnkgKGZpbGUtbmFtZS1kaXJlY3RvcnkKKwkJCSAgICAgKGV4cGFuZC1maWxlLW5hbWUgZmlsZSkpKQorCShmaWxlIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IGZpbGUpKQorCShjdXJyZW50LXJldgorCSAod2l0aC10ZW1wLWJ1ZmZlcgorCSAgIChhbmQKKwkgICAgKHplcm9wCisJICAgICAoY2FsbC1wcm9jZXNzICJnaXQiIG5pbCAnKHQgbmlsKSBuaWwgInJldi1saXN0IgorCQkJICAgIi0xIiByZXYgIi0tIiBmaWxlKSkKKwkgICAgKGdvdG8tY2hhciAocG9pbnQtbWF4KSkKKwkgICAgKGJvbHApCisJICAgICh6ZXJvcCAoZm9yd2FyZC1saW5lIC0xKSkKKwkgICAgKGJvYnApCisJICAgIChidWZmZXItc3Vic3RyaW5nLW5vLXByb3BlcnRpZXMKKwkgICAgIChwb2ludCkKKwkgICAgICgxLSAocG9pbnQtbWF4KSkpKSkpKQorICAgIChhbmQgY3VycmVudC1yZXYKKwkgKHZjLWdpdC1zeW1ib2xpYy1jb21taXQKKwkgICh3aXRoLXRlbXAtYnVmZmVyCisJICAgIChhbmQKKwkgICAgICh6ZXJvcAorCSAgICAgIChjYWxsLXByb2Nlc3MgImdpdCIgbmlsICcodCBuaWwpIG5pbCAicmV2LWxpc3QiCisJCQkgICAgIkhFQUQiICItLSIgZmlsZSkpCisJICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorCSAgICAgKHNlYXJjaC1mb3J3YXJkIGN1cnJlbnQtcmV2IG5pbCB0KQorCSAgICAgKHplcm9wIChmb3J3YXJkLWxpbmUgLTEpKQorCSAgICAgKGJ1ZmZlci1zdWJzdHJpbmctbm8tcHJvcGVydGllcworCSAgICAgIChwb2ludCkKKwkgICAgICAocHJvZ24gKGZvcndhcmQtbGluZSAxKSAoMS0gKHBvaW50KSkpKSkpKSkpKQorCisoZGVmdW4gdmMtZ2l0LXJldmVydCAoZmlsZSAmb3B0aW9uYWwgY29udGVudHMtZG9uZSkKKyAgIlJldmVydCBGSUxFIHRvIHRoZSB2ZXJzaW9uIHN0b3JlZCBpbiB0aGUgZ2l0IHJlcG9zaXRvcnkuIgorICAoaWYgY29udGVudHMtZG9uZQorICAgICAgKHZjLWdpdC0tcnVuLWNvbW1hbmQgZmlsZSAidXBkYXRlLWluZGV4IiAiLS0iKQorICAgICh2Yy1naXQtLXJ1bi1jb21tYW5kIGZpbGUgImNoZWNrb3V0IiAiSEVBRCIpKSkKKworKGRlZnVuIHZjLWdpdC1jaGVja291dC1tb2RlbCAoZmlsZSkKKyAgJ2ltcGxpY2l0KQorCisoZGVmdW4gdmMtZ2l0LXdvcmtmaWxlLXVuY2hhbmdlZC1wIChmaWxlKQorICAobGV0ICgoc2hhMSAodmMtZ2l0LS1ydW4tY29tbWFuZC1zdHJpbmcgZmlsZSAiaGFzaC1vYmplY3QiICItLSIpKQorICAgICAgICAoaGVhZCAodmMtZ2l0LS1ydW4tY29tbWFuZC1zdHJpbmcgZmlsZSAibHMtdHJlZSIgIi16IiAiSEVBRCIgIi0tIikpKQorICAgIChhbmQgaGVhZAorICAgICAgICAgKHN0cmluZy1tYXRjaCAiWzAtN11cXHs2XFx9IGJsb2IgXFwoWzAtOWEtZl1cXHs0MFxcfVxcKVx0W15cMF0rXDAiIGhlYWQpCisgICAgICAgICAoc3RyaW5nPSAoY2FyIChzcGxpdC1zdHJpbmcgc2hhMSAiXG4iKSkgKG1hdGNoLXN0cmluZyAxIGhlYWQpKSkpKQorCisoZGVmdW4gdmMtZ2l0LXJlZ2lzdGVyIChmaWxlICZvcHRpb25hbCByZXYgY29tbWVudCkKKyAgIlJlZ2lzdGVyIEZJTEUgaW50byB0aGUgZ2l0IHZlcnNpb24tY29udHJvbCBzeXN0ZW0uIgorICAodmMtZ2l0LS1ydW4tY29tbWFuZCBmaWxlICJ1cGRhdGUtaW5kZXgiICItLWFkZCIgIi0tIikpCisKKyhkZWZ1biB2Yy1naXQtcHJpbnQtbG9nIChmaWxlICZvcHRpb25hbCBidWZmZXIpCisgIChsZXQgKChuYW1lIChmaWxlLXJlbGF0aXZlLW5hbWUgZmlsZSkpCisgICAgICAgIChjb2Rpbmctc3lzdGVtLWZvci1yZWFkIGdpdC1jb21taXRzLWNvZGluZy1zeXN0ZW0pKQorICAgICh2Yy1kby1jb21tYW5kIGJ1ZmZlciAnYXN5bmMgImdpdCIgbmFtZSAicmV2LWxpc3QiICItLXByZXR0eSIgIkhFQUQiICItLSIpKSkKKworKGRlZnVuIHZjLWdpdC1kaWZmIChmaWxlICZvcHRpb25hbCByZXYxIHJldjIgYnVmZmVyKQorICAobGV0ICgobmFtZSAoZmlsZS1yZWxhdGl2ZS1uYW1lIGZpbGUpKQorICAgICAgICAoYnVmIChvciBidWZmZXIgIip2Yy1kaWZmKiIpKSkKKyAgICAoaWYgKGFuZCByZXYxIHJldjIpCisgICAgICAgICh2Yy1kby1jb21tYW5kIGJ1ZiAwICJnaXQiIG5hbWUgImRpZmYtdHJlZSIgIi1wIiByZXYxIHJldjIgIi0tIikKKyAgICAgICh2Yy1kby1jb21tYW5kIGJ1ZiAwICJnaXQiIG5hbWUgImRpZmYtaW5kZXgiICItcCIgKG9yIHJldjEgIkhFQUQiKSAiLS0iKSkKKyAgICA7IGdpdC1kaWZmLWluZGV4IGRvZXNuJ3Qgc2V0IGV4aXQgc3RhdHVzIGxpa2UgZGlmZiBkb2VzCisgICAgKGlmICh2Yy1naXQtd29ya2ZpbGUtdW5jaGFuZ2VkLXAgZmlsZSkgMCAxKSkpCisKKyhkZWZ1biB2Yy1naXQtY2hlY2tpbiAoZmlsZSByZXYgY29tbWVudCkKKyAgKGxldCAoKGNvZGluZy1zeXN0ZW0tZm9yLXdyaXRlIGdpdC1jb21taXRzLWNvZGluZy1zeXN0ZW0pKQorICAgICh2Yy1naXQtLXJ1bi1jb21tYW5kIGZpbGUgImNvbW1pdCIgIi1tIiBjb21tZW50ICItLW9ubHkiICItLSIpKSkKKworKGRlZnVuIHZjLWdpdC1jaGVja291dCAoZmlsZSAmb3B0aW9uYWwgZWRpdGFibGUgcmV2IGRlc3RmaWxlKQorICAoaWYgZGVzdGZpbGUKKyAgICAgIChsZXQgKChmdWxsbmFtZSAoc3Vic3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICh2Yy1naXQtLXJ1bi1jb21tYW5kLXN0cmluZyBmaWxlICJscy1maWxlcyIgIi16IiAiLS1mdWxsLW5hbWUiICItLSIpCisgICAgICAgICAgICAgICAgICAgICAgIDAgLTEpKQorICAgICAgICAgICAgKGNvZGluZy1zeXN0ZW0tZm9yLXJlYWQgJ25vLWNvbnZlcnNpb24pCisgICAgICAgICAgICAoY29kaW5nLXN5c3RlbS1mb3Itd3JpdGUgJ25vLWNvbnZlcnNpb24pKQorICAgICAgICAod2l0aC10ZW1wLWZpbGUgZGVzdGZpbGUKKyAgICAgICAgICAoZXEgMCAoY2FsbC1wcm9jZXNzICJnaXQiIG5pbCB0IG5pbCAiY2F0LWZpbGUiICJibG9iIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmNhdCAob3IgcmV2ICJIRUFEIikgIjoiIGZ1bGxuYW1lKSkpKSkKKyAgICAodmMtZ2l0LS1ydW4tY29tbWFuZCBmaWxlICJjaGVja291dCIgKG9yIHJldiAiSEVBRCIpKSkpCisKKyhkZWZ1biB2Yy1naXQtYW5ub3RhdGUtY29tbWFuZCAoZmlsZSBidWYgJm9wdGlvbmFsIHJldikKKyAgOyBGSVhNRTogcmV2IGlzIGlnbm9yZWQKKyAgKGxldCAoKG5hbWUgKGZpbGUtcmVsYXRpdmUtbmFtZSBmaWxlKSkpCisgICAgKGNhbGwtcHJvY2VzcyAiZ2l0IiBuaWwgYnVmIG5pbCAiYmxhbWUiIG5hbWUpKSkKKworKGRlZnVuIHZjLWdpdC1hbm5vdGF0ZS10aW1lICgpCisgIChhbmQgKHJlLXNlYXJjaC1mb3J3YXJkICJbMC05YS1mXSsgKC4qIFxcKFswLTldK1xcKS1cXChbMC05XStcXCktXFwoWzAtOV0rXFwpIFxcKFswLTldK1xcKTpcXChbMC05XStcXCk6XFwoWzAtOV0rXFwpIFxcKFstKzAtOV0rXFwpICtbMC05XSspIiBuaWwgdCkKKyAgICAgICAodmMtYW5ub3RhdGUtY29udmVydC10aW1lCisgICAgICAgIChhcHBseSAjJ2VuY29kZS10aW1lIChtYXBjYXIgKGxhbWJkYSAobWF0Y2gpIChzdHJpbmctdG8tbnVtYmVyIChtYXRjaC1zdHJpbmcgbWF0Y2gpKSkgJyg2IDUgNCAzIDIgMSA3KSkpKSkpCisKKzs7IE5vdCByZWFsbHkgdXNlZnVsIHNpbmNlIHdlIGNhbid0IGRvIGFueXRoaW5nIHdpdGggdGhlIHJldmlzaW9uIHlldAorOzsoZGVmdW4gdmMtYW5ub3RhdGUtZXh0cmFjdC1yZXZpc2lvbi1hdC1saW5lICgpCis7OyAgKHNhdmUtZXhjdXJzaW9uCis7OyAgICAobW92ZS1iZWdpbm5pbmctb2YtbGluZSAxKQorOzsgICAgKGFuZCAobG9va2luZy1hdCAiWzAtOWEtZl0rIikKKzs7ICAgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKG1hdGNoLWJlZ2lubmluZyAwKSAobWF0Y2gtZW5kIDApKSkpKQorCisocHJvdmlkZSAndmMtZ2l0KQpkaWZmIC0tZ2l0IGEvY29udHJpYi9leGFtcGxlcy9naXQtY2hlY2tvdXQuc2ggYi9jb250cmliL2V4YW1wbGVzL2dpdC1jaGVja291dC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYTc2ODlhCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9leGFtcGxlcy9naXQtY2hlY2tvdXQuc2gKQEAgLTAsMCArMSwzMDIgQEAKKyMhL2Jpbi9zaAorCitPUFRJT05TX0tFRVBEQVNIREFTSD10CitPUFRJT05TX1NQRUM9IlwKK2dpdC1jaGVja291dCBbb3B0aW9uc10gWzxicmFuY2g+XSBbPHBhdGhzPi4uLl0KKy0tCitiPSAgICAgICAgICBjcmVhdGUgYSBuZXcgYnJhbmNoIHN0YXJ0ZWQgYXQgPGJyYW5jaD4KK2wgICAgICAgICAgIGNyZWF0ZSB0aGUgbmV3IGJyYW5jaCdzIHJlZmxvZwordHJhY2sgICAgICAgYXJyYW5nZSB0aGF0IHRoZSBuZXcgYnJhbmNoIHRyYWNrcyB0aGUgcmVtb3RlIGJyYW5jaAorZiAgICAgICAgICAgcHJvY2VlZCBldmVuIGlmIHRoZSBpbmRleCBvciB3b3JraW5nIHRyZWUgaXMgbm90IEhFQUQKK20gICAgICAgICAgIG1lcmdlIGxvY2FsIG1vZGlmaWNhdGlvbnMgaW50byB0aGUgbmV3IGJyYW5jaAorcSxxdWlldCAgICAgYmUgcXVpZXQKKyIKK1NVQkRJUkVDVE9SWV9PSz1Tb21ldGltZXMKKy4gZ2l0LXNoLXNldHVwCityZXF1aXJlX3dvcmtfdHJlZQorCitvbGRfbmFtZT1IRUFECitvbGQ9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5ICRvbGRfbmFtZSAyPi9kZXYvbnVsbCkKK29sZGJyYW5jaD0kKGdpdCBzeW1ib2xpYy1yZWYgJG9sZF9uYW1lIDI+L2Rldi9udWxsKQorbmV3PQorbmV3X25hbWU9Citmb3JjZT0KK2JyYW5jaD0KK3RyYWNrPQorbmV3YnJhbmNoPQorbmV3YnJhbmNoX2xvZz0KK21lcmdlPQorcXVpZXQ9Cit2PS12CitMRj0nCisnCisKK3doaWxlIHRlc3QgJCMgIT0gMDsgZG8KKwljYXNlICIkMSIgaW4KKwktYikKKwkJc2hpZnQKKwkJbmV3YnJhbmNoPSIkMSIKKwkJWyAteiAiJG5ld2JyYW5jaCIgXSAmJgorCQkJZGllICJnaXQgY2hlY2tvdXQ6IC1iIG5lZWRzIGEgYnJhbmNoIG5hbWUiCisJCWdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0IC0tICJyZWZzL2hlYWRzLyRuZXdicmFuY2giICYmCisJCQlkaWUgImdpdCBjaGVja291dDogYnJhbmNoICRuZXdicmFuY2ggYWxyZWFkeSBleGlzdHMiCisJCWdpdCBjaGVjay1yZWYtZm9ybWF0ICJoZWFkcy8kbmV3YnJhbmNoIiB8fAorCQkJZGllICJnaXQgY2hlY2tvdXQ6IHdlIGRvIG5vdCBsaWtlICckbmV3YnJhbmNoJyBhcyBhIGJyYW5jaCBuYW1lLiIKKwkJOzsKKwktbCkKKwkJbmV3YnJhbmNoX2xvZz0tbAorCQk7OworCS0tdHJhY2t8LS1uby10cmFjaykKKwkJdHJhY2s9IiQxIgorCQk7OworCS1mKQorCQlmb3JjZT0xCisJCTs7CisJLW0pCisJCW1lcmdlPTEKKwkJOzsKKwktcXwtLXF1aWV0KQorCQlxdWlldD0xCisJCXY9CisJCTs7CisJLS0pCisJCXNoaWZ0CisJCWJyZWFrCisJCTs7CisJKikKKwkJdXNhZ2UKKwkJOzsKKwllc2FjCisJc2hpZnQKK2RvbmUKKworYXJnPSIkMSIKK3Jldj0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgIiRhcmciIDI+L2Rldi9udWxsKQoraWYgcmV2PSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAiJHJldl4wIiAyPi9kZXYvbnVsbCkKK3RoZW4KKwlbIC16ICIkcmV2IiBdICYmIGRpZSAidW5rbm93biBmbGFnICRhcmciCisJbmV3X25hbWU9IiRhcmciCisJaWYgZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IC0tcXVpZXQgLS0gInJlZnMvaGVhZHMvJGFyZyIKKwl0aGVuCisJCXJldj0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgInJlZnMvaGVhZHMvJGFyZ14wIikKKwkJYnJhbmNoPSIkYXJnIgorCWZpCisJbmV3PSIkcmV2IgorCXNoaWZ0CitlbGlmIHJldj0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgIiRyZXZee3RyZWV9IiAyPi9kZXYvbnVsbCkKK3RoZW4KKwkjIGNoZWNraW5nIG91dCBzZWxlY3RlZCBwYXRocyBmcm9tIGEgdHJlZS1pc2guCisJbmV3PSIkcmV2IgorCW5ld19uYW1lPSIkcmV2Xnt0cmVlfSIKKwlzaGlmdAorZmkKK1sgIiQxIiA9ICItLSIgXSAmJiBzaGlmdAorCitjYXNlICIkbmV3YnJhbmNoLCR0cmFjayIgaW4KKywtLSopCisJZGllICJnaXQgY2hlY2tvdXQ6IC0tdHJhY2sgYW5kIC0tbm8tdHJhY2sgcmVxdWlyZSAtYiIKK2VzYWMKKworY2FzZSAiJGZvcmNlJG1lcmdlIiBpbgorMTEpCisJZGllICJnaXQgY2hlY2tvdXQ6IC1mIGFuZCAtbSBhcmUgaW5jb21wYXRpYmxlIgorZXNhYworCisjIFRoZSBiZWhhdmlvdXIgb2YgdGhlIGNvbW1hbmQgd2l0aCBhbmQgd2l0aG91dCBleHBsaWNpdCBwYXRoCisjIHBhcmFtZXRlcnMgaXMgcXVpdGUgZGlmZmVyZW50LgorIworIyBXaXRob3V0IHBhdGhzLCB3ZSBhcmUgY2hlY2tpbmcgb3V0IGV2ZXJ5dGhpbmcgaW4gdGhlIHdvcmsgdHJlZSwKKyMgcG9zc2libHkgc3dpdGNoaW5nIGJyYW5jaGVzLiAgVGhpcyBpcyB0aGUgdHJhZGl0aW9uYWwgYmVoYXZpb3VyLgorIworIyBXaXRoIHBhdGhzLCB3ZSBhcmUgX25ldmVyXyBzd2l0Y2hpbmcgYnJhbmNoLCBidXQgY2hlY2tpbmcgb3V0CisjIHRoZSBuYW1lZCBwYXRocyBmcm9tIGVpdGhlciBpbmRleCAod2hlbiBubyByZXYgaXMgZ2l2ZW4pLAorIyBvciB0aGUgbmFtZWQgdHJlZS1pc2ggKHdoZW4gcmV2IGlzIGdpdmVuKS4KKworaWYgdGVzdCAiJCMiIC1nZSAxCit0aGVuCisJaGludD0KKwlpZiB0ZXN0ICIkIyIgLWVxIDEKKwl0aGVuCisJCWhpbnQ9IgorRGlkIHlvdSBpbnRlbmQgdG8gY2hlY2tvdXQgJyRAJyB3aGljaCBjYW4gbm90IGJlIHJlc29sdmVkIGFzIGNvbW1pdD8iCisJZmkKKwlpZiB0ZXN0ICcnICE9ICIkbmV3YnJhbmNoJGZvcmNlJG1lcmdlIgorCXRoZW4KKwkJZGllICJnaXQgY2hlY2tvdXQ6IHVwZGF0aW5nIHBhdGhzIGlzIGluY29tcGF0aWJsZSB3aXRoIHN3aXRjaGluZyBicmFuY2hlcy9mb3JjaW5nJGhpbnQiCisJZmkKKwlpZiB0ZXN0ICcnICE9ICIkbmV3IgorCXRoZW4KKwkJIyBmcm9tIGEgc3BlY2lmaWMgdHJlZS1pc2g7IG5vdGUgdGhhdCB0aGlzIGlzIGZvcgorCQkjIHJlc2N1aW5nIHBhdGhzIGFuZCBpcyBuZXZlciBtZWFudCB0byByZW1vdmUgd2hhdAorCQkjIGlzIG5vdCBpbiB0aGUgbmFtZWQgdHJlZS1pc2guCisJCWdpdCBscy10cmVlIC0tZnVsbC1uYW1lIC1yICIkbmV3IiAiJEAiIHwKKwkJZ2l0IHVwZGF0ZS1pbmRleCAtLWluZGV4LWluZm8gfHwgZXhpdCAkPworCWZpCisKKwkjIE1ha2Ugc3VyZSB0aGUgcmVxdWVzdCBpcyBhYm91dCBleGlzdGluZyBwYXRocy4KKwlnaXQgbHMtZmlsZXMgLS1mdWxsLW5hbWUgLS1lcnJvci11bm1hdGNoIC0tICIkQCIgPi9kZXYvbnVsbCB8fCBleGl0CisJZ2l0IGxzLWZpbGVzIC0tZnVsbC1uYW1lIC0tICIkQCIgfAorCQkoY2RfdG9fdG9wbGV2ZWwgJiYgZ2l0IGNoZWNrb3V0LWluZGV4IC1mIC11IC0tc3RkaW4pCisKKwkjIFJ1biBhIHBvc3QtY2hlY2tvdXQgaG9vayAtLSB0aGUgSEVBRCBkb2VzIG5vdCBjaGFuZ2Ugc28gdGhlCisJIyBjdXJyZW50IEhFQUQgaXMgcGFzc2VkIGluIGZvciBib3RoIGFyZ3MKKwlpZiB0ZXN0IC14ICIkR0lUX0RJUiIvaG9va3MvcG9zdC1jaGVja291dDsgdGhlbgorCSAgICAiJEdJVF9ESVIiL2hvb2tzL3Bvc3QtY2hlY2tvdXQgJG9sZCAkb2xkIDAKKwlmaQorCisJZXhpdCAkPworZWxzZQorCSMgTWFrZSBzdXJlIHdlIGRpZCBub3QgZmFsbCBiYWNrIG9uICRhcmdee3RyZWV9IGNvZGVwYXRoCisJIyBzaW5jZSB3ZSBhcmUgbm90IGNoZWNraW5nIG91dCBmcm9tIGFuIGFyYml0cmFyeSB0cmVlLWlzaCwKKwkjIGJ1dCBzd2l0Y2hpbmcgYnJhbmNoZXMuCisJaWYgdGVzdCAnJyAhPSAiJG5ldyIKKwl0aGVuCisJCWdpdCByZXYtcGFyc2UgLS12ZXJpZnkgIiRuZXdee2NvbW1pdH0iID4vZGV2L251bGwgMj4mMSB8fAorCQlkaWUgIkNhbm5vdCBzd2l0Y2ggYnJhbmNoIHRvIGEgbm9uLWNvbW1pdC4iCisJZmkKK2ZpCisKKyMgV2UgYXJlIHN3aXRjaGluZyBicmFuY2hlcyBhbmQgY2hlY2tpbmcgb3V0IHRyZWVzLCBzbworIyB3ZSAqTkVFRCogdG8gYmUgYXQgdGhlIHRvcGxldmVsLgorY2RfdG9fdG9wbGV2ZWwKKworWyAteiAiJG5ldyIgXSAmJiBuZXc9JG9sZCAmJiBuZXdfbmFtZT0iJG9sZF9uYW1lIgorCisjIElmIHdlIGRvbid0IGhhdmUgYW4gZXhpc3RpbmcgYnJhbmNoIHRoYXQgd2UncmUgc3dpdGNoaW5nIHRvLAorIyBhbmQgd2UgZG9uJ3QgaGF2ZSBhIG5ldyBicmFuY2ggbmFtZSBmb3IgdGhlIHRhcmdldCB3ZQorIyBhcmUgc3dpdGNoaW5nIHRvLCB0aGVuIHdlIGFyZSBkZXRhY2hpbmcgb3VyIEhFQUQgZnJvbSBhbnkKKyMgYnJhbmNoLiAgSG93ZXZlciwgaWYgImdpdCBjaGVja291dCBIRUFEIiBkZXRhY2hlcyB0aGUgSEVBRAorIyBmcm9tIHRoZSBjdXJyZW50IGJyYW5jaCwgZXZlbiB0aG91Z2ggdGhhdCBtYXkgYmUgbG9naWNhbGx5CisjIGNvcnJlY3QsIGl0IGZlZWxzIHNvbWV3aGF0IGZ1bm55LiAgTW9yZSBpbXBvcnRhbnRseSwgd2UgZG8gbm90CisjIHdhbnQgImdpdCBjaGVja291dCIgbm9yICJnaXQgY2hlY2tvdXQgLWYiIHRvIGRldGFjaCBIRUFELgorCitkZXRhY2hlZD0KK2RldGFjaF93YXJuPQorCitkZXNjcmliZV9kZXRhY2hlZF9oZWFkICgpIHsKKwl0ZXN0IC1uICIkcXVpZXQiIHx8IHsKKwkJcHJpbnRmID4mMiAiJDEgIgorCQlHSVRfUEFHRVI9IGdpdCBsb2cgPiYyIC0xIC0tcHJldHR5PW9uZWxpbmUgLS1hYmJyZXYtY29tbWl0ICIkMiIgLS0KKwl9Cit9CisKK2lmIHRlc3QgLXogIiRicmFuY2gkbmV3YnJhbmNoIiAmJiB0ZXN0ICIkbmV3X25hbWUiICE9ICIkb2xkX25hbWUiCit0aGVuCisJZGV0YWNoZWQ9IiRuZXciCisJaWYgdGVzdCAtbiAiJG9sZGJyYW5jaCIgJiYgdGVzdCAteiAiJHF1aWV0IgorCXRoZW4KKwkJZGV0YWNoX3dhcm49Ik5vdGU6IG1vdmluZyB0byBcIiRuZXdfbmFtZVwiIHdoaWNoIGlzbid0IGEgbG9jYWwgYnJhbmNoCitJZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgYnJhbmNoIGZyb20gdGhpcyBjaGVja291dCwgeW91IG1heSBkbyBzbworKG5vdyBvciBsYXRlcikgYnkgdXNpbmcgLWIgd2l0aCB0aGUgY2hlY2tvdXQgY29tbWFuZCBhZ2Fpbi4gRXhhbXBsZToKKyAgZ2l0IGNoZWNrb3V0IC1iIDxuZXdfYnJhbmNoX25hbWU+IgorCWZpCitlbGlmIHRlc3QgLXogIiRvbGRicmFuY2giICYmIHRlc3QgIiRuZXciICE9ICIkb2xkIgordGhlbgorCWRlc2NyaWJlX2RldGFjaGVkX2hlYWQgJ1ByZXZpb3VzIEhFQUQgcG9zaXRpb24gd2FzJyAiJG9sZCIKK2ZpCisKK2lmIFsgIlgkb2xkIiA9IFggXQordGhlbgorCWlmIHRlc3QgLXogIiRxdWlldCIKKwl0aGVuCisJCWVjaG8gPiYyICJ3YXJuaW5nOiBZb3UgYXBwZWFyIHRvIGJlIG9uIGEgYnJhbmNoIHlldCB0byBiZSBib3JuLiIKKwkJZWNobyA+JjIgIndhcm5pbmc6IEZvcmNpbmcgY2hlY2tvdXQgb2YgJG5ld19uYW1lLiIKKwlmaQorCWZvcmNlPTEKK2ZpCisKK2lmIFsgIiRmb3JjZSIgXQordGhlbgorICAgIGdpdCByZWFkLXRyZWUgJHYgLS1yZXNldCAtdSAkbmV3CitlbHNlCisgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLXJlZnJlc2ggPi9kZXYvbnVsbAorICAgIGdpdCByZWFkLXRyZWUgJHYgLW0gLXUgLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9LmdpdGlnbm9yZSAkb2xkICRuZXcgfHwgKAorCWNhc2UgIiRtZXJnZSwkdiIgaW4KKwksKikKKwkJZXhpdCAxIDs7CisJMSwpCisJCTs7ICMgcXVpZXQKKwkqKQorCQllY2hvID4mMiAiRmFsbGluZyBiYWNrIHRvIDMtd2F5IG1lcmdlLi4uIiA7OworCWVzYWMKKworCSMgTWF0Y2ggdGhlIGluZGV4IHRvIHRoZSB3b3JraW5nIHRyZWUsIGFuZCBkbyBhIHRocmVlLXdheS4KKwlnaXQgZGlmZi1maWxlcyAtLW5hbWUtb25seSB8IGdpdCB1cGRhdGUtaW5kZXggLS1yZW1vdmUgLS1zdGRpbiAmJgorCXdvcms9YGdpdCB3cml0ZS10cmVlYCAmJgorCWdpdCByZWFkLXRyZWUgJHYgLS1yZXNldCAtdSAkbmV3IHx8IGV4aXQKKworCWV2YWwgR0lUSEVBRF8kbmV3PScke25ld19uYW1lOi0ke2JyYW5jaDotJG5ld319JyAmJgorCWV2YWwgR0lUSEVBRF8kd29yaz1sb2NhbCAmJgorCWV4cG9ydCBHSVRIRUFEXyRuZXcgR0lUSEVBRF8kd29yayAmJgorCWdpdCBtZXJnZS1yZWN1cnNpdmUgJG9sZCAtLSAkbmV3ICR3b3JrCisKKwkjIERvIG5vdCByZWdpc3RlciB0aGUgY2xlYW5seSBtZXJnZWQgcGF0aHMgaW4gdGhlIGluZGV4IHlldC4KKwkjIHRoaXMgaXMgbm90IGEgcmVhbCBtZXJnZSBiZWZvcmUgY29tbWl0dGluZywgYnV0IGp1c3QgY2FycnlpbmcKKwkjIHRoZSB3b3JraW5nIHRyZWUgY2hhbmdlcyBhbG9uZy4KKwl1bm1lcmdlZD1gZ2l0IGxzLWZpbGVzIC11YAorCWdpdCByZWFkLXRyZWUgJHYgLS1yZXNldCAkbmV3CisJY2FzZSAiJHVubWVyZ2VkIiBpbgorCScnKQk7OworCSopCisJCSgKKwkJCXo0MD0wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisJCQllY2hvICIkdW5tZXJnZWQiIHwKKwkJCXNlZCAtZSAncy9eWzAtN10qIFswLTlhLWZdKiAvJyIwICR6NDAgLyIKKwkJCWVjaG8gIiR1bm1lcmdlZCIKKwkJKSB8IGdpdCB1cGRhdGUtaW5kZXggLS1pbmRleC1pbmZvCisJCTs7CisJZXNhYworCWV4aXQgMAorICAgICkKKyAgICBzYXZlZF9lcnI9JD8KKyAgICBpZiB0ZXN0ICIkc2F2ZWRfZXJyIiA9IDAgJiYgdGVzdCAteiAiJHF1aWV0IgorICAgIHRoZW4KKwlnaXQgZGlmZi1pbmRleCAtLW5hbWUtc3RhdHVzICIkbmV3IgorICAgIGZpCisgICAgKGV4aXQgJHNhdmVkX2VycikKK2ZpCisKKyMKKyMgU3dpdGNoIHRoZSBIRUFEIHBvaW50ZXIgdG8gdGhlIG5ldyBicmFuY2ggaWYgd2UKKyMgY2hlY2tlZCBvdXQgYSBicmFuY2ggaGVhZCwgYW5kIHJlbW92ZSBhbnkgcG90ZW50aWFsCisjIG9sZCBNRVJHRV9IRUFEJ3MgKHN1YnNlcXVlbnQgY29tbWl0cyB3aWxsIGNsZWFybHkgbm90CisjIGJlIGJhc2VkIG9uIHRoZW0sIHNpbmNlIHdlIHJlLXNldCB0aGUgaW5kZXgpCisjCitpZiBbICIkPyIgLWVxIDAgXTsgdGhlbgorCWlmIFsgIiRuZXdicmFuY2giIF07IHRoZW4KKwkJZ2l0IGJyYW5jaCAkdHJhY2sgJG5ld2JyYW5jaF9sb2cgIiRuZXdicmFuY2giICIkbmV3X25hbWUiIHx8IGV4aXQKKwkJYnJhbmNoPSIkbmV3YnJhbmNoIgorCWZpCisJaWYgdGVzdCAtbiAiJGJyYW5jaCIKKwl0aGVuCisJCW9sZF9icmFuY2hfbmFtZT1gZXhwciAieiRvbGRicmFuY2giIDogJ3pyZWZzL2hlYWRzL1woLipcKSdgCisJCUdJVF9ESVI9IiRHSVRfRElSIiBnaXQgc3ltYm9saWMtcmVmIC1tICJjaGVja291dDogbW92aW5nIGZyb20gJHtvbGRfYnJhbmNoX25hbWU6LSRvbGR9IHRvICRicmFuY2giIEhFQUQgInJlZnMvaGVhZHMvJGJyYW5jaCIKKwkJaWYgdGVzdCAtbiAiJHF1aWV0IgorCQl0aGVuCisJCQl0cnVlCSMgbm90aGluZworCQllbGlmIHRlc3QgInJlZnMvaGVhZHMvJGJyYW5jaCIgPSAiJG9sZGJyYW5jaCIKKwkJdGhlbgorCQkJZWNobyA+JjIgIkFscmVhZHkgb24gYnJhbmNoIFwiJGJyYW5jaFwiIgorCQllbHNlCisJCQllY2hvID4mMiAiU3dpdGNoZWQgdG8ke25ld2JyYW5jaDorIGEgbmV3fSBicmFuY2ggXCIkYnJhbmNoXCIiCisJCWZpCisJZWxpZiB0ZXN0IC1uICIkZGV0YWNoZWQiCisJdGhlbgorCQlvbGRfYnJhbmNoX25hbWU9YGV4cHIgInokb2xkYnJhbmNoIiA6ICd6cmVmcy9oZWFkcy9cKC4qXCknYAorCQlnaXQgdXBkYXRlLXJlZiAtLW5vLWRlcmVmIC1tICJjaGVja291dDogbW92aW5nIGZyb20gJHtvbGRfYnJhbmNoX25hbWU6LSRvbGR9IHRvICRhcmciIEhFQUQgIiRkZXRhY2hlZCIgfHwKKwkJCWRpZSAiQ2Fubm90IGRldGFjaCBIRUFEIgorCQlpZiB0ZXN0IC1uICIkZGV0YWNoX3dhcm4iCisJCXRoZW4KKwkJCWVjaG8gPiYyICIkZGV0YWNoX3dhcm4iCisJCWZpCisJCWRlc2NyaWJlX2RldGFjaGVkX2hlYWQgJ0hFQUQgaXMgbm93IGF0JyBIRUFECisJZmkKKwlybSAtZiAiJEdJVF9ESVIvTUVSR0VfSEVBRCIKK2Vsc2UKKwlleGl0IDEKK2ZpCisKKyMgUnVuIGEgcG9zdC1jaGVja291dCBob29rCitpZiB0ZXN0IC14ICIkR0lUX0RJUiIvaG9va3MvcG9zdC1jaGVja291dDsgdGhlbgorCSIkR0lUX0RJUiIvaG9va3MvcG9zdC1jaGVja291dCAkb2xkICRuZXcgMQorZmkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZXhhbXBsZXMvZ2l0LWNsZWFuLnNoIGIvY29udHJpYi9leGFtcGxlcy9naXQtY2xlYW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDFjOTVlOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZXhhbXBsZXMvZ2l0LWNsZWFuLnNoCkBAIC0wLDAgKzEsMTE4IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgUGF2ZWwgUm9za2luCisjCisKK09QVElPTlNfS0VFUERBU0hEQVNIPQorT1BUSU9OU19TUEVDPSJcCitnaXQtY2xlYW4gW29wdGlvbnNdIDxwYXRocz4uLi4KKworQ2xlYW4gdW50cmFja2VkIGZpbGVzIGZyb20gdGhlIHdvcmtpbmcgZGlyZWN0b3J5CisKK1doZW4gb3B0aW9uYWwgPHBhdGhzPi4uLiBhcmd1bWVudHMgYXJlIGdpdmVuLCB0aGUgcGF0aHMKK2FmZmVjdGVkIGFyZSBmdXJ0aGVyIGxpbWl0ZWQgdG8gdGhvc2UgdGhhdCBtYXRjaCB0aGVtLgorLS0KK2QgcmVtb3ZlIGRpcmVjdG9yaWVzIGFzIHdlbGwKK2Ygb3ZlcnJpZGUgY2xlYW4ucmVxdWlyZUZvcmNlIGFuZCBjbGVhbiBhbnl3YXkKK24gZG9uJ3QgcmVtb3ZlIGFueXRoaW5nLCBqdXN0IHNob3cgd2hhdCB3b3VsZCBiZSBkb25lCitxIGJlIHF1aWV0LCBvbmx5IHJlcG9ydCBlcnJvcnMKK3ggcmVtb3ZlIGlnbm9yZWQgZmlsZXMgYXMgd2VsbAorWCByZW1vdmUgb25seSBpZ25vcmVkIGZpbGVzIgorCitTVUJESVJFQ1RPUllfT0s9WWVzCisuIGdpdC1zaC1zZXR1cAorcmVxdWlyZV93b3JrX3RyZWUKKworaWdub3JlZD0KK2lnbm9yZWRvbmx5PQorY2xlYW5kaXI9CitybWY9InJtIC1mIC0tIgorcm1yZj0icm0gLXJmIC0tIgorcm1fcmVmdXNlPSJlY2hvIE5vdCByZW1vdmluZyIKK2VjaG8xPSJlY2hvIgorCitkaXNhYmxlZD0kKGdpdCBjb25maWcgLS1ib29sIGNsZWFuLnJlcXVpcmVGb3JjZSkKKword2hpbGUgdGVzdCAkIyAhPSAwCitkbworCWNhc2UgIiQxIiBpbgorCS1kKQorCQljbGVhbmRpcj0xCisJCTs7CisJLWYpCisJCWRpc2FibGVkPWZhbHNlCisJCTs7CisJLW4pCisJCWRpc2FibGVkPWZhbHNlCisJCXJtZj0iZWNobyBXb3VsZCByZW1vdmUiCisJCXJtcmY9ImVjaG8gV291bGQgcmVtb3ZlIgorCQlybV9yZWZ1c2U9ImVjaG8gV291bGQgbm90IHJlbW92ZSIKKwkJZWNobzE9IjoiCisJCTs7CisJLXEpCisJCWVjaG8xPSI6IgorCQk7OworCS14KQorCQlpZ25vcmVkPTEKKwkJOzsKKwktWCkKKwkJaWdub3JlZG9ubHk9MQorCQk7OworCS0tKQorCQlzaGlmdAorCQlicmVhaworCQk7OworCSopCisJCXVzYWdlICMgc2hvdWxkIG5vdCBoYXBwZW4KKwkJOzsKKwllc2FjCisJc2hpZnQKK2RvbmUKKworIyByZXF1aXJlRm9yY2UgdXNlZCB0byBkZWZhdWx0IHRvIGZhbHNlIGJ1dCBub3cgaXQgZGVmYXVsdHMgdG8gdHJ1ZS4KKyMgSU9XLCBsYWNrIG9mIGV4cGxpY2l0ICJjbGVhbi5yZXF1aXJlRm9yY2UgPSBmYWxzZSIgaXMgdGFrZW4gYXMKKyMgImNsZWFuLnJlcXVpcmVGb3JjZSA9IHRydWUiLgorY2FzZSAiJGRpc2FibGVkIiBpbgorIiIpCisJZGllICJjbGVhbi5yZXF1aXJlRm9yY2Ugbm90IHNldCBhbmQgLW4gb3IgLWYgbm90IGdpdmVuOyByZWZ1c2luZyB0byBjbGVhbiIKKwk7OworInRydWUiKQorCWRpZSAiY2xlYW4ucmVxdWlyZUZvcmNlIHNldCBhbmQgLW4gb3IgLWYgbm90IGdpdmVuOyByZWZ1c2luZyB0byBjbGVhbiIKKwk7OworZXNhYworCitpZiBbICIkaWdub3JlZCwkaWdub3JlZG9ubHkiID0gIjEsMSIgXTsgdGhlbgorCWRpZSAiLXggYW5kIC1YIGNhbm5vdCBiZSBzZXQgdG9nZXRoZXIiCitmaQorCitpZiBbIC16ICIkaWdub3JlZCIgXTsgdGhlbgorCWV4Y2w9Ii0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PS5naXRpZ25vcmUiCisJZXhjbF9pbmZvPSBleGNsdWRlc19maWxlPQorCWlmIFsgLWYgIiRHSVRfRElSL2luZm8vZXhjbHVkZSIgXTsgdGhlbgorCQlleGNsX2luZm89Ii0tZXhjbHVkZS1mcm9tPSRHSVRfRElSL2luZm8vZXhjbHVkZSIKKwlmaQorCWlmIGNmZ19leGNsPSQoZ2l0IGNvbmZpZyBjb3JlLmV4Y2x1ZGVzZmlsZSkgJiYgdGVzdCAtZiAiJGNmZ19leGNsIgorCXRoZW4KKwkJZXhjbHVkZXNfZmlsZT0iLS1leGNsdWRlLWZyb209JGNmZ19leGNsIgorCWZpCisJaWYgWyAiJGlnbm9yZWRvbmx5IiBdOyB0aGVuCisJCWV4Y2w9IiRleGNsIC0taWdub3JlZCIKKwlmaQorZmkKKworZ2l0IGxzLWZpbGVzIC0tb3RoZXJzIC0tZGlyZWN0b3J5IFwKKwkkZXhjbCAke2V4Y2xfaW5mbzorIiRleGNsX2luZm8ifSAke2V4Y2x1ZGVzX2ZpbGU6KyIkZXhjbHVkZXNfZmlsZSJ9IFwKKwktLSAiJEAiIHwKK3doaWxlIHJlYWQgLXIgZmlsZTsgZG8KKwlpZiBbIC1kICIkZmlsZSIgLWEgISAtTCAiJGZpbGUiIF07IHRoZW4KKwkJaWYgWyAteiAiJGNsZWFuZGlyIiBdOyB0aGVuCisJCQkkcm1fcmVmdXNlICIkZmlsZSIKKwkJCWNvbnRpbnVlCisJCWZpCisJCSRlY2hvMSAiUmVtb3ZpbmcgJGZpbGUiCisJCSRybXJmICIkZmlsZSIKKwllbHNlCisJCSRlY2hvMSAiUmVtb3ZpbmcgJGZpbGUiCisJCSRybWYgIiRmaWxlIgorCWZpCitkb25lCmRpZmYgLS1naXQgYS9jb250cmliL2V4YW1wbGVzL2dpdC1jb21taXQuc2ggYi9jb250cmliL2V4YW1wbGVzL2dpdC1jb21taXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmM0YTQwNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZXhhbXBsZXMvZ2l0LWNvbW1pdC5zaApAQCAtMCwwICsxLDYzOSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBMaW51cyBUb3J2YWxkcworIyBDb3B5cmlnaHQgKGMpIDIwMDYgSnVuaW8gQyBIYW1hbm8KKworVVNBR0U9J1stYSB8IC0taW50ZXJhY3RpdmVdIFstc10gWy12XSBbLS1uby12ZXJpZnldIFstbSA8bWVzc2FnZT4gfCAtRiA8bG9nZmlsZT4gfCAoLUN8LWMpIDxjb21taXQ+IHwgLS1hbWVuZF0gWy11XSBbLWVdIFstLWF1dGhvciA8YXV0aG9yPl0gWy0tdGVtcGxhdGUgPGZpbGU+XSBbWy1pIHwgLW9dIDxwYXRoPi4uLl0nCitTVUJESVJFQ1RPUllfT0s9WWVzCitPUFRJT05TX1NQRUM9CisuIGdpdC1zaC1zZXR1cAorcmVxdWlyZV93b3JrX3RyZWUKKworZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEID4vZGV2L251bGwgMj4mMSB8fCBpbml0aWFsX2NvbW1pdD10CisKK2Nhc2UgIiQwIiBpbgorKnN0YXR1cykKKwlzdGF0dXNfb25seT10CisJOzsKKypjb21taXQpCisJc3RhdHVzX29ubHk9CisJOzsKK2VzYWMKKworcmVmdXNlX3BhcnRpYWwgKCkgeworCWVjaG8gPiYyICIkMSIKKwllY2hvID4mMiAiWW91IG1pZ2h0IGhhdmUgbWVhbnQgdG8gc2F5ICdnaXQgY29tbWl0IC1pIHBhdGhzLi4uJywgcGVyaGFwcz8iCisJZXhpdCAxCit9CisKK1RNUF9JTkRFWD0KK1RISVNfSU5ERVg9IiR7R0lUX0lOREVYX0ZJTEU6LSRHSVRfRElSL2luZGV4fSIKK05FWFRfSU5ERVg9IiRHSVRfRElSL25leHQtaW5kZXgkJCIKK3JtIC1mICIkTkVYVF9JTkRFWCIKK3NhdmVfaW5kZXggKCkgeworCWNwIC1wICIkVEhJU19JTkRFWCIgIiRORVhUX0lOREVYIgorfQorCitydW5fc3RhdHVzICgpIHsKKwkjIElmIFRNUF9JTkRFWCBpcyBkZWZpbmVkLCB0aGF0IG1lYW5zIHdlIGFyZSBkb2luZworCSMgIi0tb25seSIgcGFydGlhbCBjb21taXQsIGFuZCB0aGF0IGluZGV4IGZpbGUgaXMgdXNlZAorCSMgdG8gYnVpbGQgdGhlIHRyZWUgZm9yIHRoZSBjb21taXQuICBPdGhlcndpc2UsIGlmCisJIyBORVhUX0lOREVYIGV4aXN0cywgdGhhdCBpcyB0aGUgaW5kZXggZmlsZSB1c2VkIHRvCisJIyBtYWtlIHRoZSBjb21taXQuICBPdGhlcndpc2Ugd2UgYXJlIHVzaW5nIGFzLWlzIGNvbW1pdAorCSMgc28gdGhlIHJlZ3VsYXIgaW5kZXggZmlsZSBpcyB3aGF0IHdlIHVzZSB0byBjb21wYXJlLgorCWlmIHRlc3QgJycgIT0gIiRUTVBfSU5ERVgiCisJdGhlbgorCQlHSVRfSU5ERVhfRklMRT0iJFRNUF9JTkRFWCIKKwkJZXhwb3J0IEdJVF9JTkRFWF9GSUxFCisJZWxpZiB0ZXN0IC1mICIkTkVYVF9JTkRFWCIKKwl0aGVuCisJCUdJVF9JTkRFWF9GSUxFPSIkTkVYVF9JTkRFWCIKKwkJZXhwb3J0IEdJVF9JTkRFWF9GSUxFCisJZmkKKworCWlmIHRlc3QgIiRzdGF0dXNfb25seSIgPSAidCIgLW8gIiR1c2Vfc3RhdHVzX2NvbG9yIiA9ICJ0IjsgdGhlbgorCQljb2xvcj0KKwllbHNlCisJCWNvbG9yPS0tbm9jb2xvcgorCWZpCisJZ2l0IHJ1bnN0YXR1cyAke2NvbG9yfSBcCisJCSR7dmVyYm9zZTorLS12ZXJib3NlfSBcCisJCSR7YW1lbmQ6Ky0tYW1lbmR9IFwKKwkJJHt1bnRyYWNrZWRfZmlsZXM6Ky0tdW50cmFja2VkfQorfQorCit0cmFwICcKKwl0ZXN0IC16ICIkVE1QX0lOREVYIiB8fCB7CisJCXRlc3QgLWYgIiRUTVBfSU5ERVgiICYmIHJtIC1mICIkVE1QX0lOREVYIgorCX0KKwlybSAtZiAiJE5FWFRfSU5ERVgiCisnIDAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb21tYW5kIGxpbmUgYXJndW1lbnQgcGFyc2luZyBhbmQgc2FuaXR5IGNoZWNraW5nCisKK2FsbD0KK2Fsc289CithbGxvd19lbXB0eT1mCitpbnRlcmFjdGl2ZT0KK29ubHk9Citsb2dmaWxlPQordXNlX2NvbW1pdD0KK2FtZW5kPQorZWRpdF9mbGFnPQorbm9fZWRpdD0KK2xvZ19naXZlbj0KK2xvZ19tZXNzYWdlPQordmVyaWZ5PXQKK3F1aWV0PQordmVyYm9zZT0KK3NpZ25vZmY9Citmb3JjZV9hdXRob3I9Citvbmx5X2luY2x1ZGVfYXNzdW1lZD0KK3VudHJhY2tlZF9maWxlcz0KK3RlbXBsYXRlZmlsZT0iYGdpdCBjb25maWcgY29tbWl0LnRlbXBsYXRlYCIKK3doaWxlIHRlc3QgJCMgIT0gMAorZG8KKwljYXNlICIkMSIgaW4KKwktRnwtLUZ8LWZ8LS1mfC0tZml8LS1maWx8LS1maWxlKQorCQljYXNlICIkIyIgaW4gMSkgdXNhZ2UgOzsgZXNhYworCQlzaGlmdAorCQlub19lZGl0PXQKKwkJbG9nX2dpdmVuPXQkbG9nX2dpdmVuCisJCWxvZ2ZpbGU9IiQxIgorCQk7OworCS1GKnwtZiopCisJCW5vX2VkaXQ9dAorCQlsb2dfZ2l2ZW49dCRsb2dfZ2l2ZW4KKwkJbG9nZmlsZT0iJHsxIy1bRmZdfSIKKwkJOzsKKwktLUY9KnwtLWY9KnwtLWZpPSp8LS1maWw9KnwtLWZpbGU9KikKKwkJbm9fZWRpdD10CisJCWxvZ19naXZlbj10JGxvZ19naXZlbgorCQlsb2dmaWxlPSIkezEjKj19IgorCQk7OworCS1hfC0tYXwtLWFsfC0tYWxsKQorCQlhbGw9dAorCQk7OworCS0tYWxsb3wtLWFsbG93fC0tYWxsb3ctfC0tYWxsb3ctZXwtLWFsbG93LWVtfC0tYWxsb3ctZW1wfFwKKwktLWFsbG93LWVtcHR8LS1hbGxvdy1lbXB0eSkKKwkJYWxsb3dfZW1wdHk9dAorCQk7OworCS0tYXU9KnwtLWF1dD0qfC0tYXV0aD0qfC0tYXV0aG89KnwtLWF1dGhvcj0qKQorCQlmb3JjZV9hdXRob3I9IiR7MSMqPX0iCisJCTs7CisJLS1hdXwtLWF1dHwtLWF1dGh8LS1hdXRob3wtLWF1dGhvcikKKwkJY2FzZSAiJCMiIGluIDEpIHVzYWdlIDs7IGVzYWMKKwkJc2hpZnQKKwkJZm9yY2VfYXV0aG9yPSIkMSIKKwkJOzsKKwktZXwtLWV8LS1lZHwtLWVkaXwtLWVkaXQpCisJCWVkaXRfZmxhZz10CisJCTs7CisJLWl8LS1pfC0taW58LS1pbmN8LS1pbmNsfC0taW5jbHV8LS1pbmNsdWR8LS1pbmNsdWRlKQorCQlhbHNvPXQKKwkJOzsKKwktLWludHwtLWludGV8LS1pbnRlcnwtLWludGVyYXwtLWludGVyYWN8LS1pbnRlcmFjdHwtLWludGVyYWN0aXxcCisJLS1pbnRlcmFjdGl2fC0taW50ZXJhY3RpdmUpCisJCWludGVyYWN0aXZlPXQKKwkJOzsKKwktb3wtLW98LS1vbnwtLW9ubHwtLW9ubHkpCisJCW9ubHk9dAorCQk7OworCS1tfC0tbXwtLW1lfC0tbWVzfC0tbWVzc3wtLW1lc3NhfC0tbWVzc2FnfC0tbWVzc2FnZSkKKwkJY2FzZSAiJCMiIGluIDEpIHVzYWdlIDs7IGVzYWMKKwkJc2hpZnQKKwkJbG9nX2dpdmVuPW0kbG9nX2dpdmVuCisJCWxvZ19tZXNzYWdlPSIke2xvZ19tZXNzYWdlOiske2xvZ19tZXNzYWdlfQorCit9JDEiCisJCW5vX2VkaXQ9dAorCQk7OworCS1tKikKKwkJbG9nX2dpdmVuPW0kbG9nX2dpdmVuCisJCWxvZ19tZXNzYWdlPSIke2xvZ19tZXNzYWdlOiske2xvZ19tZXNzYWdlfQorCit9JHsxIy1tfSIKKwkJbm9fZWRpdD10CisJCTs7CisJLS1tPSp8LS1tZT0qfC0tbWVzPSp8LS1tZXNzPSp8LS1tZXNzYT0qfC0tbWVzc2FnPSp8LS1tZXNzYWdlPSopCisJCWxvZ19naXZlbj1tJGxvZ19naXZlbgorCQlsb2dfbWVzc2FnZT0iJHtsb2dfbWVzc2FnZTorJHtsb2dfbWVzc2FnZX0KKworfSR7MSMqPX0iCisJCW5vX2VkaXQ9dAorCQk7OworCS1ufC0tbnwtLW5vfC0tbm8tfC0tbm8tdnwtLW5vLXZlfC0tbm8tdmVyfC0tbm8tdmVyaXwtLW5vLXZlcmlmfFwKKwktLW5vLXZlcmlmeSkKKwkJdmVyaWZ5PQorCQk7OworCS0tYXwtLWFtfC0tYW1lfC0tYW1lbnwtLWFtZW5kKQorCQlhbWVuZD10CisJCXVzZV9jb21taXQ9SEVBRAorCQk7OworCS1jKQorCQljYXNlICIkIyIgaW4gMSkgdXNhZ2UgOzsgZXNhYworCQlzaGlmdAorCQlsb2dfZ2l2ZW49dCRsb2dfZ2l2ZW4KKwkJdXNlX2NvbW1pdD0iJDEiCisJCW5vX2VkaXQ9CisJCTs7CisJLS1yZWU9KnwtLXJlZWQ9KnwtLXJlZWRpPSp8LS1yZWVkaXQ9KnwtLXJlZWRpdC09KnwtLXJlZWRpdC1tPSp8XAorCS0tcmVlZGl0LW1lPSp8LS1yZWVkaXQtbWVzPSp8LS1yZWVkaXQtbWVzcz0qfC0tcmVlZGl0LW1lc3NhPSp8XAorCS0tcmVlZGl0LW1lc3NhZz0qfC0tcmVlZGl0LW1lc3NhZ2U9KikKKwkJbG9nX2dpdmVuPXQkbG9nX2dpdmVuCisJCXVzZV9jb21taXQ9IiR7MSMqPX0iCisJCW5vX2VkaXQ9CisJCTs7CisJLS1yZWV8LS1yZWVkfC0tcmVlZGl8LS1yZWVkaXR8LS1yZWVkaXQtfC0tcmVlZGl0LW18LS1yZWVkaXQtbWV8XAorCS0tcmVlZGl0LW1lc3wtLXJlZWRpdC1tZXNzfC0tcmVlZGl0LW1lc3NhfC0tcmVlZGl0LW1lc3NhZ3xcCisJLS1yZWVkaXQtbWVzc2FnZSkKKwkJY2FzZSAiJCMiIGluIDEpIHVzYWdlIDs7IGVzYWMKKwkJc2hpZnQKKwkJbG9nX2dpdmVuPXQkbG9nX2dpdmVuCisJCXVzZV9jb21taXQ9IiQxIgorCQlub19lZGl0PQorCQk7OworCS1DKQorCQljYXNlICIkIyIgaW4gMSkgdXNhZ2UgOzsgZXNhYworCQlzaGlmdAorCQlsb2dfZ2l2ZW49dCRsb2dfZ2l2ZW4KKwkJdXNlX2NvbW1pdD0iJDEiCisJCW5vX2VkaXQ9dAorCQk7OworCS0tcmV1PSp8LS1yZXVzPSp8LS1yZXVzZT0qfC0tcmV1c2UtPSp8LS1yZXVzZS1tPSp8LS1yZXVzZS1tZT0qfFwKKwktLXJldXNlLW1lcz0qfC0tcmV1c2UtbWVzcz0qfC0tcmV1c2UtbWVzc2E9KnwtLXJldXNlLW1lc3NhZz0qfFwKKwktLXJldXNlLW1lc3NhZ2U9KikKKwkJbG9nX2dpdmVuPXQkbG9nX2dpdmVuCisJCXVzZV9jb21taXQ9IiR7MSMqPX0iCisJCW5vX2VkaXQ9dAorCQk7OworCS0tcmV1fC0tcmV1c3wtLXJldXNlfC0tcmV1c2UtfC0tcmV1c2UtbXwtLXJldXNlLW1lfC0tcmV1c2UtbWVzfFwKKwktLXJldXNlLW1lc3N8LS1yZXVzZS1tZXNzYXwtLXJldXNlLW1lc3NhZ3wtLXJldXNlLW1lc3NhZ2UpCisJCWNhc2UgIiQjIiBpbiAxKSB1c2FnZSA7OyBlc2FjCisJCXNoaWZ0CisJCWxvZ19naXZlbj10JGxvZ19naXZlbgorCQl1c2VfY29tbWl0PSIkMSIKKwkJbm9fZWRpdD10CisJCTs7CisJLXN8LS1zfC0tc2l8LS1zaWd8LS1zaWdufC0tc2lnbm98LS1zaWdub2Z8LS1zaWdub2ZmKQorCQlzaWdub2ZmPXQKKwkJOzsKKwktdHwtLXR8LS10ZXwtLXRlbXwtLXRlbXB8LS10ZW1wbHwtLXRlbXBsYXwtLXRlbXBsYXR8LS10ZW1wbGF0ZSkKKwkJY2FzZSAiJCMiIGluIDEpIHVzYWdlIDs7IGVzYWMKKwkJc2hpZnQKKwkJdGVtcGxhdGVmaWxlPSIkMSIKKwkJbm9fZWRpdD0KKwkJOzsKKwktcXwtLXF8LS1xdXwtLXF1aXwtLXF1aWV8LS1xdWlldCkKKwkJcXVpZXQ9dAorCQk7OworCS12fC0tdnwtLXZlfC0tdmVyfC0tdmVyYnwtLXZlcmJvfC0tdmVyYm9zfC0tdmVyYm9zZSkKKwkJdmVyYm9zZT10CisJCTs7CisJLXV8LS11fC0tdW58LS11bnR8LS11bnRyfC0tdW50cmF8LS11bnRyYWN8LS11bnRyYWNrfC0tdW50cmFja2V8XAorCS0tdW50cmFja2VkfC0tdW50cmFja2VkLXwtLXVudHJhY2tlZC1mfC0tdW50cmFja2VkLWZpfC0tdW50cmFja2VkLWZpbHxcCisJLS11bnRyYWNrZWQtZmlsZXwtLXVudHJhY2tlZC1maWxlcykKKwkJdW50cmFja2VkX2ZpbGVzPXQKKwkJOzsKKwktLSkKKwkJc2hpZnQKKwkJYnJlYWsKKwkJOzsKKwktKikKKwkJdXNhZ2UKKwkJOzsKKwkqKQorCQlicmVhaworCQk7OworCWVzYWMKKwlzaGlmdAorZG9uZQorY2FzZSAiJGVkaXRfZmxhZyIgaW4gdCkgbm9fZWRpdD0gOzsgZXNhYworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFNhbml0eSBjaGVjayBvcHRpb25zCisKK2Nhc2UgIiRhbWVuZCwkaW5pdGlhbF9jb21taXQiIGluCit0LHQpCisJZGllICJZb3UgZG8gbm90IGhhdmUgYW55dGhpbmcgdG8gYW1lbmQuIiA7OwordCwpCisJaWYgWyAtZiAiJEdJVF9ESVIvTUVSR0VfSEVBRCIgXTsgdGhlbgorCQlkaWUgIllvdSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIG1lcmdlIC0tIGNhbm5vdCBhbWVuZC4iCisJZmkgOzsKK2VzYWMKKworY2FzZSAiJGxvZ19naXZlbiIgaW4KK3R0KikKKwlkaWUgIk9ubHkgb25lIG9mIC1jLy1DLy1GIGNhbiBiZSB1c2VkLiIgOzsKKyp0bSp8Km10KikKKwlkaWUgIk9wdGlvbiAtbSBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCAtYy8tQy8tRi4iIDs7Citlc2FjCisKK2Nhc2UgIiQjLCRhbHNvLCRvbmx5LCRhbWVuZCIgaW4KKyosdCx0LCopCisJZGllICJPbmx5IG9uZSBvZiAtLWluY2x1ZGUvLS1vbmx5IGNhbiBiZSB1c2VkLiIgOzsKKzAsdCwsKiB8IDAsLHQsKQorCWRpZSAiTm8gcGF0aHMgd2l0aCAtLWluY2x1ZGUvLS1vbmx5IGRvZXMgbm90IG1ha2Ugc2Vuc2UuIiA7OworMCwsdCx0KQorCW9ubHlfaW5jbHVkZV9hc3N1bWVkPSIjIENsZXZlci4uLiBhbWVuZGluZyB0aGUgbGFzdCBvbmUgd2l0aCBkaXJ0eSBpbmRleC4iIDs7CiswLCwsKikKKwk7OworKiwsLCopCisJb25seV9pbmNsdWRlX2Fzc3VtZWQ9IiMgRXhwbGljaXQgcGF0aHMgc3BlY2lmaWVkIHdpdGhvdXQgLWkgbm9yIC1vOyBhc3N1bWluZyAtLW9ubHkgcGF0aHMuLi4iCisJYWxzbz0KKwk7OworZXNhYwordW5zZXQgb25seQorY2FzZSAiJGFsbCwkaW50ZXJhY3RpdmUsJGFsc28sJCMiIGluCisqdCwqdCwqKQorCWRpZSAiQ2Fubm90IHVzZSAtYSwgLS1pbnRlcmFjdGl2ZSBvciAtaSBhdCB0aGUgc2FtZSB0aW1lLiIgOzsKK3QsLCxbMS05XSopCisJZGllICJQYXRocyB3aXRoIC1hIGRvZXMgbm90IG1ha2Ugc2Vuc2UuIiA7OworLHQsLFsxLTldKikKKwlkaWUgIlBhdGhzIHdpdGggLS1pbnRlcmFjdGl2ZSBkb2VzIG5vdCBtYWtlIHNlbnNlLiIgOzsKKywsdCwwKQorCWRpZSAiTm8gcGF0aHMgd2l0aCAtaSBkb2VzIG5vdCBtYWtlIHNlbnNlLiIgOzsKK2VzYWMKKworaWYgdGVzdCAhIC16ICIkdGVtcGxhdGVmaWxlIiAtYSAteiAiJGxvZ19naXZlbiIKK3RoZW4KKwlpZiB0ZXN0ICEgLWYgIiR0ZW1wbGF0ZWZpbGUiCisJdGhlbgorCQlkaWUgIkNvbW1pdCB0ZW1wbGF0ZSBmaWxlIGRvZXMgbm90IGV4aXN0LiIKKwlmaQorZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQcmVwYXJlIGluZGV4IHRvIGhhdmUgYSB0cmVlIHRvIGJlIGNvbW1pdHRlZAorCitjYXNlICIkYWxsLCRhbHNvIiBpbgordCwpCisJaWYgdGVzdCAhIC1mICIkVEhJU19JTkRFWCIKKwl0aGVuCisJCWRpZSAnbm90aGluZyB0byBjb21taXQgKHVzZSAiZ2l0IGFkZCBmaWxlMSBmaWxlMiIgdG8gaW5jbHVkZSBmb3IgY29tbWl0KScKKwlmaQorCXNhdmVfaW5kZXggJiYKKwkoCisJCWNkX3RvX3RvcGxldmVsICYmCisJCUdJVF9JTkRFWF9GSUxFPSIkTkVYVF9JTkRFWCIgJiYKKwkJZXhwb3J0IEdJVF9JTkRFWF9GSUxFICYmCisJCWdpdCBkaWZmLWZpbGVzIC0tbmFtZS1vbmx5IC16IHwKKwkJZ2l0IHVwZGF0ZS1pbmRleCAtLXJlbW92ZSAteiAtLXN0ZGluCisJKSB8fCBleGl0CisJOzsKKyx0KQorCXNhdmVfaW5kZXggJiYKKwlnaXQgbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIC0tICIkQCIgPi9kZXYvbnVsbCB8fCBleGl0CisKKwlnaXQgZGlmZi1maWxlcyAtLW5hbWUtb25seSAteiAtLSAiJEAiICB8CisJKAorCQljZF90b190b3BsZXZlbCAmJgorCQlHSVRfSU5ERVhfRklMRT0iJE5FWFRfSU5ERVgiICYmCisJCWV4cG9ydCBHSVRfSU5ERVhfRklMRSAmJgorCQlnaXQgdXBkYXRlLWluZGV4IC0tcmVtb3ZlIC16IC0tc3RkaW4KKwkpIHx8IGV4aXQKKwk7OworLCkKKwlpZiB0ZXN0ICIkaW50ZXJhY3RpdmUiID0gdDsgdGhlbgorCQlnaXQgYWRkIC0taW50ZXJhY3RpdmUgfHwgZXhpdAorCWZpCisJY2FzZSAiJCMiIGluCisJMCkKKwkJOzsgIyBjb21taXQgYXMtaXMKKwkqKQorCQlpZiB0ZXN0IC1mICIkR0lUX0RJUi9NRVJHRV9IRUFEIgorCQl0aGVuCisJCQlyZWZ1c2VfcGFydGlhbCAiQ2Fubm90IGRvIGEgcGFydGlhbCBjb21taXQgZHVyaW5nIGEgbWVyZ2UuIgorCQlmaQorCisJCVRNUF9JTkRFWD0iJEdJVF9ESVIvdG1wLWluZGV4JCQiCisJCVc9CisJCXRlc3QgLXogIiRpbml0aWFsX2NvbW1pdCIgJiYgVz0tLXdpdGgtdHJlZT1IRUFECisJCWNvbW1pdF9vbmx5PWBnaXQgbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoICRXIC0tICIkQCJgIHx8IGV4aXQKKworCQkjIEJ1aWxkIGEgdGVtcG9yYXJ5IGluZGV4IGFuZCB1cGRhdGUgdGhlIHJlYWwgaW5kZXgKKwkJIyB0aGUgc2FtZSB3YXkuCisJCWlmIHRlc3QgLXogIiRpbml0aWFsX2NvbW1pdCIKKwkJdGhlbgorCQkJR0lUX0lOREVYX0ZJTEU9IiRUSElTX0lOREVYIiBcCisJCQlnaXQgcmVhZC10cmVlIC0taW5kZXgtb3V0cHV0PSIkVE1QX0lOREVYIiAtaSAtbSBIRUFECisJCWVsc2UKKwkJCXJtIC1mICIkVE1QX0lOREVYIgorCQlmaSB8fCBleGl0CisKKwkJcHJpbnRmICclc1xuJyAiJGNvbW1pdF9vbmx5IiB8CisJCUdJVF9JTkRFWF9GSUxFPSIkVE1QX0lOREVYIiBcCisJCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgLS1zdGRpbiAmJgorCisJCXNhdmVfaW5kZXggJiYKKwkJcHJpbnRmICclc1xuJyAiJGNvbW1pdF9vbmx5IiB8CisJCSgKKwkJCUdJVF9JTkRFWF9GSUxFPSIkTkVYVF9JTkRFWCIKKwkJCWV4cG9ydCBHSVRfSU5ERVhfRklMRQorCQkJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSAtLXN0ZGluCisJCSkgfHwgZXhpdAorCQk7OworCWVzYWMKKwk7OworZXNhYworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIElmIHdlIGRvIGFzLWlzIGNvbW1pdCwgdGhlIGluZGV4IGZpbGUgd2lsbCBiZSBUSElTX0lOREVYLAorIyBvdGhlcndpc2UgTkVYVF9JTkRFWCBhZnRlciB3ZSBtYWtlIHRoaXMgY29tbWl0LiAgV2UgbGVhdmUKKyMgdGhlIGluZGV4IGFzIGlzIGlmIHdlIGFib3J0LgorCitpZiB0ZXN0IC1mICIkTkVYVF9JTkRFWCIKK3RoZW4KKwlVU0VfSU5ERVg9IiRORVhUX0lOREVYIgorZWxzZQorCVVTRV9JTkRFWD0iJFRISVNfSU5ERVgiCitmaQorCitjYXNlICIkc3RhdHVzX29ubHkiIGluCit0KQorCSMgVGhpcyB3aWxsIHNpbGVudGx5IGZhaWwgaW4gYSByZWFkLW9ubHkgcmVwb3NpdG9yeSwgd2hpY2ggaXMKKwkjIHdoYXQgd2Ugd2FudC4KKwlHSVRfSU5ERVhfRklMRT0iJFVTRV9JTkRFWCIgZ2l0IHVwZGF0ZS1pbmRleCAtcSAtLXVubWVyZ2VkIC0tcmVmcmVzaAorCXJ1bl9zdGF0dXMKKwlleGl0ICQ/CisJOzsKKycnKQorCUdJVF9JTkRFWF9GSUxFPSIkVVNFX0lOREVYIiBnaXQgdXBkYXRlLWluZGV4IC1xIC0tcmVmcmVzaCB8fCBleGl0CisJOzsKK2VzYWMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBHcmFiIGNvbW1pdCBtZXNzYWdlLCB3cml0ZSBvdXQgdHJlZSBhbmQgbWFrZSBjb21taXQuCisKK2lmIHRlc3QgdCA9ICIkdmVyaWZ5IiAmJiB0ZXN0IC14ICIkR0lUX0RJUiIvaG9va3MvcHJlLWNvbW1pdAordGhlbgorICAgIEdJVF9JTkRFWF9GSUxFPSIke1RNUF9JTkRFWDotJHtVU0VfSU5ERVh9fSIgIiRHSVRfRElSIi9ob29rcy9wcmUtY29tbWl0IFwKKyAgICB8fCBleGl0CitmaQorCitpZiB0ZXN0ICIkbG9nX21lc3NhZ2UiICE9ICcnCit0aGVuCisJcHJpbnRmICclc1xuJyAiJGxvZ19tZXNzYWdlIgorZWxpZiB0ZXN0ICIkbG9nZmlsZSIgIT0gIiIKK3RoZW4KKwlpZiB0ZXN0ICIkbG9nZmlsZSIgPSAtCisJdGhlbgorCQl0ZXN0IC10IDAgJiYKKwkJZWNobyA+JjIgIihyZWFkaW5nIGxvZyBtZXNzYWdlIGZyb20gc3RhbmRhcmQgaW5wdXQpIgorCQljYXQKKwllbHNlCisJCWNhdCA8IiRsb2dmaWxlIgorCWZpCitlbGlmIHRlc3QgIiR1c2VfY29tbWl0IiAhPSAiIgordGhlbgorCWVuY29kaW5nPSQoZ2l0IGNvbmZpZyBpMThuLmNvbW1pdGVuY29kaW5nIHx8IGVjaG8gVVRGLTgpCisJZ2l0IHNob3cgLXMgLS1wcmV0dHk9cmF3IC0tZW5jb2Rpbmc9IiRlbmNvZGluZyIgIiR1c2VfY29tbWl0IiB8CisJc2VkIC1lICcxLC9eJC9kJyAtZSAncy9eICAgIC8vJworZWxpZiB0ZXN0IC1mICIkR0lUX0RJUi9NRVJHRV9NU0ciCit0aGVuCisJY2F0ICIkR0lUX0RJUi9NRVJHRV9NU0ciCitlbGlmIHRlc3QgLWYgIiRHSVRfRElSL1NRVUFTSF9NU0ciCit0aGVuCisJY2F0ICIkR0lUX0RJUi9TUVVBU0hfTVNHIgorZWxpZiB0ZXN0ICIkdGVtcGxhdGVmaWxlIiAhPSAiIgordGhlbgorCWNhdCAiJHRlbXBsYXRlZmlsZSIKK2ZpIHwgZ2l0IHN0cmlwc3BhY2UgPiIkR0lUX0RJUiIvQ09NTUlUX0VESVRNU0cKKworY2FzZSAiJHNpZ25vZmYiIGluCit0KQorCXNpZ249JChnaXQtdmFyIEdJVF9DT01NSVRURVJfSURFTlQgfCBzZWQgLWUgJworCQlzLz4uKi8+LworCQlzL14vU2lnbmVkLW9mZi1ieTogLworCQknKQorCWJsYW5rX2JlZm9yZV9zaWdub2ZmPQorCXRhaWwgLW4gMSAiJEdJVF9ESVIiL0NPTU1JVF9FRElUTVNHIHwKKwlncmVwICdTaWduZWQtb2ZmLWJ5OicgPi9kZXYvbnVsbCB8fCBibGFua19iZWZvcmVfc2lnbm9mZj0nCisnCisJdGFpbCAtbiAxICIkR0lUX0RJUiIvQ09NTUlUX0VESVRNU0cgfAorCWdyZXAgIiRzaWduIiQgPi9kZXYvbnVsbCB8fAorCXByaW50ZiAnJXMlc1xuJyAiJGJsYW5rX2JlZm9yZV9zaWdub2ZmIiAiJHNpZ24iIFwKKwkJPj4iJEdJVF9ESVIiL0NPTU1JVF9FRElUTVNHCisJOzsKK2VzYWMKKworaWYgdGVzdCAtZiAiJEdJVF9ESVIvTUVSR0VfSEVBRCIgJiYgdGVzdCAteiAiJG5vX2VkaXQiOyB0aGVuCisJZWNobyAiIyIKKwllY2hvICIjIEl0IGxvb2tzIGxpa2UgeW91IG1heSBiZSBjb21taXR0aW5nIGEgTUVSR0UuIgorCWVjaG8gIiMgSWYgdGhpcyBpcyBub3QgY29ycmVjdCwgcGxlYXNlIHJlbW92ZSB0aGUgZmlsZSIKKwlwcmludGYgJyVzXG4nICIjCSRHSVRfRElSL01FUkdFX0hFQUQiCisJZWNobyAiIyBhbmQgdHJ5IGFnYWluIgorCWVjaG8gIiMiCitmaSA+PiIkR0lUX0RJUiIvQ09NTUlUX0VESVRNU0cKKworIyBBdXRob3IKK2lmIHRlc3QgJycgIT0gIiR1c2VfY29tbWl0IgordGhlbgorCWV2YWwgIiQoZ2V0X2F1dGhvcl9pZGVudF9mcm9tX2NvbW1pdCAiJHVzZV9jb21taXQiKSIKKwlleHBvcnQgR0lUX0FVVEhPUl9OQU1FIEdJVF9BVVRIT1JfRU1BSUwgR0lUX0FVVEhPUl9EQVRFCitmaQoraWYgdGVzdCAnJyAhPSAiJGZvcmNlX2F1dGhvciIKK3RoZW4KKwlHSVRfQVVUSE9SX05BTUU9YGV4cHIgInokZm9yY2VfYXV0aG9yIiA6ICd6XCguKlteIF1cKSAqPC4qJ2AgJiYKKwlHSVRfQVVUSE9SX0VNQUlMPWBleHByICJ6JGZvcmNlX2F1dGhvciIgOiAnLipcKDwuKlwpJ2AgJiYKKwl0ZXN0ICcnICE9ICIkR0lUX0FVVEhPUl9OQU1FIiAmJgorCXRlc3QgJycgIT0gIiRHSVRfQVVUSE9SX0VNQUlMIiB8fAorCWRpZSAibWFsZm9ybWVkIC0tYXV0aG9yIHBhcmFtZXRlciIKKwlleHBvcnQgR0lUX0FVVEhPUl9OQU1FIEdJVF9BVVRIT1JfRU1BSUwKK2ZpCisKK1BBUkVOVFM9Ii1wIEhFQUQiCitpZiB0ZXN0IC16ICIkaW5pdGlhbF9jb21taXQiCit0aGVuCisJcmxvZ2E9J2NvbW1pdCcKKwlpZiBbIC1mICIkR0lUX0RJUi9NRVJHRV9IRUFEIiBdOyB0aGVuCisJCXJsb2dhPSdjb21taXQgKG1lcmdlKScKKwkJUEFSRU5UUz0iLXAgSEVBRCAiYHNlZCAtZSAncy9eLy1wIC8nICIkR0lUX0RJUi9NRVJHRV9IRUFEImAKKwllbGlmIHRlc3QgLW4gIiRhbWVuZCI7IHRoZW4KKwkJcmxvZ2E9J2NvbW1pdCAoYW1lbmQpJworCQlQQVJFTlRTPSQoZ2l0IGNhdC1maWxlIGNvbW1pdCBIRUFEIHwKKwkJCXNlZCAtbiAtZSAnL14kL3EnIC1lICdzL15wYXJlbnQgLy1wIC9wJykKKwlmaQorCWN1cnJlbnQ9IiQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSIKK2Vsc2UKKwlpZiBbIC16ICIkKGdpdCBscy1maWxlcykiIF07IHRoZW4KKwkJZWNobyA+JjIgJ25vdGhpbmcgdG8gY29tbWl0ICh1c2UgImdpdCBhZGQgZmlsZTEgZmlsZTIiIHRvIGluY2x1ZGUgZm9yIGNvbW1pdCknCisJCWV4aXQgMQorCWZpCisJUEFSRU5UUz0iIgorCXJsb2dhPSdjb21taXQgKGluaXRpYWwpJworCWN1cnJlbnQ9JycKK2ZpCitzZXRfcmVmbG9nX2FjdGlvbiAiJHJsb2dhIgorCitpZiB0ZXN0IC16ICIkbm9fZWRpdCIKK3RoZW4KKwl7CisJCWVjaG8gIiIKKwkJZWNobyAiIyBQbGVhc2UgZW50ZXIgdGhlIGNvbW1pdCBtZXNzYWdlIGZvciB5b3VyIGNoYW5nZXMuIgorCQllY2hvICIjIChDb21tZW50IGxpbmVzIHN0YXJ0aW5nIHdpdGggJyMnIHdpbGwgbm90IGJlIGluY2x1ZGVkKSIKKwkJdGVzdCAteiAiJG9ubHlfaW5jbHVkZV9hc3N1bWVkIiB8fCBlY2hvICIkb25seV9pbmNsdWRlX2Fzc3VtZWQiCisJCXJ1bl9zdGF0dXMKKwl9ID4+IiRHSVRfRElSIi9DT01NSVRfRURJVE1TRworZWxzZQorCSMgd2UgbmVlZCB0byBjaGVjayBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byBjb21taXQKKwlydW5fc3RhdHVzID4vZGV2L251bGwKK2ZpCitjYXNlICIkYWxsb3dfZW1wdHksJD8sJFBBUkVOVFMiIGluCit0LCogfCA/LDAsKiB8ID8sKiwtcCcgJz8qLXAnICc/KikKKwkjIGFuIGV4cGxpY2l0IC0tYWxsb3ctZW1wdHksIG9yIGEgbWVyZ2UgY29tbWl0IGNhbiByZWNvcmQgdGhlCisJIyBzYW1lIHRyZWUgYXMgaXRzIHBhcmVudC4gIE90aGVyd2lzZSBoYXZpbmcgY29tbWl0YWJsZSBwYXRocworCSMgaXMgcmVxdWlyZWQuCisJOzsKKyopCisJcm0gLWYgIiRHSVRfRElSL0NPTU1JVF9FRElUTVNHIiAiJEdJVF9ESVIvU1FVQVNIX01TRyIKKwl1c2Vfc3RhdHVzX2NvbG9yPXQKKwlydW5fc3RhdHVzCisJZXhpdCAxCitlc2FjCisKK2Nhc2UgIiRub19lZGl0IiBpbgorJycpCisJZ2l0LXZhciBHSVRfQVVUSE9SX0lERU5UID4gL2Rldi9udWxsICB8fCBkaWUKKwlnaXQtdmFyIEdJVF9DT01NSVRURVJfSURFTlQgPiAvZGV2L251bGwgIHx8IGRpZQorCWdpdF9lZGl0b3IgIiRHSVRfRElSL0NPTU1JVF9FRElUTVNHIgorCTs7Citlc2FjCisKK2Nhc2UgIiR2ZXJpZnkiIGluCit0KQorCWlmIHRlc3QgLXggIiRHSVRfRElSIi9ob29rcy9jb21taXQtbXNnCisJdGhlbgorCQkiJEdJVF9ESVIiL2hvb2tzL2NvbW1pdC1tc2cgIiRHSVRfRElSIi9DT01NSVRfRURJVE1TRyB8fCBleGl0CisJZmkKK2VzYWMKKworaWYgdGVzdCAteiAiJG5vX2VkaXQiCit0aGVuCisgICAgc2VkIC1lICcKKyAgICAgICAgL15kaWZmIC0tZ2l0IGFcLy4qL3sKKwkgICAgcy8vLworCSAgICBxCisJfQorCS9eIy9kCisgICAgJyAiJEdJVF9ESVIiL0NPTU1JVF9FRElUTVNHCitlbHNlCisgICAgY2F0ICIkR0lUX0RJUiIvQ09NTUlUX0VESVRNU0cKK2ZpIHwKK2dpdCBzdHJpcHNwYWNlID4iJEdJVF9ESVIiL0NPTU1JVF9NU0cKKworIyBUZXN0IHdoZXRoZXIgdGhlIGNvbW1pdCBtZXNzYWdlIGhhcyBhbnkgY29udGVudCB3ZSBkaWRuJ3Qgc3VwcGx5LgoraGF2ZV9jb21taXRtc2c9CitncmVwIC12IC1pICdeU2lnbmVkLW9mZi1ieScgIiRHSVRfRElSIi9DT01NSVRfTVNHIHwKKwlnaXQgc3RyaXBzcGFjZSA+ICIkR0lUX0RJUiIvQ09NTUlUX0JBUkVNU0cKKworIyBJcyB0aGUgY29tbWl0IG1lc3NhZ2UgdG90YWxseSBlbXB0eT8KK2lmIHRlc3QgLXMgIiRHSVRfRElSIi9DT01NSVRfQkFSRU1TRwordGhlbgorCWlmIHRlc3QgIiR0ZW1wbGF0ZWZpbGUiICE9ICIiCisJdGhlbgorCQkjIFRlc3Qgd2hldGhlciB0aGlzIGlzIGp1c3QgdGhlIHVuYWx0ZXJlZCB0ZW1wbGF0ZS4KKwkJaWYgY250PWBzZWQgLWUgJy9eIy9kJyA8ICIkdGVtcGxhdGVmaWxlIiB8CisJCQlnaXQgc3RyaXBzcGFjZSB8CisJCQlkaWZmICIkR0lUX0RJUiIvQ09NTUlUX0JBUkVNU0cgLSB8CisJCQl3YyAtbGAgJiYKKwkJICAgdGVzdCAwIC1sdCAkY250CisJCXRoZW4KKwkJCWhhdmVfY29tbWl0bXNnPXQKKwkJZmkKKwllbHNlCisJCSMgTm8gdGVtcGxhdGUsIHNvIHRoZSBjb250ZW50IGluIHRoZSBjb21taXQgbWVzc2FnZSBtdXN0CisJCSMgaGF2ZSBjb21lIGZyb20gdGhlIHVzZXIuCisJCWhhdmVfY29tbWl0bXNnPXQKKwlmaQorZmkKKworcm0gLWYgIiRHSVRfRElSIi9DT01NSVRfQkFSRU1TRworCitpZiB0ZXN0ICIkaGF2ZV9jb21taXRtc2ciID0gInQiCit0aGVuCisJaWYgdGVzdCAteiAiJFRNUF9JTkRFWCIKKwl0aGVuCisJCXRyZWU9JChHSVRfSU5ERVhfRklMRT0iJFVTRV9JTkRFWCIgZ2l0IHdyaXRlLXRyZWUpCisJZWxzZQorCQl0cmVlPSQoR0lUX0lOREVYX0ZJTEU9IiRUTVBfSU5ERVgiIGdpdCB3cml0ZS10cmVlKSAmJgorCQlybSAtZiAiJFRNUF9JTkRFWCIKKwlmaSAmJgorCWNvbW1pdD0kKGdpdCBjb21taXQtdHJlZSAkdHJlZSAkUEFSRU5UUyA8IiRHSVRfRElSL0NPTU1JVF9NU0ciKSAmJgorCXJsb2dtPSQoc2VkIC1lIDFxICIkR0lUX0RJUiIvQ09NTUlUX01TRykgJiYKKwlnaXQgdXBkYXRlLXJlZiAtbSAiJEdJVF9SRUZMT0dfQUNUSU9OOiAkcmxvZ20iIEhFQUQgJGNvbW1pdCAiJGN1cnJlbnQiICYmCisJcm0gLWYgLS0gIiRHSVRfRElSL01FUkdFX0hFQUQiICIkR0lUX0RJUi9NRVJHRV9NU0ciICYmCisJaWYgdGVzdCAtZiAiJE5FWFRfSU5ERVgiCisJdGhlbgorCQltdiAiJE5FWFRfSU5ERVgiICIkVEhJU19JTkRFWCIKKwllbHNlCisJCTogOyMgaGFwcHkKKwlmaQorZWxzZQorCWVjaG8gPiYyICIqIG5vIGNvbW1pdCBtZXNzYWdlPyAgYWJvcnRpbmcgY29tbWl0LiIKKwlmYWxzZQorZmkKK3JldD0iJD8iCitybSAtZiAiJEdJVF9ESVIvQ09NTUlUX01TRyIgIiRHSVRfRElSL0NPTU1JVF9FRElUTVNHIiAiJEdJVF9ESVIvU1FVQVNIX01TRyIKKworY2RfdG9fdG9wbGV2ZWwKKworZ2l0IHJlcmVyZQorCitpZiB0ZXN0ICIkcmV0IiA9IDAKK3RoZW4KKwlnaXQgZ2MgLS1hdXRvCisJaWYgdGVzdCAteCAiJEdJVF9ESVIiL2hvb2tzL3Bvc3QtY29tbWl0CisJdGhlbgorCQkiJEdJVF9ESVIiL2hvb2tzL3Bvc3QtY29tbWl0CisJZmkKKwlpZiB0ZXN0IC16ICIkcXVpZXQiCisJdGhlbgorCQljb21taXQ9YGdpdCBkaWZmLXRyZWUgLS1hbHdheXMgLS1zaG9ydHN0YXQgLS1wcmV0dHk9ImZvcm1hdDolaDogJXMiXAorCQkgICAgICAgLS1zdW1tYXJ5IC0tcm9vdCBIRUFEIC0tYAorCQllY2hvICJDcmVhdGVkJHtpbml0aWFsX2NvbW1pdDorIGluaXRpYWx9IGNvbW1pdCAkY29tbWl0IgorCWZpCitmaQorCitleGl0ICIkcmV0IgpkaWZmIC0tZ2l0IGEvY29udHJpYi9leGFtcGxlcy9naXQtZmV0Y2guc2ggYi9jb250cmliL2V4YW1wbGVzL2dpdC1mZXRjaC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNDRhZjJjCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9leGFtcGxlcy9naXQtZmV0Y2guc2gKQEAgLTAsMCArMSwzNzcgQEAKKyMhL2Jpbi9zaAorIworCitVU0FHRT0nPGZldGNoLW9wdGlvbnM+IDxyZXBvc2l0b3J5PiA8cmVmc3BlYz4uLi4nCitTVUJESVJFQ1RPUllfT0s9WWVzCisuIGdpdC1zaC1zZXR1cAorc2V0X3JlZmxvZ19hY3Rpb24gImZldGNoICQqIgorY2RfdG9fdG9wbGV2ZWwgOyMgcHJvYmFibHkgdW5uZWNlc3NhcnkuLi4KKworLiBnaXQtcGFyc2UtcmVtb3RlCitfeDQwPSdbMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdJworX3g0MD0iJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCIKKworTEY9JworJworSUZTPSIkTEYiCisKK25vX3RhZ3M9Cit0YWdzPQorYXBwZW5kPQorZm9yY2U9Cit2ZXJib3NlPQordXBkYXRlX2hlYWRfb2s9CitleGVjPQora2VlcD0KK3NoYWxsb3dfZGVwdGg9Citub19wcm9ncmVzcz0KK3Rlc3QgLXQgMSB8fCBub19wcm9ncmVzcz0tLW5vLXByb2dyZXNzCitxdWlldD0KK3doaWxlIHRlc3QgJCMgIT0gMAorZG8KKwljYXNlICIkMSIgaW4KKwktYXwtLWF8LS1hcHwtLWFwcHwtLWFwcGV8LS1hcHBlbnwtLWFwcGVuZCkKKwkJYXBwZW5kPXQKKwkJOzsKKwktLXVwbHwtLXVwbG98LS11cGxvYXwtLXVwbG9hZHwtLXVwbG9hZC18LS11cGxvYWQtcHxcCisJLS11cGxvYWQtcGF8LS11cGxvYWQtcGFjfC0tdXBsb2FkLXBhY2spCisJCXNoaWZ0CisJCWV4ZWM9Ii0tdXBsb2FkLXBhY2s9JDEiCisJCTs7CisJLS11cGw9KnwtLXVwbG89KnwtLXVwbG9hPSp8LS11cGxvYWQ9KnxcCisJLS11cGxvYWQtPSp8LS11cGxvYWQtcD0qfC0tdXBsb2FkLXBhPSp8LS11cGxvYWQtcGFjPSp8LS11cGxvYWQtcGFjaz0qKQorCQlleGVjPS0tdXBsb2FkLXBhY2s9JChleHByICJ6JDEiIDogJ3otW149XSo9XCguKlwpJykKKwkJc2hpZnQKKwkJOzsKKwktZnwtLWZ8LS1mb3wtLWZvcnwtLWZvcmN8LS1mb3JjZSkKKwkJZm9yY2U9dAorCQk7OworCS10fC0tdHwtLXRhfC0tdGFnfC0tdGFncykKKwkJdGFncz10CisJCTs7CisJLW58LS1ufC0tbm98LS1uby18LS1uby10fC0tbm8tdGF8LS1uby10YWd8LS1uby10YWdzKQorCQlub190YWdzPXQKKwkJOzsKKwktdXwtLXV8LS11cHwtLXVwZHwtLXVwZGF8LS11cGRhdHwtLXVwZGF0ZXwtLXVwZGF0ZS18LS11cGRhdGUtaHxcCisJLS11cGRhdGUtaGV8LS11cGRhdGUtaGVhfC0tdXBkYXRlLWhlYWR8LS11cGRhdGUtaGVhZC18XAorCS0tdXBkYXRlLWhlYWQtb3wtLXVwZGF0ZS1oZWFkLW9rKQorCQl1cGRhdGVfaGVhZF9vaz10CisJCTs7CisJLXF8LS1xfC0tcXV8LS1xdWl8LS1xdWllfC0tcXVpZXQpCisJCXF1aWV0PS0tcXVpZXQKKwkJOzsKKwktdnwtLXZlcmJvc2UpCisJCXZlcmJvc2U9IiR2ZXJib3NlIlllcworCQk7OworCS1rfC0ta3wtLWtlfC0ta2VlfC0ta2VlcCkKKwkJa2VlcD0nLWsgLWsnCisJCTs7CisJLS1kZXB0aD0qKQorCQlzaGFsbG93X2RlcHRoPSItLWRlcHRoPWBleHByICJ6JDEiIDogJ3otW149XSo9XCguKlwpJ2AiCisJCTs7CisJLS1kZXB0aCkKKwkJc2hpZnQKKwkJc2hhbGxvd19kZXB0aD0iLS1kZXB0aD0kMSIKKwkJOzsKKwktKikKKwkJdXNhZ2UKKwkJOzsKKwkqKQorCQlicmVhaworCQk7OworCWVzYWMKKwlzaGlmdAorZG9uZQorCitjYXNlICIkIyIgaW4KKzApCisJb3JpZ2luPSQoZ2V0X2RlZmF1bHRfcmVtb3RlKQorCXRlc3QgLW4gIiQoZ2V0X3JlbW90ZV91cmwgJHtvcmlnaW59KSIgfHwKKwkJZGllICJXaGVyZSBkbyB5b3Ugd2FudCB0byBmZXRjaCBmcm9tIHRvZGF5PyIKKwlzZXQgeCAkb3JpZ2luIDsgc2hpZnQgOzsKK2VzYWMKKworaWYgdGVzdCAteiAiJGV4ZWMiCit0aGVuCisJIyBObyBjb21tYW5kIGxpbmUgb3ZlcnJpZGUgYW5kIHdlIGhhdmUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHJlbW90ZS4KKwlleGVjPSItLXVwbG9hZC1wYWNrPSQoZ2V0X3VwbG9hZHBhY2sgJDEpIgorZmkKKworcmVtb3RlX25pY2s9IiQxIgorcmVtb3RlPSQoZ2V0X3JlbW90ZV91cmwgIiRAIikKK3JlZnM9CitycmVmPQorcnN5bmNfc2x1cnBlZF9vYmplY3RzPQorCitpZiB0ZXN0ICIiID0gIiRhcHBlbmQiCit0aGVuCisJOiA+IiRHSVRfRElSL0ZFVENIX0hFQUQiCitmaQorCisjIEdsb2JhbCB0aGF0IGlzIHJldXNlZCBsYXRlcgorbHNfcmVtb3RlX3Jlc3VsdD0kKGdpdCBscy1yZW1vdGUgJGV4ZWMgIiRyZW1vdGUiKSB8fAorCWRpZSAiQ2Fubm90IGdldCB0aGUgcmVwb3NpdG9yeSBzdGF0ZSBmcm9tICRyZW1vdGUiCisKK2FwcGVuZF9mZXRjaF9oZWFkICgpIHsKKwlmbGFncz0KKwl0ZXN0IC1uICIkdmVyYm9zZSIgJiYgZmxhZ3M9IiRmbGFncyRMRi12IgorCXRlc3QgLW4gIiRmb3JjZSRzaW5nbGVfZm9yY2UiICYmIGZsYWdzPSIkZmxhZ3MkTEYtZiIKKwlHSVRfUkVGTE9HX0FDVElPTj0iJEdJVF9SRUZMT0dfQUNUSU9OIiBcCisJCWdpdCBmZXRjaC0tdG9vbCAkZmxhZ3MgYXBwZW5kLWZldGNoLWhlYWQgIiRAIgorfQorCisjIHVwZGF0aW5nIHRoZSBjdXJyZW50IEhFQUQgd2l0aCBnaXQtZmV0Y2ggaW4gYSBiYXJlCisjIHJlcG9zaXRvcnkgaXMgYWx3YXlzIGZpbmUuCitpZiB0ZXN0IC16ICIkdXBkYXRlX2hlYWRfb2siICYmIHRlc3QgJChpc19iYXJlX3JlcG9zaXRvcnkpID0gZmFsc2UKK3RoZW4KKwlvcmlnX2hlYWQ9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQgMj4vZGV2L251bGwpCitmaQorCisjIEFsbG93IC0tbm90YWdzIGZyb20gcmVtb3RlLiQxLnRhZ29wdAorY2FzZSAiJHRhZ3Mkbm9fdGFncyIgaW4KKycnKQorCWNhc2UgIiQoZ2l0IGNvbmZpZyAtLWdldCAicmVtb3RlLiQxLnRhZ29wdCIpIiBpbgorCS0tbm8tdGFncykKKwkJbm9fdGFncz10IDs7CisJZXNhYworZXNhYworCisjIElmIC0tdGFncyAoYW5kIGxhdGVyIC0taGVhZHMgb3IgLS1hbGwpIGlzIHNwZWNpZmllZCwgdGhlbiB3ZSBhcmUKKyMgbm90IHRhbGtpbmcgYWJvdXQgZGVmYXVsdHMgc3RvcmVkIGluIFB1bGw6IGxpbmUgb2YgcmVtb3RlcyBvcgorIyBicmFuY2hlcyBmaWxlLCBhbmQganVzdCBmZXRjaCB0aG9zZSBhbmQgcmVmc3BlY3MgZXhwbGljaXRseSBnaXZlbi4KKyMgT3RoZXJ3aXNlIHdlIGRvIHdoYXQgd2UgYWx3YXlzIGRpZC4KKworcmVmbGlzdD0kKGdldF9yZW1vdGVfcmVmc19mb3JfZmV0Y2ggIiRAIikKK2lmIHRlc3QgIiR0YWdzIgordGhlbgorCXRhZ2xpc3Q9YElGUz0nCScgJiYKKwkJICBlY2hvICIkbHNfcmVtb3RlX3Jlc3VsdCIgfAorCQkgIGdpdCBzaG93LXJlZiAtLWV4Y2x1ZGUtZXhpc3Rpbmc9cmVmcy90YWdzLyB8CisJICAgICAgICAgIHdoaWxlIHJlYWQgc2hhMSBuYW1lCisJCSAgZG8KKwkJCWVjaG8gIi4ke25hbWV9OiR7bmFtZX0iCisJCSAgZG9uZWAgfHwgZXhpdAorCWlmIHRlc3QgIiQjIiAtZ3QgMQorCXRoZW4KKwkJIyByZW1vdGUgVVJMIHBsdXMgZXhwbGljaXQgcmVmc3BlY3M7IHdlIG5lZWQgdG8gbWVyZ2UgdGhlbS4KKwkJcmVmbGlzdD0iJHJlZmxpc3QkTEYkdGFnbGlzdCIKKwllbHNlCisJCSMgTm8gZXhwbGljaXQgcmVmc3BlY3M7IGZldGNoIHRhZ3Mgb25seS4KKwkJcmVmbGlzdD0kdGFnbGlzdAorCWZpCitmaQorCitmZXRjaF9hbGxfYXRfb25jZSAoKSB7CisKKyAgZXZhbD0kKGVjaG8gIiQxIiB8IGdpdCBmZXRjaC0tdG9vbCBwYXJzZS1yZWZsaXN0ICItIikKKyAgZXZhbCAiJGV2YWwiCisKKyAgICAoIDogc3Vic2hlbGwgYmVjYXVzZSB3ZSBtdWNrIHdpdGggSUZTCisgICAgICBJRlM9IiAJJExGIgorICAgICAgKAorCWlmIHRlc3QgIiRyZW1vdGUiID0gLiA7IHRoZW4KKwkgICAgZ2l0IHNob3ctcmVmICRycmVmIHx8IGVjaG8gZmFpbGVkICIkcmVtb3RlIgorCWVsaWYgdGVzdCAtZiAiJHJlbW90ZSIgOyB0aGVuCisJICAgIHRlc3QgLW4gIiRzaGFsbG93X2RlcHRoIiAmJgorCQlkaWUgInNoYWxsb3cgY2xvbmUgd2l0aCBidW5kbGUgaXMgbm90IHN1cHBvcnRlZCIKKwkgICAgZ2l0IGJ1bmRsZSB1bmJ1bmRsZSAiJHJlbW90ZSIgJHJyZWYgfHwKKwkgICAgZWNobyBmYWlsZWQgIiRyZW1vdGUiCisJZWxzZQorCQlpZgl0ZXN0IC1kICIkcmVtb3RlIiAmJgorCisJCQkjIFRoZSByZW1vdGUgbWlnaHQgYmUgb3VyIGFsdGVybmF0ZS4gIFdpdGgKKwkJCSMgdGhpcyBvcHRpbWl6YXRpb24gd2Ugd2lsbCBieXBhc3MgZmV0Y2gtcGFjaworCQkJIyBhbHRvZ2V0aGVyLCB3aGljaCBtZWFucyB3ZSBjYW5ub3QgYmUgZG9pbmcKKwkJCSMgdGhlIHNoYWxsb3cgc3R1ZmYgYXQgYWxsLgorCQkJdGVzdCAhIC1mICIkR0lUX0RJUi9zaGFsbG93IiAmJgorCQkJdGVzdCAteiAiJHNoYWxsb3dfZGVwdGgiICYmCisKKwkJCSMgU2VlIGlmIGFsbCBvZiB3aGF0IHdlIGFyZSBnb2luZyB0byBmZXRjaCBhcmUKKwkJCSMgY29ubmVjdGVkIHRvIG91ciByZXBvc2l0b3J5J3MgdGlwcywgaW4gd2hpY2gKKwkJCSMgY2FzZSB3ZSBkbyBub3QgaGF2ZSB0byBkbyBhbnkgZmV0Y2guCisJCQl0aGVpcnM9JChlY2hvICIkbHNfcmVtb3RlX3Jlc3VsdCIgfCBcCisJCQkJZ2l0IGZldGNoLS10b29sIC1zIHBpY2stcnJlZiAiJHJyZWYiICItIikgJiYKKworCQkJIyBUaGlzIHdpbGwgYmFyZiB3aGVuICR0aGVpcnMgcmVhY2ggYW4gb2JqZWN0IHRoYXQKKwkJCSMgd2UgZG8gbm90IGhhdmUgaW4gb3VyIHJlcG9zaXRvcnkuICBPdGhlcndpc2UsCisJCQkjIHdlIGFscmVhZHkgaGF2ZSBldmVyeXRoaW5nIHRoZSBmZXRjaCB3b3VsZCBicmluZyBpbi4KKwkJCWdpdCByZXYtbGlzdCAtLW9iamVjdHMgJHRoZWlycyAtLW5vdCAtLWFsbCBcCisJCQkJPi9kZXYvbnVsbCAyPi9kZXYvbnVsbAorCQl0aGVuCisJCQllY2hvICIkbHNfcmVtb3RlX3Jlc3VsdCIgfCBcCisJCQkJZ2l0IGZldGNoLS10b29sIHBpY2stcnJlZiAiJHJyZWYiICItIgorCQllbHNlCisJCQlmbGFncz0KKwkJCWNhc2UgJHZlcmJvc2UgaW4KKwkJCVllc1llcyopCisJCQkgICAgZmxhZ3M9Ii12IgorCQkJICAgIDs7CisJCQllc2FjCisJCQlnaXQtZmV0Y2gtcGFjayAtLXRoaW4gJGV4ZWMgJGtlZXAgJHNoYWxsb3dfZGVwdGggXAorCQkJCSRxdWlldCAkbm9fcHJvZ3Jlc3MgJGZsYWdzICIkcmVtb3RlIiAkcnJlZiB8fAorCQkJZWNobyBmYWlsZWQgIiRyZW1vdGUiCisJCWZpCisJZmkKKyAgICAgICkgfAorICAgICAgKAorCWZsYWdzPQorCXRlc3QgLW4gIiR2ZXJib3NlIiAmJiBmbGFncz0iJGZsYWdzIC12IgorCXRlc3QgLW4gIiRmb3JjZSIgJiYgZmxhZ3M9IiRmbGFncyAtZiIKKwlHSVRfUkVGTE9HX0FDVElPTj0iJEdJVF9SRUZMT0dfQUNUSU9OIiBcCisJCWdpdCBmZXRjaC0tdG9vbCAkZmxhZ3MgbmF0aXZlLXN0b3JlIFwKKwkJCSIkcmVtb3RlIiAiJHJlbW90ZV9uaWNrIiAiJHJlZnMiCisgICAgICApCisgICAgKSB8fCBleGl0CisKK30KKworZmV0Y2hfcGVyX3JlZiAoKSB7CisgIHJlZmxpc3Q9IiQxIgorICByZWZzPQorICBycmVmPQorCisgIGZvciByZWYgaW4gJHJlZmxpc3QKKyAgZG8KKyAgICAgIHJlZnM9IiRyZWZzJExGJHJlZiIKKworICAgICAgIyBUaGVzZSBhcmUgcmVsYXRpdmUgcGF0aCBmcm9tICRHSVRfRElSLCB0eXBpY2FsbHkgc3RhcnRpbmcgYXQgcmVmcy8KKyAgICAgICMgYnV0IG1heSBiZSBIRUFECisgICAgICBpZiBleHByICJ6JHJlZiIgOiAnelwuJyA+L2Rldi9udWxsCisgICAgICB0aGVuCisJICBub3RfZm9yX21lcmdlPXQKKwkgIHJlZj0kKGV4cHIgInokcmVmIiA6ICd6XC5cKC4qXCknKQorICAgICAgZWxzZQorCSAgbm90X2Zvcl9tZXJnZT0KKyAgICAgIGZpCisgICAgICBpZiBleHByICJ6JHJlZiIgOiAneisnID4vZGV2L251bGwKKyAgICAgIHRoZW4KKwkgIHNpbmdsZV9mb3JjZT10CisJICByZWY9JChleHByICJ6JHJlZiIgOiAneitcKC4qXCknKQorICAgICAgZWxzZQorCSAgc2luZ2xlX2ZvcmNlPQorICAgICAgZmkKKyAgICAgIHJlbW90ZV9uYW1lPSQoZXhwciAieiRyZWYiIDogJ3pcKFteOl0qXCk6JykKKyAgICAgIGxvY2FsX25hbWU9JChleHByICJ6JHJlZiIgOiAnelteOl0qOlwoLipcKScpCisKKyAgICAgIHJyZWY9IiRycmVmJExGJHJlbW90ZV9uYW1lIgorCisgICAgICAjIFRoZXJlIGFyZSB0cmFuc3BvcnRzIHRoYXQgY2FuIGZldGNoIG9ubHkgb25lIGhlYWQgYXQgYSB0aW1lLi4uCisgICAgICBjYXNlICIkcmVtb3RlIiBpbgorICAgICAgaHR0cDovLyogfCBodHRwczovLyogfCBmdHA6Ly8qKQorCSAgdGVzdCAtbiAiJHNoYWxsb3dfZGVwdGgiICYmCisJCWRpZSAic2hhbGxvdyBjbG9uZSB3aXRoIGh0dHAgbm90IHN1cHBvcnRlZCIKKwkgIHByb3RvPWBleHByICIkcmVtb3RlIiA6ICdcKFteOl0qXCk6J2AKKwkgIGlmIFsgLW4gIiRHSVRfU1NMX05PX1ZFUklGWSIgXTsgdGhlbgorCSAgICAgIGN1cmxfZXh0cmFfYXJncz0iLWsiCisJICBmaQorCSAgaWYgWyAtbiAiJEdJVF9DVVJMX0ZUUF9OT19FUFNWIiAtbyBcCisJCSJgZ2l0IGNvbmZpZyAtLWJvb2wgaHR0cC5ub0VQU1ZgIiA9IHRydWUgXTsgdGhlbgorCSAgICAgIG5vZXBzdl9vcHQ9Ii0tZGlzYWJsZS1lcHN2IgorCSAgZmkKKworCSAgIyBGaW5kICRyZW1vdGVfbmFtZSBmcm9tIGxzLXJlbW90ZSBvdXRwdXQuCisJICBoZWFkPSQoZWNobyAiJGxzX3JlbW90ZV9yZXN1bHQiIHwgXAorCQlnaXQgZmV0Y2gtLXRvb2wgLXMgcGljay1ycmVmICIkcmVtb3RlX25hbWUiICItIikKKwkgIGV4cHIgInokaGVhZCIgOiAieiRfeDQwXCQiID4vZGV2L251bGwgfHwKKwkJZGllICJObyBzdWNoIHJlZiAkcmVtb3RlX25hbWUgYXQgJHJlbW90ZSIKKwkgIGVjaG8gPiYyICJGZXRjaGluZyAkcmVtb3RlX25hbWUgZnJvbSAkcmVtb3RlIHVzaW5nICRwcm90byIKKwkgIGNhc2UgIiRxdWlldCIgaW4gJycpIHY9LXYgOzsgKikgdj0gOzsgZXNhYworCSAgZ2l0LWh0dHAtZmV0Y2ggJHYgLWEgIiRoZWFkIiAiJHJlbW90ZSIgfHwgZXhpdAorCSAgOzsKKyAgICAgIHJzeW5jOi8vKikKKwkgIHRlc3QgLW4gIiRzaGFsbG93X2RlcHRoIiAmJgorCQlkaWUgInNoYWxsb3cgY2xvbmUgd2l0aCByc3luYyBub3Qgc3VwcG9ydGVkIgorCSAgVE1QX0hFQUQ9IiRHSVRfRElSL1RNUF9IRUFEIgorCSAgcnN5bmMgLUwgLXEgIiRyZW1vdGUvJHJlbW90ZV9uYW1lIiAiJFRNUF9IRUFEIiB8fCBleGl0IDEKKwkgIGhlYWQ9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IFRNUF9IRUFEKQorCSAgcm0gLWYgIiRUTVBfSEVBRCIKKwkgIGNhc2UgIiRxdWlldCIgaW4gJycpIHY9LXYgOzsgKikgdj0gOzsgZXNhYworCSAgdGVzdCAiJHJzeW5jX3NsdXJwZWRfb2JqZWN0cyIgfHwgeworCSAgICAgIHJzeW5jIC1hICR2IC0taWdub3JlLWV4aXN0aW5nIC0tZXhjbHVkZSBpbmZvIFwKKwkJICAiJHJlbW90ZS9vYmplY3RzLyIgIiRHSVRfT0JKRUNUX0RJUkVDVE9SWS8iIHx8IGV4aXQKKworCSAgICAgICMgTG9vayBhdCBvYmplY3RzL2luZm8vYWx0ZXJuYXRlcyBmb3IgcnN5bmMgLS0gaHR0cCB3aWxsCisJICAgICAgIyBzdXBwb3J0IGl0IG5hdGl2ZWx5IGFuZCBnaXQgbmF0aXZlIG9uZXMgd2lsbCBkbyBpdCBvbgorCSAgICAgICMgdGhlIHJlbW90ZSBlbmQuICBOb3QgaGF2aW5nIHRoYXQgZmlsZSBpcyBub3QgYSBjcmltZS4KKwkgICAgICByc3luYyAtcSAiJHJlbW90ZS9vYmplY3RzL2luZm8vYWx0ZXJuYXRlcyIgXAorCQkgICIkR0lUX0RJUi9UTVBfQUxUIiAyPi9kZXYvbnVsbCB8fAorCQkgIHJtIC1mICIkR0lUX0RJUi9UTVBfQUxUIgorCSAgICAgIGlmIHRlc3QgLWYgIiRHSVRfRElSL1RNUF9BTFQiCisJICAgICAgdGhlbgorCQkgIHJlc29sdmVfYWx0ZXJuYXRlcyAiJHJlbW90ZSIgPCIkR0lUX0RJUi9UTVBfQUxUIiB8CisJCSAgd2hpbGUgcmVhZCBhbHQKKwkJICBkbworCQkgICAgICBjYXNlICIkYWx0IiBpbiAnYmFkIGFsdGVybmF0ZTogJyopIGRpZSAiJGFsdCI7OyBlc2FjCisJCSAgICAgIGVjaG8gPiYyICJHZXR0aW5nIGFsdGVybmF0ZTogJGFsdCIKKwkJICAgICAgcnN5bmMgLWF2IC0taWdub3JlLWV4aXN0aW5nIC0tZXhjbHVkZSBpbmZvIFwKKwkJICAgICAgIiRhbHQiICIkR0lUX09CSkVDVF9ESVJFQ1RPUlkvIiB8fCBleGl0CisJCSAgZG9uZQorCQkgIHJtIC1mICIkR0lUX0RJUi9UTVBfQUxUIgorCSAgICAgIGZpCisJICAgICAgcnN5bmNfc2x1cnBlZF9vYmplY3RzPXQKKwkgIH0KKwkgIDs7CisgICAgICBlc2FjCisKKyAgICAgIGFwcGVuZF9mZXRjaF9oZWFkICIkaGVhZCIgIiRyZW1vdGUiIFwKKwkgICIkcmVtb3RlX25hbWUiICIkcmVtb3RlX25pY2siICIkbG9jYWxfbmFtZSIgIiRub3RfZm9yX21lcmdlIiB8fCBleGl0CisKKyAgZG9uZQorCit9CisKK2ZldGNoX21haW4gKCkgeworCWNhc2UgIiRyZW1vdGUiIGluCisJaHR0cDovLyogfCBodHRwczovLyogfCBmdHA6Ly8qIHwgcnN5bmM6Ly8qICkKKwkJZmV0Y2hfcGVyX3JlZiAiJEAiCisJCTs7CisJKikKKwkJZmV0Y2hfYWxsX2F0X29uY2UgIiRAIgorCQk7OworCWVzYWMKK30KKworZmV0Y2hfbWFpbiAiJHJlZmxpc3QiIHx8IGV4aXQKKworIyBhdXRvbWF0ZWQgdGFnIGZvbGxvd2luZworY2FzZSAiJG5vX3RhZ3MkdGFncyIgaW4KKycnKQorCWNhc2UgIiRyZWZsaXN0IiBpbgorCSo6cmVmcy8qKQorCQkjIGVmZmVjdGl2ZSBvbmx5IHdoZW4gd2UgYXJlIGZvbGxvd2luZyByZW1vdGUgYnJhbmNoCisJCSMgdXNpbmcgbG9jYWwgdHJhY2tpbmcgYnJhbmNoLgorCQl0YWdsaXN0PSQoSUZTPScJJyAmJgorCQllY2hvICIkbHNfcmVtb3RlX3Jlc3VsdCIgfAorCQlnaXQgc2hvdy1yZWYgLS1leGNsdWRlLWV4aXN0aW5nPXJlZnMvdGFncy8gfAorCQl3aGlsZSByZWFkIHNoYTEgbmFtZQorCQlkbworCQkJZ2l0IGNhdC1maWxlIC10ICIkc2hhMSIgPi9kZXYvbnVsbCAyPiYxIHx8IGNvbnRpbnVlCisJCQllY2hvID4mMiAiQXV0by1mb2xsb3dpbmcgJG5hbWUiCisJCQllY2hvICIuJHtuYW1lfToke25hbWV9IgorCQlkb25lKQorCWVzYWMKKwljYXNlICIkdGFnbGlzdCIgaW4KKwknJykgOzsKKwk/KikKKwkJIyBkbyBub3QgZGVlcGVuIGEgc2hhbGxvdyB0cmVlIHdoZW4gZm9sbG93aW5nIHRhZ3MKKwkJc2hhbGxvd19kZXB0aD0KKwkJZmV0Y2hfbWFpbiAiJHRhZ2xpc3QiIHx8IGV4aXQgOzsKKwllc2FjCitlc2FjCisKKyMgSWYgdGhlIG9yaWdpbmFsIGhlYWQgd2FzIGVtcHR5IChpLmUuIG5vICJtYXN0ZXIiIHlldCksIG9yCisjIGlmIHdlIHdlcmUgdG9sZCBub3QgdG8gd29ycnksIHdlIGRvIG5vdCBoYXZlIHRvIGNoZWNrLgorY2FzZSAiJG9yaWdfaGVhZCIgaW4KKycnKQorCTs7Cis/KikKKwljdXJyX2hlYWQ9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQgMj4vZGV2L251bGwpCisJaWYgdGVzdCAiJGN1cnJfaGVhZCIgIT0gIiRvcmlnX2hlYWQiCisJdGhlbgorCSAgICBnaXQgdXBkYXRlLXJlZiBcCisJCQktbSAiJEdJVF9SRUZMT0dfQUNUSU9OOiBVbmRvaW5nIGluY29ycmVjdGx5IGZldGNoZWQgSEVBRC4iIFwKKwkJCUhFQUQgIiRvcmlnX2hlYWQiCisJCWRpZSAiQ2Fubm90IGZldGNoIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoLiIKKwlmaQorCTs7Citlc2FjCmRpZmYgLS1naXQgYS9jb250cmliL2V4YW1wbGVzL2dpdC1nYy5zaCBiL2NvbnRyaWIvZXhhbXBsZXMvZ2l0LWdjLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE1OTdlOWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2V4YW1wbGVzL2dpdC1nYy5zaApAQCAtMCwwICsxLDM3IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2LCBTaGF3biBPLiBQZWFyY2UKKyMKKyMgQ2xlYW51cCB1bnJlYWNoYWJsZSBmaWxlcyBhbmQgb3B0aW1pemUgdGhlIHJlcG9zaXRvcnkuCisKK1VTQUdFPSdbLS1wcnVuZV0nCitTVUJESVJFQ1RPUllfT0s9WWVzCisuIGdpdC1zaC1zZXR1cAorCitub19wcnVuZT06Cit3aGlsZSB0ZXN0ICQjICE9IDAKK2RvCisJY2FzZSAiJDEiIGluCisJLS1wcnVuZSkKKwkJbm9fcHJ1bmU9CisJCTs7CisJLS0pCisJCXVzYWdlCisJCTs7CisJZXNhYworCXNoaWZ0Citkb25lCisKK2Nhc2UgIiQoZ2l0IGNvbmZpZyAtLWdldCBnYy5wYWNrcmVmcykiIGluCitub3RiYXJlfCIiKQorCXRlc3QgJChpc19iYXJlX3JlcG9zaXRvcnkpID0gdHJ1ZSB8fCBwYWNrX3JlZnM9dHJ1ZTs7CisqKQorCXBhY2tfcmVmcz0kKGdpdCBjb25maWcgLS1ib29sIC0tZ2V0IGdjLnBhY2tyZWZzKQorZXNhYworCit0ZXN0ICJ0cnVlIiAhPSAiJHBhY2tfcmVmcyIgfHwKK2dpdCBwYWNrLXJlZnMgLS1wcnVuZSAmJgorZ2l0IHJlZmxvZyBleHBpcmUgLS1hbGwgJiYKK2dpdC1yZXBhY2sgLWEgLWQgLWwgJiYKKyRub19wcnVuZSBnaXQgcHJ1bmUgJiYKK2dpdCByZXJlcmUgZ2MgfHwgZXhpdApkaWZmIC0tZ2l0IGEvY29udHJpYi9leGFtcGxlcy9naXQtbHMtcmVtb3RlLnNoIGIvY29udHJpYi9leGFtcGxlcy9naXQtbHMtcmVtb3RlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZlYzcwYmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2V4YW1wbGVzL2dpdC1scy1yZW1vdGUuc2gKQEAgLTAsMCArMSwxNDIgQEAKKyMhL2Jpbi9zaAorIworCit1c2FnZSAoKSB7CisgICAgZWNobyA+JjIgInVzYWdlOiAkMCBbLS1oZWFkc10gWy0tdGFnc10gWy11fC0tdXBsb2FkLXBhY2sgPHVwbG9hZC1wYWNrPl0iCisgICAgZWNobyA+JjIgIiAgICAgICAgICA8cmVwb3NpdG9yeT4gPHJlZnM+Li4uIgorICAgIGV4aXQgMTsKK30KKworZGllICgpIHsKKyAgICBlY2hvID4mMiAiJCoiCisgICAgZXhpdCAxCit9CisKK2V4ZWM9Cit3aGlsZSB0ZXN0ICQjICE9IDAKK2RvCisgIGNhc2UgIiQxIiBpbgorICAtaHwtLWh8LS1oZXwtLWhlYXwtLWhlYWR8LS1oZWFkcykKKyAgaGVhZHM9aGVhZHM7IHNoaWZ0IDs7CisgIC10fC0tdHwtLXRhfC0tdGFnfC0tdGFncykKKyAgdGFncz10YWdzOyBzaGlmdCA7OworICAtdXwtLXV8LS11cHwtLXVwbHwtLXVwbG9hfC0tdXBsb2FkfC0tdXBsb2FkLXwtLXVwbG9hZC1wfC0tdXBsb2FkLXBhfFwKKyAgLS11cGxvYWQtcGFjfC0tdXBsb2FkLXBhY2spCisJc2hpZnQKKwlleGVjPSItLXVwbG9hZC1wYWNrPSQxIgorCXNoaWZ0OzsKKyAgLXU9KnwtLXU9KnwtLXVwPSp8LS11cGw9KnwtLXVwbG89KnwtLXVwbG9hPSp8LS11cGxvYWQ9KnxcCisgIC0tdXBsb2FkLT0qfC0tdXBsb2FkLXA9KnwtLXVwbG9hZC1wYT0qfC0tdXBsb2FkLXBhYz0qfC0tdXBsb2FkLXBhY2s9KikKKwlleGVjPS0tdXBsb2FkLXBhY2s9JChleHByICJ6JDEiIDogJ3otW149XSo9XCguKlwpJykKKwlzaGlmdDs7CisgIC0tKQorICBzaGlmdDsgYnJlYWsgOzsKKyAgLSopCisgIHVzYWdlIDs7CisgICopCisgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworY2FzZSAiJCMiIGluIDApIHVzYWdlIDs7IGVzYWMKKworY2FzZSAiLCRoZWFkcywkdGFncywiIGluCissLCwpIGhlYWRzPWhlYWRzIHRhZ3M9dGFncyBvdGhlcj1vdGhlciA7OworZXNhYworCisuIGdpdC1wYXJzZS1yZW1vdGUKK3BlZWtfcmVwbz0iJChnZXRfcmVtb3RlX3VybCAiJEAiKSIKK3NoaWZ0CisKK3RtcD0ubHMtcmVtb3RlLSQkCit0cmFwICJybSAtZnIgJHRtcC0qIiAwIDEgMiAzIDE1Cit0bXBkaXI9JHRtcC1kCisKK2Nhc2UgIiRwZWVrX3JlcG8iIGluCitodHRwOi8vKiB8IGh0dHBzOi8vKiB8IGZ0cDovLyogKQorCWlmIFsgLW4gIiRHSVRfU1NMX05PX1ZFUklGWSIgLW8gXAorCQkiYGdpdCBjb25maWcgLS1ib29sIGh0dHAuc3NsVmVyaWZ5YCIgPSBmYWxzZSBdOyB0aGVuCisJCWN1cmxfZXh0cmFfYXJncz0iLWsiCisJZmkKKwlpZiBbIC1uICIkR0lUX0NVUkxfRlRQX05PX0VQU1YiIC1vIFwKKwkJImBnaXQgY29uZmlnIC0tYm9vbCBodHRwLm5vRVBTVmAiID0gdHJ1ZSBdOyB0aGVuCisJCWN1cmxfZXh0cmFfYXJncz0iJHtjdXJsX2V4dHJhX2FyZ3N9IC0tZGlzYWJsZS1lcHN2IgorCWZpCisJY3VybCAtbnNmICRjdXJsX2V4dHJhX2FyZ3MgLS1oZWFkZXIgIlByYWdtYTogbm8tY2FjaGUiICIkcGVla19yZXBvL2luZm8vcmVmcyIgfHwKKwkJZWNobyAiZmFpbGVkCXNsdXJwaW5nIgorCTs7CisKK3JzeW5jOi8vKiApCisJbWtkaXIgJHRtcGRpciAmJgorCXJzeW5jIC1ybHEgIiRwZWVrX3JlcG8vSEVBRCIgJHRtcGRpciAmJgorCXJzeW5jIC1ycSAiJHBlZWtfcmVwby9yZWZzIiAkdG1wZGlyIHx8IHsKKwkJZWNobyAiZmFpbGVkCXNsdXJwaW5nIgorCQlleGl0CisJfQorCWhlYWQ9JChjYXQgIiR0bXBkaXIvSEVBRCIpICYmCisJY2FzZSAiJGhlYWQiIGluCisJcmVmOicgJyopCisJCWhlYWQ9JChleHByICJ6JGhlYWQiIDogJ3pyZWY6IFwoLipcKScpICYmCisJCWhlYWQ9JChjYXQgIiR0bXBkaXIvJGhlYWQiKSB8fCBleGl0CisJZXNhYyAmJgorCWVjaG8gIiRoZWFkCUhFQUQiCisJKGNkICR0bXBkaXIgJiYgZmluZCByZWZzIC10eXBlIGYpIHwKKwl3aGlsZSByZWFkIHBhdGgKKwlkbworCQl0ciAtZCAnXDAxMicgPCIkdG1wZGlyLyRwYXRoIgorCQllY2hvICIJJHBhdGgiCisJZG9uZSAmJgorCXJtIC1mciAkdG1wZGlyCisJOzsKKworKiApCisJaWYgdGVzdCAtZiAiJHBlZWtfcmVwbyIgOyB0aGVuCisJCWdpdCBidW5kbGUgbGlzdC1oZWFkcyAiJHBlZWtfcmVwbyIgfHwKKwkJZWNobyAiZmFpbGVkCXNsdXJwaW5nIgorCWVsc2UKKwkJZ2l0LXBlZWstcmVtb3RlICRleGVjICIkcGVla19yZXBvIiB8fAorCQllY2hvICJmYWlsZWQJc2x1cnBpbmciCisJZmkKKwk7OworZXNhYyB8Citzb3J0IC10ICcJJyAtayAyIHwKK3doaWxlIHJlYWQgc2hhMSBwYXRoCitkbworCWNhc2UgIiRzaGExIiBpbgorCWZhaWxlZCkKKwkJZXhpdCAxIDs7CisJZXNhYworCWNhc2UgIiRwYXRoIiBpbgorCXJlZnMvaGVhZHMvKikKKwkJZ3JvdXA9aGVhZHMgOzsKKwlyZWZzL3RhZ3MvKikKKwkJZ3JvdXA9dGFncyA7OworCSopCisJCWdyb3VwPW90aGVyIDs7CisJZXNhYworCWNhc2UgIiwkaGVhZHMsJHRhZ3MsJG90aGVyLCIgaW4KKwkqLCRncm91cCwqKQorCQk7OworCSopCisJCWNvbnRpbnVlOzsKKwllc2FjCisJY2FzZSAiJCMiIGluCisJMCkKKwkJbWF0Y2g9eWVzIDs7CisJKikKKwkJbWF0Y2g9bm8KKwkJZm9yIHBhdAorCQlkbworCQkJY2FzZSAiLyRwYXRoIiBpbgorCQkJKi8kcGF0ICkKKwkJCQltYXRjaD15ZXMKKwkJCQlicmVhayA7OworCQkJZXNhYworCQlkb25lCisJZXNhYworCWNhc2UgIiRtYXRjaCIgaW4KKwlubykKKwkJY29udGludWUgOzsKKwllc2FjCisJZWNobyAiJHNoYTEJJHBhdGgiCitkb25lCmRpZmYgLS1naXQgYS9jb250cmliL2V4YW1wbGVzL2dpdC1tZXJnZS1vdXJzLnNoIGIvY29udHJpYi9leGFtcGxlcy9naXQtbWVyZ2Utb3Vycy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOWRiYTRiCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9leGFtcGxlcy9naXQtbWVyZ2Utb3Vycy5zaApAQCAtMCwwICsxLDE0IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisjIFByZXRlbmQgd2UgcmVzb2x2ZWQgdGhlIGhlYWRzLCBidXQgZGVjbGFyZSBvdXIgdHJlZSB0cnVtcHMgZXZlcnlib2R5IGVsc2UuCisjCisKKyMgV2UgbmVlZCB0byBleGl0IHdpdGggMiBpZiB0aGUgaW5kZXggZG9lcyBub3QgbWF0Y2ggb3VyIEhFQUQgdHJlZSwKKyMgYmVjYXVzZSB0aGUgY3VycmVudCBpbmRleCBpcyB3aGF0IHdlIHdpbGwgYmUgY29tbWl0dGluZyBhcyB0aGUKKyMgbWVyZ2UgcmVzdWx0LgorCitnaXQgZGlmZi1pbmRleCAtLXF1aWV0IC0tY2FjaGVkIEhFQUQgLS0gfHwgZXhpdCAyCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvY29udHJpYi9leGFtcGxlcy9naXQtcmVtb3RlLnBlcmwgYi9jb250cmliL2V4YW1wbGVzL2dpdC1yZW1vdGUucGVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMzBlZDczCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9leGFtcGxlcy9naXQtcmVtb3RlLnBlcmwKQEAgLTAsMCArMSw0NzcgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCit1c2Ugc3RyaWN0OwordXNlIEdpdDsKK215ICRnaXQgPSBHaXQtPnJlcG9zaXRvcnkoKTsKKworc3ViIGFkZF9yZW1vdGVfY29uZmlnIHsKKwlteSAoJGhhc2gsICRuYW1lLCAkd2hhdCwgJHZhbHVlKSA9IEBfOworCWlmICgkd2hhdCBlcSAndXJsJykgeworCQkjIEhhdmluZyBtb3JlIHRoYW4gb25lIGlzIE9rIC0tIGl0IGlzIHVzZWQgZm9yIHB1c2guCisJCWlmICghIGV4aXN0cyAkaGFzaC0+eydVUkwnfSkgeworCQkJJGhhc2gtPnskbmFtZX17J1VSTCd9ID0gJHZhbHVlOworCQl9CisJfQorCWVsc2lmICgkd2hhdCBlcSAnZmV0Y2gnKSB7CisJCSRoYXNoLT57JG5hbWV9eydGRVRDSCd9IHx8PSBbXTsKKwkJcHVzaCBAeyRoYXNoLT57JG5hbWV9eydGRVRDSCd9fSwgJHZhbHVlOworCX0KKwllbHNpZiAoJHdoYXQgZXEgJ3B1c2gnKSB7CisJCSRoYXNoLT57JG5hbWV9eydQVVNIJ30gfHw9IFtdOworCQlwdXNoIEB7JGhhc2gtPnskbmFtZX17J1BVU0gnfX0sICR2YWx1ZTsKKwl9CisJaWYgKCFleGlzdHMgJGhhc2gtPnskbmFtZX17J1NPVVJDRSd9KSB7CisJCSRoYXNoLT57JG5hbWV9eydTT1VSQ0UnfSA9ICdjb25maWcnOworCX0KK30KKworc3ViIGFkZF9yZW1vdGVfcmVtb3RlcyB7CisJbXkgKCRoYXNoLCAkZmlsZSwgJG5hbWUpID0gQF87CisKKwlpZiAoZXhpc3RzICRoYXNoLT57JG5hbWV9KSB7CisJCSRoYXNoLT57JG5hbWV9eydXQVJOSU5HJ30gPSAnaWdub3JlZCBkdWUgdG8gY29uZmlnJzsKKwkJcmV0dXJuOworCX0KKworCW15ICRmaDsKKwlpZiAoIW9wZW4oJGZoLCAnPCcsICRmaWxlKSkgeworCQlwcmludCBTVERFUlIgIldhcm5pbmc6IGNhbm5vdCBvcGVuICRmaWxlXG4iOworCQlyZXR1cm47CisJfQorCW15ICRpdCA9IHsgJ1NPVVJDRScgPT4gJ3JlbW90ZXMnIH07CisJJGhhc2gtPnskbmFtZX0gPSAkaXQ7CisJd2hpbGUgKDwkZmg+KSB7CisJCWNob21wOworCQlpZiAoL15VUkw6XHMqKC4qKSQvKSB7CisJCQkjIEhhdmluZyBtb3JlIHRoYW4gb25lIGlzIE9rIC0tIGl0IGlzIHVzZWQgZm9yIHB1c2guCisJCQlpZiAoISBleGlzdHMgJGl0LT57J1VSTCd9KSB7CisJCQkJJGl0LT57J1VSTCd9ID0gJDE7CisJCQl9CisJCX0KKwkJZWxzaWYgKC9eUHVzaDpccyooLiopJC8pIHsKKwkJCSRpdC0+eydQVVNIJ30gfHw9IFtdOworCQkJcHVzaCBAeyRpdC0+eydQVVNIJ319LCAkMTsKKwkJfQorCQllbHNpZiAoL15QdWxsOlxzKiguKikkLykgeworCQkJJGl0LT57J0ZFVENIJ30gfHw9IFtdOworCQkJcHVzaCBAeyRpdC0+eydGRVRDSCd9fSwgJDE7CisJCX0KKwkJZWxzaWYgKC9eXCMvKSB7CisJCQk7ICMgaWdub3JlCisJCX0KKwkJZWxzZSB7CisJCQlwcmludCBTVERFUlIgIldhcm5pbmc6IGZ1bm55IGxpbmUgaW4gJGZpbGU6ICRfXG4iOworCQl9CisJfQorCWNsb3NlKCRmaCk7Cit9CisKK3N1YiBsaXN0X3JlbW90ZSB7CisJbXkgKCRnaXQpID0gQF87CisJbXkgJXNlZW4gPSAoKTsKKwlteSBAcmVtb3RlcyA9IGV2YWwgeworCQkkZ2l0LT5jb21tYW5kKHF3KGNvbmZpZyAtLWdldC1yZWdleHApLCAnXnJlbW90ZVwuJyk7CisJfTsKKwlmb3IgKEByZW1vdGVzKSB7CisJCWlmICgvXnJlbW90ZVwuKFxTKz8pXC4oW14uXHNdKylccysoLiopJC8pIHsKKwkJCWFkZF9yZW1vdGVfY29uZmlnKFwlc2VlbiwgJDEsICQyLCAkMyk7CisJCX0KKwl9CisKKwlteSAkZGlyID0gJGdpdC0+cmVwb19wYXRoKCkgLiAiL3JlbW90ZXMiOworCWlmIChvcGVuZGlyKG15ICRkaCwgJGRpcikpIHsKKwkJbG9jYWwgJF87CisJCXdoaWxlICgkXyA9IHJlYWRkaXIoJGRoKSkgeworCQkJY2hvbXA7CisJCQluZXh0IGlmICghIC1mICIkZGlyLyRfIiB8fCAhIC1yIF8pOworCQkJYWRkX3JlbW90ZV9yZW1vdGVzKFwlc2VlbiwgIiRkaXIvJF8iLCAkXyk7CisJCX0KKwl9CisKKwlyZXR1cm4gXCVzZWVuOworfQorCitzdWIgYWRkX2JyYW5jaF9jb25maWcgeworCW15ICgkaGFzaCwgJG5hbWUsICR3aGF0LCAkdmFsdWUpID0gQF87CisJaWYgKCR3aGF0IGVxICdyZW1vdGUnKSB7CisJCWlmIChleGlzdHMgJGhhc2gtPnskbmFtZX17J1JFTU9URSd9KSB7CisJCQlwcmludCBTVERFUlIgIldhcm5pbmc6IG1vcmUgdGhhbiBvbmUgYnJhbmNoLiRuYW1lLnJlbW90ZVxuIjsKKwkJfQorCQkkaGFzaC0+eyRuYW1lfXsnUkVNT1RFJ30gPSAkdmFsdWU7CisJfQorCWVsc2lmICgkd2hhdCBlcSAnbWVyZ2UnKSB7CisJCSRoYXNoLT57JG5hbWV9eydNRVJHRSd9IHx8PSBbXTsKKwkJcHVzaCBAeyRoYXNoLT57JG5hbWV9eydNRVJHRSd9fSwgJHZhbHVlOworCX0KK30KKworc3ViIGxpc3RfYnJhbmNoIHsKKwlteSAoJGdpdCkgPSBAXzsKKwlteSAlc2VlbiA9ICgpOworCW15IEBicmFuY2hlcyA9IGV2YWwgeworCQkkZ2l0LT5jb21tYW5kKHF3KGNvbmZpZyAtLWdldC1yZWdleHApLCAnXmJyYW5jaFwuJyk7CisJfTsKKwlmb3IgKEBicmFuY2hlcykgeworCQlpZiAoL15icmFuY2hcLihbXi5dKilcLihcUyopXHMrKC4qKSQvKSB7CisJCQlhZGRfYnJhbmNoX2NvbmZpZyhcJXNlZW4sICQxLCAkMiwgJDMpOworCQl9CisJfQorCisJcmV0dXJuIFwlc2VlbjsKK30KKworbXkgJHJlbW90ZSA9IGxpc3RfcmVtb3RlKCRnaXQpOworbXkgJGJyYW5jaCA9IGxpc3RfYnJhbmNoKCRnaXQpOworCitzdWIgdXBkYXRlX2xzX3JlbW90ZSB7CisJbXkgKCRoYXJkZXIsICRpbmZvKSA9IEBfOworCisJcmV0dXJuIGlmICgoJGhhcmRlciA9PSAwKSB8fAorCQkgICAoKCRoYXJkZXIgPT0gMSkgJiYgZXhpc3RzICRpbmZvLT57J0xTX1JFTU9URSd9KSk7CisKKwlteSBAcmVmID0gbWFwIHsKKwkJc3xeWzAtOWEtZl17NDB9XHMrcmVmcy9oZWFkcy98fDsKKwkJJF87CisJfSAkZ2l0LT5jb21tYW5kKHF3KGxzLXJlbW90ZSAtLWhlYWRzKSwgJGluZm8tPnsnVVJMJ30pOworCSRpbmZvLT57J0xTX1JFTU9URSd9ID0gXEByZWY7Cit9CisKK3N1YiBsaXN0X3dpbGRjYXJkX21hcHBpbmcgeworCW15ICgkZm9yY2VkLCAkb3VycywgJGxzKSA9IEBfOworCW15ICVyZWZzOworCWZvciAoQCRscykgeworCQkkcmVmc3skX30gPSAwMTsgIyBiaXQgIzAgdG8gc2F5ICJ0aGV5IGhhdmUiCisJfQorCWZvciAoJGdpdC0+Y29tbWFuZCgnZm9yLWVhY2gtcmVmJywgInJlZnMvcmVtb3Rlcy8kb3VycyIpKSB7CisJCWNob21wOworCQluZXh0IHVubGVzcyAoc3xeWzAtOWEtZl17NDB9XHNbYS16XStcc3JlZnMvcmVtb3Rlcy8kb3Vycy98fCk7CisJCW5leHQgaWYgKCRfIGVxICdIRUFEJyk7CisJCSRyZWZzeyRffSB8fD0gMDsKKwkJJHJlZnN7JF99IHw9IDAyOyAjIGJpdCAjMSB0byBzYXkgIndlIGhhdmUiCisJfQorCW15IChAbmV3LCBAc3RhbGUsIEB0cmFja2VkKTsKKwlmb3IgKHNvcnQga2V5cyAlcmVmcykgeworCQlteSAkaGF2ZSA9ICRyZWZzeyRffTsKKwkJaWYgKCRoYXZlID09IDEpIHsKKwkJCXB1c2ggQG5ldywgJF87CisJCX0KKwkJZWxzaWYgKCRoYXZlID09IDIpIHsKKwkJCXB1c2ggQHN0YWxlLCAkXzsKKwkJfQorCQllbHNpZiAoJGhhdmUgPT0gMykgeworCQkJcHVzaCBAdHJhY2tlZCwgJF87CisJCX0KKwl9CisJcmV0dXJuIFxAbmV3LCBcQHN0YWxlLCBcQHRyYWNrZWQ7Cit9CisKK3N1YiBsaXN0X21hcHBpbmcgeworCW15ICgkbmFtZSwgJGluZm8pID0gQF87CisJbXkgJGZldGNoID0gJGluZm8tPnsnRkVUQ0gnfTsKKwlteSAkbHMgPSAkaW5mby0+eydMU19SRU1PVEUnfTsKKwlteSAoQG5ldywgQHN0YWxlLCBAdHJhY2tlZCk7CisKKwlmb3IgKEAkZmV0Y2gpIHsKKwkJbmV4dCB1bmxlc3MgKC8oXCspPyhbXjpdKyk6KC4qKS8pOworCQlteSAoJGZvcmNlZCwgJHRoZWlycywgJG91cnMpID0gKCQxLCAkMiwgJDMpOworCQlpZiAoJHRoZWlycyBlcSAncmVmcy9oZWFkcy8qJyAmJgorCQkgICAgJG91cnMgPX4gL15yZWZzXC9yZW1vdGVzXC8oLiopXC9cKiQvKSB7CisJCQkjIHdpbGRjYXJkIG1hcHBpbmcKKwkJCW15ICgkd19uZXcsICR3X3N0YWxlLCAkd190cmFja2VkKQorCQkJCT0gbGlzdF93aWxkY2FyZF9tYXBwaW5nKCRmb3JjZWQsICQxLCAkbHMpOworCQkJcHVzaCBAbmV3LCBAJHdfbmV3OworCQkJcHVzaCBAc3RhbGUsIEAkd19zdGFsZTsKKwkJCXB1c2ggQHRyYWNrZWQsIEAkd190cmFja2VkOworCQl9CisJCWVsc2lmICgkdGhlaXJzID1+IC9cKi8gfHwgJG91cnMgPX4gL1wqLykgeworCQkJcHJpbnQgU1RERVJSICJXYXJuaW5nOiB1bnJlY29nbml6ZWQgbWFwcGluZyBpbiByZW1vdGVzLiRuYW1lLmZldGNoOiAkX1xuIjsKKwkJfQorCQllbHNpZiAoJHRoZWlycyA9fiBzfF5yZWZzL2hlYWRzL3x8KSB7CisJCQlpZiAoIWdyZXAgeyAkXyBlcSAkdGhlaXJzIH0gQCRscykgeworCQkJCXB1c2ggQHN0YWxlLCAkdGhlaXJzOworCQkJfQorCQkJZWxzaWYgKCRvdXJzIG5lICcnKSB7CisJCQkJcHVzaCBAdHJhY2tlZCwgJHRoZWlyczsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gXEBuZXcsIFxAc3RhbGUsIFxAdHJhY2tlZDsKK30KKworc3ViIHNob3dfbWFwcGluZyB7CisJbXkgKCRuYW1lLCAkaW5mbykgPSBAXzsKKwlteSAoJG5ldywgJHN0YWxlLCAkdHJhY2tlZCkgPSBsaXN0X21hcHBpbmcoJG5hbWUsICRpbmZvKTsKKwlpZiAoQCRuZXcpIHsKKwkJcHJpbnQgIiAgTmV3IHJlbW90ZSBicmFuY2hlcyAobmV4dCBmZXRjaCB3aWxsIHN0b3JlIGluIHJlbW90ZXMvJG5hbWUpXG4iOworCQlwcmludCAiICAgIEAkbmV3XG4iOworCX0KKwlpZiAoQCRzdGFsZSkgeworCQlwcmludCAiICBTdGFsZSB0cmFja2luZyBicmFuY2hlcyBpbiByZW1vdGVzLyRuYW1lICh1c2UgJ2dpdCByZW1vdGUgcHJ1bmUnKVxuIjsKKwkJcHJpbnQgIiAgICBAJHN0YWxlXG4iOworCX0KKwlpZiAoQCR0cmFja2VkKSB7CisJCXByaW50ICIgIFRyYWNrZWQgcmVtb3RlIGJyYW5jaGVzXG4iOworCQlwcmludCAiICAgIEAkdHJhY2tlZFxuIjsKKwl9Cit9CisKK3N1YiBwcnVuZV9yZW1vdGUgeworCW15ICgkbmFtZSwgJGxzX3JlbW90ZSkgPSBAXzsKKwlpZiAoIWV4aXN0cyAkcmVtb3RlLT57JG5hbWV9KSB7CisJCXByaW50IFNUREVSUiAiTm8gc3VjaCByZW1vdGUgJG5hbWVcbiI7CisJCXJldHVybiAxOworCX0KKwlteSAkaW5mbyA9ICRyZW1vdGUtPnskbmFtZX07CisJdXBkYXRlX2xzX3JlbW90ZSgkbHNfcmVtb3RlLCAkaW5mbyk7CisKKwlteSAoJG5ldywgJHN0YWxlLCAkdHJhY2tlZCkgPSBsaXN0X21hcHBpbmcoJG5hbWUsICRpbmZvKTsKKwlteSAkcHJlZml4ID0gInJlZnMvcmVtb3Rlcy8kbmFtZSI7CisJZm9yZWFjaCBteSAkdG9fcHJ1bmUgKEAkc3RhbGUpIHsKKwkJbXkgQHYgPSAkZ2l0LT5jb21tYW5kKHF3KHJldi1wYXJzZSAtLXZlcmlmeSksICIkcHJlZml4LyR0b19wcnVuZSIpOworCQkkZ2l0LT5jb21tYW5kKHF3KHVwZGF0ZS1yZWYgLWQpLCAiJHByZWZpeC8kdG9fcHJ1bmUiLCAkdlswXSk7CisJfQorCXJldHVybiAwOworfQorCitzdWIgc2hvd19yZW1vdGUgeworCW15ICgkbmFtZSwgJGxzX3JlbW90ZSkgPSBAXzsKKwlpZiAoIWV4aXN0cyAkcmVtb3RlLT57JG5hbWV9KSB7CisJCXByaW50IFNUREVSUiAiTm8gc3VjaCByZW1vdGUgJG5hbWVcbiI7CisJCXJldHVybiAxOworCX0KKwlteSAkaW5mbyA9ICRyZW1vdGUtPnskbmFtZX07CisJdXBkYXRlX2xzX3JlbW90ZSgkbHNfcmVtb3RlLCAkaW5mbyk7CisKKwlwcmludCAiKiByZW1vdGUgJG5hbWVcbiI7CisJcHJpbnQgIiAgVVJMOiAkaW5mby0+eydVUkwnfVxuIjsKKwlmb3IgbXkgJGJyYW5jaG5hbWUgKHNvcnQga2V5cyAlJGJyYW5jaCkgeworCQluZXh0IHVubGVzcyAoZGVmaW5lZCAkYnJhbmNoLT57JGJyYW5jaG5hbWV9eydSRU1PVEUnfSAmJgorCQkJICAgICAkYnJhbmNoLT57JGJyYW5jaG5hbWV9eydSRU1PVEUnfSBlcSAkbmFtZSk7CisJCW15IEBtZXJnZWQgPSBtYXAgeworCQkJc3xecmVmcy9oZWFkcy98fDsKKwkJCSRfOworCQl9IHNwbGl0KCcgJywiQHskYnJhbmNoLT57JGJyYW5jaG5hbWV9eydNRVJHRSd9fSIpOworCQluZXh0IHVubGVzcyAoQG1lcmdlZCk7CisJCXByaW50ICIgIFJlbW90ZSBicmFuY2goZXMpIG1lcmdlZCB3aXRoICdnaXQgcHVsbCcgd2hpbGUgb24gYnJhbmNoICRicmFuY2huYW1lXG4iOworCQlwcmludCAiICAgIEBtZXJnZWRcbiI7CisJfQorCWlmICgkaW5mby0+eydMU19SRU1PVEUnfSkgeworCQlzaG93X21hcHBpbmcoJG5hbWUsICRpbmZvKTsKKwl9CisJaWYgKCRpbmZvLT57J1BVU0gnfSkgeworCQlteSBAcHVzaGVkID0gbWFwIHsKKwkJCXN8XnJlZnMvaGVhZHMvfHw7CisJCQlzfF5cK3JlZnMvaGVhZHMvfCt8OworCQkJc3w6cmVmcy9oZWFkcy98Onw7CisJCQkkXzsKKwkJfSBAeyRpbmZvLT57J1BVU0gnfX07CisJCXByaW50ICIgIExvY2FsIGJyYW5jaChlcykgcHVzaGVkIHdpdGggJ2dpdCBwdXNoJ1xuIjsKKwkJcHJpbnQgIiAgICBAcHVzaGVkXG4iOworCX0KKwlyZXR1cm4gMDsKK30KKworc3ViIGFkZF9yZW1vdGUgeworCW15ICgkbmFtZSwgJHVybCwgJG9wdHMpID0gQF87CisJaWYgKGV4aXN0cyAkcmVtb3RlLT57JG5hbWV9KSB7CisJCXByaW50IFNUREVSUiAicmVtb3RlICRuYW1lIGFscmVhZHkgZXhpc3RzLlxuIjsKKwkJZXhpdCgxKTsKKwl9CisJJGdpdC0+Y29tbWFuZCgnY29uZmlnJywgInJlbW90ZS4kbmFtZS51cmwiLCAkdXJsKTsKKwlteSAkdHJhY2sgPSAkb3B0cy0+eyd0cmFjayd9IHx8IFsiKiJdOworCisJZm9yIChAJHRyYWNrKSB7CisJCSRnaXQtPmNvbW1hbmQoJ2NvbmZpZycsICctLWFkZCcsICJyZW1vdGUuJG5hbWUuZmV0Y2giLAorCQkJCSRvcHRzLT57J21pcnJvcid9ID8KKwkJCQkiK3JlZnMvJF86cmVmcy8kXyIgOgorCQkJCSIrcmVmcy9oZWFkcy8kXzpyZWZzL3JlbW90ZXMvJG5hbWUvJF8iKTsKKwl9CisJaWYgKCRvcHRzLT57J2ZldGNoJ30pIHsKKwkJJGdpdC0+Y29tbWFuZCgnZmV0Y2gnLCAkbmFtZSk7CisJfQorCWlmIChleGlzdHMgJG9wdHMtPnsnbWFzdGVyJ30pIHsKKwkJJGdpdC0+Y29tbWFuZCgnc3ltYm9saWMtcmVmJywgInJlZnMvcmVtb3Rlcy8kbmFtZS9IRUFEIiwKKwkJCSAgICAgICJyZWZzL3JlbW90ZXMvJG5hbWUvJG9wdHMtPnsnbWFzdGVyJ30iKTsKKwl9Cit9CisKK3N1YiB1cGRhdGVfcmVtb3RlIHsKKwlteSAoJG5hbWUpID0gQF87CisJbXkgQHJlbW90ZXM7CisKKyAgICAgICAgbXkgJGNvbmYgPSAkZ2l0LT5jb25maWcoInJlbW90ZXMuIiAuICRuYW1lKTsKKwlpZiAoZGVmaW5lZCgkY29uZikpIHsKKwkJQHJlbW90ZXMgPSBzcGxpdCgnICcsICRjb25mKTsKKwl9IGVsc2lmICgkbmFtZSBlcSAnZGVmYXVsdCcpIHsKKwkJQHJlbW90ZXMgPSAoKTsKKwkJZm9yIChzb3J0IGtleXMgJSRyZW1vdGUpIHsKKwkJCW15ICRkb19mZXRjaCA9ICRnaXQtPmNvbmZpZ19ib29sKCJyZW1vdGUuIiAuICRfIC4KKwkJCQkJCSAgICAiLnNraXBEZWZhdWx0VXBkYXRlIik7CisJCQl1bmxlc3MgKCRkb19mZXRjaCkgeworCQkJCXB1c2ggQHJlbW90ZXMsICRfOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcHJpbnQgU1RERVJSICJSZW1vdGUgZ3JvdXAgJG5hbWUgZG9lcyBub3QgZXhpc3RzLlxuIjsKKwkJZXhpdCgxKTsKKwl9CisJZm9yIChAcmVtb3RlcykgeworCQlwcmludCAiVXBkYXRpbmcgJF9cbiI7CisJCSRnaXQtPmNvbW1hbmQoJ2ZldGNoJywgIiRfIik7CisJfQorfQorCitzdWIgcm1fcmVtb3RlIHsKKwlteSAoJG5hbWUpID0gQF87CisJaWYgKCFleGlzdHMgJHJlbW90ZS0+eyRuYW1lfSkgeworCQlwcmludCBTVERFUlIgIk5vIHN1Y2ggcmVtb3RlICRuYW1lXG4iOworCQlyZXR1cm4gMTsKKwl9CisKKwkkZ2l0LT5jb21tYW5kKCdjb25maWcnLCAnLS1yZW1vdmUtc2VjdGlvbicsICJyZW1vdGUuJG5hbWUiKTsKKworCWV2YWwgeworCSAgICBteSBAdHJhY2tlcnMgPSAkZ2l0LT5jb21tYW5kKCdjb25maWcnLCAnLS1nZXQtcmVnZXhwJywKKwkJCSdicmFuY2guKi5yZW1vdGUnLCAkbmFtZSk7CisJCWZvciAoQHRyYWNrZXJzKSB7CisJCQkvXmJyYW5jaFwuKC4qKT9cLnJlbW90ZS87CisJCQkkZ2l0LT5jb25maWcoJy0tdW5zZXQnLCAiYnJhbmNoLiQxLnJlbW90ZSIpOworCQkJJGdpdC0+Y29uZmlnKCctLXVuc2V0JywgImJyYW5jaC4kMS5tZXJnZSIpOworCQl9CisJfTsKKworCW15IEByZWZzID0gJGdpdC0+Y29tbWFuZCgnZm9yLWVhY2gtcmVmJywKKwkJJy0tZm9ybWF0PSUocmVmbmFtZSkgJShvYmplY3RuYW1lKScsICJyZWZzL3JlbW90ZXMvJG5hbWUiKTsKKwlmb3IgKEByZWZzKSB7CisJCW15ICgkcmVmLCAkb2JqZWN0KSA9IHNwbGl0OworCQkkZ2l0LT5jb21tYW5kKHF3KHVwZGF0ZS1yZWYgLWQpLCAkcmVmLCAkb2JqZWN0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N1YiBhZGRfdXNhZ2UgeworCXByaW50IFNUREVSUiAiVXNhZ2U6IGdpdCByZW1vdGUgYWRkIFstZl0gWy10IHRyYWNrXSogWy1tIG1hc3Rlcl0gPG5hbWU+IDx1cmw+XG4iOworCWV4aXQoMSk7Cit9CisKK215ICRWRVJCT1NFID0gMDsKK0BBUkdWID0gZ3JlcCB7CisJaWYgKCRfIGVxICctdicgb3IgJF8gZXEgJy0tdmVyYm9zZScpIHsKKwkJJFZFUkJPU0U9MTsKKwkJMAorCX0gZWxzZSB7CisJCTEKKwl9Cit9IEBBUkdWOworCitpZiAoIUBBUkdWKSB7CisJZm9yIChzb3J0IGtleXMgJSRyZW1vdGUpIHsKKwkJcHJpbnQgIiRfIjsKKwkJcHJpbnQgIlx0JHJlbW90ZS0+eyRffS0+e1VSTH0iIGlmICRWRVJCT1NFOworCQlwcmludCAiXG4iOworCX0KK30KK2Vsc2lmICgkQVJHVlswXSBlcSAnc2hvdycpIHsKKwlteSAkbHNfcmVtb3RlID0gMTsKKwlteSAkaTsKKwlmb3IgKCRpID0gMTsgJGkgPCBAQVJHVjsgJGkrKykgeworCQlpZiAoJEFSR1ZbJGldIGVxICctbicpIHsKKwkJCSRsc19yZW1vdGUgPSAwOworCQl9CisJCWVsc2UgeworCQkJbGFzdDsKKwkJfQorCX0KKwlpZiAoJGkgPj0gQEFSR1YpIHsKKwkJcHJpbnQgU1RERVJSICJVc2FnZTogZ2l0IHJlbW90ZSBzaG93IDxyZW1vdGU+XG4iOworCQlleGl0KDEpOworCX0KKwlteSAkc3RhdHVzID0gMDsKKwlmb3IgKDsgJGkgPCBAQVJHVjsgJGkrKykgeworCQkkc3RhdHVzIHw9IHNob3dfcmVtb3RlKCRBUkdWWyRpXSwgJGxzX3JlbW90ZSk7CisJfQorCWV4aXQoJHN0YXR1cyk7Cit9CitlbHNpZiAoJEFSR1ZbMF0gZXEgJ3VwZGF0ZScpIHsKKwlpZiAoQEFSR1YgPD0gMSkgeworCQl1cGRhdGVfcmVtb3RlKCJkZWZhdWx0Iik7CisJCWV4aXQoMSk7CisJfQorCWZvciAobXkgJGkgPSAxOyAkaSA8IEBBUkdWOyAkaSsrKSB7CisJCXVwZGF0ZV9yZW1vdGUoJEFSR1ZbJGldKTsKKwl9Cit9CitlbHNpZiAoJEFSR1ZbMF0gZXEgJ3BydW5lJykgeworCW15ICRsc19yZW1vdGUgPSAxOworCW15ICRpOworCWZvciAoJGkgPSAxOyAkaSA8IEBBUkdWOyAkaSsrKSB7CisJCWlmICgkQVJHVlskaV0gZXEgJy1uJykgeworCQkJJGxzX3JlbW90ZSA9IDA7CisJCX0KKwkJZWxzZSB7CisJCQlsYXN0OworCQl9CisJfQorCWlmICgkaSA+PSBAQVJHVikgeworCQlwcmludCBTVERFUlIgIlVzYWdlOiBnaXQgcmVtb3RlIHBydW5lIDxyZW1vdGU+XG4iOworCQlleGl0KDEpOworCX0KKwlteSAkc3RhdHVzID0gMDsKKwlmb3IgKDsgJGkgPCBAQVJHVjsgJGkrKykgeworCQkkc3RhdHVzIHw9IHBydW5lX3JlbW90ZSgkQVJHVlskaV0sICRsc19yZW1vdGUpOworCX0KKyAgICAgICAgZXhpdCgkc3RhdHVzKTsKK30KK2Vsc2lmICgkQVJHVlswXSBlcSAnYWRkJykgeworCW15ICVvcHRzID0gKCk7CisJd2hpbGUgKDEgPCBAQVJHViAmJiAkQVJHVlsxXSA9fiAvXi0vKSB7CisJCW15ICRvcHQgPSAkQVJHVlsxXTsKKwkJc2hpZnQgQEFSR1Y7CisJCWlmICgkb3B0IGVxICctZicgfHwgJG9wdCBlcSAnLS1mZXRjaCcpIHsKKwkJCSRvcHRzeydmZXRjaCd9ID0gMTsKKwkJCW5leHQ7CisJCX0KKwkJaWYgKCRvcHQgZXEgJy10JyB8fCAkb3B0IGVxICctLXRyYWNrJykgeworCQkJaWYgKEBBUkdWIDwgMSkgeworCQkJCWFkZF91c2FnZSgpOworCQkJfQorCQkJJG9wdHN7J3RyYWNrJ30gfHw9IFtdOworCQkJcHVzaCBAeyRvcHRzeyd0cmFjayd9fSwgJEFSR1ZbMV07CisJCQlzaGlmdCBAQVJHVjsKKwkJCW5leHQ7CisJCX0KKwkJaWYgKCRvcHQgZXEgJy1tJyB8fCAkb3B0IGVxICctLW1hc3RlcicpIHsKKwkJCWlmICgoQEFSR1YgPCAxKSB8fCBleGlzdHMgJG9wdHN7J21hc3Rlcid9KSB7CisJCQkJYWRkX3VzYWdlKCk7CisJCQl9CisJCQkkb3B0c3snbWFzdGVyJ30gPSAkQVJHVlsxXTsKKwkJCXNoaWZ0IEBBUkdWOworCQkJbmV4dDsKKwkJfQorCQlpZiAoJG9wdCBlcSAnLS1taXJyb3InKSB7CisJCQkkb3B0c3snbWlycm9yJ30gPSAxOworCQkJbmV4dDsKKwkJfQorCQlhZGRfdXNhZ2UoKTsKKwl9CisJaWYgKEBBUkdWICE9IDMpIHsKKwkJYWRkX3VzYWdlKCk7CisJfQorCWFkZF9yZW1vdGUoJEFSR1ZbMV0sICRBUkdWWzJdLCBcJW9wdHMpOworfQorZWxzaWYgKCRBUkdWWzBdIGVxICdybScpIHsKKwlpZiAoQEFSR1YgPD0gMSkgeworCQlwcmludCBTVERFUlIgIlVzYWdlOiBnaXQgcmVtb3RlIHJtIDxyZW1vdGU+XG4iOworCQlleGl0KDEpOworCX0KKwlleGl0KHJtX3JlbW90ZSgkQVJHVlsxXSkpOworfQorZWxzZSB7CisJcHJpbnQgU1RERVJSICJVc2FnZTogZ2l0IHJlbW90ZVxuIjsKKwlwcmludCBTVERFUlIgIiAgICAgICBnaXQgcmVtb3RlIGFkZCA8bmFtZT4gPHVybD5cbiI7CisJcHJpbnQgU1RERVJSICIgICAgICAgZ2l0IHJlbW90ZSBybSA8bmFtZT5cbiI7CisJcHJpbnQgU1RERVJSICIgICAgICAgZ2l0IHJlbW90ZSBzaG93IDxuYW1lPlxuIjsKKwlwcmludCBTVERFUlIgIiAgICAgICBnaXQgcmVtb3RlIHBydW5lIDxuYW1lPlxuIjsKKwlwcmludCBTVERFUlIgIiAgICAgICBnaXQgcmVtb3RlIHVwZGF0ZSBbZ3JvdXBdXG4iOworCWV4aXQoMSk7Cit9CmRpZmYgLS1naXQgYS9jb250cmliL2V4YW1wbGVzL2dpdC1yZXJlcmUucGVybCBiL2NvbnRyaWIvZXhhbXBsZXMvZ2l0LXJlcmVyZS5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmNjkyMDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2V4YW1wbGVzL2dpdC1yZXJlcmUucGVybApAQCAtMCwwICsxLDI4NCBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjIFJFdXNlIFJFY29yZGVkIFJFc29sdmUuICBUaGlzIHRvb2wgcmVjb3JkcyBhIGNvbmZsaWN0ZWQgYXV0b21lcmdlCisjIHJlc3VsdCBhbmQgaXRzIGhhbmQgcmVzb2x1dGlvbiwgYW5kIGhlbHBzIHRvIHJlc29sdmUgZnV0dXJlCisjIGF1dG9tZXJnZSB0aGF0IHJlc3VsdHMgaW4gdGhlIHNhbWUgY29uZmxpY3QuCisjCisjIFRvIGVuYWJsZSB0aGlzIGZlYXR1cmUsIGNyZWF0ZSBhIGRpcmVjdG9yeSAncnItY2FjaGUnIHVuZGVyIHlvdXIKKyMgLmdpdC8gZGlyZWN0b3J5LgorCit1c2UgRGlnZXN0OwordXNlIEZpbGU6OlBhdGg7Cit1c2UgRmlsZTo6Q29weTsKKworbXkgJGdpdF9kaXIgPSAkOjpFTlZ7R0lUX0RJUn0gfHwgIi5naXQiOworbXkgJHJyX2RpciA9ICIkZ2l0X2Rpci9yci1jYWNoZSI7CitteSAkbWVyZ2VfcnIgPSAiJGdpdF9kaXIvcnItY2FjaGUvTUVSR0VfUlIiOworCitteSAlbWVyZ2VfcnIgPSAoKTsKKworc3ViIHJlYWRfcnIgeworCWlmICghLWYgJG1lcmdlX3JyKSB7CisJCSVtZXJnZV9yciA9ICgpOworCQlyZXR1cm47CisJfQorCW15ICRpbjsKKwlsb2NhbCAkLyA9ICJcMCI7CisJb3BlbiAkaW4sICI8JG1lcmdlX3JyIiBvciBkaWUgIiQhOiAkbWVyZ2VfcnIiOworCXdoaWxlICg8JGluPikgeworCQljaG9tcDsKKwkJbXkgKCRuYW1lLCAkcGF0aCkgPSAvXihbMC05YS1mXXs0MH0pXHQoLiopJC9zOworCQkkbWVyZ2VfcnJ7JHBhdGh9ID0gJG5hbWU7CisJfQorCWNsb3NlICRpbjsKK30KKworc3ViIHdyaXRlX3JyIHsKKwlteSAkb3V0OworCW9wZW4gJG91dCwgIj4kbWVyZ2VfcnIiIG9yIGRpZSAiJCE6ICRtZXJnZV9yciI7CisJZm9yIG15ICRwYXRoIChzb3J0IGtleXMgJW1lcmdlX3JyKSB7CisJCW15ICRuYW1lID0gJG1lcmdlX3JyeyRwYXRofTsKKwkJcHJpbnQgJG91dCAiJG5hbWVcdCRwYXRoXDAiOworCX0KKwljbG9zZSAkb3V0OworfQorCitzdWIgY29tcHV0ZV9jb25mbGljdF9uYW1lIHsKKwlteSAoJHBhdGgpID0gQF87CisJbXkgQHNpZGUgPSAoKTsKKwlteSAkaW47CisJb3BlbiAkaW4sICI8JHBhdGgiICBvciBkaWUgIiQhOiAkcGF0aCI7CisKKwlteSAkc2hhMSA9IERpZ2VzdC0+bmV3KCJTSEEtMSIpOworCW15ICRodW5rID0gMDsKKwl3aGlsZSAoPCRpbj4pIHsKKwkJaWYgKC9ePDw8PDw8PCAuKi8pIHsKKwkJCSRodW5rKys7CisJCQlAc2lkZSA9IChbXSwgdW5kZWYpOworCQl9CisJCWVsc2lmICgvXj09PT09PT0kLykgeworCQkJJHNpZGVbMV0gPSBbXTsKKwkJfQorCQllbHNpZiAoL14+Pj4+Pj4+IC4qLykgeworCQkJbXkgKCRvbmUsICR0d28pOworCQkJJG9uZSA9IGpvaW4oJycsIEB7JHNpZGVbMF19KTsKKwkJCSR0d28gPSBqb2luKCcnLCBAeyRzaWRlWzFdfSk7CisJCQlpZiAoJHR3byBsZSAkb25lKSB7CisJCQkJKCRvbmUsICR0d28pID0gKCR0d28sICRvbmUpOworCQkJfQorCQkJJHNoYTEtPmFkZCgkb25lKTsKKwkJCSRzaGExLT5hZGQoIlwwIik7CisJCQkkc2hhMS0+YWRkKCR0d28pOworCQkJJHNoYTEtPmFkZCgiXDAiKTsKKwkJCUBzaWRlID0gKCk7CisJCX0KKwkJZWxzaWYgKEBzaWRlID09IDApIHsKKwkJCW5leHQ7CisJCX0KKwkJZWxzaWYgKGRlZmluZWQgJHNpZGVbMV0pIHsKKwkJCXB1c2ggQHskc2lkZVsxXX0sICRfOworCQl9CisJCWVsc2UgeworCQkJcHVzaCBAeyRzaWRlWzBdfSwgJF87CisJCX0KKwl9CisJY2xvc2UgJGluOworCXJldHVybiAoJHNoYTEtPmhleGRpZ2VzdCwgJGh1bmspOworfQorCitzdWIgcmVjb3JkX3ByZWltYWdlIHsKKwlteSAoJHBhdGgsICRuYW1lKSA9IEBfOworCW15IEBzaWRlID0gKCk7CisJbXkgKCRpbiwgJG91dCk7CisJb3BlbiAkaW4sICI8JHBhdGgiICBvciBkaWUgIiQhOiAkcGF0aCI7CisJb3BlbiAkb3V0LCAiPiRuYW1lIiBvciBkaWUgIiQhOiAkbmFtZSI7CisKKwl3aGlsZSAoPCRpbj4pIHsKKwkJaWYgKC9ePDw8PDw8PCAuKi8pIHsKKwkJCUBzaWRlID0gKFtdLCB1bmRlZik7CisJCX0KKwkJZWxzaWYgKC9ePT09PT09PSQvKSB7CisJCQkkc2lkZVsxXSA9IFtdOworCQl9CisJCWVsc2lmICgvXj4+Pj4+Pj4gLiovKSB7CisJCQlteSAoJG9uZSwgJHR3byk7CisJCQkkb25lID0gam9pbignJywgQHskc2lkZVswXX0pOworCQkJJHR3byA9IGpvaW4oJycsIEB7JHNpZGVbMV19KTsKKwkJCWlmICgkdHdvIGxlICRvbmUpIHsKKwkJCQkoJG9uZSwgJHR3bykgPSAoJHR3bywgJG9uZSk7CisJCQl9CisJCQlwcmludCAkb3V0ICI8PDw8PDw8XG4iOworCQkJcHJpbnQgJG91dCAkb25lOworCQkJcHJpbnQgJG91dCAiPT09PT09PVxuIjsKKwkJCXByaW50ICRvdXQgJHR3bzsKKwkJCXByaW50ICRvdXQgIj4+Pj4+Pj5cbiI7CisJCQlAc2lkZSA9ICgpOworCQl9CisJCWVsc2lmIChAc2lkZSA9PSAwKSB7CisJCQlwcmludCAkb3V0ICRfOworCQl9CisJCWVsc2lmIChkZWZpbmVkICRzaWRlWzFdKSB7CisJCQlwdXNoIEB7JHNpZGVbMV19LCAkXzsKKwkJfQorCQllbHNlIHsKKwkJCXB1c2ggQHskc2lkZVswXX0sICRfOworCQl9CisJfQorCWNsb3NlICRvdXQ7CisJY2xvc2UgJGluOworfQorCitzdWIgZmluZF9jb25mbGljdCB7CisJbXkgJGluOworCWxvY2FsICQvID0gIlwwIjsKKwlteSAkcGlkID0gb3BlbigkaW4sICctfCcpOworCWRpZSAiJCEiIHVubGVzcyBkZWZpbmVkICRwaWQ7CisJaWYgKCEkcGlkKSB7CisJCWV4ZWMocXcoZ2l0IGxzLWZpbGVzIC16IC11KSkgb3IgZGllICIkITogbHMtZmlsZXMiOworCX0KKwlteSAlcGF0aCA9ICgpOworCW15IEBwYXRoID0gKCk7CisJd2hpbGUgKDwkaW4+KSB7CisJCWNob21wOworCQlteSAoJG1vZGUsICRzaGExLCAkc3RhZ2UsICRwYXRoKSA9CisJCSAgICAvXihbMC03XSspIChbMC05YS1mXXs0MH0pIChbMTIzXSlcdCguKikkL3M7CisJCSRwYXRoeyRwYXRofSB8PSAoMSA8PCAkc3RhZ2UpOworCX0KKwljbG9zZSAkaW47CisJd2hpbGUgKG15ICgkcGF0aCwgJHN0YXR1cykgPSBlYWNoICVwYXRoKSB7CisJCWlmICgkc3RhdHVzID09IDE0KSB7IHB1c2ggQHBhdGgsICRwYXRoOyB9CisJfQorCXJldHVybiBAcGF0aDsKK30KKworc3ViIG1lcmdlIHsKKwlteSAoJG5hbWUsICRwYXRoKSA9IEBfOworCXJlY29yZF9wcmVpbWFnZSgkcGF0aCwgIiRycl9kaXIvJG5hbWUvdGhpc2ltYWdlIik7CisJdW5sZXNzIChzeXN0ZW0oJ2dpdCcsICdtZXJnZS1maWxlJywgbWFwIHsgIiRycl9kaXIvJG5hbWUvJHtffWltYWdlIiB9CisJCSAgICAgICBxdyh0aGlzIHByZSBwb3N0KSkpIHsKKwkJbXkgJGluOworCQlvcGVuICRpbiwgIjwkcnJfZGlyLyRuYW1lL3RoaXNpbWFnZSIgb3IKKwkJICAgIGRpZSAiJCE6ICRuYW1lL3RoaXNpbWFnZSI7CisJCW15ICRvdXQ7CisJCW9wZW4gJG91dCwgIj4kcGF0aCIgb3IgZGllICIkITogJHBhdGgiOworCQl3aGlsZSAoPCRpbj4pIHsgcHJpbnQgJG91dCAkXzsgfQorCQljbG9zZSAkaW47CisJCWNsb3NlICRvdXQ7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3ViIGdhcmJhZ2VfY29sbGVjdF9yZXJlcmUgeworCSMgV2Ugc2hvdWxkIGFsbG93IHNwZWNpZnlpbmcgdGhlc2UgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGFuZAorCSMgdGhhdCBpcyB3aHkgdGhlIGNhbGxlciBnaXZlcyBAQVJHViB0byB1cywgYnV0IEkgYW0gbGF6eS4KKworCW15ICRjdXRvZmZfbm9yZXNvbHZlID0gMTU7ICMgdHdvIHdlZWtzCisJbXkgJGN1dG9mZl9yZXNvbHZlID0gNjA7ICMgdHdvIG1vbnRocworCW15IEB0b19yZW1vdmU7CisJd2hpbGUgKDwkcnJfZGlyLyovcHJlaW1hZ2U+KSB7CisJCW15ICgkZGlyKSA9IC9eKC4qKVwvcHJlaW1hZ2UkLzsKKwkJbXkgJGN1dG9mZiA9ICgoLWYgIiRkaXIvcG9zdGltYWdlIikKKwkJCSAgICAgID8gJGN1dG9mZl9yZXNvbHZlCisJCQkgICAgICA6ICRjdXRvZmZfbm9yZXNvbHZlKTsKKwkJbXkgJGFnZSA9IC1NICIkXyI7CisJCWlmICgkY3V0b2ZmIDw9ICRhZ2UpIHsKKwkJCXB1c2ggQHRvX3JlbW92ZSwgJGRpcjsKKwkJfQorCX0KKwlpZiAoQHRvX3JlbW92ZSkgeworCQlybXRyZWUoXEB0b19yZW1vdmUpOworCX0KK30KKworLWQgIiRycl9kaXIiIHx8IGV4aXQoMCk7CisKK3JlYWRfcnIoKTsKKworaWYgKEBBUkdWKSB7CisJbXkgJGFyZyA9IHNoaWZ0IEBBUkdWOworCWlmICgkYXJnIGVxICdjbGVhcicpIHsKKwkJZm9yIG15ICRwYXRoIChrZXlzICVtZXJnZV9ycikgeworCQkJbXkgJG5hbWUgPSAkbWVyZ2VfcnJ7JHBhdGh9OworCQkJaWYgKC1kICIkcnJfZGlyLyRuYW1lIiAmJgorCQkJICAgICEgLWYgIiRycl9kaXIvJG5hbWUvcG9zdGltYWdlIikgeworCQkJCXJtdHJlZShbIiRycl9kaXIvJG5hbWUiXSk7CisJCQl9CisJCX0KKwkJdW5saW5rICRtZXJnZV9ycjsKKwl9CisJZWxzaWYgKCRhcmcgZXEgJ3N0YXR1cycpIHsKKwkJZm9yIG15ICRwYXRoIChrZXlzICVtZXJnZV9ycikgeworCQkJcHJpbnQgJHBhdGgsICJcbiI7CisJCX0KKwl9CisJZWxzaWYgKCRhcmcgZXEgJ2RpZmYnKSB7CisJCWZvciBteSAkcGF0aCAoa2V5cyAlbWVyZ2VfcnIpIHsKKwkJCW15ICRuYW1lID0gJG1lcmdlX3JyeyRwYXRofTsKKwkJCXN5c3RlbSgnZGlmZicsICgoQEFSR1YgPT0gMCkgPyAoJy11JykgOiBAQVJHViksCisJCQkJJy1MJywgImEvJHBhdGgiLCAnLUwnLCAiYi8kcGF0aCIsCisJCQkJIiRycl9kaXIvJG5hbWUvcHJlaW1hZ2UiLCAkcGF0aCk7CisJCX0KKwl9CisJZWxzaWYgKCRhcmcgZXEgJ2djJykgeworCQlnYXJiYWdlX2NvbGxlY3RfcmVyZXJlKEBBUkdWKTsKKwl9CisJZWxzZSB7CisJCWRpZSAiJDAgdW5rbm93biBjb21tYW5kOiAkYXJnXG4iOworCX0KKwlleGl0IDA7Cit9CisKK215ICVjb25mbGljdCA9IG1hcCB7ICRfID0+IDEgfSBmaW5kX2NvbmZsaWN0KCk7CisKKyMgTUVSR0VfUlIgcmVjb3JkcyBwYXRocyB3aXRoIGNvbmZsaWN0cyBpbW1lZGlhdGVseSBhZnRlciBtZXJnZQorIyBmYWlsZWQuICBTb21lIG9mIHRoZSBjb25mbGljdGVkIHBhdGhzIG1pZ2h0IGhhdmUgYmVlbiBoYW5kIHJlc29sdmVkCisjIGluIHRoZSB3b3JraW5nIHRyZWUgc2luY2UgdGhlbiwgYnV0IHRoZSBpbml0aWFsIHJ1biB3b3VsZCBjYXRjaCBhbGwKKyMgYW5kIHJlZ2lzdGVyIHRoZWlyIHByZWltYWdlcy4KKworZm9yIG15ICRwYXRoIChrZXlzICVjb25mbGljdCkgeworCSMgVGhpcyBwYXRoIGhhcyBjb25mbGljdC4gIElmIGl0IGlzIG5vdCByZWNvcmRlZCB5ZXQsCisJIyByZWNvcmQgdGhlIHByZS1pbWFnZS4KKwlpZiAoIWV4aXN0cyAkbWVyZ2VfcnJ7JHBhdGh9KSB7CisJCW15ICgkbmFtZSwgJGh1bmspID0gY29tcHV0ZV9jb25mbGljdF9uYW1lKCRwYXRoKTsKKwkJbmV4dCB1bmxlc3MgKCRodW5rKTsKKwkJJG1lcmdlX3JyeyRwYXRofSA9ICRuYW1lOworCQlpZiAoISAtZCAiJHJyX2Rpci8kbmFtZSIpIHsKKwkJCW1rcGF0aCgiJHJyX2Rpci8kbmFtZSIsIDAsIDA3NzcpOworCQkJcHJpbnQgU1RERVJSICJSZWNvcmRlZCBwcmVpbWFnZSBmb3IgJyRwYXRoJ1xuIjsKKwkJCXJlY29yZF9wcmVpbWFnZSgkcGF0aCwgIiRycl9kaXIvJG5hbWUvcHJlaW1hZ2UiKTsKKwkJfQorCX0KK30KKworIyBOb3cgc29tZSBvZiB0aGUgcGF0aHMgdGhhdCBoYWQgY29uZmxpY3RzIGVhcmxpZXIgbWlnaHQgaGF2ZSBiZWVuCisjIGhhbmQgcmVzb2x2ZWQuICBPdGhlcnMgbWF5IGJlIHNpbWlsYXIgdG8gYSBjb25mbGljdCBhbHJlYWR5IHRoYXQKKyMgd2FzIHJlc29sdmVkIGJlZm9yZS4KKworZm9yIG15ICRwYXRoIChrZXlzICVtZXJnZV9ycikgeworCW15ICRuYW1lID0gJG1lcmdlX3JyeyRwYXRofTsKKworCSMgV2UgY291bGQgcmVzb2x2ZSB0aGlzIGF1dG9tYXRpY2FsbHkgaWYgd2UgaGF2ZSBpbWFnZXMuCisJaWYgKC1mICIkcnJfZGlyLyRuYW1lL3ByZWltYWdlIiAmJgorCSAgICAtZiAiJHJyX2Rpci8kbmFtZS9wb3N0aW1hZ2UiKSB7CisJCWlmIChtZXJnZSgkbmFtZSwgJHBhdGgpKSB7CisJCQlwcmludCBTVERFUlIgIlJlc29sdmVkICckcGF0aCcgdXNpbmcgcHJldmlvdXMgcmVzb2x1dGlvbi5cbiI7CisJCQkjIFRoZW4gd2UgZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhpcyBwYXRoCisJCQkjIGFueW1vcmUuCisJCQlkZWxldGUgJG1lcmdlX3JyeyRwYXRofTsKKwkJCW5leHQ7CisJCX0KKwl9CisKKwkjIExldCdzIHNlZSBpZiB3ZSBoYXZlIHJlc29sdmVkIGl0LgorCSh1bmRlZiwgbXkgJGh1bmspID0gY29tcHV0ZV9jb25mbGljdF9uYW1lKCRwYXRoKTsKKwluZXh0IGlmICgkaHVuayk7CisKKwlwcmludCBTVERFUlIgIlJlY29yZGVkIHJlc29sdXRpb24gZm9yICckcGF0aCcuXG4iOworCWNvcHkoJHBhdGgsICIkcnJfZGlyLyRuYW1lL3Bvc3RpbWFnZSIpOworCSMgQW5kIHdlIGRvIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoaXMgcGF0aCBhbnltb3JlLgorCWRlbGV0ZSAkbWVyZ2VfcnJ7JHBhdGh9OworfQorCisjIFdyaXRlIG91dCB0aGUgcmVzdC4KK3dyaXRlX3JyKCk7CmRpZmYgLS1naXQgYS9jb250cmliL2V4YW1wbGVzL2dpdC1yZXNldC5zaCBiL2NvbnRyaWIvZXhhbXBsZXMvZ2l0LXJlc2V0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJhZmViNTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2V4YW1wbGVzL2dpdC1yZXNldC5zaApAQCAtMCwwICsxLDEwNiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBMaW51cyBUb3J2YWxkcyBhbmQgSnVuaW8gQyBIYW1hbm8KKyMKK1VTQUdFPSdbLS1taXhlZCB8IC0tc29mdCB8IC0taGFyZF0gIFs8Y29tbWl0LWlzaD5dIFsgWy0tXSA8cGF0aHM+Li4uXScKK1NVQkRJUkVDVE9SWV9PSz1ZZXMKKy4gZ2l0LXNoLXNldHVwCitzZXRfcmVmbG9nX2FjdGlvbiAicmVzZXQgJCoiCityZXF1aXJlX3dvcmtfdHJlZQorCit1cGRhdGU9IHJlc2V0X3R5cGU9LS1taXhlZAordW5zZXQgcmV2CisKK3doaWxlIHRlc3QgJCMgIT0gMAorZG8KKwljYXNlICIkMSIgaW4KKwktLW1peGVkIHwgLS1zb2Z0IHwgLS1oYXJkKQorCQlyZXNldF90eXBlPSIkMSIKKwkJOzsKKwktLSkKKwkJYnJlYWsKKwkJOzsKKwktKikKKwkJdXNhZ2UKKwkJOzsKKwkqKQorCQlyZXY9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5ICIkMSIpIHx8IGV4aXQKKwkJc2hpZnQKKwkJYnJlYWsKKwkJOzsKKwllc2FjCisJc2hpZnQKK2RvbmUKKworOiAke3Jldj1IRUFEfQorcmV2PSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAkcmV2XjApIHx8IGV4aXQKKworIyBTa2lwIC0tIGluICJnaXQgcmVzZXQgSEVBRCAtLSBmb28iIGFuZCAiZ2l0IHJlc2V0IC0tIGZvbyIuCitjYXNlICIkMSIgaW4gLS0pIHNoaWZ0IDs7IGVzYWMKKworIyBnaXQgcmVzZXQgLS1taXhlZCB0cmVlIFstLV0gcGF0aHMuLi4gY2FuIGJlIHVzZWQgdG8KKyMgbG9hZCBjaG9zZW4gcGF0aHMgZnJvbSB0aGUgdHJlZSBpbnRvIHRoZSBpbmRleCB3aXRob3V0CisjIGFmZmVjdGluZyB0aGUgd29ya2luZyB0cmVlIG5vciBIRUFELgoraWYgdGVzdCAkIyAhPSAwCit0aGVuCisJdGVzdCAiJHJlc2V0X3R5cGUiID0gIi0tbWl4ZWQiIHx8CisJCWRpZSAiQ2Fubm90IGRvIHBhcnRpYWwgJHJlc2V0X3R5cGUgcmVzZXQuIgorCisJZ2l0IGRpZmYtaW5kZXggLS1jYWNoZWQgJHJldiAtLSAiJEAiIHwKKwlzZWQgLWUgJ3MvXjpcKFswLTddWzAtN10qXCkgWzAtN11bMC03XSogXChbMC05YS1mXVswLTlhLWZdKlwpIFswLTlhLWZdWzAtOWEtZl0qIFtBLVpdCVwoLipcKSQvXDEgXDIJXDMvJyB8CisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSAtLWluZGV4LWluZm8gfHwgZXhpdAorCWdpdCB1cGRhdGUtaW5kZXggLS1yZWZyZXNoCisJZXhpdAorZmkKKworY2RfdG9fdG9wbGV2ZWwKKworaWYgdGVzdCAiJHJlc2V0X3R5cGUiID0gIi0taGFyZCIKK3RoZW4KKwl1cGRhdGU9LXUKK2ZpCisKKyMgU29mdCByZXNldCBkb2VzIG5vdCB0b3VjaCB0aGUgaW5kZXggZmlsZSBub3IgdGhlIHdvcmtpbmcgdHJlZQorIyBhdCBhbGwsIGJ1dCByZXF1aXJlcyB0aGVtIGluIGEgZ29vZCBvcmRlci4gIE90aGVyIHJlc2V0cyByZXNldAorIyB0aGUgaW5kZXggZmlsZSB0byB0aGUgdHJlZSBvYmplY3Qgd2UgYXJlIHN3aXRjaGluZyB0by4KK2lmIHRlc3QgIiRyZXNldF90eXBlIiA9ICItLXNvZnQiCit0aGVuCisJaWYgdGVzdCAtZiAiJEdJVF9ESVIvTUVSR0VfSEVBRCIgfHwKKwkgICB0ZXN0ICIiICE9ICIkKGdpdCBscy1maWxlcyAtLXVubWVyZ2VkKSIKKwl0aGVuCisJCWRpZSAiQ2Fubm90IGRvIGEgc29mdCByZXNldCBpbiB0aGUgbWlkZGxlIG9mIGEgbWVyZ2UuIgorCWZpCitlbHNlCisJZ2l0IHJlYWQtdHJlZSAtdiAtLXJlc2V0ICR1cGRhdGUgIiRyZXYiIHx8IGV4aXQKK2ZpCisKKyMgQW55IHJlc2V0cyB1cGRhdGUgSEVBRCB0byB0aGUgaGVhZCBiZWluZyBzd2l0Y2hlZCB0by4KK2lmIG9yaWc9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQgMj4vZGV2L251bGwpCit0aGVuCisJZWNobyAiJG9yaWciID4iJEdJVF9ESVIvT1JJR19IRUFEIgorZWxzZQorCXJtIC1mICIkR0lUX0RJUi9PUklHX0hFQUQiCitmaQorZ2l0IHVwZGF0ZS1yZWYgLW0gIiRHSVRfUkVGTE9HX0FDVElPTiIgSEVBRCAiJHJldiIKK3VwZGF0ZV9yZWZfc3RhdHVzPSQ/CisKK2Nhc2UgIiRyZXNldF90eXBlIiBpbgorLS1oYXJkICkKKwl0ZXN0ICR1cGRhdGVfcmVmX3N0YXR1cyA9IDAgJiYgeworCQlwcmludGYgIkhFQUQgaXMgbm93IGF0ICIKKwkJR0lUX1BBR0VSPSBnaXQgbG9nIC0tbWF4LWNvdW50PTEgLS1wcmV0dHk9b25lbGluZSBcCisJCQktLWFiYnJldi1jb21taXQgSEVBRAorCX0KKwk7OworLS1zb2Z0ICkKKwk7OyAjIE5vdGhpbmcgZWxzZSB0byBkbworLS1taXhlZCApCisJIyBSZXBvcnQgd2hhdCBoYXMgbm90IGJlZW4gdXBkYXRlZC4KKwlnaXQgdXBkYXRlLWluZGV4IC0tcmVmcmVzaAorCTs7Citlc2FjCisKK3JtIC1mICIkR0lUX0RJUi9NRVJHRV9IRUFEIiAiJEdJVF9ESVIvcnItY2FjaGUvTUVSR0VfUlIiIFwKKwkiJEdJVF9ESVIvU1FVQVNIX01TRyIgIiRHSVRfRElSL01FUkdFX01TRyIKKworZXhpdCAkdXBkYXRlX3JlZl9zdGF0dXMKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZXhhbXBsZXMvZ2l0LXJlc29sdmUuc2ggYi9jb250cmliL2V4YW1wbGVzL2dpdC1yZXNvbHZlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBlZTFiZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2V4YW1wbGVzL2dpdC1yZXNvbHZlLnNoCkBAIC0wLDAgKzEsMTEyIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IExpbnVzIFRvcnZhbGRzCisjCisjIFJlc29sdmUgdHdvIHRyZWVzLgorIworCitlY2hvICdXQVJOSU5HOiBUaGlzIGNvbW1hbmQgaXMgREVQUkVDQVRFRCBhbmQgd2lsbCBiZSByZW1vdmVkIHZlcnkgc29vbi4nID4mMgorZWNobyAnV0FSTklORzogUGxlYXNlIHVzZSBnaXQtbWVyZ2Ugb3IgZ2l0LXB1bGwgaW5zdGVhZC4nID4mMgorc2xlZXAgMgorCitVU0FHRT0nPGhlYWQ+IDxyZW1vdGU+IDxtZXJnZS1tZXNzYWdlPicKKy4gZ2l0LXNoLXNldHVwCisKK2Ryb3BoZWFkcygpIHsKKwlybSAtZiAtLSAiJEdJVF9ESVIvTUVSR0VfSEVBRCIgXAorCQkiJEdJVF9ESVIvTEFTVF9NRVJHRSIgfHwgZXhpdCAxCit9CisKK2hlYWQ9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5ICIkMSJeMCkgJiYKK21lcmdlPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAiJDIiXjApICYmCittZXJnZV9uYW1lPSIkMiIgJiYKK21lcmdlX21zZz0iJDMiIHx8IHVzYWdlCisKKyMKKyMgVGhlIHJlbW90ZSBuYW1lIGlzIGp1c3QgdXNlZCBmb3IgdGhlIG1lc3NhZ2UsCisjIGJ1dCB3ZSBkbyB3YW50IGl0LgorIworaWYgWyAteiAiJGhlYWQiIC1vIC16ICIkbWVyZ2UiIC1vIC16ICIkbWVyZ2VfbXNnIiBdOyB0aGVuCisJdXNhZ2UKK2ZpCisKK2Ryb3BoZWFkcworZWNobyAkaGVhZCA+ICIkR0lUX0RJUiIvT1JJR19IRUFECitlY2hvICRtZXJnZSA+ICIkR0lUX0RJUiIvTEFTVF9NRVJHRQorCitjb21tb249JChnaXQgbWVyZ2UtYmFzZSAkaGVhZCAkbWVyZ2UpCitpZiBbIC16ICIkY29tbW9uIiBdOyB0aGVuCisJZGllICJVbmFibGUgdG8gZmluZCBjb21tb24gY29tbWl0IGJldHdlZW4iICRtZXJnZSAkaGVhZAorZmkKKworY2FzZSAiJGNvbW1vbiIgaW4KKyIkbWVyZ2UiKQorCWVjaG8gIkFscmVhZHkgdXAtdG8tZGF0ZS4gWWVlYWghIgorCWRyb3BoZWFkcworCWV4aXQgMAorCTs7CisiJGhlYWQiKQorCWVjaG8gIlVwZGF0aW5nICQoZ2l0IHJldi1wYXJzZSAtLXNob3J0ICRoZWFkKS4uJChnaXQgcmV2LXBhcnNlIC0tc2hvcnQgJG1lcmdlKSIKKwlnaXQgcmVhZC10cmVlIC11IC1tICRoZWFkICRtZXJnZSB8fCBleGl0IDEKKwlnaXQgdXBkYXRlLXJlZiAtbSAicmVzb2x2ZSAkbWVyZ2VfbmFtZTogRmFzdCBmb3J3YXJkIiBcCisJCUhFQUQgIiRtZXJnZSIgIiRoZWFkIgorCWdpdCBkaWZmLXRyZWUgLXAgJGhlYWQgJG1lcmdlIHwgZ2l0IGFwcGx5IC0tc3RhdAorCWRyb3BoZWFkcworCWV4aXQgMAorCTs7Citlc2FjCisKKyMgV2UgYXJlIGdvaW5nIHRvIG1ha2UgYSBuZXcgY29tbWl0LgorZ2l0IHZhciBHSVRfQ09NTUlUVEVSX0lERU5UID4vZGV2L251bGwgfHwgZXhpdAorCisjIEZpbmQgYW4gb3B0aW11bSBtZXJnZSBiYXNlIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIGNhbmRpZGF0ZXMuCitMRj0nCisnCitjb21tb249JChnaXQgbWVyZ2UtYmFzZSAtYSAkaGVhZCAkbWVyZ2UpCitjYXNlICIkY29tbW9uIiBpbgorPyoiJExGIj8qKQorCWVjaG8gIlRyeWluZyB0byBmaW5kIHRoZSBvcHRpbXVtIG1lcmdlIGJhc2UuIgorCUc9LnRtcC1pbmRleCQkCisJYmVzdD0KKwliZXN0X2NudD0tMQorCWZvciBjIGluICRjb21tb24KKwlkbworCQlybSAtZiAkRworCQlHSVRfSU5ERVhfRklMRT0kRyBnaXQgcmVhZC10cmVlIC1tICRjICRoZWFkICRtZXJnZSBcCisJCQkyPi9kZXYvbnVsbCB8fCBjb250aW51ZQorCQkjIENvdW50IHRoZSBwYXRocyB0aGF0IGFyZSB1bm1lcmdlZC4KKwkJY250PWBHSVRfSU5ERVhfRklMRT0kRyBnaXQgbHMtZmlsZXMgLS11bm1lcmdlZCB8IHdjIC1sYAorCQlpZiB0ZXN0ICRiZXN0X2NudCAtbGUgMCAtbyAkY250IC1sZSAkYmVzdF9jbnQKKwkJdGhlbgorCQkJYmVzdD0kYworCQkJYmVzdF9jbnQ9JGNudAorCQkJaWYgdGVzdCAiJGJlc3RfY250IiAtZXEgMAorCQkJdGhlbgorCQkJCSMgQ2Fubm90IGRvIGFueSBiZXR0ZXIgdGhhbiBhbGwgdHJpdmlhbCBtZXJnZS4KKwkJCQlicmVhaworCQkJZmkKKwkJZmkKKwlkb25lCisJcm0gLWYgJEcKKwljb21tb249IiRiZXN0IgorZXNhYworCitlY2hvICJUcnlpbmcgdG8gbWVyZ2UgJG1lcmdlIGludG8gJGhlYWQgdXNpbmcgJGNvbW1vbi4iCitnaXQgdXBkYXRlLWluZGV4IC0tcmVmcmVzaCAyPi9kZXYvbnVsbAorZ2l0IHJlYWQtdHJlZSAtdSAtbSAkY29tbW9uICRoZWFkICRtZXJnZSB8fCBleGl0IDEKK3Jlc3VsdF90cmVlPSQoZ2l0IHdyaXRlLXRyZWUgIDI+IC9kZXYvbnVsbCkKK2lmIFsgJD8gLW5lIDAgXTsgdGhlbgorCWVjaG8gIlNpbXBsZSBtZXJnZSBmYWlsZWQsIHRyeWluZyBBdXRvbWF0aWMgbWVyZ2UiCisJZ2l0LW1lcmdlLWluZGV4IC1vIGdpdC1tZXJnZS1vbmUtZmlsZSAtYQorCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCQllY2hvICRtZXJnZSA+ICIkR0lUX0RJUiIvTUVSR0VfSEVBRAorCQlkaWUgIkF1dG9tYXRpYyBtZXJnZSBmYWlsZWQsIGZpeCB1cCBieSBoYW5kIgorCWZpCisJcmVzdWx0X3RyZWU9JChnaXQgd3JpdGUtdHJlZSkgfHwgZXhpdCAxCitmaQorcmVzdWx0X2NvbW1pdD0kKGVjaG8gIiRtZXJnZV9tc2ciIHwgZ2l0IGNvbW1pdC10cmVlICRyZXN1bHRfdHJlZSAtcCAkaGVhZCAtcCAkbWVyZ2UpCitlY2hvICJDb21taXR0ZWQgbWVyZ2UgJHJlc3VsdF9jb21taXQiCitnaXQgdXBkYXRlLXJlZiAtbSAicmVzb2x2ZSAkbWVyZ2VfbmFtZTogSW4taW5kZXggbWVyZ2UiIFwKKwlIRUFEICIkcmVzdWx0X2NvbW1pdCIgIiRoZWFkIgorZ2l0IGRpZmYtdHJlZSAtcCAkaGVhZCAkcmVzdWx0X2NvbW1pdCB8IGdpdCBhcHBseSAtLXN0YXQKK2Ryb3BoZWFkcwpkaWZmIC0tZ2l0IGEvY29udHJpYi9leGFtcGxlcy9naXQtcmV2ZXJ0LnNoIGIvY29udHJpYi9leGFtcGxlcy9naXQtcmV2ZXJ0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ5ZjAwMzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2V4YW1wbGVzL2dpdC1yZXZlcnQuc2gKQEAgLTAsMCArMSwxOTcgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgTGludXMgVG9ydmFsZHMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK2Nhc2UgIiQwIiBpbgorKi1yZXZlcnQqICkKKwl0ZXN0IC10IDAgJiYgZWRpdD0tZQorCXJlcGxheT0KKwltZT1yZXZlcnQKKwlVU0FHRT0nWy0tZWRpdCB8IC0tbm8tZWRpdF0gWy1uXSA8Y29tbWl0LWlzaD4nIDs7CisqLWNoZXJyeS1waWNrKiApCisJcmVwbGF5PXQKKwllZGl0PQorCW1lPWNoZXJyeS1waWNrCisJVVNBR0U9J1stLWVkaXRdIFstbl0gWy1yXSBbLXhdIDxjb21taXQtaXNoPicgIDs7CisqICkKKwllY2hvID4mMiAiV2hhdCBhcmUgeW91IHRhbGtpbmcgYWJvdXQ/IgorCWV4aXQgMSA7OworZXNhYworCitTVUJESVJFQ1RPUllfT0s9WWVzIDsjIHdlIHdpbGwgY2QgdXAKKy4gZ2l0LXNoLXNldHVwCityZXF1aXJlX3dvcmtfdHJlZQorY2RfdG9fdG9wbGV2ZWwKKworbm9fY29tbWl0PQord2hpbGUgY2FzZSAiJCMiIGluIDApIGJyZWFrIDs7IGVzYWMKK2RvCisJY2FzZSAiJDEiIGluCisJLW58LS1ufC0tbm98LS1uby18LS1uby1jfC0tbm8tY298LS1uby1jb218LS1uby1jb21tfFwKKwkgICAgLS1uby1jb21taXwtLW5vLWNvbW1pdCkKKwkJbm9fY29tbWl0PXQKKwkJOzsKKwktZXwtLWV8LS1lZHwtLWVkaXwtLWVkaXQpCisJCWVkaXQ9LWUKKwkJOzsKKwktLW58LS1ub3wtLW5vLXwtLW5vLWV8LS1uby1lZHwtLW5vLWVkaXwtLW5vLWVkaXQpCisJCWVkaXQ9CisJCTs7CisJLXIpCisJCTogbm8tb3AgOzsKKwkteHwtLWktcmVhbGx5LXdhbnQtdG8tZXhwb3NlLW15LXByaXZhdGUtY29tbWl0LW9iamVjdC1uYW1lKQorCQlyZXBsYXk9CisJCTs7CisJLSopCisJCXVzYWdlCisJCTs7CisJKikKKwkJYnJlYWsKKwkJOzsKKwllc2FjCisJc2hpZnQKK2RvbmUKKworc2V0X3JlZmxvZ19hY3Rpb24gIiRtZSIKKwordGVzdCAiJG1lLCRyZXBsYXkiID0gInJldmVydCx0IiAmJiB1c2FnZQorCitjYXNlICIkbm9fY29tbWl0IiBpbgordCkKKwkjIFdlIGRvIG5vdCBpbnRlbmQgdG8gY29tbWl0IGltbWVkaWF0ZWx5LiAgV2UganVzdCB3YW50IHRvCisJIyBtZXJnZSB0aGUgZGlmZmVyZW5jZXMgaW4uCisJaGVhZD0kKGdpdC13cml0ZS10cmVlKSB8fAorCQlkaWUgIllvdXIgaW5kZXggZmlsZSBpcyB1bm1lcmdlZC4iCisJOzsKKyopCisJaGVhZD0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkgfHwKKwkJZGllICJZb3UgZG8gbm90IGhhdmUgYSB2YWxpZCBIRUFEIgorCWZpbGVzPSQoZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgLS1uYW1lLW9ubHkgJGhlYWQpIHx8IGV4aXQKKwlpZiBbICIkZmlsZXMiIF07IHRoZW4KKwkJZGllICJEaXJ0eSBpbmRleDogY2Fubm90ICRtZSAoZGlydHk6ICRmaWxlcykiCisJZmkKKwk7OworZXNhYworCityZXY9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkQCIpICYmCitjb21taXQ9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkcmV2XjAiKSB8fAorCWRpZSAiTm90IGEgc2luZ2xlIGNvbW1pdCAkQCIKK3ByZXY9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkY29tbWl0XjEiIDI+L2Rldi9udWxsKSB8fAorCWRpZSAiQ2Fubm90IHJ1biAkbWUgYSByb290IGNvbW1pdCIKK2dpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiRjb21taXReMiIgPi9kZXYvbnVsbCAyPiYxICYmCisJZGllICJDYW5ub3QgcnVuICRtZSBhIG11bHRpLXBhcmVudCBjb21taXQuIgorCitlbmNvZGluZz0kKGdpdCBjb25maWcgaTE4bi5jb21taXRlbmNvZGluZyB8fCBlY2hvIFVURi04KQorCisjICJjb21taXQiIGlzIGFuIGV4aXN0aW5nIGNvbW1pdC4gIFdlIHdvdWxkIHdhbnQgdG8gYXBwbHkKKyMgdGhlIGRpZmZlcmVuY2UgaXQgaW50cm9kdWNlcyBzaW5jZSBpdHMgZmlyc3QgcGFyZW50ICJwcmV2IgorIyBvbiB0b3Agb2YgdGhlIGN1cnJlbnQgSEVBRCBpZiB3ZSBhcmUgY2hlcnJ5LXBpY2suICBPciB0aGUKKyMgcmV2ZXJzZSBvZiBpdCBpZiB3ZSBhcmUgcmV2ZXJ0LgorCitjYXNlICIkbWUiIGluCityZXZlcnQpCisJZ2l0IHNob3cgLXMgLS1wcmV0dHk9b25lbGluZSAtLWVuY29kaW5nPSIkZW5jb2RpbmciICRjb21taXQgfAorCXNlZCAtZSAnCisJCXMvXlteIF0qIC9SZXZlcnQgIi8KKwkJcy8kLyIvCisJJworCWVjaG8KKwllY2hvICJUaGlzIHJldmVydHMgY29tbWl0ICRjb21taXQuIgorCXRlc3QgIiRyZXYiID0gIiRjb21taXQiIHx8CisJZWNobyAiKG9yaWdpbmFsICdnaXQgcmV2ZXJ0JyBhcmd1bWVudHM6ICRAKSIKKwliYXNlPSRjb21taXQgbmV4dD0kcHJldgorCTs7CisKK2NoZXJyeS1waWNrKQorCXBpY2tfYXV0aG9yX3NjcmlwdD0nCisJL15hdXRob3IgL3sKKwkJcy8nXCcnLydcJydcXCdcJ1wnJy9nCisJCWgKKwkJcy9eYXV0aG9yIFwoW148XSpcKSA8W14+XSo+IC4qJC9cMS8KKwkJcy8nXCcnLydcJydcJ1wnXCcnL2cKKwkJcy8uKi9HSVRfQVVUSE9SX05BTUU9J1wnJyYnXCcnL3AKKworCQlnCisJCXMvXmF1dGhvciBbXjxdKiA8XChbXj5dKlwpPiAuKiQvXDEvCisJCXMvJ1wnJy8nXCcnXCdcJ1wnJy9nCisJCXMvLiovR0lUX0FVVEhPUl9FTUFJTD0nXCcnJidcJycvcAorCisJCWcKKwkJcy9eYXV0aG9yIFtePF0qIDxbXj5dKj4gXCguKlwpJC9cMS8KKwkJcy8nXCcnLydcJydcJ1wnXCcnL2cKKwkJcy8uKi9HSVRfQVVUSE9SX0RBVEU9J1wnJyYnXCcnL3AKKworCQlxCisJfScKKworCWxvZ21zZz1gZ2l0IHNob3cgLXMgLS1wcmV0dHk9cmF3IC0tZW5jb2Rpbmc9IiRlbmNvZGluZyIgIiRjb21taXQiYAorCXNldF9hdXRob3JfZW52PWBlY2hvICIkbG9nbXNnIiB8CisJTEFORz1DIExDX0FMTD1DIHNlZCAtbmUgIiRwaWNrX2F1dGhvcl9zY3JpcHQiYAorCWV2YWwgIiRzZXRfYXV0aG9yX2VudiIKKwlleHBvcnQgR0lUX0FVVEhPUl9OQU1FCisJZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUwKKwlleHBvcnQgR0lUX0FVVEhPUl9EQVRFCisKKwllY2hvICIkbG9nbXNnIiB8CisJc2VkIC1lICcxLC9eJC9kJyAtZSAncy9eICAgIC8vJworCWNhc2UgIiRyZXBsYXkiIGluCisJJycpCisJCWVjaG8gIihjaGVycnkgcGlja2VkIGZyb20gY29tbWl0ICRjb21taXQpIgorCQl0ZXN0ICIkcmV2IiA9ICIkY29tbWl0IiB8fAorCQllY2hvICIob3JpZ2luYWwgJ2dpdCBjaGVycnktcGljaycgYXJndW1lbnRzOiAkQCkiCisJCTs7CisJZXNhYworCWJhc2U9JHByZXYgbmV4dD0kY29tbWl0CisJOzsKKworZXNhYyA+Lm1zZworCitldmFsIEdJVEhFQURfJGhlYWQ9SEVBRAorZXZhbCBHSVRIRUFEXyRuZXh0PSdgZ2l0IHNob3cgLXMgXAorCS0tcHJldHR5PW9uZWxpbmUgLS1lbmNvZGluZz0iJGVuY29kaW5nIiAiJGNvbW1pdCIgfAorCXNlZCAtZSAicy9eW14gXSogLy8iYCcKK2V4cG9ydCBHSVRIRUFEXyRoZWFkIEdJVEhFQURfJG5leHQKKworIyBUaGlzIHRocmVlIHdheSBtZXJnZSBpcyBhbiBpbnRlcmVzdGluZyBvbmUuICBXZSBhcmUgYXQKKyMgJGhlYWQsIGFuZCB3b3VsZCB3YW50IHRvIGFwcGx5IHRoZSBjaGFuZ2UgYmV0d2VlbiAkY29tbWl0CisjIGFuZCAkcHJldiBvbiB0b3Agb2YgdXMgKHdoZW4gcmV2ZXJ0aW5nKSwgb3IgdGhlIGNoYW5nZSBiZXR3ZWVuCisjICRwcmV2IGFuZCAkY29tbWl0IG9uIHRvcCBvZiB1cyAod2hlbiBjaGVycnktcGlja2luZyBvciByZXBsYXlpbmcpLgorCitnaXQtbWVyZ2UtcmVjdXJzaXZlICRiYXNlIC0tICRoZWFkICRuZXh0ICYmCityZXN1bHQ9JChnaXQtd3JpdGUtdHJlZSAyPi9kZXYvbnVsbCkgfHwgeworCW12IC1mIC5tc2cgIiRHSVRfRElSL01FUkdFX01TRyIKKwl7CisJICAgIGVjaG8gJworQ29uZmxpY3RzOgorJworCQlnaXQgbHMtZmlsZXMgLS11bm1lcmdlZCB8CisJCXNlZCAtZSAncy9eW14JXSoJLwkvJyB8CisJCXVuaXEKKwl9ID4+IiRHSVRfRElSL01FUkdFX01TRyIKKwllY2hvID4mMiAiQXV0b21hdGljICRtZSBmYWlsZWQuICBBZnRlciByZXNvbHZpbmcgdGhlIGNvbmZsaWN0cywiCisJZWNobyA+JjIgIm1hcmsgdGhlIGNvcnJlY3RlZCBwYXRocyB3aXRoICdnaXQtYWRkIDxwYXRocz4nIgorCWVjaG8gPiYyICJhbmQgY29tbWl0IHRoZSByZXN1bHQuIgorCWNhc2UgIiRtZSIgaW4KKwljaGVycnktcGljaykKKwkJZWNobyA+JjIgIllvdSBtYXkgY2hvb3NlIHRvIHVzZSB0aGUgZm9sbG93aW5nIHdoZW4gbWFraW5nIgorCQllY2hvID4mMiAidGhlIGNvbW1pdDoiCisJCWVjaG8gPiYyICIkc2V0X2F1dGhvcl9lbnYiCisJZXNhYworCWV4aXQgMQorfQorZWNobyA+JjIgIkZpbmlzaGVkIG9uZSAkbWUuIgorCisjIElmIHdlIGFyZSBjaGVycnktcGljaywgYW5kIGlmIHRoZSBtZXJnZSBkaWQgbm90IHJlc3VsdCBpbgorIyBoYW5kLWVkaXRpbmcsIHdlIHdpbGwgaGl0IHRoaXMgY29tbWl0IGFuZCBpbmhlcml0IHRoZSBvcmlnaW5hbAorIyBhdXRob3IgZGF0ZSBhbmQgbmFtZS4KKyMgSWYgd2UgYXJlIHJldmVydCwgb3IgaWYgb3VyIGNoZXJyeS1waWNrIHJlc3VsdHMgaW4gYSBoYW5kIG1lcmdlLAorIyB3ZSBoYWQgYmV0dGVyIHNheSB0aGF0IHRoZSBjdXJyZW50IHVzZXIgaXMgcmVzcG9uc2libGUgZm9yIHRoYXQuCisKK2Nhc2UgIiRub19jb21taXQiIGluCisnJykKKwlnaXQtY29tbWl0IC1uIC1GIC5tc2cgJGVkaXQKKwlybSAtZiAubXNnCisJOzsKK2VzYWMKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZXhhbXBsZXMvZ2l0LXN2bmltcG9ydC5wZXJsIGIvY29udHJpYi9leGFtcGxlcy9naXQtc3ZuaW1wb3J0LnBlcmwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWE4YzFiMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZXhhbXBsZXMvZ2l0LXN2bmltcG9ydC5wZXJsCkBAIC0wLDAgKzEsOTc2IEBACisjIS91c3IvYmluL3BlcmwgLXcKKworIyBUaGlzIHRvb2wgaXMgY29weXJpZ2h0IChjKSAyMDA1LCBNYXR0aGlhcyBVcmxpY2hzLgorIyBJdCBpcyByZWxlYXNlZCB1bmRlciB0aGUgR251IFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIuCisjCisjIFRoZSBiYXNpYyBpZGVhIGlzIHRvIHB1bGwgYW5kIGFuYWx5emUgU1ZOIGNoYW5nZXMuCisjCisjIENoZWNraW5nIG91dCB0aGUgZmlsZXMgaXMgZG9uZSBieSBhIHNpbmdsZSBsb25nLXJ1bm5pbmcgU1ZOIGNvbm5lY3Rpb24uCisjCisjIFRoZSBoZWFkIHJldmlzaW9uIGlzIG9uIGJyYW5jaCAib3JpZ2luIiBieSBkZWZhdWx0LgorIyBZb3UgY2FuIGNoYW5nZSB0aGF0IHdpdGggdGhlICctbycgb3B0aW9uLgorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIEdldG9wdDo6U3RkOwordXNlIEZpbGU6OkNvcHk7Cit1c2UgRmlsZTo6U3BlYzsKK3VzZSBGaWxlOjpUZW1wIHF3KHRlbXBmaWxlKTsKK3VzZSBGaWxlOjpQYXRoIHF3KG1rcGF0aCk7Cit1c2UgRmlsZTo6QmFzZW5hbWUgcXcoYmFzZW5hbWUgZGlybmFtZSk7Cit1c2UgVGltZTo6TG9jYWw7Cit1c2UgSU86OlBpcGU7Cit1c2UgUE9TSVggcXcoc3RyZnRpbWUgZHVwMik7Cit1c2UgSVBDOjpPcGVuMjsKK3VzZSBTVk46OkNvcmU7Cit1c2UgU1ZOOjpSYTsKKworZGllICJOZWVkIFNWTjpDb3JlIDEuMi4xIG9yIGJldHRlciIgaWYgJFNWTjo6Q29yZTo6VkVSU0lPTiBsdCAiMS4yLjEiOworCiskU0lHeydQSVBFJ309IklHTk9SRSI7CiskRU5WeydUWid9PSJVVEMiOworCitvdXIoJG9wdF9oLCRvcHRfbywkb3B0X3YsJG9wdF91LCRvcHRfQywkb3B0X2ksJG9wdF9tLCRvcHRfTSwkb3B0X3QsJG9wdF9ULAorICAgICRvcHRfYiwkb3B0X3IsJG9wdF9JLCRvcHRfQSwkb3B0X3MsJG9wdF9sLCRvcHRfZCwkb3B0X0QsJG9wdF9TLCRvcHRfRiwKKyAgICAkb3B0X1AsJG9wdF9SKTsKKworc3ViIHVzYWdlKCkgeworCXByaW50IFNUREVSUiA8PEVORDsKK1VzYWdlOiAke1xiYXNlbmFtZSAkMH0gICAgICMgZmV0Y2gvdXBkYXRlIEdJVCBmcm9tIFNWTgorICAgICAgIFstbyBicmFuY2gtZm9yLUhFQURdIFstaF0gWy12XSBbLWwgbWF4X3Jldl0gWy1SIHJlcGFja19lYWNoX3JldnNdCisgICAgICAgWy1DIEdJVF9yZXBvc2l0b3J5XSBbLXQgdGFnbmFtZV0gWy1UIHRydW5rbmFtZV0gWy1iIGJyYW5jaG5hbWVdCisgICAgICAgWy1kfC1EXSBbLWldIFstdV0gWy1yXSBbLUkgaWdub3JlZmlsZW5hbWVdIFstcyBzdGFydF9jaGddCisgICAgICAgWy1tXSBbLU0gcmVnZXhdIFstQSBhdXRob3JfZmlsZV0gWy1TXSBbLUZdIFstUCBwcm9qZWN0X25hbWVdIFtTVk5fVVJMXQorRU5ECisJZXhpdCgxKTsKK30KKworZ2V0b3B0cygiQTpiOkM6ZERGaGlJOmw6bU06bzpyczp0OlQ6U1A6Ujp1diIpIG9yIHVzYWdlKCk7Cit1c2FnZSBpZiAkb3B0X2g7CisKK215ICR0YWdfbmFtZSA9ICRvcHRfdCB8fCAidGFncyI7CitteSAkdHJ1bmtfbmFtZSA9IGRlZmluZWQgJG9wdF9UID8gJG9wdF9UIDogInRydW5rIjsKK215ICRicmFuY2hfbmFtZSA9ICRvcHRfYiB8fCAiYnJhbmNoZXMiOworbXkgJHByb2plY3RfbmFtZSA9ICRvcHRfUCB8fCAiIjsKKyRwcm9qZWN0X25hbWUgPSAiLyIgLiAkcHJvamVjdF9uYW1lIGlmICgkcHJvamVjdF9uYW1lKTsKK215ICRyZXBhY2tfYWZ0ZXIgPSAkb3B0X1IgfHwgMTAwMDsKK215ICRyb290X3Bvb2wgPSBTVk46OlBvb2wtPm5ld19kZWZhdWx0OworCitAQVJHViA9PSAxIG9yIEBBUkdWID09IDIgb3IgdXNhZ2UoKTsKKworJG9wdF9vIHx8PSAib3JpZ2luIjsKKyRvcHRfcyB8fD0gMTsKK215ICRnaXRfdHJlZSA9ICRvcHRfQzsKKyRnaXRfdHJlZSB8fD0gIi4iOworCitteSAkc3ZuX3VybCA9ICRBUkdWWzBdOworbXkgJHN2bl9kaXIgPSAkQVJHVlsxXTsKKworb3VyIEBtZXJnZXJ4ID0gKCk7CitpZiAoJG9wdF9tKSB7CisJbXkgJGJyYW5jaF9lc2MgPSBxdW90ZW1ldGEgKCRicmFuY2hfbmFtZSk7CisJbXkgJHRydW5rX2VzYyAgPSBxdW90ZW1ldGEgKCR0cnVua19uYW1lKTsKKwlAbWVyZ2VyeCA9CisJKAorCQlxciFcYig/Om1lcmcoPzplZD98aW5nKSlcYi4qP1xiKCg/Oig/PD0kYnJhbmNoX2VzYy8pW1x3XC5cLV0rKXwoPzokdHJ1bmtfZXNjKSlcYiFpLAorCQlxciFcYig/OmZyb218b2YpXFcrKCg/Oig/PD0kYnJhbmNoX2VzYy8pW1x3XC5cLV0rKXwoPzokdHJ1bmtfZXNjKSlcYiFpLAorCQlxciFcYig/OmZyb218b2YpXFcrKD86dGhlICk/KFtcd1wuXC1dKylbLVxzXWJyYW5jaFxiIWkKKwkpOworfQoraWYgKCRvcHRfTSkgeworCXVuc2hpZnQgKEBtZXJnZXJ4LCBxci8kb3B0X00vKTsKK30KKworIyBBYnNvbHV0aXplIGZpbGVuYW1lIG5vdywgc2luY2Ugd2Ugd2lsbCBoYXZlIGNoZGlyJ2VkIGJ5IHRoZSB0aW1lIHdlCisjIGdldCBhcm91bmQgdG8gb3BlbmluZyBpdC4KKyRvcHRfQSA9IEZpbGU6OlNwZWMtPnJlbDJhYnMoJG9wdF9BKSBpZiAkb3B0X0E7CisKK291ciAldXNlcnMgPSAoKTsKK291ciAkdXNlcnNfZmlsZSA9IHVuZGVmOworc3ViIHJlYWRfdXNlcnMoJCkgeworCSR1c2Vyc19maWxlID0gRmlsZTo6U3BlYy0+cmVsMmFicyhAXyk7CisJZGllICJDYW5ub3Qgb3BlbiAkdXNlcnNfZmlsZVxuIiB1bmxlc3MgLWYgJHVzZXJzX2ZpbGU7CisJb3BlbihteSAkYXV0aG9ycywkdXNlcnNfZmlsZSk7CisJd2hpbGUoPCRhdXRob3JzPikgeworCQljaG9tcDsKKwkJbmV4dCB1bmxlc3MgL14oXFMrPylccyo9XHMqKC4rPylccyo8KC4rKT5ccyokLzsKKwkJKG15ICR1c2VyLG15ICRuYW1lLG15ICRlbWFpbCkgPSAoJDEsJDIsJDMpOworCQkkdXNlcnN7JHVzZXJ9ID0gWyRuYW1lLCRlbWFpbF07CisJfQorCWNsb3NlKCRhdXRob3JzKTsKK30KKworc2VsZWN0KFNUREVSUik7ICR8PTE7IHNlbGVjdChTVERPVVQpOworCisKK3BhY2thZ2UgU1ZOY29ubjsKKyMgQmFzaWMgU1ZOIGNvbm5lY3Rpb24uCisjIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBjb25uZWN0aW5nIGFuZCBkb3dubG9hZGluZywgc28gLi4uCisKK3VzZSBGaWxlOjpTcGVjOwordXNlIEZpbGU6OlRlbXAgcXcodGVtcGZpbGUpOwordXNlIFBPU0lYIHF3KHN0cmZ0aW1lIGR1cDIpOwordXNlIEZjbnRsIHF3KFNFRUtfU0VUKTsKKworc3ViIG5ldyB7CisJbXkoJHdoYXQsJHJlcG8pID0gQF87CisJJHdoYXQ9cmVmKCR3aGF0KSBpZiByZWYoJHdoYXQpOworCisJbXkgJHNlbGYgPSB7fTsKKwkkc2VsZi0+eydidWZmZXInfSA9ICIiOworCWJsZXNzKCRzZWxmLCR3aGF0KTsKKworCSRyZXBvID1+IHMjLyskIyM7CisJJHNlbGYtPnsnZnVsbHJlcCd9ID0gJHJlcG87CisJJHNlbGYtPmNvbm4oKTsKKworCXJldHVybiAkc2VsZjsKK30KKworc3ViIGNvbm4geworCW15ICRzZWxmID0gc2hpZnQ7CisJbXkgJHJlcG8gPSAkc2VsZi0+eydmdWxscmVwJ307CisJbXkgJGF1dGggPSBTVk46OkNvcmU6OmF1dGhfb3BlbiAoW1NWTjo6Q2xpZW50OjpnZXRfc2ltcGxlX3Byb3ZpZGVyLAorCQkJICBTVk46OkNsaWVudDo6Z2V0X3NzbF9zZXJ2ZXJfdHJ1c3RfZmlsZV9wcm92aWRlciwKKwkJCSAgU1ZOOjpDbGllbnQ6OmdldF91c2VybmFtZV9wcm92aWRlcl0pOworCW15ICRzID0gU1ZOOjpSYS0+bmV3KHVybCA9PiAkcmVwbywgYXV0aCA9PiAkYXV0aCwgcG9vbCA9PiAkcm9vdF9wb29sKTsKKwlkaWUgIlNWTiBjb25uZWN0aW9uIHRvICRyZXBvOiAkIVxuIiB1bmxlc3MgZGVmaW5lZCAkczsKKwkkc2VsZi0+eydzdm4nfSA9ICRzOworCSRzZWxmLT57J3JlcG8nfSA9ICRyZXBvOworCSRzZWxmLT57J21heHJldid9ID0gJHMtPmdldF9sYXRlc3RfcmV2bnVtKCk7Cit9CisKK3N1YiBmaWxlIHsKKwlteSgkc2VsZiwkcGF0aCwkcmV2KSA9IEBfOworCisJbXkgKCRmaCwgJG5hbWUpID0gdGVtcGZpbGUoJ2dpdHN2bi5YWFhYWFgnLAorCQkgICAgRElSID0+IEZpbGU6OlNwZWMtPnRtcGRpcigpLCBVTkxJTksgPT4gMSk7CisKKwlwcmludCAiLi4uICRyZXYgJHBhdGggLi4uXG4iIGlmICRvcHRfdjsKKwlteSAodW5kZWYsICRwcm9wZXJ0aWVzKTsKKwkkcGF0aCA9fiBzI14vKiMjOworCW15ICRzdWJwb29sID0gU1ZOOjpQb29sOjpuZXdfZGVmYXVsdF9zdWI7CisJZXZhbCB7ICh1bmRlZiwgJHByb3BlcnRpZXMpCisJCSAgID0gJHNlbGYtPnsnc3ZuJ30tPmdldF9maWxlKCRwYXRoLCRyZXYsJGZoKTsgfTsKKwlpZigkQCkgeworCQlyZXR1cm4gdW5kZWYgaWYgJEAgPX4gL0F0dGVtcHRlZCB0byBnZXQgY2hlY2tzdW0vOworCQlkaWUgJEA7CisJfQorCW15ICRtb2RlOworCWlmIChleGlzdHMgJHByb3BlcnRpZXMtPnsnc3ZuOmV4ZWN1dGFibGUnfSkgeworCQkkbW9kZSA9ICcxMDA3NTUnOworCX0gZWxzaWYgKGV4aXN0cyAkcHJvcGVydGllcy0+eydzdm46c3BlY2lhbCd9KSB7CisJCW15ICgkc3BlY2lhbF9jb250ZW50LCAkZmlsZXNpemUpOworCQkkZmlsZXNpemUgPSB0ZWxsICRmaDsKKwkJc2VlayAkZmgsIDAsIFNFRUtfU0VUOworCQlyZWFkICRmaCwgJHNwZWNpYWxfY29udGVudCwgJGZpbGVzaXplOworCQlpZiAoJHNwZWNpYWxfY29udGVudCA9fiBzL15saW5rIC8vKSB7CisJCQkkbW9kZSA9ICcxMjAwMDAnOworCQkJc2VlayAkZmgsIDAsIFNFRUtfU0VUOworCQkJdHJ1bmNhdGUgJGZoLCAwOworCQkJcHJpbnQgJGZoICRzcGVjaWFsX2NvbnRlbnQ7CisJCX0gZWxzZSB7CisJCQlkaWUgInVuZXhwZWN0ZWQgc3ZuOnNwZWNpYWwgZmlsZSBlbmNvdW50ZXJlZCI7CisJCX0KKwl9IGVsc2UgeworCQkkbW9kZSA9ICcxMDA2NDQnOworCX0KKwljbG9zZSAoJGZoKTsKKworCXJldHVybiAoJG5hbWUsICRtb2RlKTsKK30KKworc3ViIGlnbm9yZSB7CisJbXkoJHNlbGYsJHBhdGgsJHJldikgPSBAXzsKKworCXByaW50ICIuLi4gJHJldiAkcGF0aCAuLi5cbiIgaWYgJG9wdF92OworCSRwYXRoID1+IHMjXi8qIyM7CisJbXkgJHN1YnBvb2wgPSBTVk46OlBvb2w6Om5ld19kZWZhdWx0X3N1YjsKKwlteSAodW5kZWYsdW5kZWYsJHByb3BlcnRpZXMpCisJICAgID0gJHNlbGYtPnsnc3ZuJ30tPmdldF9kaXIoJHBhdGgsJHJldix1bmRlZik7CisJaWYgKGV4aXN0cyAkcHJvcGVydGllcy0+eydzdm46aWdub3JlJ30pIHsKKwkJbXkgKCRmaCwgJG5hbWUpID0gdGVtcGZpbGUoJ2dpdHN2bi5YWFhYWFgnLAorCQkJCQkgICBESVIgPT4gRmlsZTo6U3BlYy0+dG1wZGlyKCksCisJCQkJCSAgIFVOTElOSyA9PiAxKTsKKwkJcHJpbnQgJGZoICRwcm9wZXJ0aWVzLT57J3N2bjppZ25vcmUnfTsKKwkJY2xvc2UoJGZoKTsKKwkJcmV0dXJuICRuYW1lOworCX0gZWxzZSB7CisJCXJldHVybiB1bmRlZjsKKwl9Cit9CisKK3N1YiBkaXJfbGlzdCB7CisJbXkoJHNlbGYsJHBhdGgsJHJldikgPSBAXzsKKwkkcGF0aCA9fiBzI14vKiMjOworCW15ICRzdWJwb29sID0gU1ZOOjpQb29sOjpuZXdfZGVmYXVsdF9zdWI7CisJbXkgKCRkaXJlbnRzLHVuZGVmLCRwcm9wZXJ0aWVzKQorCSAgICA9ICRzZWxmLT57J3N2bid9LT5nZXRfZGlyKCRwYXRoLCRyZXYsdW5kZWYpOworCXJldHVybiAkZGlyZW50czsKK30KKworcGFja2FnZSBtYWluOwordXNlIFVSSTsKKworb3VyICRzdm4gPSAkc3ZuX3VybDsKKyRzdm4gLj0gIi8kc3ZuX2RpciIgaWYgZGVmaW5lZCAkc3ZuX2RpcjsKK215ICRzdm4yID0gU1ZOY29ubi0+bmV3KCRzdm4pOworJHN2biA9IFNWTmNvbm4tPm5ldygkc3ZuKTsKKworbXkgJGx3cF91YTsKK2lmKCRvcHRfZCBvciAkb3B0X0QpIHsKKwkkc3ZuX3VybCA9IFVSSS0+bmV3KCRzdm5fdXJsKS0+Y2Fub25pY2FsOworCWlmKCRvcHRfRCkgeworCQkkc3ZuX2RpciA9fiBzIy8qJCMvIzsKKwl9IGVsc2UgeworCQkkc3ZuX2RpciA9ICIiOworCX0KKwlpZiAoJHN2bl91cmwtPnNjaGVtZSBlcSAiaHR0cCIpIHsKKwkJdXNlIExXUDo6VXNlckFnZW50OworCQkkbHdwX3VhID0gTFdQOjpVc2VyQWdlbnQtPm5ldyhrZWVwX2FsaXZlID0+IDEsIHJlcXVlc3RzX3JlZGlyZWN0YWJsZSA9PiBbXSk7CisJfSBlbHNlIHsKKwkJcHJpbnQgU1RERVJSICJXYXJuaW5nOiBub3QgSFRUUDsgdHVybmluZyBvZmYgZGlyZWN0IGZpbGUgYWNjZXNzXG4iOworCQkkb3B0X2Q9MDsKKwl9Cit9CisKK3N1YiBwZGF0ZSgkKSB7CisJbXkoJGQpID0gQF87CisJJGQgPX4gbSMoXGRcZFxkXGQpLShcZFxkKS0oXGRcZClUKFxkXGQpOihcZFxkKTooXGRcZCkjCisJCW9yIGRpZSAiVW5wYXJzZWFibGUgZGF0ZTogJGRcbiI7CisJbXkgJHk9JDE7ICR5LT0xOTAwIGlmICR5PjE5MDA7CisJcmV0dXJuIHRpbWVnbSgkNnx8MCwkNSwkNCwkMywkMi0xLCR5KTsKK30KKworc3ViIGdldHdkKCkgeworCW15ICRwd2QgPSBgcHdkYDsKKwljaG9tcCAkcHdkOworCXJldHVybiAkcHdkOworfQorCisKK3N1YiBnZXRfaGVhZHJlZigkJCkgeworICAgIG15ICRuYW1lICAgID0gc2hpZnQ7CisgICAgbXkgJGdpdF9kaXIgPSBzaGlmdDsKKyAgICBteSAkc2hhOworCisgICAgaWYgKG9wZW4oQywiJGdpdF9kaXIvcmVmcy9oZWFkcy8kbmFtZSIpKSB7CisJY2hvbXAoJHNoYSA9IDxDPik7CisJY2xvc2UoQyk7CisJbGVuZ3RoKCRzaGEpID09IDQwCisJICAgIG9yIGRpZSAiQ2Fubm90IGdldCBoZWFkIGlkIGZvciAkbmFtZSAoJHNoYSk6ICQhXG4iOworICAgIH0KKyAgICByZXR1cm4gJHNoYTsKK30KKworCistZCAkZ2l0X3RyZWUKKwlvciBta2RpcigkZ2l0X3RyZWUsMDc3NykKKwlvciBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgJGdpdF90cmVlOiAkISI7CitjaGRpcigkZ2l0X3RyZWUpOworCitteSAkb3JpZ19icmFuY2ggPSAiIjsKK215ICRmb3J3YXJkX21hc3RlciA9IDA7CitteSAlYnJhbmNoZXM7CisKK215ICRnaXRfZGlyID0gJEVOVnsiR0lUX0RJUiJ9IHx8ICIuZ2l0IjsKKyRnaXRfZGlyID0gZ2V0d2QoKS4iLyIuJGdpdF9kaXIgdW5sZXNzICRnaXRfZGlyID1+IG0jXi8jOworJEVOVnsiR0lUX0RJUiJ9ID0gJGdpdF9kaXI7CitteSAkb3JpZ19naXRfaW5kZXg7Ciskb3JpZ19naXRfaW5kZXggPSAkRU5We0dJVF9JTkRFWF9GSUxFfSBpZiBleGlzdHMgJEVOVntHSVRfSU5ERVhfRklMRX07CitteSAoJGdpdF9paCwgJGdpdF9pbmRleCkgPSB0ZW1wZmlsZSgnZ2l0WFhYWFhYJywgU1VGRklYID0+ICcuaWR4JywKKwkJCQkgICAgRElSID0+IEZpbGU6OlNwZWMtPnRtcGRpcigpKTsKK2Nsb3NlICgkZ2l0X2loKTsKKyRFTlZ7R0lUX0lOREVYX0ZJTEV9ID0gJGdpdF9pbmRleDsKK215ICRtYXhudW0gPSAwOworbXkgJGxhc3RfcmV2ID0gIiI7CitteSAkbGFzdF9icmFuY2g7CitteSAkY3VycmVudF9yZXYgPSAkb3B0X3MgfHwgMTsKK3VubGVzcygtZCAkZ2l0X2RpcikgeworCXN5c3RlbSgiZ2l0LWluaXQiKTsKKwlkaWUgIkNhbm5vdCBpbml0IHRoZSBHSVQgZGIgYXQgJGdpdF90cmVlOiAkP1xuIiBpZiAkPzsKKwlzeXN0ZW0oImdpdC1yZWFkLXRyZWUiKTsKKwlkaWUgIkNhbm5vdCBpbml0IGFuIGVtcHR5IHRyZWU6ICQ/XG4iIGlmICQ/OworCisJJGxhc3RfYnJhbmNoID0gJG9wdF9vOworCSRvcmlnX2JyYW5jaCA9ICIiOworfSBlbHNlIHsKKwktZiAiJGdpdF9kaXIvcmVmcy9oZWFkcy8kb3B0X28iCisJCW9yIGRpZSAiQnJhbmNoICckb3B0X28nIGRvZXMgbm90IGV4aXN0LlxuIi4KKwkJICAgICAgICJFaXRoZXIgdXNlIHRoZSBjb3JyZWN0ICctbyBicmFuY2gnIG9wdGlvbixcbiIuCisJCSAgICAgICAib3IgaW1wb3J0IHRvIGEgbmV3IHJlcG9zaXRvcnkuXG4iOworCisJLWYgIiRnaXRfZGlyL3N2bjJnaXQiCisJCW9yIGRpZSAiJyRnaXRfZGlyL3N2bjJnaXQnIGRvZXMgbm90IGV4aXN0LlxuIi4KKwkJICAgICAgICJZb3UgbmVlZCB0aGF0IGZpbGUgZm9yIGluY3JlbWVudGFsIGltcG9ydHMuXG4iOworCW9wZW4oRiwgImdpdC1zeW1ib2xpYy1yZWYgSEVBRCB8Iikgb3IKKwkJZGllICJDYW5ub3QgcnVuIGdpdC1zeW1ib2xpYy1yZWY6ICQhXG4iOworCWNob21wICgkbGFzdF9icmFuY2ggPSA8Rj4pOworCSRsYXN0X2JyYW5jaCA9IGJhc2VuYW1lKCRsYXN0X2JyYW5jaCk7CisJY2xvc2UoRik7CisJdW5sZXNzKCRsYXN0X2JyYW5jaCkgeworCQl3YXJuICJDYW5ub3QgcmVhZCB0aGUgbGFzdCBicmFuY2ggbmFtZTogJCEgLS0gYXNzdW1pbmcgJ21hc3RlcidcbiI7CisJCSRsYXN0X2JyYW5jaCA9ICJtYXN0ZXIiOworCX0KKwkkb3JpZ19icmFuY2ggPSAkbGFzdF9icmFuY2g7CisJJGxhc3RfcmV2ID0gZ2V0X2hlYWRyZWYoJG9yaWdfYnJhbmNoLCAkZ2l0X2Rpcik7CisJaWYgKC1mICIkZ2l0X2Rpci9TVk4yR0lUX0hFQUQiKSB7CisJCWRpZSA8PEVPTTsKK1NWTjJHSVRfSEVBRCBleGlzdHMuCitNYWtlIHN1cmUgeW91ciB3b3JraW5nIGRpcmVjdG9yeSBjb3JyZXNwb25kcyB0byBIRUFEIGFuZCByZW1vdmUgU1ZOMkdJVF9IRUFELgorWW91IG1heSBuZWVkIHRvIHJ1bgorCisgICAgZ2l0LXJlYWQtdHJlZSAtbSAtdSBTVk4yR0lUX0hFQUQgSEVBRAorRU9NCisJfQorCXN5c3RlbSgnY3AnLCAiJGdpdF9kaXIvSEVBRCIsICIkZ2l0X2Rpci9TVk4yR0lUX0hFQUQiKTsKKworCSRmb3J3YXJkX21hc3RlciA9CisJICAgICRvcHRfbyBuZSAnbWFzdGVyJyAmJiAtZiAiJGdpdF9kaXIvcmVmcy9oZWFkcy9tYXN0ZXIiICYmCisJICAgIHN5c3RlbSgnY21wJywgJy1zJywgIiRnaXRfZGlyL3JlZnMvaGVhZHMvbWFzdGVyIiwKKwkJCQkiJGdpdF9kaXIvcmVmcy9oZWFkcy8kb3B0X28iKSA9PSAwOworCisJIyBwb3B1bGF0ZSBpbmRleAorCXN5c3RlbSgnZ2l0LXJlYWQtdHJlZScsICRsYXN0X3Jldik7CisJZGllICJyZWFkLXRyZWUgZmFpbGVkOiAkP1xuIiBpZiAkPzsKKworCSMgR2V0IHRoZSBsYXN0IGltcG9ydCB0aW1lc3RhbXBzCisJb3BlbiBteSAkQiwiPCIsICIkZ2l0X2Rpci9zdm4yZ2l0IjsKKwl3aGlsZSg8JEI+KSB7CisJCWNob21wOworCQlteSgkbnVtLCRicmFuY2gsJHJlZikgPSBzcGxpdDsKKwkJJGJyYW5jaGVzeyRicmFuY2h9eyRudW19ID0gJHJlZjsKKwkJJGJyYW5jaGVzeyRicmFuY2h9eyJMQVNUIn0gPSAkcmVmOworCQkkY3VycmVudF9yZXYgPSAkbnVtKzEgaWYgJGN1cnJlbnRfcmV2IDw9ICRudW07CisJfQorCWNsb3NlKCRCKTsKK30KKy1kICRnaXRfZGlyCisJb3IgZGllICJDb3VsZCBub3QgY3JlYXRlIGdpdCBzdWJkaXIgKCRnaXRfZGlyKS5cbiI7CisKK215ICRkZWZhdWx0X2F1dGhvcnMgPSAiJGdpdF9kaXIvc3ZuLWF1dGhvcnMiOworaWYgKCRvcHRfQSkgeworCXJlYWRfdXNlcnMoJG9wdF9BKTsKKwljb3B5KCRvcHRfQSwkZGVmYXVsdF9hdXRob3JzKSBvciBkaWUgIkNvcHkgZmFpbGVkOiAkISI7Cit9IGVsc2UgeworCXJlYWRfdXNlcnMoJGRlZmF1bHRfYXV0aG9ycykgaWYgLWYgJGRlZmF1bHRfYXV0aG9yczsKK30KKworb3BlbiBCUkFOQ0hFUywiPj4iLCAiJGdpdF9kaXIvc3ZuMmdpdCI7CisKK3N1YiBub2RlX2tpbmQoJCQpIHsKKwlteSAoJHN2bnBhdGgsICRyZXZpc2lvbikgPSBAXzsKKwkkc3ZucGF0aCA9fiBzI14vKiMjOworCW15ICRzdWJwb29sID0gU1ZOOjpQb29sOjpuZXdfZGVmYXVsdF9zdWI7CisJbXkgJGtpbmQgPSAkc3ZuLT57J3N2bid9LT5jaGVja19wYXRoKCRzdm5wYXRoLCRyZXZpc2lvbik7CisJcmV0dXJuICRraW5kOworfQorCitzdWIgZ2V0X2ZpbGUoJCQkKSB7CisJbXkoJHN2bnBhdGgsJHJldiwkcGF0aCkgPSBAXzsKKworCSMgbm93IGdldCBpdAorCW15ICgkbmFtZSwkbW9kZSk7CisJaWYoJG9wdF9kKSB7CisJCW15KCRyZXEsJHJlcyk7CisKKwkJIyAvc3ZuLyFzdm4vYmMvMi9kamFuZ28vdHJ1bmsvZGphbmdvLWRvY3MvYnVpbGQucHkKKwkJbXkgJHVybD0kc3ZuX3VybC0+Y2xvbmUoKTsKKwkJJHVybC0+cGF0aCgkdXJsLT5wYXRoLiIvIXN2bi9iYy8kcmV2LyRzdm5fZGlyJHN2bnBhdGgiKTsKKwkJcHJpbnQgIi4uLiAkcGF0aC4uLlxuIiBpZiAkb3B0X3Y7CisJCSRyZXEgPSBIVFRQOjpSZXF1ZXN0LT5uZXcoR0VUID0+ICR1cmwpOworCQkkcmVzID0gJGx3cF91YS0+cmVxdWVzdCgkcmVxKTsKKwkJaWYgKCRyZXMtPmlzX3N1Y2Nlc3MpIHsKKwkJCW15ICRmaDsKKwkJCSgkZmgsICRuYW1lKSA9IHRlbXBmaWxlKCdnaXRzdm4uWFhYWFhYJywKKwkJCURJUiA9PiBGaWxlOjpTcGVjLT50bXBkaXIoKSwgVU5MSU5LID0+IDEpOworCQkJcHJpbnQgJGZoICRyZXMtPmNvbnRlbnQ7CisJCQljbG9zZSgkZmgpIG9yIGRpZSAiQ291bGQgbm90IHdyaXRlICRuYW1lOiAkIVxuIjsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB1bmRlZiBpZiAkcmVzLT5jb2RlID09IDMwMTsgIyBkaXJlY3Rvcnk/CisJCQlkaWUgJHJlcy0+c3RhdHVzX2xpbmUuIiBhdCAkdXJsXG4iOworCQl9CisJCSRtb2RlID0gJzA2NDQnOyAjIGNhbid0IG9idGFpbiBtb2RlIHZpYSBkaXJlY3QgaHR0cCByZXF1ZXN0PworCX0gZWxzZSB7CisJCSgkbmFtZSwkbW9kZSkgPSAkc3ZuLT5maWxlKCIkc3ZucGF0aCIsJHJldik7CisJCXJldHVybiB1bmRlZiB1bmxlc3MgZGVmaW5lZCAkbmFtZTsKKwl9CisKKwlteSAkcGlkID0gb3BlbihteSAkRiwgJy18Jyk7CisJZGllICQhIHVubGVzcyBkZWZpbmVkICRwaWQ7CisJaWYgKCEkcGlkKSB7CisJICAgIGV4ZWMoImdpdC1oYXNoLW9iamVjdCIsICItdyIsICRuYW1lKQorCQlvciBkaWUgIkNhbm5vdCBjcmVhdGUgb2JqZWN0OiAkIVxuIjsKKwl9CisJbXkgJHNoYSA9IDwkRj47CisJY2hvbXAgJHNoYTsKKwljbG9zZSAkRjsKKwl1bmxpbmsgJG5hbWU7CisJcmV0dXJuIFskbW9kZSwgJHNoYSwgJHBhdGhdOworfQorCitzdWIgZ2V0X2lnbm9yZSgkJCQkJCkgeworCW15KCRuZXcsJG9sZCwkcmV2LCRwYXRoLCRzdm5wYXRoKSA9IEBfOworCisJcmV0dXJuIHVubGVzcyAkb3B0X0k7CisJbXkgJG5hbWUgPSAkc3ZuLT5pZ25vcmUoIiRzdm5wYXRoIiwkcmV2KTsKKwlpZiAoJHBhdGggZXEgJy8nKSB7CisJCSRwYXRoID0gJG9wdF9JOworCX0gZWxzZSB7CisJCSRwYXRoID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSgkcGF0aCwkb3B0X0kpOworCX0KKwlpZiAoZGVmaW5lZCAkbmFtZSkgeworCQlteSAkcGlkID0gb3BlbihteSAkRiwgJy18Jyk7CisJCWRpZSAkISB1bmxlc3MgZGVmaW5lZCAkcGlkOworCQlpZiAoISRwaWQpIHsKKwkJCWV4ZWMoImdpdC1oYXNoLW9iamVjdCIsICItdyIsICRuYW1lKQorCQkJICAgIG9yIGRpZSAiQ2Fubm90IGNyZWF0ZSBvYmplY3Q6ICQhXG4iOworCQl9CisJCW15ICRzaGEgPSA8JEY+OworCQljaG9tcCAkc2hhOworCQljbG9zZSAkRjsKKwkJdW5saW5rICRuYW1lOworCQlwdXNoKEAkbmV3LFsnMDY0NCcsJHNoYSwkcGF0aF0pOworCX0gZWxzaWYgKGRlZmluZWQgJG9sZCkgeworCQlwdXNoKEAkb2xkLCRwYXRoKTsKKwl9Cit9CisKK3N1YiBwcm9qZWN0X3BhdGgoJCQpCit7CisJbXkgKCRwYXRoLCAkcHJvamVjdCkgPSBAXzsKKworCSRwYXRoID0gIi8iLiRwYXRoIHVubGVzcyAoJHBhdGggPX4gbSNeXC8jKSA7CisJcmV0dXJuICQxIGlmICgkcGF0aCA9fiBtI14kcHJvamVjdFwvKC4qKSQjKTsKKworCSRwYXRoID1+IHMjXC4jXFxcLiNnOworCSRwYXRoID1+IHMjXCsjXFxcKyNnOworCXJldHVybiAiLyIgaWYgKCRwcm9qZWN0ID1+IG0jXiRwYXRoLiokIyk7CisKKwlyZXR1cm4gdW5kZWY7Cit9CisKK3N1YiBzcGxpdF9wYXRoKCQkKSB7CisJbXkoJHJldiwkcGF0aCkgPSBAXzsKKwlteSAkYnJhbmNoOworCisJaWYoJHBhdGggPX4gcyNeL1xRJHRhZ19uYW1lXEUvKFteL10rKS8/IyMpIHsKKwkJJGJyYW5jaCA9ICIvJDEiOworCX0gZWxzaWYoJHBhdGggPX4gcyNeL1xRJHRydW5rX25hbWVcRS8/IyMpIHsKKwkJJGJyYW5jaCA9ICIvIjsKKwl9IGVsc2lmKCRwYXRoID1+IHMjXi9cUSRicmFuY2hfbmFtZVxFLyhbXi9dKykvPyMjKSB7CisJCSRicmFuY2ggPSAkMTsKKwl9IGVsc2UgeworCQlteSAlbm9fZXJyb3IgPSAoCisJCQkiLyIgPT4gMSwKKwkJCSIvJHRhZ19uYW1lIiA9PiAxLAorCQkJIi8kYnJhbmNoX25hbWUiID0+IDEKKwkJKTsKKwkJcHJpbnQgU1RERVJSICIkcmV2OiBVbnJlY29nbml6ZWQgcGF0aDogJHBhdGhcbiIgdW5sZXNzIChkZWZpbmVkICRub19lcnJvcnskcGF0aH0pOworCQlyZXR1cm4gKCkKKwl9CisJaWYgKCRwYXRoIGVxICIiKSB7CisJCSRwYXRoID0gIi8iOworCX0gZWxzaWYgKCRwcm9qZWN0X25hbWUpIHsKKwkJJHBhdGggPSBwcm9qZWN0X3BhdGgoJHBhdGgsICRwcm9qZWN0X25hbWUpOworCX0KKwlyZXR1cm4gKCRicmFuY2gsJHBhdGgpOworfQorCitzdWIgYnJhbmNoX3JldigkJCkgeworCisJbXkgKCRzcmNicmFuY2gsJHVwdG9yZXYpID0gQF87CisKKwlteSAkYmJyYW5jaGVzID0gJGJyYW5jaGVzeyRzcmNicmFuY2h9OworCW15IEByZXZzID0gcmV2ZXJzZSBzb3J0IHsgKCRhIGVxICdMQVNUJyA/IDAgOiAkYSkgPD0+ICgkYiBlcSAnTEFTVCcgPyAwIDogJGIpIH0ga2V5cyAlJGJicmFuY2hlczsKKwlteSAkdGhlcmV2OworCWZvcmVhY2ggbXkgJGFyZXYoQHJldnMpIHsKKwkJbmV4dCBpZiAgKCRhcmV2IGVxICdMQVNUJyk7CisJCWlmICgkYXJldiA8PSAkdXB0b3JldikgeworCQkJJHRoZXJldiA9ICRhcmV2OworCQkJbGFzdDsKKwkJfQorCX0KKwlyZXR1cm4gJHRoZXJldjsKK30KKworc3ViIGV4cGFuZF9zdm5kaXIoJCQkKTsKKworc3ViIGV4cGFuZF9zdm5kaXIoJCQkKQoreworCW15ICgkc3ZucGF0aCwgJHJldiwgJHBhdGgpID0gQF87CisJbXkgQGxpc3Q7CisJZ2V0X2lnbm9yZShcQGxpc3QsIHVuZGVmLCAkcmV2LCAkcGF0aCwgJHN2bnBhdGgpOworCW15ICRkaXJlbnRzID0gJHN2bi0+ZGlyX2xpc3QoJHN2bnBhdGgsICRyZXYpOworCWZvcmVhY2ggbXkgJHAoa2V5cyAlJGRpcmVudHMpIHsKKwkJbXkgJGtpbmQgPSBub2RlX2tpbmQoJHN2bnBhdGguJy8nLiRwLCAkcmV2KTsKKwkJaWYgKCRraW5kIGVxICRTVk46Ok5vZGU6OmZpbGUpIHsKKwkJCW15ICRmID0gZ2V0X2ZpbGUoJHN2bnBhdGguJy8nLiRwLCAkcmV2LCAkcGF0aC4nLycuJHApOworCQkJcHVzaChAbGlzdCwgJGYpIGlmICRmOworCQl9IGVsc2lmICgka2luZCBlcSAkU1ZOOjpOb2RlOjpkaXIpIHsKKwkJCXB1c2goQGxpc3QsCisJCQkgICAgIGV4cGFuZF9zdm5kaXIoJHN2bnBhdGguJy8nLiRwLCAkcmV2LCAkcGF0aC4nLycuJHApKTsKKwkJfQorCX0KKwlyZXR1cm4gQGxpc3Q7Cit9CisKK3N1YiBjb3B5X3BhdGgoJCQkJCQkJCQpIHsKKwkjIFNvbWVib2R5IGNvcGllZCBhIHdob2xlIHN1YmRpcmVjdG9yeS4KKwkjIFdlIG5lZWQgdG8gZmluZCB0aGUgaW5kZXggZW50cmllcyBmcm9tIHRoZSBvbGQgdmVyc2lvbiB3aGljaCB0aGUKKwkjIFNWTiBsb2cgZW50cnkgcG9pbnRzIHRvLCBhbmQgYWRkIHRoZW0gdG8gdGhlIG5ldyBwbGFjZS4KKworCW15KCRuZXdyZXYsJG5ld2JyYW5jaCwkcGF0aCwkb2xkcGF0aCwkcmV2LCRub2RlX2tpbmQsJG5ldywkcGFyZW50cykgPSBAXzsKKworCW15KCRzcmNicmFuY2gsJHNyY3BhdGgpID0gc3BsaXRfcGF0aCgkcmV2LCRvbGRwYXRoKTsKKwl1bmxlc3MoZGVmaW5lZCAkc3JjYnJhbmNoICYmIGRlZmluZWQgJHNyY3BhdGgpIHsKKwkJcHJpbnQgIlBhdGggbm90IGZvdW5kIHdoZW4gY29weWluZyBmcm9tICRvbGRwYXRoIEAgJHJldi5cbiIuCisJCQkiV2lsbCB0cnkgdG8gY29weSBmcm9tIG9yaWdpbmFsIFNWTiBsb2NhdGlvbi4uLlxuIgorCQkJaWYgJG9wdF92OworCQlwdXNoIChAJG5ldywgZXhwYW5kX3N2bmRpcigkb2xkcGF0aCwgJHJldiwgJHBhdGgpKTsKKwkJcmV0dXJuOworCX0KKwlteSAkdGhlcmV2ID0gYnJhbmNoX3Jldigkc3JjYnJhbmNoLCAkcmV2KTsKKwlteSAkZ2l0cmV2ID0gJGJyYW5jaGVzeyRzcmNicmFuY2h9eyR0aGVyZXZ9OworCXVubGVzcygkZ2l0cmV2KSB7CisJCXByaW50IFNUREVSUiAiJG5ld3JldjokbmV3YnJhbmNoOiBjb3VsZCBub3QgZmluZCAkb2xkcGF0aCBcQCAkcmV2XG4iOworCQlyZXR1cm47CisJfQorCWlmICgkc3JjYnJhbmNoIG5lICRuZXdicmFuY2gpIHsKKwkJcHVzaChAJHBhcmVudHMsICRicmFuY2hlc3skc3JjYnJhbmNofXsnTEFTVCd9KTsKKwl9CisJcHJpbnQgIiRuZXdyZXY6JG5ld2JyYW5jaDokcGF0aDogY29weWluZyBmcm9tICRzcmNicmFuY2g6JHNyY3BhdGggQCAkcmV2XG4iIGlmICRvcHRfdjsKKwlpZiAoJG5vZGVfa2luZCBlcSAkU1ZOOjpOb2RlOjpkaXIpIHsKKwkJJHNyY3BhdGggPX4gcyMvKiQjLyM7CisJfQorCisJbXkgJHBpZCA9IG9wZW4gbXkgJGYsJy18JzsKKwlkaWUgJCEgdW5sZXNzIGRlZmluZWQgJHBpZDsKKwlpZiAoISRwaWQpIHsKKwkJZXhlYygiZ2l0LWxzLXRyZWUiLCItciIsIi16IiwkZ2l0cmV2LCRzcmNwYXRoKQorCQkJb3IgZGllICQhOworCX0KKwlsb2NhbCAkLyA9ICJcMCI7CisJd2hpbGUoPCRmPikgeworCQljaG9tcDsKKwkJbXkoJG0sJHApID0gc3BsaXQoL1x0LywkXywyKTsKKwkJbXkoJG1vZGUsJHR5cGUsJHNoYTEpID0gc3BsaXQoLyAvLCRtKTsKKwkJbmV4dCBpZiAkdHlwZSBuZSAiYmxvYiI7CisJCWlmICgkbm9kZV9raW5kIGVxICRTVk46Ok5vZGU6OmRpcikgeworCQkJJHAgPSAkcGF0aCAuIHN1YnN0cigkcCxsZW5ndGgoJHNyY3BhdGgpLTEpOworCQl9IGVsc2UgeworCQkJJHAgPSAkcGF0aDsKKwkJfQorCQlwdXNoKEAkbmV3LFskbW9kZSwkc2hhMSwkcF0pOworCX0KKwljbG9zZSgkZikgb3IKKwkJcHJpbnQgU1RERVJSICIkbmV3cmV2OiRuZXdicmFuY2g6IGNvdWxkIG5vdCBsaXN0IGZpbGVzIGluICRvbGRwYXRoIFxAICRyZXZcbiI7Cit9CisKK3N1YiBjb21taXQgeworCW15KCRicmFuY2gsICRjaGFuZ2VkX3BhdGhzLCAkcmV2aXNpb24sICRhdXRob3IsICRkYXRlLCAkbWVzc2FnZSkgPSBAXzsKKwlteSgkY29tbWl0dGVyX25hbWUsJGNvbW1pdHRlcl9lbWFpbCwkZGVzdCk7CisJbXkoJGF1dGhvcl9uYW1lLCRhdXRob3JfZW1haWwpOworCW15KEBvbGQsQG5ldyxAcGFyZW50cyk7CisKKwlpZiAobm90IGRlZmluZWQgJGF1dGhvciBvciAkYXV0aG9yIGVxICIiKSB7CisJCSRjb21taXR0ZXJfbmFtZSA9ICRjb21taXR0ZXJfZW1haWwgPSAidW5rbm93biI7CisJfSBlbHNpZiAoZGVmaW5lZCAkdXNlcnNfZmlsZSkgeworCQlkaWUgIlVzZXIgJGF1dGhvciBpcyBub3QgbGlzdGVkIGluICR1c2Vyc19maWxlXG4iCisJCSAgICB1bmxlc3MgZXhpc3RzICR1c2Vyc3skYXV0aG9yfTsKKwkJKCRjb21taXR0ZXJfbmFtZSwkY29tbWl0dGVyX2VtYWlsKSA9IEB7JHVzZXJzeyRhdXRob3J9fTsKKwl9IGVsc2lmICgkYXV0aG9yID1+IC9eKC4qPylccys8KC4qKT4kLykgeworCQkoJGNvbW1pdHRlcl9uYW1lLCAkY29tbWl0dGVyX2VtYWlsKSA9ICgkMSwgJDIpOworCX0gZWxzZSB7CisJCSRhdXRob3IgPX4gcy9ePCguKik+JC8kMS87CisJCSRjb21taXR0ZXJfbmFtZSA9ICRjb21taXR0ZXJfZW1haWwgPSAkYXV0aG9yOworCX0KKworCWlmICgkb3B0X0YgJiYgJG1lc3NhZ2UgPX4gL0Zyb206XHMrKC4qPylccys8KC4qKT5ccypcbi8pIHsKKwkJKCRhdXRob3JfbmFtZSwgJGF1dGhvcl9lbWFpbCkgPSAoJDEsICQyKTsKKwkJcHJpbnQgIkF1dGhvciBmcm9tIEZyb206ICQxIDwkMj5cbiIgaWYgKCRvcHRfdik7OworCX0gZWxzaWYgKCRvcHRfUyAmJiAkbWVzc2FnZSA9fiAvU2lnbmVkLW9mZi1ieTpccysoLio/KVxzKzwoLiopPlxzKlxuLykgeworCQkoJGF1dGhvcl9uYW1lLCAkYXV0aG9yX2VtYWlsKSA9ICgkMSwgJDIpOworCQlwcmludCAiQXV0aG9yIGZyb20gU2lnbmVkLW9mZi1ieTogJDEgPCQyPlxuIiBpZiAoJG9wdF92KTs7CisJfSBlbHNlIHsKKwkJJGF1dGhvcl9uYW1lID0gJGNvbW1pdHRlcl9uYW1lOworCQkkYXV0aG9yX2VtYWlsID0gJGNvbW1pdHRlcl9lbWFpbDsKKwl9CisKKwkkZGF0ZSA9IHBkYXRlKCRkYXRlKTsKKworCW15ICR0YWc7CisJbXkgJHBhcmVudDsKKwlpZigkYnJhbmNoIGVxICIvIikgeyAjIHRydW5rCisJCSRwYXJlbnQgPSAkb3B0X287CisJfSBlbHNpZigkYnJhbmNoID1+IG0jXi8oLispIykgeyAjIHRhZworCQkkdGFnID0gMTsKKwkJJHBhcmVudCA9ICQxOworCX0gZWxzZSB7ICMgIm5vcm1hbCIgYnJhbmNoCisJCSMgbm90aGluZyB0byBkbworCQkkcGFyZW50ID0gJGJyYW5jaDsKKwl9CisJJGRlc3QgPSAkcGFyZW50OworCisJbXkgJHByZXYgPSAkY2hhbmdlZF9wYXRocy0+eyIvIn07CisJaWYoJHByZXYgYW5kICRwcmV2LT5bMF0gZXEgIkEiKSB7CisJCWRlbGV0ZSAkY2hhbmdlZF9wYXRocy0+eyIvIn07CisJCW15ICRvbGRwYXRoID0gJHByZXYtPlsxXTsKKwkJbXkgJHJldjsKKwkJaWYoZGVmaW5lZCAkb2xkcGF0aCkgeworCQkJbXkgJHA7CisJCQkoJHBhcmVudCwkcCkgPSBzcGxpdF9wYXRoKCRyZXZpc2lvbiwkb2xkcGF0aCk7CisJCQlpZihkZWZpbmVkICRwYXJlbnQpIHsKKwkJCQlpZigkcGFyZW50IGVxICIvIikgeworCQkJCQkkcGFyZW50ID0gJG9wdF9vOworCQkJCX0gZWxzZSB7CisJCQkJCSRwYXJlbnQgPX4gcyNeLyMjOyAjIGlmIGl0J3MgYSB0YWcKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQkkcGFyZW50ID0gdW5kZWY7CisJCX0KKwl9CisKKwlteSAkcmV2OworCWlmKCRyZXZpc2lvbiA+ICRvcHRfcyBhbmQgZGVmaW5lZCAkcGFyZW50KSB7CisJCW9wZW4oSCwnLXwnLCJnaXQtcmV2LXBhcnNlIiwiLS12ZXJpZnkiLCRwYXJlbnQpOworCQkkcmV2ID0gPEg+OworCQljbG9zZShIKSBvciBkbyB7CisJCQlwcmludCBTVERFUlIgIiRyZXZpc2lvbjogY2Fubm90IGZpbmQgY29tbWl0ICckcGFyZW50JyFcbiI7CisJCQlyZXR1cm47CisJCX07CisJCWNob3AgJHJldjsKKwkJaWYobGVuZ3RoKCRyZXYpICE9IDQwKSB7CisJCQlwcmludCBTVERFUlIgIiRyZXZpc2lvbjogY2Fubm90IGZpbmQgY29tbWl0ICckcGFyZW50JyFcbiI7CisJCQlyZXR1cm47CisJCX0KKwkJJHJldiA9ICRicmFuY2hlc3soJHBhcmVudCBlcSAkb3B0X28pID8gIi8iIDogJHBhcmVudH17IkxBU1QifTsKKwkJaWYoJHJldmlzaW9uICE9ICRvcHRfcyBhbmQgbm90ICRyZXYpIHsKKwkJCXByaW50IFNUREVSUiAiJHJldmlzaW9uOiBkbyBub3Qga25vdyBhbmNlc3RvciBmb3IgJyRwYXJlbnQnIVxuIjsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCSRyZXYgPSB1bmRlZjsKKwl9CisKKyMJaWYoJHByZXYgYW5kICRwcmV2LT5bMF0gZXEgIkEiKSB7CisjCQlpZihub3QgJHRhZykgeworIwkJCXVubGVzcyhvcGVuKEgsIj4gJGdpdF9kaXIvcmVmcy9oZWFkcy8kYnJhbmNoIikpIHsKKyMJCQkJcHJpbnQgU1RERVJSICIkcmV2aXNpb246IENvdWxkIG5vdCBjcmVhdGUgYnJhbmNoICRicmFuY2g6ICQhXG4iOworIwkJCQkkc3RhdGU9MTE7CisjCQkJCW5leHQ7CisjCQkJfQorIwkJCXByaW50IEggIiRyZXZcbiIKKyMJCQkJb3IgZGllICJDb3VsZCBub3Qgd3JpdGUgYnJhbmNoICRicmFuY2g6ICQhIjsKKyMJCQljbG9zZShIKQorIwkJCQlvciBkaWUgIkNvdWxkIG5vdCB3cml0ZSBicmFuY2ggJGJyYW5jaDogJCEiOworIwkJfQorIwl9CisJaWYobm90IGRlZmluZWQgJHJldikgeworCQl1bmxpbmsoJGdpdF9pbmRleCk7CisJfSBlbHNpZiAoJHJldiBuZSAkbGFzdF9yZXYpIHsKKwkJcHJpbnQgIlN3aXRjaGluZyBmcm9tICRsYXN0X3JldiB0byAkcmV2ICgkYnJhbmNoKVxuIiBpZiAkb3B0X3Y7CisJCXN5c3RlbSgiZ2l0LXJlYWQtdHJlZSIsICRyZXYpOworCQlkaWUgInJlYWQtdHJlZSBmYWlsZWQgZm9yICRyZXY6ICQ/XG4iIGlmICQ/OworCQkkbGFzdF9yZXYgPSAkcmV2OworCX0KKworCXB1c2ggKEBwYXJlbnRzLCAkcmV2KSBpZiBkZWZpbmVkICRyZXY7CisKKwlteSAkY2lkOworCWlmKCR0YWcgYW5kIG5vdCAlJGNoYW5nZWRfcGF0aHMpIHsKKwkJJGNpZCA9ICRyZXY7CisJfSBlbHNlIHsKKwkJbXkgQHBhdGhzID0gc29ydCBrZXlzICUkY2hhbmdlZF9wYXRoczsKKwkJZm9yZWFjaCBteSAkcGF0aChAcGF0aHMpIHsKKwkJCW15ICRhY3Rpb24gPSAkY2hhbmdlZF9wYXRocy0+eyRwYXRofTsKKworCQkJaWYgKCRhY3Rpb24tPlswXSBlcSAiUiIpIHsKKwkJCQkjIHJlZmVyIHRvIGEgZmlsZS90cmVlIGluIGFuIGVhcmxpZXIgY29tbWl0CisJCQkJcHVzaChAb2xkLCRwYXRoKTsgIyByZW1vdmUgYW55IG9sZCBzdHVmZgorCQkJfQorCQkJaWYoKCRhY3Rpb24tPlswXSBlcSAiQSIpIHx8ICgkYWN0aW9uLT5bMF0gZXEgIlIiKSkgeworCQkJCW15ICRub2RlX2tpbmQgPSBub2RlX2tpbmQoJGFjdGlvbi0+WzNdLCAkcmV2aXNpb24pOworCQkJCWlmICgkbm9kZV9raW5kIGVxICRTVk46Ok5vZGU6OmZpbGUpIHsKKwkJCQkJbXkgJGYgPSBnZXRfZmlsZSgkYWN0aW9uLT5bM10sCisJCQkJCQkJICRyZXZpc2lvbiwgJHBhdGgpOworCQkJCQlpZiAoJGYpIHsKKwkJCQkJCXB1c2goQG5ldywkZikgaWYgJGY7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlteSAkb3BhdGggPSAkYWN0aW9uLT5bM107CisJCQkJCQlwcmludCBTVERFUlIgIiRyZXZpc2lvbjogJGJyYW5jaDogY291bGQgbm90IGZldGNoICckb3BhdGgnXG4iOworCQkJCQl9CisJCQkJfSBlbHNpZiAoJG5vZGVfa2luZCBlcSAkU1ZOOjpOb2RlOjpkaXIpIHsKKwkJCQkJaWYoJGFjdGlvbi0+WzFdKSB7CisJCQkJCQljb3B5X3BhdGgoJHJldmlzaW9uLCAkYnJhbmNoLAorCQkJCQkJCSAgJHBhdGgsICRhY3Rpb24tPlsxXSwKKwkJCQkJCQkgICRhY3Rpb24tPlsyXSwgJG5vZGVfa2luZCwKKwkJCQkJCQkgIFxAbmV3LCBcQHBhcmVudHMpOworCQkJCQl9IGVsc2UgeworCQkJCQkJZ2V0X2lnbm9yZShcQG5ldywgXEBvbGQsICRyZXZpc2lvbiwKKwkJCQkJCQkgICAkcGF0aCwgJGFjdGlvbi0+WzNdKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzaWYgKCRhY3Rpb24tPlswXSBlcSAiRCIpIHsKKwkJCQlwdXNoKEBvbGQsJHBhdGgpOworCQkJfSBlbHNpZiAoJGFjdGlvbi0+WzBdIGVxICJNIikgeworCQkJCW15ICRub2RlX2tpbmQgPSBub2RlX2tpbmQoJGFjdGlvbi0+WzNdLCAkcmV2aXNpb24pOworCQkJCWlmICgkbm9kZV9raW5kIGVxICRTVk46Ok5vZGU6OmZpbGUpIHsKKwkJCQkJbXkgJGYgPSBnZXRfZmlsZSgkYWN0aW9uLT5bM10sCisJCQkJCQkJICRyZXZpc2lvbiwgJHBhdGgpOworCQkJCQlwdXNoKEBuZXcsJGYpIGlmICRmOworCQkJCX0gZWxzaWYgKCRub2RlX2tpbmQgZXEgJFNWTjo6Tm9kZTo6ZGlyKSB7CisJCQkJCWdldF9pZ25vcmUoXEBuZXcsIFxAb2xkLCAkcmV2aXNpb24sCisJCQkJCQkgICAkcGF0aCwgJGFjdGlvbi0+WzNdKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWRpZSAiJHJldmlzaW9uOiB1bmtub3duIGFjdGlvbiAnIi4kYWN0aW9uLT5bMF0uIicgZm9yICRwYXRoXG4iOworCQkJfQorCQl9CisKKwkJd2hpbGUoQG9sZCkgeworCQkJbXkgQG8xOworCQkJaWYoQG9sZCA+IDU1KSB7CisJCQkJQG8xID0gc3BsaWNlKEBvbGQsMCw1MCk7CisJCQl9IGVsc2UgeworCQkJCUBvMSA9IEBvbGQ7CisJCQkJQG9sZCA9ICgpOworCQkJfQorCQkJbXkgJHBpZCA9IG9wZW4gbXkgJEYsICItfCI7CisJCQlkaWUgIiQhIiB1bmxlc3MgZGVmaW5lZCAkcGlkOworCQkJaWYgKCEkcGlkKSB7CisJCQkJZXhlYygiZ2l0LWxzLWZpbGVzIiwgIi16IiwgQG8xKSBvciBkaWUgJCE7CisJCQl9CisJCQlAbzEgPSAoKTsKKwkJCWxvY2FsICQvID0gIlwwIjsKKwkJCXdoaWxlKDwkRj4pIHsKKwkJCQljaG9tcDsKKwkJCQlwdXNoKEBvMSwkXyk7CisJCQl9CisJCQljbG9zZSgkRik7CisKKwkJCXdoaWxlKEBvMSkgeworCQkJCW15IEBvMjsKKwkJCQlpZihAbzEgPiA1NSkgeworCQkJCQlAbzIgPSBzcGxpY2UoQG8xLDAsNTApOworCQkJCX0gZWxzZSB7CisJCQkJCUBvMiA9IEBvMTsKKwkJCQkJQG8xID0gKCk7CisJCQkJfQorCQkJCXN5c3RlbSgiZ2l0LXVwZGF0ZS1pbmRleCIsIi0tZm9yY2UtcmVtb3ZlIiwiLS0iLEBvMik7CisJCQkJZGllICJDYW5ub3QgcmVtb3ZlIGZpbGVzOiAkP1xuIiBpZiAkPzsKKwkJCX0KKwkJfQorCQl3aGlsZShAbmV3KSB7CisJCQlteSBAbjI7CisJCQlpZihAbmV3ID4gMTIpIHsKKwkJCQlAbjIgPSBzcGxpY2UoQG5ldywwLDEwKTsKKwkJCX0gZWxzZSB7CisJCQkJQG4yID0gQG5ldzsKKwkJCQlAbmV3ID0gKCk7CisJCQl9CisJCQlzeXN0ZW0oImdpdC11cGRhdGUtaW5kZXgiLCItLWFkZCIsCisJCQkJKG1hcCB7ICgnLS1jYWNoZWluZm8nLCBAJF8pIH0gQG4yKSk7CisJCQlkaWUgIkNhbm5vdCBhZGQgZmlsZXM6ICQ/XG4iIGlmICQ/OworCQl9CisKKwkJbXkgJHBpZCA9IG9wZW4oQywiLXwiKTsKKwkJZGllICJDYW5ub3QgZm9yazogJCEiIHVubGVzcyBkZWZpbmVkICRwaWQ7CisJCXVubGVzcygkcGlkKSB7CisJCQlleGVjKCJnaXQtd3JpdGUtdHJlZSIpOworCQkJZGllICJDYW5ub3QgZXhlYyBnaXQtd3JpdGUtdHJlZTogJCFcbiI7CisJCX0KKwkJY2hvbXAobXkgJHRyZWUgPSA8Qz4pOworCQlsZW5ndGgoJHRyZWUpID09IDQwCisJCQlvciBkaWUgIkNhbm5vdCBnZXQgdHJlZSBpZCAoJHRyZWUpOiAkIVxuIjsKKwkJY2xvc2UoQykKKwkJCW9yIGRpZSAiRXJyb3IgcnVubmluZyBnaXQtd3JpdGUtdHJlZTogJD9cbiI7CisJCXByaW50ICJUcmVlIElEICR0cmVlXG4iIGlmICRvcHRfdjsKKworCQlteSAkcHIgPSBJTzo6UGlwZS0+bmV3KCkgb3IgZGllICJDYW5ub3Qgb3BlbiBwaXBlOiAkIVxuIjsKKwkJbXkgJHB3ID0gSU86OlBpcGUtPm5ldygpIG9yIGRpZSAiQ2Fubm90IG9wZW4gcGlwZTogJCFcbiI7CisJCSRwaWQgPSBmb3JrKCk7CisJCWRpZSAiRm9yazogJCFcbiIgdW5sZXNzIGRlZmluZWQgJHBpZDsKKwkJdW5sZXNzKCRwaWQpIHsKKwkJCSRwci0+d3JpdGVyKCk7CisJCQkkcHctPnJlYWRlcigpOworCQkJb3BlbihPVVQsIj4mU1RET1VUIik7CisJCQlkdXAyKCRwdy0+ZmlsZW5vKCksMCk7CisJCQlkdXAyKCRwci0+ZmlsZW5vKCksMSk7CisJCQkkcHItPmNsb3NlKCk7CisJCQkkcHctPmNsb3NlKCk7CisKKwkJCW15IEBwYXIgPSAoKTsKKworCQkJIyBsb29zZSBkZXRlY3Rpb24gb2YgbWVyZ2VzCisJCQkjIGJhc2VkIG9uIHRoZSBjb21taXQgbXNnCisJCQlmb3JlYWNoIG15ICRyeCAoQG1lcmdlcngpIHsKKwkJCQlpZiAoJG1lc3NhZ2UgPX4gJHJ4KSB7CisJCQkJCW15ICRtcGFyZW50ID0gJDE7CisJCQkJCWlmICgkbXBhcmVudCBlcSAnSEVBRCcpIHsgJG1wYXJlbnQgPSAkb3B0X28gfTsKKwkJCQkJaWYgKCAtZSAiJGdpdF9kaXIvcmVmcy9oZWFkcy8kbXBhcmVudCIpIHsKKwkJCQkJCSRtcGFyZW50ID0gZ2V0X2hlYWRyZWYoJG1wYXJlbnQsICRnaXRfZGlyKTsKKwkJCQkJCXB1c2ggKEBwYXJlbnRzLCAkbXBhcmVudCk7CisJCQkJCQlwcmludCBPVVQgIk1lcmdlIHBhcmVudCBicmFuY2g6ICRtcGFyZW50XG4iIGlmICRvcHRfdjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCW15ICVzZWVuX3BhcmVudHMgPSAoKTsKKwkJCW15IEB1bmlxdWVfcGFyZW50cyA9IGdyZXAgeyAhICRzZWVuX3BhcmVudHN7JF99ICsrIH0gQHBhcmVudHM7CisJCQlmb3JlYWNoIG15ICRicGFyZW50IChAdW5pcXVlX3BhcmVudHMpIHsKKwkJCQlwdXNoIEBwYXIsICctcCcsICRicGFyZW50OworCQkJCXByaW50IE9VVCAiTWVyZ2UgcGFyZW50IGJyYW5jaDogJGJwYXJlbnRcbiIgaWYgJG9wdF92OworCQkJfQorCisJCQlleGVjKCJlbnYiLAorCQkJCSJHSVRfQVVUSE9SX05BTUU9JGF1dGhvcl9uYW1lIiwKKwkJCQkiR0lUX0FVVEhPUl9FTUFJTD0kYXV0aG9yX2VtYWlsIiwKKwkJCQkiR0lUX0FVVEhPUl9EQVRFPSIuc3RyZnRpbWUoIiswMDAwICVZLSVtLSVkICVIOiVNOiVTIixnbXRpbWUoJGRhdGUpKSwKKwkJCQkiR0lUX0NPTU1JVFRFUl9OQU1FPSRjb21taXR0ZXJfbmFtZSIsCisJCQkJIkdJVF9DT01NSVRURVJfRU1BSUw9JGNvbW1pdHRlcl9lbWFpbCIsCisJCQkJIkdJVF9DT01NSVRURVJfREFURT0iLnN0cmZ0aW1lKCIrMDAwMCAlWS0lbS0lZCAlSDolTTolUyIsZ210aW1lKCRkYXRlKSksCisJCQkJImdpdC1jb21taXQtdHJlZSIsICR0cmVlLEBwYXIpOworCQkJZGllICJDYW5ub3QgZXhlYyBnaXQtY29tbWl0LXRyZWU6ICQhXG4iOworCQl9CisJCSRwdy0+d3JpdGVyKCk7CisJCSRwci0+cmVhZGVyKCk7CisKKwkJJG1lc3NhZ2UgPX4gcy9bXHNcbl0rXHovLzsKKwkJJG1lc3NhZ2UgPSAiciRyZXZpc2lvbjogJG1lc3NhZ2UiIGlmICRvcHRfcjsKKworCQlwcmludCAkcHcgIiRtZXNzYWdlXG4iCisJCQlvciBkaWUgIkVycm9yIHdyaXRpbmcgdG8gZ2l0LWNvbW1pdC10cmVlOiAkIVxuIjsKKwkJJHB3LT5jbG9zZSgpOworCisJCXByaW50ICJDb21taXR0ZWQgY2hhbmdlICRyZXZpc2lvbjokYnJhbmNoICIuc3RyZnRpbWUoIiVZLSVtLSVkICVIOiVNOiVTIixnbXRpbWUoJGRhdGUpKS4iKVxuIiBpZiAkb3B0X3Y7CisJCWNob21wKCRjaWQgPSA8JHByPik7CisJCWxlbmd0aCgkY2lkKSA9PSA0MAorCQkJb3IgZGllICJDYW5ub3QgZ2V0IGNvbW1pdCBpZCAoJGNpZCk6ICQhXG4iOworCQlwcmludCAiQ29tbWl0IElEICRjaWRcbiIgaWYgJG9wdF92OworCQkkcHItPmNsb3NlKCk7CisKKwkJd2FpdHBpZCgkcGlkLDApOworCQlkaWUgIkVycm9yIHJ1bm5pbmcgZ2l0LWNvbW1pdC10cmVlOiAkP1xuIiBpZiAkPzsKKwl9CisKKwlpZiAobm90IGRlZmluZWQgJGNpZCkgeworCQkkY2lkID0gJGJyYW5jaGVzeyIvIn17IkxBU1QifTsKKwl9CisKKwlpZihub3QgZGVmaW5lZCAkZGVzdCkgeworCQlwcmludCAiLi4uIG5vIGtub3duIHBhcmVudFxuIiBpZiAkb3B0X3Y7CisJfSBlbHNpZihub3QgJHRhZykgeworCQlwcmludCAiV3JpdGluZyB0byByZWZzL2hlYWRzLyRkZXN0XG4iIGlmICRvcHRfdjsKKwkJb3BlbihDLCI+JGdpdF9kaXIvcmVmcy9oZWFkcy8kZGVzdCIpIGFuZAorCQlwcmludCBDICgiJGNpZFxuIikgYW5kCisJCWNsb3NlKEMpCisJCQlvciBkaWUgIkNhbm5vdCB3cml0ZSBicmFuY2ggJGRlc3QgZm9yIHVwZGF0ZTogJCFcbiI7CisJfQorCisJaWYgKCR0YWcpIHsKKwkJJGxhc3RfcmV2ID0gIi0iIGlmICUkY2hhbmdlZF9wYXRoczsKKwkJIyB0aGUgdGFnIHdhcyAnY29tcGxleCcsIGkuZS4gZGlkIG5vdCByZWZlciB0byBhICJyZWFsIiByZXZpc2lvbgorCisJCSRkZXN0ID1+IHRyL18vXC4vIGlmICRvcHRfdTsKKworCQlzeXN0ZW0oJ2dpdC10YWcnLCAnLWYnLCAkZGVzdCwgJGNpZCkgPT0gMAorCQkJb3IgZGllICJDYW5ub3QgY3JlYXRlIHRhZyAkZGVzdDogJCFcbiI7CisKKwkJcHJpbnQgIkNyZWF0ZWQgdGFnICckZGVzdCcgb24gJyRicmFuY2gnXG4iIGlmICRvcHRfdjsKKwl9CisJJGJyYW5jaGVzeyRicmFuY2h9eyJMQVNUIn0gPSAkY2lkOworCSRicmFuY2hlc3skYnJhbmNofXskcmV2aXNpb259ID0gJGNpZDsKKwkkbGFzdF9yZXYgPSAkY2lkOworCXByaW50IEJSQU5DSEVTICIkcmV2aXNpb24gJGJyYW5jaCAkY2lkXG4iOworCXByaW50ICJET05FOiAkcmV2aXNpb24gJGRlc3QgJGNpZFxuIiBpZiAkb3B0X3Y7Cit9CisKK3N1YiBjb21taXRfYWxsIHsKKwkjIFJlY3Vyc2l2ZSB1c2Ugb2YgdGhlIFNWTiBjb25uZWN0aW9uIGRvZXMgbm90IHdvcmsKKwlsb2NhbCAkc3ZuID0gJHN2bjI7CisKKwlteSAoJGNoYW5nZWRfcGF0aHMsICRyZXZpc2lvbiwgJGF1dGhvciwgJGRhdGUsICRtZXNzYWdlKSA9IEBfOworCW15ICVwOworCXdoaWxlKG15KCRwYXRoLCRhY3Rpb24pID0gZWFjaCAlJGNoYW5nZWRfcGF0aHMpIHsKKwkJJHB7JHBhdGh9ID0gWyAkYWN0aW9uLT5hY3Rpb24sJGFjdGlvbi0+Y29weWZyb21fcGF0aCwgJGFjdGlvbi0+Y29weWZyb21fcmV2LCAkcGF0aCBdOworCX0KKwkkY2hhbmdlZF9wYXRocyA9IFwlcDsKKworCW15ICVkb25lOworCW15IEBjb2w7CisJbXkgJHByZWY7CisJbXkgJGJyYW5jaDsKKworCXdoaWxlKG15KCRwYXRoLCRhY3Rpb24pID0gZWFjaCAlJGNoYW5nZWRfcGF0aHMpIHsKKwkJKCRicmFuY2gsJHBhdGgpID0gc3BsaXRfcGF0aCgkcmV2aXNpb24sJHBhdGgpOworCQluZXh0IGlmIG5vdCBkZWZpbmVkICRicmFuY2g7CisJCW5leHQgaWYgbm90IGRlZmluZWQgJHBhdGg7CisJCSRkb25leyRicmFuY2h9eyRwYXRofSA9ICRhY3Rpb247CisJfQorCXdoaWxlKCgkYnJhbmNoLCRjaGFuZ2VkX3BhdGhzKSA9IGVhY2ggJWRvbmUpIHsKKwkJY29tbWl0KCRicmFuY2gsICRjaGFuZ2VkX3BhdGhzLCAkcmV2aXNpb24sICRhdXRob3IsICRkYXRlLCAkbWVzc2FnZSk7CisJfQorfQorCiskb3B0X2wgPSAkc3ZuLT57J21heHJldid9IGlmIG5vdCBkZWZpbmVkICRvcHRfbCBvciAkb3B0X2wgPiAkc3ZuLT57J21heHJldid9OworCitpZiAoJG9wdF9sIDwgJGN1cnJlbnRfcmV2KSB7CisgICAgcHJpbnQgIlVwIHRvIGRhdGU6IG5vIG5ldyByZXZpc2lvbnMgdG8gZmV0Y2ghXG4iIGlmICRvcHRfdjsKKyAgICB1bmxpbmsoIiRnaXRfZGlyL1NWTjJHSVRfSEVBRCIpOworICAgIGV4aXQ7Cit9CisKK3ByaW50ICJQcm9jZXNzaW5nIGZyb20gJGN1cnJlbnRfcmV2IHRvICRvcHRfbCAuLi5cbiIgaWYgJG9wdF92OworCitteSAkZnJvbV9yZXY7CitteSAkdG9fcmV2ID0gJGN1cnJlbnRfcmV2IC0gMTsKKworbXkgJHN1YnBvb2wgPSBTVk46OlBvb2w6Om5ld19kZWZhdWx0X3N1YjsKK3doaWxlICgkdG9fcmV2IDwgJG9wdF9sKSB7CisJJHN1YnBvb2wtPmNsZWFyOworCSRmcm9tX3JldiA9ICR0b19yZXYgKyAxOworCSR0b19yZXYgPSAkZnJvbV9yZXYgKyAkcmVwYWNrX2FmdGVyOworCSR0b19yZXYgPSAkb3B0X2wgaWYgJG9wdF9sIDwgJHRvX3JldjsKKwlwcmludCAiRmV0Y2hpbmcgZnJvbSAkZnJvbV9yZXYgdG8gJHRvX3JldiAuLi5cbiIgaWYgJG9wdF92OworCSRzdm4tPnsnc3ZuJ30tPmdldF9sb2coIi8iLCRmcm9tX3JldiwkdG9fcmV2LDAsMSwxLFwmY29tbWl0X2FsbCk7CisJbXkgJHBpZCA9IGZvcmsoKTsKKwlkaWUgIkZvcms6ICQhXG4iIHVubGVzcyBkZWZpbmVkICRwaWQ7CisJdW5sZXNzKCRwaWQpIHsKKwkJZXhlYygiZ2l0LXJlcGFjayIsICItZCIpCisJCQlvciBkaWUgIkNhbm5vdCByZXBhY2s6ICQhXG4iOworCX0KKwl3YWl0cGlkKCRwaWQsIDApOworfQorCisKK3VubGluaygkZ2l0X2luZGV4KTsKKworaWYgKGRlZmluZWQgJG9yaWdfZ2l0X2luZGV4KSB7CisJJEVOVntHSVRfSU5ERVhfRklMRX0gPSAkb3JpZ19naXRfaW5kZXg7Cit9IGVsc2UgeworCWRlbGV0ZSAkRU5We0dJVF9JTkRFWF9GSUxFfTsKK30KKworIyBOb3cgc3dpdGNoIGJhY2sgdG8gdGhlIGJyYW5jaCB3ZSB3ZXJlIGluIGJlZm9yZSBhbGwgb2YgdGhpcyBoYXBwZW5lZAoraWYoJG9yaWdfYnJhbmNoKSB7CisJcHJpbnQgIkRPTkVcbiIgaWYgJG9wdF92IGFuZCAobm90IGRlZmluZWQgJG9wdF9sIG9yICRvcHRfbCA+IDApOworCXN5c3RlbSgiY3AiLCIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRvcHRfbyIsIiRnaXRfZGlyL3JlZnMvaGVhZHMvbWFzdGVyIikKKwkJaWYgJGZvcndhcmRfbWFzdGVyOworCXVubGVzcyAoJG9wdF9pKSB7CisJCXN5c3RlbSgnZ2l0LXJlYWQtdHJlZScsICctbScsICctdScsICdTVk4yR0lUX0hFQUQnLCAnSEVBRCcpOworCQlkaWUgInJlYWQtdHJlZSBmYWlsZWQ6ICQ/XG4iIGlmICQ/OworCX0KK30gZWxzZSB7CisJJG9yaWdfYnJhbmNoID0gIm1hc3RlciI7CisJcHJpbnQgIkRPTkU7IGNyZWF0aW5nICRvcmlnX2JyYW5jaCBicmFuY2hcbiIgaWYgJG9wdF92IGFuZCAobm90IGRlZmluZWQgJG9wdF9sIG9yICRvcHRfbCA+IDApOworCXN5c3RlbSgiY3AiLCIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRvcHRfbyIsIiRnaXRfZGlyL3JlZnMvaGVhZHMvbWFzdGVyIikKKwkJdW5sZXNzIC1mICIkZ2l0X2Rpci9yZWZzL2hlYWRzL21hc3RlciI7CisJc3lzdGVtKCdnaXQtdXBkYXRlLXJlZicsICdIRUFEJywgIiRvcmlnX2JyYW5jaCIpOworCXVubGVzcyAoJG9wdF9pKSB7CisJCXN5c3RlbSgnZ2l0IGNoZWNrb3V0Jyk7CisJCWRpZSAiY2hlY2tvdXQgZmFpbGVkOiAkP1xuIiBpZiAkPzsKKwl9Cit9Cit1bmxpbmsoIiRnaXRfZGlyL1NWTjJHSVRfSEVBRCIpOworY2xvc2UoQlJBTkNIRVMpOwpkaWZmIC0tZ2l0IGEvY29udHJpYi9leGFtcGxlcy9naXQtc3ZuaW1wb3J0LnR4dCBiL2NvbnRyaWIvZXhhbXBsZXMvZ2l0LXN2bmltcG9ydC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhYWQ4YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZXhhbXBsZXMvZ2l0LXN2bmltcG9ydC50eHQKQEAgLTAsMCArMSwxNzkgQEAKK2dpdC1zdm5pbXBvcnQoMSkKKz09PT09PT09PT09PT09PT0KK3YwLjEsIEp1bHkgMjAwNQorCitOQU1FCistLS0tCitnaXQtc3ZuaW1wb3J0IC0gSW1wb3J0IGEgU1ZOIHJlcG9zaXRvcnkgaW50byBnaXQKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtc3ZuaW1wb3J0JyBbIC1vIDxicmFuY2gtZm9yLUhFQUQ+IF0gWyAtaCBdIFsgLXYgXSBbIC1kIHwgLUQgXQorCQlbIC1DIDxHSVRfcmVwb3NpdG9yeT4gXSBbIC1pIF0gWyAtdSBdIFstbCBsaW1pdF9yZXZdCisJCVsgLWIgYnJhbmNoX3N1YmRpciBdIFsgLVQgdHJ1bmtfc3ViZGlyIF0gWyAtdCB0YWdfc3ViZGlyIF0KKwkJWyAtcyBzdGFydF9jaGcgXSBbIC1tIF0gWyAtciBdIFsgLU0gcmVnZXggXQorCQlbIC1JIDxpZ25vcmVmaWxlX25hbWU+IF0gWyAtQSA8YXV0aG9yX2ZpbGU+IF0KKwkJWyAtUiA8cmVwYWNrX2VhY2hfcmV2cz5dIFsgLVAgPHBhdGhfZnJvbV90cnVuaz4gXQorCQk8U1ZOX3JlcG9zaXRvcnlfVVJMPiBbIDxwYXRoPiBdCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitJbXBvcnRzIGEgU1ZOIHJlcG9zaXRvcnkgaW50byBnaXQuIEl0IHdpbGwgZWl0aGVyIGNyZWF0ZSBhIG5ldworcmVwb3NpdG9yeSwgb3IgaW5jcmVtZW50YWxseSBpbXBvcnQgaW50byBhbiBleGlzdGluZyBvbmUuCisKK1NWTiBhY2Nlc3MgaXMgZG9uZSBieSB0aGUgU1ZOOjpQZXJsIG1vZHVsZS4KKworZ2l0LXN2bmltcG9ydCBhc3N1bWVzIHRoYXQgU1ZOIHJlcG9zaXRvcmllcyBhcmUgb3JnYW5pemVkIGludG8gb25lCisidHJ1bmsiIGRpcmVjdG9yeSB3aGVyZSB0aGUgbWFpbiBkZXZlbG9wbWVudCBoYXBwZW5zLCAiYnJhbmNoZXMvRk9PIgorZGlyZWN0b3JpZXMgZm9yIGJyYW5jaGVzLCBhbmQgIi90YWdzL0ZPTyIgZGlyZWN0b3JpZXMgZm9yIHRhZ3MuCitPdGhlciBzdWJkaXJlY3RvcmllcyBhcmUgaWdub3JlZC4KKworZ2l0LXN2bmltcG9ydCBjcmVhdGVzIGEgZmlsZSAiLmdpdC9zdm4yZ2l0Iiwgd2hpY2ggaXMgcmVxdWlyZWQgZm9yCitpbmNyZW1lbnRhbCBTVk4gaW1wb3J0cy4KKworT1BUSU9OUworLS0tLS0tLQorLUMgPHRhcmdldC1kaXI+OjoKKyAgICAgICAgVGhlIEdJVCByZXBvc2l0b3J5IHRvIGltcG9ydCB0by4gIElmIHRoZSBkaXJlY3RvcnkgZG9lc24ndAorICAgICAgICBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkLiAgRGVmYXVsdCBpcyB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisKKy1zIDxzdGFydF9yZXY+OjoKKyAgICAgICAgU3RhcnQgaW1wb3J0aW5nIGF0IHRoaXMgU1ZOIGNoYW5nZSBudW1iZXIuIFRoZSAgZGVmYXVsdCBpcyAxLgorKworV2hlbiBpbXBvcnRpbmcgaW5jcmVtZW50YWxseSwgeW91IG1pZ2h0IG5lZWQgdG8gZWRpdCB0aGUgLmdpdC9zdm4yZ2l0IGZpbGUuCisKKy1pOjoKKwlJbXBvcnQtb25seTogZG9uJ3QgcGVyZm9ybSBhIGNoZWNrb3V0IGFmdGVyIGltcG9ydGluZy4gIFRoaXMgb3B0aW9uCisJZW5zdXJlcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGluZGV4IHJlbWFpbiB1bnRvdWNoZWQgYW5kIHdpbGwKKwlub3QgY3JlYXRlIHRoZW0gaWYgdGhleSBkbyBub3QgZXhpc3QuCisKKy1UIDx0cnVua19zdWJkaXI+OjoKKwlOYW1lIHRoZSBTVk4gdHJ1bmsuIERlZmF1bHQgInRydW5rIi4KKworLXQgPHRhZ19zdWJkaXI+OjoKKwlOYW1lIHRoZSBTVk4gc3ViZGlyZWN0b3J5IGZvciB0YWdzLiBEZWZhdWx0ICJ0YWdzIi4KKworLWIgPGJyYW5jaF9zdWJkaXI+OjoKKwlOYW1lIHRoZSBTVk4gc3ViZGlyZWN0b3J5IGZvciBicmFuY2hlcy4gRGVmYXVsdCAiYnJhbmNoZXMiLgorCistbyA8YnJhbmNoLWZvci1IRUFEPjo6CisJVGhlICd0cnVuaycgYnJhbmNoIGZyb20gU1ZOIGlzIGltcG9ydGVkIHRvIHRoZSAnb3JpZ2luJyBicmFuY2ggd2l0aGluCisJdGhlIGdpdCByZXBvc2l0b3J5LiBVc2UgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gaW1wb3J0IGludG8gYQorCWRpZmZlcmVudCBicmFuY2guCisKKy1yOjoKKwlQcmVwZW5kICdyWDogJyB0byBjb21taXQgbWVzc2FnZXMsIHdoZXJlIFggaXMgdGhlIGltcG9ydGVkCisJc3VidmVyc2lvbiByZXZpc2lvbi4KKworLXU6OgorCVJlcGxhY2UgdW5kZXJzY29yZXMgaW4gdGFnIG5hbWVzIHdpdGggcGVyaW9kcy4KKworLUkgPGlnbm9yZWZpbGVfbmFtZT46OgorCUltcG9ydCB0aGUgc3ZuOmlnbm9yZSBkaXJlY3RvcnkgcHJvcGVydHkgdG8gZmlsZXMgd2l0aCB0aGlzCisJbmFtZSBpbiBlYWNoIGRpcmVjdG9yeS4gKFRoZSBTdWJ2ZXJzaW9uIGFuZCBHSVQgaWdub3JlCisJc3ludGF4ZXMgYXJlIHNpbWlsYXIgZW5vdWdoIHRoYXQgdXNpbmcgdGhlIFN1YnZlcnNpb24gcGF0dGVybnMKKwlkaXJlY3RseSB3aXRoICItSSAuZ2l0aWdub3JlIiB3aWxsIGFsbW9zdCBhbHdheXMganVzdCB3b3JrLikKKworLUEgPGF1dGhvcl9maWxlPjo6CisJUmVhZCBhIGZpbGUgd2l0aCBsaW5lcyBvbiB0aGUgZm9ybQorKworLS0tLS0tCisJdXNlcm5hbWUgPSBVc2VyJ3MgRnVsbCBOYW1lIDxlbWFpbEBhZGRyLmVzPgorCistLS0tLS0KKysKK2FuZCB1c2UgIlVzZXIncyBGdWxsIE5hbWUgPGVtYWlsQGFkZHIuZXM+IiBhcyB0aGUgR0lUCithdXRob3IgYW5kIGNvbW1pdHRlciBmb3IgU3VidmVyc2lvbiBjb21taXRzIG1hZGUgYnkKKyJ1c2VybmFtZSIuIElmIGVuY291bnRlcmluZyBhIGNvbW1pdCBtYWRlIGJ5IGEgdXNlciBub3QgaW4gdGhlCitsaXN0LCBhYm9ydC4KKysKK0ZvciBjb252ZW5pZW5jZSwgdGhpcyBkYXRhIGlzIHNhdmVkIHRvICRHSVRfRElSL3N2bi1hdXRob3JzCitlYWNoIHRpbWUgdGhlIC1BIG9wdGlvbiBpcyBwcm92aWRlZCwgYW5kIHJlYWQgZnJvbSB0aGF0IHNhbWUKK2ZpbGUgZWFjaCB0aW1lIGdpdC1zdm5pbXBvcnQgaXMgcnVuIHdpdGggYW4gZXhpc3RpbmcgR0lUCityZXBvc2l0b3J5IHdpdGhvdXQgLUEuCisKKy1tOjoKKwlBdHRlbXB0IHRvIGRldGVjdCBtZXJnZXMgYmFzZWQgb24gdGhlIGNvbW1pdCBtZXNzYWdlLiBUaGlzIG9wdGlvbgorCXdpbGwgZW5hYmxlIGRlZmF1bHQgcmVnZXhlcyB0aGF0IHRyeSB0byBjYXB0dXJlIHRoZSBuYW1lIHNvdXJjZQorCWJyYW5jaCBuYW1lIGZyb20gdGhlIGNvbW1pdCBtZXNzYWdlLgorCistTSA8cmVnZXg+OjoKKwlBdHRlbXB0IHRvIGRldGVjdCBtZXJnZXMgYmFzZWQgb24gdGhlIGNvbW1pdCBtZXNzYWdlIHdpdGggYSBjdXN0b20KKwlyZWdleC4gSXQgY2FuIGJlIHVzZWQgd2l0aCAtbSB0byBhbHNvIHNlZSB0aGUgZGVmYXVsdCByZWdleGVzLgorCVlvdSBtdXN0IGVzY2FwZSBmb3J3YXJkIHNsYXNoZXMuCisKKy1sIDxtYXhfcmV2Pjo6CisJU3BlY2lmeSBhIG1heGltdW0gcmV2aXNpb24gbnVtYmVyIHRvIHB1bGwuCisrCitGb3JtZXJseSwgdGhpcyBvcHRpb24gY29udHJvbGxlZCBob3cgbWFueSByZXZpc2lvbnMgdG8gcHVsbCwKK2R1ZSB0byBTVk4gbWVtb3J5IGxlYWtzLiAoVGhlc2UgaGF2ZSBiZWVuIHdvcmtlZCBhcm91bmQuKQorCistUiA8cmVwYWNrX2VhY2hfcmV2cz46OgorCVNwZWNpZnkgaG93IG9mdGVuIGdpdCByZXBvc2l0b3J5IHNob3VsZCBiZSByZXBhY2tlZC4KKysKK1RoZSBkZWZhdWx0IHZhbHVlIGlzIDEwMDAuIGdpdC1zdm5pbXBvcnQgd2lsbCBkbyBpbXBvcnQgaW4gY2h1bmtzIG9mIDEwMDAKK3JldmlzaW9ucywgYWZ0ZXIgZWFjaCBjaHVuayBnaXQgcmVwb3NpdG9yeSB3aWxsIGJlIHJlcGFja2VkLiBUbyBkaXNhYmxlCit0aGlzIGJlaGF2aW9yIHNwZWNpZnkgc29tZSBiaWcgdmFsdWUgaGVyZSB3aGljaCBpcyBtb3RlIHRoYW4gbnVtYmVyIG9mCityZXZpc2lvbnMgdG8gaW1wb3J0LgorCistUCA8cGF0aF9mcm9tX3RydW5rPjo6CisJUGFydGlhbCBpbXBvcnQgb2YgdGhlIFNWTiB0cmVlLgorKworQnkgZGVmYXVsdCwgdGhlIHdob2xlIHRyZWUgb24gdGhlIFNWTiB0cnVuayAoL3RydW5rKSBpcyBpbXBvcnRlZC4KKyctUCBteS9wcm9qJyB3aWxsIGltcG9ydCBzdGFydGluZyBvbmx5IGZyb20gJy90cnVuay9teS9wcm9qJy4KK1RoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIGltcG9ydCBvbmUgcHJvamVjdCBmcm9tIGEKK3N2biByZXBvIHdoaWNoIGhvc3RzIG11bHRpcGxlIHByb2plY3RzIHVuZGVyIHRoZSBzYW1lIHRydW5rLgorCistdjo6CisJVmVyYm9zaXR5OiBsZXQgJ3N2bmltcG9ydCcgcmVwb3J0IHdoYXQgaXQgaXMgZG9pbmcuCisKKy1kOjoKKwlVc2UgZGlyZWN0IEhUVFAgcmVxdWVzdHMgaWYgcG9zc2libGUuIFRoZSAiPHBhdGg+IiBhcmd1bWVudCBpcyB1c2VkCisJb25seSBmb3IgcmV0cmlldmluZyB0aGUgU1ZOIGxvZ3M7IHRoZSBwYXRoIHRvIHRoZSBjb250ZW50cyBpcworCWluY2x1ZGVkIGluIHRoZSBTVk4gbG9nLgorCistRDo6CisJVXNlIGRpcmVjdCBIVFRQIHJlcXVlc3RzIGlmIHBvc3NpYmxlLiBUaGUgIjxwYXRoPiIgYXJndW1lbnQgaXMgdXNlZAorCWZvciByZXRyaWV2aW5nIHRoZSBsb2dzLCBhcyB3ZWxsIGFzIGZvciB0aGUgY29udGVudHMuCisrCitUaGVyZSdzIG5vIHNhZmUgd2F5IHRvIGF1dG9tYXRpY2FsbHkgZmluZCBvdXQgd2hpY2ggb2YgdGhlc2Ugb3B0aW9ucyB0bwordXNlLCBzbyB5b3UgbmVlZCB0byB0cnkgYm90aC4gVXN1YWxseSwgdGhlIG9uZSB0aGF0J3Mgd3Jvbmcgd2lsbCBkaWUKK3dpdGggYSA0MHggZXJyb3IgcHJldHR5IHF1aWNrbHkuCisKKzxTVk5fcmVwb3NpdG9yeV9VUkw+OjoKKwlUaGUgVVJMIG9mIHRoZSBTVk4gbW9kdWxlIHlvdSB3YW50IHRvIGltcG9ydC4gRm9yIGxvY2FsCisJcmVwb3NpdG9yaWVzLCB1c2UgImZpbGU6Ly8vYWJzb2x1dGUvcGF0aCIuCisrCitJZiB5b3UncmUgdXNpbmcgdGhlICItZCIgb3IgIi1EIiBvcHRpb24sIHRoaXMgaXMgdGhlIFVSTCBvZiB0aGUgU1ZOCityZXBvc2l0b3J5IGl0c2VsZjsgaXQgdXN1YWxseSBlbmRzIGluICIvc3ZuIi4KKworPHBhdGg+OjoKKwlUaGUgcGF0aCB0byB0aGUgbW9kdWxlIHlvdSB3YW50IHRvIGNoZWNrIG91dC4KKworLWg6OgorCVByaW50IGEgc2hvcnQgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KKworT1VUUFVUCistLS0tLS0KK0lmICctdicgaXMgc3BlY2lmaWVkLCB0aGUgc2NyaXB0IHJlcG9ydHMgd2hhdCBpdCBpcyBkb2luZy4KKworT3RoZXJ3aXNlLCBzdWNjZXNzIGlzIGluZGljYXRlZCB0aGUgVW5peCB3YXksIGkuZS4gYnkgc2ltcGx5IGV4aXRpbmcgd2l0aAorYSB6ZXJvIGV4aXQgc3RhdHVzLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBNYXR0aGlhcyBVcmxpY2hzIDxzbXVyZkBzbXVyZi5ub3Jpcy5kZT4sIHdpdGggaGVscCBmcm9tCit2YXJpb3VzIHBhcnRpY2lwYW50cyBvZiB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitCYXNlZCBvbiBhIGN2czJnaXQgc2NyaXB0IGJ5IHRoZSBzYW1lIGF1dGhvci4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgTWF0dGhpYXMgVXJsaWNocyA8c211cmZAc211cmYubm9yaXMuZGU+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZXhhbXBsZXMvZ2l0LXRhZy5zaCBiL2NvbnRyaWIvZXhhbXBsZXMvZ2l0LXRhZy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lOWYzYTIyCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9leGFtcGxlcy9naXQtdGFnLnNoCkBAIC0wLDAgKzEsMjA1IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChjKSAyMDA1IExpbnVzIFRvcnZhbGRzCisKK1VTQUdFPSdbLW4gWzxudW0+XV0gLWwgWzxwYXR0ZXJuPl0gfCBbLWEgfCAtcyB8IC11IDxrZXktaWQ+XSBbLWYgfCAtZCB8IC12XSBbLW0gPG1zZz5dIDx0YWduYW1lPiBbPGhlYWQ+XScKK1NVQkRJUkVDVE9SWV9PSz0nWWVzJworLiBnaXQtc2gtc2V0dXAKKworbWVzc2FnZV9naXZlbj0KK2Fubm90YXRlPQorc2lnbmVkPQorZm9yY2U9CittZXNzYWdlPQordXNlcm5hbWU9CitsaXN0PQordmVyaWZ5PQorTElORVM9MAord2hpbGUgdGVzdCAkIyAhPSAwCitkbworICAgIGNhc2UgIiQxIiBpbgorICAgIC1hKQorCWFubm90YXRlPTEKKwlzaGlmdAorCTs7CisgICAgLXMpCisJYW5ub3RhdGU9MQorCXNpZ25lZD0xCisJc2hpZnQKKwk7OworICAgIC1mKQorCWZvcmNlPTEKKwlzaGlmdAorCTs7CisgICAgLW4pCisgICAgICAgIGNhc2UgIiQjLCQyIiBpbgorCTEsKiB8ICosLSopCisJCUxJTkVTPTEgCSMgbm8gYXJndW1lbnQKKwkJOzsKKwkqKQlzaGlmdAorCQlMSU5FUz0kKGV4cHIgIiQxIiA6ICdcKFswLTldKlwpJykKKwkJWyAteiAiJExJTkVTIiBdICYmIExJTkVTPTEgIyAxIGxpbmUgaXMgZGVmYXVsdCB3aGVuIC1uIGlzIHVzZWQKKwkJOzsKKwllc2FjCisJc2hpZnQKKwk7OworICAgIC1sKQorCWxpc3Q9MQorCXNoaWZ0CisJY2FzZSAkIyBpbgorCTApCVBBVFRFUk49CisJCTs7CisJKikKKwkJUEFUVEVSTj0iJDEiCSMgc2VsZWN0IHRhZ3MgYnkgc2hlbGwgcGF0dGVybiwgbm90IHJlCisJCXNoaWZ0CisJCTs7CisJZXNhYworCWdpdCByZXYtcGFyc2UgLS1zeW1ib2xpYyAtLXRhZ3MgfCBzb3J0IHwKKwkgICAgd2hpbGUgcmVhZCBUQUcKKwkgICAgZG8KKwkgICAgICAgIGNhc2UgIiRUQUciIGluCisJCSokUEFUVEVSTiopIDs7CisJCSopCSAgICBjb250aW51ZSA7OworCQllc2FjCisJCVsgIiRMSU5FUyIgLWxlIDAgXSAmJiB7IGVjaG8gIiRUQUciOyBjb250aW51ZSA7fQorCQlPQkpUWVBFPSQoZ2l0IGNhdC1maWxlIC10ICIkVEFHIikKKwkJY2FzZSAkT0JKVFlQRSBpbgorCQl0YWcpCisJCQlBTk5PVEFUSU9OPSQoZ2l0IGNhdC1maWxlIHRhZyAiJFRBRyIgfAorCQkJCXNlZCAtZSAnMSwvXiQvZCcgfAorCQkJCXNlZCAtbiAtZSAiCisJCQkJCS9eLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS1cJC9xCisJCQkJCTIsXCRzL14vICAgIC8KKwkJCQkJcAorCQkJCQkke0xJTkVTfXEKKwkJCQkiKQorCQkJcHJpbnRmICIlLTE1cyAlc1xuIiAiJFRBRyIgIiRBTk5PVEFUSU9OIgorCQkJOzsKKwkJKikgICAgICBlY2hvICIkVEFHIgorCQkJOzsKKwkJZXNhYworCSAgICBkb25lCisJOzsKKyAgICAtbSkKKwlhbm5vdGF0ZT0xCisJc2hpZnQKKwltZXNzYWdlPSIkMSIKKwlpZiB0ZXN0ICIkIyIgPSAiMCI7IHRoZW4KKwkgICAgZGllICJlcnJvcjogb3B0aW9uIC1tIG5lZWRzIGFuIGFyZ3VtZW50IgorCWVsc2UKKwkgICAgbWVzc2FnZT0iJDEiCisJICAgIG1lc3NhZ2VfZ2l2ZW49MQorCSAgICBzaGlmdAorCWZpCisJOzsKKyAgICAtRikKKwlhbm5vdGF0ZT0xCisJc2hpZnQKKwlpZiB0ZXN0ICIkIyIgPSAiMCI7IHRoZW4KKwkgICAgZGllICJlcnJvcjogb3B0aW9uIC1GIG5lZWRzIGFuIGFyZ3VtZW50IgorCWVsc2UKKwkgICAgbWVzc2FnZT0iJChjYXQgIiQxIikiCisJICAgIG1lc3NhZ2VfZ2l2ZW49MQorCSAgICBzaGlmdAorCWZpCisJOzsKKyAgICAtdSkKKwlhbm5vdGF0ZT0xCisJc2lnbmVkPTEKKwlzaGlmdAorCWlmIHRlc3QgIiQjIiA9ICIwIjsgdGhlbgorCSAgICBkaWUgImVycm9yOiBvcHRpb24gLXUgbmVlZHMgYW4gYXJndW1lbnQiCisJZWxzZQorCSAgICB1c2VybmFtZT0iJDEiCisJICAgIHNoaWZ0CisJZmkKKwk7OworICAgIC1kKQorCXNoaWZ0CisJaGFkX2Vycm9yPTAKKwlmb3IgdGFnCisJZG8KKwkJY3VyPSQoZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IC0taGFzaCAtLSAicmVmcy90YWdzLyR0YWciKSB8fCB7CisJCQllY2hvID4mMiAiU2VyaW91c2x5LCB3aGF0IHRhZyBhcmUgeW91IHRhbGtpbmcgYWJvdXQ/IgorCQkJaGFkX2Vycm9yPTEKKwkJCWNvbnRpbnVlCisJCX0KKwkJZ2l0IHVwZGF0ZS1yZWYgLW0gJ3RhZzogZGVsZXRlJyAtZCAicmVmcy90YWdzLyR0YWciICIkY3VyIiB8fCB7CisJCQloYWRfZXJyb3I9MQorCQkJY29udGludWUKKwkJfQorCQllY2hvICJEZWxldGVkIHRhZyAkdGFnLiIKKwlkb25lCisJZXhpdCAkaGFkX2Vycm9yCisJOzsKKyAgICAtdikKKwlzaGlmdAorCXRhZ19uYW1lPSIkMSIKKwl0YWc9JChnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1oYXNoIC0tICJyZWZzL3RhZ3MvJHRhZ19uYW1lIikgfHwKKwkJZGllICJTZXJpb3VzbHksIHdoYXQgdGFnIGFyZSB5b3UgdGFsa2luZyBhYm91dD8iCisJZ2l0LXZlcmlmeS10YWcgLXYgIiR0YWciCisJZXhpdCAkPworCTs7CisgICAgLSopCisgICAgICAgIHVzYWdlCisJOzsKKyAgICAqKQorCWJyZWFrCisJOzsKKyAgICBlc2FjCitkb25lCisKK1sgLW4gIiRsaXN0IiBdICYmIGV4aXQgMAorCituYW1lPSIkMSIKK1sgIiRuYW1lIiBdIHx8IHVzYWdlCitwcmV2PTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2lmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0IC0tICJyZWZzL3RhZ3MvJG5hbWUiCit0aGVuCisgICAgdGVzdCAtbiAiJGZvcmNlIiB8fCBkaWUgInRhZyAnJG5hbWUnIGFscmVhZHkgZXhpc3RzIgorICAgIHByZXY9YGdpdCByZXYtcGFyc2UgInJlZnMvdGFncy8kbmFtZSJgCitmaQorc2hpZnQKK2dpdCBjaGVjay1yZWYtZm9ybWF0ICJ0YWdzLyRuYW1lIiB8fAorCWRpZSAid2UgZG8gbm90IGxpa2UgJyRuYW1lJyBhcyBhIHRhZyBuYW1lLiIKKworb2JqZWN0PSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAtLWRlZmF1bHQgSEVBRCAiJEAiKSB8fCBleGl0IDEKK3R5cGU9JChnaXQgY2F0LWZpbGUgLXQgJG9iamVjdCkgfHwgZXhpdCAxCit0YWdnZXI9JChnaXQtdmFyIEdJVF9DT01NSVRURVJfSURFTlQpIHx8IGV4aXQgMQorCit0ZXN0IC1uICIkdXNlcm5hbWUiIHx8CisJdXNlcm5hbWU9JChnaXQgY29uZmlnIHVzZXIuc2lnbmluZ2tleSkgfHwKKwl1c2VybmFtZT0kKGV4cHIgInokdGFnZ2VyIiA6ICd6XCguKj5cKScpCisKK3RyYXAgJ3JtIC1mICIkR0lUX0RJUiIvVEFHX1RNUCogIiRHSVRfRElSIi9UQUdfRklOQUxNU0cgIiRHSVRfRElSIi9UQUdfRURJVE1TRycgMAorCitpZiBbICIkYW5ub3RhdGUiIF07IHRoZW4KKyAgICBpZiBbIC16ICIkbWVzc2FnZV9naXZlbiIgXTsgdGhlbgorICAgICAgICAoIGVjaG8gIiMiCisgICAgICAgICAgZWNobyAiIyBXcml0ZSBhIHRhZyBtZXNzYWdlIgorICAgICAgICAgIGVjaG8gIiMiICkgPiAiJEdJVF9ESVIiL1RBR19FRElUTVNHCisgICAgICAgIGdpdF9lZGl0b3IgIiRHSVRfRElSIi9UQUdfRURJVE1TRyB8fCBleGl0CisgICAgZWxzZQorICAgICAgICBwcmludGYgJyVzXG4nICIkbWVzc2FnZSIgPiIkR0lUX0RJUiIvVEFHX0VESVRNU0cKKyAgICBmaQorCisgICAgZ3JlcCAtdiAnXiMnIDwiJEdJVF9ESVIiL1RBR19FRElUTVNHIHwKKyAgICBnaXQgc3RyaXBzcGFjZSA+IiRHSVRfRElSIi9UQUdfRklOQUxNU0cKKworICAgIFsgLXMgIiRHSVRfRElSIi9UQUdfRklOQUxNU0cgLW8gLW4gIiRtZXNzYWdlX2dpdmVuIiBdIHx8IHsKKwllY2hvID4mMiAiTm8gdGFnIG1lc3NhZ2U/IgorCWV4aXQgMQorICAgIH0KKworICAgICggcHJpbnRmICdvYmplY3QgJXNcbnR5cGUgJXNcbnRhZyAlc1xudGFnZ2VyICVzXG5cbicgXAorCSIkb2JqZWN0IiAiJHR5cGUiICIkbmFtZSIgIiR0YWdnZXIiOworICAgICAgY2F0ICIkR0lUX0RJUiIvVEFHX0ZJTkFMTVNHICkgPiIkR0lUX0RJUiIvVEFHX1RNUAorICAgIHJtIC1mICIkR0lUX0RJUiIvVEFHX1RNUC5hc2MgIiRHSVRfRElSIi9UQUdfRklOQUxNU0cKKyAgICBpZiBbICIkc2lnbmVkIiBdOyB0aGVuCisJZ3BnIC1ic2EgLXUgIiR1c2VybmFtZSIgIiRHSVRfRElSIi9UQUdfVE1QICYmCisJY2F0ICIkR0lUX0RJUiIvVEFHX1RNUC5hc2MgPj4iJEdJVF9ESVIiL1RBR19UTVAgfHwKKwlkaWUgImZhaWxlZCB0byBzaWduIHRoZSB0YWcgd2l0aCBHUEcuIgorICAgIGZpCisgICAgb2JqZWN0PSQoZ2l0LW1rdGFnIDwgIiRHSVRfRElSIi9UQUdfVE1QKQorZmkKKworZ2l0IHVwZGF0ZS1yZWYgInJlZnMvdGFncy8kbmFtZSIgIiRvYmplY3QiICIkcHJldiIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZXhhbXBsZXMvZ2l0LXZlcmlmeS10YWcuc2ggYi9jb250cmliL2V4YW1wbGVzL2dpdC12ZXJpZnktdGFnLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA5MDJhNWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2V4YW1wbGVzL2dpdC12ZXJpZnktdGFnLnNoCkBAIC0wLDAgKzEsNDUgQEAKKyMhL2Jpbi9zaAorCitVU0FHRT0nPHRhZz4nCitTVUJESVJFQ1RPUllfT0s9J1llcycKKy4gZ2l0LXNoLXNldHVwCisKK3ZlcmJvc2U9Cit3aGlsZSB0ZXN0ICQjICE9IDAKK2RvCisJY2FzZSAiJDEiIGluCisJLXZ8LS12fC0tdmV8LS12ZXJ8LS12ZXJifC0tdmVyYm98LS12ZXJib3N8LS12ZXJib3NlKQorCQl2ZXJib3NlPXQgOzsKKwkqKQorCQlicmVhayA7OworCWVzYWMKKwlzaGlmdAorZG9uZQorCitpZiBbICIkIyIgIT0gIjEiIF0KK3RoZW4KKwl1c2FnZQorZmkKKwordHlwZT0iJChnaXQgY2F0LWZpbGUgLXQgIiQxIiAyPi9kZXYvbnVsbCkiIHx8CisJZGllICIkMTogbm8gc3VjaCBvYmplY3QuIgorCit0ZXN0ICIkdHlwZSIgPSB0YWcgfHwKKwlkaWUgIiQxOiBjYW5ub3QgdmVyaWZ5IGEgbm9uLXRhZyBvYmplY3Qgb2YgdHlwZSAkdHlwZS4iCisKK2Nhc2UgIiR2ZXJib3NlIiBpbgordCkKKwlnaXQgY2F0LWZpbGUgLXAgIiQxIiB8CisJc2VkIC1uIC1lICcvXi0tLS0tQkVHSU4gUEdQIFNJR05BVFVSRS0tLS0tL3EnIC1lIHAKKwk7OworZXNhYworCit0cmFwICdybSAtZiAiJEdJVF9ESVIvLnRtcC12dGFnIicgMAorCitnaXQgY2F0LWZpbGUgdGFnICIkMSIgPiIkR0lUX0RJUi8udG1wLXZ0YWciIHx8IGV4aXQgMQorc2VkIC1uIC1lICcKKwkvXi0tLS0tQkVHSU4gUEdQIFNJR05BVFVSRS0tLS0tJC9xCisJcAorJyA8IiRHSVRfRElSLy50bXAtdnRhZyIgfAorZ3BnIC0tdmVyaWZ5ICIkR0lUX0RJUi8udG1wLXZ0YWciIC0gfHwgZXhpdCAxCitybSAtZiAiJEdJVF9ESVIvLnRtcC12dGFnIgpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYXN0LWltcG9ydC9naXQtaW1wb3J0LnBlcmwgYi9jb250cmliL2Zhc3QtaW1wb3J0L2dpdC1pbXBvcnQucGVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mOWZlZjZkCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9mYXN0LWltcG9ydC9naXQtaW1wb3J0LnBlcmwKQEAgLTAsMCArMSw2NCBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjIFBlcmZvcm1zIGFuIGluaXRpYWwgaW1wb3J0IG9mIGEgZGlyZWN0b3J5LiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50CisjIG9mIGRvaW5nICdnaXQgaW5pdDsgZ2l0IGFkZCAuOyBnaXQgY29tbWl0Jy4gSXQncyBhIGxpdHRsZSBzbG93ZXIsCisjIGJ1dCBpcyBtZWFudCB0byBiZSBhIHNpbXBsZSBmYXN0LWltcG9ydCBleGFtcGxlLgorCit1c2Ugc3RyaWN0OwordXNlIEZpbGU6OkZpbmQ7CisKK215ICRVU0FHRSA9ICdVc2FnZTogZ2l0LWltcG9ydCBicmFuY2ggaW1wb3J0LW1lc3NhZ2UnOworbXkgJGJyYW5jaCA9IHNoaWZ0IG9yIGRpZSAiJFVTQUdFXG4iOworbXkgJG1lc3NhZ2UgPSBzaGlmdCBvciBkaWUgIiRVU0FHRVxuIjsKKworY2hvbXAobXkgJHVzZXJuYW1lID0gYGdpdCBjb25maWcgdXNlci5uYW1lYCk7CitjaG9tcChteSAkZW1haWwgPSBgZ2l0IGNvbmZpZyB1c2VyLmVtYWlsYCk7CitkaWUgJ1lvdSBuZWVkIHRvIHNldCB1c2VyIG5hbWUgYW5kIGVtYWlsJworICB1bmxlc3MgJHVzZXJuYW1lICYmICRlbWFpbDsKKworc3lzdGVtKCdnaXQgaW5pdCcpOworb3BlbihteSAkZmksICd8LScsIHF3KGdpdCBmYXN0LWltcG9ydCAtLWRhdGUtZm9ybWF0PW5vdykpCisgIG9yIGRpZSAidW5hYmxlIHRvIHNwYXduIGZhc3QtaW1wb3J0OiAkISI7CisKK3ByaW50ICRmaSA8PEVPRjsKK2NvbW1pdCByZWZzL2hlYWRzLyRicmFuY2gKK2NvbW1pdHRlciAkdXNlcm5hbWUgPCRlbWFpbD4gbm93CitkYXRhIDw8TVNHRU9GCiskbWVzc2FnZQorTVNHRU9GCisKK0VPRgorCitmaW5kKAorICBzdWIgeworICAgIGlmKCRGaWxlOjpGaW5kOjpuYW1lIGVxICcuLy5naXQnKSB7CisgICAgICAkRmlsZTo6RmluZDo6cHJ1bmUgPSAxOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICByZXR1cm4gdW5sZXNzIC1mICRfOworCisgICAgbXkgJGZuID0gJEZpbGU6OkZpbmQ6Om5hbWU7CisgICAgJGZuID1+IHMjXi5cLyMjOworCisgICAgb3BlbihteSAkaW4sICc8JywgJF8pCisgICAgICBvciBkaWUgInVuYWJsZSB0byBvcGVuICRmbjogJCEiOworICAgIG15IEBzdCA9IHN0YXQoJGluKQorICAgICAgb3IgZGllICJ1bmFibGUgdG8gc3RhdCAkZm46ICQhIjsKKyAgICBteSAkbGVuID0gJHN0WzddOworCisgICAgcHJpbnQgJGZpICJNIDY0NCBpbmxpbmUgJGZuXG4iOworICAgIHByaW50ICRmaSAiZGF0YSAkbGVuXG4iOworICAgIHdoaWxlKCRsZW4gPiAwKSB7CisgICAgICBteSAkciA9IHJlYWQoJGluLCBteSAkYnVmLCAkbGVuIDwgNDA5NiA/ICRsZW4gOiA0MDk2KTsKKyAgICAgIGRlZmluZWQoJHIpIG9yIGRpZSAicmVhZCBlcnJvciBmcm9tICRmbjogJCEiOworICAgICAgJHIgPiAwIG9yIGRpZSAicHJlbWF0dXJlIEVPRiBmcm9tICRmbjogJCEiOworICAgICAgcHJpbnQgJGZpICRidWY7CisgICAgICAkbGVuIC09ICRyOworICAgIH0KKyAgICBwcmludCAkZmkgIlxuIjsKKworICB9LCAnLicKKyk7CisKK2Nsb3NlKCRmaSk7CitleGl0ICQ/OwpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYXN0LWltcG9ydC9naXQtaW1wb3J0LnNoIGIvY29udHJpYi9mYXN0LWltcG9ydC9naXQtaW1wb3J0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBjYTc3MTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2Zhc3QtaW1wb3J0L2dpdC1pbXBvcnQuc2gKQEAgLTAsMCArMSwzOCBAQAorIyEvYmluL3NoCisjCisjIFBlcmZvcm1zIGFuIGluaXRpYWwgaW1wb3J0IG9mIGEgZGlyZWN0b3J5LiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50CisjIG9mIGRvaW5nICdnaXQgaW5pdDsgZ2l0IGFkZCAuOyBnaXQgY29tbWl0Jy4gSXQncyBhIGxvdCBzbG93ZXIsCisjIGJ1dCBpcyBtZWFudCB0byBiZSBhIHNpbXBsZSBmYXN0LWltcG9ydCBleGFtcGxlLgorCitpZiBbIC16ICIkMSIgLW8gLXogIiQyIiBdOyB0aGVuCisJZWNobyAiVXNhZ2U6IGdpdC1pbXBvcnQgYnJhbmNoIGltcG9ydC1tZXNzYWdlIgorCWV4aXQgMQorZmkKKworVVNFUk5BTUU9IiQoZ2l0IGNvbmZpZyB1c2VyLm5hbWUpIgorRU1BSUw9IiQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSIKKworaWYgWyAteiAiJFVTRVJOQU1FIiAtbyAteiAiJEVNQUlMIiBdOyB0aGVuCisJZWNobyAiWW91IG5lZWQgdG8gc2V0IHVzZXIgbmFtZSBhbmQgZW1haWwiCisJZXhpdCAxCitmaQorCitnaXQgaW5pdAorCisoCisJY2F0IDw8RU9GCitjb21taXQgcmVmcy9oZWFkcy8kMQorY29tbWl0dGVyICRVU0VSTkFNRSA8JEVNQUlMPiBub3cKK2RhdGEgPDxNU0dFT0YKKyQyCitNU0dFT0YKKworRU9GCisJZmluZCAqIC10eXBlIGZ8d2hpbGUgcmVhZCBpO2RvCisJCWVjaG8gIk0gMTAwNjQ0IGlubGluZSAkaSIKKwkJZWNobyBkYXRhICQoc3RhdCAtYyAnJXMnICIkaSIpCisJCWNhdCAiJGkiCisJCWVjaG8KKwlkb25lCisJZWNobworKSB8IGdpdCBmYXN0LWltcG9ydCAtLWRhdGUtZm9ybWF0PW5vdwpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYXN0LWltcG9ydC9naXQtcDQgYi9jb250cmliL2Zhc3QtaW1wb3J0L2dpdC1wNApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kOGRlOWY2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9mYXN0LWltcG9ydC9naXQtcDQKQEAgLTAsMCArMSwxNzk2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgZ2l0LXA0LnB5IC0tIEEgdG9vbCBmb3IgYmlkaXJlY3Rpb25hbCBvcGVyYXRpb24gYmV0d2VlbiBhIFBlcmZvcmNlIGRlcG90IGFuZCBnaXQuCisjCisjIEF1dGhvcjogU2ltb24gSGF1c21hbm4gPHNpbW9uQGxzdC5kZT4KKyMgQ29weXJpZ2h0OiAyMDA3IFNpbW9uIEhhdXNtYW5uIDxzaW1vbkBsc3QuZGU+CisjICAgICAgICAgICAgMjAwNyBUcm9sbHRlY2ggQVNBCisjIExpY2Vuc2U6IE1JVCA8aHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHA+CisjCisKK2ltcG9ydCBvcHRwYXJzZSwgc3lzLCBvcywgbWFyc2hhbCwgcG9wZW4yLCBzdWJwcm9jZXNzLCBzaGVsdmUKK2ltcG9ydCB0ZW1wZmlsZSwgZ2V0b3B0LCBzaGEsIG9zLnBhdGgsIHRpbWUsIHBsYXRmb3JtCitpbXBvcnQgcmUKKworZnJvbSBzZXRzIGltcG9ydCBTZXQ7CisKK3ZlcmJvc2UgPSBGYWxzZQorCitkZWYgZGllKG1zZyk6CisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKG1zZykKKyAgICBlbHNlOgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKG1zZyArICJcbiIpCisgICAgICAgIHN5cy5leGl0KDEpCisKK2RlZiB3cml0ZV9waXBlKGMsIHN0cik6CisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnV3JpdGluZyBwaXBlOiAlc1xuJyAlIGMpCisKKyAgICBwaXBlID0gb3MucG9wZW4oYywgJ3cnKQorICAgIHZhbCA9IHBpcGUud3JpdGUoc3RyKQorICAgIGlmIHBpcGUuY2xvc2UoKToKKyAgICAgICAgZGllKCdDb21tYW5kIGZhaWxlZDogJXMnICUgYykKKworICAgIHJldHVybiB2YWwKKworZGVmIHJlYWRfcGlwZShjLCBpZ25vcmVfZXJyb3I9RmFsc2UpOgorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ1JlYWRpbmcgcGlwZTogJXNcbicgJSBjKQorCisgICAgcGlwZSA9IG9zLnBvcGVuKGMsICdyYicpCisgICAgdmFsID0gcGlwZS5yZWFkKCkKKyAgICBpZiBwaXBlLmNsb3NlKCkgYW5kIG5vdCBpZ25vcmVfZXJyb3I6CisgICAgICAgIGRpZSgnQ29tbWFuZCBmYWlsZWQ6ICVzJyAlIGMpCisKKyAgICByZXR1cm4gdmFsCisKKworZGVmIHJlYWRfcGlwZV9saW5lcyhjKToKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdSZWFkaW5nIHBpcGU6ICVzXG4nICUgYykKKyAgICAjIyB0b2RvOiBjaGVjayByZXR1cm4gc3RhdHVzCisgICAgcGlwZSA9IG9zLnBvcGVuKGMsICdyYicpCisgICAgdmFsID0gcGlwZS5yZWFkbGluZXMoKQorICAgIGlmIHBpcGUuY2xvc2UoKToKKyAgICAgICAgZGllKCdDb21tYW5kIGZhaWxlZDogJXMnICUgYykKKworICAgIHJldHVybiB2YWwKKworZGVmIHN5c3RlbShjbWQpOgorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoImV4ZWN1dGluZyAlc1xuIiAlIGNtZCkKKyAgICBpZiBvcy5zeXN0ZW0oY21kKSAhPSAwOgorICAgICAgICBkaWUoImNvbW1hbmQgZmFpbGVkOiAlcyIgJSBjbWQpCisKK2RlZiBpc1A0RXhlYyhraW5kKToKKyAgICAiIiJEZXRlcm1pbmUgaWYgYSBQZXJmb3JjZSAna2luZCcgc2hvdWxkIGhhdmUgZXhlY3V0ZSBwZXJtaXNzaW9uCisKKyAgICAncDQgaGVscCBmaWxldHlwZXMnIGdpdmVzIGEgbGlzdCBvZiB0aGUgdHlwZXMuICBJZiBpdCBzdGFydHMgd2l0aCAneCcsCisgICAgb3IgeCBmb2xsb3dzIG9uZSBvZiBhIGZldyBsZXR0ZXJzLiAgT3RoZXJ3aXNlLCBpZiB0aGVyZSBpcyBhbiAneCcgYWZ0ZXIKKyAgICBhIHBsdXMgc2lnbiwgaXQgaXMgYWxzbyBleGVjdXRhYmxlIiIiCisgICAgcmV0dXJuIChyZS5zZWFyY2gociIoXltja3VdP3gpfFwrLip4Iiwga2luZCkgIT0gTm9uZSkKKworZGVmIHNldFA0RXhlY0JpdChmaWxlLCBtb2RlKToKKyAgICAjIFJlb3BlbnMgYW4gYWxyZWFkeSBvcGVuIGZpbGUgYW5kIGNoYW5nZXMgdGhlIGV4ZWN1dGUgYml0IHRvIG1hdGNoCisgICAgIyB0aGUgZXhlY3V0ZSBiaXQgc2V0dGluZyBpbiB0aGUgcGFzc2VkIGluIG1vZGUuCisKKyAgICBwNFR5cGUgPSAiK3giCisKKyAgICBpZiBub3QgaXNNb2RlRXhlYyhtb2RlKToKKyAgICAgICAgcDRUeXBlID0gZ2V0UDRPcGVuZWRUeXBlKGZpbGUpCisgICAgICAgIHA0VHlwZSA9IHJlLnN1YignXihbY2t1XT8peCguKiknLCAnXFwxXFwyJywgcDRUeXBlKQorICAgICAgICBwNFR5cGUgPSByZS5zdWIoJyguKj9cKy4qPyl4KC4qPyknLCAnXFwxXFwyJywgcDRUeXBlKQorICAgICAgICBpZiBwNFR5cGVbLTFdID09ICIrIjoKKyAgICAgICAgICAgIHA0VHlwZSA9IHA0VHlwZVswOi0xXQorCisgICAgc3lzdGVtKCJwNCByZW9wZW4gLXQgJXMgJXMiICUgKHA0VHlwZSwgZmlsZSkpCisKK2RlZiBnZXRQNE9wZW5lZFR5cGUoZmlsZSk6CisgICAgIyBSZXR1cm5zIHRoZSBwZXJmb3JjZSBmaWxlIHR5cGUgZm9yIHRoZSBnaXZlbiBmaWxlLgorCisgICAgcmVzdWx0ID0gcmVhZF9waXBlKCJwNCBvcGVuZWQgJXMiICUgZmlsZSkKKyAgICBtYXRjaCA9IHJlLm1hdGNoKCIuKlwoKC4rKVwpXHI/JCIsIHJlc3VsdCkKKyAgICBpZiBtYXRjaDoKKyAgICAgICAgcmV0dXJuIG1hdGNoLmdyb3VwKDEpCisgICAgZWxzZToKKyAgICAgICAgZGllKCJDb3VsZCBub3QgZGV0ZXJtaW5lIGZpbGUgdHlwZSBmb3IgJXMgKHJlc3VsdDogJyVzJykiICUgKGZpbGUsIHJlc3VsdCkpCisKK2RlZiBkaWZmVHJlZVBhdHRlcm4oKToKKyAgICAjIFRoaXMgaXMgYSBzaW1wbGUgZ2VuZXJhdG9yIGZvciB0aGUgZGlmZiB0cmVlIHJlZ2V4IHBhdHRlcm4uIFRoaXMgY291bGQgYmUKKyAgICAjIGEgY2xhc3MgdmFyaWFibGUgaWYgdGhpcyBhbmQgcGFyc2VEaWZmVHJlZUVudHJ5IHdlcmUgYSBwYXJ0IG9mIGEgY2xhc3MuCisgICAgcGF0dGVybiA9IHJlLmNvbXBpbGUoJzooXGQrKSAoXGQrKSAoXHcrKSAoXHcrKSAoW0EtWl0pKFxkKyk/XHQoLio/KSgoXHQoLiopKXwkKScpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgeWllbGQgcGF0dGVybgorCitkZWYgcGFyc2VEaWZmVHJlZUVudHJ5KGVudHJ5KToKKyAgICAiIiJQYXJzZXMgYSBzaW5nbGUgZGlmZiB0cmVlIGVudHJ5IGludG8gaXRzIGNvbXBvbmVudCBlbGVtZW50cy4KKworICAgIFNlZSBnaXQtZGlmZi10cmVlKDEpIG1hbnBhZ2UgZm9yIGRldGFpbHMgYWJvdXQgdGhlIGZvcm1hdCBvZiB0aGUgZGlmZgorICAgIG91dHB1dC4gVGhpcyBtZXRob2QgcmV0dXJucyBhIGRpY3Rpb25hcnkgd2l0aCB0aGUgZm9sbG93aW5nIGVsZW1lbnRzOgorCisgICAgc3JjX21vZGUgLSBUaGUgbW9kZSBvZiB0aGUgc291cmNlIGZpbGUKKyAgICBkc3RfbW9kZSAtIFRoZSBtb2RlIG9mIHRoZSBkZXN0aW5hdGlvbiBmaWxlCisgICAgc3JjX3NoYTEgLSBUaGUgc2hhMSBmb3IgdGhlIHNvdXJjZSBmaWxlCisgICAgZHN0X3NoYTEgLSBUaGUgc2hhMSBmciB0aGUgZGVzdGluYXRpb24gZmlsZQorICAgIHN0YXR1cyAtIFRoZSBvbmUgbGV0dGVyIHN0YXR1cyBvZiB0aGUgZGlmZiAoaS5lLiAnQScsICdNJywgJ0QnLCBldGMpCisgICAgc3RhdHVzX3Njb3JlIC0gVGhlIHNjb3JlIGZvciB0aGUgc3RhdHVzIChhcHBsaWNhYmxlIGZvciAnQycgYW5kICdSJworICAgICAgICAgICAgICAgICAgIHN0YXR1c2VzKS4gVGhpcyBpcyBOb25lIGlmIHRoZXJlIGlzIG5vIHNjb3JlLgorICAgIHNyYyAtIFRoZSBwYXRoIGZvciB0aGUgc291cmNlIGZpbGUuCisgICAgZHN0IC0gVGhlIHBhdGggZm9yIHRoZSBkZXN0aW5hdGlvbiBmaWxlLiBUaGlzIGlzIG9ubHkgcHJlc2VudCBmb3IKKyAgICAgICAgICBjb3B5IG9yIHJlbmFtZXMuIElmIGl0IGlzIG5vdCBwcmVzZW50LCB0aGlzIGlzIE5vbmUuCisKKyAgICBJZiB0aGUgcGF0dGVybiBpcyBub3QgbWF0Y2hlZCwgTm9uZSBpcyByZXR1cm5lZC4iIiIKKworICAgIG1hdGNoID0gZGlmZlRyZWVQYXR0ZXJuKCkubmV4dCgpLm1hdGNoKGVudHJ5KQorICAgIGlmIG1hdGNoOgorICAgICAgICByZXR1cm4geworICAgICAgICAgICAgJ3NyY19tb2RlJzogbWF0Y2guZ3JvdXAoMSksCisgICAgICAgICAgICAnZHN0X21vZGUnOiBtYXRjaC5ncm91cCgyKSwKKyAgICAgICAgICAgICdzcmNfc2hhMSc6IG1hdGNoLmdyb3VwKDMpLAorICAgICAgICAgICAgJ2RzdF9zaGExJzogbWF0Y2guZ3JvdXAoNCksCisgICAgICAgICAgICAnc3RhdHVzJzogbWF0Y2guZ3JvdXAoNSksCisgICAgICAgICAgICAnc3RhdHVzX3Njb3JlJzogbWF0Y2guZ3JvdXAoNiksCisgICAgICAgICAgICAnc3JjJzogbWF0Y2guZ3JvdXAoNyksCisgICAgICAgICAgICAnZHN0JzogbWF0Y2guZ3JvdXAoMTApCisgICAgICAgIH0KKyAgICByZXR1cm4gTm9uZQorCitkZWYgaXNNb2RlRXhlYyhtb2RlKToKKyAgICAjIFJldHVybnMgVHJ1ZSBpZiB0aGUgZ2l2ZW4gZ2l0IG1vZGUgcmVwcmVzZW50cyBhbiBleGVjdXRhYmxlIGZpbGUsCisgICAgIyBvdGhlcndpc2UgRmFsc2UuCisgICAgcmV0dXJuIG1vZGVbLTM6XSA9PSAiNzU1IgorCitkZWYgaXNNb2RlRXhlY0NoYW5nZWQoc3JjX21vZGUsIGRzdF9tb2RlKToKKyAgICByZXR1cm4gaXNNb2RlRXhlYyhzcmNfbW9kZSkgIT0gaXNNb2RlRXhlYyhkc3RfbW9kZSkKKworZGVmIHA0Q21kTGlzdChjbWQsIHN0ZGluPU5vbmUsIHN0ZGluX21vZGU9J3crYicpOgorICAgIGNtZCA9ICJwNCAtRyAlcyIgJSBjbWQKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJPcGVuaW5nIHBpcGU6ICVzXG4iICUgY21kKQorCisgICAgIyBVc2UgYSB0ZW1wb3JhcnkgZmlsZSB0byBhdm9pZCBkZWFkbG9ja3Mgd2l0aG91dAorICAgICMgc3VicHJvY2Vzcy5jb21tdW5pY2F0ZSgpLCB3aGljaCB3b3VsZCBwdXQgYW5vdGhlciBjb3B5CisgICAgIyBvZiBzdGRvdXQgaW50byBtZW1vcnkuCisgICAgc3RkaW5fZmlsZSA9IE5vbmUKKyAgICBpZiBzdGRpbiBpcyBub3QgTm9uZToKKyAgICAgICAgc3RkaW5fZmlsZSA9IHRlbXBmaWxlLlRlbXBvcmFyeUZpbGUocHJlZml4PSdwNC1zdGRpbicsIG1vZGU9c3RkaW5fbW9kZSkKKyAgICAgICAgc3RkaW5fZmlsZS53cml0ZShzdGRpbikKKyAgICAgICAgc3RkaW5fZmlsZS5mbHVzaCgpCisgICAgICAgIHN0ZGluX2ZpbGUuc2VlaygwKQorCisgICAgcDQgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc2hlbGw9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3RkaW5fZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKworICAgIHJlc3VsdCA9IFtdCisgICAgdHJ5OgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgZW50cnkgPSBtYXJzaGFsLmxvYWQocDQuc3Rkb3V0KQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChlbnRyeSkKKyAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBleGl0Q29kZSA9IHA0LndhaXQoKQorICAgIGlmIGV4aXRDb2RlICE9IDA6CisgICAgICAgIGVudHJ5ID0ge30KKyAgICAgICAgZW50cnlbInA0RXhpdENvZGUiXSA9IGV4aXRDb2RlCisgICAgICAgIHJlc3VsdC5hcHBlbmQoZW50cnkpCisKKyAgICByZXR1cm4gcmVzdWx0CisKK2RlZiBwNENtZChjbWQpOgorICAgIGxpc3QgPSBwNENtZExpc3QoY21kKQorICAgIHJlc3VsdCA9IHt9CisgICAgZm9yIGVudHJ5IGluIGxpc3Q6CisgICAgICAgIHJlc3VsdC51cGRhdGUoZW50cnkpCisgICAgcmV0dXJuIHJlc3VsdDsKKworZGVmIHA0V2hlcmUoZGVwb3RQYXRoKToKKyAgICBpZiBub3QgZGVwb3RQYXRoLmVuZHN3aXRoKCIvIik6CisgICAgICAgIGRlcG90UGF0aCArPSAiLyIKKyAgICBvdXRwdXQgPSBwNENtZCgid2hlcmUgJXMuLi4iICUgZGVwb3RQYXRoKQorICAgIGlmIG91dHB1dFsiY29kZSJdID09ICJlcnJvciI6CisgICAgICAgIHJldHVybiAiIgorICAgIGNsaWVudFBhdGggPSAiIgorICAgIGlmICJwYXRoIiBpbiBvdXRwdXQ6CisgICAgICAgIGNsaWVudFBhdGggPSBvdXRwdXQuZ2V0KCJwYXRoIikKKyAgICBlbGlmICJkYXRhIiBpbiBvdXRwdXQ6CisgICAgICAgIGRhdGEgPSBvdXRwdXQuZ2V0KCJkYXRhIikKKyAgICAgICAgbGFzdFNwYWNlID0gZGF0YS5yZmluZCgiICIpCisgICAgICAgIGNsaWVudFBhdGggPSBkYXRhW2xhc3RTcGFjZSArIDE6XQorCisgICAgaWYgY2xpZW50UGF0aC5lbmRzd2l0aCgiLi4uIik6CisgICAgICAgIGNsaWVudFBhdGggPSBjbGllbnRQYXRoWzotM10KKyAgICByZXR1cm4gY2xpZW50UGF0aAorCitkZWYgY3VycmVudEdpdEJyYW5jaCgpOgorICAgIHJldHVybiByZWFkX3BpcGUoImdpdCBuYW1lLXJldiBIRUFEIikuc3BsaXQoIiAiKVsxXS5zdHJpcCgpCisKK2RlZiBpc1ZhbGlkR2l0RGlyKHBhdGgpOgorICAgIGlmIChvcy5wYXRoLmV4aXN0cyhwYXRoICsgIi9IRUFEIikKKyAgICAgICAgYW5kIG9zLnBhdGguZXhpc3RzKHBhdGggKyAiL3JlZnMiKSBhbmQgb3MucGF0aC5leGlzdHMocGF0aCArICIvb2JqZWN0cyIpKToKKyAgICAgICAgcmV0dXJuIFRydWU7CisgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBwYXJzZVJldmlzaW9uKHJlZik6CisgICAgcmV0dXJuIHJlYWRfcGlwZSgiZ2l0IHJldi1wYXJzZSAlcyIgJSByZWYpLnN0cmlwKCkKKworZGVmIGV4dHJhY3RMb2dNZXNzYWdlRnJvbUdpdENvbW1pdChjb21taXQpOgorICAgIGxvZ01lc3NhZ2UgPSAiIgorCisgICAgIyMgZml4bWU6IHRpdGxlIGlzIGZpcnN0IGxpbmUgb2YgY29tbWl0LCBub3QgMXN0IHBhcmFncmFwaC4KKyAgICBmb3VuZFRpdGxlID0gRmFsc2UKKyAgICBmb3IgbG9nIGluIHJlYWRfcGlwZV9saW5lcygiZ2l0IGNhdC1maWxlIGNvbW1pdCAlcyIgJSBjb21taXQpOgorICAgICAgIGlmIG5vdCBmb3VuZFRpdGxlOgorICAgICAgICAgICBpZiBsZW4obG9nKSA9PSAxOgorICAgICAgICAgICAgICAgZm91bmRUaXRsZSA9IFRydWUKKyAgICAgICAgICAgY29udGludWUKKworICAgICAgIGxvZ01lc3NhZ2UgKz0gbG9nCisgICAgcmV0dXJuIGxvZ01lc3NhZ2UKKworZGVmIGV4dHJhY3RTZXR0aW5nc0dpdExvZyhsb2cpOgorICAgIHZhbHVlcyA9IHt9CisgICAgZm9yIGxpbmUgaW4gbG9nLnNwbGl0KCJcbiIpOgorICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCisgICAgICAgIG0gPSByZS5zZWFyY2ggKHIiXiAqXFtnaXQtcDQ6ICguKilcXSQiLCBsaW5lKQorICAgICAgICBpZiBub3QgbToKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgYXNzaWdubWVudHMgPSBtLmdyb3VwKDEpLnNwbGl0ICgnOicpCisgICAgICAgIGZvciBhIGluIGFzc2lnbm1lbnRzOgorICAgICAgICAgICAgdmFscyA9IGEuc3BsaXQgKCc9JykKKyAgICAgICAgICAgIGtleSA9IHZhbHNbMF0uc3RyaXAoKQorICAgICAgICAgICAgdmFsID0gKCc9Jy5qb2luICh2YWxzWzE6XSkpLnN0cmlwKCkKKyAgICAgICAgICAgIGlmIHZhbC5lbmRzd2l0aCAoJ1wiJykgYW5kIHZhbC5zdGFydHN3aXRoKCciJyk6CisgICAgICAgICAgICAgICAgdmFsID0gdmFsWzE6LTFdCisKKyAgICAgICAgICAgIHZhbHVlc1trZXldID0gdmFsCisKKyAgICBwYXRocyA9IHZhbHVlcy5nZXQoImRlcG90LXBhdGhzIikKKyAgICBpZiBub3QgcGF0aHM6CisgICAgICAgIHBhdGhzID0gdmFsdWVzLmdldCgiZGVwb3QtcGF0aCIpCisgICAgaWYgcGF0aHM6CisgICAgICAgIHZhbHVlc1snZGVwb3QtcGF0aHMnXSA9IHBhdGhzLnNwbGl0KCcsJykKKyAgICByZXR1cm4gdmFsdWVzCisKK2RlZiBnaXRCcmFuY2hFeGlzdHMoYnJhbmNoKToKKyAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihbImdpdCIsICJyZXYtcGFyc2UiLCBicmFuY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpOworICAgIHJldHVybiBwcm9jLndhaXQoKSA9PSAwOworCitkZWYgZ2l0Q29uZmlnKGtleSk6CisgICAgcmV0dXJuIHJlYWRfcGlwZSgiZ2l0IGNvbmZpZyAlcyIgJSBrZXksIGlnbm9yZV9lcnJvcj1UcnVlKS5zdHJpcCgpCisKK2RlZiBwNEJyYW5jaGVzSW5HaXQoYnJhbmNoZXNBcmVJblJlbW90ZXMgPSBUcnVlKToKKyAgICBicmFuY2hlcyA9IHt9CisKKyAgICBjbWRsaW5lID0gImdpdCByZXYtcGFyc2UgLS1zeW1ib2xpYyAiCisgICAgaWYgYnJhbmNoZXNBcmVJblJlbW90ZXM6CisgICAgICAgIGNtZGxpbmUgKz0gIiAtLXJlbW90ZXMiCisgICAgZWxzZToKKyAgICAgICAgY21kbGluZSArPSAiIC0tYnJhbmNoZXMiCisKKyAgICBmb3IgbGluZSBpbiByZWFkX3BpcGVfbGluZXMoY21kbGluZSk6CisgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKworICAgICAgICAjIyBvbmx5IGltcG9ydCB0byBwNC8KKyAgICAgICAgaWYgbm90IGxpbmUuc3RhcnRzd2l0aCgncDQvJykgb3IgbGluZSA9PSAicDQvSEVBRCI6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBicmFuY2ggPSBsaW5lCisKKyAgICAgICAgIyBzdHJpcCBvZmYgcDQKKyAgICAgICAgYnJhbmNoID0gcmUuc3ViICgiXnA0LyIsICIiLCBsaW5lKQorCisgICAgICAgIGJyYW5jaGVzW2JyYW5jaF0gPSBwYXJzZVJldmlzaW9uKGxpbmUpCisgICAgcmV0dXJuIGJyYW5jaGVzCisKK2RlZiBmaW5kVXBzdHJlYW1CcmFuY2hQb2ludChoZWFkID0gIkhFQUQiKToKKyAgICBicmFuY2hlcyA9IHA0QnJhbmNoZXNJbkdpdCgpCisgICAgIyBtYXAgZnJvbSBkZXBvdC1wYXRoIHRvIGJyYW5jaCBuYW1lCisgICAgYnJhbmNoQnlEZXBvdFBhdGggPSB7fQorICAgIGZvciBicmFuY2ggaW4gYnJhbmNoZXMua2V5cygpOgorICAgICAgICB0aXAgPSBicmFuY2hlc1ticmFuY2hdCisgICAgICAgIGxvZyA9IGV4dHJhY3RMb2dNZXNzYWdlRnJvbUdpdENvbW1pdCh0aXApCisgICAgICAgIHNldHRpbmdzID0gZXh0cmFjdFNldHRpbmdzR2l0TG9nKGxvZykKKyAgICAgICAgaWYgc2V0dGluZ3MuaGFzX2tleSgiZGVwb3QtcGF0aHMiKToKKyAgICAgICAgICAgIHBhdGhzID0gIiwiLmpvaW4oc2V0dGluZ3NbImRlcG90LXBhdGhzIl0pCisgICAgICAgICAgICBicmFuY2hCeURlcG90UGF0aFtwYXRoc10gPSAicmVtb3Rlcy9wNC8iICsgYnJhbmNoCisKKyAgICBzZXR0aW5ncyA9IE5vbmUKKyAgICBwYXJlbnQgPSAwCisgICAgd2hpbGUgcGFyZW50IDwgNjU1MzU6CisgICAgICAgIGNvbW1pdCA9IGhlYWQgKyAifiVzIiAlIHBhcmVudAorICAgICAgICBsb2cgPSBleHRyYWN0TG9nTWVzc2FnZUZyb21HaXRDb21taXQoY29tbWl0KQorICAgICAgICBzZXR0aW5ncyA9IGV4dHJhY3RTZXR0aW5nc0dpdExvZyhsb2cpCisgICAgICAgIGlmIHNldHRpbmdzLmhhc19rZXkoImRlcG90LXBhdGhzIik6CisgICAgICAgICAgICBwYXRocyA9ICIsIi5qb2luKHNldHRpbmdzWyJkZXBvdC1wYXRocyJdKQorICAgICAgICAgICAgaWYgYnJhbmNoQnlEZXBvdFBhdGguaGFzX2tleShwYXRocyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFticmFuY2hCeURlcG90UGF0aFtwYXRoc10sIHNldHRpbmdzXQorCisgICAgICAgIHBhcmVudCA9IHBhcmVudCArIDEKKworICAgIHJldHVybiBbIiIsIHNldHRpbmdzXQorCitkZWYgY3JlYXRlT3JVcGRhdGVCcmFuY2hlc0Zyb21PcmlnaW4obG9jYWxSZWZQcmVmaXggPSAicmVmcy9yZW1vdGVzL3A0LyIsIHNpbGVudD1UcnVlKToKKyAgICBpZiBub3Qgc2lsZW50OgorICAgICAgICBwcmludCAoIkNyZWF0aW5nL3VwZGF0aW5nIGJyYW5jaChlcykgaW4gJXMgYmFzZWQgb24gb3JpZ2luIGJyYW5jaChlcykiCisgICAgICAgICAgICAgICAlIGxvY2FsUmVmUHJlZml4KQorCisgICAgb3JpZ2luUHJlZml4ID0gIm9yaWdpbi9wNC8iCisKKyAgICBmb3IgbGluZSBpbiByZWFkX3BpcGVfbGluZXMoImdpdCByZXYtcGFyc2UgLS1zeW1ib2xpYyAtLXJlbW90ZXMiKToKKyAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICBpZiAobm90IGxpbmUuc3RhcnRzd2l0aChvcmlnaW5QcmVmaXgpKSBvciBsaW5lLmVuZHN3aXRoKCJIRUFEIik6CisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGhlYWROYW1lID0gbGluZVtsZW4ob3JpZ2luUHJlZml4KTpdCisgICAgICAgIHJlbW90ZUhlYWQgPSBsb2NhbFJlZlByZWZpeCArIGhlYWROYW1lCisgICAgICAgIG9yaWdpbkhlYWQgPSBsaW5lCisKKyAgICAgICAgb3JpZ2luYWwgPSBleHRyYWN0U2V0dGluZ3NHaXRMb2coZXh0cmFjdExvZ01lc3NhZ2VGcm9tR2l0Q29tbWl0KG9yaWdpbkhlYWQpKQorICAgICAgICBpZiAobm90IG9yaWdpbmFsLmhhc19rZXkoJ2RlcG90LXBhdGhzJykKKyAgICAgICAgICAgIG9yIG5vdCBvcmlnaW5hbC5oYXNfa2V5KCdjaGFuZ2UnKSk6CisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIHVwZGF0ZSA9IEZhbHNlCisgICAgICAgIGlmIG5vdCBnaXRCcmFuY2hFeGlzdHMocmVtb3RlSGVhZCk6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICJjcmVhdGluZyAlcyIgJSByZW1vdGVIZWFkCisgICAgICAgICAgICB1cGRhdGUgPSBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXR0aW5ncyA9IGV4dHJhY3RTZXR0aW5nc0dpdExvZyhleHRyYWN0TG9nTWVzc2FnZUZyb21HaXRDb21taXQocmVtb3RlSGVhZCkpCisgICAgICAgICAgICBpZiBzZXR0aW5ncy5oYXNfa2V5KCdjaGFuZ2UnKSA+IDA6CisgICAgICAgICAgICAgICAgaWYgc2V0dGluZ3NbJ2RlcG90LXBhdGhzJ10gPT0gb3JpZ2luYWxbJ2RlcG90LXBhdGhzJ106CisgICAgICAgICAgICAgICAgICAgIG9yaWdpblA0Q2hhbmdlID0gaW50KG9yaWdpbmFsWydjaGFuZ2UnXSkKKyAgICAgICAgICAgICAgICAgICAgcDRDaGFuZ2UgPSBpbnQoc2V0dGluZ3NbJ2NoYW5nZSddKQorICAgICAgICAgICAgICAgICAgICBpZiBvcmlnaW5QNENoYW5nZSA+IHA0Q2hhbmdlOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgKCIlcyAoJXMpIGlzIG5ld2VyIHRoYW4gJXMgKCVzKS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVcGRhdGluZyBwNCBicmFuY2ggZnJvbSBvcmlnaW4uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKG9yaWdpbkhlYWQsIG9yaWdpblA0Q2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZUhlYWQsIHA0Q2hhbmdlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSA9IFRydWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAoIklnbm9yaW5nOiAlcyB3YXMgaW1wb3J0ZWQgZnJvbSAlcyB3aGlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgd2FzIGltcG9ydGVkIGZyb20gJXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChvcmlnaW5IZWFkLCAnLCcuam9pbihvcmlnaW5hbFsnZGVwb3QtcGF0aHMnXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVIZWFkLCAnLCcuam9pbihzZXR0aW5nc1snZGVwb3QtcGF0aHMnXSkpKQorCisgICAgICAgIGlmIHVwZGF0ZToKKyAgICAgICAgICAgIHN5c3RlbSgiZ2l0IHVwZGF0ZS1yZWYgJXMgJXMiICUgKHJlbW90ZUhlYWQsIG9yaWdpbkhlYWQpKQorCitkZWYgb3JpZ2luUDRCcmFuY2hlc0V4aXN0KCk6CisgICAgICAgIHJldHVybiBnaXRCcmFuY2hFeGlzdHMoIm9yaWdpbiIpIG9yIGdpdEJyYW5jaEV4aXN0cygib3JpZ2luL3A0Iikgb3IgZ2l0QnJhbmNoRXhpc3RzKCJvcmlnaW4vcDQvbWFzdGVyIikKKworZGVmIHA0Q2hhbmdlc0ZvclBhdGhzKGRlcG90UGF0aHMsIGNoYW5nZVJhbmdlKToKKyAgICBhc3NlcnQgZGVwb3RQYXRocworICAgIG91dHB1dCA9IHJlYWRfcGlwZV9saW5lcygicDQgY2hhbmdlcyAiICsgJyAnLmpvaW4gKFsiJXMuLi4lcyIgJSAocCwgY2hhbmdlUmFuZ2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBwIGluIGRlcG90UGF0aHNdKSkKKworICAgIGNoYW5nZXMgPSBbXQorICAgIGZvciBsaW5lIGluIG91dHB1dDoKKyAgICAgICAgY2hhbmdlTnVtID0gbGluZS5zcGxpdCgiICIpWzFdCisgICAgICAgIGNoYW5nZXMuYXBwZW5kKGludChjaGFuZ2VOdW0pKQorCisgICAgY2hhbmdlcy5zb3J0KCkKKyAgICByZXR1cm4gY2hhbmdlcworCitjbGFzcyBDb21tYW5kOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi51c2FnZSA9ICJ1c2FnZTogJXByb2cgW29wdGlvbnNdIgorICAgICAgICBzZWxmLm5lZWRzR2l0ID0gVHJ1ZQorCitjbGFzcyBQNERlYnVnKENvbW1hbmQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQ29tbWFuZC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLm9wdGlvbnMgPSBbCisgICAgICAgICAgICBvcHRwYXJzZS5tYWtlX29wdGlvbigiLS12ZXJib3NlIiwgZGVzdD0idmVyYm9zZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PUZhbHNlKSwKKyAgICAgICAgICAgIF0KKyAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9ICJBIHRvb2wgdG8gZGVidWcgdGhlIG91dHB1dCBvZiBwNCAtRy4iCisgICAgICAgIHNlbGYubmVlZHNHaXQgPSBGYWxzZQorICAgICAgICBzZWxmLnZlcmJvc2UgPSBGYWxzZQorCisgICAgZGVmIHJ1bihzZWxmLCBhcmdzKToKKyAgICAgICAgaiA9IDAKKyAgICAgICAgZm9yIG91dHB1dCBpbiBwNENtZExpc3QoIiAiLmpvaW4oYXJncykpOgorICAgICAgICAgICAgcHJpbnQgJ0VsZW1lbnQ6ICVkJyAlIGoKKyAgICAgICAgICAgIGogKz0gMQorICAgICAgICAgICAgcHJpbnQgb3V0cHV0CisgICAgICAgIHJldHVybiBUcnVlCisKK2NsYXNzIFA0Um9sbEJhY2soQ29tbWFuZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYub3B0aW9ucyA9IFsKKyAgICAgICAgICAgIG9wdHBhcnNlLm1ha2Vfb3B0aW9uKCItLXZlcmJvc2UiLCBkZXN0PSJ2ZXJib3NlIiwgYWN0aW9uPSJzdG9yZV90cnVlIiksCisgICAgICAgICAgICBvcHRwYXJzZS5tYWtlX29wdGlvbigiLS1sb2NhbCIsIGRlc3Q9InJvbGxiYWNrTG9jYWxCcmFuY2hlcyIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIpCisgICAgICAgIF0KKyAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9ICJBIHRvb2wgdG8gZGVidWcgdGhlIG11bHRpLWJyYW5jaCBpbXBvcnQuIERvbid0IHVzZSA6KSIKKyAgICAgICAgc2VsZi52ZXJib3NlID0gRmFsc2UKKyAgICAgICAgc2VsZi5yb2xsYmFja0xvY2FsQnJhbmNoZXMgPSBGYWxzZQorCisgICAgZGVmIHJ1bihzZWxmLCBhcmdzKToKKyAgICAgICAgaWYgbGVuKGFyZ3MpICE9IDE6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgbWF4Q2hhbmdlID0gaW50KGFyZ3NbMF0pCisKKyAgICAgICAgaWYgInA0RXhpdENvZGUiIGluIHA0Q21kKCJjaGFuZ2VzIC1tIDEiKToKKyAgICAgICAgICAgIGRpZSgiUHJvYmxlbXMgZXhlY3V0aW5nIHA0Iik7CisKKyAgICAgICAgaWYgc2VsZi5yb2xsYmFja0xvY2FsQnJhbmNoZXM6CisgICAgICAgICAgICByZWZQcmVmaXggPSAicmVmcy9oZWFkcy8iCisgICAgICAgICAgICBsaW5lcyA9IHJlYWRfcGlwZV9saW5lcygiZ2l0IHJldi1wYXJzZSAtLXN5bWJvbGljIC0tYnJhbmNoZXMiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVmUHJlZml4ID0gInJlZnMvcmVtb3Rlcy8iCisgICAgICAgICAgICBsaW5lcyA9IHJlYWRfcGlwZV9saW5lcygiZ2l0IHJldi1wYXJzZSAtLXN5bWJvbGljIC0tcmVtb3RlcyIpCisKKyAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICAgICBpZiBzZWxmLnJvbGxiYWNrTG9jYWxCcmFuY2hlcyBvciAobGluZS5zdGFydHN3aXRoKCJwNC8iKSBhbmQgbGluZSAhPSAicDQvSEVBRFxuIik6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICAgICAgICAgIHJlZiA9IHJlZlByZWZpeCArIGxpbmUKKyAgICAgICAgICAgICAgICBsb2cgPSBleHRyYWN0TG9nTWVzc2FnZUZyb21HaXRDb21taXQocmVmKQorICAgICAgICAgICAgICAgIHNldHRpbmdzID0gZXh0cmFjdFNldHRpbmdzR2l0TG9nKGxvZykKKworICAgICAgICAgICAgICAgIGRlcG90UGF0aHMgPSBzZXR0aW5nc1snZGVwb3QtcGF0aHMnXQorICAgICAgICAgICAgICAgIGNoYW5nZSA9IHNldHRpbmdzWydjaGFuZ2UnXQorCisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IEZhbHNlCisKKyAgICAgICAgICAgICAgICBpZiBsZW4ocDRDbWQoImNoYW5nZXMgLW0gMSAiICArICcgJy5qb2luIChbJyVzLi4uQCVzJyAlIChwLCBtYXhDaGFuZ2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBwIGluIGRlcG90UGF0aHNdKSkpID09IDA6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJCcmFuY2ggJXMgZGlkIG5vdCBleGlzdCBhdCBjaGFuZ2UgJXMsIGRlbGV0aW5nLiIgJSAocmVmLCBtYXhDaGFuZ2UpCisgICAgICAgICAgICAgICAgICAgIHN5c3RlbSgiZ2l0IHVwZGF0ZS1yZWYgLWQgJXMgYGdpdCByZXYtcGFyc2UgJXNgIiAlIChyZWYsIHJlZikpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICB3aGlsZSBjaGFuZ2UgYW5kIGludChjaGFuZ2UpID4gbWF4Q2hhbmdlOgorICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiJXMgaXMgYXQgJXMgOyByZXdpbmRpbmcgdG93YXJkcyAlcyIgJSAocmVmLCBjaGFuZ2UsIG1heENoYW5nZSkKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtKCJnaXQgdXBkYXRlLXJlZiAlcyBcIiVzXlwiIiAlIChyZWYsIHJlZikpCisgICAgICAgICAgICAgICAgICAgIGxvZyA9IGV4dHJhY3RMb2dNZXNzYWdlRnJvbUdpdENvbW1pdChyZWYpCisgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzID0gIGV4dHJhY3RTZXR0aW5nc0dpdExvZyhsb2cpCisKKworICAgICAgICAgICAgICAgICAgICBkZXBvdFBhdGhzID0gc2V0dGluZ3NbJ2RlcG90LXBhdGhzJ10KKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlID0gc2V0dGluZ3NbJ2NoYW5nZSddCisKKyAgICAgICAgICAgICAgICBpZiBjaGFuZ2VkOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiJXMgcmV3b3VuZCB0byAlcyIgJSAocmVmLCBjaGFuZ2UpCisKKyAgICAgICAgcmV0dXJuIFRydWUKKworY2xhc3MgUDRTdWJtaXQoQ29tbWFuZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYub3B0aW9ucyA9IFsKKyAgICAgICAgICAgICAgICBvcHRwYXJzZS5tYWtlX29wdGlvbigiLS12ZXJib3NlIiwgZGVzdD0idmVyYm9zZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIpLAorICAgICAgICAgICAgICAgIG9wdHBhcnNlLm1ha2Vfb3B0aW9uKCItLW9yaWdpbiIsIGRlc3Q9Im9yaWdpbiIpLAorICAgICAgICAgICAgICAgIG9wdHBhcnNlLm1ha2Vfb3B0aW9uKCItTSIsIGRlc3Q9ImRldGVjdFJlbmFtZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIpLAorICAgICAgICBdCisgICAgICAgIHNlbGYuZGVzY3JpcHRpb24gPSAiU3VibWl0IGNoYW5nZXMgZnJvbSBnaXQgdG8gdGhlIHBlcmZvcmNlIGRlcG90LiIKKyAgICAgICAgc2VsZi51c2FnZSArPSAiIFtuYW1lIG9mIGdpdCBicmFuY2ggdG8gc3VibWl0IGludG8gcGVyZm9yY2UgZGVwb3RdIgorICAgICAgICBzZWxmLmludGVyYWN0aXZlID0gVHJ1ZQorICAgICAgICBzZWxmLm9yaWdpbiA9ICIiCisgICAgICAgIHNlbGYuZGV0ZWN0UmVuYW1lID0gRmFsc2UKKyAgICAgICAgc2VsZi52ZXJib3NlID0gRmFsc2UKKyAgICAgICAgc2VsZi5pc1dpbmRvd3MgPSAocGxhdGZvcm0uc3lzdGVtKCkgPT0gIldpbmRvd3MiKQorCisgICAgZGVmIGNoZWNrKHNlbGYpOgorICAgICAgICBpZiBsZW4ocDRDbWRMaXN0KCJvcGVuZWQgLi4uIikpID4gMDoKKyAgICAgICAgICAgIGRpZSgiWW91IGhhdmUgZmlsZXMgb3BlbmVkIHdpdGggcGVyZm9yY2UhIENsb3NlIHRoZW0gYmVmb3JlIHN0YXJ0aW5nIHRoZSBzeW5jLiIpCisKKyAgICAjIHJlcGxhY2VzIGV2ZXJ5dGhpbmcgYmV0d2VlbiAnRGVzY3JpcHRpb246JyBhbmQgdGhlIG5leHQgUDQgc3VibWl0IHRlbXBsYXRlIGZpZWxkIHdpdGggdGhlCisgICAgIyBjb21taXQgbWVzc2FnZQorICAgIGRlZiBwcmVwYXJlTG9nTWVzc2FnZShzZWxmLCB0ZW1wbGF0ZSwgbWVzc2FnZSk6CisgICAgICAgIHJlc3VsdCA9ICIiCisKKyAgICAgICAgaW5EZXNjcmlwdGlvblNlY3Rpb24gPSBGYWxzZQorCisgICAgICAgIGZvciBsaW5lIGluIHRlbXBsYXRlLnNwbGl0KCJcbiIpOgorICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCIjIik6CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmUgKyAiXG4iCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgaW5EZXNjcmlwdGlvblNlY3Rpb246CisgICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCJGaWxlczoiKToKKyAgICAgICAgICAgICAgICAgICAgaW5EZXNjcmlwdGlvblNlY3Rpb24gPSBGYWxzZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgiRGVzY3JpcHRpb246Iik6CisgICAgICAgICAgICAgICAgICAgIGluRGVzY3JpcHRpb25TZWN0aW9uID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBsaW5lICs9ICJcbiIKKyAgICAgICAgICAgICAgICAgICAgZm9yIG1lc3NhZ2VMaW5lIGluIG1lc3NhZ2Uuc3BsaXQoIlxuIik6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lICs9ICJcdCIgKyBtZXNzYWdlTGluZSArICJcbiIKKworICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmUgKyAiXG4iCisKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIHByZXBhcmVTdWJtaXRUZW1wbGF0ZShzZWxmKToKKyAgICAgICAgIyByZW1vdmUgbGluZXMgaW4gdGhlIEZpbGVzIHNlY3Rpb24gdGhhdCBzaG93IGNoYW5nZXMgdG8gZmlsZXMgb3V0c2lkZSB0aGUgZGVwb3QgcGF0aCB3ZSdyZSBjb21taXR0aW5nIGludG8KKyAgICAgICAgdGVtcGxhdGUgPSAiIgorICAgICAgICBpbkZpbGVzU2VjdGlvbiA9IEZhbHNlCisgICAgICAgIGZvciBsaW5lIGluIHJlYWRfcGlwZV9saW5lcygicDQgY2hhbmdlIC1vIik6CisgICAgICAgICAgICBpZiBsaW5lLmVuZHN3aXRoKCJcclxuIik6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0yXSArICJcbiIKKyAgICAgICAgICAgIGlmIGluRmlsZXNTZWN0aW9uOgorICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgiXHQiKToKKyAgICAgICAgICAgICAgICAgICAgIyBwYXRoIHN0YXJ0cyBhbmQgZW5kcyB3aXRoIGEgdGFiCisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBsaW5lWzE6XQorICAgICAgICAgICAgICAgICAgICBsYXN0VGFiID0gcGF0aC5yZmluZCgiXHQiKQorICAgICAgICAgICAgICAgICAgICBpZiBsYXN0VGFiICE9IC0xOgorICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGhbOmxhc3RUYWJdCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgcGF0aC5zdGFydHN3aXRoKHNlbGYuZGVwb3RQYXRoKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGluRmlsZXNTZWN0aW9uID0gRmFsc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCJGaWxlczoiKToKKyAgICAgICAgICAgICAgICAgICAgaW5GaWxlc1NlY3Rpb24gPSBUcnVlCisKKyAgICAgICAgICAgIHRlbXBsYXRlICs9IGxpbmUKKworICAgICAgICByZXR1cm4gdGVtcGxhdGUKKworICAgIGRlZiBhcHBseUNvbW1pdChzZWxmLCBpZCk6CisgICAgICAgIHByaW50ICJBcHBseWluZyAlcyIgJSAocmVhZF9waXBlKCJnaXQgbG9nIC0tbWF4LWNvdW50PTEgLS1wcmV0dHk9b25lbGluZSAlcyIgJSBpZCkpCisgICAgICAgIGRpZmZPcHRzID0gKCIiLCAiLU0iKVtzZWxmLmRldGVjdFJlbmFtZV0KKyAgICAgICAgZGlmZiA9IHJlYWRfcGlwZV9saW5lcygiZ2l0IGRpZmYtdHJlZSAtciAlcyBcIiVzXlwiIFwiJXNcIiIgJSAoZGlmZk9wdHMsIGlkLCBpZCkpCisgICAgICAgIGZpbGVzVG9BZGQgPSBzZXQoKQorICAgICAgICBmaWxlc1RvRGVsZXRlID0gc2V0KCkKKyAgICAgICAgZWRpdGVkRmlsZXMgPSBzZXQoKQorICAgICAgICBmaWxlc1RvQ2hhbmdlRXhlY0JpdCA9IHt9CisgICAgICAgIGZvciBsaW5lIGluIGRpZmY6CisgICAgICAgICAgICBkaWZmID0gcGFyc2VEaWZmVHJlZUVudHJ5KGxpbmUpCisgICAgICAgICAgICBtb2RpZmllciA9IGRpZmZbJ3N0YXR1cyddCisgICAgICAgICAgICBwYXRoID0gZGlmZlsnc3JjJ10KKyAgICAgICAgICAgIGlmIG1vZGlmaWVyID09ICJNIjoKKyAgICAgICAgICAgICAgICBzeXN0ZW0oInA0IGVkaXQgXCIlc1wiIiAlIHBhdGgpCisgICAgICAgICAgICAgICAgaWYgaXNNb2RlRXhlY0NoYW5nZWQoZGlmZlsnc3JjX21vZGUnXSwgZGlmZlsnZHN0X21vZGUnXSk6CisgICAgICAgICAgICAgICAgICAgIGZpbGVzVG9DaGFuZ2VFeGVjQml0W3BhdGhdID0gZGlmZlsnZHN0X21vZGUnXQorICAgICAgICAgICAgICAgIGVkaXRlZEZpbGVzLmFkZChwYXRoKQorICAgICAgICAgICAgZWxpZiBtb2RpZmllciA9PSAiQSI6CisgICAgICAgICAgICAgICAgZmlsZXNUb0FkZC5hZGQocGF0aCkKKyAgICAgICAgICAgICAgICBmaWxlc1RvQ2hhbmdlRXhlY0JpdFtwYXRoXSA9IGRpZmZbJ2RzdF9tb2RlJ10KKyAgICAgICAgICAgICAgICBpZiBwYXRoIGluIGZpbGVzVG9EZWxldGU6CisgICAgICAgICAgICAgICAgICAgIGZpbGVzVG9EZWxldGUucmVtb3ZlKHBhdGgpCisgICAgICAgICAgICBlbGlmIG1vZGlmaWVyID09ICJEIjoKKyAgICAgICAgICAgICAgICBmaWxlc1RvRGVsZXRlLmFkZChwYXRoKQorICAgICAgICAgICAgICAgIGlmIHBhdGggaW4gZmlsZXNUb0FkZDoKKyAgICAgICAgICAgICAgICAgICAgZmlsZXNUb0FkZC5yZW1vdmUocGF0aCkKKyAgICAgICAgICAgIGVsaWYgbW9kaWZpZXIgPT0gIlIiOgorICAgICAgICAgICAgICAgIHNyYywgZGVzdCA9IGRpZmZbJ3NyYyddLCBkaWZmWydkc3QnXQorICAgICAgICAgICAgICAgIHN5c3RlbSgicDQgaW50ZWdyYXRlIC1EdCBcIiVzXCIgXCIlc1wiIiAlIChzcmMsIGRlc3QpKQorICAgICAgICAgICAgICAgIHN5c3RlbSgicDQgZWRpdCBcIiVzXCIiICUgKGRlc3QpKQorICAgICAgICAgICAgICAgIGlmIGlzTW9kZUV4ZWNDaGFuZ2VkKGRpZmZbJ3NyY19tb2RlJ10sIGRpZmZbJ2RzdF9tb2RlJ10pOgorICAgICAgICAgICAgICAgICAgICBmaWxlc1RvQ2hhbmdlRXhlY0JpdFtkZXN0XSA9IGRpZmZbJ2RzdF9tb2RlJ10KKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoZGVzdCkKKyAgICAgICAgICAgICAgICBlZGl0ZWRGaWxlcy5hZGQoZGVzdCkKKyAgICAgICAgICAgICAgICBmaWxlc1RvRGVsZXRlLmFkZChzcmMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRpZSgidW5rbm93biBtb2RpZmllciAlcyBmb3IgJXMiICUgKG1vZGlmaWVyLCBwYXRoKSkKKworICAgICAgICBkaWZmY21kID0gImdpdCBmb3JtYXQtcGF0Y2ggLWsgLS1zdGRvdXQgXCIlc15cIi4uXCIlc1wiIiAlIChpZCwgaWQpCisgICAgICAgIHBhdGNoY21kID0gZGlmZmNtZCArICIgfCBnaXQgYXBwbHkgIgorICAgICAgICB0cnlQYXRjaENtZCA9IHBhdGNoY21kICsgIi0tY2hlY2sgLSIKKyAgICAgICAgYXBwbHlQYXRjaENtZCA9IHBhdGNoY21kICsgIi0tY2hlY2sgLS1hcHBseSAtIgorCisgICAgICAgIGlmIG9zLnN5c3RlbSh0cnlQYXRjaENtZCkgIT0gMDoKKyAgICAgICAgICAgIHByaW50ICJVbmZvcnR1bmF0ZWx5IGFwcGx5aW5nIHRoZSBjaGFuZ2UgZmFpbGVkISIKKyAgICAgICAgICAgIHByaW50ICJXaGF0IGRvIHlvdSB3YW50IHRvIGRvPyIKKyAgICAgICAgICAgIHJlc3BvbnNlID0gIngiCisgICAgICAgICAgICB3aGlsZSByZXNwb25zZSAhPSAicyIgYW5kIHJlc3BvbnNlICE9ICJhIiBhbmQgcmVzcG9uc2UgIT0gInciOgorICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gcmF3X2lucHV0KCJbc11raXAgdGhpcyBwYXRjaCAvIFthXXBwbHkgdGhlIHBhdGNoIGZvcmNpYmx5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kIHdpdGggLnJlaiBmaWxlcyAvIFt3XXJpdGUgdGhlIHBhdGNoIHRvIGEgZmlsZSAocGF0Y2gudHh0KSAiKQorICAgICAgICAgICAgaWYgcmVzcG9uc2UgPT0gInMiOgorICAgICAgICAgICAgICAgIHByaW50ICJTa2lwcGluZyEgR29vZCBsdWNrIHdpdGggdGhlIG5leHQgcGF0Y2hlcy4uLiIKKyAgICAgICAgICAgICAgICBmb3IgZiBpbiBlZGl0ZWRGaWxlczoKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtKCJwNCByZXZlcnQgXCIlc1wiIiAlIGYpOworICAgICAgICAgICAgICAgIGZvciBmIGluIGZpbGVzVG9BZGQ6CisgICAgICAgICAgICAgICAgICAgIHN5c3RlbSgicm0gJXMiICVmKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZWxpZiByZXNwb25zZSA9PSAiYSI6CisgICAgICAgICAgICAgICAgb3Muc3lzdGVtKGFwcGx5UGF0Y2hDbWQpCisgICAgICAgICAgICAgICAgaWYgbGVuKGZpbGVzVG9BZGQpID4gMDoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIllvdSBtYXkgYWxzbyB3YW50IHRvIGNhbGwgcDQgYWRkIG9uIHRoZSBmb2xsb3dpbmcgZmlsZXM6IgorICAgICAgICAgICAgICAgICAgICBwcmludCAiICIuam9pbihmaWxlc1RvQWRkKQorICAgICAgICAgICAgICAgIGlmIGxlbihmaWxlc1RvRGVsZXRlKToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIlRoZSBmb2xsb3dpbmcgZmlsZXMgc2hvdWxkIGJlIHNjaGVkdWxlZCBmb3IgZGVsZXRpb24gd2l0aCBwNCBkZWxldGU6IgorICAgICAgICAgICAgICAgICAgICBwcmludCAiICIuam9pbihmaWxlc1RvRGVsZXRlKQorICAgICAgICAgICAgICAgIGRpZSgiUGxlYXNlIHJlc29sdmUgYW5kIHN1Ym1pdCB0aGUgY29uZmxpY3QgbWFudWFsbHkgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgKyAiY29udGludWUgYWZ0ZXJ3YXJkcyB3aXRoIGdpdC1wNCBzdWJtaXQgLS1jb250aW51ZSIpCisgICAgICAgICAgICBlbGlmIHJlc3BvbnNlID09ICJ3IjoKKyAgICAgICAgICAgICAgICBzeXN0ZW0oZGlmZmNtZCArICIgPiBwYXRjaC50eHQiKQorICAgICAgICAgICAgICAgIHByaW50ICJQYXRjaCBzYXZlZCB0byBwYXRjaC50eHQgaW4gJXMgISIgJSBzZWxmLmNsaWVudFBhdGgKKyAgICAgICAgICAgICAgICBkaWUoIlBsZWFzZSByZXNvbHZlIGFuZCBzdWJtaXQgdGhlIGNvbmZsaWN0IG1hbnVhbGx5IGFuZCAiCisgICAgICAgICAgICAgICAgICAgICJjb250aW51ZSBhZnRlcndhcmRzIHdpdGggZ2l0LXA0IHN1Ym1pdCAtLWNvbnRpbnVlIikKKworICAgICAgICBzeXN0ZW0oYXBwbHlQYXRjaENtZCkKKworICAgICAgICBmb3IgZiBpbiBmaWxlc1RvQWRkOgorICAgICAgICAgICAgc3lzdGVtKCJwNCBhZGQgXCIlc1wiIiAlIGYpCisgICAgICAgIGZvciBmIGluIGZpbGVzVG9EZWxldGU6CisgICAgICAgICAgICBzeXN0ZW0oInA0IHJldmVydCBcIiVzXCIiICUgZikKKyAgICAgICAgICAgIHN5c3RlbSgicDQgZGVsZXRlIFwiJXNcIiIgJSBmKQorCisgICAgICAgICMgU2V0L2NsZWFyIGV4ZWN1dGFibGUgYml0cworICAgICAgICBmb3IgZiBpbiBmaWxlc1RvQ2hhbmdlRXhlY0JpdC5rZXlzKCk6CisgICAgICAgICAgICBtb2RlID0gZmlsZXNUb0NoYW5nZUV4ZWNCaXRbZl0KKyAgICAgICAgICAgIHNldFA0RXhlY0JpdChmLCBtb2RlKQorCisgICAgICAgIGxvZ01lc3NhZ2UgPSBleHRyYWN0TG9nTWVzc2FnZUZyb21HaXRDb21taXQoaWQpCisgICAgICAgIGxvZ01lc3NhZ2UgPSBsb2dNZXNzYWdlLnN0cmlwKCkKKworICAgICAgICB0ZW1wbGF0ZSA9IHNlbGYucHJlcGFyZVN1Ym1pdFRlbXBsYXRlKCkKKworICAgICAgICBpZiBzZWxmLmludGVyYWN0aXZlOgorICAgICAgICAgICAgc3VibWl0VGVtcGxhdGUgPSBzZWxmLnByZXBhcmVMb2dNZXNzYWdlKHRlbXBsYXRlLCBsb2dNZXNzYWdlKQorICAgICAgICAgICAgaWYgb3MuZW52aXJvbi5oYXNfa2V5KCJQNERJRkYiKToKKyAgICAgICAgICAgICAgICBkZWwob3MuZW52aXJvblsiUDRESUZGIl0pCisgICAgICAgICAgICBkaWZmID0gcmVhZF9waXBlKCJwNCBkaWZmIC1kdSAuLi4iKQorCisgICAgICAgICAgICBuZXdkaWZmID0gIiIKKyAgICAgICAgICAgIGZvciBuZXdGaWxlIGluIGZpbGVzVG9BZGQ6CisgICAgICAgICAgICAgICAgbmV3ZGlmZiArPSAiPT09PSBuZXcgZmlsZSA9PT09XG4iCisgICAgICAgICAgICAgICAgbmV3ZGlmZiArPSAiLS0tIC9kZXYvbnVsbFxuIgorICAgICAgICAgICAgICAgIG5ld2RpZmYgKz0gIisrKyAlc1xuIiAlIG5ld0ZpbGUKKyAgICAgICAgICAgICAgICBmID0gb3BlbihuZXdGaWxlLCAiciIpCisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gZi5yZWFkbGluZXMoKToKKyAgICAgICAgICAgICAgICAgICAgbmV3ZGlmZiArPSAiKyIgKyBsaW5lCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgICAgIHNlcGFyYXRvckxpbmUgPSAiIyMjIyMjIyMgZXZlcnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgaXMganVzdCB0aGUgZGlmZiAjIyMjIyMjXG4iCisKKyAgICAgICAgICAgIFtoYW5kbGUsIGZpbGVOYW1lXSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICAgICAgdG1wRmlsZSA9IG9zLmZkb3BlbihoYW5kbGUsICJ3KyIpCisgICAgICAgICAgICBpZiBzZWxmLmlzV2luZG93czoKKyAgICAgICAgICAgICAgICBzdWJtaXRUZW1wbGF0ZSA9IHN1Ym1pdFRlbXBsYXRlLnJlcGxhY2UoIlxuIiwgIlxyXG4iKQorICAgICAgICAgICAgICAgIHNlcGFyYXRvckxpbmUgPSBzZXBhcmF0b3JMaW5lLnJlcGxhY2UoIlxuIiwgIlxyXG4iKQorICAgICAgICAgICAgICAgIG5ld2RpZmYgPSBuZXdkaWZmLnJlcGxhY2UoIlxuIiwgIlxyXG4iKQorICAgICAgICAgICAgdG1wRmlsZS53cml0ZShzdWJtaXRUZW1wbGF0ZSArIHNlcGFyYXRvckxpbmUgKyBkaWZmICsgbmV3ZGlmZikKKyAgICAgICAgICAgIHRtcEZpbGUuY2xvc2UoKQorICAgICAgICAgICAgZGVmYXVsdEVkaXRvciA9ICJ2aSIKKyAgICAgICAgICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICJXaW5kb3dzIjoKKyAgICAgICAgICAgICAgICBkZWZhdWx0RWRpdG9yID0gIm5vdGVwYWQiCisgICAgICAgICAgICBpZiBvcy5lbnZpcm9uLmhhc19rZXkoIlA0RURJVE9SIik6CisgICAgICAgICAgICAgICAgZWRpdG9yID0gb3MuZW52aXJvbi5nZXQoIlA0RURJVE9SIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZWRpdG9yID0gb3MuZW52aXJvbi5nZXQoIkVESVRPUiIsIGRlZmF1bHRFZGl0b3IpOworICAgICAgICAgICAgc3lzdGVtKGVkaXRvciArICIgIiArIGZpbGVOYW1lKQorICAgICAgICAgICAgdG1wRmlsZSA9IG9wZW4oZmlsZU5hbWUsICJyYiIpCisgICAgICAgICAgICBtZXNzYWdlID0gdG1wRmlsZS5yZWFkKCkKKyAgICAgICAgICAgIHRtcEZpbGUuY2xvc2UoKQorICAgICAgICAgICAgb3MucmVtb3ZlKGZpbGVOYW1lKQorICAgICAgICAgICAgc3VibWl0VGVtcGxhdGUgPSBtZXNzYWdlWzptZXNzYWdlLmluZGV4KHNlcGFyYXRvckxpbmUpXQorICAgICAgICAgICAgaWYgc2VsZi5pc1dpbmRvd3M6CisgICAgICAgICAgICAgICAgc3VibWl0VGVtcGxhdGUgPSBzdWJtaXRUZW1wbGF0ZS5yZXBsYWNlKCJcclxuIiwgIlxuIikKKworICAgICAgICAgICAgd3JpdGVfcGlwZSgicDQgc3VibWl0IC1pIiwgc3VibWl0VGVtcGxhdGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaWxlTmFtZSA9ICJzdWJtaXQudHh0IgorICAgICAgICAgICAgZmlsZSA9IG9wZW4oZmlsZU5hbWUsICJ3KyIpCisgICAgICAgICAgICBmaWxlLndyaXRlKHNlbGYucHJlcGFyZUxvZ01lc3NhZ2UodGVtcGxhdGUsIGxvZ01lc3NhZ2UpKQorICAgICAgICAgICAgZmlsZS5jbG9zZSgpCisgICAgICAgICAgICBwcmludCAoIlBlcmZvcmNlIHN1Ym1pdCB0ZW1wbGF0ZSB3cml0dGVuIGFzICVzLiAiCisgICAgICAgICAgICAgICAgICAgKyAiUGxlYXNlIHJldmlldy9lZGl0IGFuZCB0aGVuIHVzZSBwNCBzdWJtaXQgLWkgPCAlcyB0byBzdWJtaXQgZGlyZWN0bHkhIgorICAgICAgICAgICAgICAgICAgICUgKGZpbGVOYW1lLCBmaWxlTmFtZSkpCisKKyAgICBkZWYgcnVuKHNlbGYsIGFyZ3MpOgorICAgICAgICBpZiBsZW4oYXJncykgPT0gMDoKKyAgICAgICAgICAgIHNlbGYubWFzdGVyID0gY3VycmVudEdpdEJyYW5jaCgpCisgICAgICAgICAgICBpZiBsZW4oc2VsZi5tYXN0ZXIpID09IDAgb3Igbm90IGdpdEJyYW5jaEV4aXN0cygicmVmcy9oZWFkcy8lcyIgJSBzZWxmLm1hc3Rlcik6CisgICAgICAgICAgICAgICAgZGllKCJEZXRlY3RpbmcgY3VycmVudCBnaXQgYnJhbmNoIGZhaWxlZCEiKQorICAgICAgICBlbGlmIGxlbihhcmdzKSA9PSAxOgorICAgICAgICAgICAgc2VsZi5tYXN0ZXIgPSBhcmdzWzBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBbdXBzdHJlYW0sIHNldHRpbmdzXSA9IGZpbmRVcHN0cmVhbUJyYW5jaFBvaW50KCkKKyAgICAgICAgc2VsZi5kZXBvdFBhdGggPSBzZXR0aW5nc1snZGVwb3QtcGF0aHMnXVswXQorICAgICAgICBpZiBsZW4oc2VsZi5vcmlnaW4pID09IDA6CisgICAgICAgICAgICBzZWxmLm9yaWdpbiA9IHVwc3RyZWFtCisKKyAgICAgICAgaWYgc2VsZi52ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIk9yaWdpbiBicmFuY2ggaXMgIiArIHNlbGYub3JpZ2luCisKKyAgICAgICAgaWYgbGVuKHNlbGYuZGVwb3RQYXRoKSA9PSAwOgorICAgICAgICAgICAgcHJpbnQgIkludGVybmFsIGVycm9yOiBjYW5ub3QgbG9jYXRlIHBlcmZvcmNlIGRlcG90IHBhdGggZnJvbSBleGlzdGluZyBicmFuY2hlcyIKKyAgICAgICAgICAgIHN5cy5leGl0KDEyOCkKKworICAgICAgICBzZWxmLmNsaWVudFBhdGggPSBwNFdoZXJlKHNlbGYuZGVwb3RQYXRoKQorCisgICAgICAgIGlmIGxlbihzZWxmLmNsaWVudFBhdGgpID09IDA6CisgICAgICAgICAgICBwcmludCAiRXJyb3I6IENhbm5vdCBsb2NhdGUgcGVyZm9yY2UgY2hlY2tvdXQgb2YgJXMgaW4gY2xpZW50IHZpZXciICUgc2VsZi5kZXBvdFBhdGgKKyAgICAgICAgICAgIHN5cy5leGl0KDEyOCkKKworICAgICAgICBwcmludCAiUGVyZm9yY2UgY2hlY2tvdXQgZm9yIGRlcG90IHBhdGggJXMgbG9jYXRlZCBhdCAlcyIgJSAoc2VsZi5kZXBvdFBhdGgsIHNlbGYuY2xpZW50UGF0aCkKKyAgICAgICAgc2VsZi5vbGRXb3JraW5nRGlyZWN0b3J5ID0gb3MuZ2V0Y3dkKCkKKworICAgICAgICBvcy5jaGRpcihzZWxmLmNsaWVudFBhdGgpCisgICAgICAgIHByaW50ICJTeW5jcm9uaXppbmcgcDQgY2hlY2tvdXQuLi4iCisgICAgICAgIHN5c3RlbSgicDQgc3luYyAuLi4iKQorCisgICAgICAgIHNlbGYuY2hlY2soKQorCisgICAgICAgIGNvbW1pdHMgPSBbXQorICAgICAgICBmb3IgbGluZSBpbiByZWFkX3BpcGVfbGluZXMoImdpdCByZXYtbGlzdCAtLW5vLW1lcmdlcyAlcy4uJXMiICUgKHNlbGYub3JpZ2luLCBzZWxmLm1hc3RlcikpOgorICAgICAgICAgICAgY29tbWl0cy5hcHBlbmQobGluZS5zdHJpcCgpKQorICAgICAgICBjb21taXRzLnJldmVyc2UoKQorCisgICAgICAgIHdoaWxlIGxlbihjb21taXRzKSA+IDA6CisgICAgICAgICAgICBjb21taXQgPSBjb21taXRzWzBdCisgICAgICAgICAgICBjb21taXRzID0gY29tbWl0c1sxOl0KKyAgICAgICAgICAgIHNlbGYuYXBwbHlDb21taXQoY29tbWl0KQorICAgICAgICAgICAgaWYgbm90IHNlbGYuaW50ZXJhY3RpdmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBpZiBsZW4oY29tbWl0cykgPT0gMDoKKyAgICAgICAgICAgIHByaW50ICJBbGwgY2hhbmdlcyBhcHBsaWVkISIKKyAgICAgICAgICAgIG9zLmNoZGlyKHNlbGYub2xkV29ya2luZ0RpcmVjdG9yeSkKKworICAgICAgICAgICAgc3luYyA9IFA0U3luYygpCisgICAgICAgICAgICBzeW5jLnJ1bihbXSkKKworICAgICAgICAgICAgcmViYXNlID0gUDRSZWJhc2UoKQorICAgICAgICAgICAgcmViYXNlLnJlYmFzZSgpCisKKyAgICAgICAgcmV0dXJuIFRydWUKKworY2xhc3MgUDRTeW5jKENvbW1hbmQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQ29tbWFuZC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLm9wdGlvbnMgPSBbCisgICAgICAgICAgICAgICAgb3B0cGFyc2UubWFrZV9vcHRpb24oIi0tYnJhbmNoIiwgZGVzdD0iYnJhbmNoIiksCisgICAgICAgICAgICAgICAgb3B0cGFyc2UubWFrZV9vcHRpb24oIi0tZGV0ZWN0LWJyYW5jaGVzIiwgZGVzdD0iZGV0ZWN0QnJhbmNoZXMiLCBhY3Rpb249InN0b3JlX3RydWUiKSwKKyAgICAgICAgICAgICAgICBvcHRwYXJzZS5tYWtlX29wdGlvbigiLS1jaGFuZ2VzZmlsZSIsIGRlc3Q9ImNoYW5nZXNGaWxlIiksCisgICAgICAgICAgICAgICAgb3B0cGFyc2UubWFrZV9vcHRpb24oIi0tc2lsZW50IiwgZGVzdD0ic2lsZW50IiwgYWN0aW9uPSJzdG9yZV90cnVlIiksCisgICAgICAgICAgICAgICAgb3B0cGFyc2UubWFrZV9vcHRpb24oIi0tZGV0ZWN0LWxhYmVscyIsIGRlc3Q9ImRldGVjdExhYmVscyIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIpLAorICAgICAgICAgICAgICAgIG9wdHBhcnNlLm1ha2Vfb3B0aW9uKCItLXZlcmJvc2UiLCBkZXN0PSJ2ZXJib3NlIiwgYWN0aW9uPSJzdG9yZV90cnVlIiksCisgICAgICAgICAgICAgICAgb3B0cGFyc2UubWFrZV9vcHRpb24oIi0taW1wb3J0LWxvY2FsIiwgZGVzdD0iaW1wb3J0SW50b1JlbW90ZXMiLCBhY3Rpb249InN0b3JlX2ZhbHNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJJbXBvcnQgaW50byByZWZzL2hlYWRzLyAsIG5vdCByZWZzL3JlbW90ZXMiKSwKKyAgICAgICAgICAgICAgICBvcHRwYXJzZS5tYWtlX29wdGlvbigiLS1tYXgtY2hhbmdlcyIsIGRlc3Q9Im1heENoYW5nZXMiKSwKKyAgICAgICAgICAgICAgICBvcHRwYXJzZS5tYWtlX29wdGlvbigiLS1rZWVwLXBhdGgiLCBkZXN0PSJrZWVwUmVwb1BhdGgiLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IktlZXAgZW50aXJlIEJSQU5DSC9ESVIvU1VCRElSIHByZWZpeCBkdXJpbmcgaW1wb3J0IiksCisgICAgICAgICAgICAgICAgb3B0cGFyc2UubWFrZV9vcHRpb24oIi0tdXNlLWNsaWVudC1zcGVjIiwgZGVzdD0idXNlQ2xpZW50U3BlYyIsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iT25seSBzeW5jIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBQZXJmb3JjZSBDbGllbnQgU3BlYyIpCisgICAgICAgIF0KKyAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9ICIiIkltcG9ydHMgZnJvbSBQZXJmb3JjZSBpbnRvIGEgZ2l0IHJlcG9zaXRvcnkuXG4KKyAgICBleGFtcGxlOgorICAgIC8vZGVwb3QvbXkvcHJvamVjdC8gLS0gdG8gaW1wb3J0IHRoZSBjdXJyZW50IGhlYWQKKyAgICAvL2RlcG90L215L3Byb2plY3QvQGFsbCAtLSB0byBpbXBvcnQgZXZlcnl0aGluZworICAgIC8vZGVwb3QvbXkvcHJvamVjdC9AMSw2IC0tIHRvIGltcG9ydCBvbmx5IGZyb20gcmV2aXNpb24gMSB0byA2CisKKyAgICAoYSAuLi4gaXMgbm90IG5lZWRlZCBpbiB0aGUgcGF0aCBwNCBzcGVjaWZpY2F0aW9uLCBpdCdzIGFkZGVkIGltcGxpY2l0bHkpIiIiCisKKyAgICAgICAgc2VsZi51c2FnZSArPSAiIC8vZGVwb3QvcGF0aFtAcmV2UmFuZ2VdIgorICAgICAgICBzZWxmLnNpbGVudCA9IEZhbHNlCisgICAgICAgIHNlbGYuY3JlYXRlZEJyYW5jaGVzID0gU2V0KCkKKyAgICAgICAgc2VsZi5jb21taXR0ZWRDaGFuZ2VzID0gU2V0KCkKKyAgICAgICAgc2VsZi5icmFuY2ggPSAiIgorICAgICAgICBzZWxmLmRldGVjdEJyYW5jaGVzID0gRmFsc2UKKyAgICAgICAgc2VsZi5kZXRlY3RMYWJlbHMgPSBGYWxzZQorICAgICAgICBzZWxmLmNoYW5nZXNGaWxlID0gIiIKKyAgICAgICAgc2VsZi5zeW5jV2l0aE9yaWdpbiA9IFRydWUKKyAgICAgICAgc2VsZi52ZXJib3NlID0gRmFsc2UKKyAgICAgICAgc2VsZi5pbXBvcnRJbnRvUmVtb3RlcyA9IFRydWUKKyAgICAgICAgc2VsZi5tYXhDaGFuZ2VzID0gIiIKKyAgICAgICAgc2VsZi5pc1dpbmRvd3MgPSAocGxhdGZvcm0uc3lzdGVtKCkgPT0gIldpbmRvd3MiKQorICAgICAgICBzZWxmLmtlZXBSZXBvUGF0aCA9IEZhbHNlCisgICAgICAgIHNlbGYuZGVwb3RQYXRocyA9IE5vbmUKKyAgICAgICAgc2VsZi5wNEJyYW5jaGVzSW5HaXQgPSBbXQorICAgICAgICBzZWxmLmNsb25lRXhjbHVkZSA9IFtdCisgICAgICAgIHNlbGYudXNlQ2xpZW50U3BlYyA9IEZhbHNlCisgICAgICAgIHNlbGYuY2xpZW50U3BlY0RpcnMgPSBbXQorCisgICAgICAgIGlmIGdpdENvbmZpZygiZ2l0LXA0LnN5bmNGcm9tT3JpZ2luIikgPT0gImZhbHNlIjoKKyAgICAgICAgICAgIHNlbGYuc3luY1dpdGhPcmlnaW4gPSBGYWxzZQorCisgICAgZGVmIGV4dHJhY3RGaWxlc0Zyb21Db21taXQoc2VsZiwgY29tbWl0KToKKyAgICAgICAgc2VsZi5jbG9uZUV4Y2x1ZGUgPSBbcmUuc3ViKHIiXC5cLlwuJCIsICIiLCBwYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLmNsb25lRXhjbHVkZV0KKyAgICAgICAgZmlsZXMgPSBbXQorICAgICAgICBmbnVtID0gMAorICAgICAgICB3aGlsZSBjb21taXQuaGFzX2tleSgiZGVwb3RGaWxlJXMiICUgZm51bSk6CisgICAgICAgICAgICBwYXRoID0gIGNvbW1pdFsiZGVwb3RGaWxlJXMiICUgZm51bV0KKworICAgICAgICAgICAgaWYgW3AgZm9yIHAgaW4gc2VsZi5jbG9uZUV4Y2x1ZGUKKyAgICAgICAgICAgICAgICBpZiBwYXRoLnN0YXJ0c3dpdGggKHApXToKKyAgICAgICAgICAgICAgICBmb3VuZCA9IEZhbHNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZvdW5kID0gW3AgZm9yIHAgaW4gc2VsZi5kZXBvdFBhdGhzCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoIChwKV0KKyAgICAgICAgICAgIGlmIG5vdCBmb3VuZDoKKyAgICAgICAgICAgICAgICBmbnVtID0gZm51bSArIDEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBmaWxlID0ge30KKyAgICAgICAgICAgIGZpbGVbInBhdGgiXSA9IHBhdGgKKyAgICAgICAgICAgIGZpbGVbInJldiJdID0gY29tbWl0WyJyZXYlcyIgJSBmbnVtXQorICAgICAgICAgICAgZmlsZVsiYWN0aW9uIl0gPSBjb21taXRbImFjdGlvbiVzIiAlIGZudW1dCisgICAgICAgICAgICBmaWxlWyJ0eXBlIl0gPSBjb21taXRbInR5cGUlcyIgJSBmbnVtXQorICAgICAgICAgICAgZmlsZXMuYXBwZW5kKGZpbGUpCisgICAgICAgICAgICBmbnVtID0gZm51bSArIDEKKyAgICAgICAgcmV0dXJuIGZpbGVzCisKKyAgICBkZWYgc3RyaXBSZXBvUGF0aChzZWxmLCBwYXRoLCBwcmVmaXhlcyk6CisgICAgICAgIGlmIHNlbGYua2VlcFJlcG9QYXRoOgorICAgICAgICAgICAgcHJlZml4ZXMgPSBbcmUuc3ViKCJeKC8vW14vXSsvKS4qIiwgcidcMScsIHByZWZpeGVzWzBdKV0KKworICAgICAgICBmb3IgcCBpbiBwcmVmaXhlczoKKyAgICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aChwKToKKyAgICAgICAgICAgICAgICBwYXRoID0gcGF0aFtsZW4ocCk6XQorCisgICAgICAgIHJldHVybiBwYXRoCisKKyAgICBkZWYgc3BsaXRGaWxlc0ludG9CcmFuY2hlcyhzZWxmLCBjb21taXQpOgorICAgICAgICBicmFuY2hlcyA9IHt9CisgICAgICAgIGZudW0gPSAwCisgICAgICAgIHdoaWxlIGNvbW1pdC5oYXNfa2V5KCJkZXBvdEZpbGUlcyIgJSBmbnVtKToKKyAgICAgICAgICAgIHBhdGggPSAgY29tbWl0WyJkZXBvdEZpbGUlcyIgJSBmbnVtXQorICAgICAgICAgICAgZm91bmQgPSBbcCBmb3IgcCBpbiBzZWxmLmRlcG90UGF0aHMKKyAgICAgICAgICAgICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aCAocCldCisgICAgICAgICAgICBpZiBub3QgZm91bmQ6CisgICAgICAgICAgICAgICAgZm51bSA9IGZudW0gKyAxCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgZmlsZSA9IHt9CisgICAgICAgICAgICBmaWxlWyJwYXRoIl0gPSBwYXRoCisgICAgICAgICAgICBmaWxlWyJyZXYiXSA9IGNvbW1pdFsicmV2JXMiICUgZm51bV0KKyAgICAgICAgICAgIGZpbGVbImFjdGlvbiJdID0gY29tbWl0WyJhY3Rpb24lcyIgJSBmbnVtXQorICAgICAgICAgICAgZmlsZVsidHlwZSJdID0gY29tbWl0WyJ0eXBlJXMiICUgZm51bV0KKyAgICAgICAgICAgIGZudW0gPSBmbnVtICsgMQorCisgICAgICAgICAgICByZWxQYXRoID0gc2VsZi5zdHJpcFJlcG9QYXRoKHBhdGgsIHNlbGYuZGVwb3RQYXRocykKKworICAgICAgICAgICAgZm9yIGJyYW5jaCBpbiBzZWxmLmtub3duQnJhbmNoZXMua2V5cygpOgorCisgICAgICAgICAgICAgICAgIyBhZGQgYSB0cmFpbGluZyBzbGFzaCBzbyB0aGF0IGEgY29tbWl0IGludG8gcXQvNC4yZm9vIGRvZXNuJ3QgZW5kIHVwIGluIHF0LzQuMgorICAgICAgICAgICAgICAgIGlmIHJlbFBhdGguc3RhcnRzd2l0aChicmFuY2ggKyAiLyIpOgorICAgICAgICAgICAgICAgICAgICBpZiBicmFuY2ggbm90IGluIGJyYW5jaGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmNoZXNbYnJhbmNoXSA9IFtdCisgICAgICAgICAgICAgICAgICAgIGJyYW5jaGVzW2JyYW5jaF0uYXBwZW5kKGZpbGUpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgcmV0dXJuIGJyYW5jaGVzCisKKyAgICAjIyBTaG91bGQgbW92ZSB0aGlzIG91dCwgZG9lc24ndCB1c2UgU0VMRi4KKyAgICBkZWYgcmVhZFA0RmlsZXMoc2VsZiwgZmlsZXMpOgorICAgICAgICBmaWxlc0ZvckNvbW1pdCA9IFtdCisgICAgICAgIGZpbGVzVG9SZWFkID0gW10KKworICAgICAgICBmb3IgZiBpbiBmaWxlczoKKyAgICAgICAgICAgIGluY2x1ZGVGaWxlID0gVHJ1ZQorICAgICAgICAgICAgZm9yIHZhbCBpbiBzZWxmLmNsaWVudFNwZWNEaXJzOgorICAgICAgICAgICAgICAgIGlmIGZbJ3BhdGgnXS5zdGFydHN3aXRoKHZhbFswXSk6CisgICAgICAgICAgICAgICAgICAgIGlmIHZhbFsxXSA8PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUZpbGUgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBpZiBpbmNsdWRlRmlsZToKKyAgICAgICAgICAgICAgICBmaWxlc0ZvckNvbW1pdC5hcHBlbmQoZikKKyAgICAgICAgICAgICAgICBpZiBmWydhY3Rpb24nXSAhPSAnZGVsZXRlJzoKKyAgICAgICAgICAgICAgICAgICAgZmlsZXNUb1JlYWQuYXBwZW5kKGYpCisKKyAgICAgICAgZmlsZWRhdGEgPSBbXQorICAgICAgICBpZiBsZW4oZmlsZXNUb1JlYWQpID4gMDoKKyAgICAgICAgICAgIGZpbGVkYXRhID0gcDRDbWRMaXN0KCcteCAtIHByaW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPSdcbicuam9pbihbJyVzIyVzJyAlIChmWydwYXRoJ10sIGZbJ3JldiddKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZiBpbiBmaWxlc1RvUmVhZF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW5fbW9kZT0ndysnKQorCisgICAgICAgICAgICBpZiAicDRFeGl0Q29kZSIgaW4gZmlsZWRhdGFbMF06CisgICAgICAgICAgICAgICAgZGllKCJQcm9ibGVtcyBleGVjdXRpbmcgcDQuIEVycm9yOiBbJWRdLiIKKyAgICAgICAgICAgICAgICAgICAgJSAoZmlsZWRhdGFbMF1bJ3A0RXhpdENvZGUnXSkpOworCisgICAgICAgIGogPSAwOworICAgICAgICBjb250ZW50cyA9IHt9CisgICAgICAgIHdoaWxlIGogPCBsZW4oZmlsZWRhdGEpOgorICAgICAgICAgICAgc3RhdCA9IGZpbGVkYXRhW2pdCisgICAgICAgICAgICBqICs9IDEKKyAgICAgICAgICAgIHRleHQgPSBbXTsKKyAgICAgICAgICAgIHdoaWxlIGogPCBsZW4oZmlsZWRhdGEpIGFuZCBmaWxlZGF0YVtqXVsnY29kZSddIGluICgndGV4dCcsICd1bmljb2RlJywgJ2JpbmFyeScpOgorICAgICAgICAgICAgICAgIHRleHQuYXBwZW5kKGZpbGVkYXRhW2pdWydkYXRhJ10pCisgICAgICAgICAgICAgICAgaiArPSAxCisgICAgICAgICAgICB0ZXh0ID0gJycuam9pbih0ZXh0KQorCisgICAgICAgICAgICBpZiBub3Qgc3RhdC5oYXNfa2V5KCdkZXBvdEZpbGUnKToKKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJwNCBwcmludCBmYWlscyB3aXRoOiAlc1xuIiAlIHJlcHIoc3RhdCkpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgc3RhdFsndHlwZSddIGluICgndGV4dCtrbycsICd1bmljb2RlK2tvJywgJ2JpbmFyeStrbycpOgorICAgICAgICAgICAgICAgIHRleHQgPSByZS5zdWIocicoP2kpXCQoSWR8SGVhZGVyKTpbXiRdKlwkJyxyJyRcMSQnLCB0ZXh0KQorICAgICAgICAgICAgZWxpZiBzdGF0Wyd0eXBlJ10gaW4gKCd0ZXh0K2snLCAna3RleHQnLCAna3h0ZXh0JywgJ3VuaWNvZGUraycsICdiaW5hcnkraycpOgorICAgICAgICAgICAgICAgIHRleHQgPSByZS5zdWIocicoP2kpXCQoSWR8SGVhZGVyfEF1dGhvcnxEYXRlfERhdGVUaW1lfENoYW5nZXxGaWxlfFJldmlzaW9uKTpbXiRdKlwkJyxyJyRcMSQnLCB0ZXh0KQorCisgICAgICAgICAgICBjb250ZW50c1tzdGF0WydkZXBvdEZpbGUnXV0gPSB0ZXh0CisKKyAgICAgICAgZm9yIGYgaW4gZmlsZXNGb3JDb21taXQ6CisgICAgICAgICAgICBwYXRoID0gZlsncGF0aCddCisgICAgICAgICAgICBpZiBjb250ZW50cy5oYXNfa2V5KHBhdGgpOgorICAgICAgICAgICAgICAgIGZbJ2RhdGEnXSA9IGNvbnRlbnRzW3BhdGhdCisKKyAgICAgICAgcmV0dXJuIGZpbGVzRm9yQ29tbWl0CisKKyAgICBkZWYgY29tbWl0KHNlbGYsIGRldGFpbHMsIGZpbGVzLCBicmFuY2gsIGJyYW5jaFByZWZpeGVzLCBwYXJlbnQgPSAiIik6CisgICAgICAgIGVwb2NoID0gZGV0YWlsc1sidGltZSJdCisgICAgICAgIGF1dGhvciA9IGRldGFpbHNbInVzZXIiXQorCisgICAgICAgIGlmIHNlbGYudmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJjb21taXQgaW50byAlcyIgJSBicmFuY2gKKworICAgICAgICAjIHN0YXJ0IHdpdGggcmVhZGluZyBmaWxlczsgaWYgdGhhdCBmYWlscywgd2Ugc2hvdWxkIG5vdAorICAgICAgICAjIGNyZWF0ZSBhIGNvbW1pdC4KKyAgICAgICAgbmV3X2ZpbGVzID0gW10KKyAgICAgICAgZm9yIGYgaW4gZmlsZXM6CisgICAgICAgICAgICBpZiBbcCBmb3IgcCBpbiBicmFuY2hQcmVmaXhlcyBpZiBmWydwYXRoJ10uc3RhcnRzd2l0aChwKV06CisgICAgICAgICAgICAgICAgbmV3X2ZpbGVzLmFwcGVuZCAoZikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiSWdub3JpbmcgZmlsZSBvdXRzaWRlIG9mIHByZWZpeDogJXNcbiIgJSBwYXRoKQorICAgICAgICBmaWxlcyA9IHNlbGYucmVhZFA0RmlsZXMobmV3X2ZpbGVzKQorCisgICAgICAgIHNlbGYuZ2l0U3RyZWFtLndyaXRlKCJjb21taXQgJXNcbiIgJSBicmFuY2gpCisjICAgICAgICBnaXRTdHJlYW0ud3JpdGUoIm1hcmsgOiVzXG4iICUgZGV0YWlsc1siY2hhbmdlIl0pCisgICAgICAgIHNlbGYuY29tbWl0dGVkQ2hhbmdlcy5hZGQoaW50KGRldGFpbHNbImNoYW5nZSJdKSkKKyAgICAgICAgY29tbWl0dGVyID0gIiIKKyAgICAgICAgaWYgYXV0aG9yIG5vdCBpbiBzZWxmLnVzZXJzOgorICAgICAgICAgICAgc2VsZi5nZXRVc2VyTWFwRnJvbVBlcmZvcmNlU2VydmVyKCkKKyAgICAgICAgaWYgYXV0aG9yIGluIHNlbGYudXNlcnM6CisgICAgICAgICAgICBjb21taXR0ZXIgPSAiJXMgJXMgJXMiICUgKHNlbGYudXNlcnNbYXV0aG9yXSwgZXBvY2gsIHNlbGYudHopCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb21taXR0ZXIgPSAiJXMgPGFAYj4gJXMgJXMiICUgKGF1dGhvciwgZXBvY2gsIHNlbGYudHopCisKKyAgICAgICAgc2VsZi5naXRTdHJlYW0ud3JpdGUoImNvbW1pdHRlciAlc1xuIiAlIGNvbW1pdHRlcikKKworICAgICAgICBzZWxmLmdpdFN0cmVhbS53cml0ZSgiZGF0YSA8PEVPVFxuIikKKyAgICAgICAgc2VsZi5naXRTdHJlYW0ud3JpdGUoZGV0YWlsc1siZGVzYyJdKQorICAgICAgICBzZWxmLmdpdFN0cmVhbS53cml0ZSgiXG5bZ2l0LXA0OiBkZXBvdC1wYXRocyA9IFwiJXNcIjogY2hhbmdlID0gJXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKCcsJy5qb2luIChicmFuY2hQcmVmaXhlcyksIGRldGFpbHNbImNoYW5nZSJdKSkKKyAgICAgICAgaWYgbGVuKGRldGFpbHNbJ29wdGlvbnMnXSkgPiAwOgorICAgICAgICAgICAgc2VsZi5naXRTdHJlYW0ud3JpdGUoIjogb3B0aW9ucyA9ICVzIiAlIGRldGFpbHNbJ29wdGlvbnMnXSkKKyAgICAgICAgc2VsZi5naXRTdHJlYW0ud3JpdGUoIl1cbkVPVFxuXG4iKQorCisgICAgICAgIGlmIGxlbihwYXJlbnQpID4gMDoKKyAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAicGFyZW50ICVzIiAlIHBhcmVudAorICAgICAgICAgICAgc2VsZi5naXRTdHJlYW0ud3JpdGUoImZyb20gJXNcbiIgJSBwYXJlbnQpCisKKyAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXM6CisgICAgICAgICAgICBpZiBmaWxlWyJ0eXBlIl0gPT0gImFwcGxlIjoKKyAgICAgICAgICAgICAgICBwcmludCAiXG5maWxlICVzIGlzIGEgc3RyYW5nZSBhcHBsZSBmaWxlIHRoYXQgZm9ya3MuIElnbm9yaW5nISIgJSBmaWxlWydwYXRoJ10KKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICByZWxQYXRoID0gc2VsZi5zdHJpcFJlcG9QYXRoKGZpbGVbJ3BhdGgnXSwgYnJhbmNoUHJlZml4ZXMpCisgICAgICAgICAgICBpZiBmaWxlWyJhY3Rpb24iXSA9PSAiZGVsZXRlIjoKKyAgICAgICAgICAgICAgICBzZWxmLmdpdFN0cmVhbS53cml0ZSgiRCAlc1xuIiAlIHJlbFBhdGgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRhdGEgPSBmaWxlWydkYXRhJ10KKworICAgICAgICAgICAgICAgIG1vZGUgPSAiNjQ0IgorICAgICAgICAgICAgICAgIGlmIGlzUDRFeGVjKGZpbGVbInR5cGUiXSk6CisgICAgICAgICAgICAgICAgICAgIG1vZGUgPSAiNzU1IgorICAgICAgICAgICAgICAgIGVsaWYgZmlsZVsidHlwZSJdID09ICJzeW1saW5rIjoKKyAgICAgICAgICAgICAgICAgICAgbW9kZSA9ICIxMjAwMDAiCisgICAgICAgICAgICAgICAgICAgICMgcDQgcHJpbnQgb24gYSBzeW1saW5rIGNvbnRhaW5zICJ0YXJnZXRcbiIsIHNvIHN0cmlwIGl0IG9mZgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YVs6LTFdCisKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmlzV2luZG93cyBhbmQgZmlsZVsidHlwZSJdLmVuZHN3aXRoKCJ0ZXh0Iik6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoIlxyXG4iLCAiXG4iKQorCisgICAgICAgICAgICAgICAgc2VsZi5naXRTdHJlYW0ud3JpdGUoIk0gJXMgaW5saW5lICVzXG4iICUgKG1vZGUsIHJlbFBhdGgpKQorICAgICAgICAgICAgICAgIHNlbGYuZ2l0U3RyZWFtLndyaXRlKCJkYXRhICVzXG4iICUgbGVuKGRhdGEpKQorICAgICAgICAgICAgICAgIHNlbGYuZ2l0U3RyZWFtLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgc2VsZi5naXRTdHJlYW0ud3JpdGUoIlxuIikKKworICAgICAgICBzZWxmLmdpdFN0cmVhbS53cml0ZSgiXG4iKQorCisgICAgICAgIGNoYW5nZSA9IGludChkZXRhaWxzWyJjaGFuZ2UiXSkKKworICAgICAgICBpZiBzZWxmLmxhYmVscy5oYXNfa2V5KGNoYW5nZSk6CisgICAgICAgICAgICBsYWJlbCA9IHNlbGYubGFiZWxzW2NoYW5nZV0KKyAgICAgICAgICAgIGxhYmVsRGV0YWlscyA9IGxhYmVsWzBdCisgICAgICAgICAgICBsYWJlbFJldmlzaW9ucyA9IGxhYmVsWzFdCisgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIkNoYW5nZSAlcyBpcyBsYWJlbGxlZCAlcyIgJSAoY2hhbmdlLCBsYWJlbERldGFpbHMpCisKKyAgICAgICAgICAgIGZpbGVzID0gcDRDbWRMaXN0KCJmaWxlcyAiICsgJyAnLmpvaW4gKFsiJXMuLi5AJXMiICUgKHAsIGNoYW5nZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcCBpbiBicmFuY2hQcmVmaXhlc10pKQorCisgICAgICAgICAgICBpZiBsZW4oZmlsZXMpID09IGxlbihsYWJlbFJldmlzaW9ucyk6CisKKyAgICAgICAgICAgICAgICBjbGVhbmVkRmlsZXMgPSB7fQorICAgICAgICAgICAgICAgIGZvciBpbmZvIGluIGZpbGVzOgorICAgICAgICAgICAgICAgICAgICBpZiBpbmZvWyJhY3Rpb24iXSA9PSAiZGVsZXRlIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGNsZWFuZWRGaWxlc1tpbmZvWyJkZXBvdEZpbGUiXV0gPSBpbmZvWyJyZXYiXQorCisgICAgICAgICAgICAgICAgaWYgY2xlYW5lZEZpbGVzID09IGxhYmVsUmV2aXNpb25zOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmdpdFN0cmVhbS53cml0ZSgidGFnIHRhZ18lc1xuIiAlIGxhYmVsRGV0YWlsc1sibGFiZWwiXSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5naXRTdHJlYW0ud3JpdGUoImZyb20gJXNcbiIgJSBicmFuY2gpCisKKyAgICAgICAgICAgICAgICAgICAgb3duZXIgPSBsYWJlbERldGFpbHNbIk93bmVyIl0KKyAgICAgICAgICAgICAgICAgICAgdGFnZ2VyID0gIiIKKyAgICAgICAgICAgICAgICAgICAgaWYgYXV0aG9yIGluIHNlbGYudXNlcnM6CisgICAgICAgICAgICAgICAgICAgICAgICB0YWdnZXIgPSAiJXMgJXMgJXMiICUgKHNlbGYudXNlcnNbb3duZXJdLCBlcG9jaCwgc2VsZi50eikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhZ2dlciA9ICIlcyA8YUBiPiAlcyAlcyIgJSAob3duZXIsIGVwb2NoLCBzZWxmLnR6KQorICAgICAgICAgICAgICAgICAgICBzZWxmLmdpdFN0cmVhbS53cml0ZSgidGFnZ2VyICVzXG4iICUgdGFnZ2VyKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmdpdFN0cmVhbS53cml0ZSgiZGF0YSA8PEVPVFxuIikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5naXRTdHJlYW0ud3JpdGUobGFiZWxEZXRhaWxzWyJEZXNjcmlwdGlvbiJdKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmdpdFN0cmVhbS53cml0ZSgiRU9UXG5cbiIpCisKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5zaWxlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAoIlRhZyAlcyBkb2VzIG5vdCBtYXRjaCB3aXRoIGNoYW5nZSAlczogZmlsZXMgZG8gbm90IG1hdGNoLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChsYWJlbERldGFpbHNbImxhYmVsIl0sIGNoYW5nZSkpCisKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuc2lsZW50OgorICAgICAgICAgICAgICAgICAgICBwcmludCAoIlRhZyAlcyBkb2VzIG5vdCBtYXRjaCB3aXRoIGNoYW5nZSAlczogZmlsZSBjb3VudCBpcyBkaWZmZXJlbnQuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAobGFiZWxEZXRhaWxzWyJsYWJlbCJdLCBjaGFuZ2UpKQorCisgICAgZGVmIGdldFVzZXJDYWNoZUZpbGVuYW1lKHNlbGYpOgorICAgICAgICBob21lID0gb3MuZW52aXJvbi5nZXQoIkhPTUUiLCBvcy5lbnZpcm9uLmdldCgiVVNFUlBST0ZJTEUiKSkKKyAgICAgICAgcmV0dXJuIGhvbWUgKyAiLy5naXRwNC11c2VyY2FjaGUudHh0IgorCisgICAgZGVmIGdldFVzZXJNYXBGcm9tUGVyZm9yY2VTZXJ2ZXIoc2VsZik6CisgICAgICAgIGlmIHNlbGYudXNlck1hcEZyb21QZXJmb3JjZVNlcnZlcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnVzZXJzID0ge30KKworICAgICAgICBmb3Igb3V0cHV0IGluIHA0Q21kTGlzdCgidXNlcnMiKToKKyAgICAgICAgICAgIGlmIG5vdCBvdXRwdXQuaGFzX2tleSgiVXNlciIpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLnVzZXJzW291dHB1dFsiVXNlciJdXSA9IG91dHB1dFsiRnVsbE5hbWUiXSArICIgPCIgKyBvdXRwdXRbIkVtYWlsIl0gKyAiPiIKKworCisgICAgICAgIHMgPSAnJworICAgICAgICBmb3IgKGtleSwgdmFsKSBpbiBzZWxmLnVzZXJzLml0ZW1zKCk6CisgICAgICAgICAgICBzICs9ICIlc1x0JXNcbiIgJSAoa2V5LCB2YWwpCisKKyAgICAgICAgb3BlbihzZWxmLmdldFVzZXJDYWNoZUZpbGVuYW1lKCksICJ3YiIpLndyaXRlKHMpCisgICAgICAgIHNlbGYudXNlck1hcEZyb21QZXJmb3JjZVNlcnZlciA9IFRydWUKKworICAgIGRlZiBsb2FkVXNlck1hcEZyb21DYWNoZShzZWxmKToKKyAgICAgICAgc2VsZi51c2VycyA9IHt9CisgICAgICAgIHNlbGYudXNlck1hcEZyb21QZXJmb3JjZVNlcnZlciA9IEZhbHNlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNhY2hlID0gb3BlbihzZWxmLmdldFVzZXJDYWNoZUZpbGVuYW1lKCksICJyYiIpCisgICAgICAgICAgICBsaW5lcyA9IGNhY2hlLnJlYWRsaW5lcygpCisgICAgICAgICAgICBjYWNoZS5jbG9zZSgpCisgICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgICAgICBlbnRyeSA9IGxpbmUuc3RyaXAoKS5zcGxpdCgiXHQiKQorICAgICAgICAgICAgICAgIHNlbGYudXNlcnNbZW50cnlbMF1dID0gZW50cnlbMV0KKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBzZWxmLmdldFVzZXJNYXBGcm9tUGVyZm9yY2VTZXJ2ZXIoKQorCisgICAgZGVmIGdldExhYmVscyhzZWxmKToKKyAgICAgICAgc2VsZi5sYWJlbHMgPSB7fQorCisgICAgICAgIGwgPSBwNENtZExpc3QoImxhYmVscyAlcy4uLiIgJSAnICcuam9pbiAoc2VsZi5kZXBvdFBhdGhzKSkKKyAgICAgICAgaWYgbGVuKGwpID4gMCBhbmQgbm90IHNlbGYuc2lsZW50OgorICAgICAgICAgICAgcHJpbnQgIkZpbmRpbmcgZmlsZXMgYmVsb25naW5nIHRvIGxhYmVscyBpbiAlcyIgJSBgc2VsZi5kZXBvdFBhdGhzYAorCisgICAgICAgIGZvciBvdXRwdXQgaW4gbDoKKyAgICAgICAgICAgIGxhYmVsID0gb3V0cHV0WyJsYWJlbCJdCisgICAgICAgICAgICByZXZpc2lvbnMgPSB7fQorICAgICAgICAgICAgbmV3ZXN0Q2hhbmdlID0gMAorICAgICAgICAgICAgaWYgc2VsZi52ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICJRdWVyeWluZyBmaWxlcyBmb3IgbGFiZWwgJXMiICUgbGFiZWwKKyAgICAgICAgICAgIGZvciBmaWxlIGluIHA0Q21kTGlzdCgiZmlsZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgICcgJy5qb2luIChbIiVzLi4uQCVzIiAlIChwLCBsYWJlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBwIGluIHNlbGYuZGVwb3RQYXRoc10pKToKKyAgICAgICAgICAgICAgICByZXZpc2lvbnNbZmlsZVsiZGVwb3RGaWxlIl1dID0gZmlsZVsicmV2Il0KKyAgICAgICAgICAgICAgICBjaGFuZ2UgPSBpbnQoZmlsZVsiY2hhbmdlIl0pCisgICAgICAgICAgICAgICAgaWYgY2hhbmdlID4gbmV3ZXN0Q2hhbmdlOgorICAgICAgICAgICAgICAgICAgICBuZXdlc3RDaGFuZ2UgPSBjaGFuZ2UKKworICAgICAgICAgICAgc2VsZi5sYWJlbHNbbmV3ZXN0Q2hhbmdlXSA9IFtvdXRwdXQsIHJldmlzaW9uc10KKworICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiTGFiZWwgY2hhbmdlczogJXMiICUgc2VsZi5sYWJlbHMua2V5cygpCisKKyAgICBkZWYgZ3Vlc3NQcm9qZWN0TmFtZShzZWxmKToKKyAgICAgICAgZm9yIHAgaW4gc2VsZi5kZXBvdFBhdGhzOgorICAgICAgICAgICAgaWYgcC5lbmRzd2l0aCgiLyIpOgorICAgICAgICAgICAgICAgIHAgPSBwWzotMV0KKyAgICAgICAgICAgIHAgPSBwW3Auc3RyaXAoKS5yZmluZCgiLyIpICsgMTpdCisgICAgICAgICAgICBpZiBub3QgcC5lbmRzd2l0aCgiLyIpOgorICAgICAgICAgICAgICAgcCArPSAiLyIKKyAgICAgICAgICAgIHJldHVybiBwCisKKyAgICBkZWYgZ2V0QnJhbmNoTWFwcGluZyhzZWxmKToKKyAgICAgICAgbG9zdEFuZEZvdW5kQnJhbmNoZXMgPSBzZXQoKQorCisgICAgICAgIGZvciBpbmZvIGluIHA0Q21kTGlzdCgiYnJhbmNoZXMiKToKKyAgICAgICAgICAgIGRldGFpbHMgPSBwNENtZCgiYnJhbmNoIC1vICVzIiAlIGluZm9bImJyYW5jaCJdKQorICAgICAgICAgICAgdmlld0lkeCA9IDAKKyAgICAgICAgICAgIHdoaWxlIGRldGFpbHMuaGFzX2tleSgiVmlldyVzIiAlIHZpZXdJZHgpOgorICAgICAgICAgICAgICAgIHBhdGhzID0gZGV0YWlsc1siVmlldyVzIiAlIHZpZXdJZHhdLnNwbGl0KCIgIikKKyAgICAgICAgICAgICAgICB2aWV3SWR4ID0gdmlld0lkeCArIDEKKyAgICAgICAgICAgICAgICAjIHJlcXVpcmUgc3RhbmRhcmQgLy9kZXBvdC9mb28vLi4uIC8vZGVwb3QvYmFyLy4uLiBtYXBwaW5nCisgICAgICAgICAgICAgICAgaWYgbGVuKHBhdGhzKSAhPSAyIG9yIG5vdCBwYXRoc1swXS5lbmRzd2l0aCgiLy4uLiIpIG9yIG5vdCBwYXRoc1sxXS5lbmRzd2l0aCgiLy4uLiIpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHNvdXJjZSA9IHBhdGhzWzBdCisgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gPSBwYXRoc1sxXQorICAgICAgICAgICAgICAgICMjIEhBQ0sKKyAgICAgICAgICAgICAgICBpZiBzb3VyY2Uuc3RhcnRzd2l0aChzZWxmLmRlcG90UGF0aHNbMF0pIGFuZCBkZXN0aW5hdGlvbi5zdGFydHN3aXRoKHNlbGYuZGVwb3RQYXRoc1swXSk6CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IHNvdXJjZVtsZW4oc2VsZi5kZXBvdFBhdGhzWzBdKTotNF0KKyAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbltsZW4oc2VsZi5kZXBvdFBhdGhzWzBdKTotNF0KKworICAgICAgICAgICAgICAgICAgICBpZiBkZXN0aW5hdGlvbiBpbiBzZWxmLmtub3duQnJhbmNoZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5zaWxlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgInA0IGJyYW5jaCAlcyBkZWZpbmVzIGEgbWFwcGluZyBmcm9tICVzIHRvICVzIiAlIChpbmZvWyJicmFuY2giXSwgc291cmNlLCBkZXN0aW5hdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiYnV0IHRoZXJlIGV4aXN0cyBhbm90aGVyIG1hcHBpbmcgZnJvbSAlcyB0byAlcyBhbHJlYWR5ISIgJSAoc2VsZi5rbm93bkJyYW5jaGVzW2Rlc3RpbmF0aW9uXSwgZGVzdGluYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgICAgIHNlbGYua25vd25CcmFuY2hlc1tkZXN0aW5hdGlvbl0gPSBzb3VyY2UKKworICAgICAgICAgICAgICAgICAgICBsb3N0QW5kRm91bmRCcmFuY2hlcy5kaXNjYXJkKGRlc3RpbmF0aW9uKQorCisgICAgICAgICAgICAgICAgICAgIGlmIHNvdXJjZSBub3QgaW4gc2VsZi5rbm93bkJyYW5jaGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9zdEFuZEZvdW5kQnJhbmNoZXMuYWRkKHNvdXJjZSkKKworCisgICAgICAgIGZvciBicmFuY2ggaW4gbG9zdEFuZEZvdW5kQnJhbmNoZXM6CisgICAgICAgICAgICBzZWxmLmtub3duQnJhbmNoZXNbYnJhbmNoXSA9IGJyYW5jaAorCisgICAgZGVmIGdldEJyYW5jaE1hcHBpbmdGcm9tR2l0QnJhbmNoZXMoc2VsZik6CisgICAgICAgIGJyYW5jaGVzID0gcDRCcmFuY2hlc0luR2l0KHNlbGYuaW1wb3J0SW50b1JlbW90ZXMpCisgICAgICAgIGZvciBicmFuY2ggaW4gYnJhbmNoZXMua2V5cygpOgorICAgICAgICAgICAgaWYgYnJhbmNoID09ICJtYXN0ZXIiOgorICAgICAgICAgICAgICAgIGJyYW5jaCA9ICJtYWluIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBicmFuY2ggPSBicmFuY2hbbGVuKHNlbGYucHJvamVjdE5hbWUpOl0KKyAgICAgICAgICAgIHNlbGYua25vd25CcmFuY2hlc1ticmFuY2hdID0gYnJhbmNoCisKKyAgICBkZWYgbGlzdEV4aXN0aW5nUDRHaXRCcmFuY2hlcyhzZWxmKToKKyAgICAgICAgIyBicmFuY2hlcyBob2xkcyBtYXBwaW5nIGZyb20gbmFtZSB0byBjb21taXQKKyAgICAgICAgYnJhbmNoZXMgPSBwNEJyYW5jaGVzSW5HaXQoc2VsZi5pbXBvcnRJbnRvUmVtb3RlcykKKyAgICAgICAgc2VsZi5wNEJyYW5jaGVzSW5HaXQgPSBicmFuY2hlcy5rZXlzKCkKKyAgICAgICAgZm9yIGJyYW5jaCBpbiBicmFuY2hlcy5rZXlzKCk6CisgICAgICAgICAgICBzZWxmLmluaXRpYWxQYXJlbnRzW3NlbGYucmVmUHJlZml4ICsgYnJhbmNoXSA9IGJyYW5jaGVzW2JyYW5jaF0KKworICAgIGRlZiB1cGRhdGVPcHRpb25EaWN0KHNlbGYsIGQpOgorICAgICAgICBvcHRpb25fa2V5cyA9IHt9CisgICAgICAgIGlmIHNlbGYua2VlcFJlcG9QYXRoOgorICAgICAgICAgICAgb3B0aW9uX2tleXNbJ2tlZXBSZXBvUGF0aCddID0gMQorCisgICAgICAgIGRbIm9wdGlvbnMiXSA9ICcgJy5qb2luKHNvcnRlZChvcHRpb25fa2V5cy5rZXlzKCkpKQorCisgICAgZGVmIHJlYWRPcHRpb25zKHNlbGYsIGQpOgorICAgICAgICBzZWxmLmtlZXBSZXBvUGF0aCA9IChkLmhhc19rZXkoJ29wdGlvbnMnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgKCdrZWVwUmVwb1BhdGgnIGluIGRbJ29wdGlvbnMnXSkpCisKKyAgICBkZWYgZ2l0UmVmRm9yQnJhbmNoKHNlbGYsIGJyYW5jaCk6CisgICAgICAgIGlmIGJyYW5jaCA9PSAibWFpbiI6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5yZWZQcmVmaXggKyAibWFzdGVyIgorCisgICAgICAgIGlmIGxlbihicmFuY2gpIDw9IDA6CisgICAgICAgICAgICByZXR1cm4gYnJhbmNoCisKKyAgICAgICAgcmV0dXJuIHNlbGYucmVmUHJlZml4ICsgc2VsZi5wcm9qZWN0TmFtZSArIGJyYW5jaAorCisgICAgZGVmIGdpdENvbW1pdEJ5UDRDaGFuZ2Uoc2VsZiwgcmVmLCBjaGFuZ2UpOgorICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAibG9va2luZyBpbiByZWYgIiArIHJlZiArICIgZm9yIGNoYW5nZSAlcyB1c2luZyBiaXNlY3QuLi4iICUgY2hhbmdlCisKKyAgICAgICAgZWFybGllc3RDb21taXQgPSAiIgorICAgICAgICBsYXRlc3RDb21taXQgPSBwYXJzZVJldmlzaW9uKHJlZikKKworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgaWYgc2VsZi52ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICJ0cnlpbmc6IGVhcmxpZXN0ICVzIGxhdGVzdCAlcyIgJSAoZWFybGllc3RDb21taXQsIGxhdGVzdENvbW1pdCkKKyAgICAgICAgICAgIG5leHQgPSByZWFkX3BpcGUoImdpdCByZXYtbGlzdCAtLWJpc2VjdCAlcyAlcyIgJSAobGF0ZXN0Q29tbWl0LCBlYXJsaWVzdENvbW1pdCkpLnN0cmlwKCkKKyAgICAgICAgICAgIGlmIGxlbihuZXh0KSA9PSAwOgorICAgICAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgImFyZ2giCisgICAgICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAgICAgICBsb2cgPSBleHRyYWN0TG9nTWVzc2FnZUZyb21HaXRDb21taXQobmV4dCkKKyAgICAgICAgICAgIHNldHRpbmdzID0gZXh0cmFjdFNldHRpbmdzR2l0TG9nKGxvZykKKyAgICAgICAgICAgIGN1cnJlbnRDaGFuZ2UgPSBpbnQoc2V0dGluZ3NbJ2NoYW5nZSddKQorICAgICAgICAgICAgaWYgc2VsZi52ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICJjdXJyZW50IGNoYW5nZSAlcyIgJSBjdXJyZW50Q2hhbmdlCisKKyAgICAgICAgICAgIGlmIGN1cnJlbnRDaGFuZ2UgPT0gY2hhbmdlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgImZvdW5kICVzIiAlIG5leHQKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV4dAorCisgICAgICAgICAgICBpZiBjdXJyZW50Q2hhbmdlIDwgY2hhbmdlOgorICAgICAgICAgICAgICAgIGVhcmxpZXN0Q29tbWl0ID0gIl4lcyIgJSBuZXh0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxhdGVzdENvbW1pdCA9ICIlcyIgJSBuZXh0CisKKyAgICAgICAgcmV0dXJuICIiCisKKyAgICBkZWYgaW1wb3J0TmV3QnJhbmNoKHNlbGYsIGJyYW5jaCwgbWF4Q2hhbmdlKToKKyAgICAgICAgIyBtYWtlIGZhc3QtaW1wb3J0IGZsdXNoIGFsbCBjaGFuZ2VzIHRvIGRpc2sgYW5kIHVwZGF0ZSB0aGUgcmVmcyB1c2luZyB0aGUgY2hlY2twb2ludAorICAgICAgICAjIGNvbW1hbmQgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgdGhlIGJyYW5jaCBwYXJlbnQgaW4gdGhlIGdpdCBoaXN0b3J5CisgICAgICAgIHNlbGYuZ2l0U3RyZWFtLndyaXRlKCJjaGVja3BvaW50XG5cbiIpOworICAgICAgICBzZWxmLmdpdFN0cmVhbS5mbHVzaCgpOworICAgICAgICBicmFuY2hQcmVmaXggPSBzZWxmLmRlcG90UGF0aHNbMF0gKyBicmFuY2ggKyAiLyIKKyAgICAgICAgcmFuZ2UgPSAiQDEsJXMiICUgbWF4Q2hhbmdlCisgICAgICAgICNwcmludCAicHJlZml4IiArIGJyYW5jaFByZWZpeAorICAgICAgICBjaGFuZ2VzID0gcDRDaGFuZ2VzRm9yUGF0aHMoW2JyYW5jaFByZWZpeF0sIHJhbmdlKQorICAgICAgICBpZiBsZW4oY2hhbmdlcykgPD0gMDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBmaXJzdENoYW5nZSA9IGNoYW5nZXNbMF0KKyAgICAgICAgI3ByaW50ICJmaXJzdCBjaGFuZ2UgaW4gYnJhbmNoOiAlcyIgJSBmaXJzdENoYW5nZQorICAgICAgICBzb3VyY2VCcmFuY2ggPSBzZWxmLmtub3duQnJhbmNoZXNbYnJhbmNoXQorICAgICAgICBzb3VyY2VEZXBvdFBhdGggPSBzZWxmLmRlcG90UGF0aHNbMF0gKyBzb3VyY2VCcmFuY2gKKyAgICAgICAgc291cmNlUmVmID0gc2VsZi5naXRSZWZGb3JCcmFuY2goc291cmNlQnJhbmNoKQorICAgICAgICAjcHJpbnQgInNvdXJjZSAiICsgc291cmNlQnJhbmNoCisKKyAgICAgICAgYnJhbmNoUGFyZW50Q2hhbmdlID0gaW50KHA0Q21kKCJjaGFuZ2VzIC1tIDEgJXMuLi5AMSwlcyIgJSAoc291cmNlRGVwb3RQYXRoLCBmaXJzdENoYW5nZSkpWyJjaGFuZ2UiXSkKKyAgICAgICAgI3ByaW50ICJicmFuY2ggcGFyZW50OiAlcyIgJSBicmFuY2hQYXJlbnRDaGFuZ2UKKyAgICAgICAgZ2l0UGFyZW50ID0gc2VsZi5naXRDb21taXRCeVA0Q2hhbmdlKHNvdXJjZVJlZiwgYnJhbmNoUGFyZW50Q2hhbmdlKQorICAgICAgICBpZiBsZW4oZ2l0UGFyZW50KSA+IDA6CisgICAgICAgICAgICBzZWxmLmluaXRpYWxQYXJlbnRzW3NlbGYuZ2l0UmVmRm9yQnJhbmNoKGJyYW5jaCldID0gZ2l0UGFyZW50CisgICAgICAgICAgICAjcHJpbnQgInBhcmVudCBnaXQgY29tbWl0OiAlcyIgJSBnaXRQYXJlbnQKKworICAgICAgICBzZWxmLmltcG9ydENoYW5nZXMoY2hhbmdlcykKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBpbXBvcnRDaGFuZ2VzKHNlbGYsIGNoYW5nZXMpOgorICAgICAgICBjbnQgPSAxCisgICAgICAgIGZvciBjaGFuZ2UgaW4gY2hhbmdlczoKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gcDRDbWQoImRlc2NyaWJlICVzIiAlIGNoYW5nZSkKKyAgICAgICAgICAgIHNlbGYudXBkYXRlT3B0aW9uRGljdChkZXNjcmlwdGlvbikKKworICAgICAgICAgICAgaWYgbm90IHNlbGYuc2lsZW50OgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlxySW1wb3J0aW5nIHJldmlzaW9uICVzICglcyUlKSIgJSAoY2hhbmdlLCBjbnQgKiAxMDAgLyBsZW4oY2hhbmdlcykpKQorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICAgICAgY250ID0gY250ICsgMQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5kZXRlY3RCcmFuY2hlczoKKyAgICAgICAgICAgICAgICAgICAgYnJhbmNoZXMgPSBzZWxmLnNwbGl0RmlsZXNJbnRvQnJhbmNoZXMoZGVzY3JpcHRpb24pCisgICAgICAgICAgICAgICAgICAgIGZvciBicmFuY2ggaW4gYnJhbmNoZXMua2V5cygpOgorICAgICAgICAgICAgICAgICAgICAgICAgIyMgSEFDSyAgLS1od24KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5jaFByZWZpeCA9IHNlbGYuZGVwb3RQYXRoc1swXSArIGJyYW5jaCArICIvIgorCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSAiIgorCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc0ZvckNvbW1pdCA9IGJyYW5jaGVzW2JyYW5jaF0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJicmFuY2ggaXMgJXMiICUgYnJhbmNoCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlZEJyYW5jaGVzLmFkZChicmFuY2gpCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGJyYW5jaCBub3QgaW4gc2VsZi5jcmVhdGVkQnJhbmNoZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVkQnJhbmNoZXMuYWRkKGJyYW5jaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBzZWxmLmtub3duQnJhbmNoZXNbYnJhbmNoXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBhcmVudCA9PSBicmFuY2g6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9ICIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbEJyYW5jaCA9IHNlbGYucHJvamVjdE5hbWUgKyBicmFuY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZnVsbEJyYW5jaCBub3QgaW4gc2VsZi5wNEJyYW5jaGVzSW5HaXQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5zaWxlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoIlxuICAgIEltcG9ydGluZyBuZXcgYnJhbmNoICVzIiAlIGZ1bGxCcmFuY2gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5pbXBvcnROZXdCcmFuY2goYnJhbmNoLCBjaGFuZ2UgLSAxKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSAiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucDRCcmFuY2hlc0luR2l0LmFwcGVuZChmdWxsQnJhbmNoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuc2lsZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCJcbiAgICBSZXN1bWluZyB3aXRoIGNoYW5nZSAlcyIgJSBjaGFuZ2UpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJwYXJlbnQgZGV0ZXJtaW5lZCB0aHJvdWdoIGtub3duIGJyYW5jaGVzOiAlcyIgJSBwYXJlbnQKKworICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmNoID0gc2VsZi5naXRSZWZGb3JCcmFuY2goYnJhbmNoKQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gc2VsZi5naXRSZWZGb3JCcmFuY2gocGFyZW50KQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgImxvb2tpbmcgZm9yIGluaXRpYWwgcGFyZW50IGZvciAlczsgY3VycmVudCBwYXJlbnQgaXMgJXMiICUgKGJyYW5jaCwgcGFyZW50KQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW4ocGFyZW50KSA9PSAwIGFuZCBicmFuY2ggaW4gc2VsZi5pbml0aWFsUGFyZW50czoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBzZWxmLmluaXRpYWxQYXJlbnRzW2JyYW5jaF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5pbml0aWFsUGFyZW50c1ticmFuY2hdCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29tbWl0KGRlc2NyaXB0aW9uLCBmaWxlc0ZvckNvbW1pdCwgYnJhbmNoLCBbYnJhbmNoUHJlZml4XSwgcGFyZW50KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGZpbGVzID0gc2VsZi5leHRyYWN0RmlsZXNGcm9tQ29tbWl0KGRlc2NyaXB0aW9uKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbW1pdChkZXNjcmlwdGlvbiwgZmlsZXMsIHNlbGYuYnJhbmNoLCBzZWxmLmRlcG90UGF0aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdGlhbFBhcmVudCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0aWFsUGFyZW50ID0gIiIKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHByaW50IHNlbGYuZ2l0RXJyb3IucmVhZCgpCisgICAgICAgICAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIGRlZiBpbXBvcnRIZWFkUmV2aXNpb24oc2VsZiwgcmV2aXNpb24pOgorICAgICAgICBwcmludCAiRG9pbmcgaW5pdGlhbCBpbXBvcnQgb2YgJXMgZnJvbSByZXZpc2lvbiAlcyBpbnRvICVzIiAlICgnICcuam9pbihzZWxmLmRlcG90UGF0aHMpLCByZXZpc2lvbiwgc2VsZi5icmFuY2gpCisKKyAgICAgICAgZGV0YWlscyA9IHsgInVzZXIiIDogImdpdCBwZXJmb3JjZSBpbXBvcnQgdXNlciIsICJ0aW1lIiA6IGludCh0aW1lLnRpbWUoKSkgfQorICAgICAgICBkZXRhaWxzWyJkZXNjIl0gPSAoIkluaXRpYWwgaW1wb3J0IG9mICVzIGZyb20gdGhlIHN0YXRlIGF0IHJldmlzaW9uICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoJyAnLmpvaW4oc2VsZi5kZXBvdFBhdGhzKSwgcmV2aXNpb24pKQorICAgICAgICBkZXRhaWxzWyJjaGFuZ2UiXSA9IHJldmlzaW9uCisgICAgICAgIG5ld2VzdFJldmlzaW9uID0gMAorCisgICAgICAgIGZpbGVDbnQgPSAwCisgICAgICAgIGZvciBpbmZvIGluIHA0Q21kTGlzdCgiZmlsZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgJyAnLmpvaW4oWyIlcy4uLiVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHAsIHJldmlzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBwIGluIHNlbGYuZGVwb3RQYXRoc10pKToKKworICAgICAgICAgICAgaWYgaW5mb1snY29kZSddID09ICdlcnJvcic6CisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgicDQgcmV0dXJuZWQgYW4gZXJyb3I6ICVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIGluZm9bJ2RhdGEnXSkKKyAgICAgICAgICAgICAgICBzeXMuZXhpdCgxKQorCisKKyAgICAgICAgICAgIGNoYW5nZSA9IGludChpbmZvWyJjaGFuZ2UiXSkKKyAgICAgICAgICAgIGlmIGNoYW5nZSA+IG5ld2VzdFJldmlzaW9uOgorICAgICAgICAgICAgICAgIG5ld2VzdFJldmlzaW9uID0gY2hhbmdlCisKKyAgICAgICAgICAgIGlmIGluZm9bImFjdGlvbiJdID09ICJkZWxldGUiOgorICAgICAgICAgICAgICAgICMgZG9uJ3QgaW5jcmVhc2UgdGhlIGZpbGUgY250LCBvdGhlcndpc2UgZGV0YWlsc1siZGVwb3RGaWxlMTIzIl0gd2lsbCBoYXZlIGdhcHMhCisgICAgICAgICAgICAgICAgI2ZpbGVDbnQgPSBmaWxlQ250ICsgMQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGZvciBwcm9wIGluIFsiZGVwb3RGaWxlIiwgInJldiIsICJhY3Rpb24iLCAidHlwZSIgXToKKyAgICAgICAgICAgICAgICBkZXRhaWxzWyIlcyVzIiAlIChwcm9wLCBmaWxlQ250KV0gPSBpbmZvW3Byb3BdCisKKyAgICAgICAgICAgIGZpbGVDbnQgPSBmaWxlQ250ICsgMQorCisgICAgICAgIGRldGFpbHNbImNoYW5nZSJdID0gbmV3ZXN0UmV2aXNpb24KKyAgICAgICAgc2VsZi51cGRhdGVPcHRpb25EaWN0KGRldGFpbHMpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY29tbWl0KGRldGFpbHMsIHNlbGYuZXh0cmFjdEZpbGVzRnJvbUNvbW1pdChkZXRhaWxzKSwgc2VsZi5icmFuY2gsIHNlbGYuZGVwb3RQYXRocykKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBwcmludCAiSU8gZXJyb3Igd2l0aCBnaXQgZmFzdC1pbXBvcnQuIElzIHlvdXIgZ2l0IHZlcnNpb24gcmVjZW50IGVub3VnaD8iCisgICAgICAgICAgICBwcmludCBzZWxmLmdpdEVycm9yLnJlYWQoKQorCisKKyAgICBkZWYgZ2V0Q2xpZW50U3BlYyhzZWxmKToKKyAgICAgICAgc3BlY0xpc3QgPSBwNENtZExpc3QoICJjbGllbnQgLW8iICkKKyAgICAgICAgdGVtcCA9IHt9CisgICAgICAgIGZvciBlbnRyeSBpbiBzcGVjTGlzdDoKKyAgICAgICAgICAgIGZvciBrLHYgaW4gZW50cnkuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYgay5zdGFydHN3aXRoKCJWaWV3Iik6CisgICAgICAgICAgICAgICAgICAgIGlmIHYuc3RhcnRzd2l0aCgnIicpOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAxCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IDAKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSB2LmZpbmQoIi4uLiIpCisgICAgICAgICAgICAgICAgICAgIHYgPSB2W3N0YXJ0OmluZGV4XQorICAgICAgICAgICAgICAgICAgICBpZiB2LnN0YXJ0c3dpdGgoIi0iKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB2WzE6XQorICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFt2XSA9IC1sZW4odikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBbdl0gPSBsZW4odikKKyAgICAgICAgc2VsZi5jbGllbnRTcGVjRGlycyA9IHRlbXAuaXRlbXMoKQorICAgICAgICBzZWxmLmNsaWVudFNwZWNEaXJzLnNvcnQoIGxhbWJkYSB4LCB5OiBhYnMoIHlbMV0gKSAtIGFicyggeFsxXSApICkKKworICAgIGRlZiBydW4oc2VsZiwgYXJncyk6CisgICAgICAgIHNlbGYuZGVwb3RQYXRocyA9IFtdCisgICAgICAgIHNlbGYuY2hhbmdlUmFuZ2UgPSAiIgorICAgICAgICBzZWxmLmluaXRpYWxQYXJlbnQgPSAiIgorICAgICAgICBzZWxmLnByZXZpb3VzRGVwb3RQYXRocyA9IFtdCisKKyAgICAgICAgIyBtYXAgZnJvbSBicmFuY2ggZGVwb3QgcGF0aCB0byBwYXJlbnQgYnJhbmNoCisgICAgICAgIHNlbGYua25vd25CcmFuY2hlcyA9IHt9CisgICAgICAgIHNlbGYuaW5pdGlhbFBhcmVudHMgPSB7fQorICAgICAgICBzZWxmLmhhc09yaWdpbiA9IG9yaWdpblA0QnJhbmNoZXNFeGlzdCgpCisgICAgICAgIGlmIG5vdCBzZWxmLnN5bmNXaXRoT3JpZ2luOgorICAgICAgICAgICAgc2VsZi5oYXNPcmlnaW4gPSBGYWxzZQorCisgICAgICAgIGlmIHNlbGYuaW1wb3J0SW50b1JlbW90ZXM6CisgICAgICAgICAgICBzZWxmLnJlZlByZWZpeCA9ICJyZWZzL3JlbW90ZXMvcDQvIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5yZWZQcmVmaXggPSAicmVmcy9oZWFkcy9wNC8iCisKKyAgICAgICAgaWYgc2VsZi5zeW5jV2l0aE9yaWdpbiBhbmQgc2VsZi5oYXNPcmlnaW46CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5zaWxlbnQ6CisgICAgICAgICAgICAgICAgcHJpbnQgIlN5bmNpbmcgd2l0aCBvcmlnaW4gZmlyc3QgYnkgY2FsbGluZyBnaXQgZmV0Y2ggb3JpZ2luIgorICAgICAgICAgICAgc3lzdGVtKCJnaXQgZmV0Y2ggb3JpZ2luIikKKworICAgICAgICBpZiBsZW4oc2VsZi5icmFuY2gpID09IDA6CisgICAgICAgICAgICBzZWxmLmJyYW5jaCA9IHNlbGYucmVmUHJlZml4ICsgIm1hc3RlciIKKyAgICAgICAgICAgIGlmIGdpdEJyYW5jaEV4aXN0cygicmVmcy9oZWFkcy9wNCIpIGFuZCBzZWxmLmltcG9ydEludG9SZW1vdGVzOgorICAgICAgICAgICAgICAgIHN5c3RlbSgiZ2l0IHVwZGF0ZS1yZWYgJXMgcmVmcy9oZWFkcy9wNCIgJSBzZWxmLmJyYW5jaCkKKyAgICAgICAgICAgICAgICBzeXN0ZW0oImdpdCBicmFuY2ggLUQgcDQiKTsKKyAgICAgICAgICAgICMgY3JlYXRlIGl0IC9hZnRlci8gaW1wb3J0aW5nLCB3aGVuIG1hc3RlciBleGlzdHMKKyAgICAgICAgICAgIGlmIG5vdCBnaXRCcmFuY2hFeGlzdHMoc2VsZi5yZWZQcmVmaXggKyAiSEVBRCIpIGFuZCBzZWxmLmltcG9ydEludG9SZW1vdGVzIGFuZCBnaXRCcmFuY2hFeGlzdHMoc2VsZi5icmFuY2gpOgorICAgICAgICAgICAgICAgIHN5c3RlbSgiZ2l0IHN5bWJvbGljLXJlZiAlc0hFQUQgJXMiICUgKHNlbGYucmVmUHJlZml4LCBzZWxmLmJyYW5jaCkpCisKKyAgICAgICAgaWYgc2VsZi51c2VDbGllbnRTcGVjIG9yIGdpdENvbmZpZygicDQudXNlY2xpZW50c3BlYyIpID09ICJ0cnVlIjoKKyAgICAgICAgICAgIHNlbGYuZ2V0Q2xpZW50U3BlYygpCisKKyAgICAgICAgIyBUT0RPOiBzaG91bGQgYWx3YXlzIGxvb2sgYXQgcHJldmlvdXMgY29tbWl0cywKKyAgICAgICAgIyBtZXJnZSB3aXRoIHByZXZpb3VzIGltcG9ydHMsIGlmIHBvc3NpYmxlLgorICAgICAgICBpZiBhcmdzID09IFtdOgorICAgICAgICAgICAgaWYgc2VsZi5oYXNPcmlnaW46CisgICAgICAgICAgICAgICAgY3JlYXRlT3JVcGRhdGVCcmFuY2hlc0Zyb21PcmlnaW4oc2VsZi5yZWZQcmVmaXgsIHNlbGYuc2lsZW50KQorICAgICAgICAgICAgc2VsZi5saXN0RXhpc3RpbmdQNEdpdEJyYW5jaGVzKCkKKworICAgICAgICAgICAgaWYgbGVuKHNlbGYucDRCcmFuY2hlc0luR2l0KSA+IDE6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuc2lsZW50OgorICAgICAgICAgICAgICAgICAgICBwcmludCAiSW1wb3J0aW5nIGZyb20vaW50byBtdWx0aXBsZSBicmFuY2hlcyIKKyAgICAgICAgICAgICAgICBzZWxmLmRldGVjdEJyYW5jaGVzID0gVHJ1ZQorCisgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgImJyYW5jaGVzOiAlcyIgJSBzZWxmLnA0QnJhbmNoZXNJbkdpdAorCisgICAgICAgICAgICBwNENoYW5nZSA9IDAKKyAgICAgICAgICAgIGZvciBicmFuY2ggaW4gc2VsZi5wNEJyYW5jaGVzSW5HaXQ6CisgICAgICAgICAgICAgICAgbG9nTXNnID0gIGV4dHJhY3RMb2dNZXNzYWdlRnJvbUdpdENvbW1pdChzZWxmLnJlZlByZWZpeCArIGJyYW5jaCkKKworICAgICAgICAgICAgICAgIHNldHRpbmdzID0gZXh0cmFjdFNldHRpbmdzR2l0TG9nKGxvZ01zZykKKworICAgICAgICAgICAgICAgIHNlbGYucmVhZE9wdGlvbnMoc2V0dGluZ3MpCisgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLmhhc19rZXkoJ2RlcG90LXBhdGhzJykKKyAgICAgICAgICAgICAgICAgICAgYW5kIHNldHRpbmdzLmhhc19rZXkgKCdjaGFuZ2UnKSk6CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZSA9IGludChzZXR0aW5nc1snY2hhbmdlJ10pICsgMQorICAgICAgICAgICAgICAgICAgICBwNENoYW5nZSA9IG1heChwNENoYW5nZSwgY2hhbmdlKQorCisgICAgICAgICAgICAgICAgICAgIGRlcG90UGF0aHMgPSBzb3J0ZWQoc2V0dGluZ3NbJ2RlcG90LXBhdGhzJ10pCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucHJldmlvdXNEZXBvdFBhdGhzID09IFtdOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmV2aW91c0RlcG90UGF0aHMgPSBkZXBvdFBhdGhzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRocyA9IFtdCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHByZXYsIGN1cikgaW4gemlwKHNlbGYucHJldmlvdXNEZXBvdFBhdGhzLCBkZXBvdFBhdGhzKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBtaW4obGVuKGN1ciksIGxlbihwcmV2KSkpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjdXJbaV0gPD4gcHJldltpXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzLmFwcGVuZCAoY3VyWzppICsgMV0pCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHJldmlvdXNEZXBvdFBhdGhzID0gcGF0aHMKKworICAgICAgICAgICAgaWYgcDRDaGFuZ2UgPiAwOgorICAgICAgICAgICAgICAgIHNlbGYuZGVwb3RQYXRocyA9IHNvcnRlZChzZWxmLnByZXZpb3VzRGVwb3RQYXRocykKKyAgICAgICAgICAgICAgICBzZWxmLmNoYW5nZVJhbmdlID0gIkAlcywjaGVhZCIgJSBwNENoYW5nZQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRldGVjdEJyYW5jaGVzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmluaXRpYWxQYXJlbnQgPSBwYXJzZVJldmlzaW9uKHNlbGYuYnJhbmNoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnNpbGVudCBhbmQgbm90IHNlbGYuZGV0ZWN0QnJhbmNoZXM6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJQZXJmb3JtaW5nIGluY3JlbWVudGFsIGltcG9ydCBpbnRvICVzIGdpdCBicmFuY2giICUgc2VsZi5icmFuY2gKKworICAgICAgICBpZiBub3Qgc2VsZi5icmFuY2guc3RhcnRzd2l0aCgicmVmcy8iKToKKyAgICAgICAgICAgIHNlbGYuYnJhbmNoID0gInJlZnMvaGVhZHMvIiArIHNlbGYuYnJhbmNoCisKKyAgICAgICAgaWYgbGVuKGFyZ3MpID09IDAgYW5kIHNlbGYuZGVwb3RQYXRoczoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnNpbGVudDoKKyAgICAgICAgICAgICAgICBwcmludCAiRGVwb3QgcGF0aHM6ICVzIiAlICcgJy5qb2luKHNlbGYuZGVwb3RQYXRocykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYuZGVwb3RQYXRocyBhbmQgc2VsZi5kZXBvdFBhdGhzICE9IGFyZ3M6CisgICAgICAgICAgICAgICAgcHJpbnQgKCJwcmV2aW91cyBpbXBvcnQgdXNlZCBkZXBvdCBwYXRoICVzIGFuZCBub3cgJXMgd2FzIHNwZWNpZmllZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBkb2Vzbid0IHdvcmshIiAlICgnICcuam9pbiAoc2VsZi5kZXBvdFBhdGhzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAnLmpvaW4gKGFyZ3MpKSkKKyAgICAgICAgICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgICAgICAgICBzZWxmLmRlcG90UGF0aHMgPSBzb3J0ZWQoYXJncykKKworICAgICAgICByZXZpc2lvbiA9ICIiCisgICAgICAgIHNlbGYudXNlcnMgPSB7fQorCisgICAgICAgIG5ld1BhdGhzID0gW10KKyAgICAgICAgZm9yIHAgaW4gc2VsZi5kZXBvdFBhdGhzOgorICAgICAgICAgICAgaWYgcC5maW5kKCJAIikgIT0gLTE6CisgICAgICAgICAgICAgICAgYXRJZHggPSBwLmluZGV4KCJAIikKKyAgICAgICAgICAgICAgICBzZWxmLmNoYW5nZVJhbmdlID0gcFthdElkeDpdCisgICAgICAgICAgICAgICAgaWYgc2VsZi5jaGFuZ2VSYW5nZSA9PSAiQGFsbCI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hhbmdlUmFuZ2UgPSAiIgorICAgICAgICAgICAgICAgIGVsaWYgJywnIG5vdCBpbiBzZWxmLmNoYW5nZVJhbmdlOgorICAgICAgICAgICAgICAgICAgICByZXZpc2lvbiA9IHNlbGYuY2hhbmdlUmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGFuZ2VSYW5nZSA9ICIiCisgICAgICAgICAgICAgICAgcCA9IHBbOmF0SWR4XQorICAgICAgICAgICAgZWxpZiBwLmZpbmQoIiMiKSAhPSAtMToKKyAgICAgICAgICAgICAgICBoYXNoSWR4ID0gcC5pbmRleCgiIyIpCisgICAgICAgICAgICAgICAgcmV2aXNpb24gPSBwW2hhc2hJZHg6XQorICAgICAgICAgICAgICAgIHAgPSBwWzpoYXNoSWR4XQorICAgICAgICAgICAgZWxpZiBzZWxmLnByZXZpb3VzRGVwb3RQYXRocyA9PSBbXToKKyAgICAgICAgICAgICAgICByZXZpc2lvbiA9ICIjaGVhZCIKKworICAgICAgICAgICAgcCA9IHJlLnN1YiAoIlwuXC5cLiQiLCAiIiwgcCkKKyAgICAgICAgICAgIGlmIG5vdCBwLmVuZHN3aXRoKCIvIik6CisgICAgICAgICAgICAgICAgcCArPSAiLyIKKworICAgICAgICAgICAgbmV3UGF0aHMuYXBwZW5kKHApCisKKyAgICAgICAgc2VsZi5kZXBvdFBhdGhzID0gbmV3UGF0aHMKKworCisgICAgICAgIHNlbGYubG9hZFVzZXJNYXBGcm9tQ2FjaGUoKQorICAgICAgICBzZWxmLmxhYmVscyA9IHt9CisgICAgICAgIGlmIHNlbGYuZGV0ZWN0TGFiZWxzOgorICAgICAgICAgICAgc2VsZi5nZXRMYWJlbHMoKTsKKworICAgICAgICBpZiBzZWxmLmRldGVjdEJyYW5jaGVzOgorICAgICAgICAgICAgIyMgRklYTUUgLSB3aGF0J3MgYSBQNCBwcm9qZWN0TmFtZSA/CisgICAgICAgICAgICBzZWxmLnByb2plY3ROYW1lID0gc2VsZi5ndWVzc1Byb2plY3ROYW1lKCkKKworICAgICAgICAgICAgaWYgc2VsZi5oYXNPcmlnaW46CisgICAgICAgICAgICAgICAgc2VsZi5nZXRCcmFuY2hNYXBwaW5nRnJvbUdpdEJyYW5jaGVzKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5nZXRCcmFuY2hNYXBwaW5nKCkKKyAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAicDQtZ2l0IGJyYW5jaGVzOiAlcyIgJSBzZWxmLnA0QnJhbmNoZXNJbkdpdAorICAgICAgICAgICAgICAgIHByaW50ICJpbml0aWFsIHBhcmVudHM6ICVzIiAlIHNlbGYuaW5pdGlhbFBhcmVudHMKKyAgICAgICAgICAgIGZvciBiIGluIHNlbGYucDRCcmFuY2hlc0luR2l0OgorICAgICAgICAgICAgICAgIGlmIGIgIT0gIm1hc3RlciI6CisKKyAgICAgICAgICAgICAgICAgICAgIyMgRklYTUUKKyAgICAgICAgICAgICAgICAgICAgYiA9IGJbbGVuKHNlbGYucHJvamVjdE5hbWUpOl0KKyAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZWRCcmFuY2hlcy5hZGQoYikKKworICAgICAgICBzZWxmLnR6ID0gIiUrMDNkJTAyZCIgJSAoLSB0aW1lLnRpbWV6b25lIC8gMzYwMCwgKCgtIHRpbWUudGltZXpvbmUgJSAzNjAwKSAvIDYwKSkKKworICAgICAgICBpbXBvcnRQcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3BlbihbImdpdCIsICJmYXN0LWltcG9ydCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpOworICAgICAgICBzZWxmLmdpdE91dHB1dCA9IGltcG9ydFByb2Nlc3Muc3Rkb3V0CisgICAgICAgIHNlbGYuZ2l0U3RyZWFtID0gaW1wb3J0UHJvY2Vzcy5zdGRpbgorICAgICAgICBzZWxmLmdpdEVycm9yID0gaW1wb3J0UHJvY2Vzcy5zdGRlcnIKKworICAgICAgICBpZiByZXZpc2lvbjoKKyAgICAgICAgICAgIHNlbGYuaW1wb3J0SGVhZFJldmlzaW9uKHJldmlzaW9uKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2hhbmdlcyA9IFtdCisKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLmNoYW5nZXNGaWxlKSA+IDA6CisgICAgICAgICAgICAgICAgb3V0cHV0ID0gb3BlbihzZWxmLmNoYW5nZXNGaWxlKS5yZWFkbGluZXMoKQorICAgICAgICAgICAgICAgIGNoYW5nZVNldCA9IFNldCgpCisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gb3V0cHV0OgorICAgICAgICAgICAgICAgICAgICBjaGFuZ2VTZXQuYWRkKGludChsaW5lKSkKKworICAgICAgICAgICAgICAgIGZvciBjaGFuZ2UgaW4gY2hhbmdlU2V0OgorICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzLmFwcGVuZChjaGFuZ2UpCisKKyAgICAgICAgICAgICAgICBjaGFuZ2VzLnNvcnQoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJHZXR0aW5nIHA0IGNoYW5nZXMgZm9yICVzLi4uJXMiICUgKCcsICcuam9pbihzZWxmLmRlcG90UGF0aHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoYW5nZVJhbmdlKQorICAgICAgICAgICAgICAgIGNoYW5nZXMgPSBwNENoYW5nZXNGb3JQYXRocyhzZWxmLmRlcG90UGF0aHMsIHNlbGYuY2hhbmdlUmFuZ2UpCisKKyAgICAgICAgICAgICAgICBpZiBsZW4oc2VsZi5tYXhDaGFuZ2VzKSA+IDA6CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgPSBjaGFuZ2VzWzptaW4oaW50KHNlbGYubWF4Q2hhbmdlcyksIGxlbihjaGFuZ2VzKSldCisKKyAgICAgICAgICAgIGlmIGxlbihjaGFuZ2VzKSA9PSAwOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnNpbGVudDoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIk5vIGNoYW5nZXMgdG8gaW1wb3J0ISIKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5zaWxlbnQgYW5kIG5vdCBzZWxmLmRldGVjdEJyYW5jaGVzOgorICAgICAgICAgICAgICAgIHByaW50ICJJbXBvcnQgZGVzdGluYXRpb246ICVzIiAlIHNlbGYuYnJhbmNoCisKKyAgICAgICAgICAgIHNlbGYudXBkYXRlZEJyYW5jaGVzID0gc2V0KCkKKworICAgICAgICAgICAgc2VsZi5pbXBvcnRDaGFuZ2VzKGNoYW5nZXMpCisKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnNpbGVudDoKKyAgICAgICAgICAgICAgICBwcmludCAiIgorICAgICAgICAgICAgICAgIGlmIGxlbihzZWxmLnVwZGF0ZWRCcmFuY2hlcykgPiAwOgorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJVcGRhdGVkIGJyYW5jaGVzOiAiKQorICAgICAgICAgICAgICAgICAgICBmb3IgYiBpbiBzZWxmLnVwZGF0ZWRCcmFuY2hlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIiVzICIgJSBiKQorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcbiIpCisKKyAgICAgICAgc2VsZi5naXRTdHJlYW0uY2xvc2UoKQorICAgICAgICBpZiBpbXBvcnRQcm9jZXNzLndhaXQoKSAhPSAwOgorICAgICAgICAgICAgZGllKCJmYXN0LWltcG9ydCBmYWlsZWQ6ICVzIiAlIHNlbGYuZ2l0RXJyb3IucmVhZCgpKQorICAgICAgICBzZWxmLmdpdE91dHB1dC5jbG9zZSgpCisgICAgICAgIHNlbGYuZ2l0RXJyb3IuY2xvc2UoKQorCisgICAgICAgIHJldHVybiBUcnVlCisKK2NsYXNzIFA0UmViYXNlKENvbW1hbmQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQ29tbWFuZC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLm9wdGlvbnMgPSBbIF0KKyAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9ICgiRmV0Y2hlcyB0aGUgbGF0ZXN0IHJldmlzaW9uIGZyb20gcGVyZm9yY2UgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJyZWJhc2VzIHRoZSBjdXJyZW50IHdvcmsgKGJyYW5jaCkgYWdhaW5zdCBpdCIpCisgICAgICAgIHNlbGYudmVyYm9zZSA9IEZhbHNlCisKKyAgICBkZWYgcnVuKHNlbGYsIGFyZ3MpOgorICAgICAgICBzeW5jID0gUDRTeW5jKCkKKyAgICAgICAgc3luYy5ydW4oW10pCisKKyAgICAgICAgcmV0dXJuIHNlbGYucmViYXNlKCkKKworICAgIGRlZiByZWJhc2Uoc2VsZik6CisgICAgICAgIGlmIG9zLnN5c3RlbSgiZ2l0IHVwZGF0ZS1pbmRleCAtLXJlZnJlc2giKSAhPSAwOgorICAgICAgICAgICAgZGllKCJTb21lIGZpbGVzIGluIHlvdXIgd29ya2luZyBkaXJlY3RvcnkgYXJlIG1vZGlmaWVkIGFuZCBkaWZmZXJlbnQgdGhhbiB3aGF0IGlzIGluIHlvdXIgaW5kZXguIFlvdSBjYW4gdXNlIGdpdCB1cGRhdGUtaW5kZXggPGZpbGVuYW1lPiB0byBicmluZyB0aGUgaW5kZXggdXAtdG8tZGF0ZSBvciBzdGFzaCBhd2F5IGFsbCB5b3VyIGNoYW5nZXMgd2l0aCBnaXQgc3Rhc2guIik7CisgICAgICAgIGlmIGxlbihyZWFkX3BpcGUoImdpdCBkaWZmLWluZGV4IEhFQUQgLS0iKSkgPiAwOgorICAgICAgICAgICAgZGllKCJZb3UgaGF2ZSB1bmNvbW1pdGVkIGNoYW5nZXMuIFBsZWFzZSBjb21taXQgdGhlbSBiZWZvcmUgcmViYXNpbmcgb3Igc3Rhc2ggdGhlbSBhd2F5IHdpdGggZ2l0IHN0YXNoLiIpOworCisgICAgICAgIFt1cHN0cmVhbSwgc2V0dGluZ3NdID0gZmluZFVwc3RyZWFtQnJhbmNoUG9pbnQoKQorICAgICAgICBpZiBsZW4odXBzdHJlYW0pID09IDA6CisgICAgICAgICAgICBkaWUoIkNhbm5vdCBmaW5kIHVwc3RyZWFtIGJyYW5jaHBvaW50IGZvciByZWJhc2UiKQorCisgICAgICAgICMgdGhlIGJyYW5jaHBvaW50IG1heSBiZSBwNC9mb29+Mywgc28gc3RyaXAgb2ZmIHRoZSBwYXJlbnQKKyAgICAgICAgdXBzdHJlYW0gPSByZS5zdWIoIn5bMC05XSskIiwgIiIsIHVwc3RyZWFtKQorCisgICAgICAgIHByaW50ICJSZWJhc2luZyB0aGUgY3VycmVudCBicmFuY2ggb250byAlcyIgJSB1cHN0cmVhbQorICAgICAgICBvbGRIZWFkID0gcmVhZF9waXBlKCJnaXQgcmV2LXBhcnNlIEhFQUQiKS5zdHJpcCgpCisgICAgICAgIHN5c3RlbSgiZ2l0IHJlYmFzZSAlcyIgJSB1cHN0cmVhbSkKKyAgICAgICAgc3lzdGVtKCJnaXQgZGlmZi10cmVlIC0tc3RhdCAtLXN1bW1hcnkgLU0gJXMgSEVBRCIgJSBvbGRIZWFkKQorICAgICAgICByZXR1cm4gVHJ1ZQorCitjbGFzcyBQNENsb25lKFA0U3luYyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBQNFN5bmMuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9ICJDcmVhdGVzIGEgbmV3IGdpdCByZXBvc2l0b3J5IGFuZCBpbXBvcnRzIGZyb20gUGVyZm9yY2UgaW50byBpdCIKKyAgICAgICAgc2VsZi51c2FnZSA9ICJ1c2FnZTogJXByb2cgW29wdGlvbnNdIC8vZGVwb3QvcGF0aFtAcmV2UmFuZ2VdIgorICAgICAgICBzZWxmLm9wdGlvbnMgKz0gWworICAgICAgICAgICAgb3B0cGFyc2UubWFrZV9vcHRpb24oIi0tZGVzdGluYXRpb24iLCBkZXN0PSJjbG9uZURlc3RpbmF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0nc3RvcmUnLCBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ3aGVyZSB0byBsZWF2ZSByZXN1bHQgb2YgdGhlIGNsb25lIiksCisgICAgICAgICAgICBvcHRwYXJzZS5tYWtlX29wdGlvbigiLS8iLCBkZXN0PSJjbG9uZUV4Y2x1ZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSJhcHBlbmQiLCB0eXBlPSJzdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iZXhjbHVkZSBkZXBvdCBwYXRoIikKKyAgICAgICAgXQorICAgICAgICBzZWxmLmNsb25lRGVzdGluYXRpb24gPSBOb25lCisgICAgICAgIHNlbGYubmVlZHNHaXQgPSBGYWxzZQorCisgICAgIyBUaGlzIGlzIHJlcXVpcmVkIGZvciB0aGUgImFwcGVuZCIgY2xvbmVFeGNsdWRlIGFjdGlvbgorICAgIGRlZiBlbnN1cmVfdmFsdWUoc2VsZiwgYXR0ciwgdmFsdWUpOgorICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCBhdHRyKSBvciBnZXRhdHRyKHNlbGYsIGF0dHIpIGlzIE5vbmU6CisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIHZhbHVlKQorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBhdHRyKQorCisgICAgZGVmIGRlZmF1bHREZXN0aW5hdGlvbihzZWxmLCBhcmdzKToKKyAgICAgICAgIyMgVE9ETzogdXNlIGNvbW1vbiBwcmVmaXggb2YgYXJncz8KKyAgICAgICAgZGVwb3RQYXRoID0gYXJnc1swXQorICAgICAgICBkZXBvdERpciA9IHJlLnN1YigiKEBbXkBdKikkIiwgIiIsIGRlcG90UGF0aCkKKyAgICAgICAgZGVwb3REaXIgPSByZS5zdWIoIigjW14jXSopJCIsICIiLCBkZXBvdERpcikKKyAgICAgICAgZGVwb3REaXIgPSByZS5zdWIociJcLlwuXC4kIiwgIiIsIGRlcG90RGlyKQorICAgICAgICBkZXBvdERpciA9IHJlLnN1YihyIi8kIiwgIiIsIGRlcG90RGlyKQorICAgICAgICByZXR1cm4gb3MucGF0aC5zcGxpdChkZXBvdERpcilbMV0KKworICAgIGRlZiBydW4oc2VsZiwgYXJncyk6CisgICAgICAgIGlmIGxlbihhcmdzKSA8IDE6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBpZiBzZWxmLmtlZXBSZXBvUGF0aCBhbmQgbm90IHNlbGYuY2xvbmVEZXN0aW5hdGlvbjoKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIk11c3Qgc3BlY2lmeSBkZXN0aW5hdGlvbiBmb3IgLS1rZWVwLXBhdGhcbiIpCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgICAgIGRlcG90UGF0aHMgPSBhcmdzCisKKyAgICAgICAgaWYgbm90IHNlbGYuY2xvbmVEZXN0aW5hdGlvbiBhbmQgbGVuKGRlcG90UGF0aHMpID4gMToKKyAgICAgICAgICAgIHNlbGYuY2xvbmVEZXN0aW5hdGlvbiA9IGRlcG90UGF0aHNbLTFdCisgICAgICAgICAgICBkZXBvdFBhdGhzID0gZGVwb3RQYXRoc1s6LTFdCisKKyAgICAgICAgc2VsZi5jbG9uZUV4Y2x1ZGUgPSBbIi8iK3AgZm9yIHAgaW4gc2VsZi5jbG9uZUV4Y2x1ZGVdCisgICAgICAgIGZvciBwIGluIGRlcG90UGF0aHM6CisgICAgICAgICAgICBpZiBub3QgcC5zdGFydHN3aXRoKCIvLyIpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGlmIG5vdCBzZWxmLmNsb25lRGVzdGluYXRpb246CisgICAgICAgICAgICBzZWxmLmNsb25lRGVzdGluYXRpb24gPSBzZWxmLmRlZmF1bHREZXN0aW5hdGlvbihhcmdzKQorCisgICAgICAgIHByaW50ICJJbXBvcnRpbmcgZnJvbSAlcyBpbnRvICVzIiAlICgnLCAnLmpvaW4oZGVwb3RQYXRocyksIHNlbGYuY2xvbmVEZXN0aW5hdGlvbikKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuY2xvbmVEZXN0aW5hdGlvbik6CisgICAgICAgICAgICBvcy5tYWtlZGlycyhzZWxmLmNsb25lRGVzdGluYXRpb24pCisgICAgICAgIG9zLmNoZGlyKHNlbGYuY2xvbmVEZXN0aW5hdGlvbikKKyAgICAgICAgc3lzdGVtKCJnaXQgaW5pdCIpCisgICAgICAgIHNlbGYuZ2l0ZGlyID0gb3MuZ2V0Y3dkKCkgKyAiLy5naXQiCisgICAgICAgIGlmIG5vdCBQNFN5bmMucnVuKHNlbGYsIGRlcG90UGF0aHMpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIHNlbGYuYnJhbmNoICE9ICJtYXN0ZXIiOgorICAgICAgICAgICAgaWYgZ2l0QnJhbmNoRXhpc3RzKCJyZWZzL3JlbW90ZXMvcDQvbWFzdGVyIik6CisgICAgICAgICAgICAgICAgc3lzdGVtKCJnaXQgYnJhbmNoIG1hc3RlciByZWZzL3JlbW90ZXMvcDQvbWFzdGVyIikKKyAgICAgICAgICAgICAgICBzeXN0ZW0oImdpdCBjaGVja291dCAtZiIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICJDb3VsZCBub3QgZGV0ZWN0IG1haW4gYnJhbmNoLiBObyBjaGVja291dC9tYXN0ZXIgYnJhbmNoIGNyZWF0ZWQuIgorCisgICAgICAgIHJldHVybiBUcnVlCisKK2NsYXNzIFA0QnJhbmNoZXMoQ29tbWFuZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYub3B0aW9ucyA9IFsgXQorICAgICAgICBzZWxmLmRlc2NyaXB0aW9uID0gKCJTaG93cyB0aGUgZ2l0IGJyYW5jaGVzIHRoYXQgaG9sZCBpbXBvcnRzIGFuZCB0aGVpciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiY29ycmVzcG9uZGluZyBwZXJmb3JjZSBkZXBvdCBwYXRocyIpCisgICAgICAgIHNlbGYudmVyYm9zZSA9IEZhbHNlCisKKyAgICBkZWYgcnVuKHNlbGYsIGFyZ3MpOgorICAgICAgICBpZiBvcmlnaW5QNEJyYW5jaGVzRXhpc3QoKToKKyAgICAgICAgICAgIGNyZWF0ZU9yVXBkYXRlQnJhbmNoZXNGcm9tT3JpZ2luKCkKKworICAgICAgICBjbWRsaW5lID0gImdpdCByZXYtcGFyc2UgLS1zeW1ib2xpYyAiCisgICAgICAgIGNtZGxpbmUgKz0gIiAtLXJlbW90ZXMiCisKKyAgICAgICAgZm9yIGxpbmUgaW4gcmVhZF9waXBlX2xpbmVzKGNtZGxpbmUpOgorICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorCisgICAgICAgICAgICBpZiBub3QgbGluZS5zdGFydHN3aXRoKCdwNC8nKSBvciBsaW5lID09ICJwNC9IRUFEIjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgYnJhbmNoID0gbGluZQorCisgICAgICAgICAgICBsb2cgPSBleHRyYWN0TG9nTWVzc2FnZUZyb21HaXRDb21taXQoInJlZnMvcmVtb3Rlcy8lcyIgJSBicmFuY2gpCisgICAgICAgICAgICBzZXR0aW5ncyA9IGV4dHJhY3RTZXR0aW5nc0dpdExvZyhsb2cpCisKKyAgICAgICAgICAgIHByaW50ICIlcyA8PSAlcyAoJXMpIiAlIChicmFuY2gsICIsIi5qb2luKHNldHRpbmdzWyJkZXBvdC1wYXRocyJdKSwgc2V0dGluZ3NbImNoYW5nZSJdKQorICAgICAgICByZXR1cm4gVHJ1ZQorCitjbGFzcyBIZWxwRm9ybWF0dGVyKG9wdHBhcnNlLkluZGVudGVkSGVscEZvcm1hdHRlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBvcHRwYXJzZS5JbmRlbnRlZEhlbHBGb3JtYXR0ZXIuX19pbml0X18oc2VsZikKKworICAgIGRlZiBmb3JtYXRfZGVzY3JpcHRpb24oc2VsZiwgZGVzY3JpcHRpb24pOgorICAgICAgICBpZiBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbiArICJcbiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAiIgorCitkZWYgcHJpbnRVc2FnZShjb21tYW5kcyk6CisgICAgcHJpbnQgInVzYWdlOiAlcyA8Y29tbWFuZD4gW29wdGlvbnNdIiAlIHN5cy5hcmd2WzBdCisgICAgcHJpbnQgIiIKKyAgICBwcmludCAidmFsaWQgY29tbWFuZHM6ICVzIiAlICIsICIuam9pbihjb21tYW5kcykKKyAgICBwcmludCAiIgorICAgIHByaW50ICJUcnkgJXMgPGNvbW1hbmQ+IC0taGVscCBmb3IgY29tbWFuZCBzcGVjaWZpYyBoZWxwLiIgJSBzeXMuYXJndlswXQorICAgIHByaW50ICIiCisKK2NvbW1hbmRzID0geworICAgICJkZWJ1ZyIgOiBQNERlYnVnLAorICAgICJzdWJtaXQiIDogUDRTdWJtaXQsCisgICAgImNvbW1pdCIgOiBQNFN1Ym1pdCwKKyAgICAic3luYyIgOiBQNFN5bmMsCisgICAgInJlYmFzZSIgOiBQNFJlYmFzZSwKKyAgICAiY2xvbmUiIDogUDRDbG9uZSwKKyAgICAicm9sbGJhY2siIDogUDRSb2xsQmFjaywKKyAgICAiYnJhbmNoZXMiIDogUDRCcmFuY2hlcworfQorCisKK2RlZiBtYWluKCk6CisgICAgaWYgbGVuKHN5cy5hcmd2WzE6XSkgPT0gMDoKKyAgICAgICAgcHJpbnRVc2FnZShjb21tYW5kcy5rZXlzKCkpCisgICAgICAgIHN5cy5leGl0KDIpCisKKyAgICBjbWQgPSAiIgorICAgIGNtZE5hbWUgPSBzeXMuYXJndlsxXQorICAgIHRyeToKKyAgICAgICAga2xhc3MgPSBjb21tYW5kc1tjbWROYW1lXQorICAgICAgICBjbWQgPSBrbGFzcygpCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBwcmludCAidW5rbm93biBjb21tYW5kICVzIiAlIGNtZE5hbWUKKyAgICAgICAgcHJpbnQgIiIKKyAgICAgICAgcHJpbnRVc2FnZShjb21tYW5kcy5rZXlzKCkpCisgICAgICAgIHN5cy5leGl0KDIpCisKKyAgICBvcHRpb25zID0gY21kLm9wdGlvbnMKKyAgICBjbWQuZ2l0ZGlyID0gb3MuZW52aXJvbi5nZXQoIkdJVF9ESVIiLCBOb25lKQorCisgICAgYXJncyA9IHN5cy5hcmd2WzI6XQorCisgICAgaWYgbGVuKG9wdGlvbnMpID4gMDoKKyAgICAgICAgb3B0aW9ucy5hcHBlbmQob3B0cGFyc2UubWFrZV9vcHRpb24oIi0tZ2l0LWRpciIsIGRlc3Q9ImdpdGRpciIpKQorCisgICAgICAgIHBhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcihjbWQudXNhZ2UucmVwbGFjZSgiJXByb2ciLCAiJXByb2cgIiArIGNtZE5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gY21kLmRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyID0gSGVscEZvcm1hdHRlcigpKQorCisgICAgICAgIChjbWQsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3Moc3lzLmFyZ3ZbMjpdLCBjbWQpOworICAgIGdsb2JhbCB2ZXJib3NlCisgICAgdmVyYm9zZSA9IGNtZC52ZXJib3NlCisgICAgaWYgY21kLm5lZWRzR2l0OgorICAgICAgICBpZiBjbWQuZ2l0ZGlyID09IE5vbmU6CisgICAgICAgICAgICBjbWQuZ2l0ZGlyID0gb3MucGF0aC5hYnNwYXRoKCIuZ2l0IikKKyAgICAgICAgICAgIGlmIG5vdCBpc1ZhbGlkR2l0RGlyKGNtZC5naXRkaXIpOgorICAgICAgICAgICAgICAgIGNtZC5naXRkaXIgPSByZWFkX3BpcGUoImdpdCByZXYtcGFyc2UgLS1naXQtZGlyIikuc3RyaXAoKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGNtZC5naXRkaXIpOgorICAgICAgICAgICAgICAgICAgICBjZHVwID0gcmVhZF9waXBlKCJnaXQgcmV2LXBhcnNlIC0tc2hvdy1jZHVwIikuc3RyaXAoKQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4oY2R1cCkgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2hkaXIoY2R1cCk7CisKKyAgICAgICAgaWYgbm90IGlzVmFsaWRHaXREaXIoY21kLmdpdGRpcik6CisgICAgICAgICAgICBpZiBpc1ZhbGlkR2l0RGlyKGNtZC5naXRkaXIgKyAiLy5naXQiKToKKyAgICAgICAgICAgICAgICBjbWQuZ2l0ZGlyICs9ICIvLmdpdCIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGllKCJmYXRhbDogY2Fubm90IGxvY2F0ZSBnaXQgcmVwb3NpdG9yeSBhdCAlcyIgJSBjbWQuZ2l0ZGlyKQorCisgICAgICAgIG9zLmVudmlyb25bIkdJVF9ESVIiXSA9IGNtZC5naXRkaXIKKworICAgIGlmIG5vdCBjbWQucnVuKGFyZ3MpOgorICAgICAgICBwYXJzZXIucHJpbnRfaGVscCgpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmFzdC1pbXBvcnQvZ2l0LXA0LmJhdCBiL2NvbnRyaWIvZmFzdC1pbXBvcnQvZ2l0LXA0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjk3ZTg4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9mYXN0LWltcG9ydC9naXQtcDQuYmF0CkBAIC0wLDAgKzEgQEAKK0BweXRob24gIiV+ZDAlfnAwZ2l0LXA0IiAlKgpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYXN0LWltcG9ydC9naXQtcDQudHh0IGIvY29udHJpYi9mYXN0LWltcG9ydC9naXQtcDQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNmE4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2Zhc3QtaW1wb3J0L2dpdC1wNC50eHQKQEAgLTAsMCArMSwxNTkgQEAKK2dpdC1wNCAtIFBlcmZvcmNlIDwtPiBHaXQgY29udmVydGVyIHVzaW5nIGdpdC1mYXN0LWltcG9ydAorCitVc2FnZQorPT09PT0KKworZ2l0LXA0IHN1cHBvcnRzIHR3byBtYWluIG1vZGVzOiBJbXBvcnRpbmcgZnJvbSBQZXJmb3JjZSB0byBhIEdpdCByZXBvc2l0b3J5IGlzCitkb25lIHVzaW5nICJnaXQtcDQgc3luYyIgb3IgImdpdC1wNCByZWJhc2UiLiBTdWJtaXR0aW5nIGNoYW5nZXMgZnJvbSBHaXQgYmFjawordG8gUGVyZm9yY2UgaXMgZG9uZSB1c2luZyAiZ2l0LXA0IHN1Ym1pdCIuCisKK0ltcG9ydGluZworPT09PT09PT09CisKK1lvdSBjYW4gc2ltcGx5IHN0YXJ0IHdpdGgKKworICBnaXQtcDQgY2xvbmUgLy9kZXBvdC9wYXRoL3Byb2plY3QKKworb3IKKworICBnaXQtcDQgY2xvbmUgLy9kZXBvdC9wYXRoL3Byb2plY3QgbXlwcm9qZWN0CisKK1RoaXMgd2lsbCBjcmVhdGUgYW4gZW1wdHkgZ2l0IHJlcG9zaXRvcnkgaW4gYSBzdWJkaXJlY3RvcnkgY2FsbGVkICJwcm9qZWN0IiAob3IKKyJteXByb2plY3QiIHdpdGggdGhlIHNlY29uZCBjb21tYW5kKSwgaW1wb3J0IHRoZSBoZWFkIHJldmlzaW9uIGZyb20gdGhlCitzcGVjaWZpZWQgcGVyZm9yY2UgcGF0aCBpbnRvIGEgZ2l0ICJwNCIgYnJhbmNoIChyZW1vdGVzL3A0IGFjdHVhbGx5KSwgY3JlYXRlIGEKK21hc3RlciBicmFuY2ggb2ZmIGl0IGFuZCBjaGVjayBpdCBvdXQuIElmIHlvdSB3YW50IHRoZSBlbnRpcmUgaGlzdG9yeSAobm90IGp1c3QKK3RoZSBoZWFkIHJldmlzaW9uKSB0aGVuIHlvdSBjYW4gc2ltcGx5IGFwcGVuZCBhICJAYWxsIiB0byB0aGUgZGVwb3QgcGF0aDoKKworICBnaXQtcDQgY2xvbmUgLy9kZXBvdC9wcm9qZWN0L21haW5AYWxsIG15cHJvamVjdAorCisKKworSWYgeW91IHdhbnQgbW9yZSBjb250cm9sIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGdpdC1wNCBzeW5jIGNvbW1hbmQgZGlyZWN0bHk6CisKKyAgbWtkaXIgcmVwby1naXQKKyAgY2QgcmVwby1naXQKKyAgZ2l0IGluaXQKKyAgZ2l0LXA0IHN5bmMgLy9wYXRoL2luL3lvdXIvcGVyZm9yY2UvZGVwb3QKKworVGhpcyB3aWxsIGltcG9ydCB0aGUgY3VycmVudCBoZWFkIHJldmlzaW9uIG9mIHRoZSBzcGVjaWZpZWQgZGVwb3QgcGF0aCBpbnRvIGEKKyJyZW1vdGVzL3A0L21hc3RlciIgYnJhbmNoIG9mIHlvdXIgZ2l0IHJlcG9zaXRvcnkuIFlvdSBjYW4gdXNlIHRoZQorLS1icmFuY2g9bXlicmFuY2ggb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBicmFuY2guCisKK0lmIHlvdSB3YW50IHRvIGltcG9ydCB0aGUgZW50aXJlIGhpc3Rvcnkgb2YgYSBnaXZlbiBkZXBvdCBwYXRoIGp1c3QgdXNlCisKKyAgZ2l0LXA0IHN5bmMgLy9wYXRoL2luL2RlcG90QGFsbAorCitUbyBhY2hpZXZlIG9wdGltYWwgY29tcHJlc3Npb24geW91IG1heSB3YW50IHRvIHJ1biAnZ2l0IHJlcGFjayAtYSAtZCAtZicgYWZ0ZXIKK2EgYmlnIGltcG9ydC4gVGhpcyBtYXkgdGFrZSBhIHdoaWxlLgorCitTdXBwb3J0IGZvciBQZXJmb3JjZSBpbnRlZ3JhdGlvbnMgaXMgc3RpbGwgd29yayBpbiBwcm9ncmVzcy4gRG9uJ3QgYm90aGVyCit0cnlpbmcgaXQgdW5sZXNzIHlvdSB3YW50IHRvIGhhY2sgb24gaXQgOikKKworSW5jcmVtZW50YWwgSW1wb3J0cworPT09PT09PT09PT09PT09PT09PQorCitBZnRlciBhbiBpbml0aWFsIGltcG9ydCB5b3UgY2FuIGVhc2lseSBzeW5jaHJvbml6ZSB5b3VyIGdpdCByZXBvc2l0b3J5IHdpdGgKK25ld2VyIGNoYW5nZXMgZnJvbSB0aGUgUGVyZm9yY2UgZGVwb3QgYnkganVzdCBjYWxsaW5nCisKKyAgZ2l0LXA0IHN5bmMKKworaW4geW91ciBnaXQgcmVwb3NpdG9yeS4gQnkgZGVmYXVsdCB0aGUgInJlbW90ZXMvcDQvbWFzdGVyIiBicmFuY2ggaXMgdXBkYXRlZC4KKworSXQgaXMgcmVjb21tZW5kZWQgdG8gcnVuICdnaXQgcmVwYWNrIC1hIC1kIC1mJyBmcm9tIHRpbWUgdG8gdGltZSB3aGVuIHVzaW5nCitpbmNyZW1lbnRhbCBpbXBvcnRzIHRvIG9wdGltYWxseSBjb21iaW5lIHRoZSBpbmRpdmlkdWFsIGdpdCBwYWNrcyB0aGF0IGVhY2gKK2luY3JlbWVudGFsIGltcG9ydCBjcmVhdGVzIHRocm91Z2ggdGhlIHVzZSBvZiBnaXQtZmFzdC1pbXBvcnQuCisKKworQSB1c2VmdWwgc2V0dXAgbWF5IGJlIHRoYXQgeW91IGhhdmUgYSBwZXJpb2RpY2FsbHkgdXBkYXRlZCBnaXQgcmVwb3NpdG9yeQorc29tZXdoZXJlIHRoYXQgY29udGFpbnMgYSBjb21wbGV0ZSBpbXBvcnQgb2YgYSBQZXJmb3JjZSBwcm9qZWN0LiBUaGF0IGdpdAorcmVwb3NpdG9yeSBjYW4gYmUgdXNlZCB0byBjbG9uZSB0aGUgd29ya2luZyByZXBvc2l0b3J5IGZyb20gYW5kIG9uZSB3b3VsZAoraW1wb3J0IGZyb20gUGVyZm9yY2UgZGlyZWN0bHkgYWZ0ZXIgY2xvbmluZyB1c2luZyBnaXQtcDQuIElmIHRoZSBjb25uZWN0aW9uIHRvCit0aGUgUGVyZm9yY2Ugc2VydmVyIGlzIHNsb3cgYW5kIHRoZSB3b3JraW5nIHJlcG9zaXRvcnkgaGFzbid0IGJlZW4gc3luY2VkIGZvciBhCit3aGlsZSBpdCBtYXkgYmUgZGVzaXJhYmxlIHRvIGZldGNoIGNoYW5nZXMgZnJvbSB0aGUgb3JpZ2luIGdpdCByZXBvc2l0b3J5IHVzaW5nCit0aGUgZWZmaWNpZW50IGdpdCBwcm90b2NvbC4gZ2l0LXA0IHN1cHBvcnRzIHRoaXMgc2V0dXAgYnkgY2FsbGluZyAiZ2l0IGZldGNoIG9yaWdpbiIKK2J5IGRlZmF1bHQgaWYgdGhlcmUgaXMgYW4gb3JpZ2luIGJyYW5jaC4gWW91IGNhbiBkaXNhYmxlIHRoaXMgdXNpbmcKKworICBnaXQgY29uZmlnIGdpdC1wNC5zeW5jRnJvbU9yaWdpbiBmYWxzZQorCitVcGRhdGluZworPT09PT09PT0KKworQSBjb21tb24gd29ya2luZyBwYXR0ZXJuIGlzIHRvIGZldGNoIHRoZSBsYXRlc3QgY2hhbmdlcyBmcm9tIHRoZSBQZXJmb3JjZSBkZXBvdAorYW5kIG1lcmdlIHRoZW0gd2l0aCBsb2NhbCB1bmNvbW1pdHRlZCBjaGFuZ2VzLiBUaGUgcmVjb21tZW5kZWQgd2F5IGlzIHRvIHVzZQorZ2l0J3MgcmViYXNlIG1lY2hhbmlzbSB0byBwcmVzZXJ2ZSBsaW5lYXIgaGlzdG9yeS4gZ2l0LXA0IHByb3ZpZGVzIGEgY29udmVuaWVudAorCisgIGdpdC1wNCByZWJhc2UKKworY29tbWFuZCB0aGF0IGNhbGxzIGdpdC1wNCBzeW5jIGZvbGxvd2VkIGJ5IGdpdCByZWJhc2UgdG8gcmViYXNlIHRoZSBjdXJyZW50Cit3b3JraW5nIGJyYW5jaC4KKworU3VibWl0dGluZworPT09PT09PT09PQorCitnaXQtcDQgaGFzIHN1cHBvcnQgZm9yIHN1Ym1pdHRpbmcgY2hhbmdlcyBmcm9tIGEgZ2l0IHJlcG9zaXRvcnkgYmFjayB0byB0aGUKK1BlcmZvcmNlIGRlcG90LiBUaGlzIHJlcXVpcmVzIGEgUGVyZm9yY2UgY2hlY2tvdXQgc2VwYXJhdGUgdG8geW91ciBnaXQKK3JlcG9zaXRvcnkuIFRvIHN1Ym1pdCBhbGwgY2hhbmdlcyB0aGF0IGFyZSBpbiB0aGUgY3VycmVudCBnaXQgYnJhbmNoIGJ1dCBub3QgaW4KK3RoZSAicDQiIGJyYW5jaCAob3IgIm9yaWdpbiIgaWYgInA0IiBkb2Vzbid0IGV4aXN0KSBzaW1wbHkgY2FsbAorCisgICAgZ2l0LXA0IHN1Ym1pdAorCitpbiB5b3VyIGdpdCByZXBvc2l0b3J5LiBJZiB5b3Ugd2FudCB0byBzdWJtaXQgY2hhbmdlcyBpbiBhIHNwZWNpZmljIGJyYW5jaCB0aGF0CitpcyBub3QgeW91ciBjdXJyZW50IGdpdCBicmFuY2ggeW91IGNhbiBhbHNvIHBhc3MgdGhhdCBhcyBhbiBhcmd1bWVudDoKKworICAgIGdpdC1wNCBzdWJtaXQgbXl0b3BpY2JyYW5jaAorCitZb3UgY2FuIG92ZXJyaWRlIHRoZSByZWZlcmVuY2UgYnJhbmNoIHdpdGggdGhlIC0tb3JpZ2luPW15c291cmNlYnJhbmNoIG9wdGlvbi4KKworSWYgYSBzdWJtaXQgZmFpbHMgeW91IG1heSBoYXZlIHRvICJwNCByZXNvbHZlIiBhbmQgc3VibWl0IG1hbnVhbGx5LiBZb3UgY2FuCitjb250aW51ZSBpbXBvcnRpbmcgdGhlIHJlbWFpbmluZyBjaGFuZ2VzIHdpdGgKKworICBnaXQtcDQgc3VibWl0IC0tY29udGludWUKKworQWZ0ZXIgc3VibWl0dGluZyB5b3Ugc2hvdWxkIHN5bmMgeW91ciBwZXJmb3JjZSBpbXBvcnQgYnJhbmNoICgicDQiIG9yICJvcmlnaW4iKQorZnJvbSBQZXJmb3JjZSB1c2luZyBnaXQtcDQncyBzeW5jIGNvbW1hbmQuCisKK0lmIHlvdSBoYXZlIGNoYW5nZXMgaW4geW91ciB3b3JraW5nIGRpcmVjdG9yeSB0aGF0IHlvdSBoYXZlbid0IGNvbW1pdHRlZCBpbnRvCitnaXQgeWV0IGJ1dCB0aGF0IHlvdSB3YW50IHRvIGNvbW1pdCB0byBQZXJmb3JjZSBkaXJlY3RseSAoInF1aWNrIGZpeGVzIikgdGhlbgoreW91IGRvIG5vdCBoYXZlIHRvIGdvIHRocm91Z2ggdGhlIGludGVybWVkaWF0ZSBzdGVwIG9mIGNyZWF0aW5nIGEgZ2l0IGNvbW1pdAorZmlyc3QgYnV0IHlvdSBjYW4ganVzdCBjYWxsCisKKyAgZ2l0LXA0IHN1Ym1pdCAtLWRpcmVjdAorCisKK0V4YW1wbGUKKz09PT09PT0KKworIyBDbG9uZSBhIHJlcG9zaXRvcnkKKyAgZ2l0LXA0IGNsb25lIC8vZGVwb3QvcGF0aC9wcm9qZWN0CisjIEVudGVyIHRoZSBuZXdseSBjbG9uZWQgZGlyZWN0b3J5CisgIGNkIHByb2plY3QKKyMgRG8gc29tZSB3b3JrLi4uCisgIHZpIGZvby5oCisjIC4uLiBhbmQgY29tbWl0IGxvY2FsbHkgdG8gZ2kKKyAgZ2l0IGNvbW1pdCBmb28uaAorIyBJbiB0aGUgbWVhbnRpbWUgc29tZWJvZHkgc3VibWl0dGVkIGNoYW5nZXMgdG8gdGhlIFBlcmZvcmNlIGRlcG90LiBSZWJhc2UgeW91ciBsYXRlc3QKKyMgY2hhbmdlcyBhZ2FpbnN0IHRoZSBsYXRlc3QgY2hhbmdlcyBpbiBQZXJmb3JjZToKKyAgZ2l0LXA0IHJlYmFzZQorIyBTdWJtaXQgeW91ciBsb2NhbGx5IGNvbW1pdHRlZCBjaGFuZ2VzIGJhY2sgdG8gUGVyZm9yY2UKKyAgZ2l0LXA0IHN1Ym1pdAorIyAuLi4gYW5kIHN5bmNocm9uaXplIHdpdGggUGVyZm9yY2UKKyAgZ2l0LXA0IHJlYmFzZQorCisKK0ltcGxlbWVudGF0aW9uIERldGFpbHMuLi4KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworKiBDaGFuZ2VzZXRzIGZyb20gUGVyZm9yY2UgYXJlIGltcG9ydGVkIHVzaW5nIGdpdCBmYXN0LWltcG9ydC4KKyogVGhlIGltcG9ydCBkb2VzIG5vdCByZXF1aXJlIGFueXRoaW5nIGZyb20gdGhlIFBlcmZvcmNlIGNsaWVudCB2aWV3IGFzIGl0IGp1c3QgdXNlcworICAicDQgcHJpbnQgLy9kZXBvdC9wYXRoL2ZpbGUjcmV2aXNpb24iIHRvIGdldCB0aGUgYWN0dWFsIGZpbGUgY29udGVudHMuCisqIEV2ZXJ5IGltcG9ydGVkIGNoYW5nZXNldCBoYXMgYSBzcGVjaWFsIFtnaXQtcDQuLi5dIGxpbmUgYXQgdGhlCisgIGVuZCBvZiB0aGUgbG9nIG1lc3NhZ2UgdGhhdCBnaXZlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29ycmVzcG9uZGluZworICBQZXJmb3JjZSBjaGFuZ2UgbnVtYmVyIGFuZCBpcyBhbHNvIHVzZWQgYnkgZ2l0LXA0IGl0c2VsZiB0byBmaW5kIG91dAorICB3aGVyZSB0byBjb250aW51ZSBpbXBvcnRpbmcgd2hlbiBkb2luZyBpbmNyZW1lbnRhbCBpbXBvcnRzLgorICBCYXNpY2FsbHkgd2hlbiBzeW5jaW5nIGl0IGV4dHJhY3RzIHRoZSBwZXJmb3JjZSBjaGFuZ2UgbnVtYmVyIG9mIHRoZQorICBsYXRlc3QgY29tbWl0IGluIHRoZSAicDQiIGJyYW5jaCBhbmQgdXNlcyAicDQgY2hhbmdlcyAvL2RlcG90L3BhdGgvLi4uQGNoYW5nZW51bSwjaGVhZCIKKyAgdG8gZmluZCBvdXQgd2hpY2ggY2hhbmdlcyBuZWVkIHRvIGJlIGltcG9ydGVkLgorKiBnaXQtcDQgc3VibWl0IHVzZXMgImdpdCByZXYtbGlzdCIgdG8gcGljayB0aGUgY29tbWl0cyBiZXR3ZWVuIHRoZSAicDQiIGJyYW5jaAorICBhbmQgdGhlIGN1cnJlbnQgYnJhbmNoLgorICBUaGUgY29tbWl0cyB0aGVtc2VsdmVzIGFyZSBhcHBsaWVkIHVzaW5nIGdpdCBkaWZmL2Zvcm1hdC1wYXRjaCAuLi4gfCBnaXQgYXBwbHkKKwpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYXN0LWltcG9ydC9pbXBvcnQtdGFycy5wZXJsIGIvY29udHJpYi9mYXN0LWltcG9ydC9pbXBvcnQtdGFycy5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIzYWViMjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2Zhc3QtaW1wb3J0L2ltcG9ydC10YXJzLnBlcmwKQEAgLTAsMCArMSwxMzEgQEAKKyMhL3Vzci9iaW4vcGVybAorCisjIyB0YXIgYXJjaGl2ZSBmcm9udGVuZCBmb3IgZ2l0LWZhc3QtaW1wb3J0CisjIworIyMgRm9yIGV4YW1wbGU6CisjIworIyMgIG1rZGlyIHByb2plY3Q7IGNkIHByb2plY3Q7IGdpdCBpbml0CisjIyAgcGVybCBpbXBvcnQtdGFycy5wZXJsICoudGFyLmJ6MgorIyMgIGdpdCB3aGF0Y2hhbmdlZCBpbXBvcnQtdGFycworIyMKKwordXNlIHN0cmljdDsKK2RpZSAidXNhZ2U6IGltcG9ydC10YXJzICoudGFyLntneixiejIsWn1cbiIgdW5sZXNzIEBBUkdWOworCitteSAkYnJhbmNoX25hbWUgPSAnaW1wb3J0LXRhcnMnOworbXkgJGJyYW5jaF9yZWYgPSAicmVmcy9oZWFkcy8kYnJhbmNoX25hbWUiOworbXkgJGNvbW1pdHRlcl9uYW1lID0gJ1QgQXIgQ3JlYXRvcic7CitteSAkY29tbWl0dGVyX2VtYWlsID0gJ3RhckBleGFtcGxlLmNvbSc7CisKK29wZW4oRkksICd8LScsICdnaXQnLCAnZmFzdC1pbXBvcnQnLCAnLS1xdWlldCcpCisJb3IgZGllICJVbmFibGUgdG8gc3RhcnQgZ2l0IGZhc3QtaW1wb3J0OiAkIVxuIjsKK2ZvcmVhY2ggbXkgJHRhcl9maWxlIChAQVJHVikKK3sKKwkkdGFyX2ZpbGUgPX4gbSwoW14vXSspJCw7CisJbXkgJHRhcl9uYW1lID0gJDE7CisKKwlpZiAoJHRhcl9uYW1lID1+IHMvXC4odGFyXC5nenx0Z3opJC8vKSB7CisJCW9wZW4oSSwgJy18JywgJ2d1bnppcCcsICctYycsICR0YXJfZmlsZSkKKwkJCW9yIGRpZSAiVW5hYmxlIHRvIGd1bnppcCAtYyAkdGFyX2ZpbGU6ICQhXG4iOworCX0gZWxzaWYgKCR0YXJfbmFtZSA9fiBzL1wuKHRhclwuYnoyfHRiejIpJC8vKSB7CisJCW9wZW4oSSwgJy18JywgJ2J1bnppcDInLCAnLWMnLCAkdGFyX2ZpbGUpCisJCQlvciBkaWUgIlVuYWJsZSB0byBidW56aXAyIC1jICR0YXJfZmlsZTogJCFcbiI7CisJfSBlbHNpZiAoJHRhcl9uYW1lID1+IHMvXC50YXJcLlokLy8pIHsKKwkJb3BlbihJLCAnLXwnLCAndW5jb21wcmVzcycsICctYycsICR0YXJfZmlsZSkKKwkJCW9yIGRpZSAiVW5hYmxlIHRvIHVuY29tcHJlc3MgLWMgJHRhcl9maWxlOiAkIVxuIjsKKwl9IGVsc2lmICgkdGFyX25hbWUgPX4gcy9cLnRhciQvLykgeworCQlvcGVuKEksICR0YXJfZmlsZSkgb3IgZGllICJVbmFibGUgdG8gb3BlbiAkdGFyX2ZpbGU6ICQhXG4iOworCX0gZWxzZSB7CisJCWRpZSAiVW5yZWNvZ25pemVkIGNvbXByZXNzaW9uIGZvcm1hdDogJHRhcl9maWxlXG4iOworCX0KKworCW15ICRjb21taXRfdGltZSA9IDA7CisJbXkgJG5leHRfbWFyayA9IDE7CisJbXkgJGhhdmVfdG9wX2RpciA9IDE7CisJbXkgKCR0b3BfZGlyLCAlZmlsZXMpOworCisJd2hpbGUgKHJlYWQoSSwgJF8sIDUxMikgPT0gNTEyKSB7CisJCW15ICgkbmFtZSwgJG1vZGUsICR1aWQsICRnaWQsICRzaXplLCAkbXRpbWUsCisJCQkkY2hrc3VtLCAkdHlwZWZsYWcsICRsaW5rbmFtZSwgJG1hZ2ljLAorCQkJJHZlcnNpb24sICR1bmFtZSwgJGduYW1lLCAkZGV2bWFqb3IsICRkZXZtaW5vciwKKwkJCSRwcmVmaXgpID0gdW5wYWNrICdaMTAwIFo4IFo4IFo4IFoxMiBaMTIKKwkJCVo4IFoxIFoxMDAgWjYKKwkJCVoyIFozMiBaMzIgWjggWjggWionLCAkXzsKKwkJbGFzdCB1bmxlc3MgbGVuZ3RoKCRuYW1lKTsKKwkJaWYgKCRuYW1lIGVxICcuLy4vQExvbmdMaW5rJykgeworCQkJIyBHTlUgdGFyIGV4dGVuc2lvbgorCQkJaWYgKHJlYWQoSSwgJF8sIDUxMikgIT0gNTEyKSB7CisJCQkJZGllICgnU2hvcnQgYXJjaGl2ZScpOworCQkJfQorCQkJJG5hbWUgPSB1bnBhY2sgJ1oyNTcnLCAkXzsKKwkJCW5leHQgdW5sZXNzICRuYW1lOworCisJCQlteSAkZHVtbXk7CisJCQlpZiAocmVhZChJLCAkXywgNTEyKSAhPSA1MTIpIHsKKwkJCQlkaWUgKCdTaG9ydCBhcmNoaXZlJyk7CisJCQl9CisJCQkoJGR1bW15LCAkbW9kZSwgJHVpZCwgJGdpZCwgJHNpemUsICRtdGltZSwKKwkJCSRjaGtzdW0sICR0eXBlZmxhZywgJGxpbmtuYW1lLCAkbWFnaWMsCisJCQkkdmVyc2lvbiwgJHVuYW1lLCAkZ25hbWUsICRkZXZtYWpvciwgJGRldm1pbm9yLAorCQkJJHByZWZpeCkgPSB1bnBhY2sgJ1oxMDAgWjggWjggWjggWjEyIFoxMgorCQkJWjggWjEgWjEwMCBaNgorCQkJWjIgWjMyIFozMiBaOCBaOCBaKicsICRfOworCQl9CisJCW5leHQgaWYgJG5hbWUgPX4gbXsvXHp9OworCQkkbW9kZSA9IG9jdCAkbW9kZTsKKwkJJHNpemUgPSBvY3QgJHNpemU7CisJCSRtdGltZSA9IG9jdCAkbXRpbWU7CisJCW5leHQgaWYgJHR5cGVmbGFnID09IDU7ICMgZGlyZWN0b3J5CisKKwkJcHJpbnQgRkkgImJsb2JcbiIsICJtYXJrIDokbmV4dF9tYXJrXG4iLCAiZGF0YSAkc2l6ZVxuIjsKKwkJd2hpbGUgKCRzaXplID4gMCAmJiByZWFkKEksICRfLCA1MTIpID09IDUxMikgeworCQkJcHJpbnQgRkkgc3Vic3RyKCRfLCAwLCAkc2l6ZSk7CisJCQkkc2l6ZSAtPSA1MTI7CisJCX0KKwkJcHJpbnQgRkkgIlxuIjsKKworCQlteSAkcGF0aDsKKwkJaWYgKCRwcmVmaXgpIHsKKwkJCSRwYXRoID0gIiRwcmVmaXgvJG5hbWUiOworCQl9IGVsc2UgeworCQkJJHBhdGggPSAiJG5hbWUiOworCQl9CisJCSRmaWxlc3skcGF0aH0gPSBbJG5leHRfbWFyaysrLCAkbW9kZV07CisKKwkJJGNvbW1pdF90aW1lID0gJG10aW1lIGlmICRtdGltZSA+ICRjb21taXRfdGltZTsKKwkJJHBhdGggPX4gbSxeKFteL10rKS8sOworCQkkdG9wX2RpciA9ICQxIHVubGVzcyAkdG9wX2RpcjsKKwkJJGhhdmVfdG9wX2RpciA9IDAgaWYgJHRvcF9kaXIgbmUgJDE7CisJfQorCisJcHJpbnQgRkkgPDxFT0Y7Citjb21taXQgJGJyYW5jaF9yZWYKK2NvbW1pdHRlciAkY29tbWl0dGVyX25hbWUgPCRjb21taXR0ZXJfZW1haWw+ICRjb21taXRfdGltZSArMDAwMAorZGF0YSA8PEVORF9PRl9DT01NSVRfTUVTU0FHRQorSW1wb3J0ZWQgZnJvbSAkdGFyX2ZpbGUuCitFTkRfT0ZfQ09NTUlUX01FU1NBR0UKKworZGVsZXRlYWxsCitFT0YKKworCWZvcmVhY2ggbXkgJHBhdGggKGtleXMgJWZpbGVzKQorCXsKKwkJbXkgKCRtYXJrLCAkbW9kZSkgPSBAeyRmaWxlc3skcGF0aH19OworCQkkcGF0aCA9fiBzLF4oW14vXSspLywsIGlmICRoYXZlX3RvcF9kaXI7CisJCXByaW50ZiBGSSAiTSAlbyA6JWkgJXNcbiIsICRtb2RlICYgMDExMSA/IDA3NTUgOiAwNjQ0LCAkbWFyaywgJHBhdGg7CisJfQorCXByaW50IEZJICJcbiI7CisKKwlwcmludCBGSSA8PEVPRjsKK3RhZyAkdGFyX25hbWUKK2Zyb20gJGJyYW5jaF9yZWYKK3RhZ2dlciAkY29tbWl0dGVyX25hbWUgPCRjb21taXR0ZXJfZW1haWw+ICRjb21taXRfdGltZSArMDAwMAorZGF0YSA8PEVORF9PRl9UQUdfTUVTU0FHRQorUGFja2FnZSAkdGFyX25hbWUKK0VORF9PRl9UQUdfTUVTU0FHRQorCitFT0YKKworCWNsb3NlIEk7Cit9CitjbG9zZSBGSTsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZ2l0dmlldy9naXR2aWV3IGIvY29udHJpYi9naXR2aWV3L2dpdHZpZXcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGM5OWRmYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZ2l0dmlldy9naXR2aWV3CkBAIC0wLDAgKzEsMTMwNSBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyIiIiBnaXR2aWV3CitHVUkgYnJvd3NlciBmb3IgZ2l0IHJlcG9zaXRvcnkKK1RoaXMgcHJvZ3JhbSBpcyBiYXNlZCBvbiBienJrIGJ5IFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QHVidW50dS5jb20+CisiIiIKK19fY29weXJpZ2h0X18gPSAiQ29weXJpZ2h0IChDKSAyMDA2IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuIgorX19jb3B5cmlnaHRfXyA9ICJDb3B5cmlnaHQgKEMpIDIwMDcgQW5lZXNoIEt1bWFyIEsuViA8YW5lZXNoLmt1bWFyQGdtYWlsLmNvbSIKK19fYXV0aG9yX18gICAgPSAiQW5lZXNoIEt1bWFyIEsuViA8YW5lZXNoLmt1bWFyQGdtYWlsLmNvbT4iCisKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgZ3RrCitpbXBvcnQgcHlndGsKK2ltcG9ydCBwYW5nbworaW1wb3J0IHJlCitpbXBvcnQgdGltZQoraW1wb3J0IGdvYmplY3QKK2ltcG9ydCBjYWlybworaW1wb3J0IG1hdGgKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCBmY250bAorCitoYXZlX2d0a3NvdXJjZXZpZXcyID0gRmFsc2UKK2hhdmVfZ3Rrc291cmNldmlldyA9IEZhbHNlCit0cnk6CisgICAgaW1wb3J0IGd0a3NvdXJjZXZpZXcyCisgICAgaGF2ZV9ndGtzb3VyY2V2aWV3MiA9IFRydWUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBndGtzb3VyY2V2aWV3CisgICAgICAgIGhhdmVfZ3Rrc291cmNldmlldyA9IFRydWUKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHByaW50ICJSdW5uaW5nIHdpdGhvdXQgZ3Rrc291cmNldmlldzIgb3IgZ3Rrc291cmNldmlldyBtb2R1bGUiCisKK3JlX2lkZW50ID0gcmUuY29tcGlsZSgnKGF1dGhvcnxjb21taXR0ZXIpICg/UDxpZGVudD4uKikgKD9QPGVwb2NoPlxkKykgKD9QPHR6PlsrLV1cZHs0fSknKQorCitkZWYgbGlzdF90b19zdHJpbmcoYXJncywgc2tpcCk6CisJY291bnQgPSBsZW4oYXJncykKKwlpID0gc2tpcAorCXN0cl9hcmc9IiAiCisJd2hpbGUgKGkgPCBjb3VudCApOgorCQlzdHJfYXJnID0gc3RyX2FyZyArIGFyZ3NbaV0KKwkJc3RyX2FyZyA9IHN0cl9hcmcgKyAiICIKKwkJaSA9IGkrMQorCisJcmV0dXJuIHN0cl9hcmcKKworZGVmIHNob3dfZGF0ZShlcG9jaCwgdHopOgorCXNlY3MgPSBmbG9hdChlcG9jaCkKKwl0enNlY3MgPSBmbG9hdCh0elsxOjNdKSAqIDM2MDAKKwl0enNlY3MgKz0gZmxvYXQodHpbMzo1XSkgKiA2MAorCWlmICh0elswXSA9PSAiKyIpOgorCQlzZWNzICs9IHR6c2VjcworCWVsc2U6CisJCXNlY3MgLT0gdHpzZWNzCisKKwlyZXR1cm4gdGltZS5zdHJmdGltZSgiJVktJW0tJWQgJUg6JU06JVMiLCB0aW1lLmdtdGltZShzZWNzKSkKKworZGVmIGdldF9zb3VyY2VfYnVmZmVyX2FuZF92aWV3KCk6CisJaWYgaGF2ZV9ndGtzb3VyY2V2aWV3MjoKKwkJYnVmZmVyID0gZ3Rrc291cmNldmlldzIuQnVmZmVyKCkKKwkJc2xtID0gZ3Rrc291cmNldmlldzIuTGFuZ3VhZ2VNYW5hZ2VyKCkKKwkJZ3NsID0gc2xtLmdldF9sYW5ndWFnZSgiZGlmZiIpCisJCWJ1ZmZlci5zZXRfaGlnaGxpZ2h0X3N5bnRheChUcnVlKQorCQlidWZmZXIuc2V0X2xhbmd1YWdlKGdzbCkKKwkJdmlldyA9IGd0a3NvdXJjZXZpZXcyLlZpZXcoYnVmZmVyKQorCWVsaWYgaGF2ZV9ndGtzb3VyY2V2aWV3OgorCQlidWZmZXIgPSBndGtzb3VyY2V2aWV3LlNvdXJjZUJ1ZmZlcigpCisJCXNsbSA9IGd0a3NvdXJjZXZpZXcuU291cmNlTGFuZ3VhZ2VzTWFuYWdlcigpCisJCWdzbCA9IHNsbS5nZXRfbGFuZ3VhZ2VfZnJvbV9taW1lX3R5cGUoInRleHQveC1wYXRjaCIpCisJCWJ1ZmZlci5zZXRfaGlnaGxpZ2h0KFRydWUpCisJCWJ1ZmZlci5zZXRfbGFuZ3VhZ2UoZ3NsKQorCQl2aWV3ID0gZ3Rrc291cmNldmlldy5Tb3VyY2VWaWV3KGJ1ZmZlcikKKwllbHNlOgorCQlidWZmZXIgPSBndGsuVGV4dEJ1ZmZlcigpCisJCXZpZXcgPSBndGsuVGV4dFZpZXcoYnVmZmVyKQorCXJldHVybiAoYnVmZmVyLCB2aWV3KQorCisKK2NsYXNzIENlbGxSZW5kZXJlckdyYXBoKGd0ay5HZW5lcmljQ2VsbFJlbmRlcmVyKToKKwkiIiJDZWxsIHJlbmRlcmVyIGZvciBkaXJlY3RlZCBncmFwaC4KKworCVRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGN1c3RvbSBHdGtDZWxsUmVuZGVyZXIgdGhhdAorCWRyYXdzIHBhcnQgb2YgdGhlIGRpcmVjdGVkIGdyYXBoIGJhc2VkIG9uIHRoZSBsaW5lcyBzdWdnZXN0ZWQgYnkgdGhlIGNvZGUKKwlpbiBncmFwaC5weS4KKworCUJlY2F1c2Ugd2UncmUgc2hpbnksIHdlIHVzZSBDYWlybyB0byBkbyB0aGlzLCBhbmQgYmVjYXVzZSB3ZSdyZSBuYXVnaHR5CisJd2UgY2hlYXQgYW5kIGRyYXcgb3ZlciB0aGUgYml0cyBvZiB0aGUgVHJlZVZpZXdDb2x1bW4gdGhhdCBhcmUgc3VwcG9zZWQgdG8KKwlqdXN0IGJlIGZvciB0aGUgYmFja2dyb3VuZC4KKworCVByb3BlcnRpZXM6CisJbm9kZSAgICAgICAgICAgICAgKGNvbHVtbiwgY29sb3VyLCBbIG5hbWVzIF0pIHR1cGxlIHRvIGRyYXcgcmV2aXNpb24gbm9kZSwKKwlpbl9saW5lcyAgICAgICAgICAoc3RhcnQsIGVuZCwgY29sb3VyKSB0dXBsZSBsaXN0IHRvIGRyYXcgaW53YXJkIGxpbmVzLAorCW91dF9saW5lcyAgICAgICAgIChzdGFydCwgZW5kLCBjb2xvdXIpIHR1cGxlIGxpc3QgdG8gZHJhdyBvdXR3YXJkIGxpbmVzLgorCSIiIgorCisJX19ncHJvcGVydGllc19fID0geworCSJub2RlIjogICAgICAgICAoIGdvYmplY3QuVFlQRV9QWU9CSkVDVCwgIm5vZGUiLAorCQkJICAicmV2aXNpb24gbm9kZSBpbnN0cnVjdGlvbiIsCisJCQkgIGdvYmplY3QuUEFSQU1fV1JJVEFCTEUKKwkJCSksCisJImluLWxpbmVzIjogICAgICggZ29iamVjdC5UWVBFX1BZT0JKRUNULCAiaW4tbGluZXMiLAorCQkJICAiaW5zdHJ1Y3Rpb25zIHRvIGRyYXcgbGluZXMgaW50byB0aGUgY2VsbCIsCisJCQkgIGdvYmplY3QuUEFSQU1fV1JJVEFCTEUKKwkJCSksCisJIm91dC1saW5lcyI6ICAgICggZ29iamVjdC5UWVBFX1BZT0JKRUNULCAib3V0LWxpbmVzIiwKKwkJCSAgImluc3RydWN0aW9ucyB0byBkcmF3IGxpbmVzIG91dCBvZiB0aGUgY2VsbCIsCisJCQkgIGdvYmplY3QuUEFSQU1fV1JJVEFCTEUKKwkJCSksCisJfQorCisJZGVmIGRvX3NldF9wcm9wZXJ0eShzZWxmLCBwcm9wZXJ0eSwgdmFsdWUpOgorCQkiIiJTZXQgcHJvcGVydGllcyBmcm9tIEdPYmplY3QgcHJvcGVydGllcy4iIiIKKwkJaWYgcHJvcGVydHkubmFtZSA9PSAibm9kZSI6CisJCQlzZWxmLm5vZGUgPSB2YWx1ZQorCQllbGlmIHByb3BlcnR5Lm5hbWUgPT0gImluLWxpbmVzIjoKKwkJCXNlbGYuaW5fbGluZXMgPSB2YWx1ZQorCQllbGlmIHByb3BlcnR5Lm5hbWUgPT0gIm91dC1saW5lcyI6CisJCQlzZWxmLm91dF9saW5lcyA9IHZhbHVlCisJCWVsc2U6CisJCQlyYWlzZSBBdHRyaWJ1dGVFcnJvciwgIm5vIHN1Y2ggcHJvcGVydHk6ICclcyciICUgcHJvcGVydHkubmFtZQorCisJZGVmIGJveF9zaXplKHNlbGYsIHdpZGdldCk6CisJCSIiIkNhbGN1bGF0ZSBib3ggc2l6ZSBiYXNlZCBvbiB3aWRnZXQncyBmb250LgorCisJCUNhY2hlIHRoaXMgYXMgaXQncyBwcm9iYWJseSBleHBlbnNpdmUgdG8gZ2V0LiAgSXQgZW5zdXJlcyB0aGF0IHdlCisJCWRyYXcgdGhlIGdyYXBoIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRoZSB0ZXh0LgorCQkiIiIKKwkJdHJ5OgorCQkJcmV0dXJuIHNlbGYuX2JveF9zaXplCisJCWV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKwkJCXBhbmdvX2N0eCA9IHdpZGdldC5nZXRfcGFuZ29fY29udGV4dCgpCisJCQlmb250X2Rlc2MgPSB3aWRnZXQuZ2V0X3N0eWxlKCkuZm9udF9kZXNjCisJCQltZXRyaWNzID0gcGFuZ29fY3R4LmdldF9tZXRyaWNzKGZvbnRfZGVzYykKKworCQkJYXNjZW50ID0gcGFuZ28uUElYRUxTKG1ldHJpY3MuZ2V0X2FzY2VudCgpKQorCQkJZGVzY2VudCA9IHBhbmdvLlBJWEVMUyhtZXRyaWNzLmdldF9kZXNjZW50KCkpCisKKwkJCXNlbGYuX2JveF9zaXplID0gYXNjZW50ICsgZGVzY2VudCArIDYKKwkJCXJldHVybiBzZWxmLl9ib3hfc2l6ZQorCisJZGVmIHNldF9jb2xvdXIoc2VsZiwgY3R4LCBjb2xvdXIsIGJnLCBmZyk6CisJCSIiIlNldCB0aGUgY29udGV4dCBzb3VyY2UgY29sb3VyLgorCisJCVBpY2tzIGEgZGlzdGluY3QgY29sb3VyIGJhc2VkIG9uIGFuIGludGVybmFsIHdoZWVsOyB0aGUgYmcKKwkJcGFyYW1ldGVyIHByb3ZpZGVzIHRoZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSBhc3NpZ25lZCB0byB0aGUgJ3plcm8nCisJCWNvbG91cnMgYW5kIHRoZSBmZyBwYXJhbWV0ZXIgcHJvdmlkZXMgdGhlIG11bHRpcGxpZXIgdGhhdCBzaG91bGQgYmUKKwkJYXBwbGllZCB0byB0aGUgZm9yZWdyb3VuZCBjb2xvdXJzLgorCQkiIiIKKwkJY29sb3VycyA9IFsKKwkJICAgICggMS4wLCAwLjAsIDAuMCApLAorCQkgICAgKCAxLjAsIDEuMCwgMC4wICksCisJCSAgICAoIDAuMCwgMS4wLCAwLjAgKSwKKwkJICAgICggMC4wLCAxLjAsIDEuMCApLAorCQkgICAgKCAwLjAsIDAuMCwgMS4wICksCisJCSAgICAoIDEuMCwgMC4wLCAxLjAgKSwKKwkJICAgIF0KKworCQljb2xvdXIgJT0gbGVuKGNvbG91cnMpCisJCXJlZCAgID0gKGNvbG91cnNbY29sb3VyXVswXSAqIGZnKSBvciBiZworCQlncmVlbiA9IChjb2xvdXJzW2NvbG91cl1bMV0gKiBmZykgb3IgYmcKKwkJYmx1ZSAgPSAoY29sb3Vyc1tjb2xvdXJdWzJdICogZmcpIG9yIGJnCisKKwkJY3R4LnNldF9zb3VyY2VfcmdiKHJlZCwgZ3JlZW4sIGJsdWUpCisKKwlkZWYgb25fZ2V0X3NpemUoc2VsZiwgd2lkZ2V0LCBjZWxsX2FyZWEpOgorCQkiIiJSZXR1cm4gdGhlIHNpemUgd2UgbmVlZCBmb3IgdGhpcyBjZWxsLgorCisJCUVhY2ggY2VsbCBpcyBkcmF3biBpbmRpdmlkdWFsbHkgYW5kIGlzIG9ubHkgYXMgd2lkZSBhcyBpdCBuZWVkcworCQl0byBiZSwgd2UgbGV0IHRoZSBUcmVlVmlld0NvbHVtbiB0YWtlIGNhcmUgb2YgbWFraW5nIHRoZW0gYWxsCisJCWxpbmUgdXAuCisJCSIiIgorCQlib3hfc2l6ZSA9IHNlbGYuYm94X3NpemUod2lkZ2V0KQorCisJCWNvbHMgPSBzZWxmLm5vZGVbMF0KKwkJZm9yIHN0YXJ0LCBlbmQsIGNvbG91ciBpbiBzZWxmLmluX2xpbmVzICsgc2VsZi5vdXRfbGluZXM6CisJCQljb2xzID0gaW50KG1heChjb2xzLCBzdGFydCwgZW5kKSkKKworCQkoY29sdW1uLCBjb2xvdXIsIG5hbWVzKSA9IHNlbGYubm9kZQorCQluYW1lc19sZW4gPSAwCisJCWlmIChsZW4obmFtZXMpICE9IDApOgorCQkJZm9yIGl0ZW0gaW4gbmFtZXM6CisJCQkJbmFtZXNfbGVuICs9IGxlbihpdGVtKQorCisJCXdpZHRoID0gYm94X3NpemUgKiAoY29scyArIDEgKSArIG5hbWVzX2xlbgorCQloZWlnaHQgPSBib3hfc2l6ZQorCisJCSMgRklYTUUgSSBoYXZlIG5vIGlkZWEgaG93IHRvIHVzZSBjZWxsX2FyZWEgcHJvcGVybHkKKwkJcmV0dXJuICgwLCAwLCB3aWR0aCwgaGVpZ2h0KQorCisJZGVmIG9uX3JlbmRlcihzZWxmLCB3aW5kb3csIHdpZGdldCwgYmdfYXJlYSwgY2VsbF9hcmVhLCBleHBfYXJlYSwgZmxhZ3MpOgorCQkiIiJSZW5kZXIgYW4gaW5kaXZpZHVhbCBjZWxsLgorCisJCURyYXdzIHRoZSBjZWxsIGNvbnRlbnRzIHVzaW5nIGNhaXJvLCB0YWtpbmcgY2FyZSB0byBjbGlwIHdoYXQgd2UKKwkJZG8gdG8gd2l0aGluIHRoZSBiYWNrZ3JvdW5kIGFyZWEgc28gd2UgZG9uJ3QgZHJhdyBvdmVyIG90aGVyIGNlbGxzLgorCQlOb3RlIHRoYXQgd2UncmUgYSBiaXQgbmF1Z2h0eSB0aGVyZSBhbmQgc2hvdWxkIHJlYWxseSBiZSBkcmF3aW5nCisJCWluIHRoZSBjZWxsX2FyZWEgKG9yIGV2ZW4gdGhlIGV4cG9zZWQgYXJlYSksIGJ1dCB3ZSBleHBsaWNpdGx5IGRvbid0CisJCXdhbnQgYW55IGd1dHRlci4KKworCQlXZSB0cnkgYW5kIGJlIGEgbGl0dGxlIGNsZXZlciwgaWYgdGhlIGxpbmUgd2UgbmVlZCB0byBkcmF3IGlzIGdvaW5nCisJCXRvIGNyb3NzIG90aGVyIGNvbHVtbnMgd2UgYWN0dWFsbHkgZHJhdyBpdCBhcyBpbiB0aGUgLi0tLScgc3R5bGUKKwkJaW5zdGVhZCBvZiBhIHB1cmUgZGlhZ29uYWwgLi4uIHRoaXMgcmVkdWNlcyBjb25mdXNpb24gYnkgYW4KKwkJaW5jcmVkaWJsZSBhbW91bnQuCisJCSIiIgorCQljdHggPSB3aW5kb3cuY2Fpcm9fY3JlYXRlKCkKKwkJY3R4LnJlY3RhbmdsZShiZ19hcmVhLngsIGJnX2FyZWEueSwgYmdfYXJlYS53aWR0aCwgYmdfYXJlYS5oZWlnaHQpCisJCWN0eC5jbGlwKCkKKworCQlib3hfc2l6ZSA9IHNlbGYuYm94X3NpemUod2lkZ2V0KQorCisJCWN0eC5zZXRfbGluZV93aWR0aChib3hfc2l6ZSAvIDgpCisJCWN0eC5zZXRfbGluZV9jYXAoY2Fpcm8uTElORV9DQVBfU1FVQVJFKQorCisJCSMgRHJhdyBsaW5lcyBpbnRvIHRoZSBjZWxsCisJCWZvciBzdGFydCwgZW5kLCBjb2xvdXIgaW4gc2VsZi5pbl9saW5lczoKKwkJCWN0eC5tb3ZlX3RvKGNlbGxfYXJlYS54ICsgYm94X3NpemUgKiBzdGFydCArIGJveF9zaXplIC8gMiwKKwkJCQkJYmdfYXJlYS55IC0gYmdfYXJlYS5oZWlnaHQgLyAyKQorCisJCQlpZiBzdGFydCAtIGVuZCA+IDE6CisJCQkJY3R4LmxpbmVfdG8oY2VsbF9hcmVhLnggKyBib3hfc2l6ZSAqIHN0YXJ0LCBiZ19hcmVhLnkpCisJCQkJY3R4LmxpbmVfdG8oY2VsbF9hcmVhLnggKyBib3hfc2l6ZSAqIGVuZCArIGJveF9zaXplLCBiZ19hcmVhLnkpCisJCQllbGlmIHN0YXJ0IC0gZW5kIDwgLTE6CisJCQkJY3R4LmxpbmVfdG8oY2VsbF9hcmVhLnggKyBib3hfc2l6ZSAqIHN0YXJ0ICsgYm94X3NpemUsCisJCQkJCQliZ19hcmVhLnkpCisJCQkJY3R4LmxpbmVfdG8oY2VsbF9hcmVhLnggKyBib3hfc2l6ZSAqIGVuZCwgYmdfYXJlYS55KQorCisJCQljdHgubGluZV90byhjZWxsX2FyZWEueCArIGJveF9zaXplICogZW5kICsgYm94X3NpemUgLyAyLAorCQkJCQliZ19hcmVhLnkgKyBiZ19hcmVhLmhlaWdodCAvIDIpCisKKwkJCXNlbGYuc2V0X2NvbG91cihjdHgsIGNvbG91ciwgMC4wLCAwLjY1KQorCQkJY3R4LnN0cm9rZSgpCisKKwkJIyBEcmF3IGxpbmVzIG91dCBvZiB0aGUgY2VsbAorCQlmb3Igc3RhcnQsIGVuZCwgY29sb3VyIGluIHNlbGYub3V0X2xpbmVzOgorCQkJY3R4Lm1vdmVfdG8oY2VsbF9hcmVhLnggKyBib3hfc2l6ZSAqIHN0YXJ0ICsgYm94X3NpemUgLyAyLAorCQkJCQliZ19hcmVhLnkgKyBiZ19hcmVhLmhlaWdodCAvIDIpCisKKwkJCWlmIHN0YXJ0IC0gZW5kID4gMToKKwkJCQljdHgubGluZV90byhjZWxsX2FyZWEueCArIGJveF9zaXplICogc3RhcnQsCisJCQkJCQliZ19hcmVhLnkgKyBiZ19hcmVhLmhlaWdodCkKKwkJCQljdHgubGluZV90byhjZWxsX2FyZWEueCArIGJveF9zaXplICogZW5kICsgYm94X3NpemUsCisJCQkJCQliZ19hcmVhLnkgKyBiZ19hcmVhLmhlaWdodCkKKwkJCWVsaWYgc3RhcnQgLSBlbmQgPCAtMToKKwkJCQljdHgubGluZV90byhjZWxsX2FyZWEueCArIGJveF9zaXplICogc3RhcnQgKyBib3hfc2l6ZSwKKwkJCQkJCWJnX2FyZWEueSArIGJnX2FyZWEuaGVpZ2h0KQorCQkJCWN0eC5saW5lX3RvKGNlbGxfYXJlYS54ICsgYm94X3NpemUgKiBlbmQsCisJCQkJCQliZ19hcmVhLnkgKyBiZ19hcmVhLmhlaWdodCkKKworCQkJY3R4LmxpbmVfdG8oY2VsbF9hcmVhLnggKyBib3hfc2l6ZSAqIGVuZCArIGJveF9zaXplIC8gMiwKKwkJCQkJYmdfYXJlYS55ICsgYmdfYXJlYS5oZWlnaHQgLyAyICsgYmdfYXJlYS5oZWlnaHQpCisKKwkJCXNlbGYuc2V0X2NvbG91cihjdHgsIGNvbG91ciwgMC4wLCAwLjY1KQorCQkJY3R4LnN0cm9rZSgpCisKKwkJIyBEcmF3IHRoZSByZXZpc2lvbiBub2RlIGluIHRoZSByaWdodCBjb2x1bW4KKwkJKGNvbHVtbiwgY29sb3VyLCBuYW1lcykgPSBzZWxmLm5vZGUKKwkJY3R4LmFyYyhjZWxsX2FyZWEueCArIGJveF9zaXplICogY29sdW1uICsgYm94X3NpemUgLyAyLAorCQkJCWNlbGxfYXJlYS55ICsgY2VsbF9hcmVhLmhlaWdodCAvIDIsCisJCQkJYm94X3NpemUgLyA0LCAwLCAyICogbWF0aC5waSkKKworCisJCXNlbGYuc2V0X2NvbG91cihjdHgsIGNvbG91ciwgMC4wLCAwLjUpCisJCWN0eC5zdHJva2VfcHJlc2VydmUoKQorCisJCXNlbGYuc2V0X2NvbG91cihjdHgsIGNvbG91ciwgMC41LCAxLjApCisJCWN0eC5maWxsX3ByZXNlcnZlKCkKKworCQlpZiAobGVuKG5hbWVzKSAhPSAwKToKKwkJCW5hbWUgPSAiICIKKwkJCWZvciBpdGVtIGluIG5hbWVzOgorCQkJCW5hbWUgPSBuYW1lICsgaXRlbSArICIgIgorCisJCQljdHguc2V0X2ZvbnRfc2l6ZSgxMykKKwkJCWlmIChmbGFncyAmIDEpOgorCQkJCXNlbGYuc2V0X2NvbG91cihjdHgsIGNvbG91ciwgMC41LCAxLjApCisJCQllbHNlOgorCQkJCXNlbGYuc2V0X2NvbG91cihjdHgsIGNvbG91ciwgMC4wLCAwLjUpCisJCQljdHguc2hvd190ZXh0KG5hbWUpCisKK2NsYXNzIENvbW1pdChvYmplY3QpOgorCSIiIiBUaGlzIHJlcHJlc2VudCBhIGNvbW1pdCBvYmplY3Qgb2J0YWluZWQgYWZ0ZXIgcGFyc2luZyB0aGUgZ2l0LXJldi1saXN0CisJb3V0cHV0ICIiIgorCisJX19zbG90c19fID0gWydjaGlsZHJlbl9zaGExJywgJ21lc3NhZ2UnLCAnYXV0aG9yJywgJ2RhdGUnLCAnY29tbWl0dGVyJywKKwkJCQkgJ2NvbW1pdF9kYXRlJywgJ2NvbW1pdF9zaGExJywgJ3BhcmVudF9zaGExJ10KKworCWNoaWxkcmVuX3NoYTEgPSB7fQorCisJZGVmIF9faW5pdF9fKHNlbGYsIGNvbW1pdF9saW5lcyk6CisJCXNlbGYubWVzc2FnZQkJPSAiIgorCQlzZWxmLmF1dGhvcgkJPSAiIgorCQlzZWxmLmRhdGUJCT0gIiIKKwkJc2VsZi5jb21taXR0ZXIJCT0gIiIKKwkJc2VsZi5jb21taXRfZGF0ZQk9ICIiCisJCXNlbGYuY29tbWl0X3NoYTEJPSAiIgorCQlzZWxmLnBhcmVudF9zaGExCT0gWyBdCisJCXNlbGYucGFyc2VfY29tbWl0KGNvbW1pdF9saW5lcykKKworCisJZGVmIHBhcnNlX2NvbW1pdChzZWxmLCBjb21taXRfbGluZXMpOgorCisJCSMgRmlyc3QgbGluZSBpcyB0aGUgc2hhMSBsaW5lcworCQlsaW5lID0gc3RyaW5nLnN0cmlwKGNvbW1pdF9saW5lc1swXSkKKwkJc2hhMSA9IHJlLnNwbGl0KCIgIiwgbGluZSkKKwkJc2VsZi5jb21taXRfc2hhMSA9IHNoYTFbMF0KKwkJc2VsZi5wYXJlbnRfc2hhMSA9IHNoYTFbMTpdCisKKwkJI2J1aWxkIHRoZSBjaGlsZCBsaXN0CisJCWZvciBwYXJlbnRfaWQgaW4gc2VsZi5wYXJlbnRfc2hhMToKKwkJCXRyeToKKwkJCQlDb21taXQuY2hpbGRyZW5fc2hhMVtwYXJlbnRfaWRdLmFwcGVuZChzZWxmLmNvbW1pdF9zaGExKQorCQkJZXhjZXB0IEtleUVycm9yOgorCQkJCUNvbW1pdC5jaGlsZHJlbl9zaGExW3BhcmVudF9pZF0gPSBbc2VsZi5jb21taXRfc2hhMV0KKworCQkjIElGIHdlIGRvbid0IGhhdmUgcGFyZW50CisJCWlmIChsZW4oc2VsZi5wYXJlbnRfc2hhMSkgPT0gMCk6CisJCQlzZWxmLnBhcmVudF9zaGExID0gWzBdCisKKwkJZm9yIGxpbmUgaW4gY29tbWl0X2xpbmVzWzE6XToKKwkJCW0gPSByZS5tYXRjaCgiXiAiLCBsaW5lKQorCQkJaWYgKG0gIT0gTm9uZSk6CisJCQkJIyBGaXJzdCBsaW5lIG9mIHRoZSBjb21taXQgbWVzc2FnZSB1c2VkIGZvciBzaG9ydCBsb2cKKwkJCQlpZiBzZWxmLm1lc3NhZ2UgPT0gIiI6CisJCQkJCXNlbGYubWVzc2FnZSA9IHN0cmluZy5zdHJpcChsaW5lKQorCQkJCWNvbnRpbnVlCisKKwkJCW0gPSByZS5tYXRjaCgidHJlZSIsIGxpbmUpCisJCQlpZiAobSAhPSBOb25lKToKKwkJCQljb250aW51ZQorCisJCQltID0gcmUubWF0Y2goInBhcmVudCIsIGxpbmUpCisJCQlpZiAobSAhPSBOb25lKToKKwkJCQljb250aW51ZQorCisJCQltID0gcmVfaWRlbnQubWF0Y2gobGluZSkKKwkJCWlmIChtICE9IE5vbmUpOgorCQkJCWRhdGUgPSBzaG93X2RhdGUobS5ncm91cCgnZXBvY2gnKSwgbS5ncm91cCgndHonKSkKKwkJCQlpZiBtLmdyb3VwKDEpID09ICJhdXRob3IiOgorCQkJCQlzZWxmLmF1dGhvciA9IG0uZ3JvdXAoJ2lkZW50JykKKwkJCQkJc2VsZi5kYXRlID0gZGF0ZQorCQkJCWVsaWYgbS5ncm91cCgxKSA9PSAiY29tbWl0dGVyIjoKKwkJCQkJc2VsZi5jb21taXR0ZXIgPSBtLmdyb3VwKCdpZGVudCcpCisJCQkJCXNlbGYuY29tbWl0X2RhdGUgPSBkYXRlCisKKwkJCQljb250aW51ZQorCisJZGVmIGdldF9tZXNzYWdlKHNlbGYsIHdpdGhfZGlmZj0wKToKKwkJaWYgKHdpdGhfZGlmZiA9PSAxKToKKwkJCW1lc3NhZ2UgPSBzZWxmLmRpZmZfdHJlZSgpCisJCWVsc2U6CisJCQlmcCA9IG9zLnBvcGVuKCJnaXQgY2F0LWZpbGUgY29tbWl0ICIgKyBzZWxmLmNvbW1pdF9zaGExKQorCQkJbWVzc2FnZSA9IGZwLnJlYWQoKQorCQkJZnAuY2xvc2UoKQorCisJCXJldHVybiBtZXNzYWdlCisKKwlkZWYgZGlmZl90cmVlKHNlbGYpOgorCQlmcCA9IG9zLnBvcGVuKCJnaXQgZGlmZi10cmVlIC0tcHJldHR5IC0tY2MgIC12IC1wIC0tYWx3YXlzICIgKyAgc2VsZi5jb21taXRfc2hhMSkKKwkJZGlmZiA9IGZwLnJlYWQoKQorCQlmcC5jbG9zZSgpCisJCXJldHVybiBkaWZmCisKK2NsYXNzIEFubm90YXRlV2luZG93KG9iamVjdCk6CisJIiIiQW5ub3RhdGUgd2luZG93LgorCVRoaXMgb2JqZWN0IHJlcHJlc2VudHMgYW5kIG1hbmFnZXMgYSBzaW5nbGUgd2luZG93IGNvbnRhaW5pbmcgdGhlCisJYW5ub3RhdGUgaW5mb3JtYXRpb24gb2YgdGhlIGZpbGUKKwkiIiIKKworCWRlZiBfX2luaXRfXyhzZWxmKToKKwkJc2VsZi53aW5kb3cgPSBndGsuV2luZG93KGd0ay5XSU5ET1dfVE9QTEVWRUwpCisJCXNlbGYud2luZG93LnNldF9ib3JkZXJfd2lkdGgoMCkKKwkJc2VsZi53aW5kb3cuc2V0X3RpdGxlKCJHaXQgcmVwb3NpdG9yeSBicm93c2VyIGFubm90YXRpb24gd2luZG93IikKKwkJc2VsZi5wcmV2X3JlYWQgPSAiIgorCisJCSMgVXNlIHR3byB0aGlyZHMgb2YgdGhlIHNjcmVlbiBieSBkZWZhdWx0CisJCXNjcmVlbiA9IHNlbGYud2luZG93LmdldF9zY3JlZW4oKQorCQltb25pdG9yID0gc2NyZWVuLmdldF9tb25pdG9yX2dlb21ldHJ5KDApCisJCXdpZHRoID0gaW50KG1vbml0b3Iud2lkdGggKiAwLjY2KQorCQloZWlnaHQgPSBpbnQobW9uaXRvci5oZWlnaHQgKiAwLjY2KQorCQlzZWxmLndpbmRvdy5zZXRfZGVmYXVsdF9zaXplKHdpZHRoLCBoZWlnaHQpCisKKwlkZWYgYWRkX2ZpbGVfZGF0YShzZWxmLCBmaWxlbmFtZSwgY29tbWl0X3NoYTEsIGxpbmVfbnVtKToKKwkJZnAgPSBvcy5wb3BlbigiZ2l0IGNhdC1maWxlIGJsb2IgIiArIGNvbW1pdF9zaGExICsiOiIrZmlsZW5hbWUpCisJCWkgPSAxOworCQlmb3IgbGluZSBpbiBmcC5yZWFkbGluZXMoKToKKwkJCWxpbmUgPSBzdHJpbmcucnN0cmlwKGxpbmUpCisJCQlzZWxmLm1vZGVsLmFwcGVuZChOb25lLCBbIkhFQUQiLCBmaWxlbmFtZSwgbGluZSwgaV0pCisJCQlpID0gaSsxCisJCWZwLmNsb3NlKCkKKworCQkjIG5vdyBzZXQgdGhlIGN1cnNvciBwb3NpdGlvbgorCQlzZWxmLnRyZWV2aWV3LnNldF9jdXJzb3IobGluZV9udW0tMSkKKwkJc2VsZi50cmVldmlldy5ncmFiX2ZvY3VzKCkKKworCWRlZiBfdHJlZXZpZXdfY3Vyc29yX2NiKHNlbGYsICphcmdzKToKKwkJIiIiQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIHRyZWV2aWV3IGN1cnNvciBjaGFuZ2VzLiIiIgorCQkocGF0aCwgY29sKSA9IHNlbGYudHJlZXZpZXcuZ2V0X2N1cnNvcigpCisJCWNvbW1pdF9zaGExID0gc2VsZi5tb2RlbFtwYXRoXVswXQorCQljb21taXRfbXNnID0gIiIKKwkJZnAgPSBvcy5wb3BlbigiZ2l0IGNhdC1maWxlIGNvbW1pdCAiICsgY29tbWl0X3NoYTEpCisJCWZvciBsaW5lIGluIGZwLnJlYWRsaW5lcygpOgorCQkJY29tbWl0X21zZyA9ICBjb21taXRfbXNnICsgbGluZQorCQlmcC5jbG9zZSgpCisKKwkJc2VsZi5jb21taXRfYnVmZmVyLnNldF90ZXh0KGNvbW1pdF9tc2cpCisKKwlkZWYgX3RyZWV2aWV3X3Jvd19hY3RpdmF0ZWQoc2VsZiwgKmFyZ3MpOgorCQkiIiJDYWxsYmFjayBmb3Igd2hlbiB0aGUgdHJlZXZpZXcgcm93IGdldHMgc2VsZWN0ZWQuIiIiCisJCShwYXRoLCBjb2wpID0gc2VsZi50cmVldmlldy5nZXRfY3Vyc29yKCkKKwkJY29tbWl0X3NoYTEgPSBzZWxmLm1vZGVsW3BhdGhdWzBdCisJCWZpbGVuYW1lICAgID0gc2VsZi5tb2RlbFtwYXRoXVsxXQorCQlsaW5lX251bSAgICA9IHNlbGYubW9kZWxbcGF0aF1bM10KKworCQl3aW5kb3cgPSBBbm5vdGF0ZVdpbmRvdygpOworCQlmcCA9IG9zLnBvcGVuKCJnaXQgcmV2LXBhcnNlICIrIGNvbW1pdF9zaGExICsgIn4xIikKKwkJY29tbWl0X3NoYTEgPSBzdHJpbmcuc3RyaXAoZnAucmVhZGxpbmUoKSkKKwkJZnAuY2xvc2UoKQorCQl3aW5kb3cuYW5ub3RhdGUoZmlsZW5hbWUsIGNvbW1pdF9zaGExLCBsaW5lX251bSkKKworCWRlZiBkYXRhX3JlYWR5KHNlbGYsIHNvdXJjZSwgY29uZGl0aW9uKToKKwkJd2hpbGUgKDEpOgorCQkJdHJ5IDoKKwkJCQkjIEEgc2ltcGxlIHJlYWRsaW5lIGRvZXNuJ3Qgd29yaworCQkJCSMgYSByZWFkbGluZSBidWcgPz8KKwkJCQlidWZmZXIgPSBzb3VyY2UucmVhZCgxMDApCisKKwkJCWV4Y2VwdDoKKwkJCQkjIHJlc291cmNlIHRlbXBvcmFyeSBub3QgYXZhaWxhYmxlCisJCQkJcmV0dXJuIFRydWUKKworCQkJaWYgKGxlbihidWZmZXIpID09IDApOgorCQkJCWdvYmplY3Quc291cmNlX3JlbW92ZShzZWxmLmlvX3dhdGNoX3RhZykKKwkJCQlzb3VyY2UuY2xvc2UoKQorCQkJCXJldHVybiBGYWxzZQorCisJCQlpZiAoc2VsZi5wcmV2X3JlYWQgIT0gIiIpOgorCQkJCWJ1ZmZlciA9IHNlbGYucHJldl9yZWFkICsgYnVmZmVyCisJCQkJc2VsZi5wcmV2X3JlYWQgPSAiIgorCisJCQlpZiAoYnVmZmVyW2xlbihidWZmZXIpIC0xXSAhPSAnXG4nKToKKwkJCQl0cnk6CisJCQkJCW5ld2xpbmVfaW5kZXggPSBidWZmZXIucmluZGV4KCJcbiIpCisJCQkJZXhjZXB0IFZhbHVlRXJyb3I6CisJCQkJCW5ld2xpbmVfaW5kZXggPSAwCisKKwkJCQlzZWxmLnByZXZfcmVhZCA9IGJ1ZmZlcltuZXdsaW5lX2luZGV4OihsZW4oYnVmZmVyKSldCisJCQkJYnVmZmVyID0gYnVmZmVyWzA6bmV3bGluZV9pbmRleF0KKworCQkJZm9yIGJ1ZmYgaW4gYnVmZmVyLnNwbGl0KCJcbiIpOgorCQkJCWFubm90YXRlX2xpbmUgPSByZS5jb21waWxlKCdeKFswLTlhLWZdezQwfSkgKC4rKSAoLispICguKykkJykKKwkJCQltID0gYW5ub3RhdGVfbGluZS5tYXRjaChidWZmKQorCQkJCWlmIG5vdCBtOgorCQkJCQlhbm5vdGF0ZV9saW5lID0gcmUuY29tcGlsZSgnXihmaWxlbmFtZSkgKC4rKSQnKQorCQkJCQltID0gYW5ub3RhdGVfbGluZS5tYXRjaChidWZmKQorCQkJCQlpZiBub3QgbToKKwkJCQkJCWNvbnRpbnVlCisJCQkJCWZpbGVuYW1lID0gbS5ncm91cCgyKQorCQkJCWVsc2U6CisJCQkJCXNlbGYuY29tbWl0X3NoYTEgPSBtLmdyb3VwKDEpCisJCQkJCXNlbGYuc291cmNlX2xpbmUgPSBpbnQobS5ncm91cCgyKSkKKwkJCQkJc2VsZi5yZXN1bHRfbGluZSA9IGludChtLmdyb3VwKDMpKQorCQkJCQlzZWxmLmNvdW50CSAgICA9IGludChtLmdyb3VwKDQpKQorCQkJCQkjc2V0IHRoZSBkZXRhaWxzIG9ubHkgd2hlbiB3ZSBoYXZlIHRoZSBmaWxlIG5hbWUKKwkJCQkJY29udGludWUKKworCQkJCXdoaWxlIChzZWxmLmNvdW50ID4gMCk6CisJCQkJCSMgc2V0IGF0IHJlc3VsdF9saW5lICsgY291bnQtMSB0aGUgc2hhMSBhcyBjb21taXRfc2hhMQorCQkJCQlzZWxmLmNvdW50ID0gc2VsZi5jb3VudCAtIDEKKwkJCQkJaXRlciA9IHNlbGYubW9kZWwuaXRlcl9udGhfY2hpbGQoTm9uZSwgc2VsZi5yZXN1bHRfbGluZSArIHNlbGYuY291bnQtMSkKKwkJCQkJc2VsZi5tb2RlbC5zZXQoaXRlciwgMCwgc2VsZi5jb21taXRfc2hhMSwgMSwgZmlsZW5hbWUsIDMsIHNlbGYuc291cmNlX2xpbmUpCisKKworCWRlZiBhbm5vdGF0ZShzZWxmLCBmaWxlbmFtZSwgY29tbWl0X3NoYTEsIGxpbmVfbnVtKToKKwkJIyB2ZXJpZnkgdGhlIGNvbW1pdF9zaGExIHNwZWNpZmllZCBoYXMgdGhpcyBmaWxlbmFtZQorCisJCWZwID0gb3MucG9wZW4oImdpdCBscy10cmVlICIrIGNvbW1pdF9zaGExICsgIiAtLSAiICsgZmlsZW5hbWUpCisJCWxpbmUgPSBzdHJpbmcuc3RyaXAoZnAucmVhZGxpbmUoKSkKKwkJaWYgbGluZSA9PSAnJzoKKwkJCSMgcG9wIHVwIHRoZSBtZXNzYWdlIHRoZSBmaWxlIGlzIG5vdCB0aGVyZSBhcyBhIHBhcnQgb2YgdGhlIGNvbW1pdAorCQkJZnAuY2xvc2UoKQorCQkJZGlhbG9nID0gZ3RrLk1lc3NhZ2VEaWFsb2cocGFyZW50PU5vbmUsIGZsYWdzPTAsCisJCQkJCXR5cGU9Z3RrLk1FU1NBR0VfV0FSTklORywgYnV0dG9ucz1ndGsuQlVUVE9OU19DTE9TRSwKKwkJCQkJbWVzc2FnZV9mb3JtYXQ9Tm9uZSkKKwkJCWRpYWxvZy5zZXRfbWFya3VwKCJUaGUgZmlsZSAlcyBpcyBub3QgcHJlc2VudCBpbiB0aGUgcGFyZW50IGNvbW1pdCAlcyIgJSAoZmlsZW5hbWUsIGNvbW1pdF9zaGExKSkKKwkJCWRpYWxvZy5ydW4oKQorCQkJZGlhbG9nLmRlc3Ryb3koKQorCQkJcmV0dXJuCisKKwkJZnAuY2xvc2UoKQorCisJCXZwYW4gPSBndGsuVlBhbmVkKCk7CisJCXNlbGYud2luZG93LmFkZCh2cGFuKTsKKwkJdnBhbi5zaG93KCkKKworCQlzY3JvbGx3aW4gPSBndGsuU2Nyb2xsZWRXaW5kb3coKQorCQlzY3JvbGx3aW4uc2V0X3BvbGljeShndGsuUE9MSUNZX0FVVE9NQVRJQywgZ3RrLlBPTElDWV9BVVRPTUFUSUMpCisJCXNjcm9sbHdpbi5zZXRfc2hhZG93X3R5cGUoZ3RrLlNIQURPV19JTikKKwkJdnBhbi5wYWNrMShzY3JvbGx3aW4sIFRydWUsIFRydWUpOworCQlzY3JvbGx3aW4uc2hvdygpCisKKwkJc2VsZi5tb2RlbCA9IGd0ay5UcmVlU3RvcmUoc3RyLCBzdHIsIHN0ciwgaW50KQorCQlzZWxmLnRyZWV2aWV3ID0gZ3RrLlRyZWVWaWV3KHNlbGYubW9kZWwpCisJCXNlbGYudHJlZXZpZXcuc2V0X3J1bGVzX2hpbnQoVHJ1ZSkKKwkJc2VsZi50cmVldmlldy5zZXRfc2VhcmNoX2NvbHVtbigwKQorCQlzZWxmLnRyZWV2aWV3LmNvbm5lY3QoImN1cnNvci1jaGFuZ2VkIiwgc2VsZi5fdHJlZXZpZXdfY3Vyc29yX2NiKQorCQlzZWxmLnRyZWV2aWV3LmNvbm5lY3QoInJvdy1hY3RpdmF0ZWQiLCBzZWxmLl90cmVldmlld19yb3dfYWN0aXZhdGVkKQorCQlzY3JvbGx3aW4uYWRkKHNlbGYudHJlZXZpZXcpCisJCXNlbGYudHJlZXZpZXcuc2hvdygpCisKKwkJY2VsbCA9IGd0ay5DZWxsUmVuZGVyZXJUZXh0KCkKKwkJY2VsbC5zZXRfcHJvcGVydHkoIndpZHRoLWNoYXJzIiwgMTApCisJCWNlbGwuc2V0X3Byb3BlcnR5KCJlbGxpcHNpemUiLCBwYW5nby5FTExJUFNJWkVfRU5EKQorCQljb2x1bW4gPSBndGsuVHJlZVZpZXdDb2x1bW4oIkNvbW1pdCIpCisJCWNvbHVtbi5zZXRfcmVzaXphYmxlKFRydWUpCisJCWNvbHVtbi5wYWNrX3N0YXJ0KGNlbGwsIGV4cGFuZD1UcnVlKQorCQljb2x1bW4uYWRkX2F0dHJpYnV0ZShjZWxsLCAidGV4dCIsIDApCisJCXNlbGYudHJlZXZpZXcuYXBwZW5kX2NvbHVtbihjb2x1bW4pCisKKwkJY2VsbCA9IGd0ay5DZWxsUmVuZGVyZXJUZXh0KCkKKwkJY2VsbC5zZXRfcHJvcGVydHkoIndpZHRoLWNoYXJzIiwgMjApCisJCWNlbGwuc2V0X3Byb3BlcnR5KCJlbGxpcHNpemUiLCBwYW5nby5FTExJUFNJWkVfRU5EKQorCQljb2x1bW4gPSBndGsuVHJlZVZpZXdDb2x1bW4oIkZpbGUgTmFtZSIpCisJCWNvbHVtbi5zZXRfcmVzaXphYmxlKFRydWUpCisJCWNvbHVtbi5wYWNrX3N0YXJ0KGNlbGwsIGV4cGFuZD1UcnVlKQorCQljb2x1bW4uYWRkX2F0dHJpYnV0ZShjZWxsLCAidGV4dCIsIDEpCisJCXNlbGYudHJlZXZpZXcuYXBwZW5kX2NvbHVtbihjb2x1bW4pCisKKwkJY2VsbCA9IGd0ay5DZWxsUmVuZGVyZXJUZXh0KCkKKwkJY2VsbC5zZXRfcHJvcGVydHkoIndpZHRoLWNoYXJzIiwgMjApCisJCWNlbGwuc2V0X3Byb3BlcnR5KCJlbGxpcHNpemUiLCBwYW5nby5FTExJUFNJWkVfRU5EKQorCQljb2x1bW4gPSBndGsuVHJlZVZpZXdDb2x1bW4oIkRhdGEiKQorCQljb2x1bW4uc2V0X3Jlc2l6YWJsZShUcnVlKQorCQljb2x1bW4ucGFja19zdGFydChjZWxsLCBleHBhbmQ9VHJ1ZSkKKwkJY29sdW1uLmFkZF9hdHRyaWJ1dGUoY2VsbCwgInRleHQiLCAyKQorCQlzZWxmLnRyZWV2aWV3LmFwcGVuZF9jb2x1bW4oY29sdW1uKQorCisJCSMgVGhlIGNvbW1pdCBtZXNzYWdlIHdpbmRvdworCQlzY3JvbGx3aW4gPSBndGsuU2Nyb2xsZWRXaW5kb3coKQorCQlzY3JvbGx3aW4uc2V0X3BvbGljeShndGsuUE9MSUNZX0FVVE9NQVRJQywgZ3RrLlBPTElDWV9BVVRPTUFUSUMpCisJCXNjcm9sbHdpbi5zZXRfc2hhZG93X3R5cGUoZ3RrLlNIQURPV19JTikKKwkJdnBhbi5wYWNrMihzY3JvbGx3aW4sIFRydWUsIFRydWUpOworCQlzY3JvbGx3aW4uc2hvdygpCisKKwkJY29tbWl0X3RleHQgPSBndGsuVGV4dFZpZXcoKQorCQlzZWxmLmNvbW1pdF9idWZmZXIgPSBndGsuVGV4dEJ1ZmZlcigpCisJCWNvbW1pdF90ZXh0LnNldF9idWZmZXIoc2VsZi5jb21taXRfYnVmZmVyKQorCQlzY3JvbGx3aW4uYWRkKGNvbW1pdF90ZXh0KQorCQljb21taXRfdGV4dC5zaG93KCkKKworCQlzZWxmLndpbmRvdy5zaG93KCkKKworCQlzZWxmLmFkZF9maWxlX2RhdGEoZmlsZW5hbWUsIGNvbW1pdF9zaGExLCBsaW5lX251bSkKKworCQlmcCA9IG9zLnBvcGVuKCJnaXQgYmxhbWUgLS1pbmNyZW1lbnRhbCAtQyAtQyAtLSAiICsgZmlsZW5hbWUgKyAiICIgKyBjb21taXRfc2hhMSkKKwkJZmxhZ3MgPSBmY250bC5mY250bChmcC5maWxlbm8oKSwgZmNudGwuRl9HRVRGTCkKKwkJZmNudGwuZmNudGwoZnAuZmlsZW5vKCksIGZjbnRsLkZfU0VURkwsIGZsYWdzIHwgb3MuT19OT05CTE9DSykKKwkJc2VsZi5pb193YXRjaF90YWcgPSBnb2JqZWN0LmlvX2FkZF93YXRjaChmcCwgZ29iamVjdC5JT19JTiwgc2VsZi5kYXRhX3JlYWR5KQorCisKK2NsYXNzIERpZmZXaW5kb3cob2JqZWN0KToKKwkiIiJEaWZmIHdpbmRvdy4KKwlUaGlzIG9iamVjdCByZXByZXNlbnRzIGFuZCBtYW5hZ2VzIGEgc2luZ2xlIHdpbmRvdyBjb250YWluaW5nIHRoZQorCWRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIHJldmlzaW9ucyBvbiBhIGJyYW5jaC4KKwkiIiIKKworCWRlZiBfX2luaXRfXyhzZWxmKToKKwkJc2VsZi53aW5kb3cgPSBndGsuV2luZG93KGd0ay5XSU5ET1dfVE9QTEVWRUwpCisJCXNlbGYud2luZG93LnNldF9ib3JkZXJfd2lkdGgoMCkKKwkJc2VsZi53aW5kb3cuc2V0X3RpdGxlKCJHaXQgcmVwb3NpdG9yeSBicm93c2VyIGRpZmYgd2luZG93IikKKworCQkjIFVzZSB0d28gdGhpcmRzIG9mIHRoZSBzY3JlZW4gYnkgZGVmYXVsdAorCQlzY3JlZW4gPSBzZWxmLndpbmRvdy5nZXRfc2NyZWVuKCkKKwkJbW9uaXRvciA9IHNjcmVlbi5nZXRfbW9uaXRvcl9nZW9tZXRyeSgwKQorCQl3aWR0aCA9IGludChtb25pdG9yLndpZHRoICogMC42NikKKwkJaGVpZ2h0ID0gaW50KG1vbml0b3IuaGVpZ2h0ICogMC42NikKKwkJc2VsZi53aW5kb3cuc2V0X2RlZmF1bHRfc2l6ZSh3aWR0aCwgaGVpZ2h0KQorCisKKwkJc2VsZi5jb25zdHJ1Y3QoKQorCisJZGVmIGNvbnN0cnVjdChzZWxmKToKKwkJIiIiQ29uc3RydWN0IHRoZSB3aW5kb3cgY29udGVudHMuIiIiCisJCXZib3ggPSBndGsuVkJveCgpCisJCXNlbGYud2luZG93LmFkZCh2Ym94KQorCQl2Ym94LnNob3coKQorCisJCW1lbnVfYmFyID0gZ3RrLk1lbnVCYXIoKQorCQlzYXZlX21lbnUgPSBndGsuSW1hZ2VNZW51SXRlbShndGsuU1RPQ0tfU0FWRSkKKwkJc2F2ZV9tZW51LmNvbm5lY3QoImFjdGl2YXRlIiwgc2VsZi5zYXZlX21lbnVfcmVzcG9uc2UsICJzYXZlIikKKwkJc2F2ZV9tZW51LnNob3coKQorCQltZW51X2Jhci5hcHBlbmQoc2F2ZV9tZW51KQorCQl2Ym94LnBhY2tfc3RhcnQobWVudV9iYXIsIGV4cGFuZD1GYWxzZSwgZmlsbD1UcnVlKQorCQltZW51X2Jhci5zaG93KCkKKworCQlocGFuID0gZ3RrLkhQYW5lZCgpCisKKwkJc2Nyb2xsd2luID0gZ3RrLlNjcm9sbGVkV2luZG93KCkKKwkJc2Nyb2xsd2luLnNldF9wb2xpY3koZ3RrLlBPTElDWV9BVVRPTUFUSUMsIGd0ay5QT0xJQ1lfQVVUT01BVElDKQorCQlzY3JvbGx3aW4uc2V0X3NoYWRvd190eXBlKGd0ay5TSEFET1dfSU4pCisJCWhwYW4ucGFjazEoc2Nyb2xsd2luLCBUcnVlLCBUcnVlKQorCQlzY3JvbGx3aW4uc2hvdygpCisKKwkJKHNlbGYuYnVmZmVyLCBzb3VyY2V2aWV3KSA9IGdldF9zb3VyY2VfYnVmZmVyX2FuZF92aWV3KCkKKworCQlzb3VyY2V2aWV3LnNldF9lZGl0YWJsZShGYWxzZSkKKwkJc291cmNldmlldy5tb2RpZnlfZm9udChwYW5nby5Gb250RGVzY3JpcHRpb24oIk1vbm9zcGFjZSIpKQorCQlzY3JvbGx3aW4uYWRkKHNvdXJjZXZpZXcpCisJCXNvdXJjZXZpZXcuc2hvdygpCisKKwkJIyBUaGUgZmlsZSBoaWVyYXJjaHk6IGEgc2Nyb2xsYWJsZSB0cmVldmlldworCQlzY3JvbGx3aW4gPSBndGsuU2Nyb2xsZWRXaW5kb3coKQorCQlzY3JvbGx3aW4uc2V0X3BvbGljeShndGsuUE9MSUNZX0FVVE9NQVRJQywgZ3RrLlBPTElDWV9BVVRPTUFUSUMpCisJCXNjcm9sbHdpbi5zZXRfc2hhZG93X3R5cGUoZ3RrLlNIQURPV19JTikKKwkJc2Nyb2xsd2luLnNldF9zaXplX3JlcXVlc3QoMjAsIC0xKQorCQlocGFuLnBhY2syKHNjcm9sbHdpbiwgVHJ1ZSwgVHJ1ZSkKKwkJc2Nyb2xsd2luLnNob3coKQorCisJCXNlbGYubW9kZWwgPSBndGsuVHJlZVN0b3JlKHN0ciwgc3RyLCBzdHIpCisJCXNlbGYudHJlZXZpZXcgPSBndGsuVHJlZVZpZXcoc2VsZi5tb2RlbCkKKwkJc2VsZi50cmVldmlldy5zZXRfc2VhcmNoX2NvbHVtbigxKQorCQlzZWxmLnRyZWV2aWV3LmNvbm5lY3QoImN1cnNvci1jaGFuZ2VkIiwgc2VsZi5fdHJlZXZpZXdfY2xpY2tlZCkKKwkJc2Nyb2xsd2luLmFkZChzZWxmLnRyZWV2aWV3KQorCQlzZWxmLnRyZWV2aWV3LnNob3coKQorCisJCWNlbGwgPSBndGsuQ2VsbFJlbmRlcmVyVGV4dCgpCisJCWNlbGwuc2V0X3Byb3BlcnR5KCJ3aWR0aC1jaGFycyIsIDIwKQorCQljb2x1bW4gPSBndGsuVHJlZVZpZXdDb2x1bW4oIlNlbGVjdCB0byBhbm5vdGF0ZSIpCisJCWNvbHVtbi5wYWNrX3N0YXJ0KGNlbGwsIGV4cGFuZD1UcnVlKQorCQljb2x1bW4uYWRkX2F0dHJpYnV0ZShjZWxsLCAidGV4dCIsIDApCisJCXNlbGYudHJlZXZpZXcuYXBwZW5kX2NvbHVtbihjb2x1bW4pCisKKwkJdmJveC5wYWNrX3N0YXJ0KGhwYW4sIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisJCWhwYW4uc2hvdygpCisKKwlkZWYgX3RyZWV2aWV3X2NsaWNrZWQoc2VsZiwgKmFyZ3MpOgorCQkiIiJDYWxsYmFjayBmb3Igd2hlbiB0aGUgdHJlZXZpZXcgY3Vyc29yIGNoYW5nZXMuIiIiCisJCShwYXRoLCBjb2wpID0gc2VsZi50cmVldmlldy5nZXRfY3Vyc29yKCkKKwkJc3BlY2lmaWNfZmlsZSA9IHNlbGYubW9kZWxbcGF0aF1bMV0KKwkJY29tbWl0X3NoYTEgPSAgc2VsZi5tb2RlbFtwYXRoXVsyXQorCQlpZiBzcGVjaWZpY19maWxlID09ICBOb25lIDoKKwkJCXJldHVybgorCQllbGlmIHNwZWNpZmljX2ZpbGUgPT0gICIiIDoKKwkJCXNwZWNpZmljX2ZpbGUgPSAgTm9uZQorCisJCXdpbmRvdyA9IEFubm90YXRlV2luZG93KCk7CisJCXdpbmRvdy5hbm5vdGF0ZShzcGVjaWZpY19maWxlLCBjb21taXRfc2hhMSwgMSkKKworCisJZGVmIGNvbW1pdF9maWxlcyhzZWxmLCBjb21taXRfc2hhMSwgcGFyZW50X3NoYTEpOgorCQlzZWxmLm1vZGVsLmNsZWFyKCkKKwkJYWRkICA9IHNlbGYubW9kZWwuYXBwZW5kKE5vbmUsIFsgIkFkZGVkIiwgTm9uZSwgTm9uZV0pCisJCWRlbGUgPSBzZWxmLm1vZGVsLmFwcGVuZChOb25lLCBbICJEZWxldGVkIiwgTm9uZSwgTm9uZV0pCisJCW1vZCAgPSBzZWxmLm1vZGVsLmFwcGVuZChOb25lLCBbICJNb2RpZmllZCIsIE5vbmUsIE5vbmVdKQorCQlkaWZmX3RyZWUgPSByZS5jb21waWxlKCdeKDouezZ9KSAoLns2fSkgKC57NDB9KSAoLns0MH0pIChBfER8TSlccyguKykkJykKKwkJZnAgPSBvcy5wb3BlbigiZ2l0IGRpZmYtdHJlZSAtciAtLW5vLWNvbW1pdC1pZCAiICsgcGFyZW50X3NoYTEgKyAiICIgKyBjb21taXRfc2hhMSkKKwkJd2hpbGUgMToKKwkJCWxpbmUgPSBzdHJpbmcuc3RyaXAoZnAucmVhZGxpbmUoKSkKKwkJCWlmIGxpbmUgPT0gJyc6CisJCQkJYnJlYWsKKwkJCW0gPSBkaWZmX3RyZWUubWF0Y2gobGluZSkKKwkJCWlmIG5vdCBtOgorCQkJCWNvbnRpbnVlCisKKwkJCWF0dHIgPSBtLmdyb3VwKDUpCisJCQlmaWxlbmFtZSA9IG0uZ3JvdXAoNikKKwkJCWlmIGF0dHIgPT0gIkEiOgorCQkJCXNlbGYubW9kZWwuYXBwZW5kKGFkZCwgIFtmaWxlbmFtZSwgZmlsZW5hbWUsIGNvbW1pdF9zaGExXSkKKwkJCWVsaWYgYXR0ciA9PSAiRCI6CisJCQkJc2VsZi5tb2RlbC5hcHBlbmQoZGVsZSwgW2ZpbGVuYW1lLCBmaWxlbmFtZSwgY29tbWl0X3NoYTFdKQorCQkJZWxpZiBhdHRyID09ICJNIjoKKwkJCQlzZWxmLm1vZGVsLmFwcGVuZChtb2QsICBbZmlsZW5hbWUsIGZpbGVuYW1lLCBjb21taXRfc2hhMV0pCisJCWZwLmNsb3NlKCkKKworCQlzZWxmLnRyZWV2aWV3LmV4cGFuZF9hbGwoKQorCisJZGVmIHNldF9kaWZmKHNlbGYsIGNvbW1pdF9zaGExLCBwYXJlbnRfc2hhMSwgZW5jb2RpbmcpOgorCQkiIiJTZXQgdGhlIGRpZmZlcmVuY2VzIHNob3dlZCBieSB0aGlzIHdpbmRvdy4KKwkJQ29tcGFyZXMgdGhlIHR3byB0cmVlcyBhbmQgcG9wdWxhdGVzIHRoZSB3aW5kb3cgd2l0aCB0aGUKKwkJZGlmZmVyZW5jZXMuCisJCSIiIgorCQkjIERpZmYgd2l0aCB0aGUgZmlyc3QgY29tbWl0IG9yIHRoZSBsYXN0IGNvbW1pdCBzaG93cyBub3RoaW5nCisJCWlmIChjb21taXRfc2hhMSA9PSAwIG9yIHBhcmVudF9zaGExID09IDAgKToKKwkJCXJldHVybgorCisJCWZwID0gb3MucG9wZW4oImdpdCBkaWZmLXRyZWUgLXAgIiArIHBhcmVudF9zaGExICsgIiAiICsgY29tbWl0X3NoYTEpCisJCXNlbGYuYnVmZmVyLnNldF90ZXh0KHVuaWNvZGUoZnAucmVhZCgpLCBlbmNvZGluZykuZW5jb2RlKCd1dGYtOCcpKQorCQlmcC5jbG9zZSgpCisJCXNlbGYuY29tbWl0X2ZpbGVzKGNvbW1pdF9zaGExLCBwYXJlbnRfc2hhMSkKKwkJc2VsZi53aW5kb3cuc2hvdygpCisKKwlkZWYgc2F2ZV9tZW51X3Jlc3BvbnNlKHNlbGYsIHdpZGdldCwgc3RyaW5nKToKKwkJZGlhbG9nID0gZ3RrLkZpbGVDaG9vc2VyRGlhbG9nKCJTYXZlLi4iLCBOb25lLCBndGsuRklMRV9DSE9PU0VSX0FDVElPTl9TQVZFLAorCQkJCShndGsuU1RPQ0tfQ0FOQ0VMLCBndGsuUkVTUE9OU0VfQ0FOQ0VMLAorCQkJCQlndGsuU1RPQ0tfU0FWRSwgZ3RrLlJFU1BPTlNFX09LKSkKKwkJZGlhbG9nLnNldF9kZWZhdWx0X3Jlc3BvbnNlKGd0ay5SRVNQT05TRV9PSykKKwkJcmVzcG9uc2UgPSBkaWFsb2cucnVuKCkKKwkJaWYgcmVzcG9uc2UgPT0gZ3RrLlJFU1BPTlNFX09LOgorCQkJcGF0Y2hfYnVmZmVyID0gc2VsZi5idWZmZXIuZ2V0X3RleHQoc2VsZi5idWZmZXIuZ2V0X3N0YXJ0X2l0ZXIoKSwKKwkJCQkJc2VsZi5idWZmZXIuZ2V0X2VuZF9pdGVyKCkpCisJCQlmcCA9IG9wZW4oZGlhbG9nLmdldF9maWxlbmFtZSgpLCAidyIpCisJCQlmcC53cml0ZShwYXRjaF9idWZmZXIpCisJCQlmcC5jbG9zZSgpCisJCWRpYWxvZy5kZXN0cm95KCkKKworY2xhc3MgR2l0VmlldyhvYmplY3QpOgorCSIiIiBUaGlzIGlzIHRoZSBtYWluIGNsYXNzCisJIiIiCisJdmVyc2lvbiA9ICIwLjkiCisKKwlkZWYgX19pbml0X18oc2VsZiwgd2l0aF9kaWZmPTApOgorCQlzZWxmLndpdGhfZGlmZiA9IHdpdGhfZGlmZgorCQlzZWxmLndpbmRvdyA9CWd0ay5XaW5kb3coZ3RrLldJTkRPV19UT1BMRVZFTCkKKwkJc2VsZi53aW5kb3cuc2V0X2JvcmRlcl93aWR0aCgwKQorCQlzZWxmLndpbmRvdy5zZXRfdGl0bGUoIkdpdCByZXBvc2l0b3J5IGJyb3dzZXIiKQorCisJCXNlbGYuZ2V0X2VuY29kaW5nKCkKKwkJc2VsZi5nZXRfYnRfc2hhMSgpCisKKwkJIyBVc2UgdGhyZWUtcXVhcnRlcnMgb2YgdGhlIHNjcmVlbiBieSBkZWZhdWx0CisJCXNjcmVlbiA9IHNlbGYud2luZG93LmdldF9zY3JlZW4oKQorCQltb25pdG9yID0gc2NyZWVuLmdldF9tb25pdG9yX2dlb21ldHJ5KDApCisJCXdpZHRoID0gaW50KG1vbml0b3Iud2lkdGggKiAwLjc1KQorCQloZWlnaHQgPSBpbnQobW9uaXRvci5oZWlnaHQgKiAwLjc1KQorCQlzZWxmLndpbmRvdy5zZXRfZGVmYXVsdF9zaXplKHdpZHRoLCBoZWlnaHQpCisKKwkJIyBGSVhNRSBBbmR5Rml0eiEKKwkJaWNvbiA9IHNlbGYud2luZG93LnJlbmRlcl9pY29uKGd0ay5TVE9DS19JTkRFWCwgZ3RrLklDT05fU0laRV9CVVRUT04pCisJCXNlbGYud2luZG93LnNldF9pY29uKGljb24pCisKKwkJc2VsZi5hY2NlbF9ncm91cCA9IGd0ay5BY2NlbEdyb3VwKCkKKwkJc2VsZi53aW5kb3cuYWRkX2FjY2VsX2dyb3VwKHNlbGYuYWNjZWxfZ3JvdXApCisJCXNlbGYuYWNjZWxfZ3JvdXAuY29ubmVjdF9ncm91cCgweGZmYzIsIDAsIGd0ay5BQ0NFTF9MT0NLRUQsIHNlbGYucmVmcmVzaCk7CisJCXNlbGYuYWNjZWxfZ3JvdXAuY29ubmVjdF9ncm91cCgweGZmYzEsIDAsIGd0ay5BQ0NFTF9MT0NLRUQsIHNlbGYubWF4aW1pemUpOworCQlzZWxmLmFjY2VsX2dyb3VwLmNvbm5lY3RfZ3JvdXAoMHhmZmM4LCAwLCBndGsuQUNDRUxfTE9DS0VELCBzZWxmLmZ1bGxzY3JlZW4pOworCQlzZWxmLmFjY2VsX2dyb3VwLmNvbm5lY3RfZ3JvdXAoMHhmZmM5LCAwLCBndGsuQUNDRUxfTE9DS0VELCBzZWxmLnVuZnVsbHNjcmVlbik7CisKKwkJc2VsZi53aW5kb3cuYWRkKHNlbGYuY29uc3RydWN0KCkpCisKKwlkZWYgcmVmcmVzaChzZWxmLCB3aWRnZXQsIGV2ZW50PU5vbmUsICphcmd1bWVudHMsICoqa2V5d29yZHMpOgorCQlzZWxmLmdldF9lbmNvZGluZygpCisJCXNlbGYuZ2V0X2J0X3NoYTEoKQorCQlDb21taXQuY2hpbGRyZW5fc2hhMSA9IHt9CisJCXNlbGYuc2V0X2JyYW5jaChzeXMuYXJndlt3aXRob3V0X2RpZmY6XSkKKwkJc2VsZi53aW5kb3cuc2hvdygpCisJCXJldHVybiBUcnVlCisKKwlkZWYgbWF4aW1pemUoc2VsZiwgd2lkZ2V0LCBldmVudD1Ob25lLCAqYXJndW1lbnRzLCAqKmtleXdvcmRzKToKKwkJc2VsZi53aW5kb3cubWF4aW1pemUoKQorCQlyZXR1cm4gVHJ1ZQorCisJZGVmIGZ1bGxzY3JlZW4oc2VsZiwgd2lkZ2V0LCBldmVudD1Ob25lLCAqYXJndW1lbnRzLCAqKmtleXdvcmRzKToKKwkJc2VsZi53aW5kb3cuZnVsbHNjcmVlbigpCisJCXJldHVybiBUcnVlCisKKwlkZWYgdW5mdWxsc2NyZWVuKHNlbGYsIHdpZGdldCwgZXZlbnQ9Tm9uZSwgKmFyZ3VtZW50cywgKiprZXl3b3Jkcyk6CisJCXNlbGYud2luZG93LnVuZnVsbHNjcmVlbigpCisJCXJldHVybiBUcnVlCisKKwlkZWYgZ2V0X2J0X3NoYTEoc2VsZik6CisJCSIiIiBVcGRhdGUgdGhlIGJ0X3NoYTEgZGljdGlvbmFyeSB3aXRoIHRoZQorCQlyZXNwZWN0aXZlIHNoYTEgZGV0YWlscyAiIiIKKworCQlzZWxmLmJ0X3NoYTEgPSB7IH0KKwkJbHNfcmVtb3RlID0gcmUuY29tcGlsZSgnXiguezQwfSlcdHJlZnMvKFteXl0rKSg/OlxcXiguLikpPyQnKTsKKwkJZnAgPSBvcy5wb3BlbignZ2l0IGxzLXJlbW90ZSAiJHtHSVRfRElSLS5naXR9IicpCisJCXdoaWxlIDE6CisJCQlsaW5lID0gc3RyaW5nLnN0cmlwKGZwLnJlYWRsaW5lKCkpCisJCQlpZiBsaW5lID09ICcnOgorCQkJCWJyZWFrCisJCQltID0gbHNfcmVtb3RlLm1hdGNoKGxpbmUpCisJCQlpZiBub3QgbToKKwkJCQljb250aW51ZQorCQkJKHNoYTEsIG5hbWUpID0gKG0uZ3JvdXAoMSksIG0uZ3JvdXAoMikpCisJCQlpZiBub3Qgc2VsZi5idF9zaGExLmhhc19rZXkoc2hhMSk6CisJCQkJc2VsZi5idF9zaGExW3NoYTFdID0gW10KKwkJCXNlbGYuYnRfc2hhMVtzaGExXS5hcHBlbmQobmFtZSkKKwkJZnAuY2xvc2UoKQorCisJZGVmIGdldF9lbmNvZGluZyhzZWxmKToKKwkJZnAgPSBvcy5wb3BlbigiZ2l0IGNvbmZpZyAtLWdldCBpMThuLmNvbW1pdGVuY29kaW5nIikKKwkJc2VsZi5lbmNvZGluZz1zdHJpbmcuc3RyaXAoZnAucmVhZGxpbmUoKSkKKwkJZnAuY2xvc2UoKQorCQlpZiAoc2VsZi5lbmNvZGluZyA9PSAiIik6CisJCQlzZWxmLmVuY29kaW5nID0gInV0Zi04IgorCisKKwlkZWYgY29uc3RydWN0KHNlbGYpOgorCQkiIiJDb25zdHJ1Y3QgdGhlIHdpbmRvdyBjb250ZW50cy4iIiIKKwkJdmJveCA9IGd0ay5WQm94KCkKKwkJcGFuZWQgPSBndGsuVlBhbmVkKCkKKwkJcGFuZWQucGFjazEoc2VsZi5jb25zdHJ1Y3RfdG9wKCksIHJlc2l6ZT1GYWxzZSwgc2hyaW5rPVRydWUpCisJCXBhbmVkLnBhY2syKHNlbGYuY29uc3RydWN0X2JvdHRvbSgpLCByZXNpemU9RmFsc2UsIHNocmluaz1UcnVlKQorCQltZW51X2JhciA9IGd0ay5NZW51QmFyKCkKKwkJbWVudV9iYXIuc2V0X3BhY2tfZGlyZWN0aW9uKGd0ay5QQUNLX0RJUkVDVElPTl9SVEwpCisJCWhlbHBfbWVudSA9IGd0ay5NZW51SXRlbSgiSGVscCIpCisJCW1lbnUgPSBndGsuTWVudSgpCisJCWFib3V0X21lbnUgPSBndGsuTWVudUl0ZW0oIkFib3V0IikKKwkJbWVudS5hcHBlbmQoYWJvdXRfbWVudSkKKwkJYWJvdXRfbWVudS5jb25uZWN0KCJhY3RpdmF0ZSIsIHNlbGYuYWJvdXRfbWVudV9yZXNwb25zZSwgImFib3V0IikKKwkJYWJvdXRfbWVudS5zaG93KCkKKwkJaGVscF9tZW51LnNldF9zdWJtZW51KG1lbnUpCisJCWhlbHBfbWVudS5zaG93KCkKKwkJbWVudV9iYXIuYXBwZW5kKGhlbHBfbWVudSkKKwkJbWVudV9iYXIuc2hvdygpCisJCXZib3gucGFja19zdGFydChtZW51X2JhciwgZXhwYW5kPUZhbHNlLCBmaWxsPVRydWUpCisJCXZib3gucGFja19zdGFydChwYW5lZCwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKwkJcGFuZWQuc2hvdygpCisJCXZib3guc2hvdygpCisJCXJldHVybiB2Ym94CisKKworCWRlZiBjb25zdHJ1Y3RfdG9wKHNlbGYpOgorCQkiIiJDb25zdHJ1Y3QgdGhlIHRvcC1oYWxmIG9mIHRoZSB3aW5kb3cuIiIiCisJCXZib3ggPSBndGsuVkJveChzcGFjaW5nPTYpCisJCXZib3guc2V0X2JvcmRlcl93aWR0aCgxMikKKwkJdmJveC5zaG93KCkKKworCisJCXNjcm9sbHdpbiA9IGd0ay5TY3JvbGxlZFdpbmRvdygpCisJCXNjcm9sbHdpbi5zZXRfcG9saWN5KGd0ay5QT0xJQ1lfQVVUT01BVElDLCBndGsuUE9MSUNZX0FVVE9NQVRJQykKKwkJc2Nyb2xsd2luLnNldF9zaGFkb3dfdHlwZShndGsuU0hBRE9XX0lOKQorCQl2Ym94LnBhY2tfc3RhcnQoc2Nyb2xsd2luLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCQlzY3JvbGx3aW4uc2hvdygpCisKKwkJc2VsZi50cmVldmlldyA9IGd0ay5UcmVlVmlldygpCisJCXNlbGYudHJlZXZpZXcuc2V0X3J1bGVzX2hpbnQoVHJ1ZSkKKwkJc2VsZi50cmVldmlldy5zZXRfc2VhcmNoX2NvbHVtbig0KQorCQlzZWxmLnRyZWV2aWV3LmNvbm5lY3QoImN1cnNvci1jaGFuZ2VkIiwgc2VsZi5fdHJlZXZpZXdfY3Vyc29yX2NiKQorCQlzY3JvbGx3aW4uYWRkKHNlbGYudHJlZXZpZXcpCisJCXNlbGYudHJlZXZpZXcuc2hvdygpCisKKwkJY2VsbCA9IENlbGxSZW5kZXJlckdyYXBoKCkKKwkJY29sdW1uID0gZ3RrLlRyZWVWaWV3Q29sdW1uKCkKKwkJY29sdW1uLnNldF9yZXNpemFibGUoVHJ1ZSkKKwkJY29sdW1uLnBhY2tfc3RhcnQoY2VsbCwgZXhwYW5kPVRydWUpCisJCWNvbHVtbi5hZGRfYXR0cmlidXRlKGNlbGwsICJub2RlIiwgMSkKKwkJY29sdW1uLmFkZF9hdHRyaWJ1dGUoY2VsbCwgImluLWxpbmVzIiwgMikKKwkJY29sdW1uLmFkZF9hdHRyaWJ1dGUoY2VsbCwgIm91dC1saW5lcyIsIDMpCisJCXNlbGYudHJlZXZpZXcuYXBwZW5kX2NvbHVtbihjb2x1bW4pCisKKwkJY2VsbCA9IGd0ay5DZWxsUmVuZGVyZXJUZXh0KCkKKwkJY2VsbC5zZXRfcHJvcGVydHkoIndpZHRoLWNoYXJzIiwgNjUpCisJCWNlbGwuc2V0X3Byb3BlcnR5KCJlbGxpcHNpemUiLCBwYW5nby5FTExJUFNJWkVfRU5EKQorCQljb2x1bW4gPSBndGsuVHJlZVZpZXdDb2x1bW4oIk1lc3NhZ2UiKQorCQljb2x1bW4uc2V0X3Jlc2l6YWJsZShUcnVlKQorCQljb2x1bW4ucGFja19zdGFydChjZWxsLCBleHBhbmQ9VHJ1ZSkKKwkJY29sdW1uLmFkZF9hdHRyaWJ1dGUoY2VsbCwgInRleHQiLCA0KQorCQlzZWxmLnRyZWV2aWV3LmFwcGVuZF9jb2x1bW4oY29sdW1uKQorCisJCWNlbGwgPSBndGsuQ2VsbFJlbmRlcmVyVGV4dCgpCisJCWNlbGwuc2V0X3Byb3BlcnR5KCJ3aWR0aC1jaGFycyIsIDQwKQorCQljZWxsLnNldF9wcm9wZXJ0eSgiZWxsaXBzaXplIiwgcGFuZ28uRUxMSVBTSVpFX0VORCkKKwkJY29sdW1uID0gZ3RrLlRyZWVWaWV3Q29sdW1uKCJBdXRob3IiKQorCQljb2x1bW4uc2V0X3Jlc2l6YWJsZShUcnVlKQorCQljb2x1bW4ucGFja19zdGFydChjZWxsLCBleHBhbmQ9VHJ1ZSkKKwkJY29sdW1uLmFkZF9hdHRyaWJ1dGUoY2VsbCwgInRleHQiLCA1KQorCQlzZWxmLnRyZWV2aWV3LmFwcGVuZF9jb2x1bW4oY29sdW1uKQorCisJCWNlbGwgPSBndGsuQ2VsbFJlbmRlcmVyVGV4dCgpCisJCWNlbGwuc2V0X3Byb3BlcnR5KCJlbGxpcHNpemUiLCBwYW5nby5FTExJUFNJWkVfRU5EKQorCQljb2x1bW4gPSBndGsuVHJlZVZpZXdDb2x1bW4oIkRhdGUiKQorCQljb2x1bW4uc2V0X3Jlc2l6YWJsZShUcnVlKQorCQljb2x1bW4ucGFja19zdGFydChjZWxsLCBleHBhbmQ9VHJ1ZSkKKwkJY29sdW1uLmFkZF9hdHRyaWJ1dGUoY2VsbCwgInRleHQiLCA2KQorCQlzZWxmLnRyZWV2aWV3LmFwcGVuZF9jb2x1bW4oY29sdW1uKQorCisJCXJldHVybiB2Ym94CisKKwlkZWYgYWJvdXRfbWVudV9yZXNwb25zZShzZWxmLCB3aWRnZXQsIHN0cmluZyk6CisJCWRpYWxvZyA9IGd0ay5BYm91dERpYWxvZygpCisJCWRpYWxvZy5zZXRfbmFtZSgiR2l0dmlldyIpCisJCWRpYWxvZy5zZXRfdmVyc2lvbihHaXRWaWV3LnZlcnNpb24pCisJCWRpYWxvZy5zZXRfYXV0aG9ycyhbIkFuZWVzaCBLdW1hciBLLlYgPGFuZWVzaC5rdW1hckBnbWFpbC5jb20+Il0pCisJCWRpYWxvZy5zZXRfd2Vic2l0ZSgiaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0LyIpCisJCWRpYWxvZy5zZXRfY29weXJpZ2h0KCJVc2UgYW5kIGRpc3RyaWJ1dGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSIpCisJCWRpYWxvZy5zZXRfd3JhcF9saWNlbnNlKFRydWUpCisJCWRpYWxvZy5ydW4oKQorCQlkaWFsb2cuZGVzdHJveSgpCisKKworCWRlZiBjb25zdHJ1Y3RfYm90dG9tKHNlbGYpOgorCQkiIiJDb25zdHJ1Y3QgdGhlIGJvdHRvbSBoYWxmIG9mIHRoZSB3aW5kb3cuIiIiCisJCXZib3ggPSBndGsuVkJveChGYWxzZSwgc3BhY2luZz02KQorCQl2Ym94LnNldF9ib3JkZXJfd2lkdGgoMTIpCisJCSh3aWR0aCwgaGVpZ2h0KSA9IHNlbGYud2luZG93LmdldF9zaXplKCkKKwkJdmJveC5zZXRfc2l6ZV9yZXF1ZXN0KHdpZHRoLCBpbnQoaGVpZ2h0IC8gMi41KSkKKwkJdmJveC5zaG93KCkKKworCQlzZWxmLnRhYmxlID0gZ3RrLlRhYmxlKHJvd3M9NCwgY29sdW1ucz00KQorCQlzZWxmLnRhYmxlLnNldF9yb3dfc3BhY2luZ3MoNikKKwkJc2VsZi50YWJsZS5zZXRfY29sX3NwYWNpbmdzKDYpCisJCXZib3gucGFja19zdGFydChzZWxmLnRhYmxlLCBleHBhbmQ9RmFsc2UsIGZpbGw9VHJ1ZSkKKwkJc2VsZi50YWJsZS5zaG93KCkKKworCQlhbGlnbiA9IGd0ay5BbGlnbm1lbnQoMC4wLCAwLjUpCisJCWxhYmVsID0gZ3RrLkxhYmVsKCkKKwkJbGFiZWwuc2V0X21hcmt1cCgiPGI+UmV2aXNpb246PC9iPiIpCisJCWFsaWduLmFkZChsYWJlbCkKKwkJc2VsZi50YWJsZS5hdHRhY2goYWxpZ24sIDAsIDEsIDAsIDEsIGd0ay5GSUxMLCBndGsuRklMTCkKKwkJbGFiZWwuc2hvdygpCisJCWFsaWduLnNob3coKQorCisJCWFsaWduID0gZ3RrLkFsaWdubWVudCgwLjAsIDAuNSkKKwkJc2VsZi5yZXZpZF9sYWJlbCA9IGd0ay5MYWJlbCgpCisJCXNlbGYucmV2aWRfbGFiZWwuc2V0X3NlbGVjdGFibGUoVHJ1ZSkKKwkJYWxpZ24uYWRkKHNlbGYucmV2aWRfbGFiZWwpCisJCXNlbGYudGFibGUuYXR0YWNoKGFsaWduLCAxLCAyLCAwLCAxLCBndGsuRVhQQU5EIHwgZ3RrLkZJTEwsIGd0ay5GSUxMKQorCQlzZWxmLnJldmlkX2xhYmVsLnNob3coKQorCQlhbGlnbi5zaG93KCkKKworCQlhbGlnbiA9IGd0ay5BbGlnbm1lbnQoMC4wLCAwLjUpCisJCWxhYmVsID0gZ3RrLkxhYmVsKCkKKwkJbGFiZWwuc2V0X21hcmt1cCgiPGI+Q29tbWl0dGVyOjwvYj4iKQorCQlhbGlnbi5hZGQobGFiZWwpCisJCXNlbGYudGFibGUuYXR0YWNoKGFsaWduLCAwLCAxLCAxLCAyLCBndGsuRklMTCwgZ3RrLkZJTEwpCisJCWxhYmVsLnNob3coKQorCQlhbGlnbi5zaG93KCkKKworCQlhbGlnbiA9IGd0ay5BbGlnbm1lbnQoMC4wLCAwLjUpCisJCXNlbGYuY29tbWl0dGVyX2xhYmVsID0gZ3RrLkxhYmVsKCkKKwkJc2VsZi5jb21taXR0ZXJfbGFiZWwuc2V0X3NlbGVjdGFibGUoVHJ1ZSkKKwkJYWxpZ24uYWRkKHNlbGYuY29tbWl0dGVyX2xhYmVsKQorCQlzZWxmLnRhYmxlLmF0dGFjaChhbGlnbiwgMSwgMiwgMSwgMiwgZ3RrLkVYUEFORCB8IGd0ay5GSUxMLCBndGsuRklMTCkKKwkJc2VsZi5jb21taXR0ZXJfbGFiZWwuc2hvdygpCisJCWFsaWduLnNob3coKQorCisJCWFsaWduID0gZ3RrLkFsaWdubWVudCgwLjAsIDAuNSkKKwkJbGFiZWwgPSBndGsuTGFiZWwoKQorCQlsYWJlbC5zZXRfbWFya3VwKCI8Yj5UaW1lc3RhbXA6PC9iPiIpCisJCWFsaWduLmFkZChsYWJlbCkKKwkJc2VsZi50YWJsZS5hdHRhY2goYWxpZ24sIDAsIDEsIDIsIDMsIGd0ay5GSUxMLCBndGsuRklMTCkKKwkJbGFiZWwuc2hvdygpCisJCWFsaWduLnNob3coKQorCisJCWFsaWduID0gZ3RrLkFsaWdubWVudCgwLjAsIDAuNSkKKwkJc2VsZi50aW1lc3RhbXBfbGFiZWwgPSBndGsuTGFiZWwoKQorCQlzZWxmLnRpbWVzdGFtcF9sYWJlbC5zZXRfc2VsZWN0YWJsZShUcnVlKQorCQlhbGlnbi5hZGQoc2VsZi50aW1lc3RhbXBfbGFiZWwpCisJCXNlbGYudGFibGUuYXR0YWNoKGFsaWduLCAxLCAyLCAyLCAzLCBndGsuRVhQQU5EIHwgZ3RrLkZJTEwsIGd0ay5GSUxMKQorCQlzZWxmLnRpbWVzdGFtcF9sYWJlbC5zaG93KCkKKwkJYWxpZ24uc2hvdygpCisKKwkJYWxpZ24gPSBndGsuQWxpZ25tZW50KDAuMCwgMC41KQorCQlsYWJlbCA9IGd0ay5MYWJlbCgpCisJCWxhYmVsLnNldF9tYXJrdXAoIjxiPlBhcmVudHM6PC9iPiIpCisJCWFsaWduLmFkZChsYWJlbCkKKwkJc2VsZi50YWJsZS5hdHRhY2goYWxpZ24sIDAsIDEsIDMsIDQsIGd0ay5GSUxMLCBndGsuRklMTCkKKwkJbGFiZWwuc2hvdygpCisJCWFsaWduLnNob3coKQorCQlzZWxmLnBhcmVudHNfd2lkZ2V0cyA9IFtdCisKKwkJYWxpZ24gPSBndGsuQWxpZ25tZW50KDAuMCwgMC41KQorCQlsYWJlbCA9IGd0ay5MYWJlbCgpCisJCWxhYmVsLnNldF9tYXJrdXAoIjxiPkNoaWxkcmVuOjwvYj4iKQorCQlhbGlnbi5hZGQobGFiZWwpCisJCXNlbGYudGFibGUuYXR0YWNoKGFsaWduLCAyLCAzLCAzLCA0LCBndGsuRklMTCwgZ3RrLkZJTEwpCisJCWxhYmVsLnNob3coKQorCQlhbGlnbi5zaG93KCkKKwkJc2VsZi5jaGlsZHJlbl93aWRnZXRzID0gW10KKworCQlzY3JvbGx3aW4gPSBndGsuU2Nyb2xsZWRXaW5kb3coKQorCQlzY3JvbGx3aW4uc2V0X3BvbGljeShndGsuUE9MSUNZX0FVVE9NQVRJQywgZ3RrLlBPTElDWV9BVVRPTUFUSUMpCisJCXNjcm9sbHdpbi5zZXRfc2hhZG93X3R5cGUoZ3RrLlNIQURPV19JTikKKwkJdmJveC5wYWNrX3N0YXJ0KHNjcm9sbHdpbiwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKwkJc2Nyb2xsd2luLnNob3coKQorCisJCShzZWxmLm1lc3NhZ2VfYnVmZmVyLCBzb3VyY2V2aWV3KSA9IGdldF9zb3VyY2VfYnVmZmVyX2FuZF92aWV3KCkKKworCQlzb3VyY2V2aWV3LnNldF9lZGl0YWJsZShGYWxzZSkKKwkJc291cmNldmlldy5tb2RpZnlfZm9udChwYW5nby5Gb250RGVzY3JpcHRpb24oIk1vbm9zcGFjZSIpKQorCQlzY3JvbGx3aW4uYWRkKHNvdXJjZXZpZXcpCisJCXNvdXJjZXZpZXcuc2hvdygpCisKKwkJcmV0dXJuIHZib3gKKworCWRlZiBfdHJlZXZpZXdfY3Vyc29yX2NiKHNlbGYsICphcmdzKToKKwkJIiIiQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIHRyZWV2aWV3IGN1cnNvciBjaGFuZ2VzLiIiIgorCQkocGF0aCwgY29sKSA9IHNlbGYudHJlZXZpZXcuZ2V0X2N1cnNvcigpCisJCWNvbW1pdCA9IHNlbGYubW9kZWxbcGF0aF1bMF0KKworCQlpZiBjb21taXQuY29tbWl0dGVyIGlzIG5vdCBOb25lOgorCQkJY29tbWl0dGVyID0gY29tbWl0LmNvbW1pdHRlcgorCQkJdGltZXN0YW1wID0gY29tbWl0LmNvbW1pdF9kYXRlCisJCQltZXNzYWdlICAgPSAgY29tbWl0LmdldF9tZXNzYWdlKHNlbGYud2l0aF9kaWZmKQorCQkJcmV2aWRfbGFiZWwgPSBjb21taXQuY29tbWl0X3NoYTEKKwkJZWxzZToKKwkJCWNvbW1pdHRlciA9ICIiCisJCQl0aW1lc3RhbXAgPSAiIgorCQkJbWVzc2FnZSA9ICIiCisJCQlyZXZpZF9sYWJlbCA9ICIiCisKKwkJc2VsZi5yZXZpZF9sYWJlbC5zZXRfdGV4dChyZXZpZF9sYWJlbCkKKwkJc2VsZi5jb21taXR0ZXJfbGFiZWwuc2V0X3RleHQoY29tbWl0dGVyKQorCQlzZWxmLnRpbWVzdGFtcF9sYWJlbC5zZXRfdGV4dCh0aW1lc3RhbXApCisJCXNlbGYubWVzc2FnZV9idWZmZXIuc2V0X3RleHQodW5pY29kZShtZXNzYWdlLCBzZWxmLmVuY29kaW5nKS5lbmNvZGUoJ3V0Zi04JykpCisKKwkJZm9yIHdpZGdldCBpbiBzZWxmLnBhcmVudHNfd2lkZ2V0czoKKwkJCXNlbGYudGFibGUucmVtb3ZlKHdpZGdldCkKKworCQlzZWxmLnBhcmVudHNfd2lkZ2V0cyA9IFtdCisJCXNlbGYudGFibGUucmVzaXplKDQgKyBsZW4oY29tbWl0LnBhcmVudF9zaGExKSAtIDEsIDQpCisJCWZvciBpZHgsIHBhcmVudF9pZCBpbiBlbnVtZXJhdGUoY29tbWl0LnBhcmVudF9zaGExKToKKwkJCXNlbGYudGFibGUuc2V0X3Jvd19zcGFjaW5nKGlkeCArIDMsIDApCisKKwkJCWFsaWduID0gZ3RrLkFsaWdubWVudCgwLjAsIDAuMCkKKwkJCXNlbGYucGFyZW50c193aWRnZXRzLmFwcGVuZChhbGlnbikKKwkJCXNlbGYudGFibGUuYXR0YWNoKGFsaWduLCAxLCAyLCBpZHggKyAzLCBpZHggKyA0LAorCQkJCQlndGsuRVhQQU5EIHwgZ3RrLkZJTEwsIGd0ay5GSUxMKQorCQkJYWxpZ24uc2hvdygpCisKKwkJCWhib3ggPSBndGsuSEJveChGYWxzZSwgMCkKKwkJCWFsaWduLmFkZChoYm94KQorCQkJaGJveC5zaG93KCkKKworCQkJbGFiZWwgPSBndGsuTGFiZWwocGFyZW50X2lkKQorCQkJbGFiZWwuc2V0X3NlbGVjdGFibGUoVHJ1ZSkKKwkJCWhib3gucGFja19zdGFydChsYWJlbCwgZXhwYW5kPUZhbHNlLCBmaWxsPVRydWUpCisJCQlsYWJlbC5zaG93KCkKKworCQkJaW1hZ2UgPSBndGsuSW1hZ2UoKQorCQkJaW1hZ2Uuc2V0X2Zyb21fc3RvY2soZ3RrLlNUT0NLX0pVTVBfVE8sIGd0ay5JQ09OX1NJWkVfTUVOVSkKKwkJCWltYWdlLnNob3coKQorCisJCQlidXR0b24gPSBndGsuQnV0dG9uKCkKKwkJCWJ1dHRvbi5hZGQoaW1hZ2UpCisJCQlidXR0b24uc2V0X3JlbGllZihndGsuUkVMSUVGX05PTkUpCisJCQlidXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuX2dvX2NsaWNrZWRfY2IsIHBhcmVudF9pZCkKKwkJCWhib3gucGFja19zdGFydChidXR0b24sIGV4cGFuZD1GYWxzZSwgZmlsbD1UcnVlKQorCQkJYnV0dG9uLnNob3coKQorCisJCQlpbWFnZSA9IGd0ay5JbWFnZSgpCisJCQlpbWFnZS5zZXRfZnJvbV9zdG9jayhndGsuU1RPQ0tfRklORCwgZ3RrLklDT05fU0laRV9NRU5VKQorCQkJaW1hZ2Uuc2hvdygpCisKKwkJCWJ1dHRvbiA9IGd0ay5CdXR0b24oKQorCQkJYnV0dG9uLmFkZChpbWFnZSkKKwkJCWJ1dHRvbi5zZXRfcmVsaWVmKGd0ay5SRUxJRUZfTk9ORSkKKwkJCWJ1dHRvbi5zZXRfc2Vuc2l0aXZlKFRydWUpCisJCQlidXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuX3Nob3dfY2xpY2tlZF9jYiwKKwkJCQkJY29tbWl0LmNvbW1pdF9zaGExLCBwYXJlbnRfaWQsIHNlbGYuZW5jb2RpbmcpCisJCQloYm94LnBhY2tfc3RhcnQoYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9VHJ1ZSkKKwkJCWJ1dHRvbi5zaG93KCkKKworCQkjIFBvcHVsYXRlIHdpdGggY2hpbGQgZGV0YWlscworCQlmb3Igd2lkZ2V0IGluIHNlbGYuY2hpbGRyZW5fd2lkZ2V0czoKKwkJCXNlbGYudGFibGUucmVtb3ZlKHdpZGdldCkKKworCQlzZWxmLmNoaWxkcmVuX3dpZGdldHMgPSBbXQorCQl0cnk6CisJCQljaGlsZF9zaGExID0gQ29tbWl0LmNoaWxkcmVuX3NoYTFbY29tbWl0LmNvbW1pdF9zaGExXQorCQlleGNlcHQgS2V5RXJyb3I6CisJCQkjIFdlIGRvbid0IGhhdmUgY2hpbGQKKwkJCWNoaWxkX3NoYTEgPSBbIDAgXQorCisJCWlmICggbGVuKGNoaWxkX3NoYTEpID4gbGVuKGNvbW1pdC5wYXJlbnRfc2hhMSkpOgorCQkJc2VsZi50YWJsZS5yZXNpemUoNCArIGxlbihjaGlsZF9zaGExKSAtIDEsIDQpCisKKwkJZm9yIGlkeCwgY2hpbGRfaWQgaW4gZW51bWVyYXRlKGNoaWxkX3NoYTEpOgorCQkJc2VsZi50YWJsZS5zZXRfcm93X3NwYWNpbmcoaWR4ICsgMywgMCkKKworCQkJYWxpZ24gPSBndGsuQWxpZ25tZW50KDAuMCwgMC4wKQorCQkJc2VsZi5jaGlsZHJlbl93aWRnZXRzLmFwcGVuZChhbGlnbikKKwkJCXNlbGYudGFibGUuYXR0YWNoKGFsaWduLCAzLCA0LCBpZHggKyAzLCBpZHggKyA0LAorCQkJCQlndGsuRVhQQU5EIHwgZ3RrLkZJTEwsIGd0ay5GSUxMKQorCQkJYWxpZ24uc2hvdygpCisKKwkJCWhib3ggPSBndGsuSEJveChGYWxzZSwgMCkKKwkJCWFsaWduLmFkZChoYm94KQorCQkJaGJveC5zaG93KCkKKworCQkJbGFiZWwgPSBndGsuTGFiZWwoY2hpbGRfaWQpCisJCQlsYWJlbC5zZXRfc2VsZWN0YWJsZShUcnVlKQorCQkJaGJveC5wYWNrX3N0YXJ0KGxhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9VHJ1ZSkKKwkJCWxhYmVsLnNob3coKQorCisJCQlpbWFnZSA9IGd0ay5JbWFnZSgpCisJCQlpbWFnZS5zZXRfZnJvbV9zdG9jayhndGsuU1RPQ0tfSlVNUF9UTywgZ3RrLklDT05fU0laRV9NRU5VKQorCQkJaW1hZ2Uuc2hvdygpCisKKwkJCWJ1dHRvbiA9IGd0ay5CdXR0b24oKQorCQkJYnV0dG9uLmFkZChpbWFnZSkKKwkJCWJ1dHRvbi5zZXRfcmVsaWVmKGd0ay5SRUxJRUZfTk9ORSkKKwkJCWJ1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5fZ29fY2xpY2tlZF9jYiwgY2hpbGRfaWQpCisJCQloYm94LnBhY2tfc3RhcnQoYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9VHJ1ZSkKKwkJCWJ1dHRvbi5zaG93KCkKKworCQkJaW1hZ2UgPSBndGsuSW1hZ2UoKQorCQkJaW1hZ2Uuc2V0X2Zyb21fc3RvY2soZ3RrLlNUT0NLX0ZJTkQsIGd0ay5JQ09OX1NJWkVfTUVOVSkKKwkJCWltYWdlLnNob3coKQorCisJCQlidXR0b24gPSBndGsuQnV0dG9uKCkKKwkJCWJ1dHRvbi5hZGQoaW1hZ2UpCisJCQlidXR0b24uc2V0X3JlbGllZihndGsuUkVMSUVGX05PTkUpCisJCQlidXR0b24uc2V0X3NlbnNpdGl2ZShUcnVlKQorCQkJYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLl9zaG93X2NsaWNrZWRfY2IsCisJCQkJCWNoaWxkX2lkLCBjb21taXQuY29tbWl0X3NoYTEsIHNlbGYuZW5jb2RpbmcpCisJCQloYm94LnBhY2tfc3RhcnQoYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9VHJ1ZSkKKwkJCWJ1dHRvbi5zaG93KCkKKworCWRlZiBfZGVzdHJveV9jYihzZWxmLCB3aWRnZXQpOgorCQkiIiJDYWxsYmFjayBmb3Igd2hlbiBhIHdpbmRvdyB3ZSBtYW5hZ2UgaXMgZGVzdHJveWVkLiIiIgorCQlzZWxmLnF1aXQoKQorCisKKwlkZWYgcXVpdChzZWxmKToKKwkJIiIiU3RvcCB0aGUgR1RLKyBtYWluIGxvb3AuIiIiCisJCWd0ay5tYWluX3F1aXQoKQorCisJZGVmIHJ1bihzZWxmLCBhcmdzKToKKwkJc2VsZi5zZXRfYnJhbmNoKGFyZ3MpCisJCXNlbGYud2luZG93LmNvbm5lY3QoImRlc3Ryb3kiLCBzZWxmLl9kZXN0cm95X2NiKQorCQlzZWxmLndpbmRvdy5zaG93KCkKKwkJZ3RrLm1haW4oKQorCisJZGVmIHNldF9icmFuY2goc2VsZiwgYXJncyk6CisJCSIiIkZpbGwgaW4gZGlmZmVyZW50IHdpbmRvd3Mgd2l0aCBpbmZvIGZyb20gdGhlIHJlcG9zaXJvdHkiIiIKKwkJZnAgPSBvcy5wb3BlbigiZ2l0IHJldi1wYXJzZSAtLXNxIC0tZGVmYXVsdCBIRUFEICIgKyBsaXN0X3RvX3N0cmluZyhhcmdzLCAxKSkKKwkJZ2l0X3Jldl9saXN0X2NtZCA9IGZwLnJlYWQoKQorCQlmcC5jbG9zZSgpCisJCWZwID0gb3MucG9wZW4oImdpdCByZXYtbGlzdCAgLS1oZWFkZXIgLS10b3BvLW9yZGVyIC0tcGFyZW50cyAiICsgZ2l0X3Jldl9saXN0X2NtZCkKKwkJc2VsZi51cGRhdGVfd2luZG93KGZwKQorCisJZGVmIHVwZGF0ZV93aW5kb3coc2VsZiwgZnApOgorCQljb21taXRfbGluZXMgPSBbXQorCisJCXNlbGYubW9kZWwgPSBndGsuTGlzdFN0b3JlKGdvYmplY3QuVFlQRV9QWU9CSkVDVCwgZ29iamVjdC5UWVBFX1BZT0JKRUNULAorCQkJCWdvYmplY3QuVFlQRV9QWU9CSkVDVCwgZ29iamVjdC5UWVBFX1BZT0JKRUNULCBzdHIsIHN0ciwgc3RyKQorCisJCSMgdXNlZCBmb3IgY3Vyc29yIHBvc2l0aW9uaW5nCisJCXNlbGYuaW5kZXggPSB7fQorCisJCXNlbGYuY29sb3VycyA9IHt9CisJCXNlbGYubm9kZXBvcyA9IHt9CisJCXNlbGYuaW5jb21wbGV0ZV9saW5lID0ge30KKwkJc2VsZi5jb21taXRzID0gW10KKworCQlpbmRleCA9IDAKKwkJbGFzdF9jb2xvdXIgPSAwCisJCWxhc3Rfbm9kZXBvcyA9IC0xCisJCW91dF9saW5lID0gW10KKwkJaW5wdXRfbGluZSA9IGZwLnJlYWRsaW5lKCkKKwkJd2hpbGUgKGlucHV0X2xpbmUgIT0gIiIpOgorCQkJIyBUaGUgY29tbWl0IGhlYWRlciBlbmRzIHdpdGggJ1wwJworCQkJIyBUaGlzIE5VTEwgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgdGhlIHNoYTEgb2YgdGhlCisJCQkjIG5leHQgY29tbWl0CisJCQlpZiAoaW5wdXRfbGluZVswXSAhPSAnXDAnKToKKwkJCQljb21taXRfbGluZXMuYXBwZW5kKGlucHV0X2xpbmUpCisJCQkJaW5wdXRfbGluZSA9IGZwLnJlYWRsaW5lKCkKKwkJCQljb250aW51ZTsKKworCQkJY29tbWl0ID0gQ29tbWl0KGNvbW1pdF9saW5lcykKKwkJCWlmIChjb21taXQgIT0gTm9uZSApOgorCQkJCXNlbGYuY29tbWl0cy5hcHBlbmQoY29tbWl0KQorCisJCQkjIFNraXAgdGhlICdcMAorCQkJY29tbWl0X2xpbmVzID0gW10KKwkJCWNvbW1pdF9saW5lcy5hcHBlbmQoaW5wdXRfbGluZVsxOl0pCisJCQlpbnB1dF9saW5lID0gZnAucmVhZGxpbmUoKQorCisJCWZwLmNsb3NlKCkKKworCQlmb3IgY29tbWl0IGluIHNlbGYuY29tbWl0czoKKwkJCShvdXRfbGluZSwgbGFzdF9jb2xvdXIsIGxhc3Rfbm9kZXBvcykgPSBzZWxmLmRyYXdfZ3JhcGgoY29tbWl0LAorCQkJCQkJCQkJCWluZGV4LCBvdXRfbGluZSwKKwkJCQkJCQkJCQlsYXN0X2NvbG91ciwKKwkJCQkJCQkJCQlsYXN0X25vZGVwb3MpCisJCQlzZWxmLmluZGV4W2NvbW1pdC5jb21taXRfc2hhMV0gPSBpbmRleAorCQkJaW5kZXggKz0gMQorCisJCXNlbGYudHJlZXZpZXcuc2V0X21vZGVsKHNlbGYubW9kZWwpCisJCXNlbGYudHJlZXZpZXcuc2hvdygpCisKKwlkZWYgZHJhd19ncmFwaChzZWxmLCBjb21taXQsIGluZGV4LCBvdXRfbGluZSwgbGFzdF9jb2xvdXIsIGxhc3Rfbm9kZXBvcyk6CisJCWluX2xpbmU9W10KKworCQkjICAgfCAgIC0+IG91dGxpbmUKKwkJIyAgIFgKKwkJIyAgIHxcICA8LSBpbmxpbmUKKworCQkjIFJlc2V0IG5vZGVwb3N0aW9uCisJCWlmIChsYXN0X25vZGVwb3MgPiA1KToKKwkJCWxhc3Rfbm9kZXBvcyA9IC0xCisKKwkJIyBBZGQgdGhlIGluY29tcGxldGUgbGluZXMgb2YgdGhlIGxhc3QgY2VsbCBpbiB0aGlzCisJCXRyeToKKwkJCWNvbG91ciA9IHNlbGYuY29sb3Vyc1tjb21taXQuY29tbWl0X3NoYTFdCisJCWV4Y2VwdCBLZXlFcnJvcjoKKwkJCXNlbGYuY29sb3Vyc1tjb21taXQuY29tbWl0X3NoYTFdID0gbGFzdF9jb2xvdXIrMQorCQkJbGFzdF9jb2xvdXIgPSBzZWxmLmNvbG91cnNbY29tbWl0LmNvbW1pdF9zaGExXQorCQkJY29sb3VyID0gICBzZWxmLmNvbG91cnNbY29tbWl0LmNvbW1pdF9zaGExXQorCisJCXRyeToKKwkJCW5vZGVfcG9zID0gc2VsZi5ub2RlcG9zW2NvbW1pdC5jb21taXRfc2hhMV0KKwkJZXhjZXB0IEtleUVycm9yOgorCQkJc2VsZi5ub2RlcG9zW2NvbW1pdC5jb21taXRfc2hhMV0gPSBsYXN0X25vZGVwb3MrMQorCQkJbGFzdF9ub2RlcG9zID0gc2VsZi5ub2RlcG9zW2NvbW1pdC5jb21taXRfc2hhMV0KKwkJCW5vZGVfcG9zID0gIHNlbGYubm9kZXBvc1tjb21taXQuY29tbWl0X3NoYTFdCisKKwkJI1RoZSBmaXJzdCBwYXJlbnQgYWx3YXlzIGNvbnRpbnVlIG9uIHRoZSBzYW1lIGxpbmUKKwkJdHJ5OgorCQkJIyBjaGVjayB3ZSBhbHJlYXkgaGF2ZSB0aGUgdmFsdWUKKwkJCXRtcF9ub2RlX3BvcyA9IHNlbGYubm9kZXBvc1tjb21taXQucGFyZW50X3NoYTFbMF1dCisJCWV4Y2VwdCBLZXlFcnJvcjoKKwkJCXNlbGYuY29sb3Vyc1tjb21taXQucGFyZW50X3NoYTFbMF1dID0gY29sb3VyCisJCQlzZWxmLm5vZGVwb3NbY29tbWl0LnBhcmVudF9zaGExWzBdXSA9IG5vZGVfcG9zCisKKwkJZm9yIHNoYTEgaW4gc2VsZi5pbmNvbXBsZXRlX2xpbmUua2V5cygpOgorCQkJaWYgKHNoYTEgIT0gY29tbWl0LmNvbW1pdF9zaGExKToKKwkJCQlzZWxmLmRyYXdfaW5jb21wbGV0ZV9saW5lKHNoYTEsIG5vZGVfcG9zLAorCQkJCQkJb3V0X2xpbmUsIGluX2xpbmUsIGluZGV4KQorCQkJZWxzZToKKwkJCQlkZWwgc2VsZi5pbmNvbXBsZXRlX2xpbmVbc2hhMV0KKworCisJCWZvciBwYXJlbnRfaWQgaW4gY29tbWl0LnBhcmVudF9zaGExOgorCQkJdHJ5OgorCQkJCXRtcF9ub2RlX3BvcyA9IHNlbGYubm9kZXBvc1twYXJlbnRfaWRdCisJCQlleGNlcHQgS2V5RXJyb3I6CisJCQkJc2VsZi5jb2xvdXJzW3BhcmVudF9pZF0gPSBsYXN0X2NvbG91cisxCisJCQkJbGFzdF9jb2xvdXIgPSBzZWxmLmNvbG91cnNbcGFyZW50X2lkXQorCQkJCXNlbGYubm9kZXBvc1twYXJlbnRfaWRdID0gbGFzdF9ub2RlcG9zKzEKKwkJCQlsYXN0X25vZGVwb3MgPSBzZWxmLm5vZGVwb3NbcGFyZW50X2lkXQorCisJCQlpbl9saW5lLmFwcGVuZCgobm9kZV9wb3MsIHNlbGYubm9kZXBvc1twYXJlbnRfaWRdLAorCQkJCQkJc2VsZi5jb2xvdXJzW3BhcmVudF9pZF0pKQorCQkJc2VsZi5hZGRfaW5jb21wbGV0ZV9saW5lKHBhcmVudF9pZCkKKworCQl0cnk6CisJCQlicmFuY2hfdGFnID0gc2VsZi5idF9zaGExW2NvbW1pdC5jb21taXRfc2hhMV0KKwkJZXhjZXB0IEtleUVycm9yOgorCQkJYnJhbmNoX3RhZyA9IFsgXQorCisKKwkJbm9kZSA9IChub2RlX3BvcywgY29sb3VyLCBicmFuY2hfdGFnKQorCisJCXNlbGYubW9kZWwuYXBwZW5kKFtjb21taXQsIG5vZGUsIG91dF9saW5lLCBpbl9saW5lLAorCQkJCWNvbW1pdC5tZXNzYWdlLCBjb21taXQuYXV0aG9yLCBjb21taXQuZGF0ZV0pCisKKwkJcmV0dXJuIChpbl9saW5lLCBsYXN0X2NvbG91ciwgbGFzdF9ub2RlcG9zKQorCisJZGVmIGFkZF9pbmNvbXBsZXRlX2xpbmUoc2VsZiwgc2hhMSk6CisJCXRyeToKKwkJCXNlbGYuaW5jb21wbGV0ZV9saW5lW3NoYTFdLmFwcGVuZChzZWxmLm5vZGVwb3Nbc2hhMV0pCisJCWV4Y2VwdCBLZXlFcnJvcjoKKwkJCXNlbGYuaW5jb21wbGV0ZV9saW5lW3NoYTFdID0gW3NlbGYubm9kZXBvc1tzaGExXV0KKworCWRlZiBkcmF3X2luY29tcGxldGVfbGluZShzZWxmLCBzaGExLCBub2RlX3Bvcywgb3V0X2xpbmUsIGluX2xpbmUsIGluZGV4KToKKwkJZm9yIGlkeCwgcG9zIGluIGVudW1lcmF0ZShzZWxmLmluY29tcGxldGVfbGluZVtzaGExXSk6CisJCQlpZihwb3MgPT0gbm9kZV9wb3MpOgorCQkJCSNyZW1vdmUgdGhlIHN0cmFpZ2h0IGxpbmUgYW5kIGFkZCBhIHNsYXNoCisJCQkJaWYgKChwb3MsIHBvcywgc2VsZi5jb2xvdXJzW3NoYTFdKSBpbiBvdXRfbGluZSk6CisJCQkJCW91dF9saW5lLnJlbW92ZSgocG9zLCBwb3MsIHNlbGYuY29sb3Vyc1tzaGExXSkpCisJCQkJb3V0X2xpbmUuYXBwZW5kKChwb3MsIHBvcyswLjUsIHNlbGYuY29sb3Vyc1tzaGExXSkpCisJCQkJc2VsZi5pbmNvbXBsZXRlX2xpbmVbc2hhMV1baWR4XSA9IHBvcyA9IHBvcyswLjUKKwkJCXRyeToKKwkJCQluZXh0X2NvbW1pdCA9IHNlbGYuY29tbWl0c1tpbmRleCsxXQorCQkJCWlmIChuZXh0X2NvbW1pdC5jb21taXRfc2hhMSA9PSBzaGExIGFuZCBwb3MgIT0gaW50KHBvcykpOgorCQkJCSMgam9pbiB0aGUgbGluZSBiYWNrIHRvIHRoZSBub2RlIHBvaW50CisJCQkJIyBUaGlzIG5lZWQgdG8gYmUgZG9uZSBvbmx5IGlmIHdlIG1vZGlmaWVkIGl0CisJCQkJCWluX2xpbmUuYXBwZW5kKChwb3MsIHBvcy0wLjUsIHNlbGYuY29sb3Vyc1tzaGExXSkpCisJCQkJCWNvbnRpbnVlOworCQkJZXhjZXB0IEluZGV4RXJyb3I6CisJCQkJcGFzcworCQkJaW5fbGluZS5hcHBlbmQoKHBvcywgcG9zLCBzZWxmLmNvbG91cnNbc2hhMV0pKQorCisKKwlkZWYgX2dvX2NsaWNrZWRfY2Ioc2VsZiwgd2lkZ2V0LCByZXZpZCk6CisJCSIiIkNhbGxiYWNrIGZvciB3aGVuIHRoZSBnbyBidXR0b24gZm9yIGEgcGFyZW50IGlzIGNsaWNrZWQuIiIiCisJCXRyeToKKwkJCXNlbGYudHJlZXZpZXcuc2V0X2N1cnNvcihzZWxmLmluZGV4W3JldmlkXSkKKwkJZXhjZXB0IEtleUVycm9yOgorCQkJZGlhbG9nID0gZ3RrLk1lc3NhZ2VEaWFsb2cocGFyZW50PU5vbmUsIGZsYWdzPTAsCisJCQkJCXR5cGU9Z3RrLk1FU1NBR0VfV0FSTklORywgYnV0dG9ucz1ndGsuQlVUVE9OU19DTE9TRSwKKwkJCQkJbWVzc2FnZV9mb3JtYXQ9Tm9uZSkKKwkJCWRpYWxvZy5zZXRfbWFya3VwKCJSZXZpc2lvbiA8Yj4lczwvYj4gbm90IHByZXNlbnQgaW4gdGhlIGxpc3QiICUgcmV2aWQpCisJCQkjIHJldmlkID09IDAgaXMgdGhlIHBhcmVudCBvZiB0aGUgZmlyc3QgY29tbWl0CisJCQlpZiAocmV2aWQgIT0gMCApOgorCQkJCWRpYWxvZy5mb3JtYXRfc2Vjb25kYXJ5X3RleHQoIlRyeSBydW5uaW5nIGdpdHZpZXcgd2l0aG91dCBhbnkgb3B0aW9ucyIpCisJCQlkaWFsb2cucnVuKCkKKwkJCWRpYWxvZy5kZXN0cm95KCkKKworCQlzZWxmLnRyZWV2aWV3LmdyYWJfZm9jdXMoKQorCisJZGVmIF9zaG93X2NsaWNrZWRfY2Ioc2VsZiwgd2lkZ2V0LCAgY29tbWl0X3NoYTEsIHBhcmVudF9zaGExLCBlbmNvZGluZyk6CisJCSIiIkNhbGxiYWNrIGZvciB3aGVuIHRoZSBzaG93IGJ1dHRvbiBmb3IgYSBwYXJlbnQgaXMgY2xpY2tlZC4iIiIKKwkJd2luZG93ID0gRGlmZldpbmRvdygpCisJCXdpbmRvdy5zZXRfZGlmZihjb21taXRfc2hhMSwgcGFyZW50X3NoYTEsIGVuY29kaW5nKQorCQlzZWxmLnRyZWV2aWV3LmdyYWJfZm9jdXMoKQorCit3aXRob3V0X2RpZmYgPSAwCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorCisJaWYgKGxlbihzeXMuYXJndikgPiAxICk6CisJCWlmIChzeXMuYXJndlsxXSA9PSAiLS13aXRob3V0LWRpZmYiKToKKwkJCXdpdGhvdXRfZGlmZiA9IDEKKworCXZpZXcgPSBHaXRWaWV3KCB3aXRob3V0X2RpZmYgIT0gMSkKKwl2aWV3LnJ1bihzeXMuYXJndlt3aXRob3V0X2RpZmY6XSkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZ2l0dmlldy9naXR2aWV3LnR4dCBiL2NvbnRyaWIvZ2l0dmlldy9naXR2aWV3LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2MyOWRlCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9naXR2aWV3L2dpdHZpZXcudHh0CkBAIC0wLDAgKzEsNTYgQEAKK2dpdHZpZXcoMSkKKz09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0dmlldyAtIEEgR1RLIGJhc2VkIHJlcG9zaXRvcnkgYnJvd3NlciBmb3IgZ2l0CisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdHZpZXcnIFtvcHRpb25zXSBbYXJnc10KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLQorCitEZXBlbmRlbmNpZXM6CisKKyogUHl0aG9uIDIuNAorKiBQeUdUSyAyLjggb3IgbGF0ZXIKKyogUHlDYWlybyAxLjAgb3IgbGF0ZXIKKworT1BUSU9OUworLS0tLS0tLQorLS13aXRob3V0LWRpZmY6OgorCisJSWYgdGhlIHVzZXIgZG9lc24ndCB3YW50IHRvIGxpc3QgdGhlIGNvbW1pdCBkaWZmcyBpbiB0aGUgbWFpbiB3aW5kb3cuCisJVGhpcyBtYXkgc3BlZWQgdXAgdGhlIHJlcG9zaXRvcnkgYnJvd3NpbmcuCisKKzxhcmdzPjo6CisKKwlBbGwgdGhlIHZhbGlkIG9wdGlvbiBmb3IgZ2l0bGluazpnaXQtcmV2LWxpc3RbMV0uCisKK0tleSBCaW5kaW5ncworLS0tLS0tLS0tLS0tCitGNDo6CisJVG8gbWF4aW1pemUgdGhlIHdpbmRvdworCitGNTo6CisJVG8gcmVyZWFkIHJlZmVyZW5jZXMuCisKK0YxMTo6CisJRnVsbCBzY3JlZW4KKworRjEyOjoKKwlMZWF2ZSBmdWxsIHNjcmVlbgorCitFWEFNUExFUworLS0tLS0tLS0KKworZ2l0dmlldyB2Mi42LjEyLi4gaW5jbHVkZS9zY3NpIGRyaXZlcnMvc2NzaTo6CisKKwlTaG93IGFzIHRoZSBjaGFuZ2VzIHNpbmNlIHZlcnNpb24gdjIuNi4xMiB0aGF0IGNoYW5nZWQgYW55IGZpbGUgaW4gdGhlCisJaW5jbHVkZS9zY3NpIG9yIGRyaXZlcnMvc2NzaSBzdWJkaXJlY3RvcmllcworCitnaXR2aWV3IC0tc2luY2U9Mi53ZWVrcy5hZ286OgorCisJU2hvdyB0aGUgY2hhbmdlcyBkdXJpbmcgdGhlIGxhc3QgdHdvIHdlZWtzCmRpZmYgLS1naXQgYS9jb250cmliL2hnLXRvLWdpdC9oZy10by1naXQucHkgYi9jb250cmliL2hnLXRvLWdpdC9oZy10by1naXQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDcyZmZiYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvaGctdG8tZ2l0L2hnLXRvLWdpdC5weQpAQCAtMCwwICsxLDIzOSBAQAorIyEgL3Vzci9iaW4vcHl0aG9uCisKKyIiIiBoZy10by1naXQucHkgLSBBIE1lcmN1cmlhbCB0byBHSVQgY29udmVydGVyCisKKyAgICBDb3B5cmlnaHQgKEMpMjAwNyBTdGVsaWFuIFBvcCA8c3RlbGlhbkBwb3BpZXMubmV0PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisiIiIKKworaW1wb3J0IG9zLCBvcy5wYXRoLCBzeXMKK2ltcG9ydCB0ZW1wZmlsZSwgcG9wZW4yLCBwaWNrbGUsIGdldG9wdAoraW1wb3J0IHJlCisKKyMgTWFwcyBoZyB2ZXJzaW9uIC0+IGdpdCB2ZXJzaW9uCitoZ3ZlcnMgPSB7fQorIyBMaXN0IG9mIGNoaWxkcmVuIGZvciBlYWNoIGhnIHJldmlzaW9uCitoZ2NoaWxkcmVuID0ge30KKyMgTGlzdCBvZiBwYXJlbnRzIGZvciBlYWNoIGhnIHJldmlzaW9uCitoZ3BhcmVudHMgPSB7fQorIyBDdXJyZW50IGJyYW5jaCBmb3IgZWFjaCBoZyByZXZpc2lvbgoraGdicmFuY2ggPSB7fQorIyBOdW1iZXIgb2YgbmV3IGNoYW5nZXNldHMgY29udmVydGVkIGZyb20gaGcKK2hnbmV3Y3NldHMgPSAwCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIHVzYWdlKCk6CisKKyAgICAgICAgcHJpbnQgIiIiXAorJXM6IFtPUFRJT05TXSA8aGdwcmo+CisKK29wdGlvbnM6CisgICAgLXMsIC0tZ2l0c3RhdGU9RklMRTogbmFtZSBvZiB0aGUgc3RhdGUgdG8gYmUgc2F2ZWQvcmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpbmNyZW1lbnRhbHMKKyAgICAtbiwgLS1ucmVwYWNrPUlOVDogICBudW1iZXIgb2YgY2hhbmdlc2V0cyB0aGF0IHdpbGwgdHJpZ2dlcgorICAgICAgICAgICAgICAgICAgICAgICAgIGEgcmVwYWNrIChkZWZhdWx0PTAsIC0xIHRvIGRlYWN0aXZhdGUpCisKK3JlcXVpcmVkOgorICAgIGhncHJqOiAgbmFtZSBvZiB0aGUgSEcgcHJvamVjdCB0byBpbXBvcnQgKGRpcmVjdG9yeSkKKyIiIiAlIHN5cy5hcmd2WzBdCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIGdldGdpdGVudih1c2VyLCBkYXRlKToKKyAgICBlbnYgPSAnJworICAgIGVsZW1zID0gcmUuY29tcGlsZSgnKC4qPylccys8KC4qKT4nKS5tYXRjaCh1c2VyKQorICAgIGlmIGVsZW1zOgorICAgICAgICBlbnYgKz0gJ2V4cG9ydCBHSVRfQVVUSE9SX05BTUU9IiVzIiA7JyAlIGVsZW1zLmdyb3VwKDEpCisgICAgICAgIGVudiArPSAnZXhwb3J0IEdJVF9DT01NSVRFUl9OQU1FPSIlcyIgOycgJSBlbGVtcy5ncm91cCgxKQorICAgICAgICBlbnYgKz0gJ2V4cG9ydCBHSVRfQVVUSE9SX0VNQUlMPSIlcyIgOycgJSBlbGVtcy5ncm91cCgyKQorICAgICAgICBlbnYgKz0gJ2V4cG9ydCBHSVRfQ09NTUlURVJfRU1BSUw9IiVzIiA7JyAlIGVsZW1zLmdyb3VwKDIpCisgICAgZWxzZToKKyAgICAgICAgZW52ICs9ICdleHBvcnQgR0lUX0FVVEhPUl9OQU1FPSIlcyIgOycgJSB1c2VyCisgICAgICAgIGVudiArPSAnZXhwb3J0IEdJVF9DT01NSVRFUl9OQU1FPSIlcyIgOycgJSB1c2VyCisgICAgICAgIGVudiArPSAnZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUw9IDsnCisgICAgICAgIGVudiArPSAnZXhwb3J0IEdJVF9DT01NSVRFUl9FTUFJTD0gOycKKworICAgIGVudiArPSAnZXhwb3J0IEdJVF9BVVRIT1JfREFURT0iJXMiIDsnICUgZGF0ZQorICAgIGVudiArPSAnZXhwb3J0IEdJVF9DT01NSVRURVJfREFURT0iJXMiIDsnICUgZGF0ZQorICAgIHJldHVybiBlbnYKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0ZSA9ICcnCitvcHRfbnJlcGFjayA9IDAKKwordHJ5OgorICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgJ3M6dDpuOicsIFsnZ2l0c3RhdGU9JywgJ3RlbXBkaXI9JywgJ25yZXBhY2s9J10pCisgICAgZm9yIG8sIGEgaW4gb3B0czoKKyAgICAgICAgaWYgbyBpbiAoJy1zJywgJy0tZ2l0c3RhdGUnKToKKyAgICAgICAgICAgIHN0YXRlID0gYQorICAgICAgICAgICAgc3RhdGUgPSBvcy5wYXRoLmFic3BhdGgoc3RhdGUpCisgICAgICAgIGlmIG8gaW4gKCctbicsICctLW5yZXBhY2snKToKKyAgICAgICAgICAgIG9wdF9ucmVwYWNrID0gaW50KGEpCisgICAgaWYgbGVuKGFyZ3MpICE9IDE6CisgICAgICAgIHJhaXNlKCdwYXJhbXMnKQorZXhjZXB0OgorICAgIHVzYWdlKCkKKyAgICBzeXMuZXhpdCgxKQorCitoZ3ByaiA9IGFyZ3NbMF0KK29zLmNoZGlyKGhncHJqKQorCitpZiBzdGF0ZToKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhzdGF0ZSk6CisgICAgICAgIHByaW50ICdTdGF0ZSBkb2VzIGV4aXN0LCByZWFkaW5nJworICAgICAgICBmID0gb3BlbihzdGF0ZSwgJ3InKQorICAgICAgICBoZ3ZlcnMgPSBwaWNrbGUubG9hZChmKQorICAgIGVsc2U6CisgICAgICAgIHByaW50ICdTdGF0ZSBkb2VzIG5vdCBleGlzdCwgZmlyc3QgcnVuJworCit0aXAgPSBvcy5wb3BlbignaGcgdGlwIC0tdGVtcGxhdGUgIntyZXZ9IicpLnJlYWQoKQorcHJpbnQgJ3RpcCBpcycsIHRpcAorCisjIENhbGN1bGF0ZSB0aGUgYnJhbmNoZXMKK3ByaW50ICdhbmFseXNpbmcgdGhlIGJyYW5jaGVzLi4uJworaGdjaGlsZHJlblsiMCJdID0gKCkKK2hncGFyZW50c1siMCJdID0gKE5vbmUsIE5vbmUpCitoZ2JyYW5jaFsiMCJdID0gIm1hc3RlciIKK2ZvciBjc2V0IGluIHJhbmdlKDEsIGludCh0aXApICsgMSk6CisgICAgaGdjaGlsZHJlbltzdHIoY3NldCldID0gKCkKKyAgICBwcm50cyA9IG9zLnBvcGVuKCdoZyBsb2cgLXIgJWQgLS10ZW1wbGF0ZSAie3BhcmVudHN9IicgJSBjc2V0KS5yZWFkKCkuc3RyaXAoKS5zcGxpdCgnICcpCisgICAgcHJudHMgPSBtYXAobGFtYmRhIHg6IHhbOnguZmluZCgnOicpXSwgcHJudHMpCisgICAgaWYgcHJudHNbMF0gIT0gJyc6CisgICAgICAgIHBhcmVudCA9IHBybnRzWzBdLnN0cmlwKCkKKyAgICBlbHNlOgorICAgICAgICBwYXJlbnQgPSBzdHIoY3NldCAtIDEpCisgICAgaGdjaGlsZHJlbltwYXJlbnRdICs9ICggc3RyKGNzZXQpLCApCisgICAgaWYgbGVuKHBybnRzKSA+IDE6CisgICAgICAgIG1wYXJlbnQgPSBwcm50c1sxXS5zdHJpcCgpCisgICAgICAgIGhnY2hpbGRyZW5bbXBhcmVudF0gKz0gKCBzdHIoY3NldCksICkKKyAgICBlbHNlOgorICAgICAgICBtcGFyZW50ID0gTm9uZQorCisgICAgaGdwYXJlbnRzW3N0cihjc2V0KV0gPSAocGFyZW50LCBtcGFyZW50KQorCisgICAgaWYgbXBhcmVudDoKKyAgICAgICAgIyBGb3IgbWVyZ2UgY2hhbmdlc2V0cywgdGFrZSBlaXRoZXIgb25lLCBwcmVmZXJhYmx5IHRoZSAnbWFzdGVyJyBicmFuY2gKKyAgICAgICAgaWYgaGdicmFuY2hbbXBhcmVudF0gPT0gJ21hc3Rlcic6CisgICAgICAgICAgICBoZ2JyYW5jaFtzdHIoY3NldCldID0gJ21hc3RlcicKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGhnYnJhbmNoW3N0cihjc2V0KV0gPSBoZ2JyYW5jaFtwYXJlbnRdCisgICAgZWxzZToKKyAgICAgICAgIyBOb3JtYWwgY2hhbmdlc2V0cworICAgICAgICAjIEZvciBmaXJzdCBjaGlsZHJlbiwgdGFrZSB0aGUgcGFyZW50IGJyYW5jaCwgZm9yIHRoZSBvdGhlcnMgY3JlYXRlIGEgbmV3IGJyYW5jaAorICAgICAgICBpZiBoZ2NoaWxkcmVuW3BhcmVudF1bMF0gPT0gc3RyKGNzZXQpOgorICAgICAgICAgICAgaGdicmFuY2hbc3RyKGNzZXQpXSA9IGhnYnJhbmNoW3BhcmVudF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGhnYnJhbmNoW3N0cihjc2V0KV0gPSAiYnJhbmNoLSIgKyBzdHIoY3NldCkKKworaWYgbm90IGhndmVycy5oYXNfa2V5KCIwIik6CisgICAgcHJpbnQgJ2NyZWF0aW5nIHJlcG9zaXRvcnknCisgICAgb3Muc3lzdGVtKCdnaXQtaW5pdC1kYicpCisKKyMgbG9vcCB0aHJvdWdoIGV2ZXJ5IGhnIGNoYW5nZXNldAorZm9yIGNzZXQgaW4gcmFuZ2UoaW50KHRpcCkgKyAxKToKKworICAgICMgaW5jcmVtZW50YWwsIGFscmVhZHkgc2VlbgorICAgIGlmIGhndmVycy5oYXNfa2V5KHN0cihjc2V0KSk6CisgICAgICAgIGNvbnRpbnVlCisgICAgaGduZXdjc2V0cyArPSAxCisKKyAgICAjIGdldCBpbmZvCisgICAgbG9nX2RhdGEgPSBvcy5wb3BlbignaGcgbG9nIC1yICVkIC0tdGVtcGxhdGUgInt0YWdzfVxue2RhdGV8ZGF0ZX1cbnthdXRob3J9XG4iJyAlIGNzZXQpLnJlYWRsaW5lcygpCisgICAgdGFnID0gbG9nX2RhdGFbMF0uc3RyaXAoKQorICAgIGRhdGUgPSBsb2dfZGF0YVsxXS5zdHJpcCgpCisgICAgdXNlciA9IGxvZ19kYXRhWzJdLnN0cmlwKCkKKyAgICBwYXJlbnQgPSBoZ3BhcmVudHNbc3RyKGNzZXQpXVswXQorICAgIG1wYXJlbnQgPSBoZ3BhcmVudHNbc3RyKGNzZXQpXVsxXQorCisgICAgI2dldCBjb21tZW50CisgICAgKGZkY29tbWVudCwgZmlsZWNvbW1lbnQpID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgY3NldGNvbW1lbnQgPSBvcy5wb3BlbignaGcgbG9nIC1yICVkIC0tdGVtcGxhdGUgIntkZXNjfSInICUgY3NldCkucmVhZCgpLnN0cmlwKCkKKyAgICBvcy53cml0ZShmZGNvbW1lbnQsIGNzZXRjb21tZW50KQorICAgIG9zLmNsb3NlKGZkY29tbWVudCkKKworICAgIHByaW50ICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKKyAgICBwcmludCAnY3NldDonLCBjc2V0CisgICAgcHJpbnQgJ2JyYW5jaDonLCBoZ2JyYW5jaFtzdHIoY3NldCldCisgICAgcHJpbnQgJ3VzZXI6JywgdXNlcgorICAgIHByaW50ICdkYXRlOicsIGRhdGUKKyAgICBwcmludCAnY29tbWVudDonLCBjc2V0Y29tbWVudAorICAgIGlmIHBhcmVudDoKKwlwcmludCAncGFyZW50OicsIHBhcmVudAorICAgIGlmIG1wYXJlbnQ6CisgICAgICAgIHByaW50ICdtcGFyZW50OicsIG1wYXJlbnQKKyAgICBpZiB0YWc6CisgICAgICAgIHByaW50ICd0YWc6JywgdGFnCisgICAgcHJpbnQgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworCisgICAgIyBjaGVja291dCB0aGUgcGFyZW50IGlmIG5lY2Vzc2FyeQorICAgIGlmIGNzZXQgIT0gMDoKKyAgICAgICAgaWYgaGdicmFuY2hbc3RyKGNzZXQpXSA9PSAiYnJhbmNoLSIgKyBzdHIoY3NldCk6CisgICAgICAgICAgICBwcmludCAnY3JlYXRpbmcgbmV3IGJyYW5jaCcsIGhnYnJhbmNoW3N0cihjc2V0KV0KKyAgICAgICAgICAgIG9zLnN5c3RlbSgnZ2l0LWNoZWNrb3V0IC1iICVzICVzJyAlIChoZ2JyYW5jaFtzdHIoY3NldCldLCBoZ3ZlcnNbcGFyZW50XSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAnY2hlY2tpbmcgb3V0IGJyYW5jaCcsIGhnYnJhbmNoW3N0cihjc2V0KV0KKyAgICAgICAgICAgIG9zLnN5c3RlbSgnZ2l0LWNoZWNrb3V0ICVzJyAlIGhnYnJhbmNoW3N0cihjc2V0KV0pCisKKyAgICAjIG1lcmdlCisgICAgaWYgbXBhcmVudDoKKyAgICAgICAgaWYgaGdicmFuY2hbcGFyZW50XSA9PSBoZ2JyYW5jaFtzdHIoY3NldCldOgorICAgICAgICAgICAgb3RoZXJicmFuY2ggPSBoZ2JyYW5jaFttcGFyZW50XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3RoZXJicmFuY2ggPSBoZ2JyYW5jaFtwYXJlbnRdCisgICAgICAgIHByaW50ICdtZXJnaW5nJywgb3RoZXJicmFuY2gsICdpbnRvJywgaGdicmFuY2hbc3RyKGNzZXQpXQorICAgICAgICBvcy5zeXN0ZW0oZ2V0Z2l0ZW52KHVzZXIsIGRhdGUpICsgJ2dpdC1tZXJnZSAtLW5vLWNvbW1pdCAtcyBvdXJzICIiICVzICVzJyAlIChoZ2JyYW5jaFtzdHIoY3NldCldLCBvdGhlcmJyYW5jaCkpCisKKyAgICAjIHJlbW92ZSBldmVyeXRoaW5nIGV4Y2VwdCAuZ2l0IGFuZCAuaGcgZGlyZWN0b3JpZXMKKyAgICBvcy5zeXN0ZW0oJ2ZpbmQgLiBcKCAtcGF0aCAiLi8uaGciIC1vIC1wYXRoICIuLy5naXQiIFwpIC1wcnVuZSAtbyAhIC1uYW1lICIuIiAtcHJpbnQgfCB4YXJncyBybSAtcmYnKQorCisgICAgIyByZXBvcHVsYXRlIHdpdGggY2hlY2tvdXRlZCBmaWxlcworICAgIG9zLnN5c3RlbSgnaGcgdXBkYXRlIC1DICVkJyAlIGNzZXQpCisKKyAgICAjIGFkZCBuZXcgZmlsZXMKKyAgICBvcy5zeXN0ZW0oJ2dpdC1scy1maWxlcyAteCAuaGcgLS1vdGhlcnMgfCBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tc3RkaW4nKQorICAgICMgZGVsZXRlIHJlbW92ZWQgZmlsZXMKKyAgICBvcy5zeXN0ZW0oJ2dpdC1scy1maWxlcyAteCAuaGcgLS1kZWxldGVkIHwgZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZSAtLXN0ZGluJykKKworICAgICMgY29tbWl0CisgICAgb3Muc3lzdGVtKGdldGdpdGVudih1c2VyLCBkYXRlKSArICdnaXQgY29tbWl0IC0tYWxsb3ctZW1wdHkgLWEgLUYgJXMnICUgZmlsZWNvbW1lbnQpCisgICAgb3MudW5saW5rKGZpbGVjb21tZW50KQorCisgICAgIyB0YWcKKyAgICBpZiB0YWcgYW5kIHRhZyAhPSAndGlwJzoKKyAgICAgICAgb3Muc3lzdGVtKGdldGdpdGVudih1c2VyLCBkYXRlKSArICdnaXQtdGFnICVzJyAlIHRhZykKKworICAgICMgZGVsZXRlIGJyYW5jaCBpZiBub3QgdXNlZCBhbnltb3JlLi4uCisgICAgaWYgbXBhcmVudCBhbmQgbGVuKGhnY2hpbGRyZW5bc3RyKGNzZXQpXSk6CisgICAgICAgIHByaW50ICJEZWxldGluZyB1bnVzZWQgYnJhbmNoOiIsIG90aGVyYnJhbmNoCisgICAgICAgIG9zLnN5c3RlbSgnZ2l0LWJyYW5jaCAtZCAlcycgJSBvdGhlcmJyYW5jaCkKKworICAgICMgcmV0cmlldmUgYW5kIHJlY29yZCB0aGUgdmVyc2lvbgorICAgIHZ2diA9IG9zLnBvcGVuKCdnaXQtc2hvdyAtLXF1aWV0IC0tcHJldHR5PWZvcm1hdDolSCcpLnJlYWQoKQorICAgIHByaW50ICdyZWNvcmQnLCBjc2V0LCAnLT4nLCB2dnYKKyAgICBoZ3ZlcnNbc3RyKGNzZXQpXSA9IHZ2dgorCitpZiBoZ25ld2NzZXRzID49IG9wdF9ucmVwYWNrIGFuZCBvcHRfbnJlcGFjayAhPSAtMToKKyAgICBvcy5zeXN0ZW0oJ2dpdC1yZXBhY2sgLWEgLWQnKQorCisjIHdyaXRlIHRoZSBzdGF0ZSBmb3IgaW5jcmVtZW50YWxzCitpZiBzdGF0ZToKKyAgICBwcmludCAnV3JpdGluZyBzdGF0ZScKKyAgICBmID0gb3BlbihzdGF0ZSwgJ3cnKQorICAgIHBpY2tsZS5kdW1wKGhndmVycywgZikKKworIyB2aW06IGV0IHRzPTggc3c9NCBzdHM9NApkaWZmIC0tZ2l0IGEvY29udHJpYi9oZy10by1naXQvaGctdG8tZ2l0LnR4dCBiL2NvbnRyaWIvaGctdG8tZ2l0L2hnLXRvLWdpdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFmOGZlNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvaGctdG8tZ2l0L2hnLXRvLWdpdC50eHQKQEAgLTAsMCArMSwyMSBAQAoraGctdG8tZ2l0LnB5IGlzIGFibGUgdG8gY29udmVydCBhIE1lcmN1cmlhbCByZXBvc2l0b3J5IGludG8gYSBnaXQgb25lLAorYW5kIHByZXNlcnZlcyB0aGUgYnJhbmNoZXMgaW4gdGhlIHByb2Nlc3MgKHVubGlrZSB0YWlsb3IpCisKK2hnLXRvLWdpdC5weSBjYW4gcHJvYmFibHkgYmUgZ3JlYXRseSBpbXByb3ZlZCAoaXQncyBhIHJhdGhlciBjcnVkZQorY29tYmluYXRpb24gb2Ygc2hlbGwgYW5kIHB5dGhvbikgYnV0IGl0IGRvZXMgYWxyZWFkeSB3b3JrIHF1aXRlIHdlbGwgZm9yCittZS4gRmVhdHVyZXM6CisJLSBzdXBwb3J0cyBpbmNyZW1lbnRhbCBjb252ZXJzaW9uCisJICAoZm9yIGtlZXBpbmcgYSBnaXQgcmVwbyBpbiBzeW5jIHdpdGggYSBoZyBvbmUpCisgICAgICAgIC0gc3VwcG9ydHMgaGcgYnJhbmNoZXMKKyAgICAgICAgLSBjb252ZXJ0cyBoZyB0YWdzCisKK05vdGUgdGhhdCB0aGUgZ2l0IHJlcG9zaXRvcnkgd2lsbCBiZSBjcmVhdGVkICdpbiBwbGFjZScgKGF0IHRoZSBzYW1lCitsb2NhdGlvbiBhcyB0aGUgc291cmNlIGhnIHJlcG8pLiBZb3Ugd2lsbCBoYXZlIHRvIG1hbnVhbGx5IHJlbW92ZSB0aGUKKycuaGcnIGRpcmVjdG9yeSBhZnRlciB0aGUgY29udmVyc2lvbi4KKworQWxzbyBub3RlIHRoYXQgdGhlIGluY3JlbWVudGFsIGNvbnZlcnNpb24gdXNlcyAnc2ltcGxlJyBoZyBjaGFuZ2VzZXRzCitpZGVudGlmaWVycyAob3JkaW5hbHMsIGFzIG9wcG9zZWQgdG8gU0hBLTEgaWRzKSwgYW5kIHNpbmNlIHRoZXNlIGlkcworYXJlIG5vdCBzdGFibGUgYWNyb3NzIGRpZmZlcmVudCByZXBvc2l0b3JpZXMgdGhlIGhnLXRvLWdpdC5weSBzdGF0ZSBmaWxlCitpcyBmb3JldmVyIHRpZWQgdG8gb25lIGhnIHJlcG9zaXRvcnkuCisKK1N0ZWxpYW4gUG9wIDxzdGVsaWFuQHBvcGllcy5uZXQ+CmRpZmYgLS1naXQgYS9jb250cmliL2hvb2tzL3Bvc3QtcmVjZWl2ZS1lbWFpbCBiL2NvbnRyaWIvaG9va3MvcG9zdC1yZWNlaXZlLWVtYWlsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYTc0MGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2hvb2tzL3Bvc3QtcmVjZWl2ZS1lbWFpbApAQCAtMCwwICsxLDY0MyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBBbmR5IFBhcmtpbnMKKyMKKyMgQW4gZXhhbXBsZSBob29rIHNjcmlwdCB0byBtYWlsIG91dCBjb21taXQgdXBkYXRlIGluZm9ybWF0aW9uLiAgVGhpcyBob29rCisjIHNlbmRzIGVtYWlscyBsaXN0aW5nIG5ldyByZXZpc2lvbnMgdG8gdGhlIHJlcG9zaXRvcnkgaW50cm9kdWNlZCBieSB0aGUKKyMgY2hhbmdlIGJlaW5nIHJlcG9ydGVkLiAgVGhlIHJ1bGUgaXMgdGhhdCAoZm9yIGJyYW5jaCB1cGRhdGVzKSBlYWNoIGNvbW1pdAorIyB3aWxsIGFwcGVhciBvbiBvbmUgZW1haWwgYW5kIG9uZSBlbWFpbCBvbmx5LgorIworIyBUaGlzIGhvb2sgaXMgc3RvcmVkIGluIHRoZSBjb250cmliL2hvb2tzIGRpcmVjdG9yeS4gIFlvdXIgZGlzdHJpYnV0aW9uCisjIHdpbGwgaGF2ZSBwdXQgdGhpcyBzb21ld2hlcmUgc3RhbmRhcmQuICBZb3Ugc2hvdWxkIG1ha2UgdGhpcyBzY3JpcHQKKyMgZXhlY3V0YWJsZSB0aGVuIGxpbmsgdG8gaXQgaW4gdGhlIHJlcG9zaXRvcnkgeW91IHdvdWxkIGxpa2UgdG8gdXNlIGl0IGluLgorIyBGb3IgZXhhbXBsZSwgb24gZGViaWFuIHRoZSBob29rIGlzIHN0b3JlZCBpbgorIyAvdXNyL3NoYXJlL2RvYy9naXQtY29yZS9jb250cmliL2hvb2tzL3Bvc3QtcmVjZWl2ZS1lbWFpbDoKKyMKKyMgIGNobW9kIGEreCBwb3N0LXJlY2VpdmUtZW1haWwKKyMgIGNkIC9wYXRoL3RvL3lvdXIvcmVwb3NpdG9yeS5naXQKKyMgIGxuIC1zZiAvdXNyL3NoYXJlL2RvYy9naXQtY29yZS9jb250cmliL2hvb2tzL3Bvc3QtcmVjZWl2ZS1lbWFpbCBob29rcy9wb3N0LXJlY2VpdmUKKyMKKyMgVGhpcyBob29rIHNjcmlwdCBhc3N1bWVzIGl0IGlzIGVuYWJsZWQgb24gdGhlIGNlbnRyYWwgcmVwb3NpdG9yeSBvZiBhCisjIHByb2plY3QsIHdpdGggYWxsIHVzZXJzIHB1c2hpbmcgb25seSB0byBpdCBhbmQgbm90IGJldHdlZW4gZWFjaCBvdGhlci4gIEl0CisjIHdpbGwgc3RpbGwgd29yayBpZiB5b3UgZG9uJ3Qgb3BlcmF0ZSBpbiB0aGF0IHN0eWxlLCBidXQgaXQgd291bGQgYmVjb21lCisjIHBvc3NpYmxlIGZvciB0aGUgZW1haWwgdG8gYmUgZnJvbSBzb21lb25lIG90aGVyIHRoYW4gdGhlIHBlcnNvbiBkb2luZyB0aGUKKyMgcHVzaC4KKyMKKyMgQ29uZmlnCisjIC0tLS0tLQorIyBob29rcy5tYWlsaW5nbGlzdAorIyAgIFRoaXMgaXMgdGhlIGxpc3QgdGhhdCBhbGwgcHVzaGVzIHdpbGwgZ28gdG87IGxlYXZlIGl0IGJsYW5rIHRvIG5vdCBzZW5kCisjICAgZW1haWxzIGZvciBldmVyeSByZWYgdXBkYXRlLgorIyBob29rcy5hbm5vdW5jZWxpc3QKKyMgICBUaGlzIGlzIHRoZSBsaXN0IHRoYXQgYWxsIHB1c2hlcyBvZiBhbm5vdGF0ZWQgdGFncyB3aWxsIGdvIHRvLiAgTGVhdmUgaXQKKyMgICBibGFuayB0byBkZWZhdWx0IHRvIHRoZSBtYWlsaW5nbGlzdCBmaWVsZC4gIFRoZSBhbm5vdW5jZSBlbWFpbHMgbGlzdHMKKyMgICB0aGUgc2hvcnQgbG9nIHN1bW1hcnkgb2YgdGhlIGNoYW5nZXMgc2luY2UgdGhlIGxhc3QgYW5ub3RhdGVkIHRhZy4KKyMgaG9va3MuZW52ZWxvcGVzZW5kZXIKKyMgICBJZiBzZXQgdGhlbiB0aGUgLWYgb3B0aW9uIGlzIHBhc3NlZCB0byBzZW5kbWFpbCB0byBhbGxvdyB0aGUgZW52ZWxvcGUKKyMgICBzZW5kZXIgYWRkcmVzcyB0byBiZSBzZXQKKyMgaG9va3MuZW1haWxwcmVmaXgKKyMgICBBbGwgZW1haWxzIGhhdmUgdGhlaXIgc3ViamVjdHMgcHJlZml4ZWQgd2l0aCB0aGlzIHByZWZpeCwgb3IgIltTQ01dIgorIyAgIGlmIGVtYWlscHJlZml4IGlzIHVuc2V0LCB0byBhaWQgZmlsdGVyaW5nCisjCisjIE5vdGVzCisjIC0tLS0tCisjIEFsbCBlbWFpbHMgaW5jbHVkZSB0aGUgaGVhZGVycyAiWC1HaXQtUmVmbmFtZSIsICJYLUdpdC1PbGRyZXYiLAorIyAiWC1HaXQtTmV3cmV2IiwgYW5kICJYLUdpdC1SZWZ0eXBlIiB0byBlbmFibGUgZmluZSB0dW5lZCBmaWx0ZXJpbmcgYW5kCisjIGdpdmUgaW5mb3JtYXRpb24gZm9yIGRlYnVnZ2luZy4KKyMKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9ucworCisjCisjIFRvcCBsZXZlbCBlbWFpbCBnZW5lcmF0aW9uIGZ1bmN0aW9uLiAgVGhpcyBkZWNpZGVzIHdoYXQgdHlwZSBvZiB1cGRhdGUKKyMgdGhpcyBpcyBhbmQgY2FsbHMgdGhlIGFwcHJvcHJpYXRlIGJvZHktZ2VuZXJhdGlvbiByb3V0aW5lIGFmdGVyIG91dHB1dHRpbmcKKyMgdGhlIGNvbW1vbiBoZWFkZXIKKyMKKyMgTm90ZSB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgYWN0dWFsbHkgZ2VuZXJhdGUgYW55IGVtYWlsIG91dHB1dCwgdGhhdCBpcworIyB0YWtlbiBjYXJlIG9mIGJ5IHRoZSBmdW5jdGlvbnMgaXQgY2FsbHM6CisjICAtIGdlbmVyYXRlX2VtYWlsX2hlYWRlcgorIyAgLSBnZW5lcmF0ZV9jcmVhdGVfWFhYWF9lbWFpbAorIyAgLSBnZW5lcmF0ZV91cGRhdGVfWFhYWF9lbWFpbAorIyAgLSBnZW5lcmF0ZV9kZWxldGVfWFhYWF9lbWFpbAorIyAgLSBnZW5lcmF0ZV9lbWFpbF9mb290ZXIKKyMKK2dlbmVyYXRlX2VtYWlsKCkKK3sKKwkjIC0tLSBBcmd1bWVudHMKKwlvbGRyZXY9JChnaXQgcmV2LXBhcnNlICQxKQorCW5ld3Jldj0kKGdpdCByZXYtcGFyc2UgJDIpCisJcmVmbmFtZT0iJDMiCisKKwkjIC0tLSBJbnRlcnByZXQKKwkjIDAwMDAtPjEyMzQgKGNyZWF0ZSkKKwkjIDEyMzQtPjIzNDUgKHVwZGF0ZSkKKwkjIDIzNDUtPjAwMDAgKGRlbGV0ZSkKKwlpZiBleHByICIkb2xkcmV2IiA6ICcwKiQnID4vZGV2L251bGwKKwl0aGVuCisJCWNoYW5nZV90eXBlPSJjcmVhdGUiCisJZWxzZQorCQlpZiBleHByICIkbmV3cmV2IiA6ICcwKiQnID4vZGV2L251bGwKKwkJdGhlbgorCQkJY2hhbmdlX3R5cGU9ImRlbGV0ZSIKKwkJZWxzZQorCQkJY2hhbmdlX3R5cGU9InVwZGF0ZSIKKwkJZmkKKwlmaQorCisJIyAtLS0gR2V0IHRoZSByZXZpc2lvbiB0eXBlcworCW5ld3Jldl90eXBlPSQoZ2l0IGNhdC1maWxlIC10ICRuZXdyZXYgMj4gL2Rldi9udWxsKQorCW9sZHJldl90eXBlPSQoZ2l0IGNhdC1maWxlIC10ICIkb2xkcmV2IiAyPiAvZGV2L251bGwpCisJY2FzZSAiJGNoYW5nZV90eXBlIiBpbgorCWNyZWF0ZXx1cGRhdGUpCisJCXJldj0iJG5ld3JldiIKKwkJcmV2X3R5cGU9IiRuZXdyZXZfdHlwZSIKKwkJOzsKKwlkZWxldGUpCisJCXJldj0iJG9sZHJldiIKKwkJcmV2X3R5cGU9IiRvbGRyZXZfdHlwZSIKKwkJOzsKKwllc2FjCisKKwkjIFRoZSByZXZpc2lvbiB0eXBlIHRlbGxzIHVzIHdoYXQgdHlwZSB0aGUgY29tbWl0IGlzLCBjb21iaW5lZCB3aXRoCisJIyB0aGUgbG9jYXRpb24gb2YgdGhlIHJlZiB3ZSBjYW4gZGVjaWRlIGJldHdlZW4KKwkjICAtIHdvcmtpbmcgYnJhbmNoCisJIyAgLSB0cmFja2luZyBicmFuY2gKKwkjICAtIHVuYW5ub3RlZCB0YWcKKwkjICAtIGFubm90YXRlZCB0YWcKKwljYXNlICIkcmVmbmFtZSIsIiRyZXZfdHlwZSIgaW4KKwkJcmVmcy90YWdzLyosY29tbWl0KQorCQkJIyB1bi1hbm5vdGF0ZWQgdGFnCisJCQlyZWZuYW1lX3R5cGU9InRhZyIKKwkJCXNob3J0X3JlZm5hbWU9JHtyZWZuYW1lIyNyZWZzL3RhZ3MvfQorCQkJOzsKKwkJcmVmcy90YWdzLyosdGFnKQorCQkJIyBhbm5vdGF0ZWQgdGFnCisJCQlyZWZuYW1lX3R5cGU9ImFubm90YXRlZCB0YWciCisJCQlzaG9ydF9yZWZuYW1lPSR7cmVmbmFtZSMjcmVmcy90YWdzL30KKwkJCSMgY2hhbmdlIHJlY2lwaWVudHMKKwkJCWlmIFsgLW4gIiRhbm5vdW5jZXJlY2lwaWVudHMiIF07IHRoZW4KKwkJCQlyZWNpcGllbnRzPSIkYW5ub3VuY2VyZWNpcGllbnRzIgorCQkJZmkKKwkJCTs7CisJCXJlZnMvaGVhZHMvKixjb21taXQpCisJCQkjIGJyYW5jaAorCQkJcmVmbmFtZV90eXBlPSJicmFuY2giCisJCQlzaG9ydF9yZWZuYW1lPSR7cmVmbmFtZSMjcmVmcy9oZWFkcy99CisJCQk7OworCQlyZWZzL3JlbW90ZXMvKixjb21taXQpCisJCQkjIHRyYWNraW5nIGJyYW5jaAorCQkJcmVmbmFtZV90eXBlPSJ0cmFja2luZyBicmFuY2giCisJCQlzaG9ydF9yZWZuYW1lPSR7cmVmbmFtZSMjcmVmcy9yZW1vdGVzL30KKwkJCWVjaG8gPiYyICIqKiogUHVzaC11cGRhdGUgb2YgdHJhY2tpbmcgYnJhbmNoLCAkcmVmbmFtZSIKKwkJCWVjaG8gPiYyICIqKiogIC0gbm8gZW1haWwgZ2VuZXJhdGVkLiIKKwkJCWV4aXQgMAorCQkJOzsKKwkJKikKKwkJCSMgQW55dGhpbmcgZWxzZSAoaXMgdGhlcmUgYW55dGhpbmcgZWxzZT8pCisJCQllY2hvID4mMiAiKioqIFVua25vd24gdHlwZSBvZiB1cGRhdGUgdG8gJHJlZm5hbWUgKCRyZXZfdHlwZSkiCisJCQllY2hvID4mMiAiKioqICAtIG5vIGVtYWlsIGdlbmVyYXRlZCIKKwkJCWV4aXQgMQorCQkJOzsKKwllc2FjCisKKwkjIENoZWNrIGlmIHdlJ3ZlIGdvdCBhbnlvbmUgdG8gc2VuZCB0bworCWlmIFsgLXogIiRyZWNpcGllbnRzIiBdOyB0aGVuCisJCWNhc2UgIiRyZWZuYW1lX3R5cGUiIGluCisJCQkiYW5ub3RhdGVkIHRhZyIpCisJCQkJY29uZmlnX25hbWU9Imhvb2tzLmFubm91bmNlbGlzdCIKKwkJCQk7OworCQkJKikKKwkJCQljb25maWdfbmFtZT0iaG9va3MubWFpbGluZ2xpc3QiCisJCQkJOzsKKwkJZXNhYworCQllY2hvID4mMiAiKioqICRjb25maWdfbmFtZSBpcyBub3Qgc2V0IHNvIG5vIGVtYWlsIHdpbGwgYmUgc2VudCIKKwkJZWNobyA+JjIgIioqKiBmb3IgJHJlZm5hbWUgdXBkYXRlICRvbGRyZXYtPiRuZXdyZXYiCisJCWV4aXQgMAorCWZpCisKKwkjIEVtYWlsIHBhcmFtZXRlcnMKKwkjIFRoZSBlbWFpbCBzdWJqZWN0IHdpbGwgY29udGFpbiB0aGUgYmVzdCBkZXNjcmlwdGlvbiBvZiB0aGUgcmVmCisJIyB0aGF0IHdlIGNhbiBidWlsZCBmcm9tIHRoZSBwYXJhbWV0ZXJzCisJZGVzY3JpYmU9JChnaXQgZGVzY3JpYmUgJHJldiAyPi9kZXYvbnVsbCkKKwlpZiBbIC16ICIkZGVzY3JpYmUiIF07IHRoZW4KKwkJZGVzY3JpYmU9JHJldgorCWZpCisKKwlnZW5lcmF0ZV9lbWFpbF9oZWFkZXIKKworCSMgQ2FsbCB0aGUgY29ycmVjdCBib2R5IGdlbmVyYXRpb24gZnVuY3Rpb24KKwlmbl9uYW1lPWdlbmVyYWwKKwljYXNlICIkcmVmbmFtZV90eXBlIiBpbgorCSJ0cmFja2luZyBicmFuY2gifGJyYW5jaCkKKwkJZm5fbmFtZT1icmFuY2gKKwkJOzsKKwkiYW5ub3RhdGVkIHRhZyIpCisJCWZuX25hbWU9YXRhZworCQk7OworCWVzYWMKKwlnZW5lcmF0ZV8ke2NoYW5nZV90eXBlfV8ke2ZuX25hbWV9X2VtYWlsCisKKwlnZW5lcmF0ZV9lbWFpbF9mb290ZXIKK30KKworZ2VuZXJhdGVfZW1haWxfaGVhZGVyKCkKK3sKKwkjIC0tLSBFbWFpbCAoYWxsIHN0ZG91dCB3aWxsIGJlIHRoZSBlbWFpbCkKKwkjIEdlbmVyYXRlIGhlYWRlcgorCWNhdCA8PC1FT0YKKwlUbzogJHJlY2lwaWVudHMKKwlTdWJqZWN0OiAke2VtYWlscHJlZml4fSRwcm9qZWN0ZGVzYyAkcmVmbmFtZV90eXBlLCAkc2hvcnRfcmVmbmFtZSwgJHtjaGFuZ2VfdHlwZX1kLiAkZGVzY3JpYmUKKwlYLUdpdC1SZWZuYW1lOiAkcmVmbmFtZQorCVgtR2l0LVJlZnR5cGU6ICRyZWZuYW1lX3R5cGUKKwlYLUdpdC1PbGRyZXY6ICRvbGRyZXYKKwlYLUdpdC1OZXdyZXY6ICRuZXdyZXYKKworCVRoaXMgaXMgYW4gYXV0b21hdGVkIGVtYWlsIGZyb20gdGhlIGdpdCBob29rcy9wb3N0LXJlY2VpdmUgc2NyaXB0LiBJdCB3YXMKKwlnZW5lcmF0ZWQgYmVjYXVzZSBhIHJlZiBjaGFuZ2Ugd2FzIHB1c2hlZCB0byB0aGUgcmVwb3NpdG9yeSBjb250YWluaW5nCisJdGhlIHByb2plY3QgIiRwcm9qZWN0ZGVzYyIuCisKKwlUaGUgJHJlZm5hbWVfdHlwZSwgJHNob3J0X3JlZm5hbWUgaGFzIGJlZW4gJHtjaGFuZ2VfdHlwZX1kCisJRU9GCit9CisKK2dlbmVyYXRlX2VtYWlsX2Zvb3RlcigpCit7CisJY2F0IDw8LUVPRgorCisKKwlob29rcy9wb3N0LXJlY2VpdmUKKwktLQorCSRwcm9qZWN0ZGVzYworCUVPRgorfQorCisjIC0tLS0tLS0tLS0tLS0tLSBCcmFuY2hlcworCisjCisjIENhbGxlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgYnJhbmNoCisjCitnZW5lcmF0ZV9jcmVhdGVfYnJhbmNoX2VtYWlsKCkKK3sKKwkjIFRoaXMgaXMgYSBuZXcgYnJhbmNoIGFuZCBzbyBvbGRyZXYgaXMgbm90IHZhbGlkCisJZWNobyAiICAgICAgICBhdCAgJG5ld3JldiAoJG5ld3Jldl90eXBlKSIKKwllY2hvICIiCisKKwllY2hvICRMT0dCRUdJTgorCSMgVGhpcyBzaG93cyBhbGwgbG9nIGVudHJpZXMgdGhhdCBhcmUgbm90IGFscmVhZHkgY292ZXJlZCBieQorCSMgYW5vdGhlciByZWYgLSBpLmUuIGNvbW1pdHMgdGhhdCBhcmUgbm93IGFjY2Vzc2libGUgZnJvbSB0aGlzCisJIyByZWYgdGhhdCB3ZXJlIHByZXZpb3VzbHkgbm90IGFjY2Vzc2libGUKKwkjIChzZWUgZ2VuZXJhdGVfdXBkYXRlX2JyYW5jaF9lbWFpbCBmb3IgdGhlIGV4cGxhbmF0aW9uIG9mIHRoaXMKKwkjIGNvbW1hbmQpCisJZ2l0IHJldi1wYXJzZSAtLW5vdCAtLWJyYW5jaGVzIHwgZ3JlcCAtdiAkKGdpdCByZXYtcGFyc2UgJHJlZm5hbWUpIHwKKwlnaXQgcmV2LWxpc3QgLS1wcmV0dHkgLS1zdGRpbiAkbmV3cmV2CisJZWNobyAkTE9HRU5ECit9CisKKyMKKyMgQ2FsbGVkIGZvciB0aGUgY2hhbmdlIG9mIGEgcHJlLWV4aXN0aW5nIGJyYW5jaAorIworZ2VuZXJhdGVfdXBkYXRlX2JyYW5jaF9lbWFpbCgpCit7CisJIyBDb25zaWRlciB0aGlzOgorCSMgICAxIC0tLSAyIC0tLSBPIC0tLSBYIC0tLSAzIC0tLSA0IC0tLSBOCisJIworCSMgTyBpcyAkb2xkcmV2IGZvciAkcmVmbmFtZQorCSMgTiBpcyAkbmV3cmV2IGZvciAkcmVmbmFtZQorCSMgWCBpcyBhIHJldmlzaW9uIHBvaW50ZWQgdG8gYnkgc29tZSBvdGhlciByZWYsIGZvciB3aGljaCB3ZSBtYXkKKwkjICAgYXNzdW1lIHRoYXQgYW4gZW1haWwgaGFzIGFscmVhZHkgYmVlbiBnZW5lcmF0ZWQuCisJIyBJbiB0aGlzIGNhc2Ugd2Ugd2FudCB0byBpc3N1ZSBhbiBlbWFpbCBjb250YWluaW5nIG9ubHkgcmV2aXNpb25zCisJIyAzLCA0LCBhbmQgTi4gIEdpdmVuIChhbG1vc3QpIGJ5CisJIworCSMgIGdpdCByZXYtbGlzdCBOIF5PIC0tbm90IC0tYWxsCisJIworCSMgVGhlIHJlYXNvbiBmb3IgdGhlICJhbG1vc3QiLCBpcyB0aGF0IHRoZSAiLS1ub3QgLS1hbGwiIHdpbGwgdGFrZQorCSMgcHJlY2VkZW5jZSBvdmVyIHRoZSAiTiIsIGFuZCBlZmZlY3RpdmVseSB3aWxsIHRyYW5zbGF0ZSB0bworCSMKKwkjICBnaXQgcmV2LWxpc3QgTiBeTyBeWCBeTgorCSMKKwkjIFNvLCB3ZSBuZWVkIHRvIGJ1aWxkIHVwIHRoZSBsaXN0IG1vcmUgY2FyZWZ1bGx5LiAgZ2l0IHJldi1wYXJzZQorCSMgd2lsbCBnZW5lcmF0ZSBhIGxpc3Qgb2YgcmV2cyB0aGF0IG1heSBiZSBmZWQgaW50byBnaXQgcmV2LWxpc3QuCisJIyBXZSBjYW4gZ2V0IGl0IHRvIG1ha2UgdGhlICItLW5vdCAtLWFsbCIgcGFydCBhbmQgdGhlbiBmaWx0ZXIgb3V0CisJIyB0aGUgIl5OIiB3aXRoOgorCSMKKwkjICBnaXQgcmV2LXBhcnNlIC0tbm90IC0tYWxsIHwgZ3JlcCAtdiBOCisJIworCSMgVGhlbiwgdXNpbmcgdGhlIC0tc3RkaW4gc3dpdGNoIHRvIGdpdCByZXYtbGlzdCB3ZSBoYXZlIGVmZmVjdGl2ZWx5CisJIyBtYW51ZmFjdHVyZWQKKwkjCisJIyAgZ2l0IHJldi1saXN0IE4gXk8gXlgKKwkjCisJIyBUaGlzIGxlYXZlcyBhIHByb2JsZW0gd2hlbiBzb21lb25lIGVsc2UgdXBkYXRlcyB0aGUgcmVwb3NpdG9yeQorCSMgd2hpbGUgdGhpcyBzY3JpcHQgaXMgcnVubmluZy4gIFRoZWlyIG5ldyB2YWx1ZSBvZiB0aGUgcmVmIHdlJ3JlCisJIyB3b3JraW5nIG9uIHdvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSAiLS1ub3QgLS1hbGwiIG91dHB1dDsgYW5kIGFzCisJIyBvdXIgJG5ld3JldiB3b3VsZCBiZSBhbiBhbmNlc3RvciBvZiB0aGF0IGNvbW1pdCwgaXQgd291bGQgZXhjbHVkZQorCSMgYWxsIG9mIG91ciBjb21taXRzLiAgV2hhdCB3ZSByZWFsbHkgd2FudCBpcyB0byBleGNsdWRlIHRoZSBjdXJyZW50CisJIyB2YWx1ZSBvZiAkcmVmbmFtZSBmcm9tIHRoZSAtLW5vdCBsaXN0LCByYXRoZXIgdGhhbiBOIGl0c2VsZi4gIFNvOgorCSMKKwkjICBnaXQgcmV2LXBhcnNlIC0tbm90IC0tYWxsIHwgZ3JlcCAtdiAkKGdpdCByZXYtcGFyc2UgJHJlZm5hbWUpCisJIworCSMgR2V0J3MgdXMgdG8gc29tZXRoaW5nIHByZXR0eSBzYWZlIChhcGFydCBmcm9tIHRoZSBzbWFsbCB0aW1lCisJIyBiZXR3ZWVuIHJlZm5hbWUgYmVpbmcgcmVhZCwgYW5kIGdpdCByZXYtcGFyc2UgcnVubmluZyAtIGZvciB0aGF0LAorCSMgSSBnaXZlIHVwKQorCSMKKwkjCisJIyBOZXh0IHByb2JsZW0sIGNvbnNpZGVyIHRoaXM6CisJIyAgICogLS0tIEIgLS0tICogLS0tIE8gKCRvbGRyZXYpCisJIyAgICAgICAgICBcCisJIyAgICAgICAgICAgKiAtLS0gWCAtLS0gKiAtLS0gTiAoJG5ld3JldikKKwkjCisJIyBUaGF0IGlzIHRvIHNheSwgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgb2xkcmV2IGlzIGEgc3RyaWN0CisJIyBzdWJzZXQgb2YgbmV3cmV2IChpdCB3b3VsZCBoYXZlIHJlcXVpcmVkIGEgLS1mb3JjZSwgYnV0IHRoYXQncworCSMgYWxsb3dlZCkuICBTbywgd2UgY2FuJ3Qgc2ltcGx5IHNheSByZXYtbGlzdCAkb2xkcmV2Li4kbmV3cmV2LgorCSMgSW5zdGVhZCB3ZSBmaW5kIHRoZSBjb21tb24gYmFzZSBvZiB0aGUgdHdvIHJldnMgYW5kIGxpc3QgZnJvbQorCSMgdGhlcmUuCisJIworCSMgQXMgYWJvdmUsIHdlIG5lZWQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIHByZXNlbmNlIG9mIFg7IGlmCisJIyBhbm90aGVyIGJyYW5jaCBpcyBhbHJlYWR5IGluIHRoZSByZXBvc2l0b3J5IGFuZCBwb2ludHMgYXQgc29tZSBvZgorCSMgdGhlIHJldmlzaW9ucyB0aGF0IHdlIGFyZSBhYm91dCB0byBvdXRwdXQgLSB3ZSBkb24ndCB3YW50IHRoZW0uCisJIyBUaGUgc29sdXRpb24gaXMgYXMgYmVmb3JlOiBnaXQgcmV2LXBhcnNlIG91dHB1dCBmaWx0ZXJlZC4KKwkjCisJIyBGaW5hbGx5LCB0YWdzOiAxIC0tLSAyIC0tLSBPIC0tLSBUIC0tLSAzIC0tLSA0IC0tLSBOCisJIworCSMgVGFncyBwdXNoZWQgaW50byB0aGUgcmVwb3NpdG9yeSBnZW5lcmF0ZSBuaWNlIHNob3J0bG9nIGVtYWlscyB0aGF0CisJIyBzdW1tYXJpc2UgdGhlIGNvbW1pdHMgYmV0d2VlbiB0aGVtIGFuZCB0aGUgcHJldmlvdXMgdGFnLiAgSG93ZXZlciwKKwkjIHRob3NlIGVtYWlscyBkb24ndCBpbmNsdWRlIHRoZSBmdWxsIGNvbW1pdCBtZXNzYWdlcyB0aGF0IHdlIG91dHB1dAorCSMgZm9yIGEgYnJhbmNoIHVwZGF0ZS4gIFRoZXJlZm9yZSB3ZSBzdGlsbCB3YW50IHRvIG91dHB1dCByZXZpc2lvbnMKKwkjIHRoYXQgaGF2ZSBiZWVuIG91dHB1dCBvbiBhIHRhZyBlbWFpbC4KKwkjCisJIyBMdWNraWx5LCBnaXQgcmV2LXBhcnNlIGluY2x1ZGVzIGp1c3QgdGhlIHRvb2wuICBJbnN0ZWFkIG9mIHVzaW5nCisJIyAiLS1hbGwiIHdlIHVzZSAiLS1icmFuY2hlcyI7IHRoaXMgaGFzIHRoZSBhZGRlZCBiZW5lZml0IHRoYXQKKwkjICJyZW1vdGVzLyIgd2lsbCBiZSBpZ25vcmVkIGFzIHdlbGwuCisKKwkjIExpc3QgYWxsIG9mIHRoZSByZXZpc2lvbnMgdGhhdCB3ZXJlIHJlbW92ZWQgYnkgdGhpcyB1cGRhdGUsIGluIGEKKwkjIGZhc3QgZm9yd2FyZCB1cGRhdGUsIHRoaXMgbGlzdCB3aWxsIGJlIGVtcHR5LCBiZWNhdXNlIHJldi1saXN0IE8KKwkjIF5OIGlzIGVtcHR5LiAgRm9yIGEgbm9uIGZhc3QgZm9yd2FyZCwgTyBeTiBpcyB0aGUgbGlzdCBvZiByZW1vdmVkCisJIyByZXZpc2lvbnMKKwlmYXN0X2ZvcndhcmQ9IiIKKwlyZXY9IiIKKwlmb3IgcmV2IGluICQoZ2l0IHJldi1saXN0ICRuZXdyZXYuLiRvbGRyZXYpCisJZG8KKwkJcmV2dHlwZT0kKGdpdCBjYXQtZmlsZSAtdCAiJHJldiIpCisJCWVjaG8gIiAgZGlzY2FyZHMgICRyZXYgKCRyZXZ0eXBlKSIKKwlkb25lCisJaWYgWyAteiAiJHJldiIgXTsgdGhlbgorCQlmYXN0X2ZvcndhcmQ9MQorCWZpCisKKwkjIExpc3QgYWxsIHRoZSByZXZpc2lvbnMgZnJvbSBiYXNlcmV2IHRvIG5ld3JldiBpbiBhIGtpbmQgb2YKKwkjICJ0YWJsZS1vZi1jb250ZW50cyI7IG5vdGUgdGhpcyBsaXN0IGNhbiBpbmNsdWRlIHJldmlzaW9ucyB0aGF0CisJIyBoYXZlIGFscmVhZHkgaGFkIG5vdGlmaWNhdGlvbiBlbWFpbHMgYW5kIGlzIHByZXNlbnQgdG8gc2hvdyB0aGUKKwkjIGZ1bGwgZGV0YWlsIG9mIHRoZSBjaGFuZ2UgZnJvbSByb2xsaW5nIGJhY2sgdGhlIG9sZCByZXZpc2lvbiB0bworCSMgdGhlIGJhc2UgcmV2aXNpb24gYW5kIHRoZW4gZm9yd2FyZCB0byB0aGUgbmV3IHJldmlzaW9uCisJZm9yIHJldiBpbiAkKGdpdCByZXYtbGlzdCAkb2xkcmV2Li4kbmV3cmV2KQorCWRvCisJCXJldnR5cGU9JChnaXQgY2F0LWZpbGUgLXQgIiRyZXYiKQorCQllY2hvICIgICAgICAgdmlhICAkcmV2ICgkcmV2dHlwZSkiCisJZG9uZQorCisJaWYgWyAiJGZhc3RfZm9yd2FyZCIgXTsgdGhlbgorCQllY2hvICIgICAgICBmcm9tICAkb2xkcmV2ICgkb2xkcmV2X3R5cGUpIgorCWVsc2UKKwkJIyAgMS4gRXhpc3RpbmcgcmV2aXNpb25zIHdlcmUgcmVtb3ZlZC4gIEluIHRoaXMgY2FzZSBuZXdyZXYKKwkJIyAgICAgaXMgYSBzdWJzZXQgb2Ygb2xkcmV2IC0gdGhpcyBpcyB0aGUgcmV2ZXJzZSBvZiBhCisJCSMgICAgIGZhc3QtZm9yd2FyZCwgYSByZXdpbmQKKwkJIyAgMi4gTmV3IHJldmlzaW9ucyB3ZXJlIGFkZGVkIG9uIHRvcCBvZiBhbiBvbGQgcmV2aXNpb24sCisJCSMgICAgIHRoaXMgaXMgYSByZXdpbmQgYW5kIGFkZGl0aW9uLgorCisJCSMgKDEpIGNlcnRhaW5seSBoYXBwZW5lZCwgKDIpIHBvc3NpYmx5LiAgV2hlbiAoMikgaGFzbid0CisJCSMgaGFwcGVuZWQsIHdlIHNldCBhIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCBubyBsb2cgcHJpbnRvdXQKKwkJIyBpcyByZXF1aXJlZC4KKworCQllY2hvICIiCisKKwkJIyBGaW5kIHRoZSBjb21tb24gYW5jZXN0b3Igb2YgdGhlIG9sZCBhbmQgbmV3IHJldmlzaW9ucyBhbmQKKwkJIyBjb21wYXJlIGl0IHdpdGggbmV3cmV2CisJCWJhc2VyZXY9JChnaXQgbWVyZ2UtYmFzZSAkb2xkcmV2ICRuZXdyZXYpCisJCXJld2luZF9vbmx5PSIiCisJCWlmIFsgIiRiYXNlcmV2IiA9ICIkbmV3cmV2IiBdOyB0aGVuCisJCQllY2hvICJUaGlzIHVwZGF0ZSBkaXNjYXJkZWQgZXhpc3RpbmcgcmV2aXNpb25zIGFuZCBsZWZ0IHRoZSBicmFuY2ggcG9pbnRpbmcgYXQiCisJCQllY2hvICJhIHByZXZpb3VzIHBvaW50IGluIHRoZSByZXBvc2l0b3J5IGhpc3RvcnkuIgorCQkJZWNobyAiIgorCQkJZWNobyAiICogLS0gKiAtLSBOICgkbmV3cmV2KSIKKwkJCWVjaG8gIiAgICAgICAgICAgIFxcIgorCQkJZWNobyAiICAgICAgICAgICAgIE8gLS0gTyAtLSBPICgkb2xkcmV2KSIKKwkJCWVjaG8gIiIKKwkJCWVjaG8gIlRoZSByZW1vdmVkIHJldmlzaW9ucyBhcmUgbm90IG5lY2Vzc2FyaWxseSBnb25lIC0gaWYgYW5vdGhlciByZWZlcmVuY2UiCisJCQllY2hvICJzdGlsbCByZWZlcnMgdG8gdGhlbSB0aGV5IHdpbGwgc3RheSBpbiB0aGUgcmVwb3NpdG9yeS4iCisJCQlyZXdpbmRfb25seT0xCisJCWVsc2UKKwkJCWVjaG8gIlRoaXMgdXBkYXRlIGFkZGVkIG5ldyByZXZpc2lvbnMgYWZ0ZXIgdW5kb2luZyBleGlzdGluZyByZXZpc2lvbnMuICBUaGF0IGlzIgorCQkJZWNobyAidG8gc2F5LCB0aGUgb2xkIHJldmlzaW9uIGlzIG5vdCBhIHN0cmljdCBzdWJzZXQgb2YgdGhlIG5ldyByZXZpc2lvbi4gIFRoaXMiCisJCQllY2hvICJzaXR1YXRpb24gb2NjdXJzIHdoZW4geW91IC0tZm9yY2UgcHVzaCBhIGNoYW5nZSBhbmQgZ2VuZXJhdGUgYSByZXBvc2l0b3J5IgorCQkJZWNobyAiY29udGFpbmluZyBzb21ldGhpbmcgbGlrZSB0aGlzOiIKKwkJCWVjaG8gIiIKKwkJCWVjaG8gIiAqIC0tICogLS0gQiAtLSBPIC0tIE8gLS0gTyAoJG9sZHJldikiCisJCQllY2hvICIgICAgICAgICAgICBcXCIKKwkJCWVjaG8gIiAgICAgICAgICAgICBOIC0tIE4gLS0gTiAoJG5ld3JldikiCisJCQllY2hvICIiCisJCQllY2hvICJXaGVuIHRoaXMgaGFwcGVucyB3ZSBhc3N1bWUgdGhhdCB5b3UndmUgYWxyZWFkeSBoYWQgYWxlcnQgZW1haWxzIGZvciBhbGwiCisJCQllY2hvICJvZiB0aGUgTyByZXZpc2lvbnMsIGFuZCBzbyB3ZSBoZXJlIHJlcG9ydCBvbmx5IHRoZSByZXZpc2lvbnMgaW4gdGhlIE4iCisJCQllY2hvICJicmFuY2ggZnJvbSB0aGUgY29tbW9uIGJhc2UsIEIuIgorCQlmaQorCWZpCisKKwllY2hvICIiCisJaWYgWyAteiAiJHJld2luZF9vbmx5IiBdOyB0aGVuCisJCWVjaG8gIlRob3NlIHJldmlzaW9ucyBsaXN0ZWQgYWJvdmUgdGhhdCBhcmUgbmV3IHRvIHRoaXMgcmVwb3NpdG9yeSBoYXZlIgorCQllY2hvICJub3QgYXBwZWFyZWQgb24gYW55IG90aGVyIG5vdGlmaWNhdGlvbiBlbWFpbDsgc28gd2UgbGlzdCB0aG9zZSIKKwkJZWNobyAicmV2aXNpb25zIGluIGZ1bGwsIGJlbG93LiIKKworCQllY2hvICIiCisJCWVjaG8gJExPR0JFR0lOCisJCWdpdCByZXYtcGFyc2UgLS1ub3QgLS1icmFuY2hlcyB8IGdyZXAgLXYgJChnaXQgcmV2LXBhcnNlICRyZWZuYW1lKSB8CisJCWdpdCByZXYtbGlzdCAtLXByZXR0eSAtLXN0ZGluICRvbGRyZXYuLiRuZXdyZXYKKworCQkjIFhYWDogTmVlZCBhIHdheSBvZiBkZXRlY3Rpbmcgd2hldGhlciBnaXQgcmV2LWxpc3QgYWN0dWFsbHkKKwkJIyBvdXRwdXR0ZWQgYW55dGhpbmcsIHNvIHRoYXQgd2UgY2FuIGlzc3VlIGEgIm5vIG5ldworCQkjIHJldmlzaW9ucyBhZGRlZCBieSB0aGlzIHVwZGF0ZSIgbWVzc2FnZQorCisJCWVjaG8gJExPR0VORAorCWVsc2UKKwkJZWNobyAiTm8gbmV3IHJldmlzaW9ucyB3ZXJlIGFkZGVkIGJ5IHRoaXMgdXBkYXRlLiIKKwlmaQorCisJIyBUaGUgZGlmZnN0YXQgaXMgc2hvd24gZnJvbSB0aGUgb2xkIHJldmlzaW9uIHRvIHRoZSBuZXcgcmV2aXNpb24uCisJIyBUaGlzIGlzIHRvIHNob3cgdGhlIHRydXRoIG9mIHdoYXQgaGFwcGVuZWQgaW4gdGhpcyBjaGFuZ2UuCisJIyBUaGVyZSdzIG5vIHBvaW50IHNob3dpbmcgdGhlIHN0YXQgZnJvbSB0aGUgYmFzZSB0byB0aGUgbmV3CisJIyByZXZpc2lvbiBiZWNhdXNlIHRoZSBiYXNlIGlzIGVmZmVjdGl2ZWx5IGEgcmFuZG9tIHJldmlzaW9uIGF0IHRoaXMKKwkjIHBvaW50IC0gdGhlIHVzZXIgd2lsbCBiZSBpbnRlcmVzdGVkIGluIHdoYXQgdGhpcyByZXZpc2lvbiBjaGFuZ2VkCisJIyAtIGluY2x1ZGluZyB0aGUgdW5kb2luZyBvZiBwcmV2aW91cyByZXZpc2lvbnMgaW4gdGhlIGNhc2Ugb2YKKwkjIG5vbi1mYXN0IGZvcndhcmQgdXBkYXRlcy4KKwllY2hvICIiCisJZWNobyAiU3VtbWFyeSBvZiBjaGFuZ2VzOiIKKwlnaXQgZGlmZi10cmVlIC0tc3RhdCAtLXN1bW1hcnkgLS1maW5kLWNvcGllcy1oYXJkZXIgJG9sZHJldi4uJG5ld3JldgorfQorCisjCisjIENhbGxlZCBmb3IgdGhlIGRlbGV0aW9uIG9mIGEgYnJhbmNoCisjCitnZW5lcmF0ZV9kZWxldGVfYnJhbmNoX2VtYWlsKCkKK3sKKwllY2hvICIgICAgICAgd2FzICAkb2xkcmV2IgorCWVjaG8gIiIKKwllY2hvICRMT0dFTkQKKwlnaXQgc2hvdyAtcyAtLXByZXR0eT1vbmVsaW5lICRvbGRyZXYKKwllY2hvICRMT0dFTkQKK30KKworIyAtLS0tLS0tLS0tLS0tLS0gQW5ub3RhdGVkIHRhZ3MKKworIworIyBDYWxsZWQgZm9yIHRoZSBjcmVhdGlvbiBvZiBhbiBhbm5vdGF0ZWQgdGFnCisjCitnZW5lcmF0ZV9jcmVhdGVfYXRhZ19lbWFpbCgpCit7CisJZWNobyAiICAgICAgICBhdCAgJG5ld3JldiAoJG5ld3Jldl90eXBlKSIKKworCWdlbmVyYXRlX2F0YWdfZW1haWwKK30KKworIworIyBDYWxsZWQgZm9yIHRoZSB1cGRhdGUgb2YgYW4gYW5ub3RhdGVkIHRhZyAodGhpcyBpcyBwcm9iYWJseSBhIHJhcmUgZXZlbnQKKyMgYW5kIG1heSBub3QgZXZlbiBiZSBhbGxvd2VkKQorIworZ2VuZXJhdGVfdXBkYXRlX2F0YWdfZW1haWwoKQoreworCWVjaG8gIiAgICAgICAgdG8gICRuZXdyZXYgKCRuZXdyZXZfdHlwZSkiCisJZWNobyAiICAgICAgZnJvbSAgJG9sZHJldiAod2hpY2ggaXMgbm93IG9ic29sZXRlKSIKKworCWdlbmVyYXRlX2F0YWdfZW1haWwKK30KKworIworIyBDYWxsZWQgd2hlbiBhbiBhbm5vdGF0ZWQgdGFnIGlzIGNyZWF0ZWQgb3IgY2hhbmdlZAorIworZ2VuZXJhdGVfYXRhZ19lbWFpbCgpCit7CisJIyBVc2UgZ2l0IGZvci1lYWNoLXJlZiB0byBwdWxsIG91dCB0aGUgaW5kaXZpZHVhbCBmaWVsZHMgZnJvbSB0aGUKKwkjIHRhZworCWV2YWwgJChnaXQgZm9yLWVhY2gtcmVmIC0tc2hlbGwgLS1mb3JtYXQ9JworCXRhZ29iamVjdD0lKCpvYmplY3RuYW1lKQorCXRhZ3R5cGU9JSgqb2JqZWN0dHlwZSkKKwl0YWdnZXI9JSh0YWdnZXJuYW1lKQorCXRhZ2dlZD0lKHRhZ2dlcmRhdGUpJyAkcmVmbmFtZQorCSkKKworCWVjaG8gIiAgIHRhZ2dpbmcgICR0YWdvYmplY3QgKCR0YWd0eXBlKSIKKwljYXNlICIkdGFndHlwZSIgaW4KKwljb21taXQpCisKKwkJIyBJZiB0aGUgdGFnZ2VkIG9iamVjdCBpcyBhIGNvbW1pdCwgdGhlbiB3ZSBhc3N1bWUgdGhpcyBpcyBhCisJCSMgcmVsZWFzZSwgYW5kIHNvIHdlIGNhbGN1bGF0ZSB3aGljaCB0YWcgdGhpcyB0YWcgaXMKKwkJIyByZXBsYWNpbmcKKwkJcHJldnRhZz0kKGdpdCBkZXNjcmliZSAtLWFiYnJldj0wICRuZXdyZXZeIDI+L2Rldi9udWxsKQorCisJCWlmIFsgLW4gIiRwcmV2dGFnIiBdOyB0aGVuCisJCQllY2hvICIgIHJlcGxhY2VzICAkcHJldnRhZyIKKwkJZmkKKwkJOzsKKwkqKQorCQllY2hvICIgICAgbGVuZ3RoICAkKGdpdCBjYXQtZmlsZSAtcyAkdGFnb2JqZWN0KSBieXRlcyIKKwkJOzsKKwllc2FjCisJZWNobyAiIHRhZ2dlZCBieSAgJHRhZ2dlciIKKwllY2hvICIgICAgICAgIG9uICAkdGFnZ2VkIgorCisJZWNobyAiIgorCWVjaG8gJExPR0JFR0lOCisKKwkjIFNob3cgdGhlIGNvbnRlbnQgb2YgdGhlIHRhZyBtZXNzYWdlOyB0aGlzIG1pZ2h0IGNvbnRhaW4gYSBjaGFuZ2UKKwkjIGxvZyBvciByZWxlYXNlIG5vdGVzIHNvIGlzIHdvcnRoIGRpc3BsYXlpbmcuCisJZ2l0IGNhdC1maWxlIHRhZyAkbmV3cmV2IHwgc2VkIC1lICcxLC9eJC9kJworCisJZWNobyAiIgorCWNhc2UgIiR0YWd0eXBlIiBpbgorCWNvbW1pdCkKKwkJIyBPbmx5IGNvbW1pdCB0YWdzIG1ha2Ugc2Vuc2UgdG8gaGF2ZSByZXYtbGlzdCBvcGVyYXRpb25zCisJCSMgcGVyZm9ybWVkIG9uIHRoZW0KKwkJaWYgWyAtbiAiJHByZXZ0YWciIF07IHRoZW4KKwkJCSMgU2hvdyBjaGFuZ2VzIHNpbmNlIHRoZSBwcmV2aW91cyByZWxlYXNlCisJCQlnaXQgcmV2LWxpc3QgLS1wcmV0dHk9c2hvcnQgIiRwcmV2dGFnLi4kbmV3cmV2IiB8IGdpdCBzaG9ydGxvZworCQllbHNlCisJCQkjIE5vIHByZXZpb3VzIHRhZywgc2hvdyBhbGwgdGhlIGNoYW5nZXMgc2luY2UgdGltZQorCQkJIyBiZWdhbgorCQkJZ2l0IHJldi1saXN0IC0tcHJldHR5PXNob3J0ICRuZXdyZXYgfCBnaXQgc2hvcnRsb2cKKwkJZmkKKwkJOzsKKwkqKQorCQkjIFhYWDogSXMgdGhlcmUgYW55dGhpbmcgdXNlZnVsIHdlIGNhbiBkbyBmb3Igbm9uLWNvbW1pdAorCQkjIG9iamVjdHM/CisJCTs7CisJZXNhYworCisJZWNobyAkTE9HRU5ECit9CisKKyMKKyMgQ2FsbGVkIGZvciB0aGUgZGVsZXRpb24gb2YgYW4gYW5ub3RhdGVkIHRhZworIworZ2VuZXJhdGVfZGVsZXRlX2F0YWdfZW1haWwoKQoreworCWVjaG8gIiAgICAgICB3YXMgICRvbGRyZXYiCisJZWNobyAiIgorCWVjaG8gJExPR0VORAorCWdpdCBzaG93IC1zIC0tcHJldHR5PW9uZWxpbmUgJG9sZHJldgorCWVjaG8gJExPR0VORAorfQorCisjIC0tLS0tLS0tLS0tLS0tLSBHZW5lcmFsIHJlZmVyZW5jZXMKKworIworIyBDYWxsZWQgd2hlbiBhbnkgb3RoZXIgdHlwZSBvZiByZWZlcmVuY2UgaXMgY3JlYXRlZCAobW9zdCBsaWtlbHkgYQorIyBub24tYW5ub3RhdGVkIHRhZykKKyMKK2dlbmVyYXRlX2NyZWF0ZV9nZW5lcmFsX2VtYWlsKCkKK3sKKwllY2hvICIgICAgICAgIGF0ICAkbmV3cmV2ICgkbmV3cmV2X3R5cGUpIgorCisJZ2VuZXJhdGVfZ2VuZXJhbF9lbWFpbAorfQorCisjCisjIENhbGxlZCB3aGVuIGFueSBvdGhlciB0eXBlIG9mIHJlZmVyZW5jZSBpcyB1cGRhdGVkIChtb3N0IGxpa2VseSBhCisjIG5vbi1hbm5vdGF0ZWQgdGFnKQorIworZ2VuZXJhdGVfdXBkYXRlX2dlbmVyYWxfZW1haWwoKQoreworCWVjaG8gIiAgICAgICAgdG8gICRuZXdyZXYgKCRuZXdyZXZfdHlwZSkiCisJZWNobyAiICAgICAgZnJvbSAgJG9sZHJldiIKKworCWdlbmVyYXRlX2dlbmVyYWxfZW1haWwKK30KKworIworIyBDYWxsZWQgZm9yIGNyZWF0aW9uIG9yIHVwZGF0ZSBvZiBhbnkgb3RoZXIgdHlwZSBvZiByZWZlcmVuY2UKKyMKK2dlbmVyYXRlX2dlbmVyYWxfZW1haWwoKQoreworCSMgVW5hbm5vdGF0ZWQgdGFncyBhcmUgbW9yZSBhYm91dCBtYXJraW5nIGEgcG9pbnQgdGhhbiByZWxlYXNpbmcgYQorCSMgdmVyc2lvbjsgdGhlcmVmb3JlIHdlIGRvbid0IGRvIHRoZSBzaG9ydGxvZyBzdW1tYXJ5IHRoYXQgd2UgZG8gZm9yCisJIyBhbm5vdGF0ZWQgdGFncyBhYm92ZSAtIHdlIHNpbXBseSBzaG93IHRoYXQgdGhlIHBvaW50IGhhcyBiZWVuCisJIyBtYXJrZWQsIGFuZCBwcmludCB0aGUgbG9nIG1lc3NhZ2UgZm9yIHRoZSBtYXJrZWQgcG9pbnQgZm9yCisJIyByZWZlcmVuY2UgcHVycG9zZXMKKwkjCisJIyBOb3RlIHRoaXMgc2VjdGlvbiBhbHNvIGNhdGNoZXMgYW55IG90aGVyIHJlZmVyZW5jZSB0eXBlIChhbHRob3VnaAorCSMgdGhlcmUgYXJlbid0IGFueSkgYW5kIGRlYWxzIHdpdGggdGhlbSBpbiB0aGUgc2FtZSB3YXkuCisKKwllY2hvICIiCisJaWYgWyAiJG5ld3Jldl90eXBlIiA9ICJjb21taXQiIF07IHRoZW4KKwkJZWNobyAkTE9HQkVHSU4KKwkJZ2l0IHNob3cgLS1uby1jb2xvciAtLXJvb3QgLXMgLS1wcmV0dHk9bWVkaXVtICRuZXdyZXYKKwkJZWNobyAkTE9HRU5ECisJZWxzZQorCQkjIFdoYXQgY2FuIHdlIGRvIGhlcmU/ICBUaGUgdGFnIG1hcmtzIGFuIG9iamVjdCB0aGF0IGlzIG5vdAorCQkjIGEgY29tbWl0LCBzbyB0aGVyZSBpcyBubyBsb2cgZm9yIHVzIHRvIGRpc3BsYXkuICBJdCdzCisJCSMgcHJvYmFibHkgbm90IHdpc2UgdG8gb3V0cHV0IGdpdCBjYXQtZmlsZSBhcyBpdCBjb3VsZCBiZSBhCisJCSMgYmluYXJ5IGJsb2IuICBXZSdsbCBqdXN0IHNheSBob3cgYmlnIGl0IGlzCisJCWVjaG8gIiRuZXdyZXYgaXMgYSAkbmV3cmV2X3R5cGUsIGFuZCBpcyAkKGdpdCBjYXQtZmlsZSAtcyAkbmV3cmV2KSBieXRlcyBsb25nLiIKKwlmaQorfQorCisjCisjIENhbGxlZCBmb3IgdGhlIGRlbGV0aW9uIG9mIGFueSBvdGhlciB0eXBlIG9mIHJlZmVyZW5jZQorIworZ2VuZXJhdGVfZGVsZXRlX2dlbmVyYWxfZW1haWwoKQoreworCWVjaG8gIiAgICAgICB3YXMgICRvbGRyZXYiCisJZWNobyAiIgorCWVjaG8gJExPR0VORAorCWdpdCBzaG93IC1zIC0tcHJldHR5PW9uZWxpbmUgJG9sZHJldgorCWVjaG8gJExPR0VORAorfQorCitzZW5kX21haWwoKQoreworCWlmIFsgLW4gIiRlbnZlbG9wZXNlbmRlciIgXTsgdGhlbgorCQkvdXNyL3NiaW4vc2VuZG1haWwgLXQgLWYgIiRlbnZlbG9wZXNlbmRlciIKKwllbHNlCisJCS91c3Ivc2Jpbi9zZW5kbWFpbCAtdAorCWZpCit9CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtYWluKCkKKworIyAtLS0gQ29uc3RhbnRzCitMT0dCRUdJTj0iLSBMb2cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCitMT0dFTkQ9Ii0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCisjIC0tLSBDb25maWcKKyMgU2V0IEdJVF9ESVIgZWl0aGVyIGZyb20gdGhlIHdvcmtpbmcgZGlyZWN0b3J5LCBvciBmcm9tIHRoZSBlbnZpcm9ubWVudAorIyB2YXJpYWJsZS4KK0dJVF9ESVI9JChnaXQgcmV2LXBhcnNlIC0tZ2l0LWRpciAyPi9kZXYvbnVsbCkKK2lmIFsgLXogIiRHSVRfRElSIiBdOyB0aGVuCisJZWNobyA+JjIgImZhdGFsOiBwb3N0LXJlY2VpdmU6IEdJVF9ESVIgbm90IHNldCIKKwlleGl0IDEKK2ZpCisKK3Byb2plY3RkZXNjPSQoc2VkIC1uZSAnMXAnICIkR0lUX0RJUi9kZXNjcmlwdGlvbiIpCisjIENoZWNrIGlmIHRoZSBkZXNjcmlwdGlvbiBpcyB1bmNoYW5nZWQgZnJvbSBpdCdzIGRlZmF1bHQsIGFuZCBzaG9ydGVuIGl0IHRvCisjIGEgbW9yZSBtYW5hZ2VhYmxlIGxlbmd0aCBpZiBpdCBpcworaWYgZXhwciAiJHByb2plY3RkZXNjIiA6ICJVbm5hbWVkIHJlcG9zaXRvcnkuKiQiID4vZGV2L251bGwKK3RoZW4KKwlwcm9qZWN0ZGVzYz0iVU5OQU1FRCBQUk9KRUNUIgorZmkKKworcmVjaXBpZW50cz0kKGdpdCBjb25maWcgaG9va3MubWFpbGluZ2xpc3QpCithbm5vdW5jZXJlY2lwaWVudHM9JChnaXQgY29uZmlnIGhvb2tzLmFubm91bmNlbGlzdCkKK2VudmVsb3Blc2VuZGVyPSQoZ2l0IGNvbmZpZyBob29rcy5lbnZlbG9wZXNlbmRlcikKK2VtYWlscHJlZml4PSQoZ2l0IGNvbmZpZyBob29rcy5lbWFpbHByZWZpeCB8fCBlY2hvICdbU0NNXSAnKQorCisjIC0tLSBNYWluIGxvb3AKKyMgQWxsb3cgZHVhbCBtb2RlOiBydW4gZnJvbSB0aGUgY29tbWFuZCBsaW5lIGp1c3QgbGlrZSB0aGUgdXBkYXRlIGhvb2ssIG9yCisjIGlmIG5vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4gdGhlbiBydW4gYXMgYSBob29rIHNjcmlwdAoraWYgWyAtbiAiJDEiIC1hIC1uICIkMiIgLWEgLW4gIiQzIiBdOyB0aGVuCisJIyBPdXRwdXQgdG8gdGhlIHRlcm1pbmFsIGluIGNvbW1hbmQgbGluZSBtb2RlIC0gaWYgc29tZW9uZSB3YW50ZWQgdG8KKwkjIHJlc2VuZCBhbiBlbWFpbDsgdGhleSBjb3VsZCByZWRpcmVjdCB0aGUgb3V0cHV0IHRvIHNlbmRtYWlsCisJIyB0aGVtc2VsdmVzCisJUEFHRVI9IGdlbmVyYXRlX2VtYWlsICQyICQzICQxCitlbHNlCisJd2hpbGUgcmVhZCBvbGRyZXYgbmV3cmV2IHJlZm5hbWUKKwlkbworCQlnZW5lcmF0ZV9lbWFpbCAkb2xkcmV2ICRuZXdyZXYgJHJlZm5hbWUgfCBzZW5kX21haWwKKwlkb25lCitmaQpkaWZmIC0tZ2l0IGEvY29udHJpYi9ob29rcy9zZXRnaXRwZXJtcy5wZXJsIGIvY29udHJpYi9ob29rcy9zZXRnaXRwZXJtcy5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYjdjOGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2hvb2tzL3NldGdpdHBlcm1zLnBlcmwKQEAgLTAsMCArMSwyMTQgQEAKKyMhL3Vzci9iaW4vcGVybAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgSm9zaCBFbmdsYW5kCisjCisjIFRoaXMgc2NyaXB0IGNhbiBiZSB1c2VkIHRvIHNhdmUvcmVzdG9yZSBmdWxsIHBlcm1pc3Npb25zIGFuZCBvd25lcnNoaXAgZGF0YQorIyB3aXRoaW4gYSBnaXQgd29ya2luZyB0cmVlLgorIworIyBUbyBzYXZlIHBlcm1pc3Npb25zL293bmVyc2hpcCBkYXRhLCBwbGFjZSB0aGlzIHNjcmlwdCBpbiB5b3VyIC5naXQvaG9va3MKKyMgZGlyZWN0b3J5IGFuZCBlbmFibGUgYSBgcHJlLWNvbW1pdGAgaG9vayB3aXRoIHRoZSBmb2xsb3dpbmcgbGluZXM6CisjICAgICAgIyEvYmluL3NoCisjICAgICBTVUJESVJFQ1RPUllfT0s9MSAuIGdpdC1zaC1zZXR1cAorIyAgICAgJEdJVF9ESVIvaG9va3Mvc2V0Z2l0cGVybXMucGVybCAtcgorIworIyBUbyByZXN0b3JlIHBlcm1pc3Npb25zL293bmVyc2hpcCBkYXRhLCBwbGFjZSB0aGlzIHNjcmlwdCBpbiB5b3VyIC5naXQvaG9va3MKKyMgZGlyZWN0b3J5IGFuZCBlbmFibGUgYSBgcG9zdC1tZXJnZWAgYW5kIGBwb3N0LWNoZWNrb3V0YCBob29rIHdpdGggdGhlCisjIGZvbGxvd2luZyBsaW5lczoKKyMgICAgICAjIS9iaW4vc2gKKyMgICAgIFNVQkRJUkVDVE9SWV9PSz0xIC4gZ2l0LXNoLXNldHVwCisjICAgICAkR0lUX0RJUi9ob29rcy9zZXRnaXRwZXJtcy5wZXJsIC13CisjCit1c2Ugc3RyaWN0OwordXNlIEdldG9wdDo6TG9uZzsKK3VzZSBGaWxlOjpGaW5kOwordXNlIEZpbGU6OkJhc2VuYW1lOworCitteSAkdXNhZ2UgPQorIlVzYWdlOiBzZXRnaXRwZXJtcy5wZXJsIFtPUFRJT05dLi4uIDwtLXJlYWR8LS13cml0ZT4KK1RoaXMgcHJvZ3JhbSB1c2VzIGEgZmlsZSBgLmdpdG1ldGFgIHRvIHN0b3JlL3Jlc3RvcmUgcGVybWlzc2lvbnMgYW5kIHVpZC9naWQKK2luZm8gZm9yIGFsbCBmaWxlcy9kaXJzIHRyYWNrZWQgYnkgZ2l0IGluIHRoZSByZXBvc2l0b3J5LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1SZWFkIE1vZGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistciwgIC0tcmVhZCAgICAgICAgIFJlYWRzIHBlcm1zL2V0YyBmcm9tIHdvcmtpbmcgZGlyIGludG8gYSAuZ2l0bWV0YSBmaWxlCistcywgIC0tc3Rkb3V0ICAgICAgIE91dHB1dCB0byBzdGRvdXQgaW5zdGVhZCBvZiAuZ2l0bWV0YQorLWQsICAtLWRpZmYgICAgICAgICBTaG93IHVuaWZpZWQgZGlmZiBvZiBwZXJtcyBmaWxlIChYT1Igd2l0aCAtLXN0ZG91dCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tV3JpdGUgTW9kZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLXcsICAtLXdyaXRlICAgICAgICBNb2RpZnkgcGVybXMvZXRjIGluIHdvcmtpbmcgZGlyIHRvIG1hdGNoIHRoZSAuZ2l0bWV0YSBmaWxlCistdiwgIC0tdmVyYm9zZSAgICAgIEJlIHZlcmJvc2UKKworXG4iOworCitteSAoJHN0ZG91dCwgJHNob3dkaWZmLCAkdmVyYm9zZSwgJHJlYWRfbW9kZSwgJHdyaXRlX21vZGUpOworCitpZiAoKEBBUkdWIDwgMCkgfHwgIUdldE9wdGlvbnMoCisJCQkgICAgICAgInN0ZG91dCIsICAgICAgICAgXCRzdGRvdXQsCisJCQkgICAgICAgImRpZmYiLCAgICAgICAgICAgXCRzaG93ZGlmZiwKKwkJCSAgICAgICAicmVhZCIsICAgICAgICAgICBcJHJlYWRfbW9kZSwKKwkJCSAgICAgICAid3JpdGUiLCAgICAgICAgICBcJHdyaXRlX21vZGUsCisJCQkgICAgICAgInZlcmJvc2UiLCAgICAgICAgXCR2ZXJib3NlLAorCQkJICAgICAgKSkgeyBkaWUgJHVzYWdlOyB9CitkaWUgJHVzYWdlIHVubGVzcyAoJHJlYWRfbW9kZSB4b3IgJHdyaXRlX21vZGUpOworCitteSAkdG9wZGlyID0gYGdpdC1yZXYtcGFyc2UgLS1zaG93LWNkdXBgIG9yIGRpZSAiXG4iOyBjaG9tcCAkdG9wZGlyOworbXkgJGdpdGRpciA9ICR0b3BkaXIgLiAnLmdpdCc7CitteSAkZ2l0bWV0YSA9ICR0b3BkaXIgLiAnLmdpdG1ldGEnOworCitpZiAoJHdyaXRlX21vZGUpIHsKKyAgICAjIFVwZGF0ZSB0aGUgd29ya2luZyBkaXIgcGVybWlzc2lvbnMvb3duZXJzaGlwIGJhc2VkIG9uIGRhdGEgZnJvbSAuZ2l0bWV0YQorICAgIG9wZW4gKElOLCAiPCRnaXRtZXRhIikgb3IgZGllICJDb3VsZCBub3Qgb3BlbiAkZ2l0bWV0YSBmb3IgcmVhZGluZzogJCFcbiI7CisgICAgd2hpbGUgKGRlZmluZWQgKCRfID0gPElOPikpIHsKKwljaG9tcDsKKwlpZiAoL14oLiopICBtb2RlPShcUyspXHMrdWlkPShcZCspXHMrZ2lkPShcZCspLykgeworCSAgICAjIENvbXBhcmUgcmVjb3JkZWQgcGVybXMgdG8gYWN0dWFsIHBlcm1zIGluIHRoZSB3b3JraW5nIGRpcgorCSAgICBteSAoJHBhdGgsICRtb2RlLCAkdWlkLCAkZ2lkKSA9ICgkMSwgJDIsICQzLCAkNCk7CisJICAgIG15ICRmdWxscGF0aCA9ICR0b3BkaXIgLiAkcGF0aDsKKwkgICAgbXkgKHVuZGVmLHVuZGVmLCR3bW9kZSx1bmRlZiwkd3VpZCwkd2dpZCkgPSBsc3RhdCgkZnVsbHBhdGgpOworCSAgICAkd21vZGUgPSBzcHJpbnRmICIlMDRvIiwgJHdtb2RlICYgMDc3Nzc7CisJICAgIGlmICgkbW9kZSBuZSAkd21vZGUpIHsKKwkJJHZlcmJvc2UgJiYgcHJpbnQgIlVwZGF0aW5nIHBlcm1pc3Npb25zIG9uICRwYXRoOiBvbGQ9JHdtb2RlLCBuZXc9JG1vZGVcbiI7CisJCWNobW9kIG9jdCgkbW9kZSksICRmdWxscGF0aDsKKwkgICAgfQorCSAgICBpZiAoJHVpZCAhPSAkd3VpZCB8fCAkZ2lkICE9ICR3Z2lkKSB7CisJCWlmICgkdmVyYm9zZSkgeworCQkgICAgIyBQcmludCBvdXQgdXNlci9ncm91cCBuYW1lcyBpbnN0ZWFkIG9mIHVpZC9naWQKKwkJICAgIG15ICRwd25hbWUgID0gZ2V0cHd1aWQoJHVpZCk7CisJCSAgICBteSAkZ3JwbmFtZSAgPSBnZXRncmdpZCgkZ2lkKTsKKwkJICAgIG15ICR3cHduYW1lICA9IGdldHB3dWlkKCR3dWlkKTsKKwkJICAgIG15ICR3Z3JwbmFtZSAgPSBnZXRncmdpZCgkd2dpZCk7CisJCSAgICAkcHduYW1lID0gJHVpZCBpZiAhZGVmaW5lZCAkcHduYW1lOworCQkgICAgJGdycG5hbWUgPSAkZ2lkIGlmICFkZWZpbmVkICRncnBuYW1lOworCQkgICAgJHdwd25hbWUgPSAkd3VpZCBpZiAhZGVmaW5lZCAkd3B3bmFtZTsKKwkJICAgICR3Z3JwbmFtZSA9ICR3Z2lkIGlmICFkZWZpbmVkICR3Z3JwbmFtZTsKKworCQkgICAgcHJpbnQgIlVwZGF0aW5nIHVpZC9naWQgb24gJHBhdGg6IG9sZD0kd3B3bmFtZS8kd2dycG5hbWUsIG5ldz0kcHduYW1lLyRncnBuYW1lXG4iOworCQl9CisJCWNob3duICR1aWQsICRnaWQsICRmdWxscGF0aDsKKwkgICAgfQorCX0KKwllbHNlIHsKKwkgICAgd2FybiAiSW52YWxpZCBpbnB1dCBmb3JtYXQgaW4gJGdpdG1ldGE6XG5cdCRfXG4iOworCX0KKyAgICB9CisgICAgY2xvc2UgSU47Cit9CitlbHNpZiAoJHJlYWRfbW9kZSkgeworICAgICMgSGFuZGxlIG1lcmdlIGNvbmZsaWN0cyBpbiB0aGUgLmdpdHBlcm1zIGZpbGUKKyAgICBpZiAoLWUgIiRnaXRkaXIvTUVSR0VfTVNHIikgeworCWlmIChgZ3JlcCA9PT09PT0gJGdpdG1ldGFgKSB7CisJICAgICMgQ29uZmxpY3Qgbm90IHJlc29sdmVkIC0tIGFib3J0IHRoZSBjb21taXQKKwkgICAgcHJpbnQgIlBFUk1JU1NJT05TL09XTkVSU0hJUCBDT05GTElDVFxuIjsKKwkgICAgcHJpbnQgIiAgICBSZXNvbHZlIHRoZSBjb25mbGljdCBpbiB0aGUgJGdpdG1ldGEgZmlsZSBhbmQgdGhlbiBydW5cbiI7CisJICAgIHByaW50ICIgICAgYC5naXQvaG9va3Mvc2V0Z2l0cGVybXMucGVybCAtLXdyaXRlYCB0byByZWNvbmNpbGUuXG4iOworCSAgICBleGl0IDE7CisJfQorCWVsc2lmIChgZ3JlcCAkZ2l0bWV0YSAkZ2l0ZGlyL01FUkdFX01TR2ApIHsKKwkgICAgIyBBIGNvbmZsaWN0IGluIC5naXRtZXRhIGhhcyBiZWVuIG1hbnVhbGx5IHJlc29sdmVkLiBWZXJpZnkgdGhhdAorCSAgICAjIHRoZSB3b3JraW5nIGRpciBwZXJtcyBtYXRjaGVzIHRoZSBjdXJyZW50IC5naXRtZXRhIHBlcm1zIGZvcgorCSAgICAjIGVhY2ggZmlsZS9kaXIgdGhhdCBjb25mbGljdGVkLgorCSAgICAjIFRoaXMgaXMgaGVyZSBiZWNhdXNlIGEgYHNldGdpdHBlcm1zLnBlcmwgLS13cml0ZWAgd2FzIG5vdAorCSAgICAjIHBlcmZvcm1lZCBkdWUgdG8gYSBtZXJnZSBjb25mbGljdCwgc28gcGVybWlzc2lvbnMvb3duZXJzaGlwCisJICAgICMgbWF5IG5vdCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIG1hbnVhbGx5IG1lcmdlZCAuZ2l0bWV0YSBmaWxlLgorCSAgICBteSBAY29uZmxpY3RfZGlmZiA9IGBnaXQgc2hvdyBcJChjYXQgJGdpdGRpci9NRVJHRV9IRUFEKWA7CisJICAgIG15IEBjb25mbGljdF9maWxlczsKKwkgICAgbXkgJG1ldGFkaWZmID0gMDsKKworCSAgICAjIEJ1aWxkIGEgbGlzdCBvZiBmaWxlcyB0aGF0IGNvbmZsaWN0ZWQgZnJvbSB0aGUgLmdpdG1ldGEgZGlmZgorCSAgICBmb3JlYWNoIG15ICRsaW5lIChAY29uZmxpY3RfZGlmZikgeworCQlpZiAoJGxpbmUgPX4gbXxeZGlmZiAtLWdpdCBhLyRnaXRtZXRhIGIvJGdpdG1ldGF8KSB7CisJCSAgICAkbWV0YWRpZmYgPSAxOworCQl9CisJCWVsc2lmICgkbGluZSA9fiAvXmRpZmYgLS1naXQvKSB7CisJCSAgICAkbWV0YWRpZmYgPSAwOworCQl9CisJCWVsc2lmICgkbWV0YWRpZmYgJiYgJGxpbmUgPX4gL15cKyguKikgIG1vZGU9LykgeworCQkgICAgcHVzaCBAY29uZmxpY3RfZmlsZXMsICQxOworCQl9CisJICAgIH0KKworCSAgICAjIFZlcmlmeSB0aGF0IGVhY2ggY29uZmxpY3QgZmlsZSBub3cgaGFzIHBlcm1pc3Npb25zIGNvbnNpc3RlbnQKKwkgICAgIyB3aXRoIHRoZSAuZ2l0bWV0YSBmaWxlCisJICAgIGZvcmVhY2ggbXkgJGZpbGUgKEBjb25mbGljdF9maWxlcykgeworCQlteSAkYWJzZmlsZSA9ICR0b3BkaXIgLiAkZmlsZTsKKwkJbXkgJGdtX2VudHJ5ID0gYGdyZXAgIl4kZmlsZSAgbW9kZT0iICRnaXRtZXRhYDsKKwkJaWYgKCRnbV9lbnRyeSA9fiAvbW9kZT0oXGQrKSAgdWlkPShcZCspICBnaWQ9KFxkKykvKSB7CisJCSAgICBteSAoJGdtX21vZGUsICRnbV91aWQsICRnbV9naWQpID0gKCQxLCAkMiwgJDMpOworCQkgICAgbXkgKHVuZGVmLHVuZGVmLCRtb2RlLHVuZGVmLCR1aWQsJGdpZCkgPSBsc3RhdCgiJGFic2ZpbGUiKTsKKwkJICAgICRtb2RlID0gc3ByaW50ZigiJTA0byIsICRtb2RlICYgMDc3NzcpOworCQkgICAgaWYgKCgkZ21fbW9kZSBuZSAkbW9kZSkgfHwgKCRnbV91aWQgIT0gJHVpZCkKKwkJCXx8ICgkZ21fZ2lkICE9ICRnaWQpKSB7CisJCQlwcmludCAiUEVSTUlTU0lPTlMvT1dORVJTSElQIENPTkZMSUNUXG4iOworCQkJcHJpbnQgIiAgICBNaXNtYXRjaCBmb3VuZCBmb3IgZmlsZTogJGZpbGVcbiI7CisJCQlwcmludCAiICAgIFJ1biBgLmdpdC9ob29rcy9zZXRnaXRwZXJtcy5wZXJsIC0td3JpdGVgIHRvIHJlY29uY2lsZS5cbiI7CisJCQlleGl0IDE7CisJCSAgICB9CisJCX0KKwkJZWxzZSB7CisJCSAgICBwcmludCAiV2FybmluZyEgUGVybWlzc2lvbnMvb3duZXJzaGlwIG5vIGxvbmdlciBiZWluZyB0cmFja2VkIGZvciBmaWxlOiAkZmlsZVxuIjsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICAgICMgTm8gbWVyZ2UgY29uZmxpY3RzIC0tIHdyaXRlIG91dCBwZXJtcy9vd25lcnNoaXAgZGF0YSB0byAuZ2l0bWV0YSBmaWxlCisgICAgdW5sZXNzICgkc3Rkb3V0KSB7CisJb3BlbiAoT1VULCAiPiRnaXRtZXRhLnRtcCIpIG9yIGRpZSAiQ291bGQgbm90IG9wZW4gJGdpdG1ldGEudG1wIGZvciB3cml0aW5nOiAkIVxuIjsKKyAgICB9CisKKyAgICBteSBAZmlsZXMgPSBgZ2l0LWxzLWZpbGVzYDsKKyAgICBteSAlZGlyczsKKworICAgIGZvcmVhY2ggbXkgJHBhdGggKEBmaWxlcykgeworCWNob21wICRwYXRoOworCSMgV2UgaGF2ZSB0byBtYW51YWxseSBhZGQgc3RhdHMgZm9yIHBhcmVudCBkaXJlY3RvcmllcworCW15ICRwYXJlbnQgPSBkaXJuYW1lKCRwYXRoKTsKKwl3aGlsZSAoIWV4aXN0cyAkZGlyc3skcGFyZW50fSkgeworCSAgICAkZGlyc3skcGFyZW50fSA9IDE7CisJICAgIG5leHQgaWYgJHBhcmVudCBlcSAnLic7CisJICAgIHByaW50c3RhdHMoJHBhcmVudCk7CisJICAgICRwYXJlbnQgPSBkaXJuYW1lKCRwYXJlbnQpOworCX0KKwkjIE5vdyB0aGUgZ2l0LXRyYWNrZWQgZmlsZQorCXByaW50c3RhdHMoJHBhdGgpOworICAgIH0KKworICAgICMgZGlmZiB0aGUgdGVtcG9yYXJ5IG1ldGFkYXRhIGZpbGUgdG8gc2VlIGlmIGFueXRoaW5nIGhhcyBjaGFuZ2VkCisgICAgIyBJZiBubyBtZXRhZGF0YSBoYXMgY2hhbmdlZCwgZG9uJ3Qgb3ZlcndyaXRlIHRoZSByZWFsIGZpbGUKKyAgICAjIFRoaXMgaXMganVzdCBzbyBgZ2l0IGNvbW1pdCAtYWAgZG9lc24ndCB0cnkgdG8gY29tbWl0IGEgYm9ndXMgdXBkYXRlCisgICAgdW5sZXNzICgkc3Rkb3V0KSB7CisJaWYgKCEgLWUgJGdpdG1ldGEpIHsKKwkgICAgcmVuYW1lICIkZ2l0bWV0YS50bXAiLCAkZ2l0bWV0YTsKKwl9CisJZWxzZSB7CisJICAgIG15ICRkaWZmID0gYGRpZmYgLVUgMCAkZ2l0bWV0YSAkZ2l0bWV0YS50bXBgOworCSAgICBpZiAoJGRpZmYgbmUgJycpIHsKKwkJcmVuYW1lICIkZ2l0bWV0YS50bXAiLCAkZ2l0bWV0YTsKKwkgICAgfQorCSAgICBlbHNlIHsKKwkJdW5saW5rICIkZ2l0bWV0YS50bXAiOworCSAgICB9CisJICAgIGlmICgkc2hvd2RpZmYpIHsKKwkJcHJpbnQgJGRpZmY7CisJICAgIH0KKwl9CisJY2xvc2UgT1VUOworICAgIH0KKyAgICAjIE1ha2Ugc3VyZSB0aGUgLmdpdG1ldGEgZmlsZSBpcyB0cmFja2VkCisgICAgc3lzdGVtKCJnaXQgYWRkICRnaXRtZXRhIik7Cit9CisKKworc3ViIHByaW50c3RhdHMgeworICAgIG15ICRwYXRoID0gJF9bMF07CisgICAgJHBhdGggPX4gcy9AL1xAL2c7CisgICAgbXkgKHVuZGVmLHVuZGVmLCRtb2RlLHVuZGVmLCR1aWQsJGdpZCkgPSBsc3RhdCgkcGF0aCk7CisgICAgJHBhdGggPX4gcy8lL1wlL2c7CisgICAgaWYgKCRzdGRvdXQpIHsKKwlwcmludCAkcGF0aDsKKwlwcmludGYgIiAgbW9kZT0lMDRvICB1aWQ9JHVpZCAgZ2lkPSRnaWRcbiIsICRtb2RlICYgMDc3Nzc7CisgICAgfQorICAgIGVsc2UgeworCXByaW50IE9VVCAkcGF0aDsKKwlwcmludGYgT1VUICIgIG1vZGU9JTA0byAgdWlkPSR1aWQgIGdpZD0kZ2lkXG4iLCAkbW9kZSAmIDA3Nzc3OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvaG9va3MvdXBkYXRlLXBhcmFub2lkIGIvY29udHJpYi9ob29rcy91cGRhdGUtcGFyYW5vaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4ZmEzNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvaG9va3MvdXBkYXRlLXBhcmFub2lkCkBAIC0wLDAgKzEsNDIxIEBACisjIS91c3IvYmluL3BlcmwKKwordXNlIHN0cmljdDsKK3VzZSBGaWxlOjpTcGVjOworCiskRU5We1BBVEh9ICAgICA9ICcvb3B0L2dpdC9iaW4nOworbXkgJGFjbF9naXQgICAgPSAnL3Zjcy9hY2xzLmdpdCc7CitteSAkYWNsX2JyYW5jaCA9ICdyZWZzL2hlYWRzL21hc3Rlcic7CitteSAkZGVidWcgICAgICA9IDA7CisKKz1kb2MKK0ludm9rZWQgYXM6IHVwZGF0ZSByZWZuYW1lIG9sZC1zaGExIG5ldy1zaGExCisKK1RoaXMgc2NyaXB0IGlzIHJ1biBieSBnaXQtcmVjZWl2ZS1wYWNrIG9uY2UgZm9yIGVhY2ggcmVmIHRoYXQgdGhlCitjbGllbnQgaXMgdHJ5aW5nIHRvIG1vZGlmeS4gIElmIHdlIGV4aXQgd2l0aCBhIG5vbi16ZXJvIGV4aXQgdmFsdWUKK3RoZW4gdGhlIHVwZGF0ZSBmb3IgdGhhdCBwYXJ0aWN1bGFyIHJlZiBpcyBkZW5pZWQsIGJ1dCB1cGRhdGVzIGZvcgorb3RoZXIgcmVmcyBpbiB0aGUgc2FtZSBydW4gb2YgcmVjZWl2ZS1wYWNrIG1heSBzdGlsbCBiZSBhbGxvd2VkLgorCitXZSBhcmUgcnVuIGFmdGVyIHRoZSBvYmplY3RzIGhhdmUgYmVlbiB1cGxvYWRlZCwgYnV0IGJlZm9yZSB0aGUKK3JlZiBpcyBhY3R1YWxseSBtb2RpZmllZC4gIFdlIHRha2UgYWR2YW50YWdlIG9mIHRoYXQgZmFjdCB3aGVuIHdlCitsb29rIGZvciAibmV3IiBjb21taXRzIGFuZCB0YWdzICh0aGUgbmV3IG9iamVjdHMgd29uJ3Qgc2hvdyB1cCBpbgorYHJldi1saXN0IC0tYWxsYCkuCisKK1RoaXMgc2NyaXB0IGxvYWRzIGFuZCBwYXJzZXMgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbmZpZyBmaWxlCisidXNlcnMvJHRoaXNfdXNlci5hY2wiIGZyb20gdGhlICRhY2xfYnJhbmNoIGNvbW1pdCBvZiAkYWNsX2dpdCBPREIuCitUaGUgYWNsIGZpbGUgaXMgYSBnaXQtY29uZmlnIHN0eWxlIGZpbGUsIGJ1dCB1c2VzIGEgc2xpZ2h0bHkgbW9yZQorcmVzdHJpY3RlZCBzeW50YXggYXMgdGhlIFBlcmwgcGFyc2VyIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBzY3JpcHQKK2lzIG5vdCBuZWFybHkgYXMgcGVybWlzc2l2ZSBhcyBnaXQtY29uZmlnLgorCitFeGFtcGxlOgorCisgIFt1c2VyXQorICAgIGNvbW1pdHRlciA9IEpvaG4gRG9lIDxqb2huLmRvZUBleGFtcGxlLmNvbT4KKyAgICBjb21taXR0ZXIgPSBKb2huIFIuIERvZSA8am9obi5kb2VAZXhhbXBsZS5jb20+CisKKyAgW3JlcG9zaXRvcnkgImFjbHMiXQorICAgIGFsbG93ID0gaGVhZHMvbWFzdGVyCisgICAgYWxsb3cgPSBDRFVSIGZvciBoZWFkcy9qZC8KKyAgICBhbGxvdyA9IEMgICAgZm9yIF50YWdzL3ZcXGQrJAorCitGb3IgYWxsIG5ldyBjb21taXQgb3IgdGFnIG9iamVjdHMgdGhlIGNvbW1pdHRlciAob3IgdGFnZ2VyKSBsaW5lCit3aXRoaW4gdGhlIG9iamVjdCBtdXN0IGV4YWN0bHkgbWF0Y2ggb25lIG9mIHRoZSB1c2VyLmNvbW1pdHRlcgordmFsdWVzIGxpc3RlZCBpbiB0aGUgYWNsIGZpbGUgKCJIRUFEOnVzZXJzLyR0aGlzX3VzZXIuYWNsIikuCisKK0ZvciBhIGJyYW5jaCB0byBiZSBtb2RpZmllZCBhbiBhbGxvdyBsaW5lIHdpdGhpbiB0aGUgbWF0Y2hpbmcKK3JlcG9zaXRvcnkgc2VjdGlvbiBtdXN0IGJlIG1hdGNoZWQgZm9yIGJvdGggdGhlIHJlZm5hbWUgYW5kIHRoZQorb3Bjb2RlLgorCitSZXBvc2l0b3J5IHNlY3Rpb25zIGFyZSBtYXRjaGVkIG9uIHRoZSBiYXNlbmFtZSBvZiB0aGUgcmVwb3NpdG9yeQorKGFmdGVyIHJlbW92aW5nIHRoZSAuZ2l0IHN1ZmZpeCkuCisKK1RoZSBvcGNvZGUgYWJicmV2YXRpb25zIGFyZToKKworICBDOiBjcmVhdGUgbmV3IHJlZgorICBEOiBkZWxldGUgZXhpc3RpbmcgcmVmCisgIFU6IGZhc3QtZm9yd2FyZCBleGlzdGluZyByZWYgKG5vIGNvbW1pdCBsb3NzKQorICBSOiByZXdpbmQvcmViYXNlIGV4aXN0aW5nIHJlZiAoY29tbWl0IGxvc3MpCisKK2lmIG5vIG9wY29kZXMgYXJlIGxpc3RlZCBiZWZvcmUgdGhlICJmb3IiIGtleXdvcmQgdGhlbiAiVSIgKGZvcgorZmFzdC1mb3J3YXJkIHVwZGF0ZSBvbmx5KSBpcyBhc3N1bWVkIGFzIHRoaXMgaXMgdGhlIG1vc3QgY29tbW9uCit1c2FnZS4KKworUmVmbmFtZXMgYXJlIG1hdGNoZWQgYnkgYWx3YXlzIGFzc3VtaW5nIGEgcHJlZml4IG9mICJyZWZzLyIuCitUaGlzIGhvb2sgZm9yYmlkcyBwdXNoaW5nIG9yIGRlbGV0aW5nIGFueXRoaW5nIG5vdCB1bmRlciAicmVmcy8iLgorCitSZWZuYW1lcyB0aGF0IHN0YXJ0IHdpdGggXiBhcmUgUGVybCByZWd1bGFyIGV4cHJlc3Npb25zLCBhbmQgdGhlIF4KK2lzIGtlcHQgYXMgcGFydCBvZiB0aGUgcmVnZXhwLiAgXFwgaXMgbmVlZGVkIHRvIGdldCBqdXN0IG9uZSBcLCBzbworXFxkIGV4cGFuZHMgdG8gXGQgaW4gUGVybC4gIFRoZSAzcmQgYWxsb3cgbGluZSBhYm92ZSBpcyBhbiBleGFtcGxlLgorCitSZWZuYW1lcyB0aGF0IGRvbid0IHN0YXJ0IHdpdGggXiBidXQgdGhhdCBlbmQgd2l0aCAvIGFyZSBwcmVmaXgKK21hdGNoZXMgKDJuZCBhbGxvdyBsaW5lIGFib3ZlKTsgYWxsIG90aGVyIHJlZm5hbWVzIGFyZSBzdHJpY3QKK2VxdWFsaXR5IG1hdGNoZXMgKDFzdCBhbGxvdyBsaW5lKS4KKworQW55dGhpbmcgcHVzaGVkIHRvICJoZWFkcy8iIChvaywgcmVhbGx5ICJyZWZzL2hlYWRzLyIpIG11c3QgYmUKK2EgY29tbWl0LiAgVGFncyBhcmUgbm90IHBlcm1pdHRlZCBoZXJlLgorCitBbnl0aGluZyBwdXNoZWQgdG8gInRhZ3MvIiAoZXJyLCByZWFsbHkgInJlZnMvdGFncy8iKSBtdXN0IGJlIGFuCithbm5vdGF0ZWQgdGFnLiAgQ29tbWl0cywgYmxvYnMsIHRyZWVzLCBldGMuIGFyZSBub3QgcGVybWl0dGVkIGhlcmUuCitBbm5vdGF0ZWQgdGFnIHNpZ25hdHVyZXMgYXJlbid0IGNoZWNrZWQsIG5vciBhcmUgdGhleSByZXF1aXJlZC4KKworVGhlIHNwZWNpYWwgc3VicmVwb3NpdG9yeSBvZiAnaW5mby9uZXctY29tbWl0LWNoZWNrJyBjYW4KK2JlIGNyZWF0ZWQgYW5kIHVzZWQgdG8gYWxsb3cgdXNlcnMgdG8gcHVzaCBuZXcgY29tbWl0cyBhbmQKK3RhZ3MgZnJvbSBhbm90aGVyIGxvY2FsIHJlcG9zaXRvcnkgdG8gdGhpcyBvbmUsIGV2ZW4gaWYgdGhleQorYXJlbid0IHRoZSBjb21taXR0ZXIvdGFnZ2VyIG9mIHRob3NlIG9iamVjdHMuICBJbiBhIG51dCBzaGVsbAordGhlIGluZm8vbmV3LWNvbW1pdC1jaGVjayBkaXJlY3RvcnkgaXMgYSBHaXQgcmVwb3NpdG9yeSB3aG9zZQorb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXMgZmlsZSBsaXN0cyB0aGlzIHJlcG9zaXRvcnkgYW5kIGFsbCBvdGhlcgorcG9zc2libGUgc291cmNlcywgYW5kIHdob3NlIHJlZnMgc3ViZGlyZWN0b3J5IGNvbnRhaW5zIHN5bWxpbmtzCit0byB0aGlzIHJlcG9zaXRvcnkncyByZWZzIHN1YmRpcmVjdG9yeSwgYW5kIHRvIGFsbCBvdGhlciBwb3NzaWJsZQorc291cmNlcyByZWZzIHN1YmRpcmVjdG9yaWVzLiAgWWVzLCB0aGlzIG1lYW5zIHRoYXQgeW91IGNhbm5vdAordXNlIHBhY2tlZC1yZWZzIGluIHRob3NlIHJlcG9zaXRvcmllcyBhcyB0aGV5IHdvbid0IGJlIHJlc29sdmVkCitjb3JyZWN0bHkuCisKKz1jdXQKKworbXkgJGdpdF9kaXIgPSAkRU5We0dJVF9ESVJ9OworbXkgJG5ld19jb21taXRfY2hlY2sgPSAiJGdpdF9kaXIvaW5mby9uZXctY29tbWl0LWNoZWNrIjsKK215ICRyZWYgPSAkQVJHVlswXTsKK215ICRvbGQgPSAkQVJHVlsxXTsKK215ICRuZXcgPSAkQVJHVlsyXTsKK215ICRuZXdfdHlwZTsKK215ICgkdGhpc191c2VyKSA9IGdldHB3dWlkICQ8OyAjIFJFQUxfVVNFUl9JRAorbXkgJHJlcG9zaXRvcnlfbmFtZTsKK215ICV1c2VyX2NvbW1pdHRlcjsKK215IEBhbGxvd19ydWxlczsKK215IEBwYXRoX3J1bGVzOworbXkgJWRpZmZfY2FjaGU7CisKK3N1YiBkZW55ICgkKSB7CisJcHJpbnQgU1RERVJSICItRGVueS0gICAgJF9bMF1cbiIgaWYgJGRlYnVnOworCXByaW50IFNUREVSUiAiXG5kZW5pZWQ6ICRfWzBdXG5cbiI7CisJZXhpdCAxOworfQorCitzdWIgZ3JhbnQgKCQpIHsKKwlwcmludCBTVERFUlIgIi1HcmFudC0gICAkX1swXVxuIiBpZiAkZGVidWc7CisJZXhpdCAwOworfQorCitzdWIgaW5mbyAoJCkgeworCXByaW50IFNUREVSUiAiLUluZm8tICAgICRfWzBdXG4iIGlmICRkZWJ1ZzsKK30KKworc3ViIGdpdF92YWx1ZSAoQCkgeworCW9wZW4oVCwnLXwnLCdnaXQnLEBfKTsgbG9jYWwgJF8gPSA8VD47IGNob3A7IGNsb3NlIFQ7ICRfOworfQorCitzdWIgbWF0Y2hfc3RyaW5nICgkJCkgeworCW15ICgkYWNsX24sICRyZWYpID0gQF87CisJICAgKCRhY2xfbiBlcSAkcmVmKQorCXx8ICgkYWNsX24gPX4gbSwvJCwgJiYgc3Vic3RyKCRyZWYsMCxsZW5ndGggJGFjbF9uKSBlcSAkYWNsX24pCisJfHwgKCRhY2xfbiA9fiBtLF5cXiwgJiYgJHJlZiA9fiBtOiRhY2xfbjopOworfQorCitzdWIgcGFyc2VfY29uZmlnICgkJCQkKSB7CisJbXkgJGRhdGEgPSBzaGlmdDsKKwlsb2NhbCAkRU5We0dJVF9ESVJ9ID0gc2hpZnQ7CisJbXkgJGJyID0gc2hpZnQ7CisJbXkgJGZuID0gc2hpZnQ7CisJaW5mbyAiTG9hZGluZyAkYnI6JGZuIjsKKwlvcGVuKEksJy18JywnZ2l0JywnY2F0LWZpbGUnLCdibG9iJywiJGJyOiRmbiIpOworCW15ICRzZWN0aW9uID0gJyc7CisJd2hpbGUgKDxJPikgeworCQljaG9tcDsKKwkJaWYgKC9eXHMqJC8gfHwgL15ccyojLykgeworCQl9IGVsc2lmICgvXlxbKFthLXpdKylcXSQvaSkgeworCQkJJHNlY3Rpb24gPSBsYyAkMTsKKwkJfSBlbHNpZiAoL15cWyhbYS16XSspXHMrIiguKikiXF0kL2kpIHsKKwkJCSRzZWN0aW9uID0gam9pbignLicsbGMgJDEsJDIpOworCQl9IGVsc2lmICgvXlxzKihbYS16XVthLXowLTldKylccyo9XHMqKC4qPylccyokL2kpIHsKKwkJCXB1c2ggQHskZGF0YS0+e2pvaW4oJy4nLCRzZWN0aW9uLGxjICQxKX19LCAkMjsKKwkJfSBlbHNlIHsKKwkJCWRlbnkgImJhZCBjb25maWcgZmlsZSBsaW5lICQuIGluICRicjokZm4iOworCQl9CisJfQorCWNsb3NlIEk7Cit9CisKK3N1YiBhbGxfbmV3X2NvbW1pdHRlcnMgKCkgeworCWxvY2FsICRFTlZ7R0lUX0RJUn0gPSAkZ2l0X2RpcjsKKwkkRU5We0dJVF9ESVJ9ID0gJG5ld19jb21taXRfY2hlY2sgaWYgLWQgJG5ld19jb21taXRfY2hlY2s7CisKKwlpbmZvICJHZXR0aW5nIGNvbW1pdHRlcnMgb2YgbmV3IGNvbW1pdHMuIjsKKwlteSAldXNlZDsKKwlvcGVuKFQsJy18JywnZ2l0JywncmV2LWxpc3QnLCctLXByZXR0eT1yYXcnLCRuZXcsJy0tbm90JywnLS1hbGwnKTsKKwl3aGlsZSAoPFQ+KSB7CisJCW5leHQgdW5sZXNzIHMvXmNvbW1pdHRlciAvLzsKKwkJY2hvcDsKKwkJcy8+LiokLz4vOworCQlpbmZvICJGb3VuZCAkXy4iIHVubGVzcyAkdXNlZHskX30rKzsKKwl9CisJY2xvc2UgVDsKKwlpbmZvICJObyBuZXcgY29tbWl0cy4iIHVubGVzcyAldXNlZDsKKwlrZXlzICV1c2VkOworfQorCitzdWIgYWxsX25ld190YWdnZXJzICgpIHsKKwlteSAlZXhpc3RzOworCW9wZW4oVCwnLXwnLCdnaXQnLCdmb3ItZWFjaC1yZWYnLCctLWZvcm1hdD0lKG9iamVjdG5hbWUpJywncmVmcy90YWdzJyk7CisJd2hpbGUgKDxUPikgeworCQljaG9wOworCQkkZXhpc3RzeyRffSA9IDE7CisJfQorCWNsb3NlIFQ7CisKKwlpbmZvICJHZXR0aW5nIHRhZ2dlcnMgb2YgbmV3IHRhZ3MuIjsKKwlteSAldXNlZDsKKwlteSAkb2JqID0gJG5ldzsKKwlteSAkb2JqX3R5cGUgPSAkbmV3X3R5cGU7CisJd2hpbGUgKCRvYmpfdHlwZSBlcSAndGFnJykgeworCQlsYXN0IGlmICRleGlzdHN7JG9ian07CisJCSRvYmpfdHlwZSA9ICcnOworCQlvcGVuKFQsJy18JywnZ2l0JywnY2F0LWZpbGUnLCd0YWcnLCRvYmopOworCQl3aGlsZSAoPFQ+KSB7CisJCQljaG9wOworCQkJaWYgKC9eb2JqZWN0IChbYS16MC05XXs0MH0pJC8pIHsKKwkJCQkkb2JqID0gJDE7CisJCQl9IGVsc2lmICgvXnR5cGUgKC4rKSQvKSB7CisJCQkJJG9ial90eXBlID0gJDE7CisJCQl9IGVsc2lmIChzL150YWdnZXIgLy8pIHsKKwkJCQlzLz4uKiQvPi87CisJCQkJaW5mbyAiRm91bmQgJF8uIiB1bmxlc3MgJHVzZWR7JF99Kys7CisJCQkJbGFzdDsKKwkJCX0KKwkJfQorCQljbG9zZSBUOworCX0KKwlpbmZvICJObyBuZXcgdGFncy4iIHVubGVzcyAldXNlZDsKKwlrZXlzICV1c2VkOworfQorCitzdWIgY2hlY2tfY29tbWl0dGVycyAoQCkgeworCW15IEBiYWQ7CisJZm9yZWFjaCAoQF8pIHsgcHVzaCBAYmFkLCAkXyB1bmxlc3MgJHVzZXJfY29tbWl0dGVyeyRffTsgfQorCWlmIChAYmFkKSB7CisJCXByaW50IFNUREVSUiAiXG4iOworCQlwcmludCBTVERFUlIgIllvdSBhcmUgbm90ICRfLlxuIiBmb3JlYWNoIChzb3J0IEBiYWQpOworCQlkZW55ICJZb3UgY2Fubm90IHB1c2ggY2hhbmdlcyBub3QgY29tbWl0dGVkIGJ5IHlvdS4iOworCX0KK30KKworc3ViIGxvYWRfZGlmZiAoJCkgeworCW15ICRiYXNlID0gc2hpZnQ7CisJbXkgJGQgPSAkZGlmZl9jYWNoZXskYmFzZX07CisJdW5sZXNzICgkZCkgeworCQlsb2NhbCAkLyA9ICJcMCI7CisJCW15ICV0aGlzX2RpZmY7CisJCWlmICgkYmFzZSA9fiAvXjB7NDB9JC8pIHsKKwkJCW9wZW4oVCwnLXwnLCdnaXQnLCdscy10cmVlJywKKwkJCQknLXInLCctLW5hbWUtb25seScsJy16JywKKwkJCQkkbmV3KSBvciByZXR1cm4gdW5kZWY7CisJCQl3aGlsZSAoPFQ+KSB7CisJCQkJY2hvcDsKKwkJCQkkdGhpc19kaWZmeyRffSA9ICdBJzsKKwkJCX0KKwkJCWNsb3NlIFQgb3IgcmV0dXJuIHVuZGVmOworCQl9IGVsc2UgeworCQkJb3BlbihULCctfCcsJ2dpdCcsJ2RpZmYtdHJlZScsCisJCQkJJy1yJywnLS1uYW1lLXN0YXR1cycsJy16JywKKwkJCQkkYmFzZSwkbmV3KSBvciByZXR1cm4gdW5kZWY7CisJCQl3aGlsZSAoPFQ+KSB7CisJCQkJbXkgJG9wID0gJF87CisJCQkJY2hvcCAkb3A7CisKKwkJCQlteSAkcGF0aCA9IDxUPjsKKwkJCQljaG9wICRwYXRoOworCisJCQkJJHRoaXNfZGlmZnskcGF0aH0gPSAkb3A7CisJCQl9CisJCQljbG9zZSBUIG9yIHJldHVybiB1bmRlZjsKKwkJfQorCQkkZCA9IFwldGhpc19kaWZmOworCQkkZGlmZl9jYWNoZXskYmFzZX0gPSAkZDsKKwl9CisJcmV0dXJuICRkOworfQorCitkZW55ICJObyBHSVRfRElSIGluaGVyaXRlZCBmcm9tIGNhbGxlciIgdW5sZXNzICRnaXRfZGlyOworZGVueSAiTmVlZCBhIHJlZiBuYW1lIiB1bmxlc3MgJHJlZjsKK2RlbnkgIlJlZnVzaW5nIGZ1bm55IHJlZiAkcmVmIiB1bmxlc3MgJHJlZiA9fiBzLF5yZWZzLywsOworZGVueSAiQmFkIG9sZCB2YWx1ZSAkb2xkIiB1bmxlc3MgJG9sZCA9fiAvXlthLXowLTldezQwfSQvOworZGVueSAiQmFkIG5ldyB2YWx1ZSAkbmV3IiB1bmxlc3MgJG5ldyA9fiAvXlthLXowLTldezQwfSQvOworZGVueSAiQ2Fubm90IGRldGVybWluZSB3aG8geW91IGFyZS4iIHVubGVzcyAkdGhpc191c2VyOworCiskcmVwb3NpdG9yeV9uYW1lID0gRmlsZTo6U3BlYy0+cmVsMmFicygkZ2l0X2Rpcik7CiskcmVwb3NpdG9yeV9uYW1lID1+IG0sLyhbXi9dKykoPzpcLmdpdHwvXC5naXQpJCw7CiskcmVwb3NpdG9yeV9uYW1lID0gJDE7CitpbmZvICJVcGRhdGluZyBpbiAnJHJlcG9zaXRvcnlfbmFtZScuIjsKKworbXkgJG9wOworaWYgICAgKCRvbGQgPX4gL14wezQwfSQvKSB7ICRvcCA9ICdDJzsgfQorZWxzaWYgKCRuZXcgPX4gL14wezQwfSQvKSB7ICRvcCA9ICdEJzsgfQorZWxzZSAgICAgICAgICAgICAgICAgICAgICB7ICRvcCA9ICdSJzsgfQorCisjIFRoaXMgaXMgcmVhbGx5IGFuIHVwZGF0ZSAoZmFzdC1mb3J3YXJkKSBpZiB0aGUKKyMgbWVyZ2UgYmFzZSBvZiAkb2xkIGFuZCAkbmV3IGlzICRvbGQuCisjCiskb3AgPSAnVScgaWYgKCRvcCBlcSAnUicKKwkmJiAkcmVmID1+IG0sXmhlYWRzLywKKwkmJiAkb2xkIGVxIGdpdF92YWx1ZSgnbWVyZ2UtYmFzZScsJG9sZCwkbmV3KSk7CisKKyMgTG9hZCB0aGUgdXNlcidzIEFDTCBmaWxlLiBFeHBhbmQgZ3JvdXBzICh1c2VyLm1lbWJlcm9mKSBvbmUgbGV2ZWwuCit7CisJbXkgJWRhdGEgPSAoJ3VzZXIuY29tbWl0dGVyJyA9PiBbXSk7CisJcGFyc2VfY29uZmlnKFwlZGF0YSwkYWNsX2dpdCwkYWNsX2JyYW5jaCwiZXh0ZXJuYWwvJHJlcG9zaXRvcnlfbmFtZS5hY2wiKTsKKworCSVkYXRhID0gKAorCQkndXNlci5jb21taXR0ZXInID0+ICRkYXRheyd1c2VyLmNvbW1pdHRlcid9LAorCQkndXNlci5tZW1iZXJvZicgPT4gW10sCisJKTsKKwlwYXJzZV9jb25maWcoXCVkYXRhLCRhY2xfZ2l0LCRhY2xfYnJhbmNoLCJ1c2Vycy8kdGhpc191c2VyLmFjbCIpOworCisJJXVzZXJfY29tbWl0dGVyID0gbWFwIHskXyA9PiAkX30gQHskZGF0YXsndXNlci5jb21taXR0ZXInfX07CisJbXkgJHJ1bGVfa2V5ID0gInJlcG9zaXRvcnkuJHJlcG9zaXRvcnlfbmFtZS5hbGxvdyI7CisJbXkgJHJ1bGVzID0gJGRhdGF7JHJ1bGVfa2V5fSB8fCBbXTsKKworCWZvcmVhY2ggbXkgJGdyb3VwIChAeyRkYXRheyd1c2VyLm1lbWJlcm9mJ319KSB7CisJCW15ICVnOworCQlwYXJzZV9jb25maWcoXCVnLCRhY2xfZ2l0LCRhY2xfYnJhbmNoLCJncm91cHMvJGdyb3VwLmFjbCIpOworCQlteSAkZ3JvdXBfcnVsZXMgPSAkZ3skcnVsZV9rZXl9OworCQlwdXNoIEAkcnVsZXMsIEAkZ3JvdXBfcnVsZXMgaWYgJGdyb3VwX3J1bGVzOworCX0KKworUlVMRToKKwlmb3JlYWNoIChAJHJ1bGVzKSB7CisJCXdoaWxlICgvXCR7dXNlclwuKFthLXpdW2EtekEtWjAtOV0rKX0vKSB7CisJCQlteSAkayA9IGxjICQxOworCQkJbXkgJHYgPSAkZGF0YXsidXNlci4kayJ9OworCQkJbmV4dCBSVUxFIHVubGVzcyBkZWZpbmVkICR2OworCQkJbmV4dCBSVUxFIGlmIEAkdiAhPSAxOworCQkJbmV4dCBSVUxFIHVubGVzcyBkZWZpbmVkICR2LT5bMF07CisJCQlzL1wke3VzZXJcLiRrfS8kdi0+WzBdL2c7CisJCX0KKworCQlpZiAoL14oW0FNRCBdKylccytvZlxzKyhbXlxzXSspXHMrZm9yXHMrKFteXHNdKylccytkaWZmXHMrKFteXHNdKykkLykgeworCQkJbXkgKCRvcHMsICRwdGgsICRyZWYsICRic3QpID0gKCQxLCAkMiwgJDMsICQ0KTsKKwkJCSRvcHMgPX4gcy8gLy9nOworCQkJJHB0aCA9fiBzL1xcXFwvXFwvZzsKKwkJCSRyZWYgPX4gcy9cXFxcL1xcL2c7CisJCQlwdXNoIEBwYXRoX3J1bGVzLCBbJG9wcywgJHB0aCwgJHJlZiwgJGJzdF07CisJCX0gZWxzaWYgKC9eKFtBTUQgXSspXHMrb2ZccysoW15cc10rKVxzK2ZvclxzKyhbXlxzXSspJC8pIHsKKwkJCW15ICgkb3BzLCAkcHRoLCAkcmVmKSA9ICgkMSwgJDIsICQzKTsKKwkJCSRvcHMgPX4gcy8gLy9nOworCQkJJHB0aCA9fiBzL1xcXFwvXFwvZzsKKwkJCSRyZWYgPX4gcy9cXFxcL1xcL2c7CisJCQlwdXNoIEBwYXRoX3J1bGVzLCBbJG9wcywgJHB0aCwgJHJlZiwgJG9sZF07CisJCX0gZWxzaWYgKC9eKFtDRFJVIF0rKVxzK2ZvclxzKyhbXlxzXSspJC8pIHsKKwkJCW15ICRvcHMgPSAkMTsKKwkJCW15ICRyZWYgPSAkMjsKKwkJCSRvcHMgPX4gcy8gLy9nOworCQkJJHJlZiA9fiBzL1xcXFwvXFwvZzsKKwkJCXB1c2ggQGFsbG93X3J1bGVzLCBbJG9wcywgJHJlZl07CisJCX0gZWxzaWYgKC9eZm9yXHMrKFteXHNdKykkLykgeworCQkJIyBNZW50aW9uZWQsIGJ1dCBub3RoaW5nIGdyYW50ZWQ/CisJCX0gZWxzaWYgKC9eW15cc10rJC8pIHsKKwkJCXMvXFxcXC9cXC9nOworCQkJcHVzaCBAYWxsb3dfcnVsZXMsIFsnVScsICRfXTsKKwkJfQorCX0KK30KKworaWYgKCRvcCBuZSAnRCcpIHsKKwkkbmV3X3R5cGUgPSBnaXRfdmFsdWUoJ2NhdC1maWxlJywnLXQnLCRuZXcpOworCisJaWYgKCRyZWYgPX4gbSxeaGVhZHMvLCkgeworCQlkZW55ICIkcmVmIG11c3QgYmUgYSBjb21taXQuIiB1bmxlc3MgJG5ld190eXBlIGVxICdjb21taXQnOworCX0gZWxzaWYgKCRyZWYgPX4gbSxedGFncy8sKSB7CisJCWRlbnkgIiRyZWYgbXVzdCBiZSBhbiBhbm5vdGF0ZWQgdGFnLiIgdW5sZXNzICRuZXdfdHlwZSBlcSAndGFnJzsKKwl9CisKKwljaGVja19jb21taXR0ZXJzIChhbGxfbmV3X2NvbW1pdHRlcnMpOworCWNoZWNrX2NvbW1pdHRlcnMgKGFsbF9uZXdfdGFnZ2VycykgaWYgJG5ld190eXBlIGVxICd0YWcnOworfQorCitpbmZvICIkdGhpc191c2VyIHdhbnRzICRvcCBmb3IgJHJlZiI7Citmb3JlYWNoIG15ICRhY2xfZW50cnkgKEBhbGxvd19ydWxlcykgeworCW15ICgkYWNsX29wcywgJGFjbF9uKSA9IEAkYWNsX2VudHJ5OworCW5leHQgdW5sZXNzICRhY2xfb3BzID1+IC9eW0NEUlVdKyQvOyAjIFVoaC4uLi4gc2hvdWxkbid0IGhhcHBlbi4KKwluZXh0IHVubGVzcyAkYWNsX247CisJbmV4dCB1bmxlc3MgJG9wID1+IC9eWyRhY2xfb3BzXSQvOworCW5leHQgdW5sZXNzIG1hdGNoX3N0cmluZyAkYWNsX24sICRyZWY7CisKKwkjIERvbid0IHRlc3QgcGF0aCBydWxlcyBvbiBicmFuY2ggZGVsZXRlcy4KKwkjCisJZ3JhbnQgIkFsbG93ZWQgYnk6ICRhY2xfb3BzIGZvciAkYWNsX24iIGlmICRvcCBlcSAnRCc7CisKKwkjIEFnZ3JlZ2F0ZSBtYXRjaGluZyBwYXRoIHJ1bGVzOyBhbGxvdyBpZiB0aGVyZSBhcmVuJ3QKKwkjIGFueSBtYXRjaGluZyB0aGlzIHJlZi4KKwkjCisJbXkgJXByOworCWZvcmVhY2ggbXkgJHBfZW50cnkgKEBwYXRoX3J1bGVzKSB7CisJCW15ICgkcF9vcHMsICRwX24sICRwX3JlZiwgJHBfYnN0KSA9IEAkcF9lbnRyeTsKKwkJbmV4dCB1bmxlc3MgJHBfcmVmOworCQlwdXNoIEB7JHByeyRwX2JzdH19LCAkcF9lbnRyeSBpZiBtYXRjaF9zdHJpbmcgJHBfcmVmLCAkcmVmOworCX0KKwlncmFudCAiQWxsb3dlZCBieTogJGFjbF9vcHMgZm9yICRhY2xfbiIgdW5sZXNzICVwcjsKKworCSMgQWxsb3cgb25seSBpZiBhbGwgY2hhbmdlcyBhZ2FpbnN0IGEgc2luZ2xlIGJhc2UgYXJlCisJIyBhbGxvd2VkIGJ5IGZpbGUgcGF0aCBydWxlcy4KKwkjCisJbXkgQGJhZDsKKwlmb3JlYWNoIG15ICRwX2JzdCAoa2V5cyAlcHIpIHsKKwkJbXkgJGRpZmZfcmVmID0gbG9hZF9kaWZmICRwX2JzdDsKKwkJZGVueSAiQ2Fubm90IGRpZmZlcmVuY2UgdHJlZXMuIiB1bmxlc3MgcmVmICRkaWZmX3JlZjsKKworCQlteSAlZmQgPSAlJGRpZmZfcmVmOworCQlmb3JlYWNoIG15ICRwX2VudHJ5IChAeyRwcnskcF9ic3R9fSkgeworCQkJbXkgKCRwX29wcywgJHBfbiwgJHBfcmVmLCAkcF9ic3QpID0gQCRwX2VudHJ5OworCQkJbmV4dCB1bmxlc3MgJHBfb3BzID1+IC9eW0FNRF0rJC87CisJCQluZXh0IHVubGVzcyAkcF9uOworCisJCQlmb3JlYWNoIG15ICRmX24gKGtleXMgJWZkKSB7CisJCQkJbXkgJGZfb3AgPSAkZmR7JGZfbn07CisJCQkJbmV4dCB1bmxlc3MgJGZfb3A7CisJCQkJbmV4dCB1bmxlc3MgJGZfb3AgPX4gL15bJHBfb3BzXSQvOworCQkJCWRlbGV0ZSAkZmR7JGZfbn0gaWYgbWF0Y2hfc3RyaW5nICRwX24sICRmX247CisJCQl9CisJCQlsYXN0IHVubGVzcyAlZmQ7CisJCX0KKworCQlpZiAoJWZkKSB7CisJCQlwdXNoIEBiYWQsIFskcF9ic3QsIFwlZmRdOworCQl9IGVsc2UgeworCQkJIyBBbGwgY2hhbmdlcyByZWxhdGl2ZSB0byAkcF9ic3Qgd2VyZSBhbGxvd2VkLgorCQkJIworCQkJZ3JhbnQgIkFsbG93ZWQgYnk6ICRhY2xfb3BzIGZvciAkYWNsX24gZGlmZiAkcF9ic3QiOworCQl9CisJfQorCisJZm9yZWFjaCBteSAkYmFkX3JlZiAoQGJhZCkgeworCQlteSAoJHBfYnN0LCAkZmQpID0gQCRiYWRfcmVmOworCQlwcmludCBTVERFUlIgIlxuIjsKKwkJcHJpbnQgU1RERVJSICJOb3QgYWxsb3dlZCB0byBtYWtlIHRoZSBmb2xsb3dpbmcgY2hhbmdlczpcbiI7CisJCXByaW50IFNUREVSUiAiKGJhc2U6ICRwX2JzdClcbiI7CisJCWZvcmVhY2ggbXkgJGZfbiAoc29ydCBrZXlzICUkZmQpIHsKKwkJCXByaW50IFNUREVSUiAiICAkZmQtPnskZl9ufSAkZl9uXG4iOworCQl9CisJfQorCWRlbnkgIllvdSBhcmUgbm90IHBlcm1pdHRlZCB0byAkb3AgJHJlZiI7Cit9CitjbG9zZSBBOworZGVueSAiWW91IGFyZSBub3QgcGVybWl0dGVkIHRvICRvcCAkcmVmIjsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcDRpbXBvcnQvUkVBRE1FIGIvY29udHJpYi9wNGltcG9ydC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4OTJiNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvcDRpbXBvcnQvUkVBRE1FCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBzZWUgY29udHJpYi9mYXN0LWltcG9ydC9naXQtcDQgZm9yIGEgYmV0dGVyIFBlcmZvcmNlIGltcG9ydGVyLgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wNGltcG9ydC9naXQtcDRpbXBvcnQucHkgYi9jb250cmliL3A0aW1wb3J0L2dpdC1wNGltcG9ydC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjNkOTdiCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9wNGltcG9ydC9naXQtcDRpbXBvcnQucHkKQEAgLTAsMCArMSwzNjAgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisjCisjIFRoaXMgdG9vbCBpcyBjb3B5cmlnaHQgKGMpIDIwMDYsIFNlYW4gRXN0YWJyb29rcy4KKyMgSXQgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdudSBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgorIworIyBJbXBvcnQgUGVyZm9yY2UgYnJhbmNoZXMgaW50byBHaXQgcmVwb3NpdG9yaWVzLgorIyBDaGVja2luZyBvdXQgdGhlIGZpbGVzIGlzIGRvbmUgYnkgY2FsbGluZyB0aGUgc3RhbmRhcmQgcDQKKyMgY2xpZW50IHdoaWNoIHlvdSBtdXN0IGhhdmUgcHJvcGVybHkgY29uZmlndXJlZCB5b3Vyc2VsZgorIworCitpbXBvcnQgbWFyc2hhbAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IGdldG9wdAorCitmcm9tIHNpZ25hbCBpbXBvcnQgc2lnbmFsLCBcCisgICBTSUdQSVBFLCBTSUdJTlQsIFNJR19ERkwsIFwKKyAgIGRlZmF1bHRfaW50X2hhbmRsZXIKKworc2lnbmFsKFNJR1BJUEUsIFNJR19ERkwpCitzID0gc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCkKK2lmIHMgIT0gZGVmYXVsdF9pbnRfaGFuZGxlcjoKKyAgIHNpZ25hbChTSUdJTlQsIHMpCisKK2RlZiBkaWUobXNnLCAqYXJncyk6CisgICAgZm9yIGEgaW4gYXJnczoKKyAgICAgICAgbXNnID0gIiVzICVzIiAlIChtc2csIGEpCisgICAgcHJpbnQgImdpdC1wNGltcG9ydCBmYXRhbCBlcnJvcjoiLCBtc2cKKyAgICBzeXMuZXhpdCgxKQorCitkZWYgdXNhZ2UoKToKKyAgICBwcmludCAiVVNBR0U6IGdpdC1wNGltcG9ydCBbLXF8LXZdICBbLS1hdXRob3JzPTxmaWxlPl0gIFstdCA8dGltZXpvbmU+XSAgWy8vcDRyZXBvL3BhdGggPGJyYW5jaD5dIgorICAgIHN5cy5leGl0KDEpCisKK3ZlcmJvc2l0eSA9IDEKK2xvZ2ZpbGUgPSAiL2Rldi9udWxsIgoraWdub3JlX3dhcm5pbmdzID0gRmFsc2UKK3N0aXRjaCA9IDAKK3RhZ2FsbCA9IFRydWUKKworZGVmIHJlcG9ydChsZXZlbCwgbXNnLCAqYXJncyk6CisgICAgZ2xvYmFsIHZlcmJvc2l0eQorICAgIGdsb2JhbCBsb2dmaWxlCisgICAgZm9yIGEgaW4gYXJnczoKKyAgICAgICAgbXNnID0gIiVzICVzIiAlIChtc2csIGEpCisgICAgZmQgPSBvcGVuKGxvZ2ZpbGUsICJhIikKKyAgICBmZC53cml0ZWxpbmVzKG1zZykKKyAgICBmZC5jbG9zZSgpCisgICAgaWYgbGV2ZWwgPD0gdmVyYm9zaXR5OgorICAgICAgICBwcmludCBtc2cKKworY2xhc3MgcDRfY29tbWFuZDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgX3JlcG9wYXRoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZ2xvYmFsIGxvZ2ZpbGUKKyAgICAgICAgICAgIHNlbGYudXNlcmxpc3QgPSB7fQorICAgICAgICAgICAgaWYgX3JlcG9wYXRoWy0xXSA9PSAnLyc6CisgICAgICAgICAgICAgICAgc2VsZi5yZXBvcGF0aCA9IF9yZXBvcGF0aFs6LTFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucmVwb3BhdGggPSBfcmVwb3BhdGgKKyAgICAgICAgICAgIGlmIHNlbGYucmVwb3BhdGhbLTQ6XSAhPSAiLy4uLiI6CisgICAgICAgICAgICAgICAgc2VsZi5yZXBvcGF0aD0gIiVzLy4uLiIgJSBzZWxmLnJlcG9wYXRoCisgICAgICAgICAgICBmPW9zLnBvcGVuKCdwNCAtViAyPj4lcyclbG9nZmlsZSwgJ3JiJykKKyAgICAgICAgICAgIGEgPSBmLnJlYWRsaW5lcygpCisgICAgICAgICAgICBpZiBmLmNsb3NlKCk6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGRpZSgiQ291bGQgbm90IGZpbmQgdGhlIFwicDRcIiBjb21tYW5kIikKKworICAgIGRlZiBwNChzZWxmLCBjbWQsICphcmdzKToKKyAgICAgICAgZ2xvYmFsIGxvZ2ZpbGUKKyAgICAgICAgY21kID0gIiVzICVzIiAlIChjbWQsICcgJy5qb2luKGFyZ3MpKQorICAgICAgICByZXBvcnQoMiwgIlA0OiIsIGNtZCkKKyAgICAgICAgZj1vcy5wb3BlbigncDQgLUcgJXMgMj4+JXMnICUgKGNtZCxsb2dmaWxlKSwgJ3JiJykKKyAgICAgICAgbGlzdCA9IFtdCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZChtYXJzaGFsLmxvYWQoZikpCisgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBzZWxmLnJldCA9IGYuY2xvc2UoKQorICAgICAgICByZXR1cm4gbGlzdAorCisgICAgZGVmIHN5bmMoc2VsZiwgaWQsIGZvcmNlPUZhbHNlLCB0cmljaz1GYWxzZSwgdGVzdD1GYWxzZSk6CisgICAgICAgIGlmIGZvcmNlOgorICAgICAgICAgICAgcmV0ID0gc2VsZi5wNCgic3luYyAtZiAlc0AlcyIlKHNlbGYucmVwb3BhdGgsIGlkKSlbMF0KKyAgICAgICAgZWxpZiB0cmljazoKKyAgICAgICAgICAgIHJldCA9IHNlbGYucDQoInN5bmMgLWsgJXNAJXMiJShzZWxmLnJlcG9wYXRoLCBpZCkpWzBdCisgICAgICAgIGVsaWYgdGVzdDoKKyAgICAgICAgICAgIHJldCA9IHNlbGYucDQoInN5bmMgLW4gJXNAJXMiJShzZWxmLnJlcG9wYXRoLCBpZCkpWzBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXQgPSBzZWxmLnA0KCJzeW5jICAgICVzQCVzIiUoc2VsZi5yZXBvcGF0aCwgaWQpKVswXQorICAgICAgICBpZiByZXRbJ2NvZGUnXSA9PSAiZXJyb3IiOgorICAgICAgICAgICAgIGRhdGEgPSByZXRbJ2RhdGEnXS51cHBlcigpCisgICAgICAgICAgICAgaWYgZGF0YS5maW5kKCdWSUVXJykgPiAwOgorICAgICAgICAgICAgICAgICBkaWUoIlBlcmZvcmNlIHJlcG9ydHMgJXMgaXMgbm90IGluIGNsaWVudCB2aWV3IiUgc2VsZi5yZXBvcGF0aCkKKyAgICAgICAgICAgICBlbGlmIGRhdGEuZmluZCgnVVAtVE8tREFURScpIDwgMDoKKyAgICAgICAgICAgICAgICAgZGllKCJDb3VsZCBub3Qgc3luYyBmaWxlcyBmcm9tIHBlcmZvcmNlIiwgc2VsZi5yZXBvcGF0aCkKKworICAgIGRlZiBjaGFuZ2VzKHNlbGYsIHNpbmNlPTApOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBsaXN0ID0gW10KKyAgICAgICAgICAgIGZvciByZWMgaW4gc2VsZi5wNCgiY2hhbmdlcyAlc0AlcywjaGVhZCIgJSAoc2VsZi5yZXBvcGF0aCwgc2luY2UrMSkpOgorICAgICAgICAgICAgICAgIGxpc3QuYXBwZW5kKHJlY1snY2hhbmdlJ10pCisgICAgICAgICAgICBsaXN0LnJldmVyc2UoKQorICAgICAgICAgICAgcmV0dXJuIGxpc3QKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcmV0dXJuIFtdCisKKyAgICBkZWYgYXV0aG9ycyhzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGY9b3BlbihmaWxlbmFtZSkKKyAgICAgICAgZm9yIGwgaW4gZi5yZWFkbGluZXMoKToKKyAgICAgICAgICAgIHNlbGYudXNlcmxpc3RbbFs6bC5maW5kKCc9JyldLnJzdHJpcCgpXSA9IFwKKyAgICAgICAgICAgICAgICAgICAgKGxbbC5maW5kKCc9JykrMTpsLmZpbmQoJzwnKV0ucnN0cmlwKCksbFtsLmZpbmQoJzwnKSsxOmwuZmluZCgnPicpXSkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGZvciBmLGUgaW4gc2VsZi51c2VybGlzdC5pdGVtcygpOgorICAgICAgICAgICAgICAgIHJlcG9ydCgyLCBmLCAiOiIsIGVbMF0sICIgIDwiLCBlWzFdLCAiPiIpCisKKyAgICBkZWYgX2dldF91c2VyKHNlbGYsIGlkKToKKyAgICAgICAgaWYgbm90IHNlbGYudXNlcmxpc3QuaGFzX2tleShpZCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdXNlciA9IHNlbGYucDQoInVzZXJzIiwgaWQpWzBdCisgICAgICAgICAgICAgICAgc2VsZi51c2VybGlzdFtpZF0gPSAodXNlclsnRnVsbE5hbWUnXSwgdXNlclsnRW1haWwnXSkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBzZWxmLnVzZXJsaXN0W2lkXSA9IChpZCwgIiIpCisgICAgICAgIHJldHVybiBzZWxmLnVzZXJsaXN0W2lkXQorCisgICAgZGVmIF9mb3JtYXRfZGF0ZShzZWxmLCB0aWNrcyk6CisgICAgICAgIHN5bWJvbD0nKycKKyAgICAgICAgbmFtZSA9IHRpbWUudHpuYW1lWzBdCisgICAgICAgIG9mZnNldCA9IHRpbWUudGltZXpvbmUKKyAgICAgICAgaWYgdGlja3NbOF06CisgICAgICAgICAgICBuYW1lID0gdGltZS50em5hbWVbMV0KKyAgICAgICAgICAgIG9mZnNldCA9IHRpbWUuYWx0em9uZQorICAgICAgICBpZiBvZmZzZXQgPCAwOgorICAgICAgICAgICAgb2Zmc2V0ICo9IC0xCisgICAgICAgICAgICBzeW1ib2wgPSAnLScKKyAgICAgICAgbG9jYWxvID0gIiVzJTAyZCUwMmQgJXMiICUgKHN5bWJvbCwgb2Zmc2V0IC8gMzYwMCwgb2Zmc2V0ICUgMzYwMCwgbmFtZSkKKyAgICAgICAgdGlja3NvID0gdGltZS5zdHJmdGltZSgiJWEgJWIgJWQgJUg6JU06JVMgJVkiLCB0aWNrcykKKyAgICAgICAgcmV0dXJuICIlcyAlcyIgJSAodGlja3NvLCBsb2NhbG8pCisKKyAgICBkZWYgd2hlcmUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnA0KCJ3aGVyZSAlcyIgJSBzZWxmLnJlcG9wYXRoKVstMV1bJ3BhdGgnXQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByZXR1cm4gIiIKKworICAgIGRlZiBkZXNjcmliZShzZWxmLCBudW0pOgorICAgICAgICBkZXNjID0gc2VsZi5wNCgiZGVzY3JpYmUgLXMiLCBudW0pWzBdCisgICAgICAgIHNlbGYubXNnID0gZGVzY1snZGVzYyddCisgICAgICAgIHNlbGYuYXV0aG9yLCBzZWxmLmVtYWlsID0gc2VsZi5fZ2V0X3VzZXIoZGVzY1sndXNlciddKQorICAgICAgICBzZWxmLmRhdGUgPSBzZWxmLl9mb3JtYXRfZGF0ZSh0aW1lLmxvY2FsdGltZShsb25nKGRlc2NbJ3RpbWUnXSkpKQorICAgICAgICByZXR1cm4gc2VsZgorCitjbGFzcyBnaXRfY29tbWFuZDoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudmVyc2lvbiA9IHNlbGYuZ2l0KCItLXZlcnNpb24iKVswXVsxMjpdLnJzdHJpcCgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGRpZSgiQ291bGQgbm90IGZpbmQgdGhlIFwiZ2l0XCIgY29tbWFuZCIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZ2l0ZGlyID0gc2VsZi5nZXRfc2luZ2xlKCJyZXYtcGFyc2UgLS1naXQtZGlyIikKKyAgICAgICAgICAgIHJlcG9ydCgyLCAiZ2RpcjoiLCBzZWxmLmdpdGRpcikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZGllKCJOb3QgYSBnaXQgcmVwb3NpdG9yeS4uLiBkaWQgeW91IGZvcmdldCB0byBcImdpdCBpbml0XCIgPyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY2R1cCA9IHNlbGYuZ2V0X3NpbmdsZSgicmV2LXBhcnNlIC0tc2hvdy1jZHVwIikKKyAgICAgICAgICAgIGlmIHNlbGYuY2R1cCAhPSAiIjoKKyAgICAgICAgICAgICAgICBvcy5jaGRpcihzZWxmLmNkdXApCisgICAgICAgICAgICBzZWxmLnRvcGRpciA9IG9zLmdldGN3ZCgpCisgICAgICAgICAgICByZXBvcnQoMiwgInRvcGRpcjoiLCBzZWxmLnRvcGRpcikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZGllKCJDb3VsZCBub3QgZmluZCB0b3AgZ2l0IGRpcmVjdG9yeSIpCisKKyAgICBkZWYgZ2l0KHNlbGYsIGNtZCk6CisgICAgICAgIGdsb2JhbCBsb2dmaWxlCisgICAgICAgIHJlcG9ydCgyLCAiR0lUOiIsIGNtZCkKKyAgICAgICAgZj1vcy5wb3BlbignZ2l0ICVzIDI+PiVzJyAlIChjbWQsbG9nZmlsZSksICdyYicpCisgICAgICAgIHI9Zi5yZWFkbGluZXMoKQorICAgICAgICBzZWxmLnJldCA9IGYuY2xvc2UoKQorICAgICAgICByZXR1cm4gcgorCisgICAgZGVmIGdldF9zaW5nbGUoc2VsZiwgY21kKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2l0KGNtZClbMF0ucnN0cmlwKCkKKworICAgIGRlZiBjdXJyZW50X2JyYW5jaChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGVzdGl0ID0gc2VsZi5naXQoInJldi1wYXJzZSAtLXZlcmlmeSBIRUFEIilbMF0KKyAgICAgICAgICAgIHJldHVybiBzZWxmLmdpdCgic3ltYm9saWMtcmVmIEhFQUQiKVswXVsxMTpdLnJzdHJpcCgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgZ2V0X2NvbmZpZyhzZWxmLCB2YXJpYWJsZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmdpdCgiY29uZmlnIC0tZ2V0ICVzIiAlIHZhcmlhYmxlKVswXS5yc3RyaXAoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIHNldF9jb25maWcoc2VsZiwgdmFyaWFibGUsIHZhbHVlKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5naXQoImNvbmZpZyAlcyAlcyIlKHZhcmlhYmxlLCB2YWx1ZSkgKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBkaWUoIkNvdWxkIG5vdCBzZXQgJXMgdG8gIiAlIHZhcmlhYmxlLCB2YWx1ZSkKKworICAgIGRlZiBtYWtlX3RhZyhzZWxmLCBuYW1lLCBoZWFkKToKKyAgICAgICAgc2VsZi5naXQoInRhZyAtZiAlcyAlcyIlKG5hbWUsaGVhZCkpCisKKyAgICBkZWYgdG9wX2NoYW5nZShzZWxmLCBicmFuY2gpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBhPXNlbGYuZ2V0X3NpbmdsZSgibmFtZS1yZXYgLS10YWdzIHJlZnMvaGVhZHMvJXMiICUgYnJhbmNoKQorICAgICAgICAgICAgbG9jID0gYS5maW5kKCcgdGFncy8nKSArIDYKKyAgICAgICAgICAgIGlmIGFbbG9jOmxvYyszXSAhPSAicDQvIjoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgcmV0dXJuIGludChhW2xvYyszOl1bOi0yXSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiB1cGRhdGVfaW5kZXgoc2VsZik6CisgICAgICAgIHNlbGYuZ2l0KCJscy1maWxlcyAtbSAtZCAtbyAteiB8IGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgLXogLS1zdGRpbiIpCisKKyAgICBkZWYgY2hlY2tvdXQoc2VsZiwgYnJhbmNoKToKKyAgICAgICAgc2VsZi5naXQoImNoZWNrb3V0ICVzIiAlIGJyYW5jaCkKKworICAgIGRlZiByZXBvaW50X2hlYWQoc2VsZiwgYnJhbmNoKToKKyAgICAgICAgc2VsZi5naXQoInN5bWJvbGljLXJlZiBIRUFEIHJlZnMvaGVhZHMvJXMiICUgYnJhbmNoKQorCisgICAgZGVmIHJlbW92ZV9maWxlcyhzZWxmKToKKyAgICAgICAgc2VsZi5naXQoImxzLWZpbGVzIHwgeGFyZ3Mgcm0iKQorCisgICAgZGVmIGNsZWFuX2RpcmVjdG9yaWVzKHNlbGYpOgorICAgICAgICBzZWxmLmdpdCgiY2xlYW4gLWQiKQorCisgICAgZGVmIGZyZXNoX2JyYW5jaChzZWxmLCBicmFuY2gpOgorICAgICAgICByZXBvcnQoMSwgIkNyZWF0aW5nIG5ldyBicmFuY2giLCBicmFuY2gpCisgICAgICAgIHNlbGYuZ2l0KCJscy1maWxlcyB8IHhhcmdzIHJtIikKKyAgICAgICAgb3MucmVtb3ZlKCIuZ2l0L2luZGV4IikKKyAgICAgICAgc2VsZi5yZXBvaW50X2hlYWQoYnJhbmNoKQorICAgICAgICBzZWxmLmdpdCgiY2xlYW4gLWQiKQorCisgICAgZGVmIGJhc2VkaXIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRvcGRpcgorCisgICAgZGVmIGNvbW1pdChzZWxmLCBhdXRob3IsIGVtYWlsLCBkYXRlLCBtc2csIGlkKToKKyAgICAgICAgc2VsZi51cGRhdGVfaW5kZXgoKQorICAgICAgICBmZD1vcGVuKCIubXNnIiwgInciKQorICAgICAgICBmZC53cml0ZWxpbmVzKG1zZykKKyAgICAgICAgZmQuY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY3VycmVudCA9IHNlbGYuZ2V0X3NpbmdsZSgicmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQiKQorICAgICAgICAgICAgICAgIGhlYWQgPSAiLXAgSEVBRCIKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGN1cnJlbnQgPSAiIgorICAgICAgICAgICAgICAgIGhlYWQgPSAiIgorICAgICAgICB0cmVlID0gc2VsZi5nZXRfc2luZ2xlKCJ3cml0ZS10cmVlIikKKyAgICAgICAgZm9yIHIsbCBpbiBbKCdEQVRFJyxkYXRlKSwoJ05BTUUnLGF1dGhvciksKCdFTUFJTCcsZW1haWwpXToKKyAgICAgICAgICAgIG9zLmVudmlyb25bJ0dJVF9BVVRIT1JfJXMnJXJdID0gbAorICAgICAgICAgICAgb3MuZW52aXJvblsnR0lUX0NPTU1JVFRFUl8lcyclcl0gPSBsCisgICAgICAgIGNvbW1pdCA9IHNlbGYuZ2V0X3NpbmdsZSgiY29tbWl0LXRyZWUgJXMgJXMgPCAubXNnIiAlICh0cmVlLGhlYWQpKQorICAgICAgICBvcy5yZW1vdmUoIi5tc2ciKQorICAgICAgICBzZWxmLm1ha2VfdGFnKCJwNC8lcyIlaWQsIGNvbW1pdCkKKyAgICAgICAgc2VsZi5naXQoInVwZGF0ZS1yZWYgSEVBRCAlcyAlcyIgJSAoY29tbWl0LCBjdXJyZW50KSApCisKK3RyeToKKyAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICJxaHZ0OiIsCisgICAgICAgICAgICBbImF1dGhvcnM9IiwiaGVscCIsInN0aXRjaD0iLCJ0aW1lem9uZT0iLCJsb2c9IiwiaWdub3JlIiwibm90YWdzIl0pCitleGNlcHQgZ2V0b3B0LkdldG9wdEVycm9yOgorICAgIHVzYWdlKCkKKworZm9yIG8sIGEgaW4gb3B0czoKKyAgICBpZiBvID09ICItcSI6CisgICAgICAgIHZlcmJvc2l0eSA9IDAKKyAgICBpZiBvID09ICItdiI6CisgICAgICAgIHZlcmJvc2l0eSArPSAxCisgICAgaWYgbyBpbiAoIi0tbG9nIik6CisgICAgICAgIGxvZ2ZpbGUgPSBhCisgICAgaWYgbyBpbiAoIi0tbm90YWdzIik6CisgICAgICAgIHRhZ2FsbCA9IEZhbHNlCisgICAgaWYgbyBpbiAoIi1oIiwgIi0taGVscCIpOgorICAgICAgICB1c2FnZSgpCisgICAgaWYgbyBpbiAoIi0taWdub3JlIik6CisgICAgICAgIGlnbm9yZV93YXJuaW5ncyA9IFRydWUKKworZ2l0ID0gZ2l0X2NvbW1hbmQoKQorYnJhbmNoPWdpdC5jdXJyZW50X2JyYW5jaCgpCisKK2ZvciBvLCBhIGluIG9wdHM6CisgICAgaWYgbyBpbiAoIi10IiwgIi0tdGltZXpvbmUiKToKKyAgICAgICAgZ2l0LnNldF9jb25maWcoInBlcmZvcmNlLnRpbWV6b25lIiwgYSkKKyAgICBpZiBvIGluICgiLS1zdGl0Y2giKToKKyAgICAgICAgZ2l0LnNldF9jb25maWcoInBlcmZvcmNlLiVzLnBhdGgiICUgYnJhbmNoLCBhKQorICAgICAgICBzdGl0Y2ggPSAxCisKK2lmIGxlbihhcmdzKSA9PSAyOgorICAgIGJyYW5jaCA9IGFyZ3NbMV0KKyAgICBnaXQuY2hlY2tvdXQoYnJhbmNoKQorICAgIGlmIGJyYW5jaCA9PSBnaXQuY3VycmVudF9icmFuY2goKToKKyAgICAgICAgZGllKCJCcmFuY2ggJXMgYWxyZWFkeSBleGlzdHMhIiAlIGJyYW5jaCkKKyAgICByZXBvcnQoMSwgIlNldHRpbmcgcGVyZm9yY2UgdG8gIiwgYXJnc1swXSkKKyAgICBnaXQuc2V0X2NvbmZpZygicGVyZm9yY2UuJXMucGF0aCIgJSBicmFuY2gsIGFyZ3NbMF0pCitlbGlmIGxlbihhcmdzKSAhPSAwOgorICAgIGRpZSgiWW91IG11c3Qgc3BlY2lmeSB0aGUgcGVyZm9yY2UgLy9kZXBvdC9wYXRoIGFuZCBnaXQgYnJhbmNoIikKKworcDRwYXRoID0gZ2l0LmdldF9jb25maWcoInBlcmZvcmNlLiVzLnBhdGgiICUgYnJhbmNoKQoraWYgcDRwYXRoID09IE5vbmU6CisgICAgZGllKCJEbyBub3Qga25vdyBQZXJmb3JjZSAvL2RlcG90L3BhdGggZm9yIGdpdCBicmFuY2giLCBicmFuY2gpCisKK3A0ID0gcDRfY29tbWFuZChwNHBhdGgpCisKK2ZvciBvLCBhIGluIG9wdHM6CisgICAgaWYgbyBpbiAoIi1hIiwgIi0tYXV0aG9ycyIpOgorICAgICAgICBwNC5hdXRob3JzKGEpCisKK2xvY2FsZGlyID0gZ2l0LmJhc2VkaXIoKQoraWYgcDQud2hlcmUoKVs6bGVuKGxvY2FsZGlyKV0gIT0gbG9jYWxkaXI6CisgICAgcmVwb3J0KDEsICIqKldBUk5JTkcqKiBBcHBlYXJzIHA0IGNsaWVudCBpcyBtaXNjb25maWd1cmVkIikKKyAgICByZXBvcnQoMSwgIiAgIGZvciBzeW5jIGZyb20gJXMgdG8gJXMiICUgKHA0LnJlcG9wYXRoLCBsb2NhbGRpcikpCisgICAgaWYgaWdub3JlX3dhcm5pbmdzICE9IFRydWU6CisgICAgICAgIGRpZSgiUmVjb25maWd1cmUgb3IgdXNlIFwiLS1pZ25vcmVcIiBvbiBjb21tYW5kIGxpbmUiKQorCitpZiBzdGl0Y2ggPT0gMDoKKyAgICB0b3AgPSBnaXQudG9wX2NoYW5nZShicmFuY2gpCitlbHNlOgorICAgIHRvcCA9IDAKK2NoYW5nZXMgPSBwNC5jaGFuZ2VzKHRvcCkKK2NvdW50ID0gbGVuKGNoYW5nZXMpCitpZiBjb3VudCA9PSAwOgorICAgIHJlcG9ydCgxLCAiQWxyZWFkeSB1cCB0byBkYXRlLi4uIikKKyAgICBzeXMuZXhpdCgwKQorCitwdHogPSBnaXQuZ2V0X2NvbmZpZygicGVyZm9yY2UudGltZXpvbmUiKQoraWYgcHR6OgorICAgIHJlcG9ydCgxLCAiU2V0dGluZyB0aW1lem9uZSB0byIsIHB0eikKKyAgICBvcy5lbnZpcm9uWydUWiddID0gcHR6CisgICAgdGltZS50enNldCgpCisKK2lmIHN0aXRjaCA9PSAxOgorICAgIGdpdC5yZW1vdmVfZmlsZXMoKQorICAgIGdpdC5jbGVhbl9kaXJlY3RvcmllcygpCisgICAgcDQuc3luYyhjaGFuZ2VzWzBdLCBmb3JjZT1UcnVlKQorZWxpZiB0b3AgPT0gMCBhbmQgYnJhbmNoICE9IGdpdC5jdXJyZW50X2JyYW5jaCgpOgorICAgIHA0LnN5bmMoY2hhbmdlc1swXSwgdGVzdD1UcnVlKQorICAgIHJlcG9ydCgxLCAiQ3JlYXRpbmcgbmV3IGluaXRpYWwgY29tbWl0Iik7CisgICAgZ2l0LmZyZXNoX2JyYW5jaChicmFuY2gpCisgICAgcDQuc3luYyhjaGFuZ2VzWzBdLCBmb3JjZT1UcnVlKQorZWxzZToKKyAgICBwNC5zeW5jKGNoYW5nZXNbMF0sIHRyaWNrPVRydWUpCisKK3JlcG9ydCgxLCAicHJvY2Vzc2luZyAlcyBjaGFuZ2VzIGZyb20gcDQgKCVzKSB0byBnaXQgKCVzKSIgJSAoY291bnQsIHA0LnJlcG9wYXRoLCBicmFuY2gpKQorZm9yIGlkIGluIGNoYW5nZXM6CisgICAgcmVwb3J0KDEsICJJbXBvcnRpbmcgY2hhbmdlc2V0IiwgaWQpCisgICAgY2hhbmdlID0gcDQuZGVzY3JpYmUoaWQpCisgICAgcDQuc3luYyhpZCkKKyAgICBpZiB0YWdhbGwgOgorICAgICAgICAgICAgZ2l0LmNvbW1pdChjaGFuZ2UuYXV0aG9yLCBjaGFuZ2UuZW1haWwsIGNoYW5nZS5kYXRlLCBjaGFuZ2UubXNnLCBpZCkKKyAgICBlbHNlOgorICAgICAgICAgICAgZ2l0LmNvbW1pdChjaGFuZ2UuYXV0aG9yLCBjaGFuZ2UuZW1haWwsIGNoYW5nZS5kYXRlLCBjaGFuZ2UubXNnLCAiaW1wb3J0IikKKyAgICBpZiBzdGl0Y2ggPT0gMToKKyAgICAgICAgZ2l0LmNsZWFuX2RpcmVjdG9yaWVzKCkKKyAgICAgICAgc3RpdGNoID0gMApkaWZmIC0tZ2l0IGEvY29udHJpYi9wNGltcG9ydC9naXQtcDRpbXBvcnQudHh0IGIvY29udHJpYi9wNGltcG9ydC9naXQtcDRpbXBvcnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5Njc1ODcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3A0aW1wb3J0L2dpdC1wNGltcG9ydC50eHQKQEAgLTAsMCArMSwxNjcgQEAKK2dpdC1wNGltcG9ydCgxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1wNGltcG9ydCAtIEltcG9ydCBhIFBlcmZvcmNlIHJlcG9zaXRvcnkgaW50byBnaXQKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KK2BnaXQtcDRpbXBvcnRgIFstcXwtdl0gWy0tbm90YWdzXSBbLS1hdXRob3JzIDxmaWxlPl0gWy10IDx0aW1lem9uZT5dCisgICAgICAgICAgICAgICA8Ly9wNHJlcG8vcGF0aD4gPGJyYW5jaD4KK2BnaXQtcDRpbXBvcnRgIC0tc3RpdGNoIDwvL3A0cmVwby9wYXRoPgorYGdpdC1wNGltcG9ydGAKKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0ltcG9ydCBhIFBlcmZvcmNlIHJlcG9zaXRvcnkgaW50byBhbiBleGlzdGluZyBnaXQgcmVwb3NpdG9yeS4gIFdoZW4KK2EgPC8vcDRyZXBvL3BhdGg+IGFuZCA8YnJhbmNoPiBhcmUgc3BlY2lmaWVkIGEgbmV3IGJyYW5jaCB3aXRoIHRoZQorZ2l2ZW4gbmFtZSB3aWxsIGJlIGNyZWF0ZWQgYW5kIHRoZSBpbml0aWFsIGltcG9ydCB3aWxsIGJlZ2luLgorCitPbmNlIHRoZSBpbml0aWFsIGltcG9ydCBpcyBjb21wbGV0ZSB5b3UgY2FuIGRvIGFuIGluY3JlbWVudGFsIGltcG9ydAorb2YgbmV3IGNvbW1pdHMgZnJvbSB0aGUgUGVyZm9yY2UgcmVwb3NpdG9yeS4gIFlvdSBkbyB0aGlzIGJ5IGNoZWNraW5nCitvdXQgdGhlIGFwcHJvcHJpYXRlIGdpdCBicmFuY2ggYW5kIHRoZW4gcnVubmluZyBgZ2l0LXA0aW1wb3J0YCB3aXRob3V0Cithbnkgb3B0aW9ucy4KKworVGhlIHN0YW5kYXJkIHA0IGNsaWVudCBpcyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIFBlcmZvcmNlCityZXBvc2l0b3J5OyBpdCBtdXN0IGJlIGNvbmZpZ3VyZWQgY29ycmVjdGx5IGluIG9yZGVyIGZvciBgZ2l0LXA0aW1wb3J0YAordG8gb3BlcmF0ZSAoc2VlIGJlbG93KS4KKworCitPUFRJT05TCistLS0tLS0tCistcTo6CisJRG8gbm90IGRpc3BsYXkgYW55IHByb2dyZXNzIGluZm9ybWF0aW9uLgorCistdjo6CisgICAgICAgIEdpdmUgZXh0cmEgcHJvZ3Jlc3MgaW5mb3JtYXRpb24uCisKK1wtLWF1dGhvcnM6OgorCVNwZWNpZnkgYW4gYXV0aG9ycyBmaWxlIGNvbnRhaW5pbmcgYSBtYXBwaW5nIG9mIFBlcmZvcmNlIHVzZXIKKwlpZHMgdG8gZnVsbCBuYW1lcyBhbmQgZW1haWwgYWRkcmVzc2VzIChzZWUgTm90ZXMgYmVsb3cpLgorCitcLS1ub3RhZ3M6OgorCURvIG5vdCBjcmVhdGUgYSB0YWcgZm9yIGVhY2ggaW1wb3J0ZWQgY29tbWl0LgorCitcLS1zdGl0Y2g6OgorCUltcG9ydCB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIHBlcmZvcmNlIGJyYW5jaCBpbnRvIHRoZQorCWN1cnJlbnRseSBjaGVja2VkIG91dCBnaXQgYnJhbmNoLgorCitcLS1sb2c6OgorCVN0b3JlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgc3BlY2lmaWVkIGZpbGUuCisKKy10OjoKKwlTcGVjaWZ5IHRoYXQgdGhlIHJlbW90ZSByZXBvc2l0b3J5IGlzIGluIHRoZSBzcGVjaWZpZWQgdGltZXpvbmUuCisJVGltZXpvbmUgbXVzdCBiZSBpbiB0aGUgZm9ybWF0ICJVUy9QYWNpZmljIiBvciAiRXVyb3BlL0xvbmRvbiIKKwlldGMuICBZb3Ugb25seSBuZWVkIHRvIHNwZWNpZnkgdGhpcyBvbmNlLCBpdCB3aWxsIGJlIHNhdmVkIGluCisJdGhlIGdpdCBjb25maWcgZmlsZSBmb3IgdGhlIHJlcG9zaXRvcnkuCisKKzwvL3A0cmVwby9wYXRoPjo6CisJVGhlIFBlcmZvcmNlIHBhdGggdGhhdCB3aWxsIGJlIGltcG9ydGVkIGludG8gdGhlIHNwZWNpZmllZCBicmFuY2guCisKKzxicmFuY2g+OjoKKwlUaGUgbmV3IGJyYW5jaCB0aGF0IHdpbGwgYmUgY3JlYXRlZCB0byBob2xkIHRoZSBQZXJmb3JjZSBpbXBvcnRzLgorCisKK1A0IENsaWVudAorLS0tLS0tLS0tCitZb3UgbXVzdCBtYWtlIHRoZSBgcDRgIGNsaWVudCBjb21tYW5kIGF2YWlsYWJsZSBpbiB5b3VyICRQQVRIIGFuZAorY29uZmlndXJlIGl0IHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHRhcmdldCBQZXJmb3JjZSByZXBvc2l0b3J5LgorVHlwaWNhbGx5IHRoaXMgbWVhbnMgeW91IG11c3Qgc2V0IHRoZSAiJFA0UE9SVCIgYW5kICIkUDRDTElFTlQiCitlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisKK1lvdSBtdXN0IGFsc28gY29uZmlndXJlIGEgYHA0YCBjbGllbnQgInZpZXciIHdoaWNoIG1hcHMgdGhlIFBlcmZvcmNlCiticmFuY2ggaW50byB0aGUgdG9wIGxldmVsIG9mIHlvdXIgZ2l0IHJlcG9zaXRvcnksIGZvciBleGFtcGxlOgorCistLS0tLS0tLS0tLS0KK0NsaWVudDogbXlob3N0CisKK1Jvb3Q6ICAgL2hvbWUvc2Vhbi9pbXBvcnQKKworT3B0aW9uczogICBub2FsbHdyaXRlIGNsb2JiZXIgbm9jb21wcmVzcyB1bmxvY2tlZCBtb2R0aW1lIHJtZGlyCisKK1ZpZXc6CisgICAgICAgIC8vcHVibGljL2phbS8uLi4gLy9teWhvc3QvamFtLy4uLgorLS0tLS0tLS0tLS0tCisKK1dpdGggdGhlIGFib3ZlIGBwNGAgY2xpZW50IHNldHVwLCB5b3UgY291bGQgaW1wb3J0IHRoZSAiamFtIgorcGVyZm9yY2UgYnJhbmNoIGludG8gYSBicmFuY2ggbmFtZWQgImphbW15IiwgbGlrZSBzbzoKKworLS0tLS0tLS0tLS0tCiskIG1rZGlyIC1wIC9ob21lL3NlYW4vaW1wb3J0L2phbQorJCBjZCAvaG9tZS9zZWFuL2ltcG9ydC9qYW0KKyQgZ2l0IGluaXQKKyQgZ2l0IHA0aW1wb3J0IC8vcHVibGljL2phbSBqYW1teQorLS0tLS0tLS0tLS0tCisKKworTXVsdGlwbGUgQnJhbmNoZXMKKy0tLS0tLS0tLS0tLS0tLS0tCitOb3RlIHRoYXQgYnkgY3JlYXRpbmcgbXVsdGlwbGUgInZpZXdzIiB5b3UgY2FuIHVzZSBgZ2l0LXA0aW1wb3J0YAordG8gaW1wb3J0IGFkZGl0aW9uYWwgYnJhbmNoZXMgaW50byB0aGUgc2FtZSBnaXQgcmVwb3NpdG9yeS4KK0hvd2V2ZXIsIHRoZSBgcDRgIGNsaWVudCBoYXMgYSBsaW1pdGF0aW9uIGluIHRoYXQgaXQgc2lsZW50bHkKK2lnbm9yZXMgYWxsIGJ1dCB0aGUgbGFzdCAidmlldyIgdGhhdCBtYXBzIGludG8gdGhlIHNhbWUgbG9jYWwKK2RpcmVjdG9yeS4gIFNvIHRoZSBmb2xsb3dpbmcgd2lsbCAqbm90KiB3b3JrOgorCistLS0tLS0tLS0tLS0KK1ZpZXc6CisgICAgICAgIC8vcHVibGljL2phbS8uLi4gLy9teWhvc3QvamFtLy4uLgorICAgICAgICAvL3B1YmxpYy9vdGhlci8uLi4gLy9teWhvc3QvamFtLy4uLgorICAgICAgICAvL3B1YmxpYy9ndWVzdC8uLi4gLy9teWhvc3QvamFtLy4uLgorLS0tLS0tLS0tLS0tCisKK0lmIHlvdSB3YW50IG1vcmUgdGhhbiBvbmUgUGVyZm9yY2UgYnJhbmNoIHRvIGJlIGltcG9ydGVkIGludG8gdGhlCitzYW1lIGRpcmVjdG9yeSB5b3UgbXVzdCBlbXBsb3kgYSB3b3JrYXJvdW5kLiAgQSBzaW1wbGUgb3B0aW9uIGlzCit0byBhZGp1c3QgeW91ciBgcDRgIGNsaWVudCBiZWZvcmUgZWFjaCBpbXBvcnQgdG8gb25seSBpbmNsdWRlIGEKK3NpbmdsZSB2aWV3LgorCitBbm90aGVyIG9wdGlvbiBpcyB0byBjcmVhdGUgbXVsdGlwbGUgc3ltbGlua3MgbG9jYWxseSB3aGljaCBhbGwKK3BvaW50IHRvIHRoZSBzYW1lIGRpcmVjdG9yeSBpbiB5b3VyIGdpdCByZXBvc2l0b3J5IGFuZCB0aGVuIHVzZQorb25lIHBlciAidmlldyIgaW5zdGVhZCBvZiBsaXN0aW5nIHRoZSBhY3R1YWwgZGlyZWN0b3J5LgorCisKK1RhZ3MKKy0tLS0KK0EgZ2l0IHRhZyBvZiB0aGUgZm9ybSBwNC94eCBpcyBjcmVhdGVkIGZvciBldmVyeSBjaGFuZ2UgaW1wb3J0ZWQgZnJvbQordGhlIFBlcmZvcmNlIHJlcG9zaXRvcnkgd2hlcmUgeHggaXMgdGhlIFBlcmZvcmNlIGNoYW5nZXNldCBudW1iZXIuCitUaGVyZWZvcmUgYWZ0ZXIgdGhlIGltcG9ydCB5b3UgY2FuIHVzZSBnaXQgdG8gYWNjZXNzIGFueSBjb21taXQgYnkgaXRzCitQZXJmb3JjZSBudW1iZXIsIGUuZy4gZ2l0IHNob3cgcDQvMzI3LgorCitUaGUgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGUgSEVBRCBjb21taXQgaXMgYWxzbyBob3cgYGdpdC1wNGltcG9ydGAKK2RldGVybWluZXMgaWYgdGhlcmUgYXJlIG5ldyBjaGFuZ2VzIHRvIGluY3JlbWVudGFsbHkgaW1wb3J0IGZyb20gdGhlCitQZXJmb3JjZSByZXBvc2l0b3J5LgorCitJZiB5b3UgaW1wb3J0IGZyb20gYSByZXBvc2l0b3J5IHdpdGggbWFueSB0aG91c2FuZHMgb2YgY2hhbmdlcworeW91IHdpbGwgaGF2ZSBhbiBlcXVhbCBudW1iZXIgb2YgcDQveHh4eCBnaXQgdGFncy4gIEdpdCB0YWdzIGNhbgorYmUgZXhwZW5zaXZlIGluIHRlcm1zIG9mIGRpc2sgc3BhY2UgYW5kIHJlcG9zaXRvcnkgb3BlcmF0aW9ucy4KK0lmIHlvdSBkb24ndCBuZWVkIHRvIHBlcmZvcm0gZnVydGhlciBpbmNyZW1lbnRhbCBpbXBvcnRzLCB5b3UKK21heSBkZWxldGUgdGhlIHRhZ3MuCisKKworTm90ZXMKKy0tLS0tCitZb3UgY2FuIGludGVycnVwdCB0aGUgaW1wb3J0IChlLmcuIGN0cmwtYykgYXQgYW55IHRpbWUgYW5kIHJlc3RhcnQgaXQKK3dpdGhvdXQgd29ycnkuCisKK0F1dGhvciBpbmZvcm1hdGlvbiBpcyBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQgYnkgcXVlcnlpbmcgdGhlCitQZXJmb3JjZSAidXNlcnMiIHRhYmxlIHVzaW5nIHRoZSBpZCBhc3NvY2lhdGVkIHdpdGggZWFjaCBjaGFuZ2UuCitIb3dldmVyLCBpZiB5b3Ugd2FudCB0byBtYW51YWxseSBzdXBwbHkgdGhlc2UgbWFwcGluZ3MgeW91IGNhbiBkbworc28gd2l0aCB0aGUgIi0tYXV0aG9ycyIgb3B0aW9uLiAgSXQgYWNjZXB0cyBhIGZpbGUgY29udGFpbmluZyBhIGxpc3QKK29mIG1hcHBpbmdzIHdpdGggZWFjaCBsaW5lIGNvbnRhaW5pbmcgb25lIG1hcHBpbmcgaW4gdGhlIGZvcm1hdDoKKworLS0tLS0tLS0tLS0tCisgICAgcGVyZm9yY2VfaWQgPSBGdWxsIE5hbWUgPGVtYWlsQGFkZHJlc3MuY29tPgorLS0tLS0tLS0tLS0tCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgU2VhbiBFc3RhYnJvb2tzIDxzZWFubGttbEBzeW1wYXRpY28uY2E+CisKKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9jb250cmliL3BhdGNoZXMvZG9jYm9vay14c2wtbWFucGFnZXMtY2hhcm1hcC5wYXRjaCBiL2NvbnRyaWIvcGF0Y2hlcy9kb2Nib29rLXhzbC1tYW5wYWdlcy1jaGFybWFwLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYjA4YjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3BhdGNoZXMvZG9jYm9vay14c2wtbWFucGFnZXMtY2hhcm1hcC5wYXRjaApAQCAtMCwwICsxLDIxIEBACitGcm9tOiBJc21haWwgRMO2bm1leiA8aXNtYWlsQHBhcmR1cy5vcmcudHI+CisKK1RyeWluZyB0byBidWlsZCB0aGUgZG9jdW1lbnRhdGlvbiB3aXRoIGRvY2Jvb2steHNsIDEuNzMgbWF5IHJlc3VsdCBpbgordGhlIGZvbGxvd2luZyBlcnJvci4gIFRoaXMgcGF0Y2ggZml4ZXMgaXQuCisKKyQgeG1sdG8gLW0gY2FsbG91dHMueHNsIG1hbiBnaXQtYWRkLnhtbAorcnVudGltZSBlcnJvcjogZmlsZQorZmlsZTovLy91c3Ivc2hhcmUvc2dtbC9kb2Nib29rL3hzbC1zdHlsZXNoZWV0cy0xLjczLjAvbWFucGFnZXMvb3RoZXIueHNsIGxpbmUKKzEyOSBlbGVtZW50IGNhbGwtdGVtcGxhdGUKK1RoZSBjYWxsZWQgdGVtcGxhdGUgJ3JlYWQtY2hhcmFjdGVyLW1hcCcgd2FzIG5vdCBmb3VuZC4KKworLS0tIGRvY2Jvb2steHNsLTEuNzMuMC9tYW5wYWdlcy9kb2Nib29rLnhzbC5tYW5wYWdlcy1jaGFybWFwCTIwMDctMDctMjMgMTY6MjQ6MjMuMDAwMDAwMDAwICswMTAwCisrKysgZG9jYm9vay14c2wtMS43My4wL21hbnBhZ2VzL2RvY2Jvb2sueHNsCTIwMDctMDctMjMgMTY6MjU6MTYuMDAwMDAwMDAwICswMTAwCitAQCAtMzcsNiArMzcsNyBAQAorICAgPHhzbDppbmNsdWRlIGhyZWY9Imxpc3RzLnhzbCIvPgorICAgPHhzbDppbmNsdWRlIGhyZWY9ImVuZG5vdGVzLnhzbCIvPgorICAgPHhzbDppbmNsdWRlIGhyZWY9InRhYmxlLnhzbCIvPgorKyAgPHhzbDppbmNsdWRlIGhyZWY9Ii4uL2NvbW1vbi9jaGFybWFwLnhzbCIvPgorCisgICA8IS0tICogd2UgcmVuYW1lIHRoZSBmb2xsb3dpbmcganVzdCB0byBhdm9pZCB1c2luZyBwYXJhbXMgd2l0aCAibWFuIiAtLT4KKyAgIDwhLS0gKiBwcmVmaXhlcyBpbiB0aGUgdGFibGUueHNsIHN0eWxlc2hlZXQgKGJlY2F1c2UgdGhhdCBzdHlsZXNoZWV0IC0tPgpkaWZmIC0tZ2l0IGEvY29udHJpYi9yZW1vdGVzMmNvbmZpZy5zaCBiL2NvbnRyaWIvcmVtb3RlczJjb25maWcuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWNkYTE5ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvcmVtb3RlczJjb25maWcuc2gKQEAgLTAsMCArMSwzMyBAQAorIyEvYmluL3NoCisKKyMgVXNlIHRoaXMgdG9vbCB0byByZXdyaXRlIHlvdXIgLmdpdC9yZW1vdGVzLyBmaWxlcyBpbnRvIHRoZSBjb25maWcuCisKKy4gZ2l0LXNoLXNldHVwCisKK2lmIFsgLWQgIiRHSVRfRElSIi9yZW1vdGVzIF07IHRoZW4KKwllY2hvICJSZXdyaXRpbmcgJEdJVF9ESVIvcmVtb3RlcyIgPiYyCisJZXJyb3I9MAorCSMgcmV3cml0ZSBpbnRvIGNvbmZpZworCXsKKwkJY2QgIiRHSVRfRElSIi9yZW1vdGVzCisJCWxzIHwgd2hpbGUgcmVhZCBmOyBkbworCQkJbmFtZT0kKHByaW50ZiAiJGYiIHwgdHIgLWMgIkEtWmEtejAtOS0iICIuIikKKwkJCXNlZCAtbiBcCisJCQktZSAicy9eVVJMOlsgCV0qXCguKlwpJC9yZW1vdGUuJG5hbWUudXJsIFwxIC4vcCIgXAorCQkJLWUgInMvXlB1bGw6WyAJXSpcKC4qXCkkL3JlbW90ZS4kbmFtZS5mZXRjaCBcMSBeJCAvcCIgXAorCQkJLWUgInMvXlB1c2g6WyAJXSpcKC4qXCkkL3JlbW90ZS4kbmFtZS5wdXNoIFwxIF4kIC9wIiBcCisJCQk8ICIkZiIKKwkJZG9uZQorCQllY2hvIGRvbmUKKwl9IHwgd2hpbGUgcmVhZCBrZXkgdmFsdWUgcmVnZXg7IGRvCisJCWNhc2UgJGtleSBpbgorCQlkb25lKQorCQkJaWYgWyAkZXJyb3IgPSAwIF07IHRoZW4KKwkJCQltdiAiJEdJVF9ESVIiL3JlbW90ZXMgIiRHSVRfRElSIi9yZW1vdGVzLm9sZAorCQkJZmkgOzsKKwkJKikKKwkJCWVjaG8gImdpdCBjb25maWcgJGtleSAiJHZhbHVlIiAkcmVnZXgiCisJCQlnaXQgY29uZmlnICRrZXkgIiR2YWx1ZSIgJHJlZ2V4IHx8IGVycm9yPTEgOzsKKwkJZXNhYworCWRvbmUKK2ZpCmRpZmYgLS1naXQgYS9jb250cmliL3N0YXRzL2dpdC1jb21tb24taGFzaCBiL2NvbnRyaWIvc3RhdHMvZ2l0LWNvbW1vbi1oYXNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUyN2ZkMDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3N0YXRzL2dpdC1jb21tb24taGFzaApAQCAtMCwwICsxLDI2IEBACisjIS9iaW4vc2gKKworIyBUaGlzIHNjcmlwdCBkaXNwbGF5cyB0aGUgZGlzdHJpYnV0aW9uIG9mIGxvbmdlc3QgY29tbW9uIGhhc2ggcHJlZml4ZXMuCisjIFRoaXMgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBtaW5pbXVtIHByZWZpeCBsZW5ndGggdG8gdXNlCisjIGZvciBvYmplY3QgbmFtZXMgdG8gYmUgdW5pcXVlLgorCitnaXQgcmV2LWxpc3QgLS1vYmplY3RzIC0tYWxsIHwgc29ydCB8IHBlcmwgLWxuZSAnCisgIHN1YnN0cigkXywgNDApID0gIiI7CisgICMgdW5jb21tZW50IG5leHQgbGluZSBmb3IgYSBkaXN0cmlidXRpb24gb2YgYml0cyBpbnN0ZWFkIG9mIGhleCBjaGFycworICAjICRfID0gdW5wYWNrKCJCKiIscGFjaygiSCoiLCRfKSk7CisgIGlmIChkZWZpbmVkICRwKSB7CisgICAgKCRwIF4gJF8pID1+IC9eKFwwKikvOworICAgICRjb21tb24gPSBsZW5ndGggJDE7CisgICAgaWYgKGRlZmluZWQgJHBjb21tb24pIHsKKyAgICAgICRjb3VudFskcGNvbW1vbiA+ICRjb21tb24gPyAkcGNvbW1vbiA6ICRjb21tb25dKys7CisgICAgfSBlbHNlIHsKKyAgICAgICRjb3VudFskY29tbW9uXSsrOyAjIGZpcnN0IGl0ZW0KKyAgICB9CisgIH0KKyAgJHAgPSAkXzsKKyAgJHBjb21tb24gPSAkY29tbW9uOworICBFTkQgeworICAgICRjb3VudFskY29tbW9uXSsrOyAjIGxhc3QgaXRlbQorICAgIHByaW50ICIkXzogJGNvdW50WyRfXSIgZm9yIDAuLiQjY291bnQ7CisgIH0KKycKZGlmZiAtLWdpdCBhL2NvbnRyaWIvc3RhdHMvbWFpbG1hcC5wbCBiL2NvbnRyaWIvc3RhdHMvbWFpbG1hcC5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40Yjg1MmUyCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9zdGF0cy9tYWlsbWFwLnBsCkBAIC0wLDAgKzEsMzggQEAKKyMhL3Vzci9iaW4vcGVybCAtdworbXkgJW1haWxtYXAgPSAoKTsKK29wZW4gSSwgIjwiLCAiLm1haWxtYXAiOword2hpbGUgKDxJPikgeworCWNob21wOworCW5leHQgaWYgL14jLzsKKwlpZiAobXkgKCRhdXRob3IsICRtYWlsKSA9IC9eKC4qPylccys8KC4rKT4kLykgeworCQkkbWFpbG1hcHskbWFpbH0gPSAkYXV0aG9yOworCX0KK30KK2Nsb3NlIEk7CisKK215ICVtYWlsMmF1dGhvciA9ICgpOworb3BlbiBJLCAiZ2l0IGxvZyAtLXByZXR0eT0nZm9ybWF0OiVhZQklYW4nIHwiOword2hpbGUgKDxJPikgeworCWNob21wOworCW15ICgkbWFpbCwgJGF1dGhvcikgPSBzcGxpdCgvXHQvLCAkXyk7CisJbmV4dCBpZiBleGlzdHMgJG1haWxtYXB7JG1haWx9OworCSRtYWlsMmF1dGhvcnskbWFpbH0gfHw9IHt9OworCSRtYWlsMmF1dGhvcnskbWFpbH17JGF1dGhvcn0gfHw9IDA7CisJJG1haWwyYXV0aG9yeyRtYWlsfXskYXV0aG9yfSsrOworfQorY2xvc2UgSTsKKword2hpbGUgKG15ICgkbWFpbCwgJGF1dGhvcmNvdW50KSA9IGVhY2ggJW1haWwyYXV0aG9yKSB7CisJIyAlJGF1dGhvcmNvdW50IGlzICgkYXV0aG9yID0+ICRjb3VudCk7CisJIyBzb3J0IGFuZCBzaG93IHRoZSBuYW1lcyBmcm9tIHRoZSBtb3N0IGZyZXF1ZW50IG9uZXMuCisJbXkgQG5hbWVzID0gKG1hcCB7ICRfLT5bMF0gfQorCQlzb3J0IHsgJGItPlsxXSA8PT4gJGEtPlsxXSB9CisJCW1hcCB7IFskXywgJGF1dGhvcmNvdW50LT57JF99XSB9CisJCWtleXMgJSRhdXRob3Jjb3VudCk7CisJaWYgKDEgPCBAbmFtZXMpIHsKKwkJZm9yIChAbmFtZXMpIHsKKwkJCXByaW50ICIkXyA8JG1haWw+XG4iOworCQl9CisJfQorfQorCmRpZmYgLS1naXQgYS9jb250cmliL3N0YXRzL3BhY2tpbmZvLnBsIGIvY29udHJpYi9zdGF0cy9wYWNraW5mby5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNGE3YjYyCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9zdGF0cy9wYWNraW5mby5wbApAQCAtMCwwICsxLDIxMiBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjIFRoaXMgdG9vbCB3aWxsIHByaW50IHZhZ3VlbHkgcHJldHR5IGluZm9ybWF0aW9uIGFib3V0IGEgcGFjay4gIEl0CisjIGV4cGVjdHMgdGhlIG91dHB1dCBvZiAiZ2l0LXZlcmlmeS1wYWNrIC12IiBhcyBpbnB1dCBvbiBzdGRpbi4KKyMKKyMgJCBnaXQtdmVyaWZ5LXBhY2sgLXYgfCBwYWNraW5mby5wbAorIworIyBUaGlzIHByaW50cyBzb21lIGZ1bGwtcGFjayBzdGF0aXN0aWNzOyBjdXJyZW50bHkgImFsbCBzaXplcyIsICJhbGwKKyMgcGF0aCBzaXplcyIsICJ0cmVlIHNpemVzIiwgInRyZWUgcGF0aCBzaXplcyIsIGFuZCAiZGVwdGhzIi4KKyMKKyMgKiAiYWxsIHNpemVzIiBzdGF0cyBhcmUgYWNyb3NzIGV2ZXJ5IG9iamVjdCBzaXplIGluIHRoZSBmaWxlOworIyAgIGZ1bGwgc2l6ZXMgZm9yIGJhc2Ugb2JqZWN0cywgYW5kIGRlbHRhIHNpemUgZm9yIGRlbHRhcy4KKyMgKiAiYWxsIHBhdGggc2l6ZXMiIHN0YXRzIGFyZSBhY3Jvc3MgYWxsIG9iamVjdCdzICJwYXRoIHNpemVzIi4KKyMgICBBIHBhdGggc2l6ZSBpcyB0aGUgc3VtIG9mIHRoZSBzaXplIG9mIHRoZSBkZWx0YSBjaGFpbiwgaW5jbHVkaW5nIHRoZQorIyAgIGJhc2Ugb2JqZWN0LiAgSW4gb3RoZXIgd29yZHMsIGl0J3MgaG93IG1hbnkgYnl0ZXMgbmVlZCBiZSByZWFkIHRvCisjICAgcmVhc3NlbWJsZSB0aGUgZmlsZSBmcm9tIGRlbHRhcy4KKyMgKiAidHJlZSBzaXplcyIgYXJlIG9iamVjdCBzaXplcyBncm91cGVkIGludG8gZGVsdGEgdHJlZXMuCisjICogInRyZWUgcGF0aCBzaXplcyIgYXJlIHBhdGggc2l6ZXMgZ3JvdXBlZCBpbnRvIGRlbHRhIHRyZWVzLgorIyAqICJkZXB0aHMiIHNob3VsZCBiZSBvYnZpb3VzLgorIworIyBXaGVuIHJ1biBhczoKKyMKKyMgJCBnaXQtdmVyaWZ5LXBhY2sgLXYgfCBwYWNraW5mby5wbCAtdHJlZQorIworIyB0aGUgdHJlZXMgb2Ygb2JqZWN0cyBhcmUgb3V0cHV0IGFsb25nIHdpdGggdGhlIHN0YXRzLiAgVGhpcyBsb29rcworIyBsaWtlOgorIworIyAgIDAgY29tbWl0IDAzMTMyMWM2Li4uICAgICAgODAzICAgICAgODAzCisjCisjICAgMCAgIGJsb2IgMDMxNTZmMjEuLi4gICAgIDE3NjcgICAgIDE3NjcKKyMgICAxICAgIGJsb2IgZjUyYTlkN2YuLi4gICAgICAgMTAgICAgIDE3NzcKKyMgICAyICAgICBibG9iIGE4Y2M1NzM5Li4uICAgICAgIDUxICAgICAxODI4CisjICAgMyAgICAgIGJsb2IgNjYwZTkwYjEuLi4gICAgICAgMTUgICAgIDE4NDMKKyMgICA0ICAgICAgIGJsb2IgMGNiOGUzYmIuLi4gICAgICAgMzMgICAgIDE4NzYKKyMgICAyICAgICBibG9iIGU0ODYwN2YwLi4uICAgICAgMzExICAgICAyMDg4CisjICAgICAgc2l6ZTogY291bnQgNiB0b3RhbCAyMTg3IG1pbiAxMCBtYXggMTc2NyBtZWFuIDM2NC41MCBtZWRpYW4gNTEgc3RkX2RldiA2MzUuODUKKyMgcGF0aCBzaXplOiBjb3VudCA2IHRvdGFsIDExMTc5IG1pbiAxNzY3IG1heCAyMDg4IG1lYW4gMTg2My4xNyBtZWRpYW4gMTg0MyBzdGRfZGV2IDEwNy4yNgorIworIyBUaGUgZmlyc3QgbnVtYmVyIGFmdGVyIHRoZSBzaGExIGlzIHRoZSBvYmplY3Qgc2l6ZSwgdGhlIHNlY29uZAorIyBudW1iZXIgaXMgdGhlIHBhdGggc2l6ZS4gIFRoZSBzdGF0aXN0aWNzIGFyZSBhY3Jvc3MgYWxsIG9iamVjdHMgaW4KKyMgdGhlIHByZXZpb3VzIGRlbHRhIHRyZWUuICBPYnZpb3VzbHkgdGhleSBhcmUgb21pdHRlZCBmb3IgdHJlZXMgb2YKKyMgb25lIG9iamVjdC4KKyMKKyMgV2hlbiBydW4gYXM6CisjCisjICQgZ2l0LXZlcmlmeS1wYWNrIC12IHwgcGFja2luZm8ucGwgLXRyZWUgLWZpbGVuYW1lcworIworIyBpdCBhZGRzIGZpbGVuYW1lcyB0byB0aGUgdHJlZS4gIEdldHRpbmcgdGhpcyBpbmZvcm1hdGlvbiBpcyBzbG93OgorIworIyAgIDAgICBibG9iIDAzMTU2ZjIxLi4uICAgICAxNzY3ICAgICAxNzY3IERvY3VtZW50YXRpb24vZ2l0LWxvc3QtZm91bmQudHh0IEAgdGFncy92MS4yLjB+MTQyCisjICAgMSAgICBibG9iIGY1MmE5ZDdmLi4uICAgICAgIDEwICAgICAxNzc3IERvY3VtZW50YXRpb24vZ2l0LWxvc3QtZm91bmQudHh0IEAgdGFncy92MS41LjAtcmMxfjc0CisjICAgMiAgICAgYmxvYiBhOGNjNTczOS4uLiAgICAgICA1MSAgICAgMTgyOCBEb2N1bWVudGF0aW9uL2dpdC1sb3N0K2ZvdW5kLnR4dCBAIHRhZ3MvdjAuOTkuOWheMAorIyAgIDMgICAgICBibG9iIDY2MGU5MGIxLi4uICAgICAgIDE1ICAgICAxODQzIERvY3VtZW50YXRpb24vZ2l0LWxvc3QrZm91bmQudHh0IEAgbWFzdGVyfjMyMjJeMn4yCisjICAgNCAgICAgICBibG9iIDBjYjhlM2JiLi4uICAgICAgIDMzICAgICAxODc2IERvY3VtZW50YXRpb24vZ2l0LWxvc3QrZm91bmQudHh0IEAgbWFzdGVyfjMyMjJeMn4zCisjICAgMiAgICAgYmxvYiBlNDg2MDdmMC4uLiAgICAgIDMxMSAgICAgMjA4OCBEb2N1bWVudGF0aW9uL2dpdC1sb3N0LWZvdW5kLnR4dCBAIHRhZ3MvdjEuNS4yLXJjM340CisjICAgICAgc2l6ZTogY291bnQgNiB0b3RhbCAyMTg3IG1pbiAxMCBtYXggMTc2NyBtZWFuIDM2NC41MCBtZWRpYW4gNTEgc3RkX2RldiA2MzUuODUKKyMgcGF0aCBzaXplOiBjb3VudCA2IHRvdGFsIDExMTc5IG1pbiAxNzY3IG1heCAyMDg4IG1lYW4gMTg2My4xNyBtZWRpYW4gMTg0MyBzdGRfZGV2IDEwNy4yNgorIworIyBXaGVuIHJ1biBhczoKKyMKKyMgJCBnaXQtdmVyaWZ5LXBhY2sgLXYgfCBwYWNraW5mby5wbCAtZHVtcAorIworIyBpdCBwcmludHMgb3V0ICJzaGExIHNpemUgcGF0aHNpemUgZGVwdGgiIGZvciBlYWNoIHNoYTEgaW4gbGV4aWNhbAorIyBvcmRlci4KKyMKKyMgMDAwMDc5YTJlYWVmMTdiN2VhZTcwZTFmMGY2MzU1NTdlYTY3YjY0NCAzMCA0NzIgNworIyAwMDAxM2NhZmU2OTgwNDExYWE2ZmRkOTQwNzg0OTE3YjVmZjUwZjBhIDQ0IDE1NDIgNAorIyAwMDAxODJlYWNmOTljZGUyN2Q1OTE2YWE0MTU5MjE5MjRiODI5NzJjIDQ5OSA0OTkgMAorIyAuLi4KKyMKKyMgVGhpcyBpcyBoYW5keSBmb3IgY29tcGFyaW5nIHR3byBwYWNrcy4gIEFkZGluZyAiLWZpbGVuYW1lcyIgd2lsbCBhZGQKKyMgZmlsZW5hbWVzLCBhcyBwZXIgIi10cmVlIC1maWxlbmFtZXMiIGFib3ZlLgorCit1c2Ugc3RyaWN0OwordXNlIEdldG9wdDo6TG9uZzsKKworbXkgJGZpbGVuYW1lcyA9IDA7CitteSAkdHJlZSA9IDA7CitteSAkZHVtcCA9IDA7CitHZXRPcHRpb25zKCJ0cmVlIiA9PiBcJHRyZWUsCisgICAgICAgICAgICJmaWxlbmFtZXMiID0+IFwkZmlsZW5hbWVzLAorICAgICAgICAgICAiZHVtcCIgPT4gXCRkdW1wKTsKKworbXkgJXBhcmVudHM7CitteSAlY2hpbGRyZW47CitteSAlc2l6ZXM7CitteSBAcm9vdHM7CitteSAlcGF0aHM7CitteSAldHlwZXM7CitteSBAY29tbWl0czsKK215ICVuYW1lczsKK215ICVkZXB0aHM7CitteSBAZGVwdGhzOworCit3aGlsZSAoPFNURElOPikgeworICAgIG15ICgkc2hhMSwgJHR5cGUsICRzaXplLCAkc3BhY2UsICRvZmZzZXQsICRkZXB0aCwgJHBhcmVudCkgPSBzcGxpdCgvXHMrLywgJF8pOworICAgIG5leHQgdW5sZXNzICgkc2hhMSA9fiAvXlswLTlhLWZdezQwfSQvKTsKKyAgICAkZGVwdGhzeyRzaGExfSA9ICRkZXB0aCB8fCAwOworICAgIHB1c2goQGRlcHRocywgJGRlcHRoIHx8IDApOworICAgIHB1c2goQGNvbW1pdHMsICRzaGExKSBpZiAoJHR5cGUgZXEgJ2NvbW1pdCcpOworICAgIHB1c2goQHJvb3RzLCAkc2hhMSkgdW5sZXNzICRwYXJlbnQ7CisgICAgJHBhcmVudHN7JHNoYTF9ID0gJHBhcmVudDsKKyAgICAkdHlwZXN7JHNoYTF9ID0gJHR5cGU7CisgICAgcHVzaChAeyRjaGlsZHJlbnskcGFyZW50fX0sICRzaGExKTsKKyAgICAkc2l6ZXN7JHNoYTF9ID0gJHNpemU7Cit9CisKK2lmICgkZmlsZW5hbWVzICYmICgkdHJlZSB8fCAkZHVtcCkpIHsKKyAgICBvcGVuKE5BTUVTLCAiZ2l0LW5hbWUtcmV2IC0tYWxsfCIpOworICAgIHdoaWxlICg8TkFNRVM+KSB7CisgICAgICAgIGlmICgvXihcUyspXHMrKC4qKSQvKSB7CisgICAgICAgICAgICBteSAoJHNoYTEsICRuYW1lKSA9ICgkMSwgJDIpOworICAgICAgICAgICAgJG5hbWVzeyRzaGExfSA9ICRuYW1lOworICAgICAgICB9CisgICAgfQorICAgIGNsb3NlIE5BTUVTOworCisgICAgZm9yIG15ICRjb21taXQgKEBjb21taXRzKSB7CisgICAgICAgIG15ICRuYW1lID0gJG5hbWVzeyRjb21taXR9OworICAgICAgICBvcGVuKFRSRUUsICJnaXQtbHMtdHJlZSAtdCAtciAkY29tbWl0fCIpOworICAgICAgICBwcmludCBTVERFUlIgIlBsdW1iaW5nIHRyZWUgJG5hbWVcbiI7CisgICAgICAgIHdoaWxlICg8VFJFRT4pIHsKKyAgICAgICAgICAgIGlmICgvXihcUyspXHMrKFxTKylccysoXFMrKVxzKyguKikkLykgeworICAgICAgICAgICAgICAgIG15ICgkbW9kZSwgJHR5cGUsICRzaGExLCAkcGF0aCkgPSAoJDEsICQyLCAkMywgJDQpOworICAgICAgICAgICAgICAgICRwYXRoc3skc2hhMX0gPSAiJHBhdGggQCAkbmFtZSI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2xvc2UgVFJFRTsKKyAgICB9Cit9CisKK3N1YiBzdGF0cyB7CisgICAgbXkgQGRhdGEgPSBzb3J0IHskYSA8PT4gJGJ9IEBfOworICAgIG15ICRtaW4gPSAkZGF0YVswXTsKKyAgICBteSAkbWF4ID0gJGRhdGFbJCNkYXRhXTsKKyAgICBteSAkdG90YWwgPSAwOworICAgIG15ICRjb3VudCA9IHNjYWxhciBAZGF0YTsKKyAgICBmb3IgbXkgJGRhdHVtIChAZGF0YSkgeworICAgICAgICAkdG90YWwgKz0gJGRhdHVtOworICAgIH0KKyAgICBteSAkbWVhbiA9ICR0b3RhbCAvICRjb3VudDsKKyAgICBteSAkbWVkaWFuID0gJGRhdGFbaW50KEBkYXRhIC8gMildOworICAgIG15ICRkaWZmX3N1bSA9IDA7CisgICAgZm9yIG15ICRkYXR1bSAoQGRhdGEpIHsKKyAgICAgICAgJGRpZmZfc3VtICs9ICgkZGF0dW0gLSAkbWVhbikqKjI7CisgICAgfQorICAgIG15ICRzdGRfZGV2ID0gc3FydCgkZGlmZl9zdW0gLyAkY291bnQpOworICAgIHJldHVybiAoJGNvdW50LCAkdG90YWwsICRtaW4sICRtYXgsICRtZWFuLCAkbWVkaWFuLCAkc3RkX2Rldik7Cit9CisKK3N1YiBwcmludF9zdGF0cyB7CisgICAgbXkgJG5hbWUgPSBzaGlmdDsKKyAgICBteSAoJGNvdW50LCAkdG90YWwsICRtaW4sICRtYXgsICRtZWFuLCAkbWVkaWFuLCAkc3RkX2RldikgPSBzdGF0cyhAXyk7CisgICAgcHJpbnRmKCIlczogY291bnQgJXMgdG90YWwgJXMgbWluICVzIG1heCAlcyBtZWFuICUuMmYgbWVkaWFuICVzIHN0ZF9kZXYgJS4yZlxuIiwKKyAgICAgICAgICAgJG5hbWUsICRjb3VudCwgJHRvdGFsLCAkbWluLCAkbWF4LCAkbWVhbiwgJG1lZGlhbiwgJHN0ZF9kZXYpOworfQorCitteSBAc2l6ZXM7CitteSBAcGF0aF9zaXplczsKK215IEBhbGxfc2l6ZXM7CitteSBAYWxsX3BhdGhfc2l6ZXM7CitteSAlcGF0aF9zaXplczsKKworc3ViIGRpZyB7CisgICAgbXkgKCRzaGExLCAkZGVwdGgsICRwYXRoX3NpemUpID0gQF87CisgICAgJHBhdGhfc2l6ZSArPSAkc2l6ZXN7JHNoYTF9OworICAgIHB1c2goQHNpemVzLCAkc2l6ZXN7JHNoYTF9KTsKKyAgICBwdXNoKEBhbGxfc2l6ZXMsICRzaXplc3skc2hhMX0pOworICAgIHB1c2goQHBhdGhfc2l6ZXMsICRwYXRoX3NpemUpOworICAgIHB1c2goQGFsbF9wYXRoX3NpemVzLCAkcGF0aF9zaXplKTsKKyAgICAkcGF0aF9zaXplc3skc2hhMX0gPSAkcGF0aF9zaXplOworICAgIGlmICgkdHJlZSkgeworICAgICAgICBwcmludGYoIiUzZCVzICU2cyAlcyAlOGQgJThkICVzXG4iLAorICAgICAgICAgICAgICAgJGRlcHRoLCAoIiAiIHggJGRlcHRoKSwgJHR5cGVzeyRzaGExfSwKKyAgICAgICAgICAgICAgICRzaGExLCAkc2l6ZXN7JHNoYTF9LCAkcGF0aF9zaXplLCAkcGF0aHN7JHNoYTF9KTsKKyAgICB9CisgICAgZm9yIG15ICRjaGlsZCAoQHskY2hpbGRyZW57JHNoYTF9fSkgeworICAgICAgICBkaWcoJGNoaWxkLCAkZGVwdGggKyAxLCAkcGF0aF9zaXplKTsKKyAgICB9Cit9CisKK215IEB0cmVlX3NpemVzOworbXkgQHRyZWVfcGF0aF9zaXplczsKKworZm9yIG15ICRyb290IChAcm9vdHMpIHsKKyAgICB1bmRlZiBAc2l6ZXM7CisgICAgdW5kZWYgQHBhdGhfc2l6ZXM7CisgICAgZGlnKCRyb290LCAwLCAwKTsKKyAgICBteSAoJGFhLCAkc3pfdG90YWwpID0gc3RhdHMoQHNpemVzKTsKKyAgICBteSAoJGJiLCAkcHN6X3RvdGFsKSA9IHN0YXRzKEBwYXRoX3NpemVzKTsKKyAgICBwdXNoKEB0cmVlX3NpemVzLCAkc3pfdG90YWwpOworICAgIHB1c2goQHRyZWVfcGF0aF9zaXplcywgJHBzel90b3RhbCk7CisgICAgaWYgKCR0cmVlKSB7CisgICAgICAgIGlmIChAc2l6ZXMgPiAxKSB7CisgICAgICAgICAgICBwcmludF9zdGF0cygiICAgICBzaXplIiwgQHNpemVzKTsKKyAgICAgICAgICAgIHByaW50X3N0YXRzKCJwYXRoIHNpemUiLCBAcGF0aF9zaXplcyk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnQgIlxuIjsKKyAgICB9Cit9CisKK2lmICgkZHVtcCkgeworICAgIGZvciBteSAkc2hhMSAoc29ydCBrZXlzICVzaXplcykgeworICAgICAgICBwcmludCAiJHNoYTEgJHNpemVzeyRzaGExfSAkcGF0aF9zaXplc3skc2hhMX0gJGRlcHRoc3skc2hhMX0gJHBhdGhzeyRzaGExfVxuIjsKKyAgICB9Cit9IGVsc2UgeworICAgIHByaW50X3N0YXRzKCIgICAgICBhbGwgc2l6ZXMiLCBAYWxsX3NpemVzKTsKKyAgICBwcmludF9zdGF0cygiIGFsbCBwYXRoIHNpemVzIiwgQGFsbF9wYXRoX3NpemVzKTsKKyAgICBwcmludF9zdGF0cygiICAgICB0cmVlIHNpemVzIiwgQHRyZWVfc2l6ZXMpOworICAgIHByaW50X3N0YXRzKCJ0cmVlIHBhdGggc2l6ZXMiLCBAdHJlZV9wYXRoX3NpemVzKTsKKyAgICBwcmludF9zdGF0cygiICAgICAgICAgZGVwdGhzIiwgQGRlcHRocyk7Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3ZpbS9SRUFETUUgYi9jb250cmliL3ZpbS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU3ODgxZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdmltL1JFQURNRQpAQCAtMCwwICsxLDggQEAKK1RvIHN5bnRheCBoaWdobGlnaHQgZ2l0J3MgY29tbWl0IG1lc3NhZ2VzLCB5b3UgbmVlZCB0bzoKKyAgMS4gQ29weSBzeW50YXgvZ2l0Y29tbWl0LnZpbSB0byB2aW0ncyBzeW50YXggZGlyZWN0b3J5OgorICAgICAkIG1rZGlyIC1wICRIT01FLy52aW0vc3ludGF4CisgICAgICQgY3Agc3ludGF4L2dpdGNvbW1pdC52aW0gJEhPTUUvLnZpbS9zeW50YXgKKyAgMi4gQXV0by1kZXRlY3QgdGhlIGVkaXRpbmcgb2YgZ2l0IGNvbW1pdCBmaWxlczoKKyAgICAgJCBjYXQgPj4kSE9NRS8udmltcmMgPDwnRU9GJworICAgICBhdXRvY21kIEJ1Zk5ld0ZpbGUsQnVmUmVhZCBDT01NSVRfRURJVE1TRyBzZXQgZmlsZXR5cGU9Z2l0Y29tbWl0CisgICAgIEVPRgpkaWZmIC0tZ2l0IGEvY29udHJpYi92aW0vc3ludGF4L2dpdGNvbW1pdC52aW0gYi9jb250cmliL3ZpbS9zeW50YXgvZ2l0Y29tbWl0LnZpbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzIxMjFiCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi92aW0vc3ludGF4L2dpdGNvbW1pdC52aW0KQEAgLTAsMCArMSwxOCBAQAorc3luIHJlZ2lvbiBnaXRMaW5lIHN0YXJ0PS9eIy8gZW5kPS8kLworc3luIHJlZ2lvbiBnaXRDb21taXQgc3RhcnQ9L14jIENoYW5nZXMgdG8gYmUgY29tbWl0dGVkOiQvIGVuZD0vXiMkLyBjb250YWlucz1naXRIZWFkLGdpdENvbW1pdEZpbGUKK3N5biByZWdpb24gZ2l0SGVhZCBjb250YWluZWQgc3RhcnQ9L14jICAgKC4qKS8gZW5kPS9eIyQvCitzeW4gcmVnaW9uIGdpdENoYW5nZWQgc3RhcnQ9L14jIENoYW5nZWQgYnV0IG5vdCB1cGRhdGVkOi8gZW5kPS9eIyQvIGNvbnRhaW5zPWdpdEhlYWQsZ2l0Q2hhbmdlZEZpbGUKK3N5biByZWdpb24gZ2l0VW50cmFja2VkIHN0YXJ0PS9eIyBVbnRyYWNrZWQgZmlsZXM6LyBlbmQ9L14jJC8gY29udGFpbnM9Z2l0SGVhZCxnaXRVbnRyYWNrZWRGaWxlCisKK3N5biBtYXRjaCBnaXRDb21taXRGaWxlIGNvbnRhaW5lZCAvXiNcdC4qL2hzPXMrMgorc3luIG1hdGNoIGdpdENoYW5nZWRGaWxlIGNvbnRhaW5lZCAvXiNcdC4qL2hzPXMrMgorc3luIG1hdGNoIGdpdFVudHJhY2tlZEZpbGUgY29udGFpbmVkIC9eI1x0LiovaHM9cysyCisKK2hpIGRlZiBsaW5rIGdpdExpbmUgQ29tbWVudAoraGkgZGVmIGxpbmsgZ2l0Q29tbWl0IENvbW1lbnQKK2hpIGRlZiBsaW5rIGdpdENoYW5nZWQgQ29tbWVudAoraGkgZGVmIGxpbmsgZ2l0SGVhZCBDb21tZW50CitoaSBkZWYgbGluayBnaXRVbnRyYWNrZWQgQ29tbWVudAoraGkgZGVmIGxpbmsgZ2l0Q29tbWl0RmlsZSBUeXBlCitoaSBkZWYgbGluayBnaXRDaGFuZ2VkRmlsZSBDb25zdGFudAoraGkgZGVmIGxpbmsgZ2l0VW50cmFja2VkRmlsZSBDb25zdGFudApkaWZmIC0tZ2l0IGEvY29udHJpYi93b3JrZGlyL2dpdC1uZXctd29ya2RpciBiL2NvbnRyaWIvd29ya2Rpci9naXQtbmV3LXdvcmtkaXIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzk1OWVhYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvd29ya2Rpci9naXQtbmV3LXdvcmtkaXIKQEAgLTAsMCArMSw4MiBAQAorIyEvYmluL3NoCisKK3VzYWdlICgpIHsKKwllY2hvICJ1c2FnZToiICRACisJZXhpdCAxMjcKK30KKworZGllICgpIHsKKwllY2hvICRACisJZXhpdCAxMjgKK30KKworaWYgdGVzdCAkIyAtbHQgMiB8fCB0ZXN0ICQjIC1ndCAzCit0aGVuCisJdXNhZ2UgIiQwIDxyZXBvc2l0b3J5PiA8bmV3X3dvcmtkaXI+IFs8YnJhbmNoPl0iCitmaQorCitvcmlnX2dpdD0kMQorbmV3X3dvcmtkaXI9JDIKK2JyYW5jaD0kMworCisjIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgd2hhdCBpcyBwb2ludGVkIHRvIGhhcyBhIC5naXQgZGlyZWN0b3J5IC4uLgorZ2l0X2Rpcj0kKGNkICIkb3JpZ19naXQiIDI+L2Rldi9udWxsICYmCisgIGdpdCByZXYtcGFyc2UgLS1naXQtZGlyIDI+L2Rldi9udWxsKSB8fAorICBkaWUgIlwiJG9yaWdfZ2l0XCIgaXMgbm90IGEgZ2l0IHJlcG9zaXRvcnkhIgorCitjYXNlICIkZ2l0X2RpciIgaW4KKy5naXQpCisJZ2l0X2Rpcj0iJG9yaWdfZ2l0Ly5naXQiCisJOzsKKy4pCisJZ2l0X2Rpcj0kb3JpZ19naXQKKwk7OworZXNhYworCisjIGRvbid0IGxpbmsgdG8gYSBjb25maWd1cmVkIGJhcmUgcmVwb3NpdG9yeQoraXNiYXJlPSQoZ2l0IC0tZ2l0LWRpcj0iJGdpdF9kaXIiIGNvbmZpZyAtLWJvb2wgLS1nZXQgY29yZS5iYXJlKQoraWYgdGVzdCB6dHJ1ZSA9IHokaXNiYXJlCit0aGVuCisJZGllICJcIiRnaXRfZGlyXCIgaGFzIGNvcmUuYmFyZSBzZXQgdG8gdHJ1ZSwiIFwKKwkJIiByZW1vdmUgZnJvbSBcIiRnaXRfZGlyL2NvbmZpZ1wiIHRvIHVzZSAkMCIKK2ZpCisKKyMgZG9uJ3QgbGluayB0byBhIHdvcmtkaXIKK2lmIHRlc3QgLUwgIiRnaXRfZGlyL2NvbmZpZyIKK3RoZW4KKwlkaWUgIlwiJG9yaWdfZ2l0XCIgaXMgYSB3b3JraW5nIGRpcmVjdG9yeSBvbmx5LCBwbGVhc2Ugc3BlY2lmeSIgXAorCQkiYSBjb21wbGV0ZSByZXBvc2l0b3J5LiIKK2ZpCisKKyMgZG9uJ3QgcmVjcmVhdGUgYSB3b3JrZGlyIG92ZXIgYW4gZXhpc3RpbmcgcmVwb3NpdG9yeQoraWYgdGVzdCAtZSAiJG5ld193b3JrZGlyIgordGhlbgorCWRpZSAiZGVzdGluYXRpb24gZGlyZWN0b3J5ICckbmV3X3dvcmtkaXInIGFscmVhZHkgZXhpc3RzLiIKK2ZpCisKKyMgbWFrZSBzdXJlIHRoZSB0aGUgbGlua3MgdXNlIGZ1bGwgcGF0aHMKK2dpdF9kaXI9JChjZCAiJGdpdF9kaXIiOyBwd2QpCisKKyMgY3JlYXRlIHRoZSB3b3JrZGlyCitta2RpciAtcCAiJG5ld193b3JrZGlyLy5naXQiIHx8IGRpZSAidW5hYmxlIHRvIGNyZWF0ZSBcIiRuZXdfd29ya2RpclwiISIKKworIyBjcmVhdGUgdGhlIGxpbmtzIHRvIHRoZSBvcmlnaW5hbCByZXBvLiAgZXhwbGljdGx5IGV4Y2x1ZGUgaW5kZXgsIEhFQUQgYW5kCisjIGxvZ3MvSEVBRCBmcm9tIHRoZSBsaXN0IHNpbmNlIHRoZXkgYXJlIHB1cmVseSByZWxhdGVkIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcKKyMgZGlyZWN0b3J5LCBhbmQgc2hvdWxkIG5vdCBiZSBzaGFyZWQuCitmb3IgeCBpbiBjb25maWcgcmVmcyBsb2dzL3JlZnMgb2JqZWN0cyBpbmZvIGhvb2tzIHBhY2tlZC1yZWZzIHJlbW90ZXMgcnItY2FjaGUgc3ZuCitkbworCWNhc2UgJHggaW4KKwkqLyopCisJCW1rZGlyIC1wICIkKGRpcm5hbWUgIiRuZXdfd29ya2Rpci8uZ2l0LyR4IikiCisJCTs7CisJZXNhYworCWxuIC1zICIkZ2l0X2Rpci8keCIgIiRuZXdfd29ya2Rpci8uZ2l0LyR4IgorZG9uZQorCisjIG5vdyBzZXR1cCB0aGUgd29ya2RpcgorY2QgIiRuZXdfd29ya2RpciIKKyMgY29weSB0aGUgSEVBRCBmcm9tIHRoZSBvcmlnaW5hbCByZXBvc2l0b3J5IGFzIGEgZGVmYXVsdCBicmFuY2gKK2NwICIkZ2l0X2Rpci9IRUFEIiAuZ2l0L0hFQUQKKyMgY2hlY2tvdXQgdGhlIGJyYW5jaCAoZWl0aGVyIHRoZSBzYW1lIGFzIEhFQUQgZnJvbSB0aGUgb3JpZ2luYWwgcmVwb3NpdG9yeSwgb3IKKyMgdGhlIG9uZSB0aGF0IHdhcyBhc2tlZCBmb3IpCitnaXQgY2hlY2tvdXQgLWYgJGJyYW5jaApkaWZmIC0tZ2l0IGEvY29udmVydC5jIGIvY29udmVydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Yzk0Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb252ZXJ0LmMKQEAgLTAsMCArMSw2MzIgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImF0dHIuaCIKKyNpbmNsdWRlICJydW4tY29tbWFuZC5oIgorCisvKgorICogY29udmVydC5jIC0gY29udmVydCBhIGZpbGUgd2hlbiBjaGVja2luZyBpdCBvdXQgYW5kIGNoZWNraW5nIGl0IGluLgorICoKKyAqIFRoaXMgc2hvdWxkIHVzZSB0aGUgcGF0aG5hbWUgdG8gZGVjaWRlIG9uIHdoZXRoZXIgaXQgd2FudHMgdG8gZG8gc29tZQorICogbW9yZSBpbnRlcmVzdGluZyBjb252ZXJzaW9ucyAoYXV0b21hdGljIGd6aXAvdW56aXAsIGdlbmVyYWwgZm9ybWF0CisgKiBjb252ZXJzaW9ucyBldGMgZXRjKSwgYnV0IGJ5IGRlZmF1bHQgaXQganVzdCBkb2VzIGF1dG9tYXRpYyBDUkxGPC0+TEYKKyAqIHRyYW5zbGF0aW9uIHdoZW4gdGhlICJhdXRvX2NybGYiIG9wdGlvbiBpcyBzZXQuCisgKi8KKworI2RlZmluZSBDUkxGX0dVRVNTCSgtMSkKKyNkZWZpbmUgQ1JMRl9CSU5BUlkJMAorI2RlZmluZSBDUkxGX1RFWFQJMQorI2RlZmluZSBDUkxGX0lOUFVUCTIKKworc3RydWN0IHRleHRfc3RhdCB7CisJLyogTlVMLCBDUiwgTEYgYW5kIENSTEYgY291bnRzICovCisJdW5zaWduZWQgbnVsLCBjciwgbGYsIGNybGY7CisKKwkvKiBUaGVzZSBhcmUganVzdCBhcHByb3hpbWF0aW9ucyEgKi8KKwl1bnNpZ25lZCBwcmludGFibGUsIG5vbnByaW50YWJsZTsKK307CisKK3N0YXRpYyB2b2lkIGdhdGhlcl9zdGF0cyhjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgc3RydWN0IHRleHRfc3RhdCAqc3RhdHMpCit7CisJdW5zaWduZWQgbG9uZyBpOworCisJbWVtc2V0KHN0YXRzLCAwLCBzaXplb2YoKnN0YXRzKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgYyA9IGJ1ZltpXTsKKwkJaWYgKGMgPT0gJ1xyJykgeworCQkJc3RhdHMtPmNyKys7CisJCQlpZiAoaSsxIDwgc2l6ZSAmJiBidWZbaSsxXSA9PSAnXG4nKQorCQkJCXN0YXRzLT5jcmxmKys7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA9PSAnXG4nKSB7CisJCQlzdGF0cy0+bGYrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID09IDEyNykKKwkJCS8qIERFTCAqLworCQkJc3RhdHMtPm5vbnByaW50YWJsZSsrOworCQllbHNlIGlmIChjIDwgMzIpIHsKKwkJCXN3aXRjaCAoYykgeworCQkJCS8qIEJTLCBIVCwgRVNDIGFuZCBGRiAqLworCQkJY2FzZSAnXGInOiBjYXNlICdcdCc6IGNhc2UgJ1wwMzMnOiBjYXNlICdcMDE0JzoKKwkJCQlzdGF0cy0+cHJpbnRhYmxlKys7CisJCQkJYnJlYWs7CisJCQljYXNlIDA6CisJCQkJc3RhdHMtPm51bCsrOworCQkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQkJZGVmYXVsdDoKKwkJCQlzdGF0cy0+bm9ucHJpbnRhYmxlKys7CisJCQl9CisJCX0KKwkJZWxzZQorCQkJc3RhdHMtPnByaW50YWJsZSsrOworCX0KK30KKworLyoKKyAqIFRoZSBzYW1lIGhldXJpc3RpY3MgYXMgZGlmZi5jOjptbWZpbGVfaXNfYmluYXJ5KCkKKyAqLworc3RhdGljIGludCBpc19iaW5hcnkodW5zaWduZWQgbG9uZyBzaXplLCBzdHJ1Y3QgdGV4dF9zdGF0ICpzdGF0cykKK3sKKworCWlmIChzdGF0cy0+bnVsKQorCQlyZXR1cm4gMTsKKwlpZiAoKHN0YXRzLT5wcmludGFibGUgPj4gNykgPCBzdGF0cy0+bm9ucHJpbnRhYmxlKQorCQlyZXR1cm4gMTsKKwkvKgorCSAqIE90aGVyIGhldXJpc3RpY3M/IEF2ZXJhZ2UgbGluZSBsZW5ndGggbWlnaHQgYmUgcmVsZXZhbnQsCisJICogYXMgbWlnaHQgTEYgdnMgQ1IgdnMgQ1JMRiBjb3VudHMuLgorCSAqCisJICogTk9URSEgSXQgbWlnaHQgYmUgbm9ybWFsIHRvIGhhdmUgYSBsb3cgcmF0aW8gb2YgQ1JMRiB0byBMRgorCSAqIChzb21lYm9keSBzdGFydHMgd2l0aCBhIExGLW9ubHkgZmlsZSBhbmQgZWRpdHMgaXQgd2l0aCBhbiBlZGl0b3IKKwkgKiB0aGF0IGFkZHMgQ1JMRiBvbmx5IHRvIGxpbmVzIHRoYXQgYXJlIGFkZGVkLi4pLiBCdXQgZG8gIHdlCisJICogd2FudCB0byBzdXBwb3J0IENSLW9ubHk/IFByb2JhYmx5IG5vdC4KKwkgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfc2FmZV9jcmxmKGNvbnN0IGNoYXIgKnBhdGgsIGludCBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRleHRfc3RhdCAqc3RhdHMsIGVudW0gc2FmZV9jcmxmIGNoZWNrc2FmZSkKK3sKKwlpZiAoIWNoZWNrc2FmZSkKKwkJcmV0dXJuOworCisJaWYgKGFjdGlvbiA9PSBDUkxGX0lOUFVUIHx8IGF1dG9fY3JsZiA8PSAwKSB7CisJCS8qCisJCSAqIENSTEZzIHdvdWxkIG5vdCBiZSByZXN0b3JlZCBieSBjaGVja291dDoKKwkJICogY2hlY2sgaWYgd2UnZCByZW1vdmUgQ1JMRnMKKwkJICovCisJCWlmIChzdGF0cy0+Y3JsZikgeworCQkJaWYgKGNoZWNrc2FmZSA9PSBTQUZFX0NSTEZfV0FSTikKKwkJCQl3YXJuaW5nKCJDUkxGIHdpbGwgYmUgcmVwbGFjZWQgYnkgTEYgaW4gJXMuIiwgcGF0aCk7CisJCQllbHNlIC8qIGkuZS4gU0FGRV9DUkxGX0ZBSUwgKi8KKwkJCQlkaWUoIkNSTEYgd291bGQgYmUgcmVwbGFjZWQgYnkgTEYgaW4gJXMuIiwgcGF0aCk7CisJCX0KKwl9IGVsc2UgaWYgKGF1dG9fY3JsZiA+IDApIHsKKwkJLyoKKwkJICogQ1JMRnMgd291bGQgYmUgYWRkZWQgYnkgY2hlY2tvdXQ6CisJCSAqIGNoZWNrIGlmIHdlIGhhdmUgIm5ha2VkIiBMRnMKKwkJICovCisJCWlmIChzdGF0cy0+bGYgIT0gc3RhdHMtPmNybGYpIHsKKwkJCWlmIChjaGVja3NhZmUgPT0gU0FGRV9DUkxGX1dBUk4pCisJCQkJd2FybmluZygiTEYgd2lsbCBiZSByZXBsYWNlZCBieSBDUkxGIGluICVzIiwgcGF0aCk7CisJCQllbHNlIC8qIGkuZS4gU0FGRV9DUkxGX0ZBSUwgKi8KKwkJCQlkaWUoIkxGIHdvdWxkIGJlIHJlcGxhY2VkIGJ5IENSTEYgaW4gJXMiLCBwYXRoKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBjcmxmX3RvX2dpdChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzdHJidWYgKmJ1ZiwgaW50IGFjdGlvbiwgZW51bSBzYWZlX2NybGYgY2hlY2tzYWZlKQoreworCXN0cnVjdCB0ZXh0X3N0YXQgc3RhdHM7CisJY2hhciAqZHN0OworCisJaWYgKChhY3Rpb24gPT0gQ1JMRl9CSU5BUlkpIHx8ICFhdXRvX2NybGYgfHwgIWxlbikKKwkJcmV0dXJuIDA7CisKKwlnYXRoZXJfc3RhdHMoc3JjLCBsZW4sICZzdGF0cyk7CisKKwlpZiAoYWN0aW9uID09IENSTEZfR1VFU1MpIHsKKwkJLyoKKwkJICogV2UncmUgY3VycmVudGx5IG5vdCBnb2luZyB0byBldmVuIHRyeSB0byBjb252ZXJ0IHN0dWZmCisJCSAqIHRoYXQgaGFzIGJhcmUgQ1IgY2hhcmFjdGVycy4gRG9lcyBhbnlib2R5IGRvIHRoYXQgY3JhenkKKwkJICogc3R1ZmY/CisJCSAqLworCQlpZiAoc3RhdHMuY3IgIT0gc3RhdHMuY3JsZikKKwkJCXJldHVybiAwOworCisJCS8qCisJCSAqIEFuZCBhZGQgc29tZSBoZXVyaXN0aWNzIGZvciBiaW5hcnkgdnMgdGV4dCwgb2YgY291cnNlLi4uCisJCSAqLworCQlpZiAoaXNfYmluYXJ5KGxlbiwgJnN0YXRzKSkKKwkJCXJldHVybiAwOworCX0KKworCWNoZWNrX3NhZmVfY3JsZihwYXRoLCBhY3Rpb24sICZzdGF0cywgY2hlY2tzYWZlKTsKKworCS8qIE9wdGltaXphdGlvbjogTm8gQ1I/IE5vdGhpbmcgdG8gY29udmVydCwgcmVnYXJkbGVzcy4gKi8KKwlpZiAoIXN0YXRzLmNyKQorCQlyZXR1cm4gMDsKKworCS8qIG9ubHkgZ3JvdyBpZiBub3QgaW4gcGxhY2UgKi8KKwlpZiAoc3RyYnVmX2F2YWlsKGJ1ZikgKyBidWYtPmxlbiA8IGxlbikKKwkJc3RyYnVmX2dyb3coYnVmLCBsZW4gLSBidWYtPmxlbik7CisJZHN0ID0gYnVmLT5idWY7CisJaWYgKGFjdGlvbiA9PSBDUkxGX0dVRVNTKSB7CisJCS8qCisJCSAqIElmIHdlIGd1ZXNzZWQsIHdlIGFscmVhZHkga25vdyB3ZSByZWplY3RlZCBhIGZpbGUgd2l0aAorCQkgKiBsb25lIENSLCBhbmQgd2UgY2FuIHN0cmlwIGEgQ1Igd2l0aG91dCBsb29raW5nIGF0IHdoYXQKKwkJICogZm9sbG93IGl0LgorCQkgKi8KKwkJZG8geworCQkJdW5zaWduZWQgY2hhciBjID0gKnNyYysrOworCQkJaWYgKGMgIT0gJ1xyJykKKwkJCQkqZHN0KysgPSBjOworCQl9IHdoaWxlICgtLWxlbik7CisJfSBlbHNlIHsKKwkJZG8geworCQkJdW5zaWduZWQgY2hhciBjID0gKnNyYysrOworCQkJaWYgKCEgKGMgPT0gJ1xyJyAmJiAoMSA8IGxlbiAmJiAqc3JjID09ICdcbicpKSkKKwkJCQkqZHN0KysgPSBjOworCQl9IHdoaWxlICgtLWxlbik7CisJfQorCXN0cmJ1Zl9zZXRsZW4oYnVmLCBkc3QgLSBidWYtPmJ1Zik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY3JsZl90b193b3JrdHJlZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN0cmJ1ZiAqYnVmLCBpbnQgYWN0aW9uKQoreworCWNoYXIgKnRvX2ZyZWUgPSBOVUxMOworCXN0cnVjdCB0ZXh0X3N0YXQgc3RhdHM7CisKKwlpZiAoKGFjdGlvbiA9PSBDUkxGX0JJTkFSWSkgfHwgKGFjdGlvbiA9PSBDUkxGX0lOUFVUKSB8fAorCSAgICBhdXRvX2NybGYgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWxlbikKKwkJcmV0dXJuIDA7CisKKwlnYXRoZXJfc3RhdHMoc3JjLCBsZW4sICZzdGF0cyk7CisKKwkvKiBObyBMRj8gTm90aGluZyB0byBjb252ZXJ0LCByZWdhcmRsZXNzLiAqLworCWlmICghc3RhdHMubGYpCisJCXJldHVybiAwOworCisJLyogV2FzIGl0IGFscmVhZHkgaW4gQ1JMRiBmb3JtYXQ/ICovCisJaWYgKHN0YXRzLmxmID09IHN0YXRzLmNybGYpCisJCXJldHVybiAwOworCisJaWYgKGFjdGlvbiA9PSBDUkxGX0dVRVNTKSB7CisJCS8qIElmIHdlIGhhdmUgYW55IGJhcmUgQ1IgY2hhcmFjdGVycywgd2UncmUgbm90IGdvaW5nIHRvIHRvdWNoIGl0ICovCisJCWlmIChzdGF0cy5jciAhPSBzdGF0cy5jcmxmKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKGlzX2JpbmFyeShsZW4sICZzdGF0cykpCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBhcmUgd2UgImZha2luZyIgaW4gcGxhY2UgZWRpdGluZyA/ICovCisJaWYgKHNyYyA9PSBidWYtPmJ1ZikKKwkJdG9fZnJlZSA9IHN0cmJ1Zl9kZXRhY2goYnVmLCBOVUxMKTsKKworCXN0cmJ1Zl9ncm93KGJ1ZiwgbGVuICsgc3RhdHMubGYgLSBzdGF0cy5jcmxmKTsKKwlmb3IgKDs7KSB7CisJCWNvbnN0IGNoYXIgKm5sID0gbWVtY2hyKHNyYywgJ1xuJywgbGVuKTsKKwkJaWYgKCFubCkKKwkJCWJyZWFrOworCQlpZiAobmwgPiBzcmMgJiYgbmxbLTFdID09ICdccicpIHsKKwkJCXN0cmJ1Zl9hZGQoYnVmLCBzcmMsIG5sICsgMSAtIHNyYyk7CisJCX0gZWxzZSB7CisJCQlzdHJidWZfYWRkKGJ1Ziwgc3JjLCBubCAtIHNyYyk7CisJCQlzdHJidWZfYWRkc3RyKGJ1ZiwgIlxyXG4iKTsKKwkJfQorCQlsZW4gLT0gbmwgKyAxIC0gc3JjOworCQlzcmMgID0gbmwgKyAxOworCX0KKwlzdHJidWZfYWRkKGJ1Ziwgc3JjLCBsZW4pOworCisJZnJlZSh0b19mcmVlKTsKKwlyZXR1cm4gMTsKK30KKworc3RydWN0IGZpbHRlcl9wYXJhbXMgeworCWNvbnN0IGNoYXIgKnNyYzsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJY29uc3QgY2hhciAqY21kOworfTsKKworc3RhdGljIGludCBmaWx0ZXJfYnVmZmVyKGludCBmZCwgdm9pZCAqZGF0YSkKK3sKKwkvKgorCSAqIFNwYXduIGNtZCBhbmQgZmVlZCB0aGUgYnVmZmVyIGNvbnRlbnRzIHRocm91Z2ggaXRzIHN0ZGluLgorCSAqLworCXN0cnVjdCBjaGlsZF9wcm9jZXNzIGNoaWxkX3Byb2Nlc3M7CisJc3RydWN0IGZpbHRlcl9wYXJhbXMgKnBhcmFtcyA9IChzdHJ1Y3QgZmlsdGVyX3BhcmFtcyAqKWRhdGE7CisJaW50IHdyaXRlX2Vyciwgc3RhdHVzOworCWNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsgInNoIiwgIi1jIiwgcGFyYW1zLT5jbWQsIE5VTEwgfTsKKworCW1lbXNldCgmY2hpbGRfcHJvY2VzcywgMCwgc2l6ZW9mKGNoaWxkX3Byb2Nlc3MpKTsKKwljaGlsZF9wcm9jZXNzLmFyZ3YgPSBhcmd2OworCWNoaWxkX3Byb2Nlc3MuaW4gPSAtMTsKKwljaGlsZF9wcm9jZXNzLm91dCA9IGZkOworCisJaWYgKHN0YXJ0X2NvbW1hbmQoJmNoaWxkX3Byb2Nlc3MpKQorCQlyZXR1cm4gZXJyb3IoImNhbm5vdCBmb3JrIHRvIHJ1biBleHRlcm5hbCBmaWx0ZXIgJXMiLCBwYXJhbXMtPmNtZCk7CisKKwl3cml0ZV9lcnIgPSAod3JpdGVfaW5fZnVsbChjaGlsZF9wcm9jZXNzLmluLCBwYXJhbXMtPnNyYywgcGFyYW1zLT5zaXplKSA8IDApOworCWlmIChjbG9zZShjaGlsZF9wcm9jZXNzLmluKSkKKwkJd3JpdGVfZXJyID0gMTsKKwlpZiAod3JpdGVfZXJyKQorCQllcnJvcigiY2Fubm90IGZlZWQgdGhlIGlucHV0IHRvIGV4dGVybmFsIGZpbHRlciAlcyIsIHBhcmFtcy0+Y21kKTsKKworCXN0YXR1cyA9IGZpbmlzaF9jb21tYW5kKCZjaGlsZF9wcm9jZXNzKTsKKwlpZiAoc3RhdHVzKQorCQllcnJvcigiZXh0ZXJuYWwgZmlsdGVyICVzIGZhaWxlZCAlZCIsIHBhcmFtcy0+Y21kLCAtc3RhdHVzKTsKKwlyZXR1cm4gKHdyaXRlX2VyciB8fCBzdGF0dXMpOworfQorCitzdGF0aWMgaW50IGFwcGx5X2ZpbHRlcihjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RyYnVmICpkc3QsIGNvbnN0IGNoYXIgKmNtZCkKK3sKKwkvKgorCSAqIENyZWF0ZSBhIHBpcGVsaW5lIHRvIGhhdmUgdGhlIGNvbW1hbmQgZmlsdGVyIHRoZSBidWZmZXIncworCSAqIGNvbnRlbnRzLgorCSAqCisJICogKGNoaWxkIC0tPiBjbWQpIC0tPiB1cworCSAqLworCWludCByZXQgPSAxOworCXN0cnVjdCBzdHJidWYgbmJ1ZjsKKwlzdHJ1Y3QgYXN5bmMgYXN5bmM7CisJc3RydWN0IGZpbHRlcl9wYXJhbXMgcGFyYW1zOworCisJaWYgKCFjbWQpCisJCXJldHVybiAwOworCisJbWVtc2V0KCZhc3luYywgMCwgc2l6ZW9mKGFzeW5jKSk7CisJYXN5bmMucHJvYyA9IGZpbHRlcl9idWZmZXI7CisJYXN5bmMuZGF0YSA9ICZwYXJhbXM7CisJcGFyYW1zLnNyYyA9IHNyYzsKKwlwYXJhbXMuc2l6ZSA9IGxlbjsKKwlwYXJhbXMuY21kID0gY21kOworCisJZmZsdXNoKE5VTEwpOworCWlmIChzdGFydF9hc3luYygmYXN5bmMpKQorCQlyZXR1cm4gMDsJLyogZXJyb3Igd2FzIGFscmVhZHkgcmVwb3J0ZWQgKi8KKworCXN0cmJ1Zl9pbml0KCZuYnVmLCAwKTsKKwlpZiAoc3RyYnVmX3JlYWQoJm5idWYsIGFzeW5jLm91dCwgbGVuKSA8IDApIHsKKwkJZXJyb3IoInJlYWQgZnJvbSBleHRlcm5hbCBmaWx0ZXIgJXMgZmFpbGVkIiwgY21kKTsKKwkJcmV0ID0gMDsKKwl9CisJaWYgKGNsb3NlKGFzeW5jLm91dCkpIHsKKwkJZXJyb3IoInJlYWQgZnJvbSBleHRlcm5hbCBmaWx0ZXIgJXMgZmFpbGVkIiwgY21kKTsKKwkJcmV0ID0gMDsKKwl9CisJaWYgKGZpbmlzaF9hc3luYygmYXN5bmMpKSB7CisJCWVycm9yKCJleHRlcm5hbCBmaWx0ZXIgJXMgZmFpbGVkIiwgY21kKTsKKwkJcmV0ID0gMDsKKwl9CisKKwlpZiAocmV0KSB7CisJCXN0cmJ1Zl9zd2FwKGRzdCwgJm5idWYpOworCX0KKwlzdHJidWZfcmVsZWFzZSgmbmJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBjb252ZXJ0X2RyaXZlciB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgY29udmVydF9kcml2ZXIgKm5leHQ7CisJY2hhciAqc211ZGdlOworCWNoYXIgKmNsZWFuOworfSAqdXNlcl9jb252ZXJ0LCAqKnVzZXJfY29udmVydF90YWlsOworCitzdGF0aWMgaW50IHJlYWRfY29udmVydF9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwljb25zdCBjaGFyICplcCwgKm5hbWU7CisJaW50IG5hbWVsZW47CisJc3RydWN0IGNvbnZlcnRfZHJpdmVyICpkcnY7CisKKwkvKgorCSAqIEV4dGVybmFsIGNvbnZlcnNpb24gZHJpdmVycyBhcmUgY29uZmlndXJlZCB1c2luZworCSAqICJmaWx0ZXIuPG5hbWU+LnZhcmlhYmxlIi4KKwkgKi8KKwlpZiAocHJlZml4Y21wKHZhciwgImZpbHRlci4iKSB8fCAoZXAgPSBzdHJyY2hyKHZhciwgJy4nKSkgPT0gdmFyICsgNikKKwkJcmV0dXJuIDA7CisJbmFtZSA9IHZhciArIDc7CisJbmFtZWxlbiA9IGVwIC0gbmFtZTsKKwlmb3IgKGRydiA9IHVzZXJfY29udmVydDsgZHJ2OyBkcnYgPSBkcnYtPm5leHQpCisJCWlmICghc3RybmNtcChkcnYtPm5hbWUsIG5hbWUsIG5hbWVsZW4pICYmICFkcnYtPm5hbWVbbmFtZWxlbl0pCisJCQlicmVhazsKKwlpZiAoIWRydikgeworCQlkcnYgPSB4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgY29udmVydF9kcml2ZXIpKTsKKwkJZHJ2LT5uYW1lID0geG1lbWR1cHoobmFtZSwgbmFtZWxlbik7CisJCSp1c2VyX2NvbnZlcnRfdGFpbCA9IGRydjsKKwkJdXNlcl9jb252ZXJ0X3RhaWwgPSAmKGRydi0+bmV4dCk7CisJfQorCisJZXArKzsKKworCS8qCisJICogZmlsdGVyLjxuYW1lPi5zbXVkZ2UgYW5kIGZpbHRlci48bmFtZT4uY2xlYW4gc3BlY2lmaWVzCisJICogdGhlIGNvbW1hbmQgbGluZToKKwkgKgorCSAqCWNvbW1hbmQtbGluZQorCSAqCisJICogVGhlIGNvbW1hbmQtbGluZSB3aWxsIG5vdCBiZSBpbnRlcnBvbGF0ZWQgaW4gYW55IHdheS4KKwkgKi8KKworCWlmICghc3RyY21wKCJzbXVkZ2UiLCBlcCkpIHsKKwkJaWYgKCF2YWx1ZSkKKwkJCXJldHVybiBjb25maWdfZXJyb3Jfbm9uYm9vbCh2YXIpOworCQlkcnYtPnNtdWRnZSA9IHN0cmR1cCh2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghc3RyY21wKCJjbGVhbiIsIGVwKSkgeworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIGNvbmZpZ19lcnJvcl9ub25ib29sKHZhcik7CisJCWRydi0+Y2xlYW4gPSBzdHJkdXAodmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX2NvbnZlcnRfY2hlY2soc3RydWN0IGdpdF9hdHRyX2NoZWNrICpjaGVjaykKK3sKKwlzdGF0aWMgc3RydWN0IGdpdF9hdHRyICphdHRyX2NybGY7CisJc3RhdGljIHN0cnVjdCBnaXRfYXR0ciAqYXR0cl9pZGVudDsKKwlzdGF0aWMgc3RydWN0IGdpdF9hdHRyICphdHRyX2ZpbHRlcjsKKworCWlmICghYXR0cl9jcmxmKSB7CisJCWF0dHJfY3JsZiA9IGdpdF9hdHRyKCJjcmxmIiwgNCk7CisJCWF0dHJfaWRlbnQgPSBnaXRfYXR0cigiaWRlbnQiLCA1KTsKKwkJYXR0cl9maWx0ZXIgPSBnaXRfYXR0cigiZmlsdGVyIiwgNik7CisJCXVzZXJfY29udmVydF90YWlsID0gJnVzZXJfY29udmVydDsKKwkJZ2l0X2NvbmZpZyhyZWFkX2NvbnZlcnRfY29uZmlnKTsKKwl9CisJY2hlY2tbMF0uYXR0ciA9IGF0dHJfY3JsZjsKKwljaGVja1sxXS5hdHRyID0gYXR0cl9pZGVudDsKKwljaGVja1syXS5hdHRyID0gYXR0cl9maWx0ZXI7Cit9CisKK3N0YXRpYyBpbnQgY291bnRfaWRlbnQoY29uc3QgY2hhciAqY3AsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwkvKgorCSAqICIkSWQ6IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgJCIgPD0+ICIkSWQkIgorCSAqLworCWludCBjbnQgPSAwOworCWNoYXIgY2g7CisKKwl3aGlsZSAoc2l6ZSkgeworCQljaCA9ICpjcCsrOworCQlzaXplLS07CisJCWlmIChjaCAhPSAnJCcpCisJCQljb250aW51ZTsKKwkJaWYgKHNpemUgPCAzKQorCQkJYnJlYWs7CisJCWlmIChtZW1jbXAoIklkIiwgY3AsIDIpKQorCQkJY29udGludWU7CisJCWNoID0gY3BbMl07CisJCWNwICs9IDM7CisJCXNpemUgLT0gMzsKKwkJaWYgKGNoID09ICckJykKKwkJCWNudCsrOyAvKiAkSWQkICovCisJCWlmIChjaCAhPSAnOicpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiAiJElkOiAuLi4gIjsgc2NhbiB1cCB0byB0aGUgY2xvc2luZyBkb2xsYXIgc2lnbiBhbmQgZGlzY2FyZC4KKwkJICovCisJCXdoaWxlIChzaXplKSB7CisJCQljaCA9ICpjcCsrOworCQkJc2l6ZS0tOworCQkJaWYgKGNoID09ICckJykgeworCQkJCWNudCsrOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBpbnQgaWRlbnRfdG9fZ2l0KGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzdHJidWYgKmJ1ZiwgaW50IGlkZW50KQoreworCWNoYXIgKmRzdCwgKmRvbGxhcjsKKworCWlmICghaWRlbnQgfHwgIWNvdW50X2lkZW50KHNyYywgbGVuKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBvbmx5IGdyb3cgaWYgbm90IGluIHBsYWNlICovCisJaWYgKHN0cmJ1Zl9hdmFpbChidWYpICsgYnVmLT5sZW4gPCBsZW4pCisJCXN0cmJ1Zl9ncm93KGJ1ZiwgbGVuIC0gYnVmLT5sZW4pOworCWRzdCA9IGJ1Zi0+YnVmOworCWZvciAoOzspIHsKKwkJZG9sbGFyID0gbWVtY2hyKHNyYywgJyQnLCBsZW4pOworCQlpZiAoIWRvbGxhcikKKwkJCWJyZWFrOworCQltZW1jcHkoZHN0LCBzcmMsIGRvbGxhciArIDEgLSBzcmMpOworCQlkc3QgKz0gZG9sbGFyICsgMSAtIHNyYzsKKwkJbGVuIC09IGRvbGxhciArIDEgLSBzcmM7CisJCXNyYyAgPSBkb2xsYXIgKyAxOworCisJCWlmIChsZW4gPiAzICYmICFtZW1jbXAoc3JjLCAiSWQ6IiwgMykpIHsKKwkJCWRvbGxhciA9IG1lbWNocihzcmMgKyAzLCAnJCcsIGxlbiAtIDMpOworCQkJaWYgKCFkb2xsYXIpCisJCQkJYnJlYWs7CisJCQltZW1jcHkoZHN0LCAiSWQkIiwgMyk7CisJCQlkc3QgKz0gMzsKKwkJCWxlbiAtPSBkb2xsYXIgKyAxIC0gc3JjOworCQkJc3JjICA9IGRvbGxhciArIDE7CisJCX0KKwl9CisJbWVtY3B5KGRzdCwgc3JjLCBsZW4pOworCXN0cmJ1Zl9zZXRsZW4oYnVmLCBkc3QgKyBsZW4gLSBidWYtPmJ1Zik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaWRlbnRfdG9fd29ya3RyZWUoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RyYnVmICpidWYsIGludCBpZGVudCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWNoYXIgKnRvX2ZyZWUgPSBOVUxMLCAqZG9sbGFyOworCWludCBjbnQ7CisKKwlpZiAoIWlkZW50KQorCQlyZXR1cm4gMDsKKworCWNudCA9IGNvdW50X2lkZW50KHNyYywgbGVuKTsKKwlpZiAoIWNudCkKKwkJcmV0dXJuIDA7CisKKwkvKiBhcmUgd2UgImZha2luZyIgaW4gcGxhY2UgZWRpdGluZyA/ICovCisJaWYgKHNyYyA9PSBidWYtPmJ1ZikKKwkJdG9fZnJlZSA9IHN0cmJ1Zl9kZXRhY2goYnVmLCBOVUxMKTsKKwloYXNoX3NoYTFfZmlsZShzcmMsIGxlbiwgImJsb2IiLCBzaGExKTsKKworCXN0cmJ1Zl9ncm93KGJ1ZiwgbGVuICsgY250ICogNDMpOworCWZvciAoOzspIHsKKwkJLyogc3RlcCAxOiBydW4gdG8gdGhlIG5leHQgJyQnICovCisJCWRvbGxhciA9IG1lbWNocihzcmMsICckJywgbGVuKTsKKwkJaWYgKCFkb2xsYXIpCisJCQlicmVhazsKKwkJc3RyYnVmX2FkZChidWYsIHNyYywgZG9sbGFyICsgMSAtIHNyYyk7CisJCWxlbiAtPSBkb2xsYXIgKyAxIC0gc3JjOworCQlzcmMgID0gZG9sbGFyICsgMTsKKworCQkvKiBzdGVwIDI6IGRvZXMgaXQgbG9va3MgbGlrZSBhIGJpdCBsaWtlIElkOnh4eCQgb3IgSWQkID8gKi8KKwkJaWYgKGxlbiA8IDMgfHwgbWVtY21wKCJJZCIsIHNyYywgMikpCisJCQljb250aW51ZTsKKworCQkvKiBzdGVwIDM6IHNraXAgb3ZlciBJZCQgb3IgSWQ6eHh4eHgkICovCisJCWlmIChzcmNbMl0gPT0gJyQnKSB7CisJCQlzcmMgKz0gMzsKKwkJCWxlbiAtPSAzOworCQl9IGVsc2UgaWYgKHNyY1syXSA9PSAnOicpIHsKKwkJCS8qCisJCQkgKiBJdCdzIHBvc3NpYmxlIHRoYXQgYW4gZXhwYW5kZWQgSWQgaGFzIGNyZXB0IGl0cyB3YXkgaW50byB0aGUKKwkJCSAqIHJlcG9zaXRvcnksIHdlIGNvcGUgd2l0aCB0aGF0IGJ5IHN0cmlwcGluZyB0aGUgZXhwYW5zaW9uIG91dAorCQkJICovCisJCQlkb2xsYXIgPSBtZW1jaHIoc3JjICsgMywgJyQnLCBsZW4gLSAzKTsKKwkJCWlmICghZG9sbGFyKSB7CisJCQkJLyogaW5jb21wbGV0ZSBrZXl3b3JkLCBubyBtb3JlICckJywgc28ganVzdCBxdWl0IHRoZSBsb29wICovCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWxlbiAtPSBkb2xsYXIgKyAxIC0gc3JjOworCQkJc3JjICA9IGRvbGxhciArIDE7CisJCX0gZWxzZSB7CisJCQkvKiBpdCB3YXNuJ3QgYSAiSWQkIiBvciAiSWQ6eHh4eCQiICovCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHN0ZXAgNDogc3Vic3RpdHV0ZSAqLworCQlzdHJidWZfYWRkc3RyKGJ1ZiwgIklkOiAiKTsKKwkJc3RyYnVmX2FkZChidWYsIHNoYTFfdG9faGV4KHNoYTEpLCA0MCk7CisJCXN0cmJ1Zl9hZGRzdHIoYnVmLCAiICQiKTsKKwl9CisJc3RyYnVmX2FkZChidWYsIHNyYywgbGVuKTsKKworCWZyZWUodG9fZnJlZSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZ2l0X3BhdGhfY2hlY2tfY3JsZihjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgZ2l0X2F0dHJfY2hlY2sgKmNoZWNrKQoreworCWNvbnN0IGNoYXIgKnZhbHVlID0gY2hlY2stPnZhbHVlOworCisJaWYgKEFUVFJfVFJVRSh2YWx1ZSkpCisJCXJldHVybiBDUkxGX1RFWFQ7CisJZWxzZSBpZiAoQVRUUl9GQUxTRSh2YWx1ZSkpCisJCXJldHVybiBDUkxGX0JJTkFSWTsKKwllbHNlIGlmIChBVFRSX1VOU0VUKHZhbHVlKSkKKwkJOworCWVsc2UgaWYgKCFzdHJjbXAodmFsdWUsICJpbnB1dCIpKQorCQlyZXR1cm4gQ1JMRl9JTlBVVDsKKwlyZXR1cm4gQ1JMRl9HVUVTUzsKK30KKworc3RhdGljIHN0cnVjdCBjb252ZXJ0X2RyaXZlciAqZ2l0X3BhdGhfY2hlY2tfY29udmVydChjb25zdCBjaGFyICpwYXRoLAorCQkJCQkgICAgIHN0cnVjdCBnaXRfYXR0cl9jaGVjayAqY2hlY2spCit7CisJY29uc3QgY2hhciAqdmFsdWUgPSBjaGVjay0+dmFsdWU7CisJc3RydWN0IGNvbnZlcnRfZHJpdmVyICpkcnY7CisKKwlpZiAoQVRUUl9UUlVFKHZhbHVlKSB8fCBBVFRSX0ZBTFNFKHZhbHVlKSB8fCBBVFRSX1VOU0VUKHZhbHVlKSkKKwkJcmV0dXJuIE5VTEw7CisJZm9yIChkcnYgPSB1c2VyX2NvbnZlcnQ7IGRydjsgZHJ2ID0gZHJ2LT5uZXh0KQorCQlpZiAoIXN0cmNtcCh2YWx1ZSwgZHJ2LT5uYW1lKSkKKwkJCXJldHVybiBkcnY7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZ2l0X3BhdGhfY2hlY2tfaWRlbnQoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IGdpdF9hdHRyX2NoZWNrICpjaGVjaykKK3sKKwljb25zdCBjaGFyICp2YWx1ZSA9IGNoZWNrLT52YWx1ZTsKKworCXJldHVybiAhIUFUVFJfVFJVRSh2YWx1ZSk7Cit9CisKK2ludCBjb252ZXJ0X3RvX2dpdChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgc3RydWN0IHN0cmJ1ZiAqZHN0LCBlbnVtIHNhZmVfY3JsZiBjaGVja3NhZmUpCit7CisJc3RydWN0IGdpdF9hdHRyX2NoZWNrIGNoZWNrWzNdOworCWludCBjcmxmID0gQ1JMRl9HVUVTUzsKKwlpbnQgaWRlbnQgPSAwLCByZXQgPSAwOworCWNoYXIgKmZpbHRlciA9IE5VTEw7CisKKwlzZXR1cF9jb252ZXJ0X2NoZWNrKGNoZWNrKTsKKwlpZiAoIWdpdF9jaGVja2F0dHIocGF0aCwgQVJSQVlfU0laRShjaGVjayksIGNoZWNrKSkgeworCQlzdHJ1Y3QgY29udmVydF9kcml2ZXIgKmRydjsKKwkJY3JsZiA9IGdpdF9wYXRoX2NoZWNrX2NybGYocGF0aCwgY2hlY2sgKyAwKTsKKwkJaWRlbnQgPSBnaXRfcGF0aF9jaGVja19pZGVudChwYXRoLCBjaGVjayArIDEpOworCQlkcnYgPSBnaXRfcGF0aF9jaGVja19jb252ZXJ0KHBhdGgsIGNoZWNrICsgMik7CisJCWlmIChkcnYgJiYgZHJ2LT5jbGVhbikKKwkJCWZpbHRlciA9IGRydi0+Y2xlYW47CisJfQorCisJcmV0IHw9IGFwcGx5X2ZpbHRlcihwYXRoLCBzcmMsIGxlbiwgZHN0LCBmaWx0ZXIpOworCWlmIChyZXQpIHsKKwkJc3JjID0gZHN0LT5idWY7CisJCWxlbiA9IGRzdC0+bGVuOworCX0KKwlyZXQgfD0gY3JsZl90b19naXQocGF0aCwgc3JjLCBsZW4sIGRzdCwgY3JsZiwgY2hlY2tzYWZlKTsKKwlpZiAocmV0KSB7CisJCXNyYyA9IGRzdC0+YnVmOworCQlsZW4gPSBkc3QtPmxlbjsKKwl9CisJcmV0dXJuIHJldCB8IGlkZW50X3RvX2dpdChwYXRoLCBzcmMsIGxlbiwgZHN0LCBpZGVudCk7Cit9CisKK2ludCBjb252ZXJ0X3RvX3dvcmtpbmdfdHJlZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBsZW4sIHN0cnVjdCBzdHJidWYgKmRzdCkKK3sKKwlzdHJ1Y3QgZ2l0X2F0dHJfY2hlY2sgY2hlY2tbM107CisJaW50IGNybGYgPSBDUkxGX0dVRVNTOworCWludCBpZGVudCA9IDAsIHJldCA9IDA7CisJY2hhciAqZmlsdGVyID0gTlVMTDsKKworCXNldHVwX2NvbnZlcnRfY2hlY2soY2hlY2spOworCWlmICghZ2l0X2NoZWNrYXR0cihwYXRoLCBBUlJBWV9TSVpFKGNoZWNrKSwgY2hlY2spKSB7CisJCXN0cnVjdCBjb252ZXJ0X2RyaXZlciAqZHJ2OworCQljcmxmID0gZ2l0X3BhdGhfY2hlY2tfY3JsZihwYXRoLCBjaGVjayArIDApOworCQlpZGVudCA9IGdpdF9wYXRoX2NoZWNrX2lkZW50KHBhdGgsIGNoZWNrICsgMSk7CisJCWRydiA9IGdpdF9wYXRoX2NoZWNrX2NvbnZlcnQocGF0aCwgY2hlY2sgKyAyKTsKKwkJaWYgKGRydiAmJiBkcnYtPnNtdWRnZSkKKwkJCWZpbHRlciA9IGRydi0+c211ZGdlOworCX0KKworCXJldCB8PSBpZGVudF90b193b3JrdHJlZShwYXRoLCBzcmMsIGxlbiwgZHN0LCBpZGVudCk7CisJaWYgKHJldCkgeworCQlzcmMgPSBkc3QtPmJ1ZjsKKwkJbGVuID0gZHN0LT5sZW47CisJfQorCXJldCB8PSBjcmxmX3RvX3dvcmt0cmVlKHBhdGgsIHNyYywgbGVuLCBkc3QsIGNybGYpOworCWlmIChyZXQpIHsKKwkJc3JjID0gZHN0LT5idWY7CisJCWxlbiA9IGRzdC0+bGVuOworCX0KKwlyZXR1cm4gcmV0IHwgYXBwbHlfZmlsdGVyKHBhdGgsIHNyYywgbGVuLCBkc3QsIGZpbHRlcik7Cit9CmRpZmYgLS1naXQgYS9jb3B5LmMgYi9jb3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZjNGZiZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcHkuYwpAQCAtMCwwICsxLDU3IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKworaW50IGNvcHlfZmQoaW50IGlmZCwgaW50IG9mZCkKK3sKKwl3aGlsZSAoMSkgeworCQljaGFyIGJ1ZmZlcls4MTkyXTsKKwkJY2hhciAqYnVmID0gYnVmZmVyOworCQlzc2l6ZV90IGxlbiA9IHhyZWFkKGlmZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisJCWlmICghbGVuKQorCQkJYnJlYWs7CisJCWlmIChsZW4gPCAwKSB7CisJCQlpbnQgcmVhZF9lcnJvcjsKKwkJCXJlYWRfZXJyb3IgPSBlcnJubzsKKwkJCWNsb3NlKGlmZCk7CisJCQlyZXR1cm4gZXJyb3IoImNvcHktZmQ6IHJlYWQgcmV0dXJuZWQgJXMiLAorCQkJCSAgICAgc3RyZXJyb3IocmVhZF9lcnJvcikpOworCQl9CisJCXdoaWxlIChsZW4pIHsKKwkJCWludCB3cml0dGVuID0geHdyaXRlKG9mZCwgYnVmLCBsZW4pOworCQkJaWYgKHdyaXR0ZW4gPiAwKSB7CisJCQkJYnVmICs9IHdyaXR0ZW47CisJCQkJbGVuIC09IHdyaXR0ZW47CisJCQl9CisJCQllbHNlIGlmICghd3JpdHRlbikgeworCQkJCWNsb3NlKGlmZCk7CisJCQkJcmV0dXJuIGVycm9yKCJjb3B5LWZkOiB3cml0ZSByZXR1cm5lZCAwIik7CisJCQl9IGVsc2UgeworCQkJCWNsb3NlKGlmZCk7CisJCQkJcmV0dXJuIGVycm9yKCJjb3B5LWZkOiB3cml0ZSByZXR1cm5lZCAlcyIsCisJCQkJCSAgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0KKwkJfQorCX0KKwljbG9zZShpZmQpOworCXJldHVybiAwOworfQorCitpbnQgY29weV9maWxlKGNvbnN0IGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBpbnQgbW9kZSkKK3sKKwlpbnQgZmRpLCBmZG8sIHN0YXR1czsKKworCW1vZGUgPSAobW9kZSAmIDAxMTEpID8gMDc3NyA6IDA2NjY7CisJaWYgKChmZGkgPSBvcGVuKHNyYywgT19SRE9OTFkpKSA8IDApCisJCXJldHVybiBmZGk7CisJaWYgKChmZG8gPSBvcGVuKGRzdCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMLCBtb2RlKSkgPCAwKSB7CisJCWNsb3NlKGZkaSk7CisJCXJldHVybiBmZG87CisJfQorCXN0YXR1cyA9IGNvcHlfZmQoZmRpLCBmZG8pOworCWlmIChjbG9zZShmZG8pICE9IDApCisJCXJldHVybiBlcnJvcigiJXM6IHdyaXRlIGVycm9yOiAlcyIsIGRzdCwgc3RyZXJyb3IoZXJybm8pKTsKKworCWlmICghc3RhdHVzICYmIGFkanVzdF9zaGFyZWRfcGVybShkc3QpKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvY3N1bS1maWxlLmMgYi9jc3VtLWZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzI4YTk5Ci0tLSAvZGV2L251bGwKKysrIGIvY3N1bS1maWxlLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBjc3VtLWZpbGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBMaW51cyBUb3J2YWxkcworICoKKyAqIFNpbXBsZSBmaWxlIHdyaXRlIGluZnJhc3RydWN0dXJlIGZvciB3cml0aW5nIFNIQTEtc3VtbWVkCisgKiBmaWxlcy4gVXNlZnVsIHdoZW4geW91IHdyaXRlIGEgZmlsZSB0aGF0IHlvdSB3YW50IHRvIGJlCisgKiBhYmxlIHRvIHZlcmlmeSBoYXNuJ3QgYmVlbiBtZXNzZWQgd2l0aCBhZnRlcndhcmRzLgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJwcm9ncmVzcy5oIgorI2luY2x1ZGUgImNzdW0tZmlsZS5oIgorCitzdGF0aWMgdm9pZCBzaGExZmx1c2goc3RydWN0IHNoYTFmaWxlICpmLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJdm9pZCAqYnVmID0gZi0+YnVmZmVyOworCisJZm9yICg7OykgeworCQlpbnQgcmV0ID0geHdyaXRlKGYtPmZkLCBidWYsIGNvdW50KTsKKwkJaWYgKHJldCA+IDApIHsKKwkJCWYtPnRvdGFsICs9IHJldDsKKwkJCWRpc3BsYXlfdGhyb3VnaHB1dChmLT50cCwgZi0+dG90YWwpOworCQkJYnVmID0gKGNoYXIgKikgYnVmICsgcmV0OworCQkJY291bnQgLT0gcmV0OworCQkJaWYgKGNvdW50KQorCQkJCWNvbnRpbnVlOworCQkJcmV0dXJuOworCQl9CisJCWlmICghcmV0KQorCQkJZGllKCJzaGExIGZpbGUgJyVzJyB3cml0ZSBlcnJvci4gT3V0IG9mIGRpc2tzcGFjZSIsIGYtPm5hbWUpOworCQlkaWUoInNoYTEgZmlsZSAnJXMnIHdyaXRlIGVycm9yICglcykiLCBmLT5uYW1lLCBzdHJlcnJvcihlcnJubykpOworCX0KK30KKworaW50IHNoYTFjbG9zZShzdHJ1Y3Qgc2hhMWZpbGUgKmYsIHVuc2lnbmVkIGNoYXIgKnJlc3VsdCwgaW50IGZpbmFsKQoreworCWludCBmZDsKKwl1bnNpZ25lZCBvZmZzZXQgPSBmLT5vZmZzZXQ7CisJaWYgKG9mZnNldCkgeworCQlTSEExX1VwZGF0ZSgmZi0+Y3R4LCBmLT5idWZmZXIsIG9mZnNldCk7CisJCXNoYTFmbHVzaChmLCBvZmZzZXQpOworCQlmLT5vZmZzZXQgPSAwOworCX0KKwlpZiAoZmluYWwpIHsKKwkJLyogd3JpdGUgY2hlY2tzdW0gYW5kIGNsb3NlIGZkICovCisJCVNIQTFfRmluYWwoZi0+YnVmZmVyLCAmZi0+Y3R4KTsKKwkJaWYgKHJlc3VsdCkKKwkJCWhhc2hjcHkocmVzdWx0LCBmLT5idWZmZXIpOworCQlzaGExZmx1c2goZiwgMjApOworCQlpZiAoY2xvc2UoZi0+ZmQpKQorCQkJZGllKCIlczogc2hhMSBmaWxlIGVycm9yIG9uIGNsb3NlICglcykiLAorCQkJICAgIGYtPm5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCWZkID0gMDsKKwl9IGVsc2UKKwkJZmQgPSBmLT5mZDsKKwlmcmVlKGYpOworCXJldHVybiBmZDsKK30KKworaW50IHNoYTF3cml0ZShzdHJ1Y3Qgc2hhMWZpbGUgKmYsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGNvdW50KQoreworCWlmIChmLT5kb19jcmMpCisJCWYtPmNyYzMyID0gY3JjMzIoZi0+Y3JjMzIsIGJ1ZiwgY291bnQpOworCXdoaWxlIChjb3VudCkgeworCQl1bnNpZ25lZCBvZmZzZXQgPSBmLT5vZmZzZXQ7CisJCXVuc2lnbmVkIGxlZnQgPSBzaXplb2YoZi0+YnVmZmVyKSAtIG9mZnNldDsKKwkJdW5zaWduZWQgbnIgPSBjb3VudCA+IGxlZnQgPyBsZWZ0IDogY291bnQ7CisKKwkJbWVtY3B5KGYtPmJ1ZmZlciArIG9mZnNldCwgYnVmLCBucik7CisJCWNvdW50IC09IG5yOworCQlvZmZzZXQgKz0gbnI7CisJCWJ1ZiA9IChjaGFyICopIGJ1ZiArIG5yOworCQlsZWZ0IC09IG5yOworCQlpZiAoIWxlZnQpIHsKKwkJCVNIQTFfVXBkYXRlKCZmLT5jdHgsIGYtPmJ1ZmZlciwgb2Zmc2V0KTsKKwkJCXNoYTFmbHVzaChmLCBvZmZzZXQpOworCQkJb2Zmc2V0ID0gMDsKKwkJfQorCQlmLT5vZmZzZXQgPSBvZmZzZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc2hhMWZpbGUgKnNoYTFmZChpbnQgZmQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIHNoYTFmZF90aHJvdWdocHV0KGZkLCBuYW1lLCBOVUxMKTsKK30KKworc3RydWN0IHNoYTFmaWxlICpzaGExZmRfdGhyb3VnaHB1dChpbnQgZmQsIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBwcm9ncmVzcyAqdHApCit7CisJc3RydWN0IHNoYTFmaWxlICpmID0geG1hbGxvYyhzaXplb2YoKmYpKTsKKwlmLT5mZCA9IGZkOworCWYtPm9mZnNldCA9IDA7CisJZi0+dG90YWwgPSAwOworCWYtPnRwID0gdHA7CisJZi0+bmFtZSA9IG5hbWU7CisJZi0+ZG9fY3JjID0gMDsKKwlTSEExX0luaXQoJmYtPmN0eCk7CisJcmV0dXJuIGY7Cit9CisKK3ZvaWQgY3JjMzJfYmVnaW4oc3RydWN0IHNoYTFmaWxlICpmKQoreworCWYtPmNyYzMyID0gY3JjMzIoMCwgWl9OVUxMLCAwKTsKKwlmLT5kb19jcmMgPSAxOworfQorCit1aW50MzJfdCBjcmMzMl9lbmQoc3RydWN0IHNoYTFmaWxlICpmKQoreworCWYtPmRvX2NyYyA9IDA7CisJcmV0dXJuIGYtPmNyYzMyOworfQpkaWZmIC0tZ2l0IGEvY3N1bS1maWxlLmggYi9jc3VtLWZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWY3NjU2Ci0tLSAvZGV2L251bGwKKysrIGIvY3N1bS1maWxlLmgKQEAgLTAsMCArMSwyNiBAQAorI2lmbmRlZiBDU1VNX0ZJTEVfSAorI2RlZmluZSBDU1VNX0ZJTEVfSAorCitzdHJ1Y3QgcHJvZ3Jlc3M7CisKKy8qIEEgU0hBMS1wcm90ZWN0ZWQgZmlsZSAqLworc3RydWN0IHNoYTFmaWxlIHsKKwlpbnQgZmQ7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwlTSEFfQ1RYIGN0eDsKKwlvZmZfdCB0b3RhbDsKKwlzdHJ1Y3QgcHJvZ3Jlc3MgKnRwOworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGRvX2NyYzsKKwl1aW50MzJfdCBjcmMzMjsKKwl1bnNpZ25lZCBjaGFyIGJ1ZmZlcls4MTkyXTsKK307CisKK2V4dGVybiBzdHJ1Y3Qgc2hhMWZpbGUgKnNoYTFmZChpbnQgZmQsIGNvbnN0IGNoYXIgKm5hbWUpOworZXh0ZXJuIHN0cnVjdCBzaGExZmlsZSAqc2hhMWZkX3Rocm91Z2hwdXQoaW50IGZkLCBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgcHJvZ3Jlc3MgKnRwKTsKK2V4dGVybiBpbnQgc2hhMWNsb3NlKHN0cnVjdCBzaGExZmlsZSAqLCB1bnNpZ25lZCBjaGFyICosIGludCk7CitleHRlcm4gaW50IHNoYTF3cml0ZShzdHJ1Y3Qgc2hhMWZpbGUgKiwgdm9pZCAqLCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgY3JjMzJfYmVnaW4oc3RydWN0IHNoYTFmaWxlICopOworZXh0ZXJuIHVpbnQzMl90IGNyYzMyX2VuZChzdHJ1Y3Qgc2hhMWZpbGUgKik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3R5cGUuYyBiL2N0eXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUwNmViNwotLS0gL2Rldi9udWxsCisrKyBiL2N0eXBlLmMKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIFNhbmUgbG9jYWxlLWluZGVwZW5kZW50LCBBU0NJSSBjdHlwZS4KKyAqCisgKiBObyBzdXJwcmlzZXMsIGFuZCB3b3JrcyB3aXRoIHNpZ25lZCBhbmQgdW5zaWduZWQgY2hhcnMuCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorCisjZGVmaW5lIFNTIEdJVF9TUEFDRQorI2RlZmluZSBBQSBHSVRfQUxQSEEKKyNkZWZpbmUgREQgR0lUX0RJR0lUCisKK3Vuc2lnbmVkIGNoYXIgc2FuZV9jdHlwZVsyNTZdID0geworCSAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIFNTLCBTUywgIDAsICAwLCBTUywgIDAsICAwLAkJLyogMC0xNSAqLworCSAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAkJLyogMTYtMTUgKi8KKwlTUywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwJCS8qIDMyLTE1ICovCisJREQsIERELCBERCwgREQsIERELCBERCwgREQsIERELCBERCwgREQsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCQkvKiA0OC0xNSAqLworCSAwLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLAkJLyogNjQtMTUgKi8KKwlBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsICAwLCAgMCwgIDAsICAwLCAgMCwJCS8qIDgwLTE1ICovCisJIDAsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsCQkvKiA5Ni0xNSAqLworCUFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgIDAsICAwLCAgMCwgIDAsICAwLAkJLyogMTEyLTE1ICovCisJLyogTm90aGluZyBpbiB0aGUgMTI4Li4gcmFuZ2UgKi8KK307CmRpZmYgLS1naXQgYS9kYWVtb24uYyBiL2RhZW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNGE2ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kYWVtb24uYwpAQCAtMCwwICsxLDEyMTcgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInBrdC1saW5lLmgiCisjaW5jbHVkZSAiZXhlY19jbWQuaCIKKyNpbmNsdWRlICJpbnRlcnBvbGF0ZS5oIgorCisjaW5jbHVkZSA8c3lzbG9nLmg+CisKKyNpZm5kZWYgSE9TVF9OQU1FX01BWAorI2RlZmluZSBIT1NUX05BTUVfTUFYIDI1NgorI2VuZGlmCisKKyNpZm5kZWYgTklfTUFYU0VSVgorI2RlZmluZSBOSV9NQVhTRVJWIDMyCisjZW5kaWYKKworc3RhdGljIGludCBsb2dfc3lzbG9nOworc3RhdGljIGludCB2ZXJib3NlOworc3RhdGljIGludCByZXVzZWFkZHI7CisKK3N0YXRpYyBjb25zdCBjaGFyIGRhZW1vbl91c2FnZVtdID0KKyJnaXQtZGFlbW9uIFstLXZlcmJvc2VdIFstLXN5c2xvZ10gWy0tZXhwb3J0LWFsbF1cbiIKKyIgICAgICAgICAgIFstLXRpbWVvdXQ9bl0gWy0taW5pdC10aW1lb3V0PW5dIFstLXN0cmljdC1wYXRoc11cbiIKKyIgICAgICAgICAgIFstLWJhc2UtcGF0aD1wYXRoXSBbLS1iYXNlLXBhdGgtcmVsYXhlZF1cbiIKKyIgICAgICAgICAgIFstLXVzZXItcGF0aCB8IC0tdXNlci1wYXRoPXBhdGhdXG4iCisiICAgICAgICAgICBbLS1pbnRlcnBvbGF0ZWQtcGF0aD1wYXRoXVxuIgorIiAgICAgICAgICAgWy0tcmV1c2VhZGRyXSBbLS1kZXRhY2hdIFstLXBpZC1maWxlPWZpbGVdXG4iCisiICAgICAgICAgICBbLS1bZW5hYmxlfGRpc2FibGV8YWxsb3ctb3ZlcnJpZGV8Zm9yYmlkLW92ZXJyaWRlXT1zZXJ2aWNlXVxuIgorIiAgICAgICAgICAgWy0taW5ldGQgfCBbLS1saXN0ZW49aG9zdF9vcl9pcGFkZHJdIFstLXBvcnQ9bl1cbiIKKyIgICAgICAgICAgICAgICAgICAgICAgWy0tdXNlcj11c2VyIFstLWdyb3VwPWdyb3VwXV1cbiIKKyIgICAgICAgICAgIFtkaXJlY3RvcnkuLi5dIjsKKworLyogTGlzdCBvZiBhY2NlcHRhYmxlIHBhdGhuYW1lIHByZWZpeGVzICovCitzdGF0aWMgY2hhciAqKm9rX3BhdGhzOworc3RhdGljIGludCBzdHJpY3RfcGF0aHM7CisKKy8qIElmIHRoaXMgaXMgc2V0LCBnaXQtZGFlbW9uLWV4cG9ydC1vayBpcyBub3QgcmVxdWlyZWQgKi8KK3N0YXRpYyBpbnQgZXhwb3J0X2FsbF90cmVlczsKKworLyogVGFrZSBhbGwgcGF0aHMgcmVsYXRpdmUgdG8gdGhpcyBvbmUgaWYgbm9uLU5VTEwgKi8KK3N0YXRpYyBjaGFyICpiYXNlX3BhdGg7CitzdGF0aWMgY2hhciAqaW50ZXJwb2xhdGVkX3BhdGg7CitzdGF0aWMgaW50IGJhc2VfcGF0aF9yZWxheGVkOworCisvKiBGbGFnIGluZGljYXRpbmcgY2xpZW50IHNlbnQgZXh0cmEgYXJncy4gKi8KK3N0YXRpYyBpbnQgc2F3X2V4dGVuZGVkX2FyZ3M7CisKKy8qIElmIGRlZmluZWQsIH51c2VyIG5vdGF0aW9uIGlzIGFsbG93ZWQgYW5kIHRoZSBzdHJpbmcgaXMgaW5zZXJ0ZWQKKyAqIGFmdGVyIH51c2VyLy4gIEUuZy4gYSByZXF1ZXN0IHRvIGdpdDovL2hvc3QvfmFsaWNlL2Zyb3R6IHdvdWxkCisgKiBnbyB0byAvaG9tZS9hbGljZS9wdWJfZ2l0L2Zyb3R6IHdpdGggLS11c2VyLXBhdGg9cHViX2dpdC4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKnVzZXJfcGF0aDsKKworLyogVGltZW91dCwgYW5kIGluaXRpYWwgdGltZW91dCAqLworc3RhdGljIHVuc2lnbmVkIGludCB0aW1lb3V0Oworc3RhdGljIHVuc2lnbmVkIGludCBpbml0X3RpbWVvdXQ7CisKKy8qCisgKiBTdGF0aWMgdGFibGUgZm9yIG5vdy4gIFVnaC4KKyAqIEZlZWwgZnJlZSB0byBtYWtlIGR5bmFtaWMgYXMgbmVlZGVkLgorICovCisjZGVmaW5lIElOVEVSUF9TTE9UX0hPU1QJKDApCisjZGVmaW5lIElOVEVSUF9TTE9UX0NBTk9OX0hPU1QJKDEpCisjZGVmaW5lIElOVEVSUF9TTE9UX0lQCQkoMikKKyNkZWZpbmUgSU5URVJQX1NMT1RfUE9SVAkoMykKKyNkZWZpbmUgSU5URVJQX1NMT1RfRElSCQkoNCkKKyNkZWZpbmUgSU5URVJQX1NMT1RfUEVSQ0VOVAkoNSkKKworc3RhdGljIHN0cnVjdCBpbnRlcnAgaW50ZXJwX3RhYmxlW10gPSB7CisJeyAiJUgiLCAwfSwKKwl7ICIlQ0giLCAwfSwKKwl7ICIlSVAiLCAwfSwKKwl7ICIlUCIsIDB9LAorCXsgIiVEIiwgMH0sCisJeyAiJSUiLCAwfSwKK307CisKKworc3RhdGljIHZvaWQgbG9ncmVwb3J0KGludCBwcmlvcml0eSwgY29uc3QgY2hhciAqZXJyLCB2YV9saXN0IHBhcmFtcykKK3sKKwkvKiBXZSBzaG91bGQgZG8gYSBzaW5nbGUgd3JpdGUgc28gdGhhdCBpdCBpcyBhdG9taWMgYW5kIG91dHB1dAorCSAqIG9mIHNldmVyYWwgcHJvY2Vzc2VzIGRvIG5vdCBnZXQgaW50ZXJtaW5nbGVkLiAqLworCWNoYXIgYnVmWzEwMjRdOworCWludCBidWZsZW47CisJaW50IG1heGxlbiwgbXNnbGVuOworCisJLyogc2l6ZW9mKGJ1Zikgc2hvdWxkIGJlIGJpZyBlbm91Z2ggZm9yICJbcGlkXSBcbiIgKi8KKwlidWZsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiWyVsZF0gIiwgKGxvbmcpIGdldHBpZCgpKTsKKworCW1heGxlbiA9IHNpemVvZihidWYpIC0gYnVmbGVuIC0gMTsgLyogLTEgZm9yIG91ciBvd24gTEYgKi8KKwltc2dsZW4gPSB2c25wcmludGYoYnVmICsgYnVmbGVuLCBtYXhsZW4sIGVyciwgcGFyYW1zKTsKKworCWlmIChsb2dfc3lzbG9nKSB7CisJCXN5c2xvZyhwcmlvcml0eSwgIiVzIiwgYnVmKTsKKwkJcmV0dXJuOworCX0KKworCS8qIG1heGxlbiBjb3VudGVkIG91ciBvd24gTEYgYnV0IGFsc28gY291bnRzIHNwYWNlIGdpdmVuIHRvCisJICogdnNucHJpbnRmIGZvciB0aGUgdGVybWluYXRpbmcgTlVMLiAgV2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdAorCSAqIHdlIGhhdmUgc3BhY2UgZm9yIG91ciBvd24gTEYgYW5kIE5VTCBhZnRlciB0aGUgIm1lYXQiIG9mIHRoZQorCSAqIG1lc3NhZ2UsIHNvIHRydW5jYXRlIGl0IGF0IG1heGxlbiAtIDEuCisJICovCisJaWYgKG1zZ2xlbiA+IG1heGxlbiAtIDEpCisJCW1zZ2xlbiA9IG1heGxlbiAtIDE7CisJZWxzZSBpZiAobXNnbGVuIDwgMCkKKwkJbXNnbGVuID0gMDsgLyogUHJvdGVjdCBhZ2FpbnN0IHdlaXJkIHJldHVybiB2YWx1ZXMuICovCisJYnVmbGVuICs9IG1zZ2xlbjsKKworCWJ1ZltidWZsZW4rK10gPSAnXG4nOworCWJ1ZltidWZsZW5dID0gJ1wwJzsKKworCXdyaXRlX2luX2Z1bGwoMiwgYnVmLCBidWZsZW4pOworfQorCitzdGF0aWMgdm9pZCBsb2dlcnJvcihjb25zdCBjaGFyICplcnIsIC4uLikKK3sKKwl2YV9saXN0IHBhcmFtczsKKwl2YV9zdGFydChwYXJhbXMsIGVycik7CisJbG9ncmVwb3J0KExPR19FUlIsIGVyciwgcGFyYW1zKTsKKwl2YV9lbmQocGFyYW1zKTsKK30KKworc3RhdGljIHZvaWQgbG9naW5mbyhjb25zdCBjaGFyICplcnIsIC4uLikKK3sKKwl2YV9saXN0IHBhcmFtczsKKwlpZiAoIXZlcmJvc2UpCisJCXJldHVybjsKKwl2YV9zdGFydChwYXJhbXMsIGVycik7CisJbG9ncmVwb3J0KExPR19JTkZPLCBlcnIsIHBhcmFtcyk7CisJdmFfZW5kKHBhcmFtcyk7Cit9CisKK3N0YXRpYyB2b2lkIE5PUkVUVVJOIGRhZW1vbl9kaWUoY29uc3QgY2hhciAqZXJyLCB2YV9saXN0IHBhcmFtcykKK3sKKwlsb2dyZXBvcnQoTE9HX0VSUiwgZXJyLCBwYXJhbXMpOworCWV4aXQoMSk7Cit9CisKK3N0YXRpYyBpbnQgYXZvaWRfYWxpYXMoY2hhciAqcCkKK3sKKwlpbnQgc2wsIG5kb3Q7CisKKwkvKgorCSAqIFRoaXMgcmVzdXJyZWN0cyB0aGUgYmVsdHMgYW5kIHN1c3BlbmRlcnMgcGFyYW5vaWEgY2hlY2sgYnkgSFBBCisJICogZG9uZSBpbiA8NDM1NTYwRjcuNDA4MDAwNkB6eXRvci5jb20+IHRocmVhZCwgbm93IGVudGVyX3JlcG8oKQorCSAqIGRvZXMgbm90IGRvIGdldGN3ZCgpIGJhc2VkIHBhdGggY2Fub25pY2FsaXphdGlvbnMuCisJICoKKwkgKiBzbCBiZWNvbWVzIHRydWUgaW1tZWRpYXRlbHkgYWZ0ZXIgc2VlaW5nICcvJyBhbmQgY29udGludWVzIHRvCisJICogYmUgdHJ1ZSBhcyBsb25nIGFzIGRvdHMgY29udGludWUgYWZ0ZXIgdGhhdCB3aXRob3V0IGludGVydmVuaW5nCisJICogbm9uLWRvdCBjaGFyYWN0ZXIuCisJICovCisJaWYgKCFwIHx8ICgqcCAhPSAnLycgJiYgKnAgIT0gJ34nKSkKKwkJcmV0dXJuIC0xOworCXNsID0gMTsgbmRvdCA9IDA7CisJcCsrOworCisJd2hpbGUgKDEpIHsKKwkJY2hhciBjaCA9ICpwKys7CisJCWlmIChzbCkgeworCQkJaWYgKGNoID09ICcuJykKKwkJCQluZG90Kys7CisJCQllbHNlIGlmIChjaCA9PSAnLycpIHsKKwkJCQlpZiAobmRvdCA8IDMpCisJCQkJCS8qIHJlamVjdCAvLywgLy4vIGFuZCAvLi4vICovCisJCQkJCXJldHVybiAtMTsKKwkJCQluZG90ID0gMDsKKwkJCX0KKwkJCWVsc2UgaWYgKGNoID09IDApIHsKKwkJCQlpZiAoMCA8IG5kb3QgJiYgbmRvdCA8IDMpCisJCQkJCS8qIHJlamVjdCAvLiQgYW5kIC8uLiQgKi8KKwkJCQkJcmV0dXJuIC0xOworCQkJCXJldHVybiAwOworCQkJfQorCQkJZWxzZQorCQkJCXNsID0gbmRvdCA9IDA7CisJCX0KKwkJZWxzZSBpZiAoY2ggPT0gMCkKKwkJCXJldHVybiAwOworCQllbHNlIGlmIChjaCA9PSAnLycpIHsKKwkJCXNsID0gMTsKKwkJCW5kb3QgPSAwOworCQl9CisJfQorfQorCitzdGF0aWMgY2hhciAqcGF0aF9vayhzdHJ1Y3QgaW50ZXJwICppdGFibGUpCit7CisJc3RhdGljIGNoYXIgcnBhdGhbUEFUSF9NQVhdOworCXN0YXRpYyBjaGFyIGludGVycF9wYXRoW1BBVEhfTUFYXTsKKwlpbnQgcmV0cmllZF9wYXRoID0gMDsKKwljaGFyICpwYXRoOworCWNoYXIgKmRpcjsKKworCWRpciA9IGl0YWJsZVtJTlRFUlBfU0xPVF9ESVJdLnZhbHVlOworCisJaWYgKGF2b2lkX2FsaWFzKGRpcikpIHsKKwkJbG9nZXJyb3IoIiclcyc6IGFsaWFzZWQiLCBkaXIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoKmRpciA9PSAnficpIHsKKwkJaWYgKCF1c2VyX3BhdGgpIHsKKwkJCWxvZ2Vycm9yKCInJXMnOiBVc2VyLXBhdGggbm90IGFsbG93ZWQiLCBkaXIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKCp1c2VyX3BhdGgpIHsKKwkJCS8qIEdvdCBlaXRoZXIgIn5hbGljZSIgb3IgIn5hbGljZS9mb28iOworCQkJICogcmV3cml0ZSB0aGVtIHRvICJ+YWxpY2UvJXMiIG9yCisJCQkgKiAifmFsaWNlLyVzL2ZvbyIuCisJCQkgKi8KKwkJCWludCBuYW1sZW4sIHJlc3RsZW4gPSBzdHJsZW4oZGlyKTsKKwkJCWNoYXIgKnNsYXNoID0gc3RyY2hyKGRpciwgJy8nKTsKKwkJCWlmICghc2xhc2gpCisJCQkJc2xhc2ggPSBkaXIgKyByZXN0bGVuOworCQkJbmFtbGVuID0gc2xhc2ggLSBkaXI7CisJCQlyZXN0bGVuIC09IG5hbWxlbjsKKwkJCWxvZ2luZm8oInVzZXJwYXRoIDwlcz4sIHJlcXVlc3QgPCVzPiwgbmFtbGVuICVkLCByZXN0bGVuICVkLCBzbGFzaCA8JXM+IiwgdXNlcl9wYXRoLCBkaXIsIG5hbWxlbiwgcmVzdGxlbiwgc2xhc2gpOworCQkJc25wcmludGYocnBhdGgsIFBBVEhfTUFYLCAiJS4qcy8lcyUuKnMiLAorCQkJCSBuYW1sZW4sIGRpciwgdXNlcl9wYXRoLCByZXN0bGVuLCBzbGFzaCk7CisJCQlkaXIgPSBycGF0aDsKKwkJfQorCX0KKwllbHNlIGlmIChpbnRlcnBvbGF0ZWRfcGF0aCAmJiBzYXdfZXh0ZW5kZWRfYXJncykgeworCQlpZiAoKmRpciAhPSAnLycpIHsKKwkJCS8qIEFsbG93IG9ubHkgYWJzb2x1dGUgKi8KKwkJCWxvZ2Vycm9yKCInJXMnOiBOb24tYWJzb2x1dGUgcGF0aCBkZW5pZWQgKGludGVycG9sYXRlZC1wYXRoIGFjdGl2ZSkiLCBkaXIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlpbnRlcnBvbGF0ZShpbnRlcnBfcGF0aCwgUEFUSF9NQVgsIGludGVycG9sYXRlZF9wYXRoLAorCQkJICAgIGludGVycF90YWJsZSwgQVJSQVlfU0laRShpbnRlcnBfdGFibGUpKTsKKwkJbG9naW5mbygiSW50ZXJwb2xhdGVkIGRpciAnJXMnIiwgaW50ZXJwX3BhdGgpOworCisJCWRpciA9IGludGVycF9wYXRoOworCX0KKwllbHNlIGlmIChiYXNlX3BhdGgpIHsKKwkJaWYgKCpkaXIgIT0gJy8nKSB7CisJCQkvKiBBbGxvdyBvbmx5IGFic29sdXRlICovCisJCQlsb2dlcnJvcigiJyVzJzogTm9uLWFic29sdXRlIHBhdGggZGVuaWVkIChiYXNlLXBhdGggYWN0aXZlKSIsIGRpcik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlzbnByaW50ZihycGF0aCwgUEFUSF9NQVgsICIlcyVzIiwgYmFzZV9wYXRoLCBkaXIpOworCQlkaXIgPSBycGF0aDsKKwl9CisKKwlkbyB7CisJCXBhdGggPSBlbnRlcl9yZXBvKGRpciwgc3RyaWN0X3BhdGhzKTsKKwkJaWYgKHBhdGgpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBpZiB3ZSBmYWlsIGFuZCBiYXNlX3BhdGhfcmVsYXhlZCBpcyBlbmFibGVkLCB0cnkgd2l0aG91dAorCQkgKiBwcmVmaXhpbmcgdGhlIGJhc2UgcGF0aAorCQkgKi8KKwkJaWYgKGJhc2VfcGF0aCAmJiBiYXNlX3BhdGhfcmVsYXhlZCAmJiAhcmV0cmllZF9wYXRoKSB7CisJCQlkaXIgPSBpdGFibGVbSU5URVJQX1NMT1RfRElSXS52YWx1ZTsKKwkJCXJldHJpZWRfcGF0aCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlicmVhazsKKwl9IHdoaWxlICgxKTsKKworCWlmICghcGF0aCkgeworCQlsb2dlcnJvcigiJyVzJzogdW5hYmxlIHRvIGNoZGlyIG9yIG5vdCBhIGdpdCBhcmNoaXZlIiwgZGlyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCBva19wYXRocyAmJiAqb2tfcGF0aHMgKSB7CisJCWNoYXIgKipwcDsKKwkJaW50IHBhdGhsZW4gPSBzdHJsZW4ocGF0aCk7CisKKwkJLyogVGhlIHZhbGlkYXRpb24gaXMgZG9uZSBvbiB0aGUgcGF0aHMgYWZ0ZXIgZW50ZXJfcmVwbworCQkgKiBhcHBlbmRzIG9wdGlvbmFsIHsuZ2l0LC5naXQvLmdpdH0gYW5kIGZyaWVuZHMsIGJ1dAorCQkgKiBpdCBkb2VzIG5vdCB1c2UgZ2V0Y3dkKCkuICBTbyBpZiB5b3VyIC9wdWIgaXMKKwkJICogYSBzeW1saW5rIHRvIC9tbnQvcHViLCB5b3UgY2FuIHdoaXRlbGlzdCAvcHViIGFuZAorCQkgKiBkbyBub3QgaGF2ZSB0byBzYXkgL21udC9wdWIuCisJCSAqIERvIG5vdCBzYXkgL3B1Yi8uCisJCSAqLworCQlmb3IgKCBwcCA9IG9rX3BhdGhzIDsgKnBwIDsgcHArKyApIHsKKwkJCWludCBsZW4gPSBzdHJsZW4oKnBwKTsKKwkJCWlmIChsZW4gPD0gcGF0aGxlbiAmJgorCQkJICAgICFtZW1jbXAoKnBwLCBwYXRoLCBsZW4pICYmCisJCQkgICAgKHBhdGhbbGVuXSA9PSAnXDAnIHx8CisJCQkgICAgICghc3RyaWN0X3BhdGhzICYmIHBhdGhbbGVuXSA9PSAnLycpKSkKKwkJCQlyZXR1cm4gcGF0aDsKKwkJfQorCX0KKwllbHNlIHsKKwkJLyogYmUgYmFja3dhcmRzIGNvbXBhdGlibGUgKi8KKwkJaWYgKCFzdHJpY3RfcGF0aHMpCisJCQlyZXR1cm4gcGF0aDsKKwl9CisKKwlsb2dlcnJvcigiJyVzJzogbm90IGluIHdoaXRlbGlzdCIsIHBhdGgpOworCXJldHVybiBOVUxMOwkJLyogRmFsbHRocm91Z2guIERlbnkgYnkgZGVmYXVsdCAqLworfQorCit0eXBlZGVmIGludCAoKmRhZW1vbl9zZXJ2aWNlX2ZuKSh2b2lkKTsKK3N0cnVjdCBkYWVtb25fc2VydmljZSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpjb25maWdfbmFtZTsKKwlkYWVtb25fc2VydmljZV9mbiBmbjsKKwlpbnQgZW5hYmxlZDsKKwlpbnQgb3ZlcnJpZGFibGU7Cit9OworCitzdGF0aWMgc3RydWN0IGRhZW1vbl9zZXJ2aWNlICpzZXJ2aWNlX2xvb2tpbmdfYXQ7CitzdGF0aWMgaW50IHNlcnZpY2VfZW5hYmxlZDsKKworc3RhdGljIGludCBnaXRfZGFlbW9uX2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICghcHJlZml4Y21wKHZhciwgImRhZW1vbi4iKSAmJgorCSAgICAhc3RyY21wKHZhciArIDcsIHNlcnZpY2VfbG9va2luZ19hdC0+Y29uZmlnX25hbWUpKSB7CisJCXNlcnZpY2VfZW5hYmxlZCA9IGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogd2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHBhcnNpbmcgYW55IG90aGVyIGNvbmZpZ3VyYXRpb24gaGVyZSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ1bl9zZXJ2aWNlKHN0cnVjdCBpbnRlcnAgKml0YWJsZSwgc3RydWN0IGRhZW1vbl9zZXJ2aWNlICpzZXJ2aWNlKQoreworCWNvbnN0IGNoYXIgKnBhdGg7CisJaW50IGVuYWJsZWQgPSBzZXJ2aWNlLT5lbmFibGVkOworCisJbG9naW5mbygiUmVxdWVzdCAlcyBmb3IgJyVzJyIsCisJCXNlcnZpY2UtPm5hbWUsCisJCWl0YWJsZVtJTlRFUlBfU0xPVF9ESVJdLnZhbHVlKTsKKworCWlmICghZW5hYmxlZCAmJiAhc2VydmljZS0+b3ZlcnJpZGFibGUpIHsKKwkJbG9nZXJyb3IoIiclcyc6IHNlcnZpY2Ugbm90IGVuYWJsZWQuIiwgc2VydmljZS0+bmFtZSk7CisJCWVycm5vID0gRUFDQ0VTOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCEocGF0aCA9IHBhdGhfb2soaXRhYmxlKSkpCisJCXJldHVybiAtMTsKKworCS8qCisJICogU2VjdXJpdHkgb24gdGhlIGNoZWFwLgorCSAqCisJICogV2Ugd2FudCBhIHJlYWRhYmxlIEhFQUQsIHVzYWJsZSAib2JqZWN0cyIgZGlyZWN0b3J5LCBhbmQKKwkgKiBhICJnaXQtZGFlbW9uLWV4cG9ydC1vayIgZmxhZyB0aGF0IHNheXMgdGhhdCB0aGUgb3RoZXIgc2lkZQorCSAqIGlzIG9rIHdpdGggdXMgZG9pbmcgdGhpcy4KKwkgKgorCSAqIHBhdGhfb2soKSB1c2VzIGVudGVyX3JlcG8oKSBhbmQgZG9lcyB3aGl0ZWxpc3QgY2hlY2tpbmcuCisJICogV2Ugb25seSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgcmVwb3NpdG9yeSBpcyBleHBvcnRlZC4KKwkgKi8KKworCWlmICghZXhwb3J0X2FsbF90cmVlcyAmJiBhY2Nlc3MoImdpdC1kYWVtb24tZXhwb3J0LW9rIiwgRl9PSykpIHsKKwkJbG9nZXJyb3IoIiclcyc6IHJlcG9zaXRvcnkgbm90IGV4cG9ydGVkLiIsIHBhdGgpOworCQllcnJubyA9IEVBQ0NFUzsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChzZXJ2aWNlLT5vdmVycmlkYWJsZSkgeworCQlzZXJ2aWNlX2xvb2tpbmdfYXQgPSBzZXJ2aWNlOworCQlzZXJ2aWNlX2VuYWJsZWQgPSAtMTsKKwkJZ2l0X2NvbmZpZyhnaXRfZGFlbW9uX2NvbmZpZyk7CisJCWlmICgwIDw9IHNlcnZpY2VfZW5hYmxlZCkKKwkJCWVuYWJsZWQgPSBzZXJ2aWNlX2VuYWJsZWQ7CisJfQorCWlmICghZW5hYmxlZCkgeworCQlsb2dlcnJvcigiJyVzJzogc2VydmljZSBub3QgZW5hYmxlZCBmb3IgJyVzJyIsCisJCQkgc2VydmljZS0+bmFtZSwgcGF0aCk7CisJCWVycm5vID0gRUFDQ0VTOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBXZSdsbCBpZ25vcmUgU0lHVEVSTSBmcm9tIG5vdyBvbiwgd2UgaGF2ZSBhCisJICogZ29vZCBjbGllbnQuCisJICovCisJc2lnbmFsKFNJR1RFUk0sIFNJR19JR04pOworCisJcmV0dXJuIHNlcnZpY2UtPmZuKCk7Cit9CisKK3N0YXRpYyBpbnQgdXBsb2FkX3BhY2sodm9pZCkKK3sKKwkvKiBUaW1lb3V0IGFzIHN0cmluZyAqLworCWNoYXIgdGltZW91dF9idWZbNjRdOworCisJc25wcmludGYodGltZW91dF9idWYsIHNpemVvZiB0aW1lb3V0X2J1ZiwgIi0tdGltZW91dD0ldSIsIHRpbWVvdXQpOworCisJLyogZ2l0LXVwbG9hZC1wYWNrIG9ubHkgZXZlciByZWFkcyBzdHVmZiwgc28gdGhpcyBpcyBzYWZlICovCisJZXhlY2xfZ2l0X2NtZCgidXBsb2FkLXBhY2siLCAiLS1zdHJpY3QiLCB0aW1lb3V0X2J1ZiwgIi4iLCBOVUxMKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgdXBsb2FkX2FyY2hpdmUodm9pZCkKK3sKKwlleGVjbF9naXRfY21kKCJ1cGxvYWQtYXJjaGl2ZSIsICIuIiwgTlVMTCk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHJlY2VpdmVfcGFjayh2b2lkKQoreworCWV4ZWNsX2dpdF9jbWQoInJlY2VpdmUtcGFjayIsICIuIiwgTlVMTCk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgc3RydWN0IGRhZW1vbl9zZXJ2aWNlIGRhZW1vbl9zZXJ2aWNlW10gPSB7CisJeyAidXBsb2FkLWFyY2hpdmUiLCAidXBsb2FkYXJjaCIsIHVwbG9hZF9hcmNoaXZlLCAwLCAxIH0sCisJeyAidXBsb2FkLXBhY2siLCAidXBsb2FkcGFjayIsIHVwbG9hZF9wYWNrLCAxLCAxIH0sCisJeyAicmVjZWl2ZS1wYWNrIiwgInJlY2VpdmVwYWNrIiwgcmVjZWl2ZV9wYWNrLCAwLCAxIH0sCit9OworCitzdGF0aWMgdm9pZCBlbmFibGVfc2VydmljZShjb25zdCBjaGFyICpuYW1lLCBpbnQgZW5hKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRhZW1vbl9zZXJ2aWNlKTsgaSsrKSB7CisJCWlmICghc3RyY21wKGRhZW1vbl9zZXJ2aWNlW2ldLm5hbWUsIG5hbWUpKSB7CisJCQlkYWVtb25fc2VydmljZVtpXS5lbmFibGVkID0gZW5hOworCQkJcmV0dXJuOworCQl9CisJfQorCWRpZSgiTm8gc3VjaCBzZXJ2aWNlICVzIiwgbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIG1ha2Vfc2VydmljZV9vdmVycmlkYWJsZShjb25zdCBjaGFyICpuYW1lLCBpbnQgZW5hKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRhZW1vbl9zZXJ2aWNlKTsgaSsrKSB7CisJCWlmICghc3RyY21wKGRhZW1vbl9zZXJ2aWNlW2ldLm5hbWUsIG5hbWUpKSB7CisJCQlkYWVtb25fc2VydmljZVtpXS5vdmVycmlkYWJsZSA9IGVuYTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlkaWUoIk5vIHN1Y2ggc2VydmljZSAlcyIsIG5hbWUpOworfQorCisvKgorICogU2VwYXJhdGUgdGhlICJleHRyYSBhcmdzIiBpbmZvcm1hdGlvbiBhcyBzdXBwbGllZCBieSB0aGUgY2xpZW50IGNvbm5lY3Rpb24uCisgKiBBbnkgcmVzdWx0aW5nIGRhdGEgaXMgc3F1aXJyZWxlZCBhd2F5IGluIHRoZSBnaXZlbiBpbnRlcnBvbGF0aW9uIHRhYmxlLgorICovCitzdGF0aWMgdm9pZCBwYXJzZV9leHRyYV9hcmdzKHN0cnVjdCBpbnRlcnAgKnRhYmxlLCBjaGFyICpleHRyYV9hcmdzLCBpbnQgYnVmbGVuKQoreworCWNoYXIgKnZhbDsKKwlpbnQgdmFsbGVuOworCWNoYXIgKmVuZCA9IGV4dHJhX2FyZ3MgKyBidWZsZW47CisKKwl3aGlsZSAoZXh0cmFfYXJncyA8IGVuZCAmJiAqZXh0cmFfYXJncykgeworCQlzYXdfZXh0ZW5kZWRfYXJncyA9IDE7CisJCWlmIChzdHJuY2FzZWNtcCgiaG9zdD0iLCBleHRyYV9hcmdzLCA1KSA9PSAwKSB7CisJCQl2YWwgPSBleHRyYV9hcmdzICsgNTsKKwkJCXZhbGxlbiA9IHN0cmxlbih2YWwpICsgMTsKKwkJCWlmICgqdmFsKSB7CisJCQkJLyogU3BsaXQgPGhvc3Q+Ojxwb3J0PiBhdCBjb2xvbi4gKi8KKwkJCQljaGFyICpob3N0ID0gdmFsOworCQkJCWNoYXIgKnBvcnQgPSBzdHJyY2hyKGhvc3QsICc6Jyk7CisJCQkJaWYgKHBvcnQpIHsKKwkJCQkJKnBvcnQgPSAwOworCQkJCQlwb3J0Kys7CisJCQkJCWludGVycF9zZXRfZW50cnkodGFibGUsIElOVEVSUF9TTE9UX1BPUlQsIHBvcnQpOworCQkJCX0KKwkJCQlpbnRlcnBfc2V0X2VudHJ5KHRhYmxlLCBJTlRFUlBfU0xPVF9IT1NULCBob3N0KTsKKwkJCX0KKworCQkJLyogT24gdG8gdGhlIG5leHQgb25lICovCisJCQlleHRyYV9hcmdzID0gdmFsICsgdmFsbGVuOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBmaWxsX2luX2V4dHJhX3RhYmxlX2VudHJpZXMoc3RydWN0IGludGVycCAqaXRhYmxlKQoreworCWNoYXIgKmhwOworCisJLyoKKwkgKiBSZXBsYWNlIGxpdGVyYWwgaG9zdCB3aXRoIGxvd2VyY2FzZS1pemVkIGhvc3RuYW1lLgorCSAqLworCWhwID0gaW50ZXJwX3RhYmxlW0lOVEVSUF9TTE9UX0hPU1RdLnZhbHVlOworCWlmICghaHApCisJCXJldHVybjsKKwlmb3IgKCA7ICpocDsgaHArKykKKwkJKmhwID0gdG9sb3dlcigqaHApOworCisJLyoKKwkgKiBMb2NhdGUgY2Fub25pY2FsIGhvc3RuYW1lIGFuZCBpdHMgSVAgYWRkcmVzcy4KKwkgKi8KKyNpZm5kZWYgTk9fSVBWNgorCXsKKwkJc3RydWN0IGFkZHJpbmZvIGhpbnRzOworCQlzdHJ1Y3QgYWRkcmluZm8gKmFpLCAqYWkwOworCQlpbnQgZ2FpOworCQlzdGF0aWMgY2hhciBhZGRyYnVmW0hPU1RfTkFNRV9NQVggKyAxXTsKKworCQltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKwkJaGludHMuYWlfZmxhZ3MgPSBBSV9DQU5PTk5BTUU7CisKKwkJZ2FpID0gZ2V0YWRkcmluZm8oaW50ZXJwX3RhYmxlW0lOVEVSUF9TTE9UX0hPU1RdLnZhbHVlLCAwLCAmaGludHMsICZhaTApOworCQlpZiAoIWdhaSkgeworCQkJZm9yIChhaSA9IGFpMDsgYWk7IGFpID0gYWktPmFpX25leHQpIHsKKwkJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbl9hZGRyID0gKHZvaWQgKilhaS0+YWlfYWRkcjsKKworCQkJCWluZXRfbnRvcChBRl9JTkVULCAmc2luX2FkZHItPnNpbl9hZGRyLAorCQkJCQkgIGFkZHJidWYsIHNpemVvZihhZGRyYnVmKSk7CisJCQkJaW50ZXJwX3NldF9lbnRyeShpbnRlcnBfdGFibGUsCisJCQkJCQkgSU5URVJQX1NMT1RfQ0FOT05fSE9TVCwgYWktPmFpX2Nhbm9ubmFtZSk7CisJCQkJaW50ZXJwX3NldF9lbnRyeShpbnRlcnBfdGFibGUsCisJCQkJCQkgSU5URVJQX1NMT1RfSVAsIGFkZHJidWYpOworCQkJCWJyZWFrOworCQkJfQorCQkJZnJlZWFkZHJpbmZvKGFpMCk7CisJCX0KKwl9CisjZWxzZQorCXsKKwkJc3RydWN0IGhvc3RlbnQgKmhlbnQ7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiBzYTsKKwkJY2hhciAqKmFwOworCQlzdGF0aWMgY2hhciBhZGRyYnVmW0hPU1RfTkFNRV9NQVggKyAxXTsKKworCQloZW50ID0gZ2V0aG9zdGJ5bmFtZShpbnRlcnBfdGFibGVbSU5URVJQX1NMT1RfSE9TVF0udmFsdWUpOworCisJCWFwID0gaGVudC0+aF9hZGRyX2xpc3Q7CisJCW1lbXNldCgmc2EsIDAsIHNpemVvZiBzYSk7CisJCXNhLnNpbl9mYW1pbHkgPSBoZW50LT5oX2FkZHJ0eXBlOworCQlzYS5zaW5fcG9ydCA9IGh0b25zKDApOworCQltZW1jcHkoJnNhLnNpbl9hZGRyLCAqYXAsIGhlbnQtPmhfbGVuZ3RoKTsKKworCQlpbmV0X250b3AoaGVudC0+aF9hZGRydHlwZSwgJnNhLnNpbl9hZGRyLAorCQkJICBhZGRyYnVmLCBzaXplb2YoYWRkcmJ1ZikpOworCisJCWludGVycF9zZXRfZW50cnkoaW50ZXJwX3RhYmxlLCBJTlRFUlBfU0xPVF9DQU5PTl9IT1NULCBoZW50LT5oX25hbWUpOworCQlpbnRlcnBfc2V0X2VudHJ5KGludGVycF90YWJsZSwgSU5URVJQX1NMT1RfSVAsIGFkZHJidWYpOworCX0KKyNlbmRpZgorfQorCisKK3N0YXRpYyBpbnQgZXhlY3V0ZShzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIpCit7CisJc3RhdGljIGNoYXIgbGluZVsxMDAwXTsKKwlpbnQgcGt0bGVuLCBsZW4sIGk7CisKKwlpZiAoYWRkcikgeworCQljaGFyIGFkZHJidWZbMjU2XSA9ICIiOworCQlpbnQgcG9ydCA9IC0xOworCisJCWlmIChhZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgeworCQkJc3RydWN0IHNvY2thZGRyX2luICpzaW5fYWRkciA9ICh2b2lkICopIGFkZHI7CisJCQlpbmV0X250b3AoYWRkci0+c2FfZmFtaWx5LCAmc2luX2FkZHItPnNpbl9hZGRyLCBhZGRyYnVmLCBzaXplb2YoYWRkcmJ1ZikpOworCQkJcG9ydCA9IG50b2hzKHNpbl9hZGRyLT5zaW5fcG9ydCk7CisjaWZuZGVmIE5PX0lQVjYKKwkJfSBlbHNlIGlmIChhZGRyICYmIGFkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQkJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNl9hZGRyID0gKHZvaWQgKikgYWRkcjsKKworCQkJY2hhciAqYnVmID0gYWRkcmJ1ZjsKKwkJCSpidWYrKyA9ICdbJzsgKmJ1ZiA9ICdcMCc7IC8qIHN0cGNweSgpIGlzIGNvb2wgKi8KKwkJCWluZXRfbnRvcChBRl9JTkVUNiwgJnNpbjZfYWRkci0+c2luNl9hZGRyLCBidWYsIHNpemVvZihhZGRyYnVmKSAtIDEpOworCQkJc3RyY2F0KGJ1ZiwgIl0iKTsKKworCQkJcG9ydCA9IG50b2hzKHNpbjZfYWRkci0+c2luNl9wb3J0KTsKKyNlbmRpZgorCQl9CisJCWxvZ2luZm8oIkNvbm5lY3Rpb24gZnJvbSAlczolZCIsIGFkZHJidWYsIHBvcnQpOworCX0KKworCWFsYXJtKGluaXRfdGltZW91dCA/IGluaXRfdGltZW91dCA6IHRpbWVvdXQpOworCXBrdGxlbiA9IHBhY2tldF9yZWFkX2xpbmUoMCwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKwlhbGFybSgwKTsKKworCWxlbiA9IHN0cmxlbihsaW5lKTsKKwlpZiAocGt0bGVuICE9IGxlbikKKwkJbG9naW5mbygiRXh0ZW5kZWQgYXR0cmlidXRlcyAoJWQgYnl0ZXMpIGV4aXN0IDwlLipzPiIsCisJCQkoaW50KSBwa3RsZW4gLSBsZW4sCisJCQkoaW50KSBwa3RsZW4gLSBsZW4sIGxpbmUgKyBsZW4gKyAxKTsKKwlpZiAobGVuICYmIGxpbmVbbGVuLTFdID09ICdcbicpIHsKKwkJbGluZVstLWxlbl0gPSAwOworCQlwa3RsZW4tLTsKKwl9CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIHBhdGggaW50ZXJwb2xhdGlvbiB0YWJsZSBmb3IgdGhpcyBjb25uZWN0aW9uLgorCSAqLworCWludGVycF9jbGVhcl90YWJsZShpbnRlcnBfdGFibGUsIEFSUkFZX1NJWkUoaW50ZXJwX3RhYmxlKSk7CisJaW50ZXJwX3NldF9lbnRyeShpbnRlcnBfdGFibGUsIElOVEVSUF9TTE9UX1BFUkNFTlQsICIlIik7CisKKwlpZiAobGVuICE9IHBrdGxlbikgeworCSAgICBwYXJzZV9leHRyYV9hcmdzKGludGVycF90YWJsZSwgbGluZSArIGxlbiArIDEsIHBrdGxlbiAtIGxlbiAtIDEpOworCSAgICBmaWxsX2luX2V4dHJhX3RhYmxlX2VudHJpZXMoaW50ZXJwX3RhYmxlKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkYWVtb25fc2VydmljZSk7IGkrKykgeworCQlzdHJ1Y3QgZGFlbW9uX3NlcnZpY2UgKnMgPSAmKGRhZW1vbl9zZXJ2aWNlW2ldKTsKKwkJaW50IG5hbWVsZW4gPSBzdHJsZW4ocy0+bmFtZSk7CisJCWlmICghcHJlZml4Y21wKGxpbmUsICJnaXQtIikgJiYKKwkJICAgICFzdHJuY21wKHMtPm5hbWUsIGxpbmUgKyA0LCBuYW1lbGVuKSAmJgorCQkgICAgbGluZVtuYW1lbGVuICsgNF0gPT0gJyAnKSB7CisJCQkvKgorCQkJICogTm90ZTogVGhlIGRpcmVjdG9yeSBoZXJlIGlzIHByb2JhYmx5IGNvbnRleHQgc2Vuc2l0aXZlLAorCQkJICogYW5kIG1pZ2h0IGRlcGVuZCBvbiB0aGUgYWN0dWFsIHNlcnZpY2UgYmVpbmcgcGVyZm9ybWVkLgorCQkJICovCisJCQlpbnRlcnBfc2V0X2VudHJ5KGludGVycF90YWJsZSwKKwkJCQkJIElOVEVSUF9TTE9UX0RJUiwgbGluZSArIG5hbWVsZW4gKyA1KTsKKwkJCXJldHVybiBydW5fc2VydmljZShpbnRlcnBfdGFibGUsIHMpOworCQl9CisJfQorCisJbG9nZXJyb3IoIlByb3RvY29sIGVycm9yOiAnJXMnIiwgbGluZSk7CisJcmV0dXJuIC0xOworfQorCisKKy8qCisgKiBXZSBjb3VudCBzcGF3bmVkL3JlYXBlZCBzZXBhcmF0ZWx5LCBqdXN0IHRvIGF2b2lkIGFueQorICogcmFjZXMgd2hlbiB1cGRhdGluZyB0aGVtIGZyb20gc2lnbmFscy4gVGhlIFNJR0NITEQgaGFuZGxlcgorICogd2lsbCBvbmx5IHVwZGF0ZSBjaGlsZHJlbl9yZWFwZWQsIGFuZCB0aGUgZm9yayBsb2dpYyB3aWxsCisgKiBvbmx5IHVwZGF0ZSBjaGlsZHJlbl9zcGF3bmVkLgorICoKKyAqIE1BWF9DSElMRFJFTiBzaG91bGQgYmUgYSBwb3dlci1vZi10d28gdG8gbWFrZSB0aGUgbW9kdWx1cworICogb3BlcmF0aW9uIGNoZWFwLiBJdCBzaG91bGQgYWxzbyBiZSBhdCBsZWFzdCB0d2ljZQorICogdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHdlIHdpbGwgZXZlciBhbGxvdy4KKyAqLworI2RlZmluZSBNQVhfQ0hJTERSRU4gMTI4CisKK3N0YXRpYyBpbnQgbWF4X2Nvbm5lY3Rpb25zID0gMjU7CisKKy8qIFRoZXNlIGFyZSB1cGRhdGVkIGJ5IHRoZSBzaWduYWwgaGFuZGxlciAqLworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGludCBjaGlsZHJlbl9yZWFwZWQ7CitzdGF0aWMgcGlkX3QgZGVhZF9jaGlsZFtNQVhfQ0hJTERSRU5dOworCisvKiBUaGVzZSBhcmUgdXBkYXRlZCBieSB0aGUgbWFpbiBsb29wICovCitzdGF0aWMgdW5zaWduZWQgaW50IGNoaWxkcmVuX3NwYXduZWQ7CitzdGF0aWMgdW5zaWduZWQgaW50IGNoaWxkcmVuX2RlbGV0ZWQ7CisKK3N0YXRpYyBzdHJ1Y3QgY2hpbGQgeworCXBpZF90IHBpZDsKKwlpbnQgYWRkcmxlbjsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyZXNzOworfSBsaXZlX2NoaWxkW01BWF9DSElMRFJFTl07CisKK3N0YXRpYyB2b2lkIGFkZF9jaGlsZChpbnQgaWR4LCBwaWRfdCBwaWQsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGFkZHJsZW4pCit7CisJbGl2ZV9jaGlsZFtpZHhdLnBpZCA9IHBpZDsKKwlsaXZlX2NoaWxkW2lkeF0uYWRkcmxlbiA9IGFkZHJsZW47CisJbWVtY3B5KCZsaXZlX2NoaWxkW2lkeF0uYWRkcmVzcywgYWRkciwgYWRkcmxlbik7Cit9CisKKy8qCisgKiBXYWxrIGZyb20gImRlbGV0ZWQiIHRvICJzcGF3bmVkIiwgYW5kIHJlbW92ZSBjaGlsZCAicGlkIi4KKyAqCisgKiBXZSBtb3ZlIGV2ZXJ5dGhpbmcgdXAgYnkgb25lLCBzaW5jZSB0aGUgbmV3ICJkZWxldGVkIiB3aWxsCisgKiBiZSBvbmUgaGlnaGVyLgorICovCitzdGF0aWMgdm9pZCByZW1vdmVfY2hpbGQocGlkX3QgcGlkLCB1bnNpZ25lZCBkZWxldGVkLCB1bnNpZ25lZCBzcGF3bmVkKQoreworCXN0cnVjdCBjaGlsZCBuOworCisJZGVsZXRlZCAlPSBNQVhfQ0hJTERSRU47CisJc3Bhd25lZCAlPSBNQVhfQ0hJTERSRU47CisJaWYgKGxpdmVfY2hpbGRbZGVsZXRlZF0ucGlkID09IHBpZCkgeworCQlsaXZlX2NoaWxkW2RlbGV0ZWRdLnBpZCA9IC0xOworCQlyZXR1cm47CisJfQorCW4gPSBsaXZlX2NoaWxkW2RlbGV0ZWRdOworCWZvciAoOzspIHsKKwkJc3RydWN0IGNoaWxkIG07CisJCWRlbGV0ZWQgPSAoZGVsZXRlZCArIDEpICUgTUFYX0NISUxEUkVOOworCQlpZiAoZGVsZXRlZCA9PSBzcGF3bmVkKQorCQkJZGllKCJjb3VsZCBub3QgZmluZCBkZWFkIGNoaWxkICVkXG4iLCBwaWQpOworCQltID0gbGl2ZV9jaGlsZFtkZWxldGVkXTsKKwkJbGl2ZV9jaGlsZFtkZWxldGVkXSA9IG47CisJCWlmIChtLnBpZCA9PSBwaWQpCisJCQlyZXR1cm47CisJCW4gPSBtOworCX0KK30KKworLyoKKyAqIFRoaXMgZ2V0cyBjYWxsZWQgaWYgdGhlIG51bWJlciBvZiBjb25uZWN0aW9ucyBncm93cworICogcGFzdCAibWF4X2Nvbm5lY3Rpb25zIi4KKyAqCisgKiBXZSBfc2hvdWxkXyBzdGFydCBvZmYgYnkgc2VhcmNoaW5nIGZvciBjb25uZWN0aW9ucworICogZnJvbSB0aGUgc2FtZSBJUCwgYW5kIGlmIHRoZXJlIGlzIHNvbWUgYWRkcmVzcyB3dGgKKyAqIG11bHRpcGxlIGNvbm5lY3Rpb25zLCB3ZSBzaG91bGQga2lsbCB0aGF0IGZpcnN0LgorICoKKyAqIEFzIGl0IGlzLCB3ZSBqdXN0ICJyYW5kb21seSIga2lsbCAyNSUgb2YgdGhlIGNvbm5lY3Rpb25zLAorICogYW5kIG91ciBwc2V1ZG8tcmFuZG9tIGdlbmVyYXRvciBzdWNrcyB0b28uIEkgaGF2ZSBubworICogc2hhbWUuCisgKgorICogUmVhbGx5LCB0aGlzIGlzIGp1c3QgYSBwbGFjZS1ob2xkZXIgZm9yIGEgX3JlYWxfIGFsZ29yaXRobS4KKyAqLworc3RhdGljIHZvaWQga2lsbF9zb21lX2NoaWxkcmVuKGludCBzaWdubywgdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIHN0b3ApCit7CisJc3RhcnQgJT0gTUFYX0NISUxEUkVOOworCXN0b3AgJT0gTUFYX0NISUxEUkVOOworCXdoaWxlIChzdGFydCAhPSBzdG9wKSB7CisJCWlmICghKHN0YXJ0ICYgMykpCisJCQlraWxsKGxpdmVfY2hpbGRbc3RhcnRdLnBpZCwgc2lnbm8pOworCQlzdGFydCA9IChzdGFydCArIDEpICUgTUFYX0NISUxEUkVOOworCX0KK30KKworc3RhdGljIHZvaWQgY2hlY2tfbWF4X2Nvbm5lY3Rpb25zKHZvaWQpCit7CisJZm9yICg7OykgeworCQlpbnQgYWN0aXZlOworCQl1bnNpZ25lZCBzcGF3bmVkLCByZWFwZWQsIGRlbGV0ZWQ7CisKKwkJc3Bhd25lZCA9IGNoaWxkcmVuX3NwYXduZWQ7CisJCXJlYXBlZCA9IGNoaWxkcmVuX3JlYXBlZDsKKwkJZGVsZXRlZCA9IGNoaWxkcmVuX2RlbGV0ZWQ7CisKKwkJd2hpbGUgKGRlbGV0ZWQgPCByZWFwZWQpIHsKKwkJCXBpZF90IHBpZCA9IGRlYWRfY2hpbGRbZGVsZXRlZCAlIE1BWF9DSElMRFJFTl07CisJCQlyZW1vdmVfY2hpbGQocGlkLCBkZWxldGVkLCBzcGF3bmVkKTsKKwkJCWRlbGV0ZWQrKzsKKwkJfQorCQljaGlsZHJlbl9kZWxldGVkID0gZGVsZXRlZDsKKworCQlhY3RpdmUgPSBzcGF3bmVkIC0gZGVsZXRlZDsKKwkJaWYgKGFjdGl2ZSA8PSBtYXhfY29ubmVjdGlvbnMpCisJCQlicmVhazsKKworCQkvKiBLaWxsIHNvbWUgdW5zdGFydGVkIGNvbm5lY3Rpb25zIHdpdGggU0lHVEVSTSAqLworCQlraWxsX3NvbWVfY2hpbGRyZW4oU0lHVEVSTSwgZGVsZXRlZCwgc3Bhd25lZCk7CisJCWlmIChhY3RpdmUgPD0gbWF4X2Nvbm5lY3Rpb25zIDw8IDEpCisJCQlicmVhazsKKworCQkvKiBJZiB0aGUgU0lHVEVSTSB0aGluZyBpc24ndCBoZWxwaW5nIHVzZSBTSUdLSUxMICovCisJCWtpbGxfc29tZV9jaGlsZHJlbihTSUdLSUxMLCBkZWxldGVkLCBzcGF3bmVkKTsKKwkJc2xlZXAoMSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBoYW5kbGUoaW50IGluY29taW5nLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCBhZGRybGVuKQoreworCXBpZF90IHBpZCA9IGZvcmsoKTsKKworCWlmIChwaWQpIHsKKwkJdW5zaWduZWQgaWR4OworCisJCWNsb3NlKGluY29taW5nKTsKKwkJaWYgKHBpZCA8IDApCisJCQlyZXR1cm47CisKKwkJaWR4ID0gY2hpbGRyZW5fc3Bhd25lZCAlIE1BWF9DSElMRFJFTjsKKwkJY2hpbGRyZW5fc3Bhd25lZCsrOworCQlhZGRfY2hpbGQoaWR4LCBwaWQsIGFkZHIsIGFkZHJsZW4pOworCisJCWNoZWNrX21heF9jb25uZWN0aW9ucygpOworCQlyZXR1cm47CisJfQorCisJZHVwMihpbmNvbWluZywgMCk7CisJZHVwMihpbmNvbWluZywgMSk7CisJY2xvc2UoaW5jb21pbmcpOworCisJZXhpdChleGVjdXRlKGFkZHIpKTsKK30KKworc3RhdGljIHZvaWQgY2hpbGRfaGFuZGxlcihpbnQgc2lnbm8pCit7CisJZm9yICg7OykgeworCQlpbnQgc3RhdHVzOworCQlwaWRfdCBwaWQgPSB3YWl0cGlkKC0xLCAmc3RhdHVzLCBXTk9IQU5HKTsKKworCQlpZiAocGlkID4gMCkgeworCQkJdW5zaWduZWQgcmVhcGVkID0gY2hpbGRyZW5fcmVhcGVkOworCQkJZGVhZF9jaGlsZFtyZWFwZWQgJSBNQVhfQ0hJTERSRU5dID0gcGlkOworCQkJY2hpbGRyZW5fcmVhcGVkID0gcmVhcGVkICsgMTsKKwkJCS8qIFhYWDogQ3VzdG9tIGxvZ2dpbmcsIHNpbmNlIHdlIGRvbid0IHdhbm5hIGdldHBpZCgpICovCisJCQlpZiAodmVyYm9zZSkgeworCQkJCWNvbnN0IGNoYXIgKmRlYWQgPSAiIjsKKwkJCQlpZiAoIVdJRkVYSVRFRChzdGF0dXMpIHx8IFdFWElUU1RBVFVTKHN0YXR1cykgPiAwKQorCQkJCQlkZWFkID0gIiAod2l0aCBlcnJvcikiOworCQkJCWlmIChsb2dfc3lzbG9nKQorCQkJCQlzeXNsb2coTE9HX0lORk8sICJbJWRdIERpc2Nvbm5lY3RlZCVzIiwgcGlkLCBkZWFkKTsKKwkJCQllbHNlCisJCQkJCWZwcmludGYoc3RkZXJyLCAiWyVkXSBEaXNjb25uZWN0ZWQlc1xuIiwgcGlkLCBkZWFkKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBzZXRfcmV1c2VfYWRkcihpbnQgc29ja2ZkKQoreworCWludCBvbiA9IDE7CisKKwlpZiAoIXJldXNlYWRkcikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHNldHNvY2tvcHQoc29ja2ZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsCisJCQkgICZvbiwgc2l6ZW9mKG9uKSk7Cit9CisKKyNpZm5kZWYgTk9fSVBWNgorCitzdGF0aWMgaW50IHNvY2tzZXR1cChjaGFyICpsaXN0ZW5fYWRkciwgaW50IGxpc3Rlbl9wb3J0LCBpbnQgKipzb2NrbGlzdF9wKQoreworCWludCBzb2NrbnVtID0gMCwgKnNvY2tsaXN0ID0gTlVMTDsKKwlpbnQgbWF4ZmQgPSAtMTsKKwljaGFyIHBidWZbTklfTUFYU0VSVl07CisJc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWkwLCAqYWk7CisJaW50IGdhaTsKKwlsb25nIGZsYWdzOworCisJc3ByaW50ZihwYnVmLCAiJWQiLCBsaXN0ZW5fcG9ydCk7CisJbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisJaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOworCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisJaGludHMuYWlfcHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKwloaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkU7CisKKwlnYWkgPSBnZXRhZGRyaW5mbyhsaXN0ZW5fYWRkciwgcGJ1ZiwgJmhpbnRzLCAmYWkwKTsKKwlpZiAoZ2FpKQorCQlkaWUoImdldGFkZHJpbmZvKCkgZmFpbGVkOiAlc1xuIiwgZ2FpX3N0cmVycm9yKGdhaSkpOworCisJZm9yIChhaSA9IGFpMDsgYWk7IGFpID0gYWktPmFpX25leHQpIHsKKwkJaW50IHNvY2tmZDsKKworCQlzb2NrZmQgPSBzb2NrZXQoYWktPmFpX2ZhbWlseSwgYWktPmFpX3NvY2t0eXBlLCBhaS0+YWlfcHJvdG9jb2wpOworCQlpZiAoc29ja2ZkIDwgMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoc29ja2ZkID49IEZEX1NFVFNJWkUpIHsKKwkJCWVycm9yKCJ0b28gbGFyZ2Ugc29ja2V0IGRlc2NyaXB0b3IuIik7CisJCQljbG9zZShzb2NrZmQpOworCQkJY29udGludWU7CisJCX0KKworI2lmZGVmIElQVjZfVjZPTkxZCisJCWlmIChhaS0+YWlfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCQlpbnQgb24gPSAxOworCQkJc2V0c29ja29wdChzb2NrZmQsIElQUFJPVE9fSVBWNiwgSVBWNl9WNk9OTFksCisJCQkJICAgJm9uLCBzaXplb2Yob24pKTsKKwkJCS8qIE5vdGU6IGVycm9yIGlzIG5vdCBmYXRhbCAqLworCQl9CisjZW5kaWYKKworCQlpZiAoc2V0X3JldXNlX2FkZHIoc29ja2ZkKSkgeworCQkJY2xvc2Uoc29ja2ZkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGJpbmQoc29ja2ZkLCBhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4pIDwgMCkgeworCQkJY2xvc2Uoc29ja2ZkKTsKKwkJCWNvbnRpbnVlOwkvKiBub3QgZmF0YWwgKi8KKwkJfQorCQlpZiAobGlzdGVuKHNvY2tmZCwgNSkgPCAwKSB7CisJCQljbG9zZShzb2NrZmQpOworCQkJY29udGludWU7CS8qIG5vdCBmYXRhbCAqLworCQl9CisKKwkJZmxhZ3MgPSBmY250bChzb2NrZmQsIEZfR0VURkQsIDApOworCQlpZiAoZmxhZ3MgPj0gMCkKKwkJCWZjbnRsKHNvY2tmZCwgRl9TRVRGRCwgZmxhZ3MgfCBGRF9DTE9FWEVDKTsKKworCQlzb2NrbGlzdCA9IHhyZWFsbG9jKHNvY2tsaXN0LCBzaXplb2YoaW50KSAqIChzb2NrbnVtICsgMSkpOworCQlzb2NrbGlzdFtzb2NrbnVtKytdID0gc29ja2ZkOworCisJCWlmIChtYXhmZCA8IHNvY2tmZCkKKwkJCW1heGZkID0gc29ja2ZkOworCX0KKworCWZyZWVhZGRyaW5mbyhhaTApOworCisJKnNvY2tsaXN0X3AgPSBzb2NrbGlzdDsKKwlyZXR1cm4gc29ja251bTsKK30KKworI2Vsc2UgLyogTk9fSVBWNiAqLworCitzdGF0aWMgaW50IHNvY2tzZXR1cChjaGFyICpsaXN0ZW5fYWRkciwgaW50IGxpc3Rlbl9wb3J0LCBpbnQgKipzb2NrbGlzdF9wKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisJaW50IHNvY2tmZDsKKwlsb25nIGZsYWdzOworCisJbWVtc2V0KCZzaW4sIDAsIHNpemVvZiBzaW4pOworCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzaW4uc2luX3BvcnQgPSBodG9ucyhsaXN0ZW5fcG9ydCk7CisKKwlpZiAobGlzdGVuX2FkZHIpIHsKKwkJLyogV2VsbCwgaG9zdCBiZXR0ZXIgYmUgYW4gSVAgYWRkcmVzcyBoZXJlLiAqLworCQlpZiAoaW5ldF9wdG9uKEFGX0lORVQsIGxpc3Rlbl9hZGRyLCAmc2luLnNpbl9hZGRyLnNfYWRkcikgPD0gMCkKKwkJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXNpbi5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKKwl9CisKKwlzb2NrZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworCWlmIChzb2NrZmQgPCAwKQorCQlyZXR1cm4gMDsKKworCWlmIChzZXRfcmV1c2VfYWRkcihzb2NrZmQpKSB7CisJCWNsb3NlKHNvY2tmZCk7CisJCXJldHVybiAwOworCX0KKworCWlmICggYmluZChzb2NrZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luLCBzaXplb2Ygc2luKSA8IDAgKSB7CisJCWNsb3NlKHNvY2tmZCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChsaXN0ZW4oc29ja2ZkLCA1KSA8IDApIHsKKwkJY2xvc2Uoc29ja2ZkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZmxhZ3MgPSBmY250bChzb2NrZmQsIEZfR0VURkQsIDApOworCWlmIChmbGFncyA+PSAwKQorCQlmY250bChzb2NrZmQsIEZfU0VURkQsIGZsYWdzIHwgRkRfQ0xPRVhFQyk7CisKKwkqc29ja2xpc3RfcCA9IHhtYWxsb2Moc2l6ZW9mKGludCkpOworCSoqc29ja2xpc3RfcCA9IHNvY2tmZDsKKwlyZXR1cm4gMTsKK30KKworI2VuZGlmCisKK3N0YXRpYyBpbnQgc2VydmljZV9sb29wKGludCBzb2NrbnVtLCBpbnQgKnNvY2tsaXN0KQoreworCXN0cnVjdCBwb2xsZmQgKnBmZDsKKwlpbnQgaTsKKworCXBmZCA9IHhjYWxsb2Moc29ja251bSwgc2l6ZW9mKHN0cnVjdCBwb2xsZmQpKTsKKworCWZvciAoaSA9IDA7IGkgPCBzb2NrbnVtOyBpKyspIHsKKwkJcGZkW2ldLmZkID0gc29ja2xpc3RbaV07CisJCXBmZFtpXS5ldmVudHMgPSBQT0xMSU47CisJfQorCisJc2lnbmFsKFNJR0NITEQsIGNoaWxkX2hhbmRsZXIpOworCisJZm9yICg7OykgeworCQlpbnQgaTsKKworCQlpZiAocG9sbChwZmQsIHNvY2tudW0sIC0xKSA8IDApIHsKKwkJCWlmIChlcnJubyAhPSBFSU5UUikgeworCQkJCWVycm9yKCJwb2xsIGZhaWxlZCwgcmVzdW1pbmc6ICVzIiwKKwkJCQkgICAgICBzdHJlcnJvcihlcnJubykpOworCQkJCXNsZWVwKDEpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgc29ja251bTsgaSsrKSB7CisJCQlpZiAocGZkW2ldLnJldmVudHMgJiBQT0xMSU4pIHsKKwkJCQlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzczsKKwkJCQl1bnNpZ25lZCBpbnQgc3NsZW4gPSBzaXplb2Yoc3MpOworCQkJCWludCBpbmNvbWluZyA9IGFjY2VwdChwZmRbaV0uZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc3MsICZzc2xlbik7CisJCQkJaWYgKGluY29taW5nIDwgMCkgeworCQkJCQlzd2l0Y2ggKGVycm5vKSB7CisJCQkJCWNhc2UgRUFHQUlOOgorCQkJCQljYXNlIEVJTlRSOgorCQkJCQljYXNlIEVDT05OQUJPUlRFRDoKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlkZWZhdWx0OgorCQkJCQkJZGllKCJhY2NlcHQgcmV0dXJuZWQgJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkJCQl9CisJCQkJfQorCQkJCWhhbmRsZShpbmNvbWluZywgKHN0cnVjdCBzb2NrYWRkciAqKSZzcywgc3NsZW4pOworCQkJfQorCQl9CisJfQorfQorCisvKiBpZiBhbnkgc3RhbmRhcmQgZmlsZSBkZXNjcmlwdG9yIGlzIG1pc3Npbmcgb3BlbiBpdCB0byAvZGV2L251bGwgKi8KK3N0YXRpYyB2b2lkIHNhbml0aXplX3N0ZGZkcyh2b2lkKQoreworCWludCBmZCA9IG9wZW4oIi9kZXYvbnVsbCIsIE9fUkRXUiwgMCk7CisJd2hpbGUgKGZkICE9IC0xICYmIGZkIDwgMikKKwkJZmQgPSBkdXAoZmQpOworCWlmIChmZCA9PSAtMSkKKwkJZGllKCJvcGVuIC9kZXYvbnVsbCBvciBkdXAgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKGZkID4gMikKKwkJY2xvc2UoZmQpOworfQorCitzdGF0aWMgdm9pZCBkYWVtb25pemUodm9pZCkKK3sKKwlzd2l0Y2ggKGZvcmsoKSkgeworCQljYXNlIDA6CisJCQlicmVhazsKKwkJY2FzZSAtMToKKwkJCWRpZSgiZm9yayBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZGVmYXVsdDoKKwkJCWV4aXQoMCk7CisJfQorCWlmIChzZXRzaWQoKSA9PSAtMSkKKwkJZGllKCJzZXRzaWQgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJY2xvc2UoMCk7CisJY2xvc2UoMSk7CisJY2xvc2UoMik7CisJc2FuaXRpemVfc3RkZmRzKCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0b3JlX3BpZChjb25zdCBjaGFyICpwYXRoKQoreworCUZJTEUgKmYgPSBmb3BlbihwYXRoLCAidyIpOworCWlmICghZikKKwkJZGllKCJjYW5ub3Qgb3BlbiBwaWQgZmlsZSAlczogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworCWlmIChmcHJpbnRmKGYsICIlZFxuIiwgZ2V0cGlkKCkpIDwgMCB8fCBmY2xvc2UoZikgIT0gMCkKKwkJZGllKCJmYWlsZWQgdG8gd3JpdGUgcGlkIGZpbGUgJXM6ICVzIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKK30KKworc3RhdGljIGludCBzZXJ2ZShjaGFyICpsaXN0ZW5fYWRkciwgaW50IGxpc3Rlbl9wb3J0LCBzdHJ1Y3QgcGFzc3dkICpwYXNzLCBnaWRfdCBnaWQpCit7CisJaW50IHNvY2tudW0sICpzb2NrbGlzdDsKKworCXNvY2tudW0gPSBzb2Nrc2V0dXAobGlzdGVuX2FkZHIsIGxpc3Rlbl9wb3J0LCAmc29ja2xpc3QpOworCWlmIChzb2NrbnVtID09IDApCisJCWRpZSgidW5hYmxlIHRvIGFsbG9jYXRlIGFueSBsaXN0ZW4gc29ja2V0cyBvbiBob3N0ICVzIHBvcnQgJXUiLAorCQkgICAgbGlzdGVuX2FkZHIsIGxpc3Rlbl9wb3J0KTsKKworCWlmIChwYXNzICYmIGdpZCAmJgorCSAgICAoaW5pdGdyb3VwcyhwYXNzLT5wd19uYW1lLCBnaWQpIHx8IHNldGdpZCAoZ2lkKSB8fAorCSAgICAgc2V0dWlkKHBhc3MtPnB3X3VpZCkpKQorCQlkaWUoImNhbm5vdCBkcm9wIHByaXZpbGVnZXMiKTsKKworCXJldHVybiBzZXJ2aWNlX2xvb3Aoc29ja251bSwgc29ja2xpc3QpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGxpc3Rlbl9wb3J0ID0gMDsKKwljaGFyICpsaXN0ZW5fYWRkciA9IE5VTEw7CisJaW50IGluZXRkX21vZGUgPSAwOworCWNvbnN0IGNoYXIgKnBpZF9maWxlID0gTlVMTCwgKnVzZXJfbmFtZSA9IE5VTEwsICpncm91cF9uYW1lID0gTlVMTDsKKwlpbnQgZGV0YWNoID0gMDsKKwlzdHJ1Y3QgcGFzc3dkICpwYXNzID0gTlVMTDsKKwlzdHJ1Y3QgZ3JvdXAgKmdyb3VwOworCWdpZF90IGdpZCA9IDA7CisJaW50IGk7CisKKwkvKiBXaXRob3V0IHRoaXMgd2UgY2Fubm90IHJlbHkgb24gd2FpdHBpZCgpIHRvIHRlbGwKKwkgKiB3aGF0IGhhcHBlbmVkIHRvIG91ciBjaGlsZHJlbi4KKwkgKi8KKwlzaWduYWwoU0lHQ0hMRCwgU0lHX0RGTCk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1saXN0ZW49IikpIHsKKwkJICAgIGNoYXIgKnAgPSBhcmcgKyA5OworCQkgICAgY2hhciAqcGggPSBsaXN0ZW5fYWRkciA9IHhtYWxsb2Moc3RybGVuKGFyZyArIDkpICsgMSk7CisJCSAgICB3aGlsZSAoKnApCisJCQkqcGgrKyA9IHRvbG93ZXIoKnArKyk7CisJCSAgICAqcGggPSAwOworCQkgICAgY29udGludWU7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1wb3J0PSIpKSB7CisJCQljaGFyICplbmQ7CisJCQl1bnNpZ25lZCBsb25nIG47CisJCQluID0gc3RydG91bChhcmcrNywgJmVuZCwgMCk7CisJCQlpZiAoYXJnWzddICYmICEqZW5kKSB7CisJCQkJbGlzdGVuX3BvcnQgPSBuOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0taW5ldGQiKSkgeworCQkJaW5ldGRfbW9kZSA9IDE7CisJCQlsb2dfc3lzbG9nID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tdmVyYm9zZSIpKSB7CisJCQl2ZXJib3NlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tc3lzbG9nIikpIHsKKwkJCWxvZ19zeXNsb2cgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1leHBvcnQtYWxsIikpIHsKKwkJCWV4cG9ydF9hbGxfdHJlZXMgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS10aW1lb3V0PSIpKSB7CisJCQl0aW1lb3V0ID0gYXRvaShhcmcrMTApOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1pbml0LXRpbWVvdXQ9IikpIHsKKwkJCWluaXRfdGltZW91dCA9IGF0b2koYXJnKzE1KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tc3RyaWN0LXBhdGhzIikpIHsKKwkJCXN0cmljdF9wYXRocyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItLWJhc2UtcGF0aD0iKSkgeworCQkJYmFzZV9wYXRoID0gYXJnKzEyOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1iYXNlLXBhdGgtcmVsYXhlZCIpKSB7CisJCQliYXNlX3BhdGhfcmVsYXhlZCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItLWludGVycG9sYXRlZC1wYXRoPSIpKSB7CisJCQlpbnRlcnBvbGF0ZWRfcGF0aCA9IGFyZysyMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tcmV1c2VhZGRyIikpIHsKKwkJCXJldXNlYWRkciA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLXVzZXItcGF0aCIpKSB7CisJCQl1c2VyX3BhdGggPSAiIjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tdXNlci1wYXRoPSIpKSB7CisJCQl1c2VyX3BhdGggPSBhcmcgKyAxMjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tcGlkLWZpbGU9IikpIHsKKwkJCXBpZF9maWxlID0gYXJnICsgMTE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWRldGFjaCIpKSB7CisJCQlkZXRhY2ggPSAxOworCQkJbG9nX3N5c2xvZyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItLXVzZXI9IikpIHsKKwkJCXVzZXJfbmFtZSA9IGFyZyArIDc7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChhcmcsICItLWdyb3VwPSIpKSB7CisJCQlncm91cF9uYW1lID0gYXJnICsgODsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tZW5hYmxlPSIpKSB7CisJCQllbmFibGVfc2VydmljZShhcmcgKyA5LCAxKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tZGlzYWJsZT0iKSkgeworCQkJZW5hYmxlX3NlcnZpY2UoYXJnICsgMTAsIDApOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1hbGxvdy1vdmVycmlkZT0iKSkgeworCQkJbWFrZV9zZXJ2aWNlX292ZXJyaWRhYmxlKGFyZyArIDE3LCAxKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcHJlZml4Y21wKGFyZywgIi0tZm9yYmlkLW92ZXJyaWRlPSIpKSB7CisJCQltYWtlX3NlcnZpY2Vfb3ZlcnJpZGFibGUoYXJnICsgMTgsIDApOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkgeworCQkJb2tfcGF0aHMgPSAmYXJndltpKzFdOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoYXJnWzBdICE9ICctJykgeworCQkJb2tfcGF0aHMgPSAmYXJndltpXTsKKwkJCWJyZWFrOworCQl9CisKKwkJdXNhZ2UoZGFlbW9uX3VzYWdlKTsKKwl9CisKKwlpZiAobG9nX3N5c2xvZykgeworCQlvcGVubG9nKCJnaXQtZGFlbW9uIiwgMCwgTE9HX0RBRU1PTik7CisJCXNldF9kaWVfcm91dGluZShkYWVtb25fZGllKTsKKwl9CisKKwlpZiAoaW5ldGRfbW9kZSAmJiAoZ3JvdXBfbmFtZSB8fCB1c2VyX25hbWUpKQorCQlkaWUoIi0tdXNlciBhbmQgLS1ncm91cCBhcmUgaW5jb21wYXRpYmxlIHdpdGggLS1pbmV0ZCIpOworCisJaWYgKGluZXRkX21vZGUgJiYgKGxpc3Rlbl9wb3J0IHx8IGxpc3Rlbl9hZGRyKSkKKwkJZGllKCItLWxpc3Rlbj0gYW5kIC0tcG9ydD0gYXJlIGluY29tcGF0aWJsZSB3aXRoIC0taW5ldGQiKTsKKwllbHNlIGlmIChsaXN0ZW5fcG9ydCA9PSAwKQorCQlsaXN0ZW5fcG9ydCA9IERFRkFVTFRfR0lUX1BPUlQ7CisKKwlpZiAoZ3JvdXBfbmFtZSAmJiAhdXNlcl9uYW1lKQorCQlkaWUoIi0tZ3JvdXAgc3VwcGxpZWQgd2l0aG91dCAtLXVzZXIiKTsKKworCWlmICh1c2VyX25hbWUpIHsKKwkJcGFzcyA9IGdldHB3bmFtKHVzZXJfbmFtZSk7CisJCWlmICghcGFzcykKKwkJCWRpZSgidXNlciBub3QgZm91bmQgLSAlcyIsIHVzZXJfbmFtZSk7CisKKwkJaWYgKCFncm91cF9uYW1lKQorCQkJZ2lkID0gcGFzcy0+cHdfZ2lkOworCQllbHNlIHsKKwkJCWdyb3VwID0gZ2V0Z3JuYW0oZ3JvdXBfbmFtZSk7CisJCQlpZiAoIWdyb3VwKQorCQkJCWRpZSgiZ3JvdXAgbm90IGZvdW5kIC0gJXMiLCBncm91cF9uYW1lKTsKKworCQkJZ2lkID0gZ3JvdXAtPmdyX2dpZDsKKwkJfQorCX0KKworCWlmIChzdHJpY3RfcGF0aHMgJiYgKCFva19wYXRocyB8fCAhKm9rX3BhdGhzKSkKKwkJZGllKCJvcHRpb24gLS1zdHJpY3QtcGF0aHMgcmVxdWlyZXMgYSB3aGl0ZWxpc3QiKTsKKworCWlmIChiYXNlX3BhdGgpIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisKKwkJaWYgKHN0YXQoYmFzZV9wYXRoLCAmc3QpIHx8ICFTX0lTRElSKHN0LnN0X21vZGUpKQorCQkJZGllKCJiYXNlLXBhdGggJyVzJyBkb2VzIG5vdCBleGlzdCBvciAiCisJCQkgICAgImlzIG5vdCBhIGRpcmVjdG9yeSIsIGJhc2VfcGF0aCk7CisJfQorCisJaWYgKGluZXRkX21vZGUpIHsKKwkJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3M7CisJCXN0cnVjdCBzb2NrYWRkciAqcGVlciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmc3M7CisJCXNvY2tsZW5fdCBzbGVuID0gc2l6ZW9mKHNzKTsKKworCQlmcmVvcGVuKCIvZGV2L251bGwiLCAidyIsIHN0ZGVycik7CisKKwkJaWYgKGdldHBlZXJuYW1lKDAsIHBlZXIsICZzbGVuKSkKKwkJCXBlZXIgPSBOVUxMOworCisJCXJldHVybiBleGVjdXRlKHBlZXIpOworCX0KKworCWlmIChkZXRhY2gpCisJCWRhZW1vbml6ZSgpOworCWVsc2UKKwkJc2FuaXRpemVfc3RkZmRzKCk7CisKKwlpZiAocGlkX2ZpbGUpCisJCXN0b3JlX3BpZChwaWRfZmlsZSk7CisKKwlyZXR1cm4gc2VydmUobGlzdGVuX2FkZHIsIGxpc3Rlbl9wb3J0LCBwYXNzLCBnaWQpOworfQpkaWZmIC0tZ2l0IGEvZGF0ZS5jIGIvZGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NGVkODYKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRlLmMKQEAgLTAsMCArMSw4NTkgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKi8KKworI2luY2x1ZGUgImNhY2hlLmgiCisKK3N0YXRpYyB0aW1lX3QgbXlfbWt0aW1lKHN0cnVjdCB0bSAqdG0pCit7CisJc3RhdGljIGNvbnN0IGludCBtZGF5c1tdID0geworCSAgICAwLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNAorCX07CisJaW50IHllYXIgPSB0bS0+dG1feWVhciAtIDcwOworCWludCBtb250aCA9IHRtLT50bV9tb247CisJaW50IGRheSA9IHRtLT50bV9tZGF5OworCisJaWYgKHllYXIgPCAwIHx8IHllYXIgPiAxMjkpIC8qIGFsZ28gb25seSB3b3JrcyBmb3IgMTk3MC0yMDk5ICovCisJCXJldHVybiAtMTsKKwlpZiAobW9udGggPCAwIHx8IG1vbnRoID4gMTEpIC8qIGFycmF5IGJvdW5kcyAqLworCQlyZXR1cm4gLTE7CisJaWYgKG1vbnRoIDwgMiB8fCAoeWVhciArIDIpICUgNCkKKwkJZGF5LS07CisJcmV0dXJuICh5ZWFyICogMzY1ICsgKHllYXIgKyAxKSAvIDQgKyBtZGF5c1ttb250aF0gKyBkYXkpICogMjQqNjAqNjBVTCArCisJCXRtLT50bV9ob3VyICogNjAqNjAgKyB0bS0+dG1fbWluICogNjAgKyB0bS0+dG1fc2VjOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqbW9udGhfbmFtZXNbXSA9IHsKKwkiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsCisJIkp1bHkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPY3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlY2VtYmVyIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKndlZWtkYXlfbmFtZXNbXSA9IHsKKwkiU3VuZGF5cyIsICJNb25kYXlzIiwgIlR1ZXNkYXlzIiwgIldlZG5lc2RheXMiLCAiVGh1cnNkYXlzIiwgIkZyaWRheXMiLCAiU2F0dXJkYXlzIgorfTsKKworc3RhdGljIHRpbWVfdCBnbV90aW1lX3QodW5zaWduZWQgbG9uZyB0aW1lLCBpbnQgdHopCit7CisJaW50IG1pbnV0ZXM7CisKKwltaW51dGVzID0gdHogPCAwID8gLXR6IDogdHo7CisJbWludXRlcyA9IChtaW51dGVzIC8gMTAwKSo2MCArIChtaW51dGVzICUgMTAwKTsKKwltaW51dGVzID0gdHogPCAwID8gLW1pbnV0ZXMgOiBtaW51dGVzOworCXJldHVybiB0aW1lICsgbWludXRlcyAqIDYwOworfQorCisvKgorICogVGhlICJ0eiIgdGhpbmcgaXMgcGFzc2VkIGluIGFzIHRoaXMgc3RyYW5nZSAiZGVjaW1hbCBwYXJzZSBvZiB0eiIKKyAqIHRoaW5nLCB3aGljaCBtZWFucyB0aGF0IHR6IC0wMTAwIGlzIHBhc3NlZCBpbiBhcyB0aGUgaW50ZWdlciAtMTAwLAorICogZXZlbiB0aG91Z2ggaXQgbWVhbnMgInNpeHR5IG1pbnV0ZXMgb2ZmIgorICovCitzdGF0aWMgc3RydWN0IHRtICp0aW1lX3RvX3RtKHVuc2lnbmVkIGxvbmcgdGltZSwgaW50IHR6KQoreworCXRpbWVfdCB0ID0gZ21fdGltZV90KHRpbWUsIHR6KTsKKwlyZXR1cm4gZ210aW1lKCZ0KTsKK30KKworLyoKKyAqIFdoYXQgdmFsdWUgb2YgInR6IiB3YXMgaW4gZWZmZWN0IGJhY2sgdGhlbiBhdCAidGltZSIgaW4gdGhlCisgKiBsb2NhbCB0aW1lem9uZT8KKyAqLworc3RhdGljIGludCBsb2NhbF90em9mZnNldCh1bnNpZ25lZCBsb25nIHRpbWUpCit7CisJdGltZV90IHQsIHRfbG9jYWw7CisJc3RydWN0IHRtIHRtOworCWludCBvZmZzZXQsIGVhc3R3ZXN0OworCisJdCA9IHRpbWU7CisJbG9jYWx0aW1lX3IoJnQsICZ0bSk7CisJdF9sb2NhbCA9IG15X21rdGltZSgmdG0pOworCisJaWYgKHRfbG9jYWwgPCB0KSB7CisJCWVhc3R3ZXN0ID0gLTE7CisJCW9mZnNldCA9IHQgLSB0X2xvY2FsOworCX0gZWxzZSB7CisJCWVhc3R3ZXN0ID0gMTsKKwkJb2Zmc2V0ID0gdF9sb2NhbCAtIHQ7CisJfQorCW9mZnNldCAvPSA2MDsgLyogaW4gbWludXRlcyAqLworCW9mZnNldCA9IChvZmZzZXQgJSA2MCkgKyAoKG9mZnNldCAvIDYwKSAqIDEwMCk7CisJcmV0dXJuIG9mZnNldCAqIGVhc3R3ZXN0OworfQorCitjb25zdCBjaGFyICpzaG93X2RhdGUodW5zaWduZWQgbG9uZyB0aW1lLCBpbnQgdHosIGVudW0gZGF0ZV9tb2RlIG1vZGUpCit7CisJc3RydWN0IHRtICp0bTsKKwlzdGF0aWMgY2hhciB0aW1lYnVmWzIwMF07CisKKwlpZiAobW9kZSA9PSBEQVRFX1JFTEFUSVZFKSB7CisJCXVuc2lnbmVkIGxvbmcgZGlmZjsKKwkJc3RydWN0IHRpbWV2YWwgbm93OworCQlnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7CisJCWlmIChub3cudHZfc2VjIDwgdGltZSkKKwkJCXJldHVybiAiaW4gdGhlIGZ1dHVyZSI7CisJCWRpZmYgPSBub3cudHZfc2VjIC0gdGltZTsKKwkJaWYgKGRpZmYgPCA5MCkgeworCQkJc25wcmludGYodGltZWJ1Ziwgc2l6ZW9mKHRpbWVidWYpLCAiJWx1IHNlY29uZHMgYWdvIiwgZGlmZik7CisJCQlyZXR1cm4gdGltZWJ1ZjsKKwkJfQorCQkvKiBUdXJuIGl0IGludG8gbWludXRlcyAqLworCQlkaWZmID0gKGRpZmYgKyAzMCkgLyA2MDsKKwkJaWYgKGRpZmYgPCA5MCkgeworCQkJc25wcmludGYodGltZWJ1Ziwgc2l6ZW9mKHRpbWVidWYpLCAiJWx1IG1pbnV0ZXMgYWdvIiwgZGlmZik7CisJCQlyZXR1cm4gdGltZWJ1ZjsKKwkJfQorCQkvKiBUdXJuIGl0IGludG8gaG91cnMgKi8KKwkJZGlmZiA9IChkaWZmICsgMzApIC8gNjA7CisJCWlmIChkaWZmIDwgMzYpIHsKKwkJCXNucHJpbnRmKHRpbWVidWYsIHNpemVvZih0aW1lYnVmKSwgIiVsdSBob3VycyBhZ28iLCBkaWZmKTsKKwkJCXJldHVybiB0aW1lYnVmOworCQl9CisJCS8qIFdlIGRlYWwgd2l0aCBudW1iZXIgb2YgZGF5cyBmcm9tIGhlcmUgb24gKi8KKwkJZGlmZiA9IChkaWZmICsgMTIpIC8gMjQ7CisJCWlmIChkaWZmIDwgMTQpIHsKKwkJCXNucHJpbnRmKHRpbWVidWYsIHNpemVvZih0aW1lYnVmKSwgIiVsdSBkYXlzIGFnbyIsIGRpZmYpOworCQkJcmV0dXJuIHRpbWVidWY7CisJCX0KKwkJLyogU2F5IHdlZWtzIGZvciB0aGUgcGFzdCAxMCB3ZWVrcyBvciBzbyAqLworCQlpZiAoZGlmZiA8IDcwKSB7CisJCQlzbnByaW50Zih0aW1lYnVmLCBzaXplb2YodGltZWJ1ZiksICIlbHUgd2Vla3MgYWdvIiwgKGRpZmYgKyAzKSAvIDcpOworCQkJcmV0dXJuIHRpbWVidWY7CisJCX0KKwkJLyogU2F5IG1vbnRocyBmb3IgdGhlIHBhc3QgMTIgbW9udGhzIG9yIHNvICovCisJCWlmIChkaWZmIDwgMzYwKSB7CisJCQlzbnByaW50Zih0aW1lYnVmLCBzaXplb2YodGltZWJ1ZiksICIlbHUgbW9udGhzIGFnbyIsIChkaWZmICsgMTUpIC8gMzApOworCQkJcmV0dXJuIHRpbWVidWY7CisJCX0KKwkJLyogRWxzZSBmYWxsIGJhY2sgb24gYWJzb2x1dGUgZm9ybWF0Li4gKi8KKwl9CisKKwlpZiAobW9kZSA9PSBEQVRFX0xPQ0FMKQorCQl0eiA9IGxvY2FsX3R6b2Zmc2V0KHRpbWUpOworCisJdG0gPSB0aW1lX3RvX3RtKHRpbWUsIHR6KTsKKwlpZiAoIXRtKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobW9kZSA9PSBEQVRFX1NIT1JUKQorCQlzcHJpbnRmKHRpbWVidWYsICIlMDRkLSUwMmQtJTAyZCIsIHRtLT50bV95ZWFyICsgMTkwMCwKKwkJCQl0bS0+dG1fbW9uICsgMSwgdG0tPnRtX21kYXkpOworCWVsc2UgaWYgKG1vZGUgPT0gREFURV9JU084NjAxKQorCQlzcHJpbnRmKHRpbWVidWYsICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCAlKzA1ZCIsCisJCQkJdG0tPnRtX3llYXIgKyAxOTAwLAorCQkJCXRtLT50bV9tb24gKyAxLAorCQkJCXRtLT50bV9tZGF5LAorCQkJCXRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjLAorCQkJCXR6KTsKKwllbHNlIGlmIChtb2RlID09IERBVEVfUkZDMjgyMikKKwkJc3ByaW50Zih0aW1lYnVmLCAiJS4zcywgJWQgJS4zcyAlZCAlMDJkOiUwMmQ6JTAyZCAlKzA1ZCIsCisJCQl3ZWVrZGF5X25hbWVzW3RtLT50bV93ZGF5XSwgdG0tPnRtX21kYXksCisJCQltb250aF9uYW1lc1t0bS0+dG1fbW9uXSwgdG0tPnRtX3llYXIgKyAxOTAwLAorCQkJdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMsIHR6KTsKKwllbHNlCisJCXNwcmludGYodGltZWJ1ZiwgIiUuM3MgJS4zcyAlZCAlMDJkOiUwMmQ6JTAyZCAlZCVjJSswNWQiLAorCQkJCXdlZWtkYXlfbmFtZXNbdG0tPnRtX3dkYXldLAorCQkJCW1vbnRoX25hbWVzW3RtLT50bV9tb25dLAorCQkJCXRtLT50bV9tZGF5LAorCQkJCXRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjLAorCQkJCXRtLT50bV95ZWFyICsgMTkwMCwKKwkJCQkobW9kZSA9PSBEQVRFX0xPQ0FMKSA/IDAgOiAnICcsCisJCQkJdHopOworCXJldHVybiB0aW1lYnVmOworfQorCisvKgorICogQ2hlY2sgdGhlc2UuIEFuZCBub3RlIGhvdyBpdCBkb2Vzbid0IGRvIHRoZSBzdW1tZXItdGltZSBjb252ZXJzaW9uLgorICoKKyAqIEluIG15IHdvcmxkLCBpdCdzIGFsd2F5cyBzdW1tZXIsIGFuZCB0aGluZ3MgYXJlIHByb2JhYmx5IGEgYml0IG9mZgorICogaW4gb3RoZXIgd2F5cyB0b28uCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IG9mZnNldDsKKwlpbnQgZHN0OworfSB0aW1lem9uZV9uYW1lc1tdID0geworCXsgIklETFciLCAtMTIsIDAsIH0sCS8qIEludGVybmF0aW9uYWwgRGF0ZSBMaW5lIFdlc3QgKi8KKwl7ICJOVCIsICAgLTExLCAwLCB9LAkvKiBOb21lICovCisJeyAiQ0FUIiwgIC0xMCwgMCwgfSwJLyogQ2VudHJhbCBBbGFza2EgKi8KKwl7ICJIU1QiLCAgLTEwLCAwLCB9LAkvKiBIYXdhaWkgU3RhbmRhcmQgKi8KKwl7ICJIRFQiLCAgLTEwLCAxLCB9LAkvKiBIYXdhaWkgRGF5bGlnaHQgKi8KKwl7ICJZU1QiLCAgIC05LCAwLCB9LAkvKiBZdWtvbiBTdGFuZGFyZCAqLworCXsgIllEVCIsICAgLTksIDEsIH0sCS8qIFl1a29uIERheWxpZ2h0ICovCisJeyAiUFNUIiwgICAtOCwgMCwgfSwJLyogUGFjaWZpYyBTdGFuZGFyZCAqLworCXsgIlBEVCIsICAgLTgsIDEsIH0sCS8qIFBhY2lmaWMgRGF5bGlnaHQgKi8KKwl7ICJNU1QiLCAgIC03LCAwLCB9LAkvKiBNb3VudGFpbiBTdGFuZGFyZCAqLworCXsgIk1EVCIsICAgLTcsIDEsIH0sCS8qIE1vdW50YWluIERheWxpZ2h0ICovCisJeyAiQ1NUIiwgICAtNiwgMCwgfSwJLyogQ2VudHJhbCBTdGFuZGFyZCAqLworCXsgIkNEVCIsICAgLTYsIDEsIH0sCS8qIENlbnRyYWwgRGF5bGlnaHQgKi8KKwl7ICJFU1QiLCAgIC01LCAwLCB9LAkvKiBFYXN0ZXJuIFN0YW5kYXJkICovCisJeyAiRURUIiwgICAtNSwgMSwgfSwJLyogRWFzdGVybiBEYXlsaWdodCAqLworCXsgIkFTVCIsICAgLTMsIDAsIH0sCS8qIEF0bGFudGljIFN0YW5kYXJkICovCisJeyAiQURUIiwgICAtMywgMSwgfSwJLyogQXRsYW50aWMgRGF5bGlnaHQgKi8KKwl7ICJXQVQiLCAgIC0xLCAwLCB9LAkvKiBXZXN0IEFmcmljYSAqLworCisJeyAiR01UIiwgICAgMCwgMCwgfSwJLyogR3JlZW53aWNoIE1lYW4gKi8KKwl7ICJVVEMiLCAgICAwLCAwLCB9LAkvKiBVbml2ZXJzYWwgKENvb3JkaW5hdGVkKSAqLworCisJeyAiV0VUIiwgICAgMCwgMCwgfSwJLyogV2VzdGVybiBFdXJvcGVhbiAqLworCXsgIkJTVCIsICAgIDAsIDEsIH0sCS8qIEJyaXRpc2ggU3VtbWVyICovCisJeyAiQ0VUIiwgICArMSwgMCwgfSwJLyogQ2VudHJhbCBFdXJvcGVhbiAqLworCXsgIk1FVCIsICAgKzEsIDAsIH0sCS8qIE1pZGRsZSBFdXJvcGVhbiAqLworCXsgIk1FV1QiLCAgKzEsIDAsIH0sCS8qIE1pZGRsZSBFdXJvcGVhbiBXaW50ZXIgKi8KKwl7ICJNRVNUIiwgICsxLCAxLCB9LAkvKiBNaWRkbGUgRXVyb3BlYW4gU3VtbWVyICovCisJeyAiQ0VTVCIsICArMSwgMSwgfSwJLyogQ2VudHJhbCBFdXJvcGVhbiBTdW1tZXIgKi8KKwl7ICJNRVNaIiwgICsxLCAxLCB9LAkvKiBNaWRkbGUgRXVyb3BlYW4gU3VtbWVyICovCisJeyAiRldUIiwgICArMSwgMCwgfSwJLyogRnJlbmNoIFdpbnRlciAqLworCXsgIkZTVCIsICAgKzEsIDEsIH0sCS8qIEZyZW5jaCBTdW1tZXIgKi8KKwl7ICJFRVQiLCAgICsyLCAwLCB9LAkvKiBFYXN0ZXJuIEV1cm9wZSwgVVNTUiBab25lIDEgKi8KKwl7ICJFRVNUIiwgICsyLCAxLCB9LAkvKiBFYXN0ZXJuIEV1cm9wZWFuIERheWxpZ2h0ICovCisJeyAiV0FTVCIsICArNywgMCwgfSwJLyogV2VzdCBBdXN0cmFsaWFuIFN0YW5kYXJkICovCisJeyAiV0FEVCIsICArNywgMSwgfSwJLyogV2VzdCBBdXN0cmFsaWFuIERheWxpZ2h0ICovCisJeyAiQ0NUIiwgICArOCwgMCwgfSwJLyogQ2hpbmEgQ29hc3QsIFVTU1IgWm9uZSA3ICovCisJeyAiSlNUIiwgICArOSwgMCwgfSwJLyogSmFwYW4gU3RhbmRhcmQsIFVTU1IgWm9uZSA4ICovCisJeyAiRUFTVCIsICsxMCwgMCwgfSwJLyogRWFzdGVybiBBdXN0cmFsaWFuIFN0YW5kYXJkICovCisJeyAiRUFEVCIsICsxMCwgMSwgfSwJLyogRWFzdGVybiBBdXN0cmFsaWFuIERheWxpZ2h0ICovCisJeyAiR1NUIiwgICsxMCwgMCwgfSwJLyogR3VhbSBTdGFuZGFyZCwgVVNTUiBab25lIDkgKi8KKwl7ICJOWlQiLCAgKzEyLCAwLCB9LAkvKiBOZXcgWmVhbGFuZCAqLworCXsgIk5aU1QiLCArMTIsIDAsIH0sCS8qIE5ldyBaZWFsYW5kIFN0YW5kYXJkICovCisJeyAiTlpEVCIsICsxMiwgMSwgfSwJLyogTmV3IFplYWxhbmQgRGF5bGlnaHQgKi8KKwl7ICJJRExFIiwgKzEyLCAwLCB9LAkvKiBJbnRlcm5hdGlvbmFsIERhdGUgTGluZSBFYXN0ICovCit9OworCitzdGF0aWMgaW50IG1hdGNoX3N0cmluZyhjb25zdCBjaGFyICpkYXRlLCBjb25zdCBjaGFyICpzdHIpCit7CisJaW50IGkgPSAwOworCisJZm9yIChpID0gMDsgKmRhdGU7IGRhdGUrKywgc3RyKyssIGkrKykgeworCQlpZiAoKmRhdGUgPT0gKnN0cikKKwkJCWNvbnRpbnVlOworCQlpZiAodG91cHBlcigqZGF0ZSkgPT0gdG91cHBlcigqc3RyKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWlzYWxudW0oKmRhdGUpKQorCQkJYnJlYWs7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBza2lwX2FscGhhKGNvbnN0IGNoYXIgKmRhdGUpCit7CisJaW50IGkgPSAwOworCWRvIHsKKwkJaSsrOworCX0gd2hpbGUgKGlzYWxwaGEoZGF0ZVtpXSkpOworCXJldHVybiBpOworfQorCisvKgorKiBQYXJzZSBtb250aCwgd2Vla2RheSwgb3IgdGltZXpvbmUgbmFtZQorKi8KK3N0YXRpYyBpbnQgbWF0Y2hfYWxwaGEoY29uc3QgY2hhciAqZGF0ZSwgc3RydWN0IHRtICp0bSwgaW50ICpvZmZzZXQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykgeworCQlpbnQgbWF0Y2ggPSBtYXRjaF9zdHJpbmcoZGF0ZSwgbW9udGhfbmFtZXNbaV0pOworCQlpZiAobWF0Y2ggPj0gMykgeworCQkJdG0tPnRtX21vbiA9IGk7CisJCQlyZXR1cm4gbWF0Y2g7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCWludCBtYXRjaCA9IG1hdGNoX3N0cmluZyhkYXRlLCB3ZWVrZGF5X25hbWVzW2ldKTsKKwkJaWYgKG1hdGNoID49IDMpIHsKKwkJCXRtLT50bV93ZGF5ID0gaTsKKwkJCXJldHVybiBtYXRjaDsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRpbWV6b25lX25hbWVzKTsgaSsrKSB7CisJCWludCBtYXRjaCA9IG1hdGNoX3N0cmluZyhkYXRlLCB0aW1lem9uZV9uYW1lc1tpXS5uYW1lKTsKKwkJaWYgKG1hdGNoID49IDMpIHsKKwkJCWludCBvZmYgPSB0aW1lem9uZV9uYW1lc1tpXS5vZmZzZXQ7CisKKwkJCS8qIFRoaXMgaXMgYm9ndXMsIGJ1dCB3ZSBsaWtlIHN1bW1lciAqLworCQkJb2ZmICs9IHRpbWV6b25lX25hbWVzW2ldLmRzdDsKKworCQkJLyogT25seSB1c2UgdGhlIHR6IG5hbWUgb2Zmc2V0IGlmIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgYmV0dGVyICovCisJCQlpZiAoKm9mZnNldCA9PSAtMSkKKwkJCQkqb2Zmc2V0ID0gNjAqb2ZmOworCisJCQlyZXR1cm4gbWF0Y2g7CisJCX0KKwl9CisKKwlpZiAobWF0Y2hfc3RyaW5nKGRhdGUsICJQTSIpID09IDIpIHsKKwkJdG0tPnRtX2hvdXIgPSAodG0tPnRtX2hvdXIgJSAxMikgKyAxMjsKKwkJcmV0dXJuIDI7CisJfQorCisJaWYgKG1hdGNoX3N0cmluZyhkYXRlLCAiQU0iKSA9PSAyKSB7CisJCXRtLT50bV9ob3VyID0gKHRtLT50bV9ob3VyICUgMTIpICsgMDsKKwkJcmV0dXJuIDI7CisJfQorCisJLyogQkFEIENSQVAgKi8KKwlyZXR1cm4gc2tpcF9hbHBoYShkYXRlKTsKK30KKworc3RhdGljIGludCBpc19kYXRlKGludCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXksIHN0cnVjdCB0bSAqbm93X3RtLCB0aW1lX3Qgbm93LCBzdHJ1Y3QgdG0gKnRtKQoreworCWlmIChtb250aCA+IDAgJiYgbW9udGggPCAxMyAmJiBkYXkgPiAwICYmIGRheSA8IDMyKSB7CisJCXN0cnVjdCB0bSBjaGVjayA9ICp0bTsKKwkJc3RydWN0IHRtICpyID0gKG5vd190bSA/ICZjaGVjayA6IHRtKTsKKwkJdGltZV90IHNwZWNpZmllZDsKKworCQlyLT50bV9tb24gPSBtb250aCAtIDE7CisJCXItPnRtX21kYXkgPSBkYXk7CisJCWlmICh5ZWFyID09IC0xKSB7CisJCQlpZiAoIW5vd190bSkKKwkJCQlyZXR1cm4gMTsKKwkJCXItPnRtX3llYXIgPSBub3dfdG0tPnRtX3llYXI7CisJCX0KKwkJZWxzZSBpZiAoeWVhciA+PSAxOTcwICYmIHllYXIgPCAyMTAwKQorCQkJci0+dG1feWVhciA9IHllYXIgLSAxOTAwOworCQllbHNlIGlmICh5ZWFyID4gNzAgJiYgeWVhciA8IDEwMCkKKwkJCXItPnRtX3llYXIgPSB5ZWFyOworCQllbHNlIGlmICh5ZWFyIDwgMzgpCisJCQlyLT50bV95ZWFyID0geWVhciArIDEwMDsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJCWlmICghbm93X3RtKQorCQkJcmV0dXJuIDE7CisKKwkJc3BlY2lmaWVkID0gbXlfbWt0aW1lKHIpOworCisJCS8qIEJlIGl0IGNvbW1pdCB0aW1lIG9yIGF1dGhvciB0aW1lLCBpdCBkb2VzIG5vdCBtYWtlCisJCSAqIHNlbnNlIHRvIHNwZWNpZnkgdGltZXN0YW1wIHdheSBpbnRvIHRoZSBmdXR1cmUuICBNYWtlCisJCSAqIHN1cmUgaXQgaXMgbm90IGxhdGVyIHRoYW4gdGVuIGRheXMgZnJvbSBub3cuLi4KKwkJICovCisJCWlmIChub3cgKyAxMCoyNCozNjAwIDwgc3BlY2lmaWVkKQorCQkJcmV0dXJuIDA7CisJCXRtLT50bV9tb24gPSByLT50bV9tb247CisJCXRtLT50bV9tZGF5ID0gci0+dG1fbWRheTsKKwkJaWYgKHllYXIgIT0gLTEpCisJCQl0bS0+dG1feWVhciA9IHItPnRtX3llYXI7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXRjaF9tdWx0aV9udW1iZXIodW5zaWduZWQgbG9uZyBudW0sIGNoYXIgYywgY29uc3QgY2hhciAqZGF0ZSwgY2hhciAqZW5kLCBzdHJ1Y3QgdG0gKnRtKQoreworCXRpbWVfdCBub3c7CisJc3RydWN0IHRtIG5vd190bTsKKwlzdHJ1Y3QgdG0gKnJlZnVzZV9mdXR1cmU7CisJbG9uZyBudW0yLCBudW0zOworCisJbnVtMiA9IHN0cnRvbChlbmQrMSwgJmVuZCwgMTApOworCW51bTMgPSAtMTsKKwlpZiAoKmVuZCA9PSBjICYmIGlzZGlnaXQoZW5kWzFdKSkKKwkJbnVtMyA9IHN0cnRvbChlbmQrMSwgJmVuZCwgMTApOworCisJLyogVGltZT8gRGF0ZT8gKi8KKwlzd2l0Y2ggKGMpIHsKKwljYXNlICc6JzoKKwkJaWYgKG51bTMgPCAwKQorCQkJbnVtMyA9IDA7CisJCWlmIChudW0gPCAyNSAmJiBudW0yID49IDAgJiYgbnVtMiA8IDYwICYmIG51bTMgPj0gMCAmJiBudW0zIDw9IDYwKSB7CisJCQl0bS0+dG1faG91ciA9IG51bTsKKwkJCXRtLT50bV9taW4gPSBudW0yOworCQkJdG0tPnRtX3NlYyA9IG51bTM7CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgJy0nOgorCWNhc2UgJy8nOgorCWNhc2UgJy4nOgorCQlub3cgPSB0aW1lKE5VTEwpOworCQlyZWZ1c2VfZnV0dXJlID0gTlVMTDsKKwkJaWYgKGdtdGltZV9yKCZub3csICZub3dfdG0pKQorCQkJcmVmdXNlX2Z1dHVyZSA9ICZub3dfdG07CisKKwkJaWYgKG51bSA+IDcwKSB7CisJCQkvKiB5eXl5LW1tLWRkPyAqLworCQkJaWYgKGlzX2RhdGUobnVtLCBudW0yLCBudW0zLCByZWZ1c2VfZnV0dXJlLCBub3csIHRtKSkKKwkJCQlicmVhazsKKwkJCS8qIHl5eXktZGQtbW0/ICovCisJCQlpZiAoaXNfZGF0ZShudW0sIG51bTMsIG51bTIsIHJlZnVzZV9mdXR1cmUsIG5vdywgdG0pKQorCQkJCWJyZWFrOworCQl9CisJCS8qIE91ciBlYXN0ZXJuIEV1cm9wZWFuIGZyaWVuZHMgc2F5IGRkLm1tLnl5W3l5XQorCQkgKiBpcyB0aGUgbm9ybSB0aGVyZSwgc28gZ2l2aW5nIHByZWNlZGVuY2UgdG8KKwkJICogbW0vZGQveXlbeXldIGZvcm0gb25seSB3aGVuIHNlcGFyYXRvciBpcyBub3QgJy4nCisJCSAqLworCQlpZiAoYyAhPSAnLicgJiYKKwkJICAgIGlzX2RhdGUobnVtMywgbnVtLCBudW0yLCByZWZ1c2VfZnV0dXJlLCBub3csIHRtKSkKKwkJCWJyZWFrOworCQkvKiBFdXJvcGVhbiBkZC5tbS55eVt5eV0gb3IgZnVubnkgVVMgZGQvbW0veXlbeXldICovCisJCWlmIChpc19kYXRlKG51bTMsIG51bTIsIG51bSwgcmVmdXNlX2Z1dHVyZSwgbm93LCB0bSkpCisJCQlicmVhazsKKwkJLyogRnVubnkgRXVyb3BlYW4gbW0uZGQueXkgKi8KKwkJaWYgKGMgPT0gJy4nICYmCisJCSAgICBpc19kYXRlKG51bTMsIG51bSwgbnVtMiwgcmVmdXNlX2Z1dHVyZSwgbm93LCB0bSkpCisJCQlicmVhazsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBlbmQgLSBkYXRlOworfQorCisvKgorICogV2UndmUgc2VlbiBhIGRpZ2l0LiBUaW1lPyBZZWFyPyBEYXRlPworICovCitzdGF0aWMgaW50IG1hdGNoX2RpZ2l0KGNvbnN0IGNoYXIgKmRhdGUsIHN0cnVjdCB0bSAqdG0sIGludCAqb2Zmc2V0LCBpbnQgKnRtX2dtdCkKK3sKKwlpbnQgbjsKKwljaGFyICplbmQ7CisJdW5zaWduZWQgbG9uZyBudW07CisKKwludW0gPSBzdHJ0b3VsKGRhdGUsICZlbmQsIDEwKTsKKworCS8qCisJICogU2Vjb25kcyBzaW5jZSAxOTcwPyBXZSB0cmlnZ2VyIG9uIHRoYXQgZm9yIGFueSBudW1iZXJzIHdpdGgKKwkgKiBtb3JlIHRoYW4gOCBkaWdpdHMuIFRoaXMgaXMgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHJ1bGUgb3V0CisJICogbnVtYmVycyBsaWtlIDIwMDcwNjA2IGFzIGEgWVlZWU1NREQgZGF0ZS4KKwkgKi8KKwlpZiAobnVtID49IDEwMDAwMDAwMCkgeworCQl0aW1lX3QgdGltZSA9IG51bTsKKwkJaWYgKGdtdGltZV9yKCZ0aW1lLCB0bSkpIHsKKwkJCSp0bV9nbXQgPSAxOworCQkJcmV0dXJuIGVuZCAtIGRhdGU7CisJCX0KKwl9CisKKwkvKgorCSAqIENoZWNrIGZvciBzcGVjaWFsIGZvcm1hdHM6IG51bVstLjovXW51bVtzYW1lXW51bQorCSAqLworCXN3aXRjaCAoKmVuZCkgeworCWNhc2UgJzonOgorCWNhc2UgJy4nOgorCWNhc2UgJy8nOgorCWNhc2UgJy0nOgorCQlpZiAoaXNkaWdpdChlbmRbMV0pKSB7CisJCQlpbnQgbWF0Y2ggPSBtYXRjaF9tdWx0aV9udW1iZXIobnVtLCAqZW5kLCBkYXRlLCBlbmQsIHRtKTsKKwkJCWlmIChtYXRjaCkKKwkJCQlyZXR1cm4gbWF0Y2g7CisJCX0KKwl9CisKKwkvKgorCSAqIE5vbmUgb2YgdGhlIHNwZWNpYWwgZm9ybWF0cz8gVHJ5IHRvIGd1ZXNzIHdoYXQKKwkgKiB0aGUgbnVtYmVyIG1lYW50LiBXZSB1c2UgdGhlIG51bWJlciBvZiBkaWdpdHMKKwkgKiB0byBtYWtlIGEgbW9yZSBlZHVjYXRlZCBndWVzcy4uCisJICovCisJbiA9IDA7CisJZG8geworCQluKys7CisJfSB3aGlsZSAoaXNkaWdpdChkYXRlW25dKSk7CisKKwkvKiBGb3VyLWRpZ2l0IHllYXIgb3IgYSB0aW1lem9uZT8gKi8KKwlpZiAobiA9PSA0KSB7CisJCWlmIChudW0gPD0gMTQwMCAmJiAqb2Zmc2V0ID09IC0xKSB7CisJCQl1bnNpZ25lZCBpbnQgbWludXRlcyA9IG51bSAlIDEwMDsKKwkJCXVuc2lnbmVkIGludCBob3VycyA9IG51bSAvIDEwMDsKKwkJCSpvZmZzZXQgPSBob3Vycyo2MCArIG1pbnV0ZXM7CisJCX0gZWxzZSBpZiAobnVtID4gMTkwMCAmJiBudW0gPCAyMTAwKQorCQkJdG0tPnRtX3llYXIgPSBudW0gLSAxOTAwOworCQlyZXR1cm4gbjsKKwl9CisKKwkvKgorCSAqIE5PVEUhIFdlIHdpbGwgZ2l2ZSBwcmVjZWRlbmNlIHRvIGRheS1vZi1tb250aCBvdmVyIG1vbnRoIG9yCisJICogeWVhciBudW1iZXJzIGluIHRoZSAxLTEyIHJhbmdlLiBTbyAwNSBpcyBhbHdheXMgIm1kYXkgNSIsCisJICogdW5sZXNzIHdlIGFscmVhZHkgaGF2ZSBhIG1kYXkuLgorCSAqCisJICogSU9XLCAwMSBBcHIgMDUgcGFyc2VzIGFzICJBcHJpbCAxc3QsIDIwMDUiLgorCSAqLworCWlmIChudW0gPiAwICYmIG51bSA8IDMyICYmIHRtLT50bV9tZGF5IDwgMCkgeworCQl0bS0+dG1fbWRheSA9IG51bTsKKwkJcmV0dXJuIG47CisJfQorCisJLyogVHdvLWRpZ2l0IHllYXI/ICovCisJaWYgKG4gPT0gMiAmJiB0bS0+dG1feWVhciA8IDApIHsKKwkJaWYgKG51bSA8IDEwICYmIHRtLT50bV9tZGF5ID49IDApIHsKKwkJCXRtLT50bV95ZWFyID0gbnVtICsgMTAwOworCQkJcmV0dXJuIG47CisJCX0KKwkJaWYgKG51bSA+PSA3MCkgeworCQkJdG0tPnRtX3llYXIgPSBudW07CisJCQlyZXR1cm4gbjsKKwkJfQorCX0KKworCWlmIChudW0gPiAwICYmIG51bSA8IDMyKSB7CisJCXRtLT50bV9tZGF5ID0gbnVtOworCX0gZWxzZSBpZiAobnVtID4gMTkwMCkgeworCQl0bS0+dG1feWVhciA9IG51bSAtIDE5MDA7CisJfSBlbHNlIGlmIChudW0gPiA3MCkgeworCQl0bS0+dG1feWVhciA9IG51bTsKKwl9IGVsc2UgaWYgKG51bSA+IDAgJiYgbnVtIDwgMTMpIHsKKwkJdG0tPnRtX21vbiA9IG51bS0xOworCX0KKworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IG1hdGNoX3R6KGNvbnN0IGNoYXIgKmRhdGUsIGludCAqb2ZmcCkKK3sKKwljaGFyICplbmQ7CisJaW50IG9mZnNldCA9IHN0cnRvdWwoZGF0ZSsxLCAmZW5kLCAxMCk7CisJaW50IG1pbiwgaG91cjsKKwlpbnQgbiA9IGVuZCAtIGRhdGUgLSAxOworCisJbWluID0gb2Zmc2V0ICUgMTAwOworCWhvdXIgPSBvZmZzZXQgLyAxMDA7CisKKwkvKgorCSAqIERvbid0IGFjY2VwdCBhbnkgcmFuZG9tIGNyYXAuLiBBdCBsZWFzdCAzIGRpZ2l0cywgYW5kCisJICogYSB2YWxpZCBtaW51dGUuIFdlIG1pZ2h0IHdhbnQgdG8gY2hlY2sgdGhhdCB0aGUgbWludXRlcworCSAqIGFyZSBkaXZpc2libGUgYnkgMzAgb3Igc29tZXRoaW5nIHRvby4KKwkgKi8KKwlpZiAobWluIDwgNjAgJiYgbiA+IDIpIHsKKwkJb2Zmc2V0ID0gaG91cio2MCttaW47CisJCWlmICgqZGF0ZSA9PSAnLScpCisJCQlvZmZzZXQgPSAtb2Zmc2V0OworCisJCSpvZmZwID0gb2Zmc2V0OworCX0KKwlyZXR1cm4gZW5kIC0gZGF0ZTsKK30KKworc3RhdGljIGludCBkYXRlX3N0cmluZyh1bnNpZ25lZCBsb25nIGRhdGUsIGludCBvZmZzZXQsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgc2lnbiA9ICcrJzsKKworCWlmIChvZmZzZXQgPCAwKSB7CisJCW9mZnNldCA9IC1vZmZzZXQ7CisJCXNpZ24gPSAnLSc7CisJfQorCXJldHVybiBzbnByaW50ZihidWYsIGxlbiwgIiVsdSAlYyUwMmQlMDJkIiwgZGF0ZSwgc2lnbiwgb2Zmc2V0IC8gNjAsIG9mZnNldCAlIDYwKTsKK30KKworLyogR3IuIHN0cnB0aW1lIGlzIGNyYXAgZm9yIHRoaXM7IGl0IGRvZXNuJ3QgaGF2ZSBhIHdheSB0byByZXF1aXJlIFJGQzI4MjIKKyAgIChpLmUuIEVuZ2xpc2gpIGRheS9tb250aCBuYW1lcywgYW5kIGl0IGRvZXNuJ3Qgd29yayBjb3JyZWN0bHkgd2l0aCAlei4gKi8KK2ludCBwYXJzZV9kYXRlKGNvbnN0IGNoYXIgKmRhdGUsIGNoYXIgKnJlc3VsdCwgaW50IG1heGxlbikKK3sKKwlzdHJ1Y3QgdG0gdG07CisJaW50IG9mZnNldCwgdG1fZ210OworCXRpbWVfdCB0aGVuOworCisJbWVtc2V0KCZ0bSwgMCwgc2l6ZW9mKHRtKSk7CisJdG0udG1feWVhciA9IC0xOworCXRtLnRtX21vbiA9IC0xOworCXRtLnRtX21kYXkgPSAtMTsKKwl0bS50bV9pc2RzdCA9IC0xOworCW9mZnNldCA9IC0xOworCXRtX2dtdCA9IDA7CisKKwlmb3IgKDs7KSB7CisJCWludCBtYXRjaCA9IDA7CisJCXVuc2lnbmVkIGNoYXIgYyA9ICpkYXRlOworCisJCS8qIFN0b3AgYXQgZW5kIG9mIHN0cmluZyBvciBuZXdsaW5lICovCisJCWlmICghYyB8fCBjID09ICdcbicpCisJCQlicmVhazsKKworCQlpZiAoaXNhbHBoYShjKSkKKwkJCW1hdGNoID0gbWF0Y2hfYWxwaGEoZGF0ZSwgJnRtLCAmb2Zmc2V0KTsKKwkJZWxzZSBpZiAoaXNkaWdpdChjKSkKKwkJCW1hdGNoID0gbWF0Y2hfZGlnaXQoZGF0ZSwgJnRtLCAmb2Zmc2V0LCAmdG1fZ210KTsKKwkJZWxzZSBpZiAoKGMgPT0gJy0nIHx8IGMgPT0gJysnKSAmJiBpc2RpZ2l0KGRhdGVbMV0pKQorCQkJbWF0Y2ggPSBtYXRjaF90eihkYXRlLCAmb2Zmc2V0KTsKKworCQlpZiAoIW1hdGNoKSB7CisJCQkvKiBCQUQgQ1JBUCAqLworCQkJbWF0Y2ggPSAxOworCQl9CisKKwkJZGF0ZSArPSBtYXRjaDsKKwl9CisKKwkvKiBta3RpbWUgdXNlcyBsb2NhbCB0aW1lem9uZSAqLworCXRoZW4gPSBteV9ta3RpbWUoJnRtKTsKKwlpZiAob2Zmc2V0ID09IC0xKQorCQlvZmZzZXQgPSAodGhlbiAtIG1rdGltZSgmdG0pKSAvIDYwOworCisJaWYgKHRoZW4gPT0gLTEpCisJCXJldHVybiAtMTsKKworCWlmICghdG1fZ210KQorCQl0aGVuIC09IG9mZnNldCAqIDYwOworCXJldHVybiBkYXRlX3N0cmluZyh0aGVuLCBvZmZzZXQsIHJlc3VsdCwgbWF4bGVuKTsKK30KKworZW51bSBkYXRlX21vZGUgcGFyc2VfZGF0ZV9mb3JtYXQoY29uc3QgY2hhciAqZm9ybWF0KQoreworCWlmICghc3RyY21wKGZvcm1hdCwgInJlbGF0aXZlIikpCisJCXJldHVybiBEQVRFX1JFTEFUSVZFOworCWVsc2UgaWYgKCFzdHJjbXAoZm9ybWF0LCAiaXNvODYwMSIpIHx8CisJCSAhc3RyY21wKGZvcm1hdCwgImlzbyIpKQorCQlyZXR1cm4gREFURV9JU084NjAxOworCWVsc2UgaWYgKCFzdHJjbXAoZm9ybWF0LCAicmZjMjgyMiIpIHx8CisJCSAhc3RyY21wKGZvcm1hdCwgInJmYyIpKQorCQlyZXR1cm4gREFURV9SRkMyODIyOworCWVsc2UgaWYgKCFzdHJjbXAoZm9ybWF0LCAic2hvcnQiKSkKKwkJcmV0dXJuIERBVEVfU0hPUlQ7CisJZWxzZSBpZiAoIXN0cmNtcChmb3JtYXQsICJsb2NhbCIpKQorCQlyZXR1cm4gREFURV9MT0NBTDsKKwllbHNlIGlmICghc3RyY21wKGZvcm1hdCwgImRlZmF1bHQiKSkKKwkJcmV0dXJuIERBVEVfTk9STUFMOworCWVsc2UKKwkJZGllKCJ1bmtub3duIGRhdGUgZm9ybWF0ICVzIiwgZm9ybWF0KTsKK30KKwordm9pZCBkYXRlc3RhbXAoY2hhciAqYnVmLCBpbnQgYnVmc2l6ZSkKK3sKKwl0aW1lX3Qgbm93OworCWludCBvZmZzZXQ7CisKKwl0aW1lKCZub3cpOworCisJb2Zmc2V0ID0gbXlfbWt0aW1lKGxvY2FsdGltZSgmbm93KSkgLSBub3c7CisJb2Zmc2V0IC89IDYwOworCisJZGF0ZV9zdHJpbmcobm93LCBvZmZzZXQsIGJ1ZiwgYnVmc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV90bShzdHJ1Y3QgdG0gKnRtLCB1bnNpZ25lZCBsb25nIHNlYykKK3sKKwl0aW1lX3QgbiA9IG1rdGltZSh0bSkgLSBzZWM7CisJbG9jYWx0aW1lX3IoJm4sIHRtKTsKK30KKworc3RhdGljIHZvaWQgZGF0ZV95ZXN0ZXJkYXkoc3RydWN0IHRtICp0bSwgaW50ICpudW0pCit7CisJdXBkYXRlX3RtKHRtLCAyNCo2MCo2MCk7Cit9CisKK3N0YXRpYyB2b2lkIGRhdGVfdGltZShzdHJ1Y3QgdG0gKnRtLCBpbnQgaG91cikKK3sKKwlpZiAodG0tPnRtX2hvdXIgPCBob3VyKQorCQlkYXRlX3llc3RlcmRheSh0bSwgTlVMTCk7CisJdG0tPnRtX2hvdXIgPSBob3VyOworCXRtLT50bV9taW4gPSAwOworCXRtLT50bV9zZWMgPSAwOworfQorCitzdGF0aWMgdm9pZCBkYXRlX21pZG5pZ2h0KHN0cnVjdCB0bSAqdG0sIGludCAqbnVtKQoreworCWRhdGVfdGltZSh0bSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRhdGVfbm9vbihzdHJ1Y3QgdG0gKnRtLCBpbnQgKm51bSkKK3sKKwlkYXRlX3RpbWUodG0sIDEyKTsKK30KKworc3RhdGljIHZvaWQgZGF0ZV90ZWEoc3RydWN0IHRtICp0bSwgaW50ICpudW0pCit7CisJZGF0ZV90aW1lKHRtLCAxNyk7Cit9CisKK3N0YXRpYyB2b2lkIGRhdGVfcG0oc3RydWN0IHRtICp0bSwgaW50ICpudW0pCit7CisJaW50IGhvdXIsIG4gPSAqbnVtOworCSpudW0gPSAwOworCisJaG91ciA9IHRtLT50bV9ob3VyOworCWlmIChuKSB7CisJCWhvdXIgPSBuOworCQl0bS0+dG1fbWluID0gMDsKKwkJdG0tPnRtX3NlYyA9IDA7CisJfQorCXRtLT50bV9ob3VyID0gKGhvdXIgJSAxMikgKyAxMjsKK30KKworc3RhdGljIHZvaWQgZGF0ZV9hbShzdHJ1Y3QgdG0gKnRtLCBpbnQgKm51bSkKK3sKKwlpbnQgaG91ciwgbiA9ICpudW07CisJKm51bSA9IDA7CisKKwlob3VyID0gdG0tPnRtX2hvdXI7CisJaWYgKG4pIHsKKwkJaG91ciA9IG47CisJCXRtLT50bV9taW4gPSAwOworCQl0bS0+dG1fc2VjID0gMDsKKwl9CisJdG0tPnRtX2hvdXIgPSAoaG91ciAlIDEyKTsKK30KKworc3RhdGljIHZvaWQgZGF0ZV9uZXZlcihzdHJ1Y3QgdG0gKnRtLCBpbnQgKm51bSkKK3sKKwl0bS0+dG1fbW9uID0gdG0tPnRtX3dkYXkgPSB0bS0+dG1feWRheQorCQk9IHRtLT50bV9ob3VyID0gdG0tPnRtX21pbiA9IHRtLT50bV9zZWMgPSAwOworCXRtLT50bV95ZWFyID0gNzA7CisJdG0tPnRtX21kYXkgPSAxOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwZWNpYWwgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdm9pZCAoKmZuKShzdHJ1Y3QgdG0gKiwgaW50ICopOworfSBzcGVjaWFsW10gPSB7CisJeyAieWVzdGVyZGF5IiwgZGF0ZV95ZXN0ZXJkYXkgfSwKKwl7ICJub29uIiwgZGF0ZV9ub29uIH0sCisJeyAibWlkbmlnaHQiLCBkYXRlX21pZG5pZ2h0IH0sCisJeyAidGVhIiwgZGF0ZV90ZWEgfSwKKwl7ICJQTSIsIGRhdGVfcG0gfSwKKwl7ICJBTSIsIGRhdGVfYW0gfSwKKwl7ICJuZXZlciIsIGRhdGVfbmV2ZXIgfSwKKwl7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKm51bWJlcl9uYW1lW10gPSB7CisJInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwKKwkiZml2ZSIsICJzaXgiLCAic2V2ZW4iLCAiZWlnaHQiLCAibmluZSIsICJ0ZW4iLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0eXBlbGVuIHsKKwljb25zdCBjaGFyICp0eXBlOworCWludCBsZW5ndGg7Cit9IHR5cGVsZW5bXSA9IHsKKwl7ICJzZWNvbmRzIiwgMSB9LAorCXsgIm1pbnV0ZXMiLCA2MCB9LAorCXsgImhvdXJzIiwgNjAqNjAgfSwKKwl7ICJkYXlzIiwgMjQqNjAqNjAgfSwKKwl7ICJ3ZWVrcyIsIDcqMjQqNjAqNjAgfSwKKwl7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmFwcHJveGlkYXRlX2FscGhhKGNvbnN0IGNoYXIgKmRhdGUsIHN0cnVjdCB0bSAqdG0sIGludCAqbnVtKQoreworCWNvbnN0IHN0cnVjdCB0eXBlbGVuICp0bDsKKwljb25zdCBzdHJ1Y3Qgc3BlY2lhbCAqczsKKwljb25zdCBjaGFyICplbmQgPSBkYXRlOworCWludCBpOworCisJd2hpbGUgKGlzYWxwaGEoKisrZW5kKSk7CisJCTsKKworCWZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7CisJCWludCBtYXRjaCA9IG1hdGNoX3N0cmluZyhkYXRlLCBtb250aF9uYW1lc1tpXSk7CisJCWlmIChtYXRjaCA+PSAzKSB7CisJCQl0bS0+dG1fbW9uID0gaTsKKwkJCXJldHVybiBlbmQ7CisJCX0KKwl9CisKKwlmb3IgKHMgPSBzcGVjaWFsOyBzLT5uYW1lOyBzKyspIHsKKwkJaW50IGxlbiA9IHN0cmxlbihzLT5uYW1lKTsKKwkJaWYgKG1hdGNoX3N0cmluZyhkYXRlLCBzLT5uYW1lKSA9PSBsZW4pIHsKKwkJCXMtPmZuKHRtLCBudW0pOworCQkJcmV0dXJuIGVuZDsKKwkJfQorCX0KKworCWlmICghKm51bSkgeworCQlmb3IgKGkgPSAxOyBpIDwgMTE7IGkrKykgeworCQkJaW50IGxlbiA9IHN0cmxlbihudW1iZXJfbmFtZVtpXSk7CisJCQlpZiAobWF0Y2hfc3RyaW5nKGRhdGUsIG51bWJlcl9uYW1lW2ldKSA9PSBsZW4pIHsKKwkJCQkqbnVtID0gaTsKKwkJCQlyZXR1cm4gZW5kOworCQkJfQorCQl9CisJCWlmIChtYXRjaF9zdHJpbmcoZGF0ZSwgImxhc3QiKSA9PSA0KQorCQkJKm51bSA9IDE7CisJCXJldHVybiBlbmQ7CisJfQorCisJdGwgPSB0eXBlbGVuOworCXdoaWxlICh0bC0+dHlwZSkgeworCQlpbnQgbGVuID0gc3RybGVuKHRsLT50eXBlKTsKKwkJaWYgKG1hdGNoX3N0cmluZyhkYXRlLCB0bC0+dHlwZSkgPj0gbGVuLTEpIHsKKwkJCXVwZGF0ZV90bSh0bSwgdGwtPmxlbmd0aCAqICpudW0pOworCQkJKm51bSA9IDA7CisJCQlyZXR1cm4gZW5kOworCQl9CisJCXRsKys7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQlpbnQgbWF0Y2ggPSBtYXRjaF9zdHJpbmcoZGF0ZSwgd2Vla2RheV9uYW1lc1tpXSk7CisJCWlmIChtYXRjaCA+PSAzKSB7CisJCQlpbnQgZGlmZiwgbiA9ICpudW0gLTE7CisJCQkqbnVtID0gMDsKKworCQkJZGlmZiA9IHRtLT50bV93ZGF5IC0gaTsKKwkJCWlmIChkaWZmIDw9IDApCisJCQkJbisrOworCQkJZGlmZiArPSA3Km47CisKKwkJCXVwZGF0ZV90bSh0bSwgZGlmZiAqIDI0ICogNjAgKiA2MCk7CisJCQlyZXR1cm4gZW5kOworCQl9CisJfQorCisJaWYgKG1hdGNoX3N0cmluZyhkYXRlLCAibW9udGhzIikgPj0gNSkgeworCQlpbnQgbiA9IHRtLT50bV9tb24gLSAqbnVtOworCQkqbnVtID0gMDsKKwkJd2hpbGUgKG4gPCAwKSB7CisJCQluICs9IDEyOworCQkJdG0tPnRtX3llYXItLTsKKwkJfQorCQl0bS0+dG1fbW9uID0gbjsKKwkJcmV0dXJuIGVuZDsKKwl9CisKKwlpZiAobWF0Y2hfc3RyaW5nKGRhdGUsICJ5ZWFycyIpID49IDQpIHsKKwkJdG0tPnRtX3llYXIgLT0gKm51bTsKKwkJKm51bSA9IDA7CisJCXJldHVybiBlbmQ7CisJfQorCisJcmV0dXJuIGVuZDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmFwcHJveGlkYXRlX2RpZ2l0KGNvbnN0IGNoYXIgKmRhdGUsIHN0cnVjdCB0bSAqdG0sIGludCAqbnVtKQoreworCWNoYXIgKmVuZDsKKwl1bnNpZ25lZCBsb25nIG51bWJlciA9IHN0cnRvdWwoZGF0ZSwgJmVuZCwgMTApOworCisJc3dpdGNoICgqZW5kKSB7CisJY2FzZSAnOic6CisJY2FzZSAnLic6CisJY2FzZSAnLyc6CisJY2FzZSAnLSc6CisJCWlmIChpc2RpZ2l0KGVuZFsxXSkpIHsKKwkJCWludCBtYXRjaCA9IG1hdGNoX211bHRpX251bWJlcihudW1iZXIsICplbmQsIGRhdGUsIGVuZCwgdG0pOworCQkJaWYgKG1hdGNoKQorCQkJCXJldHVybiBkYXRlICsgbWF0Y2g7CisJCX0KKwl9CisKKwkqbnVtID0gbnVtYmVyOworCXJldHVybiBlbmQ7Cit9CisKK3Vuc2lnbmVkIGxvbmcgYXBwcm94aWRhdGUoY29uc3QgY2hhciAqZGF0ZSkKK3sKKwlpbnQgbnVtYmVyID0gMDsKKwlzdHJ1Y3QgdG0gdG0sIG5vdzsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwljaGFyIGJ1ZmZlcls1MF07CisKKwlpZiAocGFyc2VfZGF0ZShkYXRlLCBidWZmZXIsIHNpemVvZihidWZmZXIpKSA+IDApCisJCXJldHVybiBzdHJ0b3VsKGJ1ZmZlciwgTlVMTCwgMTApOworCisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJbG9jYWx0aW1lX3IoJnR2LnR2X3NlYywgJnRtKTsKKwlub3cgPSB0bTsKKwlmb3IgKDs7KSB7CisJCXVuc2lnbmVkIGNoYXIgYyA9ICpkYXRlOworCQlpZiAoIWMpCisJCQlicmVhazsKKwkJZGF0ZSsrOworCQlpZiAoaXNkaWdpdChjKSkgeworCQkJZGF0ZSA9IGFwcHJveGlkYXRlX2RpZ2l0KGRhdGUtMSwgJnRtLCAmbnVtYmVyKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChpc2FscGhhKGMpKQorCQkJZGF0ZSA9IGFwcHJveGlkYXRlX2FscGhhKGRhdGUtMSwgJnRtLCAmbnVtYmVyKTsKKwl9CisJaWYgKG51bWJlciA+IDAgJiYgbnVtYmVyIDwgMzIpCisJCXRtLnRtX21kYXkgPSBudW1iZXI7CisJaWYgKHRtLnRtX21vbiA+IG5vdy50bV9tb24gJiYgdG0udG1feWVhciA9PSBub3cudG1feWVhcikKKwkJdG0udG1feWVhci0tOworCXJldHVybiBta3RpbWUoJnRtKTsKK30KZGlmZiAtLWdpdCBhL2RlY29yYXRlLmMgYi9kZWNvcmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZjZiMDAKLS0tIC9kZXYvbnVsbAorKysgYi9kZWNvcmF0ZS5jCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBkZWNvcmF0ZS5jIC0gZGVjb3JhdGUgYSBnaXQgb2JqZWN0IHdpdGggc29tZSBhcmJpdHJhcnkKKyAqIGRhdGEuCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgImRlY29yYXRlLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGFzaF9vYmooc3RydWN0IG9iamVjdCAqb2JqLCB1bnNpZ25lZCBpbnQgbikKK3sKKwl1bnNpZ25lZCBpbnQgaGFzaCA9ICoodW5zaWduZWQgaW50ICopb2JqLT5zaGExOworCXJldHVybiBoYXNoICUgbjsKK30KKworc3RhdGljIHZvaWQgKmluc2VydF9kZWNvcmF0aW9uKHN0cnVjdCBkZWNvcmF0aW9uICpuLCBzdHJ1Y3Qgb2JqZWN0ICpiYXNlLCB2b2lkICpkZWNvcmF0aW9uKQoreworCWludCBzaXplID0gbi0+c2l6ZTsKKwlzdHJ1Y3Qgb2JqZWN0X2RlY29yYXRpb24gKmhhc2ggPSBuLT5oYXNoOworCWludCBqID0gaGFzaF9vYmooYmFzZSwgc2l6ZSk7CisKKwl3aGlsZSAoaGFzaFtqXS5iYXNlKSB7CisJCWlmIChoYXNoW2pdLmJhc2UgPT0gYmFzZSkgeworCQkJdm9pZCAqb2xkID0gaGFzaFtqXS5kZWNvcmF0aW9uOworCQkJaGFzaFtqXS5kZWNvcmF0aW9uID0gZGVjb3JhdGlvbjsKKwkJCXJldHVybiBvbGQ7CisJCX0KKwkJaWYgKCsraiA+PSBzaXplKQorCQkJaiA9IDA7CisJfQorCWhhc2hbal0uYmFzZSA9IGJhc2U7CisJaGFzaFtqXS5kZWNvcmF0aW9uID0gZGVjb3JhdGlvbjsKKwluLT5ucisrOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBncm93X2RlY29yYXRpb24oc3RydWN0IGRlY29yYXRpb24gKm4pCit7CisJaW50IGk7CisJaW50IG9sZF9zaXplID0gbi0+c2l6ZTsKKwlzdHJ1Y3Qgb2JqZWN0X2RlY29yYXRpb24gKm9sZF9oYXNoOworCisJb2xkX3NpemUgPSBuLT5zaXplOworCW9sZF9oYXNoID0gbi0+aGFzaDsKKworCW4tPnNpemUgPSAob2xkX3NpemUgKyAxMDAwKSAqIDMgLyAyOworCW4tPmhhc2ggPSB4Y2FsbG9jKG4tPnNpemUsIHNpemVvZihzdHJ1Y3Qgb2JqZWN0X2RlY29yYXRpb24pKTsKKwluLT5uciA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgb2xkX3NpemU7IGkrKykgeworCQlzdHJ1Y3Qgb2JqZWN0ICpiYXNlID0gb2xkX2hhc2hbaV0uYmFzZTsKKwkJdm9pZCAqZGVjb3JhdGlvbiA9IG9sZF9oYXNoW2ldLmRlY29yYXRpb247CisKKwkJaWYgKCFiYXNlKQorCQkJY29udGludWU7CisJCWluc2VydF9kZWNvcmF0aW9uKG4sIGJhc2UsIGRlY29yYXRpb24pOworCX0KKwlmcmVlKG9sZF9oYXNoKTsKK30KKworLyogQWRkIGEgZGVjb3JhdGlvbiBwb2ludGVyLCByZXR1cm4gYW55IG9sZCBvbmUgKi8KK3ZvaWQgKmFkZF9kZWNvcmF0aW9uKHN0cnVjdCBkZWNvcmF0aW9uICpuLCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHZvaWQgKmRlY29yYXRpb24pCit7CisJaW50IG5yID0gbi0+bnIgKyAxOworCisJaWYgKG5yID4gbi0+c2l6ZSAqIDIgLyAzKQorCQlncm93X2RlY29yYXRpb24obik7CisJcmV0dXJuIGluc2VydF9kZWNvcmF0aW9uKG4sIG9iaiwgZGVjb3JhdGlvbik7Cit9CisKKy8qIExvb2t1cCBhIGRlY29yYXRpb24gcG9pbnRlciAqLwordm9pZCAqbG9va3VwX2RlY29yYXRpb24oc3RydWN0IGRlY29yYXRpb24gKm4sIHN0cnVjdCBvYmplY3QgKm9iaikKK3sKKwlpbnQgajsKKworCS8qIG5vdGhpbmcgdG8gbG9va3VwICovCisJaWYgKCFuLT5zaXplKQorCQlyZXR1cm4gTlVMTDsKKwlqID0gaGFzaF9vYmoob2JqLCBuLT5zaXplKTsKKwlmb3IgKDs7KSB7CisJCXN0cnVjdCBvYmplY3RfZGVjb3JhdGlvbiAqcmVmID0gbi0+aGFzaCArIGo7CisJCWlmIChyZWYtPmJhc2UgPT0gb2JqKQorCQkJcmV0dXJuIHJlZi0+ZGVjb3JhdGlvbjsKKwkJaWYgKCFyZWYtPmJhc2UpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKCsraiA9PSBuLT5zaXplKQorCQkJaiA9IDA7CisJfQorfQpkaWZmIC0tZ2l0IGEvZGVjb3JhdGUuaCBiL2RlY29yYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhNGFkOQotLS0gL2Rldi9udWxsCisrKyBiL2RlY29yYXRlLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBERUNPUkFURV9ICisjZGVmaW5lIERFQ09SQVRFX0gKKworc3RydWN0IG9iamVjdF9kZWNvcmF0aW9uIHsKKwlzdHJ1Y3Qgb2JqZWN0ICpiYXNlOworCXZvaWQgKmRlY29yYXRpb247Cit9OworCitzdHJ1Y3QgZGVjb3JhdGlvbiB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBpbnQgc2l6ZSwgbnI7CisJc3RydWN0IG9iamVjdF9kZWNvcmF0aW9uICpoYXNoOworfTsKKworZXh0ZXJuIHZvaWQgKmFkZF9kZWNvcmF0aW9uKHN0cnVjdCBkZWNvcmF0aW9uICpuLCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHZvaWQgKmRlY29yYXRpb24pOworZXh0ZXJuIHZvaWQgKmxvb2t1cF9kZWNvcmF0aW9uKHN0cnVjdCBkZWNvcmF0aW9uICpuLCBzdHJ1Y3Qgb2JqZWN0ICpvYmopOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RlbHRhLmggYi9kZWx0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwY2NmNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kZWx0YS5oCkBAIC0wLDAgKzEsMTA1IEBACisjaWZuZGVmIERFTFRBX0gKKyNkZWZpbmUgREVMVEFfSAorCisvKiBvcGFxdWUgb2JqZWN0IGZvciBkZWx0YSBpbmRleCAqLworc3RydWN0IGRlbHRhX2luZGV4OworCisvKgorICogY3JlYXRlX2RlbHRhX2luZGV4OiBjb21wdXRlIGluZGV4IGRhdGEgZnJvbSBnaXZlbiBidWZmZXIKKyAqCisgKiBUaGlzIHJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RydWN0IGRlbHRhX2luZGV4IHRoYXQgc2hvdWxkIGJlIHBhc3NlZCB0bworICogc3Vic2VxdWVudCBjcmVhdGVfZGVsdGEoKSBjYWxscywgb3IgdG8gZnJlZV9kZWx0YV9pbmRleCgpLiAgQSBOVUxMIHBvaW50ZXIKKyAqIGlzIHJldHVybmVkIG9uIGZhaWx1cmUuICBUaGUgZ2l2ZW4gYnVmZmVyIG11c3Qgbm90IGJlIGZyZWVkIG5vciBhbHRlcmVkCisgKiBiZWZvcmUgZnJlZV9kZWx0YV9pbmRleCgpIGlzIGNhbGxlZC4gIFRoZSByZXR1cm5lZCBwb2ludGVyIG11c3QgYmUgZnJlZWQKKyAqIHVzaW5nIGZyZWVfZGVsdGFfaW5kZXgoKS4KKyAqLworZXh0ZXJuIHN0cnVjdCBkZWx0YV9pbmRleCAqCitjcmVhdGVfZGVsdGFfaW5kZXgoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGJ1ZnNpemUpOworCisvKgorICogZnJlZV9kZWx0YV9pbmRleDogZnJlZSB0aGUgaW5kZXggY3JlYXRlZCBieSBjcmVhdGVfZGVsdGFfaW5kZXgoKQorICoKKyAqIEdpdmVuIHBvaW50ZXIgbXVzdCBiZSB3aGF0IGNyZWF0ZV9kZWx0YV9pbmRleCgpIHJldHVybmVkLCBvciBOVUxMLgorICovCitleHRlcm4gdm9pZCBmcmVlX2RlbHRhX2luZGV4KHN0cnVjdCBkZWx0YV9pbmRleCAqaW5kZXgpOworCisvKgorICogc2l6ZW9mX2RlbHRhX2luZGV4OiByZXR1cm5zIG1lbW9yeSB1c2FnZSBvZiBkZWx0YSBpbmRleAorICoKKyAqIEdpdmVuIHBvaW50ZXIgbXVzdCBiZSB3aGF0IGNyZWF0ZV9kZWx0YV9pbmRleCgpIHJldHVybmVkLCBvciBOVUxMLgorICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBzaXplb2ZfZGVsdGFfaW5kZXgoc3RydWN0IGRlbHRhX2luZGV4ICppbmRleCk7CisKKy8qCisgKiBjcmVhdGVfZGVsdGE6IGNyZWF0ZSBhIGRlbHRhIGZyb20gZ2l2ZW4gaW5kZXggZm9yIHRoZSBnaXZlbiBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgYnVmZmVycyB1c2luZworICogdGhlIHNhbWUgZGVsdGFfaW5kZXggcG9pbnRlci4gIElmIG1heF9kZWx0YV9zaXplIGlzIG5vbi16ZXJvIGFuZCB0aGUKKyAqIHJlc3VsdGluZyBkZWx0YSBpcyB0byBiZSBsYXJnZXIgdGhhbiBtYXhfZGVsdGFfc2l6ZSB0aGVuIE5VTEwgaXMgcmV0dXJuZWQuCisgKiBPbiBzdWNjZXNzLCBhIG5vbi1OVUxMIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB3aXRoIHRoZSBkZWx0YSBkYXRhIGlzCisgKiByZXR1cm5lZCBhbmQgKmRlbHRhX3NpemUgaXMgdXBkYXRlZCB3aXRoIGl0cyBzaXplLiAgVGhlIHJldHVybmVkIGJ1ZmZlcgorICogbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICovCitleHRlcm4gdm9pZCAqCitjcmVhdGVfZGVsdGEoY29uc3Qgc3RydWN0IGRlbHRhX2luZGV4ICppbmRleCwKKwkgICAgIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBidWZzaXplLAorCSAgICAgdW5zaWduZWQgbG9uZyAqZGVsdGFfc2l6ZSwgdW5zaWduZWQgbG9uZyBtYXhfZGVsdGFfc2l6ZSk7CisKKy8qCisgKiBkaWZmX2RlbHRhOiBjcmVhdGUgYSBkZWx0YSBmcm9tIHNvdXJjZSBidWZmZXIgdG8gdGFyZ2V0IGJ1ZmZlcgorICoKKyAqIElmIG1heF9kZWx0YV9zaXplIGlzIG5vbi16ZXJvIGFuZCB0aGUgcmVzdWx0aW5nIGRlbHRhIGlzIHRvIGJlIGxhcmdlcgorICogdGhhbiBtYXhfZGVsdGFfc2l6ZSB0aGVuIE5VTEwgaXMgcmV0dXJuZWQuICBPbiBzdWNjZXNzLCBhIG5vbi1OVUxMCisgKiBwb2ludGVyIHRvIHRoZSBidWZmZXIgd2l0aCB0aGUgZGVsdGEgZGF0YSBpcyByZXR1cm5lZCBhbmQgKmRlbHRhX3NpemUgaXMKKyAqIHVwZGF0ZWQgd2l0aCBpdHMgc2l6ZS4gIFRoZSByZXR1cm5lZCBidWZmZXIgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKgorZGlmZl9kZWx0YShjb25zdCB2b2lkICpzcmNfYnVmLCB1bnNpZ25lZCBsb25nIHNyY19idWZzaXplLAorCSAgIGNvbnN0IHZvaWQgKnRyZ19idWYsIHVuc2lnbmVkIGxvbmcgdHJnX2J1ZnNpemUsCisJICAgdW5zaWduZWQgbG9uZyAqZGVsdGFfc2l6ZSwgdW5zaWduZWQgbG9uZyBtYXhfZGVsdGFfc2l6ZSkKK3sKKwlzdHJ1Y3QgZGVsdGFfaW5kZXggKmluZGV4ID0gY3JlYXRlX2RlbHRhX2luZGV4KHNyY19idWYsIHNyY19idWZzaXplKTsKKwlpZiAoaW5kZXgpIHsKKwkJdm9pZCAqZGVsdGEgPSBjcmVhdGVfZGVsdGEoaW5kZXgsIHRyZ19idWYsIHRyZ19idWZzaXplLAorCQkJCQkgICBkZWx0YV9zaXplLCBtYXhfZGVsdGFfc2l6ZSk7CisJCWZyZWVfZGVsdGFfaW5kZXgoaW5kZXgpOworCQlyZXR1cm4gZGVsdGE7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogcGF0Y2hfZGVsdGE6IHJlY3JlYXRlIHRhcmdldCBidWZmZXIgZ2l2ZW4gc291cmNlIGJ1ZmZlciBhbmQgZGVsdGEgZGF0YQorICoKKyAqIE9uIHN1Y2Nlc3MsIGEgbm9uLU5VTEwgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGJ1ZmZlciBpcyByZXR1cm5lZCBhbmQKKyAqICp0cmdfYnVmc2l6ZSBpcyB1cGRhdGVkIHdpdGggaXRzIHNpemUuICBPbiBmYWlsdXJlIGEgTlVMTCBwb2ludGVyIGlzCisgKiByZXR1cm5lZC4gIFRoZSByZXR1cm5lZCBidWZmZXIgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICovCitleHRlcm4gdm9pZCAqcGF0Y2hfZGVsdGEoY29uc3Qgdm9pZCAqc3JjX2J1ZiwgdW5zaWduZWQgbG9uZyBzcmNfc2l6ZSwKKwkJCSBjb25zdCB2b2lkICpkZWx0YV9idWYsIHVuc2lnbmVkIGxvbmcgZGVsdGFfc2l6ZSwKKwkJCSB1bnNpZ25lZCBsb25nICpkc3Rfc2l6ZSk7CisKKy8qIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBkZWx0YSBzaXplIGlzIDQgYnl0ZXMgKi8KKyNkZWZpbmUgREVMVEFfU0laRV9NSU4JNAorCisvKgorICogVGhpcyBtdXN0IGJlIGNhbGxlZCB0d2ljZSBvbiB0aGUgZGVsdGEgZGF0YSBidWZmZXIsIGZpcnN0IHRvIGdldCB0aGUKKyAqIGV4cGVjdGVkIHNvdXJjZSBidWZmZXIgc2l6ZSwgYW5kIGFnYWluIHRvIGdldCB0aGUgdGFyZ2V0IGJ1ZmZlciBzaXplLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2RlbHRhX2hkcl9zaXplKGNvbnN0IHVuc2lnbmVkIGNoYXIgKipkYXRhcCwKKwkJCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRvcCkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhID0gKmRhdGFwOworCXVuc2lnbmVkIGNoYXIgY21kOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IDA7CisJaW50IGkgPSAwOworCWRvIHsKKwkJY21kID0gKmRhdGErKzsKKwkJc2l6ZSB8PSAoY21kICYgfjB4ODApIDw8IGk7CisJCWkgKz0gNzsKKwl9IHdoaWxlIChjbWQgJiAweDgwICYmIGRhdGEgPCB0b3ApOworCSpkYXRhcCA9IGRhdGE7CisJcmV0dXJuIHNpemU7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGlmZi1kZWx0YS5jIGIvZGlmZi1kZWx0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZTI4ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kaWZmLWRlbHRhLmMKQEAgLTAsMCArMSw0ODIgQEAKKy8qCisgKiBkaWZmLWRlbHRhLmM6IGdlbmVyYXRlIGEgZGVsdGEgYmV0d2VlbiB0d28gYnVmZmVycworICoKKyAqIFRoaXMgY29kZSB3YXMgZ3JlYXRseSBpbnNwaXJlZCBieSBwYXJ0cyBvZiBMaWJYRGlmZiBmcm9tIERhdmlkZSBMaWJlbnppCisgKiBodHRwOi8vd3d3LnhtYWlsc2VydmVyLm9yZy94ZGlmZi1saWIuaHRtbAorICoKKyAqIFJld3JpdHRlbiBmb3IgR0lUIGJ5IE5pY29sYXMgUGl0cmUgPG5pY29AY2FtLm9yZz4sIChDKSAyMDA1LTIwMDcKKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlICJnaXQtY29tcGF0LXV0aWwuaCIKKyNpbmNsdWRlICJkZWx0YS5oIgorCisvKiBtYXhpbXVtIGhhc2ggZW50cnkgbGlzdCBmb3IgdGhlIHNhbWUgaGFzaCBidWNrZXQgKi8KKyNkZWZpbmUgSEFTSF9MSU1JVCA2NAorCisjZGVmaW5lIFJBQklOX1NISUZUIDIzCisjZGVmaW5lIFJBQklOX1dJTkRPVyAxNgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IFRbMjU2XSA9IHsKKwkweDAwMDAwMDAwLCAweGFiNTliNGQxLCAweDU2YjM2OWEyLCAweGZkZWFkZDczLCAweDA2M2Y2Nzk1LCAweGFkNjZkMzQ0LAorCTB4NTA4YzBlMzcsIDB4ZmJkNWJhZTYsIDB4MGM3ZWNmMmEsIDB4YTcyNzdiZmIsIDB4NWFjZGE2ODgsIDB4ZjE5NDEyNTksCisJMHgwYTQxYThiZiwgMHhhMTE4MWM2ZSwgMHg1Y2YyYzExZCwgMHhmN2FiNzVjYywgMHgxOGZkOWU1NCwgMHhiM2E0MmE4NSwKKwkweDRlNGVmN2Y2LCAweGU1MTc0MzI3LCAweDFlYzJmOWMxLCAweGI1OWI0ZDEwLCAweDQ4NzE5MDYzLCAweGUzMjgyNGIyLAorCTB4MTQ4MzUxN2UsIDB4YmZkYWU1YWYsIDB4NDIzMDM4ZGMsIDB4ZTk2OThjMGQsIDB4MTJiYzM2ZWIsIDB4YjllNTgyM2EsCisJMHg0NDBmNWY0OSwgMHhlZjU2ZWI5OCwgMHgzMWZiM2NhOCwgMHg5YWEyODg3OSwgMHg2NzQ4NTUwYSwgMHhjYzExZTFkYiwKKwkweDM3YzQ1YjNkLCAweDljOWRlZmVjLCAweDYxNzczMjlmLCAweGNhMmU4NjRlLCAweDNkODVmMzgyLCAweDk2ZGM0NzUzLAorCTB4NmIzNjlhMjAsIDB4YzA2ZjJlZjEsIDB4M2JiYTk0MTcsIDB4OTBlMzIwYzYsIDB4NmQwOWZkYjUsIDB4YzY1MDQ5NjQsCisJMHgyOTA2YTJmYywgMHg4MjVmMTYyZCwgMHg3ZmI1Y2I1ZSwgMHhkNGVjN2Y4ZiwgMHgyZjM5YzU2OSwgMHg4NDYwNzFiOCwKKwkweDc5OGFhY2NiLCAweGQyZDMxODFhLCAweDI1Nzg2ZGQ2LCAweDhlMjFkOTA3LCAweDczY2IwNDc0LCAweGQ4OTJiMGE1LAorCTB4MjM0NzBhNDMsIDB4ODgxZWJlOTIsIDB4NzVmNDYzZTEsIDB4ZGVhZGQ3MzAsIDB4NjNmNjc5NTAsIDB4YzhhZmNkODEsCisJMHgzNTQ1MTBmMiwgMHg5ZTFjYTQyMywgMHg2NWM5MWVjNSwgMHhjZTkwYWExNCwgMHgzMzdhNzc2NywgMHg5ODIzYzNiNiwKKwkweDZmODhiNjdhLCAweGM0ZDEwMmFiLCAweDM5M2JkZmQ4LCAweDkyNjI2YjA5LCAweDY5YjdkMWVmLCAweGMyZWU2NTNlLAorCTB4M2YwNGI4NGQsIDB4OTQ1ZDBjOWMsIDB4N2IwYmU3MDQsIDB4ZDA1MjUzZDUsIDB4MmRiODhlYTYsIDB4ODZlMTNhNzcsCisJMHg3ZDM0ODA5MSwgMHhkNjZkMzQ0MCwgMHgyYjg3ZTkzMywgMHg4MGRlNWRlMiwgMHg3Nzc1MjgyZSwgMHhkYzJjOWNmZiwKKwkweDIxYzY0MThjLCAweDhhOWZmNTVkLCAweDcxNGE0ZmJiLCAweGRhMTNmYjZhLCAweDI3ZjkyNjE5LCAweDhjYTA5MmM4LAorCTB4NTIwZDQ1ZjgsIDB4Zjk1NGYxMjksIDB4MDRiZTJjNWEsIDB4YWZlNzk4OGIsIDB4NTQzMjIyNmQsIDB4ZmY2Yjk2YmMsCisJMHgwMjgxNGJjZiwgMHhhOWQ4ZmYxZSwgMHg1ZTczOGFkMiwgMHhmNTJhM2UwMywgMHgwOGMwZTM3MCwgMHhhMzk5NTdhMSwKKwkweDU4NGNlZDQ3LCAweGYzMTU1OTk2LCAweDBlZmY4NGU1LCAweGE1YTYzMDM0LCAweDRhZjBkYmFjLCAweGUxYTk2ZjdkLAorCTB4MWM0M2IyMGUsIDB4YjcxYTA2ZGYsIDB4NGNjZmJjMzksIDB4ZTc5NjA4ZTgsIDB4MWE3Y2Q1OWIsIDB4YjEyNTYxNGEsCisJMHg0NjhlMTQ4NiwgMHhlZGQ3YTA1NywgMHgxMDNkN2QyNCwgMHhiYjY0YzlmNSwgMHg0MGIxNzMxMywgMHhlYmU4YzdjMiwKKwkweDE2MDIxYWIxLCAweGJkNWJhZTYwLCAweDZjYjU0NjcxLCAweGM3ZWNmMmEwLCAweDNhMDYyZmQzLCAweDkxNWY5YjAyLAorCTB4NmE4YTIxZTQsIDB4YzFkMzk1MzUsIDB4M2MzOTQ4NDYsIDB4OTc2MGZjOTcsIDB4NjBjYjg5NWIsIDB4Y2I5MjNkOGEsCisJMHgzNjc4ZTBmOSwgMHg5ZDIxNTQyOCwgMHg2NmY0ZWVjZSwgMHhjZGFkNWExZiwgMHgzMDQ3ODc2YywgMHg5YjFlMzNiZCwKKwkweDc0NDhkODI1LCAweGRmMTE2Y2Y0LCAweDIyZmJiMTg3LCAweDg5YTIwNTU2LCAweDcyNzdiZmIwLCAweGQ5MmUwYjYxLAorCTB4MjRjNGQ2MTIsIDB4OGY5ZDYyYzMsIDB4NzgzNjE3MGYsIDB4ZDM2ZmEzZGUsIDB4MmU4NTdlYWQsIDB4ODVkY2NhN2MsCisJMHg3ZTA5NzA5YSwgMHhkNTUwYzQ0YiwgMHgyOGJhMTkzOCwgMHg4M2UzYWRlOSwgMHg1ZDRlN2FkOSwgMHhmNjE3Y2UwOCwKKwkweDBiZmQxMzdiLCAweGEwYTRhN2FhLCAweDViNzExZDRjLCAweGYwMjhhOTlkLCAweDBkYzI3NGVlLCAweGE2OWJjMDNmLAorCTB4NTEzMGI1ZjMsIDB4ZmE2OTAxMjIsIDB4MDc4M2RjNTEsIDB4YWNkYTY4ODAsIDB4NTcwZmQyNjYsIDB4ZmM1NjY2YjcsCisJMHgwMWJjYmJjNCwgMHhhYWU1MGYxNSwgMHg0NWIzZTQ4ZCwgMHhlZWVhNTA1YywgMHgxMzAwOGQyZiwgMHhiODU5MzlmZSwKKwkweDQzOGM4MzE4LCAweGU4ZDUzN2M5LCAweDE1M2ZlYWJhLCAweGJlNjY1ZTZiLCAweDQ5Y2QyYmE3LCAweGUyOTQ5Zjc2LAorCTB4MWY3ZTQyMDUsIDB4YjQyN2Y2ZDQsIDB4NGZmMjRjMzIsIDB4ZTRhYmY4ZTMsIDB4MTk0MTI1OTAsIDB4YjIxODkxNDEsCisJMHgwZjQzM2YyMSwgMHhhNDFhOGJmMCwgMHg1OWYwNTY4MywgMHhmMmE5ZTI1MiwgMHgwOTdjNThiNCwgMHhhMjI1ZWM2NSwKKwkweDVmY2YzMTE2LCAweGY0OTY4NWM3LCAweDAzM2RmMDBiLCAweGE4NjQ0NGRhLCAweDU1OGU5OWE5LCAweGZlZDcyZDc4LAorCTB4MDUwMjk3OWUsIDB4YWU1YjIzNGYsIDB4NTNiMWZlM2MsIDB4ZjhlODRhZWQsIDB4MTdiZWExNzUsIDB4YmNlNzE1YTQsCisJMHg0MTBkYzhkNywgMHhlYTU0N2MwNiwgMHgxMTgxYzZlMCwgMHhiYWQ4NzIzMSwgMHg0NzMyYWY0MiwgMHhlYzZiMWI5MywKKwkweDFiYzA2ZTVmLCAweGIwOTlkYThlLCAweDRkNzMwN2ZkLCAweGU2MmFiMzJjLCAweDFkZmYwOWNhLCAweGI2YTZiZDFiLAorCTB4NGI0YzYwNjgsIDB4ZTAxNWQ0YjksIDB4M2ViODAzODksIDB4OTVlMWI3NTgsIDB4NjgwYjZhMmIsIDB4YzM1MmRlZmEsCisJMHgzODg3NjQxYywgMHg5M2RlZDBjZCwgMHg2ZTM0MGRiZSwgMHhjNTZkYjk2ZiwgMHgzMmM2Y2NhMywgMHg5OTlmNzg3MiwKKwkweDY0NzVhNTAxLCAweGNmMmMxMWQwLCAweDM0ZjlhYjM2LCAweDlmYTAxZmU3LCAweDYyNGFjMjk0LCAweGM5MTM3NjQ1LAorCTB4MjY0NTlkZGQsIDB4OGQxYzI5MGMsIDB4NzBmNmY0N2YsIDB4ZGJhZjQwYWUsIDB4MjA3YWZhNDgsIDB4OGIyMzRlOTksCisJMHg3NmM5OTNlYSwgMHhkZDkwMjczYiwgMHgyYTNiNTJmNywgMHg4MTYyZTYyNiwgMHg3Yzg4M2I1NSwgMHhkN2QxOGY4NCwKKwkweDJjMDQzNTYyLCAweDg3NWQ4MWIzLCAweDdhYjc1Y2MwLCAweGQxZWVlODExCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IFVbMjU2XSA9IHsKKwkweDAwMDAwMDAwLCAweDdlYjUyMDBkLCAweDU2MzNmNGNiLCAweDI4ODZkNGM2LCAweDA3M2U1ZDQ3LCAweDc5OGI3ZDRhLAorCTB4NTEwZGE5OGMsIDB4MmZiODg5ODEsIDB4MGU3Y2JhOGUsIDB4NzBjOTlhODMsIDB4NTg0ZjRlNDUsIDB4MjZmYTZlNDgsCisJMHgwOTQyZTdjOSwgMHg3N2Y3YzdjNCwgMHg1ZjcxMTMwMiwgMHgyMWM0MzMwZiwgMHgxY2Y5NzUxYywgMHg2MjRjNTUxMSwKKwkweDRhY2E4MWQ3LCAweDM0N2ZhMWRhLCAweDFiYzcyODViLCAweDY1NzIwODU2LCAweDRkZjRkYzkwLCAweDMzNDFmYzlkLAorCTB4MTI4NWNmOTIsIDB4NmMzMGVmOWYsIDB4NDRiNjNiNTksIDB4M2EwMzFiNTQsIDB4MTViYjkyZDUsIDB4NmIwZWIyZDgsCisJMHg0Mzg4NjYxZSwgMHgzZDNkNDYxMywgMHgzOWYyZWEzOCwgMHg0NzQ3Y2EzNSwgMHg2ZmMxMWVmMywgMHgxMTc0M2VmZSwKKwkweDNlY2NiNzdmLCAweDQwNzk5NzcyLCAweDY4ZmY0M2I0LCAweDE2NGE2M2I5LCAweDM3OGU1MGI2LCAweDQ5M2I3MGJiLAorCTB4NjFiZGE0N2QsIDB4MWYwODg0NzAsIDB4MzBiMDBkZjEsIDB4NGUwNTJkZmMsIDB4NjY4M2Y5M2EsIDB4MTgzNmQ5MzcsCisJMHgyNTBiOWYyNCwgMHg1YmJlYmYyOSwgMHg3MzM4NmJlZiwgMHgwZDhkNGJlMiwgMHgyMjM1YzI2MywgMHg1YzgwZTI2ZSwKKwkweDc0MDYzNmE4LCAweDBhYjMxNmE1LCAweDJiNzcyNWFhLCAweDU1YzIwNWE3LCAweDdkNDRkMTYxLCAweDAzZjFmMTZjLAorCTB4MmM0OTc4ZWQsIDB4NTJmYzU4ZTAsIDB4N2E3YThjMjYsIDB4MDRjZmFjMmIsIDB4NzNlNWQ0NzAsIDB4MGQ1MGY0N2QsCisJMHgyNWQ2MjBiYiwgMHg1YjYzMDBiNiwgMHg3NGRiODkzNywgMHgwYTZlYTkzYSwgMHgyMmU4N2RmYywgMHg1YzVkNWRmMSwKKwkweDdkOTk2ZWZlLCAweDAzMmM0ZWYzLCAweDJiYWE5YTM1LCAweDU1MWZiYTM4LCAweDdhYTczM2I5LCAweDA0MTIxM2I0LAorCTB4MmM5NGM3NzIsIDB4NTIyMWU3N2YsIDB4NmYxY2ExNmMsIDB4MTFhOTgxNjEsIDB4MzkyZjU1YTcsIDB4NDc5YTc1YWEsCisJMHg2ODIyZmMyYiwgMHgxNjk3ZGMyNiwgMHgzZTExMDhlMCwgMHg0MGE0MjhlZCwgMHg2MTYwMWJlMiwgMHgxZmQ1M2JlZiwKKwkweDM3NTNlZjI5LCAweDQ5ZTZjZjI0LCAweDY2NWU0NmE1LCAweDE4ZWI2NmE4LCAweDMwNmRiMjZlLCAweDRlZDg5MjYzLAorCTB4NGExNzNlNDgsIDB4MzRhMjFlNDUsIDB4MWMyNGNhODMsIDB4NjI5MWVhOGUsIDB4NGQyOTYzMGYsIDB4MzM5YzQzMDIsCisJMHgxYjFhOTdjNCwgMHg2NWFmYjdjOSwgMHg0NDZiODRjNiwgMHgzYWRlYTRjYiwgMHgxMjU4NzAwZCwgMHg2Y2VkNTAwMCwKKwkweDQzNTVkOTgxLCAweDNkZTBmOThjLCAweDE1NjYyZDRhLCAweDZiZDMwZDQ3LCAweDU2ZWU0YjU0LCAweDI4NWI2YjU5LAorCTB4MDBkZGJmOWYsIDB4N2U2ODlmOTIsIDB4NTFkMDE2MTMsIDB4MmY2NTM2MWUsIDB4MDdlM2UyZDgsIDB4Nzk1NmMyZDUsCisJMHg1ODkyZjFkYSwgMHgyNjI3ZDFkNywgMHgwZWExMDUxMSwgMHg3MDE0MjUxYywgMHg1ZmFjYWM5ZCwgMHgyMTE5OGM5MCwKKwkweDA5OWY1ODU2LCAweDc3MmE3ODViLCAweDRjOTIxYzMxLCAweDMyMjczYzNjLCAweDFhYTFlOGZhLCAweDY0MTRjOGY3LAorCTB4NGJhYzQxNzYsIDB4MzUxOTYxN2IsIDB4MWQ5ZmI1YmQsIDB4NjMyYTk1YjAsIDB4NDJlZWE2YmYsIDB4M2M1Yjg2YjIsCisJMHgxNGRkNTI3NCwgMHg2YTY4NzI3OSwgMHg0NWQwZmJmOCwgMHgzYjY1ZGJmNSwgMHgxM2UzMGYzMywgMHg2ZDU2MmYzZSwKKwkweDUwNmI2OTJkLCAweDJlZGU0OTIwLCAweDA2NTg5ZGU2LCAweDc4ZWRiZGViLCAweDU3NTUzNDZhLCAweDI5ZTAxNDY3LAorCTB4MDE2NmMwYTEsIDB4N2ZkM2UwYWMsIDB4NWUxN2QzYTMsIDB4MjBhMmYzYWUsIDB4MDgyNDI3NjgsIDB4NzY5MTA3NjUsCisJMHg1OTI5OGVlNCwgMHgyNzljYWVlOSwgMHgwZjFhN2EyZiwgMHg3MWFmNWEyMiwgMHg3NTYwZjYwOSwgMHgwYmQ1ZDYwNCwKKwkweDIzNTMwMmMyLCAweDVkZTYyMmNmLCAweDcyNWVhYjRlLCAweDBjZWI4YjQzLCAweDI0NmQ1Zjg1LCAweDVhZDg3Zjg4LAorCTB4N2IxYzRjODcsIDB4MDVhOTZjOGEsIDB4MmQyZmI4NGMsIDB4NTM5YTk4NDEsIDB4N2MyMjExYzAsIDB4MDI5NzMxY2QsCisJMHgyYTExZTUwYiwgMHg1NGE0YzUwNiwgMHg2OTk5ODMxNSwgMHgxNzJjYTMxOCwgMHgzZmFhNzdkZSwgMHg0MTFmNTdkMywKKwkweDZlYTdkZTUyLCAweDEwMTJmZTVmLCAweDM4OTQyYTk5LCAweDQ2MjEwYTk0LCAweDY3ZTUzOTliLCAweDE5NTAxOTk2LAorCTB4MzFkNmNkNTAsIDB4NGY2M2VkNWQsIDB4NjBkYjY0ZGMsIDB4MWU2ZTQ0ZDEsIDB4MzZlODkwMTcsIDB4NDg1ZGIwMWEsCisJMHgzZjc3Yzg0MSwgMHg0MWMyZTg0YywgMHg2OTQ0M2M4YSwgMHgxN2YxMWM4NywgMHgzODQ5OTUwNiwgMHg0NmZjYjUwYiwKKwkweDZlN2E2MWNkLCAweDEwY2Y0MWMwLCAweDMxMGI3MmNmLCAweDRmYmU1MmMyLCAweDY3Mzg4NjA0LCAweDE5OGRhNjA5LAorCTB4MzYzNTJmODgsIDB4NDg4MDBmODUsIDB4NjAwNmRiNDMsIDB4MWViM2ZiNGUsIDB4MjM4ZWJkNWQsIDB4NWQzYjlkNTAsCisJMHg3NWJkNDk5NiwgMHgwYjA4Njk5YiwgMHgyNGIwZTAxYSwgMHg1YTA1YzAxNywgMHg3MjgzMTRkMSwgMHgwYzM2MzRkYywKKwkweDJkZjIwN2QzLCAweDUzNDcyN2RlLCAweDdiYzFmMzE4LCAweDA1NzRkMzE1LCAweDJhY2M1YTk0LCAweDU0Nzk3YTk5LAorCTB4N2NmZmFlNWYsIDB4MDI0YThlNTIsIDB4MDY4NTIyNzksIDB4NzgzMDAyNzQsIDB4NTBiNmQ2YjIsIDB4MmUwM2Y2YmYsCisJMHgwMWJiN2YzZSwgMHg3ZjBlNWYzMywgMHg1Nzg4OGJmNSwgMHgyOTNkYWJmOCwgMHgwOGY5OThmNywgMHg3NjRjYjhmYSwKKwkweDVlY2E2YzNjLCAweDIwN2Y0YzMxLCAweDBmYzdjNWIwLCAweDcxNzJlNWJkLCAweDU5ZjQzMTdiLCAweDI3NDExMTc2LAorCTB4MWE3YzU3NjUsIDB4NjRjOTc3NjgsIDB4NGM0ZmEzYWUsIDB4MzJmYTgzYTMsIDB4MWQ0MjBhMjIsIDB4NjNmNzJhMmYsCisJMHg0YjcxZmVlOSwgMHgzNWM0ZGVlNCwgMHgxNDAwZWRlYiwgMHg2YWI1Y2RlNiwgMHg0MjMzMTkyMCwgMHgzYzg2MzkyZCwKKwkweDEzM2ViMGFjLCAweDZkOGI5MGExLCAweDQ1MGQ0NDY3LCAweDNiYjg2NDZhCit9OworCitzdHJ1Y3QgaW5kZXhfZW50cnkgeworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0cjsKKwl1bnNpZ25lZCBpbnQgdmFsOworfTsKKworc3RydWN0IHVucGFja2VkX2luZGV4X2VudHJ5IHsKKwlzdHJ1Y3QgaW5kZXhfZW50cnkgZW50cnk7CisJc3RydWN0IHVucGFja2VkX2luZGV4X2VudHJ5ICpuZXh0OworfTsKKworc3RydWN0IGRlbHRhX2luZGV4IHsKKwl1bnNpZ25lZCBsb25nIG1lbXNpemU7CisJY29uc3Qgdm9pZCAqc3JjX2J1ZjsKKwl1bnNpZ25lZCBsb25nIHNyY19zaXplOworCXVuc2lnbmVkIGludCBoYXNoX21hc2s7CisJc3RydWN0IGluZGV4X2VudHJ5ICpoYXNoW0ZMRVhfQVJSQVldOworfTsKKworc3RydWN0IGRlbHRhX2luZGV4ICogY3JlYXRlX2RlbHRhX2luZGV4KGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBidWZzaXplKQoreworCXVuc2lnbmVkIGludCBpLCBoc2l6ZSwgaG1hc2ssIGVudHJpZXMsIHByZXZfdmFsLCAqaGFzaF9jb3VudDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCAqYnVmZmVyID0gYnVmOworCXN0cnVjdCBkZWx0YV9pbmRleCAqaW5kZXg7CisJc3RydWN0IHVucGFja2VkX2luZGV4X2VudHJ5ICplbnRyeSwgKipoYXNoOworCXN0cnVjdCBpbmRleF9lbnRyeSAqcGFja2VkX2VudHJ5LCAqKnBhY2tlZF9oYXNoOworCXZvaWQgKm1lbTsKKwl1bnNpZ25lZCBsb25nIG1lbXNpemU7CisKKwlpZiAoIWJ1ZiB8fCAhYnVmc2l6ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBEZXRlcm1pbmUgaW5kZXggaGFzaCBzaXplLiAgTm90ZSB0aGF0IGluZGV4aW5nIHNraXBzIHRoZQorCSAgIGZpcnN0IGJ5dGUgdG8gYWxsb3cgZm9yIG9wdGltaXppbmcgdGhlIFJhYmluJ3MgcG9seW5vbWlhbAorCSAgIGluaXRpYWxpemF0aW9uIGluIGNyZWF0ZV9kZWx0YSgpLiAqLworCWVudHJpZXMgPSAoYnVmc2l6ZSAtIDEpICAvIFJBQklOX1dJTkRPVzsKKwloc2l6ZSA9IGVudHJpZXMgLyA0OworCWZvciAoaSA9IDQ7ICgxdSA8PCBpKSA8IGhzaXplICYmIGkgPCAzMTsgaSsrKTsKKwloc2l6ZSA9IDEgPDwgaTsKKwlobWFzayA9IGhzaXplIC0gMTsKKworCS8qIGFsbG9jYXRlIGxvb2t1cCBpbmRleCAqLworCW1lbXNpemUgPSBzaXplb2YoKmhhc2gpICogaHNpemUgKworCQkgIHNpemVvZigqZW50cnkpICogZW50cmllczsKKwltZW0gPSBtYWxsb2MobWVtc2l6ZSk7CisJaWYgKCFtZW0pCisJCXJldHVybiBOVUxMOworCWhhc2ggPSBtZW07CisJbWVtID0gaGFzaCArIGhzaXplOworCWVudHJ5ID0gbWVtOworCisJbWVtc2V0KGhhc2gsIDAsIGhzaXplICogc2l6ZW9mKCpoYXNoKSk7CisKKwkvKiBhbGxvY2F0ZSBhbiBhcnJheSB0byBjb3VudCBoYXNoIGVudHJpZXMgKi8KKwloYXNoX2NvdW50ID0gY2FsbG9jKGhzaXplLCBzaXplb2YoKmhhc2hfY291bnQpKTsKKwlpZiAoIWhhc2hfY291bnQpIHsKKwkJZnJlZShoYXNoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogdGhlbiBwb3B1bGF0ZSB0aGUgaW5kZXggKi8KKwlwcmV2X3ZhbCA9IH4wOworCWZvciAoZGF0YSA9IGJ1ZmZlciArIGVudHJpZXMgKiBSQUJJTl9XSU5ET1cgLSBSQUJJTl9XSU5ET1c7CisJICAgICBkYXRhID49IGJ1ZmZlcjsKKwkgICAgIGRhdGEgLT0gUkFCSU5fV0lORE9XKSB7CisJCXVuc2lnbmVkIGludCB2YWwgPSAwOworCQlmb3IgKGkgPSAxOyBpIDw9IFJBQklOX1dJTkRPVzsgaSsrKQorCQkJdmFsID0gKCh2YWwgPDwgOCkgfCBkYXRhW2ldKSBeIFRbdmFsID4+IFJBQklOX1NISUZUXTsKKwkJaWYgKHZhbCA9PSBwcmV2X3ZhbCkgeworCQkJLyoga2VlcCB0aGUgbG93ZXN0IG9mIGNvbnNlY3V0aXZlIGlkZW50aWNhbCBibG9ja3MgKi8KKwkJCWVudHJ5Wy0xXS5lbnRyeS5wdHIgPSBkYXRhICsgUkFCSU5fV0lORE9XOworCQkJLS1lbnRyaWVzOworCQl9IGVsc2UgeworCQkJcHJldl92YWwgPSB2YWw7CisJCQlpID0gdmFsICYgaG1hc2s7CisJCQllbnRyeS0+ZW50cnkucHRyID0gZGF0YSArIFJBQklOX1dJTkRPVzsKKwkJCWVudHJ5LT5lbnRyeS52YWwgPSB2YWw7CisJCQllbnRyeS0+bmV4dCA9IGhhc2hbaV07CisJCQloYXNoW2ldID0gZW50cnkrKzsKKwkJCWhhc2hfY291bnRbaV0rKzsKKwkJfQorCX0KKworCS8qCisJICogRGV0ZXJtaW5lIGEgbGltaXQgb24gdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBzYW1lIGhhc2gKKwkgKiBidWNrZXQuICBUaGlzIGd1YXJkcyB1cyBhZ2FpbnN0IHBhdGhvbG9naWNhbCBkYXRhIHNldHMgY2F1c2luZworCSAqIHJlYWxseSBiYWQgaGFzaCBkaXN0cmlidXRpb24gd2l0aCBtb3N0IGVudHJpZXMgaW4gdGhlIHNhbWUgaGFzaAorCSAqIGJ1Y2tldCB0aGF0IHdvdWxkIGJyaW5nIHVzIHRvIE8obSpuKSBjb21wdXRpbmcgY29zdHMgKG0gYW5kIG4KKwkgKiBjb3JyZXNwb25kaW5nIHRvIHJlZmVyZW5jZSBhbmQgdGFyZ2V0IGJ1ZmZlciBzaXplcykuCisJICoKKwkgKiBNYWtlIHN1cmUgbm9uZSBvZiB0aGUgaGFzaCBidWNrZXRzIGhhcyBtb3JlIGVudHJpZXMgdGhhbgorCSAqIHdlJ3JlIHdpbGxpbmcgdG8gdGVzdC4gIE90aGVyd2lzZSB3ZSBjdWxsIHRoZSBlbnRyeSBsaXN0CisJICogdW5pZm9ybWx5IHRvIHN0aWxsIHByZXNlcnZlIGEgZ29vZCByZXBhcnRpdGlvbiBhY3Jvc3MKKwkgKiB0aGUgcmVmZXJlbmNlIGJ1ZmZlci4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaHNpemU7IGkrKykgeworCQlpbnQgYWNjOworCisJCWlmIChoYXNoX2NvdW50W2ldIDw9IEhBU0hfTElNSVQpCisJCQljb250aW51ZTsKKworCQkvKiBXZSBsZWF2ZSBleGFjdGx5IEhBU0hfTElNSVQgZW50cmllcyBpbiB0aGUgYnVja2V0ICovCisJCWVudHJpZXMgLT0gaGFzaF9jb3VudFtpXSAtIEhBU0hfTElNSVQ7CisKKwkJZW50cnkgPSBoYXNoW2ldOworCQlhY2MgPSAwOworCisJCS8qCisJCSAqIEFzc3VtZSB0aGF0IHRoaXMgbG9vcCBpcyBnb25lIHRocm91Z2ggZXhhY3RseQorCQkgKiBIQVNIX0xJTUlUIHRpbWVzIGFuZCBpcyBlbnRlcmVkIGFuZCBsZWZ0IHdpdGgKKwkJICogYWNjPT0wLiAgU28gdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGUgbG9vcAorCQkgKiBjb250cmlidXRlcyAoaGFzaF9jb3VudFtpXS1IQVNIX0xJTUlUKSpIQVNIX0xJTUlUCisJCSAqIHRvIHRoZSBhY2N1bXVsYXRvciwgYW5kIHRoZSBpbm5lciBsb29wIGNvbnNlcXVlbnRseQorCQkgKiBpcyBydW4gKGhhc2hfY291bnRbaV0tSEFTSF9MSU1JVCkgdGltZXMsIHJlbW92aW5nCisJCSAqIG9uZSBlbGVtZW50IGZyb20gdGhlIGxpc3QgZWFjaCB0aW1lLiAgU2luY2UgYWNjCisJCSAqIGJhbGFuY2VzIG91dCB0byAwIGF0IHRoZSBmaW5hbCBydW4sIHRoZSBpbm5lciBsb29wCisJCSAqIGJvZHkgY2FuJ3QgYmUgbGVmdCB3aXRoIGVudHJ5PT1OVUxMLiAgU28gd2UgaW5kZWVkCisJCSAqIGVuY291bnRlciBlbnRyeT09TlVMTCBpbiB0aGUgb3V0ZXIgbG9vcCBvbmx5LgorCQkgKi8KKwkJZG8geworCQkJYWNjICs9IGhhc2hfY291bnRbaV0gLSBIQVNIX0xJTUlUOworCQkJaWYgKGFjYyA+IDApIHsKKwkJCQlzdHJ1Y3QgdW5wYWNrZWRfaW5kZXhfZW50cnkgKmtlZXAgPSBlbnRyeTsKKwkJCQlkbyB7CisJCQkJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJCQkJCWFjYyAtPSBIQVNIX0xJTUlUOworCQkJCX0gd2hpbGUgKGFjYyA+IDApOworCQkJCWtlZXAtPm5leHQgPSBlbnRyeS0+bmV4dDsKKwkJCX0KKwkJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJCX0gd2hpbGUgKGVudHJ5KTsKKwl9CisJZnJlZShoYXNoX2NvdW50KTsKKworCS8qCisJICogTm93IGNyZWF0ZSB0aGUgcGFja2VkIGluZGV4IGluIGFycmF5IGZvcm0KKwkgKiByYXRoZXIgdGhhbiBsaW5rZWQgbGlzdHMuCisJICovCisJbWVtc2l6ZSA9IHNpemVvZigqaW5kZXgpCisJCSsgc2l6ZW9mKCpwYWNrZWRfaGFzaCkgKiAoaHNpemUrMSkKKwkJKyBzaXplb2YoKnBhY2tlZF9lbnRyeSkgKiBlbnRyaWVzOworCW1lbSA9IG1hbGxvYyhtZW1zaXplKTsKKwlpZiAoIW1lbSkgeworCQlmcmVlKGhhc2gpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpbmRleCA9IG1lbTsKKwlpbmRleC0+bWVtc2l6ZSA9IG1lbXNpemU7CisJaW5kZXgtPnNyY19idWYgPSBidWY7CisJaW5kZXgtPnNyY19zaXplID0gYnVmc2l6ZTsKKwlpbmRleC0+aGFzaF9tYXNrID0gaG1hc2s7CisKKwltZW0gPSBpbmRleC0+aGFzaDsKKwlwYWNrZWRfaGFzaCA9IG1lbTsKKwltZW0gPSBwYWNrZWRfaGFzaCArIChoc2l6ZSsxKTsKKwlwYWNrZWRfZW50cnkgPSBtZW07CisKKwlmb3IgKGkgPSAwOyBpIDwgaHNpemU7IGkrKykgeworCQkvKgorCQkgKiBDb2FsZXNjZSBhbGwgZW50cmllcyBiZWxvbmdpbmcgdG8gb25lIGxpbmtlZCBsaXN0CisJCSAqIGludG8gY29uc2VjdXRpdmUgYXJyYXkgZW50cmllcy4KKwkJICovCisJCXBhY2tlZF9oYXNoW2ldID0gcGFja2VkX2VudHJ5OworCQlmb3IgKGVudHJ5ID0gaGFzaFtpXTsgZW50cnk7IGVudHJ5ID0gZW50cnktPm5leHQpCisJCQkqcGFja2VkX2VudHJ5KysgPSBlbnRyeS0+ZW50cnk7CisJfQorCisJLyogU2VudGluZWwgdmFsdWUgdG8gaW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgbGFzdCBoYXNoIGJ1Y2tldCAqLworCXBhY2tlZF9oYXNoW2hzaXplXSA9IHBhY2tlZF9lbnRyeTsKKworCWFzc2VydChwYWNrZWRfZW50cnkgLSAoc3RydWN0IGluZGV4X2VudHJ5ICopbWVtID09IGVudHJpZXMpOworCWZyZWUoaGFzaCk7CisKKwlyZXR1cm4gaW5kZXg7Cit9CisKK3ZvaWQgZnJlZV9kZWx0YV9pbmRleChzdHJ1Y3QgZGVsdGFfaW5kZXggKmluZGV4KQoreworCWZyZWUoaW5kZXgpOworfQorCit1bnNpZ25lZCBsb25nIHNpemVvZl9kZWx0YV9pbmRleChzdHJ1Y3QgZGVsdGFfaW5kZXggKmluZGV4KQoreworCWlmIChpbmRleCkKKwkJcmV0dXJuIGluZGV4LT5tZW1zaXplOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgbWF4aW11bSBzaXplIGZvciBhbnkgb3Bjb2RlIHNlcXVlbmNlLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgaGVhZGVyCisgKiBwbHVzIFJhYmluIHdpbmRvdyBwbHVzIGJpZ2dlc3QgY29weS4KKyAqLworI2RlZmluZSBNQVhfT1BfU0laRQkoNSArIDUgKyAxICsgUkFCSU5fV0lORE9XICsgNykKKwordm9pZCAqCitjcmVhdGVfZGVsdGEoY29uc3Qgc3RydWN0IGRlbHRhX2luZGV4ICppbmRleCwKKwkgICAgIGNvbnN0IHZvaWQgKnRyZ19idWYsIHVuc2lnbmVkIGxvbmcgdHJnX3NpemUsCisJICAgICB1bnNpZ25lZCBsb25nICpkZWx0YV9zaXplLCB1bnNpZ25lZCBsb25nIG1heF9zaXplKQoreworCXVuc2lnbmVkIGludCBpLCBvdXRwb3MsIG91dHNpemUsIG1vZmYsIG1zaXplLCB2YWw7CisJaW50IGluc2NudDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpyZWZfZGF0YSwgKnJlZl90b3AsICpkYXRhLCAqdG9wOworCXVuc2lnbmVkIGNoYXIgKm91dDsKKworCWlmICghdHJnX2J1ZiB8fCAhdHJnX3NpemUpCisJCXJldHVybiBOVUxMOworCisJb3V0cG9zID0gMDsKKwlvdXRzaXplID0gODE5MjsKKwlpZiAobWF4X3NpemUgJiYgb3V0c2l6ZSA+PSBtYXhfc2l6ZSkKKwkJb3V0c2l6ZSA9IG1heF9zaXplICsgTUFYX09QX1NJWkUgKyAxOworCW91dCA9IG1hbGxvYyhvdXRzaXplKTsKKwlpZiAoIW91dCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBzdG9yZSByZWZlcmVuY2UgYnVmZmVyIHNpemUgKi8KKwlpID0gaW5kZXgtPnNyY19zaXplOworCXdoaWxlIChpID49IDB4ODApIHsKKwkJb3V0W291dHBvcysrXSA9IGkgfCAweDgwOworCQlpID4+PSA3OworCX0KKwlvdXRbb3V0cG9zKytdID0gaTsKKworCS8qIHN0b3JlIHRhcmdldCBidWZmZXIgc2l6ZSAqLworCWkgPSB0cmdfc2l6ZTsKKwl3aGlsZSAoaSA+PSAweDgwKSB7CisJCW91dFtvdXRwb3MrK10gPSBpIHwgMHg4MDsKKwkJaSA+Pj0gNzsKKwl9CisJb3V0W291dHBvcysrXSA9IGk7CisKKwlyZWZfZGF0YSA9IGluZGV4LT5zcmNfYnVmOworCXJlZl90b3AgPSByZWZfZGF0YSArIGluZGV4LT5zcmNfc2l6ZTsKKwlkYXRhID0gdHJnX2J1ZjsKKwl0b3AgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSB0cmdfYnVmICsgdHJnX3NpemU7CisKKwlvdXRwb3MrKzsKKwl2YWwgPSAwOworCWZvciAoaSA9IDA7IGkgPCBSQUJJTl9XSU5ET1cgJiYgZGF0YSA8IHRvcDsgaSsrLCBkYXRhKyspIHsKKwkJb3V0W291dHBvcysrXSA9ICpkYXRhOworCQl2YWwgPSAoKHZhbCA8PCA4KSB8ICpkYXRhKSBeIFRbdmFsID4+IFJBQklOX1NISUZUXTsKKwl9CisJaW5zY250ID0gaTsKKworCW1vZmYgPSAwOworCW1zaXplID0gMDsKKwl3aGlsZSAoZGF0YSA8IHRvcCkgeworCQlpZiAobXNpemUgPCA0MDk2KSB7CisJCQlzdHJ1Y3QgaW5kZXhfZW50cnkgKmVudHJ5OworCQkJdmFsIF49IFVbZGF0YVstUkFCSU5fV0lORE9XXV07CisJCQl2YWwgPSAoKHZhbCA8PCA4KSB8ICpkYXRhKSBeIFRbdmFsID4+IFJBQklOX1NISUZUXTsKKwkJCWkgPSB2YWwgJiBpbmRleC0+aGFzaF9tYXNrOworCQkJZm9yIChlbnRyeSA9IGluZGV4LT5oYXNoW2ldOyBlbnRyeSA8IGluZGV4LT5oYXNoW2krMV07IGVudHJ5KyspIHsKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpyZWYgPSBlbnRyeS0+cHRyOworCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYyA9IGRhdGE7CisJCQkJdW5zaWduZWQgaW50IHJlZl9zaXplID0gcmVmX3RvcCAtIHJlZjsKKwkJCQlpZiAoZW50cnktPnZhbCAhPSB2YWwpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChyZWZfc2l6ZSA+IHRvcCAtIHNyYykKKwkJCQkJcmVmX3NpemUgPSB0b3AgLSBzcmM7CisJCQkJaWYgKHJlZl9zaXplIDw9IG1zaXplKQorCQkJCQlicmVhazsKKwkJCQl3aGlsZSAocmVmX3NpemUtLSAmJiAqc3JjKysgPT0gKnJlZikKKwkJCQkJcmVmKys7CisJCQkJaWYgKG1zaXplIDwgcmVmIC0gZW50cnktPnB0cikgeworCQkJCQkvKiB0aGlzIGlzIG91ciBiZXN0IG1hdGNoIHNvIGZhciAqLworCQkJCQltc2l6ZSA9IHJlZiAtIGVudHJ5LT5wdHI7CisJCQkJCW1vZmYgPSBlbnRyeS0+cHRyIC0gcmVmX2RhdGE7CisJCQkJCWlmIChtc2l6ZSA+PSA0MDk2KSAvKiBnb29kIGVub3VnaCAqLworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKG1zaXplIDwgNCkgeworCQkJaWYgKCFpbnNjbnQpCisJCQkJb3V0cG9zKys7CisJCQlvdXRbb3V0cG9zKytdID0gKmRhdGErKzsKKwkJCWluc2NudCsrOworCQkJaWYgKGluc2NudCA9PSAweDdmKSB7CisJCQkJb3V0W291dHBvcyAtIGluc2NudCAtIDFdID0gaW5zY250OworCQkJCWluc2NudCA9IDA7CisJCQl9CisJCQltc2l6ZSA9IDA7CisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBpbnQgbGVmdDsKKwkJCXVuc2lnbmVkIGNoYXIgKm9wOworCisJCQlpZiAoaW5zY250KSB7CisJCQkJd2hpbGUgKG1vZmYgJiYgcmVmX2RhdGFbbW9mZi0xXSA9PSBkYXRhWy0xXSkgeworCQkJCQkvKiB3ZSBjYW4gbWF0Y2ggb25lIGJ5dGUgYmFjayAqLworCQkJCQltc2l6ZSsrOworCQkJCQltb2ZmLS07CisJCQkJCWRhdGEtLTsKKwkJCQkJb3V0cG9zLS07CisJCQkJCWlmICgtLWluc2NudCkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlvdXRwb3MtLTsgIC8qIHJlbW92ZSBjb3VudCBzbG90ICovCisJCQkJCWluc2NudC0tOyAgLyogbWFrZSBpdCAtMSAqLworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJb3V0W291dHBvcyAtIGluc2NudCAtIDFdID0gaW5zY250OworCQkJCWluc2NudCA9IDA7CisJCQl9CisKKwkJCS8qIEEgY29weSBvcCBpcyBjdXJyZW50bHkgbGltaXRlZCB0byA2NEtCIChwYWNrIHYyKSAqLworCQkJbGVmdCA9IChtc2l6ZSA8IDB4MTAwMDApID8gMCA6IChtc2l6ZSAtIDB4MTAwMDApOworCQkJbXNpemUgLT0gbGVmdDsKKworCQkJb3AgPSBvdXQgKyBvdXRwb3MrKzsKKwkJCWkgPSAweDgwOworCisJCQlpZiAobW9mZiAmIDB4MDAwMDAwZmYpCisJCQkJb3V0W291dHBvcysrXSA9IG1vZmYgPj4gMCwgIGkgfD0gMHgwMTsKKwkJCWlmIChtb2ZmICYgMHgwMDAwZmYwMCkKKwkJCQlvdXRbb3V0cG9zKytdID0gbW9mZiA+PiA4LCAgaSB8PSAweDAyOworCQkJaWYgKG1vZmYgJiAweDAwZmYwMDAwKQorCQkJCW91dFtvdXRwb3MrK10gPSBtb2ZmID4+IDE2LCBpIHw9IDB4MDQ7CisJCQlpZiAobW9mZiAmIDB4ZmYwMDAwMDApCisJCQkJb3V0W291dHBvcysrXSA9IG1vZmYgPj4gMjQsIGkgfD0gMHgwODsKKworCQkJaWYgKG1zaXplICYgMHgwMGZmKQorCQkJCW91dFtvdXRwb3MrK10gPSBtc2l6ZSA+PiAwLCBpIHw9IDB4MTA7CisJCQlpZiAobXNpemUgJiAweGZmMDApCisJCQkJb3V0W291dHBvcysrXSA9IG1zaXplID4+IDgsIGkgfD0gMHgyMDsKKworCQkJKm9wID0gaTsKKworCQkJZGF0YSArPSBtc2l6ZTsKKwkJCW1vZmYgKz0gbXNpemU7CisJCQltc2l6ZSA9IGxlZnQ7CisKKwkJCWlmIChtc2l6ZSA8IDQwOTYpIHsKKwkJCQlpbnQgajsKKwkJCQl2YWwgPSAwOworCQkJCWZvciAoaiA9IC1SQUJJTl9XSU5ET1c7IGogPCAwOyBqKyspCisJCQkJCXZhbCA9ICgodmFsIDw8IDgpIHwgZGF0YVtqXSkKKwkJCQkJICAgICAgXiBUW3ZhbCA+PiBSQUJJTl9TSElGVF07CisJCQl9CisJCX0KKworCQlpZiAob3V0cG9zID49IG91dHNpemUgLSBNQVhfT1BfU0laRSkgeworCQkJdm9pZCAqdG1wID0gb3V0OworCQkJb3V0c2l6ZSA9IG91dHNpemUgKiAzIC8gMjsKKwkJCWlmIChtYXhfc2l6ZSAmJiBvdXRzaXplID49IG1heF9zaXplKQorCQkJCW91dHNpemUgPSBtYXhfc2l6ZSArIE1BWF9PUF9TSVpFICsgMTsKKwkJCWlmIChtYXhfc2l6ZSAmJiBvdXRwb3MgPiBtYXhfc2l6ZSkKKwkJCQlicmVhazsKKwkJCW91dCA9IHJlYWxsb2Mob3V0LCBvdXRzaXplKTsKKwkJCWlmICghb3V0KSB7CisJCQkJZnJlZSh0bXApOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisJfQorCisJaWYgKGluc2NudCkKKwkJb3V0W291dHBvcyAtIGluc2NudCAtIDFdID0gaW5zY250OworCisJaWYgKG1heF9zaXplICYmIG91dHBvcyA+IG1heF9zaXplKSB7CisJCWZyZWUob3V0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJKmRlbHRhX3NpemUgPSBvdXRwb3M7CisJcmV0dXJuIG91dDsKK30KZGlmZiAtLWdpdCBhL2RpZmYtbGliLmMgYi9kaWZmLWxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2OWU0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9kaWZmLWxpYi5jCkBAIC0wLDAgKzEsODI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgImRpZmZjb3JlLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJjYWNoZS10cmVlLmgiCisjaW5jbHVkZSAicGF0aC1saXN0LmgiCisjaW5jbHVkZSAidW5wYWNrLXRyZWVzLmgiCisjaW5jbHVkZSAicmVmcy5oIgorCisvKgorICogZGlmZi1maWxlcworICovCisKK3N0YXRpYyBpbnQgcmVhZF9kaXJlY3RvcnkoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IHBhdGhfbGlzdCAqbGlzdCkKK3sKKwlESVIgKmRpcjsKKwlzdHJ1Y3QgZGlyZW50ICplOworCisJaWYgKCEoZGlyID0gb3BlbmRpcihwYXRoKSkpCisJCXJldHVybiBlcnJvcigiQ291bGQgbm90IG9wZW4gZGlyZWN0b3J5ICVzIiwgcGF0aCk7CisKKwl3aGlsZSAoKGUgPSByZWFkZGlyKGRpcikpKQorCQlpZiAoc3RyY21wKCIuIiwgZS0+ZF9uYW1lKSAmJiBzdHJjbXAoIi4uIiwgZS0+ZF9uYW1lKSkKKwkJCXBhdGhfbGlzdF9pbnNlcnQoZS0+ZF9uYW1lLCBsaXN0KTsKKworCWNsb3NlZGlyKGRpcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X21vZGUoY29uc3QgY2hhciAqcGF0aCwgaW50ICptb2RlKQoreworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKCFwYXRoIHx8ICFzdHJjbXAocGF0aCwgIi9kZXYvbnVsbCIpKQorCQkqbW9kZSA9IDA7CisJZWxzZSBpZiAoIXN0cmNtcChwYXRoLCAiLSIpKQorCQkqbW9kZSA9IGNyZWF0ZV9jZV9tb2RlKDA2NjYpOworCWVsc2UgaWYgKHN0YXQocGF0aCwgJnN0KSkKKwkJcmV0dXJuIGVycm9yKCJDb3VsZCBub3QgYWNjZXNzICclcyciLCBwYXRoKTsKKwllbHNlCisJCSptb2RlID0gc3Quc3RfbW9kZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxdWV1ZV9kaWZmKHN0cnVjdCBkaWZmX29wdGlvbnMgKm8sCisJCWNvbnN0IGNoYXIgKm5hbWUxLCBjb25zdCBjaGFyICpuYW1lMikKK3sKKwlpbnQgbW9kZTEgPSAwLCBtb2RlMiA9IDA7CisKKwlpZiAoZ2V0X21vZGUobmFtZTEsICZtb2RlMSkgfHwgZ2V0X21vZGUobmFtZTIsICZtb2RlMikpCisJCXJldHVybiAtMTsKKworCWlmIChtb2RlMSAmJiBtb2RlMiAmJiBTX0lTRElSKG1vZGUxKSAhPSBTX0lTRElSKG1vZGUyKSkKKwkJcmV0dXJuIGVycm9yKCJmaWxlL2RpcmVjdG9yeSBjb25mbGljdDogJXMsICVzIiwgbmFtZTEsIG5hbWUyKTsKKworCWlmIChTX0lTRElSKG1vZGUxKSB8fCBTX0lTRElSKG1vZGUyKSkgeworCQljaGFyIGJ1ZmZlcjFbUEFUSF9NQVhdLCBidWZmZXIyW1BBVEhfTUFYXTsKKwkJc3RydWN0IHBhdGhfbGlzdCBwMSA9IHtOVUxMLCAwLCAwLCAxfSwgcDIgPSB7TlVMTCwgMCwgMCwgMX07CisJCWludCBsZW4xID0gMCwgbGVuMiA9IDAsIGkxLCBpMiwgcmV0ID0gMDsKKworCQlpZiAobmFtZTEgJiYgcmVhZF9kaXJlY3RvcnkobmFtZTEsICZwMSkpCisJCQlyZXR1cm4gLTE7CisJCWlmIChuYW1lMiAmJiByZWFkX2RpcmVjdG9yeShuYW1lMiwgJnAyKSkgeworCQkJcGF0aF9saXN0X2NsZWFyKCZwMSwgMCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAobmFtZTEpIHsKKwkJCWxlbjEgPSBzdHJsZW4obmFtZTEpOworCQkJaWYgKGxlbjEgPiAwICYmIG5hbWUxW2xlbjEgLSAxXSA9PSAnLycpCisJCQkJbGVuMS0tOworCQkJbWVtY3B5KGJ1ZmZlcjEsIG5hbWUxLCBsZW4xKTsKKwkJCWJ1ZmZlcjFbbGVuMSsrXSA9ICcvJzsKKwkJfQorCisJCWlmIChuYW1lMikgeworCQkJbGVuMiA9IHN0cmxlbihuYW1lMik7CisJCQlpZiAobGVuMiA+IDAgJiYgbmFtZTJbbGVuMiAtIDFdID09ICcvJykKKwkJCQlsZW4yLS07CisJCQltZW1jcHkoYnVmZmVyMiwgbmFtZTIsIGxlbjIpOworCQkJYnVmZmVyMltsZW4yKytdID0gJy8nOworCQl9CisKKwkJZm9yIChpMSA9IGkyID0gMDsgIXJldCAmJiAoaTEgPCBwMS5uciB8fCBpMiA8IHAyLm5yKTsgKSB7CisJCQljb25zdCBjaGFyICpuMSwgKm4yOworCQkJaW50IGNvbXA7CisKKwkJCWlmIChpMSA9PSBwMS5ucikKKwkJCQljb21wID0gMTsKKwkJCWVsc2UgaWYgKGkyID09IHAyLm5yKQorCQkJCWNvbXAgPSAtMTsKKwkJCWVsc2UKKwkJCQljb21wID0gc3RyY21wKHAxLml0ZW1zW2kxXS5wYXRoLAorCQkJCQlwMi5pdGVtc1tpMl0ucGF0aCk7CisKKwkJCWlmIChjb21wID4gMCkKKwkJCQluMSA9IE5VTEw7CisJCQllbHNlIHsKKwkJCQluMSA9IGJ1ZmZlcjE7CisJCQkJc3RybmNweShidWZmZXIxICsgbGVuMSwgcDEuaXRlbXNbaTErK10ucGF0aCwKKwkJCQkJCVBBVEhfTUFYIC0gbGVuMSk7CisJCQl9CisKKwkJCWlmIChjb21wIDwgMCkKKwkJCQluMiA9IE5VTEw7CisJCQllbHNlIHsKKwkJCQluMiA9IGJ1ZmZlcjI7CisJCQkJc3RybmNweShidWZmZXIyICsgbGVuMiwgcDIuaXRlbXNbaTIrK10ucGF0aCwKKwkJCQkJCVBBVEhfTUFYIC0gbGVuMik7CisJCQl9CisKKwkJCXJldCA9IHF1ZXVlX2RpZmYobywgbjEsIG4yKTsKKwkJfQorCQlwYXRoX2xpc3RfY2xlYXIoJnAxLCAwKTsKKwkJcGF0aF9saXN0X2NsZWFyKCZwMiwgMCk7CisKKwkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqZDEsICpkMjsKKworCQlpZiAoRElGRl9PUFRfVFNUKG8sIFJFVkVSU0VfRElGRikpIHsKKwkJCXVuc2lnbmVkIHRtcDsKKwkJCWNvbnN0IGNoYXIgKnRtcF9jOworCQkJdG1wID0gbW9kZTE7IG1vZGUxID0gbW9kZTI7IG1vZGUyID0gdG1wOworCQkJdG1wX2MgPSBuYW1lMTsgbmFtZTEgPSBuYW1lMjsgbmFtZTIgPSB0bXBfYzsKKwkJfQorCisJCWlmICghbmFtZTEpCisJCQluYW1lMSA9ICIvZGV2L251bGwiOworCQlpZiAoIW5hbWUyKQorCQkJbmFtZTIgPSAiL2Rldi9udWxsIjsKKwkJZDEgPSBhbGxvY19maWxlc3BlYyhuYW1lMSk7CisJCWQyID0gYWxsb2NfZmlsZXNwZWMobmFtZTIpOworCQlmaWxsX2ZpbGVzcGVjKGQxLCBudWxsX3NoYTEsIG1vZGUxKTsKKwkJZmlsbF9maWxlc3BlYyhkMiwgbnVsbF9zaGExLCBtb2RlMik7CisKKwkJZGlmZl9xdWV1ZSgmZGlmZl9xdWV1ZWRfZGlmZiwgZDEsIGQyKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKgorICogRG9lcyB0aGUgcGF0aCBuYW1lIGEgYmxvYiBpbiB0aGUgd29ya2luZyB0cmVlLCBvciBhIGRpcmVjdG9yeQorICogaW4gdGhlIHdvcmtpbmcgdHJlZT8KKyAqLworc3RhdGljIGludCBpc19pbl9pbmRleChjb25zdCBjaGFyICpwYXRoKQoreworCWludCBsZW4sIHBvczsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlOworCisJbGVuID0gc3RybGVuKHBhdGgpOworCXdoaWxlIChwYXRoW2xlbi0xXSA9PSAnLycpCisJCWxlbi0tOworCWlmICghbGVuKQorCQlyZXR1cm4gMTsgLyogIi4iICovCisJcG9zID0gY2FjaGVfbmFtZV9wb3MocGF0aCwgbGVuKTsKKwlpZiAoMCA8PSBwb3MpCisJCXJldHVybiAxOworCXBvcyA9IC0xIC0gcG9zOworCXdoaWxlIChwb3MgPCBhY3RpdmVfbnIpIHsKKwkJY2UgPSBhY3RpdmVfY2FjaGVbcG9zKytdOworCQlpZiAoY2VfbmFtZWxlbihjZSkgPD0gbGVuIHx8CisJCSAgICBzdHJuY21wKGNlLT5uYW1lLCBwYXRoLCBsZW4pIHx8CisJCSAgICAoY2UtPm5hbWVbbGVuXSA+ICcvJykpCisJCQlicmVhazsgLyogcGF0aCBjYW5ub3QgYmUgYSBwcmVmaXggKi8KKwkJaWYgKGNlLT5uYW1lW2xlbl0gPT0gJy8nKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9kaWZmX2ZpbGVzX2FyZ3Moc3RydWN0IHJldl9pbmZvICpyZXZzLAorCQkJCSAgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LAorCQkJCSAgdW5zaWduZWQgaW50ICpvcHRpb25zKQoreworCSpvcHRpb25zID0gMDsKKworCS8qIHJldnMtPm1heF9jb3VudCA9PSAtMiBtZWFucyAtLW5vLWluZGV4ICovCisJd2hpbGUgKDEgPCBhcmdjICYmIGFyZ3ZbMV1bMF0gPT0gJy0nKSB7CisJCWlmICghc3RyY21wKGFyZ3ZbMV0sICItLWJhc2UiKSkKKwkJCXJldnMtPm1heF9jb3VudCA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tb3VycyIpKQorCQkJcmV2cy0+bWF4X2NvdW50ID0gMjsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS10aGVpcnMiKSkKKwkJCXJldnMtPm1heF9jb3VudCA9IDM7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi1uIikgfHwKKwkJCQkhc3RyY21wKGFyZ3ZbMV0sICItLW5vLWluZGV4IikpIHsKKwkJCXJldnMtPm1heF9jb3VudCA9IC0yOworCQkJRElGRl9PUFRfU0VUKCZyZXZzLT5kaWZmb3B0LCBFWElUX1dJVEhfU1RBVFVTKTsKKwkJCURJRkZfT1BUX1NFVCgmcmV2cy0+ZGlmZm9wdCwgTk9fSU5ERVgpOworCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi1xIikpCisJCQkqb3B0aW9ucyB8PSBESUZGX1NJTEVOVF9PTl9SRU1PVkVEOworCQllbHNlCisJCQlyZXR1cm4gZXJyb3IoImludmFsaWQgb3B0aW9uOiAlcyIsIGFyZ3ZbMV0pOworCQlhcmd2Kys7IGFyZ2MtLTsKKwl9CisKKwlpZiAocmV2cy0+bWF4X2NvdW50ID09IC0xICYmIHJldnMtPmRpZmZvcHQubnJfcGF0aHMgPT0gMikgeworCQkvKgorCQkgKiBJZiB0d28gZmlsZXMgYXJlIHNwZWNpZmllZCwgYW5kIGF0IGxlYXN0IG9uZSBpcyB1bnRyYWNrZWQsCisJCSAqIGRlZmF1bHQgdG8gbm8taW5kZXguCisJCSAqLworCQlyZWFkX2NhY2hlKCk7CisJCWlmICghaXNfaW5faW5kZXgocmV2cy0+ZGlmZm9wdC5wYXRoc1swXSkgfHwKKwkJCQkJIWlzX2luX2luZGV4KHJldnMtPmRpZmZvcHQucGF0aHNbMV0pKSB7CisJCQlyZXZzLT5tYXhfY291bnQgPSAtMjsKKwkJCURJRkZfT1BUX1NFVCgmcmV2cy0+ZGlmZm9wdCwgTk9fSU5ERVgpOworCQl9CisJfQorCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlcmUgYXJlIE5PIHJldmlzaW9uIChpLmUuIHBlbmRpbmcgb2JqZWN0KSBwYXJhbWV0ZXIsCisJICogcmV2Lm1heF9jb3VudCBpcyByZWFzb25hYmxlICgwIDw9IG4gPD0gMyksCisJICogdGhlcmUgaXMgbm8gb3RoZXIgcmV2aXNpb24gZmlsdGVyaW5nIHBhcmFtZXRlcnMuCisJICovCisJaWYgKHJldnMtPnBlbmRpbmcubnIgfHwgcmV2cy0+bWF4X2NvdW50ID4gMyB8fAorCSAgICByZXZzLT5taW5fYWdlICE9IC0xIHx8IHJldnMtPm1heF9hZ2UgIT0gLTEpCisJCXJldHVybiBlcnJvcigibm8gcmV2aXNpb24gYWxsb3dlZCB3aXRoIGRpZmYtZmlsZXMiKTsKKworCWlmIChyZXZzLT5tYXhfY291bnQgPT0gLTEgJiYKKwkgICAgKHJldnMtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCAmIERJRkZfRk9STUFUX1BBVENIKSkKKwkJcmV2cy0+Y29tYmluZV9tZXJnZXMgPSByZXZzLT5kZW5zZV9jb21iaW5lZF9tZXJnZXMgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNfb3V0c2lkZV9yZXBvKGNvbnN0IGNoYXIgKnBhdGgsIGludCBub25naXQsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaTsKKwlpZiAobm9uZ2l0IHx8ICFzdHJjbXAocGF0aCwgIi0iKSB8fCBpc19hYnNvbHV0ZV9wYXRoKHBhdGgpKQorCQlyZXR1cm4gMTsKKwlpZiAocHJlZml4Y21wKHBhdGgsICIuLi8iKSkKKwkJcmV0dXJuIDA7CisJaWYgKCFwcmVmaXgpCisJCXJldHVybiAxOworCWZvciAoaSA9IHN0cmxlbihwcmVmaXgpOyAhcHJlZml4Y21wKHBhdGgsICIuLi8iKTsgKSB7CisJCXdoaWxlIChpID4gMCAmJiBwcmVmaXhbaSAtIDFdICE9ICcvJykKKwkJCWktLTsKKwkJaWYgKC0taSA8IDApCisJCQlyZXR1cm4gMTsKKwkJcGF0aCArPSAzOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHNldHVwX2RpZmZfbm9faW5kZXgoc3RydWN0IHJldl9pbmZvICpyZXZzLAorCQlpbnQgYXJnYywgY29uc3QgY2hhciAqKiBhcmd2LCBpbnQgbm9uZ2l0LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGk7CisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKwkJaWYgKGFyZ3ZbaV1bMF0gIT0gJy0nIHx8IGFyZ3ZbaV1bMV0gPT0gJ1wwJykKKwkJCWJyZWFrOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItLSIpKSB7CisJCQlpKys7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChpIDwgYXJnYyAtIDMgJiYgIXN0cmNtcChhcmd2W2ldLCAiLS1uby1pbmRleCIpKSB7CisJCQlpID0gYXJnYyAtIDM7CisJCQlESUZGX09QVF9TRVQoJnJldnMtPmRpZmZvcHQsIEVYSVRfV0lUSF9TVEFUVVMpOworCQkJYnJlYWs7CisJCX0KKwlpZiAoYXJnYyAhPSBpICsgMiB8fCAoIWlzX291dHNpZGVfcmVwbyhhcmd2W2kgKyAxXSwgbm9uZ2l0LCBwcmVmaXgpICYmCisJCQkJIWlzX291dHNpZGVfcmVwbyhhcmd2W2ldLCBub25naXQsIHByZWZpeCkpKQorCQlyZXR1cm4gLTE7CisKKwlkaWZmX3NldHVwKCZyZXZzLT5kaWZmb3B0KTsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYyAtIDI7ICkKKwkJaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tbm8taW5kZXgiKSkKKwkJCWkrKzsKKwkJZWxzZSB7CisJCQlpbnQgaiA9IGRpZmZfb3B0X3BhcnNlKCZyZXZzLT5kaWZmb3B0LAorCQkJCQlhcmd2ICsgaSwgYXJnYyAtIGkpOworCQkJaWYgKCFqKQorCQkJCWRpZSgiaW52YWxpZCBkaWZmIG9wdGlvbi92YWx1ZTogJXMiLCBhcmd2W2ldKTsKKwkJCWkgKz0gajsKKwkJfQorCisJaWYgKHByZWZpeCkgeworCQlpbnQgbGVuID0gc3RybGVuKHByZWZpeCk7CisKKwkJcmV2cy0+ZGlmZm9wdC5wYXRocyA9IHhjYWxsb2MoMiwgc2l6ZW9mKGNoYXIqKSk7CisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCWNvbnN0IGNoYXIgKnAgPSBhcmd2W2FyZ2MgLSAyICsgaV07CisJCQkvKgorCQkJICogc3RkaW4gc2hvdWxkIGJlIHNwZWxsZWQgYXMgJy0nOyBpZiB5b3UgaGF2ZQorCQkJICogcGF0aCB0aGF0IGlzICctJywgc3BlbGwgaXQgYXMgLi8tLgorCQkJICovCisJCQlwID0gKHN0cmNtcChwLCAiLSIpCisJCQkgICAgID8geHN0cmR1cChwcmVmaXhfZmlsZW5hbWUocHJlZml4LCBsZW4sIHApKQorCQkJICAgICA6IHApOworCQkJcmV2cy0+ZGlmZm9wdC5wYXRoc1tpXSA9IHA7CisJCX0KKwl9CisJZWxzZQorCQlyZXZzLT5kaWZmb3B0LnBhdGhzID0gYXJndiArIGFyZ2MgLSAyOworCXJldnMtPmRpZmZvcHQubnJfcGF0aHMgPSAyOworCURJRkZfT1BUX1NFVCgmcmV2cy0+ZGlmZm9wdCwgTk9fSU5ERVgpOworCXJldnMtPm1heF9jb3VudCA9IC0yOworCWlmIChkaWZmX3NldHVwX2RvbmUoJnJldnMtPmRpZmZvcHQpIDwgMCkKKwkJZGllKCJkaWZmX3NldHVwX2RvbmUgZmFpbGVkIik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydW5fZGlmZl9maWxlc19jbWQoc3RydWN0IHJldl9pbmZvICpyZXZzLCBpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgaW50IG9wdGlvbnM7CisKKwlpZiAoaGFuZGxlX2RpZmZfZmlsZXNfYXJncyhyZXZzLCBhcmdjLCBhcmd2LCAmb3B0aW9ucykpCisJCXJldHVybiAtMTsKKworCWlmIChESUZGX09QVF9UU1QoJnJldnMtPmRpZmZvcHQsIE5PX0lOREVYKSkgeworCQlpZiAocmV2cy0+ZGlmZm9wdC5ucl9wYXRocyAhPSAyKQorCQkJcmV0dXJuIGVycm9yKCJuZWVkIHR3byBmaWxlcy9kaXJlY3RvcmllcyB3aXRoIC0tbm8taW5kZXgiKTsKKwkJaWYgKHF1ZXVlX2RpZmYoJnJldnMtPmRpZmZvcHQsIHJldnMtPmRpZmZvcHQucGF0aHNbMF0sCisJCQkJcmV2cy0+ZGlmZm9wdC5wYXRoc1sxXSkpCisJCQlyZXR1cm4gLTE7CisJCWRpZmZjb3JlX3N0ZCgmcmV2cy0+ZGlmZm9wdCk7CisJCWRpZmZfZmx1c2goJnJldnMtPmRpZmZvcHQpOworCQkvKgorCQkgKiBUaGUgcmV0dXJuIGNvZGUgZm9yIC0tbm8taW5kZXggaW1pdGF0ZXMgZGlmZigxKToKKwkJICogMCA9IG5vIGNoYW5nZXMsIDEgPSBjaGFuZ2VzLCBlbHNlIGVycm9yCisJCSAqLworCQlyZXR1cm4gcmV2cy0+ZGlmZm9wdC5mb3VuZF9jaGFuZ2VzOworCX0KKworCWlmIChyZWFkX2NhY2hlKCkgPCAwKSB7CisJCXBlcnJvcigicmVhZF9jYWNoZSIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiBydW5fZGlmZl9maWxlcyhyZXZzLCBvcHRpb25zKTsKK30KKy8qCisgKiBTZWUgaWYgd29yayB0cmVlIGhhcyBhbiBlbnRpdHkgdGhhdCBjYW4gYmUgc3RhZ2VkLiAgUmV0dXJuIDAgaWYgc28sCisgKiByZXR1cm4gMSBpZiBub3QgYW5kIHJldHVybiAtMSBpZiBlcnJvci4KKyAqLworc3RhdGljIGludCBjaGVja193b3JrX3RyZWVfZW50aXR5KGNvbnN0IHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIHN0cnVjdCBzdGF0ICpzdCwgY2hhciAqc3ltY2FjaGUpCit7CisJaWYgKGxzdGF0KGNlLT5uYW1lLCBzdCkgPCAwKSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQgJiYgZXJybm8gIT0gRU5PVERJUikKKwkJCXJldHVybiAtMTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChoYXNfc3ltbGlua19sZWFkaW5nX3BhdGgoY2UtPm5hbWUsIHN5bWNhY2hlKSkKKwkJcmV0dXJuIDE7CisJaWYgKFNfSVNESVIoc3QtPnN0X21vZGUpKSB7CisJCXVuc2lnbmVkIGNoYXIgc3ViWzIwXTsKKwkJaWYgKHJlc29sdmVfZ2l0bGlua19yZWYoY2UtPm5hbWUsICJIRUFEIiwgc3ViKSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHJ1bl9kaWZmX2ZpbGVzKHN0cnVjdCByZXZfaW5mbyAqcmV2cywgdW5zaWduZWQgaW50IG9wdGlvbikKK3sKKwlpbnQgZW50cmllcywgaTsKKwlpbnQgZGlmZl91bm1lcmdlZF9zdGFnZSA9IHJldnMtPm1heF9jb3VudDsKKwlpbnQgc2lsZW50X29uX3JlbW92ZWQgPSBvcHRpb24gJiBESUZGX1NJTEVOVF9PTl9SRU1PVkVEOworCXVuc2lnbmVkIGNlX29wdGlvbiA9ICgob3B0aW9uICYgRElGRl9SQUNZX0lTX01PRElGSUVEKQorCQkJICAgICAgPyBDRV9NQVRDSF9SQUNZX0lTX0RJUlRZIDogMCk7CisJY2hhciBzeW1jYWNoZVtQQVRIX01BWF07CisKKwlpZiAoZGlmZl91bm1lcmdlZF9zdGFnZSA8IDApCisJCWRpZmZfdW5tZXJnZWRfc3RhZ2UgPSAyOworCWVudHJpZXMgPSBhY3RpdmVfbnI7CisJc3ltY2FjaGVbMF0gPSAnXDAnOworCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCXVuc2lnbmVkIGludCBvbGRtb2RlLCBuZXdtb2RlOworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW2ldOworCQlpbnQgY2hhbmdlZDsKKworCQlpZiAoRElGRl9PUFRfVFNUKCZyZXZzLT5kaWZmb3B0LCBRVUlFVCkgJiYKKwkJCURJRkZfT1BUX1RTVCgmcmV2cy0+ZGlmZm9wdCwgSEFTX0NIQU5HRVMpKQorCQkJYnJlYWs7CisKKwkJaWYgKCFjZV9wYXRoX21hdGNoKGNlLCByZXZzLT5wcnVuZV9kYXRhKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjZV9zdGFnZShjZSkpIHsKKwkJCXN0cnVjdCBjb21iaW5lX2RpZmZfcGF0aCAqZHBhdGg7CisJCQlpbnQgbnVtX2NvbXBhcmVfc3RhZ2VzID0gMDsKKwkJCXNpemVfdCBwYXRoX2xlbjsKKworCQkJcGF0aF9sZW4gPSBjZV9uYW1lbGVuKGNlKTsKKworCQkJZHBhdGggPSB4bWFsbG9jKGNvbWJpbmVfZGlmZl9wYXRoX3NpemUoNSwgcGF0aF9sZW4pKTsKKwkJCWRwYXRoLT5wYXRoID0gKGNoYXIgKikgJihkcGF0aC0+cGFyZW50WzVdKTsKKworCQkJZHBhdGgtPm5leHQgPSBOVUxMOworCQkJZHBhdGgtPmxlbiA9IHBhdGhfbGVuOworCQkJbWVtY3B5KGRwYXRoLT5wYXRoLCBjZS0+bmFtZSwgcGF0aF9sZW4pOworCQkJZHBhdGgtPnBhdGhbcGF0aF9sZW5dID0gJ1wwJzsKKwkJCWhhc2hjbHIoZHBhdGgtPnNoYTEpOworCQkJbWVtc2V0KCYoZHBhdGgtPnBhcmVudFswXSksIDAsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjb21iaW5lX2RpZmZfcGFyZW50KSo1KTsKKworCQkJY2hhbmdlZCA9IGNoZWNrX3dvcmtfdHJlZV9lbnRpdHkoY2UsICZzdCwgc3ltY2FjaGUpOworCQkJaWYgKCFjaGFuZ2VkKQorCQkJCWRwYXRoLT5tb2RlID0gY2VfbW9kZV9mcm9tX3N0YXQoY2UsIHN0LnN0X21vZGUpOworCQkJZWxzZSB7CisJCQkJaWYgKGNoYW5nZWQgPCAwKSB7CisJCQkJCXBlcnJvcihjZS0+bmFtZSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAoc2lsZW50X29uX3JlbW92ZWQpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQl3aGlsZSAoaSA8IGVudHJpZXMpIHsKKwkJCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKm5jZSA9IGFjdGl2ZV9jYWNoZVtpXTsKKwkJCQlpbnQgc3RhZ2U7CisKKwkJCQlpZiAoc3RyY21wKGNlLT5uYW1lLCBuY2UtPm5hbWUpKQorCQkJCQlicmVhazsKKworCQkJCS8qIFN0YWdlICMyIChvdXJzKSBpcyB0aGUgZmlyc3QgcGFyZW50LAorCQkJCSAqIHN0YWdlICMzICh0aGVpcnMpIGlzIHRoZSBzZWNvbmQuCisJCQkJICovCisJCQkJc3RhZ2UgPSBjZV9zdGFnZShuY2UpOworCQkJCWlmICgyIDw9IHN0YWdlKSB7CisJCQkJCWludCBtb2RlID0gbmNlLT5jZV9tb2RlOworCQkJCQludW1fY29tcGFyZV9zdGFnZXMrKzsKKwkJCQkJaGFzaGNweShkcGF0aC0+cGFyZW50W3N0YWdlLTJdLnNoYTEsIG5jZS0+c2hhMSk7CisJCQkJCWRwYXRoLT5wYXJlbnRbc3RhZ2UtMl0ubW9kZSA9IGNlX21vZGVfZnJvbV9zdGF0KG5jZSwgbW9kZSk7CisJCQkJCWRwYXRoLT5wYXJlbnRbc3RhZ2UtMl0uc3RhdHVzID0KKwkJCQkJCURJRkZfU1RBVFVTX01PRElGSUVEOworCQkJCX0KKworCQkJCS8qIGRpZmYgYWdhaW5zdCB0aGUgcHJvcGVyIHVubWVyZ2VkIHN0YWdlICovCisJCQkJaWYgKHN0YWdlID09IGRpZmZfdW5tZXJnZWRfc3RhZ2UpCisJCQkJCWNlID0gbmNlOworCQkJCWkrKzsKKwkJCX0KKwkJCS8qCisJCQkgKiBDb21wZW5zYXRlIGZvciBsb29wIHVwZGF0ZQorCQkJICovCisJCQlpLS07CisKKwkJCWlmIChyZXZzLT5jb21iaW5lX21lcmdlcyAmJiBudW1fY29tcGFyZV9zdGFnZXMgPT0gMikgeworCQkJCXNob3dfY29tYmluZWRfZGlmZihkcGF0aCwgMiwKKwkJCQkJCSAgIHJldnMtPmRlbnNlX2NvbWJpbmVkX21lcmdlcywKKwkJCQkJCSAgIHJldnMpOworCQkJCWZyZWUoZHBhdGgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZnJlZShkcGF0aCk7CisJCQlkcGF0aCA9IE5VTEw7CisKKwkJCS8qCisJCQkgKiBTaG93IHRoZSBkaWZmIGZvciB0aGUgJ2NlJyBpZiB3ZSBmb3VuZCB0aGUgb25lCisJCQkgKiBmcm9tIHRoZSBkZXNpcmVkIHN0YWdlLgorCQkJICovCisJCQlkaWZmX3VubWVyZ2UoJnJldnMtPmRpZmZvcHQsIGNlLT5uYW1lLCAwLCBudWxsX3NoYTEpOworCQkJaWYgKGNlX3N0YWdlKGNlKSAhPSBkaWZmX3VubWVyZ2VkX3N0YWdlKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGNlX3VwdG9kYXRlKGNlKSkKKwkJCWNvbnRpbnVlOworCisJCWNoYW5nZWQgPSBjaGVja193b3JrX3RyZWVfZW50aXR5KGNlLCAmc3QsIHN5bWNhY2hlKTsKKwkJaWYgKGNoYW5nZWQpIHsKKwkJCWlmIChjaGFuZ2VkIDwgMCkgeworCQkJCXBlcnJvcihjZS0+bmFtZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoc2lsZW50X29uX3JlbW92ZWQpCisJCQkJY29udGludWU7CisJCQlkaWZmX2FkZHJlbW92ZSgmcmV2cy0+ZGlmZm9wdCwgJy0nLCBjZS0+Y2VfbW9kZSwKKwkJCQkgICAgICAgY2UtPnNoYTEsIGNlLT5uYW1lLCBOVUxMKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNoYW5nZWQgPSBjZV9tYXRjaF9zdGF0KGNlLCAmc3QsIGNlX29wdGlvbik7CisJCWlmICghY2hhbmdlZCAmJiAhRElGRl9PUFRfVFNUKCZyZXZzLT5kaWZmb3B0LCBGSU5EX0NPUElFU19IQVJERVIpKQorCQkJY29udGludWU7CisJCW9sZG1vZGUgPSBjZS0+Y2VfbW9kZTsKKwkJbmV3bW9kZSA9IGNlX21vZGVfZnJvbV9zdGF0KGNlLCBzdC5zdF9tb2RlKTsKKwkJZGlmZl9jaGFuZ2UoJnJldnMtPmRpZmZvcHQsIG9sZG1vZGUsIG5ld21vZGUsCisJCQkgICAgY2UtPnNoYTEsIChjaGFuZ2VkID8gbnVsbF9zaGExIDogY2UtPnNoYTEpLAorCQkJICAgIGNlLT5uYW1lLCBOVUxMKTsKKworCX0KKwlkaWZmY29yZV9zdGQoJnJldnMtPmRpZmZvcHQpOworCWRpZmZfZmx1c2goJnJldnMtPmRpZmZvcHQpOworCXJldHVybiAwOworfQorCisvKgorICogZGlmZi1pbmRleAorICovCisKK3N0cnVjdCBvbmV3YXlfdW5wYWNrX2RhdGEgeworCXN0cnVjdCByZXZfaW5mbyAqcmV2czsKKwljaGFyIHN5bWNhY2hlW1BBVEhfTUFYXTsKK307CisKKy8qIEEgZmlsZSBlbnRyeSB3ZW50IGF3YXkgb3IgYXBwZWFyZWQgKi8KK3N0YXRpYyB2b2lkIGRpZmZfaW5kZXhfc2hvd19maWxlKHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJCQkgY29uc3QgY2hhciAqcHJlZml4LAorCQkJCSBzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLAorCQkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCB1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwlkaWZmX2FkZHJlbW92ZSgmcmV2cy0+ZGlmZm9wdCwgcHJlZml4WzBdLCBtb2RlLAorCQkgICAgICAgc2hhMSwgY2UtPm5hbWUsIE5VTEwpOworfQorCitzdGF0aWMgaW50IGdldF9zdGF0X2RhdGEoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwKKwkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICoqc2hhMXAsCisJCQkgdW5zaWduZWQgaW50ICptb2RlcCwKKwkJCSBpbnQgY2FjaGVkLCBpbnQgbWF0Y2hfbWlzc2luZywKKwkJCSBzdHJ1Y3Qgb25ld2F5X3VucGFja19kYXRhICpjYmRhdGEpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSA9IGNlLT5zaGExOworCXVuc2lnbmVkIGludCBtb2RlID0gY2UtPmNlX21vZGU7CisKKwlpZiAoIWNhY2hlZCkgeworCQlpbnQgY2hhbmdlZDsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWNoYW5nZWQgPSBjaGVja193b3JrX3RyZWVfZW50aXR5KGNlLCAmc3QsIGNiZGF0YS0+c3ltY2FjaGUpOworCQlpZiAoY2hhbmdlZCA8IDApCisJCQlyZXR1cm4gLTE7CisJCWVsc2UgaWYgKGNoYW5nZWQpIHsKKwkJCWlmIChtYXRjaF9taXNzaW5nKSB7CisJCQkJKnNoYTFwID0gc2hhMTsKKwkJCQkqbW9kZXAgPSBtb2RlOworCQkJCXJldHVybiAwOworCQkJfQorCQkJcmV0dXJuIC0xOworCQl9CisJCWNoYW5nZWQgPSBjZV9tYXRjaF9zdGF0KGNlLCAmc3QsIDApOworCQlpZiAoY2hhbmdlZCkgeworCQkJbW9kZSA9IGNlX21vZGVfZnJvbV9zdGF0KGNlLCBzdC5zdF9tb2RlKTsKKwkJCXNoYTEgPSBudWxsX3NoYTE7CisJCX0KKwl9CisKKwkqc2hhMXAgPSBzaGExOworCSptb2RlcCA9IG1vZGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfbmV3X2ZpbGUoc3RydWN0IG9uZXdheV91bnBhY2tfZGF0YSAqY2JkYXRhLAorCQkJICBzdHJ1Y3QgY2FjaGVfZW50cnkgKm5ldywKKwkJCSAgaW50IGNhY2hlZCwgaW50IG1hdGNoX21pc3NpbmcpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMTsKKwl1bnNpZ25lZCBpbnQgbW9kZTsKKwlzdHJ1Y3QgcmV2X2luZm8gKnJldnMgPSBjYmRhdGEtPnJldnM7CisKKwkvKgorCSAqIE5ldyBmaWxlIGluIHRoZSBpbmRleDogaXQgbWlnaHQgYWN0dWFsbHkgYmUgZGlmZmVyZW50IGluCisJICogdGhlIHdvcmtpbmcgY29weS4KKwkgKi8KKwlpZiAoZ2V0X3N0YXRfZGF0YShuZXcsICZzaGExLCAmbW9kZSwgY2FjaGVkLCBtYXRjaF9taXNzaW5nLCBjYmRhdGEpIDwgMCkKKwkJcmV0dXJuOworCisJZGlmZl9pbmRleF9zaG93X2ZpbGUocmV2cywgIisiLCBuZXcsIHNoYTEsIG1vZGUpOworfQorCitzdGF0aWMgaW50IHNob3dfbW9kaWZpZWQoc3RydWN0IG9uZXdheV91bnBhY2tfZGF0YSAqY2JkYXRhLAorCQkJIHN0cnVjdCBjYWNoZV9lbnRyeSAqb2xkLAorCQkJIHN0cnVjdCBjYWNoZV9lbnRyeSAqbmV3LAorCQkJIGludCByZXBvcnRfbWlzc2luZywKKwkJCSBpbnQgY2FjaGVkLCBpbnQgbWF0Y2hfbWlzc2luZykKK3sKKwl1bnNpZ25lZCBpbnQgbW9kZSwgb2xkbW9kZTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExOworCXN0cnVjdCByZXZfaW5mbyAqcmV2cyA9IGNiZGF0YS0+cmV2czsKKworCWlmIChnZXRfc3RhdF9kYXRhKG5ldywgJnNoYTEsICZtb2RlLCBjYWNoZWQsIG1hdGNoX21pc3NpbmcsIGNiZGF0YSkgPCAwKSB7CisJCWlmIChyZXBvcnRfbWlzc2luZykKKwkJCWRpZmZfaW5kZXhfc2hvd19maWxlKHJldnMsICItIiwgb2xkLAorCQkJCQkgICAgIG9sZC0+c2hhMSwgb2xkLT5jZV9tb2RlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChyZXZzLT5jb21iaW5lX21lcmdlcyAmJiAhY2FjaGVkICYmCisJICAgIChoYXNoY21wKHNoYTEsIG9sZC0+c2hhMSkgfHwgaGFzaGNtcChvbGQtPnNoYTEsIG5ldy0+c2hhMSkpKSB7CisJCXN0cnVjdCBjb21iaW5lX2RpZmZfcGF0aCAqcDsKKwkJaW50IHBhdGhsZW4gPSBjZV9uYW1lbGVuKG5ldyk7CisKKwkJcCA9IHhtYWxsb2MoY29tYmluZV9kaWZmX3BhdGhfc2l6ZSgyLCBwYXRobGVuKSk7CisJCXAtPnBhdGggPSAoY2hhciAqKSAmcC0+cGFyZW50WzJdOworCQlwLT5uZXh0ID0gTlVMTDsKKwkJcC0+bGVuID0gcGF0aGxlbjsKKwkJbWVtY3B5KHAtPnBhdGgsIG5ldy0+bmFtZSwgcGF0aGxlbik7CisJCXAtPnBhdGhbcGF0aGxlbl0gPSAwOworCQlwLT5tb2RlID0gbW9kZTsKKwkJaGFzaGNscihwLT5zaGExKTsKKwkJbWVtc2V0KHAtPnBhcmVudCwgMCwgMiAqIHNpemVvZihzdHJ1Y3QgY29tYmluZV9kaWZmX3BhcmVudCkpOworCQlwLT5wYXJlbnRbMF0uc3RhdHVzID0gRElGRl9TVEFUVVNfTU9ESUZJRUQ7CisJCXAtPnBhcmVudFswXS5tb2RlID0gbmV3LT5jZV9tb2RlOworCQloYXNoY3B5KHAtPnBhcmVudFswXS5zaGExLCBuZXctPnNoYTEpOworCQlwLT5wYXJlbnRbMV0uc3RhdHVzID0gRElGRl9TVEFUVVNfTU9ESUZJRUQ7CisJCXAtPnBhcmVudFsxXS5tb2RlID0gb2xkLT5jZV9tb2RlOworCQloYXNoY3B5KHAtPnBhcmVudFsxXS5zaGExLCBvbGQtPnNoYTEpOworCQlzaG93X2NvbWJpbmVkX2RpZmYocCwgMiwgcmV2cy0+ZGVuc2VfY29tYmluZWRfbWVyZ2VzLCByZXZzKTsKKwkJZnJlZShwKTsKKwkJcmV0dXJuIDA7CisJfQorCisJb2xkbW9kZSA9IG9sZC0+Y2VfbW9kZTsKKwlpZiAobW9kZSA9PSBvbGRtb2RlICYmICFoYXNoY21wKHNoYTEsIG9sZC0+c2hhMSkgJiYKKwkgICAgIURJRkZfT1BUX1RTVCgmcmV2cy0+ZGlmZm9wdCwgRklORF9DT1BJRVNfSEFSREVSKSkKKwkJcmV0dXJuIDA7CisKKwlkaWZmX2NoYW5nZSgmcmV2cy0+ZGlmZm9wdCwgb2xkbW9kZSwgbW9kZSwKKwkJICAgIG9sZC0+c2hhMSwgc2hhMSwgb2xkLT5uYW1lLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgdHVybnMgYWxsIG1lcmdlIGVudHJpZXMgaW50byAic3RhZ2UgMyIuIFRoYXQgZ3VhcmFudGVlcyB0aGF0CisgKiB3aGVuIHdlIHJlYWQgaW4gdGhlIG5ldyB0cmVlIChpbnRvICJzdGFnZSAxIiksIHdlIHdvbid0IGxvc2Ugc2lnaHQKKyAqIG9mIHRoZSBmYWN0IHRoYXQgd2UgaGFkIHVubWVyZ2VkIGVudHJpZXMuCisgKi8KK3N0YXRpYyB2b2lkIG1hcmtfbWVyZ2VfZW50cmllcyh2b2lkKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBhY3RpdmVfbnI7IGkrKykgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW2ldOworCQlpZiAoIWNlX3N0YWdlKGNlKSkKKwkJCWNvbnRpbnVlOworCQljZS0+Y2VfZmxhZ3MgfD0gQ0VfU1RBR0VNQVNLOworCX0KK30KKworLyoKKyAqIFRoaXMgZ2V0cyBhIG1peCBvZiBhbiBleGlzdGluZyBpbmRleCBhbmQgYSB0cmVlLCBvbmUgcGF0aG5hbWUgZW50cnkKKyAqIGF0IGEgdGltZS4gVGhlIGluZGV4IGVudHJ5IG1heSBiZSBhIHNpbmdsZSBzdGFnZS0wIG9uZSwgYnV0IGl0IGNvdWxkCisgKiBhbHNvIGJlIG11bHRpcGxlIHVubWVyZ2VkIGVudHJpZXMgKGluIHdoaWNoIGNhc2UgaWR4X3Bvcy9pZHhfbnIgd2lsbAorICogZ2l2ZSB5b3UgdGhlIHBvc2l0aW9uIGFuZCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgaW5kZXgpLgorICovCitzdGF0aWMgdm9pZCBkb19vbmV3YXlfZGlmZihzdHJ1Y3QgdW5wYWNrX3RyZWVzX29wdGlvbnMgKm8sCisJc3RydWN0IGNhY2hlX2VudHJ5ICppZHgsCisJc3RydWN0IGNhY2hlX2VudHJ5ICp0cmVlKQoreworCXN0cnVjdCBvbmV3YXlfdW5wYWNrX2RhdGEgKmNiZGF0YSA9IG8tPnVucGFja19kYXRhOworCXN0cnVjdCByZXZfaW5mbyAqcmV2cyA9IGNiZGF0YS0+cmV2czsKKwlpbnQgbWF0Y2hfbWlzc2luZywgY2FjaGVkOworCisJLyoKKwkgKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdhcnQgLSAiZGlmZi1pbmRleCAtbSIgZG9lcworCSAqIG5vdCBtZWFuICJkbyBub3QgaWdub3JlIG1lcmdlcyIsIGJ1dCAibWF0Y2hfbWlzc2luZyIuCisJICoKKwkgKiBCdXQgd2l0aCB0aGUgcmV2aXNpb24gZmxhZyBwYXJzaW5nLCB0aGF0J3MgZm91bmQgaW4KKwkgKiAiIXJldnMtPmlnbm9yZV9tZXJnZXMiLgorCSAqLworCWNhY2hlZCA9IG8tPmluZGV4X29ubHk7CisJbWF0Y2hfbWlzc2luZyA9ICFyZXZzLT5pZ25vcmVfbWVyZ2VzOworCisJaWYgKGNhY2hlZCAmJiBpZHggJiYgY2Vfc3RhZ2UoaWR4KSkgeworCQlpZiAodHJlZSkKKwkJCWRpZmZfdW5tZXJnZSgmcmV2cy0+ZGlmZm9wdCwgaWR4LT5uYW1lLCBpZHgtPmNlX21vZGUsIGlkeC0+c2hhMSk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFNvbWV0aGluZyBhZGRlZCB0byB0aGUgdHJlZT8KKwkgKi8KKwlpZiAoIXRyZWUpIHsKKwkJc2hvd19uZXdfZmlsZShjYmRhdGEsIGlkeCwgY2FjaGVkLCBtYXRjaF9taXNzaW5nKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogU29tZXRoaW5nIHJlbW92ZWQgZnJvbSB0aGUgdHJlZT8KKwkgKi8KKwlpZiAoIWlkeCkgeworCQlkaWZmX2luZGV4X3Nob3dfZmlsZShyZXZzLCAiLSIsIHRyZWUsIHRyZWUtPnNoYTEsIHRyZWUtPmNlX21vZGUpOworCQlyZXR1cm47CisJfQorCisJLyogU2hvdyBkaWZmZXJlbmNlIGJldHdlZW4gb2xkIGFuZCBuZXcgKi8KKwlzaG93X21vZGlmaWVkKGNiZGF0YSwgdHJlZSwgaWR4LCAxLCBjYWNoZWQsIG1hdGNoX21pc3NpbmcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2tpcF9zYW1lX25hbWUoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgc3RydWN0IHVucGFja190cmVlc19vcHRpb25zICpvKQoreworCWludCBsZW4gPSBjZV9uYW1lbGVuKGNlKTsKKwljb25zdCBzdHJ1Y3QgaW5kZXhfc3RhdGUgKmluZGV4ID0gby0+c3JjX2luZGV4OworCisJd2hpbGUgKG8tPnBvcyA8IGluZGV4LT5jYWNoZV9ucikgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKm5leHQgPSBpbmRleC0+Y2FjaGVbby0+cG9zXTsKKwkJaWYgKGxlbiAhPSBjZV9uYW1lbGVuKG5leHQpKQorCQkJYnJlYWs7CisJCWlmIChtZW1jbXAoY2UtPm5hbWUsIG5leHQtPm5hbWUsIGxlbikpCisJCQlicmVhazsKKwkJby0+cG9zKys7CisJfQorfQorCisvKgorICogVGhlIHVucGFja190cmVlcygpIGludGVyZmFjZSBpcyBkZXNpZ25lZCBmb3IgbWVyZ2luZywgc28KKyAqIHRoZSBkaWZmZXJlbnQgc291cmNlIGVudHJpZXMgYXJlIGRlc2lnbmVkIHByaW1hcmlseSBmb3IKKyAqIHRoZSBzb3VyY2UgdHJlZXMsIHdpdGggdGhlIG9sZCBpbmRleCBiZWluZyByZWFsbHkgbWFpbmx5CisgKiB1c2VkIGZvciBiZWluZyByZXBsYWNlZCBieSB0aGUgcmVzdWx0LgorICoKKyAqIEZvciBkaWZmaW5nLCB0aGUgaW5kZXggaXMgbW9yZSBpbXBvcnRhbnQsIGFuZCB3ZSBvbmx5IGhhdmUgYQorICogc2luZ2xlIHRyZWUuCisgKgorICogV2UncmUgc3VwcG9zZWQgdG8gcmV0dXJuIGhvdyBtYW55IGluZGV4IGVudHJpZXMgd2Ugd2FudCB0byBza2lwLgorICoKKyAqIFRoaXMgd3JhcHBlciBtYWtlcyBpdCBhbGwgbW9yZSByZWFkYWJsZSwgYW5kIHRha2VzIGNhcmUgb2YgYWxsCisgKiB0aGUgZmFpcmx5IGNvbXBsZXggdW5wYWNrX3RyZWVzKCkgc2VtYW50aWMgcmVxdWlyZW1lbnRzLCBpbmNsdWRpbmcKKyAqIHRoZSBza2lwcGluZywgdGhlIHBhdGggbWF0Y2hpbmcsIHRoZSB0eXBlIGNvbmZsaWN0IGNhc2VzIGV0Yy4KKyAqLworc3RhdGljIGludCBvbmV3YXlfZGlmZihzdHJ1Y3QgY2FjaGVfZW50cnkgKipzcmMsIHN0cnVjdCB1bnBhY2tfdHJlZXNfb3B0aW9ucyAqbykKK3sKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmlkeCA9IHNyY1swXTsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKnRyZWUgPSBzcmNbMV07CisJc3RydWN0IG9uZXdheV91bnBhY2tfZGF0YSAqY2JkYXRhID0gby0+dW5wYWNrX2RhdGE7CisJc3RydWN0IHJldl9pbmZvICpyZXZzID0gY2JkYXRhLT5yZXZzOworCisJaWYgKGlkeCAmJiBjZV9zdGFnZShpZHgpKQorCQlza2lwX3NhbWVfbmFtZShpZHgsIG8pOworCisJLyoKKwkgKiBVbnBhY2stdHJlZXMgZ2VuZXJhdGVzIGEgREYvY29uZmxpY3QgZW50cnkgaWYKKwkgKiB0aGVyZSB3YXMgYSBkaXJlY3RvcnkgaW4gdGhlIGluZGV4IGFuZCBhIHRyZWUKKwkgKiBpbiB0aGUgdHJlZS4gRnJvbSBhIGRpZmYgc3RhbmRwb2ludCwgdGhhdCdzIGEKKwkgKiBkZWxldGUgb2YgdGhlIHRyZWUgYW5kIGEgY3JlYXRlIG9mIHRoZSBmaWxlLgorCSAqLworCWlmICh0cmVlID09IG8tPmRmX2NvbmZsaWN0X2VudHJ5KQorCQl0cmVlID0gTlVMTDsKKworCWlmIChjZV9wYXRoX21hdGNoKGlkeCA/IGlkeCA6IHRyZWUsIHJldnMtPnBydW5lX2RhdGEpKQorCQlkb19vbmV3YXlfZGlmZihvLCBpZHgsIHRyZWUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydW5fZGlmZl9pbmRleChzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIGludCBjYWNoZWQpCit7CisJc3RydWN0IG9iamVjdCAqZW50OworCXN0cnVjdCB0cmVlICp0cmVlOworCWNvbnN0IGNoYXIgKnRyZWVfbmFtZTsKKwlzdHJ1Y3QgdW5wYWNrX3RyZWVzX29wdGlvbnMgb3B0czsKKwlzdHJ1Y3QgdHJlZV9kZXNjIHQ7CisJc3RydWN0IG9uZXdheV91bnBhY2tfZGF0YSB1bnBhY2tfY2I7CisKKwltYXJrX21lcmdlX2VudHJpZXMoKTsKKworCWVudCA9IHJldnMtPnBlbmRpbmcub2JqZWN0c1swXS5pdGVtOworCXRyZWVfbmFtZSA9IHJldnMtPnBlbmRpbmcub2JqZWN0c1swXS5uYW1lOworCXRyZWUgPSBwYXJzZV90cmVlX2luZGlyZWN0KGVudC0+c2hhMSk7CisJaWYgKCF0cmVlKQorCQlyZXR1cm4gZXJyb3IoImJhZCB0cmVlIG9iamVjdCAlcyIsIHRyZWVfbmFtZSk7CisKKwl1bnBhY2tfY2IucmV2cyA9IHJldnM7CisJdW5wYWNrX2NiLnN5bWNhY2hlWzBdID0gJ1wwJzsKKwltZW1zZXQoJm9wdHMsIDAsIHNpemVvZihvcHRzKSk7CisJb3B0cy5oZWFkX2lkeCA9IDE7CisJb3B0cy5pbmRleF9vbmx5ID0gY2FjaGVkOworCW9wdHMubWVyZ2UgPSAxOworCW9wdHMuZm4gPSBvbmV3YXlfZGlmZjsKKwlvcHRzLnVucGFja19kYXRhID0gJnVucGFja19jYjsKKwlvcHRzLnNyY19pbmRleCA9ICZ0aGVfaW5kZXg7CisJb3B0cy5kc3RfaW5kZXggPSBOVUxMOworCisJaW5pdF90cmVlX2Rlc2MoJnQsIHRyZWUtPmJ1ZmZlciwgdHJlZS0+c2l6ZSk7CisJaWYgKHVucGFja190cmVlcygxLCAmdCwgJm9wdHMpKQorCQlleGl0KDEyOCk7CisKKwlkaWZmY29yZV9zdGQoJnJldnMtPmRpZmZvcHQpOworCWRpZmZfZmx1c2goJnJldnMtPmRpZmZvcHQpOworCXJldHVybiAwOworfQorCitpbnQgZG9fZGlmZl9jYWNoZShjb25zdCB1bnNpZ25lZCBjaGFyICp0cmVlX3NoYTEsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCkKK3sKKwlzdHJ1Y3QgdHJlZSAqdHJlZTsKKwlzdHJ1Y3QgcmV2X2luZm8gcmV2czsKKwlpbnQgaTsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKipkc3Q7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpsYXN0ID0gTlVMTDsKKwlzdHJ1Y3QgdW5wYWNrX3RyZWVzX29wdGlvbnMgb3B0czsKKwlzdHJ1Y3QgdHJlZV9kZXNjIHQ7CisJc3RydWN0IG9uZXdheV91bnBhY2tfZGF0YSB1bnBhY2tfY2I7CisKKwkvKgorCSAqIFRoaXMgaXMgdXNlZCBieSBnaXQtYmxhbWUgdG8gcnVuIGRpZmYtY2FjaGUgaW50ZXJuYWxseTsKKwkgKiBpdCBwb3RlbnRpYWxseSBuZWVkcyB0byByZXBlYXRlZGx5IHJ1biB0aGlzLCBzbyB3ZSB3aWxsCisJICogc3RhcnQgYnkgcmVtb3ZpbmcgdGhlIGhpZ2hlciBvcmRlciBlbnRyaWVzIHRoZSBsYXN0IHJvdW5kCisJICogbGVmdCBiZWhpbmQuCisJICovCisJZHN0ID0gYWN0aXZlX2NhY2hlOworCWZvciAoaSA9IDA7IGkgPCBhY3RpdmVfbnI7IGkrKykgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW2ldOworCQlpZiAoY2Vfc3RhZ2UoY2UpKSB7CisJCQlpZiAobGFzdCAmJiAhc3RyY21wKGNlLT5uYW1lLCBsYXN0LT5uYW1lKSkKKwkJCQljb250aW51ZTsKKwkJCWNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKGFjdGl2ZV9jYWNoZV90cmVlLAorCQkJCQkJICAgY2UtPm5hbWUpOworCQkJbGFzdCA9IGNlOworCQkJY2UtPmNlX2ZsYWdzIHw9IENFX1JFTU9WRTsKKwkJfQorCQkqZHN0KysgPSBjZTsKKwl9CisJYWN0aXZlX25yID0gZHN0IC0gYWN0aXZlX2NhY2hlOworCisJaW5pdF9yZXZpc2lvbnMoJnJldnMsIE5VTEwpOworCXJldnMucHJ1bmVfZGF0YSA9IG9wdC0+cGF0aHM7CisJdHJlZSA9IHBhcnNlX3RyZWVfaW5kaXJlY3QodHJlZV9zaGExKTsKKwlpZiAoIXRyZWUpCisJCWRpZSgiYmFkIHRyZWUgb2JqZWN0ICVzIiwgc2hhMV90b19oZXgodHJlZV9zaGExKSk7CisKKwl1bnBhY2tfY2IucmV2cyA9ICZyZXZzOworCXVucGFja19jYi5zeW1jYWNoZVswXSA9ICdcMCc7CisJbWVtc2V0KCZvcHRzLCAwLCBzaXplb2Yob3B0cykpOworCW9wdHMuaGVhZF9pZHggPSAxOworCW9wdHMuaW5kZXhfb25seSA9IDE7CisJb3B0cy5tZXJnZSA9IDE7CisJb3B0cy5mbiA9IG9uZXdheV9kaWZmOworCW9wdHMudW5wYWNrX2RhdGEgPSAmdW5wYWNrX2NiOworCW9wdHMuc3JjX2luZGV4ID0gJnRoZV9pbmRleDsKKwlvcHRzLmRzdF9pbmRleCA9ICZ0aGVfaW5kZXg7CisKKwlpbml0X3RyZWVfZGVzYygmdCwgdHJlZS0+YnVmZmVyLCB0cmVlLT5zaXplKTsKKwlpZiAodW5wYWNrX3RyZWVzKDEsICZ0LCAmb3B0cykpCisJCWV4aXQoMTI4KTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RpZmYuYyBiL2RpZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDIyZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvZGlmZi5jCkBAIC0wLDAgKzEsMzQwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBKdW5pbyBDIEhhbWFubworICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJkaWZmY29yZS5oIgorI2luY2x1ZGUgImRlbHRhLmgiCisjaW5jbHVkZSAieGRpZmYtaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29sb3IuaCIKKyNpbmNsdWRlICJhdHRyLmgiCisjaW5jbHVkZSAicnVuLWNvbW1hbmQuaCIKKyNpbmNsdWRlICJ1dGY4LmgiCisKKyNpZmRlZiBOT19GQVNUX1dPUktJTkdfRElSRUNUT1JZCisjZGVmaW5lIEZBU1RfV09SS0lOR19ESVJFQ1RPUlkgMAorI2Vsc2UKKyNkZWZpbmUgRkFTVF9XT1JLSU5HX0RJUkVDVE9SWSAxCisjZW5kaWYKKworc3RhdGljIGludCBkaWZmX2RldGVjdF9yZW5hbWVfZGVmYXVsdDsKK3N0YXRpYyBpbnQgZGlmZl9yZW5hbWVfbGltaXRfZGVmYXVsdCA9IDEwMDsKK2ludCBkaWZmX3VzZV9jb2xvcl9kZWZhdWx0ID0gLTE7CitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZXJuYWxfZGlmZl9jbWRfY2ZnOworaW50IGRpZmZfYXV0b19yZWZyZXNoX2luZGV4ID0gMTsKKworc3RhdGljIGNoYXIgZGlmZl9jb2xvcnNbXVtDT0xPUl9NQVhMRU5dID0geworCSJcMDMzW20iLAkvKiByZXNldCAqLworCSIiLAkJLyogUExBSU4gKG5vcm1hbCkgKi8KKwkiXDAzM1sxbSIsCS8qIE1FVEFJTkZPIChib2xkKSAqLworCSJcMDMzWzM2bSIsCS8qIEZSQUdJTkZPIChjeWFuKSAqLworCSJcMDMzWzMxbSIsCS8qIE9MRCAocmVkKSAqLworCSJcMDMzWzMybSIsCS8qIE5FVyAoZ3JlZW4pICovCisJIlwwMzNbMzNtIiwJLyogQ09NTUlUICh5ZWxsb3cpICovCisJIlwwMzNbNDFtIiwJLyogV0hJVEVTUEFDRSAocmVkIGJhY2tncm91bmQpICovCit9OworCitzdGF0aWMgaW50IHBhcnNlX2RpZmZfY29sb3Jfc2xvdChjb25zdCBjaGFyICp2YXIsIGludCBvZnMpCit7CisJaWYgKCFzdHJjYXNlY21wKHZhcitvZnMsICJwbGFpbiIpKQorCQlyZXR1cm4gRElGRl9QTEFJTjsKKwlpZiAoIXN0cmNhc2VjbXAodmFyK29mcywgIm1ldGEiKSkKKwkJcmV0dXJuIERJRkZfTUVUQUlORk87CisJaWYgKCFzdHJjYXNlY21wKHZhcitvZnMsICJmcmFnIikpCisJCXJldHVybiBESUZGX0ZSQUdJTkZPOworCWlmICghc3RyY2FzZWNtcCh2YXIrb2ZzLCAib2xkIikpCisJCXJldHVybiBESUZGX0ZJTEVfT0xEOworCWlmICghc3RyY2FzZWNtcCh2YXIrb2ZzLCAibmV3IikpCisJCXJldHVybiBESUZGX0ZJTEVfTkVXOworCWlmICghc3RyY2FzZWNtcCh2YXIrb2ZzLCAiY29tbWl0IikpCisJCXJldHVybiBESUZGX0NPTU1JVDsKKwlpZiAoIXN0cmNhc2VjbXAodmFyK29mcywgIndoaXRlc3BhY2UiKSkKKwkJcmV0dXJuIERJRkZfV0hJVEVTUEFDRTsKKwlkaWUoImJhZCBjb25maWcgdmFyaWFibGUgJyVzJyIsIHZhcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGxfZGlmZl9kcml2ZXIgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IGxsX2RpZmZfZHJpdmVyICpuZXh0OworCWNvbnN0IGNoYXIgKmNtZDsKK30gKnVzZXJfZGlmZiwgKip1c2VyX2RpZmZfdGFpbDsKKworLyoKKyAqIEN1cnJlbnRseSB0aGVyZSBpcyBvbmx5ICJkaWZmLjxkcml2ZXJuYW1lPi5jb21tYW5kIiB2YXJpYWJsZTsKKyAqIGJlY2F1c2UgdGhlcmUgYXJlICJkaWZmLmNvbG9yLjxzbG90PiIgdmFyaWFibGVzLCB3ZSBhcmUgcGFyc2luZworICogdGhpcyBpbiBhIGJpdCBjb252b2x1dGVkIHdheSB0byBhbGxvdyBsb3cgbGV2ZWwgZGlmZiBkcml2ZXIKKyAqIGNhbGxlZCAiY29sb3IiLgorICovCitzdGF0aWMgaW50IHBhcnNlX2xsZGlmZl9jb21tYW5kKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqZXAsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IG5hbWVsZW47CisJc3RydWN0IGxsX2RpZmZfZHJpdmVyICpkcnY7CisKKwluYW1lID0gdmFyICsgNTsKKwluYW1lbGVuID0gZXAgLSBuYW1lOworCWZvciAoZHJ2ID0gdXNlcl9kaWZmOyBkcnY7IGRydiA9IGRydi0+bmV4dCkKKwkJaWYgKCFzdHJuY21wKGRydi0+bmFtZSwgbmFtZSwgbmFtZWxlbikgJiYgIWRydi0+bmFtZVtuYW1lbGVuXSkKKwkJCWJyZWFrOworCWlmICghZHJ2KSB7CisJCWRydiA9IHhjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBsbF9kaWZmX2RyaXZlcikpOworCQlkcnYtPm5hbWUgPSB4bWVtZHVweihuYW1lLCBuYW1lbGVuKTsKKwkJaWYgKCF1c2VyX2RpZmZfdGFpbCkKKwkJCXVzZXJfZGlmZl90YWlsID0gJnVzZXJfZGlmZjsKKwkJKnVzZXJfZGlmZl90YWlsID0gZHJ2OworCQl1c2VyX2RpZmZfdGFpbCA9ICYoZHJ2LT5uZXh0KTsKKwl9CisKKwlyZXR1cm4gZ2l0X2NvbmZpZ19zdHJpbmcoJihkcnYtPmNtZCksIHZhciwgdmFsdWUpOworfQorCisvKgorICogJ2RpZmYuPHdoYXQ+LmZ1bmNuYW1lJyBhdHRyaWJ1dGUgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbgorICogdG8gZGVmaW5lIGEgY3VzdG9taXplZCByZWdleHAgdG8gZmluZCB0aGUgYmVnaW5uaW5nIG9mIGEgZnVuY3Rpb24gdG8KKyAqIGJlIHVzZWQgZm9yIGh1bmsgaGVhZGVyIGxpbmVzIG9mICJkaWZmIC1wIiBzdHlsZSBvdXRwdXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZnVuY25hbWVfcGF0dGVybiB7CisJY2hhciAqbmFtZTsKKwljaGFyICpwYXR0ZXJuOworCXN0cnVjdCBmdW5jbmFtZV9wYXR0ZXJuICpuZXh0OworfSAqZnVuY25hbWVfcGF0dGVybl9saXN0OworCitzdGF0aWMgaW50IHBhcnNlX2Z1bmNuYW1lX3BhdHRlcm4oY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICplcCwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgbmFtZWxlbjsKKwlzdHJ1Y3QgZnVuY25hbWVfcGF0dGVybiAqcHA7CisKKwluYW1lID0gdmFyICsgNTsgLyogImRpZmYuIiAqLworCW5hbWVsZW4gPSBlcCAtIG5hbWU7CisKKwlmb3IgKHBwID0gZnVuY25hbWVfcGF0dGVybl9saXN0OyBwcDsgcHAgPSBwcC0+bmV4dCkKKwkJaWYgKCFzdHJuY21wKHBwLT5uYW1lLCBuYW1lLCBuYW1lbGVuKSAmJiAhcHAtPm5hbWVbbmFtZWxlbl0pCisJCQlicmVhazsKKwlpZiAoIXBwKSB7CisJCXBwID0geGNhbGxvYygxLCBzaXplb2YoKnBwKSk7CisJCXBwLT5uYW1lID0geG1lbWR1cHoobmFtZSwgbmFtZWxlbik7CisJCXBwLT5uZXh0ID0gZnVuY25hbWVfcGF0dGVybl9saXN0OworCQlmdW5jbmFtZV9wYXR0ZXJuX2xpc3QgPSBwcDsKKwl9CisJZnJlZShwcC0+cGF0dGVybik7CisJcHAtPnBhdHRlcm4gPSB4c3RyZHVwKHZhbHVlKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZXNlIGFyZSB0byBnaXZlIFVJIGxheWVyIGRlZmF1bHRzLgorICogVGhlIGNvcmUtbGV2ZWwgY29tbWFuZHMgc3VjaCBhcyBnaXQtZGlmZi1maWxlcyBzaG91bGQKKyAqIG5ldmVyIGJlIGFmZmVjdGVkIGJ5IHRoZSBzZXR0aW5nIG9mIGRpZmYucmVuYW1lcworICogdGhlIHVzZXIgaGFwcGVucyB0byBoYXZlIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisgKi8KK2ludCBnaXRfZGlmZl91aV9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXN0cmNtcCh2YXIsICJkaWZmLnJlbmFtZWxpbWl0IikpIHsKKwkJZGlmZl9yZW5hbWVfbGltaXRfZGVmYXVsdCA9IGdpdF9jb25maWdfaW50KHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAodmFyLCAiZGlmZi5jb2xvciIpIHx8ICFzdHJjbXAodmFyLCAiY29sb3IuZGlmZiIpKSB7CisJCWRpZmZfdXNlX2NvbG9yX2RlZmF1bHQgPSBnaXRfY29uZmlnX2NvbG9yYm9vbCh2YXIsIHZhbHVlLCAtMSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXN0cmNtcCh2YXIsICJkaWZmLnJlbmFtZXMiKSkgeworCQlpZiAoIXZhbHVlKQorCQkJZGlmZl9kZXRlY3RfcmVuYW1lX2RlZmF1bHQgPSBESUZGX0RFVEVDVF9SRU5BTUU7CisJCWVsc2UgaWYgKCFzdHJjYXNlY21wKHZhbHVlLCAiY29waWVzIikgfHwKKwkJCSAhc3RyY2FzZWNtcCh2YWx1ZSwgImNvcHkiKSkKKwkJCWRpZmZfZGV0ZWN0X3JlbmFtZV9kZWZhdWx0ID0gRElGRl9ERVRFQ1RfQ09QWTsKKwkJZWxzZSBpZiAoZ2l0X2NvbmZpZ19ib29sKHZhcix2YWx1ZSkpCisJCQlkaWZmX2RldGVjdF9yZW5hbWVfZGVmYXVsdCA9IERJRkZfREVURUNUX1JFTkFNRTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKHZhciwgImRpZmYuYXV0b3JlZnJlc2hpbmRleCIpKSB7CisJCWRpZmZfYXV0b19yZWZyZXNoX2luZGV4ID0gZ2l0X2NvbmZpZ19ib29sKHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAodmFyLCAiZGlmZi5leHRlcm5hbCIpKSB7CisJCWlmICghdmFsdWUpCisJCQlyZXR1cm4gY29uZmlnX2Vycm9yX25vbmJvb2wodmFyKTsKKwkJZXh0ZXJuYWxfZGlmZl9jbWRfY2ZnID0geHN0cmR1cCh2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXByZWZpeGNtcCh2YXIsICJkaWZmLiIpKSB7CisJCWNvbnN0IGNoYXIgKmVwID0gc3RycmNocih2YXIsICcuJyk7CisKKwkJaWYgKGVwICE9IHZhciArIDQgJiYgIXN0cmNtcChlcCwgIi5jb21tYW5kIikpCisJCQlyZXR1cm4gcGFyc2VfbGxkaWZmX2NvbW1hbmQodmFyLCBlcCwgdmFsdWUpOworCX0KKworCXJldHVybiBnaXRfZGlmZl9iYXNpY19jb25maWcodmFyLCB2YWx1ZSk7Cit9CisKK2ludCBnaXRfZGlmZl9iYXNpY19jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXByZWZpeGNtcCh2YXIsICJkaWZmLmNvbG9yLiIpIHx8ICFwcmVmaXhjbXAodmFyLCAiY29sb3IuZGlmZi4iKSkgeworCQlpbnQgc2xvdCA9IHBhcnNlX2RpZmZfY29sb3Jfc2xvdCh2YXIsIDExKTsKKwkJaWYgKCF2YWx1ZSkKKwkJCXJldHVybiBjb25maWdfZXJyb3Jfbm9uYm9vbCh2YXIpOworCQljb2xvcl9wYXJzZSh2YWx1ZSwgdmFyLCBkaWZmX2NvbG9yc1tzbG90XSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghcHJlZml4Y21wKHZhciwgImRpZmYuIikpIHsKKwkJY29uc3QgY2hhciAqZXAgPSBzdHJyY2hyKHZhciwgJy4nKTsKKwkJaWYgKGVwICE9IHZhciArIDQpIHsKKwkJCWlmICghc3RyY21wKGVwLCAiLmZ1bmNuYW1lIikpIHsKKwkJCQlpZiAoIXZhbHVlKQorCQkJCQlyZXR1cm4gY29uZmlnX2Vycm9yX25vbmJvb2wodmFyKTsKKwkJCQlyZXR1cm4gcGFyc2VfZnVuY25hbWVfcGF0dGVybih2YXIsIGVwLCB2YWx1ZSk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gZ2l0X2NvbG9yX2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUpOworfQorCitzdGF0aWMgY2hhciAqcXVvdGVfdHdvKGNvbnN0IGNoYXIgKm9uZSwgY29uc3QgY2hhciAqdHdvKQoreworCWludCBuZWVkX29uZSA9IHF1b3RlX2Nfc3R5bGUob25lLCBOVUxMLCBOVUxMLCAxKTsKKwlpbnQgbmVlZF90d28gPSBxdW90ZV9jX3N0eWxlKHR3bywgTlVMTCwgTlVMTCwgMSk7CisJc3RydWN0IHN0cmJ1ZiByZXM7CisKKwlzdHJidWZfaW5pdCgmcmVzLCAwKTsKKwlpZiAobmVlZF9vbmUgKyBuZWVkX3R3bykgeworCQlzdHJidWZfYWRkY2goJnJlcywgJyInKTsKKwkJcXVvdGVfY19zdHlsZShvbmUsICZyZXMsIE5VTEwsIDEpOworCQlxdW90ZV9jX3N0eWxlKHR3bywgJnJlcywgTlVMTCwgMSk7CisJCXN0cmJ1Zl9hZGRjaCgmcmVzLCAnIicpOworCX0gZWxzZSB7CisJCXN0cmJ1Zl9hZGRzdHIoJnJlcywgb25lKTsKKwkJc3RyYnVmX2FkZHN0cigmcmVzLCB0d28pOworCX0KKwlyZXR1cm4gc3RyYnVmX2RldGFjaCgmcmVzLCBOVUxMKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVybmFsX2RpZmYodm9pZCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqZXh0ZXJuYWxfZGlmZl9jbWQgPSBOVUxMOworCXN0YXRpYyBpbnQgZG9uZV9wcmVwYXJpbmcgPSAwOworCisJaWYgKGRvbmVfcHJlcGFyaW5nKQorCQlyZXR1cm4gZXh0ZXJuYWxfZGlmZl9jbWQ7CisJZXh0ZXJuYWxfZGlmZl9jbWQgPSBnZXRlbnYoIkdJVF9FWFRFUk5BTF9ESUZGIik7CisJaWYgKCFleHRlcm5hbF9kaWZmX2NtZCkKKwkJZXh0ZXJuYWxfZGlmZl9jbWQgPSBleHRlcm5hbF9kaWZmX2NtZF9jZmc7CisJZG9uZV9wcmVwYXJpbmcgPSAxOworCXJldHVybiBleHRlcm5hbF9kaWZmX2NtZDsKK30KKworc3RhdGljIHN0cnVjdCBkaWZmX3RlbXBmaWxlIHsKKwljb25zdCBjaGFyICpuYW1lOyAvKiBmaWxlbmFtZSBleHRlcm5hbCBkaWZmIHNob3VsZCByZWFkIGZyb20gKi8KKwljaGFyIGhleFs0MV07CisJY2hhciBtb2RlWzEwXTsKKwljaGFyIHRtcF9wYXRoW1BBVEhfTUFYXTsKK30gZGlmZl90ZW1wWzJdOworCitzdGF0aWMgaW50IGNvdW50X2xpbmVzKGNvbnN0IGNoYXIgKmRhdGEsIGludCBzaXplKQoreworCWludCBjb3VudCwgY2gsIGNvbXBsZXRlbHlfZW1wdHkgPSAxLCBubF9qdXN0X3NlZW4gPSAwOworCWNvdW50ID0gMDsKKwl3aGlsZSAoMCA8IHNpemUtLSkgeworCQljaCA9ICpkYXRhKys7CisJCWlmIChjaCA9PSAnXG4nKSB7CisJCQljb3VudCsrOworCQkJbmxfanVzdF9zZWVuID0gMTsKKwkJCWNvbXBsZXRlbHlfZW1wdHkgPSAwOworCQl9CisJCWVsc2UgeworCQkJbmxfanVzdF9zZWVuID0gMDsKKwkJCWNvbXBsZXRlbHlfZW1wdHkgPSAwOworCQl9CisJfQorCWlmIChjb21wbGV0ZWx5X2VtcHR5KQorCQlyZXR1cm4gMDsKKwlpZiAoIW5sX2p1c3Rfc2VlbikKKwkJY291bnQrKzsgLyogbm8gdHJhaWxpbmcgbmV3bGluZSAqLworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbGluZV9jb3VudChGSUxFICpmaWxlLCBpbnQgY291bnQpCit7CisJc3dpdGNoIChjb3VudCkgeworCWNhc2UgMDoKKwkJZnByaW50ZihmaWxlLCAiMCwwIik7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZnByaW50ZihmaWxlLCAiMSIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKGZpbGUsICIxLCVkIiwgY291bnQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfZmlsZV93aXRoX3ByZWZpeChGSUxFICpmaWxlLAorCQkJCSAgaW50IHByZWZpeCwgY29uc3QgY2hhciAqZGF0YSwgaW50IHNpemUsCisJCQkJICBjb25zdCBjaGFyICpzZXQsIGNvbnN0IGNoYXIgKnJlc2V0KQoreworCWludCBjaCwgbmxfanVzdF9zZWVuID0gMTsKKwl3aGlsZSAoMCA8IHNpemUtLSkgeworCQljaCA9ICpkYXRhKys7CisJCWlmIChubF9qdXN0X3NlZW4pIHsKKwkJCWZwdXRzKHNldCwgZmlsZSk7CisJCQlwdXRjKHByZWZpeCwgZmlsZSk7CisJCX0KKwkJaWYgKGNoID09ICdcbicpIHsKKwkJCW5sX2p1c3Rfc2VlbiA9IDE7CisJCQlmcHV0cyhyZXNldCwgZmlsZSk7CisJCX0gZWxzZQorCQkJbmxfanVzdF9zZWVuID0gMDsKKwkJcHV0YyhjaCwgZmlsZSk7CisJfQorCWlmICghbmxfanVzdF9zZWVuKQorCQlmcHJpbnRmKGZpbGUsICIlc1xuXFwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZVxuIiwgcmVzZXQpOworfQorCitzdGF0aWMgdm9pZCBlbWl0X3Jld3JpdGVfZGlmZihjb25zdCBjaGFyICpuYW1lX2EsCisJCQkgICAgICBjb25zdCBjaGFyICpuYW1lX2IsCisJCQkgICAgICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLAorCQkJICAgICAgc3RydWN0IGRpZmZfZmlsZXNwZWMgKnR3bywKKwkJCSAgICAgIHN0cnVjdCBkaWZmX29wdGlvbnMgKm8pCit7CisJaW50IGxjX2EsIGxjX2I7CisJaW50IGNvbG9yX2RpZmYgPSBESUZGX09QVF9UU1QobywgQ09MT1JfRElGRik7CisJY29uc3QgY2hhciAqbmFtZV9hX3RhYiwgKm5hbWVfYl90YWI7CisJY29uc3QgY2hhciAqbWV0YWluZm8gPSBkaWZmX2dldF9jb2xvcihjb2xvcl9kaWZmLCBESUZGX01FVEFJTkZPKTsKKwljb25zdCBjaGFyICpmcmFnaW5mbyA9IGRpZmZfZ2V0X2NvbG9yKGNvbG9yX2RpZmYsIERJRkZfRlJBR0lORk8pOworCWNvbnN0IGNoYXIgKm9sZCA9IGRpZmZfZ2V0X2NvbG9yKGNvbG9yX2RpZmYsIERJRkZfRklMRV9PTEQpOworCWNvbnN0IGNoYXIgKm5ldyA9IGRpZmZfZ2V0X2NvbG9yKGNvbG9yX2RpZmYsIERJRkZfRklMRV9ORVcpOworCWNvbnN0IGNoYXIgKnJlc2V0ID0gZGlmZl9nZXRfY29sb3IoY29sb3JfZGlmZiwgRElGRl9SRVNFVCk7CisJc3RhdGljIHN0cnVjdCBzdHJidWYgYV9uYW1lID0gU1RSQlVGX0lOSVQsIGJfbmFtZSA9IFNUUkJVRl9JTklUOworCisJbmFtZV9hICs9ICgqbmFtZV9hID09ICcvJyk7CisJbmFtZV9iICs9ICgqbmFtZV9iID09ICcvJyk7CisJbmFtZV9hX3RhYiA9IHN0cmNocihuYW1lX2EsICcgJykgPyAiXHQiIDogIiI7CisJbmFtZV9iX3RhYiA9IHN0cmNocihuYW1lX2IsICcgJykgPyAiXHQiIDogIiI7CisKKwlzdHJidWZfcmVzZXQoJmFfbmFtZSk7CisJc3RyYnVmX3Jlc2V0KCZiX25hbWUpOworCXF1b3RlX3R3b19jX3N0eWxlKCZhX25hbWUsIG8tPmFfcHJlZml4LCBuYW1lX2EsIDApOworCXF1b3RlX3R3b19jX3N0eWxlKCZiX25hbWUsIG8tPmJfcHJlZml4LCBuYW1lX2IsIDApOworCisJZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhvbmUsIDApOworCWRpZmZfcG9wdWxhdGVfZmlsZXNwZWModHdvLCAwKTsKKwlsY19hID0gY291bnRfbGluZXMob25lLT5kYXRhLCBvbmUtPnNpemUpOworCWxjX2IgPSBjb3VudF9saW5lcyh0d28tPmRhdGEsIHR3by0+c2l6ZSk7CisJZnByaW50ZihvLT5maWxlLAorCQkiJXMtLS0gJXMlcyVzXG4lcysrKyAlcyVzJXNcbiVzQEAgLSIsCisJCW1ldGFpbmZvLCBhX25hbWUuYnVmLCBuYW1lX2FfdGFiLCByZXNldCwKKwkJbWV0YWluZm8sIGJfbmFtZS5idWYsIG5hbWVfYl90YWIsIHJlc2V0LCBmcmFnaW5mbyk7CisJcHJpbnRfbGluZV9jb3VudChvLT5maWxlLCBsY19hKTsKKwlmcHJpbnRmKG8tPmZpbGUsICIgKyIpOworCXByaW50X2xpbmVfY291bnQoby0+ZmlsZSwgbGNfYik7CisJZnByaW50ZihvLT5maWxlLCAiIEBAJXNcbiIsIHJlc2V0KTsKKwlpZiAobGNfYSkKKwkJY29weV9maWxlX3dpdGhfcHJlZml4KG8tPmZpbGUsICctJywgb25lLT5kYXRhLCBvbmUtPnNpemUsIG9sZCwgcmVzZXQpOworCWlmIChsY19iKQorCQljb3B5X2ZpbGVfd2l0aF9wcmVmaXgoby0+ZmlsZSwgJysnLCB0d28tPmRhdGEsIHR3by0+c2l6ZSwgbmV3LCByZXNldCk7Cit9CisKK3N0YXRpYyBpbnQgZmlsbF9tbWZpbGUobW1maWxlX3QgKm1mLCBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lKQoreworCWlmICghRElGRl9GSUxFX1ZBTElEKG9uZSkpIHsKKwkJbWYtPnB0ciA9IChjaGFyICopIiI7IC8qIGRvZXMgbm90IG1hdHRlciAqLworCQltZi0+c2l6ZSA9IDA7CisJCXJldHVybiAwOworCX0KKwllbHNlIGlmIChkaWZmX3BvcHVsYXRlX2ZpbGVzcGVjKG9uZSwgMCkpCisJCXJldHVybiAtMTsKKwltZi0+cHRyID0gb25lLT5kYXRhOworCW1mLT5zaXplID0gb25lLT5zaXplOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZGlmZl93b3Jkc19idWZmZXIgeworCW1tZmlsZV90IHRleHQ7CisJbG9uZyBhbGxvYzsKKwlsb25nIGN1cnJlbnQ7IC8qIG91dHB1dCBwb2ludGVyICovCisJaW50IHN1cHByZXNzZWRfbmV3bGluZTsKK307CisKK3N0YXRpYyB2b2lkIGRpZmZfd29yZHNfYXBwZW5kKGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxvbmcgbGVuLAorCQlzdHJ1Y3QgZGlmZl93b3Jkc19idWZmZXIgKmJ1ZmZlcikKK3sKKwlpZiAoYnVmZmVyLT50ZXh0LnNpemUgKyBsZW4gPiBidWZmZXItPmFsbG9jKSB7CisJCWJ1ZmZlci0+YWxsb2MgPSAoYnVmZmVyLT50ZXh0LnNpemUgKyBsZW4pICogMyAvIDI7CisJCWJ1ZmZlci0+dGV4dC5wdHIgPSB4cmVhbGxvYyhidWZmZXItPnRleHQucHRyLCBidWZmZXItPmFsbG9jKTsKKwl9CisJbGluZSsrOworCWxlbi0tOworCW1lbWNweShidWZmZXItPnRleHQucHRyICsgYnVmZmVyLT50ZXh0LnNpemUsIGxpbmUsIGxlbik7CisJYnVmZmVyLT50ZXh0LnNpemUgKz0gbGVuOworfQorCitzdHJ1Y3QgZGlmZl93b3Jkc19kYXRhIHsKKwlzdHJ1Y3QgeGRpZmZfZW1pdF9zdGF0ZSB4bTsKKwlzdHJ1Y3QgZGlmZl93b3Jkc19idWZmZXIgbWludXMsIHBsdXM7CisJRklMRSAqZmlsZTsKK307CisKK3N0YXRpYyB2b2lkIHByaW50X3dvcmQoRklMRSAqZmlsZSwgc3RydWN0IGRpZmZfd29yZHNfYnVmZmVyICpidWZmZXIsIGludCBsZW4sIGludCBjb2xvciwKKwkJaW50IHN1cHByZXNzX25ld2xpbmUpCit7CisJY29uc3QgY2hhciAqcHRyOworCWludCBlb2wgPSAwOworCisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm47CisKKwlwdHIgID0gYnVmZmVyLT50ZXh0LnB0ciArIGJ1ZmZlci0+Y3VycmVudDsKKwlidWZmZXItPmN1cnJlbnQgKz0gbGVuOworCisJaWYgKHB0cltsZW4gLSAxXSA9PSAnXG4nKSB7CisJCWVvbCA9IDE7CisJCWxlbi0tOworCX0KKworCWZwdXRzKGRpZmZfZ2V0X2NvbG9yKDEsIGNvbG9yKSwgZmlsZSk7CisJZndyaXRlKHB0ciwgbGVuLCAxLCBmaWxlKTsKKwlmcHV0cyhkaWZmX2dldF9jb2xvcigxLCBESUZGX1JFU0VUKSwgZmlsZSk7CisKKwlpZiAoZW9sKSB7CisJCWlmIChzdXBwcmVzc19uZXdsaW5lKQorCQkJYnVmZmVyLT5zdXBwcmVzc2VkX25ld2xpbmUgPSAxOworCQllbHNlCisJCQlwdXRjKCdcbicsIGZpbGUpOworCX0KK30KKworc3RhdGljIHZvaWQgZm5fb3V0X2RpZmZfd29yZHNfYXV4KHZvaWQgKnByaXYsIGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXN0cnVjdCBkaWZmX3dvcmRzX2RhdGEgKmRpZmZfd29yZHMgPSBwcml2OworCisJaWYgKGRpZmZfd29yZHMtPm1pbnVzLnN1cHByZXNzZWRfbmV3bGluZSkgeworCQlpZiAobGluZVswXSAhPSAnKycpCisJCQlwdXRjKCdcbicsIGRpZmZfd29yZHMtPmZpbGUpOworCQlkaWZmX3dvcmRzLT5taW51cy5zdXBwcmVzc2VkX25ld2xpbmUgPSAwOworCX0KKworCWxlbi0tOworCXN3aXRjaCAobGluZVswXSkgeworCQljYXNlICctJzoKKwkJCXByaW50X3dvcmQoZGlmZl93b3Jkcy0+ZmlsZSwKKwkJCQkgICAmZGlmZl93b3Jkcy0+bWludXMsIGxlbiwgRElGRl9GSUxFX09MRCwgMSk7CisJCQlicmVhazsKKwkJY2FzZSAnKyc6CisJCQlwcmludF93b3JkKGRpZmZfd29yZHMtPmZpbGUsCisJCQkJICAgJmRpZmZfd29yZHMtPnBsdXMsIGxlbiwgRElGRl9GSUxFX05FVywgMCk7CisJCQlicmVhazsKKwkJY2FzZSAnICc6CisJCQlwcmludF93b3JkKGRpZmZfd29yZHMtPmZpbGUsCisJCQkJICAgJmRpZmZfd29yZHMtPnBsdXMsIGxlbiwgRElGRl9QTEFJTiwgMCk7CisJCQlkaWZmX3dvcmRzLT5taW51cy5jdXJyZW50ICs9IGxlbjsKKwkJCWJyZWFrOworCX0KK30KKworLyogdGhpcyBleGVjdXRlcyB0aGUgd29yZCBkaWZmIG9uIHRoZSBhY2N1bXVsYXRlZCBidWZmZXJzICovCitzdGF0aWMgdm9pZCBkaWZmX3dvcmRzX3Nob3coc3RydWN0IGRpZmZfd29yZHNfZGF0YSAqZGlmZl93b3JkcykKK3sKKwl4cHBhcmFtX3QgeHBwOworCXhkZW1pdGNvbmZfdCB4ZWNmZzsKKwl4ZGVtaXRjYl90IGVjYjsKKwltbWZpbGVfdCBtaW51cywgcGx1czsKKwlpbnQgaTsKKworCW1lbXNldCgmeGVjZmcsIDAsIHNpemVvZih4ZWNmZykpOworCW1pbnVzLnNpemUgPSBkaWZmX3dvcmRzLT5taW51cy50ZXh0LnNpemU7CisJbWludXMucHRyID0geG1hbGxvYyhtaW51cy5zaXplKTsKKwltZW1jcHkobWludXMucHRyLCBkaWZmX3dvcmRzLT5taW51cy50ZXh0LnB0ciwgbWludXMuc2l6ZSk7CisJZm9yIChpID0gMDsgaSA8IG1pbnVzLnNpemU7IGkrKykKKwkJaWYgKGlzc3BhY2UobWludXMucHRyW2ldKSkKKwkJCW1pbnVzLnB0cltpXSA9ICdcbic7CisJZGlmZl93b3Jkcy0+bWludXMuY3VycmVudCA9IDA7CisKKwlwbHVzLnNpemUgPSBkaWZmX3dvcmRzLT5wbHVzLnRleHQuc2l6ZTsKKwlwbHVzLnB0ciA9IHhtYWxsb2MocGx1cy5zaXplKTsKKwltZW1jcHkocGx1cy5wdHIsIGRpZmZfd29yZHMtPnBsdXMudGV4dC5wdHIsIHBsdXMuc2l6ZSk7CisJZm9yIChpID0gMDsgaSA8IHBsdXMuc2l6ZTsgaSsrKQorCQlpZiAoaXNzcGFjZShwbHVzLnB0cltpXSkpCisJCQlwbHVzLnB0cltpXSA9ICdcbic7CisJZGlmZl93b3Jkcy0+cGx1cy5jdXJyZW50ID0gMDsKKworCXhwcC5mbGFncyA9IFhERl9ORUVEX01JTklNQUw7CisJeGVjZmcuY3R4bGVuID0gZGlmZl93b3Jkcy0+bWludXMuYWxsb2MgKyBkaWZmX3dvcmRzLT5wbHVzLmFsbG9jOworCWVjYi5vdXRmID0geGRpZmZfb3V0ZjsKKwllY2IucHJpdiA9IGRpZmZfd29yZHM7CisJZGlmZl93b3Jkcy0+eG0uY29uc3VtZSA9IGZuX291dF9kaWZmX3dvcmRzX2F1eDsKKwl4ZGlfZGlmZigmbWludXMsICZwbHVzLCAmeHBwLCAmeGVjZmcsICZlY2IpOworCisJZnJlZShtaW51cy5wdHIpOworCWZyZWUocGx1cy5wdHIpOworCWRpZmZfd29yZHMtPm1pbnVzLnRleHQuc2l6ZSA9IGRpZmZfd29yZHMtPnBsdXMudGV4dC5zaXplID0gMDsKKworCWlmIChkaWZmX3dvcmRzLT5taW51cy5zdXBwcmVzc2VkX25ld2xpbmUpIHsKKwkJcHV0YygnXG4nLCBkaWZmX3dvcmRzLT5maWxlKTsKKwkJZGlmZl93b3Jkcy0+bWludXMuc3VwcHJlc3NlZF9uZXdsaW5lID0gMDsKKwl9Cit9CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAoKnNhbmVfdHJ1bmNhdGVfZm4pKGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxvbmcgbGVuKTsKKworc3RydWN0IGVtaXRfY2FsbGJhY2sgeworCXN0cnVjdCB4ZGlmZl9lbWl0X3N0YXRlIHhtOworCWludCBucGFyZW50cywgY29sb3JfZGlmZjsKKwl1bnNpZ25lZCB3c19ydWxlOworCXNhbmVfdHJ1bmNhdGVfZm4gdHJ1bmNhdGU7CisJY29uc3QgY2hhciAqKmxhYmVsX3BhdGg7CisJc3RydWN0IGRpZmZfd29yZHNfZGF0YSAqZGlmZl93b3JkczsKKwlpbnQgKmZvdW5kX2NoYW5nZXNwOworCUZJTEUgKmZpbGU7Cit9OworCitzdGF0aWMgdm9pZCBmcmVlX2RpZmZfd29yZHNfZGF0YShzdHJ1Y3QgZW1pdF9jYWxsYmFjayAqZWNiZGF0YSkKK3sKKwlpZiAoZWNiZGF0YS0+ZGlmZl93b3JkcykgeworCQkvKiBmbHVzaCBidWZmZXJzICovCisJCWlmIChlY2JkYXRhLT5kaWZmX3dvcmRzLT5taW51cy50ZXh0LnNpemUgfHwKKwkJCQllY2JkYXRhLT5kaWZmX3dvcmRzLT5wbHVzLnRleHQuc2l6ZSkKKwkJCWRpZmZfd29yZHNfc2hvdyhlY2JkYXRhLT5kaWZmX3dvcmRzKTsKKworCQlmcmVlIChlY2JkYXRhLT5kaWZmX3dvcmRzLT5taW51cy50ZXh0LnB0cik7CisJCWZyZWUgKGVjYmRhdGEtPmRpZmZfd29yZHMtPnBsdXMudGV4dC5wdHIpOworCQlmcmVlKGVjYmRhdGEtPmRpZmZfd29yZHMpOworCQllY2JkYXRhLT5kaWZmX3dvcmRzID0gTlVMTDsKKwl9Cit9CisKK2NvbnN0IGNoYXIgKmRpZmZfZ2V0X2NvbG9yKGludCBkaWZmX3VzZV9jb2xvciwgZW51bSBjb2xvcl9kaWZmIGl4KQoreworCWlmIChkaWZmX3VzZV9jb2xvcikKKwkJcmV0dXJuIGRpZmZfY29sb3JzW2l4XTsKKwlyZXR1cm4gIiI7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfbGluZShGSUxFICpmaWxlLCBjb25zdCBjaGFyICpzZXQsIGNvbnN0IGNoYXIgKnJlc2V0LCBjb25zdCBjaGFyICpsaW5lLCBpbnQgbGVuKQoreworCWZwdXRzKHNldCwgZmlsZSk7CisJZndyaXRlKGxpbmUsIGxlbiwgMSwgZmlsZSk7CisJZnB1dHMocmVzZXQsIGZpbGUpOworfQorCitzdGF0aWMgdm9pZCBlbWl0X2FkZF9saW5lKGNvbnN0IGNoYXIgKnJlc2V0LCBzdHJ1Y3QgZW1pdF9jYWxsYmFjayAqZWNiZGF0YSwgY29uc3QgY2hhciAqbGluZSwgaW50IGxlbikKK3sKKwljb25zdCBjaGFyICp3cyA9IGRpZmZfZ2V0X2NvbG9yKGVjYmRhdGEtPmNvbG9yX2RpZmYsIERJRkZfV0hJVEVTUEFDRSk7CisJY29uc3QgY2hhciAqc2V0ID0gZGlmZl9nZXRfY29sb3IoZWNiZGF0YS0+Y29sb3JfZGlmZiwgRElGRl9GSUxFX05FVyk7CisKKwlpZiAoISp3cykKKwkJZW1pdF9saW5lKGVjYmRhdGEtPmZpbGUsIHNldCwgcmVzZXQsIGxpbmUsIGxlbik7CisJZWxzZSB7CisJCS8qIEVtaXQganVzdCB0aGUgcHJlZml4LCB0aGVuIHRoZSByZXN0LiAqLworCQllbWl0X2xpbmUoZWNiZGF0YS0+ZmlsZSwgc2V0LCByZXNldCwgbGluZSwgZWNiZGF0YS0+bnBhcmVudHMpOworCQkodm9pZCljaGVja19hbmRfZW1pdF9saW5lKGxpbmUgKyBlY2JkYXRhLT5ucGFyZW50cywKKwkJICAgIGxlbiAtIGVjYmRhdGEtPm5wYXJlbnRzLCBlY2JkYXRhLT53c19ydWxlLAorCQkgICAgZWNiZGF0YS0+ZmlsZSwgc2V0LCByZXNldCwgd3MpOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2FuZV90cnVuY2F0ZV9saW5lKHN0cnVjdCBlbWl0X2NhbGxiYWNrICplY2IsIGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCWNvbnN0IGNoYXIgKmNwOworCXVuc2lnbmVkIGxvbmcgYWxsb3Q7CisJc2l6ZV90IGwgPSBsZW47CisKKwlpZiAoZWNiLT50cnVuY2F0ZSkKKwkJcmV0dXJuIGVjYi0+dHJ1bmNhdGUobGluZSwgbGVuKTsKKwljcCA9IGxpbmU7CisJYWxsb3QgPSBsOworCXdoaWxlICgwIDwgbCkgeworCQkodm9pZCkgdXRmOF93aWR0aCgmY3AsICZsKTsKKwkJaWYgKCFjcCkKKwkJCWJyZWFrOyAvKiB0cnVuY2F0ZWQgaW4gdGhlIG1pZGRsZT8gKi8KKwl9CisJcmV0dXJuIGFsbG90IC0gbDsKK30KKworc3RhdGljIHZvaWQgZm5fb3V0X2NvbnN1bWUodm9pZCAqcHJpdiwgY2hhciAqbGluZSwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJaW50IGk7CisJaW50IGNvbG9yOworCXN0cnVjdCBlbWl0X2NhbGxiYWNrICplY2JkYXRhID0gcHJpdjsKKwljb25zdCBjaGFyICptZXRhID0gZGlmZl9nZXRfY29sb3IoZWNiZGF0YS0+Y29sb3JfZGlmZiwgRElGRl9NRVRBSU5GTyk7CisJY29uc3QgY2hhciAqcGxhaW4gPSBkaWZmX2dldF9jb2xvcihlY2JkYXRhLT5jb2xvcl9kaWZmLCBESUZGX1BMQUlOKTsKKwljb25zdCBjaGFyICpyZXNldCA9IGRpZmZfZ2V0X2NvbG9yKGVjYmRhdGEtPmNvbG9yX2RpZmYsIERJRkZfUkVTRVQpOworCisJKihlY2JkYXRhLT5mb3VuZF9jaGFuZ2VzcCkgPSAxOworCisJaWYgKGVjYmRhdGEtPmxhYmVsX3BhdGhbMF0pIHsKKwkJY29uc3QgY2hhciAqbmFtZV9hX3RhYiwgKm5hbWVfYl90YWI7CisKKwkJbmFtZV9hX3RhYiA9IHN0cmNocihlY2JkYXRhLT5sYWJlbF9wYXRoWzBdLCAnICcpID8gIlx0IiA6ICIiOworCQluYW1lX2JfdGFiID0gc3RyY2hyKGVjYmRhdGEtPmxhYmVsX3BhdGhbMV0sICcgJykgPyAiXHQiIDogIiI7CisKKwkJZnByaW50ZihlY2JkYXRhLT5maWxlLCAiJXMtLS0gJXMlcyVzXG4iLAorCQkJbWV0YSwgZWNiZGF0YS0+bGFiZWxfcGF0aFswXSwgcmVzZXQsIG5hbWVfYV90YWIpOworCQlmcHJpbnRmKGVjYmRhdGEtPmZpbGUsICIlcysrKyAlcyVzJXNcbiIsCisJCQltZXRhLCBlY2JkYXRhLT5sYWJlbF9wYXRoWzFdLCByZXNldCwgbmFtZV9iX3RhYik7CisJCWVjYmRhdGEtPmxhYmVsX3BhdGhbMF0gPSBlY2JkYXRhLT5sYWJlbF9wYXRoWzFdID0gTlVMTDsKKwl9CisKKwkvKiBUaGlzIGlzIG5vdCByZWFsbHkgbmVjZXNzYXJ5IGZvciBub3cgYmVjYXVzZQorCSAqIHRoaXMgY29kZXBhdGggb25seSBkZWFscyB3aXRoIHR3by13YXkgZGlmZnMuCisJICovCisJZm9yIChpID0gMDsgaSA8IGxlbiAmJiBsaW5lW2ldID09ICdAJzsgaSsrKQorCQk7CisJaWYgKDIgPD0gaSAmJiBpIDwgbGVuICYmIGxpbmVbaV0gPT0gJyAnKSB7CisJCWVjYmRhdGEtPm5wYXJlbnRzID0gaSAtIDE7CisJCWxlbiA9IHNhbmVfdHJ1bmNhdGVfbGluZShlY2JkYXRhLCBsaW5lLCBsZW4pOworCQllbWl0X2xpbmUoZWNiZGF0YS0+ZmlsZSwKKwkJCSAgZGlmZl9nZXRfY29sb3IoZWNiZGF0YS0+Y29sb3JfZGlmZiwgRElGRl9GUkFHSU5GTyksCisJCQkgIHJlc2V0LCBsaW5lLCBsZW4pOworCQlpZiAobGluZVtsZW4tMV0gIT0gJ1xuJykKKwkJCXB1dGMoJ1xuJywgZWNiZGF0YS0+ZmlsZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobGVuIDwgZWNiZGF0YS0+bnBhcmVudHMpIHsKKwkJZW1pdF9saW5lKGVjYmRhdGEtPmZpbGUsIHJlc2V0LCByZXNldCwgbGluZSwgbGVuKTsKKwkJcmV0dXJuOworCX0KKworCWNvbG9yID0gRElGRl9QTEFJTjsKKwlpZiAoZWNiZGF0YS0+ZGlmZl93b3JkcyAmJiBlY2JkYXRhLT5ucGFyZW50cyAhPSAxKQorCQkvKiBmYWxsIGJhY2sgdG8gbm9ybWFsIGRpZmYgKi8KKwkJZnJlZV9kaWZmX3dvcmRzX2RhdGEoZWNiZGF0YSk7CisJaWYgKGVjYmRhdGEtPmRpZmZfd29yZHMpIHsKKwkJaWYgKGxpbmVbMF0gPT0gJy0nKSB7CisJCQlkaWZmX3dvcmRzX2FwcGVuZChsaW5lLCBsZW4sCisJCQkJCSAgJmVjYmRhdGEtPmRpZmZfd29yZHMtPm1pbnVzKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmIChsaW5lWzBdID09ICcrJykgeworCQkJZGlmZl93b3Jkc19hcHBlbmQobGluZSwgbGVuLAorCQkJCQkgICZlY2JkYXRhLT5kaWZmX3dvcmRzLT5wbHVzKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoZWNiZGF0YS0+ZGlmZl93b3Jkcy0+bWludXMudGV4dC5zaXplIHx8CisJCSAgICBlY2JkYXRhLT5kaWZmX3dvcmRzLT5wbHVzLnRleHQuc2l6ZSkKKwkJCWRpZmZfd29yZHNfc2hvdyhlY2JkYXRhLT5kaWZmX3dvcmRzKTsKKwkJbGluZSsrOworCQlsZW4tLTsKKwkJZW1pdF9saW5lKGVjYmRhdGEtPmZpbGUsIHBsYWluLCByZXNldCwgbGluZSwgbGVuKTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgZWNiZGF0YS0+bnBhcmVudHMgJiYgbGVuOyBpKyspIHsKKwkJaWYgKGxpbmVbaV0gPT0gJy0nKQorCQkJY29sb3IgPSBESUZGX0ZJTEVfT0xEOworCQllbHNlIGlmIChsaW5lW2ldID09ICcrJykKKwkJCWNvbG9yID0gRElGRl9GSUxFX05FVzsKKwl9CisKKwlpZiAoY29sb3IgIT0gRElGRl9GSUxFX05FVykgeworCQllbWl0X2xpbmUoZWNiZGF0YS0+ZmlsZSwKKwkJCSAgZGlmZl9nZXRfY29sb3IoZWNiZGF0YS0+Y29sb3JfZGlmZiwgY29sb3IpLAorCQkJICByZXNldCwgbGluZSwgbGVuKTsKKwkJcmV0dXJuOworCX0KKwllbWl0X2FkZF9saW5lKHJlc2V0LCBlY2JkYXRhLCBsaW5lLCBsZW4pOworfQorCitzdGF0aWMgY2hhciAqcHByaW50X3JlbmFtZShjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiKQoreworCWNvbnN0IGNoYXIgKm9sZCA9IGE7CisJY29uc3QgY2hhciAqbmV3ID0gYjsKKwlzdHJ1Y3Qgc3RyYnVmIG5hbWU7CisJaW50IHBmeF9sZW5ndGgsIHNmeF9sZW5ndGg7CisJaW50IGxlbl9hID0gc3RybGVuKGEpOworCWludCBsZW5fYiA9IHN0cmxlbihiKTsKKwlpbnQgYV9taWRsZW4sIGJfbWlkbGVuOworCWludCBxbGVuX2EgPSBxdW90ZV9jX3N0eWxlKGEsIE5VTEwsIE5VTEwsIDApOworCWludCBxbGVuX2IgPSBxdW90ZV9jX3N0eWxlKGIsIE5VTEwsIE5VTEwsIDApOworCisJc3RyYnVmX2luaXQoJm5hbWUsIDApOworCWlmIChxbGVuX2EgfHwgcWxlbl9iKSB7CisJCXF1b3RlX2Nfc3R5bGUoYSwgJm5hbWUsIE5VTEwsIDApOworCQlzdHJidWZfYWRkc3RyKCZuYW1lLCAiID0+ICIpOworCQlxdW90ZV9jX3N0eWxlKGIsICZuYW1lLCBOVUxMLCAwKTsKKwkJcmV0dXJuIHN0cmJ1Zl9kZXRhY2goJm5hbWUsIE5VTEwpOworCX0KKworCS8qIEZpbmQgY29tbW9uIHByZWZpeCAqLworCXBmeF9sZW5ndGggPSAwOworCXdoaWxlICgqb2xkICYmICpuZXcgJiYgKm9sZCA9PSAqbmV3KSB7CisJCWlmICgqb2xkID09ICcvJykKKwkJCXBmeF9sZW5ndGggPSBvbGQgLSBhICsgMTsKKwkJb2xkKys7CisJCW5ldysrOworCX0KKworCS8qIEZpbmQgY29tbW9uIHN1ZmZpeCAqLworCW9sZCA9IGEgKyBsZW5fYTsKKwluZXcgPSBiICsgbGVuX2I7CisJc2Z4X2xlbmd0aCA9IDA7CisJd2hpbGUgKGEgPD0gb2xkICYmIGIgPD0gbmV3ICYmICpvbGQgPT0gKm5ldykgeworCQlpZiAoKm9sZCA9PSAnLycpCisJCQlzZnhfbGVuZ3RoID0gbGVuX2EgLSAob2xkIC0gYSk7CisJCW9sZC0tOworCQluZXctLTsKKwl9CisKKwkvKgorCSAqIHBmeHttaWQtYSA9PiBtaWQtYn1zZngKKwkgKiB7cGZ4LWEgPT4gcGZ4LWJ9c2Z4CisJICogcGZ4e3NmeC1hID0+IHNmeC1ifQorCSAqIG5hbWUtYSA9PiBuYW1lLWIKKwkgKi8KKwlhX21pZGxlbiA9IGxlbl9hIC0gcGZ4X2xlbmd0aCAtIHNmeF9sZW5ndGg7CisJYl9taWRsZW4gPSBsZW5fYiAtIHBmeF9sZW5ndGggLSBzZnhfbGVuZ3RoOworCWlmIChhX21pZGxlbiA8IDApCisJCWFfbWlkbGVuID0gMDsKKwlpZiAoYl9taWRsZW4gPCAwKQorCQliX21pZGxlbiA9IDA7CisKKwlzdHJidWZfZ3JvdygmbmFtZSwgcGZ4X2xlbmd0aCArIGFfbWlkbGVuICsgYl9taWRsZW4gKyBzZnhfbGVuZ3RoICsgNyk7CisJaWYgKHBmeF9sZW5ndGggKyBzZnhfbGVuZ3RoKSB7CisJCXN0cmJ1Zl9hZGQoJm5hbWUsIGEsIHBmeF9sZW5ndGgpOworCQlzdHJidWZfYWRkY2goJm5hbWUsICd7Jyk7CisJfQorCXN0cmJ1Zl9hZGQoJm5hbWUsIGEgKyBwZnhfbGVuZ3RoLCBhX21pZGxlbik7CisJc3RyYnVmX2FkZHN0cigmbmFtZSwgIiA9PiAiKTsKKwlzdHJidWZfYWRkKCZuYW1lLCBiICsgcGZ4X2xlbmd0aCwgYl9taWRsZW4pOworCWlmIChwZnhfbGVuZ3RoICsgc2Z4X2xlbmd0aCkgeworCQlzdHJidWZfYWRkY2goJm5hbWUsICd9Jyk7CisJCXN0cmJ1Zl9hZGQoJm5hbWUsIGEgKyBsZW5fYSAtIHNmeF9sZW5ndGgsIHNmeF9sZW5ndGgpOworCX0KKwlyZXR1cm4gc3RyYnVmX2RldGFjaCgmbmFtZSwgTlVMTCk7Cit9CisKK3N0cnVjdCBkaWZmc3RhdF90IHsKKwlzdHJ1Y3QgeGRpZmZfZW1pdF9zdGF0ZSB4bTsKKworCWludCBucjsKKwlpbnQgYWxsb2M7CisJc3RydWN0IGRpZmZzdGF0X2ZpbGUgeworCQljaGFyICpmcm9tX25hbWU7CisJCWNoYXIgKm5hbWU7CisJCWNoYXIgKnByaW50X25hbWU7CisJCXVuc2lnbmVkIGlzX3VubWVyZ2VkOjE7CisJCXVuc2lnbmVkIGlzX2JpbmFyeToxOworCQl1bnNpZ25lZCBpc19yZW5hbWVkOjE7CisJCXVuc2lnbmVkIGludCBhZGRlZCwgZGVsZXRlZDsKKwl9ICoqZmlsZXM7Cit9OworCitzdGF0aWMgc3RydWN0IGRpZmZzdGF0X2ZpbGUgKmRpZmZzdGF0X2FkZChzdHJ1Y3QgZGlmZnN0YXRfdCAqZGlmZnN0YXQsCisJCQkJCSAgY29uc3QgY2hhciAqbmFtZV9hLAorCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWVfYikKK3sKKwlzdHJ1Y3QgZGlmZnN0YXRfZmlsZSAqeDsKKwl4ID0geGNhbGxvYyhzaXplb2YgKCp4KSwgMSk7CisJaWYgKGRpZmZzdGF0LT5uciA9PSBkaWZmc3RhdC0+YWxsb2MpIHsKKwkJZGlmZnN0YXQtPmFsbG9jID0gYWxsb2NfbnIoZGlmZnN0YXQtPmFsbG9jKTsKKwkJZGlmZnN0YXQtPmZpbGVzID0geHJlYWxsb2MoZGlmZnN0YXQtPmZpbGVzLAorCQkJCWRpZmZzdGF0LT5hbGxvYyAqIHNpemVvZih4KSk7CisJfQorCWRpZmZzdGF0LT5maWxlc1tkaWZmc3RhdC0+bnIrK10gPSB4OworCWlmIChuYW1lX2IpIHsKKwkJeC0+ZnJvbV9uYW1lID0geHN0cmR1cChuYW1lX2EpOworCQl4LT5uYW1lID0geHN0cmR1cChuYW1lX2IpOworCQl4LT5pc19yZW5hbWVkID0gMTsKKwl9CisJZWxzZSB7CisJCXgtPmZyb21fbmFtZSA9IE5VTEw7CisJCXgtPm5hbWUgPSB4c3RyZHVwKG5hbWVfYSk7CisJfQorCXJldHVybiB4OworfQorCitzdGF0aWMgdm9pZCBkaWZmc3RhdF9jb25zdW1lKHZvaWQgKnByaXYsIGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXN0cnVjdCBkaWZmc3RhdF90ICpkaWZmc3RhdCA9IHByaXY7CisJc3RydWN0IGRpZmZzdGF0X2ZpbGUgKnggPSBkaWZmc3RhdC0+ZmlsZXNbZGlmZnN0YXQtPm5yIC0gMV07CisKKwlpZiAobGluZVswXSA9PSAnKycpCisJCXgtPmFkZGVkKys7CisJZWxzZSBpZiAobGluZVswXSA9PSAnLScpCisJCXgtPmRlbGV0ZWQrKzsKK30KKworY29uc3QgY2hhciBtaW1lX2JvdW5kYXJ5X2xlYWRlcltdID0gIi0tLS0tLS0tLS0tLSI7CisKK3N0YXRpYyBpbnQgc2NhbGVfbGluZWFyKGludCBpdCwgaW50IHdpZHRoLCBpbnQgbWF4X2NoYW5nZSkKK3sKKwkvKgorCSAqIG1ha2Ugc3VyZSB0aGF0IGF0IGxlYXN0IG9uZSAnLScgaXMgcHJpbnRlZCBpZiB0aGVyZSB3ZXJlIGRlbGV0aW9ucywKKwkgKiBhbmQgbGlrZXdpc2UgZm9yICcrJy4KKwkgKi8KKwlpZiAobWF4X2NoYW5nZSA8IDIpCisJCXJldHVybiBpdDsKKwlyZXR1cm4gKChpdCAtIDEpICogKHdpZHRoIC0gMSkgKyBtYXhfY2hhbmdlIC0gMSkgLyAobWF4X2NoYW5nZSAtIDEpOworfQorCitzdGF0aWMgdm9pZCBzaG93X25hbWUoRklMRSAqZmlsZSwKKwkJICAgICAgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLAorCQkgICAgICBjb25zdCBjaGFyICpyZXNldCwgY29uc3QgY2hhciAqc2V0KQoreworCWZwcmludGYoZmlsZSwgIiAlcyVzJS0qcyVzIHwiLCBzZXQsIHByZWZpeCwgbGVuLCBuYW1lLCByZXNldCk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfZ3JhcGgoRklMRSAqZmlsZSwgY2hhciBjaCwgaW50IGNudCwgY29uc3QgY2hhciAqc2V0LCBjb25zdCBjaGFyICpyZXNldCkKK3sKKwlpZiAoY250IDw9IDApCisJCXJldHVybjsKKwlmcHJpbnRmKGZpbGUsICIlcyIsIHNldCk7CisJd2hpbGUgKGNudC0tKQorCQlwdXRjKGNoLCBmaWxlKTsKKwlmcHJpbnRmKGZpbGUsICIlcyIsIHJlc2V0KTsKK30KKworc3RhdGljIHZvaWQgZmlsbF9wcmludF9uYW1lKHN0cnVjdCBkaWZmc3RhdF9maWxlICpmaWxlKQoreworCWNoYXIgKnBuYW1lOworCisJaWYgKGZpbGUtPnByaW50X25hbWUpCisJCXJldHVybjsKKworCWlmICghZmlsZS0+aXNfcmVuYW1lZCkgeworCQlzdHJ1Y3Qgc3RyYnVmIGJ1ZjsKKwkJc3RyYnVmX2luaXQoJmJ1ZiwgMCk7CisJCWlmIChxdW90ZV9jX3N0eWxlKGZpbGUtPm5hbWUsICZidWYsIE5VTEwsIDApKSB7CisJCQlwbmFtZSA9IHN0cmJ1Zl9kZXRhY2goJmJ1ZiwgTlVMTCk7CisJCX0gZWxzZSB7CisJCQlwbmFtZSA9IGZpbGUtPm5hbWU7CisJCQlzdHJidWZfcmVsZWFzZSgmYnVmKTsKKwkJfQorCX0gZWxzZSB7CisJCXBuYW1lID0gcHByaW50X3JlbmFtZShmaWxlLT5mcm9tX25hbWUsIGZpbGUtPm5hbWUpOworCX0KKwlmaWxlLT5wcmludF9uYW1lID0gcG5hbWU7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfc3RhdHMoc3RydWN0IGRpZmZzdGF0X3QqIGRhdGEsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMpCit7CisJaW50IGksIGxlbiwgYWRkLCBkZWwsIHRvdGFsLCBhZGRzID0gMCwgZGVscyA9IDA7CisJaW50IG1heF9jaGFuZ2UgPSAwLCBtYXhfbGVuID0gMDsKKwlpbnQgdG90YWxfZmlsZXMgPSBkYXRhLT5ucjsKKwlpbnQgd2lkdGgsIG5hbWVfd2lkdGg7CisJY29uc3QgY2hhciAqcmVzZXQsICpzZXQsICphZGRfYywgKmRlbF9jOworCisJaWYgKGRhdGEtPm5yID09IDApCisJCXJldHVybjsKKworCXdpZHRoID0gb3B0aW9ucy0+c3RhdF93aWR0aCA/IG9wdGlvbnMtPnN0YXRfd2lkdGggOiA4MDsKKwluYW1lX3dpZHRoID0gb3B0aW9ucy0+c3RhdF9uYW1lX3dpZHRoID8gb3B0aW9ucy0+c3RhdF9uYW1lX3dpZHRoIDogNTA7CisKKwkvKiBTYW5pdHk6IGdpdmUgYXQgbGVhc3QgNSBjb2x1bW5zIHRvIHRoZSBncmFwaCwKKwkgKiBidXQgbGVhdmUgYXQgbGVhc3QgMTAgY29sdW1ucyBmb3IgdGhlIG5hbWUuCisJICovCisJaWYgKHdpZHRoIDwgbmFtZV93aWR0aCArIDE1KSB7CisJCWlmIChuYW1lX3dpZHRoIDw9IDI1KQorCQkJd2lkdGggPSBuYW1lX3dpZHRoICsgMTU7CisJCWVsc2UKKwkJCW5hbWVfd2lkdGggPSB3aWR0aCAtIDE1OworCX0KKworCS8qIEZpbmQgdGhlIGxvbmdlc3QgZmlsZW5hbWUgYW5kIG1heCBudW1iZXIgb2YgY2hhbmdlcyAqLworCXJlc2V0ID0gZGlmZl9nZXRfY29sb3Jfb3B0KG9wdGlvbnMsIERJRkZfUkVTRVQpOworCXNldCAgID0gZGlmZl9nZXRfY29sb3Jfb3B0KG9wdGlvbnMsIERJRkZfUExBSU4pOworCWFkZF9jID0gZGlmZl9nZXRfY29sb3Jfb3B0KG9wdGlvbnMsIERJRkZfRklMRV9ORVcpOworCWRlbF9jID0gZGlmZl9nZXRfY29sb3Jfb3B0KG9wdGlvbnMsIERJRkZfRklMRV9PTEQpOworCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPm5yOyBpKyspIHsKKwkJc3RydWN0IGRpZmZzdGF0X2ZpbGUgKmZpbGUgPSBkYXRhLT5maWxlc1tpXTsKKwkJaW50IGNoYW5nZSA9IGZpbGUtPmFkZGVkICsgZmlsZS0+ZGVsZXRlZDsKKwkJZmlsbF9wcmludF9uYW1lKGZpbGUpOworCQlsZW4gPSBzdHJsZW4oZmlsZS0+cHJpbnRfbmFtZSk7CisJCWlmIChtYXhfbGVuIDwgbGVuKQorCQkJbWF4X2xlbiA9IGxlbjsKKworCQlpZiAoZmlsZS0+aXNfYmluYXJ5IHx8IGZpbGUtPmlzX3VubWVyZ2VkKQorCQkJY29udGludWU7CisJCWlmIChtYXhfY2hhbmdlIDwgY2hhbmdlKQorCQkJbWF4X2NoYW5nZSA9IGNoYW5nZTsKKwl9CisKKwkvKiBDb21wdXRlIHRoZSB3aWR0aCBvZiB0aGUgZ3JhcGggcGFydDsKKwkgKiAxMCBpcyBmb3Igb25lIGJsYW5rIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgcGx1cworCSAqICIgfCBjb3VudCAiIGJldHdlZW4gdGhlIG5hbWUgYW5kIHRoZSBncmFwaC4KKwkgKgorCSAqIEZyb20gaGVyZSBvbiwgbmFtZV93aWR0aCBpcyB0aGUgd2lkdGggb2YgdGhlIG5hbWUgYXJlYSwKKwkgKiBhbmQgd2lkdGggaXMgdGhlIHdpZHRoIG9mIHRoZSBncmFwaCBhcmVhLgorCSAqLworCW5hbWVfd2lkdGggPSAobmFtZV93aWR0aCA8IG1heF9sZW4pID8gbmFtZV93aWR0aCA6IG1heF9sZW47CisJaWYgKHdpZHRoIDwgKG5hbWVfd2lkdGggKyAxMCkgKyBtYXhfY2hhbmdlKQorCQl3aWR0aCA9IHdpZHRoIC0gKG5hbWVfd2lkdGggKyAxMCk7CisJZWxzZQorCQl3aWR0aCA9IG1heF9jaGFuZ2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bnI7IGkrKykgeworCQljb25zdCBjaGFyICpwcmVmaXggPSAiIjsKKwkJY2hhciAqbmFtZSA9IGRhdGEtPmZpbGVzW2ldLT5wcmludF9uYW1lOworCQlpbnQgYWRkZWQgPSBkYXRhLT5maWxlc1tpXS0+YWRkZWQ7CisJCWludCBkZWxldGVkID0gZGF0YS0+ZmlsZXNbaV0tPmRlbGV0ZWQ7CisJCWludCBuYW1lX2xlbjsKKworCQkvKgorCQkgKiAic2NhbGUiIHRoZSBmaWxlbmFtZQorCQkgKi8KKwkJbGVuID0gbmFtZV93aWR0aDsKKwkJbmFtZV9sZW4gPSBzdHJsZW4obmFtZSk7CisJCWlmIChuYW1lX3dpZHRoIDwgbmFtZV9sZW4pIHsKKwkJCWNoYXIgKnNsYXNoOworCQkJcHJlZml4ID0gIi4uLiI7CisJCQlsZW4gLT0gMzsKKwkJCW5hbWUgKz0gbmFtZV9sZW4gLSBsZW47CisJCQlzbGFzaCA9IHN0cmNocihuYW1lLCAnLycpOworCQkJaWYgKHNsYXNoKQorCQkJCW5hbWUgPSBzbGFzaDsKKwkJfQorCisJCWlmIChkYXRhLT5maWxlc1tpXS0+aXNfYmluYXJ5KSB7CisJCQlzaG93X25hbWUob3B0aW9ucy0+ZmlsZSwgcHJlZml4LCBuYW1lLCBsZW4sIHJlc2V0LCBzZXQpOworCQkJZnByaW50ZihvcHRpb25zLT5maWxlLCAiICBCaW4gIik7CisJCQlmcHJpbnRmKG9wdGlvbnMtPmZpbGUsICIlcyVkJXMiLCBkZWxfYywgZGVsZXRlZCwgcmVzZXQpOworCQkJZnByaW50ZihvcHRpb25zLT5maWxlLCAiIC0+ICIpOworCQkJZnByaW50ZihvcHRpb25zLT5maWxlLCAiJXMlZCVzIiwgYWRkX2MsIGFkZGVkLCByZXNldCk7CisJCQlmcHJpbnRmKG9wdGlvbnMtPmZpbGUsICIgYnl0ZXMiKTsKKwkJCWZwcmludGYob3B0aW9ucy0+ZmlsZSwgIlxuIik7CisJCQljb250aW51ZTsKKwkJfQorCQllbHNlIGlmIChkYXRhLT5maWxlc1tpXS0+aXNfdW5tZXJnZWQpIHsKKwkJCXNob3dfbmFtZShvcHRpb25zLT5maWxlLCBwcmVmaXgsIG5hbWUsIGxlbiwgcmVzZXQsIHNldCk7CisJCQlmcHJpbnRmKG9wdGlvbnMtPmZpbGUsICIgIFVubWVyZ2VkXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UgaWYgKCFkYXRhLT5maWxlc1tpXS0+aXNfcmVuYW1lZCAmJgorCQkJIChhZGRlZCArIGRlbGV0ZWQgPT0gMCkpIHsKKwkJCXRvdGFsX2ZpbGVzLS07CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIHNjYWxlIHRoZSBhZGQvZGVsZXRlCisJCSAqLworCQlhZGQgPSBhZGRlZDsKKwkJZGVsID0gZGVsZXRlZDsKKwkJdG90YWwgPSBhZGQgKyBkZWw7CisJCWFkZHMgKz0gYWRkOworCQlkZWxzICs9IGRlbDsKKworCQlpZiAod2lkdGggPD0gbWF4X2NoYW5nZSkgeworCQkJYWRkID0gc2NhbGVfbGluZWFyKGFkZCwgd2lkdGgsIG1heF9jaGFuZ2UpOworCQkJZGVsID0gc2NhbGVfbGluZWFyKGRlbCwgd2lkdGgsIG1heF9jaGFuZ2UpOworCQkJdG90YWwgPSBhZGQgKyBkZWw7CisJCX0KKwkJc2hvd19uYW1lKG9wdGlvbnMtPmZpbGUsIHByZWZpeCwgbmFtZSwgbGVuLCByZXNldCwgc2V0KTsKKwkJZnByaW50ZihvcHRpb25zLT5maWxlLCAiJTVkICIsIGFkZGVkICsgZGVsZXRlZCk7CisJCXNob3dfZ3JhcGgob3B0aW9ucy0+ZmlsZSwgJysnLCBhZGQsIGFkZF9jLCByZXNldCk7CisJCXNob3dfZ3JhcGgob3B0aW9ucy0+ZmlsZSwgJy0nLCBkZWwsIGRlbF9jLCByZXNldCk7CisJCWZwcmludGYob3B0aW9ucy0+ZmlsZSwgIlxuIik7CisJfQorCWZwcmludGYob3B0aW9ucy0+ZmlsZSwKKwkgICAgICAgIiVzICVkIGZpbGVzIGNoYW5nZWQsICVkIGluc2VydGlvbnMoKyksICVkIGRlbGV0aW9ucygtKSVzXG4iLAorCSAgICAgICBzZXQsIHRvdGFsX2ZpbGVzLCBhZGRzLCBkZWxzLCByZXNldCk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfc2hvcnRzdGF0cyhzdHJ1Y3QgZGlmZnN0YXRfdCogZGF0YSwgc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucykKK3sKKwlpbnQgaSwgYWRkcyA9IDAsIGRlbHMgPSAwLCB0b3RhbF9maWxlcyA9IGRhdGEtPm5yOworCisJaWYgKGRhdGEtPm5yID09IDApCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5ucjsgaSsrKSB7CisJCWlmICghZGF0YS0+ZmlsZXNbaV0tPmlzX2JpbmFyeSAmJgorCQkgICAgIWRhdGEtPmZpbGVzW2ldLT5pc191bm1lcmdlZCkgeworCQkJaW50IGFkZGVkID0gZGF0YS0+ZmlsZXNbaV0tPmFkZGVkOworCQkJaW50IGRlbGV0ZWQ9IGRhdGEtPmZpbGVzW2ldLT5kZWxldGVkOworCQkJaWYgKCFkYXRhLT5maWxlc1tpXS0+aXNfcmVuYW1lZCAmJgorCQkJICAgIChhZGRlZCArIGRlbGV0ZWQgPT0gMCkpIHsKKwkJCQl0b3RhbF9maWxlcy0tOworCQkJfSBlbHNlIHsKKwkJCQlhZGRzICs9IGFkZGVkOworCQkJCWRlbHMgKz0gZGVsZXRlZDsKKwkJCX0KKwkJfQorCX0KKwlmcHJpbnRmKG9wdGlvbnMtPmZpbGUsICIgJWQgZmlsZXMgY2hhbmdlZCwgJWQgaW5zZXJ0aW9ucygrKSwgJWQgZGVsZXRpb25zKC0pXG4iLAorCSAgICAgICB0b3RhbF9maWxlcywgYWRkcywgZGVscyk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfbnVtc3RhdChzdHJ1Y3QgZGlmZnN0YXRfdCogZGF0YSwgc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucykKK3sKKwlpbnQgaTsKKworCWlmIChkYXRhLT5uciA9PSAwKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bnI7IGkrKykgeworCQlzdHJ1Y3QgZGlmZnN0YXRfZmlsZSAqZmlsZSA9IGRhdGEtPmZpbGVzW2ldOworCisJCWlmIChmaWxlLT5pc19iaW5hcnkpCisJCQlmcHJpbnRmKG9wdGlvbnMtPmZpbGUsICItXHQtXHQiKTsKKwkJZWxzZQorCQkJZnByaW50ZihvcHRpb25zLT5maWxlLAorCQkJCSIlZFx0JWRcdCIsIGZpbGUtPmFkZGVkLCBmaWxlLT5kZWxldGVkKTsKKwkJaWYgKG9wdGlvbnMtPmxpbmVfdGVybWluYXRpb24pIHsKKwkJCWZpbGxfcHJpbnRfbmFtZShmaWxlKTsKKwkJCWlmICghZmlsZS0+aXNfcmVuYW1lZCkKKwkJCQl3cml0ZV9uYW1lX3F1b3RlZChmaWxlLT5uYW1lLCBvcHRpb25zLT5maWxlLAorCQkJCQkJICBvcHRpb25zLT5saW5lX3Rlcm1pbmF0aW9uKTsKKwkJCWVsc2UgeworCQkJCWZwdXRzKGZpbGUtPnByaW50X25hbWUsIG9wdGlvbnMtPmZpbGUpOworCQkJCXB1dGMob3B0aW9ucy0+bGluZV90ZXJtaW5hdGlvbiwgb3B0aW9ucy0+ZmlsZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoZmlsZS0+aXNfcmVuYW1lZCkgeworCQkJCXB1dGMoJ1wwJywgb3B0aW9ucy0+ZmlsZSk7CisJCQkJd3JpdGVfbmFtZV9xdW90ZWQoZmlsZS0+ZnJvbV9uYW1lLCBvcHRpb25zLT5maWxlLCAnXDAnKTsKKwkJCX0KKwkJCXdyaXRlX25hbWVfcXVvdGVkKGZpbGUtPm5hbWUsIG9wdGlvbnMtPmZpbGUsICdcMCcpOworCQl9CisJfQorfQorCitzdHJ1Y3QgZGlmZnN0YXRfZGlyIHsKKwlzdHJ1Y3QgZGlmZnN0YXRfZmlsZSAqKmZpbGVzOworCWludCBuciwgcGVyY2VudCwgY3VtdWxhdGl2ZTsKK307CisKK3N0YXRpYyBsb25nIGdhdGhlcl9kaXJzdGF0KEZJTEUgKmZpbGUsIHN0cnVjdCBkaWZmc3RhdF9kaXIgKmRpciwgdW5zaWduZWQgbG9uZyBjaGFuZ2VkLCBjb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbikKK3sKKwl1bnNpZ25lZCBsb25nIHRoaXNfZGlyID0gMDsKKwl1bnNpZ25lZCBpbnQgc291cmNlcyA9IDA7CisKKwl3aGlsZSAoZGlyLT5ucikgeworCQlzdHJ1Y3QgZGlmZnN0YXRfZmlsZSAqZiA9ICpkaXItPmZpbGVzOworCQlpbnQgbmFtZWxlbiA9IHN0cmxlbihmLT5uYW1lKTsKKwkJdW5zaWduZWQgbG9uZyB0aGlzOworCQljaGFyICpzbGFzaDsKKworCQlpZiAobmFtZWxlbiA8IGJhc2VsZW4pCisJCQlicmVhazsKKwkJaWYgKG1lbWNtcChmLT5uYW1lLCBiYXNlLCBiYXNlbGVuKSkKKwkJCWJyZWFrOworCQlzbGFzaCA9IHN0cmNocihmLT5uYW1lICsgYmFzZWxlbiwgJy8nKTsKKwkJaWYgKHNsYXNoKSB7CisJCQlpbnQgbmV3YmFzZWxlbiA9IHNsYXNoICsgMSAtIGYtPm5hbWU7CisJCQl0aGlzID0gZ2F0aGVyX2RpcnN0YXQoZmlsZSwgZGlyLCBjaGFuZ2VkLCBmLT5uYW1lLCBuZXdiYXNlbGVuKTsKKwkJCXNvdXJjZXMrKzsKKwkJfSBlbHNlIHsKKwkJCWlmIChmLT5pc191bm1lcmdlZCB8fCBmLT5pc19iaW5hcnkpCisJCQkJdGhpcyA9IDA7CisJCQllbHNlCisJCQkJdGhpcyA9IGYtPmFkZGVkICsgZi0+ZGVsZXRlZDsKKwkJCWRpci0+ZmlsZXMrKzsKKwkJCWRpci0+bnItLTsKKwkJCXNvdXJjZXMgKz0gMjsKKwkJfQorCQl0aGlzX2RpciArPSB0aGlzOworCX0KKworCS8qCisJICogV2UgZG9uJ3QgcmVwb3J0IGRpcnN0YXQncyBmb3IKKwkgKiAgLSB0aGUgdG9wIGxldmVsCisJICogIC0gb3IgY2FzZXMgd2hlcmUgZXZlcnl0aGluZyBjYW1lIGZyb20gYSBzaW5nbGUgZGlyZWN0b3J5CisJICogICAgdW5kZXIgdGhpcyBkaXJlY3RvcnkgKHNvdXJjZXMgPT0gMSkuCisJICovCisJaWYgKGJhc2VsZW4gJiYgc291cmNlcyAhPSAxKSB7CisJCWludCBwZXJtaWxsZSA9IHRoaXNfZGlyICogMTAwMCAvIGNoYW5nZWQ7CisJCWlmIChwZXJtaWxsZSkgeworCQkJaW50IHBlcmNlbnQgPSBwZXJtaWxsZSAvIDEwOworCQkJaWYgKHBlcmNlbnQgPj0gZGlyLT5wZXJjZW50KSB7CisJCQkJZnByaW50ZihmaWxlLCAiJTRkLiUwMWQlJSAlLipzXG4iLCBwZXJjZW50LCBwZXJtaWxsZSAlIDEwLCBiYXNlbGVuLCBiYXNlKTsKKwkJCQlpZiAoIWRpci0+Y3VtdWxhdGl2ZSkKKwkJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHRoaXNfZGlyOworfQorCitzdGF0aWMgdm9pZCBzaG93X2RpcnN0YXQoc3RydWN0IGRpZmZzdGF0X3QgKmRhdGEsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBjaGFuZ2VkOworCXN0cnVjdCBkaWZmc3RhdF9kaXIgZGlyOworCisJLyogQ2FsY3VsYXRlIHRvdGFsIGNoYW5nZXMgKi8KKwljaGFuZ2VkID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bnI7IGkrKykgeworCQlpZiAoZGF0YS0+ZmlsZXNbaV0tPmlzX2JpbmFyeSB8fCBkYXRhLT5maWxlc1tpXS0+aXNfdW5tZXJnZWQpCisJCQljb250aW51ZTsKKwkJY2hhbmdlZCArPSBkYXRhLT5maWxlc1tpXS0+YWRkZWQ7CisJCWNoYW5nZWQgKz0gZGF0YS0+ZmlsZXNbaV0tPmRlbGV0ZWQ7CisJfQorCisJLyogVGhpcyBjYW4gaGFwcGVuIGV2ZW4gd2l0aCBtYW55IGZpbGVzLCBpZiBldmVyeXRoaW5nIHdhcyByZW5hbWVzICovCisJaWYgKCFjaGFuZ2VkKQorCQlyZXR1cm47CisKKwkvKiBTaG93IGFsbCBkaXJlY3RvcmllcyB3aXRoIG1vcmUgdGhhbiB4JSBvZiB0aGUgY2hhbmdlcyAqLworCWRpci5maWxlcyA9IGRhdGEtPmZpbGVzOworCWRpci5uciA9IGRhdGEtPm5yOworCWRpci5wZXJjZW50ID0gb3B0aW9ucy0+ZGlyc3RhdF9wZXJjZW50OworCWRpci5jdW11bGF0aXZlID0gb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCAmIERJRkZfRk9STUFUX0NVTVVMQVRJVkU7CisJZ2F0aGVyX2RpcnN0YXQob3B0aW9ucy0+ZmlsZSwgJmRpciwgY2hhbmdlZCwgIiIsIDApOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2RpZmZzdGF0X2luZm8oc3RydWN0IGRpZmZzdGF0X3QgKmRpZmZzdGF0KQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBkaWZmc3RhdC0+bnI7IGkrKykgeworCQlzdHJ1Y3QgZGlmZnN0YXRfZmlsZSAqZiA9IGRpZmZzdGF0LT5maWxlc1tpXTsKKwkJaWYgKGYtPm5hbWUgIT0gZi0+cHJpbnRfbmFtZSkKKwkJCWZyZWUoZi0+cHJpbnRfbmFtZSk7CisJCWZyZWUoZi0+bmFtZSk7CisJCWZyZWUoZi0+ZnJvbV9uYW1lKTsKKwkJZnJlZShmKTsKKwl9CisJZnJlZShkaWZmc3RhdC0+ZmlsZXMpOworfQorCitzdHJ1Y3QgY2hlY2tkaWZmX3QgeworCXN0cnVjdCB4ZGlmZl9lbWl0X3N0YXRlIHhtOworCWNvbnN0IGNoYXIgKmZpbGVuYW1lOworCWludCBsaW5lbm8sIGNvbG9yX2RpZmY7CisJdW5zaWduZWQgd3NfcnVsZTsKKwl1bnNpZ25lZCBzdGF0dXM7CisJRklMRSAqZmlsZTsKK307CisKK3N0YXRpYyB2b2lkIGNoZWNrZGlmZl9jb25zdW1lKHZvaWQgKnByaXYsIGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXN0cnVjdCBjaGVja2RpZmZfdCAqZGF0YSA9IHByaXY7CisJY29uc3QgY2hhciAqd3MgPSBkaWZmX2dldF9jb2xvcihkYXRhLT5jb2xvcl9kaWZmLCBESUZGX1dISVRFU1BBQ0UpOworCWNvbnN0IGNoYXIgKnJlc2V0ID0gZGlmZl9nZXRfY29sb3IoZGF0YS0+Y29sb3JfZGlmZiwgRElGRl9SRVNFVCk7CisJY29uc3QgY2hhciAqc2V0ID0gZGlmZl9nZXRfY29sb3IoZGF0YS0+Y29sb3JfZGlmZiwgRElGRl9GSUxFX05FVyk7CisJY2hhciAqZXJyOworCisJaWYgKGxpbmVbMF0gPT0gJysnKSB7CisJCWRhdGEtPmxpbmVubysrOworCQlkYXRhLT5zdGF0dXMgPSBjaGVja19hbmRfZW1pdF9saW5lKGxpbmUgKyAxLCBsZW4gLSAxLAorCQkgICAgZGF0YS0+d3NfcnVsZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCWlmICghZGF0YS0+c3RhdHVzKQorCQkJcmV0dXJuOworCQllcnIgPSB3aGl0ZXNwYWNlX2Vycm9yX3N0cmluZyhkYXRhLT5zdGF0dXMpOworCQlmcHJpbnRmKGRhdGEtPmZpbGUsICIlczolZDogJXMuXG4iLCBkYXRhLT5maWxlbmFtZSwgZGF0YS0+bGluZW5vLCBlcnIpOworCQlmcmVlKGVycik7CisJCWVtaXRfbGluZShkYXRhLT5maWxlLCBzZXQsIHJlc2V0LCBsaW5lLCAxKTsKKwkJKHZvaWQpY2hlY2tfYW5kX2VtaXRfbGluZShsaW5lICsgMSwgbGVuIC0gMSwgZGF0YS0+d3NfcnVsZSwKKwkJICAgIGRhdGEtPmZpbGUsIHNldCwgcmVzZXQsIHdzKTsKKwl9IGVsc2UgaWYgKGxpbmVbMF0gPT0gJyAnKQorCQlkYXRhLT5saW5lbm8rKzsKKwllbHNlIGlmIChsaW5lWzBdID09ICdAJykgeworCQljaGFyICpwbHVzID0gc3RyY2hyKGxpbmUsICcrJyk7CisJCWlmIChwbHVzKQorCQkJZGF0YS0+bGluZW5vID0gc3RydG9sKHBsdXMsIE5VTEwsIDEwKSAtIDE7CisJCWVsc2UKKwkJCWRpZSgiaW52YWxpZCBkaWZmIik7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciAqZGVmbGF0ZV9pdChjaGFyICpkYXRhLAorCQkJCSB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJIHVuc2lnbmVkIGxvbmcgKnJlc3VsdF9zaXplKQoreworCWludCBib3VuZDsKKwl1bnNpZ25lZCBjaGFyICpkZWZsYXRlZDsKKwl6X3N0cmVhbSBzdHJlYW07CisKKwltZW1zZXQoJnN0cmVhbSwgMCwgc2l6ZW9mKHN0cmVhbSkpOworCWRlZmxhdGVJbml0KCZzdHJlYW0sIHpsaWJfY29tcHJlc3Npb25fbGV2ZWwpOworCWJvdW5kID0gZGVmbGF0ZUJvdW5kKCZzdHJlYW0sIHNpemUpOworCWRlZmxhdGVkID0geG1hbGxvYyhib3VuZCk7CisJc3RyZWFtLm5leHRfb3V0ID0gZGVmbGF0ZWQ7CisJc3RyZWFtLmF2YWlsX291dCA9IGJvdW5kOworCisJc3RyZWFtLm5leHRfaW4gPSAodW5zaWduZWQgY2hhciAqKWRhdGE7CisJc3RyZWFtLmF2YWlsX2luID0gc2l6ZTsKKwl3aGlsZSAoZGVmbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCkgPT0gWl9PSykKKwkJOyAvKiBub3RoaW5nICovCisJZGVmbGF0ZUVuZCgmc3RyZWFtKTsKKwkqcmVzdWx0X3NpemUgPSBzdHJlYW0udG90YWxfb3V0OworCXJldHVybiBkZWZsYXRlZDsKK30KKworc3RhdGljIHZvaWQgZW1pdF9iaW5hcnlfZGlmZl9ib2R5KEZJTEUgKmZpbGUsIG1tZmlsZV90ICpvbmUsIG1tZmlsZV90ICp0d28pCit7CisJdm9pZCAqY3A7CisJdm9pZCAqZGVsdGE7CisJdm9pZCAqZGVmbGF0ZWQ7CisJdm9pZCAqZGF0YTsKKwl1bnNpZ25lZCBsb25nIG9yaWdfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGRlbHRhX3NpemU7CisJdW5zaWduZWQgbG9uZyBkZWZsYXRlX3NpemU7CisJdW5zaWduZWQgbG9uZyBkYXRhX3NpemU7CisKKwkvKiBXZSBjb3VsZCBkbyBkZWZsYXRlZCBkZWx0YSwgb3Igd2UgY291bGQgZG8ganVzdCBkZWZsYXRlZCB0d28sCisJICogd2hpY2hldmVyIGlzIHNtYWxsZXIuCisJICovCisJZGVsdGEgPSBOVUxMOworCWRlZmxhdGVkID0gZGVmbGF0ZV9pdCh0d28tPnB0ciwgdHdvLT5zaXplLCAmZGVmbGF0ZV9zaXplKTsKKwlpZiAob25lLT5zaXplICYmIHR3by0+c2l6ZSkgeworCQlkZWx0YSA9IGRpZmZfZGVsdGEob25lLT5wdHIsIG9uZS0+c2l6ZSwKKwkJCQkgICB0d28tPnB0ciwgdHdvLT5zaXplLAorCQkJCSAgICZkZWx0YV9zaXplLCBkZWZsYXRlX3NpemUpOworCQlpZiAoZGVsdGEpIHsKKwkJCXZvaWQgKnRvX2ZyZWUgPSBkZWx0YTsKKwkJCW9yaWdfc2l6ZSA9IGRlbHRhX3NpemU7CisJCQlkZWx0YSA9IGRlZmxhdGVfaXQoZGVsdGEsIGRlbHRhX3NpemUsICZkZWx0YV9zaXplKTsKKwkJCWZyZWUodG9fZnJlZSk7CisJCX0KKwl9CisKKwlpZiAoZGVsdGEgJiYgZGVsdGFfc2l6ZSA8IGRlZmxhdGVfc2l6ZSkgeworCQlmcHJpbnRmKGZpbGUsICJkZWx0YSAlbHVcbiIsIG9yaWdfc2l6ZSk7CisJCWZyZWUoZGVmbGF0ZWQpOworCQlkYXRhID0gZGVsdGE7CisJCWRhdGFfc2l6ZSA9IGRlbHRhX3NpemU7CisJfQorCWVsc2UgeworCQlmcHJpbnRmKGZpbGUsICJsaXRlcmFsICVsdVxuIiwgdHdvLT5zaXplKTsKKwkJZnJlZShkZWx0YSk7CisJCWRhdGEgPSBkZWZsYXRlZDsKKwkJZGF0YV9zaXplID0gZGVmbGF0ZV9zaXplOworCX0KKworCS8qIGVtaXQgZGF0YSBlbmNvZGVkIGluIGJhc2U4NSAqLworCWNwID0gZGF0YTsKKwl3aGlsZSAoZGF0YV9zaXplKSB7CisJCWludCBieXRlcyA9ICg1MiA8IGRhdGFfc2l6ZSkgPyA1MiA6IGRhdGFfc2l6ZTsKKwkJY2hhciBsaW5lWzcwXTsKKwkJZGF0YV9zaXplIC09IGJ5dGVzOworCQlpZiAoYnl0ZXMgPD0gMjYpCisJCQlsaW5lWzBdID0gYnl0ZXMgKyAnQScgLSAxOworCQllbHNlCisJCQlsaW5lWzBdID0gYnl0ZXMgLSAyNiArICdhJyAtIDE7CisJCWVuY29kZV84NShsaW5lICsgMSwgY3AsIGJ5dGVzKTsKKwkJY3AgPSAoY2hhciAqKSBjcCArIGJ5dGVzOworCQlmcHV0cyhsaW5lLCBmaWxlKTsKKwkJZnB1dGMoJ1xuJywgZmlsZSk7CisJfQorCWZwcmludGYoZmlsZSwgIlxuIik7CisJZnJlZShkYXRhKTsKK30KKworc3RhdGljIHZvaWQgZW1pdF9iaW5hcnlfZGlmZihGSUxFICpmaWxlLCBtbWZpbGVfdCAqb25lLCBtbWZpbGVfdCAqdHdvKQoreworCWZwcmludGYoZmlsZSwgIkdJVCBiaW5hcnkgcGF0Y2hcbiIpOworCWVtaXRfYmluYXJ5X2RpZmZfYm9keShmaWxlLCBvbmUsIHR3byk7CisJZW1pdF9iaW5hcnlfZGlmZl9ib2R5KGZpbGUsIHR3bywgb25lKTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfZGlmZl9hdHRyX2NoZWNrKHN0cnVjdCBnaXRfYXR0cl9jaGVjayAqY2hlY2spCit7CisJc3RhdGljIHN0cnVjdCBnaXRfYXR0ciAqYXR0cl9kaWZmOworCisJaWYgKCFhdHRyX2RpZmYpIHsKKwkJYXR0cl9kaWZmID0gZ2l0X2F0dHIoImRpZmYiLCA0KTsKKwl9CisJY2hlY2tbMF0uYXR0ciA9IGF0dHJfZGlmZjsKK30KKworc3RhdGljIHZvaWQgZGlmZl9maWxlc3BlY19jaGVja19hdHRyKHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUpCit7CisJc3RydWN0IGdpdF9hdHRyX2NoZWNrIGF0dHJfZGlmZl9jaGVjazsKKwlpbnQgY2hlY2tfZnJvbV9kYXRhID0gMDsKKworCWlmIChvbmUtPmNoZWNrZWRfYXR0cikKKwkJcmV0dXJuOworCisJc2V0dXBfZGlmZl9hdHRyX2NoZWNrKCZhdHRyX2RpZmZfY2hlY2spOworCW9uZS0+aXNfYmluYXJ5ID0gMDsKKwlvbmUtPmZ1bmNuYW1lX3BhdHRlcm5faWRlbnQgPSBOVUxMOworCisJaWYgKCFnaXRfY2hlY2thdHRyKG9uZS0+cGF0aCwgMSwgJmF0dHJfZGlmZl9jaGVjaykpIHsKKwkJY29uc3QgY2hhciAqdmFsdWU7CisKKwkJLyogYmluYXJ5bmVzcyAqLworCQl2YWx1ZSA9IGF0dHJfZGlmZl9jaGVjay52YWx1ZTsKKwkJaWYgKEFUVFJfVFJVRSh2YWx1ZSkpCisJCQk7CisJCWVsc2UgaWYgKEFUVFJfRkFMU0UodmFsdWUpKQorCQkJb25lLT5pc19iaW5hcnkgPSAxOworCQllbHNlCisJCQljaGVja19mcm9tX2RhdGEgPSAxOworCisJCS8qIGZ1bmNuYW1lIHBhdHRlcm4gaWRlbnQgKi8KKwkJaWYgKEFUVFJfVFJVRSh2YWx1ZSkgfHwgQVRUUl9GQUxTRSh2YWx1ZSkgfHwgQVRUUl9VTlNFVCh2YWx1ZSkpCisJCQk7CisJCWVsc2UKKwkJCW9uZS0+ZnVuY25hbWVfcGF0dGVybl9pZGVudCA9IHZhbHVlOworCX0KKworCWlmIChjaGVja19mcm9tX2RhdGEpIHsKKwkJaWYgKCFvbmUtPmRhdGEgJiYgRElGRl9GSUxFX1ZBTElEKG9uZSkpCisJCQlkaWZmX3BvcHVsYXRlX2ZpbGVzcGVjKG9uZSwgMCk7CisKKwkJaWYgKG9uZS0+ZGF0YSkKKwkJCW9uZS0+aXNfYmluYXJ5ID0gYnVmZmVyX2lzX2JpbmFyeShvbmUtPmRhdGEsIG9uZS0+c2l6ZSk7CisJfQorfQorCitpbnQgZGlmZl9maWxlc3BlY19pc19iaW5hcnkoc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSkKK3sKKwlkaWZmX2ZpbGVzcGVjX2NoZWNrX2F0dHIob25lKTsKKwlyZXR1cm4gb25lLT5pc19iaW5hcnk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpmdW5jbmFtZV9wYXR0ZXJuKGNvbnN0IGNoYXIgKmlkZW50KQoreworCXN0cnVjdCBmdW5jbmFtZV9wYXR0ZXJuICpwcDsKKworCWZvciAocHAgPSBmdW5jbmFtZV9wYXR0ZXJuX2xpc3Q7IHBwOyBwcCA9IHBwLT5uZXh0KQorCQlpZiAoIXN0cmNtcChpZGVudCwgcHAtPm5hbWUpKQorCQkJcmV0dXJuIHBwLT5wYXR0ZXJuOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW5fZnVuY25hbWVfcGF0dGVybiB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpwYXR0ZXJuOworfSBidWlsdGluX2Z1bmNuYW1lX3BhdHRlcm5bXSA9IHsKKwl7ICJqYXZhIiwgIiFeWyAJXSpcXChjYXRjaFxcfGRvXFx8Zm9yXFx8aWZcXHxpbnN0YW5jZW9mXFx8IgorCQkJIm5ld1xcfHJldHVyblxcfHN3aXRjaFxcfHRocm93XFx8d2hpbGVcXClcbiIKKwkJCSJeWyAJXSpcXChcXChbIAldKiIKKwkJCSJbQS1aYS16X11bQS1aYS16XzAtOV0qXFwpXFx7MixcXH0iCisJCQkiWyAJXSooW147XSpcXCkkIiB9LAorCXsgInRleCIsICJeXFwoXFxcXFxcKHN1YlxcKSpzZWN0aW9uey4qXFwpJCIgfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpkaWZmX2Z1bmNuYW1lX3BhdHRlcm4oc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSkKK3sKKwljb25zdCBjaGFyICppZGVudCwgKnBhdHRlcm47CisJaW50IGk7CisKKwlkaWZmX2ZpbGVzcGVjX2NoZWNrX2F0dHIob25lKTsKKwlpZGVudCA9IG9uZS0+ZnVuY25hbWVfcGF0dGVybl9pZGVudDsKKworCWlmICghaWRlbnQpCisJCS8qCisJCSAqIElmIHRoZSBjb25maWcgZmlsZSBoYXMgImZ1bmNuYW1lLmRlZmF1bHQiIGRlZmluZWQsIHRoYXQKKwkJICogcmVnZXhwIGlzIHVzZWQ7IG90aGVyd2lzZSBOVUxMIGlzIHJldHVybmVkIGFuZCB4ZW1pdCB1c2VzCisJCSAqIHRoZSBidWlsdC1pbiBkZWZhdWx0LgorCQkgKi8KKwkJcmV0dXJuIGZ1bmNuYW1lX3BhdHRlcm4oImRlZmF1bHQiKTsKKworCS8qIExvb2sgdXAgY3VzdG9tICJmdW5jbmFtZS4kaWRlbnQiIHJlZ2V4cCBmcm9tIGNvbmZpZy4gKi8KKwlwYXR0ZXJuID0gZnVuY25hbWVfcGF0dGVybihpZGVudCk7CisJaWYgKHBhdHRlcm4pCisJCXJldHVybiBwYXR0ZXJuOworCisJLyoKKwkgKiBBbmQgZGVmaW5lIGJ1aWx0LWluIGZhbGxiYWNrIHBhdHRlcm5zIGhlcmUuICBOb3RlIHRoYXQKKwkgKiB0aGVzZSBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgdXNlcidzIGNvbmZpZyBzZXR0aW5ncy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidWlsdGluX2Z1bmNuYW1lX3BhdHRlcm4pOyBpKyspCisJCWlmICghc3RyY21wKGlkZW50LCBidWlsdGluX2Z1bmNuYW1lX3BhdHRlcm5baV0ubmFtZSkpCisJCQlyZXR1cm4gYnVpbHRpbl9mdW5jbmFtZV9wYXR0ZXJuW2ldLnBhdHRlcm47CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgYnVpbHRpbl9kaWZmKGNvbnN0IGNoYXIgKm5hbWVfYSwKKwkJCSBjb25zdCBjaGFyICpuYW1lX2IsCisJCQkgc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSwKKwkJCSBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqdHdvLAorCQkJIGNvbnN0IGNoYXIgKnhmcm1fbXNnLAorCQkJIHN0cnVjdCBkaWZmX29wdGlvbnMgKm8sCisJCQkgaW50IGNvbXBsZXRlX3Jld3JpdGUpCit7CisJbW1maWxlX3QgbWYxLCBtZjI7CisJY29uc3QgY2hhciAqbGJsWzJdOworCWNoYXIgKmFfb25lLCAqYl90d287CisJY29uc3QgY2hhciAqc2V0ID0gZGlmZl9nZXRfY29sb3Jfb3B0KG8sIERJRkZfTUVUQUlORk8pOworCWNvbnN0IGNoYXIgKnJlc2V0ID0gZGlmZl9nZXRfY29sb3Jfb3B0KG8sIERJRkZfUkVTRVQpOworCisJYV9vbmUgPSBxdW90ZV90d28oby0+YV9wcmVmaXgsIG5hbWVfYSArICgqbmFtZV9hID09ICcvJykpOworCWJfdHdvID0gcXVvdGVfdHdvKG8tPmJfcHJlZml4LCBuYW1lX2IgKyAoKm5hbWVfYiA9PSAnLycpKTsKKwlsYmxbMF0gPSBESUZGX0ZJTEVfVkFMSUQob25lKSA/IGFfb25lIDogIi9kZXYvbnVsbCI7CisJbGJsWzFdID0gRElGRl9GSUxFX1ZBTElEKHR3bykgPyBiX3R3byA6ICIvZGV2L251bGwiOworCWZwcmludGYoby0+ZmlsZSwgIiVzZGlmZiAtLWdpdCAlcyAlcyVzXG4iLCBzZXQsIGFfb25lLCBiX3R3bywgcmVzZXQpOworCWlmIChsYmxbMF1bMF0gPT0gJy8nKSB7CisJCS8qIC9kZXYvbnVsbCAqLworCQlmcHJpbnRmKG8tPmZpbGUsICIlc25ldyBmaWxlIG1vZGUgJTA2byVzXG4iLCBzZXQsIHR3by0+bW9kZSwgcmVzZXQpOworCQlpZiAoeGZybV9tc2cgJiYgeGZybV9tc2dbMF0pCisJCQlmcHJpbnRmKG8tPmZpbGUsICIlcyVzJXNcbiIsIHNldCwgeGZybV9tc2csIHJlc2V0KTsKKwl9CisJZWxzZSBpZiAobGJsWzFdWzBdID09ICcvJykgeworCQlmcHJpbnRmKG8tPmZpbGUsICIlc2RlbGV0ZWQgZmlsZSBtb2RlICUwNm8lc1xuIiwgc2V0LCBvbmUtPm1vZGUsIHJlc2V0KTsKKwkJaWYgKHhmcm1fbXNnICYmIHhmcm1fbXNnWzBdKQorCQkJZnByaW50ZihvLT5maWxlLCAiJXMlcyVzXG4iLCBzZXQsIHhmcm1fbXNnLCByZXNldCk7CisJfQorCWVsc2UgeworCQlpZiAob25lLT5tb2RlICE9IHR3by0+bW9kZSkgeworCQkJZnByaW50ZihvLT5maWxlLCAiJXNvbGQgbW9kZSAlMDZvJXNcbiIsIHNldCwgb25lLT5tb2RlLCByZXNldCk7CisJCQlmcHJpbnRmKG8tPmZpbGUsICIlc25ldyBtb2RlICUwNm8lc1xuIiwgc2V0LCB0d28tPm1vZGUsIHJlc2V0KTsKKwkJfQorCQlpZiAoeGZybV9tc2cgJiYgeGZybV9tc2dbMF0pCisJCQlmcHJpbnRmKG8tPmZpbGUsICIlcyVzJXNcbiIsIHNldCwgeGZybV9tc2csIHJlc2V0KTsKKwkJLyoKKwkJICogd2UgZG8gbm90IHJ1biBkaWZmIGJldHdlZW4gZGlmZmVyZW50IGtpbmQKKwkJICogb2Ygb2JqZWN0cy4KKwkJICovCisJCWlmICgob25lLT5tb2RlIF4gdHdvLT5tb2RlKSAmIFNfSUZNVCkKKwkJCWdvdG8gZnJlZV9hYl9hbmRfcmV0dXJuOworCQlpZiAoY29tcGxldGVfcmV3cml0ZSkgeworCQkJZW1pdF9yZXdyaXRlX2RpZmYobmFtZV9hLCBuYW1lX2IsIG9uZSwgdHdvLCBvKTsKKwkJCW8tPmZvdW5kX2NoYW5nZXMgPSAxOworCQkJZ290byBmcmVlX2FiX2FuZF9yZXR1cm47CisJCX0KKwl9CisKKwlpZiAoZmlsbF9tbWZpbGUoJm1mMSwgb25lKSA8IDAgfHwgZmlsbF9tbWZpbGUoJm1mMiwgdHdvKSA8IDApCisJCWRpZSgidW5hYmxlIHRvIHJlYWQgZmlsZXMgdG8gZGlmZiIpOworCisJaWYgKCFESUZGX09QVF9UU1QobywgVEVYVCkgJiYKKwkgICAgKGRpZmZfZmlsZXNwZWNfaXNfYmluYXJ5KG9uZSkgfHwgZGlmZl9maWxlc3BlY19pc19iaW5hcnkodHdvKSkpIHsKKwkJLyogUXVpdGUgY29tbW9uIGNvbmZ1c2luZyBjYXNlICovCisJCWlmIChtZjEuc2l6ZSA9PSBtZjIuc2l6ZSAmJgorCQkgICAgIW1lbWNtcChtZjEucHRyLCBtZjIucHRyLCBtZjEuc2l6ZSkpCisJCQlnb3RvIGZyZWVfYWJfYW5kX3JldHVybjsKKwkJaWYgKERJRkZfT1BUX1RTVChvLCBCSU5BUlkpKQorCQkJZW1pdF9iaW5hcnlfZGlmZihvLT5maWxlLCAmbWYxLCAmbWYyKTsKKwkJZWxzZQorCQkJZnByaW50ZihvLT5maWxlLCAiQmluYXJ5IGZpbGVzICVzIGFuZCAlcyBkaWZmZXJcbiIsCisJCQkJbGJsWzBdLCBsYmxbMV0pOworCQlvLT5mb3VuZF9jaGFuZ2VzID0gMTsKKwl9CisJZWxzZSB7CisJCS8qIENyYXp5IHhkbCBpbnRlcmZhY2VzLi4gKi8KKwkJY29uc3QgY2hhciAqZGlmZm9wdHMgPSBnZXRlbnYoIkdJVF9ESUZGX09QVFMiKTsKKwkJeHBwYXJhbV90IHhwcDsKKwkJeGRlbWl0Y29uZl90IHhlY2ZnOworCQl4ZGVtaXRjYl90IGVjYjsKKwkJc3RydWN0IGVtaXRfY2FsbGJhY2sgZWNiZGF0YTsKKwkJY29uc3QgY2hhciAqZnVuY25hbWVfcGF0dGVybjsKKworCQlmdW5jbmFtZV9wYXR0ZXJuID0gZGlmZl9mdW5jbmFtZV9wYXR0ZXJuKG9uZSk7CisJCWlmICghZnVuY25hbWVfcGF0dGVybikKKwkJCWZ1bmNuYW1lX3BhdHRlcm4gPSBkaWZmX2Z1bmNuYW1lX3BhdHRlcm4odHdvKTsKKworCQltZW1zZXQoJnhlY2ZnLCAwLCBzaXplb2YoeGVjZmcpKTsKKwkJbWVtc2V0KCZlY2JkYXRhLCAwLCBzaXplb2YoZWNiZGF0YSkpOworCQllY2JkYXRhLmxhYmVsX3BhdGggPSBsYmw7CisJCWVjYmRhdGEuY29sb3JfZGlmZiA9IERJRkZfT1BUX1RTVChvLCBDT0xPUl9ESUZGKTsKKwkJZWNiZGF0YS5mb3VuZF9jaGFuZ2VzcCA9ICZvLT5mb3VuZF9jaGFuZ2VzOworCQllY2JkYXRhLndzX3J1bGUgPSB3aGl0ZXNwYWNlX3J1bGUobmFtZV9iID8gbmFtZV9iIDogbmFtZV9hKTsKKwkJZWNiZGF0YS5maWxlID0gby0+ZmlsZTsKKwkJeHBwLmZsYWdzID0gWERGX05FRURfTUlOSU1BTCB8IG8tPnhkbF9vcHRzOworCQl4ZWNmZy5jdHhsZW4gPSBvLT5jb250ZXh0OworCQl4ZWNmZy5mbGFncyA9IFhETF9FTUlUX0ZVTkNOQU1FUzsKKwkJaWYgKGZ1bmNuYW1lX3BhdHRlcm4pCisJCQl4ZGlmZl9zZXRfZmluZF9mdW5jKCZ4ZWNmZywgZnVuY25hbWVfcGF0dGVybik7CisJCWlmICghZGlmZm9wdHMpCisJCQk7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoZGlmZm9wdHMsICItLXVuaWZpZWQ9IikpCisJCQl4ZWNmZy5jdHhsZW4gPSBzdHJ0b3VsKGRpZmZvcHRzICsgMTAsIE5VTEwsIDEwKTsKKwkJZWxzZSBpZiAoIXByZWZpeGNtcChkaWZmb3B0cywgIi11IikpCisJCQl4ZWNmZy5jdHhsZW4gPSBzdHJ0b3VsKGRpZmZvcHRzICsgMiwgTlVMTCwgMTApOworCQllY2Iub3V0ZiA9IHhkaWZmX291dGY7CisJCWVjYi5wcml2ID0gJmVjYmRhdGE7CisJCWVjYmRhdGEueG0uY29uc3VtZSA9IGZuX291dF9jb25zdW1lOworCQlpZiAoRElGRl9PUFRfVFNUKG8sIENPTE9SX0RJRkZfV09SRFMpKSB7CisJCQllY2JkYXRhLmRpZmZfd29yZHMgPQorCQkJCXhjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBkaWZmX3dvcmRzX2RhdGEpKTsKKwkJCWVjYmRhdGEuZGlmZl93b3Jkcy0+ZmlsZSA9IG8tPmZpbGU7CisJCX0KKwkJeGRpX2RpZmYoJm1mMSwgJm1mMiwgJnhwcCwgJnhlY2ZnLCAmZWNiKTsKKwkJaWYgKERJRkZfT1BUX1RTVChvLCBDT0xPUl9ESUZGX1dPUkRTKSkKKwkJCWZyZWVfZGlmZl93b3Jkc19kYXRhKCZlY2JkYXRhKTsKKwl9CisKKyBmcmVlX2FiX2FuZF9yZXR1cm46CisJZGlmZl9mcmVlX2ZpbGVzcGVjX2RhdGEob25lKTsKKwlkaWZmX2ZyZWVfZmlsZXNwZWNfZGF0YSh0d28pOworCWZyZWUoYV9vbmUpOworCWZyZWUoYl90d28pOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgYnVpbHRpbl9kaWZmc3RhdChjb25zdCBjaGFyICpuYW1lX2EsIGNvbnN0IGNoYXIgKm5hbWVfYiwKKwkJCSAgICAgc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSwKKwkJCSAgICAgc3RydWN0IGRpZmZfZmlsZXNwZWMgKnR3bywKKwkJCSAgICAgc3RydWN0IGRpZmZzdGF0X3QgKmRpZmZzdGF0LAorCQkJICAgICBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvLAorCQkJICAgICBpbnQgY29tcGxldGVfcmV3cml0ZSkKK3sKKwltbWZpbGVfdCBtZjEsIG1mMjsKKwlzdHJ1Y3QgZGlmZnN0YXRfZmlsZSAqZGF0YTsKKworCWRhdGEgPSBkaWZmc3RhdF9hZGQoZGlmZnN0YXQsIG5hbWVfYSwgbmFtZV9iKTsKKworCWlmICghb25lIHx8ICF0d28pIHsKKwkJZGF0YS0+aXNfdW5tZXJnZWQgPSAxOworCQlyZXR1cm47CisJfQorCWlmIChjb21wbGV0ZV9yZXdyaXRlKSB7CisJCWRpZmZfcG9wdWxhdGVfZmlsZXNwZWMob25lLCAwKTsKKwkJZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyh0d28sIDApOworCQlkYXRhLT5kZWxldGVkID0gY291bnRfbGluZXMob25lLT5kYXRhLCBvbmUtPnNpemUpOworCQlkYXRhLT5hZGRlZCA9IGNvdW50X2xpbmVzKHR3by0+ZGF0YSwgdHdvLT5zaXplKTsKKwkJZ290byBmcmVlX2FuZF9yZXR1cm47CisJfQorCWlmIChmaWxsX21tZmlsZSgmbWYxLCBvbmUpIDwgMCB8fCBmaWxsX21tZmlsZSgmbWYyLCB0d28pIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gcmVhZCBmaWxlcyB0byBkaWZmIik7CisKKwlpZiAoZGlmZl9maWxlc3BlY19pc19iaW5hcnkob25lKSB8fCBkaWZmX2ZpbGVzcGVjX2lzX2JpbmFyeSh0d28pKSB7CisJCWRhdGEtPmlzX2JpbmFyeSA9IDE7CisJCWRhdGEtPmFkZGVkID0gbWYyLnNpemU7CisJCWRhdGEtPmRlbGV0ZWQgPSBtZjEuc2l6ZTsKKwl9IGVsc2UgeworCQkvKiBDcmF6eSB4ZGwgaW50ZXJmYWNlcy4uICovCisJCXhwcGFyYW1fdCB4cHA7CisJCXhkZW1pdGNvbmZfdCB4ZWNmZzsKKwkJeGRlbWl0Y2JfdCBlY2I7CisKKwkJbWVtc2V0KCZ4ZWNmZywgMCwgc2l6ZW9mKHhlY2ZnKSk7CisJCXhwcC5mbGFncyA9IFhERl9ORUVEX01JTklNQUwgfCBvLT54ZGxfb3B0czsKKwkJZWNiLm91dGYgPSB4ZGlmZl9vdXRmOworCQllY2IucHJpdiA9IGRpZmZzdGF0OworCQl4ZGlfZGlmZigmbWYxLCAmbWYyLCAmeHBwLCAmeGVjZmcsICZlY2IpOworCX0KKworIGZyZWVfYW5kX3JldHVybjoKKwlkaWZmX2ZyZWVfZmlsZXNwZWNfZGF0YShvbmUpOworCWRpZmZfZnJlZV9maWxlc3BlY19kYXRhKHR3byk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWx0aW5fY2hlY2tkaWZmKGNvbnN0IGNoYXIgKm5hbWVfYSwgY29uc3QgY2hhciAqbmFtZV9iLAorCQkJICAgICAgY29uc3QgY2hhciAqYXR0cl9wYXRoLAorCQkJICAgICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLAorCQkJICAgICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqdHdvLCBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvKQoreworCW1tZmlsZV90IG1mMSwgbWYyOworCXN0cnVjdCBjaGVja2RpZmZfdCBkYXRhOworCisJaWYgKCF0d28pCisJCXJldHVybjsKKworCW1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKwlkYXRhLnhtLmNvbnN1bWUgPSBjaGVja2RpZmZfY29uc3VtZTsKKwlkYXRhLmZpbGVuYW1lID0gbmFtZV9iID8gbmFtZV9iIDogbmFtZV9hOworCWRhdGEubGluZW5vID0gMDsKKwlkYXRhLmNvbG9yX2RpZmYgPSBESUZGX09QVF9UU1QobywgQ09MT1JfRElGRik7CisJZGF0YS53c19ydWxlID0gd2hpdGVzcGFjZV9ydWxlKGF0dHJfcGF0aCk7CisJZGF0YS5maWxlID0gby0+ZmlsZTsKKworCWlmIChmaWxsX21tZmlsZSgmbWYxLCBvbmUpIDwgMCB8fCBmaWxsX21tZmlsZSgmbWYyLCB0d28pIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gcmVhZCBmaWxlcyB0byBkaWZmIik7CisKKwlpZiAoZGlmZl9maWxlc3BlY19pc19iaW5hcnkodHdvKSkKKwkJZ290byBmcmVlX2FuZF9yZXR1cm47CisJZWxzZSB7CisJCS8qIENyYXp5IHhkbCBpbnRlcmZhY2VzLi4gKi8KKwkJeHBwYXJhbV90IHhwcDsKKwkJeGRlbWl0Y29uZl90IHhlY2ZnOworCQl4ZGVtaXRjYl90IGVjYjsKKworCQltZW1zZXQoJnhlY2ZnLCAwLCBzaXplb2YoeGVjZmcpKTsKKwkJeHBwLmZsYWdzID0gWERGX05FRURfTUlOSU1BTDsKKwkJZWNiLm91dGYgPSB4ZGlmZl9vdXRmOworCQllY2IucHJpdiA9ICZkYXRhOworCQl4ZGlfZGlmZigmbWYxLCAmbWYyLCAmeHBwLCAmeGVjZmcsICZlY2IpOworCX0KKyBmcmVlX2FuZF9yZXR1cm46CisJZGlmZl9mcmVlX2ZpbGVzcGVjX2RhdGEob25lKTsKKwlkaWZmX2ZyZWVfZmlsZXNwZWNfZGF0YSh0d28pOworCWlmIChkYXRhLnN0YXR1cykKKwkJRElGRl9PUFRfU0VUKG8sIENIRUNLX0ZBSUxFRCk7Cit9CisKK3N0cnVjdCBkaWZmX2ZpbGVzcGVjICphbGxvY19maWxlc3BlYyhjb25zdCBjaGFyICpwYXRoKQoreworCWludCBuYW1lbGVuID0gc3RybGVuKHBhdGgpOworCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpzcGVjID0geG1hbGxvYyhzaXplb2YoKnNwZWMpICsgbmFtZWxlbiArIDEpOworCisJbWVtc2V0KHNwZWMsIDAsIHNpemVvZigqc3BlYykpOworCXNwZWMtPnBhdGggPSAoY2hhciAqKShzcGVjICsgMSk7CisJbWVtY3B5KHNwZWMtPnBhdGgsIHBhdGgsIG5hbWVsZW4rMSk7CisJc3BlYy0+Y291bnQgPSAxOworCXJldHVybiBzcGVjOworfQorCit2b2lkIGZyZWVfZmlsZXNwZWMoc3RydWN0IGRpZmZfZmlsZXNwZWMgKnNwZWMpCit7CisJaWYgKCEtLXNwZWMtPmNvdW50KSB7CisJCWRpZmZfZnJlZV9maWxlc3BlY19kYXRhKHNwZWMpOworCQlmcmVlKHNwZWMpOworCX0KK30KKwordm9pZCBmaWxsX2ZpbGVzcGVjKHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpzcGVjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkgICB1bnNpZ25lZCBzaG9ydCBtb2RlKQoreworCWlmIChtb2RlKSB7CisJCXNwZWMtPm1vZGUgPSBjYW5vbl9tb2RlKG1vZGUpOworCQloYXNoY3B5KHNwZWMtPnNoYTEsIHNoYTEpOworCQlzcGVjLT5zaGExX3ZhbGlkID0gIWlzX251bGxfc2hhMShzaGExKTsKKwl9Cit9CisKKy8qCisgKiBHaXZlbiBhIG5hbWUgYW5kIHNoYTEgcGFpciwgaWYgdGhlIGluZGV4IHRlbGxzIHVzIHRoZSBmaWxlIGluCisgKiB0aGUgd29yayB0cmVlIGhhcyB0aGF0IG9iamVjdCBjb250ZW50cywgcmV0dXJuIHRydWUsIHNvIHRoYXQKKyAqIHByZXBhcmVfdGVtcF9maWxlKCkgZG9lcyBub3QgaGF2ZSB0byBpbmZsYXRlIGFuZCBleHRyYWN0LgorICovCitzdGF0aWMgaW50IHJldXNlX3dvcmt0cmVlX2ZpbGUoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IHdhbnRfZmlsZSkKK3sKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlOworCXN0cnVjdCBzdGF0IHN0OworCWludCBwb3MsIGxlbjsKKworCS8qIFdlIGRvIG5vdCByZWFkIHRoZSBjYWNoZSBvdXJzZWx2ZXMgaGVyZSwgYmVjYXVzZSB0aGUKKwkgKiBiZW5jaG1hcmsgd2l0aCBteSBwcmV2aW91cyB2ZXJzaW9uIHRoYXQgYWx3YXlzIHJlYWRzIGNhY2hlCisJICogc2hvd3MgdGhhdCBpdCBtYWtlcyB0aGluZ3Mgd29yc2UgZm9yIGRpZmYtdHJlZSBjb21wYXJpbmcKKwkgKiB0d28gbGludXgtMi42IGtlcm5lbCB0cmVlcyBpbiBhbiBhbHJlYWR5IGNoZWNrZWQgb3V0IHdvcmsKKwkgKiB0cmVlLiAgVGhpcyBpcyBiZWNhdXNlIG1vc3QgZGlmZi10cmVlIGNvbXBhcmlzb25zIGRlYWwgd2l0aAorCSAqIG9ubHkgYSBzbWFsbCBudW1iZXIgb2YgZmlsZXMsIHdoaWxlIHJlYWRpbmcgdGhlIGNhY2hlIGlzCisJICogZXhwZW5zaXZlIGZvciBhIGxhcmdlIHByb2plY3QsIGFuZCBpdHMgY29zdCBvdXR3ZWlnaHMgdGhlCisJICogc2F2aW5ncyB3ZSBnZXQgYnkgbm90IGluZmxhdGluZyB0aGUgb2JqZWN0IHRvIGEgdGVtcG9yYXJ5CisJICogZmlsZS4gIFByYWN0aWNhbGx5LCB0aGlzIGNvZGUgb25seSBoZWxwcyB3aGVuIHdlIGFyZSB1c2VkCisJICogYnkgZGlmZi1jYWNoZSAtLWNhY2hlZCwgd2hpY2ggZG9lcyByZWFkIHRoZSBjYWNoZSBiZWZvcmUKKwkgKiBjYWxsaW5nIHVzLgorCSAqLworCWlmICghYWN0aXZlX2NhY2hlKQorCQlyZXR1cm4gMDsKKworCS8qIFdlIHdhbnQgdG8gYXZvaWQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGlmIG91ciBjYWxsZXIKKwkgKiBkb2Vzbid0IG5lZWQgdGhlIGRhdGEgaW4gYSBub3JtYWwgZmlsZSwgdGhpcyBzeXN0ZW0KKwkgKiBpcyByYXRoZXIgc2xvdyB3aXRoIGl0cyBzdGF0L29wZW4vbW1hcC9jbG9zZSBzeXNjYWxscywKKwkgKiBhbmQgdGhlIG9iamVjdCBpcyBjb250YWluZWQgaW4gYSBwYWNrIGZpbGUuICBUaGUgcGFjaworCSAqIGlzIHByb2JhYmx5IGFscmVhZHkgb3BlbiBhbmQgd2lsbCBiZSBmYXN0ZXIgdG8gb2J0YWluCisJICogdGhlIGRhdGEgdGhyb3VnaCB0aGFuIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4gIExvb3NlCisJICogb2JqZWN0cyBob3dldmVyIHdvdWxkIHRlbmQgdG8gYmUgc2xvd2VyIGFzIHRoZXkgbmVlZAorCSAqIHRvIGJlIGluZGl2aWR1YWxseSBvcGVuZWQgYW5kIGluZmxhdGVkLgorCSAqLworCWlmICghRkFTVF9XT1JLSU5HX0RJUkVDVE9SWSAmJiAhd2FudF9maWxlICYmIGhhc19zaGExX3BhY2soc2hhMSwgTlVMTCkpCisJCXJldHVybiAwOworCisJbGVuID0gc3RybGVuKG5hbWUpOworCXBvcyA9IGNhY2hlX25hbWVfcG9zKG5hbWUsIGxlbik7CisJaWYgKHBvcyA8IDApCisJCXJldHVybiAwOworCWNlID0gYWN0aXZlX2NhY2hlW3Bvc107CisKKwkvKgorCSAqIFRoaXMgaXMgbm90IHRoZSBzaGExIHdlIGFyZSBsb29raW5nIGZvciwgb3IKKwkgKiB1bnJldXNhYmxlIGJlY2F1c2UgaXQgaXMgbm90IGEgcmVndWxhciBmaWxlLgorCSAqLworCWlmIChoYXNoY21wKHNoYTEsIGNlLT5zaGExKSB8fCAhU19JU1JFRyhjZS0+Y2VfbW9kZSkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiBjZSBtYXRjaGVzIHRoZSBmaWxlIGluIHRoZSB3b3JrIHRyZWUsIHdlIGNhbiByZXVzZSBpdC4KKwkgKi8KKwlpZiAoY2VfdXB0b2RhdGUoY2UpIHx8CisJICAgICghbHN0YXQobmFtZSwgJnN0KSAmJiAhY2VfbWF0Y2hfc3RhdChjZSwgJnN0LCAwKSkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG9wdWxhdGVfZnJvbV9zdGRpbihzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqcykKK3sKKwlzdHJ1Y3Qgc3RyYnVmIGJ1ZjsKKwlzaXplX3Qgc2l6ZSA9IDA7CisKKwlzdHJidWZfaW5pdCgmYnVmLCAwKTsKKwlpZiAoc3RyYnVmX3JlYWQoJmJ1ZiwgMCwgMCkgPCAwKQorCQlyZXR1cm4gZXJyb3IoImVycm9yIHdoaWxlIHJlYWRpbmcgZnJvbSBzdGRpbiAlcyIsCisJCQkJICAgICBzdHJlcnJvcihlcnJubykpOworCisJcy0+c2hvdWxkX211bm1hcCA9IDA7CisJcy0+ZGF0YSA9IHN0cmJ1Zl9kZXRhY2goJmJ1ZiwgJnNpemUpOworCXMtPnNpemUgPSBzaXplOworCXMtPnNob3VsZF9mcmVlID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWZmX3BvcHVsYXRlX2dpdGxpbmsoc3RydWN0IGRpZmZfZmlsZXNwZWMgKnMsIGludCBzaXplX29ubHkpCit7CisJaW50IGxlbjsKKwljaGFyICpkYXRhID0geG1hbGxvYygxMDApOworCWxlbiA9IHNucHJpbnRmKGRhdGEsIDEwMCwKKwkJIlN1YnByb2plY3QgY29tbWl0ICVzXG4iLCBzaGExX3RvX2hleChzLT5zaGExKSk7CisJcy0+ZGF0YSA9IGRhdGE7CisJcy0+c2l6ZSA9IGxlbjsKKwlzLT5zaG91bGRfZnJlZSA9IDE7CisJaWYgKHNpemVfb25seSkgeworCQlzLT5kYXRhID0gTlVMTDsKKwkJZnJlZShkYXRhKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXaGlsZSBkb2luZyByZW5hbWUgZGV0ZWN0aW9uIGFuZCBwaWNrYXhlIG9wZXJhdGlvbiwgd2UgbWF5IG5lZWQgdG8KKyAqIGdyYWIgdGhlIGRhdGEgZm9yIHRoZSBibG9iIChvciBmaWxlKSBmb3Igb3VyIG93biBpbi1jb3JlIGNvbXBhcmlzb24uCisgKiBkaWZmX2ZpbGVzcGVjIGhhcyBkYXRhIGFuZCBzaXplIGZpZWxkcyBmb3IgdGhpcyBwdXJwb3NlLgorICovCitpbnQgZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqcywgaW50IHNpemVfb25seSkKK3sKKwlpbnQgZXJyID0gMDsKKwlpZiAoIURJRkZfRklMRV9WQUxJRChzKSkKKwkJZGllKCJpbnRlcm5hbCBlcnJvcjogYXNraW5nIHRvIHBvcHVsYXRlIGludmFsaWQgZmlsZS4iKTsKKwlpZiAoU19JU0RJUihzLT5tb2RlKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKHMtPmRhdGEpCisJCXJldHVybiAwOworCisJaWYgKHNpemVfb25seSAmJiAwIDwgcy0+c2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoU19JU0dJVExJTksocy0+bW9kZSkpCisJCXJldHVybiBkaWZmX3BvcHVsYXRlX2dpdGxpbmsocywgc2l6ZV9vbmx5KTsKKworCWlmICghcy0+c2hhMV92YWxpZCB8fAorCSAgICByZXVzZV93b3JrdHJlZV9maWxlKHMtPnBhdGgsIHMtPnNoYTEsIDApKSB7CisJCXN0cnVjdCBzdHJidWYgYnVmOworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJaW50IGZkOworCisJCWlmICghc3RyY21wKHMtPnBhdGgsICItIikpCisJCQlyZXR1cm4gcG9wdWxhdGVfZnJvbV9zdGRpbihzKTsKKworCQlpZiAobHN0YXQocy0+cGF0aCwgJnN0KSA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFTk9FTlQpIHsKKwkJCWVycl9lbXB0eToKKwkJCQllcnIgPSAtMTsKKwkJCWVtcHR5OgorCQkJCXMtPmRhdGEgPSAoY2hhciAqKSIiOworCQkJCXMtPnNpemUgPSAwOworCQkJCXJldHVybiBlcnI7CisJCQl9CisJCX0KKwkJcy0+c2l6ZSA9IHhzaXplX3Qoc3Quc3Rfc2l6ZSk7CisJCWlmICghcy0+c2l6ZSkKKwkJCWdvdG8gZW1wdHk7CisJCWlmIChzaXplX29ubHkpCisJCQlyZXR1cm4gMDsKKwkJaWYgKFNfSVNMTksoc3Quc3RfbW9kZSkpIHsKKwkJCWludCByZXQ7CisJCQlzLT5kYXRhID0geG1hbGxvYyhzLT5zaXplKTsKKwkJCXMtPnNob3VsZF9mcmVlID0gMTsKKwkJCXJldCA9IHJlYWRsaW5rKHMtPnBhdGgsIHMtPmRhdGEsIHMtPnNpemUpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlmcmVlKHMtPmRhdGEpOworCQkJCWdvdG8gZXJyX2VtcHR5OworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwkJZmQgPSBvcGVuKHMtPnBhdGgsIE9fUkRPTkxZKTsKKwkJaWYgKGZkIDwgMCkKKwkJCWdvdG8gZXJyX2VtcHR5OworCQlzLT5kYXRhID0geG1tYXAoTlVMTCwgcy0+c2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOworCQljbG9zZShmZCk7CisJCXMtPnNob3VsZF9tdW5tYXAgPSAxOworCisJCS8qCisJCSAqIENvbnZlcnQgZnJvbSB3b3JraW5nIHRyZWUgZm9ybWF0IHRvIGNhbm9uaWNhbCBnaXQgZm9ybWF0CisJCSAqLworCQlzdHJidWZfaW5pdCgmYnVmLCAwKTsKKwkJaWYgKGNvbnZlcnRfdG9fZ2l0KHMtPnBhdGgsIHMtPmRhdGEsIHMtPnNpemUsICZidWYsIHNhZmVfY3JsZikpIHsKKwkJCXNpemVfdCBzaXplID0gMDsKKwkJCW11bm1hcChzLT5kYXRhLCBzLT5zaXplKTsKKwkJCXMtPnNob3VsZF9tdW5tYXAgPSAwOworCQkJcy0+ZGF0YSA9IHN0cmJ1Zl9kZXRhY2goJmJ1ZiwgJnNpemUpOworCQkJcy0+c2l6ZSA9IHNpemU7CisJCQlzLT5zaG91bGRfZnJlZSA9IDE7CisJCX0KKwl9CisJZWxzZSB7CisJCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwkJaWYgKHNpemVfb25seSkKKwkJCXR5cGUgPSBzaGExX29iamVjdF9pbmZvKHMtPnNoYTEsICZzLT5zaXplKTsKKwkJZWxzZSB7CisJCQlzLT5kYXRhID0gcmVhZF9zaGExX2ZpbGUocy0+c2hhMSwgJnR5cGUsICZzLT5zaXplKTsKKwkJCXMtPnNob3VsZF9mcmVlID0gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBkaWZmX2ZyZWVfZmlsZXNwZWNfYmxvYihzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqcykKK3sKKwlpZiAocy0+c2hvdWxkX2ZyZWUpCisJCWZyZWUocy0+ZGF0YSk7CisJZWxzZSBpZiAocy0+c2hvdWxkX211bm1hcCkKKwkJbXVubWFwKHMtPmRhdGEsIHMtPnNpemUpOworCisJaWYgKHMtPnNob3VsZF9mcmVlIHx8IHMtPnNob3VsZF9tdW5tYXApIHsKKwkJcy0+c2hvdWxkX2ZyZWUgPSBzLT5zaG91bGRfbXVubWFwID0gMDsKKwkJcy0+ZGF0YSA9IE5VTEw7CisJfQorfQorCit2b2lkIGRpZmZfZnJlZV9maWxlc3BlY19kYXRhKHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpzKQoreworCWRpZmZfZnJlZV9maWxlc3BlY19ibG9iKHMpOworCWZyZWUocy0+Y250X2RhdGEpOworCXMtPmNudF9kYXRhID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcHJlcF90ZW1wX2Jsb2Ioc3RydWN0IGRpZmZfdGVtcGZpbGUgKnRlbXAsCisJCQkgICB2b2lkICpibG9iLAorCQkJICAgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCSAgIGludCBtb2RlKQoreworCWludCBmZDsKKworCWZkID0gZ2l0X21rc3RlbXAodGVtcC0+dG1wX3BhdGgsIFBBVEhfTUFYLCAiLmRpZmZfWFhYWFhYIik7CisJaWYgKGZkIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gY3JlYXRlIHRlbXAtZmlsZTogJXMiLCBzdHJlcnJvcihlcnJubykpOworCWlmICh3cml0ZV9pbl9mdWxsKGZkLCBibG9iLCBzaXplKSAhPSBzaXplKQorCQlkaWUoInVuYWJsZSB0byB3cml0ZSB0ZW1wLWZpbGUiKTsKKwljbG9zZShmZCk7CisJdGVtcC0+bmFtZSA9IHRlbXAtPnRtcF9wYXRoOworCXN0cmNweSh0ZW1wLT5oZXgsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwl0ZW1wLT5oZXhbNDBdID0gMDsKKwlzcHJpbnRmKHRlbXAtPm1vZGUsICIlMDZvIiwgbW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIHByZXBhcmVfdGVtcF9maWxlKGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgICBzdHJ1Y3QgZGlmZl90ZW1wZmlsZSAqdGVtcCwKKwkJCSAgICAgIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUpCit7CisJaWYgKCFESUZGX0ZJTEVfVkFMSUQob25lKSkgeworCW5vdF9hX3ZhbGlkX2ZpbGU6CisJCS8qIEEgJy0nIGVudHJ5IHByb2R1Y2VzIHRoaXMgZm9yIGZpbGUtMiwgYW5kCisJCSAqIGEgJysnIGVudHJ5IHByb2R1Y2VzIHRoaXMgZm9yIGZpbGUtMS4KKwkJICovCisJCXRlbXAtPm5hbWUgPSAiL2Rldi9udWxsIjsKKwkJc3RyY3B5KHRlbXAtPmhleCwgIi4iKTsKKwkJc3RyY3B5KHRlbXAtPm1vZGUsICIuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIW9uZS0+c2hhMV92YWxpZCB8fAorCSAgICByZXVzZV93b3JrdHJlZV9maWxlKG5hbWUsIG9uZS0+c2hhMSwgMSkpIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWlmIChsc3RhdChuYW1lLCAmc3QpIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVOT0VOVCkKKwkJCQlnb3RvIG5vdF9hX3ZhbGlkX2ZpbGU7CisJCQlkaWUoInN0YXQoJXMpOiAlcyIsIG5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCX0KKwkJaWYgKFNfSVNMTksoc3Quc3RfbW9kZSkpIHsKKwkJCWludCByZXQ7CisJCQljaGFyIGJ1ZltQQVRIX01BWCArIDFdOyAvKiBvdWdodCB0byBiZSBTWU1MSU5LX01BWCAqLworCQkJc2l6ZV90IHN6ID0geHNpemVfdChzdC5zdF9zaXplKTsKKwkJCWlmIChzaXplb2YoYnVmKSA8PSBzdC5zdF9zaXplKQorCQkJCWRpZSgic3ltbGluayB0b28gbG9uZzogJXMiLCBuYW1lKTsKKwkJCXJldCA9IHJlYWRsaW5rKG5hbWUsIGJ1Ziwgc3opOworCQkJaWYgKHJldCA8IDApCisJCQkJZGllKCJyZWFkbGluayglcykiLCBuYW1lKTsKKwkJCXByZXBfdGVtcF9ibG9iKHRlbXAsIGJ1Ziwgc3osCisJCQkJICAgICAgIChvbmUtPnNoYTFfdmFsaWQgPworCQkJCQlvbmUtPnNoYTEgOiBudWxsX3NoYTEpLAorCQkJCSAgICAgICAob25lLT5zaGExX3ZhbGlkID8KKwkJCQkJb25lLT5tb2RlIDogU19JRkxOSykpOworCQl9CisJCWVsc2UgeworCQkJLyogd2UgY2FuIGJvcnJvdyBmcm9tIHRoZSBmaWxlIGluIHRoZSB3b3JrIHRyZWUgKi8KKwkJCXRlbXAtPm5hbWUgPSBuYW1lOworCQkJaWYgKCFvbmUtPnNoYTFfdmFsaWQpCisJCQkJc3RyY3B5KHRlbXAtPmhleCwgc2hhMV90b19oZXgobnVsbF9zaGExKSk7CisJCQllbHNlCisJCQkJc3RyY3B5KHRlbXAtPmhleCwgc2hhMV90b19oZXgob25lLT5zaGExKSk7CisJCQkvKiBFdmVuIHRob3VnaCB3ZSBtYXkgc29tZXRpbWVzIGJvcnJvdyB0aGUKKwkJCSAqIGNvbnRlbnRzIGZyb20gdGhlIHdvcmsgdHJlZSwgd2UgYWx3YXlzIHdhbnQKKwkJCSAqIG9uZS0+bW9kZS4gIG1vZGUgaXMgdHJ1c3R3b3J0aHkgZXZlbiB3aGVuCisJCQkgKiAhKG9uZS0+c2hhMV92YWxpZCksIGFzIGxvbmcgYXMKKwkJCSAqIERJRkZfRklMRV9WQUxJRChvbmUpLgorCQkJICovCisJCQlzcHJpbnRmKHRlbXAtPm1vZGUsICIlMDZvIiwgb25lLT5tb2RlKTsKKwkJfQorCQlyZXR1cm47CisJfQorCWVsc2UgeworCQlpZiAoZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhvbmUsIDApKQorCQkJZGllKCJjYW5ub3QgcmVhZCBkYXRhIGJsb2IgZm9yICVzIiwgb25lLT5wYXRoKTsKKwkJcHJlcF90ZW1wX2Jsb2IodGVtcCwgb25lLT5kYXRhLCBvbmUtPnNpemUsCisJCQkgICAgICAgb25lLT5zaGExLCBvbmUtPm1vZGUpOworCX0KK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX3RlbXBmaWxlKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQlpZiAoZGlmZl90ZW1wW2ldLm5hbWUgPT0gZGlmZl90ZW1wW2ldLnRtcF9wYXRoKSB7CisJCQl1bmxpbmsoZGlmZl90ZW1wW2ldLm5hbWUpOworCQkJZGlmZl90ZW1wW2ldLm5hbWUgPSBOVUxMOworCQl9Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV90ZW1wZmlsZV9vbl9zaWduYWwoaW50IHNpZ25vKQoreworCXJlbW92ZV90ZW1wZmlsZSgpOworCXNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworCXJhaXNlKHNpZ25vKTsKK30KKworLyogQW4gZXh0ZXJuYWwgZGlmZiBjb21tYW5kIHRha2VzOgorICoKKyAqIGRpZmYtY21kIG5hbWUgaW5maWxlMSBpbmZpbGUxLXNoYTEgaW5maWxlMS1tb2RlIFwKKyAqICAgICAgICAgICAgICAgaW5maWxlMiBpbmZpbGUyLXNoYTEgaW5maWxlMi1tb2RlIFsgcmVuYW1lLXRvIF0KKyAqCisgKi8KK3N0YXRpYyB2b2lkIHJ1bl9leHRlcm5hbF9kaWZmKGNvbnN0IGNoYXIgKnBnbSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgICBjb25zdCBjaGFyICpvdGhlciwKKwkJCSAgICAgIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUsCisJCQkgICAgICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqdHdvLAorCQkJICAgICAgY29uc3QgY2hhciAqeGZybV9tc2csCisJCQkgICAgICBpbnQgY29tcGxldGVfcmV3cml0ZSkKK3sKKwljb25zdCBjaGFyICpzcGF3bl9hcmdbMTBdOworCXN0cnVjdCBkaWZmX3RlbXBmaWxlICp0ZW1wID0gZGlmZl90ZW1wOworCWludCByZXR2YWw7CisJc3RhdGljIGludCBhdGV4aXRfYXNrZWQgPSAwOworCWNvbnN0IGNoYXIgKm90aGVybmFtZTsKKwljb25zdCBjaGFyICoqYXJnID0gJnNwYXduX2FyZ1swXTsKKworCW90aGVybmFtZSA9IChvdGhlcj8gb3RoZXIgOiBuYW1lKTsKKwlpZiAob25lICYmIHR3bykgeworCQlwcmVwYXJlX3RlbXBfZmlsZShuYW1lLCAmdGVtcFswXSwgb25lKTsKKwkJcHJlcGFyZV90ZW1wX2ZpbGUob3RoZXJuYW1lLCAmdGVtcFsxXSwgdHdvKTsKKwkJaWYgKCEgYXRleGl0X2Fza2VkICYmCisJCSAgICAodGVtcFswXS5uYW1lID09IHRlbXBbMF0udG1wX3BhdGggfHwKKwkJICAgICB0ZW1wWzFdLm5hbWUgPT0gdGVtcFsxXS50bXBfcGF0aCkpIHsKKwkJCWF0ZXhpdF9hc2tlZCA9IDE7CisJCQlhdGV4aXQocmVtb3ZlX3RlbXBmaWxlKTsKKwkJfQorCQlzaWduYWwoU0lHSU5ULCByZW1vdmVfdGVtcGZpbGVfb25fc2lnbmFsKTsKKwl9CisKKwlpZiAob25lICYmIHR3bykgeworCQkqYXJnKysgPSBwZ207CisJCSphcmcrKyA9IG5hbWU7CisJCSphcmcrKyA9IHRlbXBbMF0ubmFtZTsKKwkJKmFyZysrID0gdGVtcFswXS5oZXg7CisJCSphcmcrKyA9IHRlbXBbMF0ubW9kZTsKKwkJKmFyZysrID0gdGVtcFsxXS5uYW1lOworCQkqYXJnKysgPSB0ZW1wWzFdLmhleDsKKwkJKmFyZysrID0gdGVtcFsxXS5tb2RlOworCQlpZiAob3RoZXIpIHsKKwkJCSphcmcrKyA9IG90aGVyOworCQkJKmFyZysrID0geGZybV9tc2c7CisJCX0KKwl9IGVsc2UgeworCQkqYXJnKysgPSBwZ207CisJCSphcmcrKyA9IG5hbWU7CisJfQorCSphcmcgPSBOVUxMOworCWZmbHVzaChOVUxMKTsKKwlyZXR2YWwgPSBydW5fY29tbWFuZF92X29wdChzcGF3bl9hcmcsIDApOworCXJlbW92ZV90ZW1wZmlsZSgpOworCWlmIChyZXR2YWwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJleHRlcm5hbCBkaWZmIGRpZWQsIHN0b3BwaW5nIGF0ICVzLlxuIiwgbmFtZSk7CisJCWV4aXQoMSk7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZXJuYWxfZGlmZl9hdHRyKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGdpdF9hdHRyX2NoZWNrIGF0dHJfZGlmZl9jaGVjazsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzZXR1cF9kaWZmX2F0dHJfY2hlY2soJmF0dHJfZGlmZl9jaGVjayk7CisJaWYgKCFnaXRfY2hlY2thdHRyKG5hbWUsIDEsICZhdHRyX2RpZmZfY2hlY2spKSB7CisJCWNvbnN0IGNoYXIgKnZhbHVlID0gYXR0cl9kaWZmX2NoZWNrLnZhbHVlOworCQlpZiAoIUFUVFJfVFJVRSh2YWx1ZSkgJiYKKwkJICAgICFBVFRSX0ZBTFNFKHZhbHVlKSAmJgorCQkgICAgIUFUVFJfVU5TRVQodmFsdWUpKSB7CisJCQlzdHJ1Y3QgbGxfZGlmZl9kcml2ZXIgKmRydjsKKworCQkJZm9yIChkcnYgPSB1c2VyX2RpZmY7IGRydjsgZHJ2ID0gZHJ2LT5uZXh0KQorCQkJCWlmICghc3RyY21wKGRydi0+bmFtZSwgdmFsdWUpKQorCQkJCQlyZXR1cm4gZHJ2LT5jbWQ7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHJ1bl9kaWZmX2NtZChjb25zdCBjaGFyICpwZ20sCisJCQkgY29uc3QgY2hhciAqbmFtZSwKKwkJCSBjb25zdCBjaGFyICpvdGhlciwKKwkJCSBjb25zdCBjaGFyICphdHRyX3BhdGgsCisJCQkgc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSwKKwkJCSBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqdHdvLAorCQkJIGNvbnN0IGNoYXIgKnhmcm1fbXNnLAorCQkJIHN0cnVjdCBkaWZmX29wdGlvbnMgKm8sCisJCQkgaW50IGNvbXBsZXRlX3Jld3JpdGUpCit7CisJaWYgKCFESUZGX09QVF9UU1QobywgQUxMT1dfRVhURVJOQUwpKQorCQlwZ20gPSBOVUxMOworCWVsc2UgeworCQljb25zdCBjaGFyICpjbWQgPSBleHRlcm5hbF9kaWZmX2F0dHIoYXR0cl9wYXRoKTsKKwkJaWYgKGNtZCkKKwkJCXBnbSA9IGNtZDsKKwl9CisKKwlpZiAocGdtKSB7CisJCXJ1bl9leHRlcm5hbF9kaWZmKHBnbSwgbmFtZSwgb3RoZXIsIG9uZSwgdHdvLCB4ZnJtX21zZywKKwkJCQkgIGNvbXBsZXRlX3Jld3JpdGUpOworCQlyZXR1cm47CisJfQorCWlmIChvbmUgJiYgdHdvKQorCQlidWlsdGluX2RpZmYobmFtZSwgb3RoZXIgPyBvdGhlciA6IG5hbWUsCisJCQkgICAgIG9uZSwgdHdvLCB4ZnJtX21zZywgbywgY29tcGxldGVfcmV3cml0ZSk7CisJZWxzZQorCQlmcHJpbnRmKG8tPmZpbGUsICIqIFVubWVyZ2VkIHBhdGggJXNcbiIsIG5hbWUpOworfQorCitzdGF0aWMgdm9pZCBkaWZmX2ZpbGxfc2hhMV9pbmZvKHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUpCit7CisJaWYgKERJRkZfRklMRV9WQUxJRChvbmUpKSB7CisJCWlmICghb25lLT5zaGExX3ZhbGlkKSB7CisJCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJCWlmICghc3RyY21wKG9uZS0+cGF0aCwgIi0iKSkgeworCQkJCWhhc2hjcHkob25lLT5zaGExLCBudWxsX3NoYTEpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChsc3RhdChvbmUtPnBhdGgsICZzdCkgPCAwKQorCQkJCWRpZSgic3RhdCAlcyIsIG9uZS0+cGF0aCk7CisJCQlpZiAoaW5kZXhfcGF0aChvbmUtPnNoYTEsIG9uZS0+cGF0aCwgJnN0LCAwKSkKKwkJCQlkaWUoImNhbm5vdCBoYXNoICVzXG4iLCBvbmUtPnBhdGgpOworCQl9CisJfQorCWVsc2UKKwkJaGFzaGNscihvbmUtPnNoYTEpOworfQorCitzdGF0aWMgaW50IHNpbWlsYXJpdHlfaW5kZXgoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnApCit7CisJcmV0dXJuIHAtPnNjb3JlICogMTAwIC8gTUFYX1NDT1JFOworfQorCitzdGF0aWMgdm9pZCBzdHJpcF9wcmVmaXgoaW50IHByZWZpeF9sZW5ndGgsIGNvbnN0IGNoYXIgKipuYW1lcCwgY29uc3QgY2hhciAqKm90aGVycCkKK3sKKwkvKiBTdHJpcCB0aGUgcHJlZml4IGJ1dCBkbyBub3QgbW9sZXN0IC9kZXYvbnVsbCBhbmQgYWJzb2x1dGUgcGF0aHMgKi8KKwlpZiAoKm5hbWVwICYmICoqbmFtZXAgIT0gJy8nKQorCQkqbmFtZXAgKz0gcHJlZml4X2xlbmd0aDsKKwlpZiAoKm90aGVycCAmJiAqKm90aGVycCAhPSAnLycpCisJCSpvdGhlcnAgKz0gcHJlZml4X2xlbmd0aDsKK30KKworc3RhdGljIHZvaWQgcnVuX2RpZmYoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm8pCit7CisJY29uc3QgY2hhciAqcGdtID0gZXh0ZXJuYWxfZGlmZigpOworCXN0cnVjdCBzdHJidWYgbXNnOworCWNoYXIgKnhmcm1fbXNnOworCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUgPSBwLT5vbmU7CisJc3RydWN0IGRpZmZfZmlsZXNwZWMgKnR3byA9IHAtPnR3bzsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKm90aGVyOworCWNvbnN0IGNoYXIgKmF0dHJfcGF0aDsKKwlpbnQgY29tcGxldGVfcmV3cml0ZSA9IDA7CisKKwluYW1lICA9IHAtPm9uZS0+cGF0aDsKKwlvdGhlciA9IChzdHJjbXAobmFtZSwgcC0+dHdvLT5wYXRoKSA/IHAtPnR3by0+cGF0aCA6IE5VTEwpOworCWF0dHJfcGF0aCA9IG5hbWU7CisJaWYgKG8tPnByZWZpeF9sZW5ndGgpCisJCXN0cmlwX3ByZWZpeChvLT5wcmVmaXhfbGVuZ3RoLCAmbmFtZSwgJm90aGVyKTsKKworCWlmIChESUZGX1BBSVJfVU5NRVJHRUQocCkpIHsKKwkJcnVuX2RpZmZfY21kKHBnbSwgbmFtZSwgTlVMTCwgYXR0cl9wYXRoLAorCQkJICAgICBOVUxMLCBOVUxMLCBOVUxMLCBvLCAwKTsKKwkJcmV0dXJuOworCX0KKworCWRpZmZfZmlsbF9zaGExX2luZm8ob25lKTsKKwlkaWZmX2ZpbGxfc2hhMV9pbmZvKHR3byk7CisKKwlzdHJidWZfaW5pdCgmbXNnLCBQQVRIX01BWCAqIDIgKyAzMDApOworCXN3aXRjaCAocC0+c3RhdHVzKSB7CisJY2FzZSBESUZGX1NUQVRVU19DT1BJRUQ6CisJCXN0cmJ1Zl9hZGRmKCZtc2csICJzaW1pbGFyaXR5IGluZGV4ICVkJSUiLCBzaW1pbGFyaXR5X2luZGV4KHApKTsKKwkJc3RyYnVmX2FkZHN0cigmbXNnLCAiXG5jb3B5IGZyb20gIik7CisJCXF1b3RlX2Nfc3R5bGUobmFtZSwgJm1zZywgTlVMTCwgMCk7CisJCXN0cmJ1Zl9hZGRzdHIoJm1zZywgIlxuY29weSB0byAiKTsKKwkJcXVvdGVfY19zdHlsZShvdGhlciwgJm1zZywgTlVMTCwgMCk7CisJCXN0cmJ1Zl9hZGRjaCgmbXNnLCAnXG4nKTsKKwkJYnJlYWs7CisJY2FzZSBESUZGX1NUQVRVU19SRU5BTUVEOgorCQlzdHJidWZfYWRkZigmbXNnLCAic2ltaWxhcml0eSBpbmRleCAlZCUlIiwgc2ltaWxhcml0eV9pbmRleChwKSk7CisJCXN0cmJ1Zl9hZGRzdHIoJm1zZywgIlxucmVuYW1lIGZyb20gIik7CisJCXF1b3RlX2Nfc3R5bGUobmFtZSwgJm1zZywgTlVMTCwgMCk7CisJCXN0cmJ1Zl9hZGRzdHIoJm1zZywgIlxucmVuYW1lIHRvICIpOworCQlxdW90ZV9jX3N0eWxlKG90aGVyLCAmbXNnLCBOVUxMLCAwKTsKKwkJc3RyYnVmX2FkZGNoKCZtc2csICdcbicpOworCQlicmVhazsKKwljYXNlIERJRkZfU1RBVFVTX01PRElGSUVEOgorCQlpZiAocC0+c2NvcmUpIHsKKwkJCXN0cmJ1Zl9hZGRmKCZtc2csICJkaXNzaW1pbGFyaXR5IGluZGV4ICVkJSVcbiIsCisJCQkJCXNpbWlsYXJpdHlfaW5kZXgocCkpOworCQkJY29tcGxldGVfcmV3cml0ZSA9IDE7CisJCQlicmVhazsKKwkJfQorCQkvKiBmYWxsdGhydSAqLworCWRlZmF1bHQ6CisJCS8qIG5vdGhpbmcgKi8KKwkJOworCX0KKworCWlmIChoYXNoY21wKG9uZS0+c2hhMSwgdHdvLT5zaGExKSkgeworCQlpbnQgYWJicmV2ID0gRElGRl9PUFRfVFNUKG8sIEZVTExfSU5ERVgpID8gNDAgOiBERUZBVUxUX0FCQlJFVjsKKworCQlpZiAoRElGRl9PUFRfVFNUKG8sIEJJTkFSWSkpIHsKKwkJCW1tZmlsZV90IG1mOworCQkJaWYgKCghZmlsbF9tbWZpbGUoJm1mLCBvbmUpICYmIGRpZmZfZmlsZXNwZWNfaXNfYmluYXJ5KG9uZSkpIHx8CisJCQkgICAgKCFmaWxsX21tZmlsZSgmbWYsIHR3bykgJiYgZGlmZl9maWxlc3BlY19pc19iaW5hcnkodHdvKSkpCisJCQkJYWJicmV2ID0gNDA7CisJCX0KKwkJc3RyYnVmX2FkZGYoJm1zZywgImluZGV4ICUuKnMuLiUuKnMiLAorCQkJCWFiYnJldiwgc2hhMV90b19oZXgob25lLT5zaGExKSwKKwkJCQlhYmJyZXYsIHNoYTFfdG9faGV4KHR3by0+c2hhMSkpOworCQlpZiAob25lLT5tb2RlID09IHR3by0+bW9kZSkKKwkJCXN0cmJ1Zl9hZGRmKCZtc2csICIgJTA2byIsIG9uZS0+bW9kZSk7CisJCXN0cmJ1Zl9hZGRjaCgmbXNnLCAnXG4nKTsKKwl9CisKKwlpZiAobXNnLmxlbikKKwkJc3RyYnVmX3NldGxlbigmbXNnLCBtc2cubGVuIC0gMSk7CisJeGZybV9tc2cgPSBtc2cubGVuID8gbXNnLmJ1ZiA6IE5VTEw7CisKKwlpZiAoIXBnbSAmJgorCSAgICBESUZGX0ZJTEVfVkFMSUQob25lKSAmJiBESUZGX0ZJTEVfVkFMSUQodHdvKSAmJgorCSAgICAoU19JRk1UICYgb25lLT5tb2RlKSAhPSAoU19JRk1UICYgdHdvLT5tb2RlKSkgeworCQkvKiBhIGZpbGVwYWlyIHRoYXQgY2hhbmdlcyBiZXR3ZWVuIGZpbGUgYW5kIHN5bWxpbmsKKwkJICogbmVlZHMgdG8gYmUgc3BsaXQgaW50byBkZWxldGlvbiBhbmQgY3JlYXRpb24uCisJCSAqLworCQlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqbnVsbCA9IGFsbG9jX2ZpbGVzcGVjKHR3by0+cGF0aCk7CisJCXJ1bl9kaWZmX2NtZChOVUxMLCBuYW1lLCBvdGhlciwgYXR0cl9wYXRoLAorCQkJICAgICBvbmUsIG51bGwsIHhmcm1fbXNnLCBvLCAwKTsKKwkJZnJlZShudWxsKTsKKwkJbnVsbCA9IGFsbG9jX2ZpbGVzcGVjKG9uZS0+cGF0aCk7CisJCXJ1bl9kaWZmX2NtZChOVUxMLCBuYW1lLCBvdGhlciwgYXR0cl9wYXRoLAorCQkJICAgICBudWxsLCB0d28sIHhmcm1fbXNnLCBvLCAwKTsKKwkJZnJlZShudWxsKTsKKwl9CisJZWxzZQorCQlydW5fZGlmZl9jbWQocGdtLCBuYW1lLCBvdGhlciwgYXR0cl9wYXRoLAorCQkJICAgICBvbmUsIHR3bywgeGZybV9tc2csIG8sIGNvbXBsZXRlX3Jld3JpdGUpOworCisJc3RyYnVmX3JlbGVhc2UoJm1zZyk7Cit9CisKK3N0YXRpYyB2b2lkIHJ1bl9kaWZmc3RhdChzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCwgc3RydWN0IGRpZmZfb3B0aW9ucyAqbywKKwkJCSBzdHJ1Y3QgZGlmZnN0YXRfdCAqZGlmZnN0YXQpCit7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpvdGhlcjsKKwlpbnQgY29tcGxldGVfcmV3cml0ZSA9IDA7CisKKwlpZiAoRElGRl9QQUlSX1VOTUVSR0VEKHApKSB7CisJCS8qIHVubWVyZ2VkICovCisJCWJ1aWx0aW5fZGlmZnN0YXQocC0+b25lLT5wYXRoLCBOVUxMLCBOVUxMLCBOVUxMLCBkaWZmc3RhdCwgbywgMCk7CisJCXJldHVybjsKKwl9CisKKwluYW1lID0gcC0+b25lLT5wYXRoOworCW90aGVyID0gKHN0cmNtcChuYW1lLCBwLT50d28tPnBhdGgpID8gcC0+dHdvLT5wYXRoIDogTlVMTCk7CisKKwlpZiAoby0+cHJlZml4X2xlbmd0aCkKKwkJc3RyaXBfcHJlZml4KG8tPnByZWZpeF9sZW5ndGgsICZuYW1lLCAmb3RoZXIpOworCisJZGlmZl9maWxsX3NoYTFfaW5mbyhwLT5vbmUpOworCWRpZmZfZmlsbF9zaGExX2luZm8ocC0+dHdvKTsKKworCWlmIChwLT5zdGF0dXMgPT0gRElGRl9TVEFUVVNfTU9ESUZJRUQgJiYgcC0+c2NvcmUpCisJCWNvbXBsZXRlX3Jld3JpdGUgPSAxOworCWJ1aWx0aW5fZGlmZnN0YXQobmFtZSwgb3RoZXIsIHAtPm9uZSwgcC0+dHdvLCBkaWZmc3RhdCwgbywgY29tcGxldGVfcmV3cml0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJ1bl9jaGVja2RpZmYoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm8pCit7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpvdGhlcjsKKwljb25zdCBjaGFyICphdHRyX3BhdGg7CisKKwlpZiAoRElGRl9QQUlSX1VOTUVSR0VEKHApKSB7CisJCS8qIHVubWVyZ2VkICovCisJCXJldHVybjsKKwl9CisKKwluYW1lID0gcC0+b25lLT5wYXRoOworCW90aGVyID0gKHN0cmNtcChuYW1lLCBwLT50d28tPnBhdGgpID8gcC0+dHdvLT5wYXRoIDogTlVMTCk7CisJYXR0cl9wYXRoID0gb3RoZXIgPyBvdGhlciA6IG5hbWU7CisKKwlpZiAoby0+cHJlZml4X2xlbmd0aCkKKwkJc3RyaXBfcHJlZml4KG8tPnByZWZpeF9sZW5ndGgsICZuYW1lLCAmb3RoZXIpOworCisJZGlmZl9maWxsX3NoYTFfaW5mbyhwLT5vbmUpOworCWRpZmZfZmlsbF9zaGExX2luZm8ocC0+dHdvKTsKKworCWJ1aWx0aW5fY2hlY2tkaWZmKG5hbWUsIG90aGVyLCBhdHRyX3BhdGgsIHAtPm9uZSwgcC0+dHdvLCBvKTsKK30KKwordm9pZCBkaWZmX3NldHVwKHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMpCit7CisJbWVtc2V0KG9wdGlvbnMsIDAsIHNpemVvZigqb3B0aW9ucykpOworCisJb3B0aW9ucy0+ZmlsZSA9IHN0ZG91dDsKKworCW9wdGlvbnMtPmxpbmVfdGVybWluYXRpb24gPSAnXG4nOworCW9wdGlvbnMtPmJyZWFrX29wdCA9IC0xOworCW9wdGlvbnMtPnJlbmFtZV9saW1pdCA9IC0xOworCW9wdGlvbnMtPmRpcnN0YXRfcGVyY2VudCA9IDM7CisJb3B0aW9ucy0+Y29udGV4dCA9IDM7CisJb3B0aW9ucy0+bXNnX3NlcCA9ICIiOworCisJb3B0aW9ucy0+Y2hhbmdlID0gZGlmZl9jaGFuZ2U7CisJb3B0aW9ucy0+YWRkX3JlbW92ZSA9IGRpZmZfYWRkcmVtb3ZlOworCWlmIChkaWZmX3VzZV9jb2xvcl9kZWZhdWx0ID4gMCkKKwkJRElGRl9PUFRfU0VUKG9wdGlvbnMsIENPTE9SX0RJRkYpOworCWVsc2UKKwkJRElGRl9PUFRfQ0xSKG9wdGlvbnMsIENPTE9SX0RJRkYpOworCW9wdGlvbnMtPmRldGVjdF9yZW5hbWUgPSBkaWZmX2RldGVjdF9yZW5hbWVfZGVmYXVsdDsKKworCW9wdGlvbnMtPmFfcHJlZml4ID0gImEvIjsKKwlvcHRpb25zLT5iX3ByZWZpeCA9ICJiLyI7Cit9CisKK2ludCBkaWZmX3NldHVwX2RvbmUoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucykKK3sKKwlpbnQgY291bnQgPSAwOworCisJaWYgKG9wdGlvbnMtPm91dHB1dF9mb3JtYXQgJiBESUZGX0ZPUk1BVF9OQU1FKQorCQljb3VudCsrOworCWlmIChvcHRpb25zLT5vdXRwdXRfZm9ybWF0ICYgRElGRl9GT1JNQVRfTkFNRV9TVEFUVVMpCisJCWNvdW50Kys7CisJaWYgKG9wdGlvbnMtPm91dHB1dF9mb3JtYXQgJiBESUZGX0ZPUk1BVF9DSEVDS0RJRkYpCisJCWNvdW50Kys7CisJaWYgKG9wdGlvbnMtPm91dHB1dF9mb3JtYXQgJiBESUZGX0ZPUk1BVF9OT19PVVRQVVQpCisJCWNvdW50Kys7CisJaWYgKGNvdW50ID4gMSkKKwkJZGllKCItLW5hbWUtb25seSwgLS1uYW1lLXN0YXR1cywgLS1jaGVjayBhbmQgLXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSIpOworCisJaWYgKERJRkZfT1BUX1RTVChvcHRpb25zLCBGSU5EX0NPUElFU19IQVJERVIpKQorCQlvcHRpb25zLT5kZXRlY3RfcmVuYW1lID0gRElGRl9ERVRFQ1RfQ09QWTsKKworCWlmICghRElGRl9PUFRfVFNUKG9wdGlvbnMsIFJFTEFUSVZFX05BTUUpKQorCQlvcHRpb25zLT5wcmVmaXggPSBOVUxMOworCWlmIChvcHRpb25zLT5wcmVmaXgpCisJCW9wdGlvbnMtPnByZWZpeF9sZW5ndGggPSBzdHJsZW4ob3B0aW9ucy0+cHJlZml4KTsKKwllbHNlCisJCW9wdGlvbnMtPnByZWZpeF9sZW5ndGggPSAwOworCisJaWYgKG9wdGlvbnMtPm91dHB1dF9mb3JtYXQgJiAoRElGRl9GT1JNQVRfTkFNRSB8CisJCQkJICAgICAgRElGRl9GT1JNQVRfTkFNRV9TVEFUVVMgfAorCQkJCSAgICAgIERJRkZfRk9STUFUX0NIRUNLRElGRiB8CisJCQkJICAgICAgRElGRl9GT1JNQVRfTk9fT1VUUFVUKSkKKwkJb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCAmPSB+KERJRkZfRk9STUFUX1JBVyB8CisJCQkJCSAgICBESUZGX0ZPUk1BVF9OVU1TVEFUIHwKKwkJCQkJICAgIERJRkZfRk9STUFUX0RJRkZTVEFUIHwKKwkJCQkJICAgIERJRkZfRk9STUFUX1NIT1JUU1RBVCB8CisJCQkJCSAgICBESUZGX0ZPUk1BVF9ESVJTVEFUIHwKKwkJCQkJICAgIERJRkZfRk9STUFUX1NVTU1BUlkgfAorCQkJCQkgICAgRElGRl9GT1JNQVRfUEFUQ0gpOworCisJLyoKKwkgKiBUaGVzZSBjYXNlcyBhbHdheXMgbmVlZCByZWN1cnNpdmU7IHdlIGRvIG5vdCBkcm9wIGNhbGxlci1zdXBwbGllZAorCSAqIHJlY3Vyc2l2ZSBiaXRzIGZvciBvdGhlciBmb3JtYXRzIGhlcmUuCisJICovCisJaWYgKG9wdGlvbnMtPm91dHB1dF9mb3JtYXQgJiAoRElGRl9GT1JNQVRfUEFUQ0ggfAorCQkJCSAgICAgIERJRkZfRk9STUFUX05VTVNUQVQgfAorCQkJCSAgICAgIERJRkZfRk9STUFUX0RJRkZTVEFUIHwKKwkJCQkgICAgICBESUZGX0ZPUk1BVF9TSE9SVFNUQVQgfAorCQkJCSAgICAgIERJRkZfRk9STUFUX0RJUlNUQVQgfAorCQkJCSAgICAgIERJRkZfRk9STUFUX1NVTU1BUlkgfAorCQkJCSAgICAgIERJRkZfRk9STUFUX0NIRUNLRElGRikpCisJCURJRkZfT1BUX1NFVChvcHRpb25zLCBSRUNVUlNJVkUpOworCS8qCisJICogQWxzbyBwaWNrYXhlIHdvdWxkIG5vdCB3b3JrIHZlcnkgd2VsbCBpZiB5b3UgZG8gbm90IHNheSByZWN1cnNpdmUKKwkgKi8KKwlpZiAob3B0aW9ucy0+cGlja2F4ZSkKKwkJRElGRl9PUFRfU0VUKG9wdGlvbnMsIFJFQ1VSU0lWRSk7CisKKwlpZiAob3B0aW9ucy0+ZGV0ZWN0X3JlbmFtZSAmJiBvcHRpb25zLT5yZW5hbWVfbGltaXQgPCAwKQorCQlvcHRpb25zLT5yZW5hbWVfbGltaXQgPSBkaWZmX3JlbmFtZV9saW1pdF9kZWZhdWx0OworCWlmIChvcHRpb25zLT5zZXR1cCAmIERJRkZfU0VUVVBfVVNFX0NBQ0hFKSB7CisJCWlmICghYWN0aXZlX2NhY2hlKQorCQkJLyogcmVhZC1jYWNoZSBkb2VzIG5vdCBkaWUgZXZlbiB3aGVuIGl0IGZhaWxzCisJCQkgKiBzbyBpdCBpcyBzYWZlIGZvciB1cyB0byBkbyB0aGlzIGhlcmUuICBBbHNvCisJCQkgKiBpdCBkb2VzIG5vdCBzbXVkZ2UgYWN0aXZlX2NhY2hlIG9yIGFjdGl2ZV9ucgorCQkJICogd2hlbiBpdCBmYWlscywgc28gd2UgZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQKKwkJCSAqIGNsZWFuaW5nIGl0IHVwIG91cnNlbHZlcyBlaXRoZXIuCisJCQkgKi8KKwkJCXJlYWRfY2FjaGUoKTsKKwl9CisJaWYgKG9wdGlvbnMtPmFiYnJldiA8PSAwIHx8IDQwIDwgb3B0aW9ucy0+YWJicmV2KQorCQlvcHRpb25zLT5hYmJyZXYgPSA0MDsgLyogZnVsbCAqLworCisJLyoKKwkgKiBJdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIHNob3cgdGhlIGZpcnN0IGhpdCB3ZSBoYXBwZW5lZAorCSAqIHRvIGhhdmUgZm91bmQuICBJdCBkb2VzIG5vdCBtYWtlIHNlbnNlIG5vdCB0byByZXR1cm4gd2l0aAorCSAqIGV4aXQgY29kZSBpbiBzdWNoIGEgY2FzZSBlaXRoZXIuCisJICovCisJaWYgKERJRkZfT1BUX1RTVChvcHRpb25zLCBRVUlFVCkpIHsKKwkJb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX05PX09VVFBVVDsKKwkJRElGRl9PUFRfU0VUKG9wdGlvbnMsIEVYSVRfV0lUSF9TVEFUVVMpOworCX0KKworCS8qCisJICogSWYgd2UgcG9zdHByb2Nlc3MgaW4gZGlmZmNvcmUsIHdlIGNhbm5vdCBzaW1wbHkgcmV0dXJuCisJICogdXBvbiB0aGUgZmlyc3QgaGl0LiAgV2UgbmVlZCB0byBydW4gZGlmZiBhcyB1c3VhbC4KKwkgKi8KKwlpZiAob3B0aW9ucy0+cGlja2F4ZSB8fCBvcHRpb25zLT5maWx0ZXIpCisJCURJRkZfT1BUX0NMUihvcHRpb25zLCBRVUlFVCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcHRfYXJnKGNvbnN0IGNoYXIgKmFyZywgaW50IGFyZ19zaG9ydCwgY29uc3QgY2hhciAqYXJnX2xvbmcsIGludCAqdmFsKQoreworCWNoYXIgYywgKmVxOworCWludCBsZW47CisKKwlpZiAoKmFyZyAhPSAnLScpCisJCXJldHVybiAwOworCWMgPSAqKythcmc7CisJaWYgKCFjKQorCQlyZXR1cm4gMDsKKwlpZiAoYyA9PSBhcmdfc2hvcnQpIHsKKwkJYyA9ICorK2FyZzsKKwkJaWYgKCFjKQorCQkJcmV0dXJuIDE7CisJCWlmICh2YWwgJiYgaXNkaWdpdChjKSkgeworCQkJY2hhciAqZW5kOworCQkJaW50IG4gPSBzdHJ0b3VsKGFyZywgJmVuZCwgMTApOworCQkJaWYgKCplbmQpCisJCQkJcmV0dXJuIDA7CisJCQkqdmFsID0gbjsKKwkJCXJldHVybiAxOworCQl9CisJCXJldHVybiAwOworCX0KKwlpZiAoYyAhPSAnLScpCisJCXJldHVybiAwOworCWFyZysrOworCWVxID0gc3RyY2hyKGFyZywgJz0nKTsKKwlpZiAoZXEpCisJCWxlbiA9IGVxIC0gYXJnOworCWVsc2UKKwkJbGVuID0gc3RybGVuKGFyZyk7CisJaWYgKCFsZW4gfHwgc3RybmNtcChhcmcsIGFyZ19sb25nLCBsZW4pKQorCQlyZXR1cm4gMDsKKwlpZiAoZXEpIHsKKwkJaW50IG47CisJCWNoYXIgKmVuZDsKKwkJaWYgKCFpc2RpZ2l0KCorK2VxKSkKKwkJCXJldHVybiAwOworCQluID0gc3RydG91bChlcSwgJmVuZCwgMTApOworCQlpZiAoKmVuZCkKKwkJCXJldHVybiAwOworCQkqdmFsID0gbjsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZGlmZl9zY29yZW9wdF9wYXJzZShjb25zdCBjaGFyICpvcHQpOworCitpbnQgZGlmZl9vcHRfcGFyc2Uoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywgY29uc3QgY2hhciAqKmF2LCBpbnQgYWMpCit7CisJY29uc3QgY2hhciAqYXJnID0gYXZbMF07CisKKwkvKiBPdXRwdXQgZm9ybWF0IG9wdGlvbnMgKi8KKwlpZiAoIXN0cmNtcChhcmcsICItcCIpIHx8ICFzdHJjbXAoYXJnLCAiLXUiKSkKKwkJb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCB8PSBESUZGX0ZPUk1BVF9QQVRDSDsKKwllbHNlIGlmIChvcHRfYXJnKGFyZywgJ1UnLCAidW5pZmllZCIsICZvcHRpb25zLT5jb250ZXh0KSkKKwkJb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCB8PSBESUZGX0ZPUk1BVF9QQVRDSDsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tcmF3IikpCisJCW9wdGlvbnMtPm91dHB1dF9mb3JtYXQgfD0gRElGRl9GT1JNQVRfUkFXOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1wYXRjaC13aXRoLXJhdyIpKQorCQlvcHRpb25zLT5vdXRwdXRfZm9ybWF0IHw9IERJRkZfRk9STUFUX1BBVENIIHwgRElGRl9GT1JNQVRfUkFXOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1udW1zdGF0IikpCisJCW9wdGlvbnMtPm91dHB1dF9mb3JtYXQgfD0gRElGRl9GT1JNQVRfTlVNU1RBVDsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tc2hvcnRzdGF0IikpCisJCW9wdGlvbnMtPm91dHB1dF9mb3JtYXQgfD0gRElGRl9GT1JNQVRfU0hPUlRTVEFUOworCWVsc2UgaWYgKG9wdF9hcmcoYXJnLCAnWCcsICJkaXJzdGF0IiwgJm9wdGlvbnMtPmRpcnN0YXRfcGVyY2VudCkpCisJCW9wdGlvbnMtPm91dHB1dF9mb3JtYXQgfD0gRElGRl9GT1JNQVRfRElSU1RBVDsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tY3VtdWxhdGl2ZSIpKQorCQlvcHRpb25zLT5vdXRwdXRfZm9ybWF0IHw9IERJRkZfRk9STUFUX0NVTVVMQVRJVkU7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWNoZWNrIikpCisJCW9wdGlvbnMtPm91dHB1dF9mb3JtYXQgfD0gRElGRl9GT1JNQVRfQ0hFQ0tESUZGOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1zdW1tYXJ5IikpCisJCW9wdGlvbnMtPm91dHB1dF9mb3JtYXQgfD0gRElGRl9GT1JNQVRfU1VNTUFSWTsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tcGF0Y2gtd2l0aC1zdGF0IikpCisJCW9wdGlvbnMtPm91dHB1dF9mb3JtYXQgfD0gRElGRl9GT1JNQVRfUEFUQ0ggfCBESUZGX0ZPUk1BVF9ESUZGU1RBVDsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tbmFtZS1vbmx5IikpCisJCW9wdGlvbnMtPm91dHB1dF9mb3JtYXQgfD0gRElGRl9GT1JNQVRfTkFNRTsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tbmFtZS1zdGF0dXMiKSkKKwkJb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCB8PSBESUZGX0ZPUk1BVF9OQU1FX1NUQVRVUzsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi1zIikpCisJCW9wdGlvbnMtPm91dHB1dF9mb3JtYXQgfD0gRElGRl9GT1JNQVRfTk9fT1VUUFVUOworCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1zdGF0IikpIHsKKwkJY2hhciAqZW5kOworCQlpbnQgd2lkdGggPSBvcHRpb25zLT5zdGF0X3dpZHRoOworCQlpbnQgbmFtZV93aWR0aCA9IG9wdGlvbnMtPnN0YXRfbmFtZV93aWR0aDsKKwkJYXJnICs9IDY7CisJCWVuZCA9IChjaGFyICopYXJnOworCisJCXN3aXRjaCAoKmFyZykgeworCQljYXNlICctJzoKKwkJCWlmICghcHJlZml4Y21wKGFyZywgIi13aWR0aD0iKSkKKwkJCQl3aWR0aCA9IHN0cnRvdWwoYXJnICsgNywgJmVuZCwgMTApOworCQkJZWxzZSBpZiAoIXByZWZpeGNtcChhcmcsICItbmFtZS13aWR0aD0iKSkKKwkJCQluYW1lX3dpZHRoID0gc3RydG91bChhcmcgKyAxMiwgJmVuZCwgMTApOworCQkJYnJlYWs7CisJCWNhc2UgJz0nOgorCQkJd2lkdGggPSBzdHJ0b3VsKGFyZysxLCAmZW5kLCAxMCk7CisJCQlpZiAoKmVuZCA9PSAnLCcpCisJCQkJbmFtZV93aWR0aCA9IHN0cnRvdWwoZW5kKzEsICZlbmQsIDEwKTsKKwkJfQorCisJCS8qIEltcG9ydGFudCEgVGhpcyBjaGVja3MgYWxsIHRoZSBlcnJvciBjYXNlcyEgKi8KKwkJaWYgKCplbmQpCisJCQlyZXR1cm4gMDsKKwkJb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCB8PSBESUZGX0ZPUk1BVF9ESUZGU1RBVDsKKwkJb3B0aW9ucy0+c3RhdF9uYW1lX3dpZHRoID0gbmFtZV93aWR0aDsKKwkJb3B0aW9ucy0+c3RhdF93aWR0aCA9IHdpZHRoOworCX0KKworCS8qIHJlbmFtZXMgb3B0aW9ucyAqLworCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLUIiKSkgeworCQlpZiAoKG9wdGlvbnMtPmJyZWFrX29wdCA9IGRpZmZfc2NvcmVvcHRfcGFyc2UoYXJnKSkgPT0gLTEpCisJCQlyZXR1cm4gLTE7CisJfQorCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLU0iKSkgeworCQlpZiAoKG9wdGlvbnMtPnJlbmFtZV9zY29yZSA9IGRpZmZfc2NvcmVvcHRfcGFyc2UoYXJnKSkgPT0gLTEpCisJCQlyZXR1cm4gLTE7CisJCW9wdGlvbnMtPmRldGVjdF9yZW5hbWUgPSBESUZGX0RFVEVDVF9SRU5BTUU7CisJfQorCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLUMiKSkgeworCQlpZiAob3B0aW9ucy0+ZGV0ZWN0X3JlbmFtZSA9PSBESUZGX0RFVEVDVF9DT1BZKQorCQkJRElGRl9PUFRfU0VUKG9wdGlvbnMsIEZJTkRfQ09QSUVTX0hBUkRFUik7CisJCWlmICgob3B0aW9ucy0+cmVuYW1lX3Njb3JlID0gZGlmZl9zY29yZW9wdF9wYXJzZShhcmcpKSA9PSAtMSkKKwkJCXJldHVybiAtMTsKKwkJb3B0aW9ucy0+ZGV0ZWN0X3JlbmFtZSA9IERJRkZfREVURUNUX0NPUFk7CisJfQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1uby1yZW5hbWVzIikpCisJCW9wdGlvbnMtPmRldGVjdF9yZW5hbWUgPSAwOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1yZWxhdGl2ZSIpKQorCQlESUZGX09QVF9TRVQob3B0aW9ucywgUkVMQVRJVkVfTkFNRSk7CisJZWxzZSBpZiAoIXByZWZpeGNtcChhcmcsICItLXJlbGF0aXZlPSIpKSB7CisJCURJRkZfT1BUX1NFVChvcHRpb25zLCBSRUxBVElWRV9OQU1FKTsKKwkJb3B0aW9ucy0+cHJlZml4ID0gYXJnICsgMTE7CisJfQorCisJLyogeGRpZmYgb3B0aW9ucyAqLworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLXciKSB8fCAhc3RyY21wKGFyZywgIi0taWdub3JlLWFsbC1zcGFjZSIpKQorCQlvcHRpb25zLT54ZGxfb3B0cyB8PSBYREZfSUdOT1JFX1dISVRFU1BBQ0U7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItYiIpIHx8ICFzdHJjbXAoYXJnLCAiLS1pZ25vcmUtc3BhY2UtY2hhbmdlIikpCisJCW9wdGlvbnMtPnhkbF9vcHRzIHw9IFhERl9JR05PUkVfV0hJVEVTUEFDRV9DSEFOR0U7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWlnbm9yZS1zcGFjZS1hdC1lb2wiKSkKKwkJb3B0aW9ucy0+eGRsX29wdHMgfD0gWERGX0lHTk9SRV9XSElURVNQQUNFX0FUX0VPTDsKKworCS8qIGZsYWdzIG9wdGlvbnMgKi8KKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tYmluYXJ5IikpIHsKKwkJb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCB8PSBESUZGX0ZPUk1BVF9QQVRDSDsKKwkJRElGRl9PUFRfU0VUKG9wdGlvbnMsIEJJTkFSWSk7CisJfQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1mdWxsLWluZGV4IikpCisJCURJRkZfT1BUX1NFVChvcHRpb25zLCBGVUxMX0lOREVYKTsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi1hIikgfHwgIXN0cmNtcChhcmcsICItLXRleHQiKSkKKwkJRElGRl9PUFRfU0VUKG9wdGlvbnMsIFRFWFQpOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLVIiKSkKKwkJRElGRl9PUFRfU0VUKG9wdGlvbnMsIFJFVkVSU0VfRElGRik7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWZpbmQtY29waWVzLWhhcmRlciIpKQorCQlESUZGX09QVF9TRVQob3B0aW9ucywgRklORF9DT1BJRVNfSEFSREVSKTsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tZm9sbG93IikpCisJCURJRkZfT1BUX1NFVChvcHRpb25zLCBGT0xMT1dfUkVOQU1FUyk7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWNvbG9yIikpCisJCURJRkZfT1BUX1NFVChvcHRpb25zLCBDT0xPUl9ESUZGKTsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tbm8tY29sb3IiKSkKKwkJRElGRl9PUFRfQ0xSKG9wdGlvbnMsIENPTE9SX0RJRkYpOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1jb2xvci13b3JkcyIpKQorCQlvcHRpb25zLT5mbGFncyB8PSBESUZGX09QVF9DT0xPUl9ESUZGIHwgRElGRl9PUFRfQ09MT1JfRElGRl9XT1JEUzsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tZXhpdC1jb2RlIikpCisJCURJRkZfT1BUX1NFVChvcHRpb25zLCBFWElUX1dJVEhfU1RBVFVTKTsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tcXVpZXQiKSkKKwkJRElGRl9PUFRfU0VUKG9wdGlvbnMsIFFVSUVUKTsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tZXh0LWRpZmYiKSkKKwkJRElGRl9PUFRfU0VUKG9wdGlvbnMsIEFMTE9XX0VYVEVSTkFMKTsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tbm8tZXh0LWRpZmYiKSkKKwkJRElGRl9PUFRfQ0xSKG9wdGlvbnMsIEFMTE9XX0VYVEVSTkFMKTsKKworCS8qIG1pc2Mgb3B0aW9ucyAqLworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLXoiKSkKKwkJb3B0aW9ucy0+bGluZV90ZXJtaW5hdGlvbiA9IDA7CisJZWxzZSBpZiAoIXByZWZpeGNtcChhcmcsICItbCIpKQorCQlvcHRpb25zLT5yZW5hbWVfbGltaXQgPSBzdHJ0b3VsKGFyZysyLCBOVUxMLCAxMCk7CisJZWxzZSBpZiAoIXByZWZpeGNtcChhcmcsICItUyIpKQorCQlvcHRpb25zLT5waWNrYXhlID0gYXJnICsgMjsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tcGlja2F4ZS1hbGwiKSkKKwkJb3B0aW9ucy0+cGlja2F4ZV9vcHRzID0gRElGRl9QSUNLQVhFX0FMTDsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tcGlja2F4ZS1yZWdleCIpKQorCQlvcHRpb25zLT5waWNrYXhlX29wdHMgPSBESUZGX1BJQ0tBWEVfUkVHRVg7CisJZWxzZSBpZiAoIXByZWZpeGNtcChhcmcsICItTyIpKQorCQlvcHRpb25zLT5vcmRlcmZpbGUgPSBhcmcgKyAyOworCWVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1kaWZmLWZpbHRlcj0iKSkKKwkJb3B0aW9ucy0+ZmlsdGVyID0gYXJnICsgMTQ7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWFiYnJldiIpKQorCQlvcHRpb25zLT5hYmJyZXYgPSBERUZBVUxUX0FCQlJFVjsKKwllbHNlIGlmICghcHJlZml4Y21wKGFyZywgIi0tYWJicmV2PSIpKSB7CisJCW9wdGlvbnMtPmFiYnJldiA9IHN0cnRvdWwoYXJnICsgOSwgTlVMTCwgMTApOworCQlpZiAob3B0aW9ucy0+YWJicmV2IDwgTUlOSU1VTV9BQkJSRVYpCisJCQlvcHRpb25zLT5hYmJyZXYgPSBNSU5JTVVNX0FCQlJFVjsKKwkJZWxzZSBpZiAoNDAgPCBvcHRpb25zLT5hYmJyZXYpCisJCQlvcHRpb25zLT5hYmJyZXYgPSA0MDsKKwl9CisJZWxzZSBpZiAoIXByZWZpeGNtcChhcmcsICItLXNyYy1wcmVmaXg9IikpCisJCW9wdGlvbnMtPmFfcHJlZml4ID0gYXJnICsgMTM7CisJZWxzZSBpZiAoIXByZWZpeGNtcChhcmcsICItLWRzdC1wcmVmaXg9IikpCisJCW9wdGlvbnMtPmJfcHJlZml4ID0gYXJnICsgMTM7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLW5vLXByZWZpeCIpKQorCQlvcHRpb25zLT5hX3ByZWZpeCA9IG9wdGlvbnMtPmJfcHJlZml4ID0gIiI7CisJZWxzZSBpZiAoIXByZWZpeGNtcChhcmcsICItLW91dHB1dD0iKSkgeworCQlvcHRpb25zLT5maWxlID0gZm9wZW4oYXJnICsgc3RybGVuKCItLW91dHB1dD0iKSwgInciKTsKKwkJb3B0aW9ucy0+Y2xvc2VfZmlsZSA9IDE7CisJfSBlbHNlCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBhcnNlX251bShjb25zdCBjaGFyICoqY3BfcCkKK3sKKwl1bnNpZ25lZCBsb25nIG51bSwgc2NhbGU7CisJaW50IGNoLCBkb3Q7CisJY29uc3QgY2hhciAqY3AgPSAqY3BfcDsKKworCW51bSA9IDA7CisJc2NhbGUgPSAxOworCWRvdCA9IDA7CisJZm9yKDs7KSB7CisJCWNoID0gKmNwOworCQlpZiAoICFkb3QgJiYgY2ggPT0gJy4nICkgeworCQkJc2NhbGUgPSAxOworCQkJZG90ID0gMTsKKwkJfSBlbHNlIGlmICggY2ggPT0gJyUnICkgeworCQkJc2NhbGUgPSBkb3QgPyBzY2FsZSoxMDAgOiAxMDA7CisJCQljcCsrOwkvKiAlIGlzIGFsd2F5cyBhdCB0aGUgZW5kICovCisJCQlicmVhazsKKwkJfSBlbHNlIGlmICggY2ggPj0gJzAnICYmIGNoIDw9ICc5JyApIHsKKwkJCWlmICggc2NhbGUgPCAxMDAwMDAgKSB7CisJCQkJc2NhbGUgKj0gMTA7CisJCQkJbnVtID0gKG51bSoxMCkgKyAoY2gtJzAnKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJCWNwKys7CisJfQorCSpjcF9wID0gY3A7CisKKwkvKiB1c2VyIHNheXMgbnVtIGRpdmlkZWQgYnkgc2NhbGUgYW5kIHdlIHNheSBpbnRlcm5hbGx5IHRoYXQKKwkgKiBpcyBNQVhfU0NPUkUgKiBudW0gLyBzY2FsZS4KKwkgKi8KKwlyZXR1cm4gKGludCkoKG51bSA+PSBzY2FsZSkgPyBNQVhfU0NPUkUgOiAoTUFYX1NDT1JFICogbnVtIC8gc2NhbGUpKTsKK30KKworc3RhdGljIGludCBkaWZmX3Njb3Jlb3B0X3BhcnNlKGNvbnN0IGNoYXIgKm9wdCkKK3sKKwlpbnQgb3B0MSwgb3B0MiwgY21kOworCisJaWYgKCpvcHQrKyAhPSAnLScpCisJCXJldHVybiAtMTsKKwljbWQgPSAqb3B0Kys7CisJaWYgKGNtZCAhPSAnTScgJiYgY21kICE9ICdDJyAmJiBjbWQgIT0gJ0InKQorCQlyZXR1cm4gLTE7IC8qIHRoYXQgaXMgbm90IGEgLU0sIC1DIG5vciAtQiBvcHRpb24gKi8KKworCW9wdDEgPSBwYXJzZV9udW0oJm9wdCk7CisJaWYgKGNtZCAhPSAnQicpCisJCW9wdDIgPSAwOworCWVsc2UgeworCQlpZiAoKm9wdCA9PSAwKQorCQkJb3B0MiA9IDA7CisJCWVsc2UgaWYgKCpvcHQgIT0gJy8nKQorCQkJcmV0dXJuIC0xOyAvKiB3ZSBleHBlY3QgLUI4MC85OSBvciAtQjgwICovCisJCWVsc2UgeworCQkJb3B0Kys7CisJCQlvcHQyID0gcGFyc2VfbnVtKCZvcHQpOworCQl9CisJfQorCWlmICgqb3B0ICE9IDApCisJCXJldHVybiAtMTsKKwlyZXR1cm4gb3B0MSB8IChvcHQyIDw8IDE2KTsKK30KKworc3RydWN0IGRpZmZfcXVldWVfc3RydWN0IGRpZmZfcXVldWVkX2RpZmY7CisKK3ZvaWQgZGlmZl9xKHN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcXVldWUsIHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpkcCkKK3sKKwlpZiAocXVldWUtPmFsbG9jIDw9IHF1ZXVlLT5ucikgeworCQlxdWV1ZS0+YWxsb2MgPSBhbGxvY19ucihxdWV1ZS0+YWxsb2MpOworCQlxdWV1ZS0+cXVldWUgPSB4cmVhbGxvYyhxdWV1ZS0+cXVldWUsCisJCQkJCXNpemVvZihkcCkgKiBxdWV1ZS0+YWxsb2MpOworCX0KKwlxdWV1ZS0+cXVldWVbcXVldWUtPm5yKytdID0gZHA7Cit9CisKK3N0cnVjdCBkaWZmX2ZpbGVwYWlyICpkaWZmX3F1ZXVlKHN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcXVldWUsCisJCQkJIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUsCisJCQkJIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICp0d28pCit7CisJc3RydWN0IGRpZmZfZmlsZXBhaXIgKmRwID0geGNhbGxvYygxLCBzaXplb2YoKmRwKSk7CisJZHAtPm9uZSA9IG9uZTsKKwlkcC0+dHdvID0gdHdvOworCWlmIChxdWV1ZSkKKwkJZGlmZl9xKHF1ZXVlLCBkcCk7CisJcmV0dXJuIGRwOworfQorCit2b2lkIGRpZmZfZnJlZV9maWxlcGFpcihzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCkKK3sKKwlmcmVlX2ZpbGVzcGVjKHAtPm9uZSk7CisJZnJlZV9maWxlc3BlYyhwLT50d28pOworCWZyZWUocCk7Cit9CisKKy8qIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gZmluZF91bmlxdWVfYWJicmV2KCkgaW4gdGhhdAorICogaXQgc3R1ZmZzIHRoZSByZXN1bHQgd2l0aCBkb3RzIGZvciBhbGlnbm1lbnQuCisgKi8KK2NvbnN0IGNoYXIgKmRpZmZfdW5pcXVlX2FiYnJldihjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgbGVuKQoreworCWludCBhYmJsZW47CisJY29uc3QgY2hhciAqYWJicmV2OworCWlmIChsZW4gPT0gNDApCisJCXJldHVybiBzaGExX3RvX2hleChzaGExKTsKKworCWFiYnJldiA9IGZpbmRfdW5pcXVlX2FiYnJldihzaGExLCBsZW4pOworCWFiYmxlbiA9IHN0cmxlbihhYmJyZXYpOworCWlmIChhYmJsZW4gPCAzNykgeworCQlzdGF0aWMgY2hhciBoZXhbNDFdOworCQlpZiAobGVuIDwgYWJibGVuICYmIGFiYmxlbiA8PSBsZW4gKyAyKQorCQkJc3ByaW50ZihoZXgsICIlcyUuKnMiLCBhYmJyZXYsIGxlbiszLWFiYmxlbiwgIi4uIik7CisJCWVsc2UKKwkJCXNwcmludGYoaGV4LCAiJXMuLi4iLCBhYmJyZXYpOworCQlyZXR1cm4gaGV4OworCX0KKwlyZXR1cm4gc2hhMV90b19oZXgoc2hhMSk7Cit9CisKK3N0YXRpYyB2b2lkIGRpZmZfZmx1c2hfcmF3KHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwLCBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQpCit7CisJaW50IGxpbmVfdGVybWluYXRpb24gPSBvcHQtPmxpbmVfdGVybWluYXRpb247CisJaW50IGludGVyX25hbWVfdGVybWluYXRpb24gPSBsaW5lX3Rlcm1pbmF0aW9uID8gJ1x0JyA6ICdcMCc7CisKKwlpZiAoIShvcHQtPm91dHB1dF9mb3JtYXQgJiBESUZGX0ZPUk1BVF9OQU1FX1NUQVRVUykpIHsKKwkJZnByaW50ZihvcHQtPmZpbGUsICI6JTA2byAlMDZvICVzICIsIHAtPm9uZS0+bW9kZSwgcC0+dHdvLT5tb2RlLAorCQkJZGlmZl91bmlxdWVfYWJicmV2KHAtPm9uZS0+c2hhMSwgb3B0LT5hYmJyZXYpKTsKKwkJZnByaW50ZihvcHQtPmZpbGUsICIlcyAiLCBkaWZmX3VuaXF1ZV9hYmJyZXYocC0+dHdvLT5zaGExLCBvcHQtPmFiYnJldikpOworCX0KKwlpZiAocC0+c2NvcmUpIHsKKwkJZnByaW50ZihvcHQtPmZpbGUsICIlYyUwM2QlYyIsIHAtPnN0YXR1cywgc2ltaWxhcml0eV9pbmRleChwKSwKKwkJCWludGVyX25hbWVfdGVybWluYXRpb24pOworCX0gZWxzZSB7CisJCWZwcmludGYob3B0LT5maWxlLCAiJWMlYyIsIHAtPnN0YXR1cywgaW50ZXJfbmFtZV90ZXJtaW5hdGlvbik7CisJfQorCisJaWYgKHAtPnN0YXR1cyA9PSBESUZGX1NUQVRVU19DT1BJRUQgfHwKKwkgICAgcC0+c3RhdHVzID09IERJRkZfU1RBVFVTX1JFTkFNRUQpIHsKKwkJY29uc3QgY2hhciAqbmFtZV9hLCAqbmFtZV9iOworCQluYW1lX2EgPSBwLT5vbmUtPnBhdGg7CisJCW5hbWVfYiA9IHAtPnR3by0+cGF0aDsKKwkJc3RyaXBfcHJlZml4KG9wdC0+cHJlZml4X2xlbmd0aCwgJm5hbWVfYSwgJm5hbWVfYik7CisJCXdyaXRlX25hbWVfcXVvdGVkKG5hbWVfYSwgb3B0LT5maWxlLCBpbnRlcl9uYW1lX3Rlcm1pbmF0aW9uKTsKKwkJd3JpdGVfbmFtZV9xdW90ZWQobmFtZV9iLCBvcHQtPmZpbGUsIGxpbmVfdGVybWluYXRpb24pOworCX0gZWxzZSB7CisJCWNvbnN0IGNoYXIgKm5hbWVfYSwgKm5hbWVfYjsKKwkJbmFtZV9hID0gcC0+b25lLT5tb2RlID8gcC0+b25lLT5wYXRoIDogcC0+dHdvLT5wYXRoOworCQluYW1lX2IgPSBOVUxMOworCQlzdHJpcF9wcmVmaXgob3B0LT5wcmVmaXhfbGVuZ3RoLCAmbmFtZV9hLCAmbmFtZV9iKTsKKwkJd3JpdGVfbmFtZV9xdW90ZWQobmFtZV9hLCBvcHQtPmZpbGUsIGxpbmVfdGVybWluYXRpb24pOworCX0KK30KKworaW50IGRpZmZfdW5tb2RpZmllZF9wYWlyKHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwKQoreworCS8qIFRoaXMgZnVuY3Rpb24gaXMgd3JpdHRlbiBzdHJpY3RlciB0aGFuIG5lY2Vzc2FyeSB0byBzdXBwb3J0CisJICogdGhlIGN1cnJlbnRseSBpbXBsZW1lbnRlZCB0cmFuc2Zvcm1lcnMsIGJ1dCB0aGUgaWRlYSBpcyB0bworCSAqIGxldCB0cmFuc2Zvcm1lcnMgdG8gcHJvZHVjZSBkaWZmX2ZpbGVwYWlycyBhbnkgd2F5IHRoZXkgd2FudCwKKwkgKiBhbmQgZmlsdGVyIGFuZCBjbGVhbiB0aGVtIHVwIGhlcmUgYmVmb3JlIHByb2R1Y2luZyB0aGUgb3V0cHV0LgorCSAqLworCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUgPSBwLT5vbmUsICp0d28gPSBwLT50d287CisKKwlpZiAoRElGRl9QQUlSX1VOTUVSR0VEKHApKQorCQlyZXR1cm4gMDsgLyogdW5tZXJnZWQgaXMgaW50ZXJlc3RpbmcgKi8KKworCS8qIGRlbGV0aW9uLCBhZGRpdGlvbiwgbW9kZSBvciB0eXBlIGNoYW5nZQorCSAqIGFuZCByZW5hbWUgYXJlIGFsbCBpbnRlcmVzdGluZy4KKwkgKi8KKwlpZiAoRElGRl9GSUxFX1ZBTElEKG9uZSkgIT0gRElGRl9GSUxFX1ZBTElEKHR3bykgfHwKKwkgICAgRElGRl9QQUlSX01PREVfQ0hBTkdFRChwKSB8fAorCSAgICBzdHJjbXAob25lLT5wYXRoLCB0d28tPnBhdGgpKQorCQlyZXR1cm4gMDsKKworCS8qIGJvdGggYXJlIHZhbGlkIGFuZCBwb2ludCBhdCB0aGUgc2FtZSBwYXRoLiAgdGhhdCBpcywgd2UgYXJlCisJICogZGVhbGluZyB3aXRoIGEgY2hhbmdlLgorCSAqLworCWlmIChvbmUtPnNoYTFfdmFsaWQgJiYgdHdvLT5zaGExX3ZhbGlkICYmCisJICAgICFoYXNoY21wKG9uZS0+c2hhMSwgdHdvLT5zaGExKSkKKwkJcmV0dXJuIDE7IC8qIG5vIGNoYW5nZSAqLworCWlmICghb25lLT5zaGExX3ZhbGlkICYmICF0d28tPnNoYTFfdmFsaWQpCisJCXJldHVybiAxOyAvKiBib3RoIGxvb2sgYXQgdGhlIHNhbWUgZmlsZSBvbiB0aGUgZmlsZXN5c3RlbS4gKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGlmZl9mbHVzaF9wYXRjaChzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCwgc3RydWN0IGRpZmZfb3B0aW9ucyAqbykKK3sKKwlpZiAoZGlmZl91bm1vZGlmaWVkX3BhaXIocCkpCisJCXJldHVybjsKKworCWlmICgoRElGRl9GSUxFX1ZBTElEKHAtPm9uZSkgJiYgU19JU0RJUihwLT5vbmUtPm1vZGUpKSB8fAorCSAgICAoRElGRl9GSUxFX1ZBTElEKHAtPnR3bykgJiYgU19JU0RJUihwLT50d28tPm1vZGUpKSkKKwkJcmV0dXJuOyAvKiBubyB0cmVlIGRpZmZzIGluIHBhdGNoIGZvcm1hdCAqLworCisJcnVuX2RpZmYocCwgbyk7Cit9CisKK3N0YXRpYyB2b2lkIGRpZmZfZmx1c2hfc3RhdChzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCwgc3RydWN0IGRpZmZfb3B0aW9ucyAqbywKKwkJCSAgICBzdHJ1Y3QgZGlmZnN0YXRfdCAqZGlmZnN0YXQpCit7CisJaWYgKGRpZmZfdW5tb2RpZmllZF9wYWlyKHApKQorCQlyZXR1cm47CisKKwlpZiAoKERJRkZfRklMRV9WQUxJRChwLT5vbmUpICYmIFNfSVNESVIocC0+b25lLT5tb2RlKSkgfHwKKwkgICAgKERJRkZfRklMRV9WQUxJRChwLT50d28pICYmIFNfSVNESVIocC0+dHdvLT5tb2RlKSkpCisJCXJldHVybjsgLyogbm8gdHJlZSBkaWZmcyBpbiBwYXRjaCBmb3JtYXQgKi8KKworCXJ1bl9kaWZmc3RhdChwLCBvLCBkaWZmc3RhdCk7Cit9CisKK3N0YXRpYyB2b2lkIGRpZmZfZmx1c2hfY2hlY2tkaWZmKHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwLAorCQlzdHJ1Y3QgZGlmZl9vcHRpb25zICpvKQoreworCWlmIChkaWZmX3VubW9kaWZpZWRfcGFpcihwKSkKKwkJcmV0dXJuOworCisJaWYgKChESUZGX0ZJTEVfVkFMSUQocC0+b25lKSAmJiBTX0lTRElSKHAtPm9uZS0+bW9kZSkpIHx8CisJICAgIChESUZGX0ZJTEVfVkFMSUQocC0+dHdvKSAmJiBTX0lTRElSKHAtPnR3by0+bW9kZSkpKQorCQlyZXR1cm47IC8qIG5vIHRyZWUgZGlmZnMgaW4gcGF0Y2ggZm9ybWF0ICovCisKKwlydW5fY2hlY2tkaWZmKHAsIG8pOworfQorCitpbnQgZGlmZl9xdWV1ZV9pc19lbXB0eSh2b2lkKQoreworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSA9ICZkaWZmX3F1ZXVlZF9kaWZmOworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKQorCQlpZiAoIWRpZmZfdW5tb2RpZmllZF9wYWlyKHEtPnF1ZXVlW2ldKSkKKwkJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisjaWYgRElGRl9ERUJVRwordm9pZCBkaWZmX2RlYnVnX2ZpbGVzcGVjKHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpzLCBpbnQgeCwgY29uc3QgY2hhciAqb25lKQoreworCWZwcmludGYoc3RkZXJyLCAicXVldWVbJWRdICVzICglcykgJXMgJTA2byAlc1xuIiwKKwkJeCwgb25lID8gb25lIDogIiIsCisJCXMtPnBhdGgsCisJCURJRkZfRklMRV9WQUxJRChzKSA/ICJ2YWxpZCIgOiAiaW52YWxpZCIsCisJCXMtPm1vZGUsCisJCXMtPnNoYTFfdmFsaWQgPyBzaGExX3RvX2hleChzLT5zaGExKSA6ICIiKTsKKwlmcHJpbnRmKHN0ZGVyciwgInF1ZXVlWyVkXSAlcyBzaXplICVsdSBmbGFncyAlZFxuIiwKKwkJeCwgb25lID8gb25lIDogIiIsCisJCXMtPnNpemUsIHMtPnhmcm1fZmxhZ3MpOworfQorCit2b2lkIGRpZmZfZGVidWdfZmlsZXBhaXIoY29uc3Qgc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsIGludCBpKQoreworCWRpZmZfZGVidWdfZmlsZXNwZWMocC0+b25lLCBpLCAib25lIik7CisJZGlmZl9kZWJ1Z19maWxlc3BlYyhwLT50d28sIGksICJ0d28iKTsKKwlmcHJpbnRmKHN0ZGVyciwgInNjb3JlICVkLCBzdGF0dXMgJWMgcmVuYW1lX3VzZWQgJWQgYnJva2VuICVkXG4iLAorCQlwLT5zY29yZSwgcC0+c3RhdHVzID8gcC0+c3RhdHVzIDogJz8nLAorCQlwLT5vbmUtPnJlbmFtZV91c2VkLCBwLT5icm9rZW5fcGFpcik7Cit9CisKK3ZvaWQgZGlmZl9kZWJ1Z19xdWV1ZShjb25zdCBjaGFyICptc2csIHN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSkKK3sKKwlpbnQgaTsKKwlpZiAobXNnKQorCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBtc2cpOworCWZwcmludGYoc3RkZXJyLCAicS0+bnIgPSAlZFxuIiwgcS0+bnIpOworCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKSB7CisJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gcS0+cXVldWVbaV07CisJCWRpZmZfZGVidWdfZmlsZXBhaXIocCwgaSk7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGRpZmZfcmVzb2x2ZV9yZW5hbWVfY29weSh2b2lkKQoreworCWludCBpOworCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwOworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSA9ICZkaWZmX3F1ZXVlZF9kaWZmOworCisJZGlmZl9kZWJ1Z19xdWV1ZSgicmVzb2x2ZS1yZW5hbWUtY29weSIsIHEpOworCisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJcCA9IHEtPnF1ZXVlW2ldOworCQlwLT5zdGF0dXMgPSAwOyAvKiB1bmRlY2lkZWQgKi8KKwkJaWYgKERJRkZfUEFJUl9VTk1FUkdFRChwKSkKKwkJCXAtPnN0YXR1cyA9IERJRkZfU1RBVFVTX1VOTUVSR0VEOworCQllbHNlIGlmICghRElGRl9GSUxFX1ZBTElEKHAtPm9uZSkpCisJCQlwLT5zdGF0dXMgPSBESUZGX1NUQVRVU19BRERFRDsKKwkJZWxzZSBpZiAoIURJRkZfRklMRV9WQUxJRChwLT50d28pKQorCQkJcC0+c3RhdHVzID0gRElGRl9TVEFUVVNfREVMRVRFRDsKKwkJZWxzZSBpZiAoRElGRl9QQUlSX1RZUEVfQ0hBTkdFRChwKSkKKwkJCXAtPnN0YXR1cyA9IERJRkZfU1RBVFVTX1RZUEVfQ0hBTkdFRDsKKworCQkvKiBmcm9tIHRoaXMgcG9pbnQgb24sIHdlIGFyZSBkZWFsaW5nIHdpdGggYSBwYWlyCisJCSAqIHdob3NlIGJvdGggc2lkZXMgYXJlIHZhbGlkIGFuZCBvZiB0aGUgc2FtZSB0eXBlLCBpLmUuCisJCSAqIGVpdGhlciBpbi1wbGFjZSBlZGl0IG9yIHJlbmFtZS9jb3B5IGVkaXQuCisJCSAqLworCQllbHNlIGlmIChESUZGX1BBSVJfUkVOQU1FKHApKSB7CisJCQkvKgorCQkJICogQSByZW5hbWUgbWlnaHQgaGF2ZSByZS1jb25uZWN0ZWQgYSBicm9rZW4KKwkJCSAqIHBhaXIgdXAsIGNhdXNpbmcgdGhlIHBhdGhuYW1lcyB0byBiZSB0aGUKKwkJCSAqIHNhbWUgYWdhaW4uIElmIHNvLCB0aGF0J3Mgbm90IGEgcmVuYW1lIGF0CisJCQkgKiBhbGwsIGp1c3QgYSBtb2RpZmljYXRpb24uLgorCQkJICoKKwkJCSAqIE90aGVyd2lzZSwgc2VlIGlmIHRoaXMgc291cmNlIHdhcyB1c2VkIGZvcgorCQkJICogbXVsdGlwbGUgcmVuYW1lcywgaW4gd2hpY2ggY2FzZSB3ZSBkZWNyZW1lbnQKKwkJCSAqIHRoZSBjb3VudCwgYW5kIGNhbGwgaXQgYSBjb3B5LgorCQkJICovCisJCQlpZiAoIXN0cmNtcChwLT5vbmUtPnBhdGgsIHAtPnR3by0+cGF0aCkpCisJCQkJcC0+c3RhdHVzID0gRElGRl9TVEFUVVNfTU9ESUZJRUQ7CisJCQllbHNlIGlmICgtLXAtPm9uZS0+cmVuYW1lX3VzZWQgPiAwKQorCQkJCXAtPnN0YXR1cyA9IERJRkZfU1RBVFVTX0NPUElFRDsKKwkJCWVsc2UKKwkJCQlwLT5zdGF0dXMgPSBESUZGX1NUQVRVU19SRU5BTUVEOworCQl9CisJCWVsc2UgaWYgKGhhc2hjbXAocC0+b25lLT5zaGExLCBwLT50d28tPnNoYTEpIHx8CisJCQkgcC0+b25lLT5tb2RlICE9IHAtPnR3by0+bW9kZSB8fAorCQkJIGlzX251bGxfc2hhMShwLT5vbmUtPnNoYTEpKQorCQkJcC0+c3RhdHVzID0gRElGRl9TVEFUVVNfTU9ESUZJRUQ7CisJCWVsc2UgeworCQkJLyogVGhpcyBpcyBhICJuby1jaGFuZ2UiIGVudHJ5IGFuZCBzaG91bGQgbm90CisJCQkgKiBoYXBwZW4gYW55bW9yZSwgYnV0IHByZXBhcmUgZm9yIGJyb2tlbiBjYWxsZXJzLgorCQkJICovCisJCQllcnJvcigiZmVlZGluZyB1bm1vZGlmaWVkICVzIHRvIGRpZmZjb3JlIiwKKwkJCSAgICAgIHAtPm9uZS0+cGF0aCk7CisJCQlwLT5zdGF0dXMgPSBESUZGX1NUQVRVU19VTktOT1dOOworCQl9CisJfQorCWRpZmZfZGVidWdfcXVldWUoInJlc29sdmUtcmVuYW1lLWNvcHkgZG9uZSIsIHEpOworfQorCitzdGF0aWMgaW50IGNoZWNrX3BhaXJfc3RhdHVzKHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwKQoreworCXN3aXRjaCAocC0+c3RhdHVzKSB7CisJY2FzZSBESUZGX1NUQVRVU19VTktOT1dOOgorCQlyZXR1cm4gMDsKKwljYXNlIDA6CisJCWRpZSgiaW50ZXJuYWwgZXJyb3IgaW4gZGlmZi1yZXNvbHZlLXJlbmFtZS1jb3B5Iik7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorfQorCitzdGF0aWMgdm9pZCBmbHVzaF9vbmVfcGFpcihzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCwgc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0KQoreworCWludCBmbXQgPSBvcHQtPm91dHB1dF9mb3JtYXQ7CisKKwlpZiAoZm10ICYgRElGRl9GT1JNQVRfQ0hFQ0tESUZGKQorCQlkaWZmX2ZsdXNoX2NoZWNrZGlmZihwLCBvcHQpOworCWVsc2UgaWYgKGZtdCAmIChESUZGX0ZPUk1BVF9SQVcgfCBESUZGX0ZPUk1BVF9OQU1FX1NUQVRVUykpCisJCWRpZmZfZmx1c2hfcmF3KHAsIG9wdCk7CisJZWxzZSBpZiAoZm10ICYgRElGRl9GT1JNQVRfTkFNRSkgeworCQljb25zdCBjaGFyICpuYW1lX2EsICpuYW1lX2I7CisJCW5hbWVfYSA9IHAtPnR3by0+cGF0aDsKKwkJbmFtZV9iID0gTlVMTDsKKwkJc3RyaXBfcHJlZml4KG9wdC0+cHJlZml4X2xlbmd0aCwgJm5hbWVfYSwgJm5hbWVfYik7CisJCXdyaXRlX25hbWVfcXVvdGVkKG5hbWVfYSwgb3B0LT5maWxlLCBvcHQtPmxpbmVfdGVybWluYXRpb24pOworCX0KK30KKworc3RhdGljIHZvaWQgc2hvd19maWxlX21vZGVfbmFtZShGSUxFICpmaWxlLCBjb25zdCBjaGFyICpuZXdkZWxldGUsIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpmcykKK3sKKwlpZiAoZnMtPm1vZGUpCisJCWZwcmludGYoZmlsZSwgIiAlcyBtb2RlICUwNm8gIiwgbmV3ZGVsZXRlLCBmcy0+bW9kZSk7CisJZWxzZQorCQlmcHJpbnRmKGZpbGUsICIgJXMgIiwgbmV3ZGVsZXRlKTsKKwl3cml0ZV9uYW1lX3F1b3RlZChmcy0+cGF0aCwgZmlsZSwgJ1xuJyk7Cit9CisKKworc3RhdGljIHZvaWQgc2hvd19tb2RlX2NoYW5nZShGSUxFICpmaWxlLCBzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCwgaW50IHNob3dfbmFtZSkKK3sKKwlpZiAocC0+b25lLT5tb2RlICYmIHAtPnR3by0+bW9kZSAmJiBwLT5vbmUtPm1vZGUgIT0gcC0+dHdvLT5tb2RlKSB7CisJCWZwcmludGYoZmlsZSwgIiBtb2RlIGNoYW5nZSAlMDZvID0+ICUwNm8lYyIsIHAtPm9uZS0+bW9kZSwgcC0+dHdvLT5tb2RlLAorCQkJc2hvd19uYW1lID8gJyAnIDogJ1xuJyk7CisJCWlmIChzaG93X25hbWUpIHsKKwkJCXdyaXRlX25hbWVfcXVvdGVkKHAtPnR3by0+cGF0aCwgZmlsZSwgJ1xuJyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfcmVuYW1lX2NvcHkoRklMRSAqZmlsZSwgY29uc3QgY2hhciAqcmVuYW1lY29weSwgc3RydWN0IGRpZmZfZmlsZXBhaXIgKnApCit7CisJY2hhciAqbmFtZXMgPSBwcHJpbnRfcmVuYW1lKHAtPm9uZS0+cGF0aCwgcC0+dHdvLT5wYXRoKTsKKworCWZwcmludGYoZmlsZSwgIiAlcyAlcyAoJWQlJSlcbiIsIHJlbmFtZWNvcHksIG5hbWVzLCBzaW1pbGFyaXR5X2luZGV4KHApKTsKKwlmcmVlKG5hbWVzKTsKKwlzaG93X21vZGVfY2hhbmdlKGZpbGUsIHAsIDApOworfQorCitzdGF0aWMgdm9pZCBkaWZmX3N1bW1hcnkoRklMRSAqZmlsZSwgc3RydWN0IGRpZmZfZmlsZXBhaXIgKnApCit7CisJc3dpdGNoKHAtPnN0YXR1cykgeworCWNhc2UgRElGRl9TVEFUVVNfREVMRVRFRDoKKwkJc2hvd19maWxlX21vZGVfbmFtZShmaWxlLCAiZGVsZXRlIiwgcC0+b25lKTsKKwkJYnJlYWs7CisJY2FzZSBESUZGX1NUQVRVU19BRERFRDoKKwkJc2hvd19maWxlX21vZGVfbmFtZShmaWxlLCAiY3JlYXRlIiwgcC0+dHdvKTsKKwkJYnJlYWs7CisJY2FzZSBESUZGX1NUQVRVU19DT1BJRUQ6CisJCXNob3dfcmVuYW1lX2NvcHkoZmlsZSwgImNvcHkiLCBwKTsKKwkJYnJlYWs7CisJY2FzZSBESUZGX1NUQVRVU19SRU5BTUVEOgorCQlzaG93X3JlbmFtZV9jb3B5KGZpbGUsICJyZW5hbWUiLCBwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKHAtPnNjb3JlKSB7CisJCQlmcHV0cygiIHJld3JpdGUgIiwgZmlsZSk7CisJCQl3cml0ZV9uYW1lX3F1b3RlZChwLT50d28tPnBhdGgsIGZpbGUsICcgJyk7CisJCQlmcHJpbnRmKGZpbGUsICIoJWQlJSlcbiIsIHNpbWlsYXJpdHlfaW5kZXgocCkpOworCQl9CisJCXNob3dfbW9kZV9jaGFuZ2UoZmlsZSwgcCwgIXAtPnNjb3JlKTsKKwkJYnJlYWs7CisJfQorfQorCitzdHJ1Y3QgcGF0Y2hfaWRfdCB7CisJc3RydWN0IHhkaWZmX2VtaXRfc3RhdGUgeG07CisJU0hBX0NUWCAqY3R4OworCWludCBwYXRjaGxlbjsKK307CisKK3N0YXRpYyBpbnQgcmVtb3ZlX3NwYWNlKGNoYXIgKmxpbmUsIGludCBsZW4pCit7CisJaW50IGk7CisJY2hhciAqZHN0ID0gbGluZTsKKwl1bnNpZ25lZCBjaGFyIGM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCWlmICghaXNzcGFjZSgoYyA9IGxpbmVbaV0pKSkKKwkJCSpkc3QrKyA9IGM7CisKKwlyZXR1cm4gZHN0IC0gbGluZTsKK30KKworc3RhdGljIHZvaWQgcGF0Y2hfaWRfY29uc3VtZSh2b2lkICpwcml2LCBjaGFyICpsaW5lLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlzdHJ1Y3QgcGF0Y2hfaWRfdCAqZGF0YSA9IHByaXY7CisJaW50IG5ld19sZW47CisKKwkvKiBJZ25vcmUgbGluZSBudW1iZXJzIHdoZW4gY29tcHV0aW5nIHRoZSBTSEExIG9mIHRoZSBwYXRjaCAqLworCWlmICghcHJlZml4Y21wKGxpbmUsICJAQCAtIikpCisJCXJldHVybjsKKworCW5ld19sZW4gPSByZW1vdmVfc3BhY2UobGluZSwgbGVuKTsKKworCVNIQTFfVXBkYXRlKGRhdGEtPmN0eCwgbGluZSwgbmV3X2xlbik7CisJZGF0YS0+cGF0Y2hsZW4gKz0gbmV3X2xlbjsKK30KKworLyogcmV0dXJucyAwIHVwb24gc3VjY2VzcywgYW5kIHdyaXRlcyByZXN1bHQgaW50byBzaGExICovCitzdGF0aWMgaW50IGRpZmZfZ2V0X3BhdGNoX2lkKHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxID0gJmRpZmZfcXVldWVkX2RpZmY7CisJaW50IGk7CisJU0hBX0NUWCBjdHg7CisJc3RydWN0IHBhdGNoX2lkX3QgZGF0YTsKKwljaGFyIGJ1ZmZlcltQQVRIX01BWCAqIDQgKyAyMF07CisKKwlTSEExX0luaXQoJmN0eCk7CisJbWVtc2V0KCZkYXRhLCAwLCBzaXplb2Yoc3RydWN0IHBhdGNoX2lkX3QpKTsKKwlkYXRhLmN0eCA9ICZjdHg7CisJZGF0YS54bS5jb25zdW1lID0gcGF0Y2hfaWRfY29uc3VtZTsKKworCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKSB7CisJCXhwcGFyYW1fdCB4cHA7CisJCXhkZW1pdGNvbmZfdCB4ZWNmZzsKKwkJeGRlbWl0Y2JfdCBlY2I7CisJCW1tZmlsZV90IG1mMSwgbWYyOworCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCA9IHEtPnF1ZXVlW2ldOworCQlpbnQgbGVuMSwgbGVuMjsKKworCQltZW1zZXQoJnhlY2ZnLCAwLCBzaXplb2YoeGVjZmcpKTsKKwkJaWYgKHAtPnN0YXR1cyA9PSAwKQorCQkJcmV0dXJuIGVycm9yKCJpbnRlcm5hbCBkaWZmIHN0YXR1cyBlcnJvciIpOworCQlpZiAocC0+c3RhdHVzID09IERJRkZfU1RBVFVTX1VOS05PV04pCisJCQljb250aW51ZTsKKwkJaWYgKGRpZmZfdW5tb2RpZmllZF9wYWlyKHApKQorCQkJY29udGludWU7CisJCWlmICgoRElGRl9GSUxFX1ZBTElEKHAtPm9uZSkgJiYgU19JU0RJUihwLT5vbmUtPm1vZGUpKSB8fAorCQkgICAgKERJRkZfRklMRV9WQUxJRChwLT50d28pICYmIFNfSVNESVIocC0+dHdvLT5tb2RlKSkpCisJCQljb250aW51ZTsKKwkJaWYgKERJRkZfUEFJUl9VTk1FUkdFRChwKSkKKwkJCWNvbnRpbnVlOworCisJCWRpZmZfZmlsbF9zaGExX2luZm8ocC0+b25lKTsKKwkJZGlmZl9maWxsX3NoYTFfaW5mbyhwLT50d28pOworCQlpZiAoZmlsbF9tbWZpbGUoJm1mMSwgcC0+b25lKSA8IDAgfHwKKwkJCQlmaWxsX21tZmlsZSgmbWYyLCBwLT50d28pIDwgMCkKKwkJCXJldHVybiBlcnJvcigidW5hYmxlIHRvIHJlYWQgZmlsZXMgdG8gZGlmZiIpOworCisJCWxlbjEgPSByZW1vdmVfc3BhY2UocC0+b25lLT5wYXRoLCBzdHJsZW4ocC0+b25lLT5wYXRoKSk7CisJCWxlbjIgPSByZW1vdmVfc3BhY2UocC0+dHdvLT5wYXRoLCBzdHJsZW4ocC0+dHdvLT5wYXRoKSk7CisJCWlmIChwLT5vbmUtPm1vZGUgPT0gMCkKKwkJCWxlbjEgPSBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAorCQkJCQkiZGlmZi0tZ2l0YS8lLipzYi8lLipzIgorCQkJCQkibmV3ZmlsZW1vZGUlMDZvIgorCQkJCQkiLS0tL2Rldi9udWxsIgorCQkJCQkiKysrYi8lLipzIiwKKwkJCQkJbGVuMSwgcC0+b25lLT5wYXRoLAorCQkJCQlsZW4yLCBwLT50d28tPnBhdGgsCisJCQkJCXAtPnR3by0+bW9kZSwKKwkJCQkJbGVuMiwgcC0+dHdvLT5wYXRoKTsKKwkJZWxzZSBpZiAocC0+dHdvLT5tb2RlID09IDApCisJCQlsZW4xID0gc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKwkJCQkJImRpZmYtLWdpdGEvJS4qc2IvJS4qcyIKKwkJCQkJImRlbGV0ZWRmaWxlbW9kZSUwNm8iCisJCQkJCSItLS1hLyUuKnMiCisJCQkJCSIrKysvZGV2L251bGwiLAorCQkJCQlsZW4xLCBwLT5vbmUtPnBhdGgsCisJCQkJCWxlbjIsIHAtPnR3by0+cGF0aCwKKwkJCQkJcC0+b25lLT5tb2RlLAorCQkJCQlsZW4xLCBwLT5vbmUtPnBhdGgpOworCQllbHNlCisJCQlsZW4xID0gc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKwkJCQkJImRpZmYtLWdpdGEvJS4qc2IvJS4qcyIKKwkJCQkJIi0tLWEvJS4qcyIKKwkJCQkJIisrK2IvJS4qcyIsCisJCQkJCWxlbjEsIHAtPm9uZS0+cGF0aCwKKwkJCQkJbGVuMiwgcC0+dHdvLT5wYXRoLAorCQkJCQlsZW4xLCBwLT5vbmUtPnBhdGgsCisJCQkJCWxlbjIsIHAtPnR3by0+cGF0aCk7CisJCVNIQTFfVXBkYXRlKCZjdHgsIGJ1ZmZlciwgbGVuMSk7CisKKwkJeHBwLmZsYWdzID0gWERGX05FRURfTUlOSU1BTDsKKwkJeGVjZmcuY3R4bGVuID0gMzsKKwkJeGVjZmcuZmxhZ3MgPSBYRExfRU1JVF9GVU5DTkFNRVM7CisJCWVjYi5vdXRmID0geGRpZmZfb3V0ZjsKKwkJZWNiLnByaXYgPSAmZGF0YTsKKwkJeGRpX2RpZmYoJm1mMSwgJm1mMiwgJnhwcCwgJnhlY2ZnLCAmZWNiKTsKKwl9CisKKwlTSEExX0ZpbmFsKHNoYTEsICZjdHgpOworCXJldHVybiAwOworfQorCitpbnQgZGlmZl9mbHVzaF9wYXRjaF9pZChzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHRpb25zLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSA9ICZkaWZmX3F1ZXVlZF9kaWZmOworCWludCBpOworCWludCByZXN1bHQgPSBkaWZmX2dldF9wYXRjaF9pZChvcHRpb25zLCBzaGExKTsKKworCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKQorCQlkaWZmX2ZyZWVfZmlsZXBhaXIocS0+cXVldWVbaV0pOworCisJZnJlZShxLT5xdWV1ZSk7CisJcS0+cXVldWUgPSBOVUxMOworCXEtPm5yID0gcS0+YWxsb2MgPSAwOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBpc19zdW1tYXJ5X2VtcHR5KGNvbnN0IHN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gcS0+cXVldWVbaV07CisKKwkJc3dpdGNoIChwLT5zdGF0dXMpIHsKKwkJY2FzZSBESUZGX1NUQVRVU19ERUxFVEVEOgorCQljYXNlIERJRkZfU1RBVFVTX0FEREVEOgorCQljYXNlIERJRkZfU1RBVFVTX0NPUElFRDoKKwkJY2FzZSBESUZGX1NUQVRVU19SRU5BTUVEOgorCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CisJCQlpZiAocC0+c2NvcmUpCisJCQkJcmV0dXJuIDA7CisJCQlpZiAocC0+b25lLT5tb2RlICYmIHAtPnR3by0+bW9kZSAmJgorCQkJICAgIHAtPm9uZS0+bW9kZSAhPSBwLT50d28tPm1vZGUpCisJCQkJcmV0dXJuIDA7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKwordm9pZCBkaWZmX2ZsdXNoKHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMpCit7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxID0gJmRpZmZfcXVldWVkX2RpZmY7CisJaW50IGksIG91dHB1dF9mb3JtYXQgPSBvcHRpb25zLT5vdXRwdXRfZm9ybWF0OworCWludCBzZXBhcmF0b3IgPSAwOworCisJLyoKKwkgKiBPcmRlcjogcmF3LCBzdGF0LCBzdW1tYXJ5LCBwYXRjaAorCSAqIG9yOiAgICBuYW1lL25hbWUtc3RhdHVzL2NoZWNrZGlmZiAob3RoZXIgYml0cyBjbGVhcikKKwkgKi8KKwlpZiAoIXEtPm5yKQorCQlnb3RvIGZyZWVfcXVldWU7CisKKwlpZiAob3V0cHV0X2Zvcm1hdCAmIChESUZGX0ZPUk1BVF9SQVcgfAorCQkJICAgICBESUZGX0ZPUk1BVF9OQU1FIHwKKwkJCSAgICAgRElGRl9GT1JNQVRfTkFNRV9TVEFUVVMgfAorCQkJICAgICBESUZGX0ZPUk1BVF9DSEVDS0RJRkYpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKSB7CisJCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCA9IHEtPnF1ZXVlW2ldOworCQkJaWYgKGNoZWNrX3BhaXJfc3RhdHVzKHApKQorCQkJCWZsdXNoX29uZV9wYWlyKHAsIG9wdGlvbnMpOworCQl9CisJCXNlcGFyYXRvcisrOworCX0KKworCWlmIChvdXRwdXRfZm9ybWF0ICYgKERJRkZfRk9STUFUX0RJRkZTVEFUfERJRkZfRk9STUFUX1NIT1JUU1RBVHxESUZGX0ZPUk1BVF9OVU1TVEFUfERJRkZfRk9STUFUX0RJUlNUQVQpKSB7CisJCXN0cnVjdCBkaWZmc3RhdF90IGRpZmZzdGF0OworCisJCW1lbXNldCgmZGlmZnN0YXQsIDAsIHNpemVvZihzdHJ1Y3QgZGlmZnN0YXRfdCkpOworCQlkaWZmc3RhdC54bS5jb25zdW1lID0gZGlmZnN0YXRfY29uc3VtZTsKKwkJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gcS0+cXVldWVbaV07CisJCQlpZiAoY2hlY2tfcGFpcl9zdGF0dXMocCkpCisJCQkJZGlmZl9mbHVzaF9zdGF0KHAsIG9wdGlvbnMsICZkaWZmc3RhdCk7CisJCX0KKwkJaWYgKG91dHB1dF9mb3JtYXQgJiBESUZGX0ZPUk1BVF9ESVJTVEFUKQorCQkJc2hvd19kaXJzdGF0KCZkaWZmc3RhdCwgb3B0aW9ucyk7CisJCWlmIChvdXRwdXRfZm9ybWF0ICYgRElGRl9GT1JNQVRfTlVNU1RBVCkKKwkJCXNob3dfbnVtc3RhdCgmZGlmZnN0YXQsIG9wdGlvbnMpOworCQlpZiAob3V0cHV0X2Zvcm1hdCAmIERJRkZfRk9STUFUX0RJRkZTVEFUKQorCQkJc2hvd19zdGF0cygmZGlmZnN0YXQsIG9wdGlvbnMpOworCQlpZiAob3V0cHV0X2Zvcm1hdCAmIERJRkZfRk9STUFUX1NIT1JUU1RBVCkKKwkJCXNob3dfc2hvcnRzdGF0cygmZGlmZnN0YXQsIG9wdGlvbnMpOworCQlmcmVlX2RpZmZzdGF0X2luZm8oJmRpZmZzdGF0KTsKKwkJc2VwYXJhdG9yKys7CisJfQorCisJaWYgKG91dHB1dF9mb3JtYXQgJiBESUZGX0ZPUk1BVF9TVU1NQVJZICYmICFpc19zdW1tYXJ5X2VtcHR5KHEpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKQorCQkJZGlmZl9zdW1tYXJ5KG9wdGlvbnMtPmZpbGUsIHEtPnF1ZXVlW2ldKTsKKwkJc2VwYXJhdG9yKys7CisJfQorCisJaWYgKG91dHB1dF9mb3JtYXQgJiBESUZGX0ZPUk1BVF9QQVRDSCkgeworCQlpZiAoc2VwYXJhdG9yKSB7CisJCQlpZiAob3B0aW9ucy0+c3RhdF9zZXApIHsKKwkJCQkvKiBhdHRhY2ggcGF0Y2ggaW5zdGVhZCBvZiBpbmxpbmUgKi8KKwkJCQlmcHV0cyhvcHRpb25zLT5zdGF0X3NlcCwgb3B0aW9ucy0+ZmlsZSk7CisJCQl9IGVsc2UgeworCQkJCXB1dGMob3B0aW9ucy0+bGluZV90ZXJtaW5hdGlvbiwgb3B0aW9ucy0+ZmlsZSk7CisJCQl9CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJCWlmIChjaGVja19wYWlyX3N0YXR1cyhwKSkKKwkJCQlkaWZmX2ZsdXNoX3BhdGNoKHAsIG9wdGlvbnMpOworCQl9CisJfQorCisJaWYgKG91dHB1dF9mb3JtYXQgJiBESUZGX0ZPUk1BVF9DQUxMQkFDSykKKwkJb3B0aW9ucy0+Zm9ybWF0X2NhbGxiYWNrKHEsIG9wdGlvbnMsIG9wdGlvbnMtPmZvcm1hdF9jYWxsYmFja19kYXRhKTsKKworCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKQorCQlkaWZmX2ZyZWVfZmlsZXBhaXIocS0+cXVldWVbaV0pOworZnJlZV9xdWV1ZToKKwlmcmVlKHEtPnF1ZXVlKTsKKwlxLT5xdWV1ZSA9IE5VTEw7CisJcS0+bnIgPSBxLT5hbGxvYyA9IDA7CisJaWYgKG9wdGlvbnMtPmNsb3NlX2ZpbGUpCisJCWZjbG9zZShvcHRpb25zLT5maWxlKTsKK30KKworc3RhdGljIHZvaWQgZGlmZmNvcmVfYXBwbHlfZmlsdGVyKGNvbnN0IGNoYXIgKmZpbHRlcikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKnEgPSAmZGlmZl9xdWV1ZWRfZGlmZjsKKwlzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3Qgb3V0cTsKKwlvdXRxLnF1ZXVlID0gTlVMTDsKKwlvdXRxLm5yID0gb3V0cS5hbGxvYyA9IDA7CisKKwlpZiAoIWZpbHRlcikKKwkJcmV0dXJuOworCisJaWYgKHN0cmNocihmaWx0ZXIsIERJRkZfU1RBVFVTX0ZJTFRFUl9BT04pKSB7CisJCWludCBmb3VuZDsKKwkJZm9yIChpID0gZm91bmQgPSAwOyAhZm91bmQgJiYgaSA8IHEtPm5yOyBpKyspIHsKKwkJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gcS0+cXVldWVbaV07CisJCQlpZiAoKChwLT5zdGF0dXMgPT0gRElGRl9TVEFUVVNfTU9ESUZJRUQpICYmCisJCQkgICAgICgocC0+c2NvcmUgJiYKKwkJCSAgICAgICBzdHJjaHIoZmlsdGVyLCBESUZGX1NUQVRVU19GSUxURVJfQlJPS0VOKSkgfHwKKwkJCSAgICAgICghcC0+c2NvcmUgJiYKKwkJCSAgICAgICBzdHJjaHIoZmlsdGVyLCBESUZGX1NUQVRVU19NT0RJRklFRCkpKSkgfHwKKwkJCSAgICAoKHAtPnN0YXR1cyAhPSBESUZGX1NUQVRVU19NT0RJRklFRCkgJiYKKwkJCSAgICAgc3RyY2hyKGZpbHRlciwgcC0+c3RhdHVzKSkpCisJCQkJZm91bmQrKzsKKwkJfQorCQlpZiAoZm91bmQpCisJCQlyZXR1cm47CisKKwkJLyogb3RoZXJ3aXNlIHdlIHdpbGwgY2xlYXIgdGhlIHdob2xlIHF1ZXVlCisJCSAqIGJ5IGNvcHlpbmcgdGhlIGVtcHR5IG91dHEgYXQgdGhlIGVuZCBvZiB0aGlzCisJCSAqIGZ1bmN0aW9uLCBidXQgZmlyc3QgY2xlYXIgdGhlIGN1cnJlbnQgZW50cmllcworCQkgKiBpbiB0aGUgcXVldWUuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykKKwkJCWRpZmZfZnJlZV9maWxlcGFpcihxLT5xdWV1ZVtpXSk7CisJfQorCWVsc2UgeworCQkvKiBPbmx5IHRoZSBtYXRjaGluZyBvbmVzICovCisJCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKSB7CisJCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCA9IHEtPnF1ZXVlW2ldOworCisJCQlpZiAoKChwLT5zdGF0dXMgPT0gRElGRl9TVEFUVVNfTU9ESUZJRUQpICYmCisJCQkgICAgICgocC0+c2NvcmUgJiYKKwkJCSAgICAgICBzdHJjaHIoZmlsdGVyLCBESUZGX1NUQVRVU19GSUxURVJfQlJPS0VOKSkgfHwKKwkJCSAgICAgICghcC0+c2NvcmUgJiYKKwkJCSAgICAgICBzdHJjaHIoZmlsdGVyLCBESUZGX1NUQVRVU19NT0RJRklFRCkpKSkgfHwKKwkJCSAgICAoKHAtPnN0YXR1cyAhPSBESUZGX1NUQVRVU19NT0RJRklFRCkgJiYKKwkJCSAgICAgc3RyY2hyKGZpbHRlciwgcC0+c3RhdHVzKSkpCisJCQkJZGlmZl9xKCZvdXRxLCBwKTsKKwkJCWVsc2UKKwkJCQlkaWZmX2ZyZWVfZmlsZXBhaXIocCk7CisJCX0KKwl9CisJZnJlZShxLT5xdWV1ZSk7CisJKnEgPSBvdXRxOworfQorCisvKiBDaGVjayB3aGV0aGVyIHR3byBmaWxlc3BlY3Mgd2l0aCB0aGUgc2FtZSBtb2RlIGFuZCBzaXplIGFyZSBpZGVudGljYWwgKi8KK3N0YXRpYyBpbnQgZGlmZl9maWxlc3BlY19pc19pZGVudGljYWwoc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSwKKwkJCQkgICAgICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqdHdvKQoreworCWlmIChTX0lTR0lUTElOSyhvbmUtPm1vZGUpKQorCQlyZXR1cm4gMDsKKwlpZiAoZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhvbmUsIDApKQorCQlyZXR1cm4gMDsKKwlpZiAoZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyh0d28sIDApKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gIW1lbWNtcChvbmUtPmRhdGEsIHR3by0+ZGF0YSwgb25lLT5zaXplKTsKK30KKworc3RhdGljIHZvaWQgZGlmZmNvcmVfc2tpcF9zdGF0X3VubWF0Y2goc3RydWN0IGRpZmZfb3B0aW9ucyAqZGlmZm9wdCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKnEgPSAmZGlmZl9xdWV1ZWRfZGlmZjsKKwlzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3Qgb3V0cTsKKwlvdXRxLnF1ZXVlID0gTlVMTDsKKwlvdXRxLm5yID0gb3V0cS5hbGxvYyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCA9IHEtPnF1ZXVlW2ldOworCisJCS8qCisJCSAqIDEuIEVudHJpZXMgdGhhdCBjb21lIGZyb20gc3RhdCBpbmZvIGRpcnR5bmVzcworCQkgKiAgICBhbHdheXMgaGF2ZSBib3RoIHNpZGVzIChpb3csIG5vdCBjcmVhdGUvZGVsZXRlKSwKKwkJICogICAgb25lIHNpZGUgb2YgdGhlIG9iamVjdCBuYW1lIGlzIHVua25vd24sIHdpdGgKKwkJICogICAgdGhlIHNhbWUgbW9kZSBhbmQgc2l6ZS4gIEtlZXAgdGhlIG9uZXMgdGhhdAorCQkgKiAgICBkbyBub3QgbWF0Y2ggdGhlc2UgY3JpdGVyaWEuICBUaGV5IGhhdmUgcmVhbAorCQkgKiAgICBkaWZmZXJlbmNlcy4KKwkJICoKKwkJICogMi4gQXQgdGhpcyBwb2ludCwgdGhlIGZpbGUgaXMga25vd24gdG8gYmUgbW9kaWZpZWQsCisJCSAqICAgIHdpdGggdGhlIHNhbWUgbW9kZSBhbmQgc2l6ZSwgYW5kIHRoZSBvYmplY3QKKwkJICogICAgbmFtZSBvZiBvbmUgc2lkZSBpcyB1bmtub3duLiAgTmVlZCB0byBpbnNwZWN0CisJCSAqICAgIHRoZSBpZGVudGljYWwgY29udGVudHMuCisJCSAqLworCQlpZiAoIURJRkZfRklMRV9WQUxJRChwLT5vbmUpIHx8IC8qICgxKSAqLworCQkgICAgIURJRkZfRklMRV9WQUxJRChwLT50d28pIHx8CisJCSAgICAocC0+b25lLT5zaGExX3ZhbGlkICYmIHAtPnR3by0+c2hhMV92YWxpZCkgfHwKKwkJICAgIChwLT5vbmUtPm1vZGUgIT0gcC0+dHdvLT5tb2RlKSB8fAorCQkgICAgZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhwLT5vbmUsIDEpIHx8CisJCSAgICBkaWZmX3BvcHVsYXRlX2ZpbGVzcGVjKHAtPnR3bywgMSkgfHwKKwkJICAgIChwLT5vbmUtPnNpemUgIT0gcC0+dHdvLT5zaXplKSB8fAorCQkgICAgIWRpZmZfZmlsZXNwZWNfaXNfaWRlbnRpY2FsKHAtPm9uZSwgcC0+dHdvKSkgLyogKDIpICovCisJCQlkaWZmX3EoJm91dHEsIHApOworCQllbHNlIHsKKwkJCS8qCisJCQkgKiBUaGUgY2FsbGVyIGNhbiBzdWJ0cmFjdCAxIGZyb20gc2tpcF9zdGF0X3VubWF0Y2gKKwkJCSAqIHRvIGRldGVybWluZSBob3cgbWFueSBwYXRocyB3ZXJlIGRpcnR5IG9ubHkKKwkJCSAqIGR1ZSB0byBzdGF0IGluZm8gbWlzbWF0Y2guCisJCQkgKi8KKwkJCWlmICghRElGRl9PUFRfVFNUKGRpZmZvcHQsIE5PX0lOREVYKSkKKwkJCQlkaWZmb3B0LT5za2lwX3N0YXRfdW5tYXRjaCsrOworCQkJZGlmZl9mcmVlX2ZpbGVwYWlyKHApOworCQl9CisJfQorCWZyZWUocS0+cXVldWUpOworCSpxID0gb3V0cTsKK30KKwordm9pZCBkaWZmY29yZV9zdGQoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucykKK3sKKwlpZiAoRElGRl9PUFRfVFNUKG9wdGlvbnMsIFFVSUVUKSkKKwkJcmV0dXJuOworCisJaWYgKG9wdGlvbnMtPnNraXBfc3RhdF91bm1hdGNoICYmICFESUZGX09QVF9UU1Qob3B0aW9ucywgRklORF9DT1BJRVNfSEFSREVSKSkKKwkJZGlmZmNvcmVfc2tpcF9zdGF0X3VubWF0Y2gob3B0aW9ucyk7CisJaWYgKG9wdGlvbnMtPmJyZWFrX29wdCAhPSAtMSkKKwkJZGlmZmNvcmVfYnJlYWsob3B0aW9ucy0+YnJlYWtfb3B0KTsKKwlpZiAob3B0aW9ucy0+ZGV0ZWN0X3JlbmFtZSkKKwkJZGlmZmNvcmVfcmVuYW1lKG9wdGlvbnMpOworCWlmIChvcHRpb25zLT5icmVha19vcHQgIT0gLTEpCisJCWRpZmZjb3JlX21lcmdlX2Jyb2tlbigpOworCWlmIChvcHRpb25zLT5waWNrYXhlKQorCQlkaWZmY29yZV9waWNrYXhlKG9wdGlvbnMtPnBpY2theGUsIG9wdGlvbnMtPnBpY2theGVfb3B0cyk7CisJaWYgKG9wdGlvbnMtPm9yZGVyZmlsZSkKKwkJZGlmZmNvcmVfb3JkZXIob3B0aW9ucy0+b3JkZXJmaWxlKTsKKwlkaWZmX3Jlc29sdmVfcmVuYW1lX2NvcHkoKTsKKwlkaWZmY29yZV9hcHBseV9maWx0ZXIob3B0aW9ucy0+ZmlsdGVyKTsKKworCWlmIChkaWZmX3F1ZXVlZF9kaWZmLm5yKQorCQlESUZGX09QVF9TRVQob3B0aW9ucywgSEFTX0NIQU5HRVMpOworCWVsc2UKKwkJRElGRl9PUFRfQ0xSKG9wdGlvbnMsIEhBU19DSEFOR0VTKTsKK30KKworaW50IGRpZmZfcmVzdWx0X2NvZGUoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0LCBpbnQgc3RhdHVzKQoreworCWludCByZXN1bHQgPSAwOworCWlmICghRElGRl9PUFRfVFNUKG9wdCwgRVhJVF9XSVRIX1NUQVRVUykgJiYKKwkgICAgIShvcHQtPm91dHB1dF9mb3JtYXQgJiBESUZGX0ZPUk1BVF9DSEVDS0RJRkYpKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChESUZGX09QVF9UU1Qob3B0LCBFWElUX1dJVEhfU1RBVFVTKSAmJgorCSAgICBESUZGX09QVF9UU1Qob3B0LCBIQVNfQ0hBTkdFUykpCisJCXJlc3VsdCB8PSAwMTsKKwlpZiAoKG9wdC0+b3V0cHV0X2Zvcm1hdCAmIERJRkZfRk9STUFUX0NIRUNLRElGRikgJiYKKwkgICAgRElGRl9PUFRfVFNUKG9wdCwgQ0hFQ0tfRkFJTEVEKSkKKwkJcmVzdWx0IHw9IDAyOworCXJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgZGlmZl9hZGRyZW1vdmUoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywKKwkJICAgIGludCBhZGRyZW1vdmUsIHVuc2lnbmVkIG1vZGUsCisJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkgICAgY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwljaGFyIGNvbmNhdHBhdGhbUEFUSF9NQVhdOworCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUsICp0d287CisKKwkvKiBUaGlzIG1heSBsb29rIG9kZCwgYnV0IGl0IGlzIGEgcHJlcGFyYXRpb24gZm9yCisJICogZmVlZGluZyAidGhlcmUgYXJlIHVuY2hhbmdlZCBmaWxlcyB3aGljaCBzaG91bGQKKwkgKiBub3QgcHJvZHVjZSBkaWZmcywgYnV0IHdoZW4geW91IGFyZSBkb2luZyBjb3B5CisJICogZGV0ZWN0aW9uIHlvdSB3b3VsZCBuZWVkIHRoZW0sIHNvIGhlcmUgdGhleSBhcmUiCisJICogZW50cmllcyB0byB0aGUgZGlmZi1jb3JlLiAgVGhleSB3aWxsIGJlIHByZWZpeGVkCisJICogd2l0aCBzb21ldGhpbmcgbGlrZSAnPScgb3IgJyonIChJIGhhdmVuJ3QgZGVjaWRlZAorCSAqIHdoaWNoIGJ1dCBzaG91bGQgbm90IG1ha2UgYW55IGRpZmZlcmVuY2UpLgorCSAqIEZlZWRpbmcgdGhlIHNhbWUgbmV3IGFuZCBvbGQgdG8gZGlmZl9jaGFuZ2UoKQorCSAqIGFsc28gaGFzIHRoZSBzYW1lIGVmZmVjdC4KKwkgKiBCZWZvcmUgdGhlIGZpbmFsIG91dHB1dCBoYXBwZW5zLCB0aGV5IGFyZSBwcnVuZWQgYWZ0ZXIKKwkgKiBtZXJnZWQgaW50byByZW5hbWUvY29weSBwYWlycyBhcyBhcHByb3ByaWF0ZS4KKwkgKi8KKwlpZiAoRElGRl9PUFRfVFNUKG9wdGlvbnMsIFJFVkVSU0VfRElGRikpCisJCWFkZHJlbW92ZSA9IChhZGRyZW1vdmUgPT0gJysnID8gJy0nIDoKKwkJCSAgICAgYWRkcmVtb3ZlID09ICctJyA/ICcrJyA6IGFkZHJlbW92ZSk7CisKKwlpZiAoIXBhdGgpIHBhdGggPSAiIjsKKwlzcHJpbnRmKGNvbmNhdHBhdGgsICIlcyVzIiwgYmFzZSwgcGF0aCk7CisKKwlpZiAob3B0aW9ucy0+cHJlZml4ICYmCisJICAgIHN0cm5jbXAoY29uY2F0cGF0aCwgb3B0aW9ucy0+cHJlZml4LCBvcHRpb25zLT5wcmVmaXhfbGVuZ3RoKSkKKwkJcmV0dXJuOworCisJb25lID0gYWxsb2NfZmlsZXNwZWMoY29uY2F0cGF0aCk7CisJdHdvID0gYWxsb2NfZmlsZXNwZWMoY29uY2F0cGF0aCk7CisKKwlpZiAoYWRkcmVtb3ZlICE9ICcrJykKKwkJZmlsbF9maWxlc3BlYyhvbmUsIHNoYTEsIG1vZGUpOworCWlmIChhZGRyZW1vdmUgIT0gJy0nKQorCQlmaWxsX2ZpbGVzcGVjKHR3bywgc2hhMSwgbW9kZSk7CisKKwlkaWZmX3F1ZXVlKCZkaWZmX3F1ZXVlZF9kaWZmLCBvbmUsIHR3byk7CisJRElGRl9PUFRfU0VUKG9wdGlvbnMsIEhBU19DSEFOR0VTKTsKK30KKwordm9pZCBkaWZmX2NoYW5nZShzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHRpb25zLAorCQkgdW5zaWduZWQgb2xkX21vZGUsIHVuc2lnbmVkIG5ld19tb2RlLAorCQkgY29uc3QgdW5zaWduZWQgY2hhciAqb2xkX3NoYTEsCisJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpuZXdfc2hhMSwKKwkJIGNvbnN0IGNoYXIgKmJhc2UsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJY2hhciBjb25jYXRwYXRoW1BBVEhfTUFYXTsKKwlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLCAqdHdvOworCisJaWYgKERJRkZfT1BUX1RTVChvcHRpb25zLCBSRVZFUlNFX0RJRkYpKSB7CisJCXVuc2lnbmVkIHRtcDsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqdG1wX2M7CisJCXRtcCA9IG9sZF9tb2RlOyBvbGRfbW9kZSA9IG5ld19tb2RlOyBuZXdfbW9kZSA9IHRtcDsKKwkJdG1wX2MgPSBvbGRfc2hhMTsgb2xkX3NoYTEgPSBuZXdfc2hhMTsgbmV3X3NoYTEgPSB0bXBfYzsKKwl9CisJaWYgKCFwYXRoKSBwYXRoID0gIiI7CisJc3ByaW50Zihjb25jYXRwYXRoLCAiJXMlcyIsIGJhc2UsIHBhdGgpOworCisJaWYgKG9wdGlvbnMtPnByZWZpeCAmJgorCSAgICBzdHJuY21wKGNvbmNhdHBhdGgsIG9wdGlvbnMtPnByZWZpeCwgb3B0aW9ucy0+cHJlZml4X2xlbmd0aCkpCisJCXJldHVybjsKKworCW9uZSA9IGFsbG9jX2ZpbGVzcGVjKGNvbmNhdHBhdGgpOworCXR3byA9IGFsbG9jX2ZpbGVzcGVjKGNvbmNhdHBhdGgpOworCWZpbGxfZmlsZXNwZWMob25lLCBvbGRfc2hhMSwgb2xkX21vZGUpOworCWZpbGxfZmlsZXNwZWModHdvLCBuZXdfc2hhMSwgbmV3X21vZGUpOworCisJZGlmZl9xdWV1ZSgmZGlmZl9xdWV1ZWRfZGlmZiwgb25lLCB0d28pOworCURJRkZfT1BUX1NFVChvcHRpb25zLCBIQVNfQ0hBTkdFUyk7Cit9CisKK3ZvaWQgZGlmZl91bm1lcmdlKHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMsCisJCSAgY29uc3QgY2hhciAqcGF0aCwKKwkJICB1bnNpZ25lZCBtb2RlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUsICp0d287CisKKwlpZiAob3B0aW9ucy0+cHJlZml4ICYmCisJICAgIHN0cm5jbXAocGF0aCwgb3B0aW9ucy0+cHJlZml4LCBvcHRpb25zLT5wcmVmaXhfbGVuZ3RoKSkKKwkJcmV0dXJuOworCisJb25lID0gYWxsb2NfZmlsZXNwZWMocGF0aCk7CisJdHdvID0gYWxsb2NfZmlsZXNwZWMocGF0aCk7CisJZmlsbF9maWxlc3BlYyhvbmUsIHNoYTEsIG1vZGUpOworCWRpZmZfcXVldWUoJmRpZmZfcXVldWVkX2RpZmYsIG9uZSwgdHdvKS0+aXNfdW5tZXJnZWQgPSAxOworfQpkaWZmIC0tZ2l0IGEvZGlmZi5oIGIvZGlmZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYzc3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9kaWZmLmgKQEAgLTAsMCArMSwyNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyAqLworI2lmbmRlZiBESUZGX0gKKyNkZWZpbmUgRElGRl9ICisKKyNpbmNsdWRlICJ0cmVlLXdhbGsuaCIKKworc3RydWN0IHJldl9pbmZvOworc3RydWN0IGRpZmZfb3B0aW9uczsKK3N0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdDsKKwordHlwZWRlZiB2b2lkICgqY2hhbmdlX2ZuX3QpKHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMsCisJCSB1bnNpZ25lZCBvbGRfbW9kZSwgdW5zaWduZWQgbmV3X21vZGUsCisJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpvbGRfc2hhMSwKKwkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ld19zaGExLAorCQkgY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqcGF0aCk7CisKK3R5cGVkZWYgdm9pZCAoKmFkZF9yZW1vdmVfZm5fdCkoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywKKwkJICAgIGludCBhZGRyZW1vdmUsIHVuc2lnbmVkIG1vZGUsCisJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkgICAgY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqcGF0aCk7CisKK3R5cGVkZWYgdm9pZCAoKmRpZmZfZm9ybWF0X2ZuX3QpKHN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSwKKwkJc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywgdm9pZCAqZGF0YSk7CisKKyNkZWZpbmUgRElGRl9GT1JNQVRfUkFXCQkweDAwMDEKKyNkZWZpbmUgRElGRl9GT1JNQVRfRElGRlNUQVQJMHgwMDAyCisjZGVmaW5lIERJRkZfRk9STUFUX05VTVNUQVQJMHgwMDA0CisjZGVmaW5lIERJRkZfRk9STUFUX1NVTU1BUlkJMHgwMDA4CisjZGVmaW5lIERJRkZfRk9STUFUX1BBVENICTB4MDAxMAorI2RlZmluZSBESUZGX0ZPUk1BVF9TSE9SVFNUQVQJMHgwMDIwCisjZGVmaW5lIERJRkZfRk9STUFUX0RJUlNUQVQJMHgwMDQwCisjZGVmaW5lIERJRkZfRk9STUFUX0NVTVVMQVRJVkUJMHgwMDgwCisKKy8qIFRoZXNlIG92ZXJyaWRlIGFsbCBhYm92ZSAqLworI2RlZmluZSBESUZGX0ZPUk1BVF9OQU1FCTB4MDEwMAorI2RlZmluZSBESUZGX0ZPUk1BVF9OQU1FX1NUQVRVUwkweDAyMDAKKyNkZWZpbmUgRElGRl9GT1JNQVRfQ0hFQ0tESUZGCTB4MDQwMAorCisvKiBTYW1lIGFzIG91dHB1dF9mb3JtYXQgPSAwIGJ1dCB3ZSBrbm93IHRoYXQgLXMgZmxhZyB3YXMgZ2l2ZW4KKyAqIGFuZCB3ZSBzaG91bGQgbm90IGdpdmUgZGVmYXVsdCB2YWx1ZSB0byBvdXRwdXRfZm9ybWF0LgorICovCisjZGVmaW5lIERJRkZfRk9STUFUX05PX09VVFBVVAkweDA4MDAKKworI2RlZmluZSBESUZGX0ZPUk1BVF9DQUxMQkFDSwkweDEwMDAKKworI2RlZmluZSBESUZGX09QVF9SRUNVUlNJVkUgICAgICAgICAgICgxIDw8ICAwKQorI2RlZmluZSBESUZGX09QVF9UUkVFX0lOX1JFQ1VSU0lWRSAgICgxIDw8ICAxKQorI2RlZmluZSBESUZGX09QVF9CSU5BUlkgICAgICAgICAgICAgICgxIDw8ICAyKQorI2RlZmluZSBESUZGX09QVF9URVhUICAgICAgICAgICAgICAgICgxIDw8ICAzKQorI2RlZmluZSBESUZGX09QVF9GVUxMX0lOREVYICAgICAgICAgICgxIDw8ICA0KQorI2RlZmluZSBESUZGX09QVF9TSUxFTlRfT05fUkVNT1ZFICAgICgxIDw8ICA1KQorI2RlZmluZSBESUZGX09QVF9GSU5EX0NPUElFU19IQVJERVIgICgxIDw8ICA2KQorI2RlZmluZSBESUZGX09QVF9GT0xMT1dfUkVOQU1FUyAgICAgICgxIDw8ICA3KQorI2RlZmluZSBESUZGX09QVF9DT0xPUl9ESUZGICAgICAgICAgICgxIDw8ICA4KQorI2RlZmluZSBESUZGX09QVF9DT0xPUl9ESUZGX1dPUkRTICAgICgxIDw8ICA5KQorI2RlZmluZSBESUZGX09QVF9IQVNfQ0hBTkdFUyAgICAgICAgICgxIDw8IDEwKQorI2RlZmluZSBESUZGX09QVF9RVUlFVCAgICAgICAgICAgICAgICgxIDw8IDExKQorI2RlZmluZSBESUZGX09QVF9OT19JTkRFWCAgICAgICAgICAgICgxIDw8IDEyKQorI2RlZmluZSBESUZGX09QVF9BTExPV19FWFRFUk5BTCAgICAgICgxIDw8IDEzKQorI2RlZmluZSBESUZGX09QVF9FWElUX1dJVEhfU1RBVFVTICAgICgxIDw8IDE0KQorI2RlZmluZSBESUZGX09QVF9SRVZFUlNFX0RJRkYgICAgICAgICgxIDw8IDE1KQorI2RlZmluZSBESUZGX09QVF9DSEVDS19GQUlMRUQgICAgICAgICgxIDw8IDE2KQorI2RlZmluZSBESUZGX09QVF9SRUxBVElWRV9OQU1FICAgICAgICgxIDw8IDE3KQorI2RlZmluZSBESUZGX09QVF9UU1Qob3B0cywgZmxhZykgICAgKChvcHRzKS0+ZmxhZ3MgJiBESUZGX09QVF8jI2ZsYWcpCisjZGVmaW5lIERJRkZfT1BUX1NFVChvcHRzLCBmbGFnKSAgICAoKG9wdHMpLT5mbGFncyB8PSBESUZGX09QVF8jI2ZsYWcpCisjZGVmaW5lIERJRkZfT1BUX0NMUihvcHRzLCBmbGFnKSAgICAoKG9wdHMpLT5mbGFncyAmPSB+RElGRl9PUFRfIyNmbGFnKQorCitzdHJ1Y3QgZGlmZl9vcHRpb25zIHsKKwljb25zdCBjaGFyICpmaWx0ZXI7CisJY29uc3QgY2hhciAqb3JkZXJmaWxlOworCWNvbnN0IGNoYXIgKnBpY2theGU7CisJY29uc3QgY2hhciAqc2luZ2xlX2ZvbGxvdzsKKwljb25zdCBjaGFyICphX3ByZWZpeCwgKmJfcHJlZml4OworCXVuc2lnbmVkIGZsYWdzOworCWludCBjb250ZXh0OworCWludCBicmVha19vcHQ7CisJaW50IGRldGVjdF9yZW5hbWU7CisJaW50IHNraXBfc3RhdF91bm1hdGNoOworCWludCBsaW5lX3Rlcm1pbmF0aW9uOworCWludCBvdXRwdXRfZm9ybWF0OworCWludCBwaWNrYXhlX29wdHM7CisJaW50IHJlbmFtZV9zY29yZTsKKwlpbnQgcmVuYW1lX2xpbWl0OworCWludCBkaXJzdGF0X3BlcmNlbnQ7CisJaW50IHNldHVwOworCWludCBhYmJyZXY7CisJY29uc3QgY2hhciAqcHJlZml4OworCWludCBwcmVmaXhfbGVuZ3RoOworCWNvbnN0IGNoYXIgKm1zZ19zZXA7CisJY29uc3QgY2hhciAqc3RhdF9zZXA7CisJbG9uZyB4ZGxfb3B0czsKKworCWludCBzdGF0X3dpZHRoOworCWludCBzdGF0X25hbWVfd2lkdGg7CisKKwkvKiB0aGlzIGlzIHNldCBieSBkaWZmY29yZSBmb3IgRElGRl9GT1JNQVRfUEFUQ0ggKi8KKwlpbnQgZm91bmRfY2hhbmdlczsKKworCUZJTEUgKmZpbGU7CisJaW50IGNsb3NlX2ZpbGU7CisKKwlpbnQgbnJfcGF0aHM7CisJY29uc3QgY2hhciAqKnBhdGhzOworCWludCAqcGF0aGxlbnM7CisJY2hhbmdlX2ZuX3QgY2hhbmdlOworCWFkZF9yZW1vdmVfZm5fdCBhZGRfcmVtb3ZlOworCWRpZmZfZm9ybWF0X2ZuX3QgZm9ybWF0X2NhbGxiYWNrOworCXZvaWQgKmZvcm1hdF9jYWxsYmFja19kYXRhOworfTsKKworZW51bSBjb2xvcl9kaWZmIHsKKwlESUZGX1JFU0VUID0gMCwKKwlESUZGX1BMQUlOID0gMSwKKwlESUZGX01FVEFJTkZPID0gMiwKKwlESUZGX0ZSQUdJTkZPID0gMywKKwlESUZGX0ZJTEVfT0xEID0gNCwKKwlESUZGX0ZJTEVfTkVXID0gNSwKKwlESUZGX0NPTU1JVCA9IDYsCisJRElGRl9XSElURVNQQUNFID0gNywKK307Citjb25zdCBjaGFyICpkaWZmX2dldF9jb2xvcihpbnQgZGlmZl91c2VfY29sb3IsIGVudW0gY29sb3JfZGlmZiBpeCk7CisjZGVmaW5lIGRpZmZfZ2V0X2NvbG9yX29wdChvLCBpeCkgXAorCWRpZmZfZ2V0X2NvbG9yKERJRkZfT1BUX1RTVCgobyksIENPTE9SX0RJRkYpLCBpeCkKKworCitleHRlcm4gY29uc3QgY2hhciBtaW1lX2JvdW5kYXJ5X2xlYWRlcltdOworCitleHRlcm4gdm9pZCBkaWZmX3RyZWVfc2V0dXBfcGF0aHMoY29uc3QgY2hhciAqKnBhdGhzLCBzdHJ1Y3QgZGlmZl9vcHRpb25zICopOworZXh0ZXJuIHZvaWQgZGlmZl90cmVlX3JlbGVhc2VfcGF0aHMoc3RydWN0IGRpZmZfb3B0aW9ucyAqKTsKK2V4dGVybiBpbnQgZGlmZl90cmVlKHN0cnVjdCB0cmVlX2Rlc2MgKnQxLCBzdHJ1Y3QgdHJlZV9kZXNjICp0MiwKKwkJICAgICBjb25zdCBjaGFyICpiYXNlLCBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQpOworZXh0ZXJuIGludCBkaWZmX3RyZWVfc2hhMShjb25zdCB1bnNpZ25lZCBjaGFyICpvbGQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ldywKKwkJCSAgY29uc3QgY2hhciAqYmFzZSwgc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0KTsKK2V4dGVybiBpbnQgZGlmZl9yb290X3RyZWVfc2hhMShjb25zdCB1bnNpZ25lZCBjaGFyICpuZXcsIGNvbnN0IGNoYXIgKmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0KTsKKworc3RydWN0IGNvbWJpbmVfZGlmZl9wYXRoIHsKKwlzdHJ1Y3QgY29tYmluZV9kaWZmX3BhdGggKm5leHQ7CisJaW50IGxlbjsKKwljaGFyICpwYXRoOworCXVuc2lnbmVkIGludCBtb2RlOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJc3RydWN0IGNvbWJpbmVfZGlmZl9wYXJlbnQgeworCQljaGFyIHN0YXR1czsKKwkJdW5zaWduZWQgaW50IG1vZGU7CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJfSBwYXJlbnRbRkxFWF9BUlJBWV07Cit9OworI2RlZmluZSBjb21iaW5lX2RpZmZfcGF0aF9zaXplKG4sIGwpIFwKKwkoc2l6ZW9mKHN0cnVjdCBjb21iaW5lX2RpZmZfcGF0aCkgKyBcCisJIHNpemVvZihzdHJ1Y3QgY29tYmluZV9kaWZmX3BhcmVudCkgKiAobikgKyAobCkgKyAxKQorCitleHRlcm4gdm9pZCBzaG93X2NvbWJpbmVkX2RpZmYoc3RydWN0IGNvbWJpbmVfZGlmZl9wYXRoICplbGVtLCBpbnQgbnVtX3BhcmVudCwKKwkJCSAgICAgIGludCBkZW5zZSwgc3RydWN0IHJldl9pbmZvICopOworCitleHRlcm4gdm9pZCBkaWZmX3RyZWVfY29tYmluZWQoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgdW5zaWduZWQgY2hhciBwYXJlbnRbXVsyMF0sIGludCBudW1fcGFyZW50LCBpbnQgZGVuc2UsIHN0cnVjdCByZXZfaW5mbyAqcmV2KTsKKworZXh0ZXJuIHZvaWQgZGlmZl90cmVlX2NvbWJpbmVkX21lcmdlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCwgc3RydWN0IHJldl9pbmZvICopOworCitleHRlcm4gdm9pZCBkaWZmX2FkZHJlbW92ZShzdHJ1Y3QgZGlmZl9vcHRpb25zICosCisJCQkgICBpbnQgYWRkcmVtb3ZlLAorCQkJICAgdW5zaWduZWQgbW9kZSwKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkgICBjb25zdCBjaGFyICpiYXNlLAorCQkJICAgY29uc3QgY2hhciAqcGF0aCk7CisKK2V4dGVybiB2b2lkIGRpZmZfY2hhbmdlKHN0cnVjdCBkaWZmX29wdGlvbnMgKiwKKwkJCXVuc2lnbmVkIG1vZGUxLCB1bnNpZ25lZCBtb2RlMiwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaGEyLAorCQkJY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqcGF0aCk7CisKK2V4dGVybiB2b2lkIGRpZmZfdW5tZXJnZShzdHJ1Y3QgZGlmZl9vcHRpb25zICosCisJCQkgY29uc3QgY2hhciAqcGF0aCwKKwkJCSB1bnNpZ25lZCBtb2RlLAorCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCisjZGVmaW5lIERJRkZfU0VUVVBfUkVWRVJTRSAgICAgIAkxCisjZGVmaW5lIERJRkZfU0VUVVBfVVNFX0NBQ0hFCQkyCisjZGVmaW5lIERJRkZfU0VUVVBfVVNFX1NJWkVfQ0FDSEUJNAorCitleHRlcm4gaW50IGdpdF9kaWZmX2Jhc2ljX2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK2V4dGVybiBpbnQgZ2l0X2RpZmZfdWlfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpOworZXh0ZXJuIGludCBkaWZmX3VzZV9jb2xvcl9kZWZhdWx0OworZXh0ZXJuIHZvaWQgZGlmZl9zZXR1cChzdHJ1Y3QgZGlmZl9vcHRpb25zICopOworZXh0ZXJuIGludCBkaWZmX29wdF9wYXJzZShzdHJ1Y3QgZGlmZl9vcHRpb25zICosIGNvbnN0IGNoYXIgKiosIGludCk7CitleHRlcm4gaW50IGRpZmZfc2V0dXBfZG9uZShzdHJ1Y3QgZGlmZl9vcHRpb25zICopOworCisjZGVmaW5lIERJRkZfREVURUNUX1JFTkFNRQkxCisjZGVmaW5lIERJRkZfREVURUNUX0NPUFkJMgorCisjZGVmaW5lIERJRkZfUElDS0FYRV9BTEwJMQorI2RlZmluZSBESUZGX1BJQ0tBWEVfUkVHRVgJMgorCitleHRlcm4gdm9pZCBkaWZmY29yZV9zdGQoc3RydWN0IGRpZmZfb3B0aW9ucyAqKTsKKworI2RlZmluZSBDT01NT05fRElGRl9PUFRJT05TX0hFTFAgXAorIlxuY29tbW9uIGRpZmYgb3B0aW9uczpcbiIgXAorIiAgLXogICAgICAgICAgICBvdXRwdXQgZGlmZi1yYXcgd2l0aCBsaW5lcyB0ZXJtaW5hdGVkIHdpdGggTlVMLlxuIiBcCisiICAtcCAgICAgICAgICAgIG91dHB1dCBwYXRjaCBmb3JtYXQuXG4iIFwKKyIgIC11ICAgICAgICAgICAgc3lub255bSBmb3IgLXAuXG4iIFwKKyIgIC0tcGF0Y2gtd2l0aC1yYXdcbiIgXAorIiAgICAgICAgICAgICAgICBvdXRwdXQgYm90aCBhIHBhdGNoIGFuZCB0aGUgZGlmZi1yYXcgZm9ybWF0LlxuIiBcCisiICAtLXN0YXQgICAgICAgIHNob3cgZGlmZnN0YXQgaW5zdGVhZCBvZiBwYXRjaC5cbiIgXAorIiAgLS1udW1zdGF0ICAgICBzaG93IG51bWVyaWMgZGlmZnN0YXQgaW5zdGVhZCBvZiBwYXRjaC5cbiIgXAorIiAgLS1wYXRjaC13aXRoLXN0YXRcbiIgXAorIiAgICAgICAgICAgICAgICBvdXRwdXQgYSBwYXRjaCBhbmQgcHJlcGVuZCBpdHMgZGlmZnN0YXQuXG4iIFwKKyIgIC0tbmFtZS1vbmx5ICAgc2hvdyBvbmx5IG5hbWVzIG9mIGNoYW5nZWQgZmlsZXMuXG4iIFwKKyIgIC0tbmFtZS1zdGF0dXMgc2hvdyBuYW1lcyBhbmQgc3RhdHVzIG9mIGNoYW5nZWQgZmlsZXMuXG4iIFwKKyIgIC0tZnVsbC1pbmRleCAgc2hvdyBmdWxsIG9iamVjdCBuYW1lIG9uIGluZGV4IGxpbmVzLlxuIiBcCisiICAtLWFiYnJldj08bj4gIGFiYnJldmlhdGUgb2JqZWN0IG5hbWVzIGluIGRpZmYtdHJlZSBoZWFkZXIgYW5kIGRpZmYtcmF3LlxuIiBcCisiICAtUiAgICAgICAgICAgIHN3YXAgaW5wdXQgZmlsZSBwYWlycy5cbiIgXAorIiAgLUIgICAgICAgICAgICBkZXRlY3QgY29tcGxldGUgcmV3cml0ZXMuXG4iIFwKKyIgIC1NICAgICAgICAgICAgZGV0ZWN0IHJlbmFtZXMuXG4iIFwKKyIgIC1DICAgICAgICAgICAgZGV0ZWN0IGNvcGllcy5cbiIgXAorIiAgLS1maW5kLWNvcGllcy1oYXJkZXJcbiIgXAorIiAgICAgICAgICAgICAgICB0cnkgdW5jaGFuZ2VkIGZpbGVzIGFzIGNhbmRpZGF0ZSBmb3IgY29weSBkZXRlY3Rpb24uXG4iIFwKKyIgIC1sPG4+ICAgICAgICAgbGltaXQgcmVuYW1lIGF0dGVtcHRzIHVwIHRvIDxuPiBwYXRocy5cbiIgXAorIiAgLU88ZmlsZT4gICAgICByZW9yZGVyIGRpZmZzIGFjY29yZGluZyB0byB0aGUgPGZpbGU+LlxuIiBcCisiICAtUzxzdHJpbmc+ICAgIGZpbmQgZmlsZXBhaXIgd2hvc2Ugb25seSBvbmUgc2lkZSBjb250YWlucyB0aGUgc3RyaW5nLlxuIiBcCisiICAtLXBpY2theGUtYWxsXG4iIFwKKyIgICAgICAgICAgICAgICAgc2hvdyBhbGwgZmlsZXMgZGlmZiB3aGVuIC1TIGlzIHVzZWQgYW5kIGhpdCBpcyBmb3VuZC5cbiIgXAorIiAgLWEgIC0tdGV4dCAgICB0cmVhdCBhbGwgZmlsZXMgYXMgdGV4dC5cbiIKKworZXh0ZXJuIGludCBkaWZmX3F1ZXVlX2lzX2VtcHR5KHZvaWQpOworZXh0ZXJuIHZvaWQgZGlmZl9mbHVzaChzdHJ1Y3QgZGlmZl9vcHRpb25zKik7CisKKy8qIGRpZmYtcmF3IHN0YXR1cyBsZXR0ZXJzICovCisjZGVmaW5lIERJRkZfU1RBVFVTX0FEREVECQknQScKKyNkZWZpbmUgRElGRl9TVEFUVVNfQ09QSUVECQknQycKKyNkZWZpbmUgRElGRl9TVEFUVVNfREVMRVRFRAkJJ0QnCisjZGVmaW5lIERJRkZfU1RBVFVTX01PRElGSUVECQknTScKKyNkZWZpbmUgRElGRl9TVEFUVVNfUkVOQU1FRAkJJ1InCisjZGVmaW5lIERJRkZfU1RBVFVTX1RZUEVfQ0hBTkdFRAknVCcKKyNkZWZpbmUgRElGRl9TVEFUVVNfVU5LTk9XTgkJJ1gnCisjZGVmaW5lIERJRkZfU1RBVFVTX1VOTUVSR0VECQknVScKKworLyogdGhlc2UgYXJlIG5vdCBkaWZmLXJhdyBzdGF0dXMgbGV0dGVycyBwcm9wZXIsIGJ1dCB1c2VkIGJ5CisgKiBkaWZmY29yZS1maWx0ZXIgaW5zbiB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgcmVzdHJpY3Rpb25zLgorICovCisjZGVmaW5lIERJRkZfU1RBVFVTX0ZJTFRFUl9BT04JCScqJworI2RlZmluZSBESUZGX1NUQVRVU19GSUxURVJfQlJPS0VOCSdCJworCitleHRlcm4gY29uc3QgY2hhciAqZGlmZl91bmlxdWVfYWJicmV2KGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKKworLyogZG8gbm90IHJlcG9ydCBhbnl0aGluZyBvbiByZW1vdmVkIHBhdGhzICovCisjZGVmaW5lIERJRkZfU0lMRU5UX09OX1JFTU9WRUQgMDEKKy8qIHJlcG9ydCByYWNpbHktY2xlYW4gcGF0aHMgYXMgbW9kaWZpZWQgKi8KKyNkZWZpbmUgRElGRl9SQUNZX0lTX01PRElGSUVEIDAyCitleHRlcm4gaW50IHJ1bl9kaWZmX2ZpbGVzKHN0cnVjdCByZXZfaW5mbyAqcmV2cywgdW5zaWduZWQgaW50IG9wdGlvbik7CitleHRlcm4gaW50IHNldHVwX2RpZmZfbm9faW5kZXgoc3RydWN0IHJldl9pbmZvICpyZXZzLAorCQlpbnQgYXJnYywgY29uc3QgY2hhciAqKiBhcmd2LCBpbnQgbm9uZ2l0LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBydW5fZGlmZl9maWxlc19jbWQoc3RydWN0IHJldl9pbmZvICpyZXZzLCBpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpOworCitleHRlcm4gaW50IHJ1bl9kaWZmX2luZGV4KHN0cnVjdCByZXZfaW5mbyAqcmV2cywgaW50IGNhY2hlZCk7CisKK2V4dGVybiBpbnQgZG9fZGlmZl9jYWNoZShjb25zdCB1bnNpZ25lZCBjaGFyICosIHN0cnVjdCBkaWZmX29wdGlvbnMgKik7CitleHRlcm4gaW50IGRpZmZfZmx1c2hfcGF0Y2hfaWQoc3RydWN0IGRpZmZfb3B0aW9ucyAqLCB1bnNpZ25lZCBjaGFyICopOworCitleHRlcm4gaW50IGRpZmZfcmVzdWx0X2NvZGUoc3RydWN0IGRpZmZfb3B0aW9ucyAqLCBpbnQpOworCisjZW5kaWYgLyogRElGRl9IICovCmRpZmYgLS1naXQgYS9kaWZmY29yZS1icmVhay5jIGIvZGlmZmNvcmUtYnJlYWsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWNkY2ZlCi0tLSAvZGV2L251bGwKKysrIGIvZGlmZmNvcmUtYnJlYWsuYwpAQCAtMCwwICsxLDI5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBKdW5pbyBDIEhhbWFubworICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiZGlmZmNvcmUuaCIKKworc3RhdGljIGludCBzaG91bGRfYnJlYWsoc3RydWN0IGRpZmZfZmlsZXNwZWMgKnNyYywKKwkJCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpkc3QsCisJCQlpbnQgYnJlYWtfc2NvcmUsCisJCQlpbnQgKm1lcmdlX3Njb3JlX3ApCit7CisJLyogZHN0IGlzIHJlY29yZGVkIGFzIGEgbW9kaWZpY2F0aW9uIG9mIHNyYy4gIEFyZSB0aGV5IHNvCisJICogZGlmZmVyZW50IHRoYXQgd2UgYXJlIGJldHRlciBvZmYgcmVjb3JkaW5nIHRoaXMgYXMgYSBwYWlyCisJICogb2YgZGVsZXRlIGFuZCBjcmVhdGU/CisJICoKKwkgKiBUaGVyZSBhcmUgdHdvIGNyaXRlcmlhIHVzZWQgaW4gdGhpcyBhbGdvcml0aG0uICBGb3IgdGhlCisJICogcHVycG9zZXMgb2YgaGVscGluZyBsYXRlciByZW5hbWUvY29weSwgd2UgdGFrZSBib3RoIGRlbGV0ZQorCSAqIGFuZCBpbnNlcnQgaW50byBhY2NvdW50IGFuZCBlc3RpbWF0ZSB0aGUgYW1vdW50IG9mICJlZGl0Ii4KKwkgKiBJZiB0aGUgZWRpdCBpcyB2ZXJ5IGxhcmdlLCB3ZSBicmVhayB0aGlzIHBhaXIgc28gdGhhdAorCSAqIHJlbmFtZS9jb3B5IGNhbiBwaWNrIHRoZSBwaWVjZXMgdXAgdG8gbWF0Y2ggd2l0aCBvdGhlcgorCSAqIGZpbGVzLgorCSAqCisJICogT24gdGhlIG90aGVyIGhhbmQsIHdlIHdvdWxkIHdhbnQgdG8gaWdub3JlIGluc2VydHMgZm9yIHRoZQorCSAqIHB1cmUgImNvbXBsZXRlIHJld3JpdGUiIGRldGVjdGlvbi4gIEFzIGxvbmcgYXMgbW9zdCBvZiB0aGUKKwkgKiBleGlzdGluZyBjb250ZW50cyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgZmlsZSwgaXQgaXMgYQorCSAqIGNvbXBsZXRlIHJld3JpdGUsIGFuZCBpZiBzaXphYmxlIGNodW5rIGZyb20gdGhlIG9yaWdpbmFsCisJICogc3RpbGwgcmVtYWlucyBpbiB0aGUgcmVzdWx0LCBpdCBpcyBub3QgYSByZXdyaXRlLiAgSXQgZG9lcworCSAqIG5vdCBtYXR0ZXIgaG93IG11Y2ggb3IgaG93IGxpdHRsZSBuZXcgbWF0ZXJpYWwgaXMgYWRkZWQgdG8KKwkgKiB0aGUgZmlsZS4KKwkgKgorCSAqIFRoZSBzY29yZSB3ZSBsZWF2ZSBmb3Igc3VjaCBhIGJyb2tlbiBmaWxlcGFpciB1c2VzIHRoZQorCSAqIGxhdHRlciBkZWZpbml0aW9uIHNvIHRoYXQgbGF0ZXIgY2xlYW4tdXAgc3RhZ2UgY2FuIGZpbmQgdGhlCisJICogcGllY2VzIHRoYXQgc2hvdWxkIG5vdCBoYXZlIGJlZW4gYnJva2VuIGFjY29yZGluZyB0byB0aGUKKwkgKiBsYXR0ZXIgZGVmaW5pdGlvbiBhZnRlciByZW5hbWUvY29weSBydW5zLCBhbmQgbWVyZ2UgdGhlCisJICogYnJva2VuIHBhaXIgdGhhdCBoYXZlIGEgc2NvcmUgbG93ZXIgdGhhbiBnaXZlbiBjcml0ZXJpYQorCSAqIGJhY2sgdG9nZXRoZXIuICBUaGUgYnJlYWsgb3BlcmF0aW9uIGl0c2VsZiBoYXBwZW5zCisJICogYWNjb3JkaW5nIHRvIHRoZSBmb3JtZXIgZGVmaW5pdGlvbi4KKwkgKgorCSAqIFRoZSBtaW5pbXVtX2VkaXQgcGFyYW1ldGVyIHRlbGxzIHVzIHdoZW4gdG8gYnJlYWsgKHRoZQorCSAqIGFtb3VudCBvZiAiZWRpdCIgcmVxdWlyZWQgZm9yIHVzIHRvIGNvbnNpZGVyIGJyZWFraW5nIHRoZQorCSAqIHBhaXIpLiAgV2UgbGVhdmUgdGhlIGFtb3VudCBvZiBkZWxldGlvbiBpbiAqbWVyZ2Vfc2NvcmVfcAorCSAqIHdoZW4gd2UgcmV0dXJuLgorCSAqCisJICogVGhlIHZhbHVlIHdlIHJldHVybiBpcyAxIGlmIHdlIHdhbnQgdGhlIHBhaXIgdG8gYmUgYnJva2VuLAorCSAqIG9yIDAgaWYgd2UgZG8gbm90LgorCSAqLworCXVuc2lnbmVkIGxvbmcgZGVsdGFfc2l6ZSwgYmFzZV9zaXplLCBtYXhfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHNyY19jb3BpZWQsIGxpdGVyYWxfYWRkZWQsIHNyY19yZW1vdmVkOworCisJKm1lcmdlX3Njb3JlX3AgPSAwOyAvKiBhc3N1bWUgbm8gZGVsZXRpb24gLS0tICJkbyBub3QgYnJlYWsiCisJCQkgICAgICogaXMgdGhlIGRlZmF1bHQuCisJCQkgICAgICovCisKKwlpZiAoU19JU1JFRyhzcmMtPm1vZGUpICE9IFNfSVNSRUcoZHN0LT5tb2RlKSkgeworCQkqbWVyZ2Vfc2NvcmVfcCA9IChpbnQpTUFYX1NDT1JFOworCQlyZXR1cm4gMTsgLyogZXZlbiB0aGVpciB0eXBlcyBhcmUgZGlmZmVyZW50ICovCisJfQorCisJaWYgKHNyYy0+c2hhMV92YWxpZCAmJiBkc3QtPnNoYTFfdmFsaWQgJiYKKwkgICAgIWhhc2hjbXAoc3JjLT5zaGExLCBkc3QtPnNoYTEpKQorCQlyZXR1cm4gMDsgLyogdGhleSBhcmUgdGhlIHNhbWUgKi8KKworCWlmIChkaWZmX3BvcHVsYXRlX2ZpbGVzcGVjKHNyYywgMCkgfHwgZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhkc3QsIDApKQorCQlyZXR1cm4gMDsgLyogZXJyb3IgYnV0IGNhdWdodCBkb3duc3RyZWFtICovCisKKwliYXNlX3NpemUgPSAoKHNyYy0+c2l6ZSA8IGRzdC0+c2l6ZSkgPyBzcmMtPnNpemUgOiBkc3QtPnNpemUpOworCW1heF9zaXplID0gKChzcmMtPnNpemUgPiBkc3QtPnNpemUpID8gc3JjLT5zaXplIDogZHN0LT5zaXplKTsKKwlpZiAobWF4X3NpemUgPCBNSU5JTVVNX0JSRUFLX1NJWkUpCisJCXJldHVybiAwOyAvKiB3ZSBkbyBub3QgYnJlYWsgdG9vIHNtYWxsIGZpbGVwYWlyICovCisKKwlpZiAoZGlmZmNvcmVfY291bnRfY2hhbmdlcyhzcmMsIGRzdCwKKwkJCQkgICBOVUxMLCBOVUxMLAorCQkJCSAgIDAsCisJCQkJICAgJnNyY19jb3BpZWQsICZsaXRlcmFsX2FkZGVkKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBzYW5pdHkgKi8KKwlpZiAoc3JjLT5zaXplIDwgc3JjX2NvcGllZCkKKwkJc3JjX2NvcGllZCA9IHNyYy0+c2l6ZTsKKwlpZiAoZHN0LT5zaXplIDwgbGl0ZXJhbF9hZGRlZCArIHNyY19jb3BpZWQpIHsKKwkJaWYgKHNyY19jb3BpZWQgPCBkc3QtPnNpemUpCisJCQlsaXRlcmFsX2FkZGVkID0gZHN0LT5zaXplIC0gc3JjX2NvcGllZDsKKwkJZWxzZQorCQkJbGl0ZXJhbF9hZGRlZCA9IDA7CisJfQorCXNyY19yZW1vdmVkID0gc3JjLT5zaXplIC0gc3JjX2NvcGllZDsKKworCS8qIENvbXB1dGUgbWVyZ2Utc2NvcmUsIHdoaWNoIGlzICJob3cgbXVjaCBpcyByZW1vdmVkCisJICogZnJvbSB0aGUgc291cmNlIG1hdGVyaWFsIi4gIFRoZSBjbGVhbi11cCBzdGFnZSB3aWxsCisJICogbWVyZ2UgdGhlIHN1cnZpdmluZyBwYWlyIHRvZ2V0aGVyIGlmIHRoZSBzY29yZSBpcworCSAqIGxlc3MgdGhhbiB0aGUgbWluaW11bSwgYWZ0ZXIgcmVuYW1lL2NvcHkgcnVucy4KKwkgKi8KKwkqbWVyZ2Vfc2NvcmVfcCA9IChpbnQpKHNyY19yZW1vdmVkICogTUFYX1NDT1JFIC8gc3JjLT5zaXplKTsKKwlpZiAoKm1lcmdlX3Njb3JlX3AgPiBicmVha19zY29yZSkKKwkJcmV0dXJuIDE7CisKKwkvKiBFeHRlbnQgb2YgZGFtYWdlLCB3aGljaCBjb3VudHMgYm90aCBpbnNlcnRzIGFuZAorCSAqIGRlbGV0ZXMuCisJICovCisJZGVsdGFfc2l6ZSA9IHNyY19yZW1vdmVkICsgbGl0ZXJhbF9hZGRlZDsKKwlpZiAoZGVsdGFfc2l6ZSAqIE1BWF9TQ09SRSAvIG1heF9zaXplIDwgYnJlYWtfc2NvcmUpCisJCXJldHVybiAwOworCisJLyogSWYgeW91IHJlbW92ZWQgYSBsb3Qgd2l0aG91dCBhZGRpbmcgbmV3IG1hdGVyaWFsLCB0aGF0IGlzCisJICogbm90IHJlYWxseSBhIHJld3JpdGUuCisJICovCisJaWYgKChzcmMtPnNpemUgKiBicmVha19zY29yZSA8IHNyY19yZW1vdmVkICogTUFYX1NDT1JFKSAmJgorCSAgICAobGl0ZXJhbF9hZGRlZCAqIDIwIDwgc3JjX3JlbW92ZWQpICYmCisJICAgIChsaXRlcmFsX2FkZGVkICogMjAgPCBzcmNfY29waWVkKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCBkaWZmY29yZV9icmVhayhpbnQgYnJlYWtfc2NvcmUpCit7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxID0gJmRpZmZfcXVldWVkX2RpZmY7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0IG91dHE7CisKKwkvKiBXaGVuIHRoZSBmaWxlcGFpciBoYXMgdGhpcyBtdWNoIGVkaXQgKGluc2VydCBhbmQgZGVsZXRlKSwKKwkgKiBpdCBpcyBmaXJzdCBjb25zaWRlcmVkIHRvIGJlIGEgcmV3cml0ZSBhbmQgYnJva2VuIGludG8gYQorCSAqIGNyZWF0ZSBhbmQgZGVsZXRlIGZpbGVwYWlyLiAgVGhpcyBpcyB0byBoZWxwIGJyZWFraW5nIGEKKwkgKiBmaWxlIHRoYXQgaGFkIHRvbyBtdWNoIG5ldyBzdHVmZiBhZGRlZCwgcG9zc2libHkgZnJvbQorCSAqIG1vdmluZyBjb250ZW50cyBmcm9tIGFub3RoZXIgZmlsZSwgc28gdGhhdCByZW5hbWUvY29weSBjYW4KKwkgKiBtYXRjaCBpdCB3aXRoIHRoZSBvdGhlciBmaWxlLgorCSAqCisJICogaW50IGJyZWFrX3Njb3JlOyB3ZSByZXVzZSBpbmNvbWluZyBwYXJhbWV0ZXIgZm9yIHRoaXMuCisJICovCisKKwkvKiBBZnRlciBhIHBhaXIgaXMgYnJva2VuIGFjY29yZGluZyB0byBicmVha19zY29yZSBhbmQKKwkgKiBzdWJqZWN0ZWQgdG8gcmVuYW1lL2NvcHksIGJvdGggb2YgdGhlbSBtYXkgc3Vydml2ZSBpbnRhY3QsCisJICogZHVlIHRvIGxhY2sgb2Ygc3VpdGFibGUgcmVuYW1lL2NvcHkgcGVlci4gIE9yLCB0aGUgY2FsbGVyCisJICogbWF5IGJlIGNhbGxpbmcgdXMgd2l0aG91dCB1c2luZyByZW5hbWUvY29weS4gIFdoZW4gdGhhdAorCSAqIGhhcHBlbnMsIHdlIG1lcmdlIHRoZSBicm9rZW4gcGllY2VzIGJhY2sgaW50byBvbmUKKwkgKiBtb2RpZmljYXRpb24gdG9nZXRoZXIgaWYgdGhlIHBhaXIgZGlkIG5vdCBoYXZlIG1vcmUgdGhhbgorCSAqIHRoaXMgbXVjaCBkZWxldGUuICBGb3IgdGhpcyBjb21wdXRhdGlvbiwgd2UgZG8gbm90IHRha2UKKwkgKiBpbnNlcnQgaW50byBhY2NvdW50IGF0IGFsbC4gIElmIHlvdSBzdGFydCBmcm9tIGEgMTAwLWxpbmUKKwkgKiBmaWxlIGFuZCBkZWxldGUgOTcgbGluZXMgb2YgaXQsIGl0IGRvZXMgbm90IG1hdHRlciBpZiB5b3UKKwkgKiBhZGQgMjcgbGluZXMgdG8gaXQgdG8gbWFrZSBhIG5ldyAzMC1saW5lIGZpbGUgb3IgaWYgeW91IGFkZAorCSAqIDk5NyBsaW5lcyB0byBpdCB0byBtYWtlIGEgMTAwMC1saW5lIGZpbGUuICBFaXRoZXIgd2F5IHdoYXQKKwkgKiB5b3UgZGlkIHdhcyBhIHJld3JpdGUgb2YgOTclLiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHlvdQorCSAqIGRlbGV0ZSAzIGxpbmVzLCBrZWVwaW5nIDk3IGxpbmVzIGludGFjdCwgaXQgZG9lcyBub3QgbWF0dGVyCisJICogaWYgeW91IGFkZCAzIGxpbmVzIHRvIGl0IHRvIG1ha2UgYSBuZXcgMTAwLWxpbmUgZmlsZSBvciBpZgorCSAqIHlvdSBhZGQgOTAzIGxpbmVzIHRvIGl0IHRvIG1ha2UgYSBuZXcgMTAwMC1saW5lIGZpbGUuCisJICogRWl0aGVyIHdheSB5b3UgZGlkIGEgbG90IG9mIGFkZGl0aW9ucyBhbmQgbm90IGEgcmV3cml0ZS4KKwkgKiBUaGlzIG1lcmdlIGhhcHBlbnMgdG8gY2F0Y2ggdGhlIGxhdHRlciBjYXNlLiAgQSBtZXJnZV9zY29yZQorCSAqIG9mIDgwJSB3b3VsZCBiZSBhIGdvb2QgZGVmYXVsdCB2YWx1ZSAoYSBicm9rZW4gcGFpciB0aGF0CisJICogaGFzIHNjb3JlIGxvd2VyIHRoYW4gbWVyZ2Vfc2NvcmUgd2lsbCBiZSBtZXJnZWQgYmFjaworCSAqIHRvZ2V0aGVyKS4KKwkgKi8KKwlpbnQgbWVyZ2Vfc2NvcmU7CisJaW50IGk7CisKKwkvKiBTZWUgY29tbWVudCBvbiBERUZBVUxUX0JSRUFLX1NDT1JFIGFuZAorCSAqIERFRkFVTFRfTUVSR0VfU0NPUkUgaW4gZGlmZmNvcmUuaAorCSAqLworCW1lcmdlX3Njb3JlID0gKGJyZWFrX3Njb3JlID4+IDE2KSAmIDB4RkZGRjsKKwlicmVha19zY29yZSA9IChicmVha19zY29yZSAmIDB4RkZGRik7CisKKwlpZiAoIWJyZWFrX3Njb3JlKQorCQlicmVha19zY29yZSA9IERFRkFVTFRfQlJFQUtfU0NPUkU7CisJaWYgKCFtZXJnZV9zY29yZSkKKwkJbWVyZ2Vfc2NvcmUgPSBERUZBVUxUX01FUkdFX1NDT1JFOworCisJb3V0cS5uciA9IG91dHEuYWxsb2MgPSAwOworCW91dHEucXVldWUgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJaW50IHNjb3JlOworCisJCS8qCisJCSAqIFdlIGRlYWwgb25seSB3aXRoIGluLXBsYWNlIGVkaXQgb2YgYmxvYnMuCisJCSAqIFdlIGRvIG5vdCBicmVhayBhbnl0aGluZyBlbHNlLgorCQkgKi8KKwkJaWYgKERJRkZfRklMRV9WQUxJRChwLT5vbmUpICYmIERJRkZfRklMRV9WQUxJRChwLT50d28pICYmCisJCSAgICBvYmplY3RfdHlwZShwLT5vbmUtPm1vZGUpID09IE9CSl9CTE9CICYmCisJCSAgICBvYmplY3RfdHlwZShwLT50d28tPm1vZGUpID09IE9CSl9CTE9CICYmCisJCSAgICAhc3RyY21wKHAtPm9uZS0+cGF0aCwgcC0+dHdvLT5wYXRoKSkgeworCQkJaWYgKHNob3VsZF9icmVhayhwLT5vbmUsIHAtPnR3bywKKwkJCQkJIGJyZWFrX3Njb3JlLCAmc2NvcmUpKSB7CisJCQkJLyogU3BsaXQgdGhpcyBpbnRvIGRlbGV0ZSBhbmQgY3JlYXRlICovCisJCQkJc3RydWN0IGRpZmZfZmlsZXNwZWMgKm51bGxfb25lLCAqbnVsbF90d287CisJCQkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKmRwOworCisJCQkJLyogU2V0IHNjb3JlIHRvIDAgZm9yIHRoZSBwYWlyIHRoYXQKKwkJCQkgKiBuZWVkcyB0byBiZSBtZXJnZWQgYmFjayB0b2dldGhlcgorCQkJCSAqIHNob3VsZCB0aGV5IHN1cnZpdmUgcmVuYW1lL2NvcHkuCisJCQkJICogQWxzbyB3ZSBkbyBub3Qgd2FudCB0byBicmVhayB2ZXJ5CisJCQkJICogc21hbGwgZmlsZXMuCisJCQkJICovCisJCQkJaWYgKHNjb3JlIDwgbWVyZ2Vfc2NvcmUpCisJCQkJCXNjb3JlID0gMDsKKworCQkJCS8qIGRlbGV0aW9uIG9mIG9uZSAqLworCQkJCW51bGxfb25lID0gYWxsb2NfZmlsZXNwZWMocC0+b25lLT5wYXRoKTsKKwkJCQlkcCA9IGRpZmZfcXVldWUoJm91dHEsIHAtPm9uZSwgbnVsbF9vbmUpOworCQkJCWRwLT5zY29yZSA9IHNjb3JlOworCQkJCWRwLT5icm9rZW5fcGFpciA9IDE7CisKKwkJCQkvKiBjcmVhdGlvbiBvZiB0d28gKi8KKwkJCQludWxsX3R3byA9IGFsbG9jX2ZpbGVzcGVjKHAtPnR3by0+cGF0aCk7CisJCQkJZHAgPSBkaWZmX3F1ZXVlKCZvdXRxLCBudWxsX3R3bywgcC0+dHdvKTsKKwkJCQlkcC0+c2NvcmUgPSBzY29yZTsKKwkJCQlkcC0+YnJva2VuX3BhaXIgPSAxOworCisJCQkJZnJlZShwKTsgLyogbm90IGRpZmZfZnJlZV9maWxlcGFpcigpLCB3ZSBhcmUKKwkJCQkJICAqIHJldXNpbmcgb25lIGFuZCB0d28gaGVyZS4KKwkJCQkJICAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWRpZmZfcSgmb3V0cSwgcCk7CisJfQorCWZyZWUocS0+cXVldWUpOworCSpxID0gb3V0cTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgbWVyZ2VfYnJva2VuKHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwLAorCQkJIHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwcCwKKwkJCSBzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKm91dHEpCit7CisJLyogcCBhbmQgcHAgYXJlIGJyb2tlbiBwYWlycyB3ZSB3YW50IHRvIG1lcmdlICovCisJc3RydWN0IGRpZmZfZmlsZXBhaXIgKmMgPSBwLCAqZCA9IHBwLCAqZHA7CisJaWYgKERJRkZfRklMRV9WQUxJRChwLT5vbmUpKSB7CisJCS8qIHRoaXMgbXVzdCBiZSBhIGRlbGV0ZSBoYWxmICovCisJCWQgPSBwOyBjID0gcHA7CisJfQorCS8qIFNhbml0eSBjaGVjayAqLworCWlmICghRElGRl9GSUxFX1ZBTElEKGQtPm9uZSkpCisJCWRpZSgiaW50ZXJuYWwgZXJyb3IgaW4gbWVyZ2UgIzEiKTsKKwlpZiAoRElGRl9GSUxFX1ZBTElEKGQtPnR3bykpCisJCWRpZSgiaW50ZXJuYWwgZXJyb3IgaW4gbWVyZ2UgIzIiKTsKKwlpZiAoRElGRl9GSUxFX1ZBTElEKGMtPm9uZSkpCisJCWRpZSgiaW50ZXJuYWwgZXJyb3IgaW4gbWVyZ2UgIzMiKTsKKwlpZiAoIURJRkZfRklMRV9WQUxJRChjLT50d28pKQorCQlkaWUoImludGVybmFsIGVycm9yIGluIG1lcmdlICM0Iik7CisKKwlkcCA9IGRpZmZfcXVldWUob3V0cSwgZC0+b25lLCBjLT50d28pOworCWRwLT5zY29yZSA9IHAtPnNjb3JlOworCWRpZmZfZnJlZV9maWxlc3BlY19kYXRhKGQtPnR3byk7CisJZGlmZl9mcmVlX2ZpbGVzcGVjX2RhdGEoYy0+b25lKTsKKwlmcmVlKGQpOworCWZyZWUoYyk7Cit9CisKK3ZvaWQgZGlmZmNvcmVfbWVyZ2VfYnJva2VuKHZvaWQpCit7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxID0gJmRpZmZfcXVldWVkX2RpZmY7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0IG91dHE7CisJaW50IGksIGo7CisKKwlvdXRxLm5yID0gb3V0cS5hbGxvYyA9IDA7CisJb3V0cS5xdWV1ZSA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCA9IHEtPnF1ZXVlW2ldOworCQlpZiAoIXApCisJCQkvKiB3ZSBhbHJlYWR5IG1lcmdlZCB0aGlzIHdpdGggaXRzIHBlZXIgKi8KKwkJCWNvbnRpbnVlOworCQllbHNlIGlmIChwLT5icm9rZW5fcGFpciAmJgorCQkJICFzdHJjbXAocC0+b25lLT5wYXRoLCBwLT50d28tPnBhdGgpKSB7CisJCQkvKiBJZiB0aGUgcGVlciBhbHNvIHN1cnZpdmVkIHJlbmFtZS9jb3B5LCB0aGVuCisJCQkgKiB3ZSBtZXJnZSB0aGVtIGJhY2sgdG9nZXRoZXIuCisJCQkgKi8KKwkJCWZvciAoaiA9IGkgKyAxOyBqIDwgcS0+bnI7IGorKykgeworCQkJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwcCA9IHEtPnF1ZXVlW2pdOworCQkJCWlmIChwcC0+YnJva2VuX3BhaXIgJiYKKwkJCQkgICAgIXN0cmNtcChwcC0+b25lLT5wYXRoLCBwcC0+dHdvLT5wYXRoKSAmJgorCQkJCSAgICAhc3RyY21wKHAtPm9uZS0+cGF0aCwgcHAtPnR3by0+cGF0aCkpIHsKKwkJCQkJLyogUGVlciBzdXJ2aXZlZC4gIE1lcmdlIHRoZW0gKi8KKwkJCQkJbWVyZ2VfYnJva2VuKHAsIHBwLCAmb3V0cSk7CisJCQkJCXEtPnF1ZXVlW2pdID0gTlVMTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKHEtPm5yIDw9IGopCisJCQkJLyogVGhlIHBlZXIgZGlkIG5vdCBzdXJ2aXZlLCBzbyB3ZSBrZWVwCisJCQkJICogaXQgaW4gdGhlIG91dHB1dC4KKwkJCQkgKi8KKwkJCQlkaWZmX3EoJm91dHEsIHApOworCQl9CisJCWVsc2UKKwkJCWRpZmZfcSgmb3V0cSwgcCk7CisJfQorCWZyZWUocS0+cXVldWUpOworCSpxID0gb3V0cTsKKworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RpZmZjb3JlLWRlbHRhLmMgYi9kaWZmY29yZS1kZWx0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NzBmODUKLS0tIC9kZXYvbnVsbAorKysgYi9kaWZmY29yZS1kZWx0YS5jCkBAIC0wLDAgKzEsMjI0IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiZGlmZmNvcmUuaCIKKworLyoKKyAqIElkZWEgaGVyZSBpcyB2ZXJ5IHNpbXBsZS4KKyAqCisgKiBBbG1vc3QgYWxsIGRhdGEgd2UgYXJlIGludGVyZXN0ZWQgaW4gYXJlIHRleHQsIGJ1dCBzb21ldGltZXMgd2UgaGF2ZQorICogdG8gZGVhbCB3aXRoIGJpbmFyeSBkYXRhLiAgU28gd2UgY3V0IHRoZW0gaW50byBjaHVua3MgZGVsaW1pdGVkIGJ5CisgKiBMRiBieXRlLCBvciA2NC1ieXRlIHNlcXVlbmNlLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QsIGFuZCBoYXNoIHRoZW0uCisgKgorICogRm9yIHRob3NlIGNodW5rcywgaWYgdGhlIHNvdXJjZSBidWZmZXIgaGFzIG1vcmUgaW5zdGFuY2VzIG9mIGl0CisgKiB0aGFuIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHRoYXQgbWVhbnMgdGhlIGRpZmZlcmVuY2UgYXJlIHRoZQorICogbnVtYmVyIG9mIGJ5dGVzIG5vdCBjb3BpZWQgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24uICBJZiB0aGUKKyAqIGNvdW50cyBhcmUgdGhlIHNhbWUsIGV2ZXJ5dGhpbmcgd2FzIGNvcGllZCBmcm9tIHNvdXJjZSB0bworICogZGVzdGluYXRpb24uICBJZiB0aGUgZGVzdGluYXRpb24gaGFzIG1vcmUsIGV2ZXJ5dGhpbmcgd2FzIGNvcGllZCwKKyAqIGFuZCBkZXN0aW5hdGlvbiBhZGRlZCBtb3JlLgorICoKKyAqIFdlIGFyZSBkb2luZyBhbiBhcHByb3hpbWF0aW9uIHNvIHdlIGRvIG5vdCByZWFsbHkgaGF2ZSB0byB3YXN0ZQorICogbWVtb3J5IGJ5IGFjdHVhbGx5IHN0b3JpbmcgdGhlIHNlcXVlbmNlLiAgV2UganVzdCBoYXNoIHRoZW0gaW50bworICogc29tZXdoZXJlIGFyb3VuZCAyXjE2IGhhc2hidWNrZXRzIGFuZCBjb3VudCB0aGUgb2NjdXJyZW5jZXMuCisgKi8KKworLyogV2lsZCBndWVzcyBhdCB0aGUgaW5pdGlhbCBoYXNoIHNpemUgKi8KKyNkZWZpbmUgSU5JVElBTF9IQVNIX1NJWkUgOQorCisvKiBXZSBsZWF2ZSBtb3JlIHJvb20gaW4gc21hbGxlciBoYXNoIGJ1dCBkbyBub3QgbGV0IGl0CisgKiBncm93IHRvIGhhdmUgdW51c2VkIGhvbGUgdG9vIG11Y2guCisgKi8KKyNkZWZpbmUgSU5JVElBTF9GUkVFKHN6X2xvZzIpICgoMTw8KHN6X2xvZzIpKSooc3pfbG9nMi0zKS8oc3pfbG9nMikpCisKKy8qIEEgcHJpbWUgcmF0aGVyIGNhcmVmdWxseSBjaG9zZW4gYmV0d2VlbiAyXjE2Li4yXjE3LCBzbyB0aGF0CisgKiBIQVNIQkFTRSA8IElOSVRJQUxfRlJFRSgxNykuICBXZSB3YW50IHRvIGtlZXAgdGhlIG1heGltdW0gaGFzaHRhYmxlCisgKiBzaXplIHVuZGVyIHRoZSBjdXJyZW50IDI8PDE3IG1heGltdW0sIHdoaWNoIGNhbiBob2xkIHRoaXMgbWFueQorICogZGlmZmVyZW50IHZhbHVlcyBiZWZvcmUgb3ZlcmZsb3dpbmcgdG8gaGFzaHRhYmxlIG9mIHNpemUgMjw8MTguCisgKi8KKyNkZWZpbmUgSEFTSEJBU0UgMTA3OTI3CisKK3N0cnVjdCBzcGFuaGFzaCB7CisJdW5zaWduZWQgaW50IGhhc2h2YWw7CisJdW5zaWduZWQgaW50IGNudDsKK307CitzdHJ1Y3Qgc3Bhbmhhc2hfdG9wIHsKKwlpbnQgYWxsb2NfbG9nMjsKKwlpbnQgZnJlZTsKKwlzdHJ1Y3Qgc3Bhbmhhc2ggZGF0YVtGTEVYX0FSUkFZXTsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3Bhbmhhc2hfdG9wICpzcGFuaGFzaF9yZWhhc2goc3RydWN0IHNwYW5oYXNoX3RvcCAqb3JpZykKK3sKKwlzdHJ1Y3Qgc3Bhbmhhc2hfdG9wICpuZXc7CisJaW50IGk7CisJaW50IG9zeiA9IDEgPDwgb3JpZy0+YWxsb2NfbG9nMjsKKwlpbnQgc3ogPSBvc3ogPDwgMTsKKworCW5ldyA9IHhtYWxsb2Moc2l6ZW9mKCpvcmlnKSArIHNpemVvZihzdHJ1Y3Qgc3Bhbmhhc2gpICogc3opOworCW5ldy0+YWxsb2NfbG9nMiA9IG9yaWctPmFsbG9jX2xvZzIgKyAxOworCW5ldy0+ZnJlZSA9IElOSVRJQUxfRlJFRShuZXctPmFsbG9jX2xvZzIpOworCW1lbXNldChuZXctPmRhdGEsIDAsIHNpemVvZihzdHJ1Y3Qgc3Bhbmhhc2gpICogc3opOworCWZvciAoaSA9IDA7IGkgPCBvc3o7IGkrKykgeworCQlzdHJ1Y3Qgc3Bhbmhhc2ggKm8gPSAmKG9yaWctPmRhdGFbaV0pOworCQlpbnQgYnVja2V0OworCQlpZiAoIW8tPmNudCkKKwkJCWNvbnRpbnVlOworCQlidWNrZXQgPSBvLT5oYXNodmFsICYgKHN6IC0gMSk7CisJCXdoaWxlICgxKSB7CisJCQlzdHJ1Y3Qgc3Bhbmhhc2ggKmggPSAmKG5ldy0+ZGF0YVtidWNrZXQrK10pOworCQkJaWYgKCFoLT5jbnQpIHsKKwkJCQloLT5oYXNodmFsID0gby0+aGFzaHZhbDsKKwkJCQloLT5jbnQgPSBvLT5jbnQ7CisJCQkJbmV3LT5mcmVlLS07CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc3ogPD0gYnVja2V0KQorCQkJCWJ1Y2tldCA9IDA7CisJCX0KKwl9CisJZnJlZShvcmlnKTsKKwlyZXR1cm4gbmV3OworfQorCitzdGF0aWMgc3RydWN0IHNwYW5oYXNoX3RvcCAqYWRkX3NwYW5oYXNoKHN0cnVjdCBzcGFuaGFzaF90b3AgKnRvcCwKKwkJCQkJIHVuc2lnbmVkIGludCBoYXNodmFsLCBpbnQgY250KQoreworCWludCBidWNrZXQsIGxpbTsKKwlzdHJ1Y3Qgc3Bhbmhhc2ggKmg7CisKKwlsaW0gPSAoMSA8PCB0b3AtPmFsbG9jX2xvZzIpOworCWJ1Y2tldCA9IGhhc2h2YWwgJiAobGltIC0gMSk7CisJd2hpbGUgKDEpIHsKKwkJaCA9ICYodG9wLT5kYXRhW2J1Y2tldCsrXSk7CisJCWlmICghaC0+Y250KSB7CisJCQloLT5oYXNodmFsID0gaGFzaHZhbDsKKwkJCWgtPmNudCA9IGNudDsKKwkJCXRvcC0+ZnJlZS0tOworCQkJaWYgKHRvcC0+ZnJlZSA8IDApCisJCQkJcmV0dXJuIHNwYW5oYXNoX3JlaGFzaCh0b3ApOworCQkJcmV0dXJuIHRvcDsKKwkJfQorCQlpZiAoaC0+aGFzaHZhbCA9PSBoYXNodmFsKSB7CisJCQloLT5jbnQgKz0gY250OworCQkJcmV0dXJuIHRvcDsKKwkJfQorCQlpZiAobGltIDw9IGJ1Y2tldCkKKwkJCWJ1Y2tldCA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IHNwYW5oYXNoX2NtcChjb25zdCB2b2lkICphXywgY29uc3Qgdm9pZCAqYl8pCit7CisJY29uc3Qgc3RydWN0IHNwYW5oYXNoICphID0gYV87CisJY29uc3Qgc3RydWN0IHNwYW5oYXNoICpiID0gYl87CisKKwkvKiBBIGNvdW50IG9mIHplcm8gY29tcGFyZXMgYXQgdGhlIGVuZC4uICovCisJaWYgKCFhLT5jbnQpCisJCXJldHVybiAhYi0+Y250ID8gMCA6IDE7CisJaWYgKCFiLT5jbnQpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gYS0+aGFzaHZhbCA8IGItPmhhc2h2YWwgPyAtMSA6CisJCWEtPmhhc2h2YWwgPiBiLT5oYXNodmFsID8gMSA6IDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3Bhbmhhc2hfdG9wICpoYXNoX2NoYXJzKHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUpCit7CisJaW50IGksIG47CisJdW5zaWduZWQgaW50IGFjY3VtMSwgYWNjdW0yLCBoYXNodmFsOworCXN0cnVjdCBzcGFuaGFzaF90b3AgKmhhc2g7CisJdW5zaWduZWQgY2hhciAqYnVmID0gb25lLT5kYXRhOworCXVuc2lnbmVkIGludCBzeiA9IG9uZS0+c2l6ZTsKKwlpbnQgaXNfdGV4dCA9ICFkaWZmX2ZpbGVzcGVjX2lzX2JpbmFyeShvbmUpOworCisJaSA9IElOSVRJQUxfSEFTSF9TSVpFOworCWhhc2ggPSB4bWFsbG9jKHNpemVvZigqaGFzaCkgKyBzaXplb2Yoc3RydWN0IHNwYW5oYXNoKSAqICgxPDxpKSk7CisJaGFzaC0+YWxsb2NfbG9nMiA9IGk7CisJaGFzaC0+ZnJlZSA9IElOSVRJQUxfRlJFRShpKTsKKwltZW1zZXQoaGFzaC0+ZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBzcGFuaGFzaCkgKiAoMTw8aSkpOworCisJbiA9IDA7CisJYWNjdW0xID0gYWNjdW0yID0gMDsKKwl3aGlsZSAoc3opIHsKKwkJdW5zaWduZWQgaW50IGMgPSAqYnVmKys7CisJCXVuc2lnbmVkIGludCBvbGRfMSA9IGFjY3VtMTsKKwkJc3otLTsKKworCQkvKiBJZ25vcmUgQ1IgaW4gQ1JMRiBzZXF1ZW5jZSBpZiB0ZXh0ICovCisJCWlmIChpc190ZXh0ICYmIGMgPT0gJ1xyJyAmJiBzeiAmJiAqYnVmID09ICdcbicpCisJCQljb250aW51ZTsKKworCQlhY2N1bTEgPSAoYWNjdW0xIDw8IDcpIF4gKGFjY3VtMiA+PiAyNSk7CisJCWFjY3VtMiA9IChhY2N1bTIgPDwgNykgXiAob2xkXzEgPj4gMjUpOworCQlhY2N1bTEgKz0gYzsKKwkJaWYgKCsrbiA8IDY0ICYmIGMgIT0gJ1xuJykKKwkJCWNvbnRpbnVlOworCQloYXNodmFsID0gKGFjY3VtMSArIGFjY3VtMiAqIDB4NjEpICUgSEFTSEJBU0U7CisJCWhhc2ggPSBhZGRfc3Bhbmhhc2goaGFzaCwgaGFzaHZhbCwgbik7CisJCW4gPSAwOworCQlhY2N1bTEgPSBhY2N1bTIgPSAwOworCX0KKwlxc29ydChoYXNoLT5kYXRhLAorCQkxdWwgPDwgaGFzaC0+YWxsb2NfbG9nMiwKKwkJc2l6ZW9mKGhhc2gtPmRhdGFbMF0pLAorCQlzcGFuaGFzaF9jbXApOworCXJldHVybiBoYXNoOworfQorCitpbnQgZGlmZmNvcmVfY291bnRfY2hhbmdlcyhzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqc3JjLAorCQkJICAgc3RydWN0IGRpZmZfZmlsZXNwZWMgKmRzdCwKKwkJCSAgIHZvaWQgKipzcmNfY291bnRfcCwKKwkJCSAgIHZvaWQgKipkc3RfY291bnRfcCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgZGVsdGFfbGltaXQsCisJCQkgICB1bnNpZ25lZCBsb25nICpzcmNfY29waWVkLAorCQkJICAgdW5zaWduZWQgbG9uZyAqbGl0ZXJhbF9hZGRlZCkKK3sKKwlzdHJ1Y3Qgc3Bhbmhhc2ggKnMsICpkOworCXN0cnVjdCBzcGFuaGFzaF90b3AgKnNyY19jb3VudCwgKmRzdF9jb3VudDsKKwl1bnNpZ25lZCBsb25nIHNjLCBsYTsKKworCXNyY19jb3VudCA9IGRzdF9jb3VudCA9IE5VTEw7CisJaWYgKHNyY19jb3VudF9wKQorCQlzcmNfY291bnQgPSAqc3JjX2NvdW50X3A7CisJaWYgKCFzcmNfY291bnQpIHsKKwkJc3JjX2NvdW50ID0gaGFzaF9jaGFycyhzcmMpOworCQlpZiAoc3JjX2NvdW50X3ApCisJCQkqc3JjX2NvdW50X3AgPSBzcmNfY291bnQ7CisJfQorCWlmIChkc3RfY291bnRfcCkKKwkJZHN0X2NvdW50ID0gKmRzdF9jb3VudF9wOworCWlmICghZHN0X2NvdW50KSB7CisJCWRzdF9jb3VudCA9IGhhc2hfY2hhcnMoZHN0KTsKKwkJaWYgKGRzdF9jb3VudF9wKQorCQkJKmRzdF9jb3VudF9wID0gZHN0X2NvdW50OworCX0KKwlzYyA9IGxhID0gMDsKKworCXMgPSBzcmNfY291bnQtPmRhdGE7CisJZCA9IGRzdF9jb3VudC0+ZGF0YTsKKwlmb3IgKDs7KSB7CisJCXVuc2lnbmVkIGRzdF9jbnQsIHNyY19jbnQ7CisJCWlmICghcy0+Y250KQorCQkJYnJlYWs7IC8qIHdlIGNoZWNrZWQgYWxsIGluIHNyYyAqLworCQl3aGlsZSAoZC0+Y250KSB7CisJCQlpZiAoZC0+aGFzaHZhbCA+PSBzLT5oYXNodmFsKQorCQkJCWJyZWFrOworCQkJZCsrOworCQl9CisJCXNyY19jbnQgPSBzLT5jbnQ7CisJCWRzdF9jbnQgPSBkLT5oYXNodmFsID09IHMtPmhhc2h2YWwgPyBkLT5jbnQgOiAwOworCQlpZiAoc3JjX2NudCA8IGRzdF9jbnQpIHsKKwkJCWxhICs9IGRzdF9jbnQgLSBzcmNfY250OworCQkJc2MgKz0gc3JjX2NudDsKKwkJfQorCQllbHNlCisJCQlzYyArPSBkc3RfY250OworCQlzKys7CisJfQorCisJaWYgKCFzcmNfY291bnRfcCkKKwkJZnJlZShzcmNfY291bnQpOworCWlmICghZHN0X2NvdW50X3ApCisJCWZyZWUoZHN0X2NvdW50KTsKKwkqc3JjX2NvcGllZCA9IHNjOworCSpsaXRlcmFsX2FkZGVkID0gbGE7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kaWZmY29yZS1vcmRlci5jIGIvZGlmZmNvcmUtb3JkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2U5Mzg1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlmZmNvcmUtb3JkZXIuYwpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBKdW5pbyBDIEhhbWFubworICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiZGlmZmNvcmUuaCIKKworc3RhdGljIGNoYXIgKipvcmRlcjsKK3N0YXRpYyBpbnQgb3JkZXJfY250OworCitzdGF0aWMgdm9pZCBwcmVwYXJlX29yZGVyKGNvbnN0IGNoYXIgKm9yZGVyZmlsZSkKK3sKKwlpbnQgZmQsIGNudCwgcGFzczsKKwl2b2lkICptYXA7CisJY2hhciAqY3AsICplbmRwOworCXN0cnVjdCBzdGF0IHN0OworCXNpemVfdCBzejsKKworCWlmIChvcmRlcikKKwkJcmV0dXJuOworCisJZmQgPSBvcGVuKG9yZGVyZmlsZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApCisJCXJldHVybjsKKwlpZiAoZnN0YXQoZmQsICZzdCkpIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm47CisJfQorCXN6ID0geHNpemVfdChzdC5zdF9zaXplKTsKKwltYXAgPSBtbWFwKE5VTEwsIHN6LCBQUk9UX1JFQUR8UFJPVF9XUklURSwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwljbG9zZShmZCk7CisJaWYgKG1hcCA9PSBNQVBfRkFJTEVEKQorCQlyZXR1cm47CisJZW5kcCA9IChjaGFyICopIG1hcCArIHN6OworCWZvciAocGFzcyA9IDA7IHBhc3MgPCAyOyBwYXNzKyspIHsKKwkJY250ID0gMDsKKwkJY3AgPSBtYXA7CisJCXdoaWxlIChjcCA8IGVuZHApIHsKKwkJCWNoYXIgKmVwOworCQkJZm9yIChlcCA9IGNwOyBlcCA8IGVuZHAgJiYgKmVwICE9ICdcbic7IGVwKyspCisJCQkJOworCQkJLyogY3AgdG8gZXAgaGFzIG9uZSBsaW5lICovCisJCQlpZiAoKmNwID09ICdcbicgfHwgKmNwID09ICcjJykKKwkJCQk7IC8qIGNvbW1lbnQgKi8KKwkJCWVsc2UgaWYgKHBhc3MgPT0gMCkKKwkJCQljbnQrKzsKKwkJCWVsc2UgeworCQkJCWlmICgqZXAgPT0gJ1xuJykgeworCQkJCQkqZXAgPSAwOworCQkJCQlvcmRlcltjbnRdID0gY3A7CisJCQkJfSBlbHNlIHsKKwkJCQkJb3JkZXJbY250XSA9IHhtZW1kdXB6KGNwLCBlcCAtIGNwKTsKKwkJCQl9CisJCQkJY250Kys7CisJCQl9CisJCQlpZiAoZXAgPCBlbmRwKQorCQkJCWVwKys7CisJCQljcCA9IGVwOworCQl9CisJCWlmIChwYXNzID09IDApIHsKKwkJCW9yZGVyX2NudCA9IGNudDsKKwkJCW9yZGVyID0geG1hbGxvYyhzaXplb2YoKm9yZGVyKSAqIGNudCk7CisJCX0KKwl9Cit9CisKK3N0cnVjdCBwYWlyX29yZGVyIHsKKwlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcGFpcjsKKwlpbnQgb3JpZ19vcmRlcjsKKwlpbnQgb3JkZXI7Cit9OworCitzdGF0aWMgaW50IG1hdGNoX29yZGVyKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IGk7CisJY2hhciBwW1BBVEhfTUFYXTsKKworCWZvciAoaSA9IDA7IGkgPCBvcmRlcl9jbnQ7IGkrKykgeworCQlzdHJjcHkocCwgcGF0aCk7CisJCXdoaWxlIChwWzBdKSB7CisJCQljaGFyICpjcDsKKwkJCWlmICghZm5tYXRjaChvcmRlcltpXSwgcCwgMCkpCisJCQkJcmV0dXJuIGk7CisJCQljcCA9IHN0cnJjaHIocCwgJy8nKTsKKwkJCWlmICghY3ApCisJCQkJYnJlYWs7CisJCQkqY3AgPSAwOworCQl9CisJfQorCXJldHVybiBvcmRlcl9jbnQ7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZV9wYWlyX29yZGVyKGNvbnN0IHZvaWQgKmFfLCBjb25zdCB2b2lkICpiXykKK3sKKwlzdHJ1Y3QgcGFpcl9vcmRlciBjb25zdCAqYSwgKmI7CisJYSA9IChzdHJ1Y3QgcGFpcl9vcmRlciBjb25zdCAqKWFfOworCWIgPSAoc3RydWN0IHBhaXJfb3JkZXIgY29uc3QgKiliXzsKKwlpZiAoYS0+b3JkZXIgIT0gYi0+b3JkZXIpCisJCXJldHVybiBhLT5vcmRlciAtIGItPm9yZGVyOworCXJldHVybiBhLT5vcmlnX29yZGVyIC0gYi0+b3JpZ19vcmRlcjsKK30KKwordm9pZCBkaWZmY29yZV9vcmRlcihjb25zdCBjaGFyICpvcmRlcmZpbGUpCit7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxID0gJmRpZmZfcXVldWVkX2RpZmY7CisJc3RydWN0IHBhaXJfb3JkZXIgKm87CisJaW50IGk7CisKKwlpZiAoIXEtPm5yKQorCQlyZXR1cm47CisKKwlvID0geG1hbGxvYyhzaXplb2YoKm8pICogcS0+bnIpOworCXByZXBhcmVfb3JkZXIob3JkZXJmaWxlKTsKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQlvW2ldLnBhaXIgPSBxLT5xdWV1ZVtpXTsKKwkJb1tpXS5vcmlnX29yZGVyID0gaTsKKwkJb1tpXS5vcmRlciA9IG1hdGNoX29yZGVyKG9baV0ucGFpci0+dHdvLT5wYXRoKTsKKwl9CisJcXNvcnQobywgcS0+bnIsIHNpemVvZigqbyksIGNvbXBhcmVfcGFpcl9vcmRlcik7CisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspCisJCXEtPnF1ZXVlW2ldID0gb1tpXS5wYWlyOworCWZyZWUobyk7CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZGlmZmNvcmUtcGlja2F4ZS5jIGIvZGlmZmNvcmUtcGlja2F4ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOWZmZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kaWZmY29yZS1waWNrYXhlLmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgImRpZmZjb3JlLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29udGFpbnMoc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSwKKwkJCSAgICAgY29uc3QgY2hhciAqbmVlZGxlLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCSAgICAgcmVnZXhfdCAqcmVnZXhwKQoreworCXVuc2lnbmVkIGludCBjbnQ7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHN6OworCWNvbnN0IGNoYXIgKmRhdGE7CisJaWYgKGRpZmZfcG9wdWxhdGVfZmlsZXNwZWMob25lLCAwKSkKKwkJcmV0dXJuIDA7CisJaWYgKCFsZW4pCisJCXJldHVybiAwOworCisJc3ogPSBvbmUtPnNpemU7CisJZGF0YSA9IG9uZS0+ZGF0YTsKKwljbnQgPSAwOworCisJaWYgKHJlZ2V4cCkgeworCQlyZWdtYXRjaF90IHJlZ21hdGNoOworCQlpbnQgZmxhZ3MgPSAwOworCisJCXdoaWxlICgqZGF0YSAmJiAhcmVnZXhlYyhyZWdleHAsIGRhdGEsIDEsICZyZWdtYXRjaCwgZmxhZ3MpKSB7CisJCQlmbGFncyB8PSBSRUdfTk9UQk9MOworCQkJZGF0YSArPSByZWdtYXRjaC5ybV9zbzsKKwkJCWlmICgqZGF0YSkgZGF0YSsrOworCQkJY250Kys7CisJCX0KKworCX0gZWxzZSB7IC8qIENsYXNzaWMgZXhhY3Qgc3RyaW5nIG1hdGNoICovCisJCS8qIFllcywgSSd2ZSBoZWFyZCBvZiBzdHJzdHIoKSwgYnV0IHRoZSB0aGluZyBpcyAqZGF0YSBtYXkKKwkJICogbm90IGJlIE5VTCB0ZXJtaW5hdGVkLiAgU3VlIG1lLgorCQkgKi8KKwkJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgKyBsZW4gPD0gc3o7IG9mZnNldCsrKSB7CisJCQkvKiB3ZSBjb3VudCBub24tb3ZlcmxhcHBpbmcgb2NjdXJyZW5jZXMgb2YgbmVlZGxlICovCisJCQlpZiAoIW1lbWNtcChuZWVkbGUsIGRhdGEgKyBvZmZzZXQsIGxlbikpIHsKKwkJCQlvZmZzZXQgKz0gbGVuIC0gMTsKKwkJCQljbnQrKzsKKwkJCX0KKwkJfQorCX0KKwlkaWZmX2ZyZWVfZmlsZXNwZWNfZGF0YShvbmUpOworCXJldHVybiBjbnQ7Cit9CisKK3ZvaWQgZGlmZmNvcmVfcGlja2F4ZShjb25zdCBjaGFyICpuZWVkbGUsIGludCBvcHRzKQoreworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSA9ICZkaWZmX3F1ZXVlZF9kaWZmOworCXVuc2lnbmVkIGxvbmcgbGVuID0gc3RybGVuKG5lZWRsZSk7CisJaW50IGksIGhhc19jaGFuZ2VzOworCXJlZ2V4X3QgcmVnZXgsICpyZWdleHAgPSBOVUxMOworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCBvdXRxOworCW91dHEucXVldWUgPSBOVUxMOworCW91dHEubnIgPSBvdXRxLmFsbG9jID0gMDsKKworCWlmIChvcHRzICYgRElGRl9QSUNLQVhFX1JFR0VYKSB7CisJCWludCBlcnI7CisJCWVyciA9IHJlZ2NvbXAoJnJlZ2V4LCBuZWVkbGUsIFJFR19FWFRFTkRFRCB8IFJFR19ORVdMSU5FKTsKKwkJaWYgKGVycikgeworCQkJLyogVGhlIFBPU0lYLjIgcGVvcGxlIGFyZSBzdXJlbHkgc2ljayAqLworCQkJY2hhciBlcnJidWZbMTAyNF07CisJCQlyZWdlcnJvcihlcnIsICZyZWdleCwgZXJyYnVmLCAxMDI0KTsKKwkJCXJlZ2ZyZWUoJnJlZ2V4KTsKKwkJCWRpZSgiaW52YWxpZCBwaWNrYXhlIHJlZ2V4OiAlcyIsIGVycmJ1Zik7CisJCX0KKwkJcmVnZXhwID0gJnJlZ2V4OworCX0KKworCWlmIChvcHRzICYgRElGRl9QSUNLQVhFX0FMTCkgeworCQkvKiBTaG93aW5nIHRoZSB3aG9sZSBjaGFuZ2VzZXQgaWYgbmVlZGxlIGV4aXN0cyAqLworCQlmb3IgKGkgPSBoYXNfY2hhbmdlcyA9IDA7ICFoYXNfY2hhbmdlcyAmJiBpIDwgcS0+bnI7IGkrKykgeworCQkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJCWlmICghRElGRl9GSUxFX1ZBTElEKHAtPm9uZSkpIHsKKwkJCQlpZiAoIURJRkZfRklMRV9WQUxJRChwLT50d28pKQorCQkJCQljb250aW51ZTsgLyogaWdub3JlIHVubWVyZ2VkICovCisJCQkJLyogY3JlYXRlZCAqLworCQkJCWlmIChjb250YWlucyhwLT50d28sIG5lZWRsZSwgbGVuLCByZWdleHApKQorCQkJCQloYXNfY2hhbmdlcysrOworCQkJfQorCQkJZWxzZSBpZiAoIURJRkZfRklMRV9WQUxJRChwLT50d28pKSB7CisJCQkJaWYgKGNvbnRhaW5zKHAtPm9uZSwgbmVlZGxlLCBsZW4sIHJlZ2V4cCkpCisJCQkJCWhhc19jaGFuZ2VzKys7CisJCQl9CisJCQllbHNlIGlmICghZGlmZl91bm1vZGlmaWVkX3BhaXIocCkgJiYKKwkJCQkgY29udGFpbnMocC0+b25lLCBuZWVkbGUsIGxlbiwgcmVnZXhwKSAhPQorCQkJCSBjb250YWlucyhwLT50d28sIG5lZWRsZSwgbGVuLCByZWdleHApKQorCQkJCWhhc19jaGFuZ2VzKys7CisJCX0KKwkJaWYgKGhhc19jaGFuZ2VzKQorCQkJcmV0dXJuOyAvKiBub3QgbXVuZ2UgdGhlIHF1ZXVlICovCisKKwkJLyogb3RoZXJ3aXNlIHdlIHdpbGwgY2xlYXIgdGhlIHdob2xlIHF1ZXVlCisJCSAqIGJ5IGNvcHlpbmcgdGhlIGVtcHR5IG91dHEgYXQgdGhlIGVuZCBvZiB0aGlzCisJCSAqIGZ1bmN0aW9uLCBidXQgZmlyc3QgY2xlYXIgdGhlIGN1cnJlbnQgZW50cmllcworCQkgKiBpbiB0aGUgcXVldWUuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykKKwkJCWRpZmZfZnJlZV9maWxlcGFpcihxLT5xdWV1ZVtpXSk7CisJfQorCWVsc2UKKwkJLyogU2hvd2luZyBvbmx5IHRoZSBmaWxlcGFpcnMgdGhhdCBoYXMgdGhlIG5lZWRsZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJCWhhc19jaGFuZ2VzID0gMDsKKwkJCWlmICghRElGRl9GSUxFX1ZBTElEKHAtPm9uZSkpIHsKKwkJCQlpZiAoIURJRkZfRklMRV9WQUxJRChwLT50d28pKQorCQkJCQk7IC8qIGlnbm9yZSB1bm1lcmdlZCAqLworCQkJCS8qIGNyZWF0ZWQgKi8KKwkJCQllbHNlIGlmIChjb250YWlucyhwLT50d28sIG5lZWRsZSwgbGVuLCByZWdleHApKQorCQkJCQloYXNfY2hhbmdlcyA9IDE7CisJCQl9CisJCQllbHNlIGlmICghRElGRl9GSUxFX1ZBTElEKHAtPnR3bykpIHsKKwkJCQlpZiAoY29udGFpbnMocC0+b25lLCBuZWVkbGUsIGxlbiwgcmVnZXhwKSkKKwkJCQkJaGFzX2NoYW5nZXMgPSAxOworCQkJfQorCQkJZWxzZSBpZiAoIWRpZmZfdW5tb2RpZmllZF9wYWlyKHApICYmCisJCQkJIGNvbnRhaW5zKHAtPm9uZSwgbmVlZGxlLCBsZW4sIHJlZ2V4cCkgIT0KKwkJCQkgY29udGFpbnMocC0+dHdvLCBuZWVkbGUsIGxlbiwgcmVnZXhwKSkKKwkJCQloYXNfY2hhbmdlcyA9IDE7CisKKwkJCWlmIChoYXNfY2hhbmdlcykKKwkJCQlkaWZmX3EoJm91dHEsIHApOworCQkJZWxzZQorCQkJCWRpZmZfZnJlZV9maWxlcGFpcihwKTsKKwkJfQorCisJaWYgKG9wdHMgJiBESUZGX1BJQ0tBWEVfUkVHRVgpIHsKKwkJcmVnZnJlZSgmcmVnZXgpOworCX0KKworCWZyZWUocS0+cXVldWUpOworCSpxID0gb3V0cTsKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9kaWZmY29yZS1yZW5hbWUuYyBiL2RpZmZjb3JlLXJlbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxOTQxYmMKLS0tIC9kZXYvbnVsbAorKysgYi9kaWZmY29yZS1yZW5hbWUuYwpAQCAtMCwwICsxLDYxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBKdW5pbyBDIEhhbWFubworICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiZGlmZmNvcmUuaCIKKyNpbmNsdWRlICJoYXNoLmgiCisKKy8qIFRhYmxlIG9mIHJlbmFtZS9jb3B5IGRlc3RpbmF0aW9ucyAqLworCitzdGF0aWMgc3RydWN0IGRpZmZfcmVuYW1lX2RzdCB7CisJc3RydWN0IGRpZmZfZmlsZXNwZWMgKnR3bzsKKwlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcGFpcjsKK30gKnJlbmFtZV9kc3Q7CitzdGF0aWMgaW50IHJlbmFtZV9kc3RfbnIsIHJlbmFtZV9kc3RfYWxsb2M7CisKK3N0YXRpYyBzdHJ1Y3QgZGlmZl9yZW5hbWVfZHN0ICpsb2NhdGVfcmVuYW1lX2RzdChzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqdHdvLAorCQkJCQkJIGludCBpbnNlcnRfb2spCit7CisJaW50IGZpcnN0LCBsYXN0OworCisJZmlyc3QgPSAwOworCWxhc3QgPSByZW5hbWVfZHN0X25yOworCXdoaWxlIChsYXN0ID4gZmlyc3QpIHsKKwkJaW50IG5leHQgPSAobGFzdCArIGZpcnN0KSA+PiAxOworCQlzdHJ1Y3QgZGlmZl9yZW5hbWVfZHN0ICpkc3QgPSAmKHJlbmFtZV9kc3RbbmV4dF0pOworCQlpbnQgY21wID0gc3RyY21wKHR3by0+cGF0aCwgZHN0LT50d28tPnBhdGgpOworCQlpZiAoIWNtcCkKKwkJCXJldHVybiBkc3Q7CisJCWlmIChjbXAgPCAwKSB7CisJCQlsYXN0ID0gbmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZpcnN0ID0gbmV4dCsxOworCX0KKwkvKiBub3QgZm91bmQgKi8KKwlpZiAoIWluc2VydF9vaykKKwkJcmV0dXJuIE5VTEw7CisJLyogaW5zZXJ0IHRvIG1ha2UgaXQgYXQgImZpcnN0IiAqLworCWlmIChyZW5hbWVfZHN0X2FsbG9jIDw9IHJlbmFtZV9kc3RfbnIpIHsKKwkJcmVuYW1lX2RzdF9hbGxvYyA9IGFsbG9jX25yKHJlbmFtZV9kc3RfYWxsb2MpOworCQlyZW5hbWVfZHN0ID0geHJlYWxsb2MocmVuYW1lX2RzdCwKKwkJCQkgICAgICByZW5hbWVfZHN0X2FsbG9jICogc2l6ZW9mKCpyZW5hbWVfZHN0KSk7CisJfQorCXJlbmFtZV9kc3RfbnIrKzsKKwlpZiAoZmlyc3QgPCByZW5hbWVfZHN0X25yKQorCQltZW1tb3ZlKHJlbmFtZV9kc3QgKyBmaXJzdCArIDEsIHJlbmFtZV9kc3QgKyBmaXJzdCwKKwkJCShyZW5hbWVfZHN0X25yIC0gZmlyc3QgLSAxKSAqIHNpemVvZigqcmVuYW1lX2RzdCkpOworCXJlbmFtZV9kc3RbZmlyc3RdLnR3byA9IGFsbG9jX2ZpbGVzcGVjKHR3by0+cGF0aCk7CisJZmlsbF9maWxlc3BlYyhyZW5hbWVfZHN0W2ZpcnN0XS50d28sIHR3by0+c2hhMSwgdHdvLT5tb2RlKTsKKwlyZW5hbWVfZHN0W2ZpcnN0XS5wYWlyID0gTlVMTDsKKwlyZXR1cm4gJihyZW5hbWVfZHN0W2ZpcnN0XSk7Cit9CisKKy8qIFRhYmxlIG9mIHJlbmFtZS9jb3B5IHNyYyBmaWxlcyAqLworc3RhdGljIHN0cnVjdCBkaWZmX3JlbmFtZV9zcmMgeworCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmU7CisJdW5zaWduZWQgc2hvcnQgc2NvcmU7IC8qIHRvIHJlbWVtYmVyIHRoZSBicmVhayBzY29yZSAqLworfSAqcmVuYW1lX3NyYzsKK3N0YXRpYyBpbnQgcmVuYW1lX3NyY19uciwgcmVuYW1lX3NyY19hbGxvYzsKKworc3RhdGljIHN0cnVjdCBkaWZmX3JlbmFtZV9zcmMgKnJlZ2lzdGVyX3JlbmFtZV9zcmMoc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSwKKwkJCQkJCSAgIHVuc2lnbmVkIHNob3J0IHNjb3JlKQoreworCWludCBmaXJzdCwgbGFzdDsKKworCWZpcnN0ID0gMDsKKwlsYXN0ID0gcmVuYW1lX3NyY19ucjsKKwl3aGlsZSAobGFzdCA+IGZpcnN0KSB7CisJCWludCBuZXh0ID0gKGxhc3QgKyBmaXJzdCkgPj4gMTsKKwkJc3RydWN0IGRpZmZfcmVuYW1lX3NyYyAqc3JjID0gJihyZW5hbWVfc3JjW25leHRdKTsKKwkJaW50IGNtcCA9IHN0cmNtcChvbmUtPnBhdGgsIHNyYy0+b25lLT5wYXRoKTsKKwkJaWYgKCFjbXApCisJCQlyZXR1cm4gc3JjOworCQlpZiAoY21wIDwgMCkgeworCQkJbGFzdCA9IG5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQlmaXJzdCA9IG5leHQrMTsKKwl9CisKKwkvKiBpbnNlcnQgdG8gbWFrZSBpdCBhdCAiZmlyc3QiICovCisJaWYgKHJlbmFtZV9zcmNfYWxsb2MgPD0gcmVuYW1lX3NyY19ucikgeworCQlyZW5hbWVfc3JjX2FsbG9jID0gYWxsb2NfbnIocmVuYW1lX3NyY19hbGxvYyk7CisJCXJlbmFtZV9zcmMgPSB4cmVhbGxvYyhyZW5hbWVfc3JjLAorCQkJCSAgICAgIHJlbmFtZV9zcmNfYWxsb2MgKiBzaXplb2YoKnJlbmFtZV9zcmMpKTsKKwl9CisJcmVuYW1lX3NyY19ucisrOworCWlmIChmaXJzdCA8IHJlbmFtZV9zcmNfbnIpCisJCW1lbW1vdmUocmVuYW1lX3NyYyArIGZpcnN0ICsgMSwgcmVuYW1lX3NyYyArIGZpcnN0LAorCQkJKHJlbmFtZV9zcmNfbnIgLSBmaXJzdCAtIDEpICogc2l6ZW9mKCpyZW5hbWVfc3JjKSk7CisJcmVuYW1lX3NyY1tmaXJzdF0ub25lID0gb25lOworCXJlbmFtZV9zcmNbZmlyc3RdLnNjb3JlID0gc2NvcmU7CisJcmV0dXJuICYocmVuYW1lX3NyY1tmaXJzdF0pOworfQorCitzdGF0aWMgaW50IGJhc2VuYW1lX3NhbWUoc3RydWN0IGRpZmZfZmlsZXNwZWMgKnNyYywgc3RydWN0IGRpZmZfZmlsZXNwZWMgKmRzdCkKK3sKKwlpbnQgc3JjX2xlbiA9IHN0cmxlbihzcmMtPnBhdGgpLCBkc3RfbGVuID0gc3RybGVuKGRzdC0+cGF0aCk7CisJd2hpbGUgKHNyY19sZW4gJiYgZHN0X2xlbikgeworCQljaGFyIGMxID0gc3JjLT5wYXRoWy0tc3JjX2xlbl07CisJCWNoYXIgYzIgPSBkc3QtPnBhdGhbLS1kc3RfbGVuXTsKKwkJaWYgKGMxICE9IGMyKQorCQkJcmV0dXJuIDA7CisJCWlmIChjMSA9PSAnLycpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuICghc3JjX2xlbiB8fCBzcmMtPnBhdGhbc3JjX2xlbiAtIDFdID09ICcvJykgJiYKKwkJKCFkc3RfbGVuIHx8IGRzdC0+cGF0aFtkc3RfbGVuIC0gMV0gPT0gJy8nKTsKK30KKworc3RydWN0IGRpZmZfc2NvcmUgeworCWludCBzcmM7IC8qIGluZGV4IGluIHJlbmFtZV9zcmMgKi8KKwlpbnQgZHN0OyAvKiBpbmRleCBpbiByZW5hbWVfZHN0ICovCisJaW50IHNjb3JlOworCWludCBuYW1lX3Njb3JlOworfTsKKworc3RhdGljIGludCBlc3RpbWF0ZV9zaW1pbGFyaXR5KHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpzcmMsCisJCQkgICAgICAgc3RydWN0IGRpZmZfZmlsZXNwZWMgKmRzdCwKKwkJCSAgICAgICBpbnQgbWluaW11bV9zY29yZSkKK3sKKwkvKiBzcmMgcG9pbnRzIGF0IGEgZmlsZSB0aGF0IGV4aXN0ZWQgaW4gdGhlIG9yaWdpbmFsIHRyZWUgKG9yCisJICogb3B0aW9uYWxseSBhIGZpbGUgaW4gdGhlIGRlc3RpbmF0aW9uIHRyZWUpIGFuZCBkc3QgcG9pbnRzCisJICogYXQgYSBuZXdseSBjcmVhdGVkIGZpbGUuICBUaGV5IG1heSBiZSBxdWl0ZSBzaW1pbGFyLCBpbiB3aGljaAorCSAqIGNhc2Ugd2Ugd2FudCB0byBzYXkgc3JjIGlzIHJlbmFtZWQgdG8gZHN0IG9yIHNyYyBpcyBjb3BpZWQgaW50bworCSAqIGRzdCwgYW5kIHRoZW4gc29tZSBlZGl0IGhhcyBiZWVuIGFwcGxpZWQgdG8gZHN0LgorCSAqCisJICogQ29tcGFyZSB0aGVtIGFuZCByZXR1cm4gaG93IHNpbWlsYXIgdGhleSBhcmUsIHJlcHJlc2VudGluZworCSAqIHRoZSBzY29yZSBhcyBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgTUFYX1NDT1JFLgorCSAqCisJICogV2hlbiB0aGVyZSBpcyBhbiBleGFjdCBtYXRjaCwgaXQgaXMgY29uc2lkZXJlZCBhIGJldHRlcgorCSAqIG1hdGNoIHRoYW4gYW55dGhpbmcgZWxzZTsgdGhlIGRlc3RpbmF0aW9uIGRvZXMgbm90IGV2ZW4KKwkgKiBjYWxsIGludG8gdGhpcyBmdW5jdGlvbiBpbiB0aGF0IGNhc2UuCisJICovCisJdW5zaWduZWQgbG9uZyBtYXhfc2l6ZSwgZGVsdGFfc2l6ZSwgYmFzZV9zaXplLCBzcmNfY29waWVkLCBsaXRlcmFsX2FkZGVkOworCXVuc2lnbmVkIGxvbmcgZGVsdGFfbGltaXQ7CisJaW50IHNjb3JlOworCisJLyogV2UgZGVhbCBvbmx5IHdpdGggcmVndWxhciBmaWxlcy4gIFN5bWxpbmsgcmVuYW1lcyBhcmUgaGFuZGxlZAorCSAqIG9ubHkgd2hlbiB0aGV5IGFyZSBleGFjdCBtYXRjaGVzIC0tLSBpbiBvdGhlciB3b3Jkcywgbm8gZWRpdHMKKwkgKiBhZnRlciByZW5hbWluZy4KKwkgKi8KKwlpZiAoIVNfSVNSRUcoc3JjLT5tb2RlKSB8fCAhU19JU1JFRyhkc3QtPm1vZGUpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogTmVlZCB0byBjaGVjayB0aGF0IHNvdXJjZSBhbmQgZGVzdGluYXRpb24gc2l6ZXMgYXJlCisJICogZmlsbGVkIGluIGJlZm9yZSBjb21wYXJpbmcgdGhlbS4KKwkgKgorCSAqIElmIHdlIGFscmVhZHkgaGF2ZSAiY250X2RhdGEiIGZpbGxlZCBpbiwgd2Uga25vdyBpdCdzCisJICogYWxsIGdvb2QgKGF2b2lkIGNoZWNraW5nIHRoZSBzaXplIGZvciB6ZXJvLCBhcyB0aGF0CisJICogaXMgYSBwb3NzaWJsZSBzaXplIC0gd2UgcmVhbGx5IHNob3VsZCBoYXZlIGEgZmxhZyB0bworCSAqIHNheSB3aGV0aGVyIHRoZSBzaXplIGlzIHZhbGlkIG9yIG5vdCEpCisJICovCisJaWYgKCFzcmMtPmNudF9kYXRhICYmIGRpZmZfcG9wdWxhdGVfZmlsZXNwZWMoc3JjLCAwKSkKKwkJcmV0dXJuIDA7CisJaWYgKCFkc3QtPmNudF9kYXRhICYmIGRpZmZfcG9wdWxhdGVfZmlsZXNwZWMoZHN0LCAwKSkKKwkJcmV0dXJuIDA7CisKKwltYXhfc2l6ZSA9ICgoc3JjLT5zaXplID4gZHN0LT5zaXplKSA/IHNyYy0+c2l6ZSA6IGRzdC0+c2l6ZSk7CisJYmFzZV9zaXplID0gKChzcmMtPnNpemUgPCBkc3QtPnNpemUpID8gc3JjLT5zaXplIDogZHN0LT5zaXplKTsKKwlkZWx0YV9zaXplID0gbWF4X3NpemUgLSBiYXNlX3NpemU7CisKKwkvKiBXZSB3b3VsZCBub3QgY29uc2lkZXIgZWRpdHMgdGhhdCBjaGFuZ2UgdGhlIGZpbGUgc2l6ZSBzbworCSAqIGRyYXN0aWNhbGx5LiAgZGVsdGFfc2l6ZSBtdXN0IGJlIHNtYWxsZXIgdGhhbgorCSAqIChNQVhfU0NPUkUtbWluaW11bV9zY29yZSkvTUFYX1NDT1JFICogbWluKHNyYy0+c2l6ZSwgZHN0LT5zaXplKS4KKwkgKgorCSAqIE5vdGUgdGhhdCBiYXNlX3NpemUgPT0gMCBjYXNlIGlzIGhhbmRsZWQgaGVyZSBhbHJlYWR5CisJICogYW5kIHRoZSBmaW5hbCBzY29yZSBjb21wdXRhdGlvbiBiZWxvdyB3b3VsZCBub3QgaGF2ZSBhCisJICogZGl2aWRlLWJ5LXplcm8gaXNzdWUuCisJICovCisJaWYgKGJhc2Vfc2l6ZSAqIChNQVhfU0NPUkUtbWluaW11bV9zY29yZSkgPCBkZWx0YV9zaXplICogTUFYX1NDT1JFKQorCQlyZXR1cm4gMDsKKworCWRlbHRhX2xpbWl0ID0gKHVuc2lnbmVkIGxvbmcpCisJCShiYXNlX3NpemUgKiAoTUFYX1NDT1JFLW1pbmltdW1fc2NvcmUpIC8gTUFYX1NDT1JFKTsKKwlpZiAoZGlmZmNvcmVfY291bnRfY2hhbmdlcyhzcmMsIGRzdCwKKwkJCQkgICAmc3JjLT5jbnRfZGF0YSwgJmRzdC0+Y250X2RhdGEsCisJCQkJICAgZGVsdGFfbGltaXQsCisJCQkJICAgJnNyY19jb3BpZWQsICZsaXRlcmFsX2FkZGVkKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBIb3cgc2ltaWxhciBhcmUgdGhleT8KKwkgKiB3aGF0IHBlcmNlbnRhZ2Ugb2YgbWF0ZXJpYWwgaW4gZHN0IGFyZSBmcm9tIHNvdXJjZT8KKwkgKi8KKwlpZiAoIWRzdC0+c2l6ZSkKKwkJc2NvcmUgPSAwOyAvKiBzaG91bGQgbm90IGhhcHBlbiAqLworCWVsc2UKKwkJc2NvcmUgPSAoaW50KShzcmNfY29waWVkICogTUFYX1NDT1JFIC8gbWF4X3NpemUpOworCXJldHVybiBzY29yZTsKK30KKworc3RhdGljIHZvaWQgcmVjb3JkX3JlbmFtZV9wYWlyKGludCBkc3RfaW5kZXgsIGludCBzcmNfaW5kZXgsIGludCBzY29yZSkKK3sKKwlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqc3JjLCAqZHN0OworCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpkcDsKKworCWlmIChyZW5hbWVfZHN0W2RzdF9pbmRleF0ucGFpcikKKwkJZGllKCJpbnRlcm5hbCBlcnJvcjogZHN0IGFscmVhZHkgbWF0Y2hlZC4iKTsKKworCXNyYyA9IHJlbmFtZV9zcmNbc3JjX2luZGV4XS5vbmU7CisJc3JjLT5yZW5hbWVfdXNlZCsrOworCXNyYy0+Y291bnQrKzsKKworCWRzdCA9IHJlbmFtZV9kc3RbZHN0X2luZGV4XS50d287CisJZHN0LT5jb3VudCsrOworCisJZHAgPSBkaWZmX3F1ZXVlKE5VTEwsIHNyYywgZHN0KTsKKwlkcC0+cmVuYW1lZF9wYWlyID0gMTsKKwlpZiAoIXN0cmNtcChzcmMtPnBhdGgsIGRzdC0+cGF0aCkpCisJCWRwLT5zY29yZSA9IHJlbmFtZV9zcmNbc3JjX2luZGV4XS5zY29yZTsKKwllbHNlCisJCWRwLT5zY29yZSA9IHNjb3JlOworCXJlbmFtZV9kc3RbZHN0X2luZGV4XS5wYWlyID0gZHA7Cit9CisKKy8qCisgKiBXZSBzb3J0IHRoZSByZW5hbWUgc2ltaWxhcml0eSBtYXRyaXggd2l0aCB0aGUgc2NvcmUsIGluIGRlc2NlbmRpbmcKKyAqIG9yZGVyICh0aGUgbW9zdCBzaW1pbGFyIGZpcnN0KS4KKyAqLworc3RhdGljIGludCBzY29yZV9jb21wYXJlKGNvbnN0IHZvaWQgKmFfLCBjb25zdCB2b2lkICpiXykKK3sKKwljb25zdCBzdHJ1Y3QgZGlmZl9zY29yZSAqYSA9IGFfLCAqYiA9IGJfOworCisJaWYgKGEtPnNjb3JlID09IGItPnNjb3JlKQorCQlyZXR1cm4gYi0+bmFtZV9zY29yZSAtIGEtPm5hbWVfc2NvcmU7CisKKwlyZXR1cm4gYi0+c2NvcmUgLSBhLT5zY29yZTsKK30KKworc3RydWN0IGZpbGVfc2ltaWxhcml0eSB7CisJaW50IHNyY19kc3QsIGluZGV4OworCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpmaWxlc3BlYzsKKwlzdHJ1Y3QgZmlsZV9zaW1pbGFyaXR5ICpuZXh0OworfTsKKworc3RhdGljIGludCBmaW5kX2lkZW50aWNhbF9maWxlcyhzdHJ1Y3QgZmlsZV9zaW1pbGFyaXR5ICpzcmMsCisJCQkJc3RydWN0IGZpbGVfc2ltaWxhcml0eSAqZHN0KQoreworCWludCByZW5hbWVzID0gMDsKKworCS8qCisJICogV2FsayBvdmVyIGFsbCB0aGUgZGVzdGluYXRpb25zIC4uLgorCSAqLworCWRvIHsKKwkJc3RydWN0IGRpZmZfZmlsZXNwZWMgKnRhcmdldCA9IGRzdC0+ZmlsZXNwZWM7CisJCXN0cnVjdCBmaWxlX3NpbWlsYXJpdHkgKnAsICpiZXN0OworCQlpbnQgaSA9IDEwMCwgYmVzdF9zY29yZSA9IC0xOworCisJCS8qCisJCSAqIC4uIHRvIGZpbmQgdGhlIGJlc3Qgc291cmNlIG1hdGNoCisJCSAqLworCQliZXN0ID0gTlVMTDsKKwkJZm9yIChwID0gc3JjOyBwOyBwID0gcC0+bmV4dCkgeworCQkJaW50IHNjb3JlOworCQkJc3RydWN0IGRpZmZfZmlsZXNwZWMgKnNvdXJjZSA9IHAtPmZpbGVzcGVjOworCisJCQkvKiBGYWxzZSBoYXNoIGNvbGxpc3Npb24/ICovCisJCQlpZiAoaGFzaGNtcChzb3VyY2UtPnNoYTEsIHRhcmdldC0+c2hhMSkpCisJCQkJY29udGludWU7CisJCQkvKiBOb24tcmVndWxhciBmaWxlcz8gSWYgc28sIHRoZSBtb2RlcyBtdXN0IG1hdGNoISAqLworCQkJaWYgKCFTX0lTUkVHKHNvdXJjZS0+bW9kZSkgfHwgIVNfSVNSRUcodGFyZ2V0LT5tb2RlKSkgeworCQkJCWlmIChzb3VyY2UtPm1vZGUgIT0gdGFyZ2V0LT5tb2RlKQorCQkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIEdpdmUgaGlnaGVyIHNjb3JlcyB0byBzb3VyY2VzIHRoYXQgaGF2ZW4ndCBiZWVuIHVzZWQgYWxyZWFkeSAqLworCQkJc2NvcmUgPSAhc291cmNlLT5yZW5hbWVfdXNlZDsKKwkJCXNjb3JlICs9IGJhc2VuYW1lX3NhbWUoc291cmNlLCB0YXJnZXQpOworCQkJaWYgKHNjb3JlID4gYmVzdF9zY29yZSkgeworCQkJCWJlc3QgPSBwOworCQkJCWJlc3Rfc2NvcmUgPSBzY29yZTsKKwkJCQlpZiAoc2NvcmUgPT0gMikKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIFRvbyBtYW55IGlkZW50aWNhbCBhbHRlcm5hdGl2ZXM/IFBpY2sgb25lICovCisJCQlpZiAoIS0taSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoYmVzdCkgeworCQkJcmVjb3JkX3JlbmFtZV9wYWlyKGRzdC0+aW5kZXgsIGJlc3QtPmluZGV4LCBNQVhfU0NPUkUpOworCQkJcmVuYW1lcysrOworCQl9CisJfSB3aGlsZSAoKGRzdCA9IGRzdC0+bmV4dCkgIT0gTlVMTCk7CisJcmV0dXJuIHJlbmFtZXM7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfc2ltaWxhcml0eV9saXN0KHN0cnVjdCBmaWxlX3NpbWlsYXJpdHkgKnApCit7CisJd2hpbGUgKHApIHsKKwkJc3RydWN0IGZpbGVfc2ltaWxhcml0eSAqZW50cnkgPSBwOworCQlwID0gcC0+bmV4dDsKKwkJZnJlZShlbnRyeSk7CisJfQorfQorCitzdGF0aWMgaW50IGZpbmRfc2FtZV9maWxlcyh2b2lkICpwdHIpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZmlsZV9zaW1pbGFyaXR5ICpwID0gcHRyOworCXN0cnVjdCBmaWxlX3NpbWlsYXJpdHkgKnNyYyA9IE5VTEwsICpkc3QgPSBOVUxMOworCisJLyogU3BsaXQgdGhlIGhhc2ggbGlzdCB1cCBpbnRvIHNvdXJjZXMgYW5kIGRlc3RpbmF0aW9ucyAqLworCWRvIHsKKwkJc3RydWN0IGZpbGVfc2ltaWxhcml0eSAqZW50cnkgPSBwOworCQlwID0gcC0+bmV4dDsKKwkJaWYgKGVudHJ5LT5zcmNfZHN0IDwgMCkgeworCQkJZW50cnktPm5leHQgPSBzcmM7CisJCQlzcmMgPSBlbnRyeTsKKwkJfSBlbHNlIHsKKwkJCWVudHJ5LT5uZXh0ID0gZHN0OworCQkJZHN0ID0gZW50cnk7CisJCX0KKwl9IHdoaWxlIChwKTsKKworCS8qCisJICogSWYgd2UgaGF2ZSBib3RoIHNvdXJjZXMgKmFuZCogZGVzdGluYXRpb25zLCBzZWUgaWYKKwkgKiB3ZSBjYW4gbWF0Y2ggdGhlbSB1cAorCSAqLworCXJldCA9IChzcmMgJiYgZHN0KSA/IGZpbmRfaWRlbnRpY2FsX2ZpbGVzKHNyYywgZHN0KSA6IDA7CisKKwkvKiBGcmVlIHRoZSBoYXNoZXMgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIHJlbmFtZXMgZm91bmQgKi8KKwlmcmVlX3NpbWlsYXJpdHlfbGlzdChzcmMpOworCWZyZWVfc2ltaWxhcml0eV9saXN0KGRzdCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBoYXNoX2ZpbGVzcGVjKHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpmaWxlc3BlYykKK3sKKwl1bnNpZ25lZCBpbnQgaGFzaDsKKwlpZiAoIWZpbGVzcGVjLT5zaGExX3ZhbGlkKSB7CisJCWlmIChkaWZmX3BvcHVsYXRlX2ZpbGVzcGVjKGZpbGVzcGVjLCAwKSkKKwkJCXJldHVybiAwOworCQloYXNoX3NoYTFfZmlsZShmaWxlc3BlYy0+ZGF0YSwgZmlsZXNwZWMtPnNpemUsICJibG9iIiwgZmlsZXNwZWMtPnNoYTEpOworCX0KKwltZW1jcHkoJmhhc2gsIGZpbGVzcGVjLT5zaGExLCBzaXplb2YoaGFzaCkpOworCXJldHVybiBoYXNoOworfQorCitzdGF0aWMgdm9pZCBpbnNlcnRfZmlsZV90YWJsZShzdHJ1Y3QgaGFzaF90YWJsZSAqdGFibGUsIGludCBzcmNfZHN0LCBpbnQgaW5kZXgsIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpmaWxlc3BlYykKK3sKKwl2b2lkICoqcG9zOworCXVuc2lnbmVkIGludCBoYXNoOworCXN0cnVjdCBmaWxlX3NpbWlsYXJpdHkgKmVudHJ5ID0geG1hbGxvYyhzaXplb2YoKmVudHJ5KSk7CisKKwllbnRyeS0+c3JjX2RzdCA9IHNyY19kc3Q7CisJZW50cnktPmluZGV4ID0gaW5kZXg7CisJZW50cnktPmZpbGVzcGVjID0gZmlsZXNwZWM7CisJZW50cnktPm5leHQgPSBOVUxMOworCisJaGFzaCA9IGhhc2hfZmlsZXNwZWMoZmlsZXNwZWMpOworCXBvcyA9IGluc2VydF9oYXNoKGhhc2gsIGVudHJ5LCB0YWJsZSk7CisKKwkvKiBXZSBhbHJlYWR5IGhhZCBhbiBlbnRyeSB0aGVyZT8gKi8KKwlpZiAocG9zKSB7CisJCWVudHJ5LT5uZXh0ID0gKnBvczsKKwkJKnBvcyA9IGVudHJ5OworCX0KK30KKworLyoKKyAqIEZpbmQgZXhhY3QgcmVuYW1lcyBmaXJzdC4KKyAqCisgKiBUaGUgZmlyc3Qgcm91bmQgbWF0Y2hlcyB1cCB0aGUgdXAtdG8tZGF0ZSBlbnRyaWVzLAorICogYW5kIHRoZW4gZHVyaW5nIHRoZSBzZWNvbmQgcm91bmQgd2UgdHJ5IHRvIG1hdGNoCisgKiBjYWNoZS1kaXJ0eSBlbnRyaWVzIGFzIHdlbGwuCisgKi8KK3N0YXRpYyBpbnQgZmluZF9leGFjdF9yZW5hbWVzKHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IGhhc2hfdGFibGUgZmlsZV90YWJsZTsKKworCWluaXRfaGFzaCgmZmlsZV90YWJsZSk7CisJZm9yIChpID0gMDsgaSA8IHJlbmFtZV9zcmNfbnI7IGkrKykKKwkJaW5zZXJ0X2ZpbGVfdGFibGUoJmZpbGVfdGFibGUsIC0xLCBpLCByZW5hbWVfc3JjW2ldLm9uZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVuYW1lX2RzdF9ucjsgaSsrKQorCQlpbnNlcnRfZmlsZV90YWJsZSgmZmlsZV90YWJsZSwgMSwgaSwgcmVuYW1lX2RzdFtpXS50d28pOworCisJLyogRmluZCB0aGUgcmVuYW1lcyAqLworCWkgPSBmb3JfZWFjaF9oYXNoKCZmaWxlX3RhYmxlLCBmaW5kX3NhbWVfZmlsZXMpOworCisJLyogLi4gYW5kIGZyZWUgdGhlIGhhc2ggZGF0YSBzdHJ1Y3R1cmUgKi8KKwlmcmVlX2hhc2goJmZpbGVfdGFibGUpOworCisJcmV0dXJuIGk7Cit9CisKK3ZvaWQgZGlmZmNvcmVfcmVuYW1lKHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMpCit7CisJaW50IGRldGVjdF9yZW5hbWUgPSBvcHRpb25zLT5kZXRlY3RfcmVuYW1lOworCWludCBtaW5pbXVtX3Njb3JlID0gb3B0aW9ucy0+cmVuYW1lX3Njb3JlOworCWludCByZW5hbWVfbGltaXQgPSBvcHRpb25zLT5yZW5hbWVfbGltaXQ7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxID0gJmRpZmZfcXVldWVkX2RpZmY7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0IG91dHE7CisJc3RydWN0IGRpZmZfc2NvcmUgKm14OworCWludCBpLCBqLCByZW5hbWVfY291bnQ7CisJaW50IG51bV9jcmVhdGUsIG51bV9zcmMsIGRzdF9jbnQ7CisKKwlpZiAoIW1pbmltdW1fc2NvcmUpCisJCW1pbmltdW1fc2NvcmUgPSBERUZBVUxUX1JFTkFNRV9TQ09SRTsKKworCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKSB7CisJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gcS0+cXVldWVbaV07CisJCWlmICghRElGRl9GSUxFX1ZBTElEKHAtPm9uZSkpIHsKKwkJCWlmICghRElGRl9GSUxFX1ZBTElEKHAtPnR3bykpCisJCQkJY29udGludWU7IC8qIHVubWVyZ2VkICovCisJCQllbHNlIGlmIChvcHRpb25zLT5zaW5nbGVfZm9sbG93ICYmCisJCQkJIHN0cmNtcChvcHRpb25zLT5zaW5nbGVfZm9sbG93LCBwLT50d28tPnBhdGgpKQorCQkJCWNvbnRpbnVlOyAvKiBub3QgaW50ZXJlc3RlZCAqLworCQkJZWxzZQorCQkJCWxvY2F0ZV9yZW5hbWVfZHN0KHAtPnR3bywgMSk7CisJCX0KKwkJZWxzZSBpZiAoIURJRkZfRklMRV9WQUxJRChwLT50d28pKSB7CisJCQkvKgorCQkJICogSWYgdGhlIHNvdXJjZSBpcyBhIGJyb2tlbiAiZGVsZXRlIiwgYW5kCisJCQkgKiB0aGV5IGRpZCBub3QgcmVhbGx5IHdhbnQgdG8gZ2V0IGJyb2tlbiwKKwkJCSAqIHRoYXQgbWVhbnMgdGhlIHNvdXJjZSBhY3R1YWxseSBzdGF5cy4KKwkJCSAqIFNvIHdlIGluY3JlbWVudCB0aGUgInJlbmFtZV91c2VkIiBzY29yZQorCQkJICogYnkgb25lLCB0byBpbmRpY2F0ZSBvdXJzZWx2ZXMgYXMgYSB1c2VyCisJCQkgKi8KKwkJCWlmIChwLT5icm9rZW5fcGFpciAmJiAhcC0+c2NvcmUpCisJCQkJcC0+b25lLT5yZW5hbWVfdXNlZCsrOworCQkJcmVnaXN0ZXJfcmVuYW1lX3NyYyhwLT5vbmUsIHAtPnNjb3JlKTsKKwkJfQorCQllbHNlIGlmIChkZXRlY3RfcmVuYW1lID09IERJRkZfREVURUNUX0NPUFkpIHsKKwkJCS8qCisJCQkgKiBJbmNyZW1lbnQgdGhlICJyZW5hbWVfdXNlZCIgc2NvcmUgYnkKKwkJCSAqIG9uZSwgdG8gaW5kaWNhdGUgb3Vyc2VsdmVzIGFzIGEgdXNlci4KKwkJCSAqLworCQkJcC0+b25lLT5yZW5hbWVfdXNlZCsrOworCQkJcmVnaXN0ZXJfcmVuYW1lX3NyYyhwLT5vbmUsIHAtPnNjb3JlKTsKKwkJfQorCX0KKwlpZiAocmVuYW1lX2RzdF9uciA9PSAwIHx8IHJlbmFtZV9zcmNfbnIgPT0gMCkKKwkJZ290byBjbGVhbnVwOyAvKiBub3RoaW5nIHRvIGRvICovCisKKwkvKgorCSAqIFdlIHJlYWxseSB3YW50IHRvIGN1bGwgdGhlIGNhbmRpZGF0ZXMgbGlzdCBlYXJseQorCSAqIHdpdGggY2hlYXAgdGVzdHMgaW4gb3JkZXIgdG8gYXZvaWQgZG9pbmcgZGVsdGFzLgorCSAqLworCXJlbmFtZV9jb3VudCA9IGZpbmRfZXhhY3RfcmVuYW1lcygpOworCisJLyogRGlkIHdlIG9ubHkgd2FudCBleGFjdCByZW5hbWVzPyAqLworCWlmIChtaW5pbXVtX3Njb3JlID09IE1BWF9TQ09SRSkKKwkJZ290byBjbGVhbnVwOworCisJLyoKKwkgKiBDYWxjdWxhdGUgaG93IG1hbnkgcmVuYW1lcyBhcmUgbGVmdCAoYnV0IGFsbCB0aGUgc291cmNlCisJICogZmlsZXMgc3RpbGwgcmVtYWluIGFzIG9wdGlvbnMgZm9yIHJlbmFtZS9jb3BpZXMhKQorCSAqLworCW51bV9jcmVhdGUgPSAocmVuYW1lX2RzdF9uciAtIHJlbmFtZV9jb3VudCk7CisJbnVtX3NyYyA9IHJlbmFtZV9zcmNfbnI7CisKKwkvKiBBbGwgZG9uZT8gKi8KKwlpZiAoIW51bV9jcmVhdGUpCisJCWdvdG8gY2xlYW51cDsKKworCS8qCisJICogVGhpcyBiYXNpY2FsbHkgZG9lcyBhIHRlc3QgZm9yIHRoZSByZW5hbWUgbWF0cml4IG5vdAorCSAqIGdyb3dpbmcgbGFyZ2VyIHRoYW4gYSAicmVuYW1lX2xpbWl0IiBzcXVhcmUgbWF0cml4LCBpZToKKwkgKgorCSAqICAgIG51bV9jcmVhdGUgKiBudW1fc3JjID4gcmVuYW1lX2xpbWl0ICogcmVuYW1lX2xpbWl0CisJICoKKwkgKiBidXQgaGFuZGxlcyB0aGUgcG90ZW50aWFsIG92ZXJmbG93IGNhc2Ugc3BlY2lhbGx5IChhbmQgd2UKKwkgKiBhc3N1bWUgYXQgbGVhc3QgMzItYml0IGludGVnZXJzKQorCSAqLworCWlmIChyZW5hbWVfbGltaXQgPD0gMCB8fCByZW5hbWVfbGltaXQgPiAzMjc2NykKKwkJcmVuYW1lX2xpbWl0ID0gMzI3Njc7CisJaWYgKChudW1fY3JlYXRlID4gcmVuYW1lX2xpbWl0ICYmIG51bV9zcmMgPiByZW5hbWVfbGltaXQpIHx8CisJICAgIChudW1fY3JlYXRlICogbnVtX3NyYyA+IHJlbmFtZV9saW1pdCAqIHJlbmFtZV9saW1pdCkpIHsKKwkJd2FybmluZygidG9vIG1hbnkgZmlsZXMsIHNraXBwaW5nIGluZXhhY3QgcmVuYW1lIGRldGVjdGlvbiIpOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJbXggPSB4bWFsbG9jKHNpemVvZigqbXgpICogbnVtX2NyZWF0ZSAqIG51bV9zcmMpOworCWZvciAoZHN0X2NudCA9IGkgPSAwOyBpIDwgcmVuYW1lX2RzdF9ucjsgaSsrKSB7CisJCWludCBiYXNlID0gZHN0X2NudCAqIG51bV9zcmM7CisJCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICp0d28gPSByZW5hbWVfZHN0W2ldLnR3bzsKKwkJaWYgKHJlbmFtZV9kc3RbaV0ucGFpcikKKwkJCWNvbnRpbnVlOyAvKiBkZWFsdCB3aXRoIGV4YWN0IG1hdGNoIGFscmVhZHkuICovCisJCWZvciAoaiA9IDA7IGogPCByZW5hbWVfc3JjX25yOyBqKyspIHsKKwkJCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUgPSByZW5hbWVfc3JjW2pdLm9uZTsKKwkJCXN0cnVjdCBkaWZmX3Njb3JlICptID0gJm14W2Jhc2Ural07CisJCQltLT5zcmMgPSBqOworCQkJbS0+ZHN0ID0gaTsKKwkJCW0tPnNjb3JlID0gZXN0aW1hdGVfc2ltaWxhcml0eShvbmUsIHR3bywKKwkJCQkJCSAgICAgICBtaW5pbXVtX3Njb3JlKTsKKwkJCW0tPm5hbWVfc2NvcmUgPSBiYXNlbmFtZV9zYW1lKG9uZSwgdHdvKTsKKwkJCWRpZmZfZnJlZV9maWxlc3BlY19ibG9iKG9uZSk7CisJCX0KKwkJLyogV2UgZG8gbm90IG5lZWQgdGhlIHRleHQgYW55bW9yZSAqLworCQlkaWZmX2ZyZWVfZmlsZXNwZWNfYmxvYih0d28pOworCQlkc3RfY250Kys7CisJfQorCS8qIGNvc3QgbWF0cml4IHNvcnRlZCBieSBtb3N0IHRvIGxlYXN0IHNpbWlsYXIgcGFpciAqLworCXFzb3J0KG14LCBudW1fY3JlYXRlICogbnVtX3NyYywgc2l6ZW9mKCpteCksIHNjb3JlX2NvbXBhcmUpOworCWZvciAoaSA9IDA7IGkgPCBudW1fY3JlYXRlICogbnVtX3NyYzsgaSsrKSB7CisJCXN0cnVjdCBkaWZmX3JlbmFtZV9kc3QgKmRzdCA9ICZyZW5hbWVfZHN0W214W2ldLmRzdF07CisJCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpzcmM7CisJCWlmIChkc3QtPnBhaXIpCisJCQljb250aW51ZTsgLyogYWxyZWFkeSBkb25lLCBlaXRoZXIgZXhhY3Qgb3IgZnV6enkuICovCisJCWlmIChteFtpXS5zY29yZSA8IG1pbmltdW1fc2NvcmUpCisJCQlicmVhazsgLyogdGhlcmUgaXMgbm8gbW9yZSB1c2FibGUgcGFpci4gKi8KKwkJc3JjID0gcmVuYW1lX3NyY1tteFtpXS5zcmNdLm9uZTsKKwkJaWYgKHNyYy0+cmVuYW1lX3VzZWQpCisJCQljb250aW51ZTsKKwkJcmVjb3JkX3JlbmFtZV9wYWlyKG14W2ldLmRzdCwgbXhbaV0uc3JjLCBteFtpXS5zY29yZSk7CisJCXJlbmFtZV9jb3VudCsrOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NyZWF0ZSAqIG51bV9zcmM7IGkrKykgeworCQlzdHJ1Y3QgZGlmZl9yZW5hbWVfZHN0ICpkc3QgPSAmcmVuYW1lX2RzdFtteFtpXS5kc3RdOworCQlpZiAoZHN0LT5wYWlyKQorCQkJY29udGludWU7IC8qIGFscmVhZHkgZG9uZSwgZWl0aGVyIGV4YWN0IG9yIGZ1enp5LiAqLworCQlpZiAobXhbaV0uc2NvcmUgPCBtaW5pbXVtX3Njb3JlKQorCQkJYnJlYWs7IC8qIHRoZXJlIGlzIG5vIG1vcmUgdXNhYmxlIHBhaXIuICovCisJCXJlY29yZF9yZW5hbWVfcGFpcihteFtpXS5kc3QsIG14W2ldLnNyYywgbXhbaV0uc2NvcmUpOworCQlyZW5hbWVfY291bnQrKzsKKwl9CisJZnJlZShteCk7CisKKyBjbGVhbnVwOgorCS8qIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgZm91bmQgc29tZSByZW5hbWVzIGFuZCBjb3BpZXMgYW5kIHRoZXkKKwkgKiBhcmUgcmVjb3JkZWQgaW4gcmVuYW1lX2RzdC4gIFRoZSBvcmlnaW5hbCBsaXN0IGlzIHN0aWxsIGluICpxLgorCSAqLworCW91dHEucXVldWUgPSBOVUxMOworCW91dHEubnIgPSBvdXRxLmFsbG9jID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCA9IHEtPnF1ZXVlW2ldOworCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcGFpcl90b19mcmVlID0gTlVMTDsKKworCQlpZiAoIURJRkZfRklMRV9WQUxJRChwLT5vbmUpICYmIERJRkZfRklMRV9WQUxJRChwLT50d28pKSB7CisJCQkvKgorCQkJICogQ3JlYXRpb24KKwkJCSAqCisJCQkgKiBXZSB3b3VsZCBvdXRwdXQgdGhpcyBjcmVhdGUgcmVjb3JkIGlmIGl0IGhhcworCQkJICogbm90IGJlZW4gdHVybmVkIGludG8gYSByZW5hbWUvY29weSBhbHJlYWR5LgorCQkJICovCisJCQlzdHJ1Y3QgZGlmZl9yZW5hbWVfZHN0ICpkc3QgPQorCQkJCWxvY2F0ZV9yZW5hbWVfZHN0KHAtPnR3bywgMCk7CisJCQlpZiAoZHN0ICYmIGRzdC0+cGFpcikgeworCQkJCWRpZmZfcSgmb3V0cSwgZHN0LT5wYWlyKTsKKwkJCQlwYWlyX3RvX2ZyZWUgPSBwOworCQkJfQorCQkJZWxzZQorCQkJCS8qIG5vIG1hdGNoaW5nIHJlbmFtZS9jb3B5IHNvdXJjZSwgc28KKwkJCQkgKiByZWNvcmQgdGhpcyBhcyBhIGNyZWF0aW9uLgorCQkJCSAqLworCQkJCWRpZmZfcSgmb3V0cSwgcCk7CisJCX0KKwkJZWxzZSBpZiAoRElGRl9GSUxFX1ZBTElEKHAtPm9uZSkgJiYgIURJRkZfRklMRV9WQUxJRChwLT50d28pKSB7CisJCQkvKgorCQkJICogRGVsZXRpb24KKwkJCSAqCisJCQkgKiBXZSB3b3VsZCBvdXRwdXQgdGhpcyBkZWxldGUgcmVjb3JkIGlmOgorCQkJICoKKwkJCSAqICgxKSB0aGlzIGlzIGEgYnJva2VuIGRlbGV0ZSBhbmQgdGhlIGNvdW50ZXJwYXJ0CisJCQkgKiAgICAgYnJva2VuIGNyZWF0ZSByZW1haW5zIGluIHRoZSBvdXRwdXQ7IG9yCisJCQkgKiAoMikgdGhpcyBpcyBub3QgYSBicm9rZW4gZGVsZXRlLCBhbmQgcmVuYW1lX2RzdAorCQkJICogICAgIGRvZXMgbm90IGhhdmUgYSByZW5hbWUvY29weSB0byBtb3ZlIHAtPm9uZS0+cGF0aAorCQkJICogICAgIG91dCBvZiBleGlzdGVuY2UuCisJCQkgKgorCQkJICogT3RoZXJ3aXNlLCB0aGUgY291bnRlcnBhcnQgYnJva2VuIGNyZWF0ZQorCQkJICogaGFzIGJlZW4gdHVybmVkIGludG8gYSByZW5hbWUtZWRpdDsgb3IKKwkJCSAqIGRlbGV0ZSBkaWQgbm90IGhhdmUgYSBtYXRjaGluZyBjcmVhdGUgdG8KKwkJCSAqIGJlZ2luIHdpdGguCisJCQkgKi8KKwkJCWlmIChESUZGX1BBSVJfQlJPS0VOKHApKSB7CisJCQkJLyogYnJva2VuIGRlbGV0ZSAqLworCQkJCXN0cnVjdCBkaWZmX3JlbmFtZV9kc3QgKmRzdCA9CisJCQkJCWxvY2F0ZV9yZW5hbWVfZHN0KHAtPm9uZSwgMCk7CisJCQkJaWYgKGRzdCAmJiBkc3QtPnBhaXIpCisJCQkJCS8qIGNvdW50ZXJwYXJ0IGlzIG5vdyByZW5hbWUvY29weSAqLworCQkJCQlwYWlyX3RvX2ZyZWUgPSBwOworCQkJfQorCQkJZWxzZSB7CisJCQkJaWYgKHAtPm9uZS0+cmVuYW1lX3VzZWQpCisJCQkJCS8qIHRoaXMgcGF0aCByZW1haW5zICovCisJCQkJCXBhaXJfdG9fZnJlZSA9IHA7CisJCQl9CisKKwkJCWlmIChwYWlyX3RvX2ZyZWUpCisJCQkJOworCQkJZWxzZQorCQkJCWRpZmZfcSgmb3V0cSwgcCk7CisJCX0KKwkJZWxzZSBpZiAoIWRpZmZfdW5tb2RpZmllZF9wYWlyKHApKQorCQkJLyogYWxsIHRoZSB1c3VhbCBvbmVzIG5lZWQgdG8gYmUga2VwdCAqLworCQkJZGlmZl9xKCZvdXRxLCBwKTsKKwkJZWxzZQorCQkJLyogbm8gbmVlZCB0byBrZWVwIHVubW9kaWZpZWQgcGFpcnMgKi8KKwkJCXBhaXJfdG9fZnJlZSA9IHA7CisKKwkJaWYgKHBhaXJfdG9fZnJlZSkKKwkJCWRpZmZfZnJlZV9maWxlcGFpcihwYWlyX3RvX2ZyZWUpOworCX0KKwlkaWZmX2RlYnVnX3F1ZXVlKCJkb25lIGNvcHlpbmcgb3JpZ2luYWwiLCAmb3V0cSk7CisKKwlmcmVlKHEtPnF1ZXVlKTsKKwkqcSA9IG91dHE7CisJZGlmZl9kZWJ1Z19xdWV1ZSgiZG9uZSBjb2xsYXBzaW5nIiwgcSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVuYW1lX2RzdF9ucjsgaSsrKQorCQlmcmVlX2ZpbGVzcGVjKHJlbmFtZV9kc3RbaV0udHdvKTsKKworCWZyZWUocmVuYW1lX2RzdCk7CisJcmVuYW1lX2RzdCA9IE5VTEw7CisJcmVuYW1lX2RzdF9uciA9IHJlbmFtZV9kc3RfYWxsb2MgPSAwOworCWZyZWUocmVuYW1lX3NyYyk7CisJcmVuYW1lX3NyYyA9IE5VTEw7CisJcmVuYW1lX3NyY19uciA9IHJlbmFtZV9zcmNfYWxsb2MgPSAwOworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RpZmZjb3JlLmggYi9kaWZmY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjOTZjMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kaWZmY29yZS5oCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisgKi8KKyNpZm5kZWYgRElGRkNPUkVfSAorI2RlZmluZSBESUZGQ09SRV9ICisKKy8qIFRoaXMgaGVhZGVyIGZpbGUgaXMgaW50ZXJuYWwgYmV0d2VlbiBkaWZmLmMgYW5kIGl0cyBkaWZmIHRyYW5zZm9ybWVycworICogKGUuZy4gZGlmZmNvcmUtcmVuYW1lLCBkaWZmY29yZS1waWNrYXhlKS4gIE5ldmVyIGluY2x1ZGUgdGhpcyBoZWFkZXIKKyAqIGluIGFueXRoaW5nIGVsc2UuCisgKi8KKworLyogV2UgaW50ZXJuYWxseSB1c2UgdW5zaWduZWQgc2hvcnQgYXMgdGhlIHNjb3JlIHZhbHVlLAorICogYW5kIHJlbHkgb24gYW4gaW50IGNhcGFibGUgdG8gaG9sZCAzMi1iaXRzLiAgLUIgY2FuIHRha2UKKyAqIC1CbWVyZ2Vfc2NvcmUvYnJlYWtfc2NvcmUgZm9ybWF0IGFuZCB0aGUgdHdvIHNjb3JlcyBhcmUKKyAqIHBhc3NlZCBhcm91bmQgaW4gb25lIGludCAoaGlnaCAxNi1iaXQgZm9yIG1lcmdlIGFuZCBsb3cgMTYtYml0CisgKiBmb3IgYnJlYWspLgorICovCisjZGVmaW5lIE1BWF9TQ09SRSA2MDAwMC4wCisjZGVmaW5lIERFRkFVTFRfUkVOQU1FX1NDT1JFIDMwMDAwIC8qIHJlbmFtZS9jb3B5IHNpbWlsYXJpdHkgbWluaW11bSAoNTAlKSAqLworI2RlZmluZSBERUZBVUxUX0JSRUFLX1NDT1JFICAzMDAwMCAvKiBtaW5pbXVtIGZvciBicmVhayB0byBoYXBwZW4gKDUwJSkgKi8KKyNkZWZpbmUgREVGQVVMVF9NRVJHRV9TQ09SRSAgMzYwMDAgLyogbWF4aW11bSBmb3IgYnJlYWstbWVyZ2UgdG8gaGFwcGVuIDYwJSkgKi8KKworI2RlZmluZSBNSU5JTVVNX0JSRUFLX1NJWkUgICAgIDQwMCAvKiBkbyBub3QgYnJlYWsgYSBmaWxlIHNtYWxsZXIgdGhhbiB0aGlzICovCisKK3N0cnVjdCBkaWZmX2ZpbGVzcGVjIHsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWNoYXIgKnBhdGg7CisJdm9pZCAqZGF0YTsKKwl2b2lkICpjbnRfZGF0YTsKKwljb25zdCBjaGFyICpmdW5jbmFtZV9wYXR0ZXJuX2lkZW50OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgY291bnQ7ICAgICAgICAgICAgICAgLyogUmVmZXJlbmNlIGNvdW50ICovCisJaW50IHhmcm1fZmxhZ3M7CQkgLyogZm9yIHVzZSBieSB0aGUgeGZybSAqLworCWludCByZW5hbWVfdXNlZDsgICAgICAgICAvKiBDb3VudCBvZiByZW5hbWUgdXNlcnMgKi8KKwl1bnNpZ25lZCBzaG9ydCBtb2RlOwkgLyogZmlsZSBtb2RlICovCisJdW5zaWduZWQgc2hhMV92YWxpZCA6IDE7IC8qIGlmIHRydWUsIHVzZSBzaGExIGFuZCB0cnVzdCBtb2RlOworCQkJCSAgKiBpZiBmYWxzZSwgdXNlIHRoZSBuYW1lIGFuZCByZWFkIGZyb20KKwkJCQkgICogdGhlIGZpbGVzeXN0ZW0uCisJCQkJICAqLworI2RlZmluZSBESUZGX0ZJTEVfVkFMSUQoc3BlYykgKCgoc3BlYyktPm1vZGUpICE9IDApCisJdW5zaWduZWQgc2hvdWxkX2ZyZWUgOiAxOyAvKiBkYXRhIHNob3VsZCBiZSBmcmVlKCknZWQgKi8KKwl1bnNpZ25lZCBzaG91bGRfbXVubWFwIDogMTsgLyogZGF0YSBzaG91bGQgYmUgbXVubWFwKCknZWQgKi8KKwl1bnNpZ25lZCBjaGVja2VkX2F0dHIgOiAxOworCXVuc2lnbmVkIGlzX2JpbmFyeSA6IDE7IC8qIGRhdGEgc2hvdWxkIGJlIGNvbnNpZGVyZWQgImJpbmFyeSIgKi8KK307CisKK2V4dGVybiBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqYWxsb2NfZmlsZXNwZWMoY29uc3QgY2hhciAqKTsKK2V4dGVybiB2b2lkIGZyZWVfZmlsZXNwZWMoc3RydWN0IGRpZmZfZmlsZXNwZWMgKik7CitleHRlcm4gdm9pZCBmaWxsX2ZpbGVzcGVjKHN0cnVjdCBkaWZmX2ZpbGVzcGVjICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwKKwkJCSAgdW5zaWduZWQgc2hvcnQpOworCitleHRlcm4gaW50IGRpZmZfcG9wdWxhdGVfZmlsZXNwZWMoc3RydWN0IGRpZmZfZmlsZXNwZWMgKiwgaW50KTsKK2V4dGVybiB2b2lkIGRpZmZfZnJlZV9maWxlc3BlY19kYXRhKHN0cnVjdCBkaWZmX2ZpbGVzcGVjICopOworZXh0ZXJuIHZvaWQgZGlmZl9mcmVlX2ZpbGVzcGVjX2Jsb2Ioc3RydWN0IGRpZmZfZmlsZXNwZWMgKik7CitleHRlcm4gaW50IGRpZmZfZmlsZXNwZWNfaXNfYmluYXJ5KHN0cnVjdCBkaWZmX2ZpbGVzcGVjICopOworCitzdHJ1Y3QgZGlmZl9maWxlcGFpciB7CisJc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZTsKKwlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqdHdvOworCXVuc2lnbmVkIHNob3J0IGludCBzY29yZTsKKwljaGFyIHN0YXR1czsgLyogTSBDIFIgTiBEIFUgKHNlZSBEb2N1bWVudGF0aW9uL2RpZmYtZm9ybWF0LnR4dCkgKi8KKwl1bnNpZ25lZCBicm9rZW5fcGFpciA6IDE7CisJdW5zaWduZWQgcmVuYW1lZF9wYWlyIDogMTsKKwl1bnNpZ25lZCBpc191bm1lcmdlZCA6IDE7Cit9OworI2RlZmluZSBESUZGX1BBSVJfVU5NRVJHRUQocCkgKChwKS0+aXNfdW5tZXJnZWQpCisKKyNkZWZpbmUgRElGRl9QQUlSX1JFTkFNRShwKSAoKHApLT5yZW5hbWVkX3BhaXIpCisKKyNkZWZpbmUgRElGRl9QQUlSX0JST0tFTihwKSBcCisJKCAoIURJRkZfRklMRV9WQUxJRCgocCktPm9uZSkgIT0gIURJRkZfRklMRV9WQUxJRCgocCktPnR3bykpICYmIFwKKwkgICgocCktPmJyb2tlbl9wYWlyICE9IDApICkKKworI2RlZmluZSBESUZGX1BBSVJfVFlQRV9DSEFOR0VEKHApIFwKKwkoKFNfSUZNVCAmIChwKS0+b25lLT5tb2RlKSAhPSAoU19JRk1UICYgKHApLT50d28tPm1vZGUpKQorCisjZGVmaW5lIERJRkZfUEFJUl9NT0RFX0NIQU5HRUQocCkgKChwKS0+b25lLT5tb2RlICE9IChwKS0+dHdvLT5tb2RlKQorCitleHRlcm4gdm9pZCBkaWZmX2ZyZWVfZmlsZXBhaXIoc3RydWN0IGRpZmZfZmlsZXBhaXIgKik7CisKK2V4dGVybiBpbnQgZGlmZl91bm1vZGlmaWVkX3BhaXIoc3RydWN0IGRpZmZfZmlsZXBhaXIgKik7CisKK3N0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCB7CisJc3RydWN0IGRpZmZfZmlsZXBhaXIgKipxdWV1ZTsKKwlpbnQgYWxsb2M7CisJaW50IG5yOworfTsKKworZXh0ZXJuIHN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCBkaWZmX3F1ZXVlZF9kaWZmOworZXh0ZXJuIHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpkaWZmX3F1ZXVlKHN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqLAorCQkJCQlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqLAorCQkJCQlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqKTsKK2V4dGVybiB2b2lkIGRpZmZfcShzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKiwgc3RydWN0IGRpZmZfZmlsZXBhaXIgKik7CisKK2V4dGVybiB2b2lkIGRpZmZjb3JlX3BhdGhzcGVjKGNvbnN0IGNoYXIgKipwYXRoc3BlYyk7CitleHRlcm4gdm9pZCBkaWZmY29yZV9icmVhayhpbnQpOworZXh0ZXJuIHZvaWQgZGlmZmNvcmVfcmVuYW1lKHN0cnVjdCBkaWZmX29wdGlvbnMgKik7CitleHRlcm4gdm9pZCBkaWZmY29yZV9tZXJnZV9icm9rZW4odm9pZCk7CitleHRlcm4gdm9pZCBkaWZmY29yZV9waWNrYXhlKGNvbnN0IGNoYXIgKm5lZWRsZSwgaW50IG9wdHMpOworZXh0ZXJuIHZvaWQgZGlmZmNvcmVfb3JkZXIoY29uc3QgY2hhciAqb3JkZXJmaWxlKTsKKworI2RlZmluZSBESUZGX0RFQlVHIDAKKyNpZiBESUZGX0RFQlVHCit2b2lkIGRpZmZfZGVidWdfZmlsZXNwZWMoc3RydWN0IGRpZmZfZmlsZXNwZWMgKiwgaW50LCBjb25zdCBjaGFyICopOwordm9pZCBkaWZmX2RlYnVnX2ZpbGVwYWlyKGNvbnN0IHN0cnVjdCBkaWZmX2ZpbGVwYWlyICosIGludCk7Cit2b2lkIGRpZmZfZGVidWdfcXVldWUoY29uc3QgY2hhciAqLCBzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKik7CisjZWxzZQorI2RlZmluZSBkaWZmX2RlYnVnX2ZpbGVzcGVjKGEsYixjKSBkbyB7fSB3aGlsZSgwKQorI2RlZmluZSBkaWZmX2RlYnVnX2ZpbGVwYWlyKGEsYikgZG8ge30gd2hpbGUoMCkKKyNkZWZpbmUgZGlmZl9kZWJ1Z19xdWV1ZShhLGIpIGRvIHt9IHdoaWxlKDApCisjZW5kaWYKKworZXh0ZXJuIGludCBkaWZmY29yZV9jb3VudF9jaGFuZ2VzKHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpzcmMsCisJCQkJICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqZHN0LAorCQkJCSAgdm9pZCAqKnNyY19jb3VudF9wLAorCQkJCSAgdm9pZCAqKmRzdF9jb3VudF9wLAorCQkJCSAgdW5zaWduZWQgbG9uZyBkZWx0YV9saW1pdCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgKnNyY19jb3BpZWQsCisJCQkJICB1bnNpZ25lZCBsb25nICpsaXRlcmFsX2FkZGVkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kaXIuYyBiL2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYzQ1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXIuYwpAQCAtMCwwICsxLDgyMSBAQAorLyoKKyAqIFRoaXMgaGFuZGxlcyByZWN1cnNpdmUgZmlsZW5hbWUgZGV0ZWN0aW9uIHdpdGggZXhjbHVkZQorICogZmlsZXMsIGluZGV4IGtub3dsZWRnZSBldGMuLgorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUtMjAwNgorICoJCSBKdW5pbyBIYW1hbm8sIDIwMDUtMjAwNgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaXIuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisKK3N0cnVjdCBwYXRoX3NpbXBsaWZ5IHsKKwlpbnQgbGVuOworCWNvbnN0IGNoYXIgKnBhdGg7Cit9OworCitzdGF0aWMgaW50IHJlYWRfZGlyZWN0b3J5X3JlY3Vyc2l2ZShzdHJ1Y3QgZGlyX3N0cnVjdCAqZGlyLAorCWNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLAorCWludCBjaGVja19vbmx5LCBjb25zdCBzdHJ1Y3QgcGF0aF9zaW1wbGlmeSAqc2ltcGxpZnkpOworc3RhdGljIGludCBnZXRfZHR5cGUoc3RydWN0IGRpcmVudCAqZGUsIGNvbnN0IGNoYXIgKnBhdGgpOworCitpbnQgY29tbW9uX3ByZWZpeChjb25zdCBjaGFyICoqcGF0aHNwZWMpCit7CisJY29uc3QgY2hhciAqcGF0aCwgKnNsYXNoLCAqbmV4dDsKKwlpbnQgcHJlZml4OworCisJaWYgKCFwYXRoc3BlYykKKwkJcmV0dXJuIDA7CisKKwlwYXRoID0gKnBhdGhzcGVjOworCXNsYXNoID0gc3RycmNocihwYXRoLCAnLycpOworCWlmICghc2xhc2gpCisJCXJldHVybiAwOworCisJcHJlZml4ID0gc2xhc2ggLSBwYXRoICsgMTsKKwl3aGlsZSAoKG5leHQgPSAqKytwYXRoc3BlYykgIT0gTlVMTCkgeworCQlpbnQgbGVuID0gc3RybGVuKG5leHQpOworCQlpZiAobGVuID49IHByZWZpeCAmJiAhbWVtY21wKHBhdGgsIG5leHQsIHByZWZpeCkpCisJCQljb250aW51ZTsKKwkJbGVuID0gcHJlZml4IC0gMTsKKwkJZm9yICg7OykgeworCQkJaWYgKCFsZW4pCisJCQkJcmV0dXJuIDA7CisJCQlpZiAobmV4dFstLWxlbl0gIT0gJy8nKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKG1lbWNtcChwYXRoLCBuZXh0LCBsZW4rMSkpCisJCQkJY29udGludWU7CisJCQlwcmVmaXggPSBsZW4gKyAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHByZWZpeDsKK30KKworLyoKKyAqIERvZXMgJ21hdGNoJyBtYXRjaGVzIHRoZSBnaXZlbiBuYW1lPworICogQSBtYXRjaCBpcyBmb3VuZCBpZgorICoKKyAqICgxKSB0aGUgJ21hdGNoJyBzdHJpbmcgaXMgbGVhZGluZyBkaXJlY3Rvcnkgb2YgJ25hbWUnLCBvcgorICogKDIpIHRoZSAnbWF0Y2gnIHN0cmluZyBpcyBhIHdpbGRjYXJkIGFuZCBtYXRjaGVzICduYW1lJywgb3IKKyAqICgzKSB0aGUgJ21hdGNoJyBzdHJpbmcgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyAnbmFtZScuCisgKgorICogYW5kIHRoZSByZXR1cm4gdmFsdWUgdGVsbHMgd2hpY2ggY2FzZSBpdCB3YXMuCisgKgorICogSXQgcmV0dXJucyAwIHdoZW4gdGhlcmUgaXMgbm8gbWF0Y2guCisgKi8KK3N0YXRpYyBpbnQgbWF0Y2hfb25lKGNvbnN0IGNoYXIgKm1hdGNoLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikKK3sKKwlpbnQgbWF0Y2hsZW47CisKKwkvKiBJZiB0aGUgbWF0Y2ggd2FzIGp1c3QgdGhlIHByZWZpeCwgd2UgbWF0Y2hlZCAqLworCW1hdGNobGVuID0gc3RybGVuKG1hdGNoKTsKKwlpZiAoIW1hdGNobGVuKQorCQlyZXR1cm4gTUFUQ0hFRF9SRUNVUlNJVkVMWTsKKworCS8qCisJICogSWYgd2UgZG9uJ3QgbWF0Y2ggdGhlIG1hdGNoc3RyaW5nIGV4YWN0bHksCisJICogd2UgbmVlZCB0byBtYXRjaCBieSBmbm1hdGNoCisJICovCisJaWYgKHN0cm5jbXAobWF0Y2gsIG5hbWUsIG1hdGNobGVuKSkKKwkJcmV0dXJuICFmbm1hdGNoKG1hdGNoLCBuYW1lLCAwKSA/IE1BVENIRURfRk5NQVRDSCA6IDA7CisKKwlpZiAoIW5hbWVbbWF0Y2hsZW5dKQorCQlyZXR1cm4gTUFUQ0hFRF9FWEFDVExZOworCWlmIChtYXRjaFttYXRjaGxlbi0xXSA9PSAnLycgfHwgbmFtZVttYXRjaGxlbl0gPT0gJy8nKQorCQlyZXR1cm4gTUFUQ0hFRF9SRUNVUlNJVkVMWTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEdpdmVuIGEgbmFtZSBhbmQgYSBsaXN0IG9mIHBhdGhzcGVjcywgc2VlIGlmIHRoZSBuYW1lIG1hdGNoZXMKKyAqIGFueSBvZiB0aGUgcGF0aHNwZWNzLiAgVGhlIGNhbGxlciBpcyBhbHNvIGludGVyZXN0ZWQgaW4gc2VlaW5nCisgKiBhbGwgcGF0aHNwZWMgbWF0Y2hlcyBzb21lIG5hbWVzIGl0IGNhbGxzIHRoaXMgZnVuY3Rpb24gd2l0aAorICogKG90aGVyd2lzZSB0aGUgdXNlciBjb3VsZCBoYXZlIG1pc3R5cGVkIHRoZSB1bm1hdGNoZWQgcGF0aHNwZWMpLAorICogYW5kIGEgbWFyayBpcyBsZWZ0IGluIHNlZW5bXSBhcnJheSBmb3IgcGF0aHNwZWMgZWxlbWVudCB0aGF0CisgKiBhY3R1YWxseSBtYXRjaGVkIGFueXRoaW5nLgorICovCitpbnQgbWF0Y2hfcGF0aHNwZWMoY29uc3QgY2hhciAqKnBhdGhzcGVjLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IHByZWZpeCwgY2hhciAqc2VlbikKK3sKKwlpbnQgcmV0dmFsOworCWNvbnN0IGNoYXIgKm1hdGNoOworCisJbmFtZSArPSBwcmVmaXg7CisJbmFtZWxlbiAtPSBwcmVmaXg7CisKKwlmb3IgKHJldHZhbCA9IDA7IChtYXRjaCA9ICpwYXRoc3BlYysrKSAhPSBOVUxMOyBzZWVuKyspIHsKKwkJaW50IGhvdzsKKwkJaWYgKHJldHZhbCAmJiAqc2VlbiA9PSBNQVRDSEVEX0VYQUNUTFkpCisJCQljb250aW51ZTsKKwkJbWF0Y2ggKz0gcHJlZml4OworCQlob3cgPSBtYXRjaF9vbmUobWF0Y2gsIG5hbWUsIG5hbWVsZW4pOworCQlpZiAoaG93KSB7CisJCQlpZiAocmV0dmFsIDwgaG93KQorCQkJCXJldHZhbCA9IGhvdzsKKwkJCWlmICgqc2VlbiA8IGhvdykKKwkJCQkqc2VlbiA9IGhvdzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IG5vX3dpbGRjYXJkKGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKwlyZXR1cm4gc3RyaW5nW3N0cmNzcG4oc3RyaW5nLCAiKj9beyIpXSA9PSAnXDAnOworfQorCit2b2lkIGFkZF9leGNsdWRlKGNvbnN0IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqYmFzZSwKKwkJIGludCBiYXNlbGVuLCBzdHJ1Y3QgZXhjbHVkZV9saXN0ICp3aGljaCkKK3sKKwlzdHJ1Y3QgZXhjbHVkZSAqeDsKKwlzaXplX3QgbGVuOworCWludCB0b19leGNsdWRlID0gMTsKKwlpbnQgZmxhZ3MgPSAwOworCisJaWYgKCpzdHJpbmcgPT0gJyEnKSB7CisJCXRvX2V4Y2x1ZGUgPSAwOworCQlzdHJpbmcrKzsKKwl9CisJbGVuID0gc3RybGVuKHN0cmluZyk7CisJaWYgKGxlbiAmJiBzdHJpbmdbbGVuIC0gMV0gPT0gJy8nKSB7CisJCWNoYXIgKnM7CisJCXggPSB4bWFsbG9jKHNpemVvZigqeCkgKyBsZW4pOworCQlzID0gKGNoYXIqKSh4KzEpOworCQltZW1jcHkocywgc3RyaW5nLCBsZW4gLSAxKTsKKwkJc1tsZW4gLSAxXSA9ICdcMCc7CisJCXN0cmluZyA9IHM7CisJCXgtPnBhdHRlcm4gPSBzOworCQlmbGFncyA9IEVYQ19GTEFHX01VU1RCRURJUjsKKwl9IGVsc2UgeworCQl4ID0geG1hbGxvYyhzaXplb2YoKngpKTsKKwkJeC0+cGF0dGVybiA9IHN0cmluZzsKKwl9CisJeC0+dG9fZXhjbHVkZSA9IHRvX2V4Y2x1ZGU7CisJeC0+cGF0dGVybmxlbiA9IHN0cmxlbihzdHJpbmcpOworCXgtPmJhc2UgPSBiYXNlOworCXgtPmJhc2VsZW4gPSBiYXNlbGVuOworCXgtPmZsYWdzID0gZmxhZ3M7CisJaWYgKCFzdHJjaHIoc3RyaW5nLCAnLycpKQorCQl4LT5mbGFncyB8PSBFWENfRkxBR19OT0RJUjsKKwlpZiAobm9fd2lsZGNhcmQoc3RyaW5nKSkKKwkJeC0+ZmxhZ3MgfD0gRVhDX0ZMQUdfTk9XSUxEQ0FSRDsKKwlpZiAoKnN0cmluZyA9PSAnKicgJiYgbm9fd2lsZGNhcmQoc3RyaW5nKzEpKQorCQl4LT5mbGFncyB8PSBFWENfRkxBR19FTkRTV0lUSDsKKwlBTExPQ19HUk9XKHdoaWNoLT5leGNsdWRlcywgd2hpY2gtPm5yICsgMSwgd2hpY2gtPmFsbG9jKTsKKwl3aGljaC0+ZXhjbHVkZXNbd2hpY2gtPm5yKytdID0geDsKK30KKworc3RhdGljIGludCBhZGRfZXhjbHVkZXNfZnJvbV9maWxlXzEoY29uc3QgY2hhciAqZm5hbWUsCisJCQkJICAgIGNvbnN0IGNoYXIgKmJhc2UsCisJCQkJICAgIGludCBiYXNlbGVuLAorCQkJCSAgICBjaGFyICoqYnVmX3AsCisJCQkJICAgIHN0cnVjdCBleGNsdWRlX2xpc3QgKndoaWNoKQoreworCXN0cnVjdCBzdGF0IHN0OworCWludCBmZCwgaTsKKwlzaXplX3Qgc2l6ZTsKKwljaGFyICpidWYsICplbnRyeTsKKworCWZkID0gb3BlbihmbmFtZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDAgfHwgZnN0YXQoZmQsICZzdCkgPCAwKQorCQlnb3RvIGVycjsKKwlzaXplID0geHNpemVfdChzdC5zdF9zaXplKTsKKwlpZiAoc2l6ZSA9PSAwKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIDA7CisJfQorCWJ1ZiA9IHhtYWxsb2Moc2l6ZSsxKTsKKwlpZiAocmVhZF9pbl9mdWxsKGZkLCBidWYsIHNpemUpICE9IHNpemUpCisJeworCQlmcmVlKGJ1Zik7CisJCWdvdG8gZXJyOworCX0KKwljbG9zZShmZCk7CisKKwlpZiAoYnVmX3ApCisJCSpidWZfcCA9IGJ1ZjsKKwlidWZbc2l6ZSsrXSA9ICdcbic7CisJZW50cnkgPSBidWY7CisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlpZiAoYnVmW2ldID09ICdcbicpIHsKKwkJCWlmIChlbnRyeSAhPSBidWYgKyBpICYmIGVudHJ5WzBdICE9ICcjJykgeworCQkJCWJ1ZltpIC0gKGkgJiYgYnVmW2ktMV0gPT0gJ1xyJyldID0gMDsKKwkJCQlhZGRfZXhjbHVkZShlbnRyeSwgYmFzZSwgYmFzZWxlbiwgd2hpY2gpOworCQkJfQorCQkJZW50cnkgPSBidWYgKyBpICsgMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKKworIGVycjoKKwlpZiAoMCA8PSBmZCkKKwkJY2xvc2UoZmQpOworCXJldHVybiAtMTsKK30KKwordm9pZCBhZGRfZXhjbHVkZXNfZnJvbV9maWxlKHN0cnVjdCBkaXJfc3RydWN0ICpkaXIsIGNvbnN0IGNoYXIgKmZuYW1lKQoreworCWlmIChhZGRfZXhjbHVkZXNfZnJvbV9maWxlXzEoZm5hbWUsICIiLCAwLCBOVUxMLAorCQkJCSAgICAgJmRpci0+ZXhjbHVkZV9saXN0W0VYQ19GSUxFXSkgPCAwKQorCQlkaWUoImNhbm5vdCB1c2UgJXMgYXMgYW4gZXhjbHVkZSBmaWxlIiwgZm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBwcmVwX2V4Y2x1ZGUoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpciwgY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4pCit7CisJc3RydWN0IGV4Y2x1ZGVfbGlzdCAqZWw7CisJc3RydWN0IGV4Y2x1ZGVfc3RhY2sgKnN0ayA9IE5VTEw7CisJaW50IGN1cnJlbnQ7CisKKwlpZiAoKCFkaXItPmV4Y2x1ZGVfcGVyX2RpcikgfHwKKwkgICAgKGJhc2VsZW4gKyBzdHJsZW4oZGlyLT5leGNsdWRlX3Blcl9kaXIpID49IFBBVEhfTUFYKSkKKwkJcmV0dXJuOyAvKiB0b28gbG9uZyBhIHBhdGggLS0gaWdub3JlICovCisKKwkvKiBQb3AgdGhlIG9uZXMgdGhhdCBhcmUgbm90IHRoZSBwcmVmaXggb2YgdGhlIHBhdGggYmVpbmcgY2hlY2tlZC4gKi8KKwllbCA9ICZkaXItPmV4Y2x1ZGVfbGlzdFtFWENfRElSU107CisJd2hpbGUgKChzdGsgPSBkaXItPmV4Y2x1ZGVfc3RhY2spICE9IE5VTEwpIHsKKwkJaWYgKHN0ay0+YmFzZWxlbiA8PSBiYXNlbGVuICYmCisJCSAgICAhc3RybmNtcChkaXItPmJhc2VidWYsIGJhc2UsIHN0ay0+YmFzZWxlbikpCisJCQlicmVhazsKKwkJZGlyLT5leGNsdWRlX3N0YWNrID0gc3RrLT5wcmV2OworCQl3aGlsZSAoc3RrLT5leGNsdWRlX2l4IDwgZWwtPm5yKQorCQkJZnJlZShlbC0+ZXhjbHVkZXNbLS1lbC0+bnJdKTsKKwkJZnJlZShzdGstPmZpbGVidWYpOworCQlmcmVlKHN0ayk7CisJfQorCisJLyogUmVhZCBmcm9tIHRoZSBwYXJlbnQgZGlyZWN0b3JpZXMgYW5kIHB1c2ggdGhlbSBkb3duLiAqLworCWN1cnJlbnQgPSBzdGsgPyBzdGstPmJhc2VsZW4gOiAtMTsKKwl3aGlsZSAoY3VycmVudCA8IGJhc2VsZW4pIHsKKwkJc3RydWN0IGV4Y2x1ZGVfc3RhY2sgKnN0ayA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpzdGspKTsKKwkJY29uc3QgY2hhciAqY3A7CisKKwkJaWYgKGN1cnJlbnQgPCAwKSB7CisJCQljcCA9IGJhc2U7CisJCQljdXJyZW50ID0gMDsKKwkJfQorCQllbHNlIHsKKwkJCWNwID0gc3RyY2hyKGJhc2UgKyBjdXJyZW50ICsgMSwgJy8nKTsKKwkJCWlmICghY3ApCisJCQkJZGllKCJvb3BzIGluIHByZXBfZXhjbHVkZSIpOworCQkJY3ArKzsKKwkJfQorCQlzdGstPnByZXYgPSBkaXItPmV4Y2x1ZGVfc3RhY2s7CisJCXN0ay0+YmFzZWxlbiA9IGNwIC0gYmFzZTsKKwkJc3RrLT5leGNsdWRlX2l4ID0gZWwtPm5yOworCQltZW1jcHkoZGlyLT5iYXNlYnVmICsgY3VycmVudCwgYmFzZSArIGN1cnJlbnQsCisJCSAgICAgICBzdGstPmJhc2VsZW4gLSBjdXJyZW50KTsKKwkJc3RyY3B5KGRpci0+YmFzZWJ1ZiArIHN0ay0+YmFzZWxlbiwgZGlyLT5leGNsdWRlX3Blcl9kaXIpOworCQlhZGRfZXhjbHVkZXNfZnJvbV9maWxlXzEoZGlyLT5iYXNlYnVmLAorCQkJCQkgZGlyLT5iYXNlYnVmLCBzdGstPmJhc2VsZW4sCisJCQkJCSAmc3RrLT5maWxlYnVmLCBlbCk7CisJCWRpci0+ZXhjbHVkZV9zdGFjayA9IHN0azsKKwkJY3VycmVudCA9IHN0ay0+YmFzZWxlbjsKKwl9CisJZGlyLT5iYXNlYnVmW2Jhc2VsZW5dID0gJ1wwJzsKK30KKworLyogU2NhbiB0aGUgbGlzdCBhbmQgbGV0IHRoZSBsYXN0IG1hdGNoIGRldGVybWluZXMgdGhlIGZhdGUuCisgKiBSZXR1cm4gMSBmb3IgZXhjbHVkZSwgMCBmb3IgaW5jbHVkZSBhbmQgLTEgZm9yIHVuZGVjaWRlZC4KKyAqLworc3RhdGljIGludCBleGNsdWRlZF8xKGNvbnN0IGNoYXIgKnBhdGhuYW1lLAorCQkgICAgICBpbnQgcGF0aGxlbiwgY29uc3QgY2hhciAqYmFzZW5hbWUsIGludCAqZHR5cGUsCisJCSAgICAgIHN0cnVjdCBleGNsdWRlX2xpc3QgKmVsKQoreworCWludCBpOworCisJaWYgKGVsLT5ucikgeworCQlmb3IgKGkgPSBlbC0+bnIgLSAxOyAwIDw9IGk7IGktLSkgeworCQkJc3RydWN0IGV4Y2x1ZGUgKnggPSBlbC0+ZXhjbHVkZXNbaV07CisJCQljb25zdCBjaGFyICpleGNsdWRlID0geC0+cGF0dGVybjsKKwkJCWludCB0b19leGNsdWRlID0geC0+dG9fZXhjbHVkZTsKKworCQkJaWYgKHgtPmZsYWdzICYgRVhDX0ZMQUdfTVVTVEJFRElSKSB7CisJCQkJaWYgKCpkdHlwZSA9PSBEVF9VTktOT1dOKQorCQkJCQkqZHR5cGUgPSBnZXRfZHR5cGUoTlVMTCwgcGF0aG5hbWUpOworCQkJCWlmICgqZHR5cGUgIT0gRFRfRElSKQorCQkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKHgtPmZsYWdzICYgRVhDX0ZMQUdfTk9ESVIpIHsKKwkJCQkvKiBtYXRjaCBiYXNlbmFtZSAqLworCQkJCWlmICh4LT5mbGFncyAmIEVYQ19GTEFHX05PV0lMRENBUkQpIHsKKwkJCQkJaWYgKCFzdHJjbXAoZXhjbHVkZSwgYmFzZW5hbWUpKQorCQkJCQkJcmV0dXJuIHRvX2V4Y2x1ZGU7CisJCQkJfSBlbHNlIGlmICh4LT5mbGFncyAmIEVYQ19GTEFHX0VORFNXSVRIKSB7CisJCQkJCWlmICh4LT5wYXR0ZXJubGVuIC0gMSA8PSBwYXRobGVuICYmCisJCQkJCSAgICAhc3RyY21wKGV4Y2x1ZGUgKyAxLCBwYXRobmFtZSArIHBhdGhsZW4gLSB4LT5wYXR0ZXJubGVuICsgMSkpCisJCQkJCQlyZXR1cm4gdG9fZXhjbHVkZTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoZm5tYXRjaChleGNsdWRlLCBiYXNlbmFtZSwgMCkgPT0gMCkKKwkJCQkJCXJldHVybiB0b19leGNsdWRlOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCS8qIG1hdGNoIHdpdGggRk5NX1BBVEhOQU1FOgorCQkJCSAqIGV4Y2x1ZGUgaGFzIGJhc2UgKGJhc2VsZW4gbG9uZykgaW1wbGljaXRseQorCQkJCSAqIGluIGZyb250IG9mIGl0LgorCQkJCSAqLworCQkJCWludCBiYXNlbGVuID0geC0+YmFzZWxlbjsKKwkJCQlpZiAoKmV4Y2x1ZGUgPT0gJy8nKQorCQkJCQlleGNsdWRlKys7CisKKwkJCQlpZiAocGF0aGxlbiA8IGJhc2VsZW4gfHwKKwkJCQkgICAgKGJhc2VsZW4gJiYgcGF0aG5hbWVbYmFzZWxlbi0xXSAhPSAnLycpIHx8CisJCQkJICAgIHN0cm5jbXAocGF0aG5hbWUsIHgtPmJhc2UsIGJhc2VsZW4pKQorCQkJCSAgICBjb250aW51ZTsKKworCQkJCWlmICh4LT5mbGFncyAmIEVYQ19GTEFHX05PV0lMRENBUkQpIHsKKwkJCQkJaWYgKCFzdHJjbXAoZXhjbHVkZSwgcGF0aG5hbWUgKyBiYXNlbGVuKSkKKwkJCQkJCXJldHVybiB0b19leGNsdWRlOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChmbm1hdGNoKGV4Y2x1ZGUsIHBhdGhuYW1lK2Jhc2VsZW4sCisJCQkJCQkgICAgRk5NX1BBVEhOQU1FKSA9PSAwKQorCQkJCQkgICAgcmV0dXJuIHRvX2V4Y2x1ZGU7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiAtMTsgLyogdW5kZWNpZGVkICovCit9CisKK2ludCBleGNsdWRlZChzdHJ1Y3QgZGlyX3N0cnVjdCAqZGlyLCBjb25zdCBjaGFyICpwYXRobmFtZSwgaW50ICpkdHlwZV9wKQoreworCWludCBwYXRobGVuID0gc3RybGVuKHBhdGhuYW1lKTsKKwlpbnQgc3Q7CisJY29uc3QgY2hhciAqYmFzZW5hbWUgPSBzdHJyY2hyKHBhdGhuYW1lLCAnLycpOworCWJhc2VuYW1lID0gKGJhc2VuYW1lKSA/IGJhc2VuYW1lKzEgOiBwYXRobmFtZTsKKworCXByZXBfZXhjbHVkZShkaXIsIHBhdGhuYW1lLCBiYXNlbmFtZS1wYXRobmFtZSk7CisJZm9yIChzdCA9IEVYQ19DTURMOyBzdCA8PSBFWENfRklMRTsgc3QrKykgeworCQlzd2l0Y2ggKGV4Y2x1ZGVkXzEocGF0aG5hbWUsIHBhdGhsZW4sIGJhc2VuYW1lLAorCQkJCSAgIGR0eXBlX3AsICZkaXItPmV4Y2x1ZGVfbGlzdFtzdF0pKSB7CisJCWNhc2UgMDoKKwkJCXJldHVybiAwOworCQljYXNlIDE6CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkaXJfZW50cnkgKmRpcl9lbnRyeV9uZXcoY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBsZW4pCit7CisJc3RydWN0IGRpcl9lbnRyeSAqZW50OworCisJZW50ID0geG1hbGxvYyhzaXplb2YoKmVudCkgKyBsZW4gKyAxKTsKKwllbnQtPmxlbiA9IGxlbjsKKwltZW1jcHkoZW50LT5uYW1lLCBwYXRobmFtZSwgbGVuKTsKKwllbnQtPm5hbWVbbGVuXSA9IDA7CisJcmV0dXJuIGVudDsKK30KKworc3RydWN0IGRpcl9lbnRyeSAqZGlyX2FkZF9uYW1lKHN0cnVjdCBkaXJfc3RydWN0ICpkaXIsIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgbGVuKQoreworCWlmIChjYWNoZV9uYW1lX2V4aXN0cyhwYXRobmFtZSwgbGVuKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlBTExPQ19HUk9XKGRpci0+ZW50cmllcywgZGlyLT5ucisxLCBkaXItPmFsbG9jKTsKKwlyZXR1cm4gZGlyLT5lbnRyaWVzW2Rpci0+bnIrK10gPSBkaXJfZW50cnlfbmV3KHBhdGhuYW1lLCBsZW4pOworfQorCitzdHJ1Y3QgZGlyX2VudHJ5ICpkaXJfYWRkX2lnbm9yZWQoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpciwgY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBsZW4pCit7CisJaWYgKGNhY2hlX25hbWVfcG9zKHBhdGhuYW1lLCBsZW4pID49IDApCisJCXJldHVybiBOVUxMOworCisJQUxMT0NfR1JPVyhkaXItPmlnbm9yZWQsIGRpci0+aWdub3JlZF9ucisxLCBkaXItPmlnbm9yZWRfYWxsb2MpOworCXJldHVybiBkaXItPmlnbm9yZWRbZGlyLT5pZ25vcmVkX25yKytdID0gZGlyX2VudHJ5X25ldyhwYXRobmFtZSwgbGVuKTsKK30KKworZW51bSBleGlzdF9zdGF0dXMgeworCWluZGV4X25vbmV4aXN0ZW50ID0gMCwKKwlpbmRleF9kaXJlY3RvcnksCisJaW5kZXhfZ2l0ZGlyLAorfTsKKworLyoKKyAqIFRoZSBpbmRleCBzb3J0cyBhbHBoYWJldGljYWxseSBieSBlbnRyeSBuYW1lLCB3aGljaAorICogbWVhbnMgdGhhdCBhIGdpdGxpbmsgc29ydHMgYXMgJ1wwJyBhdCB0aGUgZW5kLCB3aGlsZQorICogYSBkaXJlY3RvcnkgKHdoaWNoIGlzIGRlZmluZWQgbm90IGFzIGFuIGVudHJ5LCBidXQgYXMKKyAqIHRoZSBmaWxlcyBpdCBjb250YWlucykgd2lsbCBzb3J0IHdpdGggdGhlICcvJyBhdCB0aGUKKyAqIGVuZC4KKyAqLworc3RhdGljIGVudW0gZXhpc3Rfc3RhdHVzIGRpcmVjdG9yeV9leGlzdHNfaW5faW5kZXgoY29uc3QgY2hhciAqZGlybmFtZSwgaW50IGxlbikKK3sKKwlpbnQgcG9zID0gY2FjaGVfbmFtZV9wb3MoZGlybmFtZSwgbGVuKTsKKwlpZiAocG9zIDwgMCkKKwkJcG9zID0gLXBvcy0xOworCXdoaWxlIChwb3MgPCBhY3RpdmVfbnIpIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtwb3MrK107CisJCXVuc2lnbmVkIGNoYXIgZW5kY2hhcjsKKworCQlpZiAoc3RybmNtcChjZS0+bmFtZSwgZGlybmFtZSwgbGVuKSkKKwkJCWJyZWFrOworCQllbmRjaGFyID0gY2UtPm5hbWVbbGVuXTsKKwkJaWYgKGVuZGNoYXIgPiAnLycpCisJCQlicmVhazsKKwkJaWYgKGVuZGNoYXIgPT0gJy8nKQorCQkJcmV0dXJuIGluZGV4X2RpcmVjdG9yeTsKKwkJaWYgKCFlbmRjaGFyICYmIFNfSVNHSVRMSU5LKGNlLT5jZV9tb2RlKSkKKwkJCXJldHVybiBpbmRleF9naXRkaXI7CisJfQorCXJldHVybiBpbmRleF9ub25leGlzdGVudDsKK30KKworLyoKKyAqIFdoZW4gd2UgZmluZCBhIGRpcmVjdG9yeSB3aGVuIHRyYXZlcnNpbmcgdGhlIGZpbGVzeXN0ZW0sIHdlCisgKiBoYXZlIHRocmVlIGRpc3RpbmN0IGNhc2VzOgorICoKKyAqICAtIGlnbm9yZSBpdAorICogIC0gc2VlIGl0IGFzIGEgZGlyZWN0b3J5CisgKiAgLSByZWN1cnNlIGludG8gaXQKKyAqCisgKiBhbmQgd2hpY2ggb25lIHdlIGNob29zZSBkZXBlbmRzIG9uIGEgY29tYmluYXRpb24gb2YgZXhpc3RpbmcKKyAqIGdpdCBpbmRleCBjb250ZW50cyBhbmQgdGhlIGZsYWdzIHBhc3NlZCBpbnRvIHRoZSBkaXJlY3RvcnkKKyAqIHRyYXZlcnNhbCByb3V0aW5lLgorICoKKyAqIENhc2UgMTogSWYgd2UgKmFscmVhZHkqIGhhdmUgZW50cmllcyBpbiB0aGUgaW5kZXggdW5kZXIgdGhhdAorICogZGlyZWN0b3J5IG5hbWUsIHdlIGFsd2F5cyByZWN1cnNlIGludG8gdGhlIGRpcmVjdG9yeSB0byBzZWUKKyAqIGFsbCB0aGUgZmlsZXMuCisgKgorICogQ2FzZSAyOiBJZiB3ZSAqYWxyZWFkeSogaGF2ZSB0aGF0IGRpcmVjdG9yeSBuYW1lIGFzIGEgZ2l0bGluaywKKyAqIHdlIGFsd2F5cyBjb250aW51ZSB0byBzZWUgaXQgYXMgYSBnaXRsaW5rLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIKKyAqIHRoZXJlIGlzIGFuIGFjdHVhbCBnaXQgZGlyZWN0b3J5IHRoZXJlIG9yIG5vdCAoaXQgbWlnaHQgbm90CisgKiBiZSBjaGVja2VkIG91dCBhcyBhIHN1YnByb2plY3QhKQorICoKKyAqIENhc2UgMzogaWYgd2UgZGlkbid0IGhhdmUgaXQgaW4gdGhlIGluZGV4IHByZXZpb3VzbHksIHdlCisgKiBoYXZlIGEgZmV3IHN1Yi1jYXNlczoKKyAqCisgKiAgKGEpIGlmICJzaG93X290aGVyX2RpcmVjdG9yaWVzIiBpcyB0cnVlLCB3ZSBzaG93IGl0IGFzCisgKiAgICAgIGp1c3QgYSBkaXJlY3RvcnksIHVubGVzcyAiaGlkZV9lbXB0eV9kaXJlY3RvcmllcyIgaXMKKyAqICAgICAgYWxzbyB0cnVlIGFuZCB0aGUgZGlyZWN0b3J5IGlzIGVtcHR5LCBpbiB3aGljaCBjYXNlCisgKiAgICAgIHdlIGp1c3QgaWdub3JlIGl0IGVudGlyZWx5LgorICogIChiKSBpZiBpdCBsb29rcyBsaWtlIGEgZ2l0IGRpcmVjdG9yeSwgYW5kIHdlIGRvbid0IGhhdmUKKyAqICAgICAgJ25vX2dpdGxpbmtzJyBzZXQgd2UgdHJlYXQgaXQgYXMgYSBnaXRsaW5rLCBhbmQgc2hvdyBpdAorICogICAgICBhcyBhIGRpcmVjdG9yeS4KKyAqICAoYykgb3RoZXJ3aXNlLCB3ZSByZWN1cnNlIGludG8gaXQuCisgKi8KK2VudW0gZGlyZWN0b3J5X3RyZWF0bWVudCB7CisJc2hvd19kaXJlY3RvcnksCisJaWdub3JlX2RpcmVjdG9yeSwKKwlyZWN1cnNlX2ludG9fZGlyZWN0b3J5LAorfTsKKworc3RhdGljIGVudW0gZGlyZWN0b3J5X3RyZWF0bWVudCB0cmVhdF9kaXJlY3Rvcnkoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpciwKKwljb25zdCBjaGFyICpkaXJuYW1lLCBpbnQgbGVuLAorCWNvbnN0IHN0cnVjdCBwYXRoX3NpbXBsaWZ5ICpzaW1wbGlmeSkKK3sKKwkvKiBUaGUgImxlbi0xIiBpcyB0byBzdHJpcCB0aGUgZmluYWwgJy8nICovCisJc3dpdGNoIChkaXJlY3RvcnlfZXhpc3RzX2luX2luZGV4KGRpcm5hbWUsIGxlbi0xKSkgeworCWNhc2UgaW5kZXhfZGlyZWN0b3J5OgorCQlyZXR1cm4gcmVjdXJzZV9pbnRvX2RpcmVjdG9yeTsKKworCWNhc2UgaW5kZXhfZ2l0ZGlyOgorCQlpZiAoZGlyLT5zaG93X290aGVyX2RpcmVjdG9yaWVzKQorCQkJcmV0dXJuIGlnbm9yZV9kaXJlY3Rvcnk7CisJCXJldHVybiBzaG93X2RpcmVjdG9yeTsKKworCWNhc2UgaW5kZXhfbm9uZXhpc3RlbnQ6CisJCWlmIChkaXItPnNob3dfb3RoZXJfZGlyZWN0b3JpZXMpCisJCQlicmVhazsKKwkJaWYgKCFkaXItPm5vX2dpdGxpbmtzKSB7CisJCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQkJaWYgKHJlc29sdmVfZ2l0bGlua19yZWYoZGlybmFtZSwgIkhFQUQiLCBzaGExKSA9PSAwKQorCQkJCXJldHVybiBzaG93X2RpcmVjdG9yeTsKKwkJfQorCQlyZXR1cm4gcmVjdXJzZV9pbnRvX2RpcmVjdG9yeTsKKwl9CisKKwkvKiBUaGlzIGlzIHRoZSAic2hvd19vdGhlcl9kaXJlY3RvcmllcyIgY2FzZSAqLworCWlmICghZGlyLT5oaWRlX2VtcHR5X2RpcmVjdG9yaWVzKQorCQlyZXR1cm4gc2hvd19kaXJlY3Rvcnk7CisJaWYgKCFyZWFkX2RpcmVjdG9yeV9yZWN1cnNpdmUoZGlyLCBkaXJuYW1lLCBkaXJuYW1lLCBsZW4sIDEsIHNpbXBsaWZ5KSkKKwkJcmV0dXJuIGlnbm9yZV9kaXJlY3Rvcnk7CisJcmV0dXJuIHNob3dfZGlyZWN0b3J5OworfQorCisvKgorICogVGhpcyBpcyBhbiBpbmV4YWN0IGVhcmx5IHBydW5pbmcgb2YgYW55IHJlY3Vyc2l2ZSBkaXJlY3RvcnkKKyAqIHJlYWRpbmcgLSBpZiB0aGUgcGF0aCBjYW5ub3QgcG9zc2libHkgYmUgaW4gdGhlIHBhdGhzcGVjLAorICogcmV0dXJuIHRydWUsIGFuZCB3ZSdsbCBza2lwIGl0IGVhcmx5LgorICovCitzdGF0aWMgaW50IHNpbXBsaWZ5X2F3YXkoY29uc3QgY2hhciAqcGF0aCwgaW50IHBhdGhsZW4sIGNvbnN0IHN0cnVjdCBwYXRoX3NpbXBsaWZ5ICpzaW1wbGlmeSkKK3sKKwlpZiAoc2ltcGxpZnkpIHsKKwkJZm9yICg7OykgeworCQkJY29uc3QgY2hhciAqbWF0Y2ggPSBzaW1wbGlmeS0+cGF0aDsKKwkJCWludCBsZW4gPSBzaW1wbGlmeS0+bGVuOworCisJCQlpZiAoIW1hdGNoKQorCQkJCWJyZWFrOworCQkJaWYgKGxlbiA+IHBhdGhsZW4pCisJCQkJbGVuID0gcGF0aGxlbjsKKwkJCWlmICghbWVtY21wKHBhdGgsIG1hdGNoLCBsZW4pKQorCQkJCXJldHVybiAwOworCQkJc2ltcGxpZnkrKzsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5fcGF0aHNwZWMoY29uc3QgY2hhciAqcGF0aCwgaW50IGxlbiwgY29uc3Qgc3RydWN0IHBhdGhfc2ltcGxpZnkgKnNpbXBsaWZ5KQoreworCWlmIChzaW1wbGlmeSkgeworCQlmb3IgKDsgc2ltcGxpZnktPnBhdGg7IHNpbXBsaWZ5KyspIHsKKwkJCWlmIChsZW4gPT0gc2ltcGxpZnktPmxlbgorCQkJICAgICYmICFtZW1jbXAocGF0aCwgc2ltcGxpZnktPnBhdGgsIGxlbikpCisJCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2R0eXBlKHN0cnVjdCBkaXJlbnQgKmRlLCBjb25zdCBjaGFyICpwYXRoKQoreworCWludCBkdHlwZSA9IGRlID8gRFRZUEUoZGUpIDogRFRfVU5LTk9XTjsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChkdHlwZSAhPSBEVF9VTktOT1dOKQorCQlyZXR1cm4gZHR5cGU7CisJaWYgKGxzdGF0KHBhdGgsICZzdCkpCisJCXJldHVybiBkdHlwZTsKKwlpZiAoU19JU1JFRyhzdC5zdF9tb2RlKSkKKwkJcmV0dXJuIERUX1JFRzsKKwlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkKKwkJcmV0dXJuIERUX0RJUjsKKwlpZiAoU19JU0xOSyhzdC5zdF9tb2RlKSkKKwkJcmV0dXJuIERUX0xOSzsKKwlyZXR1cm4gZHR5cGU7Cit9CisKKy8qCisgKiBSZWFkIGEgZGlyZWN0b3J5IHRyZWUuIFdlIGN1cnJlbnRseSBpZ25vcmUgYW55dGhpbmcgYnV0CisgKiBkaXJlY3RvcmllcywgcmVndWxhciBmaWxlcyBhbmQgc3ltbGlua3MuIFRoYXQncyBiZWNhdXNlIGdpdAorICogZG9lc24ndCBoYW5kbGUgdGhlbSBhdCBhbGwgeWV0LiBNYXliZSB0aGF0IHdpbGwgY2hhbmdlIHNvbWUKKyAqIGRheS4KKyAqCisgKiBBbHNvLCB3ZSBpZ25vcmUgdGhlIG5hbWUgIi5naXQiIChldmVuIGlmIGl0IGlzIG5vdCBhIGRpcmVjdG9yeSkuCisgKiBUaGF0IGxpa2VseSB3aWxsIG5vdCBjaGFuZ2UuCisgKi8KK3N0YXRpYyBpbnQgcmVhZF9kaXJlY3RvcnlfcmVjdXJzaXZlKHN0cnVjdCBkaXJfc3RydWN0ICpkaXIsIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLCBpbnQgY2hlY2tfb25seSwgY29uc3Qgc3RydWN0IHBhdGhfc2ltcGxpZnkgKnNpbXBsaWZ5KQoreworCURJUiAqZmRpciA9IG9wZW5kaXIocGF0aCk7CisJaW50IGNvbnRlbnRzID0gMDsKKworCWlmIChmZGlyKSB7CisJCXN0cnVjdCBkaXJlbnQgKmRlOworCQljaGFyIGZ1bGxuYW1lW1BBVEhfTUFYICsgMV07CisJCW1lbWNweShmdWxsbmFtZSwgYmFzZSwgYmFzZWxlbik7CisKKwkJd2hpbGUgKChkZSA9IHJlYWRkaXIoZmRpcikpICE9IE5VTEwpIHsKKwkJCWludCBsZW4sIGR0eXBlOworCQkJaW50IGV4Y2x1ZGU7CisKKwkJCWlmICgoZGUtPmRfbmFtZVswXSA9PSAnLicpICYmCisJCQkgICAgKGRlLT5kX25hbWVbMV0gPT0gMCB8fAorCQkJICAgICAhc3RyY21wKGRlLT5kX25hbWUgKyAxLCAiLiIpIHx8CisJCQkgICAgICFzdHJjbXAoZGUtPmRfbmFtZSArIDEsICJnaXQiKSkpCisJCQkJY29udGludWU7CisJCQlsZW4gPSBzdHJsZW4oZGUtPmRfbmFtZSk7CisJCQkvKiBJZ25vcmUgb3Zlcmx5IGxvbmcgcGF0aG5hbWVzISAqLworCQkJaWYgKGxlbiArIGJhc2VsZW4gKyA4ID4gc2l6ZW9mKGZ1bGxuYW1lKSkKKwkJCQljb250aW51ZTsKKwkJCW1lbWNweShmdWxsbmFtZSArIGJhc2VsZW4sIGRlLT5kX25hbWUsIGxlbisxKTsKKwkJCWlmIChzaW1wbGlmeV9hd2F5KGZ1bGxuYW1lLCBiYXNlbGVuICsgbGVuLCBzaW1wbGlmeSkpCisJCQkJY29udGludWU7CisKKwkJCWR0eXBlID0gRFRZUEUoZGUpOworCQkJZXhjbHVkZSA9IGV4Y2x1ZGVkKGRpciwgZnVsbG5hbWUsICZkdHlwZSk7CisJCQlpZiAoZXhjbHVkZSAmJiBkaXItPmNvbGxlY3RfaWdub3JlZAorCQkJICAgICYmIGluX3BhdGhzcGVjKGZ1bGxuYW1lLCBiYXNlbGVuICsgbGVuLCBzaW1wbGlmeSkpCisJCQkJZGlyX2FkZF9pZ25vcmVkKGRpciwgZnVsbG5hbWUsIGJhc2VsZW4gKyBsZW4pOworCisJCQkvKgorCQkJICogRXhjbHVkZWQ/IElmIHdlIGRvbid0IGV4cGxpY2l0bHkgd2FudCB0byBzaG93CisJCQkgKiBpZ25vcmVkIGZpbGVzLCBpZ25vcmUgaXQKKwkJCSAqLworCQkJaWYgKGV4Y2x1ZGUgJiYgIWRpci0+c2hvd19pZ25vcmVkKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoZHR5cGUgPT0gRFRfVU5LTk9XTikKKwkJCQlkdHlwZSA9IGdldF9kdHlwZShkZSwgZnVsbG5hbWUpOworCisJCQkvKgorCQkJICogRG8gd2Ugd2FudCB0byBzZWUganVzdCB0aGUgaWdub3JlZCBmaWxlcz8KKwkJCSAqIFdlIHN0aWxsIG5lZWQgdG8gcmVjdXJzZSBpbnRvIGRpcmVjdG9yaWVzLAorCQkJICogZXZlbiBpZiB3ZSBkb24ndCBpZ25vcmUgdGhlbSwgc2luY2UgdGhlCisJCQkgKiBkaXJlY3RvcnkgbWF5IGNvbnRhaW4gZmlsZXMgdGhhdCB3ZSBkby4uCisJCQkgKi8KKwkJCWlmICghZXhjbHVkZSAmJiBkaXItPnNob3dfaWdub3JlZCkgeworCQkJCWlmIChkdHlwZSAhPSBEVF9ESVIpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlzd2l0Y2ggKGR0eXBlKSB7CisJCQlkZWZhdWx0OgorCQkJCWNvbnRpbnVlOworCQkJY2FzZSBEVF9ESVI6CisJCQkJbWVtY3B5KGZ1bGxuYW1lICsgYmFzZWxlbiArIGxlbiwgIi8iLCAyKTsKKwkJCQlsZW4rKzsKKwkJCQlzd2l0Y2ggKHRyZWF0X2RpcmVjdG9yeShkaXIsIGZ1bGxuYW1lLCBiYXNlbGVuICsgbGVuLCBzaW1wbGlmeSkpIHsKKwkJCQljYXNlIHNob3dfZGlyZWN0b3J5OgorCQkJCQlpZiAoZXhjbHVkZSAhPSBkaXItPnNob3dfaWdub3JlZCkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlicmVhazsKKwkJCQljYXNlIHJlY3Vyc2VfaW50b19kaXJlY3Rvcnk6CisJCQkJCWNvbnRlbnRzICs9IHJlYWRfZGlyZWN0b3J5X3JlY3Vyc2l2ZShkaXIsCisJCQkJCQlmdWxsbmFtZSwgZnVsbG5hbWUsIGJhc2VsZW4gKyBsZW4sIDAsIHNpbXBsaWZ5KTsKKwkJCQkJY29udGludWU7CisJCQkJY2FzZSBpZ25vcmVfZGlyZWN0b3J5OgorCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIERUX1JFRzoKKwkJCWNhc2UgRFRfTE5LOgorCQkJCWJyZWFrOworCQkJfQorCQkJY29udGVudHMrKzsKKwkJCWlmIChjaGVja19vbmx5KQorCQkJCWdvdG8gZXhpdF9lYXJseTsKKwkJCWVsc2UKKwkJCQlkaXJfYWRkX25hbWUoZGlyLCBmdWxsbmFtZSwgYmFzZWxlbiArIGxlbik7CisJCX0KK2V4aXRfZWFybHk6CisJCWNsb3NlZGlyKGZkaXIpOworCX0KKworCXJldHVybiBjb250ZW50czsKK30KKworc3RhdGljIGludCBjbXBfbmFtZShjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCit7CisJY29uc3Qgc3RydWN0IGRpcl9lbnRyeSAqZTEgPSAqKGNvbnN0IHN0cnVjdCBkaXJfZW50cnkgKiopcDE7CisJY29uc3Qgc3RydWN0IGRpcl9lbnRyeSAqZTIgPSAqKGNvbnN0IHN0cnVjdCBkaXJfZW50cnkgKiopcDI7CisKKwlyZXR1cm4gY2FjaGVfbmFtZV9jb21wYXJlKGUxLT5uYW1lLCBlMS0+bGVuLAorCQkJCSAgZTItPm5hbWUsIGUyLT5sZW4pOworfQorCisvKgorICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlICJzaW1wbGUiIHBhcnQgb2YgYSBwYXRoIG1hdGNoIGxpbWl0ZXIuCisgKi8KK3N0YXRpYyBpbnQgc2ltcGxlX2xlbmd0aChjb25zdCBjaGFyICptYXRjaCkKK3sKKwljb25zdCBjaGFyIHNwZWNpYWxbMjU2XSA9IHsKKwkJWzBdID0gMSwgWyc/J10gPSAxLAorCQlbJ1xcJ10gPSAxLCBbJyonXSA9IDEsCisJCVsnWyddID0gMQorCX07CisJaW50IGxlbiA9IC0xOworCisJZm9yICg7OykgeworCQl1bnNpZ25lZCBjaGFyIGMgPSAqbWF0Y2grKzsKKwkJbGVuKys7CisJCWlmIChzcGVjaWFsW2NdKQorCQkJcmV0dXJuIGxlbjsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGF0aF9zaW1wbGlmeSAqY3JlYXRlX3NpbXBsaWZ5KGNvbnN0IGNoYXIgKipwYXRoc3BlYykKK3sKKwlpbnQgbnIsIGFsbG9jID0gMDsKKwlzdHJ1Y3QgcGF0aF9zaW1wbGlmeSAqc2ltcGxpZnkgPSBOVUxMOworCisJaWYgKCFwYXRoc3BlYykKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKG5yID0gMCA7IDsgbnIrKykgeworCQljb25zdCBjaGFyICptYXRjaDsKKwkJaWYgKG5yID49IGFsbG9jKSB7CisJCQlhbGxvYyA9IGFsbG9jX25yKGFsbG9jKTsKKwkJCXNpbXBsaWZ5ID0geHJlYWxsb2Moc2ltcGxpZnksIGFsbG9jICogc2l6ZW9mKCpzaW1wbGlmeSkpOworCQl9CisJCW1hdGNoID0gKnBhdGhzcGVjKys7CisJCWlmICghbWF0Y2gpCisJCQlicmVhazsKKwkJc2ltcGxpZnlbbnJdLnBhdGggPSBtYXRjaDsKKwkJc2ltcGxpZnlbbnJdLmxlbiA9IHNpbXBsZV9sZW5ndGgobWF0Y2gpOworCX0KKwlzaW1wbGlmeVtucl0ucGF0aCA9IE5VTEw7CisJc2ltcGxpZnlbbnJdLmxlbiA9IDA7CisJcmV0dXJuIHNpbXBsaWZ5OworfQorCitzdGF0aWMgdm9pZCBmcmVlX3NpbXBsaWZ5KHN0cnVjdCBwYXRoX3NpbXBsaWZ5ICpzaW1wbGlmeSkKK3sKKwlmcmVlKHNpbXBsaWZ5KTsKK30KKworaW50IHJlYWRfZGlyZWN0b3J5KHN0cnVjdCBkaXJfc3RydWN0ICpkaXIsIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLCBjb25zdCBjaGFyICoqcGF0aHNwZWMpCit7CisJc3RydWN0IHBhdGhfc2ltcGxpZnkgKnNpbXBsaWZ5ID0gY3JlYXRlX3NpbXBsaWZ5KHBhdGhzcGVjKTsKKworCXJlYWRfZGlyZWN0b3J5X3JlY3Vyc2l2ZShkaXIsIHBhdGgsIGJhc2UsIGJhc2VsZW4sIDAsIHNpbXBsaWZ5KTsKKwlmcmVlX3NpbXBsaWZ5KHNpbXBsaWZ5KTsKKwlxc29ydChkaXItPmVudHJpZXMsIGRpci0+bnIsIHNpemVvZihzdHJ1Y3QgZGlyX2VudHJ5ICopLCBjbXBfbmFtZSk7CisJcXNvcnQoZGlyLT5pZ25vcmVkLCBkaXItPmlnbm9yZWRfbnIsIHNpemVvZihzdHJ1Y3QgZGlyX2VudHJ5ICopLCBjbXBfbmFtZSk7CisJcmV0dXJuIGRpci0+bnI7Cit9CisKK2ludCBmaWxlX2V4aXN0cyhjb25zdCBjaGFyICpmKQoreworCXN0cnVjdCBzdGF0IHNiOworCXJldHVybiBsc3RhdChmLCAmc2IpID09IDA7Cit9CisKKy8qCisgKiBnZXRfcmVsYXRpdmVfY3dkKCkgZ2V0cyB0aGUgcHJlZml4IG9mIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5CisgKiByZWxhdGl2ZSB0byAnZGlyJy4gIElmIHdlIGFyZSBub3QgaW5zaWRlICdkaXInLCBpdCByZXR1cm5zIE5VTEwuCisgKgorICogQXMgYSBjb252ZW5pZW5jZSwgaXQgYWxzbyByZXR1cm5zIE5VTEwgaWYgJ2RpcicgaXMgYWxyZWFkeSBOVUxMLiAgVGhlCisgKiByZWFzb24gZm9yIHRoaXMgYmVoYXZpb3VyIGlzIHRoYXQgaXQgaXMgbmF0dXJhbCBmb3IgZnVuY3Rpb25zIHJldHVybmluZworICogZGlyZWN0b3J5IG5hbWVzIHRvIHJldHVybiBOVUxMIHRvIHNheSAidGhpcyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QiCisgKiBvciAidGhpcyBkaXJlY3RvcnkgaXMgaW52YWxpZCIuICBUaGVzZSBjYXNlcyBhcmUgdXN1YWxseSBoYW5kbGVkIHRoZQorICogc2FtZSBhcyBpZiB0aGUgY3dkIGlzIG5vdCBpbnNpZGUgJ2RpcicgYXQgYWxsLCBzbyBnZXRfcmVsYXRpdmVfY3dkKCkKKyAqIHJldHVybnMgTlVMTCBmb3IgYm90aCBvZiB0aGVtLgorICoKKyAqIE1vc3Qgbm90YWJseSwgZ2V0X3JlbGF0aXZlX2N3ZChidWZmZXIsIHNpemUsIGdldF9naXRfd29ya190cmVlKCkpCisgKiB1bmlmaWVzIHRoZSBoYW5kbGluZyBvZiAib3V0c2lkZSB3b3JrIHRyZWUiIHdpdGggIm5vIHdvcmsgdHJlZSBhdCBhbGwiLgorICovCitjaGFyICpnZXRfcmVsYXRpdmVfY3dkKGNoYXIgKmJ1ZmZlciwgaW50IHNpemUsIGNvbnN0IGNoYXIgKmRpcikKK3sKKwljaGFyICpjd2QgPSBidWZmZXI7CisKKwlpZiAoIWRpcikKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCFnZXRjd2QoYnVmZmVyLCBzaXplKSkKKwkJZGllKCJjYW4ndCBmaW5kIHRoZSBjdXJyZW50IGRpcmVjdG9yeTogJXMiLCBzdHJlcnJvcihlcnJubykpOworCisJaWYgKCFpc19hYnNvbHV0ZV9wYXRoKGRpcikpCisJCWRpciA9IG1ha2VfYWJzb2x1dGVfcGF0aChkaXIpOworCisJd2hpbGUgKCpkaXIgJiYgKmRpciA9PSAqY3dkKSB7CisJCWRpcisrOworCQljd2QrKzsKKwl9CisJaWYgKCpkaXIpCisJCXJldHVybiBOVUxMOworCWlmICgqY3dkID09ICcvJykKKwkJcmV0dXJuIGN3ZCArIDE7CisJcmV0dXJuIGN3ZDsKK30KKworaW50IGlzX2luc2lkZV9kaXIoY29uc3QgY2hhciAqZGlyKQoreworCWNoYXIgYnVmZmVyW1BBVEhfTUFYXTsKKwlyZXR1cm4gZ2V0X3JlbGF0aXZlX2N3ZChidWZmZXIsIHNpemVvZihidWZmZXIpLCBkaXIpICE9IE5VTEw7Cit9CisKK2ludCByZW1vdmVfZGlyX3JlY3Vyc2l2ZWx5KHN0cnVjdCBzdHJidWYgKnBhdGgsIGludCBvbmx5X2VtcHR5KQoreworCURJUiAqZGlyID0gb3BlbmRpcihwYXRoLT5idWYpOworCXN0cnVjdCBkaXJlbnQgKmU7CisJaW50IHJldCA9IDAsIG9yaWdpbmFsX2xlbiA9IHBhdGgtPmxlbiwgbGVuOworCisJaWYgKCFkaXIpCisJCXJldHVybiAtMTsKKwlpZiAocGF0aC0+YnVmW29yaWdpbmFsX2xlbiAtIDFdICE9ICcvJykKKwkJc3RyYnVmX2FkZGNoKHBhdGgsICcvJyk7CisKKwlsZW4gPSBwYXRoLT5sZW47CisJd2hpbGUgKChlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCXN0cnVjdCBzdGF0IHN0OworCQlpZiAoKGUtPmRfbmFtZVswXSA9PSAnLicpICYmCisJCSAgICAoKGUtPmRfbmFtZVsxXSA9PSAwKSB8fAorCQkgICAgICgoZS0+ZF9uYW1lWzFdID09ICcuJykgJiYgZS0+ZF9uYW1lWzJdID09IDApKSkKKwkJCWNvbnRpbnVlOyAvKiAiLiIgYW5kICIuLiIgKi8KKworCQlzdHJidWZfc2V0bGVuKHBhdGgsIGxlbik7CisJCXN0cmJ1Zl9hZGRzdHIocGF0aCwgZS0+ZF9uYW1lKTsKKwkJaWYgKGxzdGF0KHBhdGgtPmJ1ZiwgJnN0KSkKKwkJCTsgLyogZmFsbCB0aHJ1ICovCisJCWVsc2UgaWYgKFNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKwkJCWlmICghcmVtb3ZlX2Rpcl9yZWN1cnNpdmVseShwYXRoLCBvbmx5X2VtcHR5KSkKKwkJCQljb250aW51ZTsgLyogaGFwcHkgKi8KKwkJfSBlbHNlIGlmICghb25seV9lbXB0eSAmJiAhdW5saW5rKHBhdGgtPmJ1ZikpCisJCQljb250aW51ZTsgLyogaGFwcHksIHRvbyAqLworCisJCS8qIHBhdGggdG9vIGxvbmcsIHN0YXQgZmFpbHMsIG9yIG5vbi1kaXJlY3Rvcnkgc3RpbGwgZXhpc3RzICovCisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisJY2xvc2VkaXIoZGlyKTsKKworCXN0cmJ1Zl9zZXRsZW4ocGF0aCwgb3JpZ2luYWxfbGVuKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcm1kaXIocGF0aC0+YnVmKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHNldHVwX3N0YW5kYXJkX2V4Y2x1ZGVzKHN0cnVjdCBkaXJfc3RydWN0ICpkaXIpCit7CisJY29uc3QgY2hhciAqcGF0aDsKKworCWRpci0+ZXhjbHVkZV9wZXJfZGlyID0gIi5naXRpZ25vcmUiOworCXBhdGggPSBnaXRfcGF0aCgiaW5mby9leGNsdWRlIik7CisJaWYgKCFhY2Nlc3MocGF0aCwgUl9PSykpCisJCWFkZF9leGNsdWRlc19mcm9tX2ZpbGUoZGlyLCBwYXRoKTsKKwlpZiAoZXhjbHVkZXNfZmlsZSAmJiAhYWNjZXNzKGV4Y2x1ZGVzX2ZpbGUsIFJfT0spKQorCQlhZGRfZXhjbHVkZXNfZnJvbV9maWxlKGRpciwgZXhjbHVkZXNfZmlsZSk7Cit9CmRpZmYgLS1naXQgYS9kaXIuaCBiL2Rpci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZjE1ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9kaXIuaApAQCAtMCwwICsxLDg0IEBACisjaWZuZGVmIERJUl9ICisjZGVmaW5lIERJUl9ICisKK3N0cnVjdCBkaXJfZW50cnkgeworCXVuc2lnbmVkIGludCBsZW47CisJY2hhciBuYW1lW0ZMRVhfQVJSQVldOyAvKiBtb3JlICovCit9OworCisjZGVmaW5lIEVYQ19GTEFHX05PRElSIDEKKyNkZWZpbmUgRVhDX0ZMQUdfTk9XSUxEQ0FSRCAyCisjZGVmaW5lIEVYQ19GTEFHX0VORFNXSVRIIDQKKyNkZWZpbmUgRVhDX0ZMQUdfTVVTVEJFRElSIDgKKworc3RydWN0IGV4Y2x1ZGVfbGlzdCB7CisJaW50IG5yOworCWludCBhbGxvYzsKKwlzdHJ1Y3QgZXhjbHVkZSB7CisJCWNvbnN0IGNoYXIgKnBhdHRlcm47CisJCWludCBwYXR0ZXJubGVuOworCQljb25zdCBjaGFyICpiYXNlOworCQlpbnQgYmFzZWxlbjsKKwkJaW50IHRvX2V4Y2x1ZGU7CisJCWludCBmbGFnczsKKwl9ICoqZXhjbHVkZXM7Cit9OworCitzdHJ1Y3QgZXhjbHVkZV9zdGFjayB7CisJc3RydWN0IGV4Y2x1ZGVfc3RhY2sgKnByZXY7CisJY2hhciAqZmlsZWJ1ZjsKKwlpbnQgYmFzZWxlbjsKKwlpbnQgZXhjbHVkZV9peDsKK307CisKK3N0cnVjdCBkaXJfc3RydWN0IHsKKwlpbnQgbnIsIGFsbG9jOworCWludCBpZ25vcmVkX25yLCBpZ25vcmVkX2FsbG9jOworCXVuc2lnbmVkIGludCBzaG93X2lnbm9yZWQ6MSwKKwkJICAgICBzaG93X290aGVyX2RpcmVjdG9yaWVzOjEsCisJCSAgICAgaGlkZV9lbXB0eV9kaXJlY3RvcmllczoxLAorCQkgICAgIG5vX2dpdGxpbmtzOjEsCisJCSAgICAgY29sbGVjdF9pZ25vcmVkOjE7CisJc3RydWN0IGRpcl9lbnRyeSAqKmVudHJpZXM7CisJc3RydWN0IGRpcl9lbnRyeSAqKmlnbm9yZWQ7CisKKwkvKiBFeGNsdWRlIGluZm8gKi8KKwljb25zdCBjaGFyICpleGNsdWRlX3Blcl9kaXI7CisJc3RydWN0IGV4Y2x1ZGVfbGlzdCBleGNsdWRlX2xpc3RbM107CisJLyoKKwkgKiBXZSBtYWludGFpbiB0aHJlZSBleGNsdWRlIHBhdHRlcm4gbGlzdHM6CisJICogRVhDX0NNREwgbGlzdHMgcGF0dGVybnMgZXhwbGljaXRseSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLgorCSAqIEVYQ19ESVJTIGxpc3RzIHBhdHRlcm5zIG9idGFpbmVkIGZyb20gcGVyLWRpcmVjdG9yeSBpZ25vcmUgZmlsZXMuCisJICogRVhDX0ZJTEUgbGlzdHMgcGF0dGVybnMgZnJvbSBmYWxsYmFjayBpZ25vcmUgZmlsZXMuCisJICovCisjZGVmaW5lIEVYQ19DTURMIDAKKyNkZWZpbmUgRVhDX0RJUlMgMQorI2RlZmluZSBFWENfRklMRSAyCisKKwlzdHJ1Y3QgZXhjbHVkZV9zdGFjayAqZXhjbHVkZV9zdGFjazsKKwljaGFyIGJhc2VidWZbUEFUSF9NQVhdOworfTsKKworZXh0ZXJuIGludCBjb21tb25fcHJlZml4KGNvbnN0IGNoYXIgKipwYXRoc3BlYyk7CisKKyNkZWZpbmUgTUFUQ0hFRF9SRUNVUlNJVkVMWSAxCisjZGVmaW5lIE1BVENIRURfRk5NQVRDSCAyCisjZGVmaW5lIE1BVENIRURfRVhBQ1RMWSAzCitleHRlcm4gaW50IG1hdGNoX3BhdGhzcGVjKGNvbnN0IGNoYXIgKipwYXRoc3BlYywgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGludCBwcmVmaXgsIGNoYXIgKnNlZW4pOworCitleHRlcm4gaW50IHJlYWRfZGlyZWN0b3J5KHN0cnVjdCBkaXJfc3RydWN0ICosIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLCBjb25zdCBjaGFyICoqcGF0aHNwZWMpOworCitleHRlcm4gaW50IGV4Y2x1ZGVkKHN0cnVjdCBkaXJfc3RydWN0ICosIGNvbnN0IGNoYXIgKiwgaW50ICopOworZXh0ZXJuIHZvaWQgYWRkX2V4Y2x1ZGVzX2Zyb21fZmlsZShzdHJ1Y3QgZGlyX3N0cnVjdCAqLCBjb25zdCBjaGFyICpmbmFtZSk7CitleHRlcm4gdm9pZCBhZGRfZXhjbHVkZShjb25zdCBjaGFyICpzdHJpbmcsIGNvbnN0IGNoYXIgKmJhc2UsCisJCQlpbnQgYmFzZWxlbiwgc3RydWN0IGV4Y2x1ZGVfbGlzdCAqd2hpY2gpOworZXh0ZXJuIGludCBmaWxlX2V4aXN0cyhjb25zdCBjaGFyICopOworZXh0ZXJuIHN0cnVjdCBkaXJfZW50cnkgKmRpcl9hZGRfbmFtZShzdHJ1Y3QgZGlyX3N0cnVjdCAqZGlyLCBjb25zdCBjaGFyICpwYXRobmFtZSwgaW50IGxlbik7CisKK2V4dGVybiBjaGFyICpnZXRfcmVsYXRpdmVfY3dkKGNoYXIgKmJ1ZmZlciwgaW50IHNpemUsIGNvbnN0IGNoYXIgKmRpcik7CitleHRlcm4gaW50IGlzX2luc2lkZV9kaXIoY29uc3QgY2hhciAqZGlyKTsKKworZXh0ZXJuIHZvaWQgc2V0dXBfc3RhbmRhcmRfZXhjbHVkZXMoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpcik7CitleHRlcm4gaW50IHJlbW92ZV9kaXJfcmVjdXJzaXZlbHkoc3RydWN0IHN0cmJ1ZiAqcGF0aCwgaW50IG9ubHlfZW1wdHkpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2R1bXAtY2FjaGUtdHJlZS5jIGIvZHVtcC1jYWNoZS10cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3M2YxZQotLS0gL2Rldi9udWxsCisrKyBiL2R1bXAtY2FjaGUtdHJlZS5jCkBAIC0wLDAgKzEsNjQgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJjYWNoZS10cmVlLmgiCisKKworc3RhdGljIHZvaWQgZHVtcF9vbmUoc3RydWN0IGNhY2hlX3RyZWUgKml0LCBjb25zdCBjaGFyICpwZngsIGNvbnN0IGNoYXIgKngpCit7CisJaWYgKGl0LT5lbnRyeV9jb3VudCA8IDApCisJCXByaW50ZigiJS00MHMgJXMlcyAoJWQgc3VidHJlZXMpXG4iLAorCQkgICAgICAgImludmFsaWQiLCB4LCBwZngsIGl0LT5zdWJ0cmVlX25yKTsKKwllbHNlCisJCXByaW50ZigiJXMgJXMlcyAoJWQgZW50cmllcywgJWQgc3VidHJlZXMpXG4iLAorCQkgICAgICAgc2hhMV90b19oZXgoaXQtPnNoYTEpLCB4LCBwZngsCisJCSAgICAgICBpdC0+ZW50cnlfY291bnQsIGl0LT5zdWJ0cmVlX25yKTsKK30KKworc3RhdGljIGludCBkdW1wX2NhY2hlX3RyZWUoc3RydWN0IGNhY2hlX3RyZWUgKml0LAorCQkJICAgc3RydWN0IGNhY2hlX3RyZWUgKnJlZiwKKwkJCSAgIGNvbnN0IGNoYXIgKnBmeCkKK3sKKwlpbnQgaTsKKwlpbnQgZXJycyA9IDA7CisKKwlpZiAoIWl0IHx8ICFyZWYpCisJCS8qIG1pc3NpbmcgaW4gZWl0aGVyICovCisJCXJldHVybiAwOworCisJaWYgKGl0LT5lbnRyeV9jb3VudCA8IDApIHsKKwkJZHVtcF9vbmUoaXQsIHBmeCwgIiIpOworCQlkdW1wX29uZShyZWYsIHBmeCwgIiMocmVmKSAiKTsKKwkJaWYgKGl0LT5zdWJ0cmVlX25yICE9IHJlZi0+c3VidHJlZV9ucikKKwkJCWVycnMgPSAxOworCX0KKwllbHNlIHsKKwkJZHVtcF9vbmUoaXQsIHBmeCwgIiIpOworCQlpZiAoaGFzaGNtcChpdC0+c2hhMSwgcmVmLT5zaGExKSB8fAorCQkgICAgcmVmLT5lbnRyeV9jb3VudCAhPSBpdC0+ZW50cnlfY291bnQgfHwKKwkJICAgIHJlZi0+c3VidHJlZV9uciAhPSBpdC0+c3VidHJlZV9ucikgeworCQkJZHVtcF9vbmUocmVmLCBwZngsICIjKHJlZikgIik7CisJCQllcnJzID0gMTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBpdC0+c3VidHJlZV9ucjsgaSsrKSB7CisJCWNoYXIgcGF0aFtQQVRIX01BWF07CisJCXN0cnVjdCBjYWNoZV90cmVlX3N1YiAqZG93biA9IGl0LT5kb3duW2ldOworCQlzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKnJkd247CisKKwkJcmR3biA9IGNhY2hlX3RyZWVfc3ViKHJlZiwgZG93bi0+bmFtZSk7CisJCXNwcmludGYocGF0aCwgIiVzJS4qcy8iLCBwZngsIGRvd24tPm5hbWVsZW4sIGRvd24tPm5hbWUpOworCQlpZiAoZHVtcF9jYWNoZV90cmVlKGRvd24tPmNhY2hlX3RyZWUsIHJkd24tPmNhY2hlX3RyZWUsIHBhdGgpKQorCQkJZXJycyA9IDE7CisJfQorCXJldHVybiBlcnJzOworfQorCitpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikKK3sKKwlzdHJ1Y3QgY2FjaGVfdHJlZSAqYW5vdGhlciA9IGNhY2hlX3RyZWUoKTsKKwlpZiAocmVhZF9jYWNoZSgpIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gcmVhZCBpbmRleCBmaWxlIik7CisJY2FjaGVfdHJlZV91cGRhdGUoYW5vdGhlciwgYWN0aXZlX2NhY2hlLCBhY3RpdmVfbnIsIDAsIDEpOworCXJldHVybiBkdW1wX2NhY2hlX3RyZWUoYWN0aXZlX2NhY2hlX3RyZWUsIGFub3RoZXIsICIiKTsKK30KZGlmZiAtLWdpdCBhL2VudHJ5LmMgYi9lbnRyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMmFhYTMKLS0tIC9kZXYvbnVsbAorKysgYi9lbnRyeS5jCkBAIC0wLDAgKzEsMjM0IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9kaXJlY3Rvcmllcyhjb25zdCBjaGFyICpwYXRoLCBjb25zdCBzdHJ1Y3QgY2hlY2tvdXQgKnN0YXRlKQoreworCWludCBsZW4gPSBzdHJsZW4ocGF0aCk7CisJY2hhciAqYnVmID0geG1hbGxvYyhsZW4gKyAxKTsKKwljb25zdCBjaGFyICpzbGFzaCA9IHBhdGg7CisKKwl3aGlsZSAoKHNsYXNoID0gc3RyY2hyKHNsYXNoKzEsICcvJykpICE9IE5VTEwpIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWludCBzdGF0X3N0YXR1czsKKworCQlsZW4gPSBzbGFzaCAtIHBhdGg7CisJCW1lbWNweShidWYsIHBhdGgsIGxlbik7CisJCWJ1ZltsZW5dID0gMDsKKworCQlpZiAobGVuIDw9IHN0YXRlLT5iYXNlX2Rpcl9sZW4pCisJCQkvKgorCQkJICogY2hlY2tvdXQtaW5kZXggLS1wcmVmaXg9PGRpcj47IDxkaXI+IGlzCisJCQkgKiBhbGxvd2VkIHRvIGJlIGEgc3ltbGluayB0byBhbiBleGlzdGluZworCQkJICogZGlyZWN0b3J5LgorCQkJICovCisJCQlzdGF0X3N0YXR1cyA9IHN0YXQoYnVmLCAmc3QpOworCQllbHNlCisJCQkvKgorCQkJICogaWYgdGhlcmUgY3VycmVudGx5IGlzIGEgc3ltbGluaywgd2Ugd291bGQKKwkJCSAqIHdhbnQgdG8gcmVwbGFjZSBpdCB3aXRoIGEgcmVhbCBkaXJlY3RvcnkuCisJCQkgKi8KKwkJCXN0YXRfc3RhdHVzID0gbHN0YXQoYnVmLCAmc3QpOworCisJCWlmICghc3RhdF9zdGF0dXMgJiYgU19JU0RJUihzdC5zdF9tb2RlKSkKKwkJCWNvbnRpbnVlOyAvKiBvaywgaXQgaXMgYWxyZWFkeSBhIGRpcmVjdG9yeS4gKi8KKworCQkvKgorCQkgKiBXZSBrbm93IHN0YXRfc3RhdHVzID09IDAgbWVhbnMgc29tZXRoaW5nIGV4aXN0cworCQkgKiB0aGVyZSBhbmQgdGhpcyBta2RpciB3b3VsZCBmYWlsLCBidXQgdGhhdCBpcyBhbgorCQkgKiBlcnJvciBjb2RlcGF0aDsgd2UgZG8gbm90IGNhcmUsIGFzIHdlIHVubGluayBhbmQKKwkJICogbWtkaXIgYWdhaW4gaW4gc3VjaCBhIGNhc2UuCisJCSAqLworCQlpZiAobWtkaXIoYnVmLCAwNzc3KSkgeworCQkJaWYgKGVycm5vID09IEVFWElTVCAmJiBzdGF0ZS0+Zm9yY2UgJiYKKwkJCSAgICAhdW5saW5rKGJ1ZikgJiYgIW1rZGlyKGJ1ZiwgMDc3NykpCisJCQkJY29udGludWU7CisJCQlkaWUoImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IGF0ICVzIiwgYnVmKTsKKwkJfQorCX0KKwlmcmVlKGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9zdWJ0cmVlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJRElSICpkaXIgPSBvcGVuZGlyKHBhdGgpOworCXN0cnVjdCBkaXJlbnQgKmRlOworCWNoYXIgcGF0aGJ1ZltQQVRIX01BWF07CisJY2hhciAqbmFtZTsKKworCWlmICghZGlyKQorCQlkaWUoImNhbm5vdCBvcGVuZGlyICVzICglcykiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworCXN0cmNweShwYXRoYnVmLCBwYXRoKTsKKwluYW1lID0gcGF0aGJ1ZiArIHN0cmxlbihwYXRoKTsKKwkqbmFtZSsrID0gJy8nOworCXdoaWxlICgoZGUgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWlmICgoZGUtPmRfbmFtZVswXSA9PSAnLicpICYmCisJCSAgICAoKGRlLT5kX25hbWVbMV0gPT0gMCkgfHwKKwkJICAgICAoKGRlLT5kX25hbWVbMV0gPT0gJy4nKSAmJiBkZS0+ZF9uYW1lWzJdID09IDApKSkKKwkJCWNvbnRpbnVlOworCQlzdHJjcHkobmFtZSwgZGUtPmRfbmFtZSk7CisJCWlmIChsc3RhdChwYXRoYnVmLCAmc3QpKQorCQkJZGllKCJjYW5ub3QgbHN0YXQgJXMgKCVzKSIsIHBhdGhidWYsIHN0cmVycm9yKGVycm5vKSk7CisJCWlmIChTX0lTRElSKHN0LnN0X21vZGUpKQorCQkJcmVtb3ZlX3N1YnRyZWUocGF0aGJ1Zik7CisJCWVsc2UgaWYgKHVubGluayhwYXRoYnVmKSkKKwkJCWRpZSgiY2Fubm90IHVubGluayAlcyAoJXMpIiwgcGF0aGJ1Ziwgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisJY2xvc2VkaXIoZGlyKTsKKwlpZiAocm1kaXIocGF0aCkpCisJCWRpZSgiY2Fubm90IHJtZGlyICVzICglcykiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworfQorCitzdGF0aWMgaW50IGNyZWF0ZV9maWxlKGNvbnN0IGNoYXIgKnBhdGgsIHVuc2lnbmVkIGludCBtb2RlKQoreworCW1vZGUgPSAobW9kZSAmIDAxMDApID8gMDc3NyA6IDA2NjY7CisJcmV0dXJuIG9wZW4ocGF0aCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMLCBtb2RlKTsKK30KKworc3RhdGljIHZvaWQgKnJlYWRfYmxvYl9lbnRyeShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBjb25zdCBjaGFyICpwYXRoLCB1bnNpZ25lZCBsb25nICpzaXplKQoreworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwl2b2lkICpuZXcgPSByZWFkX3NoYTFfZmlsZShjZS0+c2hhMSwgJnR5cGUsIHNpemUpOworCisJaWYgKG5ldykgeworCQlpZiAodHlwZSA9PSBPQkpfQkxPQikKKwkJCXJldHVybiBuZXc7CisJCWZyZWUobmV3KTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfZW50cnkoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgY2hhciAqcGF0aCwgY29uc3Qgc3RydWN0IGNoZWNrb3V0ICpzdGF0ZSwgaW50IHRvX3RlbXBmaWxlKQoreworCWludCBmZDsKKwlsb25nIHdyb3RlOworCisJc3dpdGNoIChjZS0+Y2VfbW9kZSAmIFNfSUZNVCkgeworCQljaGFyICpuZXc7CisJCXN0cnVjdCBzdHJidWYgYnVmOworCQl1bnNpZ25lZCBsb25nIHNpemU7CisKKwljYXNlIFNfSUZSRUc6CisJCW5ldyA9IHJlYWRfYmxvYl9lbnRyeShjZSwgcGF0aCwgJnNpemUpOworCQlpZiAoIW5ldykKKwkJCXJldHVybiBlcnJvcigiZ2l0LWNoZWNrb3V0LWluZGV4OiB1bmFibGUgdG8gcmVhZCBzaGExIGZpbGUgb2YgJXMgKCVzKSIsCisJCQkJcGF0aCwgc2hhMV90b19oZXgoY2UtPnNoYTEpKTsKKworCQkvKgorCQkgKiBDb252ZXJ0IGZyb20gZ2l0IGludGVybmFsIGZvcm1hdCB0byB3b3JraW5nIHRyZWUgZm9ybWF0CisJCSAqLworCQlzdHJidWZfaW5pdCgmYnVmLCAwKTsKKwkJaWYgKGNvbnZlcnRfdG9fd29ya2luZ190cmVlKGNlLT5uYW1lLCBuZXcsIHNpemUsICZidWYpKSB7CisJCQlzaXplX3QgbmV3c2l6ZSA9IDA7CisJCQlmcmVlKG5ldyk7CisJCQluZXcgPSBzdHJidWZfZGV0YWNoKCZidWYsICZuZXdzaXplKTsKKwkJCXNpemUgPSBuZXdzaXplOworCQl9CisKKwkJaWYgKHRvX3RlbXBmaWxlKSB7CisJCQlzdHJjcHkocGF0aCwgIi5tZXJnZV9maWxlX1hYWFhYWCIpOworCQkJZmQgPSBta3N0ZW1wKHBhdGgpOworCQl9IGVsc2UKKwkJCWZkID0gY3JlYXRlX2ZpbGUocGF0aCwgY2UtPmNlX21vZGUpOworCQlpZiAoZmQgPCAwKSB7CisJCQlmcmVlKG5ldyk7CisJCQlyZXR1cm4gZXJyb3IoImdpdC1jaGVja291dC1pbmRleDogdW5hYmxlIHRvIGNyZWF0ZSBmaWxlICVzICglcykiLAorCQkJCXBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJCX0KKworCQl3cm90ZSA9IHdyaXRlX2luX2Z1bGwoZmQsIG5ldywgc2l6ZSk7CisJCWNsb3NlKGZkKTsKKwkJZnJlZShuZXcpOworCQlpZiAod3JvdGUgIT0gc2l6ZSkKKwkJCXJldHVybiBlcnJvcigiZ2l0LWNoZWNrb3V0LWluZGV4OiB1bmFibGUgdG8gd3JpdGUgZmlsZSAlcyIsIHBhdGgpOworCQlicmVhazsKKwljYXNlIFNfSUZMTks6CisJCW5ldyA9IHJlYWRfYmxvYl9lbnRyeShjZSwgcGF0aCwgJnNpemUpOworCQlpZiAoIW5ldykKKwkJCXJldHVybiBlcnJvcigiZ2l0LWNoZWNrb3V0LWluZGV4OiB1bmFibGUgdG8gcmVhZCBzaGExIGZpbGUgb2YgJXMgKCVzKSIsCisJCQkJcGF0aCwgc2hhMV90b19oZXgoY2UtPnNoYTEpKTsKKwkJaWYgKHRvX3RlbXBmaWxlIHx8ICFoYXNfc3ltbGlua3MpIHsKKwkJCWlmICh0b190ZW1wZmlsZSkgeworCQkJCXN0cmNweShwYXRoLCAiLm1lcmdlX2xpbmtfWFhYWFhYIik7CisJCQkJZmQgPSBta3N0ZW1wKHBhdGgpOworCQkJfSBlbHNlCisJCQkJZmQgPSBjcmVhdGVfZmlsZShwYXRoLCAwNjY2KTsKKwkJCWlmIChmZCA8IDApIHsKKwkJCQlmcmVlKG5ldyk7CisJCQkJcmV0dXJuIGVycm9yKCJnaXQtY2hlY2tvdXQtaW5kZXg6IHVuYWJsZSB0byBjcmVhdGUgIgorCQkJCQkJICJmaWxlICVzICglcykiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworCQkJfQorCQkJd3JvdGUgPSB3cml0ZV9pbl9mdWxsKGZkLCBuZXcsIHNpemUpOworCQkJY2xvc2UoZmQpOworCQkJZnJlZShuZXcpOworCQkJaWYgKHdyb3RlICE9IHNpemUpCisJCQkJcmV0dXJuIGVycm9yKCJnaXQtY2hlY2tvdXQtaW5kZXg6IHVuYWJsZSB0byB3cml0ZSBmaWxlICVzIiwKKwkJCQkJcGF0aCk7CisJCX0gZWxzZSB7CisJCQl3cm90ZSA9IHN5bWxpbmsobmV3LCBwYXRoKTsKKwkJCWZyZWUobmV3KTsKKwkJCWlmICh3cm90ZSkKKwkJCQlyZXR1cm4gZXJyb3IoImdpdC1jaGVja291dC1pbmRleDogdW5hYmxlIHRvIGNyZWF0ZSAiCisJCQkJCQkgInN5bWxpbmsgJXMgKCVzKSIsIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTX0lGR0lUTElOSzoKKwkJaWYgKHRvX3RlbXBmaWxlKQorCQkJcmV0dXJuIGVycm9yKCJnaXQtY2hlY2tvdXQtaW5kZXg6IGNhbm5vdCBjcmVhdGUgdGVtcG9yYXJ5IHN1YnByb2plY3QgJXMiLCBwYXRoKTsKKwkJaWYgKG1rZGlyKHBhdGgsIDA3NzcpIDwgMCkKKwkJCXJldHVybiBlcnJvcigiZ2l0LWNoZWNrb3V0LWluZGV4OiBjYW5ub3QgY3JlYXRlIHN1YnByb2plY3QgZGlyZWN0b3J5ICVzIiwgcGF0aCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBlcnJvcigiZ2l0LWNoZWNrb3V0LWluZGV4OiB1bmtub3duIGZpbGUgbW9kZSBmb3IgJXMiLCBwYXRoKTsKKwl9CisKKwlpZiAoc3RhdGUtPnJlZnJlc2hfY2FjaGUpIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWxzdGF0KGNlLT5uYW1lLCAmc3QpOworCQlmaWxsX3N0YXRfY2FjaGVfaW5mbyhjZSwgJnN0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBjaGVja291dF9lbnRyeShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBjb25zdCBzdHJ1Y3QgY2hlY2tvdXQgKnN0YXRlLCBjaGFyICp0b3BhdGgpCit7CisJc3RhdGljIGNoYXIgcGF0aFtQQVRIX01BWCArIDFdOworCXN0cnVjdCBzdGF0IHN0OworCWludCBsZW4gPSBzdGF0ZS0+YmFzZV9kaXJfbGVuOworCisJaWYgKHRvcGF0aCkKKwkJcmV0dXJuIHdyaXRlX2VudHJ5KGNlLCB0b3BhdGgsIHN0YXRlLCAxKTsKKworCW1lbWNweShwYXRoLCBzdGF0ZS0+YmFzZV9kaXIsIGxlbik7CisJc3RyY3B5KHBhdGggKyBsZW4sIGNlLT5uYW1lKTsKKworCWlmICghbHN0YXQocGF0aCwgJnN0KSkgeworCQl1bnNpZ25lZCBjaGFuZ2VkID0gY2VfbWF0Y2hfc3RhdChjZSwgJnN0LCBDRV9NQVRDSF9JR05PUkVfVkFMSUQpOworCQlpZiAoIWNoYW5nZWQpCisJCQlyZXR1cm4gMDsKKwkJaWYgKCFzdGF0ZS0+Zm9yY2UpIHsKKwkJCWlmICghc3RhdGUtPnF1aWV0KQorCQkJCWZwcmludGYoc3RkZXJyLCAiZ2l0LWNoZWNrb3V0LWluZGV4OiAlcyBhbHJlYWR5IGV4aXN0c1xuIiwgcGF0aCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQkvKgorCQkgKiBXZSB1bmxpbmsgdGhlIG9sZCBmaWxlLCB0byBnZXQgdGhlIG5ldyBvbmUgd2l0aCB0aGUKKwkJICogcmlnaHQgcGVybWlzc2lvbnMgKGluY2x1ZGluZyB1bWFzaywgd2hpY2ggaXMgbmFzdHkKKwkJICogdG8gZW11bGF0ZSBieSBoYW5kIC0gbXVjaCBlYXNpZXIgdG8gbGV0IHRoZSBzeXN0ZW0KKwkJICoganVzdCBkbyB0aGUgcmlnaHQgdGhpbmcpCisJCSAqLworCQlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJLyogSWYgaXQgaXMgYSBnaXRsaW5rLCBsZWF2ZSBpdCBhbG9uZSEgKi8KKwkJCWlmIChTX0lTR0lUTElOSyhjZS0+Y2VfbW9kZSkpCisJCQkJcmV0dXJuIDA7CisJCQlpZiAoIXN0YXRlLT5mb3JjZSkKKwkJCQlyZXR1cm4gZXJyb3IoIiVzIGlzIGEgZGlyZWN0b3J5IiwgcGF0aCk7CisJCQlyZW1vdmVfc3VidHJlZShwYXRoKTsKKwkJfSBlbHNlIGlmICh1bmxpbmsocGF0aCkpCisJCQlyZXR1cm4gZXJyb3IoInVuYWJsZSB0byB1bmxpbmsgb2xkICclcycgKCVzKSIsIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJfSBlbHNlIGlmIChzdGF0ZS0+bm90X25ldykKKwkJcmV0dXJuIDA7CisJY3JlYXRlX2RpcmVjdG9yaWVzKHBhdGgsIHN0YXRlKTsKKwlyZXR1cm4gd3JpdGVfZW50cnkoY2UsIHBhdGgsIHN0YXRlLCAwKTsKK30KZGlmZiAtLWdpdCBhL2Vudmlyb25tZW50LmMgYi9lbnZpcm9ubWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MzlhM2YKLS0tIC9kZXYvbnVsbAorKysgYi9lbnZpcm9ubWVudC5jCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogV2UgcHV0IGFsbCB0aGUgZ2l0IGNvbmZpZyB2YXJpYWJsZXMgaW4gdGhpcyBzYW1lIG9iamVjdAorICogZmlsZSwgc28gdGhhdCBwcm9ncmFtcyBjYW4gbGluayBhZ2FpbnN0IHRoZSBjb25maWcgcGFyc2VyCisgKiB3aXRob3V0IGhhdmluZyB0byBsaW5rIGFnYWluc3QgYWxsIHRoZSByZXN0IG9mIGdpdC4KKyAqCisgKiBJbiBwYXJ0aWN1bGFyLCBubyBuZWVkIHRvIGJyaW5nIGluIGxpYnogZXRjIHVubGVzcyBuZWVkZWQsCisgKiBldmVuIGlmIHlvdSBtaWdodCB3YW50IHRvIGtub3cgd2hlcmUgdGhlIGdpdCBkaXJlY3RvcnkgZXRjCisgKiBhcmUuCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorCitjaGFyIGdpdF9kZWZhdWx0X2VtYWlsW01BWF9HSVROQU1FXTsKK2NoYXIgZ2l0X2RlZmF1bHRfbmFtZVtNQVhfR0lUTkFNRV07CitpbnQgdHJ1c3RfZXhlY3V0YWJsZV9iaXQgPSAxOworaW50IHF1b3RlX3BhdGhfZnVsbHkgPSAxOworaW50IGhhc19zeW1saW5rcyA9IDE7CitpbnQgYXNzdW1lX3VuY2hhbmdlZDsKK2ludCBwcmVmZXJfc3ltbGlua19yZWZzOworaW50IGlzX2JhcmVfcmVwb3NpdG9yeV9jZmcgPSAtMTsgLyogdW5zcGVjaWZpZWQgKi8KK2ludCBsb2dfYWxsX3JlZl91cGRhdGVzID0gLTE7IC8qIHVuc3BlY2lmaWVkICovCitpbnQgd2Fybl9hbWJpZ3VvdXNfcmVmcyA9IDE7CitpbnQgcmVwb3NpdG9yeV9mb3JtYXRfdmVyc2lvbjsKK2NvbnN0IGNoYXIgKmdpdF9jb21taXRfZW5jb2Rpbmc7Citjb25zdCBjaGFyICpnaXRfbG9nX291dHB1dF9lbmNvZGluZzsKK2ludCBzaGFyZWRfcmVwb3NpdG9yeSA9IFBFUk1fVU1BU0s7Citjb25zdCBjaGFyICphcHBseV9kZWZhdWx0X3doaXRlc3BhY2U7CitpbnQgemxpYl9jb21wcmVzc2lvbl9sZXZlbCA9IFpfQkVTVF9TUEVFRDsKK2ludCBjb3JlX2NvbXByZXNzaW9uX2xldmVsOworaW50IGNvcmVfY29tcHJlc3Npb25fc2VlbjsKK3NpemVfdCBwYWNrZWRfZ2l0X3dpbmRvd19zaXplID0gREVGQVVMVF9QQUNLRURfR0lUX1dJTkRPV19TSVpFOworc2l6ZV90IHBhY2tlZF9naXRfbGltaXQgPSBERUZBVUxUX1BBQ0tFRF9HSVRfTElNSVQ7CitzaXplX3QgZGVsdGFfYmFzZV9jYWNoZV9saW1pdCA9IDE2ICogMTAyNCAqIDEwMjQ7Citjb25zdCBjaGFyICpwYWdlcl9wcm9ncmFtOworaW50IHBhZ2VyX3VzZV9jb2xvciA9IDE7Citjb25zdCBjaGFyICplZGl0b3JfcHJvZ3JhbTsKK2NvbnN0IGNoYXIgKmV4Y2x1ZGVzX2ZpbGU7CitpbnQgYXV0b19jcmxmID0gMDsJLyogMTogYm90aCB3YXlzLCAtMTogb25seSB3aGVuIGFkZGluZyBnaXQgb2JqZWN0cyAqLworZW51bSBzYWZlX2NybGYgc2FmZV9jcmxmID0gU0FGRV9DUkxGX1dBUk47Cit1bnNpZ25lZCB3aGl0ZXNwYWNlX3J1bGVfY2ZnID0gV1NfREVGQVVMVF9SVUxFOworZW51bSBicmFuY2hfdHJhY2sgZ2l0X2JyYW5jaF90cmFjayA9IEJSQU5DSF9UUkFDS19SRU1PVEU7CisKKy8qIFRoaXMgaXMgc2V0IGJ5IHNldHVwX2dpdF9kaXJfZ2VudGx5KCkgYW5kL29yIGdpdF9kZWZhdWx0X2NvbmZpZygpICovCitjaGFyICpnaXRfd29ya190cmVlX2NmZzsKK3N0YXRpYyBjb25zdCBjaGFyICp3b3JrX3RyZWU7CisKK3N0YXRpYyBjb25zdCBjaGFyICpnaXRfZGlyOworc3RhdGljIGNoYXIgKmdpdF9vYmplY3RfZGlyLCAqZ2l0X2luZGV4X2ZpbGUsICpnaXRfcmVmc19kaXIsICpnaXRfZ3JhZnRfZmlsZTsKKworc3RhdGljIHZvaWQgc2V0dXBfZ2l0X2Vudih2b2lkKQoreworCWdpdF9kaXIgPSBnZXRlbnYoR0lUX0RJUl9FTlZJUk9OTUVOVCk7CisJaWYgKCFnaXRfZGlyKQorCQlnaXRfZGlyID0gREVGQVVMVF9HSVRfRElSX0VOVklST05NRU5UOworCWdpdF9vYmplY3RfZGlyID0gZ2V0ZW52KERCX0VOVklST05NRU5UKTsKKwlpZiAoIWdpdF9vYmplY3RfZGlyKSB7CisJCWdpdF9vYmplY3RfZGlyID0geG1hbGxvYyhzdHJsZW4oZ2l0X2RpcikgKyA5KTsKKwkJc3ByaW50ZihnaXRfb2JqZWN0X2RpciwgIiVzL29iamVjdHMiLCBnaXRfZGlyKTsKKwl9CisJZ2l0X3JlZnNfZGlyID0geG1hbGxvYyhzdHJsZW4oZ2l0X2RpcikgKyA2KTsKKwlzcHJpbnRmKGdpdF9yZWZzX2RpciwgIiVzL3JlZnMiLCBnaXRfZGlyKTsKKwlnaXRfaW5kZXhfZmlsZSA9IGdldGVudihJTkRFWF9FTlZJUk9OTUVOVCk7CisJaWYgKCFnaXRfaW5kZXhfZmlsZSkgeworCQlnaXRfaW5kZXhfZmlsZSA9IHhtYWxsb2Moc3RybGVuKGdpdF9kaXIpICsgNyk7CisJCXNwcmludGYoZ2l0X2luZGV4X2ZpbGUsICIlcy9pbmRleCIsIGdpdF9kaXIpOworCX0KKwlnaXRfZ3JhZnRfZmlsZSA9IGdldGVudihHUkFGVF9FTlZJUk9OTUVOVCk7CisJaWYgKCFnaXRfZ3JhZnRfZmlsZSkKKwkJZ2l0X2dyYWZ0X2ZpbGUgPSB4c3RyZHVwKGdpdF9wYXRoKCJpbmZvL2dyYWZ0cyIpKTsKK30KKworaW50IGlzX2JhcmVfcmVwb3NpdG9yeSh2b2lkKQoreworCS8qIGlmIGNvcmUuYmFyZSBpcyBub3QgJ2ZhbHNlJywgbGV0J3Mgc2VlIGlmIHRoZXJlIGlzIGEgd29yayB0cmVlICovCisJcmV0dXJuIGlzX2JhcmVfcmVwb3NpdG9yeV9jZmcgJiYgIWdldF9naXRfd29ya190cmVlKCk7Cit9CisKK2NvbnN0IGNoYXIgKmdldF9naXRfZGlyKHZvaWQpCit7CisJaWYgKCFnaXRfZGlyKQorCQlzZXR1cF9naXRfZW52KCk7CisJcmV0dXJuIGdpdF9kaXI7Cit9CisKK2NvbnN0IGNoYXIgKmdldF9naXRfd29ya190cmVlKHZvaWQpCit7CisJc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisJaWYgKCFpbml0aWFsaXplZCkgeworCQl3b3JrX3RyZWUgPSBnZXRlbnYoR0lUX1dPUktfVFJFRV9FTlZJUk9OTUVOVCk7CisJCS8qIGNvcmUuYmFyZSA9IHRydWUgb3ZlcnJpZGVzIGltcGxpY2l0IGFuZCBjb25maWcgd29yayB0cmVlICovCisJCWlmICghd29ya190cmVlICYmIGlzX2JhcmVfcmVwb3NpdG9yeV9jZmcgPCAxKSB7CisJCQl3b3JrX3RyZWUgPSBnaXRfd29ya190cmVlX2NmZzsKKwkJCS8qIG1ha2VfYWJzb2x1dGVfcGF0aCBhbHNvIG5vcm1hbGl6ZXMgdGhlIHBhdGggKi8KKwkJCWlmICh3b3JrX3RyZWUgJiYgIWlzX2Fic29sdXRlX3BhdGgod29ya190cmVlKSkKKwkJCQl3b3JrX3RyZWUgPSB4c3RyZHVwKG1ha2VfYWJzb2x1dGVfcGF0aChnaXRfcGF0aCh3b3JrX3RyZWUpKSk7CisJCX0gZWxzZSBpZiAod29ya190cmVlKQorCQkJd29ya190cmVlID0geHN0cmR1cChtYWtlX2Fic29sdXRlX3BhdGgod29ya190cmVlKSk7CisJCWluaXRpYWxpemVkID0gMTsKKwkJaWYgKHdvcmtfdHJlZSkKKwkJCWlzX2JhcmVfcmVwb3NpdG9yeV9jZmcgPSAwOworCX0KKwlyZXR1cm4gd29ya190cmVlOworfQorCitjaGFyICpnZXRfb2JqZWN0X2RpcmVjdG9yeSh2b2lkKQoreworCWlmICghZ2l0X29iamVjdF9kaXIpCisJCXNldHVwX2dpdF9lbnYoKTsKKwlyZXR1cm4gZ2l0X29iamVjdF9kaXI7Cit9CisKK2NoYXIgKmdldF9yZWZzX2RpcmVjdG9yeSh2b2lkKQoreworCWlmICghZ2l0X3JlZnNfZGlyKQorCQlzZXR1cF9naXRfZW52KCk7CisJcmV0dXJuIGdpdF9yZWZzX2RpcjsKK30KKworY2hhciAqZ2V0X2luZGV4X2ZpbGUodm9pZCkKK3sKKwlpZiAoIWdpdF9pbmRleF9maWxlKQorCQlzZXR1cF9naXRfZW52KCk7CisJcmV0dXJuIGdpdF9pbmRleF9maWxlOworfQorCitjaGFyICpnZXRfZ3JhZnRfZmlsZSh2b2lkKQoreworCWlmICghZ2l0X2dyYWZ0X2ZpbGUpCisJCXNldHVwX2dpdF9lbnYoKTsKKwlyZXR1cm4gZ2l0X2dyYWZ0X2ZpbGU7Cit9CisKK2ludCBzZXRfZ2l0X2Rpcihjb25zdCBjaGFyICpwYXRoKQoreworCWlmIChzZXRlbnYoR0lUX0RJUl9FTlZJUk9OTUVOVCwgcGF0aCwgMSkpCisJCXJldHVybiBlcnJvcigiQ291bGQgbm90IHNldCBHSVRfRElSIHRvICclcyciLCBwYXRoKTsKKwlzZXR1cF9naXRfZW52KCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9leGVjX2NtZC5jIGIvZXhlY19jbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTg5Y2FjCi0tLSAvZGV2L251bGwKKysrIGIvZXhlY19jbWQuYwpAQCAtMCwwICsxLDExOSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZXhlY19jbWQuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorI2RlZmluZSBNQVhfQVJHUwkzMgorCitleHRlcm4gY2hhciAqKmVudmlyb247CitzdGF0aWMgY29uc3QgY2hhciAqYnVpbHRpbl9leGVjX3BhdGggPSBHSVRfRVhFQ19QQVRIOworc3RhdGljIGNvbnN0IGNoYXIgKmFyZ3ZfZXhlY19wYXRoOworCit2b2lkIGdpdF9zZXRfYXJndl9leGVjX3BhdGgoY29uc3QgY2hhciAqZXhlY19wYXRoKQoreworCWFyZ3ZfZXhlY19wYXRoID0gZXhlY19wYXRoOworfQorCisKKy8qIFJldHVybnMgdGhlIGhpZ2hlc3QtcHJpb3JpdHksIGxvY2F0aW9uIHRvIGxvb2sgZm9yIGdpdCBwcm9ncmFtcy4gKi8KK2NvbnN0IGNoYXIgKmdpdF9leGVjX3BhdGgodm9pZCkKK3sKKwljb25zdCBjaGFyICplbnY7CisKKwlpZiAoYXJndl9leGVjX3BhdGgpCisJCXJldHVybiBhcmd2X2V4ZWNfcGF0aDsKKworCWVudiA9IGdldGVudihFWEVDX1BBVEhfRU5WSVJPTk1FTlQpOworCWlmIChlbnYgJiYgKmVudikgeworCQlyZXR1cm4gZW52OworCX0KKworCXJldHVybiBidWlsdGluX2V4ZWNfcGF0aDsKK30KKworc3RhdGljIHZvaWQgYWRkX3BhdGgoc3RydWN0IHN0cmJ1ZiAqb3V0LCBjb25zdCBjaGFyICpwYXRoKQoreworCWlmIChwYXRoICYmICpwYXRoKSB7CisJCWlmIChpc19hYnNvbHV0ZV9wYXRoKHBhdGgpKQorCQkJc3RyYnVmX2FkZHN0cihvdXQsIHBhdGgpOworCQllbHNlCisJCQlzdHJidWZfYWRkc3RyKG91dCwgbWFrZV9hYnNvbHV0ZV9wYXRoKHBhdGgpKTsKKworCQlzdHJidWZfYWRkY2gob3V0LCAnOicpOworCX0KK30KKwordm9pZCBzZXR1cF9wYXRoKGNvbnN0IGNoYXIgKmNtZF9wYXRoKQoreworCWNvbnN0IGNoYXIgKm9sZF9wYXRoID0gZ2V0ZW52KCJQQVRIIik7CisJc3RydWN0IHN0cmJ1ZiBuZXdfcGF0aDsKKworCXN0cmJ1Zl9pbml0KCZuZXdfcGF0aCwgMCk7CisKKwlhZGRfcGF0aCgmbmV3X3BhdGgsIGFyZ3ZfZXhlY19wYXRoKTsKKwlhZGRfcGF0aCgmbmV3X3BhdGgsIGdldGVudihFWEVDX1BBVEhfRU5WSVJPTk1FTlQpKTsKKwlhZGRfcGF0aCgmbmV3X3BhdGgsIGJ1aWx0aW5fZXhlY19wYXRoKTsKKwlhZGRfcGF0aCgmbmV3X3BhdGgsIGNtZF9wYXRoKTsKKworCWlmIChvbGRfcGF0aCkKKwkJc3RyYnVmX2FkZHN0cigmbmV3X3BhdGgsIG9sZF9wYXRoKTsKKwllbHNlCisJCXN0cmJ1Zl9hZGRzdHIoJm5ld19wYXRoLCAiL3Vzci9sb2NhbC9iaW46L3Vzci9iaW46L2JpbiIpOworCisJc2V0ZW52KCJQQVRIIiwgbmV3X3BhdGguYnVmLCAxKTsKKworCXN0cmJ1Zl9yZWxlYXNlKCZuZXdfcGF0aCk7Cit9CisKK2ludCBleGVjdl9naXRfY21kKGNvbnN0IGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBzdHJidWYgY21kOworCWNvbnN0IGNoYXIgKnRtcDsKKworCXN0cmJ1Zl9pbml0KCZjbWQsIDApOworCXN0cmJ1Zl9hZGRmKCZjbWQsICJnaXQtJXMiLCBhcmd2WzBdKTsKKworCS8qCisJICogYXJndlswXSBtdXN0IGJlIHRoZSBnaXQgY29tbWFuZCwgYnV0IHRoZSBhcmd2IGFycmF5CisJICogYmVsb25ncyB0byB0aGUgY2FsbGVyLCBhbmQgbWF5IGJlIHJldXNlZCBpbgorCSAqIHN1YnNlcXVlbnQgbG9vcCBpdGVyYXRpb25zLiBTYXZlIGFyZ3ZbMF0gYW5kCisJICogcmVzdG9yZSBpdCBvbiBlcnJvci4KKwkgKi8KKwl0bXAgPSBhcmd2WzBdOworCWFyZ3ZbMF0gPSBjbWQuYnVmOworCisJdHJhY2VfYXJndl9wcmludGYoYXJndiwgInRyYWNlOiBleGVjOiIpOworCisJLyogZXhlY3ZwKCkgY2FuIG9ubHkgZXZlciByZXR1cm4gaWYgaXQgZmFpbHMgKi8KKwlleGVjdnAoY21kLmJ1ZiwgKGNoYXIgKiopYXJndik7CisKKwl0cmFjZV9wcmludGYoInRyYWNlOiBleGVjIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisKKwlhcmd2WzBdID0gdG1wOworCisJc3RyYnVmX3JlbGVhc2UoJmNtZCk7CisKKwlyZXR1cm4gLTE7Cit9CisKKworaW50IGV4ZWNsX2dpdF9jbWQoY29uc3QgY2hhciAqY21kLC4uLikKK3sKKwlpbnQgYXJnYzsKKwljb25zdCBjaGFyICphcmd2W01BWF9BUkdTICsgMV07CisJY29uc3QgY2hhciAqYXJnOworCXZhX2xpc3QgcGFyYW07CisKKwl2YV9zdGFydChwYXJhbSwgY21kKTsKKwlhcmd2WzBdID0gY21kOworCWFyZ2MgPSAxOworCXdoaWxlIChhcmdjIDwgTUFYX0FSR1MpIHsKKwkJYXJnID0gYXJndlthcmdjKytdID0gdmFfYXJnKHBhcmFtLCBjaGFyICopOworCQlpZiAoIWFyZykKKwkJCWJyZWFrOworCX0KKwl2YV9lbmQocGFyYW0pOworCWlmIChNQVhfQVJHUyA8PSBhcmdjKQorCQlyZXR1cm4gZXJyb3IoInRvbyBtYW55IGFyZ3MgdG8gcnVuICVzIiwgY21kKTsKKworCWFyZ3ZbYXJnY10gPSBOVUxMOworCXJldHVybiBleGVjdl9naXRfY21kKGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvZXhlY19jbWQuaCBiL2V4ZWNfY21kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg5MjM1NQotLS0gL2Rldi9udWxsCisrKyBiL2V4ZWNfY21kLmgKQEAgLTAsMCArMSwxMSBAQAorI2lmbmRlZiBHSVRfRVhFQ19DTURfSAorI2RlZmluZSBHSVRfRVhFQ19DTURfSAorCitleHRlcm4gdm9pZCBnaXRfc2V0X2FyZ3ZfZXhlY19wYXRoKGNvbnN0IGNoYXIgKmV4ZWNfcGF0aCk7CitleHRlcm4gY29uc3QgY2hhciogZ2l0X2V4ZWNfcGF0aCh2b2lkKTsKK2V4dGVybiB2b2lkIHNldHVwX3BhdGgoY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgZXhlY3ZfZ2l0X2NtZChjb25zdCBjaGFyICoqYXJndik7IC8qIE5VTEwgdGVybWluYXRlZCAqLworZXh0ZXJuIGludCBleGVjbF9naXRfY21kKGNvbnN0IGNoYXIgKmNtZCwgLi4uKTsKKworCisjZW5kaWYgLyogR0lUX0VYRUNfQ01EX0ggKi8KZGlmZiAtLWdpdCBhL2Zhc3QtaW1wb3J0LmMgYi9mYXN0LWltcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZTU0MzkKLS0tIC9kZXYvbnVsbAorKysgYi9mYXN0LWltcG9ydC5jCkBAIC0wLDAgKzEsMjUwNCBAQAorLyoKK0Zvcm1hdCBvZiBTVERJTiBzdHJlYW06CisKKyAgc3RyZWFtIDo6PSBjbWQqOworCisgIGNtZCA6Oj0gbmV3X2Jsb2IKKyAgICAgICAgfCBuZXdfY29tbWl0CisgICAgICAgIHwgbmV3X3RhZworICAgICAgICB8IHJlc2V0X2JyYW5jaAorICAgICAgICB8IGNoZWNrcG9pbnQKKyAgICAgICAgfCBwcm9ncmVzcworICAgICAgICA7CisKKyAgbmV3X2Jsb2IgOjo9ICdibG9iJyBsZgorICAgIG1hcms/CisgICAgZmlsZV9jb250ZW50OworICBmaWxlX2NvbnRlbnQgOjo9IGRhdGE7CisKKyAgbmV3X2NvbW1pdCA6Oj0gJ2NvbW1pdCcgc3AgcmVmX3N0ciBsZgorICAgIG1hcms/CisgICAgKCdhdXRob3InIHNwIG5hbWUgJzwnIGVtYWlsICc+JyB3aGVuIGxmKT8KKyAgICAnY29tbWl0dGVyJyBzcCBuYW1lICc8JyBlbWFpbCAnPicgd2hlbiBsZgorICAgIGNvbW1pdF9tc2cKKyAgICAoJ2Zyb20nIHNwIChyZWZfc3RyIHwgaGV4c2hhMSB8IHNoYTFleHBfc3RyIHwgaWRudW0pIGxmKT8KKyAgICAoJ21lcmdlJyBzcCAocmVmX3N0ciB8IGhleHNoYTEgfCBzaGExZXhwX3N0ciB8IGlkbnVtKSBsZikqCisgICAgZmlsZV9jaGFuZ2UqCisgICAgbGY/OworICBjb21taXRfbXNnIDo6PSBkYXRhOworCisgIGZpbGVfY2hhbmdlIDo6PSBmaWxlX2NscgorICAgIHwgZmlsZV9kZWwKKyAgICB8IGZpbGVfcm5tCisgICAgfCBmaWxlX2NweQorICAgIHwgZmlsZV9vYm0KKyAgICB8IGZpbGVfaW5tOworICBmaWxlX2NsciA6Oj0gJ2RlbGV0ZWFsbCcgbGY7CisgIGZpbGVfZGVsIDo6PSAnRCcgc3AgcGF0aF9zdHIgbGY7CisgIGZpbGVfcm5tIDo6PSAnUicgc3AgcGF0aF9zdHIgc3AgcGF0aF9zdHIgbGY7CisgIGZpbGVfY3B5IDo6PSAnQycgc3AgcGF0aF9zdHIgc3AgcGF0aF9zdHIgbGY7CisgIGZpbGVfb2JtIDo6PSAnTScgc3AgbW9kZSBzcCAoaGV4c2hhMSB8IGlkbnVtKSBzcCBwYXRoX3N0ciBsZjsKKyAgZmlsZV9pbm0gOjo9ICdNJyBzcCBtb2RlIHNwICdpbmxpbmUnIHNwIHBhdGhfc3RyIGxmCisgICAgZGF0YTsKKworICBuZXdfdGFnIDo6PSAndGFnJyBzcCB0YWdfc3RyIGxmCisgICAgJ2Zyb20nIHNwIChyZWZfc3RyIHwgaGV4c2hhMSB8IHNoYTFleHBfc3RyIHwgaWRudW0pIGxmCisgICAgJ3RhZ2dlcicgc3AgbmFtZSAnPCcgZW1haWwgJz4nIHdoZW4gbGYKKyAgICB0YWdfbXNnOworICB0YWdfbXNnIDo6PSBkYXRhOworCisgIHJlc2V0X2JyYW5jaCA6Oj0gJ3Jlc2V0JyBzcCByZWZfc3RyIGxmCisgICAgKCdmcm9tJyBzcCAocmVmX3N0ciB8IGhleHNoYTEgfCBzaGExZXhwX3N0ciB8IGlkbnVtKSBsZik/CisgICAgbGY/OworCisgIGNoZWNrcG9pbnQgOjo9ICdjaGVja3BvaW50JyBsZgorICAgIGxmPzsKKworICBwcm9ncmVzcyA6Oj0gJ3Byb2dyZXNzJyBzcCBub3RfbGYqIGxmCisgICAgbGY/OworCisgICAgICMgbm90ZTogdGhlIGZpcnN0IGlkbnVtIGluIGEgc3RyZWFtIHNob3VsZCBiZSAxIGFuZCBzdWJzZXF1ZW50CisgICAgICMgaWRudW1zIHNob3VsZCBub3QgaGF2ZSBnYXBzIGJldHdlZW4gdmFsdWVzIGFzIHRoaXMgd2lsbCBjYXVzZQorICAgICAjIHRoZSBzdHJlYW0gcGFyc2VyIHRvIHJlc2VydmUgc3BhY2UgZm9yIHRoZSBnYXBwZWQgdmFsdWVzLiAgQW4KKyAgICAgIyBpZG51bSBjYW4gYmUgdXBkYXRlZCBpbiB0aGUgZnV0dXJlIHRvIGEgbmV3IG9iamVjdCBieSBpc3N1aW5nCisgICAgICMgYSBuZXcgbWFyayBkaXJlY3RpdmUgd2l0aCB0aGUgb2xkIGlkbnVtLgorICAgICAjCisgIG1hcmsgOjo9ICdtYXJrJyBzcCBpZG51bSBsZjsKKyAgZGF0YSA6Oj0gKGRlbGltaXRlZF9kYXRhIHwgZXhhY3RfZGF0YSkKKyAgICBsZj87CisKKyAgICAjIG5vdGU6IGRlbGltIG1heSBiZSBhbnkgc3RyaW5nIGJ1dCBtdXN0IG5vdCBjb250YWluIGxmLgorICAgICMgZGF0YV9saW5lIG1heSBjb250YWluIGFueSBkYXRhIGJ1dCBtdXN0IG5vdCBiZSBleGFjdGx5CisgICAgIyBkZWxpbS4KKyAgZGVsaW1pdGVkX2RhdGEgOjo9ICdkYXRhJyBzcCAnPDwnIGRlbGltIGxmCisgICAgKGRhdGFfbGluZSBsZikqCisgICAgZGVsaW0gbGY7CisKKyAgICAgIyBub3RlOiBkZWNsZW4gaW5kaWNhdGVzIHRoZSBsZW5ndGggb2YgYmluYXJ5X2RhdGEgaW4gYnl0ZXMuCisgICAgICMgZGVjbGVuIGRvZXMgbm90IGluY2x1ZGUgdGhlIGxmIHByZWNlZWRpbmcgdGhlIGJpbmFyeSBkYXRhLgorICAgICAjCisgIGV4YWN0X2RhdGEgOjo9ICdkYXRhJyBzcCBkZWNsZW4gbGYKKyAgICBiaW5hcnlfZGF0YTsKKworICAgICAjIG5vdGU6IHF1b3RlZCBzdHJpbmdzIGFyZSBDLXN0eWxlIHF1b3Rpbmcgc3VwcG9ydGluZyBcYyBmb3IKKyAgICAgIyBjb21tb24gZXNjYXBlcyBvZiAnYycgKGUuLmcgXG4sIFx0LCBcXCwgXCIpIG9yIFxubm4gd2hlcmUgbm5uCisgICAgICMgaXMgdGhlIHNpZ25lZCBieXRlIHZhbHVlIGluIG9jdGFsLiAgTm90ZSB0aGF0IHRoZSBvbmx5CisgICAgICMgY2hhcmFjdGVycyB3aGljaCBtdXN0IGFjdHVhbGx5IGJlIGVzY2FwZWQgdG8gcHJvdGVjdCB0aGUKKyAgICAgIyBzdHJlYW0gZm9ybWF0dGluZyBpczogXCwgIiBhbmQgTEYuICBPdGhlcndpc2UgdGhlc2UgdmFsdWVzCisgICAgICMgYXJlIFVURjguCisgICAgICMKKyAgcmVmX3N0ciAgICAgOjo9IHJlZjsKKyAgc2hhMWV4cF9zdHIgOjo9IHNoYTFleHA7CisgIHRhZ19zdHIgICAgIDo6PSB0YWc7CisgIHBhdGhfc3RyICAgIDo6PSBwYXRoICAgIHwgJyInIHF1b3RlZChwYXRoKSAgICAnIicgOworICBtb2RlICAgICAgICA6Oj0gJzEwMDY0NCcgfCAnNjQ0JworICAgICAgICAgICAgICAgIHwgJzEwMDc1NScgfCAnNzU1JworICAgICAgICAgICAgICAgIHwgJzEyMDAwMCcKKyAgICAgICAgICAgICAgICA7CisKKyAgZGVjbGVuIDo6PSAjIHVuc2lnbmVkIDMyIGJpdCB2YWx1ZSwgYXNjaWkgYmFzZTEwIG5vdGF0aW9uOworICBiaWdpbnQgOjo9ICMgdW5zaWduZWQgaW50ZWdlciB2YWx1ZSwgYXNjaWkgYmFzZTEwIG5vdGF0aW9uOworICBiaW5hcnlfZGF0YSA6Oj0gIyBmaWxlIGNvbnRlbnQsIG5vdCBpbnRlcnByZXRlZDsKKworICB3aGVuICAgICAgICAgOjo9IHJhd193aGVuIHwgcmZjMjgyMl93aGVuOworICByYXdfd2hlbiAgICAgOjo9IHRzIHNwIHR6OworICByZmMyODIyX3doZW4gOjo9ICMgVmFsaWQgUkZDIDI4MjIgZGF0ZSBhbmQgdGltZTsKKworICBzcCA6Oj0gIyBBU0NJSSBzcGFjZSBjaGFyYWN0ZXI7CisgIGxmIDo6PSAjIEFTQ0lJIG5ld2xpbmUgKExGKSBjaGFyYWN0ZXI7CisKKyAgICAgIyBub3RlOiBhIGNvbG9uICgnOicpIG11c3QgcHJlY2VkZSB0aGUgbnVtZXJpY2FsIHZhbHVlIGFzc2lnbmVkIHRvCisgICAgICMgYW4gaWRudW0uICBUaGlzIGlzIHRvIGRpc3Rpbmd1aXNoIGl0IGZyb20gYSByZWYgb3IgdGFnIG5hbWUgYXMKKyAgICAgIyBHSVQgZG9lcyBub3QgcGVybWl0ICc6JyBpbiByZWYgb3IgdGFnIHN0cmluZ3MuCisgICAgICMKKyAgaWRudW0gICA6Oj0gJzonIGJpZ2ludDsKKyAgcGF0aCAgICA6Oj0gIyBHSVQgc3R5bGUgZmlsZSBwYXRoLCBlLmcuICJhL2IvYyI7CisgIHJlZiAgICAgOjo9ICMgR0lUIHJlZiBuYW1lLCBlLmcuICJyZWZzL2hlYWRzL01PWl9HRUNLT19FWFBFUklNRU5UIjsKKyAgdGFnICAgICA6Oj0gIyBHSVQgdGFnIG5hbWUsIGUuZy4gIkZJUkVGT1hfMV81IjsKKyAgc2hhMWV4cCA6Oj0gIyBBbnkgdmFsaWQgR0lUIFNIQTEgZXhwcmVzc2lvbjsKKyAgaGV4c2hhMSA6Oj0gIyBTSEExIGluIGhleGFkZWNpbWFsIGZvcm1hdDsKKworICAgICAjIG5vdGU6IG5hbWUgYW5kIGVtYWlsIGFyZSBVVEY4IHN0cmluZ3MsIGhvd2V2ZXIgbmFtZSBtdXN0IG5vdAorICAgICAjIGNvbnRhaW4gJzwnIG9yIGxmIGFuZCBlbWFpbCBtdXN0IG5vdCBjb250YWluIGFueSBvZiB0aGUKKyAgICAgIyBmb2xsb3dpbmc6ICc8JywgJz4nLCBsZi4KKyAgICAgIworICBuYW1lICA6Oj0gIyB2YWxpZCBHSVQgYXV0aG9yL2NvbW1pdHRlciBuYW1lOworICBlbWFpbCA6Oj0gIyB2YWxpZCBHSVQgYXV0aG9yL2NvbW1pdHRlciBlbWFpbDsKKyAgdHMgICAgOjo9ICMgdGltZSBzaW5jZSB0aGUgZXBvY2ggaW4gc2Vjb25kcywgYXNjaWkgYmFzZTEwIG5vdGF0aW9uOworICB0eiAgICA6Oj0gIyBHSVQgc3R5bGUgdGltZXpvbmU7CisKKyAgICAgIyBub3RlOiBjb21tZW50cyBtYXkgYXBwZWFyIGFueXdoZXJlIGluIHRoZSBpbnB1dCwgZXhjZXB0CisgICAgICMgd2l0aGluIGEgZGF0YSBjb21tYW5kLiAgQW55IGZvcm0gb2YgdGhlIGRhdGEgY29tbWFuZAorICAgICAjIGFsd2F5cyBlc2NhcGVzIHRoZSByZWxhdGVkIGlucHV0IGZyb20gY29tbWVudCBwcm9jZXNzaW5nLgorICAgICAjCisgICAgICMgSW4gY2FzZSBpdCBpcyBub3QgY2xlYXIsIHRoZSAnIycgdGhhdCBzdGFydHMgdGhlIGNvbW1lbnQKKyAgICAgIyBtdXN0IGJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb24gdGhhdCB0aGUgbGluZSAoYW4gbGYgaGF2ZQorICAgICAjIHByZWNlZWRlZCBpdCkuCisgICAgICMKKyAgY29tbWVudCA6Oj0gJyMnIG5vdF9sZiogbGY7CisgIG5vdF9sZiAgOjo9ICMgQW55IGJ5dGUgdGhhdCBpcyBub3QgQVNDSUkgbmV3bGluZSAoTEYpOworKi8KKworI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAiZGVsdGEuaCIKKyNpbmNsdWRlICJwYWNrLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgImNzdW0tZmlsZS5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisKKyNkZWZpbmUgUEFDS19JRF9CSVRTIDE2CisjZGVmaW5lIE1BWF9QQUNLX0lEICgoMTw8UEFDS19JRF9CSVRTKS0xKQorI2RlZmluZSBERVBUSF9CSVRTIDEzCisjZGVmaW5lIE1BWF9ERVBUSCAoKDE8PERFUFRIX0JJVFMpLTEpCisKK3N0cnVjdCBvYmplY3RfZW50cnkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpuZXh0OworCXVpbnQzMl90IG9mZnNldDsKKwl1aW50MzJfdCB0eXBlIDogVFlQRV9CSVRTLAorCQlwYWNrX2lkIDogUEFDS19JRF9CSVRTLAorCQlkZXB0aCA6IERFUFRIX0JJVFM7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKK307CisKK3N0cnVjdCBvYmplY3RfZW50cnlfcG9vbAoreworCXN0cnVjdCBvYmplY3RfZW50cnlfcG9vbCAqbmV4dF9wb29sOworCXN0cnVjdCBvYmplY3RfZW50cnkgKm5leHRfZnJlZTsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICplbmQ7CisJc3RydWN0IG9iamVjdF9lbnRyeSBlbnRyaWVzW0ZMRVhfQVJSQVldOyAvKiBtb3JlICovCit9OworCitzdHJ1Y3QgbWFya19zZXQKK3sKKwl1bmlvbiB7CisJCXN0cnVjdCBvYmplY3RfZW50cnkgKm1hcmtlZFsxMDI0XTsKKwkJc3RydWN0IG1hcmtfc2V0ICpzZXRzWzEwMjRdOworCX0gZGF0YTsKKwl1bnNpZ25lZCBpbnQgc2hpZnQ7Cit9OworCitzdHJ1Y3QgbGFzdF9vYmplY3QKK3sKKwlzdHJ1Y3Qgc3RyYnVmIGRhdGE7CisJdWludDMyX3Qgb2Zmc2V0OworCXVuc2lnbmVkIGludCBkZXB0aDsKKwl1bnNpZ25lZCBub19zd2FwIDogMTsKK307CisKK3N0cnVjdCBtZW1fcG9vbAoreworCXN0cnVjdCBtZW1fcG9vbCAqbmV4dF9wb29sOworCWNoYXIgKm5leHRfZnJlZTsKKwljaGFyICplbmQ7CisJdWludG1heF90IHNwYWNlW0ZMRVhfQVJSQVldOyAvKiBtb3JlICovCit9OworCitzdHJ1Y3QgYXRvbV9zdHIKK3sKKwlzdHJ1Y3QgYXRvbV9zdHIgKm5leHRfYXRvbTsKKwl1bnNpZ25lZCBzaG9ydCBzdHJfbGVuOworCWNoYXIgc3RyX2RhdFtGTEVYX0FSUkFZXTsgLyogbW9yZSAqLworfTsKKworc3RydWN0IHRyZWVfY29udGVudDsKK3N0cnVjdCB0cmVlX2VudHJ5Cit7CisJc3RydWN0IHRyZWVfY29udGVudCAqdHJlZTsKKwlzdHJ1Y3QgYXRvbV9zdHIqIG5hbWU7CisJc3RydWN0IHRyZWVfZW50cnlfbXMKKwl7CisJCXVpbnQxNl90IG1vZGU7CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJfSB2ZXJzaW9uc1syXTsKK307CisKK3N0cnVjdCB0cmVlX2NvbnRlbnQKK3sKKwl1bnNpZ25lZCBpbnQgZW50cnlfY2FwYWNpdHk7IC8qIG11c3QgbWF0Y2ggYXZhaWxfdHJlZV9jb250ZW50ICovCisJdW5zaWduZWQgaW50IGVudHJ5X2NvdW50OworCXVuc2lnbmVkIGludCBkZWx0YV9kZXB0aDsKKwlzdHJ1Y3QgdHJlZV9lbnRyeSAqZW50cmllc1tGTEVYX0FSUkFZXTsgLyogbW9yZSAqLworfTsKKworc3RydWN0IGF2YWlsX3RyZWVfY29udGVudAoreworCXVuc2lnbmVkIGludCBlbnRyeV9jYXBhY2l0eTsgLyogbXVzdCBtYXRjaCB0cmVlX2NvbnRlbnQgKi8KKwlzdHJ1Y3QgYXZhaWxfdHJlZV9jb250ZW50ICpuZXh0X2F2YWlsOworfTsKKworc3RydWN0IGJyYW5jaAoreworCXN0cnVjdCBicmFuY2ggKnRhYmxlX25leHRfYnJhbmNoOworCXN0cnVjdCBicmFuY2ggKmFjdGl2ZV9uZXh0X2JyYW5jaDsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCB0cmVlX2VudHJ5IGJyYW5jaF90cmVlOworCXVpbnRtYXhfdCBsYXN0X2NvbW1pdDsKKwl1bnNpZ25lZCBhY3RpdmUgOiAxOworCXVuc2lnbmVkIHBhY2tfaWQgOiBQQUNLX0lEX0JJVFM7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKK307CisKK3N0cnVjdCB0YWcKK3sKKwlzdHJ1Y3QgdGFnICpuZXh0X3RhZzsKKwljb25zdCBjaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBwYWNrX2lkOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07Cit9OworCitzdHJ1Y3QgaGFzaF9saXN0Cit7CisJc3RydWN0IGhhc2hfbGlzdCAqbmV4dDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworfTsKKwordHlwZWRlZiBlbnVtIHsKKwlXSEVOU1BFQ19SQVcgPSAxLAorCVdIRU5TUEVDX1JGQzI4MjIsCisJV0hFTlNQRUNfTk9XLAorfSB3aGVuc3BlY190eXBlOworCitzdHJ1Y3QgcmVjZW50X2NvbW1hbmQKK3sKKwlzdHJ1Y3QgcmVjZW50X2NvbW1hbmQgKnByZXY7CisJc3RydWN0IHJlY2VudF9jb21tYW5kICpuZXh0OworCWNoYXIgKmJ1ZjsKK307CisKKy8qIENvbmZpZ3VyZWQgbGltaXRzIG9uIG91dHB1dCAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbWF4X2RlcHRoID0gMTA7CitzdGF0aWMgb2ZmX3QgbWF4X3BhY2tzaXplID0gKDFMTCA8PCAzMikgLSAxOworc3RhdGljIGludCBmb3JjZV91cGRhdGU7CitzdGF0aWMgaW50IHBhY2tfY29tcHJlc3Npb25fbGV2ZWwgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT047CitzdGF0aWMgaW50IHBhY2tfY29tcHJlc3Npb25fc2VlbjsKKworLyogU3RhdHMgYW5kIG1pc2MuIGNvdW50ZXJzICovCitzdGF0aWMgdWludG1heF90IGFsbG9jX2NvdW50Oworc3RhdGljIHVpbnRtYXhfdCBtYXJrc19zZXRfY291bnQ7CitzdGF0aWMgdWludG1heF90IG9iamVjdF9jb3VudF9ieV90eXBlWzEgPDwgVFlQRV9CSVRTXTsKK3N0YXRpYyB1aW50bWF4X3QgZHVwbGljYXRlX2NvdW50X2J5X3R5cGVbMSA8PCBUWVBFX0JJVFNdOworc3RhdGljIHVpbnRtYXhfdCBkZWx0YV9jb3VudF9ieV90eXBlWzEgPDwgVFlQRV9CSVRTXTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG9iamVjdF9jb3VudDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJyYW5jaF9jb3VudDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJyYW5jaF9sb2FkX2NvdW50Oworc3RhdGljIGludCBmYWlsdXJlOworc3RhdGljIEZJTEUgKnBhY2tfZWRnZXM7CisKKy8qIE1lbW9yeSBwb29scyAqLworc3RhdGljIHNpemVfdCBtZW1fcG9vbF9hbGxvYyA9IDIqMTAyNCoxMDI0IC0gc2l6ZW9mKHN0cnVjdCBtZW1fcG9vbCk7CitzdGF0aWMgc2l6ZV90IHRvdGFsX2FsbG9jZDsKK3N0YXRpYyBzdHJ1Y3QgbWVtX3Bvb2wgKm1lbV9wb29sOworCisvKiBBdG9tIG1hbmFnZW1lbnQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRvbV90YWJsZV9zeiA9IDQ0NTE7CitzdGF0aWMgdW5zaWduZWQgaW50IGF0b21fY250Oworc3RhdGljIHN0cnVjdCBhdG9tX3N0ciAqKmF0b21fdGFibGU7CisKKy8qIFRoZSAucGFjayBmaWxlIGJlaW5nIGdlbmVyYXRlZCAqLworc3RhdGljIHVuc2lnbmVkIGludCBwYWNrX2lkOworc3RhdGljIHN0cnVjdCBwYWNrZWRfZ2l0ICpwYWNrX2RhdGE7CitzdGF0aWMgc3RydWN0IHBhY2tlZF9naXQgKiphbGxfcGFja3M7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWNrX3NpemU7CisKKy8qIFRhYmxlIG9mIG9iamVjdHMgd2UndmUgd3JpdHRlbi4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgb2JqZWN0X2VudHJ5X2FsbG9jID0gNTAwMDsKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X2VudHJ5X3Bvb2wgKmJsb2NrczsKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpvYmplY3RfdGFibGVbMSA8PCAxNl07CitzdGF0aWMgc3RydWN0IG1hcmtfc2V0ICptYXJrczsKK3N0YXRpYyBjb25zdCBjaGFyKiBtYXJrX2ZpbGU7CisKKy8qIE91ciBsYXN0IGJsb2IgKi8KK3N0YXRpYyBzdHJ1Y3QgbGFzdF9vYmplY3QgbGFzdF9ibG9iID0geyBTVFJCVUZfSU5JVCwgMCwgMCwgMCB9OworCisvKiBUcmVlIG1hbmFnZW1lbnQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdHJlZV9lbnRyeV9hbGxvYyA9IDEwMDA7CitzdGF0aWMgdm9pZCAqYXZhaWxfdHJlZV9lbnRyeTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXZhaWxfdHJlZV90YWJsZV9zeiA9IDEwMDsKK3N0YXRpYyBzdHJ1Y3QgYXZhaWxfdHJlZV9jb250ZW50ICoqYXZhaWxfdHJlZV90YWJsZTsKK3N0YXRpYyBzdHJ1Y3Qgc3RyYnVmIG9sZF90cmVlID0gU1RSQlVGX0lOSVQ7CitzdGF0aWMgc3RydWN0IHN0cmJ1ZiBuZXdfdHJlZSA9IFNUUkJVRl9JTklUOworCisvKiBCcmFuY2ggZGF0YSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbWF4X2FjdGl2ZV9icmFuY2hlcyA9IDU7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBjdXJfYWN0aXZlX2JyYW5jaGVzOworc3RhdGljIHVuc2lnbmVkIGxvbmcgYnJhbmNoX3RhYmxlX3N6ID0gMTAzOTsKK3N0YXRpYyBzdHJ1Y3QgYnJhbmNoICoqYnJhbmNoX3RhYmxlOworc3RhdGljIHN0cnVjdCBicmFuY2ggKmFjdGl2ZV9icmFuY2hlczsKKworLyogVGFnIGRhdGEgKi8KK3N0YXRpYyBzdHJ1Y3QgdGFnICpmaXJzdF90YWc7CitzdGF0aWMgc3RydWN0IHRhZyAqbGFzdF90YWc7CisKKy8qIElucHV0IHN0cmVhbSBwYXJzaW5nICovCitzdGF0aWMgd2hlbnNwZWNfdHlwZSB3aGVuc3BlYyA9IFdIRU5TUEVDX1JBVzsKK3N0YXRpYyBzdHJ1Y3Qgc3RyYnVmIGNvbW1hbmRfYnVmID0gU1RSQlVGX0lOSVQ7CitzdGF0aWMgaW50IHVucmVhZF9jb21tYW5kX2J1ZjsKK3N0YXRpYyBzdHJ1Y3QgcmVjZW50X2NvbW1hbmQgY21kX2hpc3QgPSB7JmNtZF9oaXN0LCAmY21kX2hpc3QsIE5VTEx9Oworc3RhdGljIHN0cnVjdCByZWNlbnRfY29tbWFuZCAqY21kX3RhaWwgPSAmY21kX2hpc3Q7CitzdGF0aWMgc3RydWN0IHJlY2VudF9jb21tYW5kICpyY19mcmVlOworc3RhdGljIHVuc2lnbmVkIGludCBjbWRfc2F2ZSA9IDEwMDsKK3N0YXRpYyB1aW50bWF4X3QgbmV4dF9tYXJrOworc3RhdGljIHN0cnVjdCBzdHJidWYgbmV3X2RhdGEgPSBTVFJCVUZfSU5JVDsKKworc3RhdGljIHZvaWQgd3JpdGVfYnJhbmNoX3JlcG9ydChGSUxFICpycHQsIHN0cnVjdCBicmFuY2ggKmIpCit7CisJZnByaW50ZihycHQsICIlczpcbiIsIGItPm5hbWUpOworCisJZnByaW50ZihycHQsICIgIHN0YXR1cyAgICAgIDoiKTsKKwlpZiAoYi0+YWN0aXZlKQorCQlmcHV0cygiIGFjdGl2ZSIsIHJwdCk7CisJaWYgKGItPmJyYW5jaF90cmVlLnRyZWUpCisJCWZwdXRzKCIgbG9hZGVkIiwgcnB0KTsKKwlpZiAoaXNfbnVsbF9zaGExKGItPmJyYW5jaF90cmVlLnZlcnNpb25zWzFdLnNoYTEpKQorCQlmcHV0cygiIGRpcnR5IiwgcnB0KTsKKwlmcHV0YygnXG4nLCBycHQpOworCisJZnByaW50ZihycHQsICIgIHRpcCBjb21taXQgIDogJXNcbiIsIHNoYTFfdG9faGV4KGItPnNoYTEpKTsKKwlmcHJpbnRmKHJwdCwgIiAgb2xkIHRyZWUgICAgOiAlc1xuIiwgc2hhMV90b19oZXgoYi0+YnJhbmNoX3RyZWUudmVyc2lvbnNbMF0uc2hhMSkpOworCWZwcmludGYocnB0LCAiICBjdXIgdHJlZSAgICA6ICVzXG4iLCBzaGExX3RvX2hleChiLT5icmFuY2hfdHJlZS52ZXJzaW9uc1sxXS5zaGExKSk7CisJZnByaW50ZihycHQsICIgIGNvbW1pdCBjbG9jazogJSIgUFJJdU1BWCAiXG4iLCBiLT5sYXN0X2NvbW1pdCk7CisKKwlmcHV0cygiICBsYXN0IHBhY2sgICA6ICIsIHJwdCk7CisJaWYgKGItPnBhY2tfaWQgPCBNQVhfUEFDS19JRCkKKwkJZnByaW50ZihycHQsICIldSIsIGItPnBhY2tfaWQpOworCWZwdXRjKCdcbicsIHJwdCk7CisKKwlmcHV0YygnXG4nLCBycHQpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX21hcmtzX2hlbHBlcihGSUxFICosIHVpbnRtYXhfdCwgc3RydWN0IG1hcmtfc2V0ICopOworCitzdGF0aWMgdm9pZCB3cml0ZV9jcmFzaF9yZXBvcnQoY29uc3QgY2hhciAqZXJyKQoreworCWNoYXIgKmxvYyA9IGdpdF9wYXRoKCJmYXN0X2ltcG9ydF9jcmFzaF8lZCIsIGdldHBpZCgpKTsKKwlGSUxFICpycHQgPSBmb3Blbihsb2MsICJ3Iik7CisJc3RydWN0IGJyYW5jaCAqYjsKKwl1bnNpZ25lZCBsb25nIGx1OworCXN0cnVjdCByZWNlbnRfY29tbWFuZCAqcmM7CisKKwlpZiAoIXJwdCkgeworCQllcnJvcigiY2FuJ3Qgd3JpdGUgY3Jhc2ggcmVwb3J0ICVzOiAlcyIsIGxvYywgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuOworCX0KKworCWZwcmludGYoc3RkZXJyLCAiZmFzdC1pbXBvcnQ6IGR1bXBpbmcgY3Jhc2ggcmVwb3J0IHRvICVzXG4iLCBsb2MpOworCisJZnByaW50ZihycHQsICJmYXN0LWltcG9ydCBjcmFzaCByZXBvcnQ6XG4iKTsKKwlmcHJpbnRmKHJwdCwgIiAgICBmYXN0LWltcG9ydCBwcm9jZXNzOiAlZFxuIiwgZ2V0cGlkKCkpOworCWZwcmludGYocnB0LCAiICAgIHBhcmVudCBwcm9jZXNzICAgICA6ICVkXG4iLCBnZXRwcGlkKCkpOworCWZwcmludGYocnB0LCAiICAgIGF0ICVzXG4iLCBzaG93X2RhdGUodGltZShOVUxMKSwgMCwgREFURV9MT0NBTCkpOworCWZwdXRjKCdcbicsIHJwdCk7CisKKwlmcHV0cygiZmF0YWw6ICIsIHJwdCk7CisJZnB1dHMoZXJyLCBycHQpOworCWZwdXRjKCdcbicsIHJwdCk7CisKKwlmcHV0YygnXG4nLCBycHQpOworCWZwdXRzKCJNb3N0IFJlY2VudCBDb21tYW5kcyBCZWZvcmUgQ3Jhc2hcbiIsIHJwdCk7CisJZnB1dHMoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgcnB0KTsKKwlmb3IgKHJjID0gY21kX2hpc3QubmV4dDsgcmMgIT0gJmNtZF9oaXN0OyByYyA9IHJjLT5uZXh0KSB7CisJCWlmIChyYy0+bmV4dCA9PSAmY21kX2hpc3QpCisJCQlmcHV0cygiKiAiLCBycHQpOworCQllbHNlCisJCQlmcHV0cygiICAiLCBycHQpOworCQlmcHV0cyhyYy0+YnVmLCBycHQpOworCQlmcHV0YygnXG4nLCBycHQpOworCX0KKworCWZwdXRjKCdcbicsIHJwdCk7CisJZnB1dHMoIkFjdGl2ZSBCcmFuY2ggTFJVXG4iLCBycHQpOworCWZwdXRzKCItLS0tLS0tLS0tLS0tLS0tLVxuIiwgcnB0KTsKKwlmcHJpbnRmKHJwdCwgIiAgICBhY3RpdmVfYnJhbmNoZXMgPSAlbHUgY3VyLCAlbHUgbWF4XG4iLAorCQljdXJfYWN0aXZlX2JyYW5jaGVzLAorCQltYXhfYWN0aXZlX2JyYW5jaGVzKTsKKwlmcHV0YygnXG4nLCBycHQpOworCWZwdXRzKCIgIHBvcyAgY2xvY2sgbmFtZVxuIiwgcnB0KTsKKwlmcHV0cygiICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5cbiIsIHJwdCk7CisJZm9yIChiID0gYWN0aXZlX2JyYW5jaGVzLCBsdSA9IDA7IGI7IGIgPSBiLT5hY3RpdmVfbmV4dF9icmFuY2gpCisJCWZwcmludGYocnB0LCAiICAlMmx1KSAlNiIgUFJJdU1BWCIgJXNcbiIsCisJCQkrK2x1LCBiLT5sYXN0X2NvbW1pdCwgYi0+bmFtZSk7CisKKwlmcHV0YygnXG4nLCBycHQpOworCWZwdXRzKCJJbmFjdGl2ZSBCcmFuY2hlc1xuIiwgcnB0KTsKKwlmcHV0cygiLS0tLS0tLS0tLS0tLS0tLS1cbiIsIHJwdCk7CisJZm9yIChsdSA9IDA7IGx1IDwgYnJhbmNoX3RhYmxlX3N6OyBsdSsrKSB7CisJCWZvciAoYiA9IGJyYW5jaF90YWJsZVtsdV07IGI7IGIgPSBiLT50YWJsZV9uZXh0X2JyYW5jaCkKKwkJCXdyaXRlX2JyYW5jaF9yZXBvcnQocnB0LCBiKTsKKwl9CisKKwlpZiAoZmlyc3RfdGFnKSB7CisJCXN0cnVjdCB0YWcgKnRnOworCQlmcHV0YygnXG4nLCBycHQpOworCQlmcHV0cygiQW5ub3RhdGVkIFRhZ3NcbiIsIHJwdCk7CisJCWZwdXRzKCItLS0tLS0tLS0tLS0tLVxuIiwgcnB0KTsKKwkJZm9yICh0ZyA9IGZpcnN0X3RhZzsgdGc7IHRnID0gdGctPm5leHRfdGFnKSB7CisJCQlmcHV0cyhzaGExX3RvX2hleCh0Zy0+c2hhMSksIHJwdCk7CisJCQlmcHV0YygnICcsIHJwdCk7CisJCQlmcHV0cyh0Zy0+bmFtZSwgcnB0KTsKKwkJCWZwdXRjKCdcbicsIHJwdCk7CisJCX0KKwl9CisKKwlmcHV0YygnXG4nLCBycHQpOworCWZwdXRzKCJNYXJrc1xuIiwgcnB0KTsKKwlmcHV0cygiLS0tLS1cbiIsIHJwdCk7CisJaWYgKG1hcmtfZmlsZSkKKwkJZnByaW50ZihycHQsICIgIGV4cG9ydGVkIHRvICVzXG4iLCBtYXJrX2ZpbGUpOworCWVsc2UKKwkJZHVtcF9tYXJrc19oZWxwZXIocnB0LCAwLCBtYXJrcyk7CisKKwlmcHV0YygnXG4nLCBycHQpOworCWZwdXRzKCItLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBycHQpOworCWZwdXRzKCJFTkQgT0YgQ1JBU0ggUkVQT1JUXG4iLCBycHQpOworCWZjbG9zZShycHQpOworfQorCitzdGF0aWMgdm9pZCBlbmRfcGFja2ZpbGUodm9pZCk7CitzdGF0aWMgdm9pZCB1bmtlZXBfYWxsX3BhY2tzKHZvaWQpOworc3RhdGljIHZvaWQgZHVtcF9tYXJrcyh2b2lkKTsKKworc3RhdGljIE5PUkVUVVJOIHZvaWQgZGllX25pY2VseShjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKQoreworCXN0YXRpYyBpbnQgem9tYmllOworCWNoYXIgbWVzc2FnZVsyICogUEFUSF9NQVhdOworCisJdnNucHJpbnRmKG1lc3NhZ2UsIHNpemVvZihtZXNzYWdlKSwgZXJyLCBwYXJhbXMpOworCWZwdXRzKCJmYXRhbDogIiwgc3RkZXJyKTsKKwlmcHV0cyhtZXNzYWdlLCBzdGRlcnIpOworCWZwdXRjKCdcbicsIHN0ZGVycik7CisKKwlpZiAoIXpvbWJpZSkgeworCQl6b21iaWUgPSAxOworCQl3cml0ZV9jcmFzaF9yZXBvcnQobWVzc2FnZSk7CisJCWVuZF9wYWNrZmlsZSgpOworCQl1bmtlZXBfYWxsX3BhY2tzKCk7CisJCWR1bXBfbWFya3MoKTsKKwl9CisJZXhpdCgxMjgpOworfQorCitzdGF0aWMgdm9pZCBhbGxvY19vYmplY3RzKHVuc2lnbmVkIGludCBjbnQpCit7CisJc3RydWN0IG9iamVjdF9lbnRyeV9wb29sICpiOworCisJYiA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBvYmplY3RfZW50cnlfcG9vbCkKKwkJKyBjbnQgKiBzaXplb2Yoc3RydWN0IG9iamVjdF9lbnRyeSkpOworCWItPm5leHRfcG9vbCA9IGJsb2NrczsKKwliLT5uZXh0X2ZyZWUgPSBiLT5lbnRyaWVzOworCWItPmVuZCA9IGItPmVudHJpZXMgKyBjbnQ7CisJYmxvY2tzID0gYjsKKwlhbGxvY19jb3VudCArPSBjbnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpuZXdfb2JqZWN0KHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqZTsKKworCWlmIChibG9ja3MtPm5leHRfZnJlZSA9PSBibG9ja3MtPmVuZCkKKwkJYWxsb2Nfb2JqZWN0cyhvYmplY3RfZW50cnlfYWxsb2MpOworCisJZSA9IGJsb2Nrcy0+bmV4dF9mcmVlKys7CisJaGFzaGNweShlLT5zaGExLCBzaGExKTsKKwlyZXR1cm4gZTsKK30KKworc3RhdGljIHN0cnVjdCBvYmplY3RfZW50cnkgKmZpbmRfb2JqZWN0KHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJdW5zaWduZWQgaW50IGggPSBzaGExWzBdIDw8IDggfCBzaGExWzFdOworCXN0cnVjdCBvYmplY3RfZW50cnkgKmU7CisJZm9yIChlID0gb2JqZWN0X3RhYmxlW2hdOyBlOyBlID0gZS0+bmV4dCkKKwkJaWYgKCFoYXNoY21wKHNoYTEsIGUtPnNoYTEpKQorCQkJcmV0dXJuIGU7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICppbnNlcnRfb2JqZWN0KHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJdW5zaWduZWQgaW50IGggPSBzaGExWzBdIDw8IDggfCBzaGExWzFdOworCXN0cnVjdCBvYmplY3RfZW50cnkgKmUgPSBvYmplY3RfdGFibGVbaF07CisJc3RydWN0IG9iamVjdF9lbnRyeSAqcCA9IE5VTEw7CisKKwl3aGlsZSAoZSkgeworCQlpZiAoIWhhc2hjbXAoc2hhMSwgZS0+c2hhMSkpCisJCQlyZXR1cm4gZTsKKwkJcCA9IGU7CisJCWUgPSBlLT5uZXh0OworCX0KKworCWUgPSBuZXdfb2JqZWN0KHNoYTEpOworCWUtPm5leHQgPSBOVUxMOworCWUtPm9mZnNldCA9IDA7CisJaWYgKHApCisJCXAtPm5leHQgPSBlOworCWVsc2UKKwkJb2JqZWN0X3RhYmxlW2hdID0gZTsKKwlyZXR1cm4gZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBoY19zdHIoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbikKK3sKKwl1bnNpZ25lZCBpbnQgciA9IDA7CisJd2hpbGUgKGxlbi0tID4gMCkKKwkJciA9IHIgKiAzMSArICpzKys7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkICpwb29sX2FsbG9jKHNpemVfdCBsZW4pCit7CisJc3RydWN0IG1lbV9wb29sICpwOworCXZvaWQgKnI7CisKKwlmb3IgKHAgPSBtZW1fcG9vbDsgcDsgcCA9IHAtPm5leHRfcG9vbCkKKwkJaWYgKChwLT5lbmQgLSBwLT5uZXh0X2ZyZWUgPj0gbGVuKSkKKwkJCWJyZWFrOworCisJaWYgKCFwKSB7CisJCWlmIChsZW4gPj0gKG1lbV9wb29sX2FsbG9jLzIpKSB7CisJCQl0b3RhbF9hbGxvY2QgKz0gbGVuOworCQkJcmV0dXJuIHhtYWxsb2MobGVuKTsKKwkJfQorCQl0b3RhbF9hbGxvY2QgKz0gc2l6ZW9mKHN0cnVjdCBtZW1fcG9vbCkgKyBtZW1fcG9vbF9hbGxvYzsKKwkJcCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBtZW1fcG9vbCkgKyBtZW1fcG9vbF9hbGxvYyk7CisJCXAtPm5leHRfcG9vbCA9IG1lbV9wb29sOworCQlwLT5uZXh0X2ZyZWUgPSAoY2hhciAqKSBwLT5zcGFjZTsKKwkJcC0+ZW5kID0gcC0+bmV4dF9mcmVlICsgbWVtX3Bvb2xfYWxsb2M7CisJCW1lbV9wb29sID0gcDsKKwl9CisKKwlyID0gcC0+bmV4dF9mcmVlOworCS8qIHJvdW5kIG91dCB0byBhICd1aW50bWF4X3QnIGFsaWdubWVudCAqLworCWlmIChsZW4gJiAoc2l6ZW9mKHVpbnRtYXhfdCkgLSAxKSkKKwkJbGVuICs9IHNpemVvZih1aW50bWF4X3QpIC0gKGxlbiAmIChzaXplb2YodWludG1heF90KSAtIDEpKTsKKwlwLT5uZXh0X2ZyZWUgKz0gbGVuOworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCAqcG9vbF9jYWxsb2Moc2l6ZV90IGNvdW50LCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3QgbGVuID0gY291bnQgKiBzaXplOworCXZvaWQgKnIgPSBwb29sX2FsbG9jKGxlbik7CisJbWVtc2V0KHIsIDAsIGxlbik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBjaGFyICpwb29sX3N0cmR1cChjb25zdCBjaGFyICpzKQoreworCWNoYXIgKnIgPSBwb29sX2FsbG9jKHN0cmxlbihzKSArIDEpOworCXN0cmNweShyLCBzKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgaW5zZXJ0X21hcmsodWludG1heF90IGlkbnVtLCBzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpvZSkKK3sKKwlzdHJ1Y3QgbWFya19zZXQgKnMgPSBtYXJrczsKKwl3aGlsZSAoKGlkbnVtID4+IHMtPnNoaWZ0KSA+PSAxMDI0KSB7CisJCXMgPSBwb29sX2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IG1hcmtfc2V0KSk7CisJCXMtPnNoaWZ0ID0gbWFya3MtPnNoaWZ0ICsgMTA7CisJCXMtPmRhdGEuc2V0c1swXSA9IG1hcmtzOworCQltYXJrcyA9IHM7CisJfQorCXdoaWxlIChzLT5zaGlmdCkgeworCQl1aW50bWF4X3QgaSA9IGlkbnVtID4+IHMtPnNoaWZ0OworCQlpZG51bSAtPSBpIDw8IHMtPnNoaWZ0OworCQlpZiAoIXMtPmRhdGEuc2V0c1tpXSkgeworCQkJcy0+ZGF0YS5zZXRzW2ldID0gcG9vbF9jYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBtYXJrX3NldCkpOworCQkJcy0+ZGF0YS5zZXRzW2ldLT5zaGlmdCA9IHMtPnNoaWZ0IC0gMTA7CisJCX0KKwkJcyA9IHMtPmRhdGEuc2V0c1tpXTsKKwl9CisJaWYgKCFzLT5kYXRhLm1hcmtlZFtpZG51bV0pCisJCW1hcmtzX3NldF9jb3VudCsrOworCXMtPmRhdGEubWFya2VkW2lkbnVtXSA9IG9lOworfQorCitzdGF0aWMgc3RydWN0IG9iamVjdF9lbnRyeSAqZmluZF9tYXJrKHVpbnRtYXhfdCBpZG51bSkKK3sKKwl1aW50bWF4X3Qgb3JpZ19pZG51bSA9IGlkbnVtOworCXN0cnVjdCBtYXJrX3NldCAqcyA9IG1hcmtzOworCXN0cnVjdCBvYmplY3RfZW50cnkgKm9lID0gTlVMTDsKKwlpZiAoKGlkbnVtID4+IHMtPnNoaWZ0KSA8IDEwMjQpIHsKKwkJd2hpbGUgKHMgJiYgcy0+c2hpZnQpIHsKKwkJCXVpbnRtYXhfdCBpID0gaWRudW0gPj4gcy0+c2hpZnQ7CisJCQlpZG51bSAtPSBpIDw8IHMtPnNoaWZ0OworCQkJcyA9IHMtPmRhdGEuc2V0c1tpXTsKKwkJfQorCQlpZiAocykKKwkJCW9lID0gcy0+ZGF0YS5tYXJrZWRbaWRudW1dOworCX0KKwlpZiAoIW9lKQorCQlkaWUoIm1hcmsgOiUiIFBSSXVNQVggIiBub3QgZGVjbGFyZWQiLCBvcmlnX2lkbnVtKTsKKwlyZXR1cm4gb2U7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXRvbV9zdHIgKnRvX2F0b20oY29uc3QgY2hhciAqcywgdW5zaWduZWQgc2hvcnQgbGVuKQoreworCXVuc2lnbmVkIGludCBoYyA9IGhjX3N0cihzLCBsZW4pICUgYXRvbV90YWJsZV9zejsKKwlzdHJ1Y3QgYXRvbV9zdHIgKmM7CisKKwlmb3IgKGMgPSBhdG9tX3RhYmxlW2hjXTsgYzsgYyA9IGMtPm5leHRfYXRvbSkKKwkJaWYgKGMtPnN0cl9sZW4gPT0gbGVuICYmICFzdHJuY21wKHMsIGMtPnN0cl9kYXQsIGxlbikpCisJCQlyZXR1cm4gYzsKKworCWMgPSBwb29sX2FsbG9jKHNpemVvZihzdHJ1Y3QgYXRvbV9zdHIpICsgbGVuICsgMSk7CisJYy0+c3RyX2xlbiA9IGxlbjsKKwlzdHJuY3B5KGMtPnN0cl9kYXQsIHMsIGxlbik7CisJYy0+c3RyX2RhdFtsZW5dID0gMDsKKwljLT5uZXh0X2F0b20gPSBhdG9tX3RhYmxlW2hjXTsKKwlhdG9tX3RhYmxlW2hjXSA9IGM7CisJYXRvbV9jbnQrKzsKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIHN0cnVjdCBicmFuY2ggKmxvb2t1cF9icmFuY2goY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBpbnQgaGMgPSBoY19zdHIobmFtZSwgc3RybGVuKG5hbWUpKSAlIGJyYW5jaF90YWJsZV9zejsKKwlzdHJ1Y3QgYnJhbmNoICpiOworCisJZm9yIChiID0gYnJhbmNoX3RhYmxlW2hjXTsgYjsgYiA9IGItPnRhYmxlX25leHRfYnJhbmNoKQorCQlpZiAoIXN0cmNtcChuYW1lLCBiLT5uYW1lKSkKKwkJCXJldHVybiBiOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGJyYW5jaCAqbmV3X2JyYW5jaChjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGludCBoYyA9IGhjX3N0cihuYW1lLCBzdHJsZW4obmFtZSkpICUgYnJhbmNoX3RhYmxlX3N6OworCXN0cnVjdCBicmFuY2gqIGIgPSBsb29rdXBfYnJhbmNoKG5hbWUpOworCisJaWYgKGIpCisJCWRpZSgiSW52YWxpZCBhdHRlbXB0IHRvIGNyZWF0ZSBkdXBsaWNhdGUgYnJhbmNoOiAlcyIsIG5hbWUpOworCXN3aXRjaCAoY2hlY2tfcmVmX2Zvcm1hdChuYW1lKSkgeworCWNhc2UgMDogYnJlYWs7IC8qIGl0cyB2YWxpZCAqLworCWNhc2UgQ0hFQ0tfUkVGX0ZPUk1BVF9PTkVMRVZFTDoKKwkJYnJlYWs7IC8qIHZhbGlkLCBidXQgdG9vIGZldyAnLycsIGFsbG93IGFueXdheSAqLworCWRlZmF1bHQ6CisJCWRpZSgiQnJhbmNoIG5hbWUgZG9lc24ndCBjb25mb3JtIHRvIEdJVCBzdGFuZGFyZHM6ICVzIiwgbmFtZSk7CisJfQorCisJYiA9IHBvb2xfY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgYnJhbmNoKSk7CisJYi0+bmFtZSA9IHBvb2xfc3RyZHVwKG5hbWUpOworCWItPnRhYmxlX25leHRfYnJhbmNoID0gYnJhbmNoX3RhYmxlW2hjXTsKKwliLT5icmFuY2hfdHJlZS52ZXJzaW9uc1swXS5tb2RlID0gU19JRkRJUjsKKwliLT5icmFuY2hfdHJlZS52ZXJzaW9uc1sxXS5tb2RlID0gU19JRkRJUjsKKwliLT5hY3RpdmUgPSAwOworCWItPnBhY2tfaWQgPSBNQVhfUEFDS19JRDsKKwlicmFuY2hfdGFibGVbaGNdID0gYjsKKwlicmFuY2hfY291bnQrKzsKKwlyZXR1cm4gYjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBoY19lbnRyaWVzKHVuc2lnbmVkIGludCBjbnQpCit7CisJY250ID0gY250ICYgNyA/IChjbnQgLyA4KSArIDEgOiBjbnQgLyA4OworCXJldHVybiBjbnQgPCBhdmFpbF90cmVlX3RhYmxlX3N6ID8gY250IDogYXZhaWxfdHJlZV90YWJsZV9zeiAtIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHJlZV9jb250ZW50ICpuZXdfdHJlZV9jb250ZW50KHVuc2lnbmVkIGludCBjbnQpCit7CisJc3RydWN0IGF2YWlsX3RyZWVfY29udGVudCAqZiwgKmwgPSBOVUxMOworCXN0cnVjdCB0cmVlX2NvbnRlbnQgKnQ7CisJdW5zaWduZWQgaW50IGhjID0gaGNfZW50cmllcyhjbnQpOworCisJZm9yIChmID0gYXZhaWxfdHJlZV90YWJsZVtoY107IGY7IGwgPSBmLCBmID0gZi0+bmV4dF9hdmFpbCkKKwkJaWYgKGYtPmVudHJ5X2NhcGFjaXR5ID49IGNudCkKKwkJCWJyZWFrOworCisJaWYgKGYpIHsKKwkJaWYgKGwpCisJCQlsLT5uZXh0X2F2YWlsID0gZi0+bmV4dF9hdmFpbDsKKwkJZWxzZQorCQkJYXZhaWxfdHJlZV90YWJsZVtoY10gPSBmLT5uZXh0X2F2YWlsOworCX0gZWxzZSB7CisJCWNudCA9IGNudCAmIDcgPyAoKGNudCAvIDgpICsgMSkgKiA4IDogY250OworCQlmID0gcG9vbF9hbGxvYyhzaXplb2YoKnQpICsgc2l6ZW9mKHQtPmVudHJpZXNbMF0pICogY250KTsKKwkJZi0+ZW50cnlfY2FwYWNpdHkgPSBjbnQ7CisJfQorCisJdCA9IChzdHJ1Y3QgdHJlZV9jb250ZW50KilmOworCXQtPmVudHJ5X2NvdW50ID0gMDsKKwl0LT5kZWx0YV9kZXB0aCA9IDA7CisJcmV0dXJuIHQ7Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfdHJlZV9lbnRyeShzdHJ1Y3QgdHJlZV9lbnRyeSAqZSk7CitzdGF0aWMgdm9pZCByZWxlYXNlX3RyZWVfY29udGVudChzdHJ1Y3QgdHJlZV9jb250ZW50ICp0KQoreworCXN0cnVjdCBhdmFpbF90cmVlX2NvbnRlbnQgKmYgPSAoc3RydWN0IGF2YWlsX3RyZWVfY29udGVudCopdDsKKwl1bnNpZ25lZCBpbnQgaGMgPSBoY19lbnRyaWVzKGYtPmVudHJ5X2NhcGFjaXR5KTsKKwlmLT5uZXh0X2F2YWlsID0gYXZhaWxfdHJlZV90YWJsZVtoY107CisJYXZhaWxfdHJlZV90YWJsZVtoY10gPSBmOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX3RyZWVfY29udGVudF9yZWN1cnNpdmUoc3RydWN0IHRyZWVfY29udGVudCAqdCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgdC0+ZW50cnlfY291bnQ7IGkrKykKKwkJcmVsZWFzZV90cmVlX2VudHJ5KHQtPmVudHJpZXNbaV0pOworCXJlbGVhc2VfdHJlZV9jb250ZW50KHQpOworfQorCitzdGF0aWMgc3RydWN0IHRyZWVfY29udGVudCAqZ3Jvd190cmVlX2NvbnRlbnQoCisJc3RydWN0IHRyZWVfY29udGVudCAqdCwKKwlpbnQgYW10KQoreworCXN0cnVjdCB0cmVlX2NvbnRlbnQgKnIgPSBuZXdfdHJlZV9jb250ZW50KHQtPmVudHJ5X2NvdW50ICsgYW10KTsKKwlyLT5lbnRyeV9jb3VudCA9IHQtPmVudHJ5X2NvdW50OworCXItPmRlbHRhX2RlcHRoID0gdC0+ZGVsdGFfZGVwdGg7CisJbWVtY3B5KHItPmVudHJpZXMsdC0+ZW50cmllcyx0LT5lbnRyeV9jb3VudCpzaXplb2YodC0+ZW50cmllc1swXSkpOworCXJlbGVhc2VfdHJlZV9jb250ZW50KHQpOworCXJldHVybiByOworfQorCitzdGF0aWMgc3RydWN0IHRyZWVfZW50cnkgKm5ld190cmVlX2VudHJ5KHZvaWQpCit7CisJc3RydWN0IHRyZWVfZW50cnkgKmU7CisKKwlpZiAoIWF2YWlsX3RyZWVfZW50cnkpIHsKKwkJdW5zaWduZWQgaW50IG4gPSB0cmVlX2VudHJ5X2FsbG9jOworCQl0b3RhbF9hbGxvY2QgKz0gbiAqIHNpemVvZihzdHJ1Y3QgdHJlZV9lbnRyeSk7CisJCWF2YWlsX3RyZWVfZW50cnkgPSBlID0geG1hbGxvYyhuICogc2l6ZW9mKHN0cnVjdCB0cmVlX2VudHJ5KSk7CisJCXdoaWxlIChuLS0gPiAxKSB7CisJCQkqKCh2b2lkKiopZSkgPSBlICsgMTsKKwkJCWUrKzsKKwkJfQorCQkqKCh2b2lkKiopZSkgPSBOVUxMOworCX0KKworCWUgPSBhdmFpbF90cmVlX2VudHJ5OworCWF2YWlsX3RyZWVfZW50cnkgPSAqKCh2b2lkKiopZSk7CisJcmV0dXJuIGU7Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfdHJlZV9lbnRyeShzdHJ1Y3QgdHJlZV9lbnRyeSAqZSkKK3sKKwlpZiAoZS0+dHJlZSkKKwkJcmVsZWFzZV90cmVlX2NvbnRlbnRfcmVjdXJzaXZlKGUtPnRyZWUpOworCSooKHZvaWQqKillKSA9IGF2YWlsX3RyZWVfZW50cnk7CisJYXZhaWxfdHJlZV9lbnRyeSA9IGU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHJlZV9jb250ZW50ICpkdXBfdHJlZV9jb250ZW50KHN0cnVjdCB0cmVlX2NvbnRlbnQgKnMpCit7CisJc3RydWN0IHRyZWVfY29udGVudCAqZDsKKwlzdHJ1Y3QgdHJlZV9lbnRyeSAqYSwgKmI7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoIXMpCisJCXJldHVybiBOVUxMOworCWQgPSBuZXdfdHJlZV9jb250ZW50KHMtPmVudHJ5X2NvdW50KTsKKwlmb3IgKGkgPSAwOyBpIDwgcy0+ZW50cnlfY291bnQ7IGkrKykgeworCQlhID0gcy0+ZW50cmllc1tpXTsKKwkJYiA9IG5ld190cmVlX2VudHJ5KCk7CisJCW1lbWNweShiLCBhLCBzaXplb2YoKmEpKTsKKwkJaWYgKGEtPnRyZWUgJiYgaXNfbnVsbF9zaGExKGItPnZlcnNpb25zWzFdLnNoYTEpKQorCQkJYi0+dHJlZSA9IGR1cF90cmVlX2NvbnRlbnQoYS0+dHJlZSk7CisJCWVsc2UKKwkJCWItPnRyZWUgPSBOVUxMOworCQlkLT5lbnRyaWVzW2ldID0gYjsKKwl9CisJZC0+ZW50cnlfY291bnQgPSBzLT5lbnRyeV9jb3VudDsKKwlkLT5kZWx0YV9kZXB0aCA9IHMtPmRlbHRhX2RlcHRoOworCisJcmV0dXJuIGQ7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X3BhY2tmaWxlKHZvaWQpCit7CisJc3RhdGljIGNoYXIgdG1wZmlsZVtQQVRIX01BWF07CisJc3RydWN0IHBhY2tlZF9naXQgKnA7CisJc3RydWN0IHBhY2tfaGVhZGVyIGhkcjsKKwlpbnQgcGFja19mZDsKKworCXNucHJpbnRmKHRtcGZpbGUsIHNpemVvZih0bXBmaWxlKSwKKwkJIiVzL3RtcF9wYWNrX1hYWFhYWCIsIGdldF9vYmplY3RfZGlyZWN0b3J5KCkpOworCXBhY2tfZmQgPSB4bWtzdGVtcCh0bXBmaWxlKTsKKwlwID0geGNhbGxvYygxLCBzaXplb2YoKnApICsgc3RybGVuKHRtcGZpbGUpICsgMik7CisJc3RyY3B5KHAtPnBhY2tfbmFtZSwgdG1wZmlsZSk7CisJcC0+cGFja19mZCA9IHBhY2tfZmQ7CisKKwloZHIuaGRyX3NpZ25hdHVyZSA9IGh0b25sKFBBQ0tfU0lHTkFUVVJFKTsKKwloZHIuaGRyX3ZlcnNpb24gPSBodG9ubCgyKTsKKwloZHIuaGRyX2VudHJpZXMgPSAwOworCXdyaXRlX29yX2RpZShwLT5wYWNrX2ZkLCAmaGRyLCBzaXplb2YoaGRyKSk7CisKKwlwYWNrX2RhdGEgPSBwOworCXBhY2tfc2l6ZSA9IHNpemVvZihoZHIpOworCW9iamVjdF9jb3VudCA9IDA7CisKKwlhbGxfcGFja3MgPSB4cmVhbGxvYyhhbGxfcGFja3MsIHNpemVvZigqYWxsX3BhY2tzKSAqIChwYWNrX2lkICsgMSkpOworCWFsbF9wYWNrc1twYWNrX2lkXSA9IHA7Cit9CisKK3N0YXRpYyBpbnQgb2VjbXAgKGNvbnN0IHZvaWQgKmFfLCBjb25zdCB2b2lkICpiXykKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICphID0gKigoc3RydWN0IG9iamVjdF9lbnRyeSoqKWFfKTsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpiID0gKigoc3RydWN0IG9iamVjdF9lbnRyeSoqKWJfKTsKKwlyZXR1cm4gaGFzaGNtcChhLT5zaGExLCBiLT5zaGExKTsKK30KKworc3RhdGljIGNoYXIgKmNyZWF0ZV9pbmRleCh2b2lkKQoreworCXN0YXRpYyBjaGFyIHRtcGZpbGVbUEFUSF9NQVhdOworCVNIQV9DVFggY3R4OworCXN0cnVjdCBzaGExZmlsZSAqZjsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqaWR4LCAqKmMsICoqbGFzdCwgKmU7CisJc3RydWN0IG9iamVjdF9lbnRyeV9wb29sICpvOworCXVpbnQzMl90IGFycmF5WzI1Nl07CisJaW50IGksIGlkeF9mZDsKKworCS8qIEJ1aWxkIHRoZSBzb3J0ZWQgdGFibGUgb2Ygb2JqZWN0IElEcy4gKi8KKwlpZHggPSB4bWFsbG9jKG9iamVjdF9jb3VudCAqIHNpemVvZihzdHJ1Y3Qgb2JqZWN0X2VudHJ5KikpOworCWMgPSBpZHg7CisJZm9yIChvID0gYmxvY2tzOyBvOyBvID0gby0+bmV4dF9wb29sKQorCQlmb3IgKGUgPSBvLT5uZXh0X2ZyZWU7IGUtLSAhPSBvLT5lbnRyaWVzOykKKwkJCWlmIChwYWNrX2lkID09IGUtPnBhY2tfaWQpCisJCQkJKmMrKyA9IGU7CisJbGFzdCA9IGlkeCArIG9iamVjdF9jb3VudDsKKwlpZiAoYyAhPSBsYXN0KQorCQlkaWUoImludGVybmFsIGNvbnNpc3RlbmN5IGVycm9yIGNyZWF0aW5nIHRoZSBpbmRleCIpOworCXFzb3J0KGlkeCwgb2JqZWN0X2NvdW50LCBzaXplb2Yoc3RydWN0IG9iamVjdF9lbnRyeSopLCBvZWNtcCk7CisKKwkvKiBHZW5lcmF0ZSB0aGUgZmFuLW91dCBhcnJheS4gKi8KKwljID0gaWR4OworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqbmV4dCA9IGM7OworCQl3aGlsZSAobmV4dCA8IGxhc3QpIHsKKwkJCWlmICgoKm5leHQpLT5zaGExWzBdICE9IGkpCisJCQkJYnJlYWs7CisJCQluZXh0Kys7CisJCX0KKwkJYXJyYXlbaV0gPSBodG9ubChuZXh0IC0gaWR4KTsKKwkJYyA9IG5leHQ7CisJfQorCisJc25wcmludGYodG1wZmlsZSwgc2l6ZW9mKHRtcGZpbGUpLAorCQkiJXMvdG1wX2lkeF9YWFhYWFgiLCBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpKTsKKwlpZHhfZmQgPSB4bWtzdGVtcCh0bXBmaWxlKTsKKwlmID0gc2hhMWZkKGlkeF9mZCwgdG1wZmlsZSk7CisJc2hhMXdyaXRlKGYsIGFycmF5LCAyNTYgKiBzaXplb2YoaW50KSk7CisJU0hBMV9Jbml0KCZjdHgpOworCWZvciAoYyA9IGlkeDsgYyAhPSBsYXN0OyBjKyspIHsKKwkJdWludDMyX3Qgb2Zmc2V0ID0gaHRvbmwoKCpjKS0+b2Zmc2V0KTsKKwkJc2hhMXdyaXRlKGYsICZvZmZzZXQsIDQpOworCQlzaGExd3JpdGUoZiwgKCpjKS0+c2hhMSwgc2l6ZW9mKCgqYyktPnNoYTEpKTsKKwkJU0hBMV9VcGRhdGUoJmN0eCwgKCpjKS0+c2hhMSwgMjApOworCX0KKwlzaGExd3JpdGUoZiwgcGFja19kYXRhLT5zaGExLCBzaXplb2YocGFja19kYXRhLT5zaGExKSk7CisJc2hhMWNsb3NlKGYsIE5VTEwsIDEpOworCWZyZWUoaWR4KTsKKwlTSEExX0ZpbmFsKHBhY2tfZGF0YS0+c2hhMSwgJmN0eCk7CisJcmV0dXJuIHRtcGZpbGU7Cit9CisKK3N0YXRpYyBjaGFyICprZWVwX3BhY2soY2hhciAqY3Vycl9pbmRleF9uYW1lKQoreworCXN0YXRpYyBjaGFyIG5hbWVbUEFUSF9NQVhdOworCXN0YXRpYyBjb25zdCBjaGFyICprZWVwX21zZyA9ICJmYXN0LWltcG9ydCI7CisJaW50IGtlZXBfZmQ7CisKKwljaG1vZChwYWNrX2RhdGEtPnBhY2tfbmFtZSwgMDQ0NCk7CisJY2htb2QoY3Vycl9pbmRleF9uYW1lLCAwNDQ0KTsKKworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzL3BhY2svcGFjay0lcy5rZWVwIiwKKwkJIGdldF9vYmplY3RfZGlyZWN0b3J5KCksIHNoYTFfdG9faGV4KHBhY2tfZGF0YS0+c2hhMSkpOworCWtlZXBfZmQgPSBvcGVuKG5hbWUsIE9fUkRXUnxPX0NSRUFUfE9fRVhDTCwgMDYwMCk7CisJaWYgKGtlZXBfZmQgPCAwKQorCQlkaWUoImNhbm5vdCBjcmVhdGUga2VlcCBmaWxlIik7CisJd3JpdGVfb3JfZGllKGtlZXBfZmQsIGtlZXBfbXNnLCBzdHJsZW4oa2VlcF9tc2cpKTsKKwlpZiAoY2xvc2Uoa2VlcF9mZCkpCisJCWRpZSgiZmFpbGVkIHRvIHdyaXRlIGtlZXAgZmlsZSIpOworCisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMvcGFjay9wYWNrLSVzLnBhY2siLAorCQkgZ2V0X29iamVjdF9kaXJlY3RvcnkoKSwgc2hhMV90b19oZXgocGFja19kYXRhLT5zaGExKSk7CisJaWYgKG1vdmVfdGVtcF90b19maWxlKHBhY2tfZGF0YS0+cGFja19uYW1lLCBuYW1lKSkKKwkJZGllKCJjYW5ub3Qgc3RvcmUgcGFjayBmaWxlIik7CisKKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcy9wYWNrL3BhY2stJXMuaWR4IiwKKwkJIGdldF9vYmplY3RfZGlyZWN0b3J5KCksIHNoYTFfdG9faGV4KHBhY2tfZGF0YS0+c2hhMSkpOworCWlmIChtb3ZlX3RlbXBfdG9fZmlsZShjdXJyX2luZGV4X25hbWUsIG5hbWUpKQorCQlkaWUoImNhbm5vdCBzdG9yZSBpbmRleCBmaWxlIik7CisJcmV0dXJuIG5hbWU7Cit9CisKK3N0YXRpYyB2b2lkIHVua2VlcF9hbGxfcGFja3Modm9pZCkKK3sKKwlzdGF0aWMgY2hhciBuYW1lW1BBVEhfTUFYXTsKKwlpbnQgazsKKworCWZvciAoayA9IDA7IGsgPCBwYWNrX2lkOyBrKyspIHsKKwkJc3RydWN0IHBhY2tlZF9naXQgKnAgPSBhbGxfcGFja3Nba107CisJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzL3BhY2svcGFjay0lcy5rZWVwIiwKKwkJCSBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpLCBzaGExX3RvX2hleChwLT5zaGExKSk7CisJCXVubGluayhuYW1lKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVuZF9wYWNrZmlsZSh2b2lkKQoreworCXN0cnVjdCBwYWNrZWRfZ2l0ICpvbGRfcCA9IHBhY2tfZGF0YSwgKm5ld19wOworCisJaWYgKG9iamVjdF9jb3VudCkgeworCQljaGFyICppZHhfbmFtZTsKKwkJaW50IGk7CisJCXN0cnVjdCBicmFuY2ggKmI7CisJCXN0cnVjdCB0YWcgKnQ7CisKKwkJY2xvc2VfcGFja193aW5kb3dzKHBhY2tfZGF0YSk7CisJCWZpeHVwX3BhY2tfaGVhZGVyX2Zvb3RlcihwYWNrX2RhdGEtPnBhY2tfZmQsIHBhY2tfZGF0YS0+c2hhMSwKKwkJCQkgICAgcGFja19kYXRhLT5wYWNrX25hbWUsIG9iamVjdF9jb3VudCk7CisJCWNsb3NlKHBhY2tfZGF0YS0+cGFja19mZCk7CisJCWlkeF9uYW1lID0ga2VlcF9wYWNrKGNyZWF0ZV9pbmRleCgpKTsKKworCQkvKiBSZWdpc3RlciB0aGUgcGFja2ZpbGUgd2l0aCBjb3JlIGdpdCdzIG1hY2hpbmFyeS4gKi8KKwkJbmV3X3AgPSBhZGRfcGFja2VkX2dpdChpZHhfbmFtZSwgc3RybGVuKGlkeF9uYW1lKSwgMSk7CisJCWlmICghbmV3X3ApCisJCQlkaWUoImNvcmUgZ2l0IHJlamVjdGVkIGluZGV4ICVzIiwgaWR4X25hbWUpOworCQlhbGxfcGFja3NbcGFja19pZF0gPSBuZXdfcDsKKwkJaW5zdGFsbF9wYWNrZWRfZ2l0KG5ld19wKTsKKworCQkvKiBQcmludCB0aGUgYm91bmRhcnkgKi8KKwkJaWYgKHBhY2tfZWRnZXMpIHsKKwkJCWZwcmludGYocGFja19lZGdlcywgIiVzOiIsIG5ld19wLT5wYWNrX25hbWUpOworCQkJZm9yIChpID0gMDsgaSA8IGJyYW5jaF90YWJsZV9zejsgaSsrKSB7CisJCQkJZm9yIChiID0gYnJhbmNoX3RhYmxlW2ldOyBiOyBiID0gYi0+dGFibGVfbmV4dF9icmFuY2gpIHsKKwkJCQkJaWYgKGItPnBhY2tfaWQgPT0gcGFja19pZCkKKwkJCQkJCWZwcmludGYocGFja19lZGdlcywgIiAlcyIsIHNoYTFfdG9faGV4KGItPnNoYTEpKTsKKwkJCQl9CisJCQl9CisJCQlmb3IgKHQgPSBmaXJzdF90YWc7IHQ7IHQgPSB0LT5uZXh0X3RhZykgeworCQkJCWlmICh0LT5wYWNrX2lkID09IHBhY2tfaWQpCisJCQkJCWZwcmludGYocGFja19lZGdlcywgIiAlcyIsIHNoYTFfdG9faGV4KHQtPnNoYTEpKTsKKwkJCX0KKwkJCWZwdXRjKCdcbicsIHBhY2tfZWRnZXMpOworCQkJZmZsdXNoKHBhY2tfZWRnZXMpOworCQl9CisKKwkJcGFja19pZCsrOworCX0KKwllbHNlCisJCXVubGluayhvbGRfcC0+cGFja19uYW1lKTsKKwlmcmVlKG9sZF9wKTsKKworCS8qIFdlIGNhbid0IGNhcnJ5IGEgZGVsdGEgYWNyb3NzIHBhY2tmaWxlcy4gKi8KKwlzdHJidWZfcmVsZWFzZSgmbGFzdF9ibG9iLmRhdGEpOworCWxhc3RfYmxvYi5vZmZzZXQgPSAwOworCWxhc3RfYmxvYi5kZXB0aCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGN5Y2xlX3BhY2tmaWxlKHZvaWQpCit7CisJZW5kX3BhY2tmaWxlKCk7CisJc3RhcnRfcGFja2ZpbGUoKTsKK30KKworc3RhdGljIHNpemVfdCBlbmNvZGVfaGVhZGVyKAorCWVudW0gb2JqZWN0X3R5cGUgdHlwZSwKKwlzaXplX3Qgc2l6ZSwKKwl1bnNpZ25lZCBjaGFyICpoZHIpCit7CisJaW50IG4gPSAxOworCXVuc2lnbmVkIGNoYXIgYzsKKworCWlmICh0eXBlIDwgT0JKX0NPTU1JVCB8fCB0eXBlID4gT0JKX1JFRl9ERUxUQSkKKwkJZGllKCJiYWQgdHlwZSAlZCIsIHR5cGUpOworCisJYyA9ICh0eXBlIDw8IDQpIHwgKHNpemUgJiAxNSk7CisJc2l6ZSA+Pj0gNDsKKwl3aGlsZSAoc2l6ZSkgeworCQkqaGRyKysgPSBjIHwgMHg4MDsKKwkJYyA9IHNpemUgJiAweDdmOworCQlzaXplID4+PSA3OworCQluKys7CisJfQorCSpoZHIgPSBjOworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IHN0b3JlX29iamVjdCgKKwllbnVtIG9iamVjdF90eXBlIHR5cGUsCisJc3RydWN0IHN0cmJ1ZiAqZGF0LAorCXN0cnVjdCBsYXN0X29iamVjdCAqbGFzdCwKKwl1bnNpZ25lZCBjaGFyICpzaGExb3V0LAorCXVpbnRtYXhfdCBtYXJrKQoreworCXZvaWQgKm91dCwgKmRlbHRhOworCXN0cnVjdCBvYmplY3RfZW50cnkgKmU7CisJdW5zaWduZWQgY2hhciBoZHJbOTZdOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJdW5zaWduZWQgbG9uZyBoZHJsZW4sIGRlbHRhbGVuOworCVNIQV9DVFggYzsKKwl6X3N0cmVhbSBzOworCisJaGRybGVuID0gc3ByaW50ZigoY2hhciopaGRyLCIlcyAlbHUiLCB0eXBlbmFtZSh0eXBlKSwKKwkJKHVuc2lnbmVkIGxvbmcpZGF0LT5sZW4pICsgMTsKKwlTSEExX0luaXQoJmMpOworCVNIQTFfVXBkYXRlKCZjLCBoZHIsIGhkcmxlbik7CisJU0hBMV9VcGRhdGUoJmMsIGRhdC0+YnVmLCBkYXQtPmxlbik7CisJU0hBMV9GaW5hbChzaGExLCAmYyk7CisJaWYgKHNoYTFvdXQpCisJCWhhc2hjcHkoc2hhMW91dCwgc2hhMSk7CisKKwllID0gaW5zZXJ0X29iamVjdChzaGExKTsKKwlpZiAobWFyaykKKwkJaW5zZXJ0X21hcmsobWFyaywgZSk7CisJaWYgKGUtPm9mZnNldCkgeworCQlkdXBsaWNhdGVfY291bnRfYnlfdHlwZVt0eXBlXSsrOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgaWYgKGZpbmRfc2hhMV9wYWNrKHNoYTEsIHBhY2tlZF9naXQpKSB7CisJCWUtPnR5cGUgPSB0eXBlOworCQllLT5wYWNrX2lkID0gTUFYX1BBQ0tfSUQ7CisJCWUtPm9mZnNldCA9IDE7IC8qIGp1c3Qgbm90IHplcm8hICovCisJCWR1cGxpY2F0ZV9jb3VudF9ieV90eXBlW3R5cGVdKys7CisJCXJldHVybiAxOworCX0KKworCWlmIChsYXN0ICYmIGxhc3QtPmRhdGEuYnVmICYmIGxhc3QtPmRlcHRoIDwgbWF4X2RlcHRoKSB7CisJCWRlbHRhID0gZGlmZl9kZWx0YShsYXN0LT5kYXRhLmJ1ZiwgbGFzdC0+ZGF0YS5sZW4sCisJCQlkYXQtPmJ1ZiwgZGF0LT5sZW4sCisJCQkmZGVsdGFsZW4sIDApOworCQlpZiAoZGVsdGEgJiYgZGVsdGFsZW4gPj0gZGF0LT5sZW4pIHsKKwkJCWZyZWUoZGVsdGEpOworCQkJZGVsdGEgPSBOVUxMOworCQl9CisJfSBlbHNlCisJCWRlbHRhID0gTlVMTDsKKworCW1lbXNldCgmcywgMCwgc2l6ZW9mKHMpKTsKKwlkZWZsYXRlSW5pdCgmcywgcGFja19jb21wcmVzc2lvbl9sZXZlbCk7CisJaWYgKGRlbHRhKSB7CisJCXMubmV4dF9pbiA9IGRlbHRhOworCQlzLmF2YWlsX2luID0gZGVsdGFsZW47CisJfSBlbHNlIHsKKwkJcy5uZXh0X2luID0gKHZvaWQgKilkYXQtPmJ1ZjsKKwkJcy5hdmFpbF9pbiA9IGRhdC0+bGVuOworCX0KKwlzLmF2YWlsX291dCA9IGRlZmxhdGVCb3VuZCgmcywgcy5hdmFpbF9pbik7CisJcy5uZXh0X291dCA9IG91dCA9IHhtYWxsb2Mocy5hdmFpbF9vdXQpOworCXdoaWxlIChkZWZsYXRlKCZzLCBaX0ZJTklTSCkgPT0gWl9PSykKKwkJLyogbm90aGluZyAqLzsKKwlkZWZsYXRlRW5kKCZzKTsKKworCS8qIERldGVybWluZSBpZiB3ZSBzaG91bGQgYXV0by1jaGVja3BvaW50LiAqLworCWlmICgocGFja19zaXplICsgNjAgKyBzLnRvdGFsX291dCkgPiBtYXhfcGFja3NpemUKKwkJfHwgKHBhY2tfc2l6ZSArIDYwICsgcy50b3RhbF9vdXQpIDwgcGFja19zaXplKSB7CisKKwkJLyogVGhpcyBuZXcgb2JqZWN0IG5lZWRzIHRvICpub3QqIGhhdmUgdGhlIGN1cnJlbnQgcGFja19pZC4gKi8KKwkJZS0+cGFja19pZCA9IHBhY2tfaWQgKyAxOworCQljeWNsZV9wYWNrZmlsZSgpOworCisJCS8qIFdlIGNhbm5vdCBjYXJyeSBhIGRlbHRhIGludG8gdGhlIG5ldyBwYWNrLiAqLworCQlpZiAoZGVsdGEpIHsKKwkJCWZyZWUoZGVsdGEpOworCQkJZGVsdGEgPSBOVUxMOworCisJCQltZW1zZXQoJnMsIDAsIHNpemVvZihzKSk7CisJCQlkZWZsYXRlSW5pdCgmcywgcGFja19jb21wcmVzc2lvbl9sZXZlbCk7CisJCQlzLm5leHRfaW4gPSAodm9pZCAqKWRhdC0+YnVmOworCQkJcy5hdmFpbF9pbiA9IGRhdC0+bGVuOworCQkJcy5hdmFpbF9vdXQgPSBkZWZsYXRlQm91bmQoJnMsIHMuYXZhaWxfaW4pOworCQkJcy5uZXh0X291dCA9IG91dCA9IHhyZWFsbG9jKG91dCwgcy5hdmFpbF9vdXQpOworCQkJd2hpbGUgKGRlZmxhdGUoJnMsIFpfRklOSVNIKSA9PSBaX09LKQorCQkJCS8qIG5vdGhpbmcgKi87CisJCQlkZWZsYXRlRW5kKCZzKTsKKwkJfQorCX0KKworCWUtPnR5cGUgPSB0eXBlOworCWUtPnBhY2tfaWQgPSBwYWNrX2lkOworCWUtPm9mZnNldCA9IHBhY2tfc2l6ZTsKKwlvYmplY3RfY291bnQrKzsKKwlvYmplY3RfY291bnRfYnlfdHlwZVt0eXBlXSsrOworCisJaWYgKGRlbHRhKSB7CisJCXVuc2lnbmVkIGxvbmcgb2ZzID0gZS0+b2Zmc2V0IC0gbGFzdC0+b2Zmc2V0OworCQl1bnNpZ25lZCBwb3MgPSBzaXplb2YoaGRyKSAtIDE7CisKKwkJZGVsdGFfY291bnRfYnlfdHlwZVt0eXBlXSsrOworCQllLT5kZXB0aCA9IGxhc3QtPmRlcHRoICsgMTsKKworCQloZHJsZW4gPSBlbmNvZGVfaGVhZGVyKE9CSl9PRlNfREVMVEEsIGRlbHRhbGVuLCBoZHIpOworCQl3cml0ZV9vcl9kaWUocGFja19kYXRhLT5wYWNrX2ZkLCBoZHIsIGhkcmxlbik7CisJCXBhY2tfc2l6ZSArPSBoZHJsZW47CisKKwkJaGRyW3Bvc10gPSBvZnMgJiAxMjc7CisJCXdoaWxlIChvZnMgPj49IDcpCisJCQloZHJbLS1wb3NdID0gMTI4IHwgKC0tb2ZzICYgMTI3KTsKKwkJd3JpdGVfb3JfZGllKHBhY2tfZGF0YS0+cGFja19mZCwgaGRyICsgcG9zLCBzaXplb2YoaGRyKSAtIHBvcyk7CisJCXBhY2tfc2l6ZSArPSBzaXplb2YoaGRyKSAtIHBvczsKKwl9IGVsc2UgeworCQllLT5kZXB0aCA9IDA7CisJCWhkcmxlbiA9IGVuY29kZV9oZWFkZXIodHlwZSwgZGF0LT5sZW4sIGhkcik7CisJCXdyaXRlX29yX2RpZShwYWNrX2RhdGEtPnBhY2tfZmQsIGhkciwgaGRybGVuKTsKKwkJcGFja19zaXplICs9IGhkcmxlbjsKKwl9CisKKwl3cml0ZV9vcl9kaWUocGFja19kYXRhLT5wYWNrX2ZkLCBvdXQsIHMudG90YWxfb3V0KTsKKwlwYWNrX3NpemUgKz0gcy50b3RhbF9vdXQ7CisKKwlmcmVlKG91dCk7CisJZnJlZShkZWx0YSk7CisJaWYgKGxhc3QpIHsKKwkJaWYgKGxhc3QtPm5vX3N3YXApIHsKKwkJCWxhc3QtPmRhdGEgPSAqZGF0OworCQl9IGVsc2UgeworCQkJc3RyYnVmX3N3YXAoJmxhc3QtPmRhdGEsIGRhdCk7CisJCX0KKwkJbGFzdC0+b2Zmc2V0ID0gZS0+b2Zmc2V0OworCQlsYXN0LT5kZXB0aCA9IGUtPmRlcHRoOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQWxsIGNhbGxzIG11c3QgYmUgZ3VhcmRlZCBieSBmaW5kX29iamVjdCgpIG9yIGZpbmRfbWFyaygpIHRvCisgKiBlbnN1cmUgdGhlICdzdHJ1Y3Qgb2JqZWN0X2VudHJ5JyBwYXNzZWQgd2FzIHdyaXR0ZW4gYnkgdGhpcworICogcHJvY2VzcyBpbnN0YW5jZS4gIFdlIHVucGFjayB0aGUgZW50cnkgYnkgdGhlIG9mZnNldCwgYXZvaWRpbmcKKyAqIHRoZSBuZWVkIGZvciB0aGUgY29ycmVzcG9uZGluZyAuaWR4IGZpbGUuICBUaGlzIHVucGFja2luZyBydWxlCisgKiB3b3JrcyBiZWNhdXNlIHdlIG9ubHkgdXNlIE9CSl9SRUZfREVMVEEgd2l0aGluIHRoZSBwYWNrZmlsZXMKKyAqIGNyZWF0ZWQgYnkgZmFzdC1pbXBvcnQuCisgKgorICogb2UgbXVzdCBub3QgYmUgTlVMTC4gIFN1Y2ggYW4gb2UgdXN1YWxseSBjb21lcyBmcm9tIGdpdmluZworICogYW4gdW5rbm93biBTSEEtMSB0byBmaW5kX29iamVjdCgpIG9yIGFuIHVuZGVmaW5lZCBtYXJrIHRvCisgKiBmaW5kX21hcmsoKS4gIENhbGxlcnMgbXVzdCB0ZXN0IGZvciB0aGlzIGNvbmRpdGlvbiBhbmQgdXNlCisgKiB0aGUgc3RhbmRhcmQgcmVhZF9zaGExX2ZpbGUoKSB3aGVuIGl0IGhhcHBlbnMuCisgKgorICogb2UtPnBhY2tfaWQgbXVzdCBub3QgYmUgTUFYX1BBQ0tfSUQuICBTdWNoIGFuIG9lIGlzIHVzdWFsbHkgZnJvbQorICogZmluZF9tYXJrKCksIHdoZXJlIHRoZSBtYXJrIHdhcyByZWxvYWRlZCBmcm9tIGFuIGV4aXN0aW5nIG1hcmtzCisgKiBmaWxlIGFuZCBpcyByZWZlcmVuY2luZyBhbiBvYmplY3QgdGhhdCB0aGlzIGZhc3QtaW1wb3J0IHByb2Nlc3MKKyAqIGluc3RhbmNlIGRpZCBub3Qgd3JpdGUgb3V0IHRvIGEgcGFja2ZpbGUuICBDYWxsZXJzIG11c3QgdGVzdCBmb3IKKyAqIHRoaXMgY29uZGl0aW9uIGFuZCB1c2UgcmVhZF9zaGExX2ZpbGUoKSBpbnN0ZWFkLgorICovCitzdGF0aWMgdm9pZCAqZ2ZpX3VucGFja19lbnRyeSgKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpvZSwKKwl1bnNpZ25lZCBsb25nICpzaXplcCkKK3sKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJc3RydWN0IHBhY2tlZF9naXQgKnAgPSBhbGxfcGFja3Nbb2UtPnBhY2tfaWRdOworCWlmIChwID09IHBhY2tfZGF0YSAmJiBwLT5wYWNrX3NpemUgPCAocGFja19zaXplICsgMjApKSB7CisJCS8qIFRoZSBvYmplY3QgaXMgc3RvcmVkIGluIHRoZSBwYWNrZmlsZSB3ZSBhcmUgd3JpdGluZyB0bworCQkgKiBhbmQgd2UgaGF2ZSBtb2RpZmllZCBpdCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIHNjYW5uZWQKKwkJICogYmFjayB0byByZWFkIGEgcHJldmlvdXNseSB3cml0dGVuIG9iamVjdC4gIElmIGFuIG9sZAorCQkgKiB3aW5kb3cgY292ZXJlZCBbcC0+cGFja19zaXplLCBwLT5wYWNrX3NpemUgKyAyMCkgaXRzCisJCSAqIGRhdGEgaXMgc3RhbGUgYW5kIGlzIG5vdCB2YWxpZC4gIENsb3NpbmcgYWxsIHdpbmRvd3MKKwkJICogYW5kIHVwZGF0aW5nIHRoZSBwYWNrZmlsZSBsZW5ndGggZW5zdXJlcyB3ZSBjYW4gcmVhZAorCQkgKiB0aGUgbmV3bHkgd3JpdHRlbiBkYXRhLgorCQkgKi8KKwkJY2xvc2VfcGFja193aW5kb3dzKHApOworCisJCS8qIFdlIGhhdmUgdG8gb2ZmZXIgMjAgYnl0ZXMgYWRkaXRpb25hbCBvbiB0aGUgZW5kIG9mCisJCSAqIHRoZSBwYWNrZmlsZSBhcyB0aGUgY29yZSB1bnBhY2tlciBjb2RlIGFzc3VtZXMgdGhlCisJCSAqIGZvb3RlciBpcyBwcmVzZW50IGF0IHRoZSBmaWxlIGVuZCBhbmQgbXVzdCBwcm9taXNlCisJCSAqIGF0IGxlYXN0IDIwIGJ5dGVzIHdpdGhpbiBhbnkgd2luZG93IGl0IG1hcHMuICBCdXQKKwkJICogd2UgZG9uJ3QgYWN0dWFsbHkgY3JlYXRlIHRoZSBmb290ZXIgaGVyZS4KKwkJICovCisJCXAtPnBhY2tfc2l6ZSA9IHBhY2tfc2l6ZSArIDIwOworCX0KKwlyZXR1cm4gdW5wYWNrX2VudHJ5KHAsIG9lLT5vZmZzZXQsICZ0eXBlLCBzaXplcCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfbW9kZShjb25zdCBjaGFyICpzdHIsIHVpbnQxNl90ICptb2RlcCkKK3sKKwl1bnNpZ25lZCBjaGFyIGM7CisJdWludDE2X3QgbW9kZSA9IDA7CisKKwl3aGlsZSAoKGMgPSAqc3RyKyspICE9ICcgJykgeworCQlpZiAoYyA8ICcwJyB8fCBjID4gJzcnKQorCQkJcmV0dXJuIE5VTEw7CisJCW1vZGUgPSAobW9kZSA8PCAzKSArIChjIC0gJzAnKTsKKwl9CisJKm1vZGVwID0gbW9kZTsKKwlyZXR1cm4gc3RyOworfQorCitzdGF0aWMgdm9pZCBsb2FkX3RyZWUoc3RydWN0IHRyZWVfZW50cnkgKnJvb3QpCit7CisJdW5zaWduZWQgY2hhciogc2hhMSA9IHJvb3QtPnZlcnNpb25zWzFdLnNoYTE7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqbXlvZTsKKwlzdHJ1Y3QgdHJlZV9jb250ZW50ICp0OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwljaGFyICpidWY7CisJY29uc3QgY2hhciAqYzsKKworCXJvb3QtPnRyZWUgPSB0ID0gbmV3X3RyZWVfY29udGVudCg4KTsKKwlpZiAoaXNfbnVsbF9zaGExKHNoYTEpKQorCQlyZXR1cm47CisKKwlteW9lID0gZmluZF9vYmplY3Qoc2hhMSk7CisJaWYgKG15b2UgJiYgbXlvZS0+cGFja19pZCAhPSBNQVhfUEFDS19JRCkgeworCQlpZiAobXlvZS0+dHlwZSAhPSBPQkpfVFJFRSkKKwkJCWRpZSgiTm90IGEgdHJlZTogJXMiLCBzaGExX3RvX2hleChzaGExKSk7CisJCXQtPmRlbHRhX2RlcHRoID0gbXlvZS0+ZGVwdGg7CisJCWJ1ZiA9IGdmaV91bnBhY2tfZW50cnkobXlvZSwgJnNpemUpOworCQlpZiAoIWJ1ZikKKwkJCWRpZSgiQ2FuJ3QgbG9hZCB0cmVlICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworCX0gZWxzZSB7CisJCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwkJYnVmID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgJnR5cGUsICZzaXplKTsKKwkJaWYgKCFidWYgfHwgdHlwZSAhPSBPQkpfVFJFRSkKKwkJCWRpZSgiQ2FuJ3QgbG9hZCB0cmVlICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworCX0KKworCWMgPSBidWY7CisJd2hpbGUgKGMgIT0gKGJ1ZiArIHNpemUpKSB7CisJCXN0cnVjdCB0cmVlX2VudHJ5ICplID0gbmV3X3RyZWVfZW50cnkoKTsKKworCQlpZiAodC0+ZW50cnlfY291bnQgPT0gdC0+ZW50cnlfY2FwYWNpdHkpCisJCQlyb290LT50cmVlID0gdCA9IGdyb3dfdHJlZV9jb250ZW50KHQsIHQtPmVudHJ5X2NvdW50KTsKKwkJdC0+ZW50cmllc1t0LT5lbnRyeV9jb3VudCsrXSA9IGU7CisKKwkJZS0+dHJlZSA9IE5VTEw7CisJCWMgPSBnZXRfbW9kZShjLCAmZS0+dmVyc2lvbnNbMV0ubW9kZSk7CisJCWlmICghYykKKwkJCWRpZSgiQ29ycnVwdCBtb2RlIGluICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworCQllLT52ZXJzaW9uc1swXS5tb2RlID0gZS0+dmVyc2lvbnNbMV0ubW9kZTsKKwkJZS0+bmFtZSA9IHRvX2F0b20oYywgc3RybGVuKGMpKTsKKwkJYyArPSBlLT5uYW1lLT5zdHJfbGVuICsgMTsKKwkJaGFzaGNweShlLT52ZXJzaW9uc1swXS5zaGExLCAodW5zaWduZWQgY2hhciopYyk7CisJCWhhc2hjcHkoZS0+dmVyc2lvbnNbMV0uc2hhMSwgKHVuc2lnbmVkIGNoYXIqKWMpOworCQljICs9IDIwOworCX0KKwlmcmVlKGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgdGVjbXAwIChjb25zdCB2b2lkICpfYSwgY29uc3Qgdm9pZCAqX2IpCit7CisJc3RydWN0IHRyZWVfZW50cnkgKmEgPSAqKChzdHJ1Y3QgdHJlZV9lbnRyeSoqKV9hKTsKKwlzdHJ1Y3QgdHJlZV9lbnRyeSAqYiA9ICooKHN0cnVjdCB0cmVlX2VudHJ5KiopX2IpOworCXJldHVybiBiYXNlX25hbWVfY29tcGFyZSgKKwkJYS0+bmFtZS0+c3RyX2RhdCwgYS0+bmFtZS0+c3RyX2xlbiwgYS0+dmVyc2lvbnNbMF0ubW9kZSwKKwkJYi0+bmFtZS0+c3RyX2RhdCwgYi0+bmFtZS0+c3RyX2xlbiwgYi0+dmVyc2lvbnNbMF0ubW9kZSk7Cit9CisKK3N0YXRpYyBpbnQgdGVjbXAxIChjb25zdCB2b2lkICpfYSwgY29uc3Qgdm9pZCAqX2IpCit7CisJc3RydWN0IHRyZWVfZW50cnkgKmEgPSAqKChzdHJ1Y3QgdHJlZV9lbnRyeSoqKV9hKTsKKwlzdHJ1Y3QgdHJlZV9lbnRyeSAqYiA9ICooKHN0cnVjdCB0cmVlX2VudHJ5KiopX2IpOworCXJldHVybiBiYXNlX25hbWVfY29tcGFyZSgKKwkJYS0+bmFtZS0+c3RyX2RhdCwgYS0+bmFtZS0+c3RyX2xlbiwgYS0+dmVyc2lvbnNbMV0ubW9kZSwKKwkJYi0+bmFtZS0+c3RyX2RhdCwgYi0+bmFtZS0+c3RyX2xlbiwgYi0+dmVyc2lvbnNbMV0ubW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIG1rdHJlZShzdHJ1Y3QgdHJlZV9jb250ZW50ICp0LCBpbnQgdiwgc3RydWN0IHN0cmJ1ZiAqYikKK3sKKwlzaXplX3QgbWF4bGVuID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICghdikKKwkJcXNvcnQodC0+ZW50cmllcyx0LT5lbnRyeV9jb3VudCxzaXplb2YodC0+ZW50cmllc1swXSksdGVjbXAwKTsKKwllbHNlCisJCXFzb3J0KHQtPmVudHJpZXMsdC0+ZW50cnlfY291bnQsc2l6ZW9mKHQtPmVudHJpZXNbMF0pLHRlY21wMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdC0+ZW50cnlfY291bnQ7IGkrKykgeworCQlpZiAodC0+ZW50cmllc1tpXS0+dmVyc2lvbnNbdl0ubW9kZSkKKwkJCW1heGxlbiArPSB0LT5lbnRyaWVzW2ldLT5uYW1lLT5zdHJfbGVuICsgMzQ7CisJfQorCisJc3RyYnVmX3Jlc2V0KGIpOworCXN0cmJ1Zl9ncm93KGIsIG1heGxlbik7CisJZm9yIChpID0gMDsgaSA8IHQtPmVudHJ5X2NvdW50OyBpKyspIHsKKwkJc3RydWN0IHRyZWVfZW50cnkgKmUgPSB0LT5lbnRyaWVzW2ldOworCQlpZiAoIWUtPnZlcnNpb25zW3ZdLm1vZGUpCisJCQljb250aW51ZTsKKwkJc3RyYnVmX2FkZGYoYiwgIiVvICVzJWMiLCAodW5zaWduZWQgaW50KWUtPnZlcnNpb25zW3ZdLm1vZGUsCisJCQkJCWUtPm5hbWUtPnN0cl9kYXQsICdcMCcpOworCQlzdHJidWZfYWRkKGIsIGUtPnZlcnNpb25zW3ZdLnNoYTEsIDIwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN0b3JlX3RyZWUoc3RydWN0IHRyZWVfZW50cnkgKnJvb3QpCit7CisJc3RydWN0IHRyZWVfY29udGVudCAqdCA9IHJvb3QtPnRyZWU7CisJdW5zaWduZWQgaW50IGksIGosIGRlbDsKKwlzdHJ1Y3QgbGFzdF9vYmplY3QgbG8gPSB7IFNUUkJVRl9JTklULCAwLCAwLCAvKiBub19zd2FwICovIDEgfTsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpsZTsKKworCWlmICghaXNfbnVsbF9zaGExKHJvb3QtPnZlcnNpb25zWzFdLnNoYTEpKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgdC0+ZW50cnlfY291bnQ7IGkrKykgeworCQlpZiAodC0+ZW50cmllc1tpXS0+dHJlZSkKKwkJCXN0b3JlX3RyZWUodC0+ZW50cmllc1tpXSk7CisJfQorCisJbGUgPSBmaW5kX29iamVjdChyb290LT52ZXJzaW9uc1swXS5zaGExKTsKKwlpZiAoU19JU0RJUihyb290LT52ZXJzaW9uc1swXS5tb2RlKSAmJiBsZSAmJiBsZS0+cGFja19pZCA9PSBwYWNrX2lkKSB7CisJCW1rdHJlZSh0LCAwLCAmb2xkX3RyZWUpOworCQlsby5kYXRhID0gb2xkX3RyZWU7CisJCWxvLm9mZnNldCA9IGxlLT5vZmZzZXQ7CisJCWxvLmRlcHRoID0gdC0+ZGVsdGFfZGVwdGg7CisJfQorCisJbWt0cmVlKHQsIDEsICZuZXdfdHJlZSk7CisJc3RvcmVfb2JqZWN0KE9CSl9UUkVFLCAmbmV3X3RyZWUsICZsbywgcm9vdC0+dmVyc2lvbnNbMV0uc2hhMSwgMCk7CisKKwl0LT5kZWx0YV9kZXB0aCA9IGxvLmRlcHRoOworCWZvciAoaSA9IDAsIGogPSAwLCBkZWwgPSAwOyBpIDwgdC0+ZW50cnlfY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgdHJlZV9lbnRyeSAqZSA9IHQtPmVudHJpZXNbaV07CisJCWlmIChlLT52ZXJzaW9uc1sxXS5tb2RlKSB7CisJCQllLT52ZXJzaW9uc1swXS5tb2RlID0gZS0+dmVyc2lvbnNbMV0ubW9kZTsKKwkJCWhhc2hjcHkoZS0+dmVyc2lvbnNbMF0uc2hhMSwgZS0+dmVyc2lvbnNbMV0uc2hhMSk7CisJCQl0LT5lbnRyaWVzW2orK10gPSBlOworCQl9IGVsc2UgeworCQkJcmVsZWFzZV90cmVlX2VudHJ5KGUpOworCQkJZGVsKys7CisJCX0KKwl9CisJdC0+ZW50cnlfY291bnQgLT0gZGVsOworfQorCitzdGF0aWMgaW50IHRyZWVfY29udGVudF9zZXQoCisJc3RydWN0IHRyZWVfZW50cnkgKnJvb3QsCisJY29uc3QgY2hhciAqcCwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCWNvbnN0IHVpbnQxNl90IG1vZGUsCisJc3RydWN0IHRyZWVfY29udGVudCAqc3VidHJlZSkKK3sKKwlzdHJ1Y3QgdHJlZV9jb250ZW50ICp0ID0gcm9vdC0+dHJlZTsKKwljb25zdCBjaGFyICpzbGFzaDE7CisJdW5zaWduZWQgaW50IGksIG47CisJc3RydWN0IHRyZWVfZW50cnkgKmU7CisKKwlzbGFzaDEgPSBzdHJjaHIocCwgJy8nKTsKKwlpZiAoc2xhc2gxKQorCQluID0gc2xhc2gxIC0gcDsKKwllbHNlCisJCW4gPSBzdHJsZW4ocCk7CisJaWYgKCFuKQorCQlkaWUoIkVtcHR5IHBhdGggY29tcG9uZW50IGZvdW5kIGluIGlucHV0Iik7CisJaWYgKCFzbGFzaDEgJiYgIVNfSVNESVIobW9kZSkgJiYgc3VidHJlZSkKKwkJZGllKCJOb24tZGlyZWN0b3JpZXMgY2Fubm90IGhhdmUgc3VidHJlZXMiKTsKKworCWZvciAoaSA9IDA7IGkgPCB0LT5lbnRyeV9jb3VudDsgaSsrKSB7CisJCWUgPSB0LT5lbnRyaWVzW2ldOworCQlpZiAoZS0+bmFtZS0+c3RyX2xlbiA9PSBuICYmICFzdHJuY21wKHAsIGUtPm5hbWUtPnN0cl9kYXQsIG4pKSB7CisJCQlpZiAoIXNsYXNoMSkgeworCQkJCWlmICghU19JU0RJUihtb2RlKQorCQkJCQkJJiYgZS0+dmVyc2lvbnNbMV0ubW9kZSA9PSBtb2RlCisJCQkJCQkmJiAhaGFzaGNtcChlLT52ZXJzaW9uc1sxXS5zaGExLCBzaGExKSkKKwkJCQkJcmV0dXJuIDA7CisJCQkJZS0+dmVyc2lvbnNbMV0ubW9kZSA9IG1vZGU7CisJCQkJaGFzaGNweShlLT52ZXJzaW9uc1sxXS5zaGExLCBzaGExKTsKKwkJCQlpZiAoZS0+dHJlZSkKKwkJCQkJcmVsZWFzZV90cmVlX2NvbnRlbnRfcmVjdXJzaXZlKGUtPnRyZWUpOworCQkJCWUtPnRyZWUgPSBzdWJ0cmVlOworCQkJCWhhc2hjbHIocm9vdC0+dmVyc2lvbnNbMV0uc2hhMSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlpZiAoIVNfSVNESVIoZS0+dmVyc2lvbnNbMV0ubW9kZSkpIHsKKwkJCQllLT50cmVlID0gbmV3X3RyZWVfY29udGVudCg4KTsKKwkJCQllLT52ZXJzaW9uc1sxXS5tb2RlID0gU19JRkRJUjsKKwkJCX0KKwkJCWlmICghZS0+dHJlZSkKKwkJCQlsb2FkX3RyZWUoZSk7CisJCQlpZiAodHJlZV9jb250ZW50X3NldChlLCBzbGFzaDEgKyAxLCBzaGExLCBtb2RlLCBzdWJ0cmVlKSkgeworCQkJCWhhc2hjbHIocm9vdC0+dmVyc2lvbnNbMV0uc2hhMSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmICh0LT5lbnRyeV9jb3VudCA9PSB0LT5lbnRyeV9jYXBhY2l0eSkKKwkJcm9vdC0+dHJlZSA9IHQgPSBncm93X3RyZWVfY29udGVudCh0LCB0LT5lbnRyeV9jb3VudCk7CisJZSA9IG5ld190cmVlX2VudHJ5KCk7CisJZS0+bmFtZSA9IHRvX2F0b20ocCwgbik7CisJZS0+dmVyc2lvbnNbMF0ubW9kZSA9IDA7CisJaGFzaGNscihlLT52ZXJzaW9uc1swXS5zaGExKTsKKwl0LT5lbnRyaWVzW3QtPmVudHJ5X2NvdW50KytdID0gZTsKKwlpZiAoc2xhc2gxKSB7CisJCWUtPnRyZWUgPSBuZXdfdHJlZV9jb250ZW50KDgpOworCQllLT52ZXJzaW9uc1sxXS5tb2RlID0gU19JRkRJUjsKKwkJdHJlZV9jb250ZW50X3NldChlLCBzbGFzaDEgKyAxLCBzaGExLCBtb2RlLCBzdWJ0cmVlKTsKKwl9IGVsc2UgeworCQllLT50cmVlID0gc3VidHJlZTsKKwkJZS0+dmVyc2lvbnNbMV0ubW9kZSA9IG1vZGU7CisJCWhhc2hjcHkoZS0+dmVyc2lvbnNbMV0uc2hhMSwgc2hhMSk7CisJfQorCWhhc2hjbHIocm9vdC0+dmVyc2lvbnNbMV0uc2hhMSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdHJlZV9jb250ZW50X3JlbW92ZSgKKwlzdHJ1Y3QgdHJlZV9lbnRyeSAqcm9vdCwKKwljb25zdCBjaGFyICpwLAorCXN0cnVjdCB0cmVlX2VudHJ5ICpiYWNrdXBfbGVhZikKK3sKKwlzdHJ1Y3QgdHJlZV9jb250ZW50ICp0ID0gcm9vdC0+dHJlZTsKKwljb25zdCBjaGFyICpzbGFzaDE7CisJdW5zaWduZWQgaW50IGksIG47CisJc3RydWN0IHRyZWVfZW50cnkgKmU7CisKKwlzbGFzaDEgPSBzdHJjaHIocCwgJy8nKTsKKwlpZiAoc2xhc2gxKQorCQluID0gc2xhc2gxIC0gcDsKKwllbHNlCisJCW4gPSBzdHJsZW4ocCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdC0+ZW50cnlfY291bnQ7IGkrKykgeworCQllID0gdC0+ZW50cmllc1tpXTsKKwkJaWYgKGUtPm5hbWUtPnN0cl9sZW4gPT0gbiAmJiAhc3RybmNtcChwLCBlLT5uYW1lLT5zdHJfZGF0LCBuKSkgeworCQkJaWYgKCFzbGFzaDEgfHwgIVNfSVNESVIoZS0+dmVyc2lvbnNbMV0ubW9kZSkpCisJCQkJZ290byBkZWxfZW50cnk7CisJCQlpZiAoIWUtPnRyZWUpCisJCQkJbG9hZF90cmVlKGUpOworCQkJaWYgKHRyZWVfY29udGVudF9yZW1vdmUoZSwgc2xhc2gxICsgMSwgYmFja3VwX2xlYWYpKSB7CisJCQkJZm9yIChuID0gMDsgbiA8IGUtPnRyZWUtPmVudHJ5X2NvdW50OyBuKyspIHsKKwkJCQkJaWYgKGUtPnRyZWUtPmVudHJpZXNbbl0tPnZlcnNpb25zWzFdLm1vZGUpIHsKKwkJCQkJCWhhc2hjbHIocm9vdC0+dmVyc2lvbnNbMV0uc2hhMSk7CisJCQkJCQlyZXR1cm4gMTsKKwkJCQkJfQorCQkJCX0KKwkJCQliYWNrdXBfbGVhZiA9IE5VTEw7CisJCQkJZ290byBkZWxfZW50cnk7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKKworZGVsX2VudHJ5OgorCWlmIChiYWNrdXBfbGVhZikKKwkJbWVtY3B5KGJhY2t1cF9sZWFmLCBlLCBzaXplb2YoKmJhY2t1cF9sZWFmKSk7CisJZWxzZSBpZiAoZS0+dHJlZSkKKwkJcmVsZWFzZV90cmVlX2NvbnRlbnRfcmVjdXJzaXZlKGUtPnRyZWUpOworCWUtPnRyZWUgPSBOVUxMOworCWUtPnZlcnNpb25zWzFdLm1vZGUgPSAwOworCWhhc2hjbHIoZS0+dmVyc2lvbnNbMV0uc2hhMSk7CisJaGFzaGNscihyb290LT52ZXJzaW9uc1sxXS5zaGExKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB0cmVlX2NvbnRlbnRfZ2V0KAorCXN0cnVjdCB0cmVlX2VudHJ5ICpyb290LAorCWNvbnN0IGNoYXIgKnAsCisJc3RydWN0IHRyZWVfZW50cnkgKmxlYWYpCit7CisJc3RydWN0IHRyZWVfY29udGVudCAqdCA9IHJvb3QtPnRyZWU7CisJY29uc3QgY2hhciAqc2xhc2gxOworCXVuc2lnbmVkIGludCBpLCBuOworCXN0cnVjdCB0cmVlX2VudHJ5ICplOworCisJc2xhc2gxID0gc3RyY2hyKHAsICcvJyk7CisJaWYgKHNsYXNoMSkKKwkJbiA9IHNsYXNoMSAtIHA7CisJZWxzZQorCQluID0gc3RybGVuKHApOworCisJZm9yIChpID0gMDsgaSA8IHQtPmVudHJ5X2NvdW50OyBpKyspIHsKKwkJZSA9IHQtPmVudHJpZXNbaV07CisJCWlmIChlLT5uYW1lLT5zdHJfbGVuID09IG4gJiYgIXN0cm5jbXAocCwgZS0+bmFtZS0+c3RyX2RhdCwgbikpIHsKKwkJCWlmICghc2xhc2gxKSB7CisJCQkJbWVtY3B5KGxlYWYsIGUsIHNpemVvZigqbGVhZikpOworCQkJCWlmIChlLT50cmVlICYmIGlzX251bGxfc2hhMShlLT52ZXJzaW9uc1sxXS5zaGExKSkKKwkJCQkJbGVhZi0+dHJlZSA9IGR1cF90cmVlX2NvbnRlbnQoZS0+dHJlZSk7CisJCQkJZWxzZQorCQkJCQlsZWFmLT50cmVlID0gTlVMTDsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWlmICghU19JU0RJUihlLT52ZXJzaW9uc1sxXS5tb2RlKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmICghZS0+dHJlZSkKKwkJCQlsb2FkX3RyZWUoZSk7CisJCQlyZXR1cm4gdHJlZV9jb250ZW50X2dldChlLCBzbGFzaDEgKyAxLCBsZWFmKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1cGRhdGVfYnJhbmNoKHN0cnVjdCBicmFuY2ggKmIpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKm1zZyA9ICJmYXN0LWltcG9ydCI7CisJc3RydWN0IHJlZl9sb2NrICpsb2NrOworCXVuc2lnbmVkIGNoYXIgb2xkX3NoYTFbMjBdOworCisJaWYgKGlzX251bGxfc2hhMShiLT5zaGExKSkKKwkJcmV0dXJuIDA7CisJaWYgKHJlYWRfcmVmKGItPm5hbWUsIG9sZF9zaGExKSkKKwkJaGFzaGNscihvbGRfc2hhMSk7CisJbG9jayA9IGxvY2tfYW55X3JlZl9mb3JfdXBkYXRlKGItPm5hbWUsIG9sZF9zaGExLCAwKTsKKwlpZiAoIWxvY2spCisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIGxvY2sgJXMiLCBiLT5uYW1lKTsKKwlpZiAoIWZvcmNlX3VwZGF0ZSAmJiAhaXNfbnVsbF9zaGExKG9sZF9zaGExKSkgeworCQlzdHJ1Y3QgY29tbWl0ICpvbGRfY21pdCwgKm5ld19jbWl0OworCisJCW9sZF9jbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2VfZ2VudGx5KG9sZF9zaGExLCAwKTsKKwkJbmV3X2NtaXQgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZV9nZW50bHkoYi0+c2hhMSwgMCk7CisJCWlmICghb2xkX2NtaXQgfHwgIW5ld19jbWl0KSB7CisJCQl1bmxvY2tfcmVmKGxvY2spOworCQkJcmV0dXJuIGVycm9yKCJCcmFuY2ggJXMgaXMgbWlzc2luZyBjb21taXRzLiIsIGItPm5hbWUpOworCQl9CisKKwkJaWYgKCFpbl9tZXJnZV9iYXNlcyhvbGRfY21pdCwgJm5ld19jbWl0LCAxKSkgeworCQkJdW5sb2NrX3JlZihsb2NrKTsKKwkJCXdhcm5pbmcoIk5vdCB1cGRhdGluZyAlcyIKKwkJCQkiIChuZXcgdGlwICVzIGRvZXMgbm90IGNvbnRhaW4gJXMpIiwKKwkJCQliLT5uYW1lLCBzaGExX3RvX2hleChiLT5zaGExKSwgc2hhMV90b19oZXgob2xkX3NoYTEpKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlpZiAod3JpdGVfcmVmX3NoYTEobG9jaywgYi0+c2hhMSwgbXNnKSA8IDApCisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIHVwZGF0ZSAlcyIsIGItPm5hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2JyYW5jaGVzKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGJyYW5jaCAqYjsKKworCWZvciAoaSA9IDA7IGkgPCBicmFuY2hfdGFibGVfc3o7IGkrKykgeworCQlmb3IgKGIgPSBicmFuY2hfdGFibGVbaV07IGI7IGIgPSBiLT50YWJsZV9uZXh0X2JyYW5jaCkKKwkJCWZhaWx1cmUgfD0gdXBkYXRlX2JyYW5jaChiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfdGFncyh2b2lkKQoreworCXN0YXRpYyBjb25zdCBjaGFyICptc2cgPSAiZmFzdC1pbXBvcnQiOworCXN0cnVjdCB0YWcgKnQ7CisJc3RydWN0IHJlZl9sb2NrICpsb2NrOworCWNoYXIgcmVmX25hbWVbUEFUSF9NQVhdOworCisJZm9yICh0ID0gZmlyc3RfdGFnOyB0OyB0ID0gdC0+bmV4dF90YWcpIHsKKwkJc3ByaW50ZihyZWZfbmFtZSwgInRhZ3MvJXMiLCB0LT5uYW1lKTsKKwkJbG9jayA9IGxvY2tfcmVmX3NoYTEocmVmX25hbWUsIE5VTEwpOworCQlpZiAoIWxvY2sgfHwgd3JpdGVfcmVmX3NoYTEobG9jaywgdC0+c2hhMSwgbXNnKSA8IDApCisJCQlmYWlsdXJlIHw9IGVycm9yKCJVbmFibGUgdG8gdXBkYXRlICVzIiwgcmVmX25hbWUpOworCX0KK30KKworc3RhdGljIHZvaWQgZHVtcF9tYXJrc19oZWxwZXIoRklMRSAqZiwKKwl1aW50bWF4X3QgYmFzZSwKKwlzdHJ1Y3QgbWFya19zZXQgKm0pCit7CisJdWludG1heF90IGs7CisJaWYgKG0tPnNoaWZ0KSB7CisJCWZvciAoayA9IDA7IGsgPCAxMDI0OyBrKyspIHsKKwkJCWlmIChtLT5kYXRhLnNldHNba10pCisJCQkJZHVtcF9tYXJrc19oZWxwZXIoZiwgKGJhc2UgKyBrKSA8PCBtLT5zaGlmdCwKKwkJCQkJbS0+ZGF0YS5zZXRzW2tdKTsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoayA9IDA7IGsgPCAxMDI0OyBrKyspIHsKKwkJCWlmIChtLT5kYXRhLm1hcmtlZFtrXSkKKwkJCQlmcHJpbnRmKGYsICI6JSIgUFJJdU1BWCAiICVzXG4iLCBiYXNlICsgaywKKwkJCQkJc2hhMV90b19oZXgobS0+ZGF0YS5tYXJrZWRba10tPnNoYTEpKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZHVtcF9tYXJrcyh2b2lkKQoreworCXN0YXRpYyBzdHJ1Y3QgbG9ja19maWxlIG1hcmtfbG9jazsKKwlpbnQgbWFya19mZDsKKwlGSUxFICpmOworCisJaWYgKCFtYXJrX2ZpbGUpCisJCXJldHVybjsKKworCW1hcmtfZmQgPSBob2xkX2xvY2tfZmlsZV9mb3JfdXBkYXRlKCZtYXJrX2xvY2ssIG1hcmtfZmlsZSwgMCk7CisJaWYgKG1hcmtfZmQgPCAwKSB7CisJCWZhaWx1cmUgfD0gZXJyb3IoIlVuYWJsZSB0byB3cml0ZSBtYXJrcyBmaWxlICVzOiAlcyIsCisJCQltYXJrX2ZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybjsKKwl9CisKKwlmID0gZmRvcGVuKG1hcmtfZmQsICJ3Iik7CisJaWYgKCFmKSB7CisJCWludCBzYXZlZF9lcnJubyA9IGVycm5vOworCQlyb2xsYmFja19sb2NrX2ZpbGUoJm1hcmtfbG9jayk7CisJCWZhaWx1cmUgfD0gZXJyb3IoIlVuYWJsZSB0byB3cml0ZSBtYXJrcyBmaWxlICVzOiAlcyIsCisJCQltYXJrX2ZpbGUsIHN0cmVycm9yKHNhdmVkX2Vycm5vKSk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFNpbmNlIHRoZSBsb2NrIGZpbGUgd2FzIGZkb3BlbigpJ2VkLCBpdCBzaG91bGQgbm90IGJlIGNsb3NlKCknZWQuCisJICogQXNzaWduIC0xIHRvIHRoZSBsb2NrIGZpbGUgZGVzY3JpcHRvciBzbyB0aGF0IGNvbW1pdF9sb2NrX2ZpbGUoKQorCSAqIHdvbid0IHRyeSB0byBjbG9zZSgpIGl0LgorCSAqLworCW1hcmtfbG9jay5mZCA9IC0xOworCisJZHVtcF9tYXJrc19oZWxwZXIoZiwgMCwgbWFya3MpOworCWlmIChmZXJyb3IoZikgfHwgZmNsb3NlKGYpKSB7CisJCWludCBzYXZlZF9lcnJubyA9IGVycm5vOworCQlyb2xsYmFja19sb2NrX2ZpbGUoJm1hcmtfbG9jayk7CisJCWZhaWx1cmUgfD0gZXJyb3IoIlVuYWJsZSB0byB3cml0ZSBtYXJrcyBmaWxlICVzOiAlcyIsCisJCQltYXJrX2ZpbGUsIHN0cmVycm9yKHNhdmVkX2Vycm5vKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoY29tbWl0X2xvY2tfZmlsZSgmbWFya19sb2NrKSkgeworCQlpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKKwkJcm9sbGJhY2tfbG9ja19maWxlKCZtYXJrX2xvY2spOworCQlmYWlsdXJlIHw9IGVycm9yKCJVbmFibGUgdG8gY29tbWl0IG1hcmtzIGZpbGUgJXM6ICVzIiwKKwkJCW1hcmtfZmlsZSwgc3RyZXJyb3Ioc2F2ZWRfZXJybm8pKTsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIGludCByZWFkX25leHRfY29tbWFuZCh2b2lkKQoreworCXN0YXRpYyBpbnQgc3RkaW5fZW9mID0gMDsKKworCWlmIChzdGRpbl9lb2YpIHsKKwkJdW5yZWFkX2NvbW1hbmRfYnVmID0gMDsKKwkJcmV0dXJuIEVPRjsKKwl9CisKKwlkbyB7CisJCWlmICh1bnJlYWRfY29tbWFuZF9idWYpIHsKKwkJCXVucmVhZF9jb21tYW5kX2J1ZiA9IDA7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgcmVjZW50X2NvbW1hbmQgKnJjOworCisJCQlzdHJidWZfZGV0YWNoKCZjb21tYW5kX2J1ZiwgTlVMTCk7CisJCQlzdGRpbl9lb2YgPSBzdHJidWZfZ2V0bGluZSgmY29tbWFuZF9idWYsIHN0ZGluLCAnXG4nKTsKKwkJCWlmIChzdGRpbl9lb2YpCisJCQkJcmV0dXJuIEVPRjsKKworCQkJcmMgPSByY19mcmVlOworCQkJaWYgKHJjKQorCQkJCXJjX2ZyZWUgPSByYy0+bmV4dDsKKwkJCWVsc2UgeworCQkJCXJjID0gY21kX2hpc3QubmV4dDsKKwkJCQljbWRfaGlzdC5uZXh0ID0gcmMtPm5leHQ7CisJCQkJY21kX2hpc3QubmV4dC0+cHJldiA9ICZjbWRfaGlzdDsKKwkJCQlmcmVlKHJjLT5idWYpOworCQkJfQorCisJCQlyYy0+YnVmID0gY29tbWFuZF9idWYuYnVmOworCQkJcmMtPnByZXYgPSBjbWRfdGFpbDsKKwkJCXJjLT5uZXh0ID0gY21kX2hpc3QucHJldjsKKwkJCXJjLT5wcmV2LT5uZXh0ID0gcmM7CisJCQljbWRfdGFpbCA9IHJjOworCQl9CisJfSB3aGlsZSAoY29tbWFuZF9idWYuYnVmWzBdID09ICcjJyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2tpcF9vcHRpb25hbF9sZih2b2lkKQoreworCWludCB0ZXJtX2NoYXIgPSBmZ2V0YyhzdGRpbik7CisJaWYgKHRlcm1fY2hhciAhPSAnXG4nICYmIHRlcm1fY2hhciAhPSBFT0YpCisJCXVuZ2V0Yyh0ZXJtX2NoYXIsIHN0ZGluKTsKK30KKworc3RhdGljIHZvaWQgY21kX21hcmsodm9pZCkKK3sKKwlpZiAoIXByZWZpeGNtcChjb21tYW5kX2J1Zi5idWYsICJtYXJrIDoiKSkgeworCQluZXh0X21hcmsgPSBzdHJ0b3VtYXgoY29tbWFuZF9idWYuYnVmICsgNiwgTlVMTCwgMTApOworCQlyZWFkX25leHRfY29tbWFuZCgpOworCX0KKwllbHNlCisJCW5leHRfbWFyayA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9kYXRhKHN0cnVjdCBzdHJidWYgKnNiKQoreworCXN0cmJ1Zl9yZXNldChzYik7CisKKwlpZiAocHJlZml4Y21wKGNvbW1hbmRfYnVmLmJ1ZiwgImRhdGEgIikpCisJCWRpZSgiRXhwZWN0ZWQgJ2RhdGEgbicgY29tbWFuZCwgZm91bmQ6ICVzIiwgY29tbWFuZF9idWYuYnVmKTsKKworCWlmICghcHJlZml4Y21wKGNvbW1hbmRfYnVmLmJ1ZiArIDUsICI8PCIpKSB7CisJCWNoYXIgKnRlcm0gPSB4c3RyZHVwKGNvbW1hbmRfYnVmLmJ1ZiArIDUgKyAyKTsKKwkJc2l6ZV90IHRlcm1fbGVuID0gY29tbWFuZF9idWYubGVuIC0gNSAtIDI7CisKKwkJc3RyYnVmX2RldGFjaCgmY29tbWFuZF9idWYsIE5VTEwpOworCQlmb3IgKDs7KSB7CisJCQlpZiAoc3RyYnVmX2dldGxpbmUoJmNvbW1hbmRfYnVmLCBzdGRpbiwgJ1xuJykgPT0gRU9GKQorCQkJCWRpZSgiRU9GIGluIGRhdGEgKHRlcm1pbmF0b3IgJyVzJyBub3QgZm91bmQpIiwgdGVybSk7CisJCQlpZiAodGVybV9sZW4gPT0gY29tbWFuZF9idWYubGVuCisJCQkJJiYgIXN0cmNtcCh0ZXJtLCBjb21tYW5kX2J1Zi5idWYpKQorCQkJCWJyZWFrOworCQkJc3RyYnVmX2FkZGJ1ZihzYiwgJmNvbW1hbmRfYnVmKTsKKwkJCXN0cmJ1Zl9hZGRjaChzYiwgJ1xuJyk7CisJCX0KKwkJZnJlZSh0ZXJtKTsKKwl9CisJZWxzZSB7CisJCXNpemVfdCBuID0gMCwgbGVuZ3RoOworCisJCWxlbmd0aCA9IHN0cnRvdWwoY29tbWFuZF9idWYuYnVmICsgNSwgTlVMTCwgMTApOworCisJCXdoaWxlIChuIDwgbGVuZ3RoKSB7CisJCQlzaXplX3QgcyA9IHN0cmJ1Zl9mcmVhZChzYiwgbGVuZ3RoIC0gbiwgc3RkaW4pOworCQkJaWYgKCFzICYmIGZlb2Yoc3RkaW4pKQorCQkJCWRpZSgiRU9GIGluIGRhdGEgKCVsdSBieXRlcyByZW1haW5pbmcpIiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpKGxlbmd0aCAtIG4pKTsKKwkJCW4gKz0gczsKKwkJfQorCX0KKworCXNraXBfb3B0aW9uYWxfbGYoKTsKK30KKworc3RhdGljIGludCB2YWxpZGF0ZV9yYXdfZGF0ZShjb25zdCBjaGFyICpzcmMsIGNoYXIgKnJlc3VsdCwgaW50IG1heGxlbikKK3sKKwljb25zdCBjaGFyICpvcmlnX3NyYyA9IHNyYzsKKwljaGFyICplbmRwLCBzaWduOworCisJc3RydG91bChzcmMsICZlbmRwLCAxMCk7CisJaWYgKGVuZHAgPT0gc3JjIHx8ICplbmRwICE9ICcgJykKKwkJcmV0dXJuIC0xOworCisJc3JjID0gZW5kcCArIDE7CisJaWYgKCpzcmMgIT0gJy0nICYmICpzcmMgIT0gJysnKQorCQlyZXR1cm4gLTE7CisJc2lnbiA9ICpzcmM7CisKKwlzdHJ0b3VsKHNyYyArIDEsICZlbmRwLCAxMCk7CisJaWYgKGVuZHAgPT0gc3JjIHx8ICplbmRwIHx8IChlbmRwIC0gb3JpZ19zcmMpID49IG1heGxlbikKKwkJcmV0dXJuIC0xOworCisJc3RyY3B5KHJlc3VsdCwgb3JpZ19zcmMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY2hhciAqcGFyc2VfaWRlbnQoY29uc3QgY2hhciAqYnVmKQoreworCWNvbnN0IGNoYXIgKmd0OworCXNpemVfdCBuYW1lX2xlbjsKKwljaGFyICppZGVudDsKKworCWd0ID0gc3RycmNocihidWYsICc+Jyk7CisJaWYgKCFndCkKKwkJZGllKCJNaXNzaW5nID4gaW4gaWRlbnQgc3RyaW5nOiAlcyIsIGJ1Zik7CisJZ3QrKzsKKwlpZiAoKmd0ICE9ICcgJykKKwkJZGllKCJNaXNzaW5nIHNwYWNlIGFmdGVyID4gaW4gaWRlbnQgc3RyaW5nOiAlcyIsIGJ1Zik7CisJZ3QrKzsKKwluYW1lX2xlbiA9IGd0IC0gYnVmOworCWlkZW50ID0geG1hbGxvYyhuYW1lX2xlbiArIDI0KTsKKwlzdHJuY3B5KGlkZW50LCBidWYsIG5hbWVfbGVuKTsKKworCXN3aXRjaCAod2hlbnNwZWMpIHsKKwljYXNlIFdIRU5TUEVDX1JBVzoKKwkJaWYgKHZhbGlkYXRlX3Jhd19kYXRlKGd0LCBpZGVudCArIG5hbWVfbGVuLCAyNCkgPCAwKQorCQkJZGllKCJJbnZhbGlkIHJhdyBkYXRlIFwiJXNcIiBpbiBpZGVudDogJXMiLCBndCwgYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBXSEVOU1BFQ19SRkMyODIyOgorCQlpZiAocGFyc2VfZGF0ZShndCwgaWRlbnQgKyBuYW1lX2xlbiwgMjQpIDwgMCkKKwkJCWRpZSgiSW52YWxpZCByZmMyODIyIGRhdGUgXCIlc1wiIGluIGlkZW50OiAlcyIsIGd0LCBidWYpOworCQlicmVhazsKKwljYXNlIFdIRU5TUEVDX05PVzoKKwkJaWYgKHN0cmNtcCgibm93IiwgZ3QpKQorCQkJZGllKCJEYXRlIGluIGlkZW50IG11c3QgYmUgJ25vdyc6ICVzIiwgYnVmKTsKKwkJZGF0ZXN0YW1wKGlkZW50ICsgbmFtZV9sZW4sIDI0KTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGlkZW50OworfQorCitzdGF0aWMgdm9pZCBjbWRfbmV3X2Jsb2Iodm9pZCkKK3sKKwlzdGF0aWMgc3RydWN0IHN0cmJ1ZiBidWYgPSBTVFJCVUZfSU5JVDsKKworCXJlYWRfbmV4dF9jb21tYW5kKCk7CisJY21kX21hcmsoKTsKKwljbWRfZGF0YSgmYnVmKTsKKwlzdG9yZV9vYmplY3QoT0JKX0JMT0IsICZidWYsICZsYXN0X2Jsb2IsIE5VTEwsIG5leHRfbWFyayk7Cit9CisKK3N0YXRpYyB2b2lkIHVubG9hZF9vbmVfYnJhbmNoKHZvaWQpCit7CisJd2hpbGUgKGN1cl9hY3RpdmVfYnJhbmNoZXMKKwkJJiYgY3VyX2FjdGl2ZV9icmFuY2hlcyA+PSBtYXhfYWN0aXZlX2JyYW5jaGVzKSB7CisJCXVpbnRtYXhfdCBtaW5fY29tbWl0ID0gVUxPTkdfTUFYOworCQlzdHJ1Y3QgYnJhbmNoICplLCAqbCA9IE5VTEwsICpwID0gTlVMTDsKKworCQlmb3IgKGUgPSBhY3RpdmVfYnJhbmNoZXM7IGU7IGUgPSBlLT5hY3RpdmVfbmV4dF9icmFuY2gpIHsKKwkJCWlmIChlLT5sYXN0X2NvbW1pdCA8IG1pbl9jb21taXQpIHsKKwkJCQlwID0gbDsKKwkJCQltaW5fY29tbWl0ID0gZS0+bGFzdF9jb21taXQ7CisJCQl9CisJCQlsID0gZTsKKwkJfQorCisJCWlmIChwKSB7CisJCQllID0gcC0+YWN0aXZlX25leHRfYnJhbmNoOworCQkJcC0+YWN0aXZlX25leHRfYnJhbmNoID0gZS0+YWN0aXZlX25leHRfYnJhbmNoOworCQl9IGVsc2UgeworCQkJZSA9IGFjdGl2ZV9icmFuY2hlczsKKwkJCWFjdGl2ZV9icmFuY2hlcyA9IGUtPmFjdGl2ZV9uZXh0X2JyYW5jaDsKKwkJfQorCQllLT5hY3RpdmUgPSAwOworCQllLT5hY3RpdmVfbmV4dF9icmFuY2ggPSBOVUxMOworCQlpZiAoZS0+YnJhbmNoX3RyZWUudHJlZSkgeworCQkJcmVsZWFzZV90cmVlX2NvbnRlbnRfcmVjdXJzaXZlKGUtPmJyYW5jaF90cmVlLnRyZWUpOworCQkJZS0+YnJhbmNoX3RyZWUudHJlZSA9IE5VTEw7CisJCX0KKwkJY3VyX2FjdGl2ZV9icmFuY2hlcy0tOworCX0KK30KKworc3RhdGljIHZvaWQgbG9hZF9icmFuY2goc3RydWN0IGJyYW5jaCAqYikKK3sKKwlsb2FkX3RyZWUoJmItPmJyYW5jaF90cmVlKTsKKwlpZiAoIWItPmFjdGl2ZSkgeworCQliLT5hY3RpdmUgPSAxOworCQliLT5hY3RpdmVfbmV4dF9icmFuY2ggPSBhY3RpdmVfYnJhbmNoZXM7CisJCWFjdGl2ZV9icmFuY2hlcyA9IGI7CisJCWN1cl9hY3RpdmVfYnJhbmNoZXMrKzsKKwkJYnJhbmNoX2xvYWRfY291bnQrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZpbGVfY2hhbmdlX20oc3RydWN0IGJyYW5jaCAqYikKK3sKKwljb25zdCBjaGFyICpwID0gY29tbWFuZF9idWYuYnVmICsgMjsKKwlzdGF0aWMgc3RydWN0IHN0cmJ1ZiB1cSA9IFNUUkJVRl9JTklUOworCWNvbnN0IGNoYXIgKmVuZHA7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqb2UgPSBvZTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXVpbnQxNl90IG1vZGUsIGlubGluZV9kYXRhID0gMDsKKworCXAgPSBnZXRfbW9kZShwLCAmbW9kZSk7CisJaWYgKCFwKQorCQlkaWUoIkNvcnJ1cHQgbW9kZTogJXMiLCBjb21tYW5kX2J1Zi5idWYpOworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgU19JRlJFRyB8IDA2NDQ6CisJY2FzZSBTX0lGUkVHIHwgMDc1NToKKwljYXNlIFNfSUZMTks6CisJY2FzZSAwNjQ0OgorCWNhc2UgMDc1NToKKwkJLyogb2sgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGllKCJDb3JydXB0IG1vZGU6ICVzIiwgY29tbWFuZF9idWYuYnVmKTsKKwl9CisKKwlpZiAoKnAgPT0gJzonKSB7CisJCWNoYXIgKng7CisJCW9lID0gZmluZF9tYXJrKHN0cnRvdW1heChwICsgMSwgJngsIDEwKSk7CisJCWhhc2hjcHkoc2hhMSwgb2UtPnNoYTEpOworCQlwID0geDsKKwl9IGVsc2UgaWYgKCFwcmVmaXhjbXAocCwgImlubGluZSIpKSB7CisJCWlubGluZV9kYXRhID0gMTsKKwkJcCArPSA2OworCX0gZWxzZSB7CisJCWlmIChnZXRfc2hhMV9oZXgocCwgc2hhMSkpCisJCQlkaWUoIkludmFsaWQgU0hBMTogJXMiLCBjb21tYW5kX2J1Zi5idWYpOworCQlvZSA9IGZpbmRfb2JqZWN0KHNoYTEpOworCQlwICs9IDQwOworCX0KKwlpZiAoKnArKyAhPSAnICcpCisJCWRpZSgiTWlzc2luZyBzcGFjZSBhZnRlciBTSEExOiAlcyIsIGNvbW1hbmRfYnVmLmJ1Zik7CisKKwlzdHJidWZfcmVzZXQoJnVxKTsKKwlpZiAoIXVucXVvdGVfY19zdHlsZSgmdXEsIHAsICZlbmRwKSkgeworCQlpZiAoKmVuZHApCisJCQlkaWUoIkdhcmJhZ2UgYWZ0ZXIgcGF0aCBpbjogJXMiLCBjb21tYW5kX2J1Zi5idWYpOworCQlwID0gdXEuYnVmOworCX0KKworCWlmIChpbmxpbmVfZGF0YSkgeworCQlzdGF0aWMgc3RydWN0IHN0cmJ1ZiBidWYgPSBTVFJCVUZfSU5JVDsKKworCQlpZiAocCAhPSB1cS5idWYpIHsKKwkJCXN0cmJ1Zl9hZGRzdHIoJnVxLCBwKTsKKwkJCXAgPSB1cS5idWY7CisJCX0KKwkJcmVhZF9uZXh0X2NvbW1hbmQoKTsKKwkJY21kX2RhdGEoJmJ1Zik7CisJCXN0b3JlX29iamVjdChPQkpfQkxPQiwgJmJ1ZiwgJmxhc3RfYmxvYiwgc2hhMSwgMCk7CisJfSBlbHNlIGlmIChvZSkgeworCQlpZiAob2UtPnR5cGUgIT0gT0JKX0JMT0IpCisJCQlkaWUoIk5vdCBhIGJsb2IgKGFjdHVhbGx5IGEgJXMpOiAlcyIsCisJCQkJdHlwZW5hbWUob2UtPnR5cGUpLCBjb21tYW5kX2J1Zi5idWYpOworCX0gZWxzZSB7CisJCWVudW0gb2JqZWN0X3R5cGUgdHlwZSA9IHNoYTFfb2JqZWN0X2luZm8oc2hhMSwgTlVMTCk7CisJCWlmICh0eXBlIDwgMCkKKwkJCWRpZSgiQmxvYiBub3QgZm91bmQ6ICVzIiwgY29tbWFuZF9idWYuYnVmKTsKKwkJaWYgKHR5cGUgIT0gT0JKX0JMT0IpCisJCQlkaWUoIk5vdCBhIGJsb2IgKGFjdHVhbGx5IGEgJXMpOiAlcyIsCisJCQkgICAgdHlwZW5hbWUodHlwZSksIGNvbW1hbmRfYnVmLmJ1Zik7CisJfQorCisJdHJlZV9jb250ZW50X3NldCgmYi0+YnJhbmNoX3RyZWUsIHAsIHNoYTEsIFNfSUZSRUcgfCBtb2RlLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgZmlsZV9jaGFuZ2VfZChzdHJ1Y3QgYnJhbmNoICpiKQoreworCWNvbnN0IGNoYXIgKnAgPSBjb21tYW5kX2J1Zi5idWYgKyAyOworCXN0YXRpYyBzdHJ1Y3Qgc3RyYnVmIHVxID0gU1RSQlVGX0lOSVQ7CisJY29uc3QgY2hhciAqZW5kcDsKKworCXN0cmJ1Zl9yZXNldCgmdXEpOworCWlmICghdW5xdW90ZV9jX3N0eWxlKCZ1cSwgcCwgJmVuZHApKSB7CisJCWlmICgqZW5kcCkKKwkJCWRpZSgiR2FyYmFnZSBhZnRlciBwYXRoIGluOiAlcyIsIGNvbW1hbmRfYnVmLmJ1Zik7CisJCXAgPSB1cS5idWY7CisJfQorCXRyZWVfY29udGVudF9yZW1vdmUoJmItPmJyYW5jaF90cmVlLCBwLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgZmlsZV9jaGFuZ2VfY3Ioc3RydWN0IGJyYW5jaCAqYiwgaW50IHJlbmFtZSkKK3sKKwljb25zdCBjaGFyICpzLCAqZDsKKwlzdGF0aWMgc3RydWN0IHN0cmJ1ZiBzX3VxID0gU1RSQlVGX0lOSVQ7CisJc3RhdGljIHN0cnVjdCBzdHJidWYgZF91cSA9IFNUUkJVRl9JTklUOworCWNvbnN0IGNoYXIgKmVuZHA7CisJc3RydWN0IHRyZWVfZW50cnkgbGVhZjsKKworCXMgPSBjb21tYW5kX2J1Zi5idWYgKyAyOworCXN0cmJ1Zl9yZXNldCgmc191cSk7CisJaWYgKCF1bnF1b3RlX2Nfc3R5bGUoJnNfdXEsIHMsICZlbmRwKSkgeworCQlpZiAoKmVuZHAgIT0gJyAnKQorCQkJZGllKCJNaXNzaW5nIHNwYWNlIGFmdGVyIHNvdXJjZTogJXMiLCBjb21tYW5kX2J1Zi5idWYpOworCX0gZWxzZSB7CisJCWVuZHAgPSBzdHJjaHIocywgJyAnKTsKKwkJaWYgKCFlbmRwKQorCQkJZGllKCJNaXNzaW5nIHNwYWNlIGFmdGVyIHNvdXJjZTogJXMiLCBjb21tYW5kX2J1Zi5idWYpOworCQlzdHJidWZfYWRkKCZzX3VxLCBzLCBlbmRwIC0gcyk7CisJfQorCXMgPSBzX3VxLmJ1ZjsKKworCWVuZHArKzsKKwlpZiAoISplbmRwKQorCQlkaWUoIk1pc3NpbmcgZGVzdDogJXMiLCBjb21tYW5kX2J1Zi5idWYpOworCisJZCA9IGVuZHA7CisJc3RyYnVmX3Jlc2V0KCZkX3VxKTsKKwlpZiAoIXVucXVvdGVfY19zdHlsZSgmZF91cSwgZCwgJmVuZHApKSB7CisJCWlmICgqZW5kcCkKKwkJCWRpZSgiR2FyYmFnZSBhZnRlciBkZXN0IGluOiAlcyIsIGNvbW1hbmRfYnVmLmJ1Zik7CisJCWQgPSBkX3VxLmJ1ZjsKKwl9CisKKwltZW1zZXQoJmxlYWYsIDAsIHNpemVvZihsZWFmKSk7CisJaWYgKHJlbmFtZSkKKwkJdHJlZV9jb250ZW50X3JlbW92ZSgmYi0+YnJhbmNoX3RyZWUsIHMsICZsZWFmKTsKKwllbHNlCisJCXRyZWVfY29udGVudF9nZXQoJmItPmJyYW5jaF90cmVlLCBzLCAmbGVhZik7CisJaWYgKCFsZWFmLnZlcnNpb25zWzFdLm1vZGUpCisJCWRpZSgiUGF0aCAlcyBub3QgaW4gYnJhbmNoIiwgcyk7CisJdHJlZV9jb250ZW50X3NldCgmYi0+YnJhbmNoX3RyZWUsIGQsCisJCWxlYWYudmVyc2lvbnNbMV0uc2hhMSwKKwkJbGVhZi52ZXJzaW9uc1sxXS5tb2RlLAorCQlsZWFmLnRyZWUpOworfQorCitzdGF0aWMgdm9pZCBmaWxlX2NoYW5nZV9kZWxldGVhbGwoc3RydWN0IGJyYW5jaCAqYikKK3sKKwlyZWxlYXNlX3RyZWVfY29udGVudF9yZWN1cnNpdmUoYi0+YnJhbmNoX3RyZWUudHJlZSk7CisJaGFzaGNscihiLT5icmFuY2hfdHJlZS52ZXJzaW9uc1swXS5zaGExKTsKKwloYXNoY2xyKGItPmJyYW5jaF90cmVlLnZlcnNpb25zWzFdLnNoYTEpOworCWxvYWRfdHJlZSgmYi0+YnJhbmNoX3RyZWUpOworfQorCitzdGF0aWMgdm9pZCBjbWRfZnJvbV9jb21taXQoc3RydWN0IGJyYW5jaCAqYiwgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaWYgKCFidWYgfHwgc2l6ZSA8IDQ2KQorCQlkaWUoIk5vdCBhIHZhbGlkIGNvbW1pdDogJXMiLCBzaGExX3RvX2hleChiLT5zaGExKSk7CisJaWYgKG1lbWNtcCgidHJlZSAiLCBidWYsIDUpCisJCXx8IGdldF9zaGExX2hleChidWYgKyA1LCBiLT5icmFuY2hfdHJlZS52ZXJzaW9uc1sxXS5zaGExKSkKKwkJZGllKCJUaGUgY29tbWl0ICVzIGlzIGNvcnJ1cHQiLCBzaGExX3RvX2hleChiLT5zaGExKSk7CisJaGFzaGNweShiLT5icmFuY2hfdHJlZS52ZXJzaW9uc1swXS5zaGExLAorCQliLT5icmFuY2hfdHJlZS52ZXJzaW9uc1sxXS5zaGExKTsKK30KKworc3RhdGljIHZvaWQgY21kX2Zyb21fZXhpc3Rpbmcoc3RydWN0IGJyYW5jaCAqYikKK3sKKwlpZiAoaXNfbnVsbF9zaGExKGItPnNoYTEpKSB7CisJCWhhc2hjbHIoYi0+YnJhbmNoX3RyZWUudmVyc2lvbnNbMF0uc2hhMSk7CisJCWhhc2hjbHIoYi0+YnJhbmNoX3RyZWUudmVyc2lvbnNbMV0uc2hhMSk7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBzaXplOworCQljaGFyICpidWY7CisKKwkJYnVmID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2UoYi0+c2hhMSwKKwkJCWNvbW1pdF90eXBlLCAmc2l6ZSwgYi0+c2hhMSk7CisJCWNtZF9mcm9tX2NvbW1pdChiLCBidWYsIHNpemUpOworCQlmcmVlKGJ1Zik7CisJfQorfQorCitzdGF0aWMgaW50IGNtZF9mcm9tKHN0cnVjdCBicmFuY2ggKmIpCit7CisJY29uc3QgY2hhciAqZnJvbTsKKwlzdHJ1Y3QgYnJhbmNoICpzOworCisJaWYgKHByZWZpeGNtcChjb21tYW5kX2J1Zi5idWYsICJmcm9tICIpKQorCQlyZXR1cm4gMDsKKworCWlmIChiLT5icmFuY2hfdHJlZS50cmVlKSB7CisJCXJlbGVhc2VfdHJlZV9jb250ZW50X3JlY3Vyc2l2ZShiLT5icmFuY2hfdHJlZS50cmVlKTsKKwkJYi0+YnJhbmNoX3RyZWUudHJlZSA9IE5VTEw7CisJfQorCisJZnJvbSA9IHN0cmNocihjb21tYW5kX2J1Zi5idWYsICcgJykgKyAxOworCXMgPSBsb29rdXBfYnJhbmNoKGZyb20pOworCWlmIChiID09IHMpCisJCWRpZSgiQ2FuJ3QgY3JlYXRlIGEgYnJhbmNoIGZyb20gaXRzZWxmOiAlcyIsIGItPm5hbWUpOworCWVsc2UgaWYgKHMpIHsKKwkJdW5zaWduZWQgY2hhciAqdCA9IHMtPmJyYW5jaF90cmVlLnZlcnNpb25zWzFdLnNoYTE7CisJCWhhc2hjcHkoYi0+c2hhMSwgcy0+c2hhMSk7CisJCWhhc2hjcHkoYi0+YnJhbmNoX3RyZWUudmVyc2lvbnNbMF0uc2hhMSwgdCk7CisJCWhhc2hjcHkoYi0+YnJhbmNoX3RyZWUudmVyc2lvbnNbMV0uc2hhMSwgdCk7CisJfSBlbHNlIGlmICgqZnJvbSA9PSAnOicpIHsKKwkJdWludG1heF90IGlkbnVtID0gc3RydG91bWF4KGZyb20gKyAxLCBOVUxMLCAxMCk7CisJCXN0cnVjdCBvYmplY3RfZW50cnkgKm9lID0gZmluZF9tYXJrKGlkbnVtKTsKKwkJaWYgKG9lLT50eXBlICE9IE9CSl9DT01NSVQpCisJCQlkaWUoIk1hcmsgOiUiIFBSSXVNQVggIiBub3QgYSBjb21taXQiLCBpZG51bSk7CisJCWhhc2hjcHkoYi0+c2hhMSwgb2UtPnNoYTEpOworCQlpZiAob2UtPnBhY2tfaWQgIT0gTUFYX1BBQ0tfSUQpIHsKKwkJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwkJCWNoYXIgKmJ1ZiA9IGdmaV91bnBhY2tfZW50cnkob2UsICZzaXplKTsKKwkJCWNtZF9mcm9tX2NvbW1pdChiLCBidWYsIHNpemUpOworCQkJZnJlZShidWYpOworCQl9IGVsc2UKKwkJCWNtZF9mcm9tX2V4aXN0aW5nKGIpOworCX0gZWxzZSBpZiAoIWdldF9zaGExKGZyb20sIGItPnNoYTEpKQorCQljbWRfZnJvbV9leGlzdGluZyhiKTsKKwllbHNlCisJCWRpZSgiSW52YWxpZCByZWYgbmFtZSBvciBTSEExIGV4cHJlc3Npb246ICVzIiwgZnJvbSk7CisKKwlyZWFkX25leHRfY29tbWFuZCgpOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGhhc2hfbGlzdCAqY21kX21lcmdlKHVuc2lnbmVkIGludCAqY291bnQpCit7CisJc3RydWN0IGhhc2hfbGlzdCAqbGlzdCA9IE5VTEwsICpuLCAqZSA9IGU7CisJY29uc3QgY2hhciAqZnJvbTsKKwlzdHJ1Y3QgYnJhbmNoICpzOworCisJKmNvdW50ID0gMDsKKwl3aGlsZSAoIXByZWZpeGNtcChjb21tYW5kX2J1Zi5idWYsICJtZXJnZSAiKSkgeworCQlmcm9tID0gc3RyY2hyKGNvbW1hbmRfYnVmLmJ1ZiwgJyAnKSArIDE7CisJCW4gPSB4bWFsbG9jKHNpemVvZigqbikpOworCQlzID0gbG9va3VwX2JyYW5jaChmcm9tKTsKKwkJaWYgKHMpCisJCQloYXNoY3B5KG4tPnNoYTEsIHMtPnNoYTEpOworCQllbHNlIGlmICgqZnJvbSA9PSAnOicpIHsKKwkJCXVpbnRtYXhfdCBpZG51bSA9IHN0cnRvdW1heChmcm9tICsgMSwgTlVMTCwgMTApOworCQkJc3RydWN0IG9iamVjdF9lbnRyeSAqb2UgPSBmaW5kX21hcmsoaWRudW0pOworCQkJaWYgKG9lLT50eXBlICE9IE9CSl9DT01NSVQpCisJCQkJZGllKCJNYXJrIDolIiBQUkl1TUFYICIgbm90IGEgY29tbWl0IiwgaWRudW0pOworCQkJaGFzaGNweShuLT5zaGExLCBvZS0+c2hhMSk7CisJCX0gZWxzZSBpZiAoIWdldF9zaGExKGZyb20sIG4tPnNoYTEpKSB7CisJCQl1bnNpZ25lZCBsb25nIHNpemU7CisJCQljaGFyICpidWYgPSByZWFkX29iamVjdF93aXRoX3JlZmVyZW5jZShuLT5zaGExLAorCQkJCWNvbW1pdF90eXBlLCAmc2l6ZSwgbi0+c2hhMSk7CisJCQlpZiAoIWJ1ZiB8fCBzaXplIDwgNDYpCisJCQkJZGllKCJOb3QgYSB2YWxpZCBjb21taXQ6ICVzIiwgZnJvbSk7CisJCQlmcmVlKGJ1Zik7CisJCX0gZWxzZQorCQkJZGllKCJJbnZhbGlkIHJlZiBuYW1lIG9yIFNIQTEgZXhwcmVzc2lvbjogJXMiLCBmcm9tKTsKKworCQluLT5uZXh0ID0gTlVMTDsKKwkJaWYgKGxpc3QpCisJCQllLT5uZXh0ID0gbjsKKwkJZWxzZQorCQkJbGlzdCA9IG47CisJCWUgPSBuOworCQkoKmNvdW50KSsrOworCQlyZWFkX25leHRfY29tbWFuZCgpOworCX0KKwlyZXR1cm4gbGlzdDsKK30KKworc3RhdGljIHZvaWQgY21kX25ld19jb21taXQodm9pZCkKK3sKKwlzdGF0aWMgc3RydWN0IHN0cmJ1ZiBtc2cgPSBTVFJCVUZfSU5JVDsKKwlzdHJ1Y3QgYnJhbmNoICpiOworCWNoYXIgKnNwOworCWNoYXIgKmF1dGhvciA9IE5VTEw7CisJY2hhciAqY29tbWl0dGVyID0gTlVMTDsKKwlzdHJ1Y3QgaGFzaF9saXN0ICptZXJnZV9saXN0ID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgbWVyZ2VfY291bnQ7CisKKwkvKiBPYnRhaW4gdGhlIGJyYW5jaCBuYW1lIGZyb20gdGhlIHJlc3Qgb2Ygb3VyIGNvbW1hbmQgKi8KKwlzcCA9IHN0cmNocihjb21tYW5kX2J1Zi5idWYsICcgJykgKyAxOworCWIgPSBsb29rdXBfYnJhbmNoKHNwKTsKKwlpZiAoIWIpCisJCWIgPSBuZXdfYnJhbmNoKHNwKTsKKworCXJlYWRfbmV4dF9jb21tYW5kKCk7CisJY21kX21hcmsoKTsKKwlpZiAoIXByZWZpeGNtcChjb21tYW5kX2J1Zi5idWYsICJhdXRob3IgIikpIHsKKwkJYXV0aG9yID0gcGFyc2VfaWRlbnQoY29tbWFuZF9idWYuYnVmICsgNyk7CisJCXJlYWRfbmV4dF9jb21tYW5kKCk7CisJfQorCWlmICghcHJlZml4Y21wKGNvbW1hbmRfYnVmLmJ1ZiwgImNvbW1pdHRlciAiKSkgeworCQljb21taXR0ZXIgPSBwYXJzZV9pZGVudChjb21tYW5kX2J1Zi5idWYgKyAxMCk7CisJCXJlYWRfbmV4dF9jb21tYW5kKCk7CisJfQorCWlmICghY29tbWl0dGVyKQorCQlkaWUoIkV4cGVjdGVkIGNvbW1pdHRlciBidXQgZGlkbid0IGdldCBvbmUiKTsKKwljbWRfZGF0YSgmbXNnKTsKKwlyZWFkX25leHRfY29tbWFuZCgpOworCWNtZF9mcm9tKGIpOworCW1lcmdlX2xpc3QgPSBjbWRfbWVyZ2UoJm1lcmdlX2NvdW50KTsKKworCS8qIGVuc3VyZSB0aGUgYnJhbmNoIGlzIGFjdGl2ZS9sb2FkZWQgKi8KKwlpZiAoIWItPmJyYW5jaF90cmVlLnRyZWUgfHwgIW1heF9hY3RpdmVfYnJhbmNoZXMpIHsKKwkJdW5sb2FkX29uZV9icmFuY2goKTsKKwkJbG9hZF9icmFuY2goYik7CisJfQorCisJLyogZmlsZV9jaGFuZ2UqICovCisJd2hpbGUgKGNvbW1hbmRfYnVmLmxlbiA+IDApIHsKKwkJaWYgKCFwcmVmaXhjbXAoY29tbWFuZF9idWYuYnVmLCAiTSAiKSkKKwkJCWZpbGVfY2hhbmdlX20oYik7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoY29tbWFuZF9idWYuYnVmLCAiRCAiKSkKKwkJCWZpbGVfY2hhbmdlX2QoYik7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoY29tbWFuZF9idWYuYnVmLCAiUiAiKSkKKwkJCWZpbGVfY2hhbmdlX2NyKGIsIDEpOworCQllbHNlIGlmICghcHJlZml4Y21wKGNvbW1hbmRfYnVmLmJ1ZiwgIkMgIikpCisJCQlmaWxlX2NoYW5nZV9jcihiLCAwKTsKKwkJZWxzZSBpZiAoIXN0cmNtcCgiZGVsZXRlYWxsIiwgY29tbWFuZF9idWYuYnVmKSkKKwkJCWZpbGVfY2hhbmdlX2RlbGV0ZWFsbChiKTsKKwkJZWxzZSB7CisJCQl1bnJlYWRfY29tbWFuZF9idWYgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJlYWRfbmV4dF9jb21tYW5kKCkgPT0gRU9GKQorCQkJYnJlYWs7CisJfQorCisJLyogYnVpbGQgdGhlIHRyZWUgYW5kIHRoZSBjb21taXQgKi8KKwlzdG9yZV90cmVlKCZiLT5icmFuY2hfdHJlZSk7CisJaGFzaGNweShiLT5icmFuY2hfdHJlZS52ZXJzaW9uc1swXS5zaGExLAorCQliLT5icmFuY2hfdHJlZS52ZXJzaW9uc1sxXS5zaGExKTsKKworCXN0cmJ1Zl9yZXNldCgmbmV3X2RhdGEpOworCXN0cmJ1Zl9hZGRmKCZuZXdfZGF0YSwgInRyZWUgJXNcbiIsCisJCXNoYTFfdG9faGV4KGItPmJyYW5jaF90cmVlLnZlcnNpb25zWzFdLnNoYTEpKTsKKwlpZiAoIWlzX251bGxfc2hhMShiLT5zaGExKSkKKwkJc3RyYnVmX2FkZGYoJm5ld19kYXRhLCAicGFyZW50ICVzXG4iLCBzaGExX3RvX2hleChiLT5zaGExKSk7CisJd2hpbGUgKG1lcmdlX2xpc3QpIHsKKwkJc3RydWN0IGhhc2hfbGlzdCAqbmV4dCA9IG1lcmdlX2xpc3QtPm5leHQ7CisJCXN0cmJ1Zl9hZGRmKCZuZXdfZGF0YSwgInBhcmVudCAlc1xuIiwgc2hhMV90b19oZXgobWVyZ2VfbGlzdC0+c2hhMSkpOworCQlmcmVlKG1lcmdlX2xpc3QpOworCQltZXJnZV9saXN0ID0gbmV4dDsKKwl9CisJc3RyYnVmX2FkZGYoJm5ld19kYXRhLAorCQkiYXV0aG9yICVzXG4iCisJCSJjb21taXR0ZXIgJXNcbiIKKwkJIlxuIiwKKwkJYXV0aG9yID8gYXV0aG9yIDogY29tbWl0dGVyLCBjb21taXR0ZXIpOworCXN0cmJ1Zl9hZGRidWYoJm5ld19kYXRhLCAmbXNnKTsKKwlmcmVlKGF1dGhvcik7CisJZnJlZShjb21taXR0ZXIpOworCisJaWYgKCFzdG9yZV9vYmplY3QoT0JKX0NPTU1JVCwgJm5ld19kYXRhLCBOVUxMLCBiLT5zaGExLCBuZXh0X21hcmspKQorCQliLT5wYWNrX2lkID0gcGFja19pZDsKKwliLT5sYXN0X2NvbW1pdCA9IG9iamVjdF9jb3VudF9ieV90eXBlW09CSl9DT01NSVRdOworfQorCitzdGF0aWMgdm9pZCBjbWRfbmV3X3RhZyh2b2lkKQoreworCXN0YXRpYyBzdHJ1Y3Qgc3RyYnVmIG1zZyA9IFNUUkJVRl9JTklUOworCWNoYXIgKnNwOworCWNvbnN0IGNoYXIgKmZyb207CisJY2hhciAqdGFnZ2VyOworCXN0cnVjdCBicmFuY2ggKnM7CisJc3RydWN0IHRhZyAqdDsKKwl1aW50bWF4X3QgZnJvbV9tYXJrID0gMDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCisJLyogT2J0YWluIHRoZSBuZXcgdGFnIG5hbWUgZnJvbSB0aGUgcmVzdCBvZiBvdXIgY29tbWFuZCAqLworCXNwID0gc3RyY2hyKGNvbW1hbmRfYnVmLmJ1ZiwgJyAnKSArIDE7CisJdCA9IHBvb2xfYWxsb2Moc2l6ZW9mKHN0cnVjdCB0YWcpKTsKKwl0LT5uZXh0X3RhZyA9IE5VTEw7CisJdC0+bmFtZSA9IHBvb2xfc3RyZHVwKHNwKTsKKwlpZiAobGFzdF90YWcpCisJCWxhc3RfdGFnLT5uZXh0X3RhZyA9IHQ7CisJZWxzZQorCQlmaXJzdF90YWcgPSB0OworCWxhc3RfdGFnID0gdDsKKwlyZWFkX25leHRfY29tbWFuZCgpOworCisJLyogZnJvbSAuLi4gKi8KKwlpZiAocHJlZml4Y21wKGNvbW1hbmRfYnVmLmJ1ZiwgImZyb20gIikpCisJCWRpZSgiRXhwZWN0ZWQgZnJvbSBjb21tYW5kLCBnb3QgJXMiLCBjb21tYW5kX2J1Zi5idWYpOworCWZyb20gPSBzdHJjaHIoY29tbWFuZF9idWYuYnVmLCAnICcpICsgMTsKKwlzID0gbG9va3VwX2JyYW5jaChmcm9tKTsKKwlpZiAocykgeworCQloYXNoY3B5KHNoYTEsIHMtPnNoYTEpOworCX0gZWxzZSBpZiAoKmZyb20gPT0gJzonKSB7CisJCXN0cnVjdCBvYmplY3RfZW50cnkgKm9lOworCQlmcm9tX21hcmsgPSBzdHJ0b3VtYXgoZnJvbSArIDEsIE5VTEwsIDEwKTsKKwkJb2UgPSBmaW5kX21hcmsoZnJvbV9tYXJrKTsKKwkJaWYgKG9lLT50eXBlICE9IE9CSl9DT01NSVQpCisJCQlkaWUoIk1hcmsgOiUiIFBSSXVNQVggIiBub3QgYSBjb21taXQiLCBmcm9tX21hcmspOworCQloYXNoY3B5KHNoYTEsIG9lLT5zaGExKTsKKwl9IGVsc2UgaWYgKCFnZXRfc2hhMShmcm9tLCBzaGExKSkgeworCQl1bnNpZ25lZCBsb25nIHNpemU7CisJCWNoYXIgKmJ1ZjsKKworCQlidWYgPSByZWFkX29iamVjdF93aXRoX3JlZmVyZW5jZShzaGExLAorCQkJY29tbWl0X3R5cGUsICZzaXplLCBzaGExKTsKKwkJaWYgKCFidWYgfHwgc2l6ZSA8IDQ2KQorCQkJZGllKCJOb3QgYSB2YWxpZCBjb21taXQ6ICVzIiwgZnJvbSk7CisJCWZyZWUoYnVmKTsKKwl9IGVsc2UKKwkJZGllKCJJbnZhbGlkIHJlZiBuYW1lIG9yIFNIQTEgZXhwcmVzc2lvbjogJXMiLCBmcm9tKTsKKwlyZWFkX25leHRfY29tbWFuZCgpOworCisJLyogdGFnZ2VyIC4uLiAqLworCWlmIChwcmVmaXhjbXAoY29tbWFuZF9idWYuYnVmLCAidGFnZ2VyICIpKQorCQlkaWUoIkV4cGVjdGVkIHRhZ2dlciBjb21tYW5kLCBnb3QgJXMiLCBjb21tYW5kX2J1Zi5idWYpOworCXRhZ2dlciA9IHBhcnNlX2lkZW50KGNvbW1hbmRfYnVmLmJ1ZiArIDcpOworCisJLyogdGFnIHBheWxvYWQvbWVzc2FnZSAqLworCXJlYWRfbmV4dF9jb21tYW5kKCk7CisJY21kX2RhdGEoJm1zZyk7CisKKwkvKiBidWlsZCB0aGUgdGFnIG9iamVjdCAqLworCXN0cmJ1Zl9yZXNldCgmbmV3X2RhdGEpOworCXN0cmJ1Zl9hZGRmKCZuZXdfZGF0YSwKKwkJIm9iamVjdCAlc1xuIgorCQkidHlwZSAlc1xuIgorCQkidGFnICVzXG4iCisJCSJ0YWdnZXIgJXNcbiIKKwkJIlxuIiwKKwkJc2hhMV90b19oZXgoc2hhMSksIGNvbW1pdF90eXBlLCB0LT5uYW1lLCB0YWdnZXIpOworCXN0cmJ1Zl9hZGRidWYoJm5ld19kYXRhLCAmbXNnKTsKKwlmcmVlKHRhZ2dlcik7CisKKwlpZiAoc3RvcmVfb2JqZWN0KE9CSl9UQUcsICZuZXdfZGF0YSwgTlVMTCwgdC0+c2hhMSwgMCkpCisJCXQtPnBhY2tfaWQgPSBNQVhfUEFDS19JRDsKKwllbHNlCisJCXQtPnBhY2tfaWQgPSBwYWNrX2lkOworfQorCitzdGF0aWMgdm9pZCBjbWRfcmVzZXRfYnJhbmNoKHZvaWQpCit7CisJc3RydWN0IGJyYW5jaCAqYjsKKwljaGFyICpzcDsKKworCS8qIE9idGFpbiB0aGUgYnJhbmNoIG5hbWUgZnJvbSB0aGUgcmVzdCBvZiBvdXIgY29tbWFuZCAqLworCXNwID0gc3RyY2hyKGNvbW1hbmRfYnVmLmJ1ZiwgJyAnKSArIDE7CisJYiA9IGxvb2t1cF9icmFuY2goc3ApOworCWlmIChiKSB7CisJCWhhc2hjbHIoYi0+c2hhMSk7CisJCWhhc2hjbHIoYi0+YnJhbmNoX3RyZWUudmVyc2lvbnNbMF0uc2hhMSk7CisJCWhhc2hjbHIoYi0+YnJhbmNoX3RyZWUudmVyc2lvbnNbMV0uc2hhMSk7CisJCWlmIChiLT5icmFuY2hfdHJlZS50cmVlKSB7CisJCQlyZWxlYXNlX3RyZWVfY29udGVudF9yZWN1cnNpdmUoYi0+YnJhbmNoX3RyZWUudHJlZSk7CisJCQliLT5icmFuY2hfdHJlZS50cmVlID0gTlVMTDsKKwkJfQorCX0KKwllbHNlCisJCWIgPSBuZXdfYnJhbmNoKHNwKTsKKwlyZWFkX25leHRfY29tbWFuZCgpOworCWNtZF9mcm9tKGIpOworCWlmIChjb21tYW5kX2J1Zi5sZW4gPiAwKQorCQl1bnJlYWRfY29tbWFuZF9idWYgPSAxOworfQorCitzdGF0aWMgdm9pZCBjbWRfY2hlY2twb2ludCh2b2lkKQoreworCWlmIChvYmplY3RfY291bnQpIHsKKwkJY3ljbGVfcGFja2ZpbGUoKTsKKwkJZHVtcF9icmFuY2hlcygpOworCQlkdW1wX3RhZ3MoKTsKKwkJZHVtcF9tYXJrcygpOworCX0KKwlza2lwX29wdGlvbmFsX2xmKCk7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9wcm9ncmVzcyh2b2lkKQoreworCWZ3cml0ZShjb21tYW5kX2J1Zi5idWYsIDEsIGNvbW1hbmRfYnVmLmxlbiwgc3Rkb3V0KTsKKwlmcHV0YygnXG4nLCBzdGRvdXQpOworCWZmbHVzaChzdGRvdXQpOworCXNraXBfb3B0aW9uYWxfbGYoKTsKK30KKworc3RhdGljIHZvaWQgaW1wb3J0X21hcmtzKGNvbnN0IGNoYXIgKmlucHV0X2ZpbGUpCit7CisJY2hhciBsaW5lWzUxMl07CisJRklMRSAqZiA9IGZvcGVuKGlucHV0X2ZpbGUsICJyIik7CisJaWYgKCFmKQorCQlkaWUoImNhbm5vdCByZWFkICVzOiAlcyIsIGlucHV0X2ZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHsKKwkJdWludG1heF90IG1hcms7CisJCWNoYXIgKmVuZDsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJc3RydWN0IG9iamVjdF9lbnRyeSAqZTsKKworCQllbmQgPSBzdHJjaHIobGluZSwgJ1xuJyk7CisJCWlmIChsaW5lWzBdICE9ICc6JyB8fCAhZW5kKQorCQkJZGllKCJjb3JydXB0IG1hcmsgbGluZTogJXMiLCBsaW5lKTsKKwkJKmVuZCA9IDA7CisJCW1hcmsgPSBzdHJ0b3VtYXgobGluZSArIDEsICZlbmQsIDEwKTsKKwkJaWYgKCFtYXJrIHx8IGVuZCA9PSBsaW5lICsgMQorCQkJfHwgKmVuZCAhPSAnICcgfHwgZ2V0X3NoYTEoZW5kICsgMSwgc2hhMSkpCisJCQlkaWUoImNvcnJ1cHQgbWFyayBsaW5lOiAlcyIsIGxpbmUpOworCQllID0gZmluZF9vYmplY3Qoc2hhMSk7CisJCWlmICghZSkgeworCQkJZW51bSBvYmplY3RfdHlwZSB0eXBlID0gc2hhMV9vYmplY3RfaW5mbyhzaGExLCBOVUxMKTsKKwkJCWlmICh0eXBlIDwgMCkKKwkJCQlkaWUoIm9iamVjdCBub3QgZm91bmQ6ICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworCQkJZSA9IGluc2VydF9vYmplY3Qoc2hhMSk7CisJCQllLT50eXBlID0gdHlwZTsKKwkJCWUtPnBhY2tfaWQgPSBNQVhfUEFDS19JRDsKKwkJCWUtPm9mZnNldCA9IDE7IC8qIGp1c3Qgbm90IHplcm8hICovCisJCX0KKwkJaW5zZXJ0X21hcmsobWFyaywgZSk7CisJfQorCWZjbG9zZShmKTsKK30KKworc3RhdGljIGludCBnaXRfcGFja19jb25maWcoY29uc3QgY2hhciAqaywgY29uc3QgY2hhciAqdikKK3sKKwlpZiAoIXN0cmNtcChrLCAicGFjay5kZXB0aCIpKSB7CisJCW1heF9kZXB0aCA9IGdpdF9jb25maWdfaW50KGssIHYpOworCQlpZiAobWF4X2RlcHRoID4gTUFYX0RFUFRIKQorCQkJbWF4X2RlcHRoID0gTUFYX0RFUFRIOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAoaywgInBhY2suY29tcHJlc3Npb24iKSkgeworCQlpbnQgbGV2ZWwgPSBnaXRfY29uZmlnX2ludChrLCB2KTsKKwkJaWYgKGxldmVsID09IC0xKQorCQkJbGV2ZWwgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT047CisJCWVsc2UgaWYgKGxldmVsIDwgMCB8fCBsZXZlbCA+IFpfQkVTVF9DT01QUkVTU0lPTikKKwkJCWRpZSgiYmFkIHBhY2sgY29tcHJlc3Npb24gbGV2ZWwgJWQiLCBsZXZlbCk7CisJCXBhY2tfY29tcHJlc3Npb25fbGV2ZWwgPSBsZXZlbDsKKwkJcGFja19jb21wcmVzc2lvbl9zZWVuID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBnaXRfZGVmYXVsdF9jb25maWcoaywgdik7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGZhc3RfaW1wb3J0X3VzYWdlW10gPQorImdpdC1mYXN0LWltcG9ydCBbLS1kYXRlLWZvcm1hdD1mXSBbLS1tYXgtcGFjay1zaXplPW5dIFstLWRlcHRoPW5dIFstLWFjdGl2ZS1icmFuY2hlcz1uXSBbLS1leHBvcnQtbWFya3M9bWFya3MuZmlsZV0iOworCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgaW50IGksIHNob3dfc3RhdHMgPSAxOworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCWdpdF9jb25maWcoZ2l0X3BhY2tfY29uZmlnKTsKKwlpZiAoIXBhY2tfY29tcHJlc3Npb25fc2VlbiAmJiBjb3JlX2NvbXByZXNzaW9uX3NlZW4pCisJCXBhY2tfY29tcHJlc3Npb25fbGV2ZWwgPSBjb3JlX2NvbXByZXNzaW9uX2xldmVsOworCisJYWxsb2Nfb2JqZWN0cyhvYmplY3RfZW50cnlfYWxsb2MpOworCXN0cmJ1Zl9pbml0KCZjb21tYW5kX2J1ZiwgMCk7CisJYXRvbV90YWJsZSA9IHhjYWxsb2MoYXRvbV90YWJsZV9zeiwgc2l6ZW9mKHN0cnVjdCBhdG9tX3N0ciopKTsKKwlicmFuY2hfdGFibGUgPSB4Y2FsbG9jKGJyYW5jaF90YWJsZV9zeiwgc2l6ZW9mKHN0cnVjdCBicmFuY2gqKSk7CisJYXZhaWxfdHJlZV90YWJsZSA9IHhjYWxsb2MoYXZhaWxfdHJlZV90YWJsZV9zeiwgc2l6ZW9mKHN0cnVjdCBhdmFpbF90cmVlX2NvbnRlbnQqKSk7CisJbWFya3MgPSBwb29sX2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IG1hcmtfc2V0KSk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmEgPSBhcmd2W2ldOworCisJCWlmICgqYSAhPSAnLScgfHwgIXN0cmNtcChhLCAiLS0iKSkKKwkJCWJyZWFrOworCQllbHNlIGlmICghcHJlZml4Y21wKGEsICItLWRhdGUtZm9ybWF0PSIpKSB7CisJCQljb25zdCBjaGFyICpmbXQgPSBhICsgMTQ7CisJCQlpZiAoIXN0cmNtcChmbXQsICJyYXciKSkKKwkJCQl3aGVuc3BlYyA9IFdIRU5TUEVDX1JBVzsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoZm10LCAicmZjMjgyMiIpKQorCQkJCXdoZW5zcGVjID0gV0hFTlNQRUNfUkZDMjgyMjsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoZm10LCAibm93IikpCisJCQkJd2hlbnNwZWMgPSBXSEVOU1BFQ19OT1c7CisJCQllbHNlCisJCQkJZGllKCJ1bmtub3duIC0tZGF0ZS1mb3JtYXQgYXJndW1lbnQgJXMiLCBmbXQpOworCQl9CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYSwgIi0tbWF4LXBhY2stc2l6ZT0iKSkKKwkJCW1heF9wYWNrc2l6ZSA9IHN0cnRvdW1heChhICsgMTYsIE5VTEwsIDApICogMTAyNCAqIDEwMjQ7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoYSwgIi0tZGVwdGg9IikpIHsKKwkJCW1heF9kZXB0aCA9IHN0cnRvdWwoYSArIDgsIE5VTEwsIDApOworCQkJaWYgKG1heF9kZXB0aCA+IE1BWF9ERVBUSCkKKwkJCQlkaWUoIi0tZGVwdGggY2Fubm90IGV4Y2VlZCAldSIsIE1BWF9ERVBUSCk7CisJCX0KKwkJZWxzZSBpZiAoIXByZWZpeGNtcChhLCAiLS1hY3RpdmUtYnJhbmNoZXM9IikpCisJCQltYXhfYWN0aXZlX2JyYW5jaGVzID0gc3RydG91bChhICsgMTgsIE5VTEwsIDApOworCQllbHNlIGlmICghcHJlZml4Y21wKGEsICItLWltcG9ydC1tYXJrcz0iKSkKKwkJCWltcG9ydF9tYXJrcyhhICsgMTUpOworCQllbHNlIGlmICghcHJlZml4Y21wKGEsICItLWV4cG9ydC1tYXJrcz0iKSkKKwkJCW1hcmtfZmlsZSA9IGEgKyAxNTsKKwkJZWxzZSBpZiAoIXByZWZpeGNtcChhLCAiLS1leHBvcnQtcGFjay1lZGdlcz0iKSkgeworCQkJaWYgKHBhY2tfZWRnZXMpCisJCQkJZmNsb3NlKHBhY2tfZWRnZXMpOworCQkJcGFja19lZGdlcyA9IGZvcGVuKGEgKyAyMCwgImEiKTsKKwkJCWlmICghcGFja19lZGdlcykKKwkJCQlkaWUoIkNhbm5vdCBvcGVuICVzOiAlcyIsIGEgKyAyMCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGEsICItLWZvcmNlIikpCisJCQlmb3JjZV91cGRhdGUgPSAxOworCQllbHNlIGlmICghc3RyY21wKGEsICItLXF1aWV0IikpCisJCQlzaG93X3N0YXRzID0gMDsKKwkJZWxzZSBpZiAoIXN0cmNtcChhLCAiLS1zdGF0cyIpKQorCQkJc2hvd19zdGF0cyA9IDE7CisJCWVsc2UKKwkJCWRpZSgidW5rbm93biBvcHRpb24gJXMiLCBhKTsKKwl9CisJaWYgKGkgIT0gYXJnYykKKwkJdXNhZ2UoZmFzdF9pbXBvcnRfdXNhZ2UpOworCisJcmNfZnJlZSA9IHBvb2xfYWxsb2MoY21kX3NhdmUgKiBzaXplb2YoKnJjX2ZyZWUpKTsKKwlmb3IgKGkgPSAwOyBpIDwgKGNtZF9zYXZlIC0gMSk7IGkrKykKKwkJcmNfZnJlZVtpXS5uZXh0ID0gJnJjX2ZyZWVbaSArIDFdOworCXJjX2ZyZWVbY21kX3NhdmUgLSAxXS5uZXh0ID0gTlVMTDsKKworCXByZXBhcmVfcGFja2VkX2dpdCgpOworCXN0YXJ0X3BhY2tmaWxlKCk7CisJc2V0X2RpZV9yb3V0aW5lKGRpZV9uaWNlbHkpOworCXdoaWxlIChyZWFkX25leHRfY29tbWFuZCgpICE9IEVPRikgeworCQlpZiAoIXN0cmNtcCgiYmxvYiIsIGNvbW1hbmRfYnVmLmJ1ZikpCisJCQljbWRfbmV3X2Jsb2IoKTsKKwkJZWxzZSBpZiAoIXByZWZpeGNtcChjb21tYW5kX2J1Zi5idWYsICJjb21taXQgIikpCisJCQljbWRfbmV3X2NvbW1pdCgpOworCQllbHNlIGlmICghcHJlZml4Y21wKGNvbW1hbmRfYnVmLmJ1ZiwgInRhZyAiKSkKKwkJCWNtZF9uZXdfdGFnKCk7CisJCWVsc2UgaWYgKCFwcmVmaXhjbXAoY29tbWFuZF9idWYuYnVmLCAicmVzZXQgIikpCisJCQljbWRfcmVzZXRfYnJhbmNoKCk7CisJCWVsc2UgaWYgKCFzdHJjbXAoImNoZWNrcG9pbnQiLCBjb21tYW5kX2J1Zi5idWYpKQorCQkJY21kX2NoZWNrcG9pbnQoKTsKKwkJZWxzZSBpZiAoIXByZWZpeGNtcChjb21tYW5kX2J1Zi5idWYsICJwcm9ncmVzcyAiKSkKKwkJCWNtZF9wcm9ncmVzcygpOworCQllbHNlCisJCQlkaWUoIlVuc3VwcG9ydGVkIGNvbW1hbmQ6ICVzIiwgY29tbWFuZF9idWYuYnVmKTsKKwl9CisJZW5kX3BhY2tmaWxlKCk7CisKKwlkdW1wX2JyYW5jaGVzKCk7CisJZHVtcF90YWdzKCk7CisJdW5rZWVwX2FsbF9wYWNrcygpOworCWR1bXBfbWFya3MoKTsKKworCWlmIChwYWNrX2VkZ2VzKQorCQlmY2xvc2UocGFja19lZGdlcyk7CisKKwlpZiAoc2hvd19zdGF0cykgeworCQl1aW50bWF4X3QgdG90YWxfY291bnQgPSAwLCBkdXBsaWNhdGVfY291bnQgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvYmplY3RfY291bnRfYnlfdHlwZSk7IGkrKykKKwkJCXRvdGFsX2NvdW50ICs9IG9iamVjdF9jb3VudF9ieV90eXBlW2ldOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkdXBsaWNhdGVfY291bnRfYnlfdHlwZSk7IGkrKykKKwkJCWR1cGxpY2F0ZV9jb3VudCArPSBkdXBsaWNhdGVfY291bnRfYnlfdHlwZVtpXTsKKworCQlmcHJpbnRmKHN0ZGVyciwgIiVzIHN0YXRpc3RpY3M6XG4iLCBhcmd2WzBdKTsKKwkJZnByaW50ZihzdGRlcnIsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIkFsbG9jJ2Qgb2JqZWN0czogJTEwIiBQUkl1TUFYICJcbiIsIGFsbG9jX2NvdW50KTsKKwkJZnByaW50ZihzdGRlcnIsICJUb3RhbCBvYmplY3RzOiAgICUxMCIgUFJJdU1BWCAiICglMTAiIFBSSXVNQVggIiBkdXBsaWNhdGVzICAgICAgICAgICAgICAgICAgKVxuIiwgdG90YWxfY291bnQsIGR1cGxpY2F0ZV9jb3VudCk7CisJCWZwcmludGYoc3RkZXJyLCAiICAgICAgYmxvYnMgIDogICAlMTAiIFBSSXVNQVggIiAoJTEwIiBQUkl1TUFYICIgZHVwbGljYXRlcyAlMTAiIFBSSXVNQVggIiBkZWx0YXMpXG4iLCBvYmplY3RfY291bnRfYnlfdHlwZVtPQkpfQkxPQl0sIGR1cGxpY2F0ZV9jb3VudF9ieV90eXBlW09CSl9CTE9CXSwgZGVsdGFfY291bnRfYnlfdHlwZVtPQkpfQkxPQl0pOworCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgIHRyZWVzICA6ICAgJTEwIiBQUkl1TUFYICIgKCUxMCIgUFJJdU1BWCAiIGR1cGxpY2F0ZXMgJTEwIiBQUkl1TUFYICIgZGVsdGFzKVxuIiwgb2JqZWN0X2NvdW50X2J5X3R5cGVbT0JKX1RSRUVdLCBkdXBsaWNhdGVfY291bnRfYnlfdHlwZVtPQkpfVFJFRV0sIGRlbHRhX2NvdW50X2J5X3R5cGVbT0JKX1RSRUVdKTsKKwkJZnByaW50ZihzdGRlcnIsICIgICAgICBjb21taXRzOiAgICUxMCIgUFJJdU1BWCAiICglMTAiIFBSSXVNQVggIiBkdXBsaWNhdGVzICUxMCIgUFJJdU1BWCAiIGRlbHRhcylcbiIsIG9iamVjdF9jb3VudF9ieV90eXBlW09CSl9DT01NSVRdLCBkdXBsaWNhdGVfY291bnRfYnlfdHlwZVtPQkpfQ09NTUlUXSwgZGVsdGFfY291bnRfYnlfdHlwZVtPQkpfQ09NTUlUXSk7CisJCWZwcmludGYoc3RkZXJyLCAiICAgICAgdGFncyAgIDogICAlMTAiIFBSSXVNQVggIiAoJTEwIiBQUkl1TUFYICIgZHVwbGljYXRlcyAlMTAiIFBSSXVNQVggIiBkZWx0YXMpXG4iLCBvYmplY3RfY291bnRfYnlfdHlwZVtPQkpfVEFHXSwgZHVwbGljYXRlX2NvdW50X2J5X3R5cGVbT0JKX1RBR10sIGRlbHRhX2NvdW50X2J5X3R5cGVbT0JKX1RBR10pOworCQlmcHJpbnRmKHN0ZGVyciwgIlRvdGFsIGJyYW5jaGVzOiAgJTEwbHUgKCUxMGx1IGxvYWRzICAgICApXG4iLCBicmFuY2hfY291bnQsIGJyYW5jaF9sb2FkX2NvdW50KTsKKwkJZnByaW50ZihzdGRlcnIsICIgICAgICBtYXJrczogICAgICUxMCIgUFJJdU1BWCAiICglMTAiIFBSSXVNQVggIiB1bmlxdWUgICAgKVxuIiwgKCgodWludG1heF90KTEpIDw8IG1hcmtzLT5zaGlmdCkgKiAxMDI0LCBtYXJrc19zZXRfY291bnQpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgIGF0b21zOiAgICAgJTEwdVxuIiwgYXRvbV9jbnQpOworCQlmcHJpbnRmKHN0ZGVyciwgIk1lbW9yeSB0b3RhbDogICAgJTEwIiBQUkl1TUFYICIgS2lCXG4iLCAodG90YWxfYWxsb2NkICsgYWxsb2NfY291bnQqc2l6ZW9mKHN0cnVjdCBvYmplY3RfZW50cnkpKS8xMDI0KTsKKwkJZnByaW50ZihzdGRlcnIsICIgICAgICAgcG9vbHM6ICAgICUxMGx1IEtpQlxuIiwgKHVuc2lnbmVkIGxvbmcpKHRvdGFsX2FsbG9jZC8xMDI0KSk7CisJCWZwcmludGYoc3RkZXJyLCAiICAgICBvYmplY3RzOiAgICAlMTAiIFBSSXVNQVggIiBLaUJcbiIsIChhbGxvY19jb3VudCpzaXplb2Yoc3RydWN0IG9iamVjdF9lbnRyeSkpLzEwMjQpOworCQlmcHJpbnRmKHN0ZGVyciwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJCXBhY2tfcmVwb3J0KCk7CisJCWZwcmludGYoc3RkZXJyLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICJcbiIpOworCX0KKworCXJldHVybiBmYWlsdXJlID8gMSA6IDA7Cit9CmRpZmYgLS1naXQgYS9mZXRjaC1wYWNrLmggYi9mZXRjaC1wYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkOWMzMgotLS0gL2Rldi9udWxsCisrKyBiL2ZldGNoLXBhY2suaApAQCAtMCwwICsxLDI3IEBACisjaWZuZGVmIEZFVENIX1BBQ0tfSAorI2RlZmluZSBGRVRDSF9QQUNLX0gKKworc3RydWN0IGZldGNoX3BhY2tfYXJncworeworCWNvbnN0IGNoYXIgKnVwbG9hZHBhY2s7CisJaW50IHVucGFja2xpbWl0OworCWludCBkZXB0aDsKKwl1bnNpZ25lZCBxdWlldDoxLAorCQlrZWVwX3BhY2s6MSwKKwkJbG9ja19wYWNrOjEsCisJCXVzZV90aGluX3BhY2s6MSwKKwkJZmV0Y2hfYWxsOjEsCisJCXZlcmJvc2U6MSwKKwkJbm9fcHJvZ3Jlc3M6MSwKKwkJaW5jbHVkZV90YWc6MTsKK307CisKK3N0cnVjdCByZWYgKmZldGNoX3BhY2soc3RydWN0IGZldGNoX3BhY2tfYXJncyAqYXJncywKKwkJaW50IGZkW10sIHN0cnVjdCBjaGlsZF9wcm9jZXNzICpjb25uLAorCQljb25zdCBzdHJ1Y3QgcmVmICpyZWYsCisJCWNvbnN0IGNoYXIgKmRlc3QsCisJCWludCBucl9oZWFkcywKKwkJY2hhciAqKmhlYWRzLAorCQljaGFyICoqcGFja19sb2NrZmlsZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZml4dXAtYnVpbHRpbnMgYi9maXh1cC1idWlsdGlucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40OWU4NjFkCi0tLSAvZGV2L251bGwKKysrIGIvZml4dXAtYnVpbHRpbnMKQEAgLTAsMCArMSwxNiBAQAorIyEvYmluL3NoCit3aGlsZSBbICIkMSIgXQorZG8KKwlvbGQ9IiQxIgorCW5ldz0kKGVjaG8gIiQxIiB8IHNlZCAncy9naXQtL2dpdCAvJykKKwllY2hvICJDb252ZXJ0aW5nICckb2xkJyB0byAnJG5ldyciCisJZ2l0IGxzLWZpbGVzICcqLnNoJyB8IHdoaWxlIHJlYWQgZmlsZQorCWRvCisJCXNlZCAicy9cXDwkb2xkXFw+LyRuZXcvZyIgPCAkZmlsZSA+ICRmaWxlLm5ldworCQljaG1vZCAtLXJlZmVyZW5jZT0kZmlsZSAkZmlsZS5uZXcKKwkJbXYgJGZpbGUubmV3ICRmaWxlCisJZG9uZQorCXNoaWZ0Citkb25lCitnaXQgdXBkYXRlLWluZGV4IC0tcmVmcmVzaCA+JiAvZGV2L251bGwKK2V4aXQgMApkaWZmIC0tZ2l0IGEvZnNjay5jIGIvZnNjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5N2UzMTcKLS0tIC9kZXYvbnVsbAorKysgYi9mc2NrLmMKQEAgLTAsMCArMSwzMzMgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAiZnNjay5oIgorCitzdGF0aWMgaW50IGZzY2tfd2Fsa190cmVlKHN0cnVjdCB0cmVlICp0cmVlLCBmc2NrX3dhbGtfZnVuYyB3YWxrLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB0cmVlX2Rlc2MgZGVzYzsKKwlzdHJ1Y3QgbmFtZV9lbnRyeSBlbnRyeTsKKwlpbnQgcmVzID0gMDsKKworCWlmIChwYXJzZV90cmVlKHRyZWUpKQorCQlyZXR1cm4gLTE7CisKKwlpbml0X3RyZWVfZGVzYygmZGVzYywgdHJlZS0+YnVmZmVyLCB0cmVlLT5zaXplKTsKKwl3aGlsZSAodHJlZV9lbnRyeSgmZGVzYywgJmVudHJ5KSkgeworCQlpbnQgcmVzdWx0OworCisJCWlmIChTX0lTR0lUTElOSyhlbnRyeS5tb2RlKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoU19JU0RJUihlbnRyeS5tb2RlKSkKKwkJCXJlc3VsdCA9IHdhbGsoJmxvb2t1cF90cmVlKGVudHJ5LnNoYTEpLT5vYmplY3QsIE9CSl9UUkVFLCBkYXRhKTsKKwkJZWxzZSBpZiAoU19JU1JFRyhlbnRyeS5tb2RlKSB8fCBTX0lTTE5LKGVudHJ5Lm1vZGUpKQorCQkJcmVzdWx0ID0gd2FsaygmbG9va3VwX2Jsb2IoZW50cnkuc2hhMSktPm9iamVjdCwgT0JKX0JMT0IsIGRhdGEpOworCQllbHNlIHsKKwkJCXJlc3VsdCA9IGVycm9yKCJpbiB0cmVlICVzOiBlbnRyeSAlcyBoYXMgYmFkIG1vZGUgJS42b1xuIiwKKwkJCQkJc2hhMV90b19oZXgodHJlZS0+b2JqZWN0LnNoYTEpLCBlbnRyeS5wYXRoLCBlbnRyeS5tb2RlKTsKKwkJfQorCQlpZiAocmVzdWx0IDwgMCkKKwkJCXJldHVybiByZXN1bHQ7CisJCWlmICghcmVzKQorCQkJcmVzID0gcmVzdWx0OworCX0KKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGZzY2tfd2Fsa19jb21taXQoc3RydWN0IGNvbW1pdCAqY29tbWl0LCBmc2NrX3dhbGtfZnVuYyB3YWxrLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50czsKKwlpbnQgcmVzOworCWludCByZXN1bHQ7CisKKwlpZiAocGFyc2VfY29tbWl0KGNvbW1pdCkpCisJCXJldHVybiAtMTsKKworCXJlc3VsdCA9IHdhbGsoKHN0cnVjdCBvYmplY3QgKiljb21taXQtPnRyZWUsIE9CSl9UUkVFLCBkYXRhKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJcmV0dXJuIHJlc3VsdDsKKwlyZXMgPSByZXN1bHQ7CisKKwlwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOworCXdoaWxlIChwYXJlbnRzKSB7CisJCXJlc3VsdCA9IHdhbGsoKHN0cnVjdCBvYmplY3QgKilwYXJlbnRzLT5pdGVtLCBPQkpfQ09NTUlULCBkYXRhKTsKKwkJaWYgKHJlc3VsdCA8IDApCisJCQlyZXR1cm4gcmVzdWx0OworCQlpZiAoIXJlcykKKwkJCXJlcyA9IHJlc3VsdDsKKwkJcGFyZW50cyA9IHBhcmVudHMtPm5leHQ7CisJfQorCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgZnNja193YWxrX3RhZyhzdHJ1Y3QgdGFnICp0YWcsIGZzY2tfd2Fsa19mdW5jIHdhbGssIHZvaWQgKmRhdGEpCit7CisJaWYgKHBhcnNlX3RhZyh0YWcpKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIHdhbGsodGFnLT50YWdnZWQsIE9CSl9BTlksIGRhdGEpOworfQorCitpbnQgZnNja193YWxrKHN0cnVjdCBvYmplY3QgKm9iaiwgZnNja193YWxrX2Z1bmMgd2Fsaywgdm9pZCAqZGF0YSkKK3sKKwlpZiAoIW9iaikKKwkJcmV0dXJuIC0xOworCXN3aXRjaCAob2JqLT50eXBlKSB7CisJY2FzZSBPQkpfQkxPQjoKKwkJcmV0dXJuIDA7CisJY2FzZSBPQkpfVFJFRToKKwkJcmV0dXJuIGZzY2tfd2Fsa190cmVlKChzdHJ1Y3QgdHJlZSAqKW9iaiwgd2FsaywgZGF0YSk7CisJY2FzZSBPQkpfQ09NTUlUOgorCQlyZXR1cm4gZnNja193YWxrX2NvbW1pdCgoc3RydWN0IGNvbW1pdCAqKW9iaiwgd2FsaywgZGF0YSk7CisJY2FzZSBPQkpfVEFHOgorCQlyZXR1cm4gZnNja193YWxrX3RhZygoc3RydWN0IHRhZyAqKW9iaiwgd2FsaywgZGF0YSk7CisJZGVmYXVsdDoKKwkJZXJyb3IoIlVua25vd24gb2JqZWN0IHR5cGUgZm9yICVzIiwgc2hhMV90b19oZXgob2JqLT5zaGExKSk7CisJCXJldHVybiAtMTsKKwl9Cit9CisKKy8qCisgKiBUaGUgZW50cmllcyBpbiBhIHRyZWUgYXJlIG9yZGVyZWQgaW4gdGhlIF9wYXRoXyBvcmRlciwKKyAqIHdoaWNoIG1lYW5zIHRoYXQgYSBkaXJlY3RvcnkgZW50cnkgaXMgb3JkZXJlZCBieSBhZGRpbmcKKyAqIGEgc2xhc2ggdG8gdGhlIGVuZCBvZiBpdC4KKyAqCisgKiBTbyBhIGRpcmVjdG9yeSBjYWxsZWQgImEiIGlzIG9yZGVyZWQgX2FmdGVyXyBhIGZpbGUKKyAqIGNhbGxlZCAiYS5jIiwgYmVjYXVzZSAiYS8iIHNvcnRzIGFmdGVyICJhLmMiLgorICovCisjZGVmaW5lIFRSRUVfVU5PUkRFUkVEICgtMSkKKyNkZWZpbmUgVFJFRV9IQVNfRFVQUyAgKC0yKQorCitzdGF0aWMgaW50IHZlcmlmeV9vcmRlcmVkKHVuc2lnbmVkIG1vZGUxLCBjb25zdCBjaGFyICpuYW1lMSwgdW5zaWduZWQgbW9kZTIsIGNvbnN0IGNoYXIgKm5hbWUyKQoreworCWludCBsZW4xID0gc3RybGVuKG5hbWUxKTsKKwlpbnQgbGVuMiA9IHN0cmxlbihuYW1lMik7CisJaW50IGxlbiA9IGxlbjEgPCBsZW4yID8gbGVuMSA6IGxlbjI7CisJdW5zaWduZWQgY2hhciBjMSwgYzI7CisJaW50IGNtcDsKKworCWNtcCA9IG1lbWNtcChuYW1lMSwgbmFtZTIsIGxlbik7CisJaWYgKGNtcCA8IDApCisJCXJldHVybiAwOworCWlmIChjbXAgPiAwKQorCQlyZXR1cm4gVFJFRV9VTk9SREVSRUQ7CisKKwkvKgorCSAqIE9rLCB0aGUgZmlyc3QgPGxlbj4gY2hhcmFjdGVycyBhcmUgdGhlIHNhbWUuCisJICogTm93IHdlIG5lZWQgdG8gb3JkZXIgdGhlIG5leHQgb25lLCBidXQgdHVybgorCSAqIGEgJ1wwJyBpbnRvIGEgJy8nIGZvciBhIGRpcmVjdG9yeSBlbnRyeS4KKwkgKi8KKwljMSA9IG5hbWUxW2xlbl07CisJYzIgPSBuYW1lMltsZW5dOworCWlmICghYzEgJiYgIWMyKQorCQkvKgorCQkgKiBnaXQtd3JpdGUtdHJlZSB1c2VkIHRvIHdyaXRlIG91dCBhIG5vbnNlbnNlIHRyZWUgdGhhdCBoYXMKKwkJICogZW50cmllcyB3aXRoIHRoZSBzYW1lIG5hbWUsIG9uZSBibG9iIGFuZCBvbmUgdHJlZS4gIE1ha2UKKwkJICogc3VyZSB3ZSBkbyBub3QgaGF2ZSBkdXBsaWNhdGUgZW50cmllcy4KKwkJICovCisJCXJldHVybiBUUkVFX0hBU19EVVBTOworCWlmICghYzEgJiYgU19JU0RJUihtb2RlMSkpCisJCWMxID0gJy8nOworCWlmICghYzIgJiYgU19JU0RJUihtb2RlMikpCisJCWMyID0gJy8nOworCXJldHVybiBjMSA8IGMyID8gMCA6IFRSRUVfVU5PUkRFUkVEOworfQorCitzdGF0aWMgaW50IGZzY2tfdHJlZShzdHJ1Y3QgdHJlZSAqaXRlbSwgaW50IHN0cmljdCwgZnNja19lcnJvciBlcnJvcl9mdW5jKQoreworCWludCByZXR2YWw7CisJaW50IGhhc19mdWxsX3BhdGggPSAwOworCWludCBoYXNfZW1wdHlfbmFtZSA9IDA7CisJaW50IGhhc196ZXJvX3BhZCA9IDA7CisJaW50IGhhc19iYWRfbW9kZXMgPSAwOworCWludCBoYXNfZHVwX2VudHJpZXMgPSAwOworCWludCBub3RfcHJvcGVybHlfc29ydGVkID0gMDsKKwlzdHJ1Y3QgdHJlZV9kZXNjIGRlc2M7CisJdW5zaWduZWQgb19tb2RlOworCWNvbnN0IGNoYXIgKm9fbmFtZTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpvX3NoYTE7CisKKwlpbml0X3RyZWVfZGVzYygmZGVzYywgaXRlbS0+YnVmZmVyLCBpdGVtLT5zaXplKTsKKworCW9fbW9kZSA9IDA7CisJb19uYW1lID0gTlVMTDsKKwlvX3NoYTEgPSBOVUxMOworCisJd2hpbGUgKGRlc2Muc2l6ZSkgeworCQl1bnNpZ25lZCBtb2RlOworCQljb25zdCBjaGFyICpuYW1lOworCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExOworCisJCXNoYTEgPSB0cmVlX2VudHJ5X2V4dHJhY3QoJmRlc2MsICZuYW1lLCAmbW9kZSk7CisKKwkJaWYgKHN0cmNocihuYW1lLCAnLycpKQorCQkJaGFzX2Z1bGxfcGF0aCA9IDE7CisJCWlmICghKm5hbWUpCisJCQloYXNfZW1wdHlfbmFtZSA9IDE7CisJCWhhc196ZXJvX3BhZCB8PSAqKGNoYXIgKilkZXNjLmJ1ZmZlciA9PSAnMCc7CisJCXVwZGF0ZV90cmVlX2VudHJ5KCZkZXNjKTsKKworCQlzd2l0Y2ggKG1vZGUpIHsKKwkJLyoKKwkJICogU3RhbmRhcmQgbW9kZXMuLgorCQkgKi8KKwkJY2FzZSBTX0lGUkVHIHwgMDc1NToKKwkJY2FzZSBTX0lGUkVHIHwgMDY0NDoKKwkJY2FzZSBTX0lGTE5LOgorCQljYXNlIFNfSUZESVI6CisJCWNhc2UgU19JRkdJVExJTks6CisJCQlicmVhazsKKwkJLyoKKwkJICogVGhpcyBpcyBub25zdGFuZGFyZCwgYnV0IHdlIGhhZCBhIGZldyBvZiB0aGVzZQorCQkgKiBlYXJseSBvbiB3aGVuIHdlIGhvbm9yZWQgdGhlIGZ1bGwgc2V0IG9mIG1vZGUKKwkJICogYml0cy4uCisJCSAqLworCQljYXNlIFNfSUZSRUcgfCAwNjY0OgorCQkJaWYgKCFzdHJpY3QpCisJCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQloYXNfYmFkX21vZGVzID0gMTsKKwkJfQorCisJCWlmIChvX25hbWUpIHsKKwkJCXN3aXRjaCAodmVyaWZ5X29yZGVyZWQob19tb2RlLCBvX25hbWUsIG1vZGUsIG5hbWUpKSB7CisJCQljYXNlIFRSRUVfVU5PUkRFUkVEOgorCQkJCW5vdF9wcm9wZXJseV9zb3J0ZWQgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBUUkVFX0hBU19EVVBTOgorCQkJCWhhc19kdXBfZW50cmllcyA9IDE7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJb19tb2RlID0gbW9kZTsKKwkJb19uYW1lID0gbmFtZTsKKwkJb19zaGExID0gc2hhMTsKKwl9CisKKwlyZXR2YWwgPSAwOworCWlmIChoYXNfZnVsbF9wYXRoKQorCQlyZXR2YWwgKz0gZXJyb3JfZnVuYygmaXRlbS0+b2JqZWN0LCBGU0NLX1dBUk4sICJjb250YWlucyBmdWxsIHBhdGhuYW1lcyIpOworCWlmIChoYXNfZW1wdHlfbmFtZSkKKwkJcmV0dmFsICs9IGVycm9yX2Z1bmMoJml0ZW0tPm9iamVjdCwgRlNDS19XQVJOLCAiY29udGFpbnMgZW1wdHkgcGF0aG5hbWUiKTsKKwlpZiAoaGFzX3plcm9fcGFkKQorCQlyZXR2YWwgKz0gZXJyb3JfZnVuYygmaXRlbS0+b2JqZWN0LCBGU0NLX1dBUk4sICJjb250YWlucyB6ZXJvLXBhZGRlZCBmaWxlIG1vZGVzIik7CisJaWYgKGhhc19iYWRfbW9kZXMpCisJCXJldHZhbCArPSBlcnJvcl9mdW5jKCZpdGVtLT5vYmplY3QsIEZTQ0tfV0FSTiwgImNvbnRhaW5zIGJhZCBmaWxlIG1vZGVzIik7CisJaWYgKGhhc19kdXBfZW50cmllcykKKwkJcmV0dmFsICs9IGVycm9yX2Z1bmMoJml0ZW0tPm9iamVjdCwgRlNDS19FUlJPUiwgImNvbnRhaW5zIGR1cGxpY2F0ZSBmaWxlIGVudHJpZXMiKTsKKwlpZiAobm90X3Byb3Blcmx5X3NvcnRlZCkKKwkJcmV0dmFsICs9IGVycm9yX2Z1bmMoJml0ZW0tPm9iamVjdCwgRlNDS19FUlJPUiwgIm5vdCBwcm9wZXJseSBzb3J0ZWQiKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGZzY2tfY29tbWl0KHN0cnVjdCBjb21taXQgKmNvbW1pdCwgZnNja19lcnJvciBlcnJvcl9mdW5jKQoreworCWNoYXIgKmJ1ZmZlciA9IGNvbW1pdC0+YnVmZmVyOworCXVuc2lnbmVkIGNoYXIgdHJlZV9zaGExWzIwXSwgc2hhMVsyMF07CisJc3RydWN0IGNvbW1pdF9ncmFmdCAqZ3JhZnQ7CisJaW50IHBhcmVudHMgPSAwOworCisJaWYgKCFjb21taXQtPmRhdGUpCisJCXJldHVybiBlcnJvcl9mdW5jKCZjb21taXQtPm9iamVjdCwgRlNDS19FUlJPUiwgImludmFsaWQgYXV0aG9yL2NvbW1pdHRlciBsaW5lIik7CisKKwlpZiAobWVtY21wKGJ1ZmZlciwgInRyZWUgIiwgNSkpCisJCXJldHVybiBlcnJvcl9mdW5jKCZjb21taXQtPm9iamVjdCwgRlNDS19FUlJPUiwgImludmFsaWQgZm9ybWF0IC0gZXhwZWN0ZWQgJ3RyZWUnIGxpbmUiKTsKKwlpZiAoZ2V0X3NoYTFfaGV4KGJ1ZmZlcis1LCB0cmVlX3NoYTEpIHx8IGJ1ZmZlcls0NV0gIT0gJ1xuJykKKwkJcmV0dXJuIGVycm9yX2Z1bmMoJmNvbW1pdC0+b2JqZWN0LCBGU0NLX0VSUk9SLCAiaW52YWxpZCAndHJlZScgbGluZSBmb3JtYXQgLSBiYWQgc2hhMSIpOworCWJ1ZmZlciArPSA0NjsKKwl3aGlsZSAoIW1lbWNtcChidWZmZXIsICJwYXJlbnQgIiwgNykpIHsKKwkJaWYgKGdldF9zaGExX2hleChidWZmZXIrNywgc2hhMSkgfHwgYnVmZmVyWzQ3XSAhPSAnXG4nKQorCQkJcmV0dXJuIGVycm9yX2Z1bmMoJmNvbW1pdC0+b2JqZWN0LCBGU0NLX0VSUk9SLCAiaW52YWxpZCAncGFyZW50JyBsaW5lIGZvcm1hdCAtIGJhZCBzaGExIik7CisJCWJ1ZmZlciArPSA0ODsKKwkJcGFyZW50cysrOworCX0KKwlncmFmdCA9IGxvb2t1cF9jb21taXRfZ3JhZnQoY29tbWl0LT5vYmplY3Quc2hhMSk7CisJaWYgKGdyYWZ0KSB7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqcCA9IGNvbW1pdC0+cGFyZW50czsKKwkJcGFyZW50cyA9IDA7CisJCXdoaWxlIChwKSB7CisJCQlwID0gcC0+bmV4dDsKKwkJCXBhcmVudHMrKzsKKwkJfQorCQlpZiAoZ3JhZnQtPm5yX3BhcmVudCA9PSAtMSAmJiAhcGFyZW50cykKKwkJCTsgLyogc2hhbGxvdyBjb21taXQgKi8KKwkJZWxzZSBpZiAoZ3JhZnQtPm5yX3BhcmVudCAhPSBwYXJlbnRzKQorCQkJcmV0dXJuIGVycm9yX2Z1bmMoJmNvbW1pdC0+b2JqZWN0LCBGU0NLX0VSUk9SLCAiZ3JhZnQgb2JqZWN0cyBtaXNzaW5nIik7CisJfSBlbHNlIHsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICpwID0gY29tbWl0LT5wYXJlbnRzOworCQl3aGlsZSAocCAmJiBwYXJlbnRzKSB7CisJCQlwID0gcC0+bmV4dDsKKwkJCXBhcmVudHMtLTsKKwkJfQorCQlpZiAocCB8fCBwYXJlbnRzKQorCQkJcmV0dXJuIGVycm9yX2Z1bmMoJmNvbW1pdC0+b2JqZWN0LCBGU0NLX0VSUk9SLCAicGFyZW50IG9iamVjdHMgbWlzc2luZyIpOworCX0KKwlpZiAobWVtY21wKGJ1ZmZlciwgImF1dGhvciAiLCA3KSkKKwkJcmV0dXJuIGVycm9yX2Z1bmMoJmNvbW1pdC0+b2JqZWN0LCBGU0NLX0VSUk9SLCAiaW52YWxpZCBmb3JtYXQgLSBleHBlY3RlZCAnYXV0aG9yJyBsaW5lIik7CisJaWYgKCFjb21taXQtPnRyZWUpCisJCXJldHVybiBlcnJvcl9mdW5jKCZjb21taXQtPm9iamVjdCwgRlNDS19FUlJPUiwgImNvdWxkIG5vdCBsb2FkIGNvbW1pdCdzIHRyZWUgJXMiLCBzaGExX3RvX2hleCh0cmVlX3NoYTEpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZzY2tfdGFnKHN0cnVjdCB0YWcgKnRhZywgZnNja19lcnJvciBlcnJvcl9mdW5jKQoreworCXN0cnVjdCBvYmplY3QgKnRhZ2dlZCA9IHRhZy0+dGFnZ2VkOworCisJaWYgKCF0YWdnZWQpCisJCXJldHVybiBlcnJvcl9mdW5jKCZ0YWctPm9iamVjdCwgRlNDS19FUlJPUiwgImNvdWxkIG5vdCBsb2FkIHRhZ2dlZCBvYmplY3QiKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGZzY2tfb2JqZWN0KHN0cnVjdCBvYmplY3QgKm9iaiwgaW50IHN0cmljdCwgZnNja19lcnJvciBlcnJvcl9mdW5jKQoreworCWlmICghb2JqKQorCQlyZXR1cm4gZXJyb3JfZnVuYyhvYmosIEZTQ0tfRVJST1IsICJubyB2YWxpZCBvYmplY3QgdG8gZnNjayIpOworCisJaWYgKG9iai0+dHlwZSA9PSBPQkpfQkxPQikKKwkJcmV0dXJuIDA7CisJaWYgKG9iai0+dHlwZSA9PSBPQkpfVFJFRSkKKwkJcmV0dXJuIGZzY2tfdHJlZSgoc3RydWN0IHRyZWUgKikgb2JqLCBzdHJpY3QsIGVycm9yX2Z1bmMpOworCWlmIChvYmotPnR5cGUgPT0gT0JKX0NPTU1JVCkKKwkJcmV0dXJuIGZzY2tfY29tbWl0KChzdHJ1Y3QgY29tbWl0ICopIG9iaiwgZXJyb3JfZnVuYyk7CisJaWYgKG9iai0+dHlwZSA9PSBPQkpfVEFHKQorCQlyZXR1cm4gZnNja190YWcoKHN0cnVjdCB0YWcgKikgb2JqLCBlcnJvcl9mdW5jKTsKKworCXJldHVybiBlcnJvcl9mdW5jKG9iaiwgRlNDS19FUlJPUiwgInVua25vd24gdHlwZSAnJWQnIChpbnRlcm5hbCBmc2NrIGVycm9yKSIsCisJCQkgIG9iai0+dHlwZSk7Cit9CisKK2ludCBmc2NrX2Vycm9yX2Z1bmN0aW9uKHN0cnVjdCBvYmplY3QgKm9iaiwgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJaW50IGxlbjsKKwlzdHJ1Y3Qgc3RyYnVmIHNiOworCisJc3RyYnVmX2luaXQoJnNiLCAwKTsKKwlzdHJidWZfYWRkZigmc2IsICJvYmplY3QgJXM6Iiwgb2JqLT5zaGExP3NoYTFfdG9faGV4KG9iai0+c2hhMSk6IihudWxsKSIpOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJbGVuID0gdnNucHJpbnRmKHNiLmJ1ZiArIHNiLmxlbiwgc3RyYnVmX2F2YWlsKCZzYiksIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisKKwlpZiAobGVuIDwgMCkKKwkJbGVuID0gMDsKKwlpZiAobGVuID49IHN0cmJ1Zl9hdmFpbCgmc2IpKSB7CisJCXN0cmJ1Zl9ncm93KCZzYiwgbGVuICsgMik7CisJCXZhX3N0YXJ0KGFwLCBmbXQpOworCQlsZW4gPSB2c25wcmludGYoc2IuYnVmICsgc2IubGVuLCBzdHJidWZfYXZhaWwoJnNiKSwgZm10LCBhcCk7CisJCXZhX2VuZChhcCk7CisJCWlmIChsZW4gPj0gc3RyYnVmX2F2YWlsKCZzYikpCisJCQlkaWUoInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIHlvdXIgc25wcmludGYgaXMgYnJva2VuIik7CisJfQorCisJZXJyb3Ioc2IuYnVmKTsKKwlzdHJidWZfcmVsZWFzZSgmc2IpOworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZnNjay5oIGIvZnNjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MGVlMDIKLS0tIC9kZXYvbnVsbAorKysgYi9mc2NrLmgKQEAgLTAsMCArMSwzMiBAQAorI2lmbmRlZiBHSVRfRlNDS19ICisjZGVmaW5lIEdJVF9GU0NLX0gKKworI2RlZmluZSBGU0NLX0VSUk9SIDEKKyNkZWZpbmUgRlNDS19XQVJOIDIKKworLyoKKyAqIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBmc2NrX3dhbGsKKyAqIHR5cGUgaXMgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIG9iamVjdCBvciBPQkpfQU5ZCisgKiB0aGUgcmV0dXJuIHZhbHVlIGlzOgorICogICAgIDAJZXZlcnl0aGluZyBPSworICogICAgIDwwCWVycm9yIHNpZ25hbGVkIGFuZCBhYm9ydAorICogICAgID4wCWVycm9yIHNpZ25hbGVkIGFuZCBkbyBub3QgYWJvcnQKKyAqLwordHlwZWRlZiBpbnQgKCpmc2NrX3dhbGtfZnVuYykoc3RydWN0IG9iamVjdCAqb2JqLCBpbnQgdHlwZSwgdm9pZCAqZGF0YSk7CisKKy8qIGNhbGxiYWNrIGZvciBmc2NrX29iamVjdCwgdHlwZSBpcyBGU0NLX0VSUk9SIG9yIEZTQ0tfV0FSTiAqLwordHlwZWRlZiBpbnQgKCpmc2NrX2Vycm9yKShzdHJ1Y3Qgb2JqZWN0ICpvYmosIGludCB0eXBlLCBjb25zdCBjaGFyICplcnIsIC4uLik7CisKK2ludCBmc2NrX2Vycm9yX2Z1bmN0aW9uKHN0cnVjdCBvYmplY3QgKm9iaiwgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKworLyogZGVzY2VuZCBpbiBhbGwgbGlua2VkIGNoaWxkIG9iamVjdHMKKyAqIHRoZSByZXR1cm4gdmFsdWUgaXM6CisgKiAgICAtMQllcnJvciBpbiBwcm9jZXNzaW5nIHRoZSBvYmplY3QKKyAqICAgIDwwCXJldHVybiB2YWx1ZSBvZiB0aGUgY2FsbGJhY2ssIHdoaWNoIGxlYWQgdG8gYW4gYWJvcnQKKyAqICAgID4wCXJldHVybiB2YWx1ZSBvZiB0aGUgZmlyc3Qgc2lnYWxlZCBlcnJvciA+MCAoaW4gdGhlIGNhc2Ugb2Ygbm8gb3RoZXIgZXJyb3JzKQorICogICAgMAkJZXZlcnl0aGluZyBPSworICovCitpbnQgZnNja193YWxrKHN0cnVjdCBvYmplY3QgKm9iaiwgZnNja193YWxrX2Z1bmMgd2Fsaywgdm9pZCAqZGF0YSk7CitpbnQgZnNja19vYmplY3Qoc3RydWN0IG9iamVjdCAqb2JqLCBpbnQgc3RyaWN0LCBmc2NrX2Vycm9yIGVycm9yX2Z1bmMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dlbmVyYXRlLWNtZGxpc3Quc2ggYi9nZW5lcmF0ZS1jbWRsaXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEyOTEzYzIKLS0tIC9kZXYvbnVsbAorKysgYi9nZW5lcmF0ZS1jbWRsaXN0LnNoCkBAIC0wLDAgKzEsMjQgQEAKKyMhL2Jpbi9zaAorCitlY2hvICIvKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSAkMCAqLworc3RydWN0IGNtZG5hbWVfaGVscAoreworICAgIGNoYXIgbmFtZVsxNl07CisgICAgY2hhciBoZWxwWzgwXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY21kbmFtZV9oZWxwIGNvbW1vbl9jbWRzW10gPSB7IgorCitzZWQgLW4gLWUgJ3MvXmdpdC1cKFteIAldKlwpWyAJXS4qIGNvbW1vbi4qL1wxL3AnIGNvbW1hbmQtbGlzdC50eHQgfAorc29ydCB8Cit3aGlsZSByZWFkIGNtZAorZG8KKyAgICAgc2VkIC1uICcKKyAgICAgL05BTUUvLC9naXQtJyIkY21kIicvSAorICAgICAkeworICAgICAgICAgICAgeAorICAgICAgICAgICAgcy8uKmdpdC0nIiRjbWQiJyAtIFwoLipcKS8gIHsiJyIkY21kIiciLCAiXDEifSwvCisJICAgIHAKKyAgICAgfScgIkRvY3VtZW50YXRpb24vZ2l0LSRjbWQudHh0IgorZG9uZQorZWNobyAifTsiCmRpZmYgLS1naXQgYS9naXQtYWRkLS1pbnRlcmFjdGl2ZS5wZXJsIGIvZ2l0LWFkZC0taW50ZXJhY3RpdmUucGVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMGE4MWYxCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWFkZC0taW50ZXJhY3RpdmUucGVybApAQCAtMCwwICsxLDEwNTEgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCit1c2Ugc3RyaWN0OwordXNlIEdpdDsKKworbXkgJHJlcG8gPSBHaXQtPnJlcG9zaXRvcnkoKTsKKworbXkgJG1lbnVfdXNlX2NvbG9yID0gJHJlcG8tPmdldF9jb2xvcmJvb2woJ2NvbG9yLmludGVyYWN0aXZlJyk7CitteSAoJHByb21wdF9jb2xvciwgJGhlYWRlcl9jb2xvciwgJGhlbHBfY29sb3IpID0KKwkkbWVudV91c2VfY29sb3IgPyAoCisJCSRyZXBvLT5nZXRfY29sb3IoJ2NvbG9yLmludGVyYWN0aXZlLnByb21wdCcsICdib2xkIGJsdWUnKSwKKwkJJHJlcG8tPmdldF9jb2xvcignY29sb3IuaW50ZXJhY3RpdmUuaGVhZGVyJywgJ2JvbGQnKSwKKwkJJHJlcG8tPmdldF9jb2xvcignY29sb3IuaW50ZXJhY3RpdmUuaGVscCcsICdyZWQgYm9sZCcpLAorCSkgOiAoKTsKKworbXkgJGRpZmZfdXNlX2NvbG9yID0gJHJlcG8tPmdldF9jb2xvcmJvb2woJ2NvbG9yLmRpZmYnKTsKK215ICgkZnJhZ2luZm9fY29sb3IpID0KKwkkZGlmZl91c2VfY29sb3IgPyAoCisJCSRyZXBvLT5nZXRfY29sb3IoJ2NvbG9yLmRpZmYuZnJhZycsICdjeWFuJyksCisJKSA6ICgpOworCitteSAkbm9ybWFsX2NvbG9yID0gJHJlcG8tPmdldF9jb2xvcigiIiwgInJlc2V0Iik7CisKK3N1YiBjb2xvcmVkIHsKKwlteSAkY29sb3IgPSBzaGlmdDsKKwlteSAkc3RyaW5nID0gam9pbigiIiwgQF8pOworCisJaWYgKGRlZmluZWQgJGNvbG9yKSB7CisJCSMgUHV0IGEgY29sb3IgY29kZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSwgYSByZXNldCBhdCB0aGUgZW5kCisJCSMgY29sb3IgYWZ0ZXIgbmV3bGluZXMgdGhhdCBhcmUgbm90IGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZworCQkkc3RyaW5nID1+IHMvKFxuKykoLikvJDEkY29sb3IkMi9nOworCQkjIHJlc2V0IGJlZm9yZSBuZXdsaW5lcworCQkkc3RyaW5nID1+IHMvKFxuKykvJG5vcm1hbF9jb2xvciQxL2c7CisJCSMgY29kZXMgYXQgYmVnaW5uaW5nIGFuZCBlbmQgKGlmIG5lY2Vzc2FyeSk6CisJCSRzdHJpbmcgPX4gcy9eLyRjb2xvci87CisJCSRzdHJpbmcgPX4gcy8kLyRub3JtYWxfY29sb3IvIHVubGVzcyAkc3RyaW5nID1+IC9cbiQvOworCX0KKwlyZXR1cm4gJHN0cmluZzsKK30KKworIyBjb21tYW5kIGxpbmUgb3B0aW9ucworbXkgJHBhdGNoX21vZGU7CisKK3N1YiBydW5fY21kX3BpcGUgeworCWlmICgkXk8gZXEgJ01TV2luMzInKSB7CisJCW15IEBpbnZhbGlkID0gZ3JlcCB7bS9bIjoqXS99IEBfOworCQlkaWUgIiReTyBkb2VzIG5vdCBzdXBwb3J0OiBAaW52YWxpZFxuIiBpZiBAaW52YWxpZDsKKwkJbXkgQGFyZ3MgPSBtYXAgeyBtLyAvbyA/ICJcIiRfXCIiOiAkXyB9IEBfOworCQlyZXR1cm4gcXh7QGFyZ3N9OworCX0gZWxzZSB7CisJCW15ICRmaCA9IHVuZGVmOworCQlvcGVuKCRmaCwgJy18JywgQF8pIG9yIGRpZTsKKwkJcmV0dXJuIDwkZmg+OworCX0KK30KKworbXkgKCRHSVRfRElSKSA9IHJ1bl9jbWRfcGlwZShxdyhnaXQgcmV2LXBhcnNlIC0tZ2l0LWRpcikpOworCitpZiAoIWRlZmluZWQgJEdJVF9ESVIpIHsKKwlleGl0KDEpOyAjIHJldi1wYXJzZSB3b3VsZCBoYXZlIGFscmVhZHkgc2FpZCAibm90IGEgZ2l0IHJlcG8iCit9CitjaG9tcCgkR0lUX0RJUik7CisKK3N1YiByZWZyZXNoIHsKKwlteSAkZmg7CisJb3BlbiAkZmgsICdnaXQgdXBkYXRlLWluZGV4IC0tcmVmcmVzaCB8JworCSAgICBvciBkaWU7CisJd2hpbGUgKDwkZmg+KSB7CisJCTsjIGlnbm9yZSAnbmVlZHMgdXBkYXRlJworCX0KKwljbG9zZSAkZmg7Cit9CisKK3N1YiBsaXN0X3VudHJhY2tlZCB7CisJbWFwIHsKKwkJY2hvbXAgJF87CisJCSRfOworCX0KKwlydW5fY21kX3BpcGUocXcoZ2l0IGxzLWZpbGVzIC0tb3RoZXJzIC0tZXhjbHVkZS1zdGFuZGFyZCAtLSksIEBBUkdWKTsKK30KKworbXkgJHN0YXR1c19mbXQgPSAnJTEycyAlMTJzICVzJzsKK215ICRzdGF0dXNfaGVhZCA9IHNwcmludGYoJHN0YXR1c19mbXQsICdzdGFnZWQnLCAndW5zdGFnZWQnLCAncGF0aCcpOworCit7CisJbXkgJGluaXRpYWw7CisJc3ViIGlzX2luaXRpYWxfY29tbWl0IHsKKwkJJGluaXRpYWwgPSBzeXN0ZW0oJ2dpdCByZXYtcGFyc2UgSEVBRCAtLSA+L2Rldi9udWxsIDI+JjEnKSAhPSAwCisJCQl1bmxlc3MgZGVmaW5lZCAkaW5pdGlhbDsKKwkJcmV0dXJuICRpbml0aWFsOworCX0KK30KKworc3ViIGdldF9lbXB0eV90cmVlIHsKKwlyZXR1cm4gJzRiODI1ZGM2NDJjYjZlYjlhMDYwZTU0YmY4ZDY5Mjg4ZmJlZTQ5MDQnOworfQorCisjIFJldHVybnMgbGlzdCBvZiBoYXNoZXMsIGNvbnRlbnRzIG9mIGVhY2ggb2Ygd2hpY2ggYXJlOgorIyBWQUxVRToJcGF0aG5hbWUKKyMgQklOQVJZOglpcyBhIGJpbmFyeSBwYXRoCisjIElOREVYOglpcyBpbmRleCBkaWZmZXJlbnQgZnJvbSBIRUFEPworIyBGSUxFOgkJaXMgZmlsZSBkaWZmZXJlbnQgZnJvbSBpbmRleD8KKyMgSU5ERVhfQUREREVMOglpcyBpdCBhZGQvZGVsZXRlIGJldHdlZW4gSEVBRCBhbmQgaW5kZXg/CisjIEZJTEVfQUREREVMOglpcyBpdCBhZGQvZGVsZXRlIGJldHdlZW4gaW5kZXggYW5kIGZpbGU/CisKK3N1YiBsaXN0X21vZGlmaWVkIHsKKwlteSAoJG9ubHkpID0gQF87CisJbXkgKCVkYXRhLCBAcmV0dXJuKTsKKwlteSAoJGFkZCwgJGRlbCwgJGFkZGRlbCwgJGZpbGUpOworCW15IEB0cmFja2VkID0gKCk7CisKKwlpZiAoQEFSR1YpIHsKKwkJQHRyYWNrZWQgPSBtYXAgeworCQkJY2hvbXAgJF87ICRfOworCQl9IHJ1bl9jbWRfcGlwZShxdyhnaXQgbHMtZmlsZXMgLS1leGNsdWRlLXN0YW5kYXJkIC0tKSwgQEFSR1YpOworCQlyZXR1cm4gaWYgKCFAdHJhY2tlZCk7CisJfQorCisJbXkgJHJlZmVyZW5jZSA9IGlzX2luaXRpYWxfY29tbWl0KCkgPyBnZXRfZW1wdHlfdHJlZSgpIDogJ0hFQUQnOworCWZvciAocnVuX2NtZF9waXBlKHF3KGdpdCBkaWZmLWluZGV4IC0tY2FjaGVkCisJCQkgICAgIC0tbnVtc3RhdCAtLXN1bW1hcnkpLCAkcmVmZXJlbmNlLAorCQkJICAgICAnLS0nLCBAdHJhY2tlZCkpIHsKKwkJaWYgKCgkYWRkLCAkZGVsLCAkZmlsZSkgPQorCQkgICAgL14oWy1cZF0rKQkoWy1cZF0rKQkoLiopLykgeworCQkJbXkgKCRjaGFuZ2UsICRiaW4pOworCQkJaWYgKCRhZGQgZXEgJy0nICYmICRkZWwgZXEgJy0nKSB7CisJCQkJJGNoYW5nZSA9ICdiaW5hcnknOworCQkJCSRiaW4gPSAxOworCQkJfQorCQkJZWxzZSB7CisJCQkJJGNoYW5nZSA9ICIrJGFkZC8tJGRlbCI7CisJCQl9CisJCQkkZGF0YXskZmlsZX0gPSB7CisJCQkJSU5ERVggPT4gJGNoYW5nZSwKKwkJCQlCSU5BUlkgPT4gJGJpbiwKKwkJCQlGSUxFID0+ICdub3RoaW5nJywKKwkJCX0KKwkJfQorCQllbHNpZiAoKCRhZGRkZWwsICRmaWxlKSA9CisJCSAgICAgICAvXiAoY3JlYXRlfGRlbGV0ZSkgbW9kZSBbMC03XSsgKC4qKSQvKSB7CisJCQkkZGF0YXskZmlsZX17SU5ERVhfQUREREVMfSA9ICRhZGRkZWw7CisJCX0KKwl9CisKKwlmb3IgKHJ1bl9jbWRfcGlwZShxdyhnaXQgZGlmZi1maWxlcyAtLW51bXN0YXQgLS1zdW1tYXJ5IC0tKSwgQHRyYWNrZWQpKSB7CisJCWlmICgoJGFkZCwgJGRlbCwgJGZpbGUpID0KKwkJICAgIC9eKFstXGRdKykJKFstXGRdKykJKC4qKS8pIHsKKwkJCWlmICghZXhpc3RzICRkYXRheyRmaWxlfSkgeworCQkJCSRkYXRheyRmaWxlfSA9ICt7CisJCQkJCUlOREVYID0+ICd1bmNoYW5nZWQnLAorCQkJCQlCSU5BUlkgPT4gMCwKKwkJCQl9OworCQkJfQorCQkJbXkgKCRjaGFuZ2UsICRiaW4pOworCQkJaWYgKCRhZGQgZXEgJy0nICYmICRkZWwgZXEgJy0nKSB7CisJCQkJJGNoYW5nZSA9ICdiaW5hcnknOworCQkJCSRiaW4gPSAxOworCQkJfQorCQkJZWxzZSB7CisJCQkJJGNoYW5nZSA9ICIrJGFkZC8tJGRlbCI7CisJCQl9CisJCQkkZGF0YXskZmlsZX17RklMRX0gPSAkY2hhbmdlOworCQkJaWYgKCRiaW4pIHsKKwkJCQkkZGF0YXskZmlsZX17QklOQVJZfSA9IDE7CisJCQl9CisJCX0KKwkJZWxzaWYgKCgkYWRkZGVsLCAkZmlsZSkgPQorCQkgICAgICAgL14gKGNyZWF0ZXxkZWxldGUpIG1vZGUgWzAtN10rICguKikkLykgeworCQkJJGRhdGF7JGZpbGV9e0ZJTEVfQUREREVMfSA9ICRhZGRkZWw7CisJCX0KKwl9CisKKwlmb3IgKHNvcnQga2V5cyAlZGF0YSkgeworCQlteSAkaXQgPSAkZGF0YXskX307CisKKwkJaWYgKCRvbmx5KSB7CisJCQlpZiAoJG9ubHkgZXEgJ2luZGV4LW9ubHknKSB7CisJCQkJbmV4dCBpZiAoJGl0LT57SU5ERVh9IGVxICd1bmNoYW5nZWQnKTsKKwkJCX0KKwkJCWlmICgkb25seSBlcSAnZmlsZS1vbmx5JykgeworCQkJCW5leHQgaWYgKCRpdC0+e0ZJTEV9IGVxICdub3RoaW5nJyk7CisJCQl9CisJCX0KKwkJcHVzaCBAcmV0dXJuLCAreworCQkJVkFMVUUgPT4gJF8sCisJCQklJGl0LAorCQl9OworCX0KKwlyZXR1cm4gQHJldHVybjsKK30KKworc3ViIGZpbmRfdW5pcXVlIHsKKwlteSAoJHN0cmluZywgQHN0dWZmKSA9IEBfOworCW15ICRmb3VuZCA9IHVuZGVmOworCWZvciAobXkgJGkgPSAwOyAkaSA8IEBzdHVmZjsgJGkrKykgeworCQlteSAkaXQgPSAkc3R1ZmZbJGldOworCQlteSAkaGl0ID0gdW5kZWY7CisJCWlmIChyZWYgJGl0KSB7CisJCQlpZiAoKHJlZiAkaXQpIGVxICdBUlJBWScpIHsKKwkJCQkkaXQgPSAkaXQtPlswXTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCSRpdCA9ICRpdC0+e1ZBTFVFfTsKKwkJCX0KKwkJfQorCQlldmFsIHsKKwkJCWlmICgkaXQgPX4gL14kc3RyaW5nLykgeworCQkJCSRoaXQgPSAxOworCQkJfTsKKwkJfTsKKwkJaWYgKGRlZmluZWQgJGhpdCAmJiBkZWZpbmVkICRmb3VuZCkgeworCQkJcmV0dXJuIHVuZGVmOworCQl9CisJCWlmICgkaGl0KSB7CisJCQkkZm91bmQgPSAkaSArIDE7CisJCX0KKwl9CisJcmV0dXJuICRmb3VuZDsKK30KKworIyBpbnNlcnRzIHN0cmluZyBpbnRvIHRyaWUgYW5kIHVwZGF0ZXMgY291bnQgZm9yIGVhY2ggY2hhcmFjdGVyCitzdWIgdXBkYXRlX3RyaWUgeworCW15ICgkdHJpZSwgJHN0cmluZykgPSBAXzsKKwlmb3JlYWNoIChzcGxpdCAvLywgJHN0cmluZykgeworCQkkdHJpZSA9ICR0cmllLT57JF99IHx8PSB7Q09VTlQgPT4gMH07CisJCSR0cmllLT57Q09VTlR9Kys7CisJfQorfQorCisjIHJldHVybnMgYW4gYXJyYXkgb2YgdHVwbGVzIChwcmVmaXgsIHJlbWFpbmRlcikKK3N1YiBmaW5kX3VuaXF1ZV9wcmVmaXhlcyB7CisJbXkgQHN0dWZmID0gQF87CisJbXkgQHJldHVybiA9ICgpOworCisJIyBhbnkgc2luZ2xlIHByZWZpeCBleGNlZWRpbmcgdGhlIHNvZnQgbGltaXQgaXMgb21pdHRlZAorCSMgaWYgYW55IHByZWZpeCBleGNlZWRzIHRoZSBoYXJkIGxpbWl0IGFsbCBhcmUgb21pdHRlZAorCSMgMCBpbmRpY2F0ZXMgbm8gbGltaXQKKwlteSAkc29mdF9saW1pdCA9IDA7CisJbXkgJGhhcmRfbGltaXQgPSAzOworCisJIyBidWlsZCBhIHRyaWUgbW9kZWxsaW5nIGFsbCBwb3NzaWJsZSBvcHRpb25zCisJbXkgJXRyaWU7CisJZm9yZWFjaCBteSAkcHJpbnQgKEBzdHVmZikgeworCQlpZiAoKHJlZiAkcHJpbnQpIGVxICdBUlJBWScpIHsKKwkJCSRwcmludCA9ICRwcmludC0+WzBdOworCQl9CisJCWVsc2lmICgocmVmICRwcmludCkgZXEgJ0hBU0gnKSB7CisJCQkkcHJpbnQgPSAkcHJpbnQtPntWQUxVRX07CisJCX0KKwkJdXBkYXRlX3RyaWUoXCV0cmllLCAkcHJpbnQpOworCQlwdXNoIEByZXR1cm4sICRwcmludDsKKwl9CisKKwkjIHVzZSB0aGUgdHJpZSB0byBmaW5kIHRoZSB1bmlxdWUgcHJlZml4ZXMKKwlmb3IgKG15ICRpID0gMDsgJGkgPCBAcmV0dXJuOyAkaSsrKSB7CisJCW15ICRyZXQgPSAkcmV0dXJuWyRpXTsKKwkJbXkgQGxldHRlcnMgPSBzcGxpdCAvLywgJHJldDsKKwkJbXkgJXNlYXJjaCA9ICV0cmllOworCQlteSAoJHByZWZpeCwgJHJlbWFpbmRlcik7CisJCW15ICRqOworCQlmb3IgKCRqID0gMDsgJGogPCBAbGV0dGVyczsgJGorKykgeworCQkJbXkgJGxldHRlciA9ICRsZXR0ZXJzWyRqXTsKKwkJCWlmICgkc2VhcmNoeyRsZXR0ZXJ9e0NPVU5UfSA9PSAxKSB7CisJCQkJJHByZWZpeCA9IHN1YnN0ciAkcmV0LCAwLCAkaiArIDE7CisJCQkJJHJlbWFpbmRlciA9IHN1YnN0ciAkcmV0LCAkaiArIDE7CisJCQkJbGFzdDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCW15ICRwcmVmaXggPSBzdWJzdHIgJHJldCwgMCwgJGo7CisJCQkJcmV0dXJuICgpCisJCQkJICAgIGlmICgkaGFyZF9saW1pdCAmJiAkaiArIDEgPiAkaGFyZF9saW1pdCk7CisJCQl9CisJCQklc2VhcmNoID0gJXskc2VhcmNoeyRsZXR0ZXJ9fTsKKwkJfQorCQlpZiAoJHNvZnRfbGltaXQgJiYgJGogKyAxID4gJHNvZnRfbGltaXQpIHsKKwkJCSRwcmVmaXggPSB1bmRlZjsKKwkJCSRyZW1haW5kZXIgPSAkcmV0OworCQl9CisJCSRyZXR1cm5bJGldID0gWyRwcmVmaXgsICRyZW1haW5kZXJdOworCX0KKwlyZXR1cm4gQHJldHVybjsKK30KKworIyBmaWx0ZXJzIG91dCBwcmVmaXhlcyB3aGljaCBoYXZlIHNwZWNpYWwgbWVhbmluZyB0byBsaXN0X2FuZF9jaG9vc2UoKQorc3ViIGlzX3ZhbGlkX3ByZWZpeCB7CisJbXkgJHByZWZpeCA9IHNoaWZ0OworCXJldHVybiAoZGVmaW5lZCAkcHJlZml4KSAmJgorCSAgICAhKCRwcmVmaXggPX4gL1tccyxdLykgJiYgIyBzZXBhcmF0b3JzCisJICAgICEoJHByZWZpeCA9fiAvXi0vKSAmJiAgICAjIGRlc2VsZWN0aW9uCisJICAgICEoJHByZWZpeCA9fiAvXlxkKy8pICYmICAjIHNlbGVjdGlvbgorCSAgICAoJHByZWZpeCBuZSAnKicpICYmICAgICAgIyAiYWxsIiB3aWxkY2FyZAorCSAgICAoJHByZWZpeCBuZSAnPycpOyAgICAgICAgIyBwcm9tcHQgaGVscAorfQorCisjIGdpdmVuIGEgcHJlZml4L3JlbWFpbmRlciB0dXBsZSByZXR1cm4gYSBzdHJpbmcgd2l0aCB0aGUgcHJlZml4IGhpZ2hsaWdodGVkCisjIGZvciBub3cgdXNlIHNxdWFyZSBicmFja2V0czsgbGF0ZXIgbWlnaHQgdXNlIEFOU0kgY29sb3JzICh1bmRlcmxpbmUsIGJvbGQpCitzdWIgaGlnaGxpZ2h0X3ByZWZpeCB7CisJbXkgJHByZWZpeCA9IHNoaWZ0OworCW15ICRyZW1haW5kZXIgPSBzaGlmdDsKKworCWlmICghZGVmaW5lZCAkcHJlZml4KSB7CisJCXJldHVybiAkcmVtYWluZGVyOworCX0KKworCWlmICghaXNfdmFsaWRfcHJlZml4KCRwcmVmaXgpKSB7CisJCXJldHVybiAiJHByZWZpeCRyZW1haW5kZXIiOworCX0KKworCWlmICghJG1lbnVfdXNlX2NvbG9yKSB7CisJCXJldHVybiAiWyRwcmVmaXhdJHJlbWFpbmRlciI7CisJfQorCisJcmV0dXJuICIkcHJvbXB0X2NvbG9yJHByZWZpeCRub3JtYWxfY29sb3IkcmVtYWluZGVyIjsKK30KKworc3ViIGxpc3RfYW5kX2Nob29zZSB7CisJbXkgKCRvcHRzLCBAc3R1ZmYpID0gQF87CisJbXkgKEBjaG9zZW4sIEByZXR1cm4pOworCW15ICRpOworCW15IEBwcmVmaXhlcyA9IGZpbmRfdW5pcXVlX3ByZWZpeGVzKEBzdHVmZikgdW5sZXNzICRvcHRzLT57TElTVF9PTkxZfTsKKworICAgICAgVE9QTE9PUDoKKwl3aGlsZSAoMSkgeworCQlteSAkbGFzdF9sZiA9IDA7CisKKwkJaWYgKCRvcHRzLT57SEVBREVSfSkgeworCQkJaWYgKCEkb3B0cy0+e0xJU1RfRkxBVH0pIHsKKwkJCQlwcmludCAiICAgICAiOworCQkJfQorCQkJcHJpbnQgY29sb3JlZCAkaGVhZGVyX2NvbG9yLCAiJG9wdHMtPntIRUFERVJ9XG4iOworCQl9CisJCWZvciAoJGkgPSAwOyAkaSA8IEBzdHVmZjsgJGkrKykgeworCQkJbXkgJGNob3NlbiA9ICRjaG9zZW5bJGldID8gJyonIDogJyAnOworCQkJbXkgJHByaW50ID0gJHN0dWZmWyRpXTsKKwkJCW15ICRyZWYgPSByZWYgJHByaW50OworCQkJbXkgJGhpZ2hsaWdodGVkID0gaGlnaGxpZ2h0X3ByZWZpeChAeyRwcmVmaXhlc1skaV19KQorCQkJICAgIGlmIEBwcmVmaXhlczsKKwkJCWlmICgkcmVmIGVxICdBUlJBWScpIHsKKwkJCQkkcHJpbnQgPSAkaGlnaGxpZ2h0ZWQgfHwgJHByaW50LT5bMF07CisJCQl9CisJCQllbHNpZiAoJHJlZiBlcSAnSEFTSCcpIHsKKwkJCQlteSAkdmFsdWUgPSAkaGlnaGxpZ2h0ZWQgfHwgJHByaW50LT57VkFMVUV9OworCQkJCSRwcmludCA9IHNwcmludGYoJHN0YXR1c19mbXQsCisJCQkJICAgICRwcmludC0+e0lOREVYfSwKKwkJCQkgICAgJHByaW50LT57RklMRX0sCisJCQkJICAgICR2YWx1ZSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQkkcHJpbnQgPSAkaGlnaGxpZ2h0ZWQgfHwgJHByaW50OworCQkJfQorCQkJcHJpbnRmKCIlcyUyZDogJXMiLCAkY2hvc2VuLCAkaSsxLCAkcHJpbnQpOworCQkJaWYgKCgkb3B0cy0+e0xJU1RfRkxBVH0pICYmCisJCQkgICAgKCgkaSArIDEpICUgKCRvcHRzLT57TElTVF9GTEFUfSkpKSB7CisJCQkJcHJpbnQgIlx0IjsKKwkJCQkkbGFzdF9sZiA9IDA7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwcmludCAiXG4iOworCQkJCSRsYXN0X2xmID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoISRsYXN0X2xmKSB7CisJCQlwcmludCAiXG4iOworCQl9CisKKwkJcmV0dXJuIGlmICgkb3B0cy0+e0xJU1RfT05MWX0pOworCisJCXByaW50IGNvbG9yZWQgJHByb21wdF9jb2xvciwgJG9wdHMtPntQUk9NUFR9OworCQlpZiAoJG9wdHMtPntTSU5HTEVUT059KSB7CisJCQlwcmludCAiPiAiOworCQl9CisJCWVsc2UgeworCQkJcHJpbnQgIj4+ICI7CisJCX0KKwkJbXkgJGxpbmUgPSA8U1RESU4+OworCQlpZiAoISRsaW5lKSB7CisJCQlwcmludCAiXG4iOworCQkJJG9wdHMtPntPTl9FT0Z9LT4oKSBpZiAkb3B0cy0+e09OX0VPRn07CisJCQlsYXN0OworCQl9CisJCWNob21wICRsaW5lOworCQlsYXN0IGlmICRsaW5lIGVxICcnOworCQlpZiAoJGxpbmUgZXEgJz8nKSB7CisJCQkkb3B0cy0+e1NJTkdMRVRPTn0gPworCQkJICAgIHNpbmdsZXRvbl9wcm9tcHRfaGVscF9jbWQoKSA6CisJCQkgICAgcHJvbXB0X2hlbHBfY21kKCk7CisJCQluZXh0IFRPUExPT1A7CisJCX0KKwkJZm9yIG15ICRjaG9pY2UgKHNwbGl0KC9bXHMsXSsvLCAkbGluZSkpIHsKKwkJCW15ICRjaG9vc2UgPSAxOworCQkJbXkgKCRib3R0b20sICR0b3ApOworCisJCQkjIElucHV0IHRoYXQgYmVnaW5zIHdpdGggJy0nOyB1bmNob29zZQorCQkJaWYgKCRjaG9pY2UgPX4gcy9eLS8vKSB7CisJCQkJJGNob29zZSA9IDA7CisJCQl9CisJCQkjIEEgcmFuZ2UgY2FuIGJlIHNwZWNpZmllZCBsaWtlIDUtNworCQkJaWYgKCRjaG9pY2UgPX4gL14oXGQrKS0oXGQrKSQvKSB7CisJCQkJKCRib3R0b20sICR0b3ApID0gKCQxLCAkMik7CisJCQl9CisJCQllbHNpZiAoJGNob2ljZSA9fiAvXlxkKyQvKSB7CisJCQkJJGJvdHRvbSA9ICR0b3AgPSAkY2hvaWNlOworCQkJfQorCQkJZWxzaWYgKCRjaG9pY2UgZXEgJyonKSB7CisJCQkJJGJvdHRvbSA9IDE7CisJCQkJJHRvcCA9IDEgKyBAc3R1ZmY7CisJCQl9CisJCQllbHNlIHsKKwkJCQkkYm90dG9tID0gJHRvcCA9IGZpbmRfdW5pcXVlKCRjaG9pY2UsIEBzdHVmZik7CisJCQkJaWYgKCFkZWZpbmVkICRib3R0b20pIHsKKwkJCQkJcHJpbnQgIkh1aCAoJGNob2ljZSk/XG4iOworCQkJCQluZXh0IFRPUExPT1A7CisJCQkJfQorCQkJfQorCQkJaWYgKCRvcHRzLT57U0lOR0xFVE9OfSAmJiAkYm90dG9tICE9ICR0b3ApIHsKKwkJCQlwcmludCAiSHVoICgkY2hvaWNlKT9cbiI7CisJCQkJbmV4dCBUT1BMT09QOworCQkJfQorCQkJZm9yICgkaSA9ICRib3R0b20tMTsgJGkgPD0gJHRvcC0xOyAkaSsrKSB7CisJCQkJbmV4dCBpZiAoQHN0dWZmIDw9ICRpIHx8ICRpIDwgMCk7CisJCQkJJGNob3NlblskaV0gPSAkY2hvb3NlOworCQkJfQorCQl9CisJCWxhc3QgaWYgKCRvcHRzLT57SU1NRURJQVRFfSB8fCAkbGluZSBlcSAnKicpOworCX0KKwlmb3IgKCRpID0gMDsgJGkgPCBAc3R1ZmY7ICRpKyspIHsKKwkJaWYgKCRjaG9zZW5bJGldKSB7CisJCQlwdXNoIEByZXR1cm4sICRzdHVmZlskaV07CisJCX0KKwl9CisJcmV0dXJuIEByZXR1cm47Cit9CisKK3N1YiBzaW5nbGV0b25fcHJvbXB0X2hlbHBfY21kIHsKKwlwcmludCBjb2xvcmVkICRoZWxwX2NvbG9yLCA8PFxFT0YgOworUHJvbXB0IGhlbHA6CisxICAgICAgICAgIC0gc2VsZWN0IGEgbnVtYmVyZWQgaXRlbQorZm9vICAgICAgICAtIHNlbGVjdCBpdGVtIGJhc2VkIG9uIHVuaXF1ZSBwcmVmaXgKKyAgICAgICAgICAgLSAoZW1wdHkpIHNlbGVjdCBub3RoaW5nCitFT0YKK30KKworc3ViIHByb21wdF9oZWxwX2NtZCB7CisJcHJpbnQgY29sb3JlZCAkaGVscF9jb2xvciwgPDxcRU9GIDsKK1Byb21wdCBoZWxwOgorMSAgICAgICAgICAtIHNlbGVjdCBhIHNpbmdsZSBpdGVtCiszLTUgICAgICAgIC0gc2VsZWN0IGEgcmFuZ2Ugb2YgaXRlbXMKKzItMyw2LTkgICAgLSBzZWxlY3QgbXVsdGlwbGUgcmFuZ2VzCitmb28gICAgICAgIC0gc2VsZWN0IGl0ZW0gYmFzZWQgb24gdW5pcXVlIHByZWZpeAorLS4uLiAgICAgICAtIHVuc2VsZWN0IHNwZWNpZmllZCBpdGVtcworKiAgICAgICAgICAtIGNob29zZSBhbGwgaXRlbXMKKyAgICAgICAgICAgLSAoZW1wdHkpIGZpbmlzaCBzZWxlY3RpbmcKK0VPRgorfQorCitzdWIgc3RhdHVzX2NtZCB7CisJbGlzdF9hbmRfY2hvb3NlKHsgTElTVF9PTkxZID0+IDEsIEhFQURFUiA9PiAkc3RhdHVzX2hlYWQgfSwKKwkJCWxpc3RfbW9kaWZpZWQoKSk7CisJcHJpbnQgIlxuIjsKK30KKworc3ViIHNheV9uX3BhdGhzIHsKKwlteSAkZGlkID0gc2hpZnQgQF87CisJbXkgJGNudCA9IHNjYWxhciBAXzsKKwlwcmludCAiJGRpZCAiOworCWlmICgxIDwgJGNudCkgeworCQlwcmludCAiJGNudCBwYXRoc1xuIjsKKwl9CisJZWxzZSB7CisJCXByaW50ICJvbmUgcGF0aFxuIjsKKwl9Cit9CisKK3N1YiB1cGRhdGVfY21kIHsKKwlteSBAbW9kcyA9IGxpc3RfbW9kaWZpZWQoJ2ZpbGUtb25seScpOworCXJldHVybiBpZiAoIUBtb2RzKTsKKworCW15IEB1cGRhdGUgPSBsaXN0X2FuZF9jaG9vc2UoeyBQUk9NUFQgPT4gJ1VwZGF0ZScsCisJCQkJICAgICAgIEhFQURFUiA9PiAkc3RhdHVzX2hlYWQsIH0sCisJCQkJICAgICBAbW9kcyk7CisJaWYgKEB1cGRhdGUpIHsKKwkJc3lzdGVtKHF3KGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgLS0pLAorCQkgICAgICAgbWFwIHsgJF8tPntWQUxVRX0gfSBAdXBkYXRlKTsKKwkJc2F5X25fcGF0aHMoJ3VwZGF0ZWQnLCBAdXBkYXRlKTsKKwl9CisJcHJpbnQgIlxuIjsKK30KKworc3ViIHJldmVydF9jbWQgeworCW15IEB1cGRhdGUgPSBsaXN0X2FuZF9jaG9vc2UoeyBQUk9NUFQgPT4gJ1JldmVydCcsCisJCQkJICAgICAgIEhFQURFUiA9PiAkc3RhdHVzX2hlYWQsIH0sCisJCQkJICAgICBsaXN0X21vZGlmaWVkKCkpOworCWlmIChAdXBkYXRlKSB7CisJCWlmIChpc19pbml0aWFsX2NvbW1pdCgpKSB7CisJCQlzeXN0ZW0ocXcoZ2l0IHJtIC0tY2FjaGVkKSwKKwkJCQltYXAgeyAkXy0+e1ZBTFVFfSB9IEB1cGRhdGUpOworCQl9CisJCWVsc2UgeworCQkJbXkgQGxpbmVzID0gcnVuX2NtZF9waXBlKHF3KGdpdCBscy10cmVlIEhFQUQgLS0pLAorCQkJCQkJIG1hcCB7ICRfLT57VkFMVUV9IH0gQHVwZGF0ZSk7CisJCQlteSAkZmg7CisJCQlvcGVuICRmaCwgJ3wgZ2l0IHVwZGF0ZS1pbmRleCAtLWluZGV4LWluZm8nCisJCQkgICAgb3IgZGllOworCQkJZm9yIChAbGluZXMpIHsKKwkJCQlwcmludCAkZmggJF87CisJCQl9CisJCQljbG9zZSgkZmgpOworCQkJZm9yIChAdXBkYXRlKSB7CisJCQkJaWYgKCRfLT57SU5ERVhfQUREREVMfSAmJgorCQkJCSAgICAkXy0+e0lOREVYX0FERERFTH0gZXEgJ2NyZWF0ZScpIHsKKwkJCQkJc3lzdGVtKHF3KGdpdCB1cGRhdGUtaW5kZXggLS1mb3JjZS1yZW1vdmUgLS0pLAorCQkJCQkgICAgICAgJF8tPntWQUxVRX0pOworCQkJCQlwcmludCAibm90ZTogJF8tPntWQUxVRX0gaXMgdW50cmFja2VkIG5vdy5cbiI7CisJCQkJfQorCQkJfQorCQl9CisJCXJlZnJlc2goKTsKKwkJc2F5X25fcGF0aHMoJ3JldmVydGVkJywgQHVwZGF0ZSk7CisJfQorCXByaW50ICJcbiI7Cit9CisKK3N1YiBhZGRfdW50cmFja2VkX2NtZCB7CisJbXkgQGFkZCA9IGxpc3RfYW5kX2Nob29zZSh7IFBST01QVCA9PiAnQWRkIHVudHJhY2tlZCcgfSwKKwkJCQkgIGxpc3RfdW50cmFja2VkKCkpOworCWlmIChAYWRkKSB7CisJCXN5c3RlbShxdyhnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tKSwgQGFkZCk7CisJCXNheV9uX3BhdGhzKCdhZGRlZCcsIEBhZGQpOworCX0KKwlwcmludCAiXG4iOworfQorCitzdWIgcGFyc2VfZGlmZiB7CisJbXkgKCRwYXRoKSA9IEBfOworCW15IEBkaWZmID0gcnVuX2NtZF9waXBlKHF3KGdpdCBkaWZmLWZpbGVzIC1wIC0tKSwgJHBhdGgpOworCW15IEBjb2xvcmVkID0gKCk7CisJaWYgKCRkaWZmX3VzZV9jb2xvcikgeworCQlAY29sb3JlZCA9IHJ1bl9jbWRfcGlwZShxdyhnaXQgZGlmZi1maWxlcyAtcCAtLWNvbG9yIC0tKSwgJHBhdGgpOworCX0KKwlteSAoQGh1bmspID0geyBURVhUID0+IFtdLCBESVNQTEFZID0+IFtdIH07CisKKwlmb3IgKG15ICRpID0gMDsgJGkgPCBAZGlmZjsgJGkrKykgeworCQlpZiAoJGRpZmZbJGldID1+IC9eQEAgLykgeworCQkJcHVzaCBAaHVuaywgeyBURVhUID0+IFtdLCBESVNQTEFZID0+IFtdIH07CisJCX0KKwkJcHVzaCBAeyRodW5rWy0xXXtURVhUfX0sICRkaWZmWyRpXTsKKwkJcHVzaCBAeyRodW5rWy0xXXtESVNQTEFZfX0sCisJCQkoJGRpZmZfdXNlX2NvbG9yID8gJGNvbG9yZWRbJGldIDogJGRpZmZbJGldKTsKKwl9CisJcmV0dXJuIEBodW5rOworfQorCitzdWIgaHVua19zcGxpdHRhYmxlIHsKKwlteSAoJHRleHQpID0gQF87CisKKwlteSBAcyA9IHNwbGl0X2h1bmsoJHRleHQpOworCXJldHVybiAoMSA8IEBzKTsKK30KKworc3ViIHBhcnNlX2h1bmtfaGVhZGVyIHsKKwlteSAoJGxpbmUpID0gQF87CisJbXkgKCRvX29mcywgJG9fY250LCAkbl9vZnMsICRuX2NudCkgPQorCSAgICAkbGluZSA9fiAvXkBAIC0oXGQrKSg/OiwoXGQrKSk/IFwrKFxkKykoPzosKFxkKykpPyBAQC87CisJJG9fY250ID0gMSB1bmxlc3MgZGVmaW5lZCAkb19jbnQ7CisJJG5fY250ID0gMSB1bmxlc3MgZGVmaW5lZCAkbl9jbnQ7CisJcmV0dXJuICgkb19vZnMsICRvX2NudCwgJG5fb2ZzLCAkbl9jbnQpOworfQorCitzdWIgc3BsaXRfaHVuayB7CisJbXkgKCR0ZXh0LCAkZGlzcGxheSkgPSBAXzsKKwlteSBAc3BsaXQgPSAoKTsKKwlpZiAoIWRlZmluZWQgJGRpc3BsYXkpIHsKKwkJJGRpc3BsYXkgPSAkdGV4dDsKKwl9CisJIyBJZiB0aGVyZSBhcmUgY29udGV4dCBsaW5lcyBpbiB0aGUgbWlkZGxlIG9mIGEgaHVuaywKKwkjIGl0IGNhbiBiZSBzcGxpdCwgYnV0IHdlIHdvdWxkIG5lZWQgdG8gdGFrZSBjYXJlIG9mCisJIyBvdmVybGFwcyBsYXRlci4KKworCW15ICgkb19vZnMsIHVuZGVmLCAkbl9vZnMpID0gcGFyc2VfaHVua19oZWFkZXIoJHRleHQtPlswXSk7CisJbXkgJGh1bmtfc3RhcnQgPSAxOworCisgICAgICBPVVRFUjoKKwl3aGlsZSAoMSkgeworCQlteSAkbmV4dF9odW5rX3N0YXJ0ID0gdW5kZWY7CisJCW15ICRpID0gJGh1bmtfc3RhcnQgLSAxOworCQlteSAkdGhpcyA9ICt7CisJCQlURVhUID0+IFtdLAorCQkJRElTUExBWSA9PiBbXSwKKwkJCU9MRCA9PiAkb19vZnMsCisJCQlORVcgPT4gJG5fb2ZzLAorCQkJT0NOVCA9PiAwLAorCQkJTkNOVCA9PiAwLAorCQkJQUREREVMID0+IDAsCisJCQlQT1NUQ1RYID0+IDAsCisJCQlVU0UgPT4gdW5kZWYsCisJCX07CisKKwkJd2hpbGUgKCsrJGkgPCBAJHRleHQpIHsKKwkJCW15ICRsaW5lID0gJHRleHQtPlskaV07CisJCQlteSAkZGlzcGxheSA9ICRkaXNwbGF5LT5bJGldOworCQkJaWYgKCRsaW5lID1+IC9eIC8pIHsKKwkJCQlpZiAoJHRoaXMtPntBRERERUx9ICYmCisJCQkJICAgICFkZWZpbmVkICRuZXh0X2h1bmtfc3RhcnQpIHsKKwkJCQkJIyBXZSBoYXZlIHNlZW4gbGVhZGluZyBjb250ZXh0IGFuZAorCQkJCQkjIGFkZHMvZGVscyBhbmQgdGhlbiBoZXJlIGlzIGFub3RoZXIKKwkJCQkJIyBjb250ZXh0LCB3aGljaCBpcyB0cmFpbGluZyBmb3IgdGhpcworCQkJCQkjIHNwbGl0IGh1bmsgYW5kIGxlYWRpbmcgZm9yIHRoZSBuZXh0CisJCQkJCSMgb25lLgorCQkJCQkkbmV4dF9odW5rX3N0YXJ0ID0gJGk7CisJCQkJfQorCQkJCXB1c2ggQHskdGhpcy0+e1RFWFR9fSwgJGxpbmU7CisJCQkJcHVzaCBAeyR0aGlzLT57RElTUExBWX19LCAkZGlzcGxheTsKKwkJCQkkdGhpcy0+e09DTlR9Kys7CisJCQkJJHRoaXMtPntOQ05UfSsrOworCQkJCWlmIChkZWZpbmVkICRuZXh0X2h1bmtfc3RhcnQpIHsKKwkJCQkJJHRoaXMtPntQT1NUQ1RYfSsrOworCQkJCX0KKwkJCQluZXh0OworCQkJfQorCisJCQkjIGFkZC9kZWwKKwkJCWlmIChkZWZpbmVkICRuZXh0X2h1bmtfc3RhcnQpIHsKKwkJCQkjIFdlIGFyZSBkb25lIHdpdGggdGhlIGN1cnJlbnQgaHVuayBhbmQKKwkJCQkjIHRoaXMgaXMgdGhlIGZpcnN0IHJlYWwgY2hhbmdlIGZvciB0aGUKKwkJCQkjIG5leHQgc3BsaXQgb25lLgorCQkJCSRodW5rX3N0YXJ0ID0gJG5leHRfaHVua19zdGFydDsKKwkJCQkkb19vZnMgPSAkdGhpcy0+e09MRH0gKyAkdGhpcy0+e09DTlR9OworCQkJCSRuX29mcyA9ICR0aGlzLT57TkVXfSArICR0aGlzLT57TkNOVH07CisJCQkJJG9fb2ZzIC09ICR0aGlzLT57UE9TVENUWH07CisJCQkJJG5fb2ZzIC09ICR0aGlzLT57UE9TVENUWH07CisJCQkJcHVzaCBAc3BsaXQsICR0aGlzOworCQkJCXJlZG8gT1VURVI7CisJCQl9CisJCQlwdXNoIEB7JHRoaXMtPntURVhUfX0sICRsaW5lOworCQkJcHVzaCBAeyR0aGlzLT57RElTUExBWX19LCAkZGlzcGxheTsKKwkJCSR0aGlzLT57QUREREVMfSsrOworCQkJaWYgKCRsaW5lID1+IC9eLS8pIHsKKwkJCQkkdGhpcy0+e09DTlR9Kys7CisJCQl9CisJCQllbHNlIHsKKwkJCQkkdGhpcy0+e05DTlR9Kys7CisJCQl9CisJCX0KKworCQlwdXNoIEBzcGxpdCwgJHRoaXM7CisJCWxhc3Q7CisJfQorCisJZm9yIG15ICRodW5rIChAc3BsaXQpIHsKKwkJJG9fb2ZzID0gJGh1bmstPntPTER9OworCQkkbl9vZnMgPSAkaHVuay0+e05FV307CisJCW15ICRvX2NudCA9ICRodW5rLT57T0NOVH07CisJCW15ICRuX2NudCA9ICRodW5rLT57TkNOVH07CisKKwkJbXkgJGhlYWQgPSAoIkBAIC0kb19vZnMiIC4KKwkJCSAgICAoKCRvX2NudCAhPSAxKSA/ICIsJG9fY250IiA6ICcnKSAuCisJCQkgICAgIiArJG5fb2ZzIiAuCisJCQkgICAgKCgkbl9jbnQgIT0gMSkgPyAiLCRuX2NudCIgOiAnJykgLgorCQkJICAgICIgQEBcbiIpOworCQlteSAkZGlzcGxheV9oZWFkID0gJGhlYWQ7CisJCXVuc2hpZnQgQHskaHVuay0+e1RFWFR9fSwgJGhlYWQ7CisJCWlmICgkZGlmZl91c2VfY29sb3IpIHsKKwkJCSRkaXNwbGF5X2hlYWQgPSBjb2xvcmVkKCRmcmFnaW5mb19jb2xvciwgJGhlYWQpOworCQl9CisJCXVuc2hpZnQgQHskaHVuay0+e0RJU1BMQVl9fSwgJGRpc3BsYXlfaGVhZDsKKwl9CisJcmV0dXJuIEBzcGxpdDsKK30KKworc3ViIGZpbmRfbGFzdF9vX2N0eCB7CisJbXkgKCRpdCkgPSBAXzsKKwlteSAkdGV4dCA9ICRpdC0+e1RFWFR9OworCW15ICgkb19vZnMsICRvX2NudCkgPSBwYXJzZV9odW5rX2hlYWRlcigkdGV4dC0+WzBdKTsKKwlteSAkaSA9IEB7JHRleHR9OworCW15ICRsYXN0X29fY3R4ID0gJG9fb2ZzICsgJG9fY250OworCXdoaWxlICgwIDwgLS0kaSkgeworCQlteSAkbGluZSA9ICR0ZXh0LT5bJGldOworCQlpZiAoJGxpbmUgPX4gL14gLykgeworCQkJJGxhc3Rfb19jdHgtLTsKKwkJCW5leHQ7CisJCX0KKwkJbGFzdDsKKwl9CisJcmV0dXJuICRsYXN0X29fY3R4OworfQorCitzdWIgbWVyZ2VfaHVuayB7CisJbXkgKCRwcmV2LCAkdGhpcykgPSBAXzsKKwlteSAoJG8wX29mcywgJG8wX2NudCwgJG4wX29mcywgJG4wX2NudCkgPQorCSAgICBwYXJzZV9odW5rX2hlYWRlcigkcHJldi0+e1RFWFR9WzBdKTsKKwlteSAoJG8xX29mcywgJG8xX2NudCwgJG4xX29mcywgJG4xX2NudCkgPQorCSAgICBwYXJzZV9odW5rX2hlYWRlcigkdGhpcy0+e1RFWFR9WzBdKTsKKworCW15IChAbGluZSwgJGksICRvZnMsICRvX2NudCwgJG5fY250KTsKKwkkb2ZzID0gJG8wX29mczsKKwkkb19jbnQgPSAkbl9jbnQgPSAwOworCWZvciAoJGkgPSAxOyAkaSA8IEB7JHByZXYtPntURVhUfX07ICRpKyspIHsKKwkJbXkgJGxpbmUgPSAkcHJldi0+e1RFWFR9WyRpXTsKKwkJaWYgKCRsaW5lID1+IC9eXCsvKSB7CisJCQkkbl9jbnQrKzsKKwkJCXB1c2ggQGxpbmUsICRsaW5lOworCQkJbmV4dDsKKwkJfQorCisJCWxhc3QgaWYgKCRvMV9vZnMgPD0gJG9mcyk7CisKKwkJJG9fY250Kys7CisJCSRvZnMrKzsKKwkJaWYgKCRsaW5lID1+IC9eIC8pIHsKKwkJCSRuX2NudCsrOworCQl9CisJCXB1c2ggQGxpbmUsICRsaW5lOworCX0KKworCWZvciAoJGkgPSAxOyAkaSA8IEB7JHRoaXMtPntURVhUfX07ICRpKyspIHsKKwkJbXkgJGxpbmUgPSAkdGhpcy0+e1RFWFR9WyRpXTsKKwkJaWYgKCRsaW5lID1+IC9eXCsvKSB7CisJCQkkbl9jbnQrKzsKKwkJCXB1c2ggQGxpbmUsICRsaW5lOworCQkJbmV4dDsKKwkJfQorCQkkb2ZzKys7CisJCSRvX2NudCsrOworCQlpZiAoJGxpbmUgPX4gL14gLykgeworCQkJJG5fY250Kys7CisJCX0KKwkJcHVzaCBAbGluZSwgJGxpbmU7CisJfQorCW15ICRoZWFkID0gKCJAQCAtJG8wX29mcyIgLgorCQkgICAgKCgkb19jbnQgIT0gMSkgPyAiLCRvX2NudCIgOiAnJykgLgorCQkgICAgIiArJG4wX29mcyIgLgorCQkgICAgKCgkbl9jbnQgIT0gMSkgPyAiLCRuX2NudCIgOiAnJykgLgorCQkgICAgIiBAQFxuIik7CisJQHskcHJldi0+e1RFWFR9fSA9ICgkaGVhZCwgQGxpbmUpOworfQorCitzdWIgY29hbGVzY2Vfb3ZlcmxhcHBpbmdfaHVua3MgeworCW15IChAaW4pID0gQF87CisJbXkgQG91dCA9ICgpOworCisJbXkgKCRsYXN0X29fY3R4KTsKKworCWZvciAoZ3JlcCB7ICRfLT57VVNFfSB9IEBpbikgeworCQlteSAkdGV4dCA9ICRfLT57VEVYVH07CisJCW15ICgkb19vZnMpID0gcGFyc2VfaHVua19oZWFkZXIoJHRleHQtPlswXSk7CisJCWlmIChkZWZpbmVkICRsYXN0X29fY3R4ICYmCisJCSAgICAkb19vZnMgPD0gJGxhc3Rfb19jdHgpIHsKKwkJCW1lcmdlX2h1bmsoJG91dFstMV0sICRfKTsKKwkJfQorCQllbHNlIHsKKwkJCXB1c2ggQG91dCwgJF87CisJCX0KKwkJJGxhc3Rfb19jdHggPSBmaW5kX2xhc3Rfb19jdHgoJG91dFstMV0pOworCX0KKwlyZXR1cm4gQG91dDsKK30KKworc3ViIGhlbHBfcGF0Y2hfY21kIHsKKwlwcmludCBjb2xvcmVkICRoZWxwX2NvbG9yLCA8PFxFT0YgOworeSAtIHN0YWdlIHRoaXMgaHVuaworbiAtIGRvIG5vdCBzdGFnZSB0aGlzIGh1bmsKK2EgLSBzdGFnZSB0aGlzIGFuZCBhbGwgdGhlIHJlbWFpbmluZyBodW5rcyBpbiB0aGUgZmlsZQorZCAtIGRvIG5vdCBzdGFnZSB0aGlzIGh1bmsgbm9yIGFueSBvZiB0aGUgcmVtYWluaW5nIGh1bmtzIGluIHRoZSBmaWxlCitqIC0gbGVhdmUgdGhpcyBodW5rIHVuZGVjaWRlZCwgc2VlIG5leHQgdW5kZWNpZGVkIGh1bmsKK0ogLSBsZWF2ZSB0aGlzIGh1bmsgdW5kZWNpZGVkLCBzZWUgbmV4dCBodW5rCitrIC0gbGVhdmUgdGhpcyBodW5rIHVuZGVjaWRlZCwgc2VlIHByZXZpb3VzIHVuZGVjaWRlZCBodW5rCitLIC0gbGVhdmUgdGhpcyBodW5rIHVuZGVjaWRlZCwgc2VlIHByZXZpb3VzIGh1bmsKK3MgLSBzcGxpdCB0aGUgY3VycmVudCBodW5rIGludG8gc21hbGxlciBodW5rcworPyAtIHByaW50IGhlbHAKK0VPRgorfQorCitzdWIgcGF0Y2hfdXBkYXRlX2NtZCB7CisJbXkgQG1vZHMgPSBncmVwIHsgISgkXy0+e0JJTkFSWX0pIH0gbGlzdF9tb2RpZmllZCgnZmlsZS1vbmx5Jyk7CisJbXkgQHRoZW07CisKKwlpZiAoIUBtb2RzKSB7CisJCXByaW50IFNUREVSUiAiTm8gY2hhbmdlcy5cbiI7CisJCXJldHVybiAwOworCX0KKwlpZiAoJHBhdGNoX21vZGUpIHsKKwkJQHRoZW0gPSBAbW9kczsKKwl9CisJZWxzZSB7CisJCUB0aGVtID0gbGlzdF9hbmRfY2hvb3NlKHsgUFJPTVBUID0+ICdQYXRjaCB1cGRhdGUnLAorCQkJCQkgIEhFQURFUiA9PiAkc3RhdHVzX2hlYWQsIH0sCisJCQkJCUBtb2RzKTsKKwl9CisJZm9yIChAdGhlbSkgeworCQlwYXRjaF91cGRhdGVfZmlsZSgkXy0+e1ZBTFVFfSk7CisJfQorfQorCitzdWIgcGF0Y2hfdXBkYXRlX2ZpbGUgeworCW15ICgkaXgsICRudW0pOworCW15ICRwYXRoID0gc2hpZnQ7CisJbXkgKCRoZWFkLCBAaHVuaykgPSBwYXJzZV9kaWZmKCRwYXRoKTsKKwlmb3IgKEB7JGhlYWQtPntESVNQTEFZfX0pIHsKKwkJcHJpbnQ7CisJfQorCSRudW0gPSBzY2FsYXIgQGh1bms7CisJJGl4ID0gMDsKKworCXdoaWxlICgxKSB7CisJCW15ICgkcHJldiwgJG5leHQsICRvdGhlciwgJHVuZGVjaWRlZCwgJGkpOworCQkkb3RoZXIgPSAnJzsKKworCQlpZiAoJG51bSA8PSAkaXgpIHsKKwkJCSRpeCA9IDA7CisJCX0KKwkJZm9yICgkaSA9IDA7ICRpIDwgJGl4OyAkaSsrKSB7CisJCQlpZiAoIWRlZmluZWQgJGh1bmtbJGlde1VTRX0pIHsKKwkJCQkkcHJldiA9IDE7CisJCQkJJG90aGVyIC49ICcvayc7CisJCQkJbGFzdDsKKwkJCX0KKwkJfQorCQlpZiAoJGl4KSB7CisJCQkkb3RoZXIgLj0gJy9LJzsKKwkJfQorCQlmb3IgKCRpID0gJGl4ICsgMTsgJGkgPCAkbnVtOyAkaSsrKSB7CisJCQlpZiAoIWRlZmluZWQgJGh1bmtbJGlde1VTRX0pIHsKKwkJCQkkbmV4dCA9IDE7CisJCQkJJG90aGVyIC49ICcvaic7CisJCQkJbGFzdDsKKwkJCX0KKwkJfQorCQlpZiAoJGl4IDwgJG51bSAtIDEpIHsKKwkJCSRvdGhlciAuPSAnL0onOworCQl9CisJCWZvciAoJGkgPSAwOyAkaSA8ICRudW07ICRpKyspIHsKKwkJCWlmICghZGVmaW5lZCAkaHVua1skaV17VVNFfSkgeworCQkJCSR1bmRlY2lkZWQgPSAxOworCQkJCWxhc3Q7CisJCQl9CisJCX0KKwkJbGFzdCBpZiAoISR1bmRlY2lkZWQpOworCisJCWlmIChodW5rX3NwbGl0dGFibGUoJGh1bmtbJGl4XXtURVhUfSkpIHsKKwkJCSRvdGhlciAuPSAnL3MnOworCQl9CisJCWZvciAoQHskaHVua1skaXhde0RJU1BMQVl9fSkgeworCQkJcHJpbnQ7CisJCX0KKwkJcHJpbnQgY29sb3JlZCAkcHJvbXB0X2NvbG9yLCAiU3RhZ2UgdGhpcyBodW5rIFt5L24vYS9kJG90aGVyLz9dPyAiOworCQlteSAkbGluZSA9IDxTVERJTj47CisJCWlmICgkbGluZSkgeworCQkJaWYgKCRsaW5lID1+IC9eeS9pKSB7CisJCQkJJGh1bmtbJGl4XXtVU0V9ID0gMTsKKwkJCX0KKwkJCWVsc2lmICgkbGluZSA9fiAvXm4vaSkgeworCQkJCSRodW5rWyRpeF17VVNFfSA9IDA7CisJCQl9CisJCQllbHNpZiAoJGxpbmUgPX4gL15hL2kpIHsKKwkJCQl3aGlsZSAoJGl4IDwgJG51bSkgeworCQkJCQlpZiAoIWRlZmluZWQgJGh1bmtbJGl4XXtVU0V9KSB7CisJCQkJCQkkaHVua1skaXhde1VTRX0gPSAxOworCQkJCQl9CisJCQkJCSRpeCsrOworCQkJCX0KKwkJCQluZXh0OworCQkJfQorCQkJZWxzaWYgKCRsaW5lID1+IC9eZC9pKSB7CisJCQkJd2hpbGUgKCRpeCA8ICRudW0pIHsKKwkJCQkJaWYgKCFkZWZpbmVkICRodW5rWyRpeF17VVNFfSkgeworCQkJCQkJJGh1bmtbJGl4XXtVU0V9ID0gMDsKKwkJCQkJfQorCQkJCQkkaXgrKzsKKwkJCQl9CisJCQkJbmV4dDsKKwkJCX0KKwkJCWVsc2lmICgkb3RoZXIgPX4gL0svICYmICRsaW5lID1+IC9eSy8pIHsKKwkJCQkkaXgtLTsKKwkJCQluZXh0OworCQkJfQorCQkJZWxzaWYgKCRvdGhlciA9fiAvSi8gJiYgJGxpbmUgPX4gL15KLykgeworCQkJCSRpeCsrOworCQkJCW5leHQ7CisJCQl9CisJCQllbHNpZiAoJG90aGVyID1+IC9rLyAmJiAkbGluZSA9fiAvXmsvKSB7CisJCQkJd2hpbGUgKDEpIHsKKwkJCQkJJGl4LS07CisJCQkJCWxhc3QgaWYgKCEkaXggfHwKKwkJCQkJCSAhZGVmaW5lZCAkaHVua1skaXhde1VTRX0pOworCQkJCX0KKwkJCQluZXh0OworCQkJfQorCQkJZWxzaWYgKCRvdGhlciA9fiAvai8gJiYgJGxpbmUgPX4gL15qLykgeworCQkJCXdoaWxlICgxKSB7CisJCQkJCSRpeCsrOworCQkJCQlsYXN0IGlmICgkaXggPj0gJG51bSB8fAorCQkJCQkJICFkZWZpbmVkICRodW5rWyRpeF17VVNFfSk7CisJCQkJfQorCQkJCW5leHQ7CisJCQl9CisJCQllbHNpZiAoJG90aGVyID1+IC9zLyAmJiAkbGluZSA9fiAvXnMvKSB7CisJCQkJbXkgQHNwbGl0ID0gc3BsaXRfaHVuaygkaHVua1skaXhde1RFWFR9LCAkaHVua1skaXhde0RJU1BMQVl9KTsKKwkJCQlpZiAoMSA8IEBzcGxpdCkgeworCQkJCQlwcmludCBjb2xvcmVkICRoZWFkZXJfY29sb3IsICJTcGxpdCBpbnRvICIsCisJCQkJCXNjYWxhcihAc3BsaXQpLCAiIGh1bmtzLlxuIjsKKwkJCQl9CisJCQkJc3BsaWNlIChAaHVuaywgJGl4LCAxLCBAc3BsaXQpOworCQkJCSRudW0gPSBzY2FsYXIgQGh1bms7CisJCQkJbmV4dDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWhlbHBfcGF0Y2hfY21kKCRvdGhlcik7CisJCQkJbmV4dDsKKwkJCX0KKwkJCSMgc29mdCBpbmNyZW1lbnQKKwkJCXdoaWxlICgxKSB7CisJCQkJJGl4Kys7CisJCQkJbGFzdCBpZiAoJGl4ID49ICRudW0gfHwKKwkJCQkJICFkZWZpbmVkICRodW5rWyRpeF17VVNFfSk7CisJCQl9CisJCX0KKwl9CisKKwlAaHVuayA9IGNvYWxlc2NlX292ZXJsYXBwaW5nX2h1bmtzKEBodW5rKTsKKworCW15ICRuX2xvZnMgPSAwOworCW15IEByZXN1bHQgPSAoKTsKKwlmb3IgKEBodW5rKSB7CisJCW15ICR0ZXh0ID0gJF8tPntURVhUfTsKKwkJbXkgKCRvX29mcywgJG9fY250LCAkbl9vZnMsICRuX2NudCkgPQorCQkgICAgcGFyc2VfaHVua19oZWFkZXIoJHRleHQtPlswXSk7CisKKwkJaWYgKCEkXy0+e1VTRX0pIHsKKwkJCSMgV2Ugd291bGQgaGF2ZSBhZGRlZCAoJG5fY250IC0gJG9fY250KSBsaW5lcworCQkJIyB0byB0aGUgcG9zdGltYWdlIGlmIHdlIHdlcmUgdG8gdXNlIHRoaXMgaHVuaywKKwkJCSMgYnV0IHdlIGRpZG4ndC4gIFNvIHRoZSBsaW5lIG51bWJlciB0aGF0IHRoZSBuZXh0CisJCQkjIGh1bmsgc3RhcnRzIGF0IHdvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhhdCBtdWNoLgorCQkJJG5fbG9mcyAtPSAoJG5fY250IC0gJG9fY250KTsKKwkJCW5leHQ7CisJCX0KKwkJZWxzZSB7CisJCQlpZiAoJG5fbG9mcykgeworCQkJCSRuX29mcyArPSAkbl9sb2ZzOworCQkJCSR0ZXh0LT5bMF0gPSAoIkBAIC0kb19vZnMiIC4KKwkJCQkJICAgICAgKCgkb19jbnQgIT0gMSkKKwkJCQkJICAgICAgID8gIiwkb19jbnQiIDogJycpIC4KKwkJCQkJICAgICAgIiArJG5fb2ZzIiAuCisJCQkJCSAgICAgICgoJG5fY250ICE9IDEpCisJCQkJCSAgICAgICA/ICIsJG5fY250IiA6ICcnKSAuCisJCQkJCSAgICAgICIgQEBcbiIpOworCQkJfQorCQkJZm9yIChAJHRleHQpIHsKKwkJCQlwdXNoIEByZXN1bHQsICRfOworCQkJfQorCQl9CisJfQorCisJaWYgKEByZXN1bHQpIHsKKwkJbXkgJGZoOworCisJCW9wZW4gJGZoLCAnfCBnaXQgYXBwbHkgLS1jYWNoZWQnOworCQlmb3IgKEB7JGhlYWQtPntURVhUfX0sIEByZXN1bHQpIHsKKwkJCXByaW50ICRmaCAkXzsKKwkJfQorCQlpZiAoIWNsb3NlICRmaCkgeworCQkJZm9yIChAeyRoZWFkLT57VEVYVH19LCBAcmVzdWx0KSB7CisJCQkJcHJpbnQgU1RERVJSICRfOworCQkJfQorCQl9CisJCXJlZnJlc2goKTsKKwl9CisKKwlwcmludCAiXG4iOworfQorCitzdWIgZGlmZl9jbWQgeworCW15IEBtb2RzID0gbGlzdF9tb2RpZmllZCgnaW5kZXgtb25seScpOworCUBtb2RzID0gZ3JlcCB7ICEoJF8tPntCSU5BUll9KSB9IEBtb2RzOworCXJldHVybiBpZiAoIUBtb2RzKTsKKwlteSAoQHRoZW0pID0gbGlzdF9hbmRfY2hvb3NlKHsgUFJPTVBUID0+ICdSZXZpZXcgZGlmZicsCisJCQkJICAgICBJTU1FRElBVEUgPT4gMSwKKwkJCQkgICAgIEhFQURFUiA9PiAkc3RhdHVzX2hlYWQsIH0sCisJCQkJICAgQG1vZHMpOworCXJldHVybiBpZiAoIUB0aGVtKTsKKwlteSAkcmVmZXJlbmNlID0gaXNfaW5pdGlhbF9jb21taXQoKSA/IGdldF9lbXB0eV90cmVlKCkgOiAnSEVBRCc7CisJc3lzdGVtKHF3KGdpdCBkaWZmIC1wIC0tY2FjaGVkKSwgJHJlZmVyZW5jZSwgJy0tJywKKwkJbWFwIHsgJF8tPntWQUxVRX0gfSBAdGhlbSk7Cit9CisKK3N1YiBxdWl0X2NtZCB7CisJcHJpbnQgIkJ5ZS5cbiI7CisJZXhpdCgwKTsKK30KKworc3ViIGhlbHBfY21kIHsKKwlwcmludCBjb2xvcmVkICRoZWxwX2NvbG9yLCA8PFxFT0YgOworc3RhdHVzICAgICAgICAtIHNob3cgcGF0aHMgd2l0aCBjaGFuZ2VzCit1cGRhdGUgICAgICAgIC0gYWRkIHdvcmtpbmcgdHJlZSBzdGF0ZSB0byB0aGUgc3RhZ2VkIHNldCBvZiBjaGFuZ2VzCityZXZlcnQgICAgICAgIC0gcmV2ZXJ0IHN0YWdlZCBzZXQgb2YgY2hhbmdlcyBiYWNrIHRvIHRoZSBIRUFEIHZlcnNpb24KK3BhdGNoICAgICAgICAgLSBwaWNrIGh1bmtzIGFuZCB1cGRhdGUgc2VsZWN0aXZlbHkKK2RpZmYJICAgICAgLSB2aWV3IGRpZmYgYmV0d2VlbiBIRUFEIGFuZCBpbmRleAorYWRkIHVudHJhY2tlZCAtIGFkZCBjb250ZW50cyBvZiB1bnRyYWNrZWQgZmlsZXMgdG8gdGhlIHN0YWdlZCBzZXQgb2YgY2hhbmdlcworRU9GCit9CisKK3N1YiBwcm9jZXNzX2FyZ3MgeworCXJldHVybiB1bmxlc3MgQEFSR1Y7CisJbXkgJGFyZyA9IHNoaWZ0IEBBUkdWOworCWlmICgkYXJnIGVxICItLXBhdGNoIikgeworCQkkcGF0Y2hfbW9kZSA9IDE7CisJCSRhcmcgPSBzaGlmdCBAQVJHViBvciBkaWUgIm1pc3NpbmcgLS0iOworCQlkaWUgImludmFsaWQgYXJndW1lbnQgJGFyZywgZXhwZWN0aW5nIC0tIgorCQkgICAgdW5sZXNzICRhcmcgZXEgIi0tIjsKKwl9CisJZWxzaWYgKCRhcmcgbmUgIi0tIikgeworCQlkaWUgImludmFsaWQgYXJndW1lbnQgJGFyZywgZXhwZWN0aW5nIC0tIjsKKwl9Cit9CisKK3N1YiBtYWluX2xvb3AgeworCW15IEBjbWQgPSAoWyAnc3RhdHVzJywgXCZzdGF0dXNfY21kLCBdLAorCQkgICBbICd1cGRhdGUnLCBcJnVwZGF0ZV9jbWQsIF0sCisJCSAgIFsgJ3JldmVydCcsIFwmcmV2ZXJ0X2NtZCwgXSwKKwkJICAgWyAnYWRkIHVudHJhY2tlZCcsIFwmYWRkX3VudHJhY2tlZF9jbWQsIF0sCisJCSAgIFsgJ3BhdGNoJywgXCZwYXRjaF91cGRhdGVfY21kLCBdLAorCQkgICBbICdkaWZmJywgXCZkaWZmX2NtZCwgXSwKKwkJICAgWyAncXVpdCcsIFwmcXVpdF9jbWQsIF0sCisJCSAgIFsgJ2hlbHAnLCBcJmhlbHBfY21kLCBdLAorCSk7CisJd2hpbGUgKDEpIHsKKwkJbXkgKCRpdCkgPSBsaXN0X2FuZF9jaG9vc2UoeyBQUk9NUFQgPT4gJ1doYXQgbm93JywKKwkJCQkJICAgICBTSU5HTEVUT04gPT4gMSwKKwkJCQkJICAgICBMSVNUX0ZMQVQgPT4gNCwKKwkJCQkJICAgICBIRUFERVIgPT4gJyoqKiBDb21tYW5kcyAqKionLAorCQkJCQkgICAgIE9OX0VPRiA9PiBcJnF1aXRfY21kLAorCQkJCQkgICAgIElNTUVESUFURSA9PiAxIH0sIEBjbWQpOworCQlpZiAoJGl0KSB7CisJCQlldmFsIHsKKwkJCQkkaXQtPlsxXS0+KCk7CisJCQl9OworCQkJaWYgKCRAKSB7CisJCQkJcHJpbnQgIiRAIjsKKwkJCX0KKwkJfQorCX0KK30KKworcHJvY2Vzc19hcmdzKCk7CityZWZyZXNoKCk7CitpZiAoJHBhdGNoX21vZGUpIHsKKwlwYXRjaF91cGRhdGVfY21kKCk7Cit9CitlbHNlIHsKKwlzdGF0dXNfY21kKCk7CisJbWFpbl9sb29wKCk7Cit9CmRpZmYgLS1naXQgYS9naXQtYW0uc2ggYi9naXQtYW0uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWM1YzM4OAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1hbS5zaApAQCAtMCwwICsxLDUwNSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBKdW5pbyBDIEhhbWFubworCitTVUJESVJFQ1RPUllfT0s9WWVzCitPUFRJT05TX0tFRVBEQVNIREFTSD0KK09QVElPTlNfU1BFQz0iXAorZ2l0LWFtIFtvcHRpb25zXSA8bWJveD58PE1haWxkaXI+Li4uCitnaXQtYW0gW29wdGlvbnNdIC0tcmVzb2x2ZWQKK2dpdC1hbSBbb3B0aW9uc10gLS1za2lwCistLQorZCxkb3Rlc3Q9ICAgICAgIChyZW1vdmVkIC0tIGRvIG5vdCB1c2UpCitpLGludGVyYWN0aXZlICAgcnVuIGludGVyYWN0aXZlbHkKK2IsYmluYXJ5ICAgICAgICBwYXNzIC0tYWxsby1iaW5hcnktcmVwbGFjZW1lbnQgdG8gZ2l0LWFwcGx5CiszLDN3YXkgICAgICAgICAgYWxsb3cgZmFsbCBiYWNrIG9uIDN3YXkgbWVyZ2luZyBpZiBuZWVkZWQKK3Msc2lnbm9mZiAgICAgICBhZGQgYSBTaWduZWQtb2ZmLWJ5IGxpbmUgdG8gdGhlIGNvbW1pdCBtZXNzYWdlCit1LHV0ZjggICAgICAgICAgcmVjb2RlIGludG8gdXRmOCAoZGVmYXVsdCkKK2ssa2VlcCAgICAgICAgICBwYXNzIC1rIGZsYWcgdG8gZ2l0LW1haWxpbmZvCit3aGl0ZXNwYWNlPSAgICAgcGFzcyBpdCB0aHJvdWdoIGdpdC1hcHBseQorQz0gICAgICAgICAgICAgIHBhc3MgaXQgdGhyb3VnaCBnaXQtYXBwbHkKK3A9ICAgICAgICAgICAgICBwYXNzIGl0IHRocm91Z2ggZ2l0LWFwcGx5CityZXNvbHZlbXNnPSAgICAgb3ZlcnJpZGUgZXJyb3IgbWVzc2FnZSB3aGVuIHBhdGNoIGZhaWx1cmUgb2NjdXJzCityLHJlc29sdmVkICAgICAgdG8gYmUgdXNlZCBhZnRlciBhIHBhdGNoIGZhaWx1cmUKK3NraXAgICAgICAgICAgICBza2lwIHRoZSBjdXJyZW50IHBhdGNoCityZWJhc2luZyAgICAgICAgKGludGVybmFsIHVzZSBmb3IgZ2l0LXJlYmFzZSkiCisKKy4gZ2l0LXNoLXNldHVwCitwcmVmaXg9JChnaXQgcmV2LXBhcnNlIC0tc2hvdy1wcmVmaXgpCitzZXRfcmVmbG9nX2FjdGlvbiBhbQorcmVxdWlyZV93b3JrX3RyZWUKK2NkX3RvX3RvcGxldmVsCisKK2dpdCB2YXIgR0lUX0NPTU1JVFRFUl9JREVOVCA+L2Rldi9udWxsIHx8IGV4aXQKKworc3RvcF9oZXJlICgpIHsKKyAgICBlY2hvICIkMSIgPiIkZG90ZXN0L25leHQiCisgICAgZXhpdCAxCit9CisKK3N0b3BfaGVyZV91c2VyX3Jlc29sdmUgKCkgeworICAgIGlmIFsgLW4gIiRyZXNvbHZlbXNnIiBdOyB0aGVuCisJICAgIHByaW50ZiAnJXNcbicgIiRyZXNvbHZlbXNnIgorCSAgICBzdG9wX2hlcmUgJDEKKyAgICBmaQorICAgIGNtZGxpbmU9JChiYXNlbmFtZSAkMCkKKyAgICBpZiB0ZXN0ICcnICE9ICIkaW50ZXJhY3RpdmUiCisgICAgdGhlbgorICAgICAgICBjbWRsaW5lPSIkY21kbGluZSAtaSIKKyAgICBmaQorICAgIGlmIHRlc3QgJycgIT0gIiR0aHJlZXdheSIKKyAgICB0aGVuCisgICAgICAgIGNtZGxpbmU9IiRjbWRsaW5lIC0zIgorICAgIGZpCisgICAgZWNobyAiV2hlbiB5b3UgaGF2ZSByZXNvbHZlZCB0aGlzIHByb2JsZW0gcnVuIFwiJGNtZGxpbmUgLS1yZXNvbHZlZFwiLiIKKyAgICBlY2hvICJJZiB5b3Ugd291bGQgcHJlZmVyIHRvIHNraXAgdGhpcyBwYXRjaCwgaW5zdGVhZCBydW4gXCIkY21kbGluZSAtLXNraXBcIi4iCisKKyAgICBzdG9wX2hlcmUgJDEKK30KKworZ29fbmV4dCAoKSB7CisJcm0gLWYgIiRkb3Rlc3QvJG1zZ251bSIgIiRkb3Rlc3QvbXNnIiAiJGRvdGVzdC9tc2ctY2xlYW4iIFwKKwkJIiRkb3Rlc3QvcGF0Y2giICIkZG90ZXN0L2luZm8iCisJZWNobyAiJG5leHQiID4iJGRvdGVzdC9uZXh0IgorCXRoaXM9JG5leHQKK30KKworY2Fubm90X2ZhbGxiYWNrICgpIHsKKwllY2hvICIkMSIKKwllY2hvICJDYW5ub3QgZmFsbCBiYWNrIHRvIHRocmVlLXdheSBtZXJnZS4iCisJZXhpdCAxCit9CisKK2ZhbGxfYmFja18zd2F5ICgpIHsKKyAgICBPX09CSkVDVD1gY2QgIiRHSVRfT0JKRUNUX0RJUkVDVE9SWSIgJiYgcHdkYAorCisgICAgcm0gLWZyICIkZG90ZXN0Ii9wYXRjaC1tZXJnZS0qCisgICAgbWtkaXIgIiRkb3Rlc3QvcGF0Y2gtbWVyZ2UtdG1wLWRpciIKKworICAgICMgRmlyc3Qgc2VlIGlmIHRoZSBwYXRjaCByZWNvcmRzIHRoZSBpbmRleCBpbmZvIHRoYXQgd2UgY2FuIHVzZS4KKyAgICBnaXQgYXBwbHkgLS1idWlsZC1mYWtlLWFuY2VzdG9yICIkZG90ZXN0L3BhdGNoLW1lcmdlLXRtcC1pbmRleCIgXAorCSIkZG90ZXN0L3BhdGNoIiAmJgorICAgIEdJVF9JTkRFWF9GSUxFPSIkZG90ZXN0L3BhdGNoLW1lcmdlLXRtcC1pbmRleCIgXAorICAgIGdpdCB3cml0ZS10cmVlID4iJGRvdGVzdC9wYXRjaC1tZXJnZS1iYXNlKyIgfHwKKyAgICBjYW5ub3RfZmFsbGJhY2sgIlJlcG9zaXRvcnkgbGFja3MgbmVjZXNzYXJ5IGJsb2JzIHRvIGZhbGwgYmFjayBvbiAzLXdheSBtZXJnZS4iCisKKyAgICBlY2hvIFVzaW5nIGluZGV4IGluZm8gdG8gcmVjb25zdHJ1Y3QgYSBiYXNlIHRyZWUuLi4KKyAgICBpZiBHSVRfSU5ERVhfRklMRT0iJGRvdGVzdC9wYXRjaC1tZXJnZS10bXAtaW5kZXgiIFwKKwlnaXQgYXBwbHkgJGJpbmFyeSAtLWNhY2hlZCA8IiRkb3Rlc3QvcGF0Y2giCisgICAgdGhlbgorCW12ICIkZG90ZXN0L3BhdGNoLW1lcmdlLWJhc2UrIiAiJGRvdGVzdC9wYXRjaC1tZXJnZS1iYXNlIgorCW12ICIkZG90ZXN0L3BhdGNoLW1lcmdlLXRtcC1pbmRleCIgIiRkb3Rlc3QvcGF0Y2gtbWVyZ2UtaW5kZXgiCisgICAgZWxzZQorICAgICAgICBjYW5ub3RfZmFsbGJhY2sgIkRpZCB5b3UgaGFuZCBlZGl0IHlvdXIgcGF0Y2g/CitJdCBkb2VzIG5vdCBhcHBseSB0byBibG9icyByZWNvcmRlZCBpbiBpdHMgaW5kZXguIgorICAgIGZpCisKKyAgICB0ZXN0IC1mICIkZG90ZXN0L3BhdGNoLW1lcmdlLWluZGV4IiAmJgorICAgIGhpc190cmVlPSQoR0lUX0lOREVYX0ZJTEU9IiRkb3Rlc3QvcGF0Y2gtbWVyZ2UtaW5kZXgiIGdpdCB3cml0ZS10cmVlKSAmJgorICAgIG9yaWdfdHJlZT0kKGNhdCAiJGRvdGVzdC9wYXRjaC1tZXJnZS1iYXNlIikgJiYKKyAgICBybSAtZnIgIiRkb3Rlc3QiL3BhdGNoLW1lcmdlLSogfHwgZXhpdCAxCisKKyAgICBlY2hvIEZhbGxpbmcgYmFjayB0byBwYXRjaGluZyBiYXNlIGFuZCAzLXdheSBtZXJnZS4uLgorCisgICAgIyBUaGlzIGlzIG5vdCBzbyB3cm9uZy4gIERlcGVuZGluZyBvbiB3aGljaCBiYXNlIHdlIHBpY2tlZCwKKyAgICAjIG9yaWdfdHJlZSBtYXkgYmUgd2lsZGx5IGRpZmZlcmVudCBmcm9tIG91cnMsIGJ1dCBoaXNfdHJlZQorICAgICMgaGFzIHRoZSBzYW1lIHNldCBvZiB3aWxkbHkgZGlmZmVyZW50IGNoYW5nZXMgaW4gcGFydHMgdGhlCisgICAgIyBwYXRjaCBkaWQgbm90IHRvdWNoLCBzbyByZWN1cnNpdmUgZW5kcyB1cCBjYW5jZWxpbmcgdGhlbSwKKyAgICAjIHNheWluZyB0aGF0IHdlIHJldmVydGVkIGFsbCB0aG9zZSBjaGFuZ2VzLgorCisgICAgZXZhbCBHSVRIRUFEXyRoaXNfdHJlZT0nIiRTVUJKRUNUIicKKyAgICBleHBvcnQgR0lUSEVBRF8kaGlzX3RyZWUKKyAgICBnaXQtbWVyZ2UtcmVjdXJzaXZlICRvcmlnX3RyZWUgLS0gSEVBRCAkaGlzX3RyZWUgfHwgeworCSAgICBnaXQgcmVyZXJlCisJICAgIGVjaG8gRmFpbGVkIHRvIG1lcmdlIGluIHRoZSBjaGFuZ2VzLgorCSAgICBleGl0IDEKKyAgICB9CisgICAgdW5zZXQgR0lUSEVBRF8kaGlzX3RyZWUKK30KKworcmVyZWFkX3N1YmplY3QgKCkgeworCWdpdCBzdHJpcHNwYWNlIDwiJDEiIHwgc2VkIC1lIDFxCit9CisKK3ByZWM9NAorZG90ZXN0PSIuZG90ZXN0Igorc2lnbj0gdXRmOD10IGtlZXA9IHNraXA9IGludGVyYWN0aXZlPSByZXNvbHZlZD0gYmluYXJ5PSByZWJhc2luZz0KK3Jlc29sdmVtc2c9IHJlc3VtZT0KK2dpdF9hcHBseV9vcHQ9CisKK3doaWxlIHRlc3QgJCMgIT0gMAorZG8KKwljYXNlICIkMSIgaW4KKwktaXwtLWludGVyYWN0aXZlKQorCQlpbnRlcmFjdGl2ZT10IDs7CisJLWJ8LS1iaW5hcnkpCisJCWJpbmFyeT10IDs7CisJLTN8LS0zd2F5KQorCQl0aHJlZXdheT10IDs7CisJLXN8LS1zaWdub2ZmKQorCQlzaWduPXQgOzsKKwktdXwtLXV0ZjgpCisJCXV0Zjg9dCA7OyAjIHRoaXMgaXMgbm93IGRlZmF1bHQKKwktLW5vLXV0ZjgpCisJCXV0Zjg9IDs7CisJLWt8LS1rZWVwKQorCQlrZWVwPXQgOzsKKwktcnwtLXJlc29sdmVkKQorCQlyZXNvbHZlZD10IDs7CisJLS1za2lwKQorCQlza2lwPXQgOzsKKwktLXJlYmFzaW5nKQorCQlyZWJhc2luZz10IHRocmVld2F5PXQga2VlcD10IGJpbmFyeT10IDs7CisJLWR8LS1kb3Rlc3QpCisJCWRpZSAiLWQgb3B0aW9uIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuICBEbyBub3QgdXNlLiIKKwkJOzsKKwktLXJlc29sdmVtc2cpCisJCXNoaWZ0OyByZXNvbHZlbXNnPSQxIDs7CisJLS13aGl0ZXNwYWNlKQorCQlnaXRfYXBwbHlfb3B0PSIkZ2l0X2FwcGx5X29wdCAkMT0kMiI7IHNoaWZ0IDs7CisJLUN8LXApCisJCWdpdF9hcHBseV9vcHQ9IiRnaXRfYXBwbHlfb3B0ICQxJDIiOyBzaGlmdCA7OworCS0tKQorCQlzaGlmdDsgYnJlYWsgOzsKKwkqKQorCQl1c2FnZSA7OworCWVzYWMKKwlzaGlmdAorZG9uZQorCisjIElmIHRoZSBkb3Rlc3QgZGlyZWN0b3J5IGV4aXN0cywgYnV0IHdlIGhhdmUgZmluaXNoZWQgYXBwbHlpbmcgYWxsIHRoZQorIyBwYXRjaGVzIGluIHRoZW0sIGNsZWFyIGl0IG91dC4KK2lmIHRlc3QgLWQgIiRkb3Rlc3QiICYmCisgICBsYXN0PSQoY2F0ICIkZG90ZXN0L2xhc3QiKSAmJgorICAgbmV4dD0kKGNhdCAiJGRvdGVzdC9uZXh0IikgJiYKKyAgIHRlc3QgJCMgIT0gMCAmJgorICAgdGVzdCAiJG5leHQiIC1ndCAiJGxhc3QiCit0aGVuCisgICBybSAtZnIgIiRkb3Rlc3QiCitmaQorCitpZiB0ZXN0IC1kICIkZG90ZXN0IgordGhlbgorCWNhc2UgIiQjLCRza2lwJHJlc29sdmVkIiBpbgorCTAsKnQqKQorCQkjIEV4cGxpY2l0IHJlc3VtZSBjb21tYW5kIGFuZCB3ZSBkbyBub3QgaGF2ZSBmaWxlLCBzbworCQkjIHdlIGFyZSBoYXBweS4KKwkJOiA7OworCTAsKQorCQkjIE5vIGZpbGUgaW5wdXQgYnV0IHdpdGhvdXQgcmVzdW1lIHBhcmFtZXRlcnM7IGNhdGNoCisJCSMgdXNlciBlcnJvciB0byBmZWVkIHVzIGEgcGF0Y2ggZnJvbSBzdGFuZGFyZCBpbnB1dAorCQkjIHdoZW4gdGhlcmUgaXMgYWxyZWFkeSAkZG90ZXN0LiAgVGhpcyBpcyBzb21ld2hhdAorCQkjIHVucmVsaWFibGUgLS0gc3RkaW4gY291bGQgYmUgL2Rldi9udWxsIGZvciBleGFtcGxlCisJCSMgYW5kIHRoZSBjYWxsZXIgZGlkIG5vdCBpbnRlbmQgdG8gZmVlZCB1cyBhIHBhdGNoIGJ1dAorCQkjIHdhbnRlZCB0byBjb250aW51ZSB1bmF0dGVuZGVkLgorCQl0dHkgLXMKKwkJOzsKKwkqKQorCQlmYWxzZQorCQk7OworCWVzYWMgfHwKKwlkaWUgInByZXZpb3VzIGRvdGVzdCBkaXJlY3RvcnkgJGRvdGVzdCBzdGlsbCBleGlzdHMgYnV0IG1ib3ggZ2l2ZW4uIgorCXJlc3VtZT15ZXMKK2Vsc2UKKwkjIE1ha2Ugc3VyZSB3ZSBhcmUgbm90IGdpdmVuIC0tc2tpcCBub3IgLS1yZXNvbHZlZAorCXRlc3QgIiwkc2tpcCwkcmVzb2x2ZWQsIiA9ICwsLCB8fAorCQlkaWUgIlJlc29sdmUgb3BlcmF0aW9uIG5vdCBpbiBwcm9ncmVzcywgd2UgYXJlIG5vdCByZXN1bWluZy4iCisKKwkjIFN0YXJ0IGFmcmVzaC4KKwlta2RpciAtcCAiJGRvdGVzdCIgfHwgZXhpdAorCisJaWYgdGVzdCAtbiAiJHByZWZpeCIgJiYgdGVzdCAkIyAhPSAwCisJdGhlbgorCQlmaXJzdD10CisJCWZvciBhcmcKKwkJZG8KKwkJCXRlc3QgLW4gIiRmaXJzdCIgJiYgeworCQkJCXNldCB4CisJCQkJZmlyc3Q9CisJCQl9CisJCQljYXNlICIkYXJnIiBpbgorCQkJLyopCisJCQkJc2V0ICIkQCIgIiRhcmciIDs7CisJCQkqKQorCQkJCXNldCAiJEAiICIkcHJlZml4JGFyZyIgOzsKKwkJCWVzYWMKKwkJZG9uZQorCQlzaGlmdAorCWZpCisJZ2l0IG1haWxzcGxpdCAtZCIkcHJlYyIgLW8iJGRvdGVzdCIgLWIgLS0gIiRAIiA+ICIkZG90ZXN0L2xhc3QiIHx8ICB7CisJCXJtIC1mciAiJGRvdGVzdCIKKwkJZXhpdCAxCisJfQorCisJIyAtYiwgLXMsIC11LCAtayBhbmQgLS13aGl0ZXNwYWNlIGZsYWdzIGFyZSBrZXB0IGZvciB0aGUKKwkjIHJlc3VtaW5nIHNlc3Npb24gYWZ0ZXIgYSBwYXRjaCBmYWlsdXJlLgorCSMgLTMgYW5kIC1pIGNhbiBhbmQgbXVzdCBiZSBnaXZlbiB3aGVuIHJlc3VtaW5nLgorCWVjaG8gIiRiaW5hcnkiID4iJGRvdGVzdC9iaW5hcnkiCisJZWNobyAiICR3cyIgPiIkZG90ZXN0L3doaXRlc3BhY2UiCisJZWNobyAiJHNpZ24iID4iJGRvdGVzdC9zaWduIgorCWVjaG8gIiR1dGY4IiA+IiRkb3Rlc3QvdXRmOCIKKwllY2hvICIka2VlcCIgPiIkZG90ZXN0L2tlZXAiCisJZWNobyAxID4iJGRvdGVzdC9uZXh0IgorCWlmIHRlc3QgLW4gIiRyZWJhc2luZyIKKwl0aGVuCisJCTogPiIkZG90ZXN0L3JlYmFzaW5nIgorCWVsc2UKKwkJOiA+IiRkb3Rlc3QvYXBwbHlpbmciCisJZmkKK2ZpCisKK2Nhc2UgIiRyZXNvbHZlZCIgaW4KKycnKQorCWZpbGVzPSQoZ2l0IGRpZmYtaW5kZXggLS1jYWNoZWQgLS1uYW1lLW9ubHkgSEVBRCAtLSkgfHwgZXhpdAorCWlmIFsgIiRmaWxlcyIgXTsgdGhlbgorCSAgIGVjaG8gIkRpcnR5IGluZGV4OiBjYW5ub3QgYXBwbHkgcGF0Y2hlcyAoZGlydHk6ICRmaWxlcykiID4mMgorCSAgIGV4aXQgMQorCWZpCitlc2FjCisKK2lmIHRlc3QgIiQoY2F0ICIkZG90ZXN0L2JpbmFyeSIpIiA9IHQKK3RoZW4KKwliaW5hcnk9LS1hbGxvdy1iaW5hcnktcmVwbGFjZW1lbnQKK2ZpCitpZiB0ZXN0ICIkKGNhdCAiJGRvdGVzdC91dGY4IikiID0gdAordGhlbgorCXV0Zjg9LXUKK2Vsc2UKKwl1dGY4PS1uCitmaQoraWYgdGVzdCAiJChjYXQgIiRkb3Rlc3Qva2VlcCIpIiA9IHQKK3RoZW4KKwlrZWVwPS1rCitmaQord3M9YGNhdCAiJGRvdGVzdC93aGl0ZXNwYWNlImAKK2lmIHRlc3QgIiQoY2F0ICIkZG90ZXN0L3NpZ24iKSIgPSB0Cit0aGVuCisJU0lHTk9GRj1gZ2l0LXZhciBHSVRfQ09NTUlUVEVSX0lERU5UIHwgc2VkIC1lICcKKwkJCXMvPi4qLz4vCisJCQlzL14vU2lnbmVkLW9mZi1ieTogLycKKwkJYAorZWxzZQorCVNJR05PRkY9CitmaQorCitsYXN0PWBjYXQgIiRkb3Rlc3QvbGFzdCJgCit0aGlzPWBjYXQgIiRkb3Rlc3QvbmV4dCJgCitpZiB0ZXN0ICIkc2tpcCIgPSB0Cit0aGVuCisJZ2l0IHJlcmVyZSBjbGVhcgorCXRoaXM9YGV4cHIgIiR0aGlzIiArIDFgCisJcmVzdW1lPQorZmkKKworaWYgdGVzdCAiJHRoaXMiIC1ndCAiJGxhc3QiCit0aGVuCisJZWNobyBOb3RoaW5nIHRvIGRvLgorCXJtIC1mciAiJGRvdGVzdCIKKwlleGl0CitmaQorCit3aGlsZSB0ZXN0ICIkdGhpcyIgLWxlICIkbGFzdCIKK2RvCisJbXNnbnVtPWBwcmludGYgIiUwJHtwcmVjfWQiICR0aGlzYAorCW5leHQ9YGV4cHIgIiR0aGlzIiArIDFgCisJdGVzdCAtZiAiJGRvdGVzdC8kbXNnbnVtIiB8fCB7CisJCXJlc3VtZT0KKwkJZ29fbmV4dAorCQljb250aW51ZQorCX0KKworCSMgSWYgd2UgYXJlIG5vdCByZXN1bWluZywgcGFyc2UgYW5kIGV4dHJhY3QgdGhlIHBhdGNoIGluZm9ybWF0aW9uCisJIyBpbnRvIHNlcGFyYXRlIGZpbGVzOgorCSMgIC0gaW5mbyByZWNvcmRzIHRoZSBhdXRob3JzaGlwIGFuZCB0aXRsZQorCSMgIC0gbXNnIGlzIHRoZSByZXN0IG9mIGNvbW1pdCBsb2cgbWVzc2FnZQorCSMgIC0gcGF0Y2ggaXMgdGhlIHBhdGNoIGJvZHkuCisJIworCSMgV2hlbiB3ZSBhcmUgcmVzdW1pbmcsIHRoZXNlIGZpbGVzIGFyZSBlaXRoZXIgYWxyZWFkeSBwcmVwYXJlZAorCSMgYnkgdGhlIHVzZXIsIG9yIHRoZSB1c2VyIGNhbiB0ZWxsIHVzIHRvIGRvIHNvIGJ5IC0tcmVzb2x2ZWQgZmxhZy4KKwljYXNlICIkcmVzdW1lIiBpbgorCScnKQorCQlnaXQgbWFpbGluZm8gJGtlZXAgJHV0ZjggIiRkb3Rlc3QvbXNnIiAiJGRvdGVzdC9wYXRjaCIgXAorCQkJPCIkZG90ZXN0LyRtc2dudW0iID4iJGRvdGVzdC9pbmZvIiB8fAorCQkJc3RvcF9oZXJlICR0aGlzCisKKwkJIyBza2lwIHBpbmUncyBpbnRlcm5hbCBmb2xkZXIgZGF0YQorCQlncmVwICdeQXV0aG9yOiBNYWlsIFN5c3RlbSBJbnRlcm5hbCBEYXRhJCcgXAorCQkJPCIkZG90ZXN0Ii9pbmZvID4vZGV2L251bGwgJiYKKwkJCWdvX25leHQgJiYgY29udGludWUKKworCQl0ZXN0IC1zICRkb3Rlc3QvcGF0Y2ggfHwgeworCQkJZWNobyAiUGF0Y2ggaXMgZW1wdHkuICBXYXMgaXQgc3BsaXQgd3Jvbmc/IgorCQkJc3RvcF9oZXJlICR0aGlzCisJCX0KKwkJZ2l0IHN0cmlwc3BhY2UgPCAiJGRvdGVzdC9tc2ciID4gIiRkb3Rlc3QvbXNnLWNsZWFuIgorCQk7OworCWVzYWMKKworCUdJVF9BVVRIT1JfTkFNRT0iJChzZWQgLW4gJy9eQXV0aG9yLyBzL0F1dGhvcjogLy9wJyAiJGRvdGVzdC9pbmZvIikiCisJR0lUX0FVVEhPUl9FTUFJTD0iJChzZWQgLW4gJy9eRW1haWwvIHMvRW1haWw6IC8vcCcgIiRkb3Rlc3QvaW5mbyIpIgorCUdJVF9BVVRIT1JfREFURT0iJChzZWQgLW4gJy9eRGF0ZS8gcy9EYXRlOiAvL3AnICIkZG90ZXN0L2luZm8iKSIKKworCWlmIHRlc3QgLXogIiRHSVRfQVVUSE9SX0VNQUlMIgorCXRoZW4KKwkJZWNobyAiUGF0Y2ggZG9lcyBub3QgaGF2ZSBhIHZhbGlkIGUtbWFpbCBhZGRyZXNzLiIKKwkJc3RvcF9oZXJlICR0aGlzCisJZmkKKworCWV4cG9ydCBHSVRfQVVUSE9SX05BTUUgR0lUX0FVVEhPUl9FTUFJTCBHSVRfQVVUSE9SX0RBVEUKKworCVNVQkpFQ1Q9IiQoc2VkIC1uICcvXlN1YmplY3QvIHMvU3ViamVjdDogLy9wJyAiJGRvdGVzdC9pbmZvIikiCisJY2FzZSAiJGtlZXBfc3ViamVjdCIgaW4gLWspICBTVUJKRUNUPSJbUEFUQ0hdICRTVUJKRUNUIiA7OyBlc2FjCisKKwljYXNlICIkcmVzdW1lIiBpbgorCScnKQorCSAgICBpZiB0ZXN0ICcnICE9ICIkU0lHTk9GRiIKKwkgICAgdGhlbgorCQlMQVNUX1NJR05FRF9PRkZfQlk9YAorCQkgICAgc2VkIC1uZSAnL15TaWduZWQtb2ZmLWJ5OiAvcCcgXAorCQkgICAgIiRkb3Rlc3QvbXNnLWNsZWFuIiB8CisJCSAgICBzZWQgLW5lICckcCcKKwkJYAorCQlBRERfU0lHTk9GRj1gCisJCSAgICB0ZXN0ICIkTEFTVF9TSUdORURfT0ZGX0JZIiA9ICIkU0lHTk9GRiIgfHwgeworCQkgICAgdGVzdCAnJyA9ICIkTEFTVF9TSUdORURfT0ZGX0JZIiAmJiBlY2hvCisJCSAgICBlY2hvICIkU0lHTk9GRiIKKwkJfWAKKwkgICAgZWxzZQorCQlBRERfU0lHTk9GRj0KKwkgICAgZmkKKwkgICAgeworCQlwcmludGYgJyVzXG4nICIkU1VCSkVDVCIKKwkJaWYgdGVzdCAtcyAiJGRvdGVzdC9tc2ctY2xlYW4iCisJCXRoZW4KKwkJCWVjaG8KKwkJCWNhdCAiJGRvdGVzdC9tc2ctY2xlYW4iCisJCWZpCisJCWlmIHRlc3QgJycgIT0gIiRBRERfU0lHTk9GRiIKKwkJdGhlbgorCQkJZWNobyAiJEFERF9TSUdOT0ZGIgorCQlmaQorCSAgICB9ID4iJGRvdGVzdC9maW5hbC1jb21taXQiCisJICAgIDs7CisJKikKKwkJY2FzZSAiJHJlc29sdmVkJGludGVyYWN0aXZlIiBpbgorCQl0dCkKKwkJCSMgVGhpcyBpcyB1c2VkIG9ubHkgZm9yIGludGVyYWN0aXZlIHZpZXcgb3B0aW9uLgorCQkJZ2l0IGRpZmYtaW5kZXggLXAgLS1jYWNoZWQgSEVBRCAtLSA+IiRkb3Rlc3QvcGF0Y2giCisJCQk7OworCQllc2FjCisJZXNhYworCisJcmVzdW1lPQorCWlmIHRlc3QgIiRpbnRlcmFjdGl2ZSIgPSB0CisJdGhlbgorCSAgICB0ZXN0IC10IDAgfHwKKwkgICAgZGllICJjYW5ub3QgYmUgaW50ZXJhY3RpdmUgd2l0aG91dCBzdGRpbiBjb25uZWN0ZWQgdG8gYSB0ZXJtaW5hbC4iCisJICAgIGFjdGlvbj1hZ2FpbgorCSAgICB3aGlsZSB0ZXN0ICIkYWN0aW9uIiA9IGFnYWluCisJICAgIGRvCisJCWVjaG8gIkNvbW1pdCBCb2R5IGlzOiIKKwkJZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJCWNhdCAiJGRvdGVzdC9maW5hbC1jb21taXQiCisJCWVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCQlwcmludGYgIkFwcGx5PyBbeV1lcy9bbl1vL1tlXWRpdC9bdl1pZXcgcGF0Y2gvW2FdY2NlcHQgYWxsICIKKwkJcmVhZCByZXBseQorCQljYXNlICIkcmVwbHkiIGluCisJCVt5WV0qKSBhY3Rpb249eWVzIDs7CisJCVthQV0qKSBhY3Rpb249eWVzIGludGVyYWN0aXZlPSA7OworCQlbbk5dKikgYWN0aW9uPXNraXAgOzsKKwkJW2VFXSopIGdpdF9lZGl0b3IgIiRkb3Rlc3QvZmluYWwtY29tbWl0IgorCQkgICAgICAgU1VCSkVDVD0kKHJlcmVhZF9zdWJqZWN0ICIkZG90ZXN0L2ZpbmFsLWNvbW1pdCIpCisJCSAgICAgICBhY3Rpb249YWdhaW4gOzsKKwkJW3ZWXSopIGFjdGlvbj1hZ2FpbgorCQkgICAgICAgTEVTUz0tUyAke1BBR0VSOi1sZXNzfSAiJGRvdGVzdC9wYXRjaCIgOzsKKwkJKikgICAgIGFjdGlvbj1hZ2FpbiA7OworCQllc2FjCisJICAgIGRvbmUKKwllbHNlCisJICAgIGFjdGlvbj15ZXMKKwlmaQorCisJaWYgdGVzdCAkYWN0aW9uID0gc2tpcAorCXRoZW4KKwkJZ29fbmV4dAorCQljb250aW51ZQorCWZpCisKKwlpZiB0ZXN0IC14ICIkR0lUX0RJUiIvaG9va3MvYXBwbHlwYXRjaC1tc2cKKwl0aGVuCisJCSIkR0lUX0RJUiIvaG9va3MvYXBwbHlwYXRjaC1tc2cgIiRkb3Rlc3QvZmluYWwtY29tbWl0IiB8fAorCQlzdG9wX2hlcmUgJHRoaXMKKwlmaQorCisJcHJpbnRmICdBcHBseWluZyAlc1xuJyAiJFNVQkpFQ1QiCisKKwljYXNlICIkcmVzb2x2ZWQiIGluCisJJycpCisJCWdpdCBhcHBseSAkZ2l0X2FwcGx5X29wdCAkYmluYXJ5IC0taW5kZXggIiRkb3Rlc3QvcGF0Y2giCisJCWFwcGx5X3N0YXR1cz0kPworCQk7OworCXQpCisJCSMgUmVzb2x2ZWQgbWVhbnMgdGhlIHVzZXIgZGlkIGFsbCB0aGUgaGFyZCB3b3JrLCBhbmQKKwkJIyB3ZSBkbyBub3QgaGF2ZSB0byBkbyBhbnkgcGF0Y2ggYXBwbGljYXRpb24uICBKdXN0CisJCSMgdHJ1c3Qgd2hhdCB0aGUgdXNlciBoYXMgaW4gdGhlIGluZGV4IGZpbGUgYW5kIHRoZQorCQkjIHdvcmtpbmcgdHJlZS4KKwkJcmVzb2x2ZWQ9CisJCWdpdCBkaWZmLWluZGV4IC0tcXVpZXQgLS1jYWNoZWQgSEVBRCAtLSAmJiB7CisJCQllY2hvICJObyBjaGFuZ2VzIC0gZGlkIHlvdSBmb3JnZXQgdG8gdXNlICdnaXQgYWRkJz8iCisJCQlzdG9wX2hlcmVfdXNlcl9yZXNvbHZlICR0aGlzCisJCX0KKwkJdW5tZXJnZWQ9JChnaXQgbHMtZmlsZXMgLXUpCisJCWlmIHRlc3QgLW4gIiR1bm1lcmdlZCIKKwkJdGhlbgorCQkJZWNobyAiWW91IHN0aWxsIGhhdmUgdW5tZXJnZWQgcGF0aHMgaW4geW91ciBpbmRleCIKKwkJCWVjaG8gImRpZCB5b3UgZm9yZ2V0IHRvIHVzZSAnZ2l0IGFkZCc/IgorCQkJc3RvcF9oZXJlX3VzZXJfcmVzb2x2ZSAkdGhpcworCQlmaQorCQlhcHBseV9zdGF0dXM9MAorCQlnaXQgcmVyZXJlCisJCTs7CisJZXNhYworCisJaWYgdGVzdCAkYXBwbHlfc3RhdHVzID0gMSAmJiB0ZXN0ICIkdGhyZWV3YXkiID0gdAorCXRoZW4KKwkJaWYgKGZhbGxfYmFja18zd2F5KQorCQl0aGVuCisJCSAgICAjIEFwcGx5aW5nIHRoZSBwYXRjaCB0byBhbiBlYXJsaWVyIHRyZWUgYW5kIG1lcmdpbmcgdGhlCisJCSAgICAjIHJlc3VsdCBtYXkgaGF2ZSBwcm9kdWNlZCB0aGUgc2FtZSB0cmVlIGFzIG91cnMuCisJCSAgICBnaXQgZGlmZi1pbmRleCAtLXF1aWV0IC0tY2FjaGVkIEhFQUQgLS0gJiYgeworCQkJZWNobyBObyBjaGFuZ2VzIC0tIFBhdGNoIGFscmVhZHkgYXBwbGllZC4KKwkJCWdvX25leHQKKwkJCWNvbnRpbnVlCisJCSAgICB9CisJCSAgICAjIGNsZWFyIGFwcGx5X3N0YXR1cyAtLSB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBtZXJnZWQuCisJCSAgICBhcHBseV9zdGF0dXM9MAorCQlmaQorCWZpCisJaWYgdGVzdCAkYXBwbHlfc3RhdHVzICE9IDAKKwl0aGVuCisJCWVjaG8gUGF0Y2ggZmFpbGVkIGF0ICRtc2dudW0uCisJCXN0b3BfaGVyZV91c2VyX3Jlc29sdmUgJHRoaXMKKwlmaQorCisJaWYgdGVzdCAteCAiJEdJVF9ESVIiL2hvb2tzL3ByZS1hcHBseXBhdGNoCisJdGhlbgorCQkiJEdJVF9ESVIiL2hvb2tzL3ByZS1hcHBseXBhdGNoIHx8IHN0b3BfaGVyZSAkdGhpcworCWZpCisKKwl0cmVlPSQoZ2l0IHdyaXRlLXRyZWUpICYmCisJcGFyZW50PSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSAmJgorCWNvbW1pdD0kKGdpdCBjb21taXQtdHJlZSAkdHJlZSAtcCAkcGFyZW50IDwiJGRvdGVzdC9maW5hbC1jb21taXQiKSAmJgorCWdpdCB1cGRhdGUtcmVmIC1tICIkR0lUX1JFRkxPR19BQ1RJT046ICRTVUJKRUNUIiBIRUFEICRjb21taXQgJHBhcmVudCB8fAorCXN0b3BfaGVyZSAkdGhpcworCisJaWYgdGVzdCAteCAiJEdJVF9ESVIiL2hvb2tzL3Bvc3QtYXBwbHlwYXRjaAorCXRoZW4KKwkJIiRHSVRfRElSIi9ob29rcy9wb3N0LWFwcGx5cGF0Y2gKKwlmaQorCisJZ29fbmV4dAorZG9uZQorCitnaXQgZ2MgLS1hdXRvCisKK3JtIC1mciAiJGRvdGVzdCIKZGlmZiAtLWdpdCBhL2dpdC1hcmNoaW1wb3J0LnBlcmwgYi9naXQtYXJjaGltcG9ydC5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlhN2E5MDYKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtYXJjaGltcG9ydC5wZXJsCkBAIC0wLDAgKzEsMTEzMyBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisjCisjIFRoaXMgdG9vbCBpcyBjb3B5cmlnaHQgKGMpIDIwMDUsIE1hcnRpbiBMYW5naG9mZi4KKyMgSXQgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdudSBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgorIworIyBUaGUgYmFzaWMgaWRlYSBpcyB0byB3YWxrIHRoZSBvdXRwdXQgb2YgdGxhIGFicm93c2UsCisjIGZldGNoIHRoZSBjaGFuZ2VzZXRzIGFuZCBhcHBseSB0aGVtLgorIworCis9aGVhZDEgSW52b2NhdGlvbgorCisgICAgZ2l0LWFyY2hpbXBvcnQgWyAtaCBdIFsgLXYgXSBbIC1vIF0gWyAtYSBdIFsgLWYgXSBbIC1UIF0KKwlbIC1EIGRlcHRoXSBbIC10IHRlbXBkaXIgXSA8YXJjaGl2ZT4vPGJyYW5jaD4gWyA8YXJjaGl2ZT4vPGJyYW5jaD4gXQorCitJbXBvcnRzIGEgcHJvamVjdCBmcm9tIG9uZSBvciBtb3JlIEFyY2ggcmVwb3NpdG9yaWVzLiBJdCB3aWxsIGZvbGxvdyBicmFuY2hlcworYW5kIHJlcG9zaXRvcmllcyB3aXRoaW4gdGhlIG5hbWVzcGFjZXMgZGVmaW5lZCBieSB0aGUgPGFyY2hpdmUvYnJhbmNoPgorcGFyYW1ldGVycyBzdXBwbGllZC4gSWYgaXQgY2Fubm90IGZpbmQgdGhlIHJlbW90ZSBicmFuY2ggYSBtZXJnZSBjb21lcyBmcm9tCitpdCB3aWxsIGp1c3QgaW1wb3J0IGl0IGFzIGEgcmVndWxhciBjb21taXQuIElmIGl0IGNhbiBmaW5kIGl0LCBpdCB3aWxsIG1hcmsgaXQKK2FzIGEgbWVyZ2Ugd2hlbmV2ZXIgcG9zc2libGUuCisKK1NlZSBtYW4gKDEpIGdpdC1hcmNoaW1wb3J0IGZvciBtb3JlIGRldGFpbHMuCisKKz1oZWFkMSBUT0RPCisKKyAtIGNyZWF0ZSB0YWcgb2JqZWN0cyBpbnN0ZWFkIG9mIHJlZiB0YWdzCisgLSBhdWRpdCBzaGVsbC1lc2NhcGluZyBvZiBmaWxlbmFtZXMKKyAtIGhpZGUgb3VyIHByaXZhdGUgdGFncyBzb21ld2hlcmUgc21hcnRlcgorIC0gZmluZCBhIHdheSB0byBtYWtlICJjYXQgKnBhdGNoZXMgfCBwYXRjaCIgc2FmZSBldmVuIHdoZW4gcGF0Y2hmaWxlcyBhcmUgbWlzc2luZyBuZXdsaW5lcworIC0gc29ydCBhbmQgYXBwbHkgcGF0Y2hlcyBieSBncmFwaGluZyBhbmNlc3RyeSByZWxhdGlvbnMgaW5zdGVhZCBvZiBqdXN0CisgICByZWx5aW5nIGluIGRhdGVzIHN1cHBsaWVkIGluIHRoZSBjaGFuZ2VzZXQgaXRzZWxmLgorICAgdGxhIGFuY2VzdHJ5LWdyYXBoIC1tIGNvdWxkIGJlIGhlbHBmdWwgaGVyZS4uLgorCis9aGVhZDEgRGV2ZWwgdHJpY2tzCisKK0FkZCBwcmludCBpbiBmcm9udCBvZiB0aGUgc2hlbGwgY29tbWFuZHMgaW52b2tlZCB2aWEgYmFja3RpY2tzLgorCis9aGVhZDEgRGV2ZWwgTm90ZXMKKworVGhlcmUgYXJlIHNldmVyYWwgcGxhY2VzIHdoZXJlIEFyY2ggYW5kIGdpdCB0ZXJtaW5vbG9neSBhcmUgaW50ZXJtaXhlZAorYW5kIHBvdGVudGlhbGx5IGNvbmZ1c2VkLgorCitUaGUgbm90aW9uIG9mIGEgImJyYW5jaCIgaW4gZ2l0IGlzIGFwcHJveGltYXRlbHkgZXF1aXZhbGVudCB0bworYSAiYXJjaGl2ZS9jYXRlZ29yeS0tYnJhbmNoLS12ZXJzaW9uIiBpbiBBcmNoLiAgQWxzbywgaXQgc2hvdWxkIGJlIG5vdGVkCit0aGF0IHRoZSAiLS1icmFuY2giIHBvcnRpb24gb2YgImFyY2hpdmUvY2F0ZWdvcnktLWJyYW5jaC0tdmVyc2lvbiIgaXMgcmVhbGx5CitvcHRpb25hbCBpbiBBcmNoIGFsdGhvdWdoIG5vdCBtYW55IHBlb3BsZSAobm9yIHRvb2xzISkgc2VlbSB0byBrbm93IHRoaXMuCitUaGlzIG1lYW5zIHRoYXQgImFyY2hpdmUvY2F0ZWdvcnktLXZlcnNpb24iIGlzIGFsc28gYSB2YWxpZCAiYnJhbmNoIgoraW4gZ2l0IHRlcm1zLgorCitXZSBhbHdheXMgcmVmZXIgdG8gQXJjaCBuYW1lcyBieSB0aGVpciBmdWxseSBxdWFsaWZpZWQgdmFyaWFudCAod2hpY2gKK21lYW5zIHRoZSAiYXJjaGl2ZSIgbmFtZSBpcyBwcmVmaXhlZC4KKworRm9yIHBlb3BsZSB1bmZhbWlsaWFyIHdpdGggQXJjaCwgYW4gImFyY2hpdmUiIGlzIHRoZSB0ZXJtIGZvciAicmVwb3NpdG9yeSIsCithbmQgY2FuIGNvbnRhaW4gbXVsdGlwbGUsIHVucmVsYXRlZCBicmFuY2hlcy4KKworPWN1dAorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIEdldG9wdDo6U3RkOwordXNlIEZpbGU6OlRlbXAgcXcodGVtcGRpcik7Cit1c2UgRmlsZTo6UGF0aCBxdyhta3BhdGggcm10cmVlKTsKK3VzZSBGaWxlOjpCYXNlbmFtZSBxdyhiYXNlbmFtZSBkaXJuYW1lKTsKK3VzZSBEYXRhOjpEdW1wZXIgcXcvIER1bXBlciAvOwordXNlIElQQzo6T3BlbjI7CisKKyRTSUd7J1BJUEUnfT0iSUdOT1JFIjsKKyRFTlZ7J1RaJ309IlVUQyI7CisKK215ICRnaXRfZGlyID0gJEVOVnsiR0lUX0RJUiJ9IHx8ICIuZ2l0IjsKKyRFTlZ7IkdJVF9ESVIifSA9ICRnaXRfZGlyOworbXkgJHB0YWdfZGlyID0gIiRnaXRfZGlyL2FyY2hpbXBvcnQvdGFncyI7CisKK291cigkb3B0X2gsJG9wdF9mLCRvcHRfdiwkb3B0X1QsJG9wdF90LCRvcHRfRCwkb3B0X2EsJG9wdF9vKTsKKworc3ViIHVzYWdlKCkgeworICAgIHByaW50IFNUREVSUiA8PEVORDsKK1VzYWdlOiAke1xiYXNlbmFtZSAkMH0gICAgICMgZmV0Y2gvdXBkYXRlIEdJVCBmcm9tIEFyY2gKKyAgICAgICBbIC1oIF0gWyAtdiBdIFsgLW8gXSBbIC1hIF0gWyAtZiBdIFsgLVQgXSBbIC1EIGRlcHRoIF0gWyAtdCB0ZW1wZGlyIF0KKyAgICAgICByZXBvc2l0b3J5L2FyY2gtYnJhbmNoIFsgcmVwb3NpdG9yeS9hcmNoLWJyYW5jaF0gLi4uCitFTkQKKyAgICBleGl0KDEpOworfQorCitnZXRvcHRzKCJmVGh2YXQ6RDoiKSBvciB1c2FnZSgpOwordXNhZ2UgaWYgJG9wdF9oOworCitAQVJHViA+PSAxIG9yIHVzYWdlKCk7CisjICRhcmNoX2JyYW5jaGVzOgorIyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGtleXM6CisjICAgPTEgLSBBcmNoIHZlcnNpb24gLyBnaXQgJ2JyYW5jaCcgZGV0ZWN0ZWQgdmlhIGFicm93c2Ugb24gYSBsaW1pdAorIyAgID4xIC0gQXJjaCB2ZXJzaW9uIC8gZ2l0ICdicmFuY2gnIG9mIGFuIGF1eGlsaWFyeSBicmFuY2ggd2UndmUgbWVyZ2VkCitteSAlYXJjaF9icmFuY2hlcyA9IG1hcCB7IG15ICRicmFuY2ggPSAkXzsgJGJyYW5jaCA9fiBzLzpbXjpdKiQvLzsgJGJyYW5jaCA9PiAxIH0gQEFSR1Y7CisKKyMgJGJyYW5jaF9uYW1lX21hcDoKKyMgbWFwcyBhcmNoIGJyYW5jaGVzIHRvIGdpdCBicmFuY2ggbmFtZXMKK215ICVicmFuY2hfbmFtZV9tYXAgPSBtYXAgeyBtL14oLiopOihbXjpdKikkLzsgJDEgPT4gJDIgfSBncmVwIHsgbS86LyB9IEBBUkdWOworCiskRU5WeydUTVBESVInfSA9ICRvcHRfdCBpZiAkb3B0X3Q7ICMgJEVOVntUTVBESVJ9IHdpbGwgYWZmZWN0IHRlbXBkaXIoKSBjYWxsczoKK215ICR0bXAgPSB0ZW1wZGlyKCdnaXQtYXJjaGltcG9ydC1YWFhYWFgnLCBUTVBESVIgPT4gMSwgQ0xFQU5VUCA9PiAxKTsKKyRvcHRfdiAmJiBwcmludCAiKyBVc2luZyAkdG1wIGFzIHRlbXBvcmFyeSBkaXJlY3RvcnlcbiI7CisKK3VubGVzcyAoLWQgJGdpdF9kaXIpIHsgIyBpbml0aWFsIGltcG9ydCBuZWVkcyBlbXB0eSBkaXJlY3RvcnkKKyAgICBvcGVuZGlyIERJUiwgJy4nIG9yIGRpZSAiVW5hYmxlIHRvIG9wZW4gY3VycmVudCBkaXJlY3Rvcnk6ICQhXG4iOworICAgIHdoaWxlIChteSAkZW50cnkgPSByZWFkZGlyIERJUikgeworICAgICAgICAkZW50cnkgPX4gL15cLlwuPyQvIG9yCisgICAgICAgICAgICBkaWUgIkluaXRpYWwgaW1wb3J0IG5lZWRzIGFuIGVtcHR5IGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuXG4iCisgICAgfQorICAgIGNsb3NlZGlyIERJUgorfQorCitteSAkZGVmYXVsdF9hcmNoaXZlOwkJIyBkZWZhdWx0IEFyY2ggYXJjaGl2ZQorbXkgJXJlYWNoYWJsZSA9ICgpOyAgICAgICAgICAgICAjIEFyY2ggcmVwb3NpdG9yaWVzIHdlIGNhbiBhY2Nlc3MKK215ICV1bnJlYWNoYWJsZSA9ICgpOyAgICAgICAgICAgIyBBcmNoIHJlcG9zaXRvcmllcyB3ZSBjYW4ndCBhY2Nlc3MgOjwKK215IEBwc2V0cyAgPSAoKTsgICAgICAgICAgICAgICAgIyB0aGUgY29sbGVjdGlvbgorbXkgJXBzZXRzICA9ICgpOyAgICAgICAgICAgICAgICAjIHRoZSBjb2xsZWN0aW9uLCBieSBuYW1lCitteSAlc3RhdHMgID0gKAkJCSMgVHJhY2sgd2hpY2ggc3RyYXRlZ3kgd2UgdXNlZCB0byBpbXBvcnQ6CisJZ2V0X3RhZyA9PiAwLCByZXBsYXkgPT4gMCwgZ2V0X25ldyA9PiAwLCBnZXRfZGVsdGEgPT4gMCwKKyAgICAgICAgc2ltcGxlX2NoYW5nZXNldCA9PiAwLCBpbXBvcnRfb3JfdGFnID0+IDAKKyk7CisKK215ICVycHRhZ3MgPSAoKTsgICAgICAgICAgICAgICAgIyBteSByZXZlcnNlIHByaXZhdGUgdGFncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRvIG1hcCBhIFNIQTEgdG8gYSBjb21taXRpZAorbXkgJFRMQSA9ICRFTlZ7J0FSQ0hfQ0xJRU5UJ30gfHwgJ3RsYSc7CisKK3N1YiBkb19hYnJvd3NlIHsKKyAgICBteSAkc3RhZ2UgPSBzaGlmdDsKKyAgICB3aGlsZSAobXkgKCRsaW1pdCwgJGxldmVsKSA9IGVhY2ggJWFyY2hfYnJhbmNoZXMpIHsKKyAgICAgICAgbmV4dCB1bmxlc3MgJGxldmVsID09ICRzdGFnZTsKKworCW9wZW4gQUJST1dTRSwgIiRUTEEgYWJyb3dzZSAtZmtEIC0tbWVyZ2VzICRsaW1pdCB8IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBkaWUgIlByb2JsZW1zIHdpdGggdGxhIGFicm93c2U6ICQhIjsKKworICAgICAgICBteSAlcHMgICAgICAgID0gKCk7ICAgICAgICAgIyB0aGUgY3VycmVudCBvbmUKKyAgICAgICAgbXkgJGxhc3RzZWVuICA9ICcnOworCisgICAgICAgIHdoaWxlICg8QUJST1dTRT4pIHsKKyAgICAgICAgICAgIGNob21wOworCisgICAgICAgICAgICAjIGZpcnN0IHJlY29yZCBwYWRkZWQgdyA4IHNwYWNlcworICAgICAgICAgICAgaWYgKHMvXlxzezh9XGIvLykgeworICAgICAgICAgICAgICAgIG15ICgkaWQsICR0eXBlKSA9IHNwbGl0KG0vXHMrLywgJF8sIDIpOworCisgICAgICAgICAgICAgICAgbXkgJWxhc3RfcHM7CisgICAgICAgICAgICAgICAgIyBzdG9yZSB0aGUgcmVjb3JkIHdlIGp1c3QgY2FwdHVyZWQKKyAgICAgICAgICAgICAgICBpZiAoJXBzICYmICFleGlzdHMgJHBzZXRzeyAkcHN7aWR9IH0pIHsKKyAgICAgICAgICAgICAgICAgICAgJWxhc3RfcHMgPSAlcHM7ICMgYnJlYWsgcmVmZXJlbmNlcworICAgICAgICAgICAgICAgICAgICBwdXNoIChAcHNldHMsIFwlbGFzdF9wcyk7CisgICAgICAgICAgICAgICAgICAgICRwc2V0c3sgJGxhc3RfcHN7aWR9IH0gPSBcJWxhc3RfcHM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbXkgJGJyYW5jaCA9IGV4dHJhY3RfdmVyc2lvbm5hbWUoJGlkKTsKKyAgICAgICAgICAgICAgICAlcHMgPSAoIGlkID0+ICRpZCwgYnJhbmNoID0+ICRicmFuY2ggKTsKKyAgICAgICAgICAgICAgICBpZiAoJWxhc3RfcHMgJiYgKCRsYXN0X3Bze2JyYW5jaH0gZXEgJGJyYW5jaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgJHBze3BhcmVudF9pZH0gPSAkbGFzdF9wc3tpZH07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgJGFyY2hfYnJhbmNoZXN7JGJyYW5jaH0gPSAxOworICAgICAgICAgICAgICAgICRsYXN0c2VlbiA9ICdpZCc7CisKKyAgICAgICAgICAgICAgICAjIGRlYWwgd2l0aCB0eXBlcyAoc2hvdWxkIHdvcmsgd2l0aCBiYXogb3IgdGxhKToKKyAgICAgICAgICAgICAgICBpZiAoJHR5cGUgPX4gbS9cKC4qY2hhbmdlc2V0XCkvKSB7CisgICAgICAgICAgICAgICAgICAgICRwc3t0eXBlfSA9ICdzJzsKKyAgICAgICAgICAgICAgICB9IGVsc2lmICgkdHlwZSA9fiAvXCguKmltcG9ydFwpLykgeworICAgICAgICAgICAgICAgICAgICAkcHN7dHlwZX0gPSAnaSc7CisgICAgICAgICAgICAgICAgfSBlbHNpZiAoJHR5cGUgPX4gbS9cKHRhZy4qPyhcUytcQFxTKykuKj9cKS8pIHsKKyAgICAgICAgICAgICAgICAgICAgJHBze3R5cGV9ID0gJ3QnOworICAgICAgICAgICAgICAgICAgICAjIHJlYWQgd2hpY2ggcmV2aXNpb24gd2UndmUgdGFnZ2VkIHdoZW4gd2UgcGFyc2UgdGhlIGxvZworICAgICAgICAgICAgICAgICAgICAkcHN7dGFnfSAgPSAkMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3YXJuICJVbmtub3duIHR5cGUgJHR5cGUiOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICRhcmNoX2JyYW5jaGVzeyRicmFuY2h9ID0gMTsKKyAgICAgICAgICAgICAgICAkbGFzdHNlZW4gPSAnaWQnOworICAgICAgICAgICAgfSBlbHNpZiAocy9eXHN7MTB9Ly8pIHsKKyAgICAgICAgICAgICAgICAjIDEwIGxlYWRpbmcgc3BhY2VzIG9yIG1vcmUKKyAgICAgICAgICAgICAgICAjIGluZGljYXRlIGNvbW1pdCBtZXRhZGF0YQorCisgICAgICAgICAgICAgICAgIyBkYXRlCisgICAgICAgICAgICAgICAgaWYgKCRsYXN0c2VlbiBlcSAnaWQnICYmIG0vXihcZHs0fS1cZFxkLVxkXGQgXGRcZDpcZFxkOlxkXGQpLyl7CisgICAgICAgICAgICAgICAgICAgICRwc3tkYXRlfSAgID0gJDE7CisgICAgICAgICAgICAgICAgICAgICRsYXN0c2VlbiA9ICdkYXRlJzsKKyAgICAgICAgICAgICAgICB9IGVsc2lmICgkXyBlcSAnbWVyZ2VzIGluOicpIHsKKyAgICAgICAgICAgICAgICAgICAgJHBze21lcmdlc30gPSBbXTsKKyAgICAgICAgICAgICAgICAgICAgJGxhc3RzZWVuID0gJ21lcmdlcyc7CisgICAgICAgICAgICAgICAgfSBlbHNpZiAoJGxhc3RzZWVuIGVxICdtZXJnZXMnICYmIHMvXlxzezJ9Ly8pIHsKKyAgICAgICAgICAgICAgICAgICAgbXkgJGlkID0gJF87CisgICAgICAgICAgICAgICAgICAgIHB1c2ggKEB7JHBze21lcmdlc319LCAkaWQpOworCisgICAgICAgICAgICAgICAgICAgICMgYWdncmVzc2l2ZSBicmFuY2ggZmluZGluZzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCRvcHRfRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbXkgJGJyYW5jaCA9IGV4dHJhY3RfdmVyc2lvbm5hbWUoJGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG15ICRyZXBvID0gZXh0cmFjdF9yZXBvbmFtZSgkYnJhbmNoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyY2hpdmVfcmVhY2hhYmxlKCRyZXBvKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGVmaW5lZCAkYXJjaF9icmFuY2hlc3skYnJhbmNofSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhcmNoX2JyYW5jaGVzeyRicmFuY2h9ID0gJHN0YWdlICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdhcm4gIm1vcmUgbWV0YWRhdGEgYWZ0ZXIgbWVyZ2VzIT86ICRfXG4iIHVubGVzcyAvXlxzKiQvOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICglcHMgJiYgIWV4aXN0cyAkcHNldHN7ICRwc3tpZH0gfSkgeworICAgICAgICAgICAgbXkgJXRlbXAgPSAlcHM7ICAgICAgICAgIyBicmVhayByZWZlcmVuY2VzCisgICAgICAgICAgICBpZiAoQHBzZXRzICYmICRwc2V0c1skI3BzZXRzXXticmFuY2h9IGVxICRwc3ticmFuY2h9KSB7CisgICAgICAgICAgICAgICAgJHRlbXB7cGFyZW50X2lkfSA9ICRwc2V0c1skI3BzZXRzXXtpZH07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoIChAcHNldHMsIFwldGVtcCk7CisgICAgICAgICAgICAkcHNldHN7ICR0ZW1we2lkfSB9ID0gXCV0ZW1wOworICAgICAgICB9CisKKyAgICAgICAgY2xvc2UgQUJST1dTRSBvciBkaWUgIiRUTEEgYWJyb3dzZSBmYWlsZWQgb24gJGxpbWl0XG4iOworICAgIH0KK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlbmQgZm9yZWFjaCAkcm9vdAorCitkb19hYnJvd3NlKDEpOworbXkgJGRlcHRoID0gMjsKKyRvcHRfRCB8fD0gMDsKK3doaWxlICgkZGVwdGggPD0gJG9wdF9EKSB7CisgICAgZG9fYWJyb3dzZSgkZGVwdGgpOworICAgICRkZXB0aCsrOworfQorCisjIyBPcmRlciBwYXRjaGVzIGJ5IHRpbWUKKyMgRklYTUUgc2VlIGlmIHdlIGNhbiBmaW5kIGEgbW9yZSBvcHRpbWFsIHdheSB0byBkbyB0aGlzIGJ5IGdyYXBoaW5nCisjIHRoZSBhbmNlc3RyeSBkYXRhIGFuZCB3YWxraW5nIGl0LCB0aGF0IHdheSB3ZSB3b24ndCBoYXZlIHRvIHJlbHkgb24KKyMgY2xpZW50LXN1cHBsaWVkIGRhdGVzCitAcHNldHMgPSBzb3J0IHskYS0+e2RhdGV9LiRiLT57aWR9IGNtcCAkYi0+e2RhdGV9LiRiLT57aWR9fSBAcHNldHM7CisKKyNwcmludCBEdW1wZXIgXEBwc2V0czsKKworIyMKKyMjIFRPRE8gY2xlYW51cCBpcnJlbGV2YW50IHBhdGNoZXMKKyMjICAgICAgYW5kIHB1dCBhbiBpbml0aWFsIGltcG9ydAorIyMgICAgICBvciBhIGZ1bGwgdGFnCitteSAkaW1wb3J0ID0gMDsKK3VubGVzcyAoLWQgJGdpdF9kaXIpIHsgIyBpbml0aWFsIGltcG9ydAorICAgIGlmICgkcHNldHNbMF17dHlwZX0gZXEgJ2knIHx8ICRwc2V0c1swXXt0eXBlfSBlcSAndCcpIHsKKyAgICAgICAgcHJpbnQgIlN0YXJ0aW5nIGltcG9ydCBmcm9tICRwc2V0c1swXXtpZH1cbiI7CisJYGdpdC1pbml0YDsKKwlkaWUgJCEgaWYgJD87CisJJGltcG9ydCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllICJOZWVkIHRvIHN0YXJ0IGZyb20gYW4gaW1wb3J0IG9yIGEgdGFnIC0tIGNhbm5vdCB1c2UgJHBzZXRzWzBde2lkfSI7CisgICAgfQorfSBlbHNlIHsgICAgIyBwcm9ncmVzc2luZyBhbiBpbXBvcnQKKyAgICAjIGxvYWQgdGhlIHJwdGFncworICAgIG9wZW5kaXIoRElSLCAkcHRhZ19kaXIpCisJfHwgZGllICJjYW4ndCBvcGVuZGlyOiAkISI7CisgICAgd2hpbGUgKG15ICRmaWxlID0gcmVhZGRpcihESVIpKSB7CisgICAgICAgICMgc2tpcCBub24taW50ZXJlc3RpbmctZmlsZXMKKyAgICAgICAgbmV4dCB1bmxlc3MgLWYgIiRwdGFnX2Rpci8kZmlsZSI7CisKKyAgICAgICAgIyBjb252ZXJ0IGZpcnN0ICctLScgdG8gJy8nIGZyb20gb2xkIGdpdC1hcmNoaW1wb3J0IHRvIHVzZQorICAgICAgICAjIGFzIGFuIGFyY2hpdmVuYW1lL2MtLWItLXYgcHJpdmF0ZSB0YWcKKyAgICAgICAgaWYgKCRmaWxlICF+IG0hLCEpIHsKKyAgICAgICAgICAgIG15ICRvbGRmaWxlID0gJGZpbGU7CisgICAgICAgICAgICAkZmlsZSA9fiBzIS0tISwhOworICAgICAgICAgICAgcHJpbnQgU1RERVJSICJjb252ZXJ0aW5nIG9sZCB0YWcgJG9sZGZpbGUgdG8gJGZpbGVcbiI7CisgICAgICAgICAgICByZW5hbWUoIiRwdGFnX2Rpci8kb2xkZmlsZSIsICIkcHRhZ19kaXIvJGZpbGUiKSBvciBkaWUgJCE7CisgICAgICAgIH0KKwlteSAkc2hhID0gcHRhZygkZmlsZSk7CisJY2hvbXAgJHNoYTsKKwkkcnB0YWdzeyRzaGF9ID0gJGZpbGU7CisgICAgfQorICAgIGNsb3NlZGlyIERJUjsKK30KKworIyBwcm9jZXNzIHBhdGNoc2V0cworIyBleHRyYWN0IHRoZSBBcmNoIHJlcG9zaXRvcnkgbmFtZSAoQXJjaCAiYXJjaGl2ZSIgaW4gQXJjaC1zcGVhaykKK3N1YiBleHRyYWN0X3JlcG9uYW1lIHsKKyAgICBteSAkZnFfY3ZiciA9IHNoaWZ0OyAjIGFyY2hpdmVuYW1lL1tbW1tjYXRlZ29yeV1icmFuY2hddmVyc2lvbl1yZXZpc2lvbl0KKyAgICByZXR1cm4gKHNwbGl0KC9cLy8sICRmcV9jdmJyKSlbMF07Cit9CisKK3N1YiBleHRyYWN0X3ZlcnNpb25uYW1lIHsKKyAgICBteSAkbmFtZSA9IHNoaWZ0OworICAgICRuYW1lID1+IHMvLS0oPzpwYXRjaHx2ZXJzaW9uKD86Zml4KT98YmFzZSktXGQrJC8vOworICAgIHJldHVybiAkbmFtZTsKK30KKworIyBjb252ZXJ0IGEgZnVsbHktcXVhbGlmaWVkIHJldmlzaW9uIG9yIHZlcnNpb24gdG8gYSB1bmlxdWUgZGlybmFtZToKKyMgICBub3JtYWxwZXJzb25AeWhidC5uZXQtMDUvbXBkLS11Y2xpbnV4LS0xLS1wYXRjaC0yCisjIGJlY29tZXM6IG5vcm1hbHBlcnNvbkB5aGJ0Lm5ldC0wNSxtcGQtLXVjbGludXgtLTEKKyMKKyMgdGhlIGdpdCBub3Rpb24gb2YgYSBicmFuY2ggaXMgY2xvc2VyIHRvCisjIGFyY2hpdmUvY2F0ZWdvcnktLWJyYW5jaC0tdmVyc2lvbiB0aGFuIGFyY2hpdmUvY2F0ZWdvcnktLWJyYW5jaCwgc28gd2UKKyMgdXNlIHRoaXMgdG8gY29udmVydCB0byBnaXQgYnJhbmNoIG5hbWVzLgorIyBBbHNvLCBrZWVwIGFyY2hpdmUgbmFtZXMgYnV0IHJlcGxhY2UgJy8nIHdpdGggJywnIHNpbmNlIGl0IHdvbid0IHJlcXVpcmUKKyMgc3ViZGlyZWN0b3JpZXMsIGFuZCBpcyBzYWZlciB0aGFuIHN3YXBwaW5nICctLScgd2hpY2ggY291bGQgY29uZnVzZQorIyByZXZlcnNlLW1hcHBpbmcgd2hlbiBkZWFsaW5nIHdpdGggYmFzdGFyZCBicmFuY2hlcyB0aGF0CisjIGFyZSBqdXN0IGFyY2hpdmUvY2F0ZWdvcnktLXZlcnNpb24gIChubyAtLWJyYW5jaCkKK3N1YiB0cmVlX2Rpcm5hbWUgeworICAgIG15ICRyZXZpc2lvbiA9IHNoaWZ0OworICAgIG15ICRuYW1lID0gZXh0cmFjdF92ZXJzaW9ubmFtZSgkcmV2aXNpb24pOworICAgICRuYW1lID1+IHMjLyMsIzsKKyAgICByZXR1cm4gJG5hbWU7Cit9CisKKyMgb2xkIHZlcnNpb25zIG9mIGdpdC1hcmNoaW1wb3J0IGp1c3QgdXNlIHRoZSA8Y2F0ZWdvcnktLWJyYW5jaD4gcGFydDoKK3N1YiBvbGRfc3R5bGVfYnJhbmNobmFtZSB7CisgICAgbXkgJGlkID0gc2hpZnQ7CisgICAgbXkgJHJldCA9IHNhZmVfcGlwZV9jYXB0dXJlKCRUTEEsJ3BhcnNlLXBhY2thZ2UtbmFtZScsJy1wJywkaWQpOworICAgIGNob21wICRyZXQ7CisgICAgcmV0dXJuICRyZXQ7Cit9CisKKypnaXRfZGVmYXVsdF9icmFuY2huYW1lID0gJG9wdF9vID8gKm9sZF9zdHlsZV9icmFuY2huYW1lIDogKnRyZWVfZGlybmFtZTsKKworIyByZXRyaWV2ZSBkZWZhdWx0IGFyY2hpdmUsIHNpbmNlICRicmFuY2hfbmFtZV9tYXAga2V5cyBtaWdodCBub3QgaW5jbHVkZSBpdAorc3ViIGdldF9kZWZhdWx0X2FyY2hpdmUgeworICAgIGlmICghZGVmaW5lZCAkZGVmYXVsdF9hcmNoaXZlKSB7CisgICAgICAgICRkZWZhdWx0X2FyY2hpdmUgPSBzYWZlX3BpcGVfY2FwdHVyZSgkVExBLCdteS1kZWZhdWx0LWFyY2hpdmUnKTsKKyAgICAgICAgY2hvbXAgJGRlZmF1bHRfYXJjaGl2ZTsKKyAgICB9CisgICAgcmV0dXJuICRkZWZhdWx0X2FyY2hpdmU7Cit9CisKK3N1YiBnaXRfYnJhbmNobmFtZSB7CisgICAgbXkgJHJldmlzaW9uID0gc2hpZnQ7CisgICAgbXkgJG5hbWUgPSBleHRyYWN0X3ZlcnNpb25uYW1lKCRyZXZpc2lvbik7CisKKyAgICBpZiAoZXhpc3RzICRicmFuY2hfbmFtZV9tYXB7JG5hbWV9KSB7CisJcmV0dXJuICRicmFuY2hfbmFtZV9tYXB7JG5hbWV9OworCisgICAgfSBlbHNpZiAoJG5hbWUgPX4gbSNeKFteL10qKS8oLiopJCMKKwkgICAgICYmICQxIGVxIGdldF9kZWZhdWx0X2FyY2hpdmUoKQorCSAgICAgJiYgZXhpc3RzICRicmFuY2hfbmFtZV9tYXB7JDJ9KSB7CisJIyB0aGUgbmFtZXMgZ2l2ZW4gaW4gdGhlIGNvbW1hbmQtbGluZSBsYWNrZWQgdGhlIGFyY2hpdmUuCisJcmV0dXJuICRicmFuY2hfbmFtZV9tYXB7JDJ9OworCisgICAgfSBlbHNlIHsKKwlyZXR1cm4gZ2l0X2RlZmF1bHRfYnJhbmNobmFtZSgkcmV2aXNpb24pOworICAgIH0KK30KKworc3ViIHByb2Nlc3NfcGF0Y2hzZXRfYWNjdXJhdGUgeworICAgIG15ICRwcyA9IHNoaWZ0OworCisgICAgIyBzd2l0Y2ggdG8gdGhhdCBicmFuY2ggaWYgd2UncmUgbm90IGFscmVhZHkgaW4gdGhhdCBicmFuY2g6CisgICAgaWYgKC1lICIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRwcy0+e2JyYW5jaH0iKSB7CisgICAgICAgc3lzdGVtKCdnaXQtY2hlY2tvdXQnLCctZicsJHBzLT57YnJhbmNofSkgPT0gMCBvciBkaWUgIiQhICQ/XG4iOworCisgICAgICAgIyByZW1vdmUgYW55IG9sZCBzdHVmZiB0aGF0IGdvdCBsZWZ0b3ZlcjoKKyAgICAgICBteSAkcm0gPSBzYWZlX3BpcGVfY2FwdHVyZSgnZ2l0LWxzLWZpbGVzJywnLS1vdGhlcnMnLCcteicpOworICAgICAgIHJtdHJlZShzcGxpdCgvXDAvLCRybSkpIGlmICRybTsKKyAgICB9CisKKyAgICAjIEFwcGx5IHRoZSBpbXBvcnQvY2hhbmdlc2V0L21lcmdlIGludG8gdGhlIHdvcmtpbmcgdHJlZQorICAgIG15ICRkaXIgPSBzeW5jX3RvX3BzKCRwcyk7CisgICAgIyByZWFkIHRoZSBuZXcgbG9nIGVudHJ5OgorICAgIG15IEBjb21taXRsb2cgPSBzYWZlX3BpcGVfY2FwdHVyZSgkVExBLCdjYXQtbG9nJywnLWQnLCRkaXIsJHBzLT57aWR9KTsKKyAgICBkaWUgIkVycm9yIGluIGNhdC1sb2c6ICQhIiBpZiAkPzsKKyAgICBjaG9tcCBAY29tbWl0bG9nOworCisgICAgIyBncmFiIHZhcmlhYmxlcyB3ZSB3YW50IGZyb20gdGhlIGxvZywgbmV3IGZpZWxkcyBnZXQgYWRkZWQgdG8gJHBzOgorICAgICMgKGF1dGhvciwgZGF0ZSwgZW1haWwsIHN1bW1hcnksIG1lc3NhZ2UgYm9keSAuLi4pCisgICAgcGFyc2Vsb2coJHBzLCBcQGNvbW1pdGxvZyk7CisKKyAgICBpZiAoJHBzLT57aWR9ID1+IC8tLWJhc2UtMCQvICYmICRwcy0+e2lkfSBuZSAkcHNldHNbMF17aWR9KSB7CisgICAgICAgICMgdGhpcyBzaG91bGQgd29yayB3aGVuIGltcG9ydGluZyBjb250aW51YXRpb25zCisgICAgICAgIGlmICgkcHMtPnt0YWd9ICYmIChteSAkYnJhbmNocG9pbnQgPSBldmFsIHsgcHRhZygkcHMtPnt0YWd9KSB9KSkgeworCisgICAgICAgICAgICAjIGZpbmQgd2hlcmUgd2UgYXJlIHN1cHBvc2VkIHRvIGJyYW5jaCBmcm9tCisJICAgIGlmICghIC1lICIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRwcy0+e2JyYW5jaH0iKSB7CisJCXN5c3RlbSgnZ2l0LWJyYW5jaCcsJHBzLT57YnJhbmNofSwkYnJhbmNocG9pbnQpID09IDAgb3IgZGllICIkISAkP1xuIjsKKworCQkjIFdlIHRydXN0IEFyY2ggd2l0aCB0aGUgZmFjdCB0aGF0IHRoaXMgaXMganVzdCBhIHRhZywKKwkJIyBhbmQgaXQgZG9lcyBub3QgYWZmZWN0IHRoZSBzdGF0ZSBvZiB0aGUgdHJlZSwgc28KKwkJIyB3ZSBqdXN0IHRhZyBhbmQgbW92ZSBvbi4gIElmIHRoZSB1c2VyIHJlYWxseSB3YW50cyB1cworCQkjIHRvIGNvbnNvbGlkYXRlIG1vcmUgYnJhbmNoZXMgaW50byBvbmUsIGRvbid0IHRhZyBiZWNhdXNlCisJCSMgdGhlIHRhZyBuYW1lIHdvdWxkIGJlIGFscmVhZHkgdGFrZW4uCisJCXRhZygkcHMtPntpZH0sICRicmFuY2hwb2ludCk7CisJCXB0YWcoJHBzLT57aWR9LCAkYnJhbmNocG9pbnQpOworCQlwcmludCAiICogVGFnZ2VkICRwcy0+e2lkfSBhdCAkYnJhbmNocG9pbnRcbiI7CisJICAgIH0KKwkgICAgc3lzdGVtKCdnaXQtY2hlY2tvdXQnLCctZicsJHBzLT57YnJhbmNofSkgPT0gMCBvciBkaWUgIiQhICQ/XG4iOworCisgICAgICAgICAgICAjIHJlbW92ZSBhbnkgb2xkIHN0dWZmIHRoYXQgZ290IGxlZnRvdmVyOgorICAgICAgICAgICAgbXkgJHJtID0gc2FmZV9waXBlX2NhcHR1cmUoJ2dpdC1scy1maWxlcycsJy0tb3RoZXJzJywnLXonKTsKKyAgICAgICAgICAgIHJtdHJlZShzcGxpdCgvXDAvLCRybSkpIGlmICRybTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2FybiAiVGFnZ2luZyBmcm9tIHVua25vd24gaWQgdW5zdXBwb3J0ZWRcbiIgaWYgJHBzLT57dGFnfTsKKyAgICAgICAgfQorICAgICAgICAjIGFsbG93IG11bHRpcGxlIGJhc2VzL2ltcG9ydHMgaGVyZSBzaW5jZSBBcmNoIHN1cHBvcnRzIGNoZXJyeS1waWNrcworICAgICAgICAjIGZyb20gdW5yZWxhdGVkIHRyZWVzCisgICAgfQorCisgICAgIyB1cGRhdGUgdGhlIGluZGV4IHdpdGggYWxsIHRoZSBjaGFuZ2VzIHdlIGdvdAorICAgIHN5c3RlbSgnZ2l0LWRpZmYtZmlsZXMgLS1uYW1lLW9ubHkgLXogfCAnLgorICAgICAgICAgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1yZW1vdmUgLXogLS1zdGRpbicpID09IDAgb3IgZGllICIkISAkP1xuIjsKKyAgICBzeXN0ZW0oJ2dpdC1scy1maWxlcyAtLW90aGVycyAteiB8ICcuCisgICAgICAgICAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAteiAtLXN0ZGluJykgPT0gMCBvciBkaWUgIiQhICQ/XG4iOworICAgIHJldHVybiAxOworfQorCisjIHRoZSBuYXRpdmUgY2hhbmdlc2V0IHByb2Nlc3Npbmcgc3RyYXRlZ3kuICBUaGlzIGlzIHZlcnkgZmFzdCwgYnV0CisjIGRvZXMgbm90IGhhbmRsZSBwZXJtaXNzaW9ucyBvciBhbnkgcmVuYW1lcyBpbnZvbHZpbmcgZGlyZWN0b3JpZXMKK3N1YiBwcm9jZXNzX3BhdGNoc2V0X2Zhc3QgeworICAgIG15ICRwcyA9IHNoaWZ0OworICAgICMKKyAgICAjIGNyZWF0ZSB0aGUgYnJhbmNoIGlmIG5lZWRlZAorICAgICMKKyAgICBpZiAoJHBzLT57dHlwZX0gZXEgJ2knICYmICEkaW1wb3J0KSB7CisgICAgICAgIGRpZSAiU2hvdWxkIG5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgJ0luaXRpYWwgaW1wb3J0JyBwZXIgR0lUIGltcG9ydDogJHBzLT57aWR9IjsKKyAgICB9CisKKyAgICB1bmxlc3MgKCRpbXBvcnQpIHsgIyBza2lwIGZvciBpbXBvcnQKKyAgICAgICAgaWYgKCAtZSAiJGdpdF9kaXIvcmVmcy9oZWFkcy8kcHMtPnticmFuY2h9IikgeworICAgICAgICAgICAgIyB3ZSBrbm93IGFib3V0IHRoaXMgYnJhbmNoCisgICAgICAgICAgICBzeXN0ZW0oJ2dpdC1jaGVja291dCcsJHBzLT57YnJhbmNofSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAjIG5ldyBicmFuY2ghIHdlIG5lZWQgdG8gdmVyaWZ5IGEgZmV3IHRoaW5ncworICAgICAgICAgICAgZGllICJCcmFuY2ggb24gYSBub24tdGFnISIgdW5sZXNzICRwcy0+e3R5cGV9IGVxICd0JzsKKyAgICAgICAgICAgIG15ICRicmFuY2hwb2ludCA9IHB0YWcoJHBzLT57dGFnfSk7CisgICAgICAgICAgICBkaWUgIlRhZ2dpbmcgZnJvbSB1bmtub3duIGlkIHVuc3VwcG9ydGVkOiAkcHMtPnt0YWd9IgorICAgICAgICAgICAgICAgIHVubGVzcyAkYnJhbmNocG9pbnQ7CisKKyAgICAgICAgICAgICMgZmluZCB3aGVyZSB3ZSBhcmUgc3VwcG9zZWQgdG8gYnJhbmNoIGZyb20KKwkgICAgaWYgKCEgLWUgIiRnaXRfZGlyL3JlZnMvaGVhZHMvJHBzLT57YnJhbmNofSIpIHsKKwkJc3lzdGVtKCdnaXQtYnJhbmNoJywkcHMtPnticmFuY2h9LCRicmFuY2hwb2ludCkgPT0gMCBvciBkaWUgIiQhICQ/XG4iOworCisJCSMgV2UgdHJ1c3QgQXJjaCB3aXRoIHRoZSBmYWN0IHRoYXQgdGhpcyBpcyBqdXN0IGEgdGFnLAorCQkjIGFuZCBpdCBkb2VzIG5vdCBhZmZlY3QgdGhlIHN0YXRlIG9mIHRoZSB0cmVlLCBzbworCQkjIHdlIGp1c3QgdGFnIGFuZCBtb3ZlIG9uLiAgSWYgdGhlIHVzZXIgcmVhbGx5IHdhbnRzIHVzCisJCSMgdG8gY29uc29saWRhdGUgbW9yZSBicmFuY2hlcyBpbnRvIG9uZSwgZG9uJ3QgdGFnIGJlY2F1c2UKKwkJIyB0aGUgdGFnIG5hbWUgd291bGQgYmUgYWxyZWFkeSB0YWtlbi4KKwkJdGFnKCRwcy0+e2lkfSwgJGJyYW5jaHBvaW50KTsKKwkJcHRhZygkcHMtPntpZH0sICRicmFuY2hwb2ludCk7CisJCXByaW50ICIgKiBUYWdnZWQgJHBzLT57aWR9IGF0ICRicmFuY2hwb2ludFxuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN5c3RlbSgnZ2l0LWNoZWNrb3V0JywkcHMtPnticmFuY2h9KSA9PSAwIG9yIGRpZSAiJCEgJD9cbiI7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBkaWUgJCEgaWYgJD87CisgICAgfQorCisgICAgIworICAgICMgQXBwbHkgdGhlIGltcG9ydC9jaGFuZ2VzZXQvbWVyZ2UgaW50byB0aGUgd29ya2luZyB0cmVlCisgICAgIworICAgIGlmICgkcHMtPnt0eXBlfSBlcSAnaScgfHwgJHBzLT57dHlwZX0gZXEgJ3QnKSB7CisgICAgICAgIGFwcGx5X2ltcG9ydCgkcHMpIG9yIGRpZSAkITsKKyAgICAgICAgJHN0YXRze2ltcG9ydF9vcl90YWd9Kys7CisgICAgICAgICRpbXBvcnQ9MDsKKyAgICB9IGVsc2lmICgkcHMtPnt0eXBlfSBlcSAncycpIHsKKyAgICAgICAgYXBwbHlfY3NldCgkcHMpOworICAgICAgICAkc3RhdHN7c2ltcGxlX2NoYW5nZXNldH0rKzsKKyAgICB9CisKKyAgICAjCisgICAgIyBwcmVwYXJlIHVwZGF0ZSBnaXQncyBpbmRleCwgYmFzZWQgb24gd2hhdCBhcmNoIGtub3dzCisgICAgIyBhYm91dCB0aGUgcHNldCwgcmVzb2x2ZSBwYXJlbnRzLCBldGMKKyAgICAjCisKKyAgICBteSBAY29tbWl0bG9nID0gc2FmZV9waXBlX2NhcHR1cmUoJFRMQSwnY2F0LWFyY2hpdmUtbG9nJywkcHMtPntpZH0pOworICAgIGRpZSAiRXJyb3IgaW4gY2F0LWFyY2hpdmUtbG9nOiAkISIgaWYgJD87CisKKyAgICBwYXJzZWxvZygkcHMsXEBjb21taXRsb2cpOworCisgICAgIyBpbXBvcnRzIGRvbid0IGdpdmUgdXMgZ29vZCBpbmZvCisgICAgIyBvbiBhZGRlZCBmaWxlcy4gU2hhbWUgb24gdGhlbQorICAgIGlmICgkcHMtPnt0eXBlfSBlcSAnaScgfHwgJHBzLT57dHlwZX0gZXEgJ3QnKSB7CisgICAgICAgIHN5c3RlbSgnZ2l0LWxzLWZpbGVzIC0tZGVsZXRlZCAteiB8ICcuCisgICAgICAgICAgICAgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1yZW1vdmUgLXogLS1zdGRpbicpID09IDAgb3IgZGllICIkISAkP1xuIjsKKyAgICAgICAgc3lzdGVtKCdnaXQtbHMtZmlsZXMgLS1vdGhlcnMgLXogfCAnLgorICAgICAgICAgICAgICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC16IC0tc3RkaW4nKSA9PSAwIG9yIGRpZSAiJCEgJD9cbiI7CisgICAgfQorCisgICAgIyBUT0RPOiBoYW5kbGUgcmVtb3ZlZF9kaXJlY3RvcmllcyBhbmQgcmVuYW1lZF9kaXJlY3RvcmllczoKKworICAgIGlmIChteSAkZGVsID0gJHBzLT57cmVtb3ZlZF9maWxlc30pIHsKKyAgICAgICAgdW5saW5rIEAkZGVsOworICAgICAgICB3aGlsZSAoQCRkZWwpIHsKKyAgICAgICAgICAgIG15IEBzbGljZSA9IHNwbGljZShAJGRlbCwgMCwgMTAwKTsKKyAgICAgICAgICAgIHN5c3RlbSgnZ2l0LXVwZGF0ZS1pbmRleCcsJy0tcmVtb3ZlJywnLS0nLEBzbGljZSkgPT0gMCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZSAiRXJyb3IgaW4gZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZTogJCEgJD9cbiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobXkgJHJlbiA9ICRwcy0+e3JlbmFtZWRfZmlsZXN9KSB7ICAgICAgICAgICAgICAgICMgcmVuYW1lZAorICAgICAgICBpZiAoQCRyZW4gJSAyKSB7CisgICAgICAgICAgICBkaWUgIk9kZCBudW1iZXIgb2YgZW50cmllcyBpbiByZW5hbWUhPyI7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoQCRyZW4pIHsKKyAgICAgICAgICAgIG15ICRmcm9tID0gc2hpZnQgQCRyZW47CisgICAgICAgICAgICBteSAkdG8gICA9IHNoaWZ0IEAkcmVuOworCisgICAgICAgICAgICB1bmxlc3MgKC1kIGRpcm5hbWUoJHRvKSkgeworICAgICAgICAgICAgICAgIG1rcGF0aChkaXJuYW1lKCR0bykpOyAjIHdpbGwgZGllIG9uIGVycgorICAgICAgICAgICAgfQorICAgICAgICAgICAgIyBwcmludCAibW92aW5nICRmcm9tICR0byI7CisgICAgICAgICAgICByZW5hbWUoJGZyb20sICR0bykgb3IgZGllICJFcnJvciByZW5hbWluZyAnJGZyb20nICckdG8nOiAkIVxuIjsKKyAgICAgICAgICAgIHN5c3RlbSgnZ2l0LXVwZGF0ZS1pbmRleCcsJy0tcmVtb3ZlJywnLS0nLCRmcm9tKSA9PSAwIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGllICJFcnJvciBpbiBnaXQtdXBkYXRlLWluZGV4IC0tcmVtb3ZlOiAkISAkP1xuIjsKKyAgICAgICAgICAgIHN5c3RlbSgnZ2l0LXVwZGF0ZS1pbmRleCcsJy0tYWRkJywnLS0nLCR0bykgPT0gMCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZSAiRXJyb3IgaW4gZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZDogJCEgJD9cbiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobXkgJGFkZCA9ICRwcy0+e25ld19maWxlc30pIHsKKyAgICAgICAgd2hpbGUgKEAkYWRkKSB7CisgICAgICAgICAgICBteSBAc2xpY2UgPSBzcGxpY2UoQCRhZGQsIDAsIDEwMCk7CisgICAgICAgICAgICBzeXN0ZW0oJ2dpdC11cGRhdGUtaW5kZXgnLCctLWFkZCcsJy0tJyxAc2xpY2UpID09IDAgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWUgIkVycm9yIGluIGdpdC11cGRhdGUtaW5kZXggLS1hZGQ6ICQhICQ/XG4iOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG15ICRtb2QgPSAkcHMtPnttb2RpZmllZF9maWxlc30pIHsKKyAgICAgICAgd2hpbGUgKEAkbW9kKSB7CisgICAgICAgICAgICBteSBAc2xpY2UgPSBzcGxpY2UoQCRtb2QsIDAsIDEwMCk7CisgICAgICAgICAgICBzeXN0ZW0oJ2dpdC11cGRhdGUtaW5kZXgnLCctLScsQHNsaWNlKSA9PSAwIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGllICJFcnJvciBpbiBnaXQtdXBkYXRlLWluZGV4OiAkISAkP1xuIjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsgIyB3ZSBzdWNjZXNzZnVsbHkgYXBwbGllZCB0aGUgY2hhbmdlc2V0Cit9CisKK2lmICgkb3B0X2YpIHsKKyAgICBwcmludCAiV2lsbCBpbXBvcnQgcGF0Y2hzZXRzIHVzaW5nIHRoZSBmYXN0IHN0cmF0ZWd5XG4iLAorICAgICAgICAgICAgIlJlbmFtZWQgZGlyZWN0b3JpZXMgYW5kIHBlcm1pc3Npb24gY2hhbmdlcyB3aWxsIGJlIG1pc3NlZFxuIjsKKyAgICAqcHJvY2Vzc19wYXRjaHNldCA9ICpwcm9jZXNzX3BhdGNoc2V0X2Zhc3Q7Cit9IGVsc2UgeworICAgIHByaW50ICJVc2luZyB0aGUgZGVmYXVsdCAoYWNjdXJhdGUpIGltcG9ydCBzdHJhdGVneS5cbiIsCisgICAgICAgICAgICAiVGhpbmdzIG1heSBiZSBhIGJpdCBzbG93XG4iOworICAgICpwcm9jZXNzX3BhdGNoc2V0ID0gKnByb2Nlc3NfcGF0Y2hzZXRfYWNjdXJhdGU7Cit9CisKK2ZvcmVhY2ggbXkgJHBzIChAcHNldHMpIHsKKyAgICAjIHByb2Nlc3MgcGF0Y2hzZXRzCisgICAgJHBzLT57YnJhbmNofSA9IGdpdF9icmFuY2huYW1lKCRwcy0+e2lkfSk7CisKKyAgICAjCisgICAgIyBlbnN1cmUgd2UgaGF2ZSBhIGNsZWFuIHN0YXRlCisgICAgIworICAgIGlmIChteSAkZGlydHkgPSBgZ2l0LWRpZmYtZmlsZXNgKSB7CisgICAgICAgIGRpZSAiVW5jbGVhbiB0cmVlIHdoZW4gYWJvdXQgdG8gcHJvY2VzcyAkcHMtPntpZH0gIiAuCisgICAgICAgICAgICAiIC0gZGlkIHdlIGZhaWwgdG8gY29tbWl0IGNsZWFubHkgYmVmb3JlP1xuJGRpcnR5IjsKKyAgICB9CisgICAgZGllICQhIGlmICQ/OworCisgICAgIworICAgICMgc2tpcCBjb21taXRzIGFscmVhZHkgaW4gcmVwbworICAgICMKKyAgICBpZiAocHRhZygkcHMtPntpZH0pKSB7CisgICAgICAkb3B0X3YgJiYgcHJpbnQgIiAqIFNraXBwaW5nIGFscmVhZHkgaW1wb3J0ZWQ6ICRwcy0+e2lkfVxuIjsKKyAgICAgIG5leHQ7CisgICAgfQorCisgICAgcHJpbnQgIiAqIFN0YXJ0aW5nIHRvIHdvcmsgb24gJHBzLT57aWR9XG4iOworCisgICAgcHJvY2Vzc19wYXRjaHNldCgkcHMpIG9yIG5leHQ7CisKKyAgICAjIHdhcm4gImVycm9ycyB3aGVuIHJ1bm5pbmcgZ2l0LXVwZGF0ZS1pbmRleCEgJCEiOworICAgIG15ICR0cmVlID0gYGdpdC13cml0ZS10cmVlYDsKKyAgICBkaWUgImNhbm5vdCB3cml0ZSB0cmVlICQhIiBpZiAkPzsKKyAgICBjaG9tcCAkdHJlZTsKKworICAgICMKKyAgICAjIFdobydzIHlvdXIgZGFkZHk/CisgICAgIworICAgIG15IEBwYXI7CisgICAgaWYgKCAtZSAiJGdpdF9kaXIvcmVmcy9oZWFkcy8kcHMtPnticmFuY2h9IikgeworICAgICAgICBpZiAob3BlbiBIRUFELCAiPCIsIiRnaXRfZGlyL3JlZnMvaGVhZHMvJHBzLT57YnJhbmNofSIpIHsKKyAgICAgICAgICAgIG15ICRwID0gPEhFQUQ+OworICAgICAgICAgICAgY2xvc2UgSEVBRDsKKyAgICAgICAgICAgIGNob21wICRwOworICAgICAgICAgICAgcHVzaCBAcGFyLCAnLXAnLCAkcDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgkcHMtPnt0eXBlfSBlcSAncycpIHsKKyAgICAgICAgICAgICAgICB3YXJuICJDb3VsZCBub3QgZmluZCB0aGUgcmlnaHQgaGVhZCBmb3IgdGhlIGJyYW5jaCAkcHMtPnticmFuY2h9IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgkcHMtPnttZXJnZXN9KSB7CisgICAgICAgIHB1c2ggQHBhciwgZmluZF9wYXJlbnRzKCRwcyk7CisgICAgfQorCisgICAgIworICAgICMgQ29tbWl0LCB0YWcgYW5kIGNsZWFuIHN0YXRlCisgICAgIworICAgICRFTlZ7VFp9ICAgICAgICAgICAgICAgICAgPSAnR01UJzsKKyAgICAkRU5We0dJVF9BVVRIT1JfTkFNRX0gICAgID0gJHBzLT57YXV0aG9yfTsKKyAgICAkRU5We0dJVF9BVVRIT1JfRU1BSUx9ICAgID0gJHBzLT57ZW1haWx9OworICAgICRFTlZ7R0lUX0FVVEhPUl9EQVRFfSAgICAgPSAkcHMtPntkYXRlfTsKKyAgICAkRU5We0dJVF9DT01NSVRURVJfTkFNRX0gID0gJHBzLT57YXV0aG9yfTsKKyAgICAkRU5We0dJVF9DT01NSVRURVJfRU1BSUx9ID0gJHBzLT57ZW1haWx9OworICAgICRFTlZ7R0lUX0NPTU1JVFRFUl9EQVRFfSAgPSAkcHMtPntkYXRlfTsKKworICAgIG15ICRwaWQgPSBvcGVuMigqUkVBREVSLCAqV1JJVEVSLCdnaXQtY29tbWl0LXRyZWUnLCR0cmVlLEBwYXIpCisgICAgICAgIG9yIGRpZSAkITsKKyAgICBwcmludCBXUklURVIgJHBzLT57c3VtbWFyeX0sIlxuXG4iOworCisgICAgIyBvbmx5IHByaW50IG1lc3NhZ2UgaWYgaXQncyBub3QgZW1wdHksIHRvIGF2b2lkIGEgc3B1cmlvdXMgYmxhbmsgbGluZTsKKyAgICAjIGFsc28gYXBwZW5kIGFuIGV4dHJhIG5ld2xpbmUsIHNvIHRoZXJlJ3MgYSBibGFuayBsaW5lIGJlZm9yZSB0aGUKKyAgICAjIGZvbGxvd2luZyAiZ2l0LWFyY2hpbXBvcnQtaWQ6IiBsaW5lLgorICAgIHByaW50IFdSSVRFUiAkcHMtPnttZXNzYWdlfSwiXG5cbiIgaWYgKCRwcy0+e21lc3NhZ2V9IG5lICIiKTsKKworICAgICMgbWFrZSBpdCBlYXN5IHRvIGJhY2t0cmFjayBhbmQgZmlndXJlIG91dCB3aGljaCBBcmNoIHJldmlzaW9uIHRoaXMgd2FzOgorICAgIHByaW50IFdSSVRFUiAnZ2l0LWFyY2hpbXBvcnQtaWQ6ICcsJHBzLT57aWR9LCJcbiI7CisKKyAgICBjbG9zZSBXUklURVI7CisgICAgbXkgJGNvbW1pdGlkID0gPFJFQURFUj47ICAgICMgcmVhZAorICAgIGNob21wICRjb21taXRpZDsKKyAgICBjbG9zZSBSRUFERVI7CisgICAgd2FpdHBpZCAkcGlkLDA7ICAgICAgICAgICAgICMgY2xvc2U7CisKKyAgICBpZiAobGVuZ3RoICRjb21taXRpZCAhPSA0MCkgeworICAgICAgICBkaWUgIlNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggdGhlIGNvbW1pdCEgJCEgJGNvbW1pdGlkIjsKKyAgICB9CisgICAgIworICAgICMgVXBkYXRlIHRoZSBicmFuY2gKKyAgICAjCisgICAgb3BlbiAgSEVBRCwgIj4iLCIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRwcy0+e2JyYW5jaH0iOworICAgIHByaW50IEhFQUQgJGNvbW1pdGlkOworICAgIGNsb3NlIEhFQUQ7CisgICAgc3lzdGVtKCdnaXQtdXBkYXRlLXJlZicsICdIRUFEJywgIiRwcy0+e2JyYW5jaH0iKTsKKworICAgICMgdGFnIGFjY29yZGluZ2x5CisgICAgcHRhZygkcHMtPntpZH0sICRjb21taXRpZCk7ICMgcHJpdmF0ZSB0YWcKKyAgICBpZiAoJG9wdF9UIHx8ICRwcy0+e3R5cGV9IGVxICd0JyB8fCAkcHMtPnt0eXBlfSBlcSAnaScpIHsKKyAgICAgICAgdGFnKCRwcy0+e2lkfSwgJGNvbW1pdGlkKTsKKyAgICB9CisgICAgcHJpbnQgIiAqIENvbW1pdHRlZCAkcHMtPntpZH1cbiI7CisgICAgcHJpbnQgIiAgICsgdHJlZSAgICR0cmVlXG4iOworICAgIHByaW50ICIgICArIGNvbW1pdCAkY29tbWl0aWRcbiI7CisgICAgJG9wdF92ICYmIHByaW50ICIgICArIGNvbW1pdCBkYXRlIGlzICAkcHMtPntkYXRlfSBcbiI7CisgICAgJG9wdF92ICYmIHByaW50ICIgICArIHBhcmVudHM6ICAiLGpvaW4oJyAnLEBwYXIpLCJcbiI7Cit9CisKK2lmICgkb3B0X3YpIHsKKyAgICBmb3JlYWNoIChzb3J0IGtleXMgJXN0YXRzKSB7CisgICAgICAgIHByaW50IiAkXzogJHN0YXRzeyRffVxuIjsKKyAgICB9Cit9CitleGl0IDA7CisKKyMgdXNlZCBieSB0aGUgYWNjdXJhdGUgc3RyYXRlZ3k6CitzdWIgc3luY190b19wcyB7CisgICAgbXkgJHBzID0gc2hpZnQ7CisgICAgbXkgJHRyZWVfZGlyID0gJHRtcC4nLycudHJlZV9kaXJuYW1lKCRwcy0+e2lkfSk7CisKKyAgICAkb3B0X3YgJiYgcHJpbnQgInN5bmNfdG9fcHMoJHBzLT57aWR9KSBtZXRob2Q6ICI7CisKKyAgICBpZiAoLWQgJHRyZWVfZGlyKSB7CisgICAgICAgIGlmICgkcHMtPnt0eXBlfSBlcSAndCcpIHsKKwkgICAgJG9wdF92ICYmIHByaW50ICJnZXQgKHRhZylcbiI7CisgICAgICAgICAgICAjIGxvb2tzIGxpa2UgYSB0YWctb25seSBvciAod29yc2UsKSBhIG1peGVkIHRhZ3MvY2hhbmdlc2V0IGJyYW5jaCwKKyAgICAgICAgICAgICMgY2FuJ3QgcmVseSBvbiByZXBsYXkgdG8gd29yayBjb3JyZWN0bHkgb24gdGhlc2UKKyAgICAgICAgICAgIHJtdHJlZSgkdHJlZV9kaXIpOworICAgICAgICAgICAgc2FmZV9waXBlX2NhcHR1cmUoJFRMQSwnZ2V0JywnLS1uby1wcmlzdGluZScsJHBzLT57aWR9LCR0cmVlX2Rpcik7CisgICAgICAgICAgICAkc3RhdHN7Z2V0X3RhZ30rKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBteSAkdHJlZV9pZCA9IGFyY2hfdHJlZV9pZCgkdHJlZV9kaXIpOworICAgICAgICAgICAgICAgIGlmICgkcHMtPntwYXJlbnRfaWR9ICYmICgkcHMtPntwYXJlbnRfaWR9IGVxICR0cmVlX2lkKSkgeworICAgICAgICAgICAgICAgICAgICAjIHRoZSBjb21tb24gY2FzZSAoaG9wZWZ1bGx5KQorCQkgICAgJG9wdF92ICYmIHByaW50ICJyZXBsYXlcbiI7CisgICAgICAgICAgICAgICAgICAgIHNhZmVfcGlwZV9jYXB0dXJlKCRUTEEsJ3JlcGxheScsJy1kJywkdHJlZV9kaXIsJHBzLT57aWR9KTsKKyAgICAgICAgICAgICAgICAgICAgJHN0YXRze3JlcGxheX0rKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAjIGdldHRpbmcgb25lIHRyZWUgaXMgdXN1YWxseSBmYXN0ZXIgdGhhbiBnZXR0aW5nIHR3byB0cmVlcworICAgICAgICAgICAgICAgICAgICAjIGFuZCBhcHBseWluZyB0aGUgZGVsdGEgLi4uCisgICAgICAgICAgICAgICAgICAgIHJtdHJlZSgkdHJlZV9kaXIpOworCQkgICAgJG9wdF92ICYmIHByaW50ICJhcHBseS1kZWx0YVxuIjsKKyAgICAgICAgICAgICAgICAgICAgc2FmZV9waXBlX2NhcHR1cmUoJFRMQSwnZ2V0JywnLS1uby1wcmlzdGluZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBzLT57aWR9LCR0cmVlX2Rpcik7CisgICAgICAgICAgICAgICAgICAgICRzdGF0c3tnZXRfZGVsdGF9Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgIyBuZXcgYnJhbmNoIHdvcmsKKyAgICAgICAgJG9wdF92ICYmIHByaW50ICJnZXQgKG5ldyB0cmVlKVxuIjsKKyAgICAgICAgc2FmZV9waXBlX2NhcHR1cmUoJFRMQSwnZ2V0JywnLS1uby1wcmlzdGluZScsJHBzLT57aWR9LCR0cmVlX2Rpcik7CisgICAgICAgICRzdGF0c3tnZXRfbmV3fSsrOworICAgIH0KKworICAgICMgYWRkZWQgLUkgZmxhZyB0byByc3luYyBzaW5jZSB3ZSdyZSBnb2luZyB0byBmYXN0ISBBSUVFRUVFISEhIQorICAgIHN5c3RlbSgncnN5bmMnLCctYUknLCctLWRlbGV0ZScsJy0tZXhjbHVkZScsJGdpdF9kaXIsCisjICAgICAgICAgICAgICAgJy0tZXhjbHVkZScsJy5hcmNoLWludmVudG9yeScsCisgICAgICAgICAgICAgICAgJy0tZXhjbHVkZScsJy5hcmNoLWlkcycsJy0tZXhjbHVkZScsJ3thcmNofScsCisgICAgICAgICAgICAgICAgJy0tZXhjbHVkZScsJysqJywnLS1leGNsdWRlJywnLConLAorICAgICAgICAgICAgICAgICIkdHJlZV9kaXIvIiwnLi8nKSA9PSAwIG9yIGRpZSAiQ2Fubm90IHJzeW5jICR0cmVlX2RpcjogJCEgJD8iOworICAgIHJldHVybiAkdHJlZV9kaXI7Cit9CisKK3N1YiBhcHBseV9pbXBvcnQgeworICAgIG15ICRwcyA9IHNoaWZ0OworICAgIG15ICRibmFtZSA9IGdpdF9icmFuY2huYW1lKCRwcy0+e2lkfSk7CisKKyAgICBta3BhdGgoJHRtcCk7CisKKyAgICBzYWZlX3BpcGVfY2FwdHVyZSgkVExBLCdnZXQnLCctcycsJy0tbm8tcHJpc3RpbmUnLCRwcy0+e2lkfSwiJHRtcC9pbXBvcnQiKTsKKyAgICBkaWUgIkNhbm5vdCBnZXQgaW1wb3J0OiAkISIgaWYgJD87CisgICAgc3lzdGVtKCdyc3luYycsJy1hSScsJy0tZGVsZXRlJywgJy0tZXhjbHVkZScsJGdpdF9kaXIsCisJCSctLWV4Y2x1ZGUnLCcuYXJjaC1pZHMnLCctLWV4Y2x1ZGUnLCd7YXJjaH0nLAorCQkiJHRtcC9pbXBvcnQvIiwgJy4vJyk7CisgICAgZGllICJDYW5ub3QgcnN5bmMgaW1wb3J0OiQhIiBpZiAkPzsKKworICAgIHJtdHJlZSgiJHRtcC9pbXBvcnQiKTsKKyAgICBkaWUgIkNhbm5vdCByZW1vdmUgdGVtcGRpcjogJCEiIGlmICQ/OworCisKKyAgICByZXR1cm4gMTsKK30KKworc3ViIGFwcGx5X2NzZXQgeworICAgIG15ICRwcyA9IHNoaWZ0OworCisgICAgbWtwYXRoKCR0bXApOworCisgICAgIyBnZXQgdGhlIGNoYW5nZXNldAorICAgIHNhZmVfcGlwZV9jYXB0dXJlKCRUTEEsJ2dldC1jaGFuZ2VzZXQnLCRwcy0+e2lkfSwiJHRtcC9jaGFuZ2VzZXQiKTsKKyAgICBkaWUgIkNhbm5vdCBnZXQgY2hhbmdlc2V0OiAkISIgaWYgJD87CisKKyAgICAjIGFwcGx5IHBhdGNoZXMKKyAgICBpZiAoYGZpbmQgJHRtcC9jaGFuZ2VzZXQvcGF0Y2hlcyAtdHlwZSBmIC1uYW1lICcqLnBhdGNoJ2ApIHsKKyAgICAgICAgIyB0aGlzIGNhbiBiZSBzcGVkIHVwIGNvbnNpZGVyYWJseSBieSBkb2luZworICAgICAgICAjICAgIChmaW5kIHwgeGFyZ3MgY2F0KSB8IHBhdGNoCisgICAgICAgICMgYnV0IHRoYXQgY2FuIGdldCBtdWNrZWQgdXAgYnkgcGF0Y2hlcworICAgICAgICAjIHdpdGggbWlzc2luZyB0cmFpbGluZyBuZXdsaW5lcyBvciB0aGUgc3RhbmRhcmQKKyAgICAgICAgIyAnbWlzc2luZyBuZXdsaW5lJyBmbGFnIGluIHRoZSBwYXRjaCAtIHBvc3NpYmx5CisgICAgICAgICMgcHJvZHVjZWQgd2l0aCBhbiBvbGQvYnVnZ3kgZGlmZi4KKyAgICAgICAgIyBzbG93IGFuZCBzYWZlLCB3ZSBpbnZva2UgcGF0Y2ggb25jZSBwZXIgcGF0Y2hmaWxlCisgICAgICAgIGBmaW5kICR0bXAvY2hhbmdlc2V0L3BhdGNoZXMgLXR5cGUgZiAtbmFtZSAnKi5wYXRjaCcgLXByaW50MCB8IGdyZXAgLXp2ICd7YXJjaH0nIHwgeGFyZ3MgLWlGSUxFIC0wIC0tbm8tcnVuLWlmLWVtcHR5IHBhdGNoIC1wMSAtLWZvcndhcmQgLWlGSUxFYDsKKyAgICAgICAgZGllICJQcm9ibGVtIGFwcGx5aW5nIHBhdGNoZXMhICQhIiBpZiAkPzsKKyAgICB9CisKKyAgICAjIGFwcGx5IGNoYW5nZWQgYmluYXJ5IGZpbGVzCisgICAgaWYgKG15IEBtb2RpZmllZCA9IGBmaW5kICR0bXAvY2hhbmdlc2V0L3BhdGNoZXMgLXR5cGUgZiAtbmFtZSAnKi5tb2RpZmllZCdgKSB7CisgICAgICAgIGZvcmVhY2ggbXkgJG1vZCAoQG1vZGlmaWVkKSB7CisgICAgICAgICAgICBjaG9tcCAkbW9kOworICAgICAgICAgICAgbXkgJG9yaWcgPSAkbW9kOworICAgICAgICAgICAgJG9yaWcgPX4gcy9cLm1vZGlmaWVkJC8vOyAjIGxhenkKKyAgICAgICAgICAgICRvcmlnID1+IHMhXlxRJHRtcFxFL2NoYW5nZXNldC9wYXRjaGVzLyEhOworICAgICAgICAgICAgI3ByaW50ICJyc3luYyAtcCAnJG1vZCcgJyRvcmlnJyI7CisgICAgICAgICAgICBzeXN0ZW0oJ3JzeW5jJywnLXAnLCRtb2QsIi4vJG9yaWciKTsKKyAgICAgICAgICAgIGRpZSAiUHJvYmxlbSBhcHBseWluZyBiaW5hcnkgY2hhbmdlcyEgJCEiIGlmICQ/OworICAgICAgICB9CisgICAgfQorCisgICAgIyBicmluZyBpbiBuZXcgZmlsZXMKKyAgICBzeXN0ZW0oJ3JzeW5jJywnLWFJJywnLS1leGNsdWRlJywkZ2l0X2RpciwKKwkJJy0tZXhjbHVkZScsJy5hcmNoLWlkcycsCisJCSctLWV4Y2x1ZGUnLCAne2FyY2h9JywKKwkJIiR0bXAvY2hhbmdlc2V0L25ldy1maWxlcy1hcmNoaXZlLyIsJy4vJyk7CisKKyAgICAjIGRlbGV0ZWQgZmlsZXMgYXJlIGhpbnRlZCBmcm9tIHRoZSBjb21taXRsb2cgcHJvY2Vzc2luZworCisgICAgcm10cmVlKCIkdG1wL2NoYW5nZXNldCIpOworfQorCisKKyMgPWZvciByZWZlcmVuY2UKKyMgbm90ZXM6ICotZmlsZXMvLWRpcmVjdG9yaWVzIGtleXMgY2Fubm90IGhhdmUgc3BhY2VzLCB0aGV5J3JlIGFsd2F5cworIyBwaWthLWVzY2FwZWQuICBFdmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBuZXdsaW5lCisjIEEgbG9nIGVudHJ5IGxvb2tzIGxpa2U6CisjIFJldmlzaW9uOiBtb29kbGUtb3JnLS1tb29kbGUtLTEuMy4zLS1wYXRjaC0xNQorIyBBcmNoaXZlOiBhcmNoLWVkdWZvcmdlQGNhdGFseXN0Lm5ldC5uei0tMjAwNAorIyBDcmVhdG9yOiBQZW5ueSBMZWFjaCA8cGVubnlAY2F0YWx5c3QubmV0Lm56PgorIyBEYXRlOiBXZWQgTWF5IDI1IDE0OjE1OjM0IE5aU1QgMjAwNQorIyBTdGFuZGFyZC1kYXRlOiAyMDA1LTA1LTI1IDAyOjE1OjM0IEdNVAorIyBOZXctZmlsZXM6IGxhbmcvZGUvLmFyY2gtaWRzL2Jsb2NrX2dsb3NzYXJ5X3JhbmRvbS5waHAuaWQKKyMgICAgIGxhbmcvZGUvLmFyY2gtaWRzL2Jsb2NrX2h0bWwucGhwLmlkCisjIE5ldy1kaXJlY3RvcmllczogbGFuZy9kZS9oZWxwL3F1ZXN0aW9ubmFpcmUKKyMgICAgIGxhbmcvZGUvaGVscC9xdWVzdGlvbm5haXJlLy5hcmNoLWlkcworIyBSZW5hbWVkLWZpbGVzOiAuYXJjaC1pZHMvZGJfc2VhcnMuc3FsLmlkIGRiLy5hcmNoLWlkcy9kYl9zZWFycy5zcWwuaWQKKyMgICAgZGJfc2VhcnMuc3FsIGRiL2RiX3NlYXJzLnNxbAorIyBSZW1vdmVkLWZpbGVzOiBsYW5nL2JlL2RvY3MvLmFyY2gtaWRzL3JlbGVhc2UuaHRtbC5pZAorIyAgICAgbGFuZy9iZS9kb2NzLy5hcmNoLWlkcy9yZWxlYXNlb2xkLmh0bWwuaWQKKyMgTW9kaWZpZWQtZmlsZXM6IGFkbWluL2Nyb24ucGhwIGFkbWluL2RlbGV0ZS5waHAKKyMgICAgIGFkbWluL2VkaXRvci5odG1sIGJhY2t1cC9saWIucGhwIGJhY2t1cC9yZXN0b3JlLnBocAorIyBOZXctcGF0Y2hlczogYXJjaC1lZHVmb3JnZUBjYXRhbHlzdC5uZXQubnotLTIwMDQvbW9vZGxlLW9yZy0tbW9vZGxlLS0xLjMuMy0tcGF0Y2gtMTUKKyMgU3VtbWFyeTogVXBkYXRpbmcgdG8gbGF0ZXN0IGZyb20gTU9PRExFXzE0X1NUQUJMRSAoMS40LjUrKQorIyAgIHN1bW1hcnkgY2FuIGJlIG11bHRpbGluZSB3aXRoIGEgbGVhZGluZyBzcGFjZSBqdXN0IGxpa2UgdGhlIGFib3ZlIGZpZWxkcworIyBLZXl3b3JkczoKKyMKKyMgVXBkYXRpbmcgeWFkZGEgdGFkZGEgdGFkZGEgbWFkZGEKK3N1YiBwYXJzZWxvZyB7CisgICAgbXkgKCRwcywgJGxvZykgPSBAXzsKKyAgICBteSAka2V5ID0gdW5kZWY7CisKKyAgICAjIGhlYWRlcnMgd2Ugd2FudCB0aGF0IGNvbnRhaW4gZmlsZW5hbWVzOgorICAgIG15ICV3YW50X2hlYWRlcnMgPSAoCisgICAgICAgIG5ld19maWxlcyA9PiAxLAorICAgICAgICBtb2RpZmllZF9maWxlcyA9PiAxLAorICAgICAgICByZW5hbWVkX2ZpbGVzID0+IDEsCisgICAgICAgIHJlbmFtZWRfZGlyZWN0b3JpZXMgPT4gMSwKKyAgICAgICAgcmVtb3ZlZF9maWxlcyA9PiAxLAorICAgICAgICByZW1vdmVkX2RpcmVjdG9yaWVzID0+IDEsCisgICAgKTsKKworICAgIGNob21wIChAJGxvZyk7CisgICAgd2hpbGUgKCRfID0gc2hpZnQgQCRsb2cpIHsKKyAgICAgICAgaWYgKC9eQ29udGludWF0aW9uLW9mOlxzKiguKikvKSB7CisgICAgICAgICAgICAkcHMtPnt0YWd9ID0gJDE7CisgICAgICAgICAgICAka2V5ID0gdW5kZWY7CisgICAgICAgIH0gZWxzaWYgKC9eU3VtbWFyeTpccyooLiopJC8gKSB7CisgICAgICAgICAgICAjIHN1bW1hcnkgY2FuIGJlIG11bHRpbGluZSBhcyBsb25nIGFzIGl0IGhhcyBhIGxlYWRpbmcgc3BhY2UuCisJICAgICMgd2Ugc3F1ZWV6ZSBpdCBvbnRvIGEgc2luZ2xlIGxpbmUsIHRob3VnaC4KKyAgICAgICAgICAgICRwcy0+e3N1bW1hcnl9ID0gWyAkMSBdOworICAgICAgICAgICAgJGtleSA9ICdzdW1tYXJ5JzsKKyAgICAgICAgfSBlbHNpZiAoL15DcmVhdG9yOiAoLiopXHMqPChbXlw+XSspPi8pIHsKKyAgICAgICAgICAgICRwcy0+e2F1dGhvcn0gPSAkMTsKKyAgICAgICAgICAgICRwcy0+e2VtYWlsfSA9ICQyOworICAgICAgICAgICAgJGtleSA9IHVuZGVmOworICAgICAgICAjIGFueSAqLWZpbGVzIG9yICotZGlyZWN0b3JpZXMgY2FuIGJlIHJlYWQgaGVyZToKKyAgICAgICAgfSBlbHNpZiAoL14oW0EtWl1bYS16XC1dKyk6XHMqKC4qKSQvKSB7CisgICAgICAgICAgICBteSAkdmFsID0gJDI7CisgICAgICAgICAgICAka2V5ID0gbGMgJDE7CisgICAgICAgICAgICAka2V5ID1+IHRyLy0vXy87ICMgdG9vIGxhenkgdG8gcXVvdGUgOlAKKyAgICAgICAgICAgIGlmICgkd2FudF9oZWFkZXJzeyRrZXl9KSB7CisgICAgICAgICAgICAgICAgcHVzaCBAeyRwcy0+eyRrZXl9fSwgc3BsaXQoL1xzKy8sICR2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAka2V5ID0gdW5kZWY7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzaWYgKC9eJC8pIHsKKyAgICAgICAgICAgIGxhc3Q7ICMgcmVtYWluZGVyIG9mIEAkbG9nIHRoYXQgZGlkbid0IGdldCBzaGlmdGVkIG9mZiBpcyBtZXNzYWdlCisgICAgICAgIH0gZWxzaWYgKCRrZXkpIHsKKyAgICAgICAgICAgIGlmICgvXlxzKyguKikkLykgeworICAgICAgICAgICAgICAgIGlmICgka2V5IGVxICdzdW1tYXJ5JykgeworICAgICAgICAgICAgICAgICAgICBwdXNoIEB7JHBzLT57JGtleX19LCAkMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAjIGZpbGVzL2RpcmVjdG9yaWVzOgorICAgICAgICAgICAgICAgICAgICBwdXNoIEB7JHBzLT57JGtleX19LCBzcGxpdCgvXHMrLywgJDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJGtleSA9IHVuZGVmOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgIyBkcm9wIGxlYWRpbmcgZW1wdHkgbGluZXMgZnJvbSB0aGUgbG9nIG1lc3NhZ2UKKyAgICB3aGlsZSAoQCRsb2cgJiYgJGxvZy0+WzBdIGVxICcnKSB7CisJc2hpZnQgQCRsb2c7CisgICAgfQorICAgIGlmIChleGlzdHMgJHBzLT57c3VtbWFyeX0gJiYgQHskcHMtPntzdW1tYXJ5fX0pIHsKKwkkcHMtPntzdW1tYXJ5fSA9IGpvaW4oJyAnLCBAeyRwcy0+e3N1bW1hcnl9fSk7CisgICAgfQorICAgIGVsc2lmIChAJGxvZyA9PSAwKSB7CisJJHBzLT57c3VtbWFyeX0gPSAnZW1wdHkgY29tbWl0IG1lc3NhZ2UnOworICAgIH0gZWxzZSB7CisJJHBzLT57c3VtbWFyeX0gPSAkbG9nLT5bMF0gLiAnLi4uJzsKKyAgICB9CisgICAgJHBzLT57bWVzc2FnZX0gPSBqb2luKCJcbiIsQCRsb2cpOworCisgICAgIyBza2lwIEFyY2ggY29udHJvbCBmaWxlcywgdW5lc2NhcGUgcGlrYS1lc2NhcGVkIGZpbGVzCisgICAgZm9yZWFjaCBteSAkayAoa2V5cyAld2FudF9oZWFkZXJzKSB7CisgICAgICAgIG5leHQgdW5sZXNzIChkZWZpbmVkICRwcy0+eyRrfSk7CisgICAgICAgIG15IEB0bXAgPSAoKTsKKyAgICAgICAgZm9yZWFjaCBteSAkdCAoQHskcHMtPnska319KSB7CisgICAgICAgICAgIG5leHQgdW5sZXNzIGxlbmd0aCAoJHQpOworICAgICAgICAgICBuZXh0IGlmICR0ID1+IG0hXHthcmNoXH0vITsKKyAgICAgICAgICAgbmV4dCBpZiAkdCA9fiBtIVwuYXJjaC1pZHMvITsKKyAgICAgICAgICAgIyBzaG91bGQgd2Ugc2tpcCB0aGlzPworICAgICAgICAgICBuZXh0IGlmICR0ID1+IG0hXC5hcmNoLWludmVudG9yeSQhOworICAgICAgICAgICAjIHRsYSBjYXQtYXJjaGl2ZS1sb2cgd2lsbCBnaXZlIHVzIGZpbGVuYW1lcyB3aXRoIHNwYWNlcyBhcyBmaWxlXChzcCluYW1lIC0gd2h5PworICAgICAgICAgICAjIHdlIGNhbiBhc3N1bWUgdGhhdCBhbnkgZmlsZW5hbWUgd2l0aCBcIGluZGljYXRlcyBzb21lIHBpa2EgZXNjYXBpbmcgdGhhdCB3ZSB3YW50IHRvIGdldCByaWQgb2YuCisgICAgICAgICAgIGlmICgkdCA9fiAvXFwvICl7CisgICAgICAgICAgICAgICAkdCA9IChzYWZlX3BpcGVfY2FwdHVyZSgkVExBLCdlc2NhcGUnLCctLXVuZXNjYXBlZCcsJHQpKVswXTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBwdXNoIEB0bXAsICR0OworICAgICAgICB9CisgICAgICAgICRwcy0+eyRrfSA9IFxAdG1wOworICAgIH0KK30KKworIyB3cml0ZS9yZWFkIGEgdGFnCitzdWIgdGFnIHsKKyAgICBteSAoJHRhZywgJGNvbW1pdCkgPSBAXzsKKworICAgIGlmICgkb3B0X28pIHsKKyAgICAgICAgJHRhZyA9fiBzfC98LS18ZzsKKyAgICB9IGVsc2UgeworCW15ICRwYXRjaG5hbWUgPSAkdGFnOworCSRwYXRjaG5hbWUgPX4gcy8uKi0tLy87CisgICAgICAgICR0YWcgPSBnaXRfYnJhbmNobmFtZSAoJHRhZykgLiAnLS0nIC4gJHBhdGNobmFtZTsKKyAgICB9CisKKyAgICBpZiAoJGNvbW1pdCkgeworICAgICAgICBvcGVuKEMsIj4iLCIkZ2l0X2Rpci9yZWZzL3RhZ3MvJHRhZyIpCisgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCBjcmVhdGUgdGFnICR0YWc6ICQhXG4iOworICAgICAgICBwcmludCBDICIkY29tbWl0XG4iCisgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCB3cml0ZSB0YWcgJHRhZzogJCFcbiI7CisgICAgICAgIGNsb3NlKEMpCisgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCB3cml0ZSB0YWcgJHRhZzogJCFcbiI7CisgICAgICAgIHByaW50ICIgKiBDcmVhdGVkIHRhZyAnJHRhZycgb24gJyRjb21taXQnXG4iIGlmICRvcHRfdjsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgIyByZWFkCisgICAgICAgIG9wZW4oQywiPCIsIiRnaXRfZGlyL3JlZnMvdGFncy8kdGFnIikKKyAgICAgICAgICAgIG9yIGRpZSAiQ2Fubm90IHJlYWQgdGFnICR0YWc6ICQhXG4iOworICAgICAgICAkY29tbWl0ID0gPEM+OworICAgICAgICBjaG9tcCAkY29tbWl0OworICAgICAgICBkaWUgIkVycm9yIHJlYWRpbmcgdGFnICR0YWc6ICQhXG4iIHVubGVzcyBsZW5ndGggJGNvbW1pdCA9PSA0MDsKKyAgICAgICAgY2xvc2UoQykKKyAgICAgICAgICAgIG9yIGRpZSAiQ2Fubm90IHJlYWQgdGFnICR0YWc6ICQhXG4iOworICAgICAgICByZXR1cm4gJGNvbW1pdDsKKyAgICB9Cit9CisKKyMgd3JpdGUvcmVhZCBhIHByaXZhdGUgdGFnCisjIHJlYWRzIGZhaWwgc29mdGx5IGlmIHRoZSB0YWcgaXNuJ3QgdGhlcmUKK3N1YiBwdGFnIHsKKyAgICBteSAoJHRhZywgJGNvbW1pdCkgPSBAXzsKKworICAgICMgZG9uJ3QgdXNlIHN1YmRpcnMgZm9yIHRhZ3MgeWV0LCBpdCBjb3VsZCBzY3JldyB1cCBvdGhlciBwb3JjZWxhaW5zCisgICAgJHRhZyA9fiBzfC98LHxnOworCisgICAgbXkgJHRhZ19maWxlID0gIiRwdGFnX2Rpci8kdGFnIjsKKyAgICBteSAkdGFnX2JyYW5jaF9kaXIgPSBkaXJuYW1lKCR0YWdfZmlsZSk7CisgICAgbWtwYXRoKCR0YWdfYnJhbmNoX2RpcikgdW5sZXNzICgtZCAkdGFnX2JyYW5jaF9kaXIpOworCisgICAgaWYgKCRjb21taXQpIHsgICAgICAgICAgICAgICMgd3JpdGUKKyAgICAgICAgb3BlbihDLCI+IiwkdGFnX2ZpbGUpCisgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCBjcmVhdGUgdGFnICR0YWc6ICQhXG4iOworICAgICAgICBwcmludCBDICIkY29tbWl0XG4iCisgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCB3cml0ZSB0YWcgJHRhZzogJCFcbiI7CisgICAgICAgIGNsb3NlKEMpCisgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCB3cml0ZSB0YWcgJHRhZzogJCFcbiI7CisJJHJwdGFnc3skY29tbWl0fSA9ICR0YWcKKwkgICAgdW5sZXNzICR0YWcgPX4gbS8tLWJhc2UtMCQvOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAjIHJlYWQKKyAgICAgICAgIyBpZiB0aGUgdGFnIGlzbid0IHRoZXJlLCByZXR1cm4gMAorICAgICAgICB1bmxlc3MgKCAtcyAkdGFnX2ZpbGUpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIG9wZW4oQywiPCIsJHRhZ19maWxlKQorICAgICAgICAgICAgb3IgZGllICJDYW5ub3QgcmVhZCB0YWcgJHRhZzogJCFcbiI7CisgICAgICAgICRjb21taXQgPSA8Qz47CisgICAgICAgIGNob21wICRjb21taXQ7CisgICAgICAgIGRpZSAiRXJyb3IgcmVhZGluZyB0YWcgJHRhZzogJCFcbiIgdW5sZXNzIGxlbmd0aCAkY29tbWl0ID09IDQwOworICAgICAgICBjbG9zZShDKQorICAgICAgICAgICAgb3IgZGllICJDYW5ub3QgcmVhZCB0YWcgJHRhZzogJCFcbiI7CisJdW5sZXNzIChkZWZpbmVkICRycHRhZ3N7JGNvbW1pdH0pIHsKKwkgICAgJHJwdGFnc3skY29tbWl0fSA9ICR0YWc7CisJfQorICAgICAgICByZXR1cm4gJGNvbW1pdDsKKyAgICB9Cit9CisKK3N1YiBmaW5kX3BhcmVudHMgeworICAgICMKKyAgICAjIElkZW50aWZ5IHdoYXQgYnJhbmNoZXMgYXJlIG1lcmdpbmcgaW50byBtZQorICAgICMgYW5kIHdoZXRoZXIgd2UgYXJlIGZ1bGx5IG1lcmdlZAorICAgICMgZ2l0LW1lcmdlLWJhc2UgPGhlYWRzaGE+IDxoZWFkc2hhPiBzaG91bGQgdGVsbAorICAgICMgbWUgd2hhdCB0aGUgYmFzZSBvZiB0aGUgbWVyZ2Ugc2hvdWxkIGJlCisgICAgIworICAgIG15ICRwcyA9IHNoaWZ0OworCisgICAgbXkgJWJyYW5jaGVzOyAjIGhvbGRzIGFuIGFycmF5cmVmIHBlciBicmFuY2gKKyAgICAgICAgICAgICAgICAgICMgdGhlIGFycmF5cmVmIGNvbnRhaW5zIGEgbGlzdCBvZgorICAgICAgICAgICAgICAgICAgIyBtZXJnZWQgcGF0Y2hlcyBiZXR3ZWVuIHRoZSBiYXNlCisgICAgICAgICAgICAgICAgICAjIG9mIHRoZSBtZXJnZSBhbmQgdGhlIGN1cnJlbnQgaGVhZAorCisgICAgbXkgQHBhcmVudHM7ICAjIHBhcmVudHMgZm91bmQgZm9yIHRoaXMgY29tbWl0CisKKyAgICAjIHNpbXBsZSBsb29wIHRvIHNwbGl0IHRoZSBtZXJnZXMKKyAgICAjIHBlciBicmFuY2gKKyAgICBmb3JlYWNoIG15ICRtZXJnZSAoQHskcHMtPnttZXJnZXN9fSkgeworCW15ICRicmFuY2ggPSBnaXRfYnJhbmNobmFtZSgkbWVyZ2UpOworCXVubGVzcyAoZGVmaW5lZCAkYnJhbmNoZXN7JGJyYW5jaH0gKXsKKwkgICAgJGJyYW5jaGVzeyRicmFuY2h9ID0gW107CisJfQorCXB1c2ggQHskYnJhbmNoZXN7JGJyYW5jaH19LCAkbWVyZ2U7CisgICAgfQorCisgICAgIworICAgICMgZm9yZWFjaCBicmFuY2ggZmluZCBhIG1lcmdlIGJhc2UgYW5kIHdhbGsgaXQgdG8gdGhlCisgICAgIyBoZWFkIHdoZXJlIHdlIGFyZSwgY29sbGVjdGluZyB0aGUgbWVyZ2VkIHBhdGNoc2V0cyB0aGF0CisgICAgIyBBcmNoIGhhcyByZWNvcmRlZC4gS2VlcCB0aGF0IGluIEBoYXZlCisgICAgIyBDb21wYXJlIHRoYXQgd2l0aCB0aGUgY29tbWl0cyBvbiB0aGUgb3RoZXIgYnJhbmNoCisgICAgIyBiZXR3ZWVuIG1lcmdlLWJhc2UgYW5kIHRoZSB0aXAgb2YgdGhlIGJyYW5jaCAoQG5lZWQpCisgICAgIyBhbmQgc2VlIGlmIHdlIGhhdmUgYSBzZXJpZXMgb2YgY29uc2VjdXRpdmUgcGF0Y2hlcworICAgICMgc3RhcnRpbmcgZnJvbSB0aGUgbWVyZ2UgYmFzZS4gVGhlIHRpcCBvZiB0aGUgc2VyaWVzCisgICAgIyBvZiBjb25zZWN1dGl2ZSBwYXRjaGVzIG1lcmdlZCBpcyBvdXIgbmV3IHBhcmVudCBmb3IKKyAgICAjIHRoYXQgYnJhbmNoLgorICAgICMKKyAgICBmb3JlYWNoIG15ICRicmFuY2ggKGtleXMgJWJyYW5jaGVzKSB7CisKKwkjIGNoZWNrIHRoYXQgd2UgYWN0dWFsbHkga25vdyBhYm91dCB0aGUgYnJhbmNoCisJbmV4dCB1bmxlc3MgLWUgIiRnaXRfZGlyL3JlZnMvaGVhZHMvJGJyYW5jaCI7CisKKwlteSAkbWVyZ2ViYXNlID0gYGdpdC1tZXJnZS1iYXNlICRicmFuY2ggJHBzLT57YnJhbmNofWA7CisJaWYgKCQ/KSB7CisJICAgICMgRG9uJ3QgZGllIGhlcmUsIEFyY2ggc3VwcG9ydHMgb25lLXdheSBjaGVycnktcGlja2luZworCSAgICAjIGJldHdlZW4gYnJhbmNoZXMgd2l0aCBubyBjb21tb24gYmFzZSAob3IgYW55IHJlbGF0aW9uc2hpcAorCSAgICAjIGF0IGFsbCBiZWZvcmVoYW5kKQorCSAgICB3YXJuICJDYW5ub3QgZmluZCBtZXJnZSBiYXNlIGZvciAkYnJhbmNoIGFuZCAkcHMtPnticmFuY2h9IjsKKwkgICAgbmV4dDsKKwl9CisJY2hvbXAgJG1lcmdlYmFzZTsKKworCSMgbm93IHdhbGsgdXAgdG8gdGhlIG1lcmdlcG9pbnQgY29sbGVjdGluZyB3aGF0IHBhdGNoZXMgd2UgaGF2ZQorCW15ICRicmFuY2h0aXAgPSBnaXRfcmV2X3BhcnNlKCRwcy0+e2JyYW5jaH0pOworCW15IEBhbmNlc3RvcnMgPSBgZ2l0LXJldi1saXN0IC0tdG9wby1vcmRlciAkYnJhbmNodGlwIF4kbWVyZ2ViYXNlYDsKKwlteSAlaGF2ZTsgIyBjb2xsZWN0ZWQgbWVyZ2VzIHRoaXMgYnJhbmNoIGhhcworCWZvcmVhY2ggbXkgJG1lcmdlIChAeyRwcy0+e21lcmdlc319KSB7CisJICAgICRoYXZleyRtZXJnZX0gPSAxOworCX0KKwlteSAlYW5jZXN0b3JzaGF2ZTsKKwlmb3JlYWNoIG15ICRwYXIgKEBhbmNlc3RvcnMpIHsKKwkgICAgJHBhciA9IGNvbW1pdGlkMnBzZXQoJHBhcik7CisJICAgIGlmIChkZWZpbmVkICRwYXItPnttZXJnZXN9KSB7CisJCWZvcmVhY2ggbXkgJG1lcmdlIChAeyRwYXItPnttZXJnZXN9fSkgeworCQkgICAgJGFuY2VzdG9yc2hhdmV7JG1lcmdlfT0xOworCQl9CisJICAgIH0KKwl9CisJIyBwcmludCAiKysrKyBNZXJnZXMgaW4gJHBzLT57aWR9IGFyZS4uLi5cbiI7CisJIyBteSBAaGF2ZSA9IHNvcnQga2V5cyAlaGF2ZTsJcHJpbnQgRHVtcGVyKFxAaGF2ZSk7CisKKwkjIG1lcmdlIHdoYXQgd2UgaGF2ZSB3aXRoIHdoYXQgYW5jZXN0b3JzIGhhdmUKKwklaGF2ZSA9ICglaGF2ZSwgJWFuY2VzdG9yc2hhdmUpOworCisJIyBzZWUgd2hhdCB0aGUgcmVtb3RlIGJyYW5jaCBoYXMgLSB0aGVzZSBhcmUgdGhlIG1lcmdlcyB3ZQorCSMgd2lsbCB3YW50IHRvIGhhdmUgaW4gYSBjb25zZWN1dGl2ZSBzZXJpZXMgZnJvbSB0aGUgbWVyZ2ViYXNlCisJbXkgJG90aGVyYnJhbmNodGlwID0gZ2l0X3Jldl9wYXJzZSgkYnJhbmNoKTsKKwlteSBAbmVlZHJhdyA9IGBnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyICRvdGhlcmJyYW5jaHRpcCBeJG1lcmdlYmFzZWA7CisJbXkgQG5lZWQ7CisJZm9yZWFjaCBteSAkbmVlZHBzIChAbmVlZHJhdykgeyAJIyBnZXQgdGhlIHBzZXRzCisJICAgICRuZWVkcHMgPSBjb21taXRpZDJwc2V0KCRuZWVkcHMpOworCSAgICAjIGdpdC1yZXYtbGlzdCB3aWxsIGFsc28KKwkgICAgIyBsaXN0IGNvbW1pdHMgbWVyZ2VkIGluIHZpYSBlYXJsaWVyCisJICAgICMgbWVyZ2VzLiB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGNvbW1pdHMKKwkgICAgIyBmcm9tIHRoZSBicmFuY2ggd2UncmUgbG9va2luZyBhdAorCSAgICBpZiAoJGJyYW5jaCBlcSAkbmVlZHBzLT57YnJhbmNofSkgeworCQlwdXNoIEBuZWVkLCAkbmVlZHBzLT57aWR9OworCSAgICB9CisJfQorCisJIyBwcmludCAiKysrKyBNZXJnZXMgZnJvbSAkYnJhbmNoIHdlIHdhbnQgYXJlLi4uLlxuIjsKKwkjIHByaW50IER1bXBlcihcQG5lZWQpOworCisJbXkgJG5ld3BhcmVudDsKKwl3aGlsZSAobXkgJG5lZWRlZF9jb21taXQgPSBwb3AgQG5lZWQpIHsKKwkgICAgaWYgKCRoYXZleyRuZWVkZWRfY29tbWl0fSkgeworCQkkbmV3cGFyZW50ID0gJG5lZWRlZF9jb21taXQ7CisJICAgIH0gZWxzZSB7CisJCWxhc3Q7ICMgYnJlYWsgb3V0IG9mIHRoZSB3aGlsZQorCSAgICB9CisJfQorCWlmICgkbmV3cGFyZW50KSB7CisJICAgIHB1c2ggQHBhcmVudHMsICRuZXdwYXJlbnQ7CisJfQorCisKKyAgICB9ICMgZW5kIGZvcmVhY2ggYnJhbmNoCisKKyAgICAjIHBydW5lIHJlZHVuZGFudCBwYXJlbnRzCisgICAgbXkgJXBhcmVudHM7CisgICAgZm9yZWFjaCBteSAkcCAoQHBhcmVudHMpIHsKKwkkcGFyZW50c3skcH0gPSAxOworICAgIH0KKyAgICBmb3JlYWNoIG15ICRwIChAcGFyZW50cykgeworCW5leHQgdW5sZXNzIGV4aXN0cyAkcHNldHN7JHB9e21lcmdlc307CisJbmV4dCB1bmxlc3MgcmVmICAgICRwc2V0c3skcH17bWVyZ2VzfTsKKwlteSBAbWVyZ2VzID0gQHskcHNldHN7JHB9e21lcmdlc319OworCWZvcmVhY2ggbXkgJG1lcmdlIChAbWVyZ2VzKSB7CisJICAgIGlmICgkcGFyZW50c3skbWVyZ2V9KSB7CisJCWRlbGV0ZSAkcGFyZW50c3skbWVyZ2V9OworCSAgICB9CisJfQorICAgIH0KKworICAgIEBwYXJlbnRzID0gKCk7CisgICAgZm9yZWFjaCAoa2V5cyAlcGFyZW50cykgeworICAgICAgICBwdXNoIEBwYXJlbnRzLCAnLXAnLCBwdGFnKCRfKTsKKyAgICB9CisgICAgcmV0dXJuIEBwYXJlbnRzOworfQorCitzdWIgZ2l0X3Jldl9wYXJzZSB7CisgICAgbXkgJG5hbWUgPSBzaGlmdDsKKyAgICBteSAkdmFsICA9IGBnaXQtcmV2LXBhcnNlICRuYW1lYDsKKyAgICBkaWUgIkVycm9yOiBnaXQtcmV2LXBhcnNlICRuYW1lIiBpZiAkPzsKKyAgICBjaG9tcCAkdmFsOworICAgIHJldHVybiAkdmFsOworfQorCisjIHJlc29sdmUgYSBTSEExIHRvIGEga25vd24gcGF0Y2hzZXQKK3N1YiBjb21taXRpZDJwc2V0IHsKKyAgICBteSAkY29tbWl0aWQgPSBzaGlmdDsKKyAgICBjaG9tcCAkY29tbWl0aWQ7CisgICAgbXkgJG5hbWUgPSAkcnB0YWdzeyRjb21taXRpZH0KKwl8fCBkaWUgIkNhbm5vdCBmaW5kIHJldmVyc2UgdGFnIG1hcHBpbmcgZm9yICRjb21taXRpZCI7CisgICAgJG5hbWUgPX4gc3wsfC98OworICAgIG15ICRwcyAgID0gJHBzZXRzeyRuYW1lfQorCXx8IChwcmludCBEdW1wZXIoc29ydCBrZXlzICVwc2V0cykpICYmIGRpZSAiQ2Fubm90IGZpbmQgcGF0Y2hzZXQgZm9yICRuYW1lIjsKKyAgICByZXR1cm4gJHBzOworfQorCisKKyMgYW4gYWx0ZXJuYXRpdmUgdG8gYGNvbW1hbmRgIHRoYXQgYWxsb3dzIGlucHV0IHRvIGJlIHBhc3NlZCBhcyBhbiBhcnJheQorIyB0byB3b3JrIGFyb3VuZCBzaGVsbCBwcm9ibGVtcyB3aXRoIHdlaXJkIGNoYXJhY3RlcnMgaW4gYXJndW1lbnRzCitzdWIgc2FmZV9waXBlX2NhcHR1cmUgeworICAgIG15IEBvdXRwdXQ7CisgICAgaWYgKG15ICRwaWQgPSBvcGVuIG15ICRjaGlsZCwgJy18JykgeworICAgICAgICBAb3V0cHV0ID0gKDwkY2hpbGQ+KTsKKyAgICAgICAgY2xvc2UgJGNoaWxkIG9yIGRpZSBqb2luKCcgJyxAXykuIjogJCEgJD8iOworICAgIH0gZWxzZSB7CisJZXhlYyhAXykgb3IgZGllICIkISAkPyI7ICMgZXhlYygpIGNhbiBmYWlsIHRoZSBleGVjdXRhYmxlIGNhbid0IGJlIGZvdW5kCisgICAgfQorICAgIHJldHVybiB3YW50YXJyYXkgPyBAb3V0cHV0IDogam9pbignJyxAb3V0cHV0KTsKK30KKworIyBgdGxhIGxvZ3MgLXJmIC1kIDxkaXI+IHwgaGVhZCAtbjFgIG9yIGBiYXogdHJlZS1pZCA8ZGlyPmAKK3N1YiBhcmNoX3RyZWVfaWQgeworICAgIG15ICRkaXIgPSBzaGlmdDsKKyAgICBjaG9tcCggbXkgJHJldCA9IChzYWZlX3BpcGVfY2FwdHVyZSgkVExBLCdsb2dzJywnLXJmJywnLWQnLCRkaXIpKVswXSApOworICAgIHJldHVybiAkcmV0OworfQorCitzdWIgYXJjaGl2ZV9yZWFjaGFibGUgeworICAgIG15ICRhcmNoaXZlID0gc2hpZnQ7CisgICAgcmV0dXJuIDEgaWYgJHJlYWNoYWJsZXskYXJjaGl2ZX07CisgICAgcmV0dXJuIDAgaWYgJHVucmVhY2hhYmxleyRhcmNoaXZlfTsKKworICAgIGlmIChzeXN0ZW0gIiRUTEEgd2hlcmVpcy1hcmNoaXZlICRhcmNoaXZlID4vZGV2L251bGwiKSB7CisgICAgICAgIGlmICgkb3B0X2EgJiYgKHN5c3RlbSgkVExBLCdyZWdpc3Rlci1hcmNoaXZlJywKKyAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL21pcnJvcnMuc291cmNlY29udHJvbC5uZXQvJGFyY2hpdmUiKSA9PSAwKSkgeworICAgICAgICAgICAgJHJlYWNoYWJsZXskYXJjaGl2ZX0gPSAxOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnQgU1RERVJSICJBcmNoaXZlIGlzIHVucmVhY2hhYmxlOiAkYXJjaGl2ZVxuIjsKKyAgICAgICAgJHVucmVhY2hhYmxleyRhcmNoaXZlfSA9IDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgICRyZWFjaGFibGV7JGFyY2hpdmV9ID0gMTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ2l0LWJpc2VjdC5zaCBiL2dpdC1iaXNlY3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDhmYjkyZAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1iaXNlY3Quc2gKQEAgLTAsMCArMSw0ODggQEAKKyMhL2Jpbi9zaAorCitVU0FHRT0nW3N0YXJ0fGJhZHxnb29kfHNraXB8bmV4dHxyZXNldHx2aXN1YWxpemV8cmVwbGF5fGxvZ3xydW5dJworTE9OR19VU0FHRT0nZ2l0IGJpc2VjdCBzdGFydCBbPGJhZD4gWzxnb29kPi4uLl1dIFstLV0gWzxwYXRoc3BlYz4uLi5dCisgICAgICAgIHJlc2V0IGJpc2VjdCBzdGF0ZSBhbmQgc3RhcnQgYmlzZWN0aW9uLgorZ2l0IGJpc2VjdCBiYWQgWzxyZXY+XQorICAgICAgICBtYXJrIDxyZXY+IGEga25vd24tYmFkIHJldmlzaW9uLgorZ2l0IGJpc2VjdCBnb29kIFs8cmV2Pi4uLl0KKyAgICAgICAgbWFyayA8cmV2Pi4uLiBrbm93bi1nb29kIHJldmlzaW9ucy4KK2dpdCBiaXNlY3Qgc2tpcCBbPHJldj4uLi5dCisgICAgICAgIG1hcmsgPHJldj4uLi4gdW50ZXN0YWJsZSByZXZpc2lvbnMuCitnaXQgYmlzZWN0IG5leHQKKyAgICAgICAgZmluZCBuZXh0IGJpc2VjdGlvbiB0byB0ZXN0IGFuZCBjaGVjayBpdCBvdXQuCitnaXQgYmlzZWN0IHJlc2V0IFs8YnJhbmNoPl0KKyAgICAgICAgZmluaXNoIGJpc2VjdGlvbiBzZWFyY2ggYW5kIGdvIGJhY2sgdG8gYnJhbmNoLgorZ2l0IGJpc2VjdCB2aXN1YWxpemUKKyAgICAgICAgc2hvdyBiaXNlY3Qgc3RhdHVzIGluIGdpdGsuCitnaXQgYmlzZWN0IHJlcGxheSA8bG9nZmlsZT4KKyAgICAgICAgcmVwbGF5IGJpc2VjdGlvbiBsb2cuCitnaXQgYmlzZWN0IGxvZworICAgICAgICBzaG93IGJpc2VjdCBsb2cuCitnaXQgYmlzZWN0IHJ1biA8Y21kPi4uLgorICAgICAgICB1c2UgPGNtZD4uLi4gdG8gYXV0b21hdGljYWxseSBiaXNlY3QuJworCitPUFRJT05TX1NQRUM9CisuIGdpdC1zaC1zZXR1cAorcmVxdWlyZV93b3JrX3RyZWUKKworX3g0MD0nWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXScKK194NDA9IiRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAiCisKK3NxKCkgeworCUBAUEVSTEBAIC1lICcKKwkJZm9yIChAQVJHVikgeworCQkJcy8nXCcnLydcJ1xcXFxcJ1wnJy9nOworCQkJcHJpbnQgIiAnXCcnJF8nXCcnIjsKKwkJfQorCQlwcmludCAiXG4iOworCScgIiRAIgorfQorCitiaXNlY3RfYXV0b3N0YXJ0KCkgeworCXRlc3QgLWYgIiRHSVRfRElSL0JJU0VDVF9OQU1FUyIgfHwgeworCQllY2hvID4mMiAnWW91IG5lZWQgdG8gc3RhcnQgYnkgImdpdCBiaXNlY3Qgc3RhcnQiJworCQlpZiB0ZXN0IC10IDAKKwkJdGhlbgorCQkJZWNobyA+JjIgLW4gJ0RvIHlvdSB3YW50IG1lIHRvIGRvIGl0IGZvciB5b3UgW1kvbl0/ICcKKwkJCXJlYWQgeWVzbm8KKwkJCWNhc2UgIiR5ZXNubyIgaW4KKwkJCVtObl0qKQorCQkJCWV4aXQgOzsKKwkJCWVzYWMKKwkJCWJpc2VjdF9zdGFydAorCQllbHNlCisJCQlleGl0IDEKKwkJZmkKKwl9Cit9CisKK2Jpc2VjdF9zdGFydCgpIHsKKwkjCisJIyBWZXJpZnkgSEVBRC4gSWYgd2Ugd2VyZSBiaXNlY3RpbmcgYmVmb3JlIHRoaXMsIHJlc2V0IHRvIHRoZQorCSMgdG9wLW9mLWxpbmUgbWFzdGVyIGZpcnN0IQorCSMKKwloZWFkPSQoR0lUX0RJUj0iJEdJVF9ESVIiIGdpdCBzeW1ib2xpYy1yZWYgSEVBRCkgfHwKKwloZWFkPSQoR0lUX0RJUj0iJEdJVF9ESVIiIGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkgfHwKKwlkaWUgIkJhZCBIRUFEIC0gSSBuZWVkIGEgSEVBRCIKKwljYXNlICIkaGVhZCIgaW4KKwlyZWZzL2hlYWRzL2Jpc2VjdCkKKwkJaWYgWyAtcyAiJEdJVF9ESVIvQklTRUNUX1NUQVJUIiBdOyB0aGVuCisJCSAgICBicmFuY2g9YGNhdCAiJEdJVF9ESVIvQklTRUNUX1NUQVJUImAKKwkJZWxzZQorCQkgICAgYnJhbmNoPW1hc3RlcgorCQlmaQorCQlnaXQgY2hlY2tvdXQgJGJyYW5jaCB8fCBleGl0CisJCTs7CisJcmVmcy9oZWFkcy8qfCRfeDQwKQorCQkjIFRoaXMgZXJyb3IgbWVzc2FnZSBzaG91bGQgb25seSBiZSB0cmlnZ2VyZWQgYnkgY29naXRvIHVzYWdlLAorCQkjIGFuZCBjb2dpdG8gdXNlcnMgc2hvdWxkIHVuZGVyc3RhbmQgaXQgcmVsYXRlcyB0byBjZy1zZWVrLgorCQlbIC1zICIkR0lUX0RJUi9oZWFkLW5hbWUiIF0gJiYgZGllICJ3b24ndCBiaXNlY3Qgb24gc2Vla2VkIHRyZWUiCisJCWVjaG8gIiR7aGVhZCNyZWZzL2hlYWRzL30iID4iJEdJVF9ESVIvQklTRUNUX1NUQVJUIgorCQk7OworCSopCisJCWRpZSAiQmFkIEhFQUQgLSBzdHJhbmdlIHN5bWJvbGljIHJlZiIKKwkJOzsKKwllc2FjCisKKwkjCisJIyBHZXQgcmlkIG9mIGFueSBvbGQgYmlzZWN0IHN0YXRlCisJIworCWJpc2VjdF9jbGVhbl9zdGF0ZQorCisJIworCSMgQ2hlY2sgZm9yIG9uZSBiYWQgYW5kIHRoZW4gc29tZSBnb29kIHJldmlzaW9ucy4KKwkjCisJaGFzX2RvdWJsZV9kYXNoPTAKKwlmb3IgYXJnOyBkbworCSAgICBjYXNlICIkYXJnIiBpbiAtLSkgaGFzX2RvdWJsZV9kYXNoPTE7IGJyZWFrIDs7IGVzYWMKKwlkb25lCisJb3JpZ19hcmdzPSQoc3EgIiRAIikKKwliYWRfc2Vlbj0wCisJd2hpbGUgWyAkIyAtZ3QgMCBdOyBkbworCSAgICBhcmc9IiQxIgorCSAgICBjYXNlICIkYXJnIiBpbgorCSAgICAtLSkKKwkJc2hpZnQKKwkJYnJlYWsKKwkJOzsKKwkgICAgKikKKwkJcmV2PSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAiJGFyZ157Y29tbWl0fSIgMj4vZGV2L251bGwpIHx8IHsKKwkJICAgIHRlc3QgJGhhc19kb3VibGVfZGFzaCAtZXEgMSAmJgorCQkgICAgICAgIGRpZSAiJyRhcmcnIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHZhbGlkIHJldmlzaW9uIgorCQkgICAgYnJlYWsKKwkJfQorCQljYXNlICRiYWRfc2VlbiBpbgorCQkwKSBzdGF0ZT0nYmFkJyA7IGJhZF9zZWVuPTEgOzsKKwkJKikgc3RhdGU9J2dvb2QnIDs7CisJCWVzYWMKKwkJYmlzZWN0X3dyaXRlICIkc3RhdGUiICIkcmV2IiAnbm9sb2cnCisJCXNoaWZ0CisJCTs7CisJICAgIGVzYWMKKwlkb25lCisKKwlzcSAiJEAiID4iJEdJVF9ESVIvQklTRUNUX05BTUVTIgorCWVjaG8gImdpdC1iaXNlY3Qgc3RhcnQkb3JpZ19hcmdzIiA+PiIkR0lUX0RJUi9CSVNFQ1RfTE9HIgorCWJpc2VjdF9hdXRvX25leHQKK30KKworYmlzZWN0X3dyaXRlKCkgeworCXN0YXRlPSIkMSIKKwlyZXY9IiQyIgorCW5vbG9nPSIkMyIKKwljYXNlICIkc3RhdGUiIGluCisJCWJhZCkJCXRhZz0iJHN0YXRlIiA7OworCQlnb29kfHNraXApCXRhZz0iJHN0YXRlIi0iJHJldiIgOzsKKwkJKikJCWRpZSAiQmFkIGJpc2VjdF93cml0ZSBhcmd1bWVudDogJHN0YXRlIiA7OworCWVzYWMKKwlnaXQgdXBkYXRlLXJlZiAicmVmcy9iaXNlY3QvJHRhZyIgIiRyZXYiCisJZWNobyAiIyAkc3RhdGU6ICQoZ2l0IHNob3ctYnJhbmNoICRyZXYpIiA+PiIkR0lUX0RJUi9CSVNFQ1RfTE9HIgorCXRlc3QgLXogIiRub2xvZyIgJiYgZWNobyAiZ2l0LWJpc2VjdCAkc3RhdGUgJHJldiIgPj4iJEdJVF9ESVIvQklTRUNUX0xPRyIKK30KKworYmlzZWN0X3N0YXRlKCkgeworCWJpc2VjdF9hdXRvc3RhcnQKKwlzdGF0ZT0kMQorCWNhc2UgIiQjLCRzdGF0ZSIgaW4KKwkwLCopCisJCWRpZSAiUGxlYXNlIGNhbGwgJ2Jpc2VjdF9zdGF0ZScgd2l0aCBhdCBsZWFzdCBvbmUgYXJndW1lbnQuIiA7OworCTEsYmFkfDEsZ29vZHwxLHNraXApCisJCXJldj0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkgfHwKKwkJCWRpZSAiQmFkIHJldiBpbnB1dDogSEVBRCIKKwkJYmlzZWN0X3dyaXRlICIkc3RhdGUiICIkcmV2IiA7OworCTIsYmFkKQorCQlyZXY9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5ICIkMl57Y29tbWl0fSIpIHx8CisJCQlkaWUgIkJhZCByZXYgaW5wdXQ6ICQyIgorCQliaXNlY3Rfd3JpdGUgIiRzdGF0ZSIgIiRyZXYiIDs7CisJKixnb29kfCosc2tpcCkKKwkJc2hpZnQKKwkJcmV2cz0kKGdpdCByZXYtcGFyc2UgLS1yZXZzLW9ubHkgLS1uby1mbGFncyAiJEAiKSAmJgorCQkJdGVzdCAnJyAhPSAiJHJldnMiIHx8IGRpZSAiQmFkIHJldiBpbnB1dDogJEAiCisJCWZvciByZXYgaW4gJHJldnMKKwkJZG8KKwkJCXJldj0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgIiRyZXZee2NvbW1pdH0iKSB8fAorCQkJCWRpZSAiQmFkIHJldiBjb21taXQ6ICRyZXZee2NvbW1pdH0iCisJCQliaXNlY3Rfd3JpdGUgIiRzdGF0ZSIgIiRyZXYiCisJCWRvbmUgOzsKKwkqKQorCQl1c2FnZSA7OworCWVzYWMKKwliaXNlY3RfYXV0b19uZXh0Cit9CisKK2Jpc2VjdF9uZXh0X2NoZWNrKCkgeworCW1pc3NpbmdfZ29vZD0gbWlzc2luZ19iYWQ9CisJZ2l0IHNob3ctcmVmIC1xIC0tdmVyaWZ5IHJlZnMvYmlzZWN0L2JhZCB8fCBtaXNzaW5nX2JhZD10CisJdGVzdCAtbiAiJChnaXQgZm9yLWVhY2gtcmVmICJyZWZzL2Jpc2VjdC9nb29kLSoiKSIgfHwgbWlzc2luZ19nb29kPXQKKworCWNhc2UgIiRtaXNzaW5nX2dvb2QsJG1pc3NpbmdfYmFkLCQxIiBpbgorCSwsKikKKwkJOiBoYXZlIGJvdGggZ29vZCBhbmQgYmFkIC0gb2sKKwkJOzsKKwkqLCkKKwkJIyBkbyBub3QgaGF2ZSBib3RoIGJ1dCBub3QgYXNrZWQgdG8gZmFpbCAtIGp1c3QgcmVwb3J0LgorCQlmYWxzZQorCQk7OworCXQsLGdvb2QpCisJCSMgaGF2ZSBiYWQgYnV0IG5vdCBnb29kLiAgd2UgY291bGQgYmlzZWN0IGFsdGhvdWdoCisJCSMgdGhpcyBpcyBsZXNzIG9wdGltdW0uCisJCWVjaG8gPiYyICdXYXJuaW5nOiBiaXNlY3Rpbmcgb25seSB3aXRoIGEgYmFkIGNvbW1pdC4nCisJCWlmIHRlc3QgLXQgMAorCQl0aGVuCisJCQlwcmludGYgPiYyICdBcmUgeW91IHN1cmUgW1kvbl0/ICcKKwkJCWNhc2UgIiQocmVhZCB5ZXNubykiIGluIFtObl0qKSBleGl0IDEgOzsgZXNhYworCQlmaQorCQk6IGJpc2VjdCB3aXRob3V0IGdvb2QuLi4KKwkJOzsKKwkqKQorCQlUSEVOPScnCisJCXRlc3QgLWYgIiRHSVRfRElSL0JJU0VDVF9OQU1FUyIgfHwgeworCQkJZWNobyA+JjIgJ1lvdSBuZWVkIHRvIHN0YXJ0IGJ5ICJnaXQgYmlzZWN0IHN0YXJ0Ii4nCisJCQlUSEVOPSd0aGVuICcKKwkJfQorCQllY2hvID4mMiAnWW91ICckVEhFTiduZWVkIHRvIGdpdmUgbWUgYXQgbGVhc3Qgb25lIGdvb2QnIFwKKwkJCSdhbmQgb25lIGJhZCByZXZpc2lvbnMuJworCQllY2hvID4mMiAnKFlvdSBjYW4gdXNlICJnaXQgYmlzZWN0IGJhZCIgYW5kJyBcCisJCQknImdpdCBiaXNlY3QgZ29vZCIgZm9yIHRoYXQuKScKKwkJZXhpdCAxIDs7CisJZXNhYworfQorCitiaXNlY3RfYXV0b19uZXh0KCkgeworCWJpc2VjdF9uZXh0X2NoZWNrICYmIGJpc2VjdF9uZXh0IHx8IDoKK30KKworZmlsdGVyX3NraXBwZWQoKSB7CisJX2V2YWw9IiQxIgorCV9za2lwPSIkMiIKKworCWlmIFsgLXogIiRfc2tpcCIgXTsgdGhlbgorCQlldmFsICRfZXZhbAorCQlyZXR1cm4KKwlmaQorCisJIyBMZXQncyBwYXJzZSB0aGUgb3V0cHV0IG9mOgorCSMgImdpdCByZXYtbGlzdCAtLWJpc2VjdC12YXJzIC0tYmlzZWN0LWFsbCAuLi4iCisJZXZhbCAkX2V2YWwgfCB3aGlsZSByZWFkIGhhc2ggbGluZQorCWRvCisJCWNhc2UgIiRWQVJTLCRGT1VORCwkVFJJRUQsJGhhc2giIGluCisJCQkjIFdlIGRpc3BsYXkgc29tZSB2YXJzLgorCQkJMSwqLCosKikgZWNobyAiJGhhc2ggJGxpbmUiIDs7CisKKwkJCSMgU3BsaXQgbGluZS4KKwkJCSwqLCosLS0tKikgOzsKKworCQkJIyBXZSBoYWQgbm90aGluZyB0byBzZWFyY2guCisJCQksLCxiaXNlY3RfcmV2KikKKwkJCQllY2hvICJiaXNlY3RfcmV2PSIKKwkJCQlWQVJTPTEKKwkJCQk7OworCisJCQkjIFdlIGRpZCBub3QgZmluZCBhIGdvb2QgYmlzZWN0IHJldi4KKwkJCSMgVGhpcyBzaG91bGQgaGFwcGVuIG9ubHkgaWYgdGhlICJiYWQiCisJCQkjIGNvbW1pdCBpcyBhbHNvIGEgInNraXAiIGNvbW1pdC4KKwkJCSwsKixiaXNlY3RfcmV2KikKKwkJCQllY2hvICJiaXNlY3RfcmV2PSRUUklFRCIKKwkJCQlWQVJTPTEKKwkJCQk7OworCisJCQkjIFdlIGFyZSBzZWFyY2hpbmcuCisJCQksLCosKikKKwkJCQlUUklFRD0iJHtUUklFRDorJFRSSUVEfH0kaGFzaCIKKwkJCQljYXNlICIkX3NraXAiIGluCisJCQkJKiRoYXNoKikgOzsKKwkJCQkqKQorCQkJCQllY2hvICJiaXNlY3RfcmV2PSRoYXNoIgorCQkJCQllY2hvICJiaXNlY3RfdHJpZWQ9XCIkVFJJRURcIiIKKwkJCQkJRk9VTkQ9MQorCQkJCQk7OworCQkJCWVzYWMKKwkJCQk7OworCisJCQkjIFdlIGhhdmUgYWxyZWFkeSBmb3VuZCBhIHJldiB0byBiZSB0ZXN0ZWQuCisJCQksMSwqLGJpc2VjdF9yZXYqKSBWQVJTPTEgOzsKKwkJCSwxLCosKikgOzsKKworCQkJIyA/Pz8KKwkJCSopIGRpZSAiZmlsdGVyX3NraXBwZWQgZXJyb3IgIiBcCisJCQkgICAgIlZBUlM6ICckVkFSUycgIiBcCisJCQkgICAgIkZPVU5EOiAnJEZPVU5EJyAiIFwKKwkJCSAgICAiVFJJRUQ6ICckVFJJRUQnICIgXAorCQkJICAgICJoYXNoOiAnJGhhc2gnICIgXAorCQkJICAgICJsaW5lOiAnJGxpbmUnIgorCQkJOzsKKwkJZXNhYworCWRvbmUKK30KKworZXhpdF9pZl9za2lwcGVkX2NvbW1pdHMgKCkgeworCV90cmllZD0kMQorCWlmIGV4cHIgIiRfdHJpZWQiIDogIi4qW3xdLioiID4gL2Rldi9udWxsIDsgdGhlbgorCQllY2hvICJUaGVyZSBhcmUgb25seSAnc2tpcCdwZWQgY29tbWl0IGxlZnQgdG8gdGVzdC4iCisJCWVjaG8gIlRoZSBmaXJzdCBiYWQgY29tbWl0IGNvdWxkIGJlIGFueSBvZjoiCisJCWVjaG8gIiRfdHJpZWQiIHwgdHIgJ1t8XScgJ1tcMDEyXScKKwkJZWNobyAiV2UgY2Fubm90IGJpc2VjdCBtb3JlISIKKwkJZXhpdCAyCisJZmkKK30KKworYmlzZWN0X25leHQoKSB7CisJY2FzZSAiJCMiIGluIDApIDs7ICopIHVzYWdlIDs7IGVzYWMKKwliaXNlY3RfYXV0b3N0YXJ0CisJYmlzZWN0X25leHRfY2hlY2sgZ29vZAorCisJc2tpcD0kKGdpdCBmb3ItZWFjaC1yZWYgLS1mb3JtYXQ9JyUob2JqZWN0bmFtZSknIFwKKwkJInJlZnMvYmlzZWN0L3NraXAtKiIgfCB0ciAnXDAxMicgJyAnKSB8fCBleGl0CisKKwlCSVNFQ1RfT1BUPScnCisJdGVzdCAtbiAiJHNraXAiICYmIEJJU0VDVF9PUFQ9Jy0tYmlzZWN0LWFsbCcKKworCWJhZD0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgcmVmcy9iaXNlY3QvYmFkKSAmJgorCWdvb2Q9JChnaXQgZm9yLWVhY2gtcmVmIC0tZm9ybWF0PSdeJShvYmplY3RuYW1lKScgXAorCQkicmVmcy9iaXNlY3QvZ29vZC0qIiB8IHRyICdcMDEyJyAnICcpICYmCisJZXZhbD0iZ2l0IHJldi1saXN0IC0tYmlzZWN0LXZhcnMgJEJJU0VDVF9PUFQgJGdvb2QgJGJhZCAtLSIgJiYKKwlldmFsPSIkZXZhbCAkKGNhdCAiJEdJVF9ESVIvQklTRUNUX05BTUVTIikiICYmCisJZXZhbD0kKGZpbHRlcl9za2lwcGVkICIkZXZhbCIgIiRza2lwIikgJiYKKwlldmFsICIkZXZhbCIgfHwgZXhpdAorCisJaWYgWyAteiAiJGJpc2VjdF9yZXYiIF07IHRoZW4KKwkJZWNobyAiJGJhZCB3YXMgYm90aCBnb29kIGFuZCBiYWQiCisJCWV4aXQgMQorCWZpCisJaWYgWyAiJGJpc2VjdF9yZXYiID0gIiRiYWQiIF07IHRoZW4KKwkJZXhpdF9pZl9za2lwcGVkX2NvbW1pdHMgIiRiaXNlY3RfdHJpZWQiCisJCWVjaG8gIiRiaXNlY3RfcmV2IGlzIGZpcnN0IGJhZCBjb21taXQiCisJCWdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgJGJpc2VjdF9yZXYKKwkJZXhpdCAwCisJZmkKKworCSMgV2Ugc2hvdWxkIGV4aXQgaGVyZSBvbmx5IGlmIHRoZSAiYmFkIgorCSMgY29tbWl0IGlzIGFsc28gYSAic2tpcCIgY29tbWl0IChzZWUgYWJvdmUpLgorCWV4aXRfaWZfc2tpcHBlZF9jb21taXRzICIkYmlzZWN0X3JldiIKKworCWVjaG8gIkJpc2VjdGluZzogJGJpc2VjdF9uciByZXZpc2lvbnMgbGVmdCB0byB0ZXN0IGFmdGVyIHRoaXMiCisJZ2l0IGJyYW5jaCAtZiBuZXctYmlzZWN0ICIkYmlzZWN0X3JldiIKKwlnaXQgY2hlY2tvdXQgLXEgbmV3LWJpc2VjdCB8fCBleGl0CisJZ2l0IGJyYW5jaCAtTSBuZXctYmlzZWN0IGJpc2VjdAorCWdpdCBzaG93LWJyYW5jaCAiJGJpc2VjdF9yZXYiCit9CisKK2Jpc2VjdF92aXN1YWxpemUoKSB7CisJYmlzZWN0X25leHRfY2hlY2sgZmFpbAorCisJaWYgdGVzdCAkIyA9IDAKKwl0aGVuCisJCWNhc2UgIiR7RElTUExBWStzZXR9JHtNU1lTVEVNK3NldH0ke1NFQ1VSSVRZU0VTU0lPTklEK3NldH0iIGluCisJCScnKQlzZXQgZ2l0IGxvZyA7OworCQlzZXQqKQlzZXQgZ2l0ayA7OworCQllc2FjCisJZWxzZQorCQljYXNlICIkMSIgaW4KKwkJZ2l0Knx0aWcpIDs7CisJCS0qKQlzZXQgZ2l0IGxvZyAiJEAiIDs7CisJCSopCXNldCBnaXQgIiRAIiA7OworCQllc2FjCisJZmkKKworCW5vdD0kKGdpdCBmb3ItZWFjaC1yZWYgLS1mb3JtYXQ9JyUocmVmbmFtZSknICJyZWZzL2Jpc2VjdC9nb29kLSoiKQorCWV2YWwgJyIkQCInIHJlZnMvYmlzZWN0L2JhZCAtLW5vdCAkbm90IC0tICQoY2F0ICIkR0lUX0RJUi9CSVNFQ1RfTkFNRVMiKQorfQorCitiaXNlY3RfcmVzZXQoKSB7CisJdGVzdCAtZiAiJEdJVF9ESVIvQklTRUNUX05BTUVTIiB8fCB7CisJCWVjaG8gIldlIGFyZSBub3QgYmlzZWN0aW5nLiIKKwkJcmV0dXJuCisJfQorCWNhc2UgIiQjIiBpbgorCTApIGlmIFsgLXMgIiRHSVRfRElSL0JJU0VDVF9TVEFSVCIgXTsgdGhlbgorCSAgICAgICBicmFuY2g9YGNhdCAiJEdJVF9ESVIvQklTRUNUX1NUQVJUImAKKwkgICBlbHNlCisJICAgICAgIGJyYW5jaD1tYXN0ZXIKKwkgICBmaSA7OworCTEpIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0IC0tICJyZWZzL2hlYWRzLyQxIiB8fAorCSAgICAgICBkaWUgIiQxIGRvZXMgbm90IHNlZW0gdG8gYmUgYSB2YWxpZCBicmFuY2giCisJICAgYnJhbmNoPSIkMSIgOzsKKwkqKQorCSAgICB1c2FnZSA7OworCWVzYWMKKwlpZiBnaXQgY2hlY2tvdXQgIiRicmFuY2giOyB0aGVuCisJCSMgQ2xlYW51cCBoZWFkLW5hbWUgaWYgaXQgZ290IGxlZnQgYnkgYW4gb2xkIHZlcnNpb24gb2YgZ2l0LWJpc2VjdAorCQlybSAtZiAiJEdJVF9ESVIvaGVhZC1uYW1lIgorCQlybSAtZiAiJEdJVF9ESVIvQklTRUNUX1NUQVJUIgorCQliaXNlY3RfY2xlYW5fc3RhdGUKKwlmaQorfQorCitiaXNlY3RfY2xlYW5fc3RhdGUoKSB7CisJIyBUaGVyZSBtYXkgYmUgc29tZSByZWZzIHBhY2tlZCBkdXJpbmcgYmlzZWN0aW9uLgorCWdpdCBmb3ItZWFjaC1yZWYgLS1mb3JtYXQ9JyUocmVmbmFtZSkgJShvYmplY3RuYW1lKScgcmVmcy9iaXNlY3QvXCogcmVmcy9oZWFkcy9iaXNlY3QgfAorCXdoaWxlIHJlYWQgcmVmIGhhc2gKKwlkbworCQlnaXQgdXBkYXRlLXJlZiAtZCAkcmVmICRoYXNoCisJZG9uZQorCXJtIC1mICIkR0lUX0RJUi9CSVNFQ1RfTE9HIgorCXJtIC1mICIkR0lUX0RJUi9CSVNFQ1RfTkFNRVMiCisJcm0gLWYgIiRHSVRfRElSL0JJU0VDVF9SVU4iCit9CisKK2Jpc2VjdF9yZXBsYXkgKCkgeworCXRlc3QgLXIgIiQxIiB8fCBkaWUgImNhbm5vdCByZWFkICQxIGZvciByZXBsYXlpbmciCisJYmlzZWN0X3Jlc2V0CisJd2hpbGUgcmVhZCBiaXNlY3QgY29tbWFuZCByZXYKKwlkbworCQl0ZXN0ICIkYmlzZWN0IiA9ICJnaXQtYmlzZWN0IiB8fCBjb250aW51ZQorCQljYXNlICIkY29tbWFuZCIgaW4KKwkJc3RhcnQpCisJCQljbWQ9ImJpc2VjdF9zdGFydCAkcmV2IgorCQkJZXZhbCAiJGNtZCIgOzsKKwkJZ29vZHxiYWR8c2tpcCkKKwkJCWJpc2VjdF93cml0ZSAiJGNvbW1hbmQiICIkcmV2IiA7OworCQkqKQorCQkJZGllICI/PyB3aGF0IGFyZSB5b3UgdGFsa2luZyBhYm91dD8iIDs7CisJCWVzYWMKKwlkb25lIDwiJDEiCisJYmlzZWN0X2F1dG9fbmV4dAorfQorCitiaXNlY3RfcnVuICgpIHsKKyAgICBiaXNlY3RfbmV4dF9jaGVjayBmYWlsCisKKyAgICB3aGlsZSB0cnVlCisgICAgZG8KKyAgICAgIGVjaG8gInJ1bm5pbmcgJEAiCisgICAgICAiJEAiCisgICAgICByZXM9JD8KKworICAgICAgIyBDaGVjayBmb3IgcmVhbGx5IGJhZCBydW4gZXJyb3IuCisgICAgICBpZiBbICRyZXMgLWx0IDAgLW8gJHJlcyAtZ2UgMTI4IF07IHRoZW4KKwkgIGVjaG8gPiYyICJiaXNlY3QgcnVuIGZhaWxlZDoiCisJICBlY2hvID4mMiAiZXhpdCBjb2RlICRyZXMgZnJvbSAnJEAnIGlzIDwgMCBvciA+PSAxMjgiCisJICBleGl0ICRyZXMKKyAgICAgIGZpCisKKyAgICAgICMgRmluZCBjdXJyZW50IHN0YXRlIGRlcGVuZGluZyBvbiBydW4gc3VjY2VzcyBvciBmYWlsdXJlLgorICAgICAgIyBBIHNwZWNpYWwgZXhpdCBjb2RlIG9mIDEyNSBtZWFucyBjYW5ub3QgdGVzdC4KKyAgICAgIGlmIFsgJHJlcyAtZXEgMTI1IF07IHRoZW4KKwkgIHN0YXRlPSdza2lwJworICAgICAgZWxpZiBbICRyZXMgLWd0IDAgXTsgdGhlbgorCSAgc3RhdGU9J2JhZCcKKyAgICAgIGVsc2UKKwkgIHN0YXRlPSdnb29kJworICAgICAgZmkKKworICAgICAgIyBXZSBoYXZlIHRvIHVzZSBhIHN1YnNoZWxsIGJlY2F1c2UgImJpc2VjdF9zdGF0ZSIgY2FuIGV4aXQuCisgICAgICAoIGJpc2VjdF9zdGF0ZSAkc3RhdGUgPiAiJEdJVF9ESVIvQklTRUNUX1JVTiIgKQorICAgICAgcmVzPSQ/CisKKyAgICAgIGNhdCAiJEdJVF9ESVIvQklTRUNUX1JVTiIKKworICAgICAgaWYgZ3JlcCAiZmlyc3QgYmFkIGNvbW1pdCBjb3VsZCBiZSBhbnkgb2YiICIkR0lUX0RJUi9CSVNFQ1RfUlVOIiBcCisJCT4gL2Rldi9udWxsOyB0aGVuCisJICBlY2hvID4mMiAiYmlzZWN0IHJ1biBjYW5ub3QgY29udGludWUgYW55IG1vcmUiCisJICBleGl0ICRyZXMKKyAgICAgIGZpCisKKyAgICAgIGlmIFsgJHJlcyAtbmUgMCBdOyB0aGVuCisJICBlY2hvID4mMiAiYmlzZWN0IHJ1biBmYWlsZWQ6IgorCSAgZWNobyA+JjIgIidiaXNlY3Rfc3RhdGUgJHN0YXRlJyBleGl0ZWQgd2l0aCBlcnJvciBjb2RlICRyZXMiCisJICBleGl0ICRyZXMKKyAgICAgIGZpCisKKyAgICAgIGlmIGdyZXAgImlzIGZpcnN0IGJhZCBjb21taXQiICIkR0lUX0RJUi9CSVNFQ1RfUlVOIiA+IC9kZXYvbnVsbDsgdGhlbgorCSAgZWNobyAiYmlzZWN0IHJ1biBzdWNjZXNzIgorCSAgZXhpdCAwOworICAgICAgZmkKKworICAgIGRvbmUKK30KKworCitjYXNlICIkIyIgaW4KKzApCisgICAgdXNhZ2UgOzsKKyopCisgICAgY21kPSIkMSIKKyAgICBzaGlmdAorICAgIGNhc2UgIiRjbWQiIGluCisgICAgc3RhcnQpCisgICAgICAgIGJpc2VjdF9zdGFydCAiJEAiIDs7CisgICAgYmFkfGdvb2R8c2tpcCkKKyAgICAgICAgYmlzZWN0X3N0YXRlICIkY21kIiAiJEAiIDs7CisgICAgbmV4dCkKKyAgICAgICAgIyBOb3Qgc3VyZSB3ZSB3YW50ICJuZXh0IiBhdCB0aGUgVUkgbGV2ZWwgYW55bW9yZS4KKyAgICAgICAgYmlzZWN0X25leHQgIiRAIiA7OworICAgIHZpc3VhbGl6ZXx2aWV3KQorCWJpc2VjdF92aXN1YWxpemUgIiRAIiA7OworICAgIHJlc2V0KQorICAgICAgICBiaXNlY3RfcmVzZXQgIiRAIiA7OworICAgIHJlcGxheSkKKwliaXNlY3RfcmVwbGF5ICIkQCIgOzsKKyAgICBsb2cpCisJY2F0ICIkR0lUX0RJUi9CSVNFQ1RfTE9HIiA7OworICAgIHJ1bikKKyAgICAgICAgYmlzZWN0X3J1biAiJEAiIDs7CisgICAgKikKKyAgICAgICAgdXNhZ2UgOzsKKyAgICBlc2FjCitlc2FjCmRpZmYgLS1naXQgYS9naXQtY2xvbmUuc2ggYi9naXQtY2xvbmUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjYzNjE1OQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1jbG9uZS5zaApAQCAtMCwwICsxLDUyMiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSwgTGludXMgVG9ydmFsZHMKKyMgQ29weXJpZ2h0IChjKSAyMDA1LCBKdW5pbyBDIEhhbWFubworIworIyBDbG9uZSBhIHJlcG9zaXRvcnkgaW50byBhIGRpZmZlcmVudCBkaXJlY3RvcnkgdGhhdCBkb2VzIG5vdCB5ZXQgZXhpc3QuCisKKyMgU2VlIGdpdC1zaC1zZXR1cCB3aHkuCit1bnNldCBDRFBBVEgKKworT1BUSU9OU19TUEVDPSJcCitnaXQtY2xvbmUgW29wdGlvbnNdIFstLV0gPHJlcG8+IFs8ZGlyPl0KKy0tCituLG5vLWNoZWNrb3V0ICAgICAgICBkb24ndCBjcmVhdGUgYSBjaGVja291dAorYmFyZSAgICAgICAgICAgICAgICAgY3JlYXRlIGEgYmFyZSByZXBvc2l0b3J5CituYWtlZCAgICAgICAgICAgICAgICBjcmVhdGUgYSBiYXJlIHJlcG9zaXRvcnkKK2wsbG9jYWwgICAgICAgICAgICAgIHRvIGNsb25lIGZyb20gYSBsb2NhbCByZXBvc2l0b3J5Cituby1oYXJkbGlua3MgICAgICAgICBkb24ndCB1c2UgbG9jYWwgaGFyZGxpbmtzLCBhbHdheXMgY29weQorcyxzaGFyZWQgICAgICAgICAgICAgc2V0dXAgYXMgYSBzaGFyZWQgcmVwb3NpdG9yeQordGVtcGxhdGU9ICAgICAgICAgICAgcGF0aCB0byB0aGUgdGVtcGxhdGUgZGlyZWN0b3J5CitxLHF1aWV0ICAgICAgICAgICAgICBiZSBxdWlldAorcmVmZXJlbmNlPSAgICAgICAgICAgcmVmZXJlbmNlIHJlcG9zaXRvcnkKK28sb3JpZ2luPSAgICAgICAgICAgIHVzZSA8bmFtZT4gaW5zdGVhZCBvZiAnb3JpZ2luJyB0byB0cmFjayB1cHN0cmVhbQordSx1cGxvYWQtcGFjaz0gICAgICAgcGF0aCB0byBnaXQtdXBsb2FkLXBhY2sgb24gdGhlIHJlbW90ZQorZGVwdGg9ICAgICAgICAgICAgICAgY3JlYXRlIGEgc2hhbGxvdyBjbG9uZSBvZiB0aGF0IGRlcHRoCisKK3VzZS1zZXBhcmF0ZS1yZW1vdGUgIGNvbXBhdGliaWxpdHksIGRvIG5vdCB1c2UKK25vLXNlcGFyYXRlLXJlbW90ZSAgIGNvbXBhdGliaWxpdHksIGRvIG5vdCB1c2UiCisKK2RpZSgpIHsKKwllY2hvID4mMiAiJEAiCisJZXhpdCAxCit9CisKK3VzYWdlKCkgeworCWV4ZWMgIiQwIiAtaAorfQorCitldmFsICIkKGVjaG8gIiRPUFRJT05TX1NQRUMiIHwgZ2l0IHJldi1wYXJzZSAtLXBhcnNlb3B0IC0tICIkQCIgfHwgZWNobyBleGl0ICQ/KSIKKworZ2V0X3JlcG9fYmFzZSgpIHsKKwkoCisJCWNkICJgL2Jpbi9wd2RgIiAmJgorCQljZCAiJDEiIHx8IGNkICIkMS5naXQiICYmCisJCXsKKwkJCWNkIC5naXQKKwkJCXB3ZAorCQl9CisJKSAyPi9kZXYvbnVsbAorfQorCitpZiBbIC1uICIkR0lUX1NTTF9OT19WRVJJRlkiIC1vIFwKKwkiYGdpdCBjb25maWcgLS1ib29sIGh0dHAuc3NsVmVyaWZ5YCIgPSBmYWxzZSBdOyB0aGVuCisgICAgY3VybF9leHRyYV9hcmdzPSItayIKK2ZpCisKK2h0dHBfZmV0Y2ggKCkgeworCSMgJDEgPSBSZW1vdGUsICQyID0gTG9jYWwKKwljdXJsIC1uc2ZMICRjdXJsX2V4dHJhX2FyZ3MgIiQxIiA+IiQyIgorCWN1cmxfZXhpdF9zdGF0dXM9JD8KKwljYXNlICRjdXJsX2V4aXRfc3RhdHVzIGluCisJMTI2fDEyNykgZXhpdCA7OworCSopCSByZXR1cm4gJGN1cmxfZXhpdF9zdGF0dXMgOzsKKwllc2FjCit9CisKK2Nsb25lX2R1bWJfaHR0cCAoKSB7CisJIyAkMSAtIHJlbW90ZSwgJDIgLSBsb2NhbAorCWNkICIkMiIgJiYKKwljbG9uZV90bXA9IiRHSVRfRElSL2Nsb25lLXRtcCIgJiYKKwlta2RpciAtcCAiJGNsb25lX3RtcCIgfHwgZXhpdCAxCisJaWYgWyAtbiAiJEdJVF9DVVJMX0ZUUF9OT19FUFNWIiAtbyBcCisJCSJgZ2l0IGNvbmZpZyAtLWJvb2wgaHR0cC5ub0VQU1ZgIiA9IHRydWUgXTsgdGhlbgorCQljdXJsX2V4dHJhX2FyZ3M9IiR7Y3VybF9leHRyYV9hcmdzfSAtLWRpc2FibGUtZXBzdiIKKwlmaQorCWh0dHBfZmV0Y2ggIiQxL2luZm8vcmVmcyIgIiRjbG9uZV90bXAvcmVmcyIgfHwKKwkJZGllICJDYW5ub3QgZ2V0IHJlbW90ZSByZXBvc2l0b3J5IGluZm9ybWF0aW9uLgorUGVyaGFwcyBnaXQtdXBkYXRlLXNlcnZlci1pbmZvIG5lZWRzIHRvIGJlIHJ1biB0aGVyZT8iCisJdGVzdCAieiRxdWlldCIgPSB6ICYmIHY9LXYgfHwgdj0KKwl3aGlsZSByZWFkIHNoYTEgcmVmbmFtZQorCWRvCisJCW5hbWU9YGV4cHIgInokcmVmbmFtZSIgOiAnenJlZnMvXCguKlwpJ2AgJiYKKwkJY2FzZSAiJG5hbWUiIGluCisJCSpeKikJY29udGludWU7OworCQllc2FjCisJCWNhc2UgIiRiYXJlLCRuYW1lIiBpbgorCQl5ZXMsKiB8ICxoZWFkcy8qIHwgLHRhZ3MvKikgOzsKKwkJKikJY29udGludWUgOzsKKwkJZXNhYworCQlpZiB0ZXN0IC1uICIkdXNlX3NlcGFyYXRlX3JlbW90ZSIgJiYKKwkJICAgYnJhbmNoX25hbWU9YGV4cHIgInokbmFtZSIgOiAnemhlYWRzL1woLipcKSdgCisJCXRoZW4KKwkJCXRuYW1lPSJyZW1vdGVzLyRvcmlnaW4vJGJyYW5jaF9uYW1lIgorCQllbHNlCisJCQl0bmFtZT0kbmFtZQorCQlmaQorCQlnaXQtaHR0cC1mZXRjaCAkdiAtYSAtdyAiJHRuYW1lIiAiJHNoYTEiICIkMSIgfHwgZXhpdCAxCisJZG9uZSA8IiRjbG9uZV90bXAvcmVmcyIKKwlybSAtZnIgIiRjbG9uZV90bXAiCisJaHR0cF9mZXRjaCAiJDEvSEVBRCIgIiRHSVRfRElSL1JFTU9URV9IRUFEIiB8fAorCXJtIC1mICIkR0lUX0RJUi9SRU1PVEVfSEVBRCIKKwlpZiB0ZXN0IC1mICIkR0lUX0RJUi9SRU1PVEVfSEVBRCI7IHRoZW4KKwkJaGVhZF9zaGExPWBjYXQgIiRHSVRfRElSL1JFTU9URV9IRUFEImAKKwkJY2FzZSAiJGhlYWRfc2hhMSIgaW4KKwkJJ3JlZjogcmVmcy8nKikKKwkJCTs7CisJCSopCisJCQlnaXQtaHR0cC1mZXRjaCAkdiAtYSAiJGhlYWRfc2hhMSIgIiQxIiB8fAorCQkJcm0gLWYgIiRHSVRfRElSL1JFTU9URV9IRUFEIgorCQkJOzsKKwkJZXNhYworCWZpCit9CisKK3F1aWV0PQorbG9jYWw9bm8KK3VzZV9sb2NhbF9oYXJkbGluaz15ZXMKK2xvY2FsX3NoYXJlZD1ubwordW5zZXQgdGVtcGxhdGUKK25vX2NoZWNrb3V0PQordXBsb2FkX3BhY2s9CitiYXJlPQorcmVmZXJlbmNlPQorb3JpZ2luPQorb3JpZ2luX292ZXJyaWRlPQordXNlX3NlcGFyYXRlX3JlbW90ZT10CitkZXB0aD0KK25vX3Byb2dyZXNzPQorbG9jYWxfZXhwbGljaXRseV9hc2tlZF9mb3I9Cit0ZXN0IC10IDEgfHwgbm9fcHJvZ3Jlc3M9LS1uby1wcm9ncmVzcworCit3aGlsZSB0ZXN0ICQjICE9IDAKK2RvCisJY2FzZSAiJDEiIGluCisJLW58LS1uby1jaGVja291dCkKKwkJbm9fY2hlY2tvdXQ9eWVzIDs7CisJLS1uYWtlZHwtLWJhcmUpCisJCWJhcmU9eWVzIDs7CisJLWx8LS1sb2NhbCkKKwkJbG9jYWxfZXhwbGljaXRseV9hc2tlZF9mb3I9eWVzCisJCXVzZV9sb2NhbF9oYXJkbGluaz15ZXMKKwkJOzsKKwktLW5vLWhhcmRsaW5rcykKKwkJdXNlX2xvY2FsX2hhcmRsaW5rPW5vIDs7CisJLXN8LS1zaGFyZWQpCisJCWxvY2FsX3NoYXJlZD15ZXMgOzsKKwktLXRlbXBsYXRlKQorCQlzaGlmdDsgdGVtcGxhdGU9Ii0tdGVtcGxhdGU9JDEiIDs7CisJLXF8LS1xdWlldCkKKwkJcXVpZXQ9LXEgOzsKKwktLXVzZS1zZXBhcmF0ZS1yZW1vdGV8LS1uby1zZXBhcmF0ZS1yZW1vdGUpCisJCWRpZSAiY2xvbmVzIGFyZSBhbHdheXMgbWFkZSB3aXRoIHNlcGFyYXRlLXJlbW90ZSBsYXlvdXQiIDs7CisJLS1yZWZlcmVuY2UpCisJCXNoaWZ0OyByZWZlcmVuY2U9IiQxIiA7OworCS1vfC0tb3JpZ2luKQorCQlzaGlmdDsKKwkJY2FzZSAiJDEiIGluCisJCScnKQorCQkgICAgdXNhZ2UgOzsKKwkJKi8qKQorCQkgICAgZGllICInJDEnIGlzIG5vdCBzdWl0YWJsZSBmb3IgYW4gb3JpZ2luIG5hbWUiCisJCWVzYWMKKwkJZ2l0IGNoZWNrLXJlZi1mb3JtYXQgImhlYWRzLyQxIiB8fAorCQkgICAgZGllICInJDEnIGlzIG5vdCBzdWl0YWJsZSBmb3IgYSBicmFuY2ggbmFtZSIKKwkJdGVzdCAteiAiJG9yaWdpbl9vdmVycmlkZSIgfHwKKwkJICAgIGRpZSAiRG8gbm90IGdpdmUgbW9yZSB0aGFuIG9uZSAtLW9yaWdpbiBvcHRpb25zLiIKKwkJb3JpZ2luX292ZXJyaWRlPXllcworCQlvcmlnaW49IiQxIgorCQk7OworCS11fC0tdXBsb2FkLXBhY2spCisJCXNoaWZ0CisJCXVwbG9hZF9wYWNrPSItLXVwbG9hZC1wYWNrPSQxIiA7OworCS0tZGVwdGgpCisJCXNoaWZ0CisJCWRlcHRoPSItLWRlcHRoPSQxIiA7OworCS0tKQorCQlzaGlmdAorCQlicmVhayA7OworCSopCisJCXVzYWdlIDs7CisJZXNhYworCXNoaWZ0Citkb25lCisKK3JlcG89IiQxIgordGVzdCAtbiAiJHJlcG8iIHx8CisgICAgZGllICd5b3UgbXVzdCBzcGVjaWZ5IGEgcmVwb3NpdG9yeSB0byBjbG9uZS4nCisKKyMgLS1iYXJlIGltcGxpZXMgLS1uby1jaGVja291dCBhbmQgLS1uby1zZXBhcmF0ZS1yZW1vdGUKK2lmIHRlc3QgeWVzID0gIiRiYXJlIgordGhlbgorCWlmIHRlc3QgeWVzID0gIiRvcmlnaW5fb3ZlcnJpZGUiCisJdGhlbgorCQlkaWUgJy0tYmFyZSBhbmQgLS1vcmlnaW4gJG9yaWdpbiBvcHRpb25zIGFyZSBpbmNvbXBhdGlibGUuJworCWZpCisJbm9fY2hlY2tvdXQ9eWVzCisJdXNlX3NlcGFyYXRlX3JlbW90ZT0KK2ZpCisKK2lmIHRlc3QgLXogIiRvcmlnaW4iCit0aGVuCisJb3JpZ2luPW9yaWdpbgorZmkKKworIyBUdXJuIHRoZSBzb3VyY2UgaW50byBhbiBhYnNvbHV0ZSBwYXRoIGlmCisjIGl0IGlzIGxvY2FsCitpZiBiYXNlPSQoZ2V0X3JlcG9fYmFzZSAiJHJlcG8iKTsgdGhlbgorCXJlcG89IiRiYXNlIgorCWlmIHRlc3QgLXogIiRkZXB0aCIKKwl0aGVuCisJCWxvY2FsPXllcworCWZpCitlbGlmIHRlc3QgLWYgIiRyZXBvIgordGhlbgorCWNhc2UgIiRyZXBvIiBpbiAvKikgOzsgKikgcmVwbz0iJFBXRC8kcmVwbyIgOzsgZXNhYworZmkKKworIyBEZWNpZGUgdGhlIGRpcmVjdG9yeSBuYW1lIG9mIHRoZSBuZXcgcmVwb3NpdG9yeQoraWYgdGVzdCAtbiAiJDIiCit0aGVuCisJZGlyPSIkMiIKK2Vsc2UKKwkjIERlcml2ZSBvbmUgZnJvbSB0aGUgcmVwb3NpdG9yeSBuYW1lCisJIyBUcnkgdXNpbmcgImh1bWFuaXNoIiBwYXJ0IG9mIHNvdXJjZSByZXBvIGlmIHVzZXIgZGlkbid0IHNwZWNpZnkgb25lCisJaWYgdGVzdCAtZiAiJHJlcG8iCisJdGhlbgorCQkjIENsb25pbmcgZnJvbSBhIGJ1bmRsZQorCQlkaXI9JChlY2hvICIkcmVwbyIgfCBzZWQgLWUgJ3N8LypcLmJ1bmRsZSR8fCcgLWUgJ3N8LiovfHxnJykKKwllbHNlCisJCWRpcj0kKGVjaG8gIiRyZXBvIiB8CisJCQlzZWQgLWUgJ3N8LyR8fCcgLWUgJ3N8OiovKlwuZ2l0JHx8JyAtZSAnc3wuKlsvOl18fGcnKQorCWZpCitmaQorCitbIC1lICIkZGlyIiBdICYmIGRpZSAiZGVzdGluYXRpb24gZGlyZWN0b3J5ICckZGlyJyBhbHJlYWR5IGV4aXN0cy4iCitbIHllcyA9ICIkYmFyZSIgXSAmJiB1bnNldCBHSVRfV09SS19UUkVFCitbIC1uICIkR0lUX1dPUktfVFJFRSIgXSAmJiBbIC1lICIkR0lUX1dPUktfVFJFRSIgXSAmJgorZGllICJ3b3JraW5nIHRyZWUgJyRHSVRfV09SS19UUkVFJyBhbHJlYWR5IGV4aXN0cy4iCitEPQorVz0KK2NsZWFudXAoKSB7CisJZXJyPSQ/CisJdGVzdCAteiAiJEQiICYmIHJtIC1yZiAiJGRpciIKKwl0ZXN0IC16ICIkVyIgJiYgdGVzdCAtbiAiJEdJVF9XT1JLX1RSRUUiICYmIHJtIC1yZiAiJEdJVF9XT1JLX1RSRUUiCisJY2QgLi4KKwl0ZXN0IC1uICIkRCIgJiYgcm0gLXJmICIkRCIKKwl0ZXN0IC1uICIkVyIgJiYgcm0gLXJmICIkVyIKKwlleGl0ICRlcnIKK30KK3RyYXAgY2xlYW51cCAwCitta2RpciAtcCAiJGRpciIgJiYgRD0kKGNkICIkZGlyIiAmJiBwd2QpIHx8IHVzYWdlCit0ZXN0IC1uICIkR0lUX1dPUktfVFJFRSIgJiYgbWtkaXIgLXAgIiRHSVRfV09SS19UUkVFIiAmJgorVz0kKGNkICIkR0lUX1dPUktfVFJFRSIgJiYgcHdkKSAmJiBHSVRfV09SS19UUkVFPSIkVyIgJiYgZXhwb3J0IEdJVF9XT1JLX1RSRUUKK2lmIHRlc3QgeWVzID0gIiRiYXJlIiB8fCB0ZXN0IC1uICIkR0lUX1dPUktfVFJFRSI7IHRoZW4KKwlHSVRfRElSPSIkRCIKK2Vsc2UKKwlHSVRfRElSPSIkRC8uZ2l0IgorZmkgJiYKK2V4cG9ydCBHSVRfRElSICYmCitHSVRfQ09ORklHPSIkR0lUX0RJUi9jb25maWciIGdpdC1pbml0ICRxdWlldCAke3RlbXBsYXRlKyIkdGVtcGxhdGUifSB8fCB1c2FnZQorCitpZiB0ZXN0IC1uICIkYmFyZSIKK3RoZW4KKwlHSVRfQ09ORklHPSIkR0lUX0RJUi9jb25maWciIGdpdCBjb25maWcgY29yZS5iYXJlIHRydWUKK2ZpCisKK2lmIHRlc3QgLW4gIiRyZWZlcmVuY2UiCit0aGVuCisJcmVmX2dpdD0KKwlpZiB0ZXN0IC1kICIkcmVmZXJlbmNlIgorCXRoZW4KKwkJaWYgdGVzdCAtZCAiJHJlZmVyZW5jZS8uZ2l0L29iamVjdHMiCisJCXRoZW4KKwkJCXJlZl9naXQ9IiRyZWZlcmVuY2UvLmdpdCIKKwkJZWxpZiB0ZXN0IC1kICIkcmVmZXJlbmNlL29iamVjdHMiCisJCXRoZW4KKwkJCXJlZl9naXQ9IiRyZWZlcmVuY2UiCisJCWZpCisJZmkKKwlpZiB0ZXN0IC1uICIkcmVmX2dpdCIKKwl0aGVuCisJCXJlZl9naXQ9JChjZCAiJHJlZl9naXQiICYmIHB3ZCkKKwkJZWNobyAiJHJlZl9naXQvb2JqZWN0cyIgPiIkR0lUX0RJUi9vYmplY3RzL2luZm8vYWx0ZXJuYXRlcyIKKwkJKAorCQkJR0lUX0RJUj0iJHJlZl9naXQiIGdpdCBmb3ItZWFjaC1yZWYgXAorCQkJCS0tZm9ybWF0PSclKG9iamVjdG5hbWUpICUoKm9iamVjdG5hbWUpJworCQkpIHwKKwkJd2hpbGUgcmVhZCBhIGIKKwkJZG8KKwkJCXRlc3QgLXogIiRhIiB8fAorCQkJZ2l0IHVwZGF0ZS1yZWYgInJlZnMvcmVmZXJlbmNlLXRtcC8kYSIgIiRhIgorCQkJdGVzdCAteiAiJGIiIHx8CisJCQlnaXQgdXBkYXRlLXJlZiAicmVmcy9yZWZlcmVuY2UtdG1wLyRiIiAiJGIiCisJCWRvbmUKKwllbHNlCisJCWRpZSAicmVmZXJlbmNlIHJlcG9zaXRvcnkgJyRyZWZlcmVuY2UnIGlzIG5vdCBhIGxvY2FsIGRpcmVjdG9yeS4iCisJZmkKK2ZpCisKK3JtIC1mICIkR0lUX0RJUi9DTE9ORV9IRUFEIgorCisjIFdlIGRvIGxvY2FsIG1hZ2ljIG9ubHkgd2hlbiB0aGUgdXNlciB0ZWxscyB1cyB0by4KK2Nhc2UgIiRsb2NhbCIgaW4KK3llcykKKwkoIGNkICIkcmVwby9vYmplY3RzIiApIHx8CisJCWRpZSAiY2Fubm90IGNoZGlyIHRvIGxvY2FsICckcmVwby9vYmplY3RzJy4iCisKKwlpZiB0ZXN0ICIkbG9jYWxfc2hhcmVkIiA9IHllcworCXRoZW4KKwkJbWtkaXIgLXAgIiRHSVRfRElSL29iamVjdHMvaW5mbyIKKwkJZWNobyAiJHJlcG8vb2JqZWN0cyIgPj4iJEdJVF9ESVIvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXMiCisJZWxzZQorCQljcGlvX3F1aWV0X2ZsYWc9IiIKKwkJY3BpbyAtLWhlbHAgMj4mMSB8IGdyZXAgLS0gLS1xdWlldCA+L2Rldi9udWxsICYmIFwKKwkJCWNwaW9fcXVpZXRfZmxhZz0tLXF1aWV0CisJCWw9ICYmCisJCWlmIHRlc3QgIiR1c2VfbG9jYWxfaGFyZGxpbmsiID0geWVzCisJCXRoZW4KKwkJCSMgU2VlIGlmIHdlIGNhbiBoYXJkbGluayBhbmQgZHJvcCAibCIgaWYgbm90LgorCQkJc2FtcGxlX2ZpbGU9JChjZCAiJHJlcG8iICYmIFwKKwkJCQkgICAgICBmaW5kIG9iamVjdHMgLXR5cGUgZiAtcHJpbnQgfCBzZWQgLWUgMXEpCisJCQkjIG9iamVjdHMgZGlyZWN0b3J5IHNob3VsZCBub3QgYmUgZW1wdHkgYmVjYXVzZQorCQkJIyB3ZSBhcmUgY2xvbmluZyEKKwkJCXRlc3QgLWYgIiRyZXBvLyRzYW1wbGVfZmlsZSIgfHwKKwkJCQlkaWUgImZhdGFsOiBjYW5ub3QgY2xvbmUgZW1wdHkgcmVwb3NpdG9yeSIKKwkJCWlmIGxuICIkcmVwby8kc2FtcGxlX2ZpbGUiICIkR0lUX0RJUi9vYmplY3RzL3NhbXBsZSIgMj4vZGV2L251bGwKKwkJCXRoZW4KKwkJCQlybSAtZiAiJEdJVF9ESVIvb2JqZWN0cy9zYW1wbGUiCisJCQkJbD1sCisJCQllbGlmIHRlc3QgLW4gIiRsb2NhbF9leHBsaWNpdGx5X2Fza2VkX2ZvciIKKwkJCXRoZW4KKwkJCQllY2hvID4mMiAiV2FybmluZzogLWwgYXNrZWQgYnV0IGNhbm5vdCBoYXJkbGluayB0byAkcmVwbyIKKwkJCWZpCisJCWZpICYmCisJCWNkICIkcmVwbyIgJiYKKwkJZmluZCBvYmplY3RzIC1kZXB0aCAtcHJpbnQgfCBjcGlvICRjcGlvX3F1aWV0X2ZsYWcgLXB1bWQkbCAiJEdJVF9ESVIvIiB8fCBcCisJCQlleGl0IDEKKwlmaQorCWdpdC1scy1yZW1vdGUgIiRyZXBvIiA+IiRHSVRfRElSL0NMT05FX0hFQUQiIHx8IGV4aXQgMQorCTs7CisqKQorCWNhc2UgIiRyZXBvIiBpbgorCXJzeW5jOi8vKikKKwkJY2FzZSAiJGRlcHRoIiBpbgorCQkiIikgOzsKKwkJKikgZGllICJzaGFsbG93IG92ZXIgcnN5bmMgbm90IHN1cHBvcnRlZCIgOzsKKwkJZXNhYworCQlyc3luYyAkcXVpZXQgLWF2IC0taWdub3JlLWV4aXN0aW5nICBcCisJCQktLWV4Y2x1ZGUgaW5mbyAiJHJlcG8vb2JqZWN0cy8iICIkR0lUX0RJUi9vYmplY3RzLyIgfHwKKwkJZXhpdAorCQkjIExvb2sgYXQgb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXMgZm9yIHJzeW5jIC0tIGh0dHAgd2lsbAorCQkjIHN1cHBvcnQgaXQgbmF0aXZlbHkgYW5kIGdpdCBuYXRpdmUgb25lcyB3aWxsIGRvIGl0IG9uIHRoZQorCQkjIHJlbW90ZSBlbmQuICBOb3QgaGF2aW5nIHRoYXQgZmlsZSBpcyBub3QgYSBjcmltZS4KKwkJcnN5bmMgLXEgIiRyZXBvL29iamVjdHMvaW5mby9hbHRlcm5hdGVzIiBcCisJCQkiJEdJVF9ESVIvVE1QX0FMVCIgMj4vZGV2L251bGwgfHwKKwkJCXJtIC1mICIkR0lUX0RJUi9UTVBfQUxUIgorCQlpZiB0ZXN0IC1mICIkR0lUX0RJUi9UTVBfQUxUIgorCQl0aGVuCisJCSAgICAoIGNkICIkRCIgJiYKKwkJICAgICAgLiBnaXQtcGFyc2UtcmVtb3RlICYmCisJCSAgICAgIHJlc29sdmVfYWx0ZXJuYXRlcyAiJHJlcG8iIDwiJEdJVF9ESVIvVE1QX0FMVCIgKSB8CisJCSAgICB3aGlsZSByZWFkIGFsdAorCQkgICAgZG8KKwkJCWNhc2UgIiRhbHQiIGluICdiYWQgYWx0ZXJuYXRlOiAnKikgZGllICIkYWx0Ijs7IGVzYWMKKwkJCWNhc2UgIiRxdWlldCIgaW4KKwkJCScnKQllY2hvID4mMiAiR2V0dGluZyBhbHRlcm5hdGU6ICRhbHQiIDs7CisJCQllc2FjCisJCQlyc3luYyAkcXVpZXQgLWF2IC0taWdub3JlLWV4aXN0aW5nICBcCisJCQkgICAgLS1leGNsdWRlIGluZm8gIiRhbHQiICIkR0lUX0RJUi9vYmplY3RzIiB8fCBleGl0CisJCSAgICBkb25lCisJCSAgICBybSAtZiAiJEdJVF9ESVIvVE1QX0FMVCIKKwkJZmkKKwkJZ2l0LWxzLXJlbW90ZSAiJHJlcG8iID4iJEdJVF9ESVIvQ0xPTkVfSEVBRCIgfHwgZXhpdCAxCisJCTs7CisJaHR0cHM6Ly8qfGh0dHA6Ly8qfGZ0cDovLyopCisJCWNhc2UgIiRkZXB0aCIgaW4KKwkJIiIpIDs7CisJCSopIGRpZSAic2hhbGxvdyBvdmVyIGh0dHAgb3IgZnRwIG5vdCBzdXBwb3J0ZWQiIDs7CisJCWVzYWMKKwkJaWYgdGVzdCAteiAiQEBOT19DVVJMQEAiCisJCXRoZW4KKwkJCWNsb25lX2R1bWJfaHR0cCAiJHJlcG8iICIkRCIKKwkJZWxzZQorCQkJZGllICJodHRwIHRyYW5zcG9ydCBub3Qgc3VwcG9ydGVkLCByZWJ1aWxkIEdpdCB3aXRoIGN1cmwgc3VwcG9ydCIKKwkJZmkKKwkJOzsKKwkqKQorCQlpZiBbIC1mICIkcmVwbyIgXSA7IHRoZW4KKwkJCWdpdCBidW5kbGUgdW5idW5kbGUgIiRyZXBvIiA+ICIkR0lUX0RJUi9DTE9ORV9IRUFEIiB8fAorCQkJZGllICJ1bmJ1bmRsZSBmcm9tICckcmVwbycgZmFpbGVkLiIKKwkJZWxzZQorCQkJY2FzZSAiJHVwbG9hZF9wYWNrIiBpbgorCQkJJycpIGdpdC1mZXRjaC1wYWNrIC0tYWxsIC1rICRxdWlldCAkZGVwdGggJG5vX3Byb2dyZXNzICIkcmVwbyI7OworCQkJKikgZ2l0LWZldGNoLXBhY2sgLS1hbGwgLWsgXAorCQkJCSRxdWlldCAiJHVwbG9hZF9wYWNrIiAkZGVwdGggJG5vX3Byb2dyZXNzICIkcmVwbyIgOzsKKwkJCWVzYWMgPiIkR0lUX0RJUi9DTE9ORV9IRUFEIiB8fAorCQkJZGllICJmZXRjaC1wYWNrIGZyb20gJyRyZXBvJyBmYWlsZWQuIgorCQlmaQorCQk7OworCWVzYWMKKwk7OworZXNhYwordGVzdCAtZCAiJEdJVF9ESVIvcmVmcy9yZWZlcmVuY2UtdG1wIiAmJiBybSAtZnIgIiRHSVRfRElSL3JlZnMvcmVmZXJlbmNlLXRtcCIKKworaWYgdGVzdCAtZiAiJEdJVF9ESVIvQ0xPTkVfSEVBRCIKK3RoZW4KKwkjIFJlYWQgZ2l0LWZldGNoLXBhY2sgLWsgb3V0cHV0IGFuZCBzdG9yZSB0aGUgcmVtb3RlIGJyYW5jaGVzLgorCWlmIFsgLW4gIiR1c2Vfc2VwYXJhdGVfcmVtb3RlIiBdCisJdGhlbgorCQlicmFuY2hfdG9wPSJyZW1vdGVzLyRvcmlnaW4iCisJZWxzZQorCQlicmFuY2hfdG9wPSJoZWFkcyIKKwlmaQorCXRhZ190b3A9InRhZ3MiCisJd2hpbGUgcmVhZCBzaGExIG5hbWUKKwlkbworCQljYXNlICIkbmFtZSIgaW4KKwkJKidee30nKQorCQkJY29udGludWUgOzsKKwkJSEVBRCkKKwkJCWRlc3RuYW1lPSJSRU1PVEVfSEVBRCIgOzsKKwkJcmVmcy9oZWFkcy8qKQorCQkJZGVzdG5hbWU9InJlZnMvJGJyYW5jaF90b3AvJHtuYW1lI3JlZnMvaGVhZHMvfSIgOzsKKwkJcmVmcy90YWdzLyopCisJCQlkZXN0bmFtZT0icmVmcy8kdGFnX3RvcC8ke25hbWUjcmVmcy90YWdzL30iIDs7CisJCSopCisJCQljb250aW51ZSA7OworCQllc2FjCisJCWdpdCB1cGRhdGUtcmVmIC1tICJjbG9uZTogZnJvbSAkcmVwbyIgIiRkZXN0bmFtZSIgIiRzaGExIiAiIgorCWRvbmUgPCAiJEdJVF9ESVIvQ0xPTkVfSEVBRCIKK2ZpCisKK2lmIHRlc3QgLW4gIiRXIjsgdGhlbgorCWNkICIkVyIgfHwgZXhpdAorZWxzZQorCWNkICIkRCIgfHwgZXhpdAorZmkKKworaWYgdGVzdCAteiAiJGJhcmUiCit0aGVuCisJIyBhIG5vbi1iYXJlIHJlcG9zaXRvcnkgaXMgYWx3YXlzIGluIHNlcGFyYXRlLXJlbW90ZSBsYXlvdXQKKwlyZW1vdGVfdG9wPSJyZWZzL3JlbW90ZXMvJG9yaWdpbiIKKwloZWFkX3NoYTE9CisJdGVzdCAhIC1yICIkR0lUX0RJUi9SRU1PVEVfSEVBRCIgfHwgaGVhZF9zaGExPWBjYXQgIiRHSVRfRElSL1JFTU9URV9IRUFEImAKKwljYXNlICIkaGVhZF9zaGExIiBpbgorCSdyZWY6IHJlZnMvJyopCisJCSMgVWgtb2gsIHRoZSByZW1vdGUgdG9sZCB1cyAoaHR0cCB0cmFuc3BvcnQgZG9uZSBhZ2FpbnN0CisJCSMgbmV3IHN0eWxlIHJlcG9zaXRvcnkgd2l0aCBhIHN5bXJlZiBIRUFEKS4KKwkJIyBJZGVhbGx5IHdlIHNob3VsZCBza2lwIHRoZSBndWVzc3dvcmsgYnV0IGZvciBub3cKKwkJIyBvcHQgZm9yIG1pbmltdW0gY2hhbmdlLgorCQloZWFkX3NoYTE9YGV4cHIgInokaGVhZF9zaGExIiA6ICd6cmVmOiByZWZzL2hlYWRzL1woLipcKSdgCisJCWhlYWRfc2hhMT1gY2F0ICIkR0lUX0RJUi8kcmVtb3RlX3RvcC8kaGVhZF9zaGExImAKKwkJOzsKKwllc2FjCisKKwkjIFRoZSBuYW1lIHVuZGVyICRyZW1vdGVfdG9wIHRoZSByZW1vdGUgSEVBRCBzZWVtcyB0byBwb2ludCBhdC4KKwloZWFkX3BvaW50c19hdD0kKAorCQkoCisJCQl0ZXN0IC1mICIkR0lUX0RJUi8kcmVtb3RlX3RvcC9tYXN0ZXIiICYmIGVjaG8gIm1hc3RlciIKKwkJCWNkICIkR0lUX0RJUi8kcmVtb3RlX3RvcCIgJiYKKwkJCWZpbmQgLiAtdHlwZSBmIC1wcmludCB8IHNlZCAtZSAncy9eXC5cLy8vJworCQkpIHwgKAorCQlkb25lPWYKKwkJd2hpbGUgcmVhZCBuYW1lCisJCWRvCisJCQl0ZXN0IHQgPSAkZG9uZSAmJiBjb250aW51ZQorCQkJYnJhbmNoX3RpcD1gY2F0ICIkR0lUX0RJUi8kcmVtb3RlX3RvcC8kbmFtZSJgCisJCQlpZiB0ZXN0ICIkaGVhZF9zaGExIiA9ICIkYnJhbmNoX3RpcCIKKwkJCXRoZW4KKwkJCQllY2hvICIkbmFtZSIKKwkJCQlkb25lPXQKKwkJCWZpCisJCWRvbmUKKwkJKQorCSkKKworCSMgVXBzdHJlYW0gVVJMCisJZ2l0IGNvbmZpZyByZW1vdGUuIiRvcmlnaW4iLnVybCAiJHJlcG8iICYmCisKKwkjIFNldCB1cCB0aGUgbWFwcGluZ3MgdG8gdHJhY2sgdGhlIHJlbW90ZSBicmFuY2hlcy4KKwlnaXQgY29uZmlnIHJlbW90ZS4iJG9yaWdpbiIuZmV0Y2ggXAorCQkiK3JlZnMvaGVhZHMvKjokcmVtb3RlX3RvcC8qIiAnXiQnICYmCisKKwkjIFdyaXRlIG91dCByZW1vdGUuJG9yaWdpbiBjb25maWcsIGFuZCB1cGRhdGUgb3VyICIkaGVhZF9wb2ludHNfYXQiLgorCWNhc2UgIiRoZWFkX3BvaW50c19hdCIgaW4KKwk/KikKKwkJIyBMb2NhbCBkZWZhdWx0IGJyYW5jaAorCQlnaXQgc3ltYm9saWMtcmVmIEhFQUQgInJlZnMvaGVhZHMvJGhlYWRfcG9pbnRzX2F0IiAmJgorCisJCSMgVHJhY2tpbmcgYnJhbmNoIGZvciB0aGUgcHJpbWFyeSBicmFuY2ggYXQgdGhlIHJlbW90ZS4KKwkJZ2l0IHVwZGF0ZS1yZWYgSEVBRCAiJGhlYWRfc2hhMSIgJiYKKworCQlybSAtZiAicmVmcy9yZW1vdGVzLyRvcmlnaW4vSEVBRCIKKwkJZ2l0IHN5bWJvbGljLXJlZiAicmVmcy9yZW1vdGVzLyRvcmlnaW4vSEVBRCIgXAorCQkJInJlZnMvcmVtb3Rlcy8kb3JpZ2luLyRoZWFkX3BvaW50c19hdCIgJiYKKworCQlnaXQgY29uZmlnIGJyYW5jaC4iJGhlYWRfcG9pbnRzX2F0Ii5yZW1vdGUgIiRvcmlnaW4iICYmCisJCWdpdCBjb25maWcgYnJhbmNoLiIkaGVhZF9wb2ludHNfYXQiLm1lcmdlICJyZWZzL2hlYWRzLyRoZWFkX3BvaW50c19hdCIKKwkJOzsKKwknJykKKwkJaWYgdGVzdCAteiAiJGhlYWRfc2hhMSIKKwkJdGhlbgorCQkJIyBTb3VyY2UgaGFkIG5vbmV4aXN0ZW50IHJlZiBpbiBIRUFECisJCQllY2hvID4mMiAiV2FybmluZzogUmVtb3RlIEhFQUQgcmVmZXJzIHRvIG5vbmV4aXN0ZW50IHJlZiwgdW5hYmxlIHRvIGNoZWNrb3V0LiIKKwkJCW5vX2NoZWNrb3V0PXQKKwkJZWxzZQorCQkJIyBTb3VyY2UgaGFkIGRldGFjaGVkIEhFQUQgcG9pbnRpbmcgbm93aGVyZQorCQkJZ2l0IHVwZGF0ZS1yZWYgLS1uby1kZXJlZiBIRUFEICIkaGVhZF9zaGExIiAmJgorCQkJcm0gLWYgInJlZnMvcmVtb3Rlcy8kb3JpZ2luL0hFQUQiCisJCWZpCisJCTs7CisJZXNhYworCisJY2FzZSAiJG5vX2NoZWNrb3V0IiBpbgorCScnKQorCQl0ZXN0ICJ6JHF1aWV0IiA9IHogLWEgInokbm9fcHJvZ3Jlc3MiID0geiAmJiB2PS12IHx8IHY9CisJCWdpdCByZWFkLXRyZWUgLW0gLXUgJHYgSEVBRCBIRUFECisJZXNhYworZmkKK3JtIC1mICIkR0lUX0RJUi9DTE9ORV9IRUFEIiAiJEdJVF9ESVIvUkVNT1RFX0hFQUQiCisKK3RyYXAgLSAwCmRpZmYgLS1naXQgYS9naXQtY29tcGF0LXV0aWwuaCBiL2dpdC1jb21wYXQtdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExODIzNWUKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtY29tcGF0LXV0aWwuaApAQCAtMCwwICsxLDQ1NiBAQAorI2lmbmRlZiBHSVRfQ09NUEFUX1VUSUxfSAorI2RlZmluZSBHSVRfQ09NUEFUX1VUSUxfSAorCisjZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTIDY0CisKKyNpZm5kZWYgRkxFWF9BUlJBWQorLyoKKyAqIFNlZSBpZiBvdXIgY29tcGlsZXIgaXMga25vd24gdG8gc3VwcG9ydCBmbGV4aWJsZSBhcnJheSBtZW1iZXJzLgorICovCisjaWYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiAoX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMKQorIyBkZWZpbmUgRkxFWF9BUlJBWSAvKiBlbXB0eSAqLworI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKKyMgaWYgKF9fR05VQ19fID49IDMpCisjICBkZWZpbmUgRkxFWF9BUlJBWSAvKiBlbXB0eSAqLworIyBlbHNlCisjICBkZWZpbmUgRkxFWF9BUlJBWSAwIC8qIG9sZGVyIEdOVSBleHRlbnNpb24gKi8KKyMgZW5kaWYKKyNlbmRpZgorCisvKgorICogT3RoZXJ3aXNlLCBkZWZhdWx0IHRvIHNhZmVyIGJ1dCBhIGJpdCB3YXN0ZWZ1bCB0cmFkaXRpb25hbCBzdHlsZQorICovCisjaWZuZGVmIEZMRVhfQVJSQVkKKyMgZGVmaW5lIEZMRVhfQVJSQVkgMQorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkvc2l6ZW9mKHhbMF0pKQorCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgVFlQRU9GKHgpIChfX3R5cGVvZl9fKHgpKQorI2Vsc2UKKyNkZWZpbmUgVFlQRU9GKHgpCisjZW5kaWYKKworI2RlZmluZSBNU0IoeCwgYml0cykgKCh4KSAmIFRZUEVPRih4KSh+MFVMTCA8PCAoc2l6ZW9mKHgpICogOCAtIChiaXRzKSkpKQorI2RlZmluZSBIQVNfTVVMVElfQklUUyhpKSAgKChpKSAmICgoaSkgLSAxKSkgIC8qIGNoZWNrcyBpZiBhbiBpbnRlZ2VyIGhhcyBtb3JlIHRoYW4gMSBiaXQgc2V0ICovCisKKy8qIEFwcHJveGltYXRpb24gb2YgdGhlIGxlbmd0aCBvZiB0aGUgZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHR5cGUuICovCisjZGVmaW5lIGRlY2ltYWxfbGVuZ3RoKHgpCSgoaW50KShzaXplb2YoeCkgKiAyLjU2ICsgMC41KSArIDEpCisKKyNpZiAhZGVmaW5lZChfX0FQUExFX18pICYmICFkZWZpbmVkKF9fRnJlZUJTRF9fKQorI2RlZmluZSBfWE9QRU5fU09VUkNFIDYwMCAvKiBnbGliYzIgYW5kIEFJWCA1LjNMIG5lZWQgNTAwLCBPcGVuQlNEIG5lZWRzIDYwMCBmb3IgU19JU0xOSygpICovCisjZGVmaW5lIF9YT1BFTl9TT1VSQ0VfRVhURU5ERUQgMSAvKiBBSVggNS4zTCBuZWVkcyB0aGlzICovCisjZW5kaWYKKyNkZWZpbmUgX0FMTF9TT1VSQ0UgMQorI2RlZmluZSBfR05VX1NPVVJDRSAxCisjZGVmaW5lIF9CU0RfU09VUkNFIDEKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8dXRpbWUuaD4KKyNpZm5kZWYgTk9fU1lTX1NFTEVDVF9ICisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2VuZGlmCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8cmVnZXguaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaWYgZGVmaW5lZChfX0NZR1dJTl9fKQorI3VuZGVmIF9YT1BFTl9TT1VSQ0UKKyNpbmNsdWRlIDxncnAuaD4KKyNkZWZpbmUgX1hPUEVOX1NPVVJDRSA2MDAKKyNlbHNlCisjdW5kZWYgX0FMTF9TT1VSQ0UgLyogQUlYIDUuM0wgZGVmaW5lcyBhIHN0cnVjdCBsaXN0IHdpdGggX0FMTF9TT1VSQ0UuICovCisjaW5jbHVkZSA8Z3JwLmg+CisjZGVmaW5lIF9BTExfU09VUkNFIDEKKyNlbmRpZgorCisjaWZuZGVmIE5PX0lDT05WCisjaW5jbHVkZSA8aWNvbnYuaD4KKyNlbmRpZgorCisvKiBPbiBtb3N0IHN5c3RlbXMgPGxpbWl0cy5oPiB3b3VsZCBoYXZlIGdpdmVuIHVzIHRoaXMsIGJ1dAorICogbm90IG9uIHNvbWUgc3lzdGVtcyAoZS5nLiBHTlUvSHVyZCkuCisgKi8KKyNpZm5kZWYgUEFUSF9NQVgKKyNkZWZpbmUgUEFUSF9NQVggNDA5NgorI2VuZGlmCisKKyNpZm5kZWYgUFJJdU1BWAorI2RlZmluZSBQUkl1TUFYICJsbHUiCisjZW5kaWYKKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIE5PUkVUVVJOIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpCisjZWxzZQorI2RlZmluZSBOT1JFVFVSTgorI2lmbmRlZiBfX2F0dHJpYnV0ZV9fCisjZGVmaW5lIF9fYXR0cmlidXRlX18oeCkKKyNlbmRpZgorI2VuZGlmCisKKy8qIEdlbmVyYWwgaGVscGVyIGZ1bmN0aW9ucyAqLworZXh0ZXJuIHZvaWQgdXNhZ2UoY29uc3QgY2hhciAqZXJyKSBOT1JFVFVSTjsKK2V4dGVybiB2b2lkIGRpZShjb25zdCBjaGFyICplcnIsIC4uLikgTk9SRVRVUk4gX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CitleHRlcm4gaW50IGVycm9yKGNvbnN0IGNoYXIgKmVyciwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKK2V4dGVybiB2b2lkIHdhcm5pbmcoY29uc3QgY2hhciAqZXJyLCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOworCitleHRlcm4gdm9pZCBzZXRfdXNhZ2Vfcm91dGluZSh2b2lkICgqcm91dGluZSkoY29uc3QgY2hhciAqZXJyKSBOT1JFVFVSTik7CitleHRlcm4gdm9pZCBzZXRfZGllX3JvdXRpbmUodm9pZCAoKnJvdXRpbmUpKGNvbnN0IGNoYXIgKmVyciwgdmFfbGlzdCBwYXJhbXMpIE5PUkVUVVJOKTsKK2V4dGVybiB2b2lkIHNldF9lcnJvcl9yb3V0aW5lKHZvaWQgKCpyb3V0aW5lKShjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKSk7CitleHRlcm4gdm9pZCBzZXRfd2Fybl9yb3V0aW5lKHZvaWQgKCpyb3V0aW5lKShjb25zdCBjaGFyICp3YXJuLCB2YV9saXN0IHBhcmFtcykpOworCitleHRlcm4gaW50IHByZWZpeGNtcChjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnByZWZpeCk7CisKKyNpZmRlZiBOT19NTUFQCisKKyNpZm5kZWYgUFJPVF9SRUFECisjZGVmaW5lIFBST1RfUkVBRCAxCisjZGVmaW5lIFBST1RfV1JJVEUgMgorI2RlZmluZSBNQVBfUFJJVkFURSAxCisjZGVmaW5lIE1BUF9GQUlMRUQgKCh2b2lkKiktMSkKKyNlbmRpZgorCisjZGVmaW5lIG1tYXAgZ2l0X21tYXAKKyNkZWZpbmUgbXVubWFwIGdpdF9tdW5tYXAKK2V4dGVybiB2b2lkICpnaXRfbW1hcCh2b2lkICpzdGFydCwgc2l6ZV90IGxlbmd0aCwgaW50IHByb3QsIGludCBmbGFncywgaW50IGZkLCBvZmZfdCBvZmZzZXQpOworZXh0ZXJuIGludCBnaXRfbXVubWFwKHZvaWQgKnN0YXJ0LCBzaXplX3QgbGVuZ3RoKTsKKworLyogVGhpcyB2YWx1ZSBtdXN0IGJlIG11bHRpcGxlIG9mIChwYWdlc2l6ZSAqIDIpICovCisjZGVmaW5lIERFRkFVTFRfUEFDS0VEX0dJVF9XSU5ET1dfU0laRSAoMSAqIDEwMjQgKiAxMDI0KQorCisjZWxzZSAvKiBOT19NTUFQICovCisKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisvKiBUaGlzIHZhbHVlIG11c3QgYmUgbXVsdGlwbGUgb2YgKHBhZ2VzaXplICogMikgKi8KKyNkZWZpbmUgREVGQVVMVF9QQUNLRURfR0lUX1dJTkRPV19TSVpFIFwKKwkoc2l6ZW9mKHZvaWQqKSA+PSA4IFwKKwkJPyAgMSAqIDEwMjQgKiAxMDI0ICogMTAyNCBcCisJCTogMzIgKiAxMDI0ICogMTAyNCkKKworI2VuZGlmIC8qIE5PX01NQVAgKi8KKworI2RlZmluZSBERUZBVUxUX1BBQ0tFRF9HSVRfTElNSVQgXAorCSgoMTAyNEwgKiAxMDI0TCkgKiAoc2l6ZW9mKHZvaWQqKSA+PSA4ID8gODE5MiA6IDI1NikpCisKKyNpZmRlZiBOT19QUkVBRAorI2RlZmluZSBwcmVhZCBnaXRfcHJlYWQKK2V4dGVybiBzc2l6ZV90IGdpdF9wcmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LCBvZmZfdCBvZmZzZXQpOworI2VuZGlmCisKKyNpZmRlZiBOT19TRVRFTlYKKyNkZWZpbmUgc2V0ZW52IGdpdHNldGVudgorZXh0ZXJuIGludCBnaXRzZXRlbnYoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7CisjZW5kaWYKKworI2lmZGVmIE5PX01LRFRFTVAKKyNkZWZpbmUgbWtkdGVtcCBnaXRta2R0ZW1wCitleHRlcm4gY2hhciAqZ2l0bWtkdGVtcChjaGFyICopOworI2VuZGlmCisKKyNpZmRlZiBOT19VTlNFVEVOVgorI2RlZmluZSB1bnNldGVudiBnaXR1bnNldGVudgorZXh0ZXJuIHZvaWQgZ2l0dW5zZXRlbnYoY29uc3QgY2hhciAqKTsKKyNlbmRpZgorCisjaWZkZWYgTk9fU1RSQ0FTRVNUUgorI2RlZmluZSBzdHJjYXNlc3RyIGdpdHN0cmNhc2VzdHIKK2V4dGVybiBjaGFyICpnaXRzdHJjYXNlc3RyKGNvbnN0IGNoYXIgKmhheXN0YWNrLCBjb25zdCBjaGFyICpuZWVkbGUpOworI2VuZGlmCisKKyNpZmRlZiBOT19TVFJMQ1BZCisjZGVmaW5lIHN0cmxjcHkgZ2l0c3RybGNweQorZXh0ZXJuIHNpemVfdCBnaXRzdHJsY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworI2VuZGlmCisKKyNpZmRlZiBOT19TVFJUT1VNQVgKKyNkZWZpbmUgc3RydG91bWF4IGdpdHN0cnRvdW1heAorZXh0ZXJuIHVpbnRtYXhfdCBnaXRzdHJ0b3VtYXgoY29uc3QgY2hhciAqLCBjaGFyICoqLCBpbnQpOworI2VuZGlmCisKKyNpZmRlZiBOT19IU1RSRVJST1IKKyNkZWZpbmUgaHN0cmVycm9yIGdpdGhzdHJlcnJvcgorZXh0ZXJuIGNvbnN0IGNoYXIgKmdpdGhzdHJlcnJvcihpbnQgaGVycm9yKTsKKyNlbmRpZgorCisjaWZkZWYgTk9fTUVNTUVNCisjZGVmaW5lIG1lbW1lbSBnaXRtZW1tZW0KK3ZvaWQgKmdpdG1lbW1lbShjb25zdCB2b2lkICpoYXlzdGFjaywgc2l6ZV90IGhheXN0YWNrbGVuLAorICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKm5lZWRsZSwgc2l6ZV90IG5lZWRsZWxlbik7CisjZW5kaWYKKworI2lmZGVmIEZSRUFEX1JFQURTX0RJUkVDVE9SSUVTCisjZGVmaW5lIGZvcGVuKGEsYikgZ2l0X2ZvcGVuKGEsYikKK2V4dGVybiBGSUxFICpnaXRfZm9wZW4oY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyNlbmRpZgorCisjaWZkZWYgU05QUklOVEZfUkVUVVJOU19CT0dVUworI2RlZmluZSBzbnByaW50ZiBnaXRfc25wcmludGYKK2V4dGVybiBpbnQgZ2l0X3NucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IG1heHNpemUsCisJCQljb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CisjZGVmaW5lIHZzbnByaW50ZiBnaXRfdnNucHJpbnRmCitleHRlcm4gaW50IGdpdF92c25wcmludGYoY2hhciAqc3RyLCBzaXplX3QgbWF4c2l6ZSwKKwkJCSBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApOworI2VuZGlmCisKKyNpZmRlZiBfX0dMSUJDX1BSRVJFUQorI2lmIF9fR0xJQkNfUFJFUkVRKDIsIDEpCisjZGVmaW5lIEhBVkVfU1RSQ0hSTlVMCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSQ0hSTlVMCisjZGVmaW5lIHN0cmNocm51bCBnaXRzdHJjaHJudWwKK3N0YXRpYyBpbmxpbmUgY2hhciAqZ2l0c3RyY2hybnVsKGNvbnN0IGNoYXIgKnMsIGludCBjKQoreworCXdoaWxlICgqcyAmJiAqcyAhPSBjKQorCQlzKys7CisJcmV0dXJuIChjaGFyICopczsKK30KKyNlbmRpZgorCitleHRlcm4gdm9pZCByZWxlYXNlX3BhY2tfbWVtb3J5KHNpemVfdCwgaW50KTsKKworc3RhdGljIGlubGluZSBjaGFyKiB4c3RyZHVwKGNvbnN0IGNoYXIgKnN0cikKK3sKKwljaGFyICpyZXQgPSBzdHJkdXAoc3RyKTsKKwlpZiAoIXJldCkgeworCQlyZWxlYXNlX3BhY2tfbWVtb3J5KHN0cmxlbihzdHIpICsgMSwgLTEpOworCQlyZXQgPSBzdHJkdXAoc3RyKTsKKwkJaWYgKCFyZXQpCisJCQlkaWUoIk91dCBvZiBtZW1vcnksIHN0cmR1cCBmYWlsZWQiKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkICp4bWFsbG9jKHNpemVfdCBzaXplKQoreworCXZvaWQgKnJldCA9IG1hbGxvYyhzaXplKTsKKwlpZiAoIXJldCAmJiAhc2l6ZSkKKwkJcmV0ID0gbWFsbG9jKDEpOworCWlmICghcmV0KSB7CisJCXJlbGVhc2VfcGFja19tZW1vcnkoc2l6ZSwgLTEpOworCQlyZXQgPSBtYWxsb2Moc2l6ZSk7CisJCWlmICghcmV0ICYmICFzaXplKQorCQkJcmV0ID0gbWFsbG9jKDEpOworCQlpZiAoIXJldCkKKwkJCWRpZSgiT3V0IG9mIG1lbW9yeSwgbWFsbG9jIGZhaWxlZCIpOworCX0KKyNpZmRlZiBYTUFMTE9DX1BPSVNPTgorCW1lbXNldChyZXQsIDB4QTUsIHNpemUpOworI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkICp4bWVtZHVweihjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQoreworCWNoYXIgKnAgPSB4bWFsbG9jKGxlbiArIDEpOworCW1lbWNweShwLCBkYXRhLCBsZW4pOworCXBbbGVuXSA9ICdcMCc7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqeHN0cm5kdXAoY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuKQoreworCWNoYXIgKnAgPSBtZW1jaHIoc3RyLCAnXDAnLCBsZW4pOworCXJldHVybiB4bWVtZHVweihzdHIsIHAgPyBwIC0gc3RyIDogbGVuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICp4cmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBzaXplKQoreworCXZvaWQgKnJldCA9IHJlYWxsb2MocHRyLCBzaXplKTsKKwlpZiAoIXJldCAmJiAhc2l6ZSkKKwkJcmV0ID0gcmVhbGxvYyhwdHIsIDEpOworCWlmICghcmV0KSB7CisJCXJlbGVhc2VfcGFja19tZW1vcnkoc2l6ZSwgLTEpOworCQlyZXQgPSByZWFsbG9jKHB0ciwgc2l6ZSk7CisJCWlmICghcmV0ICYmICFzaXplKQorCQkJcmV0ID0gcmVhbGxvYyhwdHIsIDEpOworCQlpZiAoIXJldCkKKwkJCWRpZSgiT3V0IG9mIG1lbW9yeSwgcmVhbGxvYyBmYWlsZWQiKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkICp4Y2FsbG9jKHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUpCit7CisJdm9pZCAqcmV0ID0gY2FsbG9jKG5tZW1iLCBzaXplKTsKKwlpZiAoIXJldCAmJiAoIW5tZW1iIHx8ICFzaXplKSkKKwkJcmV0ID0gY2FsbG9jKDEsIDEpOworCWlmICghcmV0KSB7CisJCXJlbGVhc2VfcGFja19tZW1vcnkobm1lbWIgKiBzaXplLCAtMSk7CisJCXJldCA9IGNhbGxvYyhubWVtYiwgc2l6ZSk7CisJCWlmICghcmV0ICYmICghbm1lbWIgfHwgIXNpemUpKQorCQkJcmV0ID0gY2FsbG9jKDEsIDEpOworCQlpZiAoIXJldCkKKwkJCWRpZSgiT3V0IG9mIG1lbW9yeSwgY2FsbG9jIGZhaWxlZCIpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnhtbWFwKHZvaWQgKnN0YXJ0LCBzaXplX3QgbGVuZ3RoLAorCWludCBwcm90LCBpbnQgZmxhZ3MsIGludCBmZCwgb2ZmX3Qgb2Zmc2V0KQoreworCXZvaWQgKnJldCA9IG1tYXAoc3RhcnQsIGxlbmd0aCwgcHJvdCwgZmxhZ3MsIGZkLCBvZmZzZXQpOworCWlmIChyZXQgPT0gTUFQX0ZBSUxFRCkgeworCQlpZiAoIWxlbmd0aCkKKwkJCXJldHVybiBOVUxMOworCQlyZWxlYXNlX3BhY2tfbWVtb3J5KGxlbmd0aCwgZmQpOworCQlyZXQgPSBtbWFwKHN0YXJ0LCBsZW5ndGgsIHByb3QsIGZsYWdzLCBmZCwgb2Zmc2V0KTsKKwkJaWYgKHJldCA9PSBNQVBfRkFJTEVEKQorCQkJZGllKCJPdXQgb2YgbWVtb3J5PyBtbWFwIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgeHJlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisJc3NpemVfdCBucjsKKwl3aGlsZSAoMSkgeworCQluciA9IHJlYWQoZmQsIGJ1ZiwgbGVuKTsKKwkJaWYgKChuciA8IDApICYmIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRUlOVFIpKQorCQkJY29udGludWU7CisJCXJldHVybiBucjsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCB4d3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisJc3NpemVfdCBucjsKKwl3aGlsZSAoMSkgeworCQluciA9IHdyaXRlKGZkLCBidWYsIGxlbik7CisJCWlmICgobnIgPCAwKSAmJiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVJTlRSKSkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gbnI7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCB4ZHVwKGludCBmZCkKK3sKKwlpbnQgcmV0ID0gZHVwKGZkKTsKKwlpZiAocmV0IDwgMCkKKwkJZGllKCJkdXAgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBGSUxFICp4ZmRvcGVuKGludCBmZCwgY29uc3QgY2hhciAqbW9kZSkKK3sKKwlGSUxFICpzdHJlYW0gPSBmZG9wZW4oZmQsIG1vZGUpOworCWlmIChzdHJlYW0gPT0gTlVMTCkKKwkJZGllKCJPdXQgb2YgbWVtb3J5PyBmZG9wZW4gZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJcmV0dXJuIHN0cmVhbTsKK30KKworc3RhdGljIGlubGluZSBpbnQgeG1rc3RlbXAoY2hhciAqdGVtcGxhdGUpCit7CisJaW50IGZkOworCisJZmQgPSBta3N0ZW1wKHRlbXBsYXRlKTsKKwlpZiAoZmQgPCAwKQorCQlkaWUoIlVuYWJsZSB0byBjcmVhdGUgdGVtcG9yYXJ5IGZpbGU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gZmQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IHhzaXplX3Qob2ZmX3QgbGVuKQoreworCXJldHVybiAoc2l6ZV90KWxlbjsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGFzX2V4dGVuc2lvbihjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqZXh0KQoreworCXNpemVfdCBsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOworCXNpemVfdCBleHRsZW4gPSBzdHJsZW4oZXh0KTsKKwlyZXR1cm4gbGVuID4gZXh0bGVuICYmICFtZW1jbXAoZmlsZW5hbWUgKyBsZW4gLSBleHRsZW4sIGV4dCwgZXh0bGVuKTsKK30KKworLyogU2FuZSBjdHlwZSAtIG5vIGxvY2FsZSwgYW5kIHdvcmtzIHdpdGggc2lnbmVkIGNoYXJzICovCisjdW5kZWYgaXNzcGFjZQorI3VuZGVmIGlzZGlnaXQKKyN1bmRlZiBpc2FscGhhCisjdW5kZWYgaXNhbG51bQorI3VuZGVmIHRvbG93ZXIKKyN1bmRlZiB0b3VwcGVyCitleHRlcm4gdW5zaWduZWQgY2hhciBzYW5lX2N0eXBlWzI1Nl07CisjZGVmaW5lIEdJVF9TUEFDRSAweDAxCisjZGVmaW5lIEdJVF9ESUdJVCAweDAyCisjZGVmaW5lIEdJVF9BTFBIQSAweDA0CisjZGVmaW5lIHNhbmVfaXN0ZXN0KHgsbWFzaykgKChzYW5lX2N0eXBlWyh1bnNpZ25lZCBjaGFyKSh4KV0gJiAobWFzaykpICE9IDApCisjZGVmaW5lIGlzc3BhY2UoeCkgc2FuZV9pc3Rlc3QoeCxHSVRfU1BBQ0UpCisjZGVmaW5lIGlzZGlnaXQoeCkgc2FuZV9pc3Rlc3QoeCxHSVRfRElHSVQpCisjZGVmaW5lIGlzYWxwaGEoeCkgc2FuZV9pc3Rlc3QoeCxHSVRfQUxQSEEpCisjZGVmaW5lIGlzYWxudW0oeCkgc2FuZV9pc3Rlc3QoeCxHSVRfQUxQSEEgfCBHSVRfRElHSVQpCisjZGVmaW5lIHRvbG93ZXIoeCkgc2FuZV9jYXNlKCh1bnNpZ25lZCBjaGFyKSh4KSwgMHgyMCkKKyNkZWZpbmUgdG91cHBlcih4KSBzYW5lX2Nhc2UoKHVuc2lnbmVkIGNoYXIpKHgpLCAwKQorCitzdGF0aWMgaW5saW5lIGludCBzYW5lX2Nhc2UoaW50IHgsIGludCBoaWdoKQoreworCWlmIChzYW5lX2lzdGVzdCh4LCBHSVRfQUxQSEEpKQorCQl4ID0gKHggJiB+MHgyMCkgfCBoaWdoOworCXJldHVybiB4OworfQorCitzdGF0aWMgaW5saW5lIGludCBzdHJ0b3VsX3VpKGNoYXIgY29uc3QgKnMsIGludCBiYXNlLCB1bnNpZ25lZCBpbnQgKnJlc3VsdCkKK3sKKwl1bnNpZ25lZCBsb25nIHVsOworCWNoYXIgKnA7CisKKwllcnJubyA9IDA7CisJdWwgPSBzdHJ0b3VsKHMsICZwLCBiYXNlKTsKKwlpZiAoZXJybm8gfHwgKnAgfHwgcCA9PSBzIHx8ICh1bnNpZ25lZCBpbnQpIHVsICE9IHVsKQorCQlyZXR1cm4gLTE7CisJKnJlc3VsdCA9IHVsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzdHJ0b2xfaShjaGFyIGNvbnN0ICpzLCBpbnQgYmFzZSwgaW50ICpyZXN1bHQpCit7CisJbG9uZyB1bDsKKwljaGFyICpwOworCisJZXJybm8gPSAwOworCXVsID0gc3RydG9sKHMsICZwLCBiYXNlKTsKKwlpZiAoZXJybm8gfHwgKnAgfHwgcCA9PSBzIHx8IChpbnQpIHVsICE9IHVsKQorCQlyZXR1cm4gLTE7CisJKnJlc3VsdCA9IHVsOworCXJldHVybiAwOworfQorCisjaWZkZWYgSU5URVJOQUxfUVNPUlQKK3ZvaWQgZ2l0X3Fzb3J0KHZvaWQgKmJhc2UsIHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUsCisJICAgICAgIGludCgqY29tcGFyKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOworI2RlZmluZSBxc29ydCBnaXRfcXNvcnQKKyNlbmRpZgorCisjaWZuZGVmIERJUl9IQVNfQlNEX0dST1VQX1NFTUFOVElDUworIyBkZWZpbmUgRk9SQ0VfRElSX1NFVF9HSUQgU19JU0dJRAorI2Vsc2UKKyMgZGVmaW5lIEZPUkNFX0RJUl9TRVRfR0lEIDAKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dpdC1jdnNleHBvcnRjb21taXQucGVybCBiL2dpdC1jdnNleHBvcnRjb21taXQucGVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNjAzNmJkCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWN2c2V4cG9ydGNvbW1pdC5wZXJsCkBAIC0wLDAgKzEsMzgxIEBACisjIS91c3IvYmluL3BlcmwgLXcKKwordXNlIHN0cmljdDsKK3VzZSBHZXRvcHQ6OlN0ZDsKK3VzZSBGaWxlOjpUZW1wIHF3KHRlbXBkaXIpOwordXNlIERhdGE6OkR1bXBlcjsKK3VzZSBGaWxlOjpCYXNlbmFtZSBxdyhiYXNlbmFtZSBkaXJuYW1lKTsKK3VzZSBGaWxlOjpTcGVjOworCitvdXIgKCRvcHRfaCwgJG9wdF9QLCAkb3B0X3AsICRvcHRfdiwgJG9wdF9jLCAkb3B0X2YsICRvcHRfYSwgJG9wdF9tLCAkb3B0X2QsICRvcHRfdSwgJG9wdF93KTsKKworZ2V0b3B0cygndWhQcHZjZmFtOmQ6dzonKTsKKworJG9wdF9oICYmIHVzYWdlKCk7CisKK2RpZSAiTmVlZCBhdCBsZWFzdCBvbmUgY29tbWl0IGlkZW50aWZpZXIhIiB1bmxlc3MgQEFSR1Y7CisKK2lmICgkb3B0X3cpIHsKKwkjIFJlbWVtYmVyIHdoZXJlIEdJVF9ESVIgaXMgYmVmb3JlIGNoYW5naW5nIHRvIENWUyBjaGVja291dAorCXVubGVzcyAoJEVOVntHSVRfRElSfSkgeworCQkjIE5vIEdJVF9ESVIgc2V0LiBGaWd1cmUgaXQgb3V0IGZvciBvdXJzZWx2ZXMKKwkJbXkgJGdkID1gZ2l0LXJldi1wYXJzZSAtLWdpdC1kaXJgOworCQljaG9tcCgkZ2QpOworCQkkRU5We0dJVF9ESVJ9ID0gJGdkOworCX0KKwkjIE1ha2Ugc3VyZSBHSVRfRElSIGlzIGFic29sdXRlCisJJEVOVntHSVRfRElSfSA9IEZpbGU6OlNwZWMtPnJlbDJhYnMoJEVOVntHSVRfRElSfSk7CisKKwlpZiAoISAtZCAkb3B0X3cuIi9DVlMiICkgeworCQlkaWUgIiRvcHRfdyBpcyBub3QgYSBDVlMgY2hlY2tvdXQiOworCX0KKwljaGRpciAkb3B0X3cgb3IgZGllICJDYW5ub3QgY2hhbmdlIHRvIENWUyBjaGVja291dCBhdCAkb3B0X3ciOworfQordW5sZXNzICgkRU5We0dJVF9ESVJ9ICYmIC1yICRFTlZ7R0lUX0RJUn0peworICAgIGRpZSAiR0lUX0RJUiBpcyBub3QgZGVmaW5lZCBvciBpcyB1bnJlYWRhYmxlIjsKK30KKworCitteSBAY3ZzOworaWYgKCRvcHRfZCkgeworCUBjdnMgPSAoJ2N2cycsICctZCcsICRvcHRfZCk7Cit9IGVsc2UgeworCUBjdnMgPSAoJ2N2cycpOworfQorCisjIHJlc29sdmUgdGFyZ2V0IGNvbW1pdAorbXkgJGNvbW1pdDsKKyRjb21taXQgPSBwb3AgQEFSR1Y7CiskY29tbWl0ID0gc2FmZV9waXBlX2NhcHR1cmUoJ2dpdC1yZXYtcGFyc2UnLCAnLS12ZXJpZnknLCAiJGNvbW1pdF4wIik7CitjaG9tcCAkY29tbWl0OworaWYgKCQ/KSB7CisgICAgZGllICJUaGUgY29tbWl0IHJlZmVyZW5jZSAkY29tbWl0IGRpZCBub3QgcmVzb2x2ZSEiOworfQorCisjIHJlc29sdmUgd2hhdCBwYXJlbnQgd2Ugd2FudAorbXkgJHBhcmVudDsKK2lmIChAQVJHVikgeworICAgICRwYXJlbnQgPSBwb3AgQEFSR1Y7CisgICAgJHBhcmVudCA9ICBzYWZlX3BpcGVfY2FwdHVyZSgnZ2l0LXJldi1wYXJzZScsICctLXZlcmlmeScsICIkcGFyZW50XjAiKTsKKyAgICBjaG9tcCAkcGFyZW50OworICAgIGlmICgkPykgeworCWRpZSAiVGhlIHBhcmVudCByZWZlcmVuY2UgZGlkIG5vdCByZXNvbHZlISI7CisgICAgfQorfQorCisjIGZpbmQgcGFyZW50cyBmcm9tIHRoZSBjb21taXQgaXRzZWxmCitteSBAY29tbWl0ICA9IHNhZmVfcGlwZV9jYXB0dXJlKCdnaXQtY2F0LWZpbGUnLCAnY29tbWl0JywgJGNvbW1pdCk7CitteSBAcGFyZW50czsKK215ICRjb21taXR0ZXI7CitteSAkYXV0aG9yOworbXkgJHN0YWdlID0gJ2hlYWRlcnMnOyAjIGhlYWRlcnMsIG1zZworbXkgJHRpdGxlOworbXkgJG1zZyA9ICcnOworCitmb3JlYWNoIG15ICRsaW5lIChAY29tbWl0KSB7CisgICAgY2hvbXAgJGxpbmU7CisgICAgaWYgKCRzdGFnZSBlcSAnaGVhZGVycycgJiYgJGxpbmUgZXEgJycpIHsKKwkkc3RhZ2UgPSAnbXNnJzsKKwluZXh0OworICAgIH0KKworICAgIGlmICgkc3RhZ2UgZXEgJ2hlYWRlcnMnKSB7CisJaWYgKCRsaW5lID1+IG0vXnBhcmVudCAoXHd7NDB9KSQvKSB7ICMgZm91bmQgYSBwYXJlbnQKKwkgICAgcHVzaCBAcGFyZW50cywgJDE7CisJfSBlbHNpZiAoJGxpbmUgPX4gbS9eYXV0aG9yICguKykgXGQrIFstK11cZCskLykgeworCSAgICAkYXV0aG9yID0gJDE7CisJfSBlbHNpZiAoJGxpbmUgPX4gbS9eY29tbWl0dGVyICguKykgXGQrIFstK11cZCskLykgeworCSAgICAkY29tbWl0dGVyID0gJDE7CisJfQorICAgIH0gZWxzZSB7CisJJG1zZyAuPSAkbGluZSAuICJcbiI7CisJdW5sZXNzICgkdGl0bGUpIHsKKwkgICAgJHRpdGxlID0gJGxpbmU7CisJfQorICAgIH0KK30KKworbXkgJG5vcGFyZW50ID0gIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiOworaWYgKCRwYXJlbnQpIHsKKyAgICBteSAkZm91bmQ7CisgICAgIyBkb3VibGUgY2hlY2sgdGhhdCBpdCdzIGEgdmFsaWQgcGFyZW50CisgICAgZm9yZWFjaCBteSAkcCAoQHBhcmVudHMpIHsKKwlpZiAoJHAgZXEgJHBhcmVudCkgeworCSAgICAkZm91bmQgPSAxOworCSAgICBsYXN0OworCX07ICMgZm91bmQgaXQKKyAgICB9CisgICAgZGllICJEaWQgbm90IGZpbmQgJHBhcmVudCBpbiB0aGUgcGFyZW50cyBmb3IgdGhpcyBjb21taXQhIiBpZiAhJGZvdW5kIGFuZCAhJG9wdF9QOworfSBlbHNlIHsgIyB3ZSBkb24ndCBoYXZlIGEgcGFyZW50IGZyb20gdGhlIGNtZGxpbmUuLi4KKyAgICBpZiAoQHBhcmVudHMgPT0gMSkgeyAjIGl0J3Mgc2FmZSB0byBnZXQgaXQgZnJvbSB0aGUgY29tbWl0CisJJHBhcmVudCA9ICRwYXJlbnRzWzBdOworICAgIH0gZWxzaWYgKEBwYXJlbnRzID09IDApIHsgIyB0aGVyZSBpcyBubyBwYXJlbnQKKyAgICAgICAgJHBhcmVudCA9ICRub3BhcmVudDsKKyAgICB9IGVsc2UgeyAjIGNhbm5vdCBjaG9vc2UgYXV0b21hdGljYWxseSBmcm9tIG11bHRpcGxlIHBhcmVudHMKKyAgICAgICAgZGllICJUaGlzIGNvbW1pdCBoYXMgbW9yZSB0aGFuIG9uZSBwYXJlbnQgLS0gcGxlYXNlIG5hbWUgdGhlIHBhcmVudCB5b3Ugd2FudCB0byB1c2UgZXhwbGljaXRseSI7CisgICAgfQorfQorCiskb3B0X3YgJiYgcHJpbnQgIkFwcGx5aW5nIHRvIENWUyBjb21taXQgJGNvbW1pdCBmcm9tIHBhcmVudCAkcGFyZW50XG4iOworCisjIGdyYWIgdGhlIGNvbW1pdCBtZXNzYWdlCitvcGVuKE1TRywgIj4ubXNnIikgb3IgZGllICJDYW5ub3Qgb3BlbiAubXNnIGZvciB3cml0aW5nIjsKK2lmICgkb3B0X20pIHsKKyAgICBwcmludCBNU0cgJG9wdF9tOworfQorcHJpbnQgTVNHICRtc2c7CitpZiAoJG9wdF9hKSB7CisgICAgcHJpbnQgTVNHICJcblxuQXV0aG9yOiAkYXV0aG9yXG4iOworICAgIGlmICgkYXV0aG9yIG5lICRjb21taXR0ZXIpIHsKKwlwcmludCBNU0cgIkNvbW1pdHRlcjogJGNvbW1pdHRlclxuIjsKKyAgICB9Cit9CitjbG9zZSBNU0c7CisKK2lmICgkcGFyZW50IGVxICRub3BhcmVudCkgeworICAgIGBnaXQtZGlmZi10cmVlIC0tYmluYXJ5IC1wIC0tcm9vdCAkY29tbWl0ID4uY3ZzZXhwb3J0Y29tbWl0LmRpZmZgOyMgfHwgZGllICJDYW5ub3QgZGlmZiI7Cit9IGVsc2UgeworICAgIGBnaXQtZGlmZi10cmVlIC0tYmluYXJ5IC1wICRwYXJlbnQgJGNvbW1pdCA+LmN2c2V4cG9ydGNvbW1pdC5kaWZmYDsjIHx8IGRpZSAiQ2Fubm90IGRpZmYiOworfQorCisjIyBhcHBseSBub24tYmluYXJ5IGNoYW5nZXMKKworIyBJbiBwZWRhbnRpYyBtb2RlIHJlcXVpcmUgYWxsIGxpbmVzIG9mIGNvbnRleHQgdG8gbWF0Y2guICBJbiBub3JtYWwKKyMgbW9kZSwgYmUgY29tcGF0aWJsZSB3aXRoIGRpZmYvcGF0Y2g6IGFzc3VtZSAzIGxpbmVzIG9mIGNvbnRleHQgYW5kCisjIHJlcXVpcmUgYXQgbGVhc3Qgb25lIGxpbmUgbWF0Y2gsIGkuZS4gaWdub3JlIGF0IG1vc3QgMiBsaW5lcyBvZgorIyBjb250ZXh0LCBsaWtlIGRpZmYvcGF0Y2ggZG8gYnkgZGVmYXVsdC4KK215ICRjb250ZXh0ID0gJG9wdF9wID8gJycgOiAnLUMxJzsKKworcHJpbnQgIkNoZWNraW5nIGlmIHBhdGNoIHdpbGwgYXBwbHlcbiI7CisKK215IEBzdGF0Oworb3BlbiBBUFBMWSwgIkdJVF9ESVI9IGdpdC1hcHBseSAkY29udGV4dCAtLXN1bW1hcnkgLS1udW1zdGF0PC5jdnNleHBvcnRjb21taXQuZGlmZnwiIHx8IGRpZSAiY2Fubm90IHBhdGNoIjsKK0BzdGF0PTxBUFBMWT47CitjbG9zZSBBUFBMWSB8fCBkaWUgIkNhbm5vdCBwYXRjaCI7CitteSAoQGJmaWxlcyxAZmlsZXMsQGFmaWxlcyxAZGZpbGVzKTsKK2Nob21wIEBzdGF0OworZm9yZWFjaCAoQHN0YXQpIHsKKwlwdXNoIChAYmZpbGVzLCQxKSBpZiBtL14tXHQtXHQoLiopJC87CisJcHVzaCAoQGZpbGVzLCAkMSkgaWYgbS9eLVx0LVx0KC4qKSQvOworCXB1c2ggKEBmaWxlcywgJDEpIGlmIG0vXlxkK1x0XGQrXHQoLiopJC87CisJcHVzaCAoQGFmaWxlcywkMSkgaWYgbS9eIGNyZWF0ZSBtb2RlIFswLTddKyAoLiopJC87CisJcHVzaCAoQGRmaWxlcywkMSkgaWYgbS9eIGRlbGV0ZSBtb2RlIFswLTddKyAoLiopJC87Cit9CittYXAgeyBzL14iKC4qKSIkLyQxL2cgfSBAYmZpbGVzLEBmaWxlczsKK21hcCB7IHMvXFwoWzAtN117M30pL3NwcmludGYoJyVjJyxvY3QgJDEpL2VnIH0gQGJmaWxlcyxAZmlsZXM7CisKKyMgY2hlY2sgdGhhdCB0aGUgZmlsZXMgYXJlIGNsZWFuIGFuZCB1cCB0byBkYXRlIGFjY29yZGluZyB0byBjdnMKK215ICRkaXJ0eTsKK215IEBkaXJzOworZm9yZWFjaCBteSAkcCAoQGFmaWxlcykgeworICAgIG15ICRwYXRoID0gZGlybmFtZSAkcDsKKyAgICB3aGlsZSAoIS1kICRwYXRoIGFuZCAhIGdyZXAgeyAkXyBlcSAkcGF0aCB9IEBkaXJzKSB7CisJdW5zaGlmdCBAZGlycywgJHBhdGg7CisJJHBhdGggPSBkaXJuYW1lICRwYXRoOworICAgIH0KK30KKworIyAuLi4gY2hlY2sgZGlycywKK2ZvcmVhY2ggbXkgJGQgKEBkaXJzKSB7CisgICAgaWYgKC1lICRkKSB7CisJJGRpcnR5ID0gMTsKKwl3YXJuICIkZCBleGlzdHMgYW5kIGlzIG5vdCBhIGRpcmVjdG9yeSFcbiI7CisgICAgfQorfQorCisjIC4uLiBxdWVyeSBzdGF0dXMgb2YgYWxsIGZpbGVzIHRoYXQgd2UgaGF2ZSBhIGRpcmVjdG9yeSBmb3IgYW5kIHBhcnNlIG91dHB1dCBvZiAnY3ZzIHN0YXR1cycgdG8gJWN2c3N0YXQuCitteSBAY2Fuc3RhdHVzZmlsZXM7Citmb3JlYWNoIG15ICRmIChAZmlsZXMpIHsKKyAgICBteSAkcGF0aCA9IGRpcm5hbWUgJGY7CisgICAgbmV4dCBpZiAoZ3JlcCB7ICRfIGVxICRwYXRoIH0gQGRpcnMpOworICAgIHB1c2ggQGNhbnN0YXR1c2ZpbGVzLCAkZjsKK30KKworbXkgJWN2c3N0YXQ7CitpZiAoQGNhbnN0YXR1c2ZpbGVzKSB7CisgICAgaWYgKCRvcHRfdSkgeworICAgICAgbXkgQHVwZGF0ZWQgPSB4YXJnc19zYWZlX3BpcGVfY2FwdHVyZShbQGN2cywgJ3VwZGF0ZSddLCBAY2Fuc3RhdHVzZmlsZXMpOworICAgICAgcHJpbnQgQHVwZGF0ZWQ7CisgICAgfQorICAgICMgImN2cyBzdGF0dXMiIHJlb3JkZXJzIHRoZSBwYXJhbWV0ZXJzLCBub3RhYmx5IHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlCisgICAgIyBhcmd1bWVudHMgd2l0aCB0aGUgc2FtZSBiYXNlbmFtZS4gIFNvIGJlIHByZWNpc2UgaGVyZS4KKworICAgIG15ICVhZGRlZCA9IG1hcCB7ICRfID0+IDEgfSBAYWZpbGVzOworICAgIG15ICV0b2RvID0gbWFwIHsgJF8gPT4gMSB9IEBjYW5zdGF0dXNmaWxlczsKKworICAgIHdoaWxlICgldG9kbykgeworICAgICAgbXkgQGNhbnN0YXR1c2ZpbGVzMiA9ICgpOworICAgICAgbXkgJWZ1bGxuYW1lID0gKCk7CisgICAgICBmb3JlYWNoIG15ICRuYW1lIChrZXlzICV0b2RvKSB7CisJbXkgJGJhc2VuYW1lID0gYmFzZW5hbWUoJG5hbWUpOworCisJJGJhc2VuYW1lID0gIm5vIGZpbGUgIiAuICRiYXNlbmFtZSBpZiAoZXhpc3RzKCRhZGRlZHskYmFzZW5hbWV9KSk7CisJY2hvbXAoJGJhc2VuYW1lKTsKKworCWlmICghZXhpc3RzKCRmdWxsbmFtZXskYmFzZW5hbWV9KSkgeworCSAgJGZ1bGxuYW1leyRiYXNlbmFtZX0gPSAkbmFtZTsKKwkgIHB1c2ggKEBjYW5zdGF0dXNmaWxlczIsICRuYW1lKTsKKwkgIGRlbGV0ZSgkdG9kb3skbmFtZX0pOworICAgICAgICB9CisgICAgICB9CisgICAgICBteSBAY3Zzb3V0cHV0OworICAgICAgQGN2c291dHB1dCA9IHhhcmdzX3NhZmVfcGlwZV9jYXB0dXJlKFtAY3ZzLCAnc3RhdHVzJ10sIEBjYW5zdGF0dXNmaWxlczIpOworICAgICAgZm9yZWFjaCBteSAkbCAoQGN2c291dHB1dCkgeworICAgICAgICBjaG9tcCAkbDsKKyAgICAgICAgaWYgKCRsID1+IC9eRmlsZTpccysoLipcUylccytTdGF0dXM6ICguKikkLykgeworCSAgaWYgKCFleGlzdHMoJGZ1bGxuYW1leyQxfSkpIHsKKwkgICAgcHJpbnQgU1RERVJSICJIdWg/IFN0YXR1cyByZXBvcnRlZCBmb3IgdW5leHBlY3RlZCBmaWxlICckMSdcbiI7CisJICB9IGVsc2UgeworCSAgICAkY3Zzc3RhdHskZnVsbG5hbWV7JDF9fSA9ICQyOworCSAgfQorCX0KKyAgICAgIH0KKyAgICB9Cit9CisKKyMgLi4uIHZhbGlkYXRlIG5ldyBmaWxlcywKK2ZvcmVhY2ggbXkgJGYgKEBhZmlsZXMpIHsKKyAgICBpZiAoZGVmaW5lZCAoJGN2c3N0YXR7JGZ9KSBhbmQgJGN2c3N0YXR7JGZ9IG5lICJVbmtub3duIikgeworCSRkaXJ0eSA9IDE7CisJd2FybiAiRmlsZSAkZiBpcyBhbHJlYWR5IGtub3duIGluIHlvdXIgQ1ZTIGNoZWNrb3V0IC0tIHBlcmhhcHMgaXQgaGFzIGJlZW4gYWRkZWQgYnkgYW5vdGhlciB1c2VyLiBPciB0aGlzIG1heSBpbmRpY2F0ZSB0aGF0IGl0IGV4aXN0cyBvbiBhIGRpZmZlcmVudCBicmFuY2guIElmIHRoaXMgaXMgdGhlIGNhc2UsIHVzZSAtZiB0byBmb3JjZSB0aGUgbWVyZ2UuXG4iOworCXdhcm4gIlN0YXR1cyB3YXM6ICRjdnNzdGF0eyRmfVxuIjsKKyAgICB9Cit9CisjIC4uLiB2YWxpZGF0ZSBrbm93biBmaWxlcy4KK2ZvcmVhY2ggbXkgJGYgKEBmaWxlcykgeworICAgIG5leHQgaWYgZ3JlcCB7ICRfIGVxICRmIH0gQGFmaWxlczsKKyAgICAjIFRPRE86d2UgbmVlZCB0byBoYW5kbGUgcmVtb3ZlZCBpbiBjdnMKKyAgICB1bmxlc3MgKGRlZmluZWQgKCRjdnNzdGF0eyRmfSkgYW5kICRjdnNzdGF0eyRmfSBlcSAiVXAtdG8tZGF0ZSIpIHsKKwkkZGlydHkgPSAxOworCXdhcm4gIkZpbGUgJGYgbm90IHVwIHRvIGRhdGUgYnV0IGhhcyBzdGF0dXMgJyRjdnNzdGF0eyRmfScgaW4geW91ciBDVlMgY2hlY2tvdXQhXG4iOworICAgIH0KK30KK2lmICgkZGlydHkpIHsKKyAgICBpZiAoJG9wdF9mKSB7CXdhcm4gIlRoZSB0cmVlIGlzIG5vdCBjbGVhbiAtLSBmb3JjZWQgbWVyZ2VcbiI7CisJJGRpcnR5ID0gMDsKKyAgICB9IGVsc2UgeworCWRpZSAiRXhpdGluZzogeW91ciBDVlMgdHJlZSBpcyBub3QgY2xlYW4gZm9yIHRoaXMgbWVyZ2UuIjsKKyAgICB9Cit9CisKK3ByaW50ICJBcHBseWluZ1xuIjsKK2BHSVRfRElSPSBnaXQtYXBwbHkgJGNvbnRleHQgLS1zdW1tYXJ5IC0tbnVtc3RhdCAtLWFwcGx5IDwuY3ZzZXhwb3J0Y29tbWl0LmRpZmZgIHx8IGRpZSAiY2Fubm90IHBhdGNoIjsKKworcHJpbnQgIlBhdGNoIGFwcGxpZWQgc3VjY2Vzc2Z1bGx5LiBBZGRpbmcgbmV3IGZpbGVzIGFuZCBkaXJlY3RvcmllcyB0byBDVlNcbiI7CitteSAkZGlydHlwYXRjaCA9IDA7CisKKyMKKyMgV2UgaGF2ZSB0byBhZGQgdGhlIGRpcmVjdG9yaWVzIGluIG9yZGVyIG90aGVyd2lzZSB3ZSB3aWxsIGhhdmUKKyMgcHJvYmxlbXMgd2hlbiB3ZSB0cnkgYW5kIGFkZCB0aGUgc3ViLWRpcmVjdG9yeSBvZiBhIGRpcmVjdG9yeSB3ZQorIyBoYXZlIG5vdCBhZGRlZCB5ZXQuCisjCisjIEx1Y2tpbHkgdGhpcyBpcyBlYXN5IHRvIGRlYWwgd2l0aCBieSBzb3J0aW5nIHRoZSBkaXJlY3RvcmllcyBhbmQKKyMgZGVhbGluZyB3aXRoIHRoZSBzaG9ydGVzdCBvbmVzIGZpcnN0LgorIworQGRpcnMgPSBzb3J0IHsgbGVuZ3RoICRhIDw9PiBsZW5ndGggJGJ9IEBkaXJzOworCitmb3JlYWNoIG15ICRkIChAZGlycykgeworICAgIGlmIChzeXN0ZW0oQGN2cywnYWRkJywkZCkpIHsKKwkkZGlydHlwYXRjaCA9IDE7CisJd2FybiAiRmFpbGVkIHRvIGN2cyBhZGQgZGlyZWN0b3J5ICRkIC0tIHlvdSBtYXkgbmVlZCB0byBkbyBpdCBtYW51YWxseSI7CisgICAgfQorfQorCitmb3JlYWNoIG15ICRmIChAYWZpbGVzKSB7CisgICAgaWYgKGdyZXAgeyAkXyBlcSAkZiB9IEBiZmlsZXMpIHsKKyAgICAgIHN5c3RlbShAY3ZzLCAnYWRkJywnLWtiJywkZik7CisgICAgfSBlbHNlIHsKKyAgICAgIHN5c3RlbShAY3ZzLCAnYWRkJywgJGYpOworICAgIH0KKyAgICBpZiAoJD8pIHsKKwkkZGlydHlwYXRjaCA9IDE7CisJd2FybiAiRmFpbGVkIHRvIGN2cyBhZGQgJGYgLS0geW91IG1heSBuZWVkIHRvIGRvIGl0IG1hbnVhbGx5IjsKKyAgICB9Cit9CisKK2ZvcmVhY2ggbXkgJGYgKEBkZmlsZXMpIHsKKyAgICBzeXN0ZW0oQGN2cywgJ3JtJywgJy1mJywgJGYpOworICAgIGlmICgkPykgeworCSRkaXJ0eXBhdGNoID0gMTsKKwl3YXJuICJGYWlsZWQgdG8gY3ZzIHJtIC1mICRmIC0tIHlvdSBtYXkgbmVlZCB0byBkbyBpdCBtYW51YWxseSI7CisgICAgfQorfQorCitwcmludCAiQ29tbWl0IHRvIENWU1xuIjsKK3ByaW50ICJQYXRjaCB0aXRsZSAoZmlyc3QgY29tbWVudCBsaW5lKTogJHRpdGxlXG4iOworbXkgQGNvbW1pdGZpbGVzID0gbWFwIHsgdW5sZXNzIChtL1xzLykgeyAnXCcnLiRfLidcJyc7IH0gZWxzZSB7ICRfOyB9OyB9IChAZmlsZXMpOworbXkgJGNtZCA9IGpvaW4oJyAnLCBAY3ZzKS4iIGNvbW1pdCAtRiAubXNnIEBjb21taXRmaWxlcyI7CisKK2lmICgkZGlydHlwYXRjaCkgeworICAgIHByaW50ICJOT1RFOiBPbmUgb3IgbW9yZSBodW5rcyBmYWlsZWQgdG8gYXBwbHkgY2xlYW5seS5cbiI7CisgICAgcHJpbnQgIllvdSdsbCBuZWVkIHRvIGFwcGx5IHRoZSBwYXRjaCBpbiAuY3ZzZXhwb3J0Y29tbWl0LmRpZmYgbWFudWFsbHlcbiI7CisgICAgcHJpbnQgInVzaW5nIGEgcGF0Y2ggcHJvZ3JhbS4gQWZ0ZXIgYXBwbHlpbmcgdGhlIHBhdGNoIGFuZCByZXNvbHZpbmcgdGhlXG4iOworICAgIHByaW50ICJwcm9ibGVtcyB5b3UgbWF5IGNvbW1pdCB1c2luZzoiOworICAgIHByaW50ICJcbiAgICBjZCBcIiRvcHRfd1wiIiBpZiAkb3B0X3c7CisgICAgcHJpbnQgIlxuICAgICRjbWRcblxuIjsKKyAgICBleGl0KDEpOworfQorCitpZiAoJG9wdF9jKSB7CisgICAgcHJpbnQgIkF1dG9jb21taXRcbiAgJGNtZFxuIjsKKyAgICBwcmludCB4YXJnc19zYWZlX3BpcGVfY2FwdHVyZShbQGN2cywgJ2NvbW1pdCcsICctRicsICcubXNnJ10sIEBmaWxlcyk7CisgICAgaWYgKCQ/KSB7CisJZGllICJFeGl0aW5nOiBUaGUgY29tbWl0IGRpZCBub3Qgc3VjY2VlZCI7CisgICAgfQorICAgIHByaW50ICJDb21taXR0ZWQgc3VjY2Vzc2Z1bGx5IHRvIENWU1xuIjsKKyAgICAjIGNsZWFuIHVwCisgICAgdW5saW5rKCIubXNnIik7Cit9IGVsc2UgeworICAgIHByaW50ICJSZWFkeSBmb3IgeW91IHRvIGNvbW1pdCwganVzdCBydW46XG5cbiAgICRjbWRcbiI7Cit9CisKKyMgY2xlYW4gdXAKK3VubGluaygiLmN2c2V4cG9ydGNvbW1pdC5kaWZmIik7CisKKyMgQ1ZTIHZlcnNpb24gMS4xMS54IGFuZCAxLjEyLnggc2xlZXBzIHRoZSB3cm9uZyB3YXkgdG8gZW5zdXJlIHRoZSB0aW1lc3RhbXAKKyMgdXNlZCBieSBDVlMgYW5kIHRoZSBvbmUgc2V0IGJ5IHN1YnNlcXVlbmNlIGZpbGUgbW9kaWZpY2F0aW9ucyBhcmUgZGlmZmVyZW50LgorIyBJZiB0aGV5IGFyZSBub3QgZGlmZmVyZW50IENWUyB3aWxsIG5vdCBkZXRlY3QgY2hhbmdlcy4KK3NsZWVwKDEpOworCitzdWIgdXNhZ2UgeworCXByaW50IFNUREVSUiA8PEVORDsKK1VzYWdlOiBHSVRfRElSPS9wYXRoL3RvLy5naXQgJHtcYmFzZW5hbWUgJDB9IFstaF0gWy1wXSBbLXZdIFstY10gWy1mXSBbLXVdIFstdyBjdnN3b3JrZGlyXSBbLW0gbXNncHJlZml4XSBbIHBhcmVudCBdIGNvbW1pdAorRU5ECisJZXhpdCgxKTsKK30KKworIyBBbiBhbHRlcm5hdGl2ZSB0byBgY29tbWFuZGAgdGhhdCBhbGxvd3MgaW5wdXQgdG8gYmUgcGFzc2VkIGFzIGFuIGFycmF5CisjIHRvIHdvcmsgYXJvdW5kIHNoZWxsIHByb2JsZW1zIHdpdGggd2VpcmQgY2hhcmFjdGVycyBpbiBhcmd1bWVudHMKKyMgaWYgdGhlIGV4ZWMgcmV0dXJucyBub24temVybyB3ZSBkaWUKK3N1YiBzYWZlX3BpcGVfY2FwdHVyZSB7CisgICAgbXkgQG91dHB1dDsKKyAgICBpZiAobXkgJHBpZCA9IG9wZW4gbXkgJGNoaWxkLCAnLXwnKSB7CisJQG91dHB1dCA9ICg8JGNoaWxkPik7CisJY2xvc2UgJGNoaWxkIG9yIGRpZSBqb2luKCcgJyxAXykuIjogJCEgJD8iOworICAgIH0gZWxzZSB7CisJZXhlYyhAXykgb3IgZGllICIkISAkPyI7ICMgZXhlYygpIGNhbiBmYWlsIHRoZSBleGVjdXRhYmxlIGNhbid0IGJlIGZvdW5kCisgICAgfQorICAgIHJldHVybiB3YW50YXJyYXkgPyBAb3V0cHV0IDogam9pbignJyxAb3V0cHV0KTsKK30KKworc3ViIHhhcmdzX3NhZmVfcGlwZV9jYXB0dXJlIHsKKwlteSAkTUFYX0FSR19MRU5HVEggPSA2NTUzNjsKKwlteSAkY21kID0gc2hpZnQ7CisJbXkgQG91dHB1dDsKKwlteSAkb3V0cHV0OworCXdoaWxlKEBfKSB7CisJCW15IEBhcmdzOworCQlteSAkbGVuZ3RoID0gMDsKKwkJd2hpbGUoQF8gJiYgJGxlbmd0aCA8ICRNQVhfQVJHX0xFTkdUSCkgeworCQkJcHVzaCBAYXJncywgc2hpZnQ7CisJCQkkbGVuZ3RoICs9IGxlbmd0aCgkYXJnc1skI2FyZ3NdKTsKKwkJfQorCQlpZiAod2FudGFycmF5KSB7CisJCQlwdXNoIEBvdXRwdXQsIHNhZmVfcGlwZV9jYXB0dXJlKEAkY21kLCBAYXJncyk7CisJCX0KKwkJZWxzZSB7CisJCQkkb3V0cHV0IC49IHNhZmVfcGlwZV9jYXB0dXJlKEAkY21kLCBAYXJncyk7CisJCX0KKwl9CisJcmV0dXJuIHdhbnRhcnJheSA/IEBvdXRwdXQgOiAkb3V0cHV0OworfQpkaWZmIC0tZ2l0IGEvZ2l0LWN2c2ltcG9ydC5wZXJsIGIvZ2l0LWN2c2ltcG9ydC5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk1YzVlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtY3ZzaW1wb3J0LnBlcmwKQEAgLTAsMCArMSwxMDE0IEBACisjIS91c3IvYmluL3BlcmwgLXcKKworIyBUaGlzIHRvb2wgaXMgY29weXJpZ2h0IChjKSAyMDA1LCBNYXR0aGlhcyBVcmxpY2hzLgorIyBJdCBpcyByZWxlYXNlZCB1bmRlciB0aGUgR251IFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIuCisjCisjIFRoZSBiYXNpYyBpZGVhIGlzIHRvIGFnZ3JlZ2F0ZSBDVlMgY2hlY2staW5zIGludG8gcmVsYXRlZCBjaGFuZ2VzLgorIyBGb3J0dW5hdGVseSwgImN2c3BzIiBkb2VzIHRoYXQgZm9yIHVzOyBhbGwgd2UgaGF2ZSB0byBkbyBpcyB0byBwYXJzZQorIyBpdHMgb3V0cHV0LgorIworIyBDaGVja2luZyBvdXQgdGhlIGZpbGVzIGlzIGRvbmUgYnkgYSBzaW5nbGUgbG9uZy1ydW5uaW5nIENWUyBjb25uZWN0aW9uCisjIC8gc2VydmVyIHByb2Nlc3MuCisjCisjIFRoZSBoZWFkIHJldmlzaW9uIGlzIG9uIGJyYW5jaCAib3JpZ2luIiBieSBkZWZhdWx0LgorIyBZb3UgY2FuIGNoYW5nZSB0aGF0IHdpdGggdGhlICctbycgb3B0aW9uLgorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIEdldG9wdDo6TG9uZzsKK3VzZSBGaWxlOjpTcGVjOwordXNlIEZpbGU6OlRlbXAgcXcodGVtcGZpbGUgdG1wbmFtKTsKK3VzZSBGaWxlOjpQYXRoIHF3KG1rcGF0aCk7Cit1c2UgRmlsZTo6QmFzZW5hbWUgcXcoYmFzZW5hbWUgZGlybmFtZSk7Cit1c2UgVGltZTo6TG9jYWw7Cit1c2UgSU86OlNvY2tldDsKK3VzZSBJTzo6UGlwZTsKK3VzZSBQT1NJWCBxdyhzdHJmdGltZSBkdXAyIEVOT0VOVCk7Cit1c2UgSVBDOjpPcGVuMjsKKworJFNJR3snUElQRSd9PSJJR05PUkUiOworJEVOVnsnVFonfT0iVVRDIjsKKworb3VyICgkb3B0X2gsJG9wdF9vLCRvcHRfdiwkb3B0X2ssJG9wdF91LCRvcHRfZCwkb3B0X3AsJG9wdF9DLCRvcHRfeiwkb3B0X2ksJG9wdF9QLCAkb3B0X3MsJG9wdF9tLEBvcHRfTSwkb3B0X0EsJG9wdF9TLCRvcHRfTCwgJG9wdF9hLCAkb3B0X3IpOworbXkgKCVjb252X2F1dGhvcl9uYW1lLCAlY29udl9hdXRob3JfZW1haWwpOworCitzdWIgdXNhZ2UoOyQpIHsKKwlteSAkbXNnID0gc2hpZnQ7CisJcHJpbnQoU1RERVJSICJFcnJvcjogJG1zZ1xuIikgaWYgJG1zZzsKKwlwcmludCBTVERFUlIgPDxFTkQ7CitVc2FnZTogJHtcYmFzZW5hbWUgJDB9ICAgICAjIGZldGNoL3VwZGF0ZSBHSVQgZnJvbSBDVlMKKyAgICAgICBbLW8gYnJhbmNoLWZvci1IRUFEXSBbLWhdIFstdl0gWy1kIENWU1JPT1RdIFstQSBhdXRob3ItY29udi1maWxlXQorICAgICAgIFstcCBvcHRzLWZvci1jdnNwc10gWy1QIGZpbGVdIFstQyBHSVRfcmVwb3NpdG9yeV0gWy16IGZ1enpdIFstaV0gWy1rXQorICAgICAgIFstdV0gWy1zIHN1YnN0XSBbLWFdIFstbV0gWy1NIHJlZ2V4XSBbLVMgcmVnZXhdIFstTCBjb21taXRsaW1pdF0KKyAgICAgICBbLXIgcmVtb3RlXSBbQ1ZTX21vZHVsZV0KK0VORAorCWV4aXQoMSk7Cit9CisKK3N1YiByZWFkX2F1dGhvcl9pbmZvKCQpIHsKKwlteSAoJGZpbGUpID0gQF87CisJbXkgJHVzZXI7CisJb3BlbiBteSAkZiwgJzwnLCAiJGZpbGUiIG9yIGRpZSgiRmFpbGVkIHRvIG9wZW4gJGZpbGU6ICQhXG4iKTsKKworCXdoaWxlICg8JGY+KSB7CisJCSMgRXhwZWN0ZWQgZm9ybWF0IGlzIHRoaXM6CisJCSMgICBleG9uPUFuZHJlYXMgRXJpY3Nzb24gPGFlQG9wNS5zZT4KKwkJaWYgKG0vXihcUys/KVxzKj1ccyooLis/KVxzKjwoLispPlxzKiQvKSB7CisJCQkkdXNlciA9ICQxOworCQkJJGNvbnZfYXV0aG9yX25hbWV7JHVzZXJ9ID0gJDI7CisJCQkkY29udl9hdXRob3JfZW1haWx7JHVzZXJ9ID0gJDM7CisJCX0KKwkJIyBIb3dldmVyLCB3ZSBhbHNvIHJlYWQgZnJvbSBDVlNST09UL3VzZXJzIGZvcm1hdAorCQkjIHRvIGVhc2UgbWlncmF0aW9uLgorCQllbHNpZiAoL14oXHcrKTooWyciXT8pKC4rPylcMlxzKiQvKSB7CisJCQlteSAkbWFwcGVkOworCQkJKCR1c2VyLCAkbWFwcGVkKSA9ICgkMSwgJDMpOworCQkJaWYgKCRtYXBwZWQgPX4gL15ccyooLio/KVxzKjwoLiopPlxzKiQvKSB7CisJCQkJJGNvbnZfYXV0aG9yX25hbWV7JHVzZXJ9ID0gJDE7CisJCQkJJGNvbnZfYXV0aG9yX2VtYWlseyR1c2VyfSA9ICQyOworCQkJfQorCQkJZWxzaWYgKCRtYXBwZWQgPX4gL148PyguKik+PyQvKSB7CisJCQkJJGNvbnZfYXV0aG9yX25hbWV7JHVzZXJ9ID0gJHVzZXI7CisJCQkJJGNvbnZfYXV0aG9yX2VtYWlseyR1c2VyfSA9ICQxOworCQkJfQorCQl9CisJCSMgTkVFRFNXT1JLOiBNYXliZSB3YXJuIG9uIHVucmVjb2duaXplZCBsaW5lcz8KKwl9CisJY2xvc2UgKCRmKTsKK30KKworc3ViIHdyaXRlX2F1dGhvcl9pbmZvKCQpIHsKKwlteSAoJGZpbGUpID0gQF87CisJb3BlbiBteSAkZiwgJz4nLCAkZmlsZSBvcgorCSAgZGllKCJGYWlsZWQgdG8gb3BlbiAkZmlsZSBmb3Igd3JpdGluZzogJCEiKTsKKworCWZvcmVhY2ggKGtleXMgJWNvbnZfYXV0aG9yX25hbWUpIHsKKwkJcHJpbnQgJGYgIiRfPSRjb252X2F1dGhvcl9uYW1leyRffSA8JGNvbnZfYXV0aG9yX2VtYWlseyRffT5cbiI7CisJfQorCWNsb3NlICgkZik7Cit9CisKKyMgY29udmVydCBnZXRvcHRzIHNwZWNzIGZvciB1c2UgYnkgZ2l0IGNvbmZpZworc3ViIHJlYWRfcmVwb19jb25maWcgeworICAgICMgU3BsaXQgdGhlIHN0cmluZyBiZXR3ZWVuIGNoYXJhY3RlcnMsIHVubGVzcyB0aGVyZSBpcyBhICc6JworICAgICMgU28gImFiYzpkZSIgYmVjb21lcyBbImEiLCAiYiIsICJjOiIsICJkIiwgImUiXQorCW15IEBvcHRzID0gc3BsaXQoLyAqKD8hOikvLCBzaGlmdCk7CisJZm9yZWFjaCBteSAkbyAoQG9wdHMpIHsKKwkJbXkgJGtleSA9ICRvOworCQkka2V5ID1+IHMvOi8vZzsKKwkJbXkgJGFyZyA9ICdnaXQgY29uZmlnJzsKKwkJJGFyZyAuPSAnIC0tYm9vbCcgaWYgKCRvICF+IC86JC8pOworCisgICAgICAgIGNob21wKG15ICR0bXAgPSBgJGFyZyAtLWdldCBjdnNpbXBvcnQuJGtleWApOworCQlpZiAoJHRtcCAmJiAhKCRhcmcgPX4gLy0tYm9vbC8gJiYgJHRtcCBlcSAnZmFsc2UnKSkgeworICAgICAgICAgICAgbm8gc3RyaWN0ICdyZWZzJzsKKyAgICAgICAgICAgIG15ICRvcHRfbmFtZSA9ICJvcHRfIiAuICRrZXk7CisgICAgICAgICAgICBpZiAoISQkb3B0X25hbWUpIHsKKyAgICAgICAgICAgICAgICAkJG9wdF9uYW1lID0gJHRtcDsKKyAgICAgICAgICAgIH0KKwkJfQorCX0KK30KKworbXkgJG9wdHMgPSAiaGFpdm1rdW86ZDpwOnI6Qzp6OnM6TTpQOkE6UzpMOiI7CityZWFkX3JlcG9fY29uZmlnKCRvcHRzKTsKK0dldG9wdDo6TG9uZzo6Q29uZmlndXJlKCAnbm9faWdub3JlX2Nhc2UnLCAnYnVuZGxpbmcnICk7CisKKyMgdHVybiB0aGUgR2V0b3B0OjpTdGQgc3BlY2lmaWNhdGlvbiBpbiBhIEdldG9wdDo6TG9uZyBvbmUsCisjIHdpdGggc3VwcG9ydCBmb3IgbXVsdGlwbGUgLU0gb3B0aW9ucworR2V0T3B0aW9ucyggbWFwIHsgcy86Lz1zLzsgL00vID8gIiRfXEAiIDogJF8gfSBzcGxpdCggLyg/ITopLywgJG9wdHMgKSApCisgICAgb3IgdXNhZ2UoKTsKK3VzYWdlIGlmICRvcHRfaDsKKworaWYgKEBBUkdWID09IDApIHsKKwkJY2hvbXAobXkgJG1vZHVsZSA9IGBnaXQgY29uZmlnIC0tZ2V0IGN2c2ltcG9ydC5tb2R1bGVgKTsKKwkJcHVzaChAQVJHViwgJG1vZHVsZSkgaWYgJD8gPT0gMDsKK30KK0BBUkdWIDw9IDEgb3IgdXNhZ2UoIllvdSBjYW4ndCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgQ1ZTIG1vZHVsZSIpOworCitpZiAoJG9wdF9kKSB7CisJJEVOVnsiQ1ZTUk9PVCJ9ID0gJG9wdF9kOworfSBlbHNpZiAoLWYgJ0NWUy9Sb290JykgeworCW9wZW4gbXkgJGYsICc8JywgJ0NWUy9Sb290JyBvciBkaWUgJ0ZhaWxlZCB0byBvcGVuIENWUy9Sb290JzsKKwkkb3B0X2QgPSA8JGY+OworCWNob21wICRvcHRfZDsKKwljbG9zZSAkZjsKKwkkRU5WeyJDVlNST09UIn0gPSAkb3B0X2Q7Cit9IGVsc2lmICgkRU5WeyJDVlNST09UIn0pIHsKKwkkb3B0X2QgPSAkRU5WeyJDVlNST09UIn07Cit9IGVsc2UgeworCXVzYWdlKCJDVlNST09UIG5lZWRzIHRvIGJlIHNldCIpOworfQorJG9wdF9zIHx8PSAiLSI7Ciskb3B0X2EgfHw9IDA7CisKK215ICRnaXRfdHJlZSA9ICRvcHRfQzsKKyRnaXRfdHJlZSB8fD0gIi4iOworCitteSAkcmVtb3RlOworaWYgKGRlZmluZWQgJG9wdF9yKSB7CisJJHJlbW90ZSA9ICdyZWZzL3JlbW90ZXMvJyAuICRvcHRfcjsKKwkkb3B0X28gfHw9ICJtYXN0ZXIiOworfSBlbHNlIHsKKwkkb3B0X28gfHw9ICJvcmlnaW4iOworCSRyZW1vdGUgPSAncmVmcy9oZWFkcyc7Cit9CisKK215ICRjdnNfdHJlZTsKK2lmICgkI0FSR1YgPT0gMCkgeworCSRjdnNfdHJlZSA9ICRBUkdWWzBdOworfSBlbHNpZiAoLWYgJ0NWUy9SZXBvc2l0b3J5JykgeworCW9wZW4gbXkgJGYsICc8JywgJ0NWUy9SZXBvc2l0b3J5JyBvcgorCSAgICBkaWUgJ0ZhaWxlZCB0byBvcGVuIENWUy9SZXBvc2l0b3J5JzsKKwkkY3ZzX3RyZWUgPSA8JGY+OworCWNob21wICRjdnNfdHJlZTsKKwljbG9zZSAkZjsKK30gZWxzZSB7CisJdXNhZ2UoIkNWUyBtb2R1bGUgaGFzIHRvIGJlIHNwZWNpZmllZCIpOworfQorCitvdXIgQG1lcmdlcnggPSAoKTsKK2lmICgkb3B0X20pIHsKKwlAbWVyZ2VyeCA9ICggcXIvXGIoPzpmcm9tfG9mfG1lcmdlfG1lcmdpbmd8bWVyZ2VkKSAoWy1cd10rKS9pICk7Cit9CitpZiAoQG9wdF9NKSB7CisJcHVzaCAoQG1lcmdlcngsIG1hcCB7IHFyLyRfLyB9IEBvcHRfTSk7Cit9CisKKyMgUmVtZW1iZXIgVVRDIG9mIG91ciBzdGFydGluZyB0aW1lCisjIHdlJ2xsIHdhbnQgdG8gYXZvaWQgaW1wb3J0aW5nIGNvbW1pdHMKKyMgdGhhdCBhcmUgdG9vIHJlY2VudAorb3VyICRzdGFydHRpbWUgPSB0aW1lKCk7CisKK3NlbGVjdChTVERFUlIpOyAkfD0xOyBzZWxlY3QoU1RET1VUKTsKKworCitwYWNrYWdlIENWU2Nvbm47CisjIEJhc2ljIENWUyBkaWFsb2cuCisjIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBjb25uZWN0aW5nIGFuZCBkb3dubG9hZGluZywgc28gLi4uCisKK3VzZSBGaWxlOjpTcGVjOwordXNlIEZpbGU6OlRlbXAgcXcodGVtcGZpbGUpOwordXNlIFBPU0lYIHF3KHN0cmZ0aW1lIGR1cDIpOworCitzdWIgbmV3IHsKKwlteSAoJHdoYXQsJHJlcG8sJHN1YmRpcikgPSBAXzsKKwkkd2hhdD1yZWYoJHdoYXQpIGlmIHJlZigkd2hhdCk7CisKKwlteSAkc2VsZiA9IHt9OworCSRzZWxmLT57J2J1ZmZlcid9ID0gIiI7CisJYmxlc3MoJHNlbGYsJHdoYXQpOworCisJJHJlcG8gPX4gcyMvKyQjIzsKKwkkc2VsZi0+eydmdWxscmVwJ30gPSAkcmVwbzsKKwkkc2VsZi0+Y29ubigpOworCisJJHNlbGYtPnsnc3ViZGlyJ30gPSAkc3ViZGlyOworCSRzZWxmLT57J2xpbmVzJ30gPSB1bmRlZjsKKworCXJldHVybiAkc2VsZjsKK30KKworc3ViIGNvbm4geworCW15ICRzZWxmID0gc2hpZnQ7CisJbXkgJHJlcG8gPSAkc2VsZi0+eydmdWxscmVwJ307CisJaWYgKCRyZXBvID1+IHMvXjpwc2VydmVyKD86KFteOl0qKSk6KD86KC4qPykoPzo6KC4qPykpP0ApPyhbXjpcL10qKSg/OjooXGQqKSk/Ly8pIHsKKwkJbXkgKCRwYXJhbSwkdXNlciwkcGFzcywkc2VydiwkcG9ydCkgPSAoJDEsJDIsJDMsJDQsJDUpOworCisJCW15ICgkcHJveHlob3N0LCRwcm94eXBvcnQpOworCQlpZiAoJHBhcmFtICYmICgkcGFyYW0gPX4gbS9wcm94eT0oW147XSspLykpIHsKKwkJCSRwcm94eWhvc3QgPSAkMTsKKwkJCSMgRGVmYXVsdCBwcm94eXBvcnQsIGlmIG5vdCBzcGVjaWZpZWQsIGlzIDgwODAuCisJCQkkcHJveHlwb3J0ID0gODA4MDsKKwkJCWlmICgkRU5WeyJDVlNfUFJPWFlfUE9SVCJ9KSB7CisJCQkJJHByb3h5cG9ydCA9ICRFTlZ7IkNWU19QUk9YWV9QT1JUIn07CisJCQl9CisJCQlpZiAoJHBhcmFtID1+IG0vcHJveHlwb3J0PShbXjtdKykvKSB7CisJCQkJJHByb3h5cG9ydCA9ICQxOworCQkJfQorCQl9CisKKwkJIyBpZiB1c2VybmFtZSBpcyBub3QgZXhwbGljaXQgaW4gQ1ZTUk9PVCwgdGhlbiB1c2UgY3VycmVudCB1c2VyLCBhcyBjdnMgd291bGQKKwkJJHVzZXI9KGdldGxvZ2luKCkgfHwgJEVOVnsnTE9HTkFNRSd9IHx8ICRFTlZ7J1VTRVInfSB8fCAiYW5vbnltb3VzIikgdW5sZXNzICR1c2VyOworCQlteSAkcnIyID0gIi0iOworCQl1bmxlc3MgKCRwb3J0KSB7CisJCQkkcnIyID0gIjpwc2VydmVyOiR1c2VyXEAkc2VydjokcmVwbyI7CisJCQkkcG9ydD0yNDAxOworCQl9CisJCW15ICRyciA9ICI6cHNlcnZlcjokdXNlclxAJHNlcnY6JHBvcnQkcmVwbyI7CisKKwkJdW5sZXNzICgkcGFzcykgeworCQkJb3BlbihILCRFTlZ7J0hPTUUnfS4iLy5jdnNwYXNzIikgYW5kIGRvIHsKKwkJCQkjIDpwc2VydmVyOmN2c0BtZWEudG10LnRlbGUuZmk6L2N2c3Jvb3Qvem1haWxlciBBaDxaCisJCQkJd2hpbGUgKDxIPikgeworCQkJCQljaG9tcDsKKwkJCQkJcy9eXC9cZCtccysvLzsKKwkJCQkJbXkgKCR3LCRwKSA9IHNwbGl0KC9ccy8sJF8sMik7CisJCQkJCWlmICgkdyBlcSAkcnIgb3IgJHcgZXEgJHJyMikgeworCQkJCQkJJHBhc3MgPSAkcDsKKwkJCQkJCWxhc3Q7CisJCQkJCX0KKwkJCQl9CisJCQl9OworCQl9CisJCSRwYXNzPSJBIiB1bmxlc3MgJHBhc3M7CisKKwkJbXkgKCRzLCAkcmVwKTsKKwkJaWYgKCRwcm94eWhvc3QpIHsKKworCQkJIyBVc2UgYSBIVFRQIFByb3h5LiBPbmx5IHdvcmtzIGZvciBIVFRQIHByb3hpZXMgdGhhdAorCQkJIyBkb24ndCByZXF1aXJlIHVzZXIgYXV0aGVudGljYXRpb24KKwkJCSMKKwkJCSMgU2VlOiBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyODE3LnR4dAorCisJCQkkcyA9IElPOjpTb2NrZXQ6OklORVQtPm5ldyhQZWVySG9zdCA9PiAkcHJveHlob3N0LCBQZWVyUG9ydCA9PiAkcHJveHlwb3J0KTsKKwkJCWRpZSAiU29ja2V0IHRvICRwcm94eWhvc3Q6ICQhXG4iIHVubGVzcyBkZWZpbmVkICRzOworCQkJJHMtPndyaXRlKCJDT05ORUNUICRzZXJ2OiRwb3J0IEhUVFAvMS4xXHJcbkhvc3Q6ICRzZXJ2OiRwb3J0XHJcblxyXG4iKQorCSAgICAgICAgICAgICAgICAgICAgICAgIG9yIGRpZSAiV3JpdGUgdG8gJHByb3h5aG9zdDogJCFcbiI7CisJICAgICAgICAgICAgICAgICRzLT5mbHVzaCgpOworCisJCQkkcmVwID0gPCRzPjsKKworCQkJIyBUaGUgYW5zd2VyIHNob3VsZCBsb29rIGxpa2UgJ0hUVFAvMS54IDJ5eSAuLi4uJworCQkJaWYgKCEoJHJlcCA9fiBtI15IVFRQLzFcLi4gMlswLTldWzAtOV0jKSkgeworCQkJCWRpZSAiUHJveHkgY29ubmVjdDogJHJlcFxuIjsKKwkJCX0KKwkJCSMgU2tpcCB1cCB0byB0aGUgZW1wdHkgbGluZSBvZiB0aGUgcHJveHkgc2VydmVyIG91dHB1dAorCQkJIyBpbmNsdWRpbmcgdGhlIHJlc3BvbnNlIGhlYWRlcnMuCisJCQl3aGlsZSAoJHJlcCA9IDwkcz4pIHsKKwkJCQlsYXN0IGlmICghZGVmaW5lZCAkcmVwIHx8CisJCQkJCSAkcmVwIGVxICJcbiIgfHwKKwkJCQkJICRyZXAgZXEgIlxyXG4iKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCSRzID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KFBlZXJIb3N0ID0+ICRzZXJ2LCBQZWVyUG9ydCA9PiAkcG9ydCk7CisJCQlkaWUgIlNvY2tldCB0byAkc2VydjogJCFcbiIgdW5sZXNzIGRlZmluZWQgJHM7CisJCX0KKworCQkkcy0+d3JpdGUoIkJFR0lOIEFVVEggUkVRVUVTVFxuJHJlcG9cbiR1c2VyXG4kcGFzc1xuRU5EIEFVVEggUkVRVUVTVFxuIikKKwkJCW9yIGRpZSAiV3JpdGUgdG8gJHNlcnY6ICQhXG4iOworCQkkcy0+Zmx1c2goKTsKKworCQkkcmVwID0gPCRzPjsKKworCQlpZiAoJHJlcCBuZSAiSSBMT1ZFIFlPVVxuIikgeworCQkJJHJlcD0iPHVua25vd24+IiB1bmxlc3MgJHJlcDsKKwkJCWRpZSAiQXV0aFJlcGx5OiAkcmVwXG4iOworCQl9CisJCSRzZWxmLT57J3NvY2tldG8nfSA9ICRzOworCQkkc2VsZi0+eydzb2NrZXRpJ30gPSAkczsKKwl9IGVsc2UgeyAjIGxvY2FsIG9yIGV4dDogRm9yayBvZmYgb3VyIG93biBjdnMgc2VydmVyLgorCQlteSAkcHIgPSBJTzo6UGlwZS0+bmV3KCk7CisJCW15ICRwdyA9IElPOjpQaXBlLT5uZXcoKTsKKwkJbXkgJHBpZCA9IGZvcmsoKTsKKwkJZGllICJGb3JrOiAkIVxuIiB1bmxlc3MgZGVmaW5lZCAkcGlkOworCQlteSAkY3ZzID0gJ2N2cyc7CisJCSRjdnMgPSAkRU5We0NWU19TRVJWRVJ9IGlmIGV4aXN0cyAkRU5We0NWU19TRVJWRVJ9OworCQlteSAkcnNoID0gJ3JzaCc7CisJCSRyc2ggPSAkRU5We0NWU19SU0h9IGlmIGV4aXN0cyAkRU5We0NWU19SU0h9OworCisJCW15IEBjdnMgPSAoJGN2cywgJ3NlcnZlcicpOworCQlteSAoJGxvY2FsLCAkdXNlciwgJGhvc3QpOworCQkkbG9jYWwgPSAkcmVwbyA9fiBzLzpsb2NhbDovLzsKKwkJaWYgKCEkbG9jYWwpIHsKKwkJICAgICRyZXBvID1+IHMvOmV4dDovLzsKKwkJICAgICRsb2NhbCA9ICEoJHJlcG8gPX4gcy9eKD86KFteXEA6XSspXEApPyhbXjpdKyk6Ly8pOworCQkgICAgKCR1c2VyLCAkaG9zdCkgPSAoJDEsICQyKTsKKwkJfQorCQlpZiAoISRsb2NhbCkgeworCQkgICAgaWYgKCR1c2VyKSB7CisJCQl1bnNoaWZ0IEBjdnMsICRyc2gsICctbCcsICR1c2VyLCAkaG9zdDsKKwkJICAgIH0gZWxzZSB7CisJCQl1bnNoaWZ0IEBjdnMsICRyc2gsICRob3N0OworCQkgICAgfQorCQl9CisKKwkJdW5sZXNzICgkcGlkKSB7CisJCQkkcHItPndyaXRlcigpOworCQkJJHB3LT5yZWFkZXIoKTsKKwkJCWR1cDIoJHB3LT5maWxlbm8oKSwwKTsKKwkJCWR1cDIoJHByLT5maWxlbm8oKSwxKTsKKwkJCSRwci0+Y2xvc2UoKTsKKwkJCSRwdy0+Y2xvc2UoKTsKKwkJCWV4ZWMoQGN2cyk7CisJCX0KKwkJJHB3LT53cml0ZXIoKTsKKwkJJHByLT5yZWFkZXIoKTsKKwkJJHNlbGYtPnsnc29ja2V0byd9ID0gJHB3OworCQkkc2VsZi0+eydzb2NrZXRpJ30gPSAkcHI7CisJfQorCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIlJvb3QgJHJlcG9cbiIpOworCisJIyBUcmlhbCBhbmQgZXJyb3Igc2F5cyB0aGF0IHRoaXMgcHJvYmFibHkgaXMgdGhlIG1pbmltdW0gc2V0CisJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiVmFsaWQtcmVzcG9uc2VzIG9rIGVycm9yIFZhbGlkLXJlcXVlc3RzIE1vZGUgTSBNYmluYXJ5IEUgQ2hlY2tlZC1pbiBDcmVhdGVkIFVwZGF0ZWQgTWVyZ2VkIFJlbW92ZWRcbiIpOworCisJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgidmFsaWQtcmVxdWVzdHNcbiIpOworCSRzZWxmLT57J3NvY2tldG8nfS0+Zmx1c2goKTsKKworCWNob21wKG15ICRyZXA9JHNlbGYtPnJlYWRsaW5lKCkpOworCWlmICgkcmVwICF+IHMvXlZhbGlkLXJlcXVlc3RzXHMqLy8pIHsKKwkJJHJlcD0iPHVua25vd24+IiB1bmxlc3MgJHJlcDsKKwkJZGllICJFeHBlY3RlZCBWYWxpZC1yZXF1ZXN0cyBmcm9tIHNlcnZlciwgYnV0IGdvdDogJHJlcFxuIjsKKwl9CisJY2hvbXAobXkgJHJlcz0kc2VsZi0+cmVhZGxpbmUoKSk7CisJZGllICJ2YWxpZFJlcGx5OiAkcmVzXG4iIGlmICRyZXMgbmUgIm9rIjsKKworCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIlVzZVVuY2hhbmdlZFxuIikgaWYgJHJlcCA9fiAvXGJVc2VVbmNoYW5nZWRcYi87CisJJHNlbGYtPnsncmVwbyd9ID0gJHJlcG87Cit9CisKK3N1YiByZWFkbGluZSB7CisJbXkgKCRzZWxmKSA9IEBfOworCXJldHVybiAkc2VsZi0+eydzb2NrZXRpJ30tPmdldGxpbmUoKTsKK30KKworc3ViIF9maWxlIHsKKwkjIFJlcXVlc3QgYSBmaWxlIHdpdGggYSBnaXZlbiByZXZpc2lvbi4KKwkjIFRyaWFsIGFuZCBlcnJvciBzYXlzIHRoaXMgaXMgYSBnb29kIHdheSB0byBkbyBpdC4gOi0vCisJbXkgKCRzZWxmLCRmbiwkcmV2KSA9IEBfOworCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIkFyZ3VtZW50IC1OXG4iKSBvciByZXR1cm4gdW5kZWY7CisJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiQXJndW1lbnQgLVBcbiIpIG9yIHJldHVybiB1bmRlZjsKKwkjIC1razogTGludXMnIHZlcnNpb24gZG9lc24ndCB1c2UgaXQgLSBkZWZhdWx0cyB0byBvZmYKKwlpZiAoJG9wdF9rKSB7CisJICAgICRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIkFyZ3VtZW50IC1ra1xuIikgb3IgcmV0dXJuIHVuZGVmOworCX0KKwkkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCJBcmd1bWVudCAtclxuIikgb3IgcmV0dXJuIHVuZGVmOworCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIkFyZ3VtZW50ICRyZXZcbiIpIG9yIHJldHVybiB1bmRlZjsKKwkkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCJBcmd1bWVudCAtLVxuIikgb3IgcmV0dXJuIHVuZGVmOworCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIkFyZ3VtZW50ICRzZWxmLT57J3N1YmRpcid9LyRmblxuIikgb3IgcmV0dXJuIHVuZGVmOworCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIkRpcmVjdG9yeSAuXG4iKSBvciByZXR1cm4gdW5kZWY7CisJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiJHNlbGYtPnsncmVwbyd9XG4iKSBvciByZXR1cm4gdW5kZWY7CisJIyAkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCJTdGlja3kgVDEuMFxuIikgb3IgcmV0dXJuIHVuZGVmOworCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoImNvXG4iKSBvciByZXR1cm4gdW5kZWY7CisJJHNlbGYtPnsnc29ja2V0byd9LT5mbHVzaCgpIG9yIHJldHVybiB1bmRlZjsKKwkkc2VsZi0+eydsaW5lcyd9ID0gMDsKKwlyZXR1cm4gMTsKK30KK3N1YiBfbGluZSB7CisJIyBSZWFkIGEgbGluZSBmcm9tIHRoZSBzZXJ2ZXIuCisJIyAuLi4gZXhjZXB0IHRoYXQgJ2xpbmUnIG1heSBiZSBhbiBlbnRpcmUgZmlsZS4gOy0pCisJbXkgKCRzZWxmLCAkZmgpID0gQF87CisJZGllICJOb3QgaW4gbGluZXMiIHVubGVzcyBkZWZpbmVkICRzZWxmLT57J2xpbmVzJ307CisKKwlteSAkbGluZTsKKwlteSAkcmVzPTA7CisJd2hpbGUgKGRlZmluZWQoJGxpbmUgPSAkc2VsZi0+cmVhZGxpbmUoKSkpIHsKKwkJIyBNIFUgZ251cGctY3ZzLXJlcC9BVVRIT1JTCisJCSMgVXBkYXRlZCBnbnVwZy1jdnMtcmVwLworCQkjIC9kYXRlbi9zcmMvcnN5bmMvZ251cGctY3ZzLXJlcC9BVVRIT1JTCisJCSMgL0FVVEhPUlMvMS4xLy8vVDEuMQorCQkjIHU9cncsZz1ydyxvPXJ3CisJCSMgMAorCQkjIG9rCisKKwkJaWYgKCRsaW5lID1+IHMvXig/OkNyZWF0ZWR8VXBkYXRlZCkgLy8pIHsKKwkJCSRsaW5lID0gJHNlbGYtPnJlYWRsaW5lKCk7ICMgcGF0aAorCQkJJGxpbmUgPSAkc2VsZi0+cmVhZGxpbmUoKTsgIyBFbnRyaWVzIGxpbmUKKwkJCW15ICRtb2RlID0gJHNlbGYtPnJlYWRsaW5lKCk7IGNob21wICRtb2RlOworCQkJJHNlbGYtPnsnbW9kZSd9ID0gJG1vZGU7CisJCQlkZWZpbmVkIChteSAkY250ID0gJHNlbGYtPnJlYWRsaW5lKCkpCisJCQkJb3IgZGllICJFT0YgZnJvbSBzZXJ2ZXIgYWZ0ZXIgJ0NoYW5nZWQnXG4iOworCQkJY2hvbXAgJGNudDsKKwkJCWRpZSAiRHVoOiBGaWxlc2l6ZSAkY250IiBpZiAkY250ICF+IC9eXGQrJC87CisJCQkkbGluZT0iIjsKKwkJCSRyZXMgPSAkc2VsZi0+X2ZldGNoZmlsZSgkZmgsICRjbnQpOworCQl9IGVsc2lmICgkbGluZSA9fiBzL14gLy8pIHsKKwkJCXByaW50ICRmaCAkbGluZTsKKwkJCSRyZXMgKz0gbGVuZ3RoKCRsaW5lKTsKKwkJfSBlbHNpZiAoJGxpbmUgPX4gL15NXGIvKSB7CisJCQkjIG91dHB1dCwgZG8gbm90aGluZworCQl9IGVsc2lmICgkbGluZSA9fiAvXk1iaW5hcnlcYi8pIHsKKwkJCW15ICRjbnQ7CisJCQlkaWUgIkVPRiBmcm9tIHNlcnZlciBhZnRlciAnTWJpbmFyeSciIHVubGVzcyBkZWZpbmVkICgkY250ID0gJHNlbGYtPnJlYWRsaW5lKCkpOworCQkJY2hvbXAgJGNudDsKKwkJCWRpZSAiRHVoOiBNYmluYXJ5ICRjbnQiIGlmICRjbnQgIX4gL15cZCskLyBvciAkY250PDE7CisJCQkkbGluZT0iIjsKKwkJCSRyZXMgKz0gJHNlbGYtPl9mZXRjaGZpbGUoJGZoLCAkY250KTsKKwkJfSBlbHNlIHsKKwkJCWNob21wICRsaW5lOworCQkJaWYgKCRsaW5lIGVxICJvayIpIHsKKwkJCQkjIHByaW50IFNUREVSUiAiUzogb2sgKCIubGVuZ3RoKCRyZXMpLiIpXG4iOworCQkJCXJldHVybiAkcmVzOworCQkJfSBlbHNpZiAoJGxpbmUgPX4gcy9eRSAvLykgeworCQkJCSMgcHJpbnQgU1RERVJSICJTOiAkbGluZVxuIjsKKwkJCX0gZWxzaWYgKCRsaW5lID1+IC9eKFJlbW92ZS1lbnRyeXxSZW1vdmVkKSAvaSkgeworCQkJCSRsaW5lID0gJHNlbGYtPnJlYWRsaW5lKCk7ICMgZmlsZW5hbWUKKwkJCQkkbGluZSA9ICRzZWxmLT5yZWFkbGluZSgpOyAjIE9LCisJCQkJY2hvbXAgJGxpbmU7CisJCQkJZGllICJVbmtub3duOiAkbGluZSIgaWYgJGxpbmUgbmUgIm9rIjsKKwkJCQlyZXR1cm4gLTE7CisJCQl9IGVsc2UgeworCQkJCWRpZSAiVW5rbm93bjogJGxpbmVcbiI7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHVuZGVmOworfQorc3ViIGZpbGUgeworCW15ICgkc2VsZiwkZm4sJHJldikgPSBAXzsKKwlteSAkcmVzOworCisJbXkgKCRmaCwgJG5hbWUpID0gdGVtcGZpbGUoJ2dpdGN2cy5YWFhYWFgnLAorCQkgICAgRElSID0+IEZpbGU6OlNwZWMtPnRtcGRpcigpLCBVTkxJTksgPT4gMSk7CisKKwkkc2VsZi0+X2ZpbGUoJGZuLCRyZXYpIGFuZCAkcmVzID0gJHNlbGYtPl9saW5lKCRmaCk7CisKKwlpZiAoIWRlZmluZWQgJHJlcykgeworCSAgICBwcmludCBTVERFUlIgIlNlcnZlciBoYXMgZ29uZSBhd2F5IHdoaWxlIGZldGNoaW5nICRmbiAkcmV2LCByZXRyeWluZy4uLlxuIjsKKwkgICAgdHJ1bmNhdGUgJGZoLCAwOworCSAgICAkc2VsZi0+Y29ubigpOworCSAgICAkc2VsZi0+X2ZpbGUoJGZuLCRyZXYpIG9yIGRpZSAiTm8gZmlsZSBjb21tYW5kIHNlbmQiOworCSAgICAkcmVzID0gJHNlbGYtPl9saW5lKCRmaCk7CisJICAgIGRpZSAiUmV0cnkgZmFpbGVkIiB1bmxlc3MgZGVmaW5lZCAkcmVzOworCX0KKwljbG9zZSAoJGZoKTsKKworCXJldHVybiAoJG5hbWUsICRyZXMpOworfQorc3ViIF9mZXRjaGZpbGUgeworCW15ICgkc2VsZiwgJGZoLCAkY250KSA9IEBfOworCW15ICRyZXMgPSAwOworCW15ICRidWZzaXplID0gMTAyNCAqIDEwMjQ7CisJd2hpbGUgKCRjbnQpIHsKKwkgICAgaWYgKCRidWZzaXplID4gJGNudCkgeworCQkkYnVmc2l6ZSA9ICRjbnQ7CisJICAgIH0KKwkgICAgbXkgJGJ1ZjsKKwkgICAgbXkgJG51bSA9ICRzZWxmLT57J3NvY2tldGknfS0+cmVhZCgkYnVmLCRidWZzaXplKTsKKwkgICAgZGllICJTZXJ2ZXI6IEZpbGVzaXplICRjbnQ6ICRudW06ICQhXG4iIGlmIG5vdCBkZWZpbmVkICRudW0gb3IgJG51bTw9MDsKKwkgICAgcHJpbnQgJGZoICRidWY7CisJICAgICRyZXMgKz0gJG51bTsKKwkgICAgJGNudCAtPSAkbnVtOworCX0KKwlyZXR1cm4gJHJlczsKK30KKworCitwYWNrYWdlIG1haW47CisKK215ICRjdnMgPSBDVlNjb25uLT5uZXcoJG9wdF9kLCAkY3ZzX3RyZWUpOworCisKK3N1YiBwZGF0ZSgkKSB7CisJbXkgKCRkKSA9IEBfOworCW0jKFxkezIsNH0pLyhcZFxkKS8oXGRcZClccyhcZFxkKTooXGRcZCkoPzo6KFxkXGQpKT8jCisJCW9yIGRpZSAiVW5wYXJzZWFibGUgZGF0ZTogJGRcbiI7CisJbXkgJHk9JDE7ICR5LT0xOTAwIGlmICR5PjE5MDA7CisJcmV0dXJuIHRpbWVnbSgkNnx8MCwkNSwkNCwkMywkMi0xLCR5KTsKK30KKworc3ViIHBtb2RlKCQpIHsKKwlteSAoJG1vZGUpID0gQF87CisJbXkgJG0gPSAwOworCW15ICRtbSA9IDA7CisJbXkgJHVtID0gMDsKKwlmb3IgbXkgJHgoc3BsaXQoLy8sJG1vZGUpKSB7CisJCWlmICgkeCBlcSAiLCIpIHsKKwkJCSRtIHw9ICRtbSYkdW07CisJCQkkbW0gPSAwOworCQkJJHVtID0gMDsKKwkJfSBlbHNpZiAoJHggZXEgInUiKSB7ICR1bSB8PSAwNzAwOworCQl9IGVsc2lmICgkeCBlcSAiZyIpIHsgJHVtIHw9IDAwNzA7CisJCX0gZWxzaWYgKCR4IGVxICJvIikgeyAkdW0gfD0gMDAwNzsKKwkJfSBlbHNpZiAoJHggZXEgInIiKSB7ICRtbSB8PSAwNDQ0OworCQl9IGVsc2lmICgkeCBlcSAidyIpIHsgJG1tIHw9IDAyMjI7CisJCX0gZWxzaWYgKCR4IGVxICJ4IikgeyAkbW0gfD0gMDExMTsKKwkJfSBlbHNpZiAoJHggZXEgIj0iKSB7ICMgZG8gbm90aGluZworCQl9IGVsc2UgeyBkaWUgIlVua25vd24gbW9kZTogJG1vZGVcbiI7CisJCX0KKwl9CisJJG0gfD0gJG1tJiR1bTsKKwlyZXR1cm4gJG07Cit9CisKK3N1YiBnZXR3ZCgpIHsKKwlteSAkcHdkID0gYHB3ZGA7CisJY2hvbXAgJHB3ZDsKKwlyZXR1cm4gJHB3ZDsKK30KKworc3ViIGlzX3NoYTEgeworCW15ICRzID0gc2hpZnQ7CisJcmV0dXJuICRzID1+IC9eW2EtZjAtOV17NDB9JC87Cit9CisKK3N1YiBnZXRfaGVhZHJlZiAoJCkgeworCW15ICRuYW1lID0gc2hpZnQ7CisJbXkgJHIgPSBgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAnJG5hbWUnIDI+L2Rldi9udWxsYDsKKwlyZXR1cm4gdW5kZWYgdW5sZXNzICQ/ID09IDA7CisJY2hvbXAgJHI7CisJcmV0dXJuICRyOworfQorCistZCAkZ2l0X3RyZWUKKwlvciBta2RpcigkZ2l0X3RyZWUsMDc3NykKKwlvciBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgJGdpdF90cmVlOiAkISI7CitjaGRpcigkZ2l0X3RyZWUpOworCitteSAkbGFzdF9icmFuY2ggPSAiIjsKK215ICRvcmlnX2JyYW5jaCA9ICIiOworbXkgJWJyYW5jaF9kYXRlOworbXkgJHRpcF9hdF9zdGFydCA9IHVuZGVmOworCitteSAkZ2l0X2RpciA9ICRFTlZ7IkdJVF9ESVIifSB8fCAiLmdpdCI7CiskZ2l0X2RpciA9IGdldHdkKCkuIi8iLiRnaXRfZGlyIHVubGVzcyAkZ2l0X2RpciA9fiBtI14vIzsKKyRFTlZ7IkdJVF9ESVIifSA9ICRnaXRfZGlyOworbXkgJG9yaWdfZ2l0X2luZGV4OworJG9yaWdfZ2l0X2luZGV4ID0gJEVOVntHSVRfSU5ERVhfRklMRX0gaWYgZXhpc3RzICRFTlZ7R0lUX0lOREVYX0ZJTEV9OworCitteSAlaW5kZXg7ICMgaG9sZHMgZmlsZW5hbWVzIG9mIG9uZSBpbmRleCBwZXIgYnJhbmNoCisKK3VubGVzcyAoLWQgJGdpdF9kaXIpIHsKKwlzeXN0ZW0oImdpdC1pbml0Iik7CisJZGllICJDYW5ub3QgaW5pdCB0aGUgR0lUIGRiIGF0ICRnaXRfdHJlZTogJD9cbiIgaWYgJD87CisJc3lzdGVtKCJnaXQtcmVhZC10cmVlIik7CisJZGllICJDYW5ub3QgaW5pdCBhbiBlbXB0eSB0cmVlOiAkP1xuIiBpZiAkPzsKKworCSRsYXN0X2JyYW5jaCA9ICRvcHRfbzsKKwkkb3JpZ19icmFuY2ggPSAiIjsKK30gZWxzZSB7CisJb3BlbihGLCAiZ2l0LXN5bWJvbGljLXJlZiBIRUFEIHwiKSBvcgorCQlkaWUgIkNhbm5vdCBydW4gZ2l0LXN5bWJvbGljLXJlZjogJCFcbiI7CisJY2hvbXAgKCRsYXN0X2JyYW5jaCA9IDxGPik7CisJJGxhc3RfYnJhbmNoID0gYmFzZW5hbWUoJGxhc3RfYnJhbmNoKTsKKwljbG9zZShGKTsKKwl1bmxlc3MgKCRsYXN0X2JyYW5jaCkgeworCQl3YXJuICJDYW5ub3QgcmVhZCB0aGUgbGFzdCBicmFuY2ggbmFtZTogJCEgLS0gYXNzdW1pbmcgJ21hc3RlcidcbiI7CisJCSRsYXN0X2JyYW5jaCA9ICJtYXN0ZXIiOworCX0KKwkkb3JpZ19icmFuY2ggPSAkbGFzdF9icmFuY2g7CisJJHRpcF9hdF9zdGFydCA9IGBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQURgOworCisJIyBHZXQgdGhlIGxhc3QgaW1wb3J0IHRpbWVzdGFtcHMKKwlteSAkZm10ID0gJygkcmVmLCAkYXV0aG9yKSA9ICglKHJlZm5hbWUpLCAlKGF1dGhvcikpOyc7CisJb3BlbihILCAiZ2l0LWZvci1lYWNoLXJlZiAtLXBlcmwgLS1mb3JtYXQ9JyRmbXQnICRyZW1vdGUgfCIpIG9yCisJCWRpZSAiQ2Fubm90IHJ1biBnaXQtZm9yLWVhY2gtcmVmOiAkIVxuIjsKKwl3aGlsZSAoZGVmaW5lZChteSAkZW50cnkgPSA8SD4pKSB7CisJCW15ICgkcmVmLCAkYXV0aG9yKTsKKwkJZXZhbCgkZW50cnkpIHx8IGRpZSAiY2Fubm90IGV2YWwgcmVmcyBsaXN0OiAkQCI7CisJCW15ICgkaGVhZCkgPSAoJHJlZiA9fiBtfF4kcmVtb3RlLyguKil8KTsKKwkJJGF1dGhvciA9fiAvXi4qXHMoXGQrKVxzWy0rXVxkezR9JC87CisJCSRicmFuY2hfZGF0ZXskaGVhZH0gPSAkMTsKKwl9CisJY2xvc2UoSCk7CisgICAgICAgIGlmICghZXhpc3RzICRicmFuY2hfZGF0ZXskb3B0X299KSB7CisJCWRpZSAiQnJhbmNoICckb3B0X28nIGRvZXMgbm90IGV4aXN0LlxuIi4KKwkJICAgICAgICJFaXRoZXIgdXNlIHRoZSBjb3JyZWN0ICctbyBicmFuY2gnIG9wdGlvbixcbiIuCisJCSAgICAgICAib3IgaW1wb3J0IHRvIGEgbmV3IHJlcG9zaXRvcnkuXG4iOworICAgICAgICB9Cit9CisKKy1kICRnaXRfZGlyCisJb3IgZGllICJDb3VsZCBub3QgY3JlYXRlIGdpdCBzdWJkaXIgKCRnaXRfZGlyKS5cbiI7CisKKyMgbm93IHdlIHJlYWQgKGFuZCBwb3NzaWJseSBzYXZlKSBhdXRob3ItaW5mbyBhcyB3ZWxsCistZiAiJGdpdF9kaXIvY3ZzLWF1dGhvcnMiIGFuZAorICByZWFkX2F1dGhvcl9pbmZvKCIkZ2l0X2Rpci9jdnMtYXV0aG9ycyIpOworaWYgKCRvcHRfQSkgeworCXJlYWRfYXV0aG9yX2luZm8oJG9wdF9BKTsKKwl3cml0ZV9hdXRob3JfaW5mbygiJGdpdF9kaXIvY3ZzLWF1dGhvcnMiKTsKK30KKworCisjCisjIHJ1biBjdnNwcyBpbnRvIGEgZmlsZSB1bmxlc3Mgd2UgYXJlIGdldHRpbmcKKyMgaXQgcGFzc2VkIGFzIGEgZmlsZSB2aWEgJG9wdF9QCisjCitteSAkY3ZzcHNmaWxlOwordW5sZXNzICgkb3B0X1ApIHsKKwlwcmludCAiUnVubmluZyBjdnNwcy4uLlxuIiBpZiAkb3B0X3Y7CisJbXkgJHBpZCA9IG9wZW4oQ1ZTUFMsIi18Iik7CisJbXkgJGN2c3BzZmg7CisJZGllICJDYW5ub3QgZm9yazogJCFcbiIgdW5sZXNzIGRlZmluZWQgJHBpZDsKKwl1bmxlc3MgKCRwaWQpIHsKKwkJbXkgQG9wdDsKKwkJQG9wdCA9IHNwbGl0KC8sLywkb3B0X3ApIGlmIGRlZmluZWQgJG9wdF9wOworCQl1bnNoaWZ0IEBvcHQsICcteicsICRvcHRfeiBpZiBkZWZpbmVkICRvcHRfejsKKwkJdW5zaGlmdCBAb3B0LCAnLXEnICAgICAgICAgdW5sZXNzIGRlZmluZWQgJG9wdF92OworCQl1bmxlc3MgKGRlZmluZWQoJG9wdF9wKSAmJiAkb3B0X3AgPX4gbS8tLW5vLWN2cy1kaXJlY3QvKSB7CisJCQlwdXNoIEBvcHQsICctLWN2cy1kaXJlY3QnOworCQl9CisJCWV4ZWMoImN2c3BzIiwiLS1ub3JjIixAb3B0LCItdSIsIi1BIiwnLS1yb290Jywkb3B0X2QsJGN2c190cmVlKTsKKwkJZGllICJDb3VsZCBub3Qgc3RhcnQgY3ZzcHM6ICQhXG4iOworCX0KKwkoJGN2c3BzZmgsICRjdnNwc2ZpbGUpID0gdGVtcGZpbGUoJ2dpdFhYWFhYWCcsIFNVRkZJWCA9PiAnLmN2c3BzJywKKwkJCQkJICBESVIgPT4gRmlsZTo6U3BlYy0+dG1wZGlyKCkpOworCXdoaWxlICg8Q1ZTUFM+KSB7CisJICAgIHByaW50ICRjdnNwc2ZoICRfOworCX0KKwljbG9zZSBDVlNQUzsKKwkkPyA9PSAwIG9yIGRpZSAiZ2l0LWN2c2ltcG9ydDogZmF0YWw6IGN2c3BzIHJlcG9ydGVkIGVycm9yXG4iOworCWNsb3NlICRjdnNwc2ZoOworfSBlbHNlIHsKKwkkY3ZzcHNmaWxlID0gJG9wdF9QOworfQorCitvcGVuKENWUywgIjwkY3ZzcHNmaWxlIikgb3IgZGllICQhOworCisjIyBjdnNwcyBvdXRwdXQ6CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjUGF0Y2hTZXQgMzE0CisjRGF0ZTogMTk5OS8wOS8xOCAxMzowMzo1OQorI0F1dGhvcjogd2tvY2gKKyNCcmFuY2g6IFNUQUJMRS1CUkFOQ0gtMS0wCisjQW5jZXN0b3IgYnJhbmNoOiBIRUFECisjVGFnOiAobm9uZSkKKyNMb2c6CisjICAgIFNlZSBDaGFuZ2VMb2c6IFNhdCBTZXAgMTggMTM6MDM6MjggQ0VTVCAxOTk5ICBXZXJuZXIgS29jaAorI01lbWJlcnM6CisjCVJFQURNRToxLjU3LT4xLjU3LjIuMQorIwlWRVJTSU9OOjEuOTYtPjEuOTYuMi4xCisjCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK215ICRzdGF0ZSA9IDA7CisKK3N1YiB1cGRhdGVfaW5kZXggKFxAXEApIHsKKwlteSAkb2xkID0gc2hpZnQ7CisJbXkgJG5ldyA9IHNoaWZ0OworCW9wZW4obXkgJGZoLCAnfC0nLCBxdyhnaXQtdXBkYXRlLWluZGV4IC16IC0taW5kZXgtaW5mbykpCisJCW9yIGRpZSAidW5hYmxlIHRvIG9wZW4gZ2l0LXVwZGF0ZS1pbmRleDogJCEiOworCXByaW50ICRmaAorCQkobWFwIHsgIjAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFx0JF9cMCIgfQorCQkJQCRvbGQpLAorCQkobWFwIHsgJzEwMCcgLiBzcHJpbnRmKCclbycsICRfLT5bMF0pIC4gIiAkXy0+WzFdXHQkXy0+WzJdXDAiIH0KKwkJCUAkbmV3KQorCQlvciBkaWUgInVuYWJsZSB0byB3cml0ZSB0byBnaXQtdXBkYXRlLWluZGV4OiAkISI7CisJY2xvc2UgJGZoCisJCW9yIGRpZSAidW5hYmxlIHRvIHdyaXRlIHRvIGdpdC11cGRhdGUtaW5kZXg6ICQhIjsKKwkkPyBhbmQgZGllICJnaXQtdXBkYXRlLWluZGV4IHJlcG9ydGVkIGVycm9yOiAkPyI7Cit9CisKK3N1YiB3cml0ZV90cmVlICgpIHsKKwlvcGVuKG15ICRmaCwgJy18JywgcXcoZ2l0LXdyaXRlLXRyZWUpKQorCQlvciBkaWUgInVuYWJsZSB0byBvcGVuIGdpdC13cml0ZS10cmVlOiAkISI7CisJY2hvbXAobXkgJHRyZWUgPSA8JGZoPik7CisJaXNfc2hhMSgkdHJlZSkKKwkJb3IgZGllICJDYW5ub3QgZ2V0IHRyZWUgaWQgKCR0cmVlKTogJCEiOworCWNsb3NlKCRmaCkKKwkJb3IgZGllICJFcnJvciBydW5uaW5nIGdpdC13cml0ZS10cmVlOiAkP1xuIjsKKwlwcmludCAiVHJlZSBJRCAkdHJlZVxuIiBpZiAkb3B0X3Y7CisJcmV0dXJuICR0cmVlOworfQorCitteSAoJHBhdGNoc2V0LCRkYXRlLCRhdXRob3JfbmFtZSwkYXV0aG9yX2VtYWlsLCRicmFuY2gsJGFuY2VzdG9yLCR0YWcsJGxvZ21zZyk7CitteSAoQG9sZCxAbmV3LEBza2lwcGVkLCVpZ25vcmVicmFuY2gpOworCisjIGNvbW1pdHMgdGhhdCBjdnNwcyBjYW5ub3QgcGxhY2UgYW55d2hlcmUuLi4KKyRpZ25vcmVicmFuY2h7JyNDVlNQU19OT19CUkFOQ0gnfSA9IDE7CisKK3N1YiBjb21taXQgeworCWlmICgkYnJhbmNoIGVxICRvcHRfbyAmJiAhJGluZGV4e2JyYW5jaH0gJiYKKwkJIWdldF9oZWFkcmVmKCIkcmVtb3RlLyRicmFuY2giKSkgeworCSAgICAjIGxvb2tzIGxpa2UgYW4gaW5pdGlhbCBjb21taXQKKwkgICAgIyB1c2UgdGhlIGluZGV4IHByaW1lZCBieSBnaXQtaW5pdAorCSAgICAkRU5We0dJVF9JTkRFWF9GSUxFfSA9ICIkZ2l0X2Rpci9pbmRleCI7CisJICAgICRpbmRleHskYnJhbmNofSA9ICIkZ2l0X2Rpci9pbmRleCI7CisJfSBlbHNlIHsKKwkgICAgIyB1c2UgYW4gaW5kZXggcGVyIGJyYW5jaCB0byBzcGVlZCB1cAorCSAgICAjIGltcG9ydHMgb2YgcHJvamVjdHMgd2l0aCBtYW55IGJyYW5jaGVzCisJICAgIHVubGVzcyAoJGluZGV4eyRicmFuY2h9KSB7CisJCSRpbmRleHskYnJhbmNofSA9IHRtcG5hbSgpOworCQkkRU5We0dJVF9JTkRFWF9GSUxFfSA9ICRpbmRleHskYnJhbmNofTsKKwkJaWYgKCRhbmNlc3RvcikgeworCQkgICAgc3lzdGVtKCJnaXQtcmVhZC10cmVlIiwgIiRyZW1vdGUvJGFuY2VzdG9yIik7CisJCX0gZWxzZSB7CisJCSAgICBzeXN0ZW0oImdpdC1yZWFkLXRyZWUiLCAiJHJlbW90ZS8kYnJhbmNoIik7CisJCX0KKwkJZGllICJyZWFkLXRyZWUgZmFpbGVkOiAkP1xuIiBpZiAkPzsKKwkgICAgfQorCX0KKyAgICAgICAgJEVOVntHSVRfSU5ERVhfRklMRX0gPSAkaW5kZXh7JGJyYW5jaH07CisKKwl1cGRhdGVfaW5kZXgoQG9sZCwgQG5ldyk7CisJQG9sZCA9IEBuZXcgPSAoKTsKKwlteSAkdHJlZSA9IHdyaXRlX3RyZWUoKTsKKwlteSAkcGFyZW50ID0gZ2V0X2hlYWRyZWYoIiRyZW1vdGUvJGxhc3RfYnJhbmNoIik7CisJcHJpbnQgIlBhcmVudCBJRCAiIC4gKCRwYXJlbnQgPyAkcGFyZW50IDogIihlbXB0eSkiKSAuICJcbiIgaWYgJG9wdF92OworCisJbXkgQGNvbW1pdF9hcmdzOworCXB1c2ggQGNvbW1pdF9hcmdzLCAoIi1wIiwgJHBhcmVudCkgaWYgJHBhcmVudDsKKworCSMgbG9vc2UgZGV0ZWN0aW9uIG9mIG1lcmdlcworCSMgYmFzZWQgb24gdGhlIGNvbW1pdCBtc2cKKwlmb3JlYWNoIG15ICRyeCAoQG1lcmdlcngpIHsKKwkJbmV4dCB1bmxlc3MgJGxvZ21zZyA9fiAkcnggJiYgJDE7CisJCW15ICRtcGFyZW50ID0gJDEgZXEgJ0hFQUQnID8gJG9wdF9vIDogJDE7CisJCWlmIChteSAkc2hhMSA9IGdldF9oZWFkcmVmKCIkcmVtb3RlLyRtcGFyZW50IikpIHsKKwkJCXB1c2ggQGNvbW1pdF9hcmdzLCAnLXAnLCAiJHJlbW90ZS8kbXBhcmVudCI7CisJCQlwcmludCAiTWVyZ2UgcGFyZW50IGJyYW5jaDogJG1wYXJlbnRcbiIgaWYgJG9wdF92OworCQl9CisJfQorCisJbXkgJGNvbW1pdF9kYXRlID0gc3RyZnRpbWUoIiswMDAwICVZLSVtLSVkICVIOiVNOiVTIixnbXRpbWUoJGRhdGUpKTsKKwkkRU5We0dJVF9BVVRIT1JfTkFNRX0gPSAkYXV0aG9yX25hbWU7CisJJEVOVntHSVRfQVVUSE9SX0VNQUlMfSA9ICRhdXRob3JfZW1haWw7CisJJEVOVntHSVRfQVVUSE9SX0RBVEV9ID0gJGNvbW1pdF9kYXRlOworCSRFTlZ7R0lUX0NPTU1JVFRFUl9OQU1FfSA9ICRhdXRob3JfbmFtZTsKKwkkRU5We0dJVF9DT01NSVRURVJfRU1BSUx9ID0gJGF1dGhvcl9lbWFpbDsKKwkkRU5We0dJVF9DT01NSVRURVJfREFURX0gPSAkY29tbWl0X2RhdGU7CisJbXkgJHBpZCA9IG9wZW4yKG15ICRjb21taXRfcmVhZCwgbXkgJGNvbW1pdF93cml0ZSwKKwkJJ2dpdC1jb21taXQtdHJlZScsICR0cmVlLCBAY29tbWl0X2FyZ3MpOworCisJIyBjb21wYXRpYmlsaXR5IHdpdGggZ2l0MmN2cworCXN1YnN0cigkbG9nbXNnLDMyNzY3KSA9ICIiIGlmIGxlbmd0aCgkbG9nbXNnKSA+IDMyNzY3OworCSRsb2dtc2cgPX4gcy9bXHNcbl0rXHovLzsKKworCWlmIChAc2tpcHBlZCkgeworCSAgICAkbG9nbXNnIC49ICJcblxuXG5TS0lQUEVEOlxuXHQiOworCSAgICAkbG9nbXNnIC49IGpvaW4oIlxuXHQiLCBAc2tpcHBlZCkgLiAiXG4iOworCSAgICBAc2tpcHBlZCA9ICgpOworCX0KKworCXByaW50KCRjb21taXRfd3JpdGUgIiRsb2dtc2dcbiIpICYmIGNsb3NlKCRjb21taXRfd3JpdGUpCisJCW9yIGRpZSAiRXJyb3Igd3JpdGluZyB0byBnaXQtY29tbWl0LXRyZWU6ICQhXG4iOworCisJcHJpbnQgIkNvbW1pdHRlZCBwYXRjaCAkcGF0Y2hzZXQgKCRicmFuY2ggJGNvbW1pdF9kYXRlKVxuIiBpZiAkb3B0X3Y7CisJY2hvbXAobXkgJGNpZCA9IDwkY29tbWl0X3JlYWQ+KTsKKwlpc19zaGExKCRjaWQpIG9yIGRpZSAiQ2Fubm90IGdldCBjb21taXQgaWQgKCRjaWQpOiAkIVxuIjsKKwlwcmludCAiQ29tbWl0IElEICRjaWRcbiIgaWYgJG9wdF92OworCWNsb3NlKCRjb21taXRfcmVhZCk7CisKKwl3YWl0cGlkKCRwaWQsMCk7CisJZGllICJFcnJvciBydW5uaW5nIGdpdC1jb21taXQtdHJlZTogJD9cbiIgaWYgJD87CisKKwlzeXN0ZW0oImdpdC11cGRhdGUtcmVmICRyZW1vdGUvJGJyYW5jaCAkY2lkIikgPT0gMAorCQlvciBkaWUgIkNhbm5vdCB3cml0ZSBicmFuY2ggJGJyYW5jaCBmb3IgdXBkYXRlOiAkIVxuIjsKKworCWlmICgkdGFnKSB7CisJICAgICAgICBteSAoJHh0YWcpID0gJHRhZzsKKwkJJHh0YWcgPX4gcy9ccytcKlwqLiokLy87ICMgUmVtb3ZlIHN0dWZmIGxpa2UgKiogSU5WQUxJRCAqKiBhbmQgKiogRlVOS1kgKioKKwkJJHh0YWcgPX4gdHIvXy9cLi8gaWYgKCAkb3B0X3UgKTsKKwkJJHh0YWcgPX4gcy9bXC9dLyRvcHRfcy9nOworCisJCXN5c3RlbSgnZ2l0LXRhZycsICctZicsICR4dGFnLCAkY2lkKSA9PSAwCisJCQlvciBkaWUgIkNhbm5vdCBjcmVhdGUgdGFnICR4dGFnOiAkIVxuIjsKKworCQlwcmludCAiQ3JlYXRlZCB0YWcgJyR4dGFnJyBvbiAnJGJyYW5jaCdcbiIgaWYgJG9wdF92OworCX0KK307CisKK215ICRjb21taXRjb3VudCA9IDE7Cit3aGlsZSAoPENWUz4pIHsKKwljaG9tcDsKKwlpZiAoJHN0YXRlID09IDAgYW5kIC9eLSskLykgeworCQkkc3RhdGUgPSAxOworCX0gZWxzaWYgKCRzdGF0ZSA9PSAwKSB7CisJCSRzdGF0ZSA9IDE7CisJCXJlZG87CisJfSBlbHNpZiAoKCRzdGF0ZT09MCBvciAkc3RhdGU9PTEpIGFuZCBzL15QYXRjaFNldFxzKy8vKSB7CisJCSRwYXRjaHNldCA9IDArJF87CisJCSRzdGF0ZT0yOworCX0gZWxzaWYgKCRzdGF0ZSA9PSAyIGFuZCBzL15EYXRlOlxzKy8vKSB7CisJCSRkYXRlID0gcGRhdGUoJF8pOworCQl1bmxlc3MgKCRkYXRlKSB7CisJCQlwcmludCBTVERFUlIgIkNvdWxkIG5vdCBwYXJzZSBkYXRlOiAkX1xuIjsKKwkJCSRzdGF0ZT0wOworCQkJbmV4dDsKKwkJfQorCQkkc3RhdGU9MzsKKwl9IGVsc2lmICgkc3RhdGUgPT0gMyBhbmQgcy9eQXV0aG9yOlxzKy8vKSB7CisJCXMvXHMrJC8vOworCQlpZiAoL14oLio/KVxzKzwoLiopPi8pIHsKKwkJICAgICgkYXV0aG9yX25hbWUsICRhdXRob3JfZW1haWwpID0gKCQxLCAkMik7CisJCX0gZWxzaWYgKCRjb252X2F1dGhvcl9uYW1leyRffSkgeworCQkJJGF1dGhvcl9uYW1lID0gJGNvbnZfYXV0aG9yX25hbWV7JF99OworCQkJJGF1dGhvcl9lbWFpbCA9ICRjb252X2F1dGhvcl9lbWFpbHskX307CisJCX0gZWxzZSB7CisJCSAgICAkYXV0aG9yX25hbWUgPSAkYXV0aG9yX2VtYWlsID0gJF87CisJCX0KKwkJJHN0YXRlID0gNDsKKwl9IGVsc2lmICgkc3RhdGUgPT0gNCBhbmQgcy9eQnJhbmNoOlxzKy8vKSB7CisJCXMvXHMrJC8vOworCQl0ci9fL1wuLyBpZiAoICRvcHRfdSApOworCQlzL1tcL10vJG9wdF9zL2c7CisJCSRicmFuY2ggPSAkXzsKKwkJJHN0YXRlID0gNTsKKwl9IGVsc2lmICgkc3RhdGUgPT0gNSBhbmQgcy9eQW5jZXN0b3IgYnJhbmNoOlxzKy8vKSB7CisJCXMvXHMrJC8vOworCQkkYW5jZXN0b3IgPSAkXzsKKwkJJGFuY2VzdG9yID0gJG9wdF9vIGlmICRhbmNlc3RvciBlcSAiSEVBRCI7CisJCSRzdGF0ZSA9IDY7CisJfSBlbHNpZiAoJHN0YXRlID09IDUpIHsKKwkJJGFuY2VzdG9yID0gdW5kZWY7CisJCSRzdGF0ZSA9IDY7CisJCXJlZG87CisJfSBlbHNpZiAoJHN0YXRlID09IDYgYW5kIHMvXlRhZzpccysvLykgeworCQlzL1xzKyQvLzsKKwkJaWYgKCRfIGVxICIobm9uZSkiKSB7CisJCQkkdGFnID0gdW5kZWY7CisJCX0gZWxzZSB7CisJCQkkdGFnID0gJF87CisJCX0KKwkJJHN0YXRlID0gNzsKKwl9IGVsc2lmICgkc3RhdGUgPT0gNyBhbmQgL15Mb2c6LykgeworCQkkbG9nbXNnID0gIiI7CisJCSRzdGF0ZSA9IDg7CisJfSBlbHNpZiAoJHN0YXRlID09IDggYW5kIC9eTWVtYmVyczovKSB7CisJCSRicmFuY2ggPSAkb3B0X28gaWYgJGJyYW5jaCBlcSAiSEVBRCI7CisJCWlmIChkZWZpbmVkICRicmFuY2hfZGF0ZXskYnJhbmNofSBhbmQgJGJyYW5jaF9kYXRleyRicmFuY2h9ID49ICRkYXRlKSB7CisJCQkjIHNraXAKKwkJCXByaW50ICJza2lwIHBhdGNoc2V0ICRwYXRjaHNldDogJGRhdGUgYmVmb3JlICRicmFuY2hfZGF0ZXskYnJhbmNofVxuIiBpZiAkb3B0X3Y7CisJCQkkc3RhdGUgPSAxMTsKKwkJCW5leHQ7CisJCX0KKwkJaWYgKCEkb3B0X2EgJiYgJHN0YXJ0dGltZSAtIDMwMCAtIChkZWZpbmVkICRvcHRfeiA/ICRvcHRfeiA6IDMwMCkgPD0gJGRhdGUpIHsKKwkJCSMgc2tpcCBpZiB0aGUgY29tbWl0IGlzIHRvbyByZWNlbnQKKwkJCSMgZ2l2ZW4gdGhhdCB0aGUgY3ZzcHMgZGVmYXVsdCBmdXp6IGlzIDMwMHMsIHdlIGdpdmUgb3Vyc2VsdmVzIGFub3RoZXIKKwkJCSMgMzAwcyBqdXN0IGluIGNhc2UgLS0gdGhpcyBhbHNvIHByZXZlbnRzIHNraXBwaW5nIGNvbW1pdHMKKwkJCSMgZHVlIHRvIHNlcnZlciBjbG9jayBkcmlmdAorCQkJcHJpbnQgInNraXAgcGF0Y2hzZXQgJHBhdGNoc2V0OiAkZGF0ZSB0b28gcmVjZW50XG4iIGlmICRvcHRfdjsKKwkJCSRzdGF0ZSA9IDExOworCQkJbmV4dDsKKwkJfQorCQlpZiAoZXhpc3RzICRpZ25vcmVicmFuY2h7JGJyYW5jaH0pIHsKKwkJCXByaW50IFNUREVSUiAiU2tpcHBpbmcgJGJyYW5jaFxuIjsKKwkJCSRzdGF0ZSA9IDExOworCQkJbmV4dDsKKwkJfQorCQlpZiAoJGFuY2VzdG9yKSB7CisJCQlpZiAoJGFuY2VzdG9yIGVxICRicmFuY2gpIHsKKwkJCQlwcmludCBTVERFUlIgIkJyYW5jaCAkYnJhbmNoIGVycm9uZW91c2x5IHN0ZW1zIGZyb20gaXRzZWxmIC0tIGNoYW5nZWQgYW5jZXN0b3IgdG8gJG9wdF9vXG4iOworCQkJCSRhbmNlc3RvciA9ICRvcHRfbzsKKwkJCX0KKwkJCWlmIChkZWZpbmVkIGdldF9oZWFkcmVmKCIkcmVtb3RlLyRicmFuY2giKSkgeworCQkJCXByaW50IFNUREVSUiAiQnJhbmNoICRicmFuY2ggYWxyZWFkeSBleGlzdHMhXG4iOworCQkJCSRzdGF0ZT0xMTsKKwkJCQluZXh0OworCQkJfQorCQkJbXkgJGlkID0gZ2V0X2hlYWRyZWYoIiRyZW1vdGUvJGFuY2VzdG9yIik7CisJCQlpZiAoISRpZCkgeworCQkJCXByaW50IFNUREVSUiAiQnJhbmNoICRhbmNlc3RvciBkb2VzIG5vdCBleGlzdCFcbiI7CisJCQkJJGlnbm9yZWJyYW5jaHskYnJhbmNofSA9IDE7CisJCQkJJHN0YXRlPTExOworCQkJCW5leHQ7CisJCQl9CisKKwkJCXN5c3RlbShxdyhnaXQgdXBkYXRlLXJlZiAtbSBjdnNpbXBvcnQpLAorCQkJCSIkcmVtb3RlLyRicmFuY2giLCAkaWQpOworCQkJaWYoJD8gIT0gMCkgeworCQkJCXByaW50IFNUREVSUiAiQ291bGQgbm90IGNyZWF0ZSBicmFuY2ggJGJyYW5jaFxuIjsKKwkJCQkkaWdub3JlYnJhbmNoeyRicmFuY2h9ID0gMTsKKwkJCQkkc3RhdGU9MTE7CisJCQkJbmV4dDsKKwkJCX0KKwkJfQorCQkkbGFzdF9icmFuY2ggPSAkYnJhbmNoIGlmICRicmFuY2ggbmUgJGxhc3RfYnJhbmNoOworCQkkc3RhdGUgPSA5OworCX0gZWxzaWYgKCRzdGF0ZSA9PSA4KSB7CisJCSRsb2dtc2cgLj0gIiRfXG4iOworCX0gZWxzaWYgKCRzdGF0ZSA9PSA5IGFuZCAvXlxzKyguKz8pOihJTklUSUFMfFxkKyg/OlwuXGQrKSspLT4oXGQrKD86XC5cZCspKylccyokLykgeworIwlWRVJTSU9OOjEuOTYtPjEuOTYuMi4xCisJCW15ICRpbml0ID0gKCQyIGVxICJJTklUSUFMIik7CisJCW15ICRmbiA9ICQxOworCQlteSAkcmV2ID0gJDM7CisJCSRmbiA9fiBzI14vKyMjOworCQlpZiAoJG9wdF9TICYmICRmbiA9fiBtLyRvcHRfUy8pIHsKKwkJICAgIHByaW50ICJTS0lQUElORyAkZm4gdiAkcmV2XG4iOworCQkgICAgcHVzaChAc2tpcHBlZCwgJGZuKTsKKwkJICAgIG5leHQ7CisJCX0KKwkJcHJpbnQgIkZldGNoaW5nICRmbiAgIHYgJHJldlxuIiBpZiAkb3B0X3Y7CisJCW15ICgkdG1wbmFtZSwgJHNpemUpID0gJGN2cy0+ZmlsZSgkZm4sJHJldik7CisJCWlmICgkc2l6ZSA9PSAtMSkgeworCQkJcHVzaChAb2xkLCRmbik7CisJCQlwcmludCAiRHJvcCAkZm5cbiIgaWYgJG9wdF92OworCQl9IGVsc2UgeworCQkJcHJpbnQgIiIuKCRpbml0ID8gIk5ldyIgOiAiVXBkYXRlIikuIiAkZm46ICRzaXplIGJ5dGVzXG4iIGlmICRvcHRfdjsKKwkJCW15ICRwaWQgPSBvcGVuKG15ICRGLCAnLXwnKTsKKwkJCWRpZSAkISB1bmxlc3MgZGVmaW5lZCAkcGlkOworCQkJaWYgKCEkcGlkKSB7CisJCQkgICAgZXhlYygiZ2l0LWhhc2gtb2JqZWN0IiwgIi13IiwgJHRtcG5hbWUpCisJCQkJb3IgZGllICJDYW5ub3QgY3JlYXRlIG9iamVjdDogJCFcbiI7CisJCQl9CisJCQlteSAkc2hhID0gPCRGPjsKKwkJCWNob21wICRzaGE7CisJCQljbG9zZSAkRjsKKwkJCW15ICRtb2RlID0gcG1vZGUoJGN2cy0+eydtb2RlJ30pOworCQkJcHVzaChAbmV3LFskbW9kZSwgJHNoYSwgJGZuXSk7ICMgbWF5IGJlIHJlc3VycmVjdGVkIQorCQl9CisJCXVubGluaygkdG1wbmFtZSk7CisJfSBlbHNpZiAoJHN0YXRlID09IDkgYW5kIC9eXHMrKC4rPyk6XGQrKD86XC5cZCspKy0+KFxkKyg/OlwuXGQrKSspXChERUFEXClccyokLykgeworCQlteSAkZm4gPSAkMTsKKwkJJGZuID1+IHMjXi8rIyM7CisJCXB1c2goQG9sZCwkZm4pOworCQlwcmludCAiRGVsZXRlICRmblxuIiBpZiAkb3B0X3Y7CisJfSBlbHNpZiAoJHN0YXRlID09IDkgYW5kIC9eXHMqJC8pIHsKKwkJJHN0YXRlID0gMTA7CisJfSBlbHNpZiAoKCRzdGF0ZSA9PSA5IG9yICRzdGF0ZSA9PSAxMCkgYW5kIC9eLSskLykgeworCQkkY29tbWl0Y291bnQrKzsKKwkJaWYgKCRvcHRfTCAmJiAkY29tbWl0Y291bnQgPiAkb3B0X0wpIHsKKwkJCWxhc3Q7CisJCX0KKwkJY29tbWl0KCk7CisJCWlmICgoJGNvbW1pdGNvdW50ICYgMTAyMykgPT0gMCkgeworCQkJc3lzdGVtKCJnaXQgcmVwYWNrIC1hIC1kIik7CisJCX0KKwkJJHN0YXRlID0gMTsKKwl9IGVsc2lmICgkc3RhdGUgPT0gMTEgYW5kIC9eLSskLykgeworCQkkc3RhdGUgPSAxOworCX0gZWxzaWYgKC9eLSskLykgeyAjIGVuZCBvZiB1bmtub3duLWxpbmUgcHJvY2Vzc2luZworCQkkc3RhdGUgPSAxOworCX0gZWxzaWYgKCRzdGF0ZSAhPSAxMSkgeyAjIGlnbm9yZSBzdHVmZiB3aGVuIHNraXBwaW5nCisJCXByaW50ICIqIFVOS05PV04gTElORSAqICRfXG4iOworCX0KK30KK2NvbW1pdCgpIGlmICRicmFuY2ggYW5kICRzdGF0ZSAhPSAxMTsKKwordW5sZXNzICgkb3B0X1ApIHsKKwl1bmxpbmsoJGN2c3BzZmlsZSk7Cit9CisKKyMgVGhlIGhldXJpc3RpYyBvZiByZXBhY2tpbmcgZXZlcnkgMTAyNCBjb21taXRzIGNhbiBsZWF2ZSBhCisjIGxvdCBvZiB1bnBhY2tlZCBkYXRhLiAgSWYgdGhlcmUgaXMgbW9yZSB0aGFuIDFNQiB3b3J0aCBvZgorIyBub3QtcGFja2VkIG9iamVjdHMsIHJlcGFjayBvbmNlIG1vcmUuCitteSAkbGluZSA9IGBnaXQtY291bnQtb2JqZWN0c2A7CitpZiAoJGxpbmUgPX4gL14oXGQrKSBvYmplY3RzLCAoXGQrKSBraWxvYnl0ZXMkLykgeworICBteSAoJG5fb2JqZWN0cywgJGtiKSA9ICgkMSwgJDIpOworICAxMDI0IDwgJGtiCisgICAgYW5kIHN5c3RlbSgiZ2l0IHJlcGFjayAtYSAtZCIpOworfQorCitmb3JlYWNoIG15ICRnaXRfaW5kZXggKHZhbHVlcyAlaW5kZXgpIHsKKyAgICBpZiAoJGdpdF9pbmRleCBuZSAiJGdpdF9kaXIvaW5kZXgiKSB7CisJdW5saW5rKCRnaXRfaW5kZXgpOworICAgIH0KK30KKworaWYgKGRlZmluZWQgJG9yaWdfZ2l0X2luZGV4KSB7CisJJEVOVntHSVRfSU5ERVhfRklMRX0gPSAkb3JpZ19naXRfaW5kZXg7Cit9IGVsc2UgeworCWRlbGV0ZSAkRU5We0dJVF9JTkRFWF9GSUxFfTsKK30KKworIyBOb3cgc3dpdGNoIGJhY2sgdG8gdGhlIGJyYW5jaCB3ZSB3ZXJlIGluIGJlZm9yZSBhbGwgb2YgdGhpcyBoYXBwZW5lZAoraWYgKCRvcmlnX2JyYW5jaCkgeworCXByaW50ICJET05FLlxuIiBpZiAkb3B0X3Y7CisJaWYgKCRvcHRfaSkgeworCQlleGl0IDA7CisJfQorCW15ICR0aXBfYXRfZW5kID0gYGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRGA7CisJaWYgKCR0aXBfYXRfc3RhcnQgbmUgJHRpcF9hdF9lbmQpIHsKKwkJZm9yICgkdGlwX2F0X3N0YXJ0LCAkdGlwX2F0X2VuZCkgeyBjaG9tcDsgfQorCQlwcmludCAiRmV0Y2hlZCBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaC5cbiIgaWYgJG9wdF92OworCQlzeXN0ZW0ocXcoZ2l0LXJlYWQtdHJlZSAtdSAtbSksCisJCSAgICAgICAkdGlwX2F0X3N0YXJ0LCAkdGlwX2F0X2VuZCk7CisJCWRpZSAiRmFzdC1mb3J3YXJkIHVwZGF0ZSBmYWlsZWQ6ICQ/XG4iIGlmICQ/OworCX0KKwllbHNlIHsKKwkJc3lzdGVtKHF3KGdpdC1tZXJnZSBjdnNpbXBvcnQgSEVBRCksICIkcmVtb3RlLyRvcHRfbyIpOworCQlkaWUgIkNvdWxkIG5vdCBtZXJnZSAkb3B0X28gaW50byB0aGUgY3VycmVudCBicmFuY2guXG4iIGlmICQ/OworCX0KK30gZWxzZSB7CisJJG9yaWdfYnJhbmNoID0gIm1hc3RlciI7CisJcHJpbnQgIkRPTkU7IGNyZWF0aW5nICRvcmlnX2JyYW5jaCBicmFuY2hcbiIgaWYgJG9wdF92OworCXN5c3RlbSgiZ2l0LXVwZGF0ZS1yZWYiLCAicmVmcy9oZWFkcy9tYXN0ZXIiLCAiJHJlbW90ZS8kb3B0X28iKQorCQl1bmxlc3MgZGVmaW5lZCBnZXRfaGVhZHJlZigncmVmcy9oZWFkcy9tYXN0ZXInKTsKKwlzeXN0ZW0oImdpdC1zeW1ib2xpYy1yZWYiLCAiJHJlbW90ZS9IRUFEIiwgIiRyZW1vdGUvJG9wdF9vIikKKwkJaWYgKCRvcHRfciAmJiAkb3B0X28gbmUgJ0hFQUQnKTsKKwlzeXN0ZW0oJ2dpdC11cGRhdGUtcmVmJywgJ0hFQUQnLCAiJG9yaWdfYnJhbmNoIik7CisJdW5sZXNzICgkb3B0X2kpIHsKKwkJc3lzdGVtKCdnaXQgY2hlY2tvdXQgLWYnKTsKKwkJZGllICJjaGVja291dCBmYWlsZWQ6ICQ/XG4iIGlmICQ/OworCX0KK30KZGlmZiAtLWdpdCBhL2dpdC1jdnNzZXJ2ZXIucGVybCBiL2dpdC1jdnNzZXJ2ZXIucGVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOWRiZmM5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWN2c3NlcnZlci5wZXJsCkBAIC0wLDAgKzEsMzE2NyBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMjIyMKKyMjIyMgVGhpcyBhcHBsaWNhdGlvbiBpcyBhIENWUyBlbXVsYXRpb24gbGF5ZXIgZm9yIGdpdC4KKyMjIyMgSXQgaXMgaW50ZW5kZWQgZm9yIGNsaWVudHMgdG8gY29ubmVjdCBvdmVyIFNTSC4KKyMjIyMgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuCisjIyMjCisjIyMjIENvcHlyaWdodCBUaGUgT3BlbiBVbml2ZXJzaXR5IFVLIC0gMjAwNi4KKyMjIyMKKyMjIyMgQXV0aG9yczogTWFydHluIFNtaXRoICAgIDxtYXJ0eW5AY2F0YWx5c3QubmV0Lm56PgorIyMjIyAgICAgICAgICBNYXJ0aW4gTGFuZ2hvZmYgPG1hcnRpbkBjYXRhbHlzdC5uZXQubno+CisjIyMjCisjIyMjCisjIyMjIFJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMi4KKyMjIyMKKyMjIyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBieXRlczsKKwordXNlIEZjbnRsOwordXNlIEZpbGU6OlRlbXAgcXcvdGVtcGRpciB0ZW1wZmlsZS87Cit1c2UgRmlsZTo6QmFzZW5hbWU7Cit1c2UgR2V0b3B0OjpMb25nIHF3KDpjb25maWcgcmVxdWlyZV9vcmRlciBub19pZ25vcmVfY2FzZSk7CisKK215ICRWRVJTSU9OID0gJ0BAR0lUX1ZFUlNJT05AQCc7CisKK215ICRsb2cgPSBHSVRDVlM6OmxvZy0+bmV3KCk7CitteSAkY2ZnOworCitteSAkREFURV9MSVNUID0geworICAgIEphbiA9PiAiMDEiLAorICAgIEZlYiA9PiAiMDIiLAorICAgIE1hciA9PiAiMDMiLAorICAgIEFwciA9PiAiMDQiLAorICAgIE1heSA9PiAiMDUiLAorICAgIEp1biA9PiAiMDYiLAorICAgIEp1bCA9PiAiMDciLAorICAgIEF1ZyA9PiAiMDgiLAorICAgIFNlcCA9PiAiMDkiLAorICAgIE9jdCA9PiAiMTAiLAorICAgIE5vdiA9PiAiMTEiLAorICAgIERlYyA9PiAiMTIiLAorfTsKKworIyBFbmFibGUgYXV0b2ZsdXNoIGZvciBTVERPVVQgKG90aGVyd2lzZSB0aGUgd2hvbGUgdGhpbmcgZmFsbHMgYXBhcnQpCiskfCA9IDE7CisKKyMjIyMgRGVmaW5pdGlvbiBhbmQgbWFwcGluZ3Mgb2YgZnVuY3Rpb25zICMjIyMKKworbXkgJG1ldGhvZHMgPSB7CisgICAgJ1Jvb3QnICAgICAgICAgICAgPT4gXCZyZXFfUm9vdCwKKyAgICAnVmFsaWQtcmVzcG9uc2VzJyA9PiBcJnJlcV9WYWxpZHJlc3BvbnNlcywKKyAgICAndmFsaWQtcmVxdWVzdHMnICA9PiBcJnJlcV92YWxpZHJlcXVlc3RzLAorICAgICdEaXJlY3RvcnknICAgICAgID0+IFwmcmVxX0RpcmVjdG9yeSwKKyAgICAnRW50cnknICAgICAgICAgICA9PiBcJnJlcV9FbnRyeSwKKyAgICAnTW9kaWZpZWQnICAgICAgICA9PiBcJnJlcV9Nb2RpZmllZCwKKyAgICAnVW5jaGFuZ2VkJyAgICAgICA9PiBcJnJlcV9VbmNoYW5nZWQsCisgICAgJ1F1ZXN0aW9uYWJsZScgICAgPT4gXCZyZXFfUXVlc3Rpb25hYmxlLAorICAgICdBcmd1bWVudCcgICAgICAgID0+IFwmcmVxX0FyZ3VtZW50LAorICAgICdBcmd1bWVudHgnICAgICAgID0+IFwmcmVxX0FyZ3VtZW50LAorICAgICdleHBhbmQtbW9kdWxlcycgID0+IFwmcmVxX2V4cGFuZG1vZHVsZXMsCisgICAgJ2FkZCcgICAgICAgICAgICAgPT4gXCZyZXFfYWRkLAorICAgICdyZW1vdmUnICAgICAgICAgID0+IFwmcmVxX3JlbW92ZSwKKyAgICAnY28nICAgICAgICAgICAgICA9PiBcJnJlcV9jbywKKyAgICAndXBkYXRlJyAgICAgICAgICA9PiBcJnJlcV91cGRhdGUsCisgICAgJ2NpJyAgICAgICAgICAgICAgPT4gXCZyZXFfY2ksCisgICAgJ2RpZmYnICAgICAgICAgICAgPT4gXCZyZXFfZGlmZiwKKyAgICAnbG9nJyAgICAgICAgICAgICA9PiBcJnJlcV9sb2csCisgICAgJ3Jsb2cnICAgICAgICAgICAgPT4gXCZyZXFfbG9nLAorICAgICd0YWcnICAgICAgICAgICAgID0+IFwmcmVxX0NBVENIQUxMLAorICAgICdzdGF0dXMnICAgICAgICAgID0+IFwmcmVxX3N0YXR1cywKKyAgICAnYWRtaW4nICAgICAgICAgICA9PiBcJnJlcV9DQVRDSEFMTCwKKyAgICAnaGlzdG9yeScgICAgICAgICA9PiBcJnJlcV9DQVRDSEFMTCwKKyAgICAnd2F0Y2hlcnMnICAgICAgICA9PiBcJnJlcV9FTVBUWSwKKyAgICAnZWRpdG9ycycgICAgICAgICA9PiBcJnJlcV9FTVBUWSwKKyAgICAnYW5ub3RhdGUnICAgICAgICA9PiBcJnJlcV9hbm5vdGF0ZSwKKyAgICAnR2xvYmFsX29wdGlvbicgICA9PiBcJnJlcV9HbG9iYWxvcHRpb24sCisgICAgIydhbm5vdGF0ZScgICAgICAgID0+IFwmcmVxX0NBVENIQUxMLAorfTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyMgJHN0YXRlIGhvbGRzIGFsbCB0aGUgYml0cyBvZiBpbmZvcm1hdGlvbiB0aGUgY2xpZW50cyBzZW5kcyB1cyB0aGF0IGNvdWxkCisjIHBvdGVudGlhbGx5IGJlIHVzZWZ1bCB3aGVuIGl0IGNvbWVzIHRvIGFjdHVhbGx5IF9kb2luZ18gc29tZXRoaW5nLgorbXkgJHN0YXRlID0geyBwcmVwZW5kZGlyID0+ICcnIH07CiskbG9nLT5pbmZvKCItLS0tLS0tLS0tLS0tLS0gU1RBUlRJTkcgLS0tLS0tLS0tLS0tLS0tLS0iKTsKKworbXkgJHVzYWdlID0KKyAgICAiVXNhZ2U6IGdpdC1jdnNzZXJ2ZXIgW29wdGlvbnNdIFtwc2VydmVyfHNlcnZlcl0gWzxkaXJlY3Rvcnk+IC4uLl1cbiIuCisgICAgIiAgICAtLWJhc2UtcGF0aCA8cGF0aD4gIDogUHJlcGVuZCB0byByZXF1ZXN0ZWQgQ1ZTUk9PVFxuIi4KKyAgICAiICAgIC0tc3RyaWN0LXBhdGhzICAgICAgOiBEb24ndCBhbGxvdyByZWN1cnNpbmcgaW50byBzdWJkaXJlY3Rvcmllc1xuIi4KKyAgICAiICAgIC0tZXhwb3J0LWFsbCAgICAgICAgOiBEb24ndCBjaGVjayBmb3IgZ2l0Y3ZzLmVuYWJsZWQgaW4gY29uZmlnXG4iLgorICAgICIgICAgLS12ZXJzaW9uLCAtViAgICAgICA6IFByaW50IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXRcbiIuCisgICAgIiAgICAtLWhlbHAsIC1oLCAtSCAgICAgIDogUHJpbnQgdXNhZ2UgaW5mb3JtYXRpb24gYW5kIGV4aXRcbiIuCisgICAgIlxuIi4KKyAgICAiPGRpcmVjdG9yeT4gLi4uIGlzIGEgbGlzdCBvZiBhbGxvd2VkIGRpcmVjdG9yaWVzLiBJZiBubyBkaXJlY3Rvcmllc1xuIi4KKyAgICAiYXJlIGdpdmVuLCBhbGwgYXJlIGFsbG93ZWQuIFRoaXMgaXMgYW4gYWRkaXRpb25hbCByZXN0cmljdGlvbiwgZ2l0Y3ZzXG4iLgorICAgICJhY2Nlc3Mgc3RpbGwgbmVlZHMgdG8gYmUgZW5hYmxlZCBieSB0aGUgZ2l0Y3ZzLmVuYWJsZWQgY29uZmlnIG9wdGlvbi5cbiI7CisKK215IEBvcHRzID0gKCAnaGVscHxofEgnLCAndmVyc2lvbnxWJywKKwkgICAgICdiYXNlLXBhdGg9cycsICdzdHJpY3QtcGF0aHMnLCAnZXhwb3J0LWFsbCcgKTsKK0dldE9wdGlvbnMoICRzdGF0ZSwgQG9wdHMgKQorICAgIG9yIGRpZSAkdXNhZ2U7CisKK2lmICgkc3RhdGUtPnt2ZXJzaW9ufSkgeworICAgIHByaW50ICJnaXQtY3Zzc2VydmVyIHZlcnNpb24gJFZFUlNJT05cbiI7CisgICAgZXhpdDsKK30KK2lmICgkc3RhdGUtPntoZWxwfSkgeworICAgIHByaW50ICR1c2FnZTsKKyAgICBleGl0OworfQorCitteSAkVEVNUF9ESVIgPSB0ZW1wZGlyKCBDTEVBTlVQID0+IDEgKTsKKyRsb2ctPmRlYnVnKCJUZW1wb3JhcnkgZGlyZWN0b3J5IGlzICckVEVNUF9ESVInIik7CisKKyRzdGF0ZS0+e21ldGhvZH0gPSAnZXh0JzsKK2lmIChAQVJHVikgeworICAgIGlmICgkQVJHVlswXSBlcSAncHNlcnZlcicpIHsKKwkkc3RhdGUtPnttZXRob2R9ID0gJ3BzZXJ2ZXInOworCXNoaWZ0IEBBUkdWOworICAgIH0gZWxzaWYgKCRBUkdWWzBdIGVxICdzZXJ2ZXInKSB7CisJc2hpZnQgQEFSR1Y7CisgICAgfQorfQorCisjIGV2ZXJ5dGhpbmcgZWxzZSBpcyBhIGRpcmVjdG9yeQorJHN0YXRlLT57YWxsb3dlZF9yb290c30gPSBbIEBBUkdWIF07CisKKyMgZG9uJ3QgZXhwb3J0IHRoZSB3aG9sZSBzeXN0ZW0gdW5sZXNzIHRoZSB1c2VycyByZXF1ZXN0cyBpdAoraWYgKCRzdGF0ZS0+eydleHBvcnQtYWxsJ30gJiYgIUB7JHN0YXRlLT57YWxsb3dlZF9yb290c319KSB7CisgICAgZGllICItLWV4cG9ydC1hbGwgY2FuIG9ubHkgYmUgdXNlZCB0b2dldGhlciB3aXRoIGFuIGV4cGxpY2l0IHdoaXRlbGlzdFxuIjsKK30KKworIyBpZiB3ZSBhcmUgY2FsbGVkIHdpdGggYSBwc2VydmVyIGFyZ3VtZW50LAorIyBkZWFsIHdpdGggdGhlIGF1dGhlbnRpY2F0aW9uIGNhdCBiZWZvcmUgZW50ZXJpbmcgdGhlCisjIG1haW4gbG9vcAoraWYgKCRzdGF0ZS0+e21ldGhvZH0gZXEgJ3BzZXJ2ZXInKSB7CisgICAgbXkgJGxpbmUgPSA8U1RESU4+OyBjaG9tcCAkbGluZTsKKyAgICB1bmxlc3MoICRsaW5lID1+IC9eQkVHSU4gKEFVVEh8VkVSSUZJQ0FUSU9OKSBSRVFVRVNUJC8pIHsKKyAgICAgICBkaWUgIkUgRG8gbm90IHVuZGVyc3RhbmQgJGxpbmUgLSBleHBlY3RpbmcgQkVHSU4gQVVUSCBSRVFVRVNUXG4iOworICAgIH0KKyAgICBteSAkcmVxdWVzdCA9ICQxOworICAgICRsaW5lID0gPFNURElOPjsgY2hvbXAgJGxpbmU7CisgICAgdW5sZXNzIChyZXFfUm9vdCgncm9vdCcsICRsaW5lKSkgeyAjIHJldXNlIFJvb3QKKyAgICAgICBwcmludCAiRSBJbnZhbGlkIHJvb3QgJGxpbmUgXG4iOworICAgICAgIGV4aXQgMTsKKyAgICB9CisgICAgJGxpbmUgPSA8U1RESU4+OyBjaG9tcCAkbGluZTsKKyAgICB1bmxlc3MgKCRsaW5lIGVxICdhbm9ueW1vdXMnKSB7CisgICAgICAgcHJpbnQgIkUgT25seSBhbm9ueW1vdXMgdXNlciBhbGxvd2VkIHZpYSBwc2VydmVyXG4iOworICAgICAgIHByaW50ICJJIEhBVEUgWU9VXG4iOworICAgICAgIGV4aXQgMTsKKyAgICB9CisgICAgJGxpbmUgPSA8U1RESU4+OyBjaG9tcCAkbGluZTsgICAgIyB2YWxpZGF0ZSB0aGUgcGFzc3dvcmQ/CisgICAgJGxpbmUgPSA8U1RESU4+OyBjaG9tcCAkbGluZTsKKyAgICB1bmxlc3MgKCRsaW5lIGVxICJFTkQgJHJlcXVlc3QgUkVRVUVTVCIpIHsKKyAgICAgICBkaWUgIkUgRG8gbm90IHVuZGVyc3RhbmQgJGxpbmUgLS0gZXhwZWN0aW5nIEVORCAkcmVxdWVzdCBSRVFVRVNUXG4iOworICAgIH0KKyAgICBwcmludCAiSSBMT1ZFIFlPVVxuIjsKKyAgICBleGl0IGlmICRyZXF1ZXN0IGVxICdWRVJJRklDQVRJT04nOyAjIGN2cyBsb2dpbgorICAgICMgYW5kIG5vdyBiYWNrIHRvIG91ciByZWd1bGFyIHByb2dyYW1tZS4uLgorfQorCisjIEtlZXAgZ29pbmcgdW50aWwgdGhlIGNsaWVudCBjbG9zZXMgdGhlIGNvbm5lY3Rpb24KK3doaWxlICg8U1RESU4+KQoreworICAgIGNob21wOworCisgICAgIyBDaGVjayB0byBzZWUgaWYgd2UndmUgc2VlbiB0aGlzIG1ldGhvZCwgYW5kIGNhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb24uCisgICAgaWYgKCAvXihbXHctXSspKD86XHMrKC4qKSk/JC8gYW5kIGRlZmluZWQoJG1ldGhvZHMtPnskMX0pICkKKyAgICB7CisgICAgICAgICMgdXNlIHRoZSAkbWV0aG9kcyBoYXNoIHRvIGNhbGwgdGhlIGFwcHJvcHJpYXRlIHN1YiBmb3IgdGhpcyBjb21tYW5kCisgICAgICAgICMkbG9nLT5pbmZvKCJNZXRob2QgOiAkMSIpOworICAgICAgICAmeyRtZXRob2RzLT57JDF9fSgkMSwkMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgIyBsb2cgZmF0YWwgYmVjYXVzZSB3ZSBkb24ndCB1bmRlcnN0YW5kIHRoaXMgZnVuY3Rpb24uIElmIHRoaXMgaGFwcGVucworICAgICAgICAjIHdlJ3JlIGZhaXJseSBzY3Jld2VkIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGUgY2xpZW50IGlzIGV4cGVjdGluZworICAgICAgICAjIGEgcmVzcG9uc2UuIElmIGl0IGlzLCB0aGUgY2xpZW50IHdpbGwgaGFuZywgd2UnbGwgaGFuZywgYW5kIHRoZSB3aG9sZQorICAgICAgICAjIHRoaW5nIHdpbGwgYmUgY3VzdGFyZC4KKyAgICAgICAgJGxvZy0+ZmF0YWwoIkRvbid0IHVuZGVyc3RhbmQgY29tbWFuZCAkX1xuIik7CisgICAgICAgIGRpZSgiVW5rbm93biBjb21tYW5kICRfIik7CisgICAgfQorfQorCiskbG9nLT5kZWJ1ZygiUHJvY2Vzc2luZyB0aW1lIDogdXNlcj0iIC4gKHRpbWVzKVswXSAuICIgc3lzdGVtPSIgLiAodGltZXMpWzFdKTsKKyRsb2ctPmluZm8oIi0tLS0tLS0tLS0tLS0tLSBGSU5JU0ggLS0tLS0tLS0tLS0tLS0tLS0iKTsKKworIyBNYWdpYyBjYXRjaGFsbCBtZXRob2QuCisjICAgIFRoaXMgaXMgdGhlIG1ldGhvZCB0aGF0IHdpbGwgaGFuZGxlIGFsbCBjb21tYW5kcyB3ZSBoYXZlbid0IHlldAorIyAgICBpbXBsZW1lbnRlZC4gSXQgc2ltcGx5IHNlbmRzIGEgd2FybmluZyB0byB0aGUgbG9nIGZpbGUgaW5kaWNhdGluZyBhCisjICAgIGNvbW1hbmQgdGhhdCBoYXNuJ3QgYmVlbiBpbXBsZW1lbnRlZCBoYXMgYmVlbiBpbnZva2VkLgorc3ViIHJlcV9DQVRDSEFMTAoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworICAgICRsb2ctPndhcm4oIlVuaGFuZGxlZCBjb21tYW5kIDogcmVxXyRjbWQgOiAkZGF0YSIpOworfQorCisjIFRoaXMgbWV0aG9kIGludmFyaWFibHkgc3VjY2VlZHMgd2l0aCBhbiBlbXB0eSByZXNwb25zZS4KK3N1YiByZXFfRU1QVFkKK3sKKyAgICBwcmludCAib2tcbiI7Cit9CisKKyMgUm9vdCBwYXRobmFtZSBcbgorIyAgICAgUmVzcG9uc2UgZXhwZWN0ZWQ6IG5vLiBUZWxsIHRoZSBzZXJ2ZXIgd2hpY2ggQ1ZTUk9PVCB0byB1c2UuIE5vdGUgdGhhdAorIyAgICAgcGF0aG5hbWUgaXMgYSBsb2NhbCBkaXJlY3RvcnkgYW5kIG5vdCBhIGZ1bGx5IHF1YWxpZmllZCBDVlNST09UIHZhcmlhYmxlLgorIyAgICAgcGF0aG5hbWUgbXVzdCBhbHJlYWR5IGV4aXN0OyBpZiBjcmVhdGluZyBhIG5ldyByb290LCB1c2UgdGhlIGluaXQKKyMgICAgIHJlcXVlc3QsIG5vdCBSb290LiBwYXRobmFtZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBob3N0bmFtZSBvZiB0aGUgc2VydmVyLAorIyAgICAgaG93IHRvIGFjY2VzcyB0aGUgc2VydmVyLCBldGMuOyBieSB0aGUgdGltZSB0aGUgQ1ZTIHByb3RvY29sIGlzIGluIHVzZSwKKyMgICAgIGNvbm5lY3Rpb24sIGF1dGhlbnRpY2F0aW9uLCBldGMuLCBhcmUgYWxyZWFkeSB0YWtlbiBjYXJlIG9mLiBUaGUgUm9vdAorIyAgICAgcmVxdWVzdCBtdXN0IGJlIHNlbnQgb25seSBvbmNlLCBhbmQgaXQgbXVzdCBiZSBzZW50IGJlZm9yZSBhbnkgcmVxdWVzdHMKKyMgICAgIG90aGVyIHRoYW4gVmFsaWQtcmVzcG9uc2VzLCB2YWxpZC1yZXF1ZXN0cywgVXNlVW5jaGFuZ2VkLCBTZXQgb3IgaW5pdC4KK3N1YiByZXFfUm9vdAoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworICAgICRsb2ctPmRlYnVnKCJyZXFfUm9vdCA6ICRkYXRhIik7CisKKyAgICB1bmxlc3MgKCRkYXRhID1+IG0jXi8jKSB7CisJcHJpbnQgImVycm9yIDEgUm9vdCBtdXN0IGJlIGFuIGFic29sdXRlIHBhdGhuYW1lXG4iOworCXJldHVybiAwOworICAgIH0KKworICAgIG15ICRjdnNyb290ID0gJHN0YXRlLT57J2Jhc2UtcGF0aCd9IHx8ICcnOworICAgICRjdnNyb290ID1+IHMjLyskIyM7CisgICAgJGN2c3Jvb3QgLj0gJGRhdGE7CisKKyAgICBpZiAoJHN0YXRlLT57Q1ZTUk9PVH0KKwkmJiAoJHN0YXRlLT57Q1ZTUk9PVH0gbmUgJGN2c3Jvb3QpKSB7CisJcHJpbnQgImVycm9yIDEgQ29uZmxpY3Rpbmcgcm9vdHMgc3BlY2lmaWVkXG4iOworCXJldHVybiAwOworICAgIH0KKworICAgICRzdGF0ZS0+e0NWU1JPT1R9ID0gJGN2c3Jvb3Q7CisKKyAgICAkRU5We0dJVF9ESVJ9ID0gJHN0YXRlLT57Q1ZTUk9PVH0gLiAiLyI7CisKKyAgICBpZiAoQHskc3RhdGUtPnthbGxvd2VkX3Jvb3RzfX0pIHsKKwlteSAkYWxsb3dlZCA9IDA7CisJZm9yZWFjaCBteSAkZGlyIChAeyRzdGF0ZS0+e2FsbG93ZWRfcm9vdHN9fSkgeworCSAgICBuZXh0IHVubGVzcyAkZGlyID1+IG0jXi8jOworCSAgICAkZGlyID1+IHMjLyskIyM7CisJICAgIGlmICgkc3RhdGUtPnsnc3RyaWN0LXBhdGhzJ30pIHsKKwkJaWYgKCRFTlZ7R0lUX0RJUn0gPX4gbSNeXFEkZGlyXEUvPyQjKSB7CisJCSAgICAkYWxsb3dlZCA9IDE7CisJCSAgICBsYXN0OworCQl9CisJICAgIH0gZWxzaWYgKCRFTlZ7R0lUX0RJUn0gPX4gbSNeXFEkZGlyXEUoLz8kfC8pIykgeworCQkkYWxsb3dlZCA9IDE7CisJCWxhc3Q7CisJICAgIH0KKwl9CisKKwl1bmxlc3MgKCRhbGxvd2VkKSB7CisJICAgIHByaW50ICJFICRFTlZ7R0lUX0RJUn0gZG9lcyBub3Qgc2VlbSB0byBiZSBhIHZhbGlkIEdJVCByZXBvc2l0b3J5XG4iOworCSAgICBwcmludCAiRSBcbiI7CisJICAgIHByaW50ICJlcnJvciAxICRFTlZ7R0lUX0RJUn0gaXMgbm90IGEgdmFsaWQgcmVwb3NpdG9yeVxuIjsKKwkgICAgcmV0dXJuIDA7CisJfQorICAgIH0KKworICAgIHVubGVzcyAoLWQgJEVOVntHSVRfRElSfSAmJiAtZSAkRU5We0dJVF9ESVJ9LidIRUFEJykgeworICAgICAgIHByaW50ICJFICRFTlZ7R0lUX0RJUn0gZG9lcyBub3Qgc2VlbSB0byBiZSBhIHZhbGlkIEdJVCByZXBvc2l0b3J5XG4iOworICAgICAgIHByaW50ICJFIFxuIjsKKyAgICAgICBwcmludCAiZXJyb3IgMSAkRU5We0dJVF9ESVJ9IGlzIG5vdCBhIHZhbGlkIHJlcG9zaXRvcnlcbiI7CisgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgbXkgQGdpdHZhcnMgPSBgZ2l0LWNvbmZpZyAtbGA7CisgICAgaWYgKCQ/KSB7CisgICAgICAgcHJpbnQgIkUgcHJvYmxlbXMgZXhlY3V0aW5nIGdpdC1jb25maWcgb24gdGhlIHNlcnZlciAtLSB0aGlzIGlzIG5vdCBhIGdpdCByZXBvc2l0b3J5IG9yIHRoZSBQQVRIIGlzIG5vdCBzZXQgY29ycmVjdGx5LlxuIjsKKyAgICAgICAgcHJpbnQgIkUgXG4iOworICAgICAgICBwcmludCAiZXJyb3IgMSAtIHByb2JsZW0gZXhlY3V0aW5nIGdpdC1jb25maWdcbiI7CisgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGZvcmVhY2ggbXkgJGxpbmUgKCBAZ2l0dmFycyApCisgICAgeworICAgICAgICBuZXh0IHVubGVzcyAoICRsaW5lID1+IC9eKGdpdGN2cylcLig/OihleHR8cHNlcnZlcilcLik/KFtcdy1dKyk9KC4qKSQvICk7CisgICAgICAgIHVubGVzcyAoJDIpIHsKKyAgICAgICAgICAgICRjZmctPnskMX17JDN9ID0gJDQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkY2ZnLT57JDF9eyQyfXskM30gPSAkNDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG15ICRlbmFibGVkID0gKCRjZmctPntnaXRjdnN9eyRzdGF0ZS0+e21ldGhvZH19e2VuYWJsZWR9CisJCSAgIHx8ICRjZmctPntnaXRjdnN9e2VuYWJsZWR9KTsKKyAgICB1bmxlc3MgKCRzdGF0ZS0+eydleHBvcnQtYWxsJ30gfHwKKwkgICAgKCRlbmFibGVkICYmICRlbmFibGVkID1+IC9eXHMqKDF8dHJ1ZXx5ZXMpXHMqJC9pKSkgeworICAgICAgICBwcmludCAiRSBHSVRDVlMgZW11bGF0aW9uIG5lZWRzIHRvIGJlIGVuYWJsZWQgb24gdGhpcyByZXBvXG4iOworICAgICAgICBwcmludCAiRSB0aGUgcmVwbyBjb25maWcgZmlsZSBuZWVkcyBhIFtnaXRjdnNdIHNlY3Rpb24gYWRkZWQsIGFuZCB0aGUgcGFyYW1ldGVyICdlbmFibGVkJyBzZXQgdG8gMVxuIjsKKyAgICAgICAgcHJpbnQgIkUgXG4iOworICAgICAgICBwcmludCAiZXJyb3IgMSBHSVRDVlMgZW11bGF0aW9uIGRpc2FibGVkXG4iOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBteSAkbG9nZmlsZSA9ICRjZmctPntnaXRjdnN9eyRzdGF0ZS0+e21ldGhvZH19e2xvZ2ZpbGV9IHx8ICRjZmctPntnaXRjdnN9e2xvZ2ZpbGV9OworICAgIGlmICggJGxvZ2ZpbGUgKQorICAgIHsKKyAgICAgICAgJGxvZy0+c2V0ZmlsZSgkbG9nZmlsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJGxvZy0+bm9maWxlKCk7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKyMgR2xvYmFsX29wdGlvbiBvcHRpb24gXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiBuby4gVHJhbnNtaXQgb25lIG9mIHRoZSBnbG9iYWwgb3B0aW9ucyBgLXEnLCBgLVEnLAorIyAgICAgYC1sJywgYC10JywgYC1yJywgb3IgYC1uJy4gb3B0aW9uIG11c3QgYmUgb25lIG9mIHRob3NlIHN0cmluZ3MsIG5vCisjICAgICB2YXJpYXRpb25zIChzdWNoIGFzIGNvbWJpbmluZyBvZiBvcHRpb25zKSBhcmUgYWxsb3dlZC4gRm9yIGdyYWNlZnVsCisjICAgICBoYW5kbGluZyBvZiB2YWxpZC1yZXF1ZXN0cywgaXQgaXMgcHJvYmFibHkgYmV0dGVyIHRvIG1ha2UgbmV3IGdsb2JhbAorIyAgICAgb3B0aW9ucyBzZXBhcmF0ZSByZXF1ZXN0cywgcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGFkZCB0aGVtIHRvIHRoaXMKKyMgICAgIHJlcXVlc3QuCitzdWIgcmVxX0dsb2JhbG9wdGlvbgoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworICAgICRsb2ctPmRlYnVnKCJyZXFfR2xvYmFsb3B0aW9uIDogJGRhdGEiKTsKKyAgICAkc3RhdGUtPntnbG9iYWxvcHRpb25zfXskZGF0YX0gPSAxOworfQorCisjIFZhbGlkLXJlc3BvbnNlcyByZXF1ZXN0LWxpc3QgXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiBuby4gVGVsbCB0aGUgc2VydmVyIHdoYXQgcmVzcG9uc2VzIHRoZSBjbGllbnQgd2lsbAorIyAgICAgYWNjZXB0LiByZXF1ZXN0LWxpc3QgaXMgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiB0b2tlbnMuCitzdWIgcmVxX1ZhbGlkcmVzcG9uc2VzCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisgICAgJGxvZy0+ZGVidWcoInJlcV9WYWxpZHJlc3BvbnNlcyA6ICRkYXRhIik7CisKKyAgICAjIFRPRE8gOiByZS1lbmFibGUgdGhpcywgY3VycmVudGx5IGl0J3Mgbm90IHBhcnRpY3VsYXJseSB1c2VmdWwKKyAgICAjJHN0YXRlLT57dmFsaWRyZXNwb25zZXN9ID0gWyBzcGxpdCAvXHMrLywgJGRhdGEgXTsKK30KKworIyB2YWxpZC1yZXF1ZXN0cyBcbgorIyAgICAgUmVzcG9uc2UgZXhwZWN0ZWQ6IHllcy4gQXNrIHRoZSBzZXJ2ZXIgdG8gc2VuZCBiYWNrIGEgVmFsaWQtcmVxdWVzdHMKKyMgICAgIHJlc3BvbnNlLgorc3ViIHJlcV92YWxpZHJlcXVlc3RzCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICAkbG9nLT5kZWJ1ZygicmVxX3ZhbGlkcmVxdWVzdHMiKTsKKworICAgICRsb2ctPmRlYnVnKCJTRU5EIDogVmFsaWQtcmVxdWVzdHMgIiAuIGpvaW4oIiAiLGtleXMgJSRtZXRob2RzKSk7CisgICAgJGxvZy0+ZGVidWcoIlNFTkQgOiBvayIpOworCisgICAgcHJpbnQgIlZhbGlkLXJlcXVlc3RzICIgLiBqb2luKCIgIixrZXlzICUkbWV0aG9kcykgLiAiXG4iOworICAgIHByaW50ICJva1xuIjsKK30KKworIyBEaXJlY3RvcnkgbG9jYWwtZGlyZWN0b3J5IFxuCisjICAgICBBZGRpdGlvbmFsIGRhdGE6IHJlcG9zaXRvcnkgXG4uIFJlc3BvbnNlIGV4cGVjdGVkOiBuby4gVGVsbCB0aGUgc2VydmVyCisjICAgICB3aGF0IGRpcmVjdG9yeSB0byB1c2UuIFRoZSByZXBvc2l0b3J5IHNob3VsZCBiZSBhIGRpcmVjdG9yeSBuYW1lIGZyb20gYQorIyAgICAgcHJldmlvdXMgc2VydmVyIHJlc3BvbnNlLiBOb3RlIHRoYXQgdGhpcyBib3RoIGdpdmVzIGEgZGVmYXVsdCBmb3IgRW50cnkKKyMgICAgIGFuZCBNb2RpZmllZCBhbmQgYWxzbyBmb3IgY2kgYW5kIHRoZSBvdGhlciBjb21tYW5kczsgbm9ybWFsIHVzYWdlIGlzIHRvCisjICAgICBzZW5kIERpcmVjdG9yeSBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlcmUgd2lsbCBiZSBhbiBFbnRyeSBvcgorIyAgICAgTW9kaWZpZWQsIGFuZCB0aGVuIGEgZmluYWwgRGlyZWN0b3J5IGZvciB0aGUgb3JpZ2luYWwgZGlyZWN0b3J5LCB0aGVuIHRoZQorIyAgICAgY29tbWFuZC4gVGhlIGxvY2FsLWRpcmVjdG9yeSBpcyByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIGF0IHdoaWNoIHRoZQorIyAgICAgY29tbWFuZCBpcyBvY2N1cnJpbmcgKGkuZS4gdGhlIGxhc3QgRGlyZWN0b3J5IHdoaWNoIGlzIHNlbnQgYmVmb3JlIHRoZQorIyAgICAgY29tbWFuZCk7IHRvIGluZGljYXRlIHRoYXQgdG9wIGxldmVsLCBgLicgc2hvdWxkIGJlIHNlbnQgZm9yCisjICAgICBsb2NhbC1kaXJlY3RvcnkuCitzdWIgcmVxX0RpcmVjdG9yeQoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworCisgICAgbXkgJHJlcG9zaXRvcnkgPSA8U1RESU4+OworICAgIGNob21wICRyZXBvc2l0b3J5OworCisKKyAgICAkc3RhdGUtPntsb2NhbGRpcn0gPSAkZGF0YTsKKyAgICAkc3RhdGUtPntyZXBvc2l0b3J5fSA9ICRyZXBvc2l0b3J5OworICAgICRzdGF0ZS0+e3BhdGh9ID0gJHJlcG9zaXRvcnk7CisgICAgJHN0YXRlLT57cGF0aH0gPX4gcy9eJHN0YXRlLT57Q1ZTUk9PVH1cLy8vOworICAgICRzdGF0ZS0+e21vZHVsZX0gPSAkMSBpZiAoJHN0YXRlLT57cGF0aH0gPX4gcy9eKC4qPykoXC98JCkvLyk7CisgICAgJHN0YXRlLT57cGF0aH0gLj0gIi8iIGlmICggJHN0YXRlLT57cGF0aH0gPX4gL1xTLyApOworCisgICAgJHN0YXRlLT57ZGlyZWN0b3J5fSA9ICRzdGF0ZS0+e2xvY2FsZGlyfTsKKyAgICAkc3RhdGUtPntkaXJlY3Rvcnl9ID0gIiIgaWYgKCAkc3RhdGUtPntkaXJlY3Rvcnl9IGVxICIuIiApOworICAgICRzdGF0ZS0+e2RpcmVjdG9yeX0gLj0gIi8iIGlmICggJHN0YXRlLT57ZGlyZWN0b3J5fSA9fiAvXFMvICk7CisKKyAgICBpZiAoIChub3QgZGVmaW5lZCgkc3RhdGUtPntwcmVwZW5kZGlyfSkgb3IgJHN0YXRlLT57cHJlcGVuZGRpcn0gZXEgJycpIGFuZCAkc3RhdGUtPntsb2NhbGRpcn0gZXEgIi4iIGFuZCAkc3RhdGUtPntwYXRofSA9fiAvXFMvICkKKyAgICB7CisgICAgICAgICRsb2ctPmluZm8oIlNldHRpbmcgcHJlcGVuZCB0byAnJHN0YXRlLT57cGF0aH0nIik7CisgICAgICAgICRzdGF0ZS0+e3ByZXBlbmRkaXJ9ID0gJHN0YXRlLT57cGF0aH07CisgICAgICAgIGZvcmVhY2ggbXkgJGVudHJ5ICgga2V5cyAleyRzdGF0ZS0+e2VudHJpZXN9fSApCisgICAgICAgIHsKKyAgICAgICAgICAgICRzdGF0ZS0+e2VudHJpZXN9eyRzdGF0ZS0+e3ByZXBlbmRkaXJ9IC4gJGVudHJ5fSA9ICRzdGF0ZS0+e2VudHJpZXN9eyRlbnRyeX07CisgICAgICAgICAgICBkZWxldGUgJHN0YXRlLT57ZW50cmllc317JGVudHJ5fTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggZGVmaW5lZCAoICRzdGF0ZS0+e3ByZXBlbmRkaXJ9ICkgKQorICAgIHsKKyAgICAgICAgJGxvZy0+ZGVidWcoIlByZXBlbmRpbmcgJyRzdGF0ZS0+e3ByZXBlbmRkaXJ9JyB0byBzdGF0ZXxkaXJlY3RvcnkiKTsKKyAgICAgICAgJHN0YXRlLT57ZGlyZWN0b3J5fSA9ICRzdGF0ZS0+e3ByZXBlbmRkaXJ9IC4gJHN0YXRlLT57ZGlyZWN0b3J5fQorICAgIH0KKyAgICAkbG9nLT5kZWJ1ZygicmVxX0RpcmVjdG9yeSA6IGxvY2FsZGlyPSRkYXRhIHJlcG9zaXRvcnk9JHJlcG9zaXRvcnkgcGF0aD0kc3RhdGUtPntwYXRofSBkaXJlY3Rvcnk9JHN0YXRlLT57ZGlyZWN0b3J5fSBtb2R1bGU9JHN0YXRlLT57bW9kdWxlfSIpOworfQorCisjIEVudHJ5IGVudHJ5LWxpbmUgXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiBuby4gVGVsbCB0aGUgc2VydmVyIHdoYXQgdmVyc2lvbiBvZiBhIGZpbGUgaXMgb24gdGhlCisjICAgICBsb2NhbCBtYWNoaW5lLiBUaGUgbmFtZSBpbiBlbnRyeS1saW5lIGlzIGEgbmFtZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5CisjICAgICBtb3N0IHJlY2VudGx5IHNwZWNpZmllZCB3aXRoIERpcmVjdG9yeS4gSWYgdGhlIHVzZXIgaXMgb3BlcmF0aW5nIG9uIG9ubHkKKyMgICAgIHNvbWUgZmlsZXMgaW4gYSBkaXJlY3RvcnksIEVudHJ5IHJlcXVlc3RzIGZvciBvbmx5IHRob3NlIGZpbGVzIG5lZWQgYmUKKyMgICAgIGluY2x1ZGVkLiBJZiBhbiBFbnRyeSByZXF1ZXN0IGlzIHNlbnQgd2l0aG91dCBNb2RpZmllZCwgSXMtbW9kaWZpZWQsIG9yCisjICAgICBVbmNoYW5nZWQsIGl0IG1lYW5zIHRoZSBmaWxlIGlzIGxvc3QgKGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3JraW5nCisjICAgICBkaXJlY3RvcnkpLiBJZiBib3RoIEVudHJ5IGFuZCBvbmUgb2YgTW9kaWZpZWQsIElzLW1vZGlmaWVkLCBvciBVbmNoYW5nZWQKKyMgICAgIGFyZSBzZW50IGZvciB0aGUgc2FtZSBmaWxlLCBFbnRyeSBtdXN0IGJlIHNlbnQgZmlyc3QuIEZvciBhIGdpdmVuIGZpbGUsCisjICAgICBvbmUgY2FuIHNlbmQgTW9kaWZpZWQsIElzLW1vZGlmaWVkLCBvciBVbmNoYW5nZWQsIGJ1dCBub3QgbW9yZSB0aGFuIG9uZQorIyAgICAgb2YgdGhlc2UgdGhyZWUuCitzdWIgcmVxX0VudHJ5Cit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICAjJGxvZy0+ZGVidWcoInJlcV9FbnRyeSA6ICRkYXRhIik7CisKKyAgICBteSBAZGF0YSA9IHNwbGl0KC9cLy8sICRkYXRhKTsKKworICAgICRzdGF0ZS0+e2VudHJpZXN9eyRzdGF0ZS0+e2RpcmVjdG9yeX0uJGRhdGFbMV19ID0geworICAgICAgICByZXZpc2lvbiAgICA9PiAkZGF0YVsyXSwKKyAgICAgICAgY29uZmxpY3QgICAgPT4gJGRhdGFbM10sCisgICAgICAgIG9wdGlvbnMgICAgID0+ICRkYXRhWzRdLAorICAgICAgICB0YWdfb3JfZGF0ZSA9PiAkZGF0YVs1XSwKKyAgICB9OworCisgICAgJGxvZy0+aW5mbygiUmVjZWl2ZWQgZW50cnkgbGluZSAnJGRhdGEnID0+ICciIC4gJHN0YXRlLT57ZGlyZWN0b3J5fSAuICRkYXRhWzFdIC4gIiciKTsKK30KKworIyBRdWVzdGlvbmFibGUgZmlsZW5hbWUgXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiBuby4gQWRkaXRpb25hbCBkYXRhOiBuby4gVGVsbCB0aGUgc2VydmVyIHRvIGNoZWNrCisjICAgICB3aGV0aGVyIGZpbGVuYW1lIHNob3VsZCBiZSBpZ25vcmVkLCBhbmQgaWYgbm90LCBuZXh0IHRpbWUgdGhlIHNlcnZlcgorIyAgICAgc2VuZHMgcmVzcG9uc2VzLCBzZW5kIChpbiBhIE0gcmVzcG9uc2UpIGA/JyBmb2xsb3dlZCBieSB0aGUgZGlyZWN0b3J5IGFuZAorIyAgICAgZmlsZW5hbWUuIGZpbGVuYW1lIG11c3Qgbm90IGNvbnRhaW4gYC8nOyBpdCBuZWVkcyB0byBiZSBhIGZpbGUgaW4gdGhlCisjICAgICBkaXJlY3RvcnkgbmFtZWQgYnkgdGhlIG1vc3QgcmVjZW50IERpcmVjdG9yeSByZXF1ZXN0Lgorc3ViIHJlcV9RdWVzdGlvbmFibGUKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgICRsb2ctPmRlYnVnKCJyZXFfUXVlc3Rpb25hYmxlIDogJGRhdGEiKTsKKyAgICAkc3RhdGUtPntlbnRyaWVzfXskc3RhdGUtPntkaXJlY3Rvcnl9LiRkYXRhfXtxdWVzdGlvbmFibGV9ID0gMTsKK30KKworIyBhZGQgXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiB5ZXMuIEFkZCBhIGZpbGUgb3IgZGlyZWN0b3J5LiBUaGlzIHVzZXMgYW55IHByZXZpb3VzCisjICAgICBBcmd1bWVudCwgRGlyZWN0b3J5LCBFbnRyeSwgb3IgTW9kaWZpZWQgcmVxdWVzdHMsIGlmIHRoZXkgaGF2ZSBiZWVuIHNlbnQuCisjICAgICBUaGUgbGFzdCBEaXJlY3Rvcnkgc2VudCBzcGVjaWZpZXMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGF0IHRoZSB0aW1lIG9mCisjICAgICB0aGUgb3BlcmF0aW9uLiBUbyBhZGQgYSBkaXJlY3RvcnksIHNlbmQgdGhlIGRpcmVjdG9yeSB0byBiZSBhZGRlZCB1c2luZworIyAgICAgRGlyZWN0b3J5IGFuZCBBcmd1bWVudCByZXF1ZXN0cy4KK3N1YiByZXFfYWRkCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICBhcmdzcGxpdCgiYWRkIik7CisKKyAgICBteSAkdXBkYXRlciA9IEdJVENWUzo6dXBkYXRlci0+bmV3KCRzdGF0ZS0+e0NWU1JPT1R9LCAkc3RhdGUtPnttb2R1bGV9LCAkbG9nKTsKKyAgICAkdXBkYXRlci0+dXBkYXRlKCk7CisKKyAgICBhcmdzZnJvbWRpcigkdXBkYXRlcik7CisKKyAgICBteSAkYWRkY291bnQgPSAwOworCisgICAgZm9yZWFjaCBteSAkZmlsZW5hbWUgKCBAeyRzdGF0ZS0+e2FyZ3N9fSApCisgICAgeworICAgICAgICAkZmlsZW5hbWUgPSBmaWxlY2xlYW51cCgkZmlsZW5hbWUpOworCisgICAgICAgIG15ICRtZXRhID0gJHVwZGF0ZXItPmdldG1ldGEoJGZpbGVuYW1lKTsKKyAgICAgICAgbXkgJHdyZXYgPSByZXZwYXJzZSgkZmlsZW5hbWUpOworCisgICAgICAgIGlmICgkd3JldiAmJiAkbWV0YSAmJiAoJHdyZXYgPCAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgIyBwcmV2aW91c2x5IHJlbW92ZWQgZmlsZSwgYWRkIGJhY2sKKyAgICAgICAgICAgICRsb2ctPmluZm8oImFkZGVkIGZpbGUgJGZpbGVuYW1lIHdhcyBwcmV2aW91c2x5IHJlbW92ZWQsIHNlbmQgMS4kbWV0YS0+e3JldmlzaW9ufSIpOworCisgICAgICAgICAgICBwcmludCAiTVQgK3VwZGF0ZWRcbiI7CisgICAgICAgICAgICBwcmludCAiTVQgdGV4dCBVIFxuIjsKKyAgICAgICAgICAgIHByaW50ICJNVCBmbmFtZSAkZmlsZW5hbWVcbiI7CisgICAgICAgICAgICBwcmludCAiTVQgbmV3bGluZVxuIjsKKyAgICAgICAgICAgIHByaW50ICJNVCAtdXBkYXRlZFxuIjsKKworICAgICAgICAgICAgdW5sZXNzICggJHN0YXRlLT57Z2xvYmFsb3B0aW9uc317LW59ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBteSAoICRmaWxlcGFydCwgJGRpcnBhcnQgKSA9IGZpbGVuYW1lc3BsaXQoJGZpbGVuYW1lLDEpOworCisgICAgICAgICAgICAgICAgcHJpbnQgIkNyZWF0ZWQgJGRpcnBhcnRcbiI7CisgICAgICAgICAgICAgICAgcHJpbnQgJHN0YXRlLT57Q1ZTUk9PVH0gLiAiLyRzdGF0ZS0+e21vZHVsZX0vJGZpbGVuYW1lXG4iOworCisgICAgICAgICAgICAgICAgIyB0aGlzIGlzIGFuICJlbnRyaWVzIiBsaW5lCisgICAgICAgICAgICAgICAgbXkgJGtvcHRzID0ga29wdHNfZnJvbV9wYXRoKCRmaWxlcGFydCk7CisgICAgICAgICAgICAgICAgJGxvZy0+ZGVidWcoIi8kZmlsZXBhcnQvMS4kbWV0YS0+e3JldmlzaW9ufS8vJGtvcHRzLyIpOworICAgICAgICAgICAgICAgIHByaW50ICIvJGZpbGVwYXJ0LzEuJG1ldGEtPntyZXZpc2lvbn0vLyRrb3B0cy9cbiI7CisgICAgICAgICAgICAgICAgIyBwZXJtaXNzaW9ucworICAgICAgICAgICAgICAgICRsb2ctPmRlYnVnKCJTRU5EIDogdT0kbWV0YS0+e21vZGV9LGc9JG1ldGEtPnttb2RlfSxvPSRtZXRhLT57bW9kZX0iKTsKKyAgICAgICAgICAgICAgICBwcmludCAidT0kbWV0YS0+e21vZGV9LGc9JG1ldGEtPnttb2RlfSxvPSRtZXRhLT57bW9kZX1cbiI7CisgICAgICAgICAgICAgICAgIyB0cmFuc21pdCBmaWxlCisgICAgICAgICAgICAgICAgdHJhbnNtaXRmaWxlKCRtZXRhLT57ZmlsZWhhc2h9KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHVubGVzcyAoIGRlZmluZWQgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2ZpbGVuYW1lfSApICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnQgIkUgY3ZzIGFkZDogbm90aGluZyBrbm93biBhYm91dCBgJGZpbGVuYW1lJ1xuIjsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH0KKyAgICAgICAgIyBUT0RPIDogY2hlY2sgd2UncmUgbm90IHNxdWFzaGluZyBhbiBhbHJlYWR5IGV4aXN0aW5nIGZpbGUKKyAgICAgICAgaWYgKCBkZWZpbmVkICggJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXtyZXZpc2lvbn0gKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ICJFIGN2cyBhZGQ6IGAkZmlsZW5hbWUnIGhhcyBhbHJlYWR5IGJlZW4gZW50ZXJlZFxuIjsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBteSAoICRmaWxlcGFydCwgJGRpcnBhcnQgKSA9IGZpbGVuYW1lc3BsaXQoJGZpbGVuYW1lLCAxKTsKKworICAgICAgICBwcmludCAiRSBjdnMgYWRkOiBzY2hlZHVsaW5nIGZpbGUgYCRmaWxlbmFtZScgZm9yIGFkZGl0aW9uXG4iOworCisgICAgICAgIHByaW50ICJDaGVja2VkLWluICRkaXJwYXJ0XG4iOworICAgICAgICBwcmludCAiJGZpbGVuYW1lXG4iOworICAgICAgICBteSAka29wdHMgPSBrb3B0c19mcm9tX3BhdGgoJGZpbGVwYXJ0KTsKKyAgICAgICAgcHJpbnQgIi8kZmlsZXBhcnQvMC8vJGtvcHRzL1xuIjsKKworICAgICAgICAkYWRkY291bnQrKzsKKyAgICB9CisKKyAgICBpZiAoICRhZGRjb3VudCA9PSAxICkKKyAgICB7CisgICAgICAgIHByaW50ICJFIGN2cyBhZGQ6IHVzZSBgY3ZzIGNvbW1pdCcgdG8gYWRkIHRoaXMgZmlsZSBwZXJtYW5lbnRseVxuIjsKKyAgICB9CisgICAgZWxzaWYgKCAkYWRkY291bnQgPiAxICkKKyAgICB7CisgICAgICAgIHByaW50ICJFIGN2cyBhZGQ6IHVzZSBgY3ZzIGNvbW1pdCcgdG8gYWRkIHRoZXNlIGZpbGVzIHBlcm1hbmVudGx5XG4iOworICAgIH0KKworICAgIHByaW50ICJva1xuIjsKK30KKworIyByZW1vdmUgXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiB5ZXMuIFJlbW92ZSBhIGZpbGUuIFRoaXMgdXNlcyBhbnkgcHJldmlvdXMgQXJndW1lbnQsCisjICAgICBEaXJlY3RvcnksIEVudHJ5LCBvciBNb2RpZmllZCByZXF1ZXN0cywgaWYgdGhleSBoYXZlIGJlZW4gc2VudC4gVGhlIGxhc3QKKyMgICAgIERpcmVjdG9yeSBzZW50IHNwZWNpZmllcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgYXQgdGhlIHRpbWUgb2YgdGhlCisjICAgICBvcGVyYXRpb24uIE5vdGUgdGhhdCB0aGlzIHJlcXVlc3QgZG9lcyBub3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgdG8gdGhlCisjICAgICByZXBvc2l0b3J5OyB0aGUgb25seSBlZmZlY3Qgb2YgYSBzdWNjZXNzZnVsIHJlbW92ZSByZXF1ZXN0IGlzIHRvIHN1cHBseQorIyAgICAgdGhlIGNsaWVudCB3aXRoIGEgbmV3IGVudHJpZXMgbGluZSBjb250YWluaW5nIGAtJyB0byBpbmRpY2F0ZSBhIHJlbW92ZWQKKyMgICAgIGZpbGUuIEluIGZhY3QsIHRoZSBjbGllbnQgcHJvYmFibHkgY291bGQgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiB3aXRob3V0CisjICAgICBjb250YWN0aW5nIHRoZSBzZXJ2ZXIsIGFsdGhvdWdoIHVzaW5nIHJlbW92ZSBtYXkgY2F1c2UgdGhlIHNlcnZlciB0bworIyAgICAgcGVyZm9ybSBhIGZldyBtb3JlIGNoZWNrcy4gVGhlIGNsaWVudCBzZW5kcyBhIHN1YnNlcXVlbnQgY2kgcmVxdWVzdCB0bworIyAgICAgYWN0dWFsbHkgcmVjb3JkIHRoZSByZW1vdmFsIGluIHRoZSByZXBvc2l0b3J5Lgorc3ViIHJlcV9yZW1vdmUKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgIGFyZ3NwbGl0KCJyZW1vdmUiKTsKKworICAgICMgR3JhYiBhIGhhbmRsZSB0byB0aGUgU1FMaXRlIGRiIGFuZCBkbyBhbnkgbmVjZXNzYXJ5IHVwZGF0ZXMKKyAgICBteSAkdXBkYXRlciA9IEdJVENWUzo6dXBkYXRlci0+bmV3KCRzdGF0ZS0+e0NWU1JPT1R9LCAkc3RhdGUtPnttb2R1bGV9LCAkbG9nKTsKKyAgICAkdXBkYXRlci0+dXBkYXRlKCk7CisKKyAgICAjJGxvZy0+ZGVidWcoImFkZCBzdGF0ZSA6ICIgLiBEdW1wZXIoJHN0YXRlKSk7CisKKyAgICBteSAkcm1jb3VudCA9IDA7CisKKyAgICBmb3JlYWNoIG15ICRmaWxlbmFtZSAoIEB7JHN0YXRlLT57YXJnc319ICkKKyAgICB7CisgICAgICAgICRmaWxlbmFtZSA9IGZpbGVjbGVhbnVwKCRmaWxlbmFtZSk7CisKKyAgICAgICAgaWYgKCBkZWZpbmVkICggJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXt1bmNoYW5nZWR9ICkgb3IgZGVmaW5lZCAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfZmlsZW5hbWV9ICkgKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludCAiRSBjdnMgcmVtb3ZlOiBmaWxlIGAkZmlsZW5hbWUnIHN0aWxsIGluIHdvcmtpbmcgZGlyZWN0b3J5XG4iOworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIG15ICRtZXRhID0gJHVwZGF0ZXItPmdldG1ldGEoJGZpbGVuYW1lKTsKKyAgICAgICAgbXkgJHdyZXYgPSByZXZwYXJzZSgkZmlsZW5hbWUpOworCisgICAgICAgIHVubGVzcyAoIGRlZmluZWQgKCAkd3JldiApICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnQgIkUgY3ZzIHJlbW92ZTogbm90aGluZyBrbm93biBhYm91dCBgJGZpbGVuYW1lJ1xuIjsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGRlZmluZWQoJHdyZXYpIGFuZCAkd3JldiA8IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludCAiRSBjdnMgcmVtb3ZlOiBmaWxlIGAkZmlsZW5hbWUnIGFscmVhZHkgc2NoZWR1bGVkIGZvciByZW1vdmFsXG4iOworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHVubGVzcyAoICR3cmV2ID09ICRtZXRhLT57cmV2aXNpb259ICkKKyAgICAgICAgeworICAgICAgICAgICAgIyBUT0RPIDogbm90IHN1cmUgaWYgdGhlIGZvcm1hdCBvZiB0aGlzIG1lc3NhZ2UgaXMgcXVpdGUgY29ycmVjdC4KKyAgICAgICAgICAgIHByaW50ICJFIGN2cyByZW1vdmU6IFVwIHRvIGRhdGUgY2hlY2sgZmFpbGVkIGZvciBgJGZpbGVuYW1lJ1xuIjsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH0KKworCisgICAgICAgIG15ICggJGZpbGVwYXJ0LCAkZGlycGFydCApID0gZmlsZW5hbWVzcGxpdCgkZmlsZW5hbWUsIDEpOworCisgICAgICAgIHByaW50ICJFIGN2cyByZW1vdmU6IHNjaGVkdWxpbmcgYCRmaWxlbmFtZScgZm9yIHJlbW92YWxcbiI7CisKKyAgICAgICAgcHJpbnQgIkNoZWNrZWQtaW4gJGRpcnBhcnRcbiI7CisgICAgICAgIHByaW50ICIkZmlsZW5hbWVcbiI7CisgICAgICAgIG15ICRrb3B0cyA9IGtvcHRzX2Zyb21fcGF0aCgkZmlsZXBhcnQpOworICAgICAgICBwcmludCAiLyRmaWxlcGFydC8tMS4kd3Jldi8vJGtvcHRzL1xuIjsKKworICAgICAgICAkcm1jb3VudCsrOworICAgIH0KKworICAgIGlmICggJHJtY291bnQgPT0gMSApCisgICAgeworICAgICAgICBwcmludCAiRSBjdnMgcmVtb3ZlOiB1c2UgYGN2cyBjb21taXQnIHRvIHJlbW92ZSB0aGlzIGZpbGUgcGVybWFuZW50bHlcbiI7CisgICAgfQorICAgIGVsc2lmICggJHJtY291bnQgPiAxICkKKyAgICB7CisgICAgICAgIHByaW50ICJFIGN2cyByZW1vdmU6IHVzZSBgY3ZzIGNvbW1pdCcgdG8gcmVtb3ZlIHRoZXNlIGZpbGVzIHBlcm1hbmVudGx5XG4iOworICAgIH0KKworICAgIHByaW50ICJva1xuIjsKK30KKworIyBNb2RpZmllZCBmaWxlbmFtZSBcbgorIyAgICAgUmVzcG9uc2UgZXhwZWN0ZWQ6IG5vLiBBZGRpdGlvbmFsIGRhdGE6IG1vZGUsIFxuLCBmaWxlIHRyYW5zbWlzc2lvbi4gU2VuZAorIyAgICAgdGhlIHNlcnZlciBhIGNvcHkgb2Ygb25lIGxvY2FsbHkgbW9kaWZpZWQgZmlsZS4gZmlsZW5hbWUgaXMgYSBmaWxlIHdpdGhpbgorIyAgICAgdGhlIG1vc3QgcmVjZW50IGRpcmVjdG9yeSBzZW50IHdpdGggRGlyZWN0b3J5OyBpdCBtdXN0IG5vdCBjb250YWluIGAvJy4KKyMgICAgIElmIHRoZSB1c2VyIGlzIG9wZXJhdGluZyBvbiBvbmx5IHNvbWUgZmlsZXMgaW4gYSBkaXJlY3RvcnksIG9ubHkgdGhvc2UKKyMgICAgIGZpbGVzIG5lZWQgdG8gYmUgaW5jbHVkZWQuIFRoaXMgY2FuIGFsc28gYmUgc2VudCB3aXRob3V0IEVudHJ5LCBpZiB0aGVyZQorIyAgICAgaXMgbm8gZW50cnkgZm9yIHRoZSBmaWxlLgorc3ViIHJlcV9Nb2RpZmllZAoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworCisgICAgbXkgJG1vZGUgPSA8U1RESU4+OworICAgIGRlZmluZWQgJG1vZGUKKyAgICAgICAgb3IgKHByaW50ICJFIGVuZCBvZiBmaWxlIHJlYWRpbmcgbW9kZSBmb3IgJGRhdGFcbiIpLCByZXR1cm47CisgICAgY2hvbXAgJG1vZGU7CisgICAgbXkgJHNpemUgPSA8U1RESU4+OworICAgIGRlZmluZWQgJHNpemUKKyAgICAgICAgb3IgKHByaW50ICJFIGVuZCBvZiBmaWxlIHJlYWRpbmcgc2l6ZSBvZiAkZGF0YVxuIiksIHJldHVybjsKKyAgICBjaG9tcCAkc2l6ZTsKKworICAgICMgR3JhYiBjb25maWcgaW5mb3JtYXRpb24KKyAgICBteSAkYmxvY2tzaXplID0gODE5MjsKKyAgICBteSAkYnl0ZXNsZWZ0ID0gJHNpemU7CisgICAgbXkgJHRtcDsKKworICAgICMgR2V0IGEgZmlsZWhhbmRsZS9uYW1lIHRvIHdyaXRlIGl0IHRvCisgICAgbXkgKCAkZmgsICRmaWxlbmFtZSApID0gdGVtcGZpbGUoIERJUiA9PiAkVEVNUF9ESVIgKTsKKworICAgICMgTG9vcCBvdmVyIGZpbGUgZGF0YSB3cml0aW5nIG91dCB0byB0ZW1wb3JhcnkgZmlsZS4KKyAgICB3aGlsZSAoICRieXRlc2xlZnQgKQorICAgIHsKKyAgICAgICAgJGJsb2Nrc2l6ZSA9ICRieXRlc2xlZnQgaWYgKCAkYnl0ZXNsZWZ0IDwgJGJsb2Nrc2l6ZSApOworICAgICAgICByZWFkIFNURElOLCAkdG1wLCAkYmxvY2tzaXplOworICAgICAgICBwcmludCAkZmggJHRtcDsKKyAgICAgICAgJGJ5dGVzbGVmdCAtPSAkYmxvY2tzaXplOworICAgIH0KKworICAgIGNsb3NlICRmaAorICAgICAgICBvciAocHJpbnQgIkUgZmFpbGVkIHRvIHdyaXRlIHRlbXBvcmFyeSwgJGZpbGVuYW1lOiAkIVxuIiksIHJldHVybjsKKworICAgICMgRW5zdXJlIHdlIGhhdmUgc29tZXRoaW5nIHNlbnNpYmxlIGZvciB0aGUgZmlsZSBtb2RlCisgICAgaWYgKCAkbW9kZSA9fiAvdT0oXHcrKS8gKQorICAgIHsKKyAgICAgICAgJG1vZGUgPSAkMTsKKyAgICB9IGVsc2UgeworICAgICAgICAkbW9kZSA9ICJydyI7CisgICAgfQorCisgICAgIyBTYXZlIHRoZSBmaWxlIGRhdGEgaW4gJHN0YXRlCisgICAgJHN0YXRlLT57ZW50cmllc317JHN0YXRlLT57ZGlyZWN0b3J5fS4kZGF0YX17bW9kaWZpZWRfZmlsZW5hbWV9ID0gJGZpbGVuYW1lOworICAgICRzdGF0ZS0+e2VudHJpZXN9eyRzdGF0ZS0+e2RpcmVjdG9yeX0uJGRhdGF9e21vZGlmaWVkX21vZGV9ID0gJG1vZGU7CisgICAgJHN0YXRlLT57ZW50cmllc317JHN0YXRlLT57ZGlyZWN0b3J5fS4kZGF0YX17bW9kaWZpZWRfaGFzaH0gPSBgZ2l0LWhhc2gtb2JqZWN0ICRmaWxlbmFtZWA7CisgICAgJHN0YXRlLT57ZW50cmllc317JHN0YXRlLT57ZGlyZWN0b3J5fS4kZGF0YX17bW9kaWZpZWRfaGFzaH0gPX4gcy9ccy4qJC8vczsKKworICAgICMkbG9nLT5kZWJ1ZygicmVxX01vZGlmaWVkIDogZmlsZT0kZGF0YSBtb2RlPSRtb2RlIHNpemU9JHNpemUiKTsKK30KKworIyBVbmNoYW5nZWQgZmlsZW5hbWUgXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiBuby4gVGVsbCB0aGUgc2VydmVyIHRoYXQgZmlsZW5hbWUgaGFzIG5vdCBiZWVuCisjICAgICBtb2RpZmllZCBpbiB0aGUgY2hlY2tlZCBvdXQgZGlyZWN0b3J5LiBUaGUgZmlsZW5hbWUgaXMgYSBmaWxlIHdpdGhpbiB0aGUKKyMgICAgIG1vc3QgcmVjZW50IGRpcmVjdG9yeSBzZW50IHdpdGggRGlyZWN0b3J5OyBpdCBtdXN0IG5vdCBjb250YWluIGAvJy4KK3N1YiByZXFfVW5jaGFuZ2VkCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICAkc3RhdGUtPntlbnRyaWVzfXskc3RhdGUtPntkaXJlY3Rvcnl9LiRkYXRhfXt1bmNoYW5nZWR9ID0gMTsKKworICAgICMkbG9nLT5kZWJ1ZygicmVxX1VuY2hhbmdlZCA6ICRkYXRhIik7Cit9CisKKyMgQXJndW1lbnQgdGV4dCBcbgorIyAgICAgUmVzcG9uc2UgZXhwZWN0ZWQ6IG5vLiBTYXZlIGFyZ3VtZW50IGZvciB1c2UgaW4gYSBzdWJzZXF1ZW50IGNvbW1hbmQuCisjICAgICBBcmd1bWVudHMgYWNjdW11bGF0ZSB1bnRpbCBhbiBhcmd1bWVudC11c2luZyBjb21tYW5kIGlzIGdpdmVuLCBhdCB3aGljaAorIyAgICAgcG9pbnQgdGhleSBhcmUgZm9yZ290dGVuLgorIyBBcmd1bWVudHggdGV4dCBcbgorIyAgICAgUmVzcG9uc2UgZXhwZWN0ZWQ6IG5vLiBBcHBlbmQgXG4gZm9sbG93ZWQgYnkgdGV4dCB0byB0aGUgY3VycmVudCBhcmd1bWVudAorIyAgICAgYmVpbmcgc2F2ZWQuCitzdWIgcmVxX0FyZ3VtZW50Cit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICAjIEFyZ3VtZW50eCBtZWFuczogYXBwZW5kIHRvIGxhc3QgQXJndW1lbnQgKHdpdGggYSBuZXdsaW5lIGluIGZyb250KQorCisgICAgJGxvZy0+ZGVidWcoIiRjbWQgOiAkZGF0YSIpOworCisgICAgaWYgKCAkY21kIGVxICdBcmd1bWVudHgnKSB7CisgICAgICAgICR7JHN0YXRlLT57YXJndW1lbnRzfX1bJCN7JHN0YXRlLT57YXJndW1lbnRzfX1dIC49ICJcbiIgLiAkZGF0YTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdXNoIEB7JHN0YXRlLT57YXJndW1lbnRzfX0sICRkYXRhOworICAgIH0KK30KKworIyBleHBhbmQtbW9kdWxlcyBcbgorIyAgICAgUmVzcG9uc2UgZXhwZWN0ZWQ6IHllcy4gRXhwYW5kIHRoZSBtb2R1bGVzIHdoaWNoIGFyZSBzcGVjaWZpZWQgaW4gdGhlCisjICAgICBhcmd1bWVudHMuIFJldHVybnMgdGhlIGRhdGEgaW4gTW9kdWxlLWV4cGFuc2lvbiByZXNwb25zZXMuIE5vdGUgdGhhdCB0aGUKKyMgICAgIHNlcnZlciBjYW4gYXNzdW1lIHRoYXQgdGhpcyBpcyBjaGVja291dCBvciBleHBvcnQsIG5vdCBydGFnIG9yIHJkaWZmOyB0aGUKKyMgICAgIGxhdHRlciBkbyBub3QgYWNjZXNzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgdGh1cyBoYXZlIG5vIG5lZWQgdG8KKyMgICAgIGV4cGFuZCBtb2R1bGVzIG9uIHRoZSBjbGllbnQgc2lkZS4gRXhwYW5kIG1heSBub3QgYmUgdGhlIGJlc3Qgd29yZCBmb3IKKyMgICAgIHdoYXQgdGhpcyByZXF1ZXN0IGRvZXMuIEl0IGRvZXMgbm90IG5lY2Vzc2FyaWx5IHRlbGwgeW91IGFsbCB0aGUgZmlsZXMKKyMgICAgIGNvbnRhaW5lZCBpbiBhIG1vZHVsZSwgZm9yIGV4YW1wbGUuIEJhc2ljYWxseSBpdCBpcyBhIHdheSBvZiB0ZWxsaW5nIHlvdQorIyAgICAgd2hpY2ggd29ya2luZyBkaXJlY3RvcmllcyB0aGUgc2VydmVyIG5lZWRzIHRvIGtub3cgYWJvdXQgaW4gb3JkZXIgdG8KKyMgICAgIGhhbmRsZSBhIGNoZWNrb3V0IG9mIHRoZSBzcGVjaWZpZWQgbW9kdWxlcy4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgdGhhdCB0aGUKKyMgICAgIHNlcnZlciBoYXMgYSBtb2R1bGUgZGVmaW5lZCBieQorIyAgIGFsaWFzbW9kdWxlIC1hIDFkaXIKKyMgICAgIFRoYXQgaXMsIG9uZSBjYW4gY2hlY2sgb3V0IGFsaWFzbW9kdWxlIGFuZCBpdCB3aWxsIHRha2UgMWRpciBpbiB0aGUKKyMgICAgIHJlcG9zaXRvcnkgYW5kIGNoZWNrIGl0IG91dCB0byAxZGlyIGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4gTm93IHN1cHBvc2UKKyMgICAgIHRoZSBjbGllbnQgYWxyZWFkeSBoYXMgdGhpcyBtb2R1bGUgY2hlY2tlZCBvdXQgYW5kIGlzIHBsYW5uaW5nIG9uIHVzaW5nCisjICAgICB0aGUgY28gcmVxdWVzdCB0byB1cGRhdGUgaXQuIFdpdGhvdXQgdXNpbmcgZXhwYW5kLW1vZHVsZXMsIHRoZSBjbGllbnQKKyMgICAgIHdvdWxkIGhhdmUgdHdvIGJhZCBjaG9pY2VzOiBpdCBjb3VsZCBlaXRoZXIgc2VuZCBpbmZvcm1hdGlvbiBhYm91dCBhbGwKKyMgICAgIHdvcmtpbmcgZGlyZWN0b3JpZXMgdW5kZXIgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCB3aGljaCBjb3VsZCBiZQorIyAgICAgdW5uZWNlc3NhcmlseSBzbG93LCBvciBpdCBjb3VsZCBiZSBpZ25vcmFudCBvZiB0aGUgZmFjdCB0aGF0IGFsaWFzbW9kdWxlCisjICAgICBzdGFuZHMgZm9yIDFkaXIsIGFuZCBuZWdsZWN0IHRvIHNlbmQgaW5mb3JtYXRpb24gZm9yIDFkaXIsIHdoaWNoIHdvdWxkCisjICAgICBsZWFkIHRvIGluY29ycmVjdCBvcGVyYXRpb24uIFdpdGggZXhwYW5kLW1vZHVsZXMsIHRoZSBjbGllbnQgd291bGQgZmlyc3QKKyMgICAgIGFzayBmb3IgdGhlIG1vZHVsZSB0byBiZSBleHBhbmRlZDoKK3N1YiByZXFfZXhwYW5kbW9kdWxlcworeworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworCisgICAgYXJnc3BsaXQoKTsKKworICAgICRsb2ctPmRlYnVnKCJyZXFfZXhwYW5kbW9kdWxlcyA6ICIgLiAoIGRlZmluZWQoJGRhdGEpID8gJGRhdGEgOiAiW05VTExdIiApICk7CisKKyAgICB1bmxlc3MgKCByZWYgJHN0YXRlLT57YXJndW1lbnRzfSBlcSAiQVJSQVkiICkKKyAgICB7CisgICAgICAgIHByaW50ICJva1xuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvcmVhY2ggbXkgJG1vZHVsZSAoIEB7JHN0YXRlLT57YXJndW1lbnRzfX0gKQorICAgIHsKKyAgICAgICAgJGxvZy0+ZGVidWcoIlNFTkQgOiBNb2R1bGUtZXhwYW5zaW9uICRtb2R1bGUiKTsKKyAgICAgICAgcHJpbnQgIk1vZHVsZS1leHBhbnNpb24gJG1vZHVsZVxuIjsKKyAgICB9CisKKyAgICBwcmludCAib2tcbiI7CisgICAgc3RhdGVjbGVhbnVwKCk7Cit9CisKKyMgY28gXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiB5ZXMuIEdldCBmaWxlcyBmcm9tIHRoZSByZXBvc2l0b3J5LiBUaGlzIHVzZXMgYW55CisjICAgICBwcmV2aW91cyBBcmd1bWVudCwgRGlyZWN0b3J5LCBFbnRyeSwgb3IgTW9kaWZpZWQgcmVxdWVzdHMsIGlmIHRoZXkgaGF2ZQorIyAgICAgYmVlbiBzZW50LiBBcmd1bWVudHMgdG8gdGhpcyBjb21tYW5kIGFyZSBtb2R1bGUgbmFtZXM7IHRoZSBjbGllbnQgY2Fubm90CisjICAgICBrbm93IHdoYXQgZGlyZWN0b3JpZXMgdGhleSBjb3JyZXNwb25kIHRvIGV4Y2VwdCBieSAoMSkganVzdCBzZW5kaW5nIHRoZQorIyAgICAgY28gcmVxdWVzdCwgYW5kIHRoZW4gc2VlaW5nIHdoYXQgZGlyZWN0b3J5IG5hbWVzIHRoZSBzZXJ2ZXIgc2VuZHMgYmFjayBpbgorIyAgICAgaXRzIHJlc3BvbnNlcywgYW5kICgyKSB0aGUgZXhwYW5kLW1vZHVsZXMgcmVxdWVzdC4KK3N1YiByZXFfY28KK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgIGFyZ3NwbGl0KCJjbyIpOworCisgICAgbXkgJG1vZHVsZSA9ICRzdGF0ZS0+e2FyZ3N9WzBdOworICAgIG15ICRjaGVja291dF9wYXRoID0gJG1vZHVsZTsKKworICAgICMgdXNlIHRoZSB1c2VyIHNwZWNpZmllZCBkaXJlY3RvcnkgaWYgd2UncmUgZ2l2ZW4gaXQKKyAgICAkY2hlY2tvdXRfcGF0aCA9ICRzdGF0ZS0+e29wdH17ZH0gaWYgKCBleGlzdHMgKCAkc3RhdGUtPntvcHR9e2R9ICkgKTsKKworICAgICRsb2ctPmRlYnVnKCJyZXFfY28gOiAiIC4gKCBkZWZpbmVkKCRkYXRhKSA/ICRkYXRhIDogIltOVUxMXSIgKSApOworCisgICAgJGxvZy0+aW5mbygiQ2hlY2tpbmcgb3V0IG1vZHVsZSAnJG1vZHVsZScgKCRzdGF0ZS0+e0NWU1JPT1R9KSB0byAnJGNoZWNrb3V0X3BhdGgnIik7CisKKyAgICAkRU5We0dJVF9ESVJ9ID0gJHN0YXRlLT57Q1ZTUk9PVH0gLiAiLyI7CisKKyAgICAjIEdyYWIgYSBoYW5kbGUgdG8gdGhlIFNRTGl0ZSBkYiBhbmQgZG8gYW55IG5lY2Vzc2FyeSB1cGRhdGVzCisgICAgbXkgJHVwZGF0ZXIgPSBHSVRDVlM6OnVwZGF0ZXItPm5ldygkc3RhdGUtPntDVlNST09UfSwgJG1vZHVsZSwgJGxvZyk7CisgICAgJHVwZGF0ZXItPnVwZGF0ZSgpOworCisgICAgJGNoZWNrb3V0X3BhdGggPX4gc3wvJHx8OyAjIGdldCByaWQgb2YgdHJhaWxpbmcgc2xhc2hlcworCisgICAgIyBFY2xpcHNlIHNlZW1zIHRvIG5lZWQgdGhlIENsZWFyLXN0aWNreSBjb21tYW5kCisgICAgIyB0byBwcmVwYXJlIHRoZSAnRW50cmllcycgZmlsZSBmb3IgdGhlIG5ldyBkaXJlY3RvcnkuCisgICAgcHJpbnQgIkNsZWFyLXN0aWNreSAkY2hlY2tvdXRfcGF0aC9cbiI7CisgICAgcHJpbnQgJHN0YXRlLT57Q1ZTUk9PVH0gLiAiLyRtb2R1bGUvXG4iOworICAgIHByaW50ICJDbGVhci1zdGF0aWMtZGlyZWN0b3J5ICRjaGVja291dF9wYXRoL1xuIjsKKyAgICBwcmludCAkc3RhdGUtPntDVlNST09UfSAuICIvJG1vZHVsZS9cbiI7CisgICAgcHJpbnQgIkNsZWFyLXN0aWNreSAkY2hlY2tvdXRfcGF0aC9cbiI7ICMgeWVzLCB0d2ljZQorICAgIHByaW50ICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8kbW9kdWxlL1xuIjsKKyAgICBwcmludCAiVGVtcGxhdGUgJGNoZWNrb3V0X3BhdGgvXG4iOworICAgIHByaW50ICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8kbW9kdWxlL1xuIjsKKyAgICBwcmludCAiMFxuIjsKKworICAgICMgaW5zdHJ1Y3QgdGhlIGNsaWVudCB0aGF0IHdlJ3JlIGNoZWNraW5nIG91dCB0byAkY2hlY2tvdXRfcGF0aAorICAgIHByaW50ICJFIGN2cyBjaGVja291dDogVXBkYXRpbmcgJGNoZWNrb3V0X3BhdGhcbiI7CisKKyAgICBteSAlc2VlbmRpcnMgPSAoKTsKKyAgICBteSAkbGFzdGRpciA9Jyc7CisKKyAgICAjIHJlY3Vyc2l2ZQorICAgIHN1YiBwcmVwZGlyIHsKKyAgICAgICBteSAoJGRpciwgJHJlcG9kaXIsICRyZW1vdGVkaXIsICRzZWVuZGlycykgPSBAXzsKKyAgICAgICBteSAkcGFyZW50ID0gZGlybmFtZSgkZGlyKTsKKyAgICAgICAkZGlyICAgICAgID1+IHN8LyskfHw7CisgICAgICAgJHJlcG9kaXIgICA9fiBzfC8rJHx8OworICAgICAgICRyZW1vdGVkaXIgPX4gc3wvKyR8fDsKKyAgICAgICAkcGFyZW50ICAgID1+IHN8LyskfHw7CisgICAgICAgJGxvZy0+ZGVidWcoImFubm91bmNlZGlyICRkaXIsICRyZXBvZGlyLCAkcmVtb3RlZGlyIiApOworCisgICAgICAgaWYgKCRwYXJlbnQgZXEgJy4nIHx8ICRwYXJlbnQgZXEgJy4vJykgeworICAgICAgICAgICAkcGFyZW50ID0gJyc7CisgICAgICAgfQorICAgICAgICMgcmVjdXJzZSB0byBhbm5vdW5jZSB1bnNlZW4gcGFyZW50cyBmaXJzdAorICAgICAgIGlmIChsZW5ndGgoJHBhcmVudCkgJiYgIWV4aXN0cygkc2VlbmRpcnMtPnskcGFyZW50fSkpIHsKKyAgICAgICAgICAgcHJlcGRpcigkcGFyZW50LCAkcmVwb2RpciwgJHJlbW90ZWRpciwgJHNlZW5kaXJzKTsKKyAgICAgICB9CisgICAgICAgIyBBbm5vdW5jZSB0aGF0IHdlIGFyZSBnb2luZyB0byBtb2RpZnkgYXQgdGhlIHBhcmVudCBsZXZlbAorICAgICAgIGlmICgkcGFyZW50KSB7CisgICAgICAgICAgIHByaW50ICJFIGN2cyBjaGVja291dDogVXBkYXRpbmcgJHJlbW90ZWRpci8kcGFyZW50XG4iOworICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIHByaW50ICJFIGN2cyBjaGVja291dDogVXBkYXRpbmcgJHJlbW90ZWRpclxuIjsKKyAgICAgICB9CisgICAgICAgcHJpbnQgIkNsZWFyLXN0aWNreSAkcmVtb3RlZGlyLyRwYXJlbnQvXG4iOworICAgICAgIHByaW50ICIkcmVwb2Rpci8kcGFyZW50L1xuIjsKKworICAgICAgIHByaW50ICJDbGVhci1zdGF0aWMtZGlyZWN0b3J5ICRyZW1vdGVkaXIvJGRpci9cbiI7CisgICAgICAgcHJpbnQgIiRyZXBvZGlyLyRkaXIvXG4iOworICAgICAgIHByaW50ICJDbGVhci1zdGlja3kgJHJlbW90ZWRpci8kcGFyZW50L1xuIjsgIyB5ZXMsIHR3aWNlCisgICAgICAgcHJpbnQgIiRyZXBvZGlyLyRwYXJlbnQvXG4iOworICAgICAgIHByaW50ICJUZW1wbGF0ZSAkcmVtb3RlZGlyLyRkaXIvXG4iOworICAgICAgIHByaW50ICIkcmVwb2Rpci8kZGlyL1xuIjsKKyAgICAgICBwcmludCAiMFxuIjsKKworICAgICAgICRzZWVuZGlycy0+eyRkaXJ9ID0gMTsKKyAgICB9CisKKyAgICBmb3JlYWNoIG15ICRnaXQgKCBAeyR1cGRhdGVyLT5nZXRoZWFkfSApCisgICAgeworICAgICAgICAjIERvbid0IHdhbnQgdG8gY2hlY2sgb3V0IGRlbGV0ZWQgZmlsZXMKKyAgICAgICAgbmV4dCBpZiAoICRnaXQtPntmaWxlaGFzaH0gZXEgImRlbGV0ZWQiICk7CisKKyAgICAgICAgKCAkZ2l0LT57bmFtZX0sICRnaXQtPntkaXJ9ICkgPSBmaWxlbmFtZXNwbGl0KCRnaXQtPntuYW1lfSk7CisKKyAgICAgICBpZiAobGVuZ3RoKCRnaXQtPntkaXJ9KSAmJiAkZ2l0LT57ZGlyfSBuZSAnLi8nCisgICAgICAgICAgICYmICRnaXQtPntkaXJ9IG5lICRsYXN0ZGlyICkgeworICAgICAgICAgICB1bmxlc3MgKGV4aXN0cygkc2VlbmRpcnN7JGdpdC0+e2Rpcn19KSkgeworICAgICAgICAgICAgICAgcHJlcGRpcigkZ2l0LT57ZGlyfSwgJHN0YXRlLT57Q1ZTUk9PVH0gLiAiLyRtb2R1bGUvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgJGNoZWNrb3V0X3BhdGgsIFwlc2VlbmRpcnMpOworICAgICAgICAgICAgICAgJGxhc3RkaXIgPSAkZ2l0LT57ZGlyfTsKKyAgICAgICAgICAgICAgICRzZWVuZGlyc3skZ2l0LT57ZGlyfX0gPSAxOworICAgICAgICAgICB9CisgICAgICAgICAgIHByaW50ICJFIGN2cyBjaGVja291dDogVXBkYXRpbmcgLyRjaGVja291dF9wYXRoLyRnaXQtPntkaXJ9XG4iOworICAgICAgIH0KKworICAgICAgICAjIG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoaXMgZmlsZQorICAgICAgICBwcmludCAiTW9kLXRpbWUgJGdpdC0+e21vZGlmaWVkfVxuIjsKKworICAgICAgICAjIHByaW50IHNvbWUgaW5mb3JtYXRpb24gdG8gdGhlIGNsaWVudAorICAgICAgICBpZiAoIGRlZmluZWQgKCAkZ2l0LT57ZGlyfSApIGFuZCAkZ2l0LT57ZGlyfSBuZSAiLi8iICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnQgIk0gVSAkY2hlY2tvdXRfcGF0aC8kZ2l0LT57ZGlyfSRnaXQtPntuYW1lfVxuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ICJNIFUgJGNoZWNrb3V0X3BhdGgvJGdpdC0+e25hbWV9XG4iOworICAgICAgICB9CisKKyAgICAgICAjIGluc3RydWN0IGNsaWVudCB3ZSdyZSBzZW5kaW5nIGEgZmlsZSB0byBwdXQgaW4gdGhpcyBwYXRoCisgICAgICAgcHJpbnQgIkNyZWF0ZWQgJGNoZWNrb3V0X3BhdGgvIiAuICggZGVmaW5lZCAoICRnaXQtPntkaXJ9ICkgYW5kICRnaXQtPntkaXJ9IG5lICIuLyIgPyAkZ2l0LT57ZGlyfSAuICIvIiA6ICIiICkgLiAiXG4iOworCisgICAgICAgcHJpbnQgJHN0YXRlLT57Q1ZTUk9PVH0gLiAiLyRtb2R1bGUvIiAuICggZGVmaW5lZCAoICRnaXQtPntkaXJ9ICkgYW5kICRnaXQtPntkaXJ9IG5lICIuLyIgPyAkZ2l0LT57ZGlyfSAuICIvIiA6ICIiICkgLiAiJGdpdC0+e25hbWV9XG4iOworCisgICAgICAgICMgdGhpcyBpcyBhbiAiZW50cmllcyIgbGluZQorICAgICAgICBteSAka29wdHMgPSBrb3B0c19mcm9tX3BhdGgoJGdpdC0+e25hbWV9KTsKKyAgICAgICAgcHJpbnQgIi8kZ2l0LT57bmFtZX0vMS4kZ2l0LT57cmV2aXNpb259Ly8ka29wdHMvXG4iOworICAgICAgICAjIHBlcm1pc3Npb25zCisgICAgICAgIHByaW50ICJ1PSRnaXQtPnttb2RlfSxnPSRnaXQtPnttb2RlfSxvPSRnaXQtPnttb2RlfVxuIjsKKworICAgICAgICAjIHRyYW5zbWl0IGZpbGUKKyAgICAgICAgdHJhbnNtaXRmaWxlKCRnaXQtPntmaWxlaGFzaH0pOworICAgIH0KKworICAgIHByaW50ICJva1xuIjsKKworICAgIHN0YXRlY2xlYW51cCgpOworfQorCisjIHVwZGF0ZSBcbgorIyAgICAgUmVzcG9uc2UgZXhwZWN0ZWQ6IHllcy4gQWN0dWFsbHkgZG8gYSBjdnMgdXBkYXRlIGNvbW1hbmQuIFRoaXMgdXNlcyBhbnkKKyMgICAgIHByZXZpb3VzIEFyZ3VtZW50LCBEaXJlY3RvcnksIEVudHJ5LCBvciBNb2RpZmllZCByZXF1ZXN0cywgaWYgdGhleSBoYXZlCisjICAgICBiZWVuIHNlbnQuIFRoZSBsYXN0IERpcmVjdG9yeSBzZW50IHNwZWNpZmllcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgYXQgdGhlCisjICAgICB0aW1lIG9mIHRoZSBvcGVyYXRpb24uIFRoZSAtSSBvcHRpb24gaXMgbm90IHVzZWQtLWZpbGVzIHdoaWNoIHRoZSBjbGllbnQKKyMgICAgIGNhbiBkZWNpZGUgd2hldGhlciB0byBpZ25vcmUgYXJlIG5vdCBtZW50aW9uZWQgYW5kIHRoZSBjbGllbnQgc2VuZHMgdGhlCisjICAgICBRdWVzdGlvbmFibGUgcmVxdWVzdCBmb3Igb3RoZXJzLgorc3ViIHJlcV91cGRhdGUKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgICRsb2ctPmRlYnVnKCJyZXFfdXBkYXRlIDogIiAuICggZGVmaW5lZCgkZGF0YSkgPyAkZGF0YSA6ICJbTlVMTF0iICkpOworCisgICAgYXJnc3BsaXQoInVwZGF0ZSIpOworCisgICAgIworICAgICMgSXQgbWF5IGp1c3QgYmUgYSBjbGllbnQgZXhwbG9yaW5nIHRoZSBhdmFpbGFibGUgaGVhZHMvbW9kdWxlcworICAgICMgaW4gdGhhdCBjYXNlLCBsaXN0IHRoZW0gYXMgdG9wIGxldmVsIGRpcmVjdG9yaWVzIGFuZCBsZWF2ZSBpdAorICAgICMgYXQgdGhhdC4gRWNsaXBzZSB1c2VzIHRoaXMgdGVjaG5pcXVlIHRvIG9mZmVyIHlvdSBhIGxpc3Qgb2YKKyAgICAjIHByb2plY3RzIChoZWFkcyBpbiB0aGlzIGNhc2UpIHRvIGNoZWNrb3V0LgorICAgICMKKyAgICBpZiAoJHN0YXRlLT57bW9kdWxlfSBlcSAnJykgeworCW15ICRoZWFkc19kaXIgPSAkc3RhdGUtPntDVlNST09UfSAuICcvcmVmcy9oZWFkcyc7CisJaWYgKCFvcGVuZGlyIEhFQURTLCAkaGVhZHNfZGlyKSB7CisJICAgIHByaW50ICJFIFtzZXJ2ZXIgYWJvcnRlZF06IEZhaWxlZCB0byBvcGVuIGRpcmVjdG9yeSwgIgorCSAgICAgIC4gIiRoZWFkc19kaXI6ICQhXG5lcnJvclxuIjsKKwkgICAgcmV0dXJuIDA7CisJfQorICAgICAgICBwcmludCAiRSBjdnMgdXBkYXRlOiBVcGRhdGluZyAuXG4iOworCXdoaWxlIChteSAkaGVhZCA9IHJlYWRkaXIoSEVBRFMpKSB7CisJICAgIGlmICgtZiAkc3RhdGUtPntDVlNST09UfSAuICcvcmVmcy9oZWFkcy8nIC4gJGhlYWQpIHsKKwkgICAgICAgIHByaW50ICJFIGN2cyB1cGRhdGU6IE5ldyBkaXJlY3RvcnkgYCRoZWFkJ1xuIjsKKwkgICAgfQorCX0KKwljbG9zZWRpciBIRUFEUzsKKwlwcmludCAib2tcbiI7CisJcmV0dXJuIDE7CisgICAgfQorCisKKyAgICAjIEdyYWIgYSBoYW5kbGUgdG8gdGhlIFNRTGl0ZSBkYiBhbmQgZG8gYW55IG5lY2Vzc2FyeSB1cGRhdGVzCisgICAgbXkgJHVwZGF0ZXIgPSBHSVRDVlM6OnVwZGF0ZXItPm5ldygkc3RhdGUtPntDVlNST09UfSwgJHN0YXRlLT57bW9kdWxlfSwgJGxvZyk7CisKKyAgICAkdXBkYXRlci0+dXBkYXRlKCk7CisKKyAgICBhcmdzZnJvbWRpcigkdXBkYXRlcik7CisKKyAgICAjJGxvZy0+ZGVidWcoInVwZGF0ZSBzdGF0ZSA6ICIgLiBEdW1wZXIoJHN0YXRlKSk7CisKKyAgICAjIGZvcmVhY2ggZmlsZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSAuLi4KKyAgICBmb3JlYWNoIG15ICRmaWxlbmFtZSAoIEB7JHN0YXRlLT57YXJnc319ICkKKyAgICB7CisgICAgICAgICRmaWxlbmFtZSA9IGZpbGVjbGVhbnVwKCRmaWxlbmFtZSk7CisKKyAgICAgICAgJGxvZy0+ZGVidWcoIlByb2Nlc3NpbmcgZmlsZSAkZmlsZW5hbWUiKTsKKworICAgICAgICAjIGlmIHdlIGhhdmUgYSAtQyB3ZSBzaG91bGQgcHJldGVuZCB3ZSBuZXZlciBzYXcgbW9kaWZpZWQgc3R1ZmYKKyAgICAgICAgaWYgKCBleGlzdHMgKCAkc3RhdGUtPntvcHR9e0N9ICkgKQorICAgICAgICB7CisgICAgICAgICAgICBkZWxldGUgJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9oYXNofTsKKyAgICAgICAgICAgIGRlbGV0ZSAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2ZpbGVuYW1lfTsKKyAgICAgICAgICAgICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17dW5jaGFuZ2VkfSA9IDE7CisgICAgICAgIH0KKworICAgICAgICBteSAkbWV0YTsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCRzdGF0ZS0+e29wdH17cn0pIGFuZCAkc3RhdGUtPntvcHR9e3J9ID1+IC9eMVwuKFxkKykvICkKKyAgICAgICAgeworICAgICAgICAgICAgJG1ldGEgPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUsICQxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRtZXRhID0gJHVwZGF0ZXItPmdldG1ldGEoJGZpbGVuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgICMgSWYgLXAgd2FzIGdpdmVuLCAicHJpbnQiIHRoZSBjb250ZW50cyBvZiB0aGUgcmVxdWVzdGVkIHJldmlzaW9uLgorICAgICAgICBpZiAoIGV4aXN0cyAoICRzdGF0ZS0+e29wdH17cH0gKSApIHsKKyAgICAgICAgICAgIGlmICggZGVmaW5lZCAoICRtZXRhLT57cmV2aXNpb259ICkgKSB7CisgICAgICAgICAgICAgICAgJGxvZy0+aW5mbygiUHJpbnRpbmcgJyRmaWxlbmFtZScgcmV2aXNpb24gIiAuICRtZXRhLT57cmV2aXNpb259KTsKKworICAgICAgICAgICAgICAgIHRyYW5zbWl0ZmlsZSgkbWV0YS0+e2ZpbGVoYXNofSwgeyBwcmludCA9PiAxIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZXh0OworICAgICAgICB9CisKKwlpZiAoICEgZGVmaW5lZCAkbWV0YSApCisJeworCSAgICAkbWV0YSA9IHsKKwkgICAgICAgIG5hbWUgPT4gJGZpbGVuYW1lLAorCSAgICAgICAgcmV2aXNpb24gPT4gMCwKKwkgICAgICAgIGZpbGVoYXNoID0+ICdhZGRlZCcKKwkgICAgfTsKKwl9CisKKyAgICAgICAgbXkgJG9sZG1ldGEgPSAkbWV0YTsKKworICAgICAgICBteSAkd3JldiA9IHJldnBhcnNlKCRmaWxlbmFtZSk7CisKKyAgICAgICAgIyBJZiB0aGUgd29ya2luZyBjb3B5IGlzIGFuIG9sZCByZXZpc2lvbiwgbGV0cyBnZXQgdGhhdCB2ZXJzaW9uIHRvbyBmb3IgY29tcGFyaXNvbi4KKyAgICAgICAgaWYgKCBkZWZpbmVkKCR3cmV2KSBhbmQgJHdyZXYgIT0gJG1ldGEtPntyZXZpc2lvbn0gKQorICAgICAgICB7CisgICAgICAgICAgICAkb2xkbWV0YSA9ICR1cGRhdGVyLT5nZXRtZXRhKCRmaWxlbmFtZSwgJHdyZXYpOworICAgICAgICB9CisKKyAgICAgICAgIyRsb2ctPmRlYnVnKCJUYXJnZXQgcmV2aXNpb24gaXMgJG1ldGEtPntyZXZpc2lvbn0sIGN1cnJlbnQgd29ya2luZyByZXZpc2lvbiBpcyAkd3JldiIpOworCisgICAgICAgICMgRmlsZXMgYXJlIHVwIHRvIGRhdGUgaWYgdGhlIHdvcmtpbmcgY29weSBhbmQgcmVwbyBjb3B5IGhhdmUgdGhlIHNhbWUgcmV2aXNpb24sCisgICAgICAgICMgYW5kIHRoZSB3b3JraW5nIGNvcHkgaXMgdW5tb2RpZmllZCBfYW5kXyB0aGUgdXNlciBoYXNuJ3Qgc3BlY2lmaWVkIC1DCisgICAgICAgIG5leHQgaWYgKCBkZWZpbmVkICggJHdyZXYgKQorICAgICAgICAgICAgICAgICAgYW5kIGRlZmluZWQoJG1ldGEtPntyZXZpc2lvbn0pCisgICAgICAgICAgICAgICAgICBhbmQgJHdyZXYgPT0gJG1ldGEtPntyZXZpc2lvbn0KKyAgICAgICAgICAgICAgICAgIGFuZCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e3VuY2hhbmdlZH0KKyAgICAgICAgICAgICAgICAgIGFuZCBub3QgZXhpc3RzICggJHN0YXRlLT57b3B0fXtDfSApICk7CisKKyAgICAgICAgIyBJZiB0aGUgd29ya2luZyBjb3B5IGFuZCByZXBvIGNvcHkgaGF2ZSB0aGUgc2FtZSByZXZpc2lvbiwKKyAgICAgICAgIyBidXQgdGhlIHdvcmtpbmcgY29weSBpcyBtb2RpZmllZCwgdGVsbCB0aGUgY2xpZW50IGl0J3MgbW9kaWZpZWQKKyAgICAgICAgaWYgKCBkZWZpbmVkICggJHdyZXYgKQorICAgICAgICAgICAgIGFuZCBkZWZpbmVkKCRtZXRhLT57cmV2aXNpb259KQorICAgICAgICAgICAgIGFuZCAkd3JldiA9PSAkbWV0YS0+e3JldmlzaW9ufQorICAgICAgICAgICAgIGFuZCBkZWZpbmVkKCRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfaGFzaH0pCisgICAgICAgICAgICAgYW5kIG5vdCBleGlzdHMgKCAkc3RhdGUtPntvcHR9e0N9ICkgKQorICAgICAgICB7CisgICAgICAgICAgICAkbG9nLT5pbmZvKCJUZWxsIHRoZSBjbGllbnQgdGhlIGZpbGUgaXMgbW9kaWZpZWQiKTsKKyAgICAgICAgICAgIHByaW50ICJNVCB0ZXh0IE0gXG4iOworICAgICAgICAgICAgcHJpbnQgIk1UIGZuYW1lICRmaWxlbmFtZVxuIjsKKyAgICAgICAgICAgIHByaW50ICJNVCBuZXdsaW5lXG4iOworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggJG1ldGEtPntmaWxlaGFzaH0gZXEgImRlbGV0ZWQiICkKKyAgICAgICAgeworICAgICAgICAgICAgbXkgKCAkZmlsZXBhcnQsICRkaXJwYXJ0ICkgPSBmaWxlbmFtZXNwbGl0KCRmaWxlbmFtZSwxKTsKKworICAgICAgICAgICAgJGxvZy0+aW5mbygiUmVtb3ZpbmcgJyRmaWxlbmFtZScgZnJvbSB3b3JraW5nIGNvcHkgKG5vIGxvbmdlciBpbiB0aGUgcmVwbykiKTsKKworICAgICAgICAgICAgcHJpbnQgIkUgY3ZzIHVwZGF0ZTogYCRmaWxlbmFtZScgaXMgbm8gbG9uZ2VyIGluIHRoZSByZXBvc2l0b3J5XG4iOworICAgICAgICAgICAgIyBEb24ndCB3YW50IHRvIGFjdHVhbGx5IF9ET18gdGhlIHVwZGF0ZSBpZiAtbiBzcGVjaWZpZWQKKyAgICAgICAgICAgIHVubGVzcyAoICRzdGF0ZS0+e2dsb2JhbG9wdGlvbnN9ey1ufSApIHsKKwkJcHJpbnQgIlJlbW92ZWQgJGRpcnBhcnRcbiI7CisJCXByaW50ICIkZmlsZXBhcnRcbiI7CisJICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoIG5vdCBkZWZpbmVkICggJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9oYXNofSApCisJCW9yICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfaGFzaH0gZXEgJG9sZG1ldGEtPntmaWxlaGFzaH0KKwkJb3IgJG1ldGEtPntmaWxlaGFzaH0gZXEgJ2FkZGVkJyApCisgICAgICAgIHsKKyAgICAgICAgICAgICMgbm9ybWFsIHVwZGF0ZSwganVzdCBzZW5kIHRoZSBuZXcgcmV2aXNpb24gKGVpdGhlciBVPVVwZGF0ZSwKKyAgICAgICAgICAgICMgb3IgQT1BZGQsIG9yIFI9UmVtb3ZlKQorCSAgICBpZiAoIGRlZmluZWQoJHdyZXYpICYmICR3cmV2IDwgMCApCisJICAgIHsKKwkgICAgICAgICRsb2ctPmluZm8oIlRlbGwgdGhlIGNsaWVudCB0aGUgZmlsZSBpcyBzY2hlZHVsZWQgZm9yIHJlbW92YWwiKTsKKwkJcHJpbnQgIk1UIHRleHQgUiBcbiI7CisgICAgICAgICAgICAgICAgcHJpbnQgIk1UIGZuYW1lICRmaWxlbmFtZVxuIjsKKyAgICAgICAgICAgICAgICBwcmludCAiTVQgbmV3bGluZVxuIjsKKwkJbmV4dDsKKwkgICAgfQorCSAgICBlbHNpZiAoICghZGVmaW5lZCgkd3JldikgfHwgJHdyZXYgPT0gMCkgJiYgKCFkZWZpbmVkKCRtZXRhLT57cmV2aXNpb259KSB8fCAkbWV0YS0+e3JldmlzaW9ufSA9PSAwKSApCisJICAgIHsKKwkgICAgICAgICRsb2ctPmluZm8oIlRlbGwgdGhlIGNsaWVudCB0aGUgZmlsZSBpcyBzY2hlZHVsZWQgZm9yIGFkZGl0aW9uIik7CisJCXByaW50ICJNVCB0ZXh0IEEgXG4iOworICAgICAgICAgICAgICAgIHByaW50ICJNVCBmbmFtZSAkZmlsZW5hbWVcbiI7CisgICAgICAgICAgICAgICAgcHJpbnQgIk1UIG5ld2xpbmVcbiI7CisJCW5leHQ7CisKKwkgICAgfQorCSAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAkbG9nLT5pbmZvKCJVcGRhdGluZyAnJGZpbGVuYW1lJyB0byAiLiRtZXRhLT57cmV2aXNpb259KTsKKyAgICAgICAgICAgICAgICBwcmludCAiTVQgK3VwZGF0ZWRcbiI7CisgICAgICAgICAgICAgICAgcHJpbnQgIk1UIHRleHQgVSBcbiI7CisgICAgICAgICAgICAgICAgcHJpbnQgIk1UIGZuYW1lICRmaWxlbmFtZVxuIjsKKyAgICAgICAgICAgICAgICBwcmludCAiTVQgbmV3bGluZVxuIjsKKwkJcHJpbnQgIk1UIC11cGRhdGVkXG4iOworCSAgICB9CisKKyAgICAgICAgICAgIG15ICggJGZpbGVwYXJ0LCAkZGlycGFydCApID0gZmlsZW5hbWVzcGxpdCgkZmlsZW5hbWUsMSk7CisKKwkgICAgIyBEb24ndCB3YW50IHRvIGFjdHVhbGx5IF9ET18gdGhlIHVwZGF0ZSBpZiAtbiBzcGVjaWZpZWQKKwkgICAgdW5sZXNzICggJHN0YXRlLT57Z2xvYmFsb3B0aW9uc317LW59ICkKKwkgICAgeworCQlpZiAoIGRlZmluZWQgKCAkd3JldiApICkKKwkJeworCQkgICAgIyBpbnN0cnVjdCBjbGllbnQgd2UncmUgc2VuZGluZyBhIGZpbGUgdG8gcHV0IGluIHRoaXMgcGF0aCBhcyBhIHJlcGxhY2VtZW50CisJCSAgICBwcmludCAiVXBkYXRlLWV4aXN0aW5nICRkaXJwYXJ0XG4iOworCQkgICAgJGxvZy0+ZGVidWcoIlVwZGF0aW5nIGV4aXN0aW5nIGZpbGUgJ1VwZGF0ZS1leGlzdGluZyAkZGlycGFydCciKTsKKwkJfSBlbHNlIHsKKwkJICAgICMgaW5zdHJ1Y3QgY2xpZW50IHdlJ3JlIHNlbmRpbmcgYSBmaWxlIHRvIHB1dCBpbiB0aGlzIHBhdGggYXMgYSBuZXcgZmlsZQorCQkgICAgcHJpbnQgIkNsZWFyLXN0YXRpYy1kaXJlY3RvcnkgJGRpcnBhcnRcbiI7CisJCSAgICBwcmludCAkc3RhdGUtPntDVlNST09UfSAuICIvJHN0YXRlLT57bW9kdWxlfS8kZGlycGFydFxuIjsKKwkJICAgIHByaW50ICJDbGVhci1zdGlja3kgJGRpcnBhcnRcbiI7CisJCSAgICBwcmludCAkc3RhdGUtPntDVlNST09UfSAuICIvJHN0YXRlLT57bW9kdWxlfS8kZGlycGFydFxuIjsKKworCQkgICAgJGxvZy0+ZGVidWcoIkNyZWF0aW5nIG5ldyBmaWxlICdDcmVhdGVkICRkaXJwYXJ0JyIpOworCQkgICAgcHJpbnQgIkNyZWF0ZWQgJGRpcnBhcnRcbiI7CisJCX0KKwkJcHJpbnQgJHN0YXRlLT57Q1ZTUk9PVH0gLiAiLyRzdGF0ZS0+e21vZHVsZX0vJGZpbGVuYW1lXG4iOworCisJCSMgdGhpcyBpcyBhbiAiZW50cmllcyIgbGluZQorCQlteSAka29wdHMgPSBrb3B0c19mcm9tX3BhdGgoJGZpbGVwYXJ0KTsKKwkJJGxvZy0+ZGVidWcoIi8kZmlsZXBhcnQvMS4kbWV0YS0+e3JldmlzaW9ufS8vJGtvcHRzLyIpOworCQlwcmludCAiLyRmaWxlcGFydC8xLiRtZXRhLT57cmV2aXNpb259Ly8ka29wdHMvXG4iOworCisJCSMgcGVybWlzc2lvbnMKKwkJJGxvZy0+ZGVidWcoIlNFTkQgOiB1PSRtZXRhLT57bW9kZX0sZz0kbWV0YS0+e21vZGV9LG89JG1ldGEtPnttb2RlfSIpOworCQlwcmludCAidT0kbWV0YS0+e21vZGV9LGc9JG1ldGEtPnttb2RlfSxvPSRtZXRhLT57bW9kZX1cbiI7CisKKwkJIyB0cmFuc21pdCBmaWxlCisJCXRyYW5zbWl0ZmlsZSgkbWV0YS0+e2ZpbGVoYXNofSk7CisJICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRsb2ctPmluZm8oIlVwZGF0aW5nICckZmlsZW5hbWUnIik7CisgICAgICAgICAgICBteSAoICRmaWxlcGFydCwgJGRpcnBhcnQgKSA9IGZpbGVuYW1lc3BsaXQoJG1ldGEtPntuYW1lfSwxKTsKKworICAgICAgICAgICAgbXkgJGRpciA9IHRlbXBkaXIoIERJUiA9PiAkVEVNUF9ESVIsIENMRUFOVVAgPT4gMSApIC4gIi8iOworCisgICAgICAgICAgICBjaGRpciAkZGlyOworICAgICAgICAgICAgbXkgJGZpbGVfbG9jYWwgPSAkZmlsZXBhcnQgLiAiLm1pbmUiOworICAgICAgICAgICAgc3lzdGVtKCJsbiIsIi1zIiwkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2ZpbGVuYW1lfSwgJGZpbGVfbG9jYWwpOworICAgICAgICAgICAgbXkgJGZpbGVfb2xkID0gJGZpbGVwYXJ0IC4gIi4iIC4gJG9sZG1ldGEtPntyZXZpc2lvbn07CisgICAgICAgICAgICB0cmFuc21pdGZpbGUoJG9sZG1ldGEtPntmaWxlaGFzaH0sIHsgdGFyZ2V0ZmlsZSA9PiAkZmlsZV9vbGQgfSk7CisgICAgICAgICAgICBteSAkZmlsZV9uZXcgPSAkZmlsZXBhcnQgLiAiLiIgLiAkbWV0YS0+e3JldmlzaW9ufTsKKyAgICAgICAgICAgIHRyYW5zbWl0ZmlsZSgkbWV0YS0+e2ZpbGVoYXNofSwgeyB0YXJnZXRmaWxlID0+ICRmaWxlX25ldyB9KTsKKworICAgICAgICAgICAgIyB3ZSBuZWVkIHRvIG1lcmdlIHdpdGggdGhlIGxvY2FsIGNoYW5nZXMgKCBNPXN1Y2Nlc3NmdWwgbWVyZ2UsIEM9Y29uZmxpY3QgbWVyZ2UgKQorICAgICAgICAgICAgJGxvZy0+aW5mbygiTWVyZ2luZyAkZmlsZV9sb2NhbCwgJGZpbGVfb2xkLCAkZmlsZV9uZXciKTsKKyAgICAgICAgICAgIHByaW50ICJNIE1lcmdpbmcgZGlmZmVyZW5jZXMgYmV0d2VlbiAxLiRvbGRtZXRhLT57cmV2aXNpb259IGFuZCAxLiRtZXRhLT57cmV2aXNpb259IGludG8gJGZpbGVuYW1lXG4iOworCisgICAgICAgICAgICAkbG9nLT5kZWJ1ZygiVGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgbWVyZ2UgaXMgJGRpciIpOworCisgICAgICAgICAgICBteSAkcmV0dXJuID0gc3lzdGVtKCJnaXQiLCAibWVyZ2UtZmlsZSIsICRmaWxlX2xvY2FsLCAkZmlsZV9vbGQsICRmaWxlX25ldyk7CisgICAgICAgICAgICAkcmV0dXJuID4+PSA4OworCisgICAgICAgICAgICBpZiAoICRyZXR1cm4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJGxvZy0+aW5mbygiTWVyZ2VkIHN1Y2Nlc3NmdWxseSIpOworICAgICAgICAgICAgICAgIHByaW50ICJNIE0gJGZpbGVuYW1lXG4iOworICAgICAgICAgICAgICAgICRsb2ctPmRlYnVnKCJNZXJnZWQgJGRpcnBhcnQiKTsKKworICAgICAgICAgICAgICAgICMgRG9uJ3Qgd2FudCB0byBhY3R1YWxseSBfRE9fIHRoZSB1cGRhdGUgaWYgLW4gc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgdW5sZXNzICggJHN0YXRlLT57Z2xvYmFsb3B0aW9uc317LW59ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJNZXJnZWQgJGRpcnBhcnRcbiI7CisgICAgICAgICAgICAgICAgICAgICRsb2ctPmRlYnVnKCRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8kc3RhdGUtPnttb2R1bGV9LyRmaWxlbmFtZSIpOworICAgICAgICAgICAgICAgICAgICBwcmludCAkc3RhdGUtPntDVlNST09UfSAuICIvJHN0YXRlLT57bW9kdWxlfS8kZmlsZW5hbWVcbiI7CisgICAgICAgICAgICAgICAgICAgIG15ICRrb3B0cyA9IGtvcHRzX2Zyb21fcGF0aCgkZmlsZXBhcnQpOworICAgICAgICAgICAgICAgICAgICAkbG9nLT5kZWJ1ZygiLyRmaWxlcGFydC8xLiRtZXRhLT57cmV2aXNpb259Ly8ka29wdHMvIik7CisgICAgICAgICAgICAgICAgICAgIHByaW50ICIvJGZpbGVwYXJ0LzEuJG1ldGEtPntyZXZpc2lvbn0vLyRrb3B0cy9cbiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCAkcmV0dXJuID09IDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRsb2ctPmluZm8oIk1lcmdlZCB3aXRoIGNvbmZsaWN0cyIpOworICAgICAgICAgICAgICAgIHByaW50ICJFIGN2cyB1cGRhdGU6IGNvbmZsaWN0cyBmb3VuZCBpbiAkZmlsZW5hbWVcbiI7CisgICAgICAgICAgICAgICAgcHJpbnQgIk0gQyAkZmlsZW5hbWVcbiI7CisKKyAgICAgICAgICAgICAgICAjIERvbid0IHdhbnQgdG8gYWN0dWFsbHkgX0RPXyB0aGUgdXBkYXRlIGlmIC1uIHNwZWNpZmllZAorICAgICAgICAgICAgICAgIHVubGVzcyAoICRzdGF0ZS0+e2dsb2JhbG9wdGlvbnN9ey1ufSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmludCAiTWVyZ2VkICRkaXJwYXJ0XG4iOworICAgICAgICAgICAgICAgICAgICBwcmludCAkc3RhdGUtPntDVlNST09UfSAuICIvJHN0YXRlLT57bW9kdWxlfS8kZmlsZW5hbWVcbiI7CisgICAgICAgICAgICAgICAgICAgIG15ICRrb3B0cyA9IGtvcHRzX2Zyb21fcGF0aCgkZmlsZXBhcnQpOworICAgICAgICAgICAgICAgICAgICBwcmludCAiLyRmaWxlcGFydC8xLiRtZXRhLT57cmV2aXNpb259LysvJGtvcHRzL1xuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJGxvZy0+d2FybigiTWVyZ2UgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIyBEb24ndCB3YW50IHRvIGFjdHVhbGx5IF9ET18gdGhlIHVwZGF0ZSBpZiAtbiBzcGVjaWZpZWQKKyAgICAgICAgICAgIHVubGVzcyAoICRzdGF0ZS0+e2dsb2JhbG9wdGlvbnN9ey1ufSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIyBwZXJtaXNzaW9ucworICAgICAgICAgICAgICAgICRsb2ctPmRlYnVnKCJTRU5EIDogdT0kbWV0YS0+e21vZGV9LGc9JG1ldGEtPnttb2RlfSxvPSRtZXRhLT57bW9kZX0iKTsKKyAgICAgICAgICAgICAgICBwcmludCAidT0kbWV0YS0+e21vZGV9LGc9JG1ldGEtPnttb2RlfSxvPSRtZXRhLT57bW9kZX1cbiI7CisKKyAgICAgICAgICAgICAgICAjIHRyYW5zbWl0IGZpbGUsIGZvcm1hdCBpcyBzaW5nbGUgaW50ZWdlciBvbiBhIGxpbmUgYnkgaXRzZWxmIChmaWxlCisgICAgICAgICAgICAgICAgIyBzaXplKSBmb2xsb3dlZCBieSB0aGUgZmlsZSBjb250ZW50cworICAgICAgICAgICAgICAgICMgVE9ETyA6IHdlIHNob3VsZCBjb3B5IGZpbGVzIGluIGJsb2NrcworICAgICAgICAgICAgICAgIG15ICRkYXRhID0gYGNhdCAkZmlsZV9sb2NhbGA7CisgICAgICAgICAgICAgICAgJGxvZy0+ZGVidWcoIkZpbGUgc2l6ZSA6ICIgLiBsZW5ndGgoJGRhdGEpKTsKKyAgICAgICAgICAgICAgICBwcmludCBsZW5ndGgoJGRhdGEpIC4gIlxuIjsKKyAgICAgICAgICAgICAgICBwcmludCAkZGF0YTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2hkaXIgIi8iOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcmludCAib2tcbiI7Cit9CisKK3N1YiByZXFfY2kKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgIGFyZ3NwbGl0KCJjaSIpOworCisgICAgIyRsb2ctPmRlYnVnKCJTdGF0ZSA6ICIgLiBEdW1wZXIoJHN0YXRlKSk7CisKKyAgICAkbG9nLT5pbmZvKCJyZXFfY2kgOiAiIC4gKCBkZWZpbmVkKCRkYXRhKSA/ICRkYXRhIDogIltOVUxMXSIgKSk7CisKKyAgICBpZiAoICRzdGF0ZS0+e21ldGhvZH0gZXEgJ3BzZXJ2ZXInKQorICAgIHsKKyAgICAgICAgcHJpbnQgImVycm9yIDEgcHNlcnZlciBhY2Nlc3MgY2Fubm90IGNvbW1pdFxuIjsKKyAgICAgICAgZXhpdDsKKyAgICB9CisKKyAgICBpZiAoIC1lICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi9pbmRleCIgKQorICAgIHsKKyAgICAgICAgJGxvZy0+d2FybigiZmlsZSAnaW5kZXgnIGFscmVhZHkgZXhpc3RzIGluIHRoZSBnaXQgcmVwb3NpdG9yeSIpOworICAgICAgICBwcmludCAiZXJyb3IgMSBJbmRleCBhbHJlYWR5IGV4aXN0cyBpbiBnaXQgcmVwb1xuIjsKKyAgICAgICAgZXhpdDsKKyAgICB9CisKKyAgICAjIEdyYWIgYSBoYW5kbGUgdG8gdGhlIFNRTGl0ZSBkYiBhbmQgZG8gYW55IG5lY2Vzc2FyeSB1cGRhdGVzCisgICAgbXkgJHVwZGF0ZXIgPSBHSVRDVlM6OnVwZGF0ZXItPm5ldygkc3RhdGUtPntDVlNST09UfSwgJHN0YXRlLT57bW9kdWxlfSwgJGxvZyk7CisgICAgJHVwZGF0ZXItPnVwZGF0ZSgpOworCisgICAgbXkgJHRtcGRpciA9IHRlbXBkaXIgKCBESVIgPT4gJFRFTVBfRElSICk7CisgICAgbXkgKCB1bmRlZiwgJGZpbGVfaW5kZXggKSA9IHRlbXBmaWxlICggRElSID0+ICRURU1QX0RJUiwgT1BFTiA9PiAwICk7CisgICAgJGxvZy0+aW5mbygiTG9ja2xlc3MgY29tbWl0IHN0YXJ0LCBiYXNpbmcgY29tbWl0IG9uICckdG1wZGlyJywgaW5kZXggZmlsZSBpcyAnJGZpbGVfaW5kZXgnIik7CisKKyAgICAkRU5We0dJVF9ESVJ9ID0gJHN0YXRlLT57Q1ZTUk9PVH0gLiAiLyI7CisgICAgJEVOVntHSVRfV09SS19UUkVFfSA9ICIuIjsKKyAgICAkRU5We0dJVF9JTkRFWF9GSUxFfSA9ICRmaWxlX2luZGV4OworCisgICAgIyBSZW1lbWJlciB3aGVyZSB0aGUgaGVhZCB3YXMgYXQgdGhlIGJlZ2lubmluZy4KKyAgICBteSAkcGFyZW50aGFzaCA9IGBnaXQgc2hvdy1yZWYgLXMgcmVmcy9oZWFkcy8kc3RhdGUtPnttb2R1bGV9YDsKKyAgICBjaG9tcCAkcGFyZW50aGFzaDsKKyAgICBpZiAoJHBhcmVudGhhc2ggIX4gL15bMC05YS1mXXs0MH0kLykgeworCSAgICBwcmludCAiZXJyb3IgMSBwc2VydmVyIGNhbm5vdCBmaW5kIHRoZSBjdXJyZW50IEhFQUQgb2YgbW9kdWxlIjsKKwkgICAgZXhpdDsKKyAgICB9CisKKyAgICBjaGRpciAkdG1wZGlyOworCisgICAgIyBwb3B1bGF0ZSB0aGUgdGVtcG9yYXJ5IGluZGV4CisgICAgc3lzdGVtKCJnaXQtcmVhZC10cmVlIiwgJHBhcmVudGhhc2gpOworICAgIHVubGVzcyAoJD8gPT0gMCkKKyAgICB7CisJZGllICJFcnJvciBydW5uaW5nIGdpdC1yZWFkLXRyZWUgJHN0YXRlLT57bW9kdWxlfSAkZmlsZV9pbmRleCAkISI7CisgICAgfQorICAgICRsb2ctPmluZm8oIkNyZWF0ZWQgaW5kZXggJyRmaWxlX2luZGV4JyBmb3IgaGVhZCAkc3RhdGUtPnttb2R1bGV9IC0gZXhpdCBzdGF0dXMgJD8iKTsKKworICAgIG15IEBjb21taXR0ZWRmaWxlcyA9ICgpOworICAgIG15ICVvbGRtZXRhOworCisgICAgIyBmb3JlYWNoIGZpbGUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgLi4uCisgICAgZm9yZWFjaCBteSAkZmlsZW5hbWUgKCBAeyRzdGF0ZS0+e2FyZ3N9fSApCisgICAgeworICAgICAgICBteSAkY29tbWl0dGVkZmlsZSA9ICRmaWxlbmFtZTsKKyAgICAgICAgJGZpbGVuYW1lID0gZmlsZWNsZWFudXAoJGZpbGVuYW1lKTsKKworICAgICAgICBuZXh0IHVubGVzcyAoIGV4aXN0cyAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2ZpbGVuYW1lfSBvciBub3QgJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXt1bmNoYW5nZWR9ICk7CisKKyAgICAgICAgbXkgJG1ldGEgPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUpOworCSRvbGRtZXRheyRmaWxlbmFtZX0gPSAkbWV0YTsKKworICAgICAgICBteSAkd3JldiA9IHJldnBhcnNlKCRmaWxlbmFtZSk7CisKKyAgICAgICAgbXkgKCAkZmlsZXBhcnQsICRkaXJwYXJ0ICkgPSBmaWxlbmFtZXNwbGl0KCRmaWxlbmFtZSk7CisKKwkjIGRvIGEgY2hlY2tvdXQgb2YgdGhlIGZpbGUgaWYgaXQgaXMgcGFydCBvZiB0aGlzIHRyZWUKKyAgICAgICAgaWYgKCR3cmV2KSB7CisgICAgICAgICAgICBzeXN0ZW0oJ2dpdC1jaGVja291dC1pbmRleCcsICctZicsICctdScsICRmaWxlbmFtZSk7CisgICAgICAgICAgICB1bmxlc3MgKCQ/ID09IDApIHsKKyAgICAgICAgICAgICAgICBkaWUgIkVycm9yIHJ1bm5pbmcgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC11ICRmaWxlbmFtZSA6ICQhIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG15ICRhZGRmbGFnID0gMDsKKyAgICAgICAgbXkgJHJtZmxhZyA9IDA7CisgICAgICAgICRybWZsYWcgPSAxIGlmICggZGVmaW5lZCgkd3JldikgYW5kICR3cmV2IDwgMCApOworICAgICAgICAkYWRkZmxhZyA9IDEgdW5sZXNzICggLWUgJGZpbGVuYW1lICk7CisKKyAgICAgICAgIyBEbyB1cCB0byBkYXRlIGNoZWNraW5nCisgICAgICAgIHVubGVzcyAoICRhZGRmbGFnIG9yICR3cmV2ID09ICRtZXRhLT57cmV2aXNpb259IG9yICggJHJtZmxhZyBhbmQgLSR3cmV2ID09ICRtZXRhLT57cmV2aXNpb259ICkgKQorICAgICAgICB7CisgICAgICAgICAgICAjIGZhaWwgZXZlcnl0aGluZyBpZiBhbiB1cCB0byBkYXRlIGNoZWNrIGZhaWxzCisgICAgICAgICAgICBwcmludCAiZXJyb3IgMSBVcCB0byBkYXRlIGNoZWNrIGZhaWxlZCBmb3IgJGZpbGVuYW1lXG4iOworICAgICAgICAgICAgY2hkaXIgIi8iOworICAgICAgICAgICAgZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1c2ggQGNvbW1pdHRlZGZpbGVzLCAkY29tbWl0dGVkZmlsZTsKKyAgICAgICAgJGxvZy0+aW5mbygiQ29tbWl0dGluZyAkZmlsZW5hbWUiKTsKKworICAgICAgICBzeXN0ZW0oIm1rZGlyIiwiLXAiLCRkaXJwYXJ0KSB1bmxlc3MgKCAtZCAkZGlycGFydCApOworCisgICAgICAgIHVubGVzcyAoICRybWZsYWcgKQorICAgICAgICB7CisgICAgICAgICAgICAkbG9nLT5kZWJ1ZygicmVuYW1lICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfZmlsZW5hbWV9ICRmaWxlbmFtZSIpOworICAgICAgICAgICAgcmVuYW1lICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfZmlsZW5hbWV9LCRmaWxlbmFtZTsKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgbW9kZXMgdG8gcmVtb3ZlCisgICAgICAgICAgICBteSAkaW52bW9kZSA9ICIiOworICAgICAgICAgICAgZm9yZWFjaCAoIHF3IChyIHcgeCkgKSB7ICRpbnZtb2RlIC49ICRfIHVubGVzcyAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfbW9kZX0gPX4gLyRfLyApOyB9CisKKyAgICAgICAgICAgICRsb2ctPmRlYnVnKCJjaG1vZCB1KyIgLiAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX21vZGV9IC4gIi0iIC4gJGludm1vZGUgLiAiICRmaWxlbmFtZSIpOworICAgICAgICAgICAgc3lzdGVtKCJjaG1vZCIsInUrIiAuICAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX21vZGV9IC4gIi0iIC4gJGludm1vZGUsICRmaWxlbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoICRybWZsYWcgKQorICAgICAgICB7CisgICAgICAgICAgICAkbG9nLT5pbmZvKCJSZW1vdmluZyBmaWxlICckZmlsZW5hbWUnIik7CisgICAgICAgICAgICB1bmxpbmsoJGZpbGVuYW1lKTsKKyAgICAgICAgICAgIHN5c3RlbSgiZ2l0LXVwZGF0ZS1pbmRleCIsICItLXJlbW92ZSIsICRmaWxlbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkYWRkZmxhZyApCisgICAgICAgIHsKKyAgICAgICAgICAgICRsb2ctPmluZm8oIkFkZGluZyBmaWxlICckZmlsZW5hbWUnIik7CisgICAgICAgICAgICBzeXN0ZW0oImdpdC11cGRhdGUtaW5kZXgiLCAiLS1hZGQiLCAkZmlsZW5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGxvZy0+aW5mbygiVXBkYXRpbmcgZmlsZSAnJGZpbGVuYW1lJyIpOworICAgICAgICAgICAgc3lzdGVtKCJnaXQtdXBkYXRlLWluZGV4IiwgJGZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVubGVzcyAoIHNjYWxhcihAY29tbWl0dGVkZmlsZXMpID4gMCApCisgICAgeworICAgICAgICBwcmludCAiRSBObyBmaWxlcyB0byBjb21taXRcbiI7CisgICAgICAgIHByaW50ICJva1xuIjsKKyAgICAgICAgY2hkaXIgIi8iOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbXkgJHRyZWVoYXNoID0gYGdpdC13cml0ZS10cmVlYDsKKyAgICBjaG9tcCAkdHJlZWhhc2g7CisKKyAgICAkbG9nLT5kZWJ1ZygiVHJlZWhhc2ggOiAkdHJlZWhhc2gsIFBhcmVudGhhc2ggOiAkcGFyZW50aGFzaCIpOworCisgICAgIyB3cml0ZSBvdXIgY29tbWl0IG1lc3NhZ2Ugb3V0IGlmIHdlIGhhdmUgb25lIC4uLgorICAgIG15ICggJG1zZ19maCwgJG1zZ19maWxlbmFtZSApID0gdGVtcGZpbGUoIERJUiA9PiAkVEVNUF9ESVIgKTsKKyAgICBwcmludCAkbXNnX2ZoICRzdGF0ZS0+e29wdH17bX07IyBpZiAoIGV4aXN0cyAoICRzdGF0ZS0+e29wdH17bX0gKSApOworICAgIHByaW50ICRtc2dfZmggIlxuXG52aWEgZ2l0LUNWUyBlbXVsYXRvclxuIjsKKyAgICBjbG9zZSAkbXNnX2ZoOworCisgICAgbXkgJGNvbW1pdGhhc2ggPSBgZ2l0LWNvbW1pdC10cmVlICR0cmVlaGFzaCAtcCAkcGFyZW50aGFzaCA8ICRtc2dfZmlsZW5hbWVgOworICAgIGNob21wKCRjb21taXRoYXNoKTsKKyAgICAkbG9nLT5pbmZvKCJDb21taXQgaGFzaCA6ICRjb21taXRoYXNoIik7CisKKyAgICB1bmxlc3MgKCAkY29tbWl0aGFzaCA9fiAvW2EtekEtWjAtOV17NDB9LyApCisgICAgeworICAgICAgICAkbG9nLT53YXJuKCJDb21taXQgZmFpbGVkIChJbnZhbGlkIGNvbW1pdCBoYXNoKSIpOworICAgICAgICBwcmludCAiZXJyb3IgMSBDb21taXQgZmFpbGVkICh1bmtub3duIHJlYXNvbilcbiI7CisgICAgICAgIGNoZGlyICIvIjsKKyAgICAgICAgZXhpdDsKKyAgICB9CisKKwkjIyMgRW11bGF0ZSBnaXQtcmVjZWl2ZS1wYWNrIGJ5IHJ1bm5pbmcgaG9va3MvdXBkYXRlCisJbXkgQGhvb2sgPSAoICRFTlZ7R0lUX0RJUn0uJ2hvb2tzL3VwZGF0ZScsICJyZWZzL2hlYWRzLyRzdGF0ZS0+e21vZHVsZX0iLAorCQkJJHBhcmVudGhhc2gsICRjb21taXRoYXNoICk7CisJaWYoIC14ICRob29rWzBdICkgeworCQl1bmxlc3MoIHN5c3RlbSggQGhvb2sgKSA9PSAwICkKKwkJeworCQkJJGxvZy0+d2FybigiQ29tbWl0IGZhaWxlZCAodXBkYXRlIGhvb2sgZGVjbGluZWQgdG8gdXBkYXRlIHJlZikiKTsKKwkJCXByaW50ICJlcnJvciAxIENvbW1pdCBmYWlsZWQgKHVwZGF0ZSBob29rIGRlY2xpbmVkKVxuIjsKKwkJCWNoZGlyICIvIjsKKwkJCWV4aXQ7CisJCX0KKwl9CisKKwkjIyMgVXBkYXRlIHRoZSByZWYKKwlpZiAoc3lzdGVtKHF3KGdpdCB1cGRhdGUtcmVmIC1tKSwgImN2c3NlcnZlciBjaSIsCisJCQkicmVmcy9oZWFkcy8kc3RhdGUtPnttb2R1bGV9IiwgJGNvbW1pdGhhc2gsICRwYXJlbnRoYXNoKSkgeworCQkkbG9nLT53YXJuKCJ1cGRhdGUtcmVmIGZvciAkc3RhdGUtPnttb2R1bGV9IGZhaWxlZC4iKTsKKwkJcHJpbnQgImVycm9yIDEgQ2Fubm90IGNvbW1pdCAtLSB1cGRhdGUgZmlyc3RcbiI7CisJCWV4aXQ7CisJfQorCisJIyMjIEVtdWxhdGUgZ2l0LXJlY2VpdmUtcGFjayBieSBydW5uaW5nIGhvb2tzL3Bvc3QtcmVjZWl2ZQorCW15ICRob29rID0gJEVOVntHSVRfRElSfS4naG9va3MvcG9zdC1yZWNlaXZlJzsKKwlpZiggLXggJGhvb2sgKSB7CisJCW9wZW4obXkgJHBpcGUsICJ8ICRob29rIikgfHwgZGllICJjYW4ndCBmb3JrICQhIjsKKworCQlsb2NhbCAkU0lHe1BJUEV9ID0gc3ViIHsgZGllICdwaXBlIGJyb2tlJyB9OworCisJCXByaW50ICRwaXBlICIkcGFyZW50aGFzaCAkY29tbWl0aGFzaCByZWZzL2hlYWRzLyRzdGF0ZS0+e21vZHVsZX1cbiI7CisKKwkJY2xvc2UgJHBpcGUgfHwgZGllICJiYWQgcGlwZTogJCEgJD8iOworCX0KKworCSMjIyBUaGVuIGhvb2tzL3Bvc3QtdXBkYXRlCisJJGhvb2sgPSAkRU5We0dJVF9ESVJ9Lidob29rcy9wb3N0LXVwZGF0ZSc7CisJaWYgKC14ICRob29rKSB7CisJCXN5c3RlbSgkaG9vaywgInJlZnMvaGVhZHMvJHN0YXRlLT57bW9kdWxlfSIpOworCX0KKworICAgICR1cGRhdGVyLT51cGRhdGUoKTsKKworICAgICMgZm9yZWFjaCBmaWxlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIC4uLgorICAgIGZvcmVhY2ggbXkgJGZpbGVuYW1lICggQGNvbW1pdHRlZGZpbGVzICkKKyAgICB7CisgICAgICAgICRmaWxlbmFtZSA9IGZpbGVjbGVhbnVwKCRmaWxlbmFtZSk7CisKKyAgICAgICAgbXkgJG1ldGEgPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUpOworCXVubGVzcyAoZGVmaW5lZCAkbWV0YS0+e3JldmlzaW9ufSkgeworCSAgJG1ldGEtPntyZXZpc2lvbn0gPSAxOworCX0KKworICAgICAgICBteSAoICRmaWxlcGFydCwgJGRpcnBhcnQgKSA9IGZpbGVuYW1lc3BsaXQoJGZpbGVuYW1lLCAxKTsKKworICAgICAgICAkbG9nLT5kZWJ1ZygiQ2hlY2tlZC1pbiAkZGlycGFydCA6ICRmaWxlbmFtZSIpOworCisJcHJpbnQgIk0gJHN0YXRlLT57Q1ZTUk9PVH0vJHN0YXRlLT57bW9kdWxlfS8kZmlsZW5hbWUsdiAgPC0tICAkZGlycGFydCRmaWxlcGFydFxuIjsKKyAgICAgICAgaWYgKCBkZWZpbmVkICRtZXRhLT57ZmlsZWhhc2h9ICYmICRtZXRhLT57ZmlsZWhhc2h9IGVxICJkZWxldGVkIiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ICJNIG5ldyByZXZpc2lvbjogZGVsZXRlOyBwcmV2aW91cyByZXZpc2lvbjogMS4kb2xkbWV0YXskZmlsZW5hbWV9e3JldmlzaW9ufVxuIjsKKyAgICAgICAgICAgIHByaW50ICJSZW1vdmUtZW50cnkgJGRpcnBhcnRcbiI7CisgICAgICAgICAgICBwcmludCAiJGZpbGVuYW1lXG4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCRtZXRhLT57cmV2aXNpb259ID09IDEpIHsKKwkgICAgICAgIHByaW50ICJNIGluaXRpYWwgcmV2aXNpb246IDEuMVxuIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisJICAgICAgICBwcmludCAiTSBuZXcgcmV2aXNpb246IDEuJG1ldGEtPntyZXZpc2lvbn07IHByZXZpb3VzIHJldmlzaW9uOiAxLiRvbGRtZXRheyRmaWxlbmFtZX17cmV2aXNpb259XG4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnQgIkNoZWNrZWQtaW4gJGRpcnBhcnRcbiI7CisgICAgICAgICAgICBwcmludCAiJGZpbGVuYW1lXG4iOworICAgICAgICAgICAgbXkgJGtvcHRzID0ga29wdHNfZnJvbV9wYXRoKCRmaWxlcGFydCk7CisgICAgICAgICAgICBwcmludCAiLyRmaWxlcGFydC8xLiRtZXRhLT57cmV2aXNpb259Ly8ka29wdHMvXG4iOworICAgICAgICB9CisgICAgfQorCisgICAgY2hkaXIgIi8iOworICAgIHByaW50ICJva1xuIjsKK30KKworc3ViIHJlcV9zdGF0dXMKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgIGFyZ3NwbGl0KCJzdGF0dXMiKTsKKworICAgICRsb2ctPmluZm8oInJlcV9zdGF0dXMgOiAiIC4gKCBkZWZpbmVkKCRkYXRhKSA/ICRkYXRhIDogIltOVUxMXSIgKSk7CisgICAgIyRsb2ctPmRlYnVnKCJzdGF0dXMgc3RhdGUgOiAiIC4gRHVtcGVyKCRzdGF0ZSkpOworCisgICAgIyBHcmFiIGEgaGFuZGxlIHRvIHRoZSBTUUxpdGUgZGIgYW5kIGRvIGFueSBuZWNlc3NhcnkgdXBkYXRlcworICAgIG15ICR1cGRhdGVyID0gR0lUQ1ZTOjp1cGRhdGVyLT5uZXcoJHN0YXRlLT57Q1ZTUk9PVH0sICRzdGF0ZS0+e21vZHVsZX0sICRsb2cpOworICAgICR1cGRhdGVyLT51cGRhdGUoKTsKKworICAgICMgaWYgbm8gZmlsZXMgd2VyZSBzcGVjaWZpZWQsIHdlIG5lZWQgdG8gd29yayBvdXQgd2hhdCBmaWxlcyB3ZSBzaG91bGQgYmUgcHJvdmlkaW5nIHN0YXR1cyBvbiAuLi4KKyAgICBhcmdzZnJvbWRpcigkdXBkYXRlcik7CisKKyAgICAjIGZvcmVhY2ggZmlsZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSAuLi4KKyAgICBmb3JlYWNoIG15ICRmaWxlbmFtZSAoIEB7JHN0YXRlLT57YXJnc319ICkKKyAgICB7CisgICAgICAgICRmaWxlbmFtZSA9IGZpbGVjbGVhbnVwKCRmaWxlbmFtZSk7CisKKyAgICAgICAgbmV4dCBpZiBleGlzdHMoJHN0YXRlLT57b3B0fXtsfSkgJiYgaW5kZXgoJGZpbGVuYW1lLCAnLycsIGxlbmd0aCgkc3RhdGUtPntwcmVwZW5kZGlyfSkpID49IDA7CisKKyAgICAgICAgbXkgJG1ldGEgPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUpOworICAgICAgICBteSAkb2xkbWV0YSA9ICRtZXRhOworCisgICAgICAgIG15ICR3cmV2ID0gcmV2cGFyc2UoJGZpbGVuYW1lKTsKKworICAgICAgICAjIElmIHRoZSB3b3JraW5nIGNvcHkgaXMgYW4gb2xkIHJldmlzaW9uLCBsZXRzIGdldCB0aGF0IHZlcnNpb24gdG9vIGZvciBjb21wYXJpc29uLgorICAgICAgICBpZiAoIGRlZmluZWQoJHdyZXYpIGFuZCAkd3JldiAhPSAkbWV0YS0+e3JldmlzaW9ufSApCisgICAgICAgIHsKKyAgICAgICAgICAgICRvbGRtZXRhID0gJHVwZGF0ZXItPmdldG1ldGEoJGZpbGVuYW1lLCAkd3Jldik7CisgICAgICAgIH0KKworICAgICAgICAjIFRPRE8gOiBBbGwgcG9zc2libGUgc3RhdHVzZXMgYXJlbid0IHlldCBpbXBsZW1lbnRlZAorICAgICAgICBteSAkc3RhdHVzOworICAgICAgICAjIEZpbGVzIGFyZSB1cCB0byBkYXRlIGlmIHRoZSB3b3JraW5nIGNvcHkgYW5kIHJlcG8gY29weSBoYXZlIHRoZSBzYW1lIHJldmlzaW9uLCBhbmQgdGhlIHdvcmtpbmcgY29weSBpcyB1bm1vZGlmaWVkCisgICAgICAgICRzdGF0dXMgPSAiVXAtdG8tZGF0ZSIgaWYgKCBkZWZpbmVkICggJHdyZXYgKSBhbmQgZGVmaW5lZCgkbWV0YS0+e3JldmlzaW9ufSkgYW5kICR3cmV2ID09ICRtZXRhLT57cmV2aXNpb259CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e3VuY2hhbmdlZH0gYW5kICggbm90IGRlZmluZWQgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e2NvbmZsaWN0fSApIG9yICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17Y29uZmxpY3R9ICF+IC9eXCs9LyApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgKCBkZWZpbmVkKCRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfaGFzaH0pIGFuZCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2hhc2h9IGVxICRtZXRhLT57ZmlsZWhhc2h9ICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICMgTmVlZCBjaGVja291dCBpZiB0aGUgd29ya2luZyBjb3B5IGhhcyBhbiBvbGRlciByZXZpc2lvbiB0aGFuIHRoZSByZXBvIGNvcHksIGFuZCB0aGUgd29ya2luZyBjb3B5IGlzIHVubW9kaWZpZWQKKyAgICAgICAgJHN0YXR1cyB8fD0gIk5lZWRzIENoZWNrb3V0IiBpZiAoIGRlZmluZWQgKCAkd3JldiApIGFuZCBkZWZpbmVkICggJG1ldGEtPntyZXZpc2lvbn0gKSBhbmQgJG1ldGEtPntyZXZpc2lvbn0gPiAkd3JldgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17dW5jaGFuZ2VkfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciAoIGRlZmluZWQoJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9oYXNofSkgYW5kICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfaGFzaH0gZXEgJG9sZG1ldGEtPntmaWxlaGFzaH0gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAjIE5lZWQgY2hlY2tvdXQgaWYgaXQgZXhpc3RzIGluIHRoZSByZXBvIGJ1dCBkb2Vzbid0IGhhdmUgYSB3b3JraW5nIGNvcHkKKyAgICAgICAgJHN0YXR1cyB8fD0gIk5lZWRzIENoZWNrb3V0IiBpZiAoIG5vdCBkZWZpbmVkICggJHdyZXYgKSBhbmQgZGVmaW5lZCAoICRtZXRhLT57cmV2aXNpb259ICkgKTsKKworICAgICAgICAjIExvY2FsbHkgbW9kaWZpZWQgaWYgd29ya2luZyBjb3B5IGFuZCByZXBvIGNvcHkgaGF2ZSB0aGUgc2FtZSByZXZpc2lvbiBidXQgdGhlcmUgYXJlIGxvY2FsIGNoYW5nZXMKKyAgICAgICAgJHN0YXR1cyB8fD0gIkxvY2FsbHkgTW9kaWZpZWQiIGlmICggZGVmaW5lZCAoICR3cmV2ICkgYW5kIGRlZmluZWQoJG1ldGEtPntyZXZpc2lvbn0pIGFuZCAkd3JldiA9PSAkbWV0YS0+e3JldmlzaW9ufSBhbmQgJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9maWxlbmFtZX0gKTsKKworICAgICAgICAjIE5lZWRzIE1lcmdlIGlmIHdvcmtpbmcgY29weSByZXZpc2lvbiBpcyBsZXNzIHRoYW4gcmVwbyBjb3B5IGFuZCB0aGVyZSBhcmUgbG9jYWwgY2hhbmdlcworICAgICAgICAkc3RhdHVzIHx8PSAiTmVlZHMgTWVyZ2UiIGlmICggZGVmaW5lZCAoICR3cmV2ICkgYW5kIGRlZmluZWQgKCAkbWV0YS0+e3JldmlzaW9ufSApIGFuZCAkbWV0YS0+e3JldmlzaW9ufSA+ICR3cmV2IGFuZCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2ZpbGVuYW1lfSApOworCisgICAgICAgICRzdGF0dXMgfHw9ICJMb2NhbGx5IEFkZGVkIiBpZiAoIGRlZmluZWQgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e3JldmlzaW9ufSApIGFuZCBub3QgZGVmaW5lZCAoICRtZXRhLT57cmV2aXNpb259ICkgKTsKKyAgICAgICAgJHN0YXR1cyB8fD0gIkxvY2FsbHkgUmVtb3ZlZCIgaWYgKCBkZWZpbmVkICggJHdyZXYgKSBhbmQgZGVmaW5lZCAoICRtZXRhLT57cmV2aXNpb259ICkgYW5kIC0kd3JldiA9PSAkbWV0YS0+e3JldmlzaW9ufSApOworICAgICAgICAkc3RhdHVzIHx8PSAiVW5yZXNvbHZlZCBDb25mbGljdCIgaWYgKCBkZWZpbmVkICggJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXtjb25mbGljdH0gKSBhbmQgJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXtjb25mbGljdH0gPX4gL15cKz0vICk7CisgICAgICAgICRzdGF0dXMgfHw9ICJGaWxlIGhhZCBjb25mbGljdHMgb24gbWVyZ2UiIGlmICggMCApOworCisgICAgICAgICRzdGF0dXMgfHw9ICJVbmtub3duIjsKKworICAgICAgICBteSAoJGZpbGVwYXJ0KSA9IGZpbGVuYW1lc3BsaXQoJGZpbGVuYW1lKTsKKworICAgICAgICBwcmludCAiTSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOworICAgICAgICBwcmludCAiTSBGaWxlOiAkZmlsZXBhcnRcdFN0YXR1czogJHN0YXR1c1xuIjsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17cmV2aXNpb259KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ICJNIFdvcmtpbmcgcmV2aXNpb246XHQiIC4gJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXtyZXZpc2lvbn0gLiAiXG4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnQgIk0gV29ya2luZyByZXZpc2lvbjpcdE5vIGVudHJ5IGZvciAkZmlsZW5hbWVcbiI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBkZWZpbmVkKCRtZXRhLT57cmV2aXNpb259KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ICJNIFJlcG9zaXRvcnkgcmV2aXNpb246XHQxLiIgLiAkbWV0YS0+e3JldmlzaW9ufSAuICJcdCRzdGF0ZS0+e0NWU1JPT1R9LyRzdGF0ZS0+e21vZHVsZX0vJGZpbGVuYW1lLHZcbiI7CisgICAgICAgICAgICBwcmludCAiTSBTdGlja3kgVGFnOlx0XHQobm9uZSlcbiI7CisgICAgICAgICAgICBwcmludCAiTSBTdGlja3kgRGF0ZTpcdFx0KG5vbmUpXG4iOworICAgICAgICAgICAgcHJpbnQgIk0gU3RpY2t5IE9wdGlvbnM6XHRcdChub25lKVxuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ICJNIFJlcG9zaXRvcnkgcmV2aXNpb246XHRObyByZXZpc2lvbiBjb250cm9sIGZpbGVcbiI7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnQgIk1cbiI7CisgICAgfQorCisgICAgcHJpbnQgIm9rXG4iOworfQorCitzdWIgcmVxX2RpZmYKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgIGFyZ3NwbGl0KCJkaWZmIik7CisKKyAgICAkbG9nLT5kZWJ1ZygicmVxX2RpZmYgOiAiIC4gKCBkZWZpbmVkKCRkYXRhKSA/ICRkYXRhIDogIltOVUxMXSIgKSk7CisgICAgIyRsb2ctPmRlYnVnKCJzdGF0dXMgc3RhdGUgOiAiIC4gRHVtcGVyKCRzdGF0ZSkpOworCisgICAgbXkgKCRyZXZpc2lvbjEsICRyZXZpc2lvbjIpOworICAgIGlmICggZGVmaW5lZCAoICRzdGF0ZS0+e29wdH17cn0gKSBhbmQgcmVmICRzdGF0ZS0+e29wdH17cn0gZXEgIkFSUkFZIiApCisgICAgeworICAgICAgICAkcmV2aXNpb24xID0gJHN0YXRlLT57b3B0fXtyfVswXTsKKyAgICAgICAgJHJldmlzaW9uMiA9ICRzdGF0ZS0+e29wdH17cn1bMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgJHJldmlzaW9uMSA9ICRzdGF0ZS0+e29wdH17cn07CisgICAgfQorCisgICAgJHJldmlzaW9uMSA9fiBzL14xXC4vLyBpZiAoIGRlZmluZWQgKCAkcmV2aXNpb24xICkgKTsKKyAgICAkcmV2aXNpb24yID1+IHMvXjFcLi8vIGlmICggZGVmaW5lZCAoICRyZXZpc2lvbjIgKSApOworCisgICAgJGxvZy0+ZGVidWcoIkRpZmZpbmcgcmV2aXNpb25zICIgLiAoIGRlZmluZWQoJHJldmlzaW9uMSkgPyAkcmV2aXNpb24xIDogIltOVUxMXSIgKSAuICIgYW5kICIgLiAoIGRlZmluZWQoJHJldmlzaW9uMikgPyAkcmV2aXNpb24yIDogIltOVUxMXSIgKSApOworCisgICAgIyBHcmFiIGEgaGFuZGxlIHRvIHRoZSBTUUxpdGUgZGIgYW5kIGRvIGFueSBuZWNlc3NhcnkgdXBkYXRlcworICAgIG15ICR1cGRhdGVyID0gR0lUQ1ZTOjp1cGRhdGVyLT5uZXcoJHN0YXRlLT57Q1ZTUk9PVH0sICRzdGF0ZS0+e21vZHVsZX0sICRsb2cpOworICAgICR1cGRhdGVyLT51cGRhdGUoKTsKKworICAgICMgaWYgbm8gZmlsZXMgd2VyZSBzcGVjaWZpZWQsIHdlIG5lZWQgdG8gd29yayBvdXQgd2hhdCBmaWxlcyB3ZSBzaG91bGQgYmUgcHJvdmlkaW5nIHN0YXR1cyBvbiAuLi4KKyAgICBhcmdzZnJvbWRpcigkdXBkYXRlcik7CisKKyAgICAjIGZvcmVhY2ggZmlsZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSAuLi4KKyAgICBmb3JlYWNoIG15ICRmaWxlbmFtZSAoIEB7JHN0YXRlLT57YXJnc319ICkKKyAgICB7CisgICAgICAgICRmaWxlbmFtZSA9IGZpbGVjbGVhbnVwKCRmaWxlbmFtZSk7CisKKyAgICAgICAgbXkgKCAkZmgsICRmaWxlMSwgJGZpbGUyLCAkbWV0YTEsICRtZXRhMiwgJGZpbGVkaWZmICk7CisKKyAgICAgICAgbXkgJHdyZXYgPSByZXZwYXJzZSgkZmlsZW5hbWUpOworCisgICAgICAgICMgV2UgbmVlZCBfc29tZXRoaW5nXyB0byBkaWZmIGFnYWluc3QKKyAgICAgICAgbmV4dCB1bmxlc3MgKCBkZWZpbmVkICggJHdyZXYgKSApOworCisgICAgICAgICMgaWYgd2UgaGF2ZSBhIC1yIHN3aXRjaCwgdXNlIGl0CisgICAgICAgIGlmICggZGVmaW5lZCAoICRyZXZpc2lvbjEgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgICggdW5kZWYsICRmaWxlMSApID0gdGVtcGZpbGUoIERJUiA9PiAkVEVNUF9ESVIsIE9QRU4gPT4gMCApOworICAgICAgICAgICAgJG1ldGExID0gJHVwZGF0ZXItPmdldG1ldGEoJGZpbGVuYW1lLCAkcmV2aXNpb24xKTsKKyAgICAgICAgICAgIHVubGVzcyAoIGRlZmluZWQgKCAkbWV0YTEgKSBhbmQgJG1ldGExLT57ZmlsZWhhc2h9IG5lICJkZWxldGVkIiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnQgIkUgRmlsZSAkZmlsZW5hbWUgYXQgcmV2aXNpb24gMS4kcmV2aXNpb24xIGRvZXNuJ3QgZXhpc3RcbiI7CisgICAgICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyYW5zbWl0ZmlsZSgkbWV0YTEtPntmaWxlaGFzaH0sIHsgdGFyZ2V0ZmlsZSA9PiAkZmlsZTEgfSk7CisgICAgICAgIH0KKyAgICAgICAgIyBvdGhlcndpc2Ugd2UganVzdCB1c2UgdGhlIHdvcmtpbmcgY29weSByZXZpc2lvbgorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICggdW5kZWYsICRmaWxlMSApID0gdGVtcGZpbGUoIERJUiA9PiAkVEVNUF9ESVIsIE9QRU4gPT4gMCApOworICAgICAgICAgICAgJG1ldGExID0gJHVwZGF0ZXItPmdldG1ldGEoJGZpbGVuYW1lLCAkd3Jldik7CisgICAgICAgICAgICB0cmFuc21pdGZpbGUoJG1ldGExLT57ZmlsZWhhc2h9LCB7IHRhcmdldGZpbGUgPT4gJGZpbGUxIH0pOworICAgICAgICB9CisKKyAgICAgICAgIyBpZiB3ZSBoYXZlIGEgc2Vjb25kIC1yIHN3aXRjaCwgdXNlIGl0IHRvbworICAgICAgICBpZiAoIGRlZmluZWQgKCAkcmV2aXNpb24yICkgKQorICAgICAgICB7CisgICAgICAgICAgICAoIHVuZGVmLCAkZmlsZTIgKSA9IHRlbXBmaWxlKCBESVIgPT4gJFRFTVBfRElSLCBPUEVOID0+IDAgKTsKKyAgICAgICAgICAgICRtZXRhMiA9ICR1cGRhdGVyLT5nZXRtZXRhKCRmaWxlbmFtZSwgJHJldmlzaW9uMik7CisKKyAgICAgICAgICAgIHVubGVzcyAoIGRlZmluZWQgKCAkbWV0YTIgKSBhbmQgJG1ldGEyLT57ZmlsZWhhc2h9IG5lICJkZWxldGVkIiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnQgIkUgRmlsZSAkZmlsZW5hbWUgYXQgcmV2aXNpb24gMS4kcmV2aXNpb24yIGRvZXNuJ3QgZXhpc3RcbiI7CisgICAgICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJhbnNtaXRmaWxlKCRtZXRhMi0+e2ZpbGVoYXNofSwgeyB0YXJnZXRmaWxlID0+ICRmaWxlMiB9KTsKKyAgICAgICAgfQorICAgICAgICAjIG90aGVyd2lzZSB3ZSBqdXN0IHVzZSB0aGUgd29ya2luZyBjb3B5CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgJGZpbGUyID0gJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9maWxlbmFtZX07CisgICAgICAgIH0KKworICAgICAgICAjIGlmIHdlIGhhdmUgYmVlbiBnaXZlbiAtciwgYW5kIHdlIGRvbid0IGhhdmUgYSAkZmlsZTIgeWV0LCBsZXRzIGdldCBvbmUKKyAgICAgICAgaWYgKCBkZWZpbmVkICggJHJldmlzaW9uMSApIGFuZCBub3QgZGVmaW5lZCAoICRmaWxlMiApICkKKyAgICAgICAgeworICAgICAgICAgICAgKCB1bmRlZiwgJGZpbGUyICkgPSB0ZW1wZmlsZSggRElSID0+ICRURU1QX0RJUiwgT1BFTiA9PiAwICk7CisgICAgICAgICAgICAkbWV0YTIgPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUsICR3cmV2KTsKKyAgICAgICAgICAgIHRyYW5zbWl0ZmlsZSgkbWV0YTItPntmaWxlaGFzaH0sIHsgdGFyZ2V0ZmlsZSA9PiAkZmlsZTIgfSk7CisgICAgICAgIH0KKworICAgICAgICAjIFdlIG5lZWQgdG8gaGF2ZSByZXRyaWV2ZWQgc29tZXRoaW5nIHVzZWZ1bAorICAgICAgICBuZXh0IHVubGVzcyAoIGRlZmluZWQgKCAkbWV0YTEgKSApOworCisgICAgICAgICMgRmlsZXMgdG8gZGF0ZSBpZiB0aGUgd29ya2luZyBjb3B5IGFuZCByZXBvIGNvcHkgaGF2ZSB0aGUgc2FtZSByZXZpc2lvbiwgYW5kIHRoZSB3b3JraW5nIGNvcHkgaXMgdW5tb2RpZmllZAorICAgICAgICBuZXh0IGlmICggbm90IGRlZmluZWQgKCAkbWV0YTIgKSBhbmQgJHdyZXYgPT0gJG1ldGExLT57cmV2aXNpb259CisgICAgICAgICAgICAgICAgICBhbmQKKyAgICAgICAgICAgICAgICAgICAoICggJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXt1bmNoYW5nZWR9IGFuZCAoIG5vdCBkZWZpbmVkICggJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXtjb25mbGljdH0gKSBvciAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e2NvbmZsaWN0fSAhfiAvXlwrPS8gKSApCisgICAgICAgICAgICAgICAgICAgICBvciAoIGRlZmluZWQoJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9oYXNofSkgYW5kICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfaGFzaH0gZXEgJG1ldGExLT57ZmlsZWhhc2h9ICkgKQorICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAjIEFwcGFyZW50bHkgd2Ugb25seSBzaG93IGRpZmZzIGZvciBsb2NhbGx5IG1vZGlmaWVkIGZpbGVzCisgICAgICAgIG5leHQgdW5sZXNzICggZGVmaW5lZCgkbWV0YTIpIG9yIGRlZmluZWQgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2ZpbGVuYW1lfSApICk7CisKKyAgICAgICAgcHJpbnQgIk0gSW5kZXg6ICRmaWxlbmFtZVxuIjsKKyAgICAgICAgcHJpbnQgIk0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKKyAgICAgICAgcHJpbnQgIk0gUkNTIGZpbGU6ICRzdGF0ZS0+e0NWU1JPT1R9LyRzdGF0ZS0+e21vZHVsZX0vJGZpbGVuYW1lLHZcbiI7CisgICAgICAgIHByaW50ICJNIHJldHJpZXZpbmcgcmV2aXNpb24gMS4kbWV0YTEtPntyZXZpc2lvbn1cbiIgaWYgKCBkZWZpbmVkICggJG1ldGExICkgKTsKKyAgICAgICAgcHJpbnQgIk0gcmV0cmlldmluZyByZXZpc2lvbiAxLiRtZXRhMi0+e3JldmlzaW9ufVxuIiBpZiAoIGRlZmluZWQgKCAkbWV0YTIgKSApOworICAgICAgICBwcmludCAiTSBkaWZmICI7CisgICAgICAgIGZvcmVhY2ggbXkgJG9wdCAoIGtleXMgJXskc3RhdGUtPntvcHR9fSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcmVmICRzdGF0ZS0+e29wdH17JG9wdH0gZXEgIkFSUkFZIiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkdmFsdWUgKCBAeyRzdGF0ZS0+e29wdH17JG9wdH19ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ICItJG9wdCAkdmFsdWUgIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ICItJG9wdCAiOworICAgICAgICAgICAgICAgIHByaW50ICIkc3RhdGUtPntvcHR9eyRvcHR9ICIgaWYgKCBkZWZpbmVkICggJHN0YXRlLT57b3B0fXskb3B0fSApICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnQgIiRmaWxlbmFtZVxuIjsKKworICAgICAgICAkbG9nLT5pbmZvKCJEaWZmaW5nICRmaWxlbmFtZSAtciAkbWV0YTEtPntyZXZpc2lvbn0gLXIgIiAuICggJG1ldGEyLT57cmV2aXNpb259IG9yICJ3b3JraW5nY29weSIgKSk7CisKKyAgICAgICAgKCAkZmgsICRmaWxlZGlmZiApID0gdGVtcGZpbGUgKCBESVIgPT4gJFRFTVBfRElSICk7CisKKyAgICAgICAgaWYgKCBleGlzdHMgJHN0YXRlLT57b3B0fXt1fSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN5c3RlbSgiZGlmZiAtdSAtTCAnJGZpbGVuYW1lIHJldmlzaW9uIDEuJG1ldGExLT57cmV2aXNpb259JyAtTCAnJGZpbGVuYW1lICIgLiAoIGRlZmluZWQoJG1ldGEyLT57cmV2aXNpb259KSA/ICJyZXZpc2lvbiAxLiRtZXRhMi0+e3JldmlzaW9ufSIgOiAid29ya2luZyBjb3B5IiApIC4gIicgJGZpbGUxICRmaWxlMiA+ICRmaWxlZGlmZiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3lzdGVtKCJkaWZmICRmaWxlMSAkZmlsZTIgPiAkZmlsZWRpZmYiKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICggPCRmaD4gKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludCAiTSAkXyI7CisgICAgICAgIH0KKyAgICAgICAgY2xvc2UgJGZoOworICAgIH0KKworICAgIHByaW50ICJva1xuIjsKK30KKworc3ViIHJlcV9sb2cKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgIGFyZ3NwbGl0KCJsb2ciKTsKKworICAgICRsb2ctPmRlYnVnKCJyZXFfbG9nIDogIiAuICggZGVmaW5lZCgkZGF0YSkgPyAkZGF0YSA6ICJbTlVMTF0iICkpOworICAgICMkbG9nLT5kZWJ1ZygibG9nIHN0YXRlIDogIiAuIER1bXBlcigkc3RhdGUpKTsKKworICAgIG15ICggJG1pbnJldiwgJG1heHJldiApOworICAgIGlmICggZGVmaW5lZCAoICRzdGF0ZS0+e29wdH17cn0gKSBhbmQgJHN0YXRlLT57b3B0fXtyfSA9fiAvKFtcZC5dKyk/KDo6PykoW1xkLl0rKT8vICkKKyAgICB7CisgICAgICAgIG15ICRjb250cm9sID0gJDI7CisgICAgICAgICRtaW5yZXYgPSAkMTsKKyAgICAgICAgJG1heHJldiA9ICQzOworICAgICAgICAkbWlucmV2ID1+IHMvXjFcLi8vIGlmICggZGVmaW5lZCAoICRtaW5yZXYgKSApOworICAgICAgICAkbWF4cmV2ID1+IHMvXjFcLi8vIGlmICggZGVmaW5lZCAoICRtYXhyZXYgKSApOworICAgICAgICAkbWlucmV2KysgaWYgKCBkZWZpbmVkKCRtaW5yZXYpIGFuZCAkY29udHJvbCBlcSAiOjoiICk7CisgICAgfQorCisgICAgIyBHcmFiIGEgaGFuZGxlIHRvIHRoZSBTUUxpdGUgZGIgYW5kIGRvIGFueSBuZWNlc3NhcnkgdXBkYXRlcworICAgIG15ICR1cGRhdGVyID0gR0lUQ1ZTOjp1cGRhdGVyLT5uZXcoJHN0YXRlLT57Q1ZTUk9PVH0sICRzdGF0ZS0+e21vZHVsZX0sICRsb2cpOworICAgICR1cGRhdGVyLT51cGRhdGUoKTsKKworICAgICMgaWYgbm8gZmlsZXMgd2VyZSBzcGVjaWZpZWQsIHdlIG5lZWQgdG8gd29yayBvdXQgd2hhdCBmaWxlcyB3ZSBzaG91bGQgYmUgcHJvdmlkaW5nIHN0YXR1cyBvbiAuLi4KKyAgICBhcmdzZnJvbWRpcigkdXBkYXRlcik7CisKKyAgICAjIGZvcmVhY2ggZmlsZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSAuLi4KKyAgICBmb3JlYWNoIG15ICRmaWxlbmFtZSAoIEB7JHN0YXRlLT57YXJnc319ICkKKyAgICB7CisgICAgICAgICRmaWxlbmFtZSA9IGZpbGVjbGVhbnVwKCRmaWxlbmFtZSk7CisKKyAgICAgICAgbXkgJGhlYWRtZXRhID0gJHVwZGF0ZXItPmdldG1ldGEoJGZpbGVuYW1lKTsKKworICAgICAgICBteSAkcmV2aXNpb25zID0gJHVwZGF0ZXItPmdldGxvZygkZmlsZW5hbWUpOworICAgICAgICBteSAkdG90YWxyZXZpc2lvbnMgPSBzY2FsYXIoQCRyZXZpc2lvbnMpOworCisgICAgICAgIGlmICggZGVmaW5lZCAoICRtaW5yZXYgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgICRsb2ctPmRlYnVnKCJSZW1vdmluZyByZXZpc2lvbnMgbGVzcyB0aGFuICRtaW5yZXYiKTsKKyAgICAgICAgICAgIHdoaWxlICggc2NhbGFyKEAkcmV2aXNpb25zKSA+IDAgYW5kICRyZXZpc2lvbnMtPlstMV17cmV2aXNpb259IDwgJG1pbnJldiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG9wIEAkcmV2aXNpb25zOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICggZGVmaW5lZCAoICRtYXhyZXYgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgICRsb2ctPmRlYnVnKCJSZW1vdmluZyByZXZpc2lvbnMgZ3JlYXRlciB0aGFuICRtYXhyZXYiKTsKKyAgICAgICAgICAgIHdoaWxlICggc2NhbGFyKEAkcmV2aXNpb25zKSA+IDAgYW5kICRyZXZpc2lvbnMtPlswXXtyZXZpc2lvbn0gPiAkbWF4cmV2ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaGlmdCBAJHJldmlzaW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG5leHQgdW5sZXNzICggc2NhbGFyKEAkcmV2aXNpb25zKSApOworCisgICAgICAgIHByaW50ICJNIFxuIjsKKyAgICAgICAgcHJpbnQgIk0gUkNTIGZpbGU6ICRzdGF0ZS0+e0NWU1JPT1R9LyRzdGF0ZS0+e21vZHVsZX0vJGZpbGVuYW1lLHZcbiI7CisgICAgICAgIHByaW50ICJNIFdvcmtpbmcgZmlsZTogJGZpbGVuYW1lXG4iOworICAgICAgICBwcmludCAiTSBoZWFkOiAxLiRoZWFkbWV0YS0+e3JldmlzaW9ufVxuIjsKKyAgICAgICAgcHJpbnQgIk0gYnJhbmNoOlxuIjsKKyAgICAgICAgcHJpbnQgIk0gbG9ja3M6IHN0cmljdFxuIjsKKyAgICAgICAgcHJpbnQgIk0gYWNjZXNzIGxpc3Q6XG4iOworICAgICAgICBwcmludCAiTSBzeW1ib2xpYyBuYW1lczpcbiI7CisgICAgICAgIHByaW50ICJNIGtleXdvcmQgc3Vic3RpdHV0aW9uOiBrdlxuIjsKKyAgICAgICAgcHJpbnQgIk0gdG90YWwgcmV2aXNpb25zOiAkdG90YWxyZXZpc2lvbnM7XHRzZWxlY3RlZCByZXZpc2lvbnM6ICIgLiBzY2FsYXIoQCRyZXZpc2lvbnMpIC4gIlxuIjsKKyAgICAgICAgcHJpbnQgIk0gZGVzY3JpcHRpb246XG4iOworCisgICAgICAgIGZvcmVhY2ggbXkgJHJldmlzaW9uICggQCRyZXZpc2lvbnMgKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludCAiTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworICAgICAgICAgICAgcHJpbnQgIk0gcmV2aXNpb24gMS4kcmV2aXNpb24tPntyZXZpc2lvbn1cbiI7CisgICAgICAgICAgICAjIHJlZm9ybWF0IHRoZSBkYXRlIGZvciBsb2cgb3V0cHV0CisgICAgICAgICAgICAkcmV2aXNpb24tPnttb2RpZmllZH0gPSBzcHJpbnRmKCclMDRkLyUwMmQvJTAyZCAlcycsICQzLCAkREFURV9MSVNULT57JDJ9LCAkMSwgJDQgKSBpZiAoICRyZXZpc2lvbi0+e21vZGlmaWVkfSA9fiAvKFxkKylccysoXHcrKVxzKyhcZCspXHMrKFxTKykvIGFuZCBkZWZpbmVkKCREQVRFX0xJU1QtPnskMn0pICk7CisgICAgICAgICAgICAkcmV2aXNpb24tPnthdXRob3J9ID0gY3ZzX2F1dGhvcigkcmV2aXNpb24tPnthdXRob3J9KTsKKyAgICAgICAgICAgIHByaW50ICJNIGRhdGU6ICRyZXZpc2lvbi0+e21vZGlmaWVkfTsgIGF1dGhvcjogJHJldmlzaW9uLT57YXV0aG9yfTsgIHN0YXRlOiAiIC4gKCAkcmV2aXNpb24tPntmaWxlaGFzaH0gZXEgImRlbGV0ZWQiID8gImRlYWQiIDogIkV4cCIgKSAuICI7ICBsaW5lczogKzIgLTNcbiI7CisgICAgICAgICAgICBteSAkY29tbWl0bWVzc2FnZSA9ICR1cGRhdGVyLT5jb21taXRtZXNzYWdlKCRyZXZpc2lvbi0+e2NvbW1pdGhhc2h9KTsKKyAgICAgICAgICAgICRjb21taXRtZXNzYWdlID1+IHMvXi9NIC9tZzsKKyAgICAgICAgICAgIHByaW50ICRjb21taXRtZXNzYWdlIC4gIlxuIjsKKyAgICAgICAgfQorICAgICAgICBwcmludCAiTSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKKyAgICB9CisKKyAgICBwcmludCAib2tcbiI7Cit9CisKK3N1YiByZXFfYW5ub3RhdGUKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgIGFyZ3NwbGl0KCJhbm5vdGF0ZSIpOworCisgICAgJGxvZy0+aW5mbygicmVxX2Fubm90YXRlIDogIiAuICggZGVmaW5lZCgkZGF0YSkgPyAkZGF0YSA6ICJbTlVMTF0iICkpOworICAgICMkbG9nLT5kZWJ1Zygic3RhdHVzIHN0YXRlIDogIiAuIER1bXBlcigkc3RhdGUpKTsKKworICAgICMgR3JhYiBhIGhhbmRsZSB0byB0aGUgU1FMaXRlIGRiIGFuZCBkbyBhbnkgbmVjZXNzYXJ5IHVwZGF0ZXMKKyAgICBteSAkdXBkYXRlciA9IEdJVENWUzo6dXBkYXRlci0+bmV3KCRzdGF0ZS0+e0NWU1JPT1R9LCAkc3RhdGUtPnttb2R1bGV9LCAkbG9nKTsKKyAgICAkdXBkYXRlci0+dXBkYXRlKCk7CisKKyAgICAjIGlmIG5vIGZpbGVzIHdlcmUgc3BlY2lmaWVkLCB3ZSBuZWVkIHRvIHdvcmsgb3V0IHdoYXQgZmlsZXMgd2Ugc2hvdWxkIGJlIHByb3ZpZGluZyBhbm5vdGF0ZSBvbiAuLi4KKyAgICBhcmdzZnJvbWRpcigkdXBkYXRlcik7CisKKyAgICAjIHdlJ2xsIG5lZWQgYSB0ZW1wb3JhcnkgY2hlY2tvdXQgZGlyCisgICAgbXkgJHRtcGRpciA9IHRlbXBkaXIgKCBESVIgPT4gJFRFTVBfRElSICk7CisgICAgbXkgKCB1bmRlZiwgJGZpbGVfaW5kZXggKSA9IHRlbXBmaWxlICggRElSID0+ICRURU1QX0RJUiwgT1BFTiA9PiAwICk7CisgICAgJGxvZy0+aW5mbygiVGVtcCBjaGVja291dGRpciBjcmVhdGlvbiBzdWNjZXNzZnVsLCBiYXNpbmcgYW5ub3RhdGUgc2Vzc2lvbiB3b3JrIG9uICckdG1wZGlyJywgaW5kZXggZmlsZSBpcyAnJGZpbGVfaW5kZXgnIik7CisKKyAgICAkRU5We0dJVF9ESVJ9ID0gJHN0YXRlLT57Q1ZTUk9PVH0gLiAiLyI7CisgICAgJEVOVntHSVRfV09SS19UUkVFfSA9ICIuIjsKKyAgICAkRU5We0dJVF9JTkRFWF9GSUxFfSA9ICRmaWxlX2luZGV4OworCisgICAgY2hkaXIgJHRtcGRpcjsKKworICAgICMgZm9yZWFjaCBmaWxlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIC4uLgorICAgIGZvcmVhY2ggbXkgJGZpbGVuYW1lICggQHskc3RhdGUtPnthcmdzfX0gKQorICAgIHsKKyAgICAgICAgJGZpbGVuYW1lID0gZmlsZWNsZWFudXAoJGZpbGVuYW1lKTsKKworICAgICAgICBteSAkbWV0YSA9ICR1cGRhdGVyLT5nZXRtZXRhKCRmaWxlbmFtZSk7CisKKyAgICAgICAgbmV4dCB1bmxlc3MgKCAkbWV0YS0+e3JldmlzaW9ufSApOworCisJIyBnZXQgYWxsIHRoZSBjb21taXRzIHRoYXQgdGhpcyBmaWxlIHdhcyBpbgorCSMgaW4gZGVuc2UgZm9ybWF0IC0tIGFrYSBza2lwIGRlYWQgcmV2aXNpb25zCisgICAgICAgIG15ICRyZXZpc2lvbnMgICA9ICR1cGRhdGVyLT5nZXRoaXN0b3J5ZGVuc2UoJGZpbGVuYW1lKTsKKwlteSAkbGFzdHNlZW5pbiAgPSAkcmV2aXNpb25zLT5bMF1bMl07CisKKwkjIHBvcHVsYXRlIHRoZSB0ZW1wb3JhcnkgaW5kZXggYmFzZWQgb24gdGhlIGxhdGVzdCBjb21taXQgd2VyZSB3ZSBzYXcKKwkjIHRoZSBmaWxlIC0tIGJ1dCBkbyBpdCBjaGVhcGx5IHdpdGhvdXQgY2hlY2tpbmcgb3V0IGFueSBmaWxlcworCSMgVE9ETzogaWYgd2UgZ290IGEgcmV2aXNpb24gZnJvbSB0aGUgY2xpZW50LCB1c2UgdGhhdCBpbnN0ZWFkCisJIyB0byBsb29rIHVwIHRoZSBjb21taXRoYXNoIGluIHNxbGl0ZSAoc3RpbGwgZ29vZCB0byBkZWZhdWx0IHRvCisJIyB0aGUgY3VycmVudCBoZWFkIGFzIHdlIGRvIG5vdykKKwlzeXN0ZW0oImdpdC1yZWFkLXRyZWUiLCAkbGFzdHNlZW5pbik7CisJdW5sZXNzICgkPyA9PSAwKQorCXsKKwkgICAgcHJpbnQgIkUgZXJyb3IgcnVubmluZyBnaXQtcmVhZC10cmVlICRsYXN0c2VlbmluICRmaWxlX2luZGV4ICQhXG4iOworCSAgICByZXR1cm47CisJfQorCSRsb2ctPmluZm8oIkNyZWF0ZWQgaW5kZXggJyRmaWxlX2luZGV4JyB3aXRoIGNvbW1pdCAkbGFzdHNlZW5pbiAtIGV4aXQgc3RhdHVzICQ/Iik7CisKKyAgICAgICAgIyBkbyBhIGNoZWNrb3V0IG9mIHRoZSBmaWxlCisgICAgICAgIHN5c3RlbSgnZ2l0LWNoZWNrb3V0LWluZGV4JywgJy1mJywgJy11JywgJGZpbGVuYW1lKTsKKyAgICAgICAgdW5sZXNzICgkPyA9PSAwKSB7CisgICAgICAgICAgICBwcmludCAiRSBlcnJvciBydW5uaW5nIGdpdC1jaGVja291dC1pbmRleCAtZiAtdSAkZmlsZW5hbWUgOiAkIVxuIjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgICRsb2ctPmluZm8oIkFubm90YXRlICRmaWxlbmFtZSIpOworCisgICAgICAgICMgUHJlcGFyZSBhIGZpbGUgd2l0aCB0aGUgY29tbWl0cyBmcm9tIHRoZSBsaW5lYXJpemVkCisgICAgICAgICMgaGlzdG9yeSB0aGF0IGFubm90YXRlIHNob3VsZCBrbm93IGFib3V0LiBUaGlzIHByZXZlbnRzCisgICAgICAgICMgZ2l0LWpzYW5ub3RhdGUgdGVsbGluZyB1cyBhYm91dCBjb21taXRzIHdlIGFyZSBoaWRpbmcKKyAgICAgICAgIyBmcm9tIHRoZSBjbGllbnQuCisKKyAgICAgICAgbXkgJGFfaGludHMgPSAiJHRtcGRpci8uYW5ub3RhdGVfaGludHMiOworICAgICAgICBpZiAoIW9wZW4oQU5OT1RBVEVISU5UUywgJz4nLCAkYV9oaW50cykpIHsKKyAgICAgICAgICAgIHByaW50ICJFIGZhaWxlZCB0byBvcGVuICckYV9oaW50cycgZm9yIHdyaXRpbmc6ICQhXG4iOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvciAobXkgJGk9MDsgJGkgPCBAJHJldmlzaW9uczsgJGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnQgQU5OT1RBVEVISU5UUyAkcmV2aXNpb25zLT5bJGldWzJdOworICAgICAgICAgICAgaWYgKCRpKzEgPCBAJHJldmlzaW9ucykgeyAjIGhhdmUgd2UgZ290IGEgcGFyZW50PworICAgICAgICAgICAgICAgIHByaW50IEFOTk9UQVRFSElOVFMgJyAnIC4gJHJldmlzaW9ucy0+WyRpKzFdWzJdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnQgQU5OT1RBVEVISU5UUyAiXG4iOworICAgICAgICB9CisKKyAgICAgICAgcHJpbnQgQU5OT1RBVEVISU5UUyAiXG4iOworICAgICAgICBjbG9zZSBBTk5PVEFURUhJTlRTCisgICAgICAgICAgICBvciAocHJpbnQgIkUgZmFpbGVkIHRvIHdyaXRlICRhX2hpbnRzOiAkIVxuIiksIHJldHVybjsKKworICAgICAgICBteSBAY21kID0gKHF3KGdpdC1hbm5vdGF0ZSAtbCAtUyksICRhX2hpbnRzLCAkZmlsZW5hbWUpOworICAgICAgICBpZiAoIW9wZW4oQU5OT1RBVEUsICItfCIsIEBjbWQpKSB7CisgICAgICAgICAgICBwcmludCAiRSBlcnJvciBpbnZva2luZyAiLiBqb2luKCcgJyxAY21kKSAuIjogJCFcbiI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbXkgJG1ldGFkYXRhID0ge307CisgICAgICAgIHByaW50ICJFIEFubm90YXRpb25zIGZvciAkZmlsZW5hbWVcbiI7CisgICAgICAgIHByaW50ICJFICoqKioqKioqKioqKioqKlxuIjsKKyAgICAgICAgd2hpbGUgKCA8QU5OT1RBVEU+ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG0vXihbYS16QS1aMC05XXs0MH0pXHRcKFteXCldKlwpKC4qKSQvaSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBteSAkY29tbWl0aGFzaCA9ICQxOworICAgICAgICAgICAgICAgIG15ICRkYXRhID0gJDI7CisgICAgICAgICAgICAgICAgdW5sZXNzICggZGVmaW5lZCAoICRtZXRhZGF0YS0+eyRjb21taXRoYXNofSApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICRtZXRhZGF0YS0+eyRjb21taXRoYXNofSA9ICR1cGRhdGVyLT5nZXRtZXRhKCRmaWxlbmFtZSwgJGNvbW1pdGhhc2gpOworICAgICAgICAgICAgICAgICAgICAkbWV0YWRhdGEtPnskY29tbWl0aGFzaH17YXV0aG9yfSA9IGN2c19hdXRob3IoJG1ldGFkYXRhLT57JGNvbW1pdGhhc2h9e2F1dGhvcn0pOworICAgICAgICAgICAgICAgICAgICAkbWV0YWRhdGEtPnskY29tbWl0aGFzaH17bW9kaWZpZWR9ID0gc3ByaW50ZigiJTAyZC0lcy0lMDJkIiwgJDEsICQyLCAkMykgaWYgKCAkbWV0YWRhdGEtPnskY29tbWl0aGFzaH17bW9kaWZpZWR9ID1+IC9eKFxkKylccyhcdyspXHNcZFxkKFxkXGQpLyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludGYoIk0gMS4lLTVkICAgICAgKCUtOHMgJTEwcyk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAkbWV0YWRhdGEtPnskY29tbWl0aGFzaH17cmV2aXNpb259LAorICAgICAgICAgICAgICAgICAgICAkbWV0YWRhdGEtPnskY29tbWl0aGFzaH17YXV0aG9yfSwKKyAgICAgICAgICAgICAgICAgICAgJG1ldGFkYXRhLT57JGNvbW1pdGhhc2h9e21vZGlmaWVkfSwKKyAgICAgICAgICAgICAgICAgICAgJGRhdGEKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkbG9nLT53YXJuKCJFcnJvciBpbiBhbm5vdGF0ZSBvdXRwdXQhIExJTkU6ICRfIik7CisgICAgICAgICAgICAgICAgcHJpbnQgIkUgQW5ub3RhdGUgZXJyb3IgXG4iOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2xvc2UgQU5OT1RBVEU7CisgICAgfQorCisgICAgIyBkb25lOyBnZXQgb3V0IG9mIHRoZSB0ZW1wZGlyCisgICAgY2hkaXIgIi8iOworCisgICAgcHJpbnQgIm9rXG4iOworCit9CisKKyMgVGhpcyBtZXRob2QgdGFrZXMgdGhlIHN0YXRlLT57YXJndW1lbnRzfSBhcnJheSBhbmQgcHJvZHVjZXMgdHdvIG5ldyBhcnJheXMuCisjIFRoZSBmaXJzdCBpcyAkc3RhdGUtPnthcmdzfSB3aGljaCBpcyBldmVyeXRoaW5nIGJlZm9yZSB0aGUgJy0tJyBhcmd1bWVudCwgYW5kCisjIHRoZSBzZWNvbmQgaXMgJHN0YXRlLT57ZmlsZXN9IHdoaWNoIGlzIGV2ZXJ5dGhpbmcgYWZ0ZXIgaXQuCitzdWIgYXJnc3BsaXQKK3sKKyAgICAkc3RhdGUtPnthcmdzfSA9IFtdOworICAgICRzdGF0ZS0+e2ZpbGVzfSA9IFtdOworICAgICRzdGF0ZS0+e29wdH0gPSB7fTsKKworICAgIHJldHVybiB1bmxlc3MoIGRlZmluZWQoJHN0YXRlLT57YXJndW1lbnRzfSkgYW5kIHJlZiAkc3RhdGUtPnthcmd1bWVudHN9IGVxICJBUlJBWSIgKTsKKworICAgIG15ICR0eXBlID0gc2hpZnQ7CisKKyAgICBpZiAoIGRlZmluZWQoJHR5cGUpICkKKyAgICB7CisgICAgICAgIG15ICRvcHQgPSB7fTsKKyAgICAgICAgJG9wdCA9IHsgQSA9PiAwLCBOID0+IDAsIFAgPT4gMCwgUiA9PiAwLCBjID0+IDAsIGYgPT4gMCwgbCA9PiAwLCBuID0+IDAsIHAgPT4gMCwgcyA9PiAwLCByID0+IDEsIEQgPT4gMSwgZCA9PiAxLCBrID0+IDEsIGogPT4gMSwgfSBpZiAoICR0eXBlIGVxICJjbyIgKTsKKyAgICAgICAgJG9wdCA9IHsgdiA9PiAwLCBsID0+IDAsIFIgPT4gMCB9IGlmICggJHR5cGUgZXEgInN0YXR1cyIgKTsKKyAgICAgICAgJG9wdCA9IHsgQSA9PiAwLCBQID0+IDAsIEMgPT4gMCwgZCA9PiAwLCBmID0+IDAsIGwgPT4gMCwgUiA9PiAwLCBwID0+IDAsIGsgPT4gMSwgciA9PiAxLCBEID0+IDEsIGogPT4gMSwgSSA9PiAxLCBXID0+IDEgfSBpZiAoICR0eXBlIGVxICJ1cGRhdGUiICk7CisgICAgICAgICRvcHQgPSB7IGwgPT4gMCwgUiA9PiAwLCBrID0+IDEsIEQgPT4gMSwgRCA9PiAxLCByID0+IDIgfSBpZiAoICR0eXBlIGVxICJkaWZmIiApOworICAgICAgICAkb3B0ID0geyBjID0+IDAsIFIgPT4gMCwgbCA9PiAwLCBmID0+IDAsIEYgPT4gMSwgbSA9PiAxLCByID0+IDEgfSBpZiAoICR0eXBlIGVxICJjaSIgKTsKKyAgICAgICAgJG9wdCA9IHsgayA9PiAxLCBtID0+IDEgfSBpZiAoICR0eXBlIGVxICJhZGQiICk7CisgICAgICAgICRvcHQgPSB7IGYgPT4gMCwgbCA9PiAwLCBSID0+IDAgfSBpZiAoICR0eXBlIGVxICJyZW1vdmUiICk7CisgICAgICAgICRvcHQgPSB7IGwgPT4gMCwgYiA9PiAwLCBoID0+IDAsIFIgPT4gMCwgdCA9PiAwLCBOID0+IDAsIFMgPT4gMCwgciA9PiAxLCBkID0+IDEsIHMgPT4gMSwgdyA9PiAxIH0gaWYgKCAkdHlwZSBlcSAibG9nIiApOworCisKKyAgICAgICAgd2hpbGUgKCBzY2FsYXIgKCBAeyRzdGF0ZS0+e2FyZ3VtZW50c319ICkgPiAwICkKKyAgICAgICAgeworICAgICAgICAgICAgbXkgJGFyZyA9IHNoaWZ0IEB7JHN0YXRlLT57YXJndW1lbnRzfX07CisKKyAgICAgICAgICAgIG5leHQgaWYgKCAkYXJnIGVxICItLSIgKTsKKyAgICAgICAgICAgIG5leHQgdW5sZXNzICggJGFyZyA9fiAvXFMvICk7CisKKyAgICAgICAgICAgICMgaWYgdGhlIGFyZ3VtZW50IGxvb2tzIGxpa2UgYSBzd2l0Y2gKKyAgICAgICAgICAgIGlmICggJGFyZyA9fiAvXi0oXHcpKC4qKS8gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICMgaWYgaXQncyBhIHN3aXRjaCB0aGF0IHRha2VzIGFuIGFyZ3VtZW50CisgICAgICAgICAgICAgICAgaWYgKCAkb3B0LT57JDF9ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICMgSWYgdGhpcyBzd2l0Y2ggaGFzIGFscmVhZHkgYmVlbiBwcm92aWRlZAorICAgICAgICAgICAgICAgICAgICBpZiAoICRvcHQtPnskMX0gPiAxIGFuZCBleGlzdHMgKCAkc3RhdGUtPntvcHR9eyQxfSApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgJHN0YXRlLT57b3B0fXskMX0gPSBbICRzdGF0ZS0+e29wdH17JDF9IF07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGxlbmd0aCgkMikgPiAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEB7JHN0YXRlLT57b3B0fXskMX19LCQyOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEB7JHN0YXRlLT57b3B0fXskMX19LCBzaGlmdCBAeyRzdGF0ZS0+e2FyZ3VtZW50c319OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiB0aGVyZSdzIGV4dHJhIGRhdGEgaW4gdGhlIGFyZywgdXNlIHRoYXQgYXMgdGhlIGFyZ3VtZW50IGZvciB0aGUgc3dpdGNoCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGxlbmd0aCgkMikgPiAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RhdGUtPntvcHR9eyQxfSA9ICQyOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RhdGUtPntvcHR9eyQxfSA9IHNoaWZ0IEB7JHN0YXRlLT57YXJndW1lbnRzfX07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkc3RhdGUtPntvcHR9eyQxfSA9IHVuZGVmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwdXNoIEB7JHN0YXRlLT57YXJnc319LCAkYXJnOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG15ICRtb2RlID0gMDsKKworICAgICAgICBmb3JlYWNoIG15ICR2YWx1ZSAoIEB7JHN0YXRlLT57YXJndW1lbnRzfX0gKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoICR2YWx1ZSBlcSAiLS0iICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkbW9kZSsrOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoIEB7JHN0YXRlLT57YXJnc319LCAkdmFsdWUgaWYgKCAkbW9kZSA9PSAwICk7CisgICAgICAgICAgICBwdXNoIEB7JHN0YXRlLT57ZmlsZXN9fSwgJHZhbHVlIGlmICggJG1vZGUgPT0gMSApOworICAgICAgICB9CisgICAgfQorfQorCisjIFRoaXMgbWV0aG9kIHVzZXMgJHN0YXRlLT57ZGlyZWN0b3J5fSB0byBwb3B1bGF0ZSAkc3RhdGUtPnthcmdzfSB3aXRoIGEgbGlzdCBvZiBmaWxlbmFtZXMKK3N1YiBhcmdzZnJvbWRpcgoreworICAgIG15ICR1cGRhdGVyID0gc2hpZnQ7CisKKyAgICAkc3RhdGUtPnthcmdzfSA9IFtdIGlmICggc2NhbGFyKEB7JHN0YXRlLT57YXJnc319KSA9PSAxIGFuZCAkc3RhdGUtPnthcmdzfVswXSBlcSAiLiIgKTsKKworICAgIHJldHVybiBpZiAoIHNjYWxhciAoIEB7JHN0YXRlLT57YXJnc319ICkgPiAxICk7CisKKyAgICBteSBAZ2V0aGVhZCA9IEB7JHVwZGF0ZXItPmdldGhlYWR9OworCisgICAgIyBwdXNoIGFkZGVkIGZpbGVzCisgICAgZm9yZWFjaCBteSAkZmlsZSAoa2V5cyAleyRzdGF0ZS0+e2VudHJpZXN9fSkgeworCWlmICggZXhpc3RzICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlfXtyZXZpc2lvbn0gJiYKKwkJJHN0YXRlLT57ZW50cmllc317JGZpbGV9e3JldmlzaW9ufSA9PSAwICkKKwl7CisJICAgIHB1c2ggQGdldGhlYWQsIHsgbmFtZSA9PiAkZmlsZSwgZmlsZWhhc2ggPT4gJ2FkZGVkJyB9OworCX0KKyAgICB9CisKKyAgICBpZiAoIHNjYWxhcihAeyRzdGF0ZS0+e2FyZ3N9fSkgPT0gMSApCisgICAgeworICAgICAgICBteSAkYXJnID0gJHN0YXRlLT57YXJnc31bMF07CisgICAgICAgICRhcmcgLj0gJHN0YXRlLT57cHJlcGVuZGRpcn0gaWYgKCBkZWZpbmVkICggJHN0YXRlLT57cHJlcGVuZGRpcn0gKSApOworCisgICAgICAgICRsb2ctPmluZm8oIk9ubHkgb25lIGFyZyBzcGVjaWZpZWQsIGNoZWNraW5nIGZvciBkaXJlY3RvcnkgZXhwYW5zaW9uIG9uICckYXJnJyIpOworCisgICAgICAgIGZvcmVhY2ggbXkgJGZpbGUgKCBAZ2V0aGVhZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5leHQgaWYgKCAkZmlsZS0+e2ZpbGVoYXNofSBlcSAiZGVsZXRlZCIgYW5kIG5vdCBkZWZpbmVkICggJHN0YXRlLT57ZW50cmllc317JGZpbGUtPntuYW1lfX0gKSApOworICAgICAgICAgICAgbmV4dCB1bmxlc3MgKCAkZmlsZS0+e25hbWV9ID1+IC9eJGFyZ1wvLyBvciAkZmlsZS0+e25hbWV9IGVxICRhcmcgICk7CisgICAgICAgICAgICBwdXNoIEB7JHN0YXRlLT57YXJnc319LCAkZmlsZS0+e25hbWV9OworICAgICAgICB9CisKKyAgICAgICAgc2hpZnQgQHskc3RhdGUtPnthcmdzfX0gaWYgKCBzY2FsYXIoQHskc3RhdGUtPnthcmdzfX0pID4gMSApOworICAgIH0gZWxzZSB7CisgICAgICAgICRsb2ctPmluZm8oIk9ubHkgb25lIGFyZyBzcGVjaWZpZWQsIHBvcHVsYXRpbmcgZmlsZSBsaXN0IGF1dG9tYXRpY2FsbHkiKTsKKworICAgICAgICAkc3RhdGUtPnthcmdzfSA9IFtdOworCisgICAgICAgIGZvcmVhY2ggbXkgJGZpbGUgKCBAZ2V0aGVhZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5leHQgaWYgKCAkZmlsZS0+e2ZpbGVoYXNofSBlcSAiZGVsZXRlZCIgYW5kIG5vdCBkZWZpbmVkICggJHN0YXRlLT57ZW50cmllc317JGZpbGUtPntuYW1lfX0gKSApOworICAgICAgICAgICAgbmV4dCB1bmxlc3MgKCAkZmlsZS0+e25hbWV9ID1+IHMvXiRzdGF0ZS0+e3ByZXBlbmRkaXJ9Ly8gKTsKKyAgICAgICAgICAgIHB1c2ggQHskc3RhdGUtPnthcmdzfX0sICRmaWxlLT57bmFtZX07CisgICAgICAgIH0KKyAgICB9Cit9CisKKyMgVGhpcyBtZXRob2QgY2xlYW5zIHVwIHRoZSAkc3RhdGUgdmFyaWFibGUgYWZ0ZXIgYSBjb21tYW5kIHRoYXQgdXNlcyBhcmd1bWVudHMgaGFzIHJ1bgorc3ViIHN0YXRlY2xlYW51cAoreworICAgICRzdGF0ZS0+e2ZpbGVzfSA9IFtdOworICAgICRzdGF0ZS0+e2FyZ3N9ID0gW107CisgICAgJHN0YXRlLT57YXJndW1lbnRzfSA9IFtdOworICAgICRzdGF0ZS0+e2VudHJpZXN9ID0ge307Cit9CisKK3N1YiByZXZwYXJzZQoreworICAgIG15ICRmaWxlbmFtZSA9IHNoaWZ0OworCisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyAoIGRlZmluZWQgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e3JldmlzaW9ufSApICk7CisKKyAgICByZXR1cm4gJDEgaWYgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e3JldmlzaW9ufSA9fiAvXjFcLihcZCspLyApOworICAgIHJldHVybiAtJDEgaWYgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e3JldmlzaW9ufSA9fiAvXi0xXC4oXGQrKS8gKTsKKworICAgIHJldHVybiB1bmRlZjsKK30KKworIyBUaGlzIG1ldGhvZCB0YWtlcyBhIGZpbGUgaGFzaCBhbmQgZG9lcyBhIENWUyAiZmlsZSB0cmFuc2ZlciIuICBJdHMKKyMgZXhhY3QgYmVoYXZpb3VyIGRlcGVuZHMgb24gYSBzZWNvbmQsIG9wdGlvbmFsIGhhc2ggdGFibGUgYXJndW1lbnQ6CisjIC0gSWYgJG9wdGlvbnMtPnt0YXJnZXRmaWxlfSwgZHVtcCB0aGUgY29udGVudHMgdG8gdGhhdCBmaWxlOworIyAtIElmICRvcHRpb25zLT57cHJpbnR9LCB1c2UgTS9NVCB0byB0cmFuc21pdCB0aGUgY29udGVudHMgb25lIGxpbmUKKyMgICBhdCBhIHRpbWU7CisjIC0gT3RoZXJ3aXNlLCB0cmFuc21pdCB0aGUgc2l6ZSBvZiB0aGUgZmlsZSwgZm9sbG93ZWQgYnkgdGhlIGZpbGUKKyMgICBjb250ZW50cy4KK3N1YiB0cmFuc21pdGZpbGUKK3sKKyAgICBteSAkZmlsZWhhc2ggPSBzaGlmdDsKKyAgICBteSAkb3B0aW9ucyA9IHNoaWZ0OworCisgICAgaWYgKCBkZWZpbmVkICggJGZpbGVoYXNoICkgYW5kICRmaWxlaGFzaCBlcSAiZGVsZXRlZCIgKQorICAgIHsKKyAgICAgICAgJGxvZy0+d2FybigiZmlsZWhhc2ggaXMgJ2RlbGV0ZWQnIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkaWUgIk5lZWQgZmlsZWhhc2giIHVubGVzcyAoIGRlZmluZWQgKCAkZmlsZWhhc2ggKSBhbmQgJGZpbGVoYXNoID1+IC9eW2EtekEtWjAtOV17NDB9JC8gKTsKKworICAgIG15ICR0eXBlID0gYGdpdC1jYXQtZmlsZSAtdCAkZmlsZWhhc2hgOworICAgIGNob21wICR0eXBlOworCisgICAgZGllICggIkludmFsaWQgdHlwZSAnJHR5cGUnIChleHBlY3RlZCAnYmxvYicpIiApIHVubGVzcyAoIGRlZmluZWQgKCAkdHlwZSApIGFuZCAkdHlwZSBlcSAiYmxvYiIgKTsKKworICAgIG15ICRzaXplID0gYGdpdC1jYXQtZmlsZSAtcyAkZmlsZWhhc2hgOworICAgIGNob21wICRzaXplOworCisgICAgJGxvZy0+ZGVidWcoInRyYW5zbWl0ZmlsZSgkZmlsZWhhc2gpIHNpemU9JHNpemUsIHR5cGU9JHR5cGUiKTsKKworICAgIGlmICggb3BlbiBteSAkZmgsICctfCcsICJnaXQtY2F0LWZpbGUiLCAiYmxvYiIsICRmaWxlaGFzaCApCisgICAgeworICAgICAgICBpZiAoIGRlZmluZWQgKCAkb3B0aW9ucy0+e3RhcmdldGZpbGV9ICkgKQorICAgICAgICB7CisgICAgICAgICAgICBteSAkdGFyZ2V0ZmlsZSA9ICRvcHRpb25zLT57dGFyZ2V0ZmlsZX07CisgICAgICAgICAgICBvcGVuIE5FV0ZJTEUsICI+IiwgJHRhcmdldGZpbGUgb3IgZGllKCJDb3VsZG4ndCBvcGVuICckdGFyZ2V0ZmlsZScgZm9yIHdyaXRpbmcgOiAkISIpOworICAgICAgICAgICAgcHJpbnQgTkVXRklMRSAkXyB3aGlsZSAoIDwkZmg+ICk7CisgICAgICAgICAgICBjbG9zZSBORVdGSUxFIG9yIGRpZSgiRmFpbGVkIHRvIHdyaXRlICckdGFyZ2V0ZmlsZSc6ICQhIik7CisgICAgICAgIH0gZWxzaWYgKCBkZWZpbmVkICggJG9wdGlvbnMtPntwcmludH0gKSAmJiAkb3B0aW9ucy0+e3ByaW50fSApIHsKKyAgICAgICAgICAgIHdoaWxlICggPCRmaD4gKSB7CisgICAgICAgICAgICAgICAgaWYoIC9cblx6LyApIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ00gJywgJF87CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ01UIHRleHQgJywgJF8sICJcbiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnQgIiRzaXplXG4iOworICAgICAgICAgICAgcHJpbnQgd2hpbGUgKCA8JGZoPiApOworICAgICAgICB9CisgICAgICAgIGNsb3NlICRmaCBvciBkaWUgKCJDb3VsZG4ndCBjbG9zZSBmaWxlaGFuZGxlIGZvciB0cmFuc21pdGZpbGUoKTogJCEiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWUoIkNvdWxkbid0IGV4ZWN1dGUgZ2l0LWNhdC1maWxlIik7CisgICAgfQorfQorCisjIFRoaXMgbWV0aG9kIHRha2VzIGEgZmlsZSBuYW1lLCBhbmQgcmV0dXJucyAoICRkaXJwYXJ0LCAkZmlsZXBhcnQgKSB3aGljaAorIyByZWZlcnMgdG8gdGhlIGRpcmVjdG9yeSBwb3J0aW9uIGFuZCB0aGUgZmlsZSBwb3J0aW9uIG9mIHRoZSBmaWxlbmFtZQorIyByZXNwZWN0aXZlbHkKK3N1YiBmaWxlbmFtZXNwbGl0Cit7CisgICAgbXkgJGZpbGVuYW1lID0gc2hpZnQ7CisgICAgbXkgJGZpeGZvcmxvY2FsZGlyID0gc2hpZnQ7CisKKyAgICBteSAoICRmaWxlcGFydCwgJGRpcnBhcnQgKSA9ICggJGZpbGVuYW1lLCAiLiIgKTsKKyAgICAoICRmaWxlcGFydCwgJGRpcnBhcnQgKSA9ICggJDIsICQxICkgaWYgKCAkZmlsZW5hbWUgPX4gLyguKilcLyguKikvICk7CisgICAgJGRpcnBhcnQgLj0gIi8iOworCisgICAgaWYgKCAkZml4Zm9ybG9jYWxkaXIgKQorICAgIHsKKyAgICAgICAgJGRpcnBhcnQgPX4gcy9eJHN0YXRlLT57cHJlcGVuZGRpcn0vLzsKKyAgICB9CisKKyAgICByZXR1cm4gKCAkZmlsZXBhcnQsICRkaXJwYXJ0ICk7Cit9CisKK3N1YiBmaWxlY2xlYW51cAoreworICAgIG15ICRmaWxlbmFtZSA9IHNoaWZ0OworCisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyhkZWZpbmVkKCRmaWxlbmFtZSkpOworICAgIGlmICggJGZpbGVuYW1lID1+IC9eXC8vICkKKyAgICB7CisgICAgICAgIHByaW50ICJFIGFic29sdXRlIGZpbGVuYW1lcyAnJGZpbGVuYW1lJyBub3Qgc3VwcG9ydGVkIGJ5IHNlcnZlclxuIjsKKyAgICAgICAgcmV0dXJuIHVuZGVmOworICAgIH0KKworICAgICRmaWxlbmFtZSA9fiBzL15cLlwvLy9nOworICAgICRmaWxlbmFtZSA9ICRzdGF0ZS0+e3ByZXBlbmRkaXJ9IC4gJGZpbGVuYW1lOworICAgIHJldHVybiAkZmlsZW5hbWU7Cit9CisKKyMgR2l2ZW4gYSBwYXRoLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUga29wdHMKKyMgdGhhdCBzaG91bGQgZ28gaW50byB0aGF0IHBhdGgncyBFbnRyaWVzIGxpbmUuICBGb3IgZXhhbXBsZSwgYSBiaW5hcnkKKyMgZmlsZSBzaG91bGQgZ2V0IC1rYi4KK3N1YiBrb3B0c19mcm9tX3BhdGgKK3sKKwlteSAoJHBhdGgpID0gQF87CisKKwkjIE9uY2UgaXQgZXhpc3RzLCB0aGUgZ2l0IGF0dHJpYnV0ZXMgc3lzdGVtIHNob3VsZCBiZSB1c2VkIHRvIGxvb2sgdXAKKwkjIHdoYXQgYXR0cmlidXRlcyBhcHBseSB0byB0aGlzIHBhdGguCisKKwkjIFVudGlsIHRoZW4sIHRha2UgdGhlIHNldHRpbmcgZnJvbSB0aGUgY29uZmlnIGZpbGUKKyAgICB1bmxlc3MgKCBkZWZpbmVkICggJGNmZy0+e2dpdGN2c317YWxsYmluYXJ5fSApIGFuZCAkY2ZnLT57Z2l0Y3ZzfXthbGxiaW5hcnl9ID1+IC9eXHMqKDF8dHJ1ZXx5ZXMpXHMqJC9pICkKKyAgICB7CisJCSMgUmV0dXJuICIiIHRvIGdpdmUgbm8gc3BlY2lhbCB0cmVhdG1lbnQgdG8gYW55IHBhdGgKKwkJcmV0dXJuICIiOworICAgIH0gZWxzZSB7CisJCSMgQWx0ZXJuYXRpdmVseSwgdG8gaGF2ZSBhbGwgZmlsZXMgdHJlYXRlZCBhcyBpZiB0aGV5IGFyZSBiaW5hcnkgKHdoaWNoCisJCSMgaXMgbW9yZSBsaWtlIGdpdCBpdHNlbGYpLCBhbHdheXMgcmV0dXJuIHRoZSAiLWtiIiBvcHRpb24KKwkJcmV0dXJuICIta2IiOworICAgIH0KK30KKworIyBHZW5lcmF0ZSBhIENWUyBhdXRob3IgbmFtZSBmcm9tIEdpdCBhdXRob3IgaW5mb3JtYXRpb24sIGJ5IHRha2luZworIyB0aGUgZmlyc3QgZWlnaHQgY2hhcmFjdGVycyBvZiB0aGUgdXNlciBwYXJ0IG9mIHRoZSBlbWFpbCBhZGRyZXNzLgorc3ViIGN2c19hdXRob3IKK3sKKyAgICBteSAkYXV0aG9yX2xpbmUgPSBzaGlmdDsKKyAgICAobXkgJGF1dGhvcikgPSAkYXV0aG9yX2xpbmUgPX4gLzwoW14+QF17MSw4fSkvOworCisgICAgJGF1dGhvcjsKK30KKworcGFja2FnZSBHSVRDVlM6OmxvZzsKKworIyMjIworIyMjIyBDb3B5cmlnaHQgVGhlIE9wZW4gVW5pdmVyc2l0eSBVSyAtIDIwMDYuCisjIyMjCisjIyMjIEF1dGhvcnM6IE1hcnR5biBTbWl0aCAgICA8bWFydHluQGNhdGFseXN0Lm5ldC5uej4KKyMjIyMgICAgICAgICAgTWFydGluIExhbmdob2ZmIDxtYXJ0aW5AY2F0YWx5c3QubmV0Lm56PgorIyMjIworIyMjIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCis9aGVhZDEgTkFNRQorCitHSVRDVlM6OmxvZworCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBtb2R1bGUgcHJvdmlkZXMgdmVyeSBjcnVkZSBsb2dnaW5nIHdpdGggYSBzaW1pbGFyIGludGVyZmFjZSB0bworTG9nOjpMb2c0cGVybAorCis9aGVhZDEgTUVUSE9EUworCis9Y3V0CisKKz1oZWFkMiBuZXcKKworQ3JlYXRlcyBhIG5ldyBsb2cgb2JqZWN0LCBvcHRpb25hbGx5IHlvdSBjYW4gc3BlY2lmeSBhIGZpbGVuYW1lIGhlcmUgdG8KK2luZGljYXRlIHRoZSBmaWxlIHRvIGxvZyB0by4gSWYgbm8gbG9nIGZpbGUgaXMgc3BlY2lmaWVkLCB5b3UgY2FuIHNwZWNpZnkgb25lCitsYXRlciB3aXRoIG1ldGhvZCBzZXRmaWxlLCBvciBpbmRpY2F0ZSB5b3Ugbm8gbG9uZ2VyIHdhbnQgbG9nZ2luZyB3aXRoIG1ldGhvZAorbm9maWxlLgorCitVbnRpbCBvbmUgb2YgdGhlc2UgbWV0aG9kcyBpcyBjYWxsZWQsIGFsbCBsb2cgY2FsbHMgd2lsbCBidWZmZXIgbWVzc2FnZXMgcmVhZHkKK3RvIHdyaXRlIG91dC4KKworPWN1dAorc3ViIG5ldworeworICAgIG15ICRjbGFzcyA9IHNoaWZ0OworICAgIG15ICRmaWxlbmFtZSA9IHNoaWZ0OworCisgICAgbXkgJHNlbGYgPSB7fTsKKworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisKKyAgICBpZiAoIGRlZmluZWQgKCAkZmlsZW5hbWUgKSApCisgICAgeworICAgICAgICBvcGVuICRzZWxmLT57Zmh9LCAiPj4iLCAkZmlsZW5hbWUgb3IgZGllKCJDb3VsZG4ndCBvcGVuICckZmlsZW5hbWUnIGZvciB3cml0aW5nIDogJCEiKTsKKyAgICB9CisKKyAgICByZXR1cm4gJHNlbGY7Cit9CisKKz1oZWFkMiBzZXRmaWxlCisKK1RoaXMgbWV0aG9kcyB0YWtlcyBhIGZpbGVuYW1lLCBhbmQgYXR0ZW1wdHMgdG8gb3BlbiB0aGF0IGZpbGUgYXMgdGhlIGxvZyBmaWxlLgorSWYgc3VjY2Vzc2Z1bCwgYWxsIGJ1ZmZlcmVkIGRhdGEgaXMgd3JpdHRlbiBvdXQgdG8gdGhlIGZpbGUsIGFuZCBhbnkgZnVydGhlcgorbG9nZ2luZyBpcyB3cml0dGVuIGRpcmVjdGx5IHRvIHRoZSBmaWxlLgorCis9Y3V0CitzdWIgc2V0ZmlsZQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGZpbGVuYW1lID0gc2hpZnQ7CisKKyAgICBpZiAoIGRlZmluZWQgKCAkZmlsZW5hbWUgKSApCisgICAgeworICAgICAgICBvcGVuICRzZWxmLT57Zmh9LCAiPj4iLCAkZmlsZW5hbWUgb3IgZGllKCJDb3VsZG4ndCBvcGVuICckZmlsZW5hbWUnIGZvciB3cml0aW5nIDogJCEiKTsKKyAgICB9CisKKyAgICByZXR1cm4gdW5sZXNzICggZGVmaW5lZCAoICRzZWxmLT57YnVmZmVyfSApIGFuZCByZWYgJHNlbGYtPntidWZmZXJ9IGVxICJBUlJBWSIgKTsKKworICAgIHdoaWxlICggbXkgJGxpbmUgPSBzaGlmdCBAeyRzZWxmLT57YnVmZmVyfX0gKQorICAgIHsKKyAgICAgICAgcHJpbnQgeyRzZWxmLT57Zmh9fSAkbGluZTsKKyAgICB9Cit9CisKKz1oZWFkMiBub2ZpbGUKKworVGhpcyBtZXRob2QgaW5kaWNhdGVzIG5vIGxvZ2dpbmcgaXMgZ29pbmcgdG8gYmUgdXNlZC4gSXQgZmx1c2hlcyBhbnkgZW50cmllcyBpbgordGhlIGludGVybmFsIGJ1ZmZlciwgYW5kIHNldHMgYSBmbGFnIHRvIGVuc3VyZSBubyBmdXJ0aGVyIGRhdGEgaXMgcHV0IHRoZXJlLgorCis9Y3V0CitzdWIgbm9maWxlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57bm9sb2d9ID0gMTsKKworICAgIHJldHVybiB1bmxlc3MgKCBkZWZpbmVkICggJHNlbGYtPntidWZmZXJ9ICkgYW5kIHJlZiAkc2VsZi0+e2J1ZmZlcn0gZXEgIkFSUkFZIiApOworCisgICAgJHNlbGYtPntidWZmZXJ9ID0gW107Cit9CisKKz1oZWFkMiBfbG9nb3BlbgorCitJbnRlcm5hbCBtZXRob2QuIFJldHVybnMgdHJ1ZSBpZiB0aGUgbG9nIGZpbGUgaXMgb3BlbiwgZmFsc2Ugb3RoZXJ3aXNlLgorCis9Y3V0CitzdWIgX2xvZ29wZW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuIDEgaWYgKCBkZWZpbmVkICggJHNlbGYtPntmaH0gKSBhbmQgcmVmICRzZWxmLT57Zmh9IGVxICJHTE9CIiApOworICAgIHJldHVybiAwOworfQorCis9aGVhZDIgZGVidWcgaW5mbyB3YXJuIGZhdGFsCisKK1RoZXNlIGZvdXIgbWV0aG9kcyBhcmUgd3JhcHBlcnMgdG8gX2xvZy4gVGhleSBwcm92aWRlIHRoZSBhY3R1YWwgaW50ZXJmYWNlIGZvcgorbG9nZ2luZyBkYXRhLgorCis9Y3V0CitzdWIgZGVidWcgeyBteSAkc2VsZiA9IHNoaWZ0OyAkc2VsZi0+X2xvZygiZGVidWciLCBAXyk7IH0KK3N1YiBpbmZvICB7IG15ICRzZWxmID0gc2hpZnQ7ICRzZWxmLT5fbG9nKCJpbmZvIiAsIEBfKTsgfQorc3ViIHdhcm4gIHsgbXkgJHNlbGYgPSBzaGlmdDsgJHNlbGYtPl9sb2coIndhcm4iICwgQF8pOyB9CitzdWIgZmF0YWwgeyBteSAkc2VsZiA9IHNoaWZ0OyAkc2VsZi0+X2xvZygiZmF0YWwiLCBAXyk7IH0KKworPWhlYWQyIF9sb2cKKworVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QgY2FsbGVkIGJ5IHRoZSBsb2dnaW5nIGZ1bmN0aW9ucy4gSXQgZ2VuZXJhdGVzIGEKK3RpbWVzdGFtcCBhbmQgcHVzaGVzIHRoZSBsb2dnZWQgbGluZSBlaXRoZXIgdG8gZmlsZSwgb3IgaW50ZXJuYWwgYnVmZmVyLgorCis9Y3V0CitzdWIgX2xvZworeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGxldmVsID0gc2hpZnQ7CisKKyAgICByZXR1cm4gaWYgKCAkc2VsZi0+e25vbG9nfSApOworCisgICAgbXkgQHRpbWUgPSBsb2NhbHRpbWU7CisgICAgbXkgJHRpbWVzdHJpbmcgPSBzcHJpbnRmKCIlNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIDogJS01cyIsCisgICAgICAgICR0aW1lWzVdICsgMTkwMCwKKyAgICAgICAgJHRpbWVbNF0gKyAxLAorICAgICAgICAkdGltZVszXSwKKyAgICAgICAgJHRpbWVbMl0sCisgICAgICAgICR0aW1lWzFdLAorICAgICAgICAkdGltZVswXSwKKyAgICAgICAgdWMgJGxldmVsLAorICAgICk7CisKKyAgICBpZiAoICRzZWxmLT5fbG9nb3BlbiApCisgICAgeworICAgICAgICBwcmludCB7JHNlbGYtPntmaH19ICR0aW1lc3RyaW5nIC4gIiAtICIgLiBqb2luKCIgIixAXykgLiAiXG4iOworICAgIH0gZWxzZSB7CisgICAgICAgIHB1c2ggQHskc2VsZi0+e2J1ZmZlcn19LCAkdGltZXN0cmluZyAuICIgLSAiIC4gam9pbigiICIsQF8pIC4gIlxuIjsKKyAgICB9Cit9CisKKz1oZWFkMiBERVNUUk9ZCisKK1RoaXMgbWV0aG9kIHNpbXBseSBjbG9zZXMgdGhlIGZpbGUgaGFuZGxlIGlmIG9uZSBpcyBvcGVuCisKKz1jdXQKK3N1YiBERVNUUk9ZCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIGlmICggJHNlbGYtPl9sb2dvcGVuICkKKyAgICB7CisgICAgICAgIGNsb3NlICRzZWxmLT57Zmh9OworICAgIH0KK30KKworcGFja2FnZSBHSVRDVlM6OnVwZGF0ZXI7CisKKyMjIyMKKyMjIyMgQ29weXJpZ2h0IFRoZSBPcGVuIFVuaXZlcnNpdHkgVUsgLSAyMDA2LgorIyMjIworIyMjIyBBdXRob3JzOiBNYXJ0eW4gU21pdGggICAgPG1hcnR5bkBjYXRhbHlzdC5uZXQubno+CisjIyMjICAgICAgICAgIE1hcnRpbiBMYW5naG9mZiA8bWFydGluQGNhdGFseXN0Lm5ldC5uej4KKyMjIyMKKyMjIyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBEQkk7CisKKz1oZWFkMSBNRVRIT0RTCisKKz1jdXQKKworPWhlYWQyIG5ldworCis9Y3V0CitzdWIgbmV3Cit7CisgICAgbXkgJGNsYXNzID0gc2hpZnQ7CisgICAgbXkgJGNvbmZpZyA9IHNoaWZ0OworICAgIG15ICRtb2R1bGUgPSBzaGlmdDsKKyAgICBteSAkbG9nID0gc2hpZnQ7CisKKyAgICBkaWUgIk5lZWQgdG8gc3BlY2lmeSBhIGdpdCByZXBvc2l0b3J5IiB1bmxlc3MgKCBkZWZpbmVkKCRjb25maWcpIGFuZCAtZCAkY29uZmlnICk7CisgICAgZGllICJOZWVkIHRvIHNwZWNpZnkgYSBtb2R1bGUiIHVubGVzcyAoIGRlZmluZWQoJG1vZHVsZSkgKTsKKworICAgICRjbGFzcyA9IHJlZigkY2xhc3MpIHx8ICRjbGFzczsKKworICAgIG15ICRzZWxmID0ge307CisKKyAgICBibGVzcyAkc2VsZiwgJGNsYXNzOworCisgICAgJHNlbGYtPnt2YWxpZF90YWJsZXN9ID0geydyZXZpc2lvbicgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JldmlzaW9uX2l4MScgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JldmlzaW9uX2l4MicgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hlYWQnID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoZWFkX2l4MScgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnRpZXMnID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb21taXRtc2dzJyA9PiAxfTsKKworICAgICRzZWxmLT57bW9kdWxlfSA9ICRtb2R1bGU7CisgICAgJHNlbGYtPntnaXRfcGF0aH0gPSAkY29uZmlnIC4gIi8iOworCisgICAgJHNlbGYtPntsb2d9ID0gJGxvZzsKKworICAgIGRpZSAiR2l0IHJlcG8gJyRzZWxmLT57Z2l0X3BhdGh9JyBkb2Vzbid0IGV4aXN0IiB1bmxlc3MgKCAtZCAkc2VsZi0+e2dpdF9wYXRofSApOworCisgICAgJHNlbGYtPntkYmRyaXZlcn0gPSAkY2ZnLT57Z2l0Y3ZzfXskc3RhdGUtPnttZXRob2R9fXtkYmRyaXZlcn0gfHwKKyAgICAgICAgJGNmZy0+e2dpdGN2c317ZGJkcml2ZXJ9IHx8ICJTUUxpdGUiOworICAgICRzZWxmLT57ZGJuYW1lfSA9ICRjZmctPntnaXRjdnN9eyRzdGF0ZS0+e21ldGhvZH19e2RibmFtZX0gfHwKKyAgICAgICAgJGNmZy0+e2dpdGN2c317ZGJuYW1lfSB8fCAiJUdnaXRjdnMuJW0uc3FsaXRlIjsKKyAgICAkc2VsZi0+e2RidXNlcn0gPSAkY2ZnLT57Z2l0Y3ZzfXskc3RhdGUtPnttZXRob2R9fXtkYnVzZXJ9IHx8CisgICAgICAgICRjZmctPntnaXRjdnN9e2RidXNlcn0gfHwgIiI7CisgICAgJHNlbGYtPntkYnBhc3N9ID0gJGNmZy0+e2dpdGN2c317JHN0YXRlLT57bWV0aG9kfX17ZGJwYXNzfSB8fAorICAgICAgICAkY2ZnLT57Z2l0Y3ZzfXtkYnBhc3N9IHx8ICIiOworICAgICRzZWxmLT57ZGJ0YWJsZW5hbWVwcmVmaXh9ID0gJGNmZy0+e2dpdGN2c317JHN0YXRlLT57bWV0aG9kfX17ZGJ0YWJsZW5hbWVwcmVmaXh9IHx8CisgICAgICAgICRjZmctPntnaXRjdnN9e2RidGFibGVuYW1lcHJlZml4fSB8fCAiIjsKKyAgICBteSAlbWFwcGluZyA9ICggbSA9PiAkbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICBhID0+ICRzdGF0ZS0+e21ldGhvZH0sCisgICAgICAgICAgICAgICAgICAgIHUgPT4gZ2V0bG9naW4gfHwgZ2V0cHd1aWQoJDwpIHx8ICQ8LAorICAgICAgICAgICAgICAgICAgICBHID0+ICRzZWxmLT57Z2l0X3BhdGh9LAorICAgICAgICAgICAgICAgICAgICBnID0+IG1hbmdsZV9kaXJuYW1lKCRzZWxmLT57Z2l0X3BhdGh9KSwKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAkc2VsZi0+e2RibmFtZX0gPX4gcy8lKFttYXVHZ10pLyRtYXBwaW5neyQxfS9lZzsKKyAgICAkc2VsZi0+e2RidXNlcn0gPX4gcy8lKFttYXVHZ10pLyRtYXBwaW5neyQxfS9lZzsKKyAgICAkc2VsZi0+e2RidGFibGVuYW1lcHJlZml4fSA9fiBzLyUoW21hdUdnXSkvJG1hcHBpbmd7JDF9L2VnOworICAgICRzZWxmLT57ZGJ0YWJsZW5hbWVwcmVmaXh9ID0gbWFuZ2xlX3RhYmxlbmFtZSgkc2VsZi0+e2RidGFibGVuYW1lcHJlZml4fSk7CisKKyAgICBkaWUgIkludmFsaWQgY2hhciAnOicgaW4gZGJkcml2ZXIiIGlmICRzZWxmLT57ZGJkcml2ZXJ9ID1+IC86LzsKKyAgICBkaWUgIkludmFsaWQgY2hhciAnOycgaW4gZGJuYW1lIiBpZiAkc2VsZi0+e2RibmFtZX0gPX4gLzsvOworICAgICRzZWxmLT57ZGJofSA9IERCSS0+Y29ubmVjdCgiZGJpOiRzZWxmLT57ZGJkcml2ZXJ9OmRibmFtZT0kc2VsZi0+e2RibmFtZX0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2RidXNlcn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57ZGJwYXNzfSk7CisgICAgZGllICJFcnJvciBjb25uZWN0aW5nIHRvIGRhdGFiYXNlXG4iIHVubGVzcyBkZWZpbmVkICRzZWxmLT57ZGJofTsKKworICAgICRzZWxmLT57dGFibGVzfSA9IHt9OworICAgIGZvcmVhY2ggbXkgJHRhYmxlICgga2V5cyAleyRzZWxmLT57ZGJofS0+dGFibGVfaW5mbyh1bmRlZix1bmRlZix1bmRlZiwnVEFCTEUnKS0+ZmV0Y2hhbGxfaGFzaHJlZignVEFCTEVfTkFNRScpfSApCisgICAgeworICAgICAgICAkc2VsZi0+e3RhYmxlc317JHRhYmxlfSA9IDE7CisgICAgfQorCisgICAgIyBDb25zdHJ1Y3QgdGhlIHJldmlzaW9uIHRhYmxlIGlmIHJlcXVpcmVkCisgICAgdW5sZXNzICggJHNlbGYtPnt0YWJsZXN9eyRzZWxmLT50YWJsZW5hbWUoInJldmlzaW9uIil9ICkKKyAgICB7CisgICAgICAgIG15ICR0YWJsZW5hbWUgPSAkc2VsZi0+dGFibGVuYW1lKCJyZXZpc2lvbiIpOworICAgICAgICBteSAkaXgxbmFtZSA9ICRzZWxmLT50YWJsZW5hbWUoInJldmlzaW9uX2l4MSIpOworICAgICAgICBteSAkaXgybmFtZSA9ICRzZWxmLT50YWJsZW5hbWUoInJldmlzaW9uX2l4MiIpOworICAgICAgICAkc2VsZi0+e2RiaH0tPmRvKCIKKyAgICAgICAgICAgIENSRUFURSBUQUJMRSAkdGFibGVuYW1lICgKKyAgICAgICAgICAgICAgICBuYW1lICAgICAgIFRFWFQgTk9UIE5VTEwsCisgICAgICAgICAgICAgICAgcmV2aXNpb24gICBJTlRFR0VSIE5PVCBOVUxMLAorICAgICAgICAgICAgICAgIGZpbGVoYXNoICAgVEVYVCBOT1QgTlVMTCwKKyAgICAgICAgICAgICAgICBjb21taXRoYXNoIFRFWFQgTk9UIE5VTEwsCisgICAgICAgICAgICAgICAgYXV0aG9yICAgICBURVhUIE5PVCBOVUxMLAorICAgICAgICAgICAgICAgIG1vZGlmaWVkICAgVEVYVCBOT1QgTlVMTCwKKyAgICAgICAgICAgICAgICBtb2RlICAgICAgIFRFWFQgTk9UIE5VTEwKKyAgICAgICAgICAgICkKKyAgICAgICAgIik7CisgICAgICAgICRzZWxmLT57ZGJofS0+ZG8oIgorICAgICAgICAgICAgQ1JFQVRFIElOREVYICRpeDFuYW1lCisgICAgICAgICAgICBPTiAkdGFibGVuYW1lIChuYW1lLHJldmlzaW9uKQorICAgICAgICAiKTsKKyAgICAgICAgJHNlbGYtPntkYmh9LT5kbygiCisgICAgICAgICAgICBDUkVBVEUgSU5ERVggJGl4Mm5hbWUKKyAgICAgICAgICAgIE9OICR0YWJsZW5hbWUgKG5hbWUsY29tbWl0aGFzaCkKKyAgICAgICAgIik7CisgICAgfQorCisgICAgIyBDb25zdHJ1Y3QgdGhlIGhlYWQgdGFibGUgaWYgcmVxdWlyZWQKKyAgICB1bmxlc3MgKCAkc2VsZi0+e3RhYmxlc317JHNlbGYtPnRhYmxlbmFtZSgiaGVhZCIpfSApCisgICAgeworICAgICAgICBteSAkdGFibGVuYW1lID0gJHNlbGYtPnRhYmxlbmFtZSgiaGVhZCIpOworICAgICAgICBteSAkaXgxbmFtZSA9ICRzZWxmLT50YWJsZW5hbWUoImhlYWRfaXgxIik7CisgICAgICAgICRzZWxmLT57ZGJofS0+ZG8oIgorICAgICAgICAgICAgQ1JFQVRFIFRBQkxFICR0YWJsZW5hbWUgKAorICAgICAgICAgICAgICAgIG5hbWUgICAgICAgVEVYVCBOT1QgTlVMTCwKKyAgICAgICAgICAgICAgICByZXZpc2lvbiAgIElOVEVHRVIgTk9UIE5VTEwsCisgICAgICAgICAgICAgICAgZmlsZWhhc2ggICBURVhUIE5PVCBOVUxMLAorICAgICAgICAgICAgICAgIGNvbW1pdGhhc2ggVEVYVCBOT1QgTlVMTCwKKyAgICAgICAgICAgICAgICBhdXRob3IgICAgIFRFWFQgTk9UIE5VTEwsCisgICAgICAgICAgICAgICAgbW9kaWZpZWQgICBURVhUIE5PVCBOVUxMLAorICAgICAgICAgICAgICAgIG1vZGUgICAgICAgVEVYVCBOT1QgTlVMTAorICAgICAgICAgICAgKQorICAgICAgICAiKTsKKyAgICAgICAgJHNlbGYtPntkYmh9LT5kbygiCisgICAgICAgICAgICBDUkVBVEUgSU5ERVggJGl4MW5hbWUKKyAgICAgICAgICAgIE9OICR0YWJsZW5hbWUgKG5hbWUpCisgICAgICAgICIpOworICAgIH0KKworICAgICMgQ29uc3RydWN0IHRoZSBwcm9wZXJ0aWVzIHRhYmxlIGlmIHJlcXVpcmVkCisgICAgdW5sZXNzICggJHNlbGYtPnt0YWJsZXN9eyRzZWxmLT50YWJsZW5hbWUoInByb3BlcnRpZXMiKX0gKQorICAgIHsKKyAgICAgICAgbXkgJHRhYmxlbmFtZSA9ICRzZWxmLT50YWJsZW5hbWUoInByb3BlcnRpZXMiKTsKKyAgICAgICAgJHNlbGYtPntkYmh9LT5kbygiCisgICAgICAgICAgICBDUkVBVEUgVEFCTEUgJHRhYmxlbmFtZSAoCisgICAgICAgICAgICAgICAga2V5ICAgICAgICBURVhUIE5PVCBOVUxMIFBSSU1BUlkgS0VZLAorICAgICAgICAgICAgICAgIHZhbHVlICAgICAgVEVYVAorICAgICAgICAgICAgKQorICAgICAgICAiKTsKKyAgICB9CisKKyAgICAjIENvbnN0cnVjdCB0aGUgY29tbWl0bXNncyB0YWJsZSBpZiByZXF1aXJlZAorICAgIHVubGVzcyAoICRzZWxmLT57dGFibGVzfXskc2VsZi0+dGFibGVuYW1lKCJjb21taXRtc2dzIil9ICkKKyAgICB7CisgICAgICAgIG15ICR0YWJsZW5hbWUgPSAkc2VsZi0+dGFibGVuYW1lKCJjb21taXRtc2dzIik7CisgICAgICAgICRzZWxmLT57ZGJofS0+ZG8oIgorICAgICAgICAgICAgQ1JFQVRFIFRBQkxFICR0YWJsZW5hbWUgKAorICAgICAgICAgICAgICAgIGtleSAgICAgICAgVEVYVCBOT1QgTlVMTCBQUklNQVJZIEtFWSwKKyAgICAgICAgICAgICAgICB2YWx1ZSAgICAgIFRFWFQKKyAgICAgICAgICAgICkKKyAgICAgICAgIik7CisgICAgfQorCisgICAgcmV0dXJuICRzZWxmOworfQorCis9aGVhZDIgdGFibGVuYW1lCisKKz1jdXQKK3N1YiB0YWJsZW5hbWUKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRuYW1lID0gc2hpZnQ7CisKKyAgICBpZiAoZXhpc3RzICRzZWxmLT57dmFsaWRfdGFibGVzfXskbmFtZX0pIHsKKyAgICAgICAgcmV0dXJuICRzZWxmLT57ZGJ0YWJsZW5hbWVwcmVmaXh9IC4gJG5hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHVuZGVmOworICAgIH0KK30KKworPWhlYWQyIHVwZGF0ZQorCis9Y3V0CitzdWIgdXBkYXRlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgZmlyc3QgbGV0cyBnZXQgdGhlIGNvbW1pdCBsaXN0CisgICAgJEVOVntHSVRfRElSfSA9ICRzZWxmLT57Z2l0X3BhdGh9OworCisgICAgbXkgJGNvbW1pdHNoYTEgPSBgZ2l0IHJldi1wYXJzZSAkc2VsZi0+e21vZHVsZX1gOworICAgIGNob21wICRjb21taXRzaGExOworCisgICAgbXkgJGNvbW1pdGluZm8gPSBgZ2l0IGNhdC1maWxlIGNvbW1pdCAkc2VsZi0+e21vZHVsZX0gMj4mMWA7CisgICAgdW5sZXNzICggJGNvbW1pdGluZm8gPX4gL3RyZWVccytbYS16QS1aMC05XXs0MH0vICkKKyAgICB7CisgICAgICAgIGRpZSgiSW52YWxpZCBtb2R1bGUgJyRzZWxmLT57bW9kdWxlfSciKTsKKyAgICB9CisKKworICAgIG15ICRnaXRfbG9nOworICAgIG15ICRsYXN0Y29tbWl0ID0gJHNlbGYtPl9nZXRfcHJvcCgibGFzdF9jb21taXQiKTsKKworICAgIGlmIChkZWZpbmVkICRsYXN0Y29tbWl0ICYmICRsYXN0Y29tbWl0IGVxICRjb21taXRzaGExKSB7ICMgdXAtdG8tZGF0ZQorICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgIyBTdGFydCBleGNsdXNpdmUgbG9jayBoZXJlLi4uCisgICAgJHNlbGYtPntkYmh9LT5iZWdpbl93b3JrKCkgb3IgZGllICJDYW5ub3QgbG9jayBkYXRhYmFzZSBmb3IgQkVHSU4iOworCisgICAgIyBUT0RPOiBsb2cgcHJvY2Vzc2luZyBpcyBtZW1vcnkgYm91bmQKKyAgICAjIGlmIHdlIGNhbiBwYXJzZSBpbnRvIGEgMm5kIGZpbGUgdGhhdCBpcyBpbiByZXZlcnNlIG9yZGVyCisgICAgIyB3ZSBjYW4gcHJvYmFibHkgZG8gc29tZXRoaW5nIHJlYWxseSBlZmZpY2llbnQKKyAgICBteSBAZ2l0X2xvZ19wYXJhbXMgPSAoJy0tcHJldHR5JywgJy0tcGFyZW50cycsICctLXRvcG8tb3JkZXInKTsKKworICAgIGlmIChkZWZpbmVkICRsYXN0Y29tbWl0KSB7CisgICAgICAgIHB1c2ggQGdpdF9sb2dfcGFyYW1zLCAiJGxhc3Rjb21taXQuLiRzZWxmLT57bW9kdWxlfSI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHVzaCBAZ2l0X2xvZ19wYXJhbXMsICRzZWxmLT57bW9kdWxlfTsKKyAgICB9CisgICAgIyBnaXQtcmV2LWxpc3QgaXMgdGhlIGJhY2tlbmQgLyBwbHVtYmluZyB2ZXJzaW9uIG9mIGdpdC1sb2cKKyAgICBvcGVuKEdJVExPRywgJy18JywgJ2dpdC1yZXYtbGlzdCcsIEBnaXRfbG9nX3BhcmFtcykgb3IgZGllICJDYW5ub3QgY2FsbCBnaXQtcmV2LWxpc3Q6ICQhIjsKKworICAgIG15IEBjb21taXRzOworCisgICAgbXkgJWNvbW1pdCA9ICgpOworCisgICAgd2hpbGUgKCA8R0lUTE9HPiApCisgICAgeworICAgICAgICBjaG9tcDsKKyAgICAgICAgaWYgKG0vXmNvbW1pdFxzKyguKikkLykgeworICAgICAgICAgICAgIyBvbiBeY29tbWl0IGxpbmVzIHB1dCB0aGUganVzdCBzZWVuIGNvbW1pdCBpbiB0aGUgc3RhY2sKKyAgICAgICAgICAgICMgYW5kIHByaW1lIHRoaW5ncyBmb3IgdGhlIG5leHQgb25lCisgICAgICAgICAgICBpZiAoa2V5cyAlY29tbWl0KSB7CisgICAgICAgICAgICAgICAgbXkgJWNvcHkgPSAlY29tbWl0OworICAgICAgICAgICAgICAgIHVuc2hpZnQgQGNvbW1pdHMsIFwlY29weTsKKyAgICAgICAgICAgICAgICAlY29tbWl0ID0gKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBteSBAcGFyZW50cyA9IHNwbGl0KG0vXHMrLywgJDEpOworICAgICAgICAgICAgJGNvbW1pdHtoYXNofSA9IHNoaWZ0IEBwYXJlbnRzOworICAgICAgICAgICAgJGNvbW1pdHtwYXJlbnRzfSA9IFxAcGFyZW50czsKKyAgICAgICAgfSBlbHNpZiAobS9eKFx3Kz8pOlxzKyguKikkLyAmJiAhZXhpc3RzKCRjb21taXR7bWVzc2FnZX0pKSB7CisgICAgICAgICAgICAjIG9uIHJmYzgyMi1saWtlIGxpbmVzIHNlZW4gYmVmb3JlIHdlIHNlZSBhbnkgbWVzc2FnZSwKKyAgICAgICAgICAgICMgbG93ZXJjYXNlIHRoZSBlbnRyeSBhbmQgcHV0IGl0IGluIHRoZSBoYXNoIGFzIGtleS12YWx1ZQorICAgICAgICAgICAgJGNvbW1pdHtsYygkMSl9ID0gJDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAjIG1lc3NhZ2UgbGluZXMgLSBza2lwIGluaXRpYWwgZW1wdHkgbGluZQorICAgICAgICAgICAgIyBhbmQgdHJpbSB3aGl0ZXNwYWNlCisgICAgICAgICAgICBpZiAoIWV4aXN0cygkY29tbWl0e21lc3NhZ2V9KSAmJiBtL15ccyokLykgeworICAgICAgICAgICAgICAgICMgZGVmaW5lIGl0IHRvIG1hcmsgdGhlIGVuZCBvZiBoZWFkZXJzCisgICAgICAgICAgICAgICAgJGNvbW1pdHttZXNzYWdlfSA9ICcnOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzL15ccysvLzsgcy9ccyskLy87ICMgdHJpbSB3cworICAgICAgICAgICAgJGNvbW1pdHttZXNzYWdlfSAuPSAkXyAuICJcbiI7CisgICAgICAgIH0KKyAgICB9CisgICAgY2xvc2UgR0lUTE9HOworCisgICAgdW5zaGlmdCBAY29tbWl0cywgXCVjb21taXQgaWYgKCBrZXlzICVjb21taXQgKTsKKworICAgICMgTm93IGFsbCB0aGUgY29tbWl0cyBhcmUgaW4gdGhlIEBjb21taXRzIGJ1Y2tldAorICAgICMgb3JkZXJlZCBieSB0aW1lIERFU0MuIGZvciBlYWNoIGNvbW1pdCB0aGF0IG5lZWRzIHByb2Nlc3NpbmcsCisgICAgIyBkZXRlcm1pbmUgd2hldGhlciBpdCdzIGZvbGxvd2luZyB0aGUgbGFzdCBoZWFkIHdlJ3ZlIHNlZW4gb3IgaWYKKyAgICAjIGl0J3Mgb24gaXRzIG93biBicmFuY2gsIGdyYWIgYSBmaWxlIGxpc3QsIGFuZCBhZGQgd2hhdGV2ZXIncyBjaGFuZ2VkCisgICAgIyBOT1RFOiAkbGFzdGNvbW1pdCByZWZlcnMgdG8gdGhlIGxhc3QgY29tbWl0IGZyb20gcHJldmlvdXMgcnVuCisgICAgIyAgICAgICAkbGFzdHBpY2tlZCBpcyB0aGUgbGFzdCBjb21taXQgd2UgcGlja2VkIGluIHRoaXMgcnVuCisgICAgbXkgJGxhc3RwaWNrZWQ7CisgICAgbXkgJGhlYWQgPSB7fTsKKyAgICBpZiAoZGVmaW5lZCAkbGFzdGNvbW1pdCkgeworICAgICAgICAkbGFzdHBpY2tlZCA9ICRsYXN0Y29tbWl0OworICAgIH0KKworICAgIG15ICRjb21taXR0b3RhbCA9IHNjYWxhcihAY29tbWl0cyk7CisgICAgbXkgJGNvbW1pdGNvdW50ID0gMDsKKworICAgICMgTG9hZCB0aGUgaGVhZCB0YWJsZSBpbnRvICRoZWFkIChmb3IgY2FjaGVkIGxvb2t1cHMgZHVyaW5nIHRoZSB1cGRhdGUgcHJvY2VzcykKKyAgICBmb3JlYWNoIG15ICRmaWxlICggQHskc2VsZi0+Z2V0aGVhZCgpfSApCisgICAgeworICAgICAgICAkaGVhZC0+eyRmaWxlLT57bmFtZX19ID0gJGZpbGU7CisgICAgfQorCisgICAgZm9yZWFjaCBteSAkY29tbWl0ICggQGNvbW1pdHMgKQorICAgIHsKKyAgICAgICAgJHNlbGYtPntsb2d9LT5kZWJ1ZygiR0lUQ1ZTOjp1cGRhdGVyIC0gUHJvY2Vzc2luZyBjb21taXQgJGNvbW1pdC0+e2hhc2h9ICgiIC4gKCsrJGNvbW1pdGNvdW50KSAuICIgb2YgJGNvbW1pdHRvdGFsKSIpOworICAgICAgICBpZiAoZGVmaW5lZCAkbGFzdHBpY2tlZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpbl9hcnJheSgkbGFzdHBpY2tlZCwgQHskY29tbWl0LT57cGFyZW50c319KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjIHNraXAsIHdlJ2xsIHNlZSB0aGlzIGRlbHRhCisgICAgICAgICAgICAgICAgIyBhcyBwYXJ0IG9mIGEgbWVyZ2UgbGF0ZXIKKyAgICAgICAgICAgICAgICAjIHdhcm4gInNraXBwaW5nIG9mZi10cmFjayAgJGNvbW1pdC0+e2hhc2h9XG4iOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9IGVsc2lmIChAeyRjb21taXQtPntwYXJlbnRzfX0gPiAxKSB7CisgICAgICAgICAgICAgICAgIyBpdCBpcyBhIG1lcmdlIGNvbW1pdCwgZm9yIGVhY2ggcGFyZW50IHRoYXQgaXMKKyAgICAgICAgICAgICAgICAjIG5vdCAkbGFzdHBpY2tlZCwgc2VlIGlmIHdlIGNhbiBnZXQgYSBsb2cKKyAgICAgICAgICAgICAgICAjIGZyb20gdGhlIG1lcmdlLWJhc2UgdG8gdGhhdCBwYXJlbnQgdG8gcHV0IGl0CisgICAgICAgICAgICAgICAgIyBpbiB0aGUgbWVzc2FnZSBhcyBhIG1lcmdlIHN1bW1hcnkuCisgICAgICAgICAgICAgICAgbXkgQHBhcmVudHMgPSBAeyRjb21taXQtPntwYXJlbnRzfX07CisgICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkcGFyZW50IChAcGFyZW50cykgeworICAgICAgICAgICAgICAgICAgICAjIGdpdC1tZXJnZS1iYXNlIGNhbiBwb3RlbnRpYWxseSAoYnV0IHJhcmVseSkgdGhyb3cKKyAgICAgICAgICAgICAgICAgICAgIyBzZXZlcmFsIGNhbmRpZGF0ZSBtZXJnZSBiYXNlcy4gbGV0J3MgYXNzdW1lCisgICAgICAgICAgICAgICAgICAgICMgdGhhdCB0aGUgZmlyc3Qgb25lIGlzIHRoZSBiZXN0IG9uZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCRwYXJlbnQgZXEgJGxhc3RwaWNrZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKwkJICAgIG15ICRiYXNlID0gZXZhbCB7CisJCQkgICAgc2FmZV9waXBlX2NhcHR1cmUoJ2dpdC1tZXJnZS1iYXNlJywKKwkJCQkJCSAkbGFzdHBpY2tlZCwgJHBhcmVudCk7CisJCSAgICB9OworCQkgICAgIyBUaGUgdHdvIGJyYW5jaGVzIG1heSBub3QgYmUgcmVsYXRlZCBhdCBhbGwsCisJCSAgICAjIGluIHdoaWNoIGNhc2UgbWVyZ2UgYmFzZSBzaW1wbHkgZmFpbHMgdG8gZmluZAorCQkgICAgIyBhbnksIGJ1dCB0aGF0J3MgT2suCisJCSAgICBuZXh0IGlmICgkQCk7CisKKyAgICAgICAgICAgICAgICAgICAgY2hvbXAgJGJhc2U7CisgICAgICAgICAgICAgICAgICAgIGlmICgkYmFzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbXkgQG1lcmdlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICMgcHJpbnQgIndhbnQgdG8gbG9nIGJldHdlZW4gICRiYXNlICRwYXJlbnQgXG4iOworICAgICAgICAgICAgICAgICAgICAgICAgb3BlbihHSVRMT0csICctfCcsICdnaXQtbG9nJywgJy0tcHJldHR5PW1lZGl1bScsICIkYmFzZS4uJHBhcmVudCIpCisJCQkgIG9yIGRpZSAiQ2Fubm90IGNhbGwgZ2l0LWxvZzogJCEiOworICAgICAgICAgICAgICAgICAgICAgICAgbXkgJG1lcmdlZGhhc2g7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoPEdJVExPRz4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9tcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlZmluZWQgJG1lcmdlZGhhc2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0vXmNvbW1pdFxzKyguKykkLykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1lcmdlZGhhc2ggPSAkMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGdyYWIgdGhlIGZpcnN0IGxpbmUgdGhhdCBsb29rcyBub24tcmZjODIyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWthIGhhcyBjb250ZW50IGFmdGVyIGxlYWRpbmcgc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0vXlxzKyhcUy4qKSQvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkdGl0bGUgPSAkMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aXRsZSA9IHN1YnN0cigkdGl0bGUsMCwxMDApOyAjIHRydW5jYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNoaWZ0IEBtZXJnZWQsICIkbWVyZ2VkaGFzaCAkdGl0bGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYgJG1lcmdlZGhhc2g7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSBHSVRMT0c7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQG1lcmdlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb21taXQtPnttZXJnZW1zZ30gPSAkY29tbWl0LT57bWVzc2FnZX07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbW1pdC0+e21lcmdlbXNnfSAuPSAiXG5TdW1tYXJ5IG9mIG1lcmdlZCBjb21taXRzOlxuXG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJHN1bW1hcnkgKEBtZXJnZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbW1pdC0+e21lcmdlbXNnfSAuPSAiXHQkc3VtbWFyeVxuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbW1pdC0+e21lcmdlbXNnfSAuPSAiXG5cbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmludCAiTWVzc2FnZSBmb3IgJGNvbW1pdC0+e2hhc2h9IFxuJGNvbW1pdC0+e21lcmdlbXNnfSI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjIGNvbnZlcnQgdGhlIGRhdGUgdG8gQ1ZTLWhhcHB5IGZvcm1hdAorICAgICAgICAkY29tbWl0LT57ZGF0ZX0gPSAiJDIgJDEgJDQgJDMgJDUiIGlmICggJGNvbW1pdC0+e2RhdGV9ID1+IC9eXHcrXHMrKFx3KylccysoXGQrKVxzKyhcZCs6XGQrOlxkKylccysoXGQrKVxzKyhbKy1dXGQrKSQvICk7CisKKyAgICAgICAgaWYgKCBkZWZpbmVkICggJGxhc3RwaWNrZWQgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG15ICRmaWxlcGlwZSA9IG9wZW4oRklMRUxJU1QsICctfCcsICdnaXQtZGlmZi10cmVlJywgJy16JywgJy1yJywgJGxhc3RwaWNrZWQsICRjb21taXQtPntoYXNofSkgb3IgZGllKCJDYW5ub3QgY2FsbCBnaXQtZGlmZi10cmVlIDogJCEiKTsKKwkgICAgbG9jYWwgKCQvKSA9ICJcMCI7CisgICAgICAgICAgICB3aGlsZSAoIDxGSUxFTElTVD4gKQorICAgICAgICAgICAgeworCQljaG9tcDsKKyAgICAgICAgICAgICAgICB1bmxlc3MgKCAvXjpcZHs2fVxzK1xkezN9KFxkKVxkezJ9XHMrW2EtekEtWjAtOV17NDB9XHMrKFthLXpBLVowLTldezQwfSlccysoXHcpJC9vICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRpZSgiQ291bGRuJ3QgcHJvY2VzcyBnaXQtZGlmZi10cmVlIGxpbmUgOiAkXyIpOworICAgICAgICAgICAgICAgIH0KKwkJbXkgKCRtb2RlLCAkaGFzaCwgJGNoYW5nZSkgPSAoJDEsICQyLCAkMyk7CisJCW15ICRuYW1lID0gPEZJTEVMSVNUPjsKKwkJY2hvbXAoJG5hbWUpOworCisgICAgICAgICAgICAgICAgIyAkbG9nLT5kZWJ1ZygiRmlsZSBtb2RlPSRtb2RlLCBoYXNoPSRoYXNoLCBjaGFuZ2U9JGNoYW5nZSwgbmFtZT0kbmFtZSIpOworCisgICAgICAgICAgICAgICAgbXkgJGdpdF9wZXJtcyA9ICIiOworICAgICAgICAgICAgICAgICRnaXRfcGVybXMgLj0gInIiIGlmICggJG1vZGUgJiA0ICk7CisgICAgICAgICAgICAgICAgJGdpdF9wZXJtcyAuPSAidyIgaWYgKCAkbW9kZSAmIDIgKTsKKyAgICAgICAgICAgICAgICAkZ2l0X3Blcm1zIC49ICJ4IiBpZiAoICRtb2RlICYgMSApOworICAgICAgICAgICAgICAgICRnaXRfcGVybXMgPSAicnciIGlmICggJGdpdF9wZXJtcyBlcSAiIiApOworCisgICAgICAgICAgICAgICAgaWYgKCAkY2hhbmdlIGVxICJEIiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAjJGxvZy0+ZGVidWcoIkRFTEVURSAgICRuYW1lIik7CisgICAgICAgICAgICAgICAgICAgICRoZWFkLT57JG5hbWV9ID0geworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9PiAkbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uID0+ICRoZWFkLT57JG5hbWV9e3JldmlzaW9ufSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlaGFzaCA9PiAiZGVsZXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb21taXRoYXNoID0+ICRjb21taXQtPntoYXNofSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0+ICRjb21taXQtPntkYXRlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvciA9PiAkY29tbWl0LT57YXV0aG9yfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPT4gJGdpdF9wZXJtcywKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgJHNlbGYtPmluc2VydF9yZXYoJG5hbWUsICRoZWFkLT57JG5hbWV9e3JldmlzaW9ufSwgJGhhc2gsICRjb21taXQtPntoYXNofSwgJGNvbW1pdC0+e2RhdGV9LCAkY29tbWl0LT57YXV0aG9yfSwgJGdpdF9wZXJtcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2lmICggJGNoYW5nZSBlcSAiTSIgfHwgJGNoYW5nZSBlcSAiVCIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIyRsb2ctPmRlYnVnKCJNT0RJRklFRCAkbmFtZSIpOworICAgICAgICAgICAgICAgICAgICAkaGVhZC0+eyRuYW1lfSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPT4gJG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICByZXZpc2lvbiA9PiAkaGVhZC0+eyRuYW1lfXtyZXZpc2lvbn0gKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZWhhc2ggPT4gJGhhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICBjb21taXRoYXNoID0+ICRjb21taXQtPntoYXNofSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0+ICRjb21taXQtPntkYXRlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvciA9PiAkY29tbWl0LT57YXV0aG9yfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPT4gJGdpdF9wZXJtcywKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgJHNlbGYtPmluc2VydF9yZXYoJG5hbWUsICRoZWFkLT57JG5hbWV9e3JldmlzaW9ufSwgJGhhc2gsICRjb21taXQtPntoYXNofSwgJGNvbW1pdC0+e2RhdGV9LCAkY29tbWl0LT57YXV0aG9yfSwgJGdpdF9wZXJtcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2lmICggJGNoYW5nZSBlcSAiQSIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIyRsb2ctPmRlYnVnKCJBRERFRCAgICAkbmFtZSIpOworICAgICAgICAgICAgICAgICAgICAkaGVhZC0+eyRuYW1lfSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPT4gJG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICByZXZpc2lvbiA9PiAkaGVhZC0+eyRuYW1lfXtyZXZpc2lvbn0gPyAkaGVhZC0+eyRuYW1lfXtyZXZpc2lvbn0rMSA6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlaGFzaCA9PiAkaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdGhhc2ggPT4gJGNvbW1pdC0+e2hhc2h9LAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPT4gJGNvbW1pdC0+e2RhdGV9LAorICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yID0+ICRjb21taXQtPnthdXRob3J9LAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9PiAkZ2l0X3Blcm1zLAorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAkc2VsZi0+aW5zZXJ0X3JldigkbmFtZSwgJGhlYWQtPnskbmFtZX17cmV2aXNpb259LCAkaGFzaCwgJGNvbW1pdC0+e2hhc2h9LCAkY29tbWl0LT57ZGF0ZX0sICRjb21taXQtPnthdXRob3J9LCAkZ2l0X3Blcm1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgJGxvZy0+d2FybigiVU5LTk9XTiBGSUxFIENIQU5HRSBtb2RlPSRtb2RlLCBoYXNoPSRoYXNoLCBjaGFuZ2U9JGNoYW5nZSwgbmFtZT0kbmFtZSIpOworICAgICAgICAgICAgICAgICAgICBkaWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xvc2UgRklMRUxJU1Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAjIHRoaXMgaXMgdXNlZCB0byBkZXRlY3QgZmlsZXMgcmVtb3ZlZCBmcm9tIHRoZSByZXBvCisgICAgICAgICAgICBteSAkc2Vlbl9maWxlcyA9IHt9OworCisgICAgICAgICAgICBteSAkZmlsZXBpcGUgPSBvcGVuKEZJTEVMSVNULCAnLXwnLCAnZ2l0LWxzLXRyZWUnLCAnLXonLCAnLXInLCAkY29tbWl0LT57aGFzaH0pIG9yIGRpZSgiQ2Fubm90IGNhbGwgZ2l0LWxzLXRyZWUgOiAkISIpOworCSAgICBsb2NhbCAkLyA9ICJcMCI7CisgICAgICAgICAgICB3aGlsZSAoIDxGSUxFTElTVD4gKQorICAgICAgICAgICAgeworCQljaG9tcDsKKyAgICAgICAgICAgICAgICB1bmxlc3MgKCAvXihcZCspXHMrKFx3KylccysoW2EtekEtWjAtOV0rKVx0KC4qKSQvbyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkaWUoIkNvdWxkbid0IHByb2Nlc3MgZ2l0LWxzLXRyZWUgbGluZSA6ICRfIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbXkgKCAkZ2l0X3Blcm1zLCAkZ2l0X3R5cGUsICRnaXRfaGFzaCwgJGdpdF9maWxlbmFtZSApID0gKCAkMSwgJDIsICQzLCAkNCApOworCisgICAgICAgICAgICAgICAgJHNlZW5fZmlsZXMtPnskZ2l0X2ZpbGVuYW1lfSA9IDE7CisKKyAgICAgICAgICAgICAgICBteSAoICRvbGRoYXNoLCAkb2xkcmV2aXNpb24sICRvbGRtb2RlICkgPSAoCisgICAgICAgICAgICAgICAgICAgICRoZWFkLT57JGdpdF9maWxlbmFtZX17ZmlsZWhhc2h9LAorICAgICAgICAgICAgICAgICAgICAkaGVhZC0+eyRnaXRfZmlsZW5hbWV9e3JldmlzaW9ufSwKKyAgICAgICAgICAgICAgICAgICAgJGhlYWQtPnskZ2l0X2ZpbGVuYW1lfXttb2RlfQorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICBpZiAoICRnaXRfcGVybXMgPX4gL15cZFxkXGQoXGQpXGRcZC9vICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICRnaXRfcGVybXMgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgJGdpdF9wZXJtcyAuPSAiciIgaWYgKCAkMSAmIDQgKTsKKyAgICAgICAgICAgICAgICAgICAgJGdpdF9wZXJtcyAuPSAidyIgaWYgKCAkMSAmIDIgKTsKKyAgICAgICAgICAgICAgICAgICAgJGdpdF9wZXJtcyAuPSAieCIgaWYgKCAkMSAmIDEgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkZ2l0X3Blcm1zID0gInJ3IjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAjIHVubGVzcyB0aGUgZmlsZSBleGlzdHMgd2l0aCB0aGUgc2FtZSBoYXNoLCB3ZSBuZWVkIHRvIHVwZGF0ZSBpdCAuLi4KKyAgICAgICAgICAgICAgICB1bmxlc3MgKCBkZWZpbmVkKCRvbGRoYXNoKSBhbmQgJG9sZGhhc2ggZXEgJGdpdF9oYXNoIGFuZCBkZWZpbmVkKCRvbGRtb2RlKSBhbmQgJG9sZG1vZGUgZXEgJGdpdF9wZXJtcyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBteSAkbmV3cmV2aXNpb24gPSAoICRvbGRyZXZpc2lvbiBvciAwICkgKyAxOworCisgICAgICAgICAgICAgICAgICAgICRoZWFkLT57JGdpdF9maWxlbmFtZX0gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0+ICRnaXRfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICByZXZpc2lvbiA9PiAkbmV3cmV2aXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlaGFzaCA9PiAkZ2l0X2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICBjb21taXRoYXNoID0+ICRjb21taXQtPntoYXNofSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0+ICRjb21taXQtPntkYXRlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvciA9PiAkY29tbWl0LT57YXV0aG9yfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPT4gJGdpdF9wZXJtcywKKyAgICAgICAgICAgICAgICAgICAgfTsKKworCisgICAgICAgICAgICAgICAgICAgICRzZWxmLT5pbnNlcnRfcmV2KCRnaXRfZmlsZW5hbWUsICRuZXdyZXZpc2lvbiwgJGdpdF9oYXNoLCAkY29tbWl0LT57aGFzaH0sICRjb21taXQtPntkYXRlfSwgJGNvbW1pdC0+e2F1dGhvcn0sICRnaXRfcGVybXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsb3NlIEZJTEVMSVNUOworCisgICAgICAgICAgICAjIERldGVjdCBkZWxldGVkIGZpbGVzCisgICAgICAgICAgICBmb3JlYWNoIG15ICRmaWxlICgga2V5cyAlJGhlYWQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVubGVzcyAoIGV4aXN0cyAkc2Vlbl9maWxlcy0+eyRmaWxlfSBvciAkaGVhZC0+eyRmaWxlfXtmaWxlaGFzaH0gZXEgImRlbGV0ZWQiICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e3JldmlzaW9ufSsrOworICAgICAgICAgICAgICAgICAgICAkaGVhZC0+eyRmaWxlfXtmaWxlaGFzaH0gPSAiZGVsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e2NvbW1pdGhhc2h9ID0gJGNvbW1pdC0+e2hhc2h9OworICAgICAgICAgICAgICAgICAgICAkaGVhZC0+eyRmaWxlfXttb2RpZmllZH0gPSAkY29tbWl0LT57ZGF0ZX07CisgICAgICAgICAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e2F1dGhvcn0gPSAkY29tbWl0LT57YXV0aG9yfTsKKworICAgICAgICAgICAgICAgICAgICAkc2VsZi0+aW5zZXJ0X3JldigkZmlsZSwgJGhlYWQtPnskZmlsZX17cmV2aXNpb259LCAkaGVhZC0+eyRmaWxlfXtmaWxlaGFzaH0sICRjb21taXQtPntoYXNofSwgJGNvbW1pdC0+e2RhdGV9LCAkY29tbWl0LT57YXV0aG9yfSwgJGhlYWQtPnskZmlsZX17bW9kZX0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICMgRU5EIDogIkRldGVjdCBkZWxldGVkIGZpbGVzIgorICAgICAgICB9CisKKworICAgICAgICBpZiAoZXhpc3RzICRjb21taXQtPnttZXJnZW1zZ30pCisgICAgICAgIHsKKyAgICAgICAgICAgICRzZWxmLT5pbnNlcnRfbWVyZ2Vsb2coJGNvbW1pdC0+e2hhc2h9LCAkY29tbWl0LT57bWVyZ2Vtc2d9KTsKKyAgICAgICAgfQorCisgICAgICAgICRsYXN0cGlja2VkID0gJGNvbW1pdC0+e2hhc2h9OworCisgICAgICAgICRzZWxmLT5fc2V0X3Byb3AoImxhc3RfY29tbWl0IiwgJGNvbW1pdC0+e2hhc2h9KTsKKyAgICB9CisKKyAgICAkc2VsZi0+ZGVsZXRlX2hlYWQoKTsKKyAgICBmb3JlYWNoIG15ICRmaWxlICgga2V5cyAlJGhlYWQgKQorICAgIHsKKyAgICAgICAgJHNlbGYtPmluc2VydF9oZWFkKAorICAgICAgICAgICAgJGZpbGUsCisgICAgICAgICAgICAkaGVhZC0+eyRmaWxlfXtyZXZpc2lvbn0sCisgICAgICAgICAgICAkaGVhZC0+eyRmaWxlfXtmaWxlaGFzaH0sCisgICAgICAgICAgICAkaGVhZC0+eyRmaWxlfXtjb21taXRoYXNofSwKKyAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e21vZGlmaWVkfSwKKyAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e2F1dGhvcn0sCisgICAgICAgICAgICAkaGVhZC0+eyRmaWxlfXttb2RlfSwKKyAgICAgICAgKTsKKyAgICB9CisgICAgIyBpbnZhbGlkYXRlIHRoZSBnZXRoZWFkIGNhY2hlCisgICAgJHNlbGYtPntnZXRoZWFkX2NhY2hlfSA9IHVuZGVmOworCisKKyAgICAjIEVuZGluZyBleGNsdXNpdmUgbG9jayBoZXJlCisgICAgJHNlbGYtPntkYmh9LT5jb21taXQoKSBvciBkaWUgIkZhaWxlZCB0byBjb21taXQgY2hhbmdlcyB0byBTUUxpdGUiOworfQorCitzdWIgaW5zZXJ0X3JldgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJG5hbWUgPSBzaGlmdDsKKyAgICBteSAkcmV2aXNpb24gPSBzaGlmdDsKKyAgICBteSAkZmlsZWhhc2ggPSBzaGlmdDsKKyAgICBteSAkY29tbWl0aGFzaCA9IHNoaWZ0OworICAgIG15ICRtb2RpZmllZCA9IHNoaWZ0OworICAgIG15ICRhdXRob3IgPSBzaGlmdDsKKyAgICBteSAkbW9kZSA9IHNoaWZ0OworICAgIG15ICR0YWJsZW5hbWUgPSAkc2VsZi0+dGFibGVuYW1lKCJyZXZpc2lvbiIpOworCisgICAgbXkgJGluc2VydF9yZXYgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJJTlNFUlQgSU5UTyAkdGFibGVuYW1lIChuYW1lLCByZXZpc2lvbiwgZmlsZWhhc2gsIGNvbW1pdGhhc2gsIG1vZGlmaWVkLCBhdXRob3IsIG1vZGUpIFZBTFVFUyAoPyw/LD8sPyw/LD8sPykiLHt9LDEpOworICAgICRpbnNlcnRfcmV2LT5leGVjdXRlKCRuYW1lLCAkcmV2aXNpb24sICRmaWxlaGFzaCwgJGNvbW1pdGhhc2gsICRtb2RpZmllZCwgJGF1dGhvciwgJG1vZGUpOworfQorCitzdWIgaW5zZXJ0X21lcmdlbG9nCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAka2V5ID0gc2hpZnQ7CisgICAgbXkgJHZhbHVlID0gc2hpZnQ7CisgICAgbXkgJHRhYmxlbmFtZSA9ICRzZWxmLT50YWJsZW5hbWUoImNvbW1pdG1zZ3MiKTsKKworICAgIG15ICRpbnNlcnRfbWVyZ2Vsb2cgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJJTlNFUlQgSU5UTyAkdGFibGVuYW1lIChrZXksIHZhbHVlKSBWQUxVRVMgKD8sPykiLHt9LDEpOworICAgICRpbnNlcnRfbWVyZ2Vsb2ctPmV4ZWN1dGUoJGtleSwgJHZhbHVlKTsKK30KKworc3ViIGRlbGV0ZV9oZWFkCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkdGFibGVuYW1lID0gJHNlbGYtPnRhYmxlbmFtZSgiaGVhZCIpOworCisgICAgbXkgJGRlbGV0ZV9oZWFkID0gJHNlbGYtPntkYmh9LT5wcmVwYXJlX2NhY2hlZCgiREVMRVRFIEZST00gJHRhYmxlbmFtZSIse30sMSk7CisgICAgJGRlbGV0ZV9oZWFkLT5leGVjdXRlKCk7Cit9CisKK3N1YiBpbnNlcnRfaGVhZAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJG5hbWUgPSBzaGlmdDsKKyAgICBteSAkcmV2aXNpb24gPSBzaGlmdDsKKyAgICBteSAkZmlsZWhhc2ggPSBzaGlmdDsKKyAgICBteSAkY29tbWl0aGFzaCA9IHNoaWZ0OworICAgIG15ICRtb2RpZmllZCA9IHNoaWZ0OworICAgIG15ICRhdXRob3IgPSBzaGlmdDsKKyAgICBteSAkbW9kZSA9IHNoaWZ0OworICAgIG15ICR0YWJsZW5hbWUgPSAkc2VsZi0+dGFibGVuYW1lKCJoZWFkIik7CisKKyAgICBteSAkaW5zZXJ0X2hlYWQgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJJTlNFUlQgSU5UTyAkdGFibGVuYW1lIChuYW1lLCByZXZpc2lvbiwgZmlsZWhhc2gsIGNvbW1pdGhhc2gsIG1vZGlmaWVkLCBhdXRob3IsIG1vZGUpIFZBTFVFUyAoPyw/LD8sPyw/LD8sPykiLHt9LDEpOworICAgICRpbnNlcnRfaGVhZC0+ZXhlY3V0ZSgkbmFtZSwgJHJldmlzaW9uLCAkZmlsZWhhc2gsICRjb21taXRoYXNoLCAkbW9kaWZpZWQsICRhdXRob3IsICRtb2RlKTsKK30KKworc3ViIF9oZWFkcmV2Cit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkZmlsZW5hbWUgPSBzaGlmdDsKKyAgICBteSAkdGFibGVuYW1lID0gJHNlbGYtPnRhYmxlbmFtZSgiaGVhZCIpOworCisgICAgbXkgJGRiX3F1ZXJ5ID0gJHNlbGYtPntkYmh9LT5wcmVwYXJlX2NhY2hlZCgiU0VMRUNUIGZpbGVoYXNoLCByZXZpc2lvbiwgbW9kZSBGUk9NICR0YWJsZW5hbWUgV0hFUkUgbmFtZT0/Iix7fSwxKTsKKyAgICAkZGJfcXVlcnktPmV4ZWN1dGUoJGZpbGVuYW1lKTsKKyAgICBteSAoICRoYXNoLCAkcmV2aXNpb24sICRtb2RlICkgPSAkZGJfcXVlcnktPmZldGNocm93X2FycmF5OworCisgICAgcmV0dXJuICggJGhhc2gsICRyZXZpc2lvbiwgJG1vZGUgKTsKK30KKworc3ViIF9nZXRfcHJvcAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGtleSA9IHNoaWZ0OworICAgIG15ICR0YWJsZW5hbWUgPSAkc2VsZi0+dGFibGVuYW1lKCJwcm9wZXJ0aWVzIik7CisKKyAgICBteSAkZGJfcXVlcnkgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJTRUxFQ1QgdmFsdWUgRlJPTSAkdGFibGVuYW1lIFdIRVJFIGtleT0/Iix7fSwxKTsKKyAgICAkZGJfcXVlcnktPmV4ZWN1dGUoJGtleSk7CisgICAgbXkgKCAkdmFsdWUgKSA9ICRkYl9xdWVyeS0+ZmV0Y2hyb3dfYXJyYXk7CisKKyAgICByZXR1cm4gJHZhbHVlOworfQorCitzdWIgX3NldF9wcm9wCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAka2V5ID0gc2hpZnQ7CisgICAgbXkgJHZhbHVlID0gc2hpZnQ7CisgICAgbXkgJHRhYmxlbmFtZSA9ICRzZWxmLT50YWJsZW5hbWUoInByb3BlcnRpZXMiKTsKKworICAgIG15ICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlVQREFURSAkdGFibGVuYW1lIFNFVCB2YWx1ZT0/IFdIRVJFIGtleT0/Iix7fSwxKTsKKyAgICAkZGJfcXVlcnktPmV4ZWN1dGUoJHZhbHVlLCAka2V5KTsKKworICAgIHVubGVzcyAoICRkYl9xdWVyeS0+cm93cyApCisgICAgeworICAgICAgICAkZGJfcXVlcnkgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJJTlNFUlQgSU5UTyAkdGFibGVuYW1lIChrZXksIHZhbHVlKSBWQUxVRVMgKD8sPykiLHt9LDEpOworICAgICAgICAkZGJfcXVlcnktPmV4ZWN1dGUoJGtleSwgJHZhbHVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gJHZhbHVlOworfQorCis9aGVhZDIgZ2V0aGVhZAorCis9Y3V0CisKK3N1YiBnZXRoZWFkCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkdGFibGVuYW1lID0gJHNlbGYtPnRhYmxlbmFtZSgiaGVhZCIpOworCisgICAgcmV0dXJuICRzZWxmLT57Z2V0aGVhZF9jYWNoZX0gaWYgKCBkZWZpbmVkICggJHNlbGYtPntnZXRoZWFkX2NhY2hlfSApICk7CisKKyAgICBteSAkZGJfcXVlcnkgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJTRUxFQ1QgbmFtZSwgZmlsZWhhc2gsIG1vZGUsIHJldmlzaW9uLCBtb2RpZmllZCwgY29tbWl0aGFzaCwgYXV0aG9yIEZST00gJHRhYmxlbmFtZSBPUkRFUiBCWSBuYW1lIEFTQyIse30sMSk7CisgICAgJGRiX3F1ZXJ5LT5leGVjdXRlKCk7CisKKyAgICBteSAkdHJlZSA9IFtdOworICAgIHdoaWxlICggbXkgJGZpbGUgPSAkZGJfcXVlcnktPmZldGNocm93X2hhc2hyZWYgKQorICAgIHsKKyAgICAgICAgcHVzaCBAJHRyZWUsICRmaWxlOworICAgIH0KKworICAgICRzZWxmLT57Z2V0aGVhZF9jYWNoZX0gPSAkdHJlZTsKKworICAgIHJldHVybiAkdHJlZTsKK30KKworPWhlYWQyIGdldGxvZworCis9Y3V0CisKK3N1YiBnZXRsb2cKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRmaWxlbmFtZSA9IHNoaWZ0OworICAgIG15ICR0YWJsZW5hbWUgPSAkc2VsZi0+dGFibGVuYW1lKCJyZXZpc2lvbiIpOworCisgICAgbXkgJGRiX3F1ZXJ5ID0gJHNlbGYtPntkYmh9LT5wcmVwYXJlX2NhY2hlZCgiU0VMRUNUIG5hbWUsIGZpbGVoYXNoLCBhdXRob3IsIG1vZGUsIHJldmlzaW9uLCBtb2RpZmllZCwgY29tbWl0aGFzaCBGUk9NICR0YWJsZW5hbWUgV0hFUkUgbmFtZT0/IE9SREVSIEJZIHJldmlzaW9uIERFU0MiLHt9LDEpOworICAgICRkYl9xdWVyeS0+ZXhlY3V0ZSgkZmlsZW5hbWUpOworCisgICAgbXkgJHRyZWUgPSBbXTsKKyAgICB3aGlsZSAoIG15ICRmaWxlID0gJGRiX3F1ZXJ5LT5mZXRjaHJvd19oYXNocmVmICkKKyAgICB7CisgICAgICAgIHB1c2ggQCR0cmVlLCAkZmlsZTsKKyAgICB9CisKKyAgICByZXR1cm4gJHRyZWU7Cit9CisKKz1oZWFkMiBnZXRtZXRhCisKK1RoaXMgZnVuY3Rpb24gdGFrZXMgYSBmaWxlbmFtZSAod2l0aCBwYXRoKSBhcmd1bWVudCBhbmQgcmV0dXJucyBhIGhhc2hyZWYgb2YKK21ldGFkYXRhIGZvciB0aGF0IGZpbGUuCisKKz1jdXQKKworc3ViIGdldG1ldGEKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRmaWxlbmFtZSA9IHNoaWZ0OworICAgIG15ICRyZXZpc2lvbiA9IHNoaWZ0OworICAgIG15ICR0YWJsZW5hbWVfcmV2ID0gJHNlbGYtPnRhYmxlbmFtZSgicmV2aXNpb24iKTsKKyAgICBteSAkdGFibGVuYW1lX2hlYWQgPSAkc2VsZi0+dGFibGVuYW1lKCJoZWFkIik7CisKKyAgICBteSAkZGJfcXVlcnk7CisgICAgaWYgKCBkZWZpbmVkKCRyZXZpc2lvbikgYW5kICRyZXZpc2lvbiA9fiAvXlxkKyQvICkKKyAgICB7CisgICAgICAgICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlNFTEVDVCAqIEZST00gJHRhYmxlbmFtZV9yZXYgV0hFUkUgbmFtZT0/IEFORCByZXZpc2lvbj0/Iix7fSwxKTsKKyAgICAgICAgJGRiX3F1ZXJ5LT5leGVjdXRlKCRmaWxlbmFtZSwgJHJldmlzaW9uKTsKKyAgICB9CisgICAgZWxzaWYgKCBkZWZpbmVkKCRyZXZpc2lvbikgYW5kICRyZXZpc2lvbiA9fiAvXlthLXpBLVowLTldezQwfSQvICkKKyAgICB7CisgICAgICAgICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlNFTEVDVCAqIEZST00gJHRhYmxlbmFtZV9yZXYgV0hFUkUgbmFtZT0/IEFORCBjb21taXRoYXNoPT8iLHt9LDEpOworICAgICAgICAkZGJfcXVlcnktPmV4ZWN1dGUoJGZpbGVuYW1lLCAkcmV2aXNpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlNFTEVDVCAqIEZST00gJHRhYmxlbmFtZV9oZWFkIFdIRVJFIG5hbWU9PyIse30sMSk7CisgICAgICAgICRkYl9xdWVyeS0+ZXhlY3V0ZSgkZmlsZW5hbWUpOworICAgIH0KKworICAgIHJldHVybiAkZGJfcXVlcnktPmZldGNocm93X2hhc2hyZWY7Cit9CisKKz1oZWFkMiBjb21taXRtZXNzYWdlCisKK3RoaXMgZnVuY3Rpb24gdGFrZXMgYSBjb21taXRoYXNoIGFuZCByZXR1cm5zIHRoZSBjb21taXQgbWVzc2FnZSBmb3IgdGhhdCBjb21taXQKKworPWN1dAorc3ViIGNvbW1pdG1lc3NhZ2UKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRjb21taXRoYXNoID0gc2hpZnQ7CisgICAgbXkgJHRhYmxlbmFtZSA9ICRzZWxmLT50YWJsZW5hbWUoImNvbW1pdG1zZ3MiKTsKKworICAgIGRpZSgiTmVlZCBjb21taXRoYXNoIikgdW5sZXNzICggZGVmaW5lZCgkY29tbWl0aGFzaCkgYW5kICRjb21taXRoYXNoID1+IC9eW2EtekEtWjAtOV17NDB9JC8gKTsKKworICAgIG15ICRkYl9xdWVyeTsKKyAgICAkZGJfcXVlcnkgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJTRUxFQ1QgdmFsdWUgRlJPTSAkdGFibGVuYW1lIFdIRVJFIGtleT0/Iix7fSwxKTsKKyAgICAkZGJfcXVlcnktPmV4ZWN1dGUoJGNvbW1pdGhhc2gpOworCisgICAgbXkgKCAkbWVzc2FnZSApID0gJGRiX3F1ZXJ5LT5mZXRjaHJvd19hcnJheTsKKworICAgIGlmICggZGVmaW5lZCAoICRtZXNzYWdlICkgKQorICAgIHsKKyAgICAgICAgJG1lc3NhZ2UgLj0gIiAiIGlmICggJG1lc3NhZ2UgPX4gL1xuJC8gKTsKKyAgICAgICAgcmV0dXJuICRtZXNzYWdlOworICAgIH0KKworICAgIG15IEBsaW5lcyA9IHNhZmVfcGlwZV9jYXB0dXJlKCJnaXQtY2F0LWZpbGUiLCAiY29tbWl0IiwgJGNvbW1pdGhhc2gpOworICAgIHNoaWZ0IEBsaW5lcyB3aGlsZSAoICRsaW5lc1swXSA9fiAvXFMvICk7CisgICAgJG1lc3NhZ2UgPSBqb2luKCIiLEBsaW5lcyk7CisgICAgJG1lc3NhZ2UgLj0gIiAiIGlmICggJG1lc3NhZ2UgPX4gL1xuJC8gKTsKKyAgICByZXR1cm4gJG1lc3NhZ2U7Cit9CisKKz1oZWFkMiBnZXRoaXN0b3J5CisKK1RoaXMgZnVuY3Rpb24gdGFrZXMgYSBmaWxlbmFtZSAod2l0aCBwYXRoKSBhcmd1bWVudCBhbmQgcmV0dXJucyBhbiBhcnJheW9mYXJyYXlzCitjb250YWluaW5nIHJldmlzaW9uLGZpbGVoYXNoLGNvbW1pdGhhc2ggb3JkZXJlZCBieSByZXZpc2lvbiBkZXNjZW5kaW5nCisKKz1jdXQKK3N1YiBnZXRoaXN0b3J5Cit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkZmlsZW5hbWUgPSBzaGlmdDsKKyAgICBteSAkdGFibGVuYW1lID0gJHNlbGYtPnRhYmxlbmFtZSgicmV2aXNpb24iKTsKKworICAgIG15ICRkYl9xdWVyeTsKKyAgICAkZGJfcXVlcnkgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJTRUxFQ1QgcmV2aXNpb24sIGZpbGVoYXNoLCBjb21taXRoYXNoIEZST00gJHRhYmxlbmFtZSBXSEVSRSBuYW1lPT8gT1JERVIgQlkgcmV2aXNpb24gREVTQyIse30sMSk7CisgICAgJGRiX3F1ZXJ5LT5leGVjdXRlKCRmaWxlbmFtZSk7CisKKyAgICByZXR1cm4gJGRiX3F1ZXJ5LT5mZXRjaGFsbF9hcnJheXJlZjsKK30KKworPWhlYWQyIGdldGhpc3RvcnlkZW5zZQorCitUaGlzIGZ1bmN0aW9uIHRha2VzIGEgZmlsZW5hbWUgKHdpdGggcGF0aCkgYXJndW1lbnQgYW5kIHJldHVybnMgYW4gYXJyYXlvZmFycmF5cworY29udGFpbmluZyByZXZpc2lvbixmaWxlaGFzaCxjb21taXRoYXNoIG9yZGVyZWQgYnkgcmV2aXNpb24gZGVzY2VuZGluZy4KKworVGhpcyB2ZXJzaW9uIG9mIGdldGhpc3Rvcnkgc2tpcHMgZGVsZXRlZCBlbnRyaWVzIC0tIHNvIGl0IGlzIHVzZWZ1bCBmb3IgYW5ub3RhdGUuCitUaGUgJ2RlbnNlJyBwYXJ0IGlzIGEgcmVmZXJlbmNlIHRvIGEgJy0tZGVuc2UnIG9wdGlvbiBhdmFpbGFibGUgZm9yIGdpdC1yZXYtbGlzdAorYW5kIG90aGVyIGdpdCB0b29scyB0aGF0IGRlcGVuZCBvbiBpdC4KKworPWN1dAorc3ViIGdldGhpc3RvcnlkZW5zZQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGZpbGVuYW1lID0gc2hpZnQ7CisgICAgbXkgJHRhYmxlbmFtZSA9ICRzZWxmLT50YWJsZW5hbWUoInJldmlzaW9uIik7CisKKyAgICBteSAkZGJfcXVlcnk7CisgICAgJGRiX3F1ZXJ5ID0gJHNlbGYtPntkYmh9LT5wcmVwYXJlX2NhY2hlZCgiU0VMRUNUIHJldmlzaW9uLCBmaWxlaGFzaCwgY29tbWl0aGFzaCBGUk9NICR0YWJsZW5hbWUgV0hFUkUgbmFtZT0/IEFORCBmaWxlaGFzaCE9J2RlbGV0ZWQnIE9SREVSIEJZIHJldmlzaW9uIERFU0MiLHt9LDEpOworICAgICRkYl9xdWVyeS0+ZXhlY3V0ZSgkZmlsZW5hbWUpOworCisgICAgcmV0dXJuICRkYl9xdWVyeS0+ZmV0Y2hhbGxfYXJyYXlyZWY7Cit9CisKKz1oZWFkMiBpbl9hcnJheSgpCisKK2Zyb20gQXJyYXk6OlBBVCAtIG1pbWljcyB0aGUgaW5fYXJyYXkoKSBmdW5jdGlvbgorZm91bmQgaW4gUEhQLiBZdWNrIGJ1dCB3b3JrcyBmb3Igc21hbGwgYXJyYXlzLgorCis9Y3V0CitzdWIgaW5fYXJyYXkKK3sKKyAgICBteSAoJGNoZWNrLCBAYXJyYXkpID0gQF87CisgICAgbXkgJHJldHZhbCA9IDA7CisgICAgZm9yZWFjaCBteSAkdGVzdCAoQGFycmF5KXsKKyAgICAgICAgaWYoJGNoZWNrIGVxICR0ZXN0KXsKKyAgICAgICAgICAgICRyZXR2YWwgPSAgMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gJHJldHZhbDsKK30KKworPWhlYWQyIHNhZmVfcGlwZV9jYXB0dXJlCisKK2FuIGFsdGVybmF0aXZlIHRvIGBjb21tYW5kYCB0aGF0IGFsbG93cyBpbnB1dCB0byBiZSBwYXNzZWQgYXMgYW4gYXJyYXkKK3RvIHdvcmsgYXJvdW5kIHNoZWxsIHByb2JsZW1zIHdpdGggd2VpcmQgY2hhcmFjdGVycyBpbiBhcmd1bWVudHMKKworPWN1dAorc3ViIHNhZmVfcGlwZV9jYXB0dXJlIHsKKworICAgIG15IEBvdXRwdXQ7CisKKyAgICBpZiAobXkgJHBpZCA9IG9wZW4gbXkgJGNoaWxkLCAnLXwnKSB7CisgICAgICAgIEBvdXRwdXQgPSAoPCRjaGlsZD4pOworICAgICAgICBjbG9zZSAkY2hpbGQgb3IgZGllIGpvaW4oJyAnLEBfKS4iOiAkISAkPyI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXhlYyhAXykgb3IgZGllICIkISAkPyI7ICMgZXhlYygpIGNhbiBmYWlsIHRoZSBleGVjdXRhYmxlIGNhbid0IGJlIGZvdW5kCisgICAgfQorICAgIHJldHVybiB3YW50YXJyYXkgPyBAb3V0cHV0IDogam9pbignJyxAb3V0cHV0KTsKK30KKworPWhlYWQyIG1hbmdsZV9kaXJuYW1lCisKK2NyZWF0ZSBhIHN0cmluZyBmcm9tIGEgZGlyZWN0b3J5IG5hbWUgdGhhdCBpcyBzdWl0YWJsZSB0byB1c2UgYXMKK3BhcnQgb2YgYSBmaWxlbmFtZSwgbWFpbmx5IGJ5IGNvbnZlcnRpbmcgYWxsIGNoYXJzIGV4Y2VwdCBcdy4tIHRvIF8KKworPWN1dAorc3ViIG1hbmdsZV9kaXJuYW1lIHsKKyAgICBteSAkZGlybmFtZSA9IHNoaWZ0OworICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkZGlybmFtZTsKKworICAgICRkaXJuYW1lID1+IHMvW15cdy4tXS9fL2c7CisKKyAgICByZXR1cm4gJGRpcm5hbWU7Cit9CisKKz1oZWFkMiBtYW5nbGVfdGFibGVuYW1lCisKK2NyZWF0ZSBhIHN0cmluZyBmcm9tIGEgdGhhdCBpcyBzdWl0YWJsZSB0byB1c2UgYXMgcGFydCBvZiBhbiBTUUwgdGFibGUKK25hbWUsIG1haW5seSBieSBjb252ZXJ0aW5nIGFsbCBjaGFycyBleGNlcHQgXHcgdG8gXworCis9Y3V0CitzdWIgbWFuZ2xlX3RhYmxlbmFtZSB7CisgICAgbXkgJHRhYmxlbmFtZSA9IHNoaWZ0OworICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkdGFibGVuYW1lOworCisgICAgJHRhYmxlbmFtZSA9fiBzL1teXHdfXS9fL2c7CisKKyAgICByZXR1cm4gJHRhYmxlbmFtZTsKK30KKworMTsKZGlmZiAtLWdpdCBhL2dpdC1maWx0ZXItYnJhbmNoLnNoIGIvZ2l0LWZpbHRlci1icmFuY2guc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWE1OTAxNQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1maWx0ZXItYnJhbmNoLnNoCkBAIC0wLDAgKzEsNDMxIEBACisjIS9iaW4vc2gKKyMKKyMgUmV3cml0ZSByZXZpc2lvbiBoaXN0b3J5CisjIENvcHlyaWdodCAoYykgUGV0ciBCYXVkaXMsIDIwMDYKKyMgTWluaW1hbCBjaGFuZ2VzIHRvICJwb3J0IiBpdCB0byBjb3JlLWdpdCAoYykgSm9oYW5uZXMgU2NoaW5kZWxpbiwgMjAwNworIworIyBMZXRzIHlvdSByZXdyaXRlIHRoZSByZXZpc2lvbiBoaXN0b3J5IG9mIHRoZSBjdXJyZW50IGJyYW5jaCwgY3JlYXRpbmcKKyMgYSBuZXcgYnJhbmNoLiBZb3UgY2FuIHNwZWNpZnkgYSBudW1iZXIgb2YgZmlsdGVycyB0byBtb2RpZnkgdGhlIGNvbW1pdHMsCisjIGZpbGVzIGFuZCB0cmVlcy4KKworIyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB3aWxsIGFsc28gYmUgYXZhaWxhYmxlIGluIHRoZSBjb21taXQgZmlsdGVyOgorCitmdW5jdGlvbnM9JChjYXQgPDwgXEVPRgord2FybiAoKSB7CisgICAgICAgIGVjaG8gIiQqIiA+JjIKK30KKworbWFwKCkKK3sKKwkjIGlmIGl0IHdhcyBub3QgcmV3cml0dGVuLCB0YWtlIHRoZSBvcmlnaW5hbAorCWlmIHRlc3QgLXIgIiR3b3JrZGlyLy4uL21hcC8kMSIKKwl0aGVuCisJCWNhdCAiJHdvcmtkaXIvLi4vbWFwLyQxIgorCWVsc2UKKwkJZWNobyAiJDEiCisJZmkKK30KKworIyBpZiB5b3UgcnVuICdza2lwX2NvbW1pdCAiJEAiJyBpbiBhIGNvbW1pdCBmaWx0ZXIsIGl0IHdpbGwgcHJpbnQKKyMgdGhlIChtYXBwZWQpIHBhcmVudHMsIGVmZmVjdGl2ZWx5IHNraXBwaW5nIHRoZSBjb21taXQuCisKK3NraXBfY29tbWl0KCkKK3sKKwlzaGlmdDsKKwl3aGlsZSBbIC1uICIkMSIgXTsKKwlkbworCQlzaGlmdDsKKwkJbWFwICIkMSI7CisJCXNoaWZ0OworCWRvbmU7Cit9CisKKyMgb3ZlcnJpZGUgZGllKCk6IHRoaXMgdmVyc2lvbiBwdXRzIGluIGFuIGV4dHJhIGxpbmUgYnJlYWssIHNvIHRoYXQKKyMgdGhlIHByb2dyZXNzIGlzIHN0aWxsIHZpc2libGUKKworZGllKCkKK3sKKwllY2hvID4mMgorCWVjaG8gIiQqIiA+JjIKKwlleGl0IDEKK30KK0VPRgorKQorCitldmFsICIkZnVuY3Rpb25zIgorCisjIFdoZW4gcGlwZWQgYSBjb21taXQsIG91dHB1dCBhIHNjcmlwdCB0byBzZXQgdGhlIGlkZW50IG9mIGVpdGhlcgorIyAiYXV0aG9yIiBvciAiY29tbWl0dGVyCisKK3NldF9pZGVudCAoKSB7CisJbGlkPSIkKGVjaG8gIiQxIiB8IHRyICJbQS1aXSIgIlthLXpdIikiCisJdWlkPSIkKGVjaG8gIiQxIiB8IHRyICJbYS16XSIgIltBLVpdIikiCisJcGlja19pZF9zY3JpcHQ9JworCQkvXickbGlkJyAveworCQkJcy8nXCcnLydcJydcXCdcJ1wnJy9nCisJCQloCisJCQlzL14nJGxpZCcgXChbXjxdKlwpIDxbXj5dKj4gLiokL1wxLworCQkJcy8nXCcnLydcJydcJ1wnXCcnL2cKKwkJCXMvLiovR0lUXyckdWlkJ19OQU1FPSdcJycmJ1wnJzsgZXhwb3J0IEdJVF8nJHVpZCdfTkFNRS9wCisKKwkJCWcKKwkJCXMvXickbGlkJyBbXjxdKiA8XChbXj5dKlwpPiAuKiQvXDEvCisJCQlzLydcJycvJ1wnJ1wnXCdcJycvZworCQkJcy8uKi9HSVRfJyR1aWQnX0VNQUlMPSdcJycmJ1wnJzsgZXhwb3J0IEdJVF8nJHVpZCdfRU1BSUwvcAorCisJCQlnCisJCQlzL14nJGxpZCcgW148XSogPFtePl0qPiBcKC4qXCkkL1wxLworCQkJcy8nXCcnLydcJydcJ1wnXCcnL2cKKwkJCXMvLiovR0lUXyckdWlkJ19EQVRFPSdcJycmJ1wnJzsgZXhwb3J0IEdJVF8nJHVpZCdfREFURS9wCisKKwkJCXEKKwkJfQorCScKKworCUxBTkc9QyBMQ19BTEw9QyBzZWQgLW5lICIkcGlja19pZF9zY3JpcHQiCisJIyBFbnN1cmUgbm9uLWVtcHR5IGlkIG5hbWUuCisJZWNobyAiY2FzZSBcIlwkR0lUXyR7dWlkfV9OQU1FXCIgaW4gXCJcIikgR0lUXyR7dWlkfV9OQU1FPVwiXCR7R0lUXyR7dWlkfV9FTUFJTCUlQCp9XCIgJiYgZXhwb3J0IEdJVF8ke3VpZH1fTkFNRTs7IGVzYWMiCit9CisKK1VTQUdFPSJbLS1lbnYtZmlsdGVyIDxjb21tYW5kPl0gWy0tdHJlZS1maWx0ZXIgPGNvbW1hbmQ+XSBcCitbLS1pbmRleC1maWx0ZXIgPGNvbW1hbmQ+XSBbLS1wYXJlbnQtZmlsdGVyIDxjb21tYW5kPl0gXAorWy0tbXNnLWZpbHRlciA8Y29tbWFuZD5dIFstLWNvbW1pdC1maWx0ZXIgPGNvbW1hbmQ+XSBcCitbLS10YWctbmFtZS1maWx0ZXIgPGNvbW1hbmQ+XSBbLS1zdWJkaXJlY3RvcnktZmlsdGVyIDxkaXJlY3Rvcnk+XSBcCitbLS1vcmlnaW5hbCA8bmFtZXNwYWNlPl0gWy1kIDxkaXJlY3Rvcnk+XSBbLWYgfCAtLWZvcmNlXSBcCitbPHJldi1saXN0IG9wdGlvbnM+Li4uXSIKKworT1BUSU9OU19TUEVDPQorLiBnaXQtc2gtc2V0dXAKKworZ2l0IGRpZmYtZmlsZXMgLS1xdWlldCAmJgorCWdpdCBkaWZmLWluZGV4IC0tY2FjaGVkIC0tcXVpZXQgSEVBRCAtLSB8fAorCWRpZSAiQ2Fubm90IHJld3JpdGUgYnJhbmNoKGVzKSB3aXRoIGEgZGlydHkgd29ya2luZyBkaXJlY3RvcnkuIgorCit0ZW1wZGlyPS5naXQtcmV3cml0ZQorZmlsdGVyX2Vudj0KK2ZpbHRlcl90cmVlPQorZmlsdGVyX2luZGV4PQorZmlsdGVyX3BhcmVudD0KK2ZpbHRlcl9tc2c9Y2F0CitmaWx0ZXJfY29tbWl0PSdnaXQgY29tbWl0LXRyZWUgIiRAIicKK2ZpbHRlcl90YWdfbmFtZT0KK2ZpbHRlcl9zdWJkaXI9CitvcmlnX25hbWVzcGFjZT1yZWZzL29yaWdpbmFsLworZm9yY2U9Cit3aGlsZSA6CitkbworCWNhc2UgIiQxIiBpbgorCS0tKQorCQlzaGlmdAorCQlicmVhaworCQk7OworCS0tZm9yY2V8LWYpCisJCXNoaWZ0CisJCWZvcmNlPXQKKwkJY29udGludWUKKwkJOzsKKwktKikKKwkJOzsKKwkqKQorCQlicmVhazsKKwllc2FjCisKKwkjIGFsbCBzd2l0Y2hlcyB0YWtlIG9uZSBhcmd1bWVudAorCUFSRz0iJDEiCisJY2FzZSAiJCMiIGluIDEpIHVzYWdlIDs7IGVzYWMKKwlzaGlmdAorCU9QVEFSRz0iJDEiCisJc2hpZnQKKworCWNhc2UgIiRBUkciIGluCisJLWQpCisJCXRlbXBkaXI9IiRPUFRBUkciCisJCTs7CisJLS1lbnYtZmlsdGVyKQorCQlmaWx0ZXJfZW52PSIkT1BUQVJHIgorCQk7OworCS0tdHJlZS1maWx0ZXIpCisJCWZpbHRlcl90cmVlPSIkT1BUQVJHIgorCQk7OworCS0taW5kZXgtZmlsdGVyKQorCQlmaWx0ZXJfaW5kZXg9IiRPUFRBUkciCisJCTs7CisJLS1wYXJlbnQtZmlsdGVyKQorCQlmaWx0ZXJfcGFyZW50PSIkT1BUQVJHIgorCQk7OworCS0tbXNnLWZpbHRlcikKKwkJZmlsdGVyX21zZz0iJE9QVEFSRyIKKwkJOzsKKwktLWNvbW1pdC1maWx0ZXIpCisJCWZpbHRlcl9jb21taXQ9IiRmdW5jdGlvbnM7ICRPUFRBUkciCisJCTs7CisJLS10YWctbmFtZS1maWx0ZXIpCisJCWZpbHRlcl90YWdfbmFtZT0iJE9QVEFSRyIKKwkJOzsKKwktLXN1YmRpcmVjdG9yeS1maWx0ZXIpCisJCWZpbHRlcl9zdWJkaXI9IiRPUFRBUkciCisJCTs7CisJLS1vcmlnaW5hbCkKKwkJb3JpZ19uYW1lc3BhY2U9JChleHByICIkT1BUQVJHLyIgOiAnXCguKlteL11cKS8qJCcpLworCQk7OworCSopCisJCXVzYWdlCisJCTs7CisJZXNhYworZG9uZQorCitjYXNlICIkZm9yY2UiIGluCit0KQorCXJtIC1yZiAiJHRlbXBkaXIiCis7OworJycpCisJdGVzdCAtZCAiJHRlbXBkaXIiICYmCisJCWRpZSAiJHRlbXBkaXIgYWxyZWFkeSBleGlzdHMsIHBsZWFzZSByZW1vdmUgaXQiCitlc2FjCitta2RpciAtcCAiJHRlbXBkaXIvdCIgJiYKK3RlbXBkaXI9IiQoY2QgIiR0ZW1wZGlyIjsgcHdkKSIgJiYKK2NkICIkdGVtcGRpci90IiAmJgord29ya2Rpcj0iJChwd2QpIiB8fAorZGllICIiCisKKyMgUmVtb3ZlIHRlbXBkaXIgb24gZXhpdAordHJhcCAnY2QgLi4vLi47IHJtIC1yZiAiJHRlbXBkaXIiJyAwCisKKyMgTWFrZSBzdXJlIHJlZnMvb3JpZ2luYWwgaXMgZW1wdHkKK2dpdCBmb3ItZWFjaC1yZWYgPiAiJHRlbXBkaXIiL2JhY2t1cC1yZWZzCit3aGlsZSByZWFkIHNoYTEgdHlwZSBuYW1lCitkbworCWNhc2UgIiRmb3JjZSwkbmFtZSIgaW4KKwksJG9yaWdfbmFtZXNwYWNlKikKKwkJZGllICJOYW1lc3BhY2UgJG9yaWdfbmFtZXNwYWNlIG5vdCBlbXB0eSIKKwk7OworCXQsJG9yaWdfbmFtZXNwYWNlKikKKwkJZ2l0IHVwZGF0ZS1yZWYgLWQgIiRuYW1lIiAkc2hhMQorCTs7CisJZXNhYworZG9uZSA8ICIkdGVtcGRpciIvYmFja3VwLXJlZnMKKworT1JJR19HSVRfRElSPSIkR0lUX0RJUiIKK09SSUdfR0lUX1dPUktfVFJFRT0iJEdJVF9XT1JLX1RSRUUiCitPUklHX0dJVF9JTkRFWF9GSUxFPSIkR0lUX0lOREVYX0ZJTEUiCitHSVRfV09SS19UUkVFPS4KK2V4cG9ydCBHSVRfRElSIEdJVF9XT1JLX1RSRUUKKworIyBUaGUgcmVmcyBzaG91bGQgYmUgdXBkYXRlZCBpZiB0aGVpciBoZWFkcyB3ZXJlIHJld3JpdHRlbgorZ2l0IHJldi1wYXJzZSAtLW5vLWZsYWdzIC0tcmV2cy1vbmx5IC0tc3ltYm9saWMtZnVsbC1uYW1lIC0tZGVmYXVsdCBIRUFEICIkQCIgfAorc2VkIC1lICcvXl4vZCcgPiIkdGVtcGRpciIvaGVhZHMKKwordGVzdCAtcyAiJHRlbXBkaXIiL2hlYWRzIHx8CisJZGllICJXaGljaCByZWYgZG8geW91IHdhbnQgdG8gcmV3cml0ZT8iCisKK0dJVF9JTkRFWF9GSUxFPSIkKHB3ZCkvLi4vaW5kZXgiCitleHBvcnQgR0lUX0lOREVYX0ZJTEUKK2dpdCByZWFkLXRyZWUgfHwgZGllICJDb3VsZCBub3Qgc2VlZCB0aGUgaW5kZXgiCisKK3JldD0wCisKKyMgbWFwIG9sZC0+bmV3IGNvbW1pdCBpZHMgZm9yIHJld3JpdGluZyBwYXJlbnRzCitta2RpciAuLi9tYXAgfHwgZGllICJDb3VsZCBub3QgY3JlYXRlIG1hcC8gZGlyZWN0b3J5IgorCitjYXNlICIkZmlsdGVyX3N1YmRpciIgaW4KKyIiKQorCWdpdCByZXYtbGlzdCAtLXJldmVyc2UgLS10b3BvLW9yZGVyIC0tZGVmYXVsdCBIRUFEIFwKKwkJLS1wYXJlbnRzICIkQCIKKwk7OworKikKKwlnaXQgcmV2LWxpc3QgLS1yZXZlcnNlIC0tdG9wby1vcmRlciAtLWRlZmF1bHQgSEVBRCBcCisJCS0tcGFyZW50cyAtLWZ1bGwtaGlzdG9yeSAiJEAiIC0tICIkZmlsdGVyX3N1YmRpciIKK2VzYWMgPiAuLi9yZXZzIHx8IGRpZSAiQ291bGQgbm90IGdldCB0aGUgY29tbWl0cyIKK2NvbW1pdHM9JCh3YyAtbCA8Li4vcmV2cyB8IHRyIC1kICIgIikKKwordGVzdCAkY29tbWl0cyAtZXEgMCAmJiBkaWUgIkZvdW5kIG5vdGhpbmcgdG8gcmV3cml0ZSIKKworIyBSZXdyaXRlIHRoZSBjb21taXRzCisKK2k9MAord2hpbGUgcmVhZCBjb21taXQgcGFyZW50czsgZG8KKwlpPSQoKCRpKzEpKQorCXByaW50ZiAiXHJSZXdyaXRlICRjb21taXQgKCRpLyRjb21taXRzKSIKKworCWNhc2UgIiRmaWx0ZXJfc3ViZGlyIiBpbgorCSIiKQorCQlnaXQgcmVhZC10cmVlIC1pIC1tICRjb21taXQKKwkJOzsKKwkqKQorCQkjIFRoZSBjb21taXQgbWF5IG5vdCBoYXZlIHRoZSBzdWJkaXJlY3RvcnkgYXQgYWxsCisJCWVycj0kKGdpdCByZWFkLXRyZWUgLWkgLW0gJGNvbW1pdDoiJGZpbHRlcl9zdWJkaXIiIDI+JjEpIHx8IHsKKwkJCWlmICEgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAkY29tbWl0OiIkZmlsdGVyX3N1YmRpciIgMj4vZGV2L251bGwKKwkJCXRoZW4KKwkJCQlybSAtZiAiJEdJVF9JTkRFWF9GSUxFIgorCQkJZWxzZQorCQkJCWVjaG8gPiYyICIkZXJyIgorCQkJCWZhbHNlCisJCQlmaQorCQl9CisJZXNhYyB8fCBkaWUgIkNvdWxkIG5vdCBpbml0aWFsaXplIHRoZSBpbmRleCIKKworCUdJVF9DT01NSVQ9JGNvbW1pdAorCWV4cG9ydCBHSVRfQ09NTUlUCisJZ2l0IGNhdC1maWxlIGNvbW1pdCAiJGNvbW1pdCIgPi4uL2NvbW1pdCB8fAorCQlkaWUgIkNhbm5vdCByZWFkIGNvbW1pdCAkY29tbWl0IgorCisJZXZhbCAiJChzZXRfaWRlbnQgQVVUSE9SIDwuLi9jb21taXQpIiB8fAorCQlkaWUgInNldHRpbmcgYXV0aG9yIGZhaWxlZCBmb3IgY29tbWl0ICRjb21taXQiCisJZXZhbCAiJChzZXRfaWRlbnQgQ09NTUlUVEVSIDwuLi9jb21taXQpIiB8fAorCQlkaWUgInNldHRpbmcgY29tbWl0dGVyIGZhaWxlZCBmb3IgY29tbWl0ICRjb21taXQiCisJZXZhbCAiJGZpbHRlcl9lbnYiIDwgL2Rldi9udWxsIHx8CisJCWRpZSAiZW52IGZpbHRlciBmYWlsZWQ6ICRmaWx0ZXJfZW52IgorCisJaWYgWyAiJGZpbHRlcl90cmVlIiBdOyB0aGVuCisJCWdpdCBjaGVja291dC1pbmRleCAtZiAtdSAtYSB8fAorCQkJZGllICJDb3VsZCBub3QgY2hlY2tvdXQgdGhlIGluZGV4IgorCQkjIGZpbGVzIHRoYXQgJGNvbW1pdCByZW1vdmVkIGFyZSBub3cgc3RpbGwgaW4gdGhlIHdvcmtpbmcgdHJlZTsKKwkJIyByZW1vdmUgdGhlbSwgZWxzZSB0aGV5IHdvdWxkIGJlIGFkZGVkIGFnYWluCisJCWdpdCBjbGVhbiAtZCAtcSAtZiAteAorCQlldmFsICIkZmlsdGVyX3RyZWUiIDwgL2Rldi9udWxsIHx8CisJCQlkaWUgInRyZWUgZmlsdGVyIGZhaWxlZDogJGZpbHRlcl90cmVlIgorCisJCSgKKwkJCWdpdCBkaWZmLWluZGV4IC1yIC0tbmFtZS1vbmx5ICRjb21taXQKKwkJCWdpdCBscy1maWxlcyAtLW90aGVycworCQkpIHwKKwkJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlcGxhY2UgLS1yZW1vdmUgLS1zdGRpbgorCWZpCisKKwlldmFsICIkZmlsdGVyX2luZGV4IiA8IC9kZXYvbnVsbCB8fAorCQlkaWUgImluZGV4IGZpbHRlciBmYWlsZWQ6ICRmaWx0ZXJfaW5kZXgiCisKKwlwYXJlbnRzdHI9CisJZm9yIHBhcmVudCBpbiAkcGFyZW50czsgZG8KKwkJZm9yIHJlcGFyZW50IGluICQobWFwICIkcGFyZW50Iik7IGRvCisJCQlwYXJlbnRzdHI9IiRwYXJlbnRzdHIgLXAgJHJlcGFyZW50IgorCQlkb25lCisJZG9uZQorCWlmIFsgIiRmaWx0ZXJfcGFyZW50IiBdOyB0aGVuCisJCXBhcmVudHN0cj0iJChlY2hvICIkcGFyZW50c3RyIiB8IGV2YWwgIiRmaWx0ZXJfcGFyZW50IikiIHx8CisJCQkJZGllICJwYXJlbnQgZmlsdGVyIGZhaWxlZDogJGZpbHRlcl9wYXJlbnQiCisJZmkKKworCXNlZCAtZSAnMSwvXiQvZCcgPC4uL2NvbW1pdCB8IFwKKwkJZXZhbCAiJGZpbHRlcl9tc2ciID4gLi4vbWVzc2FnZSB8fAorCQkJZGllICJtc2cgZmlsdGVyIGZhaWxlZDogJGZpbHRlcl9tc2ciCisJQFNIRUxMX1BBVEhAIC1jICIkZmlsdGVyX2NvbW1pdCIgImdpdCBjb21taXQtdHJlZSIgXAorCQkkKGdpdCB3cml0ZS10cmVlKSAkcGFyZW50c3RyIDwgLi4vbWVzc2FnZSA+IC4uL21hcC8kY29tbWl0Citkb25lIDwuLi9yZXZzCisKKyMgSW4gY2FzZSBvZiBhIHN1YmRpcmVjdG9yeSBmaWx0ZXIsIGl0IGlzIHBvc3NpYmxlIHRoYXQgYSBzcGVjaWZpZWQgaGVhZAorIyBpcyBub3QgaW4gdGhlIHNldCBvZiByZXdyaXR0ZW4gY29tbWl0cywgYmVjYXVzZSBpdCB3YXMgcHJ1bmVkIGJ5IHRoZQorIyByZXZpc2lvbiB3YWxrZXIuICBGaXggaXQgYnkgbWFwcGluZyB0aGVzZSBoZWFkcyB0byB0aGUgbmV4dCByZXdyaXR0ZW4KKyMgYW5jZXN0b3IocyksIGkuZS4gdGhlIGJvdW5kYXJpZXMgaW4gdGhlIHNldCBvZiByZXdyaXR0ZW4gY29tbWl0cy4KKworIyBORUVEU1dPUks6IHdlIHNob3VsZCBzb3J0IHRoZSB1bm1hcHBlZCByZWZzIHRvcG9sb2dpY2FsbHkgZmlyc3QKK3doaWxlIHJlYWQgcmVmCitkbworCXNoYTE9JChnaXQgcmV2LXBhcnNlICIkcmVmIl4wKQorCXRlc3QgLWYgIiR3b3JrZGlyIi8uLi9tYXAvJHNoYTEgJiYgY29udGludWUKKwkjIEFzc2lnbiB0aGUgYm91bmRhcmllKHMpIGluIHRoZSBzZXQgb2YgcmV3cml0dGVuIGNvbW1pdHMKKwkjIGFzIHRoZSByZXBsYWNlbWVudCBjb21taXQocykuCisJIyAoVGhpcyB3b3VsZCBsb29rIGEgYml0IG5pY2VyIGlmIC0tbm90IC0tc3RkaW4gd29ya2VkLikKKwlmb3IgcCBpbiAkKCAoY2QgIiR3b3JrZGlyIi8uLi9tYXA7IGxzIHwgc2VkICJzL14vXi8iKSB8CisJCWdpdCByZXYtbGlzdCAkcmVmIC0tYm91bmRhcnkgLS1zdGRpbiB8CisJCXNlZCAtbiAicy9eLS8vcCIpCisJZG8KKwkJbWFwICRwID4+ICIkd29ya2RpciIvLi4vbWFwLyRzaGExCisJZG9uZQorZG9uZSA8ICIkdGVtcGRpciIvaGVhZHMKKworIyBGaW5hbGx5IHVwZGF0ZSB0aGUgcmVmcworCitfeDQwPSdbMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdJworX3g0MD0iJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCIKK2VjaG8KK3doaWxlIHJlYWQgcmVmCitkbworCSMgYXZvaWQgcmV3cml0aW5nIGEgcmVmIHR3aWNlCisJdGVzdCAtZiAiJG9yaWdfbmFtZXNwYWNlJHJlZiIgJiYgY29udGludWUKKworCXNoYTE9JChnaXQgcmV2LXBhcnNlICIkcmVmIl4wKQorCXJld3JpdHRlbj0kKG1hcCAkc2hhMSkKKworCXRlc3QgJHNoYTEgPSAiJHJld3JpdHRlbiIgJiYKKwkJd2FybiAiV0FSTklORzogUmVmICckcmVmJyBpcyB1bmNoYW5nZWQiICYmCisJCWNvbnRpbnVlCisKKwljYXNlICIkcmV3cml0dGVuIiBpbgorCScnKQorCQllY2hvICJSZWYgJyRyZWYnIHdhcyBkZWxldGVkIgorCQlnaXQgdXBkYXRlLXJlZiAtbSAiZmlsdGVyLWJyYW5jaDogZGVsZXRlIiAtZCAiJHJlZiIgJHNoYTEgfHwKKwkJCWRpZSAiQ291bGQgbm90IGRlbGV0ZSAkcmVmIgorCTs7CisJJF94NDApCisJCWVjaG8gIlJlZiAnJHJlZicgd2FzIHJld3JpdHRlbiIKKwkJZ2l0IHVwZGF0ZS1yZWYgLW0gImZpbHRlci1icmFuY2g6IHJld3JpdGUiIFwKKwkJCQkiJHJlZiIgJHJld3JpdHRlbiAkc2hhMSB8fAorCQkJZGllICJDb3VsZCBub3QgcmV3cml0ZSAkcmVmIgorCTs7CisJKikKKwkJIyBORUVEU1dPUks6IHBvc3NpYmx5IGFkZCAtV2Vycm9yLCBtYWtpbmcgdGhpcyBhbiBlcnJvcgorCQl3YXJuICJXQVJOSU5HOiAnJHJlZicgd2FzIHJld3JpdHRlbiBpbnRvIG11bHRpcGxlIGNvbW1pdHM6IgorCQl3YXJuICIkcmV3cml0dGVuIgorCQl3YXJuICJXQVJOSU5HOiBSZWYgJyRyZWYnIHBvaW50cyB0byB0aGUgZmlyc3Qgb25lIG5vdy4iCisJCXJld3JpdHRlbj0kKGVjaG8gIiRyZXdyaXR0ZW4iIHwgaGVhZCAtbiAxKQorCQlnaXQgdXBkYXRlLXJlZiAtbSAiZmlsdGVyLWJyYW5jaDogcmV3cml0ZSB0byBmaXJzdCIgXAorCQkJCSIkcmVmIiAkcmV3cml0dGVuICRzaGExIHx8CisJCQlkaWUgIkNvdWxkIG5vdCByZXdyaXRlICRyZWYiCisJOzsKKwllc2FjCisJZ2l0IHVwZGF0ZS1yZWYgLW0gImZpbHRlci1icmFuY2g6IGJhY2t1cCIgIiRvcmlnX25hbWVzcGFjZSRyZWYiICRzaGExCitkb25lIDwgIiR0ZW1wZGlyIi9oZWFkcworCisjIFRPRE86IFRoaXMgc2hvdWxkIHBvc3NpYmx5IGdvLCB3aXRoIHRoZSBzZW1hbnRpY3MgdGhhdCBhbGwgcG9zaXRpdmUgZ2l2ZW4KKyMgICAgICAgcmVmcyBhcmUgdXBkYXRlZCwgYW5kIHRoZWlyIG9yaWdpbmFsIGhlYWRzIHN0b3JlZCBpbiByZWZzL29yaWdpbmFsLworIyBGaWx0ZXIgdGFncworCitpZiBbICIkZmlsdGVyX3RhZ19uYW1lIiBdOyB0aGVuCisJZ2l0IGZvci1lYWNoLXJlZiAtLWZvcm1hdD0nJShvYmplY3RuYW1lKSAlKG9iamVjdHR5cGUpICUocmVmbmFtZSknIHJlZnMvdGFncyB8CisJd2hpbGUgcmVhZCBzaGExIHR5cGUgcmVmOyBkbworCQlyZWY9IiR7cmVmI3JlZnMvdGFncy99IgorCQkjIFhYWDogUmV3cml0ZSB0YWdnZWQgdHJlZXMgYXMgd2VsbD8KKwkJaWYgWyAiJHR5cGUiICE9ICJjb21taXQiIC1hICIkdHlwZSIgIT0gInRhZyIgXTsgdGhlbgorCQkJY29udGludWU7CisJCWZpCisKKwkJaWYgWyAiJHR5cGUiID0gInRhZyIgXTsgdGhlbgorCQkJIyBEZXJlZmVyZW5jZSB0byBhIGNvbW1pdAorCQkJc2hhMXQ9IiRzaGExIgorCQkJc2hhMT0iJChnaXQgcmV2LXBhcnNlICIkc2hhMSJee2NvbW1pdH0gMj4vZGV2L251bGwpIiB8fCBjb250aW51ZQorCQlmaQorCisJCVsgLWYgIi4uL21hcC8kc2hhMSIgXSB8fCBjb250aW51ZQorCQluZXdfc2hhMT0iJChjYXQgIi4uL21hcC8kc2hhMSIpIgorCQlHSVRfQ09NTUlUPSIkc2hhMSIKKwkJZXhwb3J0IEdJVF9DT01NSVQKKwkJbmV3X3JlZj0iJChlY2hvICIkcmVmIiB8IGV2YWwgIiRmaWx0ZXJfdGFnX25hbWUiKSIgfHwKKwkJCWRpZSAidGFnIG5hbWUgZmlsdGVyIGZhaWxlZDogJGZpbHRlcl90YWdfbmFtZSIKKworCQllY2hvICIkcmVmIC0+ICRuZXdfcmVmICgkc2hhMSAtPiAkbmV3X3NoYTEpIgorCisJCWlmIFsgIiR0eXBlIiA9ICJ0YWciIF07IHRoZW4KKwkJCSMgV2FybiB0aGF0IHdlIGFyZSBub3QgcmV3cml0aW5nIHRoZSB0YWcgb2JqZWN0IGl0c2VsZi4KKwkJCXdhcm4gInVucmVmZXJlbmNpbmcgdGFnIG9iamVjdCAkc2hhMXQiCisJCWZpCisKKwkJZ2l0IHVwZGF0ZS1yZWYgInJlZnMvdGFncy8kbmV3X3JlZiIgIiRuZXdfc2hhMSIgfHwKKwkJCWRpZSAiQ291bGQgbm90IHdyaXRlIHRhZyAkbmV3X3JlZiIKKwlkb25lCitmaQorCitjZCAuLi8uLgorcm0gLXJmICIkdGVtcGRpciIKKwordHJhcCAtIDAKKwordW5zZXQgR0lUX0RJUiBHSVRfV09SS19UUkVFIEdJVF9JTkRFWF9GSUxFCit0ZXN0IC16ICIkT1JJR19HSVRfRElSIiB8fCBHSVRfRElSPSIkT1JJR19HSVRfRElSIiAmJiBleHBvcnQgR0lUX0RJUgordGVzdCAteiAiJE9SSUdfR0lUX1dPUktfVFJFRSIgfHwgR0lUX1dPUktfVFJFRT0iJE9SSUdfR0lUX1dPUktfVFJFRSIgJiYKKwlleHBvcnQgR0lUX1dPUktfVFJFRQordGVzdCAteiAiJE9SSUdfR0lUX0lOREVYX0ZJTEUiIHx8IEdJVF9JTkRFWF9GSUxFPSIkT1JJR19HSVRfSU5ERVhfRklMRSIgJiYKKwlleHBvcnQgR0lUX0lOREVYX0ZJTEUKK2dpdCByZWFkLXRyZWUgLXUgLW0gSEVBRAorCitleGl0ICRyZXQKZGlmZiAtLWdpdCBhL2dpdC1ndWkvLmdpdGlnbm9yZSBiL2dpdC1ndWkvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDgzYjIxCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsOCBAQAorLkRTX1N0b3JlCitjb25maWcubWFrCitHaXQgR3VpLmFwcCoKK2dpdC1ndWkudGNsCitHSVQtVkVSU0lPTi1GSUxFCitHSVQtR1VJLVZBUlMKK2dpdC1ndWkKK2xpYi90Y2xJbmRleApkaWZmIC0tZ2l0IGEvZ2l0LWd1aS9HSVQtVkVSU0lPTi1HRU4gYi9naXQtZ3VpL0dJVC1WRVJTSU9OLUdFTgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYWI0NzhlCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9HSVQtVkVSU0lPTi1HRU4KQEAgLTAsMCArMSw4MCBAQAorIyEvYmluL3NoCisKK0dWRj1HSVQtVkVSU0lPTi1GSUxFCitERUZfVkVSPTAuMTAuR0lUR1VJCisKK0xGPScKKycKKwordHJlZV9zZWFyY2ggKCkKK3sKKwloZWFkPSQxCisJdHJlZT0kMgorCWZvciBwIGluICQoZ2l0IHJldi1saXN0IC0tcGFyZW50cyAtLW1heC1jb3VudD0xICRoZWFkIDI+L2Rldi9udWxsKQorCWRvCisJCXRlc3QgJHRyZWUgPSAkKGdpdCByZXYtcGFyc2UgJHBee3RyZWV9IDI+L2Rldi9udWxsKSAmJgorCQl2bj0kKGdpdCBkZXNjcmliZSAtLWFiYnJldj00ICRwIDI+L2Rldi9udWxsKSAmJgorCQljYXNlICIkdm4iIGluCisJCWdpdGd1aS1bMC05XSopIGVjaG8gJHZuOyBicmVhazs7CisJCWVzYWMKKwlkb25lCit9CisKKyMgQWx3YXlzIHVzZSB0aGUgdGFyYmFsbCB2ZXJzaW9uIGZpbGUgaWYgZm91bmQsIGp1c3QKKyMgaW4gY2FzZSB3ZSBhcmUgc29tZWhvdyBjb250YWluZWQgaW4gYSBsYXJnZXIgZ2l0CisjIHJlcG9zaXRvcnkgdGhhdCBkb2Vzbid0IGFjdHVhbGx5IHRyYWNrIG91ciBzdGF0ZS4KKyMgKEF0IGxlYXN0IG9uZSBwYWNrYWdlIG1hbmFnZXIgaXMgZG9pbmcgdGhpcy4pCisjCisjIFdlIG1heSBiZSBhIHN1YnByb2plY3QsIHNvIHRyeSBsb29raW5nIGZvciB0aGUgbWVyZ2UKKyMgY29tbWl0IHRoYXQgc3VwcGxpZWQgdGhpcyBkaXJlY3RvcnkgY29udGVudCBpZiB3ZSBhcmUKKyMgbm90IGF0IHRoZSB0b3BsZXZlbC4gIFdlIHByb2JhYmx5IHdpbGwgYWx3YXlzIGJlIHRoZQorIyBzZWNvbmQgcGFyZW50IGluIHRoZSBjb21taXQsIGJ1dCB3ZSBzaG91bGRuJ3QgcmVseSBvbgorIyB0aGF0IGZhY3QuCisjCisjIElmIHdlIGFyZSBhdCB0aGUgdG9wbGV2ZWwgb3IgdGhlIG1lcmdlIGFzc3VtcHRpb24gZmFpbHMKKyMgdHJ5IGxvb2tpbmcgZm9yIGEgZ2l0Z3VpLSogdGFnLgorCitpZiB0ZXN0IC1mIHZlcnNpb24gJiYKKyAgIFZOPSQoY2F0IHZlcnNpb24pCit0aGVuCisJOiBoYXBweQorZWxpZiBwcmVmaXg9IiQoZ2l0IHJldi1wYXJzZSAtLXNob3ctcHJlZml4IDI+L2Rldi9udWxsKSIKKyAgIHRlc3QgLW4gIiRwcmVmaXgiICYmCisgICBoZWFkPSQoZ2l0IHJldi1saXN0IC0tbWF4LWNvdW50PTEgSEVBRCAtLSAuIDI+L2Rldi9udWxsKSAmJgorICAgdHJlZT0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgIkhFQUQ6JHByZWZpeCIgMj4vZGV2L251bGwpICYmCisgICBWTj0kKHRyZWVfc2VhcmNoICRoZWFkICR0cmVlKQorICAgY2FzZSAiJFZOIiBpbgorICAgZ2l0Z3VpLVswLTldKikgOiBoYXBweSA7OworICAgKikgKGV4aXQgMSkgOzsKKyAgIGVzYWMKK3RoZW4KKwlWTj0kKGVjaG8gIiRWTiIgfCBzZWQgLWUgJ3MvXmdpdGd1aS0vLztzLy0vLi9nJyk7CitlbGlmIFZOPSQoZ2l0IGRlc2NyaWJlIC0tYWJicmV2PTQgSEVBRCAyPi9kZXYvbnVsbCkgJiYKKyAgIGNhc2UgIiRWTiIgaW4KKyAgIGdpdGd1aS1bMC05XSopIDogaGFwcHkgOzsKKyAgICopIChleGl0IDEpIDs7CisgICBlc2FjCit0aGVuCisJVk49JChlY2hvICIkVk4iIHwgc2VkIC1lICdzL15naXRndWktLy87cy8tLy4vZycpOworZWxzZQorCVZOPSIkREVGX1ZFUiIKK2ZpCisKK2RpcnR5PSQoc2ggLWMgJ2dpdCBkaWZmLWluZGV4IC0tbmFtZS1vbmx5IEhFQUQnIDI+L2Rldi9udWxsKSB8fCBkaXJ0eT0KK2Nhc2UgIiRkaXJ0eSIgaW4KKycnKQorCTs7CisqKQorCVZOPSIkVk4tZGlydHkiIDs7Citlc2FjCisKK2lmIHRlc3QgLXIgJEdWRgordGhlbgorCVZDPSQoc2VkIC1lICdzL15HSVRHVUlfVkVSU0lPTiA9IC8vJyA8JEdWRikKK2Vsc2UKKwlWQz11bnNldAorZmkKK3Rlc3QgIiRWTiIgPSAiJFZDIiB8fCB7CisJZWNobyA+JjIgIkdJVEdVSV9WRVJTSU9OID0gJFZOIgorCWVjaG8gIkdJVEdVSV9WRVJTSU9OID0gJFZOIiA+JEdWRgorfQpkaWZmIC0tZ2l0IGEvZ2l0LWd1aS9NYWtlZmlsZSBiL2dpdC1ndWkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5ZmIyZAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvTWFrZWZpbGUKQEAgLTAsMCArMSwzMzQgQEAKK2FsbDo6CisKKyMgRGVmaW5lIFY9MSB0byBoYXZlIGEgbW9yZSB2ZXJib3NlIGNvbXBpbGUuCisjCisjIERlZmluZSBOT19NU0dGTVQgaWYgeW91IGRvIG5vdCBoYXZlIG1zZ2ZtdCBmcm9tIHRoZSBHTlUgZ2V0dGV4dAorIyBwYWNrYWdlIGFuZCB3YW50IHRvIHVzZSBvdXIgcm91Z2ggcHVyZSBUY2wgcG8tPm1zZyB0cmFuc2xhdG9yLgorIyBUQ0xfUEFUSCBtdXN0IGJlIHZhaWxkIGZvciB0aGlzIHRvIHdvcmsuCisjCisKK0dJVC1WRVJTSU9OLUZJTEU6IC5GT1JDRS1HSVQtVkVSU0lPTi1GSUxFCisJQCQoU0hFTExfUEFUSCkgLi9HSVQtVkVSU0lPTi1HRU4KKy1pbmNsdWRlIEdJVC1WRVJTSU9OLUZJTEUKKwordW5hbWVfUyA6PSAkKHNoZWxsIHNoIC1jICd1bmFtZSAtcyAyPi9kZXYvbnVsbCB8fCBlY2hvIG5vdCcpCit1bmFtZV9PIDo9ICQoc2hlbGwgc2ggLWMgJ3VuYW1lIC1vIDI+L2Rldi9udWxsIHx8IGVjaG8gbm90JykKK3VuYW1lX1IgOj0gJChzaGVsbCBzaCAtYyAndW5hbWUgLXIgMj4vZGV2L251bGwgfHwgZWNobyBub3QnKQorCitTQ1JJUFRfU0ggPSBnaXQtZ3VpLnNoCitHSVRHVUlfTUFJTiA6PSBnaXQtZ3VpCitHSVRHVUlfQlVJTFRfSU5TID0gZ2l0LWNpdG9vbAorQUxMX0xJQkZJTEVTID0gJCh3aWxkY2FyZCBsaWIvKi50Y2wpCitQUkVMT0FEX0ZJTEVTID0gbGliL2NsYXNzLnRjbAorTk9OVENMX0xJQkZJTEVTID0gXAorCWxpYi9naXQtZ3VpLmljbyBcCisJJCh3aWxkY2FyZCBsaWIvd2luMzJfKi5qcykgXAorI2VuZCBOT05UQ0xfTElCRklMRVMKKworaWZuZGVmIFNIRUxMX1BBVEgKKwlTSEVMTF9QQVRIID0gL2Jpbi9zaAorZW5kaWYKKworaWZuZGVmIGdpdGV4ZWNkaXIKKwlnaXRleGVjZGlyIDo9ICQoc2hlbGwgZ2l0IC0tZXhlYy1wYXRoKQorZW5kaWYKKworaWZuZGVmIHNoYXJlZGlyCisJc2hhcmVkaXIgOj0gJChkaXIgJChnaXRleGVjZGlyKSlzaGFyZQorZW5kaWYKKworaWZuZGVmIElOU1RBTEwKKwlJTlNUQUxMID0gaW5zdGFsbAorZW5kaWYKKworUk1fUkYgICAgID89IHJtIC1yZgorUk1ESVIgICAgID89IHJtZGlyCisKK0lOU1RBTExfRDAgPSAkKElOU1RBTEwpIC1kIC1tIDc1NSAjIHNwYWNlIGlzIHJlcXVpcmVkIGhlcmUKK0lOU1RBTExfRDEgPQorSU5TVEFMTF9SMCA9ICQoSU5TVEFMTCkgLW0gNjQ0ICMgc3BhY2UgaXMgcmVxdWlyZWQgaGVyZQorSU5TVEFMTF9SMSA9CitJTlNUQUxMX1gwID0gJChJTlNUQUxMKSAtbSA3NTUgIyBzcGFjZSBpcyByZXF1aXJlZCBoZXJlCitJTlNUQUxMX1gxID0KK0lOU1RBTExfQTAgPSBmaW5kICMgc3BhY2UgaXMgcmVxdWlyZWQgaGVyZQorSU5TVEFMTF9BMSA9IHwgY3BpbyAtcHVkCitJTlNUQUxMX0wwID0gcm0gLWYgIyBzcGFjZSBpcyByZXF1aXJlZCBoZXJlCitJTlNUQUxMX0wxID0gJiYgbG4gIyBzcGFjZSBpcyByZXF1aXJlZCBoZXJlCitJTlNUQUxMX0wyID0KK0lOU1RBTExfTDMgPQorCitSRU1PVkVfRDAgID0gJChSTURJUikgIyBzcGFjZSBpcyByZXF1aXJlZCBoZXJlCitSRU1PVkVfRDEgID0gfHwgdHJ1ZQorUkVNT1ZFX0YwICA9ICQoUk1fUkYpICMgc3BhY2UgaXMgcmVxdWlyZWQgaGVyZQorUkVNT1ZFX0YxICA9CitDTEVBTl9EU1QgID0gdHJ1ZQorCitpZm5kZWYgVgorCVFVSUVUICAgICAgICAgID0gQAorCVFVSUVUX0dFTiAgICAgID0gJChRVUlFVCllY2hvICcgICAnIEdFTiAnJEAnICYmCisJUVVJRVRfSU5ERVggICAgPSAkKFFVSUVUKWVjaG8gJyAgICcgSU5ERVggJChkaXIgJEApICYmCisJUVVJRVRfTVNHRk1UMCAgPSAkKFFVSUVUKXByaW50ZiAnICAgIE1TR0ZNVCAlMTJzICcgJEAgJiYgdj1gCisJUVVJRVRfTVNHRk1UMSAgPSAyPiYxYCAmJiBlY2hvICIkJHYiIHwgc2VkIC1lICdzL2Z1enp5IHRyYW5zbGF0aW9ucy9mdXp6eS8nIHwgc2VkIC1lICdzLyBtZXNzYWdlcyovL2cnCisJUVVJRVRfMkRFVk5VTEwgPSAyPi9kZXYvbnVsbAorCisJSU5TVEFMTF9EMCA9IGRpcj0KKwlJTlNUQUxMX0QxID0gJiYgZWNobyAnICcgREVTVCAkJGRpciAmJiAkKElOU1RBTEwpIC1kIC1tIDc1NSAiJCRkaXIiCisJSU5TVEFMTF9SMCA9IHNyYz0KKwlJTlNUQUxMX1IxID0gJiYgZWNobyAnICAgJyBJTlNUQUxMIDY0NCBgYmFzZW5hbWUgJCRzcmNgICYmICQoSU5TVEFMTCkgLW0gNjQ0ICQkc3JjCisJSU5TVEFMTF9YMCA9IHNyYz0KKwlJTlNUQUxMX1gxID0gJiYgZWNobyAnICAgJyBJTlNUQUxMIDc1NSBgYmFzZW5hbWUgJCRzcmNgICYmICQoSU5TVEFMTCkgLW0gNzU1ICQkc3JjCisJSU5TVEFMTF9BMCA9IHNyYz0KKwlJTlNUQUxMX0ExID0gJiYgZWNobyAnICAgJyBJTlNUQUxMICcgICAnIGBiYXNlbmFtZSAiJCRzcmMiYCAmJiBmaW5kICIkJHNyYyIgfCBjcGlvIC1wdWQKKworCUlOU1RBTExfTDAgPSBkc3Q9CisJSU5TVEFMTF9MMSA9ICYmIHNyYz0KKwlJTlNUQUxMX0wyID0gJiYgZHN0PQorCUlOU1RBTExfTDMgPSAmJiBlY2hvICcgICAnICdMSU5LICAgICAgICcgYGJhc2VuYW1lICIkJGRzdCJgICctPicgYGJhc2VuYW1lICIkJHNyYyJgICYmIHJtIC1mICIkJGRzdCIgJiYgbG4gIiQkc3JjIiAiJCRkc3QiCisKKwlDTEVBTl9EU1QgPSBlY2hvICcgJyBVTklOU1RBTEwKKwlSRU1PVkVfRDAgPSBkaXI9CisJUkVNT1ZFX0QxID0gJiYgZWNobyAnICcgUkVNT1ZFICQkZGlyICYmIHRlc3QgLWQgIiQkZGlyIiAmJiAkKFJNRElSKSAiJCRkaXIiIHx8IHRydWUKKwlSRU1PVkVfRjAgPSBkc3Q9CisJUkVNT1ZFX0YxID0gJiYgZWNobyAnICAgJyBSRU1PVkUgYGJhc2VuYW1lICIkJGRzdCJgICYmICQoUk1fUkYpICIkJGRzdCIKK2VuZGlmCisKK1RDTFRLX1BBVEggPz0gd2lzaAoraWZlcSAoLi8sJChkaXIgJChUQ0xUS19QQVRIKSkpCisJVENMX1BBVEggPz0gJChzdWJzdCB3aXNoLHRjbHNoLCQoVENMVEtfUEFUSCkpCitlbHNlCisJVENMX1BBVEggPz0gJChkaXIgJChUQ0xUS19QQVRIKSkkKG5vdGRpciAkKHN1YnN0IHdpc2gsdGNsc2gsJChUQ0xUS19QQVRIKSkpCitlbmRpZgorCitpZmVxICgkKHVuYW1lX1MpLERhcndpbikKKwlUS0ZSQU1FV09SSyA9IC9MaWJyYXJ5L0ZyYW1ld29ya3MvVGsuZnJhbWV3b3JrL1Jlc291cmNlcy9XaXNoLmFwcAorCWlmZXEgKCQoc2hlbGwgZXhwciAiJCh1bmFtZV9SKSIgOiAnOVwuJyksMikKKwkJVEtGUkFNRVdPUksgPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9Uay5mcmFtZXdvcmsvUmVzb3VyY2VzL1dpc2hcIFNoZWxsLmFwcAorCWVuZGlmCisJVEtFWEVDVVRBQkxFID0gJChzaGVsbCBiYXNlbmFtZSAiJChUS0ZSQU1FV09SSykiIC5hcHApCitlbmRpZgorCitpZmVxICgkKGZpbmRzdHJpbmcgJChNQUtFRkxBR1MpLHMpLHMpCitRVUlFVF9HRU4gPQorZW5kaWYKKworLWluY2x1ZGUgY29uZmlnLm1haworCitERVNURElSX1NRID0gJChzdWJzdCAnLCdcJycsJChERVNURElSKSkKK2dpdGV4ZWNkaXJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKGdpdGV4ZWNkaXIpKQorU0hFTExfUEFUSF9TUSA9ICQoc3Vic3QgJywnXCcnLCQoU0hFTExfUEFUSCkpCitUQ0xfUEFUSF9TUSA9ICQoc3Vic3QgJywnXCcnLCQoVENMX1BBVEgpKQorVENMVEtfUEFUSF9TUSA9ICQoc3Vic3QgJywnXCcnLCQoVENMVEtfUEFUSCkpCitUQ0xUS19QQVRIX1NFRCA9ICQoc3Vic3QgJywnXCcnLCQoc3Vic3QgXCxcXCwkKFRDTFRLX1BBVEgpKSkKKworZ2dfbGliZGlyID89ICQoc2hhcmVkaXIpL2dpdC1ndWkvbGliCitsaWJkaXJfU1EgID0gJChzdWJzdCAnLCdcJycsJChnZ19saWJkaXIpKQorbGliZGlyX1NFRCA9ICQoc3Vic3QgJywnXCcnLCQoc3Vic3QgXCxcXCwkKGdnX2xpYmRpcl9zZWRfaW4pKSkKK2V4ZWRpciAgICAgPSAkKGRpciAkKGdpdGV4ZWNkaXIpKXNoYXJlL2dpdC1ndWkvbGliCisKK0dJVEdVSV9TQ1JJUFQgICA6PSAkJDAKK0dJVEdVSV9SRUxBVElWRSA6PQorR0lUR1VJX01BQ09TWEFQUCA6PQorCitpZmVxICgkKHVuYW1lX08pLEN5Z3dpbikKKwlHSVRHVUlfU0NSSVBUIDo9IGBjeWdwYXRoIC0td2luZG93cyAtLWFic29sdXRlICIkKEdJVEdVSV9TQ1JJUFQpImAKKworCSMgSXMgdGhpcyBhIEN5Z3dpbiBUY2wvVGsgYmluYXJ5PyAgSWYgc28gaXQga25vd3MgaG93IHRvIGRvCisJIyBQT1NJWCBwYXRoIHRyYW5zbGF0aW9uIGp1c3QgbGlrZSBjeWdwYXRoIGRvZXMgYW5kIHdlIG11c3QKKwkjIGtlZXAgbGliZGlyIGluIFBPU0lYIGZvcm1hdCBzbyBDeWd3aW4gcGFja2FnZXMgb2YgZ2l0LWd1aQorCSMgd29yayBubyBtYXR0ZXIgd2hlcmUgdGhlIHVzZXIgaW5zdGFsbHMgdGhlbS4KKwkjCisJaWZlcSAoJChzaGVsbCBlY2hvICdwdXRzIFtmaWxlIG5vcm1hbGl6ZSAvXScgfCAnJChUQ0xfUEFUSF9TUSknKSwkKHNoZWxsIGN5Z3BhdGggLS1taXhlZCAtLWFic29sdXRlIC8pKQorCQlnZ19saWJkaXJfc2VkX2luIDo9ICQoZ2dfbGliZGlyKQorCWVsc2UKKwkJZ2dfbGliZGlyX3NlZF9pbiA6PSAkKHNoZWxsIGN5Z3BhdGggLS13aW5kb3dzIC0tYWJzb2x1dGUgIiQoZ2dfbGliZGlyKSIpCisJZW5kaWYKK2Vsc2UKKwlpZmVxICgkKGV4ZWRpciksJChnZ19saWJkaXIpKQorCQlHSVRHVUlfUkVMQVRJVkUgOj0gMQorCWVuZGlmCisJZ2dfbGliZGlyX3NlZF9pbiA6PSAkKGdnX2xpYmRpcikKK2VuZGlmCitpZmVxICgkKHVuYW1lX1MpLERhcndpbikKKwlpZmVxICgkKHNoZWxsIHRlc3QgLWQgJChUS0ZSQU1FV09SSykgJiYgZWNobyB5KSx5KQorCQlHSVRHVUlfTUFDT1NYQVBQIDo9IFllc1BsZWFzZQorCWVuZGlmCitlbmRpZgoraWZuZXEgKCwkKGZpbmRzdHJpbmcgTUlOR1csJCh1bmFtZV9TKSkpCisJTk9fTVNHRk1UPTEKKwlHSVRHVUlfV0lORE9XU19XUkFQUEVSIDo9IFllc1BsZWFzZQorZW5kaWYKKworaWZkZWYgR0lUR1VJX01BQ09TWEFQUAorR0lUR1VJX01BSU4gOj0gZ2l0LWd1aS50Y2wKKworZ2l0LWd1aTogR0lULVZFUlNJT04tRklMRSBHSVQtR1VJLVZBUlMKKwkkKFFVSUVUX0dFTilybSAtZiAkQCAkQCsgJiYgXAorCWVjaG8gJyMhJChTSEVMTF9QQVRIX1NRKScgPiRAKyAmJiBcCisJZWNobyAnaWYgdGVzdCAieiQkKiIgPSB6dmVyc2lvbiB8fCcgPj4kQCsgJiYgXAorCWVjaG8gJyAgIHRlc3QgInokJCoiID0gei0tdmVyc2lvbicgPj4kQCsgJiYgXAorCWVjaG8gdGhlbiA+PiRAKyAmJiBcCisJZWNobyAnCSdlY2hvIFwnZ2l0LWd1aSB2ZXJzaW9uICckKEdJVEdVSV9WRVJTSU9OKSdcJyA+PiRAKyAmJiBcCisJZWNobyBlbHNlID4+JEArICYmIFwKKwllY2hvICcJJ2V4ZWMgXCcnJChsaWJkaXJfU1EpL0dpdCBHdWkuYXBwL0NvbnRlbnRzL01hY09TLyQoc3Vic3QgXCwsJChUS0VYRUNVVEFCTEUpKSdcJyBcCisJCSciJCQwIiAiJCRAIicgPj4kQCsgJiYgXAorCWVjaG8gZmkgPj4kQCsgJiYgXAorCWNobW9kICt4ICRAKyAmJiBcCisJbXYgJEArICRACisKK0dpdFwgR3VpLmFwcDogR0lULVZFUlNJT04tRklMRSBHSVQtR1VJLVZBUlMgXAorCQltYWNvc3gvSW5mby5wbGlzdCBcCisJCW1hY29zeC9naXQtZ3VpLmljbnMgXAorCQltYWNvc3gvQXBwTWFpbi50Y2wgXAorCQkkKFRLRlJBTUVXT1JLKS9Db250ZW50cy9NYWNPUy8kKFRLRVhFQ1VUQUJMRSkKKwkkKFFVSUVUX0dFTilybSAtcmYgJyRAJyAnJEAnKyAmJiBcCisJbWtkaXIgLXAgJyRAJysvQ29udGVudHMvTWFjT1MgJiYgXAorCW1rZGlyIC1wICckQCcrL0NvbnRlbnRzL1Jlc291cmNlcy9TY3JpcHRzICYmIFwKKwljcCAnJChzdWJzdCAnLCdcJycsJChzdWJzdCBcLCwkKFRLRlJBTUVXT1JLKS9Db250ZW50cy9NYWNPUy8kKFRLRVhFQ1VUQUJMRSkpKScgXAorCQknJEAnKy9Db250ZW50cy9NYWNPUyAmJiBcCisJY3AgbWFjb3N4L2dpdC1ndWkuaWNucyAnJEAnKy9Db250ZW50cy9SZXNvdXJjZXMgJiYgXAorCXNlZCAtZSAncy9AQEdJVEdVSV9WRVJTSU9OQEAvJChHSVRHVUlfVkVSU0lPTikvZycgXAorCQktZSAncy9AQEdJVEdVSV9US0VYRUNVVEFCTEVAQC8kKFRLRVhFQ1VUQUJMRSkvZycgXAorCQltYWNvc3gvSW5mby5wbGlzdCBcCisJCT4nJEAnKy9Db250ZW50cy9JbmZvLnBsaXN0ICYmIFwKKwlzZWQgLWUgJ3N8QEBnaXRleGVjZGlyQEB8JChnaXRleGVjZGlyX1NRKXwnIFwKKwkJLWUgJ3N8QEBHSVRHVUlfTElCRElSQEB8JChsaWJkaXJfU0VEKXwnIFwKKwkJbWFjb3N4L0FwcE1haW4udGNsIFwKKwkJPickQCcrL0NvbnRlbnRzL1Jlc291cmNlcy9TY3JpcHRzL0FwcE1haW4udGNsICYmIFwKKwltdiAnJEAnKyAnJEAnCitlbmRpZgorCitpZmRlZiBHSVRHVUlfV0lORE9XU19XUkFQUEVSCitHSVRHVUlfTUFJTiA6PSBnaXQtZ3VpLnRjbAorCitnaXQtZ3VpOiB3aW5kb3dzL2dpdC1ndWkuc2gKKwljcCAkPCAkQAorZW5kaWYKKworJChHSVRHVUlfTUFJTik6IGdpdC1ndWkuc2ggR0lULVZFUlNJT04tRklMRSBHSVQtR1VJLVZBUlMKKwkkKFFVSUVUX0dFTilybSAtZiAkQCAkQCsgJiYgXAorCXNlZCAtZSAnMXN8IyEuKi9zaHwjISQoU0hFTExfUEFUSF9TUSl8JyBcCisJCS1lICcxLDMwc3xeIGFyZ3YwPSQkMHwgYXJndjA9JChHSVRHVUlfU0NSSVBUKXwnIFwKKwkJLWUgJzEsMzBzfF4gZXhlYyB3aXNoIHwgZXhlYyAnXCcnJChUQ0xUS19QQVRIX1NFRCknXCcnIHwnIFwKKwkJLWUgJ3MvQEBHSVRHVUlfVkVSU0lPTkBALyQoR0lUR1VJX1ZFUlNJT04pL2cnIFwKKwkJLWUgJ3N8QEBHSVRHVUlfUkVMQVRJVkVAQHwkKEdJVEdVSV9SRUxBVElWRSl8JyBcCisJCS1lICckKEdJVEdVSV9SRUxBVElWRSlzfEBAR0lUR1VJX0xJQkRJUkBAfCQobGliZGlyX1NFRCl8JyBcCisJCWdpdC1ndWkuc2ggPiRAKyAmJiBcCisJY2htb2QgK3ggJEArICYmIFwKKwltdiAkQCsgJEAKKworWEdFVFRFWFQgICA/PSB4Z2V0dGV4dAoraWZkZWYgTk9fTVNHRk1UCisJTVNHRk1UID89ICQoVENMX1BBVEgpIHBvL3BvMm1zZy5zaAorZWxzZQorCU1TR0ZNVCA/PSBtc2dmbXQKKwlpZm5lcSAoJChzaGVsbCAkKE1TR0ZNVCkgLS10Y2wgLWwgQyAtZCAuIC9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgZWNobyAkJD8pLDApCisJCU1TR0ZNVCA6PSAkKFRDTF9QQVRIKSBwby9wbzJtc2cuc2gKKwllbmRpZgorZW5kaWYKKworbXNnc2RpciAgICAgPSAkKGdnX2xpYmRpcikvbXNncworbXNnc2Rpcl9TUSAgPSAkKHN1YnN0ICcsJ1wnJywkKG1zZ3NkaXIpKQorUE9fVEVNUExBVEUgPSBwby9naXQtZ3VpLnBvdAorQUxMX1BPRklMRVMgPSAkKHdpbGRjYXJkIHBvLyoucG8pCitBTExfTVNHRklMRVMgPSAkKHN1YnN0IC5wbywubXNnLCQoQUxMX1BPRklMRVMpKQorCiskKFBPX1RFTVBMQVRFKTogJChTQ1JJUFRfU0gpICQoQUxMX0xJQkZJTEVTKQorCSQoWEdFVFRFWFQpIC1rbWMgLUxUY2wgLW8gJEAgJChTQ1JJUFRfU0gpICQoQUxMX0xJQkZJTEVTKQordXBkYXRlLXBvOjogJChQT19URU1QTEFURSkKKwkkKGZvcmVhY2ggcCwgJChBTExfUE9GSUxFUyksIGVjaG8gVXBkYXRpbmcgJHAgOyBtc2dtZXJnZSAtVSAkcCAkKFBPX1RFTVBMQVRFKSA7ICkKKyQoQUxMX01TR0ZJTEVTKTogJS5tc2cgOiAlLnBvCisJJChRVUlFVF9NU0dGTVQwKSQoTVNHRk1UKSAtLXN0YXRpc3RpY3MgLS10Y2wgLWwgJChiYXNlbmFtZSAkKG5vdGRpciAkPCkpIC1kICQoZGlyICRAKSAkPCAkKFFVSUVUX01TR0ZNVDEpCisKK2xpYi90Y2xJbmRleDogJChBTExfTElCRklMRVMpIEdJVC1HVUktVkFSUworCSQoUVVJRVRfSU5ERVgpaWYgZWNobyBcCisJICAkKGZvcmVhY2ggcCwkKFBSRUxPQURfRklMRVMpLHNvdXJjZSAkcFw7KSBcCisJICBhdXRvX21raW5kZXggbGliICcqLnRjbCcgXAorCXwgJChUQ0xfUEFUSCkgJChRVUlFVF8yREVWTlVMTCk7IHRoZW4gOiBvazsgXAorCWVsc2UgXAorCSBlY2hvIDE+JjIgIiAgICAqICQoVENMX1BBVEgpIGZhaWxlZDsgdXNpbmcgdW5vcHRpbWl6ZWQgbG9hZGluZyI7IFwKKwkgcm0gLWYgJEAgOyBcCisJIGVjaG8gJyMgQXV0b2dlbmVyYXRlZCBieSBnaXQtZ3VpIE1ha2VmaWxlJyA+JEAgJiYgXAorCSBlY2hvID4+JEAgJiYgXAorCSAkKGZvcmVhY2ggcCwkKFBSRUxPQURfRklMRVMpICQoQUxMX0xJQkZJTEVTKSxlY2hvICckKHN1YnN0IGxpYi8sLCRwKScgPj4kQCAmJikgXAorCSBlY2hvID4+JEAgOyBcCisJZmkKKworVFJBQ0tfVkFSUyA9IFwKKwkkKHN1YnN0ICcsJ1wnJyxTSEVMTF9QQVRIPSckKFNIRUxMX1BBVEhfU1EpJykgXAorCSQoc3Vic3QgJywnXCcnLFRDTF9QQVRIPSckKFRDTF9QQVRIX1NRKScpIFwKKwkkKHN1YnN0ICcsJ1wnJyxUQ0xUS19QQVRIPSckKFRDTFRLX1BBVEhfU1EpJykgXAorCSQoc3Vic3QgJywnXCcnLGdpdGV4ZWNkaXI9JyQoZ2l0ZXhlY2Rpcl9TUSknKSBcCisJJChzdWJzdCAnLCdcJycsZ2dfbGliZGlyPSckKGxpYmRpcl9TUSknKSBcCisJR0lUR1VJX01BQ09TWEFQUD0kKEdJVEdVSV9NQUNPU1hBUFApIFwKKyNlbmQgVFJBQ0tfVkFSUworCitHSVQtR1VJLVZBUlM6IC5GT1JDRS1HSVQtR1VJLVZBUlMKKwlAVkFSUz0nJChUUkFDS19WQVJTKSc7IFwKKwlpZiB0ZXN0IHgiJCRWQVJTIiAhPSB4ImBjYXQgJEAgMj4vZGV2L251bGxgIiA7IHRoZW4gXAorCQllY2hvIDE+JjIgIiAgICAqIG5ldyBsb2NhdGlvbnMgb3IgVGNsL1RrIGludGVycHJldGVyIjsgXAorCQllY2hvIDE+JEAgIiQkVkFSUyI7IFwKKwlmaQorCitpZmRlZiBHSVRHVUlfTUFDT1NYQVBQCithbGw6OiBnaXQtZ3VpIEdpdFwgR3VpLmFwcAorZW5kaWYKK2lmZGVmIEdJVEdVSV9XSU5ET1dTX1dSQVBQRVIKK2FsbDo6IGdpdC1ndWkKK2VuZGlmCithbGw6OiAkKEdJVEdVSV9NQUlOKSBsaWIvdGNsSW5kZXggJChBTExfTVNHRklMRVMpCisKK2luc3RhbGw6IGFsbAorCSQoUVVJRVQpJChJTlNUQUxMX0QwKSckKERFU1RESVJfU1EpJChnaXRleGVjZGlyX1NRKScgJChJTlNUQUxMX0QxKQorCSQoUVVJRVQpJChJTlNUQUxMX1gwKWdpdC1ndWkgJChJTlNUQUxMX1gxKSAnJChERVNURElSX1NRKSQoZ2l0ZXhlY2Rpcl9TUSknCisJJChRVUlFVCkkKGZvcmVhY2ggcCwkKEdJVEdVSV9CVUlMVF9JTlMpLCAkKElOU1RBTExfTDApJyQoREVTVERJUl9TUSkkKGdpdGV4ZWNkaXJfU1EpLyRwJyAkKElOU1RBTExfTDEpJyQoREVTVERJUl9TUSkkKGdpdGV4ZWNkaXJfU1EpL2dpdC1ndWknICQoSU5TVEFMTF9MMiknJChERVNURElSX1NRKSQoZ2l0ZXhlY2Rpcl9TUSkvJHAnICQoSU5TVEFMTF9MMykgJiYpIHRydWUKK2lmZGVmIEdJVEdVSV9XSU5ET1dTX1dSQVBQRVIKKwkkKFFVSUVUKSQoSU5TVEFMTF9SMClnaXQtZ3VpLnRjbCAkKElOU1RBTExfUjEpICckKERFU1RESVJfU1EpJChnaXRleGVjZGlyX1NRKScKK2VuZGlmCisJJChRVUlFVCkkKElOU1RBTExfRDApJyQoREVTVERJUl9TUSkkKGxpYmRpcl9TUSknICQoSU5TVEFMTF9EMSkKKwkkKFFVSUVUKSQoSU5TVEFMTF9SMClsaWIvdGNsSW5kZXggJChJTlNUQUxMX1IxKSAnJChERVNURElSX1NRKSQobGliZGlyX1NRKScKK2lmZGVmIEdJVEdVSV9NQUNPU1hBUFAKKwkkKFFVSUVUKSQoSU5TVEFMTF9BMCknR2l0IEd1aS5hcHAnICQoSU5TVEFMTF9BMSkgJyQoREVTVERJUl9TUSkkKGxpYmRpcl9TUSknCisJJChRVUlFVCkkKElOU1RBTExfWDApZ2l0LWd1aS50Y2wgJChJTlNUQUxMX1gxKSAnJChERVNURElSX1NRKSQobGliZGlyX1NRKScKK2VuZGlmCisJJChRVUlFVCkkKGZvcmVhY2ggcCwkKEFMTF9MSUJGSUxFUykgJChOT05UQ0xfTElCRklMRVMpLCAkKElOU1RBTExfUjApJHAgJChJTlNUQUxMX1IxKSAnJChERVNURElSX1NRKSQobGliZGlyX1NRKScgJiYpIHRydWUKKwkkKFFVSUVUKSQoSU5TVEFMTF9EMCknJChERVNURElSX1NRKSQobXNnc2Rpcl9TUSknICQoSU5TVEFMTF9EMSkKKwkkKFFVSUVUKSQoZm9yZWFjaCBwLCQoQUxMX01TR0ZJTEVTKSwgJChJTlNUQUxMX1IwKSRwICQoSU5TVEFMTF9SMSkgJyQoREVTVERJUl9TUSkkKG1zZ3NkaXJfU1EpJyAmJikgdHJ1ZQorCit1bmluc3RhbGw6CisJJChRVUlFVCkkKENMRUFOX0RTVCkgJyQoREVTVERJUl9TUSkkKGdpdGV4ZWNkaXJfU1EpJworCSQoUVVJRVQpJChSRU1PVkVfRjApJyQoREVTVERJUl9TUSkkKGdpdGV4ZWNkaXJfU1EpJy9naXQtZ3VpICQoUkVNT1ZFX0YxKQorCSQoUVVJRVQpJChmb3JlYWNoIHAsJChHSVRHVUlfQlVJTFRfSU5TKSwgJChSRU1PVkVfRjApJyQoREVTVERJUl9TUSkkKGdpdGV4ZWNkaXJfU1EpJy8kcCAkKFJFTU9WRV9GMSkgJiYpIHRydWUKK2lmZGVmIEdJVEdVSV9XSU5ET1dTX1dSQVBQRVIKKwkkKFFVSUVUKSQoUkVNT1ZFX0YwKSckKERFU1RESVJfU1EpJChnaXRleGVjZGlyX1NRKScvZ2l0LWd1aS50Y2wgJChSRU1PVkVfRjEpCitlbmRpZgorCSQoUVVJRVQpJChDTEVBTl9EU1QpICckKERFU1RESVJfU1EpJChsaWJkaXJfU1EpJworCSQoUVVJRVQpJChSRU1PVkVfRjApJyQoREVTVERJUl9TUSkkKGxpYmRpcl9TUSknL3RjbEluZGV4ICQoUkVNT1ZFX0YxKQoraWZkZWYgR0lUR1VJX01BQ09TWEFQUAorCSQoUVVJRVQpJChSRU1PVkVfRjApJyQoREVTVERJUl9TUSkkKGxpYmRpcl9TUSkvR2l0IEd1aS5hcHAnICQoUkVNT1ZFX0YxKQorCSQoUVVJRVQpJChSRU1PVkVfRjApJyQoREVTVERJUl9TUSkkKGxpYmRpcl9TUSknL2dpdC1ndWkudGNsICQoUkVNT1ZFX0YxKQorZW5kaWYKKwkkKFFVSUVUKSQoZm9yZWFjaCBwLCQoQUxMX0xJQkZJTEVTKSAkKE5PTlRDTF9MSUJGSUxFUyksICQoUkVNT1ZFX0YwKSckKERFU1RESVJfU1EpJChsaWJkaXJfU1EpJy8kKG5vdGRpciAkcCkgJChSRU1PVkVfRjEpICYmKSB0cnVlCisJJChRVUlFVCkkKENMRUFOX0RTVCkgJyQoREVTVERJUl9TUSkkKG1zZ3NkaXJfU1EpJworCSQoUVVJRVQpJChmb3JlYWNoIHAsJChBTExfTVNHRklMRVMpLCAkKFJFTU9WRV9GMCknJChERVNURElSX1NRKSQobXNnc2Rpcl9TUSknLyQobm90ZGlyICRwKSAkKFJFTU9WRV9GMSkgJiYpIHRydWUKKwkkKFFVSUVUKSQoUkVNT1ZFX0QwKSckKERFU1RESVJfU1EpJChnaXRleGVjZGlyX1NRKScgJChSRU1PVkVfRDEpCisJJChRVUlFVCkkKFJFTU9WRV9EMCknJChERVNURElSX1NRKSQobXNnc2Rpcl9TUSknICQoUkVNT1ZFX0QxKQorCSQoUVVJRVQpJChSRU1PVkVfRDApJyQoREVTVERJUl9TUSkkKGxpYmRpcl9TUSknICQoUkVNT1ZFX0QxKQorCSQoUVVJRVQpJChSRU1PVkVfRDApYGRpcm5hbWUgJyQoREVTVERJUl9TUSkkKGxpYmRpcl9TUSknYCAkKFJFTU9WRV9EMSkKKworZGlzdC12ZXJzaW9uOgorCUBta2RpciAtcCAkKFRBUkRJUikKKwlAZWNobyAkKEdJVEdVSV9WRVJTSU9OKSA+ICQoVEFSRElSKS92ZXJzaW9uCisKK2NsZWFuOjoKKwkkKFJNX1JGKSAkKEdJVEdVSV9NQUlOKSBsaWIvdGNsSW5kZXggcG8vKi5tc2cKKwkkKFJNX1JGKSBHSVQtVkVSU0lPTi1GSUxFIEdJVC1HVUktVkFSUworaWZkZWYgR0lUR1VJX01BQ09TWEFQUAorCSQoUk1fUkYpICdHaXQgR3VpLmFwcCcqIGdpdC1ndWkKK2VuZGlmCitpZmRlZiBHSVRHVUlfV0lORE9XU19XUkFQUEVSCisJJChSTV9SRikgZ2l0LWd1aQorZW5kaWYKKworLlBIT05ZOiBhbGwgaW5zdGFsbCB1bmluc3RhbGwgZGlzdC12ZXJzaW9uIGNsZWFuCisuUEhPTlk6IC5GT1JDRS1HSVQtVkVSU0lPTi1GSUxFCisuUEhPTlk6IC5GT1JDRS1HSVQtR1VJLVZBUlMKZGlmZiAtLWdpdCBhL2dpdC1ndWkvZ2l0LWd1aS5zaCBiL2dpdC1ndWkvZ2l0LWd1aS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YzI1YmI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9naXQtZ3VpLnNoCkBAIC0wLDAgKzEsMjkzOSBAQAorIyEvYmluL3NoCisjIFRjbCBpZ25vcmVzIHRoZSBuZXh0IGxpbmUgLSotIHRjbCAtKi0gXAorIGlmIHRlc3QgInokKiIgPSB6dmVyc2lvbiBcCisgfHwgdGVzdCAieiQqIiA9IHotLXZlcnNpb247IFwKKyB0aGVuIFwKKwllY2hvICdnaXQtZ3VpIHZlcnNpb24gQEBHSVRHVUlfVkVSU0lPTkBAJzsgXAorCWV4aXQ7IFwKKyBmaTsgXAorIGFyZ3YwPSQwOyBcCisgZXhlYyB3aXNoICIkYXJndjAiIC0tICIkQCIKKworc2V0IGFwcHZlcnMge0BAR0lUR1VJX1ZFUlNJT05AQH0KK3NldCBjb3B5cmlnaHQgW2VuY29kaW5nIGNvbnZlcnRmcm9tIHV0Zi04IHsKK0NvcHlyaWdodCDCqSAyMDA2LCAyMDA3IFNoYXduIFBlYXJjZSwgZXQuIGFsLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0F9XQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIworIyMgVGNsL1RrIHNhbml0eSBjaGVjaworCitpZiB7W2NhdGNoIHtwYWNrYWdlIHJlcXVpcmUgVGNsIDguNH0gZXJyXQorIHx8IFtjYXRjaCB7cGFja2FnZSByZXF1aXJlIFRrICA4LjR9IGVycl0KK30geworCWNhdGNoIHt3bSB3aXRoZHJhdyAufQorCXRrX21lc3NhZ2VCb3ggXAorCQktaWNvbiBlcnJvciBcCisJCS10eXBlIG9rIFwKKwkJLXRpdGxlIFttYyAiZ2l0LWd1aTogZmF0YWwgZXJyb3IiXSBcCisJCS1tZXNzYWdlICRlcnIKKwlleGl0IDEKK30KKworY2F0Y2gge3JlbmFtZSBzZW5kIHt9fSA7ICMgV2hhdCBhbiBldmlsIGNvbmNlcHQuLi4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMKKyMjIGxvY2F0ZSBvdXIgbGlicmFyeQorCitzZXQgb2d1aWxpYiB7QEBHSVRHVUlfTElCRElSQEB9CitzZXQgb2d1aXJlbCB7QEBHSVRHVUlfUkVMQVRJVkVAQH0KK2lmIHskb2d1aXJlbCBlcSB7MX19IHsKKwlzZXQgb2d1aWxpYiBbZmlsZSBkaXJuYW1lIFtmaWxlIGRpcm5hbWUgW2ZpbGUgbm9ybWFsaXplICRhcmd2MF1dXQorCXNldCBvZ3VpbGliIFtmaWxlIGpvaW4gJG9ndWlsaWIgc2hhcmUgZ2l0LWd1aSBsaWJdCisJc2V0IG9ndWltc2cgW2ZpbGUgam9pbiAkb2d1aWxpYiBtc2dzXQorfSBlbHNlaWYge1tzdHJpbmcgbWF0Y2ggQEAqICRvZ3VpcmVsXX0geworCXNldCBvZ3VpbGliIFtmaWxlIGpvaW4gW2ZpbGUgZGlybmFtZSBbZmlsZSBub3JtYWxpemUgJGFyZ3YwXV0gbGliXQorCXNldCBvZ3VpbXNnIFtmaWxlIGpvaW4gW2ZpbGUgZGlybmFtZSBbZmlsZSBub3JtYWxpemUgJGFyZ3YwXV0gcG9dCit9IGVsc2UgeworCXNldCBvZ3VpbXNnIFtmaWxlIGpvaW4gJG9ndWlsaWIgbXNnc10KK30KK3Vuc2V0IG9ndWlyZWwKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMKKyMjIGVuYWJsZSB2ZXJib3NlIGxvYWRpbmc/CisKK2lmIHshW2NhdGNoIHtzZXQgX3ZlcmJvc2UgJGVudihHSVRHVUlfVkVSQk9TRSl9XX0geworCXVuc2V0IF92ZXJib3NlCisJcmVuYW1lIGF1dG9fbG9hZCByZWFsX19hdXRvX2xvYWQKKwlwcm9jIGF1dG9fbG9hZCB7bmFtZSBhcmdzfSB7CisJCXB1dHMgc3RkZXJyICJhdXRvX2xvYWQgJG5hbWUiCisJCXJldHVybiBbdXBsZXZlbCAxIHJlYWxfX2F1dG9fbG9hZCAkbmFtZSAkYXJnc10KKwl9CisJcmVuYW1lIHNvdXJjZSByZWFsX19zb3VyY2UKKwlwcm9jIHNvdXJjZSB7bmFtZX0geworCQlwdXRzIHN0ZGVyciAic291cmNlICAgICRuYW1lIgorCQl1cGxldmVsIDEgcmVhbF9fc291cmNlICRuYW1lCisJfQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIworIyMgSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIHRocm91Z2ggbXNnY2F0IGFuZCBnZXR0ZXh0LiBTZWUKKyMjIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nZXR0ZXh0L21hbnVhbC9odG1sX25vZGUvVGNsLmh0bWwKKworcGFja2FnZSByZXF1aXJlIG1zZ2NhdAorCitwcm9jIF9tY190cmltIHtmbXR9IHsKKwlzZXQgY21rIFtzdHJpbmcgZmlyc3QgQEAgJGZtdF0KKwlpZiB7JGNtayA+IDB9IHsKKwkJcmV0dXJuIFtzdHJpbmcgcmFuZ2UgJGZtdCAwIFtleHByIHskY21rIC0gMX1dXQorCX0KKwlyZXR1cm4gJGZtdAorfQorCitwcm9jIG1jIHtlbl9mbXQgYXJnc30geworCXNldCBmbXQgW19tY190cmltIFs6Om1zZ2NhdDo6bWMgJGVuX2ZtdF1dCisJaWYge1tjYXRjaCB7c2V0IG1zZyBbZXZhbCBbbGlzdCBmb3JtYXQgJGZtdF0gJGFyZ3NdfSBlcnJdfSB7CisJCXNldCBtc2cgW2V2YWwgW2xpc3QgZm9ybWF0IFtfbWNfdHJpbSAkZW5fZm10XV0gJGFyZ3NdCisJfQorCXJldHVybiAkbXNnCit9CisKK3Byb2Mgc3RyY2F0IHthcmdzfSB7CisJcmV0dXJuIFtqb2luICRhcmdzIHt9XQorfQorCis6Om1zZ2NhdDo6bWNsb2FkICRvZ3VpbXNnCit1bnNldCBvZ3VpbXNnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjCisjIyByZWFkIG9ubHkgZ2xvYmFscworCitzZXQgX2FwcG5hbWUge0dpdCBHdWl9CitzZXQgX2dpdGRpciB7fQorc2V0IF9naXRleGVjIHt9CitzZXQgX3JlcG9uYW1lIHt9CitzZXQgX2lzY3lnd2luIHt9CitzZXQgX3NlYXJjaF9wYXRoIHt9CisKK3Byb2MgYXBwbmFtZSB7fSB7CisJZ2xvYmFsIF9hcHBuYW1lCisJcmV0dXJuICRfYXBwbmFtZQorfQorCitwcm9jIGdpdGRpciB7YXJnc30geworCWdsb2JhbCBfZ2l0ZGlyCisJaWYgeyRhcmdzIGVxIHt9fSB7CisJCXJldHVybiAkX2dpdGRpcgorCX0KKwlyZXR1cm4gW2V2YWwgW2xpc3QgZmlsZSBqb2luICRfZ2l0ZGlyXSAkYXJnc10KK30KKworcHJvYyBnaXRleGVjIHthcmdzfSB7CisJZ2xvYmFsIF9naXRleGVjCisJaWYgeyRfZ2l0ZXhlYyBlcSB7fX0geworCQlpZiB7W2NhdGNoIHtzZXQgX2dpdGV4ZWMgW2dpdCAtLWV4ZWMtcGF0aF19IGVycl19IHsKKwkJCWVycm9yICJHaXQgbm90IGluc3RhbGxlZD9cblxuJGVyciIKKwkJfQorCQlpZiB7W2lzX0N5Z3dpbl19IHsKKwkJCXNldCBfZ2l0ZXhlYyBbZXhlYyBjeWdwYXRoIFwKKwkJCQktLXdpbmRvd3MgXAorCQkJCS0tYWJzb2x1dGUgXAorCQkJCSRfZ2l0ZXhlY10KKwkJfSBlbHNlIHsKKwkJCXNldCBfZ2l0ZXhlYyBbZmlsZSBub3JtYWxpemUgJF9naXRleGVjXQorCQl9CisJfQorCWlmIHskYXJncyBlcSB7fX0geworCQlyZXR1cm4gJF9naXRleGVjCisJfQorCXJldHVybiBbZXZhbCBbbGlzdCBmaWxlIGpvaW4gJF9naXRleGVjXSAkYXJnc10KK30KKworcHJvYyByZXBvbmFtZSB7fSB7CisJcmV0dXJuICQ6Ol9yZXBvbmFtZQorfQorCitwcm9jIGlzX01hY09TWCB7fSB7CisJaWYge1t0ayB3aW5kb3dpbmdzeXN0ZW1dIGVxIHthcXVhfX0geworCQlyZXR1cm4gMQorCX0KKwlyZXR1cm4gMAorfQorCitwcm9jIGlzX1dpbmRvd3Mge30geworCWlmIHskOjp0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pIGVxIHt3aW5kb3dzfX0geworCQlyZXR1cm4gMQorCX0KKwlyZXR1cm4gMAorfQorCitwcm9jIGlzX0N5Z3dpbiB7fSB7CisJZ2xvYmFsIF9pc2N5Z3dpbgorCWlmIHskX2lzY3lnd2luIGVxIHt9fSB7CisJCWlmIHskOjp0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pIGVxIHt3aW5kb3dzfX0geworCQkJaWYge1tjYXRjaCB7c2V0IHAgW2V4ZWMgY3lncGF0aCAtLXdpbmRpcl19IGVycl19IHsKKwkJCQlzZXQgX2lzY3lnd2luIDAKKwkJCX0gZWxzZSB7CisJCQkJc2V0IF9pc2N5Z3dpbiAxCisJCQl9CisJCX0gZWxzZSB7CisJCQlzZXQgX2lzY3lnd2luIDAKKwkJfQorCX0KKwlyZXR1cm4gJF9pc2N5Z3dpbgorfQorCitwcm9jIGlzX2VuYWJsZWQge29wdGlvbn0geworCWdsb2JhbCBlbmFibGVkX29wdGlvbnMKKwlpZiB7W2NhdGNoIHtzZXQgb24gJGVuYWJsZWRfb3B0aW9ucygkb3B0aW9uKX1dfSB7cmV0dXJuIDB9CisJcmV0dXJuICRvbgorfQorCitwcm9jIGVuYWJsZV9vcHRpb24ge29wdGlvbn0geworCWdsb2JhbCBlbmFibGVkX29wdGlvbnMKKwlzZXQgZW5hYmxlZF9vcHRpb25zKCRvcHRpb24pIDEKK30KKworcHJvYyBkaXNhYmxlX29wdGlvbiB7b3B0aW9ufSB7CisJZ2xvYmFsIGVuYWJsZWRfb3B0aW9ucworCXNldCBlbmFibGVkX29wdGlvbnMoJG9wdGlvbikgMAorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIworIyMgY29uZmlnCisKK3Byb2MgaXNfbWFueV9jb25maWcge25hbWV9IHsKKwlzd2l0Y2ggLWdsb2IgLS0gJG5hbWUgeworCWd1aS5yZWNlbnRyZXBvIC0KKwlyZW1vdGUuKi5mZXRjaCAtCisJcmVtb3RlLioucHVzaAorCQl7cmV0dXJuIDF9CisJKgorCQl7cmV0dXJuIDB9CisJfQorfQorCitwcm9jIGlzX2NvbmZpZ190cnVlIHtuYW1lfSB7CisJZ2xvYmFsIHJlcG9fY29uZmlnCisJaWYge1tjYXRjaCB7c2V0IHYgJHJlcG9fY29uZmlnKCRuYW1lKX1dfSB7CisJCXJldHVybiAwCisJfSBlbHNlaWYgeyR2IGVxIHt0cnVlfSB8fCAkdiBlcSB7MX0gfHwgJHYgZXEge3llc319IHsKKwkJcmV0dXJuIDEKKwl9IGVsc2UgeworCQlyZXR1cm4gMAorCX0KK30KKworcHJvYyBnZXRfY29uZmlnIHtuYW1lfSB7CisJZ2xvYmFsIHJlcG9fY29uZmlnCisJaWYge1tjYXRjaCB7c2V0IHYgJHJlcG9fY29uZmlnKCRuYW1lKX1dfSB7CisJCXJldHVybiB7fQorCX0gZWxzZSB7CisJCXJldHVybiAkdgorCX0KK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMKKyMjIGhhbmR5IHV0aWxzCisKK3Byb2MgX2dpdF9jbWQge25hbWV9IHsKKwlnbG9iYWwgX2dpdF9jbWRfcGF0aAorCisJaWYge1tjYXRjaCB7c2V0IHYgJF9naXRfY21kX3BhdGgoJG5hbWUpfV19IHsKKwkJc3dpdGNoIC0tICRuYW1lIHsKKwkJICB2ZXJzaW9uICAgLQorCQktLXZlcnNpb24gICAtCisJCS0tZXhlYy1wYXRoIHsgcmV0dXJuIFtsaXN0ICQ6Ol9naXQgJG5hbWVdIH0KKwkJfQorCisJCXNldCBwIFtnaXRleGVjIGdpdC0kbmFtZSQ6Ol9zZWFyY2hfZXhlXQorCQlpZiB7W2ZpbGUgZXhpc3RzICRwXX0geworCQkJc2V0IHYgW2xpc3QgJHBdCisJCX0gZWxzZWlmIHtbaXNfV2luZG93c10gJiYgW2ZpbGUgZXhpc3RzIFtnaXRleGVjIGdpdC0kbmFtZV1dfSB7CisJCQkjIFRyeSB0byBkZXRlcm1pbmUgd2hhdCBzb3J0IG9mIG1hZ2ljIHdpbGwgbWFrZQorCQkJIyBnaXQtJG5hbWUgZ28gYW5kIGRvIGl0cyB0aGluZywgYmVjYXVzZSBuYXRpdmUKKwkJCSMgVGNsIG9uIFdpbmRvd3MgZG9lc24ndCBrbm93IGl0LgorCQkJIworCQkJc2V0IHAgW2dpdGV4ZWMgZ2l0LSRuYW1lXQorCQkJc2V0IGYgW29wZW4gJHAgcl0KKwkJCXNldCBzIFtnZXRzICRmXQorCQkJY2xvc2UgJGYKKworCQkJc3dpdGNoIC1nbG9iIC0tIFtsaW5kZXggJHMgMF0geworCQkJIyEqc2ggICAgIHsgc2V0IGkgc2ggICAgIH0KKwkJCSMhKnBlcmwgICB7IHNldCBpIHBlcmwgICB9CisJCQkjISpweXRob24geyBzZXQgaSBweXRob24gfQorCQkJZGVmYXVsdCAgIHsgZXJyb3IgImdpdC0kbmFtZSBpcyBub3Qgc3VwcG9ydGVkOiAkcyIgfQorCQkJfQorCisJCQl1cHZhciAjMCBfJGkgaW50ZXJwCisJCQlpZiB7IVtpbmZvIGV4aXN0cyBpbnRlcnBdfSB7CisJCQkJc2V0IGludGVycCBbX3doaWNoICRpXQorCQkJfQorCQkJaWYgeyRpbnRlcnAgZXEge319IHsKKwkJCQllcnJvciAiZ2l0LSRuYW1lIHJlcXVpcmVzICRpIChub3QgaW4gUEFUSCkiCisJCQl9CisJCQlzZXQgdiBbY29uY2F0IFtsaXN0ICRpbnRlcnBdIFtscmFuZ2UgJHMgMSBlbmRdIFtsaXN0ICRwXV0KKwkJfSBlbHNlIHsKKwkJCSMgQXNzdW1lIGl0IGlzIGJ1aWx0aW4gdG8gZ2l0IHNvbWVob3cgYW5kIHdlCisJCQkjIGFyZW4ndCBhY3R1YWxseSBhYmxlIHRvIHNlZSBhIGZpbGUgZm9yIGl0LgorCQkJIworCQkJc2V0IHYgW2xpc3QgJDo6X2dpdCAkbmFtZV0KKwkJfQorCQlzZXQgX2dpdF9jbWRfcGF0aCgkbmFtZSkgJHYKKwl9CisJcmV0dXJuICR2Cit9CisKK3Byb2MgX3doaWNoIHt3aGF0fSB7CisJZ2xvYmFsIGVudiBfc2VhcmNoX2V4ZSBfc2VhcmNoX3BhdGgKKworCWlmIHskX3NlYXJjaF9wYXRoIGVxIHt9fSB7CisJCWlmIHtbaXNfQ3lnd2luXSAmJiBbcmVnZXhwIHteKC98XC46KX0gJGVudihQQVRIKV19IHsKKwkJCXNldCBfc2VhcmNoX3BhdGggW3NwbGl0IFtleGVjIGN5Z3BhdGggXAorCQkJCS0td2luZG93cyBcCisJCQkJLS1wYXRoIFwKKwkJCQktLWFic29sdXRlIFwKKwkJCQkkZW52KFBBVEgpXSB7O31dCisJCQlzZXQgX3NlYXJjaF9leGUgLmV4ZQorCQl9IGVsc2VpZiB7W2lzX1dpbmRvd3NdfSB7CisJCQlzZXQgZ2l0Z3VpZGlyIFtmaWxlIGRpcm5hbWUgW2luZm8gc2NyaXB0XV0KKwkJCXJlZ3N1YiAtYWxsICI7IiAkZ2l0Z3VpZGlyICJcXDsiIGdpdGd1aWRpcgorCQkJc2V0IGVudihQQVRIKSAiJGdpdGd1aWRpcjskZW52KFBBVEgpIgorCQkJc2V0IF9zZWFyY2hfcGF0aCBbc3BsaXQgJGVudihQQVRIKSB7O31dCisJCQlzZXQgX3NlYXJjaF9leGUgLmV4ZQorCQl9IGVsc2UgeworCQkJc2V0IF9zZWFyY2hfcGF0aCBbc3BsaXQgJGVudihQQVRIKSA6XQorCQkJc2V0IF9zZWFyY2hfZXhlIHt9CisJCX0KKwl9CisKKwlmb3JlYWNoIHAgJF9zZWFyY2hfcGF0aCB7CisJCXNldCBwIFtmaWxlIGpvaW4gJHAgJHdoYXQkX3NlYXJjaF9leGVdCisJCWlmIHtbZmlsZSBleGlzdHMgJHBdfSB7CisJCQlyZXR1cm4gW2ZpbGUgbm9ybWFsaXplICRwXQorCQl9CisJfQorCXJldHVybiB7fQorfQorCitwcm9jIF9sYXBwZW5kX25pY2Uge2NtZF92YXJ9IHsKKwlnbG9iYWwgX25pY2UKKwl1cHZhciAkY21kX3ZhciBjbWQKKworCWlmIHshW2luZm8gZXhpc3RzIF9uaWNlXX0geworCQlzZXQgX25pY2UgW193aGljaCBuaWNlXQorCX0KKwlpZiB7JF9uaWNlIG5lIHt9fSB7CisJCWxhcHBlbmQgY21kICRfbmljZQorCX0KK30KKworcHJvYyBnaXQge2FyZ3N9IHsKKwlzZXQgb3B0IFtsaXN0IGV4ZWNdCisKKwl3aGlsZSB7MX0geworCQlzd2l0Y2ggLS0gW2xpbmRleCAkYXJncyAwXSB7CisJCS0tbmljZSB7CisJCQlfbGFwcGVuZF9uaWNlIG9wdAorCQl9CisKKwkJZGVmYXVsdCB7CisJCQlicmVhaworCQl9CisKKwkJfQorCisJCXNldCBhcmdzIFtscmFuZ2UgJGFyZ3MgMSBlbmRdCisJfQorCisJc2V0IGNtZHAgW19naXRfY21kIFtsaW5kZXggJGFyZ3MgMF1dCisJc2V0IGFyZ3MgW2xyYW5nZSAkYXJncyAxIGVuZF0KKworCXJldHVybiBbZXZhbCAkb3B0ICRjbWRwICRhcmdzXQorfQorCitwcm9jIF9vcGVuX3N0ZG91dF9zdGRlcnIge2NtZH0geworCWlmIHtbY2F0Y2ggeworCQkJc2V0IGZkIFtvcGVuICRjbWQgcl0KKwkJfSBlcnJdfSB7CisJCWlmIHsgICBbbGluZGV4ICRjbWQgZW5kXSBlcSB7Mj5AMX0KKwkJICAgICYmICRlcnIgZXEge2NhbiBub3QgZmluZCBjaGFubmVsIG5hbWVkICIxIn0KKwkJCX0geworCQkJIyBPbGRlciB2ZXJzaW9ucyBvZiBUY2wgOC40IGRvbid0IGhhdmUgdGhpcyAyPkAxIElPCisJCQkjIHJlZGlyZWN0IG9wZXJhdG9yLiAgRmFsbGJhY2sgdG8gfCYgY2F0IGZvciB0aG9zZS4KKwkJCSMgVGhlIGNvbW1hbmQgd2FzIG5vdCBhY3R1YWxseSBzdGFydGVkLCBzbyBpdHMgc2FmZQorCQkJIyB0byB0cnkgdG8gc3RhcnQgaXQgYSBzZWNvbmQgdGltZS4KKwkJCSMKKwkJCXNldCBmZCBbb3BlbiBbY29uY2F0IFwKKwkJCQlbbHJhbmdlICRjbWQgMCBlbmQtMV0gXAorCQkJCVtsaXN0IHwmIGNhdF0gXAorCQkJCV0gcl0KKwkJfSBlbHNlIHsKKwkJCWVycm9yICRlcnIKKwkJfQorCX0KKwlmY29uZmlndXJlICRmZCAtZW9mY2hhciB7fQorCXJldHVybiAkZmQKK30KKworcHJvYyBnaXRfcmVhZCB7YXJnc30geworCXNldCBvcHQgW2xpc3QgfF0KKworCXdoaWxlIHsxfSB7CisJCXN3aXRjaCAtLSBbbGluZGV4ICRhcmdzIDBdIHsKKwkJLS1uaWNlIHsKKwkJCV9sYXBwZW5kX25pY2Ugb3B0CisJCX0KKworCQktLXN0ZGVyciB7CisJCQlsYXBwZW5kIGFyZ3MgMj5AMQorCQl9CisKKwkJZGVmYXVsdCB7CisJCQlicmVhaworCQl9CisKKwkJfQorCisJCXNldCBhcmdzIFtscmFuZ2UgJGFyZ3MgMSBlbmRdCisJfQorCisJc2V0IGNtZHAgW19naXRfY21kIFtsaW5kZXggJGFyZ3MgMF1dCisJc2V0IGFyZ3MgW2xyYW5nZSAkYXJncyAxIGVuZF0KKworCXJldHVybiBbX29wZW5fc3Rkb3V0X3N0ZGVyciBbY29uY2F0ICRvcHQgJGNtZHAgJGFyZ3NdXQorfQorCitwcm9jIGdpdF93cml0ZSB7YXJnc30geworCXNldCBvcHQgW2xpc3QgfF0KKworCXdoaWxlIHsxfSB7CisJCXN3aXRjaCAtLSBbbGluZGV4ICRhcmdzIDBdIHsKKwkJLS1uaWNlIHsKKwkJCV9sYXBwZW5kX25pY2Ugb3B0CisJCX0KKworCQlkZWZhdWx0IHsKKwkJCWJyZWFrCisJCX0KKworCQl9CisKKwkJc2V0IGFyZ3MgW2xyYW5nZSAkYXJncyAxIGVuZF0KKwl9CisKKwlzZXQgY21kcCBbX2dpdF9jbWQgW2xpbmRleCAkYXJncyAwXV0KKwlzZXQgYXJncyBbbHJhbmdlICRhcmdzIDEgZW5kXQorCisJcmV0dXJuIFtvcGVuIFtjb25jYXQgJG9wdCAkY21kcCAkYXJnc10gd10KK30KKworcHJvYyBnaXRob29rX3JlYWQge2hvb2tfbmFtZSBhcmdzfSB7CisJc2V0IHBjaG9vayBbZ2l0ZGlyIGhvb2tzICRob29rX25hbWVdCisJbGFwcGVuZCBhcmdzIDI+QDEKKworCSMgT24gQ3lnd2luIFtmaWxlIGV4ZWN1dGFibGVdIG1pZ2h0IGxpZSBzbyB3ZSBuZWVkIHRvIGFzaworCSMgdGhlIHNoZWxsIGlmIHRoZSBob29rIGlzIGV4ZWN1dGFibGUuICBZZXMgdGhhdCdzIGFubm95aW5nLgorCSMKKwlpZiB7W2lzX0N5Z3dpbl19IHsKKwkJdXB2YXIgIzAgX3NoIGludGVycAorCQlpZiB7IVtpbmZvIGV4aXN0cyBpbnRlcnBdfSB7CisJCQlzZXQgaW50ZXJwIFtfd2hpY2ggc2hdCisJCX0KKwkJaWYgeyRpbnRlcnAgZXEge319IHsKKwkJCWVycm9yICJob29rIGV4ZWN1dGlvbiByZXF1aXJlcyBzaCAobm90IGluIFBBVEgpIgorCQl9CisKKwkJc2V0IHNjciB7aWYgdGVzdCAteCAiJDEiO3RoZW4gZXhlYyAiJEAiO2ZpfQorCQlzZXQgc2hfYyBbbGlzdCB8ICRpbnRlcnAgLWMgJHNjciAkaW50ZXJwICRwY2hvb2tdCisJCXJldHVybiBbX29wZW5fc3Rkb3V0X3N0ZGVyciBbY29uY2F0ICRzaF9jICRhcmdzXV0KKwl9CisKKwlpZiB7W2ZpbGUgZXhlY3V0YWJsZSAkcGNob29rXX0geworCQlyZXR1cm4gW19vcGVuX3N0ZG91dF9zdGRlcnIgW2NvbmNhdCBbbGlzdCB8ICRwY2hvb2tdICRhcmdzXV0KKwl9CisKKwlyZXR1cm4ge30KK30KKworcHJvYyBzcSB7dmFsdWV9IHsKKwlyZWdzdWIgLWFsbCAnICR2YWx1ZSAiJ1xcJyciIHZhbHVlCisJcmV0dXJuICInJHZhbHVlJyIKK30KKworcHJvYyBsb2FkX2N1cnJlbnRfYnJhbmNoIHt9IHsKKwlnbG9iYWwgY3VycmVudF9icmFuY2ggaXNfZGV0YWNoZWQKKworCXNldCBmZCBbb3BlbiBbZ2l0ZGlyIEhFQURdIHJdCisJaWYge1tnZXRzICRmZCByZWZdIDwgMX0geworCQlzZXQgcmVmIHt9CisJfQorCWNsb3NlICRmZAorCisJc2V0IHBmeCB7cmVmOiByZWZzL2hlYWRzL30KKwlzZXQgbGVuIFtzdHJpbmcgbGVuZ3RoICRwZnhdCisJaWYge1tzdHJpbmcgZXF1YWwgLWxlbmd0aCAkbGVuICRwZnggJHJlZl19IHsKKwkJIyBXZSdyZSBvbiBhIGJyYW5jaC4gIEl0IG1pZ2h0IG5vdCBleGlzdC4gIEJ1dAorCQkjIEhFQUQgbG9va3MgZ29vZCBlbm91Z2ggdG8gYmUgYSBicmFuY2guCisJCSMKKwkJc2V0IGN1cnJlbnRfYnJhbmNoIFtzdHJpbmcgcmFuZ2UgJHJlZiAkbGVuIGVuZF0KKwkJc2V0IGlzX2RldGFjaGVkIDAKKwl9IGVsc2UgeworCQkjIEFzc3VtZSB0aGlzIGlzIGEgZGV0YWNoZWQgaGVhZC4KKwkJIworCQlzZXQgY3VycmVudF9icmFuY2ggSEVBRAorCQlzZXQgaXNfZGV0YWNoZWQgMQorCX0KK30KKworYXV0b19sb2FkIHRrX29wdGlvbk1lbnUKK3JlbmFtZSB0a19vcHRpb25NZW51IHJlYWxfX3RrT3B0aW9uTWVudQorcHJvYyB0a19vcHRpb25NZW51IHt3IHZhck5hbWUgYXJnc30geworCXNldCBtIFtldmFsIHJlYWxfX3RrT3B0aW9uTWVudSAkdyAkdmFyTmFtZSAkYXJnc10KKwkkbSBjb25maWd1cmUgLWZvbnQgZm9udF91aQorCSR3IGNvbmZpZ3VyZSAtZm9udCBmb250X3VpCisJcmV0dXJuICRtCit9CisKK3Byb2Mgcm1zZWxfdGFnIHt0ZXh0fSB7CisJJHRleHQgdGFnIGNvbmYgc2VsIFwKKwkJLWJhY2tncm91bmQgWyR0ZXh0IGNnZXQgLWJhY2tncm91bmRdIFwKKwkJLWZvcmVncm91bmQgWyR0ZXh0IGNnZXQgLWZvcmVncm91bmRdIFwKKwkJLWJvcmRlcndpZHRoIDAKKwkkdGV4dCB0YWcgY29uZiBpbl9zZWwgLWJhY2tncm91bmQgbGlnaHRncmF5CisJYmluZCAkdGV4dCA8TW90aW9uPiBicmVhaworCXJldHVybiAkdGV4dAorfQorCitzZXQgcm9vdF9leGlzdHMgMAorYmluZCAuIDxWaXNpYmlsaXR5PiB7CisJYmluZCAuIDxWaXNpYmlsaXR5PiB7fQorCXNldCByb290X2V4aXN0cyAxCit9CisKK2lmIHtbaXNfV2luZG93c119IHsKKwl3bSBpY29uYml0bWFwIC4gLWRlZmF1bHQgJG9ndWlsaWIvZ2l0LWd1aS5pY28KK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMKKyMjIGNvbmZpZyBkZWZhdWx0cworCitzZXQgY3Vyc29yX3B0ciBhcnJvdworZm9udCBjcmVhdGUgZm9udF9kaWZmIC1mYW1pbHkgQ291cmllciAtc2l6ZSAxMAorZm9udCBjcmVhdGUgZm9udF91aQorY2F0Y2ggeworCWxhYmVsIC5kdW1teQorCWV2YWwgZm9udCBjb25maWd1cmUgZm9udF91aSBbZm9udCBhY3R1YWwgWy5kdW1teSBjZ2V0IC1mb250XV0KKwlkZXN0cm95IC5kdW1teQorfQorCitmb250IGNyZWF0ZSBmb250X3VpaXRhbGljCitmb250IGNyZWF0ZSBmb250X3VpYm9sZAorZm9udCBjcmVhdGUgZm9udF9kaWZmYm9sZAorZm9udCBjcmVhdGUgZm9udF9kaWZmaXRhbGljCisKK2ZvcmVhY2ggY2xhc3Mge0J1dHRvbiBDaGVja2J1dHRvbiBFbnRyeSBMYWJlbAorCQlMYWJlbGZyYW1lIExpc3Rib3ggTWVudSBNZXNzYWdlCisJCVJhZGlvYnV0dG9uIFNwaW5ib3ggVGV4dH0geworCW9wdGlvbiBhZGQgKiRjbGFzcy5mb250IGZvbnRfdWkKK30KK3Vuc2V0IGNsYXNzCisKK2lmIHtbaXNfV2luZG93c10gfHwgW2lzX01hY09TWF19IHsKKwlvcHRpb24gYWRkICpNZW51LnRlYXJPZmYgMAorfQorCitpZiB7W2lzX01hY09TWF19IHsKKwlzZXQgTTFCIE0xCisJc2V0IE0xVCBDbWQKK30gZWxzZSB7CisJc2V0IE0xQiBDb250cm9sCisJc2V0IE0xVCBDdHJsCit9CisKK3Byb2MgYmluZF9idXR0b24zIHt3IGNtZH0geworCWJpbmQgJHcgPEFueS1CdXR0b24tMz4gJGNtZAorCWlmIHtbaXNfTWFjT1NYXX0geworCQkjIE1hYyBPUyBYIHNlbmRzIEJ1dHRvbi0yIG9uIHJpZ2h0IGNsaWNrIHRocm91Z2ggdGhyZWUtYnV0dG9uIG1vdXNlLAorCQkjIG9yIHRocm91Z2ggdHJhY2twYWQgcmlnaHQtY2xpY2tpbmcgKHR3by1maW5nZXIgdG91Y2ggKyBjbGljaykuCisJCWJpbmQgJHcgPEFueS1CdXR0b24tMj4gJGNtZAorCQliaW5kICR3IDxDb250cm9sLUJ1dHRvbi0xPiAkY21kCisJfQorfQorCitwcm9jIGFwcGx5X2NvbmZpZyB7fSB7CisJZ2xvYmFsIHJlcG9fY29uZmlnIGZvbnRfZGVzY3MKKworCWZvcmVhY2ggb3B0aW9uICRmb250X2Rlc2NzIHsKKwkJc2V0IG5hbWUgW2xpbmRleCAkb3B0aW9uIDBdCisJCXNldCBmb250IFtsaW5kZXggJG9wdGlvbiAxXQorCQlpZiB7W2NhdGNoIHsKKwkJCXNldCBuZWVkX3dlaWdodCAxCisJCQlmb3JlYWNoIHtjbiBjdn0gJHJlcG9fY29uZmlnKGd1aS4kbmFtZSkgeworCQkJCWlmIHskY24gZXEgey13ZWlnaHR9fSB7CisJCQkJCXNldCBuZWVkX3dlaWdodCAwCisJCQkJfQorCQkJCWZvbnQgY29uZmlndXJlICRmb250ICRjbiAkY3YKKwkJCX0KKwkJCWlmIHskbmVlZF93ZWlnaHR9IHsKKwkJCQlmb250IGNvbmZpZ3VyZSAkZm9udCAtd2VpZ2h0IG5vcm1hbAorCQkJfQorCQkJfSBlcnJdfSB7CisJCQllcnJvcl9wb3B1cCBbc3RyY2F0IFttYyAiSW52YWxpZCBmb250IHNwZWNpZmllZCBpbiAlczoiICJndWkuJG5hbWUiXSAiXG5cbiRlcnIiXQorCQl9CisJCWZvcmVhY2gge2NuIGN2fSBbZm9udCBjb25maWd1cmUgJGZvbnRdIHsKKwkJCWZvbnQgY29uZmlndXJlICR7Zm9udH1ib2xkICRjbiAkY3YKKwkJCWZvbnQgY29uZmlndXJlICR7Zm9udH1pdGFsaWMgJGNuICRjdgorCQl9CisJCWZvbnQgY29uZmlndXJlICR7Zm9udH1ib2xkIC13ZWlnaHQgYm9sZAorCQlmb250IGNvbmZpZ3VyZSAke2ZvbnR9aXRhbGljIC1zbGFudCBpdGFsaWMKKwl9Cit9CisKK3NldCBkZWZhdWx0X2NvbmZpZyhtZXJnZS5kaWZmc3RhdCkgdHJ1ZQorc2V0IGRlZmF1bHRfY29uZmlnKG1lcmdlLnN1bW1hcnkpIGZhbHNlCitzZXQgZGVmYXVsdF9jb25maWcobWVyZ2UudmVyYm9zaXR5KSAyCitzZXQgZGVmYXVsdF9jb25maWcodXNlci5uYW1lKSB7fQorc2V0IGRlZmF1bHRfY29uZmlnKHVzZXIuZW1haWwpIHt9CisKK3NldCBkZWZhdWx0X2NvbmZpZyhndWkubWF0Y2h0cmFja2luZ2JyYW5jaCkgZmFsc2UKK3NldCBkZWZhdWx0X2NvbmZpZyhndWkucHJ1bmVkdXJpbmdmZXRjaCkgZmFsc2UKK3NldCBkZWZhdWx0X2NvbmZpZyhndWkudHJ1c3RtdGltZSkgZmFsc2UKK3NldCBkZWZhdWx0X2NvbmZpZyhndWkuZGlmZmNvbnRleHQpIDUKK3NldCBkZWZhdWx0X2NvbmZpZyhndWkuY29tbWl0bXNnd2lkdGgpIDc1CitzZXQgZGVmYXVsdF9jb25maWcoZ3VpLm5ld2JyYW5jaHRlbXBsYXRlKSB7fQorc2V0IGRlZmF1bHRfY29uZmlnKGd1aS5zcGVsbGluZ2RpY3Rpb25hcnkpIHt9CitzZXQgZGVmYXVsdF9jb25maWcoZ3VpLmZvbnR1aSkgW2ZvbnQgY29uZmlndXJlIGZvbnRfdWldCitzZXQgZGVmYXVsdF9jb25maWcoZ3VpLmZvbnRkaWZmKSBbZm9udCBjb25maWd1cmUgZm9udF9kaWZmXQorc2V0IGZvbnRfZGVzY3MgeworCXtmb250dWkgICBmb250X3VpICAge21jICJNYWluIEZvbnQifX0KKwl7Zm9udGRpZmYgZm9udF9kaWZmIHttYyAiRGlmZi9Db25zb2xlIEZvbnQifX0KK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMKKyMjIGZpbmQgZ2l0CisKK3NldCBfZ2l0ICBbX3doaWNoIGdpdF0KK2lmIHskX2dpdCBlcSB7fX0geworCWNhdGNoIHt3bSB3aXRoZHJhdyAufQorCXRrX21lc3NhZ2VCb3ggXAorCQktaWNvbiBlcnJvciBcCisJCS10eXBlIG9rIFwKKwkJLXRpdGxlIFttYyAiZ2l0LWd1aTogZmF0YWwgZXJyb3IiXSBcCisJCS1tZXNzYWdlIFttYyAiQ2Fubm90IGZpbmQgZ2l0IGluIFBBVEguIl0KKwlleGl0IDEKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMKKyMjIHZlcnNpb24gY2hlY2sKKworaWYge1tjYXRjaCB7c2V0IF9naXRfdmVyc2lvbiBbZ2l0IC0tdmVyc2lvbl19IGVycl19IHsKKwljYXRjaCB7d20gd2l0aGRyYXcgLn0KKwl0a19tZXNzYWdlQm94IFwKKwkJLWljb24gZXJyb3IgXAorCQktdHlwZSBvayBcCisJCS10aXRsZSBbbWMgImdpdC1ndWk6IGZhdGFsIGVycm9yIl0gXAorCQktbWVzc2FnZSAiQ2Fubm90IGRldGVybWluZSBHaXQgdmVyc2lvbjoKKworJGVycgorCitbYXBwbmFtZV0gcmVxdWlyZXMgR2l0IDEuNS4wIG9yIGxhdGVyLiIKKwlleGl0IDEKK30KK2lmIHshW3JlZ3N1YiB7XmdpdCB2ZXJzaW9uIH0gJF9naXRfdmVyc2lvbiB7fSBfZ2l0X3ZlcnNpb25dfSB7CisJY2F0Y2gge3dtIHdpdGhkcmF3IC59CisJdGtfbWVzc2FnZUJveCBcCisJCS1pY29uIGVycm9yIFwKKwkJLXR5cGUgb2sgXAorCQktdGl0bGUgW21jICJnaXQtZ3VpOiBmYXRhbCBlcnJvciJdIFwKKwkJLW1lc3NhZ2UgW3N0cmNhdCBbbWMgIkNhbm5vdCBwYXJzZSBHaXQgdmVyc2lvbiBzdHJpbmc6Il0gIlxuXG4kX2dpdF92ZXJzaW9uIl0KKwlleGl0IDEKK30KKworc2V0IF9yZWFsX2dpdF92ZXJzaW9uICRfZ2l0X3ZlcnNpb24KK3JlZ3N1YiAtLSB7W1wtXC5dZGlydHkkfSAkX2dpdF92ZXJzaW9uIHt9IF9naXRfdmVyc2lvbgorcmVnc3ViIHtcLlswLTldK1wuZ1swLTlhLWZdKyR9ICRfZ2l0X3ZlcnNpb24ge30gX2dpdF92ZXJzaW9uCityZWdzdWIge1wucmNbMC05XSskfSAkX2dpdF92ZXJzaW9uIHt9IF9naXRfdmVyc2lvbgorcmVnc3ViIHtcLkdJVCR9ICRfZ2l0X3ZlcnNpb24ge30gX2dpdF92ZXJzaW9uCityZWdzdWIge1wuW2EtekEtWl0rXC5bMC05XSskfSAkX2dpdF92ZXJzaW9uIHt9IF9naXRfdmVyc2lvbgorCitpZiB7IVtyZWdleHAge15bMS05XSsoXC5bMC05XSspKyR9ICRfZ2l0X3ZlcnNpb25dfSB7CisJY2F0Y2gge3dtIHdpdGhkcmF3IC59CisJaWYge1t0a19tZXNzYWdlQm94IFwKKwkJLWljb24gd2FybmluZyBcCisJCS10eXBlIHllc25vIFwKKwkJLWRlZmF1bHQgbm8gXAorCQktdGl0bGUgIlthcHBuYW1lXTogd2FybmluZyIgXAorCQkgLW1lc3NhZ2UgW21jICJHaXQgdmVyc2lvbiBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KKworJXMgY2xhaW1zIGl0IGlzIHZlcnNpb24gJyVzJy4KKworJXMgcmVxdWlyZXMgYXQgbGVhc3QgR2l0IDEuNS4wIG9yIGxhdGVyLgorCitBc3N1bWUgJyVzJyBpcyB2ZXJzaW9uIDEuNS4wPworIiAkX2dpdCAkX3JlYWxfZ2l0X3ZlcnNpb24gW2FwcG5hbWVdICRfcmVhbF9naXRfdmVyc2lvbl1dIGVxIHt5ZXN9fSB7CisJCXNldCBfZ2l0X3ZlcnNpb24gMS41LjAKKwl9IGVsc2UgeworCQlleGl0IDEKKwl9Cit9Cit1bnNldCBfcmVhbF9naXRfdmVyc2lvbgorCitwcm9jIGdpdC12ZXJzaW9uIHthcmdzfSB7CisJZ2xvYmFsIF9naXRfdmVyc2lvbgorCisJc3dpdGNoIFtsbGVuZ3RoICRhcmdzXSB7CisJMCB7CisJCXJldHVybiAkX2dpdF92ZXJzaW9uCisJfQorCisJMiB7CisJCXNldCBvcCBbbGluZGV4ICRhcmdzIDBdCisJCXNldCB2ciBbbGluZGV4ICRhcmdzIDFdCisJCXNldCBjbSBbcGFja2FnZSB2Y29tcGFyZSAkX2dpdF92ZXJzaW9uICR2cl0KKwkJcmV0dXJuIFtleHByICRjbSAkb3AgMF0KKwl9CisKKwk0IHsKKwkJc2V0IHR5cGUgW2xpbmRleCAkYXJncyAwXQorCQlzZXQgbmFtZSBbbGluZGV4ICRhcmdzIDFdCisJCXNldCBwYXJtIFtsaW5kZXggJGFyZ3MgMl0KKwkJc2V0IGJvZHkgW2xpbmRleCAkYXJncyAzXQorCisJCWlmIHsoJHR5cGUgbmUge3Byb2N9ICYmICR0eXBlIG5lIHttZXRob2R9KX0geworCQkJZXJyb3IgIkludmFsaWQgYXJndW1lbnRzIHRvIGdpdC12ZXJzaW9uIgorCQl9CisJCWlmIHtbbGxlbmd0aCAkYm9keV0gPCAyIHx8IFtsaW5kZXggJGJvZHkgZW5kLTFdIG5lIHtkZWZhdWx0fX0geworCQkJZXJyb3IgIkxhc3QgYXJtIG9mICR0eXBlICRuYW1lIG11c3QgYmUgZGVmYXVsdCIKKwkJfQorCisJCWZvcmVhY2gge29wIHZyIGNifSBbbHJhbmdlICRib2R5IDAgZW5kLTJdIHsKKwkJCWlmIHtbZ2l0LXZlcnNpb24gJG9wICR2cl19IHsKKwkJCQlyZXR1cm4gW3VwbGV2ZWwgW2xpc3QgJHR5cGUgJG5hbWUgJHBhcm0gJGNiXV0KKwkJCX0KKwkJfQorCisJCXJldHVybiBbdXBsZXZlbCBbbGlzdCAkdHlwZSAkbmFtZSAkcGFybSBbbGluZGV4ICRib2R5IGVuZF1dXQorCX0KKworCWRlZmF1bHQgeworCQllcnJvciAiZ2l0LXZlcnNpb24gPj0geCIKKwl9CisKKwl9Cit9CisKK2lmIHtbZ2l0LXZlcnNpb24gPCAxLjVdfSB7CisJY2F0Y2gge3dtIHdpdGhkcmF3IC59CisJdGtfbWVzc2FnZUJveCBcCisJCS1pY29uIGVycm9yIFwKKwkJLXR5cGUgb2sgXAorCQktdGl0bGUgW21jICJnaXQtZ3VpOiBmYXRhbCBlcnJvciJdIFwKKwkJLW1lc3NhZ2UgIlthcHBuYW1lXSByZXF1aXJlcyBHaXQgMS41LjAgb3IgbGF0ZXIuCisKK1lvdSBhcmUgdXNpbmcgW2dpdC12ZXJzaW9uXToKKworW2dpdCAtLXZlcnNpb25dIgorCWV4aXQgMQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIworIyMgY29uZmlndXJlIG91ciBsaWJyYXJ5CisKK3NldCBpZHggW2ZpbGUgam9pbiAkb2d1aWxpYiB0Y2xJbmRleF0KK2lmIHtbY2F0Y2gge3NldCBmZCBbb3BlbiAkaWR4IHJdfSBlcnJdfSB7CisJY2F0Y2gge3dtIHdpdGhkcmF3IC59CisJdGtfbWVzc2FnZUJveCBcCisJCS1pY29uIGVycm9yIFwKKwkJLXR5cGUgb2sgXAorCQktdGl0bGUgW21jICJnaXQtZ3VpOiBmYXRhbCBlcnJvciJdIFwKKwkJLW1lc3NhZ2UgJGVycgorCWV4aXQgMQorfQoraWYge1tnZXRzICRmZF0gZXEgeyMgQXV0b2dlbmVyYXRlZCBieSBnaXQtZ3VpIE1ha2VmaWxlfX0geworCXNldCBpZHggW2xpc3RdCisJd2hpbGUge1tnZXRzICRmZCBuXSA+PSAwfSB7CisJCWlmIHskbiBuZSB7fSAmJiAhW3N0cmluZyBtYXRjaCAjKiAkbl19IHsKKwkJCWxhcHBlbmQgaWR4ICRuCisJCX0KKwl9Cit9IGVsc2UgeworCXNldCBpZHgge30KK30KK2Nsb3NlICRmZAorCitpZiB7JGlkeCBuZSB7fX0geworCXNldCBsb2FkZWQgW2xpc3RdCisJZm9yZWFjaCBwICRpZHggeworCQlpZiB7W2xzZWFyY2ggLWV4YWN0ICRsb2FkZWQgJHBdID49IDB9IGNvbnRpbnVlCisJCXNvdXJjZSBbZmlsZSBqb2luICRvZ3VpbGliICRwXQorCQlsYXBwZW5kIGxvYWRlZCAkcAorCX0KKwl1bnNldCBsb2FkZWQgcAorfSBlbHNlIHsKKwlzZXQgYXV0b19wYXRoIFtjb25jYXQgW2xpc3QgJG9ndWlsaWJdICRhdXRvX3BhdGhdCit9Cit1bnNldCAtbm9jb21wbGFpbiBpZHggZmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMKKyMjIGNvbmZpZyBmaWxlIHBhcnNpbmcKKworZ2l0LXZlcnNpb24gcHJvYyBfcGFyc2VfY29uZmlnIHthcnJfbmFtZSBhcmdzfSB7CisJPj0gMS41LjMgeworCQl1cHZhciAkYXJyX25hbWUgYXJyCisJCWFycmF5IHVuc2V0IGFycgorCQlzZXQgYnVmIHt9CisJCWNhdGNoIHsKKwkJCXNldCBmZF9yYyBbZXZhbCBcCisJCQkJW2xpc3QgZ2l0X3JlYWQgY29uZmlnXSBcCisJCQkJJGFyZ3MgXAorCQkJCVtsaXN0IC0tbnVsbCAtLWxpc3RdXQorCQkJZmNvbmZpZ3VyZSAkZmRfcmMgLXRyYW5zbGF0aW9uIGJpbmFyeQorCQkJc2V0IGJ1ZiBbcmVhZCAkZmRfcmNdCisJCQljbG9zZSAkZmRfcmMKKwkJfQorCQlmb3JlYWNoIGxpbmUgW3NwbGl0ICRidWYgIlwwIl0geworCQkJaWYge1tyZWdleHAge14oW15cbl0rKVxuKC4qKSR9ICRsaW5lIGxpbmUgbmFtZSB2YWx1ZV19IHsKKwkJCQlpZiB7W2lzX21hbnlfY29uZmlnICRuYW1lXX0geworCQkJCQlsYXBwZW5kIGFycigkbmFtZSkgJHZhbHVlCisJCQkJfSBlbHNlIHsKKwkJCQkJc2V0IGFycigkbmFtZSkgJHZhbHVlCisJCQkJfQorCQkJfQorCQl9CisJfQorCWRlZmF1bHQgeworCQl1cHZhciAkYXJyX25hbWUgYXJyCisJCWFycmF5IHVuc2V0IGFycgorCQljYXRjaCB7CisJCQlzZXQgZmRfcmMgW2V2YWwgW2xpc3QgZ2l0X3JlYWQgY29uZmlnIC0tbGlzdF0gJGFyZ3NdCisJCQl3aGlsZSB7W2dldHMgJGZkX3JjIGxpbmVdID49IDB9IHsKKwkJCQlpZiB7W3JlZ2V4cCB7XihbXj1dKyk9KC4qKSR9ICRsaW5lIGxpbmUgbmFtZSB2YWx1ZV19IHsKKwkJCQkJaWYge1tpc19tYW55X2NvbmZpZyAkbmFtZV19IHsKKwkJCQkJCWxhcHBlbmQgYXJyKCRuYW1lKSAkdmFsdWUKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXNldCBhcnIoJG5hbWUpICR2YWx1ZQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJY2xvc2UgJGZkX3JjCisJCX0KKwl9Cit9CisKK3Byb2MgbG9hZF9jb25maWcge2luY2x1ZGVfZ2xvYmFsfSB7CisJZ2xvYmFsIHJlcG9fY29uZmlnIGdsb2JhbF9jb25maWcgZGVmYXVsdF9jb25maWcKKworCWlmIHskaW5jbHVkZV9nbG9iYWx9IHsKKwkJX3BhcnNlX2NvbmZpZyBnbG9iYWxfY29uZmlnIC0tZ2xvYmFsCisJfQorCV9wYXJzZV9jb25maWcgcmVwb19jb25maWcKKworCWZvcmVhY2ggbmFtZSBbYXJyYXkgbmFtZXMgZGVmYXVsdF9jb25maWddIHsKKwkJaWYge1tjYXRjaCB7c2V0IHYgJGdsb2JhbF9jb25maWcoJG5hbWUpfV19IHsKKwkJCXNldCBnbG9iYWxfY29uZmlnKCRuYW1lKSAkZGVmYXVsdF9jb25maWcoJG5hbWUpCisJCX0KKwkJaWYge1tjYXRjaCB7c2V0IHYgJHJlcG9fY29uZmlnKCRuYW1lKX1dfSB7CisJCQlzZXQgcmVwb19jb25maWcoJG5hbWUpICRkZWZhdWx0X2NvbmZpZygkbmFtZSkKKwkJfQorCX0KK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMKKyMjIGZlYXR1cmUgb3B0aW9uIHNlbGVjdGlvbgorCitpZiB7W3JlZ2V4cCB7XmdpdC0oLispJH0gW2ZpbGUgdGFpbCAkYXJndjBdIF9qdW5rIHN1YmNvbW1hbmRdfSB7CisJdW5zZXQgX2p1bmsKK30gZWxzZSB7CisJc2V0IHN1YmNvbW1hbmQgZ3VpCit9CitpZiB7JHN1YmNvbW1hbmQgZXEge2d1aS5zaH19IHsKKwlzZXQgc3ViY29tbWFuZCBndWkKK30KK2lmIHskc3ViY29tbWFuZCBlcSB7Z3VpfSAmJiBbbGxlbmd0aCAkYXJndl0gPiAwfSB7CisJc2V0IHN1YmNvbW1hbmQgW2xpbmRleCAkYXJndiAwXQorCXNldCBhcmd2IFtscmFuZ2UgJGFyZ3YgMSBlbmRdCit9CisKK2VuYWJsZV9vcHRpb24gbXVsdGljb21taXQKK2VuYWJsZV9vcHRpb24gYnJhbmNoCitlbmFibGVfb3B0aW9uIHRyYW5zcG9ydAorZGlzYWJsZV9vcHRpb24gYmFyZQorCitzd2l0Y2ggLS0gJHN1YmNvbW1hbmQgeworYnJvd3NlciAtCitibGFtZSB7CisJZW5hYmxlX29wdGlvbiBiYXJlCisKKwlkaXNhYmxlX29wdGlvbiBtdWx0aWNvbW1pdAorCWRpc2FibGVfb3B0aW9uIGJyYW5jaAorCWRpc2FibGVfb3B0aW9uIHRyYW5zcG9ydAorfQorY2l0b29sIHsKKwllbmFibGVfb3B0aW9uIHNpbmdsZWNvbW1pdAorCisJZGlzYWJsZV9vcHRpb24gbXVsdGljb21taXQKKwlkaXNhYmxlX29wdGlvbiBicmFuY2gKKwlkaXNhYmxlX29wdGlvbiB0cmFuc3BvcnQKK30KK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMKKyMjIHJlcG9zaXRvcnkgc2V0dXAKKworaWYge1tjYXRjaCB7CisJCXNldCBfZ2l0ZGlyICRlbnYoR0lUX0RJUikKKwkJc2V0IF9wcmVmaXgge30KKwkJfV0KKwkmJiBbY2F0Y2ggeworCQlzZXQgX2dpdGRpciBbZ2l0IHJldi1wYXJzZSAtLWdpdC1kaXJdCisJCXNldCBfcHJlZml4IFtnaXQgcmV2LXBhcnNlIC0tc2hvdy1wcmVmaXhdCisJfSBlcnJdfSB7CisJbG9hZF9jb25maWcgMQorCWFwcGx5X2NvbmZpZworCWNob29zZV9yZXBvc2l0b3J5OjpwaWNrCit9CitpZiB7IVtmaWxlIGlzZGlyZWN0b3J5ICRfZ2l0ZGlyXSAmJiBbaXNfQ3lnd2luXX0geworCWNhdGNoIHtzZXQgX2dpdGRpciBbZXhlYyBjeWdwYXRoIC0td2luZG93cyAkX2dpdGRpcl19Cit9CitpZiB7IVtmaWxlIGlzZGlyZWN0b3J5ICRfZ2l0ZGlyXX0geworCWNhdGNoIHt3bSB3aXRoZHJhdyAufQorCWVycm9yX3BvcHVwIFtzdHJjYXQgW21jICJHaXQgZGlyZWN0b3J5IG5vdCBmb3VuZDoiXSAiXG5cbiRfZ2l0ZGlyIl0KKwlleGl0IDEKK30KK2lmIHskX3ByZWZpeCBuZSB7fX0geworCXJlZ3N1YiAtYWxsIHtbXi9dKy99ICRfcHJlZml4IC4uLyBjZHVwCisJaWYge1tjYXRjaCB7Y2QgJGNkdXB9IGVycl19IHsKKwkJY2F0Y2gge3dtIHdpdGhkcmF3IC59CisJCWVycm9yX3BvcHVwIFtzdHJjYXQgW21jICJDYW5ub3QgbW92ZSB0byB0b3Agb2Ygd29ya2luZyBkaXJlY3Rvcnk6Il0gIlxuXG4kZXJyIl0KKwkJZXhpdCAxCisJfQorCXVuc2V0IGNkdXAKK30gZWxzZWlmIHshW2lzX2VuYWJsZWQgYmFyZV19IHsKKwlpZiB7W2xpbmRleCBbZmlsZSBzcGxpdCAkX2dpdGRpcl0gZW5kXSBuZSB7LmdpdH19IHsKKwkJY2F0Y2gge3dtIHdpdGhkcmF3IC59CisJCWVycm9yX3BvcHVwIFtzdHJjYXQgW21jICJDYW5ub3QgdXNlIGZ1bm55IC5naXQgZGlyZWN0b3J5OiJdICJcblxuJF9naXRkaXIiXQorCQlleGl0IDEKKwl9CisJaWYge1tjYXRjaCB7Y2QgW2ZpbGUgZGlybmFtZSAkX2dpdGRpcl19IGVycl19IHsKKwkJY2F0Y2gge3dtIHdpdGhkcmF3IC59CisJCWVycm9yX3BvcHVwIFtzdHJjYXQgW21jICJObyB3b3JraW5nIGRpcmVjdG9yeSJdICIgW2ZpbGUgZGlybmFtZSAkX2dpdGRpcl06XG5cbiRlcnIiXQorCQlleGl0IDEKKwl9Cit9CitzZXQgX3JlcG9uYW1lIFtmaWxlIHNwbGl0IFtmaWxlIG5vcm1hbGl6ZSAkX2dpdGRpcl1dCitpZiB7W2xpbmRleCAkX3JlcG9uYW1lIGVuZF0gZXEgey5naXR9fSB7CisJc2V0IF9yZXBvbmFtZSBbbGluZGV4ICRfcmVwb25hbWUgZW5kLTFdCit9IGVsc2UgeworCXNldCBfcmVwb25hbWUgW2xpbmRleCAkX3JlcG9uYW1lIGVuZF0KK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMKKyMjIGdsb2JhbCBpbml0CisKK3NldCBjdXJyZW50X2RpZmZfcGF0aCB7fQorc2V0IGN1cnJlbnRfZGlmZl9zaWRlIHt9CitzZXQgZGlmZl9hY3Rpb25zIFtsaXN0XQorCitzZXQgSEVBRCB7fQorc2V0IFBBUkVOVCB7fQorc2V0IE1FUkdFX0hFQUQgW2xpc3RdCitzZXQgY29tbWl0X3R5cGUge30KK3NldCBlbXB0eV90cmVlIHt9CitzZXQgY3VycmVudF9icmFuY2gge30KK3NldCBpc19kZXRhY2hlZCAwCitzZXQgY3VycmVudF9kaWZmX3BhdGgge30KK3NldCBpc18zd2F5X2RpZmYgMAorc2V0IHNlbGVjdGVkX2NvbW1pdF90eXBlIG5ldworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIworIyMgdGFzayBtYW5hZ2VtZW50CisKK3NldCByZXNjYW5fYWN0aXZlIDAKK3NldCBkaWZmX2FjdGl2ZSAwCitzZXQgbGFzdF9jbGlja2VkIHt9CisKK3NldCBkaXNhYmxlX29uX2xvY2sgW2xpc3RdCitzZXQgaW5kZXhfbG9ja190eXBlIG5vbmUKKworcHJvYyBsb2NrX2luZGV4IHt0eXBlfSB7CisJZ2xvYmFsIGluZGV4X2xvY2tfdHlwZSBkaXNhYmxlX29uX2xvY2sKKworCWlmIHskaW5kZXhfbG9ja190eXBlIGVxIHtub25lfX0geworCQlzZXQgaW5kZXhfbG9ja190eXBlICR0eXBlCisJCWZvcmVhY2ggdyAkZGlzYWJsZV9vbl9sb2NrIHsKKwkJCXVwbGV2ZWwgIzAgJHcgZGlzYWJsZWQKKwkJfQorCQlyZXR1cm4gMQorCX0gZWxzZWlmIHskaW5kZXhfbG9ja190eXBlIGVxICJiZWdpbi0kdHlwZSJ9IHsKKwkJc2V0IGluZGV4X2xvY2tfdHlwZSAkdHlwZQorCQlyZXR1cm4gMQorCX0KKwlyZXR1cm4gMAorfQorCitwcm9jIHVubG9ja19pbmRleCB7fSB7CisJZ2xvYmFsIGluZGV4X2xvY2tfdHlwZSBkaXNhYmxlX29uX2xvY2sKKworCXNldCBpbmRleF9sb2NrX3R5cGUgbm9uZQorCWZvcmVhY2ggdyAkZGlzYWJsZV9vbl9sb2NrIHsKKwkJdXBsZXZlbCAjMCAkdyBub3JtYWwKKwl9Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjCisjIyBzdGF0dXMKKworcHJvYyByZXBvc2l0b3J5X3N0YXRlIHtjdHZhciBoZHZhciBtaHZhcn0geworCWdsb2JhbCBjdXJyZW50X2JyYW5jaAorCXVwdmFyICRjdHZhciBjdCAkaGR2YXIgaGQgJG1odmFyIG1oCisKKwlzZXQgbWggW2xpc3RdCisKKwlsb2FkX2N1cnJlbnRfYnJhbmNoCisJaWYge1tjYXRjaCB7c2V0IGhkIFtnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQURdfV19IHsKKwkJc2V0IGhkIHt9CisJCXNldCBjdCBpbml0aWFsCisJCXJldHVybgorCX0KKworCXNldCBtZXJnZV9oZWFkIFtnaXRkaXIgTUVSR0VfSEVBRF0KKwlpZiB7W2ZpbGUgZXhpc3RzICRtZXJnZV9oZWFkXX0geworCQlzZXQgY3QgbWVyZ2UKKwkJc2V0IGZkX21oIFtvcGVuICRtZXJnZV9oZWFkIHJdCisJCXdoaWxlIHtbZ2V0cyAkZmRfbWggbGluZV0gPj0gMH0geworCQkJbGFwcGVuZCBtaCAkbGluZQorCQl9CisJCWNsb3NlICRmZF9taAorCQlyZXR1cm4KKwl9CisKKwlzZXQgY3Qgbm9ybWFsCit9CisKK3Byb2MgUEFSRU5UIHt9IHsKKwlnbG9iYWwgUEFSRU5UIGVtcHR5X3RyZWUKKworCXNldCBwIFtsaW5kZXggJFBBUkVOVCAwXQorCWlmIHskcCBuZSB7fX0geworCQlyZXR1cm4gJHAKKwl9CisJaWYgeyRlbXB0eV90cmVlIGVxIHt9fSB7CisJCXNldCBlbXB0eV90cmVlIFtnaXQgbWt0cmVlIDw8IHt9XQorCX0KKwlyZXR1cm4gJGVtcHR5X3RyZWUKK30KKworcHJvYyByZXNjYW4ge2FmdGVyIHtob25vcl90cnVzdG10aW1lIDF9fSB7CisJZ2xvYmFsIEhFQUQgUEFSRU5UIE1FUkdFX0hFQUQgY29tbWl0X3R5cGUKKwlnbG9iYWwgdWlfaW5kZXggdWlfd29ya2RpciB1aV9jb21tCisJZ2xvYmFsIHJlc2Nhbl9hY3RpdmUgZmlsZV9zdGF0ZXMKKwlnbG9iYWwgcmVwb19jb25maWcKKworCWlmIHskcmVzY2FuX2FjdGl2ZSA+IDAgfHwgIVtsb2NrX2luZGV4IHJlYWRdfSByZXR1cm4KKworCXJlcG9zaXRvcnlfc3RhdGUgbmV3VHlwZSBuZXdIRUFEIG5ld01FUkdFX0hFQUQKKwlpZiB7W3N0cmluZyBtYXRjaCBhbWVuZCogJGNvbW1pdF90eXBlXQorCQkmJiAkbmV3VHlwZSBlcSB7bm9ybWFsfQorCQkmJiAkbmV3SEVBRCBlcSAkSEVBRH0geworCX0gZWxzZSB7CisJCXNldCBIRUFEICRuZXdIRUFECisJCXNldCBQQVJFTlQgJG5ld0hFQUQKKwkJc2V0IE1FUkdFX0hFQUQgJG5ld01FUkdFX0hFQUQKKwkJc2V0IGNvbW1pdF90eXBlICRuZXdUeXBlCisJfQorCisJYXJyYXkgdW5zZXQgZmlsZV9zdGF0ZXMKKworCWlmIHshJDo6R0lUR1VJX0JDS19leGlzdHMgJiYKKwkJKCFbJHVpX2NvbW0gZWRpdCBtb2RpZmllZF0KKwkJfHwgW3N0cmluZyB0cmltIFskdWlfY29tbSBnZXQgMC4wIGVuZF1dIGVxIHt9KX0geworCQlpZiB7W3N0cmluZyBtYXRjaCBhbWVuZCogJGNvbW1pdF90eXBlXX0geworCQl9IGVsc2VpZiB7W2xvYWRfbWVzc2FnZSBHSVRHVUlfTVNHXX0geworCQl9IGVsc2VpZiB7W2xvYWRfbWVzc2FnZSBNRVJHRV9NU0ddfSB7CisJCX0gZWxzZWlmIHtbbG9hZF9tZXNzYWdlIFNRVUFTSF9NU0ddfSB7CisJCX0KKwkJJHVpX2NvbW0gZWRpdCByZXNldAorCQkkdWlfY29tbSBlZGl0IG1vZGlmaWVkIGZhbHNlCisJfQorCisJaWYgeyRob25vcl90cnVzdG10aW1lICYmICRyZXBvX2NvbmZpZyhndWkudHJ1c3RtdGltZSkgZXEge3RydWV9fSB7CisJCXJlc2Nhbl9zdGFnZTIge30gJGFmdGVyCisJfSBlbHNlIHsKKwkJc2V0IHJlc2Nhbl9hY3RpdmUgMQorCQl1aV9zdGF0dXMgW21jICJSZWZyZXNoaW5nIGZpbGUgc3RhdHVzLi4uIl0KKwkJc2V0IGZkX3JmIFtnaXRfcmVhZCB1cGRhdGUtaW5kZXggXAorCQkJLXEgXAorCQkJLS11bm1lcmdlZCBcCisJCQktLWlnbm9yZS1taXNzaW5nIFwKKwkJCS0tcmVmcmVzaCBcCisJCQldCisJCWZjb25maWd1cmUgJGZkX3JmIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkKKwkJZmlsZWV2ZW50ICRmZF9yZiByZWFkYWJsZSBcCisJCQlbbGlzdCByZXNjYW5fc3RhZ2UyICRmZF9yZiAkYWZ0ZXJdCisJfQorfQorCitpZiB7W2lzX0N5Z3dpbl19IHsKKwlzZXQgaXNfZ2l0X2luZm9fbGluayB7fQorCXNldCBpc19naXRfaW5mb19leGNsdWRlIHt9CisJcHJvYyBoYXZlX2luZm9fZXhjbHVkZSB7fSB7CisJCWdsb2JhbCBpc19naXRfaW5mb19saW5rIGlzX2dpdF9pbmZvX2V4Y2x1ZGUKKworCQlpZiB7JGlzX2dpdF9pbmZvX2xpbmsgZXEge319IHsKKwkJCXNldCBpc19naXRfaW5mb19saW5rIFtmaWxlIGlzZmlsZSBbZ2l0ZGlyIGluZm8ubG5rXV0KKwkJfQorCisJCWlmIHskaXNfZ2l0X2luZm9fbGlua30geworCQkJaWYgeyRpc19naXRfaW5mb19leGNsdWRlIGVxIHt9fSB7CisJCQkJaWYge1tjYXRjaCB7ZXhlYyB0ZXN0IC1mIFtnaXRkaXIgaW5mbyBleGNsdWRlXX1dfSB7CisJCQkJCXNldCBpc19naXRfaW5mb19leGNsdWRlIDAKKwkJCQl9IGVsc2UgeworCQkJCQlzZXQgaXNfZ2l0X2luZm9fZXhjbHVkZSAxCisJCQkJfQorCQkJfQorCQkJcmV0dXJuICRpc19naXRfaW5mb19leGNsdWRlCisJCX0gZWxzZSB7CisJCQlyZXR1cm4gW2ZpbGUgcmVhZGFibGUgW2dpdGRpciBpbmZvIGV4Y2x1ZGVdXQorCQl9CisJfQorfSBlbHNlIHsKKwlwcm9jIGhhdmVfaW5mb19leGNsdWRlIHt9IHsKKwkJcmV0dXJuIFtmaWxlIHJlYWRhYmxlIFtnaXRkaXIgaW5mbyBleGNsdWRlXV0KKwl9Cit9CisKK3Byb2MgcmVzY2FuX3N0YWdlMiB7ZmQgYWZ0ZXJ9IHsKKwlnbG9iYWwgcmVzY2FuX2FjdGl2ZSBidWZfcmRpIGJ1Zl9yZGYgYnVmX3JsbworCisJaWYgeyRmZCBuZSB7fX0geworCQlyZWFkICRmZAorCQlpZiB7IVtlb2YgJGZkXX0gcmV0dXJuCisJCWNsb3NlICRmZAorCX0KKworCXNldCBsc19vdGhlcnMgW2xpc3QgLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9LmdpdGlnbm9yZV0KKwlpZiB7W2hhdmVfaW5mb19leGNsdWRlXX0geworCQlsYXBwZW5kIGxzX290aGVycyAiLS1leGNsdWRlLWZyb209W2dpdGRpciBpbmZvIGV4Y2x1ZGVdIgorCX0KKwlzZXQgdXNlcl9leGNsdWRlIFtnZXRfY29uZmlnIGNvcmUuZXhjbHVkZXNmaWxlXQorCWlmIHskdXNlcl9leGNsdWRlIG5lIHt9ICYmIFtmaWxlIHJlYWRhYmxlICR1c2VyX2V4Y2x1ZGVdfSB7CisJCWxhcHBlbmQgbHNfb3RoZXJzICItLWV4Y2x1ZGUtZnJvbT0kdXNlcl9leGNsdWRlIgorCX0KKworCXNldCBidWZfcmRpIHt9CisJc2V0IGJ1Zl9yZGYge30KKwlzZXQgYnVmX3JsbyB7fQorCisJc2V0IHJlc2Nhbl9hY3RpdmUgMworCXVpX3N0YXR1cyBbbWMgIlNjYW5uaW5nIGZvciBtb2RpZmllZCBmaWxlcyAuLi4iXQorCXNldCBmZF9kaSBbZ2l0X3JlYWQgZGlmZi1pbmRleCAtLWNhY2hlZCAteiBbUEFSRU5UXV0KKwlzZXQgZmRfZGYgW2dpdF9yZWFkIGRpZmYtZmlsZXMgLXpdCisJc2V0IGZkX2xvIFtldmFsIGdpdF9yZWFkIGxzLWZpbGVzIC0tb3RoZXJzIC16ICRsc19vdGhlcnNdCisKKwlmY29uZmlndXJlICRmZF9kaSAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gYmluYXJ5IC1lbmNvZGluZyBiaW5hcnkKKwlmY29uZmlndXJlICRmZF9kZiAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gYmluYXJ5IC1lbmNvZGluZyBiaW5hcnkKKwlmY29uZmlndXJlICRmZF9sbyAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gYmluYXJ5IC1lbmNvZGluZyBiaW5hcnkKKwlmaWxlZXZlbnQgJGZkX2RpIHJlYWRhYmxlIFtsaXN0IHJlYWRfZGlmZl9pbmRleCAkZmRfZGkgJGFmdGVyXQorCWZpbGVldmVudCAkZmRfZGYgcmVhZGFibGUgW2xpc3QgcmVhZF9kaWZmX2ZpbGVzICRmZF9kZiAkYWZ0ZXJdCisJZmlsZWV2ZW50ICRmZF9sbyByZWFkYWJsZSBbbGlzdCByZWFkX2xzX290aGVycyAkZmRfbG8gJGFmdGVyXQorfQorCitwcm9jIGxvYWRfbWVzc2FnZSB7ZmlsZX0geworCWdsb2JhbCB1aV9jb21tCisKKwlzZXQgZiBbZ2l0ZGlyICRmaWxlXQorCWlmIHtbZmlsZSBpc2ZpbGUgJGZdfSB7CisJCWlmIHtbY2F0Y2gge3NldCBmZCBbb3BlbiAkZiByXX1dfSB7CisJCQlyZXR1cm4gMAorCQl9CisJCWZjb25maWd1cmUgJGZkIC1lb2ZjaGFyIHt9CisJCXNldCBjb250ZW50IFtzdHJpbmcgdHJpbSBbcmVhZCAkZmRdXQorCQljbG9zZSAkZmQKKwkJcmVnc3ViIC1hbGwgLWxpbmUge1sgXHJcdF0rJH0gJGNvbnRlbnQge30gY29udGVudAorCQkkdWlfY29tbSBkZWxldGUgMC4wIGVuZAorCQkkdWlfY29tbSBpbnNlcnQgZW5kICRjb250ZW50CisJCXJldHVybiAxCisJfQorCXJldHVybiAwCit9CisKK3Byb2MgcmVhZF9kaWZmX2luZGV4IHtmZCBhZnRlcn0geworCWdsb2JhbCBidWZfcmRpCisKKwlhcHBlbmQgYnVmX3JkaSBbcmVhZCAkZmRdCisJc2V0IGMgMAorCXNldCBuIFtzdHJpbmcgbGVuZ3RoICRidWZfcmRpXQorCXdoaWxlIHskYyA8ICRufSB7CisJCXNldCB6MSBbc3RyaW5nIGZpcnN0ICJcMCIgJGJ1Zl9yZGkgJGNdCisJCWlmIHskejEgPT0gLTF9IGJyZWFrCisJCWluY3IgejEKKwkJc2V0IHoyIFtzdHJpbmcgZmlyc3QgIlwwIiAkYnVmX3JkaSAkejFdCisJCWlmIHskejIgPT0gLTF9IGJyZWFrCisKKwkJaW5jciBjCisJCXNldCBpIFtzcGxpdCBbc3RyaW5nIHJhbmdlICRidWZfcmRpICRjIFtleHByIHskejEgLSAyfV1dIHsgfV0KKwkJc2V0IHAgW3N0cmluZyByYW5nZSAkYnVmX3JkaSAkejEgW2V4cHIgeyR6MiAtIDF9XV0KKwkJbWVyZ2Vfc3RhdGUgXAorCQkJW2VuY29kaW5nIGNvbnZlcnRmcm9tICRwXSBcCisJCQlbbGluZGV4ICRpIDRdPyBcCisJCQlbbGlzdCBbbGluZGV4ICRpIDBdIFtsaW5kZXggJGkgMl1dIFwKKwkJCVtsaXN0XQorCQlzZXQgYyAkejIKKwkJaW5jciBjCisJfQorCWlmIHskYyA8ICRufSB7CisJCXNldCBidWZfcmRpIFtzdHJpbmcgcmFuZ2UgJGJ1Zl9yZGkgJGMgZW5kXQorCX0gZWxzZSB7CisJCXNldCBidWZfcmRpIHt9CisJfQorCisJcmVzY2FuX2RvbmUgJGZkIGJ1Zl9yZGkgJGFmdGVyCit9CisKK3Byb2MgcmVhZF9kaWZmX2ZpbGVzIHtmZCBhZnRlcn0geworCWdsb2JhbCBidWZfcmRmCisKKwlhcHBlbmQgYnVmX3JkZiBbcmVhZCAkZmRdCisJc2V0IGMgMAorCXNldCBuIFtzdHJpbmcgbGVuZ3RoICRidWZfcmRmXQorCXdoaWxlIHskYyA8ICRufSB7CisJCXNldCB6MSBbc3RyaW5nIGZpcnN0ICJcMCIgJGJ1Zl9yZGYgJGNdCisJCWlmIHskejEgPT0gLTF9IGJyZWFrCisJCWluY3IgejEKKwkJc2V0IHoyIFtzdHJpbmcgZmlyc3QgIlwwIiAkYnVmX3JkZiAkejFdCisJCWlmIHskejIgPT0gLTF9IGJyZWFrCisKKwkJaW5jciBjCisJCXNldCBpIFtzcGxpdCBbc3RyaW5nIHJhbmdlICRidWZfcmRmICRjIFtleHByIHskejEgLSAyfV1dIHsgfV0KKwkJc2V0IHAgW3N0cmluZyByYW5nZSAkYnVmX3JkZiAkejEgW2V4cHIgeyR6MiAtIDF9XV0KKwkJbWVyZ2Vfc3RhdGUgXAorCQkJW2VuY29kaW5nIGNvbnZlcnRmcm9tICRwXSBcCisJCQk/W2xpbmRleCAkaSA0XSBcCisJCQlbbGlzdF0gXAorCQkJW2xpc3QgW2xpbmRleCAkaSAwXSBbbGluZGV4ICRpIDJdXQorCQlzZXQgYyAkejIKKwkJaW5jciBjCisJfQorCWlmIHskYyA8ICRufSB7CisJCXNldCBidWZfcmRmIFtzdHJpbmcgcmFuZ2UgJGJ1Zl9yZGYgJGMgZW5kXQorCX0gZWxzZSB7CisJCXNldCBidWZfcmRmIHt9CisJfQorCisJcmVzY2FuX2RvbmUgJGZkIGJ1Zl9yZGYgJGFmdGVyCit9CisKK3Byb2MgcmVhZF9sc19vdGhlcnMge2ZkIGFmdGVyfSB7CisJZ2xvYmFsIGJ1Zl9ybG8KKworCWFwcGVuZCBidWZfcmxvIFtyZWFkICRmZF0KKwlzZXQgcGNrIFtzcGxpdCAkYnVmX3JsbyAiXDAiXQorCXNldCBidWZfcmxvIFtsaW5kZXggJHBjayBlbmRdCisJZm9yZWFjaCBwIFtscmFuZ2UgJHBjayAwIGVuZC0xXSB7CisJCXNldCBwIFtlbmNvZGluZyBjb252ZXJ0ZnJvbSAkcF0KKwkJaWYge1tzdHJpbmcgaW5kZXggJHAgZW5kXSBlcSB7L319IHsKKwkJCXNldCBwIFtzdHJpbmcgcmFuZ2UgJHAgMCBlbmQtMV0KKwkJfQorCQltZXJnZV9zdGF0ZSAkcCA/TworCX0KKwlyZXNjYW5fZG9uZSAkZmQgYnVmX3JsbyAkYWZ0ZXIKK30KKworcHJvYyByZXNjYW5fZG9uZSB7ZmQgYnVmIGFmdGVyfSB7CisJZ2xvYmFsIHJlc2Nhbl9hY3RpdmUgY3VycmVudF9kaWZmX3BhdGgKKwlnbG9iYWwgZmlsZV9zdGF0ZXMgcmVwb19jb25maWcKKwl1cHZhciAkYnVmIHRvX2NsZWFyCisKKwlpZiB7IVtlb2YgJGZkXX0gcmV0dXJuCisJc2V0IHRvX2NsZWFyIHt9CisJY2xvc2UgJGZkCisJaWYge1tpbmNyIHJlc2Nhbl9hY3RpdmUgLTFdID4gMH0gcmV0dXJuCisKKwlwcnVuZV9zZWxlY3Rpb24KKwl1bmxvY2tfaW5kZXgKKwlkaXNwbGF5X2FsbF9maWxlcworCWlmIHskY3VycmVudF9kaWZmX3BhdGggbmUge319IHJlc2hvd19kaWZmCisJdXBsZXZlbCAjMCAkYWZ0ZXIKK30KKworcHJvYyBwcnVuZV9zZWxlY3Rpb24ge30geworCWdsb2JhbCBmaWxlX3N0YXRlcyBzZWxlY3RlZF9wYXRocworCisJZm9yZWFjaCBwYXRoIFthcnJheSBuYW1lcyBzZWxlY3RlZF9wYXRoc10geworCQlpZiB7W2NhdGNoIHtzZXQgc3RpbGxfaGVyZSAkZmlsZV9zdGF0ZXMoJHBhdGgpfV19IHsKKwkJCXVuc2V0IHNlbGVjdGVkX3BhdGhzKCRwYXRoKQorCQl9CisJfQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIworIyMgdWkgaGVscGVycworCitwcm9jIG1hcGljb24ge3cgc3RhdGUgcGF0aH0geworCWdsb2JhbCBhbGxfaWNvbnMKKworCWlmIHtbY2F0Y2gge3NldCByICRhbGxfaWNvbnMoJHN0YXRlJHcpfV19IHsKKwkJcHV0cyAiZXJyb3I6IG5vIGljb24gZm9yICR3IHN0YXRlPXskc3RhdGV9ICRwYXRoIgorCQlyZXR1cm4gZmlsZV9wbGFpbgorCX0KKwlyZXR1cm4gJHIKK30KKworcHJvYyBtYXBkZXNjIHtzdGF0ZSBwYXRofSB7CisJZ2xvYmFsIGFsbF9kZXNjcworCisJaWYge1tjYXRjaCB7c2V0IHIgJGFsbF9kZXNjcygkc3RhdGUpfV19IHsKKwkJcHV0cyAiZXJyb3I6IG5vIGRlc2MgZm9yIHN0YXRlPXskc3RhdGV9ICRwYXRoIgorCQlyZXR1cm4gJHN0YXRlCisJfQorCXJldHVybiAkcgorfQorCitwcm9jIHVpX3N0YXR1cyB7bXNnfSB7CisJZ2xvYmFsIG1haW5fc3RhdHVzCisJaWYge1tpbmZvIGV4aXN0cyBtYWluX3N0YXR1c119IHsKKwkJJG1haW5fc3RhdHVzIHNob3cgJG1zZworCX0KK30KKworcHJvYyB1aV9yZWFkeSB7e3Rlc3Qge319fSB7CisJZ2xvYmFsIG1haW5fc3RhdHVzCisJaWYge1tpbmZvIGV4aXN0cyBtYWluX3N0YXR1c119IHsKKwkJJG1haW5fc3RhdHVzIHNob3cgW21jICJSZWFkeS4iXSAkdGVzdAorCX0KK30KKworcHJvYyBlc2NhcGVfcGF0aCB7cGF0aH0geworCXJlZ3N1YiAtYWxsIHtcXH0gJHBhdGggIlxcXFwiIHBhdGgKKwlyZWdzdWIgLWFsbCAiXG4iICRwYXRoICJcXG4iIHBhdGgKKwlyZXR1cm4gJHBhdGgKK30KKworcHJvYyBzaG9ydF9wYXRoIHtwYXRofSB7CisJcmV0dXJuIFtlc2NhcGVfcGF0aCBbbGluZGV4IFtmaWxlIHNwbGl0ICRwYXRoXSBlbmRdXQorfQorCitzZXQgbmV4dF9pY29uX2lkIDAKK3NldCBudWxsX3NoYTEgW3N0cmluZyByZXBlYXQgMCA0MF0KKworcHJvYyBtZXJnZV9zdGF0ZSB7cGF0aCBuZXdfc3RhdGUge2hlYWRfaW5mbyB7fX0ge2luZGV4X2luZm8ge319fSB7CisJZ2xvYmFsIGZpbGVfc3RhdGVzIG5leHRfaWNvbl9pZCBudWxsX3NoYTEKKworCXNldCBzMCBbc3RyaW5nIGluZGV4ICRuZXdfc3RhdGUgMF0KKwlzZXQgczEgW3N0cmluZyBpbmRleCAkbmV3X3N0YXRlIDFdCisKKwlpZiB7W2NhdGNoIHtzZXQgaW5mbyAkZmlsZV9zdGF0ZXMoJHBhdGgpfV19IHsKKwkJc2V0IHN0YXRlIF9fCisJCXNldCBpY29uIG5baW5jciBuZXh0X2ljb25faWRdCisJfSBlbHNlIHsKKwkJc2V0IHN0YXRlIFtsaW5kZXggJGluZm8gMF0KKwkJc2V0IGljb24gW2xpbmRleCAkaW5mbyAxXQorCQlpZiB7JGhlYWRfaW5mbyBlcSB7fX0gIHtzZXQgaGVhZF9pbmZvICBbbGluZGV4ICRpbmZvIDJdfQorCQlpZiB7JGluZGV4X2luZm8gZXEge319IHtzZXQgaW5kZXhfaW5mbyBbbGluZGV4ICRpbmZvIDNdfQorCX0KKworCWlmICAgICB7JHMwIGVxIHs/fX0ge3NldCBzMCBbc3RyaW5nIGluZGV4ICRzdGF0ZSAwXX0gXAorCWVsc2VpZiB7JHMwIGVxIHtffX0ge3NldCBzMCBffQorCisJaWYgICAgIHskczEgZXEgez99fSB7c2V0IHMxIFtzdHJpbmcgaW5kZXggJHN0YXRlIDFdfSBcCisJZWxzZWlmIHskczEgZXEge199fSB7c2V0IHMxIF99CisKKwlpZiB7JHMwIGVxIHtBfSAmJiAkczEgZXEge199ICYmICRoZWFkX2luZm8gZXEge319IHsKKwkJc2V0IGhlYWRfaW5mbyBbbGlzdCAwICRudWxsX3NoYTFdCisJfSBlbHNlaWYgeyRzMCBuZSB7X30gJiYgW3N0cmluZyBpbmRleCAkc3RhdGUgMF0gZXEge199CisJCSYmICRoZWFkX2luZm8gZXEge319IHsKKwkJc2V0IGhlYWRfaW5mbyAkaW5kZXhfaW5mbworCX0KKworCXNldCBmaWxlX3N0YXRlcygkcGF0aCkgW2xpc3QgJHMwJHMxICRpY29uIFwKKwkJJGhlYWRfaW5mbyAkaW5kZXhfaW5mbyBcCisJCV0KKwlyZXR1cm4gJHN0YXRlCit9CisKK3Byb2MgZGlzcGxheV9maWxlX2hlbHBlciB7dyBwYXRoIGljb25fbmFtZSBvbGRfbSBuZXdfbX0geworCWdsb2JhbCBmaWxlX2xpc3RzCisKKwlpZiB7JG5ld19tIGVxIHtffX0geworCQlzZXQgbG5vIFtsc2VhcmNoIC1zb3J0ZWQgLWV4YWN0ICRmaWxlX2xpc3RzKCR3KSAkcGF0aF0KKwkJaWYgeyRsbm8gPj0gMH0geworCQkJc2V0IGZpbGVfbGlzdHMoJHcpIFtscmVwbGFjZSAkZmlsZV9saXN0cygkdykgJGxubyAkbG5vXQorCQkJaW5jciBsbm8KKwkJCSR3IGNvbmYgLXN0YXRlIG5vcm1hbAorCQkJJHcgZGVsZXRlICRsbm8uMCBbZXhwciB7JGxubyArIDF9XS4wCisJCQkkdyBjb25mIC1zdGF0ZSBkaXNhYmxlZAorCQl9CisJfSBlbHNlaWYgeyRvbGRfbSBlcSB7X30gJiYgJG5ld19tIG5lIHtffX0geworCQlsYXBwZW5kIGZpbGVfbGlzdHMoJHcpICRwYXRoCisJCXNldCBmaWxlX2xpc3RzKCR3KSBbbHNvcnQgLXVuaXF1ZSAkZmlsZV9saXN0cygkdyldCisJCXNldCBsbm8gW2xzZWFyY2ggLXNvcnRlZCAtZXhhY3QgJGZpbGVfbGlzdHMoJHcpICRwYXRoXQorCQlpbmNyIGxubworCQkkdyBjb25mIC1zdGF0ZSBub3JtYWwKKwkJJHcgaW1hZ2UgY3JlYXRlICRsbm8uMCBcCisJCQktYWxpZ24gY2VudGVyIC1wYWR4IDUgLXBhZHkgMSBcCisJCQktbmFtZSAkaWNvbl9uYW1lIFwKKwkJCS1pbWFnZSBbbWFwaWNvbiAkdyAkbmV3X20gJHBhdGhdCisJCSR3IGluc2VydCAkbG5vLjEgIltlc2NhcGVfcGF0aCAkcGF0aF1cbiIKKwkJJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKKwl9IGVsc2VpZiB7JG9sZF9tIG5lICRuZXdfbX0geworCQkkdyBjb25mIC1zdGF0ZSBub3JtYWwKKwkJJHcgaW1hZ2UgY29uZiAkaWNvbl9uYW1lIC1pbWFnZSBbbWFwaWNvbiAkdyAkbmV3X20gJHBhdGhdCisJCSR3IGNvbmYgLXN0YXRlIGRpc2FibGVkCisJfQorfQorCitwcm9jIGRpc3BsYXlfZmlsZSB7cGF0aCBzdGF0ZX0geworCWdsb2JhbCBmaWxlX3N0YXRlcyBzZWxlY3RlZF9wYXRocworCWdsb2JhbCB1aV9pbmRleCB1aV93b3JrZGlyCisKKwlzZXQgb2xkX20gW21lcmdlX3N0YXRlICRwYXRoICRzdGF0ZV0KKwlzZXQgcyAkZmlsZV9zdGF0ZXMoJHBhdGgpCisJc2V0IG5ld19tIFtsaW5kZXggJHMgMF0KKwlzZXQgaWNvbl9uYW1lIFtsaW5kZXggJHMgMV0KKworCXNldCBvIFtzdHJpbmcgaW5kZXggJG9sZF9tIDBdCisJc2V0IG4gW3N0cmluZyBpbmRleCAkbmV3X20gMF0KKwlpZiB7JG8gZXEge1V9fSB7CisJCXNldCBvIF8KKwl9CisJaWYgeyRuIGVxIHtVfX0geworCQlzZXQgbiBfCisJfQorCWRpc3BsYXlfZmlsZV9oZWxwZXIJJHVpX2luZGV4ICRwYXRoICRpY29uX25hbWUgJG8gJG4KKworCWlmIHtbc3RyaW5nIGluZGV4ICRvbGRfbSAwXSBlcSB7VX19IHsKKwkJc2V0IG8gVQorCX0gZWxzZSB7CisJCXNldCBvIFtzdHJpbmcgaW5kZXggJG9sZF9tIDFdCisJfQorCWlmIHtbc3RyaW5nIGluZGV4ICRuZXdfbSAwXSBlcSB7VX19IHsKKwkJc2V0IG4gVQorCX0gZWxzZSB7CisJCXNldCBuIFtzdHJpbmcgaW5kZXggJG5ld19tIDFdCisJfQorCWRpc3BsYXlfZmlsZV9oZWxwZXIJJHVpX3dvcmtkaXIgJHBhdGggJGljb25fbmFtZSAkbyAkbgorCisJaWYgeyRuZXdfbSBlcSB7X199fSB7CisJCXVuc2V0IGZpbGVfc3RhdGVzKCRwYXRoKQorCQljYXRjaCB7dW5zZXQgc2VsZWN0ZWRfcGF0aHMoJHBhdGgpfQorCX0KK30KKworcHJvYyBkaXNwbGF5X2FsbF9maWxlc19oZWxwZXIge3cgcGF0aCBpY29uX25hbWUgbX0geworCWdsb2JhbCBmaWxlX2xpc3RzCisKKwlsYXBwZW5kIGZpbGVfbGlzdHMoJHcpICRwYXRoCisJc2V0IGxubyBbZXhwciB7W2xpbmRleCBbc3BsaXQgWyR3IGluZGV4IGVuZF0gLl0gMF0gLSAxfV0KKwkkdyBpbWFnZSBjcmVhdGUgZW5kIFwKKwkJLWFsaWduIGNlbnRlciAtcGFkeCA1IC1wYWR5IDEgXAorCQktbmFtZSAkaWNvbl9uYW1lIFwKKwkJLWltYWdlIFttYXBpY29uICR3ICRtICRwYXRoXQorCSR3IGluc2VydCBlbmQgIltlc2NhcGVfcGF0aCAkcGF0aF1cbiIKK30KKworcHJvYyBkaXNwbGF5X2FsbF9maWxlcyB7fSB7CisJZ2xvYmFsIHVpX2luZGV4IHVpX3dvcmtkaXIKKwlnbG9iYWwgZmlsZV9zdGF0ZXMgZmlsZV9saXN0cworCWdsb2JhbCBsYXN0X2NsaWNrZWQKKworCSR1aV9pbmRleCBjb25mIC1zdGF0ZSBub3JtYWwKKwkkdWlfd29ya2RpciBjb25mIC1zdGF0ZSBub3JtYWwKKworCSR1aV9pbmRleCBkZWxldGUgMC4wIGVuZAorCSR1aV93b3JrZGlyIGRlbGV0ZSAwLjAgZW5kCisJc2V0IGxhc3RfY2xpY2tlZCB7fQorCisJc2V0IGZpbGVfbGlzdHMoJHVpX2luZGV4KSBbbGlzdF0KKwlzZXQgZmlsZV9saXN0cygkdWlfd29ya2RpcikgW2xpc3RdCisKKwlmb3JlYWNoIHBhdGggW2xzb3J0IFthcnJheSBuYW1lcyBmaWxlX3N0YXRlc11dIHsKKwkJc2V0IHMgJGZpbGVfc3RhdGVzKCRwYXRoKQorCQlzZXQgbSBbbGluZGV4ICRzIDBdCisJCXNldCBpY29uX25hbWUgW2xpbmRleCAkcyAxXQorCisJCXNldCBzIFtzdHJpbmcgaW5kZXggJG0gMF0KKwkJaWYgeyRzIG5lIHtVfSAmJiAkcyBuZSB7X319IHsKKwkJCWRpc3BsYXlfYWxsX2ZpbGVzX2hlbHBlciAkdWlfaW5kZXggJHBhdGggXAorCQkJCSRpY29uX25hbWUgJHMKKwkJfQorCisJCWlmIHtbc3RyaW5nIGluZGV4ICRtIDBdIGVxIHtVfX0geworCQkJc2V0IHMgVQorCQl9IGVsc2UgeworCQkJc2V0IHMgW3N0cmluZyBpbmRleCAkbSAxXQorCQl9CisJCWlmIHskcyBuZSB7X319IHsKKwkJCWRpc3BsYXlfYWxsX2ZpbGVzX2hlbHBlciAkdWlfd29ya2RpciAkcGF0aCBcCisJCQkJJGljb25fbmFtZSAkcworCQl9CisJfQorCisJJHVpX2luZGV4IGNvbmYgLXN0YXRlIGRpc2FibGVkCisJJHVpX3dvcmtkaXIgY29uZiAtc3RhdGUgZGlzYWJsZWQKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMKKyMjIGljb25zCisKK3NldCBmaWxlbWFzayB7CisjZGVmaW5lIG1hc2tfd2lkdGggMTQKKyNkZWZpbmUgbWFza19oZWlnaHQgMTUKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1hc2tfYml0c1tdID0geworICAgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwKKyAgIDB4ZmUsIDB4MWYsIDB4ZmUsIDB4MWYsIDB4ZmUsIDB4MWYsIDB4ZmUsIDB4MWYsIDB4ZmUsIDB4MWYsIDB4ZmUsIDB4MWYsCisgICAweGZlLCAweDFmLCAweGZlLCAweDFmLCAweGZlLCAweDFmfTsKK30KKworaW1hZ2UgY3JlYXRlIGJpdG1hcCBmaWxlX3BsYWluIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kIGJsYWNrIC1kYXRhIHsKKyNkZWZpbmUgcGxhaW5fd2lkdGggMTQKKyNkZWZpbmUgcGxhaW5faGVpZ2h0IDE1CitzdGF0aWMgdW5zaWduZWQgY2hhciBwbGFpbl9iaXRzW10gPSB7CisgICAweGZlLCAweDAxLCAweDAyLCAweDAzLCAweDAyLCAweDA1LCAweDAyLCAweDA5LCAweDAyLCAweDFmLCAweDAyLCAweDEwLAorICAgMHgwMiwgMHgxMCwgMHgwMiwgMHgxMCwgMHgwMiwgMHgxMCwgMHgwMiwgMHgxMCwgMHgwMiwgMHgxMCwgMHgwMiwgMHgxMCwKKyAgIDB4MDIsIDB4MTAsIDB4MDIsIDB4MTAsIDB4ZmUsIDB4MWZ9OworfSAtbWFza2RhdGEgJGZpbGVtYXNrCisKK2ltYWdlIGNyZWF0ZSBiaXRtYXAgZmlsZV9tb2QgLWJhY2tncm91bmQgd2hpdGUgLWZvcmVncm91bmQgYmx1ZSAtZGF0YSB7CisjZGVmaW5lIG1vZF93aWR0aCAxNAorI2RlZmluZSBtb2RfaGVpZ2h0IDE1CitzdGF0aWMgdW5zaWduZWQgY2hhciBtb2RfYml0c1tdID0geworICAgMHhmZSwgMHgwMSwgMHgwMiwgMHgwMywgMHg3YSwgMHgwNSwgMHgwMiwgMHgwOSwgMHg3YSwgMHgxZiwgMHgwMiwgMHgxMCwKKyAgIDB4ZmEsIDB4MTcsIDB4MDIsIDB4MTAsIDB4ZmEsIDB4MTcsIDB4MDIsIDB4MTAsIDB4ZmEsIDB4MTcsIDB4MDIsIDB4MTAsCisgICAweGZhLCAweDE3LCAweDAyLCAweDEwLCAweGZlLCAweDFmfTsKK30gLW1hc2tkYXRhICRmaWxlbWFzaworCitpbWFnZSBjcmVhdGUgYml0bWFwIGZpbGVfZnVsbHRpY2sgLWJhY2tncm91bmQgd2hpdGUgLWZvcmVncm91bmQgIiMwMDcwMDAiIC1kYXRhIHsKKyNkZWZpbmUgZmlsZV9mdWxsdGlja193aWR0aCAxNAorI2RlZmluZSBmaWxlX2Z1bGx0aWNrX2hlaWdodCAxNQorc3RhdGljIHVuc2lnbmVkIGNoYXIgZmlsZV9mdWxsdGlja19iaXRzW10gPSB7CisgICAweGZlLCAweDAxLCAweDAyLCAweDFhLCAweDAyLCAweDBjLCAweDAyLCAweDBjLCAweDAyLCAweDE2LCAweDAyLCAweDE2LAorICAgMHgwMiwgMHgxMywgMHgwMCwgMHgxMywgMHg4NiwgMHgxMSwgMHg4YywgMHgxMSwgMHhkOCwgMHgxMCwgMHhmMiwgMHgxMCwKKyAgIDB4NjIsIDB4MTAsIDB4MDIsIDB4MTAsIDB4ZmUsIDB4MWZ9OworfSAtbWFza2RhdGEgJGZpbGVtYXNrCisKK2ltYWdlIGNyZWF0ZSBiaXRtYXAgZmlsZV9wYXJ0dGljayAtYmFja2dyb3VuZCB3aGl0ZSAtZm9yZWdyb3VuZCAiIzAwNTA1MCIgLWRhdGEgeworI2RlZmluZSBwYXJ0dGlja193aWR0aCAxNAorI2RlZmluZSBwYXJ0dGlja19oZWlnaHQgMTUKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhcnR0aWNrX2JpdHNbXSA9IHsKKyAgIDB4ZmUsIDB4MDEsIDB4MDIsIDB4MDMsIDB4N2EsIDB4MDUsIDB4MDIsIDB4MDksIDB4N2EsIDB4MWYsIDB4MDIsIDB4MTAsCisgICAweDdhLCAweDE0LCAweDAyLCAweDE2LCAweDAyLCAweDEzLCAweDhhLCAweDExLCAweGRhLCAweDEwLCAweDcyLCAweDEwLAorICAgMHgyMiwgMHgxMCwgMHgwMiwgMHgxMCwgMHhmZSwgMHgxZn07Cit9IC1tYXNrZGF0YSAkZmlsZW1hc2sKKworaW1hZ2UgY3JlYXRlIGJpdG1hcCBmaWxlX3F1ZXN0aW9uIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kIGJsYWNrIC1kYXRhIHsKKyNkZWZpbmUgZmlsZV9xdWVzdGlvbl93aWR0aCAxNAorI2RlZmluZSBmaWxlX3F1ZXN0aW9uX2hlaWdodCAxNQorc3RhdGljIHVuc2lnbmVkIGNoYXIgZmlsZV9xdWVzdGlvbl9iaXRzW10gPSB7CisgICAweGZlLCAweDAxLCAweDAyLCAweDAyLCAweGUyLCAweDA0LCAweGYyLCAweDA5LCAweDFhLCAweDFiLCAweDBhLCAweDEzLAorICAgMHg4MiwgMHgxMSwgMHhjMiwgMHgxMCwgMHg2MiwgMHgxMCwgMHg2MiwgMHgxMCwgMHgwMiwgMHgxMCwgMHg2MiwgMHgxMCwKKyAgIDB4NjIsIDB4MTAsIDB4MDIsIDB4MTAsIDB4ZmUsIDB4MWZ9OworfSAtbWFza2RhdGEgJGZpbGVtYXNrCisKK2ltYWdlIGNyZWF0ZSBiaXRtYXAgZmlsZV9yZW1vdmVkIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kIHJlZCAtZGF0YSB7CisjZGVmaW5lIGZpbGVfcmVtb3ZlZF93aWR0aCAxNAorI2RlZmluZSBmaWxlX3JlbW92ZWRfaGVpZ2h0IDE1CitzdGF0aWMgdW5zaWduZWQgY2hhciBmaWxlX3JlbW92ZWRfYml0c1tdID0geworICAgMHhmZSwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMiwgMHgwNSwgMHgwMiwgMHgwOSwgMHgwMiwgMHgxZiwgMHgwMiwgMHgxMCwKKyAgIDB4MWEsIDB4MTYsIDB4MzIsIDB4MTMsIDB4ZTIsIDB4MTEsIDB4YzIsIDB4MTAsIDB4ZTIsIDB4MTEsIDB4MzIsIDB4MTMsCisgICAweDFhLCAweDE2LCAweDAyLCAweDEwLCAweGZlLCAweDFmfTsKK30gLW1hc2tkYXRhICRmaWxlbWFzaworCitpbWFnZSBjcmVhdGUgYml0bWFwIGZpbGVfbWVyZ2UgLWJhY2tncm91bmQgd2hpdGUgLWZvcmVncm91bmQgYmx1ZSAtZGF0YSB7CisjZGVmaW5lIGZpbGVfbWVyZ2Vfd2lkdGggMTQKKyNkZWZpbmUgZmlsZV9tZXJnZV9oZWlnaHQgMTUKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGZpbGVfbWVyZ2VfYml0c1tdID0geworICAgMHhmZSwgMHgwMSwgMHgwMiwgMHgwMywgMHg2MiwgMHgwNSwgMHg2MiwgMHgwOSwgMHg2MiwgMHgxZiwgMHg2MiwgMHgxMCwKKyAgIDB4ZmEsIDB4MTEsIDB4ZjIsIDB4MTAsIDB4NjIsIDB4MTAsIDB4MDIsIDB4MTAsIDB4ZmEsIDB4MTcsIDB4MDIsIDB4MTAsCisgICAweGZhLCAweDE3LCAweDAyLCAweDEwLCAweGZlLCAweDFmfTsKK30gLW1hc2tkYXRhICRmaWxlbWFzaworCitzZXQgdWlfaW5kZXggLnZwYW5lLmZpbGVzLmluZGV4Lmxpc3QKK3NldCB1aV93b3JrZGlyIC52cGFuZS5maWxlcy53b3JrZGlyLmxpc3QKKworc2V0IGFsbF9pY29ucyhfJHVpX2luZGV4KSAgIGZpbGVfcGxhaW4KK3NldCBhbGxfaWNvbnMoQSR1aV9pbmRleCkgICBmaWxlX2Z1bGx0aWNrCitzZXQgYWxsX2ljb25zKE0kdWlfaW5kZXgpICAgZmlsZV9mdWxsdGljaworc2V0IGFsbF9pY29ucyhEJHVpX2luZGV4KSAgIGZpbGVfcmVtb3ZlZAorc2V0IGFsbF9pY29ucyhVJHVpX2luZGV4KSAgIGZpbGVfbWVyZ2UKKworc2V0IGFsbF9pY29ucyhfJHVpX3dvcmtkaXIpIGZpbGVfcGxhaW4KK3NldCBhbGxfaWNvbnMoTSR1aV93b3JrZGlyKSBmaWxlX21vZAorc2V0IGFsbF9pY29ucyhEJHVpX3dvcmtkaXIpIGZpbGVfcXVlc3Rpb24KK3NldCBhbGxfaWNvbnMoVSR1aV93b3JrZGlyKSBmaWxlX21lcmdlCitzZXQgYWxsX2ljb25zKE8kdWlfd29ya2RpcikgZmlsZV9wbGFpbgorCitzZXQgbWF4X3N0YXR1c19kZXNjIDAKK2ZvcmVhY2ggaSB7CisJCXtfXyB7bWMgIlVubW9kaWZpZWQifX0KKworCQl7X00ge21jICJNb2RpZmllZCwgbm90IHN0YWdlZCJ9fQorCQl7TV8ge21jICJTdGFnZWQgZm9yIGNvbW1pdCJ9fQorCQl7TU0ge21jICJQb3J0aW9ucyBzdGFnZWQgZm9yIGNvbW1pdCJ9fQorCQl7TUQge21jICJTdGFnZWQgZm9yIGNvbW1pdCwgbWlzc2luZyJ9fQorCisJCXtfTyB7bWMgIlVudHJhY2tlZCwgbm90IHN0YWdlZCJ9fQorCQl7QV8ge21jICJTdGFnZWQgZm9yIGNvbW1pdCJ9fQorCQl7QU0ge21jICJQb3J0aW9ucyBzdGFnZWQgZm9yIGNvbW1pdCJ9fQorCQl7QUQge21jICJTdGFnZWQgZm9yIGNvbW1pdCwgbWlzc2luZyJ9fQorCisJCXtfRCB7bWMgIk1pc3NpbmcifX0KKwkJe0RfIHttYyAiU3RhZ2VkIGZvciByZW1vdmFsIn19CisJCXtETyB7bWMgIlN0YWdlZCBmb3IgcmVtb3ZhbCwgc3RpbGwgcHJlc2VudCJ9fQorCisJCXtVXyB7bWMgIlJlcXVpcmVzIG1lcmdlIHJlc29sdXRpb24ifX0KKwkJe1VVIHttYyAiUmVxdWlyZXMgbWVyZ2UgcmVzb2x1dGlvbiJ9fQorCQl7VU0ge21jICJSZXF1aXJlcyBtZXJnZSByZXNvbHV0aW9uIn19CisJCXtVRCB7bWMgIlJlcXVpcmVzIG1lcmdlIHJlc29sdXRpb24ifX0KKwl9IHsKKwlzZXQgdGV4dCBbZXZhbCBbbGluZGV4ICRpIDFdXQorCWlmIHskbWF4X3N0YXR1c19kZXNjIDwgW3N0cmluZyBsZW5ndGggJHRleHRdfSB7CisJCXNldCBtYXhfc3RhdHVzX2Rlc2MgW3N0cmluZyBsZW5ndGggJHRleHRdCisJfQorCXNldCBhbGxfZGVzY3MoW2xpbmRleCAkaSAwXSkgJHRleHQKK30KK3Vuc2V0IGkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMKKyMjIHV0aWwKKworcHJvYyBzY3JvbGxiYXIybWFueSB7bGlzdCBtb2RlIGFyZ3N9IHsKKwlmb3JlYWNoIHcgJGxpc3Qge2V2YWwgJHcgJG1vZGUgJGFyZ3N9Cit9CisKK3Byb2MgbWFueTJzY3JvbGxiYXIge2xpc3QgbW9kZSBzYiB0b3AgYm90dG9tfSB7CisJJHNiIHNldCAkdG9wICRib3R0b20KKwlmb3JlYWNoIHcgJGxpc3QgeyR3ICRtb2RlIG1vdmV0byAkdG9wfQorfQorCitwcm9jIGluY3JfZm9udF9zaXplIHtmb250IHthbXQgMX19IHsKKwlzZXQgc3ogW2ZvbnQgY29uZmlndXJlICRmb250IC1zaXplXQorCWluY3Igc3ogJGFtdAorCWZvbnQgY29uZmlndXJlICRmb250IC1zaXplICRzegorCWZvbnQgY29uZmlndXJlICR7Zm9udH1ib2xkIC1zaXplICRzegorCWZvbnQgY29uZmlndXJlICR7Zm9udH1pdGFsaWMgLXNpemUgJHN6Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjCisjIyB1aSBjb21tYW5kcworCitzZXQgc3RhcnRpbmdfZ2l0a19tc2cgW21jICJTdGFydGluZyBnaXRrLi4uIHBsZWFzZSB3YWl0Li4uIl0KKworcHJvYyBkb19naXRrIHtyZXZzfSB7CisJIyAtLSBBbHdheXMgc3RhcnQgZ2l0ayB0aHJvdWdoIHdoYXRldmVyIHdlIHdlcmUgbG9hZGVkIHdpdGguICBUaGlzCisJIyAgICBsZXRzIHVzIGJ5cGFzcyB1c2luZyBzaGVsbCBwcm9jZXNzIG9uIFdpbmRvd3Mgc3lzdGVtcy4KKwkjCisJc2V0IGV4ZSBbZmlsZSBqb2luIFtmaWxlIGRpcm5hbWUgJDo6X2dpdF0gZ2l0a10KKwlzZXQgY21kIFtsaXN0IFtpbmZvIG5hbWVvZmV4ZWN1dGFibGVdICRleGVdCisJaWYgeyEgW2ZpbGUgZXhpc3RzICRleGVdfSB7CisJCWVycm9yX3BvcHVwIFttYyAiVW5hYmxlIHRvIHN0YXJ0IGdpdGs6XG5cbiVzIGRvZXMgbm90IGV4aXN0IiAkZXhlXQorCX0gZWxzZSB7CisJCWdsb2JhbCBlbnYKKworCQlpZiB7W2luZm8gZXhpc3RzIGVudihHSVRfRElSKV19IHsKKwkJCXNldCBvbGRfR0lUX0RJUiAkZW52KEdJVF9ESVIpCisJCX0gZWxzZSB7CisJCQlzZXQgb2xkX0dJVF9ESVIge30KKwkJfQorCisJCXNldCBwd2QgW3B3ZF0KKwkJY2QgW2ZpbGUgZGlybmFtZSBbZ2l0ZGlyXV0KKwkJc2V0IGVudihHSVRfRElSKSBbZmlsZSB0YWlsIFtnaXRkaXJdXQorCisJCWV2YWwgZXhlYyAkY21kICRyZXZzICYKKworCQlpZiB7JG9sZF9HSVRfRElSIGVxIHt9fSB7CisJCQl1bnNldCBlbnYoR0lUX0RJUikKKwkJfSBlbHNlIHsKKwkJCXNldCBlbnYoR0lUX0RJUikgJG9sZF9HSVRfRElSCisJCX0KKwkJY2QgJHB3ZAorCisJCXVpX3N0YXR1cyAkOjpzdGFydGluZ19naXRrX21zZworCQlhZnRlciAxMDAwMCB7CisJCQl1aV9yZWFkeSAkc3RhcnRpbmdfZ2l0a19tc2cKKwkJfQorCX0KK30KKworc2V0IGlzX3F1aXR0aW5nIDAKKworcHJvYyBkb19xdWl0IHt9IHsKKwlnbG9iYWwgdWlfY29tbSBpc19xdWl0dGluZyByZXBvX2NvbmZpZyBjb21taXRfdHlwZQorCWdsb2JhbCBHSVRHVUlfQkNLX2V4aXN0cyBHSVRHVUlfQkNLX2kKKwlnbG9iYWwgdWlfY29tbV9zcGVsbAorCisJaWYgeyRpc19xdWl0dGluZ30gcmV0dXJuCisJc2V0IGlzX3F1aXR0aW5nIDEKKworCWlmIHtbd2luZm8gZXhpc3RzICR1aV9jb21tXX0geworCQkjIC0tIFN0YXNoIG91ciBjdXJyZW50IGNvbW1pdCBidWZmZXIuCisJCSMKKwkJc2V0IHNhdmUgW2dpdGRpciBHSVRHVUlfTVNHXQorCQlpZiB7JEdJVEdVSV9CQ0tfZXhpc3RzICYmICFbJHVpX2NvbW0gZWRpdCBtb2RpZmllZF19IHsKKwkJCWZpbGUgcmVuYW1lIC1mb3JjZSBbZ2l0ZGlyIEdJVEdVSV9CQ0tdICRzYXZlCisJCQlzZXQgR0lUR1VJX0JDS19leGlzdHMgMAorCQl9IGVsc2UgeworCQkJc2V0IG1zZyBbc3RyaW5nIHRyaW0gWyR1aV9jb21tIGdldCAwLjAgZW5kXV0KKwkJCXJlZ3N1YiAtYWxsIC1saW5lIHtbIFxyXHRdKyR9ICRtc2cge30gbXNnCisJCQlpZiB7KCFbc3RyaW5nIG1hdGNoIGFtZW5kKiAkY29tbWl0X3R5cGVdCisJCQkJfHwgWyR1aV9jb21tIGVkaXQgbW9kaWZpZWRdKQorCQkJCSYmICRtc2cgbmUge319IHsKKwkJCQljYXRjaCB7CisJCQkJCXNldCBmZCBbb3BlbiAkc2F2ZSB3XQorCQkJCQlwdXRzIC1ub25ld2xpbmUgJGZkICRtc2cKKwkJCQkJY2xvc2UgJGZkCisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQljYXRjaCB7ZmlsZSBkZWxldGUgJHNhdmV9CisJCQl9CisJCX0KKworCQkjIC0tIENhbmNlbCBvdXIgc3BlbGxjaGVja2VyIGlmIGl0cyBydW5uaW5nLgorCQkjCisJCWlmIHtbaW5mbyBleGlzdHMgdWlfY29tbV9zcGVsbF19IHsKKwkJCSR1aV9jb21tX3NwZWxsIHN0b3AKKwkJfQorCisJCSMgLS0gUmVtb3ZlIG91ciBlZGl0b3IgYmFja3VwLCBpdHMgbm90IG5lZWRlZC4KKwkJIworCQlhZnRlciBjYW5jZWwgJEdJVEdVSV9CQ0tfaQorCQlpZiB7JEdJVEdVSV9CQ0tfZXhpc3RzfSB7CisJCQljYXRjaCB7ZmlsZSBkZWxldGUgW2dpdGRpciBHSVRHVUlfQkNLXX0KKwkJfQorCisJCSMgLS0gU3Rhc2ggb3VyIGN1cnJlbnQgd2luZG93IGdlb21ldHJ5IGludG8gdGhpcyByZXBvc2l0b3J5LgorCQkjCisJCXNldCBjZmdfZ2VvbWV0cnkgW2xpc3RdCisJCWxhcHBlbmQgY2ZnX2dlb21ldHJ5IFt3bSBnZW9tZXRyeSAuXQorCQlsYXBwZW5kIGNmZ19nZW9tZXRyeSBbbGluZGV4IFsudnBhbmUgc2FzaCBjb29yZCAwXSAwXQorCQlsYXBwZW5kIGNmZ19nZW9tZXRyeSBbbGluZGV4IFsudnBhbmUuZmlsZXMgc2FzaCBjb29yZCAwXSAxXQorCQlpZiB7W2NhdGNoIHtzZXQgcmNfZ2VvbWV0cnkgJHJlcG9fY29uZmlnKGd1aS5nZW9tZXRyeSl9XX0geworCQkJc2V0IHJjX2dlb21ldHJ5IHt9CisJCX0KKwkJaWYgeyRjZmdfZ2VvbWV0cnkgbmUgJHJjX2dlb21ldHJ5fSB7CisJCQljYXRjaCB7Z2l0IGNvbmZpZyBndWkuZ2VvbWV0cnkgJGNmZ19nZW9tZXRyeX0KKwkJfQorCX0KKworCWRlc3Ryb3kgLgorfQorCitwcm9jIGRvX3Jlc2NhbiB7fSB7CisJcmVzY2FuIHVpX3JlYWR5Cit9CisKK3Byb2MgZG9fY29tbWl0IHt9IHsKKwljb21taXRfdHJlZQorfQorCitwcm9jIHRvZ2dsZV9vcl9kaWZmIHt3IHggeX0geworCWdsb2JhbCBmaWxlX3N0YXRlcyBmaWxlX2xpc3RzIGN1cnJlbnRfZGlmZl9wYXRoIHVpX2luZGV4IHVpX3dvcmtkaXIKKwlnbG9iYWwgbGFzdF9jbGlja2VkIHNlbGVjdGVkX3BhdGhzCisKKwlzZXQgcG9zIFtzcGxpdCBbJHcgaW5kZXggQCR4LCR5XSAuXQorCXNldCBsbm8gW2xpbmRleCAkcG9zIDBdCisJc2V0IGNvbCBbbGluZGV4ICRwb3MgMV0KKwlzZXQgcGF0aCBbbGluZGV4ICRmaWxlX2xpc3RzKCR3KSBbZXhwciB7JGxubyAtIDF9XV0KKwlpZiB7JHBhdGggZXEge319IHsKKwkJc2V0IGxhc3RfY2xpY2tlZCB7fQorCQlyZXR1cm4KKwl9CisKKwlzZXQgbGFzdF9jbGlja2VkIFtsaXN0ICR3ICRsbm9dCisJYXJyYXkgdW5zZXQgc2VsZWN0ZWRfcGF0aHMKKwkkdWlfaW5kZXggdGFnIHJlbW92ZSBpbl9zZWwgMC4wIGVuZAorCSR1aV93b3JrZGlyIHRhZyByZW1vdmUgaW5fc2VsIDAuMCBlbmQKKworCWlmIHskY29sID09IDB9IHsKKwkJaWYgeyRjdXJyZW50X2RpZmZfcGF0aCBlcSAkcGF0aH0geworCQkJc2V0IGFmdGVyIHtyZXNob3dfZGlmZjt9CisJCX0gZWxzZSB7CisJCQlzZXQgYWZ0ZXIge30KKwkJfQorCQlpZiB7JHcgZXEgJHVpX2luZGV4fSB7CisJCQl1cGRhdGVfaW5kZXhpbmZvIFwKKwkJCQkiVW5zdGFnaW5nIFtzaG9ydF9wYXRoICRwYXRoXSBmcm9tIGNvbW1pdCIgXAorCQkJCVtsaXN0ICRwYXRoXSBcCisJCQkJW2NvbmNhdCAkYWZ0ZXIgW2xpc3QgdWlfcmVhZHldXQorCQl9IGVsc2VpZiB7JHcgZXEgJHVpX3dvcmtkaXJ9IHsKKwkJCXVwZGF0ZV9pbmRleCBcCisJCQkJIkFkZGluZyBbc2hvcnRfcGF0aCAkcGF0aF0iIFwKKwkJCQlbbGlzdCAkcGF0aF0gXAorCQkJCVtjb25jYXQgJGFmdGVyIFtsaXN0IHVpX3JlYWR5XV0KKwkJfQorCX0gZWxzZSB7CisJCXNob3dfZGlmZiAkcGF0aCAkdyAkbG5vCisJfQorfQorCitwcm9jIGFkZF9vbmVfdG9fc2VsZWN0aW9uIHt3IHggeX0geworCWdsb2JhbCBmaWxlX2xpc3RzIGxhc3RfY2xpY2tlZCBzZWxlY3RlZF9wYXRocworCisJc2V0IGxubyBbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggQCR4LCR5XSAuXSAwXQorCXNldCBwYXRoIFtsaW5kZXggJGZpbGVfbGlzdHMoJHcpIFtleHByIHskbG5vIC0gMX1dXQorCWlmIHskcGF0aCBlcSB7fX0geworCQlzZXQgbGFzdF9jbGlja2VkIHt9CisJCXJldHVybgorCX0KKworCWlmIHskbGFzdF9jbGlja2VkIG5lIHt9CisJCSYmIFtsaW5kZXggJGxhc3RfY2xpY2tlZCAwXSBuZSAkd30geworCQlhcnJheSB1bnNldCBzZWxlY3RlZF9wYXRocworCQlbbGluZGV4ICRsYXN0X2NsaWNrZWQgMF0gdGFnIHJlbW92ZSBpbl9zZWwgMC4wIGVuZAorCX0KKworCXNldCBsYXN0X2NsaWNrZWQgW2xpc3QgJHcgJGxub10KKwlpZiB7W2NhdGNoIHtzZXQgaW5fc2VsICRzZWxlY3RlZF9wYXRocygkcGF0aCl9XX0geworCQlzZXQgaW5fc2VsIDAKKwl9CisJaWYgeyRpbl9zZWx9IHsKKwkJdW5zZXQgc2VsZWN0ZWRfcGF0aHMoJHBhdGgpCisJCSR3IHRhZyByZW1vdmUgaW5fc2VsICRsbm8uMCBbZXhwciB7JGxubyArIDF9XS4wCisJfSBlbHNlIHsKKwkJc2V0IHNlbGVjdGVkX3BhdGhzKCRwYXRoKSAxCisJCSR3IHRhZyBhZGQgaW5fc2VsICRsbm8uMCBbZXhwciB7JGxubyArIDF9XS4wCisJfQorfQorCitwcm9jIGFkZF9yYW5nZV90b19zZWxlY3Rpb24ge3cgeCB5fSB7CisJZ2xvYmFsIGZpbGVfbGlzdHMgbGFzdF9jbGlja2VkIHNlbGVjdGVkX3BhdGhzCisKKwlpZiB7W2xpbmRleCAkbGFzdF9jbGlja2VkIDBdIG5lICR3fSB7CisJCXRvZ2dsZV9vcl9kaWZmICR3ICR4ICR5CisJCXJldHVybgorCX0KKworCXNldCBsbm8gW2xpbmRleCBbc3BsaXQgWyR3IGluZGV4IEAkeCwkeV0gLl0gMF0KKwlzZXQgbGMgW2xpbmRleCAkbGFzdF9jbGlja2VkIDFdCisJaWYgeyRsYyA8ICRsbm99IHsKKwkJc2V0IGJlZ2luICRsYworCQlzZXQgZW5kICRsbm8KKwl9IGVsc2UgeworCQlzZXQgYmVnaW4gJGxubworCQlzZXQgZW5kICRsYworCX0KKworCWZvcmVhY2ggcGF0aCBbbHJhbmdlICRmaWxlX2xpc3RzKCR3KSBcCisJCVtleHByIHskYmVnaW4gLSAxfV0gXAorCQlbZXhwciB7JGVuZCAtIDF9XV0geworCQlzZXQgc2VsZWN0ZWRfcGF0aHMoJHBhdGgpIDEKKwl9CisJJHcgdGFnIGFkZCBpbl9zZWwgJGJlZ2luLjAgW2V4cHIgeyRlbmQgKyAxfV0uMAorfQorCitwcm9jIHNob3dfbW9yZV9jb250ZXh0IHt9IHsKKwlnbG9iYWwgcmVwb19jb25maWcKKwlpZiB7JHJlcG9fY29uZmlnKGd1aS5kaWZmY29udGV4dCkgPCA5OX0geworCQlpbmNyIHJlcG9fY29uZmlnKGd1aS5kaWZmY29udGV4dCkKKwkJcmVzaG93X2RpZmYKKwl9Cit9CisKK3Byb2Mgc2hvd19sZXNzX2NvbnRleHQge30geworCWdsb2JhbCByZXBvX2NvbmZpZworCWlmIHskcmVwb19jb25maWcoZ3VpLmRpZmZjb250ZXh0KSA+PSAxfSB7CisJCWluY3IgcmVwb19jb25maWcoZ3VpLmRpZmZjb250ZXh0KSAtMQorCQlyZXNob3dfZGlmZgorCX0KK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMKKyMjIHVpIGNvbnN0cnVjdGlvbgorCitsb2FkX2NvbmZpZyAwCithcHBseV9jb25maWcKK3NldCB1aV9jb21tIHt9CisKKyMgLS0gTWVudSBCYXIKKyMKK21lbnUgLm1iYXIgLXRlYXJvZmYgMAorLm1iYXIgYWRkIGNhc2NhZGUgLWxhYmVsIFttYyBSZXBvc2l0b3J5XSAtbWVudSAubWJhci5yZXBvc2l0b3J5CisubWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgW21jIEVkaXRdIC1tZW51IC5tYmFyLmVkaXQKK2lmIHtbaXNfZW5hYmxlZCBicmFuY2hdfSB7CisJLm1iYXIgYWRkIGNhc2NhZGUgLWxhYmVsIFttYyBCcmFuY2hdIC1tZW51IC5tYmFyLmJyYW5jaAorfQoraWYge1tpc19lbmFibGVkIG11bHRpY29tbWl0XSB8fCBbaXNfZW5hYmxlZCBzaW5nbGVjb21taXRdfSB7CisJLm1iYXIgYWRkIGNhc2NhZGUgLWxhYmVsIFttYyBDb21taXRAQG5vdW5dIC1tZW51IC5tYmFyLmNvbW1pdAorfQoraWYge1tpc19lbmFibGVkIHRyYW5zcG9ydF19IHsKKwkubWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgW21jIE1lcmdlXSAtbWVudSAubWJhci5tZXJnZQorCS5tYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBbbWMgUmVtb3RlXSAtbWVudSAubWJhci5yZW1vdGUKK30KKy4gY29uZmlndXJlIC1tZW51IC5tYmFyCisKKyMgLS0gUmVwb3NpdG9yeSBNZW51CisjCittZW51IC5tYmFyLnJlcG9zaXRvcnkKKworLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCBcCisJLWxhYmVsIFttYyAiQnJvd3NlIEN1cnJlbnQgQnJhbmNoJ3MgRmlsZXMiXSBcCisJLWNvbW1hbmQge2Jyb3dzZXI6Om5ldyAkY3VycmVudF9icmFuY2h9CitzZXQgdWlfYnJvd3NlX2N1cnJlbnQgWy5tYmFyLnJlcG9zaXRvcnkgaW5kZXggbGFzdF0KKy5tYmFyLnJlcG9zaXRvcnkgYWRkIGNvbW1hbmQgXAorCS1sYWJlbCBbbWMgIkJyb3dzZSBCcmFuY2ggRmlsZXMuLi4iXSBcCisJLWNvbW1hbmQgYnJvd3Nlcl9vcGVuOjpkaWFsb2cKKy5tYmFyLnJlcG9zaXRvcnkgYWRkIHNlcGFyYXRvcgorCisubWJhci5yZXBvc2l0b3J5IGFkZCBjb21tYW5kIFwKKwktbGFiZWwgW21jICJWaXN1YWxpemUgQ3VycmVudCBCcmFuY2gncyBIaXN0b3J5Il0gXAorCS1jb21tYW5kIHtkb19naXRrICRjdXJyZW50X2JyYW5jaH0KK3NldCB1aV92aXN1YWxpemVfY3VycmVudCBbLm1iYXIucmVwb3NpdG9yeSBpbmRleCBsYXN0XQorLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCBcCisJLWxhYmVsIFttYyAiVmlzdWFsaXplIEFsbCBCcmFuY2ggSGlzdG9yeSJdIFwKKwktY29tbWFuZCB7ZG9fZ2l0ayAtLWFsbH0KKy5tYmFyLnJlcG9zaXRvcnkgYWRkIHNlcGFyYXRvcgorCitwcm9jIGN1cnJlbnRfYnJhbmNoX3dyaXRlIHthcmdzfSB7CisJZ2xvYmFsIGN1cnJlbnRfYnJhbmNoCisJLm1iYXIucmVwb3NpdG9yeSBlbnRyeWNvbmYgJDo6dWlfYnJvd3NlX2N1cnJlbnQgXAorCQktbGFiZWwgW21jICJCcm93c2UgJXMncyBGaWxlcyIgJGN1cnJlbnRfYnJhbmNoXQorCS5tYmFyLnJlcG9zaXRvcnkgZW50cnljb25mICQ6OnVpX3Zpc3VhbGl6ZV9jdXJyZW50IFwKKwkJLWxhYmVsIFttYyAiVmlzdWFsaXplICVzJ3MgSGlzdG9yeSIgJGN1cnJlbnRfYnJhbmNoXQorfQordHJhY2UgYWRkIHZhcmlhYmxlIGN1cnJlbnRfYnJhbmNoIHdyaXRlIGN1cnJlbnRfYnJhbmNoX3dyaXRlCisKK2lmIHtbaXNfZW5hYmxlZCBtdWx0aWNvbW1pdF19IHsKKwkubWJhci5yZXBvc2l0b3J5IGFkZCBjb21tYW5kIC1sYWJlbCBbbWMgIkRhdGFiYXNlIFN0YXRpc3RpY3MiXSBcCisJCS1jb21tYW5kIGRvX3N0YXRzCisKKwkubWJhci5yZXBvc2l0b3J5IGFkZCBjb21tYW5kIC1sYWJlbCBbbWMgIkNvbXByZXNzIERhdGFiYXNlIl0gXAorCQktY29tbWFuZCBkb19nYworCisJLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCAtbGFiZWwgW21jICJWZXJpZnkgRGF0YWJhc2UiXSBcCisJCS1jb21tYW5kIGRvX2ZzY2tfb2JqZWN0cworCisJLm1iYXIucmVwb3NpdG9yeSBhZGQgc2VwYXJhdG9yCisKKwlpZiB7W2lzX0N5Z3dpbl19IHsKKwkJLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCBcCisJCQktbGFiZWwgW21jICJDcmVhdGUgRGVza3RvcCBJY29uIl0gXAorCQkJLWNvbW1hbmQgZG9fY3lnd2luX3Nob3J0Y3V0CisJfSBlbHNlaWYge1tpc19XaW5kb3dzXX0geworCQkubWJhci5yZXBvc2l0b3J5IGFkZCBjb21tYW5kIFwKKwkJCS1sYWJlbCBbbWMgIkNyZWF0ZSBEZXNrdG9wIEljb24iXSBcCisJCQktY29tbWFuZCBkb193aW5kb3dzX3Nob3J0Y3V0CisJfSBlbHNlaWYge1tpc19NYWNPU1hdfSB7CisJCS5tYmFyLnJlcG9zaXRvcnkgYWRkIGNvbW1hbmQgXAorCQkJLWxhYmVsIFttYyAiQ3JlYXRlIERlc2t0b3AgSWNvbiJdIFwKKwkJCS1jb21tYW5kIGRvX21hY29zeF9hcHAKKwl9Cit9CisKKy5tYmFyLnJlcG9zaXRvcnkgYWRkIGNvbW1hbmQgLWxhYmVsIFttYyBRdWl0XSBcCisJLWNvbW1hbmQgZG9fcXVpdCBcCisJLWFjY2VsZXJhdG9yICRNMVQtUQorCisjIC0tIEVkaXQgTWVudQorIworbWVudSAubWJhci5lZGl0CisubWJhci5lZGl0IGFkZCBjb21tYW5kIC1sYWJlbCBbbWMgVW5kb10gXAorCS1jb21tYW5kIHtjYXRjaCB7W2ZvY3VzXSBlZGl0IHVuZG99fSBcCisJLWFjY2VsZXJhdG9yICRNMVQtWgorLm1iYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwgW21jIFJlZG9dIFwKKwktY29tbWFuZCB7Y2F0Y2gge1tmb2N1c10gZWRpdCByZWRvfX0gXAorCS1hY2NlbGVyYXRvciAkTTFULVkKKy5tYmFyLmVkaXQgYWRkIHNlcGFyYXRvcgorLm1iYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwgW21jIEN1dF0gXAorCS1jb21tYW5kIHtjYXRjaCB7dGtfdGV4dEN1dCBbZm9jdXNdfX0gXAorCS1hY2NlbGVyYXRvciAkTTFULVgKKy5tYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsIFttYyBDb3B5XSBcCisJLWNvbW1hbmQge2NhdGNoIHt0a190ZXh0Q29weSBbZm9jdXNdfX0gXAorCS1hY2NlbGVyYXRvciAkTTFULUMKKy5tYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsIFttYyBQYXN0ZV0gXAorCS1jb21tYW5kIHtjYXRjaCB7dGtfdGV4dFBhc3RlIFtmb2N1c107IFtmb2N1c10gc2VlIGluc2VydH19IFwKKwktYWNjZWxlcmF0b3IgJE0xVC1WCisubWJhci5lZGl0IGFkZCBjb21tYW5kIC1sYWJlbCBbbWMgRGVsZXRlXSBcCisJLWNvbW1hbmQge2NhdGNoIHtbZm9jdXNdIGRlbGV0ZSBzZWwuZmlyc3Qgc2VsLmxhc3R9fSBcCisJLWFjY2VsZXJhdG9yIERlbAorLm1iYXIuZWRpdCBhZGQgc2VwYXJhdG9yCisubWJhci5lZGl0IGFkZCBjb21tYW5kIC1sYWJlbCBbbWMgIlNlbGVjdCBBbGwiXSBcCisJLWNvbW1hbmQge2NhdGNoIHtbZm9jdXNdIHRhZyBhZGQgc2VsIDAuMCBlbmR9fSBcCisJLWFjY2VsZXJhdG9yICRNMVQtQQorCisjIC0tIEJyYW5jaCBNZW51CisjCitpZiB7W2lzX2VuYWJsZWQgYnJhbmNoXX0geworCW1lbnUgLm1iYXIuYnJhbmNoCisKKwkubWJhci5icmFuY2ggYWRkIGNvbW1hbmQgLWxhYmVsIFttYyAiQ3JlYXRlLi4uIl0gXAorCQktY29tbWFuZCBicmFuY2hfY3JlYXRlOjpkaWFsb2cgXAorCQktYWNjZWxlcmF0b3IgJE0xVC1OCisJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgW2xpc3QgLm1iYXIuYnJhbmNoIGVudHJ5Y29uZiBcCisJCVsubWJhci5icmFuY2ggaW5kZXggbGFzdF0gLXN0YXRlXQorCisJLm1iYXIuYnJhbmNoIGFkZCBjb21tYW5kIC1sYWJlbCBbbWMgIkNoZWNrb3V0Li4uIl0gXAorCQktY29tbWFuZCBicmFuY2hfY2hlY2tvdXQ6OmRpYWxvZyBcCisJCS1hY2NlbGVyYXRvciAkTTFULU8KKwlsYXBwZW5kIGRpc2FibGVfb25fbG9jayBbbGlzdCAubWJhci5icmFuY2ggZW50cnljb25mIFwKKwkJWy5tYmFyLmJyYW5jaCBpbmRleCBsYXN0XSAtc3RhdGVdCisKKwkubWJhci5icmFuY2ggYWRkIGNvbW1hbmQgLWxhYmVsIFttYyAiUmVuYW1lLi4uIl0gXAorCQktY29tbWFuZCBicmFuY2hfcmVuYW1lOjpkaWFsb2cKKwlsYXBwZW5kIGRpc2FibGVfb25fbG9jayBbbGlzdCAubWJhci5icmFuY2ggZW50cnljb25mIFwKKwkJWy5tYmFyLmJyYW5jaCBpbmRleCBsYXN0XSAtc3RhdGVdCisKKwkubWJhci5icmFuY2ggYWRkIGNvbW1hbmQgLWxhYmVsIFttYyAiRGVsZXRlLi4uIl0gXAorCQktY29tbWFuZCBicmFuY2hfZGVsZXRlOjpkaWFsb2cKKwlsYXBwZW5kIGRpc2FibGVfb25fbG9jayBbbGlzdCAubWJhci5icmFuY2ggZW50cnljb25mIFwKKwkJWy5tYmFyLmJyYW5jaCBpbmRleCBsYXN0XSAtc3RhdGVdCisKKwkubWJhci5icmFuY2ggYWRkIGNvbW1hbmQgLWxhYmVsIFttYyAiUmVzZXQuLi4iXSBcCisJCS1jb21tYW5kIG1lcmdlOjpyZXNldF9oYXJkCisJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgW2xpc3QgLm1iYXIuYnJhbmNoIGVudHJ5Y29uZiBcCisJCVsubWJhci5icmFuY2ggaW5kZXggbGFzdF0gLXN0YXRlXQorfQorCisjIC0tIENvbW1pdCBNZW51CisjCitpZiB7W2lzX2VuYWJsZWQgbXVsdGljb21taXRdIHx8IFtpc19lbmFibGVkIHNpbmdsZWNvbW1pdF19IHsKKwltZW51IC5tYmFyLmNvbW1pdAorCisJLm1iYXIuY29tbWl0IGFkZCByYWRpb2J1dHRvbiBcCisJCS1sYWJlbCBbbWMgIk5ldyBDb21taXQiXSBcCisJCS1jb21tYW5kIGRvX3NlbGVjdF9jb21taXRfdHlwZSBcCisJCS12YXJpYWJsZSBzZWxlY3RlZF9jb21taXRfdHlwZSBcCisJCS12YWx1ZSBuZXcKKwlsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCisJCVtsaXN0IC5tYmFyLmNvbW1pdCBlbnRyeWNvbmYgWy5tYmFyLmNvbW1pdCBpbmRleCBsYXN0XSAtc3RhdGVdCisKKwkubWJhci5jb21taXQgYWRkIHJhZGlvYnV0dG9uIFwKKwkJLWxhYmVsIFttYyAiQW1lbmQgTGFzdCBDb21taXQiXSBcCisJCS1jb21tYW5kIGRvX3NlbGVjdF9jb21taXRfdHlwZSBcCisJCS12YXJpYWJsZSBzZWxlY3RlZF9jb21taXRfdHlwZSBcCisJCS12YWx1ZSBhbWVuZAorCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKKwkJW2xpc3QgLm1iYXIuY29tbWl0IGVudHJ5Y29uZiBbLm1iYXIuY29tbWl0IGluZGV4IGxhc3RdIC1zdGF0ZV0KKworCS5tYmFyLmNvbW1pdCBhZGQgc2VwYXJhdG9yCisKKwkubWJhci5jb21taXQgYWRkIGNvbW1hbmQgLWxhYmVsIFttYyBSZXNjYW5dIFwKKwkJLWNvbW1hbmQgZG9fcmVzY2FuIFwKKwkJLWFjY2VsZXJhdG9yIEY1CisJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAorCQlbbGlzdCAubWJhci5jb21taXQgZW50cnljb25mIFsubWJhci5jb21taXQgaW5kZXggbGFzdF0gLXN0YXRlXQorCisJLm1iYXIuY29tbWl0IGFkZCBjb21tYW5kIC1sYWJlbCBbbWMgIlN0YWdlIFRvIENvbW1pdCJdIFwKKwkJLWNvbW1hbmQgZG9fYWRkX3NlbGVjdGlvbiBcCisJCS1hY2NlbGVyYXRvciAkTTFULVQKKwlsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCisJCVtsaXN0IC5tYmFyLmNvbW1pdCBlbnRyeWNvbmYgWy5tYmFyLmNvbW1pdCBpbmRleCBsYXN0XSAtc3RhdGVdCisKKwkubWJhci5jb21taXQgYWRkIGNvbW1hbmQgLWxhYmVsIFttYyAiU3RhZ2UgQ2hhbmdlZCBGaWxlcyBUbyBDb21taXQiXSBcCisJCS1jb21tYW5kIGRvX2FkZF9hbGwgXAorCQktYWNjZWxlcmF0b3IgJE0xVC1JCisJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAorCQlbbGlzdCAubWJhci5jb21taXQgZW50cnljb25mIFsubWJhci5jb21taXQgaW5kZXggbGFzdF0gLXN0YXRlXQorCisJLm1iYXIuY29tbWl0IGFkZCBjb21tYW5kIC1sYWJlbCBbbWMgIlVuc3RhZ2UgRnJvbSBDb21taXQiXSBcCisJCS1jb21tYW5kIGRvX3Vuc3RhZ2Vfc2VsZWN0aW9uCisJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAorCQlbbGlzdCAubWJhci5jb21taXQgZW50cnljb25mIFsubWJhci5jb21taXQgaW5kZXggbGFzdF0gLXN0YXRlXQorCisJLm1iYXIuY29tbWl0IGFkZCBjb21tYW5kIC1sYWJlbCBbbWMgIlJldmVydCBDaGFuZ2VzIl0gXAorCQktY29tbWFuZCBkb19yZXZlcnRfc2VsZWN0aW9uCisJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAorCQlbbGlzdCAubWJhci5jb21taXQgZW50cnljb25mIFsubWJhci5jb21taXQgaW5kZXggbGFzdF0gLXN0YXRlXQorCisJLm1iYXIuY29tbWl0IGFkZCBzZXBhcmF0b3IKKworCS5tYmFyLmNvbW1pdCBhZGQgY29tbWFuZCAtbGFiZWwgW21jICJTaG93IExlc3MgQ29udGV4dCJdIFwKKwkJLWNvbW1hbmQgc2hvd19sZXNzX2NvbnRleHQgXAorCQktYWNjZWxlcmF0b3IgJE0xVC1cLQorCisJLm1iYXIuY29tbWl0IGFkZCBjb21tYW5kIC1sYWJlbCBbbWMgIlNob3cgTW9yZSBDb250ZXh0Il0gXAorCQktY29tbWFuZCBzaG93X21vcmVfY29udGV4dCBcCisJCS1hY2NlbGVyYXRvciAkTTFULT0KKworCS5tYmFyLmNvbW1pdCBhZGQgc2VwYXJhdG9yCisKKwkubWJhci5jb21taXQgYWRkIGNvbW1hbmQgLWxhYmVsIFttYyAiU2lnbiBPZmYiXSBcCisJCS1jb21tYW5kIGRvX3NpZ25vZmYgXAorCQktYWNjZWxlcmF0b3IgJE0xVC1TCisKKwkubWJhci5jb21taXQgYWRkIGNvbW1hbmQgLWxhYmVsIFttYyBDb21taXRAQHZlcmJdIFwKKwkJLWNvbW1hbmQgZG9fY29tbWl0IFwKKwkJLWFjY2VsZXJhdG9yICRNMVQtUmV0dXJuCisJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAorCQlbbGlzdCAubWJhci5jb21taXQgZW50cnljb25mIFsubWJhci5jb21taXQgaW5kZXggbGFzdF0gLXN0YXRlXQorfQorCisjIC0tIE1lcmdlIE1lbnUKKyMKK2lmIHtbaXNfZW5hYmxlZCBicmFuY2hdfSB7CisJbWVudSAubWJhci5tZXJnZQorCS5tYmFyLm1lcmdlIGFkZCBjb21tYW5kIC1sYWJlbCBbbWMgIkxvY2FsIE1lcmdlLi4uIl0gXAorCQktY29tbWFuZCBtZXJnZTo6ZGlhbG9nIFwKKwkJLWFjY2VsZXJhdG9yICRNMVQtTQorCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKKwkJW2xpc3QgLm1iYXIubWVyZ2UgZW50cnljb25mIFsubWJhci5tZXJnZSBpbmRleCBsYXN0XSAtc3RhdGVdCisJLm1iYXIubWVyZ2UgYWRkIGNvbW1hbmQgLWxhYmVsIFttYyAiQWJvcnQgTWVyZ2UuLi4iXSBcCisJCS1jb21tYW5kIG1lcmdlOjpyZXNldF9oYXJkCisJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAorCQlbbGlzdCAubWJhci5tZXJnZSBlbnRyeWNvbmYgWy5tYmFyLm1lcmdlIGluZGV4IGxhc3RdIC1zdGF0ZV0KK30KKworIyAtLSBUcmFuc3BvcnQgTWVudQorIworaWYge1tpc19lbmFibGVkIHRyYW5zcG9ydF19IHsKKwltZW51IC5tYmFyLnJlbW90ZQorCisJLm1iYXIucmVtb3RlIGFkZCBjb21tYW5kIFwKKwkJLWxhYmVsIFttYyAiUHVzaC4uLiJdIFwKKwkJLWNvbW1hbmQgZG9fcHVzaF9hbnl3aGVyZSBcCisJCS1hY2NlbGVyYXRvciAkTTFULVAKKwkubWJhci5yZW1vdGUgYWRkIGNvbW1hbmQgXAorCQktbGFiZWwgW21jICJEZWxldGUuLi4iXSBcCisJCS1jb21tYW5kIHJlbW90ZV9icmFuY2hfZGVsZXRlOjpkaWFsb2cKK30KKworaWYge1tpc19NYWNPU1hdfSB7CisJIyAtLSBBcHBsZSBNZW51IChNYWMgT1MgWCBvbmx5KQorCSMKKwkubWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgQXBwbGUgLW1lbnUgLm1iYXIuYXBwbGUKKwltZW51IC5tYmFyLmFwcGxlCisKKwkubWJhci5hcHBsZSBhZGQgY29tbWFuZCAtbGFiZWwgW21jICJBYm91dCAlcyIgW2FwcG5hbWVdXSBcCisJCS1jb21tYW5kIGRvX2Fib3V0CisJLm1iYXIuYXBwbGUgYWRkIHNlcGFyYXRvcgorCS5tYmFyLmFwcGxlIGFkZCBjb21tYW5kIFwKKwkJLWxhYmVsIFttYyAiUHJlZmVyZW5jZXMuLi4iXSBcCisJCS1jb21tYW5kIGRvX29wdGlvbnMgXAorCQktYWNjZWxlcmF0b3IgJE0xVC0sCisJYmluZCAuIDwkTTFCLSw+IGRvX29wdGlvbnMKK30gZWxzZSB7CisJIyAtLSBFZGl0IE1lbnUKKwkjCisJLm1iYXIuZWRpdCBhZGQgc2VwYXJhdG9yCisJLm1iYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwgW21jICJPcHRpb25zLi4uIl0gXAorCQktY29tbWFuZCBkb19vcHRpb25zCit9CisKKyMgLS0gSGVscCBNZW51CisjCisubWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgW21jIEhlbHBdIC1tZW51IC5tYmFyLmhlbHAKK21lbnUgLm1iYXIuaGVscAorCitpZiB7IVtpc19NYWNPU1hdfSB7CisJLm1iYXIuaGVscCBhZGQgY29tbWFuZCAtbGFiZWwgW21jICJBYm91dCAlcyIgW2FwcG5hbWVdXSBcCisJCS1jb21tYW5kIGRvX2Fib3V0Cit9CisKK3NldCBicm93c2VyIHt9CitjYXRjaCB7c2V0IGJyb3dzZXIgJHJlcG9fY29uZmlnKGluc3Rhd2ViLmJyb3dzZXIpfQorc2V0IGRvY19wYXRoIFtmaWxlIGRpcm5hbWUgW2dpdGV4ZWNdXQorc2V0IGRvY19wYXRoIFtmaWxlIGpvaW4gJGRvY19wYXRoIERvY3VtZW50YXRpb24gaW5kZXguaHRtbF0KKworaWYge1tpc19DeWd3aW5dfSB7CisJc2V0IGRvY19wYXRoIFtleGVjIGN5Z3BhdGggLS1taXhlZCAkZG9jX3BhdGhdCit9CisKK2lmIHskYnJvd3NlciBlcSB7fX0geworCWlmIHtbaXNfTWFjT1NYXX0geworCQlzZXQgYnJvd3NlciBvcGVuCisJfSBlbHNlaWYge1tpc19DeWd3aW5dfSB7CisJCXNldCBwcm9ncmFtX2ZpbGVzIFtmaWxlIGRpcm5hbWUgW2V4ZWMgY3lncGF0aCAtLXdpbmRpcl1dCisJCXNldCBwcm9ncmFtX2ZpbGVzIFtmaWxlIGpvaW4gJHByb2dyYW1fZmlsZXMge1Byb2dyYW0gRmlsZXN9XQorCQlzZXQgZmlyZWZveCBbZmlsZSBqb2luICRwcm9ncmFtX2ZpbGVzIHtNb3ppbGxhIEZpcmVmb3h9IGZpcmVmb3guZXhlXQorCQlzZXQgaWUgW2ZpbGUgam9pbiAkcHJvZ3JhbV9maWxlcyB7SW50ZXJuZXQgRXhwbG9yZXJ9IElFWFBMT1JFLkVYRV0KKwkJaWYge1tmaWxlIGV4aXN0cyAkZmlyZWZveF19IHsKKwkJCXNldCBicm93c2VyICRmaXJlZm94CisJCX0gZWxzZWlmIHtbZmlsZSBleGlzdHMgJGllXX0geworCQkJc2V0IGJyb3dzZXIgJGllCisJCX0KKwkJdW5zZXQgcHJvZ3JhbV9maWxlcyBmaXJlZm94IGllCisJfQorfQorCitpZiB7W2ZpbGUgaXNmaWxlICRkb2NfcGF0aF19IHsKKwlzZXQgZG9jX3VybCAiZmlsZTokZG9jX3BhdGgiCit9IGVsc2UgeworCXNldCBkb2NfdXJsIHtodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy99Cit9CisKK2lmIHskYnJvd3NlciBuZSB7fX0geworCS5tYmFyLmhlbHAgYWRkIGNvbW1hbmQgLWxhYmVsIFttYyAiT25saW5lIERvY3VtZW50YXRpb24iXSBcCisJCS1jb21tYW5kIFtsaXN0IGV4ZWMgJGJyb3dzZXIgJGRvY191cmwgJl0KK30KK3Vuc2V0IGJyb3dzZXIgZG9jX3BhdGggZG9jX3VybAorCisjIC0tIFN0YW5kYXJkIGJpbmRpbmdzCisjCit3bSBwcm90b2NvbCAuIFdNX0RFTEVURV9XSU5ET1cgZG9fcXVpdAorYmluZCBhbGwgPCRNMUItS2V5LXE+IGRvX3F1aXQKK2JpbmQgYWxsIDwkTTFCLUtleS1RPiBkb19xdWl0CitiaW5kIGFsbCA8JE0xQi1LZXktdz4ge2Rlc3Ryb3kgW3dpbmZvIHRvcGxldmVsICVXXX0KK2JpbmQgYWxsIDwkTTFCLUtleS1XPiB7ZGVzdHJveSBbd2luZm8gdG9wbGV2ZWwgJVddfQorCitzZXQgc3ViY29tbWFuZF9hcmdzIHt9Citwcm9jIHVzYWdlIHt9IHsKKwlwdXRzIHN0ZGVyciAidXNhZ2U6ICQ6OmFyZ3YwICQ6OnN1YmNvbW1hbmQgJDo6c3ViY29tbWFuZF9hcmdzIgorCWV4aXQgMQorfQorCisjIC0tIE5vdCBhIG5vcm1hbCBjb21taXQgdHlwZSBpbnZvY2F0aW9uPyAgRG8gdGhhdCBpbnN0ZWFkIQorIworc3dpdGNoIC0tICRzdWJjb21tYW5kIHsKK2Jyb3dzZXIgLQorYmxhbWUgeworCXNldCBzdWJjb21tYW5kX2FyZ3Mge3Jldj8gcGF0aH0KKwlpZiB7JGFyZ3YgZXEge319IHVzYWdlCisJc2V0IGhlYWQge30KKwlzZXQgcGF0aCB7fQorCXNldCBpc19wYXRoIDAKKwlmb3JlYWNoIGEgJGFyZ3YgeworCQlpZiB7JGlzX3BhdGggfHwgW2ZpbGUgZXhpc3RzICRfcHJlZml4JGFdfSB7CisJCQlpZiB7JHBhdGggbmUge319IHVzYWdlCisJCQlzZXQgcGF0aCAkX3ByZWZpeCRhCisJCQlicmVhaworCQl9IGVsc2VpZiB7JGEgZXEgey0tfX0geworCQkJaWYgeyRwYXRoIG5lIHt9fSB7CisJCQkJaWYgeyRoZWFkIG5lIHt9fSB1c2FnZQorCQkJCXNldCBoZWFkICRwYXRoCisJCQkJc2V0IHBhdGgge30KKwkJCX0KKwkJCXNldCBpc19wYXRoIDEKKwkJfSBlbHNlaWYgeyRoZWFkIGVxIHt9fSB7CisJCQlpZiB7JGhlYWQgbmUge319IHVzYWdlCisJCQlzZXQgaGVhZCAkYQorCQkJc2V0IGlzX3BhdGggMQorCQl9IGVsc2UgeworCQkJdXNhZ2UKKwkJfQorCX0KKwl1bnNldCBpc19wYXRoCisKKwlpZiB7JGhlYWQgbmUge30gJiYgJHBhdGggZXEge319IHsKKwkJc2V0IHBhdGggJF9wcmVmaXgkaGVhZAorCQlzZXQgaGVhZCB7fQorCX0KKworCWlmIHskaGVhZCBlcSB7fX0geworCQlsb2FkX2N1cnJlbnRfYnJhbmNoCisJfSBlbHNlIHsKKwkJaWYge1tyZWdleHAge15bMC05YS1mXXsxLDM5fSR9ICRoZWFkXX0geworCQkJaWYge1tjYXRjaCB7CisJCQkJCXNldCBoZWFkIFtnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5ICRoZWFkXQorCQkJCX0gZXJyXX0geworCQkJCXB1dHMgc3RkZXJyICRlcnIKKwkJCQlleGl0IDEKKwkJCX0KKwkJfQorCQlzZXQgY3VycmVudF9icmFuY2ggJGhlYWQKKwl9CisKKwlzd2l0Y2ggLS0gJHN1YmNvbW1hbmQgeworCWJyb3dzZXIgeworCQlpZiB7JGhlYWQgZXEge319IHsKKwkJCWlmIHskcGF0aCBuZSB7fSAmJiBbZmlsZSBpc2RpcmVjdG9yeSAkcGF0aF19IHsKKwkJCQlzZXQgaGVhZCAkY3VycmVudF9icmFuY2gKKwkJCX0gZWxzZSB7CisJCQkJc2V0IGhlYWQgJHBhdGgKKwkJCQlzZXQgcGF0aCB7fQorCQkJfQorCQl9CisJCWJyb3dzZXI6Om5ldyAkaGVhZCAkcGF0aAorCX0KKwlibGFtZSAgIHsKKwkJaWYgeyRoZWFkIGVxIHt9ICYmICFbZmlsZSBleGlzdHMgJHBhdGhdfSB7CisJCQlwdXRzIHN0ZGVyciBbbWMgImZhdGFsOiBjYW5ub3Qgc3RhdCBwYXRoICVzOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IiAkcGF0aF0KKwkJCWV4aXQgMQorCQl9CisJCWJsYW1lOjpuZXcgJGhlYWQgJHBhdGgKKwl9CisJfQorCXJldHVybgorfQorY2l0b29sIC0KK2d1aSB7CisJaWYge1tsbGVuZ3RoICRhcmd2XSAhPSAwfSB7CisJCXB1dHMgLW5vbmV3bGluZSBzdGRlcnIgInVzYWdlOiAkYXJndjAiCisJCWlmIHskc3ViY29tbWFuZCBuZSB7Z3VpfQorCQkJJiYgW2ZpbGUgdGFpbCAkYXJndjBdIG5lICJnaXQtJHN1YmNvbW1hbmQifSB7CisJCQlwdXRzIC1ub25ld2xpbmUgc3RkZXJyICIgJHN1YmNvbW1hbmQiCisJCX0KKwkJcHV0cyBzdGRlcnIge30KKwkJZXhpdCAxCisJfQorCSMgZmFsbCB0aHJvdWdoIHRvIHNldHVwIFVJIGZvciBjb21taXRzCit9CitkZWZhdWx0IHsKKwlwdXRzIHN0ZGVyciAidXNhZ2U6ICRhcmd2MCBcW3tibGFtZXxicm93c2VyfGNpdG9vbH1cXSIKKwlleGl0IDEKK30KK30KKworIyAtLSBCcmFuY2ggQ29udHJvbAorIworZnJhbWUgLmJyYW5jaCBcCisJLWJvcmRlcndpZHRoIDEgXAorCS1yZWxpZWYgc3Vua2VuCitsYWJlbCAuYnJhbmNoLmwxIFwKKwktdGV4dCBbbWMgIkN1cnJlbnQgQnJhbmNoOiJdIFwKKwktYW5jaG9yIHcgXAorCS1qdXN0aWZ5IGxlZnQKK2xhYmVsIC5icmFuY2guY2IgXAorCS10ZXh0dmFyaWFibGUgY3VycmVudF9icmFuY2ggXAorCS1hbmNob3IgdyBcCisJLWp1c3RpZnkgbGVmdAorcGFjayAuYnJhbmNoLmwxIC1zaWRlIGxlZnQKK3BhY2sgLmJyYW5jaC5jYiAtc2lkZSBsZWZ0IC1maWxsIHgKK3BhY2sgLmJyYW5jaCAtc2lkZSB0b3AgLWZpbGwgeAorCisjIC0tIE1haW4gV2luZG93IExheW91dAorIworcGFuZWR3aW5kb3cgLnZwYW5lIC1vcmllbnQgaG9yaXpvbnRhbAorcGFuZWR3aW5kb3cgLnZwYW5lLmZpbGVzIC1vcmllbnQgdmVydGljYWwKKy52cGFuZSBhZGQgLnZwYW5lLmZpbGVzIC1zdGlja3kgbnNldyAtaGVpZ2h0IDEwMCAtd2lkdGggMjAwCitwYWNrIC52cGFuZSAtYW5jaG9yIG4gLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCisKKyMgLS0gSW5kZXggRmlsZSBMaXN0CisjCitmcmFtZSAudnBhbmUuZmlsZXMuaW5kZXggLWhlaWdodCAxMDAgLXdpZHRoIDIwMAorbGFiZWwgLnZwYW5lLmZpbGVzLmluZGV4LnRpdGxlIC10ZXh0IFttYyAiU3RhZ2VkIENoYW5nZXMgKFdpbGwgQ29tbWl0KSJdIFwKKwktYmFja2dyb3VuZCBsaWdodGdyZWVuIC1mb3JlZ3JvdW5kIGJsYWNrCit0ZXh0ICR1aV9pbmRleCAtYmFja2dyb3VuZCB3aGl0ZSAtZm9yZWdyb3VuZCBibGFjayBcCisJLWJvcmRlcndpZHRoIDAgXAorCS13aWR0aCAyMCAtaGVpZ2h0IDEwIFwKKwktd3JhcCBub25lIFwKKwktY3Vyc29yICRjdXJzb3JfcHRyIFwKKwkteHNjcm9sbGNvbW1hbmQgey52cGFuZS5maWxlcy5pbmRleC5zeCBzZXR9IFwKKwkteXNjcm9sbGNvbW1hbmQgey52cGFuZS5maWxlcy5pbmRleC5zeSBzZXR9IFwKKwktc3RhdGUgZGlzYWJsZWQKK3Njcm9sbGJhciAudnBhbmUuZmlsZXMuaW5kZXguc3ggLW9yaWVudCBoIC1jb21tYW5kIFtsaXN0ICR1aV9pbmRleCB4dmlld10KK3Njcm9sbGJhciAudnBhbmUuZmlsZXMuaW5kZXguc3kgLW9yaWVudCB2IC1jb21tYW5kIFtsaXN0ICR1aV9pbmRleCB5dmlld10KK3BhY2sgLnZwYW5lLmZpbGVzLmluZGV4LnRpdGxlIC1zaWRlIHRvcCAtZmlsbCB4CitwYWNrIC52cGFuZS5maWxlcy5pbmRleC5zeCAtc2lkZSBib3R0b20gLWZpbGwgeAorcGFjayAudnBhbmUuZmlsZXMuaW5kZXguc3kgLXNpZGUgcmlnaHQgLWZpbGwgeQorcGFjayAkdWlfaW5kZXggLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQorCisjIC0tIFdvcmtpbmcgRGlyZWN0b3J5IEZpbGUgTGlzdAorIworZnJhbWUgLnZwYW5lLmZpbGVzLndvcmtkaXIgLWhlaWdodCAxMDAgLXdpZHRoIDIwMAorbGFiZWwgLnZwYW5lLmZpbGVzLndvcmtkaXIudGl0bGUgLXRleHQgW21jICJVbnN0YWdlZCBDaGFuZ2VzIl0gXAorCS1iYWNrZ3JvdW5kIGxpZ2h0c2FsbW9uIC1mb3JlZ3JvdW5kIGJsYWNrCit0ZXh0ICR1aV93b3JrZGlyIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kIGJsYWNrIFwKKwktYm9yZGVyd2lkdGggMCBcCisJLXdpZHRoIDIwIC1oZWlnaHQgMTAgXAorCS13cmFwIG5vbmUgXAorCS1jdXJzb3IgJGN1cnNvcl9wdHIgXAorCS14c2Nyb2xsY29tbWFuZCB7LnZwYW5lLmZpbGVzLndvcmtkaXIuc3ggc2V0fSBcCisJLXlzY3JvbGxjb21tYW5kIHsudnBhbmUuZmlsZXMud29ya2Rpci5zeSBzZXR9IFwKKwktc3RhdGUgZGlzYWJsZWQKK3Njcm9sbGJhciAudnBhbmUuZmlsZXMud29ya2Rpci5zeCAtb3JpZW50IGggLWNvbW1hbmQgW2xpc3QgJHVpX3dvcmtkaXIgeHZpZXddCitzY3JvbGxiYXIgLnZwYW5lLmZpbGVzLndvcmtkaXIuc3kgLW9yaWVudCB2IC1jb21tYW5kIFtsaXN0ICR1aV93b3JrZGlyIHl2aWV3XQorcGFjayAudnBhbmUuZmlsZXMud29ya2Rpci50aXRsZSAtc2lkZSB0b3AgLWZpbGwgeAorcGFjayAudnBhbmUuZmlsZXMud29ya2Rpci5zeCAtc2lkZSBib3R0b20gLWZpbGwgeAorcGFjayAudnBhbmUuZmlsZXMud29ya2Rpci5zeSAtc2lkZSByaWdodCAtZmlsbCB5CitwYWNrICR1aV93b3JrZGlyIC1zaWRlIGxlZnQgLWZpbGwgYm90aCAtZXhwYW5kIDEKKworLnZwYW5lLmZpbGVzIGFkZCAudnBhbmUuZmlsZXMud29ya2RpciAtc3RpY2t5IG5zZXcKKy52cGFuZS5maWxlcyBhZGQgLnZwYW5lLmZpbGVzLmluZGV4IC1zdGlja3kgbnNldworCitmb3JlYWNoIGkgW2xpc3QgJHVpX2luZGV4ICR1aV93b3JrZGlyXSB7CisJcm1zZWxfdGFnICRpCisJJGkgdGFnIGNvbmYgaW5fZGlmZiAtYmFja2dyb3VuZCBbJGkgdGFnIGNnZXQgaW5fc2VsIC1iYWNrZ3JvdW5kXQorfQordW5zZXQgaQorCisjIC0tIERpZmYgYW5kIENvbW1pdCBBcmVhCisjCitmcmFtZSAudnBhbmUubG93ZXIgLWhlaWdodCAzMDAgLXdpZHRoIDQwMAorZnJhbWUgLnZwYW5lLmxvd2VyLmNvbW1hcmVhCitmcmFtZSAudnBhbmUubG93ZXIuZGlmZiAtcmVsaWVmIHN1bmtlbiAtYm9yZGVyd2lkdGggMQorcGFjayAudnBhbmUubG93ZXIuZGlmZiAtZmlsbCBib3RoIC1leHBhbmQgMQorcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEgLXNpZGUgYm90dG9tIC1maWxsIHgKKy52cGFuZSBhZGQgLnZwYW5lLmxvd2VyIC1zdGlja3kgbnNldworCisjIC0tIENvbW1pdCBBcmVhIEJ1dHRvbnMKKyMKK2ZyYW1lIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zCitsYWJlbCAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5sIC10ZXh0IHt9IFwKKwktYW5jaG9yIHcgXAorCS1qdXN0aWZ5IGxlZnQKK3BhY2sgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMubCAtc2lkZSB0b3AgLWZpbGwgeAorcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucyAtc2lkZSBsZWZ0IC1maWxsIHkKKworYnV0dG9uIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLnJlc2NhbiAtdGV4dCBbbWMgUmVzY2FuXSBcCisJLWNvbW1hbmQgZG9fcmVzY2FuCitwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLnJlc2NhbiAtc2lkZSB0b3AgLWZpbGwgeAorbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAorCXsudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5yZXNjYW4gY29uZiAtc3RhdGV9CisKK2J1dHRvbiAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5pbmNhbGwgLXRleHQgW21jICJTdGFnZSBDaGFuZ2VkIl0gXAorCS1jb21tYW5kIGRvX2FkZF9hbGwKK3BhY2sgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMuaW5jYWxsIC1zaWRlIHRvcCAtZmlsbCB4CitsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCisJey52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLmluY2FsbCBjb25mIC1zdGF0ZX0KKworYnV0dG9uIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLnNpZ25vZmYgLXRleHQgW21jICJTaWduIE9mZiJdIFwKKwktY29tbWFuZCBkb19zaWdub2ZmCitwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLnNpZ25vZmYgLXNpZGUgdG9wIC1maWxsIHgKKworYnV0dG9uIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLmNvbW1pdCAtdGV4dCBbbWMgQ29tbWl0QEB2ZXJiXSBcCisJLWNvbW1hbmQgZG9fY29tbWl0CitwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLmNvbW1pdCAtc2lkZSB0b3AgLWZpbGwgeAorbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAorCXsudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5jb21taXQgY29uZiAtc3RhdGV9CisKK2J1dHRvbiAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5wdXNoIC10ZXh0IFttYyBQdXNoXSBcCisJLWNvbW1hbmQgZG9fcHVzaF9hbnl3aGVyZQorcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5wdXNoIC1zaWRlIHRvcCAtZmlsbCB4CisKKyMgLS0gQ29tbWl0IE1lc3NhZ2UgQnVmZmVyCisjCitmcmFtZSAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyCitmcmFtZSAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLmhlYWRlcgorc2V0IHVpX2NvbW0gLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci50CitzZXQgdWlfY29tbCAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLmhlYWRlci5sCityYWRpb2J1dHRvbiAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLmhlYWRlci5uZXcgXAorCS10ZXh0IFttYyAiTmV3IENvbW1pdCJdIFwKKwktY29tbWFuZCBkb19zZWxlY3RfY29tbWl0X3R5cGUgXAorCS12YXJpYWJsZSBzZWxlY3RlZF9jb21taXRfdHlwZSBcCisJLXZhbHVlIG5ldworbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAorCVtsaXN0IC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuaGVhZGVyLm5ldyBjb25mIC1zdGF0ZV0KK3JhZGlvYnV0dG9uIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuaGVhZGVyLmFtZW5kIFwKKwktdGV4dCBbbWMgIkFtZW5kIExhc3QgQ29tbWl0Il0gXAorCS1jb21tYW5kIGRvX3NlbGVjdF9jb21taXRfdHlwZSBcCisJLXZhcmlhYmxlIHNlbGVjdGVkX2NvbW1pdF90eXBlIFwKKwktdmFsdWUgYW1lbmQKK2xhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKKwlbbGlzdCAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLmhlYWRlci5hbWVuZCBjb25mIC1zdGF0ZV0KK2xhYmVsICR1aV9jb21sIFwKKwktYW5jaG9yIHcgXAorCS1qdXN0aWZ5IGxlZnQKK3Byb2MgdHJhY2VfY29tbWl0X3R5cGUge3Zhcm5hbWUgYXJnc30geworCWdsb2JhbCB1aV9jb21sIGNvbW1pdF90eXBlCisJc3dpdGNoIC1nbG9iIC0tICRjb21taXRfdHlwZSB7CisJaW5pdGlhbCAgICAgICB7c2V0IHR4dCBbbWMgIkluaXRpYWwgQ29tbWl0IE1lc3NhZ2U6Il19CisJYW1lbmQgICAgICAgICB7c2V0IHR4dCBbbWMgIkFtZW5kZWQgQ29tbWl0IE1lc3NhZ2U6Il19CisJYW1lbmQtaW5pdGlhbCB7c2V0IHR4dCBbbWMgIkFtZW5kZWQgSW5pdGlhbCBDb21taXQgTWVzc2FnZToiXX0KKwlhbWVuZC1tZXJnZSAgIHtzZXQgdHh0IFttYyAiQW1lbmRlZCBNZXJnZSBDb21taXQgTWVzc2FnZToiXX0KKwltZXJnZSAgICAgICAgIHtzZXQgdHh0IFttYyAiTWVyZ2UgQ29tbWl0IE1lc3NhZ2U6Il19CisJKiAgICAgICAgICAgICB7c2V0IHR4dCBbbWMgIkNvbW1pdCBNZXNzYWdlOiJdfQorCX0KKwkkdWlfY29tbCBjb25mIC10ZXh0ICR0eHQKK30KK3RyYWNlIGFkZCB2YXJpYWJsZSBjb21taXRfdHlwZSB3cml0ZSB0cmFjZV9jb21taXRfdHlwZQorcGFjayAkdWlfY29tbCAtc2lkZSBsZWZ0IC1maWxsIHgKK3BhY2sgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5oZWFkZXIuYW1lbmQgLXNpZGUgcmlnaHQKK3BhY2sgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5oZWFkZXIubmV3IC1zaWRlIHJpZ2h0CisKK3RleHQgJHVpX2NvbW0gLWJhY2tncm91bmQgd2hpdGUgLWZvcmVncm91bmQgYmxhY2sgXAorCS1ib3JkZXJ3aWR0aCAxIFwKKwktdW5kbyB0cnVlIFwKKwktbWF4dW5kbyAyMCBcCisJLWF1dG9zZXBhcmF0b3JzIHRydWUgXAorCS1yZWxpZWYgc3Vua2VuIFwKKwktd2lkdGggJHJlcG9fY29uZmlnKGd1aS5jb21taXRtc2d3aWR0aCkgLWhlaWdodCA5IC13cmFwIG5vbmUgXAorCS1mb250IGZvbnRfZGlmZiBcCisJLXlzY3JvbGxjb21tYW5kIHsudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLnNieSBzZXR9CitzY3JvbGxiYXIgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5zYnkgXAorCS1jb21tYW5kIFtsaXN0ICR1aV9jb21tIHl2aWV3XQorcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLmhlYWRlciAtc2lkZSB0b3AgLWZpbGwgeAorcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLnNieSAtc2lkZSByaWdodCAtZmlsbCB5CitwYWNrICR1aV9jb21tIC1zaWRlIGxlZnQgLWZpbGwgeQorcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyIC1zaWRlIGxlZnQgLWZpbGwgeQorCisjIC0tIENvbW1pdCBNZXNzYWdlIEJ1ZmZlciBDb250ZXh0IE1lbnUKKyMKK3NldCBjdHhtIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuY3R4bQorbWVudSAkY3R4bSAtdGVhcm9mZiAwCiskY3R4bSBhZGQgY29tbWFuZCBcCisJLWxhYmVsIFttYyBDdXRdIFwKKwktY29tbWFuZCB7dGtfdGV4dEN1dCAkdWlfY29tbX0KKyRjdHhtIGFkZCBjb21tYW5kIFwKKwktbGFiZWwgW21jIENvcHldIFwKKwktY29tbWFuZCB7dGtfdGV4dENvcHkgJHVpX2NvbW19CiskY3R4bSBhZGQgY29tbWFuZCBcCisJLWxhYmVsIFttYyBQYXN0ZV0gXAorCS1jb21tYW5kIHt0a190ZXh0UGFzdGUgJHVpX2NvbW19CiskY3R4bSBhZGQgY29tbWFuZCBcCisJLWxhYmVsIFttYyBEZWxldGVdIFwKKwktY29tbWFuZCB7JHVpX2NvbW0gZGVsZXRlIHNlbC5maXJzdCBzZWwubGFzdH0KKyRjdHhtIGFkZCBzZXBhcmF0b3IKKyRjdHhtIGFkZCBjb21tYW5kIFwKKwktbGFiZWwgW21jICJTZWxlY3QgQWxsIl0gXAorCS1jb21tYW5kIHtmb2N1cyAkdWlfY29tbTskdWlfY29tbSB0YWcgYWRkIHNlbCAwLjAgZW5kfQorJGN0eG0gYWRkIGNvbW1hbmQgXAorCS1sYWJlbCBbbWMgIkNvcHkgQWxsIl0gXAorCS1jb21tYW5kIHsKKwkJJHVpX2NvbW0gdGFnIGFkZCBzZWwgMC4wIGVuZAorCQl0a190ZXh0Q29weSAkdWlfY29tbQorCQkkdWlfY29tbSB0YWcgcmVtb3ZlIHNlbCAwLjAgZW5kCisJfQorJGN0eG0gYWRkIHNlcGFyYXRvcgorJGN0eG0gYWRkIGNvbW1hbmQgXAorCS1sYWJlbCBbbWMgIlNpZ24gT2ZmIl0gXAorCS1jb21tYW5kIGRvX3NpZ25vZmYKK3NldCB1aV9jb21tX2N0eG0gJGN0eG0KKworIyAtLSBEaWZmIEhlYWRlcgorIworcHJvYyB0cmFjZV9jdXJyZW50X2RpZmZfcGF0aCB7dmFybmFtZSBhcmdzfSB7CisJZ2xvYmFsIGN1cnJlbnRfZGlmZl9wYXRoIGRpZmZfYWN0aW9ucyBmaWxlX3N0YXRlcworCWlmIHskY3VycmVudF9kaWZmX3BhdGggZXEge319IHsKKwkJc2V0IHMge30KKwkJc2V0IGYge30KKwkJc2V0IHAge30KKwkJc2V0IG8gZGlzYWJsZWQKKwl9IGVsc2UgeworCQlzZXQgcCAkY3VycmVudF9kaWZmX3BhdGgKKwkJc2V0IHMgW21hcGRlc2MgW2xpbmRleCAkZmlsZV9zdGF0ZXMoJHApIDBdICRwXQorCQlzZXQgZiBbbWMgIkZpbGU6Il0KKwkJc2V0IHAgW2VzY2FwZV9wYXRoICRwXQorCQlzZXQgbyBub3JtYWwKKwl9CisKKwkudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIuc3RhdHVzIGNvbmZpZ3VyZSAtdGV4dCAkcworCS52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5maWxlIGNvbmZpZ3VyZSAtdGV4dCAkZgorCS52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5wYXRoIGNvbmZpZ3VyZSAtdGV4dCAkcAorCWZvcmVhY2ggdyAkZGlmZl9hY3Rpb25zIHsKKwkJdXBsZXZlbCAjMCAkdyAkbworCX0KK30KK3RyYWNlIGFkZCB2YXJpYWJsZSBjdXJyZW50X2RpZmZfcGF0aCB3cml0ZSB0cmFjZV9jdXJyZW50X2RpZmZfcGF0aAorCitmcmFtZSAudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIgLWJhY2tncm91bmQgZ29sZAorbGFiZWwgLnZwYW5lLmxvd2VyLmRpZmYuaGVhZGVyLnN0YXR1cyBcCisJLWJhY2tncm91bmQgZ29sZCBcCisJLWZvcmVncm91bmQgYmxhY2sgXAorCS13aWR0aCAkbWF4X3N0YXR1c19kZXNjIFwKKwktYW5jaG9yIHcgXAorCS1qdXN0aWZ5IGxlZnQKK2xhYmVsIC52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5maWxlIFwKKwktYmFja2dyb3VuZCBnb2xkIFwKKwktZm9yZWdyb3VuZCBibGFjayBcCisJLWFuY2hvciB3IFwKKwktanVzdGlmeSBsZWZ0CitsYWJlbCAudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIucGF0aCBcCisJLWJhY2tncm91bmQgZ29sZCBcCisJLWZvcmVncm91bmQgYmxhY2sgXAorCS1hbmNob3IgdyBcCisJLWp1c3RpZnkgbGVmdAorcGFjayAudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIuc3RhdHVzIC1zaWRlIGxlZnQKK3BhY2sgLnZwYW5lLmxvd2VyLmRpZmYuaGVhZGVyLmZpbGUgLXNpZGUgbGVmdAorcGFjayAudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIucGF0aCAtZmlsbCB4CitzZXQgY3R4bSAudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIuY3R4bQorbWVudSAkY3R4bSAtdGVhcm9mZiAwCiskY3R4bSBhZGQgY29tbWFuZCBcCisJLWxhYmVsIFttYyBDb3B5XSBcCisJLWNvbW1hbmQgeworCQljbGlwYm9hcmQgY2xlYXIKKwkJY2xpcGJvYXJkIGFwcGVuZCBcCisJCQktZm9ybWF0IFNUUklORyBcCisJCQktdHlwZSBTVFJJTkcgXAorCQkJLS0gJGN1cnJlbnRfZGlmZl9wYXRoCisJfQorbGFwcGVuZCBkaWZmX2FjdGlvbnMgW2xpc3QgJGN0eG0gZW50cnljb25mIFskY3R4bSBpbmRleCBsYXN0XSAtc3RhdGVdCitiaW5kX2J1dHRvbjMgLnZwYW5lLmxvd2VyLmRpZmYuaGVhZGVyLnBhdGggInRrX3BvcHVwICRjdHhtICVYICVZIgorCisjIC0tIERpZmYgQm9keQorIworZnJhbWUgLnZwYW5lLmxvd2VyLmRpZmYuYm9keQorc2V0IHVpX2RpZmYgLnZwYW5lLmxvd2VyLmRpZmYuYm9keS50Cit0ZXh0ICR1aV9kaWZmIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kIGJsYWNrIFwKKwktYm9yZGVyd2lkdGggMCBcCisJLXdpZHRoIDgwIC1oZWlnaHQgMTUgLXdyYXAgbm9uZSBcCisJLWZvbnQgZm9udF9kaWZmIFwKKwkteHNjcm9sbGNvbW1hbmQgey52cGFuZS5sb3dlci5kaWZmLmJvZHkuc2J4IHNldH0gXAorCS15c2Nyb2xsY29tbWFuZCB7LnZwYW5lLmxvd2VyLmRpZmYuYm9keS5zYnkgc2V0fSBcCisJLXN0YXRlIGRpc2FibGVkCitzY3JvbGxiYXIgLnZwYW5lLmxvd2VyLmRpZmYuYm9keS5zYnggLW9yaWVudCBob3Jpem9udGFsIFwKKwktY29tbWFuZCBbbGlzdCAkdWlfZGlmZiB4dmlld10KK3Njcm9sbGJhciAudnBhbmUubG93ZXIuZGlmZi5ib2R5LnNieSAtb3JpZW50IHZlcnRpY2FsIFwKKwktY29tbWFuZCBbbGlzdCAkdWlfZGlmZiB5dmlld10KK3BhY2sgLnZwYW5lLmxvd2VyLmRpZmYuYm9keS5zYnggLXNpZGUgYm90dG9tIC1maWxsIHgKK3BhY2sgLnZwYW5lLmxvd2VyLmRpZmYuYm9keS5zYnkgLXNpZGUgcmlnaHQgLWZpbGwgeQorcGFjayAkdWlfZGlmZiAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCitwYWNrIC52cGFuZS5sb3dlci5kaWZmLmhlYWRlciAtc2lkZSB0b3AgLWZpbGwgeAorcGFjayAudnBhbmUubG93ZXIuZGlmZi5ib2R5IC1zaWRlIGJvdHRvbSAtZmlsbCBib3RoIC1leHBhbmQgMQorCiskdWlfZGlmZiB0YWcgY29uZiBkX2NyIC1lbGlkZSB0cnVlCiskdWlfZGlmZiB0YWcgY29uZiBkX0AgLWZvcmVncm91bmQgYmx1ZSAtZm9udCBmb250X2RpZmZib2xkCiskdWlfZGlmZiB0YWcgY29uZiBkXysgLWZvcmVncm91bmQgeyMwMGEwMDB9CiskdWlfZGlmZiB0YWcgY29uZiBkXy0gLWZvcmVncm91bmQgcmVkCisKKyR1aV9kaWZmIHRhZyBjb25mIGRfKysgLWZvcmVncm91bmQgeyMwMGEwMDB9CiskdWlfZGlmZiB0YWcgY29uZiBkXy0tIC1mb3JlZ3JvdW5kIHJlZAorJHVpX2RpZmYgdGFnIGNvbmYgZF8rcyBcCisJLWZvcmVncm91bmQgeyMwMGEwMDB9IFwKKwktYmFja2dyb3VuZCB7I2UyZWZmYX0KKyR1aV9kaWZmIHRhZyBjb25mIGRfLXMgXAorCS1mb3JlZ3JvdW5kIHJlZCBcCisJLWJhY2tncm91bmQgeyNlMmVmZmF9CiskdWlfZGlmZiB0YWcgY29uZiBkX3MrIFwKKwktZm9yZWdyb3VuZCB7IzAwYTAwMH0gXAorCS1iYWNrZ3JvdW5kIGl2b3J5MQorJHVpX2RpZmYgdGFnIGNvbmYgZF9zLSBcCisJLWZvcmVncm91bmQgcmVkIFwKKwktYmFja2dyb3VuZCBpdm9yeTEKKworJHVpX2RpZmYgdGFnIGNvbmYgZDw8PDw8PDwgXAorCS1mb3JlZ3JvdW5kIG9yYW5nZSBcCisJLWZvbnQgZm9udF9kaWZmYm9sZAorJHVpX2RpZmYgdGFnIGNvbmYgZD09PT09PT0gXAorCS1mb3JlZ3JvdW5kIG9yYW5nZSBcCisJLWZvbnQgZm9udF9kaWZmYm9sZAorJHVpX2RpZmYgdGFnIGNvbmYgZD4+Pj4+Pj4gXAorCS1mb3JlZ3JvdW5kIG9yYW5nZSBcCisJLWZvbnQgZm9udF9kaWZmYm9sZAorCiskdWlfZGlmZiB0YWcgcmFpc2Ugc2VsCisKKyMgLS0gRGlmZiBCb2R5IENvbnRleHQgTWVudQorIworc2V0IGN0eG0gLnZwYW5lLmxvd2VyLmRpZmYuYm9keS5jdHhtCittZW51ICRjdHhtIC10ZWFyb2ZmIDAKKyRjdHhtIGFkZCBjb21tYW5kIFwKKwktbGFiZWwgW21jICJBcHBseS9SZXZlcnNlIEh1bmsiXSBcCisJLWNvbW1hbmQge2FwcGx5X2h1bmsgJGN1cnNvclggJGN1cnNvcll9CitzZXQgdWlfZGlmZl9hcHBseWh1bmsgWyRjdHhtIGluZGV4IGxhc3RdCitsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgJHVpX2RpZmZfYXBwbHlodW5rIC1zdGF0ZV0KKyRjdHhtIGFkZCBzZXBhcmF0b3IKKyRjdHhtIGFkZCBjb21tYW5kIFwKKwktbGFiZWwgW21jICJTaG93IExlc3MgQ29udGV4dCJdIFwKKwktY29tbWFuZCBzaG93X2xlc3NfY29udGV4dAorbGFwcGVuZCBkaWZmX2FjdGlvbnMgW2xpc3QgJGN0eG0gZW50cnljb25mIFskY3R4bSBpbmRleCBsYXN0XSAtc3RhdGVdCiskY3R4bSBhZGQgY29tbWFuZCBcCisJLWxhYmVsIFttYyAiU2hvdyBNb3JlIENvbnRleHQiXSBcCisJLWNvbW1hbmQgc2hvd19tb3JlX2NvbnRleHQKK2xhcHBlbmQgZGlmZl9hY3Rpb25zIFtsaXN0ICRjdHhtIGVudHJ5Y29uZiBbJGN0eG0gaW5kZXggbGFzdF0gLXN0YXRlXQorJGN0eG0gYWRkIHNlcGFyYXRvcgorJGN0eG0gYWRkIGNvbW1hbmQgXAorCS1sYWJlbCBbbWMgUmVmcmVzaF0gXAorCS1jb21tYW5kIHJlc2hvd19kaWZmCitsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KKyRjdHhtIGFkZCBjb21tYW5kIFwKKwktbGFiZWwgW21jIENvcHldIFwKKwktY29tbWFuZCB7dGtfdGV4dENvcHkgJHVpX2RpZmZ9CitsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KKyRjdHhtIGFkZCBjb21tYW5kIFwKKwktbGFiZWwgW21jICJTZWxlY3QgQWxsIl0gXAorCS1jb21tYW5kIHtmb2N1cyAkdWlfZGlmZjskdWlfZGlmZiB0YWcgYWRkIHNlbCAwLjAgZW5kfQorbGFwcGVuZCBkaWZmX2FjdGlvbnMgW2xpc3QgJGN0eG0gZW50cnljb25mIFskY3R4bSBpbmRleCBsYXN0XSAtc3RhdGVdCiskY3R4bSBhZGQgY29tbWFuZCBcCisJLWxhYmVsIFttYyAiQ29weSBBbGwiXSBcCisJLWNvbW1hbmQgeworCQkkdWlfZGlmZiB0YWcgYWRkIHNlbCAwLjAgZW5kCisJCXRrX3RleHRDb3B5ICR1aV9kaWZmCisJCSR1aV9kaWZmIHRhZyByZW1vdmUgc2VsIDAuMCBlbmQKKwl9CitsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KKyRjdHhtIGFkZCBzZXBhcmF0b3IKKyRjdHhtIGFkZCBjb21tYW5kIFwKKwktbGFiZWwgW21jICJEZWNyZWFzZSBGb250IFNpemUiXSBcCisJLWNvbW1hbmQge2luY3JfZm9udF9zaXplIGZvbnRfZGlmZiAtMX0KK2xhcHBlbmQgZGlmZl9hY3Rpb25zIFtsaXN0ICRjdHhtIGVudHJ5Y29uZiBbJGN0eG0gaW5kZXggbGFzdF0gLXN0YXRlXQorJGN0eG0gYWRkIGNvbW1hbmQgXAorCS1sYWJlbCBbbWMgIkluY3JlYXNlIEZvbnQgU2l6ZSJdIFwKKwktY29tbWFuZCB7aW5jcl9mb250X3NpemUgZm9udF9kaWZmIDF9CitsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KKyRjdHhtIGFkZCBzZXBhcmF0b3IKKyRjdHhtIGFkZCBjb21tYW5kIC1sYWJlbCBbbWMgIk9wdGlvbnMuLi4iXSBcCisJLWNvbW1hbmQgZG9fb3B0aW9ucworcHJvYyBwb3B1cF9kaWZmX21lbnUge2N0eG0geCB5IFggWX0geworCWdsb2JhbCBjdXJyZW50X2RpZmZfcGF0aCBmaWxlX3N0YXRlcworCXNldCA6OmN1cnNvclggJHgKKwlzZXQgOjpjdXJzb3JZICR5CisJaWYgeyQ6OnVpX2luZGV4IGVxICQ6OmN1cnJlbnRfZGlmZl9zaWRlfSB7CisJCXNldCBsIFttYyAiVW5zdGFnZSBIdW5rIEZyb20gQ29tbWl0Il0KKwl9IGVsc2UgeworCQlzZXQgbCBbbWMgIlN0YWdlIEh1bmsgRm9yIENvbW1pdCJdCisJfQorCWlmIHskOjppc18zd2F5X2RpZmYKKwkJfHwgJGN1cnJlbnRfZGlmZl9wYXRoIGVxIHt9CisJCXx8ICFbaW5mbyBleGlzdHMgZmlsZV9zdGF0ZXMoJGN1cnJlbnRfZGlmZl9wYXRoKV0KKwkJfHwge19PfSBlcSBbbGluZGV4ICRmaWxlX3N0YXRlcygkY3VycmVudF9kaWZmX3BhdGgpIDBdfSB7CisJCXNldCBzIGRpc2FibGVkCisJfSBlbHNlIHsKKwkJc2V0IHMgbm9ybWFsCisJfQorCSRjdHhtIGVudHJ5Y29uZiAkOjp1aV9kaWZmX2FwcGx5aHVuayAtc3RhdGUgJHMgLWxhYmVsICRsCisJdGtfcG9wdXAgJGN0eG0gJFggJFkKK30KK2JpbmRfYnV0dG9uMyAkdWlfZGlmZiBbbGlzdCBwb3B1cF9kaWZmX21lbnUgJGN0eG0gJXggJXkgJVggJVldCisKKyMgLS0gU3RhdHVzIEJhcgorIworc2V0IG1haW5fc3RhdHVzIFs6OnN0YXR1c19iYXI6Om5ldyAuc3RhdHVzXQorcGFjayAuc3RhdHVzIC1hbmNob3IgdyAtc2lkZSBib3R0b20gLWZpbGwgeAorJG1haW5fc3RhdHVzIHNob3cgW21jICJJbml0aWFsaXppbmcuLi4iXQorCisjIC0tIExvYWQgZ2VvbWV0cnkKKyMKK2NhdGNoIHsKK3NldCBnbSAkcmVwb19jb25maWcoZ3VpLmdlb21ldHJ5KQord20gZ2VvbWV0cnkgLiBbbGluZGV4ICRnbSAwXQorLnZwYW5lIHNhc2ggcGxhY2UgMCBcCisJW2xpbmRleCAkZ20gMV0gXAorCVtsaW5kZXggWy52cGFuZSBzYXNoIGNvb3JkIDBdIDFdCisudnBhbmUuZmlsZXMgc2FzaCBwbGFjZSAwIFwKKwlbbGluZGV4IFsudnBhbmUuZmlsZXMgc2FzaCBjb29yZCAwXSAwXSBcCisJW2xpbmRleCAkZ20gMl0KK3Vuc2V0IGdtCit9CisKKyMgLS0gS2V5IEJpbmRpbmdzCisjCitiaW5kICR1aV9jb21tIDwkTTFCLUtleS1SZXR1cm4+IHtkb19jb21taXQ7YnJlYWt9CitiaW5kICR1aV9jb21tIDwkTTFCLUtleS10PiB7ZG9fYWRkX3NlbGVjdGlvbjticmVha30KK2JpbmQgJHVpX2NvbW0gPCRNMUItS2V5LVQ+IHtkb19hZGRfc2VsZWN0aW9uO2JyZWFrfQorYmluZCAkdWlfY29tbSA8JE0xQi1LZXktaT4ge2RvX2FkZF9hbGw7YnJlYWt9CitiaW5kICR1aV9jb21tIDwkTTFCLUtleS1JPiB7ZG9fYWRkX2FsbDticmVha30KK2JpbmQgJHVpX2NvbW0gPCRNMUItS2V5LXg+IHt0a190ZXh0Q3V0ICVXO2JyZWFrfQorYmluZCAkdWlfY29tbSA8JE0xQi1LZXktWD4ge3RrX3RleHRDdXQgJVc7YnJlYWt9CitiaW5kICR1aV9jb21tIDwkTTFCLUtleS1jPiB7dGtfdGV4dENvcHkgJVc7YnJlYWt9CitiaW5kICR1aV9jb21tIDwkTTFCLUtleS1DPiB7dGtfdGV4dENvcHkgJVc7YnJlYWt9CitiaW5kICR1aV9jb21tIDwkTTFCLUtleS12PiB7dGtfdGV4dFBhc3RlICVXOyAlVyBzZWUgaW5zZXJ0OyBicmVha30KK2JpbmQgJHVpX2NvbW0gPCRNMUItS2V5LVY+IHt0a190ZXh0UGFzdGUgJVc7ICVXIHNlZSBpbnNlcnQ7IGJyZWFrfQorYmluZCAkdWlfY29tbSA8JE0xQi1LZXktYT4geyVXIHRhZyBhZGQgc2VsIDAuMCBlbmQ7YnJlYWt9CitiaW5kICR1aV9jb21tIDwkTTFCLUtleS1BPiB7JVcgdGFnIGFkZCBzZWwgMC4wIGVuZDticmVha30KK2JpbmQgJHVpX2NvbW0gPCRNMUItS2V5LW1pbnVzPiB7c2hvd19sZXNzX2NvbnRleHQ7YnJlYWt9CitiaW5kICR1aV9jb21tIDwkTTFCLUtleS1LUF9TdWJ0cmFjdD4ge3Nob3dfbGVzc19jb250ZXh0O2JyZWFrfQorYmluZCAkdWlfY29tbSA8JE0xQi1LZXktZXF1YWw+IHtzaG93X21vcmVfY29udGV4dDticmVha30KK2JpbmQgJHVpX2NvbW0gPCRNMUItS2V5LXBsdXM+IHtzaG93X21vcmVfY29udGV4dDticmVha30KK2JpbmQgJHVpX2NvbW0gPCRNMUItS2V5LUtQX0FkZD4ge3Nob3dfbW9yZV9jb250ZXh0O2JyZWFrfQorCitiaW5kICR1aV9kaWZmIDwkTTFCLUtleS14PiB7dGtfdGV4dENvcHkgJVc7YnJlYWt9CitiaW5kICR1aV9kaWZmIDwkTTFCLUtleS1YPiB7dGtfdGV4dENvcHkgJVc7YnJlYWt9CitiaW5kICR1aV9kaWZmIDwkTTFCLUtleS1jPiB7dGtfdGV4dENvcHkgJVc7YnJlYWt9CitiaW5kICR1aV9kaWZmIDwkTTFCLUtleS1DPiB7dGtfdGV4dENvcHkgJVc7YnJlYWt9CitiaW5kICR1aV9kaWZmIDwkTTFCLUtleS12PiB7YnJlYWt9CitiaW5kICR1aV9kaWZmIDwkTTFCLUtleS1WPiB7YnJlYWt9CitiaW5kICR1aV9kaWZmIDwkTTFCLUtleS1hPiB7JVcgdGFnIGFkZCBzZWwgMC4wIGVuZDticmVha30KK2JpbmQgJHVpX2RpZmYgPCRNMUItS2V5LUE+IHslVyB0YWcgYWRkIHNlbCAwLjAgZW5kO2JyZWFrfQorYmluZCAkdWlfZGlmZiA8S2V5LVVwPiAgICAge2NhdGNoIHslVyB5dmlldyBzY3JvbGwgLTEgdW5pdHN9O2JyZWFrfQorYmluZCAkdWlfZGlmZiA8S2V5LURvd24+ICAge2NhdGNoIHslVyB5dmlldyBzY3JvbGwgIDEgdW5pdHN9O2JyZWFrfQorYmluZCAkdWlfZGlmZiA8S2V5LUxlZnQ+ICAge2NhdGNoIHslVyB4dmlldyBzY3JvbGwgLTEgdW5pdHN9O2JyZWFrfQorYmluZCAkdWlfZGlmZiA8S2V5LVJpZ2h0PiAge2NhdGNoIHslVyB4dmlldyBzY3JvbGwgIDEgdW5pdHN9O2JyZWFrfQorYmluZCAkdWlfZGlmZiA8S2V5LWs+ICAgICAgICAge2NhdGNoIHslVyB5dmlldyBzY3JvbGwgLTEgdW5pdHN9O2JyZWFrfQorYmluZCAkdWlfZGlmZiA8S2V5LWo+ICAgICAgICAge2NhdGNoIHslVyB5dmlldyBzY3JvbGwgIDEgdW5pdHN9O2JyZWFrfQorYmluZCAkdWlfZGlmZiA8S2V5LWg+ICAgICAgICAge2NhdGNoIHslVyB4dmlldyBzY3JvbGwgLTEgdW5pdHN9O2JyZWFrfQorYmluZCAkdWlfZGlmZiA8S2V5LWw+ICAgICAgICAge2NhdGNoIHslVyB4dmlldyBzY3JvbGwgIDEgdW5pdHN9O2JyZWFrfQorYmluZCAkdWlfZGlmZiA8Q29udHJvbC1LZXktYj4ge2NhdGNoIHslVyB5dmlldyBzY3JvbGwgLTEgcGFnZXN9O2JyZWFrfQorYmluZCAkdWlfZGlmZiA8Q29udHJvbC1LZXktZj4ge2NhdGNoIHslVyB5dmlldyBzY3JvbGwgIDEgcGFnZXN9O2JyZWFrfQorYmluZCAkdWlfZGlmZiA8QnV0dG9uLTE+ICAge2ZvY3VzICVXfQorCitpZiB7W2lzX2VuYWJsZWQgYnJhbmNoXX0geworCWJpbmQgLiA8JE0xQi1LZXktbj4gYnJhbmNoX2NyZWF0ZTo6ZGlhbG9nCisJYmluZCAuIDwkTTFCLUtleS1OPiBicmFuY2hfY3JlYXRlOjpkaWFsb2cKKwliaW5kIC4gPCRNMUItS2V5LW8+IGJyYW5jaF9jaGVja291dDo6ZGlhbG9nCisJYmluZCAuIDwkTTFCLUtleS1PPiBicmFuY2hfY2hlY2tvdXQ6OmRpYWxvZworCWJpbmQgLiA8JE0xQi1LZXktbT4gbWVyZ2U6OmRpYWxvZworCWJpbmQgLiA8JE0xQi1LZXktTT4gbWVyZ2U6OmRpYWxvZworfQoraWYge1tpc19lbmFibGVkIHRyYW5zcG9ydF19IHsKKwliaW5kIC4gPCRNMUItS2V5LXA+IGRvX3B1c2hfYW55d2hlcmUKKwliaW5kIC4gPCRNMUItS2V5LVA+IGRvX3B1c2hfYW55d2hlcmUKK30KKworYmluZCAuICAgPEtleS1GNT4gICAgIGRvX3Jlc2NhbgorYmluZCAuICAgPCRNMUItS2V5LXI+IGRvX3Jlc2NhbgorYmluZCAuICAgPCRNMUItS2V5LVI+IGRvX3Jlc2NhbgorYmluZCAuICAgPCRNMUItS2V5LXM+IGRvX3NpZ25vZmYKK2JpbmQgLiAgIDwkTTFCLUtleS1TPiBkb19zaWdub2ZmCitiaW5kIC4gICA8JE0xQi1LZXktdD4gZG9fYWRkX3NlbGVjdGlvbgorYmluZCAuICAgPCRNMUItS2V5LVQ+IGRvX2FkZF9zZWxlY3Rpb24KK2JpbmQgLiAgIDwkTTFCLUtleS1pPiBkb19hZGRfYWxsCitiaW5kIC4gICA8JE0xQi1LZXktST4gZG9fYWRkX2FsbAorYmluZCAuICAgPCRNMUItS2V5LW1pbnVzPiB7c2hvd19sZXNzX2NvbnRleHQ7YnJlYWt9CitiaW5kIC4gICA8JE0xQi1LZXktS1BfU3VidHJhY3Q+IHtzaG93X2xlc3NfY29udGV4dDticmVha30KK2JpbmQgLiAgIDwkTTFCLUtleS1lcXVhbD4ge3Nob3dfbW9yZV9jb250ZXh0O2JyZWFrfQorYmluZCAuICAgPCRNMUItS2V5LXBsdXM+IHtzaG93X21vcmVfY29udGV4dDticmVha30KK2JpbmQgLiAgIDwkTTFCLUtleS1LUF9BZGQ+IHtzaG93X21vcmVfY29udGV4dDticmVha30KK2JpbmQgLiAgIDwkTTFCLUtleS1SZXR1cm4+IGRvX2NvbW1pdAorZm9yZWFjaCBpIFtsaXN0ICR1aV9pbmRleCAkdWlfd29ya2Rpcl0geworCWJpbmQgJGkgPEJ1dHRvbi0xPiAgICAgICAidG9nZ2xlX29yX2RpZmYgICAgICAgICAkaSAleCAleTsgYnJlYWsiCisJYmluZCAkaSA8JE0xQi1CdXR0b24tMT4gICJhZGRfb25lX3RvX3NlbGVjdGlvbiAgICRpICV4ICV5OyBicmVhayIKKwliaW5kICRpIDxTaGlmdC1CdXR0b24tMT4gImFkZF9yYW5nZV90b19zZWxlY3Rpb24gJGkgJXggJXk7IGJyZWFrIgorfQordW5zZXQgaQorCitzZXQgZmlsZV9saXN0cygkdWlfaW5kZXgpIFtsaXN0XQorc2V0IGZpbGVfbGlzdHMoJHVpX3dvcmtkaXIpIFtsaXN0XQorCit3bSB0aXRsZSAuICJbYXBwbmFtZV0gKFtyZXBvbmFtZV0pIFtmaWxlIG5vcm1hbGl6ZSBbZmlsZSBkaXJuYW1lIFtnaXRkaXJdXV0iCitmb2N1cyAtZm9yY2UgJHVpX2NvbW0KKworIyAtLSBXYXJuIHRoZSB1c2VyIGFib3V0IGVudmlyb25tZW50YWwgcHJvYmxlbXMuICBDeWd3aW4ncyBUY2wKKyMgICAgZG9lcyAqbm90KiBwYXNzIGl0cyBlbnYgYXJyYXkgb250byBhbnkgcHJvY2Vzc2VzIGl0IHNwYXducy4KKyMgICAgVGhpcyBtZWFucyB0aGF0IGdpdCBwcm9jZXNzZXMgZ2V0IG5vbmUgb2Ygb3VyIGVudmlyb25tZW50LgorIworaWYge1tpc19DeWd3aW5dfSB7CisJc2V0IGlnbm9yZWRfZW52IDAKKwlzZXQgc3VnZ2VzdF91c2VyIHt9CisJc2V0IG1zZyBbbWMgIlBvc3NpYmxlIGVudmlyb25tZW50IGlzc3VlcyBleGlzdC4KKworVGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHByb2JhYmx5Citnb2luZyB0byBiZSBpZ25vcmVkIGJ5IGFueSBHaXQgc3VicHJvY2VzcyBydW4KK2J5ICVzOgorCisiIFthcHBuYW1lXV0KKwlmb3JlYWNoIG5hbWUgW2FycmF5IG5hbWVzIGVudl0geworCQlzd2l0Y2ggLXJlZ2V4cCAtLSAkbmFtZSB7CisJCXteR0lUX0lOREVYX0ZJTEUkfSAtCisJCXteR0lUX09CSkVDVF9ESVJFQ1RPUlkkfSAtCisJCXteR0lUX0FMVEVSTkFURV9PQkpFQ1RfRElSRUNUT1JJRVMkfSAtCisJCXteR0lUX0RJRkZfT1BUUyR9IC0KKwkJe15HSVRfRVhURVJOQUxfRElGRiR9IC0KKwkJe15HSVRfUEFHRVIkfSAtCisJCXteR0lUX1RSQUNFJH0gLQorCQl7XkdJVF9DT05GSUckfSAtCisJCXteR0lUX0NPTkZJR19MT0NBTCR9IC0KKwkJe15HSVRfKEFVVEhPUnxDT01NSVRURVIpX0RBVEUkfSB7CisJCQlhcHBlbmQgbXNnICIgLSAkbmFtZVxuIgorCQkJaW5jciBpZ25vcmVkX2VudgorCQl9CisJCXteR0lUXyhBVVRIT1J8Q09NTUlUVEVSKV8oTkFNRXxFTUFJTCkkfSB7CisJCQlhcHBlbmQgbXNnICIgLSAkbmFtZVxuIgorCQkJaW5jciBpZ25vcmVkX2VudgorCQkJc2V0IHN1Z2dlc3RfdXNlciAkbmFtZQorCQl9CisJCX0KKwl9CisJaWYgeyRpZ25vcmVkX2VudiA+IDB9IHsKKwkJYXBwZW5kIG1zZyBbbWMgIgorVGhpcyBpcyBkdWUgdG8gYSBrbm93biBpc3N1ZSB3aXRoIHRoZQorVGNsIGJpbmFyeSBkaXN0cmlidXRlZCBieSBDeWd3aW4uIl0KKworCQlpZiB7JHN1Z2dlc3RfdXNlciBuZSB7fX0geworCQkJYXBwZW5kIG1zZyBbbWMgIgorCitBIGdvb2QgcmVwbGFjZW1lbnQgZm9yICVzCitpcyBwbGFjaW5nIHZhbHVlcyBmb3IgdGhlIHVzZXIubmFtZSBhbmQKK3VzZXIuZW1haWwgc2V0dGluZ3MgaW50byB5b3VyIHBlcnNvbmFsCit+Ly5naXRjb25maWcgZmlsZS4KKyIgJHN1Z2dlc3RfdXNlcl0KKwkJfQorCQl3YXJuX3BvcHVwICRtc2cKKwl9CisJdW5zZXQgaWdub3JlZF9lbnYgbXNnIHN1Z2dlc3RfdXNlciBuYW1lCit9CisKKyMgLS0gT25seSBpbml0aWFsaXplIGNvbXBsZXggVUkgaWYgd2UgYXJlIGdvaW5nIHRvIHN0YXkgcnVubmluZy4KKyMKK2lmIHtbaXNfZW5hYmxlZCB0cmFuc3BvcnRdfSB7CisJbG9hZF9hbGxfcmVtb3RlcworCisJc2V0IG4gWy5tYmFyLnJlbW90ZSBpbmRleCBlbmRdCisJcG9wdWxhdGVfcHVzaF9tZW51CisJcG9wdWxhdGVfZmV0Y2hfbWVudQorCXNldCBuIFtleHByIHtbLm1iYXIucmVtb3RlIGluZGV4IGVuZF0gLSAkbn1dCisJaWYgeyRuID4gMH0geworCQkubWJhci5yZW1vdGUgaW5zZXJ0ICRuIHNlcGFyYXRvcgorCX0KKwl1bnNldCBuCit9CisKK2lmIHtbd2luZm8gZXhpc3RzICR1aV9jb21tXX0geworCXNldCBHSVRHVUlfQkNLX2V4aXN0cyBbbG9hZF9tZXNzYWdlIEdJVEdVSV9CQ0tdCisKKwkjIC0tIElmIGJvdGggb3VyIGJhY2t1cCBhbmQgbWVzc2FnZSBmaWxlcyBleGlzdCB1c2UgdGhlCisJIyAgICBuZXdlciBvZiB0aGUgdHdvIGZpbGVzIHRvIGluaXRpYWxpemUgdGhlIGJ1ZmZlci4KKwkjCisJaWYgeyRHSVRHVUlfQkNLX2V4aXN0c30geworCQlzZXQgbSBbZ2l0ZGlyIEdJVEdVSV9NU0ddCisJCWlmIHtbZmlsZSBpc2ZpbGUgJG1dfSB7CisJCQlpZiB7W2ZpbGUgbXRpbWUgW2dpdGRpciBHSVRHVUlfQkNLXV0gPiBbZmlsZSBtdGltZSAkbV19IHsKKwkJCQljYXRjaCB7ZmlsZSBkZWxldGUgW2dpdGRpciBHSVRHVUlfTVNHXX0KKwkJCX0gZWxzZSB7CisJCQkJJHVpX2NvbW0gZGVsZXRlIDAuMCBlbmQKKwkJCQkkdWlfY29tbSBlZGl0IHJlc2V0CisJCQkJJHVpX2NvbW0gZWRpdCBtb2RpZmllZCBmYWxzZQorCQkJCWNhdGNoIHtmaWxlIGRlbGV0ZSBbZ2l0ZGlyIEdJVEdVSV9CQ0tdfQorCQkJCXNldCBHSVRHVUlfQkNLX2V4aXN0cyAwCisJCQl9CisJCX0KKwkJdW5zZXQgbQorCX0KKworCXByb2MgYmFja3VwX2NvbW1pdF9idWZmZXIge30geworCQlnbG9iYWwgdWlfY29tbSBHSVRHVUlfQkNLX2V4aXN0cworCisJCXNldCBtIFskdWlfY29tbSBlZGl0IG1vZGlmaWVkXQorCQlpZiB7JG0gfHwgJEdJVEdVSV9CQ0tfZXhpc3RzfSB7CisJCQlzZXQgbXNnIFtzdHJpbmcgdHJpbSBbJHVpX2NvbW0gZ2V0IDAuMCBlbmRdXQorCQkJcmVnc3ViIC1hbGwgLWxpbmUge1sgXHJcdF0rJH0gJG1zZyB7fSBtc2cKKworCQkJaWYgeyRtc2cgZXEge319IHsKKwkJCQlpZiB7JEdJVEdVSV9CQ0tfZXhpc3RzfSB7CisJCQkJCWNhdGNoIHtmaWxlIGRlbGV0ZSBbZ2l0ZGlyIEdJVEdVSV9CQ0tdfQorCQkJCQlzZXQgR0lUR1VJX0JDS19leGlzdHMgMAorCQkJCX0KKwkJCX0gZWxzZWlmIHskbX0geworCQkJCWNhdGNoIHsKKwkJCQkJc2V0IGZkIFtvcGVuIFtnaXRkaXIgR0lUR1VJX0JDS10gd10KKwkJCQkJcHV0cyAtbm9uZXdsaW5lICRmZCAkbXNnCisJCQkJCWNsb3NlICRmZAorCQkJCQlzZXQgR0lUR1VJX0JDS19leGlzdHMgMQorCQkJCX0KKwkJCX0KKworCQkJJHVpX2NvbW0gZWRpdCBtb2RpZmllZCBmYWxzZQorCQl9CisKKwkJc2V0IDo6R0lUR1VJX0JDS19pIFthZnRlciAyMDAwIGJhY2t1cF9jb21taXRfYnVmZmVyXQorCX0KKworCWJhY2t1cF9jb21taXRfYnVmZmVyCisKKwkjIC0tIElmIHRoZSB1c2VyIGhhcyBhc3BlbGwgYXZhaWxhYmxlIHdlIGNhbiBkcml2ZSBpdAorCSMgICAgaW4gcGlwZSBtb2RlIHRvIHNwZWxsY2hlY2sgdGhlIGNvbW1pdCBtZXNzYWdlLgorCSMKKwlzZXQgc3BlbGxfY21kIFtsaXN0IHxdCisJc2V0IHNwZWxsX2RpY3QgW2dldF9jb25maWcgZ3VpLnNwZWxsaW5nZGljdGlvbmFyeV0KKwlsYXBwZW5kIHNwZWxsX2NtZCBhc3BlbGwKKwlpZiB7JHNwZWxsX2RpY3QgbmUge319IHsKKwkJbGFwcGVuZCBzcGVsbF9jbWQgLS1tYXN0ZXI9JHNwZWxsX2RpY3QKKwl9CisJbGFwcGVuZCBzcGVsbF9jbWQgLS1tb2RlPW5vbmUKKwlsYXBwZW5kIHNwZWxsX2NtZCAtLWVuY29kaW5nPXV0Zi04CisJbGFwcGVuZCBzcGVsbF9jbWQgcGlwZQorCWlmIHskc3BlbGxfZGljdCBlcSB7bm9uZX0KKwkgfHwgW2NhdGNoIHtzZXQgc3BlbGxfZmQgW29wZW4gJHNwZWxsX2NtZCByK119IHNwZWxsX2Vycl19IHsKKwkJYmluZF9idXR0b24zICR1aV9jb21tIFtsaXN0IHRrX3BvcHVwICR1aV9jb21tX2N0eG0gJVggJVldCisJfSBlbHNlIHsKKwkJc2V0IHVpX2NvbW1fc3BlbGwgW3NwZWxsY2hlY2s6OmluaXQgXAorCQkJJHNwZWxsX2ZkIFwKKwkJCSR1aV9jb21tIFwKKwkJCSR1aV9jb21tX2N0eG0gXAorCQldCisJfQorCXVuc2V0IC1ub2NvbXBsYWluIHNwZWxsX2NtZCBzcGVsbF9mZCBzcGVsbF9lcnIgc3BlbGxfZGljdAorfQorCitsb2NrX2luZGV4IGJlZ2luLXJlYWQKK2lmIHshW3dpbmZvIGlzbWFwcGVkIC5dfSB7CisJd20gZGVpY29uaWZ5IC4KK30KK2FmdGVyIDEgZG9fcmVzY2FuCitpZiB7W2lzX2VuYWJsZWQgbXVsdGljb21taXRdfSB7CisJYWZ0ZXIgMTAwMCBoaW50X2djCit9CmRpZmYgLS1naXQgYS9naXQtZ3VpL2xpYi9hYm91dC50Y2wgYi9naXQtZ3VpL2xpYi9hYm91dC50Y2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxYWI4OQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvbGliL2Fib3V0LnRjbApAQCAtMCwwICsxLDg3IEBACisjIGdpdC1ndWkgYWJvdXQgZ2l0LWd1aSBkaWFsb2cKKyMgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IFNoYXduIFBlYXJjZQorCitwcm9jIGRvX2Fib3V0IHt9IHsKKwlnbG9iYWwgYXBwdmVycyBjb3B5cmlnaHQgb2d1aWxpYgorCWdsb2JhbCB0Y2xfcGF0Y2hMZXZlbCB0a19wYXRjaExldmVsCisJZ2xvYmFsIHVpX2NvbW1fc3BlbGwKKworCXNldCB3IC5hYm91dF9kaWFsb2cKKwl0b3BsZXZlbCAkdworCXdtIGdlb21ldHJ5ICR3ICIrW3dpbmZvIHJvb3R4IC5dK1t3aW5mbyByb290eSAuXSIKKworCXBhY2sgW2dpdF9sb2dvICR3LmdpdF9sb2dvXSAtc2lkZSBsZWZ0IC1maWxsIHkgLXBhZHggMTAgLXBhZHkgMTAKKwlsYWJlbCAkdy5oZWFkZXIgLXRleHQgW21jICJBYm91dCAlcyIgW2FwcG5hbWVdXSBcCisJCS1mb250IGZvbnRfdWlib2xkCisJcGFjayAkdy5oZWFkZXIgLXNpZGUgdG9wIC1maWxsIHgKKworCWZyYW1lICR3LmJ1dHRvbnMKKwlidXR0b24gJHcuYnV0dG9ucy5jbG9zZSAtdGV4dCB7Q2xvc2V9IFwKKwkJLWRlZmF1bHQgYWN0aXZlIFwKKwkJLWNvbW1hbmQgW2xpc3QgZGVzdHJveSAkd10KKwlwYWNrICR3LmJ1dHRvbnMuY2xvc2UgLXNpZGUgcmlnaHQKKwlwYWNrICR3LmJ1dHRvbnMgLXNpZGUgYm90dG9tIC1maWxsIHggLXBhZHkgMTAgLXBhZHggMTAKKworCWxhYmVsICR3LmRlc2MgXAorCQktdGV4dCAiW21jICJnaXQtZ3VpIC0gYSBncmFwaGljYWwgdXNlciBpbnRlcmZhY2UgZm9yIEdpdC4iXVxuJGNvcHlyaWdodCIgXAorCQktcGFkeCA1IC1wYWR5IDUgXAorCQktanVzdGlmeSBsZWZ0IFwKKwkJLWFuY2hvciB3IFwKKwkJLWJvcmRlcndpZHRoIDEgXAorCQktcmVsaWVmIHNvbGlkCisJcGFjayAkdy5kZXNjIC1zaWRlIHRvcCAtZmlsbCB4IC1wYWR4IDUgLXBhZHkgNQorCisJc2V0IHYge30KKwlhcHBlbmQgdiAiZ2l0LWd1aSB2ZXJzaW9uICRhcHB2ZXJzXG4iCisJYXBwZW5kIHYgIltnaXQgdmVyc2lvbl1cbiIKKwlhcHBlbmQgdiAiXG4iCisJaWYgeyR0Y2xfcGF0Y2hMZXZlbCBlcSAkdGtfcGF0Y2hMZXZlbH0geworCQlhcHBlbmQgdiAiVGNsL1RrIHZlcnNpb24gJHRjbF9wYXRjaExldmVsIgorCX0gZWxzZSB7CisJCWFwcGVuZCB2ICJUY2wgdmVyc2lvbiAkdGNsX3BhdGNoTGV2ZWwiCisJCWFwcGVuZCB2ICIsIFRrIHZlcnNpb24gJHRrX3BhdGNoTGV2ZWwiCisJfQorCWlmIHtbaW5mbyBleGlzdHMgdWlfY29tbV9zcGVsbF0KKwkJJiYgWyR1aV9jb21tX3NwZWxsIHZlcnNpb25dIG5lIHt9fSB7CisJCWFwcGVuZCB2ICJcbiIKKwkJYXBwZW5kIHYgWyR1aV9jb21tX3NwZWxsIHZlcnNpb25dCisJfQorCisJc2V0IGQge30KKwlhcHBlbmQgZCAiZ2l0IHdyYXBwZXI6ICQ6Ol9naXRcbiIKKwlhcHBlbmQgZCAiZ2l0IGV4ZWMgZGlyOiBbZ2l0ZXhlY11cbiIKKwlhcHBlbmQgZCAiZ2l0LWd1aSBsaWI6ICRvZ3VpbGliIgorCisJbGFiZWwgJHcudmVycyBcCisJCS10ZXh0ICR2IFwKKwkJLXBhZHggNSAtcGFkeSA1IFwKKwkJLWp1c3RpZnkgbGVmdCBcCisJCS1hbmNob3IgdyBcCisJCS1ib3JkZXJ3aWR0aCAxIFwKKwkJLXJlbGllZiBzb2xpZAorCXBhY2sgJHcudmVycyAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCA1IC1wYWR5IDUKKworCWxhYmVsICR3LmRpcnMgXAorCQktdGV4dCAkZCBcCisJCS1wYWR4IDUgLXBhZHkgNSBcCisJCS1qdXN0aWZ5IGxlZnQgXAorCQktYW5jaG9yIHcgXAorCQktYm9yZGVyd2lkdGggMSBcCisJCS1yZWxpZWYgc29saWQKKwlwYWNrICR3LmRpcnMgLXNpZGUgdG9wIC1maWxsIHggLXBhZHggNSAtcGFkeSA1CisKKwltZW51ICR3LmN0eG0gLXRlYXJvZmYgMAorCSR3LmN0eG0gYWRkIGNvbW1hbmQgXAorCQktbGFiZWwge0NvcHl9IFwKKwkJLWNvbW1hbmQgIgorCQljbGlwYm9hcmQgY2xlYXIKKwkJY2xpcGJvYXJkIGFwcGVuZCAtZm9ybWF0IFNUUklORyAtdHlwZSBTVFJJTkcgLS0gXFskdy52ZXJzIGNnZXQgLXRleHRcXQorCSIKKworCWJpbmQgJHcgPFZpc2liaWxpdHk+ICJncmFiICR3OyBmb2N1cyAkdy5idXR0b25zLmNsb3NlIgorCWJpbmQgJHcgPEtleS1Fc2NhcGU+ICJkZXN0cm95ICR3IgorCWJpbmQgJHcgPEtleS1SZXR1cm4+ICJkZXN0cm95ICR3IgorCWJpbmRfYnV0dG9uMyAkdy52ZXJzICJ0a19wb3B1cCAkdy5jdHhtICVYICVZOyBncmFiICR3OyBmb2N1cyAkdyIKKwl3bSB0aXRsZSAkdyAiQWJvdXQgW2FwcG5hbWVdIgorCXRrd2FpdCB3aW5kb3cgJHcKK30KZGlmZiAtLWdpdCBhL2dpdC1ndWkvbGliL2JsYW1lLnRjbCBiL2dpdC1ndWkvbGliL2JsYW1lLnRjbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmZhYzFiCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9saWIvYmxhbWUudGNsCkBAIC0wLDAgKzEsOTk1IEBACisjIGdpdC1ndWkgYmxhbWUgdmlld2VyCisjIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBTaGF3biBQZWFyY2UKKworY2xhc3MgYmxhbWUgeworCitpbWFnZSBjcmVhdGUgcGhvdG8gOjpibGFtZTo6aW1nX2JhY2tfYXJyb3cgLWRhdGEge1IwbEdPRGxoR0FBWUFJVUFBUHdDQkV6S1hGVFNaSXorbkd6bWhHenFmR1RpZElUK25FekdYSFRxaEd6bWZHemlmRnphZEVUQ1ZFUytWQVJXREZ6V2JIenlqQVJlREdUYWRGVE9aRFN5UkR5eVRDeW1QQVJhRkdUZWRGelNiRHkyVEN5cVJDeXFQQVJhREF5Q0hFUzZWRHk2VkN5aVBBUjZIQ1NlTkJ5V0xBUnlGQVJpREFScUZHVGlmQVJpRkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNINUJBRUFBQUFBTEFBQUFBQVlBQmdBQUFhalFJQndTQ3dhajhpa2NzazBCcHBKd1JQcUhFeXBRd0hCaXMwV0RBZEVGeUJJS0JhTUFLTEJkalFlU2tGQllUQkFJdmdFb1M2Sm1oVVRFd0lVRFE0VkZoY01HRWh5Q2dvWkV4b1VheHNXSEIwVEhrZ2ZBWFVHQWhvQkRTQVZGUjBYQm5DYkRSbWdvZzBocFNJaURKcEpJeUVRaEJVY0pDSWx3QTIyU1NZVm9na25FZzhlRDgycVNpZ2REU2tuWTBJcUpRWFBZeElsMWRaQ0dOdld3K0RtNTEwR1FRQWgvbWhEY21WaGRHVmtJR0o1SUVKTlVGUnZSMGxHSUZCeWJ5QjJaWEp6YVc5dUlESXVOUTBLcVNCRVpYWmxiRU52Y2lBeE9UazNMREU1T1RndUlFRnNiQ0J5YVdkb2RITWdjbVZ6WlhKMlpXUXVEUXBvZEhSd09pOHZkM2QzTG1SbGRtVnNZMjl5TG1OdmJRQTd9CisKKyMgUGVyc2lzdGFudCBkYXRhIChzdXJ2aXZlcyBsb2FkcykKKyMKK2ZpZWxkIGhpc3Rvcnkge307ICMgdmlld2VyIGhpc3Rvcnk6IHtjb21taXQgcGF0aH0KK2ZpZWxkIGhlYWRlciAgICA7ICMgYXJyYXkgY29tbWl0LGtleSAtPiBoZWFkZXIgZmllbGQKKworIyBUayBVSSBjb250cm9sIHBhdGhzCisjCitmaWVsZCB3ICAgICAgICAgIDsgIyB0b3Agd2luZG93IGluIHRoaXMgdmlld2VyCitmaWVsZCB3X2JhY2sgICAgIDsgIyBvdXIgYmFjayBidXR0b24KK2ZpZWxkIHdfcGF0aCAgICAgOyAjIGxhYmVsIHNob3dpbmcgdGhlIGN1cnJlbnQgZmlsZSBwYXRoCitmaWVsZCB3X2NvbHVtbnMgIDsgIyBsaXN0IG9mIGFsbCBjb2x1bW4gd2lkZ2V0cyBpbiB0aGUgdmlld2VyCitmaWVsZCB3X2xpbmUgICAgIDsgIyB0ZXh0IGNvbHVtbjogYWxsIGxpbmUgbnVtYmVycworZmllbGQgd19hbW92ICAgICA7ICMgdGV4dCBjb2x1bW46IGFubm90YXRpb25zICsgbW92ZSB0cmFja2luZworZmllbGQgd19hc2ltICAgICA7ICMgdGV4dCBjb2x1bW46IGFubm90YXRpb25zIChzaW1wbGUgY29tcHV0YXRpb24pCitmaWVsZCB3X2ZpbGUgICAgIDsgIyB0ZXh0IGNvbHVtbjogYWN0dWFsIGZpbGUgZGF0YQorZmllbGQgd19jdmlld2VyICA7ICMgcGFuZSBzaG93aW5nIGNvbW1pdCBtZXNzYWdlCitmaWVsZCBzdGF0dXMgICAgIDsgIyBzdGF0dXMgbWVnYS13aWRnZXQgaW5zdGFuY2UKK2ZpZWxkIG9sZF9oZWlnaHQgOyAjIGxhc3Qga25vd24gaGVpZ2h0IG9mICR3LmZpbGVfcGFuZQorCisjIFRrIFVJIGNvbG9ycworIwordmFyaWFibGUgYWN0aXZlX2NvbG9yICNjMGVkYzUKK3ZhcmlhYmxlIGdyb3VwX2NvbG9ycyB7CisJI2Q2ZDZkNgorCSNlMWUxZTEKKwkjZWNlY2VjCit9CisKKyMgU3dpdGNoZXMgZm9yIG9yaWdpbmFsIGxvY2F0aW9uIGRldGVjdGlvbgorIwordmFyaWFibGUgb3JpZ2luYWxfb3B0aW9ucyBbbGlzdCAtQyAtQ10KK2lmIHtbZ2l0LXZlcnNpb24gPj0gMS41LjNdfSB7CisJbGFwcGVuZCBvcmlnaW5hbF9vcHRpb25zIC13IDsgIyBpZ25vcmUgaW5kZW50YXRpb24gY2hhbmdlcworfQorCisjIEN1cnJlbnQgYmxhbWUgZGF0YTsgY2xlYXJlZC9yZXNldCBvbiBlYWNoIGxvYWQKKyMKK2ZpZWxkIGNvbW1pdCAgICAgICAgICAgICAgIDsgIyBpbnB1dCBjb21taXQgdG8gYmxhbWUKK2ZpZWxkIHBhdGggICAgICAgICAgICAgICAgIDsgIyBpbnB1dCBmaWxlbmFtZSB0byB2aWV3IGluICRjb21taXQKKworZmllbGQgY3VycmVudF9mZCAgICAgICAge30gOyAjIGJhY2tncm91bmQgcHJvY2VzcyBydW5uaW5nCitmaWVsZCBoaWdobGlnaHRfbGluZSAgICAtMSA7ICMgY3VycmVudCBsaW5lIHNlbGVjdGVkCitmaWVsZCBoaWdobGlnaHRfY29sdW1uICB7fSA7ICMgY3VycmVudCBjb21taXQgY29sdW1uIHNlbGVjdGVkCitmaWVsZCBoaWdobGlnaHRfY29tbWl0ICB7fSA7ICMgc2hhMSBvZiBjb21taXQgc2VsZWN0ZWQKKworZmllbGQgdG90YWxfbGluZXMgICAgICAgMCAgOyAjIHRvdGFsIGxlbmd0aCBvZiBmaWxlCitmaWVsZCBibGFtZV9saW5lcyAgICAgICAwICA7ICMgbnVtYmVyIG9mIGxpbmVzIGNvbXB1dGVkCitmaWVsZCBhbW92X2RhdGEgICAgICAgICAgICA7ICMgbGlzdCBvZiB7Y29tbWl0IG9yaWdmaWxlIG9yaWdsaW5lfQorZmllbGQgYXNpbV9kYXRhICAgICAgICAgICAgOyAjIGxpc3Qgb2Yge2NvbW1pdCBvcmlnZmlsZSBvcmlnbGluZX0KKworZmllbGQgcl9jb21taXQgICAgICAgICAgICAgOyAjIGNvbW1pdCBjdXJyZW50bHkgYmVpbmcgcGFyc2VkCitmaWVsZCByX29yaWdfbGluZSAgICAgICAgICA7ICMgb3JpZ2luYWwgbGluZSBudW1iZXIKK2ZpZWxkIHJfZmluYWxfbGluZSAgICAgICAgIDsgIyBmaW5hbCBsaW5lIG51bWJlcgorZmllbGQgcl9saW5lX2NvdW50ICAgICAgICAgOyAjIGxpbmVzIGluIHRoaXMgcmVnaW9uCisKK2ZpZWxkIHRvb2x0aXBfd20gICAgICAgIHt9IDsgIyBDdXJyZW50IHRvb2x0aXAgdG9wbGV2ZWwsIGlmIG9wZW4KK2ZpZWxkIHRvb2x0aXBfdCAgICAgICAgIHt9IDsgIyBUZXh0IHdpZGdldCBpbiAkdG9vbHRpcF93bQorZmllbGQgdG9vbHRpcF90aW1lciAgICAge30gOyAjIEN1cnJlbnQgdGltZXIgZXZlbnQgZm9yIG91ciB0b29sdGlwCitmaWVsZCB0b29sdGlwX2NvbW1pdCAgICB7fSA7ICMgQ29tbWl0KHMpIGluIHRvb2x0aXAKKworY29uc3RydWN0b3IgbmV3IHtpX2NvbW1pdCBpX3BhdGh9IHsKKwlnbG9iYWwgY3Vyc29yX3B0cgorCXZhcmlhYmxlIGFjdGl2ZV9jb2xvcgorCXZhcmlhYmxlIGdyb3VwX2NvbG9ycworCisJc2V0IGNvbW1pdCAkaV9jb21taXQKKwlzZXQgcGF0aCAgICRpX3BhdGgKKworCW1ha2VfdG9wbGV2ZWwgdG9wIHcKKwl3bSB0aXRsZSAkdG9wIFthcHBlbmQgIlthcHBuYW1lXSAoW3JlcG9uYW1lXSk6ICIgW21jICJGaWxlIFZpZXdlciJdXQorCisJZnJhbWUgJHcuaGVhZGVyIC1iYWNrZ3JvdW5kIGdvbGQKKwlsYWJlbCAkdy5oZWFkZXIuY29tbWl0X2wgXAorCQktdGV4dCBbbWMgIkNvbW1pdDoiXSBcCisJCS1iYWNrZ3JvdW5kIGdvbGQgXAorCQktZm9yZWdyb3VuZCBibGFjayBcCisJCS1hbmNob3IgdyBcCisJCS1qdXN0aWZ5IGxlZnQKKwlzZXQgd19iYWNrICR3LmhlYWRlci5jb21taXRfYgorCWxhYmVsICR3X2JhY2sgXAorCQktaW1hZ2UgOjpibGFtZTo6aW1nX2JhY2tfYXJyb3cgXAorCQktYm9yZGVyd2lkdGggMCBcCisJCS1yZWxpZWYgZmxhdCBcCisJCS1zdGF0ZSBkaXNhYmxlZCBcCisJCS1iYWNrZ3JvdW5kIGdvbGQgXAorCQktZm9yZWdyb3VuZCBibGFjayBcCisJCS1hY3RpdmViYWNrZ3JvdW5kIGdvbGQKKwliaW5kICR3X2JhY2sgPEJ1dHRvbi0xPiAiCisJCWlmIHtcWyR3X2JhY2sgY2dldCAtc3RhdGVcXSBlcSB7bm9ybWFsfX0geworCQkJW2NiIF9oaXN0b3J5X21lbnVdCisJCX0KKwkJIgorCWxhYmVsICR3LmhlYWRlci5jb21taXQgXAorCQktdGV4dHZhcmlhYmxlIEBjb21taXQgXAorCQktYmFja2dyb3VuZCBnb2xkIFwKKwkJLWZvcmVncm91bmQgYmxhY2sgXAorCQktYW5jaG9yIHcgXAorCQktanVzdGlmeSBsZWZ0CisJbGFiZWwgJHcuaGVhZGVyLnBhdGhfbCBcCisJCS10ZXh0IFttYyAiRmlsZToiXSBcCisJCS1iYWNrZ3JvdW5kIGdvbGQgXAorCQktZm9yZWdyb3VuZCBibGFjayBcCisJCS1hbmNob3IgdyBcCisJCS1qdXN0aWZ5IGxlZnQKKwlzZXQgd19wYXRoICR3LmhlYWRlci5wYXRoCisJbGFiZWwgJHdfcGF0aCBcCisJCS1iYWNrZ3JvdW5kIGdvbGQgXAorCQktZm9yZWdyb3VuZCBibGFjayBcCisJCS1hbmNob3IgdyBcCisJCS1qdXN0aWZ5IGxlZnQKKwlwYWNrICR3LmhlYWRlci5jb21taXRfbCAtc2lkZSBsZWZ0CisJcGFjayAkd19iYWNrIC1zaWRlIGxlZnQKKwlwYWNrICR3LmhlYWRlci5jb21taXQgLXNpZGUgbGVmdAorCXBhY2sgJHdfcGF0aCAtZmlsbCB4IC1zaWRlIHJpZ2h0CisJcGFjayAkdy5oZWFkZXIucGF0aF9sIC1zaWRlIHJpZ2h0CisKKwlwYW5lZHdpbmRvdyAkdy5maWxlX3BhbmUgLW9yaWVudCB2ZXJ0aWNhbAorCWZyYW1lICR3LmZpbGVfcGFuZS5vdXQKKwlmcmFtZSAkdy5maWxlX3BhbmUuY20KKwkkdy5maWxlX3BhbmUgYWRkICR3LmZpbGVfcGFuZS5vdXQgXAorCQktc3RpY2t5IG5zZXcgXAorCQktbWluc2l6ZSAxMDAgXAorCQktaGVpZ2h0IDEwMCBcCisJCS13aWR0aCAxMDAKKwkkdy5maWxlX3BhbmUgYWRkICR3LmZpbGVfcGFuZS5jbSBcCisJCS1zdGlja3kgbnNldyBcCisJCS1taW5zaXplIDI1IFwKKwkJLWhlaWdodCAyNSBcCisJCS13aWR0aCAxMDAKKworCXNldCB3X2xpbmUgJHcuZmlsZV9wYW5lLm91dC5saW5lbnVtYmVyX3QKKwl0ZXh0ICR3X2xpbmUgXAorCQktdGFrZWZvY3VzIDAgXAorCQktaGlnaGxpZ2h0dGhpY2tuZXNzIDAgXAorCQktcGFkeCAwIC1wYWR5IDAgXAorCQktYmFja2dyb3VuZCB3aGl0ZSBcCisJCS1mb3JlZ3JvdW5kIGJsYWNrIFwKKwkJLWJvcmRlcndpZHRoIDAgXAorCQktc3RhdGUgZGlzYWJsZWQgXAorCQktd3JhcCBub25lIFwKKwkJLWhlaWdodCA0MCBcCisJCS13aWR0aCA2IFwKKwkJLWZvbnQgZm9udF9kaWZmCisJJHdfbGluZSB0YWcgY29uZiBsaW5lbnVtYmVyIC1qdXN0aWZ5IHJpZ2h0IC1ybWFyZ2luIDUKKworCXNldCB3X2Ftb3YgJHcuZmlsZV9wYW5lLm91dC5hbW92ZV90CisJdGV4dCAkd19hbW92IFwKKwkJLXRha2Vmb2N1cyAwIFwKKwkJLWhpZ2hsaWdodHRoaWNrbmVzcyAwIFwKKwkJLXBhZHggMCAtcGFkeSAwIFwKKwkJLWJhY2tncm91bmQgd2hpdGUgXAorCQktZm9yZWdyb3VuZCBibGFjayBcCisJCS1ib3JkZXJ3aWR0aCAwIFwKKwkJLXN0YXRlIGRpc2FibGVkIFwKKwkJLXdyYXAgbm9uZSBcCisJCS1oZWlnaHQgNDAgXAorCQktd2lkdGggNSBcCisJCS1mb250IGZvbnRfZGlmZgorCSR3X2Ftb3YgdGFnIGNvbmYgYXV0aG9yX2FiYnIgLWp1c3RpZnkgcmlnaHQgLXJtYXJnaW4gNQorCSR3X2Ftb3YgdGFnIGNvbmYgY3Vycl9jb21taXQKKwkkd19hbW92IHRhZyBjb25mIHByaW9yX2NvbW1pdCAtZm9yZWdyb3VuZCBibHVlIC11bmRlcmxpbmUgMQorCSR3X2Ftb3YgdGFnIGJpbmQgcHJpb3JfY29tbWl0IFwKKwkJPEJ1dHRvbi0xPiBcCisJCSJbY2IgX2xvYWRfY29tbWl0ICR3X2Ftb3YgQGFtb3ZfZGF0YSBAJXgsJXldO2JyZWFrIgorCisJc2V0IHdfYXNpbSAkdy5maWxlX3BhbmUub3V0LmFzaW1wbGVfdAorCXRleHQgJHdfYXNpbSBcCisJCS10YWtlZm9jdXMgMCBcCisJCS1oaWdobGlnaHR0aGlja25lc3MgMCBcCisJCS1wYWR4IDAgLXBhZHkgMCBcCisJCS1iYWNrZ3JvdW5kIHdoaXRlIFwKKwkJLWZvcmVncm91bmQgYmxhY2sgXAorCQktYm9yZGVyd2lkdGggMCBcCisJCS1zdGF0ZSBkaXNhYmxlZCBcCisJCS13cmFwIG5vbmUgXAorCQktaGVpZ2h0IDQwIFwKKwkJLXdpZHRoIDQgXAorCQktZm9udCBmb250X2RpZmYKKwkkd19hc2ltIHRhZyBjb25mIGF1dGhvcl9hYmJyIC1qdXN0aWZ5IHJpZ2h0CisJJHdfYXNpbSB0YWcgY29uZiBjdXJyX2NvbW1pdAorCSR3X2FzaW0gdGFnIGNvbmYgcHJpb3JfY29tbWl0IC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCisJJHdfYXNpbSB0YWcgYmluZCBwcmlvcl9jb21taXQgXAorCQk8QnV0dG9uLTE+IFwKKwkJIltjYiBfbG9hZF9jb21taXQgJHdfYXNpbSBAYXNpbV9kYXRhIEAleCwleV07YnJlYWsiCisKKwlzZXQgd19maWxlICR3LmZpbGVfcGFuZS5vdXQuZmlsZV90CisJdGV4dCAkd19maWxlIFwKKwkJLXRha2Vmb2N1cyAwIFwKKwkJLWhpZ2hsaWdodHRoaWNrbmVzcyAwIFwKKwkJLXBhZHggMCAtcGFkeSAwIFwKKwkJLWJhY2tncm91bmQgd2hpdGUgXAorCQktZm9yZWdyb3VuZCBibGFjayBcCisJCS1ib3JkZXJ3aWR0aCAwIFwKKwkJLXN0YXRlIGRpc2FibGVkIFwKKwkJLXdyYXAgbm9uZSBcCisJCS1oZWlnaHQgNDAgXAorCQktd2lkdGggODAgXAorCQkteHNjcm9sbGNvbW1hbmQgW2xpc3QgJHcuZmlsZV9wYW5lLm91dC5zYnggc2V0XSBcCisJCS1mb250IGZvbnRfZGlmZgorCisJc2V0IHdfY29sdW1ucyBbbGlzdCAkd19hbW92ICR3X2FzaW0gJHdfbGluZSAkd19maWxlXQorCisJc2Nyb2xsYmFyICR3LmZpbGVfcGFuZS5vdXQuc2J4IFwKKwkJLW9yaWVudCBoIFwKKwkJLWNvbW1hbmQgW2xpc3QgJHdfZmlsZSB4dmlld10KKwlzY3JvbGxiYXIgJHcuZmlsZV9wYW5lLm91dC5zYnkgXAorCQktb3JpZW50IHYgXAorCQktY29tbWFuZCBbbGlzdCBzY3JvbGxiYXIybWFueSAkd19jb2x1bW5zIHl2aWV3XQorCWV2YWwgZ3JpZCAkd19jb2x1bW5zICR3LmZpbGVfcGFuZS5vdXQuc2J5IC1zdGlja3kgbnNldworCWdyaWQgY29uZiBcCisJCSR3LmZpbGVfcGFuZS5vdXQuc2J4IFwKKwkJLWNvbHVtbiBbZXhwciB7W2xsZW5ndGggJHdfY29sdW1uc10gLSAxfV0gXAorCQktc3RpY2t5IHdlCisJZ3JpZCBjb2x1bW5jb25maWd1cmUgXAorCQkkdy5maWxlX3BhbmUub3V0IFwKKwkJW2V4cHIge1tsbGVuZ3RoICR3X2NvbHVtbnNdIC0gMX1dIFwKKwkJLXdlaWdodCAxCisJZ3JpZCByb3djb25maWd1cmUgJHcuZmlsZV9wYW5lLm91dCAwIC13ZWlnaHQgMQorCisJc2V0IHdfY3ZpZXdlciAkdy5maWxlX3BhbmUuY20udAorCXRleHQgJHdfY3ZpZXdlciBcCisJCS1iYWNrZ3JvdW5kIHdoaXRlIFwKKwkJLWZvcmVncm91bmQgYmxhY2sgXAorCQktYm9yZGVyd2lkdGggMCBcCisJCS1zdGF0ZSBkaXNhYmxlZCBcCisJCS13cmFwIG5vbmUgXAorCQktaGVpZ2h0IDEwIFwKKwkJLXdpZHRoIDgwIFwKKwkJLXhzY3JvbGxjb21tYW5kIFtsaXN0ICR3LmZpbGVfcGFuZS5jbS5zYnggc2V0XSBcCisJCS15c2Nyb2xsY29tbWFuZCBbbGlzdCAkdy5maWxlX3BhbmUuY20uc2J5IHNldF0gXAorCQktZm9udCBmb250X2RpZmYKKwkkd19jdmlld2VyIHRhZyBjb25mIHN0aWxsX2xvYWRpbmcgXAorCQktZm9udCBmb250X3VpaXRhbGljIFwKKwkJLWp1c3RpZnkgY2VudGVyCisJJHdfY3ZpZXdlciB0YWcgY29uZiBoZWFkZXJfa2V5IFwKKwkJLXRhYnMgezNjfSBcCisJCS1iYWNrZ3JvdW5kICRhY3RpdmVfY29sb3IgXAorCQktZm9udCBmb250X3VpYm9sZAorCSR3X2N2aWV3ZXIgdGFnIGNvbmYgaGVhZGVyX3ZhbCBcCisJCS1iYWNrZ3JvdW5kICRhY3RpdmVfY29sb3IgXAorCQktZm9udCBmb250X3VpCisJJHdfY3ZpZXdlciB0YWcgcmFpc2Ugc2VsCisJc2Nyb2xsYmFyICR3LmZpbGVfcGFuZS5jbS5zYnggXAorCQktb3JpZW50IGggXAorCQktY29tbWFuZCBbbGlzdCAkd19jdmlld2VyIHh2aWV3XQorCXNjcm9sbGJhciAkdy5maWxlX3BhbmUuY20uc2J5IFwKKwkJLW9yaWVudCB2IFwKKwkJLWNvbW1hbmQgW2xpc3QgJHdfY3ZpZXdlciB5dmlld10KKwlwYWNrICR3LmZpbGVfcGFuZS5jbS5zYnkgLXNpZGUgcmlnaHQgLWZpbGwgeQorCXBhY2sgJHcuZmlsZV9wYW5lLmNtLnNieCAtc2lkZSBib3R0b20gLWZpbGwgeAorCXBhY2sgJHdfY3ZpZXdlciAtZXhwYW5kIDEgLWZpbGwgYm90aAorCisJc2V0IHN0YXR1cyBbOjpzdGF0dXNfYmFyOjpuZXcgJHcuc3RhdHVzXQorCisJbWVudSAkdy5jdHhtIC10ZWFyb2ZmIDAKKwkkdy5jdHhtIGFkZCBjb21tYW5kIFwKKwkJLWxhYmVsIFttYyAiQ29weSBDb21taXQiXSBcCisJCS1jb21tYW5kIFtjYiBfY29weWNvbW1pdF0KKworCWZvcmVhY2ggaSAkd19jb2x1bW5zIHsKKwkJZm9yIHtzZXQgZyAwfSB7JGcgPCBbbGxlbmd0aCAkZ3JvdXBfY29sb3JzXX0ge2luY3IgZ30geworCQkJJGkgdGFnIGNvbmYgY29sb3IkZyAtYmFja2dyb3VuZCBbbGluZGV4ICRncm91cF9jb2xvcnMgJGddCisJCX0KKworCQkkaSBjb25mIC1jdXJzb3IgJGN1cnNvcl9wdHIKKwkJJGkgY29uZiAteXNjcm9sbGNvbW1hbmQgW2xpc3QgbWFueTJzY3JvbGxiYXIgXAorCQkJJHdfY29sdW1ucyB5dmlldyAkdy5maWxlX3BhbmUub3V0LnNieV0KKwkJYmluZCAkaSA8QnV0dG9uLTE+ICIKKwkJCVtjYiBfaGlkZV90b29sdGlwXQorCQkJW2NiIF9jbGljayAkaSBAJXgsJXldCisJCQlmb2N1cyAkaQorCQkiCisJCWJpbmQgJGkgPEFueS1Nb3Rpb24+ICBbY2IgX3Nob3dfdG9vbHRpcCAkaSBAJXgsJXldCisJCWJpbmQgJGkgPEFueS1FbnRlcj4gICBbY2IgX2hpZGVfdG9vbHRpcF0KKwkJYmluZCAkaSA8QW55LUxlYXZlPiAgIFtjYiBfaGlkZV90b29sdGlwXQorCQliaW5kX2J1dHRvbjMgJGkgIgorCQkJW2NiIF9oaWRlX3Rvb2x0aXBdCisJCQlzZXQgY3Vyc29yWCAleAorCQkJc2V0IGN1cnNvclkgJXkKKwkJCXNldCBjdXJzb3JXICVXCisJCQl0a19wb3B1cCAkdy5jdHhtICVYICVZCisJCSIKKwkJYmluZCAkaSA8U2hpZnQtVGFiPiAiW2xpc3QgZm9jdXMgJHdfY3ZpZXdlcl07YnJlYWsiCisJCWJpbmQgJGkgPFRhYj4gICAgICAgIltsaXN0IGZvY3VzICR3X2N2aWV3ZXJdO2JyZWFrIgorCX0KKworCWZvcmVhY2ggaSBbY29uY2F0ICR3X2NvbHVtbnMgJHdfY3ZpZXdlcl0geworCQliaW5kICRpIDxLZXktVXA+ICAgICAgICB7Y2F0Y2ggeyVXIHl2aWV3IHNjcm9sbCAtMSB1bml0c307YnJlYWt9CisJCWJpbmQgJGkgPEtleS1Eb3duPiAgICAgIHtjYXRjaCB7JVcgeXZpZXcgc2Nyb2xsICAxIHVuaXRzfTticmVha30KKwkJYmluZCAkaSA8S2V5LUxlZnQ+ICAgICAge2NhdGNoIHslVyB4dmlldyBzY3JvbGwgLTEgdW5pdHN9O2JyZWFrfQorCQliaW5kICRpIDxLZXktUmlnaHQ+ICAgICB7Y2F0Y2ggeyVXIHh2aWV3IHNjcm9sbCAgMSB1bml0c307YnJlYWt9CisJCWJpbmQgJGkgPEtleS1rPiAgICAgICAgIHtjYXRjaCB7JVcgeXZpZXcgc2Nyb2xsIC0xIHVuaXRzfTticmVha30KKwkJYmluZCAkaSA8S2V5LWo+ICAgICAgICAge2NhdGNoIHslVyB5dmlldyBzY3JvbGwgIDEgdW5pdHN9O2JyZWFrfQorCQliaW5kICRpIDxLZXktaD4gICAgICAgICB7Y2F0Y2ggeyVXIHh2aWV3IHNjcm9sbCAtMSB1bml0c307YnJlYWt9CisJCWJpbmQgJGkgPEtleS1sPiAgICAgICAgIHtjYXRjaCB7JVcgeHZpZXcgc2Nyb2xsICAxIHVuaXRzfTticmVha30KKwkJYmluZCAkaSA8Q29udHJvbC1LZXktYj4ge2NhdGNoIHslVyB5dmlldyBzY3JvbGwgLTEgcGFnZXN9O2JyZWFrfQorCQliaW5kICRpIDxDb250cm9sLUtleS1mPiB7Y2F0Y2ggeyVXIHl2aWV3IHNjcm9sbCAgMSBwYWdlc307YnJlYWt9CisJfQorCisJYmluZCAkd19jdmlld2VyIDxTaGlmdC1UYWI+ICJbbGlzdCBmb2N1cyAkd19maWxlXTticmVhayIKKwliaW5kICR3X2N2aWV3ZXIgPFRhYj4gICAgICAgIltsaXN0IGZvY3VzICR3X2ZpbGVdO2JyZWFrIgorCWJpbmQgJHdfY3ZpZXdlciA8QnV0dG9uLTE+IFtsaXN0IGZvY3VzICR3X2N2aWV3ZXJdCisJYmluZCAkd19maWxlICAgIDxWaXNpYmlsaXR5PiBbbGlzdCBmb2N1cyAkd19maWxlXQorCisJZ3JpZCBjb25maWd1cmUgJHcuaGVhZGVyIC1zdGlja3kgZXcKKwlncmlkIGNvbmZpZ3VyZSAkdy5maWxlX3BhbmUgLXN0aWNreSBuc2V3CisJZ3JpZCBjb25maWd1cmUgJHcuc3RhdHVzIC1zdGlja3kgZXcKKwlncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wIDAgLXdlaWdodCAxCisJZ3JpZCByb3djb25maWd1cmUgJHRvcCAwIC13ZWlnaHQgMAorCWdyaWQgcm93Y29uZmlndXJlICR0b3AgMSAtd2VpZ2h0IDEKKwlncmlkIHJvd2NvbmZpZ3VyZSAkdG9wIDIgLXdlaWdodCAwCisKKwlzZXQgcmVxX3cgW3dpbmZvIHJlcXdpZHRoICAkdG9wXQorCXNldCByZXFfaCBbd2luZm8gcmVxaGVpZ2h0ICR0b3BdCisJc2V0IHNjcl9oIFtleHByIHtbd2luZm8gc2NyZWVuaGVpZ2h0ICR0b3BdIC0gMTAwfV0KKwlpZiB7JHJlcV93IDwgNjAwfSB7c2V0IHJlcV93IDYwMH0KKwlpZiB7JHJlcV9oIDwgJHNjcl9ofSB7c2V0IHJlcV9oICRzY3JfaH0KKwlzZXQgZyAiJHtyZXFfd314JHtyZXFfaH0iCisJd20gZ2VvbWV0cnkgJHRvcCAkZworCXVwZGF0ZQorCisJc2V0IG9sZF9oZWlnaHQgW3dpbmZvIGhlaWdodCAkdy5maWxlX3BhbmVdCisJJHcuZmlsZV9wYW5lIHNhc2ggcGxhY2UgMCBcCisJCVtsaW5kZXggWyR3LmZpbGVfcGFuZSBzYXNoIGNvb3JkIDBdIDBdIFwKKwkJW2V4cHIge2ludCgkb2xkX2hlaWdodCAqIDAuNzApfV0KKwliaW5kICR3LmZpbGVfcGFuZSA8Q29uZmlndXJlPiBcCisJImlmIHt7JHcuZmlsZV9wYW5lfSBlcSB7JVd9fSB7W2NiIF9yZXNpemUgJWhdfSIKKworCV9sb2FkICR0aGlzIHt9Cit9CisKK21ldGhvZCBfbG9hZCB7anVtcH0geworCXZhcmlhYmxlIGdyb3VwX2NvbG9ycworCisJX2hpZGVfdG9vbHRpcCAkdGhpcworCisJaWYgeyR0b3RhbF9saW5lcyAhPSAwIHx8ICRjdXJyZW50X2ZkIG5lIHt9fSB7CisJCWlmIHskY3VycmVudF9mZCBuZSB7fX0geworCQkJY2F0Y2gge2Nsb3NlICRjdXJyZW50X2ZkfQorCQkJc2V0IGN1cnJlbnRfZmQge30KKwkJfQorCisJCWZvcmVhY2ggaSAkd19jb2x1bW5zIHsKKwkJCSRpIGNvbmYgLXN0YXRlIG5vcm1hbAorCQkJJGkgZGVsZXRlIDAuMCBlbmQKKwkJCWZvcmVhY2ggZyBbJGkgdGFnIG5hbWVzXSB7CisJCQkJaWYge1tyZWdleHAge15nWzAtOWEtZl17NDB9JH0gJGddfSB7CisJCQkJCSRpIHRhZyBkZWxldGUgJGcKKwkJCQl9CisJCQl9CisJCQkkaSBjb25mIC1zdGF0ZSBkaXNhYmxlZAorCQl9CisKKwkJJHdfY3ZpZXdlciBjb25mIC1zdGF0ZSBub3JtYWwKKwkJJHdfY3ZpZXdlciBkZWxldGUgMC4wIGVuZAorCQkkd19jdmlld2VyIGNvbmYgLXN0YXRlIGRpc2FibGVkCisKKwkJc2V0IGhpZ2hsaWdodF9saW5lIC0xCisJCXNldCBoaWdobGlnaHRfY29sdW1uIHt9CisJCXNldCBoaWdobGlnaHRfY29tbWl0IHt9CisJCXNldCB0b3RhbF9saW5lcyAwCisJfQorCisJaWYgeyRoaXN0b3J5IGVxIHt9fSB7CisJCSR3X2JhY2sgY29uZiAtc3RhdGUgZGlzYWJsZWQKKwl9IGVsc2UgeworCQkkd19iYWNrIGNvbmYgLXN0YXRlIG5vcm1hbAorCX0KKworCSMgSW5kZXggMCBpcyBhbHdheXMgZW1wdHkuICBUaGVyZSBpcyBuZXZlciBsaW5lIDAgYXMKKwkjIHdlIHVzZSBvbmx5IDEgYmFzZWQgbGluZXMsIGFzIHRoYXQgbWF0Y2hlcyBib3RoIHdpdGgKKwkjIGdpdC1ibGFtZSBvdXRwdXQgYW5kIHdpdGggVGsncyB0ZXh0IHdpZGdldC4KKwkjCisJc2V0IGFtb3ZfZGF0YSBbbGlzdCBbbGlzdF1dCisJc2V0IGFzaW1fZGF0YSBbbGlzdCBbbGlzdF1dCisKKwkkc3RhdHVzIHNob3cgW21jICJSZWFkaW5nICVzLi4uIiAiJGNvbW1pdDpbZXNjYXBlX3BhdGggJHBhdGhdIl0KKwkkd19wYXRoIGNvbmYgLXRleHQgW2VzY2FwZV9wYXRoICRwYXRoXQorCWlmIHskY29tbWl0IGVxIHt9fSB7CisJCXNldCBmZCBbb3BlbiAkcGF0aCByXQorCQlmY29uZmlndXJlICRmZCAtZW9mY2hhciB7fQorCX0gZWxzZSB7CisJCXNldCBmZCBbZ2l0X3JlYWQgY2F0LWZpbGUgYmxvYiAiJGNvbW1pdDokcGF0aCJdCisJfQorCWZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBsZiAtZW5jb2RpbmcgYmluYXJ5CisJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbY2IgX3JlYWRfZmlsZSAkZmQgJGp1bXBdCisJc2V0IGN1cnJlbnRfZmQgJGZkCit9CisKK21ldGhvZCBfaGlzdG9yeV9tZW51IHt9IHsKKwlzZXQgbSAkdy5iYWNrbWVudQorCWlmIHtbd2luZm8gZXhpc3RzICRtXX0geworCQkkbSBkZWxldGUgMCBlbmQKKwl9IGVsc2UgeworCQltZW51ICRtIC10ZWFyb2ZmIDAKKwl9CisKKwlmb3Ige3NldCBpIFtleHByIHtbbGxlbmd0aCAkaGlzdG9yeV0gLSAxfV0KKwkJfSB7JGkgPj0gMH0ge2luY3IgaSAtMX0geworCQlzZXQgZSBbbGluZGV4ICRoaXN0b3J5ICRpXQorCQlzZXQgYyBbbGluZGV4ICRlIDBdCisJCXNldCBmIFtsaW5kZXggJGUgMV0KKworCQlpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQwfSR9ICRjXX0geworCQkJc2V0IHQgW3N0cmluZyByYW5nZSAkYyAwIDhdLi4uCisJCX0gZWxzZWlmIHskYyBlcSB7fX0geworCQkJc2V0IHQge1dvcmtpbmcgRGlyZWN0b3J5fQorCQl9IGVsc2UgeworCQkJc2V0IHQgJGMKKwkJfQorCQlpZiB7IVtjYXRjaCB7c2V0IHN1bW1hcnkgJGhlYWRlcigkYyxzdW1tYXJ5KX1dfSB7CisJCQlhcHBlbmQgdCAiICRzdW1tYXJ5IgorCQkJaWYge1tzdHJpbmcgbGVuZ3RoICR0XSA+IDcwfSB7CisJCQkJc2V0IHQgW3N0cmluZyByYW5nZSAkdCAwIDY2XS4uLgorCQkJfQorCQl9CisKKwkJJG0gYWRkIGNvbW1hbmQgLWxhYmVsICR0IC1jb21tYW5kIFtjYiBfZ29iYWNrICRpXQorCX0KKwlzZXQgWCBbd2luZm8gcm9vdHggJHdfYmFja10KKwlzZXQgWSBbZXhwciB7W3dpbmZvIHJvb3R5ICR3X2JhY2tdICsgW3dpbmZvIGhlaWdodCAkd19iYWNrXX1dCisJdGtfcG9wdXAgJG0gJFggJFkKK30KKworbWV0aG9kIF9nb2JhY2sge2l9IHsKKwlzZXQgZGF0IFtsaW5kZXggJGhpc3RvcnkgJGldCisJc2V0IGhpc3RvcnkgW2xyYW5nZSAkaGlzdG9yeSAwIFtleHByIHskaSAtIDF9XV0KKwlzZXQgY29tbWl0IFtsaW5kZXggJGRhdCAwXQorCXNldCBwYXRoIFtsaW5kZXggJGRhdCAxXQorCV9sb2FkICR0aGlzIFtscmFuZ2UgJGRhdCAyIDVdCit9CisKK21ldGhvZCBfcmVhZF9maWxlIHtmZCBqdW1wfSB7CisJaWYgeyRmZCBuZSAkY3VycmVudF9mZH0geworCQljYXRjaCB7Y2xvc2UgJGZkfQorCQlyZXR1cm4KKwl9CisKKwlmb3JlYWNoIGkgJHdfY29sdW1ucyB7JGkgY29uZiAtc3RhdGUgbm9ybWFsfQorCXdoaWxlIHtbZ2V0cyAkZmQgbGluZV0gPj0gMH0geworCQlyZWdzdWIgIlxyXCQiICRsaW5lIHt9IGxpbmUKKwkJaW5jciB0b3RhbF9saW5lcworCQlsYXBwZW5kIGFtb3ZfZGF0YSB7fQorCQlsYXBwZW5kIGFzaW1fZGF0YSB7fQorCisJCWlmIHskdG90YWxfbGluZXMgPiAxfSB7CisJCQlmb3JlYWNoIGkgJHdfY29sdW1ucyB7JGkgaW5zZXJ0IGVuZCAiXG4ifQorCQl9CisKKwkJJHdfbGluZSBpbnNlcnQgZW5kICIkdG90YWxfbGluZXMiIGxpbmVudW1iZXIKKwkJJHdfZmlsZSBpbnNlcnQgZW5kICIkbGluZSIKKwl9CisKKwlzZXQgbG5fd2MgW2V4cHIge1tzdHJpbmcgbGVuZ3RoICR0b3RhbF9saW5lc10gKyAyfV0KKwlpZiB7WyR3X2xpbmUgY2dldCAtd2lkdGhdIDwgJGxuX3djfSB7CisJCSR3X2xpbmUgY29uZiAtd2lkdGggJGxuX3djCisJfQorCisJZm9yZWFjaCBpICR3X2NvbHVtbnMgeyRpIGNvbmYgLXN0YXRlIGRpc2FibGVkfQorCisJaWYge1tlb2YgJGZkXX0geworCQljbG9zZSAkZmQKKworCQkjIElmIHdlIGRvbid0IGZvcmNlIFRrIHRvIHVwZGF0ZSB0aGUgd2lkZ2V0cyAqcmlnaHQgbm93KgorCQkjIG5vbmUgb2Ygb3VyIGp1bXAgY29tbWFuZHMgd2lsbCBjYXVzZSBhIGNoYW5nZSBpbiB0aGUgVUkuCisJCSMKKwkJdXBkYXRlCisKKwkJaWYge1tsbGVuZ3RoICRqdW1wXSA9PSAxfSB7CisJCQlzZXQgaGlnaGxpZ2h0X2xpbmUgW2xpbmRleCAkanVtcCAwXQorCQkJJHdfZmlsZSBzZWUgIiRoaWdobGlnaHRfbGluZS4wIgorCQl9IGVsc2VpZiB7W2xsZW5ndGggJGp1bXBdID09IDR9IHsKKwkJCXNldCBoaWdobGlnaHRfY29sdW1uIFtsaW5kZXggJGp1bXAgMF0KKwkJCXNldCBoaWdobGlnaHRfbGluZSBbbGluZGV4ICRqdW1wIDFdCisJCQkkd19maWxlIHh2aWV3IG1vdmV0byBbbGluZGV4ICRqdW1wIDJdCisJCQkkd19maWxlIHl2aWV3IG1vdmV0byBbbGluZGV4ICRqdW1wIDNdCisJCX0KKworCQlfZXhlY19ibGFtZSAkdGhpcyAkd19hc2ltIEBhc2ltX2RhdGEgXAorCQkJW2xpc3RdIFwKKwkJCVttYyAiTG9hZGluZyBjb3B5L21vdmUgdHJhY2tpbmcgYW5ub3RhdGlvbnMuLi4iXQorCX0KK30gaWZkZWxldGVkIHsgY2F0Y2gge2Nsb3NlICRmZH0gfQorCittZXRob2QgX2V4ZWNfYmxhbWUge2N1cl93IGN1cl9kIG9wdGlvbnMgY3VyX3N9IHsKKwlsYXBwZW5kIG9wdGlvbnMgLS1pbmNyZW1lbnRhbAorCWlmIHskY29tbWl0IGVxIHt9fSB7CisJCWxhcHBlbmQgb3B0aW9ucyAtLWNvbnRlbnRzICRwYXRoCisJfSBlbHNlIHsKKwkJbGFwcGVuZCBvcHRpb25zICRjb21taXQKKwl9CisJbGFwcGVuZCBvcHRpb25zIC0tICRwYXRoCisJc2V0IGZkIFtldmFsIGdpdF9yZWFkIC0tbmljZSBibGFtZSAkb3B0aW9uc10KKwlmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gbGYgLWVuY29kaW5nIGJpbmFyeQorCWZpbGVldmVudCAkZmQgcmVhZGFibGUgW2NiIF9yZWFkX2JsYW1lICRmZCAkY3VyX3cgJGN1cl9kXQorCXNldCBjdXJyZW50X2ZkICRmZAorCXNldCBibGFtZV9saW5lcyAwCisKKwkkc3RhdHVzIHN0YXJ0IFwKKwkJJGN1cl9zIFwKKwkJW21jICJsaW5lcyBhbm5vdGF0ZWQiXQorfQorCittZXRob2QgX3JlYWRfYmxhbWUge2ZkIGN1cl93IGN1cl9kfSB7CisJdXB2YXIgIzAgJGN1cl9kIGxpbmVfZGF0YQorCXZhcmlhYmxlIGdyb3VwX2NvbG9ycworCXZhcmlhYmxlIG9yaWdpbmFsX29wdGlvbnMKKworCWlmIHskZmQgbmUgJGN1cnJlbnRfZmR9IHsKKwkJY2F0Y2gge2Nsb3NlICRmZH0KKwkJcmV0dXJuCisJfQorCisJJGN1cl93IGNvbmYgLXN0YXRlIG5vcm1hbAorCXdoaWxlIHtbZ2V0cyAkZmQgbGluZV0gPj0gMH0geworCQlpZiB7W3JlZ2V4cCB7XihbYS16MC05XXs0MH0pIChcZCspIChcZCspIChcZCspJH0gJGxpbmUgbGluZSBcCisJCQljbWl0IG9yaWdpbmFsX2xpbmUgZmluYWxfbGluZSBsaW5lX2NvdW50XX0geworCQkJc2V0IHJfY29tbWl0ICAgICAkY21pdAorCQkJc2V0IHJfb3JpZ19saW5lICAkb3JpZ2luYWxfbGluZQorCQkJc2V0IHJfZmluYWxfbGluZSAkZmluYWxfbGluZQorCQkJc2V0IHJfbGluZV9jb3VudCAkbGluZV9jb3VudAorCQl9IGVsc2VpZiB7W3N0cmluZyBtYXRjaCB7ZmlsZW5hbWUgKn0gJGxpbmVdfSB7CisJCQlzZXQgZmlsZSBbc3RyaW5nIHJhbmdlICRsaW5lIDkgZW5kXQorCQkJc2V0IG4gICAgJHJfbGluZV9jb3VudAorCQkJc2V0IGxubyAgJHJfZmluYWxfbGluZQorCQkJc2V0IG9sbiAgJHJfb3JpZ19saW5lCisJCQlzZXQgY21pdCAkcl9jb21taXQKKworCQkJaWYge1tyZWdleHAge14wezQwfSR9ICRjbWl0XX0geworCQkJCXNldCBjb21taXRfYWJiciB3b3JrCisJCQkJc2V0IGNvbW1pdF90eXBlIGN1cnJfY29tbWl0CisJCQl9IGVsc2VpZiB7JGNtaXQgZXEgJGNvbW1pdH0geworCQkJCXNldCBjb21taXRfYWJiciB0aGlzCisJCQkJc2V0IGNvbW1pdF90eXBlIGN1cnJfY29tbWl0CisJCQl9IGVsc2UgeworCQkJCXNldCBjb21taXRfdHlwZSBwcmlvcl9jb21taXQKKwkJCQlzZXQgY29tbWl0X2FiYnIgW3N0cmluZyByYW5nZSAkY21pdCAwIDNdCisJCQl9CisKKwkJCXNldCBhdXRob3JfYWJiciB7fQorCQkJc2V0IGFfbmFtZSB7fQorCQkJY2F0Y2gge3NldCBhX25hbWUgJGhlYWRlcigkY21pdCxhdXRob3IpfQorCQkJd2hpbGUgeyRhX25hbWUgbmUge319IHsKKwkJCQlpZiB7JGF1dGhvcl9hYmJyIG5lIHt9CisJCQkJCSYmIFtzdHJpbmcgaW5kZXggJGFfbmFtZSAwXSBlcSB7J319IHsKKwkJCQkJcmVnc3ViIHteJ1teJ10rJ1xzK30gJGFfbmFtZSB7fSBhX25hbWUKKwkJCQl9CisJCQkJaWYgeyFbcmVnZXhwIHteKFtbOnVwcGVyOl1dKX0gJGFfbmFtZSBfYV19IGJyZWFrCisJCQkJYXBwZW5kIGF1dGhvcl9hYmJyICRfYQorCQkJCXVuc2V0IF9hCisJCQkJaWYgeyFbcmVnc3ViIFwKKwkJCQkJe15bWzp1cHBlcjpdXVteXHNdKlxzK30gXAorCQkJCQkkYV9uYW1lIHt9IGFfbmFtZSBdfSBicmVhaworCQkJfQorCQkJaWYgeyRhdXRob3JfYWJiciBlcSB7fX0geworCQkJCXNldCBhdXRob3JfYWJiciB7IHx9CisJCQl9IGVsc2UgeworCQkJCXNldCBhdXRob3JfYWJiciBbc3RyaW5nIHJhbmdlICRhdXRob3JfYWJiciAwIDNdCisJCQl9CisJCQl1bnNldCBhX25hbWUKKworCQkJc2V0IGZpcnN0X2xubyAkbG5vCisJCQl3aGlsZSB7CisJCQkgICAkZmlyc3RfbG5vID4gMQorCQkJJiYgJGNtaXQgZXEgW2xpbmRleCAkbGluZV9kYXRhIFtleHByIHskZmlyc3RfbG5vIC0gMX1dIDBdCisJCQkmJiAkZmlsZSBlcSBbbGluZGV4ICRsaW5lX2RhdGEgW2V4cHIgeyRmaXJzdF9sbm8gLSAxfV0gMV0KKwkJCX0geworCQkJCWluY3IgZmlyc3RfbG5vIC0xCisJCQl9CisKKwkJCXNldCBjb2xvciB7fQorCQkJaWYgeyRmaXJzdF9sbm8gPCAkbG5vfSB7CisJCQkJZm9yZWFjaCBnIFskd19maWxlIHRhZyBuYW1lcyAkZmlyc3RfbG5vLjBdIHsKKwkJCQkJaWYge1tyZWdleHAge15jb2xvclswLTldKyR9ICRnXX0geworCQkJCQkJc2V0IGNvbG9yICRnCisJCQkJCQlicmVhaworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlzZXQgaSBbbHNvcnQgW2NvbmNhdCBcCisJCQkJCVskd19maWxlIHRhZyBuYW1lcyAiW2V4cHIgeyRmaXJzdF9sbm8gLSAxfV0uMCJdIFwKKwkJCQkJWyR3X2ZpbGUgdGFnIG5hbWVzICJbZXhwciB7JGxubyArICRufV0uMCJdIFwKKwkJCQkJXV0KKwkJCQlmb3Ige3NldCBnIDB9IHskZyA8IFtsbGVuZ3RoICRncm91cF9jb2xvcnNdfSB7aW5jciBnfSB7CisJCQkJCWlmIHtbbHNlYXJjaCAtc29ydGVkIC1leGFjdCAkaSBjb2xvciRnXSA9PSAtMX0geworCQkJCQkJc2V0IGNvbG9yIGNvbG9yJGcKKwkJCQkJCWJyZWFrCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiB7JGNvbG9yIGVxIHt9fSB7CisJCQkJc2V0IGNvbG9yIGNvbG9yMAorCQkJfQorCisJCQl3aGlsZSB7JG4gPiAwfSB7CisJCQkJc2V0IGxub19lICIkbG5vLjAgbGluZWVuZCArIDFjIgorCQkJCWlmIHtbbGluZGV4ICRsaW5lX2RhdGEgJGxub10gbmUge319IHsKKwkJCQkJc2V0IGcgW2xpbmRleCAkbGluZV9kYXRhICRsbm8gMF0KKwkJCQkJZm9yZWFjaCBpICR3X2NvbHVtbnMgeworCQkJCQkJJGkgdGFnIHJlbW92ZSBnJGcgJGxuby4wICRsbm9fZQorCQkJCQl9CisJCQkJfQorCQkJCWxzZXQgbGluZV9kYXRhICRsbm8gW2xpc3QgJGNtaXQgJGZpbGUgJG9sbl0KKworCQkJCSRjdXJfdyBkZWxldGUgJGxuby4wICIkbG5vLjAgbGluZWVuZCIKKwkJCQlpZiB7JGxubyA9PSAkZmlyc3RfbG5vfSB7CisJCQkJCSRjdXJfdyBpbnNlcnQgJGxuby4wICRjb21taXRfYWJiciAkY29tbWl0X3R5cGUKKwkJCQl9IGVsc2VpZiB7JGxubyA9PSBbZXhwciB7JGZpcnN0X2xubyArIDF9XX0geworCQkJCQkkY3VyX3cgaW5zZXJ0ICRsbm8uMCAkYXV0aG9yX2FiYnIgYXV0aG9yX2FiYnIKKwkJCQl9IGVsc2UgeworCQkJCQkkY3VyX3cgaW5zZXJ0ICRsbm8uMCB7IHx9CisJCQkJfQorCisJCQkJZm9yZWFjaCBpICR3X2NvbHVtbnMgeworCQkJCQlpZiB7JGN1cl93IGVxICR3X2Ftb3Z9IHsKKwkJCQkJCWZvciB7c2V0IGcgMH0gXAorCQkJCQkJCXskZyA8IFtsbGVuZ3RoICRncm91cF9jb2xvcnNdfSBcCisJCQkJCQkJe2luY3IgZ30geworCQkJCQkJCSRpIHRhZyByZW1vdmUgY29sb3IkZyAkbG5vLjAgJGxub19lCisJCQkJCQl9CisJCQkJCQkkaSB0YWcgYWRkICRjb2xvciAkbG5vLjAgJGxub19lCisJCQkJCX0KKwkJCQkJJGkgdGFnIGFkZCBnJGNtaXQgJGxuby4wICRsbm9fZQorCQkJCX0KKworCQkJCWlmIHskaGlnaGxpZ2h0X2NvbHVtbiBlcSAkY3VyX3d9IHsKKwkJCQkJaWYgeyRoaWdobGlnaHRfbGluZSA9PSAtMQorCQkJCQkgJiYgW2xpbmRleCBbJHdfZmlsZSB5dmlld10gMF0gPT0gMH0geworCQkJCQkJJHdfZmlsZSBzZWUgJGxuby4wCisJCQkJCQlzZXQgaGlnaGxpZ2h0X2xpbmUgJGxubworCQkJCQl9CisJCQkJCWlmIHskaGlnaGxpZ2h0X2xpbmUgPT0gJGxub30geworCQkJCQkJX3Nob3djb21taXQgJHRoaXMgJGN1cl93ICRsbm8KKwkJCQkJfQorCQkJCX0KKworCQkJCWluY3IgbiAtMQorCQkJCWluY3IgbG5vCisJCQkJaW5jciBvbG4KKwkJCQlpbmNyIGJsYW1lX2xpbmVzCisJCQl9CisKKwkJCXdoaWxlIHsKKwkJCSAgICRjbWl0IGVxIFtsaW5kZXggJGxpbmVfZGF0YSAkbG5vIDBdCisJCQkmJiAkZmlsZSBlcSBbbGluZGV4ICRsaW5lX2RhdGEgJGxubyAxXQorCQkJfSB7CisJCQkJJGN1cl93IGRlbGV0ZSAkbG5vLjAgIiRsbm8uMCBsaW5lZW5kIgorCisJCQkJaWYgeyRsbm8gPT0gJGZpcnN0X2xub30geworCQkJCQkkY3VyX3cgaW5zZXJ0ICRsbm8uMCAkY29tbWl0X2FiYnIgJGNvbW1pdF90eXBlCisJCQkJfSBlbHNlaWYgeyRsbm8gPT0gW2V4cHIgeyRmaXJzdF9sbm8gKyAxfV19IHsKKwkJCQkJJGN1cl93IGluc2VydCAkbG5vLjAgJGF1dGhvcl9hYmJyIGF1dGhvcl9hYmJyCisJCQkJfSBlbHNlIHsKKwkJCQkJJGN1cl93IGluc2VydCAkbG5vLjAgeyB8fQorCQkJCX0KKworCQkJCWlmIHskY3VyX3cgZXEgJHdfYW1vdn0geworCQkJCQlmb3JlYWNoIGkgJHdfY29sdW1ucyB7CisJCQkJCQlmb3Ige3NldCBnIDB9IFwKKwkJCQkJCQl7JGcgPCBbbGxlbmd0aCAkZ3JvdXBfY29sb3JzXX0gXAorCQkJCQkJCXtpbmNyIGd9IHsKKwkJCQkJCQkkaSB0YWcgcmVtb3ZlIGNvbG9yJGcgJGxuby4wICRsbm9fZQorCQkJCQkJfQorCQkJCQkJJGkgdGFnIGFkZCAkY29sb3IgJGxuby4wICRsbm9fZQorCQkJCQl9CisJCQkJfQorCisJCQkJaW5jciBsbm8KKwkJCX0KKworCQl9IGVsc2VpZiB7W3JlZ2V4cCB7XihbYS16LV0rKSAoLiopJH0gJGxpbmUgbGluZSBrZXkgZGF0YV19IHsKKwkJCXNldCBoZWFkZXIoJHJfY29tbWl0LCRrZXkpICRkYXRhCisJCX0KKwl9CisJJGN1cl93IGNvbmYgLXN0YXRlIGRpc2FibGVkCisKKwlpZiB7W2VvZiAkZmRdfSB7CisJCWNsb3NlICRmZAorCQlpZiB7JGN1cl93IGVxICR3X2FzaW19IHsKKwkJCV9leGVjX2JsYW1lICR0aGlzICR3X2Ftb3YgQGFtb3ZfZGF0YSBcCisJCQkJJG9yaWdpbmFsX29wdGlvbnMgXAorCQkJCVttYyAiTG9hZGluZyBvcmlnaW5hbCBsb2NhdGlvbiBhbm5vdGF0aW9ucy4uLiJdCisJCX0gZWxzZSB7CisJCQlzZXQgY3VycmVudF9mZCB7fQorCQkJJHN0YXR1cyBzdG9wIFttYyAiQW5ub3RhdGlvbiBjb21wbGV0ZS4iXQorCQl9CisJfSBlbHNlIHsKKwkJJHN0YXR1cyB1cGRhdGUgJGJsYW1lX2xpbmVzICR0b3RhbF9saW5lcworCX0KK30gaWZkZWxldGVkIHsgY2F0Y2gge2Nsb3NlICRmZH0gfQorCittZXRob2QgX2NsaWNrIHtjdXJfdyBwb3N9IHsKKwlzZXQgbG5vIFtsaW5kZXggW3NwbGl0IFskY3VyX3cgaW5kZXggJHBvc10gLl0gMF0KKwlfc2hvd2NvbW1pdCAkdGhpcyAkY3VyX3cgJGxubworfQorCittZXRob2QgX2xvYWRfY29tbWl0IHtjdXJfdyBjdXJfZCBwb3N9IHsKKwl1cHZhciAjMCAkY3VyX2QgbGluZV9kYXRhCisJc2V0IGxubyBbbGluZGV4IFtzcGxpdCBbJGN1cl93IGluZGV4ICRwb3NdIC5dIDBdCisJc2V0IGRhdCBbbGluZGV4ICRsaW5lX2RhdGEgJGxub10KKwlpZiB7JGRhdCBuZSB7fX0geworCQlsYXBwZW5kIGhpc3RvcnkgW2xpc3QgXAorCQkJJGNvbW1pdCAkcGF0aCBcCisJCQkkaGlnaGxpZ2h0X2NvbHVtbiBcCisJCQkkaGlnaGxpZ2h0X2xpbmUgXAorCQkJW2xpbmRleCBbJHdfZmlsZSB4dmlld10gMF0gXAorCQkJW2xpbmRleCBbJHdfZmlsZSB5dmlld10gMF0gXAorCQkJXQorCQlzZXQgY29tbWl0IFtsaW5kZXggJGRhdCAwXQorCQlzZXQgcGF0aCAgIFtsaW5kZXggJGRhdCAxXQorCQlfbG9hZCAkdGhpcyBbbGlzdCBbbGluZGV4ICRkYXQgMl1dCisJfQorfQorCittZXRob2QgX3Nob3djb21taXQge2N1cl93IGxub30geworCWdsb2JhbCByZXBvX2NvbmZpZworCXZhcmlhYmxlIGFjdGl2ZV9jb2xvcgorCisJaWYgeyRoaWdobGlnaHRfY29tbWl0IG5lIHt9fSB7CisJCWZvcmVhY2ggaSAkd19jb2x1bW5zIHsKKwkJCSRpIHRhZyBjb25mIGckaGlnaGxpZ2h0X2NvbW1pdCAtYmFja2dyb3VuZCB7fQorCQkJJGkgdGFnIGxvd2VyIGckaGlnaGxpZ2h0X2NvbW1pdAorCQl9CisJfQorCisJaWYgeyRjdXJfdyBlcSAkd19hc2ltfSB7CisJCXNldCBkYXQgW2xpbmRleCAkYXNpbV9kYXRhICRsbm9dCisJCXNldCBoaWdobGlnaHRfY29sdW1uICR3X2FzaW0KKwl9IGVsc2UgeworCQlzZXQgZGF0IFtsaW5kZXggJGFtb3ZfZGF0YSAkbG5vXQorCQlzZXQgaGlnaGxpZ2h0X2NvbHVtbiAkd19hbW92CisJfQorCisJJHdfY3ZpZXdlciBjb25mIC1zdGF0ZSBub3JtYWwKKwkkd19jdmlld2VyIGRlbGV0ZSAwLjAgZW5kCisKKwlpZiB7JGRhdCBlcSB7fX0geworCQlzZXQgY21pdCB7fQorCQkkd19jdmlld2VyIGluc2VydCBlbmQgW21jICJMb2FkaW5nIGFubm90YXRpb24uLi4iXSBzdGlsbF9sb2FkaW5nCisJfSBlbHNlIHsKKwkJc2V0IGNtaXQgW2xpbmRleCAkZGF0IDBdCisJCXNldCBmaWxlIFtsaW5kZXggJGRhdCAxXQorCisJCWZvcmVhY2ggaSAkd19jb2x1bW5zIHsKKwkJCSRpIHRhZyBjb25mIGckY21pdCAtYmFja2dyb3VuZCAkYWN0aXZlX2NvbG9yCisJCQkkaSB0YWcgcmFpc2UgZyRjbWl0CisJCX0KKworCQlzZXQgYXV0aG9yX25hbWUge30KKwkJc2V0IGF1dGhvcl9lbWFpbCB7fQorCQlzZXQgYXV0aG9yX3RpbWUge30KKwkJY2F0Y2gge3NldCBhdXRob3JfbmFtZSAkaGVhZGVyKCRjbWl0LGF1dGhvcil9CisJCWNhdGNoIHtzZXQgYXV0aG9yX2VtYWlsICRoZWFkZXIoJGNtaXQsYXV0aG9yLW1haWwpfQorCQljYXRjaCB7c2V0IGF1dGhvcl90aW1lIFtmb3JtYXRfZGF0ZSAkaGVhZGVyKCRjbWl0LGF1dGhvci10aW1lKV19CisKKwkJc2V0IGNvbW1pdHRlcl9uYW1lIHt9CisJCXNldCBjb21taXR0ZXJfZW1haWwge30KKwkJc2V0IGNvbW1pdHRlcl90aW1lIHt9CisJCWNhdGNoIHtzZXQgY29tbWl0dGVyX25hbWUgJGhlYWRlcigkY21pdCxjb21taXR0ZXIpfQorCQljYXRjaCB7c2V0IGNvbW1pdHRlcl9lbWFpbCAkaGVhZGVyKCRjbWl0LGNvbW1pdHRlci1tYWlsKX0KKwkJY2F0Y2gge3NldCBjb21taXR0ZXJfdGltZSBbZm9ybWF0X2RhdGUgJGhlYWRlcigkY21pdCxjb21taXR0ZXItdGltZSldfQorCisJCWlmIHtbY2F0Y2gge3NldCBtc2cgJGhlYWRlcigkY21pdCxtZXNzYWdlKX1dfSB7CisJCQlzZXQgbXNnIHt9CisJCQljYXRjaCB7CisJCQkJc2V0IGZkIFtnaXRfcmVhZCBjYXQtZmlsZSBjb21taXQgJGNtaXRdCisJCQkJZmNvbmZpZ3VyZSAkZmQgLWVuY29kaW5nIGJpbmFyeSAtdHJhbnNsYXRpb24gbGYKKwkJCQlpZiB7W2NhdGNoIHtzZXQgZW5jICRyZXBvX2NvbmZpZyhpMThuLmNvbW1pdGVuY29kaW5nKX1dfSB7CisJCQkJCXNldCBlbmMgdXRmLTgKKwkJCQl9CisJCQkJd2hpbGUge1tnZXRzICRmZCBsaW5lXSA+IDB9IHsKKwkJCQkJaWYge1tzdHJpbmcgbWF0Y2gge2VuY29kaW5nICp9ICRsaW5lXX0geworCQkJCQkJc2V0IGVuYyBbc3RyaW5nIHRvbG93ZXIgW3N0cmluZyByYW5nZSAkbGluZSA5IGVuZF1dCisJCQkJCX0KKwkJCQl9CisJCQkJc2V0IG1zZyBbcmVhZCAkZmRdCisJCQkJY2xvc2UgJGZkCisKKwkJCQlzZXQgZW5jIFt0Y2xfZW5jb2RpbmcgJGVuY10KKwkJCQlpZiB7JGVuYyBuZSB7fX0geworCQkJCQlzZXQgbXNnIFtlbmNvZGluZyBjb252ZXJ0ZnJvbSAkZW5jICRtc2ddCisJCQkJCXNldCBhdXRob3JfbmFtZSBbZW5jb2RpbmcgY29udmVydGZyb20gJGVuYyAkYXV0aG9yX25hbWVdCisJCQkJCXNldCBjb21taXR0ZXJfbmFtZSBbZW5jb2RpbmcgY29udmVydGZyb20gJGVuYyAkY29tbWl0dGVyX25hbWVdCisJCQkJCXNldCBoZWFkZXIoJGNtaXQsYXV0aG9yKSAkYXV0aG9yX25hbWUKKwkJCQkJc2V0IGhlYWRlcigkY21pdCxjb21taXR0ZXIpICRjb21taXR0ZXJfbmFtZQorCQkJCQlzZXQgaGVhZGVyKCRjbWl0LHN1bW1hcnkpIFwKKwkJCQkJW2VuY29kaW5nIGNvbnZlcnRmcm9tICRlbmMgJGhlYWRlcigkY21pdCxzdW1tYXJ5KV0KKwkJCQl9CisJCQkJc2V0IG1zZyBbc3RyaW5nIHRyaW0gJG1zZ10KKwkJCX0KKwkJCXNldCBoZWFkZXIoJGNtaXQsbWVzc2FnZSkgJG1zZworCQl9CisKKwkJJHdfY3ZpZXdlciBpbnNlcnQgZW5kICJjb21taXQgJGNtaXRcbiIgaGVhZGVyX2tleQorCQkkd19jdmlld2VyIGluc2VydCBlbmQgW3N0cmNhdCBbbWMgIkF1dGhvcjoiXSAiXHQiXSBoZWFkZXJfa2V5CisJCSR3X2N2aWV3ZXIgaW5zZXJ0IGVuZCAiJGF1dGhvcl9uYW1lICRhdXRob3JfZW1haWwiIGhlYWRlcl92YWwKKwkJJHdfY3ZpZXdlciBpbnNlcnQgZW5kICIgICRhdXRob3JfdGltZVxuIiBoZWFkZXJfdmFsCisKKwkJJHdfY3ZpZXdlciBpbnNlcnQgZW5kIFtzdHJjYXQgW21jICJDb21taXR0ZXI6Il0gIlx0Il0gaGVhZGVyX2tleQorCQkkd19jdmlld2VyIGluc2VydCBlbmQgIiRjb21taXR0ZXJfbmFtZSAkY29tbWl0dGVyX2VtYWlsIiBoZWFkZXJfdmFsCisJCSR3X2N2aWV3ZXIgaW5zZXJ0IGVuZCAiICAkY29tbWl0dGVyX3RpbWVcbiIgaGVhZGVyX3ZhbAorCisJCWlmIHskZmlsZSBuZSAkcGF0aH0geworCQkJJHdfY3ZpZXdlciBpbnNlcnQgZW5kIFtzdHJjYXQgW21jICJPcmlnaW5hbCBGaWxlOiJdICJcdCJdIGhlYWRlcl9rZXkKKwkJCSR3X2N2aWV3ZXIgaW5zZXJ0IGVuZCAiW2VzY2FwZV9wYXRoICRmaWxlXVxuIiBoZWFkZXJfdmFsCisJCX0KKworCQkkd19jdmlld2VyIGluc2VydCBlbmQgIlxuJG1zZyIKKwl9CisJJHdfY3ZpZXdlciBjb25mIC1zdGF0ZSBkaXNhYmxlZAorCisJc2V0IGhpZ2hsaWdodF9saW5lICRsbm8KKwlzZXQgaGlnaGxpZ2h0X2NvbW1pdCAkY21pdAorCisJaWYge1tsc2VhcmNoIC1leGFjdCAkdG9vbHRpcF9jb21taXQgJGhpZ2hsaWdodF9jb21taXRdICE9IC0xfSB7CisJCV9oaWRlX3Rvb2x0aXAgJHRoaXMKKwl9Cit9CisKK21ldGhvZCBfY29weWNvbW1pdCB7fSB7CisJc2V0IHBvcyBAJDo6Y3Vyc29yWCwkOjpjdXJzb3JZCisJc2V0IGxubyBbbGluZGV4IFtzcGxpdCBbJDo6Y3Vyc29yVyBpbmRleCAkcG9zXSAuXSAwXQorCXNldCBkYXQgW2xpbmRleCAkYW1vdl9kYXRhICRsbm9dCisJaWYgeyRkYXQgbmUge319IHsKKwkJY2xpcGJvYXJkIGNsZWFyCisJCWNsaXBib2FyZCBhcHBlbmQgXAorCQkJLWZvcm1hdCBTVFJJTkcgXAorCQkJLXR5cGUgU1RSSU5HIFwKKwkJCS0tIFtsaW5kZXggJGRhdCAwXQorCX0KK30KKworbWV0aG9kIF9zaG93X3Rvb2x0aXAge2N1cl93IHBvc30geworCWlmIHskdG9vbHRpcF93bSBuZSB7fX0geworCQlfb3Blbl90b29sdGlwICR0aGlzICRjdXJfdworCX0gZWxzZWlmIHskdG9vbHRpcF90aW1lciBlcSB7fX0geworCQlzZXQgdG9vbHRpcF90aW1lciBbYWZ0ZXIgMTAwMCBbY2IgX29wZW5fdG9vbHRpcCAkY3VyX3ddXQorCX0KK30KKworbWV0aG9kIF9vcGVuX3Rvb2x0aXAge2N1cl93fSB7CisJc2V0IHRvb2x0aXBfdGltZXIge30KKwlzZXQgcG9zX3ggW3dpbmZvIHBvaW50ZXJ4ICRjdXJfd10KKwlzZXQgcG9zX3kgW3dpbmZvIHBvaW50ZXJ5ICRjdXJfd10KKwlpZiB7W3dpbmZvIGNvbnRhaW5pbmcgJHBvc194ICRwb3NfeV0gbmUgJGN1cl93fSB7CisJCV9oaWRlX3Rvb2x0aXAgJHRoaXMKKwkJcmV0dXJuCisJfQorCisJaWYgeyR0b29sdGlwX3dtIG5lICIkY3VyX3cudG9vbHRpcCJ9IHsKKwkJX2hpZGVfdG9vbHRpcCAkdGhpcworCisJCXNldCB0b29sdGlwX3dtIFt0b3BsZXZlbCAkY3VyX3cudG9vbHRpcCAtYm9yZGVyd2lkdGggMV0KKwkJd20gb3ZlcnJpZGVyZWRpcmVjdCAkdG9vbHRpcF93bSAxCisJCXdtIHRyYW5zaWVudCAkdG9vbHRpcF93bSBbd2luZm8gdG9wbGV2ZWwgJGN1cl93XQorCQlzZXQgdG9vbHRpcF90ICR0b29sdGlwX3dtLmxhYmVsCisJCXRleHQgJHRvb2x0aXBfdCBcCisJCQktdGFrZWZvY3VzIDAgXAorCQkJLWhpZ2hsaWdodHRoaWNrbmVzcyAwIFwKKwkJCS1yZWxpZWYgZmxhdCBcCisJCQktYm9yZGVyd2lkdGggMCBcCisJCQktd3JhcCBub25lIFwKKwkJCS1iYWNrZ3JvdW5kIGxpZ2h0eWVsbG93IFwKKwkJCS1mb3JlZ3JvdW5kIGJsYWNrCisJCSR0b29sdGlwX3QgdGFnIGNvbmYgc2VjdGlvbl9oZWFkZXIgLWZvbnQgZm9udF91aWJvbGQKKwkJcGFjayAkdG9vbHRpcF90CisJfSBlbHNlIHsKKwkJJHRvb2x0aXBfdCBjb25mIC1zdGF0ZSBub3JtYWwKKwkJJHRvb2x0aXBfdCBkZWxldGUgMC4wIGVuZAorCX0KKworCXNldCBwb3MgQFtqb2luIFtsaXN0IFwKKwkJW2V4cHIgeyRwb3NfeCAtIFt3aW5mbyByb290eCAkY3VyX3ddfV0gXAorCQlbZXhwciB7JHBvc195IC0gW3dpbmZvIHJvb3R5ICRjdXJfd119XV0gLF0KKwlzZXQgbG5vIFtsaW5kZXggW3NwbGl0IFskY3VyX3cgaW5kZXggJHBvc10gLl0gMF0KKwlpZiB7JGN1cl93IGVxICR3X2Ftb3Z9IHsKKwkJc2V0IGRhdCBbbGluZGV4ICRhbW92X2RhdGEgJGxub10KKwkJc2V0IG9yZyB7fQorCX0gZWxzZSB7CisJCXNldCBkYXQgW2xpbmRleCAkYXNpbV9kYXRhICRsbm9dCisJCXNldCBvcmcgW2xpbmRleCAkYW1vdl9kYXRhICRsbm9dCisJfQorCisJaWYgeyRkYXQgZXEge319IHsKKwkJX2hpZGVfdG9vbHRpcCAkdGhpcworCQlyZXR1cm4KKwl9CisKKwlzZXQgY21pdCBbbGluZGV4ICRkYXQgMF0KKwlzZXQgdG9vbHRpcF9jb21taXQgW2xpc3QgJGNtaXRdCisKKwlzZXQgYXV0aG9yX25hbWUge30KKwlzZXQgc3VtbWFyeSAgICAge30KKwlzZXQgYXV0aG9yX3RpbWUge30KKwljYXRjaCB7c2V0IGF1dGhvcl9uYW1lICRoZWFkZXIoJGNtaXQsYXV0aG9yKX0KKwljYXRjaCB7c2V0IHN1bW1hcnkgICAgICRoZWFkZXIoJGNtaXQsc3VtbWFyeSl9CisJY2F0Y2gge3NldCBhdXRob3JfdGltZSBbZm9ybWF0X2RhdGUgJGhlYWRlcigkY21pdCxhdXRob3ItdGltZSldfQorCisJJHRvb2x0aXBfdCBpbnNlcnQgZW5kICJjb21taXQgJGNtaXRcbiIKKwkkdG9vbHRpcF90IGluc2VydCBlbmQgIiRhdXRob3JfbmFtZSAgJGF1dGhvcl90aW1lXG4iCisJJHRvb2x0aXBfdCBpbnNlcnQgZW5kICIkc3VtbWFyeSIKKworCWlmIHskb3JnIG5lIHt9ICYmIFtsaW5kZXggJG9yZyAwXSBuZSAkY21pdH0geworCQlzZXQgc2F2ZSBbJHRvb2x0aXBfdCBnZXQgMC4wIGVuZF0KKwkJJHRvb2x0aXBfdCBkZWxldGUgMC4wIGVuZAorCisJCXNldCBjbWl0IFtsaW5kZXggJG9yZyAwXQorCQlzZXQgZmlsZSBbbGluZGV4ICRvcmcgMV0KKwkJbGFwcGVuZCB0b29sdGlwX2NvbW1pdCAkY21pdAorCisJCXNldCBhdXRob3JfbmFtZSB7fQorCQlzZXQgc3VtbWFyeSAgICAge30KKwkJc2V0IGF1dGhvcl90aW1lIHt9CisJCWNhdGNoIHtzZXQgYXV0aG9yX25hbWUgJGhlYWRlcigkY21pdCxhdXRob3IpfQorCQljYXRjaCB7c2V0IHN1bW1hcnkgICAgICRoZWFkZXIoJGNtaXQsc3VtbWFyeSl9CisJCWNhdGNoIHtzZXQgYXV0aG9yX3RpbWUgW2Zvcm1hdF9kYXRlICRoZWFkZXIoJGNtaXQsYXV0aG9yLXRpbWUpXX0KKworCQkkdG9vbHRpcF90IGluc2VydCBlbmQgW3N0cmNhdCBbbWMgIk9yaWdpbmFsbHkgQnk6Il0gIlxuIl0gc2VjdGlvbl9oZWFkZXIKKwkJJHRvb2x0aXBfdCBpbnNlcnQgZW5kICJjb21taXQgJGNtaXRcbiIKKwkJJHRvb2x0aXBfdCBpbnNlcnQgZW5kICIkYXV0aG9yX25hbWUgICRhdXRob3JfdGltZVxuIgorCQkkdG9vbHRpcF90IGluc2VydCBlbmQgIiRzdW1tYXJ5XG4iCisKKwkJaWYgeyRmaWxlIG5lICRwYXRofSB7CisJCQkkdG9vbHRpcF90IGluc2VydCBlbmQgW3N0cmNhdCBbbWMgIkluIEZpbGU6Il0gIiAiXSBzZWN0aW9uX2hlYWRlcgorCQkJJHRvb2x0aXBfdCBpbnNlcnQgZW5kICIkZmlsZVxuIgorCQl9CisKKwkJJHRvb2x0aXBfdCBpbnNlcnQgZW5kICJcbiIKKwkJJHRvb2x0aXBfdCBpbnNlcnQgZW5kIFtzdHJjYXQgW21jICJDb3BpZWQgT3IgTW92ZWQgSGVyZSBCeToiXSAiXG4iXSBzZWN0aW9uX2hlYWRlcgorCQkkdG9vbHRpcF90IGluc2VydCBlbmQgJHNhdmUKKwl9CisKKwkkdG9vbHRpcF90IGNvbmYgLXN0YXRlIGRpc2FibGVkCisJX3Bvc2l0aW9uX3Rvb2x0aXAgJHRoaXMKK30KKworbWV0aG9kIF9wb3NpdGlvbl90b29sdGlwIHt9IHsKKwlzZXQgbWF4X2ggW2xpbmRleCBbc3BsaXQgWyR0b29sdGlwX3QgaW5kZXggZW5kXSAuXSAwXQorCXNldCBtYXhfdyAwCisJZm9yIHtzZXQgaSAxfSB7JGkgPD0gJG1heF9ofSB7aW5jciBpfSB7CisJCXNldCBjIFtsaW5kZXggW3NwbGl0IFskdG9vbHRpcF90IGluZGV4ICIkaS4wIGxpbmVlbmQiXSAuXSAxXQorCQlpZiB7JGMgPiAkbWF4X3d9IHtzZXQgbWF4X3cgJGN9CisJfQorCSR0b29sdGlwX3QgY29uZiAtd2lkdGggJG1heF93IC1oZWlnaHQgJG1heF9oCisKKwlzZXQgcmVxX3cgW3dpbmZvIHJlcXdpZHRoICAkdG9vbHRpcF90XQorCXNldCByZXFfaCBbd2luZm8gcmVxaGVpZ2h0ICR0b29sdGlwX3RdCisJc2V0IHBvc194IFtleHByIHtbd2luZm8gcG9pbnRlcnggLl0gKyAgNX1dCisJc2V0IHBvc195IFtleHByIHtbd2luZm8gcG9pbnRlcnkgLl0gKyAxMH1dCisKKwlzZXQgZyAiJHtyZXFfd314JHtyZXFfaH0iCisJaWYgeyRwb3NfeCA+PSAwfSB7YXBwZW5kIGcgK30KKwlhcHBlbmQgZyAkcG9zX3gKKwlpZiB7JHBvc195ID49IDB9IHthcHBlbmQgZyArfQorCWFwcGVuZCBnICRwb3NfeQorCisJd20gZ2VvbWV0cnkgJHRvb2x0aXBfd20gJGcKKwlyYWlzZSAkdG9vbHRpcF93bQorfQorCittZXRob2QgX2hpZGVfdG9vbHRpcCB7fSB7CisJaWYgeyR0b29sdGlwX3dtIG5lIHt9fSB7CisJCWRlc3Ryb3kgJHRvb2x0aXBfd20KKwkJc2V0IHRvb2x0aXBfd20ge30KKwkJc2V0IHRvb2x0aXBfY29tbWl0IHt9CisJfQorCWlmIHskdG9vbHRpcF90aW1lciBuZSB7fX0geworCQlhZnRlciBjYW5jZWwgJHRvb2x0aXBfdGltZXIKKwkJc2V0IHRvb2x0aXBfdGltZXIge30KKwl9Cit9CisKK21ldGhvZCBfcmVzaXplIHtuZXdfaGVpZ2h0fSB7CisJc2V0IGRpZmYgW2V4cHIgeyRuZXdfaGVpZ2h0IC0gJG9sZF9oZWlnaHR9XQorCWlmIHskZGlmZiA9PSAwfSByZXR1cm4KKworCXNldCBteSBbZXhwciB7W3dpbmZvIGhlaWdodCAkdy5maWxlX3BhbmVdIC0gMjV9XQorCXNldCBvIFskdy5maWxlX3BhbmUgc2FzaCBjb29yZCAwXQorCXNldCBveCBbbGluZGV4ICRvIDBdCisJc2V0IG95IFtleHByIHtbbGluZGV4ICRvIDFdICsgJGRpZmZ9XQorCWlmIHskb3kgPCAwfSAgIHtzZXQgb3kgMH0KKwlpZiB7JG95ID4gJG15fSB7c2V0IG95ICRteX0KKwkkdy5maWxlX3BhbmUgc2FzaCBwbGFjZSAwICRveCAkb3kKKworCXNldCBvbGRfaGVpZ2h0ICRuZXdfaGVpZ2h0Cit9CisKK30KZGlmZiAtLWdpdCBhL2dpdC1ndWkvbGliL2JyYW5jaC50Y2wgYi9naXQtZ3VpL2xpYi9icmFuY2gudGNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3N2VlYjcKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtZ3VpL2xpYi9icmFuY2gudGNsCkBAIC0wLDAgKzEsMzggQEAKKyMgZ2l0LWd1aSBicmFuY2ggKGNyZWF0ZS9kZWxldGUpIHN1cHBvcnQKKyMgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IFNoYXduIFBlYXJjZQorCitwcm9jIGxvYWRfYWxsX2hlYWRzIHt9IHsKKwlnbG9iYWwgc29tZV9oZWFkc190cmFja2luZworCisJc2V0IHJoIHJlZnMvaGVhZHMKKwlzZXQgcmhfbGVuIFtleHByIHtbc3RyaW5nIGxlbmd0aCAkcmhdICsgMX1dCisJc2V0IGFsbF9oZWFkcyBbbGlzdF0KKwlzZXQgZmQgW2dpdF9yZWFkIGZvci1lYWNoLXJlZiAtLWZvcm1hdD0lKHJlZm5hbWUpICRyaF0KKwl3aGlsZSB7W2dldHMgJGZkIGxpbmVdID4gMH0geworCQlpZiB7ISRzb21lX2hlYWRzX3RyYWNraW5nIHx8ICFbaXNfdHJhY2tpbmdfYnJhbmNoICRsaW5lXX0geworCQkJbGFwcGVuZCBhbGxfaGVhZHMgW3N0cmluZyByYW5nZSAkbGluZSAkcmhfbGVuIGVuZF0KKwkJfQorCX0KKwljbG9zZSAkZmQKKworCXJldHVybiBbbHNvcnQgJGFsbF9oZWFkc10KK30KKworcHJvYyBsb2FkX2FsbF90YWdzIHt9IHsKKwlzZXQgYWxsX3RhZ3MgW2xpc3RdCisJc2V0IGZkIFtnaXRfcmVhZCBmb3ItZWFjaC1yZWYgXAorCQktLXNvcnQ9LXRhZ2dlcmRhdGUgXAorCQktLWZvcm1hdD0lKHJlZm5hbWUpIFwKKwkJcmVmcy90YWdzXQorCXdoaWxlIHtbZ2V0cyAkZmQgbGluZV0gPiAwfSB7CisJCWlmIHshW3JlZ3N1YiBecmVmcy90YWdzLyAkbGluZSB7fSBuYW1lXX0gY29udGludWUKKwkJbGFwcGVuZCBhbGxfdGFncyAkbmFtZQorCX0KKwljbG9zZSAkZmQKKwlyZXR1cm4gJGFsbF90YWdzCit9CisKK3Byb2MgcmFkaW9fc2VsZWN0b3Ige3Zhcm5hbWUgdmFsdWUgYXJnc30geworCXVwdmFyICMwICR2YXJuYW1lIHZhcgorCXNldCB2YXIgJHZhbHVlCit9CmRpZmYgLS1naXQgYS9naXQtZ3VpL2xpYi9icmFuY2hfY2hlY2tvdXQudGNsIGIvZ2l0LWd1aS9saWIvYnJhbmNoX2NoZWNrb3V0LnRjbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjAzNzAzCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9saWIvYnJhbmNoX2NoZWNrb3V0LnRjbApAQCAtMCwwICsxLDg5IEBACisjIGdpdC1ndWkgYnJhbmNoIGNoZWNrb3V0IHN1cHBvcnQKKyMgQ29weXJpZ2h0IChDKSAyMDA3IFNoYXduIFBlYXJjZQorCitjbGFzcyBicmFuY2hfY2hlY2tvdXQgeworCitmaWVsZCB3ICAgICAgICAgICAgICA7ICMgd2lkZ2V0IHBhdGgKK2ZpZWxkIHdfcmV2ICAgICAgICAgIDsgIyBtZWdhLXdpZGdldCB0byBwaWNrIHRoZSBpbml0aWFsIHJldmlzaW9uCisKK2ZpZWxkIG9wdF9mZXRjaCAgICAgMTsgIyByZWZldGNoIHRyYWNraW5nIGJyYW5jaCBpZiB1c2VkPworZmllbGQgb3B0X2RldGFjaCAgICAwOyAjIGZvcmNlIGEgZGV0YWNoZWQgaGVhZCBjYXNlPworCitjb25zdHJ1Y3RvciBkaWFsb2cge30geworCW1ha2VfdG9wbGV2ZWwgdG9wIHcKKwl3bSB0aXRsZSAkdG9wIFthcHBlbmQgIlthcHBuYW1lXSAoW3JlcG9uYW1lXSk6ICIgW21jICJDaGVja291dCBCcmFuY2giXV0KKwlpZiB7JHRvcCBuZSB7Ln19IHsKKwkJd20gZ2VvbWV0cnkgJHRvcCAiK1t3aW5mbyByb290eCAuXStbd2luZm8gcm9vdHkgLl0iCisJfQorCisJbGFiZWwgJHcuaGVhZGVyIC10ZXh0IFttYyAiQ2hlY2tvdXQgQnJhbmNoIl0gLWZvbnQgZm9udF91aWJvbGQKKwlwYWNrICR3LmhlYWRlciAtc2lkZSB0b3AgLWZpbGwgeAorCisJZnJhbWUgJHcuYnV0dG9ucworCWJ1dHRvbiAkdy5idXR0b25zLmNyZWF0ZSAtdGV4dCBbbWMgQ2hlY2tvdXRdIFwKKwkJLWRlZmF1bHQgYWN0aXZlIFwKKwkJLWNvbW1hbmQgW2NiIF9jaGVja291dF0KKwlwYWNrICR3LmJ1dHRvbnMuY3JlYXRlIC1zaWRlIHJpZ2h0CisJYnV0dG9uICR3LmJ1dHRvbnMuY2FuY2VsIC10ZXh0IFttYyBDYW5jZWxdIFwKKwkJLWNvbW1hbmQgW2xpc3QgZGVzdHJveSAkd10KKwlwYWNrICR3LmJ1dHRvbnMuY2FuY2VsIC1zaWRlIHJpZ2h0IC1wYWR4IDUKKwlwYWNrICR3LmJ1dHRvbnMgLXNpZGUgYm90dG9tIC1maWxsIHggLXBhZHkgMTAgLXBhZHggMTAKKworCXNldCB3X3JldiBbOjpjaG9vc2VfcmV2OjpuZXcgJHcucmV2IFttYyBSZXZpc2lvbl1dCisJJHdfcmV2IGJpbmRfbGlzdGJveCA8RG91YmxlLUJ1dHRvbi0xPiBbY2IgX2NoZWNrb3V0XQorCXBhY2sgJHcucmV2IC1hbmNob3IgbncgLWZpbGwgYm90aCAtZXhwYW5kIDEgLXBhZHkgNSAtcGFkeCA1CisKKwlsYWJlbGZyYW1lICR3Lm9wdGlvbnMgLXRleHQgW21jIE9wdGlvbnNdCisKKwljaGVja2J1dHRvbiAkdy5vcHRpb25zLmZldGNoIFwKKwkJLXRleHQgW21jICJGZXRjaCBUcmFja2luZyBCcmFuY2giXSBcCisJCS12YXJpYWJsZSBAb3B0X2ZldGNoCisJcGFjayAkdy5vcHRpb25zLmZldGNoIC1hbmNob3IgbncKKworCWNoZWNrYnV0dG9uICR3Lm9wdGlvbnMuZGV0YWNoIFwKKwkJLXRleHQgW21jICJEZXRhY2ggRnJvbSBMb2NhbCBCcmFuY2giXSBcCisJCS12YXJpYWJsZSBAb3B0X2RldGFjaAorCXBhY2sgJHcub3B0aW9ucy5kZXRhY2ggLWFuY2hvciBudworCisJcGFjayAkdy5vcHRpb25zIC1hbmNob3IgbncgLWZpbGwgeCAtcGFkeSA1IC1wYWR4IDUKKworCWJpbmQgJHcgPFZpc2liaWxpdHk+IFtjYiBfdmlzaWJsZV0KKwliaW5kICR3IDxLZXktRXNjYXBlPiBbbGlzdCBkZXN0cm95ICR3XQorCWJpbmQgJHcgPEtleS1SZXR1cm4+IFtjYiBfY2hlY2tvdXRdXDticmVhaworCXRrd2FpdCB3aW5kb3cgJHcKK30KKworbWV0aG9kIF9jaGVja291dCB7fSB7CisJc2V0IHNwZWMgWyR3X3JldiBnZXRfdHJhY2tpbmdfYnJhbmNoXQorCWlmIHskc3BlYyBuZSB7fSAmJiAkb3B0X2ZldGNofSB7CisJCXNldCBuZXcge30KKwl9IGVsc2VpZiB7W2NhdGNoIHtzZXQgbmV3IFskd19yZXYgY29tbWl0X29yX2RpZV19XX0geworCQlyZXR1cm4KKwl9CisKKwlpZiB7JG9wdF9kZXRhY2h9IHsKKwkJc2V0IHJlZiB7fQorCX0gZWxzZSB7CisJCXNldCByZWYgWyR3X3JldiBnZXRfbG9jYWxfYnJhbmNoXQorCX0KKworCXNldCBjbyBbOjpjaGVja291dF9vcDo6bmV3IFskd19yZXYgZ2V0XSAkbmV3ICRyZWZdCisJJGNvIHBhcmVudCAkdworCSRjbyBlbmFibGVfY2hlY2tvdXQgMQorCWlmIHskc3BlYyBuZSB7fSAmJiAkb3B0X2ZldGNofSB7CisJCSRjbyBlbmFibGVfZmV0Y2ggJHNwZWMKKwl9CisKKwlpZiB7WyRjbyBydW5dfSB7CisJCWRlc3Ryb3kgJHcKKwl9IGVsc2UgeworCQkkd19yZXYgZm9jdXNfZmlsdGVyCisJfQorfQorCittZXRob2QgX3Zpc2libGUge30geworCWdyYWIgJHcKKwkkd19yZXYgZm9jdXNfZmlsdGVyCit9CisKK30KZGlmZiAtLWdpdCBhL2dpdC1ndWkvbGliL2JyYW5jaF9jcmVhdGUudGNsIGIvZ2l0LWd1aS9saWIvYnJhbmNoX2NyZWF0ZS50Y2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNkZmI0YwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvbGliL2JyYW5jaF9jcmVhdGUudGNsCkBAIC0wLDAgKzEsMjIwIEBACisjIGdpdC1ndWkgYnJhbmNoIGNyZWF0ZSBzdXBwb3J0CisjIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBTaGF3biBQZWFyY2UKKworY2xhc3MgYnJhbmNoX2NyZWF0ZSB7CisKK2ZpZWxkIHcgICAgICAgICAgICAgIDsgIyB3aWRnZXQgcGF0aAorZmllbGQgd19yZXYgICAgICAgICAgOyAjIG1lZ2Etd2lkZ2V0IHRvIHBpY2sgdGhlIGluaXRpYWwgcmV2aXNpb24KK2ZpZWxkIHdfbmFtZSAgICAgICAgIDsgIyBuZXcgYnJhbmNoIG5hbWUgd2lkZ2V0CisKK2ZpZWxkIG5hbWUgICAgICAgICB7fTsgIyBuYW1lIG9mIHRoZSBicmFuY2ggdGhlIHVzZXIgaGFzIGNob3NlbgorZmllbGQgbmFtZV90eXBlICB1c2VyOyAjIHR5cGUgb2YgYnJhbmNoIG5hbWUgdG8gdXNlCisKK2ZpZWxkIG9wdF9tZXJnZSAgICBmZjsgIyB0eXBlIG9mIG1lcmdlIHRvIGFwcGx5IHRvIGV4aXN0aW5nIGJyYW5jaAorZmllbGQgb3B0X2NoZWNrb3V0ICAxOyAjIGF1dG9tYXRpY2FsbHkgY2hlY2tvdXQgdGhlIG5ldyBicmFuY2g/CitmaWVsZCBvcHRfZmV0Y2ggICAgIDE7ICMgcmVmZXRjaCB0cmFja2luZyBicmFuY2ggaWYgdXNlZD8KK2ZpZWxkIHJlc2V0X29rICAgICAgMDsgIyBkaWQgdGhlIHVzZXIgYWdyZWUgdG8gcmVzZXQ/CisKK2NvbnN0cnVjdG9yIGRpYWxvZyB7fSB7CisJZ2xvYmFsIHJlcG9fY29uZmlnCisKKwltYWtlX3RvcGxldmVsIHRvcCB3CisJd20gdGl0bGUgJHRvcCBbYXBwZW5kICJbYXBwbmFtZV0gKFtyZXBvbmFtZV0pOiAiIFttYyAiQ3JlYXRlIEJyYW5jaCJdXQorCWlmIHskdG9wIG5lIHsufX0geworCQl3bSBnZW9tZXRyeSAkdG9wICIrW3dpbmZvIHJvb3R4IC5dK1t3aW5mbyByb290eSAuXSIKKwl9CisKKwlsYWJlbCAkdy5oZWFkZXIgLXRleHQgW21jICJDcmVhdGUgTmV3IEJyYW5jaCJdIC1mb250IGZvbnRfdWlib2xkCisJcGFjayAkdy5oZWFkZXIgLXNpZGUgdG9wIC1maWxsIHgKKworCWZyYW1lICR3LmJ1dHRvbnMKKwlidXR0b24gJHcuYnV0dG9ucy5jcmVhdGUgLXRleHQgW21jIENyZWF0ZV0gXAorCQktZGVmYXVsdCBhY3RpdmUgXAorCQktY29tbWFuZCBbY2IgX2NyZWF0ZV0KKwlwYWNrICR3LmJ1dHRvbnMuY3JlYXRlIC1zaWRlIHJpZ2h0CisJYnV0dG9uICR3LmJ1dHRvbnMuY2FuY2VsIC10ZXh0IFttYyBDYW5jZWxdIFwKKwkJLWNvbW1hbmQgW2xpc3QgZGVzdHJveSAkd10KKwlwYWNrICR3LmJ1dHRvbnMuY2FuY2VsIC1zaWRlIHJpZ2h0IC1wYWR4IDUKKwlwYWNrICR3LmJ1dHRvbnMgLXNpZGUgYm90dG9tIC1maWxsIHggLXBhZHkgMTAgLXBhZHggMTAKKworCWxhYmVsZnJhbWUgJHcuZGVzYyAtdGV4dCBbbWMgIkJyYW5jaCBOYW1lIl0KKwlyYWRpb2J1dHRvbiAkdy5kZXNjLm5hbWVfciBcCisJCS1hbmNob3IgdyBcCisJCS10ZXh0IFttYyAiTmFtZToiXSBcCisJCS12YWx1ZSB1c2VyIFwKKwkJLXZhcmlhYmxlIEBuYW1lX3R5cGUKKwlzZXQgd19uYW1lICR3LmRlc2MubmFtZV90CisJZW50cnkgJHdfbmFtZSBcCisJCS1ib3JkZXJ3aWR0aCAxIFwKKwkJLXJlbGllZiBzdW5rZW4gXAorCQktd2lkdGggNDAgXAorCQktdGV4dHZhcmlhYmxlIEBuYW1lIFwKKwkJLXZhbGlkYXRlIGtleSBcCisJCS12YWxpZGF0ZWNvbW1hbmQgW2NiIF92YWxpZGF0ZSAlZCAlU10KKwlncmlkICR3LmRlc2MubmFtZV9yICR3X25hbWUgLXN0aWNreSB3ZSAtcGFkeCB7MCA1fQorCisJcmFkaW9idXR0b24gJHcuZGVzYy5tYXRjaF9yIFwKKwkJLWFuY2hvciB3IFwKKwkJLXRleHQgW21jICJNYXRjaCBUcmFja2luZyBCcmFuY2ggTmFtZSJdIFwKKwkJLXZhbHVlIG1hdGNoIFwKKwkJLXZhcmlhYmxlIEBuYW1lX3R5cGUKKwlncmlkICR3LmRlc2MubWF0Y2hfciAtc3RpY2t5IHdlIC1wYWR4IHswIDV9IC1jb2x1bW5zcGFuIDIKKworCWdyaWQgY29sdW1uY29uZmlndXJlICR3LmRlc2MgMSAtd2VpZ2h0IDEKKwlwYWNrICR3LmRlc2MgLWFuY2hvciBudyAtZmlsbCB4IC1wYWR5IDUgLXBhZHggNQorCisJc2V0IHdfcmV2IFs6OmNob29zZV9yZXY6Om5ldyAkdy5yZXYgW21jICJTdGFydGluZyBSZXZpc2lvbiJdXQorCXBhY2sgJHcucmV2IC1hbmNob3IgbncgLWZpbGwgYm90aCAtZXhwYW5kIDEgLXBhZHkgNSAtcGFkeCA1CisKKwlsYWJlbGZyYW1lICR3Lm9wdGlvbnMgLXRleHQgW21jIE9wdGlvbnNdCisKKwlmcmFtZSAkdy5vcHRpb25zLm1lcmdlCisJbGFiZWwgJHcub3B0aW9ucy5tZXJnZS5sIC10ZXh0IFttYyAiVXBkYXRlIEV4aXN0aW5nIEJyYW5jaDoiXQorCXBhY2sgJHcub3B0aW9ucy5tZXJnZS5sIC1zaWRlIGxlZnQKKwlyYWRpb2J1dHRvbiAkdy5vcHRpb25zLm1lcmdlLm5vIFwKKwkJLXRleHQgW21jIE5vXSBcCisJCS12YWx1ZSBub25lIFwKKwkJLXZhcmlhYmxlIEBvcHRfbWVyZ2UKKwlwYWNrICR3Lm9wdGlvbnMubWVyZ2Uubm8gLXNpZGUgbGVmdAorCXJhZGlvYnV0dG9uICR3Lm9wdGlvbnMubWVyZ2UuZmYgXAorCQktdGV4dCBbbWMgIkZhc3QgRm9yd2FyZCBPbmx5Il0gXAorCQktdmFsdWUgZmYgXAorCQktdmFyaWFibGUgQG9wdF9tZXJnZQorCXBhY2sgJHcub3B0aW9ucy5tZXJnZS5mZiAtc2lkZSBsZWZ0CisJcmFkaW9idXR0b24gJHcub3B0aW9ucy5tZXJnZS5yZXNldCBcCisJCS10ZXh0IFttYyBSZXNldF0gXAorCQktdmFsdWUgcmVzZXQgXAorCQktdmFyaWFibGUgQG9wdF9tZXJnZQorCXBhY2sgJHcub3B0aW9ucy5tZXJnZS5yZXNldCAtc2lkZSBsZWZ0CisJcGFjayAkdy5vcHRpb25zLm1lcmdlIC1hbmNob3IgbncKKworCWNoZWNrYnV0dG9uICR3Lm9wdGlvbnMuZmV0Y2ggXAorCQktdGV4dCBbbWMgIkZldGNoIFRyYWNraW5nIEJyYW5jaCJdIFwKKwkJLXZhcmlhYmxlIEBvcHRfZmV0Y2gKKwlwYWNrICR3Lm9wdGlvbnMuZmV0Y2ggLWFuY2hvciBudworCisJY2hlY2tidXR0b24gJHcub3B0aW9ucy5jaGVja291dCBcCisJCS10ZXh0IFttYyAiQ2hlY2tvdXQgQWZ0ZXIgQ3JlYXRpb24iXSBcCisJCS12YXJpYWJsZSBAb3B0X2NoZWNrb3V0CisJcGFjayAkdy5vcHRpb25zLmNoZWNrb3V0IC1hbmNob3IgbncKKwlwYWNrICR3Lm9wdGlvbnMgLWFuY2hvciBudyAtZmlsbCB4IC1wYWR5IDUgLXBhZHggNQorCisJdHJhY2UgYWRkIHZhcmlhYmxlIEBuYW1lX3R5cGUgd3JpdGUgW2NiIF9zZWxlY3RdCisKKwlzZXQgbmFtZSAkcmVwb19jb25maWcoZ3VpLm5ld2JyYW5jaHRlbXBsYXRlKQorCWlmIHtbaXNfY29uZmlnX3RydWUgZ3VpLm1hdGNodHJhY2tpbmdicmFuY2hdfSB7CisJCXNldCBuYW1lX3R5cGUgbWF0Y2gKKwl9CisKKwliaW5kICR3IDxWaXNpYmlsaXR5PiBbY2IgX3Zpc2libGVdCisJYmluZCAkdyA8S2V5LUVzY2FwZT4gW2xpc3QgZGVzdHJveSAkd10KKwliaW5kICR3IDxLZXktUmV0dXJuPiBbY2IgX2NyZWF0ZV1cO2JyZWFrCisJdGt3YWl0IHdpbmRvdyAkdworfQorCittZXRob2QgX2NyZWF0ZSB7fSB7CisJZ2xvYmFsIHJlcG9fY29uZmlnCisJZ2xvYmFsIE0xQgorCisJc2V0IHNwZWMgWyR3X3JldiBnZXRfdHJhY2tpbmdfYnJhbmNoXQorCXN3aXRjaCAtLSAkbmFtZV90eXBlIHsKKwl1c2VyIHsKKwkJc2V0IG5ld2JyYW5jaCAkbmFtZQorCX0KKwltYXRjaCB7CisJCWlmIHskc3BlYyBlcSB7fX0geworCQkJdGtfbWVzc2FnZUJveCBcCisJCQkJLWljb24gZXJyb3IgXAorCQkJCS10eXBlIG9rIFwKKwkJCQktdGl0bGUgW3dtIHRpdGxlICR3XSBcCisJCQkJLXBhcmVudCAkdyBcCisJCQkJLW1lc3NhZ2UgW21jICJQbGVhc2Ugc2VsZWN0IGEgdHJhY2tpbmcgYnJhbmNoLiJdCisJCQlyZXR1cm4KKwkJfQorCQlpZiB7IVtyZWdzdWIgXnJlZnMvaGVhZHMvIFtsaW5kZXggJHNwZWMgMl0ge30gbmV3YnJhbmNoXX0geworCQkJdGtfbWVzc2FnZUJveCBcCisJCQkJLWljb24gZXJyb3IgXAorCQkJCS10eXBlIG9rIFwKKwkJCQktdGl0bGUgW3dtIHRpdGxlICR3XSBcCisJCQkJLXBhcmVudCAkdyBcCisJCQkJLW1lc3NhZ2UgW21jICJUcmFja2luZyBicmFuY2ggJXMgaXMgbm90IGEgYnJhbmNoIGluIHRoZSByZW1vdGUgcmVwb3NpdG9yeS4iIFskdyBnZXRdXQorCQkJcmV0dXJuCisJCX0KKwl9CisJfQorCisJaWYgeyRuZXdicmFuY2ggZXEge30KKwkJfHwgJG5ld2JyYW5jaCBlcSAkcmVwb19jb25maWcoZ3VpLm5ld2JyYW5jaHRlbXBsYXRlKX0geworCQl0a19tZXNzYWdlQm94IFwKKwkJCS1pY29uIGVycm9yIFwKKwkJCS10eXBlIG9rIFwKKwkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKKwkJCS1wYXJlbnQgJHcgXAorCQkJLW1lc3NhZ2UgW21jICJQbGVhc2Ugc3VwcGx5IGEgYnJhbmNoIG5hbWUuIl0KKwkJZm9jdXMgJHdfbmFtZQorCQlyZXR1cm4KKwl9CisKKwlpZiB7W2NhdGNoIHtnaXQgY2hlY2stcmVmLWZvcm1hdCAiaGVhZHMvJG5ld2JyYW5jaCJ9XX0geworCQl0a19tZXNzYWdlQm94IFwKKwkJCS1pY29uIGVycm9yIFwKKwkJCS10eXBlIG9rIFwKKwkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKKwkJCS1wYXJlbnQgJHcgXAorCQkJLW1lc3NhZ2UgW21jICInJXMnIGlzIG5vdCBhbiBhY2NlcHRhYmxlIGJyYW5jaCBuYW1lLiIgJG5ld2JyYW5jaF0KKwkJZm9jdXMgJHdfbmFtZQorCQlyZXR1cm4KKwl9CisKKwlpZiB7JHNwZWMgbmUge30gJiYgJG9wdF9mZXRjaH0geworCQlzZXQgbmV3IHt9CisJfSBlbHNlaWYge1tjYXRjaCB7c2V0IG5ldyBbJHdfcmV2IGNvbW1pdF9vcl9kaWVdfV19IHsKKwkJcmV0dXJuCisJfQorCisJc2V0IGNvIFs6OmNoZWNrb3V0X29wOjpuZXcgXAorCQlbJHdfcmV2IGdldF0gXAorCQkkbmV3IFwKKwkJcmVmcy9oZWFkcy8kbmV3YnJhbmNoXQorCSRjbyBwYXJlbnQgJHcKKwkkY28gZW5hYmxlX2NyZWF0ZSAgIDEKKwkkY28gZW5hYmxlX21lcmdlICAgICRvcHRfbWVyZ2UKKwkkY28gZW5hYmxlX2NoZWNrb3V0ICRvcHRfY2hlY2tvdXQKKwlpZiB7JHNwZWMgbmUge30gJiYgJG9wdF9mZXRjaH0geworCQkkY28gZW5hYmxlX2ZldGNoICRzcGVjCisJfQorCisJaWYge1skY28gcnVuXX0geworCQlkZXN0cm95ICR3CisJfSBlbHNlIHsKKwkJZm9jdXMgJHdfbmFtZQorCX0KK30KKworbWV0aG9kIF92YWxpZGF0ZSB7ZCBTfSB7CisJaWYgeyRkID09IDF9IHsKKwkJaWYge1tyZWdleHAge1t+Xjo/KlxbXDAtIF19ICRTXX0geworCQkJcmV0dXJuIDAKKwkJfQorCQlpZiB7W3N0cmluZyBsZW5ndGggJFNdID4gMH0geworCQkJc2V0IG5hbWVfdHlwZSB1c2VyCisJCX0KKwl9CisJcmV0dXJuIDEKK30KKworbWV0aG9kIF9zZWxlY3Qge2FyZ3N9IHsKKwlpZiB7JG5hbWVfdHlwZSBlcSB7bWF0Y2h9fSB7CisJCSR3X3JldiBwaWNrX3RyYWNraW5nX2JyYW5jaAorCX0KK30KKworbWV0aG9kIF92aXNpYmxlIHt9IHsKKwlncmFiICR3CisJaWYgeyRuYW1lX3R5cGUgZXEge3VzZXJ9fSB7CisJCSR3X25hbWUgaWN1cnNvciBlbmQKKwkJZm9jdXMgJHdfbmFtZQorCX0KK30KKworfQpkaWZmIC0tZ2l0IGEvZ2l0LWd1aS9saWIvYnJhbmNoX2RlbGV0ZS50Y2wgYi9naXQtZ3VpL2xpYi9icmFuY2hfZGVsZXRlLnRjbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmM0ZjczCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9saWIvYnJhbmNoX2RlbGV0ZS50Y2wKQEAgLTAsMCArMSwxNDcgQEAKKyMgZ2l0LWd1aSBicmFuY2ggZGVsZXRlIHN1cHBvcnQKKyMgQ29weXJpZ2h0IChDKSAyMDA3IFNoYXduIFBlYXJjZQorCitjbGFzcyBicmFuY2hfZGVsZXRlIHsKKworZmllbGQgdyAgICAgICAgICAgICAgIDsgIyB3aWRnZXQgcGF0aAorZmllbGQgd19oZWFkcyAgICAgICAgIDsgIyBsaXN0Ym94IG9mIGxvY2FsIGhlYWQgbmFtZXMKK2ZpZWxkIHdfY2hlY2sgICAgICAgICA7ICMgcmV2aXNpb24gcGlja2VyIGZvciBtZXJnZSB0ZXN0CitmaWVsZCB3X2RlbGV0ZSAgICAgICAgOyAjIGRlbGV0ZSBidXR0b24KKworY29uc3RydWN0b3IgZGlhbG9nIHt9IHsKKwlnbG9iYWwgY3VycmVudF9icmFuY2gKKworCW1ha2VfdG9wbGV2ZWwgdG9wIHcKKwl3bSB0aXRsZSAkdG9wIFthcHBlbmQgIlthcHBuYW1lXSAoW3JlcG9uYW1lXSk6ICIgW21jICJEZWxldGUgQnJhbmNoIl1dCisJaWYgeyR0b3AgbmUgey59fSB7CisJCXdtIGdlb21ldHJ5ICR0b3AgIitbd2luZm8gcm9vdHggLl0rW3dpbmZvIHJvb3R5IC5dIgorCX0KKworCWxhYmVsICR3LmhlYWRlciAtdGV4dCBbbWMgIkRlbGV0ZSBMb2NhbCBCcmFuY2giXSAtZm9udCBmb250X3VpYm9sZAorCXBhY2sgJHcuaGVhZGVyIC1zaWRlIHRvcCAtZmlsbCB4CisKKwlmcmFtZSAkdy5idXR0b25zCisJc2V0IHdfZGVsZXRlICR3LmJ1dHRvbnMuZGVsZXRlCisJYnV0dG9uICR3X2RlbGV0ZSBcCisJCS10ZXh0IFttYyBEZWxldGVdIFwKKwkJLWRlZmF1bHQgYWN0aXZlIFwKKwkJLXN0YXRlIGRpc2FibGVkIFwKKwkJLWNvbW1hbmQgW2NiIF9kZWxldGVdCisJcGFjayAkd19kZWxldGUgLXNpZGUgcmlnaHQKKwlidXR0b24gJHcuYnV0dG9ucy5jYW5jZWwgXAorCQktdGV4dCBbbWMgQ2FuY2VsXSBcCisJCS1jb21tYW5kIFtsaXN0IGRlc3Ryb3kgJHddCisJcGFjayAkdy5idXR0b25zLmNhbmNlbCAtc2lkZSByaWdodCAtcGFkeCA1CisJcGFjayAkdy5idXR0b25zIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDEwIC1wYWR4IDEwCisKKwlsYWJlbGZyYW1lICR3Lmxpc3QgLXRleHQgW21jICJMb2NhbCBCcmFuY2hlcyJdCisJc2V0IHdfaGVhZHMgJHcubGlzdC5sCisJbGlzdGJveCAkd19oZWFkcyBcCisJCS1oZWlnaHQgMTAgXAorCQktd2lkdGggNzAgXAorCQktc2VsZWN0bW9kZSBleHRlbmRlZCBcCisJCS1leHBvcnRzZWxlY3Rpb24gZmFsc2UgXAorCQkteXNjcm9sbGNvbW1hbmQgW2xpc3QgJHcubGlzdC5zYnkgc2V0XQorCXNjcm9sbGJhciAkdy5saXN0LnNieSAtY29tbWFuZCBbbGlzdCAkdy5saXN0LmwgeXZpZXddCisJcGFjayAkdy5saXN0LnNieSAtc2lkZSByaWdodCAtZmlsbCB5CisJcGFjayAkdy5saXN0LmwgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQorCXBhY2sgJHcubGlzdCAtZmlsbCBib3RoIC1leHBhbmQgMSAtcGFkeSA1IC1wYWR4IDUKKworCXNldCB3X2NoZWNrIFtjaG9vc2VfcmV2OjpuZXcgXAorCQkkdy5jaGVjayBcCisJCVttYyAiRGVsZXRlIE9ubHkgSWYgTWVyZ2VkIEludG8iXSBcCisJCV0KKwkkd19jaGVjayBub25lIFttYyAiQWx3YXlzIChEbyBub3QgcGVyZm9ybSBtZXJnZSB0ZXN0LikiXQorCXBhY2sgJHcuY2hlY2sgLWFuY2hvciBudyAtZmlsbCB4IC1wYWR5IDUgLXBhZHggNQorCisJZm9yZWFjaCBoIFtsb2FkX2FsbF9oZWFkc10geworCQlpZiB7JGggbmUgJGN1cnJlbnRfYnJhbmNofSB7CisJCQkkd19oZWFkcyBpbnNlcnQgZW5kICRoCisJCX0KKwl9CisKKwliaW5kICR3X2hlYWRzIDw8TGlzdGJveFNlbGVjdD4+IFtjYiBfc2VsZWN0XQorCWJpbmQgJHcgPFZpc2liaWxpdHk+ICIKKwkJZ3JhYiAkdworCQlmb2N1cyAkdworCSIKKwliaW5kICR3IDxLZXktRXNjYXBlPiBbbGlzdCBkZXN0cm95ICR3XQorCWJpbmQgJHcgPEtleS1SZXR1cm4+IFtjYiBfZGVsZXRlXVw7YnJlYWsKKwl0a3dhaXQgd2luZG93ICR3Cit9CisKK21ldGhvZCBfc2VsZWN0IHt9IHsKKwlpZiB7WyR3X2hlYWRzIGN1cnNlbGVjdGlvbl0gZXEge319IHsKKwkJJHdfZGVsZXRlIGNvbmZpZ3VyZSAtc3RhdGUgZGlzYWJsZWQKKwl9IGVsc2UgeworCQkkd19kZWxldGUgY29uZmlndXJlIC1zdGF0ZSBub3JtYWwKKwl9Cit9CisKK21ldGhvZCBfZGVsZXRlIHt9IHsKKwlpZiB7W2NhdGNoIHtzZXQgY2hlY2tfY210IFskd19jaGVjayBjb21taXRfb3JfZGllXX1dfSB7CisJCXJldHVybgorCX0KKworCXNldCB0b19kZWxldGUgW2xpc3RdCisJc2V0IG5vdF9tZXJnZWQgW2xpc3RdCisJZm9yZWFjaCBpIFskd19oZWFkcyBjdXJzZWxlY3Rpb25dIHsKKwkJc2V0IGIgWyR3X2hlYWRzIGdldCAkaV0KKwkJaWYge1tjYXRjaCB7CisJCQlzZXQgbyBbZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAicmVmcy9oZWFkcy8kYiJdCisJCX1dfSBjb250aW51ZQorCQlpZiB7JGNoZWNrX2NtdCBuZSB7fX0geworCQkJaWYge1tjYXRjaCB7c2V0IG0gW2dpdCBtZXJnZS1iYXNlICRvICRjaGVja19jbXRdfV19IGNvbnRpbnVlCisJCQlpZiB7JG8gbmUgJG19IHsKKwkJCQlsYXBwZW5kIG5vdF9tZXJnZWQgJGIKKwkJCQljb250aW51ZQorCQkJfQorCQl9CisJCWxhcHBlbmQgdG9fZGVsZXRlIFtsaXN0ICRiICRvXQorCX0KKwlpZiB7JG5vdF9tZXJnZWQgbmUge319IHsKKwkJc2V0IG1zZyAiW21jICJUaGUgZm9sbG93aW5nIGJyYW5jaGVzIGFyZSBub3QgY29tcGxldGVseSBtZXJnZWQgaW50byAlczoiIFskd19jaGVjayBnZXRdXQorCisgLSBbam9pbiAkbm90X21lcmdlZCAiXG4gLSAiXSIKKwkJdGtfbWVzc2FnZUJveCBcCisJCQktaWNvbiBpbmZvIFwKKwkJCS10eXBlIG9rIFwKKwkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKKwkJCS1wYXJlbnQgJHcgXAorCQkJLW1lc3NhZ2UgJG1zZworCX0KKwlpZiB7JHRvX2RlbGV0ZSBlcSB7fX0gcmV0dXJuCisJaWYgeyRjaGVja19jbXQgZXEge319IHsKKwkJc2V0IG1zZyBbbWMgIlJlY292ZXJpbmcgZGVsZXRlZCBicmFuY2hlcyBpcyBkaWZmaWN1bHQuIFxuXG4gRGVsZXRlIHRoZSBzZWxlY3RlZCBicmFuY2hlcz8iXQorCQlpZiB7W3RrX21lc3NhZ2VCb3ggXAorCQkJLWljb24gd2FybmluZyBcCisJCQktdHlwZSB5ZXNubyBcCisJCQktdGl0bGUgW3dtIHRpdGxlICR3XSBcCisJCQktcGFyZW50ICR3IFwKKwkJCS1tZXNzYWdlICRtc2ddIG5lIHllc30geworCQkJcmV0dXJuCisJCX0KKwl9CisKKwlzZXQgZmFpbGVkIHt9CisJZm9yZWFjaCBpICR0b19kZWxldGUgeworCQlzZXQgYiBbbGluZGV4ICRpIDBdCisJCXNldCBvIFtsaW5kZXggJGkgMV0KKwkJaWYge1tjYXRjaCB7Z2l0IHVwZGF0ZS1yZWYgLWQgInJlZnMvaGVhZHMvJGIiICRvfSBlcnJdfSB7CisJCQlhcHBlbmQgZmFpbGVkICIgLSAkYjogJGVyclxuIgorCQl9CisJfQorCisJaWYgeyRmYWlsZWQgbmUge319IHsKKwkJdGtfbWVzc2FnZUJveCBcCisJCQktaWNvbiBlcnJvciBcCisJCQktdHlwZSBvayBcCisJCQktdGl0bGUgW3dtIHRpdGxlICR3XSBcCisJCQktcGFyZW50ICR3IFwKKwkJCS1tZXNzYWdlIFttYyAiRmFpbGVkIHRvIGRlbGV0ZSBicmFuY2hlczpcbiVzIiAkZmFpbGVkXQorCX0KKworCWRlc3Ryb3kgJHcKK30KKworfQpkaWZmIC0tZ2l0IGEvZ2l0LWd1aS9saWIvYnJhbmNoX3JlbmFtZS50Y2wgYi9naXQtZ3VpL2xpYi9icmFuY2hfcmVuYW1lLnRjbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjY1Mzg4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9saWIvYnJhbmNoX3JlbmFtZS50Y2wKQEAgLTAsMCArMSwxMjggQEAKKyMgZ2l0LWd1aSBicmFuY2ggcmVuYW1lIHN1cHBvcnQKKyMgQ29weXJpZ2h0IChDKSAyMDA3IFNoYXduIFBlYXJjZQorCitjbGFzcyBicmFuY2hfcmVuYW1lIHsKKworZmllbGQgdworZmllbGQgb2xkbmFtZQorZmllbGQgbmV3bmFtZQorCitjb25zdHJ1Y3RvciBkaWFsb2cge30geworCWdsb2JhbCBjdXJyZW50X2JyYW5jaAorCisJbWFrZV90b3BsZXZlbCB0b3AgdworCXdtIHRpdGxlICR0b3AgW2FwcGVuZCAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogIiBbbWMgIlJlbmFtZSBCcmFuY2giXV0KKwlpZiB7JHRvcCBuZSB7Ln19IHsKKwkJd20gZ2VvbWV0cnkgJHRvcCAiK1t3aW5mbyByb290eCAuXStbd2luZm8gcm9vdHkgLl0iCisJfQorCisJc2V0IG9sZG5hbWUgJGN1cnJlbnRfYnJhbmNoCisJc2V0IG5ld25hbWUgW2dldF9jb25maWcgZ3VpLm5ld2JyYW5jaHRlbXBsYXRlXQorCisJbGFiZWwgJHcuaGVhZGVyIC10ZXh0IFttYyAiUmVuYW1lIEJyYW5jaCJdIC1mb250IGZvbnRfdWlib2xkCisJcGFjayAkdy5oZWFkZXIgLXNpZGUgdG9wIC1maWxsIHgKKworCWZyYW1lICR3LmJ1dHRvbnMKKwlidXR0b24gJHcuYnV0dG9ucy5yZW5hbWUgLXRleHQgW21jIFJlbmFtZV0gXAorCQktZGVmYXVsdCBhY3RpdmUgXAorCQktY29tbWFuZCBbY2IgX3JlbmFtZV0KKwlwYWNrICR3LmJ1dHRvbnMucmVuYW1lIC1zaWRlIHJpZ2h0CisJYnV0dG9uICR3LmJ1dHRvbnMuY2FuY2VsIC10ZXh0IFttYyBDYW5jZWxdIFwKKwkJLWNvbW1hbmQgW2xpc3QgZGVzdHJveSAkd10KKwlwYWNrICR3LmJ1dHRvbnMuY2FuY2VsIC1zaWRlIHJpZ2h0IC1wYWR4IDUKKwlwYWNrICR3LmJ1dHRvbnMgLXNpZGUgYm90dG9tIC1maWxsIHggLXBhZHkgMTAgLXBhZHggMTAKKworCWZyYW1lICR3LnJlbmFtZQorCWxhYmVsICR3LnJlbmFtZS5vbGRuYW1lX2wgLXRleHQgW21jICJCcmFuY2g6Il0KKwlldmFsIHRrX29wdGlvbk1lbnUgJHcucmVuYW1lLm9sZG5hbWVfbSBAb2xkbmFtZSBbbG9hZF9hbGxfaGVhZHNdCisKKwlsYWJlbCAkdy5yZW5hbWUubmV3bmFtZV9sIC10ZXh0IFttYyAiTmV3IE5hbWU6Il0KKwllbnRyeSAkdy5yZW5hbWUubmV3bmFtZV90IFwKKwkJLWJvcmRlcndpZHRoIDEgXAorCQktcmVsaWVmIHN1bmtlbiBcCisJCS13aWR0aCA0MCBcCisJCS10ZXh0dmFyaWFibGUgQG5ld25hbWUgXAorCQktdmFsaWRhdGUga2V5IFwKKwkJLXZhbGlkYXRlY29tbWFuZCB7CisJCQlpZiB7JWQgPT0gMSAmJiBbcmVnZXhwIHtbfl46PypcW1wwLSBdfSAlU119IHtyZXR1cm4gMH0KKwkJCXJldHVybiAxCisJCX0KKworCWdyaWQgJHcucmVuYW1lLm9sZG5hbWVfbCAkdy5yZW5hbWUub2xkbmFtZV9tIC1zdGlja3kgdyAgLXBhZHggezAgNX0KKwlncmlkICR3LnJlbmFtZS5uZXduYW1lX2wgJHcucmVuYW1lLm5ld25hbWVfdCAtc3RpY2t5IHdlIC1wYWR4IHswIDV9CisJZ3JpZCBjb2x1bW5jb25maWd1cmUgJHcucmVuYW1lIDEgLXdlaWdodCAxCisJcGFjayAkdy5yZW5hbWUgLWFuY2hvciBudyAtZmlsbCB4IC1wYWR5IDUgLXBhZHggNQorCisJYmluZCAkdyA8S2V5LVJldHVybj4gW2NiIF9yZW5hbWVdCisJYmluZCAkdyA8S2V5LUVzY2FwZT4gW2xpc3QgZGVzdHJveSAkd10KKwliaW5kICR3IDxWaXNpYmlsaXR5PiAiCisJCWdyYWIgJHcKKwkJJHcucmVuYW1lLm5ld25hbWVfdCBpY3Vyc29yIGVuZAorCQlmb2N1cyAkdy5yZW5hbWUubmV3bmFtZV90CisJIgorCXRrd2FpdCB3aW5kb3cgJHcKK30KKworbWV0aG9kIF9yZW5hbWUge30geworCWdsb2JhbCBjdXJyZW50X2JyYW5jaAorCisJaWYgeyRvbGRuYW1lIGVxIHt9fSB7CisJCXRrX21lc3NhZ2VCb3ggXAorCQkJLWljb24gZXJyb3IgXAorCQkJLXR5cGUgb2sgXAorCQkJLXRpdGxlIFt3bSB0aXRsZSAkd10gXAorCQkJLXBhcmVudCAkdyBcCisJCQktbWVzc2FnZSBbbWMgIlBsZWFzZSBzZWxlY3QgYSBicmFuY2ggdG8gcmVuYW1lLiJdCisJCWZvY3VzICR3LnJlbmFtZS5vbGRuYW1lX20KKwkJcmV0dXJuCisJfQorCWlmIHskbmV3bmFtZSBlcSB7fQorCQl8fCAkbmV3bmFtZSBlcSBbZ2V0X2NvbmZpZyBndWkubmV3YnJhbmNodGVtcGxhdGVdfSB7CisJCXRrX21lc3NhZ2VCb3ggXAorCQkJLWljb24gZXJyb3IgXAorCQkJLXR5cGUgb2sgXAorCQkJLXRpdGxlIFt3bSB0aXRsZSAkd10gXAorCQkJLXBhcmVudCAkdyBcCisJCQktbWVzc2FnZSBbbWMgIlBsZWFzZSBzdXBwbHkgYSBicmFuY2ggbmFtZS4iXQorCQlmb2N1cyAkdy5yZW5hbWUubmV3bmFtZV90CisJCXJldHVybgorCX0KKwlpZiB7IVtjYXRjaCB7Z2l0IHNob3ctcmVmIC0tdmVyaWZ5IC0tICJyZWZzL2hlYWRzLyRuZXduYW1lIn1dfSB7CisJCXRrX21lc3NhZ2VCb3ggXAorCQkJLWljb24gZXJyb3IgXAorCQkJLXR5cGUgb2sgXAorCQkJLXRpdGxlIFt3bSB0aXRsZSAkd10gXAorCQkJLXBhcmVudCAkdyBcCisJCQktbWVzc2FnZSBbbWMgIkJyYW5jaCAnJXMnIGFscmVhZHkgZXhpc3RzLiIgJG5ld25hbWVdCisJCWZvY3VzICR3LnJlbmFtZS5uZXduYW1lX3QKKwkJcmV0dXJuCisJfQorCWlmIHtbY2F0Y2gge2dpdCBjaGVjay1yZWYtZm9ybWF0ICJoZWFkcy8kbmV3bmFtZSJ9XX0geworCQl0a19tZXNzYWdlQm94IFwKKwkJCS1pY29uIGVycm9yIFwKKwkJCS10eXBlIG9rIFwKKwkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKKwkJCS1wYXJlbnQgJHcgXAorCQkJLW1lc3NhZ2UgW21jICInJXMnIGlzIG5vdCBhbiBhY2NlcHRhYmxlIGJyYW5jaCBuYW1lLiIgJG5ld25hbWVdCisJCWZvY3VzICR3LnJlbmFtZS5uZXduYW1lX3QKKwkJcmV0dXJuCisJfQorCisJaWYge1tjYXRjaCB7Z2l0IGJyYW5jaCAtbSAkb2xkbmFtZSAkbmV3bmFtZX0gZXJyXX0geworCQl0a19tZXNzYWdlQm94IFwKKwkJCS1pY29uIGVycm9yIFwKKwkJCS10eXBlIG9rIFwKKwkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKKwkJCS1wYXJlbnQgJHcgXAorCQkJLW1lc3NhZ2UgW3N0cmNhdCBbbWMgIkZhaWxlZCB0byByZW5hbWUgJyVzJy4iICRvbGRuYW1lXSAiXG5cbiRlcnIiXQorCQlyZXR1cm4KKwl9CisKKwlpZiB7JGN1cnJlbnRfYnJhbmNoIGVxICRvbGRuYW1lfSB7CisJCXNldCBjdXJyZW50X2JyYW5jaCAkbmV3bmFtZQorCX0KKworCWRlc3Ryb3kgJHcKK30KKworfQpkaWZmIC0tZ2l0IGEvZ2l0LWd1aS9saWIvYnJvd3Nlci50Y2wgYi9naXQtZ3VpL2xpYi9icm93c2VyLnRjbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjQ3MGQxCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9saWIvYnJvd3Nlci50Y2wKQEAgLTAsMCArMSwzMTEgQEAKKyMgZ2l0LWd1aSB0cmVlIGJyb3dzZXIKKyMgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IFNoYXduIFBlYXJjZQorCitjbGFzcyBicm93c2VyIHsKKworaW1hZ2UgY3JlYXRlIHBob3RvIDo6YnJvd3Nlcjo6aW1nX3BhcmVudCAgLWRhdGEge1IwbEdPRGxoRUFBUUFJVUFBUHdDQkJ4U0hCeE9ITVRTek56dTNLekN0QlJHSENTS0ZJekNqTHpTeEJRMkZBeEdIRHpDTEN5ZUhCUStGSFNtZkF3dUZCeEtMRFNDTk16aXpJU3lqSnpPbkRTeUxBdytGQVFTREFRZURCeFdKQXdtREFRT0JLeldyRHltTkFRYURBUU9EQXdhRER5S1RGU3lYRlRHVEV5NlRBUUNCQVFLREF3aUZCUXlIQXdTRkF3bUhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNINUJBRUFBQUFBTEFBQUFBQVFBQkFBQUFaMVFJQndTQ3dhajBoaVFDQklDcGNEUXNGZ0dBYUlndWhoaTBnb2hJc3JRRURZTWhpTnJSZmdlQVFDNWZNQ0FvbElEaEQyaEZJNVdDNFlSQmthQnhzT0UybC9SeHNISEE0ZEhta2ZSeUFiSVE0aUl5UWxCNU5GR0NBQUNpYWtwU1pFSnlpblRnQWNLU2VzQUNvcmdVNG1KNnV4UjM1QkFDSCthRU55WldGMFpXUWdZbmtnUWsxUVZHOUhTVVlnVUhKdklIWmxjbk5wYjI0Z01pNDFEUXFwSUVSbGRtVnNRMjl5SURFNU9UY3NNVGs1T0M0Z1FXeHNJSEpwWjJoMGN5QnlaWE5sY25abFpDNE5DbWgwZEhBNkx5OTNkM2N1WkdWMlpXeGpiM0l1WTI5dEFEcz19CitpbWFnZSBjcmVhdGUgcGhvdG8gOjpicm93c2VyOjppbWdfcmJsb2IgICAtZGF0YSB7UjBsR09EbGhFQUFRQUlVQUFQd0NCRnhhWE56ZTNMeTJySlNXalB6Ky9PenE3R3hxYkp5YW5QVDI5SFJ5ZE16T3pEUXlOSXlLakVSQ1JPVGkzUHo2OVBUeTdQenk3UFR1NU96bTNMeXFsSnlXbEpTU2pKU09oT3ppMUx5dWxQejI3UFRxM1BUbTFPemV6THlxakl5S2hKU0tmT3pheFB6MjlPeml6THlpZEl5R2RJeUNkT1RPcEx5bWhPemF2T1RTdE1UQ3RNUytyTVM2cE1TeW5NU3VsTHllZEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0g1QkFFQUFBQUFMQUFBQUFBUUFCQUFBQWFRUUlBUUVDZ2FqY05rUU1Ca0RnS0VRRks0TEZnTGhrTUJJVlVLcm9XRVlsRWdNTHhiQktMUVVCd2M1MkhnQVE0TEJvMDQ5YXRXUXlJUEEzcEVkRmNRRWhNVUZZTlZhZ1FXRnhnWkdveGZZUnNUSEIwZUg1VUpDSkFZSUNFaW5Vb1BJeEljSENRa0lpSWxsUVlFR0NFaEppY29LWXdQbWlRZUtpc3JLTEZLTEN3dExpOHdIeVVsTVl3TTB0UFVESDVCQUNIK2FFTnlaV0YwWldRZ1lua2dRazFRVkc5SFNVWWdVSEp2SUhabGNuTnBiMjRnTWk0MURRcXBJRVJsZG1Wc1EyOXlJREU1T1Rjc01UazVPQzRnUVd4c0lISnBaMmgwY3lCeVpYTmxjblpsWkM0TkNtaDBkSEE2THk5M2QzY3VaR1YyWld4amIzSXVZMjl0QURzPX0KK2ltYWdlIGNyZWF0ZSBwaG90byA6OmJyb3dzZXI6OmltZ194YmxvYiAgIC1kYXRhIHtSMGxHT0RsaEVBQVFBSVlBQVB3Q0JGUldWRnhhWE56YTNPVGkzTnplM0x5MnRKeWFuUHorL096cTdHeHViTnpTeE16T3pNVEd4SFJ5YkRReU5MeSt2SFJ5ZEh4NmZLU2lwSVNDaEl5S2pHeHFiRVJDUkN3dUxMeTZ2R1JpWkV4S1RDUWlKQXdLRExTeXRMeTJySlNTbEh4K2ZEdzZQS3lxckJRV0ZQVHU1T3ptM0x5dWxMUzJ0Q1FtSkFRQ0JQVHEzT3ppMU1TeW5Dd3FMQVFHQk9UYXpPeml6T3plekx5cWpCd2VITnpTdk96YXhLeXVySFJ1Wk56T3RMeW1oRHcrUEl5Q2RPeld2T1RPcEx5aWROekt0T1RTdEx5aWZNVEN0TVMrckx5ZWRBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0g1QkFFQUFBQUFMQUFBQUFBUUFCQUFBQWZaZ0FDQ0FBRUNoWWVHZzRvQ0F3UUZqZ1lCQndHS2dnRUVDSmtJQ1FvSWt3QURDd3dORFkybURBNExuZzhRRGhFU3NMQVJFeFFWRGhZWEdCa1dFeElhR3c4Y0hSNFNDUVFmRlE4ZUZnVWdJUUVpd2lNU0JNWWZHQjRhdHdFWER5UWQwd1FsSmljUEtBSG9GeUlwSkNvZURnTXJMQzBZS0JzWDZpNGtMKzRPTURFeVppanI1b0xHTnhVcVVDaW9FY1BHREF3alBOeUk2TUVEQ2hRamNPU3dzVURIZ3cwN1JJZ0k0S0NrQWdzOGN2VHc4ZU9Cb2dBeFF0WElBU1RJU2lFdUJ3VVlNb1JJaXhZblpnZ3BVZ1REeXdkSWtXSklpdFJQSUFBaC9taERjbVZoZEdWa0lHSjVJRUpOVUZSdlIwbEdJRkJ5YnlCMlpYSnphVzl1SURJdU5RMEtxU0JFWlhabGJFTnZjaUF4T1RrM0xERTVPVGd1SUVGc2JDQnlhV2RvZEhNZ2NtVnpaWEoyWldRdURRcG9kSFJ3T2k4dmQzZDNMbVJsZG1Wc1kyOXlMbU52YlFBN30KK2ltYWdlIGNyZWF0ZSBwaG90byA6OmJyb3dzZXI6OmltZ190cmVlICAgIC1kYXRhIHtSMGxHT0RsaEVBQVFBSVlBQVB3Q0JBUUNCRXhLVEJ3V0hNekt6T3pxN0VSQ1JFeEdUQ3dxTEFScW5BUStaSFIyZEt5cXJOVE96SHgyZkNRaUpNVGk5TlR1OUh6QzNBeG1uQVErWFBUbTdEeTY3RHlteklUQzNJekc1QXh5cEhSeWRLeW1yTXpPek96dTdCd2VIQnl5OUF5R3RGeXkxSXpHM05UdS9BUnVwRlJTVkJ5YXpCUjZyQXlHdkZ5dXpKVEszTVRtOUJSK3RBeFdoSFM2MU1UaTdQeisvSXltdkN4dWxCUmVsQXgyckhTNjNQejYvUFR5OVBUdTlOemEzSVNpdEJSdXBGU2l4TlRTMUN4cW5EUXlOTXpHek9UaTVNVEN4TVRHeEd4dWJHeHFiTHkydkxTdXRHUmlaTHk2dkxTeXRLeXVyRFF1TkZ4YVhLU2lwRHc2UEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0g1QkFFQUFBQUFMQUFBQUFBUUFCQUFBQWZEZ0FDQ0FBRUNnNGVJQUFNRUJRWUhDSW1EQmdrS0N3d05CUUlCQnc0Qmh3OFFFUklURkpZRUZRVUZub0lQRmhjWW9Sa2FGQnNjSFI0R2doOGdJUmNpRWlNUUpCa2x0Q2E2SnlVb0tTa1hLaElyTENRWXVRQVBMUzRURXlVaEtiMHFMekRWQWpFRk1qTXVOQk1vTmN3MjFRWTNPRGtGT2pzODJSTTFQZkR6RlJVM2ZPZ2djTTdGajJwQWdnZ1Jva09IRHg5RGhoQVpVcVFhSVNCR2hqd01FdkVJa2lJSEVnVUFrZ1NKa2lOTG1GU01KQ2hBRXlkUEdCU0J3dkpRZ0FjMC9RUUNBQ0grYUVOeVpXRjBaV1FnWW5rZ1FrMVFWRzlIU1VZZ1VISnZJSFpsY25OcGIyNGdNaTQxRFFxcElFUmxkbVZzUTI5eUlERTVPVGNzTVRrNU9DNGdRV3hzSUhKcFoyaDBjeUJ5WlhObGNuWmxaQzROQ21oMGRIQTZMeTkzZDNjdVpHVjJaV3hqYjNJdVkyOXRBRHM9fQoraW1hZ2UgY3JlYXRlIHBob3RvIDo6YnJvd3Nlcjo6aW1nX3N5bWxpbmsgLWRhdGEge1IwbEdPRGxoRUFBUUFJUUFBUHdDQkN3cUxMU3l0THkrdkVSR1JGUldWRFEyTktTbXBBUUNCS3l1ck1UR3hJU0NoSnlhbkhSMmRJeUtqR3h1YkhSeWRHUm1aSXlPakZ4ZVhIeDZmQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSDVCQUVBQUFBQUxBQUFBQUFRQUJBQUFBVmJJQ0FDd1dpZVkxQ2liQ0NzckJrTWIwemNoU0VjTllza0N0cUJCenNoRmtPR1FGazBJUnFPeHFQQk9EUkhDTWhDUUt0ZVJjOUZJL0tRV0dPSXlGWWdrREMrZ1BSNHNuQ2NmUkdLT0lLSWdTTVFFMzErZjRPRVlDWitJUUFoL21oRGNtVmhkR1ZrSUdKNUlFSk5VRlJ2UjBsR0lGQnlieUIyWlhKemFXOXVJREl1TlEwS3FTQkVaWFpsYkVOdmNpQXhPVGszTERFNU9UZ3VJRUZzYkNCeWFXZG9kSE1nY21WelpYSjJaV1F1RFFwb2RIUndPaTh2ZDNkM0xtUmxkbVZzWTI5eUxtTnZiUUE3fQoraW1hZ2UgY3JlYXRlIHBob3RvIDo6YnJvd3Nlcjo6aW1nX3Vua25vd24gLWRhdGEge1IwbEdPRGxoRUFBUUFJVUFBUHdDQkZ4YVhJeUtqTlRXMU56ZTNMUzJ0SnlhbkVSMlJHUytWUHorL1BUdTVHeHFiUHo2OUJRNkJDeGVMRlNxUlBUMjlIUnlkTXpPekRReU5FUm1QS1N5cENSV0hJeUtoRVJDUkR5R1BLejJuRVNpTEJ4R0hDeUNIR3h1YlB6Ni9QVHk3T3ppMUx5MnJLU2lwT3ptM0x5cWxLU1doQ1J5Rk96aXpMeW1oTlRLdE56T3ZPemF4T1RTdFB6MjdPeld2T1RPcExTdXBMeWVkTVMrck1TNnBNU3VsTHlxakx5bWZMeWlmQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNINUJBRUFBQUFBTEFBQUFBQVFBQkFBQUFhbVFJQVFFQ2dhamNPa1lFQm9EZ29CUXlBSk9DQ3VpRU5Dc1dCSWg5YUd3OUY0SENBUmlYY2lSRFFvQlVubFlSbGNJZ3NNRzVDeFhBZ01HaHNjQlJBRUJSZDdBQjBlQkJvSWd4VWZJQ0VpaWtTUGd5TU1JQW9rSlpjQmtCeWJKZ29tSWFCSkFab01weUNtcWtNQkZDY1ZDcmdLS0F3cG9Tb3JLcWNoS0N3dHZhc0lGQkloTGlZdkx6REhzeFFOTWNNS0xEQXdNcUV6M2pRMU5UWTNPTnlyRStqcDZoTitRUUFoL21oRGNtVmhkR1ZrSUdKNUlFSk5VRlJ2UjBsR0lGQnlieUIyWlhKemFXOXVJREl1TlEwS3FTQkVaWFpsYkVOdmNpQXhPVGszTERFNU9UZ3VJRUZzYkNCeWFXZG9kSE1nY21WelpYSjJaV1F1RFFwb2RIUndPaTh2ZDNkM0xtUmxkbVZzWTI5eUxtTnZiUUE3fQorCitmaWVsZCB3CitmaWVsZCBicm93c2VyX2NvbW1pdAorZmllbGQgYnJvd3Nlcl9wYXRoCitmaWVsZCBicm93c2VyX2ZpbGVzICB7fQorZmllbGQgYnJvd3Nlcl9zdGF0dXMgW21jICJTdGFydGluZy4uLiJdCitmaWVsZCBicm93c2VyX3N0YWNrICB7fQorZmllbGQgYnJvd3Nlcl9idXN5ICAgMQorCitmaWVsZCBsc19idWYgICAgIHt9OyAjIEJ1ZmZlcmVkIHJlY29yZCBvdXRwdXQgZnJvbSBscy10cmVlCisKK2NvbnN0cnVjdG9yIG5ldyB7Y29tbWl0IHtwYXRoIHt9fX0geworCWdsb2JhbCBjdXJzb3JfcHRyIE0xQgorCW1ha2VfdG9wbGV2ZWwgdG9wIHcKKwl3bSB0aXRsZSAkdG9wIFthcHBlbmQgIlthcHBuYW1lXSAoW3JlcG9uYW1lXSk6ICIgW21jICJGaWxlIEJyb3dzZXIiXV0KKworCXNldCBicm93c2VyX2NvbW1pdCAkY29tbWl0CisJc2V0IGJyb3dzZXJfcGF0aCAkYnJvd3Nlcl9jb21taXQ6JHBhdGgKKworCWxhYmVsICR3LnBhdGggXAorCQktdGV4dHZhcmlhYmxlIEBicm93c2VyX3BhdGggXAorCQktYW5jaG9yIHcgXAorCQktanVzdGlmeSBsZWZ0IFwKKwkJLWJvcmRlcndpZHRoIDEgXAorCQktcmVsaWVmIHN1bmtlbiBcCisJCS1mb250IGZvbnRfdWlib2xkCisJcGFjayAkdy5wYXRoIC1hbmNob3IgdyAtc2lkZSB0b3AgLWZpbGwgeAorCisJZnJhbWUgJHcubGlzdAorCXNldCB3X2xpc3QgJHcubGlzdC5sCisJdGV4dCAkd19saXN0IC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kIGJsYWNrIFwKKwkJLWJvcmRlcndpZHRoIDAgXAorCQktY3Vyc29yICRjdXJzb3JfcHRyIFwKKwkJLXN0YXRlIGRpc2FibGVkIFwKKwkJLXdyYXAgbm9uZSBcCisJCS1oZWlnaHQgMjAgXAorCQktd2lkdGggNzAgXAorCQkteHNjcm9sbGNvbW1hbmQgW2xpc3QgJHcubGlzdC5zYnggc2V0XSBcCisJCS15c2Nyb2xsY29tbWFuZCBbbGlzdCAkdy5saXN0LnNieSBzZXRdCisJcm1zZWxfdGFnICR3X2xpc3QKKwlzY3JvbGxiYXIgJHcubGlzdC5zYnggLW9yaWVudCBoIC1jb21tYW5kIFtsaXN0ICR3X2xpc3QgeHZpZXddCisJc2Nyb2xsYmFyICR3Lmxpc3Quc2J5IC1vcmllbnQgdiAtY29tbWFuZCBbbGlzdCAkd19saXN0IHl2aWV3XQorCXBhY2sgJHcubGlzdC5zYnggLXNpZGUgYm90dG9tIC1maWxsIHgKKwlwYWNrICR3Lmxpc3Quc2J5IC1zaWRlIHJpZ2h0IC1maWxsIHkKKwlwYWNrICR3X2xpc3QgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQorCXBhY2sgJHcubGlzdCAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKKworCWxhYmVsICR3LnN0YXR1cyBcCisJCS10ZXh0dmFyaWFibGUgQGJyb3dzZXJfc3RhdHVzIFwKKwkJLWFuY2hvciB3IFwKKwkJLWp1c3RpZnkgbGVmdCBcCisJCS1ib3JkZXJ3aWR0aCAxIFwKKwkJLXJlbGllZiBzdW5rZW4KKwlwYWNrICR3LnN0YXR1cyAtYW5jaG9yIHcgLXNpZGUgYm90dG9tIC1maWxsIHgKKworCWJpbmQgJHdfbGlzdCA8QnV0dG9uLTE+ICAgICAgICAiW2NiIF9jbGljayAwIEAleCwleV07YnJlYWsiCisJYmluZCAkd19saXN0IDxEb3VibGUtQnV0dG9uLTE+ICJbY2IgX2NsaWNrIDEgQCV4LCV5XTticmVhayIKKwliaW5kICR3X2xpc3QgPCRNMUItVXA+ICAgICAgICAgIltjYiBfcGFyZW50XSAgICAgICAgO2JyZWFrIgorCWJpbmQgJHdfbGlzdCA8JE0xQi1MZWZ0PiAgICAgICAiW2NiIF9wYXJlbnRdICAgICAgICA7YnJlYWsiCisJYmluZCAkd19saXN0IDxVcD4gICAgICAgICAgICAgICJbY2IgX21vdmUgLTFdICAgICAgIDticmVhayIKKwliaW5kICR3X2xpc3QgPERvd24+ICAgICAgICAgICAgIltjYiBfbW92ZSAgMV0gICAgICAgO2JyZWFrIgorCWJpbmQgJHdfbGlzdCA8JE0xQi1SaWdodD4gICAgICAiW2NiIF9lbnRlcl0gICAgICAgICA7YnJlYWsiCisJYmluZCAkd19saXN0IDxSZXR1cm4+ICAgICAgICAgICJbY2IgX2VudGVyXSAgICAgICAgIDticmVhayIKKwliaW5kICR3X2xpc3QgPFByaW9yPiAgICAgICAgICAgIltjYiBfcGFnZSAtMV0gICAgICAgO2JyZWFrIgorCWJpbmQgJHdfbGlzdCA8TmV4dD4gICAgICAgICAgICAiW2NiIF9wYWdlICAxXSAgICAgICA7YnJlYWsiCisJYmluZCAkd19saXN0IDxMZWZ0PiAgICAgICAgICAgIGJyZWFrCisJYmluZCAkd19saXN0IDxSaWdodD4gICAgICAgICAgIGJyZWFrCisKKwliaW5kICR3X2xpc3QgPFZpc2liaWxpdHk+IFtsaXN0IGZvY3VzICR3X2xpc3RdCisJc2V0IHcgJHdfbGlzdAorCWlmIHskcGF0aCBuZSB7fX0geworCQlfbHMgJHRoaXMgJGJyb3dzZXJfY29tbWl0OiRwYXRoICRwYXRoCisJfSBlbHNlIHsKKwkJX2xzICR0aGlzICRicm93c2VyX2NvbW1pdCAkcGF0aAorCX0KKwlyZXR1cm4gJHRoaXMKK30KKworbWV0aG9kIF9tb3ZlIHtkaXJ9IHsKKwlpZiB7JGJyb3dzZXJfYnVzeX0gcmV0dXJuCisJc2V0IGxubyBbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggaW5fc2VsLmZpcnN0XSAuXSAwXQorCWluY3IgbG5vICRkaXIKKwlpZiB7W2xpbmRleCAkYnJvd3Nlcl9maWxlcyBbZXhwciB7JGxubyAtIDF9XV0gbmUge319IHsKKwkJJHcgdGFnIHJlbW92ZSBpbl9zZWwgMC4wIGVuZAorCQkkdyB0YWcgYWRkIGluX3NlbCAkbG5vLjAgW2V4cHIgeyRsbm8gKyAxfV0uMAorCQkkdyBzZWUgJGxuby4wCisJfQorfQorCittZXRob2QgX3BhZ2Uge2Rpcn0geworCWlmIHskYnJvd3Nlcl9idXN5fSByZXR1cm4KKwkkdyB5dmlldyBzY3JvbGwgJGRpciBwYWdlcworCXNldCBsbm8gW2V4cHIge2ludCgKKwkJICBbbGluZGV4IFskdyB5dmlld10gMF0KKwkJKiBbbGxlbmd0aCAkYnJvd3Nlcl9maWxlc10KKwkJKyAxKX1dCisJaWYge1tsaW5kZXggJGJyb3dzZXJfZmlsZXMgW2V4cHIgeyRsbm8gLSAxfV1dIG5lIHt9fSB7CisJCSR3IHRhZyByZW1vdmUgaW5fc2VsIDAuMCBlbmQKKwkJJHcgdGFnIGFkZCBpbl9zZWwgJGxuby4wIFtleHByIHskbG5vICsgMX1dLjAKKwkJJHcgc2VlICRsbm8uMAorCX0KK30KKworbWV0aG9kIF9wYXJlbnQge30geworCWlmIHskYnJvd3Nlcl9idXN5fSByZXR1cm4KKwlzZXQgaW5mbyBbbGluZGV4ICRicm93c2VyX2ZpbGVzIDBdCisJaWYge1tsaW5kZXggJGluZm8gMF0gZXEge3BhcmVudH19IHsKKwkJc2V0IHBhcmVudCBbbGluZGV4ICRicm93c2VyX3N0YWNrIGVuZC0xXQorCQlzZXQgYnJvd3Nlcl9zdGFjayBbbHJhbmdlICRicm93c2VyX3N0YWNrIDAgZW5kLTJdCisJCWlmIHskYnJvd3Nlcl9zdGFjayBlcSB7fX0geworCQkJcmVnc3ViIHs6LiokfSAkYnJvd3Nlcl9wYXRoIHs6fSBicm93c2VyX3BhdGgKKwkJfSBlbHNlIHsKKwkJCXJlZ3N1YiB7L1teL10rJH0gJGJyb3dzZXJfcGF0aCB7fSBicm93c2VyX3BhdGgKKwkJfQorCQlzZXQgYnJvd3Nlcl9zdGF0dXMgW21jICJMb2FkaW5nICVzLi4uIiAkYnJvd3Nlcl9wYXRoXQorCQlfbHMgJHRoaXMgW2xpbmRleCAkcGFyZW50IDBdIFtsaW5kZXggJHBhcmVudCAxXQorCX0KK30KKworbWV0aG9kIF9lbnRlciB7fSB7CisJaWYgeyRicm93c2VyX2J1c3l9IHJldHVybgorCXNldCBsbm8gW2xpbmRleCBbc3BsaXQgWyR3IGluZGV4IGluX3NlbC5maXJzdF0gLl0gMF0KKwlzZXQgaW5mbyBbbGluZGV4ICRicm93c2VyX2ZpbGVzIFtleHByIHskbG5vIC0gMX1dXQorCWlmIHskaW5mbyBuZSB7fX0geworCQlzd2l0Y2ggLS0gW2xpbmRleCAkaW5mbyAwXSB7CisJCXBhcmVudCB7CisJCQlfcGFyZW50ICR0aGlzCisJCX0KKwkJdHJlZSB7CisJCQlzZXQgbmFtZSBbbGluZGV4ICRpbmZvIDJdCisJCQlzZXQgZXNjbiBbZXNjYXBlX3BhdGggJG5hbWVdCisJCQlzZXQgYnJvd3Nlcl9zdGF0dXMgW21jICJMb2FkaW5nICVzLi4uIiAkZXNjbl0KKwkJCWFwcGVuZCBicm93c2VyX3BhdGggJGVzY24KKwkJCV9scyAkdGhpcyBbbGluZGV4ICRpbmZvIDFdICRuYW1lCisJCX0KKwkJYmxvYiB7CisJCQlzZXQgbmFtZSBbbGluZGV4ICRpbmZvIDJdCisJCQlzZXQgcCB7fQorCQkJZm9yZWFjaCBuICRicm93c2VyX3N0YWNrIHsKKwkJCQlhcHBlbmQgcCBbbGluZGV4ICRuIDFdCisJCQl9CisJCQlhcHBlbmQgcCAkbmFtZQorCQkJYmxhbWU6Om5ldyAkYnJvd3Nlcl9jb21taXQgJHAKKwkJfQorCQl9CisJfQorfQorCittZXRob2QgX2NsaWNrIHt3YXNfZG91YmxlX2NsaWNrIHBvc30geworCWlmIHskYnJvd3Nlcl9idXN5fSByZXR1cm4KKwlzZXQgbG5vIFtsaW5kZXggW3NwbGl0IFskdyBpbmRleCAkcG9zXSAuXSAwXQorCWZvY3VzICR3CisKKwlpZiB7W2xpbmRleCAkYnJvd3Nlcl9maWxlcyBbZXhwciB7JGxubyAtIDF9XV0gbmUge319IHsKKwkJJHcgdGFnIHJlbW92ZSBpbl9zZWwgMC4wIGVuZAorCQkkdyB0YWcgYWRkIGluX3NlbCAkbG5vLjAgW2V4cHIgeyRsbm8gKyAxfV0uMAorCQlpZiB7JHdhc19kb3VibGVfY2xpY2t9IHsKKwkJCV9lbnRlciAkdGhpcworCQl9CisJfQorfQorCittZXRob2QgX2xzIHt0cmVlX2lkIHtuYW1lIHt9fX0geworCXNldCBsc19idWYge30KKwlzZXQgYnJvd3Nlcl9maWxlcyB7fQorCXNldCBicm93c2VyX2J1c3kgMQorCisJJHcgY29uZiAtc3RhdGUgbm9ybWFsCisJJHcgdGFnIHJlbW92ZSBpbl9zZWwgMC4wIGVuZAorCSR3IGRlbGV0ZSAwLjAgZW5kCisJaWYgeyRicm93c2VyX3N0YWNrIG5lIHt9fSB7CisJCSR3IGltYWdlIGNyZWF0ZSBlbmQgXAorCQkJLWFsaWduIGNlbnRlciAtcGFkeCA1IC1wYWR5IDEgXAorCQkJLW5hbWUgaWNvbjAgXAorCQkJLWltYWdlIDo6YnJvd3Nlcjo6aW1nX3BhcmVudAorCQkkdyBpbnNlcnQgZW5kIFttYyAiXFtVcCBUbyBQYXJlbnRcXSJdCisJCWxhcHBlbmQgYnJvd3Nlcl9maWxlcyBwYXJlbnQKKwl9CisJbGFwcGVuZCBicm93c2VyX3N0YWNrIFtsaXN0ICR0cmVlX2lkICRuYW1lXQorCSR3IGNvbmYgLXN0YXRlIGRpc2FibGVkCisKKwlzZXQgZmQgW2dpdF9yZWFkIGxzLXRyZWUgLXogJHRyZWVfaWRdCisJZmNvbmZpZ3VyZSAkZmQgLWJsb2NraW5nIDAgLXRyYW5zbGF0aW9uIGJpbmFyeSAtZW5jb2RpbmcgYmluYXJ5CisJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbY2IgX3JlYWQgJGZkXQorfQorCittZXRob2QgX3JlYWQge2ZkfSB7CisJYXBwZW5kIGxzX2J1ZiBbcmVhZCAkZmRdCisJc2V0IHBjayBbc3BsaXQgJGxzX2J1ZiAiXDAiXQorCXNldCBsc19idWYgW2xpbmRleCAkcGNrIGVuZF0KKworCXNldCBuIFtsbGVuZ3RoICRicm93c2VyX2ZpbGVzXQorCSR3IGNvbmYgLXN0YXRlIG5vcm1hbAorCWZvcmVhY2ggcCBbbHJhbmdlICRwY2sgMCBlbmQtMV0geworCQlzZXQgdGFiIFtzdHJpbmcgZmlyc3QgIlx0IiAkcF0KKwkJaWYgeyR0YWIgPT0gLTF9IGNvbnRpbnVlCisKKwkJc2V0IGluZm8gW3NwbGl0IFtzdHJpbmcgcmFuZ2UgJHAgMCBbZXhwciB7JHRhYiAtIDF9XV0geyB9XQorCQlzZXQgcGF0aCBbc3RyaW5nIHJhbmdlICRwIFtleHByIHskdGFiICsgMX1dIGVuZF0KKwkJc2V0IHR5cGUgICBbbGluZGV4ICRpbmZvIDFdCisJCXNldCBvYmplY3QgW2xpbmRleCAkaW5mbyAyXQorCisJCXN3aXRjaCAtLSAkdHlwZSB7CisJCWJsb2IgeworCQkJc2NhbiBbbGluZGV4ICRpbmZvIDBdICVvIG1vZGUKKwkJCWlmIHskbW9kZSA9PSAwMTIwMDAwfSB7CisJCQkJc2V0IGltYWdlIDo6YnJvd3Nlcjo6aW1nX3N5bWxpbmsKKwkJCX0gZWxzZWlmIHsoJG1vZGUgJiAwMTAwKSAhPSAwfSB7CisJCQkJc2V0IGltYWdlIDo6YnJvd3Nlcjo6aW1nX3hibG9iCisJCQl9IGVsc2UgeworCQkJCXNldCBpbWFnZSA6OmJyb3dzZXI6OmltZ19yYmxvYgorCQkJfQorCQl9CisJCXRyZWUgeworCQkJc2V0IGltYWdlIDo6YnJvd3Nlcjo6aW1nX3RyZWUKKwkJCWFwcGVuZCBwYXRoIC8KKwkJfQorCQlkZWZhdWx0IHsKKwkJCXNldCBpbWFnZSA6OmJyb3dzZXI6OmltZ191bmtub3duCisJCX0KKwkJfQorCisJCWlmIHskbiA+IDB9IHskdyBpbnNlcnQgZW5kICJcbiJ9CisJCSR3IGltYWdlIGNyZWF0ZSBlbmQgXAorCQkJLWFsaWduIGNlbnRlciAtcGFkeCA1IC1wYWR5IDEgXAorCQkJLW5hbWUgaWNvbltpbmNyIG5dIFwKKwkJCS1pbWFnZSAkaW1hZ2UKKwkJJHcgaW5zZXJ0IGVuZCBbZXNjYXBlX3BhdGggJHBhdGhdCisJCWxhcHBlbmQgYnJvd3Nlcl9maWxlcyBbbGlzdCAkdHlwZSAkb2JqZWN0ICRwYXRoXQorCX0KKwkkdyBjb25mIC1zdGF0ZSBkaXNhYmxlZAorCisJaWYge1tlb2YgJGZkXX0geworCQljbG9zZSAkZmQKKwkJc2V0IGJyb3dzZXJfc3RhdHVzIFttYyAiUmVhZHkuIl0KKwkJc2V0IGJyb3dzZXJfYnVzeSAwCisJCXNldCBsc19idWYge30KKwkJaWYgeyRuID4gMH0geworCQkJJHcgdGFnIGFkZCBpbl9zZWwgMS4wIDIuMAorCQkJZm9jdXMgLWZvcmNlICR3CisJCX0KKwl9Cit9IGlmZGVsZXRlZCB7CisJY2F0Y2gge2Nsb3NlICRmZH0KK30KKworfQorCitjbGFzcyBicm93c2VyX29wZW4geworCitmaWVsZCB3ICAgICAgICAgICAgICA7ICMgd2lkZ2V0IHBhdGgKK2ZpZWxkIHdfcmV2ICAgICAgICAgIDsgIyBtZWdhLXdpZGdldCB0byBwaWNrIHRoZSBpbml0aWFsIHJldmlzaW9uCisKK2NvbnN0cnVjdG9yIGRpYWxvZyB7fSB7CisJbWFrZV90b3BsZXZlbCB0b3AgdworCXdtIHRpdGxlICR0b3AgW2FwcGVuZCAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogIiBbbWMgIkJyb3dzZSBCcmFuY2ggRmlsZXMiXV0KKwlpZiB7JHRvcCBuZSB7Ln19IHsKKwkJd20gZ2VvbWV0cnkgJHRvcCAiK1t3aW5mbyByb290eCAuXStbd2luZm8gcm9vdHkgLl0iCisJfQorCisJbGFiZWwgJHcuaGVhZGVyIFwKKwkJLXRleHQgW21jICJCcm93c2UgQnJhbmNoIEZpbGVzIl0gXAorCQktZm9udCBmb250X3VpYm9sZAorCXBhY2sgJHcuaGVhZGVyIC1zaWRlIHRvcCAtZmlsbCB4CisKKwlmcmFtZSAkdy5idXR0b25zCisJYnV0dG9uICR3LmJ1dHRvbnMuYnJvd3NlIC10ZXh0IFttYyBCcm93c2VdIFwKKwkJLWRlZmF1bHQgYWN0aXZlIFwKKwkJLWNvbW1hbmQgW2NiIF9vcGVuXQorCXBhY2sgJHcuYnV0dG9ucy5icm93c2UgLXNpZGUgcmlnaHQKKwlidXR0b24gJHcuYnV0dG9ucy5jYW5jZWwgLXRleHQgW21jIENhbmNlbF0gXAorCQktY29tbWFuZCBbbGlzdCBkZXN0cm95ICR3XQorCXBhY2sgJHcuYnV0dG9ucy5jYW5jZWwgLXNpZGUgcmlnaHQgLXBhZHggNQorCXBhY2sgJHcuYnV0dG9ucyAtc2lkZSBib3R0b20gLWZpbGwgeCAtcGFkeSAxMCAtcGFkeCAxMAorCisJc2V0IHdfcmV2IFs6OmNob29zZV9yZXY6Om5ldyAkdy5yZXYgW21jIFJldmlzaW9uXV0KKwkkd19yZXYgYmluZF9saXN0Ym94IDxEb3VibGUtQnV0dG9uLTE+IFtjYiBfb3Blbl0KKwlwYWNrICR3LnJldiAtYW5jaG9yIG53IC1maWxsIGJvdGggLWV4cGFuZCAxIC1wYWR5IDUgLXBhZHggNQorCisJYmluZCAkdyA8VmlzaWJpbGl0eT4gW2NiIF92aXNpYmxlXQorCWJpbmQgJHcgPEtleS1Fc2NhcGU+IFtsaXN0IGRlc3Ryb3kgJHddCisJYmluZCAkdyA8S2V5LVJldHVybj4gW2NiIF9vcGVuXVw7YnJlYWsKKwl0a3dhaXQgd2luZG93ICR3Cit9CisKK21ldGhvZCBfb3BlbiB7fSB7CisJaWYge1tjYXRjaCB7JHdfcmV2IGNvbW1pdF9vcl9kaWV9IGVycl19IHsKKwkJcmV0dXJuCisJfQorCXNldCBuYW1lIFskd19yZXYgZ2V0XQorCWRlc3Ryb3kgJHcKKwlicm93c2VyOjpuZXcgJG5hbWUKK30KKworbWV0aG9kIF92aXNpYmxlIHt9IHsKKwlncmFiICR3CisJJHdfcmV2IGZvY3VzX2ZpbHRlcgorfQorCit9CmRpZmYgLS1naXQgYS9naXQtZ3VpL2xpYi9jaGVja291dF9vcC50Y2wgYi9naXQtZ3VpL2xpYi9jaGVja291dF9vcC50Y2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUxNDExNwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvbGliL2NoZWNrb3V0X29wLnRjbApAQCAtMCwwICsxLDU4OCBAQAorIyBnaXQtZ3VpIGNvbW1pdCBjaGVja291dCBzdXBwb3J0CisjIENvcHlyaWdodCAoQykgMjAwNyBTaGF3biBQZWFyY2UKKworY2xhc3MgY2hlY2tvdXRfb3AgeworCitmaWVsZCB3ICAgICAgICB7fTsgIyBvdXIgd2luZG93IChpZiB3ZSBoYXZlIG9uZSkKK2ZpZWxkIHdfY29ucyAgIHt9OyAjIGVtYmVkZGVkIGNvbnNvbGUgd2luZG93IG9iamVjdAorCitmaWVsZCBuZXdfZXhwciAgIDsgIyBleHByZXNzaW9uIHRoZSB1c2VyIHNhdy90aGlua3MgdGhpcyBpcworZmllbGQgbmV3X2hhc2ggICA7ICMgY29tbWl0IFNIQS0xIHdlIGFyZSBzd2l0Y2hpbmcgdG8KK2ZpZWxkIG5ld19yZWYgICAgOyAjIHJlZiB3ZSBhcmUgdXBkYXRpbmcvY3JlYXRpbmcKKworZmllbGQgcGFyZW50X3cgICAgICAuOyAjIHdpbmRvdyB0aGF0IHN0YXJ0ZWQgdXMKK2ZpZWxkIG1lcmdlX3R5cGUgbm9uZTsgIyB0eXBlIG9mIG1lcmdlIHRvIGFwcGx5IHRvIGV4aXN0aW5nIGJyYW5jaAorZmllbGQgbWVyZ2VfYmFzZSAgIHt9OyAjIG1lcmdlIGJhc2UgaWYgd2UgaGF2ZSBhbm90aGVyIHJlZiBpbnZvbHZlZAorZmllbGQgZmV0Y2hfc3BlYyAgIHt9OyAjIHJlZmV0Y2ggdHJhY2tpbmcgYnJhbmNoIGlmIHVzZWQ/CitmaWVsZCBjaGVja291dCAgICAgIDE7ICMgYWN0dWFsbHkgY2hlY2tvdXQgdGhlIGJyYW5jaD8KK2ZpZWxkIGNyZWF0ZSAgICAgICAgMDsgIyBjcmVhdGUgdGhlIGJyYW5jaCBpZiBpdCBkb2Vzbid0IGV4aXN0PworCitmaWVsZCByZXNldF9vayAgICAgIDA7ICMgZGlkIHRoZSB1c2VyIGFncmVlIHRvIHJlc2V0PworZmllbGQgZmV0Y2hfb2sgICAgICAwOyAjIGRpZCB0aGUgZmV0Y2ggc3VjY2VlZD8KKworZmllbGQgcmVhZHRyZWVfZCAgIHt9OyAjIGJ1ZmZlcmVkIG91dHB1dCBmcm9tIHJlYWQtdHJlZQorZmllbGQgdXBkYXRlX29sZCAgIHt9OyAjIHdhcyB0aGUgdXBkYXRlLXJlZiBjYWxsIGRlZmVycmVkPworZmllbGQgcmVmbG9nX21zZyAgIHt9OyAjIGxvZyBtZXNzYWdlIGZvciB0aGUgdXBkYXRlLXJlZiBjYWxsCisKK2NvbnN0cnVjdG9yIG5ldyB7ZXhwciBoYXNoIHtyZWYge319fSB7CisJc2V0IG5ld19leHByICRleHByCisJc2V0IG5ld19oYXNoICRoYXNoCisJc2V0IG5ld19yZWYgICRyZWYKKworCXJldHVybiAkdGhpcworfQorCittZXRob2QgcGFyZW50IHtwYXRofSB7CisJc2V0IHBhcmVudF93IFt3aW5mbyB0b3BsZXZlbCAkcGF0aF0KK30KKworbWV0aG9kIGVuYWJsZV9tZXJnZSB7dHlwZX0geworCXNldCBtZXJnZV90eXBlICR0eXBlCit9CisKK21ldGhvZCBlbmFibGVfZmV0Y2gge3NwZWN9IHsKKwlzZXQgZmV0Y2hfc3BlYyAkc3BlYworfQorCittZXRob2QgZW5hYmxlX2NoZWNrb3V0IHtjb30geworCXNldCBjaGVja291dCAkY28KK30KKworbWV0aG9kIGVuYWJsZV9jcmVhdGUge2NvfSB7CisJc2V0IGNyZWF0ZSAkY28KK30KKworbWV0aG9kIHJ1biB7fSB7CisJaWYgeyRmZXRjaF9zcGVjIG5lIHt9fSB7CisJCWdsb2JhbCBNMUIKKworCQkjIFdlIHdlcmUgYXNrZWQgdG8gcmVmcmVzaCBhIHNpbmdsZSB0cmFja2luZyBicmFuY2gKKwkJIyBiZWZvcmUgd2UgZ2V0IHRvIHdvcmsuICBXZSBzaG91bGQgZG8gdGhhdCBiZWZvcmUgd2UKKwkJIyBjb25zaWRlciBhbnkgcmVmIHVwZGF0aW5nLgorCQkjCisJCXNldCBmZXRjaF9vayAwCisJCXNldCBsX3RyY2sgW2xpbmRleCAkZmV0Y2hfc3BlYyAwXQorCQlzZXQgcmVtb3RlIFtsaW5kZXggJGZldGNoX3NwZWMgMV0KKwkJc2V0IHJfaGVhZCBbbGluZGV4ICRmZXRjaF9zcGVjIDJdCisJCXJlZ3N1YiBecmVmcy9oZWFkcy8gJHJfaGVhZCB7fSByX25hbWUKKworCQlzZXQgY21kIFtsaXN0IGdpdCBmZXRjaCAkcmVtb3RlXQorCQlpZiB7JGxfdHJjayBuZSB7fX0geworCQkJbGFwcGVuZCBjbWQgKyRyX2hlYWQ6JGxfdHJjaworCQl9IGVsc2UgeworCQkJbGFwcGVuZCBjbWQgJHJfaGVhZAorCQl9CisKKwkJX3RvcGxldmVsICR0aGlzIHtSZWZyZXNoaW5nIFRyYWNraW5nIEJyYW5jaH0KKwkJc2V0IHdfY29ucyBbOjpjb25zb2xlOjplbWJlZCBcCisJCQkkdy5jb25zb2xlIFwKKwkJCVttYyAiRmV0Y2hpbmcgJXMgZnJvbSAlcyIgJHJfbmFtZSAkcmVtb3RlXV0KKwkJcGFjayAkdy5jb25zb2xlIC1maWxsIGJvdGggLWV4cGFuZCAxCisJCSR3X2NvbnMgZXhlYyAkY21kIFtjYiBfZmluaXNoX2ZldGNoXQorCisJCWJpbmQgJHcgPCRNMUItS2V5LXc+IGJyZWFrCisJCWJpbmQgJHcgPCRNMUItS2V5LVc+IGJyZWFrCisJCWJpbmQgJHcgPFZpc2liaWxpdHk+ICIKKwkJCVtsaXN0IGdyYWIgJHddCisJCQlbbGlzdCBmb2N1cyAkd10KKwkJIgorCQl3bSBwcm90b2NvbCAkdyBXTV9ERUxFVEVfV0lORE9XIFtjYiBfbm9vcF0KKwkJdGt3YWl0IHdpbmRvdyAkdworCisJCWlmIHshJGZldGNoX29rfSB7CisJCQlkZWxldGVfdGhpcworCQkJcmV0dXJuIDAKKwkJfQorCX0KKworCWlmIHskbmV3X3JlZiBuZSB7fX0geworCQkjIElmIHdlIGhhdmUgYSByZWYgd2UgbmVlZCB0byB1cGRhdGUgaXQgYmVmb3JlIHdlIGNhbgorCQkjIHByb2NlZWQgd2l0aCBhIGNoZWNrb3V0IChpZiBvbmUgd2FzIGVuYWJsZWQpLgorCQkjCisJCWlmIHshW191cGRhdGVfcmVmICR0aGlzXX0geworCQkJZGVsZXRlX3RoaXMKKwkJCXJldHVybiAwCisJCX0KKwl9CisKKwlpZiB7JGNoZWNrb3V0fSB7CisJCV9jaGVja291dCAkdGhpcworCQlyZXR1cm4gMQorCX0KKworCWRlbGV0ZV90aGlzCisJcmV0dXJuIDEKK30KKworbWV0aG9kIF9ub29wIHt9IHt9CisKK21ldGhvZCBfZmluaXNoX2ZldGNoIHtva30geworCWlmIHskb2t9IHsKKwkJc2V0IGxfdHJjayBbbGluZGV4ICRmZXRjaF9zcGVjIDBdCisJCWlmIHskbF90cmNrIGVxIHt9fSB7CisJCQlzZXQgbF90cmNrIEZFVENIX0hFQUQKKwkJfQorCQlpZiB7W2NhdGNoIHtzZXQgbmV3X2hhc2ggW2dpdCByZXYtcGFyc2UgLS12ZXJpZnkgIiRsX3RyY2teMCJdfSBlcnJdfSB7CisJCQlzZXQgb2sgMAorCQkJJHdfY29ucyBpbnNlcnQgW21jICJmYXRhbDogQ2Fubm90IHJlc29sdmUgJXMiICRsX3RyY2tdCisJCQkkd19jb25zIGluc2VydCAkZXJyCisJCX0KKwl9CisKKwkkd19jb25zIGRvbmUgJG9rCisJc2V0IHdfY29ucyB7fQorCXdtIHByb3RvY29sICR3IFdNX0RFTEVURV9XSU5ET1cge30KKworCWlmIHskb2t9IHsKKwkJZGVzdHJveSAkdworCQlzZXQgdyB7fQorCX0gZWxzZSB7CisJCWJ1dHRvbiAkdy5jbG9zZSAtdGV4dCBbbWMgQ2xvc2VdIC1jb21tYW5kIFtsaXN0IGRlc3Ryb3kgJHddCisJCXBhY2sgJHcuY2xvc2UgLXNpZGUgYm90dG9tIC1hbmNob3IgZSAtcGFkeCAxMCAtcGFkeSAxMAorCX0KKworCXNldCBmZXRjaF9vayAkb2sKK30KKworbWV0aG9kIF91cGRhdGVfcmVmIHt9IHsKKwlnbG9iYWwgbnVsbF9zaGExIGN1cnJlbnRfYnJhbmNoCisKKwlzZXQgcmVmICRuZXdfcmVmCisJc2V0IG5ldyAkbmV3X2hhc2gKKworCXNldCBpc19jdXJyZW50IDAKKwlzZXQgcmggcmVmcy9oZWFkcy8KKwlzZXQgcm4gW3N0cmluZyBsZW5ndGggJHJoXQorCWlmIHtbc3RyaW5nIGVxdWFsIC1sZW5ndGggJHJuICRyaCAkcmVmXX0geworCQlzZXQgbmV3YnJhbmNoIFtzdHJpbmcgcmFuZ2UgJHJlZiAkcm4gZW5kXQorCQlpZiB7JGN1cnJlbnRfYnJhbmNoIGVxICRuZXdicmFuY2h9IHsKKwkJCXNldCBpc19jdXJyZW50IDEKKwkJfQorCX0gZWxzZSB7CisJCXNldCBuZXdicmFuY2ggJHJlZgorCX0KKworCWlmIHtbY2F0Y2gge3NldCBjdXIgW2dpdCByZXYtcGFyc2UgLS12ZXJpZnkgIiRyZWZeMCJdfV19IHsKKwkJIyBBc3N1bWUgaXQgZG9lcyBub3QgZXhpc3QsIGFuZCB0aGF0IGlzIHdoYXQgdGhlIGVycm9yIHdhcy4KKwkJIworCQlpZiB7ISRjcmVhdGV9IHsKKwkJCV9lcnJvciAkdGhpcyBbbWMgIkJyYW5jaCAnJXMnIGRvZXMgbm90IGV4aXN0LiIgJG5ld2JyYW5jaF0KKwkJCXJldHVybiAwCisJCX0KKworCQlzZXQgcmVmbG9nX21zZyAiYnJhbmNoOiBDcmVhdGVkIGZyb20gJG5ld19leHByIgorCQlzZXQgY3VyICRudWxsX3NoYTEKKwl9IGVsc2VpZiB7JGNyZWF0ZSAmJiAkbWVyZ2VfdHlwZSBlcSB7bm9uZX19IHsKKwkJIyBXZSB3ZXJlIHRvbGQgdG8gY3JlYXRlIGl0LCBidXQgbm90IGRvIGEgbWVyZ2UuCisJCSMgQmFkLiAgTmFtZSBzaG91bGRuJ3QgaGF2ZSBleGlzdGVkLgorCQkjCisJCV9lcnJvciAkdGhpcyBbbWMgIkJyYW5jaCAnJXMnIGFscmVhZHkgZXhpc3RzLiIgJG5ld2JyYW5jaF0KKwkJcmV0dXJuIDAKKwl9IGVsc2VpZiB7ISRjcmVhdGUgJiYgJG1lcmdlX3R5cGUgZXEge25vbmV9fSB7CisJCSMgV2UgYXJlbid0IGNyZWF0aW5nLCBpdCBleGlzdHMgYW5kIHdlIGRvbid0IG1lcmdlLgorCQkjIFdlIGFyZSBwcm9iYWJseSBqdXN0IGEgc2ltcGxlIGJyYW5jaCBzd2l0Y2guCisJCSMgVXNlIHdoYXRldmVyIHZhbHVlIHdlIGp1c3QgcmVhZC4KKwkJIworCQlzZXQgbmV3ICAgICAgJGN1cgorCQlzZXQgbmV3X2hhc2ggJGN1cgorCX0gZWxzZWlmIHskbmV3IGVxICRjdXJ9IHsKKwkJIyBObyBtZXJnZSB3b3VsZCBiZSByZXF1aXJlZCwgZG9uJ3QgY29tcHV0ZSBhbnl0aGluZy4KKwkJIworCX0gZWxzZSB7CisJCWNhdGNoIHtzZXQgbWVyZ2VfYmFzZSBbZ2l0IG1lcmdlLWJhc2UgJG5ldyAkY3VyXX0KKwkJaWYgeyRtZXJnZV9iYXNlIGVxICRjdXJ9IHsKKwkJCSMgVGhlIGN1cnJlbnQgYnJhbmNoIGlzIG9sZGVyLgorCQkJIworCQkJc2V0IHJlZmxvZ19tc2cgIm1lcmdlICRuZXdfZXhwcjogRmFzdC1mb3J3YXJkIgorCQl9IGVsc2UgeworCQkJc3dpdGNoIC0tICRtZXJnZV90eXBlIHsKKwkJCWZmIHsKKwkJCQlpZiB7JG1lcmdlX2Jhc2UgZXEgJG5ld30geworCQkJCQkjIFRoZSBjdXJyZW50IGJyYW5jaCBpcyBhY3R1YWxseSBuZXdlci4KKwkJCQkJIworCQkJCQlzZXQgbmV3ICRjdXIKKwkJCQkJc2V0IG5ld19oYXNoICRjdXIKKwkJCQl9IGVsc2UgeworCQkJCQlfZXJyb3IgJHRoaXMgW21jICJCcmFuY2ggJyVzJyBhbHJlYWR5IGV4aXN0cy5cblxuSXQgY2Fubm90IGZhc3QtZm9yd2FyZCB0byAlcy5cbkEgbWVyZ2UgaXMgcmVxdWlyZWQuIiAkbmV3YnJhbmNoICRuZXdfZXhwcl0KKwkJCQkJcmV0dXJuIDAKKwkJCQl9CisJCQl9CisJCQlyZXNldCB7CisJCQkJIyBUaGUgY3VycmVudCBicmFuY2ggd2lsbCBsb3NlIHRoaW5ncy4KKwkJCQkjCisJCQkJaWYge1tfY29uZmlybV9yZXNldCAkdGhpcyAkY3VyXX0geworCQkJCQlzZXQgcmVmbG9nX21zZyAicmVzZXQgJG5ld19leHByIgorCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiAwCisJCQkJfQorCQkJfQorCQkJZGVmYXVsdCB7CisJCQkJX2Vycm9yICR0aGlzIFttYyAiTWVyZ2Ugc3RyYXRlZ3kgJyVzJyBub3Qgc3VwcG9ydGVkLiIgJG1lcmdlX3R5cGVdCisJCQkJcmV0dXJuIDAKKwkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmIHskbmV3IG5lICRjdXJ9IHsKKwkJaWYgeyRpc19jdXJyZW50fSB7CisJCQkjIE5vIHNvIGZhc3QuICBXZSBzaG91bGQgZGVmZXIgdGhpcyBpbiBjYXNlCisJCQkjIHdlIGNhbm5vdCB1cGRhdGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LgorCQkJIworCQkJc2V0IHVwZGF0ZV9vbGQgJGN1cgorCQkJcmV0dXJuIDEKKwkJfQorCisJCWlmIHtbY2F0Y2ggeworCQkJCWdpdCB1cGRhdGUtcmVmIC1tICRyZWZsb2dfbXNnICRyZWYgJG5ldyAkY3VyCisJCQl9IGVycl19IHsKKwkJCV9lcnJvciAkdGhpcyBbc3RyY2F0IFttYyAiRmFpbGVkIHRvIHVwZGF0ZSAnJXMnLiIgJG5ld2JyYW5jaF0gIlxuXG4kZXJyIl0KKwkJCXJldHVybiAwCisJCX0KKwl9CisKKwlyZXR1cm4gMQorfQorCittZXRob2QgX2NoZWNrb3V0IHt9IHsKKwlpZiB7W2xvY2tfaW5kZXggY2hlY2tvdXRfb3BdfSB7CisJCWFmdGVyIGlkbGUgW2NiIF9zdGFydF9jaGVja291dF0KKwl9IGVsc2UgeworCQlfZXJyb3IgJHRoaXMgW21jICJTdGFnaW5nIGFyZWEgKGluZGV4KSBpcyBhbHJlYWR5IGxvY2tlZC4iXQorCQlkZWxldGVfdGhpcworCX0KK30KKworbWV0aG9kIF9zdGFydF9jaGVja291dCB7fSB7CisJZ2xvYmFsIEhFQUQgY29tbWl0X3R5cGUKKworCSMgLS0gT3VyIGluIG1lbW9yeSBzdGF0ZSBzaG91bGQgbWF0Y2ggdGhlIHJlcG9zaXRvcnkuCisJIworCXJlcG9zaXRvcnlfc3RhdGUgY3VyVHlwZSBjdXJIRUFEIGN1ck1FUkdFX0hFQUQKKwlpZiB7W3N0cmluZyBtYXRjaCBhbWVuZCogJGNvbW1pdF90eXBlXQorCQkmJiAkY3VyVHlwZSBlcSB7bm9ybWFsfQorCQkmJiAkY3VySEVBRCBlcSAkSEVBRH0geworCX0gZWxzZWlmIHskY29tbWl0X3R5cGUgbmUgJGN1clR5cGUgfHwgJEhFQUQgbmUgJGN1ckhFQUR9IHsKKwkJaW5mb19wb3B1cCBbbWMgIkxhc3Qgc2Nhbm5lZCBzdGF0ZSBkb2VzIG5vdCBtYXRjaCByZXBvc2l0b3J5IHN0YXRlLgorCitBbm90aGVyIEdpdCBwcm9ncmFtIGhhcyBtb2RpZmllZCB0aGlzIHJlcG9zaXRvcnkgc2luY2UgdGhlIGxhc3Qgc2Nhbi4gIEEgcmVzY2FuIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSB0aGUgY3VycmVudCBicmFuY2ggY2FuIGJlIGNoYW5nZWQuCisKK1RoZSByZXNjYW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgbm93LgorIl0KKwkJdW5sb2NrX2luZGV4CisJCXJlc2NhbiB1aV9yZWFkeQorCQlkZWxldGVfdGhpcworCQlyZXR1cm4KKwl9CisKKwlpZiB7JGN1ckhFQUQgZXEgJG5ld19oYXNofSB7CisJCV9hZnRlcl9yZWFkdHJlZSAkdGhpcworCX0gZWxzZWlmIHtbaXNfY29uZmlnX3RydWUgZ3VpLnRydXN0bXRpbWVdfSB7CisJCV9yZWFkdHJlZSAkdGhpcworCX0gZWxzZSB7CisJCXVpX3N0YXR1cyBbbWMgIlJlZnJlc2hpbmcgZmlsZSBzdGF0dXMuLi4iXQorCQlzZXQgZmQgW2dpdF9yZWFkIHVwZGF0ZS1pbmRleCBcCisJCQktcSBcCisJCQktLXVubWVyZ2VkIFwKKwkJCS0taWdub3JlLW1pc3NpbmcgXAorCQkJLS1yZWZyZXNoIFwKKwkJCV0KKwkJZmNvbmZpZ3VyZSAkZmQgLWJsb2NraW5nIDAgLXRyYW5zbGF0aW9uIGJpbmFyeQorCQlmaWxlZXZlbnQgJGZkIHJlYWRhYmxlIFtjYiBfcmVmcmVzaF93YWl0ICRmZF0KKwl9Cit9CisKK21ldGhvZCBfcmVmcmVzaF93YWl0IHtmZH0geworCXJlYWQgJGZkCisJaWYge1tlb2YgJGZkXX0geworCQljbG9zZSAkZmQKKwkJX3JlYWR0cmVlICR0aGlzCisJfQorfQorCittZXRob2QgX25hbWUge30geworCWlmIHskbmV3X3JlZiBlcSB7fX0geworCQlyZXR1cm4gW3N0cmluZyByYW5nZSAkbmV3X2hhc2ggMCA3XQorCX0KKworCXNldCByaCByZWZzL2hlYWRzLworCXNldCBybiBbc3RyaW5nIGxlbmd0aCAkcmhdCisJaWYge1tzdHJpbmcgZXF1YWwgLWxlbmd0aCAkcm4gJHJoICRuZXdfcmVmXX0geworCQlyZXR1cm4gW3N0cmluZyByYW5nZSAkbmV3X3JlZiAkcm4gZW5kXQorCX0gZWxzZSB7CisJCXJldHVybiAkbmV3X3JlZgorCX0KK30KKworbWV0aG9kIF9yZWFkdHJlZSB7fSB7CisJZ2xvYmFsIEhFQUQKKworCXNldCByZWFkdHJlZV9kIHt9CisJJDo6bWFpbl9zdGF0dXMgc3RhcnQgXAorCQlbbWMgIlVwZGF0aW5nIHdvcmtpbmcgZGlyZWN0b3J5IHRvICclcycuLi4iIFtfbmFtZSAkdGhpc11dIFwKKwkJW21jICJmaWxlcyBjaGVja2VkIG91dCJdCisKKwlzZXQgZmQgW2dpdF9yZWFkIC0tc3RkZXJyIHJlYWQtdHJlZSBcCisJCS1tIFwKKwkJLXUgXAorCQktdiBcCisJCS0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PS5naXRpZ25vcmUgXAorCQkkSEVBRCBcCisJCSRuZXdfaGFzaCBcCisJCV0KKwlmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gYmluYXJ5CisJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbY2IgX3JlYWR0cmVlX3dhaXQgJGZkXQorfQorCittZXRob2QgX3JlYWR0cmVlX3dhaXQge2ZkfSB7CisJZ2xvYmFsIGN1cnJlbnRfYnJhbmNoCisKKwlzZXQgYnVmIFtyZWFkICRmZF0KKwkkOjptYWluX3N0YXR1cyB1cGRhdGVfbWV0ZXIgJGJ1ZgorCWFwcGVuZCByZWFkdHJlZV9kICRidWYKKworCWZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAxCisJaWYgeyFbZW9mICRmZF19IHsKKwkJZmNvbmZpZ3VyZSAkZmQgLWJsb2NraW5nIDAKKwkJcmV0dXJuCisJfQorCisJaWYge1tjYXRjaCB7Y2xvc2UgJGZkfV19IHsKKwkJc2V0IGVyciAkcmVhZHRyZWVfZAorCQlyZWdzdWIge15mYXRhbDogfSAkZXJyIHt9IGVycgorCQkkOjptYWluX3N0YXR1cyBzdG9wIFttYyAiQWJvcnRlZCBjaGVja291dCBvZiAnJXMnIChmaWxlIGxldmVsIG1lcmdpbmcgaXMgcmVxdWlyZWQpLiIgW19uYW1lICR0aGlzXV0KKwkJd2Fybl9wb3B1cCBbc3RyY2F0IFttYyAiRmlsZSBsZXZlbCBtZXJnZSByZXF1aXJlZC4iXSAiCisKKyRlcnIKKworIiBbbWMgIlN0YXlpbmcgb24gYnJhbmNoICclcycuIiAkY3VycmVudF9icmFuY2hdXQorCQl1bmxvY2tfaW5kZXgKKwkJZGVsZXRlX3RoaXMKKwkJcmV0dXJuCisJfQorCisJJDo6bWFpbl9zdGF0dXMgc3RvcAorCV9hZnRlcl9yZWFkdHJlZSAkdGhpcworfQorCittZXRob2QgX2FmdGVyX3JlYWR0cmVlIHt9IHsKKwlnbG9iYWwgc2VsZWN0ZWRfY29tbWl0X3R5cGUgY29tbWl0X3R5cGUgSEVBRCBNRVJHRV9IRUFEIFBBUkVOVAorCWdsb2JhbCBjdXJyZW50X2JyYW5jaCBpc19kZXRhY2hlZAorCWdsb2JhbCB1aV9jb21tCisKKwlzZXQgbmFtZSBbX25hbWUgJHRoaXNdCisJc2V0IGxvZyAiY2hlY2tvdXQ6IG1vdmluZyIKKwlpZiB7ISRpc19kZXRhY2hlZH0geworCQlhcHBlbmQgbG9nICIgZnJvbSAkY3VycmVudF9icmFuY2giCisJfQorCisJIyAtLSBNb3ZlL2NyZWF0ZSBIRUFEIGFzIGEgc3ltYm9saWMgcmVmLiAgQ29yZSBnaXQgZG9lcyBub3QKKwkjICAgIGV2ZW4gY2hlY2sgZm9yIGZhaWx1cmUgaGVyZSwgaXQgSnVzdCBXb3Jrcyh0bSkuICBJZiBpdAorCSMgICAgZG9lc24ndCB3ZSBhcmUgaW4gc29tZSByZWFsbHkgdWdseSBzdGF0ZSB0aGF0IGlzIGRpZmZpY3VsdAorCSMgICAgdG8gcmVjb3ZlciBmcm9tIHdpdGhpbiBnaXQtZ3VpLgorCSMKKwlzZXQgcmggcmVmcy9oZWFkcy8KKwlzZXQgcm4gW3N0cmluZyBsZW5ndGggJHJoXQorCWlmIHtbc3RyaW5nIGVxdWFsIC1sZW5ndGggJHJuICRyaCAkbmV3X3JlZl19IHsKKwkJc2V0IG5ld19icmFuY2ggW3N0cmluZyByYW5nZSAkbmV3X3JlZiAkcm4gZW5kXQorCQlpZiB7JGlzX2RldGFjaGVkIHx8ICRjdXJyZW50X2JyYW5jaCBuZSAkbmV3X2JyYW5jaH0geworCQkJYXBwZW5kIGxvZyAiIHRvICRuZXdfYnJhbmNoIgorCQkJaWYge1tjYXRjaCB7CisJCQkJCWdpdCBzeW1ib2xpYy1yZWYgLW0gJGxvZyBIRUFEICRuZXdfcmVmCisJCQkJfSBlcnJdfSB7CisJCQkJX2ZhdGFsICR0aGlzICRlcnIKKwkJCX0KKwkJCXNldCBjdXJyZW50X2JyYW5jaCAkbmV3X2JyYW5jaAorCQkJc2V0IGlzX2RldGFjaGVkIDAKKwkJfQorCX0gZWxzZSB7CisJCWlmIHshJGlzX2RldGFjaGVkIHx8ICRuZXdfaGFzaCBuZSAkSEVBRH0geworCQkJYXBwZW5kIGxvZyAiIHRvICRuZXdfZXhwciIKKwkJCWlmIHtbY2F0Y2ggeworCQkJCQlfZGV0YWNoX0hFQUQgJGxvZyAkbmV3X2hhc2gKKwkJCQl9IGVycl19IHsKKwkJCQlfZmF0YWwgJHRoaXMgJGVycgorCQkJfQorCQl9CisJCXNldCBjdXJyZW50X2JyYW5jaCBIRUFECisJCXNldCBpc19kZXRhY2hlZCAxCisJfQorCisJIyAtLSBXZSBoYWQgdG8gZGVmZXIgdXBkYXRpbmcgdGhlIGJyYW5jaCBpdHNlbGYgdW50aWwgd2UKKwkjICAgIGtuZXcgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdvdWxkIHVwZGF0ZS4gIFNvIG5vdyB3ZQorCSMgICAgbmVlZCB0byBmaW5pc2ggdGhhdCB3b3JrLiAgSWYgaXQgZmFpbHMgd2UncmUgaW4gYmlnCisJIyAgICB0cm91YmxlLgorCSMKKwlpZiB7JHVwZGF0ZV9vbGQgbmUge319IHsKKwkJaWYge1tjYXRjaCB7CisJCQkJZ2l0IHVwZGF0ZS1yZWYgXAorCQkJCQktbSAkcmVmbG9nX21zZyBcCisJCQkJCSRuZXdfcmVmIFwKKwkJCQkJJG5ld19oYXNoIFwKKwkJCQkJJHVwZGF0ZV9vbGQKKwkJCX0gZXJyXX0geworCQkJX2ZhdGFsICR0aGlzICRlcnIKKwkJfQorCX0KKworCWlmIHskaXNfZGV0YWNoZWR9IHsKKwkJaW5mb19wb3B1cCBbbWMgIllvdSBhcmUgbm8gbG9uZ2VyIG9uIGEgbG9jYWwgYnJhbmNoLgorCitJZiB5b3Ugd2FudGVkIHRvIGJlIG9uIGEgYnJhbmNoLCBjcmVhdGUgb25lIG5vdyBzdGFydGluZyBmcm9tICdUaGlzIERldGFjaGVkIENoZWNrb3V0Jy4iXQorCX0KKworCSMgLS0gVXBkYXRlIG91ciByZXBvc2l0b3J5IHN0YXRlLiAgSWYgd2Ugd2VyZSBwcmV2aW91c2x5IGluCisJIyAgICBhbWVuZCBtb2RlIHdlIG5lZWQgdG8gdG9zcyB0aGUgY3VycmVudCBidWZmZXIgYW5kIGRvIGEKKwkjICAgIGZ1bGwgcmVzY2FuIHRvIHVwZGF0ZSBvdXIgZmlsZSBsaXN0cy4gIElmIHdlIHdlcmVuJ3QgaW4KKwkjICAgIGFtZW5kIG1vZGUgb3VyIGZpbGUgbGlzdHMgYXJlIGFjY3VyYXRlIGFuZCB3ZSBjYW4gYXZvaWQKKwkjICAgIHRoZSByZXNjYW4uCisJIworCXVubG9ja19pbmRleAorCXNldCBzZWxlY3RlZF9jb21taXRfdHlwZSBuZXcKKwlpZiB7W3N0cmluZyBtYXRjaCBhbWVuZCogJGNvbW1pdF90eXBlXX0geworCQkkdWlfY29tbSBkZWxldGUgMC4wIGVuZAorCQkkdWlfY29tbSBlZGl0IHJlc2V0CisJCSR1aV9jb21tIGVkaXQgbW9kaWZpZWQgZmFsc2UKKwkJcmVzY2FuIFtsaXN0IHVpX3N0YXR1cyBbbWMgIkNoZWNrZWQgb3V0ICclcycuIiAkbmFtZV1dCisJfSBlbHNlIHsKKwkJcmVwb3NpdG9yeV9zdGF0ZSBjb21taXRfdHlwZSBIRUFEIE1FUkdFX0hFQUQKKwkJc2V0IFBBUkVOVCAkSEVBRAorCQl1aV9zdGF0dXMgW21jICJDaGVja2VkIG91dCAnJXMnLiIgJG5hbWVdCisJfQorCWRlbGV0ZV90aGlzCit9CisKK2dpdC12ZXJzaW9uIHByb2MgX2RldGFjaF9IRUFEIHtsb2cgbmV3fSB7CisJPj0gMS41LjMgeworCQlnaXQgdXBkYXRlLXJlZiAtLW5vLWRlcmVmIC1tICRsb2cgSEVBRCAkbmV3CisJfQorCWRlZmF1bHQgeworCQlzZXQgcCBbZ2l0ZGlyIEhFQURdCisJCWZpbGUgZGVsZXRlICRwCisJCXNldCBmZCBbb3BlbiAkcCB3XQorCQlmY29uZmlndXJlICRmZCAtdHJhbnNsYXRpb24gbGYgLWVuY29kaW5nIHV0Zi04CisJCXB1dHMgJGZkICRuZXcKKwkJY2xvc2UgJGZkCisJfQorfQorCittZXRob2QgX2NvbmZpcm1fcmVzZXQge2N1cn0geworCXNldCByZXNldF9vayAwCisJc2V0IG5hbWUgW19uYW1lICR0aGlzXQorCXNldCBnaXRrIFtsaXN0IGRvX2dpdGsgW2xpc3QgJGN1ciBeJG5ld19oYXNoXV0KKworCV90b3BsZXZlbCAkdGhpcyB7Q29uZmlybSBCcmFuY2ggUmVzZXR9CisJcGFjayBbbGFiZWwgJHcubXNnMSBcCisJCS1hbmNob3IgdyBcCisJCS1qdXN0aWZ5IGxlZnQgXAorCQktdGV4dCBbbWMgIlJlc2V0dGluZyAnJXMnIHRvICclcycgd2lsbCBsb3NlIHRoZSBmb2xsb3dpbmcgY29tbWl0czoiICRuYW1lICRuZXdfZXhwcl1cCisJCV0gLWFuY2hvciB3CisKKwlzZXQgbGlzdCAkdy5saXN0LmwKKwlmcmFtZSAkdy5saXN0CisJdGV4dCAkbGlzdCBcCisJCS1mb250IGZvbnRfZGlmZiBcCisJCS13aWR0aCA4MCBcCisJCS1oZWlnaHQgMTAgXAorCQktd3JhcCBub25lIFwKKwkJLXhzY3JvbGxjb21tYW5kIFtsaXN0ICR3Lmxpc3Quc2J4IHNldF0gXAorCQkteXNjcm9sbGNvbW1hbmQgW2xpc3QgJHcubGlzdC5zYnkgc2V0XQorCXNjcm9sbGJhciAkdy5saXN0LnNieCAtb3JpZW50IGggLWNvbW1hbmQgW2xpc3QgJGxpc3QgeHZpZXddCisJc2Nyb2xsYmFyICR3Lmxpc3Quc2J5IC1vcmllbnQgdiAtY29tbWFuZCBbbGlzdCAkbGlzdCB5dmlld10KKwlwYWNrICR3Lmxpc3Quc2J4IC1maWxsIHggLXNpZGUgYm90dG9tCisJcGFjayAkdy5saXN0LnNieSAtZmlsbCB5IC1zaWRlIHJpZ2h0CisJcGFjayAkbGlzdCAtZmlsbCBib3RoIC1leHBhbmQgMQorCXBhY2sgJHcubGlzdCAtZmlsbCBib3RoIC1leHBhbmQgMSAtcGFkeCA1IC1wYWR5IDUKKworCXBhY2sgW2xhYmVsICR3Lm1zZzIgXAorCQktYW5jaG9yIHcgXAorCQktanVzdGlmeSBsZWZ0IFwKKwkJLXRleHQgW21jICJSZWNvdmVyaW5nIGxvc3QgY29tbWl0cyBtYXkgbm90IGJlIGVhc3kuIl0gXAorCQldCisJcGFjayBbbGFiZWwgJHcubXNnMyBcCisJCS1hbmNob3IgdyBcCisJCS1qdXN0aWZ5IGxlZnQgXAorCQktdGV4dCBbbWMgIlJlc2V0ICclcyc/IiAkbmFtZV0gXAorCQldCisKKwlmcmFtZSAkdy5idXR0b25zCisJYnV0dG9uICR3LmJ1dHRvbnMudmlzdWFsaXplIFwKKwkJLXRleHQgW21jIFZpc3VhbGl6ZV0gXAorCQktY29tbWFuZCAkZ2l0aworCXBhY2sgJHcuYnV0dG9ucy52aXN1YWxpemUgLXNpZGUgbGVmdAorCWJ1dHRvbiAkdy5idXR0b25zLnJlc2V0IFwKKwkJLXRleHQgW21jIFJlc2V0XSBcCisJCS1jb21tYW5kICIKKwkJCXNldCBAcmVzZXRfb2sgMQorCQkJZGVzdHJveSAkdworCQkiCisJcGFjayAkdy5idXR0b25zLnJlc2V0IC1zaWRlIHJpZ2h0CisJYnV0dG9uICR3LmJ1dHRvbnMuY2FuY2VsIFwKKwkJLWRlZmF1bHQgYWN0aXZlIFwKKwkJLXRleHQgW21jIENhbmNlbF0gXAorCQktY29tbWFuZCBbbGlzdCBkZXN0cm95ICR3XQorCXBhY2sgJHcuYnV0dG9ucy5jYW5jZWwgLXNpZGUgcmlnaHQgLXBhZHggNQorCXBhY2sgJHcuYnV0dG9ucyAtc2lkZSBib3R0b20gLWZpbGwgeCAtcGFkeSAxMCAtcGFkeCAxMAorCisJc2V0IGZkIFtnaXRfcmVhZCByZXYtbGlzdCAtLXByZXR0eT1vbmVsaW5lICRjdXIgXiRuZXdfaGFzaF0KKwl3aGlsZSB7W2dldHMgJGZkIGxpbmVdID4gMH0geworCQlzZXQgYWJiciBbc3RyaW5nIHJhbmdlICRsaW5lIDAgN10KKwkJc2V0IHN1YmogW3N0cmluZyByYW5nZSAkbGluZSA0MSBlbmRdCisJCSRsaXN0IGluc2VydCBlbmQgIiRhYmJyICAkc3VialxuIgorCX0KKwljbG9zZSAkZmQKKwkkbGlzdCBjb25maWd1cmUgLXN0YXRlIGRpc2FibGVkCisKKwliaW5kICR3ICAgIDxLZXktdj4gJGdpdGsKKwliaW5kICR3IDxWaXNpYmlsaXR5PiAiCisJCWdyYWIgJHcKKwkJZm9jdXMgJHcuYnV0dG9ucy5jYW5jZWwKKwkiCisJYmluZCAkdyA8S2V5LVJldHVybj4gW2xpc3QgZGVzdHJveSAkd10KKwliaW5kICR3IDxLZXktRXNjYXBlPiBbbGlzdCBkZXN0cm95ICR3XQorCXRrd2FpdCB3aW5kb3cgJHcKKwlyZXR1cm4gJHJlc2V0X29rCit9CisKK21ldGhvZCBfZXJyb3Ige21zZ30geworCWlmIHtbd2luZm8gaXNtYXBwZWQgJHBhcmVudF93XX0geworCQlzZXQgcCAkcGFyZW50X3cKKwl9IGVsc2UgeworCQlzZXQgcCAuCisJfQorCisJdGtfbWVzc2FnZUJveCBcCisJCS1pY29uIGVycm9yIFwKKwkJLXR5cGUgb2sgXAorCQktdGl0bGUgW3dtIHRpdGxlICRwXSBcCisJCS1wYXJlbnQgJHAgXAorCQktbWVzc2FnZSAkbXNnCit9CisKK21ldGhvZCBfdG9wbGV2ZWwge3RpdGxlfSB7CisJcmVnc3ViIC1hbGwgezo6fSAkdGhpcyB7X199IHcKKwlzZXQgdyAuJHcKKworCWlmIHtbd2luZm8gaXNtYXBwZWQgJHBhcmVudF93XX0geworCQlzZXQgcCAkcGFyZW50X3cKKwl9IGVsc2UgeworCQlzZXQgcCAuCisJfQorCisJdG9wbGV2ZWwgJHcKKwl3bSB0aXRsZSAkdyAkdGl0bGUKKwl3bSBnZW9tZXRyeSAkdyAiK1t3aW5mbyByb290eCAkcF0rW3dpbmZvIHJvb3R5ICRwXSIKK30KKworbWV0aG9kIF9mYXRhbCB7ZXJyfSB7CisJZXJyb3JfcG9wdXAgW3N0cmNhdCBbbWMgIkZhaWxlZCB0byBzZXQgY3VycmVudCBicmFuY2guCisKK1RoaXMgd29ya2luZyBkaXJlY3RvcnkgaXMgb25seSBwYXJ0aWFsbHkgc3dpdGNoZWQuICBXZSBzdWNjZXNzZnVsbHkgdXBkYXRlZCB5b3VyIGZpbGVzLCBidXQgZmFpbGVkIHRvIHVwZGF0ZSBhbiBpbnRlcm5hbCBHaXQgZmlsZS4KKworVGhpcyBzaG91bGQgbm90IGhhdmUgb2NjdXJyZWQuICAlcyB3aWxsIG5vdyBjbG9zZSBhbmQgZ2l2ZSB1cC4iIFthcHBuYW1lXV0gIgorCiskZXJyIl0KKwlleGl0IDEKK30KKworfQpkaWZmIC0tZ2l0IGEvZ2l0LWd1aS9saWIvY2hvb3NlX2ZvbnQudGNsIGIvZ2l0LWd1aS9saWIvY2hvb3NlX2ZvbnQudGNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NDQzYjAKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtZ3VpL2xpYi9jaG9vc2VfZm9udC50Y2wKQEAgLTAsMCArMSwxNjggQEAKKyMgZ2l0LWd1aSBmb250IGNob29zZXIKKyMgQ29weXJpZ2h0IChDKSAyMDA3IFNoYXduIFBlYXJjZQorCitjbGFzcyBjaG9vc2VfZm9udCB7CisKK2ZpZWxkIHcKK2ZpZWxkIHdfZmFtaWx5ICAgIDsgIyBVSSB3aWRnZXQgb2YgYWxsIGtub3duIGZhbWlseSBuYW1lcworZmllbGQgd19leGFtcGxlICAgOyAjIEV4YW1wbGUgdG8gc2hvd2Nhc2UgdGhlIGNob3NlbiBmb250CisKK2ZpZWxkIGZfZmFtaWx5ICAgIDsgIyBDdXJyZW50bHkgY2hvc2VuIGZhbWlseSBuYW1lCitmaWVsZCBmX3NpemUgICAgICA7ICMgQ3VycmVudGx5IGNob3NlbiBwb2ludCBzaXplCisKK2ZpZWxkIHZfZmFtaWx5ICAgIDsgIyBOYW1lIG9mIGdsb2JhbCB2YXJpYWJsZSBmb3IgZmFtaWx5CitmaWVsZCB2X3NpemUgICAgICA7ICMgTmFtZSBvZiBnbG9iYWwgdmFyaWFibGUgZm9yIHNpemUKKwordmFyaWFibGUgYWxsX2ZhbWlsaWVzIFtsaXN0XSAgOyAjIEFsbCBmb250cyBrbm93biB0byBUaworCitjb25zdHJ1Y3RvciBwaWNrIHtwYXRoIHRpdGxlIGFfZmFtaWx5IGFfc2l6ZX0geworCXZhcmlhYmxlIGFsbF9mYW1pbGllcworCisJc2V0IHZfZmFtaWx5ICRhX2ZhbWlseQorCXNldCB2X3NpemUgJGFfc2l6ZQorCisJdXB2YXIgIzAgJHZfZmFtaWx5IHB2X2ZhbWlseQorCXVwdmFyICMwICR2X3NpemUgcHZfc2l6ZQorCisJc2V0IGZfZmFtaWx5ICRwdl9mYW1pbHkKKwlzZXQgZl9zaXplICRwdl9zaXplCisKKwltYWtlX3RvcGxldmVsIHRvcCB3CisJd20gdGl0bGUgJHRvcCAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogJHRpdGxlIgorCXdtIGdlb21ldHJ5ICR0b3AgIitbd2luZm8gcm9vdHggJHBhdGhdK1t3aW5mbyByb290eSAkcGF0aF0iCisKKwlsYWJlbCAkdy5oZWFkZXIgLXRleHQgJHRpdGxlIC1mb250IGZvbnRfdWlib2xkCisJcGFjayAkdy5oZWFkZXIgLXNpZGUgdG9wIC1maWxsIHgKKworCWZyYW1lICR3LmJ1dHRvbnMKKwlidXR0b24gJHcuYnV0dG9ucy5zZWxlY3QgXAorCQktdGV4dCBbbWMgU2VsZWN0XSBcCisJCS1kZWZhdWx0IGFjdGl2ZSBcCisJCS1jb21tYW5kIFtjYiBfc2VsZWN0XQorCWJ1dHRvbiAkdy5idXR0b25zLmNhbmNlbCBcCisJCS10ZXh0IFttYyBDYW5jZWxdIFwKKwkJLWNvbW1hbmQgW2xpc3QgZGVzdHJveSAkd10KKwlwYWNrICR3LmJ1dHRvbnMuc2VsZWN0IC1zaWRlIHJpZ2h0CisJcGFjayAkdy5idXR0b25zLmNhbmNlbCAtc2lkZSByaWdodCAtcGFkeCA1CisJcGFjayAkdy5idXR0b25zIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDEwIC1wYWR4IDEwCisKKwlmcmFtZSAkdy5pbm5lcgorCisJZnJhbWUgJHcuaW5uZXIuZmFtaWx5CisJbGFiZWwgJHcuaW5uZXIuZmFtaWx5LmwgXAorCQktdGV4dCBbbWMgIkZvbnQgRmFtaWx5Il0gXAorCQktYW5jaG9yIHcKKwlzZXQgd19mYW1pbHkgJHcuaW5uZXIuZmFtaWx5LnYKKwl0ZXh0ICR3X2ZhbWlseSBcCisJCS1iYWNrZ3JvdW5kIHdoaXRlIFwKKwkJLWZvcmVncm91bmQgYmxhY2sgXAorCQktYm9yZGVyd2lkdGggMSBcCisJCS1yZWxpZWYgc3Vua2VuIFwKKwkJLWN1cnNvciAkOjpjdXJzb3JfcHRyIFwKKwkJLXdyYXAgbm9uZSBcCisJCS13aWR0aCAzMCBcCisJCS1oZWlnaHQgMTAgXAorCQkteXNjcm9sbGNvbW1hbmQgW2xpc3QgJHcuaW5uZXIuZmFtaWx5LnNieSBzZXRdCisJcm1zZWxfdGFnICR3X2ZhbWlseQorCXNjcm9sbGJhciAkdy5pbm5lci5mYW1pbHkuc2J5IC1jb21tYW5kIFtsaXN0ICR3X2ZhbWlseSB5dmlld10KKwlwYWNrICR3LmlubmVyLmZhbWlseS5sIC1zaWRlIHRvcCAtZmlsbCB4CisJcGFjayAkdy5pbm5lci5mYW1pbHkuc2J5IC1zaWRlIHJpZ2h0IC1maWxsIHkKKwlwYWNrICR3X2ZhbWlseSAtZmlsbCBib3RoIC1leHBhbmQgMQorCisJZnJhbWUgJHcuaW5uZXIuc2l6ZQorCWxhYmVsICR3LmlubmVyLnNpemUubCBcCisJCS10ZXh0IFttYyAiRm9udCBTaXplIl0gXAorCQktYW5jaG9yIHcKKwlzcGluYm94ICR3LmlubmVyLnNpemUudiBcCisJCS10ZXh0dmFyaWFibGUgQGZfc2l6ZSBcCisJCS1mcm9tIDIgLXRvIDgwIC1pbmNyZW1lbnQgMSBcCisJCS13aWR0aCAzCisJYmluZCAkdy5pbm5lci5zaXplLnYgPEZvY3VzSW4+IHslVyBzZWxlY3Rpb24gcmFuZ2UgMCBlbmR9CisJcGFjayAkdy5pbm5lci5zaXplLmwgLWZpbGwgeCAtc2lkZSB0b3AKKwlwYWNrICR3LmlubmVyLnNpemUudiAtZmlsbCB4IC1wYWR4IDIKKworCWdyaWQgY29uZmlndXJlICR3LmlubmVyLmZhbWlseSAkdy5pbm5lci5zaXplIC1zdGlja3kgbnNldworCWdyaWQgcm93Y29uZmlndXJlICR3LmlubmVyIDAgLXdlaWdodCAxCisJZ3JpZCBjb2x1bW5jb25maWd1cmUgJHcuaW5uZXIgMCAtd2VpZ2h0IDEKKwlwYWNrICR3LmlubmVyIC1maWxsIGJvdGggLWV4cGFuZCAxIC1wYWR4IDUgLXBhZHkgNQorCisJZnJhbWUgJHcuZXhhbXBsZQorCWxhYmVsICR3LmV4YW1wbGUubCBcCisJCS10ZXh0IFttYyAiRm9udCBFeGFtcGxlIl0gXAorCQktYW5jaG9yIHcKKwlzZXQgd19leGFtcGxlICR3LmV4YW1wbGUudAorCXRleHQgJHdfZXhhbXBsZSBcCisJCS1iYWNrZ3JvdW5kIHdoaXRlIFwKKwkJLWZvcmVncm91bmQgYmxhY2sgXAorCQktYm9yZGVyd2lkdGggMSBcCisJCS1yZWxpZWYgc3Vua2VuIFwKKwkJLWhlaWdodCAzIFwKKwkJLXdpZHRoIDQwCisJcm1zZWxfdGFnICR3X2V4YW1wbGUKKwkkd19leGFtcGxlIHRhZyBjb25mIGV4YW1wbGUgLWp1c3RpZnkgY2VudGVyCisJJHdfZXhhbXBsZSBpbnNlcnQgZW5kIFttYyAiVGhpcyBpcyBleGFtcGxlIHRleHQuXG5JZiB5b3UgbGlrZSB0aGlzIHRleHQsIGl0IGNhbiBiZSB5b3VyIGZvbnQuIl0gZXhhbXBsZQorCSR3X2V4YW1wbGUgY29uZiAtc3RhdGUgZGlzYWJsZWQKKwlwYWNrICR3LmV4YW1wbGUubCAtZmlsbCB4CisJcGFjayAkd19leGFtcGxlIC1maWxsIHgKKwlwYWNrICR3LmV4YW1wbGUgLWZpbGwgeCAtcGFkeCA1CisKKwlpZiB7JGFsbF9mYW1pbGllcyBlcSB7fX0geworCQlzZXQgYWxsX2ZhbWlsaWVzIFtsc29ydCBbZm9udCBmYW1pbGllc11dCisJfQorCisJJHdfZmFtaWx5IHRhZyBjb25mIHBpY2sKKwkkd19mYW1pbHkgdGFnIGJpbmQgcGljayA8QnV0dG9uLTE+IFtjYiBfcGlja19mYW1pbHkgJXggJXldXDticmVhaworCWZvcmVhY2ggZiAkYWxsX2ZhbWlsaWVzIHsKKwkJc2V0IHNlbCBbbGlzdCBwaWNrXQorCQlpZiB7JGYgZXEgJGZfZmFtaWx5fSB7CisJCQlsYXBwZW5kIHNlbCBpbl9zZWwKKwkJfQorCQkkd19mYW1pbHkgaW5zZXJ0IGVuZCAiJGZcbiIgJHNlbAorCX0KKwkkd19mYW1pbHkgY29uZiAtc3RhdGUgZGlzYWJsZWQKKwlfdXBkYXRlICR0aGlzCisKKwl0cmFjZSBhZGQgdmFyaWFibGUgQGZfc2l6ZSB3cml0ZSBbY2IgX3VwZGF0ZV0KKwliaW5kICR3IDxLZXktRXNjYXBlPiBbbGlzdCBkZXN0cm95ICR3XQorCWJpbmQgJHcgPEtleS1SZXR1cm4+IFtjYiBfc2VsZWN0XVw7YnJlYWsKKwliaW5kICR3IDxWaXNpYmlsaXR5PiAiCisJCWdyYWIgJHcKKwkJZm9jdXMgJHcKKwkiCisJdGt3YWl0IHdpbmRvdyAkdworfQorCittZXRob2QgX3NlbGVjdCB7fSB7CisJdXB2YXIgIzAgJHZfZmFtaWx5IHB2X2ZhbWlseQorCXVwdmFyICMwICR2X3NpemUgcHZfc2l6ZQorCisJc2V0IHB2X2ZhbWlseSAkZl9mYW1pbHkKKwlzZXQgcHZfc2l6ZSAkZl9zaXplCisKKwlkZXN0cm95ICR3Cit9CisKK21ldGhvZCBfcGlja19mYW1pbHkge3ggeX0geworCXZhcmlhYmxlIGFsbF9mYW1pbGllcworCisJc2V0IGkgW2xpbmRleCBbc3BsaXQgWyR3X2ZhbWlseSBpbmRleCBAJHgsJHldIC5dIDBdCisJc2V0IG4gW2xpbmRleCAkYWxsX2ZhbWlsaWVzIFtleHByIHskaSAtIDF9XV0KKwlpZiB7JG4gbmUge319IHsKKwkJJHdfZmFtaWx5IHRhZyByZW1vdmUgaW5fc2VsIDAuMCBlbmQKKwkJJHdfZmFtaWx5IHRhZyBhZGQgaW5fc2VsICRpLjAgW2V4cHIgeyRpICsgMX1dLjAKKwkJc2V0IGZfZmFtaWx5ICRuCisJCV91cGRhdGUgJHRoaXMKKwl9Cit9CisKK21ldGhvZCBfdXBkYXRlIHthcmdzfSB7CisJdmFyaWFibGUgYWxsX2ZhbWlsaWVzCisKKwlzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGFsbF9mYW1pbGllcyAkZl9mYW1pbHldCisJaWYgeyRpIDwgMH0gcmV0dXJuCisKKwkkd19leGFtcGxlIHRhZyBjb25mIGV4YW1wbGUgLWZvbnQgW2xpc3QgJGZfZmFtaWx5ICRmX3NpemVdCisJJHdfZmFtaWx5IHNlZSBbZXhwciB7JGkgKyAxfV0uMAorfQorCit9CmRpZmYgLS1naXQgYS9naXQtZ3VpL2xpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2wgYi9naXQtZ3VpL2xpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0YTRjZAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbApAQCAtMCwwICsxLDEwNDIgQEAKKyMgZ2l0LWd1aSBHaXQgcmVwb3NpdG9yeSBjaG9vc2VyCisjIENvcHlyaWdodCAoQykgMjAwNyBTaGF3biBQZWFyY2UKKworY2xhc3MgY2hvb3NlX3JlcG9zaXRvcnkgeworCitmaWVsZCB0b3AKK2ZpZWxkIHcKK2ZpZWxkIHdfYm9keSAgICAgIDsgIyBXaWRnZXQgaG9sZGluZyB0aGUgY2VudGVyIGNvbnRlbnQKK2ZpZWxkIHdfbmV4dCAgICAgIDsgIyBOZXh0IGJ1dHRvbgorZmllbGQgd19xdWl0ICAgICAgOyAjIFF1aXQgYnV0dG9uCitmaWVsZCBvX2NvbnMgICAgICA7ICMgQ29uc29sZSBvYmplY3QgKGlmIGFjdGl2ZSkKK2ZpZWxkIHdfdHlwZXMgICAgIDsgIyBMaXN0IG9mIHR5cGUgYnV0dG9ucyBpbiBjbG9uZQorZmllbGQgd19yZWNlbnRsaXN0IDsgIyBMaXN0Ym94IGNvbnRhaW5pbmcgcmVjZW50IHJlcG9zaXRvcmllcworZmllbGQgd19sb2NhbHBhdGggIDsgIyBFbnRyeSB3aWRnZXQgYm91bmQgdG8gbG9jYWxfcGF0aAorCitmaWVsZCBkb25lICAgICAgICAgICAgICAwIDsgIyBGaW5pc2hlZCBwaWNraW5nIHRoZSByZXBvc2l0b3J5PworZmllbGQgbG9jYWxfcGF0aCAgICAgICB7fSA7ICMgV2hlcmUgdGhpcyByZXBvc2l0b3J5IGlzIGxvY2FsbHkKK2ZpZWxkIG9yaWdpbl91cmwgICAgICAge30gOyAjIFdoZXJlIHdlIGFyZSBjbG9uaW5nIGZyb20KK2ZpZWxkIG9yaWdpbl9uYW1lICBvcmlnaW4gOyAjIFdoYXQgd2Ugc2hhbGwgY2FsbCAnb3JpZ2luJworZmllbGQgY2xvbmVfdHlwZSBoYXJkbGluayA7ICMgVHlwZSBvZiBjbG9uZSB0byBjb25zdHJ1Y3QKK2ZpZWxkIHJlYWR0cmVlX2VyciAgICAgICAgOyAjIEVycm9yIG91dHB1dCBmcm9tIHJlYWQtdHJlZSAoaWYgYW55KQorZmllbGQgc29ydGVkX3JlY2VudCAgICAgICA7ICMgcmVjZW50IHJlcG9zaXRvcmllcyAoc29ydGVkKQorCitjb25zdHJ1Y3RvciBwaWNrIHt9IHsKKwlnbG9iYWwgTTFUIE0xQgorCisJbWFrZV90b3BsZXZlbCB0b3AgdworCXdtIHRpdGxlICR0b3AgW21jICJHaXQgR3VpIl0KKworCWlmIHskdG9wIGVxIHsufX0geworCQltZW51ICR3Lm1iYXIgLXRlYXJvZmYgMAorCQkkdG9wIGNvbmZpZ3VyZSAtbWVudSAkdy5tYmFyCisKKwkJc2V0IG1fcmVwbyAkdy5tYmFyLnJlcG9zaXRvcnkKKwkJJHcubWJhciBhZGQgY2FzY2FkZSBcCisJCQktbGFiZWwgW21jIFJlcG9zaXRvcnldIFwKKwkJCS1tZW51ICRtX3JlcG8KKwkJbWVudSAkbV9yZXBvCisKKwkJaWYge1tpc19NYWNPU1hdfSB7CisJCQkkdy5tYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBBcHBsZSAtbWVudSAubWJhci5hcHBsZQorCQkJbWVudSAkdy5tYmFyLmFwcGxlCisJCQkkdy5tYmFyLmFwcGxlIGFkZCBjb21tYW5kIFwKKwkJCQktbGFiZWwgW21jICJBYm91dCAlcyIgW2FwcG5hbWVdXSBcCisJCQkJLWNvbW1hbmQgZG9fYWJvdXQKKwkJfSBlbHNlIHsKKwkJCSR3Lm1iYXIgYWRkIGNhc2NhZGUgLWxhYmVsIFttYyBIZWxwXSAtbWVudSAkdy5tYmFyLmhlbHAKKwkJCW1lbnUgJHcubWJhci5oZWxwCisJCQkkdy5tYmFyLmhlbHAgYWRkIGNvbW1hbmQgXAorCQkJCS1sYWJlbCBbbWMgIkFib3V0ICVzIiBbYXBwbmFtZV1dIFwKKwkJCQktY29tbWFuZCBkb19hYm91dAorCQl9CisKKwkJd20gcHJvdG9jb2wgJHRvcCBXTV9ERUxFVEVfV0lORE9XIGV4aXQKKwkJYmluZCAkdG9wIDwkTTFCLXE+IGV4aXQKKwkJYmluZCAkdG9wIDwkTTFCLVE+IGV4aXQKKwkJYmluZCAkdG9wIDxLZXktRXNjYXBlPiBleGl0CisJfSBlbHNlIHsKKwkJd20gZ2VvbWV0cnkgJHRvcCAiK1t3aW5mbyByb290eCAuXStbd2luZm8gcm9vdHkgLl0iCisJCWJpbmQgJHRvcCA8S2V5LUVzY2FwZT4gW2xpc3QgZGVzdHJveSAkdG9wXQorCQlzZXQgbV9yZXBvIHt9CisJfQorCisJcGFjayBbZ2l0X2xvZ28gJHcuZ2l0X2xvZ29dIC1zaWRlIGxlZnQgLWZpbGwgeSAtcGFkeCAxMCAtcGFkeSAxMAorCisJc2V0IHdfYm9keSAkdy5ib2R5CisJc2V0IG9wdHMgJHdfYm9keS5vcHRpb25zCisJZnJhbWUgJHdfYm9keQorCXRleHQgJG9wdHMgXAorCQktY3Vyc29yICQ6OmN1cnNvcl9wdHIgXAorCQktcmVsaWVmIGZsYXQgXAorCQktYmFja2dyb3VuZCBbJHdfYm9keSBjZ2V0IC1iYWNrZ3JvdW5kXSBcCisJCS13cmFwIG5vbmUgXAorCQktc3BhY2luZzEgNSBcCisJCS13aWR0aCA1MCBcCisJCS1oZWlnaHQgMworCXBhY2sgJG9wdHMgLWFuY2hvciB3IC1maWxsIHgKKworCSRvcHRzIHRhZyBjb25mIGxpbmtfbmV3IC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCisJJG9wdHMgdGFnIGJpbmQgbGlua19uZXcgPDE+IFtjYiBfbmV4dCBuZXddCisJJG9wdHMgaW5zZXJ0IGVuZCBbbWMgIkNyZWF0ZSBOZXcgUmVwb3NpdG9yeSJdIGxpbmtfbmV3CisJJG9wdHMgaW5zZXJ0IGVuZCAiXG4iCisJaWYgeyRtX3JlcG8gbmUge319IHsKKwkJJG1fcmVwbyBhZGQgY29tbWFuZCBcCisJCQktY29tbWFuZCBbY2IgX25leHQgbmV3XSBcCisJCQktYWNjZWxlcmF0b3IgJE0xVC1OIFwKKwkJCS1sYWJlbCBbbWMgIk5ldy4uLiJdCisJCWJpbmQgJHRvcCA8JE0xQi1uPiBbY2IgX25leHQgbmV3XQorCQliaW5kICR0b3AgPCRNMUItTj4gW2NiIF9uZXh0IG5ld10KKwl9CisKKwkkb3B0cyB0YWcgY29uZiBsaW5rX2Nsb25lIC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCisJJG9wdHMgdGFnIGJpbmQgbGlua19jbG9uZSA8MT4gW2NiIF9uZXh0IGNsb25lXQorCSRvcHRzIGluc2VydCBlbmQgW21jICJDbG9uZSBFeGlzdGluZyBSZXBvc2l0b3J5Il0gbGlua19jbG9uZQorCSRvcHRzIGluc2VydCBlbmQgIlxuIgorCWlmIHskbV9yZXBvIG5lIHt9fSB7CisJCSRtX3JlcG8gYWRkIGNvbW1hbmQgXAorCQkJLWNvbW1hbmQgW2NiIF9uZXh0IGNsb25lXSBcCisJCQktYWNjZWxlcmF0b3IgJE0xVC1DIFwKKwkJCS1sYWJlbCBbbWMgIkNsb25lLi4uIl0KKwkJYmluZCAkdG9wIDwkTTFCLWM+IFtjYiBfbmV4dCBjbG9uZV0KKwkJYmluZCAkdG9wIDwkTTFCLUM+IFtjYiBfbmV4dCBjbG9uZV0KKwl9CisKKwkkb3B0cyB0YWcgY29uZiBsaW5rX29wZW4gLWZvcmVncm91bmQgYmx1ZSAtdW5kZXJsaW5lIDEKKwkkb3B0cyB0YWcgYmluZCBsaW5rX29wZW4gPDE+IFtjYiBfbmV4dCBvcGVuXQorCSRvcHRzIGluc2VydCBlbmQgW21jICJPcGVuIEV4aXN0aW5nIFJlcG9zaXRvcnkiXSBsaW5rX29wZW4KKwkkb3B0cyBpbnNlcnQgZW5kICJcbiIKKwlpZiB7JG1fcmVwbyBuZSB7fX0geworCQkkbV9yZXBvIGFkZCBjb21tYW5kIFwKKwkJCS1jb21tYW5kIFtjYiBfbmV4dCBvcGVuXSBcCisJCQktYWNjZWxlcmF0b3IgJE0xVC1PIFwKKwkJCS1sYWJlbCBbbWMgIk9wZW4uLi4iXQorCQliaW5kICR0b3AgPCRNMUItbz4gW2NiIF9uZXh0IG9wZW5dCisJCWJpbmQgJHRvcCA8JE0xQi1PPiBbY2IgX25leHQgb3Blbl0KKwl9CisKKwkkb3B0cyBjb25mIC1zdGF0ZSBkaXNhYmxlZAorCisJc2V0IHNvcnRlZF9yZWNlbnQgW19nZXRfcmVjZW50cmVwb3NdCisJaWYge1tsbGVuZ3RoICRzb3J0ZWRfcmVjZW50XSA+IDB9IHsKKwkJaWYgeyRtX3JlcG8gbmUge319IHsKKwkJCSRtX3JlcG8gYWRkIHNlcGFyYXRvcgorCQkJJG1fcmVwbyBhZGQgY29tbWFuZCBcCisJCQkJLXN0YXRlIGRpc2FibGVkIFwKKwkJCQktbGFiZWwgW21jICJSZWNlbnQgUmVwb3NpdG9yaWVzIl0KKwkJfQorCisJCWxhYmVsICR3X2JvZHkuc3BhY2UKKwkJbGFiZWwgJHdfYm9keS5yZWNlbnRsYWJlbCBcCisJCQktYW5jaG9yIHcgXAorCQkJLXRleHQgW21jICJPcGVuIFJlY2VudCBSZXBvc2l0b3J5OiJdCisJCXNldCB3X3JlY2VudGxpc3QgJHdfYm9keS5yZWNlbnRsaXN0CisJCXRleHQgJHdfcmVjZW50bGlzdCBcCisJCQktY3Vyc29yICQ6OmN1cnNvcl9wdHIgXAorCQkJLXJlbGllZiBmbGF0IFwKKwkJCS1iYWNrZ3JvdW5kIFskd19ib2R5LnJlY2VudGxhYmVsIGNnZXQgLWJhY2tncm91bmRdIFwKKwkJCS13cmFwIG5vbmUgXAorCQkJLXdpZHRoIDUwIFwKKwkJCS1oZWlnaHQgMTAKKwkJJHdfcmVjZW50bGlzdCB0YWcgY29uZiBsaW5rIFwKKwkJCS1mb3JlZ3JvdW5kIGJsdWUgXAorCQkJLXVuZGVybGluZSAxCisJCXNldCBob21lICQ6OmVudihIT01FKQorCQlpZiB7W2lzX0N5Z3dpbl19IHsKKwkJCXNldCBob21lIFtleGVjIGN5Z3BhdGggLS13aW5kb3dzIC0tYWJzb2x1dGUgJGhvbWVdCisJCX0KKwkJc2V0IGhvbWUgIltmaWxlIG5vcm1hbGl6ZSAkaG9tZV0vIgorCQlzZXQgaGxlbiBbc3RyaW5nIGxlbmd0aCAkaG9tZV0KKwkJZm9yZWFjaCBwICRzb3J0ZWRfcmVjZW50IHsKKwkJCXNldCBwYXRoICRwCisJCQlpZiB7W3N0cmluZyBlcXVhbCAtbGVuZ3RoICRobGVuICRob21lICRwXX0geworCQkJCXNldCBwICJ+L1tzdHJpbmcgcmFuZ2UgJHAgJGhsZW4gZW5kXSIKKwkJCX0KKwkJCXJlZ3N1YiAtYWxsICJcbiIgJHAgIlxcbiIgcAorCQkJJHdfcmVjZW50bGlzdCBpbnNlcnQgZW5kICRwIGxpbmsKKwkJCSR3X3JlY2VudGxpc3QgaW5zZXJ0IGVuZCAiXG4iCisKKwkJCWlmIHskbV9yZXBvIG5lIHt9fSB7CisJCQkJJG1fcmVwbyBhZGQgY29tbWFuZCBcCisJCQkJCS1jb21tYW5kIFtjYiBfb3Blbl9yZWNlbnRfcGF0aCAkcGF0aF0gXAorCQkJCQktbGFiZWwgIiAgICAkcCIKKwkJCX0KKwkJfQorCQkkd19yZWNlbnRsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCisJCSR3X3JlY2VudGxpc3QgdGFnIGJpbmQgbGluayA8MT4gW2NiIF9vcGVuX3JlY2VudCAleCwleV0KKwkJcGFjayAkd19ib2R5LnNwYWNlIC1hbmNob3IgdyAtZmlsbCB4CisJCXBhY2sgJHdfYm9keS5yZWNlbnRsYWJlbCAtYW5jaG9yIHcgLWZpbGwgeAorCQlwYWNrICR3X3JlY2VudGxpc3QgLWFuY2hvciB3IC1maWxsIHgKKwl9CisJcGFjayAkd19ib2R5IC1maWxsIHggLXBhZHggMTAgLXBhZHkgMTAKKworCWZyYW1lICR3LmJ1dHRvbnMKKwlzZXQgd19uZXh0ICR3LmJ1dHRvbnMubmV4dAorCXNldCB3X3F1aXQgJHcuYnV0dG9ucy5xdWl0CisJYnV0dG9uICR3X3F1aXQgXAorCQktdGV4dCBbbWMgIlF1aXQiXSBcCisJCS1jb21tYW5kIGV4aXQKKwlwYWNrICR3X3F1aXQgLXNpZGUgcmlnaHQgLXBhZHggNQorCXBhY2sgJHcuYnV0dG9ucyAtc2lkZSBib3R0b20gLWZpbGwgeCAtcGFkeCAxMCAtcGFkeSAxMAorCisJaWYgeyRtX3JlcG8gbmUge319IHsKKwkJJG1fcmVwbyBhZGQgc2VwYXJhdG9yCisJCSRtX3JlcG8gYWRkIGNvbW1hbmQgXAorCQkJLWxhYmVsIFttYyBRdWl0XSBcCisJCQktY29tbWFuZCBleGl0IFwKKwkJCS1hY2NlbGVyYXRvciAkTTFULVEKKwl9CisKKwliaW5kICR0b3AgPFJldHVybj4gW2NiIF9pbnZva2VfbmV4dF0KKwliaW5kICR0b3AgPFZpc2liaWxpdHk+ICIKKwkJW2NiIF9jZW50ZXJdCisJCWdyYWIgJHRvcAorCQlmb2N1cyAkdG9wCisJCWJpbmQgJHRvcCA8VmlzaWJpbGl0eT4ge30KKwkiCisJd20gZGVpY29uaWZ5ICR0b3AKKwl0a3dhaXQgdmFyaWFibGUgQGRvbmUKKworCWlmIHskdG9wIGVxIHsufX0geworCQlldmFsIGRlc3Ryb3kgW3dpbmZvIGNoaWxkcmVuICR0b3BdCisJfQorfQorCitwcm9jIF9ob21lIHt9IHsKKwlpZiB7W2NhdGNoIHtzZXQgaCAkOjplbnYoSE9NRSl9XQorCQl8fCAhW2ZpbGUgaXNkaXJlY3RvcnkgJGhdfSB7CisJCXNldCBoIC4KKwl9CisJcmV0dXJuICRoCit9CisKK21ldGhvZCBfY2VudGVyIHt9IHsKKwlzZXQgbnggW3dpbmZvIHJlcXdpZHRoICR0b3BdCisJc2V0IG55IFt3aW5mbyByZXFoZWlnaHQgJHRvcF0KKwlzZXQgcnggW2V4cHIgeyhbd2luZm8gc2NyZWVud2lkdGggICR0b3BdIC0gJG54KSAvIDN9XQorCXNldCByeSBbZXhwciB7KFt3aW5mbyBzY3JlZW5oZWlnaHQgJHRvcF0gLSAkbnkpIC8gM31dCisJd20gZ2VvbWV0cnkgJHRvcCBbZm9ybWF0IHsrJWQrJWR9ICRyeCAkcnldCit9CisKK21ldGhvZCBfaW52b2tlX25leHQge30geworCWlmIHtbd2luZm8gZXhpc3RzICR3X25leHRdfSB7CisJCXVwbGV2ZWwgIzAgWyR3X25leHQgY2dldCAtY29tbWFuZF0KKwl9Cit9CisKK3Byb2MgX2dldF9yZWNlbnRyZXBvcyB7fSB7CisJc2V0IHJlY2VudCBbbGlzdF0KKwlmb3JlYWNoIHAgW2dldF9jb25maWcgZ3VpLnJlY2VudHJlcG9dIHsKKwkJaWYge1tfaXNfZ2l0IFtmaWxlIGpvaW4gJHAgLmdpdF1dfSB7CisJCQlsYXBwZW5kIHJlY2VudCAkcAorCQl9CisJfQorCXJldHVybiBbbHNvcnQgJHJlY2VudF0KK30KKworcHJvYyBfdW5zZXRfcmVjZW50cmVwbyB7cH0geworCXJlZ3N1YiAtYWxsIC0tIHsoWygpXFtcXXt9XC5eJCsqP1xcXSl9ICRwIHtcXFwxfSBwCisJZ2l0IGNvbmZpZyAtLWdsb2JhbCAtLXVuc2V0IGd1aS5yZWNlbnRyZXBvICJeJHBcJCIKK30KKworcHJvYyBfYXBwZW5kX3JlY2VudHJlcG9zIHtwYXRofSB7CisJc2V0IHBhdGggW2ZpbGUgbm9ybWFsaXplICRwYXRoXQorCXNldCByZWNlbnQgW2dldF9jb25maWcgZ3VpLnJlY2VudHJlcG9dCisKKwlpZiB7W2xpbmRleCAkcmVjZW50IGVuZF0gZXEgJHBhdGh9IHsKKwkJcmV0dXJuCisJfQorCisJc2V0IGkgW2xzZWFyY2ggJHJlY2VudCAkcGF0aF0KKwlpZiB7JGkgPj0gMH0geworCQlfdW5zZXRfcmVjZW50cmVwbyAkcGF0aAorCQlzZXQgcmVjZW50IFtscmVwbGFjZSAkcmVjZW50ICRpICRpXQorCX0KKworCWxhcHBlbmQgcmVjZW50ICRwYXRoCisJZ2l0IGNvbmZpZyAtLWdsb2JhbCAtLWFkZCBndWkucmVjZW50cmVwbyAkcGF0aAorCisJd2hpbGUge1tsbGVuZ3RoICRyZWNlbnRdID4gMTB9IHsKKwkJX3Vuc2V0X3JlY2VudHJlcG8gW2xpbmRleCAkcmVjZW50IDBdCisJCXNldCByZWNlbnQgW2xyYW5nZSAkcmVjZW50IDEgZW5kXQorCX0KK30KKworbWV0aG9kIF9vcGVuX3JlY2VudCB7eHl9IHsKKwlzZXQgaWQgW2xpbmRleCBbc3BsaXQgWyR3X3JlY2VudGxpc3QgaW5kZXggQCR4eV0gLl0gMF0KKwlzZXQgbG9jYWxfcGF0aCBbbGluZGV4ICRzb3J0ZWRfcmVjZW50IFtleHByIHskaWQgLSAxfV1dCisJX2RvX29wZW4yICR0aGlzCit9CisKK21ldGhvZCBfb3Blbl9yZWNlbnRfcGF0aCB7cH0geworCXNldCBsb2NhbF9wYXRoICRwCisJX2RvX29wZW4yICR0aGlzCit9CisKK21ldGhvZCBfbmV4dCB7YWN0aW9ufSB7CisJZGVzdHJveSAkd19ib2R5CisJaWYgeyFbd2luZm8gZXhpc3RzICR3X25leHRdfSB7CisJCWJ1dHRvbiAkd19uZXh0IC1kZWZhdWx0IGFjdGl2ZQorCQlwYWNrICR3X25leHQgLXNpZGUgcmlnaHQgLXBhZHggNSAtYmVmb3JlICR3X3F1aXQKKwl9CisJX2RvXyRhY3Rpb24gJHRoaXMKK30KKworbWV0aG9kIF93cml0ZV9sb2NhbF9wYXRoIHthcmdzfSB7CisJaWYgeyRsb2NhbF9wYXRoIGVxIHt9fSB7CisJCSR3X25leHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKKwl9IGVsc2UgeworCQkkd19uZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAorCX0KK30KKworbWV0aG9kIF9naXRfaW5pdCB7fSB7CisJaWYge1tjYXRjaCB7ZmlsZSBta2RpciAkbG9jYWxfcGF0aH0gZXJyXX0geworCQllcnJvcl9wb3B1cCBbc3RyY2F0IFwKKwkJCVttYyAiRmFpbGVkIHRvIGNyZWF0ZSByZXBvc2l0b3J5ICVzOiIgJGxvY2FsX3BhdGhdIFwKKwkJCSJcblxuJGVyciJdCisJCXJldHVybiAwCisJfQorCisJaWYge1tjYXRjaCB7Y2QgJGxvY2FsX3BhdGh9IGVycl19IHsKKwkJZXJyb3JfcG9wdXAgW3N0cmNhdCBcCisJCQlbbWMgIkZhaWxlZCB0byBjcmVhdGUgcmVwb3NpdG9yeSAlczoiICRsb2NhbF9wYXRoXSBcCisJCQkiXG5cbiRlcnIiXQorCQlyZXR1cm4gMAorCX0KKworCWlmIHtbY2F0Y2gge2dpdCBpbml0fSBlcnJdfSB7CisJCWVycm9yX3BvcHVwIFtzdHJjYXQgXAorCQkJW21jICJGYWlsZWQgdG8gY3JlYXRlIHJlcG9zaXRvcnkgJXM6IiAkbG9jYWxfcGF0aF0gXAorCQkJIlxuXG4kZXJyIl0KKwkJcmV0dXJuIDAKKwl9CisKKwlfYXBwZW5kX3JlY2VudHJlcG9zIFtwd2RdCisJc2V0IDo6X2dpdGRpciAuZ2l0CisJc2V0IDo6X3ByZWZpeCB7fQorCXJldHVybiAxCit9CisKK3Byb2MgX2lzX2dpdCB7cGF0aH0geworCWlmIHtbZmlsZSBleGlzdHMgW2ZpbGUgam9pbiAkcGF0aCBIRUFEXV0KKwkgJiYgW2ZpbGUgZXhpc3RzIFtmaWxlIGpvaW4gJHBhdGggb2JqZWN0c11dCisJICYmIFtmaWxlIGV4aXN0cyBbZmlsZSBqb2luICRwYXRoIGNvbmZpZ11dfSB7CisJCXJldHVybiAxCisJfQorCWlmIHtbaXNfQ3lnd2luXX0geworCQlpZiB7W2ZpbGUgZXhpc3RzIFtmaWxlIGpvaW4gJHBhdGggSEVBRF1dCisJCSAmJiBbZmlsZSBleGlzdHMgW2ZpbGUgam9pbiAkcGF0aCBvYmplY3RzLmxua11dCisJCSAmJiBbZmlsZSBleGlzdHMgW2ZpbGUgam9pbiAkcGF0aCBjb25maWcubG5rXV19IHsKKwkJCXJldHVybiAxCisJCX0KKwl9CisJcmV0dXJuIDAKK30KKworcHJvYyBfb2JqZGlyIHtwYXRofSB7CisJc2V0IG9iamRpciBbZmlsZSBqb2luICRwYXRoIC5naXQgb2JqZWN0c10KKwlpZiB7W2ZpbGUgaXNkaXJlY3RvcnkgJG9iamRpcl19IHsKKwkJcmV0dXJuICRvYmpkaXIKKwl9CisKKwlzZXQgb2JqZGlyIFtmaWxlIGpvaW4gJHBhdGggb2JqZWN0c10KKwlpZiB7W2ZpbGUgaXNkaXJlY3RvcnkgJG9iamRpcl19IHsKKwkJcmV0dXJuICRvYmpkaXIKKwl9CisKKwlpZiB7W2lzX0N5Z3dpbl19IHsKKwkJc2V0IG9iamRpciBbZmlsZSBqb2luICRwYXRoIC5naXQgb2JqZWN0cy5sbmtdCisJCWlmIHtbZmlsZSBpc2ZpbGUgJG9iamRpcl19IHsKKwkJCXJldHVybiBbd2luMzJfcmVhZF9sbmsgJG9iamRpcl0KKwkJfQorCisJCXNldCBvYmpkaXIgW2ZpbGUgam9pbiAkcGF0aCBvYmplY3RzLmxua10KKwkJaWYge1tmaWxlIGlzZmlsZSAkb2JqZGlyXX0geworCQkJcmV0dXJuIFt3aW4zMl9yZWFkX2xuayAkb2JqZGlyXQorCQl9CisJfQorCisJcmV0dXJuIHt9Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjCisjIyBDcmVhdGUgTmV3IFJlcG9zaXRvcnkKKworbWV0aG9kIF9kb19uZXcge30geworCSR3X25leHQgY29uZiBcCisJCS1zdGF0ZSBkaXNhYmxlZCBcCisJCS1jb21tYW5kIFtjYiBfZG9fbmV3Ml0gXAorCQktdGV4dCBbbWMgIkNyZWF0ZSJdCisKKwlmcmFtZSAkd19ib2R5CisJbGFiZWwgJHdfYm9keS5oIFwKKwkJLWZvbnQgZm9udF91aWJvbGQgXAorCQktdGV4dCBbbWMgIkNyZWF0ZSBOZXcgUmVwb3NpdG9yeSJdCisJcGFjayAkd19ib2R5LmggLXNpZGUgdG9wIC1maWxsIHggLXBhZHkgMTAKKwlwYWNrICR3X2JvZHkgLWZpbGwgeCAtcGFkeCAxMAorCisJZnJhbWUgJHdfYm9keS53aGVyZQorCWxhYmVsICR3X2JvZHkud2hlcmUubCAtdGV4dCBbbWMgIkRpcmVjdG9yeToiXQorCWVudHJ5ICR3X2JvZHkud2hlcmUudCBcCisJCS10ZXh0dmFyaWFibGUgQGxvY2FsX3BhdGggXAorCQktZm9udCBmb250X2RpZmYgXAorCQktd2lkdGggNTAKKwlidXR0b24gJHdfYm9keS53aGVyZS5iIFwKKwkJLXRleHQgW21jICJCcm93c2UiXSBcCisJCS1jb21tYW5kIFtjYiBfbmV3X2xvY2FsX3BhdGhdCisJc2V0IHdfbG9jYWxwYXRoICR3X2JvZHkud2hlcmUudAorCisJcGFjayAkd19ib2R5LndoZXJlLmIgLXNpZGUgcmlnaHQKKwlwYWNrICR3X2JvZHkud2hlcmUubCAtc2lkZSBsZWZ0CisJcGFjayAkd19ib2R5LndoZXJlLnQgLWZpbGwgeAorCXBhY2sgJHdfYm9keS53aGVyZSAtZmlsbCB4CisKKwl0cmFjZSBhZGQgdmFyaWFibGUgQGxvY2FsX3BhdGggd3JpdGUgW2NiIF93cml0ZV9sb2NhbF9wYXRoXQorCWJpbmQgJHdfYm9keS5oIDxEZXN0cm95PiBbbGlzdCB0cmFjZSByZW1vdmUgdmFyaWFibGUgQGxvY2FsX3BhdGggd3JpdGUgW2NiIF93cml0ZV9sb2NhbF9wYXRoXV0KKwl1cGRhdGUKKwlmb2N1cyAkd19ib2R5LndoZXJlLnQKK30KKworbWV0aG9kIF9uZXdfbG9jYWxfcGF0aCB7fSB7CisJaWYgeyRsb2NhbF9wYXRoIG5lIHt9fSB7CisJCXNldCBwIFtmaWxlIGRpcm5hbWUgJGxvY2FsX3BhdGhdCisJfSBlbHNlIHsKKwkJc2V0IHAgW19ob21lXQorCX0KKworCXNldCBwIFt0a19jaG9vc2VEaXJlY3RvcnkgXAorCQktaW5pdGlhbGRpciAkcCBcCisJCS1wYXJlbnQgJHRvcCBcCisJCS10aXRsZSBbbWMgIkdpdCBSZXBvc2l0b3J5Il0gXAorCQktbXVzdGV4aXN0IGZhbHNlXQorCWlmIHskcCBlcSB7fX0gcmV0dXJuCisKKwlzZXQgcCBbZmlsZSBub3JtYWxpemUgJHBdCisJaWYgeyFbX25ld19vayAkcF19IHsKKwkJcmV0dXJuCisJfQorCXNldCBsb2NhbF9wYXRoICRwCisJJHdfbG9jYWxwYXRoIGljdXJzb3IgZW5kCit9CisKK21ldGhvZCBfZG9fbmV3MiB7fSB7CisJaWYgeyFbX25ld19vayAkbG9jYWxfcGF0aF19IHsKKwkJcmV0dXJuCisJfQorCWlmIHshW19naXRfaW5pdCAkdGhpc119IHsKKwkJcmV0dXJuCisJfQorCXNldCBkb25lIDEKK30KKworcHJvYyBfbmV3X29rIHtwfSB7CisJaWYge1tmaWxlIGlzZGlyZWN0b3J5ICRwXX0geworCQlpZiB7W19pc19naXQgW2ZpbGUgam9pbiAkcCAuZ2l0XV19IHsKKwkJCWVycm9yX3BvcHVwIFttYyAiRGlyZWN0b3J5ICVzIGFscmVhZHkgZXhpc3RzLiIgJHBdCisJCQlyZXR1cm4gMAorCQl9CisJfSBlbHNlaWYge1tmaWxlIGV4aXN0cyAkcF19IHsKKwkJZXJyb3JfcG9wdXAgW21jICJGaWxlICVzIGFscmVhZHkgZXhpc3RzLiIgJHBdCisJCXJldHVybiAwCisJfQorCXJldHVybiAxCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjCisjIyBDbG9uZSBFeGlzdGluZyBSZXBvc2l0b3J5CisKK21ldGhvZCBfZG9fY2xvbmUge30geworCSR3X25leHQgY29uZiBcCisJCS1zdGF0ZSBkaXNhYmxlZCBcCisJCS1jb21tYW5kIFtjYiBfZG9fY2xvbmUyXSBcCisJCS10ZXh0IFttYyAiQ2xvbmUiXQorCisJZnJhbWUgJHdfYm9keQorCWxhYmVsICR3X2JvZHkuaCBcCisJCS1mb250IGZvbnRfdWlib2xkIFwKKwkJLXRleHQgW21jICJDbG9uZSBFeGlzdGluZyBSZXBvc2l0b3J5Il0KKwlwYWNrICR3X2JvZHkuaCAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeSAxMAorCXBhY2sgJHdfYm9keSAtZmlsbCB4IC1wYWR4IDEwCisKKwlzZXQgYXJncyAkd19ib2R5LmFyZ3MKKwlmcmFtZSAkd19ib2R5LmFyZ3MKKwlwYWNrICRhcmdzIC1maWxsIGJvdGgKKworCWxhYmVsICRhcmdzLm9yaWdpbl9sIC10ZXh0IFttYyAiVVJMOiJdCisJZW50cnkgJGFyZ3Mub3JpZ2luX3QgXAorCQktdGV4dHZhcmlhYmxlIEBvcmlnaW5fdXJsIFwKKwkJLWZvbnQgZm9udF9kaWZmIFwKKwkJLXdpZHRoIDUwCisJYnV0dG9uICRhcmdzLm9yaWdpbl9iIFwKKwkJLXRleHQgW21jICJCcm93c2UiXSBcCisJCS1jb21tYW5kIFtjYiBfb3Blbl9vcmlnaW5dCisJZ3JpZCAkYXJncy5vcmlnaW5fbCAkYXJncy5vcmlnaW5fdCAkYXJncy5vcmlnaW5fYiAtc3RpY2t5IGV3CisKKwlsYWJlbCAkYXJncy53aGVyZV9sIC10ZXh0IFttYyAiRGlyZWN0b3J5OiJdCisJZW50cnkgJGFyZ3Mud2hlcmVfdCBcCisJCS10ZXh0dmFyaWFibGUgQGxvY2FsX3BhdGggXAorCQktZm9udCBmb250X2RpZmYgXAorCQktd2lkdGggNTAKKwlidXR0b24gJGFyZ3Mud2hlcmVfYiBcCisJCS10ZXh0IFttYyAiQnJvd3NlIl0gXAorCQktY29tbWFuZCBbY2IgX25ld19sb2NhbF9wYXRoXQorCWdyaWQgJGFyZ3Mud2hlcmVfbCAkYXJncy53aGVyZV90ICRhcmdzLndoZXJlX2IgLXN0aWNreSBldworCXNldCB3X2xvY2FscGF0aCAkYXJncy53aGVyZV90CisKKwlsYWJlbCAkYXJncy50eXBlX2wgLXRleHQgW21jICJDbG9uZSBUeXBlOiJdCisJZnJhbWUgJGFyZ3MudHlwZV9mCisJc2V0IHdfdHlwZXMgW2xpc3RdCisJbGFwcGVuZCB3X3R5cGVzIFtyYWRpb2J1dHRvbiAkYXJncy50eXBlX2YuaGFyZGxpbmsgXAorCQktc3RhdGUgZGlzYWJsZWQgXAorCQktYW5jaG9yIHcgXAorCQktdGV4dCBbbWMgIlN0YW5kYXJkIChGYXN0LCBTZW1pLVJlZHVuZGFudCwgSGFyZGxpbmtzKSJdIFwKKwkJLXZhcmlhYmxlIEBjbG9uZV90eXBlIFwKKwkJLXZhbHVlIGhhcmRsaW5rXQorCWxhcHBlbmQgd190eXBlcyBbcmFkaW9idXR0b24gJGFyZ3MudHlwZV9mLmZ1bGwgXAorCQktc3RhdGUgZGlzYWJsZWQgXAorCQktYW5jaG9yIHcgXAorCQktdGV4dCBbbWMgIkZ1bGwgQ29weSAoU2xvd2VyLCBSZWR1bmRhbnQgQmFja3VwKSJdIFwKKwkJLXZhcmlhYmxlIEBjbG9uZV90eXBlIFwKKwkJLXZhbHVlIGZ1bGxdCisJbGFwcGVuZCB3X3R5cGVzIFtyYWRpb2J1dHRvbiAkYXJncy50eXBlX2Yuc2hhcmVkIFwKKwkJLXN0YXRlIGRpc2FibGVkIFwKKwkJLWFuY2hvciB3IFwKKwkJLXRleHQgW21jICJTaGFyZWQgKEZhc3Rlc3QsIE5vdCBSZWNvbW1lbmRlZCwgTm8gQmFja3VwKSJdIFwKKwkJLXZhcmlhYmxlIEBjbG9uZV90eXBlIFwKKwkJLXZhbHVlIHNoYXJlZF0KKwlmb3JlYWNoIHIgJHdfdHlwZXMgeworCQlwYWNrICRyIC1hbmNob3IgdworCX0KKwlncmlkICRhcmdzLnR5cGVfbCAkYXJncy50eXBlX2YgLXN0aWNreSBuZXcKKworCWdyaWQgY29sdW1uY29uZmlndXJlICRhcmdzIDEgLXdlaWdodCAxCisKKwl0cmFjZSBhZGQgdmFyaWFibGUgQGxvY2FsX3BhdGggd3JpdGUgW2NiIF91cGRhdGVfY2xvbmVdCisJdHJhY2UgYWRkIHZhcmlhYmxlIEBvcmlnaW5fdXJsIHdyaXRlIFtjYiBfdXBkYXRlX2Nsb25lXQorCWJpbmQgJHdfYm9keS5oIDxEZXN0cm95PiAiCisJCVtsaXN0IHRyYWNlIHJlbW92ZSB2YXJpYWJsZSBAbG9jYWxfcGF0aCB3cml0ZSBbY2IgX3VwZGF0ZV9jbG9uZV1dCisJCVtsaXN0IHRyYWNlIHJlbW92ZSB2YXJpYWJsZSBAb3JpZ2luX3VybCB3cml0ZSBbY2IgX3VwZGF0ZV9jbG9uZV1dCisJIgorCXVwZGF0ZQorCWZvY3VzICRhcmdzLm9yaWdpbl90Cit9CisKK21ldGhvZCBfb3Blbl9vcmlnaW4ge30geworCWlmIHskb3JpZ2luX3VybCBuZSB7fSAmJiBbZmlsZSBpc2RpcmVjdG9yeSAkb3JpZ2luX3VybF19IHsKKwkJc2V0IHAgJG9yaWdpbl91cmwKKwl9IGVsc2UgeworCQlzZXQgcCBbX2hvbWVdCisJfQorCisJc2V0IHAgW3RrX2Nob29zZURpcmVjdG9yeSBcCisJCS1pbml0aWFsZGlyICRwIFwKKwkJLXBhcmVudCAkdG9wIFwKKwkJLXRpdGxlIFttYyAiR2l0IFJlcG9zaXRvcnkiXSBcCisJCS1tdXN0ZXhpc3QgdHJ1ZV0KKwlpZiB7JHAgZXEge319IHJldHVybgorCisJc2V0IHAgW2ZpbGUgbm9ybWFsaXplICRwXQorCWlmIHshW19pc19naXQgW2ZpbGUgam9pbiAkcCAuZ2l0XV0gJiYgIVtfaXNfZ2l0ICRwXX0geworCQllcnJvcl9wb3B1cCBbbWMgIk5vdCBhIEdpdCByZXBvc2l0b3J5OiAlcyIgW2ZpbGUgdGFpbCAkcF1dCisJCXJldHVybgorCX0KKwlzZXQgb3JpZ2luX3VybCAkcAorfQorCittZXRob2QgX3VwZGF0ZV9jbG9uZSB7YXJnc30geworCWlmIHskbG9jYWxfcGF0aCBuZSB7fSAmJiAkb3JpZ2luX3VybCBuZSB7fX0geworCQkkd19uZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAorCX0gZWxzZSB7CisJCSR3X25leHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKKwl9CisKKwlpZiB7JG9yaWdpbl91cmwgbmUge30gJiYKKwkJKCAgW19pc19naXQgW2ZpbGUgam9pbiAkb3JpZ2luX3VybCAuZ2l0XV0KKwkJfHwgW19pc19naXQgJG9yaWdpbl91cmxdKX0geworCQlzZXQgZSBub3JtYWwKKwkJaWYge1tbbGluZGV4ICR3X3R5cGVzIDBdIGNnZXQgLXN0YXRlXSBlcSB7ZGlzYWJsZWR9fSB7CisJCQlzZXQgY2xvbmVfdHlwZSBoYXJkbGluaworCQl9CisJfSBlbHNlIHsKKwkJc2V0IGUgZGlzYWJsZWQKKwkJc2V0IGNsb25lX3R5cGUgZnVsbAorCX0KKworCWZvcmVhY2ggciAkd190eXBlcyB7CisJCSRyIGNvbmYgLXN0YXRlICRlCisJfQorfQorCittZXRob2QgX2RvX2Nsb25lMiB7fSB7CisJaWYge1tmaWxlIGlzZGlyZWN0b3J5ICRvcmlnaW5fdXJsXX0geworCQlzZXQgb3JpZ2luX3VybCBbZmlsZSBub3JtYWxpemUgJG9yaWdpbl91cmxdCisJfQorCisJaWYgeyRjbG9uZV90eXBlIGVxIHtoYXJkbGlua30gJiYgIVtmaWxlIGlzZGlyZWN0b3J5ICRvcmlnaW5fdXJsXX0geworCQllcnJvcl9wb3B1cCBbbWMgIlN0YW5kYXJkIG9ubHkgYXZhaWxhYmxlIGZvciBsb2NhbCByZXBvc2l0b3J5LiJdCisJCXJldHVybgorCX0KKwlpZiB7JGNsb25lX3R5cGUgZXEge3NoYXJlZH0gJiYgIVtmaWxlIGlzZGlyZWN0b3J5ICRvcmlnaW5fdXJsXX0geworCQllcnJvcl9wb3B1cCBbbWMgIlNoYXJlZCBvbmx5IGF2YWlsYWJsZSBmb3IgbG9jYWwgcmVwb3NpdG9yeS4iXQorCQlyZXR1cm4KKwl9CisKKwlpZiB7JGNsb25lX3R5cGUgZXEge2hhcmRsaW5rfSB8fCAkY2xvbmVfdHlwZSBlcSB7c2hhcmVkfX0geworCQlzZXQgb2JqZGlyIFtfb2JqZGlyICRvcmlnaW5fdXJsXQorCQlpZiB7JG9iamRpciBlcSB7fX0geworCQkJZXJyb3JfcG9wdXAgW21jICJOb3QgYSBHaXQgcmVwb3NpdG9yeTogJXMiIFtmaWxlIHRhaWwgJG9yaWdpbl91cmxdXQorCQkJcmV0dXJuCisJCX0KKwl9CisKKwlzZXQgZ2l0dXJsICRvcmlnaW5fdXJsCisJaWYge1tpc19DeWd3aW5dICYmIFtmaWxlIGlzZGlyZWN0b3J5ICRnaXR1cmxdfSB7CisJCXNldCBnaXR1cmwgW2V4ZWMgY3lncGF0aCAtLXVuaXggLS1hYnNvbHV0ZSAkZ2l0dXJsXQorCQlpZiB7JGNsb25lX3R5cGUgZXEge3NoYXJlZH19IHsKKwkJCXNldCBvYmpkaXIgW2V4ZWMgY3lncGF0aCAtLXVuaXggLS1hYnNvbHV0ZSAkb2JqZGlyXQorCQl9CisJfQorCisJaWYge1tmaWxlIGV4aXN0cyAkbG9jYWxfcGF0aF19IHsKKwkJZXJyb3JfcG9wdXAgW21jICJMb2NhdGlvbiAlcyBhbHJlYWR5IGV4aXN0cy4iICRsb2NhbF9wYXRoXQorCQlyZXR1cm4KKwl9CisKKwlpZiB7IVtfZ2l0X2luaXQgJHRoaXNdfSByZXR1cm4KKwlzZXQgbG9jYWxfcGF0aCBbcHdkXQorCisJaWYge1tjYXRjaCB7CisJCQlnaXQgY29uZmlnIHJlbW90ZS4kb3JpZ2luX25hbWUudXJsICRnaXR1cmwKKwkJCWdpdCBjb25maWcgcmVtb3RlLiRvcmlnaW5fbmFtZS5mZXRjaCArcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy8kb3JpZ2luX25hbWUvKgorCQl9IGVycl19IHsKKwkJZXJyb3JfcG9wdXAgW3N0cmNhdCBbbWMgIkZhaWxlZCB0byBjb25maWd1cmUgb3JpZ2luIl0gIlxuXG4kZXJyIl0KKwkJcmV0dXJuCisJfQorCisJZGVzdHJveSAkd19ib2R5ICR3X25leHQKKworCXN3aXRjaCAtZXhhY3QgLS0gJGNsb25lX3R5cGUgeworCWhhcmRsaW5rIHsKKwkJc2V0IG9fY29ucyBbc3RhdHVzX2Jhcjo6dHdvX2xpbmUgJHdfYm9keV0KKwkJcGFjayAkd19ib2R5IC1maWxsIHggLXBhZHggMTAgLXBhZHkgMTAKKworCQkkb19jb25zIHN0YXJ0IFwKKwkJCVttYyAiQ291bnRpbmcgb2JqZWN0cyJdIFwKKwkJCVttYyAiYnVja2V0cyJdCisJCXVwZGF0ZQorCisJCWlmIHtbZmlsZSBleGlzdHMgW2ZpbGUgam9pbiAkb2JqZGlyIGluZm8gYWx0ZXJuYXRlc11dfSB7CisJCQlzZXQgcHdkIFtwd2RdCisJCQlpZiB7W2NhdGNoIHsKKwkJCQlmaWxlIG1rZGlyIFtnaXRkaXIgb2JqZWN0cyBpbmZvXQorCQkJCXNldCBmX2luIFtvcGVuIFtmaWxlIGpvaW4gJG9iamRpciBpbmZvIGFsdGVybmF0ZXNdIHJdCisJCQkJc2V0IGZfY3AgW29wZW4gW2dpdGRpciBvYmplY3RzIGluZm8gYWx0ZXJuYXRlc10gd10KKwkJCQlmY29uZmlndXJlICRmX2luIC10cmFuc2xhdGlvbiBiaW5hcnkgLWVuY29kaW5nIGJpbmFyeQorCQkJCWZjb25maWd1cmUgJGZfY3AgLXRyYW5zbGF0aW9uIGJpbmFyeSAtZW5jb2RpbmcgYmluYXJ5CisJCQkJY2QgJG9iamRpcgorCQkJCXdoaWxlIHtbZ2V0cyAkZl9pbiBsaW5lXSA+PSAwfSB7CisJCQkJCWlmIHtbaXNfQ3lnd2luXX0geworCQkJCQkJcHV0cyAkZl9jcCBbZXhlYyBjeWdwYXRoIC0tdW5peCAtLWFic29sdXRlICRsaW5lXQorCQkJCQl9IGVsc2UgeworCQkJCQkJcHV0cyAkZl9jcCBbZmlsZSBub3JtYWxpemUgJGxpbmVdCisJCQkJCX0KKwkJCQl9CisJCQkJY2xvc2UgJGZfaW4KKwkJCQljbG9zZSAkZl9jcAorCQkJCWNkICRwd2QKKwkJCX0gZXJyXX0geworCQkJCWNhdGNoIHtjZCAkcHdkfQorCQkJCV9jbG9uZV9mYWlsZWQgJHRoaXMgW21jICJVbmFibGUgdG8gY29weSBvYmplY3RzL2luZm8vYWx0ZXJuYXRlczogJXMiICRlcnJdCisJCQkJcmV0dXJuCisJCQl9CisJCX0KKworCQlzZXQgdG9saW5rICBbbGlzdF0KKwkJc2V0IGJ1Y2tldHMgW2dsb2IgXAorCQkJLXRhaWxzIFwKKwkJCS1ub2NvbXBsYWluIFwKKwkJCS1kaXJlY3RvcnkgW2ZpbGUgam9pbiAkb2JqZGlyXSA/P10KKwkJc2V0IGJjbnQgW2V4cHIge1tsbGVuZ3RoICRidWNrZXRzXSArIDJ9XQorCQlzZXQgYmN1ciAxCisJCSRvX2NvbnMgdXBkYXRlICRiY3VyICRiY250CisJCXVwZGF0ZQorCisJCWZpbGUgbWtkaXIgW2ZpbGUgam9pbiAuZ2l0IG9iamVjdHMgcGFja10KKwkJZm9yZWFjaCBpIFtnbG9iIC10YWlscyAtbm9jb21wbGFpbiBcCisJCQktZGlyZWN0b3J5IFtmaWxlIGpvaW4gJG9iamRpciBwYWNrXSAqXSB7CisJCQlsYXBwZW5kIHRvbGluayBbZmlsZSBqb2luIHBhY2sgJGldCisJCX0KKwkJJG9fY29ucyB1cGRhdGUgW2luY3IgYmN1cl0gJGJjbnQKKwkJdXBkYXRlCisKKwkJZm9yZWFjaCBpICRidWNrZXRzIHsKKwkJCWZpbGUgbWtkaXIgW2ZpbGUgam9pbiAuZ2l0IG9iamVjdHMgJGldCisJCQlmb3JlYWNoIGogW2dsb2IgLXRhaWxzIC1ub2NvbXBsYWluIFwKKwkJCQktZGlyZWN0b3J5IFtmaWxlIGpvaW4gJG9iamRpciAkaV0gKl0geworCQkJCWxhcHBlbmQgdG9saW5rIFtmaWxlIGpvaW4gJGkgJGpdCisJCQl9CisJCQkkb19jb25zIHVwZGF0ZSBbaW5jciBiY3VyXSAkYmNudAorCQkJdXBkYXRlCisJCX0KKwkJJG9fY29ucyBzdG9wCisKKwkJaWYgeyR0b2xpbmsgZXEge319IHsKKwkJCWluZm9fcG9wdXAgW3N0cmNhdCBcCisJCQkJW21jICJOb3RoaW5nIHRvIGNsb25lIGZyb20gJXMuIiAkb3JpZ2luX3VybF0gXAorCQkJCSJcbiIgXAorCQkJCVttYyAiVGhlICdtYXN0ZXInIGJyYW5jaCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIl0gXAorCQkJCV0KKwkJCWRlc3Ryb3kgJHdfYm9keQorCQkJc2V0IGRvbmUgMQorCQkJcmV0dXJuCisJCX0KKworCQlzZXQgaSBbbGluZGV4ICR0b2xpbmsgMF0KKwkJaWYge1tjYXRjaCB7CisJCQkJZmlsZSBsaW5rIC1oYXJkIFwKKwkJCQkJW2ZpbGUgam9pbiAuZ2l0IG9iamVjdHMgJGldIFwKKwkJCQkJW2ZpbGUgam9pbiAkb2JqZGlyICRpXQorCQkJfSBlcnJdfSB7CisJCQlpbmZvX3BvcHVwIFttYyAiSGFyZGxpbmtzIGFyZSB1bmF2YWlsYWJsZS4gIEZhbGxpbmcgYmFjayB0byBjb3B5aW5nLiJdCisJCQlzZXQgaSBbX2NvcHlfZmlsZXMgJHRoaXMgJG9iamRpciAkdG9saW5rXQorCQl9IGVsc2UgeworCQkJc2V0IGkgW19saW5rX2ZpbGVzICR0aGlzICRvYmpkaXIgW2xyYW5nZSAkdG9saW5rIDEgZW5kXV0KKwkJfQorCQlpZiB7ISRpfSByZXR1cm4KKworCQlkZXN0cm95ICR3X2JvZHkKKwl9CisJZnVsbCB7CisJCXNldCBvX2NvbnMgW2NvbnNvbGU6OmVtYmVkIFwKKwkJCSR3X2JvZHkgXAorCQkJW21jICJDbG9uaW5nIGZyb20gJXMiICRvcmlnaW5fdXJsXV0KKwkJcGFjayAkd19ib2R5IC1maWxsIGJvdGggLWV4cGFuZCAxIC1wYWR4IDEwCisJCSRvX2NvbnMgZXhlYyBcCisJCQlbbGlzdCBnaXQgZmV0Y2ggLS1uby10YWdzIC1rICRvcmlnaW5fbmFtZV0gXAorCQkJW2NiIF9kb19jbG9uZV90YWdzXQorCX0KKwlzaGFyZWQgeworCQlzZXQgZmQgW29wZW4gW2dpdGRpciBvYmplY3RzIGluZm8gYWx0ZXJuYXRlc10gd10KKwkJZmNvbmZpZ3VyZSAkZmQgLXRyYW5zbGF0aW9uIGJpbmFyeQorCQlwdXRzICRmZCAkb2JqZGlyCisJCWNsb3NlICRmZAorCX0KKwl9CisKKwlpZiB7JGNsb25lX3R5cGUgZXEge2hhcmRsaW5rfSB8fCAkY2xvbmVfdHlwZSBlcSB7c2hhcmVkfX0geworCQlpZiB7IVtfY2xvbmVfcmVmcyAkdGhpc119IHJldHVybgorCQlzZXQgcHdkIFtwd2RdCisJCWlmIHtbY2F0Y2ggeworCQkJCWNkICRvcmlnaW5fdXJsCisJCQkJc2V0IEhFQUQgW2dpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRF4wXQorCQkJfSBlcnJdfSB7CisJCQlfY2xvbmVfZmFpbGVkICR0aGlzIFttYyAiTm90IGEgR2l0IHJlcG9zaXRvcnk6ICVzIiBbZmlsZSB0YWlsICRvcmlnaW5fdXJsXV0KKwkJCXJldHVybiAwCisJCX0KKwkJY2QgJHB3ZAorCQlfZG9fY2xvbmVfY2hlY2tvdXQgJHRoaXMgJEhFQUQKKwl9Cit9CisKK21ldGhvZCBfY29weV9maWxlcyB7b2JqZGlyIHRvY29weX0geworCSRvX2NvbnMgc3RhcnQgXAorCQlbbWMgIkNvcHlpbmcgb2JqZWN0cyJdIFwKKwkJW21jICJLaUIiXQorCXNldCB0b3QgMAorCXNldCBjbXAgMAorCWZvcmVhY2ggcCAkdG9jb3B5IHsKKwkJaW5jciB0b3QgW2ZpbGUgc2l6ZSBbZmlsZSBqb2luICRvYmpkaXIgJHBdXQorCX0KKwlmb3JlYWNoIHAgJHRvY29weSB7CisJCWlmIHtbY2F0Y2ggeworCQkJCXNldCBmX2luIFtvcGVuIFtmaWxlIGpvaW4gJG9iamRpciAkcF0gcl0KKwkJCQlzZXQgZl9jcCBbb3BlbiBbZmlsZSBqb2luIC5naXQgb2JqZWN0cyAkcF0gd10KKwkJCQlmY29uZmlndXJlICRmX2luIC10cmFuc2xhdGlvbiBiaW5hcnkgLWVuY29kaW5nIGJpbmFyeQorCQkJCWZjb25maWd1cmUgJGZfY3AgLXRyYW5zbGF0aW9uIGJpbmFyeSAtZW5jb2RpbmcgYmluYXJ5CisKKwkJCQl3aGlsZSB7IVtlb2YgJGZfaW5dfSB7CisJCQkJCWluY3IgY21wIFtmY29weSAkZl9pbiAkZl9jcCAtc2l6ZSAxNjM4NF0KKwkJCQkJJG9fY29ucyB1cGRhdGUgXAorCQkJCQkJW2V4cHIgeyRjbXAgLyAxMDI0fV0gXAorCQkJCQkJW2V4cHIgeyR0b3QgLyAxMDI0fV0KKwkJCQkJdXBkYXRlCisJCQkJfQorCisJCQkJY2xvc2UgJGZfaW4KKwkJCQljbG9zZSAkZl9jcAorCQkJfSBlcnJdfSB7CisJCQlfY2xvbmVfZmFpbGVkICR0aGlzIFttYyAiVW5hYmxlIHRvIGNvcHkgb2JqZWN0OiAlcyIgJGVycl0KKwkJCXJldHVybiAwCisJCX0KKwl9CisJcmV0dXJuIDEKK30KKworbWV0aG9kIF9saW5rX2ZpbGVzIHtvYmpkaXIgdG9saW5rfSB7CisJc2V0IHRvdGFsIFtsbGVuZ3RoICR0b2xpbmtdCisJJG9fY29ucyBzdGFydCBcCisJCVttYyAiTGlua2luZyBvYmplY3RzIl0gXAorCQlbbWMgIm9iamVjdHMiXQorCWZvciB7c2V0IGkgMH0geyRpIDwgJHRvdGFsfSB7fSB7CisJCXNldCBwIFtsaW5kZXggJHRvbGluayAkaV0KKwkJaWYge1tjYXRjaCB7CisJCQkJZmlsZSBsaW5rIC1oYXJkIFwKKwkJCQkJW2ZpbGUgam9pbiAuZ2l0IG9iamVjdHMgJHBdIFwKKwkJCQkJW2ZpbGUgam9pbiAkb2JqZGlyICRwXQorCQkJfSBlcnJdfSB7CisJCQlfY2xvbmVfZmFpbGVkICR0aGlzIFttYyAiVW5hYmxlIHRvIGhhcmRsaW5rIG9iamVjdDogJXMiICRlcnJdCisJCQlyZXR1cm4gMAorCQl9CisKKwkJaW5jciBpCisJCWlmIHskaSAlIDUgPT0gMH0geworCQkJJG9fY29ucyB1cGRhdGUgJGkgJHRvdGFsCisJCQl1cGRhdGUKKwkJfQorCX0KKwlyZXR1cm4gMQorfQorCittZXRob2QgX2Nsb25lX3JlZnMge30geworCXNldCBwd2QgW3B3ZF0KKwlpZiB7W2NhdGNoIHtjZCAkb3JpZ2luX3VybH0gZXJyXX0geworCQllcnJvcl9wb3B1cCBbbWMgIk5vdCBhIEdpdCByZXBvc2l0b3J5OiAlcyIgW2ZpbGUgdGFpbCAkb3JpZ2luX3VybF1dCisJCXJldHVybiAwCisJfQorCXNldCBmZF9pbiBbZ2l0X3JlYWQgZm9yLWVhY2gtcmVmIFwKKwkJLS10Y2wgXAorCQl7LS1mb3JtYXQ9bGlzdCAlKHJlZm5hbWUpICUob2JqZWN0bmFtZSkgJSgqb2JqZWN0bmFtZSl9XQorCWNkICRwd2QKKworCXNldCBmZCBbb3BlbiBbZ2l0ZGlyIHBhY2tlZC1yZWZzXSB3XQorCWZjb25maWd1cmUgJGZkIC10cmFuc2xhdGlvbiBiaW5hcnkKKwlwdXRzICRmZCAiIyBwYWNrLXJlZnMgd2l0aDogcGVlbGVkIgorCXdoaWxlIHtbZ2V0cyAkZmRfaW4gbGluZV0gPj0gMH0geworCQlzZXQgbGluZSBbZXZhbCAkbGluZV0KKwkJc2V0IHJlZm4gW2xpbmRleCAkbGluZSAwXQorCQlzZXQgcm9iaiBbbGluZGV4ICRsaW5lIDFdCisJCXNldCB0b2JqIFtsaW5kZXggJGxpbmUgMl0KKworCQlpZiB7W3JlZ3N1YiBecmVmcy9oZWFkcy8gJHJlZm4gXAorCQkJInJlZnMvcmVtb3Rlcy8kb3JpZ2luX25hbWUvIiByZWZuXX0geworCQkJcHV0cyAkZmQgIiRyb2JqICRyZWZuIgorCQl9IGVsc2VpZiB7W3N0cmluZyBtYXRjaCByZWZzL3RhZ3MvKiAkcmVmbl19IHsKKwkJCXB1dHMgJGZkICIkcm9iaiAkcmVmbiIKKwkJCWlmIHskdG9iaiBuZSB7fX0geworCQkJCXB1dHMgJGZkICJeJHRvYmoiCisJCQl9CisJCX0KKwl9CisJY2xvc2UgJGZkX2luCisJY2xvc2UgJGZkCisJcmV0dXJuIDEKK30KKworbWV0aG9kIF9kb19jbG9uZV90YWdzIHtva30geworCWlmIHskb2t9IHsKKwkJJG9fY29ucyBleGVjIFwKKwkJCVtsaXN0IGdpdCBmZXRjaCAtLXRhZ3MgLWsgJG9yaWdpbl9uYW1lXSBcCisJCQlbY2IgX2RvX2Nsb25lX0hFQURdCisJfSBlbHNlIHsKKwkJJG9fY29ucyBkb25lICRvaworCQlfY2xvbmVfZmFpbGVkICR0aGlzIFttYyAiQ2Fubm90IGZldGNoIGJyYW5jaGVzIGFuZCBvYmplY3RzLiAgU2VlIGNvbnNvbGUgb3V0cHV0IGZvciBkZXRhaWxzLiJdCisJfQorfQorCittZXRob2QgX2RvX2Nsb25lX0hFQUQge29rfSB7CisJaWYgeyRva30geworCQkkb19jb25zIGV4ZWMgXAorCQkJW2xpc3QgZ2l0IGZldGNoICRvcmlnaW5fbmFtZSBIRUFEXSBcCisJCQlbY2IgX2RvX2Nsb25lX2Z1bGxfZW5kXQorCX0gZWxzZSB7CisJCSRvX2NvbnMgZG9uZSAkb2sKKwkJX2Nsb25lX2ZhaWxlZCAkdGhpcyBbbWMgIkNhbm5vdCBmZXRjaCB0YWdzLiAgU2VlIGNvbnNvbGUgb3V0cHV0IGZvciBkZXRhaWxzLiJdCisJfQorfQorCittZXRob2QgX2RvX2Nsb25lX2Z1bGxfZW5kIHtva30geworCSRvX2NvbnMgZG9uZSAkb2sKKworCWlmIHskb2t9IHsKKwkJZGVzdHJveSAkd19ib2R5CisKKwkJc2V0IEhFQUQge30KKwkJaWYge1tmaWxlIGV4aXN0cyBbZ2l0ZGlyIEZFVENIX0hFQURdXX0geworCQkJc2V0IGZkIFtvcGVuIFtnaXRkaXIgRkVUQ0hfSEVBRF0gcl0KKwkJCXdoaWxlIHtbZ2V0cyAkZmQgbGluZV0gPj0gMH0geworCQkJCWlmIHtbcmVnZXhwICJeKC57NDB9KVx0XHQiICRsaW5lIGxpbmUgSEVBRF19IHsKKwkJCQkJYnJlYWsKKwkJCQl9CisJCQl9CisJCQljbG9zZSAkZmQKKwkJfQorCisJCWNhdGNoIHtnaXQgcGFjay1yZWZzfQorCQlfZG9fY2xvbmVfY2hlY2tvdXQgJHRoaXMgJEhFQUQKKwl9IGVsc2UgeworCQlfY2xvbmVfZmFpbGVkICR0aGlzIFttYyAiQ2Fubm90IGRldGVybWluZSBIRUFELiAgU2VlIGNvbnNvbGUgb3V0cHV0IGZvciBkZXRhaWxzLiJdCisJfQorfQorCittZXRob2QgX2Nsb25lX2ZhaWxlZCB7e3doeSB7fX19IHsKKwlpZiB7W2NhdGNoIHtmaWxlIGRlbGV0ZSAtZm9yY2UgJGxvY2FsX3BhdGh9IGVycl19IHsKKwkJc2V0IHdoeSBbc3RyY2F0IFwKKwkJCSR3aHkgXAorCQkJIlxuXG4iIFwKKwkJCVttYyAiVW5hYmxlIHRvIGNsZWFudXAgJXMiICRsb2NhbF9wYXRoXSBcCisJCQkiXG5cbiIgXAorCQkJJGVycl0KKwl9CisJaWYgeyR3aHkgbmUge319IHsKKwkJdXBkYXRlCisJCWVycm9yX3BvcHVwIFtzdHJjYXQgW21jICJDbG9uZSBmYWlsZWQuIl0gIlxuIiAkd2h5XQorCX0KK30KKworbWV0aG9kIF9kb19jbG9uZV9jaGVja291dCB7SEVBRH0geworCWlmIHskSEVBRCBlcSB7fX0geworCQlpbmZvX3BvcHVwIFtzdHJjYXQgXAorCQkJW21jICJObyBkZWZhdWx0IGJyYW5jaCBvYnRhaW5lZC4iXSBcCisJCQkiXG4iIFwKKwkJCVttYyAiVGhlICdtYXN0ZXInIGJyYW5jaCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIl0gXAorCQkJXQorCQlzZXQgZG9uZSAxCisJCXJldHVybgorCX0KKwlpZiB7W2NhdGNoIHsKKwkJCWdpdCB1cGRhdGUtcmVmIEhFQUQgJEhFQUReMAorCQl9IGVycl19IHsKKwkJaW5mb19wb3B1cCBbc3RyY2F0IFwKKwkJCVttYyAiQ2Fubm90IHJlc29sdmUgJXMgYXMgYSBjb21taXQuIiAkSEVBRF4wXSBcCisJCQkiXG4gICRlcnIiIFwKKwkJCSJcbiIgXAorCQkJW21jICJUaGUgJ21hc3RlcicgYnJhbmNoIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4iXSBcCisJCQldCisJCXNldCBkb25lIDEKKwkJcmV0dXJuCisJfQorCisJc2V0IG9fY29ucyBbc3RhdHVzX2Jhcjo6dHdvX2xpbmUgJHdfYm9keV0KKwlwYWNrICR3X2JvZHkgLWZpbGwgeCAtcGFkeCAxMCAtcGFkeSAxMAorCSRvX2NvbnMgc3RhcnQgXAorCQlbbWMgIkNyZWF0aW5nIHdvcmtpbmcgZGlyZWN0b3J5Il0gXAorCQlbbWMgImZpbGVzIl0KKworCXNldCByZWFkdHJlZV9lcnIge30KKwlzZXQgZmQgW2dpdF9yZWFkIC0tc3RkZXJyIHJlYWQtdHJlZSBcCisJCS1tIFwKKwkJLXUgXAorCQktdiBcCisJCUhFQUQgXAorCQlIRUFEIFwKKwkJXQorCWZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkKKwlmaWxlZXZlbnQgJGZkIHJlYWRhYmxlIFtjYiBfcmVhZHRyZWVfd2FpdCAkZmRdCit9CisKK21ldGhvZCBfcmVhZHRyZWVfd2FpdCB7ZmR9IHsKKwlzZXQgYnVmIFtyZWFkICRmZF0KKwkkb19jb25zIHVwZGF0ZV9tZXRlciAkYnVmCisJYXBwZW5kIHJlYWR0cmVlX2VyciAkYnVmCisKKwlmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMQorCWlmIHshW2VvZiAkZmRdfSB7CisJCWZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwCisJCXJldHVybgorCX0KKworCWlmIHtbY2F0Y2gge2Nsb3NlICRmZH1dfSB7CisJCXNldCBlcnIgJHJlYWR0cmVlX2VycgorCQlyZWdzdWIge15mYXRhbDogfSAkZXJyIHt9IGVycgorCQllcnJvcl9wb3B1cCBbc3RyY2F0IFwKKwkJCVttYyAiSW5pdGlhbCBmaWxlIGNoZWNrb3V0IGZhaWxlZC4iXSBcCisJCQkiXG5cbiRlcnIiXQorCQlyZXR1cm4KKwl9CisKKwlzZXQgZG9uZSAxCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjCisjIyBPcGVuIEV4aXN0aW5nIFJlcG9zaXRvcnkKKworbWV0aG9kIF9kb19vcGVuIHt9IHsKKwkkd19uZXh0IGNvbmYgXAorCQktc3RhdGUgZGlzYWJsZWQgXAorCQktY29tbWFuZCBbY2IgX2RvX29wZW4yXSBcCisJCS10ZXh0IFttYyAiT3BlbiJdCisKKwlmcmFtZSAkd19ib2R5CisJbGFiZWwgJHdfYm9keS5oIFwKKwkJLWZvbnQgZm9udF91aWJvbGQgXAorCQktdGV4dCBbbWMgIk9wZW4gRXhpc3RpbmcgUmVwb3NpdG9yeSJdCisJcGFjayAkd19ib2R5LmggLXNpZGUgdG9wIC1maWxsIHggLXBhZHkgMTAKKwlwYWNrICR3X2JvZHkgLWZpbGwgeCAtcGFkeCAxMAorCisJZnJhbWUgJHdfYm9keS53aGVyZQorCWxhYmVsICR3X2JvZHkud2hlcmUubCAtdGV4dCBbbWMgIlJlcG9zaXRvcnk6Il0KKwllbnRyeSAkd19ib2R5LndoZXJlLnQgXAorCQktdGV4dHZhcmlhYmxlIEBsb2NhbF9wYXRoIFwKKwkJLWZvbnQgZm9udF9kaWZmIFwKKwkJLXdpZHRoIDUwCisJYnV0dG9uICR3X2JvZHkud2hlcmUuYiBcCisJCS10ZXh0IFttYyAiQnJvd3NlIl0gXAorCQktY29tbWFuZCBbY2IgX29wZW5fbG9jYWxfcGF0aF0KKworCXBhY2sgJHdfYm9keS53aGVyZS5iIC1zaWRlIHJpZ2h0CisJcGFjayAkd19ib2R5LndoZXJlLmwgLXNpZGUgbGVmdAorCXBhY2sgJHdfYm9keS53aGVyZS50IC1maWxsIHgKKwlwYWNrICR3X2JvZHkud2hlcmUgLWZpbGwgeAorCisJdHJhY2UgYWRkIHZhcmlhYmxlIEBsb2NhbF9wYXRoIHdyaXRlIFtjYiBfd3JpdGVfbG9jYWxfcGF0aF0KKwliaW5kICR3X2JvZHkuaCA8RGVzdHJveT4gW2xpc3QgdHJhY2UgcmVtb3ZlIHZhcmlhYmxlIEBsb2NhbF9wYXRoIHdyaXRlIFtjYiBfd3JpdGVfbG9jYWxfcGF0aF1dCisJdXBkYXRlCisJZm9jdXMgJHdfYm9keS53aGVyZS50Cit9CisKK21ldGhvZCBfb3Blbl9sb2NhbF9wYXRoIHt9IHsKKwlpZiB7JGxvY2FsX3BhdGggbmUge319IHsKKwkJc2V0IHAgJGxvY2FsX3BhdGgKKwl9IGVsc2UgeworCQlzZXQgcCBbX2hvbWVdCisJfQorCisJc2V0IHAgW3RrX2Nob29zZURpcmVjdG9yeSBcCisJCS1pbml0aWFsZGlyICRwIFwKKwkJLXBhcmVudCAkdG9wIFwKKwkJLXRpdGxlIFttYyAiR2l0IFJlcG9zaXRvcnkiXSBcCisJCS1tdXN0ZXhpc3QgdHJ1ZV0KKwlpZiB7JHAgZXEge319IHJldHVybgorCisJc2V0IHAgW2ZpbGUgbm9ybWFsaXplICRwXQorCWlmIHshW19pc19naXQgW2ZpbGUgam9pbiAkcCAuZ2l0XV19IHsKKwkJZXJyb3JfcG9wdXAgW21jICJOb3QgYSBHaXQgcmVwb3NpdG9yeTogJXMiIFtmaWxlIHRhaWwgJHBdXQorCQlyZXR1cm4KKwl9CisJc2V0IGxvY2FsX3BhdGggJHAKK30KKworbWV0aG9kIF9kb19vcGVuMiB7fSB7CisJaWYgeyFbX2lzX2dpdCBbZmlsZSBqb2luICRsb2NhbF9wYXRoIC5naXRdXX0geworCQllcnJvcl9wb3B1cCBbbWMgIk5vdCBhIEdpdCByZXBvc2l0b3J5OiAlcyIgW2ZpbGUgdGFpbCAkbG9jYWxfcGF0aF1dCisJCXJldHVybgorCX0KKworCWlmIHtbY2F0Y2gge2NkICRsb2NhbF9wYXRofSBlcnJdfSB7CisJCWVycm9yX3BvcHVwIFtzdHJjYXQgXAorCQkJW21jICJGYWlsZWQgdG8gb3BlbiByZXBvc2l0b3J5ICVzOiIgJGxvY2FsX3BhdGhdIFwKKwkJCSJcblxuJGVyciJdCisJCXJldHVybgorCX0KKworCV9hcHBlbmRfcmVjZW50cmVwb3MgW3B3ZF0KKwlzZXQgOjpfZ2l0ZGlyIC5naXQKKwlzZXQgOjpfcHJlZml4IHt9CisJc2V0IGRvbmUgMQorfQorCit9CmRpZmYgLS1naXQgYS9naXQtZ3VpL2xpYi9jaG9vc2VfcmV2LnRjbCBiL2dpdC1ndWkvbGliL2Nob29zZV9yZXYudGNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ODIxYzEKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtZ3VpL2xpYi9jaG9vc2VfcmV2LnRjbApAQCAtMCwwICsxLDYyOCBAQAorIyBnaXQtZ3VpIHJldmlzaW9uIGNob29zZXIKKyMgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IFNoYXduIFBlYXJjZQorCitjbGFzcyBjaG9vc2VfcmV2IHsKKworaW1hZ2UgY3JlYXRlIHBob3RvIDo6Y2hvb3NlX3Jldjo6aW1nX2ZpbmQgLWRhdGEge1IwbEdPRGxoRUFBUUFJWUFBUHdDQkNRbUpEdytQQlFTRkFRQ0JNemEzTlRtNU1UVzFIeUNoT1QyOU96cTdNVHE3S3plNUt6bTdPejYvTlR5OUl6YTVHekd6S3pTMU56eTlOejI5S3pxOUhUR3pIVEsxTHphM0F3S0RMenU5SlRpN0hUVzVHVEN6SVRPMU16cTdIemE1RlRLMUVTeXZIekt6S3pXM0RReU5EeXF0RHc2UEl6VzVIekd6QVQrL0R3K1JLeXVyTlRPek1UR3hNUyt0SlNHZEFUQ3hIUnlkTFNxcEx5bW5MU2lqQndlSEVSQ1JOemUzUHo2OVBUeTlPemUxT1RTeE9UR3JNU3FsTHkrdlBUdTVPelN2TXltak5UR3ZOUyt0TXkycE15dW5NU2VmQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSDVCQUVBQUFBQUxBQUFBQUFRQUJBQUFBZTRnQUNDQUFFQ0E0T0lpQUlFQlFZSEJBS0pnd0lJQ1FvTERBMElrWklFQ1E0UEN4QVJDd1NTQXhJVEZBOFZFQllYR0JtSkFRWUxHaFViSEIwZUg3S0lHUklNRUJBZ0lTSWpKS2FJSlFRTEZ4RVJJaWFsa2llVUdpZ3BLUm9JQkNxSkt5eUxCd3ZKQWlvRXlvSUNMUzR2NlFRd01RUXlMdXFMbGk4ek5EVTJCQ2YxbE4zQWtVUEhEaDQ5ZkFRQUFFbkdEMU1DQ0FMWkVhU0hrSVVNQlFTOHdXTUlrU0pHaEJ6Qm1GRUdnUnNCVXFwTWlTZ2RBRCtCQUFBaC9taERjbVZoZEdWa0lHSjVJRUpOVUZSdlIwbEdJRkJ5YnlCMlpYSnphVzl1SURJdU5RMEtxU0JFWlhabGJFTnZjaUF4T1RrM0xERTVPVGd1SUVGc2JDQnlhV2RvZEhNZ2NtVnpaWEoyWldRdURRcG9kSFJ3T2k4dmQzZDNMbVJsZG1Wc1kyOXlMbU52YlFBN30KKworZmllbGQgdyAgICAgICAgICAgICAgIDsgIyBvdXIgbWVnYXdpZGdldCBwYXRoCitmaWVsZCB3X2xpc3QgICAgICAgICAgOyAjIGxpc3Qgb2YgY3VycmVudGx5IGZpbHRlcmVkIHNwZWNzCitmaWVsZCB3X2ZpbHRlciAgICAgICAgOyAjIGZpbHRlciBlbnRyeSBmb3IgJHdfbGlzdAorCitmaWVsZCBjX2V4cHIgICAgICAgIHt9OyAjIGN1cnJlbnQgcmV2aXNpb24gZXhwcmVzc2lvbgorZmllbGQgZmlsdGVyICAgICAgICAgIDsgIyBjdXJyZW50IGZpbHRlciBzdHJpbmcKK2ZpZWxkIHJldnR5cGUgICAgIGhlYWQ7ICMgdHlwZSBvZiByZXZpc2lvbiBjaG9zZW4KK2ZpZWxkIGN1cl9zcGVjcyBbbGlzdF07ICMgbGlzdCBvZiBzcGVjcyBmb3IgJHJldnR5cGUKK2ZpZWxkIHNwZWNfaGVhZCAgICAgICA7ICMgbGlzdCBvZiBhbGwgaGVhZCBzcGVjcworZmllbGQgc3BlY190cmNrICAgICAgIDsgIyBsaXN0IG9mIGFsbCB0cmFja2luZyBicmFuY2ggc3BlY3MKK2ZpZWxkIHNwZWNfdGFnICAgICAgICA7ICMgbGlzdCBvZiBhbGwgdGFnIHNwZWNzCitmaWVsZCB0aXBfZGF0YSAgICAgICAgOyAjIGFycmF5IG9mIHRpcCBjb21taXQgaW5mbyBieSByZWZuYW1lCitmaWVsZCBsb2dfbGFzdCAgICAgICAgOyAjIGFycmF5IG9mIHJlZmxvZyBkYXRlIGJ5IHJlZm5hbWUKKworZmllbGQgdG9vbHRpcF93bSAgICAgICAge30gOyAjIEN1cnJlbnQgdG9vbHRpcCB0b3BsZXZlbCwgaWYgb3BlbgorZmllbGQgdG9vbHRpcF90ICAgICAgICAge30gOyAjIFRleHQgd2lkZ2V0IGluICR0b29sdGlwX3dtCitmaWVsZCB0b29sdGlwX3RpbWVyICAgICB7fSA7ICMgQ3VycmVudCB0aW1lciBldmVudCBmb3Igb3VyIHRvb2x0aXAKKworcHJvYyBuZXcge3BhdGgge3RpdGxlIHt9fX0geworCXJldHVybiBbX25ldyAkcGF0aCAwICR0aXRsZV0KK30KKworcHJvYyBuZXdfdW5tZXJnZWQge3BhdGgge3RpdGxlIHt9fX0geworCXJldHVybiBbX25ldyAkcGF0aCAxICR0aXRsZV0KK30KKworY29uc3RydWN0b3IgX25ldyB7cGF0aCB1bm1lcmdlZF9vbmx5IHRpdGxlfSB7CisJZ2xvYmFsIGN1cnJlbnRfYnJhbmNoIGlzX2RldGFjaGVkCisKKwlpZiB7IVtpbmZvIGV4aXN0cyA6OmFsbF9yZW1vdGVzXX0geworCQlsb2FkX2FsbF9yZW1vdGVzCisJfQorCisJc2V0IHcgJHBhdGgKKworCWlmIHskdGl0bGUgbmUge319IHsKKwkJbGFiZWxmcmFtZSAkdyAtdGV4dCAkdGl0bGUKKwl9IGVsc2UgeworCQlmcmFtZSAkdworCX0KKwliaW5kICR3IDxEZXN0cm95PiBbY2IgX2RlbGV0ZSAlV10KKworCWlmIHskaXNfZGV0YWNoZWR9IHsKKwkJcmFkaW9idXR0b24gJHcuZGV0YWNoZWRoZWFkX3IgXAorCQkJLWFuY2hvciB3IFwKKwkJCS10ZXh0IFttYyAiVGhpcyBEZXRhY2hlZCBDaGVja291dCJdIFwKKwkJCS12YWx1ZSBIRUFEIFwKKwkJCS12YXJpYWJsZSBAcmV2dHlwZQorCQlncmlkICR3LmRldGFjaGVkaGVhZF9yIC1zdGlja3kgd2UgLXBhZHggezAgNX0gLWNvbHVtbnNwYW4gMgorCX0KKworCXJhZGlvYnV0dG9uICR3LmV4cHJfciBcCisJCS10ZXh0IFttYyAiUmV2aXNpb24gRXhwcmVzc2lvbjoiXSBcCisJCS12YWx1ZSBleHByIFwKKwkJLXZhcmlhYmxlIEByZXZ0eXBlCisJZW50cnkgJHcuZXhwcl90IFwKKwkJLWJvcmRlcndpZHRoIDEgXAorCQktcmVsaWVmIHN1bmtlbiBcCisJCS13aWR0aCA1MCBcCisJCS10ZXh0dmFyaWFibGUgQGNfZXhwciBcCisJCS12YWxpZGF0ZSBrZXkgXAorCQktdmFsaWRhdGVjb21tYW5kIFtjYiBfdmFsaWRhdGUgJWQgJVNdCisJZ3JpZCAkdy5leHByX3IgJHcuZXhwcl90IC1zdGlja3kgd2UgLXBhZHggezAgNX0KKworCWZyYW1lICR3LnR5cGVzCisJcmFkaW9idXR0b24gJHcudHlwZXMuaGVhZF9yIFwKKwkJLXRleHQgW21jICJMb2NhbCBCcmFuY2giXSBcCisJCS12YWx1ZSBoZWFkIFwKKwkJLXZhcmlhYmxlIEByZXZ0eXBlCisJcGFjayAkdy50eXBlcy5oZWFkX3IgLXNpZGUgbGVmdAorCXJhZGlvYnV0dG9uICR3LnR5cGVzLnRyY2tfciBcCisJCS10ZXh0IFttYyAiVHJhY2tpbmcgQnJhbmNoIl0gXAorCQktdmFsdWUgdHJjayBcCisJCS12YXJpYWJsZSBAcmV2dHlwZQorCXBhY2sgJHcudHlwZXMudHJja19yIC1zaWRlIGxlZnQKKwlyYWRpb2J1dHRvbiAkdy50eXBlcy50YWdfciBcCisJCS10ZXh0IFttYyAiVGFnIl0gXAorCQktdmFsdWUgdGFnIFwKKwkJLXZhcmlhYmxlIEByZXZ0eXBlCisJcGFjayAkdy50eXBlcy50YWdfciAtc2lkZSBsZWZ0CisJc2V0IHdfZmlsdGVyICR3LnR5cGVzLmZpbHRlcgorCWVudHJ5ICR3X2ZpbHRlciBcCisJCS1ib3JkZXJ3aWR0aCAxIFwKKwkJLXJlbGllZiBzdW5rZW4gXAorCQktd2lkdGggMTIgXAorCQktdGV4dHZhcmlhYmxlIEBmaWx0ZXIgXAorCQktdmFsaWRhdGUga2V5IFwKKwkJLXZhbGlkYXRlY29tbWFuZCBbY2IgX2ZpbHRlciAlUF0KKwlwYWNrICR3X2ZpbHRlciAtc2lkZSByaWdodAorCXBhY2sgW2xhYmVsICR3LnR5cGVzLmZpbHRlcl9pY29uIFwKKwkJLWltYWdlIDo6Y2hvb3NlX3Jldjo6aW1nX2ZpbmQgXAorCQldIC1zaWRlIHJpZ2h0CisJZ3JpZCAkdy50eXBlcyAtc3RpY2t5IHdlIC1wYWR4IHswIDV9IC1jb2x1bW5zcGFuIDIKKworCWZyYW1lICR3Lmxpc3QKKwlzZXQgd19saXN0ICR3Lmxpc3QubAorCWxpc3Rib3ggJHdfbGlzdCBcCisJCS1mb250IGZvbnRfZGlmZiBcCisJCS13aWR0aCA1MCBcCisJCS1oZWlnaHQgMTAgXAorCQktc2VsZWN0bW9kZSBicm93c2UgXAorCQktZXhwb3J0c2VsZWN0aW9uIGZhbHNlIFwKKwkJLXhzY3JvbGxjb21tYW5kIFtjYiBfc2Jfc2V0ICR3Lmxpc3Quc2J4IGhdIFwKKwkJLXlzY3JvbGxjb21tYW5kIFtjYiBfc2Jfc2V0ICR3Lmxpc3Quc2J5IHZdCisJcGFjayAkd19saXN0IC1maWxsIGJvdGggLWV4cGFuZCAxCisJZ3JpZCAkdy5saXN0IC1zdGlja3kgbnN3ZSAtcGFkeCB7MjAgNX0gLWNvbHVtbnNwYW4gMgorCWJpbmQgJHdfbGlzdCA8QW55LU1vdGlvbj4gIFtjYiBfc2hvd190b29sdGlwIEAleCwleV0KKwliaW5kICR3X2xpc3QgPEFueS1FbnRlcj4gICBbY2IgX2hpZGVfdG9vbHRpcF0KKwliaW5kICR3X2xpc3QgPEFueS1MZWF2ZT4gICBbY2IgX2hpZGVfdG9vbHRpcF0KKwliaW5kICR3X2xpc3QgPERlc3Ryb3k+ICAgICBbY2IgX2hpZGVfdG9vbHRpcF0KKworCWdyaWQgY29sdW1uY29uZmlndXJlICR3IDEgLXdlaWdodCAxCisJaWYgeyRpc19kZXRhY2hlZH0geworCQlncmlkIHJvd2NvbmZpZ3VyZSAkdyAzIC13ZWlnaHQgMQorCX0gZWxzZSB7CisJCWdyaWQgcm93Y29uZmlndXJlICR3IDIgLXdlaWdodCAxCisJfQorCisJdHJhY2UgYWRkIHZhcmlhYmxlIEByZXZ0eXBlIHdyaXRlIFtjYiBfc2VsZWN0XQorCWJpbmQgJHdfZmlsdGVyIDxLZXktUmV0dXJuPiBbbGlzdCBmb2N1cyAkd19saXN0XVw7YnJlYWsKKwliaW5kICR3X2ZpbHRlciA8S2V5LURvd24+ICAgW2xpc3QgZm9jdXMgJHdfbGlzdF0KKworCXNldCBmbXQgbGlzdAorCWFwcGVuZCBmbXQgeyAlKHJlZm5hbWUpfQorCWFwcGVuZCBmbXQgeyBbbGlzdH0KKwlhcHBlbmQgZm10IHsgJShvYmplY3R0eXBlKX0KKwlhcHBlbmQgZm10IHsgJShvYmplY3RuYW1lKX0KKwlhcHBlbmQgZm10IHsgW2NvbmNhdCAlKHRhZ2dlcm5hbWUpICUoYXV0aG9ybmFtZSldfQorCWFwcGVuZCBmbXQgeyBbcmVmb3JtYXRfZGF0ZSBbY29uY2F0ICUodGFnZ2VyZGF0ZSkgJShhdXRob3JkYXRlKV1dfQorCWFwcGVuZCBmbXQgeyAlKHN1YmplY3QpfQorCWFwcGVuZCBmbXQge10gW2xpc3R9CisJYXBwZW5kIGZtdCB7ICUoKm9iamVjdHR5cGUpfQorCWFwcGVuZCBmbXQgeyAlKCpvYmplY3RuYW1lKX0KKwlhcHBlbmQgZm10IHsgJSgqYXV0aG9ybmFtZSl9CisJYXBwZW5kIGZtdCB7IFtyZWZvcm1hdF9kYXRlICUoKmF1dGhvcmRhdGUpXX0KKwlhcHBlbmQgZm10IHsgJSgqc3ViamVjdCl9CisJYXBwZW5kIGZtdCB7XX0KKwlzZXQgYWxsX3JlZm4gW2xpc3RdCisJc2V0IGZyX2ZkIFtnaXRfcmVhZCBmb3ItZWFjaC1yZWYgXAorCQktLXRjbCBcCisJCS0tc29ydD0tdGFnZ2VyZGF0ZSBcCisJCS0tZm9ybWF0PSRmbXQgXAorCQlyZWZzL2hlYWRzIFwKKwkJcmVmcy9yZW1vdGVzIFwKKwkJcmVmcy90YWdzIFwKKwkJXQorCWZjb25maWd1cmUgJGZyX2ZkIC10cmFuc2xhdGlvbiBsZiAtZW5jb2RpbmcgdXRmLTgKKwl3aGlsZSB7W2dldHMgJGZyX2ZkIGxpbmVdID4gMH0geworCQlzZXQgbGluZSBbZXZhbCAkbGluZV0KKwkJaWYge1tsaW5kZXggJGxpbmUgMSAwXSBlcSB7dGFnfX0geworCQkJaWYge1tsaW5kZXggJGxpbmUgMiAwXSBlcSB7Y29tbWl0fX0geworCQkJCXNldCBzaGExIFtsaW5kZXggJGxpbmUgMiAxXQorCQkJfSBlbHNlIHsKKwkJCQljb250aW51ZQorCQkJfQorCQl9IGVsc2VpZiB7W2xpbmRleCAkbGluZSAxIDBdIGVxIHtjb21taXR9fSB7CisJCQlzZXQgc2hhMSBbbGluZGV4ICRsaW5lIDEgMV0KKwkJfSBlbHNlIHsKKwkJCWNvbnRpbnVlCisJCX0KKwkJc2V0IHJlZm4gW2xpbmRleCAkbGluZSAwXQorCQlzZXQgdGlwX2RhdGEoJHJlZm4pIFtscmFuZ2UgJGxpbmUgMSBlbmRdCisJCWxhcHBlbmQgY210X3JlZm4oJHNoYTEpICRyZWZuCisJCWxhcHBlbmQgYWxsX3JlZm4gJHJlZm4KKwl9CisJY2xvc2UgJGZyX2ZkCisKKwlpZiB7JHVubWVyZ2VkX29ubHl9IHsKKwkJc2V0IGZyX2ZkIFtnaXRfcmVhZCByZXYtbGlzdCAtLWFsbCBeJDo6SEVBRF0KKwkJd2hpbGUge1tnZXRzICRmcl9mZCBzaGExXSA+IDB9IHsKKwkJCWlmIHtbY2F0Y2gge3NldCBybHN0ICRjbXRfcmVmbigkc2hhMSl9XX0gY29udGludWUKKwkJCWZvcmVhY2ggcmVmbiAkcmxzdCB7CisJCQkJc2V0IGluYygkcmVmbikgMQorCQkJfQorCQl9CisJCWNsb3NlICRmcl9mZAorCX0gZWxzZSB7CisJCWZvcmVhY2ggcmVmbiAkYWxsX3JlZm4geworCQkJc2V0IGluYygkcmVmbikgMQorCQl9CisJfQorCisJc2V0IHNwZWNfaGVhZCBbbGlzdF0KKwlmb3JlYWNoIG5hbWUgW2xvYWRfYWxsX2hlYWRzXSB7CisJCXNldCByZWZuIHJlZnMvaGVhZHMvJG5hbWUKKwkJaWYge1tpbmZvIGV4aXN0cyBpbmMoJHJlZm4pXX0geworCQkJbGFwcGVuZCBzcGVjX2hlYWQgW2xpc3QgJG5hbWUgJHJlZm5dCisJCX0KKwl9CisKKwlzZXQgc3BlY190cmNrIFtsaXN0XQorCWZvcmVhY2ggc3BlYyBbYWxsX3RyYWNraW5nX2JyYW5jaGVzXSB7CisJCXNldCByZWZuIFtsaW5kZXggJHNwZWMgMF0KKwkJaWYge1tpbmZvIGV4aXN0cyBpbmMoJHJlZm4pXX0geworCQkJcmVnc3ViIF5yZWZzLyhoZWFkc3xyZW1vdGVzKS8gJHJlZm4ge30gbmFtZQorCQkJbGFwcGVuZCBzcGVjX3RyY2sgW2NvbmNhdCAkbmFtZSAkc3BlY10KKwkJfQorCX0KKworCXNldCBzcGVjX3RhZyBbbGlzdF0KKwlmb3JlYWNoIG5hbWUgW2xvYWRfYWxsX3RhZ3NdIHsKKwkJc2V0IHJlZm4gcmVmcy90YWdzLyRuYW1lCisJCWlmIHtbaW5mbyBleGlzdHMgaW5jKCRyZWZuKV19IHsKKwkJCWxhcHBlbmQgc3BlY190YWcgW2xpc3QgJG5hbWUgJHJlZm5dCisJCX0KKwl9CisKKwkJICBpZiB7JGlzX2RldGFjaGVkfSAgICAgICAgICAgICB7IHNldCByZXZ0eXBlIEhFQUQKKwl9IGVsc2VpZiB7W2xsZW5ndGggJHNwZWNfaGVhZF0gPiAwfSB7IHNldCByZXZ0eXBlIGhlYWQKKwl9IGVsc2VpZiB7W2xsZW5ndGggJHNwZWNfdHJja10gPiAwfSB7IHNldCByZXZ0eXBlIHRyY2sKKwl9IGVsc2VpZiB7W2xsZW5ndGggJHNwZWNfdGFnIF0gPiAwfSB7IHNldCByZXZ0eXBlIHRhZworCX0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHJldnR5cGUgZXhwcgorCX0KKworCWlmIHskcmV2dHlwZSBlcSB7aGVhZH0gJiYgJGN1cnJlbnRfYnJhbmNoIG5lIHt9fSB7CisJCXNldCBpIDAKKwkJZm9yZWFjaCBzcGVjICRzcGVjX2hlYWQgeworCQkJaWYge1tsaW5kZXggJHNwZWMgMF0gZXEgJGN1cnJlbnRfYnJhbmNofSB7CisJCQkJJHdfbGlzdCBzZWxlY3Rpb24gY2xlYXIgMCBlbmQKKwkJCQkkd19saXN0IHNlbGVjdGlvbiBzZXQgJGkKKwkJCQlicmVhaworCQkJfQorCQkJaW5jciBpCisJCX0KKwl9CisKKwlyZXR1cm4gJHRoaXMKK30KKworbWV0aG9kIG5vbmUge3RleHR9IHsKKwlpZiB7IVt3aW5mbyBleGlzdHMgJHcubm9uZV9yXX0geworCQlyYWRpb2J1dHRvbiAkdy5ub25lX3IgXAorCQkJLWFuY2hvciB3IFwKKwkJCS12YWx1ZSBub25lIFwKKwkJCS12YXJpYWJsZSBAcmV2dHlwZQorCQlncmlkICR3Lm5vbmVfciAtc3RpY2t5IHdlIC1wYWR4IHswIDV9IC1jb2x1bW5zcGFuIDIKKwl9CisJJHcubm9uZV9yIGNvbmZpZ3VyZSAtdGV4dCAkdGV4dAorfQorCittZXRob2QgZ2V0IHt9IHsKKwlzd2l0Y2ggLS0gJHJldnR5cGUgeworCWhlYWQgLQorCXRyY2sgLQorCXRhZyAgeworCQlzZXQgaSBbJHdfbGlzdCBjdXJzZWxlY3Rpb25dCisJCWlmIHskaSBuZSB7fX0geworCQkJcmV0dXJuIFtsaW5kZXggJGN1cl9zcGVjcyAkaSAwXQorCQl9IGVsc2UgeworCQkJcmV0dXJuIHt9CisJCX0KKwl9CisKKwlIRUFEIHsgcmV0dXJuIEhFQUQgICAgICAgICAgICAgICAgICAgICB9CisJZXhwciB7IHJldHVybiAkY19leHByICAgICAgICAgICAgICAgICAgfQorCW5vbmUgeyByZXR1cm4ge30gICAgICAgICAgICAgICAgICAgICAgIH0KKwlkZWZhdWx0IHsgZXJyb3IgInVua25vd24gdHlwZSBvZiByZXZpc2lvbiIgfQorCX0KK30KKworbWV0aG9kIHBpY2tfdHJhY2tpbmdfYnJhbmNoIHt9IHsKKwlzZXQgcmV2dHlwZSB0cmNrCit9CisKK21ldGhvZCBmb2N1c19maWx0ZXIge30geworCWlmIHtbJHdfZmlsdGVyIGNnZXQgLXN0YXRlXSBlcSB7bm9ybWFsfX0geworCQlmb2N1cyAkd19maWx0ZXIKKwl9Cit9CisKK21ldGhvZCBiaW5kX2xpc3Rib3gge2V2ZW50IHNjcmlwdH0gIHsKKwliaW5kICR3X2xpc3QgJGV2ZW50ICRzY3JpcHQKK30KKworbWV0aG9kIGdldF9sb2NhbF9icmFuY2gge30geworCWlmIHskcmV2dHlwZSBlcSB7aGVhZH19IHsKKwkJcmV0dXJuIFtfZXhwciAkdGhpc10KKwl9IGVsc2UgeworCQlyZXR1cm4ge30KKwl9Cit9CisKK21ldGhvZCBnZXRfdHJhY2tpbmdfYnJhbmNoIHt9IHsKKwlzZXQgaSBbJHdfbGlzdCBjdXJzZWxlY3Rpb25dCisJaWYgeyRpIGVxIHt9IHx8ICRyZXZ0eXBlIG5lIHt0cmNrfX0geworCQlyZXR1cm4ge30KKwl9CisJcmV0dXJuIFtscmFuZ2UgW2xpbmRleCAkY3VyX3NwZWNzICRpXSAxIGVuZF0KK30KKworbWV0aG9kIGdldF9jb21taXQge30geworCXNldCBlIFtfZXhwciAkdGhpc10KKwlpZiB7JGUgZXEge319IHsKKwkJcmV0dXJuIHt9CisJfQorCXJldHVybiBbZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAiJGVeMCJdCit9CisKK21ldGhvZCBjb21taXRfb3JfZGllIHt9IHsKKwlpZiB7W2NhdGNoIHtzZXQgbmV3IFtnZXRfY29tbWl0ICR0aGlzXX0gZXJyXX0geworCisJCSMgQ2xlYW51cCB0aGUgbm90LXNvLWZyaWVuZGx5IGVycm9yIGZyb20gcmV2LXBhcnNlLgorCQkjCisJCXJlZ3N1YiB7XmZhdGFsOlxzKn0gJGVyciB7fSBlcnIKKwkJaWYgeyRlcnIgZXEge05lZWRlZCBhIHNpbmdsZSByZXZpc2lvbn19IHsKKwkJCXNldCBlcnIge30KKwkJfQorCisJCXNldCB0b3AgW3dpbmZvIHRvcGxldmVsICR3XQorCQlzZXQgbXNnIFtzdHJjYXQgW21jICJJbnZhbGlkIHJldmlzaW9uOiAlcyIgW2dldCAkdGhpc11dICJcblxuJGVyciJdCisJCXRrX21lc3NhZ2VCb3ggXAorCQkJLWljb24gZXJyb3IgXAorCQkJLXR5cGUgb2sgXAorCQkJLXRpdGxlIFt3bSB0aXRsZSAkdG9wXSBcCisJCQktcGFyZW50ICR0b3AgXAorCQkJLW1lc3NhZ2UgJG1zZworCQllcnJvciAkbXNnCisJfQorCXJldHVybiAkbmV3Cit9CisKK21ldGhvZCBfZXhwciB7fSB7CisJc3dpdGNoIC0tICRyZXZ0eXBlIHsKKwloZWFkIC0KKwl0cmNrIC0KKwl0YWcgIHsKKwkJc2V0IGkgWyR3X2xpc3QgY3Vyc2VsZWN0aW9uXQorCQlpZiB7JGkgbmUge319IHsKKwkJCXJldHVybiBbbGluZGV4ICRjdXJfc3BlY3MgJGkgMV0KKwkJfSBlbHNlIHsKKwkJCWVycm9yIFttYyAiTm8gcmV2aXNpb24gc2VsZWN0ZWQuIl0KKwkJfQorCX0KKworCWV4cHIgeworCQlpZiB7JGNfZXhwciBuZSB7fX0geworCQkJcmV0dXJuICRjX2V4cHIKKwkJfSBlbHNlIHsKKwkJCWVycm9yIFttYyAiUmV2aXNpb24gZXhwcmVzc2lvbiBpcyBlbXB0eS4iXQorCQl9CisJfQorCUhFQUQgeyByZXR1cm4gSEVBRCAgICAgICAgICAgICAgICAgICAgIH0KKwlub25lIHsgcmV0dXJuIHt9ICAgICAgICAgICAgICAgICAgICAgICB9CisJZGVmYXVsdCB7IGVycm9yICJ1bmtub3duIHR5cGUgb2YgcmV2aXNpb24iICAgICAgfQorCX0KK30KKworbWV0aG9kIF92YWxpZGF0ZSB7ZCBTfSB7CisJaWYgeyRkID09IDF9IHsKKwkJaWYge1tyZWdleHAge1xzfSAkU119IHsKKwkJCXJldHVybiAwCisJCX0KKwkJaWYge1tzdHJpbmcgbGVuZ3RoICRTXSA+IDB9IHsKKwkJCXNldCByZXZ0eXBlIGV4cHIKKwkJfQorCX0KKwlyZXR1cm4gMQorfQorCittZXRob2QgX2ZpbHRlciB7UH0geworCWlmIHtbcmVnZXhwIHtcc30gJFBdfSB7CisJCXJldHVybiAwCisJfQorCV9yZWJ1aWxkICR0aGlzICRQCisJcmV0dXJuIDEKK30KKworbWV0aG9kIF9zZWxlY3Qge2FyZ3N9IHsKKwlfcmVidWlsZCAkdGhpcyAkZmlsdGVyCisJZm9jdXNfZmlsdGVyICR0aGlzCit9CisKK21ldGhvZCBfcmVidWlsZCB7cGF0fSB7CisJc2V0IHN0ZSBub3JtYWwKKwlzd2l0Y2ggLS0gJHJldnR5cGUgeworCWhlYWQgeyBzZXQgbmV3ICRzcGVjX2hlYWQgfQorCXRyY2sgeyBzZXQgbmV3ICRzcGVjX3RyY2sgfQorCXRhZyAgeyBzZXQgbmV3ICRzcGVjX3RhZyAgfQorCWV4cHIgLQorCUhFQUQgLQorCW5vbmUgeworCQlzZXQgbmV3IFtsaXN0XQorCQlzZXQgc3RlIGRpc2FibGVkCisJfQorCX0KKworCWlmIHtbJHdfbGlzdCBjZ2V0IC1zdGF0ZV0gZXEge2Rpc2FibGVkfX0geworCQkkd19saXN0IGNvbmZpZ3VyZSAtc3RhdGUgbm9ybWFsCisJfQorCSR3X2xpc3QgZGVsZXRlIDAgZW5kCisKKwlpZiB7JHBhdCBuZSB7fX0geworCQlzZXQgcGF0ICoke3BhdH0qCisJfQorCXNldCBjdXJfc3BlY3MgW2xpc3RdCisJZm9yZWFjaCBzcGVjICRuZXcgeworCQlzZXQgdHh0IFtsaW5kZXggJHNwZWMgMF0KKwkJaWYgeyRwYXQgZXEge30gfHwgW3N0cmluZyBtYXRjaCAkcGF0ICR0eHRdfSB7CisJCQlsYXBwZW5kIGN1cl9zcGVjcyAkc3BlYworCQkJJHdfbGlzdCBpbnNlcnQgZW5kICR0eHQKKwkJfQorCX0KKwlpZiB7JGN1cl9zcGVjcyBuZSB7fX0geworCQkkd19saXN0IHNlbGVjdGlvbiBjbGVhciAwIGVuZAorCQkkd19saXN0IHNlbGVjdGlvbiBzZXQgMAorCX0KKworCWlmIHtbJHdfZmlsdGVyIGNnZXQgLXN0YXRlXSBuZSAkc3RlfSB7CisJCSR3X2xpc3QgICBjb25maWd1cmUgLXN0YXRlICRzdGUKKwkJJHdfZmlsdGVyIGNvbmZpZ3VyZSAtc3RhdGUgJHN0ZQorCX0KK30KKworbWV0aG9kIF9kZWxldGUge2N1cnJlbnR9IHsKKwlpZiB7JGN1cnJlbnQgZXEgJHd9IHsKKwkJZGVsZXRlX3RoaXMKKwl9Cit9CisKK21ldGhvZCBfc2Jfc2V0IHtzYiBvcmllbnQgZmlyc3QgbGFzdH0geworCXNldCBvbGRfZm9jdXMgW2ZvY3VzIC1sYXN0Zm9yICR3XQorCisJaWYgeyRmaXJzdCA9PSAwICYmICRsYXN0ID09IDF9IHsKKwkJaWYge1t3aW5mbyBleGlzdHMgJHNiXX0geworCQkJZGVzdHJveSAkc2IKKwkJCWlmIHskb2xkX2ZvY3VzIG5lIHt9fSB7CisJCQkJdXBkYXRlCisJCQkJZm9jdXMgJG9sZF9mb2N1cworCQkJfQorCQl9CisJCXJldHVybgorCX0KKworCWlmIHshW3dpbmZvIGV4aXN0cyAkc2JdfSB7CisJCWlmIHskb3JpZW50IGVxIHtofX0geworCQkJc2Nyb2xsYmFyICRzYiAtb3JpZW50IGggLWNvbW1hbmQgW2xpc3QgJHdfbGlzdCB4dmlld10KKwkJCXBhY2sgJHNiIC1maWxsIHggLXNpZGUgYm90dG9tIC1iZWZvcmUgJHdfbGlzdAorCQl9IGVsc2UgeworCQkJc2Nyb2xsYmFyICRzYiAtb3JpZW50IHYgLWNvbW1hbmQgW2xpc3QgJHdfbGlzdCB5dmlld10KKwkJCXBhY2sgJHNiIC1maWxsIHkgLXNpZGUgcmlnaHQgLWJlZm9yZSAkd19saXN0CisJCX0KKwkJaWYgeyRvbGRfZm9jdXMgbmUge319IHsKKwkJCXVwZGF0ZQorCQkJZm9jdXMgJG9sZF9mb2N1cworCQl9CisJfQorCisJY2F0Y2ggeyRzYiBzZXQgJGZpcnN0ICRsYXN0fQorfQorCittZXRob2QgX3Nob3dfdG9vbHRpcCB7cG9zfSB7CisJaWYgeyR0b29sdGlwX3dtIG5lIHt9fSB7CisJCV9vcGVuX3Rvb2x0aXAgJHRoaXMKKwl9IGVsc2VpZiB7JHRvb2x0aXBfdGltZXIgZXEge319IHsKKwkJc2V0IHRvb2x0aXBfdGltZXIgW2FmdGVyIDEwMDAgW2NiIF9vcGVuX3Rvb2x0aXBdXQorCX0KK30KKworbWV0aG9kIF9vcGVuX3Rvb2x0aXAge30geworCWdsb2JhbCByZW1vdGVfdXJsCisKKwlzZXQgdG9vbHRpcF90aW1lciB7fQorCXNldCBwb3NfeCBbd2luZm8gcG9pbnRlcnggJHdfbGlzdF0KKwlzZXQgcG9zX3kgW3dpbmZvIHBvaW50ZXJ5ICR3X2xpc3RdCisJaWYge1t3aW5mbyBjb250YWluaW5nICRwb3NfeCAkcG9zX3ldIG5lICR3X2xpc3R9IHsKKwkJX2hpZGVfdG9vbHRpcCAkdGhpcworCQlyZXR1cm4KKwl9CisKKwlzZXQgcG9zIEBbam9pbiBbbGlzdCBcCisJCVtleHByIHskcG9zX3ggLSBbd2luZm8gcm9vdHggJHdfbGlzdF19XSBcCisJCVtleHByIHskcG9zX3kgLSBbd2luZm8gcm9vdHkgJHdfbGlzdF19XV0gLF0KKwlzZXQgbG5vIFskd19saXN0IGluZGV4ICRwb3NdCisJaWYgeyRsbm8gZXEge319IHsKKwkJX2hpZGVfdG9vbHRpcCAkdGhpcworCQlyZXR1cm4KKwl9CisKKwlzZXQgc3BlYyBbbGluZGV4ICRjdXJfc3BlY3MgJGxub10KKwlzZXQgcmVmbiBbbGluZGV4ICRzcGVjIDFdCisJaWYgeyRyZWZuIGVxIHt9fSB7CisJCV9oaWRlX3Rvb2x0aXAgJHRoaXMKKwkJcmV0dXJuCisJfQorCisJaWYgeyR0b29sdGlwX3dtIGVxIHt9fSB7CisJCXNldCB0b29sdGlwX3dtIFt0b3BsZXZlbCAkd19saXN0LnRvb2x0aXAgLWJvcmRlcndpZHRoIDFdCisJCXdtIG92ZXJyaWRlcmVkaXJlY3QgJHRvb2x0aXBfd20gMQorCQl3bSB0cmFuc2llbnQgJHRvb2x0aXBfd20gW3dpbmZvIHRvcGxldmVsICR3X2xpc3RdCisJCXNldCB0b29sdGlwX3QgJHRvb2x0aXBfd20ubGFiZWwKKwkJdGV4dCAkdG9vbHRpcF90IFwKKwkJCS10YWtlZm9jdXMgMCBcCisJCQktaGlnaGxpZ2h0dGhpY2tuZXNzIDAgXAorCQkJLXJlbGllZiBmbGF0IFwKKwkJCS1ib3JkZXJ3aWR0aCAwIFwKKwkJCS13cmFwIG5vbmUgXAorCQkJLWJhY2tncm91bmQgbGlnaHR5ZWxsb3cgXAorCQkJLWZvcmVncm91bmQgYmxhY2sKKwkJJHRvb2x0aXBfdCB0YWcgY29uZiBzZWN0aW9uX2hlYWRlciAtZm9udCBmb250X3VpYm9sZAorCQliaW5kICR0b29sdGlwX3dtIDxFc2NhcGU+IFtjYiBfaGlkZV90b29sdGlwXQorCQlwYWNrICR0b29sdGlwX3QKKwl9IGVsc2UgeworCQkkdG9vbHRpcF90IGNvbmYgLXN0YXRlIG5vcm1hbAorCQkkdG9vbHRpcF90IGRlbGV0ZSAwLjAgZW5kCisJfQorCisJc2V0IGRhdGEgJHRpcF9kYXRhKCRyZWZuKQorCWlmIHtbbGluZGV4ICRkYXRhIDAgMF0gZXEge3RhZ319IHsKKwkJc2V0IHRhZyAgW2xpbmRleCAkZGF0YSAwXQorCQlpZiB7W2xpbmRleCAkZGF0YSAxIDBdIGVxIHtjb21taXR9fSB7CisJCQlzZXQgY21pdCBbbGluZGV4ICRkYXRhIDFdCisJCX0gZWxzZSB7CisJCQlzZXQgY21pdCB7fQorCQl9CisJfSBlbHNlaWYge1tsaW5kZXggJGRhdGEgMCAwXSBlcSB7Y29tbWl0fX0geworCQlzZXQgdGFnICB7fQorCQlzZXQgY21pdCBbbGluZGV4ICRkYXRhIDBdCisJfQorCisJJHRvb2x0aXBfdCBpbnNlcnQgZW5kIFtsaW5kZXggJHNwZWMgMF0KKwlzZXQgbGFzdCBbX3JlZmxvZ19sYXN0ICR0aGlzIFtsaW5kZXggJHNwZWMgMV1dCisJaWYgeyRsYXN0IG5lIHt9fSB7CisJCSR0b29sdGlwX3QgaW5zZXJ0IGVuZCAiXG4iCisJCSR0b29sdGlwX3QgaW5zZXJ0IGVuZCBbbWMgIlVwZGF0ZWQiXQorCQkkdG9vbHRpcF90IGluc2VydCBlbmQgIiAkbGFzdCIKKwl9CisJJHRvb2x0aXBfdCBpbnNlcnQgZW5kICJcbiIKKworCWlmIHskdGFnIG5lIHt9fSB7CisJCSR0b29sdGlwX3QgaW5zZXJ0IGVuZCAiXG4iCisJCSR0b29sdGlwX3QgaW5zZXJ0IGVuZCBbbWMgIlRhZyJdIHNlY3Rpb25faGVhZGVyCisJCSR0b29sdGlwX3QgaW5zZXJ0IGVuZCAiICBbbGluZGV4ICR0YWcgMV1cbiIKKwkJJHRvb2x0aXBfdCBpbnNlcnQgZW5kIFtsaW5kZXggJHRhZyAyXQorCQkkdG9vbHRpcF90IGluc2VydCBlbmQgIiAoW2xpbmRleCAkdGFnIDNdKVxuIgorCQkkdG9vbHRpcF90IGluc2VydCBlbmQgW2xpbmRleCAkdGFnIDRdCisJCSR0b29sdGlwX3QgaW5zZXJ0IGVuZCAiXG4iCisJfQorCisJaWYgeyRjbWl0IG5lIHt9fSB7CisJCSR0b29sdGlwX3QgaW5zZXJ0IGVuZCAiXG4iCisJCSR0b29sdGlwX3QgaW5zZXJ0IGVuZCBbbWMgIkNvbW1pdEBAbm91biJdIHNlY3Rpb25faGVhZGVyCisJCSR0b29sdGlwX3QgaW5zZXJ0IGVuZCAiICBbbGluZGV4ICRjbWl0IDFdXG4iCisJCSR0b29sdGlwX3QgaW5zZXJ0IGVuZCBbbGluZGV4ICRjbWl0IDJdCisJCSR0b29sdGlwX3QgaW5zZXJ0IGVuZCAiIChbbGluZGV4ICRjbWl0IDNdKVxuIgorCQkkdG9vbHRpcF90IGluc2VydCBlbmQgW2xpbmRleCAkY21pdCA0XQorCX0KKworCWlmIHtbbGxlbmd0aCAkc3BlY10gPiAyfSB7CisJCSR0b29sdGlwX3QgaW5zZXJ0IGVuZCAiXG4iCisJCSR0b29sdGlwX3QgaW5zZXJ0IGVuZCBbbWMgIlJlbW90ZSJdIHNlY3Rpb25faGVhZGVyCisJCSR0b29sdGlwX3QgaW5zZXJ0IGVuZCAiICBbbGluZGV4ICRzcGVjIDJdXG4iCisJCSR0b29sdGlwX3QgaW5zZXJ0IGVuZCBbbWMgIlVSTCJdCisJCSR0b29sdGlwX3QgaW5zZXJ0IGVuZCAiICRyZW1vdGVfdXJsKFtsaW5kZXggJHNwZWMgMl0pXG4iCisJCSR0b29sdGlwX3QgaW5zZXJ0IGVuZCBbbWMgIkJyYW5jaCJdCisJCSR0b29sdGlwX3QgaW5zZXJ0IGVuZCAiIFtsaW5kZXggJHNwZWMgM10iCisJfQorCisJJHRvb2x0aXBfdCBjb25mIC1zdGF0ZSBkaXNhYmxlZAorCV9wb3NpdGlvbl90b29sdGlwICR0aGlzCit9CisKK21ldGhvZCBfcmVmbG9nX2xhc3Qge25hbWV9IHsKKwlpZiB7W2luZm8gZXhpc3RzIHJlZmxvZ19sYXN0KCRuYW1lKV19IHsKKwkJcmV0dXJuIHJlZmxvZ19sYXN0KCRuYW1lKQorCX0KKworCXNldCBsYXN0IHt9CisJaWYge1tjYXRjaCB7c2V0IGxhc3QgW2ZpbGUgbXRpbWUgW2dpdGRpciAkbmFtZV1dfV0KKwkmJiAhW2NhdGNoIHtzZXQgZyBbb3BlbiBbZ2l0ZGlyIGxvZ3MgJG5hbWVdIHJdfV19IHsKKwkJZmNvbmZpZ3VyZSAkZyAtdHJhbnNsYXRpb24gYmluYXJ5CisJCXdoaWxlIHtbZ2V0cyAkZyBsaW5lXSA+PSAwfSB7CisJCQlpZiB7W3JlZ2V4cCB7PiAoWzEtOV1bMC05XSopIH0gJGxpbmUgbGluZSB3aGVuXX0geworCQkJCXNldCBsYXN0ICR3aGVuCisJCQl9CisJCX0KKwkJY2xvc2UgJGcKKwl9CisKKwlpZiB7JGxhc3QgbmUge319IHsKKwkJc2V0IGxhc3QgW2Zvcm1hdF9kYXRlICRsYXN0XQorCX0KKwlzZXQgcmVmbG9nX2xhc3QoJG5hbWUpICRsYXN0CisJcmV0dXJuICRsYXN0Cit9CisKK21ldGhvZCBfcG9zaXRpb25fdG9vbHRpcCB7fSB7CisJc2V0IG1heF9oIFtsaW5kZXggW3NwbGl0IFskdG9vbHRpcF90IGluZGV4IGVuZF0gLl0gMF0KKwlzZXQgbWF4X3cgMAorCWZvciB7c2V0IGkgMX0geyRpIDw9ICRtYXhfaH0ge2luY3IgaX0geworCQlzZXQgYyBbbGluZGV4IFtzcGxpdCBbJHRvb2x0aXBfdCBpbmRleCAiJGkuMCBsaW5lZW5kIl0gLl0gMV0KKwkJaWYgeyRjID4gJG1heF93fSB7c2V0IG1heF93ICRjfQorCX0KKwkkdG9vbHRpcF90IGNvbmYgLXdpZHRoICRtYXhfdyAtaGVpZ2h0ICRtYXhfaAorCisJc2V0IHJlcV93IFt3aW5mbyByZXF3aWR0aCAgJHRvb2x0aXBfdF0KKwlzZXQgcmVxX2ggW3dpbmZvIHJlcWhlaWdodCAkdG9vbHRpcF90XQorCXNldCBwb3NfeCBbZXhwciB7W3dpbmZvIHBvaW50ZXJ4IC5dICsgIDV9XQorCXNldCBwb3NfeSBbZXhwciB7W3dpbmZvIHBvaW50ZXJ5IC5dICsgMTB9XQorCisJc2V0IGcgIiR7cmVxX3d9eCR7cmVxX2h9IgorCWlmIHskcG9zX3ggPj0gMH0ge2FwcGVuZCBnICt9CisJYXBwZW5kIGcgJHBvc194CisJaWYgeyRwb3NfeSA+PSAwfSB7YXBwZW5kIGcgK30KKwlhcHBlbmQgZyAkcG9zX3kKKworCXdtIGdlb21ldHJ5ICR0b29sdGlwX3dtICRnCisJcmFpc2UgJHRvb2x0aXBfd20KK30KKworbWV0aG9kIF9oaWRlX3Rvb2x0aXAge30geworCWlmIHskdG9vbHRpcF93bSBuZSB7fX0geworCQlkZXN0cm95ICR0b29sdGlwX3dtCisJCXNldCB0b29sdGlwX3dtIHt9CisJfQorCWlmIHskdG9vbHRpcF90aW1lciBuZSB7fX0geworCQlhZnRlciBjYW5jZWwgJHRvb2x0aXBfdGltZXIKKwkJc2V0IHRvb2x0aXBfdGltZXIge30KKwl9Cit9CisKK30KZGlmZiAtLWdpdCBhL2dpdC1ndWkvbGliL2NsYXNzLnRjbCBiL2dpdC1ndWkvbGliL2NsYXNzLnRjbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzIxNDExCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9saWIvY2xhc3MudGNsCkBAIC0wLDAgKzEsMTg2IEBACisjIGdpdC1ndWkgc2ltcGxlIGNsYXNzL29iamVjdCBmYWtlLWFsaWtlCisjIENvcHlyaWdodCAoQykgMjAwNyBTaGF3biBQZWFyY2UKKworcHJvYyBjbGFzcyB7Y2xhc3MgYm9keX0geworCWlmIHtbbmFtZXNwYWNlIGV4aXN0cyAkY2xhc3NdfSB7CisJCWVycm9yICJjbGFzcyAkY2xhc3MgYWxyZWFkeSBkZWNsYXJlZCIKKwl9CisJbmFtZXNwYWNlIGV2YWwgJGNsYXNzICIKKwkJdmFyaWFibGUgX19uZXh0aWQgICAgIDAKKwkJdmFyaWFibGUgX19zZWFsZWQgICAgIDAKKwkJdmFyaWFibGUgX19maWVsZF9saXN0IHt9CisJCXZhcmlhYmxlIF9fZmllbGRfYXJyYXkKKworCQlwcm9jIGNiIHtuYW1lIGFyZ3N9IHsKKwkJCXVwdmFyIHRoaXMgdGhpcworCQkJY29uY2F0IFxbbGlzdCAke2NsYXNzfTo6XCRuYW1lIFwkdGhpc1xdIFwkYXJncworCQl9CisJIgorCW5hbWVzcGFjZSBldmFsICRjbGFzcyAkYm9keQorfQorCitwcm9jIGZpZWxkIHtuYW1lIGFyZ3N9IHsKKwlzZXQgY2xhc3MgW3VwbGV2ZWwge25hbWVzcGFjZSBjdXJyZW50fV0KKwl2YXJpYWJsZSAke2NsYXNzfTo6X19zZWFsZWQKKwl2YXJpYWJsZSAke2NsYXNzfTo6X19maWVsZF9hcnJheQorCisJc3dpdGNoIFtsbGVuZ3RoICRhcmdzXSB7CisJMCB7IHNldCBuZXcgW2xpc3QgJG5hbWVdIH0KKwkxIHsgc2V0IG5ldyBbbGlzdCAkbmFtZSBbbGluZGV4ICRhcmdzIDBdXSB9CisJZGVmYXVsdCB7IGVycm9yICJ3cm9uZyAjIGFyZ3M6IGZpZWxkIG5hbWUgdmFsdWU/IiB9CisJfQorCisJaWYgeyRfX3NlYWxlZH0geworCQllcnJvciAiY2xhc3MgJGNsYXNzIGlzIHNlYWxlZCAoY2Fubm90IGFkZCBuZXcgZmllbGRzKSIKKwl9CisKKwlpZiB7W2NhdGNoIHtzZXQgb2xkICRfX2ZpZWxkX2FycmF5KCRuYW1lKX1dfSB7CisJCXZhcmlhYmxlICR7Y2xhc3N9OjpfX2ZpZWxkX2xpc3QKKwkJbGFwcGVuZCBfX2ZpZWxkX2xpc3QgJG5ldworCQlzZXQgX19maWVsZF9hcnJheSgkbmFtZSkgMQorCX0gZWxzZSB7CisJCWVycm9yICJmaWVsZCAkbmFtZSBhbHJlYWR5IGRlY2xhcmVkIgorCX0KK30KKworcHJvYyBjb25zdHJ1Y3RvciB7bmFtZSBwYXJhbXMgYm9keX0geworCXNldCBjbGFzcyBbdXBsZXZlbCB7bmFtZXNwYWNlIGN1cnJlbnR9XQorCXNldCAke2NsYXNzfTo6X19zZWFsZWQgMQorCXZhcmlhYmxlICR7Y2xhc3N9OjpfX2ZpZWxkX2xpc3QKKwlzZXQgbWJvZHljIHt9CisKKwlhcHBlbmQgbWJvZHljIHtzZXQgdGhpcyB9ICRjbGFzcworCWFwcGVuZCBtYm9keWMgezo6X19vW2luY3IgfSAkY2xhc3Mgezo6X19uZXh0aWRdOjpfX2R9IFw7CisJYXBwZW5kIG1ib2R5YyB7Y3JlYXRlX3RoaXMgfSAkY2xhc3MgXDsKKwlhcHBlbmQgbWJvZHljIHtzZXQgX190aGlzIFtuYW1lc3BhY2UgcXVhbGlmaWVycyAkdGhpc119IFw7CisKKwlpZiB7JF9fZmllbGRfbGlzdCBuZSB7fX0geworCQlhcHBlbmQgbWJvZHljIHt1cHZhciAjMH0KKwkJZm9yZWFjaCBuICRfX2ZpZWxkX2xpc3QgeworCQkJc2V0IG4gW2xpbmRleCAkbiAwXQorCQkJYXBwZW5kIG1ib2R5YyB7ICR7X190aGlzfTo6fSAkbiB7IH0gJG4KKwkJCXJlZ3N1YiAtYWxsIEAkblxcTSAkYm9keSAiXCR7X190aGlzfTo6JG4iIGJvZHkKKwkJfQorCQlhcHBlbmQgbWJvZHljIFw7CisJCWZvcmVhY2ggbiAkX19maWVsZF9saXN0IHsKKwkJCWlmIHtbbGxlbmd0aCAkbl0gPT0gMn0geworCQkJCWFwcGVuZCBtYm9keWMgXAorCQkJCXtzZXQgfSBbbGluZGV4ICRuIDBdIHsgfSBbbGlzdCBbbGluZGV4ICRuIDFdXSBcOworCQkJfQorCQl9CisJfQorCWFwcGVuZCBtYm9keWMgJGJvZHkKKwluYW1lc3BhY2UgZXZhbCAkY2xhc3MgW2xpc3QgcHJvYyAkbmFtZSAkcGFyYW1zICRtYm9keWNdCit9CisKK3Byb2MgbWV0aG9kIHtuYW1lIHBhcmFtcyBib2R5IHtkZWxldGVkIHt9fSB7ZGVsX2JvZHkge319fSB7CisJc2V0IGNsYXNzIFt1cGxldmVsIHtuYW1lc3BhY2UgY3VycmVudH1dCisJc2V0ICR7Y2xhc3N9OjpfX3NlYWxlZCAxCisJdmFyaWFibGUgJHtjbGFzc306Ol9fZmllbGRfbGlzdAorCXNldCBwYXJhbXMgW2xpbnNlcnQgJHBhcmFtcyAwIHRoaXNdCisJc2V0IG1ib2R5YyB7fQorCisJYXBwZW5kIG1ib2R5YyB7c2V0IF9fdGhpcyBbbmFtZXNwYWNlIHF1YWxpZmllcnMgJHRoaXNdfSBcOworCisJc3dpdGNoICRkZWxldGVkIHsKKwl7fSB7fQorCWlmZGVsZXRlZCB7CisJCWFwcGVuZCBtYm9keWMge2lmIHshW25hbWVzcGFjZSBleGlzdHMgJF9fdGhpc119IH0KKwkJYXBwZW5kIG1ib2R5YyBceyAkZGVsX2JvZHkgXDsgcmV0dXJuIFx9IFw7CisJfQorCWRlZmF1bHQgeworCQllcnJvciAid3JvbmcgIyBhcmdzOiBtZXRob2QgbmFtZSBhcmdzIGJvZHkgKGlmZGVsZXRlZCBib2R5KT8iCisJfQorCX0KKworCXNldCBkZWNsIHt9CisJZm9yZWFjaCBuICRfX2ZpZWxkX2xpc3QgeworCQlzZXQgbiBbbGluZGV4ICRuIDBdCisJCWlmIHtbcmVnZXhwIC0tICRuXFxNICRib2R5XX0geworCQkJaWYgeyAgIFtyZWdleHAgLWFsbCAtLSAkblxcTSAkYm9keV0gPT0gMQorCQkJCSYmIFtyZWdleHAgLWFsbCAtLSBcXFwkJG5cXE0gJGJvZHldID09IDEKKwkJCQkmJiBbcmVnZXhwIC1hbGwgLS0gXFxcJCRuXFwoICRib2R5XSA9PSAwfSB7CisJCQkJcmVnc3ViIC1hbGwgXAorCQkJCQlcXFwkJG5cXE0gJGJvZHkgXAorCQkJCQkiXFtzZXQgXCR7X190aGlzfTo6JG5cXSIgYm9keQorCQkJfSBlbHNlIHsKKwkJCQlhcHBlbmQgZGVjbCB7ICR7X190aGlzfTo6fSAkbiB7IH0gJG4KKwkJCQlyZWdzdWIgLWFsbCBAJG5cXE0gJGJvZHkgIlwke19fdGhpc306OiRuIiBib2R5CisJCQl9CisJCX0KKwl9CisJaWYgeyRkZWNsIG5lIHt9fSB7CisJCWFwcGVuZCBtYm9keWMge3VwdmFyICMwfSAkZGVjbCBcOworCX0KKwlhcHBlbmQgbWJvZHljICRib2R5CisJbmFtZXNwYWNlIGV2YWwgJGNsYXNzIFtsaXN0IHByb2MgJG5hbWUgJHBhcmFtcyAkbWJvZHljXQorfQorCitwcm9jIGNyZWF0ZV90aGlzIHtjbGFzc30geworCXVwdmFyIHRoaXMgdGhpcworCW5hbWVzcGFjZSBldmFsIFtuYW1lc3BhY2UgcXVhbGlmaWVycyAkdGhpc10gW2xpc3QgcHJvYyBcCisJCVtuYW1lc3BhY2UgdGFpbCAkdGhpc10gXAorCQlbbGlzdCBuYW1lIGFyZ3NdIFwKKwkJImV2YWwgXFtsaXN0ICR7Y2xhc3N9OjpcJG5hbWUgJHRoaXNcXSBcJGFyZ3MiIFwKKwldCit9CisKK3Byb2MgZGVsZXRlX3RoaXMge3t0IHt9fX0geworCWlmIHskdCBlcSB7fX0geworCQl1cHZhciB0aGlzIHRoaXMKKwkJc2V0IHQgJHRoaXMKKwl9CisJc2V0IHQgW25hbWVzcGFjZSBxdWFsaWZpZXJzICR0XQorCWlmIHtbbmFtZXNwYWNlIGV4aXN0cyAkdF19IHtuYW1lc3BhY2UgZGVsZXRlICR0fQorfQorCitwcm9jIG1ha2VfdG9wbGV2ZWwge3QgdyBhcmdzfSB7CisJdXB2YXIgJHQgdG9wICR3IHBmeCB0aGlzIHRoaXMKKworCWlmIHtbbGxlbmd0aCAkYXJnc10gJSAyfSB7CisJCWVycm9yICJtYWtlX3RvcGxldmVsIHRvcHZhciB3aW52YXIge29wdGlvbnN9IgorCX0KKwlzZXQgYXV0b2RlbGV0ZSAxCisJZm9yZWFjaCB7bmFtZSB2YWx1ZX0gJGFyZ3MgeworCQlzd2l0Y2ggLWV4YWN0IC0tICRuYW1lIHsKKwkJLWF1dG9kZWxldGUge3NldCBhdXRvZGVsZXRlICR2YWx1ZX0KKwkJZGVmYXVsdCAgICAge2Vycm9yICJ1bnN1cHBvcnRlZCBvcHRpb24gJG5hbWUifQorCQl9CisJfQorCisJaWYgeyQ6OnJvb3RfZXhpc3RzIHx8IFt3aW5mbyBpc21hcHBlZCAuXX0geworCQlyZWdzdWIgLWFsbCB7Ojp9ICR0aGlzIHtfX30gdworCQlzZXQgdG9wIC4kdworCQlzZXQgcGZ4ICR0b3AKKwkJdG9wbGV2ZWwgJHRvcAorCQlzZXQgOjpyb290X2V4aXN0cyAxCisJfSBlbHNlIHsKKwkJc2V0IHRvcCAuCisJCXNldCBwZngge30KKwl9CisKKwlpZiB7JGF1dG9kZWxldGV9IHsKKwkJd20gcHJvdG9jb2wgJHRvcCBXTV9ERUxFVEVfV0lORE9XICIKKwkJCVtsaXN0IGRlbGV0ZV90aGlzICR0aGlzXQorCQkJW2xpc3QgZGVzdHJveSAkdG9wXQorCQkiCisJfQorfQorCisKKyMjIGF1dG9fbWtpbmRleCBzdXBwb3J0IGZvciBjbGFzcy9jb25zdHJ1Y3Rvci9tZXRob2QKKyMjCithdXRvX21raW5kZXhfcGFyc2VyOjpjb21tYW5kIGNsYXNzIHtuYW1lIGJvZHl9IHsKKwl2YXJpYWJsZSBwYXJzZXIKKwl2YXJpYWJsZSBjb250ZXh0U3RhY2sKKwlzZXQgY29udGV4dFN0YWNrIFtsaW5zZXJ0ICRjb250ZXh0U3RhY2sgMCAkbmFtZV0KKwkkcGFyc2VyIGV2YWwgW2xpc3QgXyVAbmFtZXNwYWNlIGV2YWwgJG5hbWVdICRib2R5CisJc2V0IGNvbnRleHRTdGFjayBbbHJhbmdlICRjb250ZXh0U3RhY2sgMSBlbmRdCit9CithdXRvX21raW5kZXhfcGFyc2VyOjpjb21tYW5kIGNvbnN0cnVjdG9yIHtuYW1lIGFyZ3N9IHsKKwl2YXJpYWJsZSBpbmRleAorCXZhcmlhYmxlIHNjcmlwdEZpbGUKKwlhcHBlbmQgaW5kZXggW2xpc3Qgc2V0IGF1dG9faW5kZXgoW2Z1bGxuYW1lICRuYW1lXSldIFwKKwkJW2Zvcm1hdCB7IFtsaXN0IHNvdXJjZSBbZmlsZSBqb2luICRkaXIgJXNdXX0gXAorCQlbZmlsZSBzcGxpdCAkc2NyaXB0RmlsZV1dICJcbiIKK30KZGlmZiAtLWdpdCBhL2dpdC1ndWkvbGliL2NvbW1pdC50Y2wgYi9naXQtZ3VpL2xpYi9jb21taXQudGNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYTcxMDMKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtZ3VpL2xpYi9jb21taXQudGNsCkBAIC0wLDAgKzEsNDcwIEBACisjIGdpdC1ndWkgbWlzYy4gY29tbWl0IHJlYWRpbmcvd3JpdGluZyBzdXBwb3J0CisjIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBTaGF3biBQZWFyY2UKKworcHJvYyBsb2FkX2xhc3RfY29tbWl0IHt9IHsKKwlnbG9iYWwgSEVBRCBQQVJFTlQgTUVSR0VfSEVBRCBjb21taXRfdHlwZSB1aV9jb21tCisJZ2xvYmFsIHJlcG9fY29uZmlnCisKKwlpZiB7W2xsZW5ndGggJFBBUkVOVF0gPT0gMH0geworCQllcnJvcl9wb3B1cCBbbWMgIlRoZXJlIGlzIG5vdGhpbmcgdG8gYW1lbmQuCisKK1lvdSBhcmUgYWJvdXQgdG8gY3JlYXRlIHRoZSBpbml0aWFsIGNvbW1pdC4gIFRoZXJlIGlzIG5vIGNvbW1pdCBiZWZvcmUgdGhpcyB0byBhbWVuZC4KKyJdCisJCXJldHVybgorCX0KKworCXJlcG9zaXRvcnlfc3RhdGUgY3VyVHlwZSBjdXJIRUFEIGN1ck1FUkdFX0hFQUQKKwlpZiB7JGN1clR5cGUgZXEge21lcmdlfX0geworCQllcnJvcl9wb3B1cCBbbWMgIkNhbm5vdCBhbWVuZCB3aGlsZSBtZXJnaW5nLgorCitZb3UgYXJlIGN1cnJlbnRseSBpbiB0aGUgbWlkZGxlIG9mIGEgbWVyZ2UgdGhhdCBoYXMgbm90IGJlZW4gZnVsbHkgY29tcGxldGVkLiAgWW91IGNhbm5vdCBhbWVuZCB0aGUgcHJpb3IgY29tbWl0IHVubGVzcyB5b3UgZmlyc3QgYWJvcnQgdGhlIGN1cnJlbnQgbWVyZ2UgYWN0aXZpdHkuCisiXQorCQlyZXR1cm4KKwl9CisKKwlzZXQgbXNnIHt9CisJc2V0IHBhcmVudHMgW2xpc3RdCisJaWYge1tjYXRjaCB7CisJCQlzZXQgZmQgW2dpdF9yZWFkIGNhdC1maWxlIGNvbW1pdCAkY3VySEVBRF0KKwkJCWZjb25maWd1cmUgJGZkIC1lbmNvZGluZyBiaW5hcnkgLXRyYW5zbGF0aW9uIGxmCisJCQlpZiB7W2NhdGNoIHtzZXQgZW5jICRyZXBvX2NvbmZpZyhpMThuLmNvbW1pdGVuY29kaW5nKX1dfSB7CisJCQkJc2V0IGVuYyB1dGYtOAorCQkJfQorCQkJd2hpbGUge1tnZXRzICRmZCBsaW5lXSA+IDB9IHsKKwkJCQlpZiB7W3N0cmluZyBtYXRjaCB7cGFyZW50ICp9ICRsaW5lXX0geworCQkJCQlsYXBwZW5kIHBhcmVudHMgW3N0cmluZyByYW5nZSAkbGluZSA3IGVuZF0KKwkJCQl9IGVsc2VpZiB7W3N0cmluZyBtYXRjaCB7ZW5jb2RpbmcgKn0gJGxpbmVdfSB7CisJCQkJCXNldCBlbmMgW3N0cmluZyB0b2xvd2VyIFtzdHJpbmcgcmFuZ2UgJGxpbmUgOSBlbmRdXQorCQkJCX0KKwkJCX0KKwkJCXNldCBtc2cgW3JlYWQgJGZkXQorCQkJY2xvc2UgJGZkCisKKwkJCXNldCBlbmMgW3RjbF9lbmNvZGluZyAkZW5jXQorCQkJaWYgeyRlbmMgbmUge319IHsKKwkJCQlzZXQgbXNnIFtlbmNvZGluZyBjb252ZXJ0ZnJvbSAkZW5jICRtc2ddCisJCQl9CisJCQlzZXQgbXNnIFtzdHJpbmcgdHJpbSAkbXNnXQorCQl9IGVycl19IHsKKwkJZXJyb3JfcG9wdXAgW3N0cmNhdCBbbWMgIkVycm9yIGxvYWRpbmcgY29tbWl0IGRhdGEgZm9yIGFtZW5kOiJdICJcblxuJGVyciJdCisJCXJldHVybgorCX0KKworCXNldCBIRUFEICRjdXJIRUFECisJc2V0IFBBUkVOVCAkcGFyZW50cworCXNldCBNRVJHRV9IRUFEIFtsaXN0XQorCXN3aXRjaCAtLSBbbGxlbmd0aCAkcGFyZW50c10geworCTAgICAgICAge3NldCBjb21taXRfdHlwZSBhbWVuZC1pbml0aWFsfQorCTEgICAgICAge3NldCBjb21taXRfdHlwZSBhbWVuZH0KKwlkZWZhdWx0IHtzZXQgY29tbWl0X3R5cGUgYW1lbmQtbWVyZ2V9CisJfQorCisJJHVpX2NvbW0gZGVsZXRlIDAuMCBlbmQKKwkkdWlfY29tbSBpbnNlcnQgZW5kICRtc2cKKwkkdWlfY29tbSBlZGl0IHJlc2V0CisJJHVpX2NvbW0gZWRpdCBtb2RpZmllZCBmYWxzZQorCXJlc2NhbiB1aV9yZWFkeQorfQorCitzZXQgR0lUX0NPTU1JVFRFUl9JREVOVCB7fQorCitwcm9jIGNvbW1pdHRlcl9pZGVudCB7fSB7CisJZ2xvYmFsIEdJVF9DT01NSVRURVJfSURFTlQKKworCWlmIHskR0lUX0NPTU1JVFRFUl9JREVOVCBlcSB7fX0geworCQlpZiB7W2NhdGNoIHtzZXQgbWUgW2dpdCB2YXIgR0lUX0NPTU1JVFRFUl9JREVOVF19IGVycl19IHsKKwkJCWVycm9yX3BvcHVwIFtzdHJjYXQgW21jICJVbmFibGUgdG8gb2J0YWluIHlvdXIgaWRlbnRpdHk6Il0gIlxuXG4kZXJyIl0KKwkJCXJldHVybiB7fQorCQl9CisJCWlmIHshW3JlZ2V4cCB7XiguKikgWzAtOV0rIFstKzAtOV0rJH0gXAorCQkJJG1lIG1lIEdJVF9DT01NSVRURVJfSURFTlRdfSB7CisJCQllcnJvcl9wb3B1cCBbc3RyY2F0IFttYyAiSW52YWxpZCBHSVRfQ09NTUlUVEVSX0lERU5UOiJdICJcblxuJG1lIl0KKwkJCXJldHVybiB7fQorCQl9CisJfQorCisJcmV0dXJuICRHSVRfQ09NTUlUVEVSX0lERU5UCit9CisKK3Byb2MgZG9fc2lnbm9mZiB7fSB7CisJZ2xvYmFsIHVpX2NvbW0KKworCXNldCBtZSBbY29tbWl0dGVyX2lkZW50XQorCWlmIHskbWUgZXEge319IHJldHVybgorCisJc2V0IHNvYiAiU2lnbmVkLW9mZi1ieTogJG1lIgorCXNldCBsYXN0IFskdWlfY29tbSBnZXQge2VuZCAtMWMgbGluZXN0YXJ0fSB7ZW5kIC0xY31dCisJaWYgeyRsYXN0IG5lICRzb2J9IHsKKwkJJHVpX2NvbW0gZWRpdCBzZXBhcmF0b3IKKwkJaWYgeyRsYXN0IG5lIHt9CisJCQkmJiAhW3JlZ2V4cCB7XltBLVpdW0EtWmEtel0qLVtBLVphLXotXSs6ICp9ICRsYXN0XX0geworCQkJJHVpX2NvbW0gaW5zZXJ0IGVuZCAiXG4iCisJCX0KKwkJJHVpX2NvbW0gaW5zZXJ0IGVuZCAiXG4kc29iIgorCQkkdWlfY29tbSBlZGl0IHNlcGFyYXRvcgorCQkkdWlfY29tbSBzZWUgZW5kCisJfQorfQorCitwcm9jIGNyZWF0ZV9uZXdfY29tbWl0IHt9IHsKKwlnbG9iYWwgY29tbWl0X3R5cGUgdWlfY29tbQorCisJc2V0IGNvbW1pdF90eXBlIG5vcm1hbAorCSR1aV9jb21tIGRlbGV0ZSAwLjAgZW5kCisJJHVpX2NvbW0gZWRpdCByZXNldAorCSR1aV9jb21tIGVkaXQgbW9kaWZpZWQgZmFsc2UKKwlyZXNjYW4gdWlfcmVhZHkKK30KKworcHJvYyBjb21taXRfdHJlZSB7fSB7CisJZ2xvYmFsIEhFQUQgY29tbWl0X3R5cGUgZmlsZV9zdGF0ZXMgdWlfY29tbSByZXBvX2NvbmZpZworCWdsb2JhbCBwY2hfZXJyb3IKKworCWlmIHtbY29tbWl0dGVyX2lkZW50XSBlcSB7fX0gcmV0dXJuCisJaWYgeyFbbG9ja19pbmRleCB1cGRhdGVdfSByZXR1cm4KKworCSMgLS0gT3VyIGluIG1lbW9yeSBzdGF0ZSBzaG91bGQgbWF0Y2ggdGhlIHJlcG9zaXRvcnkuCisJIworCXJlcG9zaXRvcnlfc3RhdGUgY3VyVHlwZSBjdXJIRUFEIGN1ck1FUkdFX0hFQUQKKwlpZiB7W3N0cmluZyBtYXRjaCBhbWVuZCogJGNvbW1pdF90eXBlXQorCQkmJiAkY3VyVHlwZSBlcSB7bm9ybWFsfQorCQkmJiAkY3VySEVBRCBlcSAkSEVBRH0geworCX0gZWxzZWlmIHskY29tbWl0X3R5cGUgbmUgJGN1clR5cGUgfHwgJEhFQUQgbmUgJGN1ckhFQUR9IHsKKwkJaW5mb19wb3B1cCBbbWMgIkxhc3Qgc2Nhbm5lZCBzdGF0ZSBkb2VzIG5vdCBtYXRjaCByZXBvc2l0b3J5IHN0YXRlLgorCitBbm90aGVyIEdpdCBwcm9ncmFtIGhhcyBtb2RpZmllZCB0aGlzIHJlcG9zaXRvcnkgc2luY2UgdGhlIGxhc3Qgc2Nhbi4gIEEgcmVzY2FuIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSBhbm90aGVyIGNvbW1pdCBjYW4gYmUgY3JlYXRlZC4KKworVGhlIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBub3cuCisiXQorCQl1bmxvY2tfaW5kZXgKKwkJcmVzY2FuIHVpX3JlYWR5CisJCXJldHVybgorCX0KKworCSMgLS0gQXQgbGVhc3Qgb25lIGZpbGUgc2hvdWxkIGRpZmZlciBpbiB0aGUgaW5kZXguCisJIworCXNldCBmaWxlc19yZWFkeSAwCisJZm9yZWFjaCBwYXRoIFthcnJheSBuYW1lcyBmaWxlX3N0YXRlc10geworCQlzd2l0Y2ggLWdsb2IgLS0gW2xpbmRleCAkZmlsZV9zdGF0ZXMoJHBhdGgpIDBdIHsKKwkJXz8ge2NvbnRpbnVlfQorCQlBPyAtCisJCUQ/IC0KKwkJTT8ge3NldCBmaWxlc19yZWFkeSAxfQorCQlVPyB7CisJCQllcnJvcl9wb3B1cCBbbWMgIlVubWVyZ2VkIGZpbGVzIGNhbm5vdCBiZSBjb21taXR0ZWQuCisKK0ZpbGUgJXMgaGFzIG1lcmdlIGNvbmZsaWN0cy4gIFlvdSBtdXN0IHJlc29sdmUgdGhlbSBhbmQgc3RhZ2UgdGhlIGZpbGUgYmVmb3JlIGNvbW1pdHRpbmcuCisiIFtzaG9ydF9wYXRoICRwYXRoXV0KKwkJCXVubG9ja19pbmRleAorCQkJcmV0dXJuCisJCX0KKwkJZGVmYXVsdCB7CisJCQllcnJvcl9wb3B1cCBbbWMgIlVua25vd24gZmlsZSBzdGF0ZSAlcyBkZXRlY3RlZC4KKworRmlsZSAlcyBjYW5ub3QgYmUgY29tbWl0dGVkIGJ5IHRoaXMgcHJvZ3JhbS4KKyIgW2xpbmRleCAkcyAwXSBbc2hvcnRfcGF0aCAkcGF0aF1dCisJCX0KKwkJfQorCX0KKwlpZiB7ISRmaWxlc19yZWFkeSAmJiAhW3N0cmluZyBtYXRjaCAqbWVyZ2UgJGN1clR5cGVdfSB7CisJCWluZm9fcG9wdXAgW21jICJObyBjaGFuZ2VzIHRvIGNvbW1pdC4KKworWW91IG11c3Qgc3RhZ2UgYXQgbGVhc3QgMSBmaWxlIGJlZm9yZSB5b3UgY2FuIGNvbW1pdC4KKyJdCisJCXVubG9ja19pbmRleAorCQlyZXR1cm4KKwl9CisKKwkjIC0tIEEgbWVzc2FnZSBpcyByZXF1aXJlZC4KKwkjCisJc2V0IG1zZyBbc3RyaW5nIHRyaW0gWyR1aV9jb21tIGdldCAxLjAgZW5kXV0KKwlyZWdzdWIgLWFsbCAtbGluZSB7WyBcdFxyXSskfSAkbXNnIHt9IG1zZworCWlmIHskbXNnIGVxIHt9fSB7CisJCWVycm9yX3BvcHVwIFttYyAiUGxlYXNlIHN1cHBseSBhIGNvbW1pdCBtZXNzYWdlLgorCitBIGdvb2QgY29tbWl0IG1lc3NhZ2UgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorCistIEZpcnN0IGxpbmU6IERlc2NyaWJlIGluIG9uZSBzZW50ZW5jZSB3aGF0IHlvdSBkaWQuCistIFNlY29uZCBsaW5lOiBCbGFuaworLSBSZW1haW5pbmcgbGluZXM6IERlc2NyaWJlIHdoeSB0aGlzIGNoYW5nZSBpcyBnb29kLgorIl0KKwkJdW5sb2NrX2luZGV4CisJCXJldHVybgorCX0KKworCSMgLS0gQnVpbGQgdGhlIG1lc3NhZ2UgZmlsZS4KKwkjCisJc2V0IG1zZ19wIFtnaXRkaXIgR0lUR1VJX0VESVRNU0ddCisJc2V0IG1zZ193dCBbb3BlbiAkbXNnX3Agd10KKwlmY29uZmlndXJlICRtc2dfd3QgLXRyYW5zbGF0aW9uIGxmCisJaWYge1tjYXRjaCB7c2V0IGVuYyAkcmVwb19jb25maWcoaTE4bi5jb21taXRlbmNvZGluZyl9XX0geworCQlzZXQgZW5jIHV0Zi04CisJfQorCXNldCB1c2VfZW5jIFt0Y2xfZW5jb2RpbmcgJGVuY10KKwlpZiB7JHVzZV9lbmMgbmUge319IHsKKwkJZmNvbmZpZ3VyZSAkbXNnX3d0IC1lbmNvZGluZyAkdXNlX2VuYworCX0gZWxzZSB7CisJCXB1dHMgc3RkZXJyIFttYyAid2FybmluZzogVGNsIGRvZXMgbm90IHN1cHBvcnQgZW5jb2RpbmcgJyVzJy4iICRlbmNdCisJCWZjb25maWd1cmUgJG1zZ193dCAtZW5jb2RpbmcgdXRmLTgKKwl9CisJcHV0cyAkbXNnX3d0ICRtc2cKKwljbG9zZSAkbXNnX3d0CisKKwkjIC0tIFJ1biB0aGUgcHJlLWNvbW1pdCBob29rLgorCSMKKwlzZXQgZmRfcGggW2dpdGhvb2tfcmVhZCBwcmUtY29tbWl0XQorCWlmIHskZmRfcGggZXEge319IHsKKwkJY29tbWl0X2NvbW1pdG1zZyAkY3VySEVBRCAkbXNnX3AKKwkJcmV0dXJuCisJfQorCisJdWlfc3RhdHVzIFttYyAiQ2FsbGluZyBwcmUtY29tbWl0IGhvb2suLi4iXQorCXNldCBwY2hfZXJyb3Ige30KKwlmY29uZmlndXJlICRmZF9waCAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gYmluYXJ5IC1lb2ZjaGFyIHt9CisJZmlsZWV2ZW50ICRmZF9waCByZWFkYWJsZSBcCisJCVtsaXN0IGNvbW1pdF9wcmVob29rX3dhaXQgJGZkX3BoICRjdXJIRUFEICRtc2dfcF0KK30KKworcHJvYyBjb21taXRfcHJlaG9va193YWl0IHtmZF9waCBjdXJIRUFEIG1zZ19wfSB7CisJZ2xvYmFsIHBjaF9lcnJvcgorCisJYXBwZW5kIHBjaF9lcnJvciBbcmVhZCAkZmRfcGhdCisJZmNvbmZpZ3VyZSAkZmRfcGggLWJsb2NraW5nIDEKKwlpZiB7W2VvZiAkZmRfcGhdfSB7CisJCWlmIHtbY2F0Y2gge2Nsb3NlICRmZF9waH1dfSB7CisJCQljYXRjaCB7ZmlsZSBkZWxldGUgJG1zZ19wfQorCQkJdWlfc3RhdHVzIFttYyAiQ29tbWl0IGRlY2xpbmVkIGJ5IHByZS1jb21taXQgaG9vay4iXQorCQkJaG9va19mYWlsZWRfcG9wdXAgcHJlLWNvbW1pdCAkcGNoX2Vycm9yCisJCQl1bmxvY2tfaW5kZXgKKwkJfSBlbHNlIHsKKwkJCWNvbW1pdF9jb21taXRtc2cgJGN1ckhFQUQgJG1zZ19wCisJCX0KKwkJc2V0IHBjaF9lcnJvciB7fQorCQlyZXR1cm4KKwl9CisJZmNvbmZpZ3VyZSAkZmRfcGggLWJsb2NraW5nIDAKK30KKworcHJvYyBjb21taXRfY29tbWl0bXNnIHtjdXJIRUFEIG1zZ19wfSB7CisJZ2xvYmFsIHBjaF9lcnJvcgorCisJIyAtLSBSdW4gdGhlIGNvbW1pdC1tc2cgaG9vay4KKwkjCisJc2V0IGZkX3BoIFtnaXRob29rX3JlYWQgY29tbWl0LW1zZyAkbXNnX3BdCisJaWYgeyRmZF9waCBlcSB7fX0geworCQljb21taXRfd3JpdGV0cmVlICRjdXJIRUFEICRtc2dfcAorCQlyZXR1cm4KKwl9CisKKwl1aV9zdGF0dXMgW21jICJDYWxsaW5nIGNvbW1pdC1tc2cgaG9vay4uLiJdCisJc2V0IHBjaF9lcnJvciB7fQorCWZjb25maWd1cmUgJGZkX3BoIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkgLWVvZmNoYXIge30KKwlmaWxlZXZlbnQgJGZkX3BoIHJlYWRhYmxlIFwKKwkJW2xpc3QgY29tbWl0X2NvbW1pdG1zZ193YWl0ICRmZF9waCAkY3VySEVBRCAkbXNnX3BdCit9CisKK3Byb2MgY29tbWl0X2NvbW1pdG1zZ193YWl0IHtmZF9waCBjdXJIRUFEIG1zZ19wfSB7CisJZ2xvYmFsIHBjaF9lcnJvcgorCisJYXBwZW5kIHBjaF9lcnJvciBbcmVhZCAkZmRfcGhdCisJZmNvbmZpZ3VyZSAkZmRfcGggLWJsb2NraW5nIDEKKwlpZiB7W2VvZiAkZmRfcGhdfSB7CisJCWlmIHtbY2F0Y2gge2Nsb3NlICRmZF9waH1dfSB7CisJCQljYXRjaCB7ZmlsZSBkZWxldGUgJG1zZ19wfQorCQkJdWlfc3RhdHVzIFttYyAiQ29tbWl0IGRlY2xpbmVkIGJ5IGNvbW1pdC1tc2cgaG9vay4iXQorCQkJaG9va19mYWlsZWRfcG9wdXAgY29tbWl0LW1zZyAkcGNoX2Vycm9yCisJCQl1bmxvY2tfaW5kZXgKKwkJfSBlbHNlIHsKKwkJCWNvbW1pdF93cml0ZXRyZWUgJGN1ckhFQUQgJG1zZ19wCisJCX0KKwkJc2V0IHBjaF9lcnJvciB7fQorCQlyZXR1cm4KKwl9CisJZmNvbmZpZ3VyZSAkZmRfcGggLWJsb2NraW5nIDAKK30KKworcHJvYyBjb21taXRfd3JpdGV0cmVlIHtjdXJIRUFEIG1zZ19wfSB7CisJdWlfc3RhdHVzIFttYyAiQ29tbWl0dGluZyBjaGFuZ2VzLi4uIl0KKwlzZXQgZmRfd3QgW2dpdF9yZWFkIHdyaXRlLXRyZWVdCisJZmlsZWV2ZW50ICRmZF93dCByZWFkYWJsZSBcCisJCVtsaXN0IGNvbW1pdF9jb21taXR0cmVlICRmZF93dCAkY3VySEVBRCAkbXNnX3BdCit9CisKK3Byb2MgY29tbWl0X2NvbW1pdHRyZWUge2ZkX3d0IGN1ckhFQUQgbXNnX3B9IHsKKwlnbG9iYWwgSEVBRCBQQVJFTlQgTUVSR0VfSEVBRCBjb21taXRfdHlwZQorCWdsb2JhbCBjdXJyZW50X2JyYW5jaAorCWdsb2JhbCB1aV9jb21tIHNlbGVjdGVkX2NvbW1pdF90eXBlCisJZ2xvYmFsIGZpbGVfc3RhdGVzIHNlbGVjdGVkX3BhdGhzIHJlc2Nhbl9hY3RpdmUKKwlnbG9iYWwgcmVwb19jb25maWcKKworCWdldHMgJGZkX3d0IHRyZWVfaWQKKwlpZiB7W2NhdGNoIHtjbG9zZSAkZmRfd3R9IGVycl19IHsKKwkJY2F0Y2gge2ZpbGUgZGVsZXRlICRtc2dfcH0KKwkJZXJyb3JfcG9wdXAgW3N0cmNhdCBbbWMgIndyaXRlLXRyZWUgZmFpbGVkOiJdICJcblxuJGVyciJdCisJCXVpX3N0YXR1cyBbbWMgIkNvbW1pdCBmYWlsZWQuIl0KKwkJdW5sb2NrX2luZGV4CisJCXJldHVybgorCX0KKworCSMgLS0gVmVyaWZ5IHRoaXMgd2Fzbid0IGFuIGVtcHR5IGNoYW5nZS4KKwkjCisJaWYgeyRjb21taXRfdHlwZSBlcSB7bm9ybWFsfX0geworCQlzZXQgZmRfb3QgW2dpdF9yZWFkIGNhdC1maWxlIGNvbW1pdCAkUEFSRU5UXQorCQlmY29uZmlndXJlICRmZF9vdCAtZW5jb2RpbmcgYmluYXJ5IC10cmFuc2xhdGlvbiBsZgorCQlzZXQgb2xkX3RyZWUgW2dldHMgJGZkX290XQorCQljbG9zZSAkZmRfb3QKKworCQlpZiB7W3N0cmluZyBlcXVhbCAtbGVuZ3RoIDUge3RyZWUgfSAkb2xkX3RyZWVdCisJCQkmJiBbc3RyaW5nIGxlbmd0aCAkb2xkX3RyZWVdID09IDQ1fSB7CisJCQlzZXQgb2xkX3RyZWUgW3N0cmluZyByYW5nZSAkb2xkX3RyZWUgNSBlbmRdCisJCX0gZWxzZSB7CisJCQllcnJvciBbbWMgIkNvbW1pdCAlcyBhcHBlYXJzIHRvIGJlIGNvcnJ1cHQiICRQQVJFTlRdCisJCX0KKworCQlpZiB7JHRyZWVfaWQgZXEgJG9sZF90cmVlfSB7CisJCQljYXRjaCB7ZmlsZSBkZWxldGUgJG1zZ19wfQorCQkJaW5mb19wb3B1cCBbbWMgIk5vIGNoYW5nZXMgdG8gY29tbWl0LgorCitObyBmaWxlcyB3ZXJlIG1vZGlmaWVkIGJ5IHRoaXMgY29tbWl0IGFuZCBpdCB3YXMgbm90IGEgbWVyZ2UgY29tbWl0LgorCitBIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBub3cuCisiXQorCQkJdW5sb2NrX2luZGV4CisJCQlyZXNjYW4ge3VpX3N0YXR1cyBbbWMgIk5vIGNoYW5nZXMgdG8gY29tbWl0LiJdfQorCQkJcmV0dXJuCisJCX0KKwl9CisKKwkjIC0tIENyZWF0ZSB0aGUgY29tbWl0LgorCSMKKwlzZXQgY21kIFtsaXN0IGNvbW1pdC10cmVlICR0cmVlX2lkXQorCWZvcmVhY2ggcCBbY29uY2F0ICRQQVJFTlQgJE1FUkdFX0hFQURdIHsKKwkJbGFwcGVuZCBjbWQgLXAgJHAKKwl9CisJbGFwcGVuZCBjbWQgPCRtc2dfcAorCWlmIHtbY2F0Y2gge3NldCBjbXRfaWQgW2V2YWwgZ2l0ICRjbWRdfSBlcnJdfSB7CisJCWNhdGNoIHtmaWxlIGRlbGV0ZSAkbXNnX3B9CisJCWVycm9yX3BvcHVwIFtzdHJjYXQgW21jICJjb21taXQtdHJlZSBmYWlsZWQ6Il0gIlxuXG4kZXJyIl0KKwkJdWlfc3RhdHVzIFttYyAiQ29tbWl0IGZhaWxlZC4iXQorCQl1bmxvY2tfaW5kZXgKKwkJcmV0dXJuCisJfQorCisJIyAtLSBVcGRhdGUgdGhlIEhFQUQgcmVmLgorCSMKKwlzZXQgcmVmbG9nbSBjb21taXQKKwlpZiB7JGNvbW1pdF90eXBlIG5lIHtub3JtYWx9fSB7CisJCWFwcGVuZCByZWZsb2dtICIgKCRjb21taXRfdHlwZSkiCisJfQorCXNldCBtc2dfZmQgW29wZW4gJG1zZ19wIHJdCisJZ2V0cyAkbXNnX2ZkIHN1YmplY3QKKwljbG9zZSAkbXNnX2ZkCisJYXBwZW5kIHJlZmxvZ20gezogfSAkc3ViamVjdAorCWlmIHtbY2F0Y2ggeworCQkJZ2l0IHVwZGF0ZS1yZWYgLW0gJHJlZmxvZ20gSEVBRCAkY210X2lkICRjdXJIRUFECisJCX0gZXJyXX0geworCQljYXRjaCB7ZmlsZSBkZWxldGUgJG1zZ19wfQorCQllcnJvcl9wb3B1cCBbc3RyY2F0IFttYyAidXBkYXRlLXJlZiBmYWlsZWQ6Il0gIlxuXG4kZXJyIl0KKwkJdWlfc3RhdHVzIFttYyAiQ29tbWl0IGZhaWxlZC4iXQorCQl1bmxvY2tfaW5kZXgKKwkJcmV0dXJuCisJfQorCisJIyAtLSBDbGVhbnVwIGFmdGVyIG91cnNlbHZlcy4KKwkjCisJY2F0Y2gge2ZpbGUgZGVsZXRlICRtc2dfcH0KKwljYXRjaCB7ZmlsZSBkZWxldGUgW2dpdGRpciBNRVJHRV9IRUFEXX0KKwljYXRjaCB7ZmlsZSBkZWxldGUgW2dpdGRpciBNRVJHRV9NU0ddfQorCWNhdGNoIHtmaWxlIGRlbGV0ZSBbZ2l0ZGlyIFNRVUFTSF9NU0ddfQorCWNhdGNoIHtmaWxlIGRlbGV0ZSBbZ2l0ZGlyIEdJVEdVSV9NU0ddfQorCisJIyAtLSBMZXQgcmVyZXJlIGRvIGl0cyB0aGluZy4KKwkjCisJaWYge1tnZXRfY29uZmlnIHJlcmVyZS5lbmFibGVkXSBlcSB7fX0geworCQlzZXQgcmVyZXJlIFtmaWxlIGlzZGlyZWN0b3J5IFtnaXRkaXIgcnItY2FjaGVdXQorCX0gZWxzZSB7CisJCXNldCByZXJlcmUgW2lzX2NvbmZpZ190cnVlIHJlcmVyZS5lbmFibGVkXQorCX0KKwlpZiB7JHJlcmVyZX0geworCQljYXRjaCB7Z2l0IHJlcmVyZX0KKwl9CisKKwkjIC0tIFJ1biB0aGUgcG9zdC1jb21taXQgaG9vay4KKwkjCisJc2V0IGZkX3BoIFtnaXRob29rX3JlYWQgcG9zdC1jb21taXRdCisJaWYgeyRmZF9waCBuZSB7fX0geworCQl1cHZhciAjMCBwY2hfZXJyb3IkY210X2lkIHBjX2VycgorCQlzZXQgcGNfZXJyIHt9CisJCWZjb25maWd1cmUgJGZkX3BoIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkgLWVvZmNoYXIge30KKwkJZmlsZWV2ZW50ICRmZF9waCByZWFkYWJsZSBcCisJCQlbbGlzdCBjb21taXRfcG9zdGNvbW1pdF93YWl0ICRmZF9waCAkY210X2lkXQorCX0KKworCSR1aV9jb21tIGRlbGV0ZSAwLjAgZW5kCisJJHVpX2NvbW0gZWRpdCByZXNldAorCSR1aV9jb21tIGVkaXQgbW9kaWZpZWQgZmFsc2UKKwlpZiB7JDo6R0lUR1VJX0JDS19leGlzdHN9IHsKKwkJY2F0Y2gge2ZpbGUgZGVsZXRlIFtnaXRkaXIgR0lUR1VJX0JDS119CisJCXNldCA6OkdJVEdVSV9CQ0tfZXhpc3RzIDAKKwl9CisKKwlpZiB7W2lzX2VuYWJsZWQgc2luZ2xlY29tbWl0XX0gZG9fcXVpdAorCisJIyAtLSBVcGRhdGUgaW4gbWVtb3J5IHN0YXR1cworCSMKKwlzZXQgc2VsZWN0ZWRfY29tbWl0X3R5cGUgbmV3CisJc2V0IGNvbW1pdF90eXBlIG5vcm1hbAorCXNldCBIRUFEICRjbXRfaWQKKwlzZXQgUEFSRU5UICRjbXRfaWQKKwlzZXQgTUVSR0VfSEVBRCBbbGlzdF0KKworCWZvcmVhY2ggcGF0aCBbYXJyYXkgbmFtZXMgZmlsZV9zdGF0ZXNdIHsKKwkJc2V0IHMgJGZpbGVfc3RhdGVzKCRwYXRoKQorCQlzZXQgbSBbbGluZGV4ICRzIDBdCisJCXN3aXRjaCAtZ2xvYiAtLSAkbSB7CisJCV9PIC0KKwkJX00gLQorCQlfRCB7Y29udGludWV9CisJCV9fIC0KKwkJQV8gLQorCQlNXyAtCisJCURfIHsKKwkJCXVuc2V0IGZpbGVfc3RhdGVzKCRwYXRoKQorCQkJY2F0Y2gge3Vuc2V0IHNlbGVjdGVkX3BhdGhzKCRwYXRoKX0KKwkJfQorCQlETyB7CisJCQlzZXQgZmlsZV9zdGF0ZXMoJHBhdGgpIFtsaXN0IF9PIFtsaW5kZXggJHMgMV0ge30ge31dCisJCX0KKwkJQU0gLQorCQlBRCAtCisJCU1NIC0KKwkJTUQgeworCQkJc2V0IGZpbGVfc3RhdGVzKCRwYXRoKSBbbGlzdCBcCisJCQkJX1tzdHJpbmcgaW5kZXggJG0gMV0gXAorCQkJCVtsaW5kZXggJHMgMV0gXAorCQkJCVtsaW5kZXggJHMgM10gXAorCQkJCXt9XQorCQl9CisJCX0KKwl9CisKKwlkaXNwbGF5X2FsbF9maWxlcworCXVubG9ja19pbmRleAorCXJlc2hvd19kaWZmCisJdWlfc3RhdHVzIFttYyAiQ3JlYXRlZCBjb21taXQgJXM6ICVzIiBbc3RyaW5nIHJhbmdlICRjbXRfaWQgMCA3XSAkc3ViamVjdF0KK30KKworcHJvYyBjb21taXRfcG9zdGNvbW1pdF93YWl0IHtmZF9waCBjbXRfaWR9IHsKKwl1cHZhciAjMCBwY2hfZXJyb3IkY210X2lkIHBjaF9lcnJvcgorCisJYXBwZW5kIHBjaF9lcnJvciBbcmVhZCAkZmRfcGhdCisJZmNvbmZpZ3VyZSAkZmRfcGggLWJsb2NraW5nIDEKKwlpZiB7W2VvZiAkZmRfcGhdfSB7CisJCWlmIHtbY2F0Y2gge2Nsb3NlICRmZF9waH1dfSB7CisJCQlob29rX2ZhaWxlZF9wb3B1cCBwb3N0LWNvbW1pdCAkcGNoX2Vycm9yIDAKKwkJfQorCQl1bnNldCBwY2hfZXJyb3IKKwkJcmV0dXJuCisJfQorCWZjb25maWd1cmUgJGZkX3BoIC1ibG9ja2luZyAwCit9CmRpZmYgLS1naXQgYS9naXQtZ3VpL2xpYi9jb25zb2xlLnRjbCBiL2dpdC1ndWkvbGliL2NvbnNvbGUudGNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMTI0NjQKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtZ3VpL2xpYi9jb25zb2xlLnRjbApAQCAtMCwwICsxLDIyMiBAQAorIyBnaXQtZ3VpIGNvbnNvbGUgc3VwcG9ydAorIyBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgU2hhd24gUGVhcmNlCisKK2NsYXNzIGNvbnNvbGUgeworCitmaWVsZCB0X3Nob3J0CitmaWVsZCB0X2xvbmcKK2ZpZWxkIHcKK2ZpZWxkIHdfdAorZmllbGQgY29uc29sZV9jcgorZmllbGQgaXNfdG9wbGV2ZWwgICAgMTsgIyBhcmUgd2Ugb3VyIG93biB3aW5kb3c/CisKK2NvbnN0cnVjdG9yIG5ldyB7c2hvcnRfdGl0bGUgbG9uZ190aXRsZX0geworCXNldCB0X3Nob3J0ICRzaG9ydF90aXRsZQorCXNldCB0X2xvbmcgJGxvbmdfdGl0bGUKKwlfaW5pdCAkdGhpcworCXJldHVybiAkdGhpcworfQorCitjb25zdHJ1Y3RvciBlbWJlZCB7cGF0aCB0aXRsZX0geworCXNldCB0X3Nob3J0IHt9CisJc2V0IHRfbG9uZyAkdGl0bGUKKwlzZXQgdyAkcGF0aAorCXNldCBpc190b3BsZXZlbCAwCisJX2luaXQgJHRoaXMKKwlyZXR1cm4gJHRoaXMKK30KKworbWV0aG9kIF9pbml0IHt9IHsKKwlnbG9iYWwgTTFCCisKKwlpZiB7JGlzX3RvcGxldmVsfSB7CisJCW1ha2VfdG9wbGV2ZWwgdG9wIHcgLWF1dG9kZWxldGUgMAorCQl3bSB0aXRsZSAkdG9wICJbYXBwbmFtZV0gKFtyZXBvbmFtZV0pOiAkdF9zaG9ydCIKKwl9IGVsc2UgeworCQlmcmFtZSAkdworCX0KKworCXNldCBjb25zb2xlX2NyIDEuMAorCXNldCB3X3QgJHcubS50CisKKwlmcmFtZSAkdy5tCisJbGFiZWwgJHcubS5sMSBcCisJCS10ZXh0dmFyaWFibGUgQHRfbG9uZyAgXAorCQktYW5jaG9yIHcgXAorCQktanVzdGlmeSBsZWZ0IFwKKwkJLWZvbnQgZm9udF91aWJvbGQKKwl0ZXh0ICR3X3QgXAorCQktYmFja2dyb3VuZCB3aGl0ZSBcCisJCS1mb3JlZ3JvdW5kIGJsYWNrIFwKKwkJLWJvcmRlcndpZHRoIDEgXAorCQktcmVsaWVmIHN1bmtlbiBcCisJCS13aWR0aCA4MCAtaGVpZ2h0IDEwIFwKKwkJLXdyYXAgbm9uZSBcCisJCS1mb250IGZvbnRfZGlmZiBcCisJCS1zdGF0ZSBkaXNhYmxlZCBcCisJCS14c2Nyb2xsY29tbWFuZCBbY2IgX3NiX3NldCAkdy5tLnNieCBoXSBcCisJCS15c2Nyb2xsY29tbWFuZCBbY2IgX3NiX3NldCAkdy5tLnNieSB2XQorCWxhYmVsICR3Lm0ucyAtdGV4dCBbbWMgIldvcmtpbmcuLi4gcGxlYXNlIHdhaXQuLi4iXSBcCisJCS1hbmNob3IgdyBcCisJCS1qdXN0aWZ5IGxlZnQgXAorCQktZm9udCBmb250X3VpYm9sZAorCXBhY2sgJHcubS5sMSAtc2lkZSB0b3AgLWZpbGwgeAorCXBhY2sgJHcubS5zIC1zaWRlIGJvdHRvbSAtZmlsbCB4CisJcGFjayAkd190IC1zaWRlIGxlZnQgLWZpbGwgYm90aCAtZXhwYW5kIDEKKwlwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxIC1wYWR4IDUgLXBhZHkgMTAKKworCW1lbnUgJHcuY3R4bSAtdGVhcm9mZiAwCisJJHcuY3R4bSBhZGQgY29tbWFuZCAtbGFiZWwgW21jICJDb3B5Il0gXAorCQktY29tbWFuZCAidGtfdGV4dENvcHkgJHdfdCIKKwkkdy5jdHhtIGFkZCBjb21tYW5kIC1sYWJlbCBbbWMgIlNlbGVjdCBBbGwiXSBcCisJCS1jb21tYW5kICJmb2N1cyAkd190OyR3X3QgdGFnIGFkZCBzZWwgMC4wIGVuZCIKKwkkdy5jdHhtIGFkZCBjb21tYW5kIC1sYWJlbCBbbWMgIkNvcHkgQWxsIl0gXAorCQktY29tbWFuZCAiCisJCQkkd190IHRhZyBhZGQgc2VsIDAuMCBlbmQKKwkJCXRrX3RleHRDb3B5ICR3X3QKKwkJCSR3X3QgdGFnIHJlbW92ZSBzZWwgMC4wIGVuZAorCQkiCisKKwlpZiB7JGlzX3RvcGxldmVsfSB7CisJCWJ1dHRvbiAkdy5vayAtdGV4dCBbbWMgIkNsb3NlIl0gXAorCQkJLXN0YXRlIGRpc2FibGVkIFwKKwkJCS1jb21tYW5kIFtsaXN0IGRlc3Ryb3kgJHddCisJCXBhY2sgJHcub2sgLXNpZGUgYm90dG9tIC1hbmNob3IgZSAtcGFkeSAxMCAtcGFkeCAxMAorCQliaW5kICR3IDxWaXNpYmlsaXR5PiBbbGlzdCBmb2N1cyAkd10KKwl9CisKKwliaW5kX2J1dHRvbjMgJHdfdCAidGtfcG9wdXAgJHcuY3R4bSAlWCAlWSIKKwliaW5kICR3X3QgPCRNMUItS2V5LWE+ICIkd190IHRhZyBhZGQgc2VsIDAuMCBlbmQ7YnJlYWsiCisJYmluZCAkd190IDwkTTFCLUtleS1BPiAiJHdfdCB0YWcgYWRkIHNlbCAwLjAgZW5kO2JyZWFrIgorfQorCittZXRob2QgZXhlYyB7Y21kIHthZnRlciB7fX19IHsKKwlpZiB7W2xpbmRleCAkY21kIDBdIGVxIHtnaXR9fSB7CisJCXNldCBmZF9mIFtldmFsIGdpdF9yZWFkIC0tc3RkZXJyIFtscmFuZ2UgJGNtZCAxIGVuZF1dCisJfSBlbHNlIHsKKwkJbGFwcGVuZCBjbWQgMj5AMQorCQlzZXQgZmRfZiBbX29wZW5fc3Rkb3V0X3N0ZGVyciAkY21kXQorCX0KKwlmY29uZmlndXJlICRmZF9mIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkKKwlmaWxlZXZlbnQgJGZkX2YgcmVhZGFibGUgW2NiIF9yZWFkICRmZF9mICRhZnRlcl0KK30KKworbWV0aG9kIF9yZWFkIHtmZCBhZnRlcn0geworCXNldCBidWYgW3JlYWQgJGZkXQorCWlmIHskYnVmIG5lIHt9fSB7CisJCWlmIHshW3dpbmZvIGV4aXN0cyAkd190XX0ge19pbml0ICR0aGlzfQorCQkkd190IGNvbmYgLXN0YXRlIG5vcm1hbAorCQlzZXQgYyAwCisJCXNldCBuIFtzdHJpbmcgbGVuZ3RoICRidWZdCisJCXdoaWxlIHskYyA8ICRufSB7CisJCQlzZXQgY3IgW3N0cmluZyBmaXJzdCAiXHIiICRidWYgJGNdCisJCQlzZXQgbGYgW3N0cmluZyBmaXJzdCAiXG4iICRidWYgJGNdCisJCQlpZiB7JGNyIDwgMH0ge3NldCBjciBbZXhwciB7JG4gKyAxfV19CisJCQlpZiB7JGxmIDwgMH0ge3NldCBsZiBbZXhwciB7JG4gKyAxfV19CisKKwkJCWlmIHskbGYgPCAkY3J9IHsKKwkJCQkkd190IGluc2VydCBlbmQgW3N0cmluZyByYW5nZSAkYnVmICRjICRsZl0KKwkJCQlzZXQgY29uc29sZV9jciBbJHdfdCBpbmRleCB7ZW5kIC0xY31dCisJCQkJc2V0IGMgJGxmCisJCQkJaW5jciBjCisJCQl9IGVsc2UgeworCQkJCSR3X3QgZGVsZXRlICRjb25zb2xlX2NyIGVuZAorCQkJCSR3X3QgaW5zZXJ0IGVuZCAiXG4iCisJCQkJJHdfdCBpbnNlcnQgZW5kIFtzdHJpbmcgcmFuZ2UgJGJ1ZiAkYyBbZXhwciB7JGNyIC0gMX1dXQorCQkJCXNldCBjICRjcgorCQkJCWluY3IgYworCQkJfQorCQl9CisJCSR3X3QgY29uZiAtc3RhdGUgZGlzYWJsZWQKKwkJJHdfdCBzZWUgZW5kCisJfQorCisJZmNvbmZpZ3VyZSAkZmQgLWJsb2NraW5nIDEKKwlpZiB7W2VvZiAkZmRdfSB7CisJCWlmIHtbY2F0Y2gge2Nsb3NlICRmZH1dfSB7CisJCQlzZXQgb2sgMAorCQl9IGVsc2UgeworCQkJc2V0IG9rIDEKKwkJfQorCQlpZiB7JGFmdGVyIG5lIHt9fSB7CisJCQl1cGxldmVsICMwICRhZnRlciAkb2sKKwkJfSBlbHNlIHsKKwkJCWRvbmUgJHRoaXMgJG9rCisJCX0KKwkJcmV0dXJuCisJfQorCWZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwCit9CisKK21ldGhvZCBjaGFpbiB7Y21kbGlzdCB7b2sgMX19IHsKKwlpZiB7JG9rfSB7CisJCWlmIHtbbGxlbmd0aCAkY21kbGlzdF0gPT0gMH0geworCQkJZG9uZSAkdGhpcyAkb2sKKwkJCXJldHVybgorCQl9CisKKwkJc2V0IGNtZCBbbGluZGV4ICRjbWRsaXN0IDBdCisJCXNldCBjbWRsaXN0IFtscmFuZ2UgJGNtZGxpc3QgMSBlbmRdCisKKwkJaWYge1tsaW5kZXggJGNtZCAwXSBlcSB7ZXhlY319IHsKKwkJCWV4ZWMgJHRoaXMgXAorCQkJCVtscmFuZ2UgJGNtZCAxIGVuZF0gXAorCQkJCVtjYiBjaGFpbiAkY21kbGlzdF0KKwkJfSBlbHNlIHsKKwkJCXVwbGV2ZWwgIzAgJGNtZCBbY2IgY2hhaW4gJGNtZGxpc3RdCisJCX0KKwl9IGVsc2UgeworCQlkb25lICR0aGlzICRvaworCX0KK30KKworbWV0aG9kIGluc2VydCB7dHh0fSB7CisJaWYgeyFbd2luZm8gZXhpc3RzICR3X3RdfSB7X2luaXQgJHRoaXN9CisJJHdfdCBjb25mIC1zdGF0ZSBub3JtYWwKKwkkd190IGluc2VydCBlbmQgIiR0eHRcbiIKKwlzZXQgY29uc29sZV9jciBbJHdfdCBpbmRleCB7ZW5kIC0xY31dCisJJHdfdCBjb25mIC1zdGF0ZSBkaXNhYmxlZAorfQorCittZXRob2QgZG9uZSB7b2t9IHsKKwlpZiB7JG9rfSB7CisJCWlmIHtbd2luZm8gZXhpc3RzICR3Lm0uc119IHsKKwkJCWJpbmQgJHcubS5zIDxEZXN0cm95PiBbbGlzdCBkZWxldGVfdGhpcyAkdGhpc10KKwkJCSR3Lm0ucyBjb25mIC1iYWNrZ3JvdW5kIGdyZWVuIC1mb3JlZ3JvdW5kIGJsYWNrIFwKKwkJCQktdGV4dCBbbWMgIlN1Y2Nlc3MiXQorCQkJaWYgeyRpc190b3BsZXZlbH0geworCQkJCSR3Lm9rIGNvbmYgLXN0YXRlIG5vcm1hbAorCQkJCWZvY3VzICR3Lm9rCisJCQl9CisJCX0gZWxzZSB7CisJCQlkZWxldGVfdGhpcworCQl9CisJfSBlbHNlIHsKKwkJaWYgeyFbd2luZm8gZXhpc3RzICR3Lm0uc119IHsKKwkJCV9pbml0ICR0aGlzCisJCX0KKwkJYmluZCAkdy5tLnMgPERlc3Ryb3k+IFtsaXN0IGRlbGV0ZV90aGlzICR0aGlzXQorCQkkdy5tLnMgY29uZiAtYmFja2dyb3VuZCByZWQgLWZvcmVncm91bmQgYmxhY2sgXAorCQkJLXRleHQgW21jICJFcnJvcjogQ29tbWFuZCBGYWlsZWQiXQorCQlpZiB7JGlzX3RvcGxldmVsfSB7CisJCQkkdy5vayBjb25mIC1zdGF0ZSBub3JtYWwKKwkJCWZvY3VzICR3Lm9rCisJCX0KKwl9Cit9CisKK21ldGhvZCBfc2Jfc2V0IHtzYiBvcmllbnQgZmlyc3QgbGFzdH0geworCWlmIHshW3dpbmZvIGV4aXN0cyAkc2JdfSB7CisJCWlmIHskZmlyc3QgPT0gJGxhc3QgfHwgKCRmaXJzdCA9PSAwICYmICRsYXN0ID09IDEpfSByZXR1cm4KKwkJaWYgeyRvcmllbnQgZXEge2h9fSB7CisJCQlzY3JvbGxiYXIgJHNiIC1vcmllbnQgaCAtY29tbWFuZCBbbGlzdCAkd190IHh2aWV3XQorCQkJcGFjayAkc2IgLWZpbGwgeCAtc2lkZSBib3R0b20gLWJlZm9yZSAkd190CisJCX0gZWxzZSB7CisJCQlzY3JvbGxiYXIgJHNiIC1vcmllbnQgdiAtY29tbWFuZCBbbGlzdCAkd190IHl2aWV3XQorCQkJcGFjayAkc2IgLWZpbGwgeSAtc2lkZSByaWdodCAtYmVmb3JlICR3X3QKKwkJfQorCX0KKwkkc2Igc2V0ICRmaXJzdCAkbGFzdAorfQorCit9CmRpZmYgLS1naXQgYS9naXQtZ3VpL2xpYi9kYXRhYmFzZS50Y2wgYi9naXQtZ3VpL2xpYi9kYXRhYmFzZS50Y2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY2YWEzZgotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvbGliL2RhdGFiYXNlLnRjbApAQCAtMCwwICsxLDExNiBAQAorIyBnaXQtZ3VpIG9iamVjdCBkYXRhYmFzZSBtYW5hZ2VtZW50IHN1cHBvcnQKKyMgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IFNoYXduIFBlYXJjZQorCitwcm9jIGRvX3N0YXRzIHt9IHsKKwlzZXQgZmQgW2dpdF9yZWFkIGNvdW50LW9iamVjdHMgLXZdCisJd2hpbGUge1tnZXRzICRmZCBsaW5lXSA+IDB9IHsKKwkJaWYge1tyZWdleHAge14oW146XSspOiAoXGQrKSR9ICRsaW5lIF8gbmFtZSB2YWx1ZV19IHsKKwkJCXNldCBzdGF0cygkbmFtZSkgJHZhbHVlCisJCX0KKwl9CisJY2xvc2UgJGZkCisKKwlzZXQgcGFja2VkX3N6IDAKKwlmb3JlYWNoIHAgW2dsb2IgLWRpcmVjdG9yeSBbZ2l0ZGlyIG9iamVjdHMgcGFja10gXAorCQktdHlwZSBmIFwKKwkJLW5vY29tcGxhaW4gLS0gKl0geworCQlpbmNyIHBhY2tlZF9zeiBbZmlsZSBzaXplICRwXQorCX0KKwlpZiB7JHBhY2tlZF9zeiA+IDB9IHsKKwkJc2V0IHN0YXRzKHNpemUtcGFjaykgW2V4cHIgeyRwYWNrZWRfc3ogLyAxMDI0fV0KKwl9CisKKwlzZXQgdyAuc3RhdHNfdmlldworCXRvcGxldmVsICR3CisJd20gZ2VvbWV0cnkgJHcgIitbd2luZm8gcm9vdHggLl0rW3dpbmZvIHJvb3R5IC5dIgorCisJbGFiZWwgJHcuaGVhZGVyIC10ZXh0IFttYyAiRGF0YWJhc2UgU3RhdGlzdGljcyJdCisJcGFjayAkdy5oZWFkZXIgLXNpZGUgdG9wIC1maWxsIHgKKworCWZyYW1lICR3LmJ1dHRvbnMgLWJvcmRlciAxCisJYnV0dG9uICR3LmJ1dHRvbnMuY2xvc2UgLXRleHQgW21jIENsb3NlXSBcCisJCS1kZWZhdWx0IGFjdGl2ZSBcCisJCS1jb21tYW5kIFtsaXN0IGRlc3Ryb3kgJHddCisJYnV0dG9uICR3LmJ1dHRvbnMuZ2MgLXRleHQgW21jICJDb21wcmVzcyBEYXRhYmFzZSJdIFwKKwkJLWRlZmF1bHQgbm9ybWFsIFwKKwkJLWNvbW1hbmQgImRlc3Ryb3kgJHc7ZG9fZ2MiCisJcGFjayAkdy5idXR0b25zLmNsb3NlIC1zaWRlIHJpZ2h0CisJcGFjayAkdy5idXR0b25zLmdjIC1zaWRlIGxlZnQKKwlwYWNrICR3LmJ1dHRvbnMgLXNpZGUgYm90dG9tIC1maWxsIHggLXBhZHkgMTAgLXBhZHggMTAKKworCWZyYW1lICR3LnN0YXQgLWJvcmRlcndpZHRoIDEgLXJlbGllZiBzb2xpZAorCWZvcmVhY2ggcyB7CisJCXtjb3VudCAgICAgICAgICAge21jICJOdW1iZXIgb2YgbG9vc2Ugb2JqZWN0cyJ9fQorCQl7c2l6ZSAgICAgICAgICAgIHttYyAiRGlzayBzcGFjZSB1c2VkIGJ5IGxvb3NlIG9iamVjdHMifSB7IEtpQn19CisJCXtpbi1wYWNrICAgICAgICAge21jICJOdW1iZXIgb2YgcGFja2VkIG9iamVjdHMifX0KKwkJe3BhY2tzICAgICAgICAgICB7bWMgIk51bWJlciBvZiBwYWNrcyJ9fQorCQl7c2l6ZS1wYWNrICAgICAgIHttYyAiRGlzayBzcGFjZSB1c2VkIGJ5IHBhY2tlZCBvYmplY3RzIn0geyBLaUJ9fQorCQl7cHJ1bmUtcGFja2FibGUgIHttYyAiUGFja2VkIG9iamVjdHMgd2FpdGluZyBmb3IgcHJ1bmluZyJ9fQorCQl7Z2FyYmFnZSAgICAgICAgIHttYyAiR2FyYmFnZSBmaWxlcyJ9fQorCQl9IHsKKwkJc2V0IG5hbWUgW2xpbmRleCAkcyAwXQorCQlzZXQgbGFiZWwgW2V2YWwgW2xpbmRleCAkcyAxXV0KKwkJaWYge1tjYXRjaCB7c2V0IHZhbHVlICRzdGF0cygkbmFtZSl9XX0gY29udGludWUKKwkJaWYge1tsbGVuZ3RoICRzXSA+IDJ9IHsKKwkJCXNldCB2YWx1ZSAiJHZhbHVlW2xpbmRleCAkcyAyXSIKKwkJfQorCisJCWxhYmVsICR3LnN0YXQubF8kbmFtZSAtdGV4dCAiJGxhYmVsOiIgLWFuY2hvciB3CisJCWxhYmVsICR3LnN0YXQudl8kbmFtZSAtdGV4dCAkdmFsdWUgLWFuY2hvciB3CisJCWdyaWQgJHcuc3RhdC5sXyRuYW1lICR3LnN0YXQudl8kbmFtZSAtc3RpY2t5IHdlIC1wYWR4IHswIDV9CisJfQorCXBhY2sgJHcuc3RhdCAtcGFkeSAxMCAtcGFkeCAxMAorCisJYmluZCAkdyA8VmlzaWJpbGl0eT4gImdyYWIgJHc7IGZvY3VzICR3LmJ1dHRvbnMuY2xvc2UiCisJYmluZCAkdyA8S2V5LUVzY2FwZT4gW2xpc3QgZGVzdHJveSAkd10KKwliaW5kICR3IDxLZXktUmV0dXJuPiBbbGlzdCBkZXN0cm95ICR3XQorCXdtIHRpdGxlICR3IFthcHBlbmQgIlthcHBuYW1lXSAoW3JlcG9uYW1lXSk6ICIgW21jICJEYXRhYmFzZSBTdGF0aXN0aWNzIl1dCisJdGt3YWl0IHdpbmRvdyAkdworfQorCitwcm9jIGRvX2djIHt9IHsKKwlzZXQgdyBbY29uc29sZTo6bmV3IHtnY30gW21jICJDb21wcmVzc2luZyB0aGUgb2JqZWN0IGRhdGFiYXNlIl1dCisJY29uc29sZTo6Y2hhaW4gJHcgeworCQl7ZXhlYyBnaXQgcGFjay1yZWZzIC0tcHJ1bmV9CisJCXtleGVjIGdpdCByZWZsb2cgZXhwaXJlIC0tYWxsfQorCQl7ZXhlYyBnaXQgcmVwYWNrIC1hIC1kIC1sfQorCQl7ZXhlYyBnaXQgcmVyZXJlIGdjfQorCX0KK30KKworcHJvYyBkb19mc2NrX29iamVjdHMge30geworCXNldCB3IFtjb25zb2xlOjpuZXcge2ZzY2stb2JqZWN0c30gXAorCQlbbWMgIlZlcmlmeWluZyB0aGUgb2JqZWN0IGRhdGFiYXNlIHdpdGggZnNjay1vYmplY3RzIl1dCisJc2V0IGNtZCBbbGlzdCBnaXQgZnNjay1vYmplY3RzXQorCWxhcHBlbmQgY21kIC0tZnVsbAorCWxhcHBlbmQgY21kIC0tY2FjaGUKKwlsYXBwZW5kIGNtZCAtLXN0cmljdAorCWNvbnNvbGU6OmV4ZWMgJHcgJGNtZAorfQorCitwcm9jIGhpbnRfZ2Mge30geworCXNldCBvYmplY3RfbGltaXQgOAorCWlmIHtbaXNfV2luZG93c119IHsKKwkJc2V0IG9iamVjdF9saW1pdCAxCisJfQorCisJc2V0IG9iamVjdHNfY3VycmVudCBbbGxlbmd0aCBbZ2xvYiBcCisJCS1kaXJlY3RvcnkgW2dpdGRpciBvYmplY3RzIDQyXSBcCisJCS1ub2NvbXBsYWluIFwKKwkJLXRhaWxzIFwKKwkJLS0gXAorCQkqXV0KKworCWlmIHskb2JqZWN0c19jdXJyZW50ID49ICRvYmplY3RfbGltaXR9IHsKKwkJc2V0IG9iamVjdHNfY3VycmVudCBbZXhwciB7JG9iamVjdHNfY3VycmVudCAqIDI1Nn1dCisJCXNldCBvYmplY3RfbGltaXQgICAgW2V4cHIgeyRvYmplY3RfbGltaXQgICAgKiAyNTZ9XQorCQlpZiB7W2Fza19wb3B1cCBcCisJCQlbbWMgIlRoaXMgcmVwb3NpdG9yeSBjdXJyZW50bHkgaGFzIGFwcHJveGltYXRlbHkgJWkgbG9vc2Ugb2JqZWN0cy4KKworVG8gbWFpbnRhaW4gb3B0aW1hbCBwZXJmb3JtYW5jZSBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBjb21wcmVzcyB0aGUgZGF0YWJhc2Ugd2hlbiBtb3JlIHRoYW4gJWkgbG9vc2Ugb2JqZWN0cyBleGlzdC4KKworQ29tcHJlc3MgdGhlIGRhdGFiYXNlIG5vdz8iICRvYmplY3RzX2N1cnJlbnQgJG9iamVjdF9saW1pdF1dIGVxIHllc30geworCQkJZG9fZ2MKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2dpdC1ndWkvbGliL2RhdGUudGNsIGIvZ2l0LWd1aS9saWIvZGF0ZS50Y2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlODI5OQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvbGliL2RhdGUudGNsCkBAIC0wLDAgKzEsNTMgQEAKKyMgZ2l0LWd1aSBkYXRlIHByb2Nlc3Npbmcgc3VwcG9ydAorIyBDb3B5cmlnaHQgKEMpIDIwMDcgU2hhd24gUGVhcmNlCisKK3NldCBnaXRfbW9udGgoSmFuKSAgMQorc2V0IGdpdF9tb250aChGZWIpICAyCitzZXQgZ2l0X21vbnRoKE1hcikgIDMKK3NldCBnaXRfbW9udGgoQXByKSAgNAorc2V0IGdpdF9tb250aChNYXkpICA1CitzZXQgZ2l0X21vbnRoKEp1bikgIDYKK3NldCBnaXRfbW9udGgoSnVsKSAgNworc2V0IGdpdF9tb250aChBdWcpICA4CitzZXQgZ2l0X21vbnRoKFNlcCkgIDkKK3NldCBnaXRfbW9udGgoT2N0KSAxMAorc2V0IGdpdF9tb250aChOb3YpIDExCitzZXQgZ2l0X21vbnRoKERlYykgMTIKKworcHJvYyBwYXJzZV9naXRfZGF0ZSB7c30geworCWlmIHskcyBlcSB7fX0geworCQlyZXR1cm4ge30KKwl9CisKKwlpZiB7IVtyZWdleHAgXAorCQl7Xi4uLiAoLi4uKSAoXGR7MSwyfSkgKFxkXGQpOihcZFxkKTooXGRcZCkgKFxkezR9KSAoWystXT8pKFxkXGQpKFxkXGQpJH0gJHMgcyBcCisJCW1vbnRoIGRheSBociBtbSBzcyB5ciBldyB0el9oIHR6X21dfSB7CisJCWVycm9yIFttYyAiSW52YWxpZCBkYXRlIGZyb20gR2l0OiAlcyIgJHNdCisJfQorCisJc2V0IHMgW2Nsb2NrIHNjYW4gW2Zvcm1hdCB7JTQuNGklMi4yaSUyLjJpVCUycyUycyUyc30gXAorCQkJJHlyICQ6OmdpdF9tb250aCgkbW9udGgpICRkYXkgXAorCQkJJGhyICRtbSAkc3NdIFwKKwkJCS1nbXQgMV0KKworCXJlZ3N1YiBeMCAkdHpfaCB7fSB0el9oCisJcmVnc3ViIF4wICR0el9tIHt9IHR6X20KKwlzd2l0Y2ggLS0gJGV3IHsKKwktICB7c2V0IGV3ICt9CisJKyAge3NldCBldyAtfQorCXt9IHtzZXQgZXcgLX0KKwl9CisKKwlyZXR1cm4gW2V4cHIgIiRzICRldyAoJHR6X2ggKiAzNjAwICsgJHR6X20gKiA2MCkiXQorfQorCitwcm9jIGZvcm1hdF9kYXRlIHtzfSB7CisJaWYgeyRzIGVxIHt9fSB7CisJCXJldHVybiB7fQorCX0KKwlyZXR1cm4gW2Nsb2NrIGZvcm1hdCAkcyAtZm9ybWF0IHslYSAlYiAlZSAlSDolTTolUyAlWX1dCit9CisKK3Byb2MgcmVmb3JtYXRfZGF0ZSB7c30geworCXJldHVybiBbZm9ybWF0X2RhdGUgW3BhcnNlX2dpdF9kYXRlICRzXV0KK30KZGlmZiAtLWdpdCBhL2dpdC1ndWkvbGliL2RpZmYudGNsIGIvZ2l0LWd1aS9saWIvZGlmZi50Y2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA0ZjZkYgotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvbGliL2RpZmYudGNsCkBAIC0wLDAgKzEsMzY0IEBACisjIGdpdC1ndWkgZGlmZiB2aWV3ZXIKKyMgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IFNoYXduIFBlYXJjZQorCitwcm9jIGNsZWFyX2RpZmYge30geworCWdsb2JhbCB1aV9kaWZmIGN1cnJlbnRfZGlmZl9wYXRoIGN1cnJlbnRfZGlmZl9oZWFkZXIKKwlnbG9iYWwgdWlfaW5kZXggdWlfd29ya2RpcgorCisJJHVpX2RpZmYgY29uZiAtc3RhdGUgbm9ybWFsCisJJHVpX2RpZmYgZGVsZXRlIDAuMCBlbmQKKwkkdWlfZGlmZiBjb25mIC1zdGF0ZSBkaXNhYmxlZAorCisJc2V0IGN1cnJlbnRfZGlmZl9wYXRoIHt9CisJc2V0IGN1cnJlbnRfZGlmZl9oZWFkZXIge30KKworCSR1aV9pbmRleCB0YWcgcmVtb3ZlIGluX2RpZmYgMC4wIGVuZAorCSR1aV93b3JrZGlyIHRhZyByZW1vdmUgaW5fZGlmZiAwLjAgZW5kCit9CisKK3Byb2MgcmVzaG93X2RpZmYge30geworCWdsb2JhbCBmaWxlX3N0YXRlcyBmaWxlX2xpc3RzCisJZ2xvYmFsIGN1cnJlbnRfZGlmZl9wYXRoIGN1cnJlbnRfZGlmZl9zaWRlCisKKwlzZXQgcCAkY3VycmVudF9kaWZmX3BhdGgKKwlpZiB7JHAgZXEge319IHsKKwkJIyBObyBkaWZmIGlzIGJlaW5nIHNob3duLgorCX0gZWxzZWlmIHskY3VycmVudF9kaWZmX3NpZGUgZXEge30KKwkJfHwgW2NhdGNoIHtzZXQgcyAkZmlsZV9zdGF0ZXMoJHApfV0KKwkJfHwgW2xzZWFyY2ggLXNvcnRlZCAtZXhhY3QgJGZpbGVfbGlzdHMoJGN1cnJlbnRfZGlmZl9zaWRlKSAkcF0gPT0gLTF9IHsKKwkJY2xlYXJfZGlmZgorCX0gZWxzZSB7CisJCXNob3dfZGlmZiAkcCAkY3VycmVudF9kaWZmX3NpZGUKKwl9Cit9CisKK3Byb2MgaGFuZGxlX2VtcHR5X2RpZmYge30geworCWdsb2JhbCBjdXJyZW50X2RpZmZfcGF0aCBmaWxlX3N0YXRlcyBmaWxlX2xpc3RzCisKKwlzZXQgcGF0aCAkY3VycmVudF9kaWZmX3BhdGgKKwlzZXQgcyAkZmlsZV9zdGF0ZXMoJHBhdGgpCisJaWYge1tsaW5kZXggJHMgMF0gbmUge19NfX0gcmV0dXJuCisKKwlpbmZvX3BvcHVwIFttYyAiTm8gZGlmZmVyZW5jZXMgZGV0ZWN0ZWQuCisKKyVzIGhhcyBubyBjaGFuZ2VzLgorCitUaGUgbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhpcyBmaWxlIHdhcyB1cGRhdGVkIGJ5IGFub3RoZXIgYXBwbGljYXRpb24sIGJ1dCB0aGUgY29udGVudCB3aXRoaW4gdGhlIGZpbGUgd2FzIG5vdCBjaGFuZ2VkLgorCitBIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB0byBmaW5kIG90aGVyIGZpbGVzIHdoaWNoIG1heSBoYXZlIHRoZSBzYW1lIHN0YXRlLiIgW3Nob3J0X3BhdGggJHBhdGhdXQorCisJY2xlYXJfZGlmZgorCWRpc3BsYXlfZmlsZSAkcGF0aCBfXworCXJlc2NhbiB1aV9yZWFkeSAwCit9CisKK3Byb2Mgc2hvd19kaWZmIHtwYXRoIHcge2xubyB7fX19IHsKKwlnbG9iYWwgZmlsZV9zdGF0ZXMgZmlsZV9saXN0cworCWdsb2JhbCBpc18zd2F5X2RpZmYgZGlmZl9hY3RpdmUgcmVwb19jb25maWcKKwlnbG9iYWwgdWlfZGlmZiB1aV9pbmRleCB1aV93b3JrZGlyCisJZ2xvYmFsIGN1cnJlbnRfZGlmZl9wYXRoIGN1cnJlbnRfZGlmZl9zaWRlIGN1cnJlbnRfZGlmZl9oZWFkZXIKKworCWlmIHskZGlmZl9hY3RpdmUgfHwgIVtsb2NrX2luZGV4IHJlYWRdfSByZXR1cm4KKworCWNsZWFyX2RpZmYKKwlpZiB7JGxubyA9PSB7fX0geworCQlzZXQgbG5vIFtsc2VhcmNoIC1zb3J0ZWQgLWV4YWN0ICRmaWxlX2xpc3RzKCR3KSAkcGF0aF0KKwkJaWYgeyRsbm8gPj0gMH0geworCQkJaW5jciBsbm8KKwkJfQorCX0KKwlpZiB7JGxubyA+PSAxfSB7CisJCSR3IHRhZyBhZGQgaW5fZGlmZiAkbG5vLjAgW2V4cHIgeyRsbm8gKyAxfV0uMAorCX0KKworCXNldCBzICRmaWxlX3N0YXRlcygkcGF0aCkKKwlzZXQgbSBbbGluZGV4ICRzIDBdCisJc2V0IGlzXzN3YXlfZGlmZiAwCisJc2V0IGRpZmZfYWN0aXZlIDEKKwlzZXQgY3VycmVudF9kaWZmX3BhdGggJHBhdGgKKwlzZXQgY3VycmVudF9kaWZmX3NpZGUgJHcKKwlzZXQgY3VycmVudF9kaWZmX2hlYWRlciB7fQorCXVpX3N0YXR1cyBbbWMgIkxvYWRpbmcgZGlmZiBvZiAlcy4uLiIgW2VzY2FwZV9wYXRoICRwYXRoXV0KKworCSMgLSBHaXQgd29uJ3QgZ2l2ZSB1cyB0aGUgZGlmZiwgdGhlcmUncyBub3RoaW5nIHRvIGNvbXBhcmUgdG8hCisJIworCWlmIHskbSBlcSB7X099fSB7CisJCXNldCBtYXhfc3ogW2V4cHIgezEyOCAqIDEwMjR9XQorCQlzZXQgdHlwZSB1bmtub3duCisJCWlmIHtbY2F0Y2ggeworCQkJCXNldCB0eXBlIFtmaWxlIHR5cGUgJHBhdGhdCisJCQkJc3dpdGNoIC0tICR0eXBlIHsKKwkJCQlkaXJlY3RvcnkgeworCQkJCQlzZXQgdHlwZSBzdWJtb2R1bGUKKwkJCQkJc2V0IGNvbnRlbnQge30KKwkJCQkJc2V0IHN6IDAKKwkJCQl9CisJCQkJbGluayB7CisJCQkJCXNldCBjb250ZW50IFtmaWxlIHJlYWRsaW5rICRwYXRoXQorCQkJCQlzZXQgc3ogW3N0cmluZyBsZW5ndGggJGNvbnRlbnRdCisJCQkJfQorCQkJCWZpbGUgeworCQkJCQlzZXQgZmQgW29wZW4gJHBhdGggcl0KKwkJCQkJZmNvbmZpZ3VyZSAkZmQgLWVvZmNoYXIge30KKwkJCQkJc2V0IGNvbnRlbnQgW3JlYWQgJGZkICRtYXhfc3pdCisJCQkJCWNsb3NlICRmZAorCQkJCQlzZXQgc3ogW2ZpbGUgc2l6ZSAkcGF0aF0KKwkJCQl9CisJCQkJZGVmYXVsdCB7CisJCQkJCWVycm9yICInJHR5cGUnIG5vdCBzdXBwb3J0ZWQiCisJCQkJfQorCQkJCX0KKwkJCX0gZXJyIF19IHsKKwkJCXNldCBkaWZmX2FjdGl2ZSAwCisJCQl1bmxvY2tfaW5kZXgKKwkJCXVpX3N0YXR1cyBbbWMgIlVuYWJsZSB0byBkaXNwbGF5ICVzIiBbZXNjYXBlX3BhdGggJHBhdGhdXQorCQkJZXJyb3JfcG9wdXAgW3N0cmNhdCBbbWMgIkVycm9yIGxvYWRpbmcgZmlsZToiXSAiXG5cbiRlcnIiXQorCQkJcmV0dXJuCisJCX0KKwkJJHVpX2RpZmYgY29uZiAtc3RhdGUgbm9ybWFsCisJCWlmIHskdHlwZSBlcSB7c3VibW9kdWxlfX0geworCQkJJHVpX2RpZmYgaW5zZXJ0IGVuZCBbYXBwZW5kIFwKKwkJCQkiKiAiIFwKKwkJCQlbbWMgIkdpdCBSZXBvc2l0b3J5IChzdWJwcm9qZWN0KSJdIFwKKwkJCQkiXG4iXSBkX0AKKwkJfSBlbHNlaWYgeyFbY2F0Y2gge3NldCB0eXBlIFtleGVjIGZpbGUgJHBhdGhdfV19IHsKKwkJCXNldCBuIFtzdHJpbmcgbGVuZ3RoICRwYXRoXQorCQkJaWYge1tzdHJpbmcgZXF1YWwgLWxlbmd0aCAkbiAkcGF0aCAkdHlwZV19IHsKKwkJCQlzZXQgdHlwZSBbc3RyaW5nIHJhbmdlICR0eXBlICRuIGVuZF0KKwkJCQlyZWdzdWIge146P1xzKn0gJHR5cGUge30gdHlwZQorCQkJfQorCQkJJHVpX2RpZmYgaW5zZXJ0IGVuZCAiKiAkdHlwZVxuIiBkX0AKKwkJfQorCQlpZiB7W3N0cmluZyBmaXJzdCAiXDAiICRjb250ZW50XSAhPSAtMX0geworCQkJJHVpX2RpZmYgaW5zZXJ0IGVuZCBcCisJCQkJW21jICIqIEJpbmFyeSBmaWxlIChub3Qgc2hvd2luZyBjb250ZW50KS4iXSBcCisJCQkJZF9ACisJCX0gZWxzZSB7CisJCQlpZiB7JHN6ID4gJG1heF9zen0geworCQkJCSR1aV9kaWZmIGluc2VydCBlbmQgXAorIiogVW50cmFja2VkIGZpbGUgaXMgJHN6IGJ5dGVzLgorKiBTaG93aW5nIG9ubHkgZmlyc3QgJG1heF9zeiBieXRlcy4KKyIgZF9ACisJCQl9CisJCQkkdWlfZGlmZiBpbnNlcnQgZW5kICRjb250ZW50CisJCQlpZiB7JHN6ID4gJG1heF9zen0geworCQkJCSR1aV9kaWZmIGluc2VydCBlbmQgIgorKiBVbnRyYWNrZWQgZmlsZSBjbGlwcGVkIGhlcmUgYnkgW2FwcG5hbWVdLgorKiBUbyBzZWUgdGhlIGVudGlyZSBmaWxlLCB1c2UgYW4gZXh0ZXJuYWwgZWRpdG9yLgorIiBkX0AKKwkJCX0KKwkJfQorCQkkdWlfZGlmZiBjb25mIC1zdGF0ZSBkaXNhYmxlZAorCQlzZXQgZGlmZl9hY3RpdmUgMAorCQl1bmxvY2tfaW5kZXgKKwkJdWlfcmVhZHkKKwkJcmV0dXJuCisJfQorCisJc2V0IGNtZCBbbGlzdF0KKwlpZiB7JHcgZXEgJHVpX2luZGV4fSB7CisJCWxhcHBlbmQgY21kIGRpZmYtaW5kZXgKKwkJbGFwcGVuZCBjbWQgLS1jYWNoZWQKKwl9IGVsc2VpZiB7JHcgZXEgJHVpX3dvcmtkaXJ9IHsKKwkJaWYge1tzdHJpbmcgaW5kZXggJG0gMF0gZXEge1V9fSB7CisJCQlsYXBwZW5kIGNtZCBkaWZmCisJCX0gZWxzZSB7CisJCQlsYXBwZW5kIGNtZCBkaWZmLWZpbGVzCisJCX0KKwl9CisKKwlsYXBwZW5kIGNtZCAtcAorCWxhcHBlbmQgY21kIC0tbm8tY29sb3IKKwlpZiB7JHJlcG9fY29uZmlnKGd1aS5kaWZmY29udGV4dCkgPj0gMH0geworCQlsYXBwZW5kIGNtZCAiLVUkcmVwb19jb25maWcoZ3VpLmRpZmZjb250ZXh0KSIKKwl9CisJaWYgeyR3IGVxICR1aV9pbmRleH0geworCQlsYXBwZW5kIGNtZCBbUEFSRU5UXQorCX0KKwlsYXBwZW5kIGNtZCAtLQorCWxhcHBlbmQgY21kICRwYXRoCisKKwlpZiB7W2NhdGNoIHtzZXQgZmQgW2V2YWwgZ2l0X3JlYWQgLS1uaWNlICRjbWRdfSBlcnJdfSB7CisJCXNldCBkaWZmX2FjdGl2ZSAwCisJCXVubG9ja19pbmRleAorCQl1aV9zdGF0dXMgW21jICJVbmFibGUgdG8gZGlzcGxheSAlcyIgW2VzY2FwZV9wYXRoICRwYXRoXV0KKwkJZXJyb3JfcG9wdXAgW3N0cmNhdCBbbWMgIkVycm9yIGxvYWRpbmcgZGlmZjoiXSAiXG5cbiRlcnIiXQorCQlyZXR1cm4KKwl9CisKKwlmY29uZmlndXJlICRmZCBcCisJCS1ibG9ja2luZyAwIFwKKwkJLWVuY29kaW5nIGJpbmFyeSBcCisJCS10cmFuc2xhdGlvbiBiaW5hcnkKKwlmaWxlZXZlbnQgJGZkIHJlYWRhYmxlIFtsaXN0IHJlYWRfZGlmZiAkZmRdCit9CisKK3Byb2MgcmVhZF9kaWZmIHtmZH0geworCWdsb2JhbCB1aV9kaWZmIGRpZmZfYWN0aXZlCisJZ2xvYmFsIGlzXzN3YXlfZGlmZiBjdXJyZW50X2RpZmZfaGVhZGVyCisKKwkkdWlfZGlmZiBjb25mIC1zdGF0ZSBub3JtYWwKKwl3aGlsZSB7W2dldHMgJGZkIGxpbmVdID49IDB9IHsKKwkJIyAtLSBDbGVhbnVwIHVuaW50ZXJlc3RpbmcgZGlmZiBoZWFkZXIgbGluZXMuCisJCSMKKwkJaWYgeyAgIFtzdHJpbmcgbWF0Y2gge2RpZmYgLS1naXQgKn0gICAgICAkbGluZV0KKwkJCXx8IFtzdHJpbmcgbWF0Y2gge2RpZmYgLS1jYyAqfSAgICAgICAkbGluZV0KKwkJCXx8IFtzdHJpbmcgbWF0Y2gge2RpZmYgLS1jb21iaW5lZCAqfSAkbGluZV0KKwkJCXx8IFtzdHJpbmcgbWF0Y2ggey0tLSAqfSAgICAgICAgICAgICAkbGluZV0KKwkJCXx8IFtzdHJpbmcgbWF0Y2ggeysrKyAqfSAgICAgICAgICAgICAkbGluZV19IHsKKwkJCWFwcGVuZCBjdXJyZW50X2RpZmZfaGVhZGVyICRsaW5lICJcbiIKKwkJCWNvbnRpbnVlCisJCX0KKwkJaWYge1tzdHJpbmcgbWF0Y2gge2luZGV4ICp9ICRsaW5lXX0gY29udGludWUKKwkJaWYgeyRsaW5lIGVxIHtkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDB9fSB7CisJCQlzZXQgbGluZSAiZGVsZXRlZCBzeW1saW5rIgorCQl9CisKKwkJIyAtLSBBdXRvbWF0aWNhbGx5IGRldGVjdCBpZiB0aGlzIGlzIGEgMyB3YXkgZGlmZi4KKwkJIworCQlpZiB7W3N0cmluZyBtYXRjaCB7QEBAICp9ICRsaW5lXX0ge3NldCBpc18zd2F5X2RpZmYgMX0KKworCQlpZiB7W3N0cmluZyBtYXRjaCB7bW9kZSAqfSAkbGluZV0KKwkJCXx8IFtzdHJpbmcgbWF0Y2gge25ldyBmaWxlICp9ICRsaW5lXQorCQkJfHwgW3JlZ2V4cCB7XihvbGR8bmV3KSBtb2RlICp9ICRsaW5lXQorCQkJfHwgW3N0cmluZyBtYXRjaCB7ZGVsZXRlZCBmaWxlICp9ICRsaW5lXQorCQkJfHwgW3N0cmluZyBtYXRjaCB7ZGVsZXRlZCBzeW1saW5rfSAkbGluZV0KKwkJCXx8IFtzdHJpbmcgbWF0Y2gge0JpbmFyeSBmaWxlcyAqIGFuZCAqIGRpZmZlcn0gJGxpbmVdCisJCQl8fCAkbGluZSBlcSB7XCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlfQorCQkJfHwgW3JlZ2V4cCB7XlwqIFVubWVyZ2VkIHBhdGggfSAkbGluZV19IHsKKwkJCXNldCB0YWdzIHt9CisJCX0gZWxzZWlmIHskaXNfM3dheV9kaWZmfSB7CisJCQlzZXQgb3AgW3N0cmluZyByYW5nZSAkbGluZSAwIDFdCisJCQlzd2l0Y2ggLS0gJG9wIHsKKwkJCXsgIH0ge3NldCB0YWdzIHt9fQorCQkJe0BAfSB7c2V0IHRhZ3MgZF9AfQorCQkJeyArfSB7c2V0IHRhZ3MgZF9zK30KKwkJCXsgLX0ge3NldCB0YWdzIGRfcy19CisJCQl7KyB9IHtzZXQgdGFncyBkXytzfQorCQkJey0gfSB7c2V0IHRhZ3MgZF8tc30KKwkJCXstLX0ge3NldCB0YWdzIGRfLS19CisJCQl7Kyt9IHsKKwkJCQlpZiB7W3JlZ2V4cCB7XlwrXCsoWzw+XXs3fSB8PXs3fSl9ICRsaW5lIF9nIG9wXX0geworCQkJCQlzZXQgbGluZSBbc3RyaW5nIHJlcGxhY2UgJGxpbmUgMCAxIHsgIH1dCisJCQkJCXNldCB0YWdzIGQkb3AKKwkJCQl9IGVsc2UgeworCQkJCQlzZXQgdGFncyBkXysrCisJCQkJfQorCQkJfQorCQkJZGVmYXVsdCB7CisJCQkJcHV0cyAiZXJyb3I6IFVuaGFuZGxlZCAzIHdheSBkaWZmIG1hcmtlcjogeyRvcH0iCisJCQkJc2V0IHRhZ3Mge30KKwkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNldCBvcCBbc3RyaW5nIGluZGV4ICRsaW5lIDBdCisJCQlzd2l0Y2ggLS0gJG9wIHsKKwkJCXsgfSB7c2V0IHRhZ3Mge319CisJCQl7QH0ge3NldCB0YWdzIGRfQH0KKwkJCXstfSB7c2V0IHRhZ3MgZF8tfQorCQkJeyt9IHsKKwkJCQlpZiB7W3JlZ2V4cCB7XlwrKFs8Pl17N30gfD17N30pfSAkbGluZSBfZyBvcF19IHsKKwkJCQkJc2V0IGxpbmUgW3N0cmluZyByZXBsYWNlICRsaW5lIDAgMCB7IH1dCisJCQkJCXNldCB0YWdzIGQkb3AKKwkJCQl9IGVsc2UgeworCQkJCQlzZXQgdGFncyBkXysKKwkJCQl9CisJCQl9CisJCQlkZWZhdWx0IHsKKwkJCQlwdXRzICJlcnJvcjogVW5oYW5kbGVkIDIgd2F5IGRpZmYgbWFya2VyOiB7JG9wfSIKKwkJCQlzZXQgdGFncyB7fQorCQkJfQorCQkJfQorCQl9CisJCSR1aV9kaWZmIGluc2VydCBlbmQgJGxpbmUgJHRhZ3MKKwkJaWYge1tzdHJpbmcgaW5kZXggJGxpbmUgZW5kXSBlcSAiXHIifSB7CisJCQkkdWlfZGlmZiB0YWcgYWRkIGRfY3Ige2VuZCAtIDJjfQorCQl9CisJCSR1aV9kaWZmIGluc2VydCBlbmQgIlxuIiAkdGFncworCX0KKwkkdWlfZGlmZiBjb25mIC1zdGF0ZSBkaXNhYmxlZAorCisJaWYge1tlb2YgJGZkXX0geworCQljbG9zZSAkZmQKKwkJc2V0IGRpZmZfYWN0aXZlIDAKKwkJdW5sb2NrX2luZGV4CisJCXVpX3JlYWR5CisKKwkJaWYge1skdWlfZGlmZiBpbmRleCBlbmRdIGVxIHsyLjB9fSB7CisJCQloYW5kbGVfZW1wdHlfZGlmZgorCQl9CisJfQorfQorCitwcm9jIGFwcGx5X2h1bmsge3ggeX0geworCWdsb2JhbCBjdXJyZW50X2RpZmZfcGF0aCBjdXJyZW50X2RpZmZfaGVhZGVyIGN1cnJlbnRfZGlmZl9zaWRlCisJZ2xvYmFsIHVpX2RpZmYgdWlfaW5kZXggZmlsZV9zdGF0ZXMKKworCWlmIHskY3VycmVudF9kaWZmX3BhdGggZXEge30gfHwgJGN1cnJlbnRfZGlmZl9oZWFkZXIgZXEge319IHJldHVybgorCWlmIHshW2xvY2tfaW5kZXggYXBwbHlfaHVua119IHJldHVybgorCisJc2V0IGFwcGx5X2NtZCB7YXBwbHkgLS1jYWNoZWQgLS13aGl0ZXNwYWNlPW5vd2Fybn0KKwlzZXQgbWkgW2xpbmRleCAkZmlsZV9zdGF0ZXMoJGN1cnJlbnRfZGlmZl9wYXRoKSAwXQorCWlmIHskY3VycmVudF9kaWZmX3NpZGUgZXEgJHVpX2luZGV4fSB7CisJCXNldCBmYWlsZWRfbXNnIFttYyAiRmFpbGVkIHRvIHVuc3RhZ2Ugc2VsZWN0ZWQgaHVuay4iXQorCQlsYXBwZW5kIGFwcGx5X2NtZCAtLXJldmVyc2UKKwkJaWYge1tzdHJpbmcgaW5kZXggJG1pIDBdIG5lIHtNfX0geworCQkJdW5sb2NrX2luZGV4CisJCQlyZXR1cm4KKwkJfQorCX0gZWxzZSB7CisJCXNldCBmYWlsZWRfbXNnIFttYyAiRmFpbGVkIHRvIHN0YWdlIHNlbGVjdGVkIGh1bmsuIl0KKwkJaWYge1tzdHJpbmcgaW5kZXggJG1pIDFdIG5lIHtNfX0geworCQkJdW5sb2NrX2luZGV4CisJCQlyZXR1cm4KKwkJfQorCX0KKworCXNldCBzX2xubyBbbGluZGV4IFtzcGxpdCBbJHVpX2RpZmYgaW5kZXggQCR4LCR5XSAuXSAwXQorCXNldCBzX2xubyBbJHVpX2RpZmYgc2VhcmNoIC1iYWNrd2FyZHMgLXJlZ2V4cCBeQEAgJHNfbG5vLjAgMC4wXQorCWlmIHskc19sbm8gZXEge319IHsKKwkJdW5sb2NrX2luZGV4CisJCXJldHVybgorCX0KKworCXNldCBlX2xubyBbJHVpX2RpZmYgc2VhcmNoIC1mb3J3YXJkcyAtcmVnZXhwIF5AQCAiJHNfbG5vICsgMSBsaW5lcyIgZW5kXQorCWlmIHskZV9sbm8gZXEge319IHsKKwkJc2V0IGVfbG5vIGVuZAorCX0KKworCWlmIHtbY2F0Y2ggeworCQlzZXQgcCBbZXZhbCBnaXRfd3JpdGUgJGFwcGx5X2NtZF0KKwkJZmNvbmZpZ3VyZSAkcCAtdHJhbnNsYXRpb24gYmluYXJ5IC1lbmNvZGluZyBiaW5hcnkKKwkJcHV0cyAtbm9uZXdsaW5lICRwICRjdXJyZW50X2RpZmZfaGVhZGVyCisJCXB1dHMgLW5vbmV3bGluZSAkcCBbJHVpX2RpZmYgZ2V0ICRzX2xubyAkZV9sbm9dCisJCWNsb3NlICRwfSBlcnJdfSB7CisJCWVycm9yX3BvcHVwIFthcHBlbmQgJGZhaWxlZF9tc2cgIlxuXG4kZXJyIl0KKwkJdW5sb2NrX2luZGV4CisJCXJldHVybgorCX0KKworCSR1aV9kaWZmIGNvbmYgLXN0YXRlIG5vcm1hbAorCSR1aV9kaWZmIGRlbGV0ZSAkc19sbm8gJGVfbG5vCisJJHVpX2RpZmYgY29uZiAtc3RhdGUgZGlzYWJsZWQKKworCWlmIHtbJHVpX2RpZmYgZ2V0IDEuMCBlbmRdIGVxICJcbiJ9IHsKKwkJc2V0IG8gXworCX0gZWxzZSB7CisJCXNldCBvID8KKwl9CisKKwlpZiB7JGN1cnJlbnRfZGlmZl9zaWRlIGVxICR1aV9pbmRleH0geworCQlzZXQgbWkgJHtvfU0KKwl9IGVsc2VpZiB7W3N0cmluZyBpbmRleCAkbWkgMF0gZXEge199fSB7CisJCXNldCBtaSBNJG8KKwl9IGVsc2UgeworCQlzZXQgbWkgPyRvCisJfQorCXVubG9ja19pbmRleAorCWRpc3BsYXlfZmlsZSAkY3VycmVudF9kaWZmX3BhdGggJG1pCisJaWYgeyRvIGVxIHtffX0geworCQljbGVhcl9kaWZmCisJfSBlbHNlIHsKKwkJc2V0IGN1cnJlbnRfZGlmZl9wYXRoICRjdXJyZW50X2RpZmZfcGF0aAorCX0KK30KZGlmZiAtLWdpdCBhL2dpdC1ndWkvbGliL2VuY29kaW5nLnRjbCBiL2dpdC1ndWkvbGliL2VuY29kaW5nLnRjbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjA2YjBkCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9saWIvZW5jb2RpbmcudGNsCkBAIC0wLDAgKzEsMjc2IEBACisjIGdpdC1ndWkgZW5jb2Rpbmcgc3VwcG9ydAorIyBDb3B5cmlnaHQgKEMpIDIwMDUgUGF1bCBNYWNrZXJyYXMgPHBhdWx1c0BzYW1iYS5vcmc+CisjIChDb3BpZWQgZnJvbSBnaXRrLCBjb21taXQgZmQ4Y2NiZWM0ZjAxNjEpCisKKyMgVGhpcyBsaXN0IG9mIGVuY29kaW5nIG5hbWVzIGFuZCBhbGlhc2VzIGlzIGRpc3RpbGxlZCBmcm9tCisjIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvY2hhcmFjdGVyLXNldHMuCisjIE5vdCBhbGwgb2YgdGhlbSBhcmUgc3VwcG9ydGVkIGJ5IFRjbC4KK3NldCBlbmNvZGluZ19hbGlhc2VzIHsKKyAgICB7IEFOU0lfWDMuNC0xOTY4IGlzby1pci02IEFOU0lfWDMuNC0xOTg2IElTT182NDYuaXJ2OjE5OTEgQVNDSUkKKyAgICAgIElTTzY0Ni1VUyBVUy1BU0NJSSB1cyBJQk0zNjcgY3AzNjcgY3NBU0NJSSB9CisgICAgeyBJU08tMTA2NDYtVVRGLTEgY3NJU08xMDY0NlVURjEgfQorICAgIHsgSVNPXzY0Ni5iYXNpYzoxOTgzIHJlZiBjc0lTTzY0NmJhc2ljMTk4MyB9CisgICAgeyBJTlZBUklBTlQgY3NJTlZBUklBTlQgfQorICAgIHsgSVNPXzY0Ni5pcnY6MTk4MyBpc28taXItMiBpcnYgY3NJU08ySW50bFJlZlZlcnNpb24gfQorICAgIHsgQlNfNDczMCBpc28taXItNCBJU082NDYtR0IgZ2IgdWsgY3NJU080VW5pdGVkS2luZ2RvbSB9CisgICAgeyBOQVRTLVNFRkkgaXNvLWlyLTgtMSBjc05BVFNTRUZJIH0KKyAgICB7IE5BVFMtU0VGSS1BREQgaXNvLWlyLTgtMiBjc05BVFNTRUZJQUREIH0KKyAgICB7IE5BVFMtREFOTyBpc28taXItOS0xIGNzTkFUU0RBTk8gfQorICAgIHsgTkFUUy1EQU5PLUFERCBpc28taXItOS0yIGNzTkFUU0RBTk9BREQgfQorICAgIHsgU0VOXzg1MDIwMF9CIGlzby1pci0xMCBGSSBJU082NDYtRkkgSVNPNjQ2LVNFIHNlIGNzSVNPMTBTd2VkaXNoIH0KKyAgICB7IFNFTl84NTAyMDBfQyBpc28taXItMTEgSVNPNjQ2LVNFMiBzZTIgY3NJU08xMVN3ZWRpc2hGb3JOYW1lcyB9CisgICAgeyBLU19DXzU2MDEtMTk4NyBpc28taXItMTQ5IEtTX0NfNTYwMS0xOTg5IEtTQ181NjAxIGtvcmVhbiBjc0tTQzU2MDExOTg3IH0KKyAgICB7IElTTy0yMDIyLUtSIGNzSVNPMjAyMktSIH0KKyAgICB7IEVVQy1LUiBjc0VVQ0tSIH0KKyAgICB7IElTTy0yMDIyLUpQIGNzSVNPMjAyMkpQIH0KKyAgICB7IElTTy0yMDIyLUpQLTIgY3NJU08yMDIySlAyIH0KKyAgICB7IEpJU19DNjIyMC0xOTY5LWpwIEpJU19DNjIyMC0xOTY5IGlzby1pci0xMyBrYXRha2FuYSB4MDIwMS03CisgICAgICBjc0lTTzEzSklTQzYyMjBqcCB9CisgICAgeyBKSVNfQzYyMjAtMTk2OS1ybyBpc28taXItMTQganAgSVNPNjQ2LUpQIGNzSVNPMTRKSVNDNjIyMHJvIH0KKyAgICB7IElUIGlzby1pci0xNSBJU082NDYtSVQgY3NJU08xNUl0YWxpYW4gfQorICAgIHsgUFQgaXNvLWlyLTE2IElTTzY0Ni1QVCBjc0lTTzE2UG9ydHVndWVzZSB9CisgICAgeyBFUyBpc28taXItMTcgSVNPNjQ2LUVTIGNzSVNPMTdTcGFuaXNoIH0KKyAgICB7IGdyZWVrNy1vbGQgaXNvLWlyLTE4IGNzSVNPMThHcmVlazdPbGQgfQorICAgIHsgbGF0aW4tZ3JlZWsgaXNvLWlyLTE5IGNzSVNPMTlMYXRpbkdyZWVrIH0KKyAgICB7IERJTl82NjAwMyBpc28taXItMjEgZGUgSVNPNjQ2LURFIGNzSVNPMjFHZXJtYW4gfQorICAgIHsgTkZfWl82Mi0wMTBfKDE5NzMpIGlzby1pci0yNSBJU082NDYtRlIxIGNzSVNPMjVGcmVuY2ggfQorICAgIHsgTGF0aW4tZ3JlZWstMSBpc28taXItMjcgY3NJU08yN0xhdGluR3JlZWsxIH0KKyAgICB7IElTT181NDI3IGlzby1pci0zNyBjc0lTTzU0MjdDeXJpbGxpYyB9CisgICAgeyBKSVNfQzYyMjYtMTk3OCBpc28taXItNDIgY3NJU080MkpJU0M2MjI2MTk3OCB9CisgICAgeyBCU192aWV3ZGF0YSBpc28taXItNDcgY3NJU080N0JTVmlld2RhdGEgfQorICAgIHsgSU5JUyBpc28taXItNDkgY3NJU080OUlOSVMgfQorICAgIHsgSU5JUy04IGlzby1pci01MCBjc0lTTzUwSU5JUzggfQorICAgIHsgSU5JUy1jeXJpbGxpYyBpc28taXItNTEgY3NJU081MUlOSVNDeXJpbGxpYyB9CisgICAgeyBJU09fNTQyNzoxOTgxIGlzby1pci01NCBJU081NDI3Q3lyaWxsaWMxOTgxIH0KKyAgICB7IElTT181NDI4OjE5ODAgaXNvLWlyLTU1IGNzSVNPNTQyOEdyZWVrIH0KKyAgICB7IEdCXzE5ODgtODAgaXNvLWlyLTU3IGNuIElTTzY0Ni1DTiBjc0lTTzU3R0IxOTg4IH0KKyAgICB7IEdCXzIzMTItODAgaXNvLWlyLTU4IGNoaW5lc2UgY3NJU081OEdCMjMxMjgwIH0KKyAgICB7IE5TXzQ1NTEtMSBpc28taXItNjAgSVNPNjQ2LU5PIG5vIGNzSVNPNjBEYW5pc2hOb3J3ZWdpYW4KKyAgICAgIGNzSVNPNjBOb3J3ZWdpYW4xIH0KKyAgICB7IE5TXzQ1NTEtMiBJU082NDYtTk8yIGlzby1pci02MSBubzIgY3NJU082MU5vcndlZ2lhbjIgfQorICAgIHsgTkZfWl82Mi0wMTAgaXNvLWlyLTY5IElTTzY0Ni1GUiBmciBjc0lTTzY5RnJlbmNoIH0KKyAgICB7IHZpZGVvdGV4LXN1cHBsIGlzby1pci03MCBjc0lTTzcwVmlkZW90ZXhTdXBwMSB9CisgICAgeyBQVDIgaXNvLWlyLTg0IElTTzY0Ni1QVDIgY3NJU084NFBvcnR1Z3Vlc2UyIH0KKyAgICB7IEVTMiBpc28taXItODUgSVNPNjQ2LUVTMiBjc0lTTzg1U3BhbmlzaDIgfQorICAgIHsgTVNaXzc3OTUuMyBpc28taXItODYgSVNPNjQ2LUhVIGh1IGNzSVNPODZIdW5nYXJpYW4gfQorICAgIHsgSklTX0M2MjI2LTE5ODMgaXNvLWlyLTg3IHgwMjA4IEpJU19YMDIwOC0xOTgzIGNzSVNPODdKSVNYMDIwOCB9CisgICAgeyBncmVlazcgaXNvLWlyLTg4IGNzSVNPODhHcmVlazcgfQorICAgIHsgQVNNT180NDkgSVNPXzkwMzYgYXJhYmljNyBpc28taXItODkgY3NJU084OUFTTU80NDkgfQorICAgIHsgaXNvLWlyLTkwIGNzSVNPOTAgfQorICAgIHsgSklTX0M2MjI5LTE5ODQtYSBpc28taXItOTEganAtb2NyLWEgY3NJU085MUpJU0M2MjI5MTk4NGEgfQorICAgIHsgSklTX0M2MjI5LTE5ODQtYiBpc28taXItOTIgSVNPNjQ2LUpQLU9DUi1CIGpwLW9jci1iCisgICAgICBjc0lTTzkySklTQzYyOTkxOTg0YiB9CisgICAgeyBKSVNfQzYyMjktMTk4NC1iLWFkZCBpc28taXItOTMganAtb2NyLWItYWRkIGNzSVNPOTNKSVM2MjI5MTk4NGJhZGQgfQorICAgIHsgSklTX0M2MjI5LTE5ODQtaGFuZCBpc28taXItOTQganAtb2NyLWhhbmQgY3NJU085NEpJUzYyMjkxOTg0aGFuZCB9CisgICAgeyBKSVNfQzYyMjktMTk4NC1oYW5kLWFkZCBpc28taXItOTUganAtb2NyLWhhbmQtYWRkCisgICAgICBjc0lTTzk1SklTNjIyOTE5ODRoYW5kYWRkIH0KKyAgICB7IEpJU19DNjIyOS0xOTg0LWthbmEgaXNvLWlyLTk2IGNzSVNPOTZKSVNDNjIyOTE5ODRrYW5hIH0KKyAgICB7IElTT18yMDMzLTE5ODMgaXNvLWlyLTk4IGUxM2IgY3NJU08yMDMzIH0KKyAgICB7IEFOU0lfWDMuMTEwLTE5ODMgaXNvLWlyLTk5IENTQV9UNTAwLTE5ODMgTkFQTFBTIGNzSVNPOTlOQVBMUFMgfQorICAgIHsgSVNPXzg4NTktMToxOTg3IGlzby1pci0xMDAgSVNPXzg4NTktMSBJU08tODg1OS0xIGxhdGluMSBsMSBJQk04MTkKKyAgICAgIENQODE5IGNzSVNPTGF0aW4xIH0KKyAgICB7IElTT184ODU5LTI6MTk4NyBpc28taXItMTAxIElTT184ODU5LTIgSVNPLTg4NTktMiBsYXRpbjIgbDIgY3NJU09MYXRpbjIgfQorICAgIHsgVC42MS03Yml0IGlzby1pci0xMDIgY3NJU08xMDJUNjE3Yml0IH0KKyAgICB7IFQuNjEtOGJpdCBULjYxIGlzby1pci0xMDMgY3NJU08xMDNUNjE4Yml0IH0KKyAgICB7IElTT184ODU5LTM6MTk4OCBpc28taXItMTA5IElTT184ODU5LTMgSVNPLTg4NTktMyBsYXRpbjMgbDMgY3NJU09MYXRpbjMgfQorICAgIHsgSVNPXzg4NTktNDoxOTg4IGlzby1pci0xMTAgSVNPXzg4NTktNCBJU08tODg1OS00IGxhdGluNCBsNCBjc0lTT0xhdGluNCB9CisgICAgeyBFQ01BLWN5cmlsbGljIGlzby1pci0xMTEgS09JOC1FIGNzSVNPMTExRUNNQUN5cmlsbGljIH0KKyAgICB7IENTQV9aMjQzLjQtMTk4NS0xIGlzby1pci0xMjEgSVNPNjQ2LUNBIGNzYTctMSBjYSBjc0lTTzEyMUNhbmFkaWFuMSB9CisgICAgeyBDU0FfWjI0My40LTE5ODUtMiBpc28taXItMTIyIElTTzY0Ni1DQTIgY3NhNy0yIGNzSVNPMTIyQ2FuYWRpYW4yIH0KKyAgICB7IENTQV9aMjQzLjQtMTk4NS1nciBpc28taXItMTIzIGNzSVNPMTIzQ1NBWjI0MzQxOTg1Z3IgfQorICAgIHsgSVNPXzg4NTktNjoxOTg3IGlzby1pci0xMjcgSVNPXzg4NTktNiBJU08tODg1OS02IEVDTUEtMTE0IEFTTU8tNzA4CisgICAgICBhcmFiaWMgY3NJU09MYXRpbkFyYWJpYyB9CisgICAgeyBJU09fODg1OS02LUUgY3NJU084ODU5NkUgSVNPLTg4NTktNi1FIH0KKyAgICB7IElTT184ODU5LTYtSSBjc0lTTzg4NTk2SSBJU08tODg1OS02LUkgfQorICAgIHsgSVNPXzg4NTktNzoxOTg3IGlzby1pci0xMjYgSVNPXzg4NTktNyBJU08tODg1OS03IEVMT1RfOTI4IEVDTUEtMTE4CisgICAgICBncmVlayBncmVlazggY3NJU09MYXRpbkdyZWVrIH0KKyAgICB7IFQuMTAxLUcyIGlzby1pci0xMjggY3NJU08xMjhUMTAxRzIgfQorICAgIHsgSVNPXzg4NTktODoxOTg4IGlzby1pci0xMzggSVNPXzg4NTktOCBJU08tODg1OS04IGhlYnJldworICAgICAgY3NJU09MYXRpbkhlYnJldyB9CisgICAgeyBJU09fODg1OS04LUUgY3NJU084ODU5OEUgSVNPLTg4NTktOC1FIH0KKyAgICB7IElTT184ODU5LTgtSSBjc0lTTzg4NTk4SSBJU08tODg1OS04LUkgfQorICAgIHsgQ1NOXzM2OTEwMyBpc28taXItMTM5IGNzSVNPMTM5Q1NOMzY5MTAzIH0KKyAgICB7IEpVU19JLkIxLjAwMiBpc28taXItMTQxIElTTzY0Ni1ZVSBqcyB5dSBjc0lTTzE0MUpVU0lCMTAwMiB9CisgICAgeyBJU09fNjkzNy0yLWFkZCBpc28taXItMTQyIGNzSVNPVGV4dENvbW0gfQorICAgIHsgSUVDX1AyNy0xIGlzby1pci0xNDMgY3NJU08xNDNJRUNQMjcxIH0KKyAgICB7IElTT184ODU5LTU6MTk4OCBpc28taXItMTQ0IElTT184ODU5LTUgSVNPLTg4NTktNSBjeXJpbGxpYworICAgICAgY3NJU09MYXRpbkN5cmlsbGljIH0KKyAgICB7IEpVU19JLkIxLjAwMy1zZXJiIGlzby1pci0xNDYgc2VyYmlhbiBjc0lTTzE0NlNlcmJpYW4gfQorICAgIHsgSlVTX0kuQjEuMDAzLW1hYyBtYWNlZG9uaWFuIGlzby1pci0xNDcgY3NJU08xNDdNYWNlZG9uaWFuIH0KKyAgICB7IElTT184ODU5LTk6MTk4OSBpc28taXItMTQ4IElTT184ODU5LTkgSVNPLTg4NTktOSBsYXRpbjUgbDUgY3NJU09MYXRpbjUgfQorICAgIHsgZ3JlZWstY2NpdHQgaXNvLWlyLTE1MCBjc0lTTzE1MCBjc0lTTzE1MEdyZWVrQ0NJVFQgfQorICAgIHsgTkNfTkMwMC0xMDo4MSBjdWJhIGlzby1pci0xNTEgSVNPNjQ2LUNVIGNzSVNPMTUxQ3ViYSB9CisgICAgeyBJU09fNjkzNy0yLTI1IGlzby1pci0xNTIgY3NJU082OTM3QWRkIH0KKyAgICB7IEdPU1RfMTk3NjgtNzQgU1RfU0VWXzM1OC04OCBpc28taXItMTUzIGNzSVNPMTUzR09TVDE5NzY4NzQgfQorICAgIHsgSVNPXzg4NTktc3VwcCBpc28taXItMTU0IGxhdGluMS0yLTUgY3NJU084ODU5U3VwcCB9CisgICAgeyBJU09fMTAzNjctYm94IGlzby1pci0xNTUgY3NJU08xMDM2N0JveCB9CisgICAgeyBJU08tODg1OS0xMCBpc28taXItMTU3IGw2IElTT184ODU5LTEwOjE5OTIgY3NJU09MYXRpbjYgbGF0aW42IH0KKyAgICB7IGxhdGluLWxhcCBsYXAgaXNvLWlyLTE1OCBjc0lTTzE1OExhcCB9CisgICAgeyBKSVNfWDAyMTItMTk5MCB4MDIxMiBpc28taXItMTU5IGNzSVNPMTU5SklTWDAyMTIxOTkwIH0KKyAgICB7IERTXzIwODkgRFMyMDg5IElTTzY0Ni1ESyBkayBjc0lTTzY0NkRhbmlzaCB9CisgICAgeyB1cy1kayBjc1VTREsgfQorICAgIHsgZGstdXMgY3NES1VTIH0KKyAgICB7IEpJU19YMDIwMSBYMDIwMSBjc0hhbGZXaWR0aEthdGFrYW5hIH0KKyAgICB7IEtTQzU2MzYgSVNPNjQ2LUtSIGNzS1NDNTYzNiB9CisgICAgeyBJU08tMTA2NDYtVUNTLTIgY3NVbmljb2RlIH0KKyAgICB7IElTTy0xMDY0Ni1VQ1MtNCBjc1VDUzQgfQorICAgIHsgREVDLU1DUyBkZWMgY3NERUNNQ1MgfQorICAgIHsgaHAtcm9tYW44IHJvbWFuOCByOCBjc0hQUm9tYW44IH0KKyAgICB7IG1hY2ludG9zaCBtYWMgY3NNYWNpbnRvc2ggfQorICAgIHsgSUJNMDM3IGNwMDM3IGViY2RpYy1jcC11cyBlYmNkaWMtY3AtY2EgZWJjZGljLWNwLXd0IGViY2RpYy1jcC1ubAorICAgICAgY3NJQk0wMzcgfQorICAgIHsgSUJNMDM4IEVCQ0RJQy1JTlQgY3AwMzggY3NJQk0wMzggfQorICAgIHsgSUJNMjczIENQMjczIGNzSUJNMjczIH0KKyAgICB7IElCTTI3NCBFQkNESUMtQkUgQ1AyNzQgY3NJQk0yNzQgfQorICAgIHsgSUJNMjc1IEVCQ0RJQy1CUiBjcDI3NSBjc0lCTTI3NSB9CisgICAgeyBJQk0yNzcgRUJDRElDLUNQLURLIEVCQ0RJQy1DUC1OTyBjc0lCTTI3NyB9CisgICAgeyBJQk0yNzggQ1AyNzggZWJjZGljLWNwLWZpIGViY2RpYy1jcC1zZSBjc0lCTTI3OCB9CisgICAgeyBJQk0yODAgQ1AyODAgZWJjZGljLWNwLWl0IGNzSUJNMjgwIH0KKyAgICB7IElCTTI4MSBFQkNESUMtSlAtRSBjcDI4MSBjc0lCTTI4MSB9CisgICAgeyBJQk0yODQgQ1AyODQgZWJjZGljLWNwLWVzIGNzSUJNMjg0IH0KKyAgICB7IElCTTI4NSBDUDI4NSBlYmNkaWMtY3AtZ2IgY3NJQk0yODUgfQorICAgIHsgSUJNMjkwIGNwMjkwIEVCQ0RJQy1KUC1rYW5hIGNzSUJNMjkwIH0KKyAgICB7IElCTTI5NyBjcDI5NyBlYmNkaWMtY3AtZnIgY3NJQk0yOTcgfQorICAgIHsgSUJNNDIwIGNwNDIwIGViY2RpYy1jcC1hcjEgY3NJQk00MjAgfQorICAgIHsgSUJNNDIzIGNwNDIzIGViY2RpYy1jcC1nciBjc0lCTTQyMyB9CisgICAgeyBJQk00MjQgY3A0MjQgZWJjZGljLWNwLWhlIGNzSUJNNDI0IH0KKyAgICB7IElCTTQzNyBjcDQzNyA0MzcgY3NQQzhDb2RlUGFnZTQzNyB9CisgICAgeyBJQk01MDAgQ1A1MDAgZWJjZGljLWNwLWJlIGViY2RpYy1jcC1jaCBjc0lCTTUwMCB9CisgICAgeyBJQk03NzUgY3A3NzUgY3NQQzc3NUJhbHRpYyB9CisgICAgeyBJQk04NTAgY3A4NTAgODUwIGNzUEM4NTBNdWx0aWxpbmd1YWwgfQorICAgIHsgSUJNODUxIGNwODUxIDg1MSBjc0lCTTg1MSB9CisgICAgeyBJQk04NTIgY3A4NTIgODUyIGNzUENwODUyIH0KKyAgICB7IElCTTg1NSBjcDg1NSA4NTUgY3NJQk04NTUgfQorICAgIHsgSUJNODU3IGNwODU3IDg1NyBjc0lCTTg1NyB9CisgICAgeyBJQk04NjAgY3A4NjAgODYwIGNzSUJNODYwIH0KKyAgICB7IElCTTg2MSBjcDg2MSA4NjEgY3AtaXMgY3NJQk04NjEgfQorICAgIHsgSUJNODYyIGNwODYyIDg2MiBjc1BDODYyTGF0aW5IZWJyZXcgfQorICAgIHsgSUJNODYzIGNwODYzIDg2MyBjc0lCTTg2MyB9CisgICAgeyBJQk04NjQgY3A4NjQgY3NJQk04NjQgfQorICAgIHsgSUJNODY1IGNwODY1IDg2NSBjc0lCTTg2NSB9CisgICAgeyBJQk04NjYgY3A4NjYgODY2IGNzSUJNODY2IH0KKyAgICB7IElCTTg2OCBDUDg2OCBjcC1hciBjc0lCTTg2OCB9CisgICAgeyBJQk04NjkgY3A4NjkgODY5IGNwLWdyIGNzSUJNODY5IH0KKyAgICB7IElCTTg3MCBDUDg3MCBlYmNkaWMtY3Atcm9lY2UgZWJjZGljLWNwLXl1IGNzSUJNODcwIH0KKyAgICB7IElCTTg3MSBDUDg3MSBlYmNkaWMtY3AtaXMgY3NJQk04NzEgfQorICAgIHsgSUJNODgwIGNwODgwIEVCQ0RJQy1DeXJpbGxpYyBjc0lCTTg4MCB9CisgICAgeyBJQk04OTEgY3A4OTEgY3NJQk04OTEgfQorICAgIHsgSUJNOTAzIGNwOTAzIGNzSUJNOTAzIH0KKyAgICB7IElCTTkwNCBjcDkwNCA5MDQgY3NJQkJNOTA0IH0KKyAgICB7IElCTTkwNSBDUDkwNSBlYmNkaWMtY3AtdHIgY3NJQk05MDUgfQorICAgIHsgSUJNOTE4IENQOTE4IGViY2RpYy1jcC1hcjIgY3NJQk05MTggfQorICAgIHsgSUJNMTAyNiBDUDEwMjYgY3NJQk0xMDI2IH0KKyAgICB7IEVCQ0RJQy1BVC1ERSBjc0lCTUVCQ0RJQ0FUREUgfQorICAgIHsgRUJDRElDLUFULURFLUEgY3NFQkNESUNBVERFQSB9CisgICAgeyBFQkNESUMtQ0EtRlIgY3NFQkNESUNDQUZSIH0KKyAgICB7IEVCQ0RJQy1ESy1OTyBjc0VCQ0RJQ0RLTk8gfQorICAgIHsgRUJDRElDLURLLU5PLUEgY3NFQkNESUNES05PQSB9CisgICAgeyBFQkNESUMtRkktU0UgY3NFQkNESUNGSVNFIH0KKyAgICB7IEVCQ0RJQy1GSS1TRS1BIGNzRUJDRElDRklTRUEgfQorICAgIHsgRUJDRElDLUZSIGNzRUJDRElDRlIgfQorICAgIHsgRUJDRElDLUlUIGNzRUJDRElDSVQgfQorICAgIHsgRUJDRElDLVBUIGNzRUJDRElDUFQgfQorICAgIHsgRUJDRElDLUVTIGNzRUJDRElDRVMgfQorICAgIHsgRUJDRElDLUVTLUEgY3NFQkNESUNFU0EgfQorICAgIHsgRUJDRElDLUVTLVMgY3NFQkNESUNFU1MgfQorICAgIHsgRUJDRElDLVVLIGNzRUJDRElDVUsgfQorICAgIHsgRUJDRElDLVVTIGNzRUJDRElDVVMgfQorICAgIHsgVU5LTk9XTi04QklUIGNzVW5rbm93bjhCaVQgfQorICAgIHsgTU5FTU9OSUMgY3NNbmVtb25pYyB9CisgICAgeyBNTkVNIGNzTW5lbSB9CisgICAgeyBWSVNDSUkgY3NWSVNDSUkgfQorICAgIHsgVklRUiBjc1ZJUVIgfQorICAgIHsgS09JOC1SIGNzS09JOFIgfQorICAgIHsgSUJNMDA4NTggQ0NTSUQwMDg1OCBDUDAwODU4IFBDLU11bHRpbGluZ3VhbC04NTArZXVybyB9CisgICAgeyBJQk0wMDkyNCBDQ1NJRDAwOTI0IENQMDA5MjQgZWJjZGljLUxhdGluOS0tZXVybyB9CisgICAgeyBJQk0wMTE0MCBDQ1NJRDAxMTQwIENQMDExNDAgZWJjZGljLXVzLTM3K2V1cm8gfQorICAgIHsgSUJNMDExNDEgQ0NTSUQwMTE0MSBDUDAxMTQxIGViY2RpYy1kZS0yNzMrZXVybyB9CisgICAgeyBJQk0wMTE0MiBDQ1NJRDAxMTQyIENQMDExNDIgZWJjZGljLWRrLTI3NytldXJvIGViY2RpYy1uby0yNzcrZXVybyB9CisgICAgeyBJQk0wMTE0MyBDQ1NJRDAxMTQzIENQMDExNDMgZWJjZGljLWZpLTI3OCtldXJvIGViY2RpYy1zZS0yNzgrZXVybyB9CisgICAgeyBJQk0wMTE0NCBDQ1NJRDAxMTQ0IENQMDExNDQgZWJjZGljLWl0LTI4MCtldXJvIH0KKyAgICB7IElCTTAxMTQ1IENDU0lEMDExNDUgQ1AwMTE0NSBlYmNkaWMtZXMtMjg0K2V1cm8gfQorICAgIHsgSUJNMDExNDYgQ0NTSUQwMTE0NiBDUDAxMTQ2IGViY2RpYy1nYi0yODUrZXVybyB9CisgICAgeyBJQk0wMTE0NyBDQ1NJRDAxMTQ3IENQMDExNDcgZWJjZGljLWZyLTI5NytldXJvIH0KKyAgICB7IElCTTAxMTQ4IENDU0lEMDExNDggQ1AwMTE0OCBlYmNkaWMtaW50ZXJuYXRpb25hbC01MDArZXVybyB9CisgICAgeyBJQk0wMTE0OSBDQ1NJRDAxMTQ5IENQMDExNDkgZWJjZGljLWlzLTg3MStldXJvIH0KKyAgICB7IElCTTEwNDcgSUJNLTEwNDcgfQorICAgIHsgUFRDUDE1NCBjc1BUQ1AxNTQgUFQxNTQgQ1AxNTQgQ3lyaWxsaWMtQXNpYW4gfQorICAgIHsgQW1pZ2EtMTI1MSBBbWkxMjUxIEFtaWdhMTI1MSBBbWktMTI1MSB9CisgICAgeyBVTklDT0RFLTEtMSBjc1VuaWNvZGUxMSB9CisgICAgeyBDRVNVLTggY3NDRVNVLTggfQorICAgIHsgQk9DVS0xIGNzQk9DVS0xIH0KKyAgICB7IFVOSUNPREUtMS0xLVVURi03IGNzVW5pY29kZTExVVRGNyB9CisgICAgeyBJU08tODg1OS0xNCBpc28taXItMTk5IElTT184ODU5LTE0OjE5OTggSVNPXzg4NTktMTQgbGF0aW44IGlzby1jZWx0aWMKKyAgICAgIGw4IH0KKyAgICB7IElTTy04ODU5LTE1IElTT184ODU5LTE1IExhdGluLTkgfQorICAgIHsgSVNPLTg4NTktMTYgaXNvLWlyLTIyNiBJU09fODg1OS0xNjoyMDAxIElTT184ODU5LTE2IGxhdGluMTAgbDEwIH0KKyAgICB7IEdCSyBDUDkzNiBNUzkzNiB3aW5kb3dzLTkzNiB9CisgICAgeyBKSVNfRW5jb2RpbmcgY3NKSVNFbmNvZGluZyB9CisgICAgeyBTaGlmdF9KSVMgTVNfS2FuamkgY3NTaGlmdEpJUyB9CisgICAgeyBFeHRlbmRlZF9VTklYX0NvZGVfUGFja2VkX0Zvcm1hdF9mb3JfSmFwYW5lc2UgY3NFVUNQa2RGbXRKYXBhbmVzZQorICAgICAgRVVDLUpQIH0KKyAgICB7IEV4dGVuZGVkX1VOSVhfQ29kZV9GaXhlZF9XaWR0aF9mb3JfSmFwYW5lc2UgY3NFVUNGaXhXaWRKYXBhbmVzZSB9CisgICAgeyBJU08tMTA2NDYtVUNTLUJhc2ljIGNzVW5pY29kZUFTQ0lJIH0KKyAgICB7IElTTy0xMDY0Ni1Vbmljb2RlLUxhdGluMSBjc1VuaWNvZGVMYXRpbjEgSVNPLTEwNjQ2IH0KKyAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjYxIGNzVW5pY29kZUlCTTEyNjEgfQorICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNjggY3NVbmljb2RlSUJNMTI2OCB9CisgICAgeyBJU08tVW5pY29kZS1JQk0tMTI3NiBjc1VuaWNvZGVJQk0xMjc2IH0KKyAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjY0IGNzVW5pY29kZUlCTTEyNjQgfQorICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNjUgY3NVbmljb2RlSUJNMTI2NSB9CisgICAgeyBJU08tODg1OS0xLVdpbmRvd3MtMy4wLUxhdGluLTEgY3NXaW5kb3dzMzBMYXRpbjEgfQorICAgIHsgSVNPLTg4NTktMS1XaW5kb3dzLTMuMS1MYXRpbi0xIGNzV2luZG93czMxTGF0aW4xIH0KKyAgICB7IElTTy04ODU5LTItV2luZG93cy1MYXRpbi0yIGNzV2luZG93czMxTGF0aW4yIH0KKyAgICB7IElTTy04ODU5LTktV2luZG93cy1MYXRpbi01IGNzV2luZG93czMxTGF0aW41IH0KKyAgICB7IEFkb2JlLVN0YW5kYXJkLUVuY29kaW5nIGNzQWRvYmVTdGFuZGFyZEVuY29kaW5nIH0KKyAgICB7IFZlbnR1cmEtVVMgY3NWZW50dXJhVVMgfQorICAgIHsgVmVudHVyYS1JbnRlcm5hdGlvbmFsIGNzVmVudHVyYUludGVybmF0aW9uYWwgfQorICAgIHsgUEM4LURhbmlzaC1Ob3J3ZWdpYW4gY3NQQzhEYW5pc2hOb3J3ZWdpYW4gfQorICAgIHsgUEM4LVR1cmtpc2ggY3NQQzhUdXJraXNoIH0KKyAgICB7IElCTS1TeW1ib2xzIGNzSUJNU3ltYm9scyB9CisgICAgeyBJQk0tVGhhaSBjc0lCTVRoYWkgfQorICAgIHsgSFAtTGVnYWwgY3NIUExlZ2FsIH0KKyAgICB7IEhQLVBpLWZvbnQgY3NIUFBpRm9udCB9CisgICAgeyBIUC1NYXRoOCBjc0hQTWF0aDggfQorICAgIHsgQWRvYmUtU3ltYm9sLUVuY29kaW5nIGNzSFBQU01hdGggfQorICAgIHsgSFAtRGVza1RvcCBjc0hQRGVza3RvcCB9CisgICAgeyBWZW50dXJhLU1hdGggY3NWZW50dXJhTWF0aCB9CisgICAgeyBNaWNyb3NvZnQtUHVibGlzaGluZyBjc01pY3Jvc29mdFB1Ymxpc2hpbmcgfQorICAgIHsgV2luZG93cy0zMUogY3NXaW5kb3dzMzFKIH0KKyAgICB7IEdCMjMxMiBjc0dCMjMxMiB9CisgICAgeyBCaWc1IGNzQmlnNSB9Cit9CisKK3Byb2MgdGNsX2VuY29kaW5nIHtlbmN9IHsKKyAgICBnbG9iYWwgZW5jb2RpbmdfYWxpYXNlcworICAgIHNldCBuYW1lcyBbZW5jb2RpbmcgbmFtZXNdCisgICAgc2V0IGxjbmFtZXMgW3N0cmluZyB0b2xvd2VyICRuYW1lc10KKyAgICBzZXQgZW5jIFtzdHJpbmcgdG9sb3dlciAkZW5jXQorICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkbGNuYW1lcyAkZW5jXQorICAgIGlmIHskaSA8IDB9IHsKKwkjIGxvb2sgZm9yICJpc29ubm4iIGluc3RlYWQgb2YgImlzby1ubm4iIG9yICJpc29fbm5uIgorCWlmIHtbcmVnc3ViIHteaXNvWy1fXX0gJGVuYyBpc28gZW5jeF19IHsKKwkgICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRsY25hbWVzICRlbmN4XQorCX0KKyAgICB9CisgICAgaWYgeyRpIDwgMH0geworCWZvcmVhY2ggbCAkZW5jb2RpbmdfYWxpYXNlcyB7CisJICAgIHNldCBsbCBbc3RyaW5nIHRvbG93ZXIgJGxdCisJICAgIGlmIHtbbHNlYXJjaCAtZXhhY3QgJGxsICRlbmNdIDwgMH0gY29udGludWUKKwkgICAgIyBsb29rIHRocm91Z2ggdGhlIGFsaWFzZXMgZm9yIG9uZSB0aGF0IHRjbCBrbm93cyBhYm91dAorCSAgICBmb3JlYWNoIGUgJGxsIHsKKwkJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRsY25hbWVzICRlXQorCQlpZiB7JGkgPCAwfSB7CisJCSAgICBpZiB7W3JlZ3N1YiB7Xmlzb1stX119ICRlIGlzbyBleF19IHsKKwkJCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkbGNuYW1lcyAkZXhdCisJCSAgICB9CisJCX0KKwkJaWYgeyRpID49IDB9IGJyZWFrCisJICAgIH0KKwkgICAgYnJlYWsKKwl9CisgICAgfQorICAgIGlmIHskaSA+PSAwfSB7CisJcmV0dXJuIFtsaW5kZXggJG5hbWVzICRpXQorICAgIH0KKyAgICByZXR1cm4ge30KK30KZGlmZiAtLWdpdCBhL2dpdC1ndWkvbGliL2Vycm9yLnRjbCBiL2dpdC1ndWkvbGliL2Vycm9yLnRjbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTY1MDE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9saWIvZXJyb3IudGNsCkBAIC0wLDAgKzEsMTE2IEBACisjIGdpdC1ndWkgYnJhbmNoIChjcmVhdGUvZGVsZXRlKSBzdXBwb3J0CisjIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBTaGF3biBQZWFyY2UKKworcHJvYyBfZXJyb3JfcGFyZW50IHt9IHsKKwlzZXQgcCBbZ3JhYiBjdXJyZW50IC5dCisJaWYgeyRwIGVxIHt9fSB7CisJCXJldHVybiAuCisJfQorCXJldHVybiAkcAorfQorCitwcm9jIGVycm9yX3BvcHVwIHttc2d9IHsKKwlzZXQgdGl0bGUgW2FwcG5hbWVdCisJaWYge1tyZXBvbmFtZV0gbmUge319IHsKKwkJYXBwZW5kIHRpdGxlICIgKFtyZXBvbmFtZV0pIgorCX0KKwlzZXQgY21kIFtsaXN0IHRrX21lc3NhZ2VCb3ggXAorCQktaWNvbiBlcnJvciBcCisJCS10eXBlIG9rIFwKKwkJLXRpdGxlIFthcHBlbmQgIiR0aXRsZTogIiBbbWMgImVycm9yIl1dIFwKKwkJLW1lc3NhZ2UgJG1zZ10KKwlpZiB7W3dpbmZvIGlzbWFwcGVkIFtfZXJyb3JfcGFyZW50XV19IHsKKwkJbGFwcGVuZCBjbWQgLXBhcmVudCBbX2Vycm9yX3BhcmVudF0KKwl9CisJZXZhbCAkY21kCit9CisKK3Byb2Mgd2Fybl9wb3B1cCB7bXNnfSB7CisJc2V0IHRpdGxlIFthcHBuYW1lXQorCWlmIHtbcmVwb25hbWVdIG5lIHt9fSB7CisJCWFwcGVuZCB0aXRsZSAiIChbcmVwb25hbWVdKSIKKwl9CisJc2V0IGNtZCBbbGlzdCB0a19tZXNzYWdlQm94IFwKKwkJLWljb24gd2FybmluZyBcCisJCS10eXBlIG9rIFwKKwkJLXRpdGxlIFthcHBlbmQgIiR0aXRsZTogIiBbbWMgIndhcm5pbmciXV0gXAorCQktbWVzc2FnZSAkbXNnXQorCWlmIHtbd2luZm8gaXNtYXBwZWQgW19lcnJvcl9wYXJlbnRdXX0geworCQlsYXBwZW5kIGNtZCAtcGFyZW50IFtfZXJyb3JfcGFyZW50XQorCX0KKwlldmFsICRjbWQKK30KKworcHJvYyBpbmZvX3BvcHVwIHttc2d9IHsKKwlzZXQgdGl0bGUgW2FwcG5hbWVdCisJaWYge1tyZXBvbmFtZV0gbmUge319IHsKKwkJYXBwZW5kIHRpdGxlICIgKFtyZXBvbmFtZV0pIgorCX0KKwl0a19tZXNzYWdlQm94IFwKKwkJLXBhcmVudCBbX2Vycm9yX3BhcmVudF0gXAorCQktaWNvbiBpbmZvIFwKKwkJLXR5cGUgb2sgXAorCQktdGl0bGUgJHRpdGxlIFwKKwkJLW1lc3NhZ2UgJG1zZworfQorCitwcm9jIGFza19wb3B1cCB7bXNnfSB7CisJc2V0IHRpdGxlIFthcHBuYW1lXQorCWlmIHtbcmVwb25hbWVdIG5lIHt9fSB7CisJCWFwcGVuZCB0aXRsZSAiIChbcmVwb25hbWVdKSIKKwl9CisJc2V0IGNtZCBbbGlzdCB0a19tZXNzYWdlQm94IFwKKwkJLWljb24gcXVlc3Rpb24gXAorCQktdHlwZSB5ZXNubyBcCisJCS10aXRsZSAkdGl0bGUgXAorCQktbWVzc2FnZSAkbXNnXQorCWlmIHtbd2luZm8gaXNtYXBwZWQgW19lcnJvcl9wYXJlbnRdXX0geworCQlsYXBwZW5kIGNtZCAtcGFyZW50IFtfZXJyb3JfcGFyZW50XQorCX0KKwlldmFsICRjbWQKK30KKworcHJvYyBob29rX2ZhaWxlZF9wb3B1cCB7aG9vayBtc2cge2lzX2ZhdGFsIDF9fSB7CisJc2V0IHcgLmhvb2tmYWlsCisJdG9wbGV2ZWwgJHcKKworCWZyYW1lICR3Lm0KKwlsYWJlbCAkdy5tLmwxIC10ZXh0ICIkaG9vayBob29rIGZhaWxlZDoiIFwKKwkJLWFuY2hvciB3IFwKKwkJLWp1c3RpZnkgbGVmdCBcCisJCS1mb250IGZvbnRfdWlib2xkCisJdGV4dCAkdy5tLnQgXAorCQktYmFja2dyb3VuZCB3aGl0ZSBcCisJCS1mb3JlZ3JvdW5kIGJsYWNrIFwKKwkJLWJvcmRlcndpZHRoIDEgXAorCQktcmVsaWVmIHN1bmtlbiBcCisJCS13aWR0aCA4MCAtaGVpZ2h0IDEwIFwKKwkJLWZvbnQgZm9udF9kaWZmIFwKKwkJLXlzY3JvbGxjb21tYW5kIFtsaXN0ICR3Lm0uc2J5IHNldF0KKwlzY3JvbGxiYXIgJHcubS5zYnkgLWNvbW1hbmQgW2xpc3QgJHcubS50IHl2aWV3XQorCXBhY2sgJHcubS5sMSAtc2lkZSB0b3AgLWZpbGwgeAorCWlmIHskaXNfZmF0YWx9IHsKKwkJbGFiZWwgJHcubS5sMiBcCisJCQktdGV4dCBbbWMgIllvdSBtdXN0IGNvcnJlY3QgdGhlIGFib3ZlIGVycm9ycyBiZWZvcmUgY29tbWl0dGluZy4iXSBcCisJCQktYW5jaG9yIHcgXAorCQkJLWp1c3RpZnkgbGVmdCBcCisJCQktZm9udCBmb250X3VpYm9sZAorCQlwYWNrICR3Lm0ubDIgLXNpZGUgYm90dG9tIC1maWxsIHgKKwl9CisJcGFjayAkdy5tLnNieSAtc2lkZSByaWdodCAtZmlsbCB5CisJcGFjayAkdy5tLnQgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQorCXBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEgLXBhZHggNSAtcGFkeSAxMAorCisJJHcubS50IGluc2VydCAxLjAgJG1zZworCSR3Lm0udCBjb25mIC1zdGF0ZSBkaXNhYmxlZAorCisJYnV0dG9uICR3Lm9rIC10ZXh0IE9LIFwKKwkJLXdpZHRoIDE1IFwKKwkJLWNvbW1hbmQgImRlc3Ryb3kgJHciCisJcGFjayAkdy5vayAtc2lkZSBib3R0b20gLWFuY2hvciBlIC1wYWR5IDEwIC1wYWR4IDEwCisKKwliaW5kICR3IDxWaXNpYmlsaXR5PiAiZ3JhYiAkdzsgZm9jdXMgJHciCisJYmluZCAkdyA8S2V5LVJldHVybj4gImRlc3Ryb3kgJHciCisJd20gdGl0bGUgJHcgW3N0cmNhdCAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogIiBbbWMgImVycm9yIl1dCisJdGt3YWl0IHdpbmRvdyAkdworfQpkaWZmIC0tZ2l0IGEvZ2l0LWd1aS9saWIvZ2l0LWd1aS5pY28gYi9naXQtZ3VpL2xpYi9naXQtZ3VpLmljbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzRjZmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9saWIvZ2l0LWd1aS5pY28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ2l0LWd1aS9saWIvaW5kZXgudGNsIGIvZ2l0LWd1aS9saWIvaW5kZXgudGNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMWZjZTcKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtZ3VpL2xpYi9pbmRleC50Y2wKQEAgLTAsMCArMSw0MzcgQEAKKyMgZ2l0LWd1aSBpbmRleCAoYWRkL3JlbW92ZSkgc3VwcG9ydAorIyBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgU2hhd24gUGVhcmNlCisKK3Byb2MgX2RlbGV0ZV9pbmRleGxvY2sge30geworCWlmIHtbY2F0Y2gge2ZpbGUgZGVsZXRlIC0tIFtnaXRkaXIgaW5kZXgubG9ja119IGVycl19IHsKKwkJZXJyb3JfcG9wdXAgW3N0cmNhdCBbbWMgIlVuYWJsZSB0byB1bmxvY2sgdGhlIGluZGV4LiJdICJcblxuJGVyciJdCisJfQorfQorCitwcm9jIF9jbG9zZV91cGRhdGVpbmRleCB7ZmQgYWZ0ZXJ9IHsKKwlmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMQorCWlmIHtbY2F0Y2gge2Nsb3NlICRmZH0gZXJyXX0geworCQlzZXQgdyAuaW5kZXhmcmllZAorCQl0b3BsZXZlbCAkdworCQl3bSB0aXRsZSAkdyBbc3RyY2F0ICJbYXBwbmFtZV0gKFtyZXBvbmFtZV0pOiAiIFttYyAiSW5kZXggRXJyb3IiXV0KKwkJd20gZ2VvbWV0cnkgJHcgIitbd2luZm8gcm9vdHggLl0rW3dpbmZvIHJvb3R5IC5dIgorCQlwYWNrIFtsYWJlbCAkdy5tc2cgXAorCQkJLWp1c3RpZnkgbGVmdCBcCisJCQktYW5jaG9yIHcgXAorCQkJLXRleHQgW3N0cmNhdCBcCisJCQkJW21jICJVcGRhdGluZyB0aGUgR2l0IGluZGV4IGZhaWxlZC4gIEEgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIHRvIHJlc3luY2hyb25pemUgZ2l0LWd1aS4iXSBcCisJCQkJIlxuXG4kZXJyIl0gXAorCQkJXSAtYW5jaG9yIHcKKworCQlmcmFtZSAkdy5idXR0b25zCisJCWJ1dHRvbiAkdy5idXR0b25zLmNvbnRpbnVlIFwKKwkJCS10ZXh0IFttYyAiQ29udGludWUiXSBcCisJCQktY29tbWFuZCBbbGlzdCBkZXN0cm95ICR3XQorCQlwYWNrICR3LmJ1dHRvbnMuY29udGludWUgLXNpZGUgcmlnaHQgLXBhZHggNQorCQlidXR0b24gJHcuYnV0dG9ucy51bmxvY2sgXAorCQkJLXRleHQgW21jICJVbmxvY2sgSW5kZXgiXSBcCisJCQktY29tbWFuZCAiZGVzdHJveSAkdzsgX2RlbGV0ZV9pbmRleGxvY2siCisJCXBhY2sgJHcuYnV0dG9ucy51bmxvY2sgLXNpZGUgcmlnaHQKKwkJcGFjayAkdy5idXR0b25zIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDEwIC1wYWR4IDEwCisKKwkJd20gcHJvdG9jb2wgJHcgV01fREVMRVRFX1dJTkRPVyB1cGRhdGUKKwkJYmluZCAkdy5idXR0b25zLmNvbnRpbnVlIDxWaXNpYmlsaXR5PiAiCisJCQlncmFiICR3CisJCQlmb2N1cyAkdy5idXR0b25zLmNvbnRpbnVlCisJCSIKKwkJdGt3YWl0IHdpbmRvdyAkdworCisJCSQ6Om1haW5fc3RhdHVzIHN0b3AKKwkJdW5sb2NrX2luZGV4CisJCXJlc2NhbiAkYWZ0ZXIgMAorCQlyZXR1cm4KKwl9CisKKwkkOjptYWluX3N0YXR1cyBzdG9wCisJdW5sb2NrX2luZGV4CisJdXBsZXZlbCAjMCAkYWZ0ZXIKK30KKworcHJvYyB1cGRhdGVfaW5kZXhpbmZvIHttc2cgcGF0aExpc3QgYWZ0ZXJ9IHsKKwlnbG9iYWwgdXBkYXRlX2luZGV4X2NwCisKKwlpZiB7IVtsb2NrX2luZGV4IHVwZGF0ZV19IHJldHVybgorCisJc2V0IHVwZGF0ZV9pbmRleF9jcCAwCisJc2V0IHBhdGhMaXN0IFtsc29ydCAkcGF0aExpc3RdCisJc2V0IHRvdGFsQ250IFtsbGVuZ3RoICRwYXRoTGlzdF0KKwlzZXQgYmF0Y2ggW2V4cHIge2ludCgkdG90YWxDbnQgKiAuMDEpICsgMX1dCisJaWYgeyRiYXRjaCA+IDI1fSB7c2V0IGJhdGNoIDI1fQorCisJJDo6bWFpbl9zdGF0dXMgc3RhcnQgJG1zZyBbbWMgImZpbGVzIl0KKwlzZXQgZmQgW2dpdF93cml0ZSB1cGRhdGUtaW5kZXggLXogLS1pbmRleC1pbmZvXQorCWZjb25maWd1cmUgJGZkIFwKKwkJLWJsb2NraW5nIDAgXAorCQktYnVmZmVyaW5nIGZ1bGwgXAorCQktYnVmZmVyc2l6ZSA1MTIgXAorCQktZW5jb2RpbmcgYmluYXJ5IFwKKwkJLXRyYW5zbGF0aW9uIGJpbmFyeQorCWZpbGVldmVudCAkZmQgd3JpdGFibGUgW2xpc3QgXAorCQl3cml0ZV91cGRhdGVfaW5kZXhpbmZvIFwKKwkJJGZkIFwKKwkJJHBhdGhMaXN0IFwKKwkJJHRvdGFsQ250IFwKKwkJJGJhdGNoIFwKKwkJJGFmdGVyIFwKKwkJXQorfQorCitwcm9jIHdyaXRlX3VwZGF0ZV9pbmRleGluZm8ge2ZkIHBhdGhMaXN0IHRvdGFsQ250IGJhdGNoIGFmdGVyfSB7CisJZ2xvYmFsIHVwZGF0ZV9pbmRleF9jcAorCWdsb2JhbCBmaWxlX3N0YXRlcyBjdXJyZW50X2RpZmZfcGF0aAorCisJaWYgeyR1cGRhdGVfaW5kZXhfY3AgPj0gJHRvdGFsQ250fSB7CisJCV9jbG9zZV91cGRhdGVpbmRleCAkZmQgJGFmdGVyCisJCXJldHVybgorCX0KKworCWZvciB7c2V0IGkgJGJhdGNofSBcCisJCXskdXBkYXRlX2luZGV4X2NwIDwgJHRvdGFsQ250ICYmICRpID4gMH0gXAorCQl7aW5jciBpIC0xfSB7CisJCXNldCBwYXRoIFtsaW5kZXggJHBhdGhMaXN0ICR1cGRhdGVfaW5kZXhfY3BdCisJCWluY3IgdXBkYXRlX2luZGV4X2NwCisKKwkJc2V0IHMgJGZpbGVfc3RhdGVzKCRwYXRoKQorCQlzd2l0Y2ggLWdsb2IgLS0gW2xpbmRleCAkcyAwXSB7CisJCUE/IHtzZXQgbmV3IF9PfQorCQlNPyB7c2V0IG5ldyBfTX0KKwkJRF8ge3NldCBuZXcgX0R9CisJCUQ/IHtzZXQgbmV3IF8/fQorCQk/PyB7Y29udGludWV9CisJCX0KKwkJc2V0IGluZm8gW2xpbmRleCAkcyAyXQorCQlpZiB7JGluZm8gZXEge319IGNvbnRpbnVlCisKKwkJcHV0cyAtbm9uZXdsaW5lICRmZCAiJGluZm9cdFtlbmNvZGluZyBjb252ZXJ0dG8gJHBhdGhdXDAiCisJCWRpc3BsYXlfZmlsZSAkcGF0aCAkbmV3CisJfQorCisJJDo6bWFpbl9zdGF0dXMgdXBkYXRlICR1cGRhdGVfaW5kZXhfY3AgJHRvdGFsQ250Cit9CisKK3Byb2MgdXBkYXRlX2luZGV4IHttc2cgcGF0aExpc3QgYWZ0ZXJ9IHsKKwlnbG9iYWwgdXBkYXRlX2luZGV4X2NwCisKKwlpZiB7IVtsb2NrX2luZGV4IHVwZGF0ZV19IHJldHVybgorCisJc2V0IHVwZGF0ZV9pbmRleF9jcCAwCisJc2V0IHBhdGhMaXN0IFtsc29ydCAkcGF0aExpc3RdCisJc2V0IHRvdGFsQ250IFtsbGVuZ3RoICRwYXRoTGlzdF0KKwlzZXQgYmF0Y2ggW2V4cHIge2ludCgkdG90YWxDbnQgKiAuMDEpICsgMX1dCisJaWYgeyRiYXRjaCA+IDI1fSB7c2V0IGJhdGNoIDI1fQorCisJJDo6bWFpbl9zdGF0dXMgc3RhcnQgJG1zZyBbbWMgImZpbGVzIl0KKwlzZXQgZmQgW2dpdF93cml0ZSB1cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgLXogLS1zdGRpbl0KKwlmY29uZmlndXJlICRmZCBcCisJCS1ibG9ja2luZyAwIFwKKwkJLWJ1ZmZlcmluZyBmdWxsIFwKKwkJLWJ1ZmZlcnNpemUgNTEyIFwKKwkJLWVuY29kaW5nIGJpbmFyeSBcCisJCS10cmFuc2xhdGlvbiBiaW5hcnkKKwlmaWxlZXZlbnQgJGZkIHdyaXRhYmxlIFtsaXN0IFwKKwkJd3JpdGVfdXBkYXRlX2luZGV4IFwKKwkJJGZkIFwKKwkJJHBhdGhMaXN0IFwKKwkJJHRvdGFsQ250IFwKKwkJJGJhdGNoIFwKKwkJJGFmdGVyIFwKKwkJXQorfQorCitwcm9jIHdyaXRlX3VwZGF0ZV9pbmRleCB7ZmQgcGF0aExpc3QgdG90YWxDbnQgYmF0Y2ggYWZ0ZXJ9IHsKKwlnbG9iYWwgdXBkYXRlX2luZGV4X2NwCisJZ2xvYmFsIGZpbGVfc3RhdGVzIGN1cnJlbnRfZGlmZl9wYXRoCisKKwlpZiB7JHVwZGF0ZV9pbmRleF9jcCA+PSAkdG90YWxDbnR9IHsKKwkJX2Nsb3NlX3VwZGF0ZWluZGV4ICRmZCAkYWZ0ZXIKKwkJcmV0dXJuCisJfQorCisJZm9yIHtzZXQgaSAkYmF0Y2h9IFwKKwkJeyR1cGRhdGVfaW5kZXhfY3AgPCAkdG90YWxDbnQgJiYgJGkgPiAwfSBcCisJCXtpbmNyIGkgLTF9IHsKKwkJc2V0IHBhdGggW2xpbmRleCAkcGF0aExpc3QgJHVwZGF0ZV9pbmRleF9jcF0KKwkJaW5jciB1cGRhdGVfaW5kZXhfY3AKKworCQlzd2l0Y2ggLWdsb2IgLS0gW2xpbmRleCAkZmlsZV9zdGF0ZXMoJHBhdGgpIDBdIHsKKwkJQUQge3NldCBuZXcgX199CisJCT9EIHtzZXQgbmV3IERffQorCQlfTyAtCisJCUFNIHtzZXQgbmV3IEFffQorCQlVPyB7CisJCQlpZiB7W2ZpbGUgZXhpc3RzICRwYXRoXX0geworCQkJCXNldCBuZXcgTV8KKwkJCX0gZWxzZSB7CisJCQkJc2V0IG5ldyBEXworCQkJfQorCQl9CisJCT9NIHtzZXQgbmV3IE1ffQorCQk/PyB7Y29udGludWV9CisJCX0KKwkJcHV0cyAtbm9uZXdsaW5lICRmZCAiW2VuY29kaW5nIGNvbnZlcnR0byAkcGF0aF1cMCIKKwkJZGlzcGxheV9maWxlICRwYXRoICRuZXcKKwl9CisKKwkkOjptYWluX3N0YXR1cyB1cGRhdGUgJHVwZGF0ZV9pbmRleF9jcCAkdG90YWxDbnQKK30KKworcHJvYyBjaGVja291dF9pbmRleCB7bXNnIHBhdGhMaXN0IGFmdGVyfSB7CisJZ2xvYmFsIHVwZGF0ZV9pbmRleF9jcAorCisJaWYgeyFbbG9ja19pbmRleCB1cGRhdGVdfSByZXR1cm4KKworCXNldCB1cGRhdGVfaW5kZXhfY3AgMAorCXNldCBwYXRoTGlzdCBbbHNvcnQgJHBhdGhMaXN0XQorCXNldCB0b3RhbENudCBbbGxlbmd0aCAkcGF0aExpc3RdCisJc2V0IGJhdGNoIFtleHByIHtpbnQoJHRvdGFsQ250ICogLjAxKSArIDF9XQorCWlmIHskYmF0Y2ggPiAyNX0ge3NldCBiYXRjaCAyNX0KKworCSQ6Om1haW5fc3RhdHVzIHN0YXJ0ICRtc2cgW21jICJmaWxlcyJdCisJc2V0IGZkIFtnaXRfd3JpdGUgY2hlY2tvdXQtaW5kZXggXAorCQktLWluZGV4IFwKKwkJLS1xdWlldCBcCisJCS0tZm9yY2UgXAorCQkteiBcCisJCS0tc3RkaW4gXAorCQldCisJZmNvbmZpZ3VyZSAkZmQgXAorCQktYmxvY2tpbmcgMCBcCisJCS1idWZmZXJpbmcgZnVsbCBcCisJCS1idWZmZXJzaXplIDUxMiBcCisJCS1lbmNvZGluZyBiaW5hcnkgXAorCQktdHJhbnNsYXRpb24gYmluYXJ5CisJZmlsZWV2ZW50ICRmZCB3cml0YWJsZSBbbGlzdCBcCisJCXdyaXRlX2NoZWNrb3V0X2luZGV4IFwKKwkJJGZkIFwKKwkJJHBhdGhMaXN0IFwKKwkJJHRvdGFsQ250IFwKKwkJJGJhdGNoIFwKKwkJJGFmdGVyIFwKKwkJXQorfQorCitwcm9jIHdyaXRlX2NoZWNrb3V0X2luZGV4IHtmZCBwYXRoTGlzdCB0b3RhbENudCBiYXRjaCBhZnRlcn0geworCWdsb2JhbCB1cGRhdGVfaW5kZXhfY3AKKwlnbG9iYWwgZmlsZV9zdGF0ZXMgY3VycmVudF9kaWZmX3BhdGgKKworCWlmIHskdXBkYXRlX2luZGV4X2NwID49ICR0b3RhbENudH0geworCQlfY2xvc2VfdXBkYXRlaW5kZXggJGZkICRhZnRlcgorCQlyZXR1cm4KKwl9CisKKwlmb3Ige3NldCBpICRiYXRjaH0gXAorCQl7JHVwZGF0ZV9pbmRleF9jcCA8ICR0b3RhbENudCAmJiAkaSA+IDB9IFwKKwkJe2luY3IgaSAtMX0geworCQlzZXQgcGF0aCBbbGluZGV4ICRwYXRoTGlzdCAkdXBkYXRlX2luZGV4X2NwXQorCQlpbmNyIHVwZGF0ZV9pbmRleF9jcAorCQlzd2l0Y2ggLWdsb2IgLS0gW2xpbmRleCAkZmlsZV9zdGF0ZXMoJHBhdGgpIDBdIHsKKwkJVT8ge2NvbnRpbnVlfQorCQk/TSAtCisJCT9EIHsKKwkJCXB1dHMgLW5vbmV3bGluZSAkZmQgIltlbmNvZGluZyBjb252ZXJ0dG8gJHBhdGhdXDAiCisJCQlkaXNwbGF5X2ZpbGUgJHBhdGggP18KKwkJfQorCQl9CisJfQorCisJJDo6bWFpbl9zdGF0dXMgdXBkYXRlICR1cGRhdGVfaW5kZXhfY3AgJHRvdGFsQ250Cit9CisKK3Byb2MgdW5zdGFnZV9oZWxwZXIge3R4dCBwYXRoc30geworCWdsb2JhbCBmaWxlX3N0YXRlcyBjdXJyZW50X2RpZmZfcGF0aAorCisJaWYgeyFbbG9ja19pbmRleCBiZWdpbi11cGRhdGVdfSByZXR1cm4KKworCXNldCBwYXRoTGlzdCBbbGlzdF0KKwlzZXQgYWZ0ZXIge30KKwlmb3JlYWNoIHBhdGggJHBhdGhzIHsKKwkJc3dpdGNoIC1nbG9iIC0tIFtsaW5kZXggJGZpbGVfc3RhdGVzKCRwYXRoKSAwXSB7CisJCUE/IC0KKwkJTT8gLQorCQlEPyB7CisJCQlsYXBwZW5kIHBhdGhMaXN0ICRwYXRoCisJCQlpZiB7JHBhdGggZXEgJGN1cnJlbnRfZGlmZl9wYXRofSB7CisJCQkJc2V0IGFmdGVyIHtyZXNob3dfZGlmZjt9CisJCQl9CisJCX0KKwkJfQorCX0KKwlpZiB7JHBhdGhMaXN0IGVxIHt9fSB7CisJCXVubG9ja19pbmRleAorCX0gZWxzZSB7CisJCXVwZGF0ZV9pbmRleGluZm8gXAorCQkJJHR4dCBcCisJCQkkcGF0aExpc3QgXAorCQkJW2NvbmNhdCAkYWZ0ZXIgW2xpc3QgdWlfcmVhZHldXQorCX0KK30KKworcHJvYyBkb191bnN0YWdlX3NlbGVjdGlvbiB7fSB7CisJZ2xvYmFsIGN1cnJlbnRfZGlmZl9wYXRoIHNlbGVjdGVkX3BhdGhzCisKKwlpZiB7W2FycmF5IHNpemUgc2VsZWN0ZWRfcGF0aHNdID4gMH0geworCQl1bnN0YWdlX2hlbHBlciBcCisJCQl7VW5zdGFnaW5nIHNlbGVjdGVkIGZpbGVzIGZyb20gY29tbWl0fSBcCisJCQlbYXJyYXkgbmFtZXMgc2VsZWN0ZWRfcGF0aHNdCisJfSBlbHNlaWYgeyRjdXJyZW50X2RpZmZfcGF0aCBuZSB7fX0geworCQl1bnN0YWdlX2hlbHBlciBcCisJCQlbbWMgIlVuc3RhZ2luZyAlcyBmcm9tIGNvbW1pdCIgW3Nob3J0X3BhdGggJGN1cnJlbnRfZGlmZl9wYXRoXV0gXAorCQkJW2xpc3QgJGN1cnJlbnRfZGlmZl9wYXRoXQorCX0KK30KKworcHJvYyBhZGRfaGVscGVyIHt0eHQgcGF0aHN9IHsKKwlnbG9iYWwgZmlsZV9zdGF0ZXMgY3VycmVudF9kaWZmX3BhdGgKKworCWlmIHshW2xvY2tfaW5kZXggYmVnaW4tdXBkYXRlXX0gcmV0dXJuCisKKwlzZXQgcGF0aExpc3QgW2xpc3RdCisJc2V0IGFmdGVyIHt9CisJZm9yZWFjaCBwYXRoICRwYXRocyB7CisJCXN3aXRjaCAtZ2xvYiAtLSBbbGluZGV4ICRmaWxlX3N0YXRlcygkcGF0aCkgMF0geworCQlfTyAtCisJCT9NIC0KKwkJP0QgLQorCQlVPyB7CisJCQlsYXBwZW5kIHBhdGhMaXN0ICRwYXRoCisJCQlpZiB7JHBhdGggZXEgJGN1cnJlbnRfZGlmZl9wYXRofSB7CisJCQkJc2V0IGFmdGVyIHtyZXNob3dfZGlmZjt9CisJCQl9CisJCX0KKwkJfQorCX0KKwlpZiB7JHBhdGhMaXN0IGVxIHt9fSB7CisJCXVubG9ja19pbmRleAorCX0gZWxzZSB7CisJCXVwZGF0ZV9pbmRleCBcCisJCQkkdHh0IFwKKwkJCSRwYXRoTGlzdCBcCisJCQlbY29uY2F0ICRhZnRlciB7dWlfc3RhdHVzIFttYyAiUmVhZHkgdG8gY29tbWl0LiJdfV0KKwl9Cit9CisKK3Byb2MgZG9fYWRkX3NlbGVjdGlvbiB7fSB7CisJZ2xvYmFsIGN1cnJlbnRfZGlmZl9wYXRoIHNlbGVjdGVkX3BhdGhzCisKKwlpZiB7W2FycmF5IHNpemUgc2VsZWN0ZWRfcGF0aHNdID4gMH0geworCQlhZGRfaGVscGVyIFwKKwkJCXtBZGRpbmcgc2VsZWN0ZWQgZmlsZXN9IFwKKwkJCVthcnJheSBuYW1lcyBzZWxlY3RlZF9wYXRoc10KKwl9IGVsc2VpZiB7JGN1cnJlbnRfZGlmZl9wYXRoIG5lIHt9fSB7CisJCWFkZF9oZWxwZXIgXAorCQkJW21jICJBZGRpbmcgJXMiIFtzaG9ydF9wYXRoICRjdXJyZW50X2RpZmZfcGF0aF1dIFwKKwkJCVtsaXN0ICRjdXJyZW50X2RpZmZfcGF0aF0KKwl9Cit9CisKK3Byb2MgZG9fYWRkX2FsbCB7fSB7CisJZ2xvYmFsIGZpbGVfc3RhdGVzCisKKwlzZXQgcGF0aHMgW2xpc3RdCisJZm9yZWFjaCBwYXRoIFthcnJheSBuYW1lcyBmaWxlX3N0YXRlc10geworCQlzd2l0Y2ggLWdsb2IgLS0gW2xpbmRleCAkZmlsZV9zdGF0ZXMoJHBhdGgpIDBdIHsKKwkJVT8ge2NvbnRpbnVlfQorCQk/TSAtCisJCT9EIHtsYXBwZW5kIHBhdGhzICRwYXRofQorCQl9CisJfQorCWFkZF9oZWxwZXIge0FkZGluZyBhbGwgY2hhbmdlZCBmaWxlc30gJHBhdGhzCit9CisKK3Byb2MgcmV2ZXJ0X2hlbHBlciB7dHh0IHBhdGhzfSB7CisJZ2xvYmFsIGZpbGVfc3RhdGVzIGN1cnJlbnRfZGlmZl9wYXRoCisKKwlpZiB7IVtsb2NrX2luZGV4IGJlZ2luLXVwZGF0ZV19IHJldHVybgorCisJc2V0IHBhdGhMaXN0IFtsaXN0XQorCXNldCBhZnRlciB7fQorCWZvcmVhY2ggcGF0aCAkcGF0aHMgeworCQlzd2l0Y2ggLWdsb2IgLS0gW2xpbmRleCAkZmlsZV9zdGF0ZXMoJHBhdGgpIDBdIHsKKwkJVT8ge2NvbnRpbnVlfQorCQk/TSAtCisJCT9EIHsKKwkJCWxhcHBlbmQgcGF0aExpc3QgJHBhdGgKKwkJCWlmIHskcGF0aCBlcSAkY3VycmVudF9kaWZmX3BhdGh9IHsKKwkJCQlzZXQgYWZ0ZXIge3Jlc2hvd19kaWZmO30KKwkJCX0KKwkJfQorCQl9CisJfQorCisKKwkjIFNwbGl0IHF1ZXN0aW9uIGJldHdlZW4gc2luZ3VsYXIgYW5kIHBsdXJhbCBjYXNlcywgYmVjYXVzZQorCSMgc3VjaCBkaXN0aW5jdGlvbiBpcyBuZWVkZWQgaW4gc29tZSBsYW5ndWFnZXMuIFByZXZpb3VzbHksIHRoZQorCSMgY29kZSB1c2VkICJSZXZlcnQgY2hhbmdlcyBpbiIgZm9yIGJvdGgsIGJ1dCB0aGF0IGNhbid0IHdvcmsKKwkjIGluIGxhbmd1YWdlcyB3aGVyZSAnaW4nIG11c3QgYmUgY29tYmluZWQgd2l0aCB3b3JkIGZyb20KKwkjIHJlc3Qgb2Ygc3RyaW5nIChpbiBkaWZmcmVudCB3YXkgZm9yIGJvdGggY2FzZXMgb2YgY291cnNlKS4KKwkjCisJIyBGSVhNRTogVW5mb3J0dW5hdGVseSwgZXZlbiB0aGF0IGlzbid0IGVub3VnaCBpbiBzb21lIGxhbmd1YWdlcworCSMgYXMgdGhleSBoYXZlIHF1aXRlIGNvbXBsZXggcGx1cmFsLWZvcm0gcnVsZXMuIFVuZm9ydHVuYXRlbHksCisJIyBtc2djYXQgZG9lc24ndCBzZWVtIHRvIHN1cHBvcnQgdGhhdCBraW5kIG9mIHN0cmluZyB0cmFuc2xhdGlvbi4KKwkjCisJc2V0IG4gW2xsZW5ndGggJHBhdGhMaXN0XQorCWlmIHskbiA9PSAwfSB7CisJCXVubG9ja19pbmRleAorCQlyZXR1cm4KKwl9IGVsc2VpZiB7JG4gPT0gMX0geworCQlzZXQgcXVlcnkgW21jICJSZXZlcnQgY2hhbmdlcyBpbiBmaWxlICVzPyIgW3Nob3J0X3BhdGggW2xpbmRleCAkcGF0aExpc3RdXV0KKwl9IGVsc2UgeworCQlzZXQgcXVlcnkgW21jICJSZXZlcnQgY2hhbmdlcyBpbiB0aGVzZSAlaSBmaWxlcz8iICRuXQorCX0KKworCXNldCByZXBseSBbdGtfZGlhbG9nIFwKKwkJLmNvbmZpcm1fcmV2ZXJ0IFwKKwkJIlthcHBuYW1lXSAoW3JlcG9uYW1lXSkiIFwKKwkJIiRxdWVyeQorCitbbWMgIkFueSB1bnN0YWdlZCBjaGFuZ2VzIHdpbGwgYmUgcGVybWFuZW50bHkgbG9zdCBieSB0aGUgcmV2ZXJ0LiJdIiBcCisJCXF1ZXN0aW9uIFwKKwkJMSBcCisJCVttYyAiRG8gTm90aGluZyJdIFwKKwkJW21jICJSZXZlcnQgQ2hhbmdlcyJdIFwKKwkJXQorCWlmIHskcmVwbHkgPT0gMX0geworCQljaGVja291dF9pbmRleCBcCisJCQkkdHh0IFwKKwkJCSRwYXRoTGlzdCBcCisJCQlbY29uY2F0ICRhZnRlciBbbGlzdCB1aV9yZWFkeV1dCisJfSBlbHNlIHsKKwkJdW5sb2NrX2luZGV4CisJfQorfQorCitwcm9jIGRvX3JldmVydF9zZWxlY3Rpb24ge30geworCWdsb2JhbCBjdXJyZW50X2RpZmZfcGF0aCBzZWxlY3RlZF9wYXRocworCisJaWYge1thcnJheSBzaXplIHNlbGVjdGVkX3BhdGhzXSA+IDB9IHsKKwkJcmV2ZXJ0X2hlbHBlciBcCisJCQl7UmV2ZXJ0aW5nIHNlbGVjdGVkIGZpbGVzfSBcCisJCQlbYXJyYXkgbmFtZXMgc2VsZWN0ZWRfcGF0aHNdCisJfSBlbHNlaWYgeyRjdXJyZW50X2RpZmZfcGF0aCBuZSB7fX0geworCQlyZXZlcnRfaGVscGVyIFwKKwkJCSJSZXZlcnRpbmcgW3Nob3J0X3BhdGggJGN1cnJlbnRfZGlmZl9wYXRoXSIgXAorCQkJW2xpc3QgJGN1cnJlbnRfZGlmZl9wYXRoXQorCX0KK30KKworcHJvYyBkb19zZWxlY3RfY29tbWl0X3R5cGUge30geworCWdsb2JhbCBjb21taXRfdHlwZSBzZWxlY3RlZF9jb21taXRfdHlwZQorCisJaWYgeyRzZWxlY3RlZF9jb21taXRfdHlwZSBlcSB7bmV3fQorCQkmJiBbc3RyaW5nIG1hdGNoIGFtZW5kKiAkY29tbWl0X3R5cGVdfSB7CisJCWNyZWF0ZV9uZXdfY29tbWl0CisJfSBlbHNlaWYgeyRzZWxlY3RlZF9jb21taXRfdHlwZSBlcSB7YW1lbmR9CisJCSYmICFbc3RyaW5nIG1hdGNoIGFtZW5kKiAkY29tbWl0X3R5cGVdfSB7CisJCWxvYWRfbGFzdF9jb21taXQKKworCQkjIFRoZSBhbWVuZCByZXF1ZXN0IHdhcyByZWplY3RlZC4uLgorCQkjCisJCWlmIHshW3N0cmluZyBtYXRjaCBhbWVuZCogJGNvbW1pdF90eXBlXX0geworCQkJc2V0IHNlbGVjdGVkX2NvbW1pdF90eXBlIG5ldworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZ2l0LWd1aS9saWIvbG9nby50Y2wgYi9naXQtZ3VpL2xpYi9sb2dvLnRjbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmY3NjY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9saWIvbG9nby50Y2wKQEAgLTAsMCArMSw0MyBAQAorIyBnaXQtZ3VpIEdpdCBHdWkgbG9nbworIyBDb3B5cmlnaHQgKEMpIDIwMDcgU2hhd24gUGVhcmNlCisKKyMgSGVucmlrIE55aCdzIGFsdGVybmF0aXZlIEdpdCBsb2dvLCBmcm9tIGhpcyBibG9nIHBvc3QKKyMgaHR0cDovL2hlbnJpay5ueWguc2UvMjAwNy8wNi9hbHRlcm5hdGl2ZS1naXQtbG9nby1hbmQtZmF2aWNvbgorIworaW1hZ2UgY3JlYXRlIHBob3RvIDo6Z2l0X2xvZ29fZGF0YSAtZGF0YSB7CitSMGxHT0RkaFlRQzhBSVFiQUdabVp0ZzRMVzl2YjNsNWVZS0Nnb3lNakVDL1RPSnBZWldWbForZm4yL1BlS21wcWJLeXNyeTh2TVhGCit4Wi9mcGMvUHo3Zm52UFhOeXRuWjJlTGk0cy92MHZqYTErenM3T2YzNmZYMTlmM3o4di8vLy8vLy8vLy8vLy8vLy8vLy95d0FBQUFBCitZUUM4QUFBRi91QW1qbVJwbm1pcXJtenJ2cTRoejNSdEd3K3M3eng1LzdkY2IwaFVBWTh6WVhISlJDS1Z6R2pQZVlSS3J5OHEwSXJ0CitHclZCcjNnRkRvL1BwcktOaXg2cmEreTI5MDJMeTdIMDVMMmRsOW4zVVgwNGdHZUNmNFJGaG9oaWlvdGRqWTVYa0pHQmZZZVVPcE9ZCitpWmFibFhtWFVSZ1BwS1dtcDZpcHFZSUtxcTZ2cVJFakZZSzF0clVLczdlN3ZGcTVJclM5d3NNMHZ4dkJ4TW04eHNqS3pxeTZ6OUo1Cit6TlBXYXRYWDJrN1oyOTQzM2QvaU11SGozK1htMitqcDErdnMwKzd2ei9IeXl2VDF4UGY0d3ZyN3k5SCtwQmtiQmFzZ0xGWUdFOGJhCitvOG5UbEU0T09ZR0tLSkZPS0lvcEdtTE1BbkhqRG8wZVdZQU0rV1VpU1Jnai9rK2VTS215Qk11V0kxN0MzQ0FUWnMyV04xWG1QTG1UCitaTStRUHowRzNWaWhxTkdqU0pOV3dEQ3pxZE9uVUtQdTBTQ2hxdFdyV0xOcTNjcTFxOWV2WUNWWUdDRWhnTm16YU5PcVhjdTJyZHUzCitjT01HT0VCV3J0MjdlUFBDcFN1aXJONi9nQU8zNWJ2QnIrRERpUE1TTnB5NHNXTzJpeDlMbm13Mk11WExpUzFqM2d4WU0rZlBkejJECitIdjFXTk9uVGFrMmpYajIzTHV2WGxWM0RacTE2TnVqYXRqbmp6bzE1TjIvS3ZuOUxEaTdjTWZIaW1hVXFYODY4dWZQbjBLUFBwT0NBCitBUU1XQ1FCbzM4Njl1L2Z2NE1OcmQzRGxRb01DM1Fsa1NKRmR2UHYzOExWRFdKTEJBWUh3RTFMRTM4Ky8rL1VoR1RBZ2dIdjVvZERmCitnZnY5L3NlRGdQQVZlQUtDRUxxbklBd1UzQmVmZ3laRXFPRjNFN3JBUUg4WWxyRGhpTnQxdUVJRzZJR29INGtqbXBqQ0JSYXFhQ0NMCitHN3A0QWdVREloZ2lDVFRXMkFLT0VlNDRRbzhhMmtoQ0JnTm9LS1FJUkVab3BBZ1p4QWpoa2hzMENlR1RHN1NuNUlwVzl2ZWtBeVJTCisyZVdCUmw2UTQ0WmlqaGxmQVFsUW1lS0lhYXJwSFpzTVRIQUJDeERRR0tlYzNKSDNRcElzN3NubmRuNnlBS2FlWEE3YVp3dUFCcHBvCitmQXdzMEdpRWhhS1FKNDBGM0RramZ3VkM4Q2FDQWxDZ0FnSWtKakRmQ2dkaU9NR24vUTJ3M2drWnRQZ3FDNm1hMEVDRUNhQndhNFFFCithT3BDclNZQXFlTUpwRUtZcXc3QUJuc21md1E4YUN3UHlTcUxZS1ViL2t3QVliUFF5b2lDdFFjT1VNS0hCd3JnSzdMYW9nQnV1YXhDCitPa1MwS0V3YTM3RWlMQnVmQUxQdXdPNEpoL0lud0FpeGtrbkV2U2U0QzkrcDNQWTNycjNscG5EdWZndUljQ216UlFBYzdJSFlMaHhmCit3LzhtbklMQTc0bGc4Y0FSYTR4Q3NaeHVzTUNCb21aY2Nnc2Z2MGRldWgySHZMS2gvc0xzM2hKU3ZpZXVDd1V6dklITjR0R1hjM2loCit2dER6bWo4ZlNOTFI4QldRZEg5TEgrZzAwT0ZGM2QvVUJ4NGNVY3Z1T2MyMWVGUmlvdVYrWHZ2cjBkRHZsWDIxUi8ydXpUUjg5VHFVCitMMys1VW9CZ0F4dFJIZDUvQ0hwTGtkMTNpNEQyZTNoSFJMS01ZKzlIcjBOdngvZnEzUHc1N2NuZzcvbTl3UVZPYm5JeWhBaVF3SEY4CisvdFFTOG5EZ0kyd09ZZWgzQ0F2aHVJQkhpREVncXZkdHd1ZGthejNHQlBLYVRjS3VHZ3FBSlJNWm1LNmgxaG5rM25jRGNVdmhnUEZTCitvNUI0NzZaS1FjRUN6Q040cWdtWU40bEFuY216Y0FFRWtoSnArUWxma3loQUFkdGJOOEg2N0Z2SFFBRjZiNGc2djlVcnlxZmtLa0J1Cit2LzBwcnhELy9rUjYzWW5xQjhBZXFjZG9CUnhVLzF6QXV3UmFhWDRyZUo0RFNTUkFIVWh3Z3JncXdnVXgyQjk0RVdHREhJU1BCelVZCitRZ1NOY0FuNks2RjRmc2NEQ3RCT2hkb1J3UFc2a0lIRHdaQTd2V29EQkY0NFFkL3RJVUFFQkNBQ2JJZUc0QVh4Zm1GclE0QjRPQ1lFCitKQkVRRUxDaG1nYkFBQ0ppb2o0Sk9DS0NDTENBQlo2RUFnMUlId0RseUxZQUIxZ1JKaFNZZ0hVUUFEOVduUTkrQ1dCQUErd2tuVHBDCitKd1FBT3c9PQorfQorCitwcm9jIGdpdF9sb2dvIHt3fSB7CisJbGFiZWwgJHcgXAorCQktYm9yZGVyd2lkdGggMSBcCisJCS1yZWxpZWYgc3Vua2VuIFwKKwkJLWJhY2tncm91bmQgd2hpdGUgXAorCQktaW1hZ2UgOjpnaXRfbG9nb19kYXRhCisJcmV0dXJuICR3Cit9CmRpZmYgLS1naXQgYS9naXQtZ3VpL2xpYi9tZXJnZS50Y2wgYi9naXQtZ3VpL2xpYi9tZXJnZS50Y2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MyNmIwNwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvbGliL21lcmdlLnRjbApAQCAtMCwwICsxLDI3MyBAQAorIyBnaXQtZ3VpIGJyYW5jaCBtZXJnZSBzdXBwb3J0CisjIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBTaGF3biBQZWFyY2UKKworY2xhc3MgbWVyZ2UgeworCitmaWVsZCB3ICAgICAgICAgOyAjIHRvcCBsZXZlbCB3aW5kb3cKK2ZpZWxkIHdfcmV2ICAgICA7ICMgbWVnYS13aWRnZXQgdG8gcGljayB0aGUgcmV2aXNpb24gdG8gbWVyZ2UKKworbWV0aG9kIF9jYW5fbWVyZ2Uge30geworCWdsb2JhbCBIRUFEIGNvbW1pdF90eXBlIGZpbGVfc3RhdGVzCisKKwlpZiB7W3N0cmluZyBtYXRjaCBhbWVuZCogJGNvbW1pdF90eXBlXX0geworCQlpbmZvX3BvcHVwIFttYyAiQ2Fubm90IG1lcmdlIHdoaWxlIGFtZW5kaW5nLgorCitZb3UgbXVzdCBmaW5pc2ggYW1lbmRpbmcgdGhpcyBjb21taXQgYmVmb3JlIHN0YXJ0aW5nIGFueSB0eXBlIG9mIG1lcmdlLgorIl0KKwkJcmV0dXJuIDAKKwl9CisKKwlpZiB7W2NvbW1pdHRlcl9pZGVudF0gZXEge319IHtyZXR1cm4gMH0KKwlpZiB7IVtsb2NrX2luZGV4IG1lcmdlXX0ge3JldHVybiAwfQorCisJIyAtLSBPdXIgaW4gbWVtb3J5IHN0YXRlIHNob3VsZCBtYXRjaCB0aGUgcmVwb3NpdG9yeS4KKwkjCisJcmVwb3NpdG9yeV9zdGF0ZSBjdXJUeXBlIGN1ckhFQUQgY3VyTUVSR0VfSEVBRAorCWlmIHskY29tbWl0X3R5cGUgbmUgJGN1clR5cGUgfHwgJEhFQUQgbmUgJGN1ckhFQUR9IHsKKwkJaW5mb19wb3B1cCBbbWMgIkxhc3Qgc2Nhbm5lZCBzdGF0ZSBkb2VzIG5vdCBtYXRjaCByZXBvc2l0b3J5IHN0YXRlLgorCitBbm90aGVyIEdpdCBwcm9ncmFtIGhhcyBtb2RpZmllZCB0aGlzIHJlcG9zaXRvcnkgc2luY2UgdGhlIGxhc3Qgc2Nhbi4gIEEgcmVzY2FuIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSBhIG1lcmdlIGNhbiBiZSBwZXJmb3JtZWQuCisKK1RoZSByZXNjYW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgbm93LgorIl0KKwkJdW5sb2NrX2luZGV4CisJCXJlc2NhbiB1aV9yZWFkeQorCQlyZXR1cm4gMAorCX0KKworCWZvcmVhY2ggcGF0aCBbYXJyYXkgbmFtZXMgZmlsZV9zdGF0ZXNdIHsKKwkJc3dpdGNoIC1nbG9iIC0tIFtsaW5kZXggJGZpbGVfc3RhdGVzKCRwYXRoKSAwXSB7CisJCV9PIHsKKwkJCWNvbnRpbnVlOyAjIGFuZCBwcmF5IGl0IHdvcmtzIQorCQl9CisJCVU/IHsKKwkJCWVycm9yX3BvcHVwIFttYyAiWW91IGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgY29uZmxpY3RlZCBtZXJnZS4KKworRmlsZSAlcyBoYXMgbWVyZ2UgY29uZmxpY3RzLgorCitZb3UgbXVzdCByZXNvbHZlIHRoZW0sIHN0YWdlIHRoZSBmaWxlLCBhbmQgY29tbWl0IHRvIGNvbXBsZXRlIHRoZSBjdXJyZW50IG1lcmdlLiAgT25seSB0aGVuIGNhbiB5b3UgYmVnaW4gYW5vdGhlciBtZXJnZS4KKyIgW3Nob3J0X3BhdGggJHBhdGhdXQorCQkJdW5sb2NrX2luZGV4CisJCQlyZXR1cm4gMAorCQl9CisJCT8/IHsKKwkJCWVycm9yX3BvcHVwIFttYyAiWW91IGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgY2hhbmdlLgorCitGaWxlICVzIGlzIG1vZGlmaWVkLgorCitZb3Ugc2hvdWxkIGNvbXBsZXRlIHRoZSBjdXJyZW50IGNvbW1pdCBiZWZvcmUgc3RhcnRpbmcgYSBtZXJnZS4gIERvaW5nIHNvIHdpbGwgaGVscCB5b3UgYWJvcnQgYSBmYWlsZWQgbWVyZ2UsIHNob3VsZCB0aGUgbmVlZCBhcmlzZS4KKyIgW3Nob3J0X3BhdGggJHBhdGhdXQorCQkJdW5sb2NrX2luZGV4CisJCQlyZXR1cm4gMAorCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMQorfQorCittZXRob2QgX3JldiB7fSB7CisJaWYge1tjYXRjaCB7JHdfcmV2IGNvbW1pdF9vcl9kaWV9XX0geworCQlyZXR1cm4ge30KKwl9CisJcmV0dXJuIFskd19yZXYgZ2V0XQorfQorCittZXRob2QgX3Zpc3VhbGl6ZSB7fSB7CisJc2V0IHJldiBbX3JldiAkdGhpc10KKwlpZiB7JHJldiBuZSB7fX0geworCQlkb19naXRrIFtsaXN0ICRyZXYgLS1ub3QgSEVBRF0KKwl9Cit9CisKK21ldGhvZCBfc3RhcnQge30geworCWdsb2JhbCBIRUFEIGN1cnJlbnRfYnJhbmNoIHJlbW90ZV91cmwKKworCXNldCBuYW1lIFtfcmV2ICR0aGlzXQorCWlmIHskbmFtZSBlcSB7fX0geworCQlyZXR1cm4KKwl9CisKKwlzZXQgc3BlYyBbJHdfcmV2IGdldF90cmFja2luZ19icmFuY2hdCisJc2V0IGNtaXQgWyR3X3JldiBnZXRfY29tbWl0XQorCisJc2V0IGZoIFtvcGVuIFtnaXRkaXIgRkVUQ0hfSEVBRF0gd10KKwlmY29uZmlndXJlICRmaCAtdHJhbnNsYXRpb24gbGYKKwlpZiB7JHNwZWMgZXEge319IHsKKwkJc2V0IHJlbW90ZSAuCisJCXNldCBicmFuY2ggJG5hbWUKKwkJc2V0IHN0aXRsZSAkYnJhbmNoCisJfSBlbHNlIHsKKwkJc2V0IHJlbW90ZSAkcmVtb3RlX3VybChbbGluZGV4ICRzcGVjIDFdKQorCQlpZiB7W3JlZ2V4cCB7XlteOkBdKkBbXjpdKjovfSAkcmVtb3RlXX0geworCQkJcmVnc3ViIHteW146QF0qQH0gJHJlbW90ZSB7fSByZW1vdGUKKwkJfQorCQlzZXQgYnJhbmNoIFtsaW5kZXggJHNwZWMgMl0KKwkJc2V0IHN0aXRsZSBbbWMgIiVzIG9mICVzIiAkYnJhbmNoICRyZW1vdGVdCisJfQorCXJlZ3N1YiBecmVmcy9oZWFkcy8gJGJyYW5jaCB7fSBicmFuY2gKKwlwdXRzICRmaCAiJGNtaXRcdFx0YnJhbmNoICckYnJhbmNoJyBvZiAkcmVtb3RlIgorCWNsb3NlICRmaAorCisJc2V0IGNtZCBbbGlzdCBnaXRdCisJbGFwcGVuZCBjbWQgbWVyZ2UKKwlsYXBwZW5kIGNtZCAtLXN0cmF0ZWd5PXJlY3Vyc2l2ZQorCWxhcHBlbmQgY21kIFtnaXQgZm10LW1lcmdlLW1zZyA8W2dpdGRpciBGRVRDSF9IRUFEXV0KKwlsYXBwZW5kIGNtZCBIRUFECisJbGFwcGVuZCBjbWQgJG5hbWUKKworCXVpX3N0YXR1cyBbbWMgIk1lcmdpbmcgJXMgYW5kICVzLi4uIiAkY3VycmVudF9icmFuY2ggJHN0aXRsZV0KKwlzZXQgY29ucyBbY29uc29sZTo6bmV3IFttYyAiTWVyZ2UiXSAibWVyZ2UgJHN0aXRsZSJdCisJY29uc29sZTo6ZXhlYyAkY29ucyAkY21kIFtjYiBfZmluaXNoICRjb25zXQorCisJd20gcHJvdG9jb2wgJHcgV01fREVMRVRFX1dJTkRPVyB7fQorCWRlc3Ryb3kgJHcKK30KKworbWV0aG9kIF9maW5pc2gge2NvbnMgb2t9IHsKKwljb25zb2xlOjpkb25lICRjb25zICRvaworCWlmIHskb2t9IHsKKwkJc2V0IG1zZyBbbWMgIk1lcmdlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIl0KKwl9IGVsc2UgeworCQlzZXQgbXNnIFttYyAiTWVyZ2UgZmFpbGVkLiAgQ29uZmxpY3QgcmVzb2x1dGlvbiBpcyByZXF1aXJlZC4iXQorCX0KKwl1bmxvY2tfaW5kZXgKKwlyZXNjYW4gW2xpc3QgdWlfc3RhdHVzICRtc2ddCisJZGVsZXRlX3RoaXMKK30KKworY29uc3RydWN0b3IgZGlhbG9nIHt9IHsKKwlnbG9iYWwgY3VycmVudF9icmFuY2gKKwlnbG9iYWwgTTFCCisKKwlpZiB7IVtfY2FuX21lcmdlICR0aGlzXX0geworCQlkZWxldGVfdGhpcworCQlyZXR1cm4KKwl9CisKKwltYWtlX3RvcGxldmVsIHRvcCB3CisJd20gdGl0bGUgJHRvcCBbYXBwZW5kICJbYXBwbmFtZV0gKFtyZXBvbmFtZV0pOiAiIFttYyAiTWVyZ2UiXV0KKwlpZiB7JHRvcCBuZSB7Ln19IHsKKwkJd20gZ2VvbWV0cnkgJHRvcCAiK1t3aW5mbyByb290eCAuXStbd2luZm8gcm9vdHkgLl0iCisJfQorCisJc2V0IF9zdGFydCBbY2IgX3N0YXJ0XQorCisJbGFiZWwgJHcuaGVhZGVyIFwKKwkJLXRleHQgW21jICJNZXJnZSBJbnRvICVzIiAkY3VycmVudF9icmFuY2hdIFwKKwkJLWZvbnQgZm9udF91aWJvbGQKKwlwYWNrICR3LmhlYWRlciAtc2lkZSB0b3AgLWZpbGwgeAorCisJZnJhbWUgJHcuYnV0dG9ucworCWJ1dHRvbiAkdy5idXR0b25zLnZpc3VhbGl6ZSBcCisJCS10ZXh0IFttYyBWaXN1YWxpemVdIFwKKwkJLWNvbW1hbmQgW2NiIF92aXN1YWxpemVdCisJcGFjayAkdy5idXR0b25zLnZpc3VhbGl6ZSAtc2lkZSBsZWZ0CisJYnV0dG9uICR3LmJ1dHRvbnMubWVyZ2UgXAorCQktdGV4dCBbbWMgTWVyZ2VdIFwKKwkJLWNvbW1hbmQgJF9zdGFydAorCXBhY2sgJHcuYnV0dG9ucy5tZXJnZSAtc2lkZSByaWdodAorCWJ1dHRvbiAkdy5idXR0b25zLmNhbmNlbCBcCisJCS10ZXh0IFttYyAiQ2FuY2VsIl0gXAorCQktY29tbWFuZCBbY2IgX2NhbmNlbF0KKwlwYWNrICR3LmJ1dHRvbnMuY2FuY2VsIC1zaWRlIHJpZ2h0IC1wYWR4IDUKKwlwYWNrICR3LmJ1dHRvbnMgLXNpZGUgYm90dG9tIC1maWxsIHggLXBhZHkgMTAgLXBhZHggMTAKKworCXNldCB3X3JldiBbOjpjaG9vc2VfcmV2OjpuZXdfdW5tZXJnZWQgJHcucmV2IFttYyAiUmV2aXNpb24gVG8gTWVyZ2UiXV0KKwlwYWNrICR3LnJldiAtYW5jaG9yIG53IC1maWxsIGJvdGggLWV4cGFuZCAxIC1wYWR5IDUgLXBhZHggNQorCisJYmluZCAkdyA8JE0xQi1LZXktUmV0dXJuPiAkX3N0YXJ0CisJYmluZCAkdyA8S2V5LVJldHVybj4gJF9zdGFydAorCWJpbmQgJHcgPEtleS1Fc2NhcGU+IFtjYiBfY2FuY2VsXQorCXdtIHByb3RvY29sICR3IFdNX0RFTEVURV9XSU5ET1cgW2NiIF9jYW5jZWxdCisKKwliaW5kICR3LmJ1dHRvbnMubWVyZ2UgPFZpc2liaWxpdHk+IFtjYiBfdmlzaWJsZV0KKwl0a3dhaXQgd2luZG93ICR3Cit9CisKK21ldGhvZCBfdmlzaWJsZSB7fSB7CisJZ3JhYiAkdworCWlmIHtbaXNfY29uZmlnX3RydWUgZ3VpLm1hdGNodHJhY2tpbmdicmFuY2hdfSB7CisJCSR3X3JldiBwaWNrX3RyYWNraW5nX2JyYW5jaAorCX0KKwkkd19yZXYgZm9jdXNfZmlsdGVyCit9CisKK21ldGhvZCBfY2FuY2VsIHt9IHsKKwl3bSBwcm90b2NvbCAkdyBXTV9ERUxFVEVfV0lORE9XIHt9CisJdW5sb2NrX2luZGV4CisJZGVzdHJveSAkdworCWRlbGV0ZV90aGlzCit9CisKK30KKworbmFtZXNwYWNlIGV2YWwgbWVyZ2UgeworCitwcm9jIHJlc2V0X2hhcmQge30geworCWdsb2JhbCBIRUFEIGNvbW1pdF90eXBlIGZpbGVfc3RhdGVzCisKKwlpZiB7W3N0cmluZyBtYXRjaCBhbWVuZCogJGNvbW1pdF90eXBlXX0geworCQlpbmZvX3BvcHVwIFttYyAiQ2Fubm90IGFib3J0IHdoaWxlIGFtZW5kaW5nLgorCitZb3UgbXVzdCBmaW5pc2ggYW1lbmRpbmcgdGhpcyBjb21taXQuCisiXQorCQlyZXR1cm4KKwl9CisKKwlpZiB7IVtsb2NrX2luZGV4IGFib3J0XX0gcmV0dXJuCisKKwlpZiB7W3N0cmluZyBtYXRjaCAqbWVyZ2UqICRjb21taXRfdHlwZV19IHsKKwkJc2V0IG9wX3F1ZXN0aW9uIFttYyAiQWJvcnQgbWVyZ2U/CisKK0Fib3J0aW5nIHRoZSBjdXJyZW50IG1lcmdlIHdpbGwgY2F1c2UgKkFMTCogdW5jb21taXR0ZWQgY2hhbmdlcyB0byBiZSBsb3N0LgorCitDb250aW51ZSB3aXRoIGFib3J0aW5nIHRoZSBjdXJyZW50IG1lcmdlPyJdCisJfSBlbHNlIHsKKwkJc2V0IG9wX3F1ZXN0aW9uIFttYyAiUmVzZXQgY2hhbmdlcz8KKworUmVzZXR0aW5nIHRoZSBjaGFuZ2VzIHdpbGwgY2F1c2UgKkFMTCogdW5jb21taXR0ZWQgY2hhbmdlcyB0byBiZSBsb3N0LgorCitDb250aW51ZSB3aXRoIHJlc2V0dGluZyB0aGUgY3VycmVudCBjaGFuZ2VzPyJdCisJfQorCisJaWYge1thc2tfcG9wdXAgJG9wX3F1ZXN0aW9uXSBlcSB7eWVzfX0geworCQlzZXQgZmQgW2dpdF9yZWFkIC0tc3RkZXJyIHJlYWQtdHJlZSAtLXJlc2V0IC11IC12IEhFQURdCisJCWZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkKKwkJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbmFtZXNwYWNlIGNvZGUgW2xpc3QgX3Jlc2V0X3dhaXQgJGZkXV0KKwkJJDo6bWFpbl9zdGF0dXMgc3RhcnQgW21jICJBYm9ydGluZyJdIFttYyAiZmlsZXMgcmVzZXQiXQorCX0gZWxzZSB7CisJCXVubG9ja19pbmRleAorCX0KK30KKworcHJvYyBfcmVzZXRfd2FpdCB7ZmR9IHsKKwlnbG9iYWwgdWlfY29tbQorCisJJDo6bWFpbl9zdGF0dXMgdXBkYXRlX21ldGVyIFtyZWFkICRmZF0KKworCWZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAxCisJaWYge1tlb2YgJGZkXX0geworCQlzZXQgZmFpbCBbY2F0Y2gge2Nsb3NlICRmZH0gZXJyXQorCQkkOjptYWluX3N0YXR1cyBzdG9wCisJCXVubG9ja19pbmRleAorCisJCSR1aV9jb21tIGRlbGV0ZSAwLjAgZW5kCisJCSR1aV9jb21tIGVkaXQgbW9kaWZpZWQgZmFsc2UKKworCQljYXRjaCB7ZmlsZSBkZWxldGUgW2dpdGRpciBNRVJHRV9IRUFEXX0KKwkJY2F0Y2gge2ZpbGUgZGVsZXRlIFtnaXRkaXIgcnItY2FjaGUgTUVSR0VfUlJdfQorCQljYXRjaCB7ZmlsZSBkZWxldGUgW2dpdGRpciBTUVVBU0hfTVNHXX0KKwkJY2F0Y2gge2ZpbGUgZGVsZXRlIFtnaXRkaXIgTUVSR0VfTVNHXX0KKwkJY2F0Y2gge2ZpbGUgZGVsZXRlIFtnaXRkaXIgR0lUR1VJX01TR119CisKKwkJaWYgeyRmYWlsfSB7CisJCQl3YXJuX3BvcHVwICJbbWMgIkFib3J0IGZhaWxlZC4iXVxuXG4kZXJyIgorCQl9CisJCXJlc2NhbiB7dWlfc3RhdHVzIFttYyAiQWJvcnQgY29tcGxldGVkLiAgUmVhZHkuIl19CisJfSBlbHNlIHsKKwkJZmNvbmZpZ3VyZSAkZmQgLWJsb2NraW5nIDAKKwl9Cit9CisKK30KZGlmZiAtLWdpdCBhL2dpdC1ndWkvbGliL29wdGlvbi50Y2wgYi9naXQtZ3VpL2xpYi9vcHRpb24udGNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNzA1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtZ3VpL2xpYi9vcHRpb24udGNsCkBAIC0wLDAgKzEsMjc5IEBACisjIGdpdC1ndWkgb3B0aW9ucyBlZGl0b3IKKyMgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IFNoYXduIFBlYXJjZQorCitwcm9jIHNhdmVfY29uZmlnIHt9IHsKKwlnbG9iYWwgZGVmYXVsdF9jb25maWcgZm9udF9kZXNjcworCWdsb2JhbCByZXBvX2NvbmZpZyBnbG9iYWxfY29uZmlnCisJZ2xvYmFsIHJlcG9fY29uZmlnX25ldyBnbG9iYWxfY29uZmlnX25ldworCWdsb2JhbCB1aV9jb21tX3NwZWxsCisKKwlmb3JlYWNoIG9wdGlvbiAkZm9udF9kZXNjcyB7CisJCXNldCBuYW1lIFtsaW5kZXggJG9wdGlvbiAwXQorCQlzZXQgZm9udCBbbGluZGV4ICRvcHRpb24gMV0KKwkJZm9udCBjb25maWd1cmUgJGZvbnQgXAorCQkJLWZhbWlseSAkZ2xvYmFsX2NvbmZpZ19uZXcoZ3VpLiRmb250Xl5mYW1pbHkpIFwKKwkJCS1zaXplICRnbG9iYWxfY29uZmlnX25ldyhndWkuJGZvbnReXnNpemUpCisJCWZvbnQgY29uZmlndXJlICR7Zm9udH1ib2xkIFwKKwkJCS1mYW1pbHkgJGdsb2JhbF9jb25maWdfbmV3KGd1aS4kZm9udF5eZmFtaWx5KSBcCisJCQktc2l6ZSAkZ2xvYmFsX2NvbmZpZ19uZXcoZ3VpLiRmb250Xl5zaXplKQorCQlmb250IGNvbmZpZ3VyZSAke2ZvbnR9aXRhbGljIFwKKwkJCS1mYW1pbHkgJGdsb2JhbF9jb25maWdfbmV3KGd1aS4kZm9udF5eZmFtaWx5KSBcCisJCQktc2l6ZSAkZ2xvYmFsX2NvbmZpZ19uZXcoZ3VpLiRmb250Xl5zaXplKQorCQlzZXQgZ2xvYmFsX2NvbmZpZ19uZXcoZ3VpLiRuYW1lKSBbZm9udCBjb25maWd1cmUgJGZvbnRdCisJCXVuc2V0IGdsb2JhbF9jb25maWdfbmV3KGd1aS4kZm9udF5eZmFtaWx5KQorCQl1bnNldCBnbG9iYWxfY29uZmlnX25ldyhndWkuJGZvbnReXnNpemUpCisJfQorCisJZm9yZWFjaCBuYW1lIFthcnJheSBuYW1lcyBkZWZhdWx0X2NvbmZpZ10geworCQlzZXQgdmFsdWUgJGdsb2JhbF9jb25maWdfbmV3KCRuYW1lKQorCQlpZiB7JHZhbHVlIG5lICRnbG9iYWxfY29uZmlnKCRuYW1lKX0geworCQkJaWYgeyR2YWx1ZSBlcSAkZGVmYXVsdF9jb25maWcoJG5hbWUpfSB7CisJCQkJY2F0Y2gge2dpdCBjb25maWcgLS1nbG9iYWwgLS11bnNldCAkbmFtZX0KKwkJCX0gZWxzZSB7CisJCQkJcmVnc3ViIC1hbGwgIlxbe31cXSIgJHZhbHVlIHsifSB2YWx1ZQorCQkJCWdpdCBjb25maWcgLS1nbG9iYWwgJG5hbWUgJHZhbHVlCisJCQl9CisJCQlzZXQgZ2xvYmFsX2NvbmZpZygkbmFtZSkgJHZhbHVlCisJCQlpZiB7JHZhbHVlIGVxICRyZXBvX2NvbmZpZygkbmFtZSl9IHsKKwkJCQljYXRjaCB7Z2l0IGNvbmZpZyAtLXVuc2V0ICRuYW1lfQorCQkJCXNldCByZXBvX2NvbmZpZygkbmFtZSkgJHZhbHVlCisJCQl9CisJCX0KKwl9CisKKwlmb3JlYWNoIG5hbWUgW2FycmF5IG5hbWVzIGRlZmF1bHRfY29uZmlnXSB7CisJCXNldCB2YWx1ZSAkcmVwb19jb25maWdfbmV3KCRuYW1lKQorCQlpZiB7JHZhbHVlIG5lICRyZXBvX2NvbmZpZygkbmFtZSl9IHsKKwkJCWlmIHskdmFsdWUgZXEgJGdsb2JhbF9jb25maWcoJG5hbWUpfSB7CisJCQkJY2F0Y2gge2dpdCBjb25maWcgLS11bnNldCAkbmFtZX0KKwkJCX0gZWxzZSB7CisJCQkJcmVnc3ViIC1hbGwgIlxbe31cXSIgJHZhbHVlIHsifSB2YWx1ZQorCQkJCWdpdCBjb25maWcgJG5hbWUgJHZhbHVlCisJCQl9CisJCQlzZXQgcmVwb19jb25maWcoJG5hbWUpICR2YWx1ZQorCQl9CisJfQorCisJaWYge1tpbmZvIGV4aXN0cyByZXBvX2NvbmZpZyhndWkuc3BlbGxpbmdkaWN0aW9uYXJ5KV19IHsKKwkJc2V0IHZhbHVlICRyZXBvX2NvbmZpZyhndWkuc3BlbGxpbmdkaWN0aW9uYXJ5KQorCQlpZiB7JHZhbHVlIGVxIHtub25lfX0geworCQkJaWYge1tpbmZvIGV4aXN0cyB1aV9jb21tX3NwZWxsXX0geworCQkJCSR1aV9jb21tX3NwZWxsIHN0b3AKKwkJCX0KKwkJfSBlbHNlaWYge1tpbmZvIGV4aXN0cyB1aV9jb21tX3NwZWxsXX0geworCQkJJHVpX2NvbW1fc3BlbGwgbGFuZyAkdmFsdWUKKwkJfQorCX0KK30KKworcHJvYyBkb19vcHRpb25zIHt9IHsKKwlnbG9iYWwgcmVwb19jb25maWcgZ2xvYmFsX2NvbmZpZyBmb250X2Rlc2NzCisJZ2xvYmFsIHJlcG9fY29uZmlnX25ldyBnbG9iYWxfY29uZmlnX25ldworCWdsb2JhbCB1aV9jb21tX3NwZWxsCisKKwlhcnJheSB1bnNldCByZXBvX2NvbmZpZ19uZXcKKwlhcnJheSB1bnNldCBnbG9iYWxfY29uZmlnX25ldworCWZvcmVhY2ggbmFtZSBbYXJyYXkgbmFtZXMgcmVwb19jb25maWddIHsKKwkJc2V0IHJlcG9fY29uZmlnX25ldygkbmFtZSkgJHJlcG9fY29uZmlnKCRuYW1lKQorCX0KKwlsb2FkX2NvbmZpZyAxCisJZm9yZWFjaCBuYW1lIFthcnJheSBuYW1lcyByZXBvX2NvbmZpZ10geworCQlzd2l0Y2ggLS0gJG5hbWUgeworCQlndWkuZGlmZmNvbnRleHQge2NvbnRpbnVlfQorCQl9CisJCXNldCByZXBvX2NvbmZpZ19uZXcoJG5hbWUpICRyZXBvX2NvbmZpZygkbmFtZSkKKwl9CisJZm9yZWFjaCBuYW1lIFthcnJheSBuYW1lcyBnbG9iYWxfY29uZmlnXSB7CisJCXNldCBnbG9iYWxfY29uZmlnX25ldygkbmFtZSkgJGdsb2JhbF9jb25maWcoJG5hbWUpCisJfQorCisJc2V0IHcgLm9wdGlvbnNfZWRpdG9yCisJdG9wbGV2ZWwgJHcKKwl3bSBnZW9tZXRyeSAkdyAiK1t3aW5mbyByb290eCAuXStbd2luZm8gcm9vdHkgLl0iCisKKwlmcmFtZSAkdy5idXR0b25zCisJYnV0dG9uICR3LmJ1dHRvbnMucmVzdG9yZSAtdGV4dCBbbWMgIlJlc3RvcmUgRGVmYXVsdHMiXSBcCisJCS1kZWZhdWx0IG5vcm1hbCBcCisJCS1jb21tYW5kIGRvX3Jlc3RvcmVfZGVmYXVsdHMKKwlwYWNrICR3LmJ1dHRvbnMucmVzdG9yZSAtc2lkZSBsZWZ0CisJYnV0dG9uICR3LmJ1dHRvbnMuc2F2ZSAtdGV4dCBbbWMgU2F2ZV0gXAorCQktZGVmYXVsdCBhY3RpdmUgXAorCQktY29tbWFuZCBbbGlzdCBkb19zYXZlX2NvbmZpZyAkd10KKwlwYWNrICR3LmJ1dHRvbnMuc2F2ZSAtc2lkZSByaWdodAorCWJ1dHRvbiAkdy5idXR0b25zLmNhbmNlbCAtdGV4dCBbbWMgIkNhbmNlbCJdIFwKKwkJLWRlZmF1bHQgbm9ybWFsIFwKKwkJLWNvbW1hbmQgW2xpc3QgZGVzdHJveSAkd10KKwlwYWNrICR3LmJ1dHRvbnMuY2FuY2VsIC1zaWRlIHJpZ2h0IC1wYWR4IDUKKwlwYWNrICR3LmJ1dHRvbnMgLXNpZGUgYm90dG9tIC1maWxsIHggLXBhZHkgMTAgLXBhZHggMTAKKworCWxhYmVsZnJhbWUgJHcucmVwbyAtdGV4dCBbbWMgIiVzIFJlcG9zaXRvcnkiIFtyZXBvbmFtZV1dCisJbGFiZWxmcmFtZSAkdy5nbG9iYWwgLXRleHQgW21jICJHbG9iYWwgKEFsbCBSZXBvc2l0b3JpZXMpIl0KKwlwYWNrICR3LnJlcG8gLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMSAtcGFkeSA1IC1wYWR4IDUKKwlwYWNrICR3Lmdsb2JhbCAtc2lkZSByaWdodCAtZmlsbCBib3RoIC1leHBhbmQgMSAtcGFkeSA1IC1wYWR4IDUKKworCXNldCBvcHRpZCAwCisJZm9yZWFjaCBvcHRpb24geworCQl7dCB1c2VyLm5hbWUge21jICJVc2VyIE5hbWUifX0KKwkJe3QgdXNlci5lbWFpbCB7bWMgIkVtYWlsIEFkZHJlc3MifX0KKworCQl7YiBtZXJnZS5zdW1tYXJ5IHttYyAiU3VtbWFyaXplIE1lcmdlIENvbW1pdHMifX0KKwkJe2ktMS4uNSBtZXJnZS52ZXJib3NpdHkge21jICJNZXJnZSBWZXJib3NpdHkifX0KKwkJe2IgbWVyZ2UuZGlmZnN0YXQge21jICJTaG93IERpZmZzdGF0IEFmdGVyIE1lcmdlIn19CisKKwkJe2IgZ3VpLnRydXN0bXRpbWUgIHttYyAiVHJ1c3QgRmlsZSBNb2RpZmljYXRpb24gVGltZXN0YW1wcyJ9fQorCQl7YiBndWkucHJ1bmVkdXJpbmdmZXRjaCB7bWMgIlBydW5lIFRyYWNraW5nIEJyYW5jaGVzIER1cmluZyBGZXRjaCJ9fQorCQl7YiBndWkubWF0Y2h0cmFja2luZ2JyYW5jaCB7bWMgIk1hdGNoIFRyYWNraW5nIEJyYW5jaGVzIn19CisJCXtpLTAuLjk5IGd1aS5kaWZmY29udGV4dCB7bWMgIk51bWJlciBvZiBEaWZmIENvbnRleHQgTGluZXMifX0KKwkJe2ktMC4uOTkgZ3VpLmNvbW1pdG1zZ3dpZHRoIHttYyAiQ29tbWl0IE1lc3NhZ2UgVGV4dCBXaWR0aCJ9fQorCQl7dCBndWkubmV3YnJhbmNodGVtcGxhdGUge21jICJOZXcgQnJhbmNoIE5hbWUgVGVtcGxhdGUifX0KKwkJfSB7CisJCXNldCB0eXBlIFtsaW5kZXggJG9wdGlvbiAwXQorCQlzZXQgbmFtZSBbbGluZGV4ICRvcHRpb24gMV0KKwkJc2V0IHRleHQgW2V2YWwgW2xpbmRleCAkb3B0aW9uIDJdXQorCQlpbmNyIG9wdGlkCisJCWZvcmVhY2ggZiB7cmVwbyBnbG9iYWx9IHsKKwkJCXN3aXRjaCAtZ2xvYiAtLSAkdHlwZSB7CisJCQliIHsKKwkJCQljaGVja2J1dHRvbiAkdy4kZi4kb3B0aWQgLXRleHQgJHRleHQgXAorCQkJCQktdmFyaWFibGUgJHtmfV9jb25maWdfbmV3KCRuYW1lKSBcCisJCQkJCS1vbnZhbHVlIHRydWUgXAorCQkJCQktb2ZmdmFsdWUgZmFsc2UKKwkJCQlwYWNrICR3LiRmLiRvcHRpZCAtc2lkZSB0b3AgLWFuY2hvciB3CisJCQl9CisJCQlpLSogeworCQkJCXJlZ2V4cCAtLSB7LShcZCspXC5cLihcZCspJH0gJHR5cGUgX2p1bmsgbWluIG1heAorCQkJCWZyYW1lICR3LiRmLiRvcHRpZAorCQkJCWxhYmVsICR3LiRmLiRvcHRpZC5sIC10ZXh0ICIkdGV4dDoiCisJCQkJcGFjayAkdy4kZi4kb3B0aWQubCAtc2lkZSBsZWZ0IC1hbmNob3IgdyAtZmlsbCB4CisJCQkJc3BpbmJveCAkdy4kZi4kb3B0aWQudiBcCisJCQkJCS10ZXh0dmFyaWFibGUgJHtmfV9jb25maWdfbmV3KCRuYW1lKSBcCisJCQkJCS1mcm9tICRtaW4gXAorCQkJCQktdG8gJG1heCBcCisJCQkJCS1pbmNyZW1lbnQgMSBcCisJCQkJCS13aWR0aCBbZXhwciB7MSArIFtzdHJpbmcgbGVuZ3RoICRtYXhdfV0KKwkJCQliaW5kICR3LiRmLiRvcHRpZC52IDxGb2N1c0luPiB7JVcgc2VsZWN0aW9uIHJhbmdlIDAgZW5kfQorCQkJCXBhY2sgJHcuJGYuJG9wdGlkLnYgLXNpZGUgcmlnaHQgLWFuY2hvciBlIC1wYWR4IDUKKwkJCQlwYWNrICR3LiRmLiRvcHRpZCAtc2lkZSB0b3AgLWFuY2hvciB3IC1maWxsIHgKKwkJCX0KKwkJCXQgeworCQkJCWZyYW1lICR3LiRmLiRvcHRpZAorCQkJCWxhYmVsICR3LiRmLiRvcHRpZC5sIC10ZXh0ICIkdGV4dDoiCisJCQkJZW50cnkgJHcuJGYuJG9wdGlkLnYgXAorCQkJCQktYm9yZGVyd2lkdGggMSBcCisJCQkJCS1yZWxpZWYgc3Vua2VuIFwKKwkJCQkJLXdpZHRoIDIwIFwKKwkJCQkJLXRleHR2YXJpYWJsZSAke2Z9X2NvbmZpZ19uZXcoJG5hbWUpCisJCQkJcGFjayAkdy4kZi4kb3B0aWQubCAtc2lkZSBsZWZ0IC1hbmNob3IgdworCQkJCXBhY2sgJHcuJGYuJG9wdGlkLnYgLXNpZGUgbGVmdCAtYW5jaG9yIHcgXAorCQkJCQktZmlsbCB4IC1leHBhbmQgMSBcCisJCQkJCS1wYWR4IDUKKwkJCQlwYWNrICR3LiRmLiRvcHRpZCAtc2lkZSB0b3AgLWFuY2hvciB3IC1maWxsIHgKKwkJCX0KKwkJCX0KKwkJfQorCX0KKworCXNldCBhbGxfZGljdHMgW2xpbnNlcnQgXAorCQlbc3BlbGxjaGVjazo6YXZhaWxhYmxlX2xhbmdzXSBcCisJCTAgXAorCQlub25lXQorCWluY3Igb3B0aWQKKwlmb3JlYWNoIGYge3JlcG8gZ2xvYmFsfSB7CisJCWlmIHshW2luZm8gZXhpc3RzICR7Zn1fY29uZmlnX25ldyhndWkuc3BlbGxpbmdkaWN0aW9uYXJ5KV19IHsKKwkJCWlmIHtbaW5mbyBleGlzdHMgdWlfY29tbV9zcGVsbF19IHsKKwkJCQlzZXQgdmFsdWUgWyR1aV9jb21tX3NwZWxsIGxhbmddCisJCQl9IGVsc2UgeworCQkJCXNldCB2YWx1ZSBub25lCisJCQl9CisJCQlzZXQgJHtmfV9jb25maWdfbmV3KGd1aS5zcGVsbGluZ2RpY3Rpb25hcnkpICR2YWx1ZQorCQl9CisKKwkJZnJhbWUgJHcuJGYuJG9wdGlkCisJCWxhYmVsICR3LiRmLiRvcHRpZC5sIC10ZXh0IFttYyAiU3BlbGxpbmcgRGljdGlvbmFyeToiXQorCQlldmFsIHRrX29wdGlvbk1lbnUgJHcuJGYuJG9wdGlkLnYgXAorCQkJJHtmfV9jb25maWdfbmV3KGd1aS5zcGVsbGluZ2RpY3Rpb25hcnkpIFwKKwkJCSRhbGxfZGljdHMKKwkJcGFjayAkdy4kZi4kb3B0aWQubCAtc2lkZSBsZWZ0IC1hbmNob3IgdyAtZmlsbCB4CisJCXBhY2sgJHcuJGYuJG9wdGlkLnYgLXNpZGUgcmlnaHQgLWFuY2hvciBlIC1wYWR4IDUKKwkJcGFjayAkdy4kZi4kb3B0aWQgLXNpZGUgdG9wIC1hbmNob3IgdyAtZmlsbCB4CisJfQorCXVuc2V0IGFsbF9kaWN0cworCisJc2V0IGFsbF9mb250cyBbbHNvcnQgW2ZvbnQgZmFtaWxpZXNdXQorCWZvcmVhY2ggb3B0aW9uICRmb250X2Rlc2NzIHsKKwkJc2V0IG5hbWUgW2xpbmRleCAkb3B0aW9uIDBdCisJCXNldCBmb250IFtsaW5kZXggJG9wdGlvbiAxXQorCQlzZXQgdGV4dCBbZXZhbCBbbGluZGV4ICRvcHRpb24gMl1dCisKKwkJc2V0IGdsb2JhbF9jb25maWdfbmV3KGd1aS4kZm9udF5eZmFtaWx5KSBcCisJCQlbZm9udCBjb25maWd1cmUgJGZvbnQgLWZhbWlseV0KKwkJc2V0IGdsb2JhbF9jb25maWdfbmV3KGd1aS4kZm9udF5ec2l6ZSkgXAorCQkJW2ZvbnQgY29uZmlndXJlICRmb250IC1zaXplXQorCisJCWZyYW1lICR3Lmdsb2JhbC4kbmFtZQorCQlsYWJlbCAkdy5nbG9iYWwuJG5hbWUubCAtdGV4dCAiJHRleHQ6IgorCQlidXR0b24gJHcuZ2xvYmFsLiRuYW1lLmIgXAorCQkJLXRleHQgW21jICJDaGFuZ2UgRm9udCJdIFwKKwkJCS1jb21tYW5kIFtsaXN0IFwKKwkJCQljaG9vc2VfZm9udDo6cGljayBcCisJCQkJJHcgXAorCQkJCVttYyAiQ2hvb3NlICVzIiAkdGV4dF0gXAorCQkJCWdsb2JhbF9jb25maWdfbmV3KGd1aS4kZm9udF5eZmFtaWx5KSBcCisJCQkJZ2xvYmFsX2NvbmZpZ19uZXcoZ3VpLiRmb250Xl5zaXplKSBcCisJCQkJXQorCQlsYWJlbCAkdy5nbG9iYWwuJG5hbWUuZiAtdGV4dHZhcmlhYmxlIGdsb2JhbF9jb25maWdfbmV3KGd1aS4kZm9udF5eZmFtaWx5KQorCQlsYWJlbCAkdy5nbG9iYWwuJG5hbWUucyAtdGV4dHZhcmlhYmxlIGdsb2JhbF9jb25maWdfbmV3KGd1aS4kZm9udF5ec2l6ZSkKKwkJbGFiZWwgJHcuZ2xvYmFsLiRuYW1lLnB0IC10ZXh0IFttYyAicHQuIl0KKwkJcGFjayAkdy5nbG9iYWwuJG5hbWUubCAtc2lkZSBsZWZ0IC1hbmNob3IgdworCQlwYWNrICR3Lmdsb2JhbC4kbmFtZS5iIC1zaWRlIHJpZ2h0IC1hbmNob3IgZQorCQlwYWNrICR3Lmdsb2JhbC4kbmFtZS5wdCAtc2lkZSByaWdodCAtYW5jaG9yIHcKKwkJcGFjayAkdy5nbG9iYWwuJG5hbWUucyAtc2lkZSByaWdodCAtYW5jaG9yIHcKKwkJcGFjayAkdy5nbG9iYWwuJG5hbWUuZiAtc2lkZSByaWdodCAtYW5jaG9yIHcKKwkJcGFjayAkdy5nbG9iYWwuJG5hbWUgLXNpZGUgdG9wIC1hbmNob3IgdyAtZmlsbCB4CisJfQorCisJYmluZCAkdyA8VmlzaWJpbGl0eT4gImdyYWIgJHc7IGZvY3VzICR3LmJ1dHRvbnMuc2F2ZSIKKwliaW5kICR3IDxLZXktRXNjYXBlPiAiZGVzdHJveSAkdyIKKwliaW5kICR3IDxLZXktUmV0dXJuPiBbbGlzdCBkb19zYXZlX2NvbmZpZyAkd10KKworCWlmIHtbaXNfTWFjT1NYXX0geworCQlzZXQgdCBbbWMgIlByZWZlcmVuY2VzIl0KKwl9IGVsc2UgeworCQlzZXQgdCBbbWMgIk9wdGlvbnMiXQorCX0KKwl3bSB0aXRsZSAkdyAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogJHQiCisJdGt3YWl0IHdpbmRvdyAkdworfQorCitwcm9jIGRvX3Jlc3RvcmVfZGVmYXVsdHMge30geworCWdsb2JhbCBmb250X2Rlc2NzIGRlZmF1bHRfY29uZmlnIHJlcG9fY29uZmlnCisJZ2xvYmFsIHJlcG9fY29uZmlnX25ldyBnbG9iYWxfY29uZmlnX25ldworCisJZm9yZWFjaCBuYW1lIFthcnJheSBuYW1lcyBkZWZhdWx0X2NvbmZpZ10geworCQlzZXQgcmVwb19jb25maWdfbmV3KCRuYW1lKSAkZGVmYXVsdF9jb25maWcoJG5hbWUpCisJCXNldCBnbG9iYWxfY29uZmlnX25ldygkbmFtZSkgJGRlZmF1bHRfY29uZmlnKCRuYW1lKQorCX0KKworCWZvcmVhY2ggb3B0aW9uICRmb250X2Rlc2NzIHsKKwkJc2V0IG5hbWUgW2xpbmRleCAkb3B0aW9uIDBdCisJCXNldCByZXBvX2NvbmZpZyhndWkuJG5hbWUpICRkZWZhdWx0X2NvbmZpZyhndWkuJG5hbWUpCisJfQorCWFwcGx5X2NvbmZpZworCisJZm9yZWFjaCBvcHRpb24gJGZvbnRfZGVzY3MgeworCQlzZXQgbmFtZSBbbGluZGV4ICRvcHRpb24gMF0KKwkJc2V0IGZvbnQgW2xpbmRleCAkb3B0aW9uIDFdCisJCXNldCBnbG9iYWxfY29uZmlnX25ldyhndWkuJGZvbnReXmZhbWlseSkgXAorCQkJW2ZvbnQgY29uZmlndXJlICRmb250IC1mYW1pbHldCisJCXNldCBnbG9iYWxfY29uZmlnX25ldyhndWkuJGZvbnReXnNpemUpIFwKKwkJCVtmb250IGNvbmZpZ3VyZSAkZm9udCAtc2l6ZV0KKwl9Cit9CisKK3Byb2MgZG9fc2F2ZV9jb25maWcge3d9IHsKKwlpZiB7W2NhdGNoIHtzYXZlX2NvbmZpZ30gZXJyXX0geworCQllcnJvcl9wb3B1cCBbc3RyY2F0IFttYyAiRmFpbGVkIHRvIGNvbXBsZXRlbHkgc2F2ZSBvcHRpb25zOiJdICJcblxuJGVyciJdCisJfQorCXJlc2hvd19kaWZmCisJZGVzdHJveSAkdworfQpkaWZmIC0tZ2l0IGEvZ2l0LWd1aS9saWIvcmVtb3RlLnRjbCBiL2dpdC1ndWkvbGliL3JlbW90ZS50Y2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4NmRkYQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvbGliL3JlbW90ZS50Y2wKQEAgLTAsMCArMSwyMjIgQEAKKyMgZ2l0LWd1aSByZW1vdGUgbWFuYWdlbWVudAorIyBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgU2hhd24gUGVhcmNlCisKK3NldCBzb21lX2hlYWRzX3RyYWNraW5nIDA7ICAjIGFzc3VtZSBub3QKKworcHJvYyBpc190cmFja2luZ19icmFuY2gge25hbWV9IHsKKwlnbG9iYWwgdHJhY2tpbmdfYnJhbmNoZXMKKwlmb3JlYWNoIHNwZWMgJHRyYWNraW5nX2JyYW5jaGVzIHsKKwkJc2V0IHQgW2xpbmRleCAkc3BlYyAwXQorCQlpZiB7JHQgZXEgJG5hbWUgfHwgW3N0cmluZyBtYXRjaCAkdCAkbmFtZV19IHsKKwkJCXJldHVybiAxCisJCX0KKwl9CisJcmV0dXJuIDAKK30KKworcHJvYyBhbGxfdHJhY2tpbmdfYnJhbmNoZXMge30geworCWdsb2JhbCB0cmFja2luZ19icmFuY2hlcworCisJc2V0IGFsbCBbbGlzdF0KKwlzZXQgcGF0IFtsaXN0XQorCXNldCBjbWQgW2xpc3RdCisKKwlmb3JlYWNoIHNwZWMgJHRyYWNraW5nX2JyYW5jaGVzIHsKKwkJc2V0IGRzdCBbbGluZGV4ICRzcGVjIDBdCisJCWlmIHtbc3RyaW5nIHJhbmdlICRkc3QgZW5kLTEgZW5kXSBlcSB7Lyp9fSB7CisJCQlsYXBwZW5kIHBhdCAkc3BlYworCQkJbGFwcGVuZCBjbWQgW3N0cmluZyByYW5nZSAkZHN0IDAgZW5kLTJdCisJCX0gZWxzZSB7CisJCQlsYXBwZW5kIGFsbCAkc3BlYworCQl9CisJfQorCisJaWYgeyRwYXQgbmUge319IHsKKwkJc2V0IGZkIFtldmFsIGdpdF9yZWFkIGZvci1lYWNoLXJlZiAtLWZvcm1hdD0lKHJlZm5hbWUpICRjbWRdCisJCXdoaWxlIHtbZ2V0cyAkZmQgbl0gPiAwfSB7CisJCQlmb3JlYWNoIHNwZWMgJHBhdCB7CisJCQkJc2V0IGRzdCBbc3RyaW5nIHJhbmdlIFtsaW5kZXggJHNwZWMgMF0gMCBlbmQtMl0KKwkJCQlzZXQgbGVuIFtzdHJpbmcgbGVuZ3RoICRkc3RdCisJCQkJaWYge1tzdHJpbmcgZXF1YWwgLWxlbmd0aCAkbGVuICRkc3QgJG5dfSB7CisJCQkJCXNldCBzcmMgW3N0cmluZyByYW5nZSBbbGluZGV4ICRzcGVjIDJdIDAgZW5kLTJdCisJCQkJCXNldCBzcGVjIFtsaXN0IFwKKwkJCQkJCSRuIFwKKwkJCQkJCVtsaW5kZXggJHNwZWMgMV0gXAorCQkJCQkJJHNyY1tzdHJpbmcgcmFuZ2UgJG4gJGxlbiBlbmRdIFwKKwkJCQkJCV0KKwkJCQkJbGFwcGVuZCBhbGwgJHNwZWMKKwkJCQl9CisJCQl9CisJCX0KKwkJY2xvc2UgJGZkCisJfQorCisJcmV0dXJuIFtsc29ydCAtaW5kZXggMCAtdW5pcXVlICRhbGxdCit9CisKK3Byb2MgbG9hZF9hbGxfcmVtb3RlcyB7fSB7CisJZ2xvYmFsIHJlcG9fY29uZmlnCisJZ2xvYmFsIGFsbF9yZW1vdGVzIHRyYWNraW5nX2JyYW5jaGVzIHNvbWVfaGVhZHNfdHJhY2tpbmcKKwlnbG9iYWwgcmVtb3RlX3VybAorCisJc2V0IHNvbWVfaGVhZHNfdHJhY2tpbmcgMAorCXNldCBhbGxfcmVtb3RlcyBbbGlzdF0KKwlzZXQgdHJjayBbbGlzdF0KKworCXNldCByaF9zdHIgcmVmcy9oZWFkcy8KKwlzZXQgcmhfbGVuIFtzdHJpbmcgbGVuZ3RoICRyaF9zdHJdCisJc2V0IHJtX2RpciBbZ2l0ZGlyIHJlbW90ZXNdCisJaWYge1tmaWxlIGlzZGlyZWN0b3J5ICRybV9kaXJdfSB7CisJCXNldCBhbGxfcmVtb3RlcyBbZ2xvYiBcCisJCQktdHlwZXMgZiBcCisJCQktdGFpbHMgXAorCQkJLW5vY29tcGxhaW4gXAorCQkJLWRpcmVjdG9yeSAkcm1fZGlyICpdCisKKwkJZm9yZWFjaCBuYW1lICRhbGxfcmVtb3RlcyB7CisJCQljYXRjaCB7CisJCQkJc2V0IGZkIFtvcGVuIFtmaWxlIGpvaW4gJHJtX2RpciAkbmFtZV0gcl0KKwkJCQl3aGlsZSB7W2dldHMgJGZkIGxpbmVdID49IDB9IHsKKwkJCQkJaWYge1tyZWdleHAge15VUkw6WyAJXSooLispJH0gJGxpbmUgbGluZSB1cmxdfSB7CisJCQkJCQlzZXQgcmVtb3RlX3VybCgkbmFtZSkgJHVybAorCQkJCQkJY29udGludWUKKwkJCQkJfQorCQkJCQlpZiB7IVtyZWdleHAge15QdWxsOlsgCV0qKFteOl0rKTooLispJH0gXAorCQkJCQkJJGxpbmUgbGluZSBzcmMgZHN0XX0gY29udGludWUKKwkJCQkJaWYge1tzdHJpbmcgaW5kZXggJHNyYyAwXSBlcSB7K319IHsKKwkJCQkJCXNldCBzcmMgW3N0cmluZyByYW5nZSAkc3JjIDEgZW5kXQorCQkJCQl9CisJCQkJCWlmIHshW3N0cmluZyBlcXVhbCAtbGVuZ3RoIDUgcmVmcy8gJHNyY119IHsKKwkJCQkJCXNldCBzcmMgJHJoX3N0ciRzcmMKKwkJCQkJfQorCQkJCQlpZiB7IVtzdHJpbmcgZXF1YWwgLWxlbmd0aCA1IHJlZnMvICRkc3RdfSB7CisJCQkJCQlzZXQgZHN0ICRyaF9zdHIkZHN0CisJCQkJCX0KKwkJCQkJaWYge1tzdHJpbmcgZXF1YWwgLWxlbmd0aCAkcmhfbGVuICRyaF9zdHIgJGRzdF19IHsKKwkJCQkJCXNldCBzb21lX2hlYWRzX3RyYWNraW5nIDEKKwkJCQkJfQorCQkJCQlsYXBwZW5kIHRyY2sgW2xpc3QgJGRzdCAkbmFtZSAkc3JjXQorCQkJCX0KKwkJCQljbG9zZSAkZmQKKwkJCX0KKwkJfQorCX0KKworCWZvcmVhY2ggbGluZSBbYXJyYXkgbmFtZXMgcmVwb19jb25maWcgcmVtb3RlLioudXJsXSB7CisJCWlmIHshW3JlZ2V4cCBecmVtb3RlXC4oLiopXC51cmxcJCAkbGluZSBsaW5lIG5hbWVdfSBjb250aW51ZQorCQlsYXBwZW5kIGFsbF9yZW1vdGVzICRuYW1lCisJCXNldCByZW1vdGVfdXJsKCRuYW1lKSAkcmVwb19jb25maWcocmVtb3RlLiRuYW1lLnVybCkKKworCQlpZiB7W2NhdGNoIHtzZXQgZmwgJHJlcG9fY29uZmlnKHJlbW90ZS4kbmFtZS5mZXRjaCl9XX0geworCQkJc2V0IGZsIHt9CisJCX0KKwkJZm9yZWFjaCBsaW5lICRmbCB7CisJCQlpZiB7IVtyZWdleHAge14oW146XSspOiguKykkfSAkbGluZSBsaW5lIHNyYyBkc3RdfSBjb250aW51ZQorCQkJaWYge1tzdHJpbmcgaW5kZXggJHNyYyAwXSBlcSB7K319IHsKKwkJCQlzZXQgc3JjIFtzdHJpbmcgcmFuZ2UgJHNyYyAxIGVuZF0KKwkJCX0KKwkJCWlmIHshW3N0cmluZyBlcXVhbCAtbGVuZ3RoIDUgcmVmcy8gJHNyY119IHsKKwkJCQlzZXQgc3JjICRyaF9zdHIkc3JjCisJCQl9CisJCQlpZiB7IVtzdHJpbmcgZXF1YWwgLWxlbmd0aCA1IHJlZnMvICRkc3RdfSB7CisJCQkJc2V0IGRzdCAkcmhfc3RyJGRzdAorCQkJfQorCQkJaWYge1tzdHJpbmcgZXF1YWwgLWxlbmd0aCAkcmhfbGVuICRyaF9zdHIgJGRzdF19IHsKKwkJCQlzZXQgc29tZV9oZWFkc190cmFja2luZyAxCisJCQl9CisJCQlsYXBwZW5kIHRyY2sgW2xpc3QgJGRzdCAkbmFtZSAkc3JjXQorCQl9CisJfQorCisJc2V0IHRyYWNraW5nX2JyYW5jaGVzIFtsc29ydCAtaW5kZXggMCAtdW5pcXVlICR0cmNrXQorCXNldCBhbGxfcmVtb3RlcyBbbHNvcnQgLXVuaXF1ZSAkYWxsX3JlbW90ZXNdCit9CisKK3Byb2MgcG9wdWxhdGVfZmV0Y2hfbWVudSB7fSB7CisJZ2xvYmFsIGFsbF9yZW1vdGVzIHJlcG9fY29uZmlnCisKKwlzZXQgcmVtb3RlX20gLm1iYXIucmVtb3RlCisJc2V0IGZldGNoX20gJHJlbW90ZV9tLmZldGNoCisJc2V0IHBydW5lX20gJHJlbW90ZV9tLnBydW5lCisKKwlmb3JlYWNoIHIgJGFsbF9yZW1vdGVzIHsKKwkJc2V0IGVuYWJsZSAwCisJCWlmIHshW2NhdGNoIHtzZXQgYSAkcmVwb19jb25maWcocmVtb3RlLiRyLnVybCl9XX0geworCQkJaWYgeyFbY2F0Y2gge3NldCBhICRyZXBvX2NvbmZpZyhyZW1vdGUuJHIuZmV0Y2gpfV19IHsKKwkJCQlzZXQgZW5hYmxlIDEKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNhdGNoIHsKKwkJCQlzZXQgZmQgW29wZW4gW2dpdGRpciByZW1vdGVzICRyXSByXQorCQkJCXdoaWxlIHtbZ2V0cyAkZmQgbl0gPj0gMH0geworCQkJCQlpZiB7W3JlZ2V4cCB7XlB1bGw6WyBcdF0qKFteOl0rKTp9ICRuXX0geworCQkJCQkJc2V0IGVuYWJsZSAxCisJCQkJCQlicmVhaworCQkJCQl9CisJCQkJfQorCQkJCWNsb3NlICRmZAorCQkJfQorCQl9CisKKwkJaWYgeyRlbmFibGV9IHsKKwkJCWlmIHshW3dpbmZvIGV4aXN0cyAkZmV0Y2hfbV19IHsKKwkJCQltZW51ICRwcnVuZV9tCisJCQkJJHJlbW90ZV9tIGluc2VydCAwIGNhc2NhZGUgXAorCQkJCQktbGFiZWwgW21jICJQcnVuZSBmcm9tIl0gXAorCQkJCQktbWVudSAkcHJ1bmVfbQorCisJCQkJbWVudSAkZmV0Y2hfbQorCQkJCSRyZW1vdGVfbSBpbnNlcnQgMCBjYXNjYWRlIFwKKwkJCQkJLWxhYmVsIFttYyAiRmV0Y2ggZnJvbSJdIFwKKwkJCQkJLW1lbnUgJGZldGNoX20KKwkJCX0KKworCQkJJGZldGNoX20gYWRkIGNvbW1hbmQgXAorCQkJCS1sYWJlbCAkciBcCisJCQkJLWNvbW1hbmQgW2xpc3QgZmV0Y2hfZnJvbSAkcl0KKwkJCSRwcnVuZV9tIGFkZCBjb21tYW5kIFwKKwkJCQktbGFiZWwgJHIgXAorCQkJCS1jb21tYW5kIFtsaXN0IHBydW5lX2Zyb20gJHJdCisJCX0KKwl9Cit9CisKK3Byb2MgcG9wdWxhdGVfcHVzaF9tZW51IHt9IHsKKwlnbG9iYWwgYWxsX3JlbW90ZXMgcmVwb19jb25maWcKKworCXNldCByZW1vdGVfbSAubWJhci5yZW1vdGUKKwlzZXQgcHVzaF9tICRyZW1vdGVfbS5wdXNoCisKKwlmb3JlYWNoIHIgJGFsbF9yZW1vdGVzIHsKKwkJc2V0IGVuYWJsZSAwCisJCWlmIHshW2NhdGNoIHtzZXQgYSAkcmVwb19jb25maWcocmVtb3RlLiRyLnVybCl9XX0geworCQkJaWYgeyFbY2F0Y2gge3NldCBhICRyZXBvX2NvbmZpZyhyZW1vdGUuJHIucHVzaCl9XX0geworCQkJCXNldCBlbmFibGUgMQorCQkJfQorCQl9IGVsc2UgeworCQkJY2F0Y2ggeworCQkJCXNldCBmZCBbb3BlbiBbZ2l0ZGlyIHJlbW90ZXMgJHJdIHJdCisJCQkJd2hpbGUge1tnZXRzICRmZCBuXSA+PSAwfSB7CisJCQkJCWlmIHtbcmVnZXhwIHteUHVzaDpbIFx0XSooW146XSspOn0gJG5dfSB7CisJCQkJCQlzZXQgZW5hYmxlIDEKKwkJCQkJCWJyZWFrCisJCQkJCX0KKwkJCQl9CisJCQkJY2xvc2UgJGZkCisJCQl9CisJCX0KKworCQlpZiB7JGVuYWJsZX0geworCQkJaWYgeyFbd2luZm8gZXhpc3RzICRwdXNoX21dfSB7CisJCQkJbWVudSAkcHVzaF9tCisJCQkJJHJlbW90ZV9tIGluc2VydCAwIGNhc2NhZGUgXAorCQkJCQktbGFiZWwgW21jICJQdXNoIHRvIl0gXAorCQkJCQktbWVudSAkcHVzaF9tCisJCQl9CisKKwkJCSRwdXNoX20gYWRkIGNvbW1hbmQgXAorCQkJCS1sYWJlbCAkciBcCisJCQkJLWNvbW1hbmQgW2xpc3QgcHVzaF90byAkcl0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2dpdC1ndWkvbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbCBiL2dpdC1ndWkvbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2I4MTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9saWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsCkBAIC0wLDAgKzEsMzQ1IEBACisjIGdpdC1ndWkgcmVtb3RlIGJyYW5jaCBkZWxldGluZyBzdXBwb3J0CisjIENvcHlyaWdodCAoQykgMjAwNyBTaGF3biBQZWFyY2UKKworY2xhc3MgcmVtb3RlX2JyYW5jaF9kZWxldGUgeworCitmaWVsZCB3CitmaWVsZCBoZWFkX20KKworZmllbGQgdXJsdHlwZSAgIHt1cmx9CitmaWVsZCByZW1vdGUgICAge30KK2ZpZWxkIHVybCAgICAgICB7fQorCitmaWVsZCBjaGVja3R5cGUgIHtoZWFkfQorZmllbGQgY2hlY2tfaGVhZCB7fQorCitmaWVsZCBzdGF0dXMgICAge30KK2ZpZWxkIGlkbGVfaWQgICB7fQorZmllbGQgZnVsbF9saXN0IHt9CitmaWVsZCBoZWFkX2xpc3Qge30KK2ZpZWxkIGFjdGl2ZV9scyB7fQorZmllbGQgaGVhZF9jYWNoZQorZmllbGQgZnVsbF9jYWNoZQorZmllbGQgY2FjaGVkCisKK2NvbnN0cnVjdG9yIGRpYWxvZyB7fSB7CisJZ2xvYmFsIGFsbF9yZW1vdGVzIE0xQgorCisJbWFrZV90b3BsZXZlbCB0b3AgdworCXdtIHRpdGxlICR0b3AgW2FwcGVuZCAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogIiBbbWMgIkRlbGV0ZSBSZW1vdGUgQnJhbmNoIl1dCisJaWYgeyR0b3AgbmUgey59fSB7CisJCXdtIGdlb21ldHJ5ICR0b3AgIitbd2luZm8gcm9vdHggLl0rW3dpbmZvIHJvb3R5IC5dIgorCX0KKworCWxhYmVsICR3LmhlYWRlciAtdGV4dCBbbWMgIkRlbGV0ZSBSZW1vdGUgQnJhbmNoIl0gLWZvbnQgZm9udF91aWJvbGQKKwlwYWNrICR3LmhlYWRlciAtc2lkZSB0b3AgLWZpbGwgeAorCisJZnJhbWUgJHcuYnV0dG9ucworCWJ1dHRvbiAkdy5idXR0b25zLmRlbGV0ZSAtdGV4dCBbbWMgRGVsZXRlXSBcCisJCS1kZWZhdWx0IGFjdGl2ZSBcCisJCS1jb21tYW5kIFtjYiBfZGVsZXRlXQorCXBhY2sgJHcuYnV0dG9ucy5kZWxldGUgLXNpZGUgcmlnaHQKKwlidXR0b24gJHcuYnV0dG9ucy5jYW5jZWwgLXRleHQgW21jICJDYW5jZWwiXSBcCisJCS1jb21tYW5kIFtsaXN0IGRlc3Ryb3kgJHddCisJcGFjayAkdy5idXR0b25zLmNhbmNlbCAtc2lkZSByaWdodCAtcGFkeCA1CisJcGFjayAkdy5idXR0b25zIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDEwIC1wYWR4IDEwCisKKwlsYWJlbGZyYW1lICR3LmRlc3QgLXRleHQgW21jICJGcm9tIFJlcG9zaXRvcnkiXQorCWlmIHskYWxsX3JlbW90ZXMgbmUge319IHsKKwkJcmFkaW9idXR0b24gJHcuZGVzdC5yZW1vdGVfciBcCisJCQktdGV4dCBbbWMgIlJlbW90ZToiXSBcCisJCQktdmFsdWUgcmVtb3RlIFwKKwkJCS12YXJpYWJsZSBAdXJsdHlwZQorCQlldmFsIHRrX29wdGlvbk1lbnUgJHcuZGVzdC5yZW1vdGVfbSBAcmVtb3RlICRhbGxfcmVtb3RlcworCQlncmlkICR3LmRlc3QucmVtb3RlX3IgJHcuZGVzdC5yZW1vdGVfbSAtc3RpY2t5IHcKKwkJaWYge1tsc2VhcmNoIC1zb3J0ZWQgLWV4YWN0ICRhbGxfcmVtb3RlcyBvcmlnaW5dICE9IC0xfSB7CisJCQlzZXQgcmVtb3RlIG9yaWdpbgorCQl9IGVsc2UgeworCQkJc2V0IHJlbW90ZSBbbGluZGV4ICRhbGxfcmVtb3RlcyAwXQorCQl9CisJCXNldCB1cmx0eXBlIHJlbW90ZQorCQl0cmFjZSBhZGQgdmFyaWFibGUgQHJlbW90ZSB3cml0ZSBbY2IgX3dyaXRlX3JlbW90ZV0KKwl9IGVsc2UgeworCQlzZXQgdXJsdHlwZSB1cmwKKwl9CisJcmFkaW9idXR0b24gJHcuZGVzdC51cmxfciBcCisJCS10ZXh0IFttYyAiQXJiaXRyYXJ5IFVSTDoiXSBcCisJCS12YWx1ZSB1cmwgXAorCQktdmFyaWFibGUgQHVybHR5cGUKKwllbnRyeSAkdy5kZXN0LnVybF90IFwKKwkJLWJvcmRlcndpZHRoIDEgXAorCQktcmVsaWVmIHN1bmtlbiBcCisJCS13aWR0aCA1MCBcCisJCS10ZXh0dmFyaWFibGUgQHVybCBcCisJCS12YWxpZGF0ZSBrZXkgXAorCQktdmFsaWRhdGVjb21tYW5kIHsKKwkJCWlmIHslZCA9PSAxICYmIFtyZWdleHAge1xzfSAlU119IHtyZXR1cm4gMH0KKwkJCXJldHVybiAxCisJCX0KKwl0cmFjZSBhZGQgdmFyaWFibGUgQHVybCB3cml0ZSBbY2IgX3dyaXRlX3VybF0KKwlncmlkICR3LmRlc3QudXJsX3IgJHcuZGVzdC51cmxfdCAtc3RpY2t5IHdlIC1wYWR4IHswIDV9CisJZ3JpZCBjb2x1bW5jb25maWd1cmUgJHcuZGVzdCAxIC13ZWlnaHQgMQorCXBhY2sgJHcuZGVzdCAtYW5jaG9yIG53IC1maWxsIHggLXBhZHkgNSAtcGFkeCA1CisKKwlsYWJlbGZyYW1lICR3LmhlYWRzIC10ZXh0IFttYyAiQnJhbmNoZXMiXQorCWxpc3Rib3ggJHcuaGVhZHMubCBcCisJCS1oZWlnaHQgMTAgXAorCQktd2lkdGggNzAgXAorCQktbGlzdHZhcmlhYmxlIEBoZWFkX2xpc3QgXAorCQktc2VsZWN0bW9kZSBleHRlbmRlZCBcCisJCS15c2Nyb2xsY29tbWFuZCBbbGlzdCAkdy5oZWFkcy5zYnkgc2V0XQorCXNjcm9sbGJhciAkdy5oZWFkcy5zYnkgLWNvbW1hbmQgW2xpc3QgJHcuaGVhZHMubCB5dmlld10KKworCWZyYW1lICR3LmhlYWRzLmZvb3RlcgorCWxhYmVsICR3LmhlYWRzLmZvb3Rlci5zdGF0dXMgXAorCQktdGV4dHZhcmlhYmxlIEBzdGF0dXMgXAorCQktYW5jaG9yIHcgXAorCQktanVzdGlmeSBsZWZ0CisJYnV0dG9uICR3LmhlYWRzLmZvb3Rlci5yZXNjYW4gXAorCQktdGV4dCBbbWMgIlJlc2NhbiJdIFwKKwkJLWNvbW1hbmQgW2NiIF9yZXNjYW5dCisJcGFjayAkdy5oZWFkcy5mb290ZXIuc3RhdHVzIC1zaWRlIGxlZnQgLWZpbGwgeAorCXBhY2sgJHcuaGVhZHMuZm9vdGVyLnJlc2NhbiAtc2lkZSByaWdodAorCisJcGFjayAkdy5oZWFkcy5mb290ZXIgLXNpZGUgYm90dG9tIC1maWxsIHgKKwlwYWNrICR3LmhlYWRzLnNieSAtc2lkZSByaWdodCAtZmlsbCB5CisJcGFjayAkdy5oZWFkcy5sIC1zaWRlIGxlZnQgLWZpbGwgYm90aCAtZXhwYW5kIDEKKwlwYWNrICR3LmhlYWRzIC1maWxsIGJvdGggLWV4cGFuZCAxIC1wYWR5IDUgLXBhZHggNQorCisJbGFiZWxmcmFtZSAkdy52YWxpZGF0ZSAtdGV4dCBbbWMgIkRlbGV0ZSBPbmx5IElmIl0KKwlyYWRpb2J1dHRvbiAkdy52YWxpZGF0ZS5oZWFkX3IgXAorCQktdGV4dCBbbWMgIk1lcmdlZCBJbnRvOiJdIFwKKwkJLXZhbHVlIGhlYWQgXAorCQktdmFyaWFibGUgQGNoZWNrdHlwZQorCXNldCBoZWFkX20gW3RrX29wdGlvbk1lbnUgJHcudmFsaWRhdGUuaGVhZF9tIEBjaGVja19oZWFkIHt9XQorCXRyYWNlIGFkZCB2YXJpYWJsZSBAaGVhZF9saXN0IHdyaXRlIFtjYiBfd3JpdGVfaGVhZF9saXN0XQorCXRyYWNlIGFkZCB2YXJpYWJsZSBAY2hlY2tfaGVhZCB3cml0ZSBbY2IgX3dyaXRlX2NoZWNrX2hlYWRdCisJZ3JpZCAkdy52YWxpZGF0ZS5oZWFkX3IgJHcudmFsaWRhdGUuaGVhZF9tIC1zdGlja3kgdworCXJhZGlvYnV0dG9uICR3LnZhbGlkYXRlLmFsd2F5c19yIFwKKwkJLXRleHQgW21jICJBbHdheXMgKERvIG5vdCBwZXJmb3JtIG1lcmdlIGNoZWNrcykiXSBcCisJCS12YWx1ZSBhbHdheXMgXAorCQktdmFyaWFibGUgQGNoZWNrdHlwZQorCWdyaWQgJHcudmFsaWRhdGUuYWx3YXlzX3IgLWNvbHVtbnNwYW4gMiAtc3RpY2t5IHcKKwlncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdy52YWxpZGF0ZSAxIC13ZWlnaHQgMQorCXBhY2sgJHcudmFsaWRhdGUgLWFuY2hvciBudyAtZmlsbCB4IC1wYWR5IDUgLXBhZHggNQorCisJdHJhY2UgYWRkIHZhcmlhYmxlIEB1cmx0eXBlIHdyaXRlIFtjYiBfd3JpdGVfdXJsdHlwZV0KKwlfcmVzY2FuICR0aGlzCisKKwliaW5kICR3IDxLZXktRjU+ICAgICBbY2IgX3Jlc2Nhbl0KKwliaW5kICR3IDwkTTFCLUtleS1yPiBbY2IgX3Jlc2Nhbl0KKwliaW5kICR3IDwkTTFCLUtleS1SPiBbY2IgX3Jlc2Nhbl0KKwliaW5kICR3IDxLZXktUmV0dXJuPiBbY2IgX2RlbGV0ZV0KKwliaW5kICR3IDxLZXktRXNjYXBlPiBbbGlzdCBkZXN0cm95ICR3XQorCXJldHVybiAkdworfQorCittZXRob2QgX2RlbGV0ZSB7fSB7CisJc3dpdGNoICR1cmx0eXBlIHsKKwlyZW1vdGUge3NldCB1cmkgJHJlbW90ZX0KKwl1cmwgICAge3NldCB1cmkgJHVybH0KKwl9CisKKwlzZXQgY2FjaGUgJHVybHR5cGU6JHVyaQorCXNldCBjcmV2IHt9CisJaWYgeyRjaGVja3R5cGUgZXEge2hlYWR9fSB7CisJCWlmIHskY2hlY2tfaGVhZCBlcSB7fX0geworCQkJdGtfbWVzc2FnZUJveCBcCisJCQkJLWljb24gZXJyb3IgXAorCQkJCS10eXBlIG9rIFwKKwkJCQktdGl0bGUgW3dtIHRpdGxlICR3XSBcCisJCQkJLXBhcmVudCAkdyBcCisJCQkJLW1lc3NhZ2UgW21jICJBIGJyYW5jaCBpcyByZXF1aXJlZCBmb3IgJ01lcmdlZCBJbnRvJy4iXQorCQkJcmV0dXJuCisJCX0KKwkJc2V0IGNyZXYgJGZ1bGxfY2FjaGUoIiRjYWNoZVxucmVmcy9oZWFkcy8kY2hlY2tfaGVhZCIpCisJfQorCisJc2V0IG5vdF9tZXJnZWQgW2xpc3RdCisJc2V0IG5lZWRfZmV0Y2ggMAorCXNldCBoYXZlX3NlbGVjdGlvbiAwCisJc2V0IHB1c2hfY21kIFtsaXN0IGdpdCBwdXNoXQorCWxhcHBlbmQgcHVzaF9jbWQgLXYKKwlsYXBwZW5kIHB1c2hfY21kICR1cmkKKworCWZvcmVhY2ggaSBbJHcuaGVhZHMubCBjdXJzZWxlY3Rpb25dIHsKKwkJc2V0IHJlZiBbbGluZGV4ICRmdWxsX2xpc3QgJGldCisJCWlmIHskY3JldiBuZSB7fX0geworCQkJc2V0IG9iaiAkZnVsbF9jYWNoZSgiJGNhY2hlXG4kcmVmIikKKwkJCWlmIHtbY2F0Y2gge3NldCBtIFtnaXQgbWVyZ2UtYmFzZSAkb2JqICRjcmV2XX1dfSB7CisJCQkJc2V0IG5lZWRfZmV0Y2ggMQorCQkJCXNldCBtIHt9CisJCQl9CisJCQlpZiB7JG9iaiBuZSAkbX0geworCQkJCWxhcHBlbmQgbm90X21lcmdlZCBbbGluZGV4ICRoZWFkX2xpc3QgJGldCisJCQkJY29udGludWUKKwkJCX0KKwkJfQorCisJCWxhcHBlbmQgcHVzaF9jbWQgOiRyZWYKKwkJc2V0IGhhdmVfc2VsZWN0aW9uIDEKKwl9CisKKwlpZiB7JG5vdF9tZXJnZWQgbmUge319IHsKKwkJc2V0IG1zZyBbbWMgIlRoZSBmb2xsb3dpbmcgYnJhbmNoZXMgYXJlIG5vdCBjb21wbGV0ZWx5IG1lcmdlZCBpbnRvICVzOgorCisgLSAlcyIgJGNoZWNrX2hlYWQgW2pvaW4gJG5vdF9tZXJnZWQgIlxuIC0gIl1dCisKKwkJaWYgeyRuZWVkX2ZldGNofSB7CisJCQlhcHBlbmQgbXNnICJcblxuIiBbbWMgIk9uZSBvciBtb3JlIG9mIHRoZSBtZXJnZSB0ZXN0cyBmYWlsZWQgYmVjYXVzZSB5b3UgaGF2ZSBub3QgZmV0Y2hlZCB0aGUgbmVjZXNzYXJ5IGNvbW1pdHMuICBUcnkgZmV0Y2hpbmcgZnJvbSAlcyBmaXJzdC4iICR1cmldCisJCX0KKworCQl0a19tZXNzYWdlQm94IFwKKwkJCS1pY29uIGluZm8gXAorCQkJLXR5cGUgb2sgXAorCQkJLXRpdGxlIFt3bSB0aXRsZSAkd10gXAorCQkJLXBhcmVudCAkdyBcCisJCQktbWVzc2FnZSAkbXNnCisJCWlmIHshJGhhdmVfc2VsZWN0aW9ufSByZXR1cm4KKwl9CisKKwlpZiB7ISRoYXZlX3NlbGVjdGlvbn0geworCQl0a19tZXNzYWdlQm94IFwKKwkJCS1pY29uIGVycm9yIFwKKwkJCS10eXBlIG9rIFwKKwkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKKwkJCS1wYXJlbnQgJHcgXAorCQkJLW1lc3NhZ2UgW21jICJQbGVhc2Ugc2VsZWN0IG9uZSBvciBtb3JlIGJyYW5jaGVzIHRvIGRlbGV0ZS4iXQorCQlyZXR1cm4KKwl9CisKKwlpZiB7W3RrX21lc3NhZ2VCb3ggXAorCQktaWNvbiB3YXJuaW5nIFwKKwkJLXR5cGUgeWVzbm8gXAorCQktdGl0bGUgW3dtIHRpdGxlICR3XSBcCisJCS1wYXJlbnQgJHcgXAorCQktbWVzc2FnZSBbbWMgIlJlY292ZXJpbmcgZGVsZXRlZCBicmFuY2hlcyBpcyBkaWZmaWN1bHQuCisKK0RlbGV0ZSB0aGUgc2VsZWN0ZWQgYnJhbmNoZXM/Il1dIG5lIHllc30geworCQlyZXR1cm4KKwl9CisKKwlkZXN0cm95ICR3CisKKwlzZXQgY29ucyBbY29uc29sZTo6bmV3IFwKKwkJInB1c2ggJHVyaSIgXAorCQlbbWMgIkRlbGV0aW5nIGJyYW5jaGVzIGZyb20gJXMiICR1cmldXQorCWNvbnNvbGU6OmV4ZWMgJGNvbnMgJHB1c2hfY21kCit9CisKK21ldGhvZCBfcmVzY2FuIHt7Zm9yY2UgMX19IHsKKwlzd2l0Y2ggJHVybHR5cGUgeworCXJlbW90ZSB7c2V0IHVyaSAkcmVtb3RlfQorCXVybCAgICB7c2V0IHVyaSAkdXJsfQorCX0KKworCWlmIHskZm9yY2V9IHsKKwkJdW5zZXQgLW5vY29tcGxhaW4gY2FjaGVkKCR1cmx0eXBlOiR1cmkpCisJfQorCisJaWYgeyRpZGxlX2lkIG5lIHt9fSB7CisJCWFmdGVyIGNhbmNlbCAkaWRsZV9pZAorCQlzZXQgaWRsZV9pZCB7fQorCX0KKworCV9sb2FkICR0aGlzICR1cmx0eXBlOiR1cmkgJHVyaQorfQorCittZXRob2QgX3dyaXRlX3JlbW90ZSAgICAge2FyZ3N9IHsgc2V0IHVybHR5cGUgcmVtb3RlIH0KK21ldGhvZCBfd3JpdGVfdXJsICAgICAgICB7YXJnc30geyBzZXQgdXJsdHlwZSB1cmwgICAgfQorbWV0aG9kIF93cml0ZV9jaGVja19oZWFkIHthcmdzfSB7IHNldCBjaGVja3R5cGUgaGVhZCB9CisKK21ldGhvZCBfd3JpdGVfaGVhZF9saXN0IHthcmdzfSB7CisJJGhlYWRfbSBkZWxldGUgMCBlbmQKKwlmb3JlYWNoIGFiciAkaGVhZF9saXN0IHsKKwkJJGhlYWRfbSBpbnNlcnQgZW5kIHJhZGlvYnV0dG9uIFwKKwkJCS1sYWJlbCAkYWJyIFwKKwkJCS12YWx1ZSAkYWJyIFwKKwkJCS12YXJpYWJsZSBAY2hlY2tfaGVhZAorCX0KKwlpZiB7W2xzZWFyY2ggLWV4YWN0IC1zb3J0ZWQgJGhlYWRfbGlzdCAkY2hlY2tfaGVhZF0gPCAwfSB7CisJCXNldCBjaGVja19oZWFkIHt9CisJfQorfQorCittZXRob2QgX3dyaXRlX3VybHR5cGUge2FyZ3N9IHsKKwlpZiB7JHVybHR5cGUgZXEge3VybH19IHsKKwkJaWYgeyRpZGxlX2lkIG5lIHt9fSB7CisJCQlhZnRlciBjYW5jZWwgJGlkbGVfaWQKKwkJfQorCQlfbG9hZCAkdGhpcyBub25lOiB7fQorCQlzZXQgaWRsZV9pZCBbYWZ0ZXIgMTAwMCBbY2IgX3Jlc2NhbiAwXV0KKwl9IGVsc2UgeworCQlfcmVzY2FuICR0aGlzIDAKKwl9Cit9CisKK21ldGhvZCBfbG9hZCB7Y2FjaGUgdXJpfSB7CisJaWYgeyRhY3RpdmVfbHMgbmUge319IHsKKwkJY2F0Y2gge2Nsb3NlICRhY3RpdmVfbHN9CisJfQorCisJaWYgeyR1cmkgZXEge319IHsKKwkJJHcuaGVhZHMubCBjb25mIC1zdGF0ZSBkaXNhYmxlZAorCQlzZXQgaGVhZF9saXN0IFtsaXN0XQorCQlzZXQgZnVsbF9saXN0IFtsaXN0XQorCQlzZXQgc3RhdHVzIFttYyAiTm8gcmVwb3NpdG9yeSBzZWxlY3RlZC4iXQorCQlyZXR1cm4KKwl9CisKKwlpZiB7W2NhdGNoIHtzZXQgeCAkY2FjaGVkKCRjYWNoZSl9XX0geworCQlzZXQgc3RhdHVzIFttYyAiU2Nhbm5pbmcgJXMuLi4iICR1cmldCisJCSR3LmhlYWRzLmwgY29uZiAtc3RhdGUgZGlzYWJsZWQKKwkJc2V0IGhlYWRfbGlzdCBbbGlzdF0KKwkJc2V0IGZ1bGxfbGlzdCBbbGlzdF0KKwkJc2V0IGhlYWRfY2FjaGUoJGNhY2hlKSBbbGlzdF0KKwkJc2V0IGZ1bGxfY2FjaGUoJGNhY2hlKSBbbGlzdF0KKwkJc2V0IGFjdGl2ZV9scyBbZ2l0X3JlYWQgbHMtcmVtb3RlICR1cmldCisJCWZjb25maWd1cmUgJGFjdGl2ZV9scyBcCisJCQktYmxvY2tpbmcgMCBcCisJCQktdHJhbnNsYXRpb24gbGYgXAorCQkJLWVuY29kaW5nIHV0Zi04CisJCWZpbGVldmVudCAkYWN0aXZlX2xzIHJlYWRhYmxlIFtjYiBfcmVhZCAkY2FjaGUgJGFjdGl2ZV9sc10KKwl9IGVsc2UgeworCQlzZXQgc3RhdHVzIHt9CisJCXNldCBmdWxsX2xpc3QgJGZ1bGxfY2FjaGUoJGNhY2hlKQorCQlzZXQgaGVhZF9saXN0ICRoZWFkX2NhY2hlKCRjYWNoZSkKKwkJJHcuaGVhZHMubCBjb25mIC1zdGF0ZSBub3JtYWwKKwl9Cit9CisKK21ldGhvZCBfcmVhZCB7Y2FjaGUgZmR9IHsKKwlpZiB7JGZkIG5lICRhY3RpdmVfbHN9IHsKKwkJY2F0Y2gge2Nsb3NlICRmZH0KKwkJcmV0dXJuCisJfQorCisJd2hpbGUge1tnZXRzICRmZCBsaW5lXSA+PSAwfSB7CisJCWlmIHtbc3RyaW5nIG1hdGNoIHsqXnt9fSAkbGluZV19IGNvbnRpbnVlCisJCWlmIHtbcmVnZXhwIHteKFswLTlhLWZdezQwfSkJKC4qKSR9ICRsaW5lIF9qdW5rIG9iaiByZWZdfSB7CisJCQlpZiB7W3JlZ3N1YiBecmVmcy9oZWFkcy8gJHJlZiB7fSBhYnJdfSB7CisJCQkJbGFwcGVuZCBoZWFkX2xpc3QgJGFicgorCQkJCWxhcHBlbmQgaGVhZF9jYWNoZSgkY2FjaGUpICRhYnIKKwkJCQlsYXBwZW5kIGZ1bGxfbGlzdCAkcmVmCisJCQkJbGFwcGVuZCBmdWxsX2NhY2hlKCRjYWNoZSkgJHJlZgorCQkJCXNldCBmdWxsX2NhY2hlKCIkY2FjaGVcbiRyZWYiKSAkb2JqCisJCQl9CisJCX0KKwl9CisKKwlpZiB7W2VvZiAkZmRdfSB7CisJCWlmIHtbY2F0Y2gge2Nsb3NlICRmZH0gZXJyXX0geworCQkJc2V0IHN0YXR1cyAkZXJyCisJCQlzZXQgaGVhZF9saXN0IFtsaXN0XQorCQkJc2V0IGZ1bGxfbGlzdCBbbGlzdF0KKwkJfSBlbHNlIHsKKwkJCXNldCBzdGF0dXMge30KKwkJCXNldCBjYWNoZWQoJGNhY2hlKSAxCisJCQkkdy5oZWFkcy5sIGNvbmYgLXN0YXRlIG5vcm1hbAorCQl9CisJfQorfSBpZmRlbGV0ZWQgeworCWNhdGNoIHtjbG9zZSAkZmR9Cit9CisKK30KZGlmZiAtLWdpdCBhL2dpdC1ndWkvbGliL3Nob3J0Y3V0LnRjbCBiL2dpdC1ndWkvbGliL3Nob3J0Y3V0LnRjbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGMzMTUxCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9saWIvc2hvcnRjdXQudGNsCkBAIC0wLDAgKzEsMTM5IEBACisjIGdpdC1ndWkgZGVza3RvcCBpY29uIGNyZWF0b3JzCisjIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBTaGF3biBQZWFyY2UKKworcHJvYyBkb193aW5kb3dzX3Nob3J0Y3V0IHt9IHsKKwlzZXQgZm4gW3RrX2dldFNhdmVGaWxlIFwKKwkJLXBhcmVudCAuIFwKKwkJLXRpdGxlIFthcHBlbmQgIlthcHBuYW1lXSAoW3JlcG9uYW1lXSk6ICIgW21jICJDcmVhdGUgRGVza3RvcCBJY29uIl1dIFwKKwkJLWluaXRpYWxmaWxlICJHaXQgW3JlcG9uYW1lXS5sbmsiXQorCWlmIHskZm4gIT0ge319IHsKKwkJaWYge1tmaWxlIGV4dGVuc2lvbiAkZm5dIG5lIHsubG5rfX0geworCQkJc2V0IGZuICR7Zm59LmxuaworCQl9CisJCWlmIHtbY2F0Y2ggeworCQkJCXdpbjMyX2NyZWF0ZV9sbmsgJGZuIFtsaXN0IFwKKwkJCQkJW2luZm8gbmFtZW9mZXhlY3V0YWJsZV0gXAorCQkJCQlbZmlsZSBub3JtYWxpemUgJDo6YXJndjBdIFwKKwkJCQkJXSBcCisJCQkJCVtmaWxlIGRpcm5hbWUgW2ZpbGUgbm9ybWFsaXplIFtnaXRkaXJdXV0KKwkJCX0gZXJyXX0geworCQkJZXJyb3JfcG9wdXAgW3N0cmNhdCBbbWMgIkNhbm5vdCB3cml0ZSBzaG9ydGN1dDoiXSAiXG5cbiRlcnIiXQorCQl9CisJfQorfQorCitwcm9jIGRvX2N5Z3dpbl9zaG9ydGN1dCB7fSB7CisJZ2xvYmFsIGFyZ3YwCisKKwlpZiB7W2NhdGNoIHsKKwkJc2V0IGRlc2t0b3AgW2V4ZWMgY3lncGF0aCBcCisJCQktLXdpbmRvd3MgXAorCQkJLS1hYnNvbHV0ZSBcCisJCQktLWxvbmctbmFtZSBcCisJCQktLWRlc2t0b3BdCisJCX1dfSB7CisJCQlzZXQgZGVza3RvcCAuCisJfQorCXNldCBmbiBbdGtfZ2V0U2F2ZUZpbGUgXAorCQktcGFyZW50IC4gXAorCQktdGl0bGUgW2FwcGVuZCAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogIiBbbWMgIkNyZWF0ZSBEZXNrdG9wIEljb24iXV0gXAorCQktaW5pdGlhbGRpciAkZGVza3RvcCBcCisJCS1pbml0aWFsZmlsZSAiR2l0IFtyZXBvbmFtZV0ubG5rIl0KKwlpZiB7JGZuICE9IHt9fSB7CisJCWlmIHtbZmlsZSBleHRlbnNpb24gJGZuXSBuZSB7Lmxua319IHsKKwkJCXNldCBmbiAke2ZufS5sbmsKKwkJfQorCQlpZiB7W2NhdGNoIHsKKwkJCQlzZXQgc2ggW2V4ZWMgY3lncGF0aCBcCisJCQkJCS0td2luZG93cyBcCisJCQkJCS0tYWJzb2x1dGUgXAorCQkJCQkvYmluL3NoLmV4ZV0KKwkJCQlzZXQgbWUgW2V4ZWMgY3lncGF0aCBcCisJCQkJCS0tdW5peCBcCisJCQkJCS0tYWJzb2x1dGUgXAorCQkJCQkkYXJndjBdCisJCQkJd2luMzJfY3JlYXRlX2xuayAkZm4gW2xpc3QgXAorCQkJCQkkc2ggLWMgXAorCQkJCQkiQ0hFUkVfSU5WT0tJTkc9MSBzb3VyY2UgL2V0Yy9wcm9maWxlO1tzcSAkbWVdIiBcCisJCQkJCV0gXAorCQkJCQlbZmlsZSBkaXJuYW1lIFtmaWxlIG5vcm1hbGl6ZSBbZ2l0ZGlyXV1dCisJCQl9IGVycl19IHsKKwkJCWVycm9yX3BvcHVwIFtzdHJjYXQgW21jICJDYW5ub3Qgd3JpdGUgc2hvcnRjdXQ6Il0gIlxuXG4kZXJyIl0KKwkJfQorCX0KK30KKworcHJvYyBkb19tYWNvc3hfYXBwIHt9IHsKKwlnbG9iYWwgYXJndjAgZW52CisKKwlzZXQgZm4gW3RrX2dldFNhdmVGaWxlIFwKKwkJLXBhcmVudCAuIFwKKwkJLXRpdGxlIFthcHBlbmQgIlthcHBuYW1lXSAoW3JlcG9uYW1lXSk6ICIgW21jICJDcmVhdGUgRGVza3RvcCBJY29uIl1dIFwKKwkJLWluaXRpYWxkaXIgW2ZpbGUgam9pbiAkZW52KEhPTUUpIERlc2t0b3BdIFwKKwkJLWluaXRpYWxmaWxlICJHaXQgW3JlcG9uYW1lXS5hcHAiXQorCWlmIHskZm4gIT0ge319IHsKKwkJaWYge1tmaWxlIGV4dGVuc2lvbiAkZm5dIG5lIHsuYXBwfX0geworCQkJc2V0IGZuICR7Zm59LmFwcAorCQl9CisJCWlmIHtbY2F0Y2ggeworCQkJCXNldCBDb250ZW50cyBbZmlsZSBqb2luICRmbiBDb250ZW50c10KKwkJCQlzZXQgTWFjT1MgW2ZpbGUgam9pbiAkQ29udGVudHMgTWFjT1NdCisJCQkJc2V0IGV4ZSBbZmlsZSBqb2luICRNYWNPUyBnaXQtZ3VpXQorCisJCQkJZmlsZSBta2RpciAkTWFjT1MKKworCQkJCXNldCBmZCBbb3BlbiBbZmlsZSBqb2luICRDb250ZW50cyBJbmZvLnBsaXN0XSB3XQorCQkJCXB1dHMgJGZkIHs8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz5naXQtZ3VpPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPm9yZy5zcGVhcmNlLmdpdC1ndWk8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkFQUEw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjEuMDwvc3RyaW5nPgorCTxrZXk+TlNQcmluY2lwYWxDbGFzczwva2V5PgorCTxzdHJpbmc+TlNBcHBsaWNhdGlvbjwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD59CisJCQkJY2xvc2UgJGZkCisKKwkJCQlzZXQgZmQgW29wZW4gJGV4ZSB3XQorCQkJCXB1dHMgJGZkICIjIS9iaW4vc2giCisJCQkJZm9yZWFjaCBuYW1lIFtsc29ydCBbYXJyYXkgbmFtZXMgZW52XV0geworCQkJCQlzZXQgdmFsdWUgJGVudigkbmFtZSkKKwkJCQkJc3dpdGNoIC0tICRuYW1lIHsKKwkJCQkJR0lUX0RJUiB7IHNldCB2YWx1ZSBbZmlsZSBub3JtYWxpemUgW2dpdGRpcl1dIH0KKwkJCQkJfQorCisJCQkJCXN3aXRjaCAtZ2xvYiAtLSAkbmFtZSB7CisJCQkJCVNTSF8qIC0KKwkJCQkJR0lUXyogeworCQkJCQkJcHV0cyAkZmQgImlmIHRlc3QgXCJ6XCQkbmFtZVwiID0gejsgdGhlbiIKKwkJCQkJCXB1dHMgJGZkICIgIGV4cG9ydCAkbmFtZT1bc3EgJHZhbHVlXSIKKwkJCQkJCXB1dHMgJGZkICJmaSAmJiIKKwkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCXB1dHMgJGZkICJleHBvcnQgUEFUSD1bc3EgW2ZpbGUgZGlybmFtZSAkOjpfZ2l0XV06XCRQQVRIICYmIgorCQkJCXB1dHMgJGZkICJjZCBbc3EgW2ZpbGUgbm9ybWFsaXplIFtwd2RdXV0gJiYiCisJCQkJcHV0cyAkZmQgImV4ZWMgXFwiCisJCQkJcHV0cyAkZmQgIiBbc3EgW2luZm8gbmFtZW9mZXhlY3V0YWJsZV1dIFxcIgorCQkJCXB1dHMgJGZkICIgW3NxIFtmaWxlIG5vcm1hbGl6ZSAkYXJndjBdXSIKKwkJCQljbG9zZSAkZmQKKworCQkJCWZpbGUgYXR0cmlidXRlcyAkZXhlIC1wZXJtaXNzaW9ucyB1K3gsZyt4LG8reAorCQkJfSBlcnJdfSB7CisJCQllcnJvcl9wb3B1cCBbc3RyY2F0IFttYyAiQ2Fubm90IHdyaXRlIGljb246Il0gIlxuXG4kZXJyIl0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2dpdC1ndWkvbGliL3NwZWxsY2hlY2sudGNsIGIvZ2l0LWd1aS9saWIvc3BlbGxjaGVjay50Y2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlNzQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvbGliL3NwZWxsY2hlY2sudGNsCkBAIC0wLDAgKzEsNDA4IEBACisjIGdpdC1ndWkgc3BlbGxjaGVja2luZyBzdXBwb3J0IHRocm91Z2ggaXNwZWxsL2FzcGVsbAorIyBDb3B5cmlnaHQgKEMpIDIwMDggU2hhd24gUGVhcmNlCisKK2NsYXNzIHNwZWxsY2hlY2sgeworCitmaWVsZCBzX2ZkICAgICAge30gOyAjIHBpcGUgdG8gaXNwZWxsL2FzcGVsbAorZmllbGQgc192ZXJzaW9uIHt9IDsgIyBpc3BlbGwvYXNwZWxsIHZlcnNpb24gc3RyaW5nCitmaWVsZCBzX2xhbmcgICAge30gOyAjIGN1cnJlbnQgbGFuZ3VhZ2UgY29kZQorZmllbGQgc19wcm9nIGFzcGVsbDsgIyBhcmUgd2UgYWN0dWFsbHkgb2xkIGlzcGVsbD8KK2ZpZWxkIHNfZmFpbGVkICAgMCA7ICMgaXMgJHNfcHJvZyBib2d1cyBhbmQgbm90IHdvcmtpbmc/CisKK2ZpZWxkIHdfdGV4dCAgICAgIDsgIyB0ZXh0IHdpZGdldCB3ZSBhcmUgc3BlbGxpbmcKK2ZpZWxkIHdfbWVudSAgICAgIDsgIyBjb250ZXh0IG1lbnUgZm9yIHRoZSB3aWRnZXQKK2ZpZWxkIHNfbWVudWlkeCAwIDsgIyBsYXN0IGluZGV4IG9mIGluc2VydGlvbiBpbnRvICR3X21lbnUKKworZmllbGQgc19pICAgICAgICAgICB7fSA7ICMgdGltZXIgcmVnaXN0cmF0aW9uIGZvciBfcnVuIGNhbGxiYWNrcworZmllbGQgc19jbGVhciAgICAgICAgMCA7ICMgZGlkIHdlIGVyYXNlIG1pc3BlbGxlZCB0YWdzIHlldD8KK2ZpZWxkIHNfc2VlbiAgICBbbGlzdF0gOyAjIGxpbmVzIGxhc3Qgc2VlbiBmcm9tICR3X3RleHQgaW4gX3J1bgorZmllbGQgc19jaGVja2VkIFtsaXN0XSA7ICMgbGluZXMgYWxyZWFkeSBjaGVja2VkCitmaWVsZCBzX3BlbmRpbmcgW2xpc3RdIDsgIyBbJGxpbmUgJGRhdGFdIHNlbnQgdG8gaXNwZWxsL2FzcGVsbAorZmllbGQgc19zdWdnZXN0ICAgICAgICA7ICMgYXJyYXksIGxpc3Qgb2Ygc3VnZ2VzdGlvbnMsIGtleWVkIGJ5IG1pc3NwZWxsaW5nCisKK2NvbnN0cnVjdG9yIGluaXQge3BpcGVfZmQgdWlfdGV4dCB1aV9tZW51fSB7CisJc2V0IHdfdGV4dCAkdWlfdGV4dAorCXNldCB3X21lbnUgJHVpX21lbnUKKwlhcnJheSB1bnNldCBzX3N1Z2dlc3QKKworCWJpbmRfYnV0dG9uMyAkd190ZXh0IFtjYiBfcG9wdXBfc3VnZ2VzdCAlWCAlWSBAJXgsJXldCisJX2Nvbm5lY3QgJHRoaXMgJHBpcGVfZmQKKwlyZXR1cm4gJHRoaXMKK30KKworbWV0aG9kIF9jb25uZWN0IHtwaXBlX2ZkfSB7CisJZmNvbmZpZ3VyZSAkcGlwZV9mZCBcCisJCS1lbmNvZGluZyB1dGYtOCBcCisJCS1lb2ZjaGFyIHt9IFwKKwkJLXRyYW5zbGF0aW9uIGxmCisKKwlpZiB7W2dldHMgJHBpcGVfZmQgc192ZXJzaW9uXSA8PSAwfSB7CisJCWlmIHtbY2F0Y2gge2Nsb3NlICRwaXBlX2ZkfSBlcnJdfSB7CisKKwkJCSMgRWg/ICBJcyB0aGlzIGFjdHVhbGx5IGlzcGVsbCBjaG9raW5nIG9uIGFzcGVsbCBvcHRpb25zPworCQkJIworCQkJaWYgeyRzX3Byb2cgZXEge2FzcGVsbH0KKwkJCQkmJiBbcmVnZXhwIC1ub2Nhc2Uge15Vc2FnZTogfSAkZXJyXQorCQkJCSYmICFbY2F0Y2ggeworCQkJCQkJc2V0IHBpcGVfZmQgW29wZW4gW2xpc3QgfCAkc19wcm9nIC12XSByXQorCQkJCQkJZ2V0cyAkcGlwZV9mZCBzX3ZlcnNpb24KKwkJCQkJCWNsb3NlICRwaXBlX2ZkCisJCQkJfV0KKwkJCQkmJiAkc192ZXJzaW9uIG5lIHt9fSB7CisJCQkJaWYge3tAKCMpIH0gZXEgW3N0cmluZyByYW5nZSAkc192ZXJzaW9uIDAgNF19IHsKKwkJCQkJc2V0IHNfdmVyc2lvbiBbc3RyaW5nIHJhbmdlICRzX3ZlcnNpb24gNSBlbmRdCisJCQkJfQorCQkJCXNldCBzX2ZhaWxlZCAxCisJCQkJZXJyb3JfcG9wdXAgW3N0cmNhdCBcCisJCQkJCVttYyAiVW5zdXBwb3J0ZWQgc3BlbGwgY2hlY2tlciJdIFwKKwkJCQkJIjpcblxuJHNfdmVyc2lvbiJdCisJCQkJc2V0IHNfdmVyc2lvbiB7fQorCQkJCXJldHVybgorCQkJfQorCisJCQlyZWdzdWIgLW5vY2FzZSB7XkVycm9yOiB9ICRlcnIge30gZXJyCisJCQlpZiB7JHNfZmQgZXEge319IHsKKwkJCQllcnJvcl9wb3B1cCBbc3RyY2F0IFttYyAiU3BlbGwgY2hlY2tpbmcgaXMgdW5hdmFpbGFibGUiXSAiOlxuXG4kZXJyIl0KKwkJCX0gZWxzZSB7CisJCQkJZXJyb3JfcG9wdXAgW3N0cmNhdCBcCisJCQkJCVttYyAiSW52YWxpZCBzcGVsbCBjaGVja2luZyBjb25maWd1cmF0aW9uIl0gXAorCQkJCQkiOlxuXG4kZXJyXG5cbiIgXAorCQkJCQlbbWMgIlJldmVydGluZyBkaWN0aW9uYXJ5IHRvICVzLiIgJHNfbGFuZ11dCisJCQl9CisJCX0gZWxzZSB7CisJCQllcnJvcl9wb3B1cCBbbWMgIlNwZWxsIGNoZWNrZXIgc2lsZW50bHkgZmFpbGVkIG9uIHN0YXJ0dXAiXQorCQl9CisJCXJldHVybgorCX0KKworCWlmIHt7QCgjKSB9IG5lIFtzdHJpbmcgcmFuZ2UgJHNfdmVyc2lvbiAwIDRdfSB7CisJCWNhdGNoIHtjbG9zZSAkcGlwZV9mZH0KKwkJZXJyb3JfcG9wdXAgW3N0cmNhdCBbbWMgIlVucmVjb2duaXplZCBzcGVsbCBjaGVja2VyIl0gIjpcblxuJHNfdmVyc2lvbiJdCisJCXJldHVybgorCX0KKwlzZXQgc192ZXJzaW9uIFtzdHJpbmcgcmFuZ2UgJHNfdmVyc2lvbiA1IGVuZF0KKwlyZWdleHAgXAorCQl7SW50ZXJuYXRpb25hbCBJc3BlbGwgVmVyc2lvbiAuKiBcKGJ1dCByZWFsbHkgKEFzcGVsbCAuKj8pXCkkfSBcCisJCSRzX3ZlcnNpb24gX2p1bmsgc192ZXJzaW9uCisKKwlwdXRzICRwaXBlX2ZkICEgICAgICAgICAgICAgOyAjIGVuYWJsZSB0ZXJzZSBtb2RlCisJcHV0cyAkcGlwZV9mZCB7JCRjciBtYXN0ZXJ9IDsgIyBmZXRjaCB0aGUgbGFuZ3VhZ2UKKwlmbHVzaCAkcGlwZV9mZAorCisJZ2V0cyAkcGlwZV9mZCBzX2xhbmcKKwlyZWdleHAge1svXFxdKFteL1xcXSspXC5bXlwuXSskfSAkc19sYW5nIF8gc19sYW5nCisKKwlpZiB7JDo6ZGVmYXVsdF9jb25maWcoZ3VpLnNwZWxsaW5nZGljdGlvbmFyeSkgZXEge30KKwkgJiYgW2dldF9jb25maWcgZ3VpLnNwZWxsaW5nZGljdGlvbmFyeV0gZXEge319IHsKKwkJc2V0IDo6ZGVmYXVsdF9jb25maWcoZ3VpLnNwZWxsaW5nZGljdGlvbmFyeSkgJHNfbGFuZworCX0KKworCWlmIHskc19mZCBuZSB7fX0geworCQljYXRjaCB7Y2xvc2UgJHNfZmR9CisJfQorCXNldCBzX2ZkICRwaXBlX2ZkCisKKwlmY29uZmlndXJlICRzX2ZkIC1ibG9ja2luZyAwCisJZmlsZWV2ZW50ICRzX2ZkIHJlYWRhYmxlIFtjYiBfcmVhZF0KKworCSR3X3RleHQgdGFnIGNvbmYgbWlzc3BlbGxlZCBcCisJCS1mb3JlZ3JvdW5kIHJlZCBcCisJCS11bmRlcmxpbmUgMQorCisJYXJyYXkgdW5zZXQgc19zdWdnZXN0CisJc2V0IHNfc2VlbiAgICBbbGlzdF0KKwlzZXQgc19jaGVja2VkIFtsaXN0XQorCXNldCBzX3BlbmRpbmcgW2xpc3RdCisJX3J1biAkdGhpcworfQorCittZXRob2QgbGFuZyB7e24ge319fSB7CisJaWYgeyRuIG5lIHt9ICYmICRzX2xhbmcgbmUgJG4gJiYgISRzX2ZhaWxlZH0geworCQlzZXQgc3BlbGxfY21kIFtsaXN0IHxdCisJCWxhcHBlbmQgc3BlbGxfY21kIGFzcGVsbAorCQlsYXBwZW5kIHNwZWxsX2NtZCAtLW1hc3Rlcj0kbgorCQlsYXBwZW5kIHNwZWxsX2NtZCAtLW1vZGU9bm9uZQorCQlsYXBwZW5kIHNwZWxsX2NtZCAtLWVuY29kaW5nPVVURi04CisJCWxhcHBlbmQgc3BlbGxfY21kIHBpcGUKKwkJX2Nvbm5lY3QgJHRoaXMgW29wZW4gJHNwZWxsX2NtZCByK10KKwl9CisJcmV0dXJuICRzX2xhbmcKK30KKworbWV0aG9kIHZlcnNpb24ge30geworCWlmIHskc192ZXJzaW9uIG5lIHt9fSB7CisJCXJldHVybiAiJHNfdmVyc2lvbiwgJHNfbGFuZyIKKwl9CisJcmV0dXJuIHt9Cit9CisKK21ldGhvZCBzdG9wIHt9IHsKKwl3aGlsZSB7JHNfbWVudWlkeCA+IDB9IHsKKwkJJHdfbWVudSBkZWxldGUgMAorCQlpbmNyIHNfbWVudWlkeCAtMQorCX0KKwkkd190ZXh0IHRhZyBkZWxldGUgbWlzc3BlbGxlZAorCisJY2F0Y2gge2Nsb3NlICRzX2ZkfQorCWNhdGNoIHthZnRlciBjYW5jZWwgJHNfaX0KKwlzZXQgc19mZCB7fQorCXNldCBzX2kge30KKwlzZXQgc19sYW5nIHt9Cit9CisKK21ldGhvZCBfcG9wdXBfc3VnZ2VzdCB7WCBZIHBvc30geworCXdoaWxlIHskc19tZW51aWR4ID4gMH0geworCQkkd19tZW51IGRlbGV0ZSAwCisJCWluY3Igc19tZW51aWR4IC0xCisJfQorCisJc2V0IGJfbG9jIFskd190ZXh0IGluZGV4ICIkcG9zIHdvcmRzdGFydCJdCisJc2V0IGVfbG9jIFtfd29yZGVuZCAkdGhpcyAkYl9sb2NdCisJc2V0IG9yaWcgIFskd190ZXh0IGdldCAkYl9sb2MgJGVfbG9jXQorCXNldCB0YWdzICBbJHdfdGV4dCB0YWcgbmFtZXMgJGJfbG9jXQorCisJaWYge1tsc2VhcmNoIC1leGFjdCAkdGFncyBtaXNzcGVsbGVkXSA+PSAwfSB7CisJCWlmIHtbaW5mbyBleGlzdHMgc19zdWdnZXN0KCRvcmlnKV19IHsKKwkJCXNldCBjbnQgMAorCQkJZm9yZWFjaCBzICRzX3N1Z2dlc3QoJG9yaWcpIHsKKwkJCQlpZiB7JGNudCA8IDV9IHsKKwkJCQkJJHdfbWVudSBpbnNlcnQgJHNfbWVudWlkeCBjb21tYW5kIFwKKwkJCQkJCS1sYWJlbCAkcyBcCisJCQkJCQktY29tbWFuZCBbY2IgX3JlcGxhY2UgJGJfbG9jICRlX2xvYyAkc10KKwkJCQkJaW5jciBzX21lbnVpZHgKKwkJCQkJaW5jciBjbnQKKwkJCQl9IGVsc2UgeworCQkJCQlicmVhaworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCSR3X21lbnUgaW5zZXJ0ICRzX21lbnVpZHggY29tbWFuZCBcCisJCQkJLWxhYmVsIFttYyAiTm8gU3VnZ2VzdGlvbnMiXSBcCisJCQkJLXN0YXRlIGRpc2FibGVkCisJCQlpbmNyIHNfbWVudWlkeAorCQl9CisJCSR3X21lbnUgaW5zZXJ0ICRzX21lbnVpZHggc2VwYXJhdG9yCisJCWluY3Igc19tZW51aWR4CisJfQorCisJJHdfdGV4dCBtYXJrIHNldCBzYXZlZC1pbnNlcnQgaW5zZXJ0CisJdGtfcG9wdXAgJHdfbWVudSAkWCAkWQorfQorCittZXRob2QgX3JlcGxhY2Uge2JfbG9jIGVfbG9jIHdvcmR9IHsKKwkkd190ZXh0IGNvbmZpZ3VyZSAtYXV0b3NlcGFyYXRvcnMgMAorCSR3X3RleHQgZWRpdCBzZXBhcmF0b3IKKworCSR3X3RleHQgZGVsZXRlICRiX2xvYyAkZV9sb2MKKwkkd190ZXh0IGluc2VydCAkYl9sb2MgJHdvcmQKKworCSR3X3RleHQgZWRpdCBzZXBhcmF0b3IKKwkkd190ZXh0IGNvbmZpZ3VyZSAtYXV0b3NlcGFyYXRvcnMgMQorCSR3X3RleHQgbWFyayBzZXQgaW5zZXJ0IHNhdmVkLWluc2VydAorfQorCittZXRob2QgX3Jlc3RhcnRfdGltZXIge30geworCXNldCBzX2kgW2FmdGVyIDMwMCBbY2IgX3J1bl1dCit9CisKK3Byb2MgX21hdGNoX2xlbmd0aCB7bWF4X2xpbmUgYXJyX25hbWV9IHsKKwl1cHZhciAkYXJyX25hbWUgYQorCisJaWYge1tsbGVuZ3RoICRhXSA+ICRtYXhfbGluZX0geworCQlzZXQgYSBbbHJhbmdlICRhIDAgJG1heF9saW5lXQorCX0KKwl3aGlsZSB7W2xsZW5ndGggJGFdIDw9ICRtYXhfbGluZX0geworCQlsYXBwZW5kIGEge30KKwl9Cit9CisKK21ldGhvZCBfd29yZGVuZCB7cG9zfSB7CisJc2V0IHBvcyAgWyR3X3RleHQgaW5kZXggIiRwb3Mgd29yZGVuZCJdCisJc2V0IHRhZ3MgWyR3X3RleHQgdGFnIG5hbWVzICRwb3NdCisJd2hpbGUge1tsc2VhcmNoIC1leGFjdCAkdGFncyBtaXNzcGVsbGVkXSA+PSAwfSB7CisJCXNldCBwb3MgIFskd190ZXh0IGluZGV4ICIkcG9zICsxYyJdCisJCXNldCB0YWdzIFskd190ZXh0IHRhZyBuYW1lcyAkcG9zXQorCX0KKwlyZXR1cm4gJHBvcworfQorCittZXRob2QgX3J1biB7fSB7CisJc2V0IGN1cl9wb3MgIFskd190ZXh0IGluZGV4IHtpbnNlcnQgLTFjfV0KKwlzZXQgY3VyX2xpbmUgW2xpbmRleCBbc3BsaXQgJGN1cl9wb3MgLl0gMF0KKwlzZXQgbWF4X2xpbmUgW2xpbmRleCBbc3BsaXQgWyR3X3RleHQgaW5kZXggZW5kXSAuXSAwXQorCV9tYXRjaF9sZW5ndGggJG1heF9saW5lIHNfc2VlbgorCV9tYXRjaF9sZW5ndGggJG1heF9saW5lIHNfY2hlY2tlZAorCisJIyBOb3RoaW5nIGluIHRoZSBtZXNzYWdlIGJ1ZmZlcj8gIE5vdGhpbmcgdG8gc3BlbGxjaGVjay4KKwkjCisJaWYgeyRjdXJfbGluZSA9PSAxCisJICYmICRtYXhfbGluZSA9PSAyCisJICYmIFskd190ZXh0IGdldCAxLjAgZW5kXSBlcSAiXG4ifSB7CisJCWFycmF5IHVuc2V0IHNfc3VnZ2VzdAorCQlfcmVzdGFydF90aW1lciAkdGhpcworCQlyZXR1cm4KKwl9CisKKwlzZXQgYWN0aXZlIDAKKwlmb3Ige3NldCBuIDF9IHskbiA8PSAkbWF4X2xpbmV9IHtpbmNyIG59IHsKKwkJc2V0IHMgWyR3X3RleHQgZ2V0ICIkbi4wIiAiJG4uZW5kIl0KKworCQkjIERvbid0IHNwZWxsY2hlY2sgdGhlIGN1cnJlbnQgbGluZSB1bmxlc3Mgd2UgYXJlIGF0CisJCSMgYSB3b3JkIGJvdW5kYXJ5LiAgVGhlIHVzZXIgbWlnaHQgYmUgdHlwaW5nIG9uIGl0LgorCQkjCisJCWlmIHskbiA9PSAkY3VyX2xpbmUKKwkJICYmICFbcmVnZXhwIHteXFckfSBbJHdfdGV4dCBnZXQgJGN1cl9wb3MgaW5zZXJ0XV19IHsKKworCQkJIyBJZiB0aGUgY3VycmVudCB3b3JkIGlzIG1pc3BlbGxlZCByZW1vdmUgdGhlIHRhZworCQkJIyBidXQgZm9yY2UgYSBzcGVsbGNoZWNrIGxhdGVyLgorCQkJIworCQkJc2V0IHRhZ3MgWyR3X3RleHQgdGFnIG5hbWVzICRjdXJfcG9zXQorCQkJaWYge1tsc2VhcmNoIC1leGFjdCAkdGFncyBtaXNzcGVsbGVkXSA+PSAwfSB7CisJCQkJJHdfdGV4dCB0YWcgcmVtb3ZlIG1pc3NwZWxsZWQgXAorCQkJCQkiJGN1cl9wb3Mgd29yZHN0YXJ0IiBcCisJCQkJCVtfd29yZGVuZCAkdGhpcyAkY3VyX3Bvc10KKwkJCQlsc2V0IHNfc2VlbiAgICAkbiAkcworCQkJCWxzZXQgc19jaGVja2VkICRuIHt9CisJCQl9CisKKwkJCWNvbnRpbnVlCisJCX0KKworCQlpZiB7W2xpbmRleCAkc19zZWVuICAgICRuXSBlcSAkcworCQkgJiYgW2xpbmRleCAkc19jaGVja2VkICRuXSBuZSAkc30geworCQkJIyBEb24ndCBzZW5kIGVtcHR5IGxpbmVzIHRvIEFzcGVsbCBpdCBkb2Vzbid0IGNoZWNrIHRoZW0uCisJCQkjCisJCQlpZiB7JHMgZXEge319IHsKKwkJCQlsc2V0IHNfY2hlY2tlZCAkbiAkcworCQkJCWNvbnRpbnVlCisJCQl9CisKKwkJCSMgRG9uJ3Qgc2VuZCB0eXBpY2FsIHMtYi1vIGxpbmVzIGFzIHRoZSBlbWFpbHMgYXJlCisJCQkjIGFsbW9zdCBhbHdheXMgbWlzc3BlbGxlZCBhY2NvcmRpbmcgdG8gQXNwZWxsLgorCQkJIworCQkJaWYge1tyZWdleHAgLW5vY2FzZSB7XlthLXotXSstYnk6Lio8LipALio+JH0gJHNdfSB7CisJCQkJJHdfdGV4dCB0YWcgcmVtb3ZlIG1pc3NwZWxsZWQgIiRuLjAiICIkbi5lbmQiCisJCQkJbHNldCBzX2NoZWNrZWQgJG4gJHMKKwkJCQljb250aW51ZQorCQkJfQorCisJCQlwdXRzICRzX2ZkIF4kcworCQkJbGFwcGVuZCBzX3BlbmRpbmcgW2xpc3QgJG4gJHNdCisJCQlzZXQgYWN0aXZlIDEKKwkJfSBlbHNlIHsKKwkJCSMgRGVsYXkgdW50aWwgYW5vdGhlciBpZGxlIGxvb3AgdG8gbWFrZSBzdXJlIHdlIGRvbid0CisJCQkjIHNwZWxsY2hlY2sgbGluZXMgdGhlIHVzZXIgaXMgYWN0aXZlbHkgY2hhbmdpbmcuCisJCQkjCisJCQlsc2V0IHNfc2VlbiAkbiAkcworCQl9CisJfQorCisJaWYgeyRhY3RpdmV9IHsKKwkJc2V0IHNfY2xlYXIgMQorCQlmbHVzaCAkc19mZAorCX0gZWxzZSB7CisJCV9yZXN0YXJ0X3RpbWVyICR0aGlzCisJfQorfQorCittZXRob2QgX3JlYWQge30geworCXdoaWxlIHtbZ2V0cyAkc19mZCBsaW5lXSA+PSAwfSB7CisJCXNldCBsaW5lbm8gW2xpbmRleCAkc19wZW5kaW5nIDAgMF0KKworCQlpZiB7JHNfY2xlYXJ9IHsKKwkJCSR3X3RleHQgdGFnIHJlbW92ZSBtaXNzcGVsbGVkICIkbGluZW5vLjAiICIkbGluZW5vLmVuZCIKKwkJCXNldCBzX2NsZWFyIDAKKwkJfQorCisJCWlmIHskbGluZSBlcSB7fX0geworCQkJbHNldCBzX2NoZWNrZWQgJGxpbmVubyBbbGluZGV4ICRzX3BlbmRpbmcgMCAxXQorCQkJc2V0IHNfcGVuZGluZyBbbHJhbmdlICRzX3BlbmRpbmcgMSBlbmRdCisJCQlzZXQgc19jbGVhciAxCisJCQljb250aW51ZQorCQl9CisKKwkJc2V0IHN1Z2cgW2xpc3RdCisJCXN3aXRjaCAtLSBbc3RyaW5nIHJhbmdlICRsaW5lIDAgMV0geworCQl7JiB9IHsKKwkJCXNldCBsaW5lIFtzcGxpdCBbc3RyaW5nIHJhbmdlICRsaW5lIDIgZW5kXSA6XQorCQkJc2V0IGluZm8gW3NwbGl0IFtsaW5kZXggJGxpbmUgMF0geyB9XQorCQkJc2V0IG9yaWcgW2xpbmRleCAkaW5mbyAwXQorCQkJc2V0IG9mZnMgW2xpbmRleCAkaW5mbyAyXQorCQkJZm9yZWFjaCBzIFtzcGxpdCBbbGluZGV4ICRsaW5lIDFdICxdIHsKKwkJCQlsYXBwZW5kIHN1Z2cgW3N0cmluZyByYW5nZSAkcyAxIGVuZF0KKwkJCX0KKwkJfQorCQl7IyB9IHsKKwkJCXNldCBpbmZvIFtzcGxpdCBbc3RyaW5nIHJhbmdlICRsaW5lIDIgZW5kXSB7IH1dCisJCQlzZXQgb3JpZyBbbGluZGV4ICRpbmZvIDBdCisJCQlzZXQgb2ZmcyBbbGluZGV4ICRpbmZvIDFdCisJCX0KKwkJZGVmYXVsdCB7CisJCQlwdXRzIHN0ZGVyciAiPHNwZWxsPiAkbGluZSIKKwkJCWNvbnRpbnVlCisJCX0KKwkJfQorCisJCWluY3Igb2ZmcyAtMQorCQlzZXQgYl9sb2MgIiRsaW5lbm8uJG9mZnMiCisJCXNldCBlX2xvYyBbJHdfdGV4dCBpbmRleCAiJGxpbmVuby4kb2ZmcyB3b3JkZW5kIl0KKwkJc2V0IGN1cnIgWyR3X3RleHQgZ2V0ICRiX2xvYyAkZV9sb2NdCisKKwkJIyBBdCBsZWFzdCBmb3IgRW5nbGlzaCBjdXJyID0gImJvYiIsIG9yaWcgPSAiYm9iJ3MiCisJCSMgc28gVGsgZGlkbid0IGluY2x1ZGUgdGhlICdzIGJ1dCBBc3BlbGwgZGlkLiAgV2UKKwkJIyB0cnkgdG8gcm91bmQgb3V0IHRoZSB3b3JkLgorCQkjCisJCXdoaWxlIHskY3VyciBuZSAkb3JpZworCQkgJiYgW3N0cmluZyBlcXVhbCAtbGVuZ3RoIFtzdHJpbmcgbGVuZ3RoICRjdXJyXSAkY3VyciAkb3JpZ119IHsKKwkJCXNldCBuX2xvYyAgWyR3X3RleHQgaW5kZXggIiRlX2xvYyArMWMiXQorCQkJc2V0IG5fY3VyciBbJHdfdGV4dCBnZXQgJGJfbG9jICRuX2xvY10KKwkJCWlmIHskbl9jdXJyIGVxICRjdXJyfSB7CisJCQkJYnJlYWsKKwkJCX0KKwkJCXNldCBjdXJyICAkbl9jdXJyCisJCQlzZXQgZV9sb2MgJG5fbG9jCisJCX0KKworCQlpZiB7JGN1cnIgZXEgJG9yaWd9IHsKKwkJCSR3X3RleHQgdGFnIGFkZCBtaXNzcGVsbGVkICRiX2xvYyAkZV9sb2MKKwkJCWlmIHtbbGxlbmd0aCAkc3VnZ10gPiAwfSB7CisJCQkJc2V0IHNfc3VnZ2VzdCgkb3JpZykgJHN1Z2cKKwkJCX0gZWxzZSB7CisJCQkJdW5zZXQgLW5vY29tcGxhaW4gc19zdWdnZXN0KCRvcmlnKQorCQkJfQorCQl9IGVsc2UgeworCQkJdW5zZXQgLW5vY29tcGxhaW4gc19zdWdnZXN0KCRvcmlnKQorCQl9CisJfQorCisJZmNvbmZpZ3VyZSAkc19mZCAtYmxvY2sgMQorCWlmIHtbZW9mICRzX2ZkXX0geworCQlpZiB7IVtjYXRjaCB7Y2xvc2UgJHNfZmR9IGVycl19IHsKKwkJCXNldCBlcnIgW21jICJVbmV4cGVjdGVkIEVPRiBmcm9tIHNwZWxsIGNoZWNrZXIiXQorCQl9CisJCWNhdGNoIHthZnRlciBjYW5jZWwgJHNfaX0KKwkJJHdfdGV4dCB0YWcgcmVtb3ZlIG1pc3NwZWxsZWQgMS4wIGVuZAorCQllcnJvcl9wb3B1cCBbc3RyY2F0IFttYyAiU3BlbGwgQ2hlY2tlciBGYWlsZWQiXSAiXG5cbiIgJGVycl0KKwkJcmV0dXJuCisJfQorCWZjb25maWd1cmUgJHNfZmQgLWJsb2NrIDAKKworCWlmIHtbbGxlbmd0aCAkc19wZW5kaW5nXSA9PSAwfSB7CisJCV9yZXN0YXJ0X3RpbWVyICR0aGlzCisJfQorfQorCitwcm9jIGF2YWlsYWJsZV9sYW5ncyB7fSB7CisJc2V0IGxhbmdzIFtsaXN0XQorCWNhdGNoIHsKKwkJc2V0IGZkIFtvcGVuIFtsaXN0IHwgYXNwZWxsIGR1bXAgZGljdHNdIHJdCisJCXdoaWxlIHtbZ2V0cyAkZmQgbGluZV0gPj0gMH0geworCQkJaWYgeyRsaW5lIGVxIHt9fSBjb250aW51ZQorCQkJbGFwcGVuZCBsYW5ncyAkbGluZQorCQl9CisJCWNsb3NlICRmZAorCX0KKwlyZXR1cm4gJGxhbmdzCit9CisKK30KZGlmZiAtLWdpdCBhL2dpdC1ndWkvbGliL3N0YXR1c19iYXIudGNsIGIvZ2l0LWd1aS9saWIvc3RhdHVzX2Jhci50Y2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFkNDE3NwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvbGliL3N0YXR1c19iYXIudGNsCkBAIC0wLDAgKzEsMTI3IEBACisjIGdpdC1ndWkgc3RhdHVzIGJhciBtZWdhLXdpZGdldAorIyBDb3B5cmlnaHQgKEMpIDIwMDcgU2hhd24gUGVhcmNlCisKK2NsYXNzIHN0YXR1c19iYXIgeworCitmaWVsZCB3ICAgICAgICAgOyAjIG91ciBvd24gd2luZG93IHBhdGgKK2ZpZWxkIHdfbCAgICAgICA7ICMgdGV4dCB3aWRnZXQgd2UgZHJhdyBtZXNzYWdlcyBpbnRvCitmaWVsZCB3X2MgICAgICAgOyAjIGNhbnZhcyB3ZSBkcmF3IGEgcHJvZ3Jlc3MgYmFyIGludG8KK2ZpZWxkIGNfcGFjayAgICA7ICMgc2NyaXB0IHRvIHBhY2sgdGhlIGNhbnZhcyB3aXRoCitmaWVsZCBzdGF0dXMgIHt9OyAjIHNpbmdsZSBsaW5lIG9mIHRleHQgd2Ugc2hvdworZmllbGQgcHJlZml4ICB7fTsgIyB0ZXh0IHdlIGZvcm1hdCBpbnRvIHN0YXR1cworZmllbGQgdW5pdHMgICB7fTsgIyB1bml0IG9mIHByb2dyZXNzCitmaWVsZCBtZXRlciAgIHt9OyAjIGN1cnJlbnQgY29yZSBnaXQgcHJvZ3Jlc3MgbWV0ZXIgKGlmIGFjdGl2ZSkKKworY29uc3RydWN0b3IgbmV3IHtwYXRofSB7CisJc2V0IHcgJHBhdGgKKwlzZXQgd19sICR3LmwKKwlzZXQgd19jICR3LmMKKworCWZyYW1lICR3IFwKKwkJLWJvcmRlcndpZHRoIDEgXAorCQktcmVsaWVmIHN1bmtlbgorCWxhYmVsICR3X2wgXAorCQktdGV4dHZhcmlhYmxlIEBzdGF0dXMgXAorCQktYW5jaG9yIHcgXAorCQktanVzdGlmeSBsZWZ0CisJcGFjayAkd19sIC1zaWRlIGxlZnQKKwlzZXQgY19wYWNrIFtjYiBfb25lbGluZV9wYWNrXQorCisJYmluZCAkdyA8RGVzdHJveT4gW2NiIF9kZWxldGUgJVddCisJcmV0dXJuICR0aGlzCit9CisKK21ldGhvZCBfb25lbGluZV9wYWNrIHt9IHsKKwkkd19jIGNvbmYgLXdpZHRoIDEwMAorCXBhY2sgJHdfYyAtc2lkZSByaWdodAorfQorCitjb25zdHJ1Y3RvciB0d29fbGluZSB7cGF0aH0geworCXNldCB3ICRwYXRoCisJc2V0IHdfbCAkdy5sCisJc2V0IHdfYyAkdy5jCisKKwlmcmFtZSAkdworCWxhYmVsICR3X2wgXAorCQktdGV4dHZhcmlhYmxlIEBzdGF0dXMgXAorCQktYW5jaG9yIHcgXAorCQktanVzdGlmeSBsZWZ0CisJcGFjayAkd19sIC1hbmNob3IgdyAtZmlsbCB4CisJc2V0IGNfcGFjayBbbGlzdCBwYWNrICR3X2MgLWZpbGwgeF0KKworCWJpbmQgJHcgPERlc3Ryb3k+IFtjYiBfZGVsZXRlICVXXQorCXJldHVybiAkdGhpcworfQorCittZXRob2Qgc3RhcnQge21zZyB1ZHN9IHsKKwlpZiB7W3dpbmZvIGV4aXN0cyAkd19jXX0geworCQkkd19jIGNvb3JkcyBiYXIgMCAwIDAgMjAKKwl9IGVsc2UgeworCQljYW52YXMgJHdfYyBcCisJCQktaGVpZ2h0IFtleHByIHtpbnQoW3dpbmZvIHJlcWhlaWdodCAkd19sXSAqIDAuNil9XSBcCisJCQktYm9yZGVyd2lkdGggMSBcCisJCQktcmVsaWVmIGdyb292ZSBcCisJCQktaGlnaGxpZ2h0dCAwCisJCSR3X2MgY3JlYXRlIHJlY3RhbmdsZSAwIDAgMCAyMCAtdGFncyBiYXIgLWZpbGwgbmF2eQorCQlldmFsICRjX3BhY2sKKwl9CisKKwlzZXQgc3RhdHVzICRtc2cKKwlzZXQgcHJlZml4ICRtc2cKKwlzZXQgdW5pdHMgICR1ZHMKKwlzZXQgbWV0ZXIgIHt9Cit9CisKK21ldGhvZCB1cGRhdGUge2hhdmUgdG90YWx9IHsKKwlzZXQgcGRvbmUgMAorCWlmIHskdG90YWwgPiAwfSB7CisJCXNldCBwZG9uZSBbZXhwciB7MTAwICogJGhhdmUgLyAkdG90YWx9XQorCQlzZXQgY2RvbmUgW2V4cHIge1t3aW5mbyB3aWR0aCAkd19jXSAqICRoYXZlIC8gJHRvdGFsfV0KKwl9CisKKwlzZXQgcHJlYyBbc3RyaW5nIGxlbmd0aCBbZm9ybWF0ICVpICR0b3RhbF1dCisJc2V0IHN0YXR1cyBbbWMgIiVzIC4uLiAlKmkgb2YgJSppICVzICglM2klJSkiIFwKKwkJJHByZWZpeCBcCisJCSRwcmVjICRoYXZlIFwKKwkJJHByZWMgJHRvdGFsIFwKKwkJJHVuaXRzICRwZG9uZV0KKwkkd19jIGNvb3JkcyBiYXIgMCAwICRjZG9uZSAyMAorfQorCittZXRob2QgdXBkYXRlX21ldGVyIHtidWZ9IHsKKwlhcHBlbmQgbWV0ZXIgJGJ1ZgorCXNldCByIFtzdHJpbmcgbGFzdCAiXHIiICRtZXRlcl0KKwlpZiB7JHIgPT0gLTF9IHsKKwkJcmV0dXJuCisJfQorCisJc2V0IHByaW9yIFtzdHJpbmcgcmFuZ2UgJG1ldGVyIDAgJHJdCisJc2V0IG1ldGVyIFtzdHJpbmcgcmFuZ2UgJG1ldGVyIFtleHByIHskciArIDF9XSBlbmRdCisJc2V0IHAgIlxcKChcXGQrKS8oXFxkKylcXCkiCisJaWYge1tyZWdleHAgIjpcXHMqXFxkKyUgJHBcKD86LCBkb25lLlxccypcbnxcXHMqXHIpXCQiICRwcmlvciBfaiBhIGJdfSB7CisJCXVwZGF0ZSAkdGhpcyAkYSAkYgorCX0gZWxzZWlmIHtbcmVnZXhwICIkcFxccytkb25lXHJcJCIgJHByaW9yIF9qIGEgYl19IHsKKwkJdXBkYXRlICR0aGlzICRhICRiCisJfQorfQorCittZXRob2Qgc3RvcCB7e21zZyB7fX19IHsKKwlkZXN0cm95ICR3X2MKKwlpZiB7JG1zZyBuZSB7fX0geworCQlzZXQgc3RhdHVzICRtc2cKKwl9Cit9CisKK21ldGhvZCBzaG93IHttc2cge3Rlc3Qge319fSB7CisJaWYgeyR0ZXN0IGVxIHt9IHx8ICRzdGF0dXMgZXEgJHRlc3R9IHsKKwkJc2V0IHN0YXR1cyAkbXNnCisJfQorfQorCittZXRob2QgX2RlbGV0ZSB7Y3VycmVudH0geworCWlmIHskY3VycmVudCBlcSAkd30geworCQlkZWxldGVfdGhpcworCX0KK30KKworfQpkaWZmIC0tZ2l0IGEvZ2l0LWd1aS9saWIvdHJhbnNwb3J0LnRjbCBiL2dpdC1ndWkvbGliL3RyYW5zcG9ydC50Y2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU2YTlkMAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvbGliL3RyYW5zcG9ydC50Y2wKQEAgLTAsMCArMSwxODQgQEAKKyMgZ2l0LWd1aSB0cmFuc3BvcnQgKGZldGNoL3B1c2gpIHN1cHBvcnQKKyMgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IFNoYXduIFBlYXJjZQorCitwcm9jIGZldGNoX2Zyb20ge3JlbW90ZX0geworCXNldCB3IFtjb25zb2xlOjpuZXcgXAorCQlbbWMgImZldGNoICVzIiAkcmVtb3RlXSBcCisJCVttYyAiRmV0Y2hpbmcgbmV3IGNoYW5nZXMgZnJvbSAlcyIgJHJlbW90ZV1dCisJc2V0IGNtZHMgW2xpc3RdCisJbGFwcGVuZCBjbWRzIFtsaXN0IGV4ZWMgZ2l0IGZldGNoICRyZW1vdGVdCisJaWYge1tpc19jb25maWdfdHJ1ZSBndWkucHJ1bmVkdXJpbmdmZXRjaF19IHsKKwkJbGFwcGVuZCBjbWRzIFtsaXN0IGV4ZWMgZ2l0IHJlbW90ZSBwcnVuZSAkcmVtb3RlXQorCX0KKwljb25zb2xlOjpjaGFpbiAkdyAkY21kcworfQorCitwcm9jIHBydW5lX2Zyb20ge3JlbW90ZX0geworCXNldCB3IFtjb25zb2xlOjpuZXcgXAorCQlbbWMgInJlbW90ZSBwcnVuZSAlcyIgJHJlbW90ZV0gXAorCQlbbWMgIlBydW5pbmcgdHJhY2tpbmcgYnJhbmNoZXMgZGVsZXRlZCBmcm9tICVzIiAkcmVtb3RlXV0KKwljb25zb2xlOjpleGVjICR3IFtsaXN0IGdpdCByZW1vdGUgcHJ1bmUgJHJlbW90ZV0KK30KKworcHJvYyBwdXNoX3RvIHtyZW1vdGV9IHsKKwlzZXQgdyBbY29uc29sZTo6bmV3IFwKKwkJW21jICJwdXNoICVzIiAkcmVtb3RlXSBcCisJCVttYyAiUHVzaGluZyBjaGFuZ2VzIHRvICVzIiAkcmVtb3RlXV0KKwlzZXQgY21kIFtsaXN0IGdpdCBwdXNoXQorCWxhcHBlbmQgY21kIC12CisJbGFwcGVuZCBjbWQgJHJlbW90ZQorCWNvbnNvbGU6OmV4ZWMgJHcgJGNtZAorfQorCitwcm9jIHN0YXJ0X3B1c2hfYW55d2hlcmVfYWN0aW9uIHt3fSB7CisJZ2xvYmFsIHB1c2hfdXJsdHlwZSBwdXNoX3JlbW90ZSBwdXNoX3VybCBwdXNoX3RoaW4gcHVzaF90YWdzCisJZ2xvYmFsIHB1c2hfZm9yY2UKKworCXNldCByX3VybCB7fQorCXN3aXRjaCAtLSAkcHVzaF91cmx0eXBlIHsKKwlyZW1vdGUge3NldCByX3VybCAkcHVzaF9yZW1vdGV9CisJdXJsIHtzZXQgcl91cmwgJHB1c2hfdXJsfQorCX0KKwlpZiB7JHJfdXJsIGVxIHt9fSByZXR1cm4KKworCXNldCBjbWQgW2xpc3QgZ2l0IHB1c2hdCisJbGFwcGVuZCBjbWQgLXYKKwlpZiB7JHB1c2hfdGhpbn0geworCQlsYXBwZW5kIGNtZCAtLXRoaW4KKwl9CisJaWYgeyRwdXNoX2ZvcmNlfSB7CisJCWxhcHBlbmQgY21kIC0tZm9yY2UKKwl9CisJaWYgeyRwdXNoX3RhZ3N9IHsKKwkJbGFwcGVuZCBjbWQgLS10YWdzCisJfQorCWxhcHBlbmQgY21kICRyX3VybAorCXNldCBjbnQgMAorCWZvcmVhY2ggaSBbJHcuc291cmNlLmwgY3Vyc2VsZWN0aW9uXSB7CisJCXNldCBiIFskdy5zb3VyY2UubCBnZXQgJGldCisJCWxhcHBlbmQgY21kICJyZWZzL2hlYWRzLyRiOnJlZnMvaGVhZHMvJGIiCisJCWluY3IgY250CisJfQorCWlmIHskY250ID09IDB9IHsKKwkJcmV0dXJuCisJfSBlbHNlaWYgeyRjbnQgPT0gMX0geworCQlzZXQgdW5pdCBicmFuY2gKKwl9IGVsc2UgeworCQlzZXQgdW5pdCBicmFuY2hlcworCX0KKworCXNldCBjb25zIFtjb25zb2xlOjpuZXcgXAorCQlbbWMgInB1c2ggJXMiICRyX3VybF0gXAorCQlbbWMgIlB1c2hpbmcgJXMgJXMgdG8gJXMiICRjbnQgJHVuaXQgJHJfdXJsXV0KKwljb25zb2xlOjpleGVjICRjb25zICRjbWQKKwlkZXN0cm95ICR3Cit9CisKK3RyYWNlIGFkZCB2YXJpYWJsZSBwdXNoX3JlbW90ZSB3cml0ZSBcCisJW2xpc3QgcmFkaW9fc2VsZWN0b3IgcHVzaF91cmx0eXBlIHJlbW90ZV0KKworcHJvYyBkb19wdXNoX2FueXdoZXJlIHt9IHsKKwlnbG9iYWwgYWxsX3JlbW90ZXMgY3VycmVudF9icmFuY2gKKwlnbG9iYWwgcHVzaF91cmx0eXBlIHB1c2hfcmVtb3RlIHB1c2hfdXJsIHB1c2hfdGhpbiBwdXNoX3RhZ3MKKwlnbG9iYWwgcHVzaF9mb3JjZQorCisJc2V0IHcgLnB1c2hfc2V0dXAKKwl0b3BsZXZlbCAkdworCXdtIGdlb21ldHJ5ICR3ICIrW3dpbmZvIHJvb3R4IC5dK1t3aW5mbyByb290eSAuXSIKKworCWxhYmVsICR3LmhlYWRlciAtdGV4dCBbbWMgIlB1c2ggQnJhbmNoZXMiXSAtZm9udCBmb250X3VpYm9sZAorCXBhY2sgJHcuaGVhZGVyIC1zaWRlIHRvcCAtZmlsbCB4CisKKwlmcmFtZSAkdy5idXR0b25zCisJYnV0dG9uICR3LmJ1dHRvbnMuY3JlYXRlIC10ZXh0IFttYyBQdXNoXSBcCisJCS1kZWZhdWx0IGFjdGl2ZSBcCisJCS1jb21tYW5kIFtsaXN0IHN0YXJ0X3B1c2hfYW55d2hlcmVfYWN0aW9uICR3XQorCXBhY2sgJHcuYnV0dG9ucy5jcmVhdGUgLXNpZGUgcmlnaHQKKwlidXR0b24gJHcuYnV0dG9ucy5jYW5jZWwgLXRleHQgW21jICJDYW5jZWwiXSBcCisJCS1kZWZhdWx0IG5vcm1hbCBcCisJCS1jb21tYW5kIFtsaXN0IGRlc3Ryb3kgJHddCisJcGFjayAkdy5idXR0b25zLmNhbmNlbCAtc2lkZSByaWdodCAtcGFkeCA1CisJcGFjayAkdy5idXR0b25zIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDEwIC1wYWR4IDEwCisKKwlsYWJlbGZyYW1lICR3LnNvdXJjZSAtdGV4dCBbbWMgIlNvdXJjZSBCcmFuY2hlcyJdCisJbGlzdGJveCAkdy5zb3VyY2UubCBcCisJCS1oZWlnaHQgMTAgXAorCQktd2lkdGggNzAgXAorCQktc2VsZWN0bW9kZSBleHRlbmRlZCBcCisJCS15c2Nyb2xsY29tbWFuZCBbbGlzdCAkdy5zb3VyY2Uuc2J5IHNldF0KKwlmb3JlYWNoIGggW2xvYWRfYWxsX2hlYWRzXSB7CisJCSR3LnNvdXJjZS5sIGluc2VydCBlbmQgJGgKKwkJaWYgeyRoIGVxICRjdXJyZW50X2JyYW5jaH0geworCQkJJHcuc291cmNlLmwgc2VsZWN0IHNldCBlbmQKKwkJfQorCX0KKwlzY3JvbGxiYXIgJHcuc291cmNlLnNieSAtY29tbWFuZCBbbGlzdCAkdy5zb3VyY2UubCB5dmlld10KKwlwYWNrICR3LnNvdXJjZS5zYnkgLXNpZGUgcmlnaHQgLWZpbGwgeQorCXBhY2sgJHcuc291cmNlLmwgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQorCXBhY2sgJHcuc291cmNlIC1maWxsIGJvdGggLWV4cGFuZCAxIC1wYWR5IDUgLXBhZHggNQorCisJbGFiZWxmcmFtZSAkdy5kZXN0IC10ZXh0IFttYyAiRGVzdGluYXRpb24gUmVwb3NpdG9yeSJdCisJaWYgeyRhbGxfcmVtb3RlcyBuZSB7fX0geworCQlyYWRpb2J1dHRvbiAkdy5kZXN0LnJlbW90ZV9yIFwKKwkJCS10ZXh0IFttYyAiUmVtb3RlOiJdIFwKKwkJCS12YWx1ZSByZW1vdGUgXAorCQkJLXZhcmlhYmxlIHB1c2hfdXJsdHlwZQorCQlldmFsIHRrX29wdGlvbk1lbnUgJHcuZGVzdC5yZW1vdGVfbSBwdXNoX3JlbW90ZSAkYWxsX3JlbW90ZXMKKwkJZ3JpZCAkdy5kZXN0LnJlbW90ZV9yICR3LmRlc3QucmVtb3RlX20gLXN0aWNreSB3CisJCWlmIHtbbHNlYXJjaCAtc29ydGVkIC1leGFjdCAkYWxsX3JlbW90ZXMgb3JpZ2luXSAhPSAtMX0geworCQkJc2V0IHB1c2hfcmVtb3RlIG9yaWdpbgorCQl9IGVsc2UgeworCQkJc2V0IHB1c2hfcmVtb3RlIFtsaW5kZXggJGFsbF9yZW1vdGVzIDBdCisJCX0KKwkJc2V0IHB1c2hfdXJsdHlwZSByZW1vdGUKKwl9IGVsc2UgeworCQlzZXQgcHVzaF91cmx0eXBlIHVybAorCX0KKwlyYWRpb2J1dHRvbiAkdy5kZXN0LnVybF9yIFwKKwkJLXRleHQgW21jICJBcmJpdHJhcnkgVVJMOiJdIFwKKwkJLXZhbHVlIHVybCBcCisJCS12YXJpYWJsZSBwdXNoX3VybHR5cGUKKwllbnRyeSAkdy5kZXN0LnVybF90IFwKKwkJLWJvcmRlcndpZHRoIDEgXAorCQktcmVsaWVmIHN1bmtlbiBcCisJCS13aWR0aCA1MCBcCisJCS10ZXh0dmFyaWFibGUgcHVzaF91cmwgXAorCQktdmFsaWRhdGUga2V5IFwKKwkJLXZhbGlkYXRlY29tbWFuZCB7CisJCQlpZiB7JWQgPT0gMSAmJiBbcmVnZXhwIHtcc30gJVNdfSB7cmV0dXJuIDB9CisJCQlpZiB7JWQgPT0gMSAmJiBbc3RyaW5nIGxlbmd0aCAlU10gPiAwfSB7CisJCQkJc2V0IHB1c2hfdXJsdHlwZSB1cmwKKwkJCX0KKwkJCXJldHVybiAxCisJCX0KKwlncmlkICR3LmRlc3QudXJsX3IgJHcuZGVzdC51cmxfdCAtc3RpY2t5IHdlIC1wYWR4IHswIDV9CisJZ3JpZCBjb2x1bW5jb25maWd1cmUgJHcuZGVzdCAxIC13ZWlnaHQgMQorCXBhY2sgJHcuZGVzdCAtYW5jaG9yIG53IC1maWxsIHggLXBhZHkgNSAtcGFkeCA1CisKKwlsYWJlbGZyYW1lICR3Lm9wdGlvbnMgLXRleHQgW21jICJUcmFuc2ZlciBPcHRpb25zIl0KKwljaGVja2J1dHRvbiAkdy5vcHRpb25zLmZvcmNlIFwKKwkJLXRleHQgW21jICJGb3JjZSBvdmVyd3JpdGUgZXhpc3RpbmcgYnJhbmNoIChtYXkgZGlzY2FyZCBjaGFuZ2VzKSJdIFwKKwkJLXZhcmlhYmxlIHB1c2hfZm9yY2UKKwlncmlkICR3Lm9wdGlvbnMuZm9yY2UgLWNvbHVtbnNwYW4gMiAtc3RpY2t5IHcKKwljaGVja2J1dHRvbiAkdy5vcHRpb25zLnRoaW4gXAorCQktdGV4dCBbbWMgIlVzZSB0aGluIHBhY2sgKGZvciBzbG93IG5ldHdvcmsgY29ubmVjdGlvbnMpIl0gXAorCQktdmFyaWFibGUgcHVzaF90aGluCisJZ3JpZCAkdy5vcHRpb25zLnRoaW4gLWNvbHVtbnNwYW4gMiAtc3RpY2t5IHcKKwljaGVja2J1dHRvbiAkdy5vcHRpb25zLnRhZ3MgXAorCQktdGV4dCBbbWMgIkluY2x1ZGUgdGFncyJdIFwKKwkJLXZhcmlhYmxlIHB1c2hfdGFncworCWdyaWQgJHcub3B0aW9ucy50YWdzIC1jb2x1bW5zcGFuIDIgLXN0aWNreSB3CisJZ3JpZCBjb2x1bW5jb25maWd1cmUgJHcub3B0aW9ucyAxIC13ZWlnaHQgMQorCXBhY2sgJHcub3B0aW9ucyAtYW5jaG9yIG53IC1maWxsIHggLXBhZHkgNSAtcGFkeCA1CisKKwlzZXQgcHVzaF91cmwge30KKwlzZXQgcHVzaF9mb3JjZSAwCisJc2V0IHB1c2hfdGhpbiAwCisJc2V0IHB1c2hfdGFncyAwCisKKwliaW5kICR3IDxWaXNpYmlsaXR5PiAiZ3JhYiAkdzsgZm9jdXMgJHcuYnV0dG9ucy5jcmVhdGUiCisJYmluZCAkdyA8S2V5LUVzY2FwZT4gImRlc3Ryb3kgJHciCisJYmluZCAkdyA8S2V5LVJldHVybj4gW2xpc3Qgc3RhcnRfcHVzaF9hbnl3aGVyZV9hY3Rpb24gJHddCisJd20gdGl0bGUgJHcgW2FwcGVuZCAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogIiBbbWMgIlB1c2giXV0KKwl0a3dhaXQgd2luZG93ICR3Cit9CmRpZmYgLS1naXQgYS9naXQtZ3VpL2xpYi93aW4zMi50Y2wgYi9naXQtZ3VpL2xpYi93aW4zMi50Y2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdmOTNkMAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvbGliL3dpbjMyLnRjbApAQCAtMCwwICsxLDI2IEBACisjIGdpdC1ndWkgTWlzYy4gbmF0aXZlIFdpbmRvd3MgMzIgc3VwcG9ydAorIyBDb3B5cmlnaHQgKEMpIDIwMDcgU2hhd24gUGVhcmNlCisKK3Byb2Mgd2luMzJfcmVhZF9sbmsge2xua19wYXRofSB7CisJcmV0dXJuIFtleGVjIGNzY3JpcHQuZXhlIFwKKwkJL0U6anNjcmlwdCBcCisJCS9ub2xvZ28gXAorCQlbZmlsZSBqb2luICQ6Om9ndWlsaWIgd2luMzJfc2hvcnRjdXQuanNdIFwKKwkJJGxua19wYXRoXQorfQorCitwcm9jIHdpbjMyX2NyZWF0ZV9sbmsge2xua19wYXRoIGxua19leGVjIGxua19kaXJ9IHsKKwlnbG9iYWwgb2d1aWxpYgorCisJc2V0IGxua19hcmdzIFtscmFuZ2UgJGxua19leGVjIDEgZW5kXQorCXNldCBsbmtfZXhlYyBbbGluZGV4ICRsbmtfZXhlYyAwXQorCisJZXZhbCBbbGlzdCBleGVjIHdzY3JpcHQuZXhlIFwKKwkJL0U6anNjcmlwdCBcCisJCS9ub2xvZ28gXAorCQlbZmlsZSBqb2luICRvZ3VpbGliIHdpbjMyX3Nob3J0Y3V0LmpzXSBcCisJCSRsbmtfcGF0aCBcCisJCVtmaWxlIGpvaW4gJG9ndWlsaWIgZ2l0LWd1aS5pY29dIFwKKwkJJGxua19kaXIgXAorCQkkbG5rX2V4ZWNdICRsbmtfYXJncworfQpkaWZmIC0tZ2l0IGEvZ2l0LWd1aS9saWIvd2luMzJfc2hvcnRjdXQuanMgYi9naXQtZ3VpL2xpYi93aW4zMl9zaG9ydGN1dC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTc5MjNmCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9saWIvd2luMzJfc2hvcnRjdXQuanMKQEAgLTAsMCArMSwzNCBAQAorLy8gZ2l0LWd1aSBXaW5kb3dzIHNob3J0Y3V0IHN1cHBvcnQKKy8vIENvcHlyaWdodCAoQykgMjAwNyBTaGF3biBQZWFyY2UKKwordmFyIFdzaFNoZWxsID0gV1NjcmlwdC5DcmVhdGVPYmplY3QoIldTY3JpcHQuU2hlbGwiKTsKK3ZhciBhcmd2ID0gV1NjcmlwdC5Bcmd1bWVudHM7Cit2YXIgYXJnaSA9IDA7Cit2YXIgbG5rX3BhdGggPSBhcmd2Lml0ZW0oYXJnaSsrKTsKK3ZhciBpY29fcGF0aCA9IGFyZ2kgPCBhcmd2Lmxlbmd0aCA/IGFyZ3YuaXRlbShhcmdpKyspIDogdW5kZWZpbmVkOwordmFyIGRpcl9wYXRoID0gYXJnaSA8IGFyZ3YubGVuZ3RoID8gYXJndi5pdGVtKGFyZ2krKykgOiB1bmRlZmluZWQ7Cit2YXIgbG5rX2V4ZWMgPSBhcmdpIDwgYXJndi5sZW5ndGggPyBhcmd2Lml0ZW0oYXJnaSsrKSA6IHVuZGVmaW5lZDsKK3ZhciBsbmtfYXJncyA9ICcnOword2hpbGUgKGFyZ2kgPCBhcmd2Lmxlbmd0aCkgeworCXZhciBzID0gYXJndi5pdGVtKGFyZ2krKyk7CisJaWYgKGxua19hcmdzICE9ICcnKQorCQlsbmtfYXJncyArPSAnICc7CisJaWYgKHMuaW5kZXhPZignICcpID49IDApIHsKKwkJbG5rX2FyZ3MgKz0gJyInOworCQlsbmtfYXJncyArPSBzOworCQlsbmtfYXJncyArPSAnIic7CisJfSBlbHNlIHsKKwkJbG5rX2FyZ3MgKz0gczsKKwl9Cit9CisKK3ZhciBsbmsgPSBXc2hTaGVsbC5DcmVhdGVTaG9ydGN1dChsbmtfcGF0aCk7CitpZiAoYXJndi5sZW5ndGggPT0gMSkgeworCVdTY3JpcHQuZWNobyhsbmsuVGFyZ2V0UGF0aCk7Cit9IGVsc2UgeworCWxuay5UYXJnZXRQYXRoID0gbG5rX2V4ZWM7CisJbG5rLkFyZ3VtZW50cyA9IGxua19hcmdzOworCWxuay5JY29uTG9jYXRpb24gPSBpY29fcGF0aCArICIsIDAiOworCWxuay5Xb3JraW5nRGlyZWN0b3J5ID0gZGlyX3BhdGg7CisJbG5rLlNhdmUoKTsKK30KZGlmZiAtLWdpdCBhL2dpdC1ndWkvbWFjb3N4L0FwcE1haW4udGNsIGIvZ2l0LWd1aS9tYWNvc3gvQXBwTWFpbi50Y2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFjYTA4ZQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvbWFjb3N4L0FwcE1haW4udGNsCkBAIC0wLDAgKzEsMjIgQEAKK3NldCBnaXRleGVjZGlyIHtAQGdpdGV4ZWNkaXJAQH0KK3NldCBnaXRndWlsaWIgIHtAQEdJVEdVSV9MSUJESVJAQH0KK3NldCBlbnYoUEFUSCkgIiRnaXRleGVjZGlyOiRlbnYoUEFUSCkiCisKK2lmIHtbc3RyaW5nIGZpcnN0IC1wc24gW2xpbmRleCAkYXJndiAwXV0gPT0gMH0geworCWxzZXQgYXJndiAwIFtmaWxlIGpvaW4gJGdpdGV4ZWNkaXIgZ2l0LWd1aV0KK30KKworaWYge1tmaWxlIHRhaWwgW2xpbmRleCAkYXJndiAwXV0gZXEge2dpdGt9fSB7CisJc2V0IGFyZ3YwIFtmaWxlIGpvaW4gJGdpdGV4ZWNkaXIgZ2l0a10KKwlzZXQgQXBwTWFpbl9zb3VyY2UgJGFyZ3YwCit9IGVsc2UgeworCXNldCBhcmd2MCBbZmlsZSBqb2luICRnaXRleGVjZGlyIFtmaWxlIHRhaWwgW2xpbmRleCAkYXJndiAwXV1dCisJc2V0IEFwcE1haW5fc291cmNlIFtmaWxlIGpvaW4gJGdpdGd1aWxpYiBnaXQtZ3VpLnRjbF0KKwlpZiB7W3B3ZF0gZXEgey99fSB7CisJCWNkICRlbnYoSE9NRSkKKwl9Cit9CisKK3Vuc2V0IGdpdGV4ZWNkaXIgZ2l0Z3VpbGliCitzZXQgYXJndiBbbHJhbmdlICRhcmd2IDEgZW5kXQorc291cmNlICRBcHBNYWluX3NvdXJjZQpkaWZmIC0tZ2l0IGEvZ2l0LWd1aS9tYWNvc3gvSW5mby5wbGlzdCBiL2dpdC1ndWkvbWFjb3N4L0luZm8ucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNiZjE1ZgotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvbWFjb3N4L0luZm8ucGxpc3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KKwk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+QEBHSVRHVUlfVEtFWEVDVVRBQkxFQEA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlR2V0SW5mb1N0cmluZzwva2V5PgorCTxzdHJpbmc+R2l0IEd1aSBAQEdJVEdVSV9WRVJTSU9OQEAgwqkgMjAwNi0yMDA3IFNoYXduIFBlYXJjZSwgZXQuIGFsLjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+Z2l0LWd1aS5pY25zPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPmN6Lm9yLnJlcG8uZ2l0LWd1aTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+CisJPHN0cmluZz5HaXQgR3VpPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5BUFBMPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZzwva2V5PgorCTxzdHJpbmc+QEBHSVRHVUlfVkVSU0lPTkBAPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+R0lUZzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz5AQEdJVEdVSV9WRVJTSU9OQEA8L3N0cmluZz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9naXQtZ3VpL21hY29zeC9naXQtZ3VpLmljbnMgYi9naXQtZ3VpL21hY29zeC9naXQtZ3VpLmljbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkODhhNwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvbWFjb3N4L2dpdC1ndWkuaWNucwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9naXQtZ3VpL3BvLy5naXRpZ25vcmUgYi9naXQtZ3VpL3BvLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg5Y2Y0NAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvcG8vLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIgQEAKKyoubXNnCisqfgpkaWZmIC0tZ2l0IGEvZ2l0LWd1aS9wby9SRUFETUUgYi9naXQtZ3VpL3BvL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTc3YTdkCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9wby9SRUFETUUKQEAgLTAsMCArMSwyNDcgQEAKK0xvY2FsaXppbmcgZ2l0LWd1aSBmb3IgeW91ciBsYW5ndWFnZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgc2hvcnQgbm90ZSBpcyB0byBoZWxwIHlvdSwgd2hvIHJlYWRzIGFuZCB3cml0ZXMgRW5nbGlzaCBhbmQgeW91cgorb3duIGxhbmd1YWdlLCBoZWxwIHVzIGdldHRpbmcgZ2l0LWd1aSBsb2NhbGl6ZWQgZm9yIG1vcmUgbGFuZ3VhZ2VzLiAgSXQKK2RvZXMgbm90IHRyeSB0byBiZSBhIGNvbXByZWhlbnNpdmUgbWFudWFsIG9mIEdOVSBnZXR0ZXh0LCB3aGljaCBpcyB0aGUKK2kxOG4gZnJhbWV3b3JrIHdlIHVzZSwgYnV0IHRyaWVzIHRvIGhlbHAgeW91IGdldCBzdGFydGVkIGJ5IGNvdmVyaW5nIHRoZQorYmFzaWNzIGFuZCBob3cgaXQgaXMgdXNlZCBpbiB0aGlzIHByb2plY3QuCisKKzEuIEdldHRpbmcgc3RhcnRlZC4KKworWW91IHdvdWxkIGZpcnN0IG5lZWQgdG8gaGF2ZSBhIHdvcmtpbmcgImdpdCIuICBZb3VyIGRpc3RyaWJ1dGlvbiBtYXkKK2hhdmUgaXQgYXMgImdpdC1jb3JlIiBwYWNrYWdlIChkbyBub3QgZ2V0ICJHTlUgSW50ZXJhY3RpdmUgVG9vbHMiIC0tCit0aGF0IGlzIGEgZGlmZmVyZW50ICJnaXQiKS4gIFlvdSB3b3VsZCBhbHNvIG5lZWQgR05VIGdldHRleHQgdG9vbGNoYWluCit0byB0ZXN0IHRoZSByZXN1bHRpbmcgdHJhbnNsYXRpb24gb3V0LiAgQWx0aG91Z2ggeW91IGNhbiB3b3JrIG9uIG1lc3NhZ2UKK3RyYW5zbGF0aW9uIGZpbGVzIHdpdGggYSByZWd1bGFyIHRleHQgZWRpdG9yLCBpdCBpcyBhIGdvb2QgaWRlYSB0byBoYXZlCitzcGVjaWFsaXplZCBzby1jYWxsZWQgInBvIGZpbGUgZWRpdG9ycyIgKGUuZy4gZW1hY3MgcG8tbW9kZSwgS0JhYmVsLAorcG9lZGl0LCBHVHJhbnNsYXRvciAtLS0gYW55IG9mIHRoZW0gd291bGQgd29yayB3ZWxsKS4gIFBsZWFzZSBpbnN0YWxsCit0aGVtLgorCitZb3Ugd291bGQgdGhlbiBuZWVkIHRvIGNsb25lIHRoZSBnaXQtZ3VpIGludGVybmF0aW9uYWxpemF0aW9uIHByb2plY3QKK3JlcG9zaXRvcnksIHNvIHRoYXQgeW91IGNhbiB3b3JrIG9uIGl0OgorCisJJCBnaXQgY2xvbmUgbW9iQHJlcG8ub3IuY3o6L3Nydi9naXQvZ2l0LWd1aS9naXQtZ3VpLWkxOG4uZ2l0LworCSQgY2QgZ2l0LWd1aS1pMThuCisJJCBnaXQgY2hlY2tvdXQgLS10cmFjayAtYiBtb2Igb3JpZ2luL21vYgorCSQgZ2l0IGNvbmZpZyByZW1vdGUub3JpZ2luLnB1c2ggbW9iCisKK1RoZSAiZ2l0IGNoZWNrb3V0IiBjb21tYW5kIGNyZWF0ZXMgYSAnbW9iJyBicmFuY2ggZnJvbSB1cHN0cmVhbSdzCitjb3JyZXNwb25kaW5nIGJyYW5jaCBhbmQgbWFrZXMgaXQgeW91ciBjdXJyZW50IGJyYW5jaC4gIFlvdSB3aWxsIGJlCit3b3JraW5nIG9uIHRoaXMgYnJhbmNoLgorCitUaGUgImdpdCBjb25maWciIGNvbW1hbmQgcmVjb3JkcyBpbiB5b3VyIHJlcG9zaXRvcnkgY29uZmlndXJhdGlvbiBmaWxlCit0aGF0IHlvdSB3b3VsZCBwdXNoICJtb2IiIGJyYW5jaCB0byB0aGUgdXBzdHJlYW0gd2hlbiB5b3Ugc2F5ICJnaXQKK3B1c2giLgorCisKKzIuIFN0YXJ0aW5nIGEgbmV3IGxhbmd1YWdlLgorCitJbiB0aGUgZ2l0LWd1aS1pMThuIGRpcmVjdG9yeSBpcyBhIHBvLyBzdWJkaXJlY3RvcnkuICBJdCBoYXMgYQoraGFuZGZ1bCBmaWxlcyB3aG9zZSBuYW1lcyBlbmQgd2l0aCAiLnBvIi4gIElzIHRoZXJlIGEgZmlsZSB0aGF0IGhhcworbWVzc2FnZXMgaW4geW91ciBsYW5ndWFnZT8KKworSWYgeW91IGRvIG5vdCBrbm93IHdoYXQgeW91ciBsYW5ndWFnZSBzaG91bGQgYmUgbmFtZWQsIHlvdSBuZWVkIHRvIGZpbmQKK2l0LiAgVGhpcyBjdXJyZW50bHkgZm9sbG93cyBJU08gNjM5LTEgdHdvIGxldHRlciBjb2RlczoKKworCWh0dHA6Ly93d3cubG9jLmdvdi9zdGFuZGFyZHMvaXNvNjM5LTIvcGhwL2NvZGVfbGlzdC5waHAKKworRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgcHJlcGFyaW5nIGEgdHJhbnNsYXRpb24gZm9yIEFmcmlrYWFucywgdGhlCitsYW5ndWFnZSBjb2RlIGlzICJhZiIuICBJZiB0aGVyZSBhbHJlYWR5IGlzIGEgdHJhbnNsYXRpb24gZm9yIHlvdXIKK2xhbmd1YWdlLCB5b3UgZG8gbm90IGhhdmUgdG8gcGVyZm9ybSBhbnkgc3RlcCBpbiB0aGlzIHNlY3Rpb24sIGJ1dCBrZWVwCityZWFkaW5nLCBiZWNhdXNlIHdlIGFyZSBjb3ZlcmluZyB0aGUgYmFzaWNzLgorCitJZiB5b3UgZGlkIG5vdCBmaW5kIHlvdXIgbGFuZ3VhZ2UsIHlvdSB3b3VsZCBuZWVkIHRvIHN0YXJ0IG9uZSB5b3Vyc2VsZi4KK0NvcHkgcG8vZ2l0LWd1aS5wb3QgZmlsZSB0byBwby9hZi5wbyAocmVwbGFjZSAiYWYiIHdpdGggdGhlIGNvZGUgZm9yCit5b3VyIGxhbmd1YWdlKS4gIEVkaXQgdGhlIGZpcnN0IHNldmVyYWwgbGluZXMgdG8gbWF0Y2ggZXhpc3RpbmcgKi5wbworZmlsZXMgdG8gbWFrZSBpdCBjbGVhciB0aGlzIGlzIGEgdHJhbnNsYXRpb24gdGFibGUgZm9yIGdpdC1ndWkgcHJvamVjdCwKK2FuZCB5b3UgYXJlIHRoZSBwcmltYXJ5IHRyYW5zbGF0b3IuICBUaGUgcmVzdWx0IG9mIHlvdXIgZWRpdGluZyB3b3VsZAorbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgorCisgICAgIyBUcmFuc2xhdGlvbiBvZiBnaXQtZ3VpIHRvIEFmcmlrYWFucworICAgICMgQ29weXJpZ2h0IChDKSAyMDA3IFNoYXduIFBlYXJjZQorICAgICMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGdpdC1ndWkgcGFja2FnZS4KKyAgICAjIFlPVVIgTkFNRSA8WU9VUkBFLU1BSUwuQUREUkVTUz4sIDIwMDcuCisgICAgIworICAgICMsIGZ1enp5CisgICAgbXNnaWQgIiIKKyAgICBtc2dzdHIgIiIKKyAgICAiUHJvamVjdC1JZC1WZXJzaW9uOiBnaXQtZ3VpXG4iCisgICAgIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBcbiIKKyAgICAiUE9ULUNyZWF0aW9uLURhdGU6IDIwMDctMDctMjQgMjI6MTkrMDMwMFxuIgorICAgICJQTy1SZXZpc2lvbi1EYXRlOiAyMDA3LTA3LTI1IDE4OjAwKzA5MDBcbiIKKyAgICAiTGFzdC1UcmFuc2xhdG9yOiBZT1VSIE5BTUUgPFlPVVJARS1NQUlMLkFERFJFU1M+XG4iCisgICAgIkxhbmd1YWdlLVRlYW06IEFmcmlrYWFuc1xuIgorICAgICJNSU1FLVZlcnNpb246IDEuMFxuIgorICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyAgICAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorCitZb3Ugd2lsbCBmaW5kIG1hbnkgcGFpcnMgb2YgYSAibXNnaWQiIGxpbmUgZm9sbG93ZWQgYnkgYSAibXNnc3RyIiBsaW5lLgorVGhlc2UgcGFpcnMgZGVmaW5lIGhvdyBtZXNzYWdlcyBpbiBnaXQtZ3VpIGFwcGxpY2F0aW9uIGFyZSB0cmFuc2xhdGVkIHRvCit5b3VyIGxhbmd1YWdlLiAgWW91ciBwcmltYXJpbHkgam9iIGlzIHRvIGZpbGwgaW4gdGhlIGVtcHR5IGRvdWJsZSBxdW90ZQorcGFpcnMgb24gbXNnc3RyIGxpbmVzIHdpdGggdGhlIHRyYW5zbGF0aW9uIG9mIHRoZSBzdHJpbmdzIG9uIHRoZWlyCittYXRjaGluZyBtc2dpZCBsaW5lcy4gIEEgZmV3IHRpcHM6CisKKyAtIENvbnRyb2wgY2hhcmFjdGVycywgc3VjaCBhcyBuZXdsaW5lcywgYXJlIHdyaXR0ZW4gaW4gYmFja3NsYXNoCisgICBzZXF1ZW5jZSBzaW1pbGFyIHRvIHN0cmluZyBsaXRlcmFscyBpbiB0aGUgQyBwcm9ncmFtbWluZyBsYW5ndWFnZS4KKyAgIFdoZW4gdGhlIHN0cmluZyBnaXZlbiBvbiBhIG1zZ2lkIGxpbmUgaGFzIHN1Y2ggYSBiYWNrc2xhc2ggc2VxdWVuY2UsCisgICB5b3Ugd291bGQgdHlwaWNhbGx5IHdhbnQgdG8gaGF2ZSBjb3JyZXNwb25kaW5nIG9uZXMgaW4gdGhlIHN0cmluZyBvbgorICAgeW91ciBtc2dzdHIgbGluZS4KKworIC0gU29tZSBtZXNzYWdlcyBjb250YWluIGFuIG9wdGlvbmFsIGNvbnRleHQgaW5kaWNhdG9yIGF0IHRoZSBlbmQsCisgICBmb3IgZXhhbXBsZSAiQEBub3VuIiBvciAiQEB2ZXJiIi4gIFRoaXMgaW5kaWNhdG9yIGFsbG93cyB0aGUKKyAgIHNvZnR3YXJlIHRvIHNlbGVjdCB0aGUgY29ycmVjdCB0cmFuc2xhdGlvbiBkZXBlbmRpbmcgdXBvbiB0aGUgdXNlLgorICAgVGhlIGluZGljYXRvciBpcyBub3QgYWN0dWFsbHkgcGFydCBvZiB0aGUgbWVzc2FnZSBhbmQgd2lsbCBub3QKKyAgIGJlIHNob3duIHRvIHRoZSBlbmQtdXNlci4KKworICAgSWYgeW91ciBsYW5ndWFnZSBkb2VzIG5vdCByZXF1aXJlIGEgZGlmZmVyZW50IHRyYW5zbGF0aW9uIHlvdQorICAgd2lsbCBzdGlsbCBuZWVkIHRvIHRyYW5zbGF0ZSBib3RoIG1lc3NhZ2VzLgorCisgLSBPZnRlbiB0aGUgbWVzc2FnZXMgYmVpbmcgdHJhbnNsYXRlZCBhcmUgZm9ybWF0IHN0cmluZ3MgZ2l2ZW4gdG8KKyAgICJwcmludGYoKSItbGlrZSBmdW5jdGlvbnMuICBNYWtlIHN1cmUgIiVzIiwgIiVkIiwgYW5kICIlJSIgaW4geW91cgorICAgdHJhbnNsYXRlZCBtZXNzYWdlcyBtYXRjaCB0aGUgb3JpZ2luYWwuCisKKyAgIFdoZW4geW91IGhhdmUgdG8gY2hhbmdlIHRoZSBvcmRlciBvZiB3b3JkcywgeW91IGNhbiBhZGQgIjxudW1iZXI+XCQiCisgICBiZXR3ZWVuICclJyBhbmQgdGhlIGNvbnZlcnNpb24gKCdzJywgJ2QnLCBldGMuKSB0byBzYXkgIjxudW1iZXI+LXRoCisgICBwYXJhbWV0ZXIgdG8gdGhlIGZvcm1hdCBzdHJpbmcgaXMgdXNlZCBhdCB0aGlzIHBvaW50Ii4gIEZvciBleGFtcGxlLAorICAgaWYgdGhlIG9yaWdpbmFsIG1lc3NhZ2UgaXMgbGlrZSB0aGlzOgorCisJIkxlbmd0aCBpcyAlZCwgV2VpZ2h0IGlzICVkIgorCisgICBhbmQgaWYgZm9yIHdoYXRldmVyIHJlYXNvbiB5b3VyIHRyYW5zbGF0aW9uIG5lZWRzIHRvIHNheSB3ZWlnaHQgZmlyc3QKKyAgIGFuZCB0aGVuIGxlbmd0aCwgeW91IGNhbiBzYXkgc29tZXRoaW5nIGxpa2U6CisKKwkiV0VJR0hUIElTICUyXCRkLCBMRU5HVEggSVMgJTFcJGQiCisKKyAgIFRoZSByZWFzb24geW91IG5lZWQgYSBiYWNrc2xhc2ggYmVmb3JlIGRvbGxhciBzaWduIGlzIGJlY2F1c2UKKyAgIHRoaXMgaXMgYSBkb3VibGUgcXVvdGVkIHN0cmluZyBpbiBUY2wgbGFuZ3VhZ2UsIGFuZCB3aXRob3V0CisgICBpdCB0aGUgbGV0dGVyIGludHJvZHVjZXMgYSB2YXJpYWJsZSBpbnRlcnBvbGF0aW9uLCB3aGljaCB5b3UKKyAgIGRvIG5vdCB3YW50IGhlcmUuCisKKyAtIEEgbG9uZyBtZXNzYWdlIGNhbiBiZSBzcGxpdCBhY3Jvc3MgbXVsdGlwbGUgbGluZXMgYnkgZW5kaW5nIHRoZQorICAgc3RyaW5nIHdpdGggYSBkb3VibGUgcXVvdGUsIGFuZCBzdGFydGluZyBhbm90aGVyIHN0cmluZyBvbiB0aGUgbmV4dAorICAgbGluZSB3aXRoIGFub3RoZXIgZG91YmxlIHF1b3RlLiAgVGhleSB3aWxsIGJlIGNvbmNhdGVuYXRlZCBpbiB0aGUKKyAgIHJlc3VsdC4gIEZvciBleGFtcGxlOgorCisgICAjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjE4OQorICAgIywgdGNsLWZvcm1hdAorICAgbXNnaWQgIiIKKyAgICJPbmUgb3IgbW9yZSBvZiB0aGUgbWVyZ2UgdGVzdHMgZmFpbGVkIGJlY2F1c2UgeW91IGhhdmUgbm90IGZldGNoZWQgdGhlICIKKyAgICJuZWNlc3NhcnkgY29tbWl0cy4gIFRyeSBmZXRjaGluZyBmcm9tICVzIGZpcnN0LiIKKyAgIG1zZ3N0ciAiIgorICAgIkhFUkUgWU9VIFdJTEwgV1JJVEUgWU9VUiBUUkFOU0xBVElPTiBPRiBUSEUgQUJPVkUgTE9ORyAiCisgICAiTUVTU0FHRSBJTiBZT1VSIExBTkdVQUdFLiIKKworWW91IGNhbiB0ZXN0IHlvdXIgdHJhbnNsYXRpb24gYnkgcnVubmluZyAibWFrZSBpbnN0YWxsIiwgd2hpY2ggd291bGQKK2NyZWF0ZSBwby9hZi5tc2cgZmlsZSBhbmQgaW5zdGFsbHMgdGhlIHJlc3VsdCwgYW5kIHRoZW4gcnVubmluZyB0aGUKK3Jlc3VsdGluZyBnaXQtZ3VpIHVuZGVyIHlvdXIgbG9jYWxlOgorCisJJCBtYWtlIGluc3RhbGwKKwkkIExBTkc9YWYgZ2l0LWd1aQorCitUaGVyZSBpcyBhIHRyaWNrIHRvIHRlc3QgeW91ciB0cmFuc2xhdGlvbiB3aXRob3V0IGZpcnN0IGluc3RhbGxpbmc6CisKKwkkIG1ha2UKKwkkIExBTkc9YWYgLi9naXQtZ3VpLnNoCisKK1doZW4geW91IGFyZSBzYXRpc2ZpZWQgd2l0aCB5b3VyIHRyYW5zbGF0aW9uLCBjb21taXQgeW91ciBjaGFuZ2VzLCBhbmQKK3B1c2ggaXQgYmFjayB0byB0aGUgJ21vYicgYnJhbmNoOgorCisJJCBlZGl0IHBvL2FmLnBvCisJLi4uIGJlIHN1cmUgdG8gdXBkYXRlIExhc3QtVHJhbnNsYXRvcjogYW5kCisJLi4uIFBPLVJldmlzaW9uLURhdGU6IGxpbmVzLgorCSQgZ2l0IGFkZCBwby9hZi5wbworCSQgZ2l0IGNvbW1pdCAtbSAnU3RhcnRlZCBBZnJpa2FhbnMgdHJhbnNsYXRpb24uJworCSQgZ2l0IHB1c2gKKworCiszLiBVcGRhdGluZyB5b3VyIHRyYW5zbGF0aW9uLgorCitUaGVyZSBtYXkgYWxyZWFkeSBiZSBhIHRyYW5zbGF0aW9uIGZvciB5b3VyIGxhbmd1YWdlLCBhbmQgeW91IG1heSB3YW50Cit0byBjb250cmlidXRlIGFuIHVwZGF0ZS4gIFRoaXMgbWF5IGJlIGJlY2F1c2UgeW91IHdvdWxkIHdhbnQgdG8gaW1wcm92ZQordGhlIHRyYW5zbGF0aW9uIG9mIGV4aXN0aW5nIG1lc3NhZ2VzLCBvciBiZWNhdXNlIHRoZSBnaXQtZ3VpIHNvZnR3YXJlCitpdHNlbGYgd2FzIHVwZGF0ZWQgYW5kIHRoZXJlIGFyZSBuZXcgbWVzc2FnZXMgdGhhdCBuZWVkIHRyYW5zbGF0aW9uLgorCitJbiBhbnkgY2FzZSwgbWFrZSBzdXJlIHlvdSBhcmUgdXAtdG8tZGF0ZSBiZWZvcmUgc3RhcnRpbmcgeW91ciB3b3JrOgorCisJJCBnaXQgcHVsbAorCitJbiB0aGUgZm9ybWVyIGNhc2UsIHlvdSB3aWxsIGVkaXQgcG8vYWYucG8gKGFnYWluLCByZXBsYWNlICJhZiIgd2l0aAoreW91ciBsYW5ndWFnZSBjb2RlKSwgYW5kIGFmdGVyIHRlc3RpbmcgYW5kIHVwZGF0aW5nIHRoZSBMYXN0LVRyYW5zbGF0b3I6CithbmQgUE8tUmV2aXNpb24tRGF0ZTogbGluZXMsICJhZGQvY29tbWl0L3B1c2giIGFzIGluIHRoZSBwcmV2aW91cworc2VjdGlvbi4KKworQnkgY29tcGFyaW5nICJQT1QtQ3JlYXRpb24tRGF0ZToiIGxpbmUgaW4gcG8vZ2l0LWd1aS5wb3QgZmlsZSBhbmQKK3BvL2FmLnBvIGZpbGUsIHlvdSBjYW4gdGVsbCBpZiB0aGVyZSBhcmUgbmV3IG1lc3NhZ2VzIHRoYXQgbmVlZCB0byBiZQordHJhbnNsYXRlZC4gIFlvdSB3b3VsZCBuZWVkIHRoZSBHTlUgZ2V0dGV4dCBwYWNrYWdlIHRvIHBlcmZvcm0gdGhpcworc3RlcC4KKworCSQgbXNnbWVyZ2UgLVUgcG8vYWYucG8gcG8vZ2l0LWd1aS5wb3QKKworVGhpcyB1cGRhdGVzIHBvL2FmLnBvIChhZ2FpbiwgcmVwbGFjZSAiYWYiIHdpdGggeW91ciBsYW5ndWFnZQorY29kZSkgc28gdGhhdCBpdCBjb250YWlucyBtc2dpZCBsaW5lcyAoaS5lLiB0aGUgb3JpZ2luYWwpIHRoYXQKK3lvdXIgdHJhbnNsYXRpb24gZGlkIG5vdCBoYXZlIGJlZm9yZS4gIFRoZXJlIGFyZSBhIGZldyB0aGluZ3MgdG8KK3dhdGNoIG91dCBmb3I6CisKKyAtIFRoZSBvcmlnaW5hbCB0ZXh0IGluIEVuZ2xpc2ggb2YgYW4gb2xkZXIgbWVzc2FnZSB5b3UgYWxyZWFkeQorICAgdHJhbnNsYXRlZCBtaWdodCBoYXZlIGJlZW4gY2hhbmdlZC4gIFlvdSB3aWxsIG5vdGljZSBhIGNvbW1lbnQgbGluZQorICAgdGhhdCBiZWdpbnMgd2l0aCAiIywgZnV6enkiIGluIGZyb250IG9mIHN1Y2ggYSBtZXNzYWdlLiAgbXNnbWVyZ2UKKyAgIHRvb2wgbWFkZSBpdHMgYmVzdCBlZmZvcnQgdG8gbWF0Y2ggeW91ciBvbGQgdHJhbnNsYXRpb24gd2l0aCB0aGUKKyAgIG1lc3NhZ2UgZnJvbSB0aGUgdXBkYXRlZCBzb2Z0d2FyZSwgYnV0IHlvdSBtYXkgZmluZCBjYXNlcyB0aGF0IGl0CisgICBtYXRjaGVkIHlvdXIgb2xkIHRyYW5zbGF0ZWQgbWVzc2FnZSB0byBhIG5ldyBtc2dpZCBhbmQgdGhlIHBhaXJpbmcKKyAgIGRvZXMgbm90IG1ha2UgYW55IHNlbnNlIC0tIHlvdSB3b3VsZCBuZWVkIHRvIGZpeCB0aGVtLCBhbmQgdGhlbgorICAgcmVtb3ZlIHRoZSAiIywgZnV6enkiIGxpbmUgZnJvbSB0aGUgbWVzc2FnZSAoeW91ciBmaXhlZCB0cmFuc2xhdGlvbgorICAgb2YgdGhlIG1lc3NhZ2Ugd2lsbCBub3QgYmUgdXNlZCBiZWZvcmUgeW91IHJlbW92ZSB0aGUgbWFya2VyKS4KKworIC0gTmV3IG1lc3NhZ2VzIGFkZGVkIHRvIHRoZSBzb2Z0d2FyZSB3aWxsIGhhdmUgbXNnc3RyIGxpbmVzIHdpdGggZW1wdHkKKyAgIHN0cmluZ3MuICBZb3Ugd291bGQgbmVlZCB0byB0cmFuc2xhdGUgdGhlbS4KKworVGhlIHBvL2dpdC1ndWkucG90IGZpbGUgaXMgdXBkYXRlZCBieSB0aGUgaW50ZXJuYXRpb25hbGl6YXRpb24KK2Nvb3JkaW5hdG9yIGZyb20gdGltZSB0byB0aW1lLiAgWW91IF9jb3VsZF8gdXBkYXRlIGl0IHlvdXJzZWxmLCBidXQKK3RyYW5zbGF0b3JzIGFyZSBkaXNjb3VyYWdlZCBmcm9tIGRvaW5nIHNvIGJlY2F1c2Ugd2Ugd291bGQgd2FudCBhbGwKK2xhbmd1YWdlIHRlYW1zIHRvIGJlIHdvcmtpbmcgb2ZmIG9mIHRoZSBzYW1lIHZlcnNpb24gb2YgZ2l0LWd1aS5wb3QuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworVGhpcyBzZWN0aW9uIGlzIGEgbm90ZSB0byB0aGUgaW50ZXJuYXRpb25hbGl6YXRpb24gY29vcmRpbmF0b3IsIGFuZAordHJhbnNsYXRvcnMgZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgaXQgdG9vIG11Y2guCisKK1RoZSBtZXNzYWdlIHRlbXBsYXRlIGZpbGUgcG8vZ2l0LWd1aS5wb3QgbmVlZHMgdG8gYmUga2VwdCB1cCB0byBkYXRlCityZWxhdGl2ZSB0byB0aGUgc29mdHdhcmUgdGhlIHRyYW5zbGF0aW9ucyBhcHBseSB0bywgYW5kIGl0IGlzIHRoZQorcmVzcG9uc2liaWxpdHkgb2YgdGhlIGludGVybmF0aW9uYWxpemF0aW9uIGNvb3JkaW5hdG9yLgorCitXaGVuIHVwZGF0aW5nIHBvL2dpdC1ndWkucG90IGZpbGUsIGhvd2V2ZXIsIF9uZXZlcl8gcnVuICJtc2dtZXJnZSAtVQorcG8veHgucG8iIGZvciBpbmRpdmlkdWFsIGxhbmd1YWdlIHRyYW5zbGF0aW9ucywgdW5sZXNzIHlvdSBhcmUgYWJzb2x1dGVseQorc3VyZSB0aGF0IHRoZXJlIGlzIG5vIG91dHN0YW5kaW5nIHdvcmsgb24gdHJhbnNsYXRpb24gZm9yIGxhbmd1YWdlIHh4LgorRG9pbmcgc28gd2lsbCBjcmVhdGUgdW5uZWNlc3NhcnkgbWVyZ2UgY29uZmxpY3RzIGFuZCBmb3JjZSBuZWVkbGVzcworcmUtdHJhbnNsYXRpb24gb24gdHJhbnNsYXRvcnMuICBUaGUgdHJhbnNsYXRvciBob3dldmVyIG1heSBub3QgaGF2ZSBhY2Nlc3MKK3RvIHRoZSBtc2dtZXJnZSB0b29sLCBpbiB3aGljaCBjYXNlIHRoZSBjb29yZGluYXRvciBtYXkgcnVuIGl0IGZvciB0aGUKK3RyYW5zbGF0b3IgYXMgYSBzZXJ2aWNlLgorCitCdXQgbWlzdGFrZXMgZG8gaGFwcGVuLiAgU3VwcG9zZSBhIHRyYW5zbGF0aW9uIHdhcyBiYXNlZCBvbiBhbiBvbGRlcgordmVyc2lvbiBYLCB0aGUgUE9UIGZpbGUgd2FzIHVwZGF0ZWQgYXQgdmVyc2lvbiBZIGFuZCB0aGVuIG1zZ21lcmdlIHdhcyBydW4KK2F0IHZlcnNpb24gWiBmb3IgdGhlIGxhbmd1YWdlLCBhbmQgdGhlIHRyYW5zbGF0b3Igc2VudCBpbiBhIHBhdGNoIGJhc2VkIG9uCit2ZXJzaW9uIFg6CisKKyAgICAgICAgID8gdHJhbnNsYXRlZAorICAgICAgICAvCisgICAgLS0tWC0tLVktLS1aIChtYXN0ZXIpCisKK1RoZSBjb29yZGluYXRvciBjb3VsZCByZWNvdmVyIGZyb20gc3VjaCBhIG1pc3Rha2UgYnkgZmlyc3QgYXBwbHlpbmcgdGhlCitwYXRjaCB0byBYLCByZXBsYWNlIHRoZSB0cmFuc2xhdGVkIGZpbGUgaW4gWiwgYW5kIHRoZW4gcnVubmluZyBtc2dtZXJnZQorYWdhaW4gYmFzZWQgb24gdGhlIHVwZGF0ZWQgUE9UIGZpbGUgYW5kIGNvbW1pdCB0aGUgcmVzdWx0LiAgVGhlIHNlcXVlbmNlCit3b3VsZCBsb29rIGxpa2UgdGhpczoKKworICAgICQgZ2l0IGNoZWNrb3V0IFgKKyAgICAkIGdpdCBhbSAtcyB4eC5wYXRjaAorICAgICQgZ2l0IGNoZWNrb3V0IG1hc3RlcgorICAgICQgZ2l0IGNoZWNrb3V0IEhFQURAezF9IHBvL3h4LnBvCisgICAgJCBtc2dtZXJnZSAtVSBwby94eC5wbyBwby9naXQtZ3VpLnBvdAorICAgICQgZ2l0IGNvbW1pdCAtYyBIRUFEQHsxfSBwby94eC5wbworCitTdGF0ZSBpbiB0aGUgbWVzc2FnZSB0aGF0IHRoZSB0cmFuc2xhdGVkIG1lc3NhZ2VzIGFyZSBiYXNlZCBvbiBhIHNsaWdodGx5CitvbGRlciB2ZXJzaW9uLCBhbmQgbXNnbWVyZ2Ugd2FzIHJ1biB0byBpbmNvcnBvcmF0ZSBjaGFuZ2VzIHRvIG1lc3NhZ2UKK3RlbXBsYXRlcyBmcm9tIHRoZSB1cGRhdGVkIFBPVCBmaWxlLiAgVGhlIHJlc3VsdCBuZWVkcyB0byBiZSBmdXJ0aGVyCit0cmFuc2xhdGVkLCBidXQgYXQgbGVhc3QgdGhlIG1lc3NhZ2VzIHRoYXQgd2VyZSB1cGRhdGVkIGJ5IHRoZSBwYXRjaCB0aGF0Cit3ZXJlIG5vdCBjaGFuZ2VkIGJ5IHRoZSBQT1QgdXBkYXRlIHdpbGwgc3Vydml2ZSB0aGUgcHJvY2VzcyBhbmQgZG8gbm90CituZWVkIHRvIGJlIHJlLXRyYW5zbGF0ZWQuCmRpZmYgLS1naXQgYS9naXQtZ3VpL3BvL2RlLnBvIGIvZ2l0LWd1aS9wby9kZS5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjJiODE2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9wby9kZS5wbwpAQCAtMCwwICsxLDIwMDcgQEAKKyMgVHJhbnNsYXRpb24gb2YgZ2l0LWd1aSB0byBHZXJtYW4uCisjIENvcHlyaWdodCAoQykgMjAwNyBTaGF3biBQZWFyY2UsIGV0IGFsLgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ2l0IHBhY2thZ2UuCisjIENocmlzdGlhbiBTdGltbWluZyA8c3RpbW1pbmdAdHVoaC5kZT4sIDIwMDcKKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdpdC1ndWlcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMDgtMDMtMTQgMDc6MTgrMDEwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMDgtMDItMTYgMjE6NTIrMDEwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogQ2hyaXN0aWFuIFN0aW1taW5nIDxzdGltbWluZ0B0dWhoLmRlPlxuIgorIkxhbmd1YWdlLVRlYW06IEdlcm1hblxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorCisjOiBnaXQtZ3VpLnNoOjQxIGdpdC1ndWkuc2g6NjM0IGdpdC1ndWkuc2g6NjQ4IGdpdC1ndWkuc2g6NjYxIGdpdC1ndWkuc2g6NzQ0CisjOiBnaXQtZ3VpLnNoOjc2MworbXNnaWQgImdpdC1ndWk6IGZhdGFsIGVycm9yIgorbXNnc3RyICJnaXQtZ3VpOiBQcm9ncmFtbWZlaGxlciIKKworIzogZ2l0LWd1aS5zaDo1OTMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIGZvbnQgc3BlY2lmaWVkIGluICVzOiIKK21zZ3N0ciAiVW5nw7xsdGlnZSBaZWljaGVuc2F0ei1BbmdhYmUgaW4gJXM6IgorCisjOiBnaXQtZ3VpLnNoOjYyMAorbXNnaWQgIk1haW4gRm9udCIKK21zZ3N0ciAiUHJvZ3JhbW1zY2hyaWZ0YXJ0IgorCisjOiBnaXQtZ3VpLnNoOjYyMQorbXNnaWQgIkRpZmYvQ29uc29sZSBGb250IgorbXNnc3RyICJWZXJnbGVpY2gtU2NocmlmdGFydCIKKworIzogZ2l0LWd1aS5zaDo2MzUKK21zZ2lkICJDYW5ub3QgZmluZCBnaXQgaW4gUEFUSC4iCittc2dzdHIgIkdpdCBrYW5uIGltIFBBVEggbmljaHQgZ2VmdW5kZW4gd2VyZGVuLiIKKworIzogZ2l0LWd1aS5zaDo2NjIKK21zZ2lkICJDYW5ub3QgcGFyc2UgR2l0IHZlcnNpb24gc3RyaW5nOiIKK21zZ3N0ciAiR2l0IFZlcnNpb25zYW5nYWJlIGthbm4gbmljaHQgZXJrYW5udCB3ZXJkZW46IgorCisjOiBnaXQtZ3VpLnNoOjY4MAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJHaXQgdmVyc2lvbiBjYW5ub3QgYmUgZGV0ZXJtaW5lZC5cbiIKKyJcbiIKKyIlcyBjbGFpbXMgaXQgaXMgdmVyc2lvbiAnJXMnLlxuIgorIlxuIgorIiVzIHJlcXVpcmVzIGF0IGxlYXN0IEdpdCAxLjUuMCBvciBsYXRlci5cbiIKKyJcbiIKKyJBc3N1bWUgJyVzJyBpcyB2ZXJzaW9uIDEuNS4wP1xuIgorbXNnc3RyICIiCisiRGllIFZlcnNpb24gdm9uIEdpdCBrYW5uIG5pY2h0IGJlc3RpbW10IHdlcmRlbi5cbiIKKyJcbiIKKyLCuyVzwqsgYmVoYXVwdGV0LCBlcyBzZWkgVmVyc2lvbiDCuyVzwqsuXG4iCisiXG4iCisiJXMgYmVuw7Z0aWd0IG1pbmRlc3RlbnMgR2l0IDEuNS4wIG9kZXIgaMO2aGVyLlxuIgorIlxuIgorIlNvbGwgYW5nZW5vbW1lbiB3ZXJkZW4sIMK7JXPCqyBzZWkgVmVyc2lvbiAxLjUuMD9cbiIKKworIzogZ2l0LWd1aS5zaDo5MTgKK21zZ2lkICJHaXQgZGlyZWN0b3J5IG5vdCBmb3VuZDoiCittc2dzdHIgIkdpdC1WZXJ6ZWljaG5pcyBuaWNodCBnZWZ1bmRlbjoiCisKKyM6IGdpdC1ndWkuc2g6OTI1Cittc2dpZCAiQ2Fubm90IG1vdmUgdG8gdG9wIG9mIHdvcmtpbmcgZGlyZWN0b3J5OiIKK21zZ3N0ciAiIgorIkVzIGtvbm50ZSBuaWNodCBpbiBkYXMgb2JlcnN0ZSBWZXJ6ZWljaG5pcyBkZXIgQXJiZWl0c2tvcGllIGdld2VjaHNlbHQgIgorIndlcmRlbjoiCisKKyM6IGdpdC1ndWkuc2g6OTMyCittc2dpZCAiQ2Fubm90IHVzZSBmdW5ueSAuZ2l0IGRpcmVjdG9yeToiCittc2dzdHIgIlVuZXJ3YXJ0ZXRlIFN0cnVrdHVyIGRlcyAuZ2l0IFZlcnplaWNobmlzOiIKKworIzogZ2l0LWd1aS5zaDo5MzcKK21zZ2lkICJObyB3b3JraW5nIGRpcmVjdG9yeSIKK21zZ3N0ciAiS2VpbiBBcmJlaXRzdmVyemVpY2huaXMiCisKKyM6IGdpdC1ndWkuc2g6MTA4NCBsaWIvY2hlY2tvdXRfb3AudGNsOjI4MworbXNnaWQgIlJlZnJlc2hpbmcgZmlsZSBzdGF0dXMuLi4iCittc2dzdHIgIkRhdGVpc3RhdHVzIGFrdHVhbGlzaWVyZW4uLi4iCisKKyM6IGdpdC1ndWkuc2g6MTE0OQorbXNnaWQgIlNjYW5uaW5nIGZvciBtb2RpZmllZCBmaWxlcyAuLi4iCittc2dzdHIgIk5hY2ggZ2XDpG5kZXJ0ZW4gRGF0ZWllbiBzdWNoZW4uLi4iCisKKyM6IGdpdC1ndWkuc2g6MTMyNCBsaWIvYnJvd3Nlci50Y2w6MjQ2Cittc2dpZCAiUmVhZHkuIgorbXNnc3RyICJCZXJlaXQuIgorCisjOiBnaXQtZ3VpLnNoOjE1OTAKK21zZ2lkICJVbm1vZGlmaWVkIgorbXNnc3RyICJVbnZlcsOkbmRlcnQiCisKKyM6IGdpdC1ndWkuc2g6MTU5MgorbXNnaWQgIk1vZGlmaWVkLCBub3Qgc3RhZ2VkIgorbXNnc3RyICJWZXLDpG5kZXJ0LCBuaWNodCBiZXJlaXRnZXN0ZWxsdCIKKworIzogZ2l0LWd1aS5zaDoxNTkzIGdpdC1ndWkuc2g6MTU5OAorbXNnaWQgIlN0YWdlZCBmb3IgY29tbWl0IgorbXNnc3RyICJCZXJlaXRnZXN0ZWxsdCB6dW0gRWludHJhZ2VuIgorCisjOiBnaXQtZ3VpLnNoOjE1OTQgZ2l0LWd1aS5zaDoxNTk5Cittc2dpZCAiUG9ydGlvbnMgc3RhZ2VkIGZvciBjb21taXQiCittc2dzdHIgIlRlaWx3ZWlzZSBiZXJlaXRnZXN0ZWxsdCB6dW0gRWludHJhZ2VuIgorCisjOiBnaXQtZ3VpLnNoOjE1OTUgZ2l0LWd1aS5zaDoxNjAwCittc2dpZCAiU3RhZ2VkIGZvciBjb21taXQsIG1pc3NpbmciCittc2dzdHIgIkJlcmVpdGdlc3RlbGx0IHp1bSBFaW50cmFnZW4sIGZlaGxlbmQiCisKKyM6IGdpdC1ndWkuc2g6MTU5NworbXNnaWQgIlVudHJhY2tlZCwgbm90IHN0YWdlZCIKK21zZ3N0ciAiTmljaHQgdW50ZXIgVmVyc2lvbnNrb250cm9sbGUsIG5pY2h0IGJlcmVpdGdlc3RlbGx0IgorCisjOiBnaXQtZ3VpLnNoOjE2MDIKK21zZ2lkICJNaXNzaW5nIgorbXNnc3RyICJGZWhsZW5kIgorCisjOiBnaXQtZ3VpLnNoOjE2MDMKK21zZ2lkICJTdGFnZWQgZm9yIHJlbW92YWwiCittc2dzdHIgIkJlcmVpdGdlc3RlbGx0IHp1bSBMw7ZzY2hlbiIKKworIzogZ2l0LWd1aS5zaDoxNjA0Cittc2dpZCAiU3RhZ2VkIGZvciByZW1vdmFsLCBzdGlsbCBwcmVzZW50IgorbXNnc3RyICJCZXJlaXRnZXN0ZWxsdCB6dW0gTMO2c2NoZW4sIHRyb3R6ZGVtIHZvcmhhbmRlbiIKKworIzogZ2l0LWd1aS5zaDoxNjA2IGdpdC1ndWkuc2g6MTYwNyBnaXQtZ3VpLnNoOjE2MDggZ2l0LWd1aS5zaDoxNjA5Cittc2dpZCAiUmVxdWlyZXMgbWVyZ2UgcmVzb2x1dGlvbiIKK21zZ3N0ciAiS29uZmxpa3RhdWZsw7ZzdW5nIG7DtnRpZyIKKworIzogZ2l0LWd1aS5zaDoxNjQ0Cittc2dpZCAiU3RhcnRpbmcgZ2l0ay4uLiBwbGVhc2Ugd2FpdC4uLiIKK21zZ3N0ciAiR2l0ayB3aXJkIGdlc3RhcnRldC4uLiBiaXR0ZSB3YXJ0ZW4uIgorCisjOiBnaXQtZ3VpLnNoOjE2NTMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiVW5hYmxlIHRvIHN0YXJ0IGdpdGs6XG4iCisiXG4iCisiJXMgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIiIKKyJHaXRrIGthbm4gbmljaHQgZ2VzdGFydGV0IHdlcmRlbjpcbiIKKyJcbiIKKyIlcyBleGlzdGllcnQgbmljaHQiCisKKyM6IGdpdC1ndWkuc2g6MTg2MCBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjM2Cittc2dpZCAiUmVwb3NpdG9yeSIKK21zZ3N0ciAiUHJvamVrdGFyY2hpdiIKKworIzogZ2l0LWd1aS5zaDoxODYxCittc2dpZCAiRWRpdCIKK21zZ3N0ciAiQmVhcmJlaXRlbiIKKworIzogZ2l0LWd1aS5zaDoxODYzIGxpYi9jaG9vc2VfcmV2LnRjbDo1NjEKK21zZ2lkICJCcmFuY2giCittc2dzdHIgIlp3ZWlnIgorCisjOiBnaXQtZ3VpLnNoOjE4NjYgbGliL2Nob29zZV9yZXYudGNsOjU0OAorbXNnaWQgIkNvbW1pdEBAbm91biIKK21zZ3N0ciAiVmVyc2lvbiIKKworIzogZ2l0LWd1aS5zaDoxODY5IGxpYi9tZXJnZS50Y2w6MTIwIGxpYi9tZXJnZS50Y2w6MTQ5IGxpYi9tZXJnZS50Y2w6MTY3Cittc2dpZCAiTWVyZ2UiCittc2dzdHIgIlp1c2FtbWVuZsO8aHJlbiIKKworIzogZ2l0LWd1aS5zaDoxODcwIGxpYi9jaG9vc2VfcmV2LnRjbDo1NTcKK21zZ2lkICJSZW1vdGUiCittc2dzdHIgIkFuZGVyZSBBcmNoaXZlIgorCisjOiBnaXQtZ3VpLnNoOjE4NzkKK21zZ2lkICJCcm93c2UgQ3VycmVudCBCcmFuY2gncyBGaWxlcyIKK21zZ3N0ciAiQWt0dWVsbGVuIFp3ZWlnIGR1cmNoYmzDpHR0ZXJuIgorCisjOiBnaXQtZ3VpLnNoOjE4ODMKK21zZ2lkICJCcm93c2UgQnJhbmNoIEZpbGVzLi4uIgorbXNnc3RyICJFaW5lbiBad2VpZyBkdXJjaGJsw6R0dGVybi4uLiIKKworIzogZ2l0LWd1aS5zaDoxODg4Cittc2dpZCAiVmlzdWFsaXplIEN1cnJlbnQgQnJhbmNoJ3MgSGlzdG9yeSIKK21zZ3N0ciAiQWt0dWVsbGVuIFp3ZWlnIGRhcnN0ZWxsZW4iCisKKyM6IGdpdC1ndWkuc2g6MTg5MgorbXNnaWQgIlZpc3VhbGl6ZSBBbGwgQnJhbmNoIEhpc3RvcnkiCittc2dzdHIgIkFsbGUgWndlaWdlIGRhcnN0ZWxsZW4iCisKKyM6IGdpdC1ndWkuc2g6MTg5OQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkJyb3dzZSAlcydzIEZpbGVzIgorbXNnc3RyICJad2VpZyDCuyVzwqsgZHVyY2hibMOkdHRlcm4iCisKKyM6IGdpdC1ndWkuc2g6MTkwMQorIywgdGNsLWZvcm1hdAorbXNnaWQgIlZpc3VhbGl6ZSAlcydzIEhpc3RvcnkiCittc2dzdHIgIkhpc3RvcmllIHZvbiDCuyVzwqsgZGFyc3RlbGxlbiIKKworIzogZ2l0LWd1aS5zaDoxOTA2IGxpYi9kYXRhYmFzZS50Y2w6MjcgbGliL2RhdGFiYXNlLnRjbDo2NworbXNnaWQgIkRhdGFiYXNlIFN0YXRpc3RpY3MiCittc2dzdHIgIkRhdGVuYmFua3N0YXRpc3RpayIKKworIzogZ2l0LWd1aS5zaDoxOTA5IGxpYi9kYXRhYmFzZS50Y2w6MzQKK21zZ2lkICJDb21wcmVzcyBEYXRhYmFzZSIKK21zZ3N0ciAiRGF0ZW5iYW5rIGtvbXByaW1pZXJlbiIKKworIzogZ2l0LWd1aS5zaDoxOTEyCittc2dpZCAiVmVyaWZ5IERhdGFiYXNlIgorbXNnc3RyICJEYXRlbmJhbmsgw7xiZXJwcsO8ZmVuIgorCisjOiBnaXQtZ3VpLnNoOjE5MTkgZ2l0LWd1aS5zaDoxOTIzIGdpdC1ndWkuc2g6MTkyNyBsaWIvc2hvcnRjdXQudGNsOjcKKyM6IGxpYi9zaG9ydGN1dC50Y2w6MzkgbGliL3Nob3J0Y3V0LnRjbDo3MQorbXNnaWQgIkNyZWF0ZSBEZXNrdG9wIEljb24iCittc2dzdHIgIkRlc2t0b3AtSWNvbiBlcnN0ZWxsZW4iCisKKyM6IGdpdC1ndWkuc2g6MTkzMiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjE3NyBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjE4NQorbXNnaWQgIlF1aXQiCittc2dzdHIgIkJlZW5kZW4iCisKKyM6IGdpdC1ndWkuc2g6MTkzOQorbXNnaWQgIlVuZG8iCittc2dzdHIgIlLDvGNrZ8OkbmdpZyIKKworIzogZ2l0LWd1aS5zaDoxOTQyCittc2dpZCAiUmVkbyIKK21zZ3N0ciAiV2llZGVyaG9sZW4iCisKKyM6IGdpdC1ndWkuc2g6MTk0NiBnaXQtZ3VpLnNoOjI0NDMKK21zZ2lkICJDdXQiCittc2dzdHIgIkF1c3NjaG5laWRlbiIKKworIzogZ2l0LWd1aS5zaDoxOTQ5IGdpdC1ndWkuc2g6MjQ0NiBnaXQtZ3VpLnNoOjI1MjAgZ2l0LWd1aS5zaDoyNjE0CisjOiBsaWIvY29uc29sZS50Y2w6NjkKK21zZ2lkICJDb3B5IgorbXNnc3RyICJLb3BpZXJlbiIKKworIzogZ2l0LWd1aS5zaDoxOTUyIGdpdC1ndWkuc2g6MjQ0OQorbXNnaWQgIlBhc3RlIgorbXNnc3RyICJFaW5mw7xnZW4iCisKKyM6IGdpdC1ndWkuc2g6MTk1NSBnaXQtZ3VpLnNoOjI0NTIgbGliL2JyYW5jaF9kZWxldGUudGNsOjI2CisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjM4Cittc2dpZCAiRGVsZXRlIgorbXNnc3RyICJMw7ZzY2hlbiIKKworIzogZ2l0LWd1aS5zaDoxOTU5IGdpdC1ndWkuc2g6MjQ1NiBnaXQtZ3VpLnNoOjI2MTggbGliL2NvbnNvbGUudGNsOjcxCittc2dpZCAiU2VsZWN0IEFsbCIKK21zZ3N0ciAiQWxsZSBhdXN3w6RobGVuIgorCisjOiBnaXQtZ3VpLnNoOjE5NjgKK21zZ2lkICJDcmVhdGUuLi4iCittc2dzdHIgIkVyc3RlbGxlbi4uLiIKKworIzogZ2l0LWd1aS5zaDoxOTc0Cittc2dpZCAiQ2hlY2tvdXQuLi4iCittc2dzdHIgIlVtc3RlbGxlbi4uLiIKKworIzogZ2l0LWd1aS5zaDoxOTgwCittc2dpZCAiUmVuYW1lLi4uIgorbXNnc3RyICJVbWJlbmVubmVuLi4uIgorCisjOiBnaXQtZ3VpLnNoOjE5ODUgZ2l0LWd1aS5zaDoyMDg1Cittc2dpZCAiRGVsZXRlLi4uIgorbXNnc3RyICJMw7ZzY2hlbi4uLiIKKworIzogZ2l0LWd1aS5zaDoxOTkwCittc2dpZCAiUmVzZXQuLi4iCittc2dzdHIgIlp1csO8Y2tzZXR6ZW4uLi4iCisKKyM6IGdpdC1ndWkuc2g6MjAwMiBnaXQtZ3VpLnNoOjIzODkKK21zZ2lkICJOZXcgQ29tbWl0IgorbXNnc3RyICJOZXVlIFZlcnNpb24iCisKKyM6IGdpdC1ndWkuc2g6MjAxMCBnaXQtZ3VpLnNoOjIzOTYKK21zZ2lkICJBbWVuZCBMYXN0IENvbW1pdCIKK21zZ3N0ciAiTGV0enRlIG5hY2hiZXNzZXJuIgorCisjOiBnaXQtZ3VpLnNoOjIwMTkgZ2l0LWd1aS5zaDoyMzU2IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6OTkKK21zZ2lkICJSZXNjYW4iCittc2dzdHIgIk5ldSBsYWRlbiIKKworIzogZ2l0LWd1aS5zaDoyMDI1Cittc2dpZCAiU3RhZ2UgVG8gQ29tbWl0IgorbXNnc3RyICJadW0gRWludHJhZ2VuIGJlcmVpdHN0ZWxsZW4iCisKKyM6IGdpdC1ndWkuc2g6MjAzMQorbXNnaWQgIlN0YWdlIENoYW5nZWQgRmlsZXMgVG8gQ29tbWl0IgorbXNnc3RyICJHZcOkbmRlcnRlIERhdGVpZW4gYmVyZWl0c3RlbGxlbiIKKworIzogZ2l0LWd1aS5zaDoyMDM3Cittc2dpZCAiVW5zdGFnZSBGcm9tIENvbW1pdCIKK21zZ3N0ciAiQXVzIGRlciBCZXJlaXRzdGVsbHVuZyBoZXJhdXNuZWhtZW4iCisKKyM6IGdpdC1ndWkuc2g6MjA0MiBsaWIvaW5kZXgudGNsOjM5NQorbXNnaWQgIlJldmVydCBDaGFuZ2VzIgorbXNnc3RyICLDhG5kZXJ1bmdlbiB2ZXJ3ZXJmZW4iCisKKyM6IGdpdC1ndWkuc2g6MjA0OSBnaXQtZ3VpLnNoOjIzNjggZ2l0LWd1aS5zaDoyNDY3Cittc2dpZCAiU2lnbiBPZmYiCittc2dzdHIgIkFiemVpY2huZW4iCisKKyM6IGdpdC1ndWkuc2g6MjA1MyBnaXQtZ3VpLnNoOjIzNzIKK21zZ2lkICJDb21taXRAQHZlcmIiCittc2dzdHIgIkVpbnRyYWdlbiIKKworIzogZ2l0LWd1aS5zaDoyMDY0Cittc2dpZCAiTG9jYWwgTWVyZ2UuLi4iCittc2dzdHIgIkxva2FsZXMgWnVzYW1tZW5mw7xocmVuLi4uIgorCisjOiBnaXQtZ3VpLnNoOjIwNjkKK21zZ2lkICJBYm9ydCBNZXJnZS4uLiIKK21zZ3N0ciAiWnVzYW1tZW5mw7xocmVuIGFiYnJlY2hlbi4uLiIKKworIzogZ2l0LWd1aS5zaDoyMDgxCittc2dpZCAiUHVzaC4uLiIKK21zZ3N0ciAiVmVyc2VuZGVuLi4uIgorCisjOiBnaXQtZ3VpLnNoOjIwOTIgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0MQorbXNnaWQgIkFwcGxlIgorbXNnc3RyICJBcHBsZSIKKworIzogZ2l0LWd1aS5zaDoyMDk1IGdpdC1ndWkuc2g6MjExNyBsaWIvYWJvdXQudGNsOjE0CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ0IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJBYm91dCAlcyIKK21zZ3N0ciAiw5xiZXIgJXMiCisKKyM6IGdpdC1ndWkuc2g6MjA5OQorbXNnaWQgIlByZWZlcmVuY2VzLi4uIgorbXNnc3RyICJFaW5zdGVsbHVuZ2VuLi4uIgorCisjOiBnaXQtZ3VpLnNoOjIxMDcgZ2l0LWd1aS5zaDoyNjM5Cittc2dpZCAiT3B0aW9ucy4uLiIKK21zZ3N0ciAiT3B0aW9uZW4uLi4iCisKKyM6IGdpdC1ndWkuc2g6MjExMyBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ3Cittc2dpZCAiSGVscCIKK21zZ3N0ciAiSGlsZmUiCisKKyM6IGdpdC1ndWkuc2g6MjE1NAorbXNnaWQgIk9ubGluZSBEb2N1bWVudGF0aW9uIgorbXNnc3RyICJPbmxpbmUtRG9rdW1lbnRhdGlvbiIKKworIzogZ2l0LWd1aS5zaDoyMjM4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiZmF0YWw6IGNhbm5vdCBzdGF0IHBhdGggJXM6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiCittc2dzdHIgIiIKKyJGZWhsZXI6IFZlcnplaWNobmlzIMK7JXPCqyBrYW5uIG5pY2h0IGdlbGVzZW4gd2VyZGVuOiBEYXRlaSBvZGVyIFZlcnplaWNobmlzICIKKyJuaWNodCBnZWZ1bmRlbiIKKworIzogZ2l0LWd1aS5zaDoyMjcxCittc2dpZCAiQ3VycmVudCBCcmFuY2g6IgorbXNnc3RyICJBa3R1ZWxsZXIgWndlaWc6IgorCisjOiBnaXQtZ3VpLnNoOjIyOTIKK21zZ2lkICJTdGFnZWQgQ2hhbmdlcyAoV2lsbCBDb21taXQpIgorbXNnc3RyICJCZXJlaXRzdGVsbHVuZyAoenVtIEVpbnRyYWdlbikiCisKKyM6IGdpdC1ndWkuc2g6MjMxMgorbXNnaWQgIlVuc3RhZ2VkIENoYW5nZXMiCittc2dzdHIgIk5pY2h0IGJlcmVpdGdlc3RlbGx0ZSDDhG5kZXJ1bmdlbiIKKworIzogZ2l0LWd1aS5zaDoyMzYyCittc2dpZCAiU3RhZ2UgQ2hhbmdlZCIKK21zZ3N0ciAiQWxsZXMgYmVyZWl0c3RlbGxlbiIKKworIzogZ2l0LWd1aS5zaDoyMzc4IGxpYi90cmFuc3BvcnQudGNsOjkzIGxpYi90cmFuc3BvcnQudGNsOjE4MgorbXNnaWQgIlB1c2giCittc2dzdHIgIlZlcnNlbmRlbiIKKworIzogZ2l0LWd1aS5zaDoyNDA4Cittc2dpZCAiSW5pdGlhbCBDb21taXQgTWVzc2FnZToiCittc2dzdHIgIkVyc3RlIFZlcnNpb25zYmVzY2hyZWlidW5nOiIKKworIzogZ2l0LWd1aS5zaDoyNDA5Cittc2dpZCAiQW1lbmRlZCBDb21taXQgTWVzc2FnZToiCittc2dzdHIgIk5hY2hnZWJlc3NlcnRlIEJlc2NocmVpYnVuZzoiCisKKyM6IGdpdC1ndWkuc2g6MjQxMAorbXNnaWQgIkFtZW5kZWQgSW5pdGlhbCBDb21taXQgTWVzc2FnZToiCittc2dzdHIgIk5hY2hnZWJlc3NlcnRlIGVyc3RlIEJlc2NocmVpYnVuZzoiCisKKyM6IGdpdC1ndWkuc2g6MjQxMQorbXNnaWQgIkFtZW5kZWQgTWVyZ2UgQ29tbWl0IE1lc3NhZ2U6IgorbXNnc3RyICJOYWNoZ2ViZXNzZXJ0ZSBadXNhbW1lbmbDvGhydW5ncy1CZXNjaHJlaWJ1bmc6IgorCisjOiBnaXQtZ3VpLnNoOjI0MTIKK21zZ2lkICJNZXJnZSBDb21taXQgTWVzc2FnZToiCittc2dzdHIgIlp1c2FtbWVuZsO8aHJ1bmdzLUJlc2NocmVpYnVuZzoiCisKKyM6IGdpdC1ndWkuc2g6MjQxMworbXNnaWQgIkNvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAiVmVyc2lvbnNiZXNjaHJlaWJ1bmc6IgorCisjOiBnaXQtZ3VpLnNoOjI0NTkgZ2l0LWd1aS5zaDoyNjIyIGxpYi9jb25zb2xlLnRjbDo3MworbXNnaWQgIkNvcHkgQWxsIgorbXNnc3RyICJBbGxlIGtvcGllcmVuIgorCisjOiBnaXQtZ3VpLnNoOjI0ODMgbGliL2JsYW1lLnRjbDoxMDcKK21zZ2lkICJGaWxlOiIKK21zZ3N0ciAiRGF0ZWk6IgorCisjOiBnaXQtZ3VpLnNoOjI1ODkKK21zZ2lkICJBcHBseS9SZXZlcnNlIEh1bmsiCittc2dzdHIgIktvbnRleHQgYW53ZW5kZW4vdW1rZWhyZW4iCisKKyM6IGdpdC1ndWkuc2g6MjU5NQorbXNnaWQgIlNob3cgTGVzcyBDb250ZXh0IgorbXNnc3RyICJXZW5pZ2VyIFplaWxlbiBhbnplaWdlbiIKKworIzogZ2l0LWd1aS5zaDoyNjAyCittc2dpZCAiU2hvdyBNb3JlIENvbnRleHQiCittc2dzdHIgIk1laHIgWmVpbGVuIGFuemVpZ2VuIgorCisjOiBnaXQtZ3VpLnNoOjI2MTAKK21zZ2lkICJSZWZyZXNoIgorbXNnc3RyICJBa3R1YWxpc2llcmVuIgorCisjOiBnaXQtZ3VpLnNoOjI2MzEKK21zZ2lkICJEZWNyZWFzZSBGb250IFNpemUiCittc2dzdHIgIlNjaHJpZnRncsO2w59lIHZlcmtsZWluZXJuIgorCisjOiBnaXQtZ3VpLnNoOjI2MzUKK21zZ2lkICJJbmNyZWFzZSBGb250IFNpemUiCittc2dzdHIgIlNjaHJpZnRncsO2w59lIHZlcmdyw7bDn2VybiIKKworIzogZ2l0LWd1aS5zaDoyNjQ2Cittc2dpZCAiVW5zdGFnZSBIdW5rIEZyb20gQ29tbWl0IgorbXNnc3RyICJLb250ZXh0IGF1cyBCZXJlaXRzdGVsbHVuZyBoZXJhdXNuZWhtZW4iCisKKyM6IGdpdC1ndWkuc2g6MjY0OAorbXNnaWQgIlN0YWdlIEh1bmsgRm9yIENvbW1pdCIKK21zZ3N0ciAiS29udGV4dCB6dXIgQmVyZWl0c3RlbGx1bmcgaGluenVmw7xnZW4iCisKKyM6IGdpdC1ndWkuc2g6MjY2NworbXNnaWQgIkluaXRpYWxpemluZy4uLiIKK21zZ3N0ciAiSW5pdGlhbGlzaWVyZW4uLi4iCisKKyM6IGdpdC1ndWkuc2g6Mjc2MgorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJQb3NzaWJsZSBlbnZpcm9ubWVudCBpc3N1ZXMgZXhpc3QuXG4iCisiXG4iCisiVGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHByb2JhYmx5XG4iCisiZ29pbmcgdG8gYmUgaWdub3JlZCBieSBhbnkgR2l0IHN1YnByb2Nlc3MgcnVuXG4iCisiYnkgJXM6XG4iCisiXG4iCittc2dzdHIgIiIKKyJNw7ZnbGljaGVyd2Vpc2UgZ2lidCBlcyBQcm9ibGVtZSBtaXQgbWFuY2hlbiBVbWdlYnVuZ3N2YXJpYWJsZW4uXG4iCisiXG4iCisiRGllIGZvbGdlbmRlbiBVbWdlYnVuZ3N2YXJpYWJsZW4ga8O2bm5lbiB2ZXJtdXRsaWNoIG5pY2h0IFxuIgorInZvbiAlcyBhbiBHaXQgd2VpdGVyZ2VnZWJlbiB3ZXJkZW46XG4iCisiXG4iCisKKyM6IGdpdC1ndWkuc2g6Mjc5MgorbXNnaWQgIiIKKyJcbiIKKyJUaGlzIGlzIGR1ZSB0byBhIGtub3duIGlzc3VlIHdpdGggdGhlXG4iCisiVGNsIGJpbmFyeSBkaXN0cmlidXRlZCBieSBDeWd3aW4uIgorbXNnc3RyICIiCisiXG4iCisiRGllcyBpc3QgZWluIGJla2FubnRlcyBQcm9ibGVtIGRlciBUY2wtVmVyc2lvbiwgZGllXG4iCisiaW4gQ3lnd2luIG1pdGdlbGllZmVydCB3aXJkLiIKKworIzogZ2l0LWd1aS5zaDoyNzk3CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIlxuIgorIkEgZ29vZCByZXBsYWNlbWVudCBmb3IgJXNcbiIKKyJpcyBwbGFjaW5nIHZhbHVlcyBmb3IgdGhlIHVzZXIubmFtZSBhbmRcbiIKKyJ1c2VyLmVtYWlsIHNldHRpbmdzIGludG8geW91ciBwZXJzb25hbFxuIgorIn4vLmdpdGNvbmZpZyBmaWxlLlxuIgorbXNnc3RyICIiCisiXG4iCisiXG4iCisiVW0gZGVuIE5hbWVuIMK7JXPCqyB6dSDDpG5kZXJuLCBzb2xsdGVuIFNpZSBkaWUgXG4iCisiZ2V3w7xuc2NodGVuIFdlcnRlIGbDvHIgZGllIEVpbnN0ZWxsdW5nIHVzZXIubmFtZSB1bmQgXG4iCisidXNlci5lbWFpbCBpbiBJaHJlIERhdGVpIH4vLmdpdGNvbmZpZyBlaW5mw7xnZW4uXG4iCisKKyM6IGxpYi9hYm91dC50Y2w6MjYKK21zZ2lkICJnaXQtZ3VpIC0gYSBncmFwaGljYWwgdXNlciBpbnRlcmZhY2UgZm9yIEdpdC4iCittc2dzdHIgImdpdC1ndWkgLSBlaW5lIGdyYWZpc2NoZSBPYmVyZmzDpGNoZSBmw7xyIEdpdC4iCisKKyM6IGxpYi9ibGFtZS50Y2w6NzcKK21zZ2lkICJGaWxlIFZpZXdlciIKK21zZ3N0ciAiRGF0ZWktQnJvd3NlciIKKworIzogbGliL2JsYW1lLnRjbDo4MQorbXNnaWQgIkNvbW1pdDoiCittc2dzdHIgIlZlcnNpb246IgorCisjOiBsaWIvYmxhbWUudGNsOjI2NAorbXNnaWQgIkNvcHkgQ29tbWl0IgorbXNnc3RyICJWZXJzaW9uIGtvcGllcmVuIgorCisjOiBsaWIvYmxhbWUudGNsOjM4NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIlJlYWRpbmcgJXMuLi4iCittc2dzdHIgIiVzIGxlc2VuLi4uIgorCisjOiBsaWIvYmxhbWUudGNsOjQ4OAorbXNnaWQgIkxvYWRpbmcgY29weS9tb3ZlIHRyYWNraW5nIGFubm90YXRpb25zLi4uIgorbXNnc3RyICJBbm5vdGllcnVuZ2VuIGbDvHIgS29waWVyZW4vVmVyc2NoaWViZW4gd2VyZGVuIGdlbGFkZW4uLi4iCisKKyM6IGxpYi9ibGFtZS50Y2w6NTA4Cittc2dpZCAibGluZXMgYW5ub3RhdGVkIgorbXNnc3RyICJaZWlsZW4gYW5ub3RpZXJ0IgorCisjOiBsaWIvYmxhbWUudGNsOjY4OQorbXNnaWQgIkxvYWRpbmcgb3JpZ2luYWwgbG9jYXRpb24gYW5ub3RhdGlvbnMuLi4iCittc2dzdHIgIkFubm90aWVydW5nZW4gZsO8ciB1cnNwcsO8bmdsaWNoZW4gT3J0IHdlcmRlbiBnZWxhZGVuLi4uIgorCisjOiBsaWIvYmxhbWUudGNsOjY5MgorbXNnaWQgIkFubm90YXRpb24gY29tcGxldGUuIgorbXNnc3RyICJBbm5vdGllcnVuZyB2b2xsc3TDpG5kaWcuIgorCisjOiBsaWIvYmxhbWUudGNsOjc0NgorbXNnaWQgIkxvYWRpbmcgYW5ub3RhdGlvbi4uLiIKK21zZ3N0ciAiQW5ub3RpZXJ1bmcgbGFkZW4uLi4iCisKKyM6IGxpYi9ibGFtZS50Y2w6ODAyCittc2dpZCAiQXV0aG9yOiIKK21zZ3N0ciAiQXV0b3I6IgorCisjOiBsaWIvYmxhbWUudGNsOjgwNgorbXNnaWQgIkNvbW1pdHRlcjoiCittc2dzdHIgIkVpbnRyYWdlbmRlcjoiCisKKyM6IGxpYi9ibGFtZS50Y2w6ODExCittc2dpZCAiT3JpZ2luYWwgRmlsZToiCittc2dzdHIgIlVyc3Byw7xuZ2xpY2hlIERhdGVpOiIKKworIzogbGliL2JsYW1lLnRjbDo5MjUKK21zZ2lkICJPcmlnaW5hbGx5IEJ5OiIKK21zZ3N0ciAiVXJzcHLDvG5nbGljaCB2b246IgorCisjOiBsaWIvYmxhbWUudGNsOjkzMQorbXNnaWQgIkluIEZpbGU6IgorbXNnc3RyICJJbiBEYXRlaToiCisKKyM6IGxpYi9ibGFtZS50Y2w6OTM2Cittc2dpZCAiQ29waWVkIE9yIE1vdmVkIEhlcmUgQnk6IgorbXNnc3RyICJLb3BpZXJ0IG9kZXIgdmVyc2Nob2JlbiBkdXJjaDoiCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjE0IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjE5Cittc2dpZCAiQ2hlY2tvdXQgQnJhbmNoIgorbXNnc3RyICJBdWYgWndlaWcgdW1zdGVsbGVuIgorCisjOiBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDoyMworbXNnaWQgIkNoZWNrb3V0IgorbXNnc3RyICJVbXN0ZWxsZW4iCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjI3IGxpYi9icmFuY2hfY3JlYXRlLnRjbDozNQorIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjMyIGxpYi9icmFuY2hfcmVuYW1lLnRjbDozMCBsaWIvYnJvd3Nlci50Y2w6MjgyCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjUyMiBsaWIvY2hvb3NlX2ZvbnQudGNsOjQzIGxpYi9tZXJnZS50Y2w6MTcxCisjOiBsaWIvb3B0aW9uLnRjbDoxMDMgbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDo0MiBsaWIvdHJhbnNwb3J0LnRjbDo5NworbXNnaWQgIkNhbmNlbCIKK21zZ3N0ciAiQWJicmVjaGVuIgorCisjOiBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDozMiBsaWIvYnJvd3Nlci50Y2w6Mjg3Cittc2dpZCAiUmV2aXNpb24iCittc2dzdHIgIlZlcnNpb24iCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjM2IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo2OSBsaWIvb3B0aW9uLnRjbDoyNDIKK21zZ2lkICJPcHRpb25zIgorbXNnc3RyICJPcHRpb25lbiIKKworIzogbGliL2JyYW5jaF9jaGVja291dC50Y2w6MzkgbGliL2JyYW5jaF9jcmVhdGUudGNsOjkyCittc2dpZCAiRmV0Y2ggVHJhY2tpbmcgQnJhbmNoIgorbXNnc3RyICLDnGJlcm5haG1lendlaWcgYW5mb3JkZXJuIgorCisjOiBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDo0NAorbXNnaWQgIkRldGFjaCBGcm9tIExvY2FsIEJyYW5jaCIKK21zZ3N0ciAiVmVyYmluZHVuZyB6dSBsb2thbGVtIFp3ZWlnIGzDtnNlbiIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjIyCittc2dpZCAiQ3JlYXRlIEJyYW5jaCIKK21zZ3N0ciAiWndlaWcgZXJzdGVsbGVuIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MjcKK21zZ2lkICJDcmVhdGUgTmV3IEJyYW5jaCIKK21zZ3N0ciAiTmV1ZW4gWndlaWcgZXJzdGVsbGVuIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MzEgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozNzEKK21zZ2lkICJDcmVhdGUiCittc2dzdHIgIkVyc3RlbGxlbiIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjQwCittc2dpZCAiQnJhbmNoIE5hbWUiCittc2dzdHIgIlp3ZWlnbmFtZSIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjQzCittc2dpZCAiTmFtZToiCittc2dzdHIgIk5hbWU6IgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NTgKK21zZ2lkICJNYXRjaCBUcmFja2luZyBCcmFuY2ggTmFtZSIKK21zZ3N0ciAiUGFzc2VuZCB6dSDDnGJlcm5haG1lendlaWctTmFtZSIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjY2Cittc2dpZCAiU3RhcnRpbmcgUmV2aXNpb24iCittc2dzdHIgIkFuZmFuZ3N2ZXJzaW9uIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NzIKK21zZ2lkICJVcGRhdGUgRXhpc3RpbmcgQnJhbmNoOiIKK21zZ3N0ciAiRXhpc3RpZXJlbmRlbiBad2VpZyBha3R1YWxpc2llcmVuOiIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjc1Cittc2dpZCAiTm8iCittc2dzdHIgIk5laW4iCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo4MAorbXNnaWQgIkZhc3QgRm9yd2FyZCBPbmx5IgorbXNnc3RyICJOdXIgU2NobmVsbHp1c2FtbWVuZsO8aHJ1bmciCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo4NSBsaWIvY2hlY2tvdXRfb3AudGNsOjUxNAorbXNnaWQgIlJlc2V0IgorbXNnc3RyICJadXLDvGNrc2V0emVuIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6OTcKK21zZ2lkICJDaGVja291dCBBZnRlciBDcmVhdGlvbiIKK21zZ3N0ciAiQXJiZWl0c2tvcGllIHVtc3RlbGxlbiBuYWNoIEVyc3RlbGxlbiIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjEzMQorbXNnaWQgIlBsZWFzZSBzZWxlY3QgYSB0cmFja2luZyBicmFuY2guIgorbXNnc3RyICJCaXR0ZSB3w6RobGVuIFNpZSBlaW5lbiDDnGJlcm5haG1lendlaWcuIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MTQwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVHJhY2tpbmcgYnJhbmNoICVzIGlzIG5vdCBhIGJyYW5jaCBpbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnkuIgorbXNnc3RyICLDnGJlcm5haG1lendlaWcgwrslc8KrIGlzdCBrZWluIFp3ZWlnIGltIGFuZGVyZW4gUHJvamVrdGFyY2hpdi4iCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDoxNTMgbGliL2JyYW5jaF9yZW5hbWUudGNsOjg2Cittc2dpZCAiUGxlYXNlIHN1cHBseSBhIGJyYW5jaCBuYW1lLiIKK21zZ3N0ciAiQml0dGUgZ2ViZW4gU2llIGVpbmVuIFp3ZWlnbmFtZW4gYW4uIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MTY0IGxpYi9icmFuY2hfcmVuYW1lLnRjbDoxMDYKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICInJXMnIGlzIG5vdCBhbiBhY2NlcHRhYmxlIGJyYW5jaCBuYW1lLiIKK21zZ3N0ciAiwrslc8KrIGlzdCBrZWluIHp1bMOkc3NpZ2VyIFp3ZWlnbmFtZS4iCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDoxNQorbXNnaWQgIkRlbGV0ZSBCcmFuY2giCittc2dzdHIgIlp3ZWlnIGzDtnNjaGVuIgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MjAKK21zZ2lkICJEZWxldGUgTG9jYWwgQnJhbmNoIgorbXNnc3RyICJMb2thbGVuIFp3ZWlnIGzDtnNjaGVuIgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MzcKK21zZ2lkICJMb2NhbCBCcmFuY2hlcyIKK21zZ3N0ciAiTG9rYWxlIFp3ZWlnZSIKKworIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjUyCittc2dpZCAiRGVsZXRlIE9ubHkgSWYgTWVyZ2VkIEludG8iCittc2dzdHIgIk51ciBsw7ZzY2hlbiwgd2VubiB6dXNhbW1lbmdlZsO8aHJ0IG5hY2giCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDo1NAorbXNnaWQgIkFsd2F5cyAoRG8gbm90IHBlcmZvcm0gbWVyZ2UgdGVzdC4pIgorbXNnc3RyICJJbW1lciAob2huZSBadXNhbW1lbmbDvGhydW5nc3Rlc3QpIgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MTAzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVGhlIGZvbGxvd2luZyBicmFuY2hlcyBhcmUgbm90IGNvbXBsZXRlbHkgbWVyZ2VkIGludG8gJXM6IgorbXNnc3RyICJGb2xnZW5kZSBad2VpZ2Ugc2luZCBub2NoIG5pY2h0IG1pdCDCuyVzwqsgenVzYW1tZW5nZWbDvGhydDoiCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDoxMTUKK21zZ2lkICIiCisiUmVjb3ZlcmluZyBkZWxldGVkIGJyYW5jaGVzIGlzIGRpZmZpY3VsdC4gXG4iCisiXG4iCisiIERlbGV0ZSB0aGUgc2VsZWN0ZWQgYnJhbmNoZXM/IgorbXNnc3RyICIiCisiR2Vsw7ZzY2h0ZSBad2VpZ2Uga8O2bm5lbiBudXIgbWl0IGdyw7bDn2VyZW0gQXVmd2FuZCB3aWVkZXJoZXJnZXN0ZWxsdCB3ZXJkZW4uXG4iCisiXG4iCisiR2V3w6RobHRlIFp3ZWlnZSBqZXR6dCBsw7ZzY2hlbj8iCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDoxNDEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGRlbGV0ZSBicmFuY2hlczpcbiIKKyIlcyIKK21zZ3N0ciAiIgorIkZlaGxlciBiZWltIEzDtnNjaGVuIGRlciBad2VpZ2U6XG4iCisiJXMiCisKKyM6IGxpYi9icmFuY2hfcmVuYW1lLnRjbDoxNCBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MjIKK21zZ2lkICJSZW5hbWUgQnJhbmNoIgorbXNnc3RyICJad2VpZyB1bWJlbmVubmVuIgorCisjOiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MjYKK21zZ2lkICJSZW5hbWUiCittc2dzdHIgIlVtYmVuZW5uZW4iCisKKyM6IGxpYi9icmFuY2hfcmVuYW1lLnRjbDozNgorbXNnaWQgIkJyYW5jaDoiCittc2dzdHIgIlp3ZWlnOiIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjM5Cittc2dpZCAiTmV3IE5hbWU6IgorbXNnc3RyICJOZXVlciBOYW1lOiIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjc1Cittc2dpZCAiUGxlYXNlIHNlbGVjdCBhIGJyYW5jaCB0byByZW5hbWUuIgorbXNnc3RyICJCaXR0ZSB3w6RobGVuIFNpZSBlaW5lbiBad2VpZyB6dW0gdW1iZW5lbm5lbi4iCisKKyM6IGxpYi9icmFuY2hfcmVuYW1lLnRjbDo5NiBsaWIvY2hlY2tvdXRfb3AudGNsOjE3OQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkJyYW5jaCAnJXMnIGFscmVhZHkgZXhpc3RzLiIKK21zZ3N0ciAiWndlaWcgwrslc8KrIGV4aXN0aWVydCBiZXJlaXRzLiIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjExNworIywgdGNsLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byByZW5hbWUgJyVzJy4iCittc2dzdHIgIkZlaGxlciBiZWltIFVtYmVuZW5uZW4gdm9uIMK7JXPCqy4iCisKKyM6IGxpYi9icm93c2VyLnRjbDoxNworbXNnaWQgIlN0YXJ0aW5nLi4uIgorbXNnc3RyICJTdGFydGVuLi4uIgorCisjOiBsaWIvYnJvd3Nlci50Y2w6MjYKK21zZ2lkICJGaWxlIEJyb3dzZXIiCittc2dzdHIgIkRhdGVpLUJyb3dzZXIiCisKKyM6IGxpYi9icm93c2VyLnRjbDoxMjYgbGliL2Jyb3dzZXIudGNsOjE0MworIywgdGNsLWZvcm1hdAorbXNnaWQgIkxvYWRpbmcgJXMuLi4iCittc2dzdHIgIiVzIGxhZGVuLi4uIgorCisjOiBsaWIvYnJvd3Nlci50Y2w6MTg3Cittc2dpZCAiW1VwIFRvIFBhcmVudF0iCittc2dzdHIgIltOYWNoIG9iZW5dIgorCisjOiBsaWIvYnJvd3Nlci50Y2w6MjY3IGxpYi9icm93c2VyLnRjbDoyNzMKK21zZ2lkICJCcm93c2UgQnJhbmNoIEZpbGVzIgorbXNnc3RyICJEYXRlaWVuIGRlcyBad2VpZ3MgZHVyY2hibMOkdHRlcm4iCisKKyM6IGxpYi9icm93c2VyLnRjbDoyNzggbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozODcKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDc0IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDg0CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjk4NworbXNnaWQgIkJyb3dzZSIKK21zZ3N0ciAiQmzDpHR0ZXJuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjc5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRmV0Y2hpbmcgJXMgZnJvbSAlcyIKK21zZ3N0ciAiw4RuZGVydW5nZW4gwrslc8KrIHZvbiDCuyVzwqsgYW5mb3JkZXJuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjEyNworIywgdGNsLWZvcm1hdAorbXNnaWQgImZhdGFsOiBDYW5ub3QgcmVzb2x2ZSAlcyIKK21zZ3N0ciAiRmVobGVyOiDCuyVzwqsga2FubiBuaWNodCBhbHMgWndlaWcgb2RlciBWZXJzaW9uIGVya2FubnQgd2VyZGVuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjE0MCBsaWIvY29uc29sZS50Y2w6ODEgbGliL2RhdGFiYXNlLnRjbDozMQorbXNnaWQgIkNsb3NlIgorbXNnc3RyICJTY2hsaWXDn2VuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjE2OQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkJyYW5jaCAnJXMnIGRvZXMgbm90IGV4aXN0LiIKK21zZ3N0ciAiWndlaWcgwrslc8KrIGV4aXN0aWVydCBuaWNodC4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MjA2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIkJyYW5jaCAnJXMnIGFscmVhZHkgZXhpc3RzLlxuIgorIlxuIgorIkl0IGNhbm5vdCBmYXN0LWZvcndhcmQgdG8gJXMuXG4iCisiQSBtZXJnZSBpcyByZXF1aXJlZC4iCittc2dzdHIgIiIKKyJad2VpZyDCuyVzwqsgZXhpc3RpZXJ0IGJlcmVpdHMuXG4iCisiXG4iCisiWndlaWcga2FubiBuaWNodCBtaXQgwrslc8KrIHNjaG5lbGx6dXNhbW1lbmdlZsO8aHJ0IHdlcmRlbi4gUmVndWzDpHJlcyAiCisiWnVzYW1tZW5mw7xocmVuIGlzdCBub3R3ZW5kaWcuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjIyMAorIywgdGNsLWZvcm1hdAorbXNnaWQgIk1lcmdlIHN0cmF0ZWd5ICclcycgbm90IHN1cHBvcnRlZC4iCittc2dzdHIgIlp1c2FtbWVuZsO8aHJ1bmdzbWV0aG9kZSDCuyVzwqsgbmljaHQgdW50ZXJzdMO8dHp0LiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoyMzkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gdXBkYXRlICclcycuIgorbXNnc3RyICJBa3R1YWxpc2llcmVuIHZvbiDCuyVzwqsgZmVobGdlc2NobGFnZW4uIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjI1MQorbXNnaWQgIlN0YWdpbmcgYXJlYSAoaW5kZXgpIGlzIGFscmVhZHkgbG9ja2VkLiIKK21zZ3N0ciAiQmVyZWl0c3RlbGx1bmcgKMK7aW5kZXjCqykgaXN0IHp1ciBCZWFyYmVpdHVuZyBnZXNwZXJydCAowrtsb2NrZWTCqykuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjI2NgorbXNnaWQgIiIKKyJMYXN0IHNjYW5uZWQgc3RhdGUgZG9lcyBub3QgbWF0Y2ggcmVwb3NpdG9yeSBzdGF0ZS5cbiIKKyJcbiIKKyJBbm90aGVyIEdpdCBwcm9ncmFtIGhhcyBtb2RpZmllZCB0aGlzIHJlcG9zaXRvcnkgc2luY2UgdGhlIGxhc3Qgc2Nhbi4gIEEgIgorInJlc2NhbiBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlIGN1cnJlbnQgYnJhbmNoIGNhbiBiZSBjaGFuZ2VkLlxuIgorIlxuIgorIlRoZSByZXNjYW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgbm93LlxuIgorbXNnc3RyICIiCisiRGVyIGxldHp0ZSBnZWxhZGVuZSBTdGF0dXMgc3RpbW10IG5pY2h0IG1laHIgbWl0IGRlbSBQcm9qZWt0YXJjaGl2IMO8YmVyZWluLlxuIgorIlxuIgorIkVpbiBhbmRlcmVzIEdpdC1Qcm9ncmFtbSBoYXQgZGFzIFByb2pla3RhcmNoaXYgc2VpdCBkZW0gbGV0enRlbiBMYWRlbiAiCisiZ2XDpG5kZXJ0LiAgVm9yIGRlbSBXZWNoc2VsbiBkZXMgbG9rYWxlbiBad2VpZ3MgbXVzcyBuZXUgZ2VsYWRlbiB3ZXJkZW4uXG4iCisiXG4iCisiRXMgd2lyZCBnbGVpY2ggbmV1IGdlbGFkZW4uXG4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MzIyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVXBkYXRpbmcgd29ya2luZyBkaXJlY3RvcnkgdG8gJyVzJy4uLiIKK21zZ3N0ciAiQXJiZWl0c2tvcGllIHVtc3RlbGxlbiBhdWYgwrslc8KrLi4uIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjMyMworbXNnaWQgImZpbGVzIGNoZWNrZWQgb3V0IgorbXNnc3RyICJEYXRlaWVuIGFrdHVhbGlzaWVydCIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDozNTMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJBYm9ydGVkIGNoZWNrb3V0IG9mICclcycgKGZpbGUgbGV2ZWwgbWVyZ2luZyBpcyByZXF1aXJlZCkuIgorbXNnc3RyICIiCisiQXVmIFp3ZWlnIMK7JXPCqyB1bXN0ZWxsZW4gYWJnZWJyb2NoZW4gKFp1c2FtbWVuZsO8aHJlbiBkZXIgRGF0ZWllbiBpc3QgIgorIm5vdHdlbmRpZykuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjM1NAorbXNnaWQgIkZpbGUgbGV2ZWwgbWVyZ2UgcmVxdWlyZWQuIgorbXNnc3RyICJadXNhbW1lbmbDvGhyZW4gZGVyIERhdGVpZW4gaXN0IG5vdHdlbmRpZy4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MzU4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiU3RheWluZyBvbiBicmFuY2ggJyVzJy4iCittc2dzdHIgIkVzIHdpcmQgYXVmIFp3ZWlnIMK7JXPCqyB2ZXJibGllYmVuLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDo0MjkKK21zZ2lkICIiCisiWW91IGFyZSBubyBsb25nZXIgb24gYSBsb2NhbCBicmFuY2guXG4iCisiXG4iCisiSWYgeW91IHdhbnRlZCB0byBiZSBvbiBhIGJyYW5jaCwgY3JlYXRlIG9uZSBub3cgc3RhcnRpbmcgZnJvbSAnVGhpcyBEZXRhY2hlZCAiCisiQ2hlY2tvdXQnLiIKK21zZ3N0ciAiIgorIkRpZSBBcmJlaXRza29waWUgaXN0IG5pY2h0IGF1ZiBlaW5lbSBsb2thbGVuIFp3ZWlnLlxuIgorIlxuIgorIldlbm4gU2llIGF1ZiBlaW5lbSBad2VpZyBhcmJlaXRlbiBtw7ZjaHRlbiwgZXJzdGVsbGVuIFNpZSBiaXR0ZSBqZXR6dCBlaW5lbiAiCisiWndlaWcgbWl0IGRlciBBdXN3YWhsIMK7QWJnZXRyZW5udGUgQXJiZWl0c2tvcGllLVZlcnNpb27Cqy4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NDQ2IGxpYi9jaGVja291dF9vcC50Y2w6NDUwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQ2hlY2tlZCBvdXQgJyVzJy4iCittc2dzdHIgIlVtZ2VzdGVsbHQgYXVmIMK7JXPCqy4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NDc4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUmVzZXR0aW5nICclcycgdG8gJyVzJyB3aWxsIGxvc2UgdGhlIGZvbGxvd2luZyBjb21taXRzOiIKK21zZ3N0ciAiWnVyw7xja3NldHplbiB2b24gwrslc8KrIG5hY2ggwrslc8KrIHdpcmQgZm9sZ2VuZGUgVmVyc2lvbmVuIHZlcndlcmZlbjoiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NTAwCittc2dpZCAiUmVjb3ZlcmluZyBsb3N0IGNvbW1pdHMgbWF5IG5vdCBiZSBlYXN5LiIKK21zZ3N0ciAiIgorIlZlcndvcmZlbmUgVmVyc2lvbmVuIGvDtm5uZW4gbnVyIG1pdCBncsO2w59lcmVtIEF1ZndhbmQgd2llZGVyaGVyZ2VzdGVsbHQgIgorIndlcmRlbi4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NTA1CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUmVzZXQgJyVzJz8iCittc2dzdHIgIsK7JXPCqyB6dXLDvGNrc2V0emVuPyIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDo1MTAgbGliL21lcmdlLnRjbDoxNjMKK21zZ2lkICJWaXN1YWxpemUiCittc2dzdHIgIkRhcnN0ZWxsZW4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NTc4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBzZXQgY3VycmVudCBicmFuY2guXG4iCisiXG4iCisiVGhpcyB3b3JraW5nIGRpcmVjdG9yeSBpcyBvbmx5IHBhcnRpYWxseSBzd2l0Y2hlZC4gIFdlIHN1Y2Nlc3NmdWxseSB1cGRhdGVkICIKKyJ5b3VyIGZpbGVzLCBidXQgZmFpbGVkIHRvIHVwZGF0ZSBhbiBpbnRlcm5hbCBHaXQgZmlsZS5cbiIKKyJcbiIKKyJUaGlzIHNob3VsZCBub3QgaGF2ZSBvY2N1cnJlZC4gICVzIHdpbGwgbm93IGNsb3NlIGFuZCBnaXZlIHVwLiIKK21zZ3N0ciAiIgorIkxva2FsZXIgWndlaWcga2FubiBuaWNodCBnZXNldHp0IHdlcmRlbi5cbiIKKyJcbiIKKyJEaWVzZSBBcmJlaXRza29waWUgaXN0IG51ciB0ZWlsd2Vpc2UgdW1nZXN0ZWxsdC4gRGllIERhdGVpZW4gc2luZCBrb3JyZWt0ICIKKyJha3R1YWxpc2llcnQsIGFiZXIgZWluaWdlIGludGVybmUgR2l0LURhdGVpZW4ga29ubnRlbiBuaWNodCBnZcOkbmRlcnQgIgorIndlcmRlbi5cbiIKKyJcbiIKKyJEaWVzIGlzdCBlaW4gaW50ZXJuZXIgUHJvZ3JhbW1mZWhsZXIgdm9uICVzLiBQcm9ncmFtbSB3aXJkIGpldHp0IGFiZ2Vicm9jaGVuLiIKKworIzogbGliL2Nob29zZV9mb250LnRjbDozOQorbXNnaWQgIlNlbGVjdCIKK21zZ3N0ciAiQXVzd8OkaGxlbiIKKworIzogbGliL2Nob29zZV9mb250LnRjbDo1MworbXNnaWQgIkZvbnQgRmFtaWx5IgorbXNnc3RyICJTY2hyaWZ0ZmFtaWxpZSIKKworIzogbGliL2Nob29zZV9mb250LnRjbDo3NAorbXNnaWQgIkZvbnQgU2l6ZSIKK21zZ3N0ciAiU2NocmlmdGdyw7bDn2UiCisKKyM6IGxpYi9jaG9vc2VfZm9udC50Y2w6OTEKK21zZ2lkICJGb250IEV4YW1wbGUiCittc2dzdHIgIlNjaHJpZnRiZWlzcGllbCIKKworIzogbGliL2Nob29zZV9mb250LnRjbDoxMDMKK21zZ2lkICIiCisiVGhpcyBpcyBleGFtcGxlIHRleHQuXG4iCisiSWYgeW91IGxpa2UgdGhpcyB0ZXh0LCBpdCBjYW4gYmUgeW91ciBmb250LiIKK21zZ3N0ciAiIgorIkRpZXMgaXN0IGVpbiBCZWlzcGllbHRleHQuXG4iCisiV2VubiBJaG5lbiBkaWVzZXIgVGV4dCBnZWbDpGxsdCwgc29sbHRlbiBTaWUgZGllc2UgU2NocmlmdGFydCB3w6RobGVuLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoyOAorbXNnaWQgIkdpdCBHdWkiCittc2dzdHIgIkdpdCBHdWkiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODEgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozNzYKK21zZ2lkICJDcmVhdGUgTmV3IFJlcG9zaXRvcnkiCittc2dzdHIgIk5ldWVzIFByb2pla3RhcmNoaXYiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODcKK21zZ2lkICJOZXcuLi4iCittc2dzdHIgIk5ldS4uLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5NCBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ2MAorbXNnaWQgIkNsb25lIEV4aXN0aW5nIFJlcG9zaXRvcnkiCittc2dzdHIgIlByb2pla3RhcmNoaXYga2xvbmVuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEwMAorbXNnaWQgIkNsb25lLi4uIgorbXNnc3RyICJLbG9uZW4uLi4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTA3IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTc2Cittc2dpZCAiT3BlbiBFeGlzdGluZyBSZXBvc2l0b3J5IgorbXNnc3RyICJQcm9qZWt0YXJjaGl2IMO2ZmZuZW4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTEzCittc2dpZCAiT3Blbi4uLiIKK21zZ3N0ciAiw5ZmZm5lbi4uLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMjYKK21zZ2lkICJSZWNlbnQgUmVwb3NpdG9yaWVzIgorbXNnc3RyICJadWxldHp0IGJlbnV0enRlIFByb2pla3RhcmNoaXZlIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEzMgorbXNnaWQgIk9wZW4gUmVjZW50IFJlcG9zaXRvcnk6IgorbXNnc3RyICJadWxldHp0IGJlbnV0enRlcyBQcm9qZWt0YXJjaGl2IMO2ZmZuZW46IgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjI5NiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjMwMworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozMTAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY3JlYXRlIHJlcG9zaXRvcnkgJXM6IgorbXNnc3RyICJQcm9qZWt0YXJjaGl2IMK7JXPCqyBrb25udGUgbmljaHQgZXJzdGVsbHQgd2VyZGVuOiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozODEgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NzgKK21zZ2lkICJEaXJlY3Rvcnk6IgorbXNnc3RyICJWZXJ6ZWljaG5pczoiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDEyIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTM3CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEwMTEKK21zZ2lkICJHaXQgUmVwb3NpdG9yeSIKK21zZ3N0ciAiR2l0IFByb2pla3RhcmNoaXYiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDM3CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRGlyZWN0b3J5ICVzIGFscmVhZHkgZXhpc3RzLiIKK21zZ3N0ciAiVmVyemVpY2huaXMgwrslc8KrIGV4aXN0aWVydCBiZXJlaXRzLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NDEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJGaWxlICVzIGFscmVhZHkgZXhpc3RzLiIKK21zZ3N0ciAiRGF0ZWkgwrslc8KrIGV4aXN0aWVydCBiZXJlaXRzLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NTUKK21zZ2lkICJDbG9uZSIKK21zZ3N0ciAiS2xvbmVuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ2OAorbXNnaWQgIlVSTDoiCittc2dzdHIgIlVSTDoiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDg5Cittc2dpZCAiQ2xvbmUgVHlwZToiCittc2dzdHIgIkFydCBkZXMgS2xvbmVuczoiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDk1Cittc2dpZCAiU3RhbmRhcmQgKEZhc3QsIFNlbWktUmVkdW5kYW50LCBIYXJkbGlua3MpIgorbXNnc3RyICJTdGFuZGFyZCAoc2NobmVsbCwgdGVpbHdlaXNlIHJlZHVuZGFudCwgSGFyZGxpbmtzKSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1MDEKK21zZ2lkICJGdWxsIENvcHkgKFNsb3dlciwgUmVkdW5kYW50IEJhY2t1cCkiCittc2dzdHIgIkFsbGVzIGtvcGllcmVuIChsYW5nc2FtZXIsIHZvbGxlIFJlZHVuZGFueikiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTA3Cittc2dpZCAiU2hhcmVkIChGYXN0ZXN0LCBOb3QgUmVjb21tZW5kZWQsIE5vIEJhY2t1cCkiCittc2dzdHIgIlZlcmtuw7xwZnQgKHNjaG5lbGwsIG5pY2h0IGVtcGZvaGxlbiwga2VpbiBCYWNrdXApIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjU0MyBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjU5MAorIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3MzYgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo4MDYKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTAxNyBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEwMjUKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJOb3QgYSBHaXQgcmVwb3NpdG9yeTogJXMiCittc2dzdHIgIktlaW4gR2l0LVByb2pla3RhcmNoaXYgaW4gwrslc8KrIGdlZnVuZGVuLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1NzkKK21zZ2lkICJTdGFuZGFyZCBvbmx5IGF2YWlsYWJsZSBmb3IgbG9jYWwgcmVwb3NpdG9yeS4iCittc2dzdHIgIlN0YW5kYXJkIGlzdCBudXIgZsO8ciBsb2thbGUgUHJvamVrdGFyY2hpdmUgdmVyZsO8Z2Jhci4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTgzCittc2dpZCAiU2hhcmVkIG9ubHkgYXZhaWxhYmxlIGZvciBsb2NhbCByZXBvc2l0b3J5LiIKK21zZ3N0ciAiVmVya27DvHBmdCBpc3QgbnVyIGbDvHIgbG9rYWxlIFByb2pla3RhcmNoaXZlIHZlcmbDvGdiYXIuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjYwNAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkxvY2F0aW9uICVzIGFscmVhZHkgZXhpc3RzLiIKK21zZ3N0ciAiUHJvamVrdGFyY2hpdiDCuyVzwqsgZXhpc3RpZXJ0IGJlcmVpdHMuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjYxNQorbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgb3JpZ2luIgorbXNnc3RyICJEZXIgVXJzcHJ1bmdzb3J0IGtvbm50ZSBuaWNodCBlaW5nZXJpY2h0ZXQgd2VyZGVuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjYyNworbXNnaWQgIkNvdW50aW5nIG9iamVjdHMiCittc2dzdHIgIk9iamVrdGUgd2VyZGVuIGdlesOkaGx0IgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjYyOAorbXNnaWQgImJ1Y2tldHMiCittc2dzdHIgIkJ1Y2tldHMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NjUyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGNvcHkgb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXM6ICVzIgorbXNnc3RyICJLb3BpZW4gdm9uIE9iamVrdGVuL0luZm8vQWx0ZXJuYXRlcyBrb25udGVuIG5pY2h0IGVyc3RlbGx0IHdlcmRlbjogJXMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6Njg4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiTm90aGluZyB0byBjbG9uZSBmcm9tICVzLiIKK21zZ3N0ciAiVm9uIMK7JXPCqyBrb25udGUgbmljaHRzIGdla2xvbnQgd2VyZGVuLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo2OTAgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5MDQKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTE2Cittc2dpZCAiVGhlICdtYXN0ZXInIGJyYW5jaCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIgorbXNnc3RyICJEZXIgwrttYXN0ZXLCqy1ad2VpZyB3dXJkZSBub2NoIG5pY2h0IGluaXRpYWxpc2llcnQuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjcwMworbXNnaWQgIkhhcmRsaW5rcyBhcmUgdW5hdmFpbGFibGUuICBGYWxsaW5nIGJhY2sgdG8gY29weWluZy4iCittc2dzdHIgIkhhcmRsaW5rcyBuaWNodCB2ZXJmw7xnYmFyLiBTdGF0dGRlc3NlbiB3aXJkIGtvcGllcnQuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjcxNQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkNsb25pbmcgZnJvbSAlcyIKK21zZ3N0ciAiS29waWVyZW4gdm9uIMK7JXPCqyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3NDYKK21zZ2lkICJDb3B5aW5nIG9iamVjdHMiCittc2dzdHIgIk9iamVrdGRhdGVuYmFuayBrb3BpZXJlbiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3NDcKK21zZ2lkICJLaUIiCittc2dzdHIgIktCIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjc3MQorIywgdGNsLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBjb3B5IG9iamVjdDogJXMiCittc2dzdHIgIk9iamVrdCBrYW5uIG5pY2h0IGtvcGllcnQgd2VyZGVuOiAlcyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3ODEKK21zZ2lkICJMaW5raW5nIG9iamVjdHMiCittc2dzdHIgIk9iamVrdGUgdmVybGlua2VuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjc4MgorbXNnaWQgIm9iamVjdHMiCittc2dzdHIgIk9iamVrdGUiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzkwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGhhcmRsaW5rIG9iamVjdDogJXMiCittc2dzdHIgIkbDvHIgT2JqZWt0IGtvbm50ZSBrZWluIEhhcmRsaW5rIGVyc3RlbGx0IHdlcmRlbjogJXMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODQ1Cittc2dpZCAiQ2Fubm90IGZldGNoIGJyYW5jaGVzIGFuZCBvYmplY3RzLiAgU2VlIGNvbnNvbGUgb3V0cHV0IGZvciBkZXRhaWxzLiIKK21zZ3N0ciAiIgorIlp3ZWlnZSB1bmQgT2JqZWt0ZSBrb25udGVuIG5pY2h0IGFuZ2Vmb3JkZXJ0IHdlcmRlbi4gIEtvbnRyb2xsaWVyZW4gU2llIGRpZSAiCisiQXVzZ2FiZW4gYXVmIGRlciBLb25zb2xlIGbDvHIgd2VpdGVyZSBBbmdhYmVuLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo4NTYKK21zZ2lkICJDYW5ub3QgZmV0Y2ggdGFncy4gIFNlZSBjb25zb2xlIG91dHB1dCBmb3IgZGV0YWlscy4iCittc2dzdHIgIiIKKyJNYXJraWVydW5nZW4ga29ubnRlbiBuaWNodCBhbmdlZm9yZGVydCB3ZXJkZW4uICBLb250cm9sbGllcmVuIFNpZSBkaWUgIgorIkF1c2dhYmVuIGF1ZiBkZXIgS29uc29sZSBmw7xyIHdlaXRlcmUgQW5nYWJlbi4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODgwCittc2dpZCAiQ2Fubm90IGRldGVybWluZSBIRUFELiAgU2VlIGNvbnNvbGUgb3V0cHV0IGZvciBkZXRhaWxzLiIKK21zZ3N0ciAiIgorIkRpZSBad2VpZ3NwaXR6ZSAoSEVBRCkga29ubnRlIG5pY2h0IGdlZnVuZGVuIHdlcmRlbi4gIEtvbnRyb2xsaWVyZW4gU2llIGRpZSAiCisiQXVzZ2FiZW4gYXVmIGRlciBLb25zb2xlIGbDvHIgd2VpdGVyZSBBbmdhYmVuLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo4ODkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gY2xlYW51cCAlcyIKK21zZ3N0ciAiVmVyemVpY2huaXMgwrslc8KrIGthbm4gbmljaHQgYXVmZ2Vyw6R1bXQgd2VyZGVuLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo4OTUKK21zZ2lkICJDbG9uZSBmYWlsZWQuIgorbXNnc3RyICJLbG9uZW4gZmVobGdlc2NobGFnZW4uIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjkwMgorbXNnaWQgIk5vIGRlZmF1bHQgYnJhbmNoIG9idGFpbmVkLiIKK21zZ3N0ciAiS2VpbiB2b3JlaW5nZXN0ZWxsdGVyIFp3ZWlnIGdlZnVuZGVuLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5MTMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJDYW5ub3QgcmVzb2x2ZSAlcyBhcyBhIGNvbW1pdC4iCittc2dzdHIgIsK7JXPCqyB3dXJkZSBuaWNodCBhbHMgVmVyc2lvbiBnZWZ1bmRlbi4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTI1Cittc2dpZCAiQ3JlYXRpbmcgd29ya2luZyBkaXJlY3RvcnkiCittc2dzdHIgIkFyYmVpdHNrb3BpZSBlcnN0ZWxsZW4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTI2IGxpYi9pbmRleC50Y2w6NjUgbGliL2luZGV4LnRjbDoxMjcKKyM6IGxpYi9pbmRleC50Y2w6MTkzCittc2dpZCAiZmlsZXMiCittc2dzdHIgIkRhdGVpZW4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTU1Cittc2dpZCAiSW5pdGlhbCBmaWxlIGNoZWNrb3V0IGZhaWxlZC4iCittc2dzdHIgIkVyc3RlbGxlbiBkZXIgQXJiZWl0c2tvcGllIGZlaGxnZXNjaGxhZ2VuLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5NzEKK21zZ2lkICJPcGVuIgorbXNnc3RyICLDlmZmbmVuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjk4MQorbXNnaWQgIlJlcG9zaXRvcnk6IgorbXNnc3RyICJQcm9qZWt0YXJjaGl2OiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMDMxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIG9wZW4gcmVwb3NpdG9yeSAlczoiCittc2dzdHIgIlByb2pla3RhcmNoaXYgwrslc8KrIGtvbm50ZSBuaWNodCBnZcO2ZmZuZXQgd2VyZGVuLiIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjUzCittc2dpZCAiVGhpcyBEZXRhY2hlZCBDaGVja291dCIKK21zZ3N0ciAiQWJnZXRyZW5udGUgQXJiZWl0c2tvcGllLVZlcnNpb24iCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDo2MAorbXNnaWQgIlJldmlzaW9uIEV4cHJlc3Npb246IgorbXNnc3RyICJWZXJzaW9uIFJlZ2V4cC1BdXNkcnVjazoiCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDo3NAorbXNnaWQgIkxvY2FsIEJyYW5jaCIKK21zZ3N0ciAiTG9rYWxlciBad2VpZyIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjc5Cittc2dpZCAiVHJhY2tpbmcgQnJhbmNoIgorbXNnc3RyICLDnGJlcm5haG1lendlaWciCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDo4NCBsaWIvY2hvb3NlX3Jldi50Y2w6NTM4Cittc2dpZCAiVGFnIgorbXNnc3RyICJNYXJraWVydW5nIgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6MzE3CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiSW52YWxpZCByZXZpc2lvbjogJXMiCittc2dzdHIgIlVuZ8O8bHRpZ2UgVmVyc2lvbjogJXMiCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDozMzgKK21zZ2lkICJObyByZXZpc2lvbiBzZWxlY3RlZC4iCittc2dzdHIgIktlaW5lIFZlcnNpb24gYXVzZ2V3w6RobHQuIgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6MzQ2Cittc2dpZCAiUmV2aXNpb24gZXhwcmVzc2lvbiBpcyBlbXB0eS4iCittc2dzdHIgIlZlcnNpb25zLUF1c2RydWNrIGlzdCBsZWVyLiIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjUzMQorbXNnaWQgIlVwZGF0ZWQiCittc2dzdHIgIkFrdHVhbGlzaWVydCIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjU1OQorbXNnaWQgIlVSTCIKK21zZ3N0ciAiVVJMIgorCisjOiBsaWIvY29tbWl0LnRjbDo5Cittc2dpZCAiIgorIlRoZXJlIGlzIG5vdGhpbmcgdG8gYW1lbmQuXG4iCisiXG4iCisiWW91IGFyZSBhYm91dCB0byBjcmVhdGUgdGhlIGluaXRpYWwgY29tbWl0LiAgVGhlcmUgaXMgbm8gY29tbWl0IGJlZm9yZSB0aGlzICIKKyJ0byBhbWVuZC5cbiIKK21zZ3N0ciAiIgorIktlaW5lIFZlcnNpb24genVyIE5hY2hiZXNzZXJ1bmcgdm9yaGFuZGVuLlxuIgorIlxuIgorIlNpZSBzaW5kIGRhYmVpLCBkaWUgZXJzdGUgVmVyc2lvbiB6dSDDvGJlcnRyYWdlbi4gRXMgZ2lidCBrZWluZSBleGlzdGllcmVuZGUgIgorIlZlcnNpb24sIGRpZSBTaWUgbmFjaGJlc3Nlcm4ga8O2bm50ZW4uXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjE4Cittc2dpZCAiIgorIkNhbm5vdCBhbWVuZCB3aGlsZSBtZXJnaW5nLlxuIgorIlxuIgorIllvdSBhcmUgY3VycmVudGx5IGluIHRoZSBtaWRkbGUgb2YgYSBtZXJnZSB0aGF0IGhhcyBub3QgYmVlbiBmdWxseSAiCisiY29tcGxldGVkLiAgWW91IGNhbm5vdCBhbWVuZCB0aGUgcHJpb3IgY29tbWl0IHVubGVzcyB5b3UgZmlyc3QgYWJvcnQgdGhlICIKKyJjdXJyZW50IG1lcmdlIGFjdGl2aXR5LlxuIgorbXNnc3RyICIiCisiTmFjaGJlc3NlcnVuZyB3w6RocmVuIFp1c2FtbWVuZsO8aHJ1bmcgbmljaHQgbcO2Z2xpY2guXG4iCisiXG4iCisiU2llIGhhYmVuIGRhcyBadXNhbW1lbmbDvGhyZW4gdm9uIFZlcnNpb25lbiBhbmdlZmFuZ2VuLCBhYmVyIG5vY2ggbmljaHQgIgorImJlZW5kZXQuIFNpZSBrw7ZubmVuIGtlaW5lIHZvcmlnZSDDnGJlcnRyYWd1bmcgbmFjaGJlc3Nlcm4sIHNvbGFuZ2UgZWluZSAiCisidW5mZXJ0aWdlIFp1c2FtbWVuZsO8aHJ1bmcgZXhpc3RpZXJ0LiBEYXp1IG3DvHNzZW4gU2llIGRpZSBadXNhbW1lbmbDvGhydW5nICIKKyJiZWVuZGVuIG9kZXIgYWJicmVjaGVuLlxuIgorCisjOiBsaWIvY29tbWl0LnRjbDo0OQorbXNnaWQgIkVycm9yIGxvYWRpbmcgY29tbWl0IGRhdGEgZm9yIGFtZW5kOiIKK21zZ3N0ciAiRmVobGVyIGJlaW0gTGFkZW4gZGVyIFZlcnNpb25zZGF0ZW4gZsO8ciBOYWNoYmVzc2VybjoiCisKKyM6IGxpYi9jb21taXQudGNsOjc2Cittc2dpZCAiVW5hYmxlIHRvIG9idGFpbiB5b3VyIGlkZW50aXR5OiIKK21zZ3N0ciAiQmVudXR6ZXJuYW1lIGtvbm50ZSBuaWNodCBiZXN0aW1tdCB3ZXJkZW46IgorCisjOiBsaWIvY29tbWl0LnRjbDo4MQorbXNnaWQgIkludmFsaWQgR0lUX0NPTU1JVFRFUl9JREVOVDoiCittc2dzdHIgIlVuZ8O8bHRpZ2VyIFdlcnQgdm9uIEdJVF9DT01NSVRURVJfSU5ERU5UOiIKKworIzogbGliL2NvbW1pdC50Y2w6MTMzCittc2dpZCAiIgorIkxhc3Qgc2Nhbm5lZCBzdGF0ZSBkb2VzIG5vdCBtYXRjaCByZXBvc2l0b3J5IHN0YXRlLlxuIgorIlxuIgorIkFub3RoZXIgR2l0IHByb2dyYW0gaGFzIG1vZGlmaWVkIHRoaXMgcmVwb3NpdG9yeSBzaW5jZSB0aGUgbGFzdCBzY2FuLiAgQSAiCisicmVzY2FuIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSBhbm90aGVyIGNvbW1pdCBjYW4gYmUgY3JlYXRlZC5cbiIKKyJcbiIKKyJUaGUgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIG5vdy5cbiIKK21zZ3N0ciAiIgorIkRlciBsZXR6dGUgZ2VsYWRlbmUgU3RhdHVzIHN0aW1tdCBuaWNodCBtZWhyIG1pdCBkZW0gUHJvamVrdGFyY2hpdiDDvGJlcmVpbi5cbiIKKyJcbiIKKyJFaW4gYW5kZXJlcyBHaXQtUHJvZ3JhbW0gaGF0IGRhcyBQcm9qZWt0YXJjaGl2IHNlaXQgZGVtIGxldHp0ZW4gTGFkZW4gIgorImdlw6RuZGVydC4gIFZvciBkZW0gRWludHJhZ2VuIGVpbmVyIG5ldWVuIFZlcnNpb24gbXVzcyBuZXUgZ2VsYWRlbiB3ZXJkZW4uXG4iCisiXG4iCisiRXMgd2lyZCBnbGVpY2ggbmV1IGdlbGFkZW4uXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjE1NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJVbm1lcmdlZCBmaWxlcyBjYW5ub3QgYmUgY29tbWl0dGVkLlxuIgorIlxuIgorIkZpbGUgJXMgaGFzIG1lcmdlIGNvbmZsaWN0cy4gIFlvdSBtdXN0IHJlc29sdmUgdGhlbSBhbmQgc3RhZ2UgdGhlIGZpbGUgIgorImJlZm9yZSBjb21taXR0aW5nLlxuIgorbXNnc3RyICIiCisiTmljaHQgenVzYW1tZW5nZWbDvGhydGUgRGF0ZWllbiBrw7ZubmVuIG5pY2h0IGVpbmdldHJhZ2VuIHdlcmRlbi5cbiIKKyJcbiIKKyJEaWUgRGF0ZWkgwrslc8KrIGhhdCBub2NoIG5pY2h0IGF1ZmdlbMO2c3RlIFp1c2FtbWVuZsO8aHJ1bmdzLUtvbmZsaWt0ZS4gU2llICIKKyJtw7xzc2VuIGRpZXNlIEtvbmZsaWt0ZSBhdWZsw7ZzZW4sIGJldm9yIFNpZSBlaW50cmFnZW4ga8O2bm5lbi5cbiIKKworIzogbGliL2NvbW1pdC50Y2w6MTYyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIlVua25vd24gZmlsZSBzdGF0ZSAlcyBkZXRlY3RlZC5cbiIKKyJcbiIKKyJGaWxlICVzIGNhbm5vdCBiZSBjb21taXR0ZWQgYnkgdGhpcyBwcm9ncmFtLlxuIgorbXNnc3RyICIiCisiVW5iZWthbm50ZXIgRGF0ZWl6dXN0YW5kIMK7JXPCqy5cbiIKKyJcbiIKKyJEYXRlaSDCuyVzwqsga2FubiBuaWNodCBlaW5nZXRyYWdlbiB3ZXJkZW4uXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjE3MAorbXNnaWQgIiIKKyJObyBjaGFuZ2VzIHRvIGNvbW1pdC5cbiIKKyJcbiIKKyJZb3UgbXVzdCBzdGFnZSBhdCBsZWFzdCAxIGZpbGUgYmVmb3JlIHlvdSBjYW4gY29tbWl0LlxuIgorbXNnc3RyICIiCisiS2VpbmUgw4RuZGVydW5nZW4gdm9yaGFuZGVuLCBkaWUgZWluZ2V0cmFnZW4gd2VyZGVuIGvDtm5udGVuLlxuIgorIlxuIgorIlNpZSBtw7xzc2VuIG1pbmRlc3RlbnMgZWluZSBEYXRlaSBiZXJlaXRzdGVsbGVuLCBiZXZvciBTaWUgZWludHJhZ2VuIGvDtm5uZW4uXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjE4MworbXNnaWQgIiIKKyJQbGVhc2Ugc3VwcGx5IGEgY29tbWl0IG1lc3NhZ2UuXG4iCisiXG4iCisiQSBnb29kIGNvbW1pdCBtZXNzYWdlIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDpcbiIKKyJcbiIKKyItIEZpcnN0IGxpbmU6IERlc2NyaWJlIGluIG9uZSBzZW50ZW5jZSB3aGF0IHlvdSBkaWQuXG4iCisiLSBTZWNvbmQgbGluZTogQmxhbmtcbiIKKyItIFJlbWFpbmluZyBsaW5lczogRGVzY3JpYmUgd2h5IHRoaXMgY2hhbmdlIGlzIGdvb2QuXG4iCittc2dzdHIgIiIKKyJCaXR0ZSBnZWJlbiBTaWUgZWluZSBWZXJzaW9uc2Jlc2NocmVpYnVuZyBlaW4uXG4iCisiXG4iCisiRWluZSBndXRlIFZlcnNpb25zYmVzY2hyZWlidW5nIGVudGjDpGx0IGZvbGdlbmRlIEFic2Nobml0dGU6XG4iCisiXG4iCisiLSBFcnN0ZSBaZWlsZTogRWluZSBadXNhbW1lbmZhc3N1bmcsIHdhcyBtYW4gZ2VtYWNodCBoYXQuXG4iCisiXG4iCisiLSBad2VpdGUgWmVpbGU6IExlZXJ6ZWlsZVxuIgorIlxuIgorIi0gUmVzdDogRWluZSBhdXNmw7xocmxpY2hlIEJlc2NocmVpYnVuZywgd2FydW0gZGllc2Ugw4RuZGVydW5nIGhpbGZyZWljaCBpc3QuXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjIwNworIywgdGNsLWZvcm1hdAorbXNnaWQgIndhcm5pbmc6IFRjbCBkb2VzIG5vdCBzdXBwb3J0IGVuY29kaW5nICclcycuIgorbXNnc3RyICJXYXJuaW5nOiBUY2wvVGsgdW50ZXJzdMO8dHp0IGRpZSBaZWljaGVuY29kaWVydW5nIMK7JXPCqyBuaWNodC4iCisKKyM6IGxpYi9jb21taXQudGNsOjIyMQorbXNnaWQgIkNhbGxpbmcgcHJlLWNvbW1pdCBob29rLi4uIgorbXNnc3RyICJBdWZydWZlbiBkZXIgVm9yLUVpbnRyYWdlbi1Lb250cm9sbGUuLi4iCisKKyM6IGxpYi9jb21taXQudGNsOjIzNgorbXNnaWQgIkNvbW1pdCBkZWNsaW5lZCBieSBwcmUtY29tbWl0IGhvb2suIgorbXNnc3RyICJFaW50cmFnZW4gYWJnZWxlaG50IGR1cmNoIFZvci1FaW50cmFnZW4tS29udHJvbGxlICjCu3ByZS1jb21taXQgaG9va8KrKS4iCisKKyM6IGxpYi9jb21taXQudGNsOjI1OQorbXNnaWQgIkNhbGxpbmcgY29tbWl0LW1zZyBob29rLi4uIgorbXNnc3RyICJBdWZydWZlbiBkZXIgVmVyc2lvbnNiZXNjaHJlaWJ1bmdzLUtvbnRyb2xsZS4uLiIKKworIzogbGliL2NvbW1pdC50Y2w6Mjc0Cittc2dpZCAiQ29tbWl0IGRlY2xpbmVkIGJ5IGNvbW1pdC1tc2cgaG9vay4iCittc2dzdHIgIiIKKyJFaW50cmFnZW4gYWJnZWxlaG50IGR1cmNoIFZlcnNpb25zYmVzY2hyZWlidW5ncy1Lb250cm9sbGUgKMK7Y29tbWl0LW1lc3NhZ2UgIgorImhvb2vCqykuIgorCisjOiBsaWIvY29tbWl0LnRjbDoyODcKK21zZ2lkICJDb21taXR0aW5nIGNoYW5nZXMuLi4iCittc2dzdHIgIsOEbmRlcnVuZ2VuIGVpbnRyYWdlbi4uLiIKKworIzogbGliL2NvbW1pdC50Y2w6MzAzCittc2dpZCAid3JpdGUtdHJlZSBmYWlsZWQ6IgorbXNnc3RyICJ3cml0ZS10cmVlIGZlaGxnZXNjaGxhZ2VuOiIKKworIzogbGliL2NvbW1pdC50Y2w6MzA0IGxpYi9jb21taXQudGNsOjM0OCBsaWIvY29tbWl0LnRjbDozNjgKK21zZ2lkICJDb21taXQgZmFpbGVkLiIKK21zZ3N0ciAiRWludHJhZ2VuIGZlaGxnZXNjaGxhZ2VuLiIKKworIzogbGliL2NvbW1pdC50Y2w6MzIxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQ29tbWl0ICVzIGFwcGVhcnMgdG8gYmUgY29ycnVwdCIKK21zZ3N0ciAiVmVyc2lvbiDCuyVzwqsgc2NoZWludCBiZXNjaMOkZGlndCB6dSBzZWluIgorCisjOiBsaWIvY29tbWl0LnRjbDozMjYKK21zZ2lkICIiCisiTm8gY2hhbmdlcyB0byBjb21taXQuXG4iCisiXG4iCisiTm8gZmlsZXMgd2VyZSBtb2RpZmllZCBieSB0aGlzIGNvbW1pdCBhbmQgaXQgd2FzIG5vdCBhIG1lcmdlIGNvbW1pdC5cbiIKKyJcbiIKKyJBIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBub3cuXG4iCittc2dzdHIgIiIKKyJLZWluZSDDhG5kZXJ1bmdlbiBlaW56dXRyYWdlbi5cbiIKKyJcbiIKKyJFcyBnaWJ0IGtlaW5lIGdlw6RuZGVydGUgRGF0ZWkgYmVpIGRpZXNlciBWZXJzaW9uIHVuZCBlcyB3dXJkZSBhdWNoIG5pY2h0cyAiCisienVzYW1tZW5nZWbDvGhydC5cbiIKKyJcbiIKKyJEYXMgQXJiZWl0c3ZlcnplaWNobmlzIHdpcmQgZGFoZXIgamV0enQgbmV1IGdlbGFkZW4uXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjMzMworbXNnaWQgIk5vIGNoYW5nZXMgdG8gY29tbWl0LiIKK21zZ3N0ciAiS2VpbmUgw4RuZGVydW5nZW4sIGRpZSBlaW5nZXRyYWdlbiB3ZXJkZW4ga8O2bm5lbi4iCisKKyM6IGxpYi9jb21taXQudGNsOjM0NworbXNnaWQgImNvbW1pdC10cmVlIGZhaWxlZDoiCittc2dzdHIgImNvbW1pdC10cmVlIGZlaGxnZXNjaGxhZ2VuOiIKKworIzogbGliL2NvbW1pdC50Y2w6MzY3Cittc2dpZCAidXBkYXRlLXJlZiBmYWlsZWQ6IgorbXNnc3RyICJ1cGRhdGUtcmVmIGZlaGxnZXNjaGxhZ2VuOiIKKworIzogbGliL2NvbW1pdC50Y2w6NDU0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQ3JlYXRlZCBjb21taXQgJXM6ICVzIgorbXNnc3RyICJWZXJzaW9uICVzIMO8YmVydHJhZ2VuOiAlcyIKKworIzogbGliL2NvbnNvbGUudGNsOjU5Cittc2dpZCAiV29ya2luZy4uLiBwbGVhc2Ugd2FpdC4uLiIKK21zZ3N0ciAiVmVyYXJiZWl0dW5nLiBCaXR0ZSB3YXJ0ZW4uLi4iCisKKyM6IGxpYi9jb25zb2xlLnRjbDoxODYKK21zZ2lkICJTdWNjZXNzIgorbXNnc3RyICJFcmZvbGdyZWljaCIKKworIzogbGliL2NvbnNvbGUudGNsOjIwMAorbXNnaWQgIkVycm9yOiBDb21tYW5kIEZhaWxlZCIKK21zZ3N0ciAiRmVobGVyOiBLb21tYW5kbyBmZWhsZ2VzY2hsYWdlbiIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0MworbXNnaWQgIk51bWJlciBvZiBsb29zZSBvYmplY3RzIgorbXNnc3RyICJBbnphaGwgdW52ZXJrbsO8cGZ0ZXIgT2JqZWt0ZSIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0NAorbXNnaWQgIkRpc2sgc3BhY2UgdXNlZCBieSBsb29zZSBvYmplY3RzIgorbXNnc3RyICJGZXN0cGxhdHRlbnBsYXR6IHZvbiB1bnZlcmtuw7xwZnRlbiBPYmpla3RlbiIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0NQorbXNnaWQgIk51bWJlciBvZiBwYWNrZWQgb2JqZWN0cyIKK21zZ3N0ciAiQW56YWhsIGtvbXByaW1pZXJ0ZXIgT2JqZWt0ZSIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0NgorbXNnaWQgIk51bWJlciBvZiBwYWNrcyIKK21zZ3N0ciAiQW56YWhsIEtvbXByaW1pZXJ1bmdzZWluaGVpdGVuIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQ3Cittc2dpZCAiRGlzayBzcGFjZSB1c2VkIGJ5IHBhY2tlZCBvYmplY3RzIgorbXNnc3RyICJGZXN0cGxhdHRlbnBsYXR6IHZvbiBrb21wcmltaWVydGVuIE9iamVrdGVuIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQ4Cittc2dpZCAiUGFja2VkIG9iamVjdHMgd2FpdGluZyBmb3IgcHJ1bmluZyIKK21zZ3N0ciAiS29tcHJpbWllcnRlIE9iamVrdGUsIGRpZSB6dW0gQXVmcsOkdW1lbiB2b3JnZXNlaGVuIHNpbmQiCisKKyM6IGxpYi9kYXRhYmFzZS50Y2w6NDkKK21zZ2lkICJHYXJiYWdlIGZpbGVzIgorbXNnc3RyICJEYXRlaWVuIGltIE3DvGxsZWltZXIiCisKKyM6IGxpYi9kYXRhYmFzZS50Y2w6NzIKK21zZ2lkICJDb21wcmVzc2luZyB0aGUgb2JqZWN0IGRhdGFiYXNlIgorbXNnc3RyICJPYmpla3RkYXRlbmJhbmsga29tcHJpbWllcmVuIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjgzCittc2dpZCAiVmVyaWZ5aW5nIHRoZSBvYmplY3QgZGF0YWJhc2Ugd2l0aCBmc2NrLW9iamVjdHMiCittc2dzdHIgIkRpZSBPYmpla3RkYXRlbmJhbmsgZHVyY2ggwrtmc2NrLW9iamVjdHPCqyDDvGJlcnByw7xmZW4gbGFzc2VuIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjEwOAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJUaGlzIHJlcG9zaXRvcnkgY3VycmVudGx5IGhhcyBhcHByb3hpbWF0ZWx5ICVpIGxvb3NlIG9iamVjdHMuXG4iCisiXG4iCisiVG8gbWFpbnRhaW4gb3B0aW1hbCBwZXJmb3JtYW5jZSBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBjb21wcmVzcyAiCisidGhlIGRhdGFiYXNlIHdoZW4gbW9yZSB0aGFuICVpIGxvb3NlIG9iamVjdHMgZXhpc3QuXG4iCisiXG4iCisiQ29tcHJlc3MgdGhlIGRhdGFiYXNlIG5vdz8iCittc2dzdHIgIiIKKyJEaWVzZXMgUHJvamVrdGFyY2hpdiBlbnRow6RsdCB1bmdlZsOkaHIgJWkgbmljaHQgdmVya27DvHBmdGUgT2JqZWt0ZS5cbiIKKyJcbiIKKyJGw7xyIGVpbmUgb3B0aW1hbGUgUGVyZm9ybWFuY2Ugd2lyZCBlbXBmb2hsZW4sIGRpZSBEYXRlbmJhbmsgZGVzICIKKyJQcm9qZWt0YXJjaGl2cyB6dSBrb21wcmltaWVyZW4sIHNvYmFsZCBtZWhyIGFscyAlaSBuaWNodCB2ZXJrbsO8cGZ0ZSBPYmpla3RlICIKKyJ2b3JsaWVnZW4uXG4iCisiXG4iCisiU29sbCBkaWUgRGF0ZW5iYW5rIGpldHp0IGtvbXByaW1pZXJ0IHdlcmRlbj8iCisKKyM6IGxpYi9kYXRlLnRjbDoyNQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkludmFsaWQgZGF0ZSBmcm9tIEdpdDogJXMiCittc2dzdHIgIlVuZ8O8bHRpZ2VzIERhdHVtIHZvbiBHaXQ6ICVzIgorCisjOiBsaWIvZGlmZi50Y2w6NDIKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiTm8gZGlmZmVyZW5jZXMgZGV0ZWN0ZWQuXG4iCisiXG4iCisiJXMgaGFzIG5vIGNoYW5nZXMuXG4iCisiXG4iCisiVGhlIG1vZGlmaWNhdGlvbiBkYXRlIG9mIHRoaXMgZmlsZSB3YXMgdXBkYXRlZCBieSBhbm90aGVyIGFwcGxpY2F0aW9uLCBidXQgIgorInRoZSBjb250ZW50IHdpdGhpbiB0aGUgZmlsZSB3YXMgbm90IGNoYW5nZWQuXG4iCisiXG4iCisiQSByZXNjYW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgdG8gZmluZCBvdGhlciBmaWxlcyB3aGljaCBtYXkgaGF2ZSAiCisidGhlIHNhbWUgc3RhdGUuIgorbXNnc3RyICIiCisiS2VpbmUgw4RuZGVydW5nZW4gZmVzdHN0ZWxsYmFyLlxuIgorIlxuIgorIsK7JXPCqyBlbnRow6RsdCBrZWluZSDDhG5kZXJ1bmdlbi4gWndhciB3dXJkZSBkYXMgw4RuZGVydW5nc2RhdHVtIGRpZXNlciBEYXRlaSAiCisidm9uIGVpbmVtIGFuZGVyZW4gUHJvZ3JhbW0gbW9kaWZpemllcnQsIGFiZXIgZGVyIEluaGFsdCBkZXIgRGF0ZWkgaXN0ICIKKyJ1bnZlcsOkbmRlcnQuXG4iCisiXG4iCisiRGFzIEFyYmVpdHN2ZXJ6ZWljaG5pcyB3aXJkIGpldHp0IG5ldSBnZWxhZGVuLCB1bSBkaWVzZSDDhG5kZXJ1bmcgYmVpIGFsbGVuICIKKyJEYXRlaWVuIHp1IHByw7xmZW4uIgorCisjOiBsaWIvZGlmZi50Y2w6ODEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJMb2FkaW5nIGRpZmYgb2YgJXMuLi4iCittc2dzdHIgIlZlcmdsZWljaCB2b24gwrslc8KrIGxhZGVuLi4uIgorCisjOiBsaWIvZGlmZi50Y2w6MTE0IGxpYi9kaWZmLnRjbDoxODQKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gZGlzcGxheSAlcyIKK21zZ3N0ciAiRGF0ZWkgwrslc8KrIGthbm4gbmljaHQgYW5nZXplaWd0IHdlcmRlbiIKKworIzogbGliL2RpZmYudGNsOjExNQorbXNnaWQgIkVycm9yIGxvYWRpbmcgZmlsZToiCittc2dzdHIgIkZlaGxlciBiZWltIExhZGVuIGRlciBEYXRlaToiCisKKyM6IGxpYi9kaWZmLnRjbDoxMjIKK21zZ2lkICJHaXQgUmVwb3NpdG9yeSAoc3VicHJvamVjdCkiCittc2dzdHIgIkdpdC1Qcm9qZWt0YXJjaGl2IChVbnRlcnByb2pla3QpIgorCisjOiBsaWIvZGlmZi50Y2w6MTM0Cittc2dpZCAiKiBCaW5hcnkgZmlsZSAobm90IHNob3dpbmcgY29udGVudCkuIgorbXNnc3RyICIqIEJpbsOkcmRhdGVpIChJbmhhbHQgd2lyZCBuaWNodCBhbmdlemVpZ3QpIgorCisjOiBsaWIvZGlmZi50Y2w6MTg1Cittc2dpZCAiRXJyb3IgbG9hZGluZyBkaWZmOiIKK21zZ3N0ciAiRmVobGVyIGJlaW0gTGFkZW4gZGVzIFZlcmdsZWljaHM6IgorCisjOiBsaWIvZGlmZi50Y2w6MzAzCittc2dpZCAiRmFpbGVkIHRvIHVuc3RhZ2Ugc2VsZWN0ZWQgaHVuay4iCittc2dzdHIgIiIKKyJGZWhsZXIgYmVpbSBIZXJhdXNuZWhtZW4gZGVzIGdld8OkaGx0ZW4gS29udGV4dHMgYXVzIGRlciBCZXJlaXRzdGVsbHVuZy4iCisKKyM6IGxpYi9kaWZmLnRjbDozMTAKK21zZ2lkICJGYWlsZWQgdG8gc3RhZ2Ugc2VsZWN0ZWQgaHVuay4iCittc2dzdHIgIkZlaGxlciBiZWltIEJlcmVpdHN0ZWxsZW4gZGVzIGdld8OkaGx0ZW4gS29udGV4dHMuIgorCisjOiBsaWIvZXJyb3IudGNsOjIwIGxpYi9lcnJvci50Y2w6MTE0Cittc2dpZCAiZXJyb3IiCittc2dzdHIgIkZlaGxlciIKKworIzogbGliL2Vycm9yLnRjbDozNgorbXNnaWQgIndhcm5pbmciCittc2dzdHIgIldhcm51bmciCisKKyM6IGxpYi9lcnJvci50Y2w6OTQKK21zZ2lkICJZb3UgbXVzdCBjb3JyZWN0IHRoZSBhYm92ZSBlcnJvcnMgYmVmb3JlIGNvbW1pdHRpbmcuIgorbXNnc3RyICIiCisiU2llIG3DvHNzZW4gZGllIG9iaWdlbiBGZWhsZXIgenVlcnN0IGJlaGViZW4sIGJldm9yIFNpZSBlaW50cmFnZW4ga8O2bm5lbi4iCisKKyM6IGxpYi9pbmRleC50Y2w6NgorbXNnaWQgIlVuYWJsZSB0byB1bmxvY2sgdGhlIGluZGV4LiIKK21zZ3N0ciAiQmVyZWl0c3RlbGx1bmcga2FubiBuaWNodCB3aWVkZXIgZnJlaWdlZ2ViZW4gd2VyZGVuLiIKKworIzogbGliL2luZGV4LnRjbDoxNQorbXNnaWQgIkluZGV4IEVycm9yIgorbXNnc3RyICJGZWhsZXIgaW4gQmVyZWl0c3RlbGx1bmciCisKKyM6IGxpYi9pbmRleC50Y2w6MjEKK21zZ2lkICIiCisiVXBkYXRpbmcgdGhlIEdpdCBpbmRleCBmYWlsZWQuICBBIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB0byAiCisicmVzeW5jaHJvbml6ZSBnaXQtZ3VpLiIKK21zZ3N0ciAiIgorIkRhcyBBa3R1YWxpc2llcmVuIGRlciBHaXQtQmVyZWl0c3RlbGx1bmcgaXN0IGZlaGxnZXNjaGxhZ2VuLiBFaW5lIGFsbGdlbWVpbmUgIgorIkdpdC1Ba3R1YWxpc2llcnVuZyB3aXJkIGpldHp0IGdlc3RhcnRldCwgdW0gZ2l0LWd1aSB3aWVkZXIgbWl0IGdpdCB6dSAiCisic3luY2hyb25pc2llcmVuLiIKKworIzogbGliL2luZGV4LnRjbDoyNworbXNnaWQgIkNvbnRpbnVlIgorbXNnc3RyICJGb3J0c2V0emVuIgorCisjOiBsaWIvaW5kZXgudGNsOjMxCittc2dpZCAiVW5sb2NrIEluZGV4IgorbXNnc3RyICJCZXJlaXRzdGVsbHVuZyBmcmVpZ2ViZW4iCisKKyM6IGxpYi9pbmRleC50Y2w6MjgyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVW5zdGFnaW5nICVzIGZyb20gY29tbWl0IgorbXNnc3RyICJEYXRlaSDCuyVzwqsgYXVzIGRlciBCZXJlaXRzdGVsbHVuZyBoZXJhdXNuZWhtZW4iCisKKyM6IGxpYi9pbmRleC50Y2w6MzEzCittc2dpZCAiUmVhZHkgdG8gY29tbWl0LiIKK21zZ3N0ciAiQmVyZWl0IHp1bSBFaW50cmFnZW4uIgorCisjOiBsaWIvaW5kZXgudGNsOjMyNgorIywgdGNsLWZvcm1hdAorbXNnaWQgIkFkZGluZyAlcyIKK21zZ3N0ciAiwrslc8KrIGhpbnp1ZsO8Z2VuLi4uIgorCisjOiBsaWIvaW5kZXgudGNsOjM4MQorIywgdGNsLWZvcm1hdAorbXNnaWQgIlJldmVydCBjaGFuZ2VzIGluIGZpbGUgJXM/IgorbXNnc3RyICLDhG5kZXJ1bmdlbiBpbiBEYXRlaSDCuyVzwqsgdmVyd2VyZmVuPyIKKworIzogbGliL2luZGV4LnRjbDozODMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJSZXZlcnQgY2hhbmdlcyBpbiB0aGVzZSAlaSBmaWxlcz8iCittc2dzdHIgIsOEbmRlcnVuZ2VuIGluIGRlbiBnZXfDpGhsdGVuICVpIERhdGVpZW4gdmVyd2VyZmVuPyIKKworIzogbGliL2luZGV4LnRjbDozOTEKK21zZ2lkICJBbnkgdW5zdGFnZWQgY2hhbmdlcyB3aWxsIGJlIHBlcm1hbmVudGx5IGxvc3QgYnkgdGhlIHJldmVydC4iCittc2dzdHIgIiIKKyJBbGxlIG5pY2h0IGJlcmVpdGdlc3RlbGx0ZW4gw4RuZGVydW5nZW4gd2VyZGVuIGJlaW0gVmVyd2VyZmVuIHZlcmxvcmVuIGdlaGVuLiIKKworIzogbGliL2luZGV4LnRjbDozOTQKK21zZ2lkICJEbyBOb3RoaW5nIgorbXNnc3RyICJOaWNodHMgdHVuIgorCisjOiBsaWIvbWVyZ2UudGNsOjEzCittc2dpZCAiIgorIkNhbm5vdCBtZXJnZSB3aGlsZSBhbWVuZGluZy5cbiIKKyJcbiIKKyJZb3UgbXVzdCBmaW5pc2ggYW1lbmRpbmcgdGhpcyBjb21taXQgYmVmb3JlIHN0YXJ0aW5nIGFueSB0eXBlIG9mIG1lcmdlLlxuIgorbXNnc3RyICIiCisiWnVzYW1tZW5mw7xocmVuIGthbm4gbmljaHQgZ2xlaWNoemVpdGlnIG1pdCBOYWNoYmVzc2VybiBkdXJjaGdlZsO8aHJ0IHdlcmRlbi5cbiIKKyJcbiIKKyJTaWUgbcO8c3NlbiB6dWVyc3QgZGllIE5hY2hiZXNzZXJ1bmdzLVZlcnNpb24gYWJzY2hsaWXDn2VuLCBiZXZvciBTaWUgIgorInp1c2FtbWVuZsO8aHJlbiBrw7ZubmVuLlxuIgorCisjOiBsaWIvbWVyZ2UudGNsOjI3Cittc2dpZCAiIgorIkxhc3Qgc2Nhbm5lZCBzdGF0ZSBkb2VzIG5vdCBtYXRjaCByZXBvc2l0b3J5IHN0YXRlLlxuIgorIlxuIgorIkFub3RoZXIgR2l0IHByb2dyYW0gaGFzIG1vZGlmaWVkIHRoaXMgcmVwb3NpdG9yeSBzaW5jZSB0aGUgbGFzdCBzY2FuLiAgQSAiCisicmVzY2FuIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSBhIG1lcmdlIGNhbiBiZSBwZXJmb3JtZWQuXG4iCisiXG4iCisiVGhlIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBub3cuXG4iCittc2dzdHIgIiIKKyJEZXIgbGV0enRlIGdlbGFkZW5lIFN0YXR1cyBzdGltbXQgbmljaHQgbWVociBtaXQgZGVtIFByb2pla3RhcmNoaXYgw7xiZXJlaW4uXG4iCisiXG4iCisiRWluIGFuZGVyZXMgR2l0LVByb2dyYW1tIGhhdCBkYXMgUHJvamVrdGFyY2hpdiBzZWl0IGRlbSBsZXR6dGVuIExhZGVuICIKKyJnZcOkbmRlcnQuICBWb3IgZWluZW0gWnVzYW1tZW5mw7xocmVuIG11c3MgbmV1IGdlbGFkZW4gd2VyZGVuLlxuIgorIlxuIgorIkVzIHdpcmQgZ2xlaWNoIG5ldSBnZWxhZGVuLlxuIgorCisjOiBsaWIvbWVyZ2UudGNsOjQ0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIllvdSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIGNvbmZsaWN0ZWQgbWVyZ2UuXG4iCisiXG4iCisiRmlsZSAlcyBoYXMgbWVyZ2UgY29uZmxpY3RzLlxuIgorIlxuIgorIllvdSBtdXN0IHJlc29sdmUgdGhlbSwgc3RhZ2UgdGhlIGZpbGUsIGFuZCBjb21taXQgdG8gY29tcGxldGUgdGhlIGN1cnJlbnQgIgorIm1lcmdlLiAgT25seSB0aGVuIGNhbiB5b3UgYmVnaW4gYW5vdGhlciBtZXJnZS5cbiIKK21zZ3N0ciAiIgorIlp1c2FtbWVuZsO8aHJ1bmcgbWl0IEtvbmZsaWt0ZW4uXG4iCisiXG4iCisiRGllIERhdGVpIMK7JXPCqyBlbnRow6RsdCBLb25mbGlrdGUgYmVpbSBadXNhbW1lbmbDvGhyZW4uIFNpZSBtw7xzc2VuIGRpZXNlICIKKyJLb25mbGlrdGUgcGVyIEhhbmQgYXVmbMO2c2VuLiBBbnNjaGxpZcOfZW5kIG3DvHNzZW4gU2llIGRpZSBEYXRlaSB3aWVkZXIgIgorImJlcmVpdHN0ZWxsZW4gdW5kIGVpbnRyYWdlbiwgdW0gZGllIFp1c2FtbWVuZsO8aHJ1bmcgYWJ6dXNjaGxpZcOfZW4uIEVyc3QgIgorImRhbmFjaCBrYW5uIGVpbmUgbmV1ZSBadXNhbW1lbmbDvGhydW5nIGJlZ29ubmVuIHdlcmRlbi5cbiIKKworIzogbGliL21lcmdlLnRjbDo1NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJZb3UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBjaGFuZ2UuXG4iCisiXG4iCisiRmlsZSAlcyBpcyBtb2RpZmllZC5cbiIKKyJcbiIKKyJZb3Ugc2hvdWxkIGNvbXBsZXRlIHRoZSBjdXJyZW50IGNvbW1pdCBiZWZvcmUgc3RhcnRpbmcgYSBtZXJnZS4gIERvaW5nIHNvICIKKyJ3aWxsIGhlbHAgeW91IGFib3J0IGEgZmFpbGVkIG1lcmdlLCBzaG91bGQgdGhlIG5lZWQgYXJpc2UuXG4iCittc2dzdHIgIiIKKyJFcyBsaWVnZW4gw4RuZGVydW5nZW4gdm9yLlxuIgorIlxuIgorIkRpZSBEYXRlaSDCuyVzwqsgd3VyZGUgZ2XDpG5kZXJ0LiAgU2llIHNvbGx0ZW4genVlcnN0IGRpZSBiZXJlaXRnZXN0ZWxsdGUgIgorIlZlcnNpb24gYWJzY2hsaWXDn2VuLCBiZXZvciBTaWUgZWluZSBadXNhbW1lbmbDvGhydW5nIGJlZ2lubmVuLiAgTWl0IGRpZXNlciAiCisiUmVpaGVuZm9sZ2Uga8O2bm5lbiBTaWUgbcO2Z2xpY2hlIEtvbmZsaWt0ZSBiZWltIFp1c2FtbWVuZsO8aHJlbiB3ZXNlbnRsaWNoICIKKyJlaW5mYWNoZXIgYmVoZWJlbiBvZGVyIGFiYnJlY2hlbi5cbiIKKworIzogbGliL21lcmdlLnRjbDoxMDYKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIlcyBvZiAlcyIKK21zZ3N0ciAiJXMgdm9uICVzIgorCisjOiBsaWIvbWVyZ2UudGNsOjExOQorIywgdGNsLWZvcm1hdAorbXNnaWQgIk1lcmdpbmcgJXMgYW5kICVzLi4uIgorbXNnc3RyICJadXNhbW1lbmbDvGhyZW4gdm9uICVzIHVuZCAlcy4uLiIKKworIzogbGliL21lcmdlLnRjbDoxMzAKK21zZ2lkICJNZXJnZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiIKK21zZ3N0ciAiWnVzYW1tZW5mw7xocmVuIGVyZm9sZ3JlaWNoIGFiZ2VzY2hsb3NzZW4uIgorCisjOiBsaWIvbWVyZ2UudGNsOjEzMgorbXNnaWQgIk1lcmdlIGZhaWxlZC4gIENvbmZsaWN0IHJlc29sdXRpb24gaXMgcmVxdWlyZWQuIgorbXNnc3RyICJadXNhbW1lbmbDvGhyZW4gZmVobGdlc2NobGFnZW4uIEtvbmZsaWt0YXVmbMO2c3VuZyBpc3Qgbm90d2VuZGlnLiIKKworIzogbGliL21lcmdlLnRjbDoxNTcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJNZXJnZSBJbnRvICVzIgorbXNnc3RyICJadXNhbW1lbmbDvGhyZW4gaW4gwrslc8KrIgorCisjOiBsaWIvbWVyZ2UudGNsOjE3NgorbXNnaWQgIlJldmlzaW9uIFRvIE1lcmdlIgorbXNnc3RyICJadXNhbW1lbnp1ZsO8aHJlbmRlIFZlcnNpb24iCisKKyM6IGxpYi9tZXJnZS50Y2w6MjExCittc2dpZCAiIgorIkNhbm5vdCBhYm9ydCB3aGlsZSBhbWVuZGluZy5cbiIKKyJcbiIKKyJZb3UgbXVzdCBmaW5pc2ggYW1lbmRpbmcgdGhpcyBjb21taXQuXG4iCittc2dzdHIgIiIKKyJBYmJydWNoIGRlciBOYWNoYmVzc2VydW5nIGlzdCBuaWNodCBtw7ZnbGljaC5cbiIKKyJcbiIKKyJTaWUgbcO8c3NlbiBkaWUgTmFjaGJlc3NlcnVuZyBkZXIgVmVyc2lvbiBhYnNjaGxpZcOfZW4uXG4iCisKKyM6IGxpYi9tZXJnZS50Y2w6MjIxCittc2dpZCAiIgorIkFib3J0IG1lcmdlP1xuIgorIlxuIgorIkFib3J0aW5nIHRoZSBjdXJyZW50IG1lcmdlIHdpbGwgY2F1c2UgKkFMTCogdW5jb21taXR0ZWQgY2hhbmdlcyB0byBiZSBsb3N0LlxuIgorIlxuIgorIkNvbnRpbnVlIHdpdGggYWJvcnRpbmcgdGhlIGN1cnJlbnQgbWVyZ2U/IgorbXNnc3RyICIiCisiWnVzYW1tZW5mw7xocmVuIGFiYnJlY2hlbj9cbiIKKyJcbiIKKyJXZW5uIFNpZSBhYmJyZWNoZW4sIGdlaGVuIGFsbGUgbm9jaCBuaWNodCBlaW5nZXRyYWdlbmVuIMOEbmRlcnVuZ2VuICIKKyJ2ZXJsb3Jlbi5cbiIKKyJcbiIKKyJadXNhbW1lbmbDvGhyZW4gamV0enQgYWJicmVjaGVuPyIKKworIzogbGliL21lcmdlLnRjbDoyMjcKK21zZ2lkICIiCisiUmVzZXQgY2hhbmdlcz9cbiIKKyJcbiIKKyJSZXNldHRpbmcgdGhlIGNoYW5nZXMgd2lsbCBjYXVzZSAqQUxMKiB1bmNvbW1pdHRlZCBjaGFuZ2VzIHRvIGJlIGxvc3QuXG4iCisiXG4iCisiQ29udGludWUgd2l0aCByZXNldHRpbmcgdGhlIGN1cnJlbnQgY2hhbmdlcz8iCittc2dzdHIgIiIKKyLDhG5kZXJ1bmdlbiB6dXLDvGNrc2V0emVuP1xuIgorIlxuIgorIldlbm4gU2llIHp1csO8Y2tzZXR6ZW4sIGdlaGVuIGFsbGUgbm9jaCBuaWNodCBlaW5nZXRyYWdlbmVuIMOEbmRlcnVuZ2VuICIKKyJ2ZXJsb3Jlbi5cbiIKKyJcbiIKKyLDhG5kZXJ1bmdlbiBqZXR6dCB6dXLDvGNrc2V0emVuPyIKKworIzogbGliL21lcmdlLnRjbDoyMzgKK21zZ2lkICJBYm9ydGluZyIKK21zZ3N0ciAiQWJicnVjaCIKKworIzogbGliL21lcmdlLnRjbDoyMzgKK21zZ2lkICJmaWxlcyByZXNldCIKK21zZ3N0ciAiRGF0ZWllbiB6dXLDvGNrZ2VzZXR6dCIKKworIzogbGliL21lcmdlLnRjbDoyNjUKK21zZ2lkICJBYm9ydCBmYWlsZWQuIgorbXNnc3RyICJBYmJydWNoIGZlaGxnZXNjaGxhZ2VuLiIKKworIzogbGliL21lcmdlLnRjbDoyNjcKK21zZ2lkICJBYm9ydCBjb21wbGV0ZWQuICBSZWFkeS4iCittc2dzdHIgIkFiYnJ1Y2ggZHVyY2hnZWbDvGhydC4gQmVyZWl0LiIKKworIzogbGliL29wdGlvbi50Y2w6OTUKK21zZ2lkICJSZXN0b3JlIERlZmF1bHRzIgorbXNnc3RyICJWb3JlaW5zdGVsbHVuZ2VuIHdpZWRlcmhlcnN0ZWxsZW4iCisKKyM6IGxpYi9vcHRpb24udGNsOjk5Cittc2dpZCAiU2F2ZSIKK21zZ3N0ciAiU3BlaWNoZXJuIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMDkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIlcyBSZXBvc2l0b3J5IgorbXNnc3RyICJQcm9qZWt0YXJjaGl2ICVzIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMTAKK21zZ2lkICJHbG9iYWwgKEFsbCBSZXBvc2l0b3JpZXMpIgorbXNnc3RyICJHbG9iYWwgKEFsbGUgUHJvamVrdGFyY2hpdmUpIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMTYKK21zZ2lkICJVc2VyIE5hbWUiCittc2dzdHIgIkJlbnV0emVybmFtZSIKKworIzogbGliL29wdGlvbi50Y2w6MTE3Cittc2dpZCAiRW1haWwgQWRkcmVzcyIKK21zZ3N0ciAiRS1NYWlsLUFkcmVzc2UiCisKKyM6IGxpYi9vcHRpb24udGNsOjExOQorbXNnaWQgIlN1bW1hcml6ZSBNZXJnZSBDb21taXRzIgorbXNnc3RyICJadXNhbW1lbmbDvGhydW5ncy1WZXJzaW9uZW4genVzYW1tZW5mYXNzZW4iCisKKyM6IGxpYi9vcHRpb24udGNsOjEyMAorbXNnaWQgIk1lcmdlIFZlcmJvc2l0eSIKK21zZ3N0ciAiQXVzZsO8aHJsaWNoa2VpdCBkZXIgWnVzYW1tZW5mw7xocmVuLU1lbGR1bmdlbiIKKworIzogbGliL29wdGlvbi50Y2w6MTIxCittc2dpZCAiU2hvdyBEaWZmc3RhdCBBZnRlciBNZXJnZSIKK21zZ3N0ciAiVmVyZ2xlaWNoc3N0YXRpc3RpayBuYWNoIFp1c2FtbWVuZsO8aHJlbiBhbnplaWdlbiIKKworIzogbGliL29wdGlvbi50Y2w6MTIzCittc2dpZCAiVHJ1c3QgRmlsZSBNb2RpZmljYXRpb24gVGltZXN0YW1wcyIKK21zZ3N0ciAiQXVmIERhdGVpw6RuZGVydW5nc2RhdHVtIHZlcmxhc3NlbiIKKworIzogbGliL29wdGlvbi50Y2w6MTI0Cittc2dpZCAiUHJ1bmUgVHJhY2tpbmcgQnJhbmNoZXMgRHVyaW5nIEZldGNoIgorbXNnc3RyICLDnGJlcm5haG1lendlaWdlIGF1ZnLDpHVtZW4gd8OkaHJlbmQgQW5mb3JkZXJ1bmciCisKKyM6IGxpYi9vcHRpb24udGNsOjEyNQorbXNnaWQgIk1hdGNoIFRyYWNraW5nIEJyYW5jaGVzIgorbXNnc3RyICJQYXNzZW5kIHp1IMOcYmVybmFobWV6d2VpZyIKKworIzogbGliL29wdGlvbi50Y2w6MTI2Cittc2dpZCAiTnVtYmVyIG9mIERpZmYgQ29udGV4dCBMaW5lcyIKK21zZ3N0ciAiQW56YWhsIGRlciBLb250ZXh0emVpbGVuIGJlaW0gVmVyZ2xlaWNoIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMjcKKyMsIGZ1enp5Cittc2dpZCAiQ29tbWl0IE1lc3NhZ2UgVGV4dCBXaWR0aCIKK21zZ3N0ciAiVmVyc2lvbnNiZXNjaHJlaWJ1bmc6IgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMjgKK21zZ2lkICJOZXcgQnJhbmNoIE5hbWUgVGVtcGxhdGUiCittc2dzdHIgIk5hbWVuc3ZvcnNjaGxhZyBmw7xyIG5ldWUgWndlaWdlIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxOTIKK21zZ2lkICJTcGVsbGluZyBEaWN0aW9uYXJ5OiIKK21zZ3N0ciAiV8O2cnRlcmJ1Y2ggUmVjaHRzY2hyZWlicHLDvGZ1bmc6IgorCisjOiBsaWIvb3B0aW9uLnRjbDoyMTYKK21zZ2lkICJDaGFuZ2UgRm9udCIKK21zZ3N0ciAiU2NocmlmdGFydCDDpG5kZXJuIgorCisjOiBsaWIvb3B0aW9uLnRjbDoyMjAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJDaG9vc2UgJXMiCittc2dzdHIgIiVzIHfDpGhsZW4iCisKKyM6IGxpYi9vcHRpb24udGNsOjIyNgorbXNnaWQgInB0LiIKK21zZ3N0ciAicHQuIgorCisjOiBsaWIvb3B0aW9uLnRjbDoyNDAKK21zZ2lkICJQcmVmZXJlbmNlcyIKK21zZ3N0ciAiRWluc3RlbGx1bmdlbiIKKworIzogbGliL29wdGlvbi50Y2w6Mjc1Cittc2dpZCAiRmFpbGVkIHRvIGNvbXBsZXRlbHkgc2F2ZSBvcHRpb25zOiIKK21zZ3N0ciAiT3B0aW9uZW4ga29ubnRlbiBuaWNodCBnZXNwZWljaGVydCB3ZXJkZW46IgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjI5IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MzQKK21zZ2lkICJEZWxldGUgUmVtb3RlIEJyYW5jaCIKK21zZ3N0ciAiWndlaWcgaW4gYW5kZXJlbSBQcm9qZWt0YXJjaGl2IGzDtnNjaGVuIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjQ3Cittc2dpZCAiRnJvbSBSZXBvc2l0b3J5IgorbXNnc3RyICJJbiBQcm9qZWt0YXJjaGl2IgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjUwIGxpYi90cmFuc3BvcnQudGNsOjEyMworbXNnaWQgIlJlbW90ZToiCittc2dzdHIgIkFuZGVyZXMgQXJjaGl2OiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDo2NiBsaWIvdHJhbnNwb3J0LnRjbDoxMzgKK21zZ2lkICJBcmJpdHJhcnkgVVJMOiIKK21zZ3N0ciAiQXJjaGl2LVVSTDoiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6ODQKK21zZ2lkICJCcmFuY2hlcyIKK21zZ3N0ciAiWndlaWdlIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjEwOQorbXNnaWQgIkRlbGV0ZSBPbmx5IElmIgorbXNnc3RyICJOdXIgbMO2c2NoZW4sIHdlbm4iCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MTExCittc2dpZCAiTWVyZ2VkIEludG86IgorbXNnc3RyICJadXNhbW1lbmdlZsO8aHJ0IG1pdDoiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MTE5Cittc2dpZCAiQWx3YXlzIChEbyBub3QgcGVyZm9ybSBtZXJnZSBjaGVja3MpIgorbXNnc3RyICJJbW1lciAoS2VpbmUgWnVzYW1tZW5mw7xocnVuZ3NwcsO8ZnVuZykiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MTUyCittc2dpZCAiQSBicmFuY2ggaXMgcmVxdWlyZWQgZm9yICdNZXJnZWQgSW50bycuIgorbXNnc3RyICJGw7xyIMK7WnVzYW1tZW5mw7xocmVuIG1pdMKrIG11c3MgZWluIFp3ZWlnIGFuZ2VnZWJlbiB3ZXJkZW4uIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjE4NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJUaGUgZm9sbG93aW5nIGJyYW5jaGVzIGFyZSBub3QgY29tcGxldGVseSBtZXJnZWQgaW50byAlczpcbiIKKyJcbiIKKyIgLSAlcyIKK21zZ3N0ciAiIgorIkZvbGdlbmRlIFp3ZWlnZSBzaW5kIG5vY2ggbmljaHQgbWl0IMK7JXPCqyB6dXNhbW1lbmdlZsO8aHJ0OlxuIgorIlxuIgorIiAtICVzIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjE4OQorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJPbmUgb3IgbW9yZSBvZiB0aGUgbWVyZ2UgdGVzdHMgZmFpbGVkIGJlY2F1c2UgeW91IGhhdmUgbm90IGZldGNoZWQgdGhlICIKKyJuZWNlc3NhcnkgY29tbWl0cy4gIFRyeSBmZXRjaGluZyBmcm9tICVzIGZpcnN0LiIKK21zZ3N0ciAiIgorIkVpbiBvZGVyIG1laHJlcmUgWnVzYW1tZW5mw7xocnVuZ2VuIHNpbmQgZmVobGdlc2NobGFnZW4sIGRhIFNpZSBuaWNodCBkaWUgIgorIm5vdHdlbmRpZ2VuIFZlcnNpb25lbiB2b3JoZXIgYW5nZWZvcmRlcnQgaGFiZW4uICBTaWUgc29sbHRlbiB2ZXJzdWNoZW4sICIKKyJ6dWVyc3Qgdm9uIMK7JXPCqyBhbnp1Zm9yZGVybi4iCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MjA3Cittc2dpZCAiUGxlYXNlIHNlbGVjdCBvbmUgb3IgbW9yZSBicmFuY2hlcyB0byBkZWxldGUuIgorbXNnc3RyICJCaXR0ZSB3w6RobGVuIFNpZSBtaW5kZXN0ZW5zIGVpbmVuIFp3ZWlnLCBkZXIgZ2Vsw7ZzY2h0IHdlcmRlbiBzb2xsLiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoyMTYKK21zZ2lkICIiCisiUmVjb3ZlcmluZyBkZWxldGVkIGJyYW5jaGVzIGlzIGRpZmZpY3VsdC5cbiIKKyJcbiIKKyJEZWxldGUgdGhlIHNlbGVjdGVkIGJyYW5jaGVzPyIKK21zZ3N0ciAiIgorIkRhcyBXaWVkZXJoZXJzdGVsbGVuIHZvbiBnZWzDtnNjaHRlbiBad2VpZ2VuIGlzdCBudXIgbWl0IGdyw7bDn2VyZW0gQXVmd2FuZCAiCisibcO2Z2xpY2guXG4iCisiXG4iCisiU29sbGVuIGRpZSBhdXNnZXfDpGhsdGVuIFp3ZWlnZSBnZWzDtnNjaHQgd2VyZGVuPyIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoyMjYKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJEZWxldGluZyBicmFuY2hlcyBmcm9tICVzIgorbXNnc3RyICJad2VpZ2UgYXVmIMK7JXPCqyB3ZXJkZW4gZ2Vsw7ZzY2h0IgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjI4NgorbXNnaWQgIk5vIHJlcG9zaXRvcnkgc2VsZWN0ZWQuIgorbXNnc3RyICJLZWluIFByb2pla3RhcmNoaXYgYXVzZ2V3w6RobHQuIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjI5MQorIywgdGNsLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nICVzLi4uIgorbXNnc3RyICLCuyVzwqsgbGFkZW4uLi4iCisKKyM6IGxpYi9yZW1vdGUudGNsOjE2NQorbXNnaWQgIlBydW5lIGZyb20iCittc2dzdHIgIkF1ZnLDpHVtZW4gdm9uIgorCisjOiBsaWIvcmVtb3RlLnRjbDoxNzAKK21zZ2lkICJGZXRjaCBmcm9tIgorbXNnc3RyICJBbmZvcmRlcm4gdm9uIgorCisjOiBsaWIvcmVtb3RlLnRjbDoyMTMKK21zZ2lkICJQdXNoIHRvIgorbXNnc3RyICJWZXJzZW5kZW4gbmFjaCIKKworIzogbGliL3Nob3J0Y3V0LnRjbDoyMCBsaWIvc2hvcnRjdXQudGNsOjYxCittc2dpZCAiQ2Fubm90IHdyaXRlIHNob3J0Y3V0OiIKK21zZ3N0ciAiRmVobGVyIGJlaW0gU2NocmVpYmVuIGRlciBWZXJrbsO8cGZ1bmc6IgorCisjOiBsaWIvc2hvcnRjdXQudGNsOjEzNgorbXNnaWQgIkNhbm5vdCB3cml0ZSBpY29uOiIKK21zZ3N0ciAiRmVobGVyIGJlaW0gRXJzdGVsbGVuIGRlcyBJY29uczoiCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDo1NworbXNnaWQgIlVuc3VwcG9ydGVkIHNwZWxsIGNoZWNrZXIiCittc2dzdHIgIiIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjY1CisjLCBmdXp6eQorbXNnaWQgIlNwZWxsIGNoZWNraW5nIGlzIHVuYXZhaWxhYmxlIgorbXNnc3RyICJSZWNodHNjaHJlaWJwcsO8ZnVuZyBmZWhsZ2VzY2hsYWdlbiIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjY4Cittc2dpZCAiSW52YWxpZCBzcGVsbCBjaGVja2luZyBjb25maWd1cmF0aW9uIgorbXNnc3RyICIiCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDo3MAorIywgdGNsLWZvcm1hdAorbXNnaWQgIlJldmVydGluZyBkaWN0aW9uYXJ5IHRvICVzLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6NzMKKyMsIGZ1enp5Cittc2dpZCAiU3BlbGwgY2hlY2tlciBzaWxlbnRseSBmYWlsZWQgb24gc3RhcnR1cCIKK21zZ3N0ciAiUmVjaHRzY2hyZWlicHLDvGZ1bmcgZmVobGdlc2NobGFnZW4iCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDo4MAorIywgZnV6enkKK21zZ2lkICJVbnJlY29nbml6ZWQgc3BlbGwgY2hlY2tlciIKK21zZ3N0ciAiVW5iZWthbm50ZSBWZXJzaW9uIHZvbiDCu2FzcGVsbMKrIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6MTgwCittc2dpZCAiTm8gU3VnZ2VzdGlvbnMiCittc2dzdHIgIktlaW5lIFZvcnNjaGzDpGdlIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6MzgxCisjLCBmdXp6eQorbXNnaWQgIlVuZXhwZWN0ZWQgRU9GIGZyb20gc3BlbGwgY2hlY2tlciIKK21zZ3N0ciAiVW5lcndhcnRldGVzIEVPRiB2b24gwrthc3BlbGzCqyIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjM4NQorbXNnaWQgIlNwZWxsIENoZWNrZXIgRmFpbGVkIgorbXNnc3RyICJSZWNodHNjaHJlaWJwcsO8ZnVuZyBmZWhsZ2VzY2hsYWdlbiIKKworIzogbGliL3N0YXR1c19iYXIudGNsOjgzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiJXMgLi4uICUqaSBvZiAlKmkgJXMgKCUzaSUlKSIKK21zZ3N0ciAiJXMgLi4uICUqaSB2b24gJSppICVzICglM2klJSkiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjYKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJmZXRjaCAlcyIKK21zZ3N0ciAiwrslc8KrIGFuZm9yZGVybiIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6NworIywgdGNsLWZvcm1hdAorbXNnaWQgIkZldGNoaW5nIG5ldyBjaGFuZ2VzIGZyb20gJXMiCittc2dzdHIgIk5ldWUgw4RuZGVydW5nZW4gdm9uIMK7JXPCqyBob2xlbiIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTgKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJyZW1vdGUgcHJ1bmUgJXMiCittc2dzdHIgIkF1ZnLDpHVtZW4gdm9uIMK7JXPCqyIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJQcnVuaW5nIHRyYWNraW5nIGJyYW5jaGVzIGRlbGV0ZWQgZnJvbSAlcyIKK21zZ3N0ciAiw5xiZXJuYWhtZXp3ZWlnZSBhdWZyw6R1bWVuIHVuZCBlbnRmZXJuZW4sIGRpZSBpbiDCuyVzwqsgZ2Vsw7ZzY2h0IHd1cmRlbiIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MjUgbGliL3RyYW5zcG9ydC50Y2w6NzEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJwdXNoICVzIgorbXNnc3RyICLCuyVzwqsgdmVyc2VuZGVuLi4uIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoyNgorIywgdGNsLWZvcm1hdAorbXNnaWQgIlB1c2hpbmcgY2hhbmdlcyB0byAlcyIKK21zZ3N0ciAiw4RuZGVydW5nZW4gbmFjaCDCuyVzwqsgdmVyc2VuZGVuIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDo3MgorIywgdGNsLWZvcm1hdAorbXNnaWQgIlB1c2hpbmcgJXMgJXMgdG8gJXMiCittc2dzdHIgIiVzICVzIG5hY2ggJXMgdmVyc2VuZGVuIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDo4OQorbXNnaWQgIlB1c2ggQnJhbmNoZXMiCittc2dzdHIgIlp3ZWlnZSB2ZXJzZW5kZW4iCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjEwMworbXNnaWQgIlNvdXJjZSBCcmFuY2hlcyIKK21zZ3N0ciAiTG9rYWxlIFp3ZWlnZSIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTIwCittc2dpZCAiRGVzdGluYXRpb24gUmVwb3NpdG9yeSIKK21zZ3N0ciAiWmllbC1Qcm9qZWt0YXJjaGl2IgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoxNTgKK21zZ2lkICJUcmFuc2ZlciBPcHRpb25zIgorbXNnc3RyICJOZXR6d2Vyay1FaW5zdGVsbHVuZ2VuIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoxNjAKK21zZ2lkICJGb3JjZSBvdmVyd3JpdGUgZXhpc3RpbmcgYnJhbmNoIChtYXkgZGlzY2FyZCBjaGFuZ2VzKSIKK21zZ3N0ciAiIgorIsOcYmVyc2NocmVpYmVuIHZvbiBleGlzdGllcmVuZGVuIFp3ZWlnZW4gZXJ6d2luZ2VuIChrw7ZubnRlIMOEbmRlcnVuZ2VuIGzDtnNjaGVuKSIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTY0Cittc2dpZCAiVXNlIHRoaW4gcGFjayAoZm9yIHNsb3cgbmV0d29yayBjb25uZWN0aW9ucykiCittc2dzdHIgIktvbXBha3RlcyBEYXRlbmZvcm1hdCBiZW51dHplbiAoZsO8ciBsYW5nc2FtZSBOZXR6dmVyYmluZHVuZ2VuKSIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTY4Cittc2dpZCAiSW5jbHVkZSB0YWdzIgorbXNnc3RyICJNaXQgTWFya2llcnVuZ2VuIMO8YmVydHJhZ2VuIgorCisjfiBtc2dpZCAiTm90IGNvbm5lY3RlZCB0byBhc3BlbGwiCisjfiBtc2dzdHIgIktlaW5lIFZlcmJpbmR1bmcgenUgwrthc3BlbGzCqyIKZGlmZiAtLWdpdCBhL2dpdC1ndWkvcG8vZnIucG8gYi9naXQtZ3VpL3BvL2ZyLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YjZkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtZ3VpL3BvL2ZyLnBvCkBAIC0wLDAgKzEsMTk5MiBAQAorIyB0cmFuc2xhdGlvbiBvZiBmci5wbyB0byBGcmVuY2gKKyMgVHJhbnNsYXRpb24gb2YgZ2l0LWd1aSB0byBGcmVuY2guCisjIENvcHlyaWdodCAoQykgMjAwOCBTaGF3biBQZWFyY2UsIGV0IGFsLgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ2l0IHBhY2thZ2UuCisjCisjIENocmlzdGlhbiBDb3VkZXIgPGNocmlzY29vbEB0dXhmYW1pbHkub3JnPiwgMjAwOC4KK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGZyXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IFxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDA4LTAzLTE0IDA3OjE4KzAxMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA4LTA0LTA0IDIyOjA1KzAyMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IENocmlzdGlhbiBDb3VkZXIgPGNocmlzY29vbEB0dXhmYW1pbHkub3JnPlxuIgorIkxhbmd1YWdlLVRlYW06IEZyZW5jaFxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIlgtR2VuZXJhdG9yOiBLQmFiZWwgMS4xMS40XG4iCisiUGx1cmFsLUZvcm1zOiAgbnBsdXJhbHM9MjsgcGx1cmFsPShuID4gMSk7XG4iCisKKyM6IGdpdC1ndWkuc2g6NDEgZ2l0LWd1aS5zaDo2MzQgZ2l0LWd1aS5zaDo2NDggZ2l0LWd1aS5zaDo2NjEgZ2l0LWd1aS5zaDo3NDQKKyM6IGdpdC1ndWkuc2g6NzYzCittc2dpZCAiZ2l0LWd1aTogZmF0YWwgZXJyb3IiCittc2dzdHIgImdpdC1ndWk6IGVycmV1ciBmYXRhbGUiCisKKyM6IGdpdC1ndWkuc2g6NTkzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBmb250IHNwZWNpZmllZCBpbiAlczoiCittc2dzdHIgIkludmFsaWRlIGZvbnRlIHNww6ljaWZpw6llIGRhbnMgJXMgOiIKKworIzogZ2l0LWd1aS5zaDo2MjAKK21zZ2lkICJNYWluIEZvbnQiCittc2dzdHIgIkZvbnRlIHByaW5jaXBhbGUiCisKKyM6IGdpdC1ndWkuc2g6NjIxCittc2dpZCAiRGlmZi9Db25zb2xlIEZvbnQiCittc2dzdHIgIkZvbnRlIGRpZmYvY29uc29sZSIKKworIzogZ2l0LWd1aS5zaDo2MzUKK21zZ2lkICJDYW5ub3QgZmluZCBnaXQgaW4gUEFUSC4iCittc2dzdHIgIkltcG9zc2libGUgZGUgdHJvdXZlciBnaXQgZGFucyBQQVRILiIKKworIzogZ2l0LWd1aS5zaDo2NjIKK21zZ2lkICJDYW5ub3QgcGFyc2UgR2l0IHZlcnNpb24gc3RyaW5nOiIKK21zZ3N0ciAiSW1wb3NzaWJsZSBkZSBwYXJzZXIgbGEgdmVyc2lvbiBkZSBHaXQgOiIKKworIzogZ2l0LWd1aS5zaDo2ODAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiR2l0IHZlcnNpb24gY2Fubm90IGJlIGRldGVybWluZWQuXG4iCisiXG4iCisiJXMgY2xhaW1zIGl0IGlzIHZlcnNpb24gJyVzJy5cbiIKKyJcbiIKKyIlcyByZXF1aXJlcyBhdCBsZWFzdCBHaXQgMS41LjAgb3IgbGF0ZXIuXG4iCisiXG4iCisiQXNzdW1lICclcycgaXMgdmVyc2lvbiAxLjUuMD9cbiIKK21zZ3N0ciAiIgorIkltcG9zc2libGUgZGUgZMOpdGVybWluZXIgbGEgdmVyc2lvbiBkZSBHaXQuXG4iCisiXG4iCisiJXMgYWZmaXJtZSBxdSdpbCBzJ2FnaXQgZGUgbGEgdmVyc2lvbiAnJXMnLlxuIgorIlxuIgorIiVzIG7DqWNlc3NpdGUgYXUgbW9pbnMgR2l0IDEuNS4wLlxuIgorIlxuIgorIlBldXQnb24gY29uc2lkw6lyZXIgcXVlICclcycgZXN0IGVuIHZlcnNpb24gMS41LjAgP1xuIgorCisjOiBnaXQtZ3VpLnNoOjkxOAorbXNnaWQgIkdpdCBkaXJlY3Rvcnkgbm90IGZvdW5kOiIKK21zZ3N0ciAiSW1wb3NzaWJsZSBkZSB0cm91dmVyIGxlIHLDqXBlcnRvaXJlIGRlIEdpdCA6IgorCisjOiBnaXQtZ3VpLnNoOjkyNQorbXNnaWQgIkNhbm5vdCBtb3ZlIHRvIHRvcCBvZiB3b3JraW5nIGRpcmVjdG9yeToiCittc2dzdHIgIkltcG9zc2libGUgZCdhbGxlciDDoCBsYSByYWNpbmUgZHUgcsOpcGVydG9pcmUgZGUgdHJhdmFpbCA6IgorCisjOiBnaXQtZ3VpLnNoOjkzMgorbXNnaWQgIkNhbm5vdCB1c2UgZnVubnkgLmdpdCBkaXJlY3Rvcnk6IgorbXNnc3RyICJJbXBvc3NpYmxlIGQndXRpbGlzZXIgdW4gZHLDtGxlIGRlIHLDqXBlcnRvaXJlIGdpdCA6IgorCisjOiBnaXQtZ3VpLnNoOjkzNworbXNnaWQgIk5vIHdvcmtpbmcgZGlyZWN0b3J5IgorbXNnc3RyICJQYXMgZGUgcsOpcGVydG9pcmUgZGUgdHJhdmFpbCIKKworIzogZ2l0LWd1aS5zaDoxMDg0IGxpYi9jaGVja291dF9vcC50Y2w6MjgzCittc2dpZCAiUmVmcmVzaGluZyBmaWxlIHN0YXR1cy4uLiIKK21zZ3N0ciAiUmFmcmFpY2hpc3NlbWVudCBkdSBzdGF0dXMgZGVzIGZpY2hpZXJzLi4uIgorCisjOiBnaXQtZ3VpLnNoOjExNDkKK21zZ2lkICJTY2FubmluZyBmb3IgbW9kaWZpZWQgZmlsZXMgLi4uIgorbXNnc3RyICJSZWNoZXJjaGUgZGUgZmljaGllcnMgbW9kaWZpw6lzLi4uIgorCisjOiBnaXQtZ3VpLnNoOjEzMjQgbGliL2Jyb3dzZXIudGNsOjI0NgorbXNnaWQgIlJlYWR5LiIKK21zZ3N0ciAiUHLDqnQuIgorCisjOiBnaXQtZ3VpLnNoOjE1OTAKK21zZ2lkICJVbm1vZGlmaWVkIgorbXNnc3RyICJOb24gbW9kaWZpw6kiCisKKyM6IGdpdC1ndWkuc2g6MTU5MgorbXNnaWQgIk1vZGlmaWVkLCBub3Qgc3RhZ2VkIgorbXNnc3RyICJNb2RpZmnDqSwgbm9uIHByw6ktY29tbWl0w6kiCisKKyM6IGdpdC1ndWkuc2g6MTU5MyBnaXQtZ3VpLnNoOjE1OTgKK21zZ2lkICJTdGFnZWQgZm9yIGNvbW1pdCIKK21zZ3N0ciAiUHLDqS1jb21taXTDqSIKKworIzogZ2l0LWd1aS5zaDoxNTk0IGdpdC1ndWkuc2g6MTU5OQorbXNnaWQgIlBvcnRpb25zIHN0YWdlZCBmb3IgY29tbWl0IgorbXNnc3RyICJFbiBwYXJ0aWUgcHLDqS1jb21taXTDqSIKKworIzogZ2l0LWd1aS5zaDoxNTk1IGdpdC1ndWkuc2g6MTYwMAorbXNnaWQgIlN0YWdlZCBmb3IgY29tbWl0LCBtaXNzaW5nIgorbXNnc3RyICJQcsOpLWNvbW1pdMOpLCBtYW5xdWFudCIKKworIzogZ2l0LWd1aS5zaDoxNTk3Cittc2dpZCAiVW50cmFja2VkLCBub3Qgc3RhZ2VkIgorbXNnc3RyICJOb24gc3VpdmksIG5vbiBwcsOpLWNvbW1pdMOpIgorCisjOiBnaXQtZ3VpLnNoOjE2MDIKK21zZ2lkICJNaXNzaW5nIgorbXNnc3RyICJNYW5xdWFudCIKKworIzogZ2l0LWd1aS5zaDoxNjAzCittc2dpZCAiU3RhZ2VkIGZvciByZW1vdmFsIgorbXNnc3RyICJQcsOpLWNvbW1pdMOpIHBvdXIgc3VwcHJlc3Npb24iCisKKyM6IGdpdC1ndWkuc2g6MTYwNAorbXNnaWQgIlN0YWdlZCBmb3IgcmVtb3ZhbCwgc3RpbGwgcHJlc2VudCIKK21zZ3N0ciAiUHLDqS1jb21taXTDqSBwb3VyIHN1cHByZXNzaW9uLCB0b3Vqb3VycyBwcsOpc2VudCIKKworIzogZ2l0LWd1aS5zaDoxNjA2IGdpdC1ndWkuc2g6MTYwNyBnaXQtZ3VpLnNoOjE2MDggZ2l0LWd1aS5zaDoxNjA5Cittc2dpZCAiUmVxdWlyZXMgbWVyZ2UgcmVzb2x1dGlvbiIKK21zZ3N0ciAiTsOpY2Vzc2l0ZSBsYSByw6lzb2x1dGlvbiBkJ3VuZSBmdXNpb24iCisKKyM6IGdpdC1ndWkuc2g6MTY0NAorbXNnaWQgIlN0YXJ0aW5nIGdpdGsuLi4gcGxlYXNlIHdhaXQuLi4iCittc2dzdHIgIkxhbmNlbWVudCBkZSBnaXRrLi4uIG1lcmNpIGRlIHBhdGllbnRlci4uLiIKKworIzogZ2l0LWd1aS5zaDoxNjUzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIlVuYWJsZSB0byBzdGFydCBnaXRrOlxuIgorIlxuIgorIiVzIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICIiCisiSW1wb3NzaWJsZSBkZSBsYW5jZXIgZ2l0ayA6XG4iCisiXG4iCisiJXMgaW5leGlzdGFudCIKKworIzogZ2l0LWd1aS5zaDoxODYwIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MzYKK21zZ2lkICJSZXBvc2l0b3J5IgorbXNnc3RyICJSw6lmw6lyZW50aWVsIgorCisjOiBnaXQtZ3VpLnNoOjE4NjEKK21zZ2lkICJFZGl0IgorbXNnc3RyICJFZGl0ZXIiCisKKyM6IGdpdC1ndWkuc2g6MTg2MyBsaWIvY2hvb3NlX3Jldi50Y2w6NTYxCittc2dpZCAiQnJhbmNoIgorbXNnc3RyICJCcmFuY2hlIgorCisjOiBnaXQtZ3VpLnNoOjE4NjYgbGliL2Nob29zZV9yZXYudGNsOjU0OAorbXNnaWQgIkNvbW1pdEBAbm91biIKK21zZ3N0ciAiQ29tbWl0IgorCisjOiBnaXQtZ3VpLnNoOjE4NjkgbGliL21lcmdlLnRjbDoxMjAgbGliL21lcmdlLnRjbDoxNDkgbGliL21lcmdlLnRjbDoxNjcKK21zZ2lkICJNZXJnZSIKK21zZ3N0ciAiRnVzaW9ubmVyIgorCisjOiBnaXQtZ3VpLnNoOjE4NzAgbGliL2Nob29zZV9yZXYudGNsOjU1NworbXNnaWQgIlJlbW90ZSIKK21zZ3N0ciAiUsOpZsOpcmVudGllbCBkaXN0YW50IgorCisjOiBnaXQtZ3VpLnNoOjE4NzkKK21zZ2lkICJCcm93c2UgQ3VycmVudCBCcmFuY2gncyBGaWxlcyIKK21zZ3N0ciAiVmlzaW9ubmVyIGZpY2hpZXJzIGRhbnMgYnJhbmNoZSBjb3VyYW50ZSIKKworIzogZ2l0LWd1aS5zaDoxODgzCittc2dpZCAiQnJvd3NlIEJyYW5jaCBGaWxlcy4uLiIKK21zZ3N0ciAiVmlzaW9ubmVyIGZpY2hpZXJzIGRlIGJyYW5jaGUiCisKKyM6IGdpdC1ndWkuc2g6MTg4OAorbXNnaWQgIlZpc3VhbGl6ZSBDdXJyZW50IEJyYW5jaCdzIEhpc3RvcnkiCittc2dzdHIgIlZpc3VhbGlzZXIgaGlzdG9yaXF1ZSBicmFuY2hlIGNvdXJhbnRlIgorCisjOiBnaXQtZ3VpLnNoOjE4OTIKK21zZ2lkICJWaXN1YWxpemUgQWxsIEJyYW5jaCBIaXN0b3J5IgorbXNnc3RyICJWaXN1YWxpc2VyIGhpc3RvcmlxdWUgdG91dGVzIGJyYW5jaGVzIgorCisjOiBnaXQtZ3VpLnNoOjE4OTkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJCcm93c2UgJXMncyBGaWxlcyIKK21zZ3N0ciAiVmlzaW9ubmVyIGZpY2hpZXJzIGRlICVzIgorCisjOiBnaXQtZ3VpLnNoOjE5MDEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJWaXN1YWxpemUgJXMncyBIaXN0b3J5IgorbXNnc3RyICJWaXN1YWxpc2VyIGhpc3RvcmlxdWUgZGUgJXMiCisKKyM6IGdpdC1ndWkuc2g6MTkwNiBsaWIvZGF0YWJhc2UudGNsOjI3IGxpYi9kYXRhYmFzZS50Y2w6NjcKK21zZ2lkICJEYXRhYmFzZSBTdGF0aXN0aWNzIgorbXNnc3RyICJTdGF0aXN0aXF1ZXMgYmFzZSBkZSBkb25uw6llIgorCisjOiBnaXQtZ3VpLnNoOjE5MDkgbGliL2RhdGFiYXNlLnRjbDozNAorbXNnaWQgIkNvbXByZXNzIERhdGFiYXNlIgorbXNnc3RyICJDb21wcmltZXIgYmFzZSBkZSBkb25uw6llIgorCisjOiBnaXQtZ3VpLnNoOjE5MTIKK21zZ2lkICJWZXJpZnkgRGF0YWJhc2UiCittc2dzdHIgIlbDqXJpZmllciBiYXNlIGRlIGRvbm7DqWUiCisKKyM6IGdpdC1ndWkuc2g6MTkxOSBnaXQtZ3VpLnNoOjE5MjMgZ2l0LWd1aS5zaDoxOTI3IGxpYi9zaG9ydGN1dC50Y2w6NworIzogbGliL3Nob3J0Y3V0LnRjbDozOSBsaWIvc2hvcnRjdXQudGNsOjcxCittc2dpZCAiQ3JlYXRlIERlc2t0b3AgSWNvbiIKK21zZ3N0ciAiQ3LDqWVyIGljw7RuZSBzdXIgYnVyZWF1IgorCisjOiBnaXQtZ3VpLnNoOjE5MzIgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxNzcgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxODUKK21zZ2lkICJRdWl0IgorbXNnc3RyICJRdWl0dGVyIgorCisjOiBnaXQtZ3VpLnNoOjE5MzkKK21zZ2lkICJVbmRvIgorbXNnc3RyICJEw6lmYWlyZSIKKworIzogZ2l0LWd1aS5zaDoxOTQyCittc2dpZCAiUmVkbyIKK21zZ3N0ciAiUmVmYWlyZSIKKworIzogZ2l0LWd1aS5zaDoxOTQ2IGdpdC1ndWkuc2g6MjQ0MworbXNnaWQgIkN1dCIKK21zZ3N0ciAiQ291cGVyIgorCisjOiBnaXQtZ3VpLnNoOjE5NDkgZ2l0LWd1aS5zaDoyNDQ2IGdpdC1ndWkuc2g6MjUyMCBnaXQtZ3VpLnNoOjI2MTQKKyM6IGxpYi9jb25zb2xlLnRjbDo2OQorbXNnaWQgIkNvcHkiCittc2dzdHIgIkNvcGllciIKKworIzogZ2l0LWd1aS5zaDoxOTUyIGdpdC1ndWkuc2g6MjQ0OQorbXNnaWQgIlBhc3RlIgorbXNnc3RyICJDb2xsZXIiCisKKyM6IGdpdC1ndWkuc2g6MTk1NSBnaXQtZ3VpLnNoOjI0NTIgbGliL2JyYW5jaF9kZWxldGUudGNsOjI2CisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjM4Cittc2dpZCAiRGVsZXRlIgorbXNnc3RyICJTdXBwcmltZXIiCisKKyM6IGdpdC1ndWkuc2g6MTk1OSBnaXQtZ3VpLnNoOjI0NTYgZ2l0LWd1aS5zaDoyNjE4IGxpYi9jb25zb2xlLnRjbDo3MQorbXNnaWQgIlNlbGVjdCBBbGwiCittc2dzdHIgIlRvdXQgc8OpbGVjdGlvbm5lciIKKworIzogZ2l0LWd1aS5zaDoxOTY4Cittc2dpZCAiQ3JlYXRlLi4uIgorbXNnc3RyICJDcsOpZXIuLi4iCisKKyM6IGdpdC1ndWkuc2g6MTk3NAorbXNnaWQgIkNoZWNrb3V0Li4uIgorbXNnc3RyICJFbXBydW50ZXIuLi4gIgorCisjOiBnaXQtZ3VpLnNoOjE5ODAKK21zZ2lkICJSZW5hbWUuLi4iCittc2dzdHIgIlJlbm9tbWVyLi4uIgorCisjOiBnaXQtZ3VpLnNoOjE5ODUgZ2l0LWd1aS5zaDoyMDg1Cittc2dpZCAiRGVsZXRlLi4uIgorbXNnc3RyICJTdXBwcmltZXIuLi4iCisKKyM6IGdpdC1ndWkuc2g6MTk5MAorbXNnaWQgIlJlc2V0Li4uIgorbXNnc3RyICJSw6lpbml0aWFsaXNlci4uLiIKKworIzogZ2l0LWd1aS5zaDoyMDAyIGdpdC1ndWkuc2g6MjM4OQorbXNnaWQgIk5ldyBDb21taXQiCittc2dzdHIgIk5vdXZlYXUgY29tbWl0IgorCisjOiBnaXQtZ3VpLnNoOjIwMTAgZ2l0LWd1aS5zaDoyMzk2Cittc2dpZCAiQW1lbmQgTGFzdCBDb21taXQiCittc2dzdHIgIkNvcnJpZ2VyIGRlcm5pZXIgY29tbWl0IgorCisjOiBnaXQtZ3VpLnNoOjIwMTkgZ2l0LWd1aS5zaDoyMzU2IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6OTkKK21zZ2lkICJSZXNjYW4iCittc2dzdHIgIlJlc3luY2hyb25pc2VyIgorCisjOiBnaXQtZ3VpLnNoOjIwMjUKK21zZ2lkICJTdGFnZSBUbyBDb21taXQiCittc2dzdHIgIkNvbW1pdGVyIHVuIHByw6ktY29tbWl0IgorCisjOiBnaXQtZ3VpLnNoOjIwMzEKK21zZ2lkICJTdGFnZSBDaGFuZ2VkIEZpbGVzIFRvIENvbW1pdCIKK21zZ3N0ciAiQ29tbWl0ZXIgZmljaGllcnMgbW9kaWZpw6lzIGRhbnMgcHLDqS1jb21taXQiCisKKyM6IGdpdC1ndWkuc2g6MjAzNworbXNnaWQgIlVuc3RhZ2UgRnJvbSBDb21taXQiCittc2dzdHIgIkNvbW1pdCB2ZXJzIHByw6ktY29tbWl0IgorCisjOiBnaXQtZ3VpLnNoOjIwNDIgbGliL2luZGV4LnRjbDozOTUKK21zZ2lkICJSZXZlcnQgQ2hhbmdlcyIKK21zZ3N0ciAiSW52ZXJzZXIgbW9kaWZpY2F0aW9uIgorCisjOiBnaXQtZ3VpLnNoOjIwNDkgZ2l0LWd1aS5zaDoyMzY4IGdpdC1ndWkuc2g6MjQ2NworbXNnaWQgIlNpZ24gT2ZmIgorbXNnc3RyICJTZSBkw6lzaW5zY3JpcmUiCisKKyM6IGdpdC1ndWkuc2g6MjA1MyBnaXQtZ3VpLnNoOjIzNzIKK21zZ2lkICJDb21taXRAQHZlcmIiCittc2dzdHIgIkNvbW1pdGVyIgorCisjOiBnaXQtZ3VpLnNoOjIwNjQKK21zZ2lkICJMb2NhbCBNZXJnZS4uLiIKK21zZ3N0ciAiRnVzaW9uIGxvY2FsZS4uLiIKKworIzogZ2l0LWd1aS5zaDoyMDY5Cittc2dpZCAiQWJvcnQgTWVyZ2UuLi4iCittc2dzdHIgIkFiYW5kb25uZXIgZnVzaW9uLi4uIgorCisjOiBnaXQtZ3VpLnNoOjIwODEKK21zZ2lkICJQdXNoLi4uIgorbXNnc3RyICJQb3Vzc2VyLi4uIgorCisjOiBnaXQtZ3VpLnNoOjIwOTIgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0MQorbXNnaWQgIkFwcGxlIgorbXNnc3RyICJQb21tZSIKKworIzogZ2l0LWd1aS5zaDoyMDk1IGdpdC1ndWkuc2g6MjExNyBsaWIvYWJvdXQudGNsOjE0CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ0IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJBYm91dCAlcyIKK21zZ3N0ciAiQSBwcm9wb3MgZGUgJXMiCisKKyM6IGdpdC1ndWkuc2g6MjA5OQorbXNnaWQgIlByZWZlcmVuY2VzLi4uIgorbXNnc3RyICJQcsOpZsOpcmVuY2VzLi4uIgorCisjOiBnaXQtZ3VpLnNoOjIxMDcgZ2l0LWd1aS5zaDoyNjM5Cittc2dpZCAiT3B0aW9ucy4uLiIKK21zZ3N0ciAiT3B0aW9ucy4uLiIKKworIzogZ2l0LWd1aS5zaDoyMTEzIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDcKK21zZ2lkICJIZWxwIgorbXNnc3RyICJBaWRlIgorCisjOiBnaXQtZ3VpLnNoOjIxNTQKK21zZ2lkICJPbmxpbmUgRG9jdW1lbnRhdGlvbiIKK21zZ3N0ciAiRG9jdW1lbnRhdGlvbiBlbiBsaWduZSIKKworIzogZ2l0LWd1aS5zaDoyMjM4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiZmF0YWw6IGNhbm5vdCBzdGF0IHBhdGggJXM6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiCittc2dzdHIgImVycmV1ciBmYXRhbGUgOiBwYXMgZCdpbmZvcyBzdXIgbGUgY2hlbWluICVzIDogRmljaGllciBvdSByw6lwZXJ0b2lyZSBpbmV4aXN0YW50IgorCisjOiBnaXQtZ3VpLnNoOjIyNzEKK21zZ2lkICJDdXJyZW50IEJyYW5jaDoiCittc2dzdHIgIkJyYW5jaGUgY291cmFudGUgOiIKKworIzogZ2l0LWd1aS5zaDoyMjkyCittc2dpZCAiU3RhZ2VkIENoYW5nZXMgKFdpbGwgQ29tbWl0KSIKK21zZ3N0ciAiTW9kaWZpY2F0aW9ucyBwcsOpLWNvbW1pdMOpZXMiCisKKyM6IGdpdC1ndWkuc2g6MjMxMgorbXNnaWQgIlVuc3RhZ2VkIENoYW5nZXMiCittc2dzdHIgIk1vZGlmaWNhdGlvbnMgbm9uIHByw6ktY29tbWl0w6llcyIKKworIzogZ2l0LWd1aS5zaDoyMzYyCittc2dpZCAiU3RhZ2UgQ2hhbmdlZCIKK21zZ3N0ciAiUHLDqS1jb21taXQgbW9kaWZpw6kiCisKKyM6IGdpdC1ndWkuc2g6MjM3OCBsaWIvdHJhbnNwb3J0LnRjbDo5MyBsaWIvdHJhbnNwb3J0LnRjbDoxODIKK21zZ2lkICJQdXNoIgorbXNnc3RyICJQb3Vzc2VyIgorCisjOiBnaXQtZ3VpLnNoOjI0MDgKK21zZ2lkICJJbml0aWFsIENvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAiTWVzc2FnZSBkZSBjb21taXQgaW5pdGlhbCA6IgorCisjOiBnaXQtZ3VpLnNoOjI0MDkKK21zZ2lkICJBbWVuZGVkIENvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAiTWVzc2FnZSBkZSBjb21taXQgY29ycmlnw6kgOiIKKworIzogZ2l0LWd1aS5zaDoyNDEwCittc2dpZCAiQW1lbmRlZCBJbml0aWFsIENvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAiTWVzc2FnZSBkZSBjb21taXQgaW5pdGlhbCBjb3JyaWfDqSA6IgorCisjOiBnaXQtZ3VpLnNoOjI0MTEKK21zZ2lkICJBbWVuZGVkIE1lcmdlIENvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAiTWVzc2FnZSBkZSBjb21taXQgZGUgZnVzaW9uIGNvcnJpZ8OpIDoiCisKKyM6IGdpdC1ndWkuc2g6MjQxMgorbXNnaWQgIk1lcmdlIENvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAiTWVzc2FnZSBkZSBjb21taXQgZGUgZnVzaW9uIDoiCisKKyM6IGdpdC1ndWkuc2g6MjQxMworbXNnaWQgIkNvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAiTWVzc2FnZSBkZSBjb21taXQgOiIKKworIzogZ2l0LWd1aS5zaDoyNDU5IGdpdC1ndWkuc2g6MjYyMiBsaWIvY29uc29sZS50Y2w6NzMKK21zZ2lkICJDb3B5IEFsbCIKK21zZ3N0ciAiQ29waWVyIHRvdXQiCisKKyM6IGdpdC1ndWkuc2g6MjQ4MyBsaWIvYmxhbWUudGNsOjEwNworbXNnaWQgIkZpbGU6IgorbXNnc3RyICJGaWNoaWVyIDoiCisKKyM6IGdpdC1ndWkuc2g6MjU4OQorbXNnaWQgIkFwcGx5L1JldmVyc2UgSHVuayIKK21zZ3N0ciAiQXBwbGlxdWVyL0ludmVyc2VyIHNlY3Rpb24iCisKKyM6IGdpdC1ndWkuc2g6MjU5NQorbXNnaWQgIlNob3cgTGVzcyBDb250ZXh0IgorbXNnc3RyICJNb250cmVyIG1vaW5zIGRlIGNvbnRleHRlIgorCisjOiBnaXQtZ3VpLnNoOjI2MDIKK21zZ2lkICJTaG93IE1vcmUgQ29udGV4dCIKK21zZ3N0ciAiTW9udHJlciBwbHVzIGRlIGNvbnRleHRlIgorCisjOiBnaXQtZ3VpLnNoOjI2MTAKK21zZ2lkICJSZWZyZXNoIgorbXNnc3RyICJSYWZyYWljaGlyIgorCisjOiBnaXQtZ3VpLnNoOjI2MzEKK21zZ2lkICJEZWNyZWFzZSBGb250IFNpemUiCittc2dzdHIgIlLDqWR1aXJlIGZvbnRlIgorCisjOiBnaXQtZ3VpLnNoOjI2MzUKK21zZ2lkICJJbmNyZWFzZSBGb250IFNpemUiCittc2dzdHIgIkFncmFuZGlyIGZvbnRlIgorCisjOiBnaXQtZ3VpLnNoOjI2NDYKK21zZ2lkICJVbnN0YWdlIEh1bmsgRnJvbSBDb21taXQiCittc2dzdHIgIkVubGV2ZXIgc2VjdGlvbiBwcsOpLWNvbW1pdMOpZSIKKworIzogZ2l0LWd1aS5zaDoyNjQ4Cittc2dpZCAiU3RhZ2UgSHVuayBGb3IgQ29tbWl0IgorbXNnc3RyICJQcsOpLWNvbW1pdGVyIHNlY3Rpb24iCisKKyM6IGdpdC1ndWkuc2g6MjY2NworbXNnaWQgIkluaXRpYWxpemluZy4uLiIKK21zZ3N0ciAiSW5pdGlhbGlzYXRpb24uLi4iCisKKyM6IGdpdC1ndWkuc2g6Mjc2MgorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJQb3NzaWJsZSBlbnZpcm9ubWVudCBpc3N1ZXMgZXhpc3QuXG4iCisiXG4iCisiVGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHByb2JhYmx5XG4iCisiZ29pbmcgdG8gYmUgaWdub3JlZCBieSBhbnkgR2l0IHN1YnByb2Nlc3MgcnVuXG4iCisiYnkgJXM6XG4iCisiXG4iCittc2dzdHIgIiIKKyJEZXMgcHJvYmzDqG1lcyBkJ2Vudmlyb25uZW1lbnQgc29udCBwb3NzaWJsZXMuXG4iCisiXG4iCisiTGVzIHZhcmlhYmxlcyBkJ2Vudmlyb25uZW1lbnQgc3VpdmFudGVzIHNlcm9udFxuIgorInByb2JhYmxlbWVudCBpZ25vcsOpZXMgcGFyIHRvdXMgbGVzXG4iCisic291cy1wcm9jZXNzdXMgZGUgR2l0IGxhbmPDqXMgcGFyICVzXG4iCisiXG4iCisKKyM6IGdpdC1ndWkuc2g6Mjc5MgorbXNnaWQgIiIKKyJcbiIKKyJUaGlzIGlzIGR1ZSB0byBhIGtub3duIGlzc3VlIHdpdGggdGhlXG4iCisiVGNsIGJpbmFyeSBkaXN0cmlidXRlZCBieSBDeWd3aW4uIgorbXNnc3RyICIiCisiXG4iCisiQ2VjaSBlc3QgZHUgw6AgdW4gcHJvYmzDqG1lIGNvbm51IGF2ZWNcbiIKKyJsZSBiaW5haXJlIFRjbCBkaXN0cmlidcOpIHBhciBDeWd3aW4uIgorCisjOiBnaXQtZ3VpLnNoOjI3OTcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiXG4iCisiQSBnb29kIHJlcGxhY2VtZW50IGZvciAlc1xuIgorImlzIHBsYWNpbmcgdmFsdWVzIGZvciB0aGUgdXNlci5uYW1lIGFuZFxuIgorInVzZXIuZW1haWwgc2V0dGluZ3MgaW50byB5b3VyIHBlcnNvbmFsXG4iCisifi8uZ2l0Y29uZmlnIGZpbGUuXG4iCittc2dzdHIgIiIKKyJcbiIKKyJcbiIKKyJVbiBib24gcmVtcGxhY2VtZW50IHBvdXIgJXNcbiIKKyJlc3QgZGUgbWV0dHJlIGxlcyB2YWxldXJzIHBvdXIgJ3VzZXIubmFtZScgKG5vbVxuIgorImRlIGwndXRpbGlzYXRldXIpIGV0ICd1c2VyLmVtYWlsJyAoYWRkcmVzc2UgZW1haWxcbiIKKyJkZSBsJ3V0aWxpc2F0ZXVyKSBkYW5zIHZvdHJlIGZpY2hpZXIgJ34vLmdpdGNvbmZpZycuXG4iCisKKyM6IGxpYi9hYm91dC50Y2w6MjYKK21zZ2lkICJnaXQtZ3VpIC0gYSBncmFwaGljYWwgdXNlciBpbnRlcmZhY2UgZm9yIEdpdC4iCittc2dzdHIgImdpdC1ndWkgLSB1bmUgaW50ZXJmYWNlIGdyYXBoaXF1ZSB1dGlsaXNhdGV1ciBwb3VyIEdpdCIKKworIzogbGliL2JsYW1lLnRjbDo3NworbXNnaWQgIkZpbGUgVmlld2VyIgorbXNnc3RyICJWaXNpb25uZXVyIGRlIGZpY2hpZXIiCisKKyM6IGxpYi9ibGFtZS50Y2w6ODEKK21zZ2lkICJDb21taXQ6IgorbXNnc3RyICJDb21taXQgOiIKKworIzogbGliL2JsYW1lLnRjbDoyNjQKK21zZ2lkICJDb3B5IENvbW1pdCIKK21zZ3N0ciAiQ29waWVyIGNvbW1pdCIKKworIzogbGliL2JsYW1lLnRjbDozODQKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJSZWFkaW5nICVzLi4uIgorbXNnc3RyICJMZWN0dXJlIGRlICVzLi4uIgorCisjOiBsaWIvYmxhbWUudGNsOjQ4OAorbXNnaWQgIkxvYWRpbmcgY29weS9tb3ZlIHRyYWNraW5nIGFubm90YXRpb25zLi4uIgorbXNnc3RyICJDaGFyZ2VtZW50IGRlcyBhbm5vdGF0aW9ucyBkZSBzdWl2aSBkZXMgY29waWVzL2TDqXBsYWNlbWVudHMuLi4iCisKKyM6IGxpYi9ibGFtZS50Y2w6NTA4Cittc2dpZCAibGluZXMgYW5ub3RhdGVkIgorbXNnc3RyICJsaWduZXMgYW5ub3TDqWVzIgorCisjOiBsaWIvYmxhbWUudGNsOjY4OQorbXNnaWQgIkxvYWRpbmcgb3JpZ2luYWwgbG9jYXRpb24gYW5ub3RhdGlvbnMuLi4iCittc2dzdHIgIkNoYXJnZW1lbnQgZGVzIGFubm90YXRpb25zIGQnZW1wbGFjZW1lbnQgb3JpZ2luYWwiCisKKyM6IGxpYi9ibGFtZS50Y2w6NjkyCittc2dpZCAiQW5ub3RhdGlvbiBjb21wbGV0ZS4iCittc2dzdHIgIkFubm90YXRpb24gdGVybWluw6llLiIKKworIzogbGliL2JsYW1lLnRjbDo3NDYKK21zZ2lkICJMb2FkaW5nIGFubm90YXRpb24uLi4iCittc2dzdHIgIkNoYXJnZW1lbnQgZGVzIGFubm90YXRpb25zLi4uIgorCisjOiBsaWIvYmxhbWUudGNsOjgwMgorbXNnaWQgIkF1dGhvcjoiCittc2dzdHIgIkF1dGV1ciA6IgorCisjOiBsaWIvYmxhbWUudGNsOjgwNgorbXNnaWQgIkNvbW1pdHRlcjoiCittc2dzdHIgIkNvbW1pdGV1ciA6IgorCisjOiBsaWIvYmxhbWUudGNsOjgxMQorbXNnaWQgIk9yaWdpbmFsIEZpbGU6IgorbXNnc3RyICJGaWNoaWVyIG9yaWdpbmFsIDoiCisKKyM6IGxpYi9ibGFtZS50Y2w6OTI1Cittc2dpZCAiT3JpZ2luYWxseSBCeToiCittc2dzdHIgIkEgbCdvcmlnaW5lIHBhciA6IgorCisjOiBsaWIvYmxhbWUudGNsOjkzMQorbXNnaWQgIkluIEZpbGU6IgorbXNnc3RyICJEYW5zIGxlIGZpY2hpZXIgOiIKKworIzogbGliL2JsYW1lLnRjbDo5MzYKK21zZ2lkICJDb3BpZWQgT3IgTW92ZWQgSGVyZSBCeToiCittc2dzdHIgIkNvcGnDqSBvdSBkw6lwbGFjw6kgaWNpIHBhciA6IgorCisjOiBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDoxNCBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDoxOQorbXNnaWQgIkNoZWNrb3V0IEJyYW5jaCIKK21zZ3N0ciAiRW1wcnVudGVyIGJyYW5jaGUiCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjIzCittc2dpZCAiQ2hlY2tvdXQiCittc2dzdHIgIkVtcHJ1bnRlciIKKworIzogbGliL2JyYW5jaF9jaGVja291dC50Y2w6MjcgbGliL2JyYW5jaF9jcmVhdGUudGNsOjM1CisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MzIgbGliL2JyYW5jaF9yZW5hbWUudGNsOjMwIGxpYi9icm93c2VyLnRjbDoyODIKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NTIyIGxpYi9jaG9vc2VfZm9udC50Y2w6NDMgbGliL21lcmdlLnRjbDoxNzEKKyM6IGxpYi9vcHRpb24udGNsOjEwMyBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjQyIGxpYi90cmFuc3BvcnQudGNsOjk3Cittc2dpZCAiQ2FuY2VsIgorbXNnc3RyICJBbm51bGVyIgorCisjOiBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDozMiBsaWIvYnJvd3Nlci50Y2w6Mjg3Cittc2dpZCAiUmV2aXNpb24iCittc2dzdHIgIlLDqXZpc2lvbiIKKworIzogbGliL2JyYW5jaF9jaGVja291dC50Y2w6MzYgbGliL2JyYW5jaF9jcmVhdGUudGNsOjY5IGxpYi9vcHRpb24udGNsOjI0MgorbXNnaWQgIk9wdGlvbnMiCittc2dzdHIgIk9wdGlvbnMiCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjM5IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo5MgorbXNnaWQgIkZldGNoIFRyYWNraW5nIEJyYW5jaCIKK21zZ3N0ciAiQnJhbmNoZSBzdWl2YW50IHLDqWN1cMOpcmF0aW9uIgorCisjOiBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDo0NAorbXNnaWQgIkRldGFjaCBGcm9tIExvY2FsIEJyYW5jaCIKK21zZ3N0ciAiRMOpdGFjaGVyIGRlIGJyYW5jaGUgbG9jYWxlIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MjIKK21zZ2lkICJDcmVhdGUgQnJhbmNoIgorbXNnc3RyICJDcsOpZXIgYnJhbmNoZSIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjI3Cittc2dpZCAiQ3JlYXRlIE5ldyBCcmFuY2giCittc2dzdHIgIkNyw6llciBub3V2ZWxsZSBicmFuY2hlIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MzEgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozNzEKK21zZ2lkICJDcmVhdGUiCittc2dzdHIgIkNyw6llciIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjQwCittc2dpZCAiQnJhbmNoIE5hbWUiCittc2dzdHIgIk5vbSBkZSBicmFuY2hlIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NDMKK21zZ2lkICJOYW1lOiIKK21zZ3N0ciAiTm9tIDoiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo1OAorbXNnaWQgIk1hdGNoIFRyYWNraW5nIEJyYW5jaCBOYW1lIgorbXNnc3RyICJUcm91dmVyIG5vbSBkZSBicmFuY2hlIGRlIHN1aXZpIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NjYKK21zZ2lkICJTdGFydGluZyBSZXZpc2lvbiIKK21zZ3N0ciAiRMOpYnV0IGRlIHLDqXZpc2lvbiIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjcyCittc2dpZCAiVXBkYXRlIEV4aXN0aW5nIEJyYW5jaDoiCittc2dzdHIgIk1ldHRyZSDDoCBqb3VyIGJyYW5jaGUgZXhpc3RhbnRlIDoiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo3NQorbXNnaWQgIk5vIgorbXNnc3RyICJOb24iCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo4MAorbXNnaWQgIkZhc3QgRm9yd2FyZCBPbmx5IgorbXNnc3RyICJBdmFuY2UgcmFwaWRlIHNldWxlbWVudCIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjg1IGxpYi9jaGVja291dF9vcC50Y2w6NTE0Cittc2dpZCAiUmVzZXQiCittc2dzdHIgIlLDqWluaXRpYWxpc2VyIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6OTcKK21zZ2lkICJDaGVja291dCBBZnRlciBDcmVhdGlvbiIKK21zZ3N0ciAiRW1wcnVudCBhcHLDqHMgY3LDqWF0aW9uIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MTMxCittc2dpZCAiUGxlYXNlIHNlbGVjdCBhIHRyYWNraW5nIGJyYW5jaC4iCittc2dzdHIgIk1lcmNpIGRlIGNob2lzaXIgdW5lIGJyYW5jaGUgZGUgc3VpdmkiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDoxNDAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJUcmFja2luZyBicmFuY2ggJXMgaXMgbm90IGEgYnJhbmNoIGluIHRoZSByZW1vdGUgcmVwb3NpdG9yeS4iCittc2dzdHIgIkxhIGJyYW5jaGUgZGUgc3VpdmkgJXMgbidlc3QgcGFzIHVuZSBicmFuY2hlIGRhbnMgbGUgcsOpZsOpcmVudGllbCBkaXN0YW50LiIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjE1MyBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6ODYKK21zZ2lkICJQbGVhc2Ugc3VwcGx5IGEgYnJhbmNoIG5hbWUuIgorbXNnc3RyICJNZXJjaSBkZSBmb3VybmlyIHVuIG5vbSBkZSBicmFuY2hlLiIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjE2NCBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MTA2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiJyVzJyBpcyBub3QgYW4gYWNjZXB0YWJsZSBicmFuY2ggbmFtZS4iCittc2dzdHIgIiclcycgbidlc3QgcGFzIHVuIG5vbSBkZSBicmFuY2hlIGFjY2VwdGFibGUuIgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MTUKK21zZ2lkICJEZWxldGUgQnJhbmNoIgorbXNnc3RyICJTdXBwcmltZXIgYnJhbmNoZSIKKworIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjIwCittc2dpZCAiRGVsZXRlIExvY2FsIEJyYW5jaCIKK21zZ3N0ciAiU3VwcHJpbWVyIGJyYW5jaGUgbG9jYWxlIgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MzcKK21zZ2lkICJMb2NhbCBCcmFuY2hlcyIKK21zZ3N0ciAiQnJhbmNoZXMgbG9jYWxlcyIKKworIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjUyCittc2dpZCAiRGVsZXRlIE9ubHkgSWYgTWVyZ2VkIEludG8iCittc2dzdHIgIlN1cHByaW1lciBzc2kgZnVzaW9uIGRlZGFucyIKKworIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjU0Cittc2dpZCAiQWx3YXlzIChEbyBub3QgcGVyZm9ybSBtZXJnZSB0ZXN0LikiCittc2dzdHIgIlRvdWpvdXJzIChOZSBwYXMgZmFpcmUgZGUgdGVzdCBkZSBmdXNpb24uKSIKKworIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjEwMworIywgdGNsLWZvcm1hdAorbXNnaWQgIlRoZSBmb2xsb3dpbmcgYnJhbmNoZXMgYXJlIG5vdCBjb21wbGV0ZWx5IG1lcmdlZCBpbnRvICVzOiIKK21zZ3N0ciAiTGVzIGJyYW5jaGVzIHN1aXZhbnRlcyBuZSBzb250IHBhcyBjb21wbMOodGVtZW50IGZ1c2lvbm7DqWVzIGRhbnMgJXMgOiIKKworIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjExNQorbXNnaWQgIiIKKyJSZWNvdmVyaW5nIGRlbGV0ZWQgYnJhbmNoZXMgaXMgZGlmZmljdWx0LiBcbiIKKyJcbiIKKyIgRGVsZXRlIHRoZSBzZWxlY3RlZCBicmFuY2hlcz8iCittc2dzdHIgIiIKKyJSw6ljdXDDqXJlciBkZXMgYnJhbmNoZXMgc3VwcHJpbcOpZXMgZXN0IGRpZmZpY2lsZS5cbiIKKyJcbiIKKyJTdXBwcmltZXIgbGVzIGJyYW5jaGVzIHPDqWxlY3Rpb25uw6llcyA/IgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MTQxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBkZWxldGUgYnJhbmNoZXM6XG4iCisiJXMiCittc2dzdHIgIiIKKyJMYSBzdXBwcmVzc2lvbiBkZXMgYnJhbmNoZXMgc3VpdmFudGVzIGEgw6ljaG91w6llIDpcbiIKKyIlcyIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjE0IGxpYi9icmFuY2hfcmVuYW1lLnRjbDoyMgorbXNnaWQgIlJlbmFtZSBCcmFuY2giCittc2dzdHIgIlJlbm9tbWVyIGJyYW5jaGUiCisKKyM6IGxpYi9icmFuY2hfcmVuYW1lLnRjbDoyNgorbXNnaWQgIlJlbmFtZSIKK21zZ3N0ciAiUmVub21tZXIiCisKKyM6IGxpYi9icmFuY2hfcmVuYW1lLnRjbDozNgorbXNnaWQgIkJyYW5jaDoiCittc2dzdHIgIkJyYW5jaGUgOiIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjM5Cittc2dpZCAiTmV3IE5hbWU6IgorbXNnc3RyICJOb3V2ZWF1IG5vbSA6IgorCisjOiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6NzUKK21zZ2lkICJQbGVhc2Ugc2VsZWN0IGEgYnJhbmNoIHRvIHJlbmFtZS4iCittc2dzdHIgIk1lcmNpIGRlIHPDqWxlY3Rpb25uZXIgdW5lIGJyYW5jaGUgw6AgcmVub21tZXIuIgorCisjOiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6OTYgbGliL2NoZWNrb3V0X29wLnRjbDoxNzkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJCcmFuY2ggJyVzJyBhbHJlYWR5IGV4aXN0cy4iCittc2dzdHIgIkxhIGJyYW5jaGUgJyVzJyBleGlzdGUgZMOpasOgLiIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjExNworIywgdGNsLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byByZW5hbWUgJyVzJy4iCittc2dzdHIgIkxlIHJlbm9tbWFnZSBkZSAnJXMnIGEgw6ljaG91w6kuIgorCisjOiBsaWIvYnJvd3Nlci50Y2w6MTcKK21zZ2lkICJTdGFydGluZy4uLiIKK21zZ3N0ciAiTGFuY2VtZW50Li4uIgorCisjOiBsaWIvYnJvd3Nlci50Y2w6MjYKK21zZ2lkICJGaWxlIEJyb3dzZXIiCittc2dzdHIgIlZpc2lvbm5ldXIgZGUgZmljaGllciIKKworIzogbGliL2Jyb3dzZXIudGNsOjEyNiBsaWIvYnJvd3Nlci50Y2w6MTQzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiTG9hZGluZyAlcy4uLiIKK21zZ3N0ciAiQ2hhcmdlbWVudCBkZSAlcy4uLiIKKworIzogbGliL2Jyb3dzZXIudGNsOjE4NworbXNnaWQgIltVcCBUbyBQYXJlbnRdIgorbXNnc3RyICJbSnVzcXUnYXUgcGFyZW50XSIKKworIzogbGliL2Jyb3dzZXIudGNsOjI2NyBsaWIvYnJvd3Nlci50Y2w6MjczCittc2dpZCAiQnJvd3NlIEJyYW5jaCBGaWxlcyIKK21zZ3N0ciAiVmlzaW9ubmVyIGZpY2hpZXJzIGRlIGJyYW5jaGVzIgorCisjOiBsaWIvYnJvd3Nlci50Y2w6Mjc4IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6Mzg3CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ3NCBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ4NAorIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5ODcKK21zZ2lkICJCcm93c2UiCittc2dzdHIgIlZpc2lvbm5lciIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDo3OQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkZldGNoaW5nICVzIGZyb20gJXMiCittc2dzdHIgIlLDqWN1cMOpcmF0aW9uIGRlICVzIMOgIHBhcnRpciBkZSAlcyIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoxMjcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJmYXRhbDogQ2Fubm90IHJlc29sdmUgJXMiCittc2dzdHIgImVycmV1ciBmYXRhbGUgOiBJbXBvc3NpYmxlIGRlIHLDqXNvdWRyZSAlcyIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoxNDAgbGliL2NvbnNvbGUudGNsOjgxIGxpYi9kYXRhYmFzZS50Y2w6MzEKK21zZ2lkICJDbG9zZSIKK21zZ3N0ciAiRmVybWVyIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjE2OQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkJyYW5jaCAnJXMnIGRvZXMgbm90IGV4aXN0LiIKK21zZ3N0ciAiTGEgYnJhbmNoZSAnJXMnIG4nZXhpc3RlIHBhcy4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MjA2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIkJyYW5jaCAnJXMnIGFscmVhZHkgZXhpc3RzLlxuIgorIlxuIgorIkl0IGNhbm5vdCBmYXN0LWZvcndhcmQgdG8gJXMuXG4iCisiQSBtZXJnZSBpcyByZXF1aXJlZC4iCittc2dzdHIgIiIKKyJMYSBicmFuY2hlICclcycgZXhpc3RlIGTDqWrDoC5cbiIKKyJcbiIKKyJJbXBvc3NpYmxlIGQnYXZhbmNlciByYXBpZGVtZW50IMOgICVzLlxuIgorIlVuZSBmdXNpb24gZXN0IG7DqWNlc3NhaXJlLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoyMjAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJNZXJnZSBzdHJhdGVneSAnJXMnIG5vdCBzdXBwb3J0ZWQuIgorbXNnc3RyICJMYSBzdHJhdMOpZ2llIGRlIGZ1c2lvbiAnJXMnIG4nZXN0IHBhcyBzdXBwb3J0w6llLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoyMzkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gdXBkYXRlICclcycuIgorbXNnc3RyICJMYSBtaXNlIMOgIGpvdXIgZGUgJyVzJyBhIMOpY2hvdcOpZS4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MjUxCittc2dpZCAiU3RhZ2luZyBhcmVhIChpbmRleCkgaXMgYWxyZWFkeSBsb2NrZWQuIgorbXNnc3RyICJMJ2VzcGFjZSBkZSBwcsOpLWNvbW1pdCAoJ2luZGV4JyBvdSAnc3RhZ2luZycpIGVzdCBkw6lqw6AgdsOpcm91aWxsw6kuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjI2NgorbXNnaWQgIiIKKyJMYXN0IHNjYW5uZWQgc3RhdGUgZG9lcyBub3QgbWF0Y2ggcmVwb3NpdG9yeSBzdGF0ZS5cbiIKKyJcbiIKKyJBbm90aGVyIEdpdCBwcm9ncmFtIGhhcyBtb2RpZmllZCB0aGlzIHJlcG9zaXRvcnkgc2luY2UgdGhlIGxhc3Qgc2Nhbi4gIEEgIgorInJlc2NhbiBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlIGN1cnJlbnQgYnJhbmNoIGNhbiBiZSBjaGFuZ2VkLlxuIgorIlxuIgorIlRoZSByZXNjYW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgbm93LlxuIgorbXNnc3RyICIiCisiTCfDqXRhdCBsb3JzIGRlIGxhIGRlcm5pw6hyZSBzeW5jaHJvbmlzYXRpb24gbmUgY29ycmVzcG9uZCBwbHVzIMOgIGwnw6l0YXQgZHUgcsOpZsOpcmVudGllbC5cbiIKKyJcbiIKKyJVbiBhdXRyZSBwcm9ncmFtbWUgR2l0IGEgbW9kaWZpw6kgY2UgcsOpZsOpcmVudGllbCBkZXB1aXMgbGEgZGVybmnDqHJlIHN5bmNocm9uaXNhdGlvbi4gVW5lIHJlc3luY2hyb25pc2F0aW9uIGRvaXQgw6p0cmUgZWZmZWN0dcOpZSBhdmFudCBkZSBwb3V2b2lyIG1vZGlmaWVyIGxhIGJyYW5jaGUgY291cmFudGUuXG4iCisiXG4iCisiQ2VsYSB2YSDDqnRyZSBmYWl0IHRvdXQgZGUgc3VpdGUgYXV0b21hdGlxdWVtZW50LlxuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjMyMgorIywgdGNsLWZvcm1hdAorbXNnaWQgIlVwZGF0aW5nIHdvcmtpbmcgZGlyZWN0b3J5IHRvICclcycuLi4iCittc2dzdHIgIk1pc2Ugw6Agam91ciBkdSByw6lwZXJ0b2lyZSBjb3VyYW50IGF2ZWMgJyVzJy4uLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDozMjMKK21zZ2lkICJmaWxlcyBjaGVja2VkIG91dCIKK21zZ3N0ciAiZmljaGllcnMgZW1wcnVudMOpcyIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDozNTMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJBYm9ydGVkIGNoZWNrb3V0IG9mICclcycgKGZpbGUgbGV2ZWwgbWVyZ2luZyBpcyByZXF1aXJlZCkuIgorbXNnc3RyICJFbXBydW50IGRlICclcycgYWJhbmRvbm7DqS4gKElsIGVzdCBuw6ljZXNzYWlyZSBkZSBmdXNpb25uZXIgZGVzIGZpY2hpZXJzLikiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MzU0Cittc2dpZCAiRmlsZSBsZXZlbCBtZXJnZSByZXF1aXJlZC4iCittc2dzdHIgIklsIGVzdCBuw6ljZXNzYWlyZSBkZSBmdXNpb25uZXIgZGVzIGZpY2hpZXJzLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDozNTgKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJTdGF5aW5nIG9uIGJyYW5jaCAnJXMnLiIKK21zZ3N0ciAiTGUgcsOpcGVydG9pcmUgZGUgdHJhdmFpbCByZXN0ZSBzdXIgbGEgYnJhbmNoZSAnJXMnLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDo0MjkKK21zZ2lkICIiCisiWW91IGFyZSBubyBsb25nZXIgb24gYSBsb2NhbCBicmFuY2guXG4iCisiXG4iCisiSWYgeW91IHdhbnRlZCB0byBiZSBvbiBhIGJyYW5jaCwgY3JlYXRlIG9uZSBub3cgc3RhcnRpbmcgZnJvbSAnVGhpcyBEZXRhY2hlZCAiCisiQ2hlY2tvdXQnLiIKK21zZ3N0ciAiIgorIlZvdXMgbifDqnRlcyBwbHVzIHVyIHVuZSBicmFuY2hlIGxvY2FsZS5cbiIKKyJcbiIKKyJTaSB2b3VzIHZvdWxpZXogw6p0cmUgc3VyIHVuZSBicmFuY2hlLCBjcsOpZXogZW4gdW5lIG1haW50ZW5hbnQgZW4gcGFydGFudCBkZSAiCisiJ0NldCBlbXBydW50IGTDqXRhY2jDqScuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjQ0NiBsaWIvY2hlY2tvdXRfb3AudGNsOjQ1MAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkNoZWNrZWQgb3V0ICclcycuIgorbXNnc3RyICInJXMnIGVtcHJ1bnTDqS4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NDc4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUmVzZXR0aW5nICclcycgdG8gJyVzJyB3aWxsIGxvc2UgdGhlIGZvbGxvd2luZyBjb21taXRzOiIKK21zZ3N0ciAiUsOpaW5pdGlhbGlzZXIgJyVzJyDDoCAnJXMnIHZhIGZhaXJlIHBlcmRyZSBsZXMgY29tbWl0cyBzdWl2YW50cyA6IgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjUwMAorbXNnaWQgIlJlY292ZXJpbmcgbG9zdCBjb21taXRzIG1heSBub3QgYmUgZWFzeS4iCittc2dzdHIgIlLDqWN1cMOpcmVyIGxlcyBjb21taXRzIHBlcmR1cyBuZSBzZXJhIHBldXQgw6p0cmUgcGFzIGZhY2lsZS4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NTA1CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUmVzZXQgJyVzJz8iCittc2dzdHIgIlLDqWluaXRpYWxpc2VyICclcycgPyIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDo1MTAgbGliL21lcmdlLnRjbDoxNjMKK21zZ2lkICJWaXN1YWxpemUiCittc2dzdHIgIlZpc3VhbGlzZXIiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NTc4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBzZXQgY3VycmVudCBicmFuY2guXG4iCisiXG4iCisiVGhpcyB3b3JraW5nIGRpcmVjdG9yeSBpcyBvbmx5IHBhcnRpYWxseSBzd2l0Y2hlZC4gIFdlIHN1Y2Nlc3NmdWxseSB1cGRhdGVkICIKKyJ5b3VyIGZpbGVzLCBidXQgZmFpbGVkIHRvIHVwZGF0ZSBhbiBpbnRlcm5hbCBHaXQgZmlsZS5cbiIKKyJcbiIKKyJUaGlzIHNob3VsZCBub3QgaGF2ZSBvY2N1cnJlZC4gICVzIHdpbGwgbm93IGNsb3NlIGFuZCBnaXZlIHVwLiIKK21zZ3N0ciAiIgorIkxlIGNoYW5nZW1lbnQgZGUgbGEgYnJhbmNoZSBjb3VyYW50ZSBhIMOpY2hvdcOpLlxuIgorIlxuIgorIkxlIHLDqXBlcnRvaXJlIGNvdXJhbnQgbidlc3QgcXVlIHBhcnRpZWxsZW1lbnQgbW9kaWZpw6kuIExlcyBmaWNoaWVycyBvbnQgw6l0w6kgIgorIm1pcyDDoCBqb3VyIGF2ZWMgc3VjY8OocywgbWFpcyBsYSBtaXNlIMOgIGpvdXIgZCd1biBmaWNoaWVyIGludGVybmUgw6AgR2l0IGEgIgorIsOpY2hvdcOpZS5cbiIKKyJcbiIKKyJDZWxhIG4nYXVyYWl0IHBhcyBkdSBzZSBwcm9kdWlyZS4gJXMgdmEgYWJhbmRvbm5lciBldCBzZSB0ZXJtaW5lci4iCisKKyM6IGxpYi9jaG9vc2VfZm9udC50Y2w6MzkKK21zZ2lkICJTZWxlY3QiCittc2dzdHIgIlPDqWxlY3Rpb25uZXIiCisKKyM6IGxpYi9jaG9vc2VfZm9udC50Y2w6NTMKK21zZ2lkICJGb250IEZhbWlseSIKK21zZ3N0ciAiRmFtaWxsZSBkZSBmb250ZSIKKworIzogbGliL2Nob29zZV9mb250LnRjbDo3NAorbXNnaWQgIkZvbnQgU2l6ZSIKK21zZ3N0ciAiVGFpbGxlIGRlIGZvbnRlIgorCisjOiBsaWIvY2hvb3NlX2ZvbnQudGNsOjkxCittc2dpZCAiRm9udCBFeGFtcGxlIgorbXNnc3RyICJFeGVtcGxlIGRlIGZvbnRlIgorCisjOiBsaWIvY2hvb3NlX2ZvbnQudGNsOjEwMworbXNnaWQgIiIKKyJUaGlzIGlzIGV4YW1wbGUgdGV4dC5cbiIKKyJJZiB5b3UgbGlrZSB0aGlzIHRleHQsIGl0IGNhbiBiZSB5b3VyIGZvbnQuIgorbXNnc3RyICIiCisiQydlc3QgdW4gdGV4dGUgZCdleGVtcGxlLlxuIgorIlNpIHZvdXMgYWltZXogY2UgdGV4dGUsIHZvdXMgcG91dmV6IGNob2lzaXIgY2V0dGUgZm9udGUuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjI4Cittc2dpZCAiR2l0IEd1aSIKK21zZ3N0ciAiR2l0IEd1aSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo4MSBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjM3NgorbXNnaWQgIkNyZWF0ZSBOZXcgUmVwb3NpdG9yeSIKK21zZ3N0ciAiQ3LDqWVyIG5vdXZlYXUgcsOpZsOpcmVudGllbCIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo4NworbXNnaWQgIk5ldy4uLiIKK21zZ3N0ciAiTm91dmVhdS4uLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5NCBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ2MAorbXNnaWQgIkNsb25lIEV4aXN0aW5nIFJlcG9zaXRvcnkiCittc2dzdHIgIkNsb25lciByw6lmw6lyZW50aWVsIGV4aXN0YW50IgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEwMAorbXNnaWQgIkNsb25lLi4uIgorbXNnc3RyICJDbG9uZXIuLi4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTA3IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTc2Cittc2dpZCAiT3BlbiBFeGlzdGluZyBSZXBvc2l0b3J5IgorbXNnc3RyICJPdXZyaXIgcsOpZsOpcmVudGllbCBleGlzdGFudCIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMTMKK21zZ2lkICJPcGVuLi4uIgorbXNnc3RyICJPdXZyaXIuLi4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTI2Cittc2dpZCAiUmVjZW50IFJlcG9zaXRvcmllcyIKK21zZ3N0ciAiUsOpZsOpcmVudGllbHMgcsOpY2VudHMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTMyCittc2dpZCAiT3BlbiBSZWNlbnQgUmVwb3NpdG9yeToiCittc2dzdHIgIk91dnJpciByw6lmw6lyZW50aWVsIHLDqWNlbnQgOiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoyOTYgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozMDMKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MzEwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNyZWF0ZSByZXBvc2l0b3J5ICVzOiIKK21zZ3N0ciAiTGEgY3LDqWF0aW9uIGR1IHLDqWbDqXJlbnRpZWwgJXMgYSDDqWNob3XDqWUgOiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozODEgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NzgKK21zZ2lkICJEaXJlY3Rvcnk6IgorbXNnc3RyICJSw6lwZXJ0b2lyZSA6IgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQxMiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjUzNworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMDExCittc2dpZCAiR2l0IFJlcG9zaXRvcnkiCittc2dzdHIgIlLDqWbDqXJlbnRpZWwgR2l0IgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQzNworIywgdGNsLWZvcm1hdAorbXNnaWQgIkRpcmVjdG9yeSAlcyBhbHJlYWR5IGV4aXN0cy4iCittc2dzdHIgIkxlIHLDqXBlcnRvaXJlICVzIGV4aXN0ZSBkw6lqw6AuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ0MQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkZpbGUgJXMgYWxyZWFkeSBleGlzdHMuIgorbXNnc3RyICJMZSBmaWNoaWVyICVzIGV4aXN0ZSBkw6lqw6AuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ1NQorbXNnaWQgIkNsb25lIgorbXNnc3RyICJDbG9uZXIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDY4Cittc2dpZCAiVVJMOiIKK21zZ3N0ciAiVVJMIDoiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDg5Cittc2dpZCAiQ2xvbmUgVHlwZToiCittc2dzdHIgIlR5cGUgZGUgY2xvbmFnZSA6IgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ5NQorbXNnaWQgIlN0YW5kYXJkIChGYXN0LCBTZW1pLVJlZHVuZGFudCwgSGFyZGxpbmtzKSIKK21zZ3N0ciAiU3RhbmRhcmQgKHJhcGlkZSwgc2VtaS1yZWRvbmRhbnQsIGxpZW5zIGR1cnMpIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjUwMQorbXNnaWQgIkZ1bGwgQ29weSAoU2xvd2VyLCBSZWR1bmRhbnQgQmFja3VwKSIKK21zZ3N0ciAiQ29weSBjb21wbMOodGUgKHBsdXMgbGVudCwgc2F1dmVnYXJkZSByZWRvbmRhbnRlKSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1MDcKK21zZ2lkICJTaGFyZWQgKEZhc3Rlc3QsIE5vdCBSZWNvbW1lbmRlZCwgTm8gQmFja3VwKSIKK21zZ3N0ciAiUGFydGFnw6kgKGxlIHBsdXMgcmFwaWRlLCBub24gcmVjb21tYW5kw6ksIHBhcyBkZSBzYXV2ZWdhcmRlKSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1NDMgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1OTAKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzM2IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODA2CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEwMTcgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMDI1CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiTm90IGEgR2l0IHJlcG9zaXRvcnk6ICVzIgorbXNnc3RyICInJXMnIG4nZXN0IHBhcyB1biByw6lmw6lyZW50aWVsIEdpdC4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTc5Cittc2dpZCAiU3RhbmRhcmQgb25seSBhdmFpbGFibGUgZm9yIGxvY2FsIHJlcG9zaXRvcnkuIgorbXNnc3RyICJTdGFuZGFyZCBuJ2VzdCBkaXNwb25pYmxlIHF1ZSBwb3VyIHVuIHLDqWbDqXJlbnRpZWwgbG9jYWwuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjU4MworbXNnaWQgIlNoYXJlZCBvbmx5IGF2YWlsYWJsZSBmb3IgbG9jYWwgcmVwb3NpdG9yeS4iCittc2dzdHIgIlBhcnRhZ8OpIG4nZXN0IGRpc3BvbmlibGUgcXVlIHBvdXIgdW4gcsOpZsOpcmVudGllbCBsb2NhbC4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NjA0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiTG9jYXRpb24gJXMgYWxyZWFkeSBleGlzdHMuIgorbXNnc3RyICJMJ2VtcGxhY2VtZW50ICVzIGV4aXN0ZSBkw6lqw6AuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjYxNQorbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgb3JpZ2luIgorbXNnc3RyICJMYSBjb25maWd1cmF0aW9uIGRlIGwnb3JpZ2luZSBhIMOpY2hvdcOpZS4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NjI3Cittc2dpZCAiQ291bnRpbmcgb2JqZWN0cyIKK21zZ3N0ciAiQ29tcHRhZ2UgZGVzIG9iamV0cyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo2MjgKK21zZ2lkICJidWNrZXRzIgorbXNnc3RyICJwYW5pZXJzIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjY1MgorIywgdGNsLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBjb3B5IG9iamVjdHMvaW5mby9hbHRlcm5hdGVzOiAlcyIKK21zZ3N0ciAiSW1wb3NzaWJsZSBkZSBjb3BpZXIgJ29iamVjdHMvaW5mby9hbHRlcm5hdGVzJyA6ICVzIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjY4OAorIywgdGNsLWZvcm1hdAorbXNnaWQgIk5vdGhpbmcgdG8gY2xvbmUgZnJvbSAlcy4iCittc2dzdHIgIklsIG4neSBhIHJpZW4gw6AgY2xvbmVyIGRlcHVpcyAlcy4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NjkwIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTA0CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjkxNgorbXNnaWQgIlRoZSAnbWFzdGVyJyBicmFuY2ggaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiIKK21zZ3N0ciAiQ2V0dGUgYnJhbmNoZSAnbWFzdGVyJyBuJ2EgcGFzIMOpdMOpIGluaXRpYWxpc8OpZS4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzAzCittc2dpZCAiSGFyZGxpbmtzIGFyZSB1bmF2YWlsYWJsZS4gIEZhbGxpbmcgYmFjayB0byBjb3B5aW5nLiIKK21zZ3N0ciAiTGVzIGxpZW5zIGR1cnMgbmUgc29udCBwYXMgZGlzcG9uaWJsZXMuIE9uIHNlIHLDqXNvdWQgw6AgY29waWVyLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3MTUKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJDbG9uaW5nIGZyb20gJXMiCittc2dzdHIgIkNsb25hZ2UgZGVwdWlzICVzIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjc0NgorbXNnaWQgIkNvcHlpbmcgb2JqZWN0cyIKK21zZ3N0ciAiQ29waWUgZGVzIG9iamV0cyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3NDcKK21zZ2lkICJLaUIiCittc2dzdHIgIktpQiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3NzEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gY29weSBvYmplY3Q6ICVzIgorbXNnc3RyICJJbXBvc3NpYmxlIGRlIGNvcGllciBsJ29iamV0IDogJXMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzgxCittc2dpZCAiTGlua2luZyBvYmplY3RzIgorbXNnc3RyICJMaWFpc29uIGRlcyBvYmpldHMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzgyCittc2dpZCAib2JqZWN0cyIKK21zZ3N0ciAib2JqZXRzIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjc5MAorIywgdGNsLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBoYXJkbGluayBvYmplY3Q6ICVzIgorbXNnc3RyICJJbXBvc3NpYmxlIGNyw6llciB1biBsaWVuIGR1ciBwb3VyIGwnb2JqZXQgOiAlcyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo4NDUKK21zZ2lkICJDYW5ub3QgZmV0Y2ggYnJhbmNoZXMgYW5kIG9iamVjdHMuICBTZWUgY29uc29sZSBvdXRwdXQgZm9yIGRldGFpbHMuIgorbXNnc3RyICIiCisiSW1wb3NzaWJsZSBkZSByw6ljdXDDqXJlciBsZXMgYnJhbmNoZXMgZXQgb2JqZXRzLiBWb2lyIGxhIHNvcnRpZSBjb25zb2xlIHBvdXIgIgorInBsdXMgZGUgZMOpdGFpbHMuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjg1NgorbXNnaWQgIkNhbm5vdCBmZXRjaCB0YWdzLiAgU2VlIGNvbnNvbGUgb3V0cHV0IGZvciBkZXRhaWxzLiIKK21zZ3N0ciAiIgorIkltcG9zc2libGUgZGUgcsOpY3Vww6lyZXIgbGVzIG1hcnF1ZXMuIFZvaXIgbGEgc29ydGllIGNvbnNvbGUgcG91ciBwbHVzIGRlICIKKyJkw6l0YWlscy4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODgwCittc2dpZCAiQ2Fubm90IGRldGVybWluZSBIRUFELiAgU2VlIGNvbnNvbGUgb3V0cHV0IGZvciBkZXRhaWxzLiIKK21zZ3N0ciAiSW1wb3NzaWJsZSBkZSBkw6l0ZXJtaW5lciBIRUFELiBWb2lyIGxhIHNvcnRpZSBjb25zb2xlIHBvdXIgcGx1cyBkZSBkw6l0YWlscy4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODg5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGNsZWFudXAgJXMiCittc2dzdHIgIkltcG9zc2libGUgZGUgbmV0dG95ZXIgJXMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODk1Cittc2dpZCAiQ2xvbmUgZmFpbGVkLiIKK21zZ3N0ciAiTGUgY2xvbmFnZSBhIMOpY2hvdcOpLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5MDIKK21zZ2lkICJObyBkZWZhdWx0IGJyYW5jaCBvYnRhaW5lZC4iCittc2dzdHIgIkF1Y3VuZSBicmFuY2hlIHBhciBkw6lmYXV0IG4nYSDDqXTDqSBvYnRlbnVlLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5MTMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJDYW5ub3QgcmVzb2x2ZSAlcyBhcyBhIGNvbW1pdC4iCittc2dzdHIgIkltcG9zc2libGUgZGUgcsOpc291ZHJlICVzIGNvbW1lIGNvbW1pdC4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTI1Cittc2dpZCAiQ3JlYXRpbmcgd29ya2luZyBkaXJlY3RvcnkiCittc2dzdHIgIkNyw6lhdGlvbiBkdSByw6lwZXJ0b2lyZSBkZSB0cmF2YWlsIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjkyNiBsaWIvaW5kZXgudGNsOjY1IGxpYi9pbmRleC50Y2w6MTI3CisjOiBsaWIvaW5kZXgudGNsOjE5MworbXNnaWQgImZpbGVzIgorbXNnc3RyICJmaWNoaWVycyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5NTUKK21zZ2lkICJJbml0aWFsIGZpbGUgY2hlY2tvdXQgZmFpbGVkLiIKK21zZ3N0ciAiTCdlbXBydW50IGluaXRpYWwgZGUgZmljaGllciBhIMOpY2hvdcOpLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5NzEKK21zZ2lkICJPcGVuIgorbXNnc3RyICJPdXZyaXIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTgxCittc2dpZCAiUmVwb3NpdG9yeToiCittc2dzdHIgIlLDqWbDqXJlbnRpZWwgOiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMDMxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIG9wZW4gcmVwb3NpdG9yeSAlczoiCittc2dzdHIgIkltcG9zc2libGUgZCdvdXZyaXIgbGUgcsOpZsOpcmVudGllbCAlcyA6IgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6NTMKK21zZ2lkICJUaGlzIERldGFjaGVkIENoZWNrb3V0IgorbXNnc3RyICJDZXQgZW1wcnVudCBkw6l0YWNow6kiCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDo2MAorbXNnaWQgIlJldmlzaW9uIEV4cHJlc3Npb246IgorbXNnc3RyICJFeHByZXNzaW9uIGRlIHLDqXZpc2lvbiA6IgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6NzQKK21zZ2lkICJMb2NhbCBCcmFuY2giCittc2dzdHIgIkJyYW5jaGUgbG9jYWxlIgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6NzkKK21zZ2lkICJUcmFja2luZyBCcmFuY2giCittc2dzdHIgIlN1aXZpIGRlIGJyYW5jaGUiCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDo4NCBsaWIvY2hvb3NlX3Jldi50Y2w6NTM4Cittc2dpZCAiVGFnIgorbXNnc3RyICJNYXJxdWUiCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDozMTcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIHJldmlzaW9uOiAlcyIKK21zZ3N0ciAiUsOpdmlzaW9uIGludmFsaWRlIDogJXMiCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDozMzgKK21zZ2lkICJObyByZXZpc2lvbiBzZWxlY3RlZC4iCittc2dzdHIgIlBhcyBkZSByw6l2aXNpb24gc2VsZWN0aW9ubsOpZS4iCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDozNDYKK21zZ2lkICJSZXZpc2lvbiBleHByZXNzaW9uIGlzIGVtcHR5LiIKK21zZ3N0ciAiTCdleHByZXNzaW9uIGRlIHLDqXZpc2lvbiBlc3QgdmlkZS4iCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDo1MzEKK21zZ2lkICJVcGRhdGVkIgorbXNnc3RyICJNaXNhIMOgIGpvdXIiCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDo1NTkKK21zZ2lkICJVUkwiCittc2dzdHIgIlVSTCIKKworIzogbGliL2NvbW1pdC50Y2w6OQorbXNnaWQgIiIKKyJUaGVyZSBpcyBub3RoaW5nIHRvIGFtZW5kLlxuIgorIlxuIgorIllvdSBhcmUgYWJvdXQgdG8gY3JlYXRlIHRoZSBpbml0aWFsIGNvbW1pdC4gIFRoZXJlIGlzIG5vIGNvbW1pdCBiZWZvcmUgdGhpcyAiCisidG8gYW1lbmQuXG4iCittc2dzdHIgIiIKKyJJbCBuJ3kgYSByaWVuIMOgIGNvcnJpZ2VyLlxuIgorIlxuIgorIlZvdXMgYWxsZXogY3LDqWVyIGxlIGNvbW1pdCBpbml0aWFsLiBJbCBuJ3kgYSBwYXMgZGUgY29tbWl0IGF2YW50IGNlbHVpLWNpIMOgICIKKyJjb3JyaWdlci5cbiIKKworIzogbGliL2NvbW1pdC50Y2w6MTgKK21zZ2lkICIiCisiQ2Fubm90IGFtZW5kIHdoaWxlIG1lcmdpbmcuXG4iCisiXG4iCisiWW91IGFyZSBjdXJyZW50bHkgaW4gdGhlIG1pZGRsZSBvZiBhIG1lcmdlIHRoYXQgaGFzIG5vdCBiZWVuIGZ1bGx5ICIKKyJjb21wbGV0ZWQuICBZb3UgY2Fubm90IGFtZW5kIHRoZSBwcmlvciBjb21taXQgdW5sZXNzIHlvdSBmaXJzdCBhYm9ydCB0aGUgIgorImN1cnJlbnQgbWVyZ2UgYWN0aXZpdHkuXG4iCittc2dzdHIgIiIKKyJJbXBvc3NpYmxlIGRlIGNvcnJpZ2VyIHBlbmRhbnQgdW5lIGZ1c2lvbi5cbiIKKyJcbiIKKyJWb3VzIMOqdGVzIGFjdHVlbGxlbWVudCBhdSBtaWxpZXUgZCd1bmUgZnVzaW9uIHF1aSBuJ2EgcGFzIMOpdMOpIGNvbXBsZXRlbWVudCAiCisidGVybWluw6llLiBWb3VzIG5lIHBvdXZleiBwYXMgY29ycmlnZXIgbGUgY29tbWl0IHByw6ljw6lkYW50IHNhdWYgc2kgdm91cyAiCisiYWJhbmRvbm5leiBsYSBmdXNpb24gY291cmFudGUuXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjQ5Cittc2dpZCAiRXJyb3IgbG9hZGluZyBjb21taXQgZGF0YSBmb3IgYW1lbmQ6IgorbXNnc3RyICJFcnJldXIgbG9ycyBkdSBjaGFyZ2VtZW50IGRlcyBkb25uw6llcyBkZSBjb21taXQgcG91ciBjb3JyZWN0aW9uIDoiCisKKyM6IGxpYi9jb21taXQudGNsOjc2Cittc2dpZCAiVW5hYmxlIHRvIG9idGFpbiB5b3VyIGlkZW50aXR5OiIKK21zZ3N0ciAiSW1wb3NzaWJsZSBkJ29idGVuaXIgdm90cmUgaWRlbnRpdMOpIDoiCisKKyM6IGxpYi9jb21taXQudGNsOjgxCittc2dpZCAiSW52YWxpZCBHSVRfQ09NTUlUVEVSX0lERU5UOiIKK21zZ3N0ciAiR0lUX0NPTU1JVFRFUl9JREVOVCBpbnZhbGlkZSA6IgorCisjOiBsaWIvY29tbWl0LnRjbDoxMzMKK21zZ2lkICIiCisiTGFzdCBzY2FubmVkIHN0YXRlIGRvZXMgbm90IG1hdGNoIHJlcG9zaXRvcnkgc3RhdGUuXG4iCisiXG4iCisiQW5vdGhlciBHaXQgcHJvZ3JhbSBoYXMgbW9kaWZpZWQgdGhpcyByZXBvc2l0b3J5IHNpbmNlIHRoZSBsYXN0IHNjYW4uICBBICIKKyJyZXNjYW4gbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIGFub3RoZXIgY29tbWl0IGNhbiBiZSBjcmVhdGVkLlxuIgorIlxuIgorIlRoZSByZXNjYW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgbm93LlxuIgorbXNnc3RyICIiCisiTCfDqXRhdCBsb3JzIGRlIGxhIGRlcm5pw6hyZSBzeW5jaHJvbmlzYXRpb24gbmUgY29ycmVzcG9uZCBwbHVzIMOgIGwnw6l0YXQgZHUgIgorInLDqWbDqXJlbnRpZWwuXG4iCisiXG4iCisiVW4gYXV0cmUgcHJvZ3JhbW1lIEdpdCBhIG1vZGlmacOpIGNlIHLDqWbDqXJlbnRpZWwgZGVwdWlzIGxhIGRlcm5pw6hyZSAiCisic3luY2hyb25pc2F0aW9uLiBVbmUgcmVzeW5zaHJvbmlzYXRpb24gZG9pdCDDqnRyZSBlZmZlY3R1w6llIGF2YW50IGRlIHBvdXZvaXIgIgorImNyw6llciB1biBub3V2ZWF1IGNvbW1pdC5cbiIKKyJcbiIKKyJDZWxhIHZhIMOqdHJlIGZhaXQgdG91dCBkZSBzdWl0ZSBhdXRvbWF0aXF1ZW1lbnQuXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjE1NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJVbm1lcmdlZCBmaWxlcyBjYW5ub3QgYmUgY29tbWl0dGVkLlxuIgorIlxuIgorIkZpbGUgJXMgaGFzIG1lcmdlIGNvbmZsaWN0cy4gIFlvdSBtdXN0IHJlc29sdmUgdGhlbSBhbmQgc3RhZ2UgdGhlIGZpbGUgIgorImJlZm9yZSBjb21taXR0aW5nLlxuIgorbXNnc3RyICIiCisiRGVzIGZpY2hpZXJzIG5vbiBmdXNpb25uw6lzIG5lIHBldXZlbnQgw6p0cmUgY29tbWl0w6lzLlxuIgorIlxuIgorIkxlIGZpY2hpZXIgJXMgYSBkZXMgY29uZmxpY3RzIGRlIGZ1c2lvbi4gVm91cyBkZXZleiBsZXMgcsOpc291ZHJlIGV0IHByw6ktIgorImNvbW1pdGVyIGxlIGZpY2hpZXIgYXZhbnQgZGUgcG91dm9pciBjb21taXRlci5cbiIKKworIzogbGliL2NvbW1pdC50Y2w6MTYyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIlVua25vd24gZmlsZSBzdGF0ZSAlcyBkZXRlY3RlZC5cbiIKKyJcbiIKKyJGaWxlICVzIGNhbm5vdCBiZSBjb21taXR0ZWQgYnkgdGhpcyBwcm9ncmFtLlxuIgorbXNnc3RyICIiCisiVW4gw6l0YXQgZGUgZmljaGllciBpbmNvbm51ICVzIGEgw6l0w6kgZMOpdGVjdMOpLlxuIgorIlxuIgorIkxlIGZpY2hpZXIgJXMgbmUgcGV1dCBwYXMgw6p0cmUgY29tbWl0w6kgcGFyIGNlIHByb2dyYW1tZS5cbiIKKworIzogbGliL2NvbW1pdC50Y2w6MTcwCittc2dpZCAiIgorIk5vIGNoYW5nZXMgdG8gY29tbWl0LlxuIgorIlxuIgorIllvdSBtdXN0IHN0YWdlIGF0IGxlYXN0IDEgZmlsZSBiZWZvcmUgeW91IGNhbiBjb21taXQuXG4iCittc2dzdHIgIiIKKyJQYXMgZGUgbW9kaWZpY2F0aW9uIMOgIGNvbW1pdGVyLlxuIgorIlxuIgorIlZvdXMgZGV2ZXogcHLDqS1jb21taXRlciBhdSBtb2lucyAxIGZpY2hpZXIgYXZhbnQgZGUgcG91dm9pciBjb21taXRlci5cbiIKKworIzogbGliL2NvbW1pdC50Y2w6MTgzCittc2dpZCAiIgorIlBsZWFzZSBzdXBwbHkgYSBjb21taXQgbWVzc2FnZS5cbiIKKyJcbiIKKyJBIGdvb2QgY29tbWl0IG1lc3NhZ2UgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuIgorIlxuIgorIi0gRmlyc3QgbGluZTogRGVzY3JpYmUgaW4gb25lIHNlbnRlbmNlIHdoYXQgeW91IGRpZC5cbiIKKyItIFNlY29uZCBsaW5lOiBCbGFua1xuIgorIi0gUmVtYWluaW5nIGxpbmVzOiBEZXNjcmliZSB3aHkgdGhpcyBjaGFuZ2UgaXMgZ29vZC5cbiIKK21zZ3N0ciAiIgorIk1lcmNpIGRlIGZvdXJuaXIgdW4gbWVzc2FnZSBkZSBjb21taXQuXG4iCisiXG4iCisiVW4gYm9uIG1lc3NhZ2UgZGUgY29tbWl0IGEgbGUgZm9ybWF0IHN1aXZhbnQgOlxuIgorIlxuIgorIi0gUHJlbWnDqHJlIGxpZ25lIDogZMOpY3JpcmUgZW4gdW5lIHBocmFzZSBjZSBxdWUgdm91cyBhdmV6IGZhaXQuXG4iCisiLSBEZXV4acOobWUgbGlnbmUgOiByaWVuLlxuIgorIi0gTGlnbmVzIHN1aXZhbnRlcyA6IETDqWNyaXJlIHBvdXJxdW9pIGNlcyBtb2RpZmljYXRpb25zIHNvbnQgYm9ubmVzLlxuIgorCisjOiBsaWIvY29tbWl0LnRjbDoyMDcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJ3YXJuaW5nOiBUY2wgZG9lcyBub3Qgc3VwcG9ydCBlbmNvZGluZyAnJXMnLiIKK21zZ3N0ciAiYXR0ZW50aW9uIDogVGNsIG5lIHN1cHBvcnRlIHBhcyBsJ2VuY29kYWdlICclcycuIgorCisjOiBsaWIvY29tbWl0LnRjbDoyMjEKK21zZ2lkICJDYWxsaW5nIHByZS1jb21taXQgaG9vay4uLiIKK21zZ3N0ciAiQXBwZWwgZHUgcHJvZ3JhbW1lIGV4dGVybmUgZCdhdmFudCBjb21taXQuLi4iCisKKyM6IGxpYi9jb21taXQudGNsOjIzNgorbXNnaWQgIkNvbW1pdCBkZWNsaW5lZCBieSBwcmUtY29tbWl0IGhvb2suIgorbXNnc3RyICJDb21taXQgcmVmdXPDqSBwYXIgbGUgcHJvZ3JhbW1lIGV4dGVybmUgZCdhdmFudCBjb21taXQuIgorCisjOiBsaWIvY29tbWl0LnRjbDoyNTkKK21zZ2lkICJDYWxsaW5nIGNvbW1pdC1tc2cgaG9vay4uLiIKK21zZ3N0ciAiQXBwZWwgZHUgcHJvZ3JhbW1lIGV4dGVybmUgZGUgbWVzc2FnZSBkZSBjb21taXQuLi4iCisKKyM6IGxpYi9jb21taXQudGNsOjI3NAorbXNnaWQgIkNvbW1pdCBkZWNsaW5lZCBieSBjb21taXQtbXNnIGhvb2suIgorbXNnc3RyICJDb21taXQgcmVmdXPDqSBwYXIgbGUgcHJvZ3JhbW1lIGV4dGVybmUgZGUgbWVzc2FnZSBkZSBjb21taXQuIgorCisjOiBsaWIvY29tbWl0LnRjbDoyODcKK21zZ2lkICJDb21taXR0aW5nIGNoYW5nZXMuLi4iCittc2dzdHIgIkNvbW1pdCBkZXMgbW9kaWZpY2F0aW9ucy4uLiIKKworIzogbGliL2NvbW1pdC50Y2w6MzAzCittc2dpZCAid3JpdGUtdHJlZSBmYWlsZWQ6IgorbXNnc3RyICJ3cml0ZS10cmVlIGEgw6ljaG91w6kgOiIKKworIzogbGliL2NvbW1pdC50Y2w6MzA0IGxpYi9jb21taXQudGNsOjM0OCBsaWIvY29tbWl0LnRjbDozNjgKK21zZ2lkICJDb21taXQgZmFpbGVkLiIKK21zZ3N0ciAiTGUgY29tbWl0IGEgw6ljaG91w6kuIgorCisjOiBsaWIvY29tbWl0LnRjbDozMjEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJDb21taXQgJXMgYXBwZWFycyB0byBiZSBjb3JydXB0IgorbXNnc3RyICJMZSBjb21taXQgJXMgc2VtYmxlIMOqdHJlIGNvcnJvbXB1IgorCisjOiBsaWIvY29tbWl0LnRjbDozMjYKK21zZ2lkICIiCisiTm8gY2hhbmdlcyB0byBjb21taXQuXG4iCisiXG4iCisiTm8gZmlsZXMgd2VyZSBtb2RpZmllZCBieSB0aGlzIGNvbW1pdCBhbmQgaXQgd2FzIG5vdCBhIG1lcmdlIGNvbW1pdC5cbiIKKyJcbiIKKyJBIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBub3cuXG4iCittc2dzdHIgIiIKKyJQYXMgZGUgbW9kaWZpY2F0aW9uIMOgIGNvbW1pdGVyLlxuIgorIlxuIgorIkF1Y3VuIGZpY2hpZXIgbidhIMOpdMOpIG1vZGlmacOpIHBhciBjZSBjb21taXQgZXQgaWwgbmUgcydhZ2l0IHBhcyBkJ3VuIGNvbW1pdCAiCisiZGUgZnVzaW9uLlxuIgorIlxuIgorIlVuZSByZXN5bmNocm9uaXNhdGlvbiB2YSDDqnRyZSBsYW5jw6llIHRvdXQgZGUgc3VpdGUgYXV0b21hdGlxdWVtZW50LlxuIgorCisjOiBsaWIvY29tbWl0LnRjbDozMzMKK21zZ2lkICJObyBjaGFuZ2VzIHRvIGNvbW1pdC4iCittc2dzdHIgIlBhcyBkZSBtb2RpZmljYXRpb25zIMOgIGNvbW1pdGVyLiIKKworIzogbGliL2NvbW1pdC50Y2w6MzQ3Cittc2dpZCAiY29tbWl0LXRyZWUgZmFpbGVkOiIKK21zZ3N0ciAiY29tbWl0LXRyZWUgYSDDqWNob3XDqSA6IgorCisjOiBsaWIvY29tbWl0LnRjbDozNjcKK21zZ2lkICJ1cGRhdGUtcmVmIGZhaWxlZDoiCittc2dzdHIgInVwZGF0ZS1yZWYgYSDDqWNob3XDqSIKKworIzogbGliL2NvbW1pdC50Y2w6NDU0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQ3JlYXRlZCBjb21taXQgJXM6ICVzIgorbXNnc3RyICJDb21taXQgY3LDqcOpICVzIDogJXMiCisKKyM6IGxpYi9jb25zb2xlLnRjbDo1OQorbXNnaWQgIldvcmtpbmcuLi4gcGxlYXNlIHdhaXQuLi4iCittc2dzdHIgIlRyYXZhaWwgZW4gY291cnMuLi4gbWVyY2kgZGUgcGF0aWVudGVyLi4uIgorCisjOiBsaWIvY29uc29sZS50Y2w6MTg2Cittc2dpZCAiU3VjY2VzcyIKK21zZ3N0ciAiU3VjY8OocyIKKworIzogbGliL2NvbnNvbGUudGNsOjIwMAorbXNnaWQgIkVycm9yOiBDb21tYW5kIEZhaWxlZCIKK21zZ3N0ciAiRXJyZXVyIDogw6ljaGVjIGRlIGxhIGNvbW1hbmRlIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQzCittc2dpZCAiTnVtYmVyIG9mIGxvb3NlIG9iamVjdHMiCittc2dzdHIgIk5vbWJyZSBkJ29iamV0cyBlbiBmaWNoaWVyIHBhcnRpY3VsaWVyIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQ0Cittc2dpZCAiRGlzayBzcGFjZSB1c2VkIGJ5IGxvb3NlIG9iamVjdHMiCittc2dzdHIgIkVzcGFjZSBkaXNxdWUgdXRpbGlzw6kgcGFyIGxlcyBmaWNoaWVycyBwYXJ0aWN1bGllcnMiCisKKyM6IGxpYi9kYXRhYmFzZS50Y2w6NDUKK21zZ2lkICJOdW1iZXIgb2YgcGFja2VkIG9iamVjdHMiCittc2dzdHIgIk5vbWJyZSBkJ29iamV0cyBlbXBhcXVldMOpcyIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0NgorbXNnaWQgIk51bWJlciBvZiBwYWNrcyIKK21zZ3N0ciAiTm9tYnJlIGRlIHBhcXVldHMgZCdvYmpldHMiCisKKyM6IGxpYi9kYXRhYmFzZS50Y2w6NDcKK21zZ2lkICJEaXNrIHNwYWNlIHVzZWQgYnkgcGFja2VkIG9iamVjdHMiCittc2dzdHIgIkVzcGFjZSBkaXNxdWUgdXRpbGlzw6kgcGFyIGxlcyBvYmpldHMgZW1wYXF1ZXTDqXMiCisKKyM6IGxpYi9kYXRhYmFzZS50Y2w6NDgKK21zZ2lkICJQYWNrZWQgb2JqZWN0cyB3YWl0aW5nIGZvciBwcnVuaW5nIgorbXNnc3RyICJPYmpldHMgZW1wYXF1ZXTDqXMgYXR0ZW5kYW50IGQnw6p0cmUgc3VwcHJpbcOpcyIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0OQorbXNnaWQgIkdhcmJhZ2UgZmlsZXMiCittc2dzdHIgIkZpY2hpZXJzIHBvdWJlbGxlIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjcyCittc2dpZCAiQ29tcHJlc3NpbmcgdGhlIG9iamVjdCBkYXRhYmFzZSIKK21zZ3N0ciAiQ29tcHJlc3Npb24gZGUgbGEgYmFzZSBkZXMgb2JqZXRzIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjgzCittc2dpZCAiVmVyaWZ5aW5nIHRoZSBvYmplY3QgZGF0YWJhc2Ugd2l0aCBmc2NrLW9iamVjdHMiCittc2dzdHIgIlbDqXJpZmljYXRpb24gZGUgbGEgYmFzZSBkZXMgb2JqZXRzIGF2ZWMgZnNjay1vYmplY3RzIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjEwOAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJUaGlzIHJlcG9zaXRvcnkgY3VycmVudGx5IGhhcyBhcHByb3hpbWF0ZWx5ICVpIGxvb3NlIG9iamVjdHMuXG4iCisiXG4iCisiVG8gbWFpbnRhaW4gb3B0aW1hbCBwZXJmb3JtYW5jZSBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBjb21wcmVzcyAiCisidGhlIGRhdGFiYXNlIHdoZW4gbW9yZSB0aGFuICVpIGxvb3NlIG9iamVjdHMgZXhpc3QuXG4iCisiXG4iCisiQ29tcHJlc3MgdGhlIGRhdGFiYXNlIG5vdz8iCittc2dzdHIgIiIKKyJDZSByw6lmw6lyZW50aWVsIGNvbXByZW5kIGFjdHVlbGxlbWVudCBlbnZpcm9uICVpIG9iamV0cyBheWFudCBsZXVyIGZpY2hpZXIgIgorInBhcnRpY3VsaWVyLlxuIgorIlxuIgorIlBvdXIgY29uc2VydmVyIHVuZSBwZXJmb3JtYW5jZSBvcHRpbWFsZSwgaWwgZXN0IGZvcnRlbWVudCByZWNvbW1hbmTDqSBkZSAiCisiY29tcHJpbWVyIGxhIGJhc2UgcXVhbmQgcGx1cyBkZSAlaSBvYmpldHMgYXlhbnQgbGV1ciBmaWNoaWVyIHBhcnRpY3VsaWVyICIKKyJleGlzdGVudC5cbiIKKyJcbiIKKyJDb21wcmltZXIgbGEgYmFzZSBtYWludGVuYW50ID8iCisKKyM6IGxpYi9kYXRlLnRjbDoyNQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkludmFsaWQgZGF0ZSBmcm9tIEdpdDogJXMiCittc2dzdHIgIkRhdGUgaW52YWxpZGUgZGUgR2l0IDogJXMiCisKKyM6IGxpYi9kaWZmLnRjbDo0MgorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJObyBkaWZmZXJlbmNlcyBkZXRlY3RlZC5cbiIKKyJcbiIKKyIlcyBoYXMgbm8gY2hhbmdlcy5cbiIKKyJcbiIKKyJUaGUgbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhpcyBmaWxlIHdhcyB1cGRhdGVkIGJ5IGFub3RoZXIgYXBwbGljYXRpb24sIGJ1dCAiCisidGhlIGNvbnRlbnQgd2l0aGluIHRoZSBmaWxlIHdhcyBub3QgY2hhbmdlZC5cbiIKKyJcbiIKKyJBIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB0byBmaW5kIG90aGVyIGZpbGVzIHdoaWNoIG1heSBoYXZlICIKKyJ0aGUgc2FtZSBzdGF0ZS4iCittc2dzdHIgIiIKKyJBdWN1bmUgZGlmZsOpcmVuY2UgZMOpdGVjdMOpZS5cbiIKKyJcbiIKKyIlcyBuZSBjb21wb3J0ZSBhdWN1bmUgbW9kaWZpY2F0aW9uLlxuIgorIlxuIgorIkxhIGRhdGUgZGUgbW9kaWZpY2F0aW9uIGRlIGNlIGZpY2hpZXIgYSDDqXTDqSBtaXNlIMOgIGpvdXIgcGFyIHVuZSBhdXRyZSAiCisiYXBwbGljYXRpb24sIG1haXMgbGUgY29udGVudSBkdSBmaWNoaWVyIG4nYSBwYXMgY2hhbmfDqS5cbiIKKyJcbiIKKyJVbmUgcmVzeW5jaHJvbmlzYXRpb24gdmEgw6p0cmUgbGFuY8OpZSBhdXRvbWF0aXF1ZW1lbnQgcG91ciB0cm91dmVyIGQnYXV0cmVzICIKKyJmaWNoaWVycyBxdWkgcG91cnJhaWVudCBzZSB0cm91dmVyIGRhbnMgbGUgbcOqbWUgw6l0YXQuIgorCisjOiBsaWIvZGlmZi50Y2w6ODEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJMb2FkaW5nIGRpZmYgb2YgJXMuLi4iCittc2dzdHIgIkNoYXJnZW1lbnQgZGVzIGRpZmbDqXJlbmNlcyBkZSAlcy4uLiIKKworIzogbGliL2RpZmYudGNsOjExNCBsaWIvZGlmZi50Y2w6MTg0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGRpc3BsYXkgJXMiCittc2dzdHIgIkltcG9zc2libGUgZCdhZmZpY2hlciAlcyIKKworIzogbGliL2RpZmYudGNsOjExNQorbXNnaWQgIkVycm9yIGxvYWRpbmcgZmlsZToiCittc2dzdHIgIkVycmV1ciBsb3JzIGR1IGNoYXJnZW1lbnQgZHUgZmljaGllciA6IgorCisjOiBsaWIvZGlmZi50Y2w6MTIyCittc2dpZCAiR2l0IFJlcG9zaXRvcnkgKHN1YnByb2plY3QpIgorbXNnc3RyICJSw6lmw6lyZW50aWVsIEdpdCAoc291cyBwcm9qZXQpIgorCisjOiBsaWIvZGlmZi50Y2w6MTM0Cittc2dpZCAiKiBCaW5hcnkgZmlsZSAobm90IHNob3dpbmcgY29udGVudCkuIgorbXNnc3RyICIqIEZpY2hpZXIgYmluYWlyZSAocGFzIGQnYXBwZXLDp3UgZHUgY29udGVudSkuIgorCisjOiBsaWIvZGlmZi50Y2w6MTg1Cittc2dpZCAiRXJyb3IgbG9hZGluZyBkaWZmOiIKK21zZ3N0ciAiRXJyZXVyIGxvcnMgZHUgY2hhcmdlbWVudCBkZXMgZGlmZsOpcmVuY2VzIDoiCisKKyM6IGxpYi9kaWZmLnRjbDozMDMKK21zZ2lkICJGYWlsZWQgdG8gdW5zdGFnZSBzZWxlY3RlZCBodW5rLiIKK21zZ3N0ciAiTGEgc3VwcHJlc3Npb24gZGFucyBsZSBwcsOpLWNvbW1pdCBkZSBsYSBzZWN0aW9uIHPDqWxlY3Rpb25uw6llIGEgw6ljaG91w6llLiIKKworIzogbGliL2RpZmYudGNsOjMxMAorbXNnaWQgIkZhaWxlZCB0byBzdGFnZSBzZWxlY3RlZCBodW5rLiIKK21zZ3N0ciAiTGUgcHLDqS1jb21taXQgZGUgbGEgc2VjdGlvbiBzw6lsZWN0aW9ubsOpZSBhIMOpY2hvdcOpLiIKKworIzogbGliL2Vycm9yLnRjbDoyMCBsaWIvZXJyb3IudGNsOjExNAorbXNnaWQgImVycm9yIgorbXNnc3RyICJlcnJldXIiCisKKyM6IGxpYi9lcnJvci50Y2w6MzYKK21zZ2lkICJ3YXJuaW5nIgorbXNnc3RyICJhdHRlbnRpb24iCisKKyM6IGxpYi9lcnJvci50Y2w6OTQKK21zZ2lkICJZb3UgbXVzdCBjb3JyZWN0IHRoZSBhYm92ZSBlcnJvcnMgYmVmb3JlIGNvbW1pdHRpbmcuIgorbXNnc3RyICJWb3VzIGRldmV6IGNvcnJpZ2VyIGxlcyBlcnJldXJzIHN1aXZhbnRlcyBhdmFudCBkZSBwb3V2b2lyIGNvbW1pdGVyLiIKKworIzogbGliL2luZGV4LnRjbDo2Cittc2dpZCAiVW5hYmxlIHRvIHVubG9jayB0aGUgaW5kZXguIgorbXNnc3RyICJJbXBvc3NpYmxlIGRlIGTDqXbDqXJvdWlsbGVyIGxlIHByw6ktY29tbWl0LiIKKworIzogbGliL2luZGV4LnRjbDoxNQorbXNnaWQgIkluZGV4IEVycm9yIgorbXNnc3RyICJFcnJldXIgZGUgcHLDqS1jb21taXQiCisKKyM6IGxpYi9pbmRleC50Y2w6MjEKK21zZ2lkICIiCisiVXBkYXRpbmcgdGhlIEdpdCBpbmRleCBmYWlsZWQuICBBIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB0byAiCisicmVzeW5jaHJvbml6ZSBnaXQtZ3VpLiIKK21zZ3N0ciAiTGUgcHLDqS1jb21taXQgYSDDqWNob3XDqS4gVW5lIHJlc3luY2hyb25pc2F0aW9uIHZhIMOqdHJlIGxhbmPDqWUgYXV0b21hdGlxdWVtZW50LiIKKworIzogbGliL2luZGV4LnRjbDoyNworbXNnaWQgIkNvbnRpbnVlIgorbXNnc3RyICJDb250aW51ZXIiCisKKyM6IGxpYi9pbmRleC50Y2w6MzEKK21zZ2lkICJVbmxvY2sgSW5kZXgiCittc2dzdHIgIkTDqXbDqXJvdWlsbGVyIGxlIHByw6ktY29tbWl0IgorCisjOiBsaWIvaW5kZXgudGNsOjI4MgorIywgdGNsLWZvcm1hdAorbXNnaWQgIlVuc3RhZ2luZyAlcyBmcm9tIGNvbW1pdCIKK21zZ3N0ciAiU3VwcHJpbWVyICVzIGR1IGNvbW1pdCIKKworIzogbGliL2luZGV4LnRjbDozMTMKK21zZ2lkICJSZWFkeSB0byBjb21taXQuIgorbXNnc3RyICJQcsOqdCDDoCDDqnRyZSBjb21taXTDqS4iCisKKyM6IGxpYi9pbmRleC50Y2w6MzI2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQWRkaW5nICVzIgorbXNnc3RyICJBam91dGVyICVzIgorCisjOiBsaWIvaW5kZXgudGNsOjM4MQorIywgdGNsLWZvcm1hdAorbXNnaWQgIlJldmVydCBjaGFuZ2VzIGluIGZpbGUgJXM/IgorbXNnc3RyICJJbnZlcnNlciBsZXMgbW9kaWZpY2F0aW9ucyBkYW5zIGxlIGZpY2hpZXIgJXMgPyAiCisKKyM6IGxpYi9pbmRleC50Y2w6MzgzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUmV2ZXJ0IGNoYW5nZXMgaW4gdGhlc2UgJWkgZmlsZXM/IgorbXNnc3RyICJJbnZlcnNlciBsZXMgbW9kaWZpY2F0aW9ucyBkYW5zIGNlcyAlaSBmaWNoaWVycyA/IgorCisjOiBsaWIvaW5kZXgudGNsOjM5MQorbXNnaWQgIkFueSB1bnN0YWdlZCBjaGFuZ2VzIHdpbGwgYmUgcGVybWFuZW50bHkgbG9zdCBieSB0aGUgcmV2ZXJ0LiIKK21zZ3N0ciAiIgorIlRvdXRlcyBsZXMgbW9kaWZpY2F0aW9ucyBub24gcHLDqS1jb21taXTDqWVzIHNlcm9udCBkw6lmaW5pdGl2ZW1lbnQgcGVyZHVlcyAiCisibG9ycyBkZSBsJ2ludmVyc2lvbi4iCisKKyM6IGxpYi9pbmRleC50Y2w6Mzk0Cittc2dpZCAiRG8gTm90aGluZyIKK21zZ3N0ciAiTmUgcmllbiBmYWlyZSIKKworIzogbGliL21lcmdlLnRjbDoxMworbXNnaWQgIiIKKyJDYW5ub3QgbWVyZ2Ugd2hpbGUgYW1lbmRpbmcuXG4iCisiXG4iCisiWW91IG11c3QgZmluaXNoIGFtZW5kaW5nIHRoaXMgY29tbWl0IGJlZm9yZSBzdGFydGluZyBhbnkgdHlwZSBvZiBtZXJnZS5cbiIKK21zZ3N0ciAiIgorIkltcG9zc2libGUgZGUgZnVjaW9ubmVyIHBlbmRhbnQgdW5lIGNvcnJlY3Rpb24uXG4iCisiXG4iCisiVm91cyBkZXZleiBmaW5pciBkZSBjb3JyaWdlciBjZSBjb21taXQgYXZhbnQgZGUgbGFuY2VyIHVuZSBxdWVsY29ucXVlICIKKyJmdXNpb24uXG4iCisKKyM6IGxpYi9tZXJnZS50Y2w6MjcKK21zZ2lkICIiCisiTGFzdCBzY2FubmVkIHN0YXRlIGRvZXMgbm90IG1hdGNoIHJlcG9zaXRvcnkgc3RhdGUuXG4iCisiXG4iCisiQW5vdGhlciBHaXQgcHJvZ3JhbSBoYXMgbW9kaWZpZWQgdGhpcyByZXBvc2l0b3J5IHNpbmNlIHRoZSBsYXN0IHNjYW4uICBBICIKKyJyZXNjYW4gbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIGEgbWVyZ2UgY2FuIGJlIHBlcmZvcm1lZC5cbiIKKyJcbiIKKyJUaGUgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIG5vdy5cbiIKK21zZ3N0ciAiIgorIkwnw6l0YXQgbG9ycyBkZSBsYSBkZXJuacOocmUgc3luY2hyb25pc2F0aW9uIG5lIGNvcnJlc3BvbmQgcGx1cyDDoCBsJ8OpdGF0IGR1ICIKKyJyw6lmw6lyZW50aWVsLlxuIgorIlxuIgorIlVuIGF1dHJlIHByb2dyYW1tZSBHaXQgYSBtb2RpZmnDqSBjZSByw6lmw6lyZW50aWVsIGRlcHVpcyBsYSBkZXJuacOocmUgIgorInN5bmNocm9uaXNhdGlvbi4gVW5lIHJlc3luY2hyb25pc2F0aW9uIGRvaXQgw6p0cmUgZWZmZWN0dcOpZSBhdmFudCBkZSBwb3V2b2lyICIKKyJmdXNpb25uZXIgZGUgbm91dmVhdS5cbiIKKyJcbiIKKyJDZWxhIHZhIMOqdHJlIGZhaXQgdG91dCBkZSBzdWl0ZSBhdXRvbWF0aXF1ZW1lbnRcbiIKKworIzogbGliL21lcmdlLnRjbDo0NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJZb3UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBjb25mbGljdGVkIG1lcmdlLlxuIgorIlxuIgorIkZpbGUgJXMgaGFzIG1lcmdlIGNvbmZsaWN0cy5cbiIKKyJcbiIKKyJZb3UgbXVzdCByZXNvbHZlIHRoZW0sIHN0YWdlIHRoZSBmaWxlLCBhbmQgY29tbWl0IHRvIGNvbXBsZXRlIHRoZSBjdXJyZW50ICIKKyJtZXJnZS4gIE9ubHkgdGhlbiBjYW4geW91IGJlZ2luIGFub3RoZXIgbWVyZ2UuXG4iCittc2dzdHIgIiIKKyJWb3VzIMOqdGVzIGF1IG1pbGlldSBkJ3VuZSBmdXNpb24gY29uZmxpY3R1ZWxsZS5cbiIKKyJcbiIKKyJMZSBmaWNoaWVyICVzIGEgZGVzIGNvbmZsaWN0cyBkZSBmdXNpb24uXG4iCisiXG4iCisiVm91cyBkZXZleiBsZXMgcsOpc291ZHJlLCBwdWlzIHByw6ktY29tbWl0ZXIgbGUgZmljaGllciwgZXQgZW5maW4gY29tbWl0ZXIgIgorInBvdXIgdGVybWluZXIgbGEgZnVzaW9uIGNvdXJhbnRlLiBTZXVsZW1lbnTDoCBjZSBtb21lbnQgbMOgLCBpbCBzZXJhIHBvc3NpYmxlICIKKyJkJ2VmZmVjdHVlciB1bmUgbm91dmVsbGUgZnVzaW9uLlxuIgorCisjOiBsaWIvbWVyZ2UudGNsOjU0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIllvdSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIGNoYW5nZS5cbiIKKyJcbiIKKyJGaWxlICVzIGlzIG1vZGlmaWVkLlxuIgorIlxuIgorIllvdSBzaG91bGQgY29tcGxldGUgdGhlIGN1cnJlbnQgY29tbWl0IGJlZm9yZSBzdGFydGluZyBhIG1lcmdlLiAgRG9pbmcgc28gIgorIndpbGwgaGVscCB5b3UgYWJvcnQgYSBmYWlsZWQgbWVyZ2UsIHNob3VsZCB0aGUgbmVlZCBhcmlzZS5cbiIKK21zZ3N0ciAiIgorIlZvdXMgw6p0ZXMgYXUgbWlsaWV1IGQndW5lIG1vZGlmaWNhdGlvbi5cbiIKKyJcbiIKKyJMZSBmaWNoaWVyICVzIGVzdCBtb2RpZmnDqS5cbiIKKyJcbiIKKyJWb3VzIGRldnJpZXogdGVybWluZXIgbGUgY29tbWl0IGNvdXJhbnQgYXZhbnQgZGUgbGFuY2VyIHVuZSBmdXNpb24uIEVuICIKKyJmYWlzYWl0IGNvbW1lIGNlbGEsIHZvdXMgw6l2aXRlcmV6IGRlIGRldm9pciDDqXZlbnR1ZWxsZW1lbnQgYWJhbmRvbm5lciB1bmUgIgorImZ1c2lvbiBheWFudCDDqWNob3XDqWUuXG4iCisKKyM6IGxpYi9tZXJnZS50Y2w6MTA2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiJXMgb2YgJXMiCittc2dzdHIgIiVzIGRlICVzIgorCisjOiBsaWIvbWVyZ2UudGNsOjExOQorIywgdGNsLWZvcm1hdAorbXNnaWQgIk1lcmdpbmcgJXMgYW5kICVzLi4uIgorbXNnc3RyICJGdXNpb24gZGUgJXMgZXQgJXMuLi4iCisKKyM6IGxpYi9tZXJnZS50Y2w6MTMwCittc2dpZCAiTWVyZ2UgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4iCittc2dzdHIgIkxhIGZ1c2lvbiBzJ2VzdCBmYWl0ZSBhdmVjIHN1Y2PDqHMuIgorCisjOiBsaWIvbWVyZ2UudGNsOjEzMgorbXNnaWQgIk1lcmdlIGZhaWxlZC4gIENvbmZsaWN0IHJlc29sdXRpb24gaXMgcmVxdWlyZWQuIgorbXNnc3RyICJMYSBmdXNpb24gYSBlY2hvdcOpZS4gSWwgZXN0IG7DqWNlc3NhaXJlIGRlIHLDqXNvdWRyZSBsZXMgY29uZmxpY3RzLiIKKworIzogbGliL21lcmdlLnRjbDoxNTcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJNZXJnZSBJbnRvICVzIgorbXNnc3RyICJGdXNpb24gZGFucyAlcyIKKworIzogbGliL21lcmdlLnRjbDoxNzYKK21zZ2lkICJSZXZpc2lvbiBUbyBNZXJnZSIKK21zZ3N0ciAiUsOpdmlzaW9uIMOgIGZ1c2lvbm5lciIKKworIzogbGliL21lcmdlLnRjbDoyMTEKK21zZ2lkICIiCisiQ2Fubm90IGFib3J0IHdoaWxlIGFtZW5kaW5nLlxuIgorIlxuIgorIllvdSBtdXN0IGZpbmlzaCBhbWVuZGluZyB0aGlzIGNvbW1pdC5cbiIKK21zZ3N0ciAiIgorIkltcG9zc2libGUgZCdhYmFuZG9ubmVyIGVuIGNvdXJzIGRlIGNvcnJlY3Rpb24uXG4iCisiXG4iCisiVm91cyBkZXZleiBmaW5pciBkZSBjb3JyaWdlciBjZSBjb21taXQuXG4iCisKKyM6IGxpYi9tZXJnZS50Y2w6MjIxCittc2dpZCAiIgorIkFib3J0IG1lcmdlP1xuIgorIlxuIgorIkFib3J0aW5nIHRoZSBjdXJyZW50IG1lcmdlIHdpbGwgY2F1c2UgKkFMTCogdW5jb21taXR0ZWQgY2hhbmdlcyB0byBiZSBsb3N0LlxuIgorIlxuIgorIkNvbnRpbnVlIHdpdGggYWJvcnRpbmcgdGhlIGN1cnJlbnQgbWVyZ2U/IgorbXNnc3RyICIiCisiQWJhbmRvbm5lciBsYSBmdXNpb24gP1xuIgorIlxuIgorIkFiYW5kb25uZXIgbGEgZnVzaW9uIGNvdXJhbnRlIGVudHJhaW5lcmEgbGEgcGVydGUgZGUgVE9VVEVTIGxlcyAiCisibW9kaWZpY2F0aW9ucyBub24gY29tbWl0w6llcy5cbiIKKyJcbiIKKyJBYmFuZG9ubmVyIHF1YW5kIG3Dqm1lIGxhIGZ1c2lvbiBjb3VyYW50ZSA/IgorCisjOiBsaWIvbWVyZ2UudGNsOjIyNworbXNnaWQgIiIKKyJSZXNldCBjaGFuZ2VzP1xuIgorIlxuIgorIlJlc2V0dGluZyB0aGUgY2hhbmdlcyB3aWxsIGNhdXNlICpBTEwqIHVuY29tbWl0dGVkIGNoYW5nZXMgdG8gYmUgbG9zdC5cbiIKKyJcbiIKKyJDb250aW51ZSB3aXRoIHJlc2V0dGluZyB0aGUgY3VycmVudCBjaGFuZ2VzPyIKK21zZ3N0ciAiIgorIlLDqWluaXRpYWxpc2VyIGxlcyBtb2RpZmljYXRpb25zID9cbiIKKyJcbiIKKyJSw6lpbml0aWFsaXNlciBsZXMgbW9kaWZpY2F0aW9ucyB2YSBmYWlyZSBwZXJkcmUgVE9VVEVTIGxlcyBtb2RpZmljYXRpb25zIG5vbiAiCisiY29tbWl0w6llcy5cbiIKKyJcbiIKKyJSw6lpbml0aWFsaXNlciBxdWFuZCBtw6ptZSBsZXMgbW9kaWZpY2F0aW9ucyBjb3VyYW50ZXMgPyIKKworIzogbGliL21lcmdlLnRjbDoyMzgKK21zZ2lkICJBYm9ydGluZyIKK21zZ3N0ciAiQWJhbmRvbiIKKworIzogbGliL21lcmdlLnRjbDoyMzgKK21zZ2lkICJmaWxlcyByZXNldCIKK21zZ3N0ciAiZmljaGllcnMgcsOpaW5pdGlhbGlzw6lzIgorCisjOiBsaWIvbWVyZ2UudGNsOjI2NQorbXNnaWQgIkFib3J0IGZhaWxlZC4iCittc2dzdHIgIkwnYWJhbmRvbiBhIMOpY2hvdcOpLiIKKworIzogbGliL21lcmdlLnRjbDoyNjcKK21zZ2lkICJBYm9ydCBjb21wbGV0ZWQuICBSZWFkeS4iCittc2dzdHIgIkFiYW5kb24gdGVtaW7DqS4gUHLDqnQuIgorCisjOiBsaWIvb3B0aW9uLnRjbDo5NQorbXNnaWQgIlJlc3RvcmUgRGVmYXVsdHMiCittc2dzdHIgIlJlbWV0dHJlIGxlcyB2YWxldXJzIHBhciBkw6lmYXV0IgorCisjOiBsaWIvb3B0aW9uLnRjbDo5OQorbXNnaWQgIlNhdmUiCittc2dzdHIgIlNhdXZlZ2FyZGVyIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMDkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIlcyBSZXBvc2l0b3J5IgorbXNnc3RyICJSw6lmw6lyZW50aWVsIGRlICVzIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMTAKK21zZ2lkICJHbG9iYWwgKEFsbCBSZXBvc2l0b3JpZXMpIgorbXNnc3RyICJHbG9iYWxlcyAodG91cyBsZXMgcsOpZsOpcmVudGllbHMpIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMTYKK21zZ2lkICJVc2VyIE5hbWUiCittc2dzdHIgIk5vbSBkJ3V0aWxpc2F0ZXVyIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMTcKK21zZ2lkICJFbWFpbCBBZGRyZXNzIgorbXNnc3RyICJBZHJlc3NlIGVtYWlsIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMTkKK21zZ2lkICJTdW1tYXJpemUgTWVyZ2UgQ29tbWl0cyIKK21zZ3N0ciAiUsOpc3VtZXIgbGVzIGNvbW1pdHMgZGUgZnVzaW9uIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMjAKK21zZ2lkICJNZXJnZSBWZXJib3NpdHkiCittc2dzdHIgIkZ1c2lvbiBiYXZhcmRlIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMjEKK21zZ2lkICJTaG93IERpZmZzdGF0IEFmdGVyIE1lcmdlIgorbXNnc3RyICJNb250cmVyIHN0YXRpc3RpcXVlcyBkZSBkaWZmIGFwcsOocyBmdXNpb24iCisKKyM6IGxpYi9vcHRpb24udGNsOjEyMworbXNnaWQgIlRydXN0IEZpbGUgTW9kaWZpY2F0aW9uIFRpbWVzdGFtcHMiCittc2dzdHIgIkZhaXJlIGNvbmZpYW5jZSBhdXggZGF0ZXMgZGUgbW9kaWZpY2F0aW9uIGRlIGZpY2hpZXJzICIKKworIzogbGliL29wdGlvbi50Y2w6MTI0Cittc2dpZCAiUHJ1bmUgVHJhY2tpbmcgQnJhbmNoZXMgRHVyaW5nIEZldGNoIgorbXNnc3RyICJOZXR0b3llciBsZXMgYnJhbmNoZXMgZGUgc3VpdmkgcGVuZGFudCBsYSByw6ljdXDDqXJhdGlvbiIKKworIzogbGliL29wdGlvbi50Y2w6MTI1Cittc2dpZCAiTWF0Y2ggVHJhY2tpbmcgQnJhbmNoZXMiCittc2dzdHIgIkZhaXJlIGNvcnJlc3BvbmRyZSBsZXMgYnJhbmNoZXMgZGUgc3VpdmkiCisKKyM6IGxpYi9vcHRpb24udGNsOjEyNgorbXNnaWQgIk51bWJlciBvZiBEaWZmIENvbnRleHQgTGluZXMiCittc2dzdHIgIk5vbWJyZSBkZSBsaWduZXMgZGUgY29udGV4dGUgZGFucyBsZXMgZGlmZnMiCisKKyM6IGxpYi9vcHRpb24udGNsOjEyNworbXNnaWQgIkNvbW1pdCBNZXNzYWdlIFRleHQgV2lkdGgiCittc2dzdHIgIkxhcmdldXIgZHUgdGV4dGUgZGUgbWVzc2FnZSBkZSBjb21taXQiCisKKyM6IGxpYi9vcHRpb24udGNsOjEyOAorbXNnaWQgIk5ldyBCcmFuY2ggTmFtZSBUZW1wbGF0ZSIKK21zZ3N0ciAiTm91dmVhdSBtb2TDqGxlIGRlIG5vbSBkZSBicmFuY2hlIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxOTIKK21zZ2lkICJTcGVsbGluZyBEaWN0aW9uYXJ5OiIKK21zZ3N0ciAiRGljdGlvbm5haXJlIGQnb3J0aG9ncmFwaGUgOiIKKworIzogbGliL29wdGlvbi50Y2w6MjE2Cittc2dpZCAiQ2hhbmdlIEZvbnQiCittc2dzdHIgIk1vZGlmaWVyIGxlcyBmb250ZXMiCisKKyM6IGxpYi9vcHRpb24udGNsOjIyMAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkNob29zZSAlcyIKK21zZ3N0ciAiQ2hvaXNpciAlcyIKKworIzogbGliL29wdGlvbi50Y2w6MjI2Cittc2dpZCAicHQuIgorbXNnc3RyICJwdC4iCisKKyM6IGxpYi9vcHRpb24udGNsOjI0MAorbXNnaWQgIlByZWZlcmVuY2VzIgorbXNnc3RyICJQcsOpZsOpcmVuY2VzIgorCisjOiBsaWIvb3B0aW9uLnRjbDoyNzUKK21zZ2lkICJGYWlsZWQgdG8gY29tcGxldGVseSBzYXZlIG9wdGlvbnM6IgorbXNnc3RyICJMYSBzYXV2ZWdhcmRlIGNvbXBsw6h0ZSBkZXMgb3B0aW9ucyBhIMOpY2hvdcOpZSA6IgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjI5IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MzQKK21zZ2lkICJEZWxldGUgUmVtb3RlIEJyYW5jaCIKK21zZ3N0ciAiU3VwcHJpbWVyIGJyYW5jaGUgZGlzdGFudGUiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6NDcKK21zZ2lkICJGcm9tIFJlcG9zaXRvcnkiCittc2dzdHIgIlLDqWbDqXJlbnRpZWwiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6NTAgbGliL3RyYW5zcG9ydC50Y2w6MTIzCittc2dpZCAiUmVtb3RlOiIKK21zZ3N0ciAiQnJhbmNoZSBkaXN0YW50ZSA6IgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjY2IGxpYi90cmFuc3BvcnQudGNsOjEzOAorbXNnaWQgIkFyYml0cmFyeSBVUkw6IgorbXNnc3RyICJVUkwgYXJiaXRyYWlyZSA6IgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjg0Cittc2dpZCAiQnJhbmNoZXMiCittc2dzdHIgIkJyYW5jaGVzIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjEwOQorbXNnaWQgIkRlbGV0ZSBPbmx5IElmIgorbXNnc3RyICJTdXBwcmltZXIgc2V1bGVtZW50IHNpIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjExMQorbXNnaWQgIk1lcmdlZCBJbnRvOiIKK21zZ3N0ciAiRnVzaW9ubsOpIGRhbnMgOiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoxMTkKK21zZ2lkICJBbHdheXMgKERvIG5vdCBwZXJmb3JtIG1lcmdlIGNoZWNrcykiCittc2dzdHIgIlRvdWpvdXJzIChuZSBwYXMgdsOpcmlmaWVyIGxlcyBmdXNpb25zKSIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoxNTIKK21zZ2lkICJBIGJyYW5jaCBpcyByZXF1aXJlZCBmb3IgJ01lcmdlZCBJbnRvJy4iCittc2dzdHIgIlVuZSBicmFuY2hlIGVzdCBuw6ljZXNzYWlyZSBwb3VyICdGdXNpb25uw6kgZGFucycuIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjE4NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJUaGUgZm9sbG93aW5nIGJyYW5jaGVzIGFyZSBub3QgY29tcGxldGVseSBtZXJnZWQgaW50byAlczpcbiIKKyJcbiIKKyIgLSAlcyIKK21zZ3N0ciAiIgorIkxlcyBicmFuY2hlcyBzdWl2YW50ZXMgbmUgc29udCBwYXMgY29tcGzDqHRlbWVudCBmdXNpb25uw6llcyBkYW5zICVzIDpcbiIKKyJcbiIKKyIgLSAlcyIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoxODkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiT25lIG9yIG1vcmUgb2YgdGhlIG1lcmdlIHRlc3RzIGZhaWxlZCBiZWNhdXNlIHlvdSBoYXZlIG5vdCBmZXRjaGVkIHRoZSAiCisibmVjZXNzYXJ5IGNvbW1pdHMuICBUcnkgZmV0Y2hpbmcgZnJvbSAlcyBmaXJzdC4iCittc2dzdHIgIiIKKyJVbmUgb3UgcGx1c2lldXJzIGRlcyB0ZXN0cyBkZSBmdXNpb24gb250IMOpY2hvdcOpcyBwYXJjZSBxdWUgdm91cyBuJ2F2ZXogcGFzICIKKyJyw6ljdXDDqXLDqSBsZXMgY29tbWl0cyBuw6ljZXNzYWlyZXMuIEVzc2F5ZXogZGUgcsOpY3Vww6lyw6kgw6AgcGFydGlyIGRlICVzIGQnYWJvcmQuIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjIwNworbXNnaWQgIlBsZWFzZSBzZWxlY3Qgb25lIG9yIG1vcmUgYnJhbmNoZXMgdG8gZGVsZXRlLiIKK21zZ3N0ciAiTWVyY2kgZGUgc8OpbGVjdGlvbm5lciB1bmUgb3UgcGx1c2lldXJzIGJyYW5jaGVzIMOgIHN1cHByaW1lci4iCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MjE2Cittc2dpZCAiIgorIlJlY292ZXJpbmcgZGVsZXRlZCBicmFuY2hlcyBpcyBkaWZmaWN1bHQuXG4iCisiXG4iCisiRGVsZXRlIHRoZSBzZWxlY3RlZCBicmFuY2hlcz8iCittc2dzdHIgIiIKKyJSw6ljdXDDqXJlciBkZXMgYnJhbmNoZXMgc3VwcHJpbcOpZXMgZXN0IGRpZmZpY2lsZS5cbiIKKyJcbiIKKyJTb3VoYWl0ZXogdm91cyBzdXBwcmltZXIgbGVzIGJyYW5jaGVzIHPDqWxlY3Rpb25uw6llcyA/IgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjIyNgorIywgdGNsLWZvcm1hdAorbXNnaWQgIkRlbGV0aW5nIGJyYW5jaGVzIGZyb20gJXMiCittc2dzdHIgIlN1cHByaW1lciBsZXMgYnJhbmNoZXMgZGUgJXMiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6Mjg2Cittc2dpZCAiTm8gcmVwb3NpdG9yeSBzZWxlY3RlZC4iCittc2dzdHIgIkF1Y3VuIHLDqWbDqXJlbnRpZWwgbidlc3Qgc8OpbGVjdGlvbm7DqS4iCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MjkxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgJXMuLi4iCittc2dzdHIgIlN5bmNocm9uaXNhdGlvbiBkZSAlcy4uLiIKKworIzogbGliL3JlbW90ZS50Y2w6MTY1Cittc2dpZCAiUHJ1bmUgZnJvbSIKK21zZ3N0ciAiTmV0dG95ZXIgZGUiCisKKyM6IGxpYi9yZW1vdGUudGNsOjE3MAorbXNnaWQgIkZldGNoIGZyb20iCittc2dzdHIgIlLDqWN1cMOpcmVyIGRlIgorCisjOiBsaWIvcmVtb3RlLnRjbDoyMTMKK21zZ2lkICJQdXNoIHRvIgorbXNnc3RyICJQb3Vzc2VyIHZlcnMiCisKKyM6IGxpYi9zaG9ydGN1dC50Y2w6MjAgbGliL3Nob3J0Y3V0LnRjbDo2MQorbXNnaWQgIkNhbm5vdCB3cml0ZSBzaG9ydGN1dDoiCittc2dzdHIgIkltcG9zc2libGUgZCfDqWNyaXJlIGxlIHJhY2NvdXJjaXMgOiIKKworIzogbGliL3Nob3J0Y3V0LnRjbDoxMzYKK21zZ2lkICJDYW5ub3Qgd3JpdGUgaWNvbjoiCittc2dzdHIgIkltcG9zc2libGUgZCfDqWNyaXJlIGwnaWPDtG5lIDoiCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDo1NworbXNnaWQgIlVuc3VwcG9ydGVkIHNwZWxsIGNoZWNrZXIiCittc2dzdHIgIlbDqXJpZmljYXRldXIgZCdvcnRob2dyYXBoZSBub24gc3VwcG9ydMOpIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6NjUKK21zZ2lkICJTcGVsbCBjaGVja2luZyBpcyB1bmF2YWlsYWJsZSIKK21zZ3N0ciAiTGEgdsOpcmlmaWNhdGlvbiBkJ29ydGhvZ3JhcGhlIG4nZXN0IHBhcyBkaXNwb25pYmxlIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6NjgKK21zZ2lkICJJbnZhbGlkIHNwZWxsIGNoZWNraW5nIGNvbmZpZ3VyYXRpb24iCittc2dzdHIgIkNvbmZpZ3VyYXRpb24gZGUgdsOpcmlmaWNhdGlvbiBkJ29ydGhvZ3JhcGhlIGludmFsaWRlIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6NzAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJSZXZlcnRpbmcgZGljdGlvbmFyeSB0byAlcy4iCittc2dzdHIgIlLDqWluaXRpYWxpc2F0aW9uIGR1IGRpY3Rpb25uYWlyZSDDoCAlcy4iCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDo3MworbXNnaWQgIlNwZWxsIGNoZWNrZXIgc2lsZW50bHkgZmFpbGVkIG9uIHN0YXJ0dXAiCittc2dzdHIgIkxhIHbDqXJpZmljYXRpb24gZCdvcnRob2dyYXBoZSBhIMOpY2hvdcOpZSBzaWxlbnRpZXVzZW1lbnQgYXUgZMOpbWFycmFnZSIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjgwCittc2dpZCAiVW5yZWNvZ25pemVkIHNwZWxsIGNoZWNrZXIiCittc2dzdHIgIlbDqXJpZmljYXRldXIgZCdvcnRob2dyYXBoZSBub24gcmVjb25udSIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjE4MAorbXNnaWQgIk5vIFN1Z2dlc3Rpb25zIgorbXNnc3RyICJBdWN1bmUgc3VnZ2VzdGlvbiIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjM4MQorbXNnaWQgIlVuZXhwZWN0ZWQgRU9GIGZyb20gc3BlbGwgY2hlY2tlciIKK21zZ3N0ciAiRmluIGRlIGZpY2hpZXIgaW5uYXRlbmR1ZSBlbnZvecOpZSBwYXIgbGUgdsOpcmlmaWNhdGV1ciBkJ29ydGhvZ3JhcGhlIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6Mzg1Cittc2dpZCAiU3BlbGwgQ2hlY2tlciBGYWlsZWQiCittc2dzdHIgIkxlIHbDqXJpZmljYXRldXIgZCdvcnRob2dyYXBoZSBhIMOpY2hvdcOpIgorCisjOiBsaWIvc3RhdHVzX2Jhci50Y2w6ODMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIlcyAuLi4gJSppIG9mICUqaSAlcyAoJTNpJSUpIgorbXNnc3RyICIlcyAuLi4gJSppIGRlICUqaSAlcyAoJTNpJSUpIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDo2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiZmV0Y2ggJXMiCittc2dzdHIgInLDqWN1cMOpcmVyICVzIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDo3CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRmV0Y2hpbmcgbmV3IGNoYW5nZXMgZnJvbSAlcyIKK21zZ3N0ciAiUsOpY3Vww6lyYXRpb24gZGVzIGRlcm5pw6hyZXMgbW9kaWZpY2F0aW9ucyBkZSAlcyIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTgKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJyZW1vdGUgcHJ1bmUgJXMiCittc2dzdHIgIm5ldHRveWVyIMOgIGRpc3RhbmNlICVzIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoxOQorIywgdGNsLWZvcm1hdAorbXNnaWQgIlBydW5pbmcgdHJhY2tpbmcgYnJhbmNoZXMgZGVsZXRlZCBmcm9tICVzIgorbXNnc3RyICJOZXR0b3llciBsZXMgYnJhbmNoZXMgZGUgc3Vpdmkgc3VwcHJpbcOpZXMgZGUgJXMiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjI1IGxpYi90cmFuc3BvcnQudGNsOjcxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAicHVzaCAlcyIKK21zZ3N0ciAicG91c3NlciAlcyIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MjYKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJQdXNoaW5nIGNoYW5nZXMgdG8gJXMiCittc2dzdHIgIkxlcyBtb2RpZmljYXRpb25zIHNvbnQgcG91c3PDqWVzIHZlcnMgJXMiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjcyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUHVzaGluZyAlcyAlcyB0byAlcyIKK21zZ3N0ciAiUG91c3NlICVzICVzIHZlcnMgJXMiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjg5Cittc2dpZCAiUHVzaCBCcmFuY2hlcyIKK21zZ3N0ciAiUG91c3NlciBicmFuY2hlcyIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTAzCittc2dpZCAiU291cmNlIEJyYW5jaGVzIgorbXNnc3RyICJCcmFuY2hlcyBzb3VyY2UiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjEyMAorbXNnaWQgIkRlc3RpbmF0aW9uIFJlcG9zaXRvcnkiCittc2dzdHIgIlLDqWbDqXJlbnRpZWwgZGUgZGVzdGluYXRpb24iCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjE1OAorbXNnaWQgIlRyYW5zZmVyIE9wdGlvbnMiCittc2dzdHIgIlRyYW5zZsOpcmVyIG9wdGlvbnMiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjE2MAorbXNnaWQgIkZvcmNlIG92ZXJ3cml0ZSBleGlzdGluZyBicmFuY2ggKG1heSBkaXNjYXJkIGNoYW5nZXMpIgorbXNnc3RyICIiCisiRm9yY2VyIGwnw6ljcmFzZW1lbnQgZCd1bmUgYnJhbmNoZSBleGlzdGFudGUgKHBldXQgc3VwcHJpbWVyIGRlcyAiCisibW9kaWZpY2F0aW9ucykiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjE2NAorbXNnaWQgIlVzZSB0aGluIHBhY2sgKGZvciBzbG93IG5ldHdvcmsgY29ubmVjdGlvbnMpIgorbXNnc3RyICJVdGlsaXNlciBkZXMgcGV0aXRzIHBhcXVldHMgKHBvdXIgbGVzIGNvbm5leGlvbnMgbGVudGVzKSIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTY4Cittc2dpZCAiSW5jbHVkZSB0YWdzIgorbXNnc3RyICJJbmNsdXJlIGxlcyBtYXJxdWVzIgorCmRpZmYgLS1naXQgYS9naXQtZ3VpL3BvL2dpdC1ndWkucG90IGIvZ2l0LWd1aS9wby9naXQtZ3VpLnBvdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTMxOTlmCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9wby9naXQtZ3VpLnBvdApAQCAtMCwwICsxLDE4MjMgQEAKKyMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KKyMgQ29weXJpZ2h0IChDKSBZRUFSIFRIRSBQQUNLQUdFJ1MgQ09QWVJJR0hUIEhPTERFUgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgUEFDS0FHRSBwYWNrYWdlLgorIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgorIworIywgZnV6enkKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTlxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBcbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAwOC0wMy0xNCAwNzoxOCswMTAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogWUVBUi1NTy1EQSBITzpNSStaT05FXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBGVUxMIE5BTUUgPEVNQUlMQEFERFJFU1M+XG4iCisiTGFuZ3VhZ2UtVGVhbTogTEFOR1VBR0UgPExMQGxpLm9yZz5cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1DSEFSU0VUXG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorCisjOiBnaXQtZ3VpLnNoOjQxIGdpdC1ndWkuc2g6NjM0IGdpdC1ndWkuc2g6NjQ4IGdpdC1ndWkuc2g6NjYxIGdpdC1ndWkuc2g6NzQ0CisjOiBnaXQtZ3VpLnNoOjc2MworbXNnaWQgImdpdC1ndWk6IGZhdGFsIGVycm9yIgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6NTkzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBmb250IHNwZWNpZmllZCBpbiAlczoiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDo2MjAKK21zZ2lkICJNYWluIEZvbnQiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDo2MjEKK21zZ2lkICJEaWZmL0NvbnNvbGUgRm9udCIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjYzNQorbXNnaWQgIkNhbm5vdCBmaW5kIGdpdCBpbiBQQVRILiIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjY2MgorbXNnaWQgIkNhbm5vdCBwYXJzZSBHaXQgdmVyc2lvbiBzdHJpbmc6IgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6NjgwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIkdpdCB2ZXJzaW9uIGNhbm5vdCBiZSBkZXRlcm1pbmVkLlxuIgorIlxuIgorIiVzIGNsYWltcyBpdCBpcyB2ZXJzaW9uICclcycuXG4iCisiXG4iCisiJXMgcmVxdWlyZXMgYXQgbGVhc3QgR2l0IDEuNS4wIG9yIGxhdGVyLlxuIgorIlxuIgorIkFzc3VtZSAnJXMnIGlzIHZlcnNpb24gMS41LjA/XG4iCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDo5MTgKK21zZ2lkICJHaXQgZGlyZWN0b3J5IG5vdCBmb3VuZDoiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDo5MjUKK21zZ2lkICJDYW5ub3QgbW92ZSB0byB0b3Agb2Ygd29ya2luZyBkaXJlY3Rvcnk6IgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6OTMyCittc2dpZCAiQ2Fubm90IHVzZSBmdW5ueSAuZ2l0IGRpcmVjdG9yeToiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDo5MzcKK21zZ2lkICJObyB3b3JraW5nIGRpcmVjdG9yeSIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjEwODQgbGliL2NoZWNrb3V0X29wLnRjbDoyODMKK21zZ2lkICJSZWZyZXNoaW5nIGZpbGUgc3RhdHVzLi4uIgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MTE0OQorbXNnaWQgIlNjYW5uaW5nIGZvciBtb2RpZmllZCBmaWxlcyAuLi4iCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoxMzI0IGxpYi9icm93c2VyLnRjbDoyNDYKK21zZ2lkICJSZWFkeS4iCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoxNTkwCittc2dpZCAiVW5tb2RpZmllZCIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjE1OTIKK21zZ2lkICJNb2RpZmllZCwgbm90IHN0YWdlZCIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjE1OTMgZ2l0LWd1aS5zaDoxNTk4Cittc2dpZCAiU3RhZ2VkIGZvciBjb21taXQiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoxNTk0IGdpdC1ndWkuc2g6MTU5OQorbXNnaWQgIlBvcnRpb25zIHN0YWdlZCBmb3IgY29tbWl0IgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MTU5NSBnaXQtZ3VpLnNoOjE2MDAKK21zZ2lkICJTdGFnZWQgZm9yIGNvbW1pdCwgbWlzc2luZyIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjE1OTcKK21zZ2lkICJVbnRyYWNrZWQsIG5vdCBzdGFnZWQiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoxNjAyCittc2dpZCAiTWlzc2luZyIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjE2MDMKK21zZ2lkICJTdGFnZWQgZm9yIHJlbW92YWwiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoxNjA0Cittc2dpZCAiU3RhZ2VkIGZvciByZW1vdmFsLCBzdGlsbCBwcmVzZW50IgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MTYwNiBnaXQtZ3VpLnNoOjE2MDcgZ2l0LWd1aS5zaDoxNjA4IGdpdC1ndWkuc2g6MTYwOQorbXNnaWQgIlJlcXVpcmVzIG1lcmdlIHJlc29sdXRpb24iCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoxNjQ0Cittc2dpZCAiU3RhcnRpbmcgZ2l0ay4uLiBwbGVhc2Ugd2FpdC4uLiIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjE2NTMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiVW5hYmxlIHRvIHN0YXJ0IGdpdGs6XG4iCisiXG4iCisiJXMgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoxODYwIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MzYKK21zZ2lkICJSZXBvc2l0b3J5IgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MTg2MQorbXNnaWQgIkVkaXQiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoxODYzIGxpYi9jaG9vc2VfcmV2LnRjbDo1NjEKK21zZ2lkICJCcmFuY2giCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoxODY2IGxpYi9jaG9vc2VfcmV2LnRjbDo1NDgKK21zZ2lkICJDb21taXRAQG5vdW4iCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoxODY5IGxpYi9tZXJnZS50Y2w6MTIwIGxpYi9tZXJnZS50Y2w6MTQ5IGxpYi9tZXJnZS50Y2w6MTY3Cittc2dpZCAiTWVyZ2UiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoxODcwIGxpYi9jaG9vc2VfcmV2LnRjbDo1NTcKK21zZ2lkICJSZW1vdGUiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoxODc5Cittc2dpZCAiQnJvd3NlIEN1cnJlbnQgQnJhbmNoJ3MgRmlsZXMiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoxODgzCittc2dpZCAiQnJvd3NlIEJyYW5jaCBGaWxlcy4uLiIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjE4ODgKK21zZ2lkICJWaXN1YWxpemUgQ3VycmVudCBCcmFuY2gncyBIaXN0b3J5IgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MTg5MgorbXNnaWQgIlZpc3VhbGl6ZSBBbGwgQnJhbmNoIEhpc3RvcnkiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoxODk5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQnJvd3NlICVzJ3MgRmlsZXMiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoxOTAxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVmlzdWFsaXplICVzJ3MgSGlzdG9yeSIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjE5MDYgbGliL2RhdGFiYXNlLnRjbDoyNyBsaWIvZGF0YWJhc2UudGNsOjY3Cittc2dpZCAiRGF0YWJhc2UgU3RhdGlzdGljcyIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjE5MDkgbGliL2RhdGFiYXNlLnRjbDozNAorbXNnaWQgIkNvbXByZXNzIERhdGFiYXNlIgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MTkxMgorbXNnaWQgIlZlcmlmeSBEYXRhYmFzZSIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjE5MTkgZ2l0LWd1aS5zaDoxOTIzIGdpdC1ndWkuc2g6MTkyNyBsaWIvc2hvcnRjdXQudGNsOjcKKyM6IGxpYi9zaG9ydGN1dC50Y2w6MzkgbGliL3Nob3J0Y3V0LnRjbDo3MQorbXNnaWQgIkNyZWF0ZSBEZXNrdG9wIEljb24iCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoxOTMyIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTc3IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTg1Cittc2dpZCAiUXVpdCIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjE5MzkKK21zZ2lkICJVbmRvIgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MTk0MgorbXNnaWQgIlJlZG8iCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoxOTQ2IGdpdC1ndWkuc2g6MjQ0MworbXNnaWQgIkN1dCIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjE5NDkgZ2l0LWd1aS5zaDoyNDQ2IGdpdC1ndWkuc2g6MjUyMCBnaXQtZ3VpLnNoOjI2MTQKKyM6IGxpYi9jb25zb2xlLnRjbDo2OQorbXNnaWQgIkNvcHkiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoxOTUyIGdpdC1ndWkuc2g6MjQ0OQorbXNnaWQgIlBhc3RlIgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MTk1NSBnaXQtZ3VpLnNoOjI0NTIgbGliL2JyYW5jaF9kZWxldGUudGNsOjI2CisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjM4Cittc2dpZCAiRGVsZXRlIgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MTk1OSBnaXQtZ3VpLnNoOjI0NTYgZ2l0LWd1aS5zaDoyNjE4IGxpYi9jb25zb2xlLnRjbDo3MQorbXNnaWQgIlNlbGVjdCBBbGwiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoxOTY4Cittc2dpZCAiQ3JlYXRlLi4uIgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MTk3NAorbXNnaWQgIkNoZWNrb3V0Li4uIgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MTk4MAorbXNnaWQgIlJlbmFtZS4uLiIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjE5ODUgZ2l0LWd1aS5zaDoyMDg1Cittc2dpZCAiRGVsZXRlLi4uIgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MTk5MAorbXNnaWQgIlJlc2V0Li4uIgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MjAwMiBnaXQtZ3VpLnNoOjIzODkKK21zZ2lkICJOZXcgQ29tbWl0IgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MjAxMCBnaXQtZ3VpLnNoOjIzOTYKK21zZ2lkICJBbWVuZCBMYXN0IENvbW1pdCIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjIwMTkgZ2l0LWd1aS5zaDoyMzU2IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6OTkKK21zZ2lkICJSZXNjYW4iCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoyMDI1Cittc2dpZCAiU3RhZ2UgVG8gQ29tbWl0IgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MjAzMQorbXNnaWQgIlN0YWdlIENoYW5nZWQgRmlsZXMgVG8gQ29tbWl0IgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MjAzNworbXNnaWQgIlVuc3RhZ2UgRnJvbSBDb21taXQiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoyMDQyIGxpYi9pbmRleC50Y2w6Mzk1Cittc2dpZCAiUmV2ZXJ0IENoYW5nZXMiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoyMDQ5IGdpdC1ndWkuc2g6MjM2OCBnaXQtZ3VpLnNoOjI0NjcKK21zZ2lkICJTaWduIE9mZiIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjIwNTMgZ2l0LWd1aS5zaDoyMzcyCittc2dpZCAiQ29tbWl0QEB2ZXJiIgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MjA2NAorbXNnaWQgIkxvY2FsIE1lcmdlLi4uIgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MjA2OQorbXNnaWQgIkFib3J0IE1lcmdlLi4uIgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MjA4MQorbXNnaWQgIlB1c2guLi4iCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoyMDkyIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDEKK21zZ2lkICJBcHBsZSIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjIwOTUgZ2l0LWd1aS5zaDoyMTE3IGxpYi9hYm91dC50Y2w6MTQKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDQgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1MAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkFib3V0ICVzIgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MjA5OQorbXNnaWQgIlByZWZlcmVuY2VzLi4uIgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MjEwNyBnaXQtZ3VpLnNoOjI2MzkKK21zZ2lkICJPcHRpb25zLi4uIgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MjExMyBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ3Cittc2dpZCAiSGVscCIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjIxNTQKK21zZ2lkICJPbmxpbmUgRG9jdW1lbnRhdGlvbiIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjIyMzgKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJmYXRhbDogY2Fubm90IHN0YXQgcGF0aCAlczogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjIyNzEKK21zZ2lkICJDdXJyZW50IEJyYW5jaDoiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoyMjkyCittc2dpZCAiU3RhZ2VkIENoYW5nZXMgKFdpbGwgQ29tbWl0KSIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjIzMTIKK21zZ2lkICJVbnN0YWdlZCBDaGFuZ2VzIgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MjM2MgorbXNnaWQgIlN0YWdlIENoYW5nZWQiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoyMzc4IGxpYi90cmFuc3BvcnQudGNsOjkzIGxpYi90cmFuc3BvcnQudGNsOjE4MgorbXNnaWQgIlB1c2giCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoyNDA4Cittc2dpZCAiSW5pdGlhbCBDb21taXQgTWVzc2FnZToiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoyNDA5Cittc2dpZCAiQW1lbmRlZCBDb21taXQgTWVzc2FnZToiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoyNDEwCittc2dpZCAiQW1lbmRlZCBJbml0aWFsIENvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjI0MTEKK21zZ2lkICJBbWVuZGVkIE1lcmdlIENvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjI0MTIKK21zZ2lkICJNZXJnZSBDb21taXQgTWVzc2FnZToiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoyNDEzCittc2dpZCAiQ29tbWl0IE1lc3NhZ2U6IgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MjQ1OSBnaXQtZ3VpLnNoOjI2MjIgbGliL2NvbnNvbGUudGNsOjczCittc2dpZCAiQ29weSBBbGwiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoyNDgzIGxpYi9ibGFtZS50Y2w6MTA3Cittc2dpZCAiRmlsZToiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoyNTg5Cittc2dpZCAiQXBwbHkvUmV2ZXJzZSBIdW5rIgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MjU5NQorbXNnaWQgIlNob3cgTGVzcyBDb250ZXh0IgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MjYwMgorbXNnaWQgIlNob3cgTW9yZSBDb250ZXh0IgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MjYxMAorbXNnaWQgIlJlZnJlc2giCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoyNjMxCittc2dpZCAiRGVjcmVhc2UgRm9udCBTaXplIgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MjYzNQorbXNnaWQgIkluY3JlYXNlIEZvbnQgU2l6ZSIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjI2NDYKK21zZ2lkICJVbnN0YWdlIEh1bmsgRnJvbSBDb21taXQiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoyNjQ4Cittc2dpZCAiU3RhZ2UgSHVuayBGb3IgQ29tbWl0IgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6MjY2NworbXNnaWQgIkluaXRpYWxpemluZy4uLiIKK21zZ3N0ciAiIgorCisjOiBnaXQtZ3VpLnNoOjI3NjIKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiUG9zc2libGUgZW52aXJvbm1lbnQgaXNzdWVzIGV4aXN0LlxuIgorIlxuIgorIlRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBwcm9iYWJseVxuIgorImdvaW5nIHRvIGJlIGlnbm9yZWQgYnkgYW55IEdpdCBzdWJwcm9jZXNzIHJ1blxuIgorImJ5ICVzOlxuIgorIlxuIgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6Mjc5MgorbXNnaWQgIiIKKyJcbiIKKyJUaGlzIGlzIGR1ZSB0byBhIGtub3duIGlzc3VlIHdpdGggdGhlXG4iCisiVGNsIGJpbmFyeSBkaXN0cmlidXRlZCBieSBDeWd3aW4uIgorbXNnc3RyICIiCisKKyM6IGdpdC1ndWkuc2g6Mjc5NworIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJcbiIKKyJBIGdvb2QgcmVwbGFjZW1lbnQgZm9yICVzXG4iCisiaXMgcGxhY2luZyB2YWx1ZXMgZm9yIHRoZSB1c2VyLm5hbWUgYW5kXG4iCisidXNlci5lbWFpbCBzZXR0aW5ncyBpbnRvIHlvdXIgcGVyc29uYWxcbiIKKyJ+Ly5naXRjb25maWcgZmlsZS5cbiIKK21zZ3N0ciAiIgorCisjOiBsaWIvYWJvdXQudGNsOjI2Cittc2dpZCAiZ2l0LWd1aSAtIGEgZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlIGZvciBHaXQuIgorbXNnc3RyICIiCisKKyM6IGxpYi9ibGFtZS50Y2w6NzcKK21zZ2lkICJGaWxlIFZpZXdlciIKK21zZ3N0ciAiIgorCisjOiBsaWIvYmxhbWUudGNsOjgxCittc2dpZCAiQ29tbWl0OiIKK21zZ3N0ciAiIgorCisjOiBsaWIvYmxhbWUudGNsOjI2NAorbXNnaWQgIkNvcHkgQ29tbWl0IgorbXNnc3RyICIiCisKKyM6IGxpYi9ibGFtZS50Y2w6Mzg0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUmVhZGluZyAlcy4uLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvYmxhbWUudGNsOjQ4OAorbXNnaWQgIkxvYWRpbmcgY29weS9tb3ZlIHRyYWNraW5nIGFubm90YXRpb25zLi4uIgorbXNnc3RyICIiCisKKyM6IGxpYi9ibGFtZS50Y2w6NTA4Cittc2dpZCAibGluZXMgYW5ub3RhdGVkIgorbXNnc3RyICIiCisKKyM6IGxpYi9ibGFtZS50Y2w6Njg5Cittc2dpZCAiTG9hZGluZyBvcmlnaW5hbCBsb2NhdGlvbiBhbm5vdGF0aW9ucy4uLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvYmxhbWUudGNsOjY5MgorbXNnaWQgIkFubm90YXRpb24gY29tcGxldGUuIgorbXNnc3RyICIiCisKKyM6IGxpYi9ibGFtZS50Y2w6NzQ2Cittc2dpZCAiTG9hZGluZyBhbm5vdGF0aW9uLi4uIgorbXNnc3RyICIiCisKKyM6IGxpYi9ibGFtZS50Y2w6ODAyCittc2dpZCAiQXV0aG9yOiIKK21zZ3N0ciAiIgorCisjOiBsaWIvYmxhbWUudGNsOjgwNgorbXNnaWQgIkNvbW1pdHRlcjoiCittc2dzdHIgIiIKKworIzogbGliL2JsYW1lLnRjbDo4MTEKK21zZ2lkICJPcmlnaW5hbCBGaWxlOiIKK21zZ3N0ciAiIgorCisjOiBsaWIvYmxhbWUudGNsOjkyNQorbXNnaWQgIk9yaWdpbmFsbHkgQnk6IgorbXNnc3RyICIiCisKKyM6IGxpYi9ibGFtZS50Y2w6OTMxCittc2dpZCAiSW4gRmlsZToiCittc2dzdHIgIiIKKworIzogbGliL2JsYW1lLnRjbDo5MzYKK21zZ2lkICJDb3BpZWQgT3IgTW92ZWQgSGVyZSBCeToiCittc2dzdHIgIiIKKworIzogbGliL2JyYW5jaF9jaGVja291dC50Y2w6MTQgbGliL2JyYW5jaF9jaGVja291dC50Y2w6MTkKK21zZ2lkICJDaGVja291dCBCcmFuY2giCittc2dzdHIgIiIKKworIzogbGliL2JyYW5jaF9jaGVja291dC50Y2w6MjMKK21zZ2lkICJDaGVja291dCIKK21zZ3N0ciAiIgorCisjOiBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDoyNyBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MzUKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDozMiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MzAgbGliL2Jyb3dzZXIudGNsOjI4MgorIzogbGliL2NoZWNrb3V0X29wLnRjbDo1MjIgbGliL2Nob29zZV9mb250LnRjbDo0MyBsaWIvbWVyZ2UudGNsOjE3MQorIzogbGliL29wdGlvbi50Y2w6MTAzIGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6NDIgbGliL3RyYW5zcG9ydC50Y2w6OTcKK21zZ2lkICJDYW5jZWwiCittc2dzdHIgIiIKKworIzogbGliL2JyYW5jaF9jaGVja291dC50Y2w6MzIgbGliL2Jyb3dzZXIudGNsOjI4NworbXNnaWQgIlJldmlzaW9uIgorbXNnc3RyICIiCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjM2IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo2OSBsaWIvb3B0aW9uLnRjbDoyNDIKK21zZ2lkICJPcHRpb25zIgorbXNnc3RyICIiCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjM5IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo5MgorbXNnaWQgIkZldGNoIFRyYWNraW5nIEJyYW5jaCIKK21zZ3N0ciAiIgorCisjOiBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDo0NAorbXNnaWQgIkRldGFjaCBGcm9tIExvY2FsIEJyYW5jaCIKK21zZ3N0ciAiIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MjIKK21zZ2lkICJDcmVhdGUgQnJhbmNoIgorbXNnc3RyICIiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDoyNworbXNnaWQgIkNyZWF0ZSBOZXcgQnJhbmNoIgorbXNnc3RyICIiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDozMSBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjM3MQorbXNnaWQgIkNyZWF0ZSIKK21zZ3N0ciAiIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NDAKK21zZ2lkICJCcmFuY2ggTmFtZSIKK21zZ3N0ciAiIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NDMKK21zZ2lkICJOYW1lOiIKK21zZ3N0ciAiIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NTgKK21zZ2lkICJNYXRjaCBUcmFja2luZyBCcmFuY2ggTmFtZSIKK21zZ3N0ciAiIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NjYKK21zZ2lkICJTdGFydGluZyBSZXZpc2lvbiIKK21zZ3N0ciAiIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NzIKK21zZ2lkICJVcGRhdGUgRXhpc3RpbmcgQnJhbmNoOiIKK21zZ3N0ciAiIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NzUKK21zZ2lkICJObyIKK21zZ3N0ciAiIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6ODAKK21zZ2lkICJGYXN0IEZvcndhcmQgT25seSIKK21zZ3N0ciAiIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6ODUgbGliL2NoZWNrb3V0X29wLnRjbDo1MTQKK21zZ2lkICJSZXNldCIKK21zZ3N0ciAiIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6OTcKK21zZ2lkICJDaGVja291dCBBZnRlciBDcmVhdGlvbiIKK21zZ3N0ciAiIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MTMxCittc2dpZCAiUGxlYXNlIHNlbGVjdCBhIHRyYWNraW5nIGJyYW5jaC4iCittc2dzdHIgIiIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjE0MAorIywgdGNsLWZvcm1hdAorbXNnaWQgIlRyYWNraW5nIGJyYW5jaCAlcyBpcyBub3QgYSBicmFuY2ggaW4gdGhlIHJlbW90ZSByZXBvc2l0b3J5LiIKK21zZ3N0ciAiIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MTUzIGxpYi9icmFuY2hfcmVuYW1lLnRjbDo4NgorbXNnaWQgIlBsZWFzZSBzdXBwbHkgYSBicmFuY2ggbmFtZS4iCittc2dzdHIgIiIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjE2NCBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MTA2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiJyVzJyBpcyBub3QgYW4gYWNjZXB0YWJsZSBicmFuY2ggbmFtZS4iCittc2dzdHIgIiIKKworIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjE1Cittc2dpZCAiRGVsZXRlIEJyYW5jaCIKK21zZ3N0ciAiIgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MjAKK21zZ2lkICJEZWxldGUgTG9jYWwgQnJhbmNoIgorbXNnc3RyICIiCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDozNworbXNnaWQgIkxvY2FsIEJyYW5jaGVzIgorbXNnc3RyICIiCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDo1MgorbXNnaWQgIkRlbGV0ZSBPbmx5IElmIE1lcmdlZCBJbnRvIgorbXNnc3RyICIiCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDo1NAorbXNnaWQgIkFsd2F5cyAoRG8gbm90IHBlcmZvcm0gbWVyZ2UgdGVzdC4pIgorbXNnc3RyICIiCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDoxMDMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJUaGUgZm9sbG93aW5nIGJyYW5jaGVzIGFyZSBub3QgY29tcGxldGVseSBtZXJnZWQgaW50byAlczoiCittc2dzdHIgIiIKKworIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjExNQorbXNnaWQgIiIKKyJSZWNvdmVyaW5nIGRlbGV0ZWQgYnJhbmNoZXMgaXMgZGlmZmljdWx0LiBcbiIKKyJcbiIKKyIgRGVsZXRlIHRoZSBzZWxlY3RlZCBicmFuY2hlcz8iCittc2dzdHIgIiIKKworIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjE0MQorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZGVsZXRlIGJyYW5jaGVzOlxuIgorIiVzIgorbXNnc3RyICIiCisKKyM6IGxpYi9icmFuY2hfcmVuYW1lLnRjbDoxNCBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MjIKK21zZ2lkICJSZW5hbWUgQnJhbmNoIgorbXNnc3RyICIiCisKKyM6IGxpYi9icmFuY2hfcmVuYW1lLnRjbDoyNgorbXNnaWQgIlJlbmFtZSIKK21zZ3N0ciAiIgorCisjOiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MzYKK21zZ2lkICJCcmFuY2g6IgorbXNnc3RyICIiCisKKyM6IGxpYi9icmFuY2hfcmVuYW1lLnRjbDozOQorbXNnaWQgIk5ldyBOYW1lOiIKK21zZ3N0ciAiIgorCisjOiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6NzUKK21zZ2lkICJQbGVhc2Ugc2VsZWN0IGEgYnJhbmNoIHRvIHJlbmFtZS4iCittc2dzdHIgIiIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjk2IGxpYi9jaGVja291dF9vcC50Y2w6MTc5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQnJhbmNoICclcycgYWxyZWFkeSBleGlzdHMuIgorbXNnc3RyICIiCisKKyM6IGxpYi9icmFuY2hfcmVuYW1lLnRjbDoxMTcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcmVuYW1lICclcycuIgorbXNnc3RyICIiCisKKyM6IGxpYi9icm93c2VyLnRjbDoxNworbXNnaWQgIlN0YXJ0aW5nLi4uIgorbXNnc3RyICIiCisKKyM6IGxpYi9icm93c2VyLnRjbDoyNgorbXNnaWQgIkZpbGUgQnJvd3NlciIKK21zZ3N0ciAiIgorCisjOiBsaWIvYnJvd3Nlci50Y2w6MTI2IGxpYi9icm93c2VyLnRjbDoxNDMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJMb2FkaW5nICVzLi4uIgorbXNnc3RyICIiCisKKyM6IGxpYi9icm93c2VyLnRjbDoxODcKK21zZ2lkICJbVXAgVG8gUGFyZW50XSIKK21zZ3N0ciAiIgorCisjOiBsaWIvYnJvd3Nlci50Y2w6MjY3IGxpYi9icm93c2VyLnRjbDoyNzMKK21zZ2lkICJCcm93c2UgQnJhbmNoIEZpbGVzIgorbXNnc3RyICIiCisKKyM6IGxpYi9icm93c2VyLnRjbDoyNzggbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozODcKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDc0IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDg0CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjk4NworbXNnaWQgIkJyb3dzZSIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjc5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRmV0Y2hpbmcgJXMgZnJvbSAlcyIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjEyNworIywgdGNsLWZvcm1hdAorbXNnaWQgImZhdGFsOiBDYW5ub3QgcmVzb2x2ZSAlcyIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjE0MCBsaWIvY29uc29sZS50Y2w6ODEgbGliL2RhdGFiYXNlLnRjbDozMQorbXNnaWQgIkNsb3NlIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MTY5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQnJhbmNoICclcycgZG9lcyBub3QgZXhpc3QuIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MjA2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIkJyYW5jaCAnJXMnIGFscmVhZHkgZXhpc3RzLlxuIgorIlxuIgorIkl0IGNhbm5vdCBmYXN0LWZvcndhcmQgdG8gJXMuXG4iCisiQSBtZXJnZSBpcyByZXF1aXJlZC4iCittc2dzdHIgIiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoyMjAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJNZXJnZSBzdHJhdGVneSAnJXMnIG5vdCBzdXBwb3J0ZWQuIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MjM5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHVwZGF0ZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjI1MQorbXNnaWQgIlN0YWdpbmcgYXJlYSAoaW5kZXgpIGlzIGFscmVhZHkgbG9ja2VkLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjI2NgorbXNnaWQgIiIKKyJMYXN0IHNjYW5uZWQgc3RhdGUgZG9lcyBub3QgbWF0Y2ggcmVwb3NpdG9yeSBzdGF0ZS5cbiIKKyJcbiIKKyJBbm90aGVyIEdpdCBwcm9ncmFtIGhhcyBtb2RpZmllZCB0aGlzIHJlcG9zaXRvcnkgc2luY2UgdGhlIGxhc3Qgc2Nhbi4gIEEgIgorInJlc2NhbiBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlIGN1cnJlbnQgYnJhbmNoIGNhbiBiZSBjaGFuZ2VkLlxuIgorIlxuIgorIlRoZSByZXNjYW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgbm93LlxuIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MzIyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVXBkYXRpbmcgd29ya2luZyBkaXJlY3RvcnkgdG8gJyVzJy4uLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjMyMworbXNnaWQgImZpbGVzIGNoZWNrZWQgb3V0IgorbXNnc3RyICIiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MzUzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQWJvcnRlZCBjaGVja291dCBvZiAnJXMnIChmaWxlIGxldmVsIG1lcmdpbmcgaXMgcmVxdWlyZWQpLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjM1NAorbXNnaWQgIkZpbGUgbGV2ZWwgbWVyZ2UgcmVxdWlyZWQuIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MzU4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiU3RheWluZyBvbiBicmFuY2ggJyVzJy4iCittc2dzdHIgIiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDo0MjkKK21zZ2lkICIiCisiWW91IGFyZSBubyBsb25nZXIgb24gYSBsb2NhbCBicmFuY2guXG4iCisiXG4iCisiSWYgeW91IHdhbnRlZCB0byBiZSBvbiBhIGJyYW5jaCwgY3JlYXRlIG9uZSBub3cgc3RhcnRpbmcgZnJvbSAnVGhpcyBEZXRhY2hlZCAiCisiQ2hlY2tvdXQnLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjQ0NiBsaWIvY2hlY2tvdXRfb3AudGNsOjQ1MAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkNoZWNrZWQgb3V0ICclcycuIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NDc4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUmVzZXR0aW5nICclcycgdG8gJyVzJyB3aWxsIGxvc2UgdGhlIGZvbGxvd2luZyBjb21taXRzOiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjUwMAorbXNnaWQgIlJlY292ZXJpbmcgbG9zdCBjb21taXRzIG1heSBub3QgYmUgZWFzeS4iCittc2dzdHIgIiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDo1MDUKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJSZXNldCAnJXMnPyIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjUxMCBsaWIvbWVyZ2UudGNsOjE2MworbXNnaWQgIlZpc3VhbGl6ZSIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjU3OAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgYnJhbmNoLlxuIgorIlxuIgorIlRoaXMgd29ya2luZyBkaXJlY3RvcnkgaXMgb25seSBwYXJ0aWFsbHkgc3dpdGNoZWQuICBXZSBzdWNjZXNzZnVsbHkgdXBkYXRlZCAiCisieW91ciBmaWxlcywgYnV0IGZhaWxlZCB0byB1cGRhdGUgYW4gaW50ZXJuYWwgR2l0IGZpbGUuXG4iCisiXG4iCisiVGhpcyBzaG91bGQgbm90IGhhdmUgb2NjdXJyZWQuICAlcyB3aWxsIG5vdyBjbG9zZSBhbmQgZ2l2ZSB1cC4iCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9mb250LnRjbDozOQorbXNnaWQgIlNlbGVjdCIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hvb3NlX2ZvbnQudGNsOjUzCittc2dpZCAiRm9udCBGYW1pbHkiCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9mb250LnRjbDo3NAorbXNnaWQgIkZvbnQgU2l6ZSIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hvb3NlX2ZvbnQudGNsOjkxCittc2dpZCAiRm9udCBFeGFtcGxlIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfZm9udC50Y2w6MTAzCittc2dpZCAiIgorIlRoaXMgaXMgZXhhbXBsZSB0ZXh0LlxuIgorIklmIHlvdSBsaWtlIHRoaXMgdGV4dCwgaXQgY2FuIGJlIHlvdXIgZm9udC4iCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoyOAorbXNnaWQgIkdpdCBHdWkiCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo4MSBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjM3NgorbXNnaWQgIkNyZWF0ZSBOZXcgUmVwb3NpdG9yeSIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjg3Cittc2dpZCAiTmV3Li4uIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTQgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NjAKK21zZ2lkICJDbG9uZSBFeGlzdGluZyBSZXBvc2l0b3J5IgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTAwCittc2dpZCAiQ2xvbmUuLi4iCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMDcgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5NzYKK21zZ2lkICJPcGVuIEV4aXN0aW5nIFJlcG9zaXRvcnkiCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMTMKK21zZ2lkICJPcGVuLi4uIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTI2Cittc2dpZCAiUmVjZW50IFJlcG9zaXRvcmllcyIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEzMgorbXNnaWQgIk9wZW4gUmVjZW50IFJlcG9zaXRvcnk6IgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6Mjk2IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MzAzCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjMxMAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjcmVhdGUgcmVwb3NpdG9yeSAlczoiCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozODEgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NzgKK21zZ2lkICJEaXJlY3Rvcnk6IgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDEyIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTM3CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEwMTEKK21zZ2lkICJHaXQgUmVwb3NpdG9yeSIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQzNworIywgdGNsLWZvcm1hdAorbXNnaWQgIkRpcmVjdG9yeSAlcyBhbHJlYWR5IGV4aXN0cy4iCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NDEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJGaWxlICVzIGFscmVhZHkgZXhpc3RzLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ1NQorbXNnaWQgIkNsb25lIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDY4Cittc2dpZCAiVVJMOiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ4OQorbXNnaWQgIkNsb25lIFR5cGU6IgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDk1Cittc2dpZCAiU3RhbmRhcmQgKEZhc3QsIFNlbWktUmVkdW5kYW50LCBIYXJkbGlua3MpIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTAxCittc2dpZCAiRnVsbCBDb3B5IChTbG93ZXIsIFJlZHVuZGFudCBCYWNrdXApIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTA3Cittc2dpZCAiU2hhcmVkIChGYXN0ZXN0LCBOb3QgUmVjb21tZW5kZWQsIE5vIEJhY2t1cCkiCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1NDMgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1OTAKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzM2IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODA2CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEwMTcgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMDI1CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiTm90IGEgR2l0IHJlcG9zaXRvcnk6ICVzIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTc5Cittc2dpZCAiU3RhbmRhcmQgb25seSBhdmFpbGFibGUgZm9yIGxvY2FsIHJlcG9zaXRvcnkuIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTgzCittc2dpZCAiU2hhcmVkIG9ubHkgYXZhaWxhYmxlIGZvciBsb2NhbCByZXBvc2l0b3J5LiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjYwNAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkxvY2F0aW9uICVzIGFscmVhZHkgZXhpc3RzLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjYxNQorbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgb3JpZ2luIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NjI3Cittc2dpZCAiQ291bnRpbmcgb2JqZWN0cyIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjYyOAorbXNnaWQgImJ1Y2tldHMiCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo2NTIKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gY29weSBvYmplY3RzL2luZm8vYWx0ZXJuYXRlczogJXMiCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo2ODgKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJOb3RoaW5nIHRvIGNsb25lIGZyb20gJXMuIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NjkwIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTA0CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjkxNgorbXNnaWQgIlRoZSAnbWFzdGVyJyBicmFuY2ggaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjcwMworbXNnaWQgIkhhcmRsaW5rcyBhcmUgdW5hdmFpbGFibGUuICBGYWxsaW5nIGJhY2sgdG8gY29weWluZy4iCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3MTUKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJDbG9uaW5nIGZyb20gJXMiCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3NDYKK21zZ2lkICJDb3B5aW5nIG9iamVjdHMiCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3NDcKK21zZ2lkICJLaUIiCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3NzEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gY29weSBvYmplY3Q6ICVzIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzgxCittc2dpZCAiTGlua2luZyBvYmplY3RzIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzgyCittc2dpZCAib2JqZWN0cyIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjc5MAorIywgdGNsLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBoYXJkbGluayBvYmplY3Q6ICVzIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODQ1Cittc2dpZCAiQ2Fubm90IGZldGNoIGJyYW5jaGVzIGFuZCBvYmplY3RzLiAgU2VlIGNvbnNvbGUgb3V0cHV0IGZvciBkZXRhaWxzLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjg1NgorbXNnaWQgIkNhbm5vdCBmZXRjaCB0YWdzLiAgU2VlIGNvbnNvbGUgb3V0cHV0IGZvciBkZXRhaWxzLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjg4MAorbXNnaWQgIkNhbm5vdCBkZXRlcm1pbmUgSEVBRC4gIFNlZSBjb25zb2xlIG91dHB1dCBmb3IgZGV0YWlscy4iCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo4ODkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gY2xlYW51cCAlcyIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjg5NQorbXNnaWQgIkNsb25lIGZhaWxlZC4iCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5MDIKK21zZ2lkICJObyBkZWZhdWx0IGJyYW5jaCBvYnRhaW5lZC4iCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5MTMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJDYW5ub3QgcmVzb2x2ZSAlcyBhcyBhIGNvbW1pdC4iCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5MjUKK21zZ2lkICJDcmVhdGluZyB3b3JraW5nIGRpcmVjdG9yeSIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjkyNiBsaWIvaW5kZXgudGNsOjY1IGxpYi9pbmRleC50Y2w6MTI3CisjOiBsaWIvaW5kZXgudGNsOjE5MworbXNnaWQgImZpbGVzIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTU1Cittc2dpZCAiSW5pdGlhbCBmaWxlIGNoZWNrb3V0IGZhaWxlZC4iCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5NzEKK21zZ2lkICJPcGVuIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTgxCittc2dpZCAiUmVwb3NpdG9yeToiCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMDMxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIG9wZW4gcmVwb3NpdG9yeSAlczoiCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjUzCittc2dpZCAiVGhpcyBEZXRhY2hlZCBDaGVja291dCIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6NjAKK21zZ2lkICJSZXZpc2lvbiBFeHByZXNzaW9uOiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6NzQKK21zZ2lkICJMb2NhbCBCcmFuY2giCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjc5Cittc2dpZCAiVHJhY2tpbmcgQnJhbmNoIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDo4NCBsaWIvY2hvb3NlX3Jldi50Y2w6NTM4Cittc2dpZCAiVGFnIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDozMTcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIHJldmlzaW9uOiAlcyIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6MzM4Cittc2dpZCAiTm8gcmV2aXNpb24gc2VsZWN0ZWQuIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDozNDYKK21zZ2lkICJSZXZpc2lvbiBleHByZXNzaW9uIGlzIGVtcHR5LiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6NTMxCittc2dpZCAiVXBkYXRlZCIKK21zZ3N0ciAiIgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6NTU5Cittc2dpZCAiVVJMIgorbXNnc3RyICIiCisKKyM6IGxpYi9jb21taXQudGNsOjkKK21zZ2lkICIiCisiVGhlcmUgaXMgbm90aGluZyB0byBhbWVuZC5cbiIKKyJcbiIKKyJZb3UgYXJlIGFib3V0IHRvIGNyZWF0ZSB0aGUgaW5pdGlhbCBjb21taXQuICBUaGVyZSBpcyBubyBjb21taXQgYmVmb3JlIHRoaXMgIgorInRvIGFtZW5kLlxuIgorbXNnc3RyICIiCisKKyM6IGxpYi9jb21taXQudGNsOjE4Cittc2dpZCAiIgorIkNhbm5vdCBhbWVuZCB3aGlsZSBtZXJnaW5nLlxuIgorIlxuIgorIllvdSBhcmUgY3VycmVudGx5IGluIHRoZSBtaWRkbGUgb2YgYSBtZXJnZSB0aGF0IGhhcyBub3QgYmVlbiBmdWxseSAiCisiY29tcGxldGVkLiAgWW91IGNhbm5vdCBhbWVuZCB0aGUgcHJpb3IgY29tbWl0IHVubGVzcyB5b3UgZmlyc3QgYWJvcnQgdGhlICIKKyJjdXJyZW50IG1lcmdlIGFjdGl2aXR5LlxuIgorbXNnc3RyICIiCisKKyM6IGxpYi9jb21taXQudGNsOjQ5Cittc2dpZCAiRXJyb3IgbG9hZGluZyBjb21taXQgZGF0YSBmb3IgYW1lbmQ6IgorbXNnc3RyICIiCisKKyM6IGxpYi9jb21taXQudGNsOjc2Cittc2dpZCAiVW5hYmxlIHRvIG9idGFpbiB5b3VyIGlkZW50aXR5OiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY29tbWl0LnRjbDo4MQorbXNnaWQgIkludmFsaWQgR0lUX0NPTU1JVFRFUl9JREVOVDoiCittc2dzdHIgIiIKKworIzogbGliL2NvbW1pdC50Y2w6MTMzCittc2dpZCAiIgorIkxhc3Qgc2Nhbm5lZCBzdGF0ZSBkb2VzIG5vdCBtYXRjaCByZXBvc2l0b3J5IHN0YXRlLlxuIgorIlxuIgorIkFub3RoZXIgR2l0IHByb2dyYW0gaGFzIG1vZGlmaWVkIHRoaXMgcmVwb3NpdG9yeSBzaW5jZSB0aGUgbGFzdCBzY2FuLiAgQSAiCisicmVzY2FuIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSBhbm90aGVyIGNvbW1pdCBjYW4gYmUgY3JlYXRlZC5cbiIKKyJcbiIKKyJUaGUgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIG5vdy5cbiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY29tbWl0LnRjbDoxNTQKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiVW5tZXJnZWQgZmlsZXMgY2Fubm90IGJlIGNvbW1pdHRlZC5cbiIKKyJcbiIKKyJGaWxlICVzIGhhcyBtZXJnZSBjb25mbGljdHMuICBZb3UgbXVzdCByZXNvbHZlIHRoZW0gYW5kIHN0YWdlIHRoZSBmaWxlICIKKyJiZWZvcmUgY29tbWl0dGluZy5cbiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY29tbWl0LnRjbDoxNjIKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiVW5rbm93biBmaWxlIHN0YXRlICVzIGRldGVjdGVkLlxuIgorIlxuIgorIkZpbGUgJXMgY2Fubm90IGJlIGNvbW1pdHRlZCBieSB0aGlzIHByb2dyYW0uXG4iCittc2dzdHIgIiIKKworIzogbGliL2NvbW1pdC50Y2w6MTcwCittc2dpZCAiIgorIk5vIGNoYW5nZXMgdG8gY29tbWl0LlxuIgorIlxuIgorIllvdSBtdXN0IHN0YWdlIGF0IGxlYXN0IDEgZmlsZSBiZWZvcmUgeW91IGNhbiBjb21taXQuXG4iCittc2dzdHIgIiIKKworIzogbGliL2NvbW1pdC50Y2w6MTgzCittc2dpZCAiIgorIlBsZWFzZSBzdXBwbHkgYSBjb21taXQgbWVzc2FnZS5cbiIKKyJcbiIKKyJBIGdvb2QgY29tbWl0IG1lc3NhZ2UgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuIgorIlxuIgorIi0gRmlyc3QgbGluZTogRGVzY3JpYmUgaW4gb25lIHNlbnRlbmNlIHdoYXQgeW91IGRpZC5cbiIKKyItIFNlY29uZCBsaW5lOiBCbGFua1xuIgorIi0gUmVtYWluaW5nIGxpbmVzOiBEZXNjcmliZSB3aHkgdGhpcyBjaGFuZ2UgaXMgZ29vZC5cbiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY29tbWl0LnRjbDoyMDcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJ3YXJuaW5nOiBUY2wgZG9lcyBub3Qgc3VwcG9ydCBlbmNvZGluZyAnJXMnLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY29tbWl0LnRjbDoyMjEKK21zZ2lkICJDYWxsaW5nIHByZS1jb21taXQgaG9vay4uLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY29tbWl0LnRjbDoyMzYKK21zZ2lkICJDb21taXQgZGVjbGluZWQgYnkgcHJlLWNvbW1pdCBob29rLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY29tbWl0LnRjbDoyNTkKK21zZ2lkICJDYWxsaW5nIGNvbW1pdC1tc2cgaG9vay4uLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY29tbWl0LnRjbDoyNzQKK21zZ2lkICJDb21taXQgZGVjbGluZWQgYnkgY29tbWl0LW1zZyBob29rLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY29tbWl0LnRjbDoyODcKK21zZ2lkICJDb21taXR0aW5nIGNoYW5nZXMuLi4iCittc2dzdHIgIiIKKworIzogbGliL2NvbW1pdC50Y2w6MzAzCittc2dpZCAid3JpdGUtdHJlZSBmYWlsZWQ6IgorbXNnc3RyICIiCisKKyM6IGxpYi9jb21taXQudGNsOjMwNCBsaWIvY29tbWl0LnRjbDozNDggbGliL2NvbW1pdC50Y2w6MzY4Cittc2dpZCAiQ29tbWl0IGZhaWxlZC4iCittc2dzdHIgIiIKKworIzogbGliL2NvbW1pdC50Y2w6MzIxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQ29tbWl0ICVzIGFwcGVhcnMgdG8gYmUgY29ycnVwdCIKK21zZ3N0ciAiIgorCisjOiBsaWIvY29tbWl0LnRjbDozMjYKK21zZ2lkICIiCisiTm8gY2hhbmdlcyB0byBjb21taXQuXG4iCisiXG4iCisiTm8gZmlsZXMgd2VyZSBtb2RpZmllZCBieSB0aGlzIGNvbW1pdCBhbmQgaXQgd2FzIG5vdCBhIG1lcmdlIGNvbW1pdC5cbiIKKyJcbiIKKyJBIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBub3cuXG4iCittc2dzdHIgIiIKKworIzogbGliL2NvbW1pdC50Y2w6MzMzCittc2dpZCAiTm8gY2hhbmdlcyB0byBjb21taXQuIgorbXNnc3RyICIiCisKKyM6IGxpYi9jb21taXQudGNsOjM0NworbXNnaWQgImNvbW1pdC10cmVlIGZhaWxlZDoiCittc2dzdHIgIiIKKworIzogbGliL2NvbW1pdC50Y2w6MzY3Cittc2dpZCAidXBkYXRlLXJlZiBmYWlsZWQ6IgorbXNnc3RyICIiCisKKyM6IGxpYi9jb21taXQudGNsOjQ1NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkNyZWF0ZWQgY29tbWl0ICVzOiAlcyIKK21zZ3N0ciAiIgorCisjOiBsaWIvY29uc29sZS50Y2w6NTkKK21zZ2lkICJXb3JraW5nLi4uIHBsZWFzZSB3YWl0Li4uIgorbXNnc3RyICIiCisKKyM6IGxpYi9jb25zb2xlLnRjbDoxODYKK21zZ2lkICJTdWNjZXNzIgorbXNnc3RyICIiCisKKyM6IGxpYi9jb25zb2xlLnRjbDoyMDAKK21zZ2lkICJFcnJvcjogQ29tbWFuZCBGYWlsZWQiCittc2dzdHIgIiIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0MworbXNnaWQgIk51bWJlciBvZiBsb29zZSBvYmplY3RzIgorbXNnc3RyICIiCisKKyM6IGxpYi9kYXRhYmFzZS50Y2w6NDQKK21zZ2lkICJEaXNrIHNwYWNlIHVzZWQgYnkgbG9vc2Ugb2JqZWN0cyIKK21zZ3N0ciAiIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQ1Cittc2dpZCAiTnVtYmVyIG9mIHBhY2tlZCBvYmplY3RzIgorbXNnc3RyICIiCisKKyM6IGxpYi9kYXRhYmFzZS50Y2w6NDYKK21zZ2lkICJOdW1iZXIgb2YgcGFja3MiCittc2dzdHIgIiIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0NworbXNnaWQgIkRpc2sgc3BhY2UgdXNlZCBieSBwYWNrZWQgb2JqZWN0cyIKK21zZ3N0ciAiIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQ4Cittc2dpZCAiUGFja2VkIG9iamVjdHMgd2FpdGluZyBmb3IgcHJ1bmluZyIKK21zZ3N0ciAiIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQ5Cittc2dpZCAiR2FyYmFnZSBmaWxlcyIKK21zZ3N0ciAiIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjcyCittc2dpZCAiQ29tcHJlc3NpbmcgdGhlIG9iamVjdCBkYXRhYmFzZSIKK21zZ3N0ciAiIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjgzCittc2dpZCAiVmVyaWZ5aW5nIHRoZSBvYmplY3QgZGF0YWJhc2Ugd2l0aCBmc2NrLW9iamVjdHMiCittc2dzdHIgIiIKKworIzogbGliL2RhdGFiYXNlLnRjbDoxMDgKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiVGhpcyByZXBvc2l0b3J5IGN1cnJlbnRseSBoYXMgYXBwcm94aW1hdGVseSAlaSBsb29zZSBvYmplY3RzLlxuIgorIlxuIgorIlRvIG1haW50YWluIG9wdGltYWwgcGVyZm9ybWFuY2UgaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgY29tcHJlc3MgIgorInRoZSBkYXRhYmFzZSB3aGVuIG1vcmUgdGhhbiAlaSBsb29zZSBvYmplY3RzIGV4aXN0LlxuIgorIlxuIgorIkNvbXByZXNzIHRoZSBkYXRhYmFzZSBub3c/IgorbXNnc3RyICIiCisKKyM6IGxpYi9kYXRlLnRjbDoyNQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkludmFsaWQgZGF0ZSBmcm9tIEdpdDogJXMiCittc2dzdHIgIiIKKworIzogbGliL2RpZmYudGNsOjQyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIk5vIGRpZmZlcmVuY2VzIGRldGVjdGVkLlxuIgorIlxuIgorIiVzIGhhcyBubyBjaGFuZ2VzLlxuIgorIlxuIgorIlRoZSBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGlzIGZpbGUgd2FzIHVwZGF0ZWQgYnkgYW5vdGhlciBhcHBsaWNhdGlvbiwgYnV0ICIKKyJ0aGUgY29udGVudCB3aXRoaW4gdGhlIGZpbGUgd2FzIG5vdCBjaGFuZ2VkLlxuIgorIlxuIgorIkEgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIHRvIGZpbmQgb3RoZXIgZmlsZXMgd2hpY2ggbWF5IGhhdmUgIgorInRoZSBzYW1lIHN0YXRlLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvZGlmZi50Y2w6ODEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJMb2FkaW5nIGRpZmYgb2YgJXMuLi4iCittc2dzdHIgIiIKKworIzogbGliL2RpZmYudGNsOjExNCBsaWIvZGlmZi50Y2w6MTg0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGRpc3BsYXkgJXMiCittc2dzdHIgIiIKKworIzogbGliL2RpZmYudGNsOjExNQorbXNnaWQgIkVycm9yIGxvYWRpbmcgZmlsZToiCittc2dzdHIgIiIKKworIzogbGliL2RpZmYudGNsOjEyMgorbXNnaWQgIkdpdCBSZXBvc2l0b3J5IChzdWJwcm9qZWN0KSIKK21zZ3N0ciAiIgorCisjOiBsaWIvZGlmZi50Y2w6MTM0Cittc2dpZCAiKiBCaW5hcnkgZmlsZSAobm90IHNob3dpbmcgY29udGVudCkuIgorbXNnc3RyICIiCisKKyM6IGxpYi9kaWZmLnRjbDoxODUKK21zZ2lkICJFcnJvciBsb2FkaW5nIGRpZmY6IgorbXNnc3RyICIiCisKKyM6IGxpYi9kaWZmLnRjbDozMDMKK21zZ2lkICJGYWlsZWQgdG8gdW5zdGFnZSBzZWxlY3RlZCBodW5rLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvZGlmZi50Y2w6MzEwCittc2dpZCAiRmFpbGVkIHRvIHN0YWdlIHNlbGVjdGVkIGh1bmsuIgorbXNnc3RyICIiCisKKyM6IGxpYi9lcnJvci50Y2w6MjAgbGliL2Vycm9yLnRjbDoxMTQKK21zZ2lkICJlcnJvciIKK21zZ3N0ciAiIgorCisjOiBsaWIvZXJyb3IudGNsOjM2Cittc2dpZCAid2FybmluZyIKK21zZ3N0ciAiIgorCisjOiBsaWIvZXJyb3IudGNsOjk0Cittc2dpZCAiWW91IG11c3QgY29ycmVjdCB0aGUgYWJvdmUgZXJyb3JzIGJlZm9yZSBjb21taXR0aW5nLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvaW5kZXgudGNsOjYKK21zZ2lkICJVbmFibGUgdG8gdW5sb2NrIHRoZSBpbmRleC4iCittc2dzdHIgIiIKKworIzogbGliL2luZGV4LnRjbDoxNQorbXNnaWQgIkluZGV4IEVycm9yIgorbXNnc3RyICIiCisKKyM6IGxpYi9pbmRleC50Y2w6MjEKK21zZ2lkICIiCisiVXBkYXRpbmcgdGhlIEdpdCBpbmRleCBmYWlsZWQuICBBIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB0byAiCisicmVzeW5jaHJvbml6ZSBnaXQtZ3VpLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvaW5kZXgudGNsOjI3Cittc2dpZCAiQ29udGludWUiCittc2dzdHIgIiIKKworIzogbGliL2luZGV4LnRjbDozMQorbXNnaWQgIlVubG9jayBJbmRleCIKK21zZ3N0ciAiIgorCisjOiBsaWIvaW5kZXgudGNsOjI4MgorIywgdGNsLWZvcm1hdAorbXNnaWQgIlVuc3RhZ2luZyAlcyBmcm9tIGNvbW1pdCIKK21zZ3N0ciAiIgorCisjOiBsaWIvaW5kZXgudGNsOjMxMworbXNnaWQgIlJlYWR5IHRvIGNvbW1pdC4iCittc2dzdHIgIiIKKworIzogbGliL2luZGV4LnRjbDozMjYKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJBZGRpbmcgJXMiCittc2dzdHIgIiIKKworIzogbGliL2luZGV4LnRjbDozODEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJSZXZlcnQgY2hhbmdlcyBpbiBmaWxlICVzPyIKK21zZ3N0ciAiIgorCisjOiBsaWIvaW5kZXgudGNsOjM4MworIywgdGNsLWZvcm1hdAorbXNnaWQgIlJldmVydCBjaGFuZ2VzIGluIHRoZXNlICVpIGZpbGVzPyIKK21zZ3N0ciAiIgorCisjOiBsaWIvaW5kZXgudGNsOjM5MQorbXNnaWQgIkFueSB1bnN0YWdlZCBjaGFuZ2VzIHdpbGwgYmUgcGVybWFuZW50bHkgbG9zdCBieSB0aGUgcmV2ZXJ0LiIKK21zZ3N0ciAiIgorCisjOiBsaWIvaW5kZXgudGNsOjM5NAorbXNnaWQgIkRvIE5vdGhpbmciCittc2dzdHIgIiIKKworIzogbGliL21lcmdlLnRjbDoxMworbXNnaWQgIiIKKyJDYW5ub3QgbWVyZ2Ugd2hpbGUgYW1lbmRpbmcuXG4iCisiXG4iCisiWW91IG11c3QgZmluaXNoIGFtZW5kaW5nIHRoaXMgY29tbWl0IGJlZm9yZSBzdGFydGluZyBhbnkgdHlwZSBvZiBtZXJnZS5cbiIKK21zZ3N0ciAiIgorCisjOiBsaWIvbWVyZ2UudGNsOjI3Cittc2dpZCAiIgorIkxhc3Qgc2Nhbm5lZCBzdGF0ZSBkb2VzIG5vdCBtYXRjaCByZXBvc2l0b3J5IHN0YXRlLlxuIgorIlxuIgorIkFub3RoZXIgR2l0IHByb2dyYW0gaGFzIG1vZGlmaWVkIHRoaXMgcmVwb3NpdG9yeSBzaW5jZSB0aGUgbGFzdCBzY2FuLiAgQSAiCisicmVzY2FuIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSBhIG1lcmdlIGNhbiBiZSBwZXJmb3JtZWQuXG4iCisiXG4iCisiVGhlIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBub3cuXG4iCittc2dzdHIgIiIKKworIzogbGliL21lcmdlLnRjbDo0NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJZb3UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBjb25mbGljdGVkIG1lcmdlLlxuIgorIlxuIgorIkZpbGUgJXMgaGFzIG1lcmdlIGNvbmZsaWN0cy5cbiIKKyJcbiIKKyJZb3UgbXVzdCByZXNvbHZlIHRoZW0sIHN0YWdlIHRoZSBmaWxlLCBhbmQgY29tbWl0IHRvIGNvbXBsZXRlIHRoZSBjdXJyZW50ICIKKyJtZXJnZS4gIE9ubHkgdGhlbiBjYW4geW91IGJlZ2luIGFub3RoZXIgbWVyZ2UuXG4iCittc2dzdHIgIiIKKworIzogbGliL21lcmdlLnRjbDo1NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJZb3UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBjaGFuZ2UuXG4iCisiXG4iCisiRmlsZSAlcyBpcyBtb2RpZmllZC5cbiIKKyJcbiIKKyJZb3Ugc2hvdWxkIGNvbXBsZXRlIHRoZSBjdXJyZW50IGNvbW1pdCBiZWZvcmUgc3RhcnRpbmcgYSBtZXJnZS4gIERvaW5nIHNvICIKKyJ3aWxsIGhlbHAgeW91IGFib3J0IGEgZmFpbGVkIG1lcmdlLCBzaG91bGQgdGhlIG5lZWQgYXJpc2UuXG4iCittc2dzdHIgIiIKKworIzogbGliL21lcmdlLnRjbDoxMDYKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIlcyBvZiAlcyIKK21zZ3N0ciAiIgorCisjOiBsaWIvbWVyZ2UudGNsOjExOQorIywgdGNsLWZvcm1hdAorbXNnaWQgIk1lcmdpbmcgJXMgYW5kICVzLi4uIgorbXNnc3RyICIiCisKKyM6IGxpYi9tZXJnZS50Y2w6MTMwCittc2dpZCAiTWVyZ2UgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4iCittc2dzdHIgIiIKKworIzogbGliL21lcmdlLnRjbDoxMzIKK21zZ2lkICJNZXJnZSBmYWlsZWQuICBDb25mbGljdCByZXNvbHV0aW9uIGlzIHJlcXVpcmVkLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvbWVyZ2UudGNsOjE1NworIywgdGNsLWZvcm1hdAorbXNnaWQgIk1lcmdlIEludG8gJXMiCittc2dzdHIgIiIKKworIzogbGliL21lcmdlLnRjbDoxNzYKK21zZ2lkICJSZXZpc2lvbiBUbyBNZXJnZSIKK21zZ3N0ciAiIgorCisjOiBsaWIvbWVyZ2UudGNsOjIxMQorbXNnaWQgIiIKKyJDYW5ub3QgYWJvcnQgd2hpbGUgYW1lbmRpbmcuXG4iCisiXG4iCisiWW91IG11c3QgZmluaXNoIGFtZW5kaW5nIHRoaXMgY29tbWl0LlxuIgorbXNnc3RyICIiCisKKyM6IGxpYi9tZXJnZS50Y2w6MjIxCittc2dpZCAiIgorIkFib3J0IG1lcmdlP1xuIgorIlxuIgorIkFib3J0aW5nIHRoZSBjdXJyZW50IG1lcmdlIHdpbGwgY2F1c2UgKkFMTCogdW5jb21taXR0ZWQgY2hhbmdlcyB0byBiZSBsb3N0LlxuIgorIlxuIgorIkNvbnRpbnVlIHdpdGggYWJvcnRpbmcgdGhlIGN1cnJlbnQgbWVyZ2U/IgorbXNnc3RyICIiCisKKyM6IGxpYi9tZXJnZS50Y2w6MjI3Cittc2dpZCAiIgorIlJlc2V0IGNoYW5nZXM/XG4iCisiXG4iCisiUmVzZXR0aW5nIHRoZSBjaGFuZ2VzIHdpbGwgY2F1c2UgKkFMTCogdW5jb21taXR0ZWQgY2hhbmdlcyB0byBiZSBsb3N0LlxuIgorIlxuIgorIkNvbnRpbnVlIHdpdGggcmVzZXR0aW5nIHRoZSBjdXJyZW50IGNoYW5nZXM/IgorbXNnc3RyICIiCisKKyM6IGxpYi9tZXJnZS50Y2w6MjM4Cittc2dpZCAiQWJvcnRpbmciCittc2dzdHIgIiIKKworIzogbGliL21lcmdlLnRjbDoyMzgKK21zZ2lkICJmaWxlcyByZXNldCIKK21zZ3N0ciAiIgorCisjOiBsaWIvbWVyZ2UudGNsOjI2NQorbXNnaWQgIkFib3J0IGZhaWxlZC4iCittc2dzdHIgIiIKKworIzogbGliL21lcmdlLnRjbDoyNjcKK21zZ2lkICJBYm9ydCBjb21wbGV0ZWQuICBSZWFkeS4iCittc2dzdHIgIiIKKworIzogbGliL29wdGlvbi50Y2w6OTUKK21zZ2lkICJSZXN0b3JlIERlZmF1bHRzIgorbXNnc3RyICIiCisKKyM6IGxpYi9vcHRpb24udGNsOjk5Cittc2dpZCAiU2F2ZSIKK21zZ3N0ciAiIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMDkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIlcyBSZXBvc2l0b3J5IgorbXNnc3RyICIiCisKKyM6IGxpYi9vcHRpb24udGNsOjExMAorbXNnaWQgIkdsb2JhbCAoQWxsIFJlcG9zaXRvcmllcykiCittc2dzdHIgIiIKKworIzogbGliL29wdGlvbi50Y2w6MTE2Cittc2dpZCAiVXNlciBOYW1lIgorbXNnc3RyICIiCisKKyM6IGxpYi9vcHRpb24udGNsOjExNworbXNnaWQgIkVtYWlsIEFkZHJlc3MiCittc2dzdHIgIiIKKworIzogbGliL29wdGlvbi50Y2w6MTE5Cittc2dpZCAiU3VtbWFyaXplIE1lcmdlIENvbW1pdHMiCittc2dzdHIgIiIKKworIzogbGliL29wdGlvbi50Y2w6MTIwCittc2dpZCAiTWVyZ2UgVmVyYm9zaXR5IgorbXNnc3RyICIiCisKKyM6IGxpYi9vcHRpb24udGNsOjEyMQorbXNnaWQgIlNob3cgRGlmZnN0YXQgQWZ0ZXIgTWVyZ2UiCittc2dzdHIgIiIKKworIzogbGliL29wdGlvbi50Y2w6MTIzCittc2dpZCAiVHJ1c3QgRmlsZSBNb2RpZmljYXRpb24gVGltZXN0YW1wcyIKK21zZ3N0ciAiIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMjQKK21zZ2lkICJQcnVuZSBUcmFja2luZyBCcmFuY2hlcyBEdXJpbmcgRmV0Y2giCittc2dzdHIgIiIKKworIzogbGliL29wdGlvbi50Y2w6MTI1Cittc2dpZCAiTWF0Y2ggVHJhY2tpbmcgQnJhbmNoZXMiCittc2dzdHIgIiIKKworIzogbGliL29wdGlvbi50Y2w6MTI2Cittc2dpZCAiTnVtYmVyIG9mIERpZmYgQ29udGV4dCBMaW5lcyIKK21zZ3N0ciAiIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMjcKK21zZ2lkICJDb21taXQgTWVzc2FnZSBUZXh0IFdpZHRoIgorbXNnc3RyICIiCisKKyM6IGxpYi9vcHRpb24udGNsOjEyOAorbXNnaWQgIk5ldyBCcmFuY2ggTmFtZSBUZW1wbGF0ZSIKK21zZ3N0ciAiIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxOTIKK21zZ2lkICJTcGVsbGluZyBEaWN0aW9uYXJ5OiIKK21zZ3N0ciAiIgorCisjOiBsaWIvb3B0aW9uLnRjbDoyMTYKK21zZ2lkICJDaGFuZ2UgRm9udCIKK21zZ3N0ciAiIgorCisjOiBsaWIvb3B0aW9uLnRjbDoyMjAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJDaG9vc2UgJXMiCittc2dzdHIgIiIKKworIzogbGliL29wdGlvbi50Y2w6MjI2Cittc2dpZCAicHQuIgorbXNnc3RyICIiCisKKyM6IGxpYi9vcHRpb24udGNsOjI0MAorbXNnaWQgIlByZWZlcmVuY2VzIgorbXNnc3RyICIiCisKKyM6IGxpYi9vcHRpb24udGNsOjI3NQorbXNnaWQgIkZhaWxlZCB0byBjb21wbGV0ZWx5IHNhdmUgb3B0aW9uczoiCittc2dzdHIgIiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoyOSBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjM0Cittc2dpZCAiRGVsZXRlIFJlbW90ZSBCcmFuY2giCittc2dzdHIgIiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDo0NworbXNnaWQgIkZyb20gUmVwb3NpdG9yeSIKK21zZ3N0ciAiIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjUwIGxpYi90cmFuc3BvcnQudGNsOjEyMworbXNnaWQgIlJlbW90ZToiCittc2dzdHIgIiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDo2NiBsaWIvdHJhbnNwb3J0LnRjbDoxMzgKK21zZ2lkICJBcmJpdHJhcnkgVVJMOiIKK21zZ3N0ciAiIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjg0Cittc2dpZCAiQnJhbmNoZXMiCittc2dzdHIgIiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoxMDkKK21zZ2lkICJEZWxldGUgT25seSBJZiIKK21zZ3N0ciAiIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjExMQorbXNnaWQgIk1lcmdlZCBJbnRvOiIKK21zZ3N0ciAiIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjExOQorbXNnaWQgIkFsd2F5cyAoRG8gbm90IHBlcmZvcm0gbWVyZ2UgY2hlY2tzKSIKK21zZ3N0ciAiIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjE1MgorbXNnaWQgIkEgYnJhbmNoIGlzIHJlcXVpcmVkIGZvciAnTWVyZ2VkIEludG8nLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjE4NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJUaGUgZm9sbG93aW5nIGJyYW5jaGVzIGFyZSBub3QgY29tcGxldGVseSBtZXJnZWQgaW50byAlczpcbiIKKyJcbiIKKyIgLSAlcyIKK21zZ3N0ciAiIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjE4OQorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJPbmUgb3IgbW9yZSBvZiB0aGUgbWVyZ2UgdGVzdHMgZmFpbGVkIGJlY2F1c2UgeW91IGhhdmUgbm90IGZldGNoZWQgdGhlICIKKyJuZWNlc3NhcnkgY29tbWl0cy4gIFRyeSBmZXRjaGluZyBmcm9tICVzIGZpcnN0LiIKK21zZ3N0ciAiIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjIwNworbXNnaWQgIlBsZWFzZSBzZWxlY3Qgb25lIG9yIG1vcmUgYnJhbmNoZXMgdG8gZGVsZXRlLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjIxNgorbXNnaWQgIiIKKyJSZWNvdmVyaW5nIGRlbGV0ZWQgYnJhbmNoZXMgaXMgZGlmZmljdWx0LlxuIgorIlxuIgorIkRlbGV0ZSB0aGUgc2VsZWN0ZWQgYnJhbmNoZXM/IgorbXNnc3RyICIiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MjI2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRGVsZXRpbmcgYnJhbmNoZXMgZnJvbSAlcyIKK21zZ3N0ciAiIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjI4NgorbXNnaWQgIk5vIHJlcG9zaXRvcnkgc2VsZWN0ZWQuIgorbXNnc3RyICIiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MjkxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgJXMuLi4iCittc2dzdHIgIiIKKworIzogbGliL3JlbW90ZS50Y2w6MTY1Cittc2dpZCAiUHJ1bmUgZnJvbSIKK21zZ3N0ciAiIgorCisjOiBsaWIvcmVtb3RlLnRjbDoxNzAKK21zZ2lkICJGZXRjaCBmcm9tIgorbXNnc3RyICIiCisKKyM6IGxpYi9yZW1vdGUudGNsOjIxMworbXNnaWQgIlB1c2ggdG8iCittc2dzdHIgIiIKKworIzogbGliL3Nob3J0Y3V0LnRjbDoyMCBsaWIvc2hvcnRjdXQudGNsOjYxCittc2dpZCAiQ2Fubm90IHdyaXRlIHNob3J0Y3V0OiIKK21zZ3N0ciAiIgorCisjOiBsaWIvc2hvcnRjdXQudGNsOjEzNgorbXNnaWQgIkNhbm5vdCB3cml0ZSBpY29uOiIKK21zZ3N0ciAiIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6NTcKK21zZ2lkICJVbnN1cHBvcnRlZCBzcGVsbCBjaGVja2VyIgorbXNnc3RyICIiCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDo2NQorbXNnaWQgIlNwZWxsIGNoZWNraW5nIGlzIHVuYXZhaWxhYmxlIgorbXNnc3RyICIiCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDo2OAorbXNnaWQgIkludmFsaWQgc3BlbGwgY2hlY2tpbmcgY29uZmlndXJhdGlvbiIKK21zZ3N0ciAiIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6NzAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJSZXZlcnRpbmcgZGljdGlvbmFyeSB0byAlcy4iCittc2dzdHIgIiIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjczCittc2dpZCAiU3BlbGwgY2hlY2tlciBzaWxlbnRseSBmYWlsZWQgb24gc3RhcnR1cCIKK21zZ3N0ciAiIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6ODAKK21zZ2lkICJVbnJlY29nbml6ZWQgc3BlbGwgY2hlY2tlciIKK21zZ3N0ciAiIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6MTgwCittc2dpZCAiTm8gU3VnZ2VzdGlvbnMiCittc2dzdHIgIiIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjM4MQorbXNnaWQgIlVuZXhwZWN0ZWQgRU9GIGZyb20gc3BlbGwgY2hlY2tlciIKK21zZ3N0ciAiIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6Mzg1Cittc2dpZCAiU3BlbGwgQ2hlY2tlciBGYWlsZWQiCittc2dzdHIgIiIKKworIzogbGliL3N0YXR1c19iYXIudGNsOjgzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiJXMgLi4uICUqaSBvZiAlKmkgJXMgKCUzaSUlKSIKK21zZ3N0ciAiIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDo2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiZmV0Y2ggJXMiCittc2dzdHIgIiIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6NworIywgdGNsLWZvcm1hdAorbXNnaWQgIkZldGNoaW5nIG5ldyBjaGFuZ2VzIGZyb20gJXMiCittc2dzdHIgIiIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTgKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJyZW1vdGUgcHJ1bmUgJXMiCittc2dzdHIgIiIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJQcnVuaW5nIHRyYWNraW5nIGJyYW5jaGVzIGRlbGV0ZWQgZnJvbSAlcyIKK21zZ3N0ciAiIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoyNSBsaWIvdHJhbnNwb3J0LnRjbDo3MQorIywgdGNsLWZvcm1hdAorbXNnaWQgInB1c2ggJXMiCittc2dzdHIgIiIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MjYKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJQdXNoaW5nIGNoYW5nZXMgdG8gJXMiCittc2dzdHIgIiIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6NzIKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJQdXNoaW5nICVzICVzIHRvICVzIgorbXNnc3RyICIiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjg5Cittc2dpZCAiUHVzaCBCcmFuY2hlcyIKK21zZ3N0ciAiIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoxMDMKK21zZ2lkICJTb3VyY2UgQnJhbmNoZXMiCittc2dzdHIgIiIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTIwCittc2dpZCAiRGVzdGluYXRpb24gUmVwb3NpdG9yeSIKK21zZ3N0ciAiIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoxNTgKK21zZ2lkICJUcmFuc2ZlciBPcHRpb25zIgorbXNnc3RyICIiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjE2MAorbXNnaWQgIkZvcmNlIG92ZXJ3cml0ZSBleGlzdGluZyBicmFuY2ggKG1heSBkaXNjYXJkIGNoYW5nZXMpIgorbXNnc3RyICIiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjE2NAorbXNnaWQgIlVzZSB0aGluIHBhY2sgKGZvciBzbG93IG5ldHdvcmsgY29ubmVjdGlvbnMpIgorbXNnc3RyICIiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjE2OAorbXNnaWQgIkluY2x1ZGUgdGFncyIKK21zZ3N0ciAiIgpkaWZmIC0tZ2l0IGEvZ2l0LWd1aS9wby9nbG9zc2FyeS9NYWtlZmlsZSBiL2dpdC1ndWkvcG8vZ2xvc3NhcnkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ5YWEyZQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvcG8vZ2xvc3NhcnkvTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACitQT19URU1QTEFURSA9IGdpdC1ndWktZ2xvc3NhcnkucG90CisKK0FMTF9QT0ZJTEVTID0gJCh3aWxkY2FyZCAqLnBvKQorCiskKFBPX1RFTVBMQVRFKTogJChzdWJzdCAucG90LC50eHQsJChQT19URU1QTEFURSkpCisJLi90eHQtdG8tcG90LnNoICQ8ID4gJEAKKwordXBkYXRlLXBvOjogZ2l0LWd1aS1nbG9zc2FyeS5wb3QKKwkkKGZvcmVhY2ggcCwgJChBTExfUE9GSUxFUyksIGVjaG8gVXBkYXRpbmcgJHAgOyBtc2dtZXJnZSAtVSAkcCAkKFBPX1RFTVBMQVRFKSA7ICkKZGlmZiAtLWdpdCBhL2dpdC1ndWkvcG8vZ2xvc3NhcnkvZGUucG8gYi9naXQtZ3VpL3BvL2dsb3NzYXJ5L2RlLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NzY0ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtZ3VpL3BvL2dsb3NzYXJ5L2RlLnBvCkBAIC0wLDAgKzEsMTg5IEBACisjIFRyYW5zbGF0aW9uIG9mIGdpdC1ndWkgZ2xvc3NhcnkgdG8gR2VybWFuCisjIENvcHlyaWdodCAoQykgMjAwNyBTaGF3biBQZWFyY2UsIGV0IGFsLgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ2l0IHBhY2thZ2UuCisjIENocmlzdGlhbiBTdGltbWluZyA8c3RpbW1pbmdAdHVoaC5kZT4sIDIwMDcKKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdpdC1ndWkgZ2xvc3NhcnlcbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAwOC0wMS0wNyAyMToyMCswMTAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwOC0wMi0xNiAyMTo0OCswMTAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBDaHJpc3RpYW4gU3RpbW1pbmcgPHN0aW1taW5nQHR1aGguZGU+XG4iCisiTGFuZ3VhZ2UtVGVhbTogR2VybWFuIFxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorCisjLiAiRW5nbGlzaCBEZWZpbml0aW9uIChEZWFyIHRyYW5zbGF0b3I6IFRoaXMgZmlsZSB3aWxsIG5ldmVyIGJlIHZpc2libGUgdG8gdGhlIHVzZXIhIEl0IHNob3VsZCBvbmx5IHNlcnZlIGFzIGEgdG9vbCBmb3IgeW91LCB0aGUgdHJhbnNsYXRvci4gTm90aGluZyBtb3JlLikiCittc2dpZCAiIgorIkVuZ2xpc2ggVGVybSAoRGVhciB0cmFuc2xhdG9yOiBUaGlzIGZpbGUgd2lsbCBuZXZlciBiZSB2aXNpYmxlIHRvIHRoZSB1c2VyISkiCittc2dzdHIgIiIKKyJEZXV0c2NoZSDDnGJlcnNldHp1bmcuXG4iCisiQW5kZXJlIGRldXRzY2hlIFNDTTpcbiIKKyIgIGh0dHA6Ly90b3J0b2lzZXN2bi5uZXQvZG9jcy9yZWxlYXNlL1RvcnRvaXNlU1ZOX2RlL2luZGV4Lmh0bWwgdW5kIGh0dHA6Ly8iCisidG9ydG9pc2Vzdm4udGlncmlzLm9yZy9zdm4vdG9ydG9pc2Vzdm4vdHJ1bmsvTGFuZ3VhZ2VzL1RvcnRvaXNlX2RlLnBvICIKKyIodXNlcm5hbWU9Z3Vlc3QsIHBhc3N3b3JkIGVtcHR5LCBndXQpLFxuIgorIiAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9kZS1kZS9saWJyYXJ5L21zMTgxMDM4KHZzLjgwKS5hc3B4IChNUyBWaXN1YWwgIgorIlNvdXJjZSBTYWZlLCBrb21tZXJ6aWVsbCksXG4iCisiICBodHRwOi8vY3ZzYm9vay5yZWQtYmVhbi5jb20vdHJhbnNsYXRpb25zL2dlcm1hbi9LYXBfMDYuaHRtbCAiCisiKG1pdHRlbG3DpMOfaWcpLFxuIgorIiAgaHR0cDovL3RvcnRvaXNlY3ZzLmN2cy5zb3VyY2Vmb3JnZS5uZXQvdG9ydG9pc2VjdnMvcG8vVG9ydG9pc2VDVlMvZGVfREUucG8/IgorInZpZXc9bWFya3VwIChtaXR0ZWxtw6TDn2lnKSxcbiIKKyIgIGh0dHA6Ly9yYXBpZHN2bi50aWdyaXMub3JnL3N2bi9yYXBpZHN2bi90cnVuay9zcmMvbG9jYWxlL2RlL3JhcGlkc3ZuLnBvICIKKyIodXNlcm5hbWU9Z3Vlc3QsIHBhc3N3b3JkIGVtcHR5LCBzY2hsZWNodCkiCisKKyMuICIiCittc2dpZCAiYW1lbmQiCittc2dzdHIgIm5hY2hiZXNzZXJuIChlcmfDpG56ZW4pIgorCisjLiAiIgorbXNnaWQgImFubm90YXRlIgorbXNnc3RyICJhbm5vdGllcmVuIgorCisjLiAiQSAnYnJhbmNoJyBpcyBhbiBhY3RpdmUgbGluZSBvZiBkZXZlbG9wbWVudC4iCittc2dpZCAiYnJhbmNoIFtub3VuXSIKK21zZ3N0ciAiWndlaWciCisKKyMuICIiCittc2dpZCAiYnJhbmNoIFt2ZXJiXSIKK21zZ3N0ciAidmVyendlaWdlbiIKKworIy4gIiIKK21zZ2lkICJjaGVja291dCBbbm91bl0iCittc2dzdHIgIiIKKyJBcmJlaXRza29waWUgKEVyc3RlbGx1bmcgZWluZXIgQXJiZWl0c2tvcGllOyBBdXNjaGVjaz8gQXVzc3BpZWx1bmc/IEFicnVmPyAiCisiU291cmNlIFNhZmU6IEF1c2NoZWNrdm9yZ2FuZykiCisKKyMuICJUaGUgYWN0aW9uIG9mIHVwZGF0aW5nIHRoZSB3b3JraW5nIHRyZWUgdG8gYSByZXZpc2lvbiB3aGljaCB3YXMgc3RvcmVkIGluIHRoZSBvYmplY3QgZGF0YWJhc2UuIgorbXNnaWQgImNoZWNrb3V0IFt2ZXJiXSIKK21zZ3N0ciAiIgorIkFyYmVpdHNrb3BpZSBlcnN0ZWxsZW47IFp3ZWlnIHVtc3RlbGxlbiBbY2hlY2tvdXQgYSBicmFuY2hdIChhdXNjaGVja2VuPyAiCisiYXVzc3BpZWxlbj8gYWJydWZlbj8gU291cmNlIFNhZmU6IGF1c2NoZWNrZW4pIgorCisjLiAiIgorbXNnaWQgImNsb25lIFt2ZXJiXSIKK21zZ3N0ciAia2xvbmVuIgorCisjLiAiQSBzaW5nbGUgcG9pbnQgaW4gdGhlIGdpdCBoaXN0b3J5LiIKK21zZ2lkICJjb21taXQgW25vdW5dIgorbXNnc3RyICIiCisiVmVyc2lvbjsgRWludHJhZ3VuZzsgw4RuZGVydW5nIChCdWNodW5nPywgRWludHJhZ3VuZz8sIMOcYmVydHJhZ3VuZz8sICIKKyJTZW5kdW5nPywgw5xiZXJnYWJlPywgRWluc3BpZWx1bmc/LCBBYmxhZ2V2b3JnYW5nPykiCisKKyMuICJUaGUgYWN0aW9uIG9mIHN0b3JpbmcgYSBuZXcgc25hcHNob3Qgb2YgdGhlIHByb2plY3QncyBzdGF0ZSBpbiB0aGUgZ2l0IGhpc3RvcnkuIgorbXNnaWQgImNvbW1pdCBbdmVyYl0iCittc2dzdHIgIiIKKyJlaW50cmFnZW4gKFRvcnRvaXNlU1ZOOiDDvGJlcnRyYWdlbjsgU291cmNlIFNhZmU6IGVpbmNoZWNrZW47IHNlbmRlbj8sICIKKyLDvGJlcmdlYmVuPywgZWluc3BpZWxlbj8sIGVpbnBmbGVnZW4/LCBhYmxlZ2VuPykiCisKKyMuICIiCittc2dpZCAiZGlmZiBbbm91bl0iCittc2dzdHIgIlZlcmdsZWljaCAoU291cmNlIFNhZmU6IFVudGVyc2NoaWVkZSkiCisKKyMuICIiCittc2dpZCAiZGlmZiBbdmVyYl0iCittc2dzdHIgInZlcmdsZWljaGVuIgorCisjLiAiQSBmYXN0LWZvcndhcmQgaXMgYSBzcGVjaWFsIHR5cGUgb2YgbWVyZ2Ugd2hlcmUgeW91IGhhdmUgYSByZXZpc2lvbiBhbmQgeW91IGFyZSBtZXJnaW5nIGFub3RoZXIgYnJhbmNoJ3MgY2hhbmdlcyB0aGF0IGhhcHBlbiB0byBiZSBhIGRlc2NlbmRhbnQgb2Ygd2hhdCB5b3UgaGF2ZS4iCittc2dpZCAiZmFzdCBmb3J3YXJkIG1lcmdlIgorbXNnc3RyICJTY2huZWxsenVzYW1tZW5mw7xocnVuZyIKKworIy4gIkZldGNoaW5nIGEgYnJhbmNoIG1lYW5zIHRvIGdldCB0aGUgYnJhbmNoJ3MgaGVhZCBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnksIHRvIGZpbmQgb3V0IHdoaWNoIG9iamVjdHMgYXJlIG1pc3NpbmcgZnJvbSB0aGUgbG9jYWwgb2JqZWN0IGRhdGFiYXNlLCBhbmQgdG8gZ2V0IHRoZW0sIHRvby4iCittc2dpZCAiZmV0Y2giCittc2dzdHIgImFuZm9yZGVybiAoaG9sZW4/KSIKKworIy4gIk9uZSBjb250ZXh0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIGEgd2hvbGUgcGF0Y2gsIHdoaWNoIGNvbnNpc3RzIG9mIG1hbnkgc3VjaCBodW5rcyIKK21zZ2lkICJodW5rIgorbXNnc3RyICJLb250ZXh0IgorCisjLiAiQSBjb2xsZWN0aW9uIG9mIGZpbGVzLiBUaGUgaW5kZXggaXMgYSBzdG9yZWQgdmVyc2lvbiBvZiB5b3VyIHdvcmtpbmcgdHJlZS4iCittc2dpZCAiaW5kZXggKGluIGdpdC1ndWk6IHN0YWdpbmcgYXJlYSkiCittc2dzdHIgIkJlcmVpdHN0ZWxsdW5nIgorCisjLiAiQSBzdWNjZXNzZnVsIG1lcmdlIHJlc3VsdHMgaW4gdGhlIGNyZWF0aW9uIG9mIGEgbmV3IGNvbW1pdCByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZiB0aGUgbWVyZ2UuIgorbXNnaWQgIm1lcmdlIFtub3VuXSIKK21zZ3N0ciAiWnVzYW1tZW5mw7xocnVuZyIKKworIy4gIlRvIGJyaW5nIHRoZSBjb250ZW50cyBvZiBhbm90aGVyIGJyYW5jaCBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaC4iCittc2dpZCAibWVyZ2UgW3ZlcmJdIgorbXNnc3RyICJ6dXNhbW1lbmbDvGhyZW4iCisKKyMuICIiCittc2dpZCAibWVzc2FnZSIKK21zZ3N0ciAiQmVzY2hyZWlidW5nIChNZWxkdW5nPywgTmFjaHJpY2h0PzsgU291cmNlIFNhZmU6IEtvbW1lbnRhcikiCisKKyMuICJEZWxldGVzIGFsbCBzdGFsZSB0cmFja2luZyBicmFuY2hlcyB1bmRlciA8bmFtZT4uIFRoZXNlIHN0YWxlIGJyYW5jaGVzIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcmVtb3RlIHJlcG9zaXRvcnkgcmVmZXJlbmNlZCBieSA8bmFtZT4sIGJ1dCBhcmUgc3RpbGwgbG9jYWxseSBhdmFpbGFibGUgaW4gJ3JlbW90ZXMvPG5hbWU+Jy4iCittc2dpZCAicHJ1bmUiCittc2dzdHIgImF1ZnLDpHVtZW4gKGVudGZlcm5lbj8pIgorCisjLiAiUHVsbGluZyBhIGJyYW5jaCBtZWFucyB0byBmZXRjaCBpdCBhbmQgbWVyZ2UgaXQuIgorbXNnaWQgInB1bGwiCittc2dzdHIgIsO8YmVybmVobWVuICh6aWVoZW4/KSIKKworIy4gIlB1c2hpbmcgYSBicmFuY2ggbWVhbnMgdG8gZ2V0IHRoZSBicmFuY2gncyBoZWFkIHJlZiBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnksIGFuZCAuLi4gKHdlbGwsIGNhbiBzb21lb25lIHBsZWFzZSBleHBsYWluIGl0IGZvciBtZXJlIG1vcnRhbHM/KSIKK21zZ2lkICJwdXNoIgorbXNnc3RyICJ2ZXJzZW5kZW4gKGF1c2xpZWZlcm4/IGhvY2hsYWRlbj8gdmVyc2NoaWNrZW4/IHNjaGllYmVuPykiCisKKyMuICIiCittc2dpZCAicmVkbyIKK21zZ3N0ciAid2llZGVyaG9sZW4iCisKKyMuICJBbiBvdGhlciByZXBvc2l0b3J5ICgncmVtb3RlJykuIE9uZSBtaWdodCBoYXZlIGEgc2V0IG9mIHJlbW90ZXMgd2hvc2UgYnJhbmNoZXMgb25lIHRyYWNrcy4iCittc2dpZCAicmVtb3RlIgorbXNnc3RyICJBbmRlcmUgQXJjaGl2ZSAoR2VnZW5zZWl0ZT8sIEVudGZlcm50ZT8sIFNlcnZlcj8pIgorCisjLiAiQSBjb2xsZWN0aW9uIG9mIHJlZnMgKD8pIHRvZ2V0aGVyIHdpdGggYW4gb2JqZWN0IGRhdGFiYXNlIGNvbnRhaW5pbmcgYWxsIG9iamVjdHMgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIHRoZSByZWZzLi4uIChvb3BzLCB5b3UndmUgbG9zdCBtZSBoZXJlLiBBZ2FpbiwgcGxlYXNlIGFuIGV4cGxhbmF0aW9uIGZvciBtZXJlIG1vcnRhbHM/KSIKK21zZ2lkICJyZXBvc2l0b3J5IgorbXNnc3RyICJQcm9qZWt0YXJjaGl2IgorCisjLiAiIgorbXNnaWQgInJlc2V0IgorbXNnc3RyICJ6dXLDvGNrc2V0emVuICh6dXLDvGNra2VocmVuPykiCisKKyMuICIiCittc2dpZCAicmV2ZXJ0IgorbXNnc3RyICJ2ZXJ3ZXJmZW4gKGJlaSBnaXQtcmVzZXQpLCByZXZpZGllcmVuIChiZWkgZ2l0LXJldmVydCwgYWxzbyBtaXQgbmV1ZW0gY29tbWl0KSIKKworIy4gIkEgcGFydGljdWxhciBzdGF0ZSBvZiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgd2hpY2ggd2FzIHN0b3JlZCBpbiB0aGUgb2JqZWN0IGRhdGFiYXNlLiIKK21zZ2lkICJyZXZpc2lvbiIKK21zZ3N0ciAiVmVyc2lvbiAoVG9ydG9pc2VTVk46IFJldmlzaW9uOyBTb3VyY2UgU2FmZTogVmVyc2lvbikiCisKKyMuICIiCittc2dpZCAic2lnbiBvZmYiCittc2dzdHIgImFiemVpY2huZW4gKGdlZ2VuemVpY2huZW4/LCBmcmVpemVpY2huZW4/LCBhYnNlZ25lbj8pIgorCisjLiAiIgorbXNnaWQgInN0YWdpbmcgYXJlYSIKK21zZ3N0ciAiQmVyZWl0c3RlbGx1bmciCisKKyMuICIiCittc2dpZCAic3RhdHVzIgorbXNnc3RyICJTdGF0dXMiCisKKyMuICJBIHJlZiBwb2ludGluZyB0byBhIHRhZyBvciBjb21taXQgb2JqZWN0IgorbXNnaWQgInRhZyBbbm91bl0iCittc2dzdHIgIk1hcmtpZXJ1bmciCisKKyMuICIiCittc2dpZCAidGFnIFt2ZXJiXSIKK21zZ3N0ciAibWFya2llcmVuIgorCisjLiAiQSByZWd1bGFyIGdpdCBicmFuY2ggdGhhdCBpcyB1c2VkIHRvIGZvbGxvdyBjaGFuZ2VzIGZyb20gYW5vdGhlciByZXBvc2l0b3J5LiIKK21zZ2lkICJ0cmFja2luZyBicmFuY2giCittc2dzdHIgIsOcYmVybmFobWV6d2VpZyIKKworIy4gIiIKK21zZ2lkICJ1bmRvIgorbXNnc3RyICJyw7xja2fDpG5naWciCisKKyMuICIiCittc2dpZCAidXBkYXRlIgorbXNnc3RyICJha3R1YWxpc2llcmVuIgorCisjLiAiIgorbXNnaWQgInZlcmlmeSIKK21zZ3N0ciAiw7xiZXJwcsO8ZmVuIgorCisjLiAiVGhlIHRyZWUgb2YgYWN0dWFsIGNoZWNrZWQgb3V0IGZpbGVzLiIKK21zZ2lkICJ3b3JraW5nIGNvcHksIHdvcmtpbmcgdHJlZSIKK21zZ3N0ciAiQXJiZWl0c2tvcGllIgpkaWZmIC0tZ2l0IGEvZ2l0LWd1aS9wby9nbG9zc2FyeS9mci5wbyBiL2dpdC1ndWkvcG8vZ2xvc3NhcnkvZnIucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdjMDA2YQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvcG8vZ2xvc3NhcnkvZnIucG8KQEAgLTAsMCArMSwxNjYgQEAKKyMgdHJhbnNsYXRpb24gb2YgZnIucG8gdG8gRnJlbmNoCisjIFRyYW5zbGF0aW9uIG9mIGdpdC1ndWkgZ2xvc3NhcnkgdG8gRnJlbmNoCisjIENvcHlyaWdodCAoQykgMjAwOCBTaGF3biBQZWFyY2UsIGV0IGFsLgorIworIyBDaHJpc3RpYW4gQ291ZGVyIDxjaHJpc2Nvb2xAdHV4ZmFtaWx5Lm9yZz4sIDIwMDguCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBmclxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDA4LTAxLTE1IDIxOjA0KzAxMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA4LTAxLTE1IDIxOjE3KzAxMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IENocmlzdGlhbiBDb3VkZXIgPGNocmlzY29vbEB0dXhmYW1pbHkub3JnPlxuIgorIkxhbmd1YWdlLVRlYW06IEZyZW5jaFxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIlgtR2VuZXJhdG9yOiBLQmFiZWwgMS4xMS40XG4iCisiUGx1cmFsLUZvcm1zOiAgbnBsdXJhbHM9MjsgcGx1cmFsPShuID4gMSk7XG4iCisKKyMuICJFbmdsaXNoIERlZmluaXRpb24gKERlYXIgdHJhbnNsYXRvcjogVGhpcyBmaWxlIHdpbGwgbmV2ZXIgYmUgdmlzaWJsZSB0byB0aGUgdXNlciEgSXQgc2hvdWxkIG9ubHkgc2VydmUgYXMgYSB0b29sIGZvciB5b3UsIHRoZSB0cmFuc2xhdG9yLiBOb3RoaW5nIG1vcmUuKSIKK21zZ2lkICJFbmdsaXNoIFRlcm0gKERlYXIgdHJhbnNsYXRvcjogVGhpcyBmaWxlIHdpbGwgbmV2ZXIgYmUgdmlzaWJsZSB0byB0aGUgdXNlciEpIgorbXNnc3RyICIiCisKKyMuICIiCittc2dpZCAiYW1lbmQiCittc2dzdHIgImNvcnJpZ2VyIgorCisjLiAiIgorbXNnaWQgImFubm90YXRlIgorbXNnc3RyICJhbm5vdGVyIgorCisjLiAiQSAnYnJhbmNoJyBpcyBhbiBhY3RpdmUgbGluZSBvZiBkZXZlbG9wbWVudC4iCittc2dpZCAiYnJhbmNoIFtub3VuXSIKK21zZ3N0ciAiYnJhbmNoZSIKKworIy4gIiIKK21zZ2lkICJicmFuY2ggW3ZlcmJdIgorbXNnc3RyICJjcsOpZXIgdW5lIGJyYW5jaGUiCisKKyMuICIiCittc2dpZCAiY2hlY2tvdXQgW25vdW5dIgorbXNnc3RyICJlbXBydW50IgorCisjLiAiVGhlIGFjdGlvbiBvZiB1cGRhdGluZyB0aGUgd29ya2luZyB0cmVlIHRvIGEgcmV2aXNpb24gd2hpY2ggd2FzIHN0b3JlZCBpbiB0aGUgb2JqZWN0IGRhdGFiYXNlLiIKK21zZ2lkICJjaGVja291dCBbdmVyYl0iCittc2dzdHIgImVtcHJ1bnRlciIKKworIy4gIiIKK21zZ2lkICJjbG9uZSBbdmVyYl0iCittc2dzdHIgImNsb25lciIKKworIy4gIkEgc2luZ2xlIHBvaW50IGluIHRoZSBnaXQgaGlzdG9yeS4iCittc2dpZCAiY29tbWl0IFtub3VuXSIKK21zZ3N0ciAiY29tbWl0IgorCisjLiAiVGhlIGFjdGlvbiBvZiBzdG9yaW5nIGEgbmV3IHNuYXBzaG90IG9mIHRoZSBwcm9qZWN0J3Mgc3RhdGUgaW4gdGhlIGdpdCBoaXN0b3J5LiIKK21zZ2lkICJjb21taXQgW3ZlcmJdIgorbXNnc3RyICJjb21taXRlciIKKworIy4gIiIKK21zZ2lkICJkaWZmIFtub3VuXSIKK21zZ3N0ciAiZGlmZsOpcmVuY2UiCisKKyMuICIiCittc2dpZCAiZGlmZiBbdmVyYl0iCittc2dzdHIgImNvbXBhcmVyIgorCisjLiAiQSBmYXN0LWZvcndhcmQgaXMgYSBzcGVjaWFsIHR5cGUgb2YgbWVyZ2Ugd2hlcmUgeW91IGhhdmUgYSByZXZpc2lvbiBhbmQgeW91IGFyZSBtZXJnaW5nIGFub3RoZXIgYnJhbmNoJ3MgY2hhbmdlcyB0aGF0IGhhcHBlbiB0byBiZSBhIGRlc2NlbmRhbnQgb2Ygd2hhdCB5b3UgaGF2ZS4iCittc2dpZCAiZmFzdCBmb3J3YXJkIG1lcmdlIgorbXNnc3RyICJmdXNpb24gcGFyIGF2YW5jZSByYXBpZGUiCisKKyMuICJGZXRjaGluZyBhIGJyYW5jaCBtZWFucyB0byBnZXQgdGhlIGJyYW5jaCdzIGhlYWQgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5LCB0byBmaW5kIG91dCB3aGljaCBvYmplY3RzIGFyZSBtaXNzaW5nIGZyb20gdGhlIGxvY2FsIG9iamVjdCBkYXRhYmFzZSwgYW5kIHRvIGdldCB0aGVtLCB0b28uIgorbXNnaWQgImZldGNoIgorbXNnc3RyICJyw6ljdXDDqXJlciIKKworIy4gIkEgY29sbGVjdGlvbiBvZiBmaWxlcy4gVGhlIGluZGV4IGlzIGEgc3RvcmVkIHZlcnNpb24gb2YgeW91ciB3b3JraW5nIHRyZWUuIgorbXNnaWQgImluZGV4IChpbiBnaXQtZ3VpOiBzdGFnaW5nIGFyZWEpIgorbXNnc3RyICJwcsOpLWNvbW1pdCIKKworIy4gIkEgc3VjY2Vzc2Z1bCBtZXJnZSByZXN1bHRzIGluIHRoZSBjcmVhdGlvbiBvZiBhIG5ldyBjb21taXQgcmVwcmVzZW50aW5nIHRoZSByZXN1bHQgb2YgdGhlIG1lcmdlLiIKK21zZ2lkICJtZXJnZSBbbm91bl0iCittc2dzdHIgImZ1c2lvbiIKKworIy4gIlRvIGJyaW5nIHRoZSBjb250ZW50cyBvZiBhbm90aGVyIGJyYW5jaCBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaC4iCittc2dpZCAibWVyZ2UgW3ZlcmJdIgorbXNnc3RyICJmdXNpb25uZXIiCisKKyMuICIiCittc2dpZCAibWVzc2FnZSIKK21zZ3N0ciAibWVzc2FnZSIKKworIy4gIkRlbGV0ZXMgYWxsIHN0YWxlIHRyYWNraW5nIGJyYW5jaGVzIHVuZGVyIDxuYW1lPi4gVGhlc2Ugc3RhbGUgYnJhbmNoZXMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSByZW1vdGUgcmVwb3NpdG9yeSByZWZlcmVuY2VkIGJ5IDxuYW1lPiwgYnV0IGFyZSBzdGlsbCBsb2NhbGx5IGF2YWlsYWJsZSBpbiAncmVtb3Rlcy88bmFtZT4nLiIKK21zZ2lkICJwcnVuZSIKK21zZ3N0ciAibmV0dG95ZXIiCisKKyMuICJQdWxsaW5nIGEgYnJhbmNoIG1lYW5zIHRvIGZldGNoIGl0IGFuZCBtZXJnZSBpdC4iCittc2dpZCAicHVsbCIKK21zZ3N0ciAidGlyZXIiCisKKyMuICJQdXNoaW5nIGEgYnJhbmNoIG1lYW5zIHRvIGdldCB0aGUgYnJhbmNoJ3MgaGVhZCByZWYgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5LCBhbmQgLi4uICh3ZWxsLCBjYW4gc29tZW9uZSBwbGVhc2UgZXhwbGFpbiBpdCBmb3IgbWVyZSBtb3J0YWxzPykiCittc2dpZCAicHVzaCIKK21zZ3N0ciAicG91c3NlciIKKworIy4gIiIKK21zZ2lkICJyZWRvIgorbXNnc3RyICJyZWZhaXJlIgorCisjLiAiQW4gb3RoZXIgcmVwb3NpdG9yeSAoJ3JlbW90ZScpLiBPbmUgbWlnaHQgaGF2ZSBhIHNldCBvZiByZW1vdGVzIHdob3NlIGJyYW5jaGVzIG9uZSB0cmFja3MuIgorbXNnaWQgInJlbW90ZSIKK21zZ3N0ciAicsOpZsOpcmVudGllbCBkaXN0YW50IgorCisjLiAiQSBjb2xsZWN0aW9uIG9mIHJlZnMgKD8pIHRvZ2V0aGVyIHdpdGggYW4gb2JqZWN0IGRhdGFiYXNlIGNvbnRhaW5pbmcgYWxsIG9iamVjdHMgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIHRoZSByZWZzLi4uIChvb3BzLCB5b3UndmUgbG9zdCBtZSBoZXJlLiBBZ2FpbiwgcGxlYXNlIGFuIGV4cGxhbmF0aW9uIGZvciBtZXJlIG1vcnRhbHM/KSIKK21zZ2lkICJyZXBvc2l0b3J5IgorbXNnc3RyICJyw6lmw6lyZW50aWVsIgorCisjLiAiIgorbXNnaWQgInJlc2V0IgorbXNnc3RyICJyw6lpbml0aWFsaXNlciIKKworIy4gIiIKK21zZ2lkICJyZXZlcnQiCittc2dzdHIgImludmVyc2VyIgorCisjLiAiQSBwYXJ0aWN1bGFyIHN0YXRlIG9mIGZpbGVzIGFuZCBkaXJlY3RvcmllcyB3aGljaCB3YXMgc3RvcmVkIGluIHRoZSBvYmplY3QgZGF0YWJhc2UuIgorbXNnaWQgInJldmlzaW9uIgorbXNnc3RyICJyw6l2aXNpb24iCisKKyMuICIiCittc2dpZCAic2lnbiBvZmYiCittc2dzdHIgInNpZ25lciIKKworIy4gIiIKK21zZ2lkICJzdGFnaW5nIGFyZWEiCittc2dzdHIgInByw6ktY29tbWl0IgorCisjLiAiIgorbXNnaWQgInN0YXR1cyIKK21zZ3N0ciAiw6l0YXQiCisKKyMuICJBIHJlZiBwb2ludGluZyB0byBhIHRhZyBvciBjb21taXQgb2JqZWN0IgorbXNnaWQgInRhZyBbbm91bl0iCittc2dzdHIgIm1hcnF1ZSIKKworIy4gIiIKK21zZ2lkICJ0YWcgW3ZlcmJdIgorbXNnc3RyICJtYXJxdWVyIgorCisjLiAiQSByZWd1bGFyIGdpdCBicmFuY2ggdGhhdCBpcyB1c2VkIHRvIGZvbGxvdyBjaGFuZ2VzIGZyb20gYW5vdGhlciByZXBvc2l0b3J5LiIKK21zZ2lkICJ0cmFja2luZyBicmFuY2giCittc2dzdHIgImJyYW5jaGUgZGUgc3VpdmkiCisKKyMuICIiCittc2dpZCAidW5kbyIKK21zZ3N0ciAiZMOpZmFpcmUiCisKKyMuICIiCittc2dpZCAidXBkYXRlIgorbXNnc3RyICJtaXNlIMOgIGpvdXIiCisKKyMuICIiCittc2dpZCAidmVyaWZ5IgorbXNnc3RyICJ2w6lyaWZpZXIiCisKKyMuICJUaGUgdHJlZSBvZiBhY3R1YWwgY2hlY2tlZCBvdXQgZmlsZXMuIgorbXNnaWQgIndvcmtpbmcgY29weSwgd29ya2luZyB0cmVlIgorbXNnc3RyICJjb3BpZSBkZSB0cmF2YWlsLCBhcmJvcmVzY2VuY2UgZGUgdHJhdmFpbCIKKwpkaWZmIC0tZ2l0IGEvZ2l0LWd1aS9wby9nbG9zc2FyeS9naXQtZ3VpLWdsb3NzYXJ5LnBvdCBiL2dpdC1ndWkvcG8vZ2xvc3NhcnkvZ2l0LWd1aS1nbG9zc2FyeS5wb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBlYjNlOQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvcG8vZ2xvc3NhcnkvZ2l0LWd1aS1nbG9zc2FyeS5wb3QKQEAgLTAsMCArMSwxNjggQEAKKyMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KKyMgQ29weXJpZ2h0IChDKSBZRUFSIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgorIworIywgZnV6enkKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTlxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDA4LTAxLTA3IDIxOjIwKzAxMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cbiIKKyJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUNIQVJTRVRcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBFTkNPRElOR1xuIgorCisjLiAiRW5nbGlzaCBEZWZpbml0aW9uIChEZWFyIHRyYW5zbGF0b3I6IFRoaXMgZmlsZSB3aWxsIG5ldmVyIGJlIHZpc2libGUgdG8gdGhlIHVzZXIhIEl0IHNob3VsZCBvbmx5IHNlcnZlIGFzIGEgdG9vbCBmb3IgeW91LCB0aGUgdHJhbnNsYXRvci4gTm90aGluZyBtb3JlLikiCittc2dpZCAiRW5nbGlzaCBUZXJtIChEZWFyIHRyYW5zbGF0b3I6IFRoaXMgZmlsZSB3aWxsIG5ldmVyIGJlIHZpc2libGUgdG8gdGhlIHVzZXIhKSIKK21zZ3N0ciAiIgorCisjLiAiIgorbXNnaWQgImFtZW5kIgorbXNnc3RyICIiCisKKyMuICIiCittc2dpZCAiYW5ub3RhdGUiCittc2dzdHIgIiIKKworIy4gIkEgJ2JyYW5jaCcgaXMgYW4gYWN0aXZlIGxpbmUgb2YgZGV2ZWxvcG1lbnQuIgorbXNnaWQgImJyYW5jaCBbbm91bl0iCittc2dzdHIgIiIKKworIy4gIiIKK21zZ2lkICJicmFuY2ggW3ZlcmJdIgorbXNnc3RyICIiCisKKyMuICIiCittc2dpZCAiY2hlY2tvdXQgW25vdW5dIgorbXNnc3RyICIiCisKKyMuICJUaGUgYWN0aW9uIG9mIHVwZGF0aW5nIHRoZSB3b3JraW5nIHRyZWUgdG8gYSByZXZpc2lvbiB3aGljaCB3YXMgc3RvcmVkIGluIHRoZSBvYmplY3QgZGF0YWJhc2UuIgorbXNnaWQgImNoZWNrb3V0IFt2ZXJiXSIKK21zZ3N0ciAiIgorCisjLiAiIgorbXNnaWQgImNsb25lIFt2ZXJiXSIKK21zZ3N0ciAiIgorCisjLiAiQSBzaW5nbGUgcG9pbnQgaW4gdGhlIGdpdCBoaXN0b3J5LiIKK21zZ2lkICJjb21taXQgW25vdW5dIgorbXNnc3RyICIiCisKKyMuICJUaGUgYWN0aW9uIG9mIHN0b3JpbmcgYSBuZXcgc25hcHNob3Qgb2YgdGhlIHByb2plY3QncyBzdGF0ZSBpbiB0aGUgZ2l0IGhpc3RvcnkuIgorbXNnaWQgImNvbW1pdCBbdmVyYl0iCittc2dzdHIgIiIKKworIy4gIiIKK21zZ2lkICJkaWZmIFtub3VuXSIKK21zZ3N0ciAiIgorCisjLiAiIgorbXNnaWQgImRpZmYgW3ZlcmJdIgorbXNnc3RyICIiCisKKyMuICJBIGZhc3QtZm9yd2FyZCBpcyBhIHNwZWNpYWwgdHlwZSBvZiBtZXJnZSB3aGVyZSB5b3UgaGF2ZSBhIHJldmlzaW9uIGFuZCB5b3UgYXJlIG1lcmdpbmcgYW5vdGhlciBicmFuY2gncyBjaGFuZ2VzIHRoYXQgaGFwcGVuIHRvIGJlIGEgZGVzY2VuZGFudCBvZiB3aGF0IHlvdSBoYXZlLiIKK21zZ2lkICJmYXN0IGZvcndhcmQgbWVyZ2UiCittc2dzdHIgIiIKKworIy4gIkZldGNoaW5nIGEgYnJhbmNoIG1lYW5zIHRvIGdldCB0aGUgYnJhbmNoJ3MgaGVhZCBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnksIHRvIGZpbmQgb3V0IHdoaWNoIG9iamVjdHMgYXJlIG1pc3NpbmcgZnJvbSB0aGUgbG9jYWwgb2JqZWN0IGRhdGFiYXNlLCBhbmQgdG8gZ2V0IHRoZW0sIHRvby4iCittc2dpZCAiZmV0Y2giCittc2dzdHIgIiIKKworIy4gIk9uZSBjb250ZXh0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIGEgd2hvbGUgcGF0Y2gsIHdoaWNoIGNvbnNpc3RzIG9mIG1hbnkgc3VjaCBodW5rcyIKK21zZ2lkICJodW5rIgorbXNnc3RyICIiCisKKyMuICJBIGNvbGxlY3Rpb24gb2YgZmlsZXMuIFRoZSBpbmRleCBpcyBhIHN0b3JlZCB2ZXJzaW9uIG9mIHlvdXIgd29ya2luZyB0cmVlLiIKK21zZ2lkICJpbmRleCAoaW4gZ2l0LWd1aTogc3RhZ2luZyBhcmVhKSIKK21zZ3N0ciAiIgorCisjLiAiQSBzdWNjZXNzZnVsIG1lcmdlIHJlc3VsdHMgaW4gdGhlIGNyZWF0aW9uIG9mIGEgbmV3IGNvbW1pdCByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZiB0aGUgbWVyZ2UuIgorbXNnaWQgIm1lcmdlIFtub3VuXSIKK21zZ3N0ciAiIgorCisjLiAiVG8gYnJpbmcgdGhlIGNvbnRlbnRzIG9mIGFub3RoZXIgYnJhbmNoIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoLiIKK21zZ2lkICJtZXJnZSBbdmVyYl0iCittc2dzdHIgIiIKKworIy4gIiIKK21zZ2lkICJtZXNzYWdlIgorbXNnc3RyICIiCisKKyMuICJEZWxldGVzIGFsbCBzdGFsZSB0cmFja2luZyBicmFuY2hlcyB1bmRlciA8bmFtZT4uIFRoZXNlIHN0YWxlIGJyYW5jaGVzIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcmVtb3RlIHJlcG9zaXRvcnkgcmVmZXJlbmNlZCBieSA8bmFtZT4sIGJ1dCBhcmUgc3RpbGwgbG9jYWxseSBhdmFpbGFibGUgaW4gJ3JlbW90ZXMvPG5hbWU+Jy4iCittc2dpZCAicHJ1bmUiCittc2dzdHIgIiIKKworIy4gIlB1bGxpbmcgYSBicmFuY2ggbWVhbnMgdG8gZmV0Y2ggaXQgYW5kIG1lcmdlIGl0LiIKK21zZ2lkICJwdWxsIgorbXNnc3RyICIiCisKKyMuICJQdXNoaW5nIGEgYnJhbmNoIG1lYW5zIHRvIGdldCB0aGUgYnJhbmNoJ3MgaGVhZCByZWYgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5LCBhbmQgLi4uICh3ZWxsLCBjYW4gc29tZW9uZSBwbGVhc2UgZXhwbGFpbiBpdCBmb3IgbWVyZSBtb3J0YWxzPykiCittc2dpZCAicHVzaCIKK21zZ3N0ciAiIgorCisjLiAiIgorbXNnaWQgInJlZG8iCittc2dzdHIgIiIKKworIy4gIkFuIG90aGVyIHJlcG9zaXRvcnkgKCdyZW1vdGUnKS4gT25lIG1pZ2h0IGhhdmUgYSBzZXQgb2YgcmVtb3RlcyB3aG9zZSBicmFuY2hlcyBvbmUgdHJhY2tzLiIKK21zZ2lkICJyZW1vdGUiCittc2dzdHIgIiIKKworIy4gIkEgY29sbGVjdGlvbiBvZiByZWZzICg/KSB0b2dldGhlciB3aXRoIGFuIG9iamVjdCBkYXRhYmFzZSBjb250YWluaW5nIGFsbCBvYmplY3RzIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSB0aGUgcmVmcy4uLiAob29wcywgeW91J3ZlIGxvc3QgbWUgaGVyZS4gQWdhaW4sIHBsZWFzZSBhbiBleHBsYW5hdGlvbiBmb3IgbWVyZSBtb3J0YWxzPykiCittc2dpZCAicmVwb3NpdG9yeSIKK21zZ3N0ciAiIgorCisjLiAiIgorbXNnaWQgInJlc2V0IgorbXNnc3RyICIiCisKKyMuICIiCittc2dpZCAicmV2ZXJ0IgorbXNnc3RyICIiCisKKyMuICJBIHBhcnRpY3VsYXIgc3RhdGUgb2YgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHdoaWNoIHdhcyBzdG9yZWQgaW4gdGhlIG9iamVjdCBkYXRhYmFzZS4iCittc2dpZCAicmV2aXNpb24iCittc2dzdHIgIiIKKworIy4gIiIKK21zZ2lkICJzaWduIG9mZiIKK21zZ3N0ciAiIgorCisjLiAiIgorbXNnaWQgInN0YWdpbmcgYXJlYSIKK21zZ3N0ciAiIgorCisjLiAiIgorbXNnaWQgInN0YXR1cyIKK21zZ3N0ciAiIgorCisjLiAiQSByZWYgcG9pbnRpbmcgdG8gYSB0YWcgb3IgY29tbWl0IG9iamVjdCIKK21zZ2lkICJ0YWcgW25vdW5dIgorbXNnc3RyICIiCisKKyMuICIiCittc2dpZCAidGFnIFt2ZXJiXSIKK21zZ3N0ciAiIgorCisjLiAiQSByZWd1bGFyIGdpdCBicmFuY2ggdGhhdCBpcyB1c2VkIHRvIGZvbGxvdyBjaGFuZ2VzIGZyb20gYW5vdGhlciByZXBvc2l0b3J5LiIKK21zZ2lkICJ0cmFja2luZyBicmFuY2giCittc2dzdHIgIiIKKworIy4gIiIKK21zZ2lkICJ1bmRvIgorbXNnc3RyICIiCisKKyMuICIiCittc2dpZCAidXBkYXRlIgorbXNnc3RyICIiCisKKyMuICIiCittc2dpZCAidmVyaWZ5IgorbXNnc3RyICIiCisKKyMuICJUaGUgdHJlZSBvZiBhY3R1YWwgY2hlY2tlZCBvdXQgZmlsZXMuIgorbXNnaWQgIndvcmtpbmcgY29weSwgd29ya2luZyB0cmVlIgorbXNnc3RyICIiCisKZGlmZiAtLWdpdCBhL2dpdC1ndWkvcG8vZ2xvc3NhcnkvZ2l0LWd1aS1nbG9zc2FyeS50eHQgYi9naXQtZ3VpL3BvL2dsb3NzYXJ5L2dpdC1ndWktZ2xvc3NhcnkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMzFmNjkKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtZ3VpL3BvL2dsb3NzYXJ5L2dpdC1ndWktZ2xvc3NhcnkudHh0CkBAIC0wLDAgKzEsMzggQEAKKyJFbmdsaXNoIFRlcm0gKERlYXIgdHJhbnNsYXRvcjogVGhpcyBmaWxlIHdpbGwgbmV2ZXIgYmUgdmlzaWJsZSB0byB0aGUgdXNlciEpIgkiRW5nbGlzaCBEZWZpbml0aW9uIChEZWFyIHRyYW5zbGF0b3I6IFRoaXMgZmlsZSB3aWxsIG5ldmVyIGJlIHZpc2libGUgdG8gdGhlIHVzZXIhIEl0IHNob3VsZCBvbmx5IHNlcnZlIGFzIGEgdG9vbCBmb3IgeW91LCB0aGUgdHJhbnNsYXRvci4gTm90aGluZyBtb3JlLikiCisiYW1lbmQiCSIiCisiYW5ub3RhdGUiCSIiCisiYnJhbmNoIFtub3VuXSIJIkEgJ2JyYW5jaCcgaXMgYW4gYWN0aXZlIGxpbmUgb2YgZGV2ZWxvcG1lbnQuIgorImJyYW5jaCBbdmVyYl0iCSIiCisiY2hlY2tvdXQgW25vdW5dIgkiIgorImNoZWNrb3V0IFt2ZXJiXSIJIlRoZSBhY3Rpb24gb2YgdXBkYXRpbmcgdGhlIHdvcmtpbmcgdHJlZSB0byBhIHJldmlzaW9uIHdoaWNoIHdhcyBzdG9yZWQgaW4gdGhlIG9iamVjdCBkYXRhYmFzZS4iCisiY2xvbmUgW3ZlcmJdIgkiIgorImNvbW1pdCBbbm91bl0iCSJBIHNpbmdsZSBwb2ludCBpbiB0aGUgZ2l0IGhpc3RvcnkuIgorImNvbW1pdCBbdmVyYl0iCSJUaGUgYWN0aW9uIG9mIHN0b3JpbmcgYSBuZXcgc25hcHNob3Qgb2YgdGhlIHByb2plY3QncyBzdGF0ZSBpbiB0aGUgZ2l0IGhpc3RvcnkuIgorImRpZmYgW25vdW5dIgkiIgorImRpZmYgW3ZlcmJdIgkiIgorImZhc3QgZm9yd2FyZCBtZXJnZSIJIkEgZmFzdC1mb3J3YXJkIGlzIGEgc3BlY2lhbCB0eXBlIG9mIG1lcmdlIHdoZXJlIHlvdSBoYXZlIGEgcmV2aXNpb24gYW5kIHlvdSBhcmUgbWVyZ2luZyBhbm90aGVyIGJyYW5jaCdzIGNoYW5nZXMgdGhhdCBoYXBwZW4gdG8gYmUgYSBkZXNjZW5kYW50IG9mIHdoYXQgeW91IGhhdmUuIgorImZldGNoIgkiRmV0Y2hpbmcgYSBicmFuY2ggbWVhbnMgdG8gZ2V0IHRoZSBicmFuY2gncyBoZWFkIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeSwgdG8gZmluZCBvdXQgd2hpY2ggb2JqZWN0cyBhcmUgbWlzc2luZyBmcm9tIHRoZSBsb2NhbCBvYmplY3QgZGF0YWJhc2UsIGFuZCB0byBnZXQgdGhlbSwgdG9vLiIKKyJodW5rIgkiT25lIGNvbnRleHQgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gYSB3aG9sZSBwYXRjaCwgd2hpY2ggY29uc2lzdHMgb2YgbWFueSBzdWNoIGh1bmtzIgorImluZGV4IChpbiBnaXQtZ3VpOiBzdGFnaW5nIGFyZWEpIgkiQSBjb2xsZWN0aW9uIG9mIGZpbGVzLiBUaGUgaW5kZXggaXMgYSBzdG9yZWQgdmVyc2lvbiBvZiB5b3VyIHdvcmtpbmcgdHJlZS4iCisibWVyZ2UgW25vdW5dIgkiQSBzdWNjZXNzZnVsIG1lcmdlIHJlc3VsdHMgaW4gdGhlIGNyZWF0aW9uIG9mIGEgbmV3IGNvbW1pdCByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZiB0aGUgbWVyZ2UuIgorIm1lcmdlIFt2ZXJiXSIJIlRvIGJyaW5nIHRoZSBjb250ZW50cyBvZiBhbm90aGVyIGJyYW5jaCBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaC4iCisibWVzc2FnZSIJIiIKKyJwcnVuZSIJIkRlbGV0ZXMgYWxsIHN0YWxlIHRyYWNraW5nIGJyYW5jaGVzIHVuZGVyIDxuYW1lPi4gVGhlc2Ugc3RhbGUgYnJhbmNoZXMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSByZW1vdGUgcmVwb3NpdG9yeSByZWZlcmVuY2VkIGJ5IDxuYW1lPiwgYnV0IGFyZSBzdGlsbCBsb2NhbGx5IGF2YWlsYWJsZSBpbiAncmVtb3Rlcy88bmFtZT4nLiIKKyJwdWxsIgkiUHVsbGluZyBhIGJyYW5jaCBtZWFucyB0byBmZXRjaCBpdCBhbmQgbWVyZ2UgaXQuIgorInB1c2giCSJQdXNoaW5nIGEgYnJhbmNoIG1lYW5zIHRvIGdldCB0aGUgYnJhbmNoJ3MgaGVhZCByZWYgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5LCBhbmQgLi4uICh3ZWxsLCBjYW4gc29tZW9uZSBwbGVhc2UgZXhwbGFpbiBpdCBmb3IgbWVyZSBtb3J0YWxzPykiCisicmVkbyIJIiIKKyJyZW1vdGUiCSJBbiBvdGhlciByZXBvc2l0b3J5ICgncmVtb3RlJykuIE9uZSBtaWdodCBoYXZlIGEgc2V0IG9mIHJlbW90ZXMgd2hvc2UgYnJhbmNoZXMgb25lIHRyYWNrcy4iCisicmVwb3NpdG9yeSIJIkEgY29sbGVjdGlvbiBvZiByZWZzICg/KSB0b2dldGhlciB3aXRoIGFuIG9iamVjdCBkYXRhYmFzZSBjb250YWluaW5nIGFsbCBvYmplY3RzIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSB0aGUgcmVmcy4uLiAob29wcywgeW91J3ZlIGxvc3QgbWUgaGVyZS4gQWdhaW4sIHBsZWFzZSBhbiBleHBsYW5hdGlvbiBmb3IgbWVyZSBtb3J0YWxzPykiCisicmVzZXQiCSIiCisicmV2ZXJ0IgkiIgorInJldmlzaW9uIgkiQSBwYXJ0aWN1bGFyIHN0YXRlIG9mIGZpbGVzIGFuZCBkaXJlY3RvcmllcyB3aGljaCB3YXMgc3RvcmVkIGluIHRoZSBvYmplY3QgZGF0YWJhc2UuIgorInNpZ24gb2ZmIgkiIgorInN0YWdpbmcgYXJlYSIJIiIKKyJzdGF0dXMiCSIiCisidGFnIFtub3VuXSIJIkEgcmVmIHBvaW50aW5nIHRvIGEgdGFnIG9yIGNvbW1pdCBvYmplY3QiCisidGFnIFt2ZXJiXSIJIiIKKyJ0cmFja2luZyBicmFuY2giCSJBIHJlZ3VsYXIgZ2l0IGJyYW5jaCB0aGF0IGlzIHVzZWQgdG8gZm9sbG93IGNoYW5nZXMgZnJvbSBhbm90aGVyIHJlcG9zaXRvcnkuIgorInVuZG8iCSIiCisidXBkYXRlIgkiIgorInZlcmlmeSIJIiIKKyJ3b3JraW5nIGNvcHksIHdvcmtpbmcgdHJlZSIJIlRoZSB0cmVlIG9mIGFjdHVhbCBjaGVja2VkIG91dCBmaWxlcy4iCmRpZmYgLS1naXQgYS9naXQtZ3VpL3BvL2dsb3NzYXJ5L2l0LnBvIGIvZ2l0LWd1aS9wby9nbG9zc2FyeS9pdC5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjQ2YjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9wby9nbG9zc2FyeS9pdC5wbwpAQCAtMCwwICsxLDE4NCBAQAorIyBUcmFuc2xhdGlvbiBvZiBnaXQtZ3VpIGdsb3NzYXJ5IHRvIEl0YWxpYW4KKyMgQ29weXJpZ2h0IChDKSAyMDA3IFNoYXduIFBlYXJjZSwgZXQgYWwuCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSBnaXQgcGFja2FnZS4KKyMgQ2hyaXN0aWFuIFN0aW1taW5nIDxzdGltbWluZ0B0dWhoLmRlPiwgMjAwNworIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ2l0LWd1aSBnbG9zc2FyeVxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDA3LTEwLTE5IDIxOjQzKzAyMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA3LTEwLTEwIDE1OjI0KzAyMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IE1pY2hlbGUgQmFsbGFiaW8gPGJhcnJhX2N1ZGFAa2F0YW1haWwuY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IEl0YWxpYW4gXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisKKyMuICJFbmdsaXNoIERlZmluaXRpb24gKERlYXIgdHJhbnNsYXRvcjogVGhpcyBmaWxlIHdpbGwgbmV2ZXIgYmUgdmlzaWJsZSB0byB0aGUgdXNlciEgSXQgc2hvdWxkIG9ubHkgc2VydmUgYXMgYSB0b29sIGZvciB5b3UsIHRoZSB0cmFuc2xhdG9yLiBOb3RoaW5nIG1vcmUuKSIKK21zZ2lkICIiCisiRW5nbGlzaCBUZXJtIChEZWFyIHRyYW5zbGF0b3I6IFRoaXMgZmlsZSB3aWxsIG5ldmVyIGJlIHZpc2libGUgdG8gdGhlIHVzZXIhKSIKK21zZ3N0ciAiIgorIlRyYWR1emlvbmUgaXRhbGlhbmEuXG4iCisiQWx0cmkgU0NNIGluIGl0YWxpYW5vOlxuIgorIiAgaHR0cDovL3RvcnRvaXNlc3ZuLnRpZ3Jpcy5vcmcvc3ZuL3RvcnRvaXNlc3ZuL3RydW5rL0xhbmd1YWdlcy9Ub3J0b2lzZV9pdC4iCisicG8gKHVzZXJuYW1lPWd1ZXN0LCBwYXNzd29yZCBlbXB0eSksXG4iCisiICBodHRwOi8vdG9ydG9pc2VjdnMuY3ZzLnNvdXJjZWZvcmdlLm5ldC90b3J0b2lzZWN2cy9wby9Ub3J0b2lzZUNWUy9pdF9JVC5wbz8iCisidmlldz1tYXJrdXAgLFxuIgorIiAgaHR0cDovL3JhcGlkc3ZuLnRpZ3Jpcy5vcmcvc3ZuL3JhcGlkc3ZuL3RydW5rL3NyYy9sb2NhbGUvaXRfSVQvcmFwaWRzdm4ucG8gIgorIih1c2VybmFtZT1ndWVzdCwgcGFzc3dvcmQgZW1wdHkpIgorCisjLiAiIgorbXNnaWQgImFtZW5kIgorbXNnc3RyICJjb3JyZWdnZXJlLCBjb3JyZXppb25lIgorCisjLiAiIgorbXNnaWQgImFubm90YXRlIgorbXNnc3RyICJhbm5vdGFyZSwgYW5ub3RhemlvbmUiCisKKyMuICJBICdicmFuY2gnIGlzIGFuIGFjdGl2ZSBsaW5lIG9mIGRldmVsb3BtZW50LiIKK21zZ2lkICJicmFuY2ggW25vdW5dIgorbXNnc3RyICJyYW1vLCBkaXJhbWF6aW9uZSwgcmFtaWZpY2F6aW9uZSIKKworIy4gIiIKK21zZ2lkICJicmFuY2ggW3ZlcmJdIgorbXNnc3RyICJjcmVhcmUgcmFtbywgcmFtaWZpY2FyZSwgZGlyYW1hcmUiCisKKyMuICIiCittc2dpZCAiY2hlY2tvdXQgW25vdW5dIgorbXNnc3RyICJhdHRpdmF6aW9uZSwgY2hlY2tvdXQsIHJldmlzaW9uZSBhdHRpdmEsIHByZWxpZXZvIChUb3J0b2lzZUNWUyk/IgorCisjLiAiVGhlIGFjdGlvbiBvZiB1cGRhdGluZyB0aGUgd29ya2luZyB0cmVlIHRvIGEgcmV2aXNpb24gd2hpY2ggd2FzIHN0b3JlZCBpbiB0aGUgb2JqZWN0IGRhdGFiYXNlLiIKK21zZ2lkICJjaGVja291dCBbdmVyYl0iCittc2dzdHIgIiIKKyJhdHRpdmFyZSwgZWZmZXR0dWFyZSB1biBjaGVja291dCwgYXR0aXZhcmUgcmV2aXNpb25lLCBwcmVsZXZhcmUgIgorIihUb3J0b2lzZUNWUyksIHJpdGlyYXJlIChUU1ZOKT8iCisKKyMuICIiCittc2dpZCAiY2xvbmUgW3ZlcmJdIgorbXNnc3RyICJjbG9uYXJlIgorCisjLiAiQSBzaW5nbGUgcG9pbnQgaW4gdGhlIGdpdCBoaXN0b3J5LiIKK21zZ2lkICJjb21taXQgW25vdW5dIgorbXNnc3RyICJyZXZpc2lvbmUsIGNvbW1pdCwgZGVwb3NpdG8gKFRvcnRvaXNlQ1ZTKSwgaW52aW8gKFRTVk4pPyIKKworIy4gIlRoZSBhY3Rpb24gb2Ygc3RvcmluZyBhIG5ldyBzbmFwc2hvdCBvZiB0aGUgcHJvamVjdCdzIHN0YXRlIGluIHRoZSBnaXQgaGlzdG9yeS4iCittc2dpZCAiY29tbWl0IFt2ZXJiXSIKK21zZ3N0ciAiIgorImNyZWFyZSB1bmEgbnVvdmEgcmV2aXNpb25lLCBhcmNoaXZpYXJlLCBlZmZldHR1YXJlIHVuIGNvbW1pdCwgZGVwb3NpdGFyZSAiCisiKG5lbCBzZXJ2ZXIpLCBmYXJlIHVuIGRlcG9zaXRvIChUb3J0b2lzZUNWUyksIGludmlhcmUgKFRTVk4pPyIKKworIy4gIiIKK21zZ2lkICJkaWZmIFtub3VuXSIKK21zZ3N0ciAiZGlmZmVyZW56YSwgY29uZnJvbnRvLCBjb21wYXJhemlvbmUsIHJhZmZyb250byIKKworIy4gIiIKK21zZ2lkICJkaWZmIFt2ZXJiXSIKK21zZ3N0ciAiY29uZnJvbnRhLCBtb3N0cmEgbGUgZGlmZmVyZW56ZSIKKworIy4gIkEgZmFzdC1mb3J3YXJkIGlzIGEgc3BlY2lhbCB0eXBlIG9mIG1lcmdlIHdoZXJlIHlvdSBoYXZlIGEgcmV2aXNpb24gYW5kIHlvdSBhcmUgbWVyZ2luZyBhbm90aGVyIGJyYW5jaCdzIGNoYW5nZXMgdGhhdCBoYXBwZW4gdG8gYmUgYSBkZXNjZW5kYW50IG9mIHdoYXQgeW91IGhhdmUuIgorbXNnaWQgImZhc3QgZm9yd2FyZCBtZXJnZSIKK21zZ3N0ciAiZnVzaW9uZSBpbiAnZmFzdC1mb3J3YXJkJywgZnVzaW9uZSBpbiBhdmFudGkgdmVsb2NlIgorCisjLiAiRmV0Y2hpbmcgYSBicmFuY2ggbWVhbnMgdG8gZ2V0IHRoZSBicmFuY2gncyBoZWFkIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeSwgdG8gZmluZCBvdXQgd2hpY2ggb2JqZWN0cyBhcmUgbWlzc2luZyBmcm9tIHRoZSBsb2NhbCBvYmplY3QgZGF0YWJhc2UsIGFuZCB0byBnZXQgdGhlbSwgdG9vLiIKK21zZ2lkICJmZXRjaCIKK21zZ3N0ciAicmVjdXBlcmFyZSwgcHJlbGV2YXJlLCBwcmVuZGVyZSBkYSwgcmVjdXBlcmFyZSAoVFNWTikiCisKKyMuICJBIGNvbGxlY3Rpb24gb2YgZmlsZXMuIFRoZSBpbmRleCBpcyBhIHN0b3JlZCB2ZXJzaW9uIG9mIHlvdXIgd29ya2luZyB0cmVlLiIKK21zZ2lkICJpbmRleCAoaW4gZ2l0LWd1aTogc3RhZ2luZyBhcmVhKSIKK21zZ3N0ciAiaW5kaWNlIgorCisjLiAiQSBzdWNjZXNzZnVsIG1lcmdlIHJlc3VsdHMgaW4gdGhlIGNyZWF0aW9uIG9mIGEgbmV3IGNvbW1pdCByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZiB0aGUgbWVyZ2UuIgorbXNnaWQgIm1lcmdlIFtub3VuXSIKK21zZ3N0ciAiZnVzaW9uZSwgdW5pb25lIgorCisjLiAiVG8gYnJpbmcgdGhlIGNvbnRlbnRzIG9mIGFub3RoZXIgYnJhbmNoIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoLiIKK21zZ2lkICJtZXJnZSBbdmVyYl0iCittc2dzdHIgImVmZmV0dHVhcmUgbGEgZnVzaW9uZSwgdW5pcmUsIGZvbmRlcmUsIGVzZWd1aXJlIGxhIGZ1c2lvbmUiCisKKyMuICIiCittc2dpZCAibWVzc2FnZSIKK21zZ3N0ciAibWVzc2FnZ2lvLCBjb21tZW50byIKKworIy4gIkRlbGV0ZXMgYWxsIHN0YWxlIHRyYWNraW5nIGJyYW5jaGVzIHVuZGVyIDxuYW1lPi4gVGhlc2Ugc3RhbGUgYnJhbmNoZXMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSByZW1vdGUgcmVwb3NpdG9yeSByZWZlcmVuY2VkIGJ5IDxuYW1lPiwgYnV0IGFyZSBzdGlsbCBsb2NhbGx5IGF2YWlsYWJsZSBpbiAncmVtb3Rlcy88bmFtZT4nLiIKK21zZ2lkICJwcnVuZSIKK21zZ3N0ciAicG90YXR1cmEiCisKKyMuICJQdWxsaW5nIGEgYnJhbmNoIG1lYW5zIHRvIGZldGNoIGl0IGFuZCBtZXJnZSBpdC4iCittc2dpZCAicHVsbCIKK21zZ3N0ciAiIgorInByZW5kaSAocmVjdXBlcmEpIGUgZm9uZGkgKHVuaXNjaSk/IChpbiBwcmF0aWNhIHVuYSB0cmFkdXppb25lIGRpIGZldGNoICsgIgorIm1lcmdlKSIKKworIy4gIlB1c2hpbmcgYSBicmFuY2ggbWVhbnMgdG8gZ2V0IHRoZSBicmFuY2gncyBoZWFkIHJlZiBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnksIGFuZCAuLi4gKHdlbGwsIGNhbiBzb21lb25lIHBsZWFzZSBleHBsYWluIGl0IGZvciBtZXJlIG1vcnRhbHM/KSIKK21zZ2lkICJwdXNoIgorbXNnc3RyICJwcm9wYWdhIgorCisjLiAiIgorbXNnaWQgInJlZG8iCittc2dzdHIgInJpcGV0aSwgcmlmYWkiCisKKyMuICJBbiBvdGhlciByZXBvc2l0b3J5ICgncmVtb3RlJykuIE9uZSBtaWdodCBoYXZlIGEgc2V0IG9mIHJlbW90ZXMgd2hvc2UgYnJhbmNoZXMgb25lIHRyYWNrcy4iCittc2dpZCAicmVtb3RlIgorbXNnc3RyICJyZW1vdG8iCisKKyMuICJBIGNvbGxlY3Rpb24gb2YgcmVmcyAoPykgdG9nZXRoZXIgd2l0aCBhbiBvYmplY3QgZGF0YWJhc2UgY29udGFpbmluZyBhbGwgb2JqZWN0cyB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gdGhlIHJlZnMuLi4gKG9vcHMsIHlvdSd2ZSBsb3N0IG1lIGhlcmUuIEFnYWluLCBwbGVhc2UgYW4gZXhwbGFuYXRpb24gZm9yIG1lcmUgbW9ydGFscz8pIgorbXNnaWQgInJlcG9zaXRvcnkiCittc2dzdHIgImFyY2hpdmlvLCByZXBvc2l0b3J5LCBkYXRhYmFzZT8gZGVwb3NpdG8gKHJhcGlkc3ZuKT8iCisKKyMuICIiCittc2dpZCAicmVzZXQiCittc2dzdHIgInJpcHJpc3RpbmFyZSwgYW5udWxsYXJlLCBhenplcmFyZSwgcmlwcmlzdGluYXJlIgorCisjLiAiIgorbXNnaWQgInJldmVydCIKK21zZ3N0ciAiIgorImFubnVsbGFyZSwgaW52ZXJ0aSAocmFwaWRzdm4pLCByaXRvcm5hIGFsbG8gc3RhdG8gcHJlY2VkZW50ZSwgYW5udWxsYSBsZSAiCisibW9kaWZpY2hlIGRlbGxhIHJldmlzaW9uZSIKKworIy4gIkEgcGFydGljdWxhciBzdGF0ZSBvZiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgd2hpY2ggd2FzIHN0b3JlZCBpbiB0aGUgb2JqZWN0IGRhdGFiYXNlLiIKK21zZ2lkICJyZXZpc2lvbiIKK21zZ3N0ciAicmV2aXNpb25lIChUb3J0b2lzZVNWTikiCisKKyMuICIiCittc2dpZCAic2lnbiBvZmYiCittc2dzdHIgInNpZ24gb2ZmLCBmaXJtYSIKKworIy4gIiIKK21zZ2lkICJzdGFnaW5nIGFyZWEiCittc2dzdHIgIiIKKyJhcmVhIGRpIHByZXBhcmF6aW9uZSwgem9uYSBkaSBwcmVwYXJhemlvbmUsIG1vZGlmaWNoZSBpbiBwcmVwYXJhemlvbmU/ICIKKyJtb2RpZmljaGUgaW4gYWxsZXN0aW1lbnRvPyIKKworIy4gIiIKK21zZ2lkICJzdGF0dXMiCittc2dzdHIgInN0YXRvIgorCisjLiAiQSByZWYgcG9pbnRpbmcgdG8gYSB0YWcgb3IgY29tbWl0IG9iamVjdCIKK21zZ2lkICJ0YWcgW25vdW5dIgorbXNnc3RyICJldGljaGV0dGEsIGV0aWNoZXR0YXR1cmEgKFRvcnRvaXNlQ1ZTKSIKKworIy4gIiIKK21zZ2lkICJ0YWcgW3ZlcmJdIgorbXNnc3RyICJldGljaGV0dGFyZSIKKworIy4gIkEgcmVndWxhciBnaXQgYnJhbmNoIHRoYXQgaXMgdXNlZCB0byBmb2xsb3cgY2hhbmdlcyBmcm9tIGFub3RoZXIgcmVwb3NpdG9yeS4iCittc2dpZCAidHJhY2tpbmcgYnJhbmNoIgorbXNnc3RyICIiCisiZHVwbGljYXRvIGxvY2FsZSBkaSByYW1vIHJlbW90bywgcmFtbyBpbiAndHJhY2tpbmcnLCByYW1vIGluc2VndWl0b3JlPyByYW1vICIKKyJkaSB7aW5zZWd1aW1lbnRvLGFsbGluZWFtZW50byxyaWxldmFtZW50byxwdW50YW1lbnRvfT8iCisKKyMuICIiCittc2dpZCAidW5kbyIKK21zZ3N0ciAiYW5udWxsYSIKKworIy4gIiIKK21zZ2lkICJ1cGRhdGUiCittc2dzdHIgImFnZ2lvcm5hbWVudG8sIGFnZ2lvcm5hcmUiCisKKyMuICIiCittc2dpZCAidmVyaWZ5IgorbXNnc3RyICJ2ZXJpZmljYSwgdmVyaWZpY2FyZSIKKworIy4gIlRoZSB0cmVlIG9mIGFjdHVhbCBjaGVja2VkIG91dCBmaWxlcy4iCittc2dpZCAid29ya2luZyBjb3B5LCB3b3JraW5nIHRyZWUiCittc2dzdHIgImRpcmVjdG9yeSBkaSBsYXZvcm8sIGNvcGlhIGRpIGxhdm9ybyIKZGlmZiAtLWdpdCBhL2dpdC1ndWkvcG8vZ2xvc3NhcnkvdHh0LXRvLXBvdC5zaCBiL2dpdC1ndWkvcG8vZ2xvc3NhcnkvdHh0LXRvLXBvdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40OWJmN2M1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9wby9nbG9zc2FyeS90eHQtdG8tcG90LnNoCkBAIC0wLDAgKzEsNDggQEAKKyMhL2Jpbi9zaAorIyBUaGlzIGlzIGEgdmVyeSwgX3ZlcnlfLCBzaW1wbGUgc2NyaXB0IHRvIGNvbnZlcnQgYSB0YWItc2VwYXJhdGVkCisjIC50eHQgZmlsZSBpbnRvIGEgLnBvdC8ucG8uCisjIEl0cyBub3QgY2xldmVyIGJ1dCBpdCB0b29rIG1lIDIgbWludXRlcyB0byB3cml0ZSA6KQorIyBNaWNoYWVsIFR3b21leSA8bWljaGFlbC50d29tZXlAaXJlbGFuZC5zdW4uY29tPgorIyAyMyBNYXJjaCAyMDAxCisjIHdpdGggc2xpZ2h0IEdudUNhc2ggbW9kaWZpY2F0aW9ucyBieSBDaHJpc3RpYW4gU3RpbW1pbmcgPHN0aW1taW5nQHR1aGguZGU+CisjIDE5IEF1ZyAyMDAxLCAyMyBKdWwgMjAwNworCisjY2hlY2sgYXJncworaWYgWyAkIyAtZXEgMCBdCit0aGVuCisJY2F0IDw8IQorVXNhZ2U6IGBiYXNlbmFtZSAkMGAgZ2l0LWd1aS1nbG9zc2FyeS50eHQgPiBnaXQtZ3VpLWdsb3NzYXJ5LnBvdAorIQorCWV4aXQgMTsKK2ZpCisKK0dMT1NTQVJZX0NTVj0iJDEiOworCitpZiBbICEgLWYgIiRHTE9TU0FSWV9DU1YiIF0KK3RoZW4KKwllY2hvICJDYW4ndCBmaW5kICRHTE9TU0FSWV9DU1YuIjsKKwlleGl0IDE7CitmaQorCitjYXQgPDwhCisjIFNPTUUgREVTQ1JJUFRJVkUgVElUTEUuCisjIENvcHlyaWdodCAoQykgWUVBUiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgRklSU1QgQVVUSE9SIDxFTUFJTEBBRERSRVNTPiwgWUVBUi4KKyMKKyMsIGZ1enp5Cittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBQQUNLQUdFIFZFUlNJT05cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogYGRhdGUgKyclWS0lbS0lZCAlSDolTSV6J2BcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cbiIKKyJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUNIQVJTRVRcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBFTkNPRElOR1xuIgorCishCisKKyNZZXMgdGhpcyBpcyB0aGUgbW9zdCBzaW1wbGUgYXdrIHNjcmlwdCB5b3UndmUgZXZlciBzZWVuIDopCithd2sgLUYnXHQnICd7aWYgKCQyICE9ICIiKSBwcmludCAiIy4gIiQyOyBwcmludCAibXNnaWQgIiQxOyBwcmludCAibXNnc3RyIFwiXCJcbiJ9JyBcCiskR0xPU1NBUllfQ1NWCmRpZmYgLS1naXQgYS9naXQtZ3VpL3BvL2dsb3NzYXJ5L3poX2NuLnBvIGIvZ2l0LWd1aS9wby9nbG9zc2FyeS96aF9jbi5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTg4MzViCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9wby9nbG9zc2FyeS96aF9jbi5wbwpAQCAtMCwwICsxLDE3MCBAQAorIyBUcmFuc2xhdGlvbiBvZiBnaXQtZ3VpIGdsb3NzYXJ5IHRvIFNpbXBsaWZpZWQgQ2hpbmVzZQorIyBDb3B5cmlnaHQgKEMpIDIwMDcgU2hhd24gUGVhcmNlLCBldCBhbC4KKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGdpdCBwYWNrYWdlLgorIyBYdWRvbmcgR3VhbiA8eHVkb25nLmd1YW5AZ21haWwuY29tPiBhbmQgdGhlIHpoLWtlcm5lbC5vcmcgbWFpbGluZyBsaXN0LCAyMDA3CisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnaXQtZ3VpIGdsb3NzYXJ5XG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwNy0wNy0yMyAyMjowNyswMjAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBYdWRvbmcgR3VhbiA8eHVkb25nLmd1YW5AZ21haWwuY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IFNpbXBsaWZpZWQgQ2hpbmVzZSBcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKworIy4gIkVuZ2xpc2ggRGVmaW5pdGlvbiAoRGVhciB0cmFuc2xhdG9yOiBUaGlzIGZpbGUgd2lsbCBuZXZlciBiZSB2aXNpYmxlIHRvIHRoZSB1c2VyISBJdCBzaG91bGQgb25seSBzZXJ2ZSBhcyBhIHRvb2wgZm9yIHlvdSwgdGhlIHRyYW5zbGF0b3IuIE5vdGhpbmcgbW9yZS4pIgorbXNnaWQgIiIKKyJFbmdsaXNoIFRlcm0gKERlYXIgdHJhbnNsYXRvcjogVGhpcyBmaWxlIHdpbGwgbmV2ZXIgYmUgdmlzaWJsZSB0byB0aGUgdXNlciEpIgorbXNnc3RyICLms6jvvJrov5nkuKrmlofku7bmmK/kuLrkuobluK7liqnnv7vor5HkurrlkZjnu5/kuIDlkI3or43mnK/or63jgILmnIDnu4jnlKjmiLfkuI3kvJrlhbPlv4Pov5nkuKrmlofku7bjgIIiCisKKyMuICIiCisjLiBhbWVuZOaMh+eUqOaIt+S/ruaUueacgOi/keS4gOasoWNvbW1pdOeahOaTjeS9nO+8jOS/ruiuou+8n+S/ruaUue+8n+S/ruato++8nworIy4gW1dBTkcgQ29uZ106IOagueaNruaIkeeahOS6huino++8jOi/meS4quivjeS8vOS5jue/u+ivkeaIkOKAnOS/ruiuouKAneWkmuS4gOS6m+OAguKAnOS/ruato+KAneS5n+WPr+S7pe+8jOKAnOS/ruaUueKAneWGjeasoeS5i+OAggorIy4gW1pIQU5HIExlXTog5L+u6K6i77yM5oSf6KeJ5LiA6Iis5oyH5a+55LiA5Lqb5aSn5Z6L5Ye654mI54mp55qE5aSn6KeE5qih5Y2H57qn77yM5q+U5aaC5L+u6K6i5paw5Y2O5a2X5YW4CisjICAgICAgICAgICAgICDkv67mraPvvIzlhbblrp7mr4/mrKFhbWVuZOeahOe7k+aenOS5n+S4jeS4gOWumuWwseaYr+acgOWQjue7k+aenO+8jOivtOS4jeWumui/mOmcgOimgeS/ruaUueOAguaJgOS7peS4jQorIyAgICAgICAgICAgICAg5aaC5bCx5Y+r5L+u5pS5Cittc2dpZCAiYW1lbmQiCittc2dzdHIgIuS/ruiuoiIKKworIy4gIiIKKyMuIGdpdCBhbm5vdGF0ZSDmlofku7blkI3vvJrnlKjmnaXmoIfms6jmlofku7bnmoTmr4/kuIDooYzlnKjku4DkuYjml7blgJnooqvosIHmnIDlkI7kv67mlLnjgIIKKyMuIFtXQU5HIENvbmddOiAi5qCH6K6wIuS4gOiIrOaYr21hcmvjgII7KQorIy4gW1pIQU5HIExlXTog5qCH5rOo77yM5oiW6ICF5bmy6ISG55So5Y6f5oSP77ya5rOo6Kej77yM5oiW5rOo6YeKCittc2dpZCAiYW5ub3RhdGUiCittc2dzdHIgIuagh+azqCIKKworIy4gIkEgJ2JyYW5jaCcgaXMgYW4gYWN0aXZlIGxpbmUgb2YgZGV2ZWxvcG1lbnQuIgorbXNnaWQgImJyYW5jaCBbbm91bl0iCittc2dzdHIgIuWIhuaUryIKKworIy4gIiIKK21zZ2lkICJicmFuY2ggW3ZlcmJdIgorbXNnc3RyICLlu7rnq4vliIbmlK8iCisKKyMuICIiCisjLiBbV0FORyBDb25nXTog572R5LiK5pyJ5Lq657+76K+R5oiQ4oCc5qOA5Ye64oCd77yM5oiR5oSf6KeJ5pu05aW95LiA5Lqb77yM5q+V56uf5oqKY2hlY2vnmoTmhI/mgJ3nv7vor5Hlh7rmnaXkuobjgIIKKyMuIFtaSE5BRyBMZV06IOaPkOWPluWQp++8jOaPkOWPluWIhuaUr++8j+eJiOacrAorIy4gW3JhZSBsXTog562+5Ye644CCc3VidmVyc2lvbui9r+S7tuS4reeahOWkp+Wkmuivjeaxh+W3suaciee/u+ivke+8jOaXoueEtmdpdOS4jnN1YnZlcnNpb27lkIzmmK9TQ03nrqHnkIbvvIzlj6/ku6Xlj4LogIPlkIznsbvova/ku7bnmoTnv7vor5HkuZ/kuI3plJnjgIIKK21zZ2lkICJjaGVja291dCBbbm91bl0iCittc2dzdHIgIuetvuWHuiIKKworIy4gIlRoZSBhY3Rpb24gb2YgdXBkYXRpbmcgdGhlIHdvcmtpbmcgdHJlZSB0byBhIHJldmlzaW9uIHdoaWNoIHdhcyBzdG9yZWQgaW4gdGhlIG9iamVjdCBkYXRhYmFzZS4iCittc2dpZCAiY2hlY2tvdXQgW3ZlcmJdIgorbXNnc3RyICLnrb7lh7oiCisKKyMuICJBIHNpbmdsZSBwb2ludCBpbiB0aGUgZ2l0IGhpc3RvcnkuIgorbXNnaWQgImNvbW1pdCBbbm91bl0iCittc2dzdHIgIuaPkOS6pCIKKworIy4gIlRoZSBhY3Rpb24gb2Ygc3RvcmluZyBhIG5ldyBzbmFwc2hvdCBvZiB0aGUgcHJvamVjdCdzIHN0YXRlIGluIHRoZSBnaXQgaGlzdG9yeS4iCittc2dpZCAiY29tbWl0IFt2ZXJiXSIKK21zZ3N0ciAi5o+Q5LqkIgorCisjLiAiIgorIy4g5beu5byC77yf5beu5Yir77yfCisjLiBbWkhBTkcgTGVdOiDkuKrkurrmhJ/op4nlt67liKvmm7TliqDkuK3mgKfkuIDkupsKK21zZ2lkICJkaWZmIFtub3VuXSIKK21zZ3N0ciAi5beu5YirIgorCisjLiAiIgorbXNnaWQgImRpZmYgW3ZlcmJdIgorbXNnc3RyICLmr5TovoMiCisKKyMuICJBIGZhc3QtZm9yd2FyZCBpcyBhIHNwZWNpYWwgdHlwZSBvZiBtZXJnZSB3aGVyZSB5b3UgaGF2ZSBhIHJldmlzaW9uIGFuZCB5b3UgYXJlIG1lcmdpbmcgYW5vdGhlciBicmFuY2gncyBjaGFuZ2VzIHRoYXQgaGFwcGVuIHRvIGJlIGEgZGVzY2VuZGFudCBvZiB3aGF0IHlvdSBoYXZlLiIKK21zZ2lkICJmYXN0IGZvcndhcmQgbWVyZ2UiCittc2dzdHIgIuW/q+i/m+W8j+WQiOW5tiIKKworIy4gIkZldGNoaW5nIGEgYnJhbmNoIG1lYW5zIHRvIGdldCB0aGUgYnJhbmNoJ3MgaGVhZCBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnksIHRvIGZpbmQgb3V0IHdoaWNoIG9iamVjdHMgYXJlIG1pc3NpbmcgZnJvbSB0aGUgbG9jYWwgb2JqZWN0IGRhdGFiYXNlLCBhbmQgdG8gZ2V0IHRoZW0sIHRvby4iCisjLiDojrflj5bvvJ/lj5blvpfvvJ/kuIvovb3vvJ/mm7TmlrDvvJ/ms6jmhI/lkox1cGRhdGXnmoTljLrliIYKK21zZ2lkICJmZXRjaCIKK21zZ3N0ciAi6I635Y+WIgorCisjLiAiQSBjb2xsZWN0aW9uIG9mIGZpbGVzLiBUaGUgaW5kZXggaXMgYSBzdG9yZWQgdmVyc2lvbiBvZiB5b3VyIHdvcmtpbmcgdHJlZS4iCisjLiBpbmRleOaYr3dvcmtpbmcgdHJlZeWSjHJlcG9zaXRvcnnkuYvpl7TnmoTnvJPlrZgKK21zZ2lkICJpbmRleCAoaW4gZ2l0LWd1aTogc3RhZ2luZyBhcmVhKSIKK21zZ3N0ciAi5bel5L2c57yT5a2Y77yfIgorCisjLiAiQSBzdWNjZXNzZnVsIG1lcmdlIHJlc3VsdHMgaW4gdGhlIGNyZWF0aW9uIG9mIGEgbmV3IGNvbW1pdCByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZiB0aGUgbWVyZ2UuIgorbXNnaWQgIm1lcmdlIFtub3VuXSIKK21zZ3N0ciAi5ZCI5bm2IgorCisjLiAiVG8gYnJpbmcgdGhlIGNvbnRlbnRzIG9mIGFub3RoZXIgYnJhbmNoIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoLiIKK21zZ2lkICJtZXJnZSBbdmVyYl0iCittc2dzdHIgIuWQiOW5tiIKKworIy4gIiIKKyMuIG1lc3NhZ2XmmK/mjIdjb21taXTkuK3nmoTmloflrZfkv6Hmga8KK21zZ2lkICJtZXNzYWdlIgorbXNnc3RyICLmj4/ov7AiCisKKyMuICJQdWxsaW5nIGEgYnJhbmNoIG1lYW5zIHRvIGZldGNoIGl0IGFuZCBtZXJnZSBpdC4iCittc2dpZCAicHVsbCIKK21zZ3N0ciAi6I635Y+W77yL5ZCI5bm2IgorCisjLiAiUHVzaGluZyBhIGJyYW5jaCBtZWFucyB0byBnZXQgdGhlIGJyYW5jaCdzIGhlYWQgcmVmIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeSwgYW5kIC4uLiAod2VsbCwgY2FuIHNvbWVvbmUgcGxlYXNlIGV4cGxhaW4gaXQgZm9yIG1lcmUgbW9ydGFscz8pIgorbXNnaWQgInB1c2giCittc2dzdHIgIuaOqOWFpSIKKworIy4gIiIKK21zZ2lkICJyZWRvIgorbXNnc3RyICLph43lgZoiCisKKyMuICJBIGNvbGxlY3Rpb24gb2YgcmVmcyAoPykgdG9nZXRoZXIgd2l0aCBhbiBvYmplY3QgZGF0YWJhc2UgY29udGFpbmluZyBhbGwgb2JqZWN0cyB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gdGhlIHJlZnMuLi4gKG9vcHMsIHlvdSd2ZSBsb3N0IG1lIGhlcmUuIEFnYWluLCBwbGVhc2UgYW4gZXhwbGFuYXRpb24gZm9yIG1lcmUgbW9ydGFscz8pIgorbXNnaWQgInJlcG9zaXRvcnkiCittc2dzdHIgIuS7k+W6kyIKKworIy4gIiIKK21zZ2lkICJyZXNldCIKK21zZ3N0ciAi6YeN572uIgorCisjLiAiIgorbXNnaWQgInJldmVydCIKK21zZ3N0ciAi5oGi5aSNIgorCisjLiAiQSBwYXJ0aWN1bGFyIHN0YXRlIG9mIGZpbGVzIGFuZCBkaXJlY3RvcmllcyB3aGljaCB3YXMgc3RvcmVkIGluIHRoZSBvYmplY3QgZGF0YWJhc2UuIgorbXNnaWQgInJldmlzaW9uIgorbXNnc3RyICLniYjmnKwiCisKKyMuICIiCittc2dpZCAic2lnbiBvZmYiCittc2dzdHIgIuetvuWQjSIKKworIy4gIiIKKyMuIOS8vOS5juaYr2dpdC1ndWnph4zpnaLmmL7npLrnmoTmnKzmrKHmj5DkuqTnmoTmlofku7bmuIXljZXljLrln58KK21zZ2lkICJzdGFnaW5nIGFyZWEiCittc2dzdHIgIuaPkOS6pOaaguWtmOWMuiIKKworIy4gIiIKK21zZ2lkICJzdGF0dXMiCittc2dzdHIgIueKtuaAgSIKKworIy4gIkEgcmVmIHBvaW50aW5nIHRvIGEgdGFnIG9yIGNvbW1pdCBvYmplY3QiCittc2dpZCAidGFnIFtub3VuXSIKK21zZ3N0ciAi5qCH562+IgorCisjLiAiIgorbXNnaWQgInRhZyBbdmVyYl0iCittc2dzdHIgIua3u+WKoOagh+etviIKKworIy4gIkEgcmVndWxhciBnaXQgYnJhbmNoIHRoYXQgaXMgdXNlZCB0byBmb2xsb3cgY2hhbmdlcyBmcm9tIGFub3RoZXIgcmVwb3NpdG9yeS4iCittc2dpZCAidHJhY2tpbmcgYnJhbmNoIgorbXNnc3RyICLot5/ouKrliIbmlK8iCisKKyMuICIiCittc2dpZCAidW5kbyIKK21zZ3N0ciAi5pKk6ZSAIgorCisjLiAiIgorbXNnaWQgInVwZGF0ZSIKK21zZ3N0ciAi5pu05paw44CC5rOo5oSP5ZKMZmV0Y2jnmoTljLrliIYiCisKKyMuICIiCittc2dpZCAidmVyaWZ5IgorbXNnc3RyICLpqozor4EiCisKKyMuICJUaGUgdHJlZSBvZiBhY3R1YWwgY2hlY2tlZCBvdXQgZmlsZXMuIgorIy4gIuW3peS9nOWJr+acrO+8n+W3peS9nOWMuuWfn++8n+W3peS9nOebruW9lSIKKyMuIFtMSSBZYW5nXTog5b2T5YmN5Ymv5pys77yMIOW9k+WJjea6kOeggeagke+8nworbXNnaWQgIndvcmtpbmcgY29weSwgd29ya2luZyB0cmVlIgorbXNnc3RyICLlt6XkvZzlia/mnKzvvIzlt6XkvZzmupDnoIHmoJEiCmRpZmYgLS1naXQgYS9naXQtZ3VpL3BvL2h1LnBvIGIvZ2l0LWd1aS9wby9odS5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODc2MGVkCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9wby9odS5wbwpAQCAtMCwwICsxLDIwMjUgQEAKKyMgSHVuZ2FyaWFuIHRyYW5zbGF0aW9ucyBmb3IgZ2l0LWd1aS1pIHBhY2thZ2UuCisjIENvcHlyaWdodCAoQykgMjAwNyBUSEUgZ2l0LWd1aS1pJ1MgQ09QWVJJR0hUIEhPTERFUgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ2l0LWd1aS1pIHBhY2thZ2UuCisjIE1pa2xvcyBWYWpuYSA8dm1pa2xvc0BmcnVnYWx3YXJlLm9yZz4sIDIwMDcuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnaXQtZ3VpLWkgMThuXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IFxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDA4LTAzLTE0IDA3OjE4KzAxMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA4LTAzLTE0IDE3OjI0KzAxMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IE1pa2xvcyBWYWpuYSA8dm1pa2xvc0BmcnVnYWx3YXJlLm9yZz5cbiIKKyJMYW5ndWFnZS1UZWFtOiBIdW5nYXJpYW5cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD0obiAhPSAxKTtcbiIKKworIzogZ2l0LWd1aS5zaDo0MSBnaXQtZ3VpLnNoOjYzNCBnaXQtZ3VpLnNoOjY0OCBnaXQtZ3VpLnNoOjY2MSBnaXQtZ3VpLnNoOjc0NAorIzogZ2l0LWd1aS5zaDo3NjMKK21zZ2lkICJnaXQtZ3VpOiBmYXRhbCBlcnJvciIKK21zZ3N0ciAiZ2l0LWd1aTogdsOpZ3pldGVzIGhpYmEiCisKKyM6IGdpdC1ndWkuc2g6NTkzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBmb250IHNwZWNpZmllZCBpbiAlczoiCittc2dzdHIgIsOJcnbDqW55dGVsZW4gZm9udCBsZXR0IG1lZ2FkdmEgaXR0OiAlczoiCisKKyM6IGdpdC1ndWkuc2g6NjIwCittc2dpZCAiTWFpbiBGb250IgorbXNnc3RyICJGxZEgYmV0xbF0w61wdXMiCisKKyM6IGdpdC1ndWkuc2g6NjIxCittc2dpZCAiRGlmZi9Db25zb2xlIEZvbnQiCittc2dzdHIgIkRpZmYva29uem9sIGJldMWxdMOtcHVzIgorCisjOiBnaXQtZ3VpLnNoOjYzNQorbXNnaWQgIkNhbm5vdCBmaW5kIGdpdCBpbiBQQVRILiIKK21zZ3N0ciAiQSBnaXQgbmVtIHRhbMOhbGhhdMOzIGEgUEFUSC1iYW4uIgorCisjOiBnaXQtZ3VpLnNoOjY2MgorbXNnaWQgIkNhbm5vdCBwYXJzZSBHaXQgdmVyc2lvbiBzdHJpbmc6IgorbXNnc3RyICJOZW0gw6lydGVsbWV6aGV0xZEgYSBHaXQgdmVyemnDsyBzenRyaW5nOiIKKworIzogZ2l0LWd1aS5zaDo2ODAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiR2l0IHZlcnNpb24gY2Fubm90IGJlIGRldGVybWluZWQuXG4iCisiXG4iCisiJXMgY2xhaW1zIGl0IGlzIHZlcnNpb24gJyVzJy5cbiIKKyJcbiIKKyIlcyByZXF1aXJlcyBhdCBsZWFzdCBHaXQgMS41LjAgb3IgbGF0ZXIuXG4iCisiXG4iCisiQXNzdW1lICclcycgaXMgdmVyc2lvbiAxLjUuMD9cbiIKK21zZ3N0ciAiIgorIk5lbSDDoWxsw61ww610aGF0w7MgbWVnIGEgR2l0IHZlcnppw7NqYS5cbiIKKyJcbiIKKyJBKHopICVzIHN6ZXJpbnQgYSB2ZXJ6acOzICclcycuXG4iCisiXG4iCisiQSh6KSAlcyBhIEdpdCAxLjUuMCB2YWd5IGvDqXPFkWJiaSB2ZXJ6acOzasOhdCBpZ8OpbnlsaS5cbiIKKyJcbiIKKyJGZWx0w6l0ZWxlemhldGrDvGssIGhvZ3kgYSh6KSAnJXMnIHZlcnppw7NqYSBsZWdhbMOhYmIgMS41LjA/XG4iCisKKyM6IGdpdC1ndWkuc2g6OTE4Cittc2dpZCAiR2l0IGRpcmVjdG9yeSBub3QgZm91bmQ6IgorbXNnc3RyICJBIEdpdCBrw7ZueXZ0w6FyIG5lbSB0YWzDoWxoYXTDszoiCisKKyM6IGdpdC1ndWkuc2g6OTI1Cittc2dpZCAiQ2Fubm90IG1vdmUgdG8gdG9wIG9mIHdvcmtpbmcgZGlyZWN0b3J5OiIKK21zZ3N0ciAiTmVtIGxlaGV0IGEgbXVua2Frw7ZueXZ0w6FyIHRldGVqw6lyZSBsw6lwbmk6IgorCisjOiBnaXQtZ3VpLnNoOjkzMgorbXNnaWQgIkNhbm5vdCB1c2UgZnVubnkgLmdpdCBkaXJlY3Rvcnk6IgorbXNnc3RyICJOZW0gaGFzem7DoWxoYXTDsyB2aWNjZXMgLmdpdCBrw7ZueXZ0w6FyOiIKKworIzogZ2l0LWd1aS5zaDo5MzcKK21zZ2lkICJObyB3b3JraW5nIGRpcmVjdG9yeSIKK21zZ3N0ciAiTmluY3MgbXVua2Frw7ZueXZ0w6FyIgorCisjOiBnaXQtZ3VpLnNoOjEwODQgbGliL2NoZWNrb3V0X29wLnRjbDoyODMKK21zZ2lkICJSZWZyZXNoaW5nIGZpbGUgc3RhdHVzLi4uIgorbXNnc3RyICJBIGbDoWpsb2sgc3TDoXR1c3rDoW5hayBmcmlzc8OtdMOpc2UuLi4iCisKKyM6IGdpdC1ndWkuc2g6MTE0OQorbXNnaWQgIlNjYW5uaW5nIGZvciBtb2RpZmllZCBmaWxlcyAuLi4iCittc2dzdHIgIk3Ds2Rvc8OtdG90dCBmw6FqbG9rIGtlcmVzw6lzZSAuLi4iCisKKyM6IGdpdC1ndWkuc2g6MTMyNCBsaWIvYnJvd3Nlci50Y2w6MjQ2Cittc2dpZCAiUmVhZHkuIgorbXNnc3RyICJLw6lzei4iCisKKyM6IGdpdC1ndWkuc2g6MTU5MAorbXNnaWQgIlVubW9kaWZpZWQiCittc2dzdHIgIk5lbSBtw7Nkb3PDrXRvdHQiCisKKyM6IGdpdC1ndWkuc2g6MTU5MgorbXNnaWQgIk1vZGlmaWVkLCBub3Qgc3RhZ2VkIgorbXNnc3RyICJNw7Nkb3PDrXRvdHQsIGRlIG5lbSBraXbDoWxhc3p0b3R0IgorCisjOiBnaXQtZ3VpLnNoOjE1OTMgZ2l0LWd1aS5zaDoxNTk4Cittc2dpZCAiU3RhZ2VkIGZvciBjb21taXQiCittc2dzdHIgIktpdsOhbGFzenR2YSBjb21taXRvbMOhc3JhIgorCisjOiBnaXQtZ3VpLnNoOjE1OTQgZ2l0LWd1aS5zaDoxNTk5Cittc2dpZCAiUG9ydGlvbnMgc3RhZ2VkIGZvciBjb21taXQiCittc2dzdHIgIlLDqXN6ZWsga2l2w6FsYXN6dHZhIGNvbW1pdG9sw6FzcmEiCisKKyM6IGdpdC1ndWkuc2g6MTU5NSBnaXQtZ3VpLnNoOjE2MDAKK21zZ2lkICJTdGFnZWQgZm9yIGNvbW1pdCwgbWlzc2luZyIKK21zZ3N0ciAiS2l2w6FsYXN6dHZhIGNvbW1pdG9sw6FzcmEsIGhpw6FueXrDsyIKKworIzogZ2l0LWd1aS5zaDoxNTk3Cittc2dpZCAiVW50cmFja2VkLCBub3Qgc3RhZ2VkIgorbXNnc3RyICJOZW0ga8O2dmV0ZXR0LCBuZW0ga2l2w6FsYXN6dG90dCIKKworIzogZ2l0LWd1aS5zaDoxNjAyCittc2dpZCAiTWlzc2luZyIKK21zZ3N0ciAiSGnDoW55esOzIgorCisjOiBnaXQtZ3VpLnNoOjE2MDMKK21zZ2lkICJTdGFnZWQgZm9yIHJlbW92YWwiCittc2dzdHIgIktpdsOhbGFzenR2YSBlbHTDoXZvbMOtdMOhc3JhIgorCisjOiBnaXQtZ3VpLnNoOjE2MDQKK21zZ2lkICJTdGFnZWQgZm9yIHJlbW92YWwsIHN0aWxsIHByZXNlbnQiCittc2dzdHIgIktpdsOhbGFzenR2YSBlbHTDoXZvbMOtdMOhc3JhLCBqZWxlbmxlZyBpcyBlbMOpcmhldMWRIgorCisjOiBnaXQtZ3VpLnNoOjE2MDYgZ2l0LWd1aS5zaDoxNjA3IGdpdC1ndWkuc2g6MTYwOCBnaXQtZ3VpLnNoOjE2MDkKK21zZ2lkICJSZXF1aXJlcyBtZXJnZSByZXNvbHV0aW9uIgorbXNnc3RyICJNZXJnZSBmZWxvbGTDoXMgc3rDvGtzw6lnZXMiCisKKyM6IGdpdC1ndWkuc2g6MTY0NAorbXNnaWQgIlN0YXJ0aW5nIGdpdGsuLi4gcGxlYXNlIHdhaXQuLi4iCittc2dzdHIgIkEgZ2l0ayBpbmTDrXTDoXNhLi4uIHbDoXJqdW5rLi4uIgorCisjOiBnaXQtZ3VpLnNoOjE2NTMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiVW5hYmxlIHRvIHN0YXJ0IGdpdGs6XG4iCisiXG4iCisiJXMgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIiIKKyJBIGdpdGsgaW5kw610w6FzYSBzaWtlcnRlbGVuOlxuIgorIlxuIgorIkEoeikgJXMgbmVtIGzDqXRlemlrIgorCisjOiBnaXQtZ3VpLnNoOjE4NjAgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozNgorbXNnaWQgIlJlcG9zaXRvcnkiCittc2dzdHIgIlJlcMOzIgorCisjOiBnaXQtZ3VpLnNoOjE4NjEKK21zZ2lkICJFZGl0IgorbXNnc3RyICJTemVya2VzenTDqXMiCisKKyM6IGdpdC1ndWkuc2g6MTg2MyBsaWIvY2hvb3NlX3Jldi50Y2w6NTYxCittc2dpZCAiQnJhbmNoIgorbXNnc3RyICJCcmFuY2giCisKKyM6IGdpdC1ndWkuc2g6MTg2NiBsaWIvY2hvb3NlX3Jldi50Y2w6NTQ4Cittc2dpZCAiQ29tbWl0QEBub3VuIgorbXNnc3RyICJDb21taXRAQGbFkW7DqXYiCisKKyM6IGdpdC1ndWkuc2g6MTg2OSBsaWIvbWVyZ2UudGNsOjEyMCBsaWIvbWVyZ2UudGNsOjE0OSBsaWIvbWVyZ2UudGNsOjE2NworbXNnaWQgIk1lcmdlIgorbXNnc3RyICJNZXJnZSIKKworIzogZ2l0LWd1aS5zaDoxODcwIGxpYi9jaG9vc2VfcmV2LnRjbDo1NTcKK21zZ2lkICJSZW1vdGUiCittc2dzdHIgIlTDoXZvbGkiCisKKyM6IGdpdC1ndWkuc2g6MTg3OQorbXNnaWQgIkJyb3dzZSBDdXJyZW50IEJyYW5jaCdzIEZpbGVzIgorbXNnc3RyICJBIGplbGVubGVnaSBicmFuY2ggZsOhamxqYWluYWsgYsO2bmfDqXN6w6lzZSIKKworIzogZ2l0LWd1aS5zaDoxODgzCittc2dpZCAiQnJvd3NlIEJyYW5jaCBGaWxlcy4uLiIKK21zZ3N0ciAiQSBicmFuY2ggZsOhamxqYWluYWsgYsO2bmfDqXN6w6lzZS4uLiIKKworIzogZ2l0LWd1aS5zaDoxODg4Cittc2dpZCAiVmlzdWFsaXplIEN1cnJlbnQgQnJhbmNoJ3MgSGlzdG9yeSIKK21zZ3N0ciAiQSBqZWxlbmxlZ2kgYnJhbmNoIHTDtnJ0w6luZXTDqW5layB2aXp1YWxpesOhbMOhc2EiCisKKyM6IGdpdC1ndWkuc2g6MTg5MgorbXNnaWQgIlZpc3VhbGl6ZSBBbGwgQnJhbmNoIEhpc3RvcnkiCittc2dzdHIgIkF6IMO2c3N6ZXMgYnJhbmNoIHTDtnJ0w6luZXTDqW5layB2aXp1YWxpesOhbMOhc2EiCisKKyM6IGdpdC1ndWkuc2g6MTg5OQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkJyb3dzZSAlcydzIEZpbGVzIgorbXNnc3RyICJBKHopICVzIGJyYW5jaCBmw6FqbGphaW5hayBiw7ZuZ8Opc3rDqXNlIgorCisjOiBnaXQtZ3VpLnNoOjE5MDEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJWaXN1YWxpemUgJXMncyBIaXN0b3J5IgorbXNnc3RyICJBKHopICVzIGJyYW5jaCB0w7ZydMOpbmV0w6luZWsgdml6dWFsaXrDoWzDoXNhIgorCisjOiBnaXQtZ3VpLnNoOjE5MDYgbGliL2RhdGFiYXNlLnRjbDoyNyBsaWIvZGF0YWJhc2UudGNsOjY3Cittc2dpZCAiRGF0YWJhc2UgU3RhdGlzdGljcyIKK21zZ3N0ciAiQWRhdGLDoXppcyBzdGF0aXN6dGlrw6FrIgorCisjOiBnaXQtZ3VpLnNoOjE5MDkgbGliL2RhdGFiYXNlLnRjbDozNAorbXNnaWQgIkNvbXByZXNzIERhdGFiYXNlIgorbXNnc3RyICJBZGF0YsOhemlzIHTDtm3DtnLDrXTDqXNlIgorCisjOiBnaXQtZ3VpLnNoOjE5MTIKK21zZ2lkICJWZXJpZnkgRGF0YWJhc2UiCittc2dzdHIgIkFkYXRiw6F6aXMgZWxsZW7FkXJ6w6lzZSIKKworIzogZ2l0LWd1aS5zaDoxOTE5IGdpdC1ndWkuc2g6MTkyMyBnaXQtZ3VpLnNoOjE5MjcgbGliL3Nob3J0Y3V0LnRjbDo3CisjOiBsaWIvc2hvcnRjdXQudGNsOjM5IGxpYi9zaG9ydGN1dC50Y2w6NzEKK21zZ2lkICJDcmVhdGUgRGVza3RvcCBJY29uIgorbXNnc3RyICJBc3p0YWwgaWtvbiBsw6l0cmVob3rDoXNhIgorCisjOiBnaXQtZ3VpLnNoOjE5MzIgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxNzcgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxODUKK21zZ2lkICJRdWl0IgorbXNnc3RyICJLaWzDqXDDqXMiCisKKyM6IGdpdC1ndWkuc2g6MTkzOQorbXNnaWQgIlVuZG8iCittc2dzdHIgIlZpc3N6YXZvbsOhcyIKKworIzogZ2l0LWd1aS5zaDoxOTQyCittc2dpZCAiUmVkbyIKK21zZ3N0ciAiTcOpZ2lzIgorCisjOiBnaXQtZ3VpLnNoOjE5NDYgZ2l0LWd1aS5zaDoyNDQzCittc2dpZCAiQ3V0IgorbXNnc3RyICJLaXbDoWfDoXMiCisKKyM6IGdpdC1ndWkuc2g6MTk0OSBnaXQtZ3VpLnNoOjI0NDYgZ2l0LWd1aS5zaDoyNTIwIGdpdC1ndWkuc2g6MjYxNAorIzogbGliL2NvbnNvbGUudGNsOjY5Cittc2dpZCAiQ29weSIKK21zZ3N0ciAiTcOhc29sw6FzIgorCisjOiBnaXQtZ3VpLnNoOjE5NTIgZ2l0LWd1aS5zaDoyNDQ5Cittc2dpZCAiUGFzdGUiCittc2dzdHIgIkJlaWxsZXN6dMOpcyIKKworIzogZ2l0LWd1aS5zaDoxOTU1IGdpdC1ndWkuc2g6MjQ1MiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MjYKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MzgKK21zZ2lkICJEZWxldGUiCittc2dzdHIgIlTDtnJsw6lzIgorCisjOiBnaXQtZ3VpLnNoOjE5NTkgZ2l0LWd1aS5zaDoyNDU2IGdpdC1ndWkuc2g6MjYxOCBsaWIvY29uc29sZS50Y2w6NzEKK21zZ2lkICJTZWxlY3QgQWxsIgorbXNnc3RyICJNaW5kZW50IGtpdsOhbGFzenQiCisKKyM6IGdpdC1ndWkuc2g6MTk2OAorbXNnaWQgIkNyZWF0ZS4uLiIKK21zZ3N0ciAiTMOpdHJlaG96w6FzLi4uIgorCisjOiBnaXQtZ3VpLnNoOjE5NzQKK21zZ2lkICJDaGVja291dC4uLiIKK21zZ3N0ciAiQ2hlY2tvdXQuLi4iCisKKyM6IGdpdC1ndWkuc2g6MTk4MAorbXNnaWQgIlJlbmFtZS4uLiIKK21zZ3N0ciAiw4F0bmV2ZXrDqXMuLi4iCisKKyM6IGdpdC1ndWkuc2g6MTk4NSBnaXQtZ3VpLnNoOjIwODUKK21zZ2lkICJEZWxldGUuLi4iCittc2dzdHIgIlTDtnJsw6lzLi4uIgorCisjOiBnaXQtZ3VpLnNoOjE5OTAKK21zZ2lkICJSZXNldC4uLiIKK21zZ3N0ciAiVmlzc3phw6FsbMOtdMOhcy4uLiIKKworIzogZ2l0LWd1aS5zaDoyMDAyIGdpdC1ndWkuc2g6MjM4OQorbXNnaWQgIk5ldyBDb21taXQiCittc2dzdHIgIsOaaiBjb21taXQiCisKKyM6IGdpdC1ndWkuc2g6MjAxMCBnaXQtZ3VpLnNoOjIzOTYKK21zZ2lkICJBbWVuZCBMYXN0IENvbW1pdCIKK21zZ3N0ciAiVXRvbHPDsyBjb21taXQgamF2w610w6FzYSIKKworIzogZ2l0LWd1aS5zaDoyMDE5IGdpdC1ndWkuc2g6MjM1NiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjk5Cittc2dpZCAiUmVzY2FuIgorbXNnc3RyICJLZXJlc8OpcyDDumpyYSIKKworIzogZ2l0LWd1aS5zaDoyMDI1Cittc2dpZCAiU3RhZ2UgVG8gQ29tbWl0IgorbXNnc3RyICJLaXbDoWxhc3p0w6FzIGNvbW1pdG9sw6FzcmEiCisKKyM6IGdpdC1ndWkuc2g6MjAzMQorbXNnaWQgIlN0YWdlIENoYW5nZWQgRmlsZXMgVG8gQ29tbWl0IgorbXNnc3RyICJNw7Nkb3PDrXRvdHQgZsOhamxvayBraXbDoWxhc3p0w6FzYSBjb21taXRvbMOhc3JhIgorCisjOiBnaXQtZ3VpLnNoOjIwMzcKK21zZ2lkICJVbnN0YWdlIEZyb20gQ29tbWl0IgorbXNnc3RyICJDb21taXRiYSB2YWzDsyBraXbDoWxhc3p0w6FzIHZpc3N6YXZvbsOhc2EiCisKKyM6IGdpdC1ndWkuc2g6MjA0MiBsaWIvaW5kZXgudGNsOjM5NQorbXNnaWQgIlJldmVydCBDaGFuZ2VzIgorbXNnc3RyICJWw6FsdG96dGF0w6Fzb2sgdmlzc3phw6FsbMOtdMOhc2EiCisKKyM6IGdpdC1ndWkuc2g6MjA0OSBnaXQtZ3VpLnNoOjIzNjggZ2l0LWd1aS5zaDoyNDY3Cittc2dpZCAiU2lnbiBPZmYiCittc2dzdHIgIkFsw6HDrXIiCisKKyM6IGdpdC1ndWkuc2g6MjA1MyBnaXQtZ3VpLnNoOjIzNzIKK21zZ2lkICJDb21taXRAQHZlcmIiCittc2dzdHIgIkNvbW1pdEBAaWdlIgorCisjOiBnaXQtZ3VpLnNoOjIwNjQKK21zZ2lkICJMb2NhbCBNZXJnZS4uLiIKK21zZ3N0ciAiSGVseWkgbWVyZ2UuLi4iCisKKyM6IGdpdC1ndWkuc2g6MjA2OQorbXNnaWQgIkFib3J0IE1lcmdlLi4uIgorbXNnc3RyICJNZXJnZSBtZWdzemFrw610w6FzYS4uLiIKKworIzogZ2l0LWd1aS5zaDoyMDgxCittc2dpZCAiUHVzaC4uLiIKK21zZ3N0ciAiUHVzaC4uLiIKKworIzogZ2l0LWd1aS5zaDoyMDkyIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDEKK21zZ2lkICJBcHBsZSIKK21zZ3N0ciAiQXBwbGUiCisKKyM6IGdpdC1ndWkuc2g6MjA5NSBnaXQtZ3VpLnNoOjIxMTcgbGliL2Fib3V0LnRjbDoxNAorIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NCBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjUwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQWJvdXQgJXMiCittc2dzdHIgIk7DqXZqZWd5OiAlcyIKKworIzogZ2l0LWd1aS5zaDoyMDk5Cittc2dpZCAiUHJlZmVyZW5jZXMuLi4iCittc2dzdHIgIkJlw6FsbMOtdMOhc29rLi4uIgorCisjOiBnaXQtZ3VpLnNoOjIxMDcgZ2l0LWd1aS5zaDoyNjM5Cittc2dpZCAiT3B0aW9ucy4uLiIKK21zZ3N0ciAiT3BjacOzay4uLiIKKworIzogZ2l0LWd1aS5zaDoyMTEzIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDcKK21zZ2lkICJIZWxwIgorbXNnc3RyICJTZWfDrXRzw6lnIgorCisjOiBnaXQtZ3VpLnNoOjIxNTQKK21zZ2lkICJPbmxpbmUgRG9jdW1lbnRhdGlvbiIKK21zZ3N0ciAiT25saW5lIGRva3VtZW50w6FjacOzIgorCisjOiBnaXQtZ3VpLnNoOjIyMzgKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJmYXRhbDogY2Fubm90IHN0YXQgcGF0aCAlczogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIKK21zZ3N0ciAiIgorInbDqWd6ZXRlcyBoaWJhOiBuZW0gw6lyaGV0xZEgZWwgYSh6KSAlcyDDunR2b25hbDogTmluY3MgaWx5ZW4gZsOhamwgdmFneSBrw7ZueXZ0w6FyIgorCisjOiBnaXQtZ3VpLnNoOjIyNzEKK21zZ2lkICJDdXJyZW50IEJyYW5jaDoiCittc2dzdHIgIkplbGVubGVnaSBicmFuY2g6IgorCisjOiBnaXQtZ3VpLnNoOjIyOTIKK21zZ2lkICJTdGFnZWQgQ2hhbmdlcyAoV2lsbCBDb21taXQpIgorbXNnc3RyICJLaXbDoWxhc3p0b3R0IHbDoWx0b3p0YXTDoXNvayAoY29tbWl0b2x2YSBsZXN6KSIKKworIzogZ2l0LWd1aS5zaDoyMzEyCittc2dpZCAiVW5zdGFnZWQgQ2hhbmdlcyIKK21zZ3N0ciAiS2l2w6FsYXN6dGF0bGFuIHbDoWx0b3p0YXTDoXNvayIKKworIzogZ2l0LWd1aS5zaDoyMzYyCittc2dpZCAiU3RhZ2UgQ2hhbmdlZCIKK21zZ3N0ciAiVsOhbHRvenRhdMOhc29rIGtpdsOhbGFzenTDoXNhIgorCisjOiBnaXQtZ3VpLnNoOjIzNzggbGliL3RyYW5zcG9ydC50Y2w6OTMgbGliL3RyYW5zcG9ydC50Y2w6MTgyCittc2dpZCAiUHVzaCIKK21zZ3N0ciAiUHVzaCIKKworIzogZ2l0LWd1aS5zaDoyNDA4Cittc2dpZCAiSW5pdGlhbCBDb21taXQgTWVzc2FnZToiCittc2dzdHIgIktlemRldGkgY29tbWl0IMO8emVuZXQ6IgorCisjOiBnaXQtZ3VpLnNoOjI0MDkKK21zZ2lkICJBbWVuZGVkIENvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAiSmF2w610w7MgY29tbWl0IMO8emVuZXQ6IgorCisjOiBnaXQtZ3VpLnNoOjI0MTAKK21zZ2lkICJBbWVuZGVkIEluaXRpYWwgQ29tbWl0IE1lc3NhZ2U6IgorbXNnc3RyICJLZXpkZXRpIGphdsOtdMOzIGNvbW1pdCDDvHplbmV0OiIKKworIzogZ2l0LWd1aS5zaDoyNDExCittc2dpZCAiQW1lbmRlZCBNZXJnZSBDb21taXQgTWVzc2FnZToiCittc2dzdHIgIkphdsOtdMOzIG1lcmdlIGNvbW1pdCDDvHplbmV0OiIKKworIzogZ2l0LWd1aS5zaDoyNDEyCittc2dpZCAiTWVyZ2UgQ29tbWl0IE1lc3NhZ2U6IgorbXNnc3RyICJNZXJnZSBjb21taXQgw7x6ZW5ldDoiCisKKyM6IGdpdC1ndWkuc2g6MjQxMworbXNnaWQgIkNvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAiQ29tbWl0IMO8emVuZXQ6IgorCisjOiBnaXQtZ3VpLnNoOjI0NTkgZ2l0LWd1aS5zaDoyNjIyIGxpYi9jb25zb2xlLnRjbDo3MworbXNnaWQgIkNvcHkgQWxsIgorbXNnc3RyICLDlnNzemVzIG3DoXNvbMOhc2EiCisKKyM6IGdpdC1ndWkuc2g6MjQ4MyBsaWIvYmxhbWUudGNsOjEwNworbXNnaWQgIkZpbGU6IgorbXNnc3RyICJGw6FqbDoiCisKKyM6IGdpdC1ndWkuc2g6MjU4OQorbXNnaWQgIkFwcGx5L1JldmVyc2UgSHVuayIKK21zZ3N0ciAiSHVuayBhbGthbG1hesOhc2Evdmlzc3phw6FsbMOtdMOhc2EiCisKKyM6IGdpdC1ndWkuc2g6MjU5NQorbXNnaWQgIlNob3cgTGVzcyBDb250ZXh0IgorbXNnc3RyICJLZXZlc2ViYiBrw7ZybnllemV0IG11dGF0w6FzYSIKKworIzogZ2l0LWd1aS5zaDoyNjAyCittc2dpZCAiU2hvdyBNb3JlIENvbnRleHQiCittc2dzdHIgIlTDtmJiIGvDtnJueWV6ZXQgbXV0YXTDoXNhIgorCisjOiBnaXQtZ3VpLnNoOjI2MTAKK21zZ2lkICJSZWZyZXNoIgorbXNnc3RyICJGcmlzc8OtdMOpcyIKKworIzogZ2l0LWd1aS5zaDoyNjMxCittc2dpZCAiRGVjcmVhc2UgRm9udCBTaXplIgorbXNnc3RyICJGb250IG3DqXJldCBjc8O2a2tlbnTDqXNlIgorCisjOiBnaXQtZ3VpLnNoOjI2MzUKK21zZ2lkICJJbmNyZWFzZSBGb250IFNpemUiCittc2dzdHIgIkbDtm50IG3DqXJldCBuw7Z2ZWzDqXNlIgorCisjOiBnaXQtZ3VpLnNoOjI2NDYKK21zZ2lkICJVbnN0YWdlIEh1bmsgRnJvbSBDb21taXQiCittc2dzdHIgIkh1bmsgdMO2cmzDqXNlIGNvbW1pdGLDs2wiCisKKyM6IGdpdC1ndWkuc2g6MjY0OAorbXNnaWQgIlN0YWdlIEh1bmsgRm9yIENvbW1pdCIKK21zZ3N0ciAiSHVuayBraXbDoWxhc3p0w6FzYSBjb21taXRiYSIKKworIzogZ2l0LWd1aS5zaDoyNjY3Cittc2dpZCAiSW5pdGlhbGl6aW5nLi4uIgorbXNnc3RyICJJbmljaWFsaXrDoWzDoXMuLi4iCisKKyM6IGdpdC1ndWkuc2g6Mjc2MgorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJQb3NzaWJsZSBlbnZpcm9ubWVudCBpc3N1ZXMgZXhpc3QuXG4iCisiXG4iCisiVGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHByb2JhYmx5XG4iCisiZ29pbmcgdG8gYmUgaWdub3JlZCBieSBhbnkgR2l0IHN1YnByb2Nlc3MgcnVuXG4iCisiYnkgJXM6XG4iCisiXG4iCittc2dzdHIgIiIKKyJMZWhldHPDqWdlcywgaG9neSBrw7ZybnllemV0aSBwcm9ibMOpbcOhayB2YW5uYWsuXG4iCisiXG4iCisiQSBrw7Z2ZXRrZXrFkSBrw7ZybnllemV0aSB2w6FsdG96w7NrIHZhbMOzc3rDrW7FsWxlZ1xuIgorImZpZ3llbG1lbiBrw612w7xsIGxlc3puZWsgaGFneXZhIGEoeikgJXMgw6FsdGFsXG4iCisiaW5kw610b3R0IGZvbHlhbWF0b2sgw6FsdGFsOlxuIgorIlxuIgorCisjOiBnaXQtZ3VpLnNoOjI3OTIKK21zZ2lkICIiCisiXG4iCisiVGhpcyBpcyBkdWUgdG8gYSBrbm93biBpc3N1ZSB3aXRoIHRoZVxuIgorIlRjbCBiaW5hcnkgZGlzdHJpYnV0ZWQgYnkgQ3lnd2luLiIKK21zZ3N0ciAiIgorIlxuIgorIkV6IGEgQ3lnd2luIMOhbHRhbCB0ZXJqZXN6dGV0dCBUY2wgYmluw6FyaXNiYW5cbiIKKyJsw6l2xZEgaXNtZXJ0IGhpYmEgbWlhdHQgdmFuLiIKKworIzogZ2l0LWd1aS5zaDoyNzk3CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIlxuIgorIkEgZ29vZCByZXBsYWNlbWVudCBmb3IgJXNcbiIKKyJpcyBwbGFjaW5nIHZhbHVlcyBmb3IgdGhlIHVzZXIubmFtZSBhbmRcbiIKKyJ1c2VyLmVtYWlsIHNldHRpbmdzIGludG8geW91ciBwZXJzb25hbFxuIgorIn4vLmdpdGNvbmZpZyBmaWxlLlxuIgorbXNnc3RyICIiCisiXG4iCisiXG4iCisiRWd5IGrDsyBoZWx5ZXR0ZXPDrXTDqXMgYSh6KSAlcyBzesOhbcOhcmFcbiIKKyJhIHVzZXIubmFtZSDDqXMgdXNlci5lbWFpbCBiZcOhbGzDrXTDoXNva1xuIgorImVsaGVseWV6w6lzZSBhIHN6ZW3DqWx5ZXNcbiIKKyJ+Ly5naXRjb25maWcgZsOhamxiYS5cbiIKKworIzogbGliL2Fib3V0LnRjbDoyNgorbXNnaWQgImdpdC1ndWkgLSBhIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZSBmb3IgR2l0LiIKK21zZ3N0ciAiZ2l0LWd1aSAtIGVneSBncmFmaWt1cyBmZWzDvGxldCBhIEdpdGhlei4iCisKKyM6IGxpYi9ibGFtZS50Y2w6NzcKK21zZ2lkICJGaWxlIFZpZXdlciIKK21zZ3N0ciAiRsOhamwgbsOpesWRIgorCisjOiBsaWIvYmxhbWUudGNsOjgxCittc2dpZCAiQ29tbWl0OiIKK21zZ3N0ciAiQ29tbWl0OiIKKworIzogbGliL2JsYW1lLnRjbDoyNjQKK21zZ2lkICJDb3B5IENvbW1pdCIKK21zZ3N0ciAiQ29tbWl0IG3DoXNvbMOhc2EiCisKKyM6IGxpYi9ibGFtZS50Y2w6Mzg0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUmVhZGluZyAlcy4uLiIKK21zZ3N0ciAiQSh6KSAlcyBvbHZhc8Ohc2EuLi4iCisKKyM6IGxpYi9ibGFtZS50Y2w6NDg4Cittc2dpZCAiTG9hZGluZyBjb3B5L21vdmUgdHJhY2tpbmcgYW5ub3RhdGlvbnMuLi4iCittc2dzdHIgIkEgbcOhc29sw6FzdC/DoXRuZXZlesOpc3Qga8O2dmV0xZEgYW5ub3TDoWNpw7NrIGJldMO2bHTDqXNlLi4uIgorCisjOiBsaWIvYmxhbWUudGNsOjUwOAorbXNnaWQgImxpbmVzIGFubm90YXRlZCIKK21zZ3N0ciAic29yIGFubm90w6FsdmEiCisKKyM6IGxpYi9ibGFtZS50Y2w6Njg5Cittc2dpZCAiTG9hZGluZyBvcmlnaW5hbCBsb2NhdGlvbiBhbm5vdGF0aW9ucy4uLiIKK21zZ3N0ciAiQXogZXJlZGV0aSBoZWx5IGFubm90w6FjacOzayBiZXTDtmx0w6lzZS4uLiIKKworIzogbGliL2JsYW1lLnRjbDo2OTIKK21zZ2lkICJBbm5vdGF0aW9uIGNvbXBsZXRlLiIKK21zZ3N0ciAiQXogYW5ub3TDoWNpw7Mga8Opc3ouIgorCisjOiBsaWIvYmxhbWUudGNsOjc0NgorbXNnaWQgIkxvYWRpbmcgYW5ub3RhdGlvbi4uLiIKK21zZ3N0ciAiQXogYW5ub3TDoWNpw7MgYmV0w7ZsdMOpc2UuLi4iCisKKyM6IGxpYi9ibGFtZS50Y2w6ODAyCittc2dpZCAiQXV0aG9yOiIKK21zZ3N0ciAiU3plcnrFkToiCisKKyM6IGxpYi9ibGFtZS50Y2w6ODA2Cittc2dpZCAiQ29tbWl0dGVyOiIKK21zZ3N0ciAiQ29tbWl0ZXI6IgorCisjOiBsaWIvYmxhbWUudGNsOjgxMQorbXNnaWQgIk9yaWdpbmFsIEZpbGU6IgorbXNnc3RyICJFcmVkZXRpIGbDoWpsOiIKKworIzogbGliL2JsYW1lLnRjbDo5MjUKK21zZ2lkICJPcmlnaW5hbGx5IEJ5OiIKK21zZ3N0ciAiRXJlZGV0aSBzemVyesWROiIKKworIzogbGliL2JsYW1lLnRjbDo5MzEKK21zZ2lkICJJbiBGaWxlOiIKK21zZ3N0ciAiRWJiZW4gYSBmw6FqbGJhbjoiCisKKyM6IGxpYi9ibGFtZS50Y2w6OTM2Cittc2dpZCAiQ29waWVkIE9yIE1vdmVkIEhlcmUgQnk6IgorbXNnc3RyICJJZGUgbcOhc29sdGEgdmFneSBoZWx5ZXp0ZToiCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjE0IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjE5Cittc2dpZCAiQ2hlY2tvdXQgQnJhbmNoIgorbXNnc3RyICJCcmFuY2ggY2hlY2tvdXRvbMOhc2EiCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjIzCittc2dpZCAiQ2hlY2tvdXQiCittc2dzdHIgIkNoZWNrb3V0IgorCisjOiBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDoyNyBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MzUKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDozMiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MzAgbGliL2Jyb3dzZXIudGNsOjI4MgorIzogbGliL2NoZWNrb3V0X29wLnRjbDo1MjIgbGliL2Nob29zZV9mb250LnRjbDo0MyBsaWIvbWVyZ2UudGNsOjE3MQorIzogbGliL29wdGlvbi50Y2w6MTAzIGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6NDIgbGliL3RyYW5zcG9ydC50Y2w6OTcKK21zZ2lkICJDYW5jZWwiCittc2dzdHIgIk3DqWdzZW0iCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjMyIGxpYi9icm93c2VyLnRjbDoyODcKK21zZ2lkICJSZXZpc2lvbiIKK21zZ3N0ciAiUmV2w616acOzIgorCisjOiBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDozNiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NjkgbGliL29wdGlvbi50Y2w6MjQyCittc2dpZCAiT3B0aW9ucyIKK21zZ3N0ciAiT3BjacOzayIKKworIzogbGliL2JyYW5jaF9jaGVja291dC50Y2w6MzkgbGliL2JyYW5jaF9jcmVhdGUudGNsOjkyCittc2dpZCAiRmV0Y2ggVHJhY2tpbmcgQnJhbmNoIgorbXNnc3RyICJLw7Z2ZXTFkSBicmFuY2ggbGV0w7ZsdMOpc2UiCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjQ0Cittc2dpZCAiRGV0YWNoIEZyb20gTG9jYWwgQnJhbmNoIgorbXNnc3RyICJIZWx5aSBicmFuY2ggbGV2w6FsYXN6dMOhc2EiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDoyMgorbXNnaWQgIkNyZWF0ZSBCcmFuY2giCittc2dzdHIgIkJyYW5jaCBsw6l0cmVob3rDoXNhIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MjcKK21zZ2lkICJDcmVhdGUgTmV3IEJyYW5jaCIKK21zZ3N0ciAiw5pqIGJyYW5jaCBsw6l0cmVob3rDoXNhIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MzEgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozNzEKK21zZ2lkICJDcmVhdGUiCittc2dzdHIgIkzDqXRyZWhvesOhcyIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjQwCittc2dpZCAiQnJhbmNoIE5hbWUiCittc2dzdHIgIkJyYW5jaCBuZXZlIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NDMKK21zZ2lkICJOYW1lOiIKK21zZ3N0ciAiTsOpdjoiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo1OAorbXNnaWQgIk1hdGNoIFRyYWNraW5nIEJyYW5jaCBOYW1lIgorbXNnc3RyICJFZ3llenRldGVuZMWRIGvDtnZldMOpc2kgYnJhbmNoIG7DqXYiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo2NgorbXNnaWQgIlN0YXJ0aW5nIFJldmlzaW9uIgorbXNnc3RyICJBIGvDtnZldGtlesWRIHJldsOtemnDs3TDs2wiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo3MgorbXNnaWQgIlVwZGF0ZSBFeGlzdGluZyBCcmFuY2g6IgorbXNnc3RyICJMw6l0ZXrFkSBicmFuY2ggZnJpc3PDrXTDqXNlIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NzUKK21zZ2lkICJObyIKK21zZ3N0ciAiTmVtIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6ODAKK21zZ2lkICJGYXN0IEZvcndhcmQgT25seSIKK21zZ3N0ciAiQ3NhayBmYXN0IGZvcndhcmQiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo4NSBsaWIvY2hlY2tvdXRfb3AudGNsOjUxNAorbXNnaWQgIlJlc2V0IgorbXNnc3RyICJWaXNzemHDoWxsw610w6FzIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6OTcKK21zZ2lkICJDaGVja291dCBBZnRlciBDcmVhdGlvbiIKK21zZ3N0ciAiQ2hlY2tvdXQgbMOpdHJlaG96w6FzIHV0w6FuIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MTMxCittc2dpZCAiUGxlYXNlIHNlbGVjdCBhIHRyYWNraW5nIGJyYW5jaC4iCittc2dzdHIgIlbDoWxhc3N6dW5rIGtpIGVneSBrw7Z2ZXTFkSBicmFuY2hldC4iCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDoxNDAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJUcmFja2luZyBicmFuY2ggJXMgaXMgbm90IGEgYnJhbmNoIGluIHRoZSByZW1vdGUgcmVwb3NpdG9yeS4iCittc2dzdHIgIkEoeikgJXMga8O2dmV0xZEgYnJhbmNoIG5lbSBicmFuY2ggYSB0w6F2b2xpIHJlcMOzYmFuLiIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjE1MyBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6ODYKK21zZ2lkICJQbGVhc2Ugc3VwcGx5IGEgYnJhbmNoIG5hbWUuIgorbXNnc3RyICJBZGp1bmsgbWVneSBlZ3kgYnJhbmNoIG5ldmV0LiIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjE2NCBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MTA2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiJyVzJyBpcyBub3QgYW4gYWNjZXB0YWJsZSBicmFuY2ggbmFtZS4iCittc2dzdHIgIkEoeikgJyVzJyBuZW0gZWd5IGVsZm9nYWRoYXTDsyBicmFuY2ggbsOpdi4iCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDoxNQorbXNnaWQgIkRlbGV0ZSBCcmFuY2giCittc2dzdHIgIkJyYW5jaCB0w7ZybMOpc2UiCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDoyMAorbXNnaWQgIkRlbGV0ZSBMb2NhbCBCcmFuY2giCittc2dzdHIgIkhlbHlpIGJyYW5jaCB0w7ZybMOpc2UiCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDozNworbXNnaWQgIkxvY2FsIEJyYW5jaGVzIgorbXNnc3RyICJIZWx5aSBicmFuY2hlayIKKworIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjUyCittc2dpZCAiRGVsZXRlIE9ubHkgSWYgTWVyZ2VkIEludG8iCittc2dzdHIgIkNzYWsgbcOhciBtZXJnZS3Dtmx0IHTDtnJsw6lzZSIKKworIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjU0Cittc2dpZCAiQWx3YXlzIChEbyBub3QgcGVyZm9ybSBtZXJnZSB0ZXN0LikiCittc2dzdHIgIk1pbmRpZyAoTmUgbGVneWVuIG1lcmdlIHRlc3p0LikiCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDoxMDMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJUaGUgZm9sbG93aW5nIGJyYW5jaGVzIGFyZSBub3QgY29tcGxldGVseSBtZXJnZWQgaW50byAlczoiCittc2dzdHIgIkEga8O2dmV0a2V6xZEgYnJhbmNoZWsgbmVtIHRlbGplc2VuIGxldHRlayBtZXJnZS3Dtmx2ZSBlYmJlOiAlczoiCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDoxMTUKK21zZ2lkICIiCisiUmVjb3ZlcmluZyBkZWxldGVkIGJyYW5jaGVzIGlzIGRpZmZpY3VsdC4gXG4iCisiXG4iCisiIERlbGV0ZSB0aGUgc2VsZWN0ZWQgYnJhbmNoZXM/IgorbXNnc3RyICIiCisiQSB0w7Zyw7ZsdCBicmFuY2hlayB2aXNzemHDoWxsw610w6FzYSBib255b2x1bHQuIFxuIgorIlxuIgorIiBCaXp0b3NhbiB0w7ZybGkgYSBraXbDoWxhc3p0b3R0IGJyYW5jaGVrZXQ/IgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MTQxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBkZWxldGUgYnJhbmNoZXM6XG4iCisiJXMiCittc2dzdHIgIiIKKyJOZW0gc2lrZXLDvGx0IHTDtnLDtmxuaSBhIGvDtnZldGtlesWRIGJyYW5jaGVrZXQ6XG4iCisiJXMiCisKKyM6IGxpYi9icmFuY2hfcmVuYW1lLnRjbDoxNCBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MjIKK21zZ2lkICJSZW5hbWUgQnJhbmNoIgorbXNnc3RyICJCcmFuY2ggw6F0bmV2ZXrDqXNlIgorCisjOiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MjYKK21zZ2lkICJSZW5hbWUiCittc2dzdHIgIsOBdG5ldmV6w6lzIgorCisjOiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MzYKK21zZ2lkICJCcmFuY2g6IgorbXNnc3RyICJCcmFuY2g6IgorCisjOiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MzkKK21zZ2lkICJOZXcgTmFtZToiCittc2dzdHIgIsOaaiBuw6l2OiIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjc1Cittc2dpZCAiUGxlYXNlIHNlbGVjdCBhIGJyYW5jaCB0byByZW5hbWUuIgorbXNnc3RyICJWw6FsYXNzenVuayBraSBlZ3kgw6F0bmV2ZXplbmTFkSBicmFuY2hldC4iCisKKyM6IGxpYi9icmFuY2hfcmVuYW1lLnRjbDo5NiBsaWIvY2hlY2tvdXRfb3AudGNsOjE3OQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkJyYW5jaCAnJXMnIGFscmVhZHkgZXhpc3RzLiIKK21zZ3N0ciAiQSh6KSAnJXMnIGJyYW5jaCBtw6FyIGzDqXRlemlrLiIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjExNworIywgdGNsLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byByZW5hbWUgJyVzJy4iCittc2dzdHIgIk5lbSBzaWtlcsO8bHQgw6F0bmV2ZXpuaTogJyVzJy4iCisKKyM6IGxpYi9icm93c2VyLnRjbDoxNworbXNnaWQgIlN0YXJ0aW5nLi4uIgorbXNnc3RyICJJbmTDrXTDoXMuLi4iCisKKyM6IGxpYi9icm93c2VyLnRjbDoyNgorbXNnaWQgIkZpbGUgQnJvd3NlciIKK21zZ3N0ciAiRsOhamwgYsO2bmfDqXN6xZEiCisKKyM6IGxpYi9icm93c2VyLnRjbDoxMjYgbGliL2Jyb3dzZXIudGNsOjE0MworIywgdGNsLWZvcm1hdAorbXNnaWQgIkxvYWRpbmcgJXMuLi4iCittc2dzdHIgIkEoeikgJXMgYmV0w7ZsdMOpc2UuLi4iCisKKyM6IGxpYi9icm93c2VyLnRjbDoxODcKK21zZ2lkICJbVXAgVG8gUGFyZW50XSIKK21zZ3N0ciAiW0ZlbCBhIHN6w7xsxZFow7Z6XSIKKworIzogbGliL2Jyb3dzZXIudGNsOjI2NyBsaWIvYnJvd3Nlci50Y2w6MjczCittc2dpZCAiQnJvd3NlIEJyYW5jaCBGaWxlcyIKK21zZ3N0ciAiQSBicmFuY2ggZsOhamxqYWluYWsgYsO2bmfDqXN6w6lzZSIKKworIzogbGliL2Jyb3dzZXIudGNsOjI3OCBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjM4NworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NzQgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0ODQKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTg3Cittc2dpZCAiQnJvd3NlIgorbXNnc3RyICJCw7ZuZ8Opc3rDqXMiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NzkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJGZXRjaGluZyAlcyBmcm9tICVzIgorbXNnc3RyICJBKHopICVzIGxldMO2bHTDqXNlIGlubmVuOiAlcyIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoxMjcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJmYXRhbDogQ2Fubm90IHJlc29sdmUgJXMiCittc2dzdHIgInbDqWd6ZXRlczogTmVtIGxlaGV0IGZlbG9sZGFuaSBhIGvDtnZldGtlesWRdDogJXMiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MTQwIGxpYi9jb25zb2xlLnRjbDo4MSBsaWIvZGF0YWJhc2UudGNsOjMxCittc2dpZCAiQ2xvc2UiCittc2dzdHIgIkJlesOhcsOhcyIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoxNjkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJCcmFuY2ggJyVzJyBkb2VzIG5vdCBleGlzdC4iCittc2dzdHIgIkEoeikgJyVzJyBicmFuY2ggbmVtIGzDqXRlemlrLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoyMDYKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiQnJhbmNoICclcycgYWxyZWFkeSBleGlzdHMuXG4iCisiXG4iCisiSXQgY2Fubm90IGZhc3QtZm9yd2FyZCB0byAlcy5cbiIKKyJBIG1lcmdlIGlzIHJlcXVpcmVkLiIKK21zZ3N0ciAiIgorIkEoeikgJyVzJyBicmFuY2ggbcOhciBsw6l0ZXppay5cbiIKKyJcbiIKKyJOZW0gbGVoZXQgZmFzdC1mb3J3YXJkb2xuaSBhIGvDtnZldGtlesWRaMO2ejogJXMuXG4iCisiRWd5IG1lcmdlIHN6w7xrc8OpZ2VzLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoyMjAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJNZXJnZSBzdHJhdGVneSAnJXMnIG5vdCBzdXBwb3J0ZWQuIgorbXNnc3RyICJBKHopICclcycgbWVyZ2Ugc3RyYXRlZ3kgbmVtIHTDoW1vZ2F0b3R0LiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoyMzkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gdXBkYXRlICclcycuIgorbXNnc3RyICJOZW0gc2lrZXLDvGx0IGZyaXNzw610ZW5pIGEga8O2dmV0a2V6xZF0OiAnJXMnLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoyNTEKK21zZ2lkICJTdGFnaW5nIGFyZWEgKGluZGV4KSBpcyBhbHJlYWR5IGxvY2tlZC4iCittc2dzdHIgIkEga2l2w6FsYXN6dMOhc2kgdGVyw7xsZXQgKGluZGV4KSBtw6FyIHrDoXJvbHZhIHZhbi4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MjY2Cittc2dpZCAiIgorIkxhc3Qgc2Nhbm5lZCBzdGF0ZSBkb2VzIG5vdCBtYXRjaCByZXBvc2l0b3J5IHN0YXRlLlxuIgorIlxuIgorIkFub3RoZXIgR2l0IHByb2dyYW0gaGFzIG1vZGlmaWVkIHRoaXMgcmVwb3NpdG9yeSBzaW5jZSB0aGUgbGFzdCBzY2FuLiAgQSAiCisicmVzY2FuIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSB0aGUgY3VycmVudCBicmFuY2ggY2FuIGJlIGNoYW5nZWQuXG4iCisiXG4iCisiVGhlIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBub3cuXG4iCittc2dzdHIgIiIKKyJBeiB1dG9sc8OzIGtlcmVzw6lzaSDDoWxsYXBvdCBuZW0gZWd5ZXppayBtZWcgYSByZXDDsyDDoWxscG90w6F2YWwuXG4iCisiXG4iCisiRWd5IG3DoXNpayBHaXQgcHJvZ3JhbSBtw7Nkb3PDrXRvdHRhIGV6dCBhIHJlcMOzdCBheiB1dG9sc8OzIGtlcmVzw6lzIMOzdGEuIEVneSAiCisiw7pqcmFrZXJlc8OpcyBtaW5kZW5rw6lwcGVuIHN6w7xrc8OpZ2VzIG1pZWzFkXR0IGEgamVsZW5sZWdpIGJyYW5jaGV0IG3Ds2Rvc8OtdGFuaSAiCisibGVoZXRuZS5cbiIKKyJcbiIKKyJBeiDDumpyYWtlcmVzw6lzIG1vc3QgYXV0b21hdGlrdXNhbiBlbCBmb2cgaW5kdWxuaS5cbiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDozMjIKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVcGRhdGluZyB3b3JraW5nIGRpcmVjdG9yeSB0byAnJXMnLi4uIgorbXNnc3RyICJBIG11bmtrw7ZueXZ0w6FyIGZyaXNzacOtdMOpc2UgYSBrw7Z2ZXRrZXrFkXJlOiAnJXMnLi4uIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjMyMworbXNnaWQgImZpbGVzIGNoZWNrZWQgb3V0IgorbXNnc3RyICJmw6FqbCBmcmlzc8OtdHZlIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjM1MworIywgdGNsLWZvcm1hdAorbXNnaWQgIkFib3J0ZWQgY2hlY2tvdXQgb2YgJyVzJyAoZmlsZSBsZXZlbCBtZXJnaW5nIGlzIHJlcXVpcmVkKS4iCittc2dzdHIgIkEoeikgJyVzJyBjaGVja291dGphIG1lZ3N6YWvDrXR2YSAoZsOhamxzemludMWxIG1lcmdlLcO2bMOpcyBzesO8a3PDqWdlcykuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjM1NAorbXNnaWQgIkZpbGUgbGV2ZWwgbWVyZ2UgcmVxdWlyZWQuIgorbXNnc3RyICJGw6FqbHN6aW50xbEgbWVyZ2Utw7Zsw6lzIHN6w7xrc8OpZ2VzLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDozNTgKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJTdGF5aW5nIG9uIGJyYW5jaCAnJXMnLiIKK21zZ3N0ciAiSmVsZW5sZWcgYSh6KSAnJXMnIGJyYW5jaGVuLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDo0MjkKK21zZ2lkICIiCisiWW91IGFyZSBubyBsb25nZXIgb24gYSBsb2NhbCBicmFuY2guXG4iCisiXG4iCisiSWYgeW91IHdhbnRlZCB0byBiZSBvbiBhIGJyYW5jaCwgY3JlYXRlIG9uZSBub3cgc3RhcnRpbmcgZnJvbSAnVGhpcyBEZXRhY2hlZCAiCisiQ2hlY2tvdXQnLiIKK21zZ3N0ciAiIgorIk3DoXIgbmVtIGVneSBoZWx5aSBicmFuY2hlbiB2YWd5dW5rLlxuIgorIlxuIgorIkhhIGVneSBicmFuY2hlbiBzemVyZXRuw6luayBsZW5uaSwgaG96enVuayBsw6l0cmUgZWd5ZXQgYXogJ0V6IGEgbGV2w6FsYXN6dG90dCAiCisiY2hlY2tvdXQnLWLDs2wuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjQ0NiBsaWIvY2hlY2tvdXRfb3AudGNsOjQ1MAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkNoZWNrZWQgb3V0ICclcycuIgorbXNnc3RyICInJXMnIGtpZmVqdHZlLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDo0NzgKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJSZXNldHRpbmcgJyVzJyB0byAnJXMnIHdpbGwgbG9zZSB0aGUgZm9sbG93aW5nIGNvbW1pdHM6IgorbXNnc3RyICIiCisiQSh6KSAnJXMnIC0+ICclcycgdmlzc3phw6FsbMOtdMOhcyBhIGvDtnZldGtlesWRIGNvbW1pdG9rIGVsdmVzenTDqXPDqXQgamVsZW50aToiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NTAwCittc2dpZCAiUmVjb3ZlcmluZyBsb3N0IGNvbW1pdHMgbWF5IG5vdCBiZSBlYXN5LiIKK21zZ3N0ciAiQXogZWx2ZXN6ZXR0IGNvbW1pdG9rIGhlbHlyZcOhbGzDrXTDoXNhIG5lbSBiaXp0b3MsIGhvZ3kgZWd5c3plcsWxLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDo1MDUKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJSZXNldCAnJXMnPyIKK21zZ3N0ciAiVmlzc3phw6FsbMOtdGp1ayBhIGvDtnZldGtlesWRdDogJyVzJz8iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NTEwIGxpYi9tZXJnZS50Y2w6MTYzCittc2dpZCAiVmlzdWFsaXplIgorbXNnc3RyICJWaXp1YWxpesOhbMOhcyIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDo1NzgKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIHNldCBjdXJyZW50IGJyYW5jaC5cbiIKKyJcbiIKKyJUaGlzIHdvcmtpbmcgZGlyZWN0b3J5IGlzIG9ubHkgcGFydGlhbGx5IHN3aXRjaGVkLiAgV2Ugc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQgIgorInlvdXIgZmlsZXMsIGJ1dCBmYWlsZWQgdG8gdXBkYXRlIGFuIGludGVybmFsIEdpdCBmaWxlLlxuIgorIlxuIgorIlRoaXMgc2hvdWxkIG5vdCBoYXZlIG9jY3VycmVkLiAgJXMgd2lsbCBub3cgY2xvc2UgYW5kIGdpdmUgdXAuIgorbXNnc3RyICIiCisiTmVtIHNpa2Vyw7xsdCBiZcOhbGzDrXRhbmkgYSBqZWxlbmxlZ2kgYnJhbmNoZXQuXG4iCisiXG4iCisiQSBtdW5rYWvDtm55dnTDoXIgY3NhayByw6lzemJlbiB2w6FsdG90dCDDoXQuICBBIGbDoWpsb2sgc2lrZXJlc2VuIGZyaXNzw610dmUgIgorImxldHRlaywgZGUgbmVtIHNpa2Vyw7xsdCBmcmlzc8OtdGVuaSBlZ3kgYmVsc8WRIEdpdCBmw6FqbHQuXG4iCisiXG4iCisiRW5uZWsgbmVtIHN6YWJhZCBtZWd0w7ZydMOpbm5pZS4gIEEoeikgJXMgbW9zdCBraWzDqXAgw6lzIGZlbGFkamEuIgorCisjOiBsaWIvY2hvb3NlX2ZvbnQudGNsOjM5Cittc2dpZCAiU2VsZWN0IgorbXNnc3RyICJLaXbDoWxhc3p0IgorCisjOiBsaWIvY2hvb3NlX2ZvbnQudGNsOjUzCittc2dpZCAiRm9udCBGYW1pbHkiCittc2dzdHIgIkZvbnQgY3NhbMOhZCIKKworIzogbGliL2Nob29zZV9mb250LnRjbDo3NAorbXNnaWQgIkZvbnQgU2l6ZSIKK21zZ3N0ciAiRm9udCBtw6lyZXQiCisKKyM6IGxpYi9jaG9vc2VfZm9udC50Y2w6OTEKK21zZ2lkICJGb250IEV4YW1wbGUiCittc2dzdHIgIkZvbnQgcMOpbGRhIgorCisjOiBsaWIvY2hvb3NlX2ZvbnQudGNsOjEwMworbXNnaWQgIiIKKyJUaGlzIGlzIGV4YW1wbGUgdGV4dC5cbiIKKyJJZiB5b3UgbGlrZSB0aGlzIHRleHQsIGl0IGNhbiBiZSB5b3VyIGZvbnQuIgorbXNnc3RyICIiCisiRXogZWd5IHDDqWxkYSBzesO2dmVnLlxuIgorIkhhIGV6IG1lZ2ZlbGVsLCBleiBsZWhldCBhIGJldMWxdMOtcHVzLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoyOAorbXNnaWQgIkdpdCBHdWkiCittc2dzdHIgIkdpdCBHdWkiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODEgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozNzYKK21zZ2lkICJDcmVhdGUgTmV3IFJlcG9zaXRvcnkiCittc2dzdHIgIsOaaiByZXDDsyBsw6l0cmVob3rDoXNhIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjg3Cittc2dpZCAiTmV3Li4uIgorbXNnc3RyICLDmmouLi4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTQgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NjAKK21zZ2lkICJDbG9uZSBFeGlzdGluZyBSZXBvc2l0b3J5IgorbXNnc3RyICJMw6l0ZXrFkSByZXDDsyBtw6Fzb2zDoXNhIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEwMAorbXNnaWQgIkNsb25lLi4uIgorbXNnc3RyICJNw6Fzb2zDoXMuLi4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTA3IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTc2Cittc2dpZCAiT3BlbiBFeGlzdGluZyBSZXBvc2l0b3J5IgorbXNnc3RyICJMw6l0ZXrFkSBrw7ZueXZ0w6FyIG1lZ255aXTDoXNhIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjExMworbXNnaWQgIk9wZW4uLi4iCittc2dzdHIgIk1lZ2d5aXTDoXMuLi4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTI2Cittc2dpZCAiUmVjZW50IFJlcG9zaXRvcmllcyIKK21zZ3N0ciAiTGVndXTDs2JiaSByZXDDs2siCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTMyCittc2dpZCAiT3BlbiBSZWNlbnQgUmVwb3NpdG9yeToiCittc2dzdHIgIkxlZ3V0w7NiYmkgcmVww7NrIG1lZ255aXTDoXNhOiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoyOTYgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozMDMKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MzEwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNyZWF0ZSByZXBvc2l0b3J5ICVzOiIKK21zZ3N0ciAiTmVtIHNpa2Vyw7xsdCBsZXRyZWhvem5pIGEoeikgJXMgcmVww7N0OiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozODEgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NzgKK21zZ2lkICJEaXJlY3Rvcnk6IgorbXNnc3RyICJLw7ZueXZ0w6FyOiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0MTIgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1MzcKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTAxMQorbXNnaWQgIkdpdCBSZXBvc2l0b3J5IgorbXNnc3RyICJHaXQgcmVww7MiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDM3CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRGlyZWN0b3J5ICVzIGFscmVhZHkgZXhpc3RzLiIKK21zZ3N0ciAiQSh6KSAnJXMnIGvDtm55dnTDoXIgbcOhciBsw6l0ZXppay4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDQxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRmlsZSAlcyBhbHJlYWR5IGV4aXN0cy4iCittc2dzdHIgIkEoeikgJyVzJyBmw6FqbCBtw6FyIGzDqXRlemlrLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NTUKK21zZ2lkICJDbG9uZSIKK21zZ3N0ciAiQmV6w6Fyw6FzIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ2OAorbXNnaWQgIlVSTDoiCittc2dzdHIgIlVSTDoiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDg5Cittc2dpZCAiQ2xvbmUgVHlwZToiCittc2dzdHIgIk3DoXNvbMOhcyB0w61wdXNhOiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0OTUKK21zZ2lkICJTdGFuZGFyZCAoRmFzdCwgU2VtaS1SZWR1bmRhbnQsIEhhcmRsaW5rcykiCittc2dzdHIgIsOBbHRhbMOhbm9zIChHeW9ycywgZsOpbGlnLXJlZHVuZMOhbnMsIGhhcmRsaW5rZWspIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjUwMQorbXNnaWQgIkZ1bGwgQ29weSAoU2xvd2VyLCBSZWR1bmRhbnQgQmFja3VwKSIKK21zZ3N0ciAiVGVsamVzIG3DoXNvbMOhcyAoTGFzc2FiYiwgcmVkdW5kw6FucyBiaXp0b25zw6FnaSBtZW50w6lzKSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1MDcKK21zZ2lkICJTaGFyZWQgKEZhc3Rlc3QsIE5vdCBSZWNvbW1lbmRlZCwgTm8gQmFja3VwKSIKK21zZ3N0ciAiTWVnb3N6dG90dCAoTGVnZ3lvcnNhYmIsIG5lbSBhasOhbmxvdHQsIG5pbmNzIG1lbnTDqXMpIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjU0MyBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjU5MAorIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3MzYgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo4MDYKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTAxNyBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEwMjUKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJOb3QgYSBHaXQgcmVwb3NpdG9yeTogJXMiCittc2dzdHIgIk5lbSBHaXQgcmVww7M6ICVzIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjU3OQorbXNnaWQgIlN0YW5kYXJkIG9ubHkgYXZhaWxhYmxlIGZvciBsb2NhbCByZXBvc2l0b3J5LiIKK21zZ3N0ciAiQSBzdGFuZGFyZCBjc2FrIGhlbHlpIHJlcMOza3JhIMOpcmhldMWRIGVsLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1ODMKK21zZ2lkICJTaGFyZWQgb25seSBhdmFpbGFibGUgZm9yIGxvY2FsIHJlcG9zaXRvcnkuIgorbXNnc3RyICJBIG1lZ29zenRvdHQgY3NhayBoZWx5aSByZXDDs2tyYSDDqXJoZXTFkSBlbC4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NjA0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiTG9jYXRpb24gJXMgYWxyZWFkeSBleGlzdHMuIgorbXNnc3RyICJBKHopICclcycgaGVseSBtw6FyIGzDqXRlemlrLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo2MTUKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIG9yaWdpbiIKK21zZ3N0ciAiTmVtIHNpa2Vyw7xsdCBiZcOhbGzDrXRhbmkgYXogb3JpZ2ludCIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo2MjcKK21zZ2lkICJDb3VudGluZyBvYmplY3RzIgorbXNnc3RyICJPYmpla3R1bW9rIHN6w6Ftb2zDoXNhIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjYyOAorbXNnaWQgImJ1Y2tldHMiCittc2dzdHIgInbDtmRyw7ZrIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjY1MgorIywgdGNsLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBjb3B5IG9iamVjdHMvaW5mby9hbHRlcm5hdGVzOiAlcyIKK21zZ3N0ciAiTmVtIHNpa2Vyw7xsdCBtw6Fzb2xuaSBheiBvYmplY3RzL2luZm8vYWx0ZXJuYXRlcy10OiAlcyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo2ODgKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJOb3RoaW5nIHRvIGNsb25lIGZyb20gJXMuIgorbXNnc3RyICJTZW1taSBtw6Fzb2xuaSB2YWzDsyBuaW5jcyBpbm5lbjogJXMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NjkwIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTA0CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjkxNgorbXNnaWQgIlRoZSAnbWFzdGVyJyBicmFuY2ggaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiIKK21zZ3N0ciAiQSAnbWFzdGVyJyBicmFuY2ggbmluY3MgaW5pY2lhbGl6w6FsdmEuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjcwMworbXNnaWQgIkhhcmRsaW5rcyBhcmUgdW5hdmFpbGFibGUuICBGYWxsaW5nIGJhY2sgdG8gY29weWluZy4iCittc2dzdHIgIk5lbSDDqXJoZXTFkWVrIGVsIGhhcmRsaW5rZWsuICBNw6Fzb2zDoXMgaGFzem7DoWxhdGEuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjcxNQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkNsb25pbmcgZnJvbSAlcyIKK21zZ3N0ciAiTcOhc29sw6FzIGlubmVuOiAlcyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3NDYKK21zZ2lkICJDb3B5aW5nIG9iamVjdHMiCittc2dzdHIgIk9iamVrdHVtb2sgbcOhc29sw6FzYSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3NDcKK21zZ2lkICJLaUIiCittc2dzdHIgIktpQiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3NzEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gY29weSBvYmplY3Q6ICVzIgorbXNnc3RyICJOZW0gc2lrZXLDvGx0IG3DoXNvbG5pIGF6IG9iamVrdHVtb3Q6ICVzIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjc4MQorbXNnaWQgIkxpbmtpbmcgb2JqZWN0cyIKK21zZ3N0ciAiT2JqZWt0dW1vayDDtnNzemVmxbF6w6lzZSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3ODIKK21zZ2lkICJvYmplY3RzIgorbXNnc3RyICJvYmpla3R1bSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3OTAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gaGFyZGxpbmsgb2JqZWN0OiAlcyIKK21zZ3N0ciAiTmVtIHNpa2Vyw7xsdCBoYXJkbGlua2VsbmkgYXogb2JqZWt0dW1vdDogJXMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODQ1Cittc2dpZCAiQ2Fubm90IGZldGNoIGJyYW5jaGVzIGFuZCBvYmplY3RzLiAgU2VlIGNvbnNvbGUgb3V0cHV0IGZvciBkZXRhaWxzLiIKK21zZ3N0ciAiIgorIk5lbSBzaWtlcsO8bHQgbGV0w7ZsdGVuaSBhIGJyYW5jaC1la2V0IMOpcyBheiBvYmpla3R1bW9rYXQuICBCxZF2ZWJiZW4gYSAiCisia29uem9sb3Mga2ltZW5ldGJlbi4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODU2Cittc2dpZCAiQ2Fubm90IGZldGNoIHRhZ3MuICBTZWUgY29uc29sZSBvdXRwdXQgZm9yIGRldGFpbHMuIgorbXNnc3RyICJOZW0gc2lrZXLDvGx0IGxldMO2bHRlbmkgYSB0YWdla2V0LiAgQsWRdmViYmVuIGEga29uem9sb3Mga2ltZW5ldGJlbi4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODgwCittc2dpZCAiQ2Fubm90IGRldGVybWluZSBIRUFELiAgU2VlIGNvbnNvbGUgb3V0cHV0IGZvciBkZXRhaWxzLiIKK21zZ3N0ciAiTmVtIHNpa2Vyw7xsdCBtZWfDoWxsYXDDrXRhbmkgYSBIRUFELWV0LiAgQsWRdmViYmVuIGEga29uem9sb3Mga2ltZW5ldGJlbi4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODg5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGNsZWFudXAgJXMiCittc2dzdHIgIk5lbSBzaWtlcsO8bHQgdGlzesOtdGFuaTogJXMuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjg5NQorbXNnaWQgIkNsb25lIGZhaWxlZC4iCittc2dzdHIgIkEgbcOhc29sw6FzIG5lbSBzaWtlcsO8bHQuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjkwMgorbXNnaWQgIk5vIGRlZmF1bHQgYnJhbmNoIG9idGFpbmVkLiIKK21zZ3N0ciAiTmluY3MgYWxhcMOpcnRlbG1lemV0dCBicmFuY2guIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjkxMworIywgdGNsLWZvcm1hdAorbXNnaWQgIkNhbm5vdCByZXNvbHZlICVzIGFzIGEgY29tbWl0LiIKK21zZ3N0ciAiTmVtIHNpa2Vyw7xsdCBmZWzDtmxkYW5pIGEoeikgJXMgb2JqZWt0dW1vdCBjb21taXRrw6ludC4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTI1Cittc2dpZCAiQ3JlYXRpbmcgd29ya2luZyBkaXJlY3RvcnkiCittc2dzdHIgIk11bmtha8O2bnl2dMOhciBsw6l0cmVob3rDoXNhIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjkyNiBsaWIvaW5kZXgudGNsOjY1IGxpYi9pbmRleC50Y2w6MTI3CisjOiBsaWIvaW5kZXgudGNsOjE5MworbXNnaWQgImZpbGVzIgorbXNnc3RyICJmw6FqbCIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5NTUKK21zZ2lkICJJbml0aWFsIGZpbGUgY2hlY2tvdXQgZmFpbGVkLiIKK21zZ3N0ciAiQSBrZXpkZXRpIGbDoWpsLWtpYm9udMOhcyBzaWtlcnRlbGVuLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5NzEKK21zZ2lkICJPcGVuIgorbXNnc3RyICJNZWdueWl0w6FzIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjk4MQorbXNnaWQgIlJlcG9zaXRvcnk6IgorbXNnc3RyICJSZXDDszoiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTAzMQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBvcGVuIHJlcG9zaXRvcnkgJXM6IgorbXNnc3RyICJOZW0gc2lrZXLDvGx0IG1lZ255aXRuaSBhKHopICVzIHJlcMOzdDoiCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDo1MworbXNnaWQgIlRoaXMgRGV0YWNoZWQgQ2hlY2tvdXQiCittc2dzdHIgIkV6IGEgbGV2w6FsYXN6dG90dCBjaGVja291dCIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjYwCittc2dpZCAiUmV2aXNpb24gRXhwcmVzc2lvbjoiCittc2dzdHIgIlJldsOtemnDsyBraWZlamV6w6lzOiIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjc0Cittc2dpZCAiTG9jYWwgQnJhbmNoIgorbXNnc3RyICJIZWx5aSBicmFuY2giCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDo3OQorbXNnaWQgIlRyYWNraW5nIEJyYW5jaCIKK21zZ3N0ciAiS8O2dmV0xZEgYnJhbmNoIgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6ODQgbGliL2Nob29zZV9yZXYudGNsOjUzOAorbXNnaWQgIlRhZyIKK21zZ3N0ciAiVGFnIgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6MzE3CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiSW52YWxpZCByZXZpc2lvbjogJXMiCittc2dzdHIgIsOJcnbDqW55dGVsZW4gcmV2w616acOzOiAlcyIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjMzOAorbXNnaWQgIk5vIHJldmlzaW9uIHNlbGVjdGVkLiIKK21zZ3N0ciAiTmluY3Mga2l2w6FsYXN6dHZhIHJldsOtemnDsy4iCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDozNDYKK21zZ2lkICJSZXZpc2lvbiBleHByZXNzaW9uIGlzIGVtcHR5LiIKK21zZ3N0ciAiQSByZXbDrXppw7Mga2lmZWplesOpcyDDvHJlcy4iCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDo1MzEKK21zZ2lkICJVcGRhdGVkIgorbXNnc3RyICJGcmlzc8OtdHZlIgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6NTU5Cittc2dpZCAiVVJMIgorbXNnc3RyICJVUkwiCisKKyM6IGxpYi9jb21taXQudGNsOjkKK21zZ2lkICIiCisiVGhlcmUgaXMgbm90aGluZyB0byBhbWVuZC5cbiIKKyJcbiIKKyJZb3UgYXJlIGFib3V0IHRvIGNyZWF0ZSB0aGUgaW5pdGlhbCBjb21taXQuICBUaGVyZSBpcyBubyBjb21taXQgYmVmb3JlIHRoaXMgIgorInRvIGFtZW5kLlxuIgorbXNnc3RyICIiCisiTmluY3Mgc2VtbWkgamF2w610YW5pdmFsw7MuXG4iCisiXG4iCisiQXogZWxzxZEgY29tbWl0IGzDqXRyZWhvesOhc2EgZWzFkXR0IG5pbmNzIHNlbW1pbHllbiBjb21taXQgYW1pdCBqYXZpdGFuaSAiCisibGVoZXRuZS5cbiIKKworIzogbGliL2NvbW1pdC50Y2w6MTgKK21zZ2lkICIiCisiQ2Fubm90IGFtZW5kIHdoaWxlIG1lcmdpbmcuXG4iCisiXG4iCisiWW91IGFyZSBjdXJyZW50bHkgaW4gdGhlIG1pZGRsZSBvZiBhIG1lcmdlIHRoYXQgaGFzIG5vdCBiZWVuIGZ1bGx5ICIKKyJjb21wbGV0ZWQuICBZb3UgY2Fubm90IGFtZW5kIHRoZSBwcmlvciBjb21taXQgdW5sZXNzIHlvdSBmaXJzdCBhYm9ydCB0aGUgIgorImN1cnJlbnQgbWVyZ2UgYWN0aXZpdHkuXG4iCittc2dzdHIgIiIKKyJOZW0gbGVoZXQgamF2w610YW5pIG1lcmdlIGFsYXR0LlxuIgorIlxuIgorIkEgamVsZW5sZWdpIG1lcmdlIG3DqWcgbmVtIHRlbGplc2VuIGZlamV6xZFkw7Z0dCBiZS4gQ3NhayBha2tvciBqYXbDrXRoYXQgZWd5ICIKKyJlbMWRYmJpIGNvbW1pdG90LCBob2d5aGEgbWVnc3pha8OtdGphIGEgamVsZW5sZWdpIG1lcmdlIGZvbHlhbWF0b3QuXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjQ5Cittc2dpZCAiRXJyb3IgbG9hZGluZyBjb21taXQgZGF0YSBmb3IgYW1lbmQ6IgorbXNnc3RyICJIaWJhIGEgamF2w610YW5kw7MgY29tbWl0IGFkYXQgYmV0w7ZsdMOpc2Uga8O2emJlbjoiCisKKyM6IGxpYi9jb21taXQudGNsOjc2Cittc2dpZCAiVW5hYmxlIHRvIG9idGFpbiB5b3VyIGlkZW50aXR5OiIKK21zZ3N0ciAiTmVtIHNpa2Vyw7xsdCBtZWfDoWxsYXDDrXRhbmkgYXogYXpvbm9zw610w7N0OiIKKworIzogbGliL2NvbW1pdC50Y2w6ODEKK21zZ2lkICJJbnZhbGlkIEdJVF9DT01NSVRURVJfSURFTlQ6IgorbXNnc3RyICLDiXJ2w6lueXRlbGVuIEdJVF9DT01NSVRURVJfSURFTlQ6IgorCisjOiBsaWIvY29tbWl0LnRjbDoxMzMKK21zZ2lkICIiCisiTGFzdCBzY2FubmVkIHN0YXRlIGRvZXMgbm90IG1hdGNoIHJlcG9zaXRvcnkgc3RhdGUuXG4iCisiXG4iCisiQW5vdGhlciBHaXQgcHJvZ3JhbSBoYXMgbW9kaWZpZWQgdGhpcyByZXBvc2l0b3J5IHNpbmNlIHRoZSBsYXN0IHNjYW4uICBBICIKKyJyZXNjYW4gbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIGFub3RoZXIgY29tbWl0IGNhbiBiZSBjcmVhdGVkLlxuIgorIlxuIgorIlRoZSByZXNjYW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgbm93LlxuIgorbXNnc3RyICIiCisiQXogdXRvbHPDsyBrZXJlc8Opc2kgw6FsbGFwb3QgbmVtIGVneWV6aWsgbWVnIGEgcmVww7Mgw6FsbGFwb3TDoXZhbC5cbiIKKyJcbiIKKyJFZ3kgbcOhc2lrIEdpdCBwcm9ncmFtIG3Ds2Rvc8OtdG90dGEgZXp0IGEgcmVww7N0IGF6IHV0b2xzw7Mga2VyZXPDqXMgw7N0YS4gRWd5ICIKKyLDumpyYWtlcmVzw6lzIG1pbmRlbmvDqXBwZW4gc3rDvGtzw6lnZXMgbWllbMWRdHQgYSBqZWxlbmxlZ2kgYnJhbmNoZXQgbcOzZG9zw610YW5pICIKKyJsZWhldG5lLlxuIgorIlxuIgorIkF6IMO6anJha2VyZXPDqXMgbW9zdCBhdXRvbWF0aWt1c2FuIGVsIGZvZyBpbmR1bG5pLlxuIgorCisjOiBsaWIvY29tbWl0LnRjbDoxNTQKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiVW5tZXJnZWQgZmlsZXMgY2Fubm90IGJlIGNvbW1pdHRlZC5cbiIKKyJcbiIKKyJGaWxlICVzIGhhcyBtZXJnZSBjb25mbGljdHMuICBZb3UgbXVzdCByZXNvbHZlIHRoZW0gYW5kIHN0YWdlIHRoZSBmaWxlICIKKyJiZWZvcmUgY29tbWl0dGluZy5cbiIKK21zZ3N0ciAiIgorIk5lbSBjb21taXRvbGhhdHVuayBmw6FqbG9rYXQgbWVyZ2UgZWzFkXR0LlxuIgorIlxuIgorIkEoeikgJXMgZsOhamxiYW4gw7x0a8O2esOpc2VrIHZhbm5hay4gRWd5c3plciBhem9rYXQga2kga2VsbCBqYXbDrXRhbmksIG1hamQgIgorImhvenrDoSBraSBrZWxsIHbDoWxhc3p0YW5pIGEgZsOhamx0IG1pZWzFkXR0IGNvbW1pdG9sbmkgbGVoZXRuZS5cbiIKKworIzogbGliL2NvbW1pdC50Y2w6MTYyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIlVua25vd24gZmlsZSBzdGF0ZSAlcyBkZXRlY3RlZC5cbiIKKyJcbiIKKyJGaWxlICVzIGNhbm5vdCBiZSBjb21taXR0ZWQgYnkgdGhpcyBwcm9ncmFtLlxuIgorbXNnc3RyICIiCisiSXNtZXJldGxlbiBmw6FqbCB0w61wdXMgJXMgw6lyesOpa2VsdmUuXG4iCisiXG4iCisiQSh6KSAlcyBmw6FqbHQgbmVtIHR1ZGphIGV6IGEgcHJvZ3JhbSBjb21taXRvbG5pLlxuIgorCisjOiBsaWIvY29tbWl0LnRjbDoxNzAKK21zZ2lkICIiCisiTm8gY2hhbmdlcyB0byBjb21taXQuXG4iCisiXG4iCisiWW91IG11c3Qgc3RhZ2UgYXQgbGVhc3QgMSBmaWxlIGJlZm9yZSB5b3UgY2FuIGNvbW1pdC5cbiIKK21zZ3N0ciAiIgorIk5pbmNzIGNvbW1pdG9sYW5kw7MgdsOhbHRvenRhdMOhcy5cbiIKKyJcbiIKKyJMZWdhbMOhYmIgZWd5IGbDoWpsIGtpIGtlbGwgdsOhbGFzenRhbmksIGhvZ3kgY29tbWl0b2xuaSBsZWhlc3Nlbi5cbiIKKworIzogbGliL2NvbW1pdC50Y2w6MTgzCittc2dpZCAiIgorIlBsZWFzZSBzdXBwbHkgYSBjb21taXQgbWVzc2FnZS5cbiIKKyJcbiIKKyJBIGdvb2QgY29tbWl0IG1lc3NhZ2UgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuIgorIlxuIgorIi0gRmlyc3QgbGluZTogRGVzY3JpYmUgaW4gb25lIHNlbnRlbmNlIHdoYXQgeW91IGRpZC5cbiIKKyItIFNlY29uZCBsaW5lOiBCbGFua1xuIgorIi0gUmVtYWluaW5nIGxpbmVzOiBEZXNjcmliZSB3aHkgdGhpcyBjaGFuZ2UgaXMgZ29vZC5cbiIKK21zZ3N0ciAiIgorIkFkanVuayBtZWd5IGVneSBjb21taXQgw7x6ZW5ldGV0LlxuIgorIlxuIgorIkVneSBqw7MgY29tbWl0IMO8emVuZXRuZWsgYSBrw7Z2ZXRrZXrFkSBhIGZvcm3DoXR1bWE6XG4iCisiXG4iCisiLSBFbHPFkSBzb3I6IEVneSBtb25kYXRiYW4gbGXDrXJqYSwgaG9neSBtaXQgY3NpbsOhbHR1bmsuXG4iCisiLSBNw6Fzb2RpayBzb3I6IMOccmVzXG4iCisiLSBBIHTDtmJiaSBzb3I6IExlw61yamEsIGhvZ3kgbWnDqXJ0IGrDsyBleiBhIHbDoWx0b3p0YXTDoXMuXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjIwNworIywgdGNsLWZvcm1hdAorbXNnaWQgIndhcm5pbmc6IFRjbCBkb2VzIG5vdCBzdXBwb3J0IGVuY29kaW5nICclcycuIgorbXNnc3RyICJmaWd5ZWxtZXp0ZXTDqXM6IGEgVGNsIG5lbSB0w6Ftb2dhdGphIGEoeikgJyVzJyBrw7Nkb2zDoXN0LiIKKworIzogbGliL2NvbW1pdC50Y2w6MjIxCittc2dpZCAiQ2FsbGluZyBwcmUtY29tbWl0IGhvb2suLi4iCittc2dzdHIgIkEgcHJlLWNvbW1pdCBodXJvayBtZWdow612w6FzYS4uLiIKKworIzogbGliL2NvbW1pdC50Y2w6MjM2Cittc2dpZCAiQ29tbWl0IGRlY2xpbmVkIGJ5IHByZS1jb21taXQgaG9vay4iCittc2dzdHIgIkEgY29tbWl0b3QgbWVnYWthZMOhbHlvenRhIGEgcHJlLWNvbW1pdCBodXJvay4gIgorCisjOiBsaWIvY29tbWl0LnRjbDoyNTkKK21zZ2lkICJDYWxsaW5nIGNvbW1pdC1tc2cgaG9vay4uLiIKK21zZ3N0ciAiQSBjb21taXQtbXNnIGh1cm9rIG1lZ2jDrXbDoXNhLi4uIgorCisjOiBsaWIvY29tbWl0LnRjbDoyNzQKK21zZ2lkICJDb21taXQgZGVjbGluZWQgYnkgY29tbWl0LW1zZyBob29rLiIKK21zZ3N0ciAiQSBjb21taW90IG1lZ2FrYWTDoWx5b3p0YSBhIGNvbW1pdC1tc2cgaHVyb2suIgorCisjOiBsaWIvY29tbWl0LnRjbDoyODcKK21zZ2lkICJDb21taXR0aW5nIGNoYW5nZXMuLi4iCittc2dzdHIgIkEgdsOhbHRvenRhdMOhc29rIGNvbW1pdG9sw6FzYS4uLiIKKworIzogbGliL2NvbW1pdC50Y2w6MzAzCittc2dpZCAid3JpdGUtdHJlZSBmYWlsZWQ6IgorbXNnc3RyICJhIHdyaXRlLXRyZWUgc2lrZXJ0ZWxlbjoiCisKKyM6IGxpYi9jb21taXQudGNsOjMwNCBsaWIvY29tbWl0LnRjbDozNDggbGliL2NvbW1pdC50Y2w6MzY4Cittc2dpZCAiQ29tbWl0IGZhaWxlZC4iCittc2dzdHIgIkEgY29tbWl0IG5lbSBzaWtlcsO8bHQuIgorCisjOiBsaWIvY29tbWl0LnRjbDozMjEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJDb21taXQgJXMgYXBwZWFycyB0byBiZSBjb3JydXB0IgorbXNnc3RyICJBKHopICVzIGNvbW1pdCBzw6lyw7xsdG5layB0xbFuaWsiCisKKyM6IGxpYi9jb21taXQudGNsOjMyNgorbXNnaWQgIiIKKyJObyBjaGFuZ2VzIHRvIGNvbW1pdC5cbiIKKyJcbiIKKyJObyBmaWxlcyB3ZXJlIG1vZGlmaWVkIGJ5IHRoaXMgY29tbWl0IGFuZCBpdCB3YXMgbm90IGEgbWVyZ2UgY29tbWl0LlxuIgorIlxuIgorIkEgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIG5vdy5cbiIKK21zZ3N0ciAiIgorIk5pbmNzIGNvbW1pdG9sYW5kw7MgdsOhbHRvenRhdMOhcy5cbiIKKyJcbiIKKyJFZ3lldGxlbiBmw6FqbHQgc2UgbcOzZG9zw610b3R0IGV6IGEgY29tbWl0IMOpcyBtZXJnZSBjb21taXQgc2Ugdm9sdC5cbiIKKyJcbiIKKyJBeiDDumpyYWtlcmVzw6lzIG1vc3QgYXV0b21hdGlrdXNhbiBlbCBmb2cgaW5kdWxuaS5cbiIKKworIzogbGliL2NvbW1pdC50Y2w6MzMzCittc2dpZCAiTm8gY2hhbmdlcyB0byBjb21taXQuIgorbXNnc3RyICJOaW5jcyBjb21taXRvbGFuZMOzIHbDoWx0b3p0YXTDoXMuIgorCisjOiBsaWIvY29tbWl0LnRjbDozNDcKK21zZ2lkICJjb21taXQtdHJlZSBmYWlsZWQ6IgorbXNnc3RyICJhIGNvbW1pdC10cmVlIHNpa2VydGVsZW46IgorCisjOiBsaWIvY29tbWl0LnRjbDozNjcKK21zZ2lkICJ1cGRhdGUtcmVmIGZhaWxlZDoiCittc2dzdHIgImF6IHVwZGF0ZS1yZWYgc2lrZXJ0ZWxlbjoiCisKKyM6IGxpYi9jb21taXQudGNsOjQ1NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkNyZWF0ZWQgY29tbWl0ICVzOiAlcyIKK21zZ3N0ciAiTMOpdHJlasO2dHQgYSAlcyBjb21taXQ6ICVzIgorCisjOiBsaWIvY29uc29sZS50Y2w6NTkKK21zZ2lkICJXb3JraW5nLi4uIHBsZWFzZSB3YWl0Li4uIgorbXNnc3RyICJNdW5rYSBmb2x5YW1hdGJhbi4uIFbDoXJqdW5rLi4uIgorCisjOiBsaWIvY29uc29sZS50Y2w6MTg2Cittc2dpZCAiU3VjY2VzcyIKK21zZ3N0ciAiU2lrZXIiCisKKyM6IGxpYi9jb25zb2xlLnRjbDoyMDAKK21zZ2lkICJFcnJvcjogQ29tbWFuZCBGYWlsZWQiCittc2dzdHIgIkhpYmE6IGEgcGFyYW5jcyBzaWtlcnRlbGVuIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQzCittc2dpZCAiTnVtYmVyIG9mIGxvb3NlIG9iamVjdHMiCittc2dzdHIgIkVsdmVzenRldHQgb2JqZWt0dW1vayBzesOhbWEiCisKKyM6IGxpYi9kYXRhYmFzZS50Y2w6NDQKK21zZ2lkICJEaXNrIHNwYWNlIHVzZWQgYnkgbG9vc2Ugb2JqZWN0cyIKK21zZ3N0ciAiRWx2ZXN6ZXR0IG9iamVrdHVtb2sgw6FsdGFsIGVsZm9nbGFsdCBsZW1lenRlcsO8bGV0IgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQ1Cittc2dpZCAiTnVtYmVyIG9mIHBhY2tlZCBvYmplY3RzIgorbXNnc3RyICJDc29tYWdvbHQgb2JqZWt0dW1vayBzesOhbXJhIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQ2Cittc2dpZCAiTnVtYmVyIG9mIHBhY2tzIgorbXNnc3RyICJDc29tYWdvayBzesOhbWEiCisKKyM6IGxpYi9kYXRhYmFzZS50Y2w6NDcKK21zZ2lkICJEaXNrIHNwYWNlIHVzZWQgYnkgcGFja2VkIG9iamVjdHMiCittc2dzdHIgIkEgY3NvbWFnb2x0IG9iamVrdHVtb2sgw6FsdGFsIGhhc3puw6FsdCBsZW1lenRlcsO8bGV0IgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQ4Cittc2dpZCAiUGFja2VkIG9iamVjdHMgd2FpdGluZyBmb3IgcHJ1bmluZyIKK21zZ3N0ciAiRWx0w6F2b2zDrXTDoXNyYSB2w6Fyw7MgY3NvbWFnb2x0IG9iamVrdHVtb2sgc3rDoW1yYSIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0OQorbXNnaWQgIkdhcmJhZ2UgZmlsZXMiCittc2dzdHIgIkh1bGxhZMOpayBmw6FqbG9rIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjcyCittc2dpZCAiQ29tcHJlc3NpbmcgdGhlIG9iamVjdCBkYXRhYmFzZSIKK21zZ3N0ciAiQXogb2JqZWt0dW0gYWRhdGLDoXppcyB0w7Ztw7Zyw610w6lzZSIKKworIzogbGliL2RhdGFiYXNlLnRjbDo4MworbXNnaWQgIlZlcmlmeWluZyB0aGUgb2JqZWN0IGRhdGFiYXNlIHdpdGggZnNjay1vYmplY3RzIgorbXNnc3RyICJBeiBvYmpla3R1bSBhZGF0YsOhemlzIGVsbGVuxZFyesOpc2UgYXogZnNjay1vYmplY3RzIGhhc3puw6FsYXTDoXZhbCIKKworIzogbGliL2RhdGFiYXNlLnRjbDoxMDgKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiVGhpcyByZXBvc2l0b3J5IGN1cnJlbnRseSBoYXMgYXBwcm94aW1hdGVseSAlaSBsb29zZSBvYmplY3RzLlxuIgorIlxuIgorIlRvIG1haW50YWluIG9wdGltYWwgcGVyZm9ybWFuY2UgaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgY29tcHJlc3MgIgorInRoZSBkYXRhYmFzZSB3aGVuIG1vcmUgdGhhbiAlaSBsb29zZSBvYmplY3RzIGV4aXN0LlxuIgorIlxuIgorIkNvbXByZXNzIHRoZSBkYXRhYmFzZSBub3c/IgorbXNnc3RyICIiCisiRW5uZWsgYSByZXDDs25hayBqZWxlbmxlZyAlaSBrw7xsw7Zuw6FsbMOzIG9iamVrdHVtYSB2YW4uXG4iCisiXG4iCisiQXogb3B0aW3DoWxpcyB0ZWxqZXPDrXRtw6lueWhleiBlcsWRc2VuIGFqw6FubG90dCBheiBhZGF0YsOhemlzIHTDtm3DtnLDrXTDqXNlLCBoYSAiCisidMO2YmIgbWludCAlaSBvYmpla3R1bSBsw6l0ZXppay5cbiIKKyJcbiIKKyJMZWhldCBtb3N0IHTDtm3DtnLDrXRlbmkgYXogYWRhdGLDoXppc3Q/IgorCisjOiBsaWIvZGF0ZS50Y2w6MjUKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIGRhdGUgZnJvbSBHaXQ6ICVzIgorbXNnc3RyICLDiXJ2w6lueXRlbGVuIGTDoXR1bSBhIEdpdC10xZFsOiAlcyIKKworIzogbGliL2RpZmYudGNsOjQyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIk5vIGRpZmZlcmVuY2VzIGRldGVjdGVkLlxuIgorIlxuIgorIiVzIGhhcyBubyBjaGFuZ2VzLlxuIgorIlxuIgorIlRoZSBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGlzIGZpbGUgd2FzIHVwZGF0ZWQgYnkgYW5vdGhlciBhcHBsaWNhdGlvbiwgYnV0ICIKKyJ0aGUgY29udGVudCB3aXRoaW4gdGhlIGZpbGUgd2FzIG5vdCBjaGFuZ2VkLlxuIgorIlxuIgorIkEgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIHRvIGZpbmQgb3RoZXIgZmlsZXMgd2hpY2ggbWF5IGhhdmUgIgorInRoZSBzYW1lIHN0YXRlLiIKK21zZ3N0ciAiIgorIk5pbmNzZW5layB2w6FsdG96w6Fzb2suXG4iCisiXG4iCisiQSh6KSAlcyBtw7Nkb3PDrXRhdGxhbi5cbiIKKyJcbiIKKyJBIGbDoWpsIG3Ds2Rvc8OtdMOhc2kgZMOhdHVtw6F0IGZyaXNzw610ZXR0ZSBlZ3kgbcOhc2lrIGFsa2FsbWF6w6FzLCBkZSBhIGbDoWpsICIKKyJ0YXJ0YWxtYSB2w6FsdG96YXRsYW4uXG4iCisiXG4iCisiRWd5IMO6anJha2VyZXPDqXMgZm9nIGluZHVsbmkgYSBoYXNvbmzDsyDDoWxsYXBvdMO6IGbDoWpsb2sgbWVndGFsw6Fsw6FzYSDDqXJkZWvDqWJlbi4iCisKKyM6IGxpYi9kaWZmLnRjbDo4MQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkxvYWRpbmcgZGlmZiBvZiAlcy4uLiIKK21zZ3N0ciAiQSh6KSAlcyBkaWZmLWrDqW5layBiZXTDtmx0w6lzZS4uLiIKKworIzogbGliL2RpZmYudGNsOjExNCBsaWIvZGlmZi50Y2w6MTg0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGRpc3BsYXkgJXMiCittc2dzdHIgIk5lbSBsZWhldCBtZWdqZWxlbsOtdGVuaSBhIGvDtnZldGtlesWRdDogJXMiCisKKyM6IGxpYi9kaWZmLnRjbDoxMTUKK21zZ2lkICJFcnJvciBsb2FkaW5nIGZpbGU6IgorbXNnc3RyICJIaWJhIGEgZsOhamwgYmV0w7ZsdMOpc2Uga8O2emJlbjoiCisKKyM6IGxpYi9kaWZmLnRjbDoxMjIKK21zZ2lkICJHaXQgUmVwb3NpdG9yeSAoc3VicHJvamVjdCkiCittc2dzdHIgIkdpdCByZXDDsyAoYWxwcm9qZWt0KSIKKworIzogbGliL2RpZmYudGNsOjEzNAorbXNnaWQgIiogQmluYXJ5IGZpbGUgKG5vdCBzaG93aW5nIGNvbnRlbnQpLiIKK21zZ3N0ciAiKiBCaW7DoXJpcyBmw6FqbCAodGFydGFsb20gZWxyZWp0w6lzZSkuIgorCisjOiBsaWIvZGlmZi50Y2w6MTg1Cittc2dpZCAiRXJyb3IgbG9hZGluZyBkaWZmOiIKK21zZ3N0ciAiSGliYSBhIGRpZmYgYmV0w7ZsdMOpc2Uga8O2emJlbjoiCisKKyM6IGxpYi9kaWZmLnRjbDozMDMKK21zZ2lkICJGYWlsZWQgdG8gdW5zdGFnZSBzZWxlY3RlZCBodW5rLiIKK21zZ3N0ciAiTmVtIHZpc3N6YXZvbm5pIGEgaHVuayBraXbDoWxhc3p0w6Fzw6F0LiIKKworIzogbGliL2RpZmYudGNsOjMxMAorbXNnaWQgIkZhaWxlZCB0byBzdGFnZSBzZWxlY3RlZCBodW5rLiIKK21zZ3N0ciAiTmVtIHNpa2Vyw7xsdCBraXbDoWxhc3p0YW5pIGEgaHVua290LiIKKworIzogbGliL2Vycm9yLnRjbDoyMCBsaWIvZXJyb3IudGNsOjExNAorbXNnaWQgImVycm9yIgorbXNnc3RyICJoaWJhIgorCisjOiBsaWIvZXJyb3IudGNsOjM2Cittc2dpZCAid2FybmluZyIKK21zZ3N0ciAiZmlneWVsbWV6dGV0w6lzIgorCisjOiBsaWIvZXJyb3IudGNsOjk0Cittc2dpZCAiWW91IG11c3QgY29ycmVjdCB0aGUgYWJvdmUgZXJyb3JzIGJlZm9yZSBjb21taXR0aW5nLiIKK21zZ3N0ciAiS2kga2VsbCBqYXbDrXRhbnVuayBhIGZlbnRpIGhpYsOha2F0IGNvbW1pdCBlbMWRdHQuIgorCisjOiBsaWIvaW5kZXgudGNsOjYKK21zZ2lkICJVbmFibGUgdG8gdW5sb2NrIHRoZSBpbmRleC4iCittc2dzdHIgIk5lbSBzaWtlcsO8bHQgYXogaW5kZXggesOhcm9sw6Fzw6FuYWsgZmVsb2xkw6FzYS4iCisKKyM6IGxpYi9pbmRleC50Y2w6MTUKK21zZ2lkICJJbmRleCBFcnJvciIKK21zZ3N0ciAiSW5kZXggaGliYSIKKworIzogbGliL2luZGV4LnRjbDoyMQorbXNnaWQgIiIKKyJVcGRhdGluZyB0aGUgR2l0IGluZGV4IGZhaWxlZC4gIEEgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIHRvICIKKyJyZXN5bmNocm9uaXplIGdpdC1ndWkuIgorbXNnc3RyICIiCisiQSBHaXQgaW5kZXggZnJpc3PDrXTDqXNlIHNpa2VydGVsZW4gdm9sdC4gIEVneSDDumpyYW9sdmFzw6FzIGF1dG9tYXRpa3VzYW4gIgorImVsaW5kdWx0LCBob2d5IGEgZ2l0LWd1aSDDumpyYSBzemlua29uYmFuIGxlZ3llbi4iCisKKyM6IGxpYi9pbmRleC50Y2w6MjcKK21zZ2lkICJDb250aW51ZSIKK21zZ3N0ciAiRm9seXRhdMOhcyIKKworIzogbGliL2luZGV4LnRjbDozMQorbXNnaWQgIlVubG9jayBJbmRleCIKK21zZ3N0ciAiSW5kZXggesOhcm9sw6Fzw6FuYWsgZmVsb2xkw6FzYSIKKworIzogbGliL2luZGV4LnRjbDoyODIKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbnN0YWdpbmcgJXMgZnJvbSBjb21taXQiCittc2dzdHIgIkEoeikgJXMgY29tbWl0YmEgdmFsw7Mga2l2w6FsYXN6dMOhc8OhbmFrIHZpc3N6YXZvbsOhc2EiCisKKyM6IGxpYi9pbmRleC50Y2w6MzEzCittc2dpZCAiUmVhZHkgdG8gY29tbWl0LiIKK21zZ3N0ciAiQ29tbWl0b2zDoXNyYSBrw6lzei4iCisKKyM6IGxpYi9pbmRleC50Y2w6MzI2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQWRkaW5nICVzIgorbXNnc3RyICJBKHopICVzIGhvenrDoWFkw6FzYS4uLiIKKworIzogbGliL2luZGV4LnRjbDozODEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJSZXZlcnQgY2hhbmdlcyBpbiBmaWxlICVzPyIKK21zZ3N0ciAiVmlzc3phw6FsbMOtdGphIGEgdsOhbHRvenRhdMOhc29rYXQgYSh6KSAlcyBmw6FqbGJhbj8iCisKKyM6IGxpYi9pbmRleC50Y2w6MzgzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUmV2ZXJ0IGNoYW5nZXMgaW4gdGhlc2UgJWkgZmlsZXM/IgorbXNnc3RyICJWaXNzemHDoWxsw610amEgYSB2w6FsdG96dGF0w6Fzb2thdCBlYmJlbiBlICVpIGbDoWpsYmFuPyIKKworIzogbGliL2luZGV4LnRjbDozOTEKK21zZ2lkICJBbnkgdW5zdGFnZWQgY2hhbmdlcyB3aWxsIGJlIHBlcm1hbmVudGx5IGxvc3QgYnkgdGhlIHJldmVydC4iCittc2dzdHIgIiIKKyJNaW5kZW4gbmVtIGtpdsOhbGFzenRvdHQgdsOhbHRvenRhdMOhcyBlbCBmb2cgdmVzem5pIGV6w6FsdGFsIGEgdmlzc3phw6FsbMOtdMOhcyAiCisiw6FsdGFsLiIKKworIzogbGliL2luZGV4LnRjbDozOTQKK21zZ2lkICJEbyBOb3RoaW5nIgorbXNnc3RyICJOZSBjc2luw6FsanVuayBzZW1taXQiCisKKyM6IGxpYi9tZXJnZS50Y2w6MTMKK21zZ2lkICIiCisiQ2Fubm90IG1lcmdlIHdoaWxlIGFtZW5kaW5nLlxuIgorIlxuIgorIllvdSBtdXN0IGZpbmlzaCBhbWVuZGluZyB0aGlzIGNvbW1pdCBiZWZvcmUgc3RhcnRpbmcgYW55IHR5cGUgb2YgbWVyZ2UuXG4iCittc2dzdHIgIiIKKyJKYXbDrXTDoXMga8O2emJlbiBuZW0gbGVoZXRzw6lnZXMgYSBtZXJnZS5cbiIKKyJcbiIKKyJFZ3lzemVyIGJlIGtlbGwgZmVqZXpuaSBlbm5layBhIGNvbW1pdG5hayBhIGphdsOtdMOhc8OhdCwgbWFqZCBrZXpkxZFkaGV0IGVneSAiCisibWVyZ2UuXG4iCisKKyM6IGxpYi9tZXJnZS50Y2w6MjcKK21zZ2lkICIiCisiTGFzdCBzY2FubmVkIHN0YXRlIGRvZXMgbm90IG1hdGNoIHJlcG9zaXRvcnkgc3RhdGUuXG4iCisiXG4iCisiQW5vdGhlciBHaXQgcHJvZ3JhbSBoYXMgbW9kaWZpZWQgdGhpcyByZXBvc2l0b3J5IHNpbmNlIHRoZSBsYXN0IHNjYW4uICBBICIKKyJyZXNjYW4gbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIGEgbWVyZ2UgY2FuIGJlIHBlcmZvcm1lZC5cbiIKKyJcbiIKKyJUaGUgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIG5vdy5cbiIKK21zZ3N0ciAiIgorIkF6IHV0b2xzw7Mga2VyZXPDqXNpIMOhbGxhcG90IG5lbSBlZ3llemlrIG1lZyBhIHJlcMOzIMOhbGxhcG90w6F2YWwuXG4iCisiXG4iCisiRWd5IG3DoXNpayBHaXQgcHJvZ3JhbSBtw7Nkb3PDrXRvdHRhIGV6dCBhIHJlcMOzdCBheiB1dG9sc8OzIGtlcmVzw6lzIMOzdGEuIEVneSAiCisiw7pqcmFrZXJlc8OpcyBtaW5kZW5rw6lwcGVuIHN6w7xrc8OpZ2VzIG1pZWzFkXR0IGEgamVsZW5sZWdpIGJyYW5jaGV0IG3Ds2Rvc8OtdGFuaSAiCisibGVoZXRuZS5cbiIKKyJcbiIKKyJBeiDDumpyYWtlcmVzw6lzIG1vc3QgYXV0b21hdGlrdXNhbiBlbCBmb2cgaW5kdWxuaS5cbiIKKworIzogbGliL21lcmdlLnRjbDo0NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJZb3UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBjb25mbGljdGVkIG1lcmdlLlxuIgorIlxuIgorIkZpbGUgJXMgaGFzIG1lcmdlIGNvbmZsaWN0cy5cbiIKKyJcbiIKKyJZb3UgbXVzdCByZXNvbHZlIHRoZW0sIHN0YWdlIHRoZSBmaWxlLCBhbmQgY29tbWl0IHRvIGNvbXBsZXRlIHRoZSBjdXJyZW50ICIKKyJtZXJnZS4gIE9ubHkgdGhlbiBjYW4geW91IGJlZ2luIGFub3RoZXIgbWVyZ2UuXG4iCittc2dzdHIgIiIKKyJKZWxlbmxlZyBlZ3kgw7x0a8O2esOpcyBmZWxvbGTDoXNhIGvDtnpiZW4gdmFneXVuay5cbiIKKyJcbiIKKyJBKHopICVzIGbDoWpsYmFuIMO8dGvDtnrDqXNlayB2YW5uYWsuXG4iCisiXG4iCisiRmVsIGtlbGwgb2xkYW51bmsgxZFrZXQsIGtpdsOhbGFzenRhbmkgYSBmw6FqbHQsIMOpcyBjb21taXRvbG5pIGhvZ3kgYmVmZWplenrDvGsgIgorImEgamVsZW5sZWdpIG1lcmdlLXQuIENzYWsgZXp1dMOhbiBrZXpkaGV0w7xuayBlbCBlZ3kgw7pqYWJiYXQuXG4iCisKKyM6IGxpYi9tZXJnZS50Y2w6NTQKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiWW91IGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgY2hhbmdlLlxuIgorIlxuIgorIkZpbGUgJXMgaXMgbW9kaWZpZWQuXG4iCisiXG4iCisiWW91IHNob3VsZCBjb21wbGV0ZSB0aGUgY3VycmVudCBjb21taXQgYmVmb3JlIHN0YXJ0aW5nIGEgbWVyZ2UuICBEb2luZyBzbyAiCisid2lsbCBoZWxwIHlvdSBhYm9ydCBhIGZhaWxlZCBtZXJnZSwgc2hvdWxkIHRoZSBuZWVkIGFyaXNlLlxuIgorbXNnc3RyICIiCisiSmVsZW5sZWcgZWd5IHbDoWx0b3p0YXTDoXMga8O2emJlbiB2YWd5dW5rLlxuIgorIlxuIgorIkEoeikgJXMgZsOhamwgbWVndsOhbHRvem90dC5cbiIKKyJcbiIKKyJFbMWRc3rDtnIgYmUga2VsbCBmZWplem7DvG5rIGEgamVsZW5sZWdpIGNvbW1pdG90LCBob2d5IGVsa2V6ZGhlc3PDvG5rIGVneSBtZXJnZS0iCisidC4gRXogc2Vnw610ZW5pIGZvZywgaG9neSBmw6lsYmVzemFrw610aGFzc3VuayBlZ3kgbWVyZ2UtdC5cbiIKKworIzogbGliL21lcmdlLnRjbDoxMDYKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIlcyBvZiAlcyIKK21zZ3N0ciAiJXMgLyAlcyIKKworIzogbGliL21lcmdlLnRjbDoxMTkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJNZXJnaW5nICVzIGFuZCAlcy4uLiIKK21zZ3N0ciAiQSh6KSAlcyDDqXMgYSh6KSAlcyBtZXJnZS3DtmzDqXNlLi4uIgorCisjOiBsaWIvbWVyZ2UudGNsOjEzMAorbXNnaWQgIk1lcmdlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIgorbXNnc3RyICJBIG1lcmdlIHNpa2VyZXNlbiBiZWZlamV6xZFkw7Z0dC4iCisKKyM6IGxpYi9tZXJnZS50Y2w6MTMyCittc2dpZCAiTWVyZ2UgZmFpbGVkLiAgQ29uZmxpY3QgcmVzb2x1dGlvbiBpcyByZXF1aXJlZC4iCittc2dzdHIgIkEgbWVyZ2Ugc2lrZXJ0ZWxlbi4gRmVsIGtlbGwgb2xkYW51bmsgYXogw7x0a8O2esOpc2VrZXQuIgorCisjOiBsaWIvbWVyZ2UudGNsOjE1NworIywgdGNsLWZvcm1hdAorbXNnaWQgIk1lcmdlIEludG8gJXMiCittc2dzdHIgIk1lcmdlLcO2bMOpcyBhIGvDtnZldGtlesWRYmU6ICVzIgorCisjOiBsaWIvbWVyZ2UudGNsOjE3NgorbXNnaWQgIlJldmlzaW9uIFRvIE1lcmdlIgorbXNnc3RyICJNZXJnZS3DtmxuaSBzesOhbmTDqWtvem90dCByZXbDrXppw7MiCisKKyM6IGxpYi9tZXJnZS50Y2w6MjExCittc2dpZCAiIgorIkNhbm5vdCBhYm9ydCB3aGlsZSBhbWVuZGluZy5cbiIKKyJcbiIKKyJZb3UgbXVzdCBmaW5pc2ggYW1lbmRpbmcgdGhpcyBjb21taXQuXG4iCittc2dzdHIgIiIKKyJBIGNvbW1pdCBqYXbDrXTDoXMga8O2emJlbiBtZWdzemFrw610dmEuXG4iCisiXG4iCisiQmUga2VsbCBmZWplem7DvG5rIGVubmVrIGEgY29tbWl0bmFrIGEgamF2w610w6Fzw6F0LlxuIgorCisjOiBsaWIvbWVyZ2UudGNsOjIyMQorbXNnaWQgIiIKKyJBYm9ydCBtZXJnZT9cbiIKKyJcbiIKKyJBYm9ydGluZyB0aGUgY3VycmVudCBtZXJnZSB3aWxsIGNhdXNlICpBTEwqIHVuY29tbWl0dGVkIGNoYW5nZXMgdG8gYmUgbG9zdC5cbiIKKyJcbiIKKyJDb250aW51ZSB3aXRoIGFib3J0aW5nIHRoZSBjdXJyZW50IG1lcmdlPyIKK21zZ3N0ciAiIgorIk1lZ3N6YWvDrXRqdWsgYSBtZXJnZS10P1xuIgorIlxuIgorIkEgamVsZW5sZWdpIG1lcmdlIG1lZ3N6YWvDrXTDoXNhICpNSU5ERU4qIG5lbSBjb21taXRvbHQgdsOhbHRvenRhdMOhcyAiCisiZWx2ZXN6dMOpc8OpdCBqZWxlbnRpLlxuIgorIlxuIgorIkZvbHl0YXRqdWsgYSBqZWxlbmxlZ2kgbWVyZ2UgbWVnc3pha8OtdMOhc8OhdD8iCisKKyM6IGxpYi9tZXJnZS50Y2w6MjI3Cittc2dpZCAiIgorIlJlc2V0IGNoYW5nZXM/XG4iCisiXG4iCisiUmVzZXR0aW5nIHRoZSBjaGFuZ2VzIHdpbGwgY2F1c2UgKkFMTCogdW5jb21taXR0ZWQgY2hhbmdlcyB0byBiZSBsb3N0LlxuIgorIlxuIgorIkNvbnRpbnVlIHdpdGggcmVzZXR0aW5nIHRoZSBjdXJyZW50IGNoYW5nZXM/IgorbXNnc3RyICIiCisiVmlzc3phdm9uanVrIGEgbcOzZG9zw610w6Fzb2thdD9cbiIKKyJcbiIKKyJBIG3Ds2Rvc8OtdMOhc29rIHZpc3N6YXZvbsOhc2EgKk1JTkRFTiogbmVtIGNvbW1pdG9sdCB2w6FsdG96dGF0w6FzIGVsdmVzenTDqXPDqXQgIgorImplbGVudGkuXG4iCisiXG4iCisiRm9seXRhdGp1ayBhIGplbGVubGVnaSBtw7Nkb3PDrXTDoXNvayB2aXNzemF2b27DoXPDoXQ/IgorCisjOiBsaWIvbWVyZ2UudGNsOjIzOAorbXNnaWQgIkFib3J0aW5nIgorbXNnc3RyICJGw6lsYmVzemFrw610w6FzIgorCisjOiBsaWIvbWVyZ2UudGNsOjIzOAorbXNnaWQgImZpbGVzIHJlc2V0IgorbXNnc3RyICJmw6FqbCB2aXNzemHDoWxsw610dmEiCisKKyM6IGxpYi9tZXJnZS50Y2w6MjY1Cittc2dpZCAiQWJvcnQgZmFpbGVkLiIKK21zZ3N0ciAiQSBmw6lsYmVzemFrw610w6FzIG5lbSBzaWtlcsO8bHQuIgorCisjOiBsaWIvbWVyZ2UudGNsOjI2NworbXNnaWQgIkFib3J0IGNvbXBsZXRlZC4gIFJlYWR5LiIKK21zZ3N0ciAiQSBtZWdrZXN6YWvDrXTDoXMgYmVmZWplesWRZMO2dHQuIEvDqXN6LiIKKworIzogbGliL29wdGlvbi50Y2w6OTUKK21zZ2lkICJSZXN0b3JlIERlZmF1bHRzIgorbXNnc3RyICJBbGFww6lydGVsbWV6w6lzIHZpc3N6YcOhbGzDrXTDoXNhIgorCisjOiBsaWIvb3B0aW9uLnRjbDo5OQorbXNnaWQgIlNhdmUiCittc2dzdHIgIk1lbnTDqXMiCisKKyM6IGxpYi9vcHRpb24udGNsOjEwOQorIywgdGNsLWZvcm1hdAorbXNnaWQgIiVzIFJlcG9zaXRvcnkiCittc2dzdHIgIiVzIFJlcMOzIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMTAKK21zZ2lkICJHbG9iYWwgKEFsbCBSZXBvc2l0b3JpZXMpIgorbXNnc3RyICJHbG9iw6FsaXMgKG1pbmRlbiByZXDDsykiCisKKyM6IGxpYi9vcHRpb24udGNsOjExNgorbXNnaWQgIlVzZXIgTmFtZSIKK21zZ3N0ciAiRmVsaGFzem7DoWzDs27DqXYiCisKKyM6IGxpYi9vcHRpb24udGNsOjExNworbXNnaWQgIkVtYWlsIEFkZHJlc3MiCittc2dzdHIgIkVtYWlsIGPDrW0iCisKKyM6IGxpYi9vcHRpb24udGNsOjExOQorbXNnaWQgIlN1bW1hcml6ZSBNZXJnZSBDb21taXRzIgorbXNnc3RyICJBIG1lcmdlIGNvbW1pdG9rIMO2c3N6ZWd6w6lzZSIKKworIzogbGliL29wdGlvbi50Y2w6MTIwCittc2dpZCAiTWVyZ2UgVmVyYm9zaXR5IgorbXNnc3RyICJNZXJnZSBiZXN6w6lkZXNzw6lnIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMjEKK21zZ2lkICJTaG93IERpZmZzdGF0IEFmdGVyIE1lcmdlIgorbXNnc3RyICJEaWZmc3RhdCBtdXRhdMOhc2EgbWVyZ2UgdXTDoW4iCisKKyM6IGxpYi9vcHRpb24udGNsOjEyMworbXNnaWQgIlRydXN0IEZpbGUgTW9kaWZpY2F0aW9uIFRpbWVzdGFtcHMiCittc2dzdHIgIkEgZsOhamwgbcOzZG9zw610w6FzaSBkw6F0dW1vayBtZWdiw616aGF0w7NhayIKKworIzogbGliL29wdGlvbi50Y2w6MTI0Cittc2dpZCAiUHJ1bmUgVHJhY2tpbmcgQnJhbmNoZXMgRHVyaW5nIEZldGNoIgorbXNnc3RyICJBIGvDtnZldMWRIGJyYW5jaGVrIGVsdMOhdm9sw610w6FzYSBsZXTDtmx0w6lzIGFsYXR0IgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMjUKK21zZ2lkICJNYXRjaCBUcmFja2luZyBCcmFuY2hlcyIKK21zZ3N0ciAiQSBrw7Z2ZXTFkSBicmFuY2hlayBlZ3llenRldMOpc2UiCisKKyM6IGxpYi9vcHRpb24udGNsOjEyNgorbXNnaWQgIk51bWJlciBvZiBEaWZmIENvbnRleHQgTGluZXMiCittc2dzdHIgIkEgZGlmZiBrw7ZybnllemV0aSBzb3JvayBzesOhbWEiCisKKyM6IGxpYi9vcHRpb24udGNsOjEyNworbXNnaWQgIkNvbW1pdCBNZXNzYWdlIFRleHQgV2lkdGgiCittc2dzdHIgIkNvbW1pdCDDvHplbmV0IHN6w7Z2ZWfDqW5layBzesOpbGVzc8OpZ2UiCisKKyM6IGxpYi9vcHRpb24udGNsOjEyOAorbXNnaWQgIk5ldyBCcmFuY2ggTmFtZSBUZW1wbGF0ZSIKK21zZ3N0ciAiw5pqIGJyYW5jaCBuw6l2IHNhYmxvbiIKKworIzogbGliL29wdGlvbi50Y2w6MTkyCittc2dpZCAiU3BlbGxpbmcgRGljdGlvbmFyeToiCittc2dzdHIgIkhlbHllc8OtcsOhcy1lbGxlbsWRcnrFkSBzesOzdMOhcjoiCisKKyM6IGxpYi9vcHRpb24udGNsOjIxNgorbXNnaWQgIkNoYW5nZSBGb250IgorbXNnc3RyICJCZXTFsXTDrXB1cyBtZWd2w6FsdG96dGF0w6FzYSIKKworIzogbGliL29wdGlvbi50Y2w6MjIwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQ2hvb3NlICVzIgorbXNnc3RyICIlcyB2w6FsYXN6dMOhc2EiCisKKyM6IGxpYi9vcHRpb24udGNsOjIyNgorbXNnaWQgInB0LiIKK21zZ3N0ciAicHQuIgorCisjOiBsaWIvb3B0aW9uLnRjbDoyNDAKK21zZ2lkICJQcmVmZXJlbmNlcyIKK21zZ3N0ciAiQmXDoWxsw610w6Fzb2siCisKKyM6IGxpYi9vcHRpb24udGNsOjI3NQorbXNnaWQgIkZhaWxlZCB0byBjb21wbGV0ZWx5IHNhdmUgb3B0aW9uczoiCittc2dzdHIgIk5lbSBzaWtlcsO8bHQgdGVsamVzZW4gZWxtZW50ZW5pIGEgYmXDoWxsw610w6Fzb2thdDoiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MjkgbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDozNAorbXNnaWQgIkRlbGV0ZSBSZW1vdGUgQnJhbmNoIgorbXNnc3RyICJUw6F2b2xpIGJyYW5jaCB0w7ZybMOpc2UiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6NDcKK21zZ2lkICJGcm9tIFJlcG9zaXRvcnkiCittc2dzdHIgIkZvcnLDoXMgcmVww7MiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6NTAgbGliL3RyYW5zcG9ydC50Y2w6MTIzCittc2dpZCAiUmVtb3RlOiIKK21zZ3N0ciAiVMOhdm9saToiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6NjYgbGliL3RyYW5zcG9ydC50Y2w6MTM4Cittc2dpZCAiQXJiaXRyYXJ5IFVSTDoiCittc2dzdHIgIlRldHN6xZFsZWdlcyBVUkw6IgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjg0Cittc2dpZCAiQnJhbmNoZXMiCittc2dzdHIgIkJyYW5jaGVrIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjEwOQorbXNnaWQgIkRlbGV0ZSBPbmx5IElmIgorbXNnc3RyICJUw7ZybMOpcyBjc2FrIGFra29yIGhhIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjExMQorbXNnaWQgIk1lcmdlZCBJbnRvOiIKK21zZ3N0ciAiTWVyZ2Utw7ZsdCBhIGvDtnZldGtlesWRYmU6IgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjExOQorbXNnaWQgIkFsd2F5cyAoRG8gbm90IHBlcmZvcm0gbWVyZ2UgY2hlY2tzKSIKK21zZ3N0ciAiTWluZGlnIChOZSB2w6lnZXp6ZW4gbWVyZ2Ugdml6c2fDoWxhdG9rYXQpIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjE1MgorbXNnaWQgIkEgYnJhbmNoIGlzIHJlcXVpcmVkIGZvciAnTWVyZ2VkIEludG8nLiIKK21zZ3N0ciAiRWd5IGJyYW5jaCBzesO8a3PDqWdlcyBhICdNZXJnZS3Dtmx0IGEga8O2dmV0a2V6xZFiZSctaGV6LiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoxODQKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiVGhlIGZvbGxvd2luZyBicmFuY2hlcyBhcmUgbm90IGNvbXBsZXRlbHkgbWVyZ2VkIGludG8gJXM6XG4iCisiXG4iCisiIC0gJXMiCittc2dzdHIgIiIKKyJBIGvDtnZldGtlesWRIGJyYW5jaGVrIG5lbSB0ZWxqZXNlbiBsZXR0ZWsgbWVyZ2Utw7ZsdmUgZWJiZTogJXM6XG4iCisiIC0gJXMiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MTg5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIk9uZSBvciBtb3JlIG9mIHRoZSBtZXJnZSB0ZXN0cyBmYWlsZWQgYmVjYXVzZSB5b3UgaGF2ZSBub3QgZmV0Y2hlZCB0aGUgIgorIm5lY2Vzc2FyeSBjb21taXRzLiAgVHJ5IGZldGNoaW5nIGZyb20gJXMgZmlyc3QuIgorbXNnc3RyICIiCisiRWd5IHZhZ3kgdMO2YmIgbWVyZ2UgdGVzenQgaGliw6F0IGplbHpldHQsIG1pdmVsIG5lbSB0w7ZsdMO2dHTDvGsgbGUgYSBtZWdmZWxlbMWRICIKKyJjb21taXRva2F0LiBQcsOzYsOhbGp1bmsgbWVnIGxldMO2bHRlbmkgYSBrw7Z2ZXRrZXrFkWLFkWw6ICVzIGVsxZFzesO2ci4iCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MjA3Cittc2dpZCAiUGxlYXNlIHNlbGVjdCBvbmUgb3IgbW9yZSBicmFuY2hlcyB0byBkZWxldGUuIgorbXNnc3RyICJWw6FsYXNzenVuayBraSBlZ3kgdmFneSB0w7ZiYiBicmFuY2hldCB0w7ZybMOpc3JlLiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoyMTYKK21zZ2lkICIiCisiUmVjb3ZlcmluZyBkZWxldGVkIGJyYW5jaGVzIGlzIGRpZmZpY3VsdC5cbiIKKyJcbiIKKyJEZWxldGUgdGhlIHNlbGVjdGVkIGJyYW5jaGVzPyIKK21zZ3N0ciAiIgorIkEgdMO2csO2bHQgYnJhbmNoZWsgdmlzc3phw6FsbMOtdMOhc2EgbmVow6l6LlxuIgorIlxuIgorIlTDtnLDtmxqw7xrIGEga2l2w6FsYXN6dG90dCBicmFuY2hla2V0PyIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoyMjYKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJEZWxldGluZyBicmFuY2hlcyBmcm9tICVzIgorbXNnc3RyICJCcmFuY2VrIHTDtnJsw6lzZSBpbm5lbjogJXMiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6Mjg2Cittc2dpZCAiTm8gcmVwb3NpdG9yeSBzZWxlY3RlZC4iCittc2dzdHIgIk5pbmNzIGtpdsOhbGFzenRvdHQgcmVww7MuIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjI5MQorIywgdGNsLWZvcm1hdAorbXNnaWQgIlNjYW5uaW5nICVzLi4uIgorbXNnc3RyICJLZXJlc8OpcyBpdHQ6ICVzLi4uIgorCisjOiBsaWIvcmVtb3RlLnRjbDoxNjUKK21zZ2lkICJQcnVuZSBmcm9tIgorbXNnc3RyICJUw7ZybMOpcyBpbm5lbiIKKworIyB0Y2wtZm9ybWF0CisjOiBsaWIvcmVtb3RlLnRjbDoxNzAKK21zZ2lkICJGZXRjaCBmcm9tIgorbXNnc3RyICJMZXTDtmx0w6lzIGlubmVuIgorCisjOiBsaWIvcmVtb3RlLnRjbDoyMTMKK21zZ2lkICJQdXNoIHRvIgorbXNnc3RyICJQdXNoIGlkZSIKKworIzogbGliL3Nob3J0Y3V0LnRjbDoyMCBsaWIvc2hvcnRjdXQudGNsOjYxCittc2dpZCAiQ2Fubm90IHdyaXRlIHNob3J0Y3V0OiIKK21zZ3N0ciAiTmVtIHNpa2Vyw7xsdCDDrXJuaSBhIGd5b3JzYmlsbGVudHnFsXQ6IgorCisjOiBsaWIvc2hvcnRjdXQudGNsOjEzNgorbXNnaWQgIkNhbm5vdCB3cml0ZSBpY29uOiIKK21zZ3N0ciAiTmVtIHNpa2Vyw7xsdCDDrXJuaSBheiBpa29udDoiCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDo1NworbXNnaWQgIlVuc3VwcG9ydGVkIHNwZWxsIGNoZWNrZXIiCittc2dzdHIgIk5lbSB0w6Ftb2dhdG90dCBoZWx5ZXPDrXLDoXMtZWxsZW7FkXJ6xZEiCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDo2NQorbXNnaWQgIlNwZWxsIGNoZWNraW5nIGlzIHVuYXZhaWxhYmxlIgorbXNnc3RyICJBIGhlbHllc8OtcsOhcy1lbGxlbsWRcnrDqXMgbmVtIGVsw6lyaGV0xZEiCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDo2OAorbXNnaWQgIkludmFsaWQgc3BlbGwgY2hlY2tpbmcgY29uZmlndXJhdGlvbiIKK21zZ3N0ciAiw4lydsOpbnl0ZWxlbiBhIGhlbHllc8OtcsOhcy1lbGxlbsWRcnrFkSBiZcOhbGzDrXTDoXNhIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6NzAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJSZXZlcnRpbmcgZGljdGlvbmFyeSB0byAlcy4iCittc2dzdHIgIlN6w7N0w6FyIHZpc3N6YcOhbGzDrXTDoXNhIGEga8O2dmV0a2V6xZFyZTogJXMuIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6NzMKK21zZ2lkICJTcGVsbCBjaGVja2VyIHNpbGVudGx5IGZhaWxlZCBvbiBzdGFydHVwIgorbXNnc3RyICJBIGhlbHllc8OtcsOhcy1lbGxlbsWRcsWRIGluZMOtdMOhc2Egc2lrZXJ0ZWxlbiIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjgwCittc2dpZCAiVW5yZWNvZ25pemVkIHNwZWxsIGNoZWNrZXIiCittc2dzdHIgIklzbWVyZXRsZW4gaGVseWVzw61yw6FzLWVsbGVuxZFyesWRIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6MTgwCittc2dpZCAiTm8gU3VnZ2VzdGlvbnMiCittc2dzdHIgIk5pbmNzIGphdmFzbGF0IgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6MzgxCittc2dpZCAiVW5leHBlY3RlZCBFT0YgZnJvbSBzcGVsbCBjaGVja2VyIgorbXNnc3RyICJOZW0gdsOhcnQgRU9GIGEgaGVseWVzw61yw6FzLWVsbGVuxZFyesWRdMWRbCIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjM4NQorbXNnaWQgIlNwZWxsIENoZWNrZXIgRmFpbGVkIgorbXNnc3RyICJBIGhlbHllc8OtcsOhcy1lbGxlbsWRcnrDqXMgc2lrZXJ0ZWxlbiIKKworIzogbGliL3N0YXR1c19iYXIudGNsOjgzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiJXMgLi4uICUqaSBvZiAlKmkgJXMgKCUzaSUlKSIKK21zZ3N0ciAiJXMgLi4uICUqaSAvICUqaSAlcyAoJTNpJSUpIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDo2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiZmV0Y2ggJXMiCittc2dzdHIgImEoeikgJXMgbGV0w7ZsdMOpc2UiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJGZXRjaGluZyBuZXcgY2hhbmdlcyBmcm9tICVzIgorbXNnc3RyICLDmmogdsOhbHRvesOhc29rIGxldMO2bHTDqXNlIGlubmVuOiAlcyIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTgKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJyZW1vdGUgcHJ1bmUgJXMiCittc2dzdHIgImEoeikgJXMgdMOhdm9saSB0w7ZybMOpc2UiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjE5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUHJ1bmluZyB0cmFja2luZyBicmFuY2hlcyBkZWxldGVkIGZyb20gJXMiCittc2dzdHIgIkEgJXMgcmVww7Niw7NsIHTDtnLDtmx0IGvDtnZldMWRIGJyYW5jaGVrIHTDtnJsw6lzZSIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MjUgbGliL3RyYW5zcG9ydC50Y2w6NzEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJwdXNoICVzIgorbXNnc3RyICIlcyBwdXNoLW9sw6FzYSIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MjYKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJQdXNoaW5nIGNoYW5nZXMgdG8gJXMiCittc2dzdHIgIlbDoWx0b3rDoXNvayBwdXNob2zDoXNhIGlkZTogJXMiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjcyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUHVzaGluZyAlcyAlcyB0byAlcyIKK21zZ3N0ciAiUHVzaG9sw6FzOiAlcyAlcywgaWRlOiAlcyIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6ODkKK21zZ2lkICJQdXNoIEJyYW5jaGVzIgorbXNnc3RyICJCcmFuY2hlayBwdXNob2zDoXNhIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoxMDMKK21zZ2lkICJTb3VyY2UgQnJhbmNoZXMiCittc2dzdHIgIkZvcnLDoXMgYnJhbmNoZWsiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjEyMAorbXNnaWQgIkRlc3RpbmF0aW9uIFJlcG9zaXRvcnkiCittc2dzdHIgIkPDqWwgcmVww7MiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjE1OAorbXNnaWQgIlRyYW5zZmVyIE9wdGlvbnMiCittc2dzdHIgIsOBdHZpdGVsaSBvcGNpw7NrIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoxNjAKK21zZ2lkICJGb3JjZSBvdmVyd3JpdGUgZXhpc3RpbmcgYnJhbmNoIChtYXkgZGlzY2FyZCBjaGFuZ2VzKSIKK21zZ3N0ciAiIgorIkzDqXRlesWRIGJyYW5jaCBmZWzDvGzDrXLDoXPDoW5hayBlcsWRbHRldMOpc2UgKGxlaGV0LCBob2d5IGVsIGZvZyBkb2JuaSAiCisidsOhbHRvenRhdMOhc29rYXQpIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoxNjQKK21zZ2lkICJVc2UgdGhpbiBwYWNrIChmb3Igc2xvdyBuZXR3b3JrIGNvbm5lY3Rpb25zKSIKK21zZ3N0ciAiVsOpa29ueSBjc29tYWdvayBoYXN6bsOhbGF0YSAobGFzc8O6IGjDoWzDs3phdGkga2FwY3NvbGF0b2sgc3rDoW3DoXJhKSIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTY4Cittc2dpZCAiSW5jbHVkZSB0YWdzIgorbXNnc3RyICJUYWdla2V0IGlzIgorCisjfiBtc2dpZCAiTm90IGNvbm5lY3RlZCB0byBhc3BlbGwiCisjfiBtc2dzdHIgIk5pbmNzIGthcGNzb2xhdCBheiBhc3BlbGxoZXoiCisKKyN+IG1zZ2lkICJDYW5ub3QgZmluZCB0aGUgZ2l0IGRpcmVjdG9yeToiCisjfiBtc2dzdHIgIk5lbSB0YWzDoWxoYXTDsyBhIGdpdCBrw7ZueXZ0w6FyOiIKKworI34gbXNnaWQgIlVuc3RhZ2VkIENoYW5nZXMgKFdpbGwgTm90IEJlIENvbW1pdHRlZCkiCisjfiBtc2dzdHIgIk5lbSBraXbDoWxhc3p0b3R0IHbDoWx0b3p0YXTDoXNvayAobmVtIGxlc3ogY29tbWl0b2x2YSkiCisKKyN+IG1zZ2lkICJQdXNoIHRvICVzLi4uIgorI34gbXNnc3RyICJQdXNob2zDoXMgaWRlOiAlcy4uLiIKKworI34gbXNnaWQgIkFkZCBUbyBDb21taXQiCisjfiBtc2dzdHIgIkhvenrDoWFkw6FzIGEgY29tbWl0aG96IgorCisjfiBtc2dpZCAiQWRkIEV4aXN0aW5nIFRvIENvbW1pdCIKKyN+IG1zZ3N0ciAiSG96esOhYWTDoXMgbMOpdGV6xZEgY29tbWl0aG96IgorCisjfiBtc2dpZCAiUnVubmluZyBtaWdhLi4uIgorI34gbXNnc3RyICJBIG1pZ2EgZnV0dGF0w6FzYS4uLiIKKworI34gbXNnaWQgIkFkZCBFeGlzdGluZyIKKyN+IG1zZ3N0ciAiTMOpdGV6xZEgaG96esOhYWTDoXNhIgorCisjfiBtc2dpZCAiIgorI34gIkFib3J0IGNvbW1pdD9cbiIKKyN+ICJcbiIKKyN+ICJBYm9ydGluZyB0aGUgY3VycmVudCBjb21taXQgd2lsbCBjYXVzZSAqQUxMKiB1bmNvbW1pdHRlZCBjaGFuZ2VzIHRvIGJlICIKKyN+ICJsb3N0LlxuIgorI34gIlxuIgorI34gIkNvbnRpbnVlIHdpdGggYWJvcnRpbmcgdGhlIGN1cnJlbnQgY29tbWl0PyIKKyN+IG1zZ3N0ciAiIgorI34gIk1lZ3N6YWvDrXRqdWsgYSBjb21taXRvdD9cbiIKKyN+ICJcbiIKKyN+ICJBIGplbGVubGVnaSBjb21taXQgbWVnc3pha8OtdMOhc2EgKk1JTkRFTiogbmVtIGNvbW1pdG9sdCB2w6FsdG96dGF0w6FzICIKKyN+ICJlbHZlc3p0w6lzw6l0IGplbGVudGkuXG4iCisjfiAiXG4iCisjfiAiRm9seXRhdGp1ayBhIGplbGVubGVnaSBjb21taXQgbWVnc3pha8OtdMOhc8OhdD8iCisKKyN+IG1zZ2lkICJBYm9ydGluZy4uLiBwbGVhc2Ugd2FpdC4uLiIKKyN+IG1zZ3N0ciAiTWVnc3pha8OtdMOhcy4uLiB2w6FyanVuay4uLiIKZGlmZiAtLWdpdCBhL2dpdC1ndWkvcG8vaXQucG8gYi9naXQtZ3VpL3BvL2l0LnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExY2M3OWIKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtZ3VpL3BvL2l0LnBvCkBAIC0wLDAgKzEsMTk5NCBAQAorIyBUcmFuc2xhdGlvbiBvZiBnaXQtZ3VpIHRvIEl0YWxpYW4KKyMgQ29weXJpZ2h0IChDKSAyMDA3IFNoYXduIFBlYXJjZQorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ2l0LWd1aSBwYWNrYWdlLgorIyBQYW9sbyBDaWFycm9jY2hpIDxwYW9sby5jaWFycm9jY2hpQGdtYWlsLmNvbT4sIDIwMDcKKyMgTWljaGVsZSBCYWxsYWJpbyA8YmFycmFfY3VkYUBrYXRhbWFpbC5jb20+LCAyMDA3LgorIyAKKyMgCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnaXQtZ3VpXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IFxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDA4LTAzLTE0IDA3OjE4KzAxMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA4LTAzLTEyIDIyOjEyKzAxMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IE1pY2hlbGUgQmFsbGFiaW8gPGJhcnJhX2N1ZGFAa2F0YW1haWwuY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IEl0YWxpYW4gPHRwQGxpc3RzLmxpbnV4Lml0PlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorCisjOiBnaXQtZ3VpLnNoOjQxIGdpdC1ndWkuc2g6NjM0IGdpdC1ndWkuc2g6NjQ4IGdpdC1ndWkuc2g6NjYxIGdpdC1ndWkuc2g6NzQ0CisjOiBnaXQtZ3VpLnNoOjc2MworbXNnaWQgImdpdC1ndWk6IGZhdGFsIGVycm9yIgorbXNnc3RyICJnaXQtZ3VpOiBlcnJvcmUgZ3JhdmUiCisKKyM6IGdpdC1ndWkuc2g6NTkzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBmb250IHNwZWNpZmllZCBpbiAlczoiCittc2dzdHIgIkNhcmF0dGVyaSBub24gdmFsaWRpIHNwZWNpZmljYXRpIGluICVzOiIKKworIzogZ2l0LWd1aS5zaDo2MjAKK21zZ2lkICJNYWluIEZvbnQiCittc2dzdHIgIkNhcmF0dGVyaSBwcmluY2lwYWxpIgorCisjOiBnaXQtZ3VpLnNoOjYyMQorbXNnaWQgIkRpZmYvQ29uc29sZSBGb250IgorbXNnc3RyICJDYXJhdHRlcmkgcGVyIGNvbmZyb250aSBlIHRlcm1pbmFsZSIKKworIzogZ2l0LWd1aS5zaDo2MzUKK21zZ2lkICJDYW5ub3QgZmluZCBnaXQgaW4gUEFUSC4iCittc2dzdHIgIkltcG9zc2liaWxlIHRyb3ZhcmUgZ2l0IG5lbCBQQVRIIgorCisjOiBnaXQtZ3VpLnNoOjY2MgorbXNnaWQgIkNhbm5vdCBwYXJzZSBHaXQgdmVyc2lvbiBzdHJpbmc6IgorbXNnc3RyICJJbXBvc3NpYmlsZSBkZXRlcm1pbmFyZSBsYSB2ZXJzaW9uZSBkaSBHaXQ6IgorCisjOiBnaXQtZ3VpLnNoOjY4MAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJHaXQgdmVyc2lvbiBjYW5ub3QgYmUgZGV0ZXJtaW5lZC5cbiIKKyJcbiIKKyIlcyBjbGFpbXMgaXQgaXMgdmVyc2lvbiAnJXMnLlxuIgorIlxuIgorIiVzIHJlcXVpcmVzIGF0IGxlYXN0IEdpdCAxLjUuMCBvciBsYXRlci5cbiIKKyJcbiIKKyJBc3N1bWUgJyVzJyBpcyB2ZXJzaW9uIDEuNS4wP1xuIgorbXNnc3RyICIiCisiTGEgdmVyc2lvbmUgZGkgR2l0IG5vbiBwdcOyIGVzc2VyZSBkZXRlcm1pbmF0YS5cbiIKKyJcbiIKKyIlcyByaXBvcnRhIGNoZSBsYSB2ZXJzaW9uZSDDqCAnJXMnLlxuIgorIlxuIgorIiVzIHJpY2hpZWRlIGFsbWVubyBHaXQgMS41LjAgbyBzdXBlcmlvcmUuXG4iCisiXG4iCisiQXNzdW1lcmUgY2hlICclcycgc2lhIGFsbGEgdmVyc2lvbmUgMS41LjA/XG4iCisKKyM6IGdpdC1ndWkuc2g6OTE4Cittc2dpZCAiR2l0IGRpcmVjdG9yeSBub3QgZm91bmQ6IgorbXNnc3RyICJOb24gdHJvdm8gbGEgZGlyZWN0b3J5IGRpIGdpdDogIgorCisjOiBnaXQtZ3VpLnNoOjkyNQorbXNnaWQgIkNhbm5vdCBtb3ZlIHRvIHRvcCBvZiB3b3JraW5nIGRpcmVjdG9yeToiCittc2dzdHIgIkltcG9zc2liaWxlIHNwb3N0YXJzaSBzdWxsYSBkaXJlY3RvcnkgcHJpbmNpcGFsZSBkZWwgcHJvZ2V0dG86IgorCisjOiBnaXQtZ3VpLnNoOjkzMgorbXNnaWQgIkNhbm5vdCB1c2UgZnVubnkgLmdpdCBkaXJlY3Rvcnk6IgorbXNnc3RyICJJbXBvc3NpYmlsZSB1c2FyZSB1bmEgLmdpdCBkaXJlY3Rvcnkgc3RyYW5hOiIKKworIzogZ2l0LWd1aS5zaDo5MzcKK21zZ2lkICJObyB3b3JraW5nIGRpcmVjdG9yeSIKK21zZ3N0ciAiTmVzc3VuYSBkaXJlY3RvcnkgZGkgbGF2b3JvIgorCisjOiBnaXQtZ3VpLnNoOjEwODQgbGliL2NoZWNrb3V0X29wLnRjbDoyODMKK21zZ2lkICJSZWZyZXNoaW5nIGZpbGUgc3RhdHVzLi4uIgorbXNnc3RyICJDb250cm9sbG8gZGVsbG8gc3RhdG8gZGVpIGZpbGUgaW4gY29yc28uLi4iCisKKyM6IGdpdC1ndWkuc2g6MTE0OQorbXNnaWQgIlNjYW5uaW5nIGZvciBtb2RpZmllZCBmaWxlcyAuLi4iCittc2dzdHIgIlJpY2VyY2EgZGkgZmlsZSBtb2RpZmljYXRpIGluIGNvcnNvLi4uIgorCisjOiBnaXQtZ3VpLnNoOjEzMjQgbGliL2Jyb3dzZXIudGNsOjI0NgorbXNnaWQgIlJlYWR5LiIKK21zZ3N0ciAiUHJvbnRvLiIKKworIzogZ2l0LWd1aS5zaDoxNTkwCittc2dpZCAiVW5tb2RpZmllZCIKK21zZ3N0ciAiTm9uIG1vZGlmaWNhdG8iCisKKyM6IGdpdC1ndWkuc2g6MTU5MgorbXNnaWQgIk1vZGlmaWVkLCBub3Qgc3RhZ2VkIgorbXNnc3RyICJNb2RpZmljYXRvLCBub24gcHJlcGFyYXRvIHBlciB1bmEgbnVvdmEgcmV2aXNpb25lIgorCisjOiBnaXQtZ3VpLnNoOjE1OTMgZ2l0LWd1aS5zaDoxNTk4Cittc2dpZCAiU3RhZ2VkIGZvciBjb21taXQiCittc2dzdHIgIlByZXBhcmF0byBwZXIgdW5hIG51b3ZhIHJldmlzaW9uZSIKKworIzogZ2l0LWd1aS5zaDoxNTk0IGdpdC1ndWkuc2g6MTU5OQorbXNnaWQgIlBvcnRpb25zIHN0YWdlZCBmb3IgY29tbWl0IgorbXNnc3RyICJQYXJ0aSBwcmVwYXJhdGUgcGVyIHVuYSBudW92YSByZXZpc2lvbmUiCisKKyM6IGdpdC1ndWkuc2g6MTU5NSBnaXQtZ3VpLnNoOjE2MDAKK21zZ2lkICJTdGFnZWQgZm9yIGNvbW1pdCwgbWlzc2luZyIKK21zZ3N0ciAiUHJlcGFyYXRvIHBlciB1bmEgbnVvdmEgcmV2aXNpb25lLCBtYW5jYW50ZSIKKworIzogZ2l0LWd1aS5zaDoxNTk3Cittc2dpZCAiVW50cmFja2VkLCBub3Qgc3RhZ2VkIgorbXNnc3RyICJOb24gdHJhY2NpYXRvLCBub24gcHJlcGFyYXRvIHBlciB1bmEgbnVvdmEgcmV2aXNpb25lIgorCisjOiBnaXQtZ3VpLnNoOjE2MDIKK21zZ2lkICJNaXNzaW5nIgorbXNnc3RyICJNYW5jYW50ZSIKKworIzogZ2l0LWd1aS5zaDoxNjAzCittc2dpZCAiU3RhZ2VkIGZvciByZW1vdmFsIgorbXNnc3RyICJQcmVwYXJhdG8gcGVyIGxhIHJpbW96aW9uZSIKKworIzogZ2l0LWd1aS5zaDoxNjA0Cittc2dpZCAiU3RhZ2VkIGZvciByZW1vdmFsLCBzdGlsbCBwcmVzZW50IgorbXNnc3RyICJQcmVwYXJhdG8gYWxsYSByaW1vemlvbmUsIGFuY29yYSBwcmVzZW50ZSIKKworIzogZ2l0LWd1aS5zaDoxNjA2IGdpdC1ndWkuc2g6MTYwNyBnaXQtZ3VpLnNoOjE2MDggZ2l0LWd1aS5zaDoxNjA5Cittc2dpZCAiUmVxdWlyZXMgbWVyZ2UgcmVzb2x1dGlvbiIKK21zZ3N0ciAiUmljaGllZGUgcmlzb2x1emlvbmUgZGVpIGNvbmZsaXR0aSIKKworIzogZ2l0LWd1aS5zaDoxNjQ0Cittc2dpZCAiU3RhcnRpbmcgZ2l0ay4uLiBwbGVhc2Ugd2FpdC4uLiIKK21zZ3N0ciAiQXZ2aW8gZGkgZ2l0ay4uLiBhdHRlbmRlcmUuLi4iCisKKyM6IGdpdC1ndWkuc2g6MTY1MworIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJVbmFibGUgdG8gc3RhcnQgZ2l0azpcbiIKKyJcbiIKKyIlcyBkb2VzIG5vdCBleGlzdCIKK21zZ3N0ciAiIgorIkltcG9zc2liaWxlIGF2dmlhcmUgZ2l0azpcbiIKKyJcbiIKKyIlcyBub24gZXNpc3RlIgorCisjOiBnaXQtZ3VpLnNoOjE4NjAgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozNgorbXNnaWQgIlJlcG9zaXRvcnkiCittc2dzdHIgIkFyY2hpdmlvIgorCisjOiBnaXQtZ3VpLnNoOjE4NjEKK21zZ2lkICJFZGl0IgorbXNnc3RyICJNb2RpZmljYSIKKworIzogZ2l0LWd1aS5zaDoxODYzIGxpYi9jaG9vc2VfcmV2LnRjbDo1NjEKK21zZ2lkICJCcmFuY2giCittc2dzdHIgIlJhbW8iCisKKyM6IGdpdC1ndWkuc2g6MTg2NiBsaWIvY2hvb3NlX3Jldi50Y2w6NTQ4Cittc2dpZCAiQ29tbWl0QEBub3VuIgorbXNnc3RyICJSZXZpc2lvbmUiCisKKyM6IGdpdC1ndWkuc2g6MTg2OSBsaWIvbWVyZ2UudGNsOjEyMCBsaWIvbWVyZ2UudGNsOjE0OSBsaWIvbWVyZ2UudGNsOjE2NworbXNnaWQgIk1lcmdlIgorbXNnc3RyICJGdXNpb25lIChNZXJnZSkiCisKKyM6IGdpdC1ndWkuc2g6MTg3MCBsaWIvY2hvb3NlX3Jldi50Y2w6NTU3Cittc2dpZCAiUmVtb3RlIgorbXNnc3RyICJSZW1vdG8iCisKKyM6IGdpdC1ndWkuc2g6MTg3OQorbXNnaWQgIkJyb3dzZSBDdXJyZW50IEJyYW5jaCdzIEZpbGVzIgorbXNnc3RyICJFc3Bsb3JhIGkgZmlsZSBkZWwgcmFtbyBhdHR1YWxlIgorCisjOiBnaXQtZ3VpLnNoOjE4ODMKK21zZ2lkICJCcm93c2UgQnJhbmNoIEZpbGVzLi4uIgorbXNnc3RyICJFc3Bsb3JhIGkgZmlsZSBkZWwgcmFtby4uLiIKKworIzogZ2l0LWd1aS5zaDoxODg4Cittc2dpZCAiVmlzdWFsaXplIEN1cnJlbnQgQnJhbmNoJ3MgSGlzdG9yeSIKK21zZ3N0ciAiVmlzdWFsaXp6YSBsYSBjcm9ub2xvZ2lhIGRlbCByYW1vIGF0dHVhbGUiCisKKyM6IGdpdC1ndWkuc2g6MTg5MgorbXNnaWQgIlZpc3VhbGl6ZSBBbGwgQnJhbmNoIEhpc3RvcnkiCittc2dzdHIgIlZpc3VhbGl6emEgbGEgY3Jvbm9sb2dpYSBkaSB0dXR0aSBpIHJhbWkiCisKKyM6IGdpdC1ndWkuc2g6MTg5OQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkJyb3dzZSAlcydzIEZpbGVzIgorbXNnc3RyICJFc3Bsb3JhIGkgZmlsZSBkaSAlcyIKKworIzogZ2l0LWd1aS5zaDoxOTAxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVmlzdWFsaXplICVzJ3MgSGlzdG9yeSIKK21zZ3N0ciAiVmlzdWFsaXp6YSBsYSBjcm9ub2xvZ2lhIGRpICVzIgorCisjOiBnaXQtZ3VpLnNoOjE5MDYgbGliL2RhdGFiYXNlLnRjbDoyNyBsaWIvZGF0YWJhc2UudGNsOjY3Cittc2dpZCAiRGF0YWJhc2UgU3RhdGlzdGljcyIKK21zZ3N0ciAiU3RhdGlzdGljaGUgZGVsbCdhcmNoaXZpbyIKKworIzogZ2l0LWd1aS5zaDoxOTA5IGxpYi9kYXRhYmFzZS50Y2w6MzQKK21zZ2lkICJDb21wcmVzcyBEYXRhYmFzZSIKK21zZ3N0ciAiQ29tcHJpbWkgbCdhcmNoaXZpbyIKKworIzogZ2l0LWd1aS5zaDoxOTEyCittc2dpZCAiVmVyaWZ5IERhdGFiYXNlIgorbXNnc3RyICJWZXJpZmljYSBsJ2FyY2hpdmlvIgorCisjOiBnaXQtZ3VpLnNoOjE5MTkgZ2l0LWd1aS5zaDoxOTIzIGdpdC1ndWkuc2g6MTkyNyBsaWIvc2hvcnRjdXQudGNsOjcKKyM6IGxpYi9zaG9ydGN1dC50Y2w6MzkgbGliL3Nob3J0Y3V0LnRjbDo3MQorbXNnaWQgIkNyZWF0ZSBEZXNrdG9wIEljb24iCittc2dzdHIgIkNyZWEgaWNvbmEgZGVza3RvcCIKKworIzogZ2l0LWd1aS5zaDoxOTMyIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTc3IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTg1Cittc2dpZCAiUXVpdCIKK21zZ3N0ciAiRXNjaSIKKworIzogZ2l0LWd1aS5zaDoxOTM5Cittc2dpZCAiVW5kbyIKK21zZ3N0ciAiQW5udWxsYSIKKworIzogZ2l0LWd1aS5zaDoxOTQyCittc2dpZCAiUmVkbyIKK21zZ3N0ciAiUmlwZXRpIgorCisjOiBnaXQtZ3VpLnNoOjE5NDYgZ2l0LWd1aS5zaDoyNDQzCittc2dpZCAiQ3V0IgorbXNnc3RyICJUYWdsaWEiCisKKyM6IGdpdC1ndWkuc2g6MTk0OSBnaXQtZ3VpLnNoOjI0NDYgZ2l0LWd1aS5zaDoyNTIwIGdpdC1ndWkuc2g6MjYxNAorIzogbGliL2NvbnNvbGUudGNsOjY5Cittc2dpZCAiQ29weSIKK21zZ3N0ciAiQ29waWEiCisKKyM6IGdpdC1ndWkuc2g6MTk1MiBnaXQtZ3VpLnNoOjI0NDkKK21zZ2lkICJQYXN0ZSIKK21zZ3N0ciAiSW5jb2xsYSIKKworIzogZ2l0LWd1aS5zaDoxOTU1IGdpdC1ndWkuc2g6MjQ1MiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MjYKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MzgKK21zZ2lkICJEZWxldGUiCittc2dzdHIgIkVsaW1pbmEiCisKKyM6IGdpdC1ndWkuc2g6MTk1OSBnaXQtZ3VpLnNoOjI0NTYgZ2l0LWd1aS5zaDoyNjE4IGxpYi9jb25zb2xlLnRjbDo3MQorbXNnaWQgIlNlbGVjdCBBbGwiCittc2dzdHIgIlNlbGV6aW9uYSB0dXR0byIKKworIzogZ2l0LWd1aS5zaDoxOTY4Cittc2dpZCAiQ3JlYXRlLi4uIgorbXNnc3RyICJDcmVhLi4uIgorCisjOiBnaXQtZ3VpLnNoOjE5NzQKK21zZ2lkICJDaGVja291dC4uLiIKK21zZ3N0ciAiQXR0aXZhLi4uIgorCisjOiBnaXQtZ3VpLnNoOjE5ODAKK21zZ2lkICJSZW5hbWUuLi4iCittc2dzdHIgIlJpbm9taW5hIgorCisjOiBnaXQtZ3VpLnNoOjE5ODUgZ2l0LWd1aS5zaDoyMDg1Cittc2dpZCAiRGVsZXRlLi4uIgorbXNnc3RyICJFbGltaW5hLi4uIgorCisjOiBnaXQtZ3VpLnNoOjE5OTAKK21zZ2lkICJSZXNldC4uLiIKK21zZ3N0ciAiUmlwcmlzdGluYS4uLiIKKworIzogZ2l0LWd1aS5zaDoyMDAyIGdpdC1ndWkuc2g6MjM4OQorbXNnaWQgIk5ldyBDb21taXQiCittc2dzdHIgIk51b3ZhIHJldmlzaW9uZSIKKworIzogZ2l0LWd1aS5zaDoyMDEwIGdpdC1ndWkuc2g6MjM5NgorbXNnaWQgIkFtZW5kIExhc3QgQ29tbWl0IgorbXNnc3RyICJDb3JyZWdnaSBsJ3VsdGltYSByZXZpc2lvbmUiCisKKyM6IGdpdC1ndWkuc2g6MjAxOSBnaXQtZ3VpLnNoOjIzNTYgbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDo5OQorbXNnaWQgIlJlc2NhbiIKK21zZ3N0ciAiQW5hbGl6emEgbnVvdmFtZW50ZSIKKworIzogZ2l0LWd1aS5zaDoyMDI1Cittc2dpZCAiU3RhZ2UgVG8gQ29tbWl0IgorbXNnc3RyICJQcmVwYXJhIHBlciB1bmEgbnVvdmEgcmV2aXNpb25lIgorCisjOiBnaXQtZ3VpLnNoOjIwMzEKK21zZ2lkICJTdGFnZSBDaGFuZ2VkIEZpbGVzIFRvIENvbW1pdCIKK21zZ3N0ciAiUHJlcGFyYSBpIGZpbGUgbW9kaWZpY2F0aSBwZXIgdW5hIG51b3ZhIHJldmlzaW9uZSIKKworIzogZ2l0LWd1aS5zaDoyMDM3Cittc2dpZCAiVW5zdGFnZSBGcm9tIENvbW1pdCIKK21zZ3N0ciAiQW5udWxsYSBwcmVwYXJhemlvbmUiCisKKyM6IGdpdC1ndWkuc2g6MjA0MiBsaWIvaW5kZXgudGNsOjM5NQorbXNnaWQgIlJldmVydCBDaGFuZ2VzIgorbXNnc3RyICJBbm51bGxhIG1vZGlmaWNoZSIKKworIzogZ2l0LWd1aS5zaDoyMDQ5IGdpdC1ndWkuc2g6MjM2OCBnaXQtZ3VpLnNoOjI0NjcKK21zZ2lkICJTaWduIE9mZiIKK21zZ3N0ciAiU2lnbiBPZmYiCisKKyM6IGdpdC1ndWkuc2g6MjA1MyBnaXQtZ3VpLnNoOjIzNzIKK21zZ2lkICJDb21taXRAQHZlcmIiCittc2dzdHIgIk51b3ZhIHJldmlzaW9uZSIKKworIzogZ2l0LWd1aS5zaDoyMDY0Cittc2dpZCAiTG9jYWwgTWVyZ2UuLi4iCittc2dzdHIgIkZ1c2lvbmUgbG9jYWxlLi4uIgorCisjOiBnaXQtZ3VpLnNoOjIwNjkKK21zZ2lkICJBYm9ydCBNZXJnZS4uLiIKK21zZ3N0ciAiSW50ZXJyb21waSBmdXNpb25lLi4uIgorCisjOiBnaXQtZ3VpLnNoOjIwODEKK21zZ2lkICJQdXNoLi4uIgorbXNnc3RyICJQcm9wYWdhLi4uIgorCisjOiBnaXQtZ3VpLnNoOjIwOTIgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0MQorbXNnaWQgIkFwcGxlIgorbXNnc3RyICJBcHBsZSIKKworIzogZ2l0LWd1aS5zaDoyMDk1IGdpdC1ndWkuc2g6MjExNyBsaWIvYWJvdXQudGNsOjE0CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ0IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJBYm91dCAlcyIKK21zZ3N0ciAiSW5mb3JtYXppb25pIHN1ICVzIgorCisjOiBnaXQtZ3VpLnNoOjIwOTkKK21zZ2lkICJQcmVmZXJlbmNlcy4uLiIKK21zZ3N0ciAiUHJlZmVyZW56ZS4uLiIKKworIzogZ2l0LWd1aS5zaDoyMTA3IGdpdC1ndWkuc2g6MjYzOQorbXNnaWQgIk9wdGlvbnMuLi4iCittc2dzdHIgIk9wemlvbmkuLi4iCisKKyM6IGdpdC1ndWkuc2g6MjExMyBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ3Cittc2dpZCAiSGVscCIKK21zZ3N0ciAiQWl1dG8iCisKKyM6IGdpdC1ndWkuc2g6MjE1NAorbXNnaWQgIk9ubGluZSBEb2N1bWVudGF0aW9uIgorbXNnc3RyICJEb2N1bWVudGF6aW9uZSBzdWwgd2ViIgorCisjOiBnaXQtZ3VpLnNoOjIyMzgKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJmYXRhbDogY2Fubm90IHN0YXQgcGF0aCAlczogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIKK21zZ3N0ciAiIgorImVycm9yZSBncmF2ZTogaW1wb3NzaWJpbGUgZWZmZXR0dWFyZSBsbyBzdGF0IGRlbCBwYXRoICVzOiBmaWxlIG8gZGlyZWN0b3J5ICIKKyJub24gdHJvdmF0YSIKKworIzogZ2l0LWd1aS5zaDoyMjcxCittc2dpZCAiQ3VycmVudCBCcmFuY2g6IgorbXNnc3RyICJSYW1vIGF0dHVhbGU6IgorCisjOiBnaXQtZ3VpLnNoOjIyOTIKK21zZ2lkICJTdGFnZWQgQ2hhbmdlcyAoV2lsbCBDb21taXQpIgorbXNnc3RyICJNb2RpZmljaGUgcHJlcGFyYXRlIChzYXJhbm5vIG5lbGxhIG51b3ZhIHJldmlzaW9uZSkiCisKKyM6IGdpdC1ndWkuc2g6MjMxMgorbXNnaWQgIlVuc3RhZ2VkIENoYW5nZXMiCittc2dzdHIgIk1vZGlmaWNoZSBub24gcHJlcGFyYXRlIgorCisjOiBnaXQtZ3VpLnNoOjIzNjIKK21zZ2lkICJTdGFnZSBDaGFuZ2VkIgorbXNnc3RyICJQcmVwYXJhIG1vZGlmaWNhdGkiCisKKyM6IGdpdC1ndWkuc2g6MjM3OCBsaWIvdHJhbnNwb3J0LnRjbDo5MyBsaWIvdHJhbnNwb3J0LnRjbDoxODIKK21zZ2lkICJQdXNoIgorbXNnc3RyICJQcm9wYWdhIChQdXNoKSIKKworIzogZ2l0LWd1aS5zaDoyNDA4Cittc2dpZCAiSW5pdGlhbCBDb21taXQgTWVzc2FnZToiCittc2dzdHIgIk1lc3NhZ2dpbyBkaSByZXZpc2lvbmUgaW5pemlhbGU6IgorCisjOiBnaXQtZ3VpLnNoOjI0MDkKK21zZ2lkICJBbWVuZGVkIENvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAiTWVzc2FnZ2lvIGRpIHJldmlzaW9uZSBjb3JyZXR0bzoiCisKKyM6IGdpdC1ndWkuc2g6MjQxMAorbXNnaWQgIkFtZW5kZWQgSW5pdGlhbCBDb21taXQgTWVzc2FnZToiCittc2dzdHIgIk1lc3NhZ2dpbyBpbml6aWFsZSBkaSByZXZpc2lvbmUgY29ycmV0dG86IgorCisjOiBnaXQtZ3VpLnNoOjI0MTEKK21zZ2lkICJBbWVuZGVkIE1lcmdlIENvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAiTWVzc2FnZ2lvIGRpIGZ1c2lvbmUgY29ycmV0dG86IgorCisjOiBnaXQtZ3VpLnNoOjI0MTIKK21zZ2lkICJNZXJnZSBDb21taXQgTWVzc2FnZToiCittc2dzdHIgIk1lc3NhZ2dpbyBkaSBmdXNpb25lOiIKKworIzogZ2l0LWd1aS5zaDoyNDEzCittc2dpZCAiQ29tbWl0IE1lc3NhZ2U6IgorbXNnc3RyICJNZXNzYWdnaW8gZGkgcmV2aXNpb25lOiIKKworIzogZ2l0LWd1aS5zaDoyNDU5IGdpdC1ndWkuc2g6MjYyMiBsaWIvY29uc29sZS50Y2w6NzMKK21zZ2lkICJDb3B5IEFsbCIKK21zZ3N0ciAiQ29waWEgdHV0dG8iCisKKyM6IGdpdC1ndWkuc2g6MjQ4MyBsaWIvYmxhbWUudGNsOjEwNworbXNnaWQgIkZpbGU6IgorbXNnc3RyICJGaWxlOiIKKworIzogZ2l0LWd1aS5zaDoyNTg5Cittc2dpZCAiQXBwbHkvUmV2ZXJzZSBIdW5rIgorbXNnc3RyICJBcHBsaWNhL0ludmVydGkgc2V6aW9uZSIKKworIzogZ2l0LWd1aS5zaDoyNTk1Cittc2dpZCAiU2hvdyBMZXNzIENvbnRleHQiCittc2dzdHIgIk1vc3RyYSBtZW5vIGNvbnRlc3RvIgorCisjOiBnaXQtZ3VpLnNoOjI2MDIKK21zZ2lkICJTaG93IE1vcmUgQ29udGV4dCIKK21zZ3N0ciAiTW9zdHJhIHBpw7kgY29udGVzdG8iCisKKyM6IGdpdC1ndWkuc2g6MjYxMAorbXNnaWQgIlJlZnJlc2giCittc2dzdHIgIlJpbmZyZXNjYSIKKworIzogZ2l0LWd1aS5zaDoyNjMxCittc2dpZCAiRGVjcmVhc2UgRm9udCBTaXplIgorbXNnc3RyICJEaW1pbnVpc2NpIGRpbWVuc2lvbmUgY2FyYXR0ZXJpIgorCisjOiBnaXQtZ3VpLnNoOjI2MzUKK21zZ2lkICJJbmNyZWFzZSBGb250IFNpemUiCittc2dzdHIgIkF1bWVudGEgZGltZW5zaW9uZSBjYXJhdHRlcmkiCisKKyM6IGdpdC1ndWkuc2g6MjY0NgorbXNnaWQgIlVuc3RhZ2UgSHVuayBGcm9tIENvbW1pdCIKK21zZ3N0ciAiU2V6aW9uZSBub24gcHJlcGFyYXRhIHBlciB1bmEgbnVvdmEgcmV2aXNpb25lIgorCisjOiBnaXQtZ3VpLnNoOjI2NDgKK21zZ2lkICJTdGFnZSBIdW5rIEZvciBDb21taXQiCittc2dzdHIgIlByZXBhcmEgc2V6aW9uZSBwZXIgdW5hIG51b3ZhIHJldmlzaW9uZSIKKworIzogZ2l0LWd1aS5zaDoyNjY3Cittc2dpZCAiSW5pdGlhbGl6aW5nLi4uIgorbXNnc3RyICJJbml6aWFsaXp6YXppb25lLi4uIgorCisjOiBnaXQtZ3VpLnNoOjI3NjIKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiUG9zc2libGUgZW52aXJvbm1lbnQgaXNzdWVzIGV4aXN0LlxuIgorIlxuIgorIlRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBwcm9iYWJseVxuIgorImdvaW5nIHRvIGJlIGlnbm9yZWQgYnkgYW55IEdpdCBzdWJwcm9jZXNzIHJ1blxuIgorImJ5ICVzOlxuIgorIlxuIgorbXNnc3RyICIiCisiUG9zc2liaWxpIHByb2JsZW1pIGNvbiBsZSB2YXJpYWJpbGkgZCdhbWJpZW50ZS5cbiIKKyJcbiIKKyJMZSBzZWd1ZW50aSB2YXJpYWJpbGkgZCdhbWJpZW50ZSBzYXJhbm5vIHByb2JhYmlsbWVudGVcbiIKKyJpZ25vcmF0ZSBkYSB0dXR0aSBpIHNvdHRvcHJvY2Vzc2kgZGkgR2l0IGF2dmlhdGlcbiIKKyJkYSAlczpcbiIKKyJcbiIKKworIzogZ2l0LWd1aS5zaDoyNzkyCittc2dpZCAiIgorIlxuIgorIlRoaXMgaXMgZHVlIHRvIGEga25vd24gaXNzdWUgd2l0aCB0aGVcbiIKKyJUY2wgYmluYXJ5IGRpc3RyaWJ1dGVkIGJ5IEN5Z3dpbi4iCittc2dzdHIgIiIKKyJcbiIKKyJDacOyIMOoIGRvdnV0byBhIHVuIHByb2JsZW1hIGNvbm9zY2l1dG9cbiIKKyJjYXVzYXRvIGRhbGwnZXNlZ3VpYmlsZSBUY2wgZGlzdHJpYnVpdG8gZGEgQ3lnd2luLiIKKworIzogZ2l0LWd1aS5zaDoyNzk3CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIlxuIgorIkEgZ29vZCByZXBsYWNlbWVudCBmb3IgJXNcbiIKKyJpcyBwbGFjaW5nIHZhbHVlcyBmb3IgdGhlIHVzZXIubmFtZSBhbmRcbiIKKyJ1c2VyLmVtYWlsIHNldHRpbmdzIGludG8geW91ciBwZXJzb25hbFxuIgorIn4vLmdpdGNvbmZpZyBmaWxlLlxuIgorbXNnc3RyICIiCisiXG4iCisiXG4iCisiVW5hIGJ1b25hIGFsdGVybmF0aXZhIGEgJXNcbiIKKyJjb25zaXN0ZSBuZWxsJ2Fzc2VnbmFyZSB2YWxvcmkgYWxsZSB2YXJpYWJpbGkgZGkgY29uZmlndXJhemlvbmVcbiIKKyJ1c2VyLm5hbWUgZSB1c2VyLmVtYWlsIG5lbCB0dW8gZmlsZSB+Ly5naXRjb25maWcgcGVyc29uYWxlLlxuIgorCisjOiBsaWIvYWJvdXQudGNsOjI2Cittc2dpZCAiZ2l0LWd1aSAtIGEgZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlIGZvciBHaXQuIgorbXNnc3RyICJnaXQtZ3VpIC0gdW4naW50ZXJmYWNjaWEgZ3JhZmljYSBwZXIgR2l0LiIKKworIzogbGliL2JsYW1lLnRjbDo3NworbXNnaWQgIkZpbGUgVmlld2VyIgorbXNnc3RyICJNb3N0cmEgZmlsZSIKKworIzogbGliL2JsYW1lLnRjbDo4MQorbXNnaWQgIkNvbW1pdDoiCittc2dzdHIgIlJldmlzaW9uZToiCisKKyM6IGxpYi9ibGFtZS50Y2w6MjY0Cittc2dpZCAiQ29weSBDb21taXQiCittc2dzdHIgIkNvcGlhIHJldmlzaW9uZSIKKworIzogbGliL2JsYW1lLnRjbDozODQKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJSZWFkaW5nICVzLi4uIgorbXNnc3RyICJMZXR0dXJhIGRpICVzLi4uIgorCisjOiBsaWIvYmxhbWUudGNsOjQ4OAorbXNnaWQgIkxvYWRpbmcgY29weS9tb3ZlIHRyYWNraW5nIGFubm90YXRpb25zLi4uIgorbXNnc3RyICJDYXJpY2FtZW50byBhbm5vdGF6aW9uaSBwZXIgY29waWUvc3Bvc3RhbWVudGkuLi4iCisKKyM6IGxpYi9ibGFtZS50Y2w6NTA4Cittc2dpZCAibGluZXMgYW5ub3RhdGVkIgorbXNnc3RyICJsaW5lZSBhbm5vdGF0ZSIKKworIzogbGliL2JsYW1lLnRjbDo2ODkKK21zZ2lkICJMb2FkaW5nIG9yaWdpbmFsIGxvY2F0aW9uIGFubm90YXRpb25zLi4uIgorbXNnc3RyICJDYXJpY2FtZW50byBhbm5vdGF6aW9uaSBwZXIgcG9zaXppb25lIG9yaWdpbmFyaWEuLi4iCisKKyM6IGxpYi9ibGFtZS50Y2w6NjkyCittc2dpZCAiQW5ub3RhdGlvbiBjb21wbGV0ZS4iCittc2dzdHIgIkFubm90YXppb25lIGNvbXBsZXRhdGEuIgorCisjOiBsaWIvYmxhbWUudGNsOjc0NgorbXNnaWQgIkxvYWRpbmcgYW5ub3RhdGlvbi4uLiIKK21zZ3N0ciAiQ2FyaWNhbWVudG8gYW5ub3RhemlvbmkuLi4iCisKKyM6IGxpYi9ibGFtZS50Y2w6ODAyCittc2dpZCAiQXV0aG9yOiIKK21zZ3N0ciAiQXV0b3JlOiIKKworIzogbGliL2JsYW1lLnRjbDo4MDYKK21zZ2lkICJDb21taXR0ZXI6IgorbXNnc3RyICJSZXZpc2lvbmUgY3JlYXRhIGRhOiIKKworIzogbGliL2JsYW1lLnRjbDo4MTEKK21zZ2lkICJPcmlnaW5hbCBGaWxlOiIKK21zZ3N0ciAiRmlsZSBvcmlnaW5hcmlvOiIKKworIzogbGliL2JsYW1lLnRjbDo5MjUKK21zZ2lkICJPcmlnaW5hbGx5IEJ5OiIKK21zZ3N0ciAiSW4gb3JpZ2luZSBkYToiCisKKyM6IGxpYi9ibGFtZS50Y2w6OTMxCittc2dpZCAiSW4gRmlsZToiCittc2dzdHIgIk5lbCBmaWxlOiIKKworIzogbGliL2JsYW1lLnRjbDo5MzYKK21zZ2lkICJDb3BpZWQgT3IgTW92ZWQgSGVyZSBCeToiCittc2dzdHIgIkNvcGlhdG8gbyBzcG9zdGF0byBxdWkgZGE6IgorCisjOiBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDoxNCBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDoxOQorbXNnaWQgIkNoZWNrb3V0IEJyYW5jaCIKK21zZ3N0ciAiQXR0aXZhIHJhbW8iCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjIzCittc2dpZCAiQ2hlY2tvdXQiCittc2dzdHIgIkF0dGl2YSIKKworIzogbGliL2JyYW5jaF9jaGVja291dC50Y2w6MjcgbGliL2JyYW5jaF9jcmVhdGUudGNsOjM1CisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MzIgbGliL2JyYW5jaF9yZW5hbWUudGNsOjMwIGxpYi9icm93c2VyLnRjbDoyODIKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NTIyIGxpYi9jaG9vc2VfZm9udC50Y2w6NDMgbGliL21lcmdlLnRjbDoxNzEKKyM6IGxpYi9vcHRpb24udGNsOjEwMyBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjQyIGxpYi90cmFuc3BvcnQudGNsOjk3Cittc2dpZCAiQ2FuY2VsIgorbXNnc3RyICJBbm51bGxhIgorCisjOiBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDozMiBsaWIvYnJvd3Nlci50Y2w6Mjg3Cittc2dpZCAiUmV2aXNpb24iCittc2dzdHIgIlJldmlzaW9uZSIKKworIzogbGliL2JyYW5jaF9jaGVja291dC50Y2w6MzYgbGliL2JyYW5jaF9jcmVhdGUudGNsOjY5IGxpYi9vcHRpb24udGNsOjI0MgorbXNnaWQgIk9wdGlvbnMiCittc2dzdHIgIk9wemlvbmkiCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjM5IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo5MgorbXNnaWQgIkZldGNoIFRyYWNraW5nIEJyYW5jaCIKK21zZ3N0ciAiUmVjdXBlcmEgZHVwbGljYXRvIGxvY2FsZSBkaSByYW1vIHJlbW90byIKKworIzogbGliL2JyYW5jaF9jaGVja291dC50Y2w6NDQKK21zZ2lkICJEZXRhY2ggRnJvbSBMb2NhbCBCcmFuY2giCittc2dzdHIgIlN0YWNjYSBkYSByYW1vIGxvY2FsZSIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjIyCittc2dpZCAiQ3JlYXRlIEJyYW5jaCIKK21zZ3N0ciAiQ3JlYSByYW1vIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MjcKK21zZ2lkICJDcmVhdGUgTmV3IEJyYW5jaCIKK21zZ3N0ciAiQ3JlYSBudW92byByYW1vIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MzEgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozNzEKK21zZ2lkICJDcmVhdGUiCittc2dzdHIgIkNyZWEiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo0MAorbXNnaWQgIkJyYW5jaCBOYW1lIgorbXNnc3RyICJOb21lIGRlbCByYW1vIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NDMKK21zZ2lkICJOYW1lOiIKK21zZ3N0ciAiTm9tZToiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo1OAorbXNnaWQgIk1hdGNoIFRyYWNraW5nIEJyYW5jaCBOYW1lIgorbXNnc3RyICJBcHBhaWEgbm9tZSBkZWwgZHVwbGljYXRvIGxvY2FsZSBkaSByYW1vIHJlbW90byIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjY2Cittc2dpZCAiU3RhcnRpbmcgUmV2aXNpb24iCittc2dzdHIgIlJldmlzaW9uZSBpbml6aWFsZSIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjcyCittc2dpZCAiVXBkYXRlIEV4aXN0aW5nIEJyYW5jaDoiCittc2dzdHIgIkFnZ2lvcm5hIHJhbW8gZXNpc3RlbnRlOiIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjc1Cittc2dpZCAiTm8iCittc2dzdHIgIk5vIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6ODAKK21zZ2lkICJGYXN0IEZvcndhcmQgT25seSIKK21zZ3N0ciAiU29sbyBmYXN0IGZvcndhcmQiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo4NSBsaWIvY2hlY2tvdXRfb3AudGNsOjUxNAorbXNnaWQgIlJlc2V0IgorbXNnc3RyICJSaXByaXN0aW5hIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6OTcKK21zZ2lkICJDaGVja291dCBBZnRlciBDcmVhdGlvbiIKK21zZ3N0ciAiQXR0aXZhIGRvcG8gbGEgY3JlYXppb25lIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MTMxCittc2dpZCAiUGxlYXNlIHNlbGVjdCBhIHRyYWNraW5nIGJyYW5jaC4iCittc2dzdHIgIlNjZWdsaWVyZSB1biBkdXBsaWNhdG8gbG9jYWxlIGRpIHJhbW8gcmVtb3RvIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MTQwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVHJhY2tpbmcgYnJhbmNoICVzIGlzIG5vdCBhIGJyYW5jaCBpbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnkuIgorbXNnc3RyICIiCisiSWwgZHVwbGljYXRvIGxvY2FsZSBkZWwgcmFtbyByZW1vdG8gJXMgbm9uIMOoIHVuIHJhbW8gbmVsbCdhcmNoaXZpbyByZW1vdG8uIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MTUzIGxpYi9icmFuY2hfcmVuYW1lLnRjbDo4NgorbXNnaWQgIlBsZWFzZSBzdXBwbHkgYSBicmFuY2ggbmFtZS4iCittc2dzdHIgIkluc2VyaXJlIHVuIG5vbWUgcGVyIGlsIHJhbW8uIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MTY0IGxpYi9icmFuY2hfcmVuYW1lLnRjbDoxMDYKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICInJXMnIGlzIG5vdCBhbiBhY2NlcHRhYmxlIGJyYW5jaCBuYW1lLiIKK21zZ3N0ciAiJyVzJyBub24gw6ggdXRpbGl6emFiaWxlIGNvbWUgbm9tZSBkaSByYW1vLiIKKworIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjE1Cittc2dpZCAiRGVsZXRlIEJyYW5jaCIKK21zZ3N0ciAiRWxpbWluYSByYW1vIgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MjAKK21zZ2lkICJEZWxldGUgTG9jYWwgQnJhbmNoIgorbXNnc3RyICJFbGltaW5hIHJhbW8gbG9jYWxlIgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MzcKK21zZ2lkICJMb2NhbCBCcmFuY2hlcyIKK21zZ3N0ciAiUmFtaSBsb2NhbGkiCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDo1MgorbXNnaWQgIkRlbGV0ZSBPbmx5IElmIE1lcmdlZCBJbnRvIgorbXNnc3RyICJDYW5jZWxsYSBzb2xvIHNlIGZ1c28gY29uIHVuIGFsdHJvIHJhbW8iCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDo1NAorbXNnaWQgIkFsd2F5cyAoRG8gbm90IHBlcmZvcm0gbWVyZ2UgdGVzdC4pIgorbXNnc3RyICJTZW1wcmUgKE5vbiBlZmZldHR1YXJlIHZlcmlmaWNoZSBkaSBmdXNpb25lKS4iCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDoxMDMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJUaGUgZm9sbG93aW5nIGJyYW5jaGVzIGFyZSBub3QgY29tcGxldGVseSBtZXJnZWQgaW50byAlczoiCittc2dzdHIgIkkgcmFtaSBzZWd1ZW50aSBub24gc29ubyBzdGF0aSBmdXNpIGNvbXBsZXRhbWVudGUgaW4gJXM6IgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MTE1Cittc2dpZCAiIgorIlJlY292ZXJpbmcgZGVsZXRlZCBicmFuY2hlcyBpcyBkaWZmaWN1bHQuIFxuIgorIlxuIgorIiBEZWxldGUgdGhlIHNlbGVjdGVkIGJyYW5jaGVzPyIKK21zZ3N0ciAiIgorIlJpY29tcG9ycmUgcmFtaSBjYW5jZWxsYXRpIHB1w7IgZXNzZXJlIGNvbXBsaWNhdG8uIFxuIgorIlxuIgorIiBFbGltaW5hcmUgaSByYW1pIHNlbGV6aW9uYXRpPyIKKworIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjE0MQorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZGVsZXRlIGJyYW5jaGVzOlxuIgorIiVzIgorbXNnc3RyICIiCisiSW1wb3NzaWJpbGUgY2FuY2VsbGFyZSBpIHJhbWk6XG4iCisiJXMiCisKKyM6IGxpYi9icmFuY2hfcmVuYW1lLnRjbDoxNCBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MjIKK21zZ2lkICJSZW5hbWUgQnJhbmNoIgorbXNnc3RyICJSaW5vbWluYSByYW1vIgorCisjOiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MjYKK21zZ2lkICJSZW5hbWUiCittc2dzdHIgIlJpbm9taW5hIgorCisjOiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MzYKK21zZ2lkICJCcmFuY2g6IgorbXNnc3RyICJSYW1vOiIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjM5Cittc2dpZCAiTmV3IE5hbWU6IgorbXNnc3RyICJOdW92byBOb21lOiIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjc1Cittc2dpZCAiUGxlYXNlIHNlbGVjdCBhIGJyYW5jaCB0byByZW5hbWUuIgorbXNnc3RyICJTY2VnbGllcmUgdW4gcmFtbyBkYSByaW5vbWluYXJlLiIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjk2IGxpYi9jaGVja291dF9vcC50Y2w6MTc5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQnJhbmNoICclcycgYWxyZWFkeSBleGlzdHMuIgorbXNnc3RyICJJbCByYW1vICclcycgZXNpc3RlIGdpw6AuIgorCisjOiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MTE3CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHJlbmFtZSAnJXMnLiIKK21zZ3N0ciAiSW1wb3NzaWJpbGUgcmlub21pbmFyZSAnJXMnLiIKKworIzogbGliL2Jyb3dzZXIudGNsOjE3Cittc2dpZCAiU3RhcnRpbmcuLi4iCittc2dzdHIgIkF2dmlvIGluIGNvcnNvLi4uIgorCisjOiBsaWIvYnJvd3Nlci50Y2w6MjYKK21zZ2lkICJGaWxlIEJyb3dzZXIiCittc2dzdHIgIkZpbGUgYnJvd3NlciIKKworIzogbGliL2Jyb3dzZXIudGNsOjEyNiBsaWIvYnJvd3Nlci50Y2w6MTQzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiTG9hZGluZyAlcy4uLiIKK21zZ3N0ciAiQ2FyaWNhbWVudG8gJXMuLi4iCisKKyM6IGxpYi9icm93c2VyLnRjbDoxODcKK21zZ2lkICJbVXAgVG8gUGFyZW50XSIKK21zZ3N0ciAiW0RpcmVjdG9yeSBzdXBlcmlvcmVdIgorCisjOiBsaWIvYnJvd3Nlci50Y2w6MjY3IGxpYi9icm93c2VyLnRjbDoyNzMKK21zZ2lkICJCcm93c2UgQnJhbmNoIEZpbGVzIgorbXNnc3RyICJFc3Bsb3JhIGkgZmlsZSBkZWwgcmFtbyIKKworIzogbGliL2Jyb3dzZXIudGNsOjI3OCBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjM4NworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NzQgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0ODQKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTg3Cittc2dpZCAiQnJvd3NlIgorbXNnc3RyICJFc3Bsb3JhIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjc5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRmV0Y2hpbmcgJXMgZnJvbSAlcyIKK21zZ3N0ciAiUmVjdXBlcm8gJXMgZGEgJXMiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MTI3CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiZmF0YWw6IENhbm5vdCByZXNvbHZlICVzIgorbXNnc3RyICJlcnJvcmUgZ3JhdmU6IGltcG9zc2liaWxlIHJpc29sdmVyZSAlcyIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoxNDAgbGliL2NvbnNvbGUudGNsOjgxIGxpYi9kYXRhYmFzZS50Y2w6MzEKK21zZ2lkICJDbG9zZSIKK21zZ3N0ciAiQ2hpdWRpIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjE2OQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkJyYW5jaCAnJXMnIGRvZXMgbm90IGV4aXN0LiIKK21zZ3N0ciAiSWwgcmFtbyAnJXMnIG5vbiBlc2lzdGUuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjIwNgorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJCcmFuY2ggJyVzJyBhbHJlYWR5IGV4aXN0cy5cbiIKKyJcbiIKKyJJdCBjYW5ub3QgZmFzdC1mb3J3YXJkIHRvICVzLlxuIgorIkEgbWVyZ2UgaXMgcmVxdWlyZWQuIgorbXNnc3RyICIiCisiSWwgcmFtbyAnJXMnIGVzaXN0ZSBnacOgLlxuIgorIlxuIgorIk5vbiBwdcOyIGVmZmV0dHVhcmUgdW4gJ2Zhc3QtZm9yd2FyZCcgYSAlcy5cbiIKKyJFJyBuZWNlc3NhcmlhIHVuYSBmdXNpb25lLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoyMjAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJNZXJnZSBzdHJhdGVneSAnJXMnIG5vdCBzdXBwb3J0ZWQuIgorbXNnc3RyICJMYSBzdHJhdGVnaWEgZGkgZnVzaW9uZSAnJXMnIG5vbiDDqCBzdXBwb3J0YXRhLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoyMzkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gdXBkYXRlICclcycuIgorbXNnc3RyICJJbXBvc3NpYmlsZSBhZ2dpb3JuYXJlICclcycuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjI1MQorbXNnaWQgIlN0YWdpbmcgYXJlYSAoaW5kZXgpIGlzIGFscmVhZHkgbG9ja2VkLiIKK21zZ3N0ciAiIgorIkwnYXJlYSBkaSBwcmVwYXJhemlvbmUgcGVyIHVuYSBudW92YSByZXZpc2lvbmUgKGluZGljZSkgw6ggZ2nDoCBibG9jY2F0YS4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MjY2Cittc2dpZCAiIgorIkxhc3Qgc2Nhbm5lZCBzdGF0ZSBkb2VzIG5vdCBtYXRjaCByZXBvc2l0b3J5IHN0YXRlLlxuIgorIlxuIgorIkFub3RoZXIgR2l0IHByb2dyYW0gaGFzIG1vZGlmaWVkIHRoaXMgcmVwb3NpdG9yeSBzaW5jZSB0aGUgbGFzdCBzY2FuLiAgQSAiCisicmVzY2FuIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSB0aGUgY3VycmVudCBicmFuY2ggY2FuIGJlIGNoYW5nZWQuXG4iCisiXG4iCisiVGhlIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBub3cuXG4iCittc2dzdHIgIiIKKyJMJ3VsdGltbyBzdGF0byBhbmFsaXp6YXRvIG5vbiBjb3JyaXNwb25kZSBhbGxvIHN0YXRvIGRlbGwnYXJjaGl2aW8uXG4iCisiXG4iCisiVW4gYWx0cm8gcHJvZ3JhbW1hIEdpdCBoYSBtb2RpZmljYXRvIHF1ZXN0byBhcmNoaXZpbyBkYWxsJ3VsdGltYSBhbmFsaXNpLiAiCisiQmlzb2duYSBlZmZldHR1YXJlIHVuYSBudW92YSBhbmFsaXNpIHByaW1hIGRpIHBvdGVyIGNhbWJpYXJlIGlsIHJhbW8gIgorImF0dHVhbGUuXG4iCisiXG4iCisiTGEgbnVvdmEgYW5hbGlzaSBjb21pbmNlcsOgIG9yYS5cbiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDozMjIKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVcGRhdGluZyB3b3JraW5nIGRpcmVjdG9yeSB0byAnJXMnLi4uIgorbXNnc3RyICJBZ2dpb3JuYW1lbnRvIGRlbGxhIGRpcmVjdG9yeSBkaSBsYXZvcm8gYSAnJXMnIGluIGNvcnNvLi4uIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjMyMworbXNnaWQgImZpbGVzIGNoZWNrZWQgb3V0IgorbXNnc3RyICJmaWxlIHByZXNlbnRpIG5lbGxhIGRpcmVjdG9yeSBkaSBsYXZvcm8iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MzUzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQWJvcnRlZCBjaGVja291dCBvZiAnJXMnIChmaWxlIGxldmVsIG1lcmdpbmcgaXMgcmVxdWlyZWQpLiIKK21zZ3N0ciAiQXR0aXZhemlvbmUgZGkgJyVzJyBmYWxsaXRhIChyaWNoaWVzdGEgdW5hIGZ1c2lvbmUgYSBsaXZlbGxvIGZpbGUpLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDozNTQKK21zZ2lkICJGaWxlIGxldmVsIG1lcmdlIHJlcXVpcmVkLiIKK21zZ3N0ciAiRScgcmljaGllc3RhIHVuYSBmdXNpb25lIGEgbGl2ZWxsbyBmaWxlLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDozNTgKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJTdGF5aW5nIG9uIGJyYW5jaCAnJXMnLiIKK21zZ3N0ciAiU2kgcmltYXJyw6Agc3VsIHJhbW8gJyVzJy4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NDI5Cittc2dpZCAiIgorIllvdSBhcmUgbm8gbG9uZ2VyIG9uIGEgbG9jYWwgYnJhbmNoLlxuIgorIlxuIgorIklmIHlvdSB3YW50ZWQgdG8gYmUgb24gYSBicmFuY2gsIGNyZWF0ZSBvbmUgbm93IHN0YXJ0aW5nIGZyb20gJ1RoaXMgRGV0YWNoZWQgIgorIkNoZWNrb3V0Jy4iCittc2dzdHIgIiIKKyJOb24gc2kgw6ggcGnDuSBzdSB1biByYW1vIGxvY2FsZVxuIgorIlxuIgorIlNlIHNpIHZ1b2xlIHJpbWFuZXJlIHN1IHVuIHJhbW8sIGNyZWFybmUgdW5vIG9yYSBhIHBhcnRpcmUgZGEgJ1F1ZXN0YSAiCisicmV2aXNpb25lIGF0dGl2YSBzdGFjY2F0YScuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjQ0NiBsaWIvY2hlY2tvdXRfb3AudGNsOjQ1MAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkNoZWNrZWQgb3V0ICclcycuIgorbXNnc3RyICJBdHRpdmF6aW9uZSBkaSAnJXMnIGNvbXBsZXRhdGEuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjQ3OAorIywgdGNsLWZvcm1hdAorbXNnaWQgIlJlc2V0dGluZyAnJXMnIHRvICclcycgd2lsbCBsb3NlIHRoZSBmb2xsb3dpbmcgY29tbWl0czoiCittc2dzdHIgIiIKKyJSaXByaXN0aW5hcmUgJyVzJyBhICclcycgY29tcG9ydGVyw6AgbGEgcGVyZGl0YSBkZWxsZSBzZWd1ZW50aSByZXZpc2lvbmk6IgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjUwMAorbXNnaWQgIlJlY292ZXJpbmcgbG9zdCBjb21taXRzIG1heSBub3QgYmUgZWFzeS4iCittc2dzdHIgIlJpY29tcG9ycmUgbGUgcmV2aXNpb25pIHBlcmR1dGUgcG90cmViYmUgbm9uIGVzc2VyZSBzZW1wbGljZS4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NTA1CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUmVzZXQgJyVzJz8iCittc2dzdHIgIlJpcHJpc3RpbmFyZSAnJXMnPyIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDo1MTAgbGliL21lcmdlLnRjbDoxNjMKK21zZ2lkICJWaXN1YWxpemUiCittc2dzdHIgIlZpc3VhbGl6emEiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NTc4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBzZXQgY3VycmVudCBicmFuY2guXG4iCisiXG4iCisiVGhpcyB3b3JraW5nIGRpcmVjdG9yeSBpcyBvbmx5IHBhcnRpYWxseSBzd2l0Y2hlZC4gIFdlIHN1Y2Nlc3NmdWxseSB1cGRhdGVkICIKKyJ5b3VyIGZpbGVzLCBidXQgZmFpbGVkIHRvIHVwZGF0ZSBhbiBpbnRlcm5hbCBHaXQgZmlsZS5cbiIKKyJcbiIKKyJUaGlzIHNob3VsZCBub3QgaGF2ZSBvY2N1cnJlZC4gICVzIHdpbGwgbm93IGNsb3NlIGFuZCBnaXZlIHVwLiIKK21zZ3N0ciAiIgorIkltcG9zc2liaWxlIHByZXBhcmFyZSBpbCByYW1vIGF0dHVhbGUuXG4iCisiXG4iCisiUXVlc3RhIGRpcmVjdG9yeSBkaSBsYXZvcm8gw6ggc3RhdGEgY29udmVydGl0YSBzb2xvIHBhcnppYWxtZW50ZS4gSSBmaWxlIHNvbm8gIgorInN0YXRpIGFnZ2lvcm5hdGkgY29ycmV0dGFtZW50ZSwgbWEgbCdhZ2dpb3JuYW1lbnRvIGRpIHVuIGZpbGUgZGkgR2l0IGhhICIKKyJwcm9kb3R0byBkZWdsaSBlcnJvcmkuXG4iCisiXG4iCisiUXVlc3RvIG5vbiBzYXJlYmJlIGRvdnV0byBzdWNjZWRlcmUuICAlcyBvcmEgdGVybWluZXLDoCBzZW56YSBhbHRyZSBhemlvbmkuIgorCisjOiBsaWIvY2hvb3NlX2ZvbnQudGNsOjM5Cittc2dpZCAiU2VsZWN0IgorbXNnc3RyICJTZWxlemlvbmEiCisKKyM6IGxpYi9jaG9vc2VfZm9udC50Y2w6NTMKK21zZ2lkICJGb250IEZhbWlseSIKK21zZ3N0ciAiRmFtaWdsaWEgZGkgY2FyYXR0ZXJpIgorCisjOiBsaWIvY2hvb3NlX2ZvbnQudGNsOjc0Cittc2dpZCAiRm9udCBTaXplIgorbXNnc3RyICJEaW1lbnNpb25lIGNhcmF0dGVyaSIKKworIzogbGliL2Nob29zZV9mb250LnRjbDo5MQorbXNnaWQgIkZvbnQgRXhhbXBsZSIKK21zZ3N0ciAiRXNlbXBpbyBjYXJhdHRlcmkiCisKKyM6IGxpYi9jaG9vc2VfZm9udC50Y2w6MTAzCittc2dpZCAiIgorIlRoaXMgaXMgZXhhbXBsZSB0ZXh0LlxuIgorIklmIHlvdSBsaWtlIHRoaXMgdGV4dCwgaXQgY2FuIGJlIHlvdXIgZm9udC4iCittc2dzdHIgIiIKKyJRdWVzdG8gw6ggdW4gdGVzdG8gZCdlc2VtcGlvLlxuIgorIlNlIHRpIHBpYWNlIHF1ZXN0byB0ZXN0bywgc2NlZ2xpIHF1ZXN0byBjYXJhdHRlcmUuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjI4Cittc2dpZCAiR2l0IEd1aSIKK21zZ3N0ciAiR2l0IEd1aSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo4MSBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjM3NgorbXNnaWQgIkNyZWF0ZSBOZXcgUmVwb3NpdG9yeSIKK21zZ3N0ciAiQ3JlYSBudW92byBhcmNoaXZpbyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo4NworbXNnaWQgIk5ldy4uLiIKK21zZ3N0ciAiTnVvdm8uLi4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTQgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NjAKK21zZ2lkICJDbG9uZSBFeGlzdGluZyBSZXBvc2l0b3J5IgorbXNnc3RyICJDbG9uYSBhcmNoaXZpbyBlc2lzdGVudGUiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTAwCittc2dpZCAiQ2xvbmUuLi4iCittc2dzdHIgIkNsb25hLi4uIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEwNyBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjk3NgorbXNnaWQgIk9wZW4gRXhpc3RpbmcgUmVwb3NpdG9yeSIKK21zZ3N0ciAiQXByaSBhcmNoaXZpbyBlc2lzdGVudGUiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTEzCittc2dpZCAiT3Blbi4uLiIKK21zZ3N0ciAiQXByaS4uLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMjYKK21zZ2lkICJSZWNlbnQgUmVwb3NpdG9yaWVzIgorbXNnc3RyICJBcmNoaXZpIHJlY2VudGkiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTMyCittc2dpZCAiT3BlbiBSZWNlbnQgUmVwb3NpdG9yeToiCittc2dzdHIgIkFwcmkgYXJjaGl2aW8gcmVjZW50ZToiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6Mjk2IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MzAzCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjMxMAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjcmVhdGUgcmVwb3NpdG9yeSAlczoiCittc2dzdHIgIkltcG9zc2liaWxlIGNyZWFyZSBsJ2FyY2hpdmlvICVzOiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozODEgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NzgKK21zZ2lkICJEaXJlY3Rvcnk6IgorbXNnc3RyICJEaXJlY3Rvcnk6IgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQxMiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjUzNworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMDExCittc2dpZCAiR2l0IFJlcG9zaXRvcnkiCittc2dzdHIgIkFyY2hpdmlvIEdpdCIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0MzcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJEaXJlY3RvcnkgJXMgYWxyZWFkeSBleGlzdHMuIgorbXNnc3RyICJMYSBkaXJlY3RvcnkgJXMgZXNpc3RlIGdpw6AuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ0MQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkZpbGUgJXMgYWxyZWFkeSBleGlzdHMuIgorbXNnc3RyICJJbCBmaWxlICVzIGVzaXN0ZSBnacOgLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NTUKK21zZ2lkICJDbG9uZSIKK21zZ3N0ciAiQ2xvbmEiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDY4Cittc2dpZCAiVVJMOiIKK21zZ3N0ciAiVVJMOiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0ODkKK21zZ2lkICJDbG9uZSBUeXBlOiIKK21zZ3N0ciAiVGlwbyBkaSBjbG9uZToiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDk1Cittc2dpZCAiU3RhbmRhcmQgKEZhc3QsIFNlbWktUmVkdW5kYW50LCBIYXJkbGlua3MpIgorbXNnc3RyICJTdGFuZGFyZCAodmVsb2NlLCBzZW1pLXJpZG9uZGFudGUsIGNvbiBoYXJkbGluaykiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTAxCittc2dpZCAiRnVsbCBDb3B5IChTbG93ZXIsIFJlZHVuZGFudCBCYWNrdXApIgorbXNnc3RyICJDb3BpYSBjb21wbGV0YSAocGnDuSBsZW50bywgYmFja3VwIHJpZG9uZGFudGUpIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjUwNworbXNnaWQgIlNoYXJlZCAoRmFzdGVzdCwgTm90IFJlY29tbWVuZGVkLCBObyBCYWNrdXApIgorbXNnc3RyICJTaGFyZWQgKGlsIHBpw7kgdmVsb2NlLCBub24gcmFjY29tYW5kYXRvLCBuZXNzdW4gYmFja3VwKSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1NDMgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1OTAKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzM2IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODA2CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEwMTcgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMDI1CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiTm90IGEgR2l0IHJlcG9zaXRvcnk6ICVzIgorbXNnc3RyICIlcyBub24gw6ggdW4gYXJjaGl2aW8gR2l0LiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1NzkKK21zZ2lkICJTdGFuZGFyZCBvbmx5IGF2YWlsYWJsZSBmb3IgbG9jYWwgcmVwb3NpdG9yeS4iCittc2dzdHIgIlN0YW5kYXJkIMOoIGRpc3BvbmliaWxlIHNvbG8gcGVyIGFyY2hpdmkgbG9jYWxpLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1ODMKK21zZ2lkICJTaGFyZWQgb25seSBhdmFpbGFibGUgZm9yIGxvY2FsIHJlcG9zaXRvcnkuIgorbXNnc3RyICJTaGFyZWQgw6ggZGlzcG9uaWJpbGUgc29sbyBwZXIgYXJjaGl2aSBsb2NhbGkuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjYwNAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkxvY2F0aW9uICVzIGFscmVhZHkgZXhpc3RzLiIKK21zZ3N0ciAiSWwgZmlsZS9kaXJlY3RvcnkgJXMgZXNpc3RlIGdpw6AuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjYxNQorbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgb3JpZ2luIgorbXNnc3RyICJJbXBvc3NpYmlsZSBjb25maWd1cmFyZSBvcmlnaW4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NjI3Cittc2dpZCAiQ291bnRpbmcgb2JqZWN0cyIKK21zZ3N0ciAiQ2FsY29sbyBvZ2dldHRpIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjYyOAorbXNnaWQgImJ1Y2tldHMiCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo2NTIKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gY29weSBvYmplY3RzL2luZm8vYWx0ZXJuYXRlczogJXMiCittc2dzdHIgIkltcG9zc2liaWxlIGNvcGlhcmUgb2dnZXR0aS9pbmZvL2FsdGVybmF0ZTogJXMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6Njg4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiTm90aGluZyB0byBjbG9uZSBmcm9tICVzLiIKK21zZ3N0ciAiTmllbnRlIGRhIGNsb25hcmUgZGEgJXMuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjY5MCBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjkwNAorIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5MTYKK21zZ2lkICJUaGUgJ21hc3RlcicgYnJhbmNoIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4iCittc2dzdHIgIklsIHJhbW8gJ21hc3Rlcicgbm9uIMOoIHN0YXRvIGluaXppYWxpenphdG8uIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjcwMworbXNnaWQgIkhhcmRsaW5rcyBhcmUgdW5hdmFpbGFibGUuICBGYWxsaW5nIGJhY2sgdG8gY29weWluZy4iCittc2dzdHIgIkltcG9zc2liaWxlIHV0aWxpenphcmUgZ2xpIGhhcmRsaW5rLiBTaSByaWNvcnJlcsOgIGFsbGEgY29waWEuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjcxNQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkNsb25pbmcgZnJvbSAlcyIKK21zZ3N0ciAiQ2xvbmF6aW9uZSBkYSAlcyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3NDYKK21zZ2lkICJDb3B5aW5nIG9iamVjdHMiCittc2dzdHIgIkNvcGlhIGRlZ2xpIG9nZ2V0dGkiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzQ3Cittc2dpZCAiS2lCIgorbXNnc3RyICJLaUIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzcxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGNvcHkgb2JqZWN0OiAlcyIKK21zZ3N0ciAiSW1wb3NzaWJpbGUgY29waWFyZSBvZ2dldHRvOiAlcyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3ODEKK21zZ2lkICJMaW5raW5nIG9iamVjdHMiCittc2dzdHIgIkNvbGxlZ2FtZW50byBvZ2dldHRpIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjc4MgorbXNnaWQgIm9iamVjdHMiCittc2dzdHIgIm9nZ2V0dGkiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzkwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGhhcmRsaW5rIG9iamVjdDogJXMiCittc2dzdHIgIkhhcmRsaW5rIGltcG9zc2liaWxlIHN1bGwnb2dnZXR0bzogJXMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODQ1Cittc2dpZCAiQ2Fubm90IGZldGNoIGJyYW5jaGVzIGFuZCBvYmplY3RzLiAgU2VlIGNvbnNvbGUgb3V0cHV0IGZvciBkZXRhaWxzLiIKK21zZ3N0ciAiIgorIkltcG9zc2liaWxlIHJlY3VwZXJhcmUgcmFtaSBlIG9nZ2V0dGkuIENvbnRyb2xsYXJlIGkgZGV0dGFnbGkgZm9ybml0aSBkYWxsYSAiCisiY29uc29sZS4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODU2Cittc2dpZCAiQ2Fubm90IGZldGNoIHRhZ3MuICBTZWUgY29uc29sZSBvdXRwdXQgZm9yIGRldGFpbHMuIgorbXNnc3RyICIiCisiSW1wb3NzaWJpbGUgcmVjdXBlcmFyZSBsZSBldGljaGV0dGUuIENvbnRyb2xsYXJlIGkgZGV0dGFnbGkgZm9ybml0aSBkYWxsYSAiCisiY29uc29sZS4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODgwCittc2dpZCAiQ2Fubm90IGRldGVybWluZSBIRUFELiAgU2VlIGNvbnNvbGUgb3V0cHV0IGZvciBkZXRhaWxzLiIKK21zZ3N0ciAiIgorIkltcG9zc2liaWxlIGRldGVybWluYXJlIEhFQUQuIENvbnRyb2xsYXJlIGkgZGV0dGFnbGkgZm9ybml0aSBkYWxsYSBjb25zb2xlLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo4ODkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gY2xlYW51cCAlcyIKK21zZ3N0ciAiSW1wb3NzaWJpbGUgcmlwdWxpcmUgJXMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODk1Cittc2dpZCAiQ2xvbmUgZmFpbGVkLiIKK21zZ3N0ciAiQ2xvbmF6aW9uZSBub24gcml1c2NpdGEuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjkwMgorbXNnaWQgIk5vIGRlZmF1bHQgYnJhbmNoIG9idGFpbmVkLiIKK21zZ3N0ciAiTm9uIMOoIHN0YXRvIHRyb3ZhdG8gdW4gcmFtbyBwcmVkZWZpbml0by4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTEzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQ2Fubm90IHJlc29sdmUgJXMgYXMgYSBjb21taXQuIgorbXNnc3RyICJJbXBvc3NpYmlsZSByaXNvbHZlcmUgJXMgY29tZSB1bmEgcmV2aXNpb25lLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5MjUKK21zZ2lkICJDcmVhdGluZyB3b3JraW5nIGRpcmVjdG9yeSIKK21zZ3N0ciAiQ3JlYXppb25lIGRpcmVjdG9yeSBkaSBsYXZvcm8iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTI2IGxpYi9pbmRleC50Y2w6NjUgbGliL2luZGV4LnRjbDoxMjcKKyM6IGxpYi9pbmRleC50Y2w6MTkzCittc2dpZCAiZmlsZXMiCittc2dzdHIgImZpbGUiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTU1Cittc2dpZCAiSW5pdGlhbCBmaWxlIGNoZWNrb3V0IGZhaWxlZC4iCittc2dzdHIgIkF0dGl2YXppb25lIGluaXppYWxlIG5vbiByaXVzY2l0YS4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTcxCittc2dpZCAiT3BlbiIKK21zZ3N0ciAiQXByaSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5ODEKK21zZ2lkICJSZXBvc2l0b3J5OiIKK21zZ3N0ciAiQXJjaGl2aW86IgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEwMzEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gb3BlbiByZXBvc2l0b3J5ICVzOiIKK21zZ3N0ciAiSW1wb3NzaWJpbGUgYWNjZWRlcmUgYWxsJ2FyY2hpdmlvICVzOiIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjUzCittc2dpZCAiVGhpcyBEZXRhY2hlZCBDaGVja291dCIKK21zZ3N0ciAiUXVlc3RhIHJldmlzaW9uZSBhdHRpdmEgc3RhY2NhdGEiCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDo2MAorbXNnaWQgIlJldmlzaW9uIEV4cHJlc3Npb246IgorbXNnc3RyICJFc3ByZXNzaW9uZSBkaSByZXZpc2lvbmU6IgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6NzQKK21zZ2lkICJMb2NhbCBCcmFuY2giCittc2dzdHIgIlJhbW8gbG9jYWxlIgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6NzkKK21zZ2lkICJUcmFja2luZyBCcmFuY2giCittc2dzdHIgIkR1cGxpY2F0byBsb2NhbGUgZGkgcmFtbyByZW1vdG8iCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDo4NCBsaWIvY2hvb3NlX3Jldi50Y2w6NTM4Cittc2dpZCAiVGFnIgorbXNnc3RyICJFdGljaGV0dGEiCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDozMTcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIHJldmlzaW9uOiAlcyIKK21zZ3N0ciAiUmV2aXNpb25lIG5vbiB2YWxpZGE6ICVzIgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6MzM4Cittc2dpZCAiTm8gcmV2aXNpb24gc2VsZWN0ZWQuIgorbXNnc3RyICJOZXNzdW5hIHJldmlzaW9uZSBzZWxlemlvbmF0YS4iCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDozNDYKK21zZ2lkICJSZXZpc2lvbiBleHByZXNzaW9uIGlzIGVtcHR5LiIKK21zZ3N0ciAiTCdlc3ByZXNzaW9uZSBkaSByZXZpc2lvbmUgw6ggdnVvdGEuIgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6NTMxCittc2dpZCAiVXBkYXRlZCIKK21zZ3N0ciAiQWdnaW9ybmF0byIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjU1OQorbXNnaWQgIlVSTCIKK21zZ3N0ciAiVVJMIgorCisjOiBsaWIvY29tbWl0LnRjbDo5Cittc2dpZCAiIgorIlRoZXJlIGlzIG5vdGhpbmcgdG8gYW1lbmQuXG4iCisiXG4iCisiWW91IGFyZSBhYm91dCB0byBjcmVhdGUgdGhlIGluaXRpYWwgY29tbWl0LiAgVGhlcmUgaXMgbm8gY29tbWl0IGJlZm9yZSB0aGlzICIKKyJ0byBhbWVuZC5cbiIKK21zZ3N0ciAiIgorIk5vbiBjJ8OoIG5pZW50ZSBkYSBjb3JyZWdnZXJlLlxuIgorIlxuIgorIlN0YWkgcGVyIGNyZWFyZSBsYSByZXZpc2lvbmUgaW5pemlhbGUuIE5vbiBlc2lzdGUgdW5hIHJldmlzaW9uZSBwcmVjZWRlbnRlICIKKyJkYSBjb3JyZWdnZXJlLlxuIgorCisjOiBsaWIvY29tbWl0LnRjbDoxOAorbXNnaWQgIiIKKyJDYW5ub3QgYW1lbmQgd2hpbGUgbWVyZ2luZy5cbiIKKyJcbiIKKyJZb3UgYXJlIGN1cnJlbnRseSBpbiB0aGUgbWlkZGxlIG9mIGEgbWVyZ2UgdGhhdCBoYXMgbm90IGJlZW4gZnVsbHkgIgorImNvbXBsZXRlZC4gIFlvdSBjYW5ub3QgYW1lbmQgdGhlIHByaW9yIGNvbW1pdCB1bmxlc3MgeW91IGZpcnN0IGFib3J0IHRoZSAiCisiY3VycmVudCBtZXJnZSBhY3Rpdml0eS5cbiIKK21zZ3N0ciAiIgorIk5vbiDDqCBwb3NzaWJpbGUgZWZmZXR0dWFyZSB1bmEgY29ycmV6aW9uZSBkdXJhbnRlIHVuYSBmdXNpb25lLlxuIgorIlxuIgorIkluIHF1ZXN0byBtb21lbnRvIHNpIHN0YSBlZmZldHR1YW5kbyB1bmEgZnVzaW9uZSBjaGUgbm9uIMOoIHN0YXRhIGRlbCB0dXR0byAiCisiY29tcGxldGF0YS4gTm9uIHB1b2kgY29ycmVnZ2VyZSBsYSByZXZpc2lvbmUgcHJlY2VkZW50ZSBhIG1lbm8gY2hlIHByaW1hIHR1ICIKKyJub24gaW50ZXJyb21wYSBsJ29wZXJhemlvbmUgZGkgZnVzaW9uZSBpbiBjb3Jzby5cbiIKKworIzogbGliL2NvbW1pdC50Y2w6NDkKK21zZ2lkICJFcnJvciBsb2FkaW5nIGNvbW1pdCBkYXRhIGZvciBhbWVuZDoiCittc2dzdHIgIkVycm9yZSBkdXJhbnRlIGlsIGNhcmljYW1lbnRvIGRlaSBkYXRpIGRlbGxhIHJldmlzaW9uZSBkYSBjb3JyZWdnZXJlOiIKKworIzogbGliL2NvbW1pdC50Y2w6NzYKK21zZ2lkICJVbmFibGUgdG8gb2J0YWluIHlvdXIgaWRlbnRpdHk6IgorbXNnc3RyICJJbXBvc3NpYmlsZSBvdHRlbmVyZSBsYSB0dWEgaWRlbnRpdMOgOiIKKworIzogbGliL2NvbW1pdC50Y2w6ODEKK21zZ2lkICJJbnZhbGlkIEdJVF9DT01NSVRURVJfSURFTlQ6IgorbXNnc3RyICJHSVRfQ09NTUlUVEVSX0lERU5UIG5vbiB2YWxpZGE6IgorCisjOiBsaWIvY29tbWl0LnRjbDoxMzMKK21zZ2lkICIiCisiTGFzdCBzY2FubmVkIHN0YXRlIGRvZXMgbm90IG1hdGNoIHJlcG9zaXRvcnkgc3RhdGUuXG4iCisiXG4iCisiQW5vdGhlciBHaXQgcHJvZ3JhbSBoYXMgbW9kaWZpZWQgdGhpcyByZXBvc2l0b3J5IHNpbmNlIHRoZSBsYXN0IHNjYW4uICBBICIKKyJyZXNjYW4gbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIGFub3RoZXIgY29tbWl0IGNhbiBiZSBjcmVhdGVkLlxuIgorIlxuIgorIlRoZSByZXNjYW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgbm93LlxuIgorbXNnc3RyICIiCisiTCd1bHRpbW8gc3RhdG8gYW5hbGl6emF0byBub24gY29ycmlzcG9uZGUgYWxsbyBzdGF0byBkZWxsJ2FyY2hpdmlvLlxuIgorIlxuIgorIlVuIGFsdHJvIHByb2dyYW1tYSBHaXQgaGEgbW9kaWZpY2F0byBxdWVzdG8gYXJjaGl2aW8gZGFsbCd1bHRpbWEgYW5hbGlzaS4gIgorIkJpc29nbmEgZWZmZXR0dWFyZSB1bmEgbnVvdmEgYW5hbGlzaSBwcmltYSBkaSBwb3RlciBjcmVhcmUgdW5hIG51b3ZhICIKKyJyZXZpc2lvbmUuXG4iCisiXG4iCisiTGEgbnVvdmEgYW5hbGlzaSBjb21pbmNlcsOgIG9yYS5cbiIKKworIzogbGliL2NvbW1pdC50Y2w6MTU0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIlVubWVyZ2VkIGZpbGVzIGNhbm5vdCBiZSBjb21taXR0ZWQuXG4iCisiXG4iCisiRmlsZSAlcyBoYXMgbWVyZ2UgY29uZmxpY3RzLiAgWW91IG11c3QgcmVzb2x2ZSB0aGVtIGFuZCBzdGFnZSB0aGUgZmlsZSAiCisiYmVmb3JlIGNvbW1pdHRpbmcuXG4iCittc2dzdHIgIiIKKyJOb24gw6ggcG9zc2liaWxlIGNyZWFyZSB1bmEgcmV2aXNpb25lIGNvbiBmaWxlIG5vbiBzb3R0b3Bvc3RpIGEgZnVzaW9uZS5cbiIKKyJcbiIKKyJJbCBmaWxlICVzIHByZXNlbnRhIGRlaSBjb25mbGl0dGkuIERldmkgcmlzb2x2ZXJsaSBlIHByZXBhcmFyZSBpbCBmaWxlIHBlciAiCisiY3JlYXJlIHVuYSBudW92YSByZXZpc2lvbmUgcHJpbWEgZGkgZWZmZXR0dWFyZSBxdWVzdGEgYXppb25lLlxuIgorCisjOiBsaWIvY29tbWl0LnRjbDoxNjIKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiVW5rbm93biBmaWxlIHN0YXRlICVzIGRldGVjdGVkLlxuIgorIlxuIgorIkZpbGUgJXMgY2Fubm90IGJlIGNvbW1pdHRlZCBieSB0aGlzIHByb2dyYW0uXG4iCittc2dzdHIgIiIKKyJTdGF0byBkaSBmaWxlICVzIHNjb25vc2NpdXRvLlxuIgorIlxuIgorIlF1ZXN0byBwcm9ncmFtbWEgbm9uIHB1w7IgY3JlYXJlIHVuYSByZXZpc2lvbmUgY29udGVuZW50ZSBpbCBmaWxlICVzLlxuIgorCisjOiBsaWIvY29tbWl0LnRjbDoxNzAKK21zZ2lkICIiCisiTm8gY2hhbmdlcyB0byBjb21taXQuXG4iCisiXG4iCisiWW91IG11c3Qgc3RhZ2UgYXQgbGVhc3QgMSBmaWxlIGJlZm9yZSB5b3UgY2FuIGNvbW1pdC5cbiIKK21zZ3N0ciAiIgorIk5lc3N1bmEgbW9kaWZpY2EgcGVyIGxhIG51b3ZhIHJldmlzaW9uZS5cbiIKKyJcbiIKKyJEZXZpIHByZXBhcmFyZSBwZXIgdW5hIG51b3ZhIHJldmlzaW9uZSBhbG1lbm8gMSBmaWxlIHByaW1hIGRpIGVmZmV0dHVhcmUgIgorInF1ZXN0YSBvcGVyYXppb25lLlxuIgorCisjOiBsaWIvY29tbWl0LnRjbDoxODMKK21zZ2lkICIiCisiUGxlYXNlIHN1cHBseSBhIGNvbW1pdCBtZXNzYWdlLlxuIgorIlxuIgorIkEgZ29vZCBjb21taXQgbWVzc2FnZSBoYXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4iCisiXG4iCisiLSBGaXJzdCBsaW5lOiBEZXNjcmliZSBpbiBvbmUgc2VudGVuY2Ugd2hhdCB5b3UgZGlkLlxuIgorIi0gU2Vjb25kIGxpbmU6IEJsYW5rXG4iCisiLSBSZW1haW5pbmcgbGluZXM6IERlc2NyaWJlIHdoeSB0aGlzIGNoYW5nZSBpcyBnb29kLlxuIgorbXNnc3RyICIiCisiQmlzb2duYSBmb3JuaXJlIHVuIG1lc3NhZ2dpbyBkaSByZXZpc2lvbmUuXG4iCisiXG4iCisiVW4gYnVvbiBtZXNzYWdnaW8gZGkgcmV2aXNpb25lIGhhIGlsIHNlZ3VlbnRlIGZvcm1hdG86XG4iCisiXG4iCisiLSBQcmltYSBsaW5lYTogZGVzY3JpdmkgaW4gdW5hIGZyYXNlIGNpw7IgY2hlIGhhaSBmYXR0by5cbiIKKyItIFNlY29uZGEgbGluZWE6IHZ1b3RhLlxuIgorIi0gVGVyemEgbGluZWE6IHNwaWVnYSBhIGNvc2Egc2VydmUgbGEgdHVhIG1vZGlmaWNhLlxuIgorCisjOiBsaWIvY29tbWl0LnRjbDoyMDcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJ3YXJuaW5nOiBUY2wgZG9lcyBub3Qgc3VwcG9ydCBlbmNvZGluZyAnJXMnLiIKK21zZ3N0ciAiYXR0ZW56aW9uZTogVGNsIG5vbiBzdXBwb3J0YSBsYSBjb2RpZmljYSAnJXMnLiIKKworIzogbGliL2NvbW1pdC50Y2w6MjIxCittc2dpZCAiQ2FsbGluZyBwcmUtY29tbWl0IGhvb2suLi4iCittc2dzdHIgIkF2dmlvIHByZS1jb21taXQgaG9vay4uLiIKKworIzogbGliL2NvbW1pdC50Y2w6MjM2Cittc2dpZCAiQ29tbWl0IGRlY2xpbmVkIGJ5IHByZS1jb21taXQgaG9vay4iCittc2dzdHIgIlJldmlzaW9uZSByaWZpdXRhdGEgZGFsIHByZS1jb21taXQgaG9vay4iCisKKyM6IGxpYi9jb21taXQudGNsOjI1OQorbXNnaWQgIkNhbGxpbmcgY29tbWl0LW1zZyBob29rLi4uIgorbXNnc3RyICJBdnZpbyBjb21taXQtbXNnIGhvb2suLi4iCisKKyM6IGxpYi9jb21taXQudGNsOjI3NAorbXNnaWQgIkNvbW1pdCBkZWNsaW5lZCBieSBjb21taXQtbXNnIGhvb2suIgorbXNnc3RyICJSZXZpc2lvbmUgcmlmaXV0YXRhIGRhbCBjb21taXQtbXNnIGhvb2suIgorCisjOiBsaWIvY29tbWl0LnRjbDoyODcKK21zZ2lkICJDb21taXR0aW5nIGNoYW5nZXMuLi4iCittc2dzdHIgIkFyY2hpdmlhemlvbmUgbW9kaWZpY2hlLi4uIgorCisjOiBsaWIvY29tbWl0LnRjbDozMDMKK21zZ2lkICJ3cml0ZS10cmVlIGZhaWxlZDoiCittc2dzdHIgIndyaXRlLXRyZWUgbm9uIHJpdXNjaXRvOiIKKworIzogbGliL2NvbW1pdC50Y2w6MzA0IGxpYi9jb21taXQudGNsOjM0OCBsaWIvY29tbWl0LnRjbDozNjgKK21zZ2lkICJDb21taXQgZmFpbGVkLiIKK21zZ3N0ciAiSW1wb3NzaWJpbGUgY3JlYXJlIHVuYSBudW92YSByZXZpc2lvbmUuIgorCisjOiBsaWIvY29tbWl0LnRjbDozMjEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJDb21taXQgJXMgYXBwZWFycyB0byBiZSBjb3JydXB0IgorbXNnc3RyICJMYSByZXZpc2lvbmUgJXMgc2VtYnJhIGVzc2VyZSBkYW5uZWdnaWF0YSIKKworIzogbGliL2NvbW1pdC50Y2w6MzI2Cittc2dpZCAiIgorIk5vIGNoYW5nZXMgdG8gY29tbWl0LlxuIgorIlxuIgorIk5vIGZpbGVzIHdlcmUgbW9kaWZpZWQgYnkgdGhpcyBjb21taXQgYW5kIGl0IHdhcyBub3QgYSBtZXJnZSBjb21taXQuXG4iCisiXG4iCisiQSByZXNjYW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgbm93LlxuIgorbXNnc3RyICIiCisiTmVzc3VuYSBtb2RpZmljYSBwZXIgbGEgbnVvdmEgcmV2aXNpb25lLlxuIgorIlxuIgorIlF1ZXN0YSByZXZpc2lvbmUgbm9uIG1vZGlmaWNhIGFsY3VuIGZpbGUgZSBub24gZWZmZXR0dWEgYWxjdW5hIGZ1c2lvbmUuXG4iCisiXG4iCisiU2kgcHJvY2VkZXLDoCBzdWJpdG8gYWQgdW5hIG51b3ZhIGFuYWxpc2kuXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjMzMworbXNnaWQgIk5vIGNoYW5nZXMgdG8gY29tbWl0LiIKK21zZ3N0ciAiTmVzc3VuYSBtb2RpZmljYSBwZXIgbGEgbnVvdmEgcmV2aXNpb25lLiIKKworIzogbGliL2NvbW1pdC50Y2w6MzQ3Cittc2dpZCAiY29tbWl0LXRyZWUgZmFpbGVkOiIKK21zZ3N0ciAiY29tbWl0LXRyZWUgbm9uIHJpdXNjaXRvOiIKKworIzogbGliL2NvbW1pdC50Y2w6MzY3Cittc2dpZCAidXBkYXRlLXJlZiBmYWlsZWQ6IgorbXNnc3RyICJ1cGRhdGUtcmVmIG5vbiByaXVzY2l0bzoiCisKKyM6IGxpYi9jb21taXQudGNsOjQ1NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkNyZWF0ZWQgY29tbWl0ICVzOiAlcyIKK21zZ3N0ciAiQ3JlYXRhIHJldmlzaW9uZSAlczogJXMiCisKKyM6IGxpYi9jb25zb2xlLnRjbDo1OQorbXNnaWQgIldvcmtpbmcuLi4gcGxlYXNlIHdhaXQuLi4iCittc2dzdHIgIkVsYWJvcmF6aW9uZSBpbiBjb3Jzby4uLiBhdHRlbmRlcmUuLi4iCisKKyM6IGxpYi9jb25zb2xlLnRjbDoxODYKK21zZ2lkICJTdWNjZXNzIgorbXNnc3RyICJTdWNjZXNzbyIKKworIzogbGliL2NvbnNvbGUudGNsOjIwMAorbXNnaWQgIkVycm9yOiBDb21tYW5kIEZhaWxlZCIKK21zZ3N0ciAiRXJyb3JlOiBjb21hbmRvIG5vbiByaXVzY2l0byIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0MworbXNnaWQgIk51bWJlciBvZiBsb29zZSBvYmplY3RzIgorbXNnc3RyICJOdW1lcm8gZGkgb2dnZXR0aSBzbGVnYXRpIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQ0Cittc2dpZCAiRGlzayBzcGFjZSB1c2VkIGJ5IGxvb3NlIG9iamVjdHMiCittc2dzdHIgIlNwYXppbyBzdSBkaXNjbyB1dGlsaXp6YXRvIGRhIG9nZ2V0dGkgc2xlZ2F0aSIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0NQorbXNnaWQgIk51bWJlciBvZiBwYWNrZWQgb2JqZWN0cyIKK21zZ3N0ciAiTnVtZXJvIGRpIG9nZ2V0dGkgaW1wYWNjaGV0dGF0aSIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0NgorbXNnaWQgIk51bWJlciBvZiBwYWNrcyIKK21zZ3N0ciAiTnVtZXJvIGRpIHBhY2NoZXR0aSIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0NworbXNnaWQgIkRpc2sgc3BhY2UgdXNlZCBieSBwYWNrZWQgb2JqZWN0cyIKK21zZ3N0ciAiU3BhemlvIHN1IGRpc2NvIHV0aWxpenphdG8gZGEgb2dnZXR0aSBpbXBhY2NoZXR0YXRpIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQ4Cittc2dpZCAiUGFja2VkIG9iamVjdHMgd2FpdGluZyBmb3IgcHJ1bmluZyIKK21zZ3N0ciAiT2dnZXR0aSBpbXBhY2NoZXR0YXRpIGNoZSBhdHRlbmRvbm8gbGEgcG90YXR1cmEiCisKKyM6IGxpYi9kYXRhYmFzZS50Y2w6NDkKK21zZ2lkICJHYXJiYWdlIGZpbGVzIgorbXNnc3RyICJGaWxlIGludXRpbGkiCisKKyM6IGxpYi9kYXRhYmFzZS50Y2w6NzIKK21zZ2lkICJDb21wcmVzc2luZyB0aGUgb2JqZWN0IGRhdGFiYXNlIgorbXNnc3RyICJDb21wcmVzc2lvbmUgZGVsbCdhcmNoaXZpbyBpbiBjb3JzbyIKKworIzogbGliL2RhdGFiYXNlLnRjbDo4MworbXNnaWQgIlZlcmlmeWluZyB0aGUgb2JqZWN0IGRhdGFiYXNlIHdpdGggZnNjay1vYmplY3RzIgorbXNnc3RyICJWZXJpZmljYSBkZWxsJ2FyY2hpdmlvIGNvbiBmc2NrLW9iamVjdHMgaW4gY29yc28iCisKKyM6IGxpYi9kYXRhYmFzZS50Y2w6MTA4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIlRoaXMgcmVwb3NpdG9yeSBjdXJyZW50bHkgaGFzIGFwcHJveGltYXRlbHkgJWkgbG9vc2Ugb2JqZWN0cy5cbiIKKyJcbiIKKyJUbyBtYWludGFpbiBvcHRpbWFsIHBlcmZvcm1hbmNlIGl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRoYXQgeW91IGNvbXByZXNzICIKKyJ0aGUgZGF0YWJhc2Ugd2hlbiBtb3JlIHRoYW4gJWkgbG9vc2Ugb2JqZWN0cyBleGlzdC5cbiIKKyJcbiIKKyJDb21wcmVzcyB0aGUgZGF0YWJhc2Ugbm93PyIKK21zZ3N0ciAiIgorIlF1ZXN0byBhcmNoaXZpbyBhdHR1YWxtZW50ZSBoYSBjaXJjYSAlaSBvZ2dldHRpIHNsZWdhdGkuXG4iCisiXG4iCisiUGVyIG1hbnRlbmVyZSBidW9uZSBwcmVzdGF6aW9uaSBzaSByYWNjb21hbmRhIGRpIGNvbXByaW1lcmUgbCdhcmNoaXZpbyAiCisicXVhbmRvIHNvbm8gcHJlc2VudGkgcGnDuSBkaSAlaSBvZ2dldHRpIHNsZWdhdGkuXG4iCisiXG4iCisiQ29tcHJpbWVyZSBsJ2FyY2hpdmlvIG9yYT8iCisKKyM6IGxpYi9kYXRlLnRjbDoyNQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkludmFsaWQgZGF0ZSBmcm9tIEdpdDogJXMiCittc2dzdHIgIkdpdCBoYSByZXN0aXR1aXRvIHVuYSBkYXRhIG5vbiB2YWxpZGE6ICVzIgorCisjOiBsaWIvZGlmZi50Y2w6NDIKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiTm8gZGlmZmVyZW5jZXMgZGV0ZWN0ZWQuXG4iCisiXG4iCisiJXMgaGFzIG5vIGNoYW5nZXMuXG4iCisiXG4iCisiVGhlIG1vZGlmaWNhdGlvbiBkYXRlIG9mIHRoaXMgZmlsZSB3YXMgdXBkYXRlZCBieSBhbm90aGVyIGFwcGxpY2F0aW9uLCBidXQgIgorInRoZSBjb250ZW50IHdpdGhpbiB0aGUgZmlsZSB3YXMgbm90IGNoYW5nZWQuXG4iCisiXG4iCisiQSByZXNjYW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgdG8gZmluZCBvdGhlciBmaWxlcyB3aGljaCBtYXkgaGF2ZSAiCisidGhlIHNhbWUgc3RhdGUuIgorbXNnc3RyICIiCisiTm9uIHNvbm8gc3RhdGUgdHJvdmF0ZSBkaWZmZXJlbnplLlxuIgorIlxuIgorIiVzIG5vbiBoYSBtb2RpZmljaGUuXG4iCisiXG4iCisiTGEgZGF0YSBkaSBtb2RpZmljYSBkaSBxdWVzdG8gZmlsZSDDqCBzdGF0YSBjYW1iaWF0YSBkYSB1bidhbHRyYSAiCisiYXBwbGljYXppb25lLCBtYSBpbCBjb250ZW51dG8gZGVsIGZpbGUgw6ggcmltYXN0byBpbnZhcmlhdG8uXG4iCisiXG4iCisiU2kgcHJvY2VkZXLDoCBhdXRvbWF0aWNhbWVudGUgYWQgdW5hIG51b3ZhIGFuYWxpc2kgcGVyIHRyb3ZhcmUgYWx0cmkgZmlsZSBjaGUgIgorInBvdHJlYmJlcm8gYXZlcmUgbG8gc3Rlc3NvIHN0YXRvLiIKKworIzogbGliL2RpZmYudGNsOjgxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiTG9hZGluZyBkaWZmIG9mICVzLi4uIgorbXNnc3RyICJDYXJpY2FtZW50byBkZWxsZSBkaWZmZXJlbnplIGRpICVzLi4uIgorCisjOiBsaWIvZGlmZi50Y2w6MTE0IGxpYi9kaWZmLnRjbDoxODQKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gZGlzcGxheSAlcyIKK21zZ3N0ciAiSW1wb3NzaWJpbGUgdmlzdWFsaXp6YXJlICVzIgorCisjOiBsaWIvZGlmZi50Y2w6MTE1Cittc2dpZCAiRXJyb3IgbG9hZGluZyBmaWxlOiIKK21zZ3N0ciAiRXJyb3JlIG5lbCBjYXJpY2FtZW50byBkZWwgZmlsZToiCisKKyM6IGxpYi9kaWZmLnRjbDoxMjIKK21zZ2lkICJHaXQgUmVwb3NpdG9yeSAoc3VicHJvamVjdCkiCittc2dzdHIgIkFyY2hpdmlvIEdpdCAoc290dG9wcm9nZXR0bykiCisKKyM6IGxpYi9kaWZmLnRjbDoxMzQKK21zZ2lkICIqIEJpbmFyeSBmaWxlIChub3Qgc2hvd2luZyBjb250ZW50KS4iCittc2dzdHIgIiogRmlsZSBiaW5hcmlvIChpbCBjb250ZW51dG8gbm9uIHNhcsOgIG1vc3RyYXRvKS4iCisKKyM6IGxpYi9kaWZmLnRjbDoxODUKK21zZ2lkICJFcnJvciBsb2FkaW5nIGRpZmY6IgorbXNnc3RyICJFcnJvcmUgbmVsIGNhcmljYW1lbnRvIGRlbGxlIGRpZmZlcmVuemU6IgorCisjOiBsaWIvZGlmZi50Y2w6MzAzCittc2dpZCAiRmFpbGVkIHRvIHVuc3RhZ2Ugc2VsZWN0ZWQgaHVuay4iCittc2dzdHIgIkltcG9zc2liaWxlIHJpbXVvdmVyZSBsYSBzZXppb25lIHNjZWx0YSBkYWxsYSBudW92YSByZXZpc2lvbmUuIgorCisjOiBsaWIvZGlmZi50Y2w6MzEwCittc2dpZCAiRmFpbGVkIHRvIHN0YWdlIHNlbGVjdGVkIGh1bmsuIgorbXNnc3RyICJJbXBvc3NpYmlsZSBwcmVwYXJhcmUgbGEgc2V6aW9uZSBzY2VsdGEgcGVyIHVuYSBudW92YSByZXZpc2lvbmUuIgorCisjOiBsaWIvZXJyb3IudGNsOjIwIGxpYi9lcnJvci50Y2w6MTE0Cittc2dpZCAiZXJyb3IiCittc2dzdHIgImVycm9yZSIKKworIzogbGliL2Vycm9yLnRjbDozNgorbXNnaWQgIndhcm5pbmciCittc2dzdHIgImF0dGVuemlvbmUiCisKKyM6IGxpYi9lcnJvci50Y2w6OTQKK21zZ2lkICJZb3UgbXVzdCBjb3JyZWN0IHRoZSBhYm92ZSBlcnJvcnMgYmVmb3JlIGNvbW1pdHRpbmcuIgorbXNnc3RyICIiCisiQmlzb2duYSBjb3JyZWdnZXJlIGdsaSBlcnJvcmkgc3VkZGV0dGkgcHJpbWEgZGkgY3JlYXJlIHVuYSBudW92YSByZXZpc2lvbmUuIgorCisjOiBsaWIvaW5kZXgudGNsOjYKK21zZ2lkICJVbmFibGUgdG8gdW5sb2NrIHRoZSBpbmRleC4iCittc2dzdHIgIkltcG9zc2liaWxlIHNibG9jY2FyZSBsJ2FjY2Vzc28gYWxsJ2luZGljZSIKKworIzogbGliL2luZGV4LnRjbDoxNQorbXNnaWQgIkluZGV4IEVycm9yIgorbXNnc3RyICJFcnJvcmUgbmVsbCdpbmRpY2UiCisKKyM6IGxpYi9pbmRleC50Y2w6MjEKK21zZ2lkICIiCisiVXBkYXRpbmcgdGhlIEdpdCBpbmRleCBmYWlsZWQuICBBIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB0byAiCisicmVzeW5jaHJvbml6ZSBnaXQtZ3VpLiIKK21zZ3N0ciAiIgorIkltcG9zc2liaWxlIGFnZ2lvcm5hcmUgbCdpbmRpY2UuIE9yYSBzYXLDoCBhdnZpYXRhIHVuYSBudW92YSBhbmFsaXNpIGNoZSAiCisiYWdnaW9ybmVyw6AgZ2l0LWd1aS4iCisKKyM6IGxpYi9pbmRleC50Y2w6MjcKK21zZ2lkICJDb250aW51ZSIKK21zZ3N0ciAiQ29udGludWEiCisKKyM6IGxpYi9pbmRleC50Y2w6MzEKK21zZ2lkICJVbmxvY2sgSW5kZXgiCittc2dzdHIgIlNibG9jY2EgbCdhY2Nlc3NvIGFsbCdpbmRpY2UiCisKKyM6IGxpYi9pbmRleC50Y2w6MjgyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVW5zdGFnaW5nICVzIGZyb20gY29tbWl0IgorbXNnc3RyICIlcyBub24gZmFyw6AgcGFydGUgZGVsbGEgcHJvc3NpbWEgcmV2aXNpb25lIgorCisjOiBsaWIvaW5kZXgudGNsOjMxMworbXNnaWQgIlJlYWR5IHRvIGNvbW1pdC4iCittc2dzdHIgIlByb250byBwZXIgY3JlYXJlIHVuYSBudW92YSByZXZpc2lvbmUuIgorCisjOiBsaWIvaW5kZXgudGNsOjMyNgorIywgdGNsLWZvcm1hdAorbXNnaWQgIkFkZGluZyAlcyIKK21zZ3N0ciAiQWdnaXVudGEgZGkgJXMgaW4gY29yc28iCisKKyM6IGxpYi9pbmRleC50Y2w6MzgxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUmV2ZXJ0IGNoYW5nZXMgaW4gZmlsZSAlcz8iCittc2dzdHIgIkFubnVsbGFyZSBsZSBtb2RpZmljaGUgbmVsIGZpbGUgJXM/IgorCisjOiBsaWIvaW5kZXgudGNsOjM4MworIywgdGNsLWZvcm1hdAorbXNnaWQgIlJldmVydCBjaGFuZ2VzIGluIHRoZXNlICVpIGZpbGVzPyIKK21zZ3N0ciAiQW5udWxsYXJlIGxlIG1vZGlmaWNoZSBpbiBxdWVzdGkgJWkgZmlsZT8iCisKKyM6IGxpYi9pbmRleC50Y2w6MzkxCittc2dpZCAiQW55IHVuc3RhZ2VkIGNoYW5nZXMgd2lsbCBiZSBwZXJtYW5lbnRseSBsb3N0IGJ5IHRoZSByZXZlcnQuIgorbXNnc3RyICIiCisiVHV0dGUgbGUgbW9kaWZpY2hlIG5vbiBwcmVwYXJhdGUgcGVyIHVuYSBudW92YSByZXZpc2lvbmUgc2FyYW5ubyBwZXJzZSBwZXIgIgorInNlbXByZS4iCisKKyM6IGxpYi9pbmRleC50Y2w6Mzk0Cittc2dpZCAiRG8gTm90aGluZyIKK21zZ3N0ciAiTm9uIGZhcmUgbmllbnRlIgorCisjOiBsaWIvbWVyZ2UudGNsOjEzCittc2dpZCAiIgorIkNhbm5vdCBtZXJnZSB3aGlsZSBhbWVuZGluZy5cbiIKKyJcbiIKKyJZb3UgbXVzdCBmaW5pc2ggYW1lbmRpbmcgdGhpcyBjb21taXQgYmVmb3JlIHN0YXJ0aW5nIGFueSB0eXBlIG9mIG1lcmdlLlxuIgorbXNnc3RyICIiCisiTm9uIHBvc3NvIGVmZmV0dHVhcmUgZnVzaW9uaSBkdXJhbnRlIHVuYSBjb3JyZXppb25lLlxuIgorIlxuIgorIkJpc29nbmEgZmluaXJlIGRpIGNvcnJlZ2dlcmUgcXVlc3RhIHJldmlzaW9uZSBwcmltYSBkaSBpbml6aWFyZSB1bmEgIgorInF1YWx1bnF1ZSBmdXNpb25lLlxuIgorCisjOiBsaWIvbWVyZ2UudGNsOjI3Cittc2dpZCAiIgorIkxhc3Qgc2Nhbm5lZCBzdGF0ZSBkb2VzIG5vdCBtYXRjaCByZXBvc2l0b3J5IHN0YXRlLlxuIgorIlxuIgorIkFub3RoZXIgR2l0IHByb2dyYW0gaGFzIG1vZGlmaWVkIHRoaXMgcmVwb3NpdG9yeSBzaW5jZSB0aGUgbGFzdCBzY2FuLiAgQSAiCisicmVzY2FuIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSBhIG1lcmdlIGNhbiBiZSBwZXJmb3JtZWQuXG4iCisiXG4iCisiVGhlIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBub3cuXG4iCittc2dzdHIgIiIKKyJMJ3VsdGltbyBzdGF0byBhbmFsaXp6YXRvIG5vbiBjb3JyaXNwb25kZSBhbGxvIHN0YXRvIGRlbGwnYXJjaGl2aW8uXG4iCisiXG4iCisiVW4gYWx0cm8gcHJvZ3JhbW1hIEdpdCBoYSBtb2RpZmljYXRvIHF1ZXN0byBhcmNoaXZpbyBkYWxsJ3VsdGltYSBhbmFsaXNpLiIKKyJCaXNvZ25hIGVmZmV0dHVhcmUgdW5hIG51b3ZhIGFuYWxpc2kgcHJpbWEgZGkgcG90ZXIgZWZmZXR0dWFyZSB1bmEgZnVzaW9uZS5cbiIKKyJcbiIKKyJMYSBudW92YSBhbmFsaXNpIGNvbWluY2Vyw6Agb3JhLlxuIgorCisjOiBsaWIvbWVyZ2UudGNsOjQ0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIllvdSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIGNvbmZsaWN0ZWQgbWVyZ2UuXG4iCisiXG4iCisiRmlsZSAlcyBoYXMgbWVyZ2UgY29uZmxpY3RzLlxuIgorIlxuIgorIllvdSBtdXN0IHJlc29sdmUgdGhlbSwgc3RhZ2UgdGhlIGZpbGUsIGFuZCBjb21taXQgdG8gY29tcGxldGUgdGhlIGN1cnJlbnQgIgorIm1lcmdlLiAgT25seSB0aGVuIGNhbiB5b3UgYmVnaW4gYW5vdGhlciBtZXJnZS5cbiIKK21zZ3N0ciAiIgorIlNlaSBuZWwgbWV6em8gZGkgdW5hIGZ1c2lvbmUgY29uIGNvbmZsaXR0aS5cbiIKKyJcbiIKKyJJbCBmaWxlICVzIGhhIGRlaSBjb25mbGl0dGkuXG4iCisiXG4iCisiQmlzb2duYSByaXNvbHZlcmUgaSBjb25mbGl0dGksIHByZXBhcmFyZSBpbCBmaWxlIHBlciB1bmEgbnVvdmEgcmV2aXNpb25lIGVkICIKKyJpbmZpbmUgY3JlYXJsYSBwZXIgY29tcGxldGFyZSBsYSBmdXNpb25lIGF0dHVhbGUuIFNvbG8gYSBxdWVzdG8gcHVudG8gcG90cmFpICIKKyJpbml6aWFyZSB1bidhbHRyYSBmdXNpb25lLlxuIgorCisjOiBsaWIvbWVyZ2UudGNsOjU0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIllvdSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIGNoYW5nZS5cbiIKKyJcbiIKKyJGaWxlICVzIGlzIG1vZGlmaWVkLlxuIgorIlxuIgorIllvdSBzaG91bGQgY29tcGxldGUgdGhlIGN1cnJlbnQgY29tbWl0IGJlZm9yZSBzdGFydGluZyBhIG1lcmdlLiAgRG9pbmcgc28gIgorIndpbGwgaGVscCB5b3UgYWJvcnQgYSBmYWlsZWQgbWVyZ2UsIHNob3VsZCB0aGUgbmVlZCBhcmlzZS5cbiIKK21zZ3N0ciAiIgorIlNlaSBuZWwgbWV6em8gZGkgdW5hIG1vZGlmaWNhLlxuIgorIlxuIgorIklsIGZpbGUgJXMgw6ggc3RhdG8gbW9kaWZpY2F0by5cbiIKKyJcbiIKKyJCaXNvZ25hIGNvbXBsZXRhcmUgbGEgY3JlYXppb25lIGRlbGxhIHJldmlzaW9uZSBhdHR1YWxlIHByaW1hIGRpIGluaXppYXJlICIKKyJ1bmEgZnVzaW9uZS4gSW4gcXVlc3RvIG1vZG8gc2Fyw6AgcGnDuSBmYWNpbGUgaW50ZXJyb21wZXJlIHVuYSBmdXNpb25lIG5vbiAiCisicml1c2NpdGEsIG5lbCBjYXNvIGNlIG5lIGZvc3NlIGJpc29nbm8uXG4iCisKKyM6IGxpYi9tZXJnZS50Y2w6MTA2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiJXMgb2YgJXMiCittc2dzdHIgIiVzIGRpICVzIgorCisjOiBsaWIvbWVyZ2UudGNsOjExOQorIywgdGNsLWZvcm1hdAorbXNnaWQgIk1lcmdpbmcgJXMgYW5kICVzLi4uIgorbXNnc3RyICJGdXNpb25lIGRpICVzIGUgJXMgaW4gY29yc28uLi4iCisKKyM6IGxpYi9tZXJnZS50Y2w6MTMwCittc2dpZCAiTWVyZ2UgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4iCittc2dzdHIgIkZ1c2lvbmUgY29tcGxldGF0YSBjb24gc3VjY2Vzc28uIgorCisjOiBsaWIvbWVyZ2UudGNsOjEzMgorbXNnaWQgIk1lcmdlIGZhaWxlZC4gIENvbmZsaWN0IHJlc29sdXRpb24gaXMgcmVxdWlyZWQuIgorbXNnc3RyICJGdXNpb25lIG5vbiByaXVzY2l0YS4gQmlzb2duYSByaXNvbHZlcmUgaSBjb25mbGl0dGkuIgorCisjOiBsaWIvbWVyZ2UudGNsOjE1NworIywgdGNsLWZvcm1hdAorbXNnaWQgIk1lcmdlIEludG8gJXMiCittc2dzdHIgIkZ1c2lvbmUgaW4gJXMiCisKKyM6IGxpYi9tZXJnZS50Y2w6MTc2Cittc2dpZCAiUmV2aXNpb24gVG8gTWVyZ2UiCittc2dzdHIgIlJldmlzaW9uZSBkYSBmb25kZXJlIgorCisjOiBsaWIvbWVyZ2UudGNsOjIxMQorbXNnaWQgIiIKKyJDYW5ub3QgYWJvcnQgd2hpbGUgYW1lbmRpbmcuXG4iCisiXG4iCisiWW91IG11c3QgZmluaXNoIGFtZW5kaW5nIHRoaXMgY29tbWl0LlxuIgorbXNnc3RyICIiCisiSW50ZXJydXppb25lIGltcG9zc2liaWxlIGR1cmFudGUgdW5hIGNvcnJlemlvbmUuXG4iCisiXG4iCisiQmlzb2duYSBmaW5pcmUgZGkgY29ycmVnZ2VyZSBxdWVzdGEgcmV2aXNpb25lLlxuIgorCisjOiBsaWIvbWVyZ2UudGNsOjIyMQorbXNnaWQgIiIKKyJBYm9ydCBtZXJnZT9cbiIKKyJcbiIKKyJBYm9ydGluZyB0aGUgY3VycmVudCBtZXJnZSB3aWxsIGNhdXNlICpBTEwqIHVuY29tbWl0dGVkIGNoYW5nZXMgdG8gYmUgbG9zdC5cbiIKKyJcbiIKKyJDb250aW51ZSB3aXRoIGFib3J0aW5nIHRoZSBjdXJyZW50IG1lcmdlPyIKK21zZ3N0ciAiIgorIkludGVycm9tcGVyZSBmdXNpb25lP1xuIgorIlxuIgorIkwnaW50ZXJydXppb25lIGRlbGxhIGZ1c2lvbmUgYXR0dWFsZSBjYXVzZXLDoCBsYSBwZXJkaXRhIGRpICpUVVRURSogbGUgIgorIm1vZGlmaWNoZSBub24gYW5jb3JhIHByZXNlbnRpIG5lbGwnYXJjaGl2aW8uXG4iCisiXG4iCisiQ29udGludWFyZSBjb24gbCdpbnRlcnJ1emlvbmUgZGVsbGEgZnVzaW9uZSBhdHR1YWxlPyIKKworIzogbGliL21lcmdlLnRjbDoyMjcKK21zZ2lkICIiCisiUmVzZXQgY2hhbmdlcz9cbiIKKyJcbiIKKyJSZXNldHRpbmcgdGhlIGNoYW5nZXMgd2lsbCBjYXVzZSAqQUxMKiB1bmNvbW1pdHRlZCBjaGFuZ2VzIHRvIGJlIGxvc3QuXG4iCisiXG4iCisiQ29udGludWUgd2l0aCByZXNldHRpbmcgdGhlIGN1cnJlbnQgY2hhbmdlcz8iCittc2dzdHIgIiIKKyJSaXByaXN0aW5hcmUgbGEgcmV2aXNpb25lIGNvcnJlbnRlIGUgYW5udWxsYXJlIGxlIG1vZGlmaWNoZT9cbiIKKyJcbiIKKyJMJ2FubnVsbGFtZW50byBkZWxsZSBtb2RpZmljaGUgY2F1c2Vyw6AgbGEgcGVyZGl0YSBkaSAqVFVUVEUqIGxlIG1vZGlmaWNoZSAiCisibm9uIGFuY29yYSBwcmVzZW50aSBuZWxsJ2FyY2hpdmlvLlxuIgorIlxuIgorIkNvbnRpbnVhcmUgY29uIGwnYW5udWxsYW1lbnRvIGRlbGxlIG1vZGlmaWNoZSBhdHR1YWxpPyIKKworIzogbGliL21lcmdlLnRjbDoyMzgKK21zZ2lkICJBYm9ydGluZyIKK21zZ3N0ciAiSW50ZXJydXppb25lIgorCisjOiBsaWIvbWVyZ2UudGNsOjIzOAorbXNnaWQgImZpbGVzIHJlc2V0IgorbXNnc3RyICJyaXByaXN0aW5vIGZpbGUiCisKKyM6IGxpYi9tZXJnZS50Y2w6MjY1Cittc2dpZCAiQWJvcnQgZmFpbGVkLiIKK21zZ3N0ciAiSW50ZXJydXppb25lIG5vbiByaXVzY2l0YS4iCisKKyM6IGxpYi9tZXJnZS50Y2w6MjY3Cittc2dpZCAiQWJvcnQgY29tcGxldGVkLiAgUmVhZHkuIgorbXNnc3RyICJJbnRlcnJ1emlvbmUgY29tcGxldGF0YS4gUHJvbnRvLiIKKworIzogbGliL29wdGlvbi50Y2w6OTUKK21zZ2lkICJSZXN0b3JlIERlZmF1bHRzIgorbXNnc3RyICJSaXByaXN0aW5hIHZhbG9yaSBwcmVkZWZpbml0aSIKKworIzogbGliL29wdGlvbi50Y2w6OTkKK21zZ2lkICJTYXZlIgorbXNnc3RyICJTYWx2YSIKKworIzogbGliL29wdGlvbi50Y2w6MTA5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiJXMgUmVwb3NpdG9yeSIKK21zZ3N0ciAiQXJjaGl2aW8gZGkgJXMiCisKKyM6IGxpYi9vcHRpb24udGNsOjExMAorbXNnaWQgIkdsb2JhbCAoQWxsIFJlcG9zaXRvcmllcykiCittc2dzdHIgIlR1dHRpIGdsaSBhcmNoaXZpIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMTYKK21zZ2lkICJVc2VyIE5hbWUiCittc2dzdHIgIk5vbWUgdXRlbnRlIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMTcKK21zZ2lkICJFbWFpbCBBZGRyZXNzIgorbXNnc3RyICJJbmRpcml6em8gRW1haWwiCisKKyM6IGxpYi9vcHRpb24udGNsOjExOQorbXNnaWQgIlN1bW1hcml6ZSBNZXJnZSBDb21taXRzIgorbXNnc3RyICJSaWVwaWxvZ28gbmVsbGUgcmV2aXNpb25pIGRpIGZ1c2lvbmUiCisKKyM6IGxpYi9vcHRpb24udGNsOjEyMAorbXNnaWQgIk1lcmdlIFZlcmJvc2l0eSIKK21zZ3N0ciAiUHJvbGlzc2l0w6AgZGVsbGEgZnVzaW9uZSIKKworIzogbGliL29wdGlvbi50Y2w6MTIxCittc2dpZCAiU2hvdyBEaWZmc3RhdCBBZnRlciBNZXJnZSIKK21zZ3N0ciAiTW9zdHJhIHN0YXRpc3RpY2hlIGRlbGxlIGRpZmZlcmVuemUgZG9wbyBsYSBmdXNpb25lIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMjMKK21zZ2lkICJUcnVzdCBGaWxlIE1vZGlmaWNhdGlvbiBUaW1lc3RhbXBzIgorbXNnc3RyICJGaWRhdGkgZGVsbGUgZGF0ZSBkaSBtb2RpZmljYSBkZWkgZmlsZSIKKworIzogbGliL29wdGlvbi50Y2w6MTI0Cittc2dpZCAiUHJ1bmUgVHJhY2tpbmcgQnJhbmNoZXMgRHVyaW5nIEZldGNoIgorbXNnc3RyICIiCisiRWZmZXR0dWEgcG90YXR1cmEgZGVpIGR1cGxpY2F0aSBsb2NhbGkgZGkgcmFtaSByZW1vdGkgZHVyYW50ZSBpbCByZWN1cGVybyIKKworIzogbGliL29wdGlvbi50Y2w6MTI1Cittc2dpZCAiTWF0Y2ggVHJhY2tpbmcgQnJhbmNoZXMiCittc2dzdHIgIkFwcGFpYSBkdXBsaWNhdGkgbG9jYWxpIGRpIHJhbWkgcmVtb3RpIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMjYKK21zZ2lkICJOdW1iZXIgb2YgRGlmZiBDb250ZXh0IExpbmVzIgorbXNnc3RyICJOdW1lcm8gZGkgbGluZWUgZGkgY29udGVzdG8gbmVsbGUgZGlmZmVyZW56ZSIKKworIzogbGliL29wdGlvbi50Y2w6MTI3Cittc2dpZCAiQ29tbWl0IE1lc3NhZ2UgVGV4dCBXaWR0aCIKK21zZ3N0ciAiTGFyZ2hlenphIGRlbCBtZXNzYWdnaW8gZGkgcmV2aXNpb25lIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMjgKK21zZ2lkICJOZXcgQnJhbmNoIE5hbWUgVGVtcGxhdGUiCittc2dzdHIgIk1vZGVsbG8gcGVyIGlsIG5vbWUgZGkgdW4gbnVvdm8gcmFtbyIKKworIzogbGliL29wdGlvbi50Y2w6MTkyCittc2dpZCAiU3BlbGxpbmcgRGljdGlvbmFyeToiCittc2dzdHIgIkxpbmd1YSBkaXppb25hcmlvOiIKKworIzogbGliL29wdGlvbi50Y2w6MjE2Cittc2dpZCAiQ2hhbmdlIEZvbnQiCittc2dzdHIgIkNhbWJpYSBjYXJhdHRlcmkiCisKKyM6IGxpYi9vcHRpb24udGNsOjIyMAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkNob29zZSAlcyIKK21zZ3N0ciAiU2NlZ2xpICVzIgorCisjOiBsaWIvb3B0aW9uLnRjbDoyMjYKK21zZ2lkICJwdC4iCittc2dzdHIgInB0LiIKKworIzogbGliL29wdGlvbi50Y2w6MjQwCittc2dpZCAiUHJlZmVyZW5jZXMiCittc2dzdHIgIlByZWZlcmVuemUiCisKKyM6IGxpYi9vcHRpb24udGNsOjI3NQorbXNnaWQgIkZhaWxlZCB0byBjb21wbGV0ZWx5IHNhdmUgb3B0aW9uczoiCittc2dzdHIgIkltcG9zc2liaWxlIHNhbHZhcmUgY29tcGxldGFtZW50ZSBsZSBvcHppb25pOiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoyOSBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjM0Cittc2dpZCAiRGVsZXRlIFJlbW90ZSBCcmFuY2giCittc2dzdHIgIkNhbmNlbGxhIHJhbW8gcmVtb3RvIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjQ3Cittc2dpZCAiRnJvbSBSZXBvc2l0b3J5IgorbXNnc3RyICJEYSBhcmNoaXZpbyIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDo1MCBsaWIvdHJhbnNwb3J0LnRjbDoxMjMKK21zZ2lkICJSZW1vdGU6IgorbXNnc3RyICJSZW1vdG86IgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjY2IGxpYi90cmFuc3BvcnQudGNsOjEzOAorbXNnaWQgIkFyYml0cmFyeSBVUkw6IgorbXNnc3RyICJVUkwgc3BlY2lmaWNvOiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDo4NAorbXNnaWQgIkJyYW5jaGVzIgorbXNnc3RyICJSYW1pIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjEwOQorbXNnaWQgIkRlbGV0ZSBPbmx5IElmIgorbXNnc3RyICJFbGltaW5hIHNvbG8gc2UiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MTExCittc2dpZCAiTWVyZ2VkIEludG86IgorbXNnc3RyICJGdXNvIGluOiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoxMTkKK21zZ2lkICJBbHdheXMgKERvIG5vdCBwZXJmb3JtIG1lcmdlIGNoZWNrcykiCittc2dzdHIgIlNlbXByZSAobm9uIHZlcmlmaWNhcmUgbGUgZnVzaW9uaSkiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MTUyCittc2dpZCAiQSBicmFuY2ggaXMgcmVxdWlyZWQgZm9yICdNZXJnZWQgSW50bycuIgorbXNnc3RyICJTaSByaWNoaWVkZSB1biByYW1vIHBlciAnRnVzbyBpbicuIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjE4NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJUaGUgZm9sbG93aW5nIGJyYW5jaGVzIGFyZSBub3QgY29tcGxldGVseSBtZXJnZWQgaW50byAlczpcbiIKKyJcbiIKKyIgLSAlcyIKK21zZ3N0ciAiIgorIkkgcmFtaSBzZWd1ZW50aSBub24gc29ubyBzdGF0aSBmdXNpIGNvbXBsZXRhbWVudGUgaW4gJXM6XG4iCisiXG4iCisiIC0gJXMiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MTg5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIk9uZSBvciBtb3JlIG9mIHRoZSBtZXJnZSB0ZXN0cyBmYWlsZWQgYmVjYXVzZSB5b3UgaGF2ZSBub3QgZmV0Y2hlZCB0aGUgIgorIm5lY2Vzc2FyeSBjb21taXRzLiAgVHJ5IGZldGNoaW5nIGZyb20gJXMgZmlyc3QuIgorbXNnc3RyICIiCisiSW1wb3NzaWJpbGUgdmVyaWZpY2FyZSB1bmEgbyBwacO5IGZ1c2lvbmk6IG1hbmNhbm8gbGUgcmV2aXNpb25pIG5lY2Vzc2FyaWUuICIKKyJQcm92YSBwcmltYSBhIHJlY3VwZXJhcmxlIGRhICVzLiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoyMDcKK21zZ2lkICJQbGVhc2Ugc2VsZWN0IG9uZSBvciBtb3JlIGJyYW5jaGVzIHRvIGRlbGV0ZS4iCittc2dzdHIgIlNjZWdsaWVyZSB1bm8gbyBwacO5IHJhbWkgZGEgY2FuY2VsbGFyZS4iCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MjE2Cittc2dpZCAiIgorIlJlY292ZXJpbmcgZGVsZXRlZCBicmFuY2hlcyBpcyBkaWZmaWN1bHQuXG4iCisiXG4iCisiRGVsZXRlIHRoZSBzZWxlY3RlZCBicmFuY2hlcz8iCittc2dzdHIgIiIKKyJSaWNvbXBvcnJlIHJhbWkgY2FuY2VsbGF0aSDDqCBkaWZmaWNpbGUuXG4iCisiXG4iCisiQ2FuY2VsbGFyZSBpIHJhbWkgc2VsZXppb25hdGk/IgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjIyNgorIywgdGNsLWZvcm1hdAorbXNnaWQgIkRlbGV0aW5nIGJyYW5jaGVzIGZyb20gJXMiCittc2dzdHIgIkNhbmNlbGxhemlvbmUgcmFtaSBkYSAlcyIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoyODYKK21zZ2lkICJObyByZXBvc2l0b3J5IHNlbGVjdGVkLiIKK21zZ3N0ciAiTmVzc3VuIGFyY2hpdmlvIHNlbGV6aW9uYXRvLiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoyOTEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJTY2FubmluZyAlcy4uLiIKK21zZ3N0ciAiQW5hbGlzaSBpbiBjb3JzbyAlcy4uLiIKKworIzogbGliL3JlbW90ZS50Y2w6MTY1Cittc2dpZCAiUHJ1bmUgZnJvbSIKK21zZ3N0ciAiRWZmZXR0dWEgcG90YXR1cmEgZGEiCisKKyM6IGxpYi9yZW1vdGUudGNsOjE3MAorbXNnaWQgIkZldGNoIGZyb20iCittc2dzdHIgIlJlY3VwZXJhIGRhIgorCisjOiBsaWIvcmVtb3RlLnRjbDoyMTMKK21zZ2lkICJQdXNoIHRvIgorbXNnc3RyICJQcm9wYWdhIHZlcnNvIgorCisjOiBsaWIvc2hvcnRjdXQudGNsOjIwIGxpYi9zaG9ydGN1dC50Y2w6NjEKK21zZ2lkICJDYW5ub3Qgd3JpdGUgc2hvcnRjdXQ6IgorbXNnc3RyICJJbXBvc3NpYmlsZSBzY3JpdmVyZSBzaG9ydGN1dDoiCisKKyM6IGxpYi9zaG9ydGN1dC50Y2w6MTM2Cittc2dpZCAiQ2Fubm90IHdyaXRlIGljb246IgorbXNnc3RyICJJbXBvc3NpYmlsZSBzY3JpdmVyZSBpY29uYToiCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDo1NworbXNnaWQgIlVuc3VwcG9ydGVkIHNwZWxsIGNoZWNrZXIiCittc2dzdHIgIkNvcnJldHRvcmUgb3J0b2dyYWZpY28gbm9uIHN1cHBvcnRhdG8iCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDo2NQorbXNnaWQgIlNwZWxsIGNoZWNraW5nIGlzIHVuYXZhaWxhYmxlIgorbXNnc3RyICJDb3JyZXppb25lIG9ydG9ncmFmaWNhIGluZGlzcG9uaWJpbGUiCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDo2OAorbXNnaWQgIkludmFsaWQgc3BlbGwgY2hlY2tpbmcgY29uZmlndXJhdGlvbiIKK21zZ3N0ciAiTGEgY29uZmlndXJhemlvbmUgZGVsIGNvcnJldHRvcmUgb3J0b2dyYWZpY28gbm9uIMOoIHZhbGlkYSIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjcwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUmV2ZXJ0aW5nIGRpY3Rpb25hcnkgdG8gJXMuIgorbXNnc3RyICJJbCBkaXppb25hcmlvIMOoIHN0YXRvIHJlaW1wb3N0YXRvIHN1ICVzLiIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjczCittc2dpZCAiU3BlbGwgY2hlY2tlciBzaWxlbnRseSBmYWlsZWQgb24gc3RhcnR1cCIKK21zZ3N0ciAiSWwgY29ycmV0dG9yZSBvcnRvZ3JhZmljbyBoYSByaXBvcnRhdG8gdW4gZXJyb3JlIGFsbCdhdnZpbyIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjgwCittc2dpZCAiVW5yZWNvZ25pemVkIHNwZWxsIGNoZWNrZXIiCittc2dzdHIgIkNvcnJldHRvcmUgb3J0b2dyYWZpY28gc2Nvbm9zY2l1dG8iCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDoxODAKK21zZ2lkICJObyBTdWdnZXN0aW9ucyIKK21zZ3N0ciAiTmVzc3VuIHN1Z2dlcmltZW50byIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjM4MQorbXNnaWQgIlVuZXhwZWN0ZWQgRU9GIGZyb20gc3BlbGwgY2hlY2tlciIKK21zZ3N0ciAiSWwgY29ycmV0dG9yZSBvcnRvZ3JhZmljbyBoYSBtYW5kYXRvIHVuIEVPRiBpbmFzcGV0dGF0byIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjM4NQorbXNnaWQgIlNwZWxsIENoZWNrZXIgRmFpbGVkIgorbXNnc3RyICJFcnJvcmUgbmVsIGNvcnJldHRvcmUgb3J0b2dyYWZpY28iCisKKyM6IGxpYi9zdGF0dXNfYmFyLnRjbDo4MworIywgdGNsLWZvcm1hdAorbXNnaWQgIiVzIC4uLiAlKmkgb2YgJSppICVzICglM2klJSkiCittc2dzdHIgIiUxJHMgLi4uICU2JHM6ICUyJCppIGRpICU0JCppICglNyQzaSUlKSIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6NgorIywgdGNsLWZvcm1hdAorbXNnaWQgImZldGNoICVzIgorbXNnc3RyICJyZWN1cGVyYSBkYSAlcyIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6NworIywgdGNsLWZvcm1hdAorbXNnaWQgIkZldGNoaW5nIG5ldyBjaGFuZ2VzIGZyb20gJXMiCittc2dzdHIgIlJlY3VwZXJvIG51b3ZlIG1vZGlmaWNoZSBkYSAlcyIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTgKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJyZW1vdGUgcHJ1bmUgJXMiCittc2dzdHIgInBvdGF0dXJhIHJlbW90YSBkaSAlcyIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJQcnVuaW5nIHRyYWNraW5nIGJyYW5jaGVzIGRlbGV0ZWQgZnJvbSAlcyIKK21zZ3N0ciAiRWZmZXR0dWEgcG90YXR1cmEgZGVpIGR1cGxpY2F0aSBsb2NhbGkgZGkgcmFtaSByZW1vdGkgY2FuY2VsbGF0aSBkYSAlcyIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MjUgbGliL3RyYW5zcG9ydC50Y2w6NzEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJwdXNoICVzIgorbXNnc3RyICJwcm9wYWdhIHZlcnNvICVzIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoyNgorIywgdGNsLWZvcm1hdAorbXNnaWQgIlB1c2hpbmcgY2hhbmdlcyB0byAlcyIKK21zZ3N0ciAiUHJvcGFnYXppb25lIG1vZGlmaWNoZSBhICVzIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDo3MgorIywgdGNsLWZvcm1hdAorbXNnaWQgIlB1c2hpbmcgJXMgJXMgdG8gJXMiCittc2dzdHIgIlByb3BhZ2F6aW9uZSAlcyAlcyBhICVzIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDo4OQorbXNnaWQgIlB1c2ggQnJhbmNoZXMiCittc2dzdHIgIlByb3BhZ2EgcmFtaSIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTAzCittc2dpZCAiU291cmNlIEJyYW5jaGVzIgorbXNnc3RyICJSYW1pIGRpIG9yaWdpbmUiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjEyMAorbXNnaWQgIkRlc3RpbmF0aW9uIFJlcG9zaXRvcnkiCittc2dzdHIgIkFyY2hpdmlvIGRpIGRlc3RpbmF6aW9uZSIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTU4Cittc2dpZCAiVHJhbnNmZXIgT3B0aW9ucyIKK21zZ3N0ciAiT3B6aW9uaSBkaSB0cmFzZmVyaW1lbnRvIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoxNjAKK21zZ2lkICJGb3JjZSBvdmVyd3JpdGUgZXhpc3RpbmcgYnJhbmNoIChtYXkgZGlzY2FyZCBjaGFuZ2VzKSIKK21zZ3N0ciAiU292cmFzY3JpdmkgcmFtbyBlc2lzdGVudGUgKGFsY3VuZSBtb2RpZmljaGUgcG90cmViYmVybyBlc3NlcmUgcGVyc2UpIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoxNjQKK21zZ2lkICJVc2UgdGhpbiBwYWNrIChmb3Igc2xvdyBuZXR3b3JrIGNvbm5lY3Rpb25zKSIKK21zZ3N0ciAiVXRpbGl6emEgJ3RoaW4gcGFjaycgKHBlciBjb25uZXNzaW9uaSBsZW50ZSkiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjE2OAorbXNnaWQgIkluY2x1ZGUgdGFncyIKK21zZ3N0ciAiSW5jbHVkaSBldGljaGV0dGUiCmRpZmYgLS1naXQgYS9naXQtZ3VpL3BvL2phLnBvIGIvZ2l0LWd1aS9wby9qYS5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGU2ZDYyCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9wby9qYS5wbwpAQCAtMCwwICsxLDE5NjkgQEAKKyMgVHJhbnNsYXRpb24gb2YgZ2l0LWd1aSB0byBKYXBhbmVzZQorIyBDb3B5cmlnaHQgKEMpIDIwMDcgU2hhd24gUGVhcmNlCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSBnaXQtZ3VpIHBhY2thZ2UuCisjIOOBl+OCieOBhOOBlyDjgarjgarjgZMgPG5hbmFrbzNAYmx1ZWJvdHRsZS5jb20+LCAyMDA3LgorIworIywgZnV6enkKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdpdC1ndWlcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMDgtMDMtMTQgMDc6MTgrMDEwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMDgtMDMtMTUgMjA6MTIrMDkwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjog44GX44KJ44GE44GXIOOBquOBquOBkyA8bmFuYWtvM0BibHVlYm90dGxlLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBKYXBhbmVzZVxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorCisjOiBnaXQtZ3VpLnNoOjQxIGdpdC1ndWkuc2g6NjM0IGdpdC1ndWkuc2g6NjQ4IGdpdC1ndWkuc2g6NjYxIGdpdC1ndWkuc2g6NzQ0CisjOiBnaXQtZ3VpLnNoOjc2MworbXNnaWQgImdpdC1ndWk6IGZhdGFsIGVycm9yIgorbXNnc3RyICJnaXQtZ3VpOiDoh7Tlkb3nmoTjgarjgqjjg6njg7wiCisKKyM6IGdpdC1ndWkuc2g6NTkzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBmb250IHNwZWNpZmllZCBpbiAlczoiCittc2dzdHIgIiVzIOOBq+eEoeWKueOBquODleOCqeODs+ODiOOBjOaMh+WumuOBleOCjOOBpuOBhOOBvuOBmToiCisKKyM6IGdpdC1ndWkuc2g6NjIwCittc2dpZCAiTWFpbiBGb250IgorbXNnc3RyICLkuLvjg5Xjgqnjg7Pjg4giCisKKyM6IGdpdC1ndWkuc2g6NjIxCittc2dpZCAiRGlmZi9Db25zb2xlIEZvbnQiCittc2dzdHIgImRpZmYv44Kz44Oz44K944O844Or44O744OV44Kp44Oz44OIIgorCisjOiBnaXQtZ3VpLnNoOjYzNQorbXNnaWQgIkNhbm5vdCBmaW5kIGdpdCBpbiBQQVRILiIKK21zZ3N0ciAiUEFUSCDkuK3jgasgZ2l0IOOBjOimi+OBpOOBi+OCiuOBvuOBm+OCkyIKKworIzogZ2l0LWd1aS5zaDo2NjIKK21zZ2lkICJDYW5ub3QgcGFyc2UgR2l0IHZlcnNpb24gc3RyaW5nOiIKK21zZ3N0ciAiR2l0IOODkOODvOOCuOODp+ODs+WQjeOBjOeQhuino+OBp+OBjeOBvuOBm+OCkzoiCisKKyM6IGdpdC1ndWkuc2g6NjgwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIkdpdCB2ZXJzaW9uIGNhbm5vdCBiZSBkZXRlcm1pbmVkLlxuIgorIlxuIgorIiVzIGNsYWltcyBpdCBpcyB2ZXJzaW9uICclcycuXG4iCisiXG4iCisiJXMgcmVxdWlyZXMgYXQgbGVhc3QgR2l0IDEuNS4wIG9yIGxhdGVyLlxuIgorIlxuIgorIkFzc3VtZSAnJXMnIGlzIHZlcnNpb24gMS41LjA/XG4iCittc2dzdHIgIiIKKyJHaXQg44Gu44OQ44O844K444On44Oz44GM56K66KqN44Gn44GN44G+44Gb44KT44CCXG4iCisiXG4iCisiJXMg44Gv44OQ44O844K444On44OzICclcycg44Go44Gu44GT44Go44Gn44GZ44CCXG4iCisiXG4iCisiJXMg44Gv5pyA5L2O44Gn44KCIDEuNS4wIOOBi+OBneOCjOS7pemZjeOBriBHaXQg44GM5b+F6KaB44Gn44GZXG4iCisiXG4iCisiJyVzJyDjga/jg5Djg7zjgrjjg6fjg7MgMS41LjAg44Go5oCd44Gj44Gm6Imv44GE44Gn44GZ44GL77yfXG4iCisKKyM6IGdpdC1ndWkuc2g6OTE4Cittc2dpZCAiR2l0IGRpcmVjdG9yeSBub3QgZm91bmQ6IgorbXNnc3RyICJHaXQg44OH44Kj44Os44Kv44OI44Oq44GM6KaL44Gk44GL44KK44G+44Gb44KTOiIKKworIzogZ2l0LWd1aS5zaDo5MjUKK21zZ2lkICJDYW5ub3QgbW92ZSB0byB0b3Agb2Ygd29ya2luZyBkaXJlY3Rvcnk6IgorbXNnc3RyICLkvZzmpa3jg4fjgqPjg6zjgq/jg4jjg6rjga7mnIDkuIrkvY3jgavnp7vli5XjgafjgY3jgb7jgZvjgpMiCisKKyM6IGdpdC1ndWkuc2g6OTMyCittc2dpZCAiQ2Fubm90IHVzZSBmdW5ueSAuZ2l0IGRpcmVjdG9yeToiCittc2dzdHIgIuWkieOBqiAuZ2l0IOODh+OCo+ODrOOCr+ODiOODquOBr+S9v+OBiOOBvuOBm+OCkyIKKworIzogZ2l0LWd1aS5zaDo5MzcKK21zZ2lkICJObyB3b3JraW5nIGRpcmVjdG9yeSIKK21zZ3N0ciAi5L2c5qWt44OH44Kj44Os44Kv44OI44Oq44GM44GC44KK44G+44Gb44KTIgorCisjOiBnaXQtZ3VpLnNoOjEwODQgbGliL2NoZWNrb3V0X29wLnRjbDoyODMKK21zZ2lkICJSZWZyZXNoaW5nIGZpbGUgc3RhdHVzLi4uIgorbXNnc3RyICLjg5XjgqHjgqTjg6vnirbmhYvjgpLmm7TmlrDjgZfjgabjgYTjgb7jgZnigKYiCisKKyM6IGdpdC1ndWkuc2g6MTE0OQorbXNnaWQgIlNjYW5uaW5nIGZvciBtb2RpZmllZCBmaWxlcyAuLi4iCittc2dzdHIgIuWkieabtOOBleOCjOOBn+ODleOCoeOCpOODq+OCkuOCueOCreODo+ODs+OBl+OBpuOBhOOBvuOBmeKApiIKKworIzogZ2l0LWd1aS5zaDoxMzI0IGxpYi9icm93c2VyLnRjbDoyNDYKK21zZ2lkICJSZWFkeS4iCittc2dzdHIgIua6luWCmeWujOS6hiIKKworIzogZ2l0LWd1aS5zaDoxNTkwCittc2dpZCAiVW5tb2RpZmllZCIKK21zZ3N0ciAi5aSJ5pu054Sh44GXIgorCisjOiBnaXQtZ3VpLnNoOjE1OTIKK21zZ2lkICJNb2RpZmllZCwgbm90IHN0YWdlZCIKK21zZ3N0ciAi5aSJ5pu044GC44KK44CB44Kz44Of44OD44OI5pyq5LqI5a6aIgorCisjOiBnaXQtZ3VpLnNoOjE1OTMgZ2l0LWd1aS5zaDoxNTk4Cittc2dpZCAiU3RhZ2VkIGZvciBjb21taXQiCittc2dzdHIgIuOCs+ODn+ODg+ODiOS6iOWumua4iCIKKworIzogZ2l0LWd1aS5zaDoxNTk0IGdpdC1ndWkuc2g6MTU5OQorbXNnaWQgIlBvcnRpb25zIHN0YWdlZCBmb3IgY29tbWl0IgorbXNnc3RyICLpg6jliIbnmoTjgavjgrPjg5/jg4Pjg4jkuojlrprmuIgiCisKKyM6IGdpdC1ndWkuc2g6MTU5NSBnaXQtZ3VpLnNoOjE2MDAKK21zZ2lkICJTdGFnZWQgZm9yIGNvbW1pdCwgbWlzc2luZyIKK21zZ3N0ciAi44Kz44Of44OD44OI5LqI5a6a5riI44CB44OV44Kh44Kk44Or54Sh44GXIgorCisjOiBnaXQtZ3VpLnNoOjE1OTcKK21zZ2lkICJVbnRyYWNrZWQsIG5vdCBzdGFnZWQiCittc2dzdHIgIueuoeeQhuWkluOAgeOCs+ODn+ODg+ODiOacquS6iOWumiIKKworIzogZ2l0LWd1aS5zaDoxNjAyCittc2dpZCAiTWlzc2luZyIKK21zZ3N0ciAi44OV44Kh44Kk44Or54Sh44GXIgorCisjOiBnaXQtZ3VpLnNoOjE2MDMKK21zZ2lkICJTdGFnZWQgZm9yIHJlbW92YWwiCittc2dzdHIgIuWJiumZpOS6iOWumua4iCIKKworIzogZ2l0LWd1aS5zaDoxNjA0Cittc2dpZCAiU3RhZ2VkIGZvciByZW1vdmFsLCBzdGlsbCBwcmVzZW50IgorbXNnc3RyICLliYrpmaTkuojlrprmuIjjgIHjg5XjgqHjgqTjg6vmnKrliYrpmaQiCisKKyM6IGdpdC1ndWkuc2g6MTYwNiBnaXQtZ3VpLnNoOjE2MDcgZ2l0LWd1aS5zaDoxNjA4IGdpdC1ndWkuc2g6MTYwOQorbXNnaWQgIlJlcXVpcmVzIG1lcmdlIHJlc29sdXRpb24iCittc2dzdHIgIuimgeODnuODvOOCuOino+axuiIKKworIzogZ2l0LWd1aS5zaDoxNjQ0Cittc2dpZCAiU3RhcnRpbmcgZ2l0ay4uLiBwbGVhc2Ugd2FpdC4uLiIKK21zZ3N0ciAiZ2l0ayDjgpLotbfli5XkuK3igKbjgYrlvoXjgaHkuIvjgZXjgYTigKYiCisKKyM6IGdpdC1ndWkuc2g6MTY1MworIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJVbmFibGUgdG8gc3RhcnQgZ2l0azpcbiIKKyJcbiIKKyIlcyBkb2VzIG5vdCBleGlzdCIKK21zZ3N0ciAiIgorImdpdGsg44KS6LW35YuV44Gn44GN44G+44Gb44KTOlxuIgorIlxuIgorIiVzIOOBjOOBguOCiuOBvuOBm+OCkyIKKworIzogZ2l0LWd1aS5zaDoxODYwIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MzYKK21zZ2lkICJSZXBvc2l0b3J5IgorbXNnc3RyICLjg6rjg53jgrjjg4jjg6oiCisKKyM6IGdpdC1ndWkuc2g6MTg2MQorbXNnaWQgIkVkaXQiCittc2dzdHIgIue3qOmbhiIKKworIzogZ2l0LWd1aS5zaDoxODYzIGxpYi9jaG9vc2VfcmV2LnRjbDo1NjEKK21zZ2lkICJCcmFuY2giCittc2dzdHIgIuODluODqeODs+ODgSIKKworIzogZ2l0LWd1aS5zaDoxODY2IGxpYi9jaG9vc2VfcmV2LnRjbDo1NDgKK21zZ2lkICJDb21taXRAQG5vdW4iCittc2dzdHIgIuOCs+ODn+ODg+ODiCIKKworIzogZ2l0LWd1aS5zaDoxODY5IGxpYi9tZXJnZS50Y2w6MTIwIGxpYi9tZXJnZS50Y2w6MTQ5IGxpYi9tZXJnZS50Y2w6MTY3Cittc2dpZCAiTWVyZ2UiCittc2dzdHIgIuODnuODvOOCuCIKKworIzogZ2l0LWd1aS5zaDoxODcwIGxpYi9jaG9vc2VfcmV2LnRjbDo1NTcKK21zZ2lkICJSZW1vdGUiCittc2dzdHIgIuODquODouODvOODiCIKKworIzogZ2l0LWd1aS5zaDoxODc5Cittc2dpZCAiQnJvd3NlIEN1cnJlbnQgQnJhbmNoJ3MgRmlsZXMiCittc2dzdHIgIuePvuWcqOOBruODluODqeODs+ODgeOBruODleOCoeOCpOODq+OCkuimi+OCiyIKKworIzogZ2l0LWd1aS5zaDoxODgzCittc2dpZCAiQnJvd3NlIEJyYW5jaCBGaWxlcy4uLiIKK21zZ3N0ciAi44OW44Op44Oz44OB44Gu44OV44Kh44Kk44Or44KS6KaL44KL4oCmIgorCisjOiBnaXQtZ3VpLnNoOjE4ODgKK21zZ2lkICJWaXN1YWxpemUgQ3VycmVudCBCcmFuY2gncyBIaXN0b3J5IgorbXNnc3RyICLnj77lnKjjga7jg5bjg6njg7Pjg4Hjga7lsaXmrbTjgpLopovjgosiCisKKyM6IGdpdC1ndWkuc2g6MTg5MgorbXNnaWQgIlZpc3VhbGl6ZSBBbGwgQnJhbmNoIEhpc3RvcnkiCittc2dzdHIgIuWFqOOBpuOBruODluODqeODs+ODgeOBruWxpeattOOCkuimi+OCiyIKKworIzogZ2l0LWd1aS5zaDoxODk5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQnJvd3NlICVzJ3MgRmlsZXMiCittc2dzdHIgIuODluODqeODs+ODgSAlcyDjga7jg5XjgqHjgqTjg6vjgpLopovjgosiCisKKyM6IGdpdC1ndWkuc2g6MTkwMQorIywgdGNsLWZvcm1hdAorbXNnaWQgIlZpc3VhbGl6ZSAlcydzIEhpc3RvcnkiCittc2dzdHIgIuODluODqeODs+ODgSAlcyDjga7lsaXmrbTjgpLopovjgosiCisKKyM6IGdpdC1ndWkuc2g6MTkwNiBsaWIvZGF0YWJhc2UudGNsOjI3IGxpYi9kYXRhYmFzZS50Y2w6NjcKK21zZ2lkICJEYXRhYmFzZSBTdGF0aXN0aWNzIgorbXNnc3RyICLjg4fjg7zjgr/jg5njg7zjgrnntbHoqIgiCisKKyM6IGdpdC1ndWkuc2g6MTkwOSBsaWIvZGF0YWJhc2UudGNsOjM0Cittc2dpZCAiQ29tcHJlc3MgRGF0YWJhc2UiCittc2dzdHIgIuODh+ODvOOCv+ODmeODvOOCueWcp+e4riIKKworIzogZ2l0LWd1aS5zaDoxOTEyCittc2dpZCAiVmVyaWZ5IERhdGFiYXNlIgorbXNnc3RyICLjg4fjg7zjgr/jg5njg7zjgrnmpJzoqLwiCisKKyM6IGdpdC1ndWkuc2g6MTkxOSBnaXQtZ3VpLnNoOjE5MjMgZ2l0LWd1aS5zaDoxOTI3IGxpYi9zaG9ydGN1dC50Y2w6NworIzogbGliL3Nob3J0Y3V0LnRjbDozOSBsaWIvc2hvcnRjdXQudGNsOjcxCittc2dpZCAiQ3JlYXRlIERlc2t0b3AgSWNvbiIKK21zZ3N0ciAi44OH44K544Kv44OI44OD44OX44O744Ki44Kk44Kz44Oz44KS5L2c44KLIgorCisjOiBnaXQtZ3VpLnNoOjE5MzIgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxNzcgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxODUKK21zZ2lkICJRdWl0IgorbXNnc3RyICLntYLkuoYiCisKKyM6IGdpdC1ndWkuc2g6MTkzOQorbXNnaWQgIlVuZG8iCittc2dzdHIgIuWFg+OBq+aIu+OBmSIKKworIzogZ2l0LWd1aS5zaDoxOTQyCittc2dpZCAiUmVkbyIKK21zZ3N0ciAi44KE44KK55u044GXIgorCisjOiBnaXQtZ3VpLnNoOjE5NDYgZ2l0LWd1aS5zaDoyNDQzCittc2dpZCAiQ3V0IgorbXNnc3RyICLliIfjgorlj5bjgooiCisKKyM6IGdpdC1ndWkuc2g6MTk0OSBnaXQtZ3VpLnNoOjI0NDYgZ2l0LWd1aS5zaDoyNTIwIGdpdC1ndWkuc2g6MjYxNAorIzogbGliL2NvbnNvbGUudGNsOjY5Cittc2dpZCAiQ29weSIKK21zZ3N0ciAi44Kz44OU44O8IgorCisjOiBnaXQtZ3VpLnNoOjE5NTIgZ2l0LWd1aS5zaDoyNDQ5Cittc2dpZCAiUGFzdGUiCittc2dzdHIgIuiyvOOCiuS7mOOBkSIKKworIzogZ2l0LWd1aS5zaDoxOTU1IGdpdC1ndWkuc2g6MjQ1MiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MjYKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MzgKK21zZ2lkICJEZWxldGUiCittc2dzdHIgIuWJiumZpCIKKworIzogZ2l0LWd1aS5zaDoxOTU5IGdpdC1ndWkuc2g6MjQ1NiBnaXQtZ3VpLnNoOjI2MTggbGliL2NvbnNvbGUudGNsOjcxCittc2dpZCAiU2VsZWN0IEFsbCIKK21zZ3N0ciAi5YWo44Gm6YG45oqeIgorCisjOiBnaXQtZ3VpLnNoOjE5NjgKK21zZ2lkICJDcmVhdGUuLi4iCittc2dzdHIgIuS9nOaIkOKApiIKKworIzogZ2l0LWd1aS5zaDoxOTc0Cittc2dpZCAiQ2hlY2tvdXQuLi4iCittc2dzdHIgIuODgeOCp+ODg+OCr+OCouOCpuODiCIKKworIzogZ2l0LWd1aS5zaDoxOTgwCittc2dpZCAiUmVuYW1lLi4uIgorbXNnc3RyICLlkI3liY3lpInmm7TigKYiCisKKyM6IGdpdC1ndWkuc2g6MTk4NSBnaXQtZ3VpLnNoOjIwODUKK21zZ2lkICJEZWxldGUuLi4iCittc2dzdHIgIuWJiumZpOKApiIKKworIzogZ2l0LWd1aS5zaDoxOTkwCittc2dpZCAiUmVzZXQuLi4iCittc2dzdHIgIuODquOCu+ODg+ODiOKApiIKKworIzogZ2l0LWd1aS5zaDoyMDAyIGdpdC1ndWkuc2g6MjM4OQorbXNnaWQgIk5ldyBDb21taXQiCittc2dzdHIgIuaWsOimj+OCs+ODn+ODg+ODiCIKKworIzogZ2l0LWd1aS5zaDoyMDEwIGdpdC1ndWkuc2g6MjM5NgorbXNnaWQgIkFtZW5kIExhc3QgQ29tbWl0IgorbXNnc3RyICLmnIDmlrDjgrPjg5/jg4Pjg4jjgpLoqILmraMiCisKKyM6IGdpdC1ndWkuc2g6MjAxOSBnaXQtZ3VpLnNoOjIzNTYgbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDo5OQorbXNnaWQgIlJlc2NhbiIKK21zZ3N0ciAi5YaN44K544Kt44Oj44OzIgorCisjOiBnaXQtZ3VpLnNoOjIwMjUKK21zZ2lkICJTdGFnZSBUbyBDb21taXQiCittc2dzdHIgIuOCs+ODn+ODg+ODiOS6iOWumuOBmeOCiyIKKworIzogZ2l0LWd1aS5zaDoyMDMxCittc2dpZCAiU3RhZ2UgQ2hhbmdlZCBGaWxlcyBUbyBDb21taXQiCittc2dzdHIgIuWkieabtOOBleOCjOOBn+ODleOCoeOCpOODq+OCkuOCs+ODn+ODg+ODiOS6iOWumiIKKworIzogZ2l0LWd1aS5zaDoyMDM3Cittc2dpZCAiVW5zdGFnZSBGcm9tIENvbW1pdCIKK21zZ3N0ciAi44Kz44Of44OD44OI44GL44KJ6ZmN44KN44GZIgorCisjOiBnaXQtZ3VpLnNoOjIwNDIgbGliL2luZGV4LnRjbDozOTUKK21zZ2lkICJSZXZlcnQgQ2hhbmdlcyIKK21zZ3N0ciAi5aSJ5pu044KS5YWD44Gr5oi744GZIgorCisjOiBnaXQtZ3VpLnNoOjIwNDkgZ2l0LWd1aS5zaDoyMzY4IGdpdC1ndWkuc2g6MjQ2NworbXNnaWQgIlNpZ24gT2ZmIgorbXNnc3RyICLnvbLlkI0iCisKKyM6IGdpdC1ndWkuc2g6MjA1MyBnaXQtZ3VpLnNoOjIzNzIKK21zZ2lkICJDb21taXRAQHZlcmIiCittc2dzdHIgIuOCs+ODn+ODg+ODiCIKKworIzogZ2l0LWd1aS5zaDoyMDY0Cittc2dpZCAiTG9jYWwgTWVyZ2UuLi4iCittc2dzdHIgIuODreODvOOCq+ODq+ODu+ODnuODvOOCuOKApiIKKworIzogZ2l0LWd1aS5zaDoyMDY5Cittc2dpZCAiQWJvcnQgTWVyZ2UuLi4iCittc2dzdHIgIuODnuODvOOCuOS4reatouKApiIKKworIzogZ2l0LWd1aS5zaDoyMDgxCittc2dpZCAiUHVzaC4uLiIKK21zZ3N0ciAi44OX44OD44K344Ol4oCmIgorCisjOiBnaXQtZ3VpLnNoOjIwOTIgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0MQorbXNnaWQgIkFwcGxlIgorbXNnc3RyICLjgorjgpPjgZQiCisKKyM6IGdpdC1ndWkuc2g6MjA5NSBnaXQtZ3VpLnNoOjIxMTcgbGliL2Fib3V0LnRjbDoxNAorIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NCBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjUwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQWJvdXQgJXMiCittc2dzdHIgIiVzIOOBq+OBpOOBhOOBpiIKKworIzogZ2l0LWd1aS5zaDoyMDk5Cittc2dpZCAiUHJlZmVyZW5jZXMuLi4iCittc2dzdHIgIuioreWumuKApiIKKworIzogZ2l0LWd1aS5zaDoyMTA3IGdpdC1ndWkuc2g6MjYzOQorbXNnaWQgIk9wdGlvbnMuLi4iCittc2dzdHIgIuOCquODl+OCt+ODp+ODs+KApiIKKworIzogZ2l0LWd1aS5zaDoyMTEzIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDcKK21zZ2lkICJIZWxwIgorbXNnc3RyICLjg5jjg6vjg5ciCisKKyM6IGdpdC1ndWkuc2g6MjE1NAorbXNnaWQgIk9ubGluZSBEb2N1bWVudGF0aW9uIgorbXNnc3RyICLjgqrjg7Pjg6njgqTjg7Pjg7vjg4njgq3jg6Xjg6Hjg7Pjg4giCisKKyM6IGdpdC1ndWkuc2g6MjIzOAorIywgdGNsLWZvcm1hdAorbXNnaWQgImZhdGFsOiBjYW5ub3Qgc3RhdCBwYXRoICVzOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IgorbXNnc3RyICIiCisi6Ie05ZG955qEOiDjg5HjgrkgJXMg44GMIHN0YXQg44Gn44GN44G+44Gb44KT44CC44Gd44Gu44KI44GG44Gq44OV44Kh44Kk44Or44KE44OH44Kj44Os44Kv44OI44Oq44Gv44GC44KK44G+IgorIuOBm+OCkyIKKworIzogZ2l0LWd1aS5zaDoyMjcxCittc2dpZCAiQ3VycmVudCBCcmFuY2g6IgorbXNnc3RyICLnj77lnKjjga7jg5bjg6njg7Pjg4EiCisKKyM6IGdpdC1ndWkuc2g6MjI5MgorbXNnaWQgIlN0YWdlZCBDaGFuZ2VzIChXaWxsIENvbW1pdCkiCittc2dzdHIgIuOCueODhuODvOOCuOODs+OCsOOBleOCjOOBn++8iOOCs+ODn+ODg+ODiOS6iOWumua4iOOBru+8ieWkieabtCIKKworIzogZ2l0LWd1aS5zaDoyMzEyCittc2dpZCAiVW5zdGFnZWQgQ2hhbmdlcyIKK21zZ3N0ciAi44Kz44Of44OD44OI5LqI5a6a44Gr5YWl44Gj44Gm44GE44Gq44GE5aSJ5pu0IgorCisjOiBnaXQtZ3VpLnNoOjIzNjIKK21zZ2lkICJTdGFnZSBDaGFuZ2VkIgorbXNnc3RyICLlpInmm7TjgpLjgrPjg5/jg4Pjg4jkuojlrprjgavlhaXjgozjgosiCisKKyM6IGdpdC1ndWkuc2g6MjM3OCBsaWIvdHJhbnNwb3J0LnRjbDo5MyBsaWIvdHJhbnNwb3J0LnRjbDoxODIKK21zZ2lkICJQdXNoIgorbXNnc3RyICLjg5fjg4Pjgrfjg6UiCisKKyM6IGdpdC1ndWkuc2g6MjQwOAorbXNnaWQgIkluaXRpYWwgQ29tbWl0IE1lc3NhZ2U6IgorbXNnc3RyICLmnIDliJ3jga7jgrPjg5/jg4Pjg4jjg6Hjg4Pjgrvjg7zjgrg6IgorCisjOiBnaXQtZ3VpLnNoOjI0MDkKK21zZ2lkICJBbWVuZGVkIENvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAi6KiC5q2j44GX44Gf44Kz44Of44OD44OI44Oh44OD44K744O844K4OiIKKworIzogZ2l0LWd1aS5zaDoyNDEwCittc2dpZCAiQW1lbmRlZCBJbml0aWFsIENvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAi6KiC5q2j44GX44Gf5pyA5Yid44Gu44Kz44Of44OD44OI44Oh44OD44K744O844K4OiIKKworIzogZ2l0LWd1aS5zaDoyNDExCittc2dpZCAiQW1lbmRlZCBNZXJnZSBDb21taXQgTWVzc2FnZToiCittc2dzdHIgIuioguato+OBl+OBn+ODnuODvOOCuOOCs+ODn+ODg+ODiOODoeODg+OCu+ODvOOCuDoiCisKKyM6IGdpdC1ndWkuc2g6MjQxMgorbXNnaWQgIk1lcmdlIENvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAi44Oe44O844K444Kz44Of44OD44OI44Oh44OD44K744O844K4OiIKKworIzogZ2l0LWd1aS5zaDoyNDEzCittc2dpZCAiQ29tbWl0IE1lc3NhZ2U6IgorbXNnc3RyICLjgrPjg5/jg4Pjg4jjg6Hjg4Pjgrvjg7zjgrg6IgorCisjOiBnaXQtZ3VpLnNoOjI0NTkgZ2l0LWd1aS5zaDoyNjIyIGxpYi9jb25zb2xlLnRjbDo3MworbXNnaWQgIkNvcHkgQWxsIgorbXNnc3RyICLlhajjgabjgrPjg5Tjg7wiCisKKyM6IGdpdC1ndWkuc2g6MjQ4MyBsaWIvYmxhbWUudGNsOjEwNworbXNnaWQgIkZpbGU6IgorbXNnc3RyICLjg5XjgqHjgqTjg6s6IgorCisjOiBnaXQtZ3VpLnNoOjI1ODkKK21zZ2lkICJBcHBseS9SZXZlcnNlIEh1bmsiCittc2dzdHIgIuODkeODg+ODgeOCkumBqeeUqC/lj5bjgormtojjgZkiCisKKyM6IGdpdC1ndWkuc2g6MjU5NQorbXNnaWQgIlNob3cgTGVzcyBDb250ZXh0IgorbXNnc3RyICLmlofohIjjgpLlsJHjgarjgY8iCisKKyM6IGdpdC1ndWkuc2g6MjYwMgorbXNnaWQgIlNob3cgTW9yZSBDb250ZXh0IgorbXNnc3RyICLmlofohIjjgpLlpJrjgY8iCisKKyM6IGdpdC1ndWkuc2g6MjYxMAorbXNnaWQgIlJlZnJlc2giCittc2dzdHIgIuWGjeiqreOBv+i+vOOBvyIKKworIzogZ2l0LWd1aS5zaDoyNjMxCittc2dpZCAiRGVjcmVhc2UgRm9udCBTaXplIgorbXNnc3RyICLjg5Xjgqnjg7Pjg4jjgpLlsI/jgZXjgY8iCisKKyM6IGdpdC1ndWkuc2g6MjYzNQorbXNnaWQgIkluY3JlYXNlIEZvbnQgU2l6ZSIKK21zZ3N0ciAi44OV44Kp44Oz44OI44KS5aSn44GN44GPIgorCisjOiBnaXQtZ3VpLnNoOjI2NDYKK21zZ2lkICJVbnN0YWdlIEh1bmsgRnJvbSBDb21taXQiCittc2dzdHIgIuODkeODg+ODgeOCkuOCs+ODn+ODg+ODiOS6iOWumuOBi+OCieWkluOBmSIKKworIzogZ2l0LWd1aS5zaDoyNjQ4Cittc2dpZCAiU3RhZ2UgSHVuayBGb3IgQ29tbWl0IgorbXNnc3RyICLjg5Hjg4Pjg4HjgpLjgrPjg5/jg4Pjg4jkuojlrprjgavliqDjgYjjgosiCisKKyM6IGdpdC1ndWkuc2g6MjY2NworbXNnaWQgIkluaXRpYWxpemluZy4uLiIKK21zZ3N0ciAi5Yid5pyf5YyW44GX44Gm44GE44G+44GZ4oCmIgorCisjOiBnaXQtZ3VpLnNoOjI3NjIKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiUG9zc2libGUgZW52aXJvbm1lbnQgaXNzdWVzIGV4aXN0LlxuIgorIlxuIgorIlRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBwcm9iYWJseVxuIgorImdvaW5nIHRvIGJlIGlnbm9yZWQgYnkgYW55IEdpdCBzdWJwcm9jZXNzIHJ1blxuIgorImJ5ICVzOlxuIgorIlxuIgorbXNnc3RyICIiCisi55Kw5aKD44Gr5ZWP6aGM44GM44GC44KL5Y+v6IO95oCn44GM44GC44KK44G+44GZXG4iCisiXG4iCisi5Lul5LiL44Gu55Kw5aKD5aSJ5pWw44GvICVzIOOBjOi1t+WLleOBmeOCiyBHaXQg44K144OW44OX44Ot44K744K544Gr44KI44Gj44Gm54Sh6KaW44GV44KM44KL44Gn44GX44KH44GGOlxuIgorIlxuIgorCisjOiBnaXQtZ3VpLnNoOjI3OTIKK21zZ2lkICIiCisiXG4iCisiVGhpcyBpcyBkdWUgdG8gYSBrbm93biBpc3N1ZSB3aXRoIHRoZVxuIgorIlRjbCBiaW5hcnkgZGlzdHJpYnV0ZWQgYnkgQ3lnd2luLiIKK21zZ3N0ciAiIgorIlxuIgorIuOBk+OCjOOBryBDeWd3aW4g44Gn6YWN5biD44GV44KM44Gm44GE44KLIFRjbCDjg5DjgqTjg4rjg6rjgatcbiIKKyLplqLjgZfjgabjga7ml6Lnn6Xjga7llY/poYzjgavjgojjgorjgb7jgZkiCisKKyM6IGdpdC1ndWkuc2g6Mjc5NworIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJcbiIKKyJBIGdvb2QgcmVwbGFjZW1lbnQgZm9yICVzXG4iCisiaXMgcGxhY2luZyB2YWx1ZXMgZm9yIHRoZSB1c2VyLm5hbWUgYW5kXG4iCisidXNlci5lbWFpbCBzZXR0aW5ncyBpbnRvIHlvdXIgcGVyc29uYWxcbiIKKyJ+Ly5naXRjb25maWcgZmlsZS5cbiIKK21zZ3N0ciAiIgorIlxuIgorIlxuIgorIuWAi+S6uueahOOBqiB+Ly5naXRjb25maWcg44OV44Kh44Kk44Or5YaF44GnIHVzZXIubmFtZSDjgaggdXNlci5lbWFpbCDjga7lgKTjgpLoqK3lrppcbiIKKyLjgZnjgovjga7jgYzjgIElcyDjga7oia/jgYTku6PnlKjjgajjgarjgorjgb7jgZlcbiIKKworIzogbGliL2Fib3V0LnRjbDoyNgorbXNnaWQgImdpdC1ndWkgLSBhIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZSBmb3IgR2l0LiIKK21zZ3N0ciAiR2l0IOOBruOCsOODqeODleOCo+OCq+ODq1VJIGdpdC1ndWkiCisKKyM6IGxpYi9ibGFtZS50Y2w6NzcKK21zZ2lkICJGaWxlIFZpZXdlciIKK21zZ3N0ciAi44OV44Kh44Kk44Or44OU44Ol44O844OvIgorCisjOiBsaWIvYmxhbWUudGNsOjgxCittc2dpZCAiQ29tbWl0OiIKK21zZ3N0ciAi44Kz44Of44OD44OIOiIKKworIzogbGliL2JsYW1lLnRjbDoyNjQKK21zZ2lkICJDb3B5IENvbW1pdCIKK21zZ3N0ciAi44Kz44Of44OD44OI44KS44Kz44OU44O8IgorCisjOiBsaWIvYmxhbWUudGNsOjM4NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIlJlYWRpbmcgJXMuLi4iCittc2dzdHIgIiVzIOOCkuiqreOCk+OBp+OBhOOBvuOBmeKApiIKKworIzogbGliL2JsYW1lLnRjbDo0ODgKK21zZ2lkICJMb2FkaW5nIGNvcHkvbW92ZSB0cmFja2luZyBhbm5vdGF0aW9ucy4uLiIKK21zZ3N0ciAi44Kz44OU44O844O756e75YuV6L+96Leh44OH44O844K/44KS6Kqt44KT44Gn44GE44G+44GZ4oCmIgorCisjOiBsaWIvYmxhbWUudGNsOjUwOAorbXNnaWQgImxpbmVzIGFubm90YXRlZCIKK21zZ3N0ciAi6KGM44KS5rOo6YeI44GX44G+44GX44GfIgorCisjOiBsaWIvYmxhbWUudGNsOjY4OQorbXNnaWQgIkxvYWRpbmcgb3JpZ2luYWwgbG9jYXRpb24gYW5ub3RhdGlvbnMuLi4iCittc2dzdHIgIuWFg+S9jee9ruihjOOBruazqOmHiOODh+ODvOOCv+OCkuiqreOCk+OBp+OBhOOBvuOBmeKApiIKKworIzogbGliL2JsYW1lLnRjbDo2OTIKK21zZ2lkICJBbm5vdGF0aW9uIGNvbXBsZXRlLiIKK21zZ3N0ciAi5rOo6YeI5a6M5LqG44GX44G+44GX44GfIgorCisjOiBsaWIvYmxhbWUudGNsOjc0NgorbXNnaWQgIkxvYWRpbmcgYW5ub3RhdGlvbi4uLiIKK21zZ3N0ciAi5rOo6YeI44KS6Kqt44G/6L6844KT44Gn44GE44G+44GZ4oCmIgorCisjOiBsaWIvYmxhbWUudGNsOjgwMgorbXNnaWQgIkF1dGhvcjoiCittc2dzdHIgIuS9nOiAhToiCisKKyM6IGxpYi9ibGFtZS50Y2w6ODA2Cittc2dpZCAiQ29tbWl0dGVyOiIKK21zZ3N0ciAi44Kz44Of44OD44OI6ICFOiIKKworIzogbGliL2JsYW1lLnRjbDo4MTEKK21zZ2lkICJPcmlnaW5hbCBGaWxlOiIKK21zZ3N0ciAi5YWD44OV44Kh44Kk44OrIgorCisjOiBsaWIvYmxhbWUudGNsOjkyNQorbXNnaWQgIk9yaWdpbmFsbHkgQnk6IgorbXNnc3RyICLljp/kvZzogIU6IgorCisjOiBsaWIvYmxhbWUudGNsOjkzMQorbXNnaWQgIkluIEZpbGU6IgorbXNnc3RyICLjg5XjgqHjgqTjg6s6IgorCisjOiBsaWIvYmxhbWUudGNsOjkzNgorbXNnaWQgIkNvcGllZCBPciBNb3ZlZCBIZXJlIEJ5OiIKK21zZ3N0ciAi6KSH5YaZ44O756e75YuV6ICFOiIKKworIzogbGliL2JyYW5jaF9jaGVja291dC50Y2w6MTQgbGliL2JyYW5jaF9jaGVja291dC50Y2w6MTkKK21zZ2lkICJDaGVja291dCBCcmFuY2giCittc2dzdHIgIuODluODqeODs+ODgeOCkuODgeOCp+ODg+OCr+OCouOCpuODiCIKKworIzogbGliL2JyYW5jaF9jaGVja291dC50Y2w6MjMKK21zZ2lkICJDaGVja291dCIKK21zZ3N0ciAi44OB44Kn44OD44Kv44Ki44Km44OIIgorCisjOiBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDoyNyBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MzUKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDozMiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MzAgbGliL2Jyb3dzZXIudGNsOjI4MgorIzogbGliL2NoZWNrb3V0X29wLnRjbDo1MjIgbGliL2Nob29zZV9mb250LnRjbDo0MyBsaWIvbWVyZ2UudGNsOjE3MQorIzogbGliL29wdGlvbi50Y2w6MTAzIGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6NDIgbGliL3RyYW5zcG9ydC50Y2w6OTcKK21zZ2lkICJDYW5jZWwiCittc2dzdHIgIuS4reatoiIKKworIzogbGliL2JyYW5jaF9jaGVja291dC50Y2w6MzIgbGliL2Jyb3dzZXIudGNsOjI4NworbXNnaWQgIlJldmlzaW9uIgorbXNnc3RyICLjg6rjg5Pjgrjjg6fjg7MiCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjM2IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo2OSBsaWIvb3B0aW9uLnRjbDoyNDIKK21zZ2lkICJPcHRpb25zIgorbXNnc3RyICLjgqrjg5fjgrfjg6fjg7MiCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjM5IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo5MgorbXNnaWQgIkZldGNoIFRyYWNraW5nIEJyYW5jaCIKK21zZ3N0ciAi44OI44Op44OD44Kt44Oz44Kw44O744OW44Op44Oz44OB44KS44OV44Kn44OD44OBIgorCisjOiBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDo0NAorbXNnaWQgIkRldGFjaCBGcm9tIExvY2FsIEJyYW5jaCIKK21zZ3N0ciAi44Ot44O844Kr44Or44O744OW44Op44Oz44OB44GL44KJ5YmK6ZmkIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MjIKK21zZ2lkICJDcmVhdGUgQnJhbmNoIgorbXNnc3RyICLjg5bjg6njg7Pjg4HjgpLkvZzmiJAiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDoyNworbXNnaWQgIkNyZWF0ZSBOZXcgQnJhbmNoIgorbXNnc3RyICLjg5bjg6njg7Pjg4HjgpLmlrDopo/kvZzmiJAiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDozMSBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjM3MQorbXNnaWQgIkNyZWF0ZSIKK21zZ3N0ciAi5L2c5oiQIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NDAKK21zZ2lkICJCcmFuY2ggTmFtZSIKK21zZ3N0ciAi44OW44Op44Oz44OB5ZCNIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NDMKK21zZ2lkICJOYW1lOiIKK21zZ3N0ciAi5ZCN5YmNOiIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjU4Cittc2dpZCAiTWF0Y2ggVHJhY2tpbmcgQnJhbmNoIE5hbWUiCittc2dzdHIgIuODiOODqeODg+OCreODs+OCsOODu+ODluODqeODs+ODgeWQjeOCkuWQiOOCj+OBm+OCiyIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjY2Cittc2dpZCAiU3RhcnRpbmcgUmV2aXNpb24iCittc2dzdHIgIuWIneacn+ODquODk+OCuOODp+ODsyIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjcyCittc2dpZCAiVXBkYXRlIEV4aXN0aW5nIEJyYW5jaDoiCittc2dzdHIgIuaXouWtmOOBruODluODqeODs+ODgeOCkuabtOaWsDoiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo3NQorbXNnaWQgIk5vIgorbXNnc3RyICLjgYTjgYTjgYgiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo4MAorbXNnaWQgIkZhc3QgRm9yd2FyZCBPbmx5IgorbXNnc3RyICLml6npgIHjgorjga7jgb8iCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo4NSBsaWIvY2hlY2tvdXRfb3AudGNsOjUxNAorbXNnaWQgIlJlc2V0IgorbXNnc3RyICLjg6rjgrvjg4Pjg4giCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo5NworbXNnaWQgIkNoZWNrb3V0IEFmdGVyIENyZWF0aW9uIgorbXNnc3RyICLkvZzmiJDjgZfjgabjgZnjgZDjg4Hjgqfjg4Pjgq/jgqLjgqbjg4giCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDoxMzEKK21zZ2lkICJQbGVhc2Ugc2VsZWN0IGEgdHJhY2tpbmcgYnJhbmNoLiIKK21zZ3N0ciAi44OI44Op44OD44Kt44Oz44Kw44O744OW44Op44Oz44OB44KS6YG45oqe44GX44Gm5LiL44GV44GE44CCIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MTQwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVHJhY2tpbmcgYnJhbmNoICVzIGlzIG5vdCBhIGJyYW5jaCBpbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnkuIgorbXNnc3RyICLjg4jjg6njg4Pjgq3jg7PjgrDjg7vjg5bjg6njg7Pjg4EgJXMg44Gv6YGg6ZqU44Oq44Od44K444OI44Oq44Gu44OW44Op44Oz44OB44Gn44Gv44GC44KK44G+44Gb44KT44CCIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MTUzIGxpYi9icmFuY2hfcmVuYW1lLnRjbDo4NgorbXNnaWQgIlBsZWFzZSBzdXBwbHkgYSBicmFuY2ggbmFtZS4iCittc2dzdHIgIuODluODqeODs+ODgeWQjeOCkuaMh+WumuOBl+OBpuS4i+OBleOBhOOAgiIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjE2NCBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MTA2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiJyVzJyBpcyBub3QgYW4gYWNjZXB0YWJsZSBicmFuY2ggbmFtZS4iCittc2dzdHIgIiclcycg44Gv44OW44Op44Oz44OB5ZCN44Gr5L2/44GI44G+44Gb44KT44CCIgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MTUKK21zZ2lkICJEZWxldGUgQnJhbmNoIgorbXNnc3RyICLjg5bjg6njg7Pjg4HliYrpmaQiCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDoyMAorbXNnaWQgIkRlbGV0ZSBMb2NhbCBCcmFuY2giCittc2dzdHIgIuODreODvOOCq+ODq+ODu+ODluODqeODs+ODgeOCkuWJiumZpCIKKworIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjM3Cittc2dpZCAiTG9jYWwgQnJhbmNoZXMiCittc2dzdHIgIuODreODvOOCq+ODq+ODu+ODluODqeODs+ODgSIKKworIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjUyCittc2dpZCAiRGVsZXRlIE9ubHkgSWYgTWVyZ2VkIEludG8iCittc2dzdHIgIuODnuODvOOCuOa4iOOBv+OBruaZguOBruOBv+WJiumZpCIKKworIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjU0Cittc2dpZCAiQWx3YXlzIChEbyBub3QgcGVyZm9ybSBtZXJnZSB0ZXN0LikiCittc2dzdHIgIueEoeadoeS7tijjg57jg7zjgrjjg4bjgrnjg4jjgZfjgarjgYQpIgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MTAzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVGhlIGZvbGxvd2luZyBicmFuY2hlcyBhcmUgbm90IGNvbXBsZXRlbHkgbWVyZ2VkIGludG8gJXM6IgorbXNnc3RyICLku6XkuIvjga7jg5bjg6njg7Pjg4Hjga8gJXMg44Gr5a6M5YWo44Gr44Oe44O844K444GV44KM44Gm44GE44G+44Gb44KTOiIKKworIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjExNQorbXNnaWQgIiIKKyJSZWNvdmVyaW5nIGRlbGV0ZWQgYnJhbmNoZXMgaXMgZGlmZmljdWx0LiBcbiIKKyJcbiIKKyIgRGVsZXRlIHRoZSBzZWxlY3RlZCBicmFuY2hlcz8iCittc2dzdHIgIiIKKyLjg5bjg6njg7Pjg4HjgpLliYrpmaTjgZnjgovjgajlhYPjgavmiLvjgZnjga7jga/lm7Dpm6PjgafjgZnjgIIgXG4iCisiXG4iCisiIOmBuOaKnuOBl+OBn+ODluODqeODs+ODgeOCkuWJiumZpOOBl+OBvuOBmeOBi++8nyIKKworIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjE0MQorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZGVsZXRlIGJyYW5jaGVzOlxuIgorIiVzIgorbXNnc3RyICIiCisi5Lul5LiL44Gu44OW44Op44Oz44OB44KS5YmK6Zmk44Gn44GN44G+44Gb44KTOlxuIgorIiVzIgorCisjOiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MTQgbGliL2JyYW5jaF9yZW5hbWUudGNsOjIyCittc2dpZCAiUmVuYW1lIEJyYW5jaCIKK21zZ3N0ciAi44OW44Op44Oz44OB44Gu5ZCN5YmN5aSJ5pu0IgorCisjOiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MjYKK21zZ2lkICJSZW5hbWUiCittc2dzdHIgIuWQjeWJjeWkieabtCIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjM2Cittc2dpZCAiQnJhbmNoOiIKK21zZ3N0ciAi44OW44Op44Oz44OBOiIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjM5Cittc2dpZCAiTmV3IE5hbWU6IgorbXNnc3RyICLmlrDjgZfjgYTlkI3liY06IgorCisjOiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6NzUKK21zZ2lkICJQbGVhc2Ugc2VsZWN0IGEgYnJhbmNoIHRvIHJlbmFtZS4iCittc2dzdHIgIuWQjeWJjeOCkuWkieabtOOBmeOCi+ODluODqeODs+ODgeOCkumBuOOCk+OBp+S4i+OBleOBhOOAgiIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjk2IGxpYi9jaGVja291dF9vcC50Y2w6MTc5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQnJhbmNoICclcycgYWxyZWFkeSBleGlzdHMuIgorbXNnc3RyICInJXMn44Go44GE44GG44OW44Op44Oz44OB44Gv5pei44Gr5a2Y5Zyo44GX44G+44GZ44CCIgorCisjOiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MTE3CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHJlbmFtZSAnJXMnLiIKK21zZ3N0ciAiJyVzJ+OBruWQjeWJjeWkieabtOOBq+WkseaVl+OBl+OBvuOBl+OBn+OAgiIKKworIzogbGliL2Jyb3dzZXIudGNsOjE3Cittc2dpZCAiU3RhcnRpbmcuLi4iCittc2dzdHIgIui1t+WLleS4reKApiIKKworIzogbGliL2Jyb3dzZXIudGNsOjI2Cittc2dpZCAiRmlsZSBCcm93c2VyIgorbXNnc3RyICLjg5XjgqHjgqTjg6vjg7vjg5bjg6njgqbjgrYiCisKKyM6IGxpYi9icm93c2VyLnRjbDoxMjYgbGliL2Jyb3dzZXIudGNsOjE0MworIywgdGNsLWZvcm1hdAorbXNnaWQgIkxvYWRpbmcgJXMuLi4iCittc2dzdHIgIiVzIOOCkuODreODvOODieS4reKApiIKKworIzogbGliL2Jyb3dzZXIudGNsOjE4NworbXNnaWQgIltVcCBUbyBQYXJlbnRdIgorbXNnc3RyICJb5LiK5L2N44OV44Kp44Or44OA44G4XSIKKworIzogbGliL2Jyb3dzZXIudGNsOjI2NyBsaWIvYnJvd3Nlci50Y2w6MjczCittc2dpZCAiQnJvd3NlIEJyYW5jaCBGaWxlcyIKK21zZ3N0ciAi54++5Zyo44Gu44OW44Op44Oz44OB44Gu44OV44Kh44Kk44Or44KS6KaL44KLIgorCisjOiBsaWIvYnJvd3Nlci50Y2w6Mjc4IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6Mzg3CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ3NCBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ4NAorIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5ODcKK21zZ2lkICJCcm93c2UiCittc2dzdHIgIuODluODqeOCpuOCuiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDo3OQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkZldGNoaW5nICVzIGZyb20gJXMiCittc2dzdHIgIiVzIOOBi+OCiSAlcyDjgpLjg5Xjgqfjg4Pjg4HjgZfjgabjgYTjgb7jgZkiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MTI3CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiZmF0YWw6IENhbm5vdCByZXNvbHZlICVzIgorbXNnc3RyICLoh7Tlkb3nmoTjgqjjg6njg7w6ICVzIOOCkuino+axuuOBp+OBjeOBvuOBm+OCkyIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoxNDAgbGliL2NvbnNvbGUudGNsOjgxIGxpYi9kYXRhYmFzZS50Y2w6MzEKK21zZ2lkICJDbG9zZSIKK21zZ3N0ciAi6ZaJ44GY44KLIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjE2OQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkJyYW5jaCAnJXMnIGRvZXMgbm90IGV4aXN0LiIKK21zZ3N0ciAi44OW44Op44Oz44OBJyVzJ+OBr+WtmOWcqOOBl+OBvuOBm+OCk+OAgiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoyMDYKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiQnJhbmNoICclcycgYWxyZWFkeSBleGlzdHMuXG4iCisiXG4iCisiSXQgY2Fubm90IGZhc3QtZm9yd2FyZCB0byAlcy5cbiIKKyJBIG1lcmdlIGlzIHJlcXVpcmVkLiIKK21zZ3N0ciAiIgorIuODluODqeODs+ODgSAnJXMnIOOBr+aXouOBq+WtmOWcqOOBl+OBvuOBmeOAglxuIgorIlxuIgorIiVzIOOBq+aXqemAgeOCiuOBp+OBjeOBvuOBm+OCk+OAglxuIgorIuODnuODvOOCuOOBjOW/heimgeOBp+OBmeOAgiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoyMjAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJNZXJnZSBzdHJhdGVneSAnJXMnIG5vdCBzdXBwb3J0ZWQuIgorbXNnc3RyICInJXMnIOODnuODvOOCuOaIpueVpeOBr+OCteODneODvOODiOOBleOCjOOBpuOBhOOBvuOBm+OCk+OAgiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoyMzkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gdXBkYXRlICclcycuIgorbXNnc3RyICInJXMnIOOBruabtOaWsOOBq+WkseaVl+OBl+OBvuOBl+OBn+OAgiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoyNTEKK21zZ2lkICJTdGFnaW5nIGFyZWEgKGluZGV4KSBpcyBhbHJlYWR5IGxvY2tlZC4iCittc2dzdHIgIuOCpOODs+ODh+ODg+OCr+OCueOBr+aXouOBq+ODreODg+OCr+OBleOCjOOBpuOBhOOBvuOBmeOAgiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoyNjYKK21zZ2lkICIiCisiTGFzdCBzY2FubmVkIHN0YXRlIGRvZXMgbm90IG1hdGNoIHJlcG9zaXRvcnkgc3RhdGUuXG4iCisiXG4iCisiQW5vdGhlciBHaXQgcHJvZ3JhbSBoYXMgbW9kaWZpZWQgdGhpcyByZXBvc2l0b3J5IHNpbmNlIHRoZSBsYXN0IHNjYW4uICBBICIKKyJyZXNjYW4gbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIHRoZSBjdXJyZW50IGJyYW5jaCBjYW4gYmUgY2hhbmdlZC5cbiIKKyJcbiIKKyJUaGUgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIG5vdy5cbiIKK21zZ3N0ciAiIgorIuacgOW+jOOBq+OCueOCreODo+ODs+OBl+OBn+eKtuaFi+OBr+ODquODneOCuOODiOODquOBrueKtuaFi+OBqOWQiOiHtOOBl+OBvuOBm+OCk+OAglxuIgorIlxuIgorIuacgOW+jOOBq+OCueOCreODo+ODs+OBl+OBpuS7peW+jOOAgeWIpeOBriBHaXQg44OX44Ot44Kw44Op44Og44GM44Oq44Od44K444OI44Oq44KS5aSJ5pu044GX44Gm44GE44G+44GZ44CC54++5ZyoIgorIuOBruODluODqeODs+ODgeOCkuWkieabtOOBmeOCi+WJjeOBq+OAgeWGjeOCueOCreODo+ODs+OBjOW/heimgeOBp+OBmeOAglxuIgorIlxuIgorIuiHquWLleeahOOBq+WGjeOCueOCreODo+ODs+OCkumWi+Wni+OBl+OBvuOBmeOAglxuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjMyMgorIywgdGNsLWZvcm1hdAorbXNnaWQgIlVwZGF0aW5nIHdvcmtpbmcgZGlyZWN0b3J5IHRvICclcycuLi4iCittc2dzdHIgIuS9nOalreODh+OCo+ODrOOCr+ODiOODquOCkiAnJXMnIOOBq+abtOaWsOOBl+OBpuOBhOOBvuOBmeKApiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDozMjMKK21zZ2lkICJmaWxlcyBjaGVja2VkIG91dCIKK21zZ3N0ciAi44OB44Kn44OD44Kv44Ki44Km44OI44GV44KM44Gf44OV44Kh44Kk44OrIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjM1MworIywgdGNsLWZvcm1hdAorbXNnaWQgIkFib3J0ZWQgY2hlY2tvdXQgb2YgJyVzJyAoZmlsZSBsZXZlbCBtZXJnaW5nIGlzIHJlcXVpcmVkKS4iCittc2dzdHIgIiclcycg44Gu44OB44Kn44OD44Kv44Ki44Km44OI44KS5Lit5q2i44GX44G+44GX44Gf77yI44OV44Kh44Kk44Or5q+O44Gu44Oe44O844K444GM5b+F6KaB44Gn44GZ77yJ44CCIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjM1NAorbXNnaWQgIkZpbGUgbGV2ZWwgbWVyZ2UgcmVxdWlyZWQuIgorbXNnc3RyICLjg5XjgqHjgqTjg6vmr47jga7jg57jg7zjgrjjgYzlv4XopoHjgafjgZnjgIIiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MzU4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiU3RheWluZyBvbiBicmFuY2ggJyVzJy4iCittc2dzdHIgIuODluODqeODs+ODgSAnJXMnIOOBq+a7nuOBvuOCiuOBvuOBmeOAgiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDo0MjkKK21zZ2lkICIiCisiWW91IGFyZSBubyBsb25nZXIgb24gYSBsb2NhbCBicmFuY2guXG4iCisiXG4iCisiSWYgeW91IHdhbnRlZCB0byBiZSBvbiBhIGJyYW5jaCwgY3JlYXRlIG9uZSBub3cgc3RhcnRpbmcgZnJvbSAnVGhpcyBEZXRhY2hlZCAiCisiQ2hlY2tvdXQnLiIKK21zZ3N0ciAiIgorIuODreODvOOCq+ODq+ODu+ODluODqeODs+ODgeOBi+OCiembouOCjOOBvuOBmeOAglxuIgorIlxuIgorIuODluODqeODs+ODgeS4iuOBq+a7nuOBvuOCiuOBn+OBhOOBqOOBjeOBr+OAgeOBk+OBruOAjOWIhumbouOBleOCjOOBn+ODgeOCp+ODg+OCr+OCouOCpuODiOOAjeOBi+OCieaWsOimj+ODluODqeODsyIKKyLjg4HjgpLplovlp4vjgZfjgabjgY/jgaDjgZXjgYTjgIIiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NDQ2IGxpYi9jaGVja291dF9vcC50Y2w6NDUwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQ2hlY2tlZCBvdXQgJyVzJy4iCittc2dzdHIgIiclcycg44KS44OB44Kn44OD44Kv44Ki44Km44OI44GX44G+44GX44GfIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjQ3OAorIywgdGNsLWZvcm1hdAorbXNnaWQgIlJlc2V0dGluZyAnJXMnIHRvICclcycgd2lsbCBsb3NlIHRoZSBmb2xsb3dpbmcgY29tbWl0czoiCittc2dzdHIgIiclcycg44KSICclcycg44Gr44Oq44K744OD44OI44GZ44KL44Go44CB5Lul5LiL44Gu44Kz44Of44OD44OI44GM5aSx44Gq44KP44KM44G+44GZOiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDo1MDAKK21zZ2lkICJSZWNvdmVyaW5nIGxvc3QgY29tbWl0cyBtYXkgbm90IGJlIGVhc3kuIgorbXNnc3RyICLlpLHjgarjgo/jgozjgZ/jgrPjg5/jg4Pjg4jjgpLlm57lvqnjgZnjgovjga7jga/nsKHljZjjgafjga/jgYLjgorjgb7jgZvjgpPjgIIiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NTA1CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUmVzZXQgJyVzJz8iCittc2dzdHIgIiclcycg44KS44Oq44K744OD44OI44GX44G+44GZ44GL77yfIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjUxMCBsaWIvbWVyZ2UudGNsOjE2MworbXNnaWQgIlZpc3VhbGl6ZSIKK21zZ3N0ciAi5Y+v6KaW5YyWIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjU3OAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgYnJhbmNoLlxuIgorIlxuIgorIlRoaXMgd29ya2luZyBkaXJlY3RvcnkgaXMgb25seSBwYXJ0aWFsbHkgc3dpdGNoZWQuICBXZSBzdWNjZXNzZnVsbHkgdXBkYXRlZCAiCisieW91ciBmaWxlcywgYnV0IGZhaWxlZCB0byB1cGRhdGUgYW4gaW50ZXJuYWwgR2l0IGZpbGUuXG4iCisiXG4iCisiVGhpcyBzaG91bGQgbm90IGhhdmUgb2NjdXJyZWQuICAlcyB3aWxsIG5vdyBjbG9zZSBhbmQgZ2l2ZSB1cC4iCittc2dzdHIgIiIKKyLnj77lnKjjga7jg5bjg6njg7Pjg4HjgpLoqK3lrprjgafjgY3jgb7jgZvjgpPjgIJcbiIKKyJcbiIKKyLkvZzmpa3jg4fjgqPjg6zjgq/jg4jjg6rjga/pg6jliIbnmoTjgavjgZfjgYvliIfjgormm7/jgo/jgaPjgabjgYTjgb7jgZvjgpPjgILjg5XjgqHjgqTjg6vjga7mm7TmlrDjgavjga/miJDlip/jgZciCisi44G+44GX44Gf44GM44CBIEdpdCDjga7lhoXpg6jjg4fjg7zjgr/jgpLmm7TmlrDjgafjgY3jgb7jgZvjgpPjgafjgZfjgZ/jgIJcbiIKKyLotbfjgZPjgovjga/jgZrjga7jgarjgYTjgqjjg6njg7zjgafjgZnjgILjgYLjgY3jgonjgoHjgaYgJXMg44KS57WC5LqG44GX44G+44GZ44CCIgorCisjOiBsaWIvY2hvb3NlX2ZvbnQudGNsOjM5Cittc2dpZCAiU2VsZWN0IgorbXNnc3RyICLpgbjmip4iCisKKyM6IGxpYi9jaG9vc2VfZm9udC50Y2w6NTMKK21zZ2lkICJGb250IEZhbWlseSIKK21zZ3N0ciAi44OV44Kp44Oz44OI44O744OV44Kh44Of44Oq44O8IgorCisjOiBsaWIvY2hvb3NlX2ZvbnQudGNsOjc0Cittc2dpZCAiRm9udCBTaXplIgorbXNnc3RyICLjg5Xjgqnjg7Pjg4jjga7lpKfjgY3jgZUiCisKKyM6IGxpYi9jaG9vc2VfZm9udC50Y2w6OTEKK21zZ2lkICJGb250IEV4YW1wbGUiCittc2dzdHIgIuODleOCqeODs+ODiOODu+OCteODs+ODl+ODqyIKKworIzogbGliL2Nob29zZV9mb250LnRjbDoxMDMKK21zZ2lkICIiCisiVGhpcyBpcyBleGFtcGxlIHRleHQuXG4iCisiSWYgeW91IGxpa2UgdGhpcyB0ZXh0LCBpdCBjYW4gYmUgeW91ciBmb250LiIKK21zZ3N0ciAiIgorIuOBk+OCjOOBr+OCteODs+ODl+ODq+aWh+OBp+OBmeOAglxuIgorIuOBk+OBruODleOCqeODs+ODiOOBjOawl+OBq+WFpeOCjOOBsOOBiuS9v+OBhOOBq+OBquOCjOOBvuOBmeOAgiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoyOAorbXNnaWQgIkdpdCBHdWkiCittc2dzdHIgIkdpdCBHVUkiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODEgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozNzYKK21zZ2lkICJDcmVhdGUgTmV3IFJlcG9zaXRvcnkiCittc2dzdHIgIuaWsOOBl+OBhOODquODneOCuOODiOODquOCkuS9nOOCiyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo4NworbXNnaWQgIk5ldy4uLiIKK21zZ3N0ciAi5paw6KaP4oCmIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjk0IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDYwCittc2dpZCAiQ2xvbmUgRXhpc3RpbmcgUmVwb3NpdG9yeSIKK21zZ3N0ciAi5pei5a2Y44Oq44Od44K444OI44Oq44KS6KSH6KO944GZ44KLIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEwMAorbXNnaWQgIkNsb25lLi4uIgorbXNnc3RyICLopIfoo73igKYiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTA3IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTc2Cittc2dpZCAiT3BlbiBFeGlzdGluZyBSZXBvc2l0b3J5IgorbXNnc3RyICLml6LlrZjjg6rjg53jgrjjg4jjg6rjgpLplovjgY8iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTEzCittc2dpZCAiT3Blbi4uLiIKK21zZ3N0ciAi6ZaL44GP4oCmIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEyNgorbXNnaWQgIlJlY2VudCBSZXBvc2l0b3JpZXMiCittc2dzdHIgIuacgOi/keS9v+OBo+OBn+ODquODneOCuOODiOODqiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMzIKK21zZ2lkICJPcGVuIFJlY2VudCBSZXBvc2l0b3J5OiIKK21zZ3N0ciAi5pyA6L+R5L2/44Gj44Gf44Oq44Od44K444OI44Oq44KS6ZaL44GPIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjI5NiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjMwMworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozMTAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY3JlYXRlIHJlcG9zaXRvcnkgJXM6IgorbXNnc3RyICLjg6rjg53jgrjjg4jjg6ogJXMg44KS5L2c6KO944Gn44GN44G+44Gb44KTOiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozODEgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NzgKK21zZ2lkICJEaXJlY3Rvcnk6IgorbXNnc3RyICLjg4fjgqPjg6zjgq/jg4jjg6o6IgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQxMiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjUzNworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMDExCittc2dpZCAiR2l0IFJlcG9zaXRvcnkiCittc2dzdHIgIkdJVCDjg6rjg53jgrjjg4jjg6oiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDM3CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRGlyZWN0b3J5ICVzIGFscmVhZHkgZXhpc3RzLiIKK21zZ3N0ciAi44OH44Kj44Os44Kv44OI44OqICclcycg44Gv5pei44Gr5a2Y5Zyo44GX44G+44GZ44CCIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ0MQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkZpbGUgJXMgYWxyZWFkeSBleGlzdHMuIgorbXNnc3RyICLjg5XjgqHjgqTjg6sgJyVzJyDjga/ml6LjgavlrZjlnKjjgZfjgb7jgZnjgIIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDU1Cittc2dpZCAiQ2xvbmUiCittc2dzdHIgIuikh+ijvSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NjgKK21zZ2lkICJVUkw6IgorbXNnc3RyICJVUkw6IgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ4OQorbXNnaWQgIkNsb25lIFR5cGU6IgorbXNnc3RyICLopIfoo73mlrnlvI86IgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ5NQorbXNnaWQgIlN0YW5kYXJkIChGYXN0LCBTZW1pLVJlZHVuZGFudCwgSGFyZGxpbmtzKSIKK21zZ3N0ciAi5qiZ5rqWKOmrmOmAn+ODu+S4reWGl+mVt+W6puODu+ODj+ODvOODieODquODs+OCrykiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTAxCittc2dpZCAiRnVsbCBDb3B5IChTbG93ZXIsIFJlZHVuZGFudCBCYWNrdXApIgorbXNnc3RyICLlhajopIflhpko5L2O6YCf44O75YaX6ZW344OQ44OD44Kv44Ki44OD44OXKSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1MDcKK21zZ2lkICJTaGFyZWQgKEZhc3Rlc3QsIE5vdCBSZWNvbW1lbmRlZCwgTm8gQmFja3VwKSIKK21zZ3N0ciAi5YWx5pyJKOacgOmrmOmAn+ODu+mdnuaOqOWlqOODu+ODkOODg+OCr+OCouODg+ODl+eEoeOBlykiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTQzIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTkwCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjczNiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjgwNgorIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMDE3IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTAyNQorIywgdGNsLWZvcm1hdAorbXNnaWQgIk5vdCBhIEdpdCByZXBvc2l0b3J5OiAlcyIKK21zZ3N0ciAiR2l0IOODquODneOCuOODiOODquOBp+OBr+OBguOCiuOBvuOBm+OCkzogJXMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTc5Cittc2dpZCAiU3RhbmRhcmQgb25seSBhdmFpbGFibGUgZm9yIGxvY2FsIHJlcG9zaXRvcnkuIgorbXNnc3RyICLmqJnmupbmlrnlvI/jga/lkIzkuIDoqIjnrpfmqZ/kuIrjga7jg6rjg53jgrjjg4jjg6rjgavjga7jgb/kvb/jgYjjgb7jgZnjgIIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTgzCittc2dpZCAiU2hhcmVkIG9ubHkgYXZhaWxhYmxlIGZvciBsb2NhbCByZXBvc2l0b3J5LiIKK21zZ3N0ciAi5YWx5pyJ5pa55byP44Gv5ZCM5LiA6KiI566X5qmf5LiK44Gu44Oq44Od44K444OI44Oq44Gr44Gu44G/5L2/44GI44G+44GZ44CCIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjYwNAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkxvY2F0aW9uICVzIGFscmVhZHkgZXhpc3RzLiIKK21zZ3N0ciAiJyVzJyDjga/ml6LjgavlrZjlnKjjgZfjgb7jgZnjgIIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NjE1Cittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBvcmlnaW4iCittc2dzdHIgIm9yaWdpbiDjgpLoqK3lrprjgafjgY3jgb7jgZvjgpPjgafjgZfjgZ8iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NjI3Cittc2dpZCAiQ291bnRpbmcgb2JqZWN0cyIKK21zZ3N0ciAi44Kq44OW44K444Kn44Kv44OI44KS5pWw44GI44Gm44GE44G+44GZIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjYyOAorbXNnaWQgImJ1Y2tldHMiCittc2dzdHIgIuODkOOCseODhCIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo2NTIKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gY29weSBvYmplY3RzL2luZm8vYWx0ZXJuYXRlczogJXMiCittc2dzdHIgIm9iamVjdHMvaW5mby9hbHRlcm5hdGVzIOOCkuikh+WGmeOBp+OBjeOBvuOBm+OCkzogJXMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6Njg4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiTm90aGluZyB0byBjbG9uZSBmcm9tICVzLiIKK21zZ3N0ciAiJXMg44GL44KJ6KSH6KO944GZ44KL5YaF5a6544Gv44GC44KK44G+44Gb44KTIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjY5MCBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjkwNAorIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5MTYKK21zZ2lkICJUaGUgJ21hc3RlcicgYnJhbmNoIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4iCittc2dzdHIgIidtYXN0ZXInIOODluODqeODs+ODgeOBjOWIneacn+WMluOBleOCjOOBpuOBhOOBvuOBm+OCkyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3MDMKK21zZ2lkICJIYXJkbGlua3MgYXJlIHVuYXZhaWxhYmxlLiAgRmFsbGluZyBiYWNrIHRvIGNvcHlpbmcuIgorbXNnc3RyICLjg4/jg7zjg4njg6rjg7Pjgq/jgYzkvZzjgozjgarjgYTjga7jgafjgIHjgrPjg5Tjg7zjgZfjgb7jgZkiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzE1CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQ2xvbmluZyBmcm9tICVzIgorbXNnc3RyICIlcyDjgYvjgonopIfoo73jgZfjgabjgYTjgb7jgZkiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzQ2Cittc2dpZCAiQ29weWluZyBvYmplY3RzIgorbXNnc3RyICLjgqrjg5bjgrjjgqfjgq/jg4jjgpLopIflhpnjgZfjgabjgYTjgb7jgZkiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzQ3Cittc2dpZCAiS2lCIgorbXNnc3RyICJLaUIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzcxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGNvcHkgb2JqZWN0OiAlcyIKK21zZ3N0ciAi44Kq44OW44K444Kn44Kv44OI44KS6KSH5YaZ44Gn44GN44G+44Gb44KTOiAlcyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3ODEKK21zZ2lkICJMaW5raW5nIG9iamVjdHMiCittc2dzdHIgIuOCquODluOCuOOCp+OCr+ODiOOCkumAo+e1kOOBl+OBpuOBhOOBvuOBmSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3ODIKK21zZ2lkICJvYmplY3RzIgorbXNnc3RyICLjgqrjg5bjgrjjgqfjgq/jg4giCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzkwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGhhcmRsaW5rIG9iamVjdDogJXMiCittc2dzdHIgIuOCquODluOCuOOCp+OCr+ODiOOCkuODj+ODvOODieODquODs+OCr+OBp+OBjeOBvuOBm+OCkzogJXMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODQ1Cittc2dpZCAiQ2Fubm90IGZldGNoIGJyYW5jaGVzIGFuZCBvYmplY3RzLiAgU2VlIGNvbnNvbGUgb3V0cHV0IGZvciBkZXRhaWxzLiIKK21zZ3N0ciAi44OW44Op44Oz44OB44KE44Kq44OW44K444Kn44Kv44OI44KS5Y+W5b6X44Gn44GN44G+44Gb44KT44CC44Kz44Oz44K944O844Or5Ye65Yqb44KS6KaL44Gm5LiL44GV44GEIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjg1NgorbXNnaWQgIkNhbm5vdCBmZXRjaCB0YWdzLiAgU2VlIGNvbnNvbGUgb3V0cHV0IGZvciBkZXRhaWxzLiIKK21zZ3N0ciAi44K/44Kw44KS5Y+W5b6X44Gn44GN44G+44Gb44KT44CC44Kz44Oz44K944O844Or5Ye65Yqb44KS6KaL44Gm5LiL44GV44GEIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjg4MAorbXNnaWQgIkNhbm5vdCBkZXRlcm1pbmUgSEVBRC4gIFNlZSBjb25zb2xlIG91dHB1dCBmb3IgZGV0YWlscy4iCittc2dzdHIgIkhFQUQg44KS56K65a6a44Gn44GN44G+44Gb44KT44CC44Kz44Oz44K944O844Or5Ye65Yqb44KS6KaL44Gm5LiL44GV44GEIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjg4OQorIywgdGNsLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBjbGVhbnVwICVzIgorbXNnc3RyICIlcyDjgpLmjoPpmaTjgafjgY3jgb7jgZvjgpMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODk1Cittc2dpZCAiQ2xvbmUgZmFpbGVkLiIKK21zZ3N0ciAi6KSH5YaZ44Gr5aSx5pWX44GX44G+44GX44Gf44CCIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjkwMgorbXNnaWQgIk5vIGRlZmF1bHQgYnJhbmNoIG9idGFpbmVkLiIKK21zZ3N0ciAi44OH44OV44Kp44O844Or44OI44O744OW44Op44Oz44OB44GM5Y+W5b6X44GV44KM44G+44Gb44KT44Gn44GX44GfIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjkxMworIywgdGNsLWZvcm1hdAorbXNnaWQgIkNhbm5vdCByZXNvbHZlICVzIGFzIGEgY29tbWl0LiIKK21zZ3N0ciAiJXMg44KS44Kz44Of44OD44OI44Go44GX44Gm6Kej6YeI44Gn44GN44G+44Gb44KTIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjkyNQorbXNnaWQgIkNyZWF0aW5nIHdvcmtpbmcgZGlyZWN0b3J5IgorbXNnc3RyICLkvZzmpa3jg4fjgqPjg6zjgq/jg4jjg6rjgpLkvZzmiJDjgZfjgabjgYTjgb7jgZkiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTI2IGxpYi9pbmRleC50Y2w6NjUgbGliL2luZGV4LnRjbDoxMjcKKyM6IGxpYi9pbmRleC50Y2w6MTkzCittc2dpZCAiZmlsZXMiCittc2dzdHIgIuODleOCoeOCpOODqyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5NTUKK21zZ2lkICJJbml0aWFsIGZpbGUgY2hlY2tvdXQgZmFpbGVkLiIKK21zZ3N0ciAi5Yid5pyf44OB44Kn44OD44Kv44Ki44Km44OI44Gr5aSx5pWX44GX44G+44GX44GfIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjk3MQorbXNnaWQgIk9wZW4iCittc2dzdHIgIumWi+OBjyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5ODEKK21zZ2lkICJSZXBvc2l0b3J5OiIKK21zZ3N0ciAi44Oq44Od44K444OI44OqOiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMDMxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIG9wZW4gcmVwb3NpdG9yeSAlczoiCittc2dzdHIgIuODquODneOCuOODiOODqiAlcyDjgpLplovjgZHjgb7jgZvjgpM6IgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6NTMKK21zZ2lkICJUaGlzIERldGFjaGVkIENoZWNrb3V0IgorbXNnc3RyICLliIbpm6LjgZXjgozjgZ/jg4Hjgqfjg4Pjgq/jgqLjgqbjg4giCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDo2MAorbXNnaWQgIlJldmlzaW9uIEV4cHJlc3Npb246IgorbXNnc3RyICLjg6rjg5Pjgrjjg6fjg7PlvI86IgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6NzQKK21zZ2lkICJMb2NhbCBCcmFuY2giCittc2dzdHIgIuODreODvOOCq+ODq+ODu+ODluODqeODs+ODgSIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjc5Cittc2dpZCAiVHJhY2tpbmcgQnJhbmNoIgorbXNnc3RyICLjg4jjg6njg4Pjgq3jg7PjgrDjg7vjg5bjg6njg7Pjg4EiCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDo4NCBsaWIvY2hvb3NlX3Jldi50Y2w6NTM4Cittc2dpZCAiVGFnIgorbXNnc3RyICLjgr/jgrAiCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDozMTcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIHJldmlzaW9uOiAlcyIKK21zZ3N0ciAi54Sh5Yq544Gq44Oq44OT44K444On44OzOiAlcyIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjMzOAorbXNnaWQgIk5vIHJldmlzaW9uIHNlbGVjdGVkLiIKK21zZ3N0ciAi44Oq44OT44K444On44Oz44GM5pyq6YG45oqe44Gn44GZ44CCIgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6MzQ2Cittc2dpZCAiUmV2aXNpb24gZXhwcmVzc2lvbiBpcyBlbXB0eS4iCittc2dzdHIgIuODquODk+OCuOODp+ODs+W8j+OBjOepuuOBp+OBmeOAgiIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjUzMQorbXNnaWQgIlVwZGF0ZWQiCittc2dzdHIgIuabtOaWsOOBl+OBvuOBl+OBnyIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjU1OQorbXNnaWQgIlVSTCIKK21zZ3N0ciAiVVJMIgorCisjOiBsaWIvY29tbWl0LnRjbDo5Cittc2dpZCAiIgorIlRoZXJlIGlzIG5vdGhpbmcgdG8gYW1lbmQuXG4iCisiXG4iCisiWW91IGFyZSBhYm91dCB0byBjcmVhdGUgdGhlIGluaXRpYWwgY29tbWl0LiAgVGhlcmUgaXMgbm8gY29tbWl0IGJlZm9yZSB0aGlzICIKKyJ0byBhbWVuZC5cbiIKK21zZ3N0ciAiIgorIuioguato+OBmeOCi+OCs+ODn+ODg+ODiOOBjOOBneOCguOBneOCguOBguOCiuOBvuOBm+OCk+OAglxuIgorIlxuIgorIuOBk+OCjOOBi+OCieS9nOOCi+OBruOBr+acgOWIneOBruOCs+ODn+ODg+ODiOOBp+OBmeOAguOBneOBruWJjeOBq+OBr+OBvuOBoOioguato+OBmeOCi+OCiOOBhuOBquOCs+ODn+ODg+ODiOOBr+OBgiIKKyLjgorjgb7jgZvjgpPjgIJcbiIKKworIzogbGliL2NvbW1pdC50Y2w6MTgKK21zZ2lkICIiCisiQ2Fubm90IGFtZW5kIHdoaWxlIG1lcmdpbmcuXG4iCisiXG4iCisiWW91IGFyZSBjdXJyZW50bHkgaW4gdGhlIG1pZGRsZSBvZiBhIG1lcmdlIHRoYXQgaGFzIG5vdCBiZWVuIGZ1bGx5ICIKKyJjb21wbGV0ZWQuICBZb3UgY2Fubm90IGFtZW5kIHRoZSBwcmlvciBjb21taXQgdW5sZXNzIHlvdSBmaXJzdCBhYm9ydCB0aGUgIgorImN1cnJlbnQgbWVyZ2UgYWN0aXZpdHkuXG4iCittc2dzdHIgIiIKKyLjg57jg7zjgrjkuK3jgavjgrPjg5/jg4Pjg4jjga7oqILmraPjga/jgafjgY3jgb7jgZvjgpPjgIJcbiIKKyJcbiIKKyLnj77lnKjjga/jgb7jgaDjg57jg7zjgrjjga7pgJTkuK3jgafjgZnjgILlhYjjgavjgZPjga7jg57jg7zjgrjjgpLkuK3mraLjgZfjgarjgYTjgajjgIHliY3jga7jgrPjg5/jg4Pjg4jjga7oqILmraMiCisi44Gv44Gn44GN44G+44Gb44KTXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjQ5Cittc2dpZCAiRXJyb3IgbG9hZGluZyBjb21taXQgZGF0YSBmb3IgYW1lbmQ6IgorbXNnc3RyICLoqILmraPjgZnjgovjgrPjg5/jg4Pjg4jjga7jg4fjg7zjgr/jgpLoqq3jgoHjgb7jgZvjgpM6IgorCisjOiBsaWIvY29tbWl0LnRjbDo3NgorbXNnaWQgIlVuYWJsZSB0byBvYnRhaW4geW91ciBpZGVudGl0eToiCittc2dzdHIgIuODpuODvOOCtuOBruato+S9k+OCkueiuuiqjeOBp+OBjeOBvuOBm+OCkzoiCisKKyM6IGxpYi9jb21taXQudGNsOjgxCittc2dpZCAiSW52YWxpZCBHSVRfQ09NTUlUVEVSX0lERU5UOiIKK21zZ3N0ciAiR0lUX0NPTU1JVFRFUl9JREVOVCDjgYznhKHlirnjgafjgZk6IgorCisjOiBsaWIvY29tbWl0LnRjbDoxMzMKK21zZ2lkICIiCisiTGFzdCBzY2FubmVkIHN0YXRlIGRvZXMgbm90IG1hdGNoIHJlcG9zaXRvcnkgc3RhdGUuXG4iCisiXG4iCisiQW5vdGhlciBHaXQgcHJvZ3JhbSBoYXMgbW9kaWZpZWQgdGhpcyByZXBvc2l0b3J5IHNpbmNlIHRoZSBsYXN0IHNjYW4uICBBICIKKyJyZXNjYW4gbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIGFub3RoZXIgY29tbWl0IGNhbiBiZSBjcmVhdGVkLlxuIgorIlxuIgorIlRoZSByZXNjYW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgbm93LlxuIgorbXNnc3RyICIiCisi5pyA5b6M44Gr44K544Kt44Oj44Oz44GX44Gf54q25oWL44Gv44Oq44Od44K444OI44Oq44Gu54q25oWL44Go5ZCI6Ie044GX44G+44Gb44KT44CCXG4iCisiXG4iCisi5pyA5b6M44Gr44K544Kt44Oj44Oz44GX44Gm5Lul5b6M44CB5Yil44GuIEdpdCDjg5fjg63jgrDjg6njg6DjgYzjg6rjg53jgrjjg4jjg6rjgpLlpInmm7TjgZfjgabjgYTjgb7jgZnjgILmlrDjgZciCisi44GP44Kz44Of44OD44OI44GZ44KL5YmN44Gr44CB5YaN44K544Kt44Oj44Oz44GM5b+F6KaB44Gn44GZ44CCXG4iCisiXG4iCisi6Ieq5YuV55qE44Gr5YaN44K544Kt44Oj44Oz44KS6ZaL5aeL44GX44G+44GZ44CCXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjE1NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJVbm1lcmdlZCBmaWxlcyBjYW5ub3QgYmUgY29tbWl0dGVkLlxuIgorIlxuIgorIkZpbGUgJXMgaGFzIG1lcmdlIGNvbmZsaWN0cy4gIFlvdSBtdXN0IHJlc29sdmUgdGhlbSBhbmQgc3RhZ2UgdGhlIGZpbGUgIgorImJlZm9yZSBjb21taXR0aW5nLlxuIgorbXNnc3RyICIiCisi44Oe44O844K444GX44Gm44GE44Gq44GE44OV44Kh44Kk44Or44Gv44Kz44Of44OD44OI44Gn44GN44G+44Gb44KT44CCXG4iCisiXG4iCisi44OV44Kh44Kk44OrICVzIOOBq+OBr+ODnuODvOOCuOihneeqgeOBjOaui+OBo+OBpuOBhOOBvuOBmeOAguOBvuOBmuino+axuuOBl+OBpuOCs+ODn+ODg+ODiOS6iOWumuOBq+WKoOOBiOOCi+W/hSIKKyLopoHjgYzjgYLjgorjgb7jgZnjgIJcbiIKKworIzogbGliL2NvbW1pdC50Y2w6MTYyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIlVua25vd24gZmlsZSBzdGF0ZSAlcyBkZXRlY3RlZC5cbiIKKyJcbiIKKyJGaWxlICVzIGNhbm5vdCBiZSBjb21taXR0ZWQgYnkgdGhpcyBwcm9ncmFtLlxuIgorbXNnc3RyICIiCisi5LiN5piO44Gq44OV44Kh44Kk44Or54q25oWLICVzIOOBp+OBmeOAglxuIgorIlxuIgorIuODleOCoeOCpOODqyAlcyDjga/mnKzjg5fjg63jgrDjg6njg6Djgafjga/jgrPjg5/jg4Pjg4jjgafjgY3jgb7jgZvjgpPjgIJcbiIKKworIzogbGliL2NvbW1pdC50Y2w6MTcwCittc2dpZCAiIgorIk5vIGNoYW5nZXMgdG8gY29tbWl0LlxuIgorIlxuIgorIllvdSBtdXN0IHN0YWdlIGF0IGxlYXN0IDEgZmlsZSBiZWZvcmUgeW91IGNhbiBjb21taXQuXG4iCittc2dzdHIgIiIKKyLjgrPjg5/jg4Pjg4jjgZnjgovlpInmm7TjgYzjgYLjgorjgb7jgZvjgpPjgIJcbiIKKyJcbiIKKyLmnIDkvY7kuIDjgaTjga7lpInmm7TjgpLjgrPjg5/jg4Pjg4jkuojlrprjgavliqDjgYjjgabjgYvjgonjgrPjg5/jg4Pjg4jjgZfjgabkuIvjgZXjgYTjgIJcbiIKKworIzogbGliL2NvbW1pdC50Y2w6MTgzCittc2dpZCAiIgorIlBsZWFzZSBzdXBwbHkgYSBjb21taXQgbWVzc2FnZS5cbiIKKyJcbiIKKyJBIGdvb2QgY29tbWl0IG1lc3NhZ2UgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuIgorIlxuIgorIi0gRmlyc3QgbGluZTogRGVzY3JpYmUgaW4gb25lIHNlbnRlbmNlIHdoYXQgeW91IGRpZC5cbiIKKyItIFNlY29uZCBsaW5lOiBCbGFua1xuIgorIi0gUmVtYWluaW5nIGxpbmVzOiBEZXNjcmliZSB3aHkgdGhpcyBjaGFuZ2UgaXMgZ29vZC5cbiIKK21zZ3N0ciAiIgorIuOCs+ODn+ODg+ODiOODu+ODoeODg+OCu+ODvOOCuOOCkuWFpeWKm+OBl+OBpuS4i+OBleOBhOOAglxuIgorIlxuIgorIuato+OBl+OBhOOCs+ODn+ODg+ODiOODu+ODoeODg+OCu+ODvOOCuOOBrzpcbiIKKyJcbiIKKyItIOesrO+8keihjDog5L2V44KS44GX44Gf44GL44CB44KS77yR6KGM44Gn6KaB57SE44CCXG4iCisiLSDnrKzvvJLooYw6IOepuueZvVxuIgorIi0g5q6L44KK44Gu6KGMOiDjgarjgZzjgIHjgZPjga7lpInmm7TjgYzoia/jgYTlpInmm7TjgYvjgIHjga7oqqzmmI7jgIJcbiIKKworIzogbGliL2NvbW1pdC50Y2w6MjA3CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAid2FybmluZzogVGNsIGRvZXMgbm90IHN1cHBvcnQgZW5jb2RpbmcgJyVzJy4iCittc2dzdHIgIuitpuWRijogVGNsIOOBr+OCqOODs+OCs+ODvOODh+OCo+ODs+OCsCAnJXMnIOOCkuOCteODneODvOODiOOBl+OBpuOBhOOBvuOBm+OCkyIKKworIzogbGliL2NvbW1pdC50Y2w6MjIxCittc2dpZCAiQ2FsbGluZyBwcmUtY29tbWl0IGhvb2suLi4iCittc2dzdHIgIuOCs+ODn+ODg+ODiOWJjeODleODg+OCr+OCkuWun+ihjOS4reODu+ODu+ODuyIKKworIzogbGliL2NvbW1pdC50Y2w6MjM2Cittc2dpZCAiQ29tbWl0IGRlY2xpbmVkIGJ5IHByZS1jb21taXQgaG9vay4iCittc2dzdHIgIuOCs+ODn+ODg+ODiOWJjeODleODg+OCr+OBjOOCs+ODn+ODg+ODiOOCkuaLkuWQpuOBl+OBvuOBl+OBnyIKKworIzogbGliL2NvbW1pdC50Y2w6MjU5Cittc2dpZCAiQ2FsbGluZyBjb21taXQtbXNnIGhvb2suLi4iCittc2dzdHIgIuOCs+ODn+ODg+ODiOODu+ODoeODg+OCu+ODvOOCuOODu+ODleODg+OCr+OCkuWun+ihjOS4reODu+ODu+ODuyIKKworIzogbGliL2NvbW1pdC50Y2w6Mjc0Cittc2dpZCAiQ29tbWl0IGRlY2xpbmVkIGJ5IGNvbW1pdC1tc2cgaG9vay4iCittc2dzdHIgIuOCs+ODn+ODg+ODiOODu+ODoeODg+OCu+ODvOOCuOODu+ODleODg+OCr+OBjOOCs+ODn+ODg+ODiOOCkuaLkuWQpuOBl+OBvuOBl+OBnyIKKworIzogbGliL2NvbW1pdC50Y2w6Mjg3Cittc2dpZCAiQ29tbWl0dGluZyBjaGFuZ2VzLi4uIgorbXNnc3RyICLlpInmm7TngrnjgpLjgrPjg5/jg4Pjg4jkuK3jg7vjg7vjg7siCisKKyM6IGxpYi9jb21taXQudGNsOjMwMworbXNnaWQgIndyaXRlLXRyZWUgZmFpbGVkOiIKK21zZ3N0ciAid3JpdGUtdHJlZSDjgYzlpLHmlZfjgZfjgb7jgZfjgZ86IgorCisjOiBsaWIvY29tbWl0LnRjbDozMDQgbGliL2NvbW1pdC50Y2w6MzQ4IGxpYi9jb21taXQudGNsOjM2OAorbXNnaWQgIkNvbW1pdCBmYWlsZWQuIgorbXNnc3RyICLjgrPjg5/jg4Pjg4jjgavlpLHmlZfjgZfjgb7jgZfjgZ/jgIIiCisKKyM6IGxpYi9jb21taXQudGNsOjMyMQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkNvbW1pdCAlcyBhcHBlYXJzIHRvIGJlIGNvcnJ1cHQiCittc2dzdHIgIuOCs+ODn+ODg+ODiCAlcyDjga/lo4rjgozjgabjgYTjgb7jgZkiCisKKyM6IGxpYi9jb21taXQudGNsOjMyNgorbXNnaWQgIiIKKyJObyBjaGFuZ2VzIHRvIGNvbW1pdC5cbiIKKyJcbiIKKyJObyBmaWxlcyB3ZXJlIG1vZGlmaWVkIGJ5IHRoaXMgY29tbWl0IGFuZCBpdCB3YXMgbm90IGEgbWVyZ2UgY29tbWl0LlxuIgorIlxuIgorIkEgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIG5vdy5cbiIKK21zZ3N0ciAiIgorIuOCs+ODn+ODg+ODiOOBmeOCi+WkieabtOOBjOOBguOCiuOBvuOBm+OCk+OAglxuIgorIlxuIgorIuODnuODvOOCuOOBp+OBquOBj+OAgeOBvuOBn+OAgeS4gOOBpOOCguWkieabtOeCueOBjOOBguOCiuOBvuOBm+OCk+OAglxuIgorIlxuIgorIuiHquWLleeahOOBq+WGjeOCueOCreODo+ODs+OCkumWi+Wni+OBl+OBvuOBmeOAglxuIgorCisjOiBsaWIvY29tbWl0LnRjbDozMzMKK21zZ2lkICJObyBjaGFuZ2VzIHRvIGNvbW1pdC4iCittc2dzdHIgIuOCs+ODn+ODg+ODiOOBmeOCi+WkieabtOOBjOOBguOCiuOBvuOBm+OCk+OAgiIKKworIzogbGliL2NvbW1pdC50Y2w6MzQ3Cittc2dpZCAiY29tbWl0LXRyZWUgZmFpbGVkOiIKK21zZ3N0ciAiY29tbWl0LXRyZWUg44GM5aSx5pWX44GX44G+44GX44GfOiIKKworIzogbGliL2NvbW1pdC50Y2w6MzY3Cittc2dpZCAidXBkYXRlLXJlZiBmYWlsZWQ6IgorbXNnc3RyICJ1cGRhdGUtcmVmIOOBjOWkseaVl+OBl+OBvuOBl+OBnzoiCisKKyM6IGxpYi9jb21taXQudGNsOjQ1NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkNyZWF0ZWQgY29tbWl0ICVzOiAlcyIKK21zZ3N0ciAi44Kz44Of44OD44OIICVzIOOCkuS9nOaIkOOBl+OBvuOBl+OBnzogJXMiCisKKyM6IGxpYi9jb25zb2xlLnRjbDo1OQorbXNnaWQgIldvcmtpbmcuLi4gcGxlYXNlIHdhaXQuLi4iCittc2dzdHIgIuWun+ihjOS4reKApuOBiuW+heOBoeS4i+OBleOBhOKApiIKKworIzogbGliL2NvbnNvbGUudGNsOjE4NgorbXNnaWQgIlN1Y2Nlc3MiCittc2dzdHIgIuaIkOWKnyIKKworIzogbGliL2NvbnNvbGUudGNsOjIwMAorbXNnaWQgIkVycm9yOiBDb21tYW5kIEZhaWxlZCIKK21zZ3N0ciAi44Ko44Op44O8OiDjgrPjg57jg7Pjg4njgYzlpLHmlZfjgZfjgb7jgZfjgZ8iCisKKyM6IGxpYi9kYXRhYmFzZS50Y2w6NDMKK21zZ2lkICJOdW1iZXIgb2YgbG9vc2Ugb2JqZWN0cyIKK21zZ3N0ciAi44Gw44KJ44Gw44KJ44Gq44Kq44OW44K444Kn44Kv44OI44Gu5pWwIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQ0Cittc2dpZCAiRGlzayBzcGFjZSB1c2VkIGJ5IGxvb3NlIG9iamVjdHMiCittc2dzdHIgIuOBsOOCieOBsOOCieOBquOCquODluOCuOOCp+OCr+ODiOOBruS9v+eUqOOBmeOCi+ODh+OCo+OCueOCr+mHjyIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0NQorbXNnaWQgIk51bWJlciBvZiBwYWNrZWQgb2JqZWN0cyIKK21zZ3N0ciAi44OR44OD44Kv44GV44KM44Gf44Kq44OW44K444Kn44Kv44OI44Gu5pWwIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQ2Cittc2dpZCAiTnVtYmVyIG9mIHBhY2tzIgorbXNnc3RyICLjg5Hjg4Pjgq/jga7mlbAiCisKKyM6IGxpYi9kYXRhYmFzZS50Y2w6NDcKK21zZ2lkICJEaXNrIHNwYWNlIHVzZWQgYnkgcGFja2VkIG9iamVjdHMiCittc2dzdHIgIuODkeODg+OCr+OBleOCjOOBn+OCquODluOCuOOCp+OCr+ODiOOBruS9v+eUqOOBmeOCi+ODh+OCo+OCueOCr+mHjyIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0OAorbXNnaWQgIlBhY2tlZCBvYmplY3RzIHdhaXRpbmcgZm9yIHBydW5pbmciCittc2dzdHIgIuODkeODg+OCr+OBq+WtmOWcqOOBmeOCi+OBruOBp+aNqOOBpuOBpuiJr+OBhOOCquODluOCuOOCp+OCr+ODiOOBruaVsCIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0OQorbXNnaWQgIkdhcmJhZ2UgZmlsZXMiCittc2dzdHIgIuOCtOODn+ODleOCoeOCpOODqyIKKworIzogbGliL2RhdGFiYXNlLnRjbDo3MgorbXNnaWQgIkNvbXByZXNzaW5nIHRoZSBvYmplY3QgZGF0YWJhc2UiCittc2dzdHIgIuODh+ODvOOCv+ODmeODvOOCueWcp+e4riIKKworIzogbGliL2RhdGFiYXNlLnRjbDo4MworbXNnaWQgIlZlcmlmeWluZyB0aGUgb2JqZWN0IGRhdGFiYXNlIHdpdGggZnNjay1vYmplY3RzIgorbXNnc3RyICJmc2NrLW9iamVjdHMg44Gn44Kq44OW44K444Kn44Kv44OI44O744OH44O844K/44OZ44O844K544KS5qSc6Ki844GX44Gm44GE44G+44GZIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjEwOAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJUaGlzIHJlcG9zaXRvcnkgY3VycmVudGx5IGhhcyBhcHByb3hpbWF0ZWx5ICVpIGxvb3NlIG9iamVjdHMuXG4iCisiXG4iCisiVG8gbWFpbnRhaW4gb3B0aW1hbCBwZXJmb3JtYW5jZSBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBjb21wcmVzcyAiCisidGhlIGRhdGFiYXNlIHdoZW4gbW9yZSB0aGFuICVpIGxvb3NlIG9iamVjdHMgZXhpc3QuXG4iCisiXG4iCisiQ29tcHJlc3MgdGhlIGRhdGFiYXNlIG5vdz8iCittc2dzdHIgIiIKKyLjgZPjga7jg6rjg53jgrjjg4jjg6rjgavjga/jgYrjgYrjgojjgZ0gJWkg5YCL44Gu5YCL5Yil44Kq44OW44K444Kn44Kv44OI44GM44GC44KK44G+44GZXG4iCisiXG4iCisi5pyA6YGp44Gq5oCn6IO944KS5L+d44Gk44Gf44KB44Gr44CBJWkg5YCL5Lul5LiK44Gu5YCL5Yil44Kq44OW44K444Kn44Kv44OI44KS5L2c44KL5q+O44Gr44OH44O844K/44OZ44O844K544KS5ZynIgorIue4ruOBmeOCi+OBk+OBqOOCkuaOqOWlqOOBl+OBvuOBmVxuIgorIlxuIgorIuODh+ODvOOCv+ODmeODvOOCueOCkuWcp+e4ruOBl+OBvuOBmeOBi++8nyIKKworIzogbGliL2RhdGUudGNsOjI1CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBkYXRlIGZyb20gR2l0OiAlcyIKK21zZ3N0ciAiR2l0IOOBi+OCieWHuuOBn+eEoeWKueOBquaXpeS7mDogJXMiCisKKyM6IGxpYi9kaWZmLnRjbDo0MgorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJObyBkaWZmZXJlbmNlcyBkZXRlY3RlZC5cbiIKKyJcbiIKKyIlcyBoYXMgbm8gY2hhbmdlcy5cbiIKKyJcbiIKKyJUaGUgbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhpcyBmaWxlIHdhcyB1cGRhdGVkIGJ5IGFub3RoZXIgYXBwbGljYXRpb24sIGJ1dCAiCisidGhlIGNvbnRlbnQgd2l0aGluIHRoZSBmaWxlIHdhcyBub3QgY2hhbmdlZC5cbiIKKyJcbiIKKyJBIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB0byBmaW5kIG90aGVyIGZpbGVzIHdoaWNoIG1heSBoYXZlICIKKyJ0aGUgc2FtZSBzdGF0ZS4iCittc2dzdHIgIiIKKyLlpInmm7TjgYzjgYLjgorjgb7jgZvjgpPjgIJcbiIKKyJcbiIKKyIlcyDjgavjga/lpInmm7TjgYzjgYLjgorjgb7jgZvjgpPjgIJcbiIKKyJcbiIKKyLjgZPjga7jg5XjgqHjgqTjg6vjga7lpInmm7TmmYLliLvjga/ku5bjga7jgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgavjgojjgaPjgabmm7TmlrDjgZXjgozjgabjgYTjgb7jgZnjgYzjg5XjgqHjgqQiCisi44Or5YaF5a6544Gr44Gv5aSJ5pu044GM44GC44KK44G+44Gb44KT44CCXG4iCisiXG4iCisi5ZCM5qeY44Gq54q25oWL44Gu44OV44Kh44Kk44Or44KS5o6i44GZ44Gf44KB44Gr44CB6Ieq5YuV55qE44Gr5YaN44K544Kt44Oj44Oz44KS6ZaL5aeL44GX44G+44GZ44CCIgorCisjOiBsaWIvZGlmZi50Y2w6ODEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJMb2FkaW5nIGRpZmYgb2YgJXMuLi4iCittc2dzdHIgIiVzIOOBruWkieabtOeCueOCkuODreODvOODieS4reKApiIKKworIzogbGliL2RpZmYudGNsOjExNCBsaWIvZGlmZi50Y2w6MTg0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGRpc3BsYXkgJXMiCittc2dzdHIgIiVzIOOCkuihqOekuuOBp+OBjeOBvuOBm+OCkyIKKworIzogbGliL2RpZmYudGNsOjExNQorbXNnaWQgIkVycm9yIGxvYWRpbmcgZmlsZToiCittc2dzdHIgIuODleOCoeOCpOODq+OCkuiqreOCgOmam+OBruOCqOODqeODvOOBp+OBmToiCisKKyM6IGxpYi9kaWZmLnRjbDoxMjIKK21zZ2lkICJHaXQgUmVwb3NpdG9yeSAoc3VicHJvamVjdCkiCittc2dzdHIgIkdpdCDjg6rjg53jgrjjg4jjg6oo44K144OW44OX44Ot44K444Kn44Kv44OIKSIKKworIzogbGliL2RpZmYudGNsOjEzNAorbXNnaWQgIiogQmluYXJ5IGZpbGUgKG5vdCBzaG93aW5nIGNvbnRlbnQpLiIKK21zZ3N0ciAiKiDjg5DjgqTjg4rjg6rjg5XjgqHjgqTjg6so5YaF5a6544Gv6KGo56S644GX44G+44Gb44KTKSIKKworIzogbGliL2RpZmYudGNsOjE4NQorbXNnaWQgIkVycm9yIGxvYWRpbmcgZGlmZjoiCittc2dzdHIgImRpZmYg44KS6Kqt44KA6Zqb44Gu44Ko44Op44O844Gn44GZOiIKKworIzogbGliL2RpZmYudGNsOjMwMworbXNnaWQgIkZhaWxlZCB0byB1bnN0YWdlIHNlbGVjdGVkIGh1bmsuIgorbXNnc3RyICLpgbjmip7jgZXjgozjgZ/jg5Hjg4Pjg4HjgpLjgrPjg5/jg4Pjg4jkuojlrprjgYvjgonlpJbjgZvjgb7jgZvjgpPjgIIiCisKKyM6IGxpYi9kaWZmLnRjbDozMTAKK21zZ2lkICJGYWlsZWQgdG8gc3RhZ2Ugc2VsZWN0ZWQgaHVuay4iCittc2dzdHIgIumBuOaKnuOBleOCjOOBn+ODkeODg+ODgeOCkuOCs+ODn+ODg+ODiOS6iOWumuOBq+WKoOOBiOOCieOCjOOBvuOBm+OCk+OAgiIKKworIzogbGliL2Vycm9yLnRjbDoyMCBsaWIvZXJyb3IudGNsOjExNAorbXNnaWQgImVycm9yIgorbXNnc3RyICLjgqjjg6njg7wiCisKKyM6IGxpYi9lcnJvci50Y2w6MzYKK21zZ2lkICJ3YXJuaW5nIgorbXNnc3RyICLorablkYoiCisKKyM6IGxpYi9lcnJvci50Y2w6OTQKK21zZ2lkICJZb3UgbXVzdCBjb3JyZWN0IHRoZSBhYm92ZSBlcnJvcnMgYmVmb3JlIGNvbW1pdHRpbmcuIgorbXNnc3RyICLjgrPjg5/jg4Pjg4jjgZnjgovliY3jgavjgIHku6XkuIrjga7jgqjjg6njg7zjgpLkv67mraPjgZfjgabkuIvjgZXjgYQiCisKKyM6IGxpYi9pbmRleC50Y2w6NgorbXNnaWQgIlVuYWJsZSB0byB1bmxvY2sgdGhlIGluZGV4LiIKK21zZ3N0ciAi44Kk44Oz44OH44OD44Kv44K544KS44Ot44OD44Kv44Gn44GN44G+44Gb44KTIgorCisjOiBsaWIvaW5kZXgudGNsOjE1Cittc2dpZCAiSW5kZXggRXJyb3IiCittc2dzdHIgIue0ouW8leOCqOODqeODvCIKKworIzogbGliL2luZGV4LnRjbDoyMQorbXNnaWQgIiIKKyJVcGRhdGluZyB0aGUgR2l0IGluZGV4IGZhaWxlZC4gIEEgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIHRvICIKKyJyZXN5bmNocm9uaXplIGdpdC1ndWkuIgorbXNnc3RyICIiCisiR0lUIOOCpOODs+ODh+ODg+OCr+OCueOBruabtOaWsOOBjOWkseaVl+OBl+OBvuOBl+OBn+OAgmdpdC1ndWkg44Go5ZCM5pyf44KS44Go44KL44Gf44KB44Gr5YaN44K544Kt44Oj44Oz44GXIgorIuOBvuOBmeOAgiIKKworIzogbGliL2luZGV4LnRjbDoyNworbXNnaWQgIkNvbnRpbnVlIgorbXNnc3RyICLntprooYwiCisKKyM6IGxpYi9pbmRleC50Y2w6MzEKK21zZ2lkICJVbmxvY2sgSW5kZXgiCittc2dzdHIgIuOCpOODs+ODh+ODg+OCr+OCueOBruODreODg+OCr+ino+mZpCIKKworIzogbGliL2luZGV4LnRjbDoyODIKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbnN0YWdpbmcgJXMgZnJvbSBjb21taXQiCittc2dzdHIgIuOCs+ODn+ODg+ODiOOBi+OCiSAnJXMnIOOCkumZjeOCjeOBmSIKKworIzogbGliL2luZGV4LnRjbDozMTMKK21zZ2lkICJSZWFkeSB0byBjb21taXQuIgorbXNnc3RyICLjgrPjg5/jg4Pjg4jmupblgpnlrozkuoYiCisKKyM6IGxpYi9pbmRleC50Y2w6MzI2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQWRkaW5nICVzIgorbXNnc3RyICLjgrPjg5/jg4Pjg4jjgasgJXMg44KS5Yqg44GI44Gm44GE44G+44GZIgorCisjOiBsaWIvaW5kZXgudGNsOjM4MQorIywgdGNsLWZvcm1hdAorbXNnaWQgIlJldmVydCBjaGFuZ2VzIGluIGZpbGUgJXM/IgorbXNnc3RyICLjg5XjgqHjgqTjg6sgJXMg44Gr44GX44Gf5aSJ5pu044KS5YWD44Gr5oi744GX44G+44GZ44GL77yfIgorCisjOiBsaWIvaW5kZXgudGNsOjM4MworIywgdGNsLWZvcm1hdAorbXNnaWQgIlJldmVydCBjaGFuZ2VzIGluIHRoZXNlICVpIGZpbGVzPyIKK21zZ3N0ciAi44GT44KM44KJICVpIOWAi+OBruODleOCoeOCpOODq+OBq+OBl+OBn+WkieabtOOCkuWFg+OBq+aIu+OBl+OBvuOBmeOBi++8nyIKKworIzogbGliL2luZGV4LnRjbDozOTEKK21zZ2lkICJBbnkgdW5zdGFnZWQgY2hhbmdlcyB3aWxsIGJlIHBlcm1hbmVudGx5IGxvc3QgYnkgdGhlIHJldmVydC4iCittc2dzdHIgIuWkieabtOOCkuWFg+OBq+aIu+OBmeOBqOOCs+ODn+ODg+ODiOS6iOWumuOBl+OBpuOBhOOBquOBhOWkieabtOOBr+WFqOOBpuWkseOCj+OCjOOBvuOBmeOAgiIKKworIzogbGliL2luZGV4LnRjbDozOTQKK21zZ2lkICJEbyBOb3RoaW5nIgorbXNnc3RyICLkvZXjgoLjgZfjgarjgYQiCisKKyM6IGxpYi9tZXJnZS50Y2w6MTMKK21zZ2lkICIiCisiQ2Fubm90IG1lcmdlIHdoaWxlIGFtZW5kaW5nLlxuIgorIlxuIgorIllvdSBtdXN0IGZpbmlzaCBhbWVuZGluZyB0aGlzIGNvbW1pdCBiZWZvcmUgc3RhcnRpbmcgYW55IHR5cGUgb2YgbWVyZ2UuXG4iCittc2dzdHIgIiIKKyLoqILmraPkuK3jgavjga/jg57jg7zjgrjjgafjgY3jgb7jgZvjgpPjgIJcbiIKKyJcbiIKKyLoqILmraPlh6bnkIbjgpLlrozkuobjgZnjgovjgb7jgafjga/mlrDjgZ/jgavjg57jg7zjgrjjgpLplovlp4vjgafjgY3jgb7jgZvjgpPjgIJcbiIKKworIzogbGliL21lcmdlLnRjbDoyNworbXNnaWQgIiIKKyJMYXN0IHNjYW5uZWQgc3RhdGUgZG9lcyBub3QgbWF0Y2ggcmVwb3NpdG9yeSBzdGF0ZS5cbiIKKyJcbiIKKyJBbm90aGVyIEdpdCBwcm9ncmFtIGhhcyBtb2RpZmllZCB0aGlzIHJlcG9zaXRvcnkgc2luY2UgdGhlIGxhc3Qgc2Nhbi4gIEEgIgorInJlc2NhbiBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgYSBtZXJnZSBjYW4gYmUgcGVyZm9ybWVkLlxuIgorIlxuIgorIlRoZSByZXNjYW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgbm93LlxuIgorbXNnc3RyICIiCisi5pyA5b6M44Gr44K544Kt44Oj44Oz44GX44Gf54q25oWL44Gv44Oq44Od44K444OI44Oq44Gu54q25oWL44Go5ZCI6Ie044GX44G+44Gb44KT44CCXG4iCisiXG4iCisi5pyA5b6M44Gr44K544Kt44Oj44Oz44GX44Gm5Lul5b6M44CB5Yil44GuIEdpdCDjg5fjg63jgrDjg6njg6DjgYzjg6rjg53jgrjjg4jjg6rjgpLlpInmm7TjgZfjgabjgYTjgb7jgZnjgILjg57jg7wiCisi44K444KS6ZaL5aeL44GZ44KL5YmN44Gr44CB5YaN44K544Kt44Oj44Oz44GM5b+F6KaB44Gn44GZ44CCXG4iCisiXG4iCisi6Ieq5YuV55qE44Gr5YaN44K544Kt44Oj44Oz44KS6ZaL5aeL44GX44G+44GZ44CCXG4iCisKKyM6IGxpYi9tZXJnZS50Y2w6NDQKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiWW91IGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgY29uZmxpY3RlZCBtZXJnZS5cbiIKKyJcbiIKKyJGaWxlICVzIGhhcyBtZXJnZSBjb25mbGljdHMuXG4iCisiXG4iCisiWW91IG11c3QgcmVzb2x2ZSB0aGVtLCBzdGFnZSB0aGUgZmlsZSwgYW5kIGNvbW1pdCB0byBjb21wbGV0ZSB0aGUgY3VycmVudCAiCisibWVyZ2UuICBPbmx5IHRoZW4gY2FuIHlvdSBiZWdpbiBhbm90aGVyIG1lcmdlLlxuIgorbXNnc3RyICIiCisi6KGd56qB44Gu44GC44Gj44Gf44Oe44O844K444Gu6YCU5Lit44Gn44GZ44CCXG4iCisiXG4iCisi44OV44Kh44Kk44OrICVzIOOBq+OBr+ODnuODvOOCuOS4reOBruihneeqgeOBjOaui+OBo+OBpuOBhOOBvuOBmeOAglxuIgorIlxuIgorIuOBk+OBruODleOCoeOCpOODq+OBruihneeqgeOCkuino+axuuOBl+OAgeOCs+ODn+ODg+ODiOS6iOWumuOBq+WKoOOBiOOBpuOAgeOCs+ODn+ODg+ODiOOBmeOCi+OBk+OBqOOBp+ODnuODvOOCuOOCkiIKKyLlrozkuobjgZfjgb7jgZnjgILjgZ3jgYbjgoTjgaPjgablp4vjgoHjgabjgIHmlrDjgZ/jgarjg57jg7zjgrjjgpLplovlp4vjgafjgY3jgovjgojjgYbjgavjgarjgorjgb7jgZnjgIJcbiIKKworIzogbGliL21lcmdlLnRjbDo1NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJZb3UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBjaGFuZ2UuXG4iCisiXG4iCisiRmlsZSAlcyBpcyBtb2RpZmllZC5cbiIKKyJcbiIKKyJZb3Ugc2hvdWxkIGNvbXBsZXRlIHRoZSBjdXJyZW50IGNvbW1pdCBiZWZvcmUgc3RhcnRpbmcgYSBtZXJnZS4gIERvaW5nIHNvICIKKyJ3aWxsIGhlbHAgeW91IGFib3J0IGEgZmFpbGVkIG1lcmdlLCBzaG91bGQgdGhlIG5lZWQgYXJpc2UuXG4iCittc2dzdHIgIiIKKyLlpInmm7Tjga7pgJTkuK3jgafjgZnjgIJcbiIKKyJcbiIKKyLjg5XjgqHjgqTjg6sgJXMg44Gv5aSJ5pu05Lit44Gn44GZ44CCXG4iCisiXG4iCisi54++5Zyo44Gu44Kz44Of44OD44OI44KS5a6M5LqG44GX44Gm44GL44KJ44Oe44O844K444KS6ZaL5aeL44GX44Gm5LiL44GV44GE44CC44Gd44GG44GZ44KL5pa544GM44Oe44O844K444Gr5aSx5pWXIgorIuOBl+OBn+OBqOOBjeOBruWbnuW+qeOBjOalveOBp+OBmeOAglxuIgorCisjOiBsaWIvbWVyZ2UudGNsOjEwNgorIywgdGNsLWZvcm1hdAorbXNnaWQgIiVzIG9mICVzIgorbXNnc3RyICIlcyDjga4gJXMg44OW44Op44Oz44OBIgorCisjOiBsaWIvbWVyZ2UudGNsOjExOQorIywgdGNsLWZvcm1hdAorbXNnaWQgIk1lcmdpbmcgJXMgYW5kICVzLi4uIgorbXNnc3RyICIlcyDjgaggJXMg44KS44Oe44O844K45Lit44O744O744O7IgorCisjOiBsaWIvbWVyZ2UudGNsOjEzMAorbXNnaWQgIk1lcmdlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIgorbXNnc3RyICLjg57jg7zjgrjjgYzlrozkuobjgZfjgb7jgZfjgZ8iCisKKyM6IGxpYi9tZXJnZS50Y2w6MTMyCittc2dpZCAiTWVyZ2UgZmFpbGVkLiAgQ29uZmxpY3QgcmVzb2x1dGlvbiBpcyByZXF1aXJlZC4iCittc2dzdHIgIuODnuODvOOCuOOBjOWkseaVl+OBl+OBvuOBl+OBn+OAguihneeqgeOBruino+axuuOBjOW/heimgeOBp+OBmeOAgiIKKworIzogbGliL21lcmdlLnRjbDoxNTcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJNZXJnZSBJbnRvICVzIgorbXNnc3RyICIlcyDjgavjg57jg7zjgrgiCisKKyM6IGxpYi9tZXJnZS50Y2w6MTc2Cittc2dpZCAiUmV2aXNpb24gVG8gTWVyZ2UiCittc2dzdHIgIuODnuODvOOCuOOBmeOCi+ODquODk+OCuOODp+ODsyIKKworIzogbGliL21lcmdlLnRjbDoyMTEKK21zZ2lkICIiCisiQ2Fubm90IGFib3J0IHdoaWxlIGFtZW5kaW5nLlxuIgorIlxuIgorIllvdSBtdXN0IGZpbmlzaCBhbWVuZGluZyB0aGlzIGNvbW1pdC5cbiIKK21zZ3N0ciAiIgorIuioguato+S4reOBq+OBr+S4reatouOBp+OBjeOBvuOBm+OCk+OAglxuIgorIlxuIgorIuOBvuOBmuS7iuOBruOCs+ODn+ODg+ODiOioguato+OCkuWujOS6huOBleOBm+OBpuS4i+OBleOBhOOAglxuIgorCisjOiBsaWIvbWVyZ2UudGNsOjIyMQorbXNnaWQgIiIKKyJBYm9ydCBtZXJnZT9cbiIKKyJcbiIKKyJBYm9ydGluZyB0aGUgY3VycmVudCBtZXJnZSB3aWxsIGNhdXNlICpBTEwqIHVuY29tbWl0dGVkIGNoYW5nZXMgdG8gYmUgbG9zdC5cbiIKKyJcbiIKKyJDb250aW51ZSB3aXRoIGFib3J0aW5nIHRoZSBjdXJyZW50IG1lcmdlPyIKK21zZ3N0ciAiIgorIuODnuODvOOCuOOCkuS4reaWreOBl+OBvuOBmeOBi++8n1xuIgorIlxuIgorIuePvuWcqOOBruODnuODvOOCuOOCkuS4reaWreOBmeOCi+OBqOOAgeOCs+ODn+ODg+ODiOOBl+OBpuOBhOOBquOBhOWFqOOBpuOBruWkieabtOOBjOWkseOCj+OCjOOBvuOBmeOAglxuIgorIlxuIgorIuODnuODvOOCuOOCkuS4reaWreOBl+OBpuOCiOOCjeOBl+OBhOOBp+OBmeOBi++8nyIKKworIzogbGliL21lcmdlLnRjbDoyMjcKK21zZ2lkICIiCisiUmVzZXQgY2hhbmdlcz9cbiIKKyJcbiIKKyJSZXNldHRpbmcgdGhlIGNoYW5nZXMgd2lsbCBjYXVzZSAqQUxMKiB1bmNvbW1pdHRlZCBjaGFuZ2VzIHRvIGJlIGxvc3QuXG4iCisiXG4iCisiQ29udGludWUgd2l0aCByZXNldHRpbmcgdGhlIGN1cnJlbnQgY2hhbmdlcz8iCittc2dzdHIgIiIKKyLlpInmm7TngrnjgpLjg6rjgrvjg4Pjg4jjgZfjgb7jgZnjgYvvvJ9cbiIKKyJcbiIKKyLlpInmm7TngrnjgpLjg6rjgrvjg4Pjg4jjgZnjgovjgajjgIHjgrPjg5/jg4Pjg4jjgZfjgabjgYTjgarjgYTlhajjgabjga7lpInmm7TjgYzlpLHjgo/jgozjgb7jgZnjgIJcbiIKKyJcbiIKKyLjg6rjgrvjg4Pjg4jjgZfjgabjgojjgo3jgZfjgYTjgafjgZnjgYvvvJ8iCisKKyM6IGxpYi9tZXJnZS50Y2w6MjM4Cittc2dpZCAiQWJvcnRpbmciCittc2dzdHIgIuS4reaWreOBl+OBpuOBhOOBvuOBmSIKKworIzogbGliL21lcmdlLnRjbDoyMzgKK21zZ2lkICJmaWxlcyByZXNldCIKK21zZ3N0ciAi44Oq44K744OD44OI44GX44Gf44OV44Kh44Kk44OrIgorCisjOiBsaWIvbWVyZ2UudGNsOjI2NQorbXNnaWQgIkFib3J0IGZhaWxlZC4iCittc2dzdHIgIuS4reaWreOBq+WkseaVl+OBl+OBvuOBl+OBn+OAgiIKKworIzogbGliL21lcmdlLnRjbDoyNjcKK21zZ2lkICJBYm9ydCBjb21wbGV0ZWQuICBSZWFkeS4iCittc2dzdHIgIuS4reaWreWujOS6huOAgiIKKworIzogbGliL29wdGlvbi50Y2w6OTUKK21zZ2lkICJSZXN0b3JlIERlZmF1bHRzIgorbXNnc3RyICLml6LlrprlgKTjgavmiLvjgZkiCisKKyM6IGxpYi9vcHRpb24udGNsOjk5Cittc2dpZCAiU2F2ZSIKK21zZ3N0ciAi5L+d5a2YIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMDkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIlcyBSZXBvc2l0b3J5IgorbXNnc3RyICIlcyDjg6rjg53jgrjjg4jjg6oiCisKKyM6IGxpYi9vcHRpb24udGNsOjExMAorbXNnaWQgIkdsb2JhbCAoQWxsIFJlcG9zaXRvcmllcykiCittc2dzdHIgIuWkp+Wfn++8iOWFqOOBpuOBruODquODneOCuOODiOODqu+8iSIKKworIzogbGliL29wdGlvbi50Y2w6MTE2Cittc2dpZCAiVXNlciBOYW1lIgorbXNnc3RyICLjg6bjg7zjgrblkI0iCisKKyM6IGxpYi9vcHRpb24udGNsOjExNworbXNnaWQgIkVtYWlsIEFkZHJlc3MiCittc2dzdHIgIumbu+WtkOODoeODvOODq+OCouODieODrOOCuSIKKworIzogbGliL29wdGlvbi50Y2w6MTE5Cittc2dpZCAiU3VtbWFyaXplIE1lcmdlIENvbW1pdHMiCittc2dzdHIgIuODnuODvOOCuOOCs+ODn+ODg+ODiOOBruimgee0hCIKKworIzogbGliL29wdGlvbi50Y2w6MTIwCittc2dpZCAiTWVyZ2UgVmVyYm9zaXR5IgorbXNnc3RyICLjg57jg7zjgrjjga7lhpfplbfluqYiCisKKyM6IGxpYi9vcHRpb24udGNsOjEyMQorbXNnaWQgIlNob3cgRGlmZnN0YXQgQWZ0ZXIgTWVyZ2UiCittc2dzdHIgIuODnuODvOOCuOW+jOOBqyBkaWZmc3RhdCDjgpLooajnpLoiCisKKyM6IGxpYi9vcHRpb24udGNsOjEyMworbXNnaWQgIlRydXN0IEZpbGUgTW9kaWZpY2F0aW9uIFRpbWVzdGFtcHMiCittc2dzdHIgIuODleOCoeOCpOODq+WkieabtOaZguWIu+OCkuS/oemgvOOBmeOCiyIKKworIzogbGliL29wdGlvbi50Y2w6MTI0Cittc2dpZCAiUHJ1bmUgVHJhY2tpbmcgQnJhbmNoZXMgRHVyaW5nIEZldGNoIgorbXNnc3RyICLjg5Xjgqfjg4Pjg4HkuK3jgavjg4jjg6njg4Pjgq3jg7PjgrDjg5bjg6njg7Pjg4HjgpLliIjjgosiCisKKyM6IGxpYi9vcHRpb24udGNsOjEyNQorbXNnaWQgIk1hdGNoIFRyYWNraW5nIEJyYW5jaGVzIgorbXNnc3RyICLjg4jjg6njg4Pjgq3jg7PjgrDjg5bjg6njg7Pjg4HjgpLlkIjjgo/jgZvjgosiCisKKyM6IGxpYi9vcHRpb24udGNsOjEyNgorbXNnaWQgIk51bWJlciBvZiBEaWZmIENvbnRleHQgTGluZXMiCittc2dzdHIgImRpZmYg44Gu5paH6ISI6KGM5pWwIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMjcKK21zZ2lkICJDb21taXQgTWVzc2FnZSBUZXh0IFdpZHRoIgorbXNnc3RyICLjgrPjg5/jg4Pjg4jjg6Hjg4Pjgrvjg7zjgrjjga7jg4bjgq3jgrnjg4jluYUiCisKKyM6IGxpYi9vcHRpb24udGNsOjEyOAorbXNnaWQgIk5ldyBCcmFuY2ggTmFtZSBUZW1wbGF0ZSIKK21zZ3N0ciAi5paw44GX44GE44OW44Op44Oz44OB5ZCN44Gu44OG44Oz44OX44Os44O844OIIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxOTIKK21zZ2lkICJTcGVsbGluZyBEaWN0aW9uYXJ5OiIKK21zZ3N0ciAi44K544Oa44Or44OB44Kn44OD44Kv6L6e5pu4IgorCisjOiBsaWIvb3B0aW9uLnRjbDoyMTYKK21zZ2lkICJDaGFuZ2UgRm9udCIKK21zZ3N0ciAi44OV44Kp44Oz44OI44KS5aSJ5pu0IgorCisjOiBsaWIvb3B0aW9uLnRjbDoyMjAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJDaG9vc2UgJXMiCittc2dzdHIgIiVzIOOCkumBuOaKniIKKworIzogbGliL29wdGlvbi50Y2w6MjI2Cittc2dpZCAicHQuIgorbXNnc3RyICLjg53jgqTjg7Pjg4giCisKKyM6IGxpYi9vcHRpb24udGNsOjI0MAorbXNnaWQgIlByZWZlcmVuY2VzIgorbXNnc3RyICLoqK3lrpoiCisKKyM6IGxpYi9vcHRpb24udGNsOjI3NQorbXNnaWQgIkZhaWxlZCB0byBjb21wbGV0ZWx5IHNhdmUgb3B0aW9uczoiCittc2dzdHIgIuWujOWFqOOBq+OCquODl+OCt+ODp+ODs+OCkuS/neWtmOOBp+OBjeOBvuOBm+OCkzoiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MjkgbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDozNAorbXNnaWQgIkRlbGV0ZSBSZW1vdGUgQnJhbmNoIgorbXNnc3RyICLjg6rjg6Ljg7zjg4jjg7vjg5bjg6njg7Pjg4HjgpLliYrpmaQiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6NDcKK21zZ2lkICJGcm9tIFJlcG9zaXRvcnkiCittc2dzdHIgIuWFg+OBruODquODneOCuOODiOODqiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDo1MCBsaWIvdHJhbnNwb3J0LnRjbDoxMjMKK21zZ2lkICJSZW1vdGU6IgorbXNnc3RyICLjg6rjg6Ljg7zjg4g6IgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjY2IGxpYi90cmFuc3BvcnQudGNsOjEzOAorbXNnaWQgIkFyYml0cmFyeSBVUkw6IgorbXNnc3RyICLku7vmhI/jga4gVVJMOiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDo4NAorbXNnaWQgIkJyYW5jaGVzIgorbXNnc3RyICLjg5bjg6njg7Pjg4EiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MTA5Cittc2dpZCAiRGVsZXRlIE9ubHkgSWYiCittc2dzdHIgIuadoeS7tuS7mOOBp+WJiumZpCIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoxMTEKK21zZ2lkICJNZXJnZWQgSW50bzoiCittc2dzdHIgIuODnuODvOOCuOWFiDoiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MTE5Cittc2dpZCAiQWx3YXlzIChEbyBub3QgcGVyZm9ybSBtZXJnZSBjaGVja3MpIgorbXNnc3RyICLnhKHmnaHku7bvvIjjg57jg7zjgrjmpJzmn7vjgpLjgZfjgarjgYTvvIkiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MTUyCittc2dpZCAiQSBicmFuY2ggaXMgcmVxdWlyZWQgZm9yICdNZXJnZWQgSW50bycuIgorbXNnc3RyICIn44Oe44O844K45YWIJyDjgavjga/jg5bjg6njg7Pjg4HjgYzlv4XopoHjgafjgZnjgIIiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MTg0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIlRoZSBmb2xsb3dpbmcgYnJhbmNoZXMgYXJlIG5vdCBjb21wbGV0ZWx5IG1lcmdlZCBpbnRvICVzOlxuIgorIlxuIgorIiAtICVzIgorbXNnc3RyICIiCisi5Lul5LiL44Gu44OW44Op44Oz44OB44GvICVzIOOBq+WujOWFqOOBq+ODnuODvOOCuOOBleOCjOOBpuOBhOOBvuOBm+OCkzpcbiIKKyJcbiIKKyIgLSAlcyIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoxODkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiT25lIG9yIG1vcmUgb2YgdGhlIG1lcmdlIHRlc3RzIGZhaWxlZCBiZWNhdXNlIHlvdSBoYXZlIG5vdCBmZXRjaGVkIHRoZSAiCisibmVjZXNzYXJ5IGNvbW1pdHMuICBUcnkgZmV0Y2hpbmcgZnJvbSAlcyBmaXJzdC4iCittc2dzdHIgIiIKKyLlv4XopoHjgarjgrPjg5/jg4Pjg4jjgYzkuI3otrPjgZfjgabjgYTjgovjgZ/jgoHjgavjgIHjg57jg7zjgrjmpJzmn7vjgYzlpLHmlZfjgZfjgb7jgZfjgZ/jgILjgb7jgZogJXMg44GL44KJIgorIuODleOCp+ODg+ODgeOBl+OBpuS4i+OBleOBhOOAgiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoyMDcKK21zZ2lkICJQbGVhc2Ugc2VsZWN0IG9uZSBvciBtb3JlIGJyYW5jaGVzIHRvIGRlbGV0ZS4iCittc2dzdHIgIuWJiumZpOOBmeOCi+ODluODqeODs+ODgeOCkumBuOaKnuOBl+OBpuS4i+OBleOBhOOAgiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoyMTYKK21zZ2lkICIiCisiUmVjb3ZlcmluZyBkZWxldGVkIGJyYW5jaGVzIGlzIGRpZmZpY3VsdC5cbiIKKyJcbiIKKyJEZWxldGUgdGhlIHNlbGVjdGVkIGJyYW5jaGVzPyIKK21zZ3N0ciAiIgorIuWJiumZpOOBl+OBn+ODluODqeODs+ODgeOCkuWbnuW+qeOBmeOCi+OBruOBr+WbsOmbo+OBp+OBmeOAglxuIgorIlxuIgorIumBuOaKnuOBl+OBn+ODluODqeODs+ODgeOCkuWJiumZpOOBl+OBpuiJr+OBhOOBp+OBmeOBi++8nyIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoyMjYKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJEZWxldGluZyBicmFuY2hlcyBmcm9tICVzIgorbXNnc3RyICIlcyDjgYvjgonjg5bjg6njg7Pjg4HjgpLliYrpmaTjgZfjgabjgYTjgb7jgZnjgIIiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6Mjg2Cittc2dpZCAiTm8gcmVwb3NpdG9yeSBzZWxlY3RlZC4iCittc2dzdHIgIuODquODneOCuOODiOODquOBjOmBuOaKnuOBleOCjOOBpuOBhOOBvuOBm+OCk+OAgiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoyOTEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJTY2FubmluZyAlcy4uLiIKK21zZ3N0ciAiJXMg44KS44K544Kt44Oj44Oz44GX44Gm44GE44G+44GZ4oCmIgorCisjOiBsaWIvcmVtb3RlLnRjbDoxNjUKK21zZ2lkICJQcnVuZSBmcm9tIgorbXNnc3RyICLjgYvjgonliIjovrzjgoDigKYiCisKKyM6IGxpYi9yZW1vdGUudGNsOjE3MAorbXNnaWQgIkZldGNoIGZyb20iCittc2dzdHIgIuWPluW+l+WFgyIKKworIzogbGliL3JlbW90ZS50Y2w6MjEzCittc2dpZCAiUHVzaCB0byIKK21zZ3N0ciAi44OX44OD44K344Ol5YWIIgorCisjOiBsaWIvc2hvcnRjdXQudGNsOjIwIGxpYi9zaG9ydGN1dC50Y2w6NjEKK21zZ2lkICJDYW5ub3Qgd3JpdGUgc2hvcnRjdXQ6IgorbXNnc3RyICLjgrfjg6fjg7zjg4jjgqvjg4Pjg4jjgYzmm7jjgZHjgb7jgZvjgpM6IgorCisjOiBsaWIvc2hvcnRjdXQudGNsOjEzNgorbXNnaWQgIkNhbm5vdCB3cml0ZSBpY29uOiIKK21zZ3N0ciAi44Ki44Kk44Kz44Oz44GM5pu444GR44G+44Gb44KTOiIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjU3Cittc2dpZCAiVW5zdXBwb3J0ZWQgc3BlbGwgY2hlY2tlciIKK21zZ3N0ciAi44K144Od44O844OI44GV44KM44Gm44GE44Gq44GE44K544Oa44Or44OB44Kn44OD44Kr44O844Gn44GZIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6NjUKK21zZ2lkICJTcGVsbCBjaGVja2luZyBpcyB1bmF2YWlsYWJsZSIKK21zZ3N0ciAi44K544Oa44Or44OB44Kn44OD44Kv5qmf6IO944Gv5L2/44GI44G+44Gb44KTIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6NjgKK21zZ2lkICJJbnZhbGlkIHNwZWxsIGNoZWNraW5nIGNvbmZpZ3VyYXRpb24iCittc2dzdHIgIuOCueODmuODq+ODgeOCp+ODg+OCr+OBruioreWumuOBjOS4jeato+OBp+OBmSIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjcwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUmV2ZXJ0aW5nIGRpY3Rpb25hcnkgdG8gJXMuIgorbXNnc3RyICLovp7mm7jjgpIgJXMg44Gr5be744GN5oi744GX44G+44GZIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6NzMKK21zZ2lkICJTcGVsbCBjaGVja2VyIHNpbGVudGx5IGZhaWxlZCBvbiBzdGFydHVwIgorbXNnc3RyICLjgrnjg5rjg6vjg4Hjgqfjg4Pjgqvjg7zjga7otbfli5XjgavlpLHmlZfjgZfjgb7jgZfjgZ8iCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDo4MAorbXNnaWQgIlVucmVjb2duaXplZCBzcGVsbCBjaGVja2VyIgorbXNnc3RyICLjgrnjg5rjg6vjg4Hjgqfjg4Pjgqvjg7zjgYzliKTliKXjgafjgY3jgb7jgZvjgpMiCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDoxODAKK21zZ2lkICJObyBTdWdnZXN0aW9ucyIKK21zZ3N0ciAi5o+Q5qGI44Gq44GXIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6MzgxCittc2dpZCAiVW5leHBlY3RlZCBFT0YgZnJvbSBzcGVsbCBjaGVja2VyIgorbXNnc3RyICLjgrnjg5rjg6vjg4Hjgqfjg4Pjgqvjg7zjgYzkuojmg7PlpJbjga4gRU9GIOOCkui/lOOBl+OBvuOBl+OBnyIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjM4NQorbXNnaWQgIlNwZWxsIENoZWNrZXIgRmFpbGVkIgorbXNnc3RyICLjgrnjg5rjg6vjg4Hjgqfjg4Pjgq/lpLHmlZciCisKKyM6IGxpYi9zdGF0dXNfYmFyLnRjbDo4MworIywgdGNsLWZvcm1hdAorbXNnaWQgIiVzIC4uLiAlKmkgb2YgJSppICVzICglM2klJSkiCittc2dzdHIgIiUxJHMgLi4uICU0JCppICU2JHMg5Lit44GuICUyJCppICglNyQzaSUlKSIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6NgorIywgdGNsLWZvcm1hdAorbXNnaWQgImZldGNoICVzIgorbXNnc3RyICIlcyDjgpLlj5blvpciCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJGZXRjaGluZyBuZXcgY2hhbmdlcyBmcm9tICVzIgorbXNnc3RyICIlcyDjgYvjgonmlrDjgZfjgYTlpInmm7TjgpLjg5Xjgqfjg4Pjg4HjgZfjgabjgYTjgb7jgZkiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjE4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAicmVtb3RlIHBydW5lICVzIgorbXNnc3RyICLpgaDpmpTliIjovrwgJXMiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjE5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUHJ1bmluZyB0cmFja2luZyBicmFuY2hlcyBkZWxldGVkIGZyb20gJXMiCittc2dzdHIgIiVzIOOBi+OCieWJiumZpOOBleOCjOOBn+ODiOODqeODg+OCreODs+OCsOODu+ODluODqeODs+ODgeOCkuWIiOOBo+OBpuOBhOOBvuOBmSIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MjUgbGliL3RyYW5zcG9ydC50Y2w6NzEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJwdXNoICVzIgorbXNnc3RyICIlcyDjgpLjg5fjg4Pjgrfjg6UiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjI2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUHVzaGluZyBjaGFuZ2VzIHRvICVzIgorbXNnc3RyICIlcyDjgbjlpInmm7TjgpLjg5fjg4Pjgrfjg6XjgZfjgabjgYTjgb7jgZkiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjcyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUHVzaGluZyAlcyAlcyB0byAlcyIKK21zZ3N0ciAiJTMkcyDjgbggJTEkcyAlMiRzIOOCkuODl+ODg+OCt+ODpeOBl+OBpuOBhOOBvuOBmSIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6ODkKK21zZ2lkICJQdXNoIEJyYW5jaGVzIgorbXNnc3RyICLjg5bjg6njg7Pjg4HjgpLjg5fjg4Pjgrfjg6UiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjEwMworbXNnaWQgIlNvdXJjZSBCcmFuY2hlcyIKK21zZ3N0ciAi5YWD44Gu44OW44Op44Oz44OBIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoxMjAKK21zZ2lkICJEZXN0aW5hdGlvbiBSZXBvc2l0b3J5IgorbXNnc3RyICLpgIHjgorlhYjjg6rjg53jgrjjg4jjg6oiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjE1OAorbXNnaWQgIlRyYW5zZmVyIE9wdGlvbnMiCittc2dzdHIgIumAmuS/oeOCquODl+OCt+ODp+ODsyIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTYwCittc2dpZCAiRm9yY2Ugb3ZlcndyaXRlIGV4aXN0aW5nIGJyYW5jaCAobWF5IGRpc2NhcmQgY2hhbmdlcykiCittc2dzdHIgIuaXouWtmOODluODqeODs+ODgeOCkuS4iuabuOOBjSjlpInmm7TjgpLnoLTmo4TjgZnjgovlj6/og73mgKfjgYzjgYLjgorjgb7jgZkpIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoxNjQKK21zZ2lkICJVc2UgdGhpbiBwYWNrIChmb3Igc2xvdyBuZXR3b3JrIGNvbm5lY3Rpb25zKSIKK21zZ3N0ciAiVGhpbiBQYWNrIOOCkuS9v+OBhu+8iOmBheOBhOODjeODg+ODiOODr+ODvOOCr+aOpee2mu+8iSIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTY4Cittc2dpZCAiSW5jbHVkZSB0YWdzIgorbXNnc3RyICLjgr/jgrDjgpLlkKvjgoHjgosiCisKKyN+IG1zZ2lkICJOb3QgY29ubmVjdGVkIHRvIGFzcGVsbCIKKyN+IG1zZ3N0ciAiYXNwZWxsIOOBq+aOpee2muOBl+OBpuOBhOOBvuOBm+OCkyIKZGlmZiAtLWdpdCBhL2dpdC1ndWkvcG8vcG8ybXNnLnNoIGIvZ2l0LWd1aS9wby9wbzJtc2cuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdjNGJmMwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvcG8vcG8ybXNnLnNoCkBAIC0wLDAgKzEsMTUyIEBACisjIS9iaW4vc2gKKyMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCitleGVjIHRjbHNoICIkMCIgLS0gIiRAIgorCisjIFRoaXMgaXMgYSByZWFsbHkgc3R1cGlkIHByb2dyYW0sIHdoaWNoIHNlcnZlcyBhcyBhbiBhbHRlcm5hdGl2ZSB0bworIyBtc2dmbXQuICBJdCBfb25seV8gdHJhbnNsYXRlcyB0byBUY2wgbW9kZSwgZG9lcyBfbm90XyB2YWxpZGF0ZSB0aGUKKyMgaW5wdXQsIGFuZCBkb2VzIF9ub3RfIG91dHB1dCBhbnkgc3RhdGlzdGljcy4KKworcHJvYyB1MmEge3N9IHsKKwlzZXQgcmVzICIiCisJZm9yZWFjaCBpIFtzcGxpdCAkcyAiIl0geworCQlzY2FuICRpICVjIGMKKwkJaWYgeyRjPDEyOH0geworCQkJIyBlc2NhcGUgJ1snLCAnXCcgYW5kICddJworCQkJaWYgeyRjID09IDB4NWIgfHwgJGMgPT0gMHg1ZH0geworCQkJCWFwcGVuZCByZXMgIlxcIgorCQkJfQorCQkJYXBwZW5kIHJlcyAkaQorCQl9IGVsc2UgeworCQkJYXBwZW5kIHJlcyBcXHVbZm9ybWF0ICUwNC40eCAkY10KKwkJfQorCX0KKwlyZXR1cm4gJHJlcworfQorCitzZXQgb3V0cHV0X2RpcmVjdG9yeSAiLiIKK3NldCBsYW5nICJkdW1teSIKK3NldCBmaWxlcyBbbGlzdF0KK3NldCBzaG93X3N0YXRpc3RpY3MgMAorCisjIHBhcnNlIG9wdGlvbnMKK2ZvciB7c2V0IGkgMH0geyRpIDwgJGFyZ2N9IHtpbmNyIGl9IHsKKwlzZXQgYXJnIFtsaW5kZXggJGFyZ3YgJGldCisJaWYgeyRhcmcgPT0gIi0tc3RhdGlzdGljcyJ9IHsKKwkJaW5jciBzaG93X3N0YXRpc3RpY3MKKwkJY29udGludWUKKwl9CisJaWYgeyRhcmcgPT0gIi0tdGNsIn0geworCQkjIHdlIGtub3cKKwkJY29udGludWUKKwl9CisJaWYgeyRhcmcgPT0gIi1sIn0geworCQlpbmNyIGkKKwkJc2V0IGxhbmcgW2xpbmRleCAkYXJndiAkaV0KKwkJY29udGludWUKKwl9CisJaWYgeyRhcmcgPT0gIi1kIn0geworCQlpbmNyIGkKKwkJc2V0IHRtcCBbbGluZGV4ICRhcmd2ICRpXQorCQlyZWdzdWIgIlxbXi9cXSQiICR0bXAgIiYvIiBvdXRwdXRfZGlyZWN0b3J5CisJCWNvbnRpbnVlCisJfQorCWxhcHBlbmQgZmlsZXMgJGFyZworfQorCitwcm9jIGZsdXNoX21zZyB7fSB7CisJZ2xvYmFsIG1zZ2lkIG1zZ3N0ciBtb2RlIGxhbmcgb3V0IGZ1enp5CisJZ2xvYmFsIHRyYW5zbGF0ZWRfY291bnQgZnV6enlfY291bnQgbm90X3RyYW5zbGF0ZWRfY291bnQKKworCWlmIHshW2luZm8gZXhpc3RzIG1zZ2lkXSB8fCAkbW9kZSA9PSAiIn0geworCQlyZXR1cm4KKwl9CisJc2V0IG1vZGUgIiIKKwlpZiB7JGZ1enp5ID09IDF9IHsKKwkJaW5jciBmdXp6eV9jb3VudAorCQlzZXQgZnV6enkgMAorCQlyZXR1cm4KKwl9CisKKwlpZiB7JG1zZ2lkID09ICIifSB7CisJCXNldCBwcmVmaXggInNldCA6Om1zZ2NhdDo6aGVhZGVyIgorCX0gZWxzZSB7CisJCWlmIHskbXNnc3RyID09ICIifSB7CisJCQlpbmNyIG5vdF90cmFuc2xhdGVkX2NvdW50CisJCQlyZXR1cm4KKwkJfQorCQlzZXQgcHJlZml4ICI6Om1zZ2NhdDo6bWNzZXQgJGxhbmcgXCJbdTJhICRtc2dpZF1cIiIKKwkJaW5jciB0cmFuc2xhdGVkX2NvdW50CisJfQorCisJcHV0cyAkb3V0ICIkcHJlZml4IFwiW3UyYSAkbXNnc3RyXVwiIgorfQorCitzZXQgZnV6enkgMAorc2V0IHRyYW5zbGF0ZWRfY291bnQgMAorc2V0IGZ1enp5X2NvdW50IDAKK3NldCBub3RfdHJhbnNsYXRlZF9jb3VudCAwCitmb3JlYWNoIGZpbGUgJGZpbGVzIHsKKwlyZWdzdWIgIl4uKi9cKFxbXi9cXSpcKVwucG8kIiAkZmlsZSAiJG91dHB1dF9kaXJlY3RvcnlcXDEubXNnIiBvdXRmaWxlCisJc2V0IGluIFtvcGVuICRmaWxlICJyIl0KKwlmY29uZmlndXJlICRpbiAtZW5jb2RpbmcgdXRmLTgKKwlzZXQgb3V0IFtvcGVuICRvdXRmaWxlICJ3Il0KKworCXNldCBtb2RlICIiCisJd2hpbGUge1tnZXRzICRpbiBsaW5lXSA+PSAwfSB7CisJCWlmIHtbcmVnZXhwICJeIyIgJGxpbmVdfSB7CisJCQlpZiB7W3JlZ2V4cCAiLCBmdXp6eSIgJGxpbmVdfSB7CisJCQkJc2V0IGZ1enp5IDEKKwkJCX0gZWxzZSB7CisJCQkJZmx1c2hfbXNnCisJCQl9CisJCQljb250aW51ZQorCQl9IGVsc2VpZiB7W3JlZ2V4cCAiXm1zZ2lkIFwiKC4qKVwiJCIgJGxpbmUgZHVtbXkgbWF0Y2hdfSB7CisJCQlmbHVzaF9tc2cKKwkJCXNldCBtc2dpZCAkbWF0Y2gKKwkJCXNldCBtb2RlICJtc2dpZCIKKwkJfSBlbHNlaWYge1tyZWdleHAgIl5tc2dzdHIgXCIoLiopXCIkIiAkbGluZSBkdW1teSBtYXRjaF19IHsKKwkJCXNldCBtc2dzdHIgJG1hdGNoCisJCQlzZXQgbW9kZSAibXNnc3RyIgorCQl9IGVsc2VpZiB7JGxpbmUgPT0gIiJ9IHsKKwkJCWZsdXNoX21zZworCQl9IGVsc2VpZiB7W3JlZ2V4cCAiXlwiKC4qKVwiJCIgJGxpbmUgZHVtbXkgbWF0Y2hdfSB7CisJCQlpZiB7JG1vZGUgPT0gIm1zZ2lkIn0geworCQkJCWFwcGVuZCBtc2dpZCAkbWF0Y2gKKwkJCX0gZWxzZWlmIHskbW9kZSA9PSAibXNnc3RyIn0geworCQkJCWFwcGVuZCBtc2dzdHIgJG1hdGNoCisJCQl9IGVsc2UgeworCQkJCXB1dHMgc3RkZXJyICJJIGRvIG5vdCBrbm93IHdoYXQgdG8gZG86ICRtYXRjaCIKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXB1dHMgc3RkZXJyICJDYW5ub3QgaGFuZGxlICRsaW5lIgorCQl9CisJfQorCWZsdXNoX21zZworCWNsb3NlICRpbgorCWNsb3NlICRvdXQKK30KKworaWYgeyRzaG93X3N0YXRpc3RpY3N9IHsKKwlzZXQgc3RyICIiCisKKwlhcHBlbmQgc3RyICAiJHRyYW5zbGF0ZWRfY291bnQgdHJhbnNsYXRlZCBtZXNzYWdlIgorCWlmIHskdHJhbnNsYXRlZF9jb3VudCAhPSAxfSB7CisJCWFwcGVuZCBzdHIgcworCX0KKworCWlmIHskZnV6enlfY291bnQgPiAxfSB7CisJCWFwcGVuZCBzdHIgICIsICRmdXp6eV9jb3VudCBmdXp6eSB0cmFuc2xhdGlvbiIKKwkJaWYgeyRmdXp6eV9jb3VudCAhPSAxfSB7CisJCQlhcHBlbmQgc3RyIHMKKwkJfQorCX0KKwlpZiB7JG5vdF90cmFuc2xhdGVkX2NvdW50ID4gMH0geworCQlhcHBlbmQgc3RyICAiLCAkbm90X3RyYW5zbGF0ZWRfY291bnQgdW50cmFuc2xhdGVkIG1lc3NhZ2UiCisJCWlmIHskbm90X3RyYW5zbGF0ZWRfY291bnQgIT0gMX0geworCQkJYXBwZW5kIHN0ciBzCisJCX0KKwl9CisKKwlhcHBlbmQgc3RyICAuCisJcHV0cyAkc3RyCit9CmRpZmYgLS1naXQgYS9naXQtZ3VpL3BvL3J1LnBvIGIvZ2l0LWd1aS9wby9ydS5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjU1YjNlCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9wby9ydS5wbwpAQCAtMCwwICsxLDE5NzMgQEAKKyMgVHJhbnNsYXRpb24gb2YgZ2l0LWd1aSB0byBydXNzaWFuCisjIENvcHlyaWdodCAoQykgMjAwNyBTaGF3biBQZWFyY2UKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGdpdC1ndWkgcGFja2FnZS4KKyMgSXJpbmEgUmllc2VuIDxpcmluYS5yaWVzZW5AZ21haWwuY29tPiwgMjAwNy4KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdpdC1ndWlcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMDgtMDMtMTQgMDc6MTgrMDEwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMDctMTAtMjIgMjI6MzAtMDIwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogQWxleCBSaWVzZW4gPHJhYS5sa21sQGdtYWlsLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBSdXNzaWFuIFRyYW5zbGF0aW9uIDxnaXRAdmdlci5rZXJuZWwub3JnPlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorCisjOiBnaXQtZ3VpLnNoOjQxIGdpdC1ndWkuc2g6NjM0IGdpdC1ndWkuc2g6NjQ4IGdpdC1ndWkuc2g6NjYxIGdpdC1ndWkuc2g6NzQ0CisjOiBnaXQtZ3VpLnNoOjc2MworbXNnaWQgImdpdC1ndWk6IGZhdGFsIGVycm9yIgorbXNnc3RyICJnaXQtZ3VpOiDQutGA0LjRgtC40YfQtdGB0LrQsNGPINC+0YjQuNCx0LrQsCIKKworIzogZ2l0LWd1aS5zaDo1OTMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIGZvbnQgc3BlY2lmaWVkIGluICVzOiIKK21zZ3N0ciAi0JIgJXMg0YPRgdGC0LDQvdC+0LLQu9C10L0g0L3QtdCy0LXRgNC90YvQuSDRiNGA0LjRhNGCOiIKKworIzogZ2l0LWd1aS5zaDo2MjAKK21zZ2lkICJNYWluIEZvbnQiCittc2dzdHIgItCo0YDQuNGE0YIg0LjQvdGC0LXRgNGE0LXQudGB0LAiCisKKyM6IGdpdC1ndWkuc2g6NjIxCittc2dpZCAiRGlmZi9Db25zb2xlIEZvbnQiCittc2dzdHIgItCo0YDQuNGE0YIg0LrQvtC90YHQvtC70Lgg0Lgg0LjQt9C80LXQvdC10L3QuNC5IChkaWZmKSIKKworIzogZ2l0LWd1aS5zaDo2MzUKK21zZ2lkICJDYW5ub3QgZmluZCBnaXQgaW4gUEFUSC4iCittc2dzdHIgImdpdCDQvdC1INC90LDQudC00LXQvSDQsiBQQVRILiIKKworIzogZ2l0LWd1aS5zaDo2NjIKK21zZ2lkICJDYW5ub3QgcGFyc2UgR2l0IHZlcnNpb24gc3RyaW5nOiIKK21zZ3N0ciAi0J3QtdCy0L7Qt9C80L7QttC90L4g0YDQsNGB0L/QvtC30L3QsNGC0Ywg0YHRgtGA0L7QutGDINCy0LXRgNGB0LjQuCBHaXQ6ICIKKworIzogZ2l0LWd1aS5zaDo2ODAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiR2l0IHZlcnNpb24gY2Fubm90IGJlIGRldGVybWluZWQuXG4iCisiXG4iCisiJXMgY2xhaW1zIGl0IGlzIHZlcnNpb24gJyVzJy5cbiIKKyJcbiIKKyIlcyByZXF1aXJlcyBhdCBsZWFzdCBHaXQgMS41LjAgb3IgbGF0ZXIuXG4iCisiXG4iCisiQXNzdW1lICclcycgaXMgdmVyc2lvbiAxLjUuMD9cbiIKK21zZ3N0ciAiIgorItCd0LXQstC+0LfQvNC+0LbQvdC+INC+0L/RgNC10LTQtdC70LjRgtGMINCy0LXRgNGB0LjRjiBHaXRcbiIKKyIlcyDRg9C60LDQt9GL0LLQsNC10YIg0L3QsCDQstC10YDRgdC40Y4gJyVzJy5cbiIKKyJcbiIKKyLQtNC70Y8gJXMg0YLRgNC10LHRg9C10YLRgdGPINCy0LXRgNGB0LjRjyBHaXQsINC90LDRh9C40L3QsNGPINGBIDEuNS4wXG4iCisiXG4iCisi0J/RgNC40L3Rj9GC0YwgJyVzJyDQutCw0Log0LLQtdGA0YHQuNGOIDEuNS4wP1xuIgorCisjOiBnaXQtZ3VpLnNoOjkxOAorbXNnaWQgIkdpdCBkaXJlY3Rvcnkgbm90IGZvdW5kOiIKK21zZ3N0ciAi0JrQsNGC0LDQu9C+0LMgR2l0INC90LUg0L3QsNC50LTQtdC9OiIKKworIzogZ2l0LWd1aS5zaDo5MjUKK21zZ2lkICJDYW5ub3QgbW92ZSB0byB0b3Agb2Ygd29ya2luZyBkaXJlY3Rvcnk6IgorbXNnc3RyICLQndC10LLQvtC30LzQvtC20L3QviDQv9C10YDQtdC50YLQuCDQuiDQutC+0YDQvdGOINGA0LDQsdC+0YfQtdCz0L4g0LrQsNGC0LDQu9C+0LPQsCDRgNC10L/QvtC30LjRgtC+0YDQuNGPOiAiCisKKyM6IGdpdC1ndWkuc2g6OTMyCittc2dpZCAiQ2Fubm90IHVzZSBmdW5ueSAuZ2l0IGRpcmVjdG9yeToiCittc2dzdHIgItCa0LDRgtCw0LvQvtCzLmdpdCDQuNGB0L/QvtGA0YfQtdC9OiAiCisKKyM6IGdpdC1ndWkuc2g6OTM3Cittc2dpZCAiTm8gd29ya2luZyBkaXJlY3RvcnkiCittc2dzdHIgItCe0YLRgdGD0YLRgdGC0LLRg9C10YIg0YDQsNCx0L7Rh9C40Lkg0LrQsNGC0LDQu9C+0LMiCisKKyM6IGdpdC1ndWkuc2g6MTA4NCBsaWIvY2hlY2tvdXRfb3AudGNsOjI4MworbXNnaWQgIlJlZnJlc2hpbmcgZmlsZSBzdGF0dXMuLi4iCittc2dzdHIgItCe0LHQvdC+0LLQu9C10L3QuNC1INC40L3RhNC+0YDQvNCw0YbQuNC4INC+INGB0L7RgdGC0L7Rj9C90LjQuCDRhNCw0LnQu9C+0LIuLi4iCisKKyM6IGdpdC1ndWkuc2g6MTE0OQorbXNnaWQgIlNjYW5uaW5nIGZvciBtb2RpZmllZCBmaWxlcyAuLi4iCittc2dzdHIgItCf0L7QuNGB0Log0LjQt9C80LXQvdC10L3QvdGL0YUg0YTQsNC50LvQvtCyLi4uIgorCisjOiBnaXQtZ3VpLnNoOjEzMjQgbGliL2Jyb3dzZXIudGNsOjI0NgorbXNnaWQgIlJlYWR5LiIKK21zZ3N0ciAi0JPQvtGC0L7QstC+LiIKKworIzogZ2l0LWd1aS5zaDoxNTkwCittc2dpZCAiVW5tb2RpZmllZCIKK21zZ3N0ciAi0J3QtSDQuNC30LzQtdC90LXQvdC+IgorCisjOiBnaXQtZ3VpLnNoOjE1OTIKK21zZ2lkICJNb2RpZmllZCwgbm90IHN0YWdlZCIKK21zZ3N0ciAi0JjQt9C80LXQvdC10L3Qviwg0L3QtSDQv9C+0LTQs9C+0YLQvtCy0LvQtdC90L4iCisKKyM6IGdpdC1ndWkuc2g6MTU5MyBnaXQtZ3VpLnNoOjE1OTgKK21zZ2lkICJTdGFnZWQgZm9yIGNvbW1pdCIKK21zZ3N0ciAi0J/QvtC00LPQvtGC0L7QstC70LXQvdC+INC00LvRjyDRgdC+0YXRgNCw0L3QtdC90LjRjyIKKworIzogZ2l0LWd1aS5zaDoxNTk0IGdpdC1ndWkuc2g6MTU5OQorbXNnaWQgIlBvcnRpb25zIHN0YWdlZCBmb3IgY29tbWl0IgorbXNnc3RyICLQp9Cw0YHRgtC4LCDQv9C+0LTQs9C+0YLQvtCy0LvQtdC90L3Ri9C1INC00LvRjyDRgdC+0YXRgNCw0L3QtdC90LjRjyIKKworIzogZ2l0LWd1aS5zaDoxNTk1IGdpdC1ndWkuc2g6MTYwMAorbXNnaWQgIlN0YWdlZCBmb3IgY29tbWl0LCBtaXNzaW5nIgorbXNnc3RyICLQn9C+0LTQs9C+0YLQvtCy0LvQtdC90L4g0LTQu9GPINGB0L7RhdGA0LDQvdC10L3QuNGPLCDQvtGC0YHRg9GC0YHRgtCy0YPQtdGCIgorCisjOiBnaXQtZ3VpLnNoOjE1OTcKK21zZ2lkICJVbnRyYWNrZWQsIG5vdCBzdGFnZWQiCittc2dzdHIgItCd0LUg0L7RgtGB0LvQtdC20LjQstCw0LXRgtGB0Y8sINC90LUg0L/QvtC00LPQvtGC0L7QstC70LXQvdC+IgorCisjOiBnaXQtZ3VpLnNoOjE2MDIKK21zZ2lkICJNaXNzaW5nIgorbXNnc3RyICLQntGC0YHRg9GC0YHRgtCy0YPQtdGCIgorCisjOiBnaXQtZ3VpLnNoOjE2MDMKK21zZ2lkICJTdGFnZWQgZm9yIHJlbW92YWwiCittc2dzdHIgItCf0L7QtNCz0L7RgtC+0LLQu9C10L3QviDQtNC70Y8g0YPQtNCw0LvQtdC90LjRjyIKKworIzogZ2l0LWd1aS5zaDoxNjA0Cittc2dpZCAiU3RhZ2VkIGZvciByZW1vdmFsLCBzdGlsbCBwcmVzZW50IgorbXNnc3RyICLQn9C+0LTQs9C+0YLQvtCy0LvQtdC90L4g0LTQu9GPINGD0LTQsNC70LXQvdC40Y8sINC10YnQtSDQvdC1INGD0LTQsNC70LXQvdC+IgorCisjOiBnaXQtZ3VpLnNoOjE2MDYgZ2l0LWd1aS5zaDoxNjA3IGdpdC1ndWkuc2g6MTYwOCBnaXQtZ3VpLnNoOjE2MDkKK21zZ2lkICJSZXF1aXJlcyBtZXJnZSByZXNvbHV0aW9uIgorbXNnc3RyICLQotGA0LXQsdGD0LXRgtGB0Y8g0YDQsNC30YDQtdGI0LXQvdC40LUg0LrQvtC90YTQu9C40LrRgtCwINC/0YDQuCDQvtCx0YrQtdC00LjQvdC10L3QuNC4IgorCisjOiBnaXQtZ3VpLnNoOjE2NDQKK21zZ2lkICJTdGFydGluZyBnaXRrLi4uIHBsZWFzZSB3YWl0Li4uIgorbXNnc3RyICLQl9Cw0L/Rg9GB0LrQsNC10YLRgdGPIGdpdGsuLi4g0L/QvtC20LDQu9GD0LnRgdGC0LAsINC20LTQuNGC0LUuLi4iCisKKyM6IGdpdC1ndWkuc2g6MTY1MworIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJVbmFibGUgdG8gc3RhcnQgZ2l0azpcbiIKKyJcbiIKKyIlcyBkb2VzIG5vdCBleGlzdCIKK21zZ3N0ciAiIgorItCd0LUg0YPQtNCw0LvQvtGB0Ywg0LfQsNC/0YPRgdGC0LjRgtGMIGdpdGs6XG4iCisiXG4iCisiJXMg0L3QtSDRgdGD0YnQtdGB0YLQstGD0LXRgiIKKworIzogZ2l0LWd1aS5zaDoxODYwIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MzYKK21zZ2lkICJSZXBvc2l0b3J5IgorbXNnc3RyICLQoNC10L/QvtC30LjRgtC+0YDQuNC5IgorCisjOiBnaXQtZ3VpLnNoOjE4NjEKK21zZ2lkICJFZGl0IgorbXNnc3RyICLQoNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCIKKworIzogZ2l0LWd1aS5zaDoxODYzIGxpYi9jaG9vc2VfcmV2LnRjbDo1NjEKK21zZ2lkICJCcmFuY2giCittc2dzdHIgItCS0LXRgtCy0YwiCisKKyM6IGdpdC1ndWkuc2g6MTg2NiBsaWIvY2hvb3NlX3Jldi50Y2w6NTQ4Cittc2dpZCAiQ29tbWl0QEBub3VuIgorbXNnc3RyICLQodC+0YHRgtC+0Y/QvdC40LUiCisKKyM6IGdpdC1ndWkuc2g6MTg2OSBsaWIvbWVyZ2UudGNsOjEyMCBsaWIvbWVyZ2UudGNsOjE0OSBsaWIvbWVyZ2UudGNsOjE2NworbXNnaWQgIk1lcmdlIgorbXNnc3RyICLQntCx0YrQtdC00LjQvdC40YLRjCIKKworIzogZ2l0LWd1aS5zaDoxODcwIGxpYi9jaG9vc2VfcmV2LnRjbDo1NTcKK21zZ2lkICJSZW1vdGUiCittc2dzdHIgItCS0L3QtdGI0L3QuNC1INGA0LXQv9C+0LfQuNGC0L7RgNC40LgiCisKKyM6IGdpdC1ndWkuc2g6MTg3OQorbXNnaWQgIkJyb3dzZSBDdXJyZW50IEJyYW5jaCdzIEZpbGVzIgorbXNnc3RyICLQn9GA0L7RgdC80L7RgtGA0LXRgtGMINGE0LDQudC70Ysg0YLQtdC60YPRidC10Lkg0LLQtdGC0LLQuCIKKworIzogZ2l0LWd1aS5zaDoxODgzCittc2dpZCAiQnJvd3NlIEJyYW5jaCBGaWxlcy4uLiIKK21zZ3N0ciAi0J/QvtC60LDQt9Cw0YLRjCDRhNCw0LnQu9GLINCy0LXRgtCy0LguLi4iCisKKyM6IGdpdC1ndWkuc2g6MTg4OAorbXNnaWQgIlZpc3VhbGl6ZSBDdXJyZW50IEJyYW5jaCdzIEhpc3RvcnkiCittc2dzdHIgItCY0YHRgtC+0YDQuNGPINGC0LXQutGD0YnQtdC5INCy0LXRgtCy0Lgg0L3QsNCz0LvRj9C00L3QviIKKworIzogZ2l0LWd1aS5zaDoxODkyCittc2dpZCAiVmlzdWFsaXplIEFsbCBCcmFuY2ggSGlzdG9yeSIKK21zZ3N0ciAi0JjRgdGC0L7RgNC40Y8g0LLRgdC10YUg0LLQtdGC0LLQtdC5INC90LDQs9C70Y/QtNC90L4iCisKKyM6IGdpdC1ndWkuc2g6MTg5OQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkJyb3dzZSAlcydzIEZpbGVzIgorbXNnc3RyICLQn9C+0LrQsNC30LDRgtGMINGE0LDQudC70Ysg0LLQtdGC0LLQuCAlcyIKKworIzogZ2l0LWd1aS5zaDoxOTAxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVmlzdWFsaXplICVzJ3MgSGlzdG9yeSIKK21zZ3N0ciAi0JjRgdGC0L7RgNC40Y8g0LLQtdGC0LLQuCAlcyDQvdCw0LPQu9GP0LTQvdC+IgorCisjOiBnaXQtZ3VpLnNoOjE5MDYgbGliL2RhdGFiYXNlLnRjbDoyNyBsaWIvZGF0YWJhc2UudGNsOjY3Cittc2dpZCAiRGF0YWJhc2UgU3RhdGlzdGljcyIKK21zZ3N0ciAi0KHRgtCw0YLQuNGB0YLQuNC60LAg0LHQsNC30Ysg0LTQsNC90L3Ri9GFIgorCisjOiBnaXQtZ3VpLnNoOjE5MDkgbGliL2RhdGFiYXNlLnRjbDozNAorbXNnaWQgIkNvbXByZXNzIERhdGFiYXNlIgorbXNnc3RyICLQodC20LDRgtGMINCx0LDQt9GDINC00LDQvdC90YvRhSIKKworIzogZ2l0LWd1aS5zaDoxOTEyCittc2dpZCAiVmVyaWZ5IERhdGFiYXNlIgorbXNnc3RyICLQn9GA0L7QstC10YDQuNGC0Ywg0LHQsNC30YMg0LTQsNC90L3Ri9GFIgorCisjOiBnaXQtZ3VpLnNoOjE5MTkgZ2l0LWd1aS5zaDoxOTIzIGdpdC1ndWkuc2g6MTkyNyBsaWIvc2hvcnRjdXQudGNsOjcKKyM6IGxpYi9zaG9ydGN1dC50Y2w6MzkgbGliL3Nob3J0Y3V0LnRjbDo3MQorbXNnaWQgIkNyZWF0ZSBEZXNrdG9wIEljb24iCittc2dzdHIgItCh0L7Qt9C00LDRgtGMINGP0YDQu9GL0Log0L3QsCDRgNCw0LHQvtGH0LXQvCDRgdGC0L7Qu9C1IgorCisjOiBnaXQtZ3VpLnNoOjE5MzIgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxNzcgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxODUKK21zZ2lkICJRdWl0IgorbXNnc3RyICLQktGL0YXQvtC0IgorCisjOiBnaXQtZ3VpLnNoOjE5MzkKK21zZ2lkICJVbmRvIgorbXNnc3RyICLQntGC0LzQtdC90LjRgtGMIgorCisjOiBnaXQtZ3VpLnNoOjE5NDIKK21zZ2lkICJSZWRvIgorbXNnc3RyICLQn9C+0LLRgtC+0YDQuNGC0YwiCisKKyM6IGdpdC1ndWkuc2g6MTk0NiBnaXQtZ3VpLnNoOjI0NDMKK21zZ2lkICJDdXQiCittc2dzdHIgItCS0YvRgNC10LfQsNGC0YwiCisKKyM6IGdpdC1ndWkuc2g6MTk0OSBnaXQtZ3VpLnNoOjI0NDYgZ2l0LWd1aS5zaDoyNTIwIGdpdC1ndWkuc2g6MjYxNAorIzogbGliL2NvbnNvbGUudGNsOjY5Cittc2dpZCAiQ29weSIKK21zZ3N0ciAi0JrQvtC/0LjRgNC+0LLQsNGC0YwiCisKKyM6IGdpdC1ndWkuc2g6MTk1MiBnaXQtZ3VpLnNoOjI0NDkKK21zZ2lkICJQYXN0ZSIKK21zZ3N0ciAi0JLRgdGC0LDQstC40YLRjCIKKworIzogZ2l0LWd1aS5zaDoxOTU1IGdpdC1ndWkuc2g6MjQ1MiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MjYKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MzgKK21zZ2lkICJEZWxldGUiCittc2dzdHIgItCj0LTQsNC70LjRgtGMIgorCisjOiBnaXQtZ3VpLnNoOjE5NTkgZ2l0LWd1aS5zaDoyNDU2IGdpdC1ndWkuc2g6MjYxOCBsaWIvY29uc29sZS50Y2w6NzEKK21zZ2lkICJTZWxlY3QgQWxsIgorbXNnc3RyICLQktGL0LTQtdC70LjRgtGMINCy0YHQtSIKKworIzogZ2l0LWd1aS5zaDoxOTY4Cittc2dpZCAiQ3JlYXRlLi4uIgorbXNnc3RyICLQodC+0LfQtNCw0YLRjC4uLiIKKworIzogZ2l0LWd1aS5zaDoxOTc0Cittc2dpZCAiQ2hlY2tvdXQuLi4iCittc2dzdHIgItCf0LXRgNC10LnRgtC4Li4uIgorCisjOiBnaXQtZ3VpLnNoOjE5ODAKK21zZ2lkICJSZW5hbWUuLi4iCittc2dzdHIgItCf0LXRgNC10LjQvNC10L3QvtCy0LDRgtGMLi4uIgorCisjOiBnaXQtZ3VpLnNoOjE5ODUgZ2l0LWd1aS5zaDoyMDg1Cittc2dpZCAiRGVsZXRlLi4uIgorbXNnc3RyICLQo9C00LDQu9C40YLRjC4uLiIKKworIzogZ2l0LWd1aS5zaDoxOTkwCittc2dpZCAiUmVzZXQuLi4iCittc2dzdHIgItCh0LHRgNC+0YHQuNGC0YwuLi4iCisKKyM6IGdpdC1ndWkuc2g6MjAwMiBnaXQtZ3VpLnNoOjIzODkKK21zZ2lkICJOZXcgQ29tbWl0IgorbXNnc3RyICLQndC+0LLQvtC1INGB0L7RgdGC0L7Rj9C90LjQtSIKKworIzogZ2l0LWd1aS5zaDoyMDEwIGdpdC1ndWkuc2g6MjM5NgorbXNnaWQgIkFtZW5kIExhc3QgQ29tbWl0IgorbXNnc3RyICLQmNGB0L/RgNCw0LLQuNGC0Ywg0L/QvtGB0LvQtdC00L3QtdC1INGB0L7RgdGC0L7Rj9C90LjQtSIKKworIzogZ2l0LWd1aS5zaDoyMDE5IGdpdC1ndWkuc2g6MjM1NiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjk5Cittc2dpZCAiUmVzY2FuIgorbXNnc3RyICLQn9C10YDQtdGH0LjRgtCw0YLRjCIKKworIzogZ2l0LWd1aS5zaDoyMDI1Cittc2dpZCAiU3RhZ2UgVG8gQ29tbWl0IgorbXNnc3RyICLQn9C+0LTQs9C+0YLQvtCy0LjRgtGMINC00LvRjyDRgdC+0YXRgNCw0L3QtdC90LjRjyIKKworIzogZ2l0LWd1aS5zaDoyMDMxCittc2dpZCAiU3RhZ2UgQ2hhbmdlZCBGaWxlcyBUbyBDb21taXQiCittc2dzdHIgItCf0L7QtNCz0L7RgtC+0LLQuNGC0Ywg0LjQt9C80LXQvdC10L3QvdGL0LUg0YTQsNC50LvRiyDQtNC70Y8g0YHQvtGF0YDQsNC90LXQvdC40Y8iCisKKyM6IGdpdC1ndWkuc2g6MjAzNworbXNnaWQgIlVuc3RhZ2UgRnJvbSBDb21taXQiCittc2dzdHIgItCj0LHRgNCw0YLRjCDQuNC3INC/0L7QtNCz0L7RgtC+0LLQu9C10L3QvdC+0LPQviIKKworIzogZ2l0LWd1aS5zaDoyMDQyIGxpYi9pbmRleC50Y2w6Mzk1Cittc2dpZCAiUmV2ZXJ0IENoYW5nZXMiCittc2dzdHIgItCe0YLQvNC10L3QuNGC0Ywg0LjQt9C80LXQvdC10L3QuNGPIgorCisjOiBnaXQtZ3VpLnNoOjIwNDkgZ2l0LWd1aS5zaDoyMzY4IGdpdC1ndWkuc2g6MjQ2NworbXNnaWQgIlNpZ24gT2ZmIgorbXNnc3RyICLQn9C+0LTQv9C40YHQsNGC0YwiCisKKyM6IGdpdC1ndWkuc2g6MjA1MyBnaXQtZ3VpLnNoOjIzNzIKK21zZ2lkICJDb21taXRAQHZlcmIiCittc2dzdHIgItCh0L7RhdGA0LDQvdC40YLRjCIKKworIzogZ2l0LWd1aS5zaDoyMDY0Cittc2dpZCAiTG9jYWwgTWVyZ2UuLi4iCittc2dzdHIgItCb0L7QutCw0LvRjNC90L7QtSDQvtCx0YrQtdC00LjQvdC10L3QuNC1Li4uIgorCisjOiBnaXQtZ3VpLnNoOjIwNjkKK21zZ2lkICJBYm9ydCBNZXJnZS4uLiIKK21zZ3N0ciAi0J/RgNC10YDQstCw0YLRjCDQvtCx0YrQtdC00LjQvdC10L3QuNC1Li4uIgorCisjOiBnaXQtZ3VpLnNoOjIwODEKK21zZ2lkICJQdXNoLi4uIgorbXNnc3RyICLQntGC0L/RgNCw0LLQuNGC0YwuLi4iCisKKyM6IGdpdC1ndWkuc2g6MjA5MiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQxCittc2dpZCAiQXBwbGUiCittc2dzdHIgIiIKKworIzogZ2l0LWd1aS5zaDoyMDk1IGdpdC1ndWkuc2g6MjExNyBsaWIvYWJvdXQudGNsOjE0CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ0IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJBYm91dCAlcyIKK21zZ3N0ciAi0J4gJXMiCisKKyM6IGdpdC1ndWkuc2g6MjA5OQorbXNnaWQgIlByZWZlcmVuY2VzLi4uIgorbXNnc3RyICLQndCw0YHRgtGA0L7QudC60LguLi4iCisKKyM6IGdpdC1ndWkuc2g6MjEwNyBnaXQtZ3VpLnNoOjI2MzkKK21zZ2lkICJPcHRpb25zLi4uIgorbXNnc3RyICLQndCw0YHRgtGA0L7QudC60LguLi4iCisKKyM6IGdpdC1ndWkuc2g6MjExMyBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ3Cittc2dpZCAiSGVscCIKK21zZ3N0ciAi0J/QvtC80L7RidGMIgorCisjOiBnaXQtZ3VpLnNoOjIxNTQKK21zZ2lkICJPbmxpbmUgRG9jdW1lbnRhdGlvbiIKK21zZ3N0ciAi0JTQvtC60YPQvNC10L3RgtCw0YbQuNGPINCyINC40L3RgtC10YDQvdC10YLQtSIKKworIzogZ2l0LWd1aS5zaDoyMjM4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiZmF0YWw6IGNhbm5vdCBzdGF0IHBhdGggJXM6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiCittc2dzdHIgItC60YDQuNGC0LjRh9C10YHQutCw0Y8g0L7RiNC40LHQutCwOiAlczog0L3QtdGCINGC0LDQutC+0LPQviDRhNCw0LnQu9CwINC40LvQuCDQutCw0YLQsNC70L7Qs9CwIgorCisjOiBnaXQtZ3VpLnNoOjIyNzEKK21zZ2lkICJDdXJyZW50IEJyYW5jaDoiCittc2dzdHIgItCi0LXQutGD0YnQsNGPINCy0LXRgtCy0Yw6IgorCisjOiBnaXQtZ3VpLnNoOjIyOTIKK21zZ2lkICJTdGFnZWQgQ2hhbmdlcyAoV2lsbCBDb21taXQpIgorbXNnc3RyICLQn9C+0LTQs9C+0YLQvtCy0LvQtdC90L4gKNCx0YPQtNC10YIg0YHQvtGF0YDQsNC90LXQvdC+KSIKKworIzogZ2l0LWd1aS5zaDoyMzEyCittc2dpZCAiVW5zdGFnZWQgQ2hhbmdlcyIKK21zZ3N0ciAi0JjQt9C80LXQvdC10L3QviAo0L3QtSDQsdGD0LTQtdGCINGB0L7RhdGA0LDQvdC10L3QvikiCisKKyM6IGdpdC1ndWkuc2g6MjM2MgorbXNnaWQgIlN0YWdlIENoYW5nZWQiCittc2dzdHIgItCf0L7QtNCz0L7RgtC+0LLQuNGC0Ywg0LLRgdC1IgorCisjOiBnaXQtZ3VpLnNoOjIzNzggbGliL3RyYW5zcG9ydC50Y2w6OTMgbGliL3RyYW5zcG9ydC50Y2w6MTgyCittc2dpZCAiUHVzaCIKK21zZ3N0ciAi0J7RgtC/0YDQsNCy0LjRgtGMIgorCisjOiBnaXQtZ3VpLnNoOjI0MDgKK21zZ2lkICJJbml0aWFsIENvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAi0JrQvtC80LzQtdC90YLQsNGA0LjQuSDQuiDQv9C10YDQstC+0LzRgyDRgdC+0YHRgtC+0Y/QvdC40Y46IgorCisjOiBnaXQtZ3VpLnNoOjI0MDkKK21zZ2lkICJBbWVuZGVkIENvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAi0JrQvtC80LzQtdC90YLQsNGA0LjQuSDQuiDQuNGB0L/RgNCw0LLQu9C10L3QvdC+0LzRgyDRgdC+0YHRgtC+0Y/QvdC40Y46IgorCisjOiBnaXQtZ3VpLnNoOjI0MTAKK21zZ2lkICJBbWVuZGVkIEluaXRpYWwgQ29tbWl0IE1lc3NhZ2U6IgorbXNnc3RyICLQmtC+0LzQvNC10L3RgtCw0YDQuNC5INC6INC40YHQv9GA0LDQstC70LXQvdC90L7QvNGDINC/0LXRgNCy0L7QvdCw0YfQsNC70YzQvdC+0LzRgyDRgdC+0YHRgtC+0Y/QvdC40Y46IgorCisjOiBnaXQtZ3VpLnNoOjI0MTEKK21zZ2lkICJBbWVuZGVkIE1lcmdlIENvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAi0JrQvtC80LzQtdC90YLQsNGA0LjQuSDQuiDQuNGB0L/RgNCw0LLQu9C10L3QvdC+0LzRgyDQvtCx0YrQtdC00LjQvdC10L3QuNGOOiIKKworIzogZ2l0LWd1aS5zaDoyNDEyCittc2dpZCAiTWVyZ2UgQ29tbWl0IE1lc3NhZ2U6IgorbXNnc3RyICLQmtC+0LzQvNC10L3RgtCw0YDQuNC5INC6INC+0LHRitC10LTQuNC90LXQvdC40Y46IgorCisjOiBnaXQtZ3VpLnNoOjI0MTMKK21zZ2lkICJDb21taXQgTWVzc2FnZToiCittc2dzdHIgItCa0L7QvNC80LXQvdGC0LDRgNC40Lkg0Log0YHQvtGB0YLQvtGP0L3QuNGOOiIKKworIzogZ2l0LWd1aS5zaDoyNDU5IGdpdC1ndWkuc2g6MjYyMiBsaWIvY29uc29sZS50Y2w6NzMKK21zZ2lkICJDb3B5IEFsbCIKK21zZ3N0ciAi0JrQvtC/0LjRgNC+0LLQsNGC0Ywg0LLRgdC1IgorCisjOiBnaXQtZ3VpLnNoOjI0ODMgbGliL2JsYW1lLnRjbDoxMDcKK21zZ2lkICJGaWxlOiIKK21zZ3N0ciAi0KTQsNC50Ls6IgorCisjOiBnaXQtZ3VpLnNoOjI1ODkKK21zZ2lkICJBcHBseS9SZXZlcnNlIEh1bmsiCittc2dzdHIgItCf0YDQuNC80LXQvdC40YLRjC/Qo9Cx0YDQsNGC0Ywg0LjQt9C80LXQvdC10L3QuNC1IgorCisjOiBnaXQtZ3VpLnNoOjI1OTUKK21zZ2lkICJTaG93IExlc3MgQ29udGV4dCIKK21zZ3N0ciAi0JzQtdC90YzRiNC1INC60L7QvdGC0LXQutGB0YLQsCIKKworIzogZ2l0LWd1aS5zaDoyNjAyCittc2dpZCAiU2hvdyBNb3JlIENvbnRleHQiCittc2dzdHIgItCR0L7Qu9GM0YjQtSDQutC+0L3RgtC10LrRgdGC0LAiCisKKyM6IGdpdC1ndWkuc2g6MjYxMAorbXNnaWQgIlJlZnJlc2giCittc2dzdHIgItCe0LHQvdC+0LLQuNGC0YwiCisKKyM6IGdpdC1ndWkuc2g6MjYzMQorbXNnaWQgIkRlY3JlYXNlIEZvbnQgU2l6ZSIKK21zZ3N0ciAi0KPQvNC10L3RjNGI0LjRgtGMINGA0LDQt9C80LXRgCDRiNGA0LjRhNGC0LAiCisKKyM6IGdpdC1ndWkuc2g6MjYzNQorbXNnaWQgIkluY3JlYXNlIEZvbnQgU2l6ZSIKK21zZ3N0ciAi0KPQstC10LvQuNGH0LjRgtGMINGA0LDQt9C80LXRgCDRiNGA0LjRhNGC0LAiCisKKyM6IGdpdC1ndWkuc2g6MjY0NgorbXNnaWQgIlVuc3RhZ2UgSHVuayBGcm9tIENvbW1pdCIKK21zZ3N0ciAi0J3QtSDRgdC+0YXRgNCw0L3Rj9GC0Ywg0YfQsNGB0YLRjCIKKworIzogZ2l0LWd1aS5zaDoyNjQ4Cittc2dpZCAiU3RhZ2UgSHVuayBGb3IgQ29tbWl0IgorbXNnc3RyICLQn9C+0LTQs9C+0YLQvtCy0LjRgtGMINGH0LDRgdGC0Ywg0LTQu9GPINGB0L7RhdGA0LDQvdC10L3QuNGPIgorCisjOiBnaXQtZ3VpLnNoOjI2NjcKK21zZ2lkICJJbml0aWFsaXppbmcuLi4iCittc2dzdHIgItCY0L3QuNGG0LjQsNC70LjQt9Cw0YbQuNGPLi4uIgorCisjOiBnaXQtZ3VpLnNoOjI3NjIKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiUG9zc2libGUgZW52aXJvbm1lbnQgaXNzdWVzIGV4aXN0LlxuIgorIlxuIgorIlRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBwcm9iYWJseVxuIgorImdvaW5nIHRvIGJlIGlnbm9yZWQgYnkgYW55IEdpdCBzdWJwcm9jZXNzIHJ1blxuIgorImJ5ICVzOlxuIgorIlxuIgorbXNnc3RyICIiCisi0JLQvtC30LzQvtC20L3RiyDQvtGI0LjQsdC60Lgg0LIg0L/QtdGA0LXQvNC10L3QvdGL0YUg0L7QutGA0YPQttC10L3QuNGPLlxuIgorIlxuIgorItCf0LXRgNC10LzQtdC90L3Ri9C1INC+0LrRgNGD0LbQtdC90LjRjywg0LrQvtGC0L7RgNGL0LUg0LLQvtC30LzQvtC20L3QvlxuIgorItCx0YPQtNGD0YIg0L/RgNC+0LjQs9C90L7RgNC40YDQvtCy0LDQvdGLINC60L7QvNCw0L3QtNCw0LzQuCBHaXQsXG4iCisi0LfQsNC/0YPRidC10L3QvdGL0LzQuCDQuNC3ICVzXG4iCisiXG4iCisKKyM6IGdpdC1ndWkuc2g6Mjc5MgorbXNnaWQgIiIKKyJcbiIKKyJUaGlzIGlzIGR1ZSB0byBhIGtub3duIGlzc3VlIHdpdGggdGhlXG4iCisiVGNsIGJpbmFyeSBkaXN0cmlidXRlZCBieSBDeWd3aW4uIgorbXNnc3RyICIiCisiXG4iCisi0K3RgtC+INC40LfQstC10YHRgtC90LDRjyDQv9GA0L7QsdC70LXQvNCwINGBIFRjbCxcbiIKKyLRgNCw0YHQv9GA0L7RgdGC0YDQsNC90Y/QtdC80YvQvCBDeWd3aW4uIgorCisjOiBnaXQtZ3VpLnNoOjI3OTcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiXG4iCisiQSBnb29kIHJlcGxhY2VtZW50IGZvciAlc1xuIgorImlzIHBsYWNpbmcgdmFsdWVzIGZvciB0aGUgdXNlci5uYW1lIGFuZFxuIgorInVzZXIuZW1haWwgc2V0dGluZ3MgaW50byB5b3VyIHBlcnNvbmFsXG4iCisifi8uZ2l0Y29uZmlnIGZpbGUuXG4iCittc2dzdHIgIiIKKyJcbiIKKyJcbiIKKyLQktC80LXRgdGC0L4g0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8gJXMg0LzQvtC20L3QvlxuIgorItGB0L7RhdGA0LDQvdC40YLRjCDQt9C90LDRh9C10L3QuNGPIHVzZXIubmFtZSDQuFxuIgorInVzZXIuZW1haWwg0LIg0JLQsNGI0LXQvCDQv9C10YDRgdC+0L3QsNC70YzQvdC+0LxcbiIKKyLRhNCw0LnQu9C1IH4vLmdpdGNvbmZpZy5cbiIKKworIzogbGliL2Fib3V0LnRjbDoyNgorbXNnaWQgImdpdC1ndWkgLSBhIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZSBmb3IgR2l0LiIKK21zZ3N0ciAiZ2l0LWd1aSAtINCz0YDQsNGE0LjRh9C10YHQutC40Lkg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC40Lkg0LjQvdGC0LXRgNGE0LXQudGBINC6IEdpdC4iCisKKyM6IGxpYi9ibGFtZS50Y2w6NzcKK21zZ2lkICJGaWxlIFZpZXdlciIKK21zZ3N0ciAi0J/RgNC+0YHQvNC+0YLRgCDRhNCw0LnQu9CwIgorCisjOiBsaWIvYmxhbWUudGNsOjgxCittc2dpZCAiQ29tbWl0OiIKK21zZ3N0ciAi0KHQvtGF0YDQsNC90LXQvdC90L7QtSDRgdC+0YHRgtC+0Y/QvdC40LU6IgorCisjOiBsaWIvYmxhbWUudGNsOjI2NAorbXNnaWQgIkNvcHkgQ29tbWl0IgorbXNnc3RyICLQodC60L7Qv9C40YDQvtCy0LDRgtGMIFNIQS0xIgorCisjOiBsaWIvYmxhbWUudGNsOjM4NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIlJlYWRpbmcgJXMuLi4iCittc2dzdHIgItCn0YLQtdC90LjQtSAlcy4uLiIKKworIzogbGliL2JsYW1lLnRjbDo0ODgKK21zZ2lkICJMb2FkaW5nIGNvcHkvbW92ZSB0cmFja2luZyBhbm5vdGF0aW9ucy4uLiIKK21zZ3N0ciAi0JfQsNCz0YDRg9C30LrQsCDQsNC90L3QvtGC0LDRhtC40Lgg0LrQvtC/0LjRgNC+0LLQsNC90LjQuS/Qv9C10YDQtdC40LzQtdC90L7QstCw0L3QuNC5Li4uIgorCisjOiBsaWIvYmxhbWUudGNsOjUwOAorbXNnaWQgImxpbmVzIGFubm90YXRlZCIKK21zZ3N0ciAi0YHRgtGA0L7QuiDQv9GA0L7QutC+0LzQvNC10L3RgtC40YDQvtCy0LDQvdC+IgorCisjOiBsaWIvYmxhbWUudGNsOjY4OQorbXNnaWQgIkxvYWRpbmcgb3JpZ2luYWwgbG9jYXRpb24gYW5ub3RhdGlvbnMuLi4iCittc2dzdHIgItCX0LDQs9GA0YPQt9C60LAg0LDQvdC90L7RgtCw0YbQuNC5INC/0LXRgNCy0L7QvdCw0YfQsNC70YzQvdC+0LPQviDQv9C+0LvQvtC20LXQvdC40Y8g0L7QsdGK0LXQutGC0LAuLi4iCisKKyM6IGxpYi9ibGFtZS50Y2w6NjkyCittc2dpZCAiQW5ub3RhdGlvbiBjb21wbGV0ZS4iCittc2dzdHIgItCQ0L3QvdC+0YLQsNGG0LjRjyDQt9Cw0LLQtdGA0YjQtdC90LAuIgorCisjOiBsaWIvYmxhbWUudGNsOjc0NgorbXNnaWQgIkxvYWRpbmcgYW5ub3RhdGlvbi4uLiIKK21zZ3N0ciAi0JfQsNCz0YDRg9C30LrQsCDQsNC90L3QvtGC0LDRhtC40LguLi4iCisKKyM6IGxpYi9ibGFtZS50Y2w6ODAyCittc2dpZCAiQXV0aG9yOiIKK21zZ3N0ciAi0JDQstGC0L7RgDoiCisKKyM6IGxpYi9ibGFtZS50Y2w6ODA2Cittc2dpZCAiQ29tbWl0dGVyOiIKK21zZ3N0ciAi0KHQvtGF0YDQsNC90LjQuzoiCisKKyM6IGxpYi9ibGFtZS50Y2w6ODExCittc2dpZCAiT3JpZ2luYWwgRmlsZToiCittc2dzdHIgItCY0YHRhdC+0LTQvdGL0Lkg0YTQsNC50Ls6IgorCisjOiBsaWIvYmxhbWUudGNsOjkyNQorbXNnaWQgIk9yaWdpbmFsbHkgQnk6IgorbXNnc3RyICLQmNGB0YLQvtGH0L3QuNC6OiIKKworIzogbGliL2JsYW1lLnRjbDo5MzEKK21zZ2lkICJJbiBGaWxlOiIKK21zZ3N0ciAi0KTQsNC50Ls6IgorCisjOiBsaWIvYmxhbWUudGNsOjkzNgorbXNnaWQgIkNvcGllZCBPciBNb3ZlZCBIZXJlIEJ5OiIKK21zZ3N0ciAi0KHQutC+0L/QuNGA0L7QstCw0L3Qvi/Qv9C10YDQtdC80LXRidC10L3QviDQsjoiCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjE0IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjE5Cittc2dpZCAiQ2hlY2tvdXQgQnJhbmNoIgorbXNnc3RyICLQn9C10YDQtdC50YLQuCDQvdCwINCy0LXRgtCy0YwiCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjIzCittc2dpZCAiQ2hlY2tvdXQiCittc2dzdHIgItCf0LXRgNC10LnRgtC4IgorCisjOiBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDoyNyBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MzUKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDozMiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MzAgbGliL2Jyb3dzZXIudGNsOjI4MgorIzogbGliL2NoZWNrb3V0X29wLnRjbDo1MjIgbGliL2Nob29zZV9mb250LnRjbDo0MyBsaWIvbWVyZ2UudGNsOjE3MQorIzogbGliL29wdGlvbi50Y2w6MTAzIGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6NDIgbGliL3RyYW5zcG9ydC50Y2w6OTcKK21zZ2lkICJDYW5jZWwiCittc2dzdHIgItCe0YLQvNC10L3QuNGC0YwiCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjMyIGxpYi9icm93c2VyLnRjbDoyODcKK21zZ2lkICJSZXZpc2lvbiIKK21zZ3N0ciAi0JLQtdGA0YHQuNGPIgorCisjOiBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDozNiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NjkgbGliL29wdGlvbi50Y2w6MjQyCittc2dpZCAiT3B0aW9ucyIKK21zZ3N0ciAi0J3QsNGB0YLRgNC+0LnQutC4IgorCisjOiBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDozOSBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6OTIKK21zZ2lkICJGZXRjaCBUcmFja2luZyBCcmFuY2giCittc2dzdHIgItCf0L7Qu9GD0YfQuNGC0Ywg0LjQt9C80LXQvdC10L3QuNGPINC40Lcg0LLQvdC10YjQvdC10Lkg0LLQtdGC0LLQuCIKKworIzogbGliL2JyYW5jaF9jaGVja291dC50Y2w6NDQKK21zZ2lkICJEZXRhY2ggRnJvbSBMb2NhbCBCcmFuY2giCittc2dzdHIgItCe0YLRgdC+0LXQtNC40L3QuNGC0Ywg0L7RgiDQu9C+0LrQsNC70YzQvdC+0Lkg0LLQtdGC0LLQuCIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjIyCittc2dpZCAiQ3JlYXRlIEJyYW5jaCIKK21zZ3N0ciAi0KHQvtC30LTQsNC90LjQtSDQstC10YLQstC4IgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MjcKK21zZ2lkICJDcmVhdGUgTmV3IEJyYW5jaCIKK21zZ3N0ciAi0KHQvtC30LTQsNGC0Ywg0L3QvtCy0YPRjiDQstC10YLQstGMIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MzEgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozNzEKK21zZ2lkICJDcmVhdGUiCittc2dzdHIgItCh0L7Qt9C00LDRgtGMIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NDAKK21zZ2lkICJCcmFuY2ggTmFtZSIKK21zZ3N0ciAi0J3QsNC30LLQsNC90LjQtSDQstC10YLQstC4IgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NDMKK21zZ2lkICJOYW1lOiIKK21zZ3N0ciAi0J3QsNC30LLQsNC90LjQtToiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo1OAorbXNnaWQgIk1hdGNoIFRyYWNraW5nIEJyYW5jaCBOYW1lIgorbXNnc3RyICLQktC30Y/RgtGMINC40Lcg0LjQvNC10L0g0LLQtdGC0LLQtdC5INGB0LvQtdC20LXQvdC40Y8iCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo2NgorbXNnaWQgIlN0YXJ0aW5nIFJldmlzaW9uIgorbXNnc3RyICLQndCw0YfQsNC70YzQvdCw0Y8g0LLQtdGA0YHQuNGPIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NzIKK21zZ2lkICJVcGRhdGUgRXhpc3RpbmcgQnJhbmNoOiIKK21zZ3N0ciAi0J7QsdC90L7QstC40YLRjCDQuNC80LXRjtGJ0YPRjtGB0Y8g0LLQtdGC0LLRjDoiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo3NQorbXNnaWQgIk5vIgorbXNnc3RyICLQndC10YIiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo4MAorbXNnaWQgIkZhc3QgRm9yd2FyZCBPbmx5IgorbXNnc3RyICLQotC+0LvRjNC60L4gRmFzdCBGb3J3YXJkIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6ODUgbGliL2NoZWNrb3V0X29wLnRjbDo1MTQKK21zZ2lkICJSZXNldCIKK21zZ3N0ciAi0KHQsdGA0L7RgSIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjk3Cittc2dpZCAiQ2hlY2tvdXQgQWZ0ZXIgQ3JlYXRpb24iCittc2dzdHIgItCf0L7RgdC70LUg0YHQvtC30LTQsNC90LjRjyDRgdC00LXQu9Cw0YLRjCDRgtC10LrRg9GJ0LXQuSIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjEzMQorbXNnaWQgIlBsZWFzZSBzZWxlY3QgYSB0cmFja2luZyBicmFuY2guIgorbXNnc3RyICLQo9C60LDQttC40YLQtSDQstC10YLQstGMINGB0LvQtdC20LXQvdC40Y8uIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MTQwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVHJhY2tpbmcgYnJhbmNoICVzIGlzIG5vdCBhIGJyYW5jaCBpbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnkuIgorbXNnc3RyICLQktC10YLQstGMINGB0LvQtdC20LXQvdC40Y8gJXMg0L3QtSDRj9Cy0LvRj9C10YLRgdGPINCy0LXRgtCy0YzRjiDQstC+INCy0L3QtdGI0L3QtdC8INGA0LXQv9C+0LfQuNGC0L7RgNC40LguIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MTUzIGxpYi9icmFuY2hfcmVuYW1lLnRjbDo4NgorbXNnaWQgIlBsZWFzZSBzdXBwbHkgYSBicmFuY2ggbmFtZS4iCittc2dzdHIgItCj0LrQsNC20LjRgtC1INC90LDQt9Cy0LDQvdC40LUg0LLQtdGC0LLQuC4iCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDoxNjQgbGliL2JyYW5jaF9yZW5hbWUudGNsOjEwNgorIywgdGNsLWZvcm1hdAorbXNnaWQgIiclcycgaXMgbm90IGFuIGFjY2VwdGFibGUgYnJhbmNoIG5hbWUuIgorbXNnc3RyICLQndC10LTQvtC/0YPRgdGC0LjQvNC+0LUg0L3QsNC30LLQsNC90LjQtSDQstC10YLQstC4ICclcycuIgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MTUKK21zZ2lkICJEZWxldGUgQnJhbmNoIgorbXNnc3RyICLQo9C00LDQu9C10L3QuNC1INCy0LXRgtCy0LgiCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDoyMAorbXNnaWQgIkRlbGV0ZSBMb2NhbCBCcmFuY2giCittc2dzdHIgItCj0LTQsNC70LjRgtGMINC70L7QutCw0LvRjNC90YPRjiDQstC10YLQstGMIgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MzcKK21zZ2lkICJMb2NhbCBCcmFuY2hlcyIKK21zZ3N0ciAi0JvQvtC60LDQu9GM0L3Ri9C1INCy0LXRgtCy0LgiCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDo1MgorbXNnaWQgIkRlbGV0ZSBPbmx5IElmIE1lcmdlZCBJbnRvIgorbXNnc3RyICLQo9C00LDQu9C40YLRjCDRgtC+0LvRjNC60L4g0LIg0YHQu9GD0YfQsNC1LCDQtdGB0LvQuCDQsdGL0LvQviDQvtCx0YrQtdC00LjQvdC10L3QuNC1INGBIgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6NTQKK21zZ2lkICJBbHdheXMgKERvIG5vdCBwZXJmb3JtIG1lcmdlIHRlc3QuKSIKK21zZ3N0ciAi0JLRgdC10LPQtNCwICjQvdC1INCy0YvQv9C+0LvQvdGP0YLRjCDQv9GA0L7QstC10YDQutGDINC90LAg0L7QsdGK0LXQtNC40L3QtdC90LjQtSkiCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDoxMDMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJUaGUgZm9sbG93aW5nIGJyYW5jaGVzIGFyZSBub3QgY29tcGxldGVseSBtZXJnZWQgaW50byAlczoiCittc2dzdHIgItCh0LvQtdC00YPRjtGJ0LjQtSDQstC10YLQstC4INC+0LHRitC10LTQuNC90LXQvdGLINGBICVzINC90LUg0L/QvtC70L3QvtGB0YLRjNGOOiIKKworIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjExNQorbXNnaWQgIiIKKyJSZWNvdmVyaW5nIGRlbGV0ZWQgYnJhbmNoZXMgaXMgZGlmZmljdWx0LiBcbiIKKyJcbiIKKyIgRGVsZXRlIHRoZSBzZWxlY3RlZCBicmFuY2hlcz8iCittc2dzdHIgIiIKKyLQktC+0YHRgdGC0LDQvdCw0LLQu9C40LLQsNGC0Ywg0YPQtNCw0LvQtdC90L3Ri9C1INCy0LXRgtCy0Lgg0YHQu9C+0LbQvdC+LiBcbiIKKyJcbiIKKyIg0KPQtNCw0LvQuNGC0Ywg0LLRi9Cx0YDQsNC90L3Ri9C1INCy0LXRgtCy0Lg/IgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MTQxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBkZWxldGUgYnJhbmNoZXM6XG4iCisiJXMiCittc2dzdHIgIiIKKyLQndC1INGD0LTQsNC70L7RgdGMINGD0LTQsNC70LjRgtGMINCy0LXRgtCy0Lg6XG4iCisiJXMiCisKKyM6IGxpYi9icmFuY2hfcmVuYW1lLnRjbDoxNCBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MjIKK21zZ2lkICJSZW5hbWUgQnJhbmNoIgorbXNnc3RyICLQn9C10YDQtdC40LzQtdC90L7QstCw0L3QuNC1INCy0LXRgtCy0LgiCisKKyM6IGxpYi9icmFuY2hfcmVuYW1lLnRjbDoyNgorbXNnaWQgIlJlbmFtZSIKK21zZ3N0ciAi0J/QtdGA0LXQuNC80LXQvdC+0LLQsNGC0YwiCisKKyM6IGxpYi9icmFuY2hfcmVuYW1lLnRjbDozNgorbXNnaWQgIkJyYW5jaDoiCittc2dzdHIgItCS0LXRgtCy0Yw6IgorCisjOiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MzkKK21zZ2lkICJOZXcgTmFtZToiCittc2dzdHIgItCd0L7QstC+0LUg0L3QsNC30LLQsNC90LjQtToiCisKKyM6IGxpYi9icmFuY2hfcmVuYW1lLnRjbDo3NQorbXNnaWQgIlBsZWFzZSBzZWxlY3QgYSBicmFuY2ggdG8gcmVuYW1lLiIKK21zZ3N0ciAi0KPQutCw0LbQuNGC0LUg0LLQtdGC0LLRjCDQtNC70Y8g0L/QtdGA0LXQuNC80LXQvdC+0LLQsNC90LjRjy4iCisKKyM6IGxpYi9icmFuY2hfcmVuYW1lLnRjbDo5NiBsaWIvY2hlY2tvdXRfb3AudGNsOjE3OQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkJyYW5jaCAnJXMnIGFscmVhZHkgZXhpc3RzLiIKK21zZ3N0ciAi0JLQtdGC0LLRjCAnJXMnINGD0LbQtSDRgdGD0YnQtdGB0YLQstGD0LXRgi4iCisKKyM6IGxpYi9icmFuY2hfcmVuYW1lLnRjbDoxMTcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcmVuYW1lICclcycuIgorbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINC/0LXRgNC10LjQvNC10L3QvtCy0LDRgtGMICclcycuICIKKworIzogbGliL2Jyb3dzZXIudGNsOjE3Cittc2dpZCAiU3RhcnRpbmcuLi4iCittc2dzdHIgItCX0LDQv9GD0YHQui4uLiIKKworIzogbGliL2Jyb3dzZXIudGNsOjI2Cittc2dpZCAiRmlsZSBCcm93c2VyIgorbXNnc3RyICLQn9GA0L7RgdC80L7RgtGAINGB0L/QuNGB0LrQsCDRhNCw0LnQu9C+0LIiCisKKyM6IGxpYi9icm93c2VyLnRjbDoxMjYgbGliL2Jyb3dzZXIudGNsOjE0MworIywgdGNsLWZvcm1hdAorbXNnaWQgIkxvYWRpbmcgJXMuLi4iCittc2dzdHIgItCX0LDQs9GA0YPQt9C60LAgJXMuLi4iCisKKyM6IGxpYi9icm93c2VyLnRjbDoxODcKK21zZ2lkICJbVXAgVG8gUGFyZW50XSIKK21zZ3N0ciAiW9Cd0LAg0YPRgNC+0LLQtdC90Ywg0LLRi9GI0LVdIgorCisjOiBsaWIvYnJvd3Nlci50Y2w6MjY3IGxpYi9icm93c2VyLnRjbDoyNzMKK21zZ2lkICJCcm93c2UgQnJhbmNoIEZpbGVzIgorbXNnc3RyICLQn9C+0LrQsNC30LDRgtGMINGE0LDQudC70Ysg0LLQtdGC0LLQuCIKKworIzogbGliL2Jyb3dzZXIudGNsOjI3OCBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjM4NworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NzQgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0ODQKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTg3Cittc2dpZCAiQnJvd3NlIgorbXNnc3RyICLQn9C+0LrQsNC30LDRgtGMIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjc5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRmV0Y2hpbmcgJXMgZnJvbSAlcyIKK21zZ3N0ciAi0J/QvtC70YPRh9C10L3QuNC1ICVzINC40LcgJXMgIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjEyNworIywgdGNsLWZvcm1hdAorbXNnaWQgImZhdGFsOiBDYW5ub3QgcmVzb2x2ZSAlcyIKK21zZ3N0ciAi0LrRgNC40YLQuNGH0LXRgdC60LDRjyDQvtGI0LjQsdC60LA6INC90LXQstC+0LfQvNC+0LbQvdC+INGA0LDQt9GA0LXRiNC40YLRjCAlcyIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoxNDAgbGliL2NvbnNvbGUudGNsOjgxIGxpYi9kYXRhYmFzZS50Y2w6MzEKK21zZ2lkICJDbG9zZSIKK21zZ3N0ciAi0JfQsNC60YDRi9GC0YwiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MTY5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQnJhbmNoICclcycgZG9lcyBub3QgZXhpc3QuIgorbXNnc3RyICLQktC10YLQstGMICclcycg0L3QtSDRgdGD0YnQtdGB0YLQstGD0LXRgiAiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MjA2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIkJyYW5jaCAnJXMnIGFscmVhZHkgZXhpc3RzLlxuIgorIlxuIgorIkl0IGNhbm5vdCBmYXN0LWZvcndhcmQgdG8gJXMuXG4iCisiQSBtZXJnZSBpcyByZXF1aXJlZC4iCittc2dzdHIgIiIKKyLQktC10YLQstGMICclcycg0YPQttC1INGB0YPRidC10YHRgtCy0YPQtdGCLlxuIgorIlxuIgorItCe0L3QsCDQvdC1INC80L7QttC10YIg0LHRi9GC0Ywg0L/RgNC+0LrRgNGD0YfQtdC90LAoZmFzdC1mb3J3YXJkKSDQuiAlcy5cbiIKKyLQotGA0LXQsdGD0LXRgtGB0Y8g0L7QsdGK0LXQtNC40L3QtdC90LjQtS4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MjIwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiTWVyZ2Ugc3RyYXRlZ3kgJyVzJyBub3Qgc3VwcG9ydGVkLiIKK21zZ3N0ciAi0KHRgtGA0LDRgtC10LPQuNGPINC+0LHRitC10LTQuNC90LXQvdC40Y8gJyVzJyDQvdC1INC/0L7QtNC00LXRgNC20LjQstCw0LXRgtGB0Y8uIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjIzOQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byB1cGRhdGUgJyVzJy4iCittc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0L7QsdC90L7QstC40YLRjCAnJXMnLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoyNTEKK21zZ2lkICJTdGFnaW5nIGFyZWEgKGluZGV4KSBpcyBhbHJlYWR5IGxvY2tlZC4iCittc2dzdHIgItCg0LDQsdC+0YfQsNGPINC+0LHQu9Cw0YHRgtGMINC30LDQsdC70L7QutC40YDQvtCy0LDQvdCwINC00YDRg9Cz0LjQvCDQv9GA0L7RhtC10YHRgdC+0LwuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjI2NgorbXNnaWQgIiIKKyJMYXN0IHNjYW5uZWQgc3RhdGUgZG9lcyBub3QgbWF0Y2ggcmVwb3NpdG9yeSBzdGF0ZS5cbiIKKyJcbiIKKyJBbm90aGVyIEdpdCBwcm9ncmFtIGhhcyBtb2RpZmllZCB0aGlzIHJlcG9zaXRvcnkgc2luY2UgdGhlIGxhc3Qgc2Nhbi4gIEEgIgorInJlc2NhbiBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlIGN1cnJlbnQgYnJhbmNoIGNhbiBiZSBjaGFuZ2VkLlxuIgorIlxuIgorIlRoZSByZXNjYW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgbm93LlxuIgorbXNnc3RyICIiCisi0J/QvtGB0LvQtdC00L3QtdC1INC/0YDQvtGH0LjRgtCw0L3QvdC+0LUg0YHQvtGB0YLQvtGP0L3QuNC1INGA0LXQv9C+0LfQuNGC0L7RgNC40Y8g0L3QtSDRgdC+0L7RgtCy0LXRgtGB0YLQstGD0LXRgiDRgtC10LrRg9GJ0LXQvNGDLlxuIgorIlxuIgorItChINC80L7QvNC10L3RgtCwINC/0L7RgdC70LXQtNC90LXQuSDQv9GA0L7QstC10YDQutC4INGA0LXQv9C+0LfQuNGC0L7RgNC40Lkg0LHRi9C7INC40LfQvNC10L3QtdC9INC00YDRg9Cz0L7QuSDQv9GA0L7Qs9GA0LDQvNC80L7QuSBHaXQuICIKKyLQndC10L7QsdGF0L7QtNC40LzQviDQv9C10YDQtdGH0LjRgtCw0YLRjCDRgNC10L/QvtC30LjRgtC+0YDQuNC5LCDQv9GA0LXQttC00LUg0YfQtdC8INC40LfQvNC10L3Rj9GC0Ywg0YLQtdC60YPRidGD0Y4g0LLQtdGC0LLRjC5cbiIKKyJcbiIKKyLQrdGC0L4g0LHRg9C00LXRgiDRgdC00LXQu9Cw0L3QviDRgdC10LnRh9Cw0YEg0LDQstGC0L7QvNCw0YLQuNGH0LXRgdC60LguXG4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MzIyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVXBkYXRpbmcgd29ya2luZyBkaXJlY3RvcnkgdG8gJyVzJy4uLiIKK21zZ3N0ciAi0J7QsdC90L7QstC70LXQvdC40LUg0YDQsNCx0L7Rh9C10LPQviDQutCw0YLQsNC70L7Qs9CwINC40LcgJyVzJy4uLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDozMjMKK21zZ2lkICJmaWxlcyBjaGVja2VkIG91dCIKK21zZ3N0ciAi0YTQsNC50LvRiyDQuNC30LLQu9C10YfQtdC90YsiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MzUzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQWJvcnRlZCBjaGVja291dCBvZiAnJXMnIChmaWxlIGxldmVsIG1lcmdpbmcgaXMgcmVxdWlyZWQpLiIKK21zZ3N0ciAi0J/RgNC10YDQstCw0L0g0L/QtdGA0LXRhdC+0LQg0L3QsCAnJXMnICjRgtGA0LXQsdGD0LXRgtGB0Y8g0L7QsdGK0LXQtNC40L3QtdC90LjQtSDQvdCwINGD0YDQvtCy0L3QtSDRhNCw0LnQu9C+0LIpIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjM1NAorbXNnaWQgIkZpbGUgbGV2ZWwgbWVyZ2UgcmVxdWlyZWQuIgorbXNnc3RyICLQotGA0LXQsdGD0LXRgtGB0Y8g0L7QsdGK0LXQtNC40L3QtdC90LjQtSDQvdCwINGD0YDQvtCy0L3QtSDRhNCw0LnQu9C+0LIuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjM1OAorIywgdGNsLWZvcm1hdAorbXNnaWQgIlN0YXlpbmcgb24gYnJhbmNoICclcycuIgorbXNnc3RyICLQktC10YLQstGMICclcycg0L7RgdGC0LDQtdGC0YHRjyDRgtC10LrRg9GJ0LXQuS4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NDI5Cittc2dpZCAiIgorIllvdSBhcmUgbm8gbG9uZ2VyIG9uIGEgbG9jYWwgYnJhbmNoLlxuIgorIlxuIgorIklmIHlvdSB3YW50ZWQgdG8gYmUgb24gYSBicmFuY2gsIGNyZWF0ZSBvbmUgbm93IHN0YXJ0aW5nIGZyb20gJ1RoaXMgRGV0YWNoZWQgIgorIkNoZWNrb3V0Jy4iCittc2dzdHIgIiIKKyLQktGLINC90LDRhdC+0LTQuNGC0LXRgdGMINC90LUg0LIg0LvQvtC60LDQu9GM0L3QvtC5INCy0LXRgtCy0LguXG4iCisiXG4iCisi0JXRgdC70Lgg0LLRiyDRhdC+0YLQuNGC0LUg0YHQvdC+0LLQsCDQstC10YDQvdGD0YLRjNGB0Y8g0Log0LrQsNC60L7QuS3QvdC40LHRg9C00Ywg0LLQtdGC0LLQuCwg0YHQvtC30LTQsNC50YLQtSDQtdC1INGB0LXQudGH0LDRgSwgIgorItC90LDRh9C40L3QsNGPINGBICfQotC10LrRg9GJ0LXQs9C+INC+0YLRgdC+0LXQtNC40L3QtdC90L3QvtCz0L4g0YHQvtGB0YLQvtGP0L3QuNGPJy4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NDQ2IGxpYi9jaGVja291dF9vcC50Y2w6NDUwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQ2hlY2tlZCBvdXQgJyVzJy4iCittc2dzdHIgItCS0LXRgtCy0YwgJyVzJyDRgdC00LXQu9Cw0L3QsCDRgtC10LrRg9GJ0LXQuS4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NDc4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUmVzZXR0aW5nICclcycgdG8gJyVzJyB3aWxsIGxvc2UgdGhlIGZvbGxvd2luZyBjb21taXRzOiIKK21zZ3N0ciAi0KHQsdGA0L7RgSAnJXMnINCyICclcycg0L/RgNC40LLQtdC00LXRgiDQuiDQv9C+0YLQtdGA0LUg0YHQu9C10LTRg9GO0YnQuNGFINGB0L7RhdGA0LDQvdC10L3QvdGL0YUg0YHQvtGB0YLQvtGP0L3QuNC5OiAiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NTAwCittc2dpZCAiUmVjb3ZlcmluZyBsb3N0IGNvbW1pdHMgbWF5IG5vdCBiZSBlYXN5LiIKK21zZ3N0ciAi0JLQvtGB0YHRgtCw0L3QvtCy0LjRgtGMINC/0L7RgtC10YDRj9C90L3Ri9C1INGB0L7RhdGA0LDQvdC10L3QvdGL0LUg0YHQvtGB0YLQvtGP0L3QuNGPINCx0YPQtNC10YIg0YHQu9C+0LbQvdC+LiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDo1MDUKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJSZXNldCAnJXMnPyIKK21zZ3N0ciAi0KHQsdGA0L7RgdC40YLRjCAnJXMnPyIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDo1MTAgbGliL21lcmdlLnRjbDoxNjMKK21zZ2lkICJWaXN1YWxpemUiCittc2dzdHIgItCd0LDQs9C70Y/QtNC90L4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NTc4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBzZXQgY3VycmVudCBicmFuY2guXG4iCisiXG4iCisiVGhpcyB3b3JraW5nIGRpcmVjdG9yeSBpcyBvbmx5IHBhcnRpYWxseSBzd2l0Y2hlZC4gIFdlIHN1Y2Nlc3NmdWxseSB1cGRhdGVkICIKKyJ5b3VyIGZpbGVzLCBidXQgZmFpbGVkIHRvIHVwZGF0ZSBhbiBpbnRlcm5hbCBHaXQgZmlsZS5cbiIKKyJcbiIKKyJUaGlzIHNob3VsZCBub3QgaGF2ZSBvY2N1cnJlZC4gICVzIHdpbGwgbm93IGNsb3NlIGFuZCBnaXZlIHVwLiIKK21zZ3N0ciAiIgorItCd0LUg0YPQtNCw0LvQvtGB0Ywg0YPRgdGC0LDQvdC+0LLQuNGC0Ywg0YLQtdC60YPRidGD0Y4g0LLQtdGC0LLRjC5cbiIKKyJcbiIKKyLQktCw0Ygg0YDQsNCx0L7Rh9C40Lkg0LrQsNGC0LDQu9C+0LMg0L7QsdC90L7QstC70LXQvSDRgtC+0LvRjNC60L4g0YfQsNGB0YLQuNGH0L3Qvi4g0JHRi9C70Lgg0L7QsdC90L7QstC70LXQvdGLINCy0YHQtSDRhNCw0LnQu9GLINC60YDQvtC80LUgIgorItGB0LvRg9C20LXQsdC90YvRhSDRhNCw0LnQu9C+0LIgR2l0LiBcbiIKKyJcbiIKKyLQrdGC0L7Qs9C+INC90LUg0LTQvtC70LbQvdC+INCx0YvQu9C+INC/0YDQvtC40LfQvtC50YLQuC4gJXMg0LfQsNCy0LXRgNGI0LDQtdGC0YHRjy4iCisKKyM6IGxpYi9jaG9vc2VfZm9udC50Y2w6MzkKK21zZ2lkICJTZWxlY3QiCittc2dzdHIgItCS0YvQsdGA0LDRgtGMIgorCisjOiBsaWIvY2hvb3NlX2ZvbnQudGNsOjUzCittc2dpZCAiRm9udCBGYW1pbHkiCittc2dzdHIgItCo0YDQuNGE0YIiCisKKyM6IGxpYi9jaG9vc2VfZm9udC50Y2w6NzQKK21zZ2lkICJGb250IFNpemUiCittc2dzdHIgItCg0LDQt9C80LXRgCDRiNGA0LjRhNGC0LAiCisKKyM6IGxpYi9jaG9vc2VfZm9udC50Y2w6OTEKK21zZ2lkICJGb250IEV4YW1wbGUiCittc2dzdHIgItCf0YDQuNC80LXRgCDRgtC10LrRgdGC0LAiCisKKyM6IGxpYi9jaG9vc2VfZm9udC50Y2w6MTAzCittc2dpZCAiIgorIlRoaXMgaXMgZXhhbXBsZSB0ZXh0LlxuIgorIklmIHlvdSBsaWtlIHRoaXMgdGV4dCwgaXQgY2FuIGJlIHlvdXIgZm9udC4iCittc2dzdHIgIiIKKyLQrdGC0L4g0L/RgNC40LzQtdGAINGC0LXQutGB0YLQsC5cbiIKKyLQldGB0LvQuCDQktCw0Lwg0L3RgNCw0LLQuNGC0YHRjyDRjdGC0L7RgiDRgtC10LrRgdGCLCDRjdGC0L4g0LzQvtC20LXRgiDQsdGL0YLRjCDQktCw0Ygg0YjRgNC40YTRgi4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MjgKK21zZ2lkICJHaXQgR3VpIgorbXNnc3RyICIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODEgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozNzYKK21zZ2lkICJDcmVhdGUgTmV3IFJlcG9zaXRvcnkiCittc2dzdHIgItCh0L7Qt9C00LDRgtGMINC90L7QstGL0Lkg0YDQtdC/0L7Qt9C40YLQvtGA0LjQuSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo4NworbXNnaWQgIk5ldy4uLiIKK21zZ3N0ciAi0J3QvtCy0YvQuS4uLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5NCBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ2MAorbXNnaWQgIkNsb25lIEV4aXN0aW5nIFJlcG9zaXRvcnkiCittc2dzdHIgItCh0LrQu9C+0L3QuNGA0L7QstCw0YLRjCDRgdGD0YnQtdGB0YLQstGD0Y7RidC40Lkg0YDQtdC/0L7Qt9C40YLQvtGA0LjQuSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMDAKK21zZ2lkICJDbG9uZS4uLiIKK21zZ3N0ciAi0KHQutC70L7QvdC40YDQvtCy0LDRgtGMLi4uIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEwNyBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjk3NgorbXNnaWQgIk9wZW4gRXhpc3RpbmcgUmVwb3NpdG9yeSIKK21zZ3N0ciAi0JLRi9Cx0YDQsNGC0Ywg0YHRg9GJ0LXRgdGC0LLRg9GO0YnQuNC5INGA0LXQv9C+0LfQuNGC0L7RgNC40LkiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTEzCittc2dpZCAiT3Blbi4uLiIKK21zZ3N0ciAi0J7RgtC60YDRi9GC0YwuLi4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTI2Cittc2dpZCAiUmVjZW50IFJlcG9zaXRvcmllcyIKK21zZ3N0ciAi0J3QtdC00LDQstC90LjQtSDRgNC10L/QvtC30LjRgtC+0YDQuNC4IgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEzMgorbXNnaWQgIk9wZW4gUmVjZW50IFJlcG9zaXRvcnk6IgorbXNnc3RyICLQntGC0LrRgNGL0YLRjCDQv9C+0YHQu9C10LTQvdC40Lkg0YDQtdC/0L7Qt9C40YLQvtGA0LjQuSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoyOTYgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozMDMKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MzEwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNyZWF0ZSByZXBvc2l0b3J5ICVzOiIKK21zZ3N0ciAi0J3QtSDRg9C00LDQu9C+0YHRjCDRgdC+0LfQtNCw0YLRjCDRgNC10L/QvtC30LjRgtC+0YDQuNC5ICVzOiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozODEgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NzgKK21zZ2lkICJEaXJlY3Rvcnk6IgorbXNnc3RyICLQmtCw0YLQsNC70L7QszoiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDEyIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTM3CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEwMTEKK21zZ2lkICJHaXQgUmVwb3NpdG9yeSIKK21zZ3N0ciAi0KDQtdC/0L7Qt9C40YLQvtGA0LjQuSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0MzcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJEaXJlY3RvcnkgJXMgYWxyZWFkeSBleGlzdHMuIgorbXNnc3RyICLQmtCw0YLQsNC70L7QsyAnJXMnINGD0LbQtSDRgdGD0YnQtdGB0YLQstGD0LXRgi4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDQxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRmlsZSAlcyBhbHJlYWR5IGV4aXN0cy4iCittc2dzdHIgItCk0LDQudC7ICclcycg0YPQttC1INGB0YPRidC10YHRgtCy0YPQtdGCLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NTUKK21zZ2lkICJDbG9uZSIKK21zZ3N0ciAi0KHQutC70L7QvdC40YDQvtCy0LDRgtGMIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ2OAorbXNnaWQgIlVSTDoiCittc2dzdHIgItCh0YHRi9C70LrQsDoiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDg5Cittc2dpZCAiQ2xvbmUgVHlwZToiCittc2dzdHIgItCi0LjQvyDQutC70L7QvdCwOiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0OTUKK21zZ2lkICJTdGFuZGFyZCAoRmFzdCwgU2VtaS1SZWR1bmRhbnQsIEhhcmRsaW5rcykiCittc2dzdHIgItCh0YLQsNC90LTQsNGA0YLQvdGL0LkgKNCR0YvRgdGC0YDRi9C5LCDQv9C+0LvRg9C40LfQsdGL0YLQvtGH0L3Ri9C5LCBcItC20LXRgdGC0LrQuNC1XCIg0YHRgdGL0LvQutC4KSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1MDEKK21zZ2lkICJGdWxsIENvcHkgKFNsb3dlciwgUmVkdW5kYW50IEJhY2t1cCkiCittc2dzdHIgItCf0L7Qu9C90LDRjyDQutC+0L/QuNGPICjQnNC10LTQu9C10L3QvdGL0LksINGB0L7Qt9C00LDQtdGCINGA0LXQt9C10YDQstC90YPRjiDQutC+0L/QuNGOKSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1MDcKK21zZ2lkICJTaGFyZWQgKEZhc3Rlc3QsIE5vdCBSZWNvbW1lbmRlZCwgTm8gQmFja3VwKSIKK21zZ3N0ciAi0J7QsdGJ0LjQuSAo0KHQsNC80YvQuSDQsdGL0YHRgtGA0YvQuSwg0L3QtSDRgNC10LrQvtC80LXQvdC00YPQtdGC0YHRjywg0LHQtdC3INGA0LXQt9C10YDQstC90L7QuSDQutC+0L/QuNC4KSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1NDMgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1OTAKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzM2IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODA2CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEwMTcgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMDI1CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiTm90IGEgR2l0IHJlcG9zaXRvcnk6ICVzIgorbXNnc3RyICLQmtCw0YLQsNC70L7QsyDQvdC1INGP0LLQu9GP0LXRgtGB0Y8g0YDQtdC/0L7Qt9C40YLQvtGA0LjQtdC8OiAlcyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1NzkKK21zZ2lkICJTdGFuZGFyZCBvbmx5IGF2YWlsYWJsZSBmb3IgbG9jYWwgcmVwb3NpdG9yeS4iCittc2dzdHIgItCh0YLQsNC90LTQsNGA0YLQvdGL0Lkg0LrQu9C+0L0g0LLQvtC30LzQvtC20LXQvSDRgtC+0LvRjNC60L4g0LTQu9GPINC70L7QutCw0LvRjNC90L7Qs9C+INGA0LXQv9C+0LfQuNGC0L7RgNC40Y8uIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjU4MworbXNnaWQgIlNoYXJlZCBvbmx5IGF2YWlsYWJsZSBmb3IgbG9jYWwgcmVwb3NpdG9yeS4iCittc2dzdHIgItCe0LHRidC40Lkg0LrQu9C+0L0g0LLQvtC30LzQvtC20LXQvSDRgtC+0LvRjNC60L4g0LTQu9GPINC70L7QutCw0LvRjNC90L7Qs9C+INGA0LXQv9C+0LfQuNGC0L7RgNC40Y8uIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjYwNAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkxvY2F0aW9uICVzIGFscmVhZHkgZXhpc3RzLiIKK21zZ3N0ciAi0J/Rg9GC0YwgJyVzJyDRg9C20LUg0YHRg9GJ0LXRgdGC0LLRg9C10YIuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjYxNQorbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgb3JpZ2luIgorbXNnc3RyICLQndC1INC80L7Qs9GDINGB0LrQvtC90YTQuNCz0YPRgNC40YDQvtCy0LDRgtGMINC40YHRhdC+0LTQvdGL0Lkg0YDQtdC/0L7Qt9C40YLQvtGA0LjQuS4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NjI3Cittc2dpZCAiQ291bnRpbmcgb2JqZWN0cyIKK21zZ3N0ciAi0KHRh9C40YLQsNGOINC+0LHRitC10LrRgtGLIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjYyOAorbXNnaWQgImJ1Y2tldHMiCittc2dzdHIgIiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo2NTIKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gY29weSBvYmplY3RzL2luZm8vYWx0ZXJuYXRlczogJXMiCittc2dzdHIgItCd0LUg0LzQvtCz0YMg0YHQutC+0L/QuNGA0L7QstCw0YLRjCBvYmplY3RzL2luZm8vYWx0ZXJuYXRlczogJXMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6Njg4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiTm90aGluZyB0byBjbG9uZSBmcm9tICVzLiIKK21zZ3N0ciAi0J3QtdGH0LXQs9C+INC60LvQvtC90LjRgNC+0LLQsNGC0Ywg0YEgJXMuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjY5MCBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjkwNAorIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5MTYKK21zZ2lkICJUaGUgJ21hc3RlcicgYnJhbmNoIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4iCittc2dzdHIgItCd0LUg0LjQvdC40YbQuNCw0LvQuNC30LjRgNC+0LLQsNC90LAg0LLQtdGC0LLRjCAnbWFzdGVyJy4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzAzCittc2dpZCAiSGFyZGxpbmtzIGFyZSB1bmF2YWlsYWJsZS4gIEZhbGxpbmcgYmFjayB0byBjb3B5aW5nLiIKK21zZ3N0ciAiXCLQltC10YHRgtC60LjQtSDRgdGB0YvQu9C60LhcIiDQvdC1INC00L7RgdGC0YPQv9C90YsuINCR0YPQtNGDINC40YHQv9C+0LvRjNC30L7QstCw0YLRjCDQutC+0L/QuNGA0L7QstCw0L3QuNC1LiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3MTUKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJDbG9uaW5nIGZyb20gJXMiCittc2dzdHIgItCa0LvQvtC90LjRgNC+0LLQsNC90LjQtSAlcyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3NDYKK21zZ2lkICJDb3B5aW5nIG9iamVjdHMiCittc2dzdHIgItCa0L7Qv9C40YDQvtCy0LDQvdC40LUgb2JqZWN0cyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3NDcKK21zZ2lkICJLaUIiCittc2dzdHIgItCa0JEiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzcxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGNvcHkgb2JqZWN0OiAlcyIKK21zZ3N0ciAi0J3QtSDQvNC+0LPRgyDRgdC60L7Qv9C40YDQvtCy0LDRgtGMINC+0LHRitC10LrRgjogJXMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzgxCittc2dpZCAiTGlua2luZyBvYmplY3RzIgorbXNnc3RyICLQodC+0LfQtNCw0L3QuNC1INGB0YHRi9C70L7QuiDQvdCwIG9iamVjdHMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzgyCittc2dpZCAib2JqZWN0cyIKK21zZ3N0ciAi0L7QsdGK0LXQutGC0YsiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzkwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGhhcmRsaW5rIG9iamVjdDogJXMiCittc2dzdHIgItCd0LUg0LzQvtCz0YMgXCLQttC10YHRgtC60L4g0YHQstGP0LfQsNGC0YxcIiDQvtCx0YrQtdC60YI6ICVzIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjg0NQorbXNnaWQgIkNhbm5vdCBmZXRjaCBicmFuY2hlcyBhbmQgb2JqZWN0cy4gIFNlZSBjb25zb2xlIG91dHB1dCBmb3IgZGV0YWlscy4iCittc2dzdHIgIiIKKyLQndC1INC80L7Qs9GDINC/0L7Qu9GD0YfQuNGC0Ywg0LLQtdGC0LLQuCDQuCDQvtCx0YrQtdC60YLRiy4g0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90LDRjyDQuNC90YTQvtGA0LzQsNGG0LjRjyDQvdCwINC60L7QvdGB0L7Qu9C4LiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo4NTYKK21zZ2lkICJDYW5ub3QgZmV0Y2ggdGFncy4gIFNlZSBjb25zb2xlIG91dHB1dCBmb3IgZGV0YWlscy4iCittc2dzdHIgItCd0LUg0LzQvtCz0YMg0L/QvtC70YPRh9C40YLRjCDQvNC10YLQutC4LiDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3QsNGPINC40L3RhNC+0YDQvNCw0YbQuNGPINC90LAg0LrQvtC90YHQvtC70LguIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjg4MAorbXNnaWQgIkNhbm5vdCBkZXRlcm1pbmUgSEVBRC4gIFNlZSBjb25zb2xlIG91dHB1dCBmb3IgZGV0YWlscy4iCittc2dzdHIgItCd0LUg0LzQvtCz0YMg0L7Qv9GA0LXQtNC10LvQuNGC0YwgSEVBRC4g0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90LDRjyDQuNC90YTQvtGA0LzQsNGG0LjRjyDQvdCwINC60L7QvdGB0L7Qu9C4LiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo4ODkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gY2xlYW51cCAlcyIKK21zZ3N0ciAi0J3QtSDQvNC+0LPRgyDQvtGH0LjRgdGC0LjRgtGMICVzIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjg5NQorbXNnaWQgIkNsb25lIGZhaWxlZC4iCittc2dzdHIgItCa0LvQvtC90LjRgNC+0LLQsNC90LjQtSDQvdC1INGD0LTQsNC70L7RgdGMLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5MDIKK21zZ2lkICJObyBkZWZhdWx0IGJyYW5jaCBvYnRhaW5lZC4iCittc2dzdHIgItCd0LUg0LHRi9C70L4g0L/QvtC70YPRh9C10L3QviDQstC10YLQstC4INC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5MTMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJDYW5ub3QgcmVzb2x2ZSAlcyBhcyBhIGNvbW1pdC4iCittc2dzdHIgItCd0LUg0LzQvtCz0YMg0YDQsNGB0L/QvtC30L3QsNGC0YwgJXMg0LrQsNC6INGB0L7RgdGC0L7Rj9C90LjQtS4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTI1Cittc2dpZCAiQ3JlYXRpbmcgd29ya2luZyBkaXJlY3RvcnkiCittc2dzdHIgItCh0L7Qt9C00LDRjiDRgNCw0LHQvtGH0LjQuSDQutCw0YLQsNC70L7QsyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5MjYgbGliL2luZGV4LnRjbDo2NSBsaWIvaW5kZXgudGNsOjEyNworIzogbGliL2luZGV4LnRjbDoxOTMKK21zZ2lkICJmaWxlcyIKK21zZ3N0ciAi0YTQsNC50LvQvtCyIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjk1NQorbXNnaWQgIkluaXRpYWwgZmlsZSBjaGVja291dCBmYWlsZWQuIgorbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINC/0L7Qu9GD0YfQuNGC0Ywg0L3QsNGH0LDQu9GM0L3QvtC1INGB0L7RgdGC0L7Rj9C90LjQtSDRhNCw0LnQu9C+0LIg0YDQtdC/0L7Qt9C40YLQvtGA0LjRjy4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTcxCittc2dpZCAiT3BlbiIKK21zZ3N0ciAi0J7RgtC60YDRi9GC0YwiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTgxCittc2dpZCAiUmVwb3NpdG9yeToiCittc2dzdHIgItCg0LXQv9C+0LfQuNGC0L7RgNC40Lk6IgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEwMzEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gb3BlbiByZXBvc2l0b3J5ICVzOiIKK21zZ3N0ciAi0J3QtSDRg9C00LDQu9C+0YHRjCDQvtGC0LrRgNGL0YLRjCDRgNC10L/QvtC30LjRgtC+0YDQuNC5ICVzOiIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjUzCittc2dpZCAiVGhpcyBEZXRhY2hlZCBDaGVja291dCIKK21zZ3N0ciAi0KLQtdC60YPRidC10LUg0L7RgtGB0L7QtdC00LjQvdC10L3QvdC+0LUg0YHQvtGB0YLQvtGP0L3QuNC1IgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6NjAKK21zZ2lkICJSZXZpc2lvbiBFeHByZXNzaW9uOiIKK21zZ3N0ciAi0JLRi9GA0LDQttC10L3QuNC1INC00LvRjyDQvtC/0YDQtdC00LXQu9C10L3QuNGPINCy0LXRgNGB0LjQuDoiCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDo3NAorbXNnaWQgIkxvY2FsIEJyYW5jaCIKK21zZ3N0ciAi0JvQvtC60LDQu9GM0L3QsNGPINCy0LXRgtCy0Yw6IgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6NzkKK21zZ2lkICJUcmFja2luZyBCcmFuY2giCittc2dzdHIgItCS0LXRgtCy0Ywg0YHQu9C10LbQtdC90LjRjyIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjg0IGxpYi9jaG9vc2VfcmV2LnRjbDo1MzgKK21zZ2lkICJUYWciCittc2dzdHIgItCi0LDQsyIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjMxNworIywgdGNsLWZvcm1hdAorbXNnaWQgIkludmFsaWQgcmV2aXNpb246ICVzIgorbXNnc3RyICLQndC10LLQtdGA0L3QsNGPINCy0LXRgNGB0LjRjzogJXMiCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDozMzgKK21zZ2lkICJObyByZXZpc2lvbiBzZWxlY3RlZC4iCittc2dzdHIgItCS0LXRgNGB0LjRjyDQvdC1INGD0LrQsNC30LDQvdCwLiIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjM0NgorbXNnaWQgIlJldmlzaW9uIGV4cHJlc3Npb24gaXMgZW1wdHkuIgorbXNnc3RyICLQn9GD0YHRgtC+0LUg0LLRi9GA0LDQttC10L3QuNC1INC00LvRjyDQvtC/0YDQtdC00LXQu9C10L3QuNGPINCy0LXRgNGB0LjQuC4iCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDo1MzEKK21zZ2lkICJVcGRhdGVkIgorbXNnc3RyICLQntCx0L3QvtCy0LvQtdC90L4iCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDo1NTkKK21zZ2lkICJVUkwiCittc2dzdHIgItCh0YHRi9C70LrQsCIKKworIzogbGliL2NvbW1pdC50Y2w6OQorbXNnaWQgIiIKKyJUaGVyZSBpcyBub3RoaW5nIHRvIGFtZW5kLlxuIgorIlxuIgorIllvdSBhcmUgYWJvdXQgdG8gY3JlYXRlIHRoZSBpbml0aWFsIGNvbW1pdC4gIFRoZXJlIGlzIG5vIGNvbW1pdCBiZWZvcmUgdGhpcyAiCisidG8gYW1lbmQuXG4iCittc2dzdHIgIiIKKyLQntGC0YHRg9GC0YHRgtCy0YPQtdGCINGB0L7RgdGC0L7Rj9C90LjQtSDQtNC70Y8g0LjRgdC/0YDQsNCy0LvQtdC90LjRjy5cbiIKKyJcbiIKKyLQktGLINGB0L7Qt9C00LDQtdGC0LUg0L/QtdGA0LLQvtC1INGB0L7RgdGC0L7Rj9C90LjQtSDQsiDRgNC10L/QvtC30LjRgtC+0YDQuNC4LCDQt9C00LXRgdGMINC10YnQtSDQvdC10YfQtdCz0L4g0LjRgdC/0YDQsNCy0LvRj9GC0YwuXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjE4Cittc2dpZCAiIgorIkNhbm5vdCBhbWVuZCB3aGlsZSBtZXJnaW5nLlxuIgorIlxuIgorIllvdSBhcmUgY3VycmVudGx5IGluIHRoZSBtaWRkbGUgb2YgYSBtZXJnZSB0aGF0IGhhcyBub3QgYmVlbiBmdWxseSAiCisiY29tcGxldGVkLiAgWW91IGNhbm5vdCBhbWVuZCB0aGUgcHJpb3IgY29tbWl0IHVubGVzcyB5b3UgZmlyc3QgYWJvcnQgdGhlICIKKyJjdXJyZW50IG1lcmdlIGFjdGl2aXR5LlxuIgorbXNnc3RyICIiCisi0J3QtdCy0L7Qt9C80L7QttC90L4g0LjRgdC/0YDQsNCy0LjRgtGMINGB0L7RgdGC0L7Rj9C90LjQtSDQstC+INCy0YDQtdC80Y8g0L7QsdGK0LXQtNC40L3QtdC90LjRjy5cbiIKKyJcbiIKKyLQotC10LrRg9GJ0LXQtSDQvtCx0YrQtdC00LjQvdC10L3QuNC1INC90LUg0LfQsNCy0LXRgNGI0LXQvdC+LiDQndC10LLQvtC30LzQvtC20L3QviDQuNGB0L/RgNCw0LLQuNGC0Ywg0L/RgNC10LTRi9C00YPRidC10LUgIgorItGB0L7RhdGA0LDQvdC10L3QvdC+0LUg0YHQvtGB0YLQvtGP0L3QuNC1INC90LUg0L/RgNC10YDRi9Cy0LDRjyDRgtC10LrRg9GJ0LXQtSDQvtCx0YrQtdC00LjQvdC10L3QuNC1LlxuIgorCisjOiBsaWIvY29tbWl0LnRjbDo0OQorbXNnaWQgIkVycm9yIGxvYWRpbmcgY29tbWl0IGRhdGEgZm9yIGFtZW5kOiIKK21zZ3N0ciAi0J7RiNC40LHQutCwINC/0YDQuCDQt9Cw0LPRgNGD0LfQutC1INC00LDQvdC90YvRhSDQtNC70Y8g0LjRgdC/0YDQsNCy0LvQtdC90LjRjyDRgdC+0YXRgNCw0L3QtdC90L3QvtCz0L4g0YHQvtGB0YLQvtGP0L3QuNGPOiIKKworIzogbGliL2NvbW1pdC50Y2w6NzYKK21zZ2lkICJVbmFibGUgdG8gb2J0YWluIHlvdXIgaWRlbnRpdHk6IgorbXNnc3RyICLQndC10LLQvtC30LzQvtC20L3QviDQv9C+0LvRg9GH0LjRgtGMINC40L3RhNC+0YDQvNCw0YbQuNGOINC+0LEg0LDQstGC0L7RgNGB0YLQstC1OiIKKworIzogbGliL2NvbW1pdC50Y2w6ODEKK21zZ2lkICJJbnZhbGlkIEdJVF9DT01NSVRURVJfSURFTlQ6IgorbXNnc3RyICLQndC10LLQtdGA0L3Ri9C5IEdJVF9DT01NSVRURVJfSURFTlQ6IgorCisjOiBsaWIvY29tbWl0LnRjbDoxMzMKK21zZ2lkICIiCisiTGFzdCBzY2FubmVkIHN0YXRlIGRvZXMgbm90IG1hdGNoIHJlcG9zaXRvcnkgc3RhdGUuXG4iCisiXG4iCisiQW5vdGhlciBHaXQgcHJvZ3JhbSBoYXMgbW9kaWZpZWQgdGhpcyByZXBvc2l0b3J5IHNpbmNlIHRoZSBsYXN0IHNjYW4uICBBICIKKyJyZXNjYW4gbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIGFub3RoZXIgY29tbWl0IGNhbiBiZSBjcmVhdGVkLlxuIgorIlxuIgorIlRoZSByZXNjYW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgbm93LlxuIgorbXNnc3RyICIiCisi0J/QvtGB0LvQtdC00L3QtdC1INC/0YDQvtGH0LjRgtCw0L3QvdC+0LUg0YHQvtGB0YLQvtGP0L3QuNC1INGA0LXQv9C+0LfQuNGC0L7RgNC40Y8g0L3QtSDRgdC+0L7RgtCy0LXRgtGB0YLQstGD0LXRgiDRgtC10LrRg9GJ0LXQvNGDLlxuIgorIlxuIgorItChINC80L7QvNC10L3RgtCwINC/0L7RgdC70LXQtNC90LXQuSDQv9GA0L7QstC10YDQutC4INGA0LXQv9C+0LfQuNGC0L7RgNC40Lkg0LHRi9C7INC40LfQvNC10L3QtdC9INC00YDRg9Cz0L7QuSDQv9GA0L7Qs9GA0LDQvNC80L7QuSBHaXQuICIKKyLQndC10L7QsdGF0L7QtNC40LzQviDQv9C10YDQtdGH0LjRgtCw0YLRjCDRgNC10L/QvtC30LjRgtC+0YDQuNC5LCDQv9GA0LXQttC00LUg0YfQtdC8INC40LfQvNC10L3Rj9GC0Ywg0YLQtdC60YPRidGD0Y4g0LLQtdGC0LLRjC4gXG4iCisiXG4iCisi0K3RgtC+INCx0YPQtNC10YIg0YHQtNC10LvQsNC90L4g0YHQtdC50YfQsNGBINCw0LLRgtC+0LzQsNGC0LjRh9C10YHQutC4LlxuIgorCisjOiBsaWIvY29tbWl0LnRjbDoxNTQKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiVW5tZXJnZWQgZmlsZXMgY2Fubm90IGJlIGNvbW1pdHRlZC5cbiIKKyJcbiIKKyJGaWxlICVzIGhhcyBtZXJnZSBjb25mbGljdHMuICBZb3UgbXVzdCByZXNvbHZlIHRoZW0gYW5kIHN0YWdlIHRoZSBmaWxlICIKKyJiZWZvcmUgY29tbWl0dGluZy5cbiIKK21zZ3N0ciAiIgorItCd0LXQu9GM0LfRjyDRgdC+0YXRgNCw0L3QuNGC0Ywg0L3QtdC+0LHRitC10LTQuNC90LXQvdC90YvQtSDRhNCw0LnQu9GLLlxuIgorIlxuIgorItCU0LvRjyDRhNCw0LnQu9CwICVzINCy0L7Qt9C90LjQuiDQutC+0L3RhNC70LjQutGCINC+0LHRitC10LTQuNC90LXQvdC40Y8uINCg0LDQt9GA0LXRiNC40YLQtSDQutC+0L3RhNC70LjQutGCINC4INC00L7QsdCw0LLRjNGC0LUg0LogIgorItC/0L7QtNCz0L7RgtC+0LLQu9C10L3QvdGL0Lwg0YTQsNC50LvQsNC8INC/0LXRgNC10LQg0YHQvtGF0YDQsNC90LXQvdC40LXQvC5cbiIKKworIzogbGliL2NvbW1pdC50Y2w6MTYyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIlVua25vd24gZmlsZSBzdGF0ZSAlcyBkZXRlY3RlZC5cbiIKKyJcbiIKKyJGaWxlICVzIGNhbm5vdCBiZSBjb21taXR0ZWQgYnkgdGhpcyBwcm9ncmFtLlxuIgorbXNnc3RyICIiCisi0J7QsdC90LDRgNGD0LbQtdC90L4g0L3QtdC40LfQstC10YHRgtC90L7QtSDRgdC+0YHRgtC+0Y/QvdC40LUg0YTQsNC50LvQsCAlcy5cbiIKKyJcbiIKKyLQpNCw0LnQuyAlcyDQvdC1INC80L7QttC10YIg0LHRi9GC0Ywg0YHQvtGF0YDQsNC90LXQvSDQtNCw0L3QvdC+0Lkg0L/RgNC+0LPRgNCw0LzQvNC+0LkuXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjE3MAorbXNnaWQgIiIKKyJObyBjaGFuZ2VzIHRvIGNvbW1pdC5cbiIKKyJcbiIKKyJZb3UgbXVzdCBzdGFnZSBhdCBsZWFzdCAxIGZpbGUgYmVmb3JlIHlvdSBjYW4gY29tbWl0LlxuIgorbXNnc3RyICIiCisi0J7RgtGB0YPRgtGB0YLQstGD0Y7RgiDQuNC30LzQtdC90LXQvdC40Y8g0LTQu9GPINGB0L7RhdGA0LDQvdC10L3QuNGPLlxuIgorIlxuIgorItCf0L7QtNCz0L7RgtC+0LLRjNGC0LUg0YXQvtGC0Y8g0LHRiyDQvtC00LjQvSDRhNCw0LnQuyDQtNC+INGB0L7Qt9C00LDQvdC40Y8g0YHQvtGF0YDQsNC90LXQvdC90L7Qs9C+INGB0L7RgdGC0L7Rj9C90LjRjy5cbiIKKworIzogbGliL2NvbW1pdC50Y2w6MTgzCittc2dpZCAiIgorIlBsZWFzZSBzdXBwbHkgYSBjb21taXQgbWVzc2FnZS5cbiIKKyJcbiIKKyJBIGdvb2QgY29tbWl0IG1lc3NhZ2UgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuIgorIlxuIgorIi0gRmlyc3QgbGluZTogRGVzY3JpYmUgaW4gb25lIHNlbnRlbmNlIHdoYXQgeW91IGRpZC5cbiIKKyItIFNlY29uZCBsaW5lOiBCbGFua1xuIgorIi0gUmVtYWluaW5nIGxpbmVzOiBEZXNjcmliZSB3aHkgdGhpcyBjaGFuZ2UgaXMgZ29vZC5cbiIKK21zZ3N0ciAiIgorItCd0LDQv9C40YjQuNGC0LUg0LrQvtC80LzQtdC90YLQsNGA0LjQuSDQuiDRgdC+0YXRgNCw0L3QtdC90L3QvtC80YMg0YHQvtGB0YLQvtGP0L3QuNGOLlxuIgorIlxuIgorItCg0LXQutC+0LzQtdC90LTRg9C10YLRgdGPINGB0LvQtdC00YPRjtGJ0LjQuSDRhNC+0YDQvNCw0YIg0LrQvtC80LzQtdC90YLQsNGA0LjRjzpcbiIKKyJcbiIKKyItINC/0LXRgNCy0LDRjyDRgdGC0YDQvtC60LA6INC60YDQsNGC0LrQvtC1INC+0L/QuNGB0LDQvdC40LUg0YHQtNC10LvQsNC90L3Ri9GFINC40LfQvNC10L3QtdC90LjQuS5cbiIKKyItINCy0YLQvtGA0LDRjyDRgdGC0YDQvtC60LAg0L/Rg9GB0YLQsNGPXG4iCisiLSDQvtGB0YLQsNCy0YjQuNC10YHRjyDRgdGC0YDQvtC60Lg6INC+0L/QuNGI0LjRgtC1LCDRh9GC0L4g0LTQsNGO0YIg0LLQsNGI0Lgg0LjQt9C80LXQvdC10L3QuNGPLlxuIgorCisjOiBsaWIvY29tbWl0LnRjbDoyMDcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJ3YXJuaW5nOiBUY2wgZG9lcyBub3Qgc3VwcG9ydCBlbmNvZGluZyAnJXMnLiIKK21zZ3N0ciAi0L/RgNC10LTRg9C/0YDQtdC20LTQtdC90LjQtTogVGNsINC90LUg0L/QvtC00LTQtdGA0LbQuNCy0LDQtdGCINC60L7QtNC40YDQvtCy0LrRgyAnJXMnLiIKKworIzogbGliL2NvbW1pdC50Y2w6MjIxCittc2dpZCAiQ2FsbGluZyBwcmUtY29tbWl0IGhvb2suLi4iCittc2dzdHIgItCS0YvQt9C+0LIg0L/RgNC+0LPRgNCw0LzQvNGLINC/0L7QtNC00LXRgNC20LrQuCDRgNC10L/QvtC30LjRgtC+0YDQuNGPIHByZS1jb21taXQuLi4iCisKKyM6IGxpYi9jb21taXQudGNsOjIzNgorbXNnaWQgIkNvbW1pdCBkZWNsaW5lZCBieSBwcmUtY29tbWl0IGhvb2suIgorbXNnc3RyICLQodC+0YXRgNCw0L3QtdC90LjQtSDQv9GA0LXRgNCy0LDQvdC+INC/0YDQvtCz0YDQsNC80LzQvtC5INC/0L7QtNC00LXRgNC20LrQuCDRgNC10L/QvtC30LjRgtC+0YDQuNGPIHByZS1jb21taXQiCisKKyM6IGxpYi9jb21taXQudGNsOjI1OQorbXNnaWQgIkNhbGxpbmcgY29tbWl0LW1zZyBob29rLi4uIgorbXNnc3RyICLQktGL0LfQvtCyINC/0YDQvtCz0YDQsNC80LzRiyDQv9C+0LTQtNC10YDQttC60Lgg0YDQtdC/0L7Qt9C40YLQvtGA0LjRjyBjb21taXQtbXNnLi4uIgorCisjOiBsaWIvY29tbWl0LnRjbDoyNzQKK21zZ2lkICJDb21taXQgZGVjbGluZWQgYnkgY29tbWl0LW1zZyBob29rLiIKK21zZ3N0ciAi0KHQvtGF0YDQsNC90LXQvdC40LUg0L/RgNC10YDQstCw0L3QviDQv9GA0L7Qs9GA0LDQvNC80L7QuSDQv9C+0LTQtNC10YDQttC60Lgg0YDQtdC/0L7Qt9C40YLQvtGA0LjRjyBjb21taXQtbXNnIgorCisjOiBsaWIvY29tbWl0LnRjbDoyODcKK21zZ2lkICJDb21taXR0aW5nIGNoYW5nZXMuLi4iCittc2dzdHIgItCh0L7RhdGA0LDQvdC10L3QuNC1INC40LfQvNC10L3QtdC90LjQuS4uLiIKKworIzogbGliL2NvbW1pdC50Y2w6MzAzCittc2dpZCAid3JpdGUtdHJlZSBmYWlsZWQ6IgorbXNnc3RyICLQn9GA0L7Qs9GA0LDQvNC80LAgd3JpdGUtdHJlZSDQt9Cw0LLQtdGA0YjQuNC70LDRgdGMINGBINC+0YjQuNCx0LrQvtC5OiIKKworIzogbGliL2NvbW1pdC50Y2w6MzA0IGxpYi9jb21taXQudGNsOjM0OCBsaWIvY29tbWl0LnRjbDozNjgKK21zZ2lkICJDb21taXQgZmFpbGVkLiIKK21zZ3N0ciAi0KHQvtGF0YDQsNC90LjRgtGMINGB0L7RgdGC0L7Rj9C90LjQtSDQvdC1INGD0LTQsNC70L7RgdGMLiIKKworIzogbGliL2NvbW1pdC50Y2w6MzIxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQ29tbWl0ICVzIGFwcGVhcnMgdG8gYmUgY29ycnVwdCIKK21zZ3N0ciAi0KHQvtGB0YLQvtGP0L3QuNC1ICVzINCy0YvQs9C70Y/QtNC40YIg0L/QvtCy0YDQtdC20LTQtdC90L3Ri9C8IgorCisjOiBsaWIvY29tbWl0LnRjbDozMjYKK21zZ2lkICIiCisiTm8gY2hhbmdlcyB0byBjb21taXQuXG4iCisiXG4iCisiTm8gZmlsZXMgd2VyZSBtb2RpZmllZCBieSB0aGlzIGNvbW1pdCBhbmQgaXQgd2FzIG5vdCBhIG1lcmdlIGNvbW1pdC5cbiIKKyJcbiIKKyJBIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBub3cuXG4iCittc2dzdHIgIiIKKyLQntGC0YHRg9GC0YHRgtCy0YPRjtGCINC40LfQvNC10L3QtdC90LjRjyDQtNC70Y8g0YHQvtGF0YDQsNC90LXQvdC40Y8uXG4iCisiXG4iCisi0J3QuCDQvtC00LjQvSDRhNCw0LnQuyDQvdC1INCx0YvQuyDQuNC30LzQtdC90LXQvSDQuCDQvdC1INCx0YvQu9C+INC+0LHRitC10LTQuNC90LXQvdC40Y8uXG4iCisiXG4iCisi0KHQtdC50YfQsNGBINCw0LLRgtC+0LzQsNGC0LjRh9C10YHQutC4INC30LDQv9GD0YHRgtC40YLRgdGPINC/0LXRgNC10YfQuNGC0YvQstCw0L3QuNC1INGA0LXQv9C+0LfQuNGC0L7RgNC40Y8uXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjMzMworbXNnaWQgIk5vIGNoYW5nZXMgdG8gY29tbWl0LiIKK21zZ3N0ciAi0J7RgtGD0YHRgtCy0YPRjtGCINC40LfQvNC10L3QuNGPINC00LvRjyDRgdC+0YXRgNCw0L3QtdC90LjRjy4iCisKKyM6IGxpYi9jb21taXQudGNsOjM0NworbXNnaWQgImNvbW1pdC10cmVlIGZhaWxlZDoiCittc2dzdHIgItCf0YDQvtCz0YDQsNC80LzQsCBjb21taXQtdHJlZSDQt9Cw0LLQtdGA0YjQuNC70LDRgdGMINGBINC+0YjQuNCx0LrQvtC5OiIKKworIzogbGliL2NvbW1pdC50Y2w6MzY3Cittc2dpZCAidXBkYXRlLXJlZiBmYWlsZWQ6IgorbXNnc3RyICLQn9GA0L7Qs9GA0LDQvNC80LAgdXBkYXRlLXJlZiDQt9Cw0LLQtdGA0YjQuNC70LDRgdGMINGBINC+0YjQuNCx0LrQvtC5OiIKKworIzogbGliL2NvbW1pdC50Y2w6NDU0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQ3JlYXRlZCBjb21taXQgJXM6ICVzIgorbXNnc3RyICLQodC+0LfQtNCw0L3QviDRgdC+0YHRgtC+0Y/QvdC40LUgJXM6ICVzICIKKworIzogbGliL2NvbnNvbGUudGNsOjU5Cittc2dpZCAiV29ya2luZy4uLiBwbGVhc2Ugd2FpdC4uLiIKK21zZ3N0ciAi0JIg0L/RgNC+0YbQtdGB0YHQtS4uLiDQv9C+0LbQsNC70YPQudGB0YLQsCwg0LbQtNC40YLQtS4uLiIKKworIzogbGliL2NvbnNvbGUudGNsOjE4NgorbXNnaWQgIlN1Y2Nlc3MiCittc2dzdHIgItCf0YDQvtGG0LXRgdGBINGD0YHQv9C10YjQvdC+INC30LDQstC10YDRiNC10L0iCisKKyM6IGxpYi9jb25zb2xlLnRjbDoyMDAKK21zZ2lkICJFcnJvcjogQ29tbWFuZCBGYWlsZWQiCittc2dzdHIgItCe0YjQuNCx0LrQsDog0L3QtSDRg9C00LDQu9C+0YHRjCDQstGL0L/QvtC70L3QuNGC0Ywg0LrQvtC80LDQvdC00YMiCisKKyM6IGxpYi9kYXRhYmFzZS50Y2w6NDMKK21zZ2lkICJOdW1iZXIgb2YgbG9vc2Ugb2JqZWN0cyIKK21zZ3N0ciAi0JrQvtC70LjRh9C10YHRgtCy0L4g0L3QtdGB0LLRj9C30LDQvdC90YvRhSDQvtCx0YrQtdC60YLQvtCyIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQ0Cittc2dpZCAiRGlzayBzcGFjZSB1c2VkIGJ5IGxvb3NlIG9iamVjdHMiCittc2dzdHIgItCe0LHRitC10Lwg0LTQuNGB0LrQvtCy0L7Qs9C+INC/0YDQvtGB0YLRgNCw0L3RgdGC0LLQsCwg0LfQsNC90Y/RgtGL0Lkg0L3QtdGB0LLRj9C30LDQvdC90YvQvNC4INC+0LHRitC10LrRgtCw0LzQuCIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0NQorbXNnaWQgIk51bWJlciBvZiBwYWNrZWQgb2JqZWN0cyIKK21zZ3N0ciAi0JrQvtC70LjRh9C10YHRgtCy0L4g0YPQv9Cw0LrQvtCy0LDQvdC90YvRhSDQvtCx0YrQtdC60YLQvtCyIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQ2Cittc2dpZCAiTnVtYmVyIG9mIHBhY2tzIgorbXNnc3RyICLQmtC+0LvQuNGH0LXRgdGC0LLQviBwYWNrLdGE0LDQudC70L7QsiIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0NworbXNnaWQgIkRpc2sgc3BhY2UgdXNlZCBieSBwYWNrZWQgb2JqZWN0cyIKK21zZ3N0ciAi0J7QsdGK0LXQvCDQtNC40YHQutC+0LLQvtCz0L4g0L/RgNC+0YHRgtGA0LDQvdGB0YLQstCwLCDQt9Cw0L3Rj9GC0YvQuSDRg9C/0LDQutC+0LLQsNC90L3Ri9C80Lgg0L7QsdGK0LXQutGC0LDQvNC4IgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQ4Cittc2dpZCAiUGFja2VkIG9iamVjdHMgd2FpdGluZyBmb3IgcHJ1bmluZyIKK21zZ3N0ciAi0J3QtdGB0LLRj9C30LDQvdC90YvQtSDQvtCx0YrQtdC60YLRiywg0LrQvtGC0L7RgNGL0LUg0LzQvtC20L3QviDRg9C00LDQu9C40YLRjCIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0OQorbXNnaWQgIkdhcmJhZ2UgZmlsZXMiCittc2dzdHIgItCc0YPRgdC+0YAiCisKKyM6IGxpYi9kYXRhYmFzZS50Y2w6NzIKK21zZ2lkICJDb21wcmVzc2luZyB0aGUgb2JqZWN0IGRhdGFiYXNlIgorbXNnc3RyICLQodC20LDRgtC40LUg0LHQsNC30Ysg0L7QsdGK0LXQutGC0L7QsiIKKworIzogbGliL2RhdGFiYXNlLnRjbDo4MworbXNnaWQgIlZlcmlmeWluZyB0aGUgb2JqZWN0IGRhdGFiYXNlIHdpdGggZnNjay1vYmplY3RzIgorbXNnc3RyICLQn9GA0L7QstC10YDQutCwINCx0LDQt9GLINC+0LHRitC10LrRgtC+0LIg0L/RgNC4INC/0L7QvNC+0YnQuCBmc2NrIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjEwOAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJUaGlzIHJlcG9zaXRvcnkgY3VycmVudGx5IGhhcyBhcHByb3hpbWF0ZWx5ICVpIGxvb3NlIG9iamVjdHMuXG4iCisiXG4iCisiVG8gbWFpbnRhaW4gb3B0aW1hbCBwZXJmb3JtYW5jZSBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBjb21wcmVzcyAiCisidGhlIGRhdGFiYXNlIHdoZW4gbW9yZSB0aGFuICVpIGxvb3NlIG9iamVjdHMgZXhpc3QuXG4iCisiXG4iCisiQ29tcHJlc3MgdGhlIGRhdGFiYXNlIG5vdz8iCittc2dzdHIgIiIKKyLQrdGC0L7RgiDRgNC10L/QvtC30LjRgtC+0YDQuNC5INGB0LXQudGH0LDRgSDRgdC+0LTQtdGA0LbQuNGCINC/0YDQuNC80LXRgNC90L4gJWkg0YHQstC+0LHQvtC00L3Ri9GFINC+0LHRitC10LrRgtC+0LJcbiIKKyJcbiIKKyLQlNC70Y8g0LvRg9GH0YjQtdC5INC/0YDQvtC40LfQstC+0LTQuNGC0LXQu9GM0L3QvtGB0YLQuCDRgNC10LrQvtC80LXQvdC00YPQtdGC0YHRjyDRgdC20LDRgtGMINCx0LDQt9GDINC00LDQvdC90YvRhSwg0LrQvtCz0LTQsCDQtdGB0YLRjCAiCisi0LHQvtC70LXQtSAlaSDQvdC10YHQstGP0LfQsNC90L3Ri9GFINC+0LHRitC10LrRgtC+0LIuXG4iCisiXG4iCisi0KHQttCw0YLRjCDQsdCw0LfRgyDQtNCw0L3QvdGL0YUg0YHQtdC50YfQsNGBPyIKKworIzogbGliL2RhdGUudGNsOjI1CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBkYXRlIGZyb20gR2l0OiAlcyIKK21zZ3N0ciAi0J3QtdC/0YDQsNCy0LjQu9GM0L3QsNGPINC00LDRgtCwINCyINGA0LXQv9C+0LfQuNGC0L7RgNC40Lg6ICVzIgorCisjOiBsaWIvZGlmZi50Y2w6NDIKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiTm8gZGlmZmVyZW5jZXMgZGV0ZWN0ZWQuXG4iCisiXG4iCisiJXMgaGFzIG5vIGNoYW5nZXMuXG4iCisiXG4iCisiVGhlIG1vZGlmaWNhdGlvbiBkYXRlIG9mIHRoaXMgZmlsZSB3YXMgdXBkYXRlZCBieSBhbm90aGVyIGFwcGxpY2F0aW9uLCBidXQgIgorInRoZSBjb250ZW50IHdpdGhpbiB0aGUgZmlsZSB3YXMgbm90IGNoYW5nZWQuXG4iCisiXG4iCisiQSByZXNjYW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgdG8gZmluZCBvdGhlciBmaWxlcyB3aGljaCBtYXkgaGF2ZSAiCisidGhlIHNhbWUgc3RhdGUuIgorbXNnc3RyICIiCisi0JjQt9C80LXQvdC10L3QuNC5INC90LUg0L7QsdC90LDRgNGD0LbQtdC90L4uXG4iCisiXG4iCisi0LIgJXMg0L7RgtGD0YLRgdGC0LLRg9GO0YIg0LjQt9C80LXQvdC10L3QuNGPLlxuIgorIlxuIgorItCU0LDRgtCwINC40LfQvNC10L3QtdC90LjRjyDRhNCw0LnQu9CwINCx0YvQu9CwINC+0LHQvdC+0LLQu9C10L3QsCDQtNGA0YPQs9C+0Lkg0L/RgNC+0LPRgNCw0LzQvNC+0LksINC90L4g0YHQvtC00LXRgNC20LjQvNC+0LUg0YTQsNC50LvQsCAiCisi0L7RgdGC0LDQu9C+0YHRjCDQv9GA0LXQttC90LjQvC5cbiIKKyJcbiIKKyLQodC10LnRh9Cw0YEg0LHRg9C00LXRgiDQt9Cw0L/Rg9GJ0LXQvdC+INC/0LXRgNC10YfQuNGC0YvQstCw0L3QuNC1INGA0LXQv9C+0LfQuNGC0L7RgNC40Y8sINGH0YLQvtCx0Ysg0L3QsNC50YLQuCDQv9C+0LTQvtCx0L3Ri9C1INGE0LDQudC70YsuIgorCisjOiBsaWIvZGlmZi50Y2w6ODEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJMb2FkaW5nIGRpZmYgb2YgJXMuLi4iCittc2dzdHIgItCX0LDQs9GA0YPQt9C60LAg0LjQt9C80LXQvdC10L3QuNC5INCyICVzLi4uIgorCisjOiBsaWIvZGlmZi50Y2w6MTE0IGxpYi9kaWZmLnRjbDoxODQKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gZGlzcGxheSAlcyIKK21zZ3N0ciAi0J3QtSDQvNC+0LPRgyDQv9C+0LrQsNC30LDRgtGMICVzIgorCisjOiBsaWIvZGlmZi50Y2w6MTE1Cittc2dpZCAiRXJyb3IgbG9hZGluZyBmaWxlOiIKK21zZ3N0ciAi0J7RiNC40LHQutCwINC30LDQs9GA0YPQt9C60Lgg0YTQsNC50LvQsDoiCisKKyM6IGxpYi9kaWZmLnRjbDoxMjIKK21zZ2lkICJHaXQgUmVwb3NpdG9yeSAoc3VicHJvamVjdCkiCittc2dzdHIgItCg0LXQv9C+0LfQuNGC0L7RgNC40LkgR2l0ICjQv9C+0LTQv9GA0L7QtdC60YIpIgorCisjOiBsaWIvZGlmZi50Y2w6MTM0Cittc2dpZCAiKiBCaW5hcnkgZmlsZSAobm90IHNob3dpbmcgY29udGVudCkuIgorbXNnc3RyICIqINCU0LLQvtC40YfQvdGL0Lkg0YTQsNC50LsgKNGB0L7QtNC10YDQttC40LzQvtC1INC90LUg0L/QvtC60LDQt9Cw0L3QvikiCisKKyM6IGxpYi9kaWZmLnRjbDoxODUKK21zZ2lkICJFcnJvciBsb2FkaW5nIGRpZmY6IgorbXNnc3RyICLQntGI0LjQsdC60LAg0LfQsNCz0YDRg9C30LrQuCBkaWZmOiIKKworIzogbGliL2RpZmYudGNsOjMwMworbXNnaWQgIkZhaWxlZCB0byB1bnN0YWdlIHNlbGVjdGVkIGh1bmsuIgorbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINC40YHQutC70Y7Rh9C40YLRjCDQstGL0LHRgNCw0L3QvdGD0Y4g0YfQsNGB0YLRjC4iCisKKyM6IGxpYi9kaWZmLnRjbDozMTAKK21zZ2lkICJGYWlsZWQgdG8gc3RhZ2Ugc2VsZWN0ZWQgaHVuay4iCittc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0L/QvtC00LPQvtGC0L7QstC40YLRjCDQuiDRgdC+0YXRgNCw0L3QtdC90LjRjiDQstGL0LHRgNCw0L3QvdGD0Y4g0YfQsNGB0YLRjC4iCisKKyM6IGxpYi9lcnJvci50Y2w6MjAgbGliL2Vycm9yLnRjbDoxMTQKK21zZ2lkICJlcnJvciIKK21zZ3N0ciAi0L7RiNC40LHQutCwIgorCisjOiBsaWIvZXJyb3IudGNsOjM2Cittc2dpZCAid2FybmluZyIKK21zZ3N0ciAi0L/RgNC10LTRg9C/0YDQtdC20LTQtdC90LjQtSIKKworIzogbGliL2Vycm9yLnRjbDo5NAorbXNnaWQgIllvdSBtdXN0IGNvcnJlY3QgdGhlIGFib3ZlIGVycm9ycyBiZWZvcmUgY29tbWl0dGluZy4iCittc2dzdHIgItCf0YDQtdC20LTQtSDRh9C10Lwg0YHQvtGF0YDQsNC90LjRgtGMLCDQuNGB0L/RgNCw0LLRjNGC0LUg0LLRi9GI0LXRg9C60LDQt9Cw0L3QvdGL0LUg0L7RiNC40LHQutC4LiIKKworIzogbGliL2luZGV4LnRjbDo2Cittc2dpZCAiVW5hYmxlIHRvIHVubG9jayB0aGUgaW5kZXguIgorbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINGA0LDQt9Cx0LvQvtC60LjRgNC+0LLQsNGC0Ywg0LjQvdC00LXQutGBIgorCisjOiBsaWIvaW5kZXgudGNsOjE1Cittc2dpZCAiSW5kZXggRXJyb3IiCittc2dzdHIgItCe0YjQuNCx0LrQsCDQuNC90LTQtdC60YHQsCIKKworIzogbGliL2luZGV4LnRjbDoyMQorbXNnaWQgIiIKKyJVcGRhdGluZyB0aGUgR2l0IGluZGV4IGZhaWxlZC4gIEEgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIHRvICIKKyJyZXN5bmNocm9uaXplIGdpdC1ndWkuIgorbXNnc3RyICIiCisi0J3QtSDRg9C00LDQu9C+0YHRjCDQvtCx0L3QvtCy0LjRgtGMINC40L3QtNC10LrRgSBHaXQuINCh0L7RgdGC0L7Rj9C90LjQtSDRgNC10L/QvtC30LjRgtC+0YDQuNGPINCx0YPQtNC10YLQv9C10YDQtdGH0LjRgtCw0L3QviAiCisi0LDQstGC0L7QvNCw0YLQuNGH0LXRgdC60LguIgorCisjOiBsaWIvaW5kZXgudGNsOjI3Cittc2dpZCAiQ29udGludWUiCittc2dzdHIgItCf0YDQvtC00L7Qu9C20LjRgtGMIgorCisjOiBsaWIvaW5kZXgudGNsOjMxCittc2dpZCAiVW5sb2NrIEluZGV4IgorbXNnc3RyICLQoNCw0LfQsdC70L7QutC40YDQvtCy0LDRgtGMINC40L3QtNC10LrRgSIKKworIzogbGliL2luZGV4LnRjbDoyODIKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbnN0YWdpbmcgJXMgZnJvbSBjb21taXQiCittc2dzdHIgItCj0LTQsNC70LXQvdC40LUgJXMg0LjQtyDQv9C+0LTQs9C+0YLQvtCy0LvQtdC90L3QvtCz0L4iCisKKyM6IGxpYi9pbmRleC50Y2w6MzEzCittc2dpZCAiUmVhZHkgdG8gY29tbWl0LiIKK21zZ3N0ciAi0J/QvtC00LPQvtGC0L7QstC70LXQvdC+INC00LvRjyDRgdC+0YXRgNCw0L3QtdC90LjRjyIKKworIzogbGliL2luZGV4LnRjbDozMjYKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJBZGRpbmcgJXMiCittc2dzdHIgItCU0L7QsdCw0LLQu9C10L3QuNC1ICVzLi4uIgorCisjOiBsaWIvaW5kZXgudGNsOjM4MQorIywgdGNsLWZvcm1hdAorbXNnaWQgIlJldmVydCBjaGFuZ2VzIGluIGZpbGUgJXM/IgorbXNnc3RyICLQntGC0LzQtdC90LjRgtGMINC40LfQvNC10L3QtdC90LjRjyDQsiDRhNCw0LnQu9C1ICVzPyIKKworIzogbGliL2luZGV4LnRjbDozODMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJSZXZlcnQgY2hhbmdlcyBpbiB0aGVzZSAlaSBmaWxlcz8iCittc2dzdHIgItCe0YLQvNC10L3QuNGC0Ywg0LjQt9C80LXQvdC10L3QuNGPINCyICVpINGE0LDQudC70LUoLdCw0YUpPyIKKworIzogbGliL2luZGV4LnRjbDozOTEKK21zZ2lkICJBbnkgdW5zdGFnZWQgY2hhbmdlcyB3aWxsIGJlIHBlcm1hbmVudGx5IGxvc3QgYnkgdGhlIHJldmVydC4iCittc2dzdHIgIiIKKyLQm9GO0LHRi9C1INC40LfQvNC10L3QtdC90LjRjywg0L3QtSDQv9C+0LTQs9C+0YLQvtCy0LvQtdC90L3Ri9C1INC6INGB0L7RhdGA0LDQvdC10L3QuNGOLCDQsdGD0LTRg9GCINC/0L7RgtC10YDRj9C90Ysg0L/RgNC4INC00LDQvdC90L7QuSAiCisi0L7Qv9C10YDQsNGG0LjQuC4iCisKKyM6IGxpYi9pbmRleC50Y2w6Mzk0Cittc2dpZCAiRG8gTm90aGluZyIKK21zZ3N0ciAi0J3QuNGH0LXQs9C+INC90LUg0LTQtdC70LDRgtGMIgorCisjOiBsaWIvbWVyZ2UudGNsOjEzCittc2dpZCAiIgorIkNhbm5vdCBtZXJnZSB3aGlsZSBhbWVuZGluZy5cbiIKKyJcbiIKKyJZb3UgbXVzdCBmaW5pc2ggYW1lbmRpbmcgdGhpcyBjb21taXQgYmVmb3JlIHN0YXJ0aW5nIGFueSB0eXBlIG9mIG1lcmdlLlxuIgorbXNnc3RyICIiCisi0J3QtdCy0L7Qt9C80L7QttC90L4g0LLRi9C/0L7Qu9C90LjRgtGMINC+0LHRitC10LTQuNC90LXQvdC40LUg0LLQviDQstGA0LXQvNGPINC40YHQv9GA0LDQstC70LXQvdC40Y8uXG4iCisiXG4iCisi0JfQsNCy0LXRgNGI0LjRgtC1INC40YHQv9GA0LDQstC70LXQvdC40LUg0LTQsNC90L3QvtCz0L4g0YHQvtGB0YLQvtGP0L3QuNGPINC/0LXRgNC10LQg0LLRi9C/0L7Qu9C90LXQvdC40LXQvCDQvtC/0LXRgNCw0YbQuNC4ICIKKyLQvtCx0YrQtdC00LjQvdC10L3QuNGPLlxuIgorCisjOiBsaWIvbWVyZ2UudGNsOjI3Cittc2dpZCAiIgorIkxhc3Qgc2Nhbm5lZCBzdGF0ZSBkb2VzIG5vdCBtYXRjaCByZXBvc2l0b3J5IHN0YXRlLlxuIgorIlxuIgorIkFub3RoZXIgR2l0IHByb2dyYW0gaGFzIG1vZGlmaWVkIHRoaXMgcmVwb3NpdG9yeSBzaW5jZSB0aGUgbGFzdCBzY2FuLiAgQSAiCisicmVzY2FuIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSBhIG1lcmdlIGNhbiBiZSBwZXJmb3JtZWQuXG4iCisiXG4iCisiVGhlIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBub3cuXG4iCittc2dzdHIgIiIKKyLQn9C+0YHQu9C10LTQvdC10LUg0L/RgNC+0YfQuNGC0LDQvdC90L7QtSDRgdC+0YHRgtC+0Y/QvdC40LUg0YDQtdC/0L7Qt9C40YLQvtGA0LjRjyDQvdC1INGB0L7QvtGC0LLQtdGC0YHRgtCy0YPQtdGCINGC0LXQutGD0YnQtdC80YMuXG4iCisiXG4iCisi0KEg0LzQvtC80LXQvdGC0LAg0L/QvtGB0LvQtdC00L3QtdC5INC/0YDQvtCy0LXRgNC60Lgg0YDQtdC/0L7Qt9C40YLQvtGA0LjQuSDQsdGL0Lsg0LjQt9C80LXQvdC10L0g0LTRgNGD0LPQvtC5INC/0YDQvtCz0YDQsNC80LzQvtC5IEdpdC4gIgorItCd0LXQvtCx0YXQvtC00LjQvNC+INC/0LXRgNC10YfQuNGC0LDRgtGMINGA0LXQv9C+0LfQuNGC0L7RgNC40LksINC/0YDQtdC20LTQtSDRh9C10Lwg0LjQt9C80LXQvdGP0YLRjCDRgtC10LrRg9GJ0YPRjiDQstC10YLQstGMLlxuIgorIlxuIgorItCt0YLQviDQsdGD0LTQtdGCINGB0LTQtdC70LDQvdC+INGB0LXQudGH0LDRgSDQsNCy0YLQvtC80LDRgtC40YfQtdGB0LrQuC5cbiIKKworIzogbGliL21lcmdlLnRjbDo0NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJZb3UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBjb25mbGljdGVkIG1lcmdlLlxuIgorIlxuIgorIkZpbGUgJXMgaGFzIG1lcmdlIGNvbmZsaWN0cy5cbiIKKyJcbiIKKyJZb3UgbXVzdCByZXNvbHZlIHRoZW0sIHN0YWdlIHRoZSBmaWxlLCBhbmQgY29tbWl0IHRvIGNvbXBsZXRlIHRoZSBjdXJyZW50ICIKKyJtZXJnZS4gIE9ubHkgdGhlbiBjYW4geW91IGJlZ2luIGFub3RoZXIgbWVyZ2UuXG4iCittc2dzdHIgIiIKKyLQn9GA0LXQtNGL0LTRg9GJ0LXQtSDQvtCx0YrQtdC00LjQvdC10L3QuNC1INC90LUg0LfQsNCy0LXRgNGI0LXQvdC+INC40Lct0LfQsCDQutC+0L3RhNC70LjQutGC0LAuXG4iCisiXG4iCisi0JTQu9GPINGE0LDQudC70LAgJXMg0LLQvtC30L3QuNC6INC60L7QvdGE0LvQuNC60YIg0L7QsdGK0LXQtNC40L3QtdC90LjRjy5cbiIKKyJcbiIKKyLQoNCw0LfRgNC10YjQuNGC0LUg0LrQvtC90YTQu9C40LrRgiwg0L/QvtC00LPQvtGC0L7QstGM0YLQtSDRhNCw0LnQuyDQuCDRgdC+0YXRgNCw0L3QuNGC0LUuINCi0L7Qu9GM0LrQviDQv9C+0YHQu9C1INGN0YLQvtCz0L4g0LzQvtC20L3QviAiCisi0L3QsNGH0LDRgtGMINGB0LvQtdC00YPRjtGJ0LXQtSDQvtCx0YrQtdC00LjQvdC10L3QuNC1LlxuIgorCisjOiBsaWIvbWVyZ2UudGNsOjU0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIllvdSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIGNoYW5nZS5cbiIKKyJcbiIKKyJGaWxlICVzIGlzIG1vZGlmaWVkLlxuIgorIlxuIgorIllvdSBzaG91bGQgY29tcGxldGUgdGhlIGN1cnJlbnQgY29tbWl0IGJlZm9yZSBzdGFydGluZyBhIG1lcmdlLiAgRG9pbmcgc28gIgorIndpbGwgaGVscCB5b3UgYWJvcnQgYSBmYWlsZWQgbWVyZ2UsIHNob3VsZCB0aGUgbmVlZCBhcmlzZS5cbiIKK21zZ3N0ciAiIgorItCY0LfQvNC10L3QtdC90LjRjyDQvdC1INGB0L7RhdGA0LDQvdC10L3Riy5cbiIKKyJcbiIKKyLQpNCw0LnQuyAlcyDQuNC30LzQtdC90LXQvS5cbiIKKyJcbiIKKyLQn9C+0LTQs9C+0YLQvtCy0YzRgtC1INC4INGB0L7RhdGA0LDQvdC40YLQtSDQuNC30LzQtdC90LjRjyDQv9C10YDQtdC0INC90LDRh9Cw0LvQvtC8INC+0LHRitC10LTQuNC90LXQvdC40Y8uINCSINGB0LvRg9GH0LDQtSAiCisi0L3QtdC+0LHRhdC+0LTQuNC80L7RgdGC0Lgg0Y3RgtC+INC/0L7Qt9Cy0L7Qu9C40YIg0L/RgNC10YDQstCw0YLRjCDQvtC/0LXRgNCw0YbQuNGOINC+0LHRitC10LTQuNC90LXQvdC40Y8uXG4iCisKKyM6IGxpYi9tZXJnZS50Y2w6MTA2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiJXMgb2YgJXMiCittc2dzdHIgIiVzINC40LcgJXMiCisKKyM6IGxpYi9tZXJnZS50Y2w6MTE5Cittc2dpZCAiTWVyZ2luZyAlcyBhbmQgJXMuLi4iCittc2dzdHIgItCe0LHRitC10LTQuNC90LXQvdC40LUgJXMg0LggJXMuLi4iCisKKyM6IGxpYi9tZXJnZS50Y2w6MTMwCittc2dpZCAiTWVyZ2UgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4iCittc2dzdHIgItCe0LHRitC10LTQuNC90LXQvdC40LUg0YPRgdC/0LXRiNC90L4g0LfQsNCy0LXRgNGI0LXQvdC+LiIKKworIzogbGliL21lcmdlLnRjbDoxMzIKK21zZ2lkICJNZXJnZSBmYWlsZWQuICBDb25mbGljdCByZXNvbHV0aW9uIGlzIHJlcXVpcmVkLiIKK21zZ3N0ciAi0J3QtSDRg9C00LDQu9C+0YHRjCDQt9Cw0LLQtdGA0YjQuNGC0Ywg0L7QsdGK0LXQtNC40L3QtdC90LjQtS4g0KLRgNC10LHRg9C10YLRgdGPINGA0LDQt9GA0LXRiNC10L3QuNC1INC60L7QvdGE0LvQuNC60YLQsC4iCisKKyM6IGxpYi9tZXJnZS50Y2w6MTU3CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiTWVyZ2UgSW50byAlcyIKK21zZ3N0ciAi0J7QsdGK0LXQtNC40L3QuNGC0Ywg0YEgJXMiCisKKyM6IGxpYi9tZXJnZS50Y2w6MTc2Cittc2dpZCAiUmV2aXNpb24gVG8gTWVyZ2UiCittc2dzdHIgItCS0LXRgNGB0LjRjyDQtNC70Y8g0L7QsdGK0LXQtNC40L3QtdC90LjRjyIKKworIzogbGliL21lcmdlLnRjbDoyMTEKK21zZ2lkICIiCisiQ2Fubm90IGFib3J0IHdoaWxlIGFtZW5kaW5nLlxuIgorIlxuIgorIllvdSBtdXN0IGZpbmlzaCBhbWVuZGluZyB0aGlzIGNvbW1pdC5cbiIKK21zZ3N0ciAiIgorItCd0LXQstC+0LfQvNC+0LbQvdC+INC/0YDQtdGA0LLQsNGC0Ywg0LjRgdC/0YDQsNCy0LvQtdC90LjQtS5cbiIKKyJcbiIKKyLQl9Cw0LLQtdGA0YjQuNGC0LUg0YLQtdC60YPRidC10LUg0LjRgdC/0YDQsNCy0LvQtdC90LjQtSDRgdC+0YXRgNCw0L3QtdC90L3QvtCz0L4g0YHQvtGB0YLQvtGP0L3QuNGPLlxuIgorCisjOiBsaWIvbWVyZ2UudGNsOjIyMQorbXNnaWQgIiIKKyJBYm9ydCBtZXJnZT9cbiIKKyJcbiIKKyJBYm9ydGluZyB0aGUgY3VycmVudCBtZXJnZSB3aWxsIGNhdXNlICpBTEwqIHVuY29tbWl0dGVkIGNoYW5nZXMgdG8gYmUgbG9zdC5cbiIKKyJcbiIKKyJDb250aW51ZSB3aXRoIGFib3J0aW5nIHRoZSBjdXJyZW50IG1lcmdlPyIKK21zZ3N0ciAiIgorItCf0YDQtdGA0LLQsNGC0Ywg0L7QsdGK0LXQtNC40L3QtdC90LjQtT9cbiIKKyJcbiIKKyLQn9GA0LXRgNGL0LLQsNC90LjQtSDQvtCx0YrQtdC00LjQvdC10L3QuNGPINC/0YDQuNCy0LXQtNC10YIg0Log0L/QvtGC0LXRgNC1ICrQktCh0JXQpSog0L3QtdGB0L7RhdGA0LDQvdC10L3QvdGL0YUg0LjQt9C80LXQvdC10L3QuNC5LlxuIgorIlxuIgorItCf0YDQvtC00L7Qu9C20LjRgtGMPyIKKworIzogbGliL21lcmdlLnRjbDoyMjcKK21zZ2lkICIiCisiUmVzZXQgY2hhbmdlcz9cbiIKKyJcbiIKKyJSZXNldHRpbmcgdGhlIGNoYW5nZXMgd2lsbCBjYXVzZSAqQUxMKiB1bmNvbW1pdHRlZCBjaGFuZ2VzIHRvIGJlIGxvc3QuXG4iCisiXG4iCisiQ29udGludWUgd2l0aCByZXNldHRpbmcgdGhlIGN1cnJlbnQgY2hhbmdlcz8iCittc2dzdHIgIiIKKyLQn9GA0LXRgNCy0LDRgtGMINC+0LHRitC10LTQuNC90LXQvdC40LU/XG4iCisiXG4iCisi0J/RgNC10YDRi9Cy0LDQvdC40LUg0L7QsdGK0LXQtNC40L3QtdC90LjRjyDQv9GA0LjQstC10LTQtdGCINC6INC/0L7RgtC10YDQtSAq0JLQodCV0KUqINC90LXRgdC+0YXRgNCw0L3QtdC90L3Ri9GFINC40LfQvNC10L3QtdC90LjQuS5cbiIKKyJcbiIKKyLQn9GA0L7QtNC+0LvQttC40YLRjD8iCisKKyM6IGxpYi9tZXJnZS50Y2w6MjM4Cittc2dpZCAiQWJvcnRpbmciCittc2dzdHIgItCf0YDQtdGA0YvQstCw0Y4iCisKKyM6IGxpYi9tZXJnZS50Y2w6MjM4Cittc2dpZCAiZmlsZXMgcmVzZXQiCittc2dzdHIgItC40LfQvNC10L3QtdC90LjRjyDQsiDRhNCw0LnQu9Cw0YUg0L7RgtC80LXQvdC10L3RiyIKKworIzogbGliL21lcmdlLnRjbDoyNjUKK21zZ2lkICJBYm9ydCBmYWlsZWQuIgorbXNnc3RyICLQn9GA0LXRgNCy0LDRgtGMINC90LUg0YPQtNCw0LvQvtGB0YwuIgorCisjOiBsaWIvbWVyZ2UudGNsOjI2NworbXNnaWQgIkFib3J0IGNvbXBsZXRlZC4gIFJlYWR5LiIKK21zZ3N0ciAi0J/RgNC10YDQstCw0L3Qvi4iCisKKyM6IGxpYi9vcHRpb24udGNsOjk1Cittc2dpZCAiUmVzdG9yZSBEZWZhdWx0cyIKK21zZ3N0ciAi0JLQvtGB0YHRgtCw0L3QvtCy0LjRgtGMINC90LDRgdGC0YDQvtC50LrQuCDQv9C+INGD0LzQvtC70YfQsNC90LjRjiIKKworIzogbGliL29wdGlvbi50Y2w6OTkKK21zZ2lkICJTYXZlIgorbXNnc3RyICLQodC+0YXRgNCw0L3QuNGC0YwiCisKKyM6IGxpYi9vcHRpb24udGNsOjEwOQorIywgdGNsLWZvcm1hdAorbXNnaWQgIiVzIFJlcG9zaXRvcnkiCittc2dzdHIgItC00LvRjyDRgNC10L/QvtC30LjRgtC+0YDQuNGPICVzIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMTAKK21zZ2lkICJHbG9iYWwgKEFsbCBSZXBvc2l0b3JpZXMpIgorbXNnc3RyICLQntCx0YnQuNC1ICjQtNC70Y8g0LLRgdC10YUg0YDQtdC/0L7Qt9C40YLQvtGA0LjQtdCyKSIKKworIzogbGliL29wdGlvbi50Y2w6MTE2Cittc2dpZCAiVXNlciBOYW1lIgorbXNnc3RyICLQmNC80Y8g0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GPIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMTcKK21zZ2lkICJFbWFpbCBBZGRyZXNzIgorbXNnc3RyICLQkNC00YDQtdGBINGN0LvQtdC60YLRgNC+0L3QvdC+0Lkg0L/QvtGH0YLRiyIKKworIzogbGliL29wdGlvbi50Y2w6MTE5Cittc2dpZCAiU3VtbWFyaXplIE1lcmdlIENvbW1pdHMiCittc2dzdHIgItCh0YPQvNC80LDRgNC90YvQuSDQutC+0LzQvNC10L3RgtCw0YDQuNC5INC/0YDQuCDQvtCx0YrQtdC00LjQvdC10L3QuNC4IgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMjAKK21zZ2lkICJNZXJnZSBWZXJib3NpdHkiCittc2dzdHIgItCj0YDQvtCy0LXQvdGMINC00LXRgtCw0LvRjNC90L7RgdGC0Lgg0YHQvtC+0LHRidC10L3QuNC5INC/0YDQuCDQvtCx0YrQtdC00LjQvdC10L3QuNC4IgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMjEKK21zZ2lkICJTaG93IERpZmZzdGF0IEFmdGVyIE1lcmdlIgorbXNnc3RyICLQn9C+0LrQsNC30LDRgtGMINC+0YLRh9C10YIg0L7QsSDQuNC30LzQtdC90LXQvdC40Y/RhSDQv9C+0YHQu9C1INC+0LHRitC10LTQuNC90LXQvdC40Y8iCisKKyM6IGxpYi9vcHRpb24udGNsOjEyMworbXNnaWQgIlRydXN0IEZpbGUgTW9kaWZpY2F0aW9uIFRpbWVzdGFtcHMiCittc2dzdHIgItCU0L7QstC10YDRj9GC0Ywg0LLRgNC10LzQtdC90Lgg0LzQvtC00LjRhNC40LrQsNGG0LjQuCDRhNCw0LnQu9CwIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMjQKK21zZ2lkICJQcnVuZSBUcmFja2luZyBCcmFuY2hlcyBEdXJpbmcgRmV0Y2giCittc2dzdHIgItCn0LjRgdGC0LrQsCDQstC10YLQstC10Lkg0YHQu9C10LbQtdC90LjRjyDQv9GA0Lgg0L/QvtC70YPRh9C10L3QuNC4INC40LfQvNC10L3QtdC90LjQuSIKKworIzogbGliL29wdGlvbi50Y2w6MTI1Cittc2dpZCAiTWF0Y2ggVHJhY2tpbmcgQnJhbmNoZXMiCittc2dzdHIgItCY0LzRjyDQvdC+0LLQvtC5INCy0LXRgtCy0Lgg0LLQt9GP0YLRjCDQuNC3INC40LzQtdC9INCy0LXRgtCy0LXQuSDRgdC70LXQttC10L3QuNGPIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMjYKK21zZ2lkICJOdW1iZXIgb2YgRGlmZiBDb250ZXh0IExpbmVzIgorbXNnc3RyICLQp9C40YHQu9C+INGB0YLRgNC+0Log0LIg0LrQvtC90YLQtdC60YHRgtC1IGRpZmYiCisKKyM6IGxpYi9vcHRpb24udGNsOjEyNworbXNnaWQgIkNvbW1pdCBNZXNzYWdlIFRleHQgV2lkdGgiCittc2dzdHIgItCo0LjRgNC40L3QsCDQutC+0LzQvNC10L3RgtCw0YDQuNGPINC6INGB0L7RgdGC0L7Rj9C90LjRjjoiCisKKyM6IGxpYi9vcHRpb24udGNsOjEyOAorbXNnaWQgIk5ldyBCcmFuY2ggTmFtZSBUZW1wbGF0ZSIKK21zZ3N0ciAi0KjQsNCx0LvQvtC9INC00LvRjyDQuNC80LXQvdC4INC90L7QstC+0Lkg0LLQtdGC0LLQuCIKKworIzogbGliL29wdGlvbi50Y2w6MTkyCittc2dpZCAiU3BlbGxpbmcgRGljdGlvbmFyeToiCittc2dzdHIgItCh0LvQvtCy0LDRgNGMINC00LvRjyDQv9GA0L7QstC10YDQutC4INC/0YDQsNCy0L7Qv9C40YHQsNC90LjRjzoiCisKKyM6IGxpYi9vcHRpb24udGNsOjIxNgorbXNnaWQgIkNoYW5nZSBGb250IgorbXNnc3RyICLQmNC30LzQtdC90LjRgtGMINGI0YDQuNGE0YIiCisKKyM6IGxpYi9vcHRpb24udGNsOjIyMAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkNob29zZSAlcyIKK21zZ3N0ciAi0JLRi9Cx0LXRgNC40YLQtSAlcyIKKworIyBjYXJib24gY29weQorIzogbGliL29wdGlvbi50Y2w6MjI2Cittc2dpZCAicHQuIgorbXNnc3RyICIiCisKKyM6IGxpYi9vcHRpb24udGNsOjI0MAorbXNnaWQgIlByZWZlcmVuY2VzIgorbXNnc3RyICLQndCw0YHRgtGA0L7QudC60LgiCisKKyM6IGxpYi9vcHRpb24udGNsOjI3NQorbXNnaWQgIkZhaWxlZCB0byBjb21wbGV0ZWx5IHNhdmUgb3B0aW9uczoiCittc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0L/QvtC70L3QvtGB0YLRjNGOINGB0L7RhdGA0LDQvdC40YLRjCDQvdCw0YHRgtGA0L7QudC60Lg6IgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjI5IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MzQKK21zZ2lkICJEZWxldGUgUmVtb3RlIEJyYW5jaCIKK21zZ3N0ciAi0KPQtNCw0LvQuNGC0Ywg0LLQvdC10YjQvdGO0Y4g0LLQtdGC0LLRjCIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDo0NworbXNnaWQgIkZyb20gUmVwb3NpdG9yeSIKK21zZ3N0ciAi0JjQtyDRgNC10L/QvtC30LjRgtC+0YDQuNGPIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjUwIGxpYi90cmFuc3BvcnQudGNsOjEyMworbXNnaWQgIlJlbW90ZToiCittc2dzdHIgItCy0L3QtdGI0L3QuNC5OiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDo2NiBsaWIvdHJhbnNwb3J0LnRjbDoxMzgKK21zZ2lkICJBcmJpdHJhcnkgVVJMOiIKK21zZ3N0ciAi0L/QviDRg9C60LDQt9Cw0L3QvdC+0LzRgyBVUkw6IgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjg0Cittc2dpZCAiQnJhbmNoZXMiCittc2dzdHIgItCS0LXRgtCy0LgiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MTA5Cittc2dpZCAiRGVsZXRlIE9ubHkgSWYiCittc2dzdHIgItCj0LTQsNC70LjRgtGMINGC0L7Qu9GM0LrQviDQsiDRgdC70YPRh9Cw0LUsINC10YHQu9C4IgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjExMQorbXNnaWQgIk1lcmdlZCBJbnRvOiIKK21zZ3N0ciAi0J7QsdGK0LXQtNC40L3QtdC90L4g0YE6IgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjExOQorbXNnaWQgIkFsd2F5cyAoRG8gbm90IHBlcmZvcm0gbWVyZ2UgY2hlY2tzKSIKK21zZ3N0ciAi0JLRgdC10LPQtNCwICjQvdC1INCy0YvQv9C+0LvQvdGP0YLRjCDQv9GA0L7QstC10YDQutGDINC+0LHRitC10LTQuNC90LXQvdC40LkpIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjE1MgorbXNnaWQgIkEgYnJhbmNoIGlzIHJlcXVpcmVkIGZvciAnTWVyZ2VkIEludG8nLiIKK21zZ3N0ciAi0JTQu9GPINC+0L/RhtC40LggJ9Ce0LHRitC10LTQuNC90LXQvdC+INGBJyDRgtGA0LXQsdGD0LXRgtGB0Y8g0YPQutCw0LfQsNGC0Ywg0LLQtdGC0LLRjC4iCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MTg0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIlRoZSBmb2xsb3dpbmcgYnJhbmNoZXMgYXJlIG5vdCBjb21wbGV0ZWx5IG1lcmdlZCBpbnRvICVzOlxuIgorIlxuIgorIiAtICVzIgorbXNnc3RyICIiCisi0KHQu9C10LTRg9GO0YnQuNC1INCy0LXRgtCy0Lgg0L7QsdGK0LXQtNC40L3QtdC90Ysg0YEgJXMg0L3QtSDQv9C+0LvQvdC+0YHRgtGM0Y46XG4iCisiIC0gJXMiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MTg5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIk9uZSBvciBtb3JlIG9mIHRoZSBtZXJnZSB0ZXN0cyBmYWlsZWQgYmVjYXVzZSB5b3UgaGF2ZSBub3QgZmV0Y2hlZCB0aGUgIgorIm5lY2Vzc2FyeSBjb21taXRzLiAgVHJ5IGZldGNoaW5nIGZyb20gJXMgZmlyc3QuIgorbXNnc3RyICIiCisi0J7QtNC40L0g0LjQu9C4INC90LXRgdC60L7Qu9GM0LrQviDRgtC10YHRgtC+0LIg0L3QsCDQvtCx0YrQtdC00LjQvdC10L3QuNC1INC90LUg0L/RgNC+0YjQu9C4LCDQv9C+0YLQvtC80YMg0YfRgtC+INCS0Ysg0L3QtSAiCisi0L/QvtC70YPRh9C40LvQuCDQvdC10L7QsdGF0L7QtNC40LzRi9C1INGB0L7RgdGC0L7Rj9C90LjRjy4g0J/QvtC/0YvRgtCw0LnRgtC10YHRjCDQv9C+0LvRg9GH0LjRgtGMINC40YUg0LjQtyAlcy4iCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MjA3Cittc2dpZCAiUGxlYXNlIHNlbGVjdCBvbmUgb3IgbW9yZSBicmFuY2hlcyB0byBkZWxldGUuIgorbXNnc3RyICLQo9C60LDQttC40YLQtSDQvtC00L3RgyDQuNC70Lgg0L3QtdGB0LrQvtC70YzQutC+INCy0LXRgtCy0LXQuSDQtNC70Y8g0YPQtNCw0LvQtdC90LjRjy4iCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MjE2Cittc2dpZCAiIgorIlJlY292ZXJpbmcgZGVsZXRlZCBicmFuY2hlcyBpcyBkaWZmaWN1bHQuXG4iCisiXG4iCisiRGVsZXRlIHRoZSBzZWxlY3RlZCBicmFuY2hlcz8iCittc2dzdHIgIiIKKyLQktC+0YHRgdGC0LDQvdC+0LLQuNGC0Ywg0YPQtNCw0LvQtdC90L3Ri9C1INCy0LXRgtCy0Lgg0YHQu9C+0LbQvdC+LlxuIgorIlxuIgorItCf0YDQvtC00L7Qu9C20LjRgtGMPyIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoyMjYKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJEZWxldGluZyBicmFuY2hlcyBmcm9tICVzIgorbXNnc3RyICLQo9C00LDQu9C10L3QuNC1INCy0LXRgtCy0LXQuSDQuNC3ICVzIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjI4NgorbXNnaWQgIk5vIHJlcG9zaXRvcnkgc2VsZWN0ZWQuIgorbXNnc3RyICLQndC1INGD0LrQsNC30LDQvSDRgNC10L/QvtC30LjRgtC+0YDQuNC5LiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoyOTEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJTY2FubmluZyAlcy4uLiIKK21zZ3N0ciAi0J/QtdGA0LXRh9C40YLRi9Cy0LDQvdC40LUgJXMuLi4gIgorCisjOiBsaWIvcmVtb3RlLnRjbDoxNjUKK21zZ2lkICJQcnVuZSBmcm9tIgorbXNnc3RyICLQp9C40YHRgtC60LAiCisKKyM6IGxpYi9yZW1vdGUudGNsOjE3MAorbXNnaWQgIkZldGNoIGZyb20iCittc2dzdHIgItCf0L7Qu9GD0YfQtdC90LjQtSDQuNC3IgorCisjOiBsaWIvcmVtb3RlLnRjbDoyMTMKK21zZ2lkICJQdXNoIHRvIgorbXNnc3RyICLQntGC0L/RgNCw0LLQuNGC0YwiCisKKyM6IGxpYi9zaG9ydGN1dC50Y2w6MjAgbGliL3Nob3J0Y3V0LnRjbDo2MQorbXNnaWQgIkNhbm5vdCB3cml0ZSBzaG9ydGN1dDoiCittc2dzdHIgItCd0LXQstC+0LfQvNC+0LbQvdC+INC30LDQv9C40YHQsNGC0Ywg0YHRgdGL0LvQutGDOiIKKworIzogbGliL3Nob3J0Y3V0LnRjbDoxMzYKK21zZ2lkICJDYW5ub3Qgd3JpdGUgaWNvbjoiCittc2dzdHIgItCd0LXQstC+0LfQvNC+0LbQvdC+INC30LDQv9C40YHQsNGC0Ywg0LfQvdCw0YfQvtC6OiIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjU3Cittc2dpZCAiVW5zdXBwb3J0ZWQgc3BlbGwgY2hlY2tlciIKK21zZ3N0ciAi0J3QtdC/0L7QtNC00LXRgNC20LjQstCw0LXQvNCw0Y8g0L/RgNC+0LPRgNCw0LzQvNCwINC/0YDQvtCy0LXRgNC60Lgg0L/RgNCw0LLQvtC/0LjRgdCw0L3QuNGPIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6NjUKK21zZ2lkICJTcGVsbCBjaGVja2luZyBpcyB1bmF2YWlsYWJsZSIKK21zZ3N0ciAi0J/RgNC+0LLQtdGA0LrQsCDQv9GA0LDQstC+0L/QuNGB0LDQvdC40Y8g0L3QtSDQtNC+0YHRgtGD0L/QvdCwIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6NjgKK21zZ2lkICJJbnZhbGlkIHNwZWxsIGNoZWNraW5nIGNvbmZpZ3VyYXRpb24iCittc2dzdHIgItCd0LXQv9GA0LDQstC40LvRjNC90LDRjyDQutC+0L3RhNC40LPRg9GA0LDRhtC40Y8g0L/RgNC+0LPRgNCw0LzQvNGLINC/0YDQvtCy0LXRgNC60Lgg0L/RgNCw0LLQvtC/0LjRgdCw0L3QuNGPIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6NzAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJSZXZlcnRpbmcgZGljdGlvbmFyeSB0byAlcy4iCittc2dzdHIgItCh0LvQvtCy0LDRgNGMINCy0LXRgNC90YPRgiDQuiAlcy4iCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDo3MworbXNnaWQgIlNwZWxsIGNoZWNrZXIgc2lsZW50bHkgZmFpbGVkIG9uIHN0YXJ0dXAiCittc2dzdHIgItCf0YDQvtCz0YDQsNC80LzQsCDQv9GA0L7QstC10YDQutC4INC/0YDQsNCy0L7Qv9C40YHQsNC90LjRjyDQvdC1INGB0LzQvtCz0LvQsCDQt9Cw0L/Rg9GB0YLQuNGC0YHRjyIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjgwCittc2dpZCAiVW5yZWNvZ25pemVkIHNwZWxsIGNoZWNrZXIiCittc2dzdHIgItCd0LXRgNCw0YHQv9C+0LfQvdCw0L3QsNGPINC/0YDQvtCz0YDQsNC80LzQsCDQv9GA0L7QstC10YDQutC4INC/0YDQsNCy0L7Qv9C40YHQsNC90LjRjyIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjE4MAorbXNnaWQgIk5vIFN1Z2dlc3Rpb25zIgorbXNnc3RyICLQmNGB0L/RgNCw0LLQu9C10L3QuNC5INC90LUg0L3QsNC50LTQtdC90L4iCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDozODEKK21zZ2lkICJVbmV4cGVjdGVkIEVPRiBmcm9tIHNwZWxsIGNoZWNrZXIiCittc2dzdHIgItCf0YDQvtCz0YDQsNC80LzQsCDQv9GA0L7QstC10YDQutC4INC/0YDQsNCy0L7Qv9C40YHQsNC90LjRjyDQv9GA0LXRgNCy0LDQu9CwINC/0LXRgNC10LTQsNGH0YMg0LTQsNC90L3Ri9GFIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6Mzg1Cittc2dpZCAiU3BlbGwgQ2hlY2tlciBGYWlsZWQiCittc2dzdHIgItCe0YjQuNCx0LrQsCDQv9GA0L7QstC10YDQutC4INC/0YDQsNCy0L7Qv9C40YHQsNC90LjRjyIKKworIzogbGliL3N0YXR1c19iYXIudGNsOjgzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiJXMgLi4uICUqaSBvZiAlKmkgJXMgKCUzaSUlKSIKK21zZ3N0ciAiJXMgLi4uICUqaSDQuNC3ICUqaSAlcyAoJTNpJSUpIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDo2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiZmV0Y2ggJXMiCittc2dzdHIgItC/0L7Qu9GD0YfQtdC90LjQtSAlcyIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6NworIywgdGNsLWZvcm1hdAorbXNnaWQgIkZldGNoaW5nIG5ldyBjaGFuZ2VzIGZyb20gJXMiCittc2dzdHIgItCf0L7Qu9GD0YfQtdC90LjQtSDQuNC30LzQtdC90LXQvdC40Lkg0LjQtyAlcyAiCisKKyMgY2FyYm9uIGNvcHkKKyM6IGxpYi90cmFuc3BvcnQudGNsOjE4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAicmVtb3RlIHBydW5lICVzIgorbXNnc3RyICLRh9C40YHRgtC60LAg0LLQvdC10YjQvdC10LPQviAlcyIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJQcnVuaW5nIHRyYWNraW5nIGJyYW5jaGVzIGRlbGV0ZWQgZnJvbSAlcyIKK21zZ3N0ciAi0KfQuNGB0YLQutCwINCy0LXRgtCy0LXQuSDRgdC70LXQttC10L3QuNGPLCDRg9C00LDQu9C10L3QvdGL0YUg0LjQtyAlcyIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MjUgbGliL3RyYW5zcG9ydC50Y2w6NzEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJwdXNoICVzIgorbXNnc3RyICLQvtGC0L/RgNCw0LLQuNGC0YwgJXMiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjI2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUHVzaGluZyBjaGFuZ2VzIHRvICVzIgorbXNnc3RyICLQntGC0L/RgNCw0LLQutCwINC40LfQvNC10L3QtdC90LjQuSDQsiAlcyAiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjcyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUHVzaGluZyAlcyAlcyB0byAlcyIKK21zZ3N0ciAi0J7RgtC/0YDQsNCy0LrQsCAlcyAlcyDQsiAlcyIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6ODkKK21zZ2lkICJQdXNoIEJyYW5jaGVzIgorbXNnc3RyICLQntGC0L/RgNCw0LLQuNGC0Ywg0LjQt9C80LXQvdC10L3QuNGPINCyINCy0LXRgtCy0Y/RhSIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTAzCittc2dpZCAiU291cmNlIEJyYW5jaGVzIgorbXNnc3RyICLQmNGB0YXQvtC00L3Ri9C1INCy0LXRgtCy0LgiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjEyMAorbXNnaWQgIkRlc3RpbmF0aW9uIFJlcG9zaXRvcnkiCittc2dzdHIgItCg0LXQv9C+0LfQuNGC0L7RgNC40Lkg0L3QsNC30L3QsNGH0LXQvdC40Y8iCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjE1OAorbXNnaWQgIlRyYW5zZmVyIE9wdGlvbnMiCittc2dzdHIgItCd0LDRgdGC0YDQvtC50LrQuCDQvtGC0L/RgNCw0LLQutC4IgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoxNjAKK21zZ2lkICJGb3JjZSBvdmVyd3JpdGUgZXhpc3RpbmcgYnJhbmNoIChtYXkgZGlzY2FyZCBjaGFuZ2VzKSIKK21zZ3N0ciAi0J3QsNC80LXRgNC10L3QvdC+INC/0LXRgNC10L/QuNGB0LDRgtGMINGB0YPRidC10YHRgtCy0YPRjtGJ0YPRjiDQstC10YLQstGMICjQstC+0LfQvNC+0LbQvdCwINC/0L7RgtC10YDRjyDQuNC30LzQtdC90LXQvdC40LkpIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoxNjQKK21zZ2lkICJVc2UgdGhpbiBwYWNrIChmb3Igc2xvdyBuZXR3b3JrIGNvbm5lY3Rpb25zKSIKK21zZ3N0ciAi0JjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGMIHRoaW4gcGFjayAo0LTQu9GPINC80LXQtNC70LXQvdC90YvRhSDRgdC10YLQtdCy0YvRhSDQv9C+0LTQutC70Y7Rh9C10L3QuNC5KSIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTY4Cittc2dpZCAiSW5jbHVkZSB0YWdzIgorbXNnc3RyICLQn9C10YDQtdC00LDRgtGMINGC0LDQs9C4IgorCisjfiBtc2dpZCAiTmV4dCA+IgorI34gbXNnc3RyICLQlNCw0LvRjNGI0LUgPiIKZGlmZiAtLWdpdCBhL2dpdC1ndWkvcG8vc3YucG8gYi9naXQtZ3VpL3BvL3N2LnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYTY4N2IKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtZ3VpL3BvL3N2LnBvCkBAIC0wLDAgKzEsMTk4MCBAQAorIyBTd2VkaXNoIHRyYW5zbGF0aW9uIG9mIGdpdC1ndWkuCisjIENvcHlyaWdodCAoQykgMjAwNyBTaGF3biBQZWFyY2UsIGV0IGFsLgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ2l0LWd1aSBwYWNrYWdlLgorIworIyBQZXRlciBLYXJsc3NvbiA8cGV0ZXJAc29mdHdvbHZlcy5wcC5zZT4sIDIwMDctMjAwOC4KK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IHN2XG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IFxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDA4LTAzLTE0IDA3OjE4KzAxMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA4LTAzLTE0IDA3OjIzKzAxMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IFBldGVyIEthcmxzc29uIDxwZXRlckBzb2Z0d29sdmVzLnBwLnNlPlxuIgorIkxhbmd1YWdlLVRlYW06IFN3ZWRpc2ggPHRwLXN2QGxpc3Rvci50cC1zdi5zZT5cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQiCisKKyM6IGdpdC1ndWkuc2g6NDEgZ2l0LWd1aS5zaDo2MzQgZ2l0LWd1aS5zaDo2NDggZ2l0LWd1aS5zaDo2NjEgZ2l0LWd1aS5zaDo3NDQKKyM6IGdpdC1ndWkuc2g6NzYzCittc2dpZCAiZ2l0LWd1aTogZmF0YWwgZXJyb3IiCittc2dzdHIgImdpdC1ndWk6IMO2ZGVzZGlnZXJ0IGZlbCIKKworIzogZ2l0LWd1aS5zaDo1OTMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIGZvbnQgc3BlY2lmaWVkIGluICVzOiIKK21zZ3N0ciAiT2dpbHRpZ3QgdGVja2Vuc25pdHQgYW5naXZldCBpICVzOiIKKworIzogZ2l0LWd1aS5zaDo2MjAKK21zZ2lkICJNYWluIEZvbnQiCittc2dzdHIgIkh1dnVkdGVja2Vuc25pdHQiCisKKyM6IGdpdC1ndWkuc2g6NjIxCittc2dpZCAiRGlmZi9Db25zb2xlIEZvbnQiCittc2dzdHIgIkRpZmYva29uc29sdGVja2Vuc25pdHQiCisKKyM6IGdpdC1ndWkuc2g6NjM1Cittc2dpZCAiQ2Fubm90IGZpbmQgZ2l0IGluIFBBVEguIgorbXNnc3RyICJIaXR0YXIgaW50ZSBnaXQgaSBQQVRILiIKKworIzogZ2l0LWd1aS5zaDo2NjIKK21zZ2lkICJDYW5ub3QgcGFyc2UgR2l0IHZlcnNpb24gc3RyaW5nOiIKK21zZ3N0ciAiS2FuIGludGUgdG9sa2EgdmVyc2lvbnNzdHLDpG5nIGZyw6VuIEdpdDoiCisKKyM6IGdpdC1ndWkuc2g6NjgwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIkdpdCB2ZXJzaW9uIGNhbm5vdCBiZSBkZXRlcm1pbmVkLlxuIgorIlxuIgorIiVzIGNsYWltcyBpdCBpcyB2ZXJzaW9uICclcycuXG4iCisiXG4iCisiJXMgcmVxdWlyZXMgYXQgbGVhc3QgR2l0IDEuNS4wIG9yIGxhdGVyLlxuIgorIlxuIgorIkFzc3VtZSAnJXMnIGlzIHZlcnNpb24gMS41LjA/XG4iCittc2dzdHIgIiIKKyJLYW4gaW50ZSBhdmfDtnJhIEdpdHMgdmVyc2lvbi5cbiIKKyJcbiIKKyIlcyBzw6RnZXIgYXR0IGRlc3MgdmVyc2lvbiDDpHIgXCIlc1wiLlxuIgorIlxuIgorIiVzIGtyw6R2ZXIgbWluc3QgR2l0IDEuNS4wIGVsbGVyIHNlbmFyZS5cbiIKKyJcbiIKKyJBbnRhIGF0dCBcIiVzXCIgw6RyIHZlcnNpb24gMS41LjA/XG4iCisKKyM6IGdpdC1ndWkuc2g6OTE4Cittc2dpZCAiR2l0IGRpcmVjdG9yeSBub3QgZm91bmQ6IgorbXNnc3RyICJHaXQta2F0YWxvZ2VuIGhpdHRhZGVzIGludGU6IgorCisjOiBnaXQtZ3VpLnNoOjkyNQorbXNnaWQgIkNhbm5vdCBtb3ZlIHRvIHRvcCBvZiB3b3JraW5nIGRpcmVjdG9yeToiCittc2dzdHIgIkthbiBpbnRlIGfDpSB0aWxsIGLDtnJqYW4gcMOlIGFyYmV0c2thdGFsb2dlbjoiCisKKyM6IGdpdC1ndWkuc2g6OTMyCittc2dpZCAiQ2Fubm90IHVzZSBmdW5ueSAuZ2l0IGRpcmVjdG9yeToiCittc2dzdHIgIkthbiBpbnRlIGFudsOkbmRhIHVuZGVybGlnIC5naXQta2F0YWxvZzoiCisKKyM6IGdpdC1ndWkuc2g6OTM3Cittc2dpZCAiTm8gd29ya2luZyBkaXJlY3RvcnkiCittc2dzdHIgIkluZ2VuIGFyYmV0c2thdGFsb2ciCisKKyM6IGdpdC1ndWkuc2g6MTA4NCBsaWIvY2hlY2tvdXRfb3AudGNsOjI4MworbXNnaWQgIlJlZnJlc2hpbmcgZmlsZSBzdGF0dXMuLi4iCittc2dzdHIgIlVwcGRhdGVyYXIgZmlsc3RhdHVzLi4uIgorCisjOiBnaXQtZ3VpLnNoOjExNDkKK21zZ2lkICJTY2FubmluZyBmb3IgbW9kaWZpZWQgZmlsZXMgLi4uIgorbXNnc3RyICJTw7ZrZXIgZWZ0ZXIgw6RuZHJhZGUgZmlsZXIuLi4iCisKKyM6IGdpdC1ndWkuc2g6MTMyNCBsaWIvYnJvd3Nlci50Y2w6MjQ2Cittc2dpZCAiUmVhZHkuIgorbXNnc3RyICJLbGFyLiIKKworIzogZ2l0LWd1aS5zaDoxNTkwCittc2dpZCAiVW5tb2RpZmllZCIKK21zZ3N0ciAiT2bDtnLDpG5kcmFkZSIKKworIzogZ2l0LWd1aS5zaDoxNTkyCittc2dpZCAiTW9kaWZpZWQsIG5vdCBzdGFnZWQiCittc2dzdHIgIkbDtnLDpG5kcmFkZSwgZWoga8O2YWRlIgorCisjOiBnaXQtZ3VpLnNoOjE1OTMgZ2l0LWd1aS5zaDoxNTk4Cittc2dpZCAiU3RhZ2VkIGZvciBjb21taXQiCittc2dzdHIgIkvDtmFkZSBmw7ZyIGluY2hlY2tuaW5nIgorCisjOiBnaXQtZ3VpLnNoOjE1OTQgZ2l0LWd1aS5zaDoxNTk5Cittc2dpZCAiUG9ydGlvbnMgc3RhZ2VkIGZvciBjb21taXQiCittc2dzdHIgIkRlbGFyIGvDtmFkZSBmw7ZyIGluY2hlY2tuaW5nIgorCisjOiBnaXQtZ3VpLnNoOjE1OTUgZ2l0LWd1aS5zaDoxNjAwCittc2dpZCAiU3RhZ2VkIGZvciBjb21taXQsIG1pc3NpbmciCittc2dzdHIgIkvDtmFkZSBmw7ZyIGluY2hlY2tuaW5nLCBzYWtuYWRlIgorCisjOiBnaXQtZ3VpLnNoOjE1OTcKK21zZ2lkICJVbnRyYWNrZWQsIG5vdCBzdGFnZWQiCittc2dzdHIgIkVqIHNww6VyYWRlLCBlaiBrw7ZhZGUiCisKKyM6IGdpdC1ndWkuc2g6MTYwMgorbXNnaWQgIk1pc3NpbmciCittc2dzdHIgIlNha25hZGUiCisKKyM6IGdpdC1ndWkuc2g6MTYwMworbXNnaWQgIlN0YWdlZCBmb3IgcmVtb3ZhbCIKK21zZ3N0ciAiS8O2YWRlIGbDtnIgYm9ydHRhZ25pbmciCisKKyM6IGdpdC1ndWkuc2g6MTYwNAorbXNnaWQgIlN0YWdlZCBmb3IgcmVtb3ZhbCwgc3RpbGwgcHJlc2VudCIKK21zZ3N0ciAiS8O2YWRlIGbDtnIgYm9ydHRhZ25pbmcsIGZvcnRmYXJhbmRlIG7DpHJ2YXJhbmRlIgorCisjOiBnaXQtZ3VpLnNoOjE2MDYgZ2l0LWd1aS5zaDoxNjA3IGdpdC1ndWkuc2g6MTYwOCBnaXQtZ3VpLnNoOjE2MDkKK21zZ2lkICJSZXF1aXJlcyBtZXJnZSByZXNvbHV0aW9uIgorbXNnc3RyICJLcsOkdmVyIGtvbmZsaWt0aGFudGVyaW5nIGVmdGVyIHNhbW1hbnNsYWduaW5nIgorCisjOiBnaXQtZ3VpLnNoOjE2NDQKK21zZ2lkICJTdGFydGluZyBnaXRrLi4uIHBsZWFzZSB3YWl0Li4uIgorbXNnc3RyICJTdGFydGFyIGdpdGsuLi4gdsOkbnRhLi4uIgorCisjOiBnaXQtZ3VpLnNoOjE2NTMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiVW5hYmxlIHRvIHN0YXJ0IGdpdGs6XG4iCisiXG4iCisiJXMgZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIiIKKyJLYW4gaW50ZSBzdGFydGEgZ2l0azpcbiIKKyJcbiIKKyIlcyBmaW5ucyBpbnRlIgorCisjOiBnaXQtZ3VpLnNoOjE4NjAgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozNgorbXNnaWQgIlJlcG9zaXRvcnkiCittc2dzdHIgIkFya2l2IgorCisjOiBnaXQtZ3VpLnNoOjE4NjEKK21zZ2lkICJFZGl0IgorbXNnc3RyICJSZWRpZ2VyYSIKKworIzogZ2l0LWd1aS5zaDoxODYzIGxpYi9jaG9vc2VfcmV2LnRjbDo1NjEKK21zZ2lkICJCcmFuY2giCittc2dzdHIgIkdyZW4iCisKKyM6IGdpdC1ndWkuc2g6MTg2NiBsaWIvY2hvb3NlX3Jldi50Y2w6NTQ4Cittc2dpZCAiQ29tbWl0QEBub3VuIgorbXNnc3RyICJJbmNoZWNrbmluZyIKKworIzogZ2l0LWd1aS5zaDoxODY5IGxpYi9tZXJnZS50Y2w6MTIwIGxpYi9tZXJnZS50Y2w6MTQ5IGxpYi9tZXJnZS50Y2w6MTY3Cittc2dpZCAiTWVyZ2UiCittc2dzdHIgIlNsw6UgaWhvcCIKKworIzogZ2l0LWd1aS5zaDoxODcwIGxpYi9jaG9vc2VfcmV2LnRjbDo1NTcKK21zZ2lkICJSZW1vdGUiCittc2dzdHIgIkZqw6RyciIKKworIzogZ2l0LWd1aS5zaDoxODc5Cittc2dpZCAiQnJvd3NlIEN1cnJlbnQgQnJhbmNoJ3MgRmlsZXMiCittc2dzdHIgIkJsw6RkZHJhIGkgZ3JlbmVucyBmaWxlciIKKworIzogZ2l0LWd1aS5zaDoxODgzCittc2dpZCAiQnJvd3NlIEJyYW5jaCBGaWxlcy4uLiIKK21zZ3N0ciAiQmzDpGRkcmEgZmlsZXIgcMOlIGdyZW4uLi4iCisKKyM6IGdpdC1ndWkuc2g6MTg4OAorbXNnaWQgIlZpc3VhbGl6ZSBDdXJyZW50IEJyYW5jaCdzIEhpc3RvcnkiCittc2dzdHIgIlZpc3VhbGlzZXJhIGdyZW5lbnMgaGlzdG9yaWsiCisKKyM6IGdpdC1ndWkuc2g6MTg5MgorbXNnaWQgIlZpc3VhbGl6ZSBBbGwgQnJhbmNoIEhpc3RvcnkiCittc2dzdHIgIlZpc3VhbGlzZXJhIGFsbGEgZ3JlbmFycyBoaXN0b3JpayIKKworIzogZ2l0LWd1aS5zaDoxODk5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQnJvd3NlICVzJ3MgRmlsZXMiCittc2dzdHIgIkJsw6RkZHJhIGkgZmlsZXIgZsO2ciAlcyIKKworIzogZ2l0LWd1aS5zaDoxOTAxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVmlzdWFsaXplICVzJ3MgSGlzdG9yeSIKK21zZ3N0ciAiVmlzdWFsaXNlcmEgaGlzdG9yaWsgZsO2ciAlcyIKKworIzogZ2l0LWd1aS5zaDoxOTA2IGxpYi9kYXRhYmFzZS50Y2w6MjcgbGliL2RhdGFiYXNlLnRjbDo2NworbXNnaWQgIkRhdGFiYXNlIFN0YXRpc3RpY3MiCittc2dzdHIgIkRhdGFiYXNzdGF0aXN0aWsiCisKKyM6IGdpdC1ndWkuc2g6MTkwOSBsaWIvZGF0YWJhc2UudGNsOjM0Cittc2dpZCAiQ29tcHJlc3MgRGF0YWJhc2UiCittc2dzdHIgIktvbXByaW1lcmEgZGF0YWJhcyIKKworIzogZ2l0LWd1aS5zaDoxOTEyCittc2dpZCAiVmVyaWZ5IERhdGFiYXNlIgorbXNnc3RyICJWZXJpZmllcmEgZGF0YWJhcyIKKworIzogZ2l0LWd1aS5zaDoxOTE5IGdpdC1ndWkuc2g6MTkyMyBnaXQtZ3VpLnNoOjE5MjcgbGliL3Nob3J0Y3V0LnRjbDo3CisjOiBsaWIvc2hvcnRjdXQudGNsOjM5IGxpYi9zaG9ydGN1dC50Y2w6NzEKK21zZ2lkICJDcmVhdGUgRGVza3RvcCBJY29uIgorbXNnc3RyICJTa2FwYSBza3JpdmJvcmRzaWtvbiIKKworIzogZ2l0LWd1aS5zaDoxOTMyIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTc3IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTg1Cittc2dpZCAiUXVpdCIKK21zZ3N0ciAiQXZzbHV0YSIKKworIzogZ2l0LWd1aS5zaDoxOTM5Cittc2dpZCAiVW5kbyIKK21zZ3N0ciAiw4VuZ3JhIgorCisjOiBnaXQtZ3VpLnNoOjE5NDIKK21zZ2lkICJSZWRvIgorbXNnc3RyICJHw7ZyIG9tIgorCisjOiBnaXQtZ3VpLnNoOjE5NDYgZ2l0LWd1aS5zaDoyNDQzCittc2dpZCAiQ3V0IgorbXNnc3RyICJLbGlwcCB1dCIKKworIzogZ2l0LWd1aS5zaDoxOTQ5IGdpdC1ndWkuc2g6MjQ0NiBnaXQtZ3VpLnNoOjI1MjAgZ2l0LWd1aS5zaDoyNjE0CisjOiBsaWIvY29uc29sZS50Y2w6NjkKK21zZ2lkICJDb3B5IgorbXNnc3RyICJLb3BpZXJhIgorCisjOiBnaXQtZ3VpLnNoOjE5NTIgZ2l0LWd1aS5zaDoyNDQ5Cittc2dpZCAiUGFzdGUiCittc2dzdHIgIktsaXN0cmEgaW4iCisKKyM6IGdpdC1ndWkuc2g6MTk1NSBnaXQtZ3VpLnNoOjI0NTIgbGliL2JyYW5jaF9kZWxldGUudGNsOjI2CisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjM4Cittc2dpZCAiRGVsZXRlIgorbXNnc3RyICJUYSBib3J0IgorCisjOiBnaXQtZ3VpLnNoOjE5NTkgZ2l0LWd1aS5zaDoyNDU2IGdpdC1ndWkuc2g6MjYxOCBsaWIvY29uc29sZS50Y2w6NzEKK21zZ2lkICJTZWxlY3QgQWxsIgorbXNnc3RyICJNYXJrZXJhIGFsbGEiCisKKyM6IGdpdC1ndWkuc2g6MTk2OAorbXNnaWQgIkNyZWF0ZS4uLiIKK21zZ3N0ciAiU2thcGEuLi4iCisKKyM6IGdpdC1ndWkuc2g6MTk3NAorbXNnaWQgIkNoZWNrb3V0Li4uIgorbXNnc3RyICJDaGVja2EgdXQuLi4iCisKKyM6IGdpdC1ndWkuc2g6MTk4MAorbXNnaWQgIlJlbmFtZS4uLiIKK21zZ3N0ciAiQnl0IG5hbW4uLi4iCisKKyM6IGdpdC1ndWkuc2g6MTk4NSBnaXQtZ3VpLnNoOjIwODUKK21zZ2lkICJEZWxldGUuLi4iCittc2dzdHIgIlRhIGJvcnQuLi4iCisKKyM6IGdpdC1ndWkuc2g6MTk5MAorbXNnaWQgIlJlc2V0Li4uIgorbXNnc3RyICLDhXRlcnN0w6RsbC4uLiIKKworIzogZ2l0LWd1aS5zaDoyMDAyIGdpdC1ndWkuc2g6MjM4OQorbXNnaWQgIk5ldyBDb21taXQiCittc2dzdHIgIk55IGluY2hlY2tuaW5nIgorCisjOiBnaXQtZ3VpLnNoOjIwMTAgZ2l0LWd1aS5zaDoyMzk2Cittc2dpZCAiQW1lbmQgTGFzdCBDb21taXQiCittc2dzdHIgIkzDpGdnIHRpbGwgZsO2cmVnw6VlbmRlIGluY2hlY2tuaW5nIgorCisjOiBnaXQtZ3VpLnNoOjIwMTkgZ2l0LWd1aS5zaDoyMzU2IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6OTkKK21zZ2lkICJSZXNjYW4iCittc2dzdHIgIlPDtmsgcMOlIG55dHQiCisKKyM6IGdpdC1ndWkuc2g6MjAyNQorbXNnaWQgIlN0YWdlIFRvIENvbW1pdCIKK21zZ3N0ciAiS8O2YSBmw7ZyIGluY2hlY2tuaW5nIgorCisjOiBnaXQtZ3VpLnNoOjIwMzEKK21zZ2lkICJTdGFnZSBDaGFuZ2VkIEZpbGVzIFRvIENvbW1pdCIKK21zZ3N0ciAiS8O2YSDDpG5kcmFkZSBmaWxlciBmw7ZyIGluY2hlY2tuaW5nIgorCisjOiBnaXQtZ3VpLnNoOjIwMzcKK21zZ2lkICJVbnN0YWdlIEZyb20gQ29tbWl0IgorbXNnc3RyICJUYSBib3J0IGZyw6VuIGluY2hlY2tuaW5nc2vDtiIKKworIzogZ2l0LWd1aS5zaDoyMDQyIGxpYi9pbmRleC50Y2w6Mzk1Cittc2dpZCAiUmV2ZXJ0IENoYW5nZXMiCittc2dzdHIgIsOFdGVyc3TDpGxsIMOkbmRyaW5nYXIiCisKKyM6IGdpdC1ndWkuc2g6MjA0OSBnaXQtZ3VpLnNoOjIzNjggZ2l0LWd1aS5zaDoyNDY3Cittc2dpZCAiU2lnbiBPZmYiCittc2dzdHIgIlNrcml2IHVuZGVyIgorCisjOiBnaXQtZ3VpLnNoOjIwNTMgZ2l0LWd1aS5zaDoyMzcyCittc2dpZCAiQ29tbWl0QEB2ZXJiIgorbXNnc3RyICJDaGVja2EgaW4iCisKKyM6IGdpdC1ndWkuc2g6MjA2NAorbXNnaWQgIkxvY2FsIE1lcmdlLi4uIgorbXNnc3RyICJMb2thbCBzYW1tYW5zbGFnbmluZy4uLiIKKworIzogZ2l0LWd1aS5zaDoyMDY5Cittc2dpZCAiQWJvcnQgTWVyZ2UuLi4iCittc2dzdHIgIkF2YnJ5dCBzYW1tYW5zbGFnbmluZy4uLiIKKworIzogZ2l0LWd1aS5zaDoyMDgxCittc2dpZCAiUHVzaC4uLiIKK21zZ3N0ciAiU8OkbmQuLi4iCisKKyM6IGdpdC1ndWkuc2g6MjA5MiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQxCittc2dpZCAiQXBwbGUiCittc2dzdHIgIsOEcHBsZSIKKworIzogZ2l0LWd1aS5zaDoyMDk1IGdpdC1ndWkuc2g6MjExNyBsaWIvYWJvdXQudGNsOjE0CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ0IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJBYm91dCAlcyIKK21zZ3N0ciAiT20gJXMiCisKKyM6IGdpdC1ndWkuc2g6MjA5OQorbXNnaWQgIlByZWZlcmVuY2VzLi4uIgorbXNnc3RyICJJbnN0w6RsbG5pbmdhci4uLiIKKworIzogZ2l0LWd1aS5zaDoyMTA3IGdpdC1ndWkuc2g6MjYzOQorbXNnaWQgIk9wdGlvbnMuLi4iCittc2dzdHIgIkFsdGVybmF0aXYuLi4iCisKKyM6IGdpdC1ndWkuc2g6MjExMyBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ3Cittc2dpZCAiSGVscCIKK21zZ3N0ciAiSGrDpGxwIgorCisjOiBnaXQtZ3VpLnNoOjIxNTQKK21zZ2lkICJPbmxpbmUgRG9jdW1lbnRhdGlvbiIKK21zZ3N0ciAiV2ViYmRva3VtZW50YXRpb24iCisKKyM6IGdpdC1ndWkuc2g6MjIzOAorIywgdGNsLWZvcm1hdAorbXNnaWQgImZhdGFsOiBjYW5ub3Qgc3RhdCBwYXRoICVzOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IgorbXNnc3RyICIiCisiw7ZkZXNkaWdlcnQ6IGt1bmRlIGludGUgdGEgc3RhdHVzIHDDpSBzw7ZrdsOkZ2VuICVzOiBGaWwgZWxsZXIga2F0YWxvZyBzYWtuYXMiCisKKyM6IGdpdC1ndWkuc2g6MjI3MQorbXNnaWQgIkN1cnJlbnQgQnJhbmNoOiIKK21zZ3N0ciAiQWt0dWVsbCBncmVuOiIKKworIzogZ2l0LWd1aS5zaDoyMjkyCittc2dpZCAiU3RhZ2VkIENoYW5nZXMgKFdpbGwgQ29tbWl0KSIKK21zZ3N0ciAiS8O2YWRlIMOkbmRyaW5nYXIgKGtvbW1lciBhdHQgY2hlY2thcyBpbikiCisKKyM6IGdpdC1ndWkuc2g6MjMxMgorbXNnaWQgIlVuc3RhZ2VkIENoYW5nZXMiCittc2dzdHIgIk9rw7ZhZGUgw6RuZHJpbmdhciIKKworIzogZ2l0LWd1aS5zaDoyMzYyCittc2dpZCAiU3RhZ2UgQ2hhbmdlZCIKK21zZ3N0ciAiS8O2YSDDpG5kcmFkZSIKKworIzogZ2l0LWd1aS5zaDoyMzc4IGxpYi90cmFuc3BvcnQudGNsOjkzIGxpYi90cmFuc3BvcnQudGNsOjE4MgorbXNnaWQgIlB1c2giCittc2dzdHIgIlPDpG5kIgorCisjOiBnaXQtZ3VpLnNoOjI0MDgKK21zZ2lkICJJbml0aWFsIENvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAiSW5sZWRhbmRlIGluY2hlY2tuaW5nc21lZGRlbGFuZGU6IgorCisjOiBnaXQtZ3VpLnNoOjI0MDkKK21zZ2lkICJBbWVuZGVkIENvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAiVXTDtmthdCBpbmNoZWNrbmluZ3NtZWRkZWxhbmRlOiIKKworIzogZ2l0LWd1aS5zaDoyNDEwCittc2dpZCAiQW1lbmRlZCBJbml0aWFsIENvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAiVXTDtmthdCBpbmxlZGFuZGUgaW5jaGVja25pbmdzbWVkZGVsYW5kZToiCisKKyM6IGdpdC1ndWkuc2g6MjQxMQorbXNnaWQgIkFtZW5kZWQgTWVyZ2UgQ29tbWl0IE1lc3NhZ2U6IgorbXNnc3RyICJVdMO2a2F0IGluY2hlY2tuaW5nc21lZGRlbGFuZGUgZsO2ciBzYW1tYW5zbGFnbmluZzoiCisKKyM6IGdpdC1ndWkuc2g6MjQxMgorbXNnaWQgIk1lcmdlIENvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAiSW5jaGVja25pbmdzbWVkZGVsYW5kZSBmw7ZyIHNhbW1hbnNsYWduaW5nOiIKKworIzogZ2l0LWd1aS5zaDoyNDEzCittc2dpZCAiQ29tbWl0IE1lc3NhZ2U6IgorbXNnc3RyICJJbmNoZWNrbmluZ3NtZWRkZWxhbmRlOiIKKworIzogZ2l0LWd1aS5zaDoyNDU5IGdpdC1ndWkuc2g6MjYyMiBsaWIvY29uc29sZS50Y2w6NzMKK21zZ2lkICJDb3B5IEFsbCIKK21zZ3N0ciAiS29waWVyYSBhbGxhIgorCisjOiBnaXQtZ3VpLnNoOjI0ODMgbGliL2JsYW1lLnRjbDoxMDcKK21zZ2lkICJGaWxlOiIKK21zZ3N0ciAiRmlsOiIKKworIzogZ2l0LWd1aS5zaDoyNTg5Cittc2dpZCAiQXBwbHkvUmV2ZXJzZSBIdW5rIgorbXNnc3RyICJBbnbDpG5kL8OldGVyc3TDpGxsIGRlbCIKKworIzogZ2l0LWd1aS5zaDoyNTk1Cittc2dpZCAiU2hvdyBMZXNzIENvbnRleHQiCittc2dzdHIgIlZpc2EgbWluZHJlIHNhbW1hbmhhbmciCisKKyM6IGdpdC1ndWkuc2g6MjYwMgorbXNnaWQgIlNob3cgTW9yZSBDb250ZXh0IgorbXNnc3RyICJWaXNhIG1lciBzYW1tYW5oYW5nIgorCisjOiBnaXQtZ3VpLnNoOjI2MTAKK21zZ2lkICJSZWZyZXNoIgorbXNnc3RyICJVcHBkYXRlcmEiCisKKyM6IGdpdC1ndWkuc2g6MjYzMQorbXNnaWQgIkRlY3JlYXNlIEZvbnQgU2l6ZSIKK21zZ3N0ciAiTWluc2thIHRlY2tlbnNuaXR0c3N0b3JsZWsiCisKKyM6IGdpdC1ndWkuc2g6MjYzNQorbXNnaWQgIkluY3JlYXNlIEZvbnQgU2l6ZSIKK21zZ3N0ciAiw5ZrYSB0ZWNrZW5zbml0dHNzdG9ybGVrIgorCisjOiBnaXQtZ3VpLnNoOjI2NDYKK21zZ2lkICJVbnN0YWdlIEh1bmsgRnJvbSBDb21taXQiCittc2dzdHIgIlRhIGJvcnQgZGVsIHVyIGluY2hlY2tuaW5nc2vDtiIKKworIzogZ2l0LWd1aS5zaDoyNjQ4Cittc2dpZCAiU3RhZ2UgSHVuayBGb3IgQ29tbWl0IgorbXNnc3RyICJTdMOkbGwgZGVsIGkgaW5jaGVja25pbmdza8O2IgorCisjOiBnaXQtZ3VpLnNoOjI2NjcKK21zZ2lkICJJbml0aWFsaXppbmcuLi4iCittc2dzdHIgIkluaXRpZXJhci4uLiIKKworIzogZ2l0LWd1aS5zaDoyNzYyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIlBvc3NpYmxlIGVudmlyb25tZW50IGlzc3VlcyBleGlzdC5cbiIKKyJcbiIKKyJUaGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgcHJvYmFibHlcbiIKKyJnb2luZyB0byBiZSBpZ25vcmVkIGJ5IGFueSBHaXQgc3VicHJvY2VzcyBydW5cbiIKKyJieSAlczpcbiIKKyJcbiIKK21zZ3N0ciAiIgorIkRldCBmaW5ucyBtw7ZqbGlnYSBwcm9ibGVtIG1lZCBtaWxqw7Z2YXJpYWJsZXIuXG4iCisiXG4iCisiRsO2bGphbmRlIG1pbGrDtnZhcmlhYmxlciBrb21tZXIgdHJvbGlnZW4gYXR0XG4iCisiaWdub3JlcmFzIGF2IGFsbGEgR2l0LXVuZGVycHJvY2Vzc2VyIHNvbSBrw7Zyc1xuIgorImF2ICVzOlxuIgorIlxuIgorCisjOiBnaXQtZ3VpLnNoOjI3OTIKK21zZ2lkICIiCisiXG4iCisiVGhpcyBpcyBkdWUgdG8gYSBrbm93biBpc3N1ZSB3aXRoIHRoZVxuIgorIlRjbCBiaW5hcnkgZGlzdHJpYnV0ZWQgYnkgQ3lnd2luLiIKK21zZ3N0ciAiIgorIlxuIgorIkRldHRhIGJlcm9yIHDDpSBldHQga8OkbnQgcHJvYmxlbSBtZWRcbiIKKyJUY2wtYmluw6RyZW4gc29tIGbDtmxqZXIgbWVkIEN5Z3dpbi4iCisKKyM6IGdpdC1ndWkuc2g6Mjc5NworIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJcbiIKKyJBIGdvb2QgcmVwbGFjZW1lbnQgZm9yICVzXG4iCisiaXMgcGxhY2luZyB2YWx1ZXMgZm9yIHRoZSB1c2VyLm5hbWUgYW5kXG4iCisidXNlci5lbWFpbCBzZXR0aW5ncyBpbnRvIHlvdXIgcGVyc29uYWxcbiIKKyJ+Ly5naXRjb25maWcgZmlsZS5cbiIKK21zZ3N0ciAiIgorIlxuIgorIlxuIgorIkR1IGthbiBlcnPDpHR0YSAlc1xuIgorIm1lZCBhdHQgbMOkZ2dhIGluIHbDpHJkZW4gZsO2ciBpbnN0w6RsbG5pbmdhcm5hXG4iCisidXNlci5uYW1lIG9jaCB1c2VyLmVtYWlsIGkgZGluIHBlcnNvbmxpZ2FcbiIKKyJ+Ly5naXRjb25maWctZmlsLlxuIgorCisjOiBsaWIvYWJvdXQudGNsOjI2Cittc2dpZCAiZ2l0LWd1aSAtIGEgZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlIGZvciBHaXQuIgorbXNnc3RyICJnaXQtZ3VpIC0gZXR0IGdyYWZpc2t0IGFudsOkbmRhcmdyw6Ruc3NuaXR0IGbDtnIgR2l0LiIKKworIzogbGliL2JsYW1lLnRjbDo3NworbXNnaWQgIkZpbGUgVmlld2VyIgorbXNnc3RyICJGaWx2aXNhcmUiCisKKyM6IGxpYi9ibGFtZS50Y2w6ODEKK21zZ2lkICJDb21taXQ6IgorbXNnc3RyICJJbmNoZWNrbmluZzoiCisKKyM6IGxpYi9ibGFtZS50Y2w6MjY0Cittc2dpZCAiQ29weSBDb21taXQiCittc2dzdHIgIktvcGllcmEgaW5jaGVja25pbmciCisKKyM6IGxpYi9ibGFtZS50Y2w6Mzg0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUmVhZGluZyAlcy4uLiIKK21zZ3N0ciAiTMOkc2VyICVzLi4uIgorCisjOiBsaWIvYmxhbWUudGNsOjQ4OAorbXNnaWQgIkxvYWRpbmcgY29weS9tb3ZlIHRyYWNraW5nIGFubm90YXRpb25zLi4uIgorbXNnc3RyICJMw6RzZXIgYW5ub3RlcmluZ2FyIGbDtnIga29waWVyaW5nL2ZseXR0bmluZy4uLiIKKworIzogbGliL2JsYW1lLnRjbDo1MDgKK21zZ2lkICJsaW5lcyBhbm5vdGF0ZWQiCittc2dzdHIgInJhZGVyIGFubm90ZXJhZGUiCisKKyM6IGxpYi9ibGFtZS50Y2w6Njg5Cittc2dpZCAiTG9hZGluZyBvcmlnaW5hbCBsb2NhdGlvbiBhbm5vdGF0aW9ucy4uLiIKK21zZ3N0ciAiTMOkc2VyIGluIGFubm90ZXJpbmcgYXYgb3JpZ2luYWxwbGFjZXJpbmcuLi4iCisKKyM6IGxpYi9ibGFtZS50Y2w6NjkyCittc2dpZCAiQW5ub3RhdGlvbiBjb21wbGV0ZS4iCittc2dzdHIgIkFubm90ZXJpbmcgZnVsbGJvcmRhZC4iCisKKyM6IGxpYi9ibGFtZS50Y2w6NzQ2Cittc2dpZCAiTG9hZGluZyBhbm5vdGF0aW9uLi4uIgorbXNnc3RyICJMw6RzZXIgaW4gYW5ub3RlcmluZy4uLiIKKworIzogbGliL2JsYW1lLnRjbDo4MDIKK21zZ2lkICJBdXRob3I6IgorbXNnc3RyICJGw7ZyZmF0dGFyZToiCisKKyM6IGxpYi9ibGFtZS50Y2w6ODA2Cittc2dpZCAiQ29tbWl0dGVyOiIKK21zZ3N0ciAiSW5jaGVja2FyZToiCisKKyM6IGxpYi9ibGFtZS50Y2w6ODExCittc2dpZCAiT3JpZ2luYWwgRmlsZToiCittc2dzdHIgIlVyc3BydW5nbGlnIGZpbDoiCisKKyM6IGxpYi9ibGFtZS50Y2w6OTI1Cittc2dpZCAiT3JpZ2luYWxseSBCeToiCittc2dzdHIgIlVyc3BydW5nbGlnZW4gYXY6IgorCisjOiBsaWIvYmxhbWUudGNsOjkzMQorbXNnaWQgIkluIEZpbGU6IgorbXNnc3RyICJJIGZpbGVuOiIKKworIzogbGliL2JsYW1lLnRjbDo5MzYKK21zZ2lkICJDb3BpZWQgT3IgTW92ZWQgSGVyZSBCeToiCittc2dzdHIgIktvcGllcmFkIGVsbGVyIGZseXR0YWQgaGl0IGF2OiIKKworIzogbGliL2JyYW5jaF9jaGVja291dC50Y2w6MTQgbGliL2JyYW5jaF9jaGVja291dC50Y2w6MTkKK21zZ2lkICJDaGVja291dCBCcmFuY2giCittc2dzdHIgIkNoZWNrYSB1dCBncmVuIgorCisjOiBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDoyMworbXNnaWQgIkNoZWNrb3V0IgorbXNnc3RyICJDaGVja2EgdXQiCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjI3IGxpYi9icmFuY2hfY3JlYXRlLnRjbDozNQorIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjMyIGxpYi9icmFuY2hfcmVuYW1lLnRjbDozMCBsaWIvYnJvd3Nlci50Y2w6MjgyCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjUyMiBsaWIvY2hvb3NlX2ZvbnQudGNsOjQzIGxpYi9tZXJnZS50Y2w6MTcxCisjOiBsaWIvb3B0aW9uLnRjbDoxMDMgbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDo0MiBsaWIvdHJhbnNwb3J0LnRjbDo5NworbXNnaWQgIkNhbmNlbCIKK21zZ3N0ciAiQXZicnl0IgorCisjOiBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDozMiBsaWIvYnJvd3Nlci50Y2w6Mjg3Cittc2dpZCAiUmV2aXNpb24iCittc2dzdHIgIlJldmlzaW9uIgorCisjOiBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDozNiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NjkgbGliL29wdGlvbi50Y2w6MjQyCittc2dpZCAiT3B0aW9ucyIKK21zZ3N0ciAiQWx0ZXJuYXRpdiIKKworIzogbGliL2JyYW5jaF9jaGVja291dC50Y2w6MzkgbGliL2JyYW5jaF9jcmVhdGUudGNsOjkyCittc2dpZCAiRmV0Y2ggVHJhY2tpbmcgQnJhbmNoIgorbXNnc3RyICJIw6RtdGEgc3DDpXJhbmRlIGdyZW4iCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjQ0Cittc2dpZCAiRGV0YWNoIEZyb20gTG9jYWwgQnJhbmNoIgorbXNnc3RyICJLb3BwbGEgYm9ydCBmcsOlbiBsb2thbCBncmVuIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MjIKK21zZ2lkICJDcmVhdGUgQnJhbmNoIgorbXNnc3RyICJTa2FwYSBncmVuIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MjcKK21zZ2lkICJDcmVhdGUgTmV3IEJyYW5jaCIKK21zZ3N0ciAiU2thcGEgbnkgZ3JlbiIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjMxIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MzcxCittc2dpZCAiQ3JlYXRlIgorbXNnc3RyICJTa2FwYSIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjQwCittc2dpZCAiQnJhbmNoIE5hbWUiCittc2dzdHIgIk5hbW4gcMOlIGdyZW4iCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo0MworbXNnaWQgIk5hbWU6IgorbXNnc3RyICJOYW1uOiIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjU4Cittc2dpZCAiTWF0Y2ggVHJhY2tpbmcgQnJhbmNoIE5hbWUiCittc2dzdHIgIkFudsOkbmQgbmFtbiBww6Ugc3DDpXJhZCBncmVuIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NjYKK21zZ2lkICJTdGFydGluZyBSZXZpc2lvbiIKK21zZ3N0ciAiSW5sZWRhbmRlIHJldmlzaW9uIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NzIKK21zZ2lkICJVcGRhdGUgRXhpc3RpbmcgQnJhbmNoOiIKK21zZ3N0ciAiVXBwZGF0ZXJhIGJlZmludGxpZyBncmVuOiIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjc1Cittc2dpZCAiTm8iCittc2dzdHIgIk5laiIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjgwCittc2dpZCAiRmFzdCBGb3J3YXJkIE9ubHkiCittc2dzdHIgIkVuZGFzdCBzbmFiYnNwb2xuaW5nIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6ODUgbGliL2NoZWNrb3V0X29wLnRjbDo1MTQKK21zZ2lkICJSZXNldCIKK21zZ3N0ciAiw4V0ZXJzdMOkbGwiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo5NworbXNnaWQgIkNoZWNrb3V0IEFmdGVyIENyZWF0aW9uIgorbXNnc3RyICJDaGVja2EgdXQgbsOkciBza2FwYWQiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDoxMzEKK21zZ2lkICJQbGVhc2Ugc2VsZWN0IGEgdHJhY2tpbmcgYnJhbmNoLiIKK21zZ3N0ciAiVsOkbGogZW4gZ3JlbiBhdHQgc3DDpXJhLiIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjE0MAorIywgdGNsLWZvcm1hdAorbXNnaWQgIlRyYWNraW5nIGJyYW5jaCAlcyBpcyBub3QgYSBicmFuY2ggaW4gdGhlIHJlbW90ZSByZXBvc2l0b3J5LiIKK21zZ3N0ciAiRGVuIHNww6VyYWRlIGdyZW5lbiAlcyDDpHIgaW50ZSBlbiBncmVuIGkgZmrDpHJyYXJraXZldC4iCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDoxNTMgbGliL2JyYW5jaF9yZW5hbWUudGNsOjg2Cittc2dpZCAiUGxlYXNlIHN1cHBseSBhIGJyYW5jaCBuYW1lLiIKK21zZ3N0ciAiQW5nZSBldHQgbmFtbiBmw7ZyIGdyZW5lbi4iCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDoxNjQgbGliL2JyYW5jaF9yZW5hbWUudGNsOjEwNgorIywgdGNsLWZvcm1hdAorbXNnaWQgIiclcycgaXMgbm90IGFuIGFjY2VwdGFibGUgYnJhbmNoIG5hbWUuIgorbXNnc3RyICJcIiVzXCIga2FuIGludGUgYW52w6RuZGFzIHNvbSBuYW1uIHDDpSBncmVuZW4uIgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MTUKK21zZ2lkICJEZWxldGUgQnJhbmNoIgorbXNnc3RyICJUYSBib3J0IGdyZW4iCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDoyMAorbXNnaWQgIkRlbGV0ZSBMb2NhbCBCcmFuY2giCittc2dzdHIgIlRhIGJvcnQgbG9rYWwgZ3JlbiIKKworIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjM3Cittc2dpZCAiTG9jYWwgQnJhbmNoZXMiCittc2dzdHIgIkxva2FsYSBncmVuYXIiCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDo1MgorbXNnaWQgIkRlbGV0ZSBPbmx5IElmIE1lcmdlZCBJbnRvIgorbXNnc3RyICJUYSBiYXJhIGJvcnQgb20gc2FtbWFuc2xhZ2VuIG1lZCIKKworIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjU0Cittc2dpZCAiQWx3YXlzIChEbyBub3QgcGVyZm9ybSBtZXJnZSB0ZXN0LikiCittc2dzdHIgIkFsbHRpZCAodXRmw7ZyIGludGUgc2FtbWFuc2xhZ25pbmdzdGVzdCkuIgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MTAzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVGhlIGZvbGxvd2luZyBicmFuY2hlcyBhcmUgbm90IGNvbXBsZXRlbHkgbWVyZ2VkIGludG8gJXM6IgorbXNnc3RyICJGw7ZsamFuZGUgZ3JlbmFyIMOkciBpbnRlIHRpbGwgZnVsbG8gc2FtbWFuc2xhZ25hIG1lZCAlczoiCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDoxMTUKK21zZ2lkICIiCisiUmVjb3ZlcmluZyBkZWxldGVkIGJyYW5jaGVzIGlzIGRpZmZpY3VsdC4gXG4iCisiXG4iCisiIERlbGV0ZSB0aGUgc2VsZWN0ZWQgYnJhbmNoZXM/IgorbXNnc3RyICIiCisiRGV0IMOkciBzdsOlcnQgYXR0IMOldGVyc3TDpGxsYSBib3J0dGFnbmEgZ3JlbmFyLlxuIgorIlxuIgorIiBUYSBib3J0IHZhbGRhIGdyZW5hcj8iCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDoxNDEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGRlbGV0ZSBicmFuY2hlczpcbiIKKyIlcyIKK21zZ3N0ciAiIgorIkt1bmRlIGludGUgdGEgYm9ydCBncmVuYXI6XG4iCisiJXMiCisKKyM6IGxpYi9icmFuY2hfcmVuYW1lLnRjbDoxNCBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MjIKK21zZ2lkICJSZW5hbWUgQnJhbmNoIgorbXNnc3RyICJCeXQgbmFtbiBww6UgZ3JlbiIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjI2Cittc2dpZCAiUmVuYW1lIgorbXNnc3RyICJCeXQgbmFtbiIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjM2Cittc2dpZCAiQnJhbmNoOiIKK21zZ3N0ciAiR3JlbjoiCisKKyM6IGxpYi9icmFuY2hfcmVuYW1lLnRjbDozOQorbXNnaWQgIk5ldyBOYW1lOiIKK21zZ3N0ciAiTnl0dCBuYW1uOiIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjc1Cittc2dpZCAiUGxlYXNlIHNlbGVjdCBhIGJyYW5jaCB0byByZW5hbWUuIgorbXNnc3RyICJWw6RsaiBlbiBncmVuIGF0dCBieXRhIG5hbW4gcMOlLiIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjk2IGxpYi9jaGVja291dF9vcC50Y2w6MTc5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQnJhbmNoICclcycgYWxyZWFkeSBleGlzdHMuIgorbXNnc3RyICJHcmVuZW4gXCIlc1wiIGZpbm5zIHJlZGFuLiIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjExNworIywgdGNsLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byByZW5hbWUgJyVzJy4iCittc2dzdHIgIkt1bmRlIGludGUgYnl0YSBuYW1uIHDDpSBcIiVzXCIuIgorCisjOiBsaWIvYnJvd3Nlci50Y2w6MTcKK21zZ2lkICJTdGFydGluZy4uLiIKK21zZ3N0ciAiU3RhcnRhci4uLiIKKworIzogbGliL2Jyb3dzZXIudGNsOjI2Cittc2dpZCAiRmlsZSBCcm93c2VyIgorbXNnc3RyICJGaWxibMOkZGRyYXJlIgorCisjOiBsaWIvYnJvd3Nlci50Y2w6MTI2IGxpYi9icm93c2VyLnRjbDoxNDMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJMb2FkaW5nICVzLi4uIgorbXNnc3RyICJMw6RzZXIgJXMuLi4iCisKKyM6IGxpYi9icm93c2VyLnRjbDoxODcKK21zZ2lkICJbVXAgVG8gUGFyZW50XSIKK21zZ3N0ciAiW1VwcCB0aWxsIGbDtnLDpGxkZXJdIgorCisjOiBsaWIvYnJvd3Nlci50Y2w6MjY3IGxpYi9icm93c2VyLnRjbDoyNzMKK21zZ2lkICJCcm93c2UgQnJhbmNoIEZpbGVzIgorbXNnc3RyICJCbMOkZGRyYSBmaWxlciBww6UgZ3JlbmVuIgorCisjOiBsaWIvYnJvd3Nlci50Y2w6Mjc4IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6Mzg3CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ3NCBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ4NAorIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5ODcKK21zZ2lkICJCcm93c2UiCittc2dzdHIgIkJsw6RkZHJhIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjc5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRmV0Y2hpbmcgJXMgZnJvbSAlcyIKK21zZ3N0ciAiSMOkbXRhciAlcyBmcsOlbiAlcyIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoxMjcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJmYXRhbDogQ2Fubm90IHJlc29sdmUgJXMiCittc2dzdHIgIsO2ZGVzZGlnZXJ0OiBLdW5kZSBpbnRlIHNsw6UgdXBwICVzIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjE0MCBsaWIvY29uc29sZS50Y2w6ODEgbGliL2RhdGFiYXNlLnRjbDozMQorbXNnaWQgIkNsb3NlIgorbXNnc3RyICJTdMOkbmciCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MTY5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQnJhbmNoICclcycgZG9lcyBub3QgZXhpc3QuIgorbXNnc3RyICJHcmVuZW4gXCIlc1wiIGZpbm5zIGludGUuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjIwNgorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJCcmFuY2ggJyVzJyBhbHJlYWR5IGV4aXN0cy5cbiIKKyJcbiIKKyJJdCBjYW5ub3QgZmFzdC1mb3J3YXJkIHRvICVzLlxuIgorIkEgbWVyZ2UgaXMgcmVxdWlyZWQuIgorbXNnc3RyICIiCisiR3JlbmVuIFwiJXNcIiBmaW5ucyByZWRhbi5cbiIKKyJcbiIKKyJEZW4ga2FuIGludGUgc25hYmJzcG9sYXMgdGlsbCAlcy5cbiIKKyJFbiBzYW1tYW5zbGFnbmluZyBrcsOkdnMuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjIyMAorIywgdGNsLWZvcm1hdAorbXNnaWQgIk1lcmdlIHN0cmF0ZWd5ICclcycgbm90IHN1cHBvcnRlZC4iCittc2dzdHIgIlNhbW1hbnNsYWduaW5nc3N0cmF0ZWdpbiBcIiVzXCIgc3TDtmRzIGludGUuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjIzOQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byB1cGRhdGUgJyVzJy4iCittc2dzdHIgIk1pc3NseWNrYWRlcyBtZWQgYXR0IHVwcGRhdGVyYSBcIiVzXCIuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjI1MQorbXNnaWQgIlN0YWdpbmcgYXJlYSAoaW5kZXgpIGlzIGFscmVhZHkgbG9ja2VkLiIKK21zZ3N0ciAiS8O2b21yw6VkZXQgKGluZGV4KSDDpHIgcmVkYW4gbMOlc3QuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjI2NgorbXNnaWQgIiIKKyJMYXN0IHNjYW5uZWQgc3RhdGUgZG9lcyBub3QgbWF0Y2ggcmVwb3NpdG9yeSBzdGF0ZS5cbiIKKyJcbiIKKyJBbm90aGVyIEdpdCBwcm9ncmFtIGhhcyBtb2RpZmllZCB0aGlzIHJlcG9zaXRvcnkgc2luY2UgdGhlIGxhc3Qgc2Nhbi4gIEEgIgorInJlc2NhbiBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlIGN1cnJlbnQgYnJhbmNoIGNhbiBiZSBjaGFuZ2VkLlxuIgorIlxuIgorIlRoZSByZXNjYW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgbm93LlxuIgorbXNnc3RyICIiCisiRGV0IHNlbmFzdGUgaW5sw6RzdGEgdGlsbHN0w6VuZGV0IG1vdHN2YXJhciBpbnRlIHRpbGxzdMOlbmRldCBpIGFya2l2ZXQuXG4iCisiXG4iCisiRXR0IGFubmF0IEdpdC1wcm9ncmFtIGhhciDDpG5kcmF0IGFya2l2ZXQgc2VkYW4gc2VuYXN0ZSBhdnPDtmtuaW5nZW4uIER1IG3DpXN0ZSAiCisidXRmw7ZyYSBlbiBueSBzw7ZrbmluZyBpbm5hbiBkZW4gYWt0dWVsbGEgZ3JlbmVuIGthbiDDpG5kcmFzLlxuIgorIlxuIgorIlPDtmtuaW5nZW4ga29tbWVyIGF0dCBzdGFydGFzIGF1dG9tYXRpc2t0IG51LlxuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjMyMgorIywgdGNsLWZvcm1hdAorbXNnaWQgIlVwZGF0aW5nIHdvcmtpbmcgZGlyZWN0b3J5IHRvICclcycuLi4iCittc2dzdHIgIlVwcGRhdGVyYXIgYXJiZXRza2F0YWxvZ2VuIHRpbGwgXCIlc1wiLi4uIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjMyMworbXNnaWQgImZpbGVzIGNoZWNrZWQgb3V0IgorbXNnc3RyICJmaWxlciB1dGNoZWNrYWRlIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjM1MworIywgdGNsLWZvcm1hdAorbXNnaWQgIkFib3J0ZWQgY2hlY2tvdXQgb2YgJyVzJyAoZmlsZSBsZXZlbCBtZXJnaW5nIGlzIHJlcXVpcmVkKS4iCittc2dzdHIgIkF2YnJ5dGVyIHV0Y2hlY2tuaW5nIGF2IFwiJXNcIiAoc2FtbWFuc2xhZ25pbmcgcMOlIGZpbG5pdsOlIGtyw6R2cykuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjM1NAorbXNnaWQgIkZpbGUgbGV2ZWwgbWVyZ2UgcmVxdWlyZWQuIgorbXNnc3RyICJTYW1tYW5zbGFnbmluZyBww6UgZmlsbml2w6Uga3LDpHZzLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDozNTgKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJTdGF5aW5nIG9uIGJyYW5jaCAnJXMnLiIKK21zZ3N0ciAiU3Rhbm5hciBww6UgZ3JlbmVuIFwiJXNcIi4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NDI5Cittc2dpZCAiIgorIllvdSBhcmUgbm8gbG9uZ2VyIG9uIGEgbG9jYWwgYnJhbmNoLlxuIgorIlxuIgorIklmIHlvdSB3YW50ZWQgdG8gYmUgb24gYSBicmFuY2gsIGNyZWF0ZSBvbmUgbm93IHN0YXJ0aW5nIGZyb20gJ1RoaXMgRGV0YWNoZWQgIgorIkNoZWNrb3V0Jy4iCittc2dzdHIgIiIKKyJEdSDDpHIgaW50ZSBsw6RuZ3JlIHDDpSBlbiBsb2thbCBncmVuLlxuIgorIlxuIgorIk9tIGR1IHZpbGxlIHZhcmEgcMOlIGVuIGdyZW4gc2thcGFyIGR1IGVuIG51LCBiYXNlcmFkIHDDpSBcIkRlbm5hIGZyw6Vua29wcGxhZGUgIgorInV0Y2hlY2tuaW5nXCIuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjQ0NiBsaWIvY2hlY2tvdXRfb3AudGNsOjQ1MAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkNoZWNrZWQgb3V0ICclcycuIgorbXNnc3RyICJDaGVja2FkZSB1dCBcIiVzXCIuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjQ3OAorIywgdGNsLWZvcm1hdAorbXNnaWQgIlJlc2V0dGluZyAnJXMnIHRvICclcycgd2lsbCBsb3NlIHRoZSBmb2xsb3dpbmcgY29tbWl0czoiCittc2dzdHIgIiIKKyJPbSBkdSDDpXRlcnN0w6RsbGVyIFwiJXNcIiB0aWxsIFwiJXNcIiBnw6VyIGbDtmxqYW5kZSBpbmNoZWNrbmluZ2FyIGbDtnJsb3JhZGU6IgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjUwMAorbXNnaWQgIlJlY292ZXJpbmcgbG9zdCBjb21taXRzIG1heSBub3QgYmUgZWFzeS4iCittc2dzdHIgIkRldCBrYW5za2UgaW50ZSDDpHIgc8OlIGVua2VsdCBhdHQgw6V0ZXJza2FwYSBmw7ZybG9yYWRlIGluY2hlY2tuaW5nYXIuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjUwNQorIywgdGNsLWZvcm1hdAorbXNnaWQgIlJlc2V0ICclcyc/IgorbXNnc3RyICLDhXRlcnN0w6RsbGEgXCIlc1wiPyIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDo1MTAgbGliL21lcmdlLnRjbDoxNjMKK21zZ2lkICJWaXN1YWxpemUiCittc2dzdHIgIlZpc3VhbGlzZXJhIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjU3OAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgYnJhbmNoLlxuIgorIlxuIgorIlRoaXMgd29ya2luZyBkaXJlY3RvcnkgaXMgb25seSBwYXJ0aWFsbHkgc3dpdGNoZWQuICBXZSBzdWNjZXNzZnVsbHkgdXBkYXRlZCAiCisieW91ciBmaWxlcywgYnV0IGZhaWxlZCB0byB1cGRhdGUgYW4gaW50ZXJuYWwgR2l0IGZpbGUuXG4iCisiXG4iCisiVGhpcyBzaG91bGQgbm90IGhhdmUgb2NjdXJyZWQuICAlcyB3aWxsIG5vdyBjbG9zZSBhbmQgZ2l2ZSB1cC4iCittc2dzdHIgIiIKKyJLdW5kZSBpbnRlIHN0w6RsbGEgaW4gYWt0dWVsbCBncmVuLlxuIgorIlxuIgorIkFyYmV0c2thdGFsb2dlbiBoYXIgYmFyYSB2w6R4bGF0cyBkZWx2aXMuIFZpIHVwcGRhdGVyYWRlIGZpbGVybmEgdXRhbiAiCisicHJvYmxlbSwgbWVuIGt1bmRlIGludGUgdXBwZGF0ZXJhIGVuIGludGVybiBmaWwgaSBHaXQuXG4iCisiXG4iCisiRGV0dGEgc2t1bGxlIGludGUgaGEgaMOkbnQuICVzIGtvbW1lciBudSBzdMOkbmdhcyBvY2ggZ2UgdXBwLiIKKworIzogbGliL2Nob29zZV9mb250LnRjbDozOQorbXNnaWQgIlNlbGVjdCIKK21zZ3N0ciAiVsOkbGoiCisKKyM6IGxpYi9jaG9vc2VfZm9udC50Y2w6NTMKK21zZ2lkICJGb250IEZhbWlseSIKK21zZ3N0ciAiVGVja2Vuc25pdHRzZmFtaWxqIgorCisjOiBsaWIvY2hvb3NlX2ZvbnQudGNsOjc0Cittc2dpZCAiRm9udCBTaXplIgorbXNnc3RyICJTdG9ybGVrIgorCisjOiBsaWIvY2hvb3NlX2ZvbnQudGNsOjkxCittc2dpZCAiRm9udCBFeGFtcGxlIgorbXNnc3RyICJFeGVtcGVsIgorCisjOiBsaWIvY2hvb3NlX2ZvbnQudGNsOjEwMworbXNnaWQgIiIKKyJUaGlzIGlzIGV4YW1wbGUgdGV4dC5cbiIKKyJJZiB5b3UgbGlrZSB0aGlzIHRleHQsIGl0IGNhbiBiZSB5b3VyIGZvbnQuIgorbXNnc3RyICIiCisiRGV0dGEgw6RyIGVuIGV4ZW1wZWx0ZXh0LlxuIgorIk9tIGR1IHR5Y2tlciBvbSBkZW4gaMOkciB0ZXh0ZW4ga2FuIGRlbiB2YXJhIGRpdHQgdGVja2Vuc25pdHQuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjI4Cittc2dpZCAiR2l0IEd1aSIKK21zZ3N0ciAiR2l0IEd1aSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo4MSBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjM3NgorbXNnaWQgIkNyZWF0ZSBOZXcgUmVwb3NpdG9yeSIKK21zZ3N0ciAiU2thcGEgbnl0dCBhcmtpdiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo4NworbXNnaWQgIk5ldy4uLiIKK21zZ3N0ciAiTnl0dC4uLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5NCBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ2MAorbXNnaWQgIkNsb25lIEV4aXN0aW5nIFJlcG9zaXRvcnkiCittc2dzdHIgIktsb25hIGJlZmludGxpZ3QgYXJraXYiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTAwCittc2dpZCAiQ2xvbmUuLi4iCittc2dzdHIgIktsb25hLi4uIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEwNyBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjk3NgorbXNnaWQgIk9wZW4gRXhpc3RpbmcgUmVwb3NpdG9yeSIKK21zZ3N0ciAiw5ZwcG5hIGJlZmludGxpZ3QgYXJraXYiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTEzCittc2dpZCAiT3Blbi4uLiIKK21zZ3N0ciAiw5ZwcG5hLi4uIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEyNgorbXNnaWQgIlJlY2VudCBSZXBvc2l0b3JpZXMiCittc2dzdHIgIlNlbmFzdGUgYXJraXZlbiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMzIKK21zZ2lkICJPcGVuIFJlY2VudCBSZXBvc2l0b3J5OiIKK21zZ3N0ciAiw5ZwcG5hIHRpZGlnYXJlIGFya2l2OiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoyOTYgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozMDMKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MzEwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNyZWF0ZSByZXBvc2l0b3J5ICVzOiIKK21zZ3N0ciAiS3VuZGUgaW50ZSBza2FwYSBhcmtpdmV0ICVzOiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozODEgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NzgKK21zZ2lkICJEaXJlY3Rvcnk6IgorbXNnc3RyICJLYXRhbG9nOiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0MTIgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1MzcKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTAxMQorbXNnaWQgIkdpdCBSZXBvc2l0b3J5IgorbXNnc3RyICJHaXRhcmtpdiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0MzcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJEaXJlY3RvcnkgJXMgYWxyZWFkeSBleGlzdHMuIgorbXNnc3RyICJLYXRhbG9nZW4gJXMgZmlubnMgcmVkYW4uIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ0MQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkZpbGUgJXMgYWxyZWFkeSBleGlzdHMuIgorbXNnc3RyICJGaWxlbiAlcyBmaW5ucyByZWRhbi4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDU1Cittc2dpZCAiQ2xvbmUiCittc2dzdHIgIktsb25hIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ2OAorbXNnaWQgIlVSTDoiCittc2dzdHIgIldlYmJhZHJlc3M6IgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ4OQorbXNnaWQgIkNsb25lIFR5cGU6IgorbXNnc3RyICJUeXAgYXYga2xvbjoiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDk1Cittc2dpZCAiU3RhbmRhcmQgKEZhc3QsIFNlbWktUmVkdW5kYW50LCBIYXJkbGlua3MpIgorbXNnc3RyICJTdGFuZGFyZCAoc25hYmIsIHNlbWlyZWR1bmRhbnQsIGjDpXJkYSBsw6Rua2FyKSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1MDEKK21zZ2lkICJGdWxsIENvcHkgKFNsb3dlciwgUmVkdW5kYW50IEJhY2t1cCkiCittc2dzdHIgIkZ1bGwga29waWEgKGzDpW5nc2FtbWFyZSwgcmVkdW5kYW50IHPDpGtlcmhldHNrb3BpYSkiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTA3Cittc2dpZCAiU2hhcmVkIChGYXN0ZXN0LCBOb3QgUmVjb21tZW5kZWQsIE5vIEJhY2t1cCkiCittc2dzdHIgIkRlbGFkIChzbmFiYmFzdCwgcmVrb21tZW5kZXJhcyBlaiwgaW5nZW4gc8Oka2VyaGV0c2tvcGlhKSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1NDMgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1OTAKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzM2IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODA2CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEwMTcgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMDI1CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiTm90IGEgR2l0IHJlcG9zaXRvcnk6ICVzIgorbXNnc3RyICJJbnRlIGV0dCBHaXRhcmtpdjogJXMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTc5Cittc2dpZCAiU3RhbmRhcmQgb25seSBhdmFpbGFibGUgZm9yIGxvY2FsIHJlcG9zaXRvcnkuIgorbXNnc3RyICJTdGFuZGFyZCDDpHIgZW5kYXN0IHRpbGxnw6RuZ2xpZ3QgZsO2ciBsb2thbGEgYXJraXYuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjU4MworbXNnaWQgIlNoYXJlZCBvbmx5IGF2YWlsYWJsZSBmb3IgbG9jYWwgcmVwb3NpdG9yeS4iCittc2dzdHIgIkRlbGF0IMOkciBlbmRhc3QgdGlsbGfDpG5nbGlndCBmw7ZyIGxva2FsYSBhcmtpdi4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NjA0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiTG9jYXRpb24gJXMgYWxyZWFkeSBleGlzdHMuIgorbXNnc3RyICJQbGF0c2VuICVzIGZpbm5zIHJlZGFuLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo2MTUKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIG9yaWdpbiIKK21zZ3N0ciAiS3VuZGUgaW50ZSBrb25maWd1cmVyYSB1cnNwcnVuZyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo2MjcKK21zZ2lkICJDb3VudGluZyBvYmplY3RzIgorbXNnc3RyICJSw6RrbmFyIG9iamVrdCIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo2MjgKK21zZ2lkICJidWNrZXRzIgorbXNnc3RyICJoaW5rYXIiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NjUyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGNvcHkgb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXM6ICVzIgorbXNnc3RyICJLdW5kZSBpbnRlIGtvcGllcmEgb2JqZWt0L2luZm8vYWx0ZXJuYXRpdjogJXMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6Njg4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiTm90aGluZyB0byBjbG9uZSBmcm9tICVzLiIKK21zZ3N0ciAiSW5nZW50aW5nIGF0dCBrbG9uYSBmcsOlbiAlcy4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NjkwIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTA0CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjkxNgorbXNnaWQgIlRoZSAnbWFzdGVyJyBicmFuY2ggaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiIKK21zZ3N0ciAiR3JlbmVuIFwibWFzdGVyXCIgaGFyIGludGUgaW5pdGllcmF0cy4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzAzCittc2dpZCAiSGFyZGxpbmtzIGFyZSB1bmF2YWlsYWJsZS4gIEZhbGxpbmcgYmFjayB0byBjb3B5aW5nLiIKK21zZ3N0ciAiSMOlcmRhIGzDpG5rYXIgw6RyIGludGUgdGlsbGfDpG5nbGlnYS4gRmFsbGVyIHRpbGxiYWthIHDDpSBrb3BpZXJpbmcuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjcxNQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkNsb25pbmcgZnJvbSAlcyIKK21zZ3N0ciAiS2xvbmFyIGZyw6VuICVzIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjc0NgorbXNnaWQgIkNvcHlpbmcgb2JqZWN0cyIKK21zZ3N0ciAiS29waWVyYXIgb2JqZWt0IgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjc0NworbXNnaWQgIktpQiIKK21zZ3N0ciAiS2lCIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjc3MQorIywgdGNsLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBjb3B5IG9iamVjdDogJXMiCittc2dzdHIgIkt1bmRlIGludGUga29waWVyYSBvYmpla3Q6ICVzIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjc4MQorbXNnaWQgIkxpbmtpbmcgb2JqZWN0cyIKK21zZ3N0ciAiTMOkbmthciBvYmpla3QiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzgyCittc2dpZCAib2JqZWN0cyIKK21zZ3N0ciAib2JqZWt0IgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjc5MAorIywgdGNsLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBoYXJkbGluayBvYmplY3Q6ICVzIgorbXNnc3RyICJLdW5kZSBpbnRlIGjDpXJkbMOkbmthIG9iamVrdDogJXMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODQ1Cittc2dpZCAiQ2Fubm90IGZldGNoIGJyYW5jaGVzIGFuZCBvYmplY3RzLiAgU2VlIGNvbnNvbGUgb3V0cHV0IGZvciBkZXRhaWxzLiIKK21zZ3N0ciAiS3VuZGUgaW50ZSBow6RtdGEgZ3JlbmFyIG9jaCBvYmpla3QuIFNlIGtvbnNvbHV0ZGF0YSBmw7ZyIGRldGFsamVyLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo4NTYKK21zZ2lkICJDYW5ub3QgZmV0Y2ggdGFncy4gIFNlZSBjb25zb2xlIG91dHB1dCBmb3IgZGV0YWlscy4iCittc2dzdHIgIkt1bmRlIGludGUgaMOkbXRhIHRhZ2dhci4gU2Uga29uc29sdXRkYXRhIGbDtnIgZGV0YWxqZXIuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjg4MAorbXNnaWQgIkNhbm5vdCBkZXRlcm1pbmUgSEVBRC4gIFNlZSBjb25zb2xlIG91dHB1dCBmb3IgZGV0YWlscy4iCittc2dzdHIgIkt1bmRlIGludGUgYXZnw7ZyYSBIRUFELiBTZSBrb25zb2x1dGRhdGEgZsO2ciBkZXRhbGplci4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODg5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGNsZWFudXAgJXMiCittc2dzdHIgIkt1bmRlIGludGUgc3TDpGRhIHVwcCAlcyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo4OTUKK21zZ2lkICJDbG9uZSBmYWlsZWQuIgorbXNnc3RyICJLbG9uaW5nIG1pc3NseWNrYWRlcy4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTAyCittc2dpZCAiTm8gZGVmYXVsdCBicmFuY2ggb2J0YWluZWQuIgorbXNnc3RyICJIw6RtdGFkZSBpbmdlbiBzdGFuZGFyZGdyZW4uIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjkxMworIywgdGNsLWZvcm1hdAorbXNnaWQgIkNhbm5vdCByZXNvbHZlICVzIGFzIGEgY29tbWl0LiIKK21zZ3N0ciAiS3VuZGUgaW50ZSBzbMOlIHVwcCAlcyB0aWxsIG7DpWdvbiBpbmNoZWNrbmluZy4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTI1Cittc2dpZCAiQ3JlYXRpbmcgd29ya2luZyBkaXJlY3RvcnkiCittc2dzdHIgIlNrYXBhciBhcmJldHNrYXRhbG9nIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjkyNiBsaWIvaW5kZXgudGNsOjY1IGxpYi9pbmRleC50Y2w6MTI3CisjOiBsaWIvaW5kZXgudGNsOjE5MworbXNnaWQgImZpbGVzIgorbXNnc3RyICJmaWxlciIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5NTUKK21zZ2lkICJJbml0aWFsIGZpbGUgY2hlY2tvdXQgZmFpbGVkLiIKK21zZ3N0ciAiSW5sZWRhbmRlIGZpbHV0Y2hlY2tuaW5nIG1pc3NseWNrYWRlcy4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTcxCittc2dpZCAiT3BlbiIKK21zZ3N0ciAiw5ZwcG5hIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjk4MQorbXNnaWQgIlJlcG9zaXRvcnk6IgorbXNnc3RyICJBcmtpdjoiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTAzMQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBvcGVuIHJlcG9zaXRvcnkgJXM6IgorbXNnc3RyICJLdW5kZSBpbnRlIMO2cHBuYSBhcmtpdmV0ICVzOiIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjUzCittc2dpZCAiVGhpcyBEZXRhY2hlZCBDaGVja291dCIKK21zZ3N0ciAiRGVubmEgZnLDpW5rb3BwbGFkZSB1dGNoZWNrbmluZyIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjYwCittc2dpZCAiUmV2aXNpb24gRXhwcmVzc2lvbjoiCittc2dzdHIgIlJldmlzaW9uc3V0dHJ5Y2s6IgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6NzQKK21zZ2lkICJMb2NhbCBCcmFuY2giCittc2dzdHIgIkxva2FsIGdyZW4iCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDo3OQorbXNnaWQgIlRyYWNraW5nIEJyYW5jaCIKK21zZ3N0ciAiU3DDpXJhbmRlIGdyZW4iCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDo4NCBsaWIvY2hvb3NlX3Jldi50Y2w6NTM4Cittc2dpZCAiVGFnIgorbXNnc3RyICJUYWdnIgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6MzE3CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiSW52YWxpZCByZXZpc2lvbjogJXMiCittc2dzdHIgIk9naWx0aWcgcmV2aXNpb246ICVzIgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6MzM4Cittc2dpZCAiTm8gcmV2aXNpb24gc2VsZWN0ZWQuIgorbXNnc3RyICJJbmdlbiByZXZpc2lvbiB2YWxkLiIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjM0NgorbXNnaWQgIlJldmlzaW9uIGV4cHJlc3Npb24gaXMgZW1wdHkuIgorbXNnc3RyICJSZXZpc2lvbnN1dHRyeWNrZXQgw6RyIHRvbXQuIgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6NTMxCittc2dpZCAiVXBkYXRlZCIKK21zZ3N0ciAiVXBwZGF0ZXJhZCIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjU1OQorbXNnaWQgIlVSTCIKK21zZ3N0ciAiV2ViYmFkcmVzcyIKKworIzogbGliL2NvbW1pdC50Y2w6OQorbXNnaWQgIiIKKyJUaGVyZSBpcyBub3RoaW5nIHRvIGFtZW5kLlxuIgorIlxuIgorIllvdSBhcmUgYWJvdXQgdG8gY3JlYXRlIHRoZSBpbml0aWFsIGNvbW1pdC4gIFRoZXJlIGlzIG5vIGNvbW1pdCBiZWZvcmUgdGhpcyAiCisidG8gYW1lbmQuXG4iCittc2dzdHIgIiIKKyJEZXQgZmlubnMgaW5nZW50aW5nIGF0dCB1dMO2a2EuXG4iCisiXG4iCisiRHUgaMOlbGxlciBww6UgYXR0IHNrYXBhIGRlbiBpbmxlZGFuZGUgaW5jaGVja25pbmdlbi4gRGV0IGZpbm5zIGluZ2VuIHRpZGlnYXJlICIKKyJpbmNoZWNrbmluZyBhdHQgdXTDtmthLlxuIgorCisjOiBsaWIvY29tbWl0LnRjbDoxOAorbXNnaWQgIiIKKyJDYW5ub3QgYW1lbmQgd2hpbGUgbWVyZ2luZy5cbiIKKyJcbiIKKyJZb3UgYXJlIGN1cnJlbnRseSBpbiB0aGUgbWlkZGxlIG9mIGEgbWVyZ2UgdGhhdCBoYXMgbm90IGJlZW4gZnVsbHkgIgorImNvbXBsZXRlZC4gIFlvdSBjYW5ub3QgYW1lbmQgdGhlIHByaW9yIGNvbW1pdCB1bmxlc3MgeW91IGZpcnN0IGFib3J0IHRoZSAiCisiY3VycmVudCBtZXJnZSBhY3Rpdml0eS5cbiIKK21zZ3N0ciAiIgorIkthbiBpbnRlIHV0w7ZrYSB2aWQgc2FtbWFuc2xhZ25pbmcuXG4iCisiXG4iCisiRHUgw6RyIGkgbWl0dGVuIGF2IGVuIHNhbW1hbnNsYWduaW5nIHNvbSBpbnRlIMOkciBmdWxsYm9yZGFkLiBEdSBrYW4gaW50ZSAiCisidXTDtmthIHRpZGlnYXJlIGluY2hlY2tuaW5nYXIgb20gZHUgaW50ZSBmw7Zyc3QgYXZicnl0ZXIgZGVuIHDDpWfDpWVuZGUgIgorInNhbW1hbnNsYWduaW5nZW4uXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjQ5Cittc2dpZCAiRXJyb3IgbG9hZGluZyBjb21taXQgZGF0YSBmb3IgYW1lbmQ6IgorbXNnc3RyICJGZWwgdmlkIGlubMOkc25pbmcgYXYgaW5jaGVja25pbmdzZGF0YSBmw7ZyIHV0w7ZrbmluZzoiCisKKyM6IGxpYi9jb21taXQudGNsOjc2Cittc2dpZCAiVW5hYmxlIHRvIG9idGFpbiB5b3VyIGlkZW50aXR5OiIKK21zZ3N0ciAiS3VuZGUgaW50ZSBow6RtdGEgZGluIGlkZW50aXRldDoiCisKKyM6IGxpYi9jb21taXQudGNsOjgxCittc2dpZCAiSW52YWxpZCBHSVRfQ09NTUlUVEVSX0lERU5UOiIKK21zZ3N0ciAiRmVsYWt0aWcgR0lUX0NPTU1JVFRFUl9JREVOVDoiCisKKyM6IGxpYi9jb21taXQudGNsOjEzMworbXNnaWQgIiIKKyJMYXN0IHNjYW5uZWQgc3RhdGUgZG9lcyBub3QgbWF0Y2ggcmVwb3NpdG9yeSBzdGF0ZS5cbiIKKyJcbiIKKyJBbm90aGVyIEdpdCBwcm9ncmFtIGhhcyBtb2RpZmllZCB0aGlzIHJlcG9zaXRvcnkgc2luY2UgdGhlIGxhc3Qgc2Nhbi4gIEEgIgorInJlc2NhbiBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgYW5vdGhlciBjb21taXQgY2FuIGJlIGNyZWF0ZWQuXG4iCisiXG4iCisiVGhlIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBub3cuXG4iCittc2dzdHIgIiIKKyJEZXQgc2VuYXN0ZSBpbmzDpHN0YSB0aWxsc3TDpW5kZXQgbW90c3ZhcmFyIGludGUgdGlsbHN0w6VuZGV0IGkgYXJraXZldC5cbiIKKyJcbiIKKyJFdHQgYW5uYXQgR2l0LXByb2dyYW0gaGFyIMOkbmRyYXQgYXJraXZldCBzZWRhbiBzZW5hc3RlIGF2c8O2a25pbmdlbi4gRHUgbcOlc3RlICIKKyJ1dGbDtnJhIGVuIG55IHPDtmtuaW5nIGlubmFuIGR1IGthbiBnw7ZyYSBlbiBueSBpbmNoZWNrbmluZy5cbiIKKyJcbiIKKyJTw7ZrbmluZ2VuIGtvbW1lciBhdHQgc3RhcnRhcyBhdXRvbWF0aXNrdCBudS5cbiIKKworIzogbGliL2NvbW1pdC50Y2w6MTU0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIlVubWVyZ2VkIGZpbGVzIGNhbm5vdCBiZSBjb21taXR0ZWQuXG4iCisiXG4iCisiRmlsZSAlcyBoYXMgbWVyZ2UgY29uZmxpY3RzLiAgWW91IG11c3QgcmVzb2x2ZSB0aGVtIGFuZCBzdGFnZSB0aGUgZmlsZSAiCisiYmVmb3JlIGNvbW1pdHRpbmcuXG4iCittc2dzdHIgIiIKKyJPc2FtbWFuc2xhZ25hIGZpbGVyIGthbiBpbnRlIGNoZWNrYXMgaW4uXG4iCisiXG4iCisiRmlsZW4gJXMgaGFyIHNhbW1hbnNsYWduaW5nc2tvbmZsaWt0ZXIuIER1IG3DpXN0ZSBsw7ZzYSBkZW0gb2NoIGvDtmEgZmlsZW4gIgorImlubmFuIGR1IGNoZWNrYXIgaW4gZGVuLlxuIgorCisjOiBsaWIvY29tbWl0LnRjbDoxNjIKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiVW5rbm93biBmaWxlIHN0YXRlICVzIGRldGVjdGVkLlxuIgorIlxuIgorIkZpbGUgJXMgY2Fubm90IGJlIGNvbW1pdHRlZCBieSB0aGlzIHByb2dyYW0uXG4iCittc2dzdHIgIiIKKyJPa8OkbmQgZmlsc3RhdHVzICVzIHVwcHTDpGNrdC5cbiIKKyJcbiIKKyJGaWxlbiAlcyBrYW4gaW50ZSBjaGVja2FzIGluIGF2IHByb2dyYW1tZXQuXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjE3MAorbXNnaWQgIiIKKyJObyBjaGFuZ2VzIHRvIGNvbW1pdC5cbiIKKyJcbiIKKyJZb3UgbXVzdCBzdGFnZSBhdCBsZWFzdCAxIGZpbGUgYmVmb3JlIHlvdSBjYW4gY29tbWl0LlxuIgorbXNnc3RyICIiCisiSW5nYSDDpG5kcmluZ2FyIGF0dCBjaGVja2EgaW4uXG4iCisiXG4iCisiRHUgbcOlc3RlIGvDtmEgw6V0bWluc3RvbmUgZW4gZmlsIGlubmFuIGR1IGthbiBjaGVja2EgaW4uXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjE4MworbXNnaWQgIiIKKyJQbGVhc2Ugc3VwcGx5IGEgY29tbWl0IG1lc3NhZ2UuXG4iCisiXG4iCisiQSBnb29kIGNvbW1pdCBtZXNzYWdlIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDpcbiIKKyJcbiIKKyItIEZpcnN0IGxpbmU6IERlc2NyaWJlIGluIG9uZSBzZW50ZW5jZSB3aGF0IHlvdSBkaWQuXG4iCisiLSBTZWNvbmQgbGluZTogQmxhbmtcbiIKKyItIFJlbWFpbmluZyBsaW5lczogRGVzY3JpYmUgd2h5IHRoaXMgY2hhbmdlIGlzIGdvb2QuXG4iCittc2dzdHIgIiIKKyJBbmdlIGV0dCBpbmNoZWNrbmluZ3NtZWRkZWxhbmRlLlxuIgorIlxuIgorIkV0dCBicmEgaW5jaGVja25pbmdzbWVkZGVsYW5kZSBoYXIgZsO2bGphbmRlIGZvcm1hdDpcbiIKKyJcbiIKKyItIEbDtnJzdGEgcmFkZW46IEJlc2tyaXYgaSBlbiBtZW5pbmcgdmFkIGR1IGdqb3JkZS5cbiIKKyItIEFuZHJhIHJhZGVuOiBUb21cbiIKKyItIEbDtmxqYW5kZSByYWRlcjogQmVza3JpdiB2YXJmw7ZyIGRldCBow6RyIMOkciBlbiBicmEgw6RuZHJpbmcuXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjIwNworIywgdGNsLWZvcm1hdAorbXNnaWQgIndhcm5pbmc6IFRjbCBkb2VzIG5vdCBzdXBwb3J0IGVuY29kaW5nICclcycuIgorbXNnc3RyICJ2YXJuaW5nOiBUY2wgc3TDtmRlciBpbnRlIHRlY2tlbmtvZG5pbmdlbiBcIiVzXCIuIgorCisjOiBsaWIvY29tbWl0LnRjbDoyMjEKK21zZ2lkICJDYWxsaW5nIHByZS1jb21taXQgaG9vay4uLiIKK21zZ3N0ciAiQW5yb3BhciBrcm9rIGbDtnJlIGluY2hlY2tuaW5nLi4uIgorCisjOiBsaWIvY29tbWl0LnRjbDoyMzYKK21zZ2lkICJDb21taXQgZGVjbGluZWQgYnkgcHJlLWNvbW1pdCBob29rLiIKK21zZ3N0ciAiSW5jaGVja25pbmdlbiBhdnZpc2FkZXMgYXYga3JvayBmw7ZyZSBpbmNoZWNrbmluZy4iCisKKyM6IGxpYi9jb21taXQudGNsOjI1OQorbXNnaWQgIkNhbGxpbmcgY29tbWl0LW1zZyBob29rLi4uIgorbXNnc3RyICJBbnJvcGFyIGtyb2sgZsO2ciBpbmNoZWNrbmluZ3NtZWRkZWxhbmRlLi4uIgorCisjOiBsaWIvY29tbWl0LnRjbDoyNzQKK21zZ2lkICJDb21taXQgZGVjbGluZWQgYnkgY29tbWl0LW1zZyBob29rLiIKK21zZ3N0ciAiSW5jaGVja25pbmcgYXZ2aXNhZCBhdiBrcm9rIGbDtnIgaW5jaGVja25pbmdzbWVkZGVsYW5kZS4iCisKKyM6IGxpYi9jb21taXQudGNsOjI4NworbXNnaWQgIkNvbW1pdHRpbmcgY2hhbmdlcy4uLiIKK21zZ3N0ciAiQ2hlY2thciBpbiDDpG5kcmluZ2FyLi4uIgorCisjOiBsaWIvY29tbWl0LnRjbDozMDMKK21zZ2lkICJ3cml0ZS10cmVlIGZhaWxlZDoiCittc2dzdHIgIndyaXRlLXRyZWUgbWlzc2x5Y2thZGVzOiIKKworIzogbGliL2NvbW1pdC50Y2w6MzA0IGxpYi9jb21taXQudGNsOjM0OCBsaWIvY29tbWl0LnRjbDozNjgKK21zZ2lkICJDb21taXQgZmFpbGVkLiIKK21zZ3N0ciAiSW5jaGVja25pbmdlbiBtaXNzbHlja2FkZXMuIgorCisjOiBsaWIvY29tbWl0LnRjbDozMjEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJDb21taXQgJXMgYXBwZWFycyB0byBiZSBjb3JydXB0IgorbXNnc3RyICJJbmNoZWNrbmluZ2VuICVzIHZlcmthciB2YXJhIHRyYXNpZyIKKworIzogbGliL2NvbW1pdC50Y2w6MzI2Cittc2dpZCAiIgorIk5vIGNoYW5nZXMgdG8gY29tbWl0LlxuIgorIlxuIgorIk5vIGZpbGVzIHdlcmUgbW9kaWZpZWQgYnkgdGhpcyBjb21taXQgYW5kIGl0IHdhcyBub3QgYSBtZXJnZSBjb21taXQuXG4iCisiXG4iCisiQSByZXNjYW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgbm93LlxuIgorbXNnc3RyICIiCisiSW5nYSDDpG5kcmluZ2FyIGF0dCBjaGVja2EgaW4uXG4iCisiXG4iCisiSW5nYSBmaWxlciDDpG5kcmFkZXMgYXYgaW5jaGVja25pbmdlbiBvY2ggZGV0IHZhciBpbnRlIGVuIHNhbW1hbnNsYWduaW5nLlxuIgorIlxuIgorIkVuIHPDtmtuaW5nIGtvbW1lciBhdHQgc3RhcnRhcyBhdXRvbWF0aXNrdCBudS5cbiIKKworIzogbGliL2NvbW1pdC50Y2w6MzMzCittc2dpZCAiTm8gY2hhbmdlcyB0byBjb21taXQuIgorbXNnc3RyICJJbmdhIMOkbmRyaW5nYXIgYXR0IGNoZWNrYSBpbi4iCisKKyM6IGxpYi9jb21taXQudGNsOjM0NworbXNnaWQgImNvbW1pdC10cmVlIGZhaWxlZDoiCittc2dzdHIgImNvbW1pdC10cmVlIG1pc3NseWNrYWRlczoiCisKKyM6IGxpYi9jb21taXQudGNsOjM2NworbXNnaWQgInVwZGF0ZS1yZWYgZmFpbGVkOiIKK21zZ3N0ciAidXBkYXRlLXJlZiBtaXNzbHlja2FkZXM6IgorCisjOiBsaWIvY29tbWl0LnRjbDo0NTQKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJDcmVhdGVkIGNvbW1pdCAlczogJXMiCittc2dzdHIgIlNrYXBhZGUgaW5jaGVja25pbmdlbiAlczogJXMiCisKKyM6IGxpYi9jb25zb2xlLnRjbDo1OQorbXNnaWQgIldvcmtpbmcuLi4gcGxlYXNlIHdhaXQuLi4iCittc2dzdHIgIkFyYmV0YXIuLi4gdsOkbnRhLi4uIgorCisjOiBsaWIvY29uc29sZS50Y2w6MTg2Cittc2dpZCAiU3VjY2VzcyIKK21zZ3N0ciAiTHlja2FkZXMiCisKKyM6IGxpYi9jb25zb2xlLnRjbDoyMDAKK21zZ2lkICJFcnJvcjogQ29tbWFuZCBGYWlsZWQiCittc2dzdHIgIkZlbDogS29tbWFuZG8gbWlzc2x5Y2thZGVzIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQzCittc2dpZCAiTnVtYmVyIG9mIGxvb3NlIG9iamVjdHMiCittc2dzdHIgIkFudGFsIGzDtnNhIG9iamVrdCIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0NAorbXNnaWQgIkRpc2sgc3BhY2UgdXNlZCBieSBsb29zZSBvYmplY3RzIgorbXNnc3RyICJEaXNrdXRyeW1tZSBhbnbDpG50IGF2IGzDtnNhIG9iamVrdCIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0NQorbXNnaWQgIk51bWJlciBvZiBwYWNrZWQgb2JqZWN0cyIKK21zZ3N0ciAiQW50YWwgcGFja2FkZSBvYmpla3QiCisKKyM6IGxpYi9kYXRhYmFzZS50Y2w6NDYKK21zZ2lkICJOdW1iZXIgb2YgcGFja3MiCittc2dzdHIgIkFudGFsIHBha2V0IgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQ3Cittc2dpZCAiRGlzayBzcGFjZSB1c2VkIGJ5IHBhY2tlZCBvYmplY3RzIgorbXNnc3RyICJEaXNrdXRyeW1tZSBhbnbDpG50IGF2IHBhY2thZGUgb2JqZWt0IgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQ4Cittc2dpZCAiUGFja2VkIG9iamVjdHMgd2FpdGluZyBmb3IgcHJ1bmluZyIKK21zZ3N0ciAiUGFja2FkZSBvYmpla3Qgc29tIHbDpG50YXIgcMOlIHN0w6RkbmluZyIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0OQorbXNnaWQgIkdhcmJhZ2UgZmlsZXMiCittc2dzdHIgIlNrcsOkcGZpbGVyIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjcyCittc2dpZCAiQ29tcHJlc3NpbmcgdGhlIG9iamVjdCBkYXRhYmFzZSIKK21zZ3N0ciAiS29tcHJpbWVyYXIgb2JqZWt0ZGF0YWJhc2VuIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjgzCittc2dpZCAiVmVyaWZ5aW5nIHRoZSBvYmplY3QgZGF0YWJhc2Ugd2l0aCBmc2NrLW9iamVjdHMiCittc2dzdHIgIlZlcmlmaWVyYXIgb2JqZWt0ZGF0YWJhc2VuIG1lZCBmc2NrLW9iamVjdHMiCisKKyM6IGxpYi9kYXRhYmFzZS50Y2w6MTA4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIlRoaXMgcmVwb3NpdG9yeSBjdXJyZW50bHkgaGFzIGFwcHJveGltYXRlbHkgJWkgbG9vc2Ugb2JqZWN0cy5cbiIKKyJcbiIKKyJUbyBtYWludGFpbiBvcHRpbWFsIHBlcmZvcm1hbmNlIGl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRoYXQgeW91IGNvbXByZXNzICIKKyJ0aGUgZGF0YWJhc2Ugd2hlbiBtb3JlIHRoYW4gJWkgbG9vc2Ugb2JqZWN0cyBleGlzdC5cbiIKKyJcbiIKKyJDb21wcmVzcyB0aGUgZGF0YWJhc2Ugbm93PyIKK21zZ3N0ciAiIgorIkFya2l2ZXQgaGFyIGbDtnIgbsOkcnZhcmFuZGUgb21rcmluZyAlaSBsw7ZzYSBvYmpla3QuXG4iCisiXG4iCisiRsO2ciBhdHQgYmliZWjDpWxsYSBvcHRpbWFsIHByZXN0YW5kYSByZWtvbW1lbmRlcmFzIGRldCDDpSBkZXQgYmVzdMOkbWRhc3RlIGF0dCAiCisiZHUga29tcHJpbWVyYXIgZGF0YWJhc2VuIG7DpHIgZGVuIGlubmVow6VsbGVyIG1lciDDpG4gJWkgbMO2c2Egb2JqZWt0LlxuIgorIlxuIgorIktvbXByaW1lcmEgZGF0YWJhc2VuIG51PyIKKworIzogbGliL2RhdGUudGNsOjI1CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBkYXRlIGZyb20gR2l0OiAlcyIKK21zZ3N0ciAiT2dpbHRpZ3QgZGF0dW0gZnLDpW4gR2l0OiAlcyIKKworIzogbGliL2RpZmYudGNsOjQyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIk5vIGRpZmZlcmVuY2VzIGRldGVjdGVkLlxuIgorIlxuIgorIiVzIGhhcyBubyBjaGFuZ2VzLlxuIgorIlxuIgorIlRoZSBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGlzIGZpbGUgd2FzIHVwZGF0ZWQgYnkgYW5vdGhlciBhcHBsaWNhdGlvbiwgYnV0ICIKKyJ0aGUgY29udGVudCB3aXRoaW4gdGhlIGZpbGUgd2FzIG5vdCBjaGFuZ2VkLlxuIgorIlxuIgorIkEgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIHRvIGZpbmQgb3RoZXIgZmlsZXMgd2hpY2ggbWF5IGhhdmUgIgorInRoZSBzYW1lIHN0YXRlLiIKK21zZ3N0ciAiIgorIkhpdHRhZGUgaW5nYSBza2lsbG5hZGVyLlxuIgorIlxuIgorIiVzIGlubmVow6VsbGVyIGluZ2Egw6RuZHJpbmdhci5cbiIKKyJcbiIKKyJNb2RpZmllcmluZ3NkYXR1bSBmw7ZyIGZpbGVuIHVwcGRhdGVyYWRlcyBhdiBldHQgYW5uYXQgcHJvZ3JhbSwgbWVuICIKKyJpbm5laMOlbGxldCBpIGZpbGVuIGhhciBpbnRlIMOkbmRyYXRzLlxuIgorIlxuIgorIkVuIHPDtmtuaW5nIGtvbW1lciBhdXRvbWF0aXNrdCBhdHQgc3RhcnRhcyBmw7ZyIGF0dCBoaXR0YSBhbmRyYSBmaWxlciBzb20ga2FuICIKKyJ2YXJhIGkgc2FtbWEgdGlsbHN0w6VuZC4iCisKKyM6IGxpYi9kaWZmLnRjbDo4MQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkxvYWRpbmcgZGlmZiBvZiAlcy4uLiIKK21zZ3N0ciAiTMOkc2VyIGRpZmZlcmVucyBmw7ZyICVzLi4uIgorCisjOiBsaWIvZGlmZi50Y2w6MTE0IGxpYi9kaWZmLnRjbDoxODQKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gZGlzcGxheSAlcyIKK21zZ3N0ciAiS2FuIGludGUgdmlzYSAlcyIKKworIzogbGliL2RpZmYudGNsOjExNQorbXNnaWQgIkVycm9yIGxvYWRpbmcgZmlsZToiCittc2dzdHIgIkZlbCB2aWQgbMOkc25pbmcgYXYgZmlsOiIKKworIzogbGliL2RpZmYudGNsOjEyMgorbXNnaWQgIkdpdCBSZXBvc2l0b3J5IChzdWJwcm9qZWN0KSIKK21zZ3N0ciAiR2l0YXJraXYgKHVuZGVycHJvamVrdCkiCisKKyM6IGxpYi9kaWZmLnRjbDoxMzQKK21zZ2lkICIqIEJpbmFyeSBmaWxlIChub3Qgc2hvd2luZyBjb250ZW50KS4iCittc2dzdHIgIiogQmluw6RyZmlsICh2aXNhciBpbnRlIGlubmVow6VsbGV0KS4iCisKKyM6IGxpYi9kaWZmLnRjbDoxODUKK21zZ2lkICJFcnJvciBsb2FkaW5nIGRpZmY6IgorbXNnc3RyICJGZWwgdmlkIGlubMOkc25pbmcgYXYgZGlmZmVyZW5zOiIKKworIzogbGliL2RpZmYudGNsOjMwMworbXNnaWQgIkZhaWxlZCB0byB1bnN0YWdlIHNlbGVjdGVkIGh1bmsuIgorbXNnc3RyICJLdW5kZSBpbnRlIHRhIGJvcnQgZGVuIHZhbGRhIGRlbGVuIGZyw6VuIGvDtm4uIgorCisjOiBsaWIvZGlmZi50Y2w6MzEwCittc2dpZCAiRmFpbGVkIHRvIHN0YWdlIHNlbGVjdGVkIGh1bmsuIgorbXNnc3RyICJLdW5kZSBpbnRlIGzDpGdnYSB0aWxsIGRlbiB2YWxkYSBkZWxlbiB0aWxsIGvDtm4uIgorCisjOiBsaWIvZXJyb3IudGNsOjIwIGxpYi9lcnJvci50Y2w6MTE0Cittc2dpZCAiZXJyb3IiCittc2dzdHIgImZlbCIKKworIzogbGliL2Vycm9yLnRjbDozNgorbXNnaWQgIndhcm5pbmciCittc2dzdHIgInZhcm5pbmciCisKKyM6IGxpYi9lcnJvci50Y2w6OTQKK21zZ2lkICJZb3UgbXVzdCBjb3JyZWN0IHRoZSBhYm92ZSBlcnJvcnMgYmVmb3JlIGNvbW1pdHRpbmcuIgorbXNnc3RyICJEdSBtw6VzdGUgcsOkdHRhIHRpbGwgZmVsZW4gb3ZhbiBpbm5hbiBkdSBjaGVja2FyIGluLiIKKworIzogbGliL2luZGV4LnRjbDo2Cittc2dpZCAiVW5hYmxlIHRvIHVubG9jayB0aGUgaW5kZXguIgorbXNnc3RyICJLdW5kZSBpbnRlIGzDpXNhIHVwcCBpbmRleGV0LiIKKworIzogbGliL2luZGV4LnRjbDoxNQorbXNnaWQgIkluZGV4IEVycm9yIgorbXNnc3RyICJJbmRleGZlbCIKKworIzogbGliL2luZGV4LnRjbDoyMQorbXNnaWQgIiIKKyJVcGRhdGluZyB0aGUgR2l0IGluZGV4IGZhaWxlZC4gIEEgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIHRvICIKKyJyZXN5bmNocm9uaXplIGdpdC1ndWkuIgorbXNnc3RyICIiCisiTWlzc2x5Y2thZGVzIG1lZCBhdHQgdXBwZGF0ZXJhIEdpdGluZGV4ZXQuIEVuIG9tc8O2a25pbmcga29tbWVyIGF0dCBzdGFydGFzICIKKyJhdXRvbWF0aXNrdCBmw7ZyIGF0dCBzeW5rcm9uaXNlcmEgb20gZ2l0LWd1aS4iCisKKyM6IGxpYi9pbmRleC50Y2w6MjcKK21zZ2lkICJDb250aW51ZSIKK21zZ3N0ciAiRm9yc3TDpHR0IgorCisjOiBsaWIvaW5kZXgudGNsOjMxCittc2dpZCAiVW5sb2NrIEluZGV4IgorbXNnc3RyICJMw6VzIHVwcCBpbmRleCIKKworIzogbGliL2luZGV4LnRjbDoyODIKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbnN0YWdpbmcgJXMgZnJvbSBjb21taXQiCittc2dzdHIgIlRhciBib3J0ICVzIGbDtnIgaW5jaGVja25pbmdza8O2biIKKworIzogbGliL2luZGV4LnRjbDozMTMKK21zZ2lkICJSZWFkeSB0byBjb21taXQuIgorbXNnc3RyICJSZWRvIGF0dCBjaGVja2EgaW4uIgorCisjOiBsaWIvaW5kZXgudGNsOjMyNgorIywgdGNsLWZvcm1hdAorbXNnaWQgIkFkZGluZyAlcyIKK21zZ3N0ciAiTMOkZ2dlciB0aWxsICVzIgorCisjOiBsaWIvaW5kZXgudGNsOjM4MQorIywgdGNsLWZvcm1hdAorbXNnaWQgIlJldmVydCBjaGFuZ2VzIGluIGZpbGUgJXM/IgorbXNnc3RyICLDhXRlcnN0w6RsbCDDpG5kcmluZ2FybmEgaSBmaWxlbiAlcz8iCisKKyM6IGxpYi9pbmRleC50Y2w6MzgzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUmV2ZXJ0IGNoYW5nZXMgaW4gdGhlc2UgJWkgZmlsZXM/IgorbXNnc3RyICLDhXRlcnN0w6RsbCDDpG5kcmluZ2FybmEgaSBkZXNzYSAlaSBmaWxlcj8iCisKKyM6IGxpYi9pbmRleC50Y2w6MzkxCittc2dpZCAiQW55IHVuc3RhZ2VkIGNoYW5nZXMgd2lsbCBiZSBwZXJtYW5lbnRseSBsb3N0IGJ5IHRoZSByZXZlcnQuIgorbXNnc3RyICIiCisiQWxsYSBva8O2YWRlIMOkbmRyaW5nYXIga29tbWVyIHBlcm1hbmVudCBnw6UgZsO2cmxvcmFkZSB2aWQgw6V0ZXJzdMOkbGxuaW5nZW4uIgorCisjOiBsaWIvaW5kZXgudGNsOjM5NAorbXNnaWQgIkRvIE5vdGhpbmciCittc2dzdHIgIkfDtnIgaW5nZW50aW5nIgorCisjOiBsaWIvbWVyZ2UudGNsOjEzCittc2dpZCAiIgorIkNhbm5vdCBtZXJnZSB3aGlsZSBhbWVuZGluZy5cbiIKKyJcbiIKKyJZb3UgbXVzdCBmaW5pc2ggYW1lbmRpbmcgdGhpcyBjb21taXQgYmVmb3JlIHN0YXJ0aW5nIGFueSB0eXBlIG9mIG1lcmdlLlxuIgorbXNnc3RyICIiCisiS2FuIGludGUgc2zDpSBpaG9wIHZpZCB1dMO2a25pbmcuXG4iCisiXG4iCisiRHUgbcOlc3RlIGfDtnJhIGbDpHJkaWcgdXTDtmtuaW5nZW4gYXYgaW5jaGVja25pbmdlbiBpbm5hbiBkdSBww6Viw7ZyamFyIG7DpWdvbiAiCisic2xhZ3Mgc2FtbWFuc2xhZ25pbmcuXG4iCisKKyM6IGxpYi9tZXJnZS50Y2w6MjcKK21zZ2lkICIiCisiTGFzdCBzY2FubmVkIHN0YXRlIGRvZXMgbm90IG1hdGNoIHJlcG9zaXRvcnkgc3RhdGUuXG4iCisiXG4iCisiQW5vdGhlciBHaXQgcHJvZ3JhbSBoYXMgbW9kaWZpZWQgdGhpcyByZXBvc2l0b3J5IHNpbmNlIHRoZSBsYXN0IHNjYW4uICBBICIKKyJyZXNjYW4gbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIGEgbWVyZ2UgY2FuIGJlIHBlcmZvcm1lZC5cbiIKKyJcbiIKKyJUaGUgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIG5vdy5cbiIKK21zZ3N0ciAiIgorIkRldCBzZW5hc3RlIGlubMOkc3RhIHRpbGxzdMOlbmRldCBtb3RzdmFyYXIgaW50ZSB0aWxsc3TDpW5kZXQgaSBhcmtpdmV0LlxuIgorIlxuIgorIkV0dCBhbm5hdCBHaXQtcHJvZ3JhbSBoYXIgw6RuZHJhdCBhcmtpdmV0IHNlZGFuIHNlbmFzdGUgYXZzw7ZrbmluZ2VuLiBEdSBtw6VzdGUgIgorInV0ZsO2cmEgZW4gbnkgc8O2a25pbmcgaW5uYW4gZHUga2FuIHV0ZsO2cmEgZW4gc2FtbWFuc2xhZ25pbmcuXG4iCisiXG4iCisiU8O2a25pbmdlbiBrb21tZXIgYXR0IHN0YXJ0YXMgYXV0b21hdGlza3QgbnUuXG4iCisKKyM6IGxpYi9tZXJnZS50Y2w6NDQKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiWW91IGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgY29uZmxpY3RlZCBtZXJnZS5cbiIKKyJcbiIKKyJGaWxlICVzIGhhcyBtZXJnZSBjb25mbGljdHMuXG4iCisiXG4iCisiWW91IG11c3QgcmVzb2x2ZSB0aGVtLCBzdGFnZSB0aGUgZmlsZSwgYW5kIGNvbW1pdCB0byBjb21wbGV0ZSB0aGUgY3VycmVudCAiCisibWVyZ2UuICBPbmx5IHRoZW4gY2FuIHlvdSBiZWdpbiBhbm90aGVyIG1lcmdlLlxuIgorbXNnc3RyICIiCisiRHUgw6RyIG1pdHQgaSBlbiBzYW1tYW5zbGFnbmluZyBtZWQga29uZmxpa3Rlci5cbiIKKyJcbiIKKyJGaWxlbiAlcyBoYXIgc2FtbWFuc2xhZ25pbmdza29uZmxpa3Rlci5cbiIKKyJcbiIKKyJEdSBtw6VzdGUgbMO2c2EgZGVtLCBrw7ZhIGZpbGVuIG9jaCBjaGVja2EgaW4gZsO2ciBhdHQgZnVsbGJvcmRhIGRlbiBha3R1ZWxsYSAiCisic2FtbWFuc2xhZ25pbmdlbi4gTsOkciBkdSBnam9ydCBkZXQga2FuIGR1IHDDpWLDtnJqYSBlbiBueSBzYW1tYW5zbGFnbmluZy5cbiIKKworIzogbGliL21lcmdlLnRjbDo1NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJZb3UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBjaGFuZ2UuXG4iCisiXG4iCisiRmlsZSAlcyBpcyBtb2RpZmllZC5cbiIKKyJcbiIKKyJZb3Ugc2hvdWxkIGNvbXBsZXRlIHRoZSBjdXJyZW50IGNvbW1pdCBiZWZvcmUgc3RhcnRpbmcgYSBtZXJnZS4gIERvaW5nIHNvICIKKyJ3aWxsIGhlbHAgeW91IGFib3J0IGEgZmFpbGVkIG1lcmdlLCBzaG91bGQgdGhlIG5lZWQgYXJpc2UuXG4iCittc2dzdHIgIiIKKyJEdSDDpHIgbWl0dCBpIGVuIMOkbmRyaW5nLlxuIgorIlxuIgorIkZpbGVuICVzIGhhciDDpG5kcmluZ2FyLlxuIgorIlxuIgorIkR1IGLDtnIgZnVsbGJvcmRhIGRlbiBha3R1ZWxsYSBpbmNoZWNrbmluZ2VuIGlubmFuIGR1IHDDpWLDtnJqYXIgZW4gIgorInNhbW1hbnNsYWduaW5nLiBPbSBkdSBnw7ZyIGRldCBibGlyIGRldCBlbmtsYXJlIGF0dCBhdmJyeXRhIGVuIG1pc3NseWNrYWQgIgorInNhbW1hbnNsYWduaW5nLCBvbSBkZXQgc2t1bGxlIHZhcmEgbsO2ZHbDpG5kaWd0LlxuIgorCisjOiBsaWIvbWVyZ2UudGNsOjEwNgorIywgdGNsLWZvcm1hdAorbXNnaWQgIiVzIG9mICVzIgorbXNnc3RyICIlcyBhdiAlcyIKKworIzogbGliL21lcmdlLnRjbDoxMTkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJNZXJnaW5nICVzIGFuZCAlcy4uLiIKK21zZ3N0ciAiU2zDpXIgaWhvcCAlcyBvY2ggJXMuLi4iCisKKyM6IGxpYi9tZXJnZS50Y2w6MTMwCittc2dpZCAiTWVyZ2UgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4iCittc2dzdHIgIlNhbW1hbnNsYWduaW5nZW4gYXZzbHV0YWRlcyBmcmFtZ8OlbmdzcmlrdC4iCisKKyM6IGxpYi9tZXJnZS50Y2w6MTMyCittc2dpZCAiTWVyZ2UgZmFpbGVkLiAgQ29uZmxpY3QgcmVzb2x1dGlvbiBpcyByZXF1aXJlZC4iCittc2dzdHIgIlNhbW1hbnNsYWduaW5nZW4gbWlzc2x5Y2thZGVzLiBEdSBtw6VzdGUgbMO2c2Ega29uZmxpa3Rlcm5hLiIKKworIzogbGliL21lcmdlLnRjbDoxNTcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJNZXJnZSBJbnRvICVzIgorbXNnc3RyICJTbMOlIGlob3AgaSAlcyIKKworIzogbGliL21lcmdlLnRjbDoxNzYKK21zZ2lkICJSZXZpc2lvbiBUbyBNZXJnZSIKK21zZ3N0ciAiUmV2aXNpb25lciBhdHQgc2zDpSBpaG9wIgorCisjOiBsaWIvbWVyZ2UudGNsOjIxMQorbXNnaWQgIiIKKyJDYW5ub3QgYWJvcnQgd2hpbGUgYW1lbmRpbmcuXG4iCisiXG4iCisiWW91IG11c3QgZmluaXNoIGFtZW5kaW5nIHRoaXMgY29tbWl0LlxuIgorbXNnc3RyICIiCisiS2FuIGludGUgYXZicnl0YSB2aWQgdXTDtmtuaW5nLlxuIgorIlxuIgorIkR1IG3DpXN0ZSBnw7ZyYSBkaWcgZsOkcmRpZyBtZWQgYXR0IHV0w7ZrYSBpbmNoZWNrbmluZ2VuLlxuIgorCisjOiBsaWIvbWVyZ2UudGNsOjIyMQorbXNnaWQgIiIKKyJBYm9ydCBtZXJnZT9cbiIKKyJcbiIKKyJBYm9ydGluZyB0aGUgY3VycmVudCBtZXJnZSB3aWxsIGNhdXNlICpBTEwqIHVuY29tbWl0dGVkIGNoYW5nZXMgdG8gYmUgbG9zdC5cbiIKKyJcbiIKKyJDb250aW51ZSB3aXRoIGFib3J0aW5nIHRoZSBjdXJyZW50IG1lcmdlPyIKK21zZ3N0ciAiIgorIkF2YnJ5dCBzYW1tYW5zbGFnbmluZz9cbiIKKyJcbiIKKyJPbSBkdSBhdmJyeXRlciBzYW1tYW5zbGFnbmluZ2VuIGtvbW1lciAqQUxMQSogZWogaW5jaGVja2FkZSDDpG5kcmluZ2FyIGF0dCBnw6UgIgorImbDtnJsb3JhZGUuXG4iCisiXG4iCisiR8OlIHZpZGFyZSBtZWQgYXR0IGF2YnJ5dGEgZGVuIGFrdHVlbGxhIHNhbW1hbnNsYWduaW5nZW4/IgorCisjOiBsaWIvbWVyZ2UudGNsOjIyNworbXNnaWQgIiIKKyJSZXNldCBjaGFuZ2VzP1xuIgorIlxuIgorIlJlc2V0dGluZyB0aGUgY2hhbmdlcyB3aWxsIGNhdXNlICpBTEwqIHVuY29tbWl0dGVkIGNoYW5nZXMgdG8gYmUgbG9zdC5cbiIKKyJcbiIKKyJDb250aW51ZSB3aXRoIHJlc2V0dGluZyB0aGUgY3VycmVudCBjaGFuZ2VzPyIKK21zZ3N0ciAiIgorIsOFdGVyc3TDpGxsIMOkbmRyaW5nYXI/XG4iCisiXG4iCisiT20gZHUgw6V0ZXJzdMOkbGxlciDDpG5kcmluZ2FybmEga29tbWVyICpBTExBKiBlaiBpbmNoZWNrYWRlIMOkbmRyaW5nYXIgYXR0IGfDpSAiCisiZsO2cmxvcmFkZS5cbiIKKyJcbiIKKyJHw6UgdmlkYXJlIG1lZCBhdHQgw6V0ZXJzdMOkbGxhIGRlIGFrdHVlbGxhIMOkbmRyaW5nYXJuYT8iCisKKyM6IGxpYi9tZXJnZS50Y2w6MjM4Cittc2dpZCAiQWJvcnRpbmciCittc2dzdHIgIkF2YnJ5dGVyIgorCisjOiBsaWIvbWVyZ2UudGNsOjIzOAorbXNnaWQgImZpbGVzIHJlc2V0IgorbXNnc3RyICJmaWxlciDDpXRlcnN0w6RsbGRhIgorCisjOiBsaWIvbWVyZ2UudGNsOjI2NQorbXNnaWQgIkFib3J0IGZhaWxlZC4iCittc2dzdHIgIk1pc3NseWNrYWRlcyBhdmJyeXRhLiIKKworIzogbGliL21lcmdlLnRjbDoyNjcKK21zZ2lkICJBYm9ydCBjb21wbGV0ZWQuICBSZWFkeS4iCittc2dzdHIgIkF2YnJ5dG5pbmcgZnVsbGJvcmRhZC4gUmVkby4iCisKKyM6IGxpYi9vcHRpb24udGNsOjk1Cittc2dpZCAiUmVzdG9yZSBEZWZhdWx0cyIKK21zZ3N0ciAiw4V0ZXJzdMOkbGwgc3RhbmRhcmR2w6RyZGVuIgorCisjOiBsaWIvb3B0aW9uLnRjbDo5OQorbXNnaWQgIlNhdmUiCittc2dzdHIgIlNwYXJhIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMDkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIlcyBSZXBvc2l0b3J5IgorbXNnc3RyICJBcmtpdmV0ICVzIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMTAKK21zZ2lkICJHbG9iYWwgKEFsbCBSZXBvc2l0b3JpZXMpIgorbXNnc3RyICJHbG9iYWx0IChhbGxhIGFya2l2KSIKKworIzogbGliL29wdGlvbi50Y2w6MTE2Cittc2dpZCAiVXNlciBOYW1lIgorbXNnc3RyICJBbnbDpG5kYXJuYW1uIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMTcKK21zZ2lkICJFbWFpbCBBZGRyZXNzIgorbXNnc3RyICJFLXBvc3RhZHJlc3MiCisKKyM6IGxpYi9vcHRpb24udGNsOjExOQorbXNnaWQgIlN1bW1hcml6ZSBNZXJnZSBDb21taXRzIgorbXNnc3RyICJTdW1tZXJhIHNhbW1hbnNsYWduaW5nc2luY2hlY2tuaW5nYXIiCisKKyM6IGxpYi9vcHRpb24udGNsOjEyMAorbXNnaWQgIk1lcmdlIFZlcmJvc2l0eSIKK21zZ3N0ciAiUHJhdHNhbWhldCBmw7ZyIHNhbW1hbnNsYWduaW5nYXIiCisKKyM6IGxpYi9vcHRpb24udGNsOjEyMQorbXNnaWQgIlNob3cgRGlmZnN0YXQgQWZ0ZXIgTWVyZ2UiCittc2dzdHIgIlZpc2EgZGlmZnN0YXRpc3RpayBlZnRlciBzYW1tYW5zbGFnbmluZyIKKworIzogbGliL29wdGlvbi50Y2w6MTIzCittc2dpZCAiVHJ1c3QgRmlsZSBNb2RpZmljYXRpb24gVGltZXN0YW1wcyIKK21zZ3N0ciAiTGl0YSBww6UgZmlsw6RuZHJpbmdzdGlkc3N0w6RtcGxhciIKKworIzogbGliL29wdGlvbi50Y2w6MTI0Cittc2dpZCAiUHJ1bmUgVHJhY2tpbmcgQnJhbmNoZXMgRHVyaW5nIEZldGNoIgorbXNnc3RyICJTdMOkZGEgc3DDpXJhZGUgZ3JlbmFyIHZpZCBow6RtdG5pbmciCisKKyM6IGxpYi9vcHRpb24udGNsOjEyNQorbXNnaWQgIk1hdGNoIFRyYWNraW5nIEJyYW5jaGVzIgorbXNnc3RyICJNYXRjaGEgc3DDpXJhZGUgZ3JlbmFyIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMjYKK21zZ2lkICJOdW1iZXIgb2YgRGlmZiBDb250ZXh0IExpbmVzIgorbXNnc3RyICJBbnRhbCByYWRlciBzYW1tYW5oYW5nIGkgZGlmZmVyZW5zZXIiCisKKyM6IGxpYi9vcHRpb24udGNsOjEyNworbXNnaWQgIkNvbW1pdCBNZXNzYWdlIFRleHQgV2lkdGgiCittc2dzdHIgIlRleHRicmVkZCBmw7ZyIGluY2hlY2tuaW5nc21lZGRlbGFuZGUiCisKKyM6IGxpYi9vcHRpb24udGNsOjEyOAorbXNnaWQgIk5ldyBCcmFuY2ggTmFtZSBUZW1wbGF0ZSIKK21zZ3N0ciAiTWFsbCBmw7ZyIG5hbW4gcMOlIG55YSBncmVuYXIiCisKKyM6IGxpYi9vcHRpb24udGNsOjE5MgorbXNnaWQgIlNwZWxsaW5nIERpY3Rpb25hcnk6IgorbXNnc3RyICJTdGF2bmluZ3NvcmRsaXN0YToiCisKKyM6IGxpYi9vcHRpb24udGNsOjIxNgorbXNnaWQgIkNoYW5nZSBGb250IgorbXNnc3RyICJCeXQgdGVja2Vuc25pdHQiCisKKyM6IGxpYi9vcHRpb24udGNsOjIyMAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkNob29zZSAlcyIKK21zZ3N0ciAiVsOkbGogJXMiCisKKyM6IGxpYi9vcHRpb24udGNsOjIyNgorbXNnaWQgInB0LiIKK21zZ3N0ciAicC4iCisKKyM6IGxpYi9vcHRpb24udGNsOjI0MAorbXNnaWQgIlByZWZlcmVuY2VzIgorbXNnc3RyICJJbnN0w6RsbG5pbmdhciIKKworIzogbGliL29wdGlvbi50Y2w6Mjc1Cittc2dpZCAiRmFpbGVkIHRvIGNvbXBsZXRlbHkgc2F2ZSBvcHRpb25zOiIKK21zZ3N0ciAiTWlzc2x5Y2thZGVzIG1lZCBhdHQgaGVsdCBzcGFyYSBhbHRlcm5hdGl2OiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoyOSBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjM0Cittc2dpZCAiRGVsZXRlIFJlbW90ZSBCcmFuY2giCittc2dzdHIgIlRhIGJvcnQgZmrDpHJyZ3JlbiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDo0NworbXNnaWQgIkZyb20gUmVwb3NpdG9yeSIKK21zZ3N0ciAiRnLDpW4gYXJraXYiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6NTAgbGliL3RyYW5zcG9ydC50Y2w6MTIzCittc2dpZCAiUmVtb3RlOiIKK21zZ3N0ciAiRmrDpHJyOiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDo2NiBsaWIvdHJhbnNwb3J0LnRjbDoxMzgKK21zZ2lkICJBcmJpdHJhcnkgVVJMOiIKK21zZ3N0ciAiR29kdHlja2xpZyB3ZWJiYWRyZXNzOiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDo4NAorbXNnaWQgIkJyYW5jaGVzIgorbXNnc3RyICJHcmVuYXIiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MTA5Cittc2dpZCAiRGVsZXRlIE9ubHkgSWYiCittc2dzdHIgIlRhIGVuZGFzdCBib3J0IG9tIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjExMQorbXNnaWQgIk1lcmdlZCBJbnRvOiIKK21zZ3N0ciAiU2FtbWFuc2xhZ2VuIGk6IgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjExOQorbXNnaWQgIkFsd2F5cyAoRG8gbm90IHBlcmZvcm0gbWVyZ2UgY2hlY2tzKSIKK21zZ3N0ciAiQWxsdGlkICh1dGbDtnIgaW50ZSBzYW1tYW5zbGFnbmluZ3N0ZXN0KSIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoxNTIKK21zZ2lkICJBIGJyYW5jaCBpcyByZXF1aXJlZCBmb3IgJ01lcmdlZCBJbnRvJy4iCittc2dzdHIgIkVuIGdyZW4ga3LDpHZzIGbDtnIgXCJTYW1tYW5zbGFnZW4gaVwiLiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoxODQKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiVGhlIGZvbGxvd2luZyBicmFuY2hlcyBhcmUgbm90IGNvbXBsZXRlbHkgbWVyZ2VkIGludG8gJXM6XG4iCisiXG4iCisiIC0gJXMiCittc2dzdHIgIiIKKyJGw7ZsamFuZGUgZ3JlbmFyIGhhciBpbnRlIGhlbHQgc2xhZ2l0cyBzYW1tYW4gaSAlczpcbiIKKyJcbiIKKyIgLSAlcyIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoxODkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiT25lIG9yIG1vcmUgb2YgdGhlIG1lcmdlIHRlc3RzIGZhaWxlZCBiZWNhdXNlIHlvdSBoYXZlIG5vdCBmZXRjaGVkIHRoZSAiCisibmVjZXNzYXJ5IGNvbW1pdHMuICBUcnkgZmV0Y2hpbmcgZnJvbSAlcyBmaXJzdC4iCittc2dzdHIgIiIKKyJFbiBlbGxlciBmbGVyYSBhdiBzYW1tYW5zbGFnbmluZ3N0ZXN0ZXJuYSBtaXNzbHlja2FkZXMgZWZ0ZXJzb20gZHUgaW50ZSBoYXIgIgorImjDpG10YXQgZGUgbsO2ZHbDpG5kaWdhIGluY2hlY2tuaW5nYXJuYS4gRsO2cnPDtmsgaMOkbXRhIGZyw6VuICVzIGbDtnJzdC4iCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MjA3Cittc2dpZCAiUGxlYXNlIHNlbGVjdCBvbmUgb3IgbW9yZSBicmFuY2hlcyB0byBkZWxldGUuIgorbXNnc3RyICJWw6RsaiBlbiBlbGxlciBmbGVyYSBncmVuYXIgYXR0IHRhIGJvcnQuIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjIxNgorbXNnaWQgIiIKKyJSZWNvdmVyaW5nIGRlbGV0ZWQgYnJhbmNoZXMgaXMgZGlmZmljdWx0LlxuIgorIlxuIgorIkRlbGV0ZSB0aGUgc2VsZWN0ZWQgYnJhbmNoZXM/IgorbXNnc3RyICIiCisiRGV0IGthbiB2YXJhIHN2w6VydCBhdHQgw6V0ZXJzdMOkbGxhIGJvcnR0YWduYSBncmVuYXIuXG4iCisiXG4iCisiVGEgYm9ydCBkZSB2YWxkYSBncmVuYXJuYT8iCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MjI2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRGVsZXRpbmcgYnJhbmNoZXMgZnJvbSAlcyIKK21zZ3N0ciAiVGFyIGJvcnQgZ3JlbmFyIGZyw6VuICVzIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjI4NgorbXNnaWQgIk5vIHJlcG9zaXRvcnkgc2VsZWN0ZWQuIgorbXNnc3RyICJJbmdldCBhcmtpdiBtYXJrZXJhdC4iCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MjkxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgJXMuLi4iCittc2dzdHIgIlPDtmtlciAlcy4uLiIKKworIzogbGliL3JlbW90ZS50Y2w6MTY1Cittc2dpZCAiUHJ1bmUgZnJvbSIKK21zZ3N0ciAiVGEgYm9ydCBmcsOlbiIKKworIzogbGliL3JlbW90ZS50Y2w6MTcwCittc2dpZCAiRmV0Y2ggZnJvbSIKK21zZ3N0ciAiSMOkbXRhIGZyw6VuIgorCisjOiBsaWIvcmVtb3RlLnRjbDoyMTMKK21zZ2lkICJQdXNoIHRvIgorbXNnc3RyICJTw6RuZCB0aWxsIgorCisjOiBsaWIvc2hvcnRjdXQudGNsOjIwIGxpYi9zaG9ydGN1dC50Y2w6NjEKK21zZ2lkICJDYW5ub3Qgd3JpdGUgc2hvcnRjdXQ6IgorbXNnc3RyICJLYW4gaW50ZSBza3JpdmEgZ2VudsOkZzoiCisKKyM6IGxpYi9zaG9ydGN1dC50Y2w6MTM2Cittc2dpZCAiQ2Fubm90IHdyaXRlIGljb246IgorbXNnc3RyICJLYW4gaW50ZSBza3JpdmEgaWtvbjoiCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDo1NworbXNnaWQgIlVuc3VwcG9ydGVkIHNwZWxsIGNoZWNrZXIiCittc2dzdHIgIlN0YXZuaW5nc2tvbnRyb2xscHJvZ3JhbW1ldCBzdMO2ZHMgaW50ZSIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjY1Cittc2dpZCAiU3BlbGwgY2hlY2tpbmcgaXMgdW5hdmFpbGFibGUiCittc2dzdHIgIlN0YXZuaW5nc2tvbnRyb2xsIMOkciBlaiB0aWxsZ8OkbmdsaWciCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDo2OAorbXNnaWQgIkludmFsaWQgc3BlbGwgY2hlY2tpbmcgY29uZmlndXJhdGlvbiIKK21zZ3N0ciAiT2dpbHRpZyBpbnN0w6RsbG5pbmcgZsO2ciBzdGF2bmluZ3Nrb250cm9sbCIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjcwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUmV2ZXJ0aW5nIGRpY3Rpb25hcnkgdG8gJXMuIgorbXNnc3RyICLDhXRlcnN0w6RsbGVyIG9yZGxpc3RhbiB0aWxsICVzLiIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjczCittc2dpZCAiU3BlbGwgY2hlY2tlciBzaWxlbnRseSBmYWlsZWQgb24gc3RhcnR1cCIKK21zZ3N0ciAiU3Rhdm5pbmdza29udHJvbGwgbWlzc2x5Y2thZGVzIHR5c3QgdmlkIHN0YXJ0IgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6ODAKK21zZ2lkICJVbnJlY29nbml6ZWQgc3BlbGwgY2hlY2tlciIKK21zZ3N0ciAiU3Rhdm5pbmdza29udHJvbGxwcm9ncmFtbWV0IGvDpG5ucyBpbnRlIGlnZW4iCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDoxODAKK21zZ2lkICJObyBTdWdnZXN0aW9ucyIKK21zZ3N0ciAiSW5nYSBmw7Zyc2xhZyIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjM4MQorbXNnaWQgIlVuZXhwZWN0ZWQgRU9GIGZyb20gc3BlbGwgY2hlY2tlciIKK21zZ3N0ciAiT3bDpG50YXQgZmlsc2x1dCBmcsOlbiBzdGF2bmluZ3Nrb250cm9sbCIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjM4NQorbXNnaWQgIlNwZWxsIENoZWNrZXIgRmFpbGVkIgorbXNnc3RyICJTdGF2bmluZ3Nrb250cm9sbCBtaXNzbHlja2FkZXMiCisKKyM6IGxpYi9zdGF0dXNfYmFyLnRjbDo4MworIywgdGNsLWZvcm1hdAorbXNnaWQgIiVzIC4uLiAlKmkgb2YgJSppICVzICglM2klJSkiCittc2dzdHIgIiVzLi4uICUqaSBhdiAlKmkgJXMgKCUzaSUlKSIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6NgorIywgdGNsLWZvcm1hdAorbXNnaWQgImZldGNoICVzIgorbXNnc3RyICJow6RtdGEgJXMiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJGZXRjaGluZyBuZXcgY2hhbmdlcyBmcm9tICVzIgorbXNnc3RyICJIw6RtdGFyIG55YSDDpG5kcmluZ2FyIGZyw6VuICVzIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoxOAorIywgdGNsLWZvcm1hdAorbXNnaWQgInJlbW90ZSBwcnVuZSAlcyIKK21zZ3N0ciAiZmrDpHJyYm9ydHRhZ25pbmcgJXMiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjE5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUHJ1bmluZyB0cmFja2luZyBicmFuY2hlcyBkZWxldGVkIGZyb20gJXMiCittc2dzdHIgIlRhciBib3J0IHNww6VyYW5kZSBncmVuYXIgc29tIHRhZ2l0cyBib3J0IGZyw6VuICVzIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoyNSBsaWIvdHJhbnNwb3J0LnRjbDo3MQorIywgdGNsLWZvcm1hdAorbXNnaWQgInB1c2ggJXMiCittc2dzdHIgInPDpG5kICVzIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoyNgorIywgdGNsLWZvcm1hdAorbXNnaWQgIlB1c2hpbmcgY2hhbmdlcyB0byAlcyIKK21zZ3N0ciAiU8OkbmRlciDDpG5kcmluZ2FyIHRpbGwgJXMiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjcyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUHVzaGluZyAlcyAlcyB0byAlcyIKK21zZ3N0ciAiU8OkbmRlciAlcyAlcyB0aWxsICVzIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDo4OQorbXNnaWQgIlB1c2ggQnJhbmNoZXMiCittc2dzdHIgIlPDpG5kZXIgZ3JlbmFyIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoxMDMKK21zZ2lkICJTb3VyY2UgQnJhbmNoZXMiCittc2dzdHIgIkvDpGxsZ3JlbmFyIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoxMjAKK21zZ2lkICJEZXN0aW5hdGlvbiBSZXBvc2l0b3J5IgorbXNnc3RyICJEZXN0aW5hdGlvbnNhcmtpdiIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTU4Cittc2dpZCAiVHJhbnNmZXIgT3B0aW9ucyIKK21zZ3N0ciAiw5Z2ZXJmw7ZyaW5nc2FsdGVybmF0aXYiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjE2MAorbXNnaWQgIkZvcmNlIG92ZXJ3cml0ZSBleGlzdGluZyBicmFuY2ggKG1heSBkaXNjYXJkIGNoYW5nZXMpIgorbXNnc3RyICJUdmluZ2Egw7Z2ZXJza3Jpdm5pbmcgYXYgYmVmaW50bGlnIGdyZW4gKGthbiBrYXN0YSBib3J0IMOkbmRyaW5nYXIpIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoxNjQKK21zZ2lkICJVc2UgdGhpbiBwYWNrIChmb3Igc2xvdyBuZXR3b3JrIGNvbm5lY3Rpb25zKSIKK21zZ3N0ciAiQW52w6RuZCB0dW50IHBha2V0IChmw7ZyIGzDpW5nc2FtbWEgbsOkdHZlcmtzYW5zbHV0bmluZ2FyKSIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTY4Cittc2dpZCAiSW5jbHVkZSB0YWdzIgorbXNnc3RyICJUYSBtZWQgdGFnZ2FyIgorCisjfiBtc2dpZCAiTm90IGNvbm5lY3RlZCB0byBhc3BlbGwiCisjfiBtc2dzdHIgIkludGUgYW5zbHV0ZW4gdGlsbCBhc3BlbGwiCmRpZmYgLS1naXQgYS9naXQtZ3VpL3BvL3poX2NuLnBvIGIvZ2l0LWd1aS9wby96aF9jbi5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmM2ODY2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWd1aS9wby96aF9jbi5wbwpAQCAtMCwwICsxLDE5NzcgQEAKKyMgVHJhbnNsYXRpb24gb2YgZ2l0LWd1aSB0byBDaGluZXNlCisjIENvcHlyaWdodCAoQykgMjAwNyBTaGF3biBQZWFyY2UKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGdpdC1ndWkgcGFja2FnZS4KKyMgWHVkb25nIEd1YW4gPHh1ZG9uZy5ndWFuQGdtYWlsLmNvbT4sIDIwMDcuCisjCisjIFBsZWFzZSB1c2UgdGhlIGZvbGxvd2luZyB0cmFuc2xhdGlvbiB0aHJvdWdob3V0IHRoZSBmaWxlIGZvciBjb25zaXN0ZW5jZToKKyMKKyMgCXJlcG9zaXRvcnkJ54mI5pys5bqTCisjIAljb21taXQJCeaPkOS6pAorIyAJcmV2aXNpb24J54mI5pysCisjIAlicmFuY2gJCeWIhuaUrworIyAJdGFnCQnmoIfnrb4KKyMgCWFubm90YXRpb24J5qCH5rOoCisjIAltZXJnZQkJ5ZCI5bm2CisjIAlmYXN0IGZvcndhcmQJ5b+r6YCf5ZCI5bm2KD8/KQorIyAJc3RhZ2UJCee8k+WtmCAo6K+R6IeqIGluZGV4L2NhY2hlKQorIyAJYW1lbmQJCeS/ruatoworIyAJcmVzZXQJCeWkjeS9jQorIworIyAyMDA4LTAxLTA2IEVyaWMgTWlhbyA8ZXJpYy55Lm1pYW9AZ21haWwuY29tPgorIyBGSVhNRTogY2hlY2tvdXQg55qE5qCH5YeG57+76K+RCisjCisjLCBmdXp6eQorbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ2l0LWd1aVxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBcbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAwOC0wMy0xNCAwNzoxOCswMTAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwNy0wNy0yMSAwMToyMy0wNzAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBFcmljIE1pYW8gPGVyaWMueS5taWFvQGdtYWlsLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBDaGluZXNlXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisKKyM6IGdpdC1ndWkuc2g6NDEgZ2l0LWd1aS5zaDo2MzQgZ2l0LWd1aS5zaDo2NDggZ2l0LWd1aS5zaDo2NjEgZ2l0LWd1aS5zaDo3NDQKKyM6IGdpdC1ndWkuc2g6NzYzCittc2dpZCAiZ2l0LWd1aTogZmF0YWwgZXJyb3IiCittc2dzdHIgImdpdC1ndWk6IOiHtOWRvemUmeivryIKKworIzogZ2l0LWd1aS5zaDo1OTMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIGZvbnQgc3BlY2lmaWVkIGluICVzOiIKK21zZ3N0ciAiJXMg5Lit5oyH5a6a55qE5a2X5L2T5peg5pWIOiIKKworIzogZ2l0LWd1aS5zaDo2MjAKK21zZ2lkICJNYWluIEZvbnQiCittc2dzdHIgIuS4u+imgeWtl+S9kyIKKworIzogZ2l0LWd1aS5zaDo2MjEKK21zZ2lkICJEaWZmL0NvbnNvbGUgRm9udCIKK21zZ3N0ciAiRGlmZi/mjqfliLbnu4jnq6/lrZfkvZMiCisKKyM6IGdpdC1ndWkuc2g6NjM1Cittc2dpZCAiQ2Fubm90IGZpbmQgZ2l0IGluIFBBVEguIgorbXNnc3RyICJQQVRIIOS4reayoeacieaJvuWIsCBnaXQiCisKKyM6IGdpdC1ndWkuc2g6NjYyCittc2dpZCAiQ2Fubm90IHBhcnNlIEdpdCB2ZXJzaW9uIHN0cmluZzoiCittc2dzdHIgIuaXoOazleino+aekCBHaXQg55qE54mI5pys5L+h5oGvOiIKKworIzogZ2l0LWd1aS5zaDo2ODAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiR2l0IHZlcnNpb24gY2Fubm90IGJlIGRldGVybWluZWQuXG4iCisiXG4iCisiJXMgY2xhaW1zIGl0IGlzIHZlcnNpb24gJyVzJy5cbiIKKyJcbiIKKyIlcyByZXF1aXJlcyBhdCBsZWFzdCBHaXQgMS41LjAgb3IgbGF0ZXIuXG4iCisiXG4iCisiQXNzdW1lICclcycgaXMgdmVyc2lvbiAxLjUuMD9cbiIKK21zZ3N0ciAiIgorIuaXoOazleehruWumiBHaXQg55qE54mI5pysLlxuIgorIlxuIgorIiVzIOWjsOaYjuWFtueJiOacrOS4uiAnJXMnLlxuIgorIlxuIgorIuiAjCAlcyDpnIDopoEgMS41LjAg5oiW6L+Z5Lul5ZCO55qEIEdpdCDniYjmnKwuXG4iCisiXG4iCisi5piv5ZCm5YGH5a6aICclcycg5Li654mI5pysIDEuNS4wP1xuIgorCisjOiBnaXQtZ3VpLnNoOjkxOAorbXNnaWQgIkdpdCBkaXJlY3Rvcnkgbm90IGZvdW5kOiIKK21zZ3N0ciAiR2l0IOebruW9leaXoOazleaJvuWIsDoiCisKKyM6IGdpdC1ndWkuc2g6OTI1Cittc2dpZCAiQ2Fubm90IG1vdmUgdG8gdG9wIG9mIHdvcmtpbmcgZGlyZWN0b3J5OiIKK21zZ3N0ciAi5peg5rOV56e75Yqo5Yiw5bel5L2c5qC555uu5b2VOiIKKworIzogZ2l0LWd1aS5zaDo5MzIKK21zZ2lkICJDYW5ub3QgdXNlIGZ1bm55IC5naXQgZGlyZWN0b3J5OiIKK21zZ3N0ciAi5peg5rOV5L2/55SoIC5naXQg55uu5b2VOiIKKworIzogZ2l0LWd1aS5zaDo5MzcKK21zZ2lkICJObyB3b3JraW5nIGRpcmVjdG9yeSIKK21zZ3N0ciAi5rKh5pyJ5bel5L2c55uu5b2VIgorCisjOiBnaXQtZ3VpLnNoOjEwODQgbGliL2NoZWNrb3V0X29wLnRjbDoyODMKK21zZ2lkICJSZWZyZXNoaW5nIGZpbGUgc3RhdHVzLi4uIgorbXNnc3RyICLmm7TmlrDmlofku7bnirbmgIEuLi4iCisKKyM6IGdpdC1ndWkuc2g6MTE0OQorbXNnaWQgIlNjYW5uaW5nIGZvciBtb2RpZmllZCBmaWxlcyAuLi4iCittc2dzdHIgIuaJq+aPj+S/ruaUuei/h+eahOaWh+S7tiAuLi4iCisKKyM6IGdpdC1ndWkuc2g6MTMyNCBsaWIvYnJvd3Nlci50Y2w6MjQ2Cittc2dpZCAiUmVhZHkuIgorbXNnc3RyICLlsLHnu6oiCisKKyM6IGdpdC1ndWkuc2g6MTU5MAorbXNnaWQgIlVubW9kaWZpZWQiCittc2dzdHIgIuacquS/ruaUuSIKKworIzogZ2l0LWd1aS5zaDoxNTkyCittc2dpZCAiTW9kaWZpZWQsIG5vdCBzdGFnZWQiCittc2dzdHIgIuS/ruaUueS9huacque8k+WtmCIKKworIzogZ2l0LWd1aS5zaDoxNTkzIGdpdC1ndWkuc2g6MTU5OAorbXNnaWQgIlN0YWdlZCBmb3IgY29tbWl0IgorbXNnc3RyICLnvJPlrZjkuLrmj5DkuqQiCisKKyM6IGdpdC1ndWkuc2g6MTU5NCBnaXQtZ3VpLnNoOjE1OTkKK21zZ2lkICJQb3J0aW9ucyBzdGFnZWQgZm9yIGNvbW1pdCIKK21zZ3N0ciAi6YOo5YiG57yT5a2Y5Li65o+Q5LqkIgorCisjOiBnaXQtZ3VpLnNoOjE1OTUgZ2l0LWd1aS5zaDoxNjAwCittc2dpZCAiU3RhZ2VkIGZvciBjb21taXQsIG1pc3NpbmciCittc2dzdHIgIue8k+WtmOS4uuaPkOS6pCwg5LiN5a2Y5ZyoIgorCisjOiBnaXQtZ3VpLnNoOjE1OTcKK21zZ2lkICJVbnRyYWNrZWQsIG5vdCBzdGFnZWQiCittc2dzdHIgIuacqui3n+i4qiwg5pyq57yT5a2YIgorCisjOiBnaXQtZ3VpLnNoOjE2MDIKK21zZ2lkICJNaXNzaW5nIgorbXNnc3RyICLkuI3lrZjlnKgiCisKKyM6IGdpdC1ndWkuc2g6MTYwMworbXNnaWQgIlN0YWdlZCBmb3IgcmVtb3ZhbCIKK21zZ3N0ciAi57yT5a2Y5Li65Yig6ZmkIgorCisjOiBnaXQtZ3VpLnNoOjE2MDQKK21zZ2lkICJTdGFnZWQgZm9yIHJlbW92YWwsIHN0aWxsIHByZXNlbnQiCittc2dzdHIgIue8k+WtmOS4uuWIoOmZpCwg5L2G5LuN5a2Y5ZyoIgorCisjOiBnaXQtZ3VpLnNoOjE2MDYgZ2l0LWd1aS5zaDoxNjA3IGdpdC1ndWkuc2g6MTYwOCBnaXQtZ3VpLnNoOjE2MDkKK21zZ2lkICJSZXF1aXJlcyBtZXJnZSByZXNvbHV0aW9uIgorbXNnc3RyICLpnIDopoHop6PlhrPlkIjlubblhrLnqoEiCisKKyM6IGdpdC1ndWkuc2g6MTY0NAorbXNnaWQgIlN0YXJ0aW5nIGdpdGsuLi4gcGxlYXNlIHdhaXQuLi4iCittc2dzdHIgIuWQr+WKqCBnaXRrLi4uIOivt+etieW+hS4uLiIKKworIzogZ2l0LWd1aS5zaDoxNjUzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIlVuYWJsZSB0byBzdGFydCBnaXRrOlxuIgorIlxuIgorIiVzIGRvZXMgbm90IGV4aXN0IgorbXNnc3RyICIiCisi5peg5rOV5ZCv5YqoIGdpdGs6XG4iCisiXG4iCisiJXMg5LiN5a2Y5ZyoIgorCisjOiBnaXQtZ3VpLnNoOjE4NjAgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozNgorbXNnaWQgIlJlcG9zaXRvcnkiCittc2dzdHIgIueJiOacrOW6kyhyZXBvc2l0b3J5KSIKKworIzogZ2l0LWd1aS5zaDoxODYxCittc2dpZCAiRWRpdCIKK21zZ3N0ciAi57yW6L6RIgorCisjOiBnaXQtZ3VpLnNoOjE4NjMgbGliL2Nob29zZV9yZXYudGNsOjU2MQorbXNnaWQgIkJyYW5jaCIKK21zZ3N0ciAi5YiG5pSvKGJyYW5jaCkiCisKKyM6IGdpdC1ndWkuc2g6MTg2NiBsaWIvY2hvb3NlX3Jldi50Y2w6NTQ4Cittc2dpZCAiQ29tbWl0QEBub3VuIgorbXNnc3RyICLmj5DkuqQoY29tbWl0KSIKKworIzogZ2l0LWd1aS5zaDoxODY5IGxpYi9tZXJnZS50Y2w6MTIwIGxpYi9tZXJnZS50Y2w6MTQ5IGxpYi9tZXJnZS50Y2w6MTY3Cittc2dpZCAiTWVyZ2UiCittc2dzdHIgIuWQiOW5tihtZXJnZSkiCisKKyM6IGdpdC1ndWkuc2g6MTg3MCBsaWIvY2hvb3NlX3Jldi50Y2w6NTU3Cittc2dpZCAiUmVtb3RlIgorbXNnc3RyICLov5znq68ocmVtb3RlKSIKKworIzogZ2l0LWd1aS5zaDoxODc5Cittc2dpZCAiQnJvd3NlIEN1cnJlbnQgQnJhbmNoJ3MgRmlsZXMiCittc2dzdHIgIua1j+iniOW9k+WJjeWIhuaUr+S4iueahOaWh+S7tiIKKworIzogZ2l0LWd1aS5zaDoxODgzCittc2dpZCAiQnJvd3NlIEJyYW5jaCBGaWxlcy4uLiIKK21zZ3N0ciAi5rWP6KeI5YiG5pSv5LiK55qE5paH5Lu2Li4uIgorCisjOiBnaXQtZ3VpLnNoOjE4ODgKK21zZ2lkICJWaXN1YWxpemUgQ3VycmVudCBCcmFuY2gncyBIaXN0b3J5IgorbXNnc3RyICLlm77npLrlvZPliY3liIbmlK/nmoTljoblj7IiCisKKyM6IGdpdC1ndWkuc2g6MTg5MgorbXNnaWQgIlZpc3VhbGl6ZSBBbGwgQnJhbmNoIEhpc3RvcnkiCittc2dzdHIgIuWbvuekuuaJgOacieWIhuaUr+eahOWOhuWPsiIKKworIzogZ2l0LWd1aS5zaDoxODk5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQnJvd3NlICVzJ3MgRmlsZXMiCittc2dzdHIgIua1j+iniCAlcyDkuIrnmoTmlofku7YiCisKKyM6IGdpdC1ndWkuc2g6MTkwMQorIywgdGNsLWZvcm1hdAorbXNnaWQgIlZpc3VhbGl6ZSAlcydzIEhpc3RvcnkiCittc2dzdHIgIuWbvuekuiAlcyDliIbmlK/nmoTljoblj7IiCisKKyM6IGdpdC1ndWkuc2g6MTkwNiBsaWIvZGF0YWJhc2UudGNsOjI3IGxpYi9kYXRhYmFzZS50Y2w6NjcKK21zZ2lkICJEYXRhYmFzZSBTdGF0aXN0aWNzIgorbXNnc3RyICLmlbDmja7lupPnu5/orqHkv6Hmga8iCisKKyM6IGdpdC1ndWkuc2g6MTkwOSBsaWIvZGF0YWJhc2UudGNsOjM0Cittc2dpZCAiQ29tcHJlc3MgRGF0YWJhc2UiCittc2dzdHIgIuWOi+e8qeaVsOaNruW6kyIKKworIzogZ2l0LWd1aS5zaDoxOTEyCittc2dpZCAiVmVyaWZ5IERhdGFiYXNlIgorbXNnc3RyICLpqozor4HmlbDmja7lupMiCisKKyM6IGdpdC1ndWkuc2g6MTkxOSBnaXQtZ3VpLnNoOjE5MjMgZ2l0LWd1aS5zaDoxOTI3IGxpYi9zaG9ydGN1dC50Y2w6NworIzogbGliL3Nob3J0Y3V0LnRjbDozOSBsaWIvc2hvcnRjdXQudGNsOjcxCittc2dpZCAiQ3JlYXRlIERlc2t0b3AgSWNvbiIKK21zZ3N0ciAi5Yib5bu65qGM6Z2i5Zu+5qCHIgorCisjOiBnaXQtZ3VpLnNoOjE5MzIgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxNzcgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxODUKK21zZ2lkICJRdWl0IgorbXNnc3RyICLpgIDlh7oiCisKKyM6IGdpdC1ndWkuc2g6MTkzOQorbXNnaWQgIlVuZG8iCittc2dzdHIgIuaSpOmUgCIKKworIzogZ2l0LWd1aS5zaDoxOTQyCittc2dpZCAiUmVkbyIKK21zZ3N0ciAi6YeN5YGaIgorCisjOiBnaXQtZ3VpLnNoOjE5NDYgZ2l0LWd1aS5zaDoyNDQzCittc2dpZCAiQ3V0IgorbXNnc3RyICLliarliIciCisKKyM6IGdpdC1ndWkuc2g6MTk0OSBnaXQtZ3VpLnNoOjI0NDYgZ2l0LWd1aS5zaDoyNTIwIGdpdC1ndWkuc2g6MjYxNAorIzogbGliL2NvbnNvbGUudGNsOjY5Cittc2dpZCAiQ29weSIKK21zZ3N0ciAi5aSN5Yi2IgorCisjOiBnaXQtZ3VpLnNoOjE5NTIgZ2l0LWd1aS5zaDoyNDQ5Cittc2dpZCAiUGFzdGUiCittc2dzdHIgIueymOi0tCIKKworIzogZ2l0LWd1aS5zaDoxOTU1IGdpdC1ndWkuc2g6MjQ1MiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MjYKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MzgKK21zZ2lkICJEZWxldGUiCittc2dzdHIgIuWIoOmZpCIKKworIzogZ2l0LWd1aS5zaDoxOTU5IGdpdC1ndWkuc2g6MjQ1NiBnaXQtZ3VpLnNoOjI2MTggbGliL2NvbnNvbGUudGNsOjcxCittc2dpZCAiU2VsZWN0IEFsbCIKK21zZ3N0ciAi5YWo6YCJIgorCisjOiBnaXQtZ3VpLnNoOjE5NjgKK21zZ2lkICJDcmVhdGUuLi4iCittc2dzdHIgIuaWsOW7ui4uLiIKKworIzogZ2l0LWd1aS5zaDoxOTc0Cittc2dpZCAiQ2hlY2tvdXQuLi4iCittc2dzdHIgIkNoZWNrb3V0Li4uIgorCisjOiBnaXQtZ3VpLnNoOjE5ODAKK21zZ2lkICJSZW5hbWUuLi4iCittc2dzdHIgIuabtOWQjS4uLiIKKworIzogZ2l0LWd1aS5zaDoxOTg1IGdpdC1ndWkuc2g6MjA4NQorbXNnaWQgIkRlbGV0ZS4uLiIKK21zZ3N0ciAi5Yig6ZmkLi4uIgorCisjOiBnaXQtZ3VpLnNoOjE5OTAKK21zZ2lkICJSZXNldC4uLiIKK21zZ3N0ciAi5aSN5L2NKFJlc2V0KS4uLiIKKworIzogZ2l0LWd1aS5zaDoyMDAyIGdpdC1ndWkuc2g6MjM4OQorbXNnaWQgIk5ldyBDb21taXQiCittc2dzdHIgIuaWsOW7uuaPkOS6pCIKKworIzogZ2l0LWd1aS5zaDoyMDEwIGdpdC1ndWkuc2g6MjM5NgorbXNnaWQgIkFtZW5kIExhc3QgQ29tbWl0IgorbXNnc3RyICLkv67mraPkuIrmrKHmj5DkuqQiCisKKyM6IGdpdC1ndWkuc2g6MjAxOSBnaXQtZ3VpLnNoOjIzNTYgbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDo5OQorbXNnaWQgIlJlc2NhbiIKK21zZ3N0ciAi6YeN5paw5omr5o+PIgorCisjOiBnaXQtZ3VpLnNoOjIwMjUKK21zZ2lkICJTdGFnZSBUbyBDb21taXQiCittc2dzdHIgIue8k+WtmOS4uuaPkOS6pCIKKworIzogZ2l0LWd1aS5zaDoyMDMxCittc2dpZCAiU3RhZ2UgQ2hhbmdlZCBGaWxlcyBUbyBDb21taXQiCittc2dzdHIgIue8k+WtmOS/ruaUueeahOaWh+S7tuS4uuaPkOS6pCIKKworIzogZ2l0LWd1aS5zaDoyMDM3Cittc2dpZCAiVW5zdGFnZSBGcm9tIENvbW1pdCIKK21zZ3N0ciAi5LuO5pys5qyh5o+Q5Lqk5pKk6ZmkIgorCisjOiBnaXQtZ3VpLnNoOjIwNDIgbGliL2luZGV4LnRjbDozOTUKK21zZ2lkICJSZXZlcnQgQ2hhbmdlcyIKK21zZ3N0ciAi5pKk6ZSA5L+u5pS5IgorCisjOiBnaXQtZ3VpLnNoOjIwNDkgZ2l0LWd1aS5zaDoyMzY4IGdpdC1ndWkuc2g6MjQ2NworbXNnaWQgIlNpZ24gT2ZmIgorbXNnc3RyICLnrb7lkI0oU2lnbiBPZmYpIgorCisjOiBnaXQtZ3VpLnNoOjIwNTMgZ2l0LWd1aS5zaDoyMzcyCittc2dpZCAiQ29tbWl0QEB2ZXJiIgorbXNnc3RyICLmj5DkuqQiCisKKyM6IGdpdC1ndWkuc2g6MjA2NAorbXNnaWQgIkxvY2FsIE1lcmdlLi4uIgorbXNnc3RyICLmnKzlnLDlkIjlubYuLi4iCisKKyM6IGdpdC1ndWkuc2g6MjA2OQorbXNnaWQgIkFib3J0IE1lcmdlLi4uIgorbXNnc3RyICLkuK3mraLlkIjlubYuLi4iCisKKyM6IGdpdC1ndWkuc2g6MjA4MQorbXNnaWQgIlB1c2guLi4iCittc2dzdHIgIuS4iuS8oC4uLiIKKworIzogZ2l0LWd1aS5zaDoyMDkyIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDEKK21zZ2lkICJBcHBsZSIKK21zZ3N0ciAi6Iu55p6cIgorCisjOiBnaXQtZ3VpLnNoOjIwOTUgZ2l0LWd1aS5zaDoyMTE3IGxpYi9hYm91dC50Y2w6MTQKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDQgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1MAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkFib3V0ICVzIgorbXNnc3RyICLlhbPkuo4gJXMiCisKKyM6IGdpdC1ndWkuc2g6MjA5OQorbXNnaWQgIlByZWZlcmVuY2VzLi4uIgorbXNnc3RyICLpppbpgInpobkuLi4iCisKKyM6IGdpdC1ndWkuc2g6MjEwNyBnaXQtZ3VpLnNoOjI2MzkKK21zZ2lkICJPcHRpb25zLi4uIgorbXNnc3RyICLpgInpobkuLi4iCisKKyM6IGdpdC1ndWkuc2g6MjExMyBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ3Cittc2dpZCAiSGVscCIKK21zZ3N0ciAi5biu5YqpIgorCisjOiBnaXQtZ3VpLnNoOjIxNTQKK21zZ2lkICJPbmxpbmUgRG9jdW1lbnRhdGlvbiIKK21zZ3N0ciAi5Zyo57q/5paH5qGjIgorCisjOiBnaXQtZ3VpLnNoOjIyMzgKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJmYXRhbDogY2Fubm90IHN0YXQgcGF0aCAlczogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIKK21zZ3N0ciAi6Ie05ZG96ZSZ6K+vOiDml6Dms5Xojrflj5bot6/lvoQgJXMg55qE5L+h5oGvOiDor6Xmlofku7bmiJbnm67lvZXkuI3lrZjlnKgiCisKKyM6IGdpdC1ndWkuc2g6MjI3MQorbXNnaWQgIkN1cnJlbnQgQnJhbmNoOiIKK21zZ3N0ciAi5b2T5YmN5YiG5pSvOiIKKworIzogZ2l0LWd1aS5zaDoyMjkyCittc2dpZCAiU3RhZ2VkIENoYW5nZXMgKFdpbGwgQ29tbWl0KSIKK21zZ3N0ciAi5bey57yT5a2Y55qE5pS55YqoICjlsIbooqvmj5DkuqQpIgorCisjOiBnaXQtZ3VpLnNoOjIzMTIKK21zZ2lkICJVbnN0YWdlZCBDaGFuZ2VzIgorbXNnc3RyICLmnKrnvJPlrZjnmoTmlLnliqgiCisKKyM6IGdpdC1ndWkuc2g6MjM2MgorbXNnaWQgIlN0YWdlIENoYW5nZWQiCittc2dzdHIgIue8k+WtmOaUueWKqCIKKworIzogZ2l0LWd1aS5zaDoyMzc4IGxpYi90cmFuc3BvcnQudGNsOjkzIGxpYi90cmFuc3BvcnQudGNsOjE4MgorbXNnaWQgIlB1c2giCittc2dzdHIgIuS4iuS8oCIKKworIzogZ2l0LWd1aS5zaDoyNDA4Cittc2dpZCAiSW5pdGlhbCBDb21taXQgTWVzc2FnZToiCittc2dzdHIgIuWIneWni+eahOaPkOS6pOaPj+i/sDoiCisKKyM6IGdpdC1ndWkuc2g6MjQwOQorbXNnaWQgIkFtZW5kZWQgQ29tbWl0IE1lc3NhZ2U6IgorbXNnc3RyICLkv67mraPnmoTmj5DkuqTmj4/ov7A6IgorCisjOiBnaXQtZ3VpLnNoOjI0MTAKK21zZ2lkICJBbWVuZGVkIEluaXRpYWwgQ29tbWl0IE1lc3NhZ2U6IgorbXNnc3RyICLkv67mraPnmoTliJ3lp4vmj5DkuqTmj4/ov7A6IgorCisjOiBnaXQtZ3VpLnNoOjI0MTEKK21zZ2lkICJBbWVuZGVkIE1lcmdlIENvbW1pdCBNZXNzYWdlOiIKK21zZ3N0ciAi5L+u5q2j55qE5ZCI5bm25o+Q5Lqk5o+P6L+wOiIKKworIzogZ2l0LWd1aS5zaDoyNDEyCittc2dpZCAiTWVyZ2UgQ29tbWl0IE1lc3NhZ2U6IgorbXNnc3RyICLlkIjlubbmj5DkuqTmj4/ov7A6IgorCisjOiBnaXQtZ3VpLnNoOjI0MTMKK21zZ2lkICJDb21taXQgTWVzc2FnZToiCittc2dzdHIgIuaPkOS6pOaPj+i/sDoiCisKKyM6IGdpdC1ndWkuc2g6MjQ1OSBnaXQtZ3VpLnNoOjI2MjIgbGliL2NvbnNvbGUudGNsOjczCittc2dpZCAiQ29weSBBbGwiCittc2dzdHIgIuWFqOmDqOWkjeWItiIKKworIzogZ2l0LWd1aS5zaDoyNDgzIGxpYi9ibGFtZS50Y2w6MTA3Cittc2dpZCAiRmlsZToiCittc2dzdHIgIuaWh+S7tjoiCisKKyM6IGdpdC1ndWkuc2g6MjU4OQorbXNnaWQgIkFwcGx5L1JldmVyc2UgSHVuayIKK21zZ3N0ciAi5bqU55SoL+aSpOa2iOatpOS/ruaUueWdlyIKKworIzogZ2l0LWd1aS5zaDoyNTk1Cittc2dpZCAiU2hvdyBMZXNzIENvbnRleHQiCittc2dzdHIgIuaYvuekuuabtOWwkeS4iuS4i+aWhyIKKworIzogZ2l0LWd1aS5zaDoyNjAyCittc2dpZCAiU2hvdyBNb3JlIENvbnRleHQiCittc2dzdHIgIuaYvuekuuabtOWkmuS4iuS4i+aWhyIKKworIzogZ2l0LWd1aS5zaDoyNjEwCittc2dpZCAiUmVmcmVzaCIKK21zZ3N0ciAi5Yi35pawIgorCisjOiBnaXQtZ3VpLnNoOjI2MzEKK21zZ2lkICJEZWNyZWFzZSBGb250IFNpemUiCittc2dzdHIgIue8qeWwj+Wtl+S9kyIKKworIzogZ2l0LWd1aS5zaDoyNjM1Cittc2dpZCAiSW5jcmVhc2UgRm9udCBTaXplIgorbXNnc3RyICLmlL7lpKflrZfkvZMiCisKKyM6IGdpdC1ndWkuc2g6MjY0NgorbXNnaWQgIlVuc3RhZ2UgSHVuayBGcm9tIENvbW1pdCIKK21zZ3N0ciAi5LuO5o+Q5Lqk5Lit5pKk6Zmk5L+u5pS55Z2XIgorCisjOiBnaXQtZ3VpLnNoOjI2NDgKK21zZ2lkICJTdGFnZSBIdW5rIEZvciBDb21taXQiCittc2dzdHIgIue8k+WtmOS/ruaUueWdl+S4uuaPkOS6pCIKKworIzogZ2l0LWd1aS5zaDoyNjY3Cittc2dpZCAiSW5pdGlhbGl6aW5nLi4uIgorbXNnc3RyICLliJ3lp4vljJYuLi4iCisKKyM6IGdpdC1ndWkuc2g6Mjc2MgorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJQb3NzaWJsZSBlbnZpcm9ubWVudCBpc3N1ZXMgZXhpc3QuXG4iCisiXG4iCisiVGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHByb2JhYmx5XG4iCisiZ29pbmcgdG8gYmUgaWdub3JlZCBieSBhbnkgR2l0IHN1YnByb2Nlc3MgcnVuXG4iCisiYnkgJXM6XG4iCisiXG4iCittc2dzdHIgIiIKKyLlj6/og73lrZjlnKjnjq/looPlj5jph4/nmoTpl67popguXG4iCisiXG4iCisi55SxICVzIOaJp+ihjOeahCBHaXQg5a2Q6L+b56iL5Y+v6IO95b+955Wl5LiL5YiX546v5aKD5Y+Y6YePOlxuIgorIlxuIgorCisjOiBnaXQtZ3VpLnNoOjI3OTIKK21zZ2lkICIiCisiXG4iCisiVGhpcyBpcyBkdWUgdG8gYSBrbm93biBpc3N1ZSB3aXRoIHRoZVxuIgorIlRjbCBiaW5hcnkgZGlzdHJpYnV0ZWQgYnkgQ3lnd2luLiIKK21zZ3N0ciAiIgorIlxuIgorIui/meaYr+eUsSBDeWd3aW4g5Y+R5biD55qEIFRjbCDku6PnoIHkuK3kuIDkuKpcbiIKKyLlt7Lnn6Xpl67popjmiYDlvJXotbcuIgorCisjOiBnaXQtZ3VpLnNoOjI3OTcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiXG4iCisiQSBnb29kIHJlcGxhY2VtZW50IGZvciAlc1xuIgorImlzIHBsYWNpbmcgdmFsdWVzIGZvciB0aGUgdXNlci5uYW1lIGFuZFxuIgorInVzZXIuZW1haWwgc2V0dGluZ3MgaW50byB5b3VyIHBlcnNvbmFsXG4iCisifi8uZ2l0Y29uZmlnIGZpbGUuXG4iCittc2dzdHIgIiIKKyJcbiIKKyJcbiIKKyIlcyDnmoTkuIDkuKrlvojlpb3nmoTmm7/ku6PmlrnmoYjmmK/lsIYgdXNlci5uYW1lIOS7peWPilxuIgorInVzZXIuZW1haWwg6K6+572u5pS+5Zyo5L2g55qE5Liq5Lq6IH4vLmdpdGNvbmZpZyDmlofku7bkuK0uXG4iCisKKyM6IGxpYi9hYm91dC50Y2w6MjYKK21zZ2lkICJnaXQtZ3VpIC0gYSBncmFwaGljYWwgdXNlciBpbnRlcmZhY2UgZm9yIEdpdC4iCittc2dzdHIgImdpdC1ndWkgLSBHaXQg55qE5Zu+5b2i5YyW55So5oi355WM6Z2iIgorCisjOiBsaWIvYmxhbWUudGNsOjc3Cittc2dpZCAiRmlsZSBWaWV3ZXIiCittc2dzdHIgIuaWh+S7tuafpeeci+WZqCIKKworIzogbGliL2JsYW1lLnRjbDo4MQorbXNnaWQgIkNvbW1pdDoiCittc2dzdHIgIuaPkOS6pDoiCisKKyM6IGxpYi9ibGFtZS50Y2w6MjY0Cittc2dpZCAiQ29weSBDb21taXQiCittc2dzdHIgIuWkjeWItuaPkOS6pCIKKworIzogbGliL2JsYW1lLnRjbDozODQKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJSZWFkaW5nICVzLi4uIgorbXNnc3RyICLor7vlj5YgJXMuLi4iCisKKyM6IGxpYi9ibGFtZS50Y2w6NDg4Cittc2dpZCAiTG9hZGluZyBjb3B5L21vdmUgdHJhY2tpbmcgYW5ub3RhdGlvbnMuLi4iCittc2dzdHIgIuijhei9veWkjeWIti/np7vliqjot5/ouKrmoIfms6guLi4iCisKKyM6IGxpYi9ibGFtZS50Y2w6NTA4Cittc2dpZCAibGluZXMgYW5ub3RhdGVkIgorbXNnc3RyICLmoIfms6jooYwiCisKKyM6IGxpYi9ibGFtZS50Y2w6Njg5Cittc2dpZCAiTG9hZGluZyBvcmlnaW5hbCBsb2NhdGlvbiBhbm5vdGF0aW9ucy4uLiIKK21zZ3N0ciAi6KOF6L295Y6f5aeL5L2N572u5qCH5rOoLi4uIgorCisjOiBsaWIvYmxhbWUudGNsOjY5MgorbXNnaWQgIkFubm90YXRpb24gY29tcGxldGUuIgorbXNnc3RyICLmoIfms6jlrozmiJAuIgorCisjOiBsaWIvYmxhbWUudGNsOjc0NgorbXNnaWQgIkxvYWRpbmcgYW5ub3RhdGlvbi4uLiIKK21zZ3N0ciAi6KOd6LyJ5qCH5rOoLi4uIgorCisjOiBsaWIvYmxhbWUudGNsOjgwMgorbXNnaWQgIkF1dGhvcjoiCittc2dzdHIgIuS9nOiAhToiCisKKyM6IGxpYi9ibGFtZS50Y2w6ODA2Cittc2dpZCAiQ29tbWl0dGVyOiIKK21zZ3N0ciAi5o+Q5Lqk6ICFOiIKKworIzogbGliL2JsYW1lLnRjbDo4MTEKK21zZ2lkICJPcmlnaW5hbCBGaWxlOiIKK21zZ3N0ciAi5Y6f5aeL5paH5Lu2OiIKKworIzogbGliL2JsYW1lLnRjbDo5MjUKK21zZ2lkICJPcmlnaW5hbGx5IEJ5OiIKK21zZ3N0ciAi5pyA5Yid55SxOiIKKworIzogbGliL2JsYW1lLnRjbDo5MzEKK21zZ2lkICJJbiBGaWxlOiIKK21zZ3N0ciAi5Zyo5paH5Lu2OiIKKworIzogbGliL2JsYW1lLnRjbDo5MzYKK21zZ2lkICJDb3BpZWQgT3IgTW92ZWQgSGVyZSBCeToiCittc2dzdHIgIueUseWkjeWItuaIluenu+WKqOiHs+atpDoiCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjE0IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjE5Cittc2dpZCAiQ2hlY2tvdXQgQnJhbmNoIgorbXNnc3RyICJDaGVja291dCDliIbmlK8iCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjIzCittc2dpZCAiQ2hlY2tvdXQiCittc2dzdHIgIkNoZWNrb3V0IgorCisjOiBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDoyNyBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MzUKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDozMiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MzAgbGliL2Jyb3dzZXIudGNsOjI4MgorIzogbGliL2NoZWNrb3V0X29wLnRjbDo1MjIgbGliL2Nob29zZV9mb250LnRjbDo0MyBsaWIvbWVyZ2UudGNsOjE3MQorIzogbGliL29wdGlvbi50Y2w6MTAzIGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6NDIgbGliL3RyYW5zcG9ydC50Y2w6OTcKK21zZ2lkICJDYW5jZWwiCittc2dzdHIgIuWPlua2iCIKKworIzogbGliL2JyYW5jaF9jaGVja291dC50Y2w6MzIgbGliL2Jyb3dzZXIudGNsOjI4NworbXNnaWQgIlJldmlzaW9uIgorbXNnc3RyICLniYjmnKwiCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjM2IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo2OSBsaWIvb3B0aW9uLnRjbDoyNDIKK21zZ2lkICJPcHRpb25zIgorbXNnc3RyICLpgInpobkuLi4iCisKKyM6IGxpYi9icmFuY2hfY2hlY2tvdXQudGNsOjM5IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo5MgorbXNnaWQgIkZldGNoIFRyYWNraW5nIEJyYW5jaCIKK21zZ3N0ciAi6I635Y+W6Lef6Liq5YiG5pSvIgorCisjOiBsaWIvYnJhbmNoX2NoZWNrb3V0LnRjbDo0NAorbXNnaWQgIkRldGFjaCBGcm9tIExvY2FsIEJyYW5jaCIKK21zZ3N0ciAi5LuO5pys5Zyw5YiG5pSv6ISx56a7IgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MjIKK21zZ2lkICJDcmVhdGUgQnJhbmNoIgorbXNnc3RyICLliJvlu7rliIbmlK8iCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDoyNworbXNnaWQgIkNyZWF0ZSBOZXcgQnJhbmNoIgorbXNnc3RyICLmlrDlu7rliIbmlK8iCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDozMSBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjM3MQorbXNnaWQgIkNyZWF0ZSIKK21zZ3N0ciAi5paw5bu6IgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NDAKK21zZ2lkICJCcmFuY2ggTmFtZSIKK21zZ3N0ciAi5YiG5pSv5ZCNIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6NDMKK21zZ2lkICJOYW1lOiIKK21zZ3N0ciAi5ZCN5a2XOiIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjU4Cittc2dpZCAiTWF0Y2ggVHJhY2tpbmcgQnJhbmNoIE5hbWUiCittc2dzdHIgIuWMuemFjei3n+i4quWIhuaUr+WQjeWtlyIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjY2Cittc2dpZCAiU3RhcnRpbmcgUmV2aXNpb24iCittc2dzdHIgIui1t+Wni+eJiOacrCIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjcyCittc2dpZCAiVXBkYXRlIEV4aXN0aW5nIEJyYW5jaDoiCittc2dzdHIgIuabtOaWsOW3suacieWIhuaUrzoiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo3NQorbXNnaWQgIk5vIgorbXNnc3RyICLlj7fnoIEiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo4MAorbXNnaWQgIkZhc3QgRm9yd2FyZCBPbmx5IgorbXNnc3RyICLku4Xlv6vpgJ/lkIjlubYiCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo4NSBsaWIvY2hlY2tvdXRfb3AudGNsOjUxNAorbXNnaWQgIlJlc2V0IgorbXNnc3RyICLlpI3kvY0iCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDo5NworbXNnaWQgIkNoZWNrb3V0IEFmdGVyIENyZWF0aW9uIgorbXNnc3RyICLlnKjliJvlu7rlkI5DaGVja291dCIKKworIzogbGliL2JyYW5jaF9jcmVhdGUudGNsOjEzMQorbXNnaWQgIlBsZWFzZSBzZWxlY3QgYSB0cmFja2luZyBicmFuY2guIgorbXNnc3RyICLor7fpgInmi6nmn5DkuKrot5/ouKrliIbmlK8uIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MTQwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVHJhY2tpbmcgYnJhbmNoICVzIGlzIG5vdCBhIGJyYW5jaCBpbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnkuIgorbXNnc3RyICLot5/ouKrliIbmlK8gJXMg5bm25LiN5piv6L+c56uv54mI5pys5bqT5Lit55qE5LiA5Liq5YiG5pSvIgorCisjOiBsaWIvYnJhbmNoX2NyZWF0ZS50Y2w6MTUzIGxpYi9icmFuY2hfcmVuYW1lLnRjbDo4NgorbXNnaWQgIlBsZWFzZSBzdXBwbHkgYSBicmFuY2ggbmFtZS4iCittc2dzdHIgIuivt+aPkOS+m+WIhuaUr+WQjeWtly4iCisKKyM6IGxpYi9icmFuY2hfY3JlYXRlLnRjbDoxNjQgbGliL2JyYW5jaF9yZW5hbWUudGNsOjEwNgorIywgdGNsLWZvcm1hdAorbXNnaWQgIiclcycgaXMgbm90IGFuIGFjY2VwdGFibGUgYnJhbmNoIG5hbWUuIgorbXNnc3RyICInJXMn5LiN5piv5LiA5Liq5Y+v5o6l5Y+X55qE5YiG5pSv5ZCNLiIKKworIzogbGliL2JyYW5jaF9kZWxldGUudGNsOjE1Cittc2dpZCAiRGVsZXRlIEJyYW5jaCIKK21zZ3N0ciAi5Yig6Zmk5YiG5pSvIgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MjAKK21zZ2lkICJEZWxldGUgTG9jYWwgQnJhbmNoIgorbXNnc3RyICLliKDpmaTmnKzlnLDliIbmlK8iCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDozNworbXNnaWQgIkxvY2FsIEJyYW5jaGVzIgorbXNnc3RyICLmnKzlnLDliIbmlK8iCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDo1MgorbXNnaWQgIkRlbGV0ZSBPbmx5IElmIE1lcmdlZCBJbnRvIgorbXNnc3RyICLku4XlnKjlkIjlubblkI7liKDpmaQiCisKKyM6IGxpYi9icmFuY2hfZGVsZXRlLnRjbDo1NAorbXNnaWQgIkFsd2F5cyAoRG8gbm90IHBlcmZvcm0gbWVyZ2UgdGVzdC4pIgorbXNnc3RyICLmgLvmmK/lkIjlubYgKOS4jeS9nOWQiOW5tua1i+ivlS4pIgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MTAzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiVGhlIGZvbGxvd2luZyBicmFuY2hlcyBhcmUgbm90IGNvbXBsZXRlbHkgbWVyZ2VkIGludG8gJXM6IgorbXNnc3RyICLkuIvliJfliIbmlK/msqHmnInlrozlhajooqvlkIjlubbliLAgJXM6IgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MTE1Cittc2dpZCAiIgorIlJlY292ZXJpbmcgZGVsZXRlZCBicmFuY2hlcyBpcyBkaWZmaWN1bHQuIFxuIgorIlxuIgorIiBEZWxldGUgdGhlIHNlbGVjdGVkIGJyYW5jaGVzPyIKK21zZ3N0ciAiIgorIuaBouWkjeiiq+WIoOmZpOeahOWIhuaUr+mdnuW4uOWbsOmavi5cbiIKKyJcbiIKKyLmmK/lkKbopoHliKDpmaTmiYDpgInliIbmlK8/IgorCisjOiBsaWIvYnJhbmNoX2RlbGV0ZS50Y2w6MTQxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBkZWxldGUgYnJhbmNoZXM6XG4iCisiJXMiCittc2dzdHIgIiIKKyLml6Dms5XliKDpmaTliIbmlK86XG4iCisiJXMiCisKKyM6IGxpYi9icmFuY2hfcmVuYW1lLnRjbDoxNCBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MjIKK21zZ2lkICJSZW5hbWUgQnJhbmNoIgorbXNnc3RyICLmm7TmlLnliIbmlK/lkI06IgorCisjOiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6MjYKK21zZ2lkICJSZW5hbWUiCittc2dzdHIgIuabtOWQjS4uLiIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjM2Cittc2dpZCAiQnJhbmNoOiIKK21zZ3N0ciAi5YiG5pSvOiIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjM5Cittc2dpZCAiTmV3IE5hbWU6IgorbXNnc3RyICLmlrDlkI3lrZc6IgorCisjOiBsaWIvYnJhbmNoX3JlbmFtZS50Y2w6NzUKK21zZ2lkICJQbGVhc2Ugc2VsZWN0IGEgYnJhbmNoIHRvIHJlbmFtZS4iCittc2dzdHIgIuivt+mAieaLqeWIhuaUr+abtOWQjS4iCisKKyM6IGxpYi9icmFuY2hfcmVuYW1lLnRjbDo5NiBsaWIvY2hlY2tvdXRfb3AudGNsOjE3OQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkJyYW5jaCAnJXMnIGFscmVhZHkgZXhpc3RzLiIKK21zZ3N0ciAi5YiG5pSvICclcycg5bey57uP5a2Y5ZyoLiIKKworIzogbGliL2JyYW5jaF9yZW5hbWUudGNsOjExNworIywgdGNsLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byByZW5hbWUgJyVzJy4iCittc2dzdHIgIuaXoOazleabtOWQjSAnJXMnLiIKKworIzogbGliL2Jyb3dzZXIudGNsOjE3Cittc2dpZCAiU3RhcnRpbmcuLi4iCittc2dzdHIgIuW8gOWniy4uLiIKKworIzogbGliL2Jyb3dzZXIudGNsOjI2Cittc2dpZCAiRmlsZSBCcm93c2VyIgorbXNnc3RyICLmlofku7bmtY/op4jlmagiCisKKyM6IGxpYi9icm93c2VyLnRjbDoxMjYgbGliL2Jyb3dzZXIudGNsOjE0MworIywgdGNsLWZvcm1hdAorbXNnaWQgIkxvYWRpbmcgJXMuLi4iCittc2dzdHIgIuijhei9vSAlcy4uLiIKKworIzogbGliL2Jyb3dzZXIudGNsOjE4NworbXNnaWQgIltVcCBUbyBQYXJlbnRdIgorbXNnc3RyICJb5LiK5bGC55uu5b2VXSIKKworIzogbGliL2Jyb3dzZXIudGNsOjI2NyBsaWIvYnJvd3Nlci50Y2w6MjczCittc2dpZCAiQnJvd3NlIEJyYW5jaCBGaWxlcyIKK21zZ3N0ciAi5rWP6KeI5YiG5pSv5paH5Lu2IgorCisjOiBsaWIvYnJvd3Nlci50Y2w6Mjc4IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6Mzg3CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ3NCBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ4NAorIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5ODcKK21zZ2lkICJCcm93c2UiCittc2dzdHIgIua1j+iniCIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDo3OQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkZldGNoaW5nICVzIGZyb20gJXMiCittc2dzdHIgIuiOt+WPliAlcyDoh6ogJXMiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MTI3CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiZmF0YWw6IENhbm5vdCByZXNvbHZlICVzIgorbXNnc3RyICLoh7Tlkb3plJnor686IOaXoOazleino+WGsyAlcyIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoxNDAgbGliL2NvbnNvbGUudGNsOjgxIGxpYi9kYXRhYmFzZS50Y2w6MzEKK21zZ2lkICJDbG9zZSIKK21zZ3N0ciAi5YWz6ZetIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjE2OQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkJyYW5jaCAnJXMnIGRvZXMgbm90IGV4aXN0LiIKK21zZ3N0ciAi5YiG5pSvICclcycg5bm25LiN5a2Y5ZyoLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoyMDYKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiQnJhbmNoICclcycgYWxyZWFkeSBleGlzdHMuXG4iCisiXG4iCisiSXQgY2Fubm90IGZhc3QtZm9yd2FyZCB0byAlcy5cbiIKKyJBIG1lcmdlIGlzIHJlcXVpcmVkLiIKK21zZ3N0ciAiIgorIuWIhuaUryAnJXMnIOW3sue7j+WtmOWcqC5cbiIKKyJcbiIKKyLml6Dms5Xlv6vpgJ/lkIjlubbliLAgJXMuXG4iCisi6ZyA6KaB5pmu6YCa5ZCI5bm2LiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoyMjAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJNZXJnZSBzdHJhdGVneSAnJXMnIG5vdCBzdXBwb3J0ZWQuIgorbXNnc3RyICLlkIjlubbnrZbnlaUgJyVzJyDkuI3mlK/mjIEuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjIzOQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byB1cGRhdGUgJyVzJy4iCittc2dzdHIgIuaXoOazleabtOaWsCAnJXMnLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDoyNTEKK21zZ2lkICJTdGFnaW5nIGFyZWEgKGluZGV4KSBpcyBhbHJlYWR5IGxvY2tlZC4iCittc2dzdHIgIue8k+WtmOWMuuWfnyAoaW5kZXgpIOW3suiiq+mUgeWumi4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MjY2Cittc2dpZCAiIgorIkxhc3Qgc2Nhbm5lZCBzdGF0ZSBkb2VzIG5vdCBtYXRjaCByZXBvc2l0b3J5IHN0YXRlLlxuIgorIlxuIgorIkFub3RoZXIgR2l0IHByb2dyYW0gaGFzIG1vZGlmaWVkIHRoaXMgcmVwb3NpdG9yeSBzaW5jZSB0aGUgbGFzdCBzY2FuLiAgQSAiCisicmVzY2FuIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSB0aGUgY3VycmVudCBicmFuY2ggY2FuIGJlIGNoYW5nZWQuXG4iCisiXG4iCisiVGhlIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBub3cuXG4iCittc2dzdHIgIiIKKyLmnIDlkI7kuIDmrKHmiavmj4/nmoTnirbmgIHlkozlvZPliY3niYjmnKzlupPnirbmgIHkuI3nrKYuXG4iCisiXG4iCisi5Y+m5LiAIEdpdCDnqIvluo/oh6rkuIrmrKHmiavmj4/lkI7kv67mlLnkuobmnKzniYjmnKzlupMuIOWcqOS/ruaUueW9k+WJjeWIhuaUr+S5i+WJjemcgOimgemHjeaWsOWBmuS4gOasoeaJqyIKKyLmj48uXG4iCisiXG4iCisi6YeN5paw5omr5o+P5bCG6Ieq5Yqo5byA5aeLLlxuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjMyMgorIywgdGNsLWZvcm1hdAorbXNnaWQgIlVwZGF0aW5nIHdvcmtpbmcgZGlyZWN0b3J5IHRvICclcycuLi4iCittc2dzdHIgIuabtOaWsOW3peS9nOebruW9leWIsCAnJXMnLi4uIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjMyMworbXNnaWQgImZpbGVzIGNoZWNrZWQgb3V0IgorbXNnc3RyICIiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MzUzCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiQWJvcnRlZCBjaGVja291dCBvZiAnJXMnIChmaWxlIGxldmVsIG1lcmdpbmcgaXMgcmVxdWlyZWQpLiIKK21zZ3N0ciAi5Lit5q2iICclcycg55qEIGNoZWNrb3V0IOaTjeS9nCAo6ZyA6KaB5YGa5paH5Lu257qn5ZCI5bm2KS4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MzU0Cittc2dpZCAiRmlsZSBsZXZlbCBtZXJnZSByZXF1aXJlZC4iCittc2dzdHIgIumcgOimgeaWh+S7tue6p+WQiOW5ti4iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6MzU4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiU3RheWluZyBvbiBicmFuY2ggJyVzJy4iCittc2dzdHIgIuWBnOeVmeWcqOWIhuaUryAnJXMnLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDo0MjkKK21zZ2lkICIiCisiWW91IGFyZSBubyBsb25nZXIgb24gYSBsb2NhbCBicmFuY2guXG4iCisiXG4iCisiSWYgeW91IHdhbnRlZCB0byBiZSBvbiBhIGJyYW5jaCwgY3JlYXRlIG9uZSBub3cgc3RhcnRpbmcgZnJvbSAnVGhpcyBEZXRhY2hlZCAiCisiQ2hlY2tvdXQnLiIKK21zZ3N0ciAiIgorIuS9oOS4jeWcqOafkOS4quacrOWcsOWIhuaUr+S4ii5cbiIKKyJcbiIKKyLlpoLmnpzkvaDmg7PkvY3kuo7mn5DliIbmlK/kuIosIOS7juW9k+WJjeiEseiKgueahENoZWNrb3V05Lit5Yib5bu65LiA5Liq5paw5YiG5pSvLiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDo0NDYgbGliL2NoZWNrb3V0X29wLnRjbDo0NTAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJDaGVja2VkIG91dCAnJXMnLiIKK21zZ3N0ciAiJyVzJyDlt7LooqsgY2hlY2tvdXQiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NDc4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUmVzZXR0aW5nICclcycgdG8gJyVzJyB3aWxsIGxvc2UgdGhlIGZvbGxvd2luZyBjb21taXRzOiIKK21zZ3N0ciAi5aSN5L2NICclcycg5YiwICclcycg5bCG5a+86Ie05LiL5YiX5o+Q5Lqk55qE5Lii5aSxOiIKKworIzogbGliL2NoZWNrb3V0X29wLnRjbDo1MDAKK21zZ2lkICJSZWNvdmVyaW5nIGxvc3QgY29tbWl0cyBtYXkgbm90IGJlIGVhc3kuIgorbXNnc3RyICLmgaLlpI3kuKLlpLHnmoTmj5DkuqTmmK/mr5TovoPlm7Dpmr7nmoQuIgorCisjOiBsaWIvY2hlY2tvdXRfb3AudGNsOjUwNQorIywgdGNsLWZvcm1hdAorbXNnaWQgIlJlc2V0ICclcyc/IgorbXNnc3RyICLlpI3kvY0gJyVzJz8iCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NTEwIGxpYi9tZXJnZS50Y2w6MTYzCittc2dpZCAiVmlzdWFsaXplIgorbXNnc3RyICLlm77npLoiCisKKyM6IGxpYi9jaGVja291dF9vcC50Y2w6NTc4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBzZXQgY3VycmVudCBicmFuY2guXG4iCisiXG4iCisiVGhpcyB3b3JraW5nIGRpcmVjdG9yeSBpcyBvbmx5IHBhcnRpYWxseSBzd2l0Y2hlZC4gIFdlIHN1Y2Nlc3NmdWxseSB1cGRhdGVkICIKKyJ5b3VyIGZpbGVzLCBidXQgZmFpbGVkIHRvIHVwZGF0ZSBhbiBpbnRlcm5hbCBHaXQgZmlsZS5cbiIKKyJcbiIKKyJUaGlzIHNob3VsZCBub3QgaGF2ZSBvY2N1cnJlZC4gICVzIHdpbGwgbm93IGNsb3NlIGFuZCBnaXZlIHVwLiIKK21zZ3N0ciAiIgorIuaXoOazleiuvuWumuW9k+WJjeWIhuaUry5cbiIKKyJcbiIKKyLlvZPliY3lt6XkvZznm67lvZXku4XmnInpg6jliIbooqvliIfmjaLlh7osIOaIkeS7rOW3suaIkOWKn+eahOabtOaWsOS6huaCqOeahOaWh+S7tuS9huaYr+aXoOazleabtOaWsOafkOS4quWGhemDqCIKKyLnmoRHaXTmlofku7YuXG4iCisiXG4iCisi6L+Z5pys5LiN6K+l5Y+R55SfLCAlcyDlsIblhbPpl63lubbmlL7lvIMuIgorCisjOiBsaWIvY2hvb3NlX2ZvbnQudGNsOjM5Cittc2dpZCAiU2VsZWN0IgorbXNnc3RyICLpgInmi6kiCisKKyM6IGxpYi9jaG9vc2VfZm9udC50Y2w6NTMKK21zZ2lkICJGb250IEZhbWlseSIKK21zZ3N0ciAi5a2X5L2T5pePIgorCisjOiBsaWIvY2hvb3NlX2ZvbnQudGNsOjc0Cittc2dpZCAiRm9udCBTaXplIgorbXNnc3RyICLlrZfkvZPlpKflsI8iCisKKyM6IGxpYi9jaG9vc2VfZm9udC50Y2w6OTEKK21zZ2lkICJGb250IEV4YW1wbGUiCittc2dzdHIgIuWtl+S9k+agt+S+iyIKKworIzogbGliL2Nob29zZV9mb250LnRjbDoxMDMKK21zZ2lkICIiCisiVGhpcyBpcyBleGFtcGxlIHRleHQuXG4iCisiSWYgeW91IGxpa2UgdGhpcyB0ZXh0LCBpdCBjYW4gYmUgeW91ciBmb250LiIKK21zZ3N0ciAiIgorIui/meaYr+agt+S+i+aWh+acrC5cbiIKKyLlpoLmnpzkvaDllpzmrKIsIOS9oOWPr+S7peiuvue9ruivpeWtl+S9ky4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MjgKK21zZ2lkICJHaXQgR3VpIgorbXNnc3RyICJHaXQgR3VpIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjgxIGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6Mzc2Cittc2dpZCAiQ3JlYXRlIE5ldyBSZXBvc2l0b3J5IgorbXNnc3RyICLliJvlu7rmlrDnmoTniYjmnKzlupMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODcKK21zZ2lkICJOZXcuLi4iCittc2dzdHIgIuaWsOW7ui4uLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5NCBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ2MAorbXNnaWQgIkNsb25lIEV4aXN0aW5nIFJlcG9zaXRvcnkiCittc2dzdHIgIuWFi+mahuW3suacieeJiOacrOW6kyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMDAKK21zZ2lkICJDbG9uZS4uLiIKK21zZ3N0ciAi5YWL6ZqGLi4uIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEwNyBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjk3NgorbXNnaWQgIk9wZW4gRXhpc3RpbmcgUmVwb3NpdG9yeSIKK21zZ3N0ciAi5omT5byA5bey5pyJ54mI5pys5bqTIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjExMworbXNnaWQgIk9wZW4uLi4iCittc2dzdHIgIuaJk+W8gC4uLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMjYKK21zZ2lkICJSZWNlbnQgUmVwb3NpdG9yaWVzIgorbXNnc3RyICLmnIDov5HniYjmnKzlupMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTMyCittc2dpZCAiT3BlbiBSZWNlbnQgUmVwb3NpdG9yeToiCittc2dzdHIgIuaJk+W8gOacgOi/keeJiOacrOW6kyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoyOTYgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozMDMKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MzEwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNyZWF0ZSByZXBvc2l0b3J5ICVzOiIKK21zZ3N0ciAi5peg5rOV5Yib5bu654mI5pys5bqTICVzOiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDozODEgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0NzgKK21zZ2lkICJEaXJlY3Rvcnk6IgorbXNnc3RyICLnm67lvZU6IgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQxMiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjUzNworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMDExCittc2dpZCAiR2l0IFJlcG9zaXRvcnkiCittc2dzdHIgIkdpdCDniYjmnKzlupMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDM3CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRGlyZWN0b3J5ICVzIGFscmVhZHkgZXhpc3RzLiIKK21zZ3N0ciAi55uu5b2VICVzIOW3sue7j+WtmOWcqC4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDQxCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiRmlsZSAlcyBhbHJlYWR5IGV4aXN0cy4iCittc2dzdHIgIuaWh+S7tiAlcyDlt7Lnu4/lrZjlnKguIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjQ1NQorbXNnaWQgIkNsb25lIgorbXNnc3RyICLlhYvpmoYiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NDY4Cittc2dpZCAiVVJMOiIKK21zZ3N0ciAiVVJMOiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0ODkKK21zZ2lkICJDbG9uZSBUeXBlOiIKK21zZ3N0ciAi5YWL6ZqG57G75Z6LOiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo0OTUKK21zZ2lkICJTdGFuZGFyZCAoRmFzdCwgU2VtaS1SZWR1bmRhbnQsIEhhcmRsaW5rcykiCittc2dzdHIgIuagh+WHhuaWueW8jyAo5b+r6YCfLCDpg6jliIblpIfku70sIOS9nOehrOi/nuaOpSkiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTAxCittc2dpZCAiRnVsbCBDb3B5IChTbG93ZXIsIFJlZHVuZGFudCBCYWNrdXApIgorbXNnc3RyICLlhajpg6jlpI3liLYgKOi+g+aFoiwg5YGa5aSH5Lu9KSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1MDcKK21zZ2lkICJTaGFyZWQgKEZhc3Rlc3QsIE5vdCBSZWNvbW1lbmRlZCwgTm8gQmFja3VwKSIKK21zZ3N0ciAi5YWx5Lqr5pa55byPICjmnIDlv6ssIOS4jeaOqOiNkCwg5LiN5YGa5aSH5Lu9KSIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1NDMgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo1OTAKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzM2IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODA2CisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjEwMTcgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDoxMDI1CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiTm90IGEgR2l0IHJlcG9zaXRvcnk6ICVzIgorbXNnc3RyICLkuI3mmK/kuIDkuKogR2l0IOeJiOacrOW6kzogJXMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NTc5Cittc2dpZCAiU3RhbmRhcmQgb25seSBhdmFpbGFibGUgZm9yIGxvY2FsIHJlcG9zaXRvcnkuIgorbXNnc3RyICLmoIflh4bmlrnlvI/ku4XlvZPmmK/mnKzlnLDniYjmnKzlupPml7bmnInmlYguIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjU4MworbXNnaWQgIlNoYXJlZCBvbmx5IGF2YWlsYWJsZSBmb3IgbG9jYWwgcmVwb3NpdG9yeS4iCittc2dzdHIgIuWFseS6q+aWueW8j+S7heW9k+aYr+acrOWcsOeJiOacrOW6k+aXtuacieaViC4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NjA0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiTG9jYXRpb24gJXMgYWxyZWFkeSBleGlzdHMuIgorbXNnc3RyICLkvY3nva4gJXMg5bey57uP5a2Y5ZyoLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo2MTUKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIG9yaWdpbiIKK21zZ3N0ciAi5peg5rOV6YWN572uIG9yaWdpbiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo2MjcKK21zZ2lkICJDb3VudGluZyBvYmplY3RzIgorbXNnc3RyICLmuIXngrnlr7nosaEiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NjI4CisjLCBmdXp6eQorbXNnaWQgImJ1Y2tldHMiCittc2dzdHIgIuawtOahtj8/IgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjY1MgorIywgdGNsLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBjb3B5IG9iamVjdHMvaW5mby9hbHRlcm5hdGVzOiAlcyIKK21zZ3N0ciAi5peg5rOV5aSN5Yi2IG9iamVjdHMvaW5mby9hbHRlcm5hdGVzOiAlcyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo2ODgKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJOb3RoaW5nIHRvIGNsb25lIGZyb20gJXMuIgorbXNnc3RyICLmsqHmnInkuJzopb/lj6/ku44gJXMg5YWL6ZqGLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo2OTAgbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5MDQKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTE2Cittc2dpZCAiVGhlICdtYXN0ZXInIGJyYW5jaCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIgorbXNnc3RyICInbWFzdGVyJ+WIhuaUr+WwmuacquWIneWni+WMli4iCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzAzCittc2dpZCAiSGFyZGxpbmtzIGFyZSB1bmF2YWlsYWJsZS4gIEZhbGxpbmcgYmFjayB0byBjb3B5aW5nLiIKK21zZ3N0ciAi56Gs6L+e5o6l5LiN5Y+v55SoLiDkvb/nlKjlpI3liLYuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjcxNQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkNsb25pbmcgZnJvbSAlcyIKK21zZ3N0ciAi5LuOICVzIOWFi+mahiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3NDYKK21zZ2lkICJDb3B5aW5nIG9iamVjdHMiCittc2dzdHIgIuWkjeWItiBvYmplY3RzIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjc0NworbXNnaWQgIktpQiIKK21zZ3N0ciAiS2lCIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjc3MQorIywgdGNsLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBjb3B5IG9iamVjdDogJXMiCittc2dzdHIgIuaXoOazleWkjeWItiBvYmplY3Q6ICVzIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjc4MQorbXNnaWQgIkxpbmtpbmcgb2JqZWN0cyIKK21zZ3N0ciAi6ZO+5o6lIG9iamVjdHMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6NzgyCittc2dpZCAib2JqZWN0cyIKK21zZ3N0ciAib2JqZWN0cyIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo3OTAKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gaGFyZGxpbmsgb2JqZWN0OiAlcyIKK21zZ3N0ciAi5peg5rOV56Gs6ZO+5o6lIG9iamVjdDogJXMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODQ1Cittc2dpZCAiQ2Fubm90IGZldGNoIGJyYW5jaGVzIGFuZCBvYmplY3RzLiAgU2VlIGNvbnNvbGUgb3V0cHV0IGZvciBkZXRhaWxzLiIKK21zZ3N0ciAi5peg5rOV6I635Y+W5YiG5pSv5ZKM5a+56LGhLiDor7fmn6XnnIvmjqfliLbnu4jnq6/nmoTovpPlh7ouIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjg1NgorbXNnaWQgIkNhbm5vdCBmZXRjaCB0YWdzLiAgU2VlIGNvbnNvbGUgb3V0cHV0IGZvciBkZXRhaWxzLiIKK21zZ3N0ciAi5peg5rOV6I635Y+W5qCH562+LiDor7fmn6XnnIvmjqfliLbnu4jnq6/nmoTovpPlh7ouIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjg4MAorbXNnaWQgIkNhbm5vdCBkZXRlcm1pbmUgSEVBRC4gIFNlZSBjb25zb2xlIG91dHB1dCBmb3IgZGV0YWlscy4iCittc2dzdHIgIuaXoOazleehruWumiBIRUFELiDor7fmn6XnnIvmjqfliLbnu4jnq6/nmoTovpPlh7ouIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjg4OQorIywgdGNsLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBjbGVhbnVwICVzIgorbXNnc3RyICLml6Dms5XmuIXnkIYgJXMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6ODk1Cittc2dpZCAiQ2xvbmUgZmFpbGVkLiIKK21zZ3N0ciAi5YWL6ZqG5aSx6LSlLiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5MDIKK21zZ2lkICJObyBkZWZhdWx0IGJyYW5jaCBvYnRhaW5lZC4iCittc2dzdHIgIuayoeacieiOt+WPlue8uuecgeWIhuaUryIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5MTMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJDYW5ub3QgcmVzb2x2ZSAlcyBhcyBhIGNvbW1pdC4iCittc2dzdHIgIuaXoOazleino+aekCAlcyDkuLrmj5DkuqQuIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjkyNQorbXNnaWQgIkNyZWF0aW5nIHdvcmtpbmcgZGlyZWN0b3J5IgorbXNnc3RyICLliJvlu7rlt6XkvZznm67lvZUiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTI2IGxpYi9pbmRleC50Y2w6NjUgbGliL2luZGV4LnRjbDoxMjcKKyM6IGxpYi9pbmRleC50Y2w6MTkzCittc2dpZCAiZmlsZXMiCittc2dzdHIgIuaWh+S7tiIKKworIzogbGliL2Nob29zZV9yZXBvc2l0b3J5LnRjbDo5NTUKK21zZ2lkICJJbml0aWFsIGZpbGUgY2hlY2tvdXQgZmFpbGVkLiIKK21zZ3N0ciAi5Yid5aeL55qE5paH5Lu2Y2hlY2tvdXTlpLHotKUiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6OTcxCittc2dpZCAiT3BlbiIKK21zZ3N0ciAi5omT5byAIgorCisjOiBsaWIvY2hvb3NlX3JlcG9zaXRvcnkudGNsOjk4MQorbXNnaWQgIlJlcG9zaXRvcnk6IgorbXNnc3RyICLniYjmnKzlupMiCisKKyM6IGxpYi9jaG9vc2VfcmVwb3NpdG9yeS50Y2w6MTAzMQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBvcGVuIHJlcG9zaXRvcnkgJXM6IgorbXNnc3RyICLml6Dms5XmiZPlvIDniYjmnKzlupMgJXM6IgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6NTMKK21zZ2lkICJUaGlzIERldGFjaGVkIENoZWNrb3V0IgorbXNnc3RyICLor6XohLHoioLnmoRDaGVja291dCIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjYwCittc2dpZCAiUmV2aXNpb24gRXhwcmVzc2lvbjoiCittc2dzdHIgIueJiOacrOihqOi+vuW8jzoiCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDo3NAorbXNnaWQgIkxvY2FsIEJyYW5jaCIKK21zZ3N0ciAi5pys5Zyw5YiG5pSvIgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6NzkKK21zZ2lkICJUcmFja2luZyBCcmFuY2giCittc2dzdHIgIui3n+i4quWIhuaUrzoiCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDo4NCBsaWIvY2hvb3NlX3Jldi50Y2w6NTM4Cittc2dpZCAiVGFnIgorbXNnc3RyICLmoIfnrb4iCisKKyM6IGxpYi9jaG9vc2VfcmV2LnRjbDozMTcKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIHJldmlzaW9uOiAlcyIKK21zZ3N0ciAi5peg5pWI54mI5pysOiAlcyIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjMzOAorbXNnaWQgIk5vIHJldmlzaW9uIHNlbGVjdGVkLiIKK21zZ3N0ciAi5rKh5pyJ6YCJ5oup54mI5pysLiIKKworIzogbGliL2Nob29zZV9yZXYudGNsOjM0NgorbXNnaWQgIlJldmlzaW9uIGV4cHJlc3Npb24gaXMgZW1wdHkuIgorbXNnc3RyICLniYjmnKzooajovr7lvI/kuLrnqbouIgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6NTMxCittc2dpZCAiVXBkYXRlZCIKK21zZ3N0ciAi5bey5pu05pawIgorCisjOiBsaWIvY2hvb3NlX3Jldi50Y2w6NTU5Cittc2dpZCAiVVJMIgorbXNnc3RyICJVUkwiCisKKyM6IGxpYi9jb21taXQudGNsOjkKK21zZ2lkICIiCisiVGhlcmUgaXMgbm90aGluZyB0byBhbWVuZC5cbiIKKyJcbiIKKyJZb3UgYXJlIGFib3V0IHRvIGNyZWF0ZSB0aGUgaW5pdGlhbCBjb21taXQuICBUaGVyZSBpcyBubyBjb21taXQgYmVmb3JlIHRoaXMgIgorInRvIGFtZW5kLlxuIgorbXNnc3RyICIiCisi5rKh5pyJ5pS55Yqo6ZyA6KaB5L+u5q2jLlxuIgorIlxuIgorIuS9oOato+WcqOWIm+W7uuacgOWIneeahOaPkOS6pC4g5Zyo5q2k5LmL5YmN5rKh5pyJ5o+Q5Lqk5Y+v5Lul5L+u5q2jLlxuIgorCisjOiBsaWIvY29tbWl0LnRjbDoxOAorbXNnaWQgIiIKKyJDYW5ub3QgYW1lbmQgd2hpbGUgbWVyZ2luZy5cbiIKKyJcbiIKKyJZb3UgYXJlIGN1cnJlbnRseSBpbiB0aGUgbWlkZGxlIG9mIGEgbWVyZ2UgdGhhdCBoYXMgbm90IGJlZW4gZnVsbHkgIgorImNvbXBsZXRlZC4gIFlvdSBjYW5ub3QgYW1lbmQgdGhlIHByaW9yIGNvbW1pdCB1bmxlc3MgeW91IGZpcnN0IGFib3J0IHRoZSAiCisiY3VycmVudCBtZXJnZSBhY3Rpdml0eS5cbiIKK21zZ3N0ciAiIgorIuWcqOWQiOW5tuaXtuaXoOazleS/ruatoy5cbiIKKyJcbiIKKyLkvaDlvZPliY3mraPlnKjkuIDmrKHlsJrmnKrlrozmiJDnmoTlkIjlubbmk43kvZzov4fnqIvkuK0uIOmZpOmdnuS4reatouW9k+WJjeWQiOW5tua0u+WKqCxcbiIKKyLlkKbliJnml6Dms5Xkv67mraPkuYvliY3nmoTmj5DkuqQuXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjQ5Cittc2dpZCAiRXJyb3IgbG9hZGluZyBjb21taXQgZGF0YSBmb3IgYW1lbmQ6IgorbXNnc3RyICLkuLrkv67mraPoo4Xovb3mj5DkuqTmlbDmja7lh7rplJk6IgorCisjOiBsaWIvY29tbWl0LnRjbDo3NgorbXNnaWQgIlVuYWJsZSB0byBvYnRhaW4geW91ciBpZGVudGl0eToiCittc2dzdHIgIuaXoOazleiOt+efpeS9oOeahOi6q+S7vToiCisKKyM6IGxpYi9jb21taXQudGNsOjgxCittc2dpZCAiSW52YWxpZCBHSVRfQ09NTUlUVEVSX0lERU5UOiIKK21zZ3N0ciAi5peg5pWI55qEIEdJVF9DT01NSVRURVJfSURFTlQiCisKKyM6IGxpYi9jb21taXQudGNsOjEzMworbXNnaWQgIiIKKyJMYXN0IHNjYW5uZWQgc3RhdGUgZG9lcyBub3QgbWF0Y2ggcmVwb3NpdG9yeSBzdGF0ZS5cbiIKKyJcbiIKKyJBbm90aGVyIEdpdCBwcm9ncmFtIGhhcyBtb2RpZmllZCB0aGlzIHJlcG9zaXRvcnkgc2luY2UgdGhlIGxhc3Qgc2Nhbi4gIEEgIgorInJlc2NhbiBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgYW5vdGhlciBjb21taXQgY2FuIGJlIGNyZWF0ZWQuXG4iCisiXG4iCisiVGhlIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBub3cuXG4iCittc2dzdHIgIiIKKyLmnIDlkI7kuIDmrKHmiavmj4/nmoTnirbmgIHlkozlvZPliY3niYjmnKzlupPnirbmgIHkuI3nrKYuXG4iCisiXG4iCisi5Y+m5LiAIEdpdCDnqIvluo/oh6rkuIrmrKHmiavmj4/lkI7kv67mlLnkuobmnKzniYjmnKzlupMuIOWcqOS/ruaUueW9k+WJjeWIhuaUr+S5i+WJjemcgOimgemHjeaWsOWBmuS4gOasoeaJqyIKKyLmj48uXG4iCisiXG4iCisi6YeN5paw5omr5o+P5bCG6Ieq5Yqo5byA5aeLLlxuIgorCisjOiBsaWIvY29tbWl0LnRjbDoxNTQKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiVW5tZXJnZWQgZmlsZXMgY2Fubm90IGJlIGNvbW1pdHRlZC5cbiIKKyJcbiIKKyJGaWxlICVzIGhhcyBtZXJnZSBjb25mbGljdHMuICBZb3UgbXVzdCByZXNvbHZlIHRoZW0gYW5kIHN0YWdlIHRoZSBmaWxlICIKKyJiZWZvcmUgY29tbWl0dGluZy5cbiIKK21zZ3N0ciAiIgorIuWwmuacquWQiOW5tueahOaWh+S7tuayoeacieWKnuazleaPkOS6pC5cbiIKKyJcbiIKKyLmlofku7YgJXMg5pyJ5ZCI5bm25Yay56qBLCDkvaDlv4Xpobvop6PlhrPov5nkupvlhrLnqoHlubbnvJPlrZjor6Xmlofku7bkvZzmj5DkuqQuXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjE2MgorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJVbmtub3duIGZpbGUgc3RhdGUgJXMgZGV0ZWN0ZWQuXG4iCisiXG4iCisiRmlsZSAlcyBjYW5ub3QgYmUgY29tbWl0dGVkIGJ5IHRoaXMgcHJvZ3JhbS5cbiIKK21zZ3N0ciAiIgorIuajgOa1i+WIsOacquefpeaWh+S7tueKtuaAgSAlcy5cbiIKKyJcbiIKKyLmlofku7YgJXMg5peg5rOV55Sx6K+l56iL5bqP5o+Q5LqkLlxuIgorCisjOiBsaWIvY29tbWl0LnRjbDoxNzAKK21zZ2lkICIiCisiTm8gY2hhbmdlcyB0byBjb21taXQuXG4iCisiXG4iCisiWW91IG11c3Qgc3RhZ2UgYXQgbGVhc3QgMSBmaWxlIGJlZm9yZSB5b3UgY2FuIGNvbW1pdC5cbiIKK21zZ3N0ciAiIgorIuayoeaciemcgOimgeaPkOS6pOeahOWPmOWKqC5cbiIKKyJcbiIKKyLmj5DkuqTliY3kvaDlv4XpobvpppblhYjnvJPlrZjoh7PlsJHkuIDkuKrmlofku7YuXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjE4MworbXNnaWQgIiIKKyJQbGVhc2Ugc3VwcGx5IGEgY29tbWl0IG1lc3NhZ2UuXG4iCisiXG4iCisiQSBnb29kIGNvbW1pdCBtZXNzYWdlIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDpcbiIKKyJcbiIKKyItIEZpcnN0IGxpbmU6IERlc2NyaWJlIGluIG9uZSBzZW50ZW5jZSB3aGF0IHlvdSBkaWQuXG4iCisiLSBTZWNvbmQgbGluZTogQmxhbmtcbiIKKyItIFJlbWFpbmluZyBsaW5lczogRGVzY3JpYmUgd2h5IHRoaXMgY2hhbmdlIGlzIGdvb2QuXG4iCittc2dzdHIgIiIKKyLor7fmj5DkvpvkuIDmnaHmj5DkuqTkv6Hmga8uXG4iCisiXG4iCisi5LiA5p2h5aW955qE5o+Q5Lqk5L+h5oGv5pyJ5LiL5YiX5qC85byPOlxuIgorIlxuIgorIi0g56ys5LiA6KGMOiDkuIDlj6Xor53mpoLmi6zkvaDlgZrnmoTkv67mlLkuXG4iCisiLSDnrKzkuozooYw6IOepuuihjFxuIgorIi0g5Ymp5L2Z6KGMOiDor7fmj4/ov7DkuLrku4DkuYjkvaDlgZrnmoTov5nkupvmlLnliqjmmK/lpb3nmoQuXG4iCisKKyM6IGxpYi9jb21taXQudGNsOjIwNworIywgdGNsLWZvcm1hdAorbXNnaWQgIndhcm5pbmc6IFRjbCBkb2VzIG5vdCBzdXBwb3J0IGVuY29kaW5nICclcycuIgorbXNnc3RyICLorablkYo6IFRjbCDkuI3mlK/mjIHnvJbnoIHmlrnlvI8gJyVzJy4iCisKKyM6IGxpYi9jb21taXQudGNsOjIyMQorbXNnaWQgIkNhbGxpbmcgcHJlLWNvbW1pdCBob29rLi4uIgorbXNnc3RyICIiCisKKyM6IGxpYi9jb21taXQudGNsOjIzNgorbXNnaWQgIkNvbW1pdCBkZWNsaW5lZCBieSBwcmUtY29tbWl0IGhvb2suIgorbXNnc3RyICIiCisKKyM6IGxpYi9jb21taXQudGNsOjI1OQorbXNnaWQgIkNhbGxpbmcgY29tbWl0LW1zZyBob29rLi4uIgorbXNnc3RyICIiCisKKyM6IGxpYi9jb21taXQudGNsOjI3NAorbXNnaWQgIkNvbW1pdCBkZWNsaW5lZCBieSBjb21taXQtbXNnIGhvb2suIgorbXNnc3RyICIiCisKKyM6IGxpYi9jb21taXQudGNsOjI4NworbXNnaWQgIkNvbW1pdHRpbmcgY2hhbmdlcy4uLiIKK21zZ3N0ciAiIgorCisjOiBsaWIvY29tbWl0LnRjbDozMDMKK21zZ2lkICJ3cml0ZS10cmVlIGZhaWxlZDoiCittc2dzdHIgIndyaXRlLXRyZWUg5aSx6LSlOiIKKworIzogbGliL2NvbW1pdC50Y2w6MzA0IGxpYi9jb21taXQudGNsOjM0OCBsaWIvY29tbWl0LnRjbDozNjgKKyMsIGZ1enp5Cittc2dpZCAiQ29tbWl0IGZhaWxlZC4iCittc2dzdHIgIuWFi+mahuWksei0pS4iCisKKyM6IGxpYi9jb21taXQudGNsOjMyMQorIywgdGNsLWZvcm1hdAorbXNnaWQgIkNvbW1pdCAlcyBhcHBlYXJzIHRvIGJlIGNvcnJ1cHQiCittc2dzdHIgIuaPkOS6pCAlcyDkvLzkuY7lt7LmjZ/lnY8iCisKKyM6IGxpYi9jb21taXQudGNsOjMyNgorbXNnaWQgIiIKKyJObyBjaGFuZ2VzIHRvIGNvbW1pdC5cbiIKKyJcbiIKKyJObyBmaWxlcyB3ZXJlIG1vZGlmaWVkIGJ5IHRoaXMgY29tbWl0IGFuZCBpdCB3YXMgbm90IGEgbWVyZ2UgY29tbWl0LlxuIgorIlxuIgorIkEgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIG5vdy5cbiIKK21zZ3N0ciAiIgorIuayoeacieaUueWKqOaPkOS6pC5cbiIKKyJcbiIKKyLor6Xmj5DkuqTmsqHmnInmlLnliqjku7vkvZXmlofku7bkuZ/kuI3mmK/kuIDkuKrlkIjlubbmj5DkuqQuXG4iCisiXG4iCisi6YeN5paw5omr5o+P5bCG6Ieq5Yqo5byA5aeLLlxuIgorCisjOiBsaWIvY29tbWl0LnRjbDozMzMKK21zZ2lkICJObyBjaGFuZ2VzIHRvIGNvbW1pdC4iCittc2dzdHIgIuayoeacieaUueWKqOimgeaPkOS6pC4iCisKKyM6IGxpYi9jb21taXQudGNsOjM0NworbXNnaWQgImNvbW1pdC10cmVlIGZhaWxlZDoiCittc2dzdHIgImNvbW1pdC10cmVlIOWksei0pToiCisKKyM6IGxpYi9jb21taXQudGNsOjM2NworbXNnaWQgInVwZGF0ZS1yZWYgZmFpbGVkOiIKK21zZ3N0ciAidXBkYXRlLXJlZiDlpLHotKU6IgorCisjOiBsaWIvY29tbWl0LnRjbDo0NTQKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJDcmVhdGVkIGNvbW1pdCAlczogJXMiCittc2dzdHIgIuWIm+W7uuS6hiBjb21taXQgJXM6ICVzIgorCisjOiBsaWIvY29uc29sZS50Y2w6NTkKK21zZ2lkICJXb3JraW5nLi4uIHBsZWFzZSB3YWl0Li4uIgorbXNnc3RyICLlt6XkvZzkuK0uLi4g6K+3562J5b6FLi4uIgorCisjOiBsaWIvY29uc29sZS50Y2w6MTg2Cittc2dpZCAiU3VjY2VzcyIKK21zZ3N0ciAi5oiQ5YqfIgorCisjOiBsaWIvY29uc29sZS50Y2w6MjAwCittc2dpZCAiRXJyb3I6IENvbW1hbmQgRmFpbGVkIgorbXNnc3RyICLplJnor686IOWRveS7pOWksei0pSIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0MworbXNnaWQgIk51bWJlciBvZiBsb29zZSBvYmplY3RzIgorbXNnc3RyICLmnb7mlaPlr7nosaHnmoTmlbDph48iCisKKyM6IGxpYi9kYXRhYmFzZS50Y2w6NDQKK21zZ2lkICJEaXNrIHNwYWNlIHVzZWQgYnkgbG9vc2Ugb2JqZWN0cyIKK21zZ3N0ciAi5p2+5pWj5a+56LGh5omA5L2/55So55qE56OB55uY56m66Ze0IgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQ1Cittc2dpZCAiTnVtYmVyIG9mIHBhY2tlZCBvYmplY3RzIgorbXNnc3RyICLljovnvKnlr7nosaHmlbDph48iCisKKyM6IGxpYi9kYXRhYmFzZS50Y2w6NDYKK21zZ2lkICJOdW1iZXIgb2YgcGFja3MiCittc2dzdHIgIuWOi+e8qeWMheaVsOmHjyIKKworIzogbGliL2RhdGFiYXNlLnRjbDo0NworbXNnaWQgIkRpc2sgc3BhY2UgdXNlZCBieSBwYWNrZWQgb2JqZWN0cyIKK21zZ3N0ciAi5Y6L57yp5a+56LGh5omA5L2/55So55qE56OB55uY56m66Ze0IgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQ4Cittc2dpZCAiUGFja2VkIG9iamVjdHMgd2FpdGluZyBmb3IgcHJ1bmluZyIKK21zZ3N0ciAi5Y6L57yp5a+56LGh562J5b6F5riF55CGIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjQ5Cittc2dpZCAiR2FyYmFnZSBmaWxlcyIKK21zZ3N0ciAi5Z6D5Zy+5paH5Lu2IgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjcyCittc2dpZCAiQ29tcHJlc3NpbmcgdGhlIG9iamVjdCBkYXRhYmFzZSIKK21zZ3N0ciAi5Y6L57yp5a+56LGh5pWw5o2u5bqTIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjgzCittc2dpZCAiVmVyaWZ5aW5nIHRoZSBvYmplY3QgZGF0YWJhc2Ugd2l0aCBmc2NrLW9iamVjdHMiCittc2dzdHIgIuS9v+eUqCBmc2NrLW9iamVjdHMg6aqM6K+B5a+56LGh5pWw5o2u5bqTIgorCisjOiBsaWIvZGF0YWJhc2UudGNsOjEwOAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJUaGlzIHJlcG9zaXRvcnkgY3VycmVudGx5IGhhcyBhcHByb3hpbWF0ZWx5ICVpIGxvb3NlIG9iamVjdHMuXG4iCisiXG4iCisiVG8gbWFpbnRhaW4gb3B0aW1hbCBwZXJmb3JtYW5jZSBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBjb21wcmVzcyAiCisidGhlIGRhdGFiYXNlIHdoZW4gbW9yZSB0aGFuICVpIGxvb3NlIG9iamVjdHMgZXhpc3QuXG4iCisiXG4iCisiQ29tcHJlc3MgdGhlIGRhdGFiYXNlIG5vdz8iCittc2dzdHIgIiIKKyLor6XniYjmnKzlupPlvZPliY3nuqbmnIkgJWkg5Liq5p2+5pWj5a+56LGhLlxuIgorIlxuIgorIuS4uui+vuWIsOi+g+S8mOeahOaAp+iDve+8jOW8uueDiOW7uuiuruS9oOWcqOadvuaVo+WvueixoeWkmuS6jiAlaSDml7bljovnvKnmlbDmja7lupMuXG4iCisiXG4iCisi546w5Zyo5bCx5Y6L57yp5pWw5o2u5bqT5LmIPyIKKworIzogbGliL2RhdGUudGNsOjI1CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBkYXRlIGZyb20gR2l0OiAlcyIKK21zZ3N0ciAi5peg5pWI55qE5pel5pyfOiAlcyIKKworIzogbGliL2RpZmYudGNsOjQyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIk5vIGRpZmZlcmVuY2VzIGRldGVjdGVkLlxuIgorIlxuIgorIiVzIGhhcyBubyBjaGFuZ2VzLlxuIgorIlxuIgorIlRoZSBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGlzIGZpbGUgd2FzIHVwZGF0ZWQgYnkgYW5vdGhlciBhcHBsaWNhdGlvbiwgYnV0ICIKKyJ0aGUgY29udGVudCB3aXRoaW4gdGhlIGZpbGUgd2FzIG5vdCBjaGFuZ2VkLlxuIgorIlxuIgorIkEgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIHRvIGZpbmQgb3RoZXIgZmlsZXMgd2hpY2ggbWF5IGhhdmUgIgorInRoZSBzYW1lIHN0YXRlLiIKK21zZ3N0ciAiIgorIuacquajgOa1i+WIsOaUueWKqC5cbiIKKyJcbiIKKyLor6Xmlofku7bnmoTkv67mlLnml6XmnJ/ooqvlj6bkuIDkuKrnqIvluo/miYDmm7TmlrAsIOS9huWFtuWGheWuueW5tuayoeacieWPmOWMli5cbiIKKyJcbiIKKyLlr7nkuo7nsbvkvLzmg4XlhrXnmoTlhbbku5bmlofku7bnmoTph43mlrDmiavmj4/lsIboh6rliqjlvIDlp4suIgorCisjOiBsaWIvZGlmZi50Y2w6ODEKKyMsIGZ1enp5LCB0Y2wtZm9ybWF0Cittc2dpZCAiTG9hZGluZyBkaWZmIG9mICVzLi4uIgorbXNnc3RyICLoo4Xovb0gJXMg55qEIGRpZmYgLi4uIgorCisjOiBsaWIvZGlmZi50Y2w6MTE0IGxpYi9kaWZmLnRjbDoxODQKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gZGlzcGxheSAlcyIKK21zZ3N0ciAi5peg5rOV5pi+56S6ICVzIgorCisjOiBsaWIvZGlmZi50Y2w6MTE1Cittc2dpZCAiRXJyb3IgbG9hZGluZyBmaWxlOiIKK21zZ3N0ciAi6KOF6L295paH5Lu25Ye66ZSZOiIKKworIzogbGliL2RpZmYudGNsOjEyMgorbXNnaWQgIkdpdCBSZXBvc2l0b3J5IChzdWJwcm9qZWN0KSIKK21zZ3N0ciAiR2l0IOeJiOacrOW6kyAo5a2Q6aG555uuKSIKKworIzogbGliL2RpZmYudGNsOjEzNAorbXNnaWQgIiogQmluYXJ5IGZpbGUgKG5vdCBzaG93aW5nIGNvbnRlbnQpLiIKK21zZ3N0ciAiKiDkuozov5vliLbmlofku7YgKOS4jeaYvuekuuWGheWuuSkuIgorCisjOiBsaWIvZGlmZi50Y2w6MTg1Cittc2dpZCAiRXJyb3IgbG9hZGluZyBkaWZmOiIKK21zZ3N0ciAi6KOF6L29IGRpZmYg6ZSZ6K+vOiIKKworIzogbGliL2RpZmYudGNsOjMwMworbXNnaWQgIkZhaWxlZCB0byB1bnN0YWdlIHNlbGVjdGVkIGh1bmsuIgorbXNnc3RyICLml6Dms5XlsIbpgInmi6nnmoTku6PnoIHmrrXku47nvJPlrZjkuK3liKDpmaQuIgorCisjOiBsaWIvZGlmZi50Y2w6MzEwCittc2dpZCAiRmFpbGVkIHRvIHN0YWdlIHNlbGVjdGVkIGh1bmsuIgorbXNnc3RyICLml6Dms5XnvJPlrZjmiYDpgInku6PnoIHmrrUuIgorCisjOiBsaWIvZXJyb3IudGNsOjIwIGxpYi9lcnJvci50Y2w6MTE0Cittc2dpZCAiZXJyb3IiCittc2dzdHIgIumUmeivryIKKworIzogbGliL2Vycm9yLnRjbDozNgorbXNnaWQgIndhcm5pbmciCittc2dzdHIgIuitpuWRiiIKKworIzogbGliL2Vycm9yLnRjbDo5NAorbXNnaWQgIllvdSBtdXN0IGNvcnJlY3QgdGhlIGFib3ZlIGVycm9ycyBiZWZvcmUgY29tbWl0dGluZy4iCittc2dzdHIgIuS9oOW/hemhu+WcqOaPkOS6pOWJjeS/ruato+S4iui/sOmUmeivry4iCisKKyM6IGxpYi9pbmRleC50Y2w6NgorbXNnaWQgIlVuYWJsZSB0byB1bmxvY2sgdGhlIGluZGV4LiIKK21zZ3N0ciAi5peg5rOV6Kej6ZSB57yT5a2YIChpbmRleCkiCisKKyM6IGxpYi9pbmRleC50Y2w6MTUKK21zZ2lkICJJbmRleCBFcnJvciIKK21zZ3N0ciAi57yT5a2YKEluZGV4KemUmeivryIKKworIzogbGliL2luZGV4LnRjbDoyMQorbXNnaWQgIiIKKyJVcGRhdGluZyB0aGUgR2l0IGluZGV4IGZhaWxlZC4gIEEgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIHRvICIKKyJyZXN5bmNocm9uaXplIGdpdC1ndWkuIgorbXNnc3RyICLmm7TmlrAgR2l0IOe8k+WtmChJbmRleCnlpLHotKUsIOmHjeaWsOaJq+aPj+WwhuiHquWKqOW8gOWni+S7pemHjeaWsOWQjOatpSBnaXQtZ3VpLiIKKworIzogbGliL2luZGV4LnRjbDoyNworbXNnaWQgIkNvbnRpbnVlIgorbXNnc3RyICLnu6fnu60iCisKKyM6IGxpYi9pbmRleC50Y2w6MzEKK21zZ2lkICJVbmxvY2sgSW5kZXgiCittc2dzdHIgIuino+mUgSBJbmRleCIKKworIzogbGliL2luZGV4LnRjbDoyODIKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJVbnN0YWdpbmcgJXMgZnJvbSBjb21taXQiCittc2dzdHIgIuS7juaPkOS6pOe8k+WtmOS4reWIoOmZpCAlcyIKKworIzogbGliL2luZGV4LnRjbDozMTMKKyMsIGZ1enp5Cittc2dpZCAiUmVhZHkgdG8gY29tbWl0LiIKK21zZ3N0ciAi57yT5a2Y5Li65o+Q5LqkIgorCisjOiBsaWIvaW5kZXgudGNsOjMyNgorIywgdGNsLWZvcm1hdAorbXNnaWQgIkFkZGluZyAlcyIKK21zZ3N0ciAi5re75YqgICVzIgorCisjOiBsaWIvaW5kZXgudGNsOjM4MQorIywgdGNsLWZvcm1hdAorbXNnaWQgIlJldmVydCBjaGFuZ2VzIGluIGZpbGUgJXM/IgorbXNnc3RyICLmkqTplIDmlofku7YgJXMg5Lit55qE5pS55YqoPyIKKworIzogbGliL2luZGV4LnRjbDozODMKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJSZXZlcnQgY2hhbmdlcyBpbiB0aGVzZSAlaSBmaWxlcz8iCittc2dzdHIgIuaSpOmUgOi/meS6myAoJWnkuKopIOaWh+S7tueahOaUueWKqD8iCisKKyM6IGxpYi9pbmRleC50Y2w6MzkxCittc2dpZCAiQW55IHVuc3RhZ2VkIGNoYW5nZXMgd2lsbCBiZSBwZXJtYW5lbnRseSBsb3N0IGJ5IHRoZSByZXZlcnQuIgorbXNnc3RyICLku7vkvZXmnKrnvJPlrZjnmoTmlLnliqjlsIblnKjov5nmrKHmkqTplIDkuK3msLjkuYXkuKLlpLEuIgorCisjOiBsaWIvaW5kZXgudGNsOjM5NAorbXNnaWQgIkRvIE5vdGhpbmciCittc2dzdHIgIuS4jeWBmuaTjeS9nCIKKworIzogbGliL21lcmdlLnRjbDoxMworbXNnaWQgIiIKKyJDYW5ub3QgbWVyZ2Ugd2hpbGUgYW1lbmRpbmcuXG4iCisiXG4iCisiWW91IG11c3QgZmluaXNoIGFtZW5kaW5nIHRoaXMgY29tbWl0IGJlZm9yZSBzdGFydGluZyBhbnkgdHlwZSBvZiBtZXJnZS5cbiIKK21zZ3N0ciAiIgorIuS/ruato+aXtuaXoOazleWBmuWQiOW5ti5cbiIKKyJcbiIKKyLkvaDlv4XpobvlrozmiJDlr7nor6Xmj5DkuqTnmoTkv67mraPmiY3og73nu6fnu63ku7vkvZXnsbvlnovnmoTlkIjlubbmk43kvZwuXG4iCisKKyM6IGxpYi9tZXJnZS50Y2w6MjcKK21zZ2lkICIiCisiTGFzdCBzY2FubmVkIHN0YXRlIGRvZXMgbm90IG1hdGNoIHJlcG9zaXRvcnkgc3RhdGUuXG4iCisiXG4iCisiQW5vdGhlciBHaXQgcHJvZ3JhbSBoYXMgbW9kaWZpZWQgdGhpcyByZXBvc2l0b3J5IHNpbmNlIHRoZSBsYXN0IHNjYW4uICBBICIKKyJyZXNjYW4gbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIGEgbWVyZ2UgY2FuIGJlIHBlcmZvcm1lZC5cbiIKKyJcbiIKKyJUaGUgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIG5vdy5cbiIKK21zZ3N0ciAiIgorIuacgOWQjuS4gOasoeaJq+aPj+eahOeKtuaAgeWSjOW9k+WJjeeJiOacrOW6k+eKtuaAgeS4jeespi5cbiIKKyJcbiIKKyLlj6bkuIAgR2l0IOeoi+W6j+iHquS4iuasoeaJq+aPj+WQjuS/ruaUueS6huacrOeJiOacrOW6ky4g5Zyo5L+u5pS55b2T5YmN5YiG5pSv5LmL5YmN6ZyA6KaB6YeN5paw5YGa5LiA5qyh5omrIgorIuaPjy5cbiIKKyJcbiIKKyLph43mlrDmiavmj4/lsIboh6rliqjlvIDlp4suXG4iCisKKyM6IGxpYi9tZXJnZS50Y2w6NDQKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIiCisiWW91IGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgY29uZmxpY3RlZCBtZXJnZS5cbiIKKyJcbiIKKyJGaWxlICVzIGhhcyBtZXJnZSBjb25mbGljdHMuXG4iCisiXG4iCisiWW91IG11c3QgcmVzb2x2ZSB0aGVtLCBzdGFnZSB0aGUgZmlsZSwgYW5kIGNvbW1pdCB0byBjb21wbGV0ZSB0aGUgY3VycmVudCAiCisibWVyZ2UuICBPbmx5IHRoZW4gY2FuIHlvdSBiZWdpbiBhbm90aGVyIG1lcmdlLlxuIgorbXNnc3RyICIiCisi5L2g5q2j5aSE5Zyo5LiA5Liq5pyJ5Yay56qB55qE5ZCI5bm25pON5L2c5LitLlxuIgorIlxuIgorIuaWh+S7tiAlcyDmnInlkIjlubblhrLnqoEuXG4iCisiXG4iCisi5L2g5b+F6aG76Kej5Yaz6L+Z5Lqb5Yay56qBLCDnvJPlrZjor6Xmlofku7YsIOW5tuaPkOS6pOadpeWujOaIkOW9k+WJjeeahOWQiOW5ti7ku4XlvZPov5nmoLflkI7miY3og73lvIDlp4vkuIvkuIAiCisi5Liq5ZCI5bm25pON5L2cLlxuIgorCisjOiBsaWIvbWVyZ2UudGNsOjU0CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIllvdSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIGNoYW5nZS5cbiIKKyJcbiIKKyJGaWxlICVzIGlzIG1vZGlmaWVkLlxuIgorIlxuIgorIllvdSBzaG91bGQgY29tcGxldGUgdGhlIGN1cnJlbnQgY29tbWl0IGJlZm9yZSBzdGFydGluZyBhIG1lcmdlLiAgRG9pbmcgc28gIgorIndpbGwgaGVscCB5b3UgYWJvcnQgYSBmYWlsZWQgbWVyZ2UsIHNob3VsZCB0aGUgbmVlZCBhcmlzZS5cbiIKK21zZ3N0ciAiIgorIuS9oOato+WkhOWcqOS4gOS4quaUueWKqOW9k+S4rS5cbiIKKyJcbiIKKyLmlofku7YgJXMg5bey6KKr5L+u5pS5LlxuIgorIlxuIgorIuS9oOW/hemhu+WujOaIkOW9k+WJjeeahOaPkOS6pOWQjuaJjeiDveW8gOWni+WQiOW5ti4g5aaC5p6c6ZyA6KaBLCDov5nkuYjlgZrlsIbmnInliqnkuo7kuK3mraLkuIDmrKHlpLHotKXnmoTlkIgiCisi5bm2LlxuIgorCisjOiBsaWIvbWVyZ2UudGNsOjEwNgorIywgdGNsLWZvcm1hdAorbXNnaWQgIiVzIG9mICVzIgorbXNnc3RyICIiCisKKyM6IGxpYi9tZXJnZS50Y2w6MTE5CisjLCBmdXp6eSwgdGNsLWZvcm1hdAorbXNnaWQgIk1lcmdpbmcgJXMgYW5kICVzLi4uIgorbXNnc3RyICLlkIjlubYgJXMg5ZKMICVzIgorCisjOiBsaWIvbWVyZ2UudGNsOjEzMAorbXNnaWQgIk1lcmdlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIgorbXNnc3RyICLlkIjlubbmiJDlip/lrozmiJAuIgorCisjOiBsaWIvbWVyZ2UudGNsOjEzMgorbXNnaWQgIk1lcmdlIGZhaWxlZC4gIENvbmZsaWN0IHJlc29sdXRpb24gaXMgcmVxdWlyZWQuIgorbXNnc3RyICLlkIjlubblpLHotKUuIOmcgOimgeino+WGs+WGsueqgS4iCisKKyM6IGxpYi9tZXJnZS50Y2w6MTU3CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiTWVyZ2UgSW50byAlcyIKK21zZ3N0ciAi5ZCI5bm25YiwICVzIgorCisjOiBsaWIvbWVyZ2UudGNsOjE3NgorbXNnaWQgIlJldmlzaW9uIFRvIE1lcmdlIgorbXNnc3RyICLopoHlkIjlubbnmoTniYjmnKwiCisKKyM6IGxpYi9tZXJnZS50Y2w6MjExCittc2dpZCAiIgorIkNhbm5vdCBhYm9ydCB3aGlsZSBhbWVuZGluZy5cbiIKKyJcbiIKKyJZb3UgbXVzdCBmaW5pc2ggYW1lbmRpbmcgdGhpcyBjb21taXQuXG4iCittc2dzdHIgIiIKKyLkv67mraPmk43kvZzkuK3ml6Dms5XkuK3mraIuXG4iCisiXG4iCisi5L2g5b+F6aG75YWI5a6M5oiQ5pys5qyh5L+u5q2j5pON5L2cLlxuIgorCisjOiBsaWIvbWVyZ2UudGNsOjIyMQorbXNnaWQgIiIKKyJBYm9ydCBtZXJnZT9cbiIKKyJcbiIKKyJBYm9ydGluZyB0aGUgY3VycmVudCBtZXJnZSB3aWxsIGNhdXNlICpBTEwqIHVuY29tbWl0dGVkIGNoYW5nZXMgdG8gYmUgbG9zdC5cbiIKKyJcbiIKKyJDb250aW51ZSB3aXRoIGFib3J0aW5nIHRoZSBjdXJyZW50IG1lcmdlPyIKK21zZ3N0ciAiIgorIuS4reatouWQiOW5tj9cbiIKKyJcbiIKKyLkuK3mraLlvZPliY3nmoTlkIjlubbmk43kvZzlsIblr7zoh7QgKuaJgOaciSog5bCa5pyq5o+Q5Lqk55qE5pS55Yqo5Lii5aSxLlxuIgorIlxuIgorIuaYr+WQpuimgee7p+e7reS4reatouW9k+WJjeeahOWQiOW5tuaTjeS9nD8iCisKKyM6IGxpYi9tZXJnZS50Y2w6MjI3Cittc2dpZCAiIgorIlJlc2V0IGNoYW5nZXM/XG4iCisiXG4iCisiUmVzZXR0aW5nIHRoZSBjaGFuZ2VzIHdpbGwgY2F1c2UgKkFMTCogdW5jb21taXR0ZWQgY2hhbmdlcyB0byBiZSBsb3N0LlxuIgorIlxuIgorIkNvbnRpbnVlIHdpdGggcmVzZXR0aW5nIHRoZSBjdXJyZW50IGNoYW5nZXM/IgorbXNnc3RyICIiCisi5piv5ZCm5aSN5L2N5b2T5YmN5pS55YqoP1xuIgorIlxuIgorIuWkjeS9jeW9k+WJjeeahOaUueWKqOWwhuWvvOiHtCAq5omA5pyJKiDmnKrmj5DkuqTnmoTmlLnliqjkuKLlpLEuXG4iCisiXG4iCisi5piv5ZCm6KaB57un57ut5aSN5L2N5b2T5YmN55qE5pS55YqoPyIKKworIzogbGliL21lcmdlLnRjbDoyMzgKK21zZ2lkICJBYm9ydGluZyIKK21zZ3N0ciAi5Lit5q2iIgorCisjOiBsaWIvbWVyZ2UudGNsOjIzOAorIywgZnV6enkKK21zZ2lkICJmaWxlcyByZXNldCIKK21zZ3N0ciAi5paH5Lu2IgorCisjOiBsaWIvbWVyZ2UudGNsOjI2NQorbXNnaWQgIkFib3J0IGZhaWxlZC4iCittc2dzdHIgIuS4reatouWksei0pSIKKworIzogbGliL21lcmdlLnRjbDoyNjcKK21zZ2lkICJBYm9ydCBjb21wbGV0ZWQuICBSZWFkeS4iCittc2dzdHIgIuS4reatouWujOaIkC4g5bCx57uqLiIKKworIzogbGliL29wdGlvbi50Y2w6OTUKK21zZ2lkICJSZXN0b3JlIERlZmF1bHRzIgorbXNnc3RyICLmgaLlpI3pu5jorqTlgLwiCisKKyM6IGxpYi9vcHRpb24udGNsOjk5Cittc2dpZCAiU2F2ZSIKK21zZ3N0ciAi5L+d5a2YIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMDkKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICIlcyBSZXBvc2l0b3J5IgorbXNnc3RyICIlcyDniYjmnKzlupMiCisKKyM6IGxpYi9vcHRpb24udGNsOjExMAorbXNnaWQgIkdsb2JhbCAoQWxsIFJlcG9zaXRvcmllcykiCittc2dzdHIgIuWFqOWxgCAo5omA5pyJ54mI5pys5bqTKSIKKworIzogbGliL29wdGlvbi50Y2w6MTE2Cittc2dpZCAiVXNlciBOYW1lIgorbXNnc3RyICLnlKjmiLflkI0iCisKKyM6IGxpYi9vcHRpb24udGNsOjExNworbXNnaWQgIkVtYWlsIEFkZHJlc3MiCittc2dzdHIgIkVtYWlsIOWcsOWdgCIKKworIzogbGliL29wdGlvbi50Y2w6MTE5Cittc2dpZCAiU3VtbWFyaXplIE1lcmdlIENvbW1pdHMiCittc2dzdHIgIuamgui/sOWQiOW5tuaPkOS6pDoiCisKKyM6IGxpYi9vcHRpb24udGNsOjEyMAorbXNnaWQgIk1lcmdlIFZlcmJvc2l0eSIKK21zZ3N0ciAi5ZCI5bm25YaX5L2Z5bqmIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMjEKK21zZ2lkICJTaG93IERpZmZzdGF0IEFmdGVyIE1lcmdlIgorbXNnc3RyICLlnKjlkIjlubblkI7mmL7npLogRGlmZnN0YXQiCisKKyM6IGxpYi9vcHRpb24udGNsOjEyMworbXNnaWQgIlRydXN0IEZpbGUgTW9kaWZpY2F0aW9uIFRpbWVzdGFtcHMiCittc2dzdHIgIuebuOS/oeaWh+S7tueahOaUueWKqOaXtumXtCIKKworIzogbGliL29wdGlvbi50Y2w6MTI0Cittc2dpZCAiUHJ1bmUgVHJhY2tpbmcgQnJhbmNoZXMgRHVyaW5nIEZldGNoIgorbXNnc3RyICLojrflj5bml7bmuIXpmaTot5/ouKrliIbmlK8iCisKKyM6IGxpYi9vcHRpb24udGNsOjEyNQorbXNnaWQgIk1hdGNoIFRyYWNraW5nIEJyYW5jaGVzIgorbXNnc3RyICLljLnphY3ot5/ouKrliIbmlK8iCisKKyM6IGxpYi9vcHRpb24udGNsOjEyNgorbXNnaWQgIk51bWJlciBvZiBEaWZmIENvbnRleHQgTGluZXMiCittc2dzdHIgIkRpZmYg5LiK5LiL5paH6KGM5pWwIgorCisjOiBsaWIvb3B0aW9uLnRjbDoxMjcKKyMsIGZ1enp5Cittc2dpZCAiQ29tbWl0IE1lc3NhZ2UgVGV4dCBXaWR0aCIKK21zZ3N0ciAi5o+Q5Lqk5o+P6L+wOiIKKworIzogbGliL29wdGlvbi50Y2w6MTI4Cittc2dpZCAiTmV3IEJyYW5jaCBOYW1lIFRlbXBsYXRlIgorbXNnc3RyICLmlrDlu7rliIbmlK/lkb3lkI3mqKHmnb8iCisKKyM6IGxpYi9vcHRpb24udGNsOjE5MgorbXNnaWQgIlNwZWxsaW5nIERpY3Rpb25hcnk6IgorbXNnc3RyICIiCisKKyM6IGxpYi9vcHRpb24udGNsOjIxNgorbXNnaWQgIkNoYW5nZSBGb250IgorbXNnc3RyICLmm7TmlLnlrZfkvZMiCisKKyM6IGxpYi9vcHRpb24udGNsOjIyMAorIywgdGNsLWZvcm1hdAorbXNnaWQgIkNob29zZSAlcyIKK21zZ3N0ciAi6YCJ5oupICVzIgorCisjOiBsaWIvb3B0aW9uLnRjbDoyMjYKK21zZ2lkICJwdC4iCittc2dzdHIgIuejhSIKKworIzogbGliL29wdGlvbi50Y2w6MjQwCittc2dpZCAiUHJlZmVyZW5jZXMiCittc2dzdHIgIummlumAiemhuSIKKworIzogbGliL29wdGlvbi50Y2w6Mjc1Cittc2dpZCAiRmFpbGVkIHRvIGNvbXBsZXRlbHkgc2F2ZSBvcHRpb25zOiIKK21zZ3N0ciAi5peg5rOV5a6M5YWo5L+d5a2Y6YCJ6aG5OiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoyOSBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjM0Cittc2dpZCAiRGVsZXRlIFJlbW90ZSBCcmFuY2giCittc2dzdHIgIuWIoOmZpOi/nOerr+WIhuaUryIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDo0NworbXNnaWQgIkZyb20gUmVwb3NpdG9yeSIKK21zZ3N0ciAi5LuO54mI5pys5bqTIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjUwIGxpYi90cmFuc3BvcnQudGNsOjEyMworbXNnaWQgIlJlbW90ZToiCittc2dzdHIgIlJlbW90ZToiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6NjYgbGliL3RyYW5zcG9ydC50Y2w6MTM4Cittc2dpZCAiQXJiaXRyYXJ5IFVSTDoiCittc2dzdHIgIuS7u+aEjyBVUkw6IgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjg0Cittc2dpZCAiQnJhbmNoZXMiCittc2dzdHIgIuWIhuaUryIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoxMDkKK21zZ2lkICJEZWxldGUgT25seSBJZiIKK21zZ3N0ciAi5Yig6Zmk5LuF5b2TIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjExMQorbXNnaWQgIk1lcmdlZCBJbnRvOiIKK21zZ3N0ciAi5ZCI5bm25YiwIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjExOQorbXNnaWQgIkFsd2F5cyAoRG8gbm90IHBlcmZvcm0gbWVyZ2UgY2hlY2tzKSIKK21zZ3N0ciAi5oC75piv5ZCI5bm2ICjkuI3kvZzlkIjlubbmo4Dmn6UpIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjE1MgorbXNnaWQgIkEgYnJhbmNoIGlzIHJlcXVpcmVkIGZvciAnTWVyZ2VkIEludG8nLiIKK21zZ3N0ciAiJ+WQiOW5tuWIsCcg6ZyA6KaB5oyH5a6a5p+Q5Liq5YiG5pSvIgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjE4NAorIywgdGNsLWZvcm1hdAorbXNnaWQgIiIKKyJUaGUgZm9sbG93aW5nIGJyYW5jaGVzIGFyZSBub3QgY29tcGxldGVseSBtZXJnZWQgaW50byAlczpcbiIKKyJcbiIKKyIgLSAlcyIKK21zZ3N0ciAiIgorIuS4i+WIl+WIhuaUr+ayoeacieiiq+WFqOmDqOWQiOW5tuWIsCAlcyDkuK06XG4iCisiXG4iCisiIC0gJXMiCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6MTg5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiIgorIk9uZSBvciBtb3JlIG9mIHRoZSBtZXJnZSB0ZXN0cyBmYWlsZWQgYmVjYXVzZSB5b3UgaGF2ZSBub3QgZmV0Y2hlZCB0aGUgIgorIm5lY2Vzc2FyeSBjb21taXRzLiAgVHJ5IGZldGNoaW5nIGZyb20gJXMgZmlyc3QuIgorbXNnc3RyICIiCisi55Sx5LqO5rKh5pyJ6I635Y+W5Yiw5b+F6KaB55qE5o+Q5Lqk77yM5LiA5Liq5oiW5aSa5Liq5ZCI5bm25rWL6K+V5aSx6LSl44CC6K+35bCd6K+V5LuOICVzIOWkhOWFiOiOt+WPluOAgiIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoyMDcKK21zZ2lkICJQbGVhc2Ugc2VsZWN0IG9uZSBvciBtb3JlIGJyYW5jaGVzIHRvIGRlbGV0ZS4iCittc2dzdHIgIuivt+mAieaLqeafkOS4quaIluWkmuS4quWIhuaUr+adpeWIoOmZpCIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoyMTYKK21zZ2lkICIiCisiUmVjb3ZlcmluZyBkZWxldGVkIGJyYW5jaGVzIGlzIGRpZmZpY3VsdC5cbiIKKyJcbiIKKyJEZWxldGUgdGhlIHNlbGVjdGVkIGJyYW5jaGVzPyIKK21zZ3N0ciAiIgorIuaBouWkjeiiq+WIoOmZpOeahOWIhuaUr+mdnuW4uOWbsOmavi5cbiIKKyJcbiIKKyLmmK/lkKbopoHliKDpmaTmiYDpgInliIbmlK8/IgorCisjOiBsaWIvcmVtb3RlX2JyYW5jaF9kZWxldGUudGNsOjIyNgorIywgdGNsLWZvcm1hdAorbXNnaWQgIkRlbGV0aW5nIGJyYW5jaGVzIGZyb20gJXMiCittc2dzdHIgIuS7jiAlcyDkuK3liKDpmaTliIbmlK8iCisKKyM6IGxpYi9yZW1vdGVfYnJhbmNoX2RlbGV0ZS50Y2w6Mjg2Cittc2dpZCAiTm8gcmVwb3NpdG9yeSBzZWxlY3RlZC4iCittc2dzdHIgIuayoeaciemAieaLqeeJiOacrOW6kyIKKworIzogbGliL3JlbW90ZV9icmFuY2hfZGVsZXRlLnRjbDoyOTEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJTY2FubmluZyAlcy4uLiIKK21zZ3N0ciAi5q2j5Zyo5omr5o+PICVzLi4uIgorCisjOiBsaWIvcmVtb3RlLnRjbDoxNjUKK21zZ2lkICJQcnVuZSBmcm9tIgorbXNnc3RyICLku44uLua4hemZpChwcnVuZSkiCisKKyM6IGxpYi9yZW1vdGUudGNsOjE3MAorbXNnaWQgIkZldGNoIGZyb20iCittc2dzdHIgIuS7ji4u6I635Y+WKGZldGNoKSIKKworIzogbGliL3JlbW90ZS50Y2w6MjEzCittc2dpZCAiUHVzaCB0byIKK21zZ3N0ciAi5LiK5Lyg5YiwKHB1c2gpIgorCisjOiBsaWIvc2hvcnRjdXQudGNsOjIwIGxpYi9zaG9ydGN1dC50Y2w6NjEKK21zZ2lkICJDYW5ub3Qgd3JpdGUgc2hvcnRjdXQ6IgorbXNnc3RyICLml6Dms5Xkv67mlLnlv6vmjbfmlrnlvI86IgorCisjOiBsaWIvc2hvcnRjdXQudGNsOjEzNgorbXNnaWQgIkNhbm5vdCB3cml0ZSBpY29uOiIKK21zZ3N0ciAi5peg5rOV5L+u5pS55Zu+5qCHOiIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjU3Cittc2dpZCAiVW5zdXBwb3J0ZWQgc3BlbGwgY2hlY2tlciIKK21zZ3N0ciAiIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6NjUKK21zZ2lkICJTcGVsbCBjaGVja2luZyBpcyB1bmF2YWlsYWJsZSIKK21zZ3N0ciAiIgorCisjOiBsaWIvc3BlbGxjaGVjay50Y2w6NjgKK21zZ2lkICJJbnZhbGlkIHNwZWxsIGNoZWNraW5nIGNvbmZpZ3VyYXRpb24iCittc2dzdHIgIiIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjcwCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUmV2ZXJ0aW5nIGRpY3Rpb25hcnkgdG8gJXMuIgorbXNnc3RyICIiCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDo3MworbXNnaWQgIlNwZWxsIGNoZWNrZXIgc2lsZW50bHkgZmFpbGVkIG9uIHN0YXJ0dXAiCittc2dzdHIgIiIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjgwCittc2dpZCAiVW5yZWNvZ25pemVkIHNwZWxsIGNoZWNrZXIiCittc2dzdHIgIiIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjE4MAorbXNnaWQgIk5vIFN1Z2dlc3Rpb25zIgorbXNnc3RyICIiCisKKyM6IGxpYi9zcGVsbGNoZWNrLnRjbDozODEKK21zZ2lkICJVbmV4cGVjdGVkIEVPRiBmcm9tIHNwZWxsIGNoZWNrZXIiCittc2dzdHIgIiIKKworIzogbGliL3NwZWxsY2hlY2sudGNsOjM4NQorbXNnaWQgIlNwZWxsIENoZWNrZXIgRmFpbGVkIgorbXNnc3RyICIiCisKKyM6IGxpYi9zdGF0dXNfYmFyLnRjbDo4MworIywgdGNsLWZvcm1hdAorbXNnaWQgIiVzIC4uLiAlKmkgb2YgJSppICVzICglM2klJSkiCittc2dzdHIgIiVzIC4uLiAlKmkgb2YgJSppICVzICglM2klJSkiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjYKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJmZXRjaCAlcyIKK21zZ3N0ciAi6I635Y+WKGZldGNoKSIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6NworIywgdGNsLWZvcm1hdAorbXNnaWQgIkZldGNoaW5nIG5ldyBjaGFuZ2VzIGZyb20gJXMiCittc2dzdHIgIuS7jiAlcyDlpITojrflj5bmlrDnmoTmlLnliqgiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjE4CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAicmVtb3RlIHBydW5lICVzIgorbXNnc3RyICLmuIXpmaTov5znq68gJXMiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjE5CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUHJ1bmluZyB0cmFja2luZyBicmFuY2hlcyBkZWxldGVkIGZyb20gJXMiCittc2dzdHIgIua4hemZpCIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MjUgbGliL3RyYW5zcG9ydC50Y2w6NzEKKyMsIHRjbC1mb3JtYXQKK21zZ2lkICJwdXNoICVzIgorbXNnc3RyICLkuIrkvKAgJXMiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjI2CisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUHVzaGluZyBjaGFuZ2VzIHRvICVzIgorbXNnc3RyICLkuIrkvKDmlLnliqjliLAgJXMiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjcyCisjLCB0Y2wtZm9ybWF0Cittc2dpZCAiUHVzaGluZyAlcyAlcyB0byAlcyIKK21zZ3N0ciAi5LiK5LygICVzICVzIOWIsCAlcyIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6ODkKK21zZ2lkICJQdXNoIEJyYW5jaGVzIgorbXNnc3RyICLkuIrkvKDliIbmlK8iCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjEwMworbXNnaWQgIlNvdXJjZSBCcmFuY2hlcyIKK21zZ3N0ciAi5rqQ56uv5YiG5pSvOiIKKworIzogbGliL3RyYW5zcG9ydC50Y2w6MTIwCittc2dpZCAiRGVzdGluYXRpb24gUmVwb3NpdG9yeSIKK21zZ3N0ciAi55uu5qCH54mI5pys5bqTIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoxNTgKK21zZ2lkICJUcmFuc2ZlciBPcHRpb25zIgorbXNnc3RyICLkvKDovpPpgInpobkiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjE2MAorbXNnaWQgIkZvcmNlIG92ZXJ3cml0ZSBleGlzdGluZyBicmFuY2ggKG1heSBkaXNjYXJkIGNoYW5nZXMpIgorbXNnc3RyICLlvLrliLbopobnm5blt7LmnInnmoTliIbmlK8gKOWPr+iDveS8muS4ouWkseaUueWKqCkiCisKKyM6IGxpYi90cmFuc3BvcnQudGNsOjE2NAorbXNnaWQgIlVzZSB0aGluIHBhY2sgKGZvciBzbG93IG5ldHdvcmsgY29ubmVjdGlvbnMpIgorbXNnc3RyICLkvb/nlKggdGhpbiBwYWNrICjpgILnlKjkuo7kvY7pgJ/nvZHnu5zov57mjqUpIgorCisjOiBsaWIvdHJhbnNwb3J0LnRjbDoxNjgKK21zZ2lkICJJbmNsdWRlIHRhZ3MiCittc2dzdHIgIuWMheWQq+agh+etviIKZGlmZiAtLWdpdCBhL2dpdC1ndWkvd2luZG93cy9naXQtZ3VpLnNoIGIvZ2l0LWd1aS93aW5kb3dzL2dpdC1ndWkuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThmMzJjMAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1ndWkvd2luZG93cy9naXQtZ3VpLnNoCkBAIC0wLDAgKzEsMTYgQEAKKyMhL2Jpbi9zaAorIyBUY2wgaWdub3JlcyB0aGUgbmV4dCBsaW5lIC0qLSB0Y2wgLSotIFwKK2V4ZWMgd2lzaCAiJDAiIC0tICIkQCIKKworaWYgeyAkYXJnYyA+PTIgJiYgW2xpbmRleCAkYXJndiAwXSA9PSAiLS13b3JraW5nLWRpciIgfSB7CisJY2QgW2xpbmRleCAkYXJndiAxXQorCXNldCBhcmd2IFtscmFuZ2UgJGFyZ3YgMiBlbmRdCisJaW5jciBhcmdjIC0yCit9CisKK3NldCBnaXRndWlkaXIgW2ZpbGUgZGlybmFtZSBbaW5mbyBzY3JpcHRdXQorcmVnc3ViIC1hbGwgIjsiICRnaXRndWlkaXIgIlxcOyIgZ2l0Z3VpZGlyCitzZXQgZW52KFBBVEgpICIkZ2l0Z3VpZGlyOyRlbnYoUEFUSCkiCit1bnNldCBnaXRndWlkaXIKKworc291cmNlIFtmaWxlIGpvaW4gW2ZpbGUgZGlybmFtZSBbaW5mbyBzY3JpcHRdXSBnaXQtZ3VpLnRjbF0KZGlmZiAtLWdpdCBhL2dpdC1pbnN0YXdlYi5zaCBiL2dpdC1pbnN0YXdlYi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZjkxYzhmCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWluc3Rhd2ViLnNoCkBAIC0wLDAgKzEsMjc5IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEVyaWMgV29uZworIworCitQRVJMPSdAQFBFUkxAQCcKK09QVElPTlNfS0VFUERBU0hEQVNIPQorT1BUSU9OU19TUEVDPSJcCitnaXQtaW5zdGF3ZWIgW29wdGlvbnNdICgtLXN0YXJ0IHwgLS1zdG9wIHwgLS1yZXN0YXJ0KQorLS0KK2wsbG9jYWwgICAgICAgIG9ubHkgYmluZCBvbiAxMjcuMC4wLjEKK3AscG9ydD0gICAgICAgIHRoZSBwb3J0IHRvIGJpbmQgdG8KK2QsaHR0cGQ9ICAgICAgIHRoZSBjb21tYW5kIHRvIGxhdW5jaAorYixicm93c2VyPSAgICAgdGhlIGJyb3dzZXIgdG8gbGF1bmNoCittLG1vZHVsZS1wYXRoPSB0aGUgbW9kdWxlIHBhdGggKG9ubHkgbmVlZGVkIGZvciBhcGFjaGUyKQorIEFjdGlvbgorc3RvcCAgICAgICAgICAgc3RvcCB0aGUgd2ViIHNlcnZlcgorc3RhcnQgICAgICAgICAgc3RhcnQgdGhlIHdlYiBzZXJ2ZXIKK3Jlc3RhcnQgICAgICAgIHJlc3RhcnQgdGhlIHdlYiBzZXJ2ZXIKKyIKKworLiBnaXQtc2gtc2V0dXAKKworZnFnaXRkaXI9IiRHSVRfRElSIgorbG9jYWw9ImBnaXQgY29uZmlnIC0tYm9vbCAtLWdldCBpbnN0YXdlYi5sb2NhbGAiCitodHRwZD0iYGdpdCBjb25maWcgLS1nZXQgaW5zdGF3ZWIuaHR0cGRgIgorcG9ydD1gZ2l0IGNvbmZpZyAtLWdldCBpbnN0YXdlYi5wb3J0YAorbW9kdWxlX3BhdGg9ImBnaXQgY29uZmlnIC0tZ2V0IGluc3Rhd2ViLm1vZHVsZXBhdGhgIgorCitjb25mPSIkR0lUX0RJUi9naXR3ZWIvaHR0cGQuY29uZiIKKworIyBEZWZhdWx0czoKKworIyBpZiBpbnN0YWxsZWQsIGl0IGRvZXNuJ3QgbmVlZCBmdXJ0aGVyIGNvbmZpZ3VyYXRpb24gKG1vZHVsZV9wYXRoKQordGVzdCAteiAiJGh0dHBkIiAmJiBodHRwZD0nbGlnaHR0cGQgLWYnCisKKyMgYW55IHVudGFrZW4gbG9jYWwgcG9ydCB3aWxsIGRvLi4uCit0ZXN0IC16ICIkcG9ydCIgJiYgcG9ydD0xMjM0CisKK3N0YXJ0X2h0dHBkICgpIHsKKwlodHRwZF9vbmx5PSJgZWNobyAkaHR0cGQgfCBjdXQgLWYxIC1kJyAnYCIKKwlpZiBjYXNlICIkaHR0cGRfb25seSIgaW4gLyopIDogOzsgKikgd2hpY2ggJGh0dHBkX29ubHkgPi9kZXYvbnVsbDs7IGVzYWMKKwl0aGVuCisJCSRodHRwZCAiJGZxZ2l0ZGlyL2dpdHdlYi9odHRwZC5jb25mIgorCWVsc2UKKwkJIyBtYW55IGh0dHBkcyBhcmUgaW5zdGFsbGVkIGluIC91c3Ivc2JpbiBvciAvdXNyL2xvY2FsL3NiaW4KKwkJIyB0aGVzZSBkYXlzIGFuZCB0aG9zZSBhcmUgbm90IGluIG1vc3QgdXNlcnMgJFBBVEhzCisJCSMgaW4gYWRkaXRpb24sIHdlIG1heSBoYXZlIGdlbmVyYXRlZCBhIHNlcnZlciBzY3JpcHQKKwkJIyBpbiAkZnFnaXRkaXIvZ2l0d2ViLgorCQlmb3IgaSBpbiAvdXNyL2xvY2FsL3NiaW4gL3Vzci9zYmluICIkZnFnaXRkaXIvZ2l0d2ViIgorCQlkbworCQkJaWYgdGVzdCAteCAiJGkvJGh0dHBkX29ubHkiCisJCQl0aGVuCisJCQkJIyBkb24ndCBxdW90ZSAkaHR0cGQsIHRoZXJlIGNhbiBiZQorCQkJCSMgYXJndW1lbnRzIHRvIGl0ICgtZikKKwkJCQkkaS8kaHR0cGQgIiRmcWdpdGRpci9naXR3ZWIvaHR0cGQuY29uZiIKKwkJCQlyZXR1cm4KKwkJCWZpCisJCWRvbmUKKwkJZWNobyAiJGh0dHBkX29ubHkgbm90IGZvdW5kLiBJbnN0YWxsICRodHRwZF9vbmx5IG9yIHVzZSIgXAorCQkgICAgICItLWh0dHBkIHRvIHNwZWNpZnkgYW5vdGhlciBodHRwIGRhZW1vbi4iCisJCWV4aXQgMQorCWZpCisJaWYgdGVzdCAkPyAhPSAwOyB0aGVuCisJCWVjaG8gIkNvdWxkIG5vdCBleGVjdXRlIGh0dHAgZGFlbW9uICRodHRwZC4iCisJCWV4aXQgMQorCWZpCit9CisKK3N0b3BfaHR0cGQgKCkgeworCXRlc3QgLWYgIiRmcWdpdGRpci9waWQiICYmIGtpbGwgYGNhdCAiJGZxZ2l0ZGlyL3BpZCJgCit9CisKK3doaWxlIHRlc3QgJCMgIT0gMAorZG8KKwljYXNlICIkMSIgaW4KKwktLXN0b3B8c3RvcCkKKwkJc3RvcF9odHRwZAorCQlleGl0IDAKKwkJOzsKKwktLXN0YXJ0fHN0YXJ0KQorCQlzdGFydF9odHRwZAorCQlleGl0IDAKKwkJOzsKKwktLXJlc3RhcnR8cmVzdGFydCkKKwkJc3RvcF9odHRwZAorCQlzdGFydF9odHRwZAorCQlleGl0IDAKKwkJOzsKKwktbHwtLWxvY2FsKQorCQlsb2NhbD10cnVlCisJCTs7CisJLWR8LS1odHRwZCkKKwkJc2hpZnQKKwkJaHR0cGQ9IiQxIgorCQk7OworCS1ifC0tYnJvd3NlcikKKwkJc2hpZnQKKwkJYnJvd3Nlcj0iJDEiCisJCTs7CisJLXB8LS1wb3J0KQorCQlzaGlmdAorCQlwb3J0PSIkMSIKKwkJOzsKKwktbXwtLW1vZHVsZS1wYXRoKQorCQlzaGlmdAorCQltb2R1bGVfcGF0aD0iJDEiCisJCTs7CisJLS0pCisJCTs7CisJKikKKwkJdXNhZ2UKKwkJOzsKKwllc2FjCisJc2hpZnQKK2RvbmUKKworbWtkaXIgLXAgIiRHSVRfRElSL2dpdHdlYi90bXAiCitHSVRfRVhFQ19QQVRIPSJgZ2l0IC0tZXhlYy1wYXRoYCIKK0dJVF9ESVI9IiRmcWdpdGRpciIKK2V4cG9ydCBHSVRfRVhFQ19QQVRIIEdJVF9ESVIKKworCit3ZWJyaWNrX2NvbmYgKCkgeworCSMgZ2VuZXJhdGUgYSBzdGFuZGFsb25lIHNlcnZlciBzY3JpcHQgaW4gJGZxZ2l0ZGlyL2dpdHdlYi4KKwljYXQgPiIkZnFnaXRkaXIvZ2l0d2ViLyRodHRwZC5yYiIgPDxFT0YKK3JlcXVpcmUgJ3dlYnJpY2snCityZXF1aXJlICd5YW1sJworb3B0aW9ucyA9IFlBTUw6OmxvYWRfZmlsZShBUkdWWzBdKQorb3B0aW9uc1s6U3RhcnRDYWxsYmFja10gPSBwcm9jIGRvCisgIEZpbGUub3BlbihvcHRpb25zWzpQaWRGaWxlXSwidyIpIGRvIHxmfAorICAgIGYucHV0cyBQcm9jZXNzLnBpZAorICBlbmQKK2VuZAorb3B0aW9uc1s6U2VydmVyVHlwZV0gPSBXRUJyaWNrOjpEYWVtb24KK3NlcnZlciA9IFdFQnJpY2s6OkhUVFBTZXJ2ZXIubmV3KG9wdGlvbnMpCitbJ0lOVCcsICdURVJNJ10uZWFjaCBkbyB8c2lnbmFsfAorICB0cmFwKHNpZ25hbCkge3NlcnZlci5zaHV0ZG93bn0KK2VuZAorc2VydmVyLnN0YXJ0CitFT0YKKwkjIGdlbmVyYXRlIGEgc2hlbGwgc2NyaXB0IHRvIGludm9rZSB0aGUgYWJvdmUgcnVieSBzY3JpcHQsCisJIyB3aGljaCBhc3N1bWVzIF9ydWJ5XyBpcyBpbiB0aGUgdXNlcidzICRQQVRILiB0aGF0J3MgX29uZV8KKwkjIHBvcnRhYmxlIHdheSB0byBydW4gcnVieSwgd2hpY2ggY291bGQgYmUgaW5zdGFsbGVkIGFueXdoZXJlLAorCSMgcmVhbGx5LgorCWNhdCA+IiRmcWdpdGRpci9naXR3ZWIvJGh0dHBkIiA8PEVPRgorIyEvYmluL3NoCitleGVjIHJ1YnkgIiRmcWdpdGRpci9naXR3ZWIvJGh0dHBkLnJiIiBcJCoKK0VPRgorCWNobW9kICt4ICIkZnFnaXRkaXIvZ2l0d2ViLyRodHRwZCIKKworCWNhdCA+IiRjb25mIiA8PEVPRgorOlBvcnQ6ICRwb3J0Cis6RG9jdW1lbnRSb290OiAiJGZxZ2l0ZGlyL2dpdHdlYiIKKzpEaXJlY3RvcnlJbmRleDogWyJnaXR3ZWIuY2dpIl0KKzpQaWRGaWxlOiAiJGZxZ2l0ZGlyL3BpZCIKK0VPRgorCXRlc3QgIiRsb2NhbCIgPSB0cnVlICYmIGVjaG8gJzpCaW5kQWRkcmVzczogIjEyNy4wLjAuMSInID4+ICIkY29uZiIKK30KKworbGlnaHR0cGRfY29uZiAoKSB7CisJY2F0ID4gIiRjb25mIiA8PEVPRgorc2VydmVyLmRvY3VtZW50LXJvb3QgPSAiJGZxZ2l0ZGlyL2dpdHdlYiIKK3NlcnZlci5wb3J0ID0gJHBvcnQKK3NlcnZlci5tb2R1bGVzID0gKCAibW9kX2NnaSIgKQorc2VydmVyLmluZGV4ZmlsZXMgPSAoICJnaXR3ZWIuY2dpIiApCitzZXJ2ZXIucGlkLWZpbGUgPSAiJGZxZ2l0ZGlyL3BpZCIKK2NnaS5hc3NpZ24gPSAoICIuY2dpIiA9PiAiIiApCittaW1ldHlwZS5hc3NpZ24gPSAoICIuY3NzIiA9PiAidGV4dC9jc3MiICkKK0VPRgorCXRlc3QgeCIkbG9jYWwiID0geHRydWUgJiYgZWNobyAnc2VydmVyLmJpbmQgPSAiMTI3LjAuMC4xIicgPj4gIiRjb25mIgorfQorCithcGFjaGUyX2NvbmYgKCkgeworCXRlc3QgLXogIiRtb2R1bGVfcGF0aCIgJiYgbW9kdWxlX3BhdGg9L3Vzci9saWIvYXBhY2hlMi9tb2R1bGVzCisJbWtkaXIgLXAgIiRHSVRfRElSL2dpdHdlYi9sb2dzIgorCWJpbmQ9CisJdGVzdCB4IiRsb2NhbCIgPSB4dHJ1ZSAmJiBiaW5kPScxMjcuMC4wLjE6JworCWVjaG8gJ3RleHQvY3NzIGNzcycgPiAkZnFnaXRkaXIvbWltZS50eXBlcworCWNhdCA+ICIkY29uZiIgPDxFT0YKK1NlcnZlck5hbWUgImdpdC1pbnN0YXdlYiIKK1NlcnZlclJvb3QgIiRmcWdpdGRpci9naXR3ZWIiCitEb2N1bWVudFJvb3QgIiRmcWdpdGRpci9naXR3ZWIiCitQaWRGaWxlICIkZnFnaXRkaXIvcGlkIgorTGlzdGVuICRiaW5kJHBvcnQKK0VPRgorCisJZm9yIG1vZCBpbiBtaW1lIGRpcjsgZG8KKwkJaWYgdGVzdCAtZSAkbW9kdWxlX3BhdGgvbW9kXyR7bW9kfS5zbzsgdGhlbgorCQkJZWNobyAiTG9hZE1vZHVsZSAke21vZH1fbW9kdWxlICIgXAorCQkJICAgICAiJG1vZHVsZV9wYXRoL21vZF8ke21vZH0uc28iID4+ICIkY29uZiIKKwkJZmkKKwlkb25lCisJY2F0ID4+ICIkY29uZiIgPDxFT0YKK1R5cGVzQ29uZmlnICRmcWdpdGRpci9taW1lLnR5cGVzCitEaXJlY3RvcnlJbmRleCBnaXR3ZWIuY2dpCitFT0YKKworCSMgY2hlY2sgdG8gc2VlIGlmIERlbm5pcyBTdG9zYmVyZydzIG1vZF9wZXJsIGNvbXBhdGliaWxpdHkgcGF0Y2gKKwkjICg8MjAwNjA2MjExMzA3MDguR2NiYzZlNWNAbGVvbm92LnN0b3NiZXJnLm5ldD4pIGhhcyBiZWVuIGFwcGxpZWQKKwlpZiB0ZXN0IC1mICIkbW9kdWxlX3BhdGgvbW9kX3Blcmwuc28iICYmIGdyZXAgJ15vdXIgJGdpdGJpbicgXAorCQkJCSIkR0lUX0RJUi9naXR3ZWIvZ2l0d2ViLmNnaSIgPi9kZXYvbnVsbAorCXRoZW4KKwkJIyBmYXZvciBtb2RfcGVybCBpZiBhdmFpbGFibGUKKwkJY2F0ID4+ICIkY29uZiIgPDxFT0YKK0xvYWRNb2R1bGUgcGVybF9tb2R1bGUgJG1vZHVsZV9wYXRoL21vZF9wZXJsLnNvCitQZXJsUGFzc0VudiBHSVRfRElSCitQZXJsUGFzc0VudiBHSVRfRVhFQ19ESVIKKzxMb2NhdGlvbiAvZ2l0d2ViLmNnaT4KKwlTZXRIYW5kbGVyIHBlcmwtc2NyaXB0CisJUGVybFJlc3BvbnNlSGFuZGxlciBNb2RQZXJsOjpSZWdpc3RyeQorCVBlcmxPcHRpb25zICtQYXJzZUhlYWRlcnMKKwlPcHRpb25zICtFeGVjQ0dJCis8L0xvY2F0aW9uPgorRU9GCisJZWxzZQorCQkjIHBsYWluLW9sZCBDR0kKKwkJbGlzdF9tb2RzPWBlY2hvICIkaHR0cGQiIHwgc2VkICJzLy1mJC8tbC8iYAorCQkkbGlzdF9tb2RzIHwgZ3JlcCAnbW9kX2NnaVwuYycgPi9kZXYvbnVsbCAyPiYxIHx8IFwKKwkJZWNobyAiTG9hZE1vZHVsZSBjZ2lfbW9kdWxlICRtb2R1bGVfcGF0aC9tb2RfY2dpLnNvIiA+PiAiJGNvbmYiCisJCWNhdCA+PiAiJGNvbmYiIDw8RU9GCitBZGRIYW5kbGVyIGNnaS1zY3JpcHQgLmNnaQorPExvY2F0aW9uIC9naXR3ZWIuY2dpPgorCU9wdGlvbnMgK0V4ZWNDR0kKKzwvTG9jYXRpb24+CitFT0YKKwlmaQorfQorCitzY3JpcHQ9JworcyNeKG15fG91cikgXCRwcm9qZWN0cm9vdCA9LiojJDEgXCRwcm9qZWN0cm9vdCA9ICInJChkaXJuYW1lICIkZnFnaXRkaXIiKSciOyM7CitzIyhteXxvdXIpIFwkZ2l0YmluID0uKiMkMSBcJGdpdGJpbiA9ICInJEdJVF9FWEVDX1BBVEgnIjsjOworcyMobXl8b3VyKSBcJHByb2plY3RzX2xpc3QgPS4qIyQxIFwkcHJvamVjdHNfbGlzdCA9IFwkcHJvamVjdHJvb3Q7IzsKK3MjKG15fG91cikgXCRnaXRfdGVtcCA9LiojJDEgXCRnaXRfdGVtcCA9ICInJGZxZ2l0ZGlyL2dpdHdlYi90bXAnIjsjOycKKworZ2l0d2ViX2NnaSAoKSB7CisJY2F0ID4gIiQxLnRtcCIgPDxcRU9GR0lUV0VCCitAQEdJVFdFQl9DR0lAQAorRU9GR0lUV0VCCisJIyBVc2UgdGhlIGNvbmZpZ3VyZWQgZnVsbCBwYXRoIHRvIHBlcmwgdG8gbWF0Y2ggdGhlIGdlbmVyYXRlZAorCSMgc2NyaXB0cycgJ2hhc2hwbGluZycgbGluZQorCSIkUEVSTCIgLXAgLWUgIiRzY3JpcHQiICIkMS50bXAiICA+ICIkMSIKKwljaG1vZCAreCAiJDEiCisJcm0gLWYgIiQxLnRtcCIKK30KKworZ2l0d2ViX2NzcyAoKSB7CisJY2F0ID4gIiQxIiA8PFxFT0ZHSVRXRUIKK0BAR0lUV0VCX0NTU0BACitFT0ZHSVRXRUIKK30KKworZ2l0d2ViX2NnaSAiJEdJVF9ESVIvZ2l0d2ViL2dpdHdlYi5jZ2kiCitnaXR3ZWJfY3NzICIkR0lUX0RJUi9naXR3ZWIvZ2l0d2ViLmNzcyIKKworY2FzZSAiJGh0dHBkIiBpbgorKmxpZ2h0dHBkKikKKwlsaWdodHRwZF9jb25mCisJOzsKKyphcGFjaGUyKikKKwlhcGFjaGUyX2NvbmYKKwk7Oword2VicmljaykKKwl3ZWJyaWNrX2NvbmYKKwk7OworKikKKwllY2hvICJVbmtub3duIGh0dHBkIHNwZWNpZmllZDogJGh0dHBkIgorCWV4aXQgMQorCTs7Citlc2FjCisKK3N0YXJ0X2h0dHBkCit1cmw9aHR0cDovLzEyNy4wLjAuMTokcG9ydAorCitpZiB0ZXN0IC1uICIkYnJvd3NlciI7IHRoZW4KKwlnaXQgd2ViLS1icm93c2UgLWIgIiRicm93c2VyIiAkdXJsIHx8IGVjaG8gJHVybAorZWxzZQorCWdpdCB3ZWItLWJyb3dzZSAtYyAiaW5zdGF3ZWIuYnJvd3NlciIgJHVybCB8fCBlY2hvICR1cmwKK2ZpCmRpZmYgLS1naXQgYS9naXQtbG9zdC1mb3VuZC5zaCBiL2dpdC1sb3N0LWZvdW5kLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjljZWRhZjgKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtbG9zdC1mb3VuZC5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vc2gKKworVVNBR0U9JycKK1NVQkRJUkVDVE9SWV9PSz0nWWVzJworT1BUSU9OU19TUEVDPQorLiBnaXQtc2gtc2V0dXAKKworZWNobyAiV0FSTklORzogJyQwJyBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mICdnaXQgZnNjayAtLWxvc3QtZm91bmQnIiA+JjIKKworaWYgWyAiJCMiICE9ICIwIiBdCit0aGVuCisgICAgdXNhZ2UKK2ZpCisKK2xhZj0iJEdJVF9ESVIvbG9zdC1mb3VuZCIKK3JtIC1mciAiJGxhZiIgJiYgbWtkaXIgLXAgIiRsYWYvY29tbWl0IiAiJGxhZi9vdGhlciIgfHwgZXhpdAorCitnaXQgZnNjayAtLWZ1bGwgLS1uby1yZWZsb2dzIHwKK3doaWxlIHJlYWQgZGFuZ2xpbmcgdHlwZSBzaGExCitkbworCWNhc2UgIiRkYW5nbGluZyIgaW4KKwlkYW5nbGluZykKKwkJaWYgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAiJHNoYTFeMCIgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbAorCQl0aGVuCisJCQlkaXI9IiRsYWYvY29tbWl0IgorCQkJZ2l0IHNob3ctYnJhbmNoICIkc2hhMSIKKwkJZWxzZQorCQkJZGlyPSIkbGFmL290aGVyIgorCQlmaQorCQllY2hvICIkc2hhMSIgPiIkZGlyLyRzaGExIgorCQk7OworCWVzYWMKK2RvbmUKZGlmZiAtLWdpdCBhL2dpdC1tZXJnZS1vY3RvcHVzLnNoIGIvZ2l0LW1lcmdlLW9jdG9wdXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjQ1ZTExNAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1tZXJnZS1vY3RvcHVzLnNoCkBAIC0wLDAgKzEsMTE0IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisjIFJlc29sdmUgdHdvIG9yIG1vcmUgdHJlZXMuCisjCisKK0xGPScKKycKKworZGllICgpIHsKKyAgICBlY2hvID4mMiAiJCoiCisgICAgZXhpdCAxCit9CisKKyMgVGhlIGZpcnN0IHBhcmFtZXRlcnMgdXAgdG8gLS0gYXJlIG1lcmdlIGJhc2VzOyB0aGUgcmVzdCBhcmUgaGVhZHMuCitiYXNlcz0gaGVhZD0gcmVtb3Rlcz0gc2VwX3NlZW49Citmb3IgYXJnCitkbworCWNhc2UgIiwkc2VwX3NlZW4sJGhlYWQsJGFyZywiIGluCisJKiwtLSwpCisJCXNlcF9zZWVuPXllcworCQk7OworCSx5ZXMsLCopCisJCWhlYWQ9JGFyZworCQk7OworCSx5ZXMsKikKKwkJcmVtb3Rlcz0iJHJlbW90ZXMkYXJnICIKKwkJOzsKKwkqKQorCQliYXNlcz0iJGJhc2VzJGFyZyAiCisJCTs7CisJZXNhYworZG9uZQorCisjIFJlamVjdCBpZiB0aGlzIGlzIG5vdCBhbiBPY3RvcHVzIC0tIHJlc29sdmUgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KK2Nhc2UgIiRyZW1vdGVzIiBpbgorPyonICc/KikKKwk7OworKikKKwlleGl0IDIgOzsKK2VzYWMKKworIyBNUkMgaXMgdGhlIGN1cnJlbnQgIm1lcmdlIHJlZmVyZW5jZSBjb21taXQiCisjIE1SVCBpcyB0aGUgY3VycmVudCAibWVyZ2UgcmVzdWx0IHRyZWUiCisKK01SQz0kaGVhZCBNU0c9IFBBUkVOVD0iLXAgJGhlYWQiCitNUlQ9JChnaXQgd3JpdGUtdHJlZSkKK0NOVD0xIDsjIGNvdW50aW5nIG91ciBoZWFkCitOT05fRkZfTUVSR0U9MAorT0NUT1BVU19GQUlMVVJFPTAKK2ZvciBTSEExIGluICRyZW1vdGVzCitkbworCWNhc2UgIiRPQ1RPUFVTX0ZBSUxVUkUiIGluCisJMSkKKwkJIyBXZSBhbGxvdyBvbmx5IGxhc3Qgb25lIHRvIGhhdmUgYSBoYW5kLXJlc29sdmFibGUKKwkJIyBjb25mbGljdHMuICBMYXN0IHJvdW5kIGZhaWxlZCBhbmQgd2Ugc3RpbGwgaGFkCisJCSMgYSBoZWFkIHRvIG1lcmdlLgorCQllY2hvICJBdXRvbWF0ZWQgbWVyZ2UgZGlkIG5vdCB3b3JrLiIKKwkJZWNobyAiU2hvdWxkIG5vdCBiZSBkb2luZyBhbiBPY3RvcHVzLiIKKwkJZXhpdCAyCisJZXNhYworCisJY29tbW9uPSQoZ2l0IG1lcmdlLWJhc2UgLS1hbGwgJE1SQyAkU0hBMSkgfHwKKwkJZGllICJVbmFibGUgdG8gZmluZCBjb21tb24gY29tbWl0IHdpdGggJFNIQTEiCisKKwljYXNlICIkTEYkY29tbW9uJExGIiBpbgorCSoiJExGJFNIQTEkTEYiKikKKwkJZWNobyAiQWxyZWFkeSB1cC10by1kYXRlIHdpdGggJFNIQTEiCisJCWNvbnRpbnVlCisJCTs7CisJZXNhYworCisJQ05UPWBleHByICRDTlQgKyAxYAorCVBBUkVOVD0iJFBBUkVOVCAtcCAkU0hBMSIKKworCWlmIHRlc3QgIiRjb21tb24sJE5PTl9GRl9NRVJHRSIgPSAiJE1SQywwIgorCXRoZW4KKwkJIyBUaGUgZmlyc3QgaGVhZCBiZWluZyBtZXJnZWQgd2FzIGEgZmFzdC1mb3J3YXJkLgorCQkjIEFkdmFuY2UgTVJDIHRvIHRoZSBoZWFkIGJlaW5nIG1lcmdlZCwgYW5kIHVzZSB0aGF0CisJCSMgdHJlZSBhcyB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdCBvZiB0aGUgbWVyZ2UuCisJCSMgV2Ugc3RpbGwgbmVlZCB0byBjb3VudCB0aGlzIGFzIHBhcnQgb2YgdGhlIHBhcmVudCBzZXQuCisKKwkJZWNobyAiRmFzdCBmb3J3YXJkaW5nIHRvOiAkU0hBMSIKKwkJZ2l0IHJlYWQtdHJlZSAtdSAtbSAkaGVhZCAkU0hBMSB8fCBleGl0CisJCU1SQz0kU0hBMSBNUlQ9JChnaXQgd3JpdGUtdHJlZSkKKwkJY29udGludWUKKwlmaQorCisJTk9OX0ZGX01FUkdFPTEKKworCWVjaG8gIlRyeWluZyBzaW1wbGUgbWVyZ2Ugd2l0aCAkU0hBMSIKKwlnaXQgcmVhZC10cmVlIC11IC1tIC0tYWdncmVzc2l2ZSAgJGNvbW1vbiAkTVJUICRTSEExIHx8IGV4aXQgMgorCW5leHQ9JChnaXQgd3JpdGUtdHJlZSAyPi9kZXYvbnVsbCkKKwlpZiB0ZXN0ICQ/IC1uZSAwCisJdGhlbgorCQllY2hvICJTaW1wbGUgbWVyZ2UgZGlkIG5vdCB3b3JrLCB0cnlpbmcgYXV0b21hdGljIG1lcmdlLiIKKwkJZ2l0LW1lcmdlLWluZGV4IC1vIGdpdC1tZXJnZS1vbmUtZmlsZSAtYSB8fAorCQlPQ1RPUFVTX0ZBSUxVUkU9MQorCQluZXh0PSQoZ2l0IHdyaXRlLXRyZWUgMj4vZGV2L251bGwpCisJZmkKKworCSMgV2UgaGF2ZSBtZXJnZWQgdGhlIG90aGVyIGJyYW5jaCBzdWNjZXNzZnVsbHkuICBJZGVhbGx5CisJIyB3ZSBjb3VsZCBpbXBsZW1lbnQgT1InZWQgaGVhZHMgaW4gbWVyZ2UtYmFzZSwgYW5kIGtlZXAKKwkjIGEgbGlzdCBvZiBjb21taXRzIHdlIGhhdmUgbWVyZ2VkIHNvIGZhciBpbiBNUkMgdG8gZmVlZAorCSMgdGhlbSB0byBtZXJnZS1iYXNlLCBidXQgd2UgYXBwcm94aW1hdGUgaXQgYnkga2VlcCB1c2luZworCSMgdGhlIGN1cnJlbnQgTVJDLiAgV2UgdXNlZCB0byB1cGRhdGUgaXQgdG8gJGNvbW1vbiwgd2hpY2gKKwkjIHdhcyBpbmNvcnJlY3RseSBkb2luZyBBTkQnZWQgbWVyZ2UtYmFzZSBoZXJlLCB3aGljaCB3YXMKKwkjIHVubmVlZGVkLgorCisJTVJUPSRuZXh0Citkb25lCisKK2V4aXQgIiRPQ1RPUFVTX0ZBSUxVUkUiCmRpZmYgLS1naXQgYS9naXQtbWVyZ2Utb25lLWZpbGUuc2ggYi9naXQtbWVyZ2Utb25lLWZpbGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTFlYjk2MwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1tZXJnZS1vbmUtZmlsZS5zaApAQCAtMCwwICsxLDE0MSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyMKKyMgVGhpcyBpcyB0aGUgZ2l0IHBlci1maWxlIG1lcmdlIHNjcmlwdCwgY2FsbGVkIHdpdGgKKyMKKyMgICAkMSAtIG9yaWdpbmFsIGZpbGUgU0hBMSAob3IgZW1wdHkpCisjICAgJDIgLSBmaWxlIGluIGJyYW5jaDEgU0hBMSAob3IgZW1wdHkpCisjICAgJDMgLSBmaWxlIGluIGJyYW5jaDIgU0hBMSAob3IgZW1wdHkpCisjICAgJDQgLSBwYXRobmFtZSBpbiByZXBvc2l0b3J5CisjICAgJDUgLSBvcmlnaW5hbCBmaWxlIG1vZGUgKG9yIGVtcHR5KQorIyAgICQ2IC0gZmlsZSBpbiBicmFuY2gxIG1vZGUgKG9yIGVtcHR5KQorIyAgICQ3IC0gZmlsZSBpbiBicmFuY2gyIG1vZGUgKG9yIGVtcHR5KQorIworIyBIYW5kbGUgc29tZSB0cml2aWFsIGNhc2VzLi4gVGhlIF9yZWFsbHlfIHRyaXZpYWwgY2FzZXMgaGF2ZQorIyBiZWVuIGhhbmRsZWQgYWxyZWFkeSBieSBnaXQgcmVhZC10cmVlLCBidXQgdGhhdCBvbmUgZG9lc24ndAorIyBkbyBhbnkgbWVyZ2VzIHRoYXQgbWlnaHQgY2hhbmdlIHRoZSB0cmVlIGxheW91dC4KKworY2FzZSAiJHsxOi0ufSR7MjotLn0kezM6LS59IiBpbgorIworIyBEZWxldGVkIGluIGJvdGggb3IgZGVsZXRlZCBpbiBvbmUgYW5kIHVuY2hhbmdlZCBpbiB0aGUgb3RoZXIKKyMKKyIkMS4uIiB8ICIkMS4kMSIgfCAiJDEkMS4iKQorCWlmIFsgIiQyIiBdOyB0aGVuCisJCWVjaG8gIlJlbW92aW5nICQ0IgorCWVsc2UKKwkJIyByZWFkLXRyZWUgY2hlY2tlZCB0aGF0IGluZGV4IG1hdGNoZXMgSEVBRCBhbHJlYWR5LAorCQkjIHNvIHdlIGtub3cgd2UgZG8gbm90IGhhdmUgdGhpcyBwYXRoIHRyYWNrZWQuCisJCSMgdGhlcmUgbWF5IGJlIGFuIHVucmVsYXRlZCB3b3JraW5nIHRyZWUgZmlsZSBoZXJlLAorCQkjIHdoaWNoIHdlIHNob3VsZCBqdXN0IGxlYXZlIHVubW9sZXN0ZWQuICBNYWtlIHN1cmUKKwkJIyB3ZSBkbyBub3QgaGF2ZSBpdCBpbiB0aGUgaW5kZXgsIHRob3VnaC4KKwkJZXhlYyBnaXQgdXBkYXRlLWluZGV4IC0tcmVtb3ZlIC0tICIkNCIKKwlmaQorCWlmIHRlc3QgLWYgIiQ0IjsgdGhlbgorCQlybSAtZiAtLSAiJDQiICYmCisJCXJtZGlyIC1wICIkKGV4cHIgInokNCIgOiAnelwoLipcKS8nKSIgMj4vZGV2L251bGwgfHwgOgorCWZpICYmCisJCWV4ZWMgZ2l0IHVwZGF0ZS1pbmRleCAtLXJlbW92ZSAtLSAiJDQiCisJOzsKKworIworIyBBZGRlZCBpbiBvbmUuCisjCisiLiQyLiIpCisJIyB0aGUgb3RoZXIgc2lkZSBkaWQgbm90IGFkZCBhbmQgd2UgYWRkZWQgc28gdGhlcmUgaXMgbm90aGluZworCSMgdG8gYmUgZG9uZSwgZXhjZXB0IG1ha2luZyB0aGUgcGF0aCBtZXJnZWQuCisJZXhlYyBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tY2FjaGVpbmZvICIkNiIgIiQyIiAiJDQiCisJOzsKKyIuLiQzIikKKwllY2hvICJBZGRpbmcgJDQiCisJaWYgdGVzdCAtZiAiJDQiCisJdGhlbgorCQllY2hvICJFUlJPUjogdW50cmFja2VkICQ0IGlzIG92ZXJ3cml0dGVuIGJ5IHRoZSBtZXJnZS4iCisJCWV4aXQgMQorCWZpCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLWNhY2hlaW5mbyAiJDciICIkMyIgIiQ0IiAmJgorCQlleGVjIGdpdCBjaGVja291dC1pbmRleCAtdSAtZiAtLSAiJDQiCisJOzsKKworIworIyBBZGRlZCBpbiBib3RoLCBpZGVudGljYWxseSAoY2hlY2sgZm9yIHNhbWUgcGVybWlzc2lvbnMpLgorIworIi4kMyQyIikKKwlpZiBbICIkNiIgIT0gIiQ3IiBdOyB0aGVuCisJCWVjaG8gIkVSUk9SOiBGaWxlICQ0IGFkZGVkIGlkZW50aWNhbGx5IGluIGJvdGggYnJhbmNoZXMsIgorCQllY2hvICJFUlJPUjogYnV0IHBlcm1pc3Npb25zIGNvbmZsaWN0ICQ2LT4kNy4iCisJCWV4aXQgMQorCWZpCisJZWNobyAiQWRkaW5nICQ0IgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgLS1jYWNoZWluZm8gIiQ2IiAiJDIiICIkNCIgJiYKKwkJZXhlYyBnaXQgY2hlY2tvdXQtaW5kZXggLXUgLWYgLS0gIiQ0IgorCTs7CisKKyMKKyMgTW9kaWZpZWQgaW4gYm90aCwgYnV0IGRpZmZlcmVudGx5LgorIworIiQxJDIkMyIgfCAiLiQyJDMiKQorCisJY2FzZSAiLCQ2LCQ3LCIgaW4KKwkqLDEyMDAwMCwqKQorCQllY2hvICJFUlJPUjogJDQ6IE5vdCBtZXJnaW5nIHN5bWJvbGljIGxpbmsgY2hhbmdlcy4iCisJCWV4aXQgMQorCQk7OworCSosMTYwMDAwLCopCisJCWVjaG8gIkVSUk9SOiAkNDogTm90IG1lcmdpbmcgY29uZmxpY3Rpbmcgc3VibW9kdWxlIGNoYW5nZXMuIgorCQlleGl0IDEKKwkJOzsKKwllc2FjCisKKwlzcmMyPWBnaXQtdW5wYWNrLWZpbGUgJDNgCisJY2FzZSAiJDEiIGluCisJJycpCisJCWVjaG8gIkFkZGVkICQ0IGluIGJvdGgsIGJ1dCBkaWZmZXJlbnRseS4iCisJCSMgVGhpcyBleHRyYWN0cyBPVVIgZmlsZSBpbiAkb3JpZywgYW5kIHVzZXMgZ2l0IGFwcGx5IHRvCisJCSMgcmVtb3ZlIGxpbmVzIHRoYXQgYXJlIHVuaXF1ZSB0byBvdXJzLgorCQlvcmlnPWBnaXQtdW5wYWNrLWZpbGUgJDJgCisJCXN6MD1gd2MgLWMgPCIkb3JpZyJgCisJCWRpZmYgLXUgLUxhLyRvcmlnIC1MYi8kb3JpZyAkb3JpZyAkc3JjMiB8IGdpdCBhcHBseSAtLW5vLWFkZAorCQlzejE9YHdjIC1jIDwiJG9yaWciYAorCisJCSMgSWYgd2UgZG8gbm90IGhhdmUgZW5vdWdoIGNvbW1vbiBtYXRlcmlhbCwgaXQgaXMgbm90CisJCSMgd29ydGggdHJ5aW5nIHR3by1maWxlIG1lcmdlIHVzaW5nIGNvbW1vbiBzdWJzZWN0aW9ucy4KKwkJZXhwciAiJHN6MCIgXDwgIiRzejEiIFwqIDIgPi9kZXYvbnVsbCB8fCA6ID4kb3JpZworCQk7OworCSopCisJCWVjaG8gIkF1dG8tbWVyZ2luZyAkNCIKKwkJb3JpZz1gZ2l0LXVucGFjay1maWxlICQxYAorCQk7OworCWVzYWMKKworCSMgQmUgY2FyZWZ1bCBmb3IgZnVubnkgZmlsZW5hbWUgc3VjaCBhcyAiLUwiIGluICIkNCIsIHdoaWNoCisJIyB3b3VsZCBjb25mdXNlICJtZXJnZSIgZ3JlYXRseS4KKwlzcmMxPWBnaXQtdW5wYWNrLWZpbGUgJDJgCisJZ2l0IG1lcmdlLWZpbGUgIiRzcmMxIiAiJG9yaWciICIkc3JjMiIKKwlyZXQ9JD8KKworCSMgQ3JlYXRlIHRoZSB3b3JraW5nIHRyZWUgZmlsZSwgdXNpbmcgIm91ciB0cmVlIiB2ZXJzaW9uIGZyb20gdGhlCisJIyBpbmRleCwgYW5kIHRoZW4gc3RvcmUgdGhlIHJlc3VsdCBvZiB0aGUgbWVyZ2UuCisJZ2l0IGNoZWNrb3V0LWluZGV4IC1mIC0tc3RhZ2U9MiAtLSAiJDQiICYmIGNhdCAiJHNyYzEiID4iJDQiCisJcm0gLWYgLS0gIiRvcmlnIiAiJHNyYzEiICIkc3JjMiIKKworCWlmIFsgIiQ2IiAhPSAiJDciIF07IHRoZW4KKwkJZWNobyAiRVJST1I6IFBlcm1pc3Npb25zIGNvbmZsaWN0OiAkNS0+JDYsJDcuIgorCQlyZXQ9MQorCWZpCisJaWYgWyAiJDEiID0gJycgXTsgdGhlbgorCQlyZXQ9MQorCWZpCisKKwlpZiBbICRyZXQgLW5lIDAgXTsgdGhlbgorCQllY2hvICJFUlJPUjogTWVyZ2UgY29uZmxpY3QgaW4gJDQiCisJCWV4aXQgMQorCWZpCisJZXhlYyBnaXQgdXBkYXRlLWluZGV4IC0tICIkNCIKKwk7OworCisqKQorCWVjaG8gIkVSUk9SOiAkNDogTm90IGhhbmRsaW5nIGNhc2UgJDEgLT4gJDIgLT4gJDMiCisJOzsKK2VzYWMKK2V4aXQgMQpkaWZmIC0tZ2l0IGEvZ2l0LW1lcmdlLXJlc29sdmUuc2ggYi9naXQtbWVyZ2UtcmVzb2x2ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45M2JjZmMyCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LW1lcmdlLXJlc29sdmUuc2gKQEAgLTAsMCArMSw1NCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBMaW51cyBUb3J2YWxkcworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKyMgUmVzb2x2ZSB0d28gdHJlZXMsIHVzaW5nIGVuaGFuY2VkIG11bHRpLWJhc2UgcmVhZC10cmVlLgorCisjIFRoZSBmaXJzdCBwYXJhbWV0ZXJzIHVwIHRvIC0tIGFyZSBtZXJnZSBiYXNlczsgdGhlIHJlc3QgYXJlIGhlYWRzLgorYmFzZXM9IGhlYWQ9IHJlbW90ZXM9IHNlcF9zZWVuPQorZm9yIGFyZworZG8KKwljYXNlICIsJHNlcF9zZWVuLCRoZWFkLCRhcmcsIiBpbgorCSosLS0sKQorCQlzZXBfc2Vlbj15ZXMKKwkJOzsKKwkseWVzLCwqKQorCQloZWFkPSRhcmcKKwkJOzsKKwkseWVzLCopCisJCXJlbW90ZXM9IiRyZW1vdGVzJGFyZyAiCisJCTs7CisJKikKKwkJYmFzZXM9IiRiYXNlcyRhcmcgIgorCQk7OworCWVzYWMKK2RvbmUKKworIyBHaXZlIHVwIGlmIHdlIGFyZSBnaXZlbiB0d28gb3IgbW9yZSByZW1vdGVzIC0tIG5vdCBoYW5kbGluZyBvY3RvcHVzLgorY2FzZSAiJHJlbW90ZXMiIGluCis/KicgJz8qKQorCWV4aXQgMiA7OworZXNhYworCisjIEdpdmUgdXAgaWYgdGhpcyBpcyBhIGJhc2VsZXNzIG1lcmdlLgoraWYgdGVzdCAnJyA9ICIkYmFzZXMiCit0aGVuCisJZXhpdCAyCitmaQorCitnaXQgdXBkYXRlLWluZGV4IC0tcmVmcmVzaCAyPi9kZXYvbnVsbAorZ2l0IHJlYWQtdHJlZSAtdSAtbSAtLWFnZ3Jlc3NpdmUgJGJhc2VzICRoZWFkICRyZW1vdGVzIHx8IGV4aXQgMgorZWNobyAiVHJ5aW5nIHNpbXBsZSBtZXJnZS4iCitpZiByZXN1bHRfdHJlZT0kKGdpdCB3cml0ZS10cmVlICAyPi9kZXYvbnVsbCkKK3RoZW4KKwlleGl0IDAKK2Vsc2UKKwllY2hvICJTaW1wbGUgbWVyZ2UgZmFpbGVkLCB0cnlpbmcgQXV0b21hdGljIG1lcmdlLiIKKwlpZiBnaXQtbWVyZ2UtaW5kZXggLW8gZ2l0LW1lcmdlLW9uZS1maWxlIC1hCisJdGhlbgorCQlleGl0IDAKKwllbHNlCisJCWV4aXQgMQorCWZpCitmaQpkaWZmIC0tZ2l0IGEvZ2l0LW1lcmdlLXN0dXBpZC5zaCBiL2dpdC1tZXJnZS1zdHVwaWQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjYxMmQ0NwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1tZXJnZS1zdHVwaWQuc2gKQEAgLTAsMCArMSw4MCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBMaW51cyBUb3J2YWxkcworIworIyBSZXNvbHZlIHR3byB0cmVlcywgJ3N0dXBpZCBtZXJnZScuCisKKyMgVGhlIGZpcnN0IHBhcmFtZXRlcnMgdXAgdG8gLS0gYXJlIG1lcmdlIGJhc2VzOyB0aGUgcmVzdCBhcmUgaGVhZHMuCitiYXNlcz0gaGVhZD0gcmVtb3Rlcz0gc2VwX3NlZW49Citmb3IgYXJnCitkbworCWNhc2UgIiwkc2VwX3NlZW4sJGhlYWQsJGFyZywiIGluCisJKiwtLSwpCisJCXNlcF9zZWVuPXllcworCQk7OworCSx5ZXMsLCopCisJCWhlYWQ9JGFyZworCQk7OworCSx5ZXMsKikKKwkJcmVtb3Rlcz0iJHJlbW90ZXMkYXJnICIKKwkJOzsKKwkqKQorCQliYXNlcz0iJGJhc2VzJGFyZyAiCisJCTs7CisJZXNhYworZG9uZQorCisjIEdpdmUgdXAgaWYgd2UgYXJlIGdpdmVuIHR3byBvciBtb3JlIHJlbW90ZXMgLS0gbm90IGhhbmRsaW5nIG9jdG9wdXMuCitjYXNlICIkcmVtb3RlcyIgaW4KKz8qJyAnPyopCisJZXhpdCAyIDs7Citlc2FjCisKKyMgRmluZCBhbiBvcHRpbXVtIG1lcmdlIGJhc2UgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgY2FuZGlkYXRlcy4KK2Nhc2UgIiRiYXNlcyIgaW4KKz8qJyAnPyopCisJZWNobyAiVHJ5aW5nIHRvIGZpbmQgdGhlIG9wdGltdW0gbWVyZ2UgYmFzZS4iCisJRz0udG1wLWluZGV4JCQKKwliZXN0PQorCWJlc3RfY250PS0xCisJZm9yIGMgaW4gJGJhc2VzCisJZG8KKwkJcm0gLWYgJEcKKwkJR0lUX0lOREVYX0ZJTEU9JEcgZ2l0IHJlYWQtdHJlZSAtbSAkYyAkaGVhZCAkcmVtb3RlcyBcCisJCQkgMj4vZGV2L251bGwgfHwJY29udGludWUKKwkJIyBDb3VudCB0aGUgcGF0aHMgdGhhdCBhcmUgdW5tZXJnZWQuCisJCWNudD1gR0lUX0lOREVYX0ZJTEU9JEcgZ2l0IGxzLWZpbGVzIC0tdW5tZXJnZWQgfCB3YyAtbGAKKwkJaWYgdGVzdCAkYmVzdF9jbnQgLWxlIDAgLW8gJGNudCAtbGUgJGJlc3RfY250CisJCXRoZW4KKwkJCWJlc3Q9JGMKKwkJCWJlc3RfY250PSRjbnQKKwkJCWlmIHRlc3QgIiRiZXN0X2NudCIgLWVxIDAKKwkJCXRoZW4KKwkJCQkjIENhbm5vdCBkbyBhbnkgYmV0dGVyIHRoYW4gYWxsIHRyaXZpYWwgbWVyZ2UuCisJCQkJYnJlYWsKKwkJCWZpCisJCWZpCisJZG9uZQorCXJtIC1mICRHCisJY29tbW9uPSIkYmVzdCIKKwk7OworKikKKwljb21tb249IiRiYXNlcyIKKwk7OworZXNhYworCitnaXQgdXBkYXRlLWluZGV4IC0tcmVmcmVzaCAyPi9kZXYvbnVsbAorZ2l0IHJlYWQtdHJlZSAtdSAtbSAkY29tbW9uICRoZWFkICRyZW1vdGVzIHx8IGV4aXQgMgorZWNobyAiVHJ5aW5nIHNpbXBsZSBtZXJnZS4iCitpZiByZXN1bHRfdHJlZT0kKGdpdCB3cml0ZS10cmVlICAyPi9kZXYvbnVsbCkKK3RoZW4KKwlleGl0IDAKK2Vsc2UKKwllY2hvICJTaW1wbGUgbWVyZ2UgZmFpbGVkLCB0cnlpbmcgQXV0b21hdGljIG1lcmdlLiIKKwlpZiBnaXQtbWVyZ2UtaW5kZXggLW8gZ2l0LW1lcmdlLW9uZS1maWxlIC1hCisJdGhlbgorCQlleGl0IDAKKwllbHNlCisJCWV4aXQgMQorCWZpCitmaQpkaWZmIC0tZ2l0IGEvZ2l0LW1lcmdlLnNoIGIvZ2l0LW1lcmdlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdkYmJiMWQKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtbWVyZ2Uuc2gKQEAgLTAsMCArMSw1NDkgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKworT1BUSU9OU19LRUVQREFTSERBU0g9CitPUFRJT05TX1NQRUM9IlwKK2dpdC1tZXJnZSBbb3B0aW9uc10gPHJlbW90ZT4uLi4KK2dpdC1tZXJnZSBbb3B0aW9uc10gPG1zZz4gSEVBRCA8cmVtb3RlPgorLS0KK3N1bW1hcnkgICAgICAgICAgICAgIHNob3cgYSBkaWZmc3RhdCBhdCB0aGUgZW5kIG9mIHRoZSBtZXJnZQorbixuby1zdW1tYXJ5ICAgICAgICAgZG9uJ3Qgc2hvdyBhIGRpZmZzdGF0IGF0IHRoZSBlbmQgb2YgdGhlIG1lcmdlCitzcXVhc2ggICAgICAgICAgICAgICBjcmVhdGUgYSBzaW5nbGUgY29tbWl0IGluc3RlYWQgb2YgZG9pbmcgYSBtZXJnZQorY29tbWl0ICAgICAgICAgICAgICAgcGVyZm9ybSBhIGNvbW1pdCBpZiB0aGUgbWVyZ2Ugc3VjZXNzZXMgKGRlZmF1bHQpCitmZiAgICAgICAgICAgICAgICAgICBhbGxvdyBmYXN0IGZvcndhcmQgKGRlZmF1bHQpCitzLHN0cmF0ZWd5PSAgICAgICAgICBtZXJnZSBzdHJhdGVneSB0byB1c2UKK20sbWVzc2FnZT0gICAgICAgICAgIG1lc3NhZ2UgdG8gYmUgdXNlZCBmb3IgdGhlIG1lcmdlIGNvbW1pdCAoaWYgYW55KQorIgorCitTVUJESVJFQ1RPUllfT0s9WWVzCisuIGdpdC1zaC1zZXR1cAorcmVxdWlyZV93b3JrX3RyZWUKK2NkX3RvX3RvcGxldmVsCisKK3Rlc3QgLXogIiQoZ2l0IGxzLWZpbGVzIC11KSIgfHwKKwlkaWUgIllvdSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIGNvbmZsaWN0ZWQgbWVyZ2UuIgorCitMRj0nCisnCisKK2FsbF9zdHJhdGVnaWVzPSdyZWN1ciByZWN1cnNpdmUgb2N0b3B1cyByZXNvbHZlIHN0dXBpZCBvdXJzIHN1YnRyZWUnCitkZWZhdWx0X3R3b2hlYWRfc3RyYXRlZ2llcz0ncmVjdXJzaXZlJworZGVmYXVsdF9vY3RvcHVzX3N0cmF0ZWdpZXM9J29jdG9wdXMnCitub19mYXN0X2ZvcndhcmRfc3RyYXRlZ2llcz0nc3VidHJlZSBvdXJzJworbm9fdHJpdmlhbF9zdHJhdGVnaWVzPSdyZWN1cnNpdmUgcmVjdXIgc3VidHJlZSBvdXJzJwordXNlX3N0cmF0ZWdpZXM9CisKK2FsbG93X2Zhc3RfZm9yd2FyZD10CithbGxvd190cml2aWFsX21lcmdlPXQKK3NxdWFzaD0gbm9fY29tbWl0PQorCitkcm9wc2F2ZSgpIHsKKwlybSAtZiAtLSAiJEdJVF9ESVIvTUVSR0VfSEVBRCIgIiRHSVRfRElSL01FUkdFX01TRyIgXAorCQkgIiRHSVRfRElSL01FUkdFX1NUQVNIIiB8fCBleGl0IDEKK30KKworc2F2ZXN0YXRlKCkgeworCSMgU3Rhc2ggYXdheSBhbnkgbG9jYWwgbW9kaWZpY2F0aW9ucy4KKwlnaXQgc3Rhc2ggY3JlYXRlID4iJEdJVF9ESVIvTUVSR0VfU1RBU0giCit9CisKK3Jlc3RvcmVzdGF0ZSgpIHsKKyAgICAgICAgaWYgdGVzdCAtZiAiJEdJVF9ESVIvTUVSR0VfU1RBU0giCisJdGhlbgorCQlnaXQgcmVzZXQgLS1oYXJkICRoZWFkID4vZGV2L251bGwKKwkJZ2l0IHN0YXNoIGFwcGx5ICQoY2F0ICIkR0lUX0RJUi9NRVJHRV9TVEFTSCIpCisJCWdpdCB1cGRhdGUtaW5kZXggLS1yZWZyZXNoID4vZGV2L251bGwKKwlmaQorfQorCitmaW5pc2hfdXBfdG9fZGF0ZSAoKSB7CisJY2FzZSAiJHNxdWFzaCIgaW4KKwl0KQorCQllY2hvICIkMSAobm90aGluZyB0byBzcXVhc2gpIiA7OworCScnKQorCQllY2hvICIkMSIgOzsKKwllc2FjCisJZHJvcHNhdmUKK30KKworc3F1YXNoX21lc3NhZ2UgKCkgeworCWVjaG8gU3F1YXNoZWQgY29tbWl0IG9mIHRoZSBmb2xsb3dpbmc6CisJZWNobworCWdpdCBsb2cgLS1uby1tZXJnZXMgLS1wcmV0dHk9bWVkaXVtIF4iJGhlYWQiICRyZW1vdGVoZWFkcworfQorCitmaW5pc2ggKCkgeworCWlmIHRlc3QgJycgPSAiJDIiCisJdGhlbgorCQlybG9nbT0iJEdJVF9SRUZMT0dfQUNUSU9OIgorCWVsc2UKKwkJZWNobyAiJDIiCisJCXJsb2dtPSIkR0lUX1JFRkxPR19BQ1RJT046ICQyIgorCWZpCisJY2FzZSAiJHNxdWFzaCIgaW4KKwl0KQorCQllY2hvICJTcXVhc2ggY29tbWl0IC0tIG5vdCB1cGRhdGluZyBIRUFEIgorCQlzcXVhc2hfbWVzc2FnZSA+IiRHSVRfRElSL1NRVUFTSF9NU0ciCisJCTs7CisJJycpCisJCWNhc2UgIiRtZXJnZV9tc2ciIGluCisJCScnKQorCQkJZWNobyAiTm8gbWVyZ2UgbWVzc2FnZSAtLSBub3QgdXBkYXRpbmcgSEVBRCIKKwkJCTs7CisJCSopCisJCQlnaXQgdXBkYXRlLXJlZiAtbSAiJHJsb2dtIiBIRUFEICIkMSIgIiRoZWFkIiB8fCBleGl0IDEKKwkJCWdpdCBnYyAtLWF1dG8KKwkJCTs7CisJCWVzYWMKKwkJOzsKKwllc2FjCisJY2FzZSAiJDEiIGluCisJJycpCisJCTs7CisJPyopCisJCWlmIHRlc3QgIiRzaG93X2RpZmZzdGF0IiA9IHQKKwkJdGhlbgorCQkJIyBXZSB3YW50IGNvbG9yIChpZiBzZXQpLCBidXQgbm8gcGFnZXIKKwkJCUdJVF9QQUdFUj0nJyBnaXQgZGlmZiAtLXN0YXQgLS1zdW1tYXJ5IC1NICIkaGVhZCIgIiQxIgorCQlmaQorCQk7OworCWVzYWMKKworCSMgUnVuIGEgcG9zdC1tZXJnZSBob29rCisgICAgICAgIGlmIHRlc3QgLXggIiRHSVRfRElSIi9ob29rcy9wb3N0LW1lcmdlCisgICAgICAgIHRoZW4KKwkgICAgY2FzZSAiJHNxdWFzaCIgaW4KKwkgICAgdCkKKyAgICAgICAgICAgICAgICAiJEdJVF9ESVIiL2hvb2tzL3Bvc3QtbWVyZ2UgMQorCQk7OworCSAgICAnJykKKyAgICAgICAgICAgICAgICAiJEdJVF9ESVIiL2hvb2tzL3Bvc3QtbWVyZ2UgMAorCQk7OworCSAgICBlc2FjCisgICAgICAgIGZpCit9CisKK21lcmdlX25hbWUgKCkgeworCXJlbW90ZT0iJDEiCisJcmg9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5ICIkcmVtb3RlXjAiIDI+L2Rldi9udWxsKSB8fCByZXR1cm4KKwliaD0kKGdpdCBzaG93LXJlZiAtcyAtLXZlcmlmeSAicmVmcy9oZWFkcy8kcmVtb3RlIiAyPi9kZXYvbnVsbCkKKwlpZiB0ZXN0ICIkcmgiID0gIiRiaCIKKwl0aGVuCisJCWVjaG8gIiRyaAkJYnJhbmNoICckcmVtb3RlJyBvZiAuIgorCWVsaWYgdHJ1bmFtZT0kKGV4cHIgIiRyZW1vdGUiIDogJ1woLipcKX5bMS05XVswLTldKiQnKSAmJgorCQlnaXQgc2hvdy1yZWYgLXEgLS12ZXJpZnkgInJlZnMvaGVhZHMvJHRydW5hbWUiIDI+L2Rldi9udWxsCisJdGhlbgorCQllY2hvICIkcmgJCWJyYW5jaCAnJHRydW5hbWUnIChlYXJseSBwYXJ0KSBvZiAuIgorCWVsaWYgdGVzdCAiJHJlbW90ZSIgPSAiRkVUQ0hfSEVBRCIgLWEgLXIgIiRHSVRfRElSL0ZFVENIX0hFQUQiCisJdGhlbgorCQlzZWQgLWUgJ3MvCW5vdC1mb3ItbWVyZ2UJLwkJLycgLWUgMXEgXAorCQkJIiRHSVRfRElSL0ZFVENIX0hFQUQiCisJZWxzZQorCQllY2hvICIkcmgJCWNvbW1pdCAnJHJlbW90ZSciCisJZmkKK30KKworcGFyc2VfY29uZmlnICgpIHsKKwl3aGlsZSB0ZXN0ICQjICE9IDA7IGRvCisJCWNhc2UgIiQxIiBpbgorCQktbnwtLW5vLXN1bW1hcnkpCisJCQlzaG93X2RpZmZzdGF0PWZhbHNlIDs7CisJCS0tc3VtbWFyeSkKKwkJCXNob3dfZGlmZnN0YXQ9dCA7OworCQktLXNxdWFzaCkKKwkJCXRlc3QgIiRhbGxvd19mYXN0X2ZvcndhcmQiID0gdCB8fAorCQkJCWRpZSAiWW91IGNhbm5vdCBjb21iaW5lIC0tc3F1YXNoIHdpdGggLS1uby1mZi4iCisJCQlzcXVhc2g9dCBub19jb21taXQ9dCA7OworCQktLW5vLXNxdWFzaCkKKwkJCXNxdWFzaD0gbm9fY29tbWl0PSA7OworCQktLWNvbW1pdCkKKwkJCW5vX2NvbW1pdD0gOzsKKwkJLS1uby1jb21taXQpCisJCQlub19jb21taXQ9dCA7OworCQktLWZmKQorCQkJYWxsb3dfZmFzdF9mb3J3YXJkPXQgOzsKKwkJLS1uby1mZikKKwkJCXRlc3QgIiRzcXVhc2giICE9IHQgfHwKKwkJCQlkaWUgIllvdSBjYW5ub3QgY29tYmluZSAtLXNxdWFzaCB3aXRoIC0tbm8tZmYuIgorCQkJYWxsb3dfZmFzdF9mb3J3YXJkPWYgOzsKKwkJLXN8LS1zdHJhdGVneSkKKwkJCXNoaWZ0CisJCQljYXNlICIgJGFsbF9zdHJhdGVnaWVzICIgaW4KKwkJCSoiICQxICIqKQorCQkJCXVzZV9zdHJhdGVnaWVzPSIkdXNlX3N0cmF0ZWdpZXMkMSAiIDs7CisJCQkqKQorCQkJCWRpZSAiYXZhaWxhYmxlIHN0cmF0ZWdpZXMgYXJlOiAkYWxsX3N0cmF0ZWdpZXMiIDs7CisJCQllc2FjCisJCQk7OworCQktbXwtLW1lc3NhZ2UpCisJCQlzaGlmdAorCQkJbWVyZ2VfbXNnPSIkMSIKKwkJCWhhdmVfbWVzc2FnZT10CisJCQk7OworCQktLSkKKwkJCXNoaWZ0CisJCQlicmVhayA7OworCQkqKQl1c2FnZSA7OworCQllc2FjCisJCXNoaWZ0CisJZG9uZQorCWFyZ3NfbGVmdD0kIworfQorCit0ZXN0ICQjICE9IDAgfHwgdXNhZ2UKKworaGF2ZV9tZXNzYWdlPQorCitpZiBicmFuY2g9JChnaXQtc3ltYm9saWMtcmVmIC1xIEhFQUQpCit0aGVuCisJbWVyZ2VvcHRzPSQoZ2l0IGNvbmZpZyAiYnJhbmNoLiR7YnJhbmNoI3JlZnMvaGVhZHMvfS5tZXJnZW9wdGlvbnMiKQorCWlmIHRlc3QgLW4gIiRtZXJnZW9wdHMiCisJdGhlbgorCQlwYXJzZV9jb25maWcgJG1lcmdlb3B0cyAtLQorCWZpCitmaQorCitwYXJzZV9jb25maWcgIiRAIgord2hpbGUgdGVzdCAkYXJnc19sZWZ0IC1sdCAkIzsgZG8gc2hpZnQ7IGRvbmUKKworaWYgdGVzdCAteiAiJHNob3dfZGlmZnN0YXQiOyB0aGVuCisgICAgdGVzdCAiJChnaXQgY29uZmlnIC0tYm9vbCBtZXJnZS5kaWZmc3RhdCkiID0gZmFsc2UgJiYgc2hvd19kaWZmc3RhdD1mYWxzZQorICAgIHRlc3QgLXogIiRzaG93X2RpZmZzdGF0IiAmJiBzaG93X2RpZmZzdGF0PXQKK2ZpCisKKyMgVGhpcyBjb3VsZCBiZSB0cmFkaXRpb25hbCAibWVyZ2UgPG1zZz4gSEVBRCA8Y29tbWl0Pi4uLiIgIGFuZCB0aGUKKyMgd2F5IHdlIGNhbiB0ZWxsIGl0IGlzIHRvIHNlZSBpZiB0aGUgc2Vjb25kIHRva2VuIGlzIEhFQUQsIGJ1dCBzb21lCisjIHBlb3BsZSBtaWdodCBoYXZlIG1pc3VzZWQgdGhlIGludGVyZmFjZSBhbmQgdXNlZCBhIGNvbW1pdHRpc2ggdGhhdAorIyBpcyB0aGUgc2FtZSBhcyBIRUFEIHRoZXJlIGluc3RlYWQuICBUcmFkaXRpb25hbCBmb3JtYXQgbmV2ZXIgd291bGQKKyMgaGF2ZSAiLW0iIHNvIGl0IGlzIGFuIGFkZGl0aW9uYWwgc2FmZXR5IG1lYXN1cmUgdG8gY2hlY2sgZm9yIGl0LgorCitpZiB0ZXN0IC16ICIkaGF2ZV9tZXNzYWdlIiAmJgorCXNlY29uZF90b2tlbj0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgIiQyXjAiIDI+L2Rldi9udWxsKSAmJgorCWhlYWRfY29tbWl0PSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAiSEVBRCIgMj4vZGV2L251bGwpICYmCisJdGVzdCAiJHNlY29uZF90b2tlbiIgPSAiJGhlYWRfY29tbWl0IgordGhlbgorCW1lcmdlX21zZz0iJDEiCisJc2hpZnQKKwloZWFkX2FyZz0iJDEiCisJc2hpZnQKK2VsaWYgISBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQgPi9kZXYvbnVsbCAyPiYxCit0aGVuCisJIyBJZiB0aGUgbWVyZ2VkIGhlYWQgaXMgYSB2YWxpZCBvbmUgdGhlcmUgaXMgbm8gcmVhc29uIHRvCisJIyBmb3JiaWQgImdpdCBtZXJnZSIgaW50byBhIGJyYW5jaCB5ZXQgdG8gYmUgYm9ybi4gIFdlIGRvCisJIyB0aGUgc2FtZSBmb3IgImdpdCBwdWxsIi4KKwlpZiB0ZXN0IDEgLW5lICQjCisJdGhlbgorCQllY2hvID4mMiAiQ2FuIG1lcmdlIG9ubHkgZXhhY3RseSBvbmUgY29tbWl0IGludG8gZW1wdHkgaGVhZCIKKwkJZXhpdCAxCisJZmkKKworCXJoPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAiJDFeMCIpIHx8CisJCWRpZSAiJDEgLSBub3Qgc29tZXRoaW5nIHdlIGNhbiBtZXJnZSIKKworCWdpdCB1cGRhdGUtcmVmIC1tICJpbml0aWFsIHB1bGwiIEhFQUQgIiRyaCIgIiIgJiYKKwlnaXQgcmVhZC10cmVlIC0tcmVzZXQgLXUgSEVBRAorCWV4aXQKKworZWxzZQorCSMgV2UgYXJlIGludm9rZWQgZGlyZWN0bHkgYXMgdGhlIGZpcnN0LWNsYXNzIFVJLgorCWhlYWRfYXJnPUhFQUQKKworCSMgQWxsIHRoZSByZXN0IGFyZSB0aGUgY29tbWl0cyBiZWluZyBtZXJnZWQ7IHByZXBhcmUKKwkjIHRoZSBzdGFuZGFyZCBtZXJnZSBzdW1tYXJ5IG1lc3NhZ2UgdG8gYmUgYXBwZW5kZWQgdG8KKwkjIHRoZSBnaXZlbiBtZXNzYWdlLiAgSWYgcmVtb3RlIGlzIGludmFsaWQgd2Ugd2lsbCBkaWUKKwkjIGxhdGVyIGluIHRoZSBjb21tb24gY29kZXBhdGggc28gd2UgZGlzY2FyZCB0aGUgZXJyb3IKKwkjIGluIHRoaXMgbG9vcC4KKwltZXJnZV9uYW1lPSQoZm9yIHJlbW90ZQorCQlkbworCQkJbWVyZ2VfbmFtZSAiJHJlbW90ZSIKKwkJZG9uZSB8IGdpdCBmbXQtbWVyZ2UtbXNnCisJKQorCW1lcmdlX21zZz0iJHttZXJnZV9tc2c6KyRtZXJnZV9tc2ckTEYkTEZ9JG1lcmdlX25hbWUiCitmaQoraGVhZD0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgIiRoZWFkX2FyZyJeMCkgfHwgdXNhZ2UKKworIyBBbGwgdGhlIHJlc3QgYXJlIHJlbW90ZSBoZWFkcwordGVzdCAiJCMiID0gMCAmJiB1c2FnZSA7IyB3ZSBuZWVkIGF0IGxlYXN0IG9uZSByZW1vdGUgaGVhZC4KK3NldF9yZWZsb2dfYWN0aW9uICJtZXJnZSAkKiIKKworcmVtb3RlaGVhZHM9Citmb3IgcmVtb3RlCitkbworCXJlbW90ZWhlYWQ9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5ICIkcmVtb3RlIl4wIDI+L2Rldi9udWxsKSB8fAorCSAgICBkaWUgIiRyZW1vdGUgLSBub3Qgc29tZXRoaW5nIHdlIGNhbiBtZXJnZSIKKwlyZW1vdGVoZWFkcz0iJHtyZW1vdGVoZWFkc30kcmVtb3RlaGVhZCAiCisJZXZhbCBHSVRIRUFEXyRyZW1vdGVoZWFkPSciJHJlbW90ZSInCisJZXhwb3J0IEdJVEhFQURfJHJlbW90ZWhlYWQKK2RvbmUKK3NldCB4ICRyZW1vdGVoZWFkcyA7IHNoaWZ0CisKK2Nhc2UgIiR1c2Vfc3RyYXRlZ2llcyIgaW4KKycnKQorCWNhc2UgIiQjIiBpbgorCTEpCisJCXZhcj0iYGdpdCBjb25maWcgLS1nZXQgcHVsbC50d29oZWFkYCIKKwkJaWYgdGVzdCAtbiAiJHZhciIKKwkJdGhlbgorCQkJdXNlX3N0cmF0ZWdpZXM9IiR2YXIiCisJCWVsc2UKKwkJCXVzZV9zdHJhdGVnaWVzPSIkZGVmYXVsdF90d29oZWFkX3N0cmF0ZWdpZXMiCisJCWZpIDs7CisJKikKKwkJdmFyPSJgZ2l0IGNvbmZpZyAtLWdldCBwdWxsLm9jdG9wdXNgIgorCQlpZiB0ZXN0IC1uICIkdmFyIgorCQl0aGVuCisJCQl1c2Vfc3RyYXRlZ2llcz0iJHZhciIKKwkJZWxzZQorCQkJdXNlX3N0cmF0ZWdpZXM9IiRkZWZhdWx0X29jdG9wdXNfc3RyYXRlZ2llcyIKKwkJZmkgOzsKKwllc2FjCisJOzsKK2VzYWMKKworZm9yIHMgaW4gJHVzZV9zdHJhdGVnaWVzCitkbworCWZvciBzcyBpbiAkbm9fZmFzdF9mb3J3YXJkX3N0cmF0ZWdpZXMKKwlkbworCQljYXNlICIgJHMgIiBpbgorCQkqIiAkc3MgIiopCisJCQlhbGxvd19mYXN0X2ZvcndhcmQ9ZgorCQkJYnJlYWsKKwkJCTs7CisJCWVzYWMKKwlkb25lCisJZm9yIHNzIGluICRub190cml2aWFsX3N0cmF0ZWdpZXMKKwlkbworCQljYXNlICIgJHMgIiBpbgorCQkqIiAkc3MgIiopCisJCQlhbGxvd190cml2aWFsX21lcmdlPWYKKwkJCWJyZWFrCisJCQk7OworCQllc2FjCisJZG9uZQorZG9uZQorCitjYXNlICIkIyIgaW4KKzEpCisJY29tbW9uPSQoZ2l0IG1lcmdlLWJhc2UgLS1hbGwgJGhlYWQgIiRAIikKKwk7OworKikKKwljb21tb249JChnaXQgc2hvdy1icmFuY2ggLS1tZXJnZS1iYXNlICRoZWFkICIkQCIpCisJOzsKK2VzYWMKK2VjaG8gIiRoZWFkIiA+IiRHSVRfRElSL09SSUdfSEVBRCIKKworY2FzZSAiJGFsbG93X2Zhc3RfZm9yd2FyZCwkIywkY29tbW9uLCRub19jb21taXQiIGluCis/LCosJycsKikKKwkjIE5vIGNvbW1vbiBhbmNlc3RvcnMgZm91bmQuIFdlIG5lZWQgYSByZWFsIG1lcmdlLgorCTs7Cis/LDEsIiQxIiwqKQorCSMgSWYgaGVhZCBjYW4gcmVhY2ggYWxsIHRoZSBtZXJnZSB0aGVuIHdlIGFyZSB1cCB0byBkYXRlLgorCSMgYnV0IGZpcnN0IHRoZSBtb3N0IGNvbW1vbiBjYXNlIG9mIG1lcmdpbmcgb25lIHJlbW90ZS4KKwlmaW5pc2hfdXBfdG9fZGF0ZSAiQWxyZWFkeSB1cC10by1kYXRlLiIKKwlleGl0IDAKKwk7OwordCwxLCIkaGVhZCIsKikKKwkjIEFnYWluIHRoZSBtb3N0IGNvbW1vbiBjYXNlIG9mIG1lcmdpbmcgb25lIHJlbW90ZS4KKwllY2hvICJVcGRhdGluZyAkKGdpdCByZXYtcGFyc2UgLS1zaG9ydCAkaGVhZCkuLiQoZ2l0IHJldi1wYXJzZSAtLXNob3J0ICQxKSIKKwlnaXQgdXBkYXRlLWluZGV4IC0tcmVmcmVzaCAyPi9kZXYvbnVsbAorCW1zZz0iRmFzdCBmb3J3YXJkIgorCWlmIHRlc3QgLW4gIiRoYXZlX21lc3NhZ2UiCisJdGhlbgorCQltc2c9IiRtc2cgKG5vIGNvbW1pdCBjcmVhdGVkOyAtbSBvcHRpb24gaWdub3JlZCkiCisJZmkKKwluZXdfaGVhZD0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgIiQxXjAiKSAmJgorCWdpdCByZWFkLXRyZWUgLXYgLW0gLXUgLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9LmdpdGlnbm9yZSAkaGVhZCAiJG5ld19oZWFkIiAmJgorCWZpbmlzaCAiJG5ld19oZWFkIiAiJG1zZyIgfHwgZXhpdAorCWRyb3BzYXZlCisJZXhpdCAwCisJOzsKKz8sMSw/KiIkTEYiPyosKikKKwkjIFdlIGFyZSBub3QgZG9pbmcgb2N0b3B1cyBhbmQgbm90IGZhc3QgZm9yd2FyZC4gIE5lZWQgYQorCSMgcmVhbCBtZXJnZS4KKwk7OworPywxLCosKQorCSMgV2UgYXJlIG5vdCBkb2luZyBvY3RvcHVzLCBub3QgZmFzdCBmb3J3YXJkLCBhbmQgaGF2ZSBvbmx5CisJIyBvbmUgY29tbW9uLgorCWdpdCB1cGRhdGUtaW5kZXggLS1yZWZyZXNoIDI+L2Rldi9udWxsCisJY2FzZSAiJGFsbG93X3RyaXZpYWxfbWVyZ2UiIGluCisJdCkKKwkJIyBTZWUgaWYgaXQgaXMgcmVhbGx5IHRyaXZpYWwuCisJCWdpdCB2YXIgR0lUX0NPTU1JVFRFUl9JREVOVCA+L2Rldi9udWxsIHx8IGV4aXQKKwkJZWNobyAiVHJ5aW5nIHJlYWxseSB0cml2aWFsIGluLWluZGV4IG1lcmdlLi4uIgorCQlpZiBnaXQgcmVhZC10cmVlIC0tdHJpdmlhbCAtbSAtdSAtdiAkY29tbW9uICRoZWFkICIkMSIgJiYKKwkJICAgcmVzdWx0X3RyZWU9JChnaXQgd3JpdGUtdHJlZSkKKwkJdGhlbgorCQkJZWNobyAiV29uZGVyZnVsLiIKKwkJCXJlc3VsdF9jb21taXQ9JCgKKwkJCQlwcmludGYgJyVzXG4nICIkbWVyZ2VfbXNnIiB8CisJCQkJZ2l0IGNvbW1pdC10cmVlICRyZXN1bHRfdHJlZSAtcCBIRUFEIC1wICIkMSIKKwkJCSkgfHwgZXhpdAorCQkJZmluaXNoICIkcmVzdWx0X2NvbW1pdCIgIkluLWluZGV4IG1lcmdlIgorCQkJZHJvcHNhdmUKKwkJCWV4aXQgMAorCQlmaQorCQllY2hvICJOb3BlLiIKKwllc2FjCisJOzsKKyopCisJIyBBbiBvY3RvcHVzLiAgSWYgd2UgY2FuIHJlYWNoIGFsbCB0aGUgcmVtb3RlIHdlIGFyZSB1cCB0byBkYXRlLgorCXVwX3RvX2RhdGU9dAorCWZvciByZW1vdGUKKwlkbworCQljb21tb25fb25lPSQoZ2l0IG1lcmdlLWJhc2UgLS1hbGwgJGhlYWQgJHJlbW90ZSkKKwkJaWYgdGVzdCAiJGNvbW1vbl9vbmUiICE9ICIkcmVtb3RlIgorCQl0aGVuCisJCQl1cF90b19kYXRlPWYKKwkJCWJyZWFrCisJCWZpCisJZG9uZQorCWlmIHRlc3QgIiR1cF90b19kYXRlIiA9IHQKKwl0aGVuCisJCWZpbmlzaF91cF90b19kYXRlICJBbHJlYWR5IHVwLXRvLWRhdGUuIFllZWFoISIKKwkJZXhpdCAwCisJZmkKKwk7OworZXNhYworCisjIFdlIGFyZSBnb2luZyB0byBtYWtlIGEgbmV3IGNvbW1pdC4KK2dpdCB2YXIgR0lUX0NPTU1JVFRFUl9JREVOVCA+L2Rldi9udWxsIHx8IGV4aXQKKworIyBBdCB0aGlzIHBvaW50LCB3ZSBuZWVkIGEgcmVhbCBtZXJnZS4gIE5vIG1hdHRlciB3aGF0IHN0cmF0ZWd5CisjIHdlIHVzZSwgaXQgd291bGQgb3BlcmF0ZSBvbiB0aGUgaW5kZXgsIHBvc3NpYmx5IGFmZmVjdGluZyB0aGUKKyMgd29ya2luZyB0cmVlLCBhbmQgd2hlbiByZXNvbHZlZCBjbGVhbmx5LCBoYXZlIHRoZSBkZXNpcmVkIHRyZWUKKyMgaW4gdGhlIGluZGV4IC0tIHRoaXMgbWVhbnMgdGhhdCB0aGUgaW5kZXggbXVzdCBiZSBpbiBzeW5jIHdpdGgKKyMgdGhlICRoZWFkIGNvbW1pdC4gIFRoZSBzdHJhdGVnaWVzIGFyZSByZXNwb25zaWJsZSB0byBlbnN1cmUgdGhpcy4KKworY2FzZSAiJHVzZV9zdHJhdGVnaWVzIiBpbgorPyonICc/KikKKyAgICAjIFN0YXNoIGF3YXkgdGhlIGxvY2FsIGNoYW5nZXMgc28gdGhhdCB3ZSBjYW4gdHJ5IG1vcmUgdGhhbiBvbmUuCisgICAgc2F2ZXN0YXRlCisgICAgc2luZ2xlX3N0cmF0ZWd5PW5vCisgICAgOzsKKyopCisgICAgcm0gLWYgIiRHSVRfRElSL01FUkdFX1NUQVNIIgorICAgIHNpbmdsZV9zdHJhdGVneT15ZXMKKyAgICA7OworZXNhYworCityZXN1bHRfdHJlZT0gYmVzdF9jbnQ9LTEgYmVzdF9zdHJhdGVneT0gd3Rfc3RyYXRlZ3k9CittZXJnZV93YXNfb2s9Citmb3Igc3RyYXRlZ3kgaW4gJHVzZV9zdHJhdGVnaWVzCitkbworICAgIHRlc3QgIiR3dF9zdHJhdGVneSIgPSAnJyB8fCB7CisJZWNobyAiUmV3aW5kaW5nIHRoZSB0cmVlIHRvIHByaXN0aW5lLi4uIgorCXJlc3RvcmVzdGF0ZQorICAgIH0KKyAgICBjYXNlICIkc2luZ2xlX3N0cmF0ZWd5IiBpbgorICAgIG5vKQorCWVjaG8gIlRyeWluZyBtZXJnZSBzdHJhdGVneSAkc3RyYXRlZ3kuLi4iCisJOzsKKyAgICBlc2FjCisKKyAgICAjIFJlbWVtYmVyIHdoaWNoIHN0cmF0ZWd5IGxlZnQgdGhlIHN0YXRlIGluIHRoZSB3b3JraW5nIHRyZWUKKyAgICB3dF9zdHJhdGVneT0kc3RyYXRlZ3kKKworICAgIGdpdC1tZXJnZS0kc3RyYXRlZ3kgJGNvbW1vbiAtLSAiJGhlYWRfYXJnIiAiJEAiCisgICAgZXhpdD0kPworICAgIGlmIHRlc3QgIiRub19jb21taXQiID0gdCAmJiB0ZXN0ICIkZXhpdCIgPSAwCisgICAgdGhlbgorICAgICAgICBtZXJnZV93YXNfb2s9dAorCWV4aXQ9MSA7IyBwcmV0ZW5kIGl0IGxlZnQgY29uZmxpY3RzLgorICAgIGZpCisKKyAgICB0ZXN0ICIkZXhpdCIgPSAwIHx8IHsKKworCSMgVGhlIGJhY2tlbmQgZXhpdHMgd2l0aCAxIHdoZW4gY29uZmxpY3RzIGFyZSBsZWZ0IHRvIGJlIHJlc29sdmVkLAorCSMgd2l0aCAyIHdoZW4gaXQgZG9lcyBub3QgaGFuZGxlIHRoZSBnaXZlbiBtZXJnZSBhdCBhbGwuCisKKwlpZiB0ZXN0ICIkZXhpdCIgLWVxIDEKKwl0aGVuCisJICAgIGNudD1geworCQlnaXQgZGlmZi1maWxlcyAtLW5hbWUtb25seQorCQlnaXQgbHMtZmlsZXMgLS11bm1lcmdlZAorCSAgICB9IHwgd2MgLWxgCisJICAgIGlmIHRlc3QgJGJlc3RfY250IC1sZSAwIC1vICRjbnQgLWxlICRiZXN0X2NudAorCSAgICB0aGVuCisJCWJlc3Rfc3RyYXRlZ3k9JHN0cmF0ZWd5CisJCWJlc3RfY250PSRjbnQKKwkgICAgZmkKKwlmaQorCWNvbnRpbnVlCisgICAgfQorCisgICAgIyBBdXRvbWVyZ2Ugc3VjY2VlZGVkLgorICAgIHJlc3VsdF90cmVlPSQoZ2l0IHdyaXRlLXRyZWUpICYmIGJyZWFrCitkb25lCisKKyMgSWYgd2UgaGF2ZSBhIHJlc3VsdGluZyB0cmVlLCB0aGF0IG1lYW5zIHRoZSBzdHJhdGVneSBtb2R1bGUKKyMgYXV0byByZXNvbHZlZCB0aGUgbWVyZ2UgY2xlYW5seS4KK2lmIHRlc3QgJycgIT0gIiRyZXN1bHRfdHJlZSIKK3RoZW4KKyAgICBpZiB0ZXN0ICIkYWxsb3dfZmFzdF9mb3J3YXJkIiA9ICJ0IgorICAgIHRoZW4KKyAgICAgICAgcGFyZW50cz0kKGdpdCBzaG93LWJyYW5jaCAtLWluZGVwZW5kZW50ICIkaGVhZCIgIiRAIikKKyAgICBlbHNlCisgICAgICAgIHBhcmVudHM9JChnaXQgcmV2LXBhcnNlICIkaGVhZCIgIiRAIikKKyAgICBmaQorICAgIHBhcmVudHM9JChlY2hvICIkcGFyZW50cyIgfCBzZWQgLWUgJ3MvXi8tcCAvJykKKyAgICByZXN1bHRfY29tbWl0PSQocHJpbnRmICclc1xuJyAiJG1lcmdlX21zZyIgfCBnaXQgY29tbWl0LXRyZWUgJHJlc3VsdF90cmVlICRwYXJlbnRzKSB8fCBleGl0CisgICAgZmluaXNoICIkcmVzdWx0X2NvbW1pdCIgIk1lcmdlIG1hZGUgYnkgJHd0X3N0cmF0ZWd5LiIKKyAgICBkcm9wc2F2ZQorICAgIGV4aXQgMAorZmkKKworIyBQaWNrIHRoZSByZXN1bHQgZnJvbSB0aGUgYmVzdCBzdHJhdGVneSBhbmQgaGF2ZSB0aGUgdXNlciBmaXggaXQgdXAuCitjYXNlICIkYmVzdF9zdHJhdGVneSIgaW4KKycnKQorCXJlc3RvcmVzdGF0ZQorCWNhc2UgIiR1c2Vfc3RyYXRlZ2llcyIgaW4KKwk/KicgJz8qKQorCQllY2hvID4mMiAiTm8gbWVyZ2Ugc3RyYXRlZ3kgaGFuZGxlZCB0aGUgbWVyZ2UuIgorCQk7OworCSopCisJCWVjaG8gPiYyICJNZXJnZSB3aXRoIHN0cmF0ZWd5ICR1c2Vfc3RyYXRlZ2llcyBmYWlsZWQuIgorCQk7OworCWVzYWMKKwlleGl0IDIKKwk7OworIiR3dF9zdHJhdGVneSIpCisJIyBXZSBhbHJlYWR5IGhhdmUgaXRzIHJlc3VsdCBpbiB0aGUgd29ya2luZyB0cmVlLgorCTs7CisqKQorCWVjaG8gIlJld2luZGluZyB0aGUgdHJlZSB0byBwcmlzdGluZS4uLiIKKwlyZXN0b3Jlc3RhdGUKKwllY2hvICJVc2luZyB0aGUgJGJlc3Rfc3RyYXRlZ3kgdG8gcHJlcGFyZSByZXNvbHZpbmcgYnkgaGFuZC4iCisJZ2l0LW1lcmdlLSRiZXN0X3N0cmF0ZWd5ICRjb21tb24gLS0gIiRoZWFkX2FyZyIgIiRAIgorCTs7Citlc2FjCisKK2lmIHRlc3QgIiRzcXVhc2giID0gdAordGhlbgorCWZpbmlzaAorZWxzZQorCWZvciByZW1vdGUKKwlkbworCQllY2hvICRyZW1vdGUKKwlkb25lID4iJEdJVF9ESVIvTUVSR0VfSEVBRCIKKwlwcmludGYgJyVzXG4nICIkbWVyZ2VfbXNnIiA+IiRHSVRfRElSL01FUkdFX01TRyIKK2ZpCisKK2lmIHRlc3QgIiRtZXJnZV93YXNfb2siID0gdAordGhlbgorCWVjaG8gPiYyIFwKKwkiQXV0b21hdGljIG1lcmdlIHdlbnQgd2VsbDsgc3RvcHBlZCBiZWZvcmUgY29tbWl0dGluZyBhcyByZXF1ZXN0ZWQiCisJZXhpdCAwCitlbHNlCisJeworCSAgICBlY2hvICcKK0NvbmZsaWN0czoKKycKKwkJZ2l0IGxzLWZpbGVzIC0tdW5tZXJnZWQgfAorCQlzZWQgLWUgJ3MvXlteCV0qCS8JLycgfAorCQl1bmlxCisJfSA+PiIkR0lUX0RJUi9NRVJHRV9NU0ciCisJZ2l0IHJlcmVyZQorCWRpZSAiQXV0b21hdGljIG1lcmdlIGZhaWxlZDsgZml4IGNvbmZsaWN0cyBhbmQgdGhlbiBjb21taXQgdGhlIHJlc3VsdC4iCitmaQpkaWZmIC0tZ2l0IGEvZ2l0LW1lcmdldG9vbC5zaCBiL2dpdC1tZXJnZXRvb2wuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWM4NmY2OQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1tZXJnZXRvb2wuc2gKQEAgLTAsMCArMSw0MjUgQEAKKyMhL2Jpbi9zaAorIworIyBUaGlzIHByb2dyYW0gcmVzb2x2ZXMgbWVyZ2UgY29uZmxpY3RzIGluIGdpdAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlb2RvcmUgWS4gVHMnbworIworIyBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTCB2Miwgb3IgYSBsYXRlciB2ZXJzaW9uCisjIGF0IHRoZSBkaXNjcmV0aW9uIG9mIEp1bmlvIEMgSGFtYW5vLgorIworCitVU0FHRT0nWy0tdG9vbD10b29sXSBbZmlsZSB0byBtZXJnZV0gLi4uJworU1VCRElSRUNUT1JZX09LPVllcworT1BUSU9OU19TUEVDPQorLiBnaXQtc2gtc2V0dXAKK3JlcXVpcmVfd29ya190cmVlCitwcmVmaXg9JChnaXQgcmV2LXBhcnNlIC0tc2hvdy1wcmVmaXgpCisKKyMgUmV0dXJucyB0cnVlIGlmIHRoZSBtb2RlIHJlZmxlY3RzIGEgc3ltbGluaworaXNfc3ltbGluayAoKSB7CisgICAgdGVzdCAiJDEiID0gMTIwMDAwCit9CisKK2xvY2FsX3ByZXNlbnQgKCkgeworICAgIHRlc3QgLW4gIiRsb2NhbF9tb2RlIgorfQorCityZW1vdGVfcHJlc2VudCAoKSB7CisgICAgdGVzdCAtbiAiJHJlbW90ZV9tb2RlIgorfQorCitiYXNlX3ByZXNlbnQgKCkgeworICAgIHRlc3QgLW4gIiRiYXNlX21vZGUiCit9CisKK2NsZWFudXBfdGVtcF9maWxlcyAoKSB7CisgICAgaWYgdGVzdCAiJDEiID0gLS1zYXZlLWJhY2t1cCA7IHRoZW4KKwltdiAtLSAiJEJBQ0tVUCIgIiRNRVJHRUQub3JpZyIKKwlybSAtZiAtLSAiJExPQ0FMIiAiJFJFTU9URSIgIiRCQVNFIgorICAgIGVsc2UKKwlybSAtZiAtLSAiJExPQ0FMIiAiJFJFTU9URSIgIiRCQVNFIiAiJEJBQ0tVUCIKKyAgICBmaQorfQorCitkZXNjcmliZV9maWxlICgpIHsKKyAgICBtb2RlPSIkMSIKKyAgICBicmFuY2g9IiQyIgorICAgIGZpbGU9IiQzIgorCisgICAgcHJpbnRmICIgIHslc306ICIgIiRicmFuY2giCisgICAgaWYgdGVzdCAteiAiJG1vZGUiOyB0aGVuCisJZWNobyAiZGVsZXRlZCIKKyAgICBlbGlmIGlzX3N5bWxpbmsgIiRtb2RlIiA7IHRoZW4KKwllY2hvICJhIHN5bWJvbGljIGxpbmsgLT4gJyQoY2F0ICIkZmlsZSIpJyIKKyAgICBlbHNlCisJaWYgYmFzZV9wcmVzZW50OyB0aGVuCisJICAgIGVjaG8gIm1vZGlmaWVkIgorCWVsc2UKKwkgICAgZWNobyAiY3JlYXRlZCIKKwlmaQorICAgIGZpCit9CisKKworcmVzb2x2ZV9zeW1saW5rX21lcmdlICgpIHsKKyAgICB3aGlsZSB0cnVlOyBkbworCXByaW50ZiAiVXNlIChsKW9jYWwgb3IgKHIpZW1vdGUsIG9yIChhKWJvcnQ/ICIKKwlyZWFkIGFucworCWNhc2UgIiRhbnMiIGluCisJICAgIFtsTF0qKQorCQlnaXQgY2hlY2tvdXQtaW5kZXggLWYgLS1zdGFnZT0yIC0tICIkTUVSR0VEIgorCQlnaXQgYWRkIC0tICIkTUVSR0VEIgorCQljbGVhbnVwX3RlbXBfZmlsZXMgLS1zYXZlLWJhY2t1cAorCQlyZXR1cm4KKwkJOzsKKwkgICAgW3JSXSopCisJCWdpdCBjaGVja291dC1pbmRleCAtZiAtLXN0YWdlPTMgLS0gIiRNRVJHRUQiCisJCWdpdCBhZGQgLS0gIiRNRVJHRUQiCisJCWNsZWFudXBfdGVtcF9maWxlcyAtLXNhdmUtYmFja3VwCisJCXJldHVybgorCQk7OworCSAgICBbYUFdKikKKwkJZXhpdCAxCisJCTs7CisJICAgIGVzYWMKKwlkb25lCit9CisKK3Jlc29sdmVfZGVsZXRlZF9tZXJnZSAoKSB7CisgICAgd2hpbGUgdHJ1ZTsgZG8KKwlpZiBiYXNlX3ByZXNlbnQ7IHRoZW4KKwkgICAgcHJpbnRmICJVc2UgKG0pb2RpZmllZCBvciAoZCllbGV0ZWQgZmlsZSwgb3IgKGEpYm9ydD8gIgorCWVsc2UKKwkgICAgcHJpbnRmICJVc2UgKGMpcmVhdGVkIG9yIChkKWVsZXRlZCBmaWxlLCBvciAoYSlib3J0PyAiCisJZmkKKwlyZWFkIGFucworCWNhc2UgIiRhbnMiIGluCisJICAgIFttTWNDXSopCisJCWdpdCBhZGQgLS0gIiRNRVJHRUQiCisJCWNsZWFudXBfdGVtcF9maWxlcyAtLXNhdmUtYmFja3VwCisJCXJldHVybgorCQk7OworCSAgICBbZERdKikKKwkJZ2l0IHJtIC0tICIkTUVSR0VEIiA+IC9kZXYvbnVsbAorCQljbGVhbnVwX3RlbXBfZmlsZXMKKwkJcmV0dXJuCisJCTs7CisJICAgIFthQV0qKQorCQlleGl0IDEKKwkJOzsKKwkgICAgZXNhYworCWRvbmUKK30KKworY2hlY2tfdW5jaGFuZ2VkICgpIHsKKyAgICBpZiB0ZXN0ICIkTUVSR0VEIiAtbnQgIiRCQUNLVVAiIDsgdGhlbgorCXN0YXR1cz0wOworICAgIGVsc2UKKwl3aGlsZSB0cnVlOyBkbworCSAgICBlY2hvICIkTUVSR0VEIHNlZW1zIHVuY2hhbmdlZC4iCisJICAgIHByaW50ZiAiV2FzIHRoZSBtZXJnZSBzdWNjZXNzZnVsPyBbeS9uXSAiCisJICAgIHJlYWQgYW5zd2VyIDwgL2Rldi90dHkKKwkgICAgY2FzZSAiJGFuc3dlciIgaW4KKwkJeSp8WSopIHN0YXR1cz0wOyBicmVhayA7OworCQluKnxOKikgc3RhdHVzPTE7IGJyZWFrIDs7CisJICAgIGVzYWMKKwlkb25lCisgICAgZmkKK30KKworbWVyZ2VfZmlsZSAoKSB7CisgICAgTUVSR0VEPSIkMSIKKworICAgIGY9YGdpdCBscy1maWxlcyAtdSAtLSAiJE1FUkdFRCJgCisgICAgaWYgdGVzdCAteiAiJGYiIDsgdGhlbgorCWlmIHRlc3QgISAtZiAiJE1FUkdFRCIgOyB0aGVuCisJICAgIGVjaG8gIiRNRVJHRUQ6IGZpbGUgbm90IGZvdW5kIgorCWVsc2UKKwkgICAgZWNobyAiJE1FUkdFRDogZmlsZSBkb2VzIG5vdCBuZWVkIG1lcmdpbmciCisJZmkKKwlleGl0IDEKKyAgICBmaQorCisgICAgZXh0PSIkJCQoZXhwciAiJE1FUkdFRCIgOiAnLipcKFwuW14vXSpcKSQnKSIKKyAgICBCQUNLVVA9IiRNRVJHRUQuQkFDS1VQLiRleHQiCisgICAgTE9DQUw9IiRNRVJHRUQuTE9DQUwuJGV4dCIKKyAgICBSRU1PVEU9IiRNRVJHRUQuUkVNT1RFLiRleHQiCisgICAgQkFTRT0iJE1FUkdFRC5CQVNFLiRleHQiCisKKyAgICBtdiAtLSAiJE1FUkdFRCIgIiRCQUNLVVAiCisgICAgY3AgLS0gIiRCQUNLVVAiICIkTUVSR0VEIgorCisgICAgYmFzZV9tb2RlPWBnaXQgbHMtZmlsZXMgLXUgLS0gIiRNRVJHRUQiIHwgYXdrICd7aWYgKCQzPT0xKSBwcmludCAkMTt9J2AKKyAgICBsb2NhbF9tb2RlPWBnaXQgbHMtZmlsZXMgLXUgLS0gIiRNRVJHRUQiIHwgYXdrICd7aWYgKCQzPT0yKSBwcmludCAkMTt9J2AKKyAgICByZW1vdGVfbW9kZT1gZ2l0IGxzLWZpbGVzIC11IC0tICIkTUVSR0VEIiB8IGF3ayAne2lmICgkMz09MykgcHJpbnQgJDE7fSdgCisKKyAgICBiYXNlX3ByZXNlbnQgICAmJiBnaXQgY2F0LWZpbGUgYmxvYiAiOjE6JHByZWZpeCRNRVJHRUQiID4iJEJBU0UiIDI+L2Rldi9udWxsCisgICAgbG9jYWxfcHJlc2VudCAgJiYgZ2l0IGNhdC1maWxlIGJsb2IgIjoyOiRwcmVmaXgkTUVSR0VEIiA+IiRMT0NBTCIgMj4vZGV2L251bGwKKyAgICByZW1vdGVfcHJlc2VudCAmJiBnaXQgY2F0LWZpbGUgYmxvYiAiOjM6JHByZWZpeCRNRVJHRUQiID4iJFJFTU9URSIgMj4vZGV2L251bGwKKworICAgIGlmIHRlc3QgLXogIiRsb2NhbF9tb2RlIiAtbyAteiAiJHJlbW90ZV9tb2RlIjsgdGhlbgorCWVjaG8gIkRlbGV0ZWQgbWVyZ2UgY29uZmxpY3QgZm9yICckTUVSR0VEJzoiCisJZGVzY3JpYmVfZmlsZSAiJGxvY2FsX21vZGUiICJsb2NhbCIgIiRMT0NBTCIKKwlkZXNjcmliZV9maWxlICIkcmVtb3RlX21vZGUiICJyZW1vdGUiICIkUkVNT1RFIgorCXJlc29sdmVfZGVsZXRlZF9tZXJnZQorCXJldHVybgorICAgIGZpCisKKyAgICBpZiBpc19zeW1saW5rICIkbG9jYWxfbW9kZSIgfHwgaXNfc3ltbGluayAiJHJlbW90ZV9tb2RlIjsgdGhlbgorCWVjaG8gIlN5bWJvbGljIGxpbmsgbWVyZ2UgY29uZmxpY3QgZm9yICckTUVSR0VEJzoiCisJZGVzY3JpYmVfZmlsZSAiJGxvY2FsX21vZGUiICJsb2NhbCIgIiRMT0NBTCIKKwlkZXNjcmliZV9maWxlICIkcmVtb3RlX21vZGUiICJyZW1vdGUiICIkUkVNT1RFIgorCXJlc29sdmVfc3ltbGlua19tZXJnZQorCXJldHVybgorICAgIGZpCisKKyAgICBlY2hvICJOb3JtYWwgbWVyZ2UgY29uZmxpY3QgZm9yICckTUVSR0VEJzoiCisgICAgZGVzY3JpYmVfZmlsZSAiJGxvY2FsX21vZGUiICJsb2NhbCIgIiRMT0NBTCIKKyAgICBkZXNjcmliZV9maWxlICIkcmVtb3RlX21vZGUiICJyZW1vdGUiICIkUkVNT1RFIgorICAgIHByaW50ZiAiSGl0IHJldHVybiB0byBzdGFydCBtZXJnZSByZXNvbHV0aW9uIHRvb2wgKCVzKTogIiAiJG1lcmdlX3Rvb2wiCisgICAgcmVhZCBhbnMKKworICAgIGNhc2UgIiRtZXJnZV90b29sIiBpbgorCWtkaWZmMykKKwkgICAgaWYgYmFzZV9wcmVzZW50IDsgdGhlbgorCQkoIiRtZXJnZV90b29sX3BhdGgiIC0tYXV0byAtLUwxICIkTUVSR0VEIChCYXNlKSIgLS1MMiAiJE1FUkdFRCAoTG9jYWwpIiAtLUwzICIkTUVSR0VEIChSZW1vdGUpIiBcCisJCSAgICAtbyAiJE1FUkdFRCIgLS0gIiRCQVNFIiAiJExPQ0FMIiAiJFJFTU9URSIgPiAvZGV2L251bGwgMj4mMSkKKwkgICAgZWxzZQorCQkoIiRtZXJnZV90b29sX3BhdGgiIC0tYXV0byAtLUwxICIkTUVSR0VEIChMb2NhbCkiIC0tTDIgIiRNRVJHRUQgKFJlbW90ZSkiIFwKKwkJICAgIC1vICIkTUVSR0VEIiAtLSAiJExPQ0FMIiAiJFJFTU9URSIgPiAvZGV2L251bGwgMj4mMSkKKwkgICAgZmkKKwkgICAgc3RhdHVzPSQ/CisJICAgIDs7CisJdGtkaWZmKQorCSAgICBpZiBiYXNlX3ByZXNlbnQgOyB0aGVuCisJCSIkbWVyZ2VfdG9vbF9wYXRoIiAtYSAiJEJBU0UiIC1vICIkTUVSR0VEIiAtLSAiJExPQ0FMIiAiJFJFTU9URSIKKwkgICAgZWxzZQorCQkiJG1lcmdlX3Rvb2xfcGF0aCIgLW8gIiRNRVJHRUQiIC0tICIkTE9DQUwiICIkUkVNT1RFIgorCSAgICBmaQorCSAgICBzdGF0dXM9JD8KKwkgICAgOzsKKwltZWxkfHZpbWRpZmYpCisJICAgIHRvdWNoICIkQkFDS1VQIgorCSAgICAiJG1lcmdlX3Rvb2xfcGF0aCIgLS0gIiRMT0NBTCIgIiRNRVJHRUQiICIkUkVNT1RFIgorCSAgICBjaGVja191bmNoYW5nZWQKKwkgICAgOzsKKwlndmltZGlmZikKKwkgICAgdG91Y2ggIiRCQUNLVVAiCisJICAgICIkbWVyZ2VfdG9vbF9wYXRoIiAtZiAtLSAiJExPQ0FMIiAiJE1FUkdFRCIgIiRSRU1PVEUiCisJICAgIGNoZWNrX3VuY2hhbmdlZAorCSAgICA7OworCXh4ZGlmZikKKwkgICAgdG91Y2ggIiRCQUNLVVAiCisJICAgIGlmIGJhc2VfcHJlc2VudCA7IHRoZW4KKwkJIiRtZXJnZV90b29sX3BhdGgiIC1YIC0tc2hvdy1tZXJnZWQtcGFuZSBcCisJCSAgICAtUiAnQWNjZWwuU2F2ZUFzTWVyZ2VkOiAiQ3RybC1TIicgXAorCQkgICAgLVIgJ0FjY2VsLlNlYXJjaDogIkN0cmwrRiInIFwKKwkJICAgIC1SICdBY2NlbC5TZWFyY2hGb3J3YXJkOiAiQ3RybC1HIicgXAorCQkgICAgLS1tZXJnZWQtZmlsZSAiJE1FUkdFRCIgLS0gIiRMT0NBTCIgIiRCQVNFIiAiJFJFTU9URSIKKwkgICAgZWxzZQorCQkiJG1lcmdlX3Rvb2xfcGF0aCIgLVggLS1zaG93LW1lcmdlZC1wYW5lIFwKKwkJICAgIC1SICdBY2NlbC5TYXZlQXNNZXJnZWQ6ICJDdHJsLVMiJyBcCisJCSAgICAtUiAnQWNjZWwuU2VhcmNoOiAiQ3RybCtGIicgXAorCQkgICAgLVIgJ0FjY2VsLlNlYXJjaEZvcndhcmQ6ICJDdHJsLUciJyBcCisJCSAgICAtLW1lcmdlZC1maWxlICIkTUVSR0VEIiAtLSAiJExPQ0FMIiAiJFJFTU9URSIKKwkgICAgZmkKKwkgICAgY2hlY2tfdW5jaGFuZ2VkCisJICAgIDs7CisJb3BlbmRpZmYpCisJICAgIHRvdWNoICIkQkFDS1VQIgorCSAgICBpZiBiYXNlX3ByZXNlbnQ7IHRoZW4KKwkJIiRtZXJnZV90b29sX3BhdGgiICIkTE9DQUwiICIkUkVNT1RFIiAtYW5jZXN0b3IgIiRCQVNFIiAtbWVyZ2UgIiRNRVJHRUQiIHwgY2F0CisJICAgIGVsc2UKKwkJIiRtZXJnZV90b29sX3BhdGgiICIkTE9DQUwiICIkUkVNT1RFIiAtbWVyZ2UgIiRNRVJHRUQiIHwgY2F0CisJICAgIGZpCisJICAgIGNoZWNrX3VuY2hhbmdlZAorCSAgICA7OworCWVjbWVyZ2UpCisJICAgIHRvdWNoICIkQkFDS1VQIgorCSAgICBpZiBiYXNlX3ByZXNlbnQ7IHRoZW4KKwkJIiRtZXJnZV90b29sX3BhdGgiICIkQkFTRSIgIiRMT0NBTCIgIiRSRU1PVEUiIC0tbW9kZT1tZXJnZTMgLS10bz0iJE1FUkdFRCIKKwkgICAgZWxzZQorCQkiJG1lcmdlX3Rvb2xfcGF0aCIgIiRMT0NBTCIgIiRSRU1PVEUiIC0tbW9kZT1tZXJnZTIgLS10bz0iJE1FUkdFRCIKKwkgICAgZmkKKwkgICAgY2hlY2tfdW5jaGFuZ2VkCisJICAgIDs7CisJZW1lcmdlKQorCSAgICBpZiBiYXNlX3ByZXNlbnQgOyB0aGVuCisJCSIkbWVyZ2VfdG9vbF9wYXRoIiAtZiBlbWVyZ2UtZmlsZXMtd2l0aC1hbmNlc3Rvci1jb21tYW5kICIkTE9DQUwiICIkUkVNT1RFIiAiJEJBU0UiICIkKGJhc2VuYW1lICIkTUVSR0VEIikiCisJICAgIGVsc2UKKwkJIiRtZXJnZV90b29sX3BhdGgiIC1mIGVtZXJnZS1maWxlcy1jb21tYW5kICIkTE9DQUwiICIkUkVNT1RFIiAiJChiYXNlbmFtZSAiJE1FUkdFRCIpIgorCSAgICBmaQorCSAgICBzdGF0dXM9JD8KKwkgICAgOzsKKwkqKQorCSAgICBpZiB0ZXN0IC1uICIkbWVyZ2VfdG9vbF9jbWQiOyB0aGVuCisJCWlmIHRlc3QgIiRtZXJnZV90b29sX3RydXN0X2V4aXRfY29kZSIgPSAiZmFsc2UiOyB0aGVuCisJCSAgICB0b3VjaCAiJEJBQ0tVUCIKKwkJICAgICggZXZhbCAkbWVyZ2VfdG9vbF9jbWQgKQorCQkgICAgY2hlY2tfdW5jaGFuZ2VkCisJCWVsc2UKKwkJICAgICggZXZhbCAkbWVyZ2VfdG9vbF9jbWQgKQorCQkgICAgc3RhdHVzPSQ/CisJCWZpCisJICAgIGZpCisJICAgIDs7CisgICAgZXNhYworICAgIGlmIHRlc3QgIiRzdGF0dXMiIC1uZSAwOyB0aGVuCisJZWNobyAibWVyZ2Ugb2YgJE1FUkdFRCBmYWlsZWQiIDE+JjIKKwltdiAtLSAiJEJBQ0tVUCIgIiRNRVJHRUQiCisJZXhpdCAxCisgICAgZmkKKworICAgIGlmIHRlc3QgIiRtZXJnZV9rZWVwX2JhY2t1cCIgPSAidHJ1ZSI7IHRoZW4KKwltdiAtLSAiJEJBQ0tVUCIgIiRNRVJHRUQub3JpZyIKKyAgICBlbHNlCisJcm0gLS0gIiRCQUNLVVAiCisgICAgZmkKKworICAgIGdpdCBhZGQgLS0gIiRNRVJHRUQiCisgICAgY2xlYW51cF90ZW1wX2ZpbGVzCit9CisKK3doaWxlIHRlc3QgJCMgIT0gMAorZG8KKyAgICBjYXNlICIkMSIgaW4KKwktdHwtLXRvb2wqKQorCSAgICBjYXNlICIkIywkMSIgaW4KKwkJKiwqPSopCisJCSAgICBtZXJnZV90b29sPWBleHByICJ6JDEiIDogJ3otW149XSo9XCguKlwpJ2AKKwkJICAgIDs7CisJCTEsKikKKwkJICAgIHVzYWdlIDs7CisJCSopCisJCSAgICBtZXJnZV90b29sPSIkMiIKKwkJICAgIHNoaWZ0IDs7CisJICAgIGVzYWMKKwkgICAgOzsKKwktLSkKKwkgICAgYnJlYWsKKwkgICAgOzsKKwktKikKKwkgICAgdXNhZ2UKKwkgICAgOzsKKwkqKQorCSAgICBicmVhaworCSAgICA7OworICAgIGVzYWMKKyAgICBzaGlmdAorZG9uZQorCit2YWxpZF9jdXN0b21fdG9vbCgpCit7CisgICAgbWVyZ2VfdG9vbF9jbWQ9IiQoZ2l0IGNvbmZpZyBtZXJnZXRvb2wuJDEuY21kKSIKKyAgICB0ZXN0IC1uICIkbWVyZ2VfdG9vbF9jbWQiCit9CisKK3ZhbGlkX3Rvb2woKSB7CisJY2FzZSAiJDEiIGluCisJCWtkaWZmMyB8IHRrZGlmZiB8IHh4ZGlmZiB8IG1lbGQgfCBvcGVuZGlmZiB8IGVtZXJnZSB8IHZpbWRpZmYgfCBndmltZGlmZiB8IGVjbWVyZ2UpCisJCQk7OyAjIGhhcHB5CisJCSopCisJCQlpZiAhIHZhbGlkX2N1c3RvbV90b29sICIkMSI7IHRoZW4KKwkJCQlyZXR1cm4gMQorCQkJZmkKKwkJCTs7CisJZXNhYworfQorCitpbml0X21lcmdlX3Rvb2xfcGF0aCgpIHsKKwltZXJnZV90b29sX3BhdGg9YGdpdCBjb25maWcgbWVyZ2V0b29sLiQxLnBhdGhgCisJaWYgdGVzdCAteiAiJG1lcmdlX3Rvb2xfcGF0aCIgOyB0aGVuCisJCWNhc2UgIiQxIiBpbgorCQkJZW1lcmdlKQorCQkJCW1lcmdlX3Rvb2xfcGF0aD1lbWFjcworCQkJCTs7CisJCQkqKQorCQkJCW1lcmdlX3Rvb2xfcGF0aD0kMQorCQkJCTs7CisJCWVzYWMKKwlmaQorfQorCisKK2lmIHRlc3QgLXogIiRtZXJnZV90b29sIjsgdGhlbgorICAgIG1lcmdlX3Rvb2w9YGdpdCBjb25maWcgbWVyZ2UudG9vbGAKKyAgICBpZiB0ZXN0IC1uICIkbWVyZ2VfdG9vbCIgJiYgISB2YWxpZF90b29sICIkbWVyZ2VfdG9vbCI7IHRoZW4KKwkgICAgZWNobyA+JjIgImdpdCBjb25maWcgb3B0aW9uIG1lcmdlLnRvb2wgc2V0IHRvIHVua25vd24gdG9vbDogJG1lcmdlX3Rvb2wiCisJICAgIGVjaG8gPiYyICJSZXNldHRpbmcgdG8gZGVmYXVsdC4uLiIKKwkgICAgdW5zZXQgbWVyZ2VfdG9vbAorICAgIGZpCitmaQorCitpZiB0ZXN0IC16ICIkbWVyZ2VfdG9vbCIgOyB0aGVuCisgICAgaWYgdGVzdCAtbiAiJERJU1BMQVkiOyB0aGVuCisgICAgICAgIG1lcmdlX3Rvb2xfY2FuZGlkYXRlcz0ia2RpZmYzIHRrZGlmZiB4eGRpZmYgbWVsZCBndmltZGlmZiIKKyAgICAgICAgaWYgdGVzdCAtbiAiJEdOT01FX0RFU0tUT1BfU0VTU0lPTl9JRCIgOyB0aGVuCisgICAgICAgICAgICBtZXJnZV90b29sX2NhbmRpZGF0ZXM9Im1lbGQgJG1lcmdlX3Rvb2xfY2FuZGlkYXRlcyIKKyAgICAgICAgZmkKKyAgICAgICAgaWYgdGVzdCAiJEtERV9GVUxMX1NFU1NJT04iID0gInRydWUiOyB0aGVuCisgICAgICAgICAgICBtZXJnZV90b29sX2NhbmRpZGF0ZXM9ImtkaWZmMyAkbWVyZ2VfdG9vbF9jYW5kaWRhdGVzIgorICAgICAgICBmaQorICAgIGZpCisgICAgaWYgZWNobyAiJHtWSVNVQUw6LSRFRElUT1J9IiB8IGdyZXAgJ2VtYWNzJyA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAgIG1lcmdlX3Rvb2xfY2FuZGlkYXRlcz0iJG1lcmdlX3Rvb2xfY2FuZGlkYXRlcyBlbWVyZ2UiCisgICAgZmkKKyAgICBpZiBlY2hvICIke1ZJU1VBTDotJEVESVRPUn0iIHwgZ3JlcCAndmltJyA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAgIG1lcmdlX3Rvb2xfY2FuZGlkYXRlcz0iJG1lcmdlX3Rvb2xfY2FuZGlkYXRlcyB2aW1kaWZmIgorICAgIGZpCisgICAgbWVyZ2VfdG9vbF9jYW5kaWRhdGVzPSIkbWVyZ2VfdG9vbF9jYW5kaWRhdGVzIG9wZW5kaWZmIGVtZXJnZSB2aW1kaWZmIgorICAgIGVjaG8gIm1lcmdlIHRvb2wgY2FuZGlkYXRlczogJG1lcmdlX3Rvb2xfY2FuZGlkYXRlcyIKKyAgICBmb3IgaSBpbiAkbWVyZ2VfdG9vbF9jYW5kaWRhdGVzOyBkbworICAgICAgICBpbml0X21lcmdlX3Rvb2xfcGF0aCAkaQorICAgICAgICBpZiB0eXBlICIkbWVyZ2VfdG9vbF9wYXRoIiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAgICAgICBtZXJnZV90b29sPSRpCisgICAgICAgICAgICBicmVhaworICAgICAgICBmaQorICAgIGRvbmUKKyAgICBpZiB0ZXN0IC16ICIkbWVyZ2VfdG9vbCIgOyB0aGVuCisJZWNobyAiTm8ga25vd24gbWVyZ2UgcmVzb2x1dGlvbiBwcm9ncmFtIGF2YWlsYWJsZS4iCisJZXhpdCAxCisgICAgZmkKK2Vsc2UKKyAgICBpZiAhIHZhbGlkX3Rvb2wgIiRtZXJnZV90b29sIjsgdGhlbgorICAgICAgICBlY2hvID4mMiAiVW5rbm93biBtZXJnZV90b29sICRtZXJnZV90b29sIgorICAgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgaW5pdF9tZXJnZV90b29sX3BhdGggIiRtZXJnZV90b29sIgorCisgICAgbWVyZ2Vfa2VlcF9iYWNrdXA9IiQoZ2l0IGNvbmZpZyAtLWJvb2wgbWVyZ2Uua2VlcEJhY2t1cCB8fCBlY2hvIHRydWUpIgorCisgICAgaWYgdGVzdCAteiAiJG1lcmdlX3Rvb2xfY21kIiAmJiAhIHR5cGUgIiRtZXJnZV90b29sX3BhdGgiID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICAgZWNobyAiVGhlIG1lcmdlIHRvb2wgJG1lcmdlX3Rvb2wgaXMgbm90IGF2YWlsYWJsZSBhcyAnJG1lcmdlX3Rvb2xfcGF0aCciCisgICAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBpZiAhIHRlc3QgLXogIiRtZXJnZV90b29sX2NtZCI7IHRoZW4KKyAgICAgICAgbWVyZ2VfdG9vbF90cnVzdF9leGl0X2NvZGU9IiQoZ2l0IGNvbmZpZyAtLWJvb2wgbWVyZ2V0b29sLiRtZXJnZV90b29sLnRydXN0RXhpdENvZGUgfHwgZWNobyBmYWxzZSkiCisgICAgZmkKK2ZpCisKKworaWYgdGVzdCAkIyAtZXEgMCA7IHRoZW4KKwlmaWxlcz1gZ2l0IGxzLWZpbGVzIC11IHwgc2VkIC1lICdzL15bXgldKgkvLycgfCBzb3J0IC11YAorCWlmIHRlc3QgLXogIiRmaWxlcyIgOyB0aGVuCisJCWVjaG8gIk5vIGZpbGVzIG5lZWQgbWVyZ2luZyIKKwkJZXhpdCAwCisJZmkKKwllY2hvIE1lcmdpbmcgdGhlIGZpbGVzOiAiJGZpbGVzIgorCWdpdCBscy1maWxlcyAtdSB8CisJc2VkIC1lICdzL15bXgldKgkvLycgfAorCXNvcnQgLXUgfAorCXdoaWxlIElGUz0gcmVhZCBpCisJZG8KKwkJcHJpbnRmICJcbiIKKwkJbWVyZ2VfZmlsZSAiJGkiIDwgL2Rldi90dHkgPiAvZGV2L3R0eQorCWRvbmUKK2Vsc2UKKwl3aGlsZSB0ZXN0ICQjIC1ndCAwOyBkbworCQlwcmludGYgIlxuIgorCQltZXJnZV9maWxlICIkMSIKKwkJc2hpZnQKKwlkb25lCitmaQorZXhpdCAwCmRpZmYgLS1naXQgYS9naXQtcGFyc2UtcmVtb3RlLnNoIGIvZ2l0LXBhcnNlLXJlbW90ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OTVhNDA5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LXBhcnNlLXJlbW90ZS5zaApAQCAtMCwwICsxLDI2NCBAQAorIyEvYmluL3NoCisKKyMgZ2l0LWxzLXJlbW90ZSBjb3VsZCBiZSBjYWxsZWQgZnJvbSBvdXRzaWRlIGEgZ2l0IG1hbmFnZWQgcmVwb3NpdG9yeTsKKyMgdGhpcyB3b3VsZCBmYWlsIGluIHRoYXQgY2FzZSBhbmQgd291bGQgaXNzdWUgYW4gZXJyb3IgbWVzc2FnZS4KK0dJVF9ESVI9JChnaXQgcmV2LXBhcnNlIC0tZ2l0LWRpciAyPi9kZXYvbnVsbCkgfHwgOjsKKworZ2V0X2RhdGFfc291cmNlICgpIHsKKwljYXNlICIkMSIgaW4KKwkqLyopCisJCWVjaG8gJycKKwkJOzsKKwkuKQorCQllY2hvIHNlbGYKKwkJOzsKKwkqKQorCQlpZiB0ZXN0ICIkKGdpdCBjb25maWcgLS1nZXQgInJlbW90ZS4kMS51cmwiKSIKKwkJdGhlbgorCQkJZWNobyBjb25maWcKKwkJZWxpZiB0ZXN0IC1mICIkR0lUX0RJUi9yZW1vdGVzLyQxIgorCQl0aGVuCisJCQllY2hvIHJlbW90ZXMKKwkJZWxpZiB0ZXN0IC1mICIkR0lUX0RJUi9icmFuY2hlcy8kMSIKKwkJdGhlbgorCQkJZWNobyBicmFuY2hlcworCQllbHNlCisJCQllY2hvICcnCisJCWZpIDs7CisJZXNhYworfQorCitnZXRfcmVtb3RlX3VybCAoKSB7CisJZGF0YV9zb3VyY2U9JChnZXRfZGF0YV9zb3VyY2UgIiQxIikKKwljYXNlICIkZGF0YV9zb3VyY2UiIGluCisJJycpCisJCWVjaG8gIiQxIgorCQk7OworCXNlbGYpCisJCWVjaG8gIiQxIgorCQk7OworCWNvbmZpZykKKwkJZ2l0IGNvbmZpZyAtLWdldCAicmVtb3RlLiQxLnVybCIKKwkJOzsKKwlyZW1vdGVzKQorCQlzZWQgLW5lICcvXlVSTDogKi97CisJCQlzLy8vcAorCQkJcQorCQl9JyAiJEdJVF9ESVIvcmVtb3Rlcy8kMSIKKwkJOzsKKwlicmFuY2hlcykKKwkJc2VkIC1lICdzLyMuKi8vJyAiJEdJVF9ESVIvYnJhbmNoZXMvJDEiCisJCTs7CisJKikKKwkJZGllICJpbnRlcm5hbCBlcnJvcjogZ2V0LXJlbW90ZS11cmwgJDEiIDs7CisJZXNhYworfQorCitnZXRfZGVmYXVsdF9yZW1vdGUgKCkgeworCWN1cnJfYnJhbmNoPSQoZ2l0IHN5bWJvbGljLXJlZiAtcSBIRUFEIHwgc2VkIC1lICdzfF5yZWZzL2hlYWRzL3x8JykKKwlvcmlnaW49JChnaXQgY29uZmlnIC0tZ2V0ICJicmFuY2guJGN1cnJfYnJhbmNoLnJlbW90ZSIpCisJZWNobyAke29yaWdpbjotb3JpZ2lufQorfQorCitnZXRfcmVtb3RlX2RlZmF1bHRfcmVmc19mb3JfcHVzaCAoKSB7CisJZGF0YV9zb3VyY2U9JChnZXRfZGF0YV9zb3VyY2UgIiQxIikKKwljYXNlICIkZGF0YV9zb3VyY2UiIGluCisJJycgfCBicmFuY2hlcyB8IHNlbGYpCisJCTs7ICMgbm8gZGVmYXVsdCBwdXNoIG1hcHBpbmcsIGp1c3Qgc2VuZCBtYXRjaGluZyByZWZzLgorCWNvbmZpZykKKwkJZ2l0IGNvbmZpZyAtLWdldC1hbGwgInJlbW90ZS4kMS5wdXNoIiA7OworCXJlbW90ZXMpCisJCXNlZCAtbmUgJy9eUHVzaDogKi97CisJCQlzLy8vcAorCQl9JyAiJEdJVF9ESVIvcmVtb3Rlcy8kMSIgOzsKKwkqKQorCQlkaWUgImludGVybmFsIGVycm9yOiBnZXQtcmVtb3RlLWRlZmF1bHQtcmVmLWZvci1wdXNoICQxIiA7OworCWVzYWMKK30KKworIyBDYWxsZWQgZnJvbSBjYW5vbl9yZWZzX2xpc3RfZm9yX2ZldGNoIC1kICIkcmVtb3RlIiwgd2hpY2gKKyMgaXMgY2FsbGVkIGZyb20gZ2V0X3JlbW90ZV9kZWZhdWx0X3JlZnNfZm9yX2ZldGNoIHRvIGdyb2sKKyMgcmVmc3BlY3MgdGhhdCBhcmUgcmV0cmlldmVkIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24sIGJ1dCBub3QKKyMgZnJvbSBnZXRfcmVtb3RlX3JlZnNfZm9yX2ZldGNoIHdoZW4gaXQgZGVhbHMgd2l0aCByZWZzcGVjcworIyBzdXBwbGllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgJGxzX3JlbW90ZV9yZXN1bHQgaGFzIHRoZSBsaXN0CisjIG9mIHJlZnMgYXZhaWxhYmxlIGF0IHJlbW90ZS4KKyMKKyMgVGhlIGZpcnN0IHRva2VuIHJldHVybmVkIGlzIGVpdGhlciAiZXhwbGljaXQiIG9yICJnbG9iIjsgdGhpcworIyBpcyB0byBoZWxwIHByZXZlbnQgcmFuZG9tbHkgImdsb2JiZWQiIHJlZiBmcm9tIGJlaW5nIGNob3NlbiBhcworIyBhIG1lcmdlIGNhbmRpZGF0ZQorZXhwYW5kX3JlZnNfd2lsZGNhcmQgKCkgeworCWVjaG8gIiRsc19yZW1vdGVfcmVzdWx0IiB8CisJZ2l0IGZldGNoLS10b29sIGV4cGFuZC1yZWZzLXdpbGRjYXJkICItIiAiJEAiCit9CisKKyMgU3Vicm91dGluZSB0byBjYW5vbmljYWxpemUgcmVtb3RlOmxvY2FsIG5vdGF0aW9uLgorY2Fub25fcmVmc19saXN0X2Zvcl9mZXRjaCAoKSB7CisJIyBJZiBjYWxsZWQgZnJvbSBnZXRfcmVtb3RlX2RlZmF1bHRfcmVmc19mb3JfZmV0Y2gKKwkjIGxlYXZlIHRoZSBicmFuY2hlcyBpbiBicmFuY2guJHtjdXJyX2JyYW5jaH0ubWVyZ2UgYWxvbmUsCisJIyBvciB0aGUgZmlyc3Qgb25lIG90aGVyd2lzZTsgYWRkIHByZWZpeCAuIHRvIHRoZSByZXN0CisJIyB0byBwcmV2ZW50IHRoZSBzZWNvbmRhcnkgYnJhbmNoZXMgdG8gYmUgbWVyZ2VkIGJ5IGRlZmF1bHQuCisJbWVyZ2VfYnJhbmNoZXM9CisJY3Vycl9icmFuY2g9CisJaWYgdGVzdCAiJDEiID0gIi1kIgorCXRoZW4KKwkJc2hpZnQgOyByZW1vdGU9IiQxIiA7IHNoaWZ0CisJCXNldCAkKGV4cGFuZF9yZWZzX3dpbGRjYXJkICIkcmVtb3RlIiAiJEAiKQorCQlpc19leHBsaWNpdD0iJDEiCisJCXNoaWZ0CisJCWlmIHRlc3QgIiRyZW1vdGUiID0gIiQoZ2V0X2RlZmF1bHRfcmVtb3RlKSIKKwkJdGhlbgorCQkJY3Vycl9icmFuY2g9JChnaXQgc3ltYm9saWMtcmVmIC1xIEhFQUQgfCBcCisJCQkgICAgc2VkIC1lICdzfF5yZWZzL2hlYWRzL3x8JykKKwkJCW1lcmdlX2JyYW5jaGVzPSQoZ2l0IGNvbmZpZyBcCisJCQkgICAgLS1nZXQtYWxsICJicmFuY2guJHtjdXJyX2JyYW5jaH0ubWVyZ2UiKQorCQlmaQorCQlpZiB0ZXN0IC16ICIkbWVyZ2VfYnJhbmNoZXMiICYmIHRlc3QgJGlzX2V4cGxpY2l0ICE9IGV4cGxpY2l0CisJCXRoZW4KKwkJCW1lcmdlX2JyYW5jaGVzPS4udGhpcy53aWxsLm5ldmVyLm1hdGNoLmFueS5yZWYuLgorCQlmaQorCWZpCisJZm9yIHJlZgorCWRvCisJCWZvcmNlPQorCQljYXNlICIkcmVmIiBpbgorCQkrKikKKwkJCXJlZj0kKGV4cHIgInokcmVmIiA6ICd6K1woLipcKScpCisJCQlmb3JjZT0rCisJCQk7OworCQllc2FjCisJCWV4cHIgInokcmVmIiA6ICd6Lio6JyA+L2Rldi9udWxsIHx8IHJlZj0iJHtyZWZ9OiIKKwkJcmVtb3RlPSQoZXhwciAieiRyZWYiIDogJ3pcKFteOl0qXCk6JykKKwkJbG9jYWw9JChleHByICJ6JHJlZiIgOiAnelteOl0qOlwoLipcKScpCisJCWRvdF9wcmVmaXg9LgorCQlpZiB0ZXN0IC16ICIkbWVyZ2VfYnJhbmNoZXMiCisJCXRoZW4KKwkJCW1lcmdlX2JyYW5jaGVzPSRyZW1vdGUKKwkJCWRvdF9wcmVmaXg9CisJCWVsc2UKKwkJCWZvciBtZXJnZV9icmFuY2ggaW4gJG1lcmdlX2JyYW5jaGVzCisJCQlkbworCQkJICAgIFsgIiRyZW1vdGUiID0gIiRtZXJnZV9icmFuY2giIF0gJiYKKwkJCSAgICBkb3RfcHJlZml4PSAmJiBicmVhaworCQkJZG9uZQorCQlmaQorCQljYXNlICIkcmVtb3RlIiBpbgorCQknJyB8IEhFQUQgKSByZW1vdGU9SEVBRCA7OworCQlyZWZzLyopIDs7CisJCWhlYWRzLyogfCB0YWdzLyogfCByZW1vdGVzLyogKSByZW1vdGU9InJlZnMvJHJlbW90ZSIgOzsKKwkJKikgcmVtb3RlPSJyZWZzL2hlYWRzLyRyZW1vdGUiIDs7CisJCWVzYWMKKwkJY2FzZSAiJGxvY2FsIiBpbgorCQknJykgbG9jYWw9IDs7CisJCXJlZnMvKikgOzsKKwkJaGVhZHMvKiB8IHRhZ3MvKiB8IHJlbW90ZXMvKiApIGxvY2FsPSJyZWZzLyRsb2NhbCIgOzsKKwkJKikgbG9jYWw9InJlZnMvaGVhZHMvJGxvY2FsIiA7OworCQllc2FjCisKKwkJaWYgbG9jYWxfcmVmX25hbWU9JChleHByICJ6JGxvY2FsIiA6ICd6cmVmcy9cKC4qXCknKQorCQl0aGVuCisJCSAgIGdpdCBjaGVjay1yZWYtZm9ybWF0ICIkbG9jYWxfcmVmX25hbWUiIHx8CisJCSAgIGRpZSAiKiByZWZ1c2luZyB0byBjcmVhdGUgZnVubnkgcmVmICckbG9jYWxfcmVmX25hbWUnIGxvY2FsbHkiCisJCWZpCisJCWVjaG8gIiR7ZG90X3ByZWZpeH0ke2ZvcmNlfSR7cmVtb3RlfToke2xvY2FsfSIKKwlkb25lCit9CisKKyMgUmV0dXJucyBsaXN0IG9mIHNyYzogKG5vIHN0b3JlKSwgb3Igc3JjOmRzdCAoc3RvcmUpCitnZXRfcmVtb3RlX2RlZmF1bHRfcmVmc19mb3JfZmV0Y2ggKCkgeworCWRhdGFfc291cmNlPSQoZ2V0X2RhdGFfc291cmNlICIkMSIpCisJY2FzZSAiJGRhdGFfc291cmNlIiBpbgorCScnKQorCQllY2hvICJIRUFEOiIgOzsKKwlzZWxmKQorCSAgICAgICAgY2Fub25fcmVmc19saXN0X2Zvcl9mZXRjaCAtZCAiJDEiIFwKKwkJCSQoZ2l0IGZvci1lYWNoLXJlZiAtLWZvcm1hdD0nJShyZWZuYW1lKTonKQorCQk7OworCWNvbmZpZykKKwkJY2Fub25fcmVmc19saXN0X2Zvcl9mZXRjaCAtZCAiJDEiIFwKKwkJCSQoZ2l0IGNvbmZpZyAtLWdldC1hbGwgInJlbW90ZS4kMS5mZXRjaCIpIDs7CisJYnJhbmNoZXMpCisJCXJlbW90ZV9icmFuY2g9JChzZWQgLW5lICcvIy9zLy4qIy8vcCcgIiRHSVRfRElSL2JyYW5jaGVzLyQxIikKKwkJY2FzZSAiJHJlbW90ZV9icmFuY2giIGluICcnKSByZW1vdGVfYnJhbmNoPW1hc3RlciA7OyBlc2FjCisJCWVjaG8gInJlZnMvaGVhZHMvJHtyZW1vdGVfYnJhbmNofTpyZWZzL2hlYWRzLyQxIgorCQk7OworCXJlbW90ZXMpCisJCWNhbm9uX3JlZnNfbGlzdF9mb3JfZmV0Y2ggLWQgIiQxIiAkKHNlZCAtbmUgJy9eUHVsbDogKi97CisJCQkJCQlzLy8vcAorCQkJCQl9JyAiJEdJVF9ESVIvcmVtb3Rlcy8kMSIpCisJCTs7CisJKikKKwkJZGllICJpbnRlcm5hbCBlcnJvcjogZ2V0LXJlbW90ZS1kZWZhdWx0LXJlZi1mb3ItZmV0Y2ggJDEiIDs7CisJZXNhYworfQorCitnZXRfcmVtb3RlX3JlZnNfZm9yX3B1c2ggKCkgeworCWNhc2UgIiQjIiBpbgorCTApIGRpZSAiaW50ZXJuYWwgZXJyb3I6IGdldC1yZW1vdGUtcmVmcy1mb3ItcHVzaC4iIDs7CisJMSkgZ2V0X3JlbW90ZV9kZWZhdWx0X3JlZnNfZm9yX3B1c2ggIiRAIiA7OworCSopIHNoaWZ0OyBlY2hvICIkQCIgOzsKKwllc2FjCit9CisKK2dldF9yZW1vdGVfcmVmc19mb3JfZmV0Y2ggKCkgeworCWNhc2UgIiQjIiBpbgorCTApCisJICAgIGRpZSAiaW50ZXJuYWwgZXJyb3I6IGdldC1yZW1vdGUtcmVmcy1mb3ItZmV0Y2guIiA7OworCTEpCisJICAgIGdldF9yZW1vdGVfZGVmYXVsdF9yZWZzX2Zvcl9mZXRjaCAiJEAiIDs7CisJKikKKwkgICAgc2hpZnQKKwkgICAgdGFnX2p1c3Rfc2Vlbj0KKwkgICAgZm9yIHJlZgorCSAgICBkbworCQlpZiB0ZXN0ICIkdGFnX2p1c3Rfc2VlbiIKKwkJdGhlbgorCQkgICAgZWNobyAicmVmcy90YWdzLyR7cmVmfTpyZWZzL3RhZ3MvJHtyZWZ9IgorCQkgICAgdGFnX2p1c3Rfc2Vlbj0KKwkJICAgIGNvbnRpbnVlCisJCWVsc2UKKwkJICAgIGNhc2UgIiRyZWYiIGluCisJCSAgICB0YWcpCisJCQl0YWdfanVzdF9zZWVuPXllcworCQkJY29udGludWUKKwkJCTs7CisJCSAgICBlc2FjCisJCWZpCisJCWNhbm9uX3JlZnNfbGlzdF9mb3JfZmV0Y2ggIiRyZWYiCisJICAgIGRvbmUKKwkgICAgOzsKKwllc2FjCit9CisKK3Jlc29sdmVfYWx0ZXJuYXRlcyAoKSB7CisJIyBvcmlnaW5hbCBVUkwgKHh4eC5naXQpCisJdG9wXz1gZXhwciAieiQxIiA6ICd6XChbXjpdKjovKlteL10qXCkvJ2AKKwl3aGlsZSByZWFkIHBhdGgKKwlkbworCQljYXNlICIkcGF0aCIgaW4KKwkJXCMqIHwgJycpCisJCQljb250aW51ZSA7OworCQkvKikKKwkJCWVjaG8gIiR0b3BfJHBhdGgvIiA7OworCQkuLi8qKQorCQkJIyByZWxhdGl2ZSAtLSB1Z2x5IGJ1dCBzZWVtcyB0byB3b3JrLgorCQkJZWNobyAiJDEvb2JqZWN0cy8kcGF0aC8iIDs7CisJCSopCisJCQkjIGV4aXQgY29kZSBtYXkgbm90IGJlIGNhdWdodCBieSB0aGUgcmVhZGVyLgorCQkJZWNobyAiYmFkIGFsdGVybmF0ZTogJHBhdGgiCisJCQlleGl0IDEgOzsKKwkJZXNhYworCWRvbmUKK30KKworZ2V0X3VwbG9hZHBhY2sgKCkgeworCWRhdGFfc291cmNlPSQoZ2V0X2RhdGFfc291cmNlICIkMSIpCisJY2FzZSAiJGRhdGFfc291cmNlIiBpbgorCWNvbmZpZykKKwkJdXBscD0kKGdpdCBjb25maWcgLS1nZXQgInJlbW90ZS4kMS51cGxvYWRwYWNrIikKKwkJZWNobyAke3VwbHA6LWdpdC11cGxvYWQtcGFja30KKwkJOzsKKwkqKQorCQllY2hvICJnaXQtdXBsb2FkLXBhY2siCisJCTs7CisJZXNhYworfQpkaWZmIC0tZ2l0IGEvZ2l0LXB1bGwuc2ggYi9naXQtcHVsbC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zY2UzMmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LXB1bGwuc2gKQEAgLTAsMCArMSwxODAgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKyMgRmV0Y2ggb25lIG9yIG1vcmUgcmVtb3RlIHJlZnMgYW5kIG1lcmdlIGl0L3RoZW0gaW50byB0aGUgY3VycmVudCBIRUFELgorCitVU0FHRT0nWy1uIHwgLS1uby1zdW1tYXJ5XSBbLS1bbm8tXWNvbW1pdF0gWy0tW25vLV1zcXVhc2hdIFstLVtuby1dZmZdIFstcyBzdHJhdGVneV0uLi4gWzxmZXRjaC1vcHRpb25zPl0gPHJlcG8+IDxoZWFkPi4uLicKK0xPTkdfVVNBR0U9J0ZldGNoIG9uZSBvciBtb3JlIHJlbW90ZSByZWZzIGFuZCBtZXJnZSBpdC90aGVtIGludG8gdGhlIGN1cnJlbnQgSEVBRC4nCitTVUJESVJFQ1RPUllfT0s9WWVzCitPUFRJT05TX1NQRUM9CisuIGdpdC1zaC1zZXR1cAorc2V0X3JlZmxvZ19hY3Rpb24gInB1bGwgJCoiCityZXF1aXJlX3dvcmtfdHJlZQorY2RfdG9fdG9wbGV2ZWwKKwordGVzdCAteiAiJChnaXQgbHMtZmlsZXMgLXUpIiB8fAorCWRpZSAiWW91IGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgY29uZmxpY3RlZCBtZXJnZS4iCisKK3N0cmF0ZWd5X2FyZ3M9IG5vX3N1bW1hcnk9IG5vX2NvbW1pdD0gc3F1YXNoPSBub19mZj0KK2N1cnJfYnJhbmNoPSQoZ2l0IHN5bWJvbGljLXJlZiAtcSBIRUFEKQorY3Vycl9icmFuY2hfc2hvcnQ9JChlY2hvICIkY3Vycl9icmFuY2giIHwgc2VkICJzfHJlZnMvaGVhZHMvfHwiKQorcmViYXNlPSQoZ2l0IGNvbmZpZyAtLWJvb2wgYnJhbmNoLiRjdXJyX2JyYW5jaF9zaG9ydC5yZWJhc2UpCit3aGlsZSA6CitkbworCWNhc2UgIiQxIiBpbgorCS1ufC0tbnwtLW5vfC0tbm8tfC0tbm8tc3wtLW5vLXN1fC0tbm8tc3VtfC0tbm8tc3VtbXxcCisJCS0tbm8tc3VtbWF8LS1uby1zdW1tYXJ8LS1uby1zdW1tYXJ5KQorCQlub19zdW1tYXJ5PS1uIDs7CisJLS1zdW1tYXJ5KQorCQlub19zdW1tYXJ5PSQxCisJCTs7CisJLS1uby1jfC0tbm8tY298LS1uby1jb218LS1uby1jb21tfC0tbm8tY29tbWl8LS1uby1jb21taXQpCisJCW5vX2NvbW1pdD0tLW5vLWNvbW1pdCA7OworCS0tY3wtLWNvfC0tY29tfC0tY29tbXwtLWNvbW1pfC0tY29tbWl0KQorCQlub19jb21taXQ9LS1jb21taXQgOzsKKwktLXNxfC0tc3F1fC0tc3F1YXwtLXNxdWFzfC0tc3F1YXNoKQorCQlzcXVhc2g9LS1zcXVhc2ggOzsKKwktLW5vLXNxfC0tbm8tc3F1fC0tbm8tc3F1YXwtLW5vLXNxdWFzfC0tbm8tc3F1YXNoKQorCQlzcXVhc2g9LS1uby1zcXVhc2ggOzsKKwktLWZmKQorCQlub19mZj0tLWZmIDs7CisJLS1uby1mZikKKwkJbm9fZmY9LS1uby1mZiA7OworCS1zPSp8LS1zPSp8LS1zdD0qfC0tc3RyPSp8LS1zdHJhPSp8LS1zdHJhdD0qfC0tc3RyYXRlPSp8XAorCQktLXN0cmF0ZWc9KnwtLXN0cmF0ZWd5PSp8XAorCS1zfC0tc3wtLXN0fC0tc3RyfC0tc3RyYXwtLXN0cmF0fC0tc3RyYXRlfC0tc3RyYXRlZ3wtLXN0cmF0ZWd5KQorCQljYXNlICIkIywkMSIgaW4KKwkJKiwqPSopCisJCQlzdHJhdGVneT1gZXhwciAieiQxIiA6ICd6LVtePV0qPVwoLipcKSdgIDs7CisJCTEsKikKKwkJCXVzYWdlIDs7CisJCSopCisJCQlzdHJhdGVneT0iJDIiCisJCQlzaGlmdCA7OworCQllc2FjCisJCXN0cmF0ZWd5X2FyZ3M9IiR7c3RyYXRlZ3lfYXJnc30tcyAkc3RyYXRlZ3kgIgorCQk7OworCS1yfC0tcnwtLXJlfC0tcmVifC0tcmViYXwtLXJlYmFzfC0tcmViYXNlKQorCQlyZWJhc2U9dHJ1ZQorCQk7OworCS0tbm8tcnwtLW5vLXJlfC0tbm8tcmVifC0tbm8tcmViYXwtLW5vLXJlYmFzfC0tbm8tcmViYXNlKQorCQlyZWJhc2U9ZmFsc2UKKwkJOzsKKwktaHwtLWh8LS1oZXwtLWhlbHwtLWhlbHApCisJCXVzYWdlCisJCTs7CisJKikKKwkJIyBQYXNzIHRocnUgYW55dGhpbmcgdGhhdCBtYXkgYmUgbWVhbnQgZm9yIGZldGNoLgorCQlicmVhaworCQk7OworCWVzYWMKKwlzaGlmdAorZG9uZQorCitlcnJvcl9vbl9ub19tZXJnZV9jYW5kaWRhdGVzICgpIHsKKwlleGVjID4mMgorCWZvciBvcHQKKwlkbworCQljYXNlICIkb3B0IiBpbgorCQktdHwtLXR8LS10YXwtLXRhZ3wtLXRhZ3MpCisJCQllY2hvICJGZXRjaGluZyB0YWdzIG9ubHksIHlvdSBwcm9iYWJseSBtZWFudDoiCisJCQllY2hvICIgIGdpdCBmZXRjaCAtLXRhZ3MiCisJCQlleGl0IDEKKwkJZXNhYworCWRvbmUKKworCWN1cnJfYnJhbmNoPSR7Y3Vycl9icmFuY2gjcmVmcy9oZWFkcy99CisKKwllY2hvICJZb3UgYXNrZWQgbWUgdG8gcHVsbCB3aXRob3V0IHRlbGxpbmcgbWUgd2hpY2ggYnJhbmNoIHlvdSIKKwllY2hvICJ3YW50IHRvIG1lcmdlIHdpdGgsIGFuZCAnYnJhbmNoLiR7Y3Vycl9icmFuY2h9Lm1lcmdlJyBpbiIKKwllY2hvICJ5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZSBkb2VzIG5vdCB0ZWxsIG1lIGVpdGhlci4gIFBsZWFzZSIKKwllY2hvICJuYW1lIHdoaWNoIGJyYW5jaCB5b3Ugd2FudCB0byBtZXJnZSBvbiB0aGUgY29tbWFuZCBsaW5lIGFuZCIKKwllY2hvICJ0cnkgYWdhaW4gKGUuZy4gJ2dpdCBwdWxsIDxyZXBvc2l0b3J5PiA8cmVmc3BlYz4nKS4iCisJZWNobyAiU2VlIGdpdC1wdWxsKDEpIGZvciBkZXRhaWxzIG9uIHRoZSByZWZzcGVjLiIKKwllY2hvCisJZWNobyAiSWYgeW91IG9mdGVuIG1lcmdlIHdpdGggdGhlIHNhbWUgYnJhbmNoLCB5b3UgbWF5IHdhbnQgdG8iCisJZWNobyAiY29uZmlndXJlIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGluIHlvdXIgY29uZmlndXJhdGlvbiIKKwllY2hvICJmaWxlOiIKKwllY2hvCisJZWNobyAiICAgIGJyYW5jaC4ke2N1cnJfYnJhbmNofS5yZW1vdGUgPSA8bmlja25hbWU+IgorCWVjaG8gIiAgICBicmFuY2guJHtjdXJyX2JyYW5jaH0ubWVyZ2UgPSA8cmVtb3RlLXJlZj4iCisJZWNobyAiICAgIHJlbW90ZS48bmlja25hbWU+LnVybCA9IDx1cmw+IgorCWVjaG8gIiAgICByZW1vdGUuPG5pY2tuYW1lPi5mZXRjaCA9IDxyZWZzcGVjPiIKKwllY2hvCisJZWNobyAiU2VlIGdpdC1jb25maWcoMSkgZm9yIGRldGFpbHMuIgorCWV4aXQgMQorfQorCit0ZXN0IHRydWUgPSAiJHJlYmFzZSIgJiYgeworCS4gZ2l0LXBhcnNlLXJlbW90ZSAmJgorCW9yaWdpbj0iJDEiCisJdGVzdCAteiAiJG9yaWdpbiIgJiYgb3JpZ2luPSQoZ2V0X2RlZmF1bHRfcmVtb3RlKQorCXJlZmxpc3Q9IiQoZ2V0X3JlbW90ZV9yZWZzX2Zvcl9mZXRjaCAiJEAiIDI+L2Rldi9udWxsIHwKKwkJc2VkICJzfHJlZnMvaGVhZHMvXCguKlwpOnxcMXwiKSIgJiYKKwlvbGRyZW1vdGVyZWY9IiQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBcCisJCSJyZWZzL3JlbW90ZXMvJG9yaWdpbi8kcmVmbGlzdCIgMj4vZGV2L251bGwpIgorfQorb3JpZ19oZWFkPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEIDI+L2Rldi9udWxsKQorZ2l0LWZldGNoIC0tdXBkYXRlLWhlYWQtb2sgIiRAIiB8fCBleGl0IDEKKworY3Vycl9oZWFkPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEIDI+L2Rldi9udWxsKQoraWYgdGVzdCAiJGN1cnJfaGVhZCIgIT0gIiRvcmlnX2hlYWQiCit0aGVuCisJIyBUaGUgZmV0Y2ggaW52b2x2ZWQgdXBkYXRpbmcgdGhlIGN1cnJlbnQgYnJhbmNoLgorCisJIyBUaGUgd29ya2luZyB0cmVlIGFuZCB0aGUgaW5kZXggZmlsZSBpcyBzdGlsbCBiYXNlZCBvbiB0aGUKKwkjICRvcmlnX2hlYWQgY29tbWl0LCBidXQgd2UgYXJlIG1lcmdpbmcgaW50byAkY3Vycl9oZWFkLgorCSMgRmlyc3QgdXBkYXRlIHRoZSB3b3JraW5nIHRyZWUgdG8gbWF0Y2ggJGN1cnJfaGVhZC4KKworCWVjaG8gPiYyICJXYXJuaW5nOiBmZXRjaCB1cGRhdGVkIHRoZSBjdXJyZW50IGJyYW5jaCBoZWFkLiIKKwllY2hvID4mMiAiV2FybmluZzogZmFzdCBmb3J3YXJkaW5nIHlvdXIgd29ya2luZyB0cmVlIGZyb20iCisJZWNobyA+JjIgIldhcm5pbmc6IGNvbW1pdCAkb3JpZ19oZWFkLiIKKwlnaXQgdXBkYXRlLWluZGV4IC0tcmVmcmVzaCAyPi9kZXYvbnVsbAorCWdpdCByZWFkLXRyZWUgLXUgLW0gIiRvcmlnX2hlYWQiICIkY3Vycl9oZWFkIiB8fAorCQlkaWUgJ0Nhbm5vdCBmYXN0LWZvcndhcmQgeW91ciB3b3JraW5nIHRyZWUuCitBZnRlciBtYWtpbmcgc3VyZSB0aGF0IHlvdSBzYXZlZCBhbnl0aGluZyBwcmVjaW91cyBmcm9tCiskIGdpdCBkaWZmICckb3JpZ19oZWFkJworb3V0cHV0LCBydW4KKyQgZ2l0IHJlc2V0IC0taGFyZAordG8gcmVjb3Zlci4nCisKK2ZpCisKK21lcmdlX2hlYWQ9JChzZWQgLWUgJy8Jbm90LWZvci1tZXJnZQkvZCcgXAorCS1lICdzLwkuKi8vJyAiJEdJVF9ESVIiL0ZFVENIX0hFQUQgfCBcCisJdHIgJ1wwMTInICcgJykKKworY2FzZSAiJG1lcmdlX2hlYWQiIGluCisnJykKKwljYXNlICQ/IGluCisJMCkgZXJyb3Jfb25fbm9fbWVyZ2VfY2FuZGlkYXRlcyAiJEAiOzsKKwkxKSBlY2hvID4mMiAiWW91IGFyZSBub3QgY3VycmVudGx5IG9uIGEgYnJhbmNoOyB5b3UgbXVzdCBleHBsaWNpdGx5IgorCSAgIGVjaG8gPiYyICJzcGVjaWZ5IHdoaWNoIGJyYW5jaCB5b3Ugd2lzaCB0byBtZXJnZToiCisJICAgZWNobyA+JjIgIiAgZ2l0IHB1bGwgPHJlbW90ZT4gPGJyYW5jaD4iCisJICAgZXhpdCAxOzsKKwkqKSBleGl0ICQ/OzsKKwllc2FjCisJOzsKKz8qJyAnPyopCisJaWYgdGVzdCAteiAiJG9yaWdfaGVhZCIKKwl0aGVuCisJCWVjaG8gPiYyICJDYW5ub3QgbWVyZ2UgbXVsdGlwbGUgYnJhbmNoZXMgaW50byBlbXB0eSBoZWFkIgorCQlleGl0IDEKKwlmaQorCTs7Citlc2FjCisKK2lmIHRlc3QgLXogIiRvcmlnX2hlYWQiCit0aGVuCisJZ2l0IHVwZGF0ZS1yZWYgLW0gImluaXRpYWwgcHVsbCIgSEVBRCAkbWVyZ2VfaGVhZCAiIiAmJgorCWdpdCByZWFkLXRyZWUgLS1yZXNldCAtdSBIRUFEIHx8IGV4aXQgMQorCWV4aXQKK2ZpCisKK21lcmdlX25hbWU9JChnaXQgZm10LW1lcmdlLW1zZyA8IiRHSVRfRElSL0ZFVENIX0hFQUQiKSB8fCBleGl0Cit0ZXN0IHRydWUgPSAiJHJlYmFzZSIgJiYKKwlleGVjIGdpdC1yZWJhc2UgJHN0cmF0ZWd5X2FyZ3MgLS1vbnRvICRtZXJnZV9oZWFkIFwKKwkke29sZHJlbW90ZXJlZjotJG1lcmdlX2hlYWR9CitleGVjIGdpdC1tZXJnZSAkbm9fc3VtbWFyeSAkbm9fY29tbWl0ICRzcXVhc2ggJG5vX2ZmICRzdHJhdGVneV9hcmdzIFwKKwkiJG1lcmdlX25hbWUiIEhFQUQgJG1lcmdlX2hlYWQKZGlmZiAtLWdpdCBhL2dpdC1xdWlsdGltcG9ydC5zaCBiL2dpdC1xdWlsdGltcG9ydC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43Y2Q4ZjcxCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LXF1aWx0aW1wb3J0LnNoCkBAIC0wLDAgKzEsMTM4IEBACisjIS9iaW4vc2gKK09QVElPTlNfS0VFUERBU0hEQVNIPQorT1BUSU9OU19TUEVDPSJcCitnaXQtcXVpbHRpbXBvcnQgW29wdGlvbnNdCistLQorbixkcnktcnVuICAgICBkcnkgcnVuCithdXRob3I9ICAgICAgIGF1dGhvciBuYW1lIGFuZCBlbWFpbCBhZGRyZXNzIGZvciBwYXRjaGVzIHdpdGhvdXQgYW55CitwYXRjaGVzPSAgICAgIHBhdGggdG8gdGhlIHF1aWx0IHNlcmllcyBhbmQgcGF0Y2hlcworIgorU1VCRElSRUNUT1JZX09OPVllcworLiBnaXQtc2gtc2V0dXAKKworZHJ5X3J1bj0iIgorcXVpbHRfYXV0aG9yPSIiCit3aGlsZSB0ZXN0ICQjICE9IDAKK2RvCisJY2FzZSAiJDEiIGluCisJLS1hdXRob3IpCisJCXNoaWZ0CisJCXF1aWx0X2F1dGhvcj0iJDEiCisJCTs7CisJLW58LS1kcnktcnVuKQorCQlkcnlfcnVuPTEKKwkJOzsKKwktLXBhdGNoZXMpCisJCXNoaWZ0CisJCVFVSUxUX1BBVENIRVM9IiQxIgorCQk7OworCS0tKQorCQlzaGlmdAorCQlicmVhazs7CisJKikKKwkJdXNhZ2UKKwkJOzsKKwllc2FjCisJc2hpZnQKK2RvbmUKKworIyBRdWlsdCBBdXRob3IKK2lmIFsgLW4gIiRxdWlsdF9hdXRob3IiIF0gOyB0aGVuCisJcXVpbHRfYXV0aG9yX25hbWU9JChleHByICJ6JHF1aWx0X2F1dGhvciIgOiAnelwoLipbXiBdXCkgKjwuKicpICYmCisJcXVpbHRfYXV0aG9yX2VtYWlsPSQoZXhwciAieiRxdWlsdF9hdXRob3IiIDogJy4qPFwoW14+XSpcKScpICYmCisJdGVzdCAnJyAhPSAiJHF1aWx0X2F1dGhvcl9uYW1lIiAmJgorCXRlc3QgJycgIT0gIiRxdWlsdF9hdXRob3JfZW1haWwiIHx8CisJZGllICJtYWxmb3JtZWQgLS1hdXRob3IgcGFyYW1ldGVyIgorZmkKKworIyBRdWlsdCBwYXRjaCBkaXJlY3RvcnkKKzogJHtRVUlMVF9QQVRDSEVTOj1wYXRjaGVzfQoraWYgISBbIC1kICIkUVVJTFRfUEFUQ0hFUyIgXSA7IHRoZW4KKwllY2hvICJUaGUgXCIkUVVJTFRfUEFUQ0hFU1wiIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4iCisJZXhpdCAxCitmaQorCisjIFRlbXBvcmFyeSBkaXJlY3RvcmllcwordG1wX2Rpcj0uZG90ZXN0Cit0bXBfbXNnPSIkdG1wX2Rpci9tc2ciCit0bXBfcGF0Y2g9IiR0bXBfZGlyL3BhdGNoIgordG1wX2luZm89IiR0bXBfZGlyL2luZm8iCisKKworIyBGaW5kIHRoZSBpbnRpYWwgY29tbWl0Citjb21taXQ9JChnaXQgcmV2LXBhcnNlIEhFQUQpCisKK21rZGlyICR0bXBfZGlyIHx8IGV4aXQgMgord2hpbGUgcmVhZCBwYXRjaF9uYW1lIGxldmVsIGdhcmJhZ2UKK2RvCisJY2FzZSAiJHBhdGNoX25hbWUiIGluICcnfCcjJyopIGNvbnRpbnVlOzsgZXNhYworCWNhc2UgIiRsZXZlbCIgaW4KKwktcCopCTs7CisJJyd8JyMnKikKKwkJbGV2ZWw9OzsKKwkqKQorCQllY2hvICJ1bmFibGUgdG8gcGFyc2UgcGF0Y2ggbGV2ZWwsIGlnbm9yaW5nIGl0LiIKKwkJbGV2ZWw9OzsKKwllc2FjCisJY2FzZSAiJGdhcmJhZ2UiIGluCisJJyd8JyMnKik7OworCSopCisJCWVjaG8gInRyYWlsaW5nIGdhcmJhZ2UgZm91bmQgaW4gc2VyaWVzIGZpbGU6ICRnYXJiYWdlIgorCQlleGl0IDE7OworCWVzYWMKKwlpZiAhIFsgLWYgIiRRVUlMVF9QQVRDSEVTLyRwYXRjaF9uYW1lIiBdIDsgdGhlbgorCQllY2hvICIkcGF0Y2hfbmFtZSBkb2Vzbid0IGV4aXN0LiBTa2lwcGluZy4iCisJCWNvbnRpbnVlCisJZmkKKwllY2hvICRwYXRjaF9uYW1lCisJZ2l0IG1haWxpbmZvICIkdG1wX21zZyIgIiR0bXBfcGF0Y2giIFwKKwkJPCIkUVVJTFRfUEFUQ0hFUy8kcGF0Y2hfbmFtZSIgPiIkdG1wX2luZm8iIHx8IGV4aXQgMworCXRlc3QgLXMgIiR0bXBfcGF0Y2giIHx8IHsKKwkJZWNobyAiUGF0Y2ggaXMgZW1wdHkuICBXYXMgaXQgc3BsaXQgd3Jvbmc/IgorCQlleGl0IDEKKwl9CisKKwkjIFBhcnNlIHRoZSBhdXRob3IgaW5mb3JtYXRpb24KKwlHSVRfQVVUSE9SX05BTUU9JChzZWQgLW5lICdzL0F1dGhvcjogLy9wJyAiJHRtcF9pbmZvIikKKwlHSVRfQVVUSE9SX0VNQUlMPSQoc2VkIC1uZSAncy9FbWFpbDogLy9wJyAiJHRtcF9pbmZvIikKKwlleHBvcnQgR0lUX0FVVEhPUl9OQU1FIEdJVF9BVVRIT1JfRU1BSUwKKwl3aGlsZSB0ZXN0IC16ICIkR0lUX0FVVEhPUl9FTUFJTCIgJiYgdGVzdCAteiAiJEdJVF9BVVRIT1JfTkFNRSIgOyBkbworCQlpZiBbIC1uICIkcXVpbHRfYXV0aG9yIiBdIDsgdGhlbgorCQkJR0lUX0FVVEhPUl9OQU1FPSIkcXVpbHRfYXV0aG9yX25hbWUiOworCQkJR0lUX0FVVEhPUl9FTUFJTD0iJHF1aWx0X2F1dGhvcl9lbWFpbCI7CisJCWVsaWYgWyAtbiAiJGRyeV9ydW4iIF07IHRoZW4KKwkJCWVjaG8gIk5vIGF1dGhvciBmb3VuZCBpbiAkcGF0Y2hfbmFtZSIgPiYyOworCQkJR0lUX0FVVEhPUl9OQU1FPSJkcnktcnVuLW5vdC1mb3VuZCI7CisJCQlHSVRfQVVUSE9SX0VNQUlMPSJkcnktcnVuLW5vdC1mb3VuZCI7CisJCWVsc2UKKwkJCWVjaG8gIk5vIGF1dGhvciBmb3VuZCBpbiAkcGF0Y2hfbmFtZSIgPiYyOworCQkJZWNobyAiLS0tIgorCQkJY2F0ICR0bXBfbXNnCisJCQlwcmludGYgIkF1dGhvcjogIjsKKwkJCXJlYWQgcGF0Y2hfYXV0aG9yCisKKwkJCWVjaG8gIiRwYXRjaF9hdXRob3IiCisKKwkJCXBhdGNoX2F1dGhvcl9uYW1lPSQoZXhwciAieiRwYXRjaF9hdXRob3IiIDogJ3pcKC4qW14gXVwpICo8LionKSAmJgorCQkJcGF0Y2hfYXV0aG9yX2VtYWlsPSQoZXhwciAieiRwYXRjaF9hdXRob3IiIDogJy4qPFwoW14+XSpcKScpICYmCisJCQl0ZXN0ICcnICE9ICIkcGF0Y2hfYXV0aG9yX25hbWUiICYmCisJCQl0ZXN0ICcnICE9ICIkcGF0Y2hfYXV0aG9yX2VtYWlsIiAmJgorCQkJR0lUX0FVVEhPUl9OQU1FPSIkcGF0Y2hfYXV0aG9yX25hbWUiICYmCisJCQlHSVRfQVVUSE9SX0VNQUlMPSIkcGF0Y2hfYXV0aG9yX2VtYWlsIgorCQlmaQorCWRvbmUKKwlHSVRfQVVUSE9SX0RBVEU9JChzZWQgLW5lICdzL0RhdGU6IC8vcCcgIiR0bXBfaW5mbyIpCisJU1VCSkVDVD0kKHNlZCAtbmUgJ3MvU3ViamVjdDogLy9wJyAiJHRtcF9pbmZvIikKKwlleHBvcnQgR0lUX0FVVEhPUl9EQVRFIFNVQkpFQ1QKKwlpZiBbIC16ICIkU1VCSkVDVCIgXSA7IHRoZW4KKwkJU1VCSkVDVD0kKGVjaG8gJHBhdGNoX25hbWUgfCBzZWQgLWUgJ3MvLnBhdGNoJC8vJykKKwlmaQorCisJaWYgWyAteiAiJGRyeV9ydW4iIF0gOyB0aGVuCisJCWdpdCBhcHBseSAtLWluZGV4IC1DMSAke2xldmVsOisiJGxldmVsIn0gIiR0bXBfcGF0Y2giICYmCisJCXRyZWU9JChnaXQgd3JpdGUtdHJlZSkgJiYKKwkJY29tbWl0PSQoIChlY2hvICIkU1VCSkVDVCI7IGVjaG87IGNhdCAiJHRtcF9tc2ciKSB8IGdpdCBjb21taXQtdHJlZSAkdHJlZSAtcCAkY29tbWl0KSAmJgorCQlnaXQgdXBkYXRlLXJlZiAtbSAicXVpbHRpbXBvcnQ6ICRwYXRjaF9uYW1lIiBIRUFEICRjb21taXQgfHwgZXhpdCA0CisJZmkKK2RvbmUgPCIkUVVJTFRfUEFUQ0hFUy9zZXJpZXMiCitybSAtcmYgJHRtcF9kaXIgfHwgZXhpdCA1CmRpZmYgLS1naXQgYS9naXQtcmViYXNlLS1pbnRlcmFjdGl2ZS5zaCBiL2dpdC1yZWJhc2UtLWludGVyYWN0aXZlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhhYTczNzEKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtcmViYXNlLS1pbnRlcmFjdGl2ZS5zaApAQCAtMCwwICsxLDU1NiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBKb2hhbm5lcyBFLiBTY2hpbmRlbGluCisKKyMgU0hPUlQgREVTQ1JJUFRJT04KKyMKKyMgVGhpcyBzY3JpcHQgbWFrZXMgaXQgZWFzeSB0byBmaXggdXAgY29tbWl0cyBpbiB0aGUgbWlkZGxlIG9mIGEgc2VyaWVzLAorIyBhbmQgcmVhcnJhbmdlIGNvbW1pdHMuCisjCisjIFRoZSBvcmlnaW5hbCBpZGVhIGNvbWVzIGZyb20gRXJpYyBXLiBCaWVkZXJtYW4sIGluCisjIGh0dHA6Ly9hcnRpY2xlLmdtYW5lLm9yZy9nbWFuZS5jb21wLnZlcnNpb24tY29udHJvbC5naXQvMjI0MDcKKworVVNBR0U9JygtLWNvbnRpbnVlIHwgLS1hYm9ydCB8IC0tc2tpcCB8IFstLXByZXNlcnZlLW1lcmdlc10gWy0tdmVyYm9zZV0KKwlbLS1vbnRvIDxicmFuY2g+XSA8dXBzdHJlYW0+IFs8YnJhbmNoPl0pJworCitPUFRJT05TX1NQRUM9CisuIGdpdC1zaC1zZXR1cAorcmVxdWlyZV93b3JrX3RyZWUKKworRE9URVNUPSIkR0lUX0RJUi8uZG90ZXN0LW1lcmdlIgorVE9ETz0iJERPVEVTVCIvZ2l0LXJlYmFzZS10b2RvCitET05FPSIkRE9URVNUIi9kb25lCitNU0c9IiRET1RFU1QiL21lc3NhZ2UKK1NRVUFTSF9NU0c9IiRET1RFU1QiL21lc3NhZ2Utc3F1YXNoCitSRVdSSVRURU49IiRET1RFU1QiL3Jld3JpdHRlbgorUFJFU0VSVkVfTUVSR0VTPQorU1RSQVRFR1k9CitWRVJCT1NFPQordGVzdCAtZCAiJFJFV1JJVFRFTiIgJiYgUFJFU0VSVkVfTUVSR0VTPXQKK3Rlc3QgLWYgIiRET1RFU1QiL3N0cmF0ZWd5ICYmIFNUUkFURUdZPSIkKGNhdCAiJERPVEVTVCIvc3RyYXRlZ3kpIgordGVzdCAtZiAiJERPVEVTVCIvdmVyYm9zZSAmJiBWRVJCT1NFPXQKKworR0lUX0NIRVJSWV9QSUNLX0hFTFA9IiAgQWZ0ZXIgcmVzb2x2aW5nIHRoZSBjb25mbGljdHMsCittYXJrIHRoZSBjb3JyZWN0ZWQgcGF0aHMgd2l0aCAnZ2l0IGFkZCA8cGF0aHM+JywgYW5kCitydW4gJ2dpdCByZWJhc2UgLS1jb250aW51ZSciCitleHBvcnQgR0lUX0NIRVJSWV9QSUNLX0hFTFAKKword2FybiAoKSB7CisJZWNobyAiJCoiID4mMgorfQorCitvdXRwdXQgKCkgeworCWNhc2UgIiRWRVJCT1NFIiBpbgorCScnKQorCQlvdXRwdXQ9JCgiJEAiIDI+JjEgKQorCQlzdGF0dXM9JD8KKwkJdGVzdCAkc3RhdHVzICE9IDAgJiYgcHJpbnRmICIlc1xuIiAiJG91dHB1dCIKKwkJcmV0dXJuICRzdGF0dXMKKwkJOzsKKwkqKQorCQkiJEAiCisJCTs7CisJZXNhYworfQorCityZXF1aXJlX2NsZWFuX3dvcmtfdHJlZSAoKSB7CisJIyB0ZXN0IGlmIHdvcmtpbmcgdHJlZSBpcyBkaXJ0eQorCWdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCA+IC9kZXYvbnVsbCAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1yZWZyZXNoICYmCisJZ2l0IGRpZmYtZmlsZXMgLS1xdWlldCAmJgorCWdpdCBkaWZmLWluZGV4IC0tY2FjaGVkIC0tcXVpZXQgSEVBRCAtLSB8fAorCWRpZSAiV29ya2luZyB0cmVlIGlzIGRpcnR5IgorfQorCitPUklHX1JFRkxPR19BQ1RJT049IiRHSVRfUkVGTE9HX0FDVElPTiIKKworY29tbWVudF9mb3JfcmVmbG9nICgpIHsKKwljYXNlICIkT1JJR19SRUZMT0dfQUNUSU9OIiBpbgorCScnfHJlYmFzZSopCisJCUdJVF9SRUZMT0dfQUNUSU9OPSJyZWJhc2UgLWkgKCQxKSIKKwkJZXhwb3J0IEdJVF9SRUZMT0dfQUNUSU9OCisJCTs7CisJZXNhYworfQorCitsYXN0X2NvdW50PQorbWFya19hY3Rpb25fZG9uZSAoKSB7CisJc2VkIC1lIDFxIDwgIiRUT0RPIiA+PiAiJERPTkUiCisJc2VkIC1lIDFkIDwgIiRUT0RPIiA+PiAiJFRPRE8iLm5ldworCW12IC1mICIkVE9ETyIubmV3ICIkVE9ETyIKKwljb3VudD0kKGdyZXAgLWMgJ15bXiNdJyA8ICIkRE9ORSIpCisJdG90YWw9JCgoJGNvdW50KyQoZ3JlcCAtYyAnXlteI10nIDwgIiRUT0RPIikpKQorCWlmIHRlc3QgIiRsYXN0X2NvdW50IiAhPSAiJGNvdW50IgorCXRoZW4KKwkJbGFzdF9jb3VudD0kY291bnQKKwkJcHJpbnRmICJSZWJhc2luZyAoJWQvJWQpXHIiICRjb3VudCAkdG90YWwKKwkJdGVzdCAteiAiJFZFUkJPU0UiIHx8IGVjaG8KKwlmaQorfQorCittYWtlX3BhdGNoICgpIHsKKwlwYXJlbnRfc2hhMT0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgIiQxIl4pIHx8CisJCWRpZSAiQ2Fubm90IGdldCBwYXRjaCBmb3IgJDFeIgorCWdpdCBkaWZmLXRyZWUgLXAgIiRwYXJlbnRfc2hhMSIuLiIkMSIgPiAiJERPVEVTVCIvcGF0Y2gKKwl0ZXN0IC1mICIkRE9URVNUIi9tZXNzYWdlIHx8CisJCWdpdCBjYXQtZmlsZSBjb21taXQgIiQxIiB8IHNlZCAiMSwvXiQvZCIgPiAiJERPVEVTVCIvbWVzc2FnZQorCXRlc3QgLWYgIiRET1RFU1QiL2F1dGhvci1zY3JpcHQgfHwKKwkJZ2V0X2F1dGhvcl9pZGVudF9mcm9tX2NvbW1pdCAiJDEiID4gIiRET1RFU1QiL2F1dGhvci1zY3JpcHQKK30KKworZGllX3dpdGhfcGF0Y2ggKCkgeworCW1ha2VfcGF0Y2ggIiQxIgorCWdpdCByZXJlcmUKKwlkaWUgIiQyIgorfQorCitkaWVfYWJvcnQgKCkgeworCXJtIC1yZiAiJERPVEVTVCIKKwlkaWUgIiQxIgorfQorCitoYXNfYWN0aW9uICgpIHsKKwlncmVwICdeW14jXScgIiQxIiA+L2Rldi9udWxsCit9CisKK3BpY2tfb25lICgpIHsKKwlub19mZj0KKwljYXNlICIkMSIgaW4gLW4pIHNoYTE9JDI7IG5vX2ZmPXQgOzsgKikgc2hhMT0kMSA7OyBlc2FjCisJb3V0cHV0IGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgJHNoYTEgfHwgZGllICJJbnZhbGlkIGNvbW1pdCBuYW1lOiAkc2hhMSIKKwl0ZXN0IC1kICIkUkVXUklUVEVOIiAmJgorCQlwaWNrX29uZV9wcmVzZXJ2aW5nX21lcmdlcyAiJEAiICYmIHJldHVybgorCXBhcmVudF9zaGExPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAkc2hhMV4pIHx8CisJCWRpZSAiQ291bGQgbm90IGdldCB0aGUgcGFyZW50IG9mICRzaGExIgorCWN1cnJlbnRfc2hhMT0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkKKwlpZiB0ZXN0ICIkbm9fZmYkY3VycmVudF9zaGExIiA9ICIkcGFyZW50X3NoYTEiOyB0aGVuCisJCW91dHB1dCBnaXQgcmVzZXQgLS1oYXJkICRzaGExCisJCXRlc3QgImEkMSIgPSBhLW4gJiYgb3V0cHV0IGdpdCByZXNldCAtLXNvZnQgJGN1cnJlbnRfc2hhMQorCQlzaGExPSQoZ2l0IHJldi1wYXJzZSAtLXNob3J0ICRzaGExKQorCQlvdXRwdXQgd2FybiBGYXN0IGZvcndhcmQgdG8gJHNoYTEKKwllbHNlCisJCW91dHB1dCBnaXQgY2hlcnJ5LXBpY2sgIiRAIgorCWZpCit9CisKK3BpY2tfb25lX3ByZXNlcnZpbmdfbWVyZ2VzICgpIHsKKwljYXNlICIkMSIgaW4gLW4pIHNoYTE9JDIgOzsgKikgc2hhMT0kMSA7OyBlc2FjCisJc2hhMT0kKGdpdCByZXYtcGFyc2UgJHNoYTEpCisKKwlpZiB0ZXN0IC1mICIkRE9URVNUIi9jdXJyZW50LWNvbW1pdAorCXRoZW4KKwkJY3VycmVudF9jb21taXQ9JChjYXQgIiRET1RFU1QiL2N1cnJlbnQtY29tbWl0KSAmJgorCQlnaXQgcmV2LXBhcnNlIEhFQUQgPiAiJFJFV1JJVFRFTiIvJGN1cnJlbnRfY29tbWl0ICYmCisJCXJtICIkRE9URVNUIi9jdXJyZW50LWNvbW1pdCB8fAorCQlkaWUgIkNhbm5vdCB3cml0ZSBjdXJyZW50IGNvbW1pdCdzIHJlcGxhY2VtZW50IHNoYTEiCisJZmkKKworCSMgcmV3cml0ZSBwYXJlbnRzOyBpZiBub25lIHdlcmUgcmV3cml0dGVuLCB3ZSBjYW4gZmFzdC1mb3J3YXJkLgorCWZhc3RfZm9yd2FyZD10CisJcHJlc2VydmU9dAorCW5ld19wYXJlbnRzPQorCWZvciBwIGluICQoZ2l0IHJldi1saXN0IC0tcGFyZW50cyAtMSAkc2hhMSB8IGN1dCAtZCcgJyAtZjItKQorCWRvCisJCWlmIHRlc3QgLWYgIiRSRVdSSVRURU4iLyRwCisJCXRoZW4KKwkJCXByZXNlcnZlPWYKKwkJCW5ld19wPSQoY2F0ICIkUkVXUklUVEVOIi8kcCkKKwkJCXRlc3QgJHAgIT0gJG5ld19wICYmIGZhc3RfZm9yd2FyZD1mCisJCQljYXNlICIkbmV3X3BhcmVudHMiIGluCisJCQkqJG5ld19wKikKKwkJCQk7OyAjIGRvIG5vdGhpbmc7IHRoYXQgcGFyZW50IGlzIGFscmVhZHkgdGhlcmUKKwkJCSopCisJCQkJbmV3X3BhcmVudHM9IiRuZXdfcGFyZW50cyAkbmV3X3AiCisJCQkJOzsKKwkJCWVzYWMKKwkJZmkKKwlkb25lCisJY2FzZSAkZmFzdF9mb3J3YXJkIGluCisJdCkKKwkJb3V0cHV0IHdhcm4gIkZhc3QgZm9yd2FyZCB0byAkc2hhMSIKKwkJdGVzdCAkcHJlc2VydmUgPSBmIHx8IGVjaG8gJHNoYTEgPiAiJFJFV1JJVFRFTiIvJHNoYTEKKwkJOzsKKwlmKQorCQl0ZXN0ICJhJDEiID0gYS1uICYmIGRpZSAiUmVmdXNpbmcgdG8gc3F1YXNoIGEgbWVyZ2U6ICRzaGExIgorCisJCWZpcnN0X3BhcmVudD0kKGV4cHIgIiRuZXdfcGFyZW50cyIgOiAnIFwoW14gXSpcKScpCisJCSMgZGV0YWNoIEhFQUQgdG8gY3VycmVudCBwYXJlbnQKKwkJb3V0cHV0IGdpdCBjaGVja291dCAkZmlyc3RfcGFyZW50IDI+IC9kZXYvbnVsbCB8fAorCQkJZGllICJDYW5ub3QgbW92ZSBIRUFEIHRvICRmaXJzdF9wYXJlbnQiCisKKwkJZWNobyAkc2hhMSA+ICIkRE9URVNUIi9jdXJyZW50LWNvbW1pdAorCQljYXNlICIkbmV3X3BhcmVudHMiIGluCisJCScgJyonICcqKQorCQkJIyByZWRvIG1lcmdlCisJCQlhdXRob3Jfc2NyaXB0PSQoZ2V0X2F1dGhvcl9pZGVudF9mcm9tX2NvbW1pdCAkc2hhMSkKKwkJCWV2YWwgIiRhdXRob3Jfc2NyaXB0IgorCQkJbXNnPSIkKGdpdCBjYXQtZmlsZSBjb21taXQgJHNoYTEgfCBzZWQgLWUgJzEsL14kL2QnKSIKKwkJCSMgTm8gcG9pbnQgaW4gbWVyZ2luZyB0aGUgZmlyc3QgcGFyZW50LCB0aGF0J3MgSEVBRAorCQkJbmV3X3BhcmVudHM9JHtuZXdfcGFyZW50cyMgJGZpcnN0X3BhcmVudH0KKwkJCWlmICEgR0lUX0FVVEhPUl9OQU1FPSIkR0lUX0FVVEhPUl9OQU1FIiBcCisJCQkJR0lUX0FVVEhPUl9FTUFJTD0iJEdJVF9BVVRIT1JfRU1BSUwiIFwKKwkJCQlHSVRfQVVUSE9SX0RBVEU9IiRHSVRfQVVUSE9SX0RBVEUiIFwKKwkJCQlvdXRwdXQgZ2l0IG1lcmdlICRTVFJBVEVHWSAtbSAiJG1zZyIgXAorCQkJCQkkbmV3X3BhcmVudHMKKwkJCXRoZW4KKwkJCQlnaXQgcmVyZXJlCisJCQkJcHJpbnRmICIlc1xuIiAiJG1zZyIgPiAiJEdJVF9ESVIiL01FUkdFX01TRworCQkJCWRpZSBFcnJvciByZWRvaW5nIG1lcmdlICRzaGExCisJCQlmaQorCQkJOzsKKwkJKikKKwkJCW91dHB1dCBnaXQgY2hlcnJ5LXBpY2sgIiRAIiB8fAorCQkJCWRpZV93aXRoX3BhdGNoICRzaGExICJDb3VsZCBub3QgcGljayAkc2hhMSIKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwllc2FjCit9CisKK250aF9zdHJpbmcgKCkgeworCWNhc2UgIiQxIiBpbgorCSoxWzAtOV18KlswNC05XSkgZWNobyAiJDEidGg7OworCSoxKSBlY2hvICIkMSJzdDs7CisJKjIpIGVjaG8gIiQxIm5kOzsKKwkqMykgZWNobyAiJDEicmQ7OworCWVzYWMKK30KKworbWFrZV9zcXVhc2hfbWVzc2FnZSAoKSB7CisJaWYgdGVzdCAtZiAiJFNRVUFTSF9NU0ciOyB0aGVuCisJCUNPVU5UPSQoKCQoc2VkIC1uICJzL14jIFRoaXMgaXMgW14wLTldKlwoWzEtOV1bMC05XSpcKS4qL1wxL3AiIFwKKwkJCTwgIiRTUVVBU0hfTVNHIiB8IHNlZCAtbmUgJyRwJykrMSkpCisJCWVjaG8gIiMgVGhpcyBpcyBhIGNvbWJpbmF0aW9uIG9mICRDT1VOVCBjb21taXRzLiIKKwkJc2VkIC1lIDFkIC1lICcyLC9eLi97CisJCQkvXiQvZAorCQl9JyA8IiRTUVVBU0hfTVNHIgorCWVsc2UKKwkJQ09VTlQ9MgorCQllY2hvICIjIFRoaXMgaXMgYSBjb21iaW5hdGlvbiBvZiB0d28gY29tbWl0cy4iCisJCWVjaG8gIiMgVGhlIGZpcnN0IGNvbW1pdCdzIG1lc3NhZ2UgaXM6IgorCQllY2hvCisJCWdpdCBjYXQtZmlsZSBjb21taXQgSEVBRCB8IHNlZCAtZSAnMSwvXiQvZCcKKwlmaQorCWVjaG8KKwllY2hvICIjIFRoaXMgaXMgdGhlICQobnRoX3N0cmluZyAkQ09VTlQpIGNvbW1pdCBtZXNzYWdlOiIKKwllY2hvCisJZ2l0IGNhdC1maWxlIGNvbW1pdCAkMSB8IHNlZCAtZSAnMSwvXiQvZCcKK30KKworcGVla19uZXh0X2NvbW1hbmQgKCkgeworCXNlZCAtbiAiMXMvIC4qJC8vcCIgPCAiJFRPRE8iCit9CisKK2RvX25leHQgKCkgeworCXJtIC1mICIkRE9URVNUIi9tZXNzYWdlICIkRE9URVNUIi9hdXRob3Itc2NyaXB0IFwKKwkJIiRET1RFU1QiL2FtZW5kIHx8IGV4aXQKKwlyZWFkIGNvbW1hbmQgc2hhMSByZXN0IDwgIiRUT0RPIgorCWNhc2UgIiRjb21tYW5kIiBpbgorCScjJyp8JycpCisJCW1hcmtfYWN0aW9uX2RvbmUKKwkJOzsKKwlwaWNrfHApCisJCWNvbW1lbnRfZm9yX3JlZmxvZyBwaWNrCisKKwkJbWFya19hY3Rpb25fZG9uZQorCQlwaWNrX29uZSAkc2hhMSB8fAorCQkJZGllX3dpdGhfcGF0Y2ggJHNoYTEgIkNvdWxkIG5vdCBhcHBseSAkc2hhMS4uLiAkcmVzdCIKKwkJOzsKKwllZGl0fGUpCisJCWNvbW1lbnRfZm9yX3JlZmxvZyBlZGl0CisKKwkJbWFya19hY3Rpb25fZG9uZQorCQlwaWNrX29uZSAkc2hhMSB8fAorCQkJZGllX3dpdGhfcGF0Y2ggJHNoYTEgIkNvdWxkIG5vdCBhcHBseSAkc2hhMS4uLiAkcmVzdCIKKwkJbWFrZV9wYXRjaCAkc2hhMQorCQk6ID4gIiRET1RFU1QiL2FtZW5kCisJCXdhcm4KKwkJd2FybiAiWW91IGNhbiBhbWVuZCB0aGUgY29tbWl0IG5vdywgd2l0aCIKKwkJd2FybgorCQl3YXJuICIJZ2l0IGNvbW1pdCAtLWFtZW5kIgorCQl3YXJuCisJCXdhcm4gIk9uY2UgeW91IGFyZSBzYXRpc2ZpZWQgd2l0aCB5b3VyIGNoYW5nZXMsIHJ1biIKKwkJd2FybgorCQl3YXJuICIJZ2l0IHJlYmFzZSAtLWNvbnRpbnVlIgorCQl3YXJuCisJCWV4aXQgMAorCQk7OworCXNxdWFzaHxzKQorCQljb21tZW50X2Zvcl9yZWZsb2cgc3F1YXNoCisKKwkJaGFzX2FjdGlvbiAiJERPTkUiIHx8CisJCQlkaWUgIkNhbm5vdCAnc3F1YXNoJyB3aXRob3V0IGEgcHJldmlvdXMgY29tbWl0IgorCisJCW1hcmtfYWN0aW9uX2RvbmUKKwkJbWFrZV9zcXVhc2hfbWVzc2FnZSAkc2hhMSA+ICIkTVNHIgorCQljYXNlICIkKHBlZWtfbmV4dF9jb21tYW5kKSIgaW4KKwkJc3F1YXNofHMpCisJCQlFRElUX0NPTU1JVD0KKwkJCVVTRV9PVVRQVVQ9b3V0cHV0CisJCQljcCAiJE1TRyIgIiRTUVVBU0hfTVNHIgorCQkJOzsKKwkJKikKKwkJCUVESVRfQ09NTUlUPS1lCisJCQlVU0VfT1VUUFVUPQorCQkJcm0gLWYgIiRTUVVBU0hfTVNHIiB8fCBleGl0CisJCQk7OworCQllc2FjCisKKwkJZmFpbGVkPWYKKwkJYXV0aG9yX3NjcmlwdD0kKGdldF9hdXRob3JfaWRlbnRfZnJvbV9jb21taXQgSEVBRCkKKwkJb3V0cHV0IGdpdCByZXNldCAtLXNvZnQgSEVBRF4KKwkJcGlja19vbmUgLW4gJHNoYTEgfHwgZmFpbGVkPXQKKwkJZWNobyAiJGF1dGhvcl9zY3JpcHQiID4gIiRET1RFU1QiL2F1dGhvci1zY3JpcHQKKwkJaWYgdGVzdCAkZmFpbGVkID0gZgorCQl0aGVuCisJCQkjIFRoaXMgaXMgbGlrZSAtLWFtZW5kLCBidXQgd2l0aCBhIGRpZmZlcmVudCBtZXNzYWdlCisJCQlldmFsICIkYXV0aG9yX3NjcmlwdCIKKwkJCUdJVF9BVVRIT1JfTkFNRT0iJEdJVF9BVVRIT1JfTkFNRSIgXAorCQkJR0lUX0FVVEhPUl9FTUFJTD0iJEdJVF9BVVRIT1JfRU1BSUwiIFwKKwkJCUdJVF9BVVRIT1JfREFURT0iJEdJVF9BVVRIT1JfREFURSIgXAorCQkJJFVTRV9PVVRQVVQgZ2l0IGNvbW1pdCAtLW5vLXZlcmlmeSAtRiAiJE1TRyIgJEVESVRfQ09NTUlUIHx8IGZhaWxlZD10CisJCWZpCisJCWlmIHRlc3QgJGZhaWxlZCA9IHQKKwkJdGhlbgorCQkJY3AgIiRNU0ciICIkR0lUX0RJUiIvTUVSR0VfTVNHCisJCQl3YXJuCisJCQl3YXJuICJDb3VsZCBub3QgYXBwbHkgJHNoYTEuLi4gJHJlc3QiCisJCQlkaWVfd2l0aF9wYXRjaCAkc2hhMSAiIgorCQlmaQorCQk7OworCSopCisJCXdhcm4gIlVua25vd24gY29tbWFuZDogJGNvbW1hbmQgJHNoYTEgJHJlc3QiCisJCWRpZV93aXRoX3BhdGNoICRzaGExICJQbGVhc2UgZml4IHRoaXMgaW4gdGhlIGZpbGUgJFRPRE8uIgorCQk7OworCWVzYWMKKwl0ZXN0IC1zICIkVE9ETyIgJiYgcmV0dXJuCisKKwljb21tZW50X2Zvcl9yZWZsb2cgZmluaXNoICYmCisJSEVBRE5BTUU9JChjYXQgIiRET1RFU1QiL2hlYWQtbmFtZSkgJiYKKwlPTERIRUFEPSQoY2F0ICIkRE9URVNUIi9oZWFkKSAmJgorCVNIT1JUT05UTz0kKGdpdCByZXYtcGFyc2UgLS1zaG9ydCAkKGNhdCAiJERPVEVTVCIvb250bykpICYmCisJaWYgdGVzdCAtZCAiJFJFV1JJVFRFTiIKKwl0aGVuCisJCXRlc3QgLWYgIiRET1RFU1QiL2N1cnJlbnQtY29tbWl0ICYmCisJCQljdXJyZW50X2NvbW1pdD0kKGNhdCAiJERPVEVTVCIvY3VycmVudC1jb21taXQpICYmCisJCQlnaXQgcmV2LXBhcnNlIEhFQUQgPiAiJFJFV1JJVFRFTiIvJGN1cnJlbnRfY29tbWl0CisJCWlmIHRlc3QgLWYgIiRSRVdSSVRURU4iLyRPTERIRUFECisJCXRoZW4KKwkJCU5FV0hFQUQ9JChjYXQgIiRSRVdSSVRURU4iLyRPTERIRUFEKQorCQllbHNlCisJCQlORVdIRUFEPSRPTERIRUFECisJCWZpCisJZWxzZQorCQlORVdIRUFEPSQoZ2l0IHJldi1wYXJzZSBIRUFEKQorCWZpICYmCisJY2FzZSAkSEVBRE5BTUUgaW4KKwlyZWZzLyopCisJCW1lc3NhZ2U9IiRHSVRfUkVGTE9HX0FDVElPTjogJEhFQUROQU1FIG9udG8gJFNIT1JUT05UTykiICYmCisJCWdpdCB1cGRhdGUtcmVmIC1tICIkbWVzc2FnZSIgJEhFQUROQU1FICRORVdIRUFEICRPTERIRUFEICYmCisJCWdpdCBzeW1ib2xpYy1yZWYgSEVBRCAkSEVBRE5BTUUKKwkJOzsKKwllc2FjICYmIHsKKwkJdGVzdCAhIC1mICIkRE9URVNUIi92ZXJib3NlIHx8CisJCQlnaXQgZGlmZi10cmVlIC0tc3RhdCAkKGNhdCAiJERPVEVTVCIvaGVhZCkuLkhFQUQKKwl9ICYmCisJcm0gLXJmICIkRE9URVNUIiAmJgorCWdpdCBnYyAtLWF1dG8gJiYKKwl3YXJuICJTdWNjZXNzZnVsbHkgcmViYXNlZCBhbmQgdXBkYXRlZCAkSEVBRE5BTUUuIgorCisJZXhpdAorfQorCitkb19yZXN0ICgpIHsKKwl3aGlsZSA6CisJZG8KKwkJZG9fbmV4dAorCWRvbmUKK30KKword2hpbGUgdGVzdCAkIyAhPSAwCitkbworCWNhc2UgIiQxIiBpbgorCS0tY29udGludWUpCisJCWNvbW1lbnRfZm9yX3JlZmxvZyBjb250aW51ZQorCisJCXRlc3QgLWQgIiRET1RFU1QiIHx8IGRpZSAiTm8gaW50ZXJhY3RpdmUgcmViYXNlIHJ1bm5pbmciCisKKwkJIyBTYW5pdHkgY2hlY2sKKwkJZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEID4vZGV2L251bGwgfHwKKwkJCWRpZSAiQ2Fubm90IHJlYWQgSEVBRCIKKwkJZ2l0IHVwZGF0ZS1pbmRleCAtLXJlZnJlc2ggJiYgZ2l0IGRpZmYtZmlsZXMgLS1xdWlldCB8fAorCQkJZGllICJXb3JraW5nIHRyZWUgaXMgZGlydHkiCisKKwkJIyBkbyB3ZSBoYXZlIGFueXRoaW5nIHRvIGNvbW1pdD8KKwkJaWYgZ2l0IGRpZmYtaW5kZXggLS1jYWNoZWQgLS1xdWlldCBIRUFEIC0tCisJCXRoZW4KKwkJCTogTm90aGluZyB0byBjb21taXQgLS0gc2tpcCB0aGlzCisJCWVsc2UKKwkJCS4gIiRET1RFU1QiL2F1dGhvci1zY3JpcHQgfHwKKwkJCQlkaWUgIkNhbm5vdCBmaW5kIHRoZSBhdXRob3IgaWRlbnRpdHkiCisJCQlpZiB0ZXN0IC1mICIkRE9URVNUIi9hbWVuZAorCQkJdGhlbgorCQkJCWdpdCByZXNldCAtLXNvZnQgSEVBRF4gfHwKKwkJCQlkaWUgIkNhbm5vdCByZXdpbmQgdGhlIEhFQUQiCisJCQlmaQorCQkJZXhwb3J0IEdJVF9BVVRIT1JfTkFNRSBHSVRfQVVUSE9SX0VNQUlMIEdJVF9BVVRIT1JfREFURSAmJgorCQkJZ2l0IGNvbW1pdCAtLW5vLXZlcmlmeSAtRiAiJERPVEVTVCIvbWVzc2FnZSAtZSB8fAorCQkJZGllICJDb3VsZCBub3QgY29tbWl0IHN0YWdlZCBjaGFuZ2VzLiIKKwkJZmkKKworCQlyZXF1aXJlX2NsZWFuX3dvcmtfdHJlZQorCQlkb19yZXN0CisJCTs7CisJLS1hYm9ydCkKKwkJY29tbWVudF9mb3JfcmVmbG9nIGFib3J0CisKKwkJZ2l0IHJlcmVyZSBjbGVhcgorCQl0ZXN0IC1kICIkRE9URVNUIiB8fCBkaWUgIk5vIGludGVyYWN0aXZlIHJlYmFzZSBydW5uaW5nIgorCisJCUhFQUROQU1FPSQoY2F0ICIkRE9URVNUIi9oZWFkLW5hbWUpCisJCUhFQUQ9JChjYXQgIiRET1RFU1QiL2hlYWQpCisJCWNhc2UgJEhFQUROQU1FIGluCisJCXJlZnMvKikKKwkJCWdpdCBzeW1ib2xpYy1yZWYgSEVBRCAkSEVBRE5BTUUKKwkJCTs7CisJCWVzYWMgJiYKKwkJb3V0cHV0IGdpdCByZXNldCAtLWhhcmQgJEhFQUQgJiYKKwkJcm0gLXJmICIkRE9URVNUIgorCQlleGl0CisJCTs7CisJLS1za2lwKQorCQljb21tZW50X2Zvcl9yZWZsb2cgc2tpcAorCisJCWdpdCByZXJlcmUgY2xlYXIKKwkJdGVzdCAtZCAiJERPVEVTVCIgfHwgZGllICJObyBpbnRlcmFjdGl2ZSByZWJhc2UgcnVubmluZyIKKworCQlvdXRwdXQgZ2l0IHJlc2V0IC0taGFyZCAmJiBkb19yZXN0CisJCTs7CisJLXN8LS1zdHJhdGVneSkKKwkJY2FzZSAiJCMsJDEiIGluCisJCSosKj0qKQorCQkJU1RSQVRFR1k9Ii1zICIkKGV4cHIgInokMSIgOiAnei1bXj1dKj1cKC4qXCknKSA7OworCQkxLCopCisJCQl1c2FnZSA7OworCQkqKQorCQkJU1RSQVRFR1k9Ii1zICQyIgorCQkJc2hpZnQgOzsKKwkJZXNhYworCQk7OworCS1tfC0tbWVyZ2UpCisJCSMgd2UgdXNlIG1lcmdlIGFueXdheQorCQk7OworCS1DKikKKwkJZGllICJJbnRlcmFjdGl2ZSByZWJhc2UgdXNlcyBtZXJnZSwgc28gJDEgZG9lcyBub3QgbWFrZSBzZW5zZSIKKwkJOzsKKwktdnwtLXZlcmJvc2UpCisJCVZFUkJPU0U9dAorCQk7OworCS1wfC0tcHJlc2VydmUtbWVyZ2VzKQorCQlQUkVTRVJWRV9NRVJHRVM9dAorCQk7OworCS1pfC0taW50ZXJhY3RpdmUpCisJCSMgeWVhaCwgd2Uga25vdworCQk7OworCScnfC1oKQorCQl1c2FnZQorCQk7OworCSopCisJCXRlc3QgLWQgIiRET1RFU1QiICYmCisJCQlkaWUgIkludGVyYWN0aXZlIHJlYmFzZSBhbHJlYWR5IHN0YXJ0ZWQiCisKKwkJZ2l0IHZhciBHSVRfQ09NTUlUVEVSX0lERU5UID4vZGV2L251bGwgfHwKKwkJCWRpZSAiWW91IG5lZWQgdG8gc2V0IHlvdXIgY29tbWl0dGVyIGluZm8gZmlyc3QiCisKKwkJY29tbWVudF9mb3JfcmVmbG9nIHN0YXJ0CisKKwkJT05UTz0KKwkJY2FzZSAiJDEiIGluCisJCS0tb250bykKKwkJCU9OVE89JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5ICIkMiIpIHx8CisJCQkJZGllICJEb2VzIG5vdCBwb2ludCB0byBhIHZhbGlkIGNvbW1pdDogJDIiCisJCQlzaGlmdDsgc2hpZnQKKwkJCTs7CisJCWVzYWMKKworCQlyZXF1aXJlX2NsZWFuX3dvcmtfdHJlZQorCisJCWlmIHRlc3QgISAteiAiJDIiCisJCXRoZW4KKwkJCW91dHB1dCBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCAicmVmcy9oZWFkcy8kMiIgfHwKKwkJCQlkaWUgIkludmFsaWQgYnJhbmNobmFtZTogJDIiCisJCQlvdXRwdXQgZ2l0IGNoZWNrb3V0ICIkMiIgfHwKKwkJCQlkaWUgIkNvdWxkIG5vdCBjaGVja291dCAkMiIKKwkJZmkKKworCQlIRUFEPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSB8fCBkaWUgIk5vIEhFQUQ/IgorCQlVUFNUUkVBTT0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgIiQxIikgfHwgZGllICJJbnZhbGlkIGJhc2UiCisKKwkJbWtkaXIgIiRET1RFU1QiIHx8IGRpZSAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wb3JhcnkgJERPVEVTVCIKKworCQl0ZXN0IC16ICIkT05UTyIgJiYgT05UTz0kVVBTVFJFQU0KKworCQk6ID4gIiRET1RFU1QiL2ludGVyYWN0aXZlIHx8IGRpZSAiQ291bGQgbm90IG1hcmsgYXMgaW50ZXJhY3RpdmUiCisJCWdpdCBzeW1ib2xpYy1yZWYgSEVBRCA+ICIkRE9URVNUIi9oZWFkLW5hbWUgMj4gL2Rldi9udWxsIHx8CisJCQllY2hvICJkZXRhY2hlZCBIRUFEIiA+ICIkRE9URVNUIi9oZWFkLW5hbWUKKworCQllY2hvICRIRUFEID4gIiRET1RFU1QiL2hlYWQKKwkJZWNobyAkVVBTVFJFQU0gPiAiJERPVEVTVCIvdXBzdHJlYW0KKwkJZWNobyAkT05UTyA+ICIkRE9URVNUIi9vbnRvCisJCXRlc3QgLXogIiRTVFJBVEVHWSIgfHwgZWNobyAiJFNUUkFURUdZIiA+ICIkRE9URVNUIi9zdHJhdGVneQorCQl0ZXN0IHQgPSAiJFZFUkJPU0UiICYmIDogPiAiJERPVEVTVCIvdmVyYm9zZQorCQlpZiB0ZXN0IHQgPSAiJFBSRVNFUlZFX01FUkdFUyIKKwkJdGhlbgorCQkJIyAkUkVXUklUVEVOIGNvbnRhaW5zIGZpbGVzIGZvciBlYWNoIGNvbW1pdCB0aGF0IGlzCisJCQkjIHJlYWNoYWJsZSBieSBhdCBsZWFzdCBvbmUgbWVyZ2UgYmFzZSBvZiAkSEVBRCBhbmQKKwkJCSMgJFVQU1RSRUFNLiBUaGV5IGFyZSBub3QgbmVjZXNzYXJpbHkgcmV3cml0dGVuLCBidXQKKwkJCSMgdGhlaXIgY2hpbGRyZW4gbWlnaHQgYmUuCisJCQkjIFRoaXMgZW5zdXJlcyB0aGF0IGNvbW1pdHMgb24gbWVyZ2VkLCBidXQgb3RoZXJ3aXNlCisJCQkjIHVucmVsYXRlZCBzaWRlIGJyYW5jaGVzIGFyZSBsZWZ0IGFsb25lLiAoVGhpbmsgIlgiCisJCQkjIGluIHRoZSBtYW4gcGFnZSdzIGV4YW1wbGUuKQorCQkJbWtkaXIgIiRSRVdSSVRURU4iICYmCisJCQlmb3IgYyBpbiAkKGdpdCBtZXJnZS1iYXNlIC0tYWxsICRIRUFEICRVUFNUUkVBTSkKKwkJCWRvCisJCQkJZWNobyAkT05UTyA+ICIkUkVXUklUVEVOIi8kYyB8fAorCQkJCQlkaWUgIkNvdWxkIG5vdCBpbml0IHJld3JpdHRlbiBjb21taXRzIgorCQkJZG9uZQorCQkJTUVSR0VTX09QVElPTj0KKwkJZWxzZQorCQkJTUVSR0VTX09QVElPTj0tLW5vLW1lcmdlcworCQlmaQorCisJCVNIT1JUVVBTVFJFQU09JChnaXQgcmV2LXBhcnNlIC0tc2hvcnQgJFVQU1RSRUFNKQorCQlTSE9SVEhFQUQ9JChnaXQgcmV2LXBhcnNlIC0tc2hvcnQgJEhFQUQpCisJCVNIT1JUT05UTz0kKGdpdCByZXYtcGFyc2UgLS1zaG9ydCAkT05UTykKKwkJZ2l0IHJldi1saXN0ICRNRVJHRVNfT1BUSU9OIC0tcHJldHR5PW9uZWxpbmUgLS1hYmJyZXYtY29tbWl0IFwKKwkJCS0tYWJicmV2PTcgLS1yZXZlcnNlIC0tbGVmdC1yaWdodCAtLWNoZXJyeS1waWNrIFwKKwkJCSRVUFNUUkVBTS4uLiRIRUFEIHwgXAorCQkJc2VkIC1uICJzL14+L3BpY2sgL3AiID4gIiRUT0RPIgorCQljYXQgPj4gIiRUT0RPIiA8PCBFT0YKKworIyBSZWJhc2UgJFNIT1JUVVBTVFJFQU0uLiRTSE9SVEhFQUQgb250byAkU0hPUlRPTlRPCisjCisjIENvbW1hbmRzOgorIyAgcGljayA9IHVzZSBjb21taXQKKyMgIGVkaXQgPSB1c2UgY29tbWl0LCBidXQgc3RvcCBmb3IgYW1lbmRpbmcKKyMgIHNxdWFzaCA9IHVzZSBjb21taXQsIGJ1dCBtZWxkIGludG8gcHJldmlvdXMgY29tbWl0CisjCisjIElmIHlvdSByZW1vdmUgYSBsaW5lIGhlcmUgVEhBVCBDT01NSVQgV0lMTCBCRSBMT1NULgorIyBIb3dldmVyLCBpZiB5b3UgcmVtb3ZlIGV2ZXJ5dGhpbmcsIHRoZSByZWJhc2Ugd2lsbCBiZSBhYm9ydGVkLgorIworRU9GCisKKwkJaGFzX2FjdGlvbiAiJFRPRE8iIHx8CisJCQlkaWVfYWJvcnQgIk5vdGhpbmcgdG8gZG8iCisKKwkJY3AgIiRUT0RPIiAiJFRPRE8iLmJhY2t1cAorCQlnaXRfZWRpdG9yICIkVE9ETyIgfHwKKwkJCWRpZSAiQ291bGQgbm90IGV4ZWN1dGUgZWRpdG9yIgorCisJCWhhc19hY3Rpb24gIiRUT0RPIiB8fAorCQkJZGllX2Fib3J0ICJOb3RoaW5nIHRvIGRvIgorCisJCW91dHB1dCBnaXQgY2hlY2tvdXQgJE9OVE8gJiYgZG9fcmVzdAorCQk7OworCWVzYWMKKwlzaGlmdAorZG9uZQpkaWZmIC0tZ2l0IGEvZ2l0LXJlYmFzZS5zaCBiL2dpdC1yZWJhc2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjBjNDU4ZgotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1yZWJhc2Uuc2gKQEAgLTAsMCArMSw0MTggQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8uCisjCisKK1VTQUdFPSdbLS1pbnRlcmFjdGl2ZSB8IC1pXSBbLXZdIFstLW9udG8gPG5ld2Jhc2U+XSA8dXBzdHJlYW0+IFs8YnJhbmNoPl0nCitMT05HX1VTQUdFPSdnaXQtcmViYXNlIHJlcGxhY2VzIDxicmFuY2g+IHdpdGggYSBuZXcgYnJhbmNoIG9mIHRoZQorc2FtZSBuYW1lLiAgV2hlbiB0aGUgLS1vbnRvIG9wdGlvbiBpcyBwcm92aWRlZCB0aGUgbmV3IGJyYW5jaCBzdGFydHMKK291dCB3aXRoIGEgSEVBRCBlcXVhbCB0byA8bmV3YmFzZT4sIG90aGVyd2lzZSBpdCBpcyBlcXVhbCB0byA8dXBzdHJlYW0+CitJdCB0aGVuIGF0dGVtcHRzIHRvIGNyZWF0ZSBhIG5ldyBjb21taXQgZm9yIGVhY2ggY29tbWl0IGZyb20gdGhlIG9yaWdpbmFsCis8YnJhbmNoPiB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSA8dXBzdHJlYW0+IGJyYW5jaC4KKworSXQgaXMgcG9zc2libGUgdGhhdCBhIG1lcmdlIGZhaWx1cmUgd2lsbCBwcmV2ZW50IHRoaXMgcHJvY2VzcyBmcm9tIGJlaW5nCitjb21wbGV0ZWx5IGF1dG9tYXRpYy4gIFlvdSB3aWxsIGhhdmUgdG8gcmVzb2x2ZSBhbnkgc3VjaCBtZXJnZSBmYWlsdXJlCithbmQgcnVuIGdpdCByZWJhc2UgLS1jb250aW51ZS4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIGJ5cGFzcyB0aGUgY29tbWl0Cit0aGF0IGNhdXNlZCB0aGUgbWVyZ2UgZmFpbHVyZSB3aXRoIGdpdCByZWJhc2UgLS1za2lwLiAgVG8gcmVzdG9yZSB0aGUKK29yaWdpbmFsIDxicmFuY2g+IGFuZCByZW1vdmUgdGhlIC5kb3Rlc3Qgd29ya2luZyBmaWxlcywgdXNlIHRoZSBjb21tYW5kCitnaXQgcmViYXNlIC0tYWJvcnQgaW5zdGVhZC4KKworTm90ZSB0aGF0IGlmIDxicmFuY2g+IGlzIG5vdCBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgdGhlCitjdXJyZW50bHkgY2hlY2tlZCBvdXQgYnJhbmNoIGlzIHVzZWQuCisKK0V4YW1wbGU6ICAgICAgIGdpdC1yZWJhc2UgbWFzdGVyfjEgdG9waWMKKworICAgICAgICBBLS0tQi0tLUMgdG9waWMgICAgICAgICAgICAgICAgICAgQSdcJyctLUInXCcnLS1DJ1wnJyB0b3BpYworICAgICAgIC8gICAgICAgICAgICAgICAgICAgLS0+ICAgICAgICAgICAvCisgIEQtLS1FLS0tRi0tLUcgbWFzdGVyICAgICAgICAgIEQtLS1FLS0tRi0tLUcgbWFzdGVyCisnCisKK1NVQkRJUkVDVE9SWV9PSz1ZZXMKK09QVElPTlNfU1BFQz0KKy4gZ2l0LXNoLXNldHVwCitzZXRfcmVmbG9nX2FjdGlvbiByZWJhc2UKK3JlcXVpcmVfd29ya190cmVlCitjZF90b190b3BsZXZlbAorCitSRVNPTFZFTVNHPSIKK1doZW4geW91IGhhdmUgcmVzb2x2ZWQgdGhpcyBwcm9ibGVtIHJ1biBcImdpdCByZWJhc2UgLS1jb250aW51ZVwiLgorSWYgeW91IHdvdWxkIHByZWZlciB0byBza2lwIHRoaXMgcGF0Y2gsIGluc3RlYWQgcnVuIFwiZ2l0IHJlYmFzZSAtLXNraXBcIi4KK1RvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGJyYW5jaCBhbmQgc3RvcCByZWJhc2luZyBydW4gXCJnaXQgcmViYXNlIC0tYWJvcnRcIi4KKyIKK3Vuc2V0IG5ld2Jhc2UKK3N0cmF0ZWd5PXJlY3Vyc2l2ZQorZG9fbWVyZ2U9Citkb3Rlc3Q9JEdJVF9ESVIvLmRvdGVzdC1tZXJnZQorcHJlYz00Cit2ZXJib3NlPQorZ2l0X2FtX29wdD0KKworY29udGludWVfbWVyZ2UgKCkgeworCXRlc3QgLW4gIiRwcmV2X2hlYWQiIHx8IGRpZSAicHJldl9oZWFkIG11c3QgYmUgZGVmaW5lZCIKKwl0ZXN0IC1kICIkZG90ZXN0IiB8fCBkaWUgIiRkb3Rlc3QgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IgorCisJdW5tZXJnZWQ9JChnaXQgbHMtZmlsZXMgLXUpCisJaWYgdGVzdCAtbiAiJHVubWVyZ2VkIgorCXRoZW4KKwkJZWNobyAiWW91IHN0aWxsIGhhdmUgdW5tZXJnZWQgcGF0aHMgaW4geW91ciBpbmRleCIKKwkJZWNobyAiZGlkIHlvdSBmb3JnZXQgdG8gdXNlIGdpdCBhZGQ/IgorCQlkaWUgIiRSRVNPTFZFTVNHIgorCWZpCisKKwljbXQ9YGNhdCAiJGRvdGVzdC9jdXJyZW50ImAKKwlpZiAhIGdpdCBkaWZmLWluZGV4IC0tcXVpZXQgSEVBRCAtLQorCXRoZW4KKwkJaWYgISBnaXQgY29tbWl0IC0tbm8tdmVyaWZ5IC1DICIkY210IgorCQl0aGVuCisJCQllY2hvICJDb21taXQgZmFpbGVkLCBwbGVhc2UgZG8gbm90IGNhbGwgXCJnaXQgY29tbWl0XCIiCisJCQllY2hvICJkaXJlY3RseSwgYnV0IGluc3RlYWQgZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6ICIKKwkJCWRpZSAiJFJFU09MVkVNU0ciCisJCWZpCisJCXByaW50ZiAiQ29tbWl0dGVkOiAlMCR7cHJlY31kICIgJG1zZ251bQorCWVsc2UKKwkJcHJpbnRmICJBbHJlYWR5IGFwcGxpZWQ6ICUwJHtwcmVjfWQgIiAkbXNnbnVtCisJZmkKKwlnaXQgcmV2LWxpc3QgLS1wcmV0dHk9b25lbGluZSAtMSAiJGNtdCIgfCBzZWQgLWUgJ3MvXlteIF0qIC8vJworCisJcHJldl9oZWFkPWBnaXQgcmV2LXBhcnNlIEhFQUReMGAKKwkjIHNhdmUgdGhlIHJlc3VsdGluZyBjb21taXQgc28gd2UgY2FuIHJlYWQtdHJlZSBvbiBpdCBsYXRlcgorCWVjaG8gIiRwcmV2X2hlYWQiID4gIiRkb3Rlc3QvcHJldl9oZWFkIgorCisJIyBvbnRvIHRoZSBuZXh0IHBhdGNoOgorCW1zZ251bT0kKCgkbXNnbnVtICsgMSkpCisJZWNobyAiJG1zZ251bSIgPiIkZG90ZXN0L21zZ251bSIKK30KKworY2FsbF9tZXJnZSAoKSB7CisJY210PSIkKGNhdCAiJGRvdGVzdC9jbXQuJDEiKSIKKwllY2hvICIkY210IiA+ICIkZG90ZXN0L2N1cnJlbnQiCisJaGQ9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpCisJY210X25hbWU9JChnaXQgc3ltYm9saWMtcmVmIEhFQUQgMj4gL2Rldi9udWxsIHx8IGVjaG8gSEVBRCkKKwltc2dudW09JChjYXQgIiRkb3Rlc3QvbXNnbnVtIikKKwllbmQ9JChjYXQgIiRkb3Rlc3QvZW5kIikKKwlldmFsIEdJVEhFQURfJGNtdD0nIiR7Y210X25hbWUjI3JlZnMvaGVhZHMvfX4kKCgkZW5kIC0gJG1zZ251bSkpIicKKwlldmFsIEdJVEhFQURfJGhkPSckKGNhdCAiJGRvdGVzdC9vbnRvX25hbWUiKScKKwlleHBvcnQgR0lUSEVBRF8kY210IEdJVEhFQURfJGhkCisJZ2l0LW1lcmdlLSRzdHJhdGVneSAiJGNtdF4iIC0tICIkaGQiICIkY210IgorCXJ2PSQ/CisJY2FzZSAiJHJ2IiBpbgorCTApCisJCXVuc2V0IEdJVEhFQURfJGNtdCBHSVRIRUFEXyRoZAorCQlyZXR1cm4KKwkJOzsKKwkxKQorCQlnaXQgcmVyZXJlCisJCWRpZSAiJFJFU09MVkVNU0ciCisJCTs7CisJMikKKwkJZWNobyAiU3RyYXRlZ3k6ICRydiAkc3RyYXRlZ3kgZmFpbGVkLCB0cnkgYW5vdGhlciIgMT4mMgorCQlkaWUgIiRSRVNPTFZFTVNHIgorCQk7OworCSopCisJCWRpZSAiVW5rbm93biBleGl0IGNvZGUgKCRydikgZnJvbSBjb21tYW5kOiIgXAorCQkJImdpdC1tZXJnZS0kc3RyYXRlZ3kgJGNtdF4gLS0gSEVBRCAkY210IgorCQk7OworCWVzYWMKK30KKworbW92ZV90b19vcmlnaW5hbF9icmFuY2ggKCkgeworCXRlc3QgLXogIiRoZWFkX25hbWUiICYmCisJCWhlYWRfbmFtZT0iJChjYXQgIiRkb3Rlc3QiL2hlYWQtbmFtZSkiICYmCisJCW9udG89IiQoY2F0ICIkZG90ZXN0Ii9vbnRvKSIgJiYKKwkJb3JpZ19oZWFkPSIkKGNhdCAiJGRvdGVzdCIvb3JpZy1oZWFkKSIKKwljYXNlICIkaGVhZF9uYW1lIiBpbgorCXJlZnMvKikKKwkJbWVzc2FnZT0icmViYXNlIGZpbmlzaGVkOiAkaGVhZF9uYW1lIG9udG8gJG9udG8iCisJCWdpdCB1cGRhdGUtcmVmIC1tICIkbWVzc2FnZSIgXAorCQkJJGhlYWRfbmFtZSAkKGdpdCByZXYtcGFyc2UgSEVBRCkgJG9yaWdfaGVhZCAmJgorCQlnaXQgc3ltYm9saWMtcmVmIEhFQUQgJGhlYWRfbmFtZSB8fAorCQlkaWUgIkNvdWxkIG5vdCBtb3ZlIGJhY2sgdG8gJGhlYWRfbmFtZSIKKwkJOzsKKwllc2FjCit9CisKK2ZpbmlzaF9yYl9tZXJnZSAoKSB7CisJbW92ZV90b19vcmlnaW5hbF9icmFuY2gKKwlybSAtciAiJGRvdGVzdCIKKwllY2hvICJBbGwgZG9uZS4iCit9CisKK2lzX2ludGVyYWN0aXZlICgpIHsKKwl0ZXN0IC1mICIkZG90ZXN0Ii9pbnRlcmFjdGl2ZSB8fAorCXdoaWxlIDo7IGRvIGNhc2UgJCMsIiQxIiBpbiAwLHwqLC1pfCosLS1pbnRlcmFjdGl2ZSkgYnJlYWsgOzsgZXNhYworCQlzaGlmdAorCWRvbmUgJiYgdGVzdCAtbiAiJDEiCit9CisKK2lzX2ludGVyYWN0aXZlICIkQCIgJiYgZXhlYyBnaXQtcmViYXNlLS1pbnRlcmFjdGl2ZSAiJEAiCisKK3doaWxlIHRlc3QgJCMgIT0gMAorZG8KKwljYXNlICIkMSIgaW4KKwktLWNvbnRpbnVlKQorCQlnaXQgZGlmZi1maWxlcyAtLXF1aWV0IHx8IHsKKwkJCWVjaG8gIllvdSBtdXN0IGVkaXQgYWxsIG1lcmdlIGNvbmZsaWN0cyBhbmQgdGhlbiIKKwkJCWVjaG8gIm1hcmsgdGhlbSBhcyByZXNvbHZlZCB1c2luZyBnaXQgYWRkIgorCQkJZXhpdCAxCisJCX0KKwkJaWYgdGVzdCAtZCAiJGRvdGVzdCIKKwkJdGhlbgorCQkJcHJldl9oZWFkPSQoY2F0ICIkZG90ZXN0L3ByZXZfaGVhZCIpCisJCQllbmQ9JChjYXQgIiRkb3Rlc3QvZW5kIikKKwkJCW1zZ251bT0kKGNhdCAiJGRvdGVzdC9tc2dudW0iKQorCQkJb250bz0kKGNhdCAiJGRvdGVzdC9vbnRvIikKKwkJCWNvbnRpbnVlX21lcmdlCisJCQl3aGlsZSB0ZXN0ICIkbXNnbnVtIiAtbGUgIiRlbmQiCisJCQlkbworCQkJCWNhbGxfbWVyZ2UgIiRtc2dudW0iCisJCQkJY29udGludWVfbWVyZ2UKKwkJCWRvbmUKKwkJCWZpbmlzaF9yYl9tZXJnZQorCQkJZXhpdAorCQlmaQorCQloZWFkX25hbWU9JChjYXQgLmRvdGVzdC9oZWFkLW5hbWUpICYmCisJCW9udG89JChjYXQgLmRvdGVzdC9vbnRvKSAmJgorCQlvcmlnX2hlYWQ9JChjYXQgLmRvdGVzdC9vcmlnLWhlYWQpICYmCisJCWdpdCBhbSAtLXJlc29sdmVkIC0tM3dheSAtLXJlc29sdmVtc2c9IiRSRVNPTFZFTVNHIiAmJgorCQltb3ZlX3RvX29yaWdpbmFsX2JyYW5jaAorCQlleGl0CisJCTs7CisJLS1za2lwKQorCQlnaXQgcmVzZXQgLS1oYXJkIEhFQUQgfHwgZXhpdCAkPworCQlpZiB0ZXN0IC1kICIkZG90ZXN0IgorCQl0aGVuCisJCQlnaXQgcmVyZXJlIGNsZWFyCisJCQlwcmV2X2hlYWQ9JChjYXQgIiRkb3Rlc3QvcHJldl9oZWFkIikKKwkJCWVuZD0kKGNhdCAiJGRvdGVzdC9lbmQiKQorCQkJbXNnbnVtPSQoY2F0ICIkZG90ZXN0L21zZ251bSIpCisJCQltc2dudW09JCgoJG1zZ251bSArIDEpKQorCQkJb250bz0kKGNhdCAiJGRvdGVzdC9vbnRvIikKKwkJCXdoaWxlIHRlc3QgIiRtc2dudW0iIC1sZSAiJGVuZCIKKwkJCWRvCisJCQkJY2FsbF9tZXJnZSAiJG1zZ251bSIKKwkJCQljb250aW51ZV9tZXJnZQorCQkJZG9uZQorCQkJZmluaXNoX3JiX21lcmdlCisJCQlleGl0CisJCWZpCisJCWhlYWRfbmFtZT0kKGNhdCAuZG90ZXN0L2hlYWQtbmFtZSkgJiYKKwkJb250bz0kKGNhdCAuZG90ZXN0L29udG8pICYmCisJCW9yaWdfaGVhZD0kKGNhdCAuZG90ZXN0L29yaWctaGVhZCkgJiYKKwkJZ2l0IGFtIC0zIC0tc2tpcCAtLXJlc29sdmVtc2c9IiRSRVNPTFZFTVNHIiAmJgorCQltb3ZlX3RvX29yaWdpbmFsX2JyYW5jaAorCQlleGl0CisJCTs7CisJLS1hYm9ydCkKKwkJZ2l0IHJlcmVyZSBjbGVhcgorCQlpZiB0ZXN0IC1kICIkZG90ZXN0IgorCQl0aGVuCisJCQltb3ZlX3RvX29yaWdpbmFsX2JyYW5jaAorCQllbGlmIHRlc3QgLWQgLmRvdGVzdAorCQl0aGVuCisJCQlkb3Rlc3Q9LmRvdGVzdAorCQkJbW92ZV90b19vcmlnaW5hbF9icmFuY2gKKwkJZWxzZQorCQkJZGllICJObyByZWJhc2UgaW4gcHJvZ3Jlc3M/IgorCQlmaQorCQlnaXQgcmVzZXQgLS1oYXJkICQoY2F0ICRkb3Rlc3Qvb3JpZy1oZWFkKQorCQlybSAtciAiJGRvdGVzdCIKKwkJZXhpdAorCQk7OworCS0tb250bykKKwkJdGVzdCAyIC1sZSAiJCMiIHx8IHVzYWdlCisJCW5ld2Jhc2U9IiQyIgorCQlzaGlmdAorCQk7OworCS1NfC1tfC0tbXwtLW1lfC0tbWVyfC0tbWVyZ3wtLW1lcmdlKQorCQlkb19tZXJnZT10CisJCTs7CisJLXM9KnwtLXM9KnwtLXN0PSp8LS1zdHI9KnwtLXN0cmE9KnwtLXN0cmF0PSp8LS1zdHJhdGU9KnxcCisJCS0tc3RyYXRlZz0qfC0tc3RyYXRlZ3k9KnxcCisJLXN8LS1zfC0tc3R8LS1zdHJ8LS1zdHJhfC0tc3RyYXR8LS1zdHJhdGV8LS1zdHJhdGVnfC0tc3RyYXRlZ3kpCisJCWNhc2UgIiQjLCQxIiBpbgorCQkqLCo9KikKKwkJCXN0cmF0ZWd5PWBleHByICJ6JDEiIDogJ3otW149XSo9XCguKlwpJ2AgOzsKKwkJMSwqKQorCQkJdXNhZ2UgOzsKKwkJKikKKwkJCXN0cmF0ZWd5PSIkMiIKKwkJCXNoaWZ0IDs7CisJCWVzYWMKKwkJZG9fbWVyZ2U9dAorCQk7OworCS12fC0tdmVyYm9zZSkKKwkJdmVyYm9zZT10CisJCTs7CisJLS13aGl0ZXNwYWNlPSopCisJCWdpdF9hbV9vcHQ9IiRnaXRfYW1fb3B0ICQxIgorCQk7OworCS1DKikKKwkJZ2l0X2FtX29wdD0iJGdpdF9hbV9vcHQgJDEiCisJCTs7CisJLSopCisJCXVzYWdlCisJCTs7CisJKikKKwkJYnJlYWsKKwkJOzsKKwllc2FjCisJc2hpZnQKK2RvbmUKKworIyBNYWtlIHN1cmUgd2UgZG8gbm90IGhhdmUgLmRvdGVzdAoraWYgdGVzdCAteiAiJGRvX21lcmdlIgordGhlbgorCWlmIG1rZGlyIC5kb3Rlc3QKKwl0aGVuCisJCXJtZGlyIC5kb3Rlc3QKKwllbHNlCisJCWVjaG8gPiYyICcKK0l0IHNlZW1zIHRoYXQgSSBjYW5ub3QgY3JlYXRlIGEgLmRvdGVzdCBkaXJlY3RvcnksIGFuZCBJIHdvbmRlciBpZiB5b3UKK2FyZSBpbiB0aGUgbWlkZGxlIG9mIHBhdGNoIGFwcGxpY2F0aW9uIG9yIGFub3RoZXIgcmViYXNlLiAgSWYgdGhhdCBpcyBub3QKK3RoZSBjYXNlLCBwbGVhc2Ugcm0gLWZyIC5kb3Rlc3QgYW5kIHJ1biBtZSBhZ2Fpbi4gIEkgYW0gc3RvcHBpbmcgaW4gY2FzZQoreW91IHN0aWxsIGhhdmUgc29tZXRoaW5nIHZhbHVhYmxlIHRoZXJlLicKKwkJZXhpdCAxCisJZmkKK2Vsc2UKKwlpZiB0ZXN0IC1kICIkZG90ZXN0IgorCXRoZW4KKwkJZGllICJwcmV2aW91cyBkb3Rlc3QgZGlyZWN0b3J5ICRkb3Rlc3Qgc3RpbGwgZXhpc3RzLiIgXAorCQkJJ3RyeSBnaXQtcmViYXNlIDwgLS1jb250aW51ZSB8IC0tYWJvcnQgPicKKwlmaQorZmkKKworIyBUaGUgdHJlZSBtdXN0IGJlIHJlYWxseSByZWFsbHkgY2xlYW4uCitnaXQgdXBkYXRlLWluZGV4IC0tcmVmcmVzaCB8fCBleGl0CitkaWZmPSQoZ2l0IGRpZmYtaW5kZXggLS1jYWNoZWQgLS1uYW1lLXN0YXR1cyAtciBIRUFEIC0tKQorY2FzZSAiJGRpZmYiIGluCis/KikJZWNobyAiY2Fubm90IHJlYmFzZTogeW91ciBpbmRleCBpcyBub3QgdXAtdG8tZGF0ZSIKKwllY2hvICIkZGlmZiIKKwlleGl0IDEKKwk7OworZXNhYworCisjIFRoZSB1cHN0cmVhbSBoZWFkIG11c3QgYmUgZ2l2ZW4uICBNYWtlIHN1cmUgaXQgaXMgdmFsaWQuCit1cHN0cmVhbV9uYW1lPSIkMSIKK3Vwc3RyZWFtPWBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5ICIke3Vwc3RyZWFtX25hbWV9XjAiYCB8fAorICAgIGRpZSAiaW52YWxpZCB1cHN0cmVhbSAkdXBzdHJlYW1fbmFtZSIKKworIyBNYWtlIHN1cmUgdGhlIGJyYW5jaCB0byByZWJhc2Ugb250byBpcyB2YWxpZC4KK29udG9fbmFtZT0ke25ld2Jhc2UtIiR1cHN0cmVhbV9uYW1lIn0KK29udG89JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5ICIke29udG9fbmFtZX1eMCIpIHx8IGV4aXQKKworIyBJZiBhIGhvb2sgZXhpc3RzLCBnaXZlIGl0IGEgY2hhbmNlIHRvIGludGVycnVwdAoraWYgdGVzdCAteCAiJEdJVF9ESVIvaG9va3MvcHJlLXJlYmFzZSIKK3RoZW4KKwkiJEdJVF9ESVIvaG9va3MvcHJlLXJlYmFzZSIgJHsxKyIkQCJ9IHx8IHsKKwkJZWNobyA+JjIgIlRoZSBwcmUtcmViYXNlIGhvb2sgcmVmdXNlZCB0byByZWJhc2UuIgorCQlleGl0IDEKKwl9CitmaQorCisjIElmIHRoZSBicmFuY2ggdG8gcmViYXNlIGlzIGdpdmVuLCBmaXJzdCBzd2l0Y2ggdG8gaXQuCitjYXNlICIkIyIgaW4KKzIpCisJYnJhbmNoX25hbWU9IiQyIgorCWdpdC1jaGVja291dCAiJDIiIHx8IHVzYWdlCisJOzsKKyopCisJaWYgYnJhbmNoX25hbWU9YGdpdCBzeW1ib2xpYy1yZWYgLXEgSEVBRGAKKwl0aGVuCisJCWJyYW5jaF9uYW1lPWBleHByICJ6JGJyYW5jaF9uYW1lIiA6ICd6cmVmcy9oZWFkcy9cKC4qXCknYAorCWVsc2UKKwkJYnJhbmNoX25hbWU9SEVBRCA7IyBkZXRhY2hlZAorCWZpCisJOzsKK2VzYWMKK2JyYW5jaD0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgIiR7YnJhbmNoX25hbWV9XjAiKSB8fCBleGl0CisKKyMgTm93IHdlIGFyZSByZWJhc2luZyBjb21taXRzICR1cHN0cmVhbS4uJGJyYW5jaCBvbiB0b3Agb2YgJG9udG8KKworIyBDaGVjayBpZiB3ZSBhcmUgYWxyZWFkeSBiYXNlZCBvbiAkb250byB3aXRoIGxpbmVhciBoaXN0b3J5LAorIyBidXQgdGhpcyBzaG91bGQgYmUgZG9uZSBvbmx5IHdoZW4gdXBzdHJlYW0gYW5kIG9udG8gYXJlIHRoZSBzYW1lLgorbWI9JChnaXQgbWVyZ2UtYmFzZSAiJG9udG8iICIkYnJhbmNoIikKK2lmIHRlc3QgIiR1cHN0cmVhbSIgPSAiJG9udG8iICYmIHRlc3QgIiRtYiIgPSAiJG9udG8iICYmCisJIyBsaW5lYXIgaGlzdG9yeT8KKwkhIGdpdCByZXYtbGlzdCAtLXBhcmVudHMgIiRvbnRvIi4uIiRicmFuY2giIHwgZ3JlcCAiIC4qICIgPiAvZGV2L251bGwKK3RoZW4KKwllY2hvID4mMiAiQ3VycmVudCBicmFuY2ggJGJyYW5jaF9uYW1lIGlzIHVwIHRvIGRhdGUuIgorCWV4aXQgMAorZmkKKworaWYgdGVzdCAtbiAiJHZlcmJvc2UiCit0aGVuCisJZWNobyAiQ2hhbmdlcyBmcm9tICRtYiB0byAkb250bzoiCisJIyBXZSB3YW50IGNvbG9yIChpZiBzZXQpLCBidXQgbm8gcGFnZXIKKwlHSVRfUEFHRVI9JycgZ2l0IGRpZmYgLS1zdGF0IC0tc3VtbWFyeSAiJG1iIiAiJG9udG8iCitmaQorCisjIG1vdmUgdG8gYSBkZXRhY2hlZCBIRUFECitvcmlnX2hlYWQ9JChnaXQgcmV2LXBhcnNlIEhFQUReMCkKK2hlYWRfbmFtZT0kKGdpdCBzeW1ib2xpYy1yZWYgSEVBRCAyPiAvZGV2L251bGwpCitjYXNlICIkaGVhZF9uYW1lIiBpbgorJycpCisJaGVhZF9uYW1lPSJkZXRhY2hlZCBIRUFEIgorCTs7CisqKQorCWdpdCBjaGVja291dCAiJG9yaWdfaGVhZCIgPiAvZGV2L251bGwgMj4mMSB8fAorCQlkaWUgImNvdWxkIG5vdCBkZXRhY2ggSEVBRCIKKwk7OworZXNhYworCisjIFJld2luZCB0aGUgaGVhZCB0byAiJG9udG8iOyB0aGlzIHNhdmVzIG91ciBjdXJyZW50IGhlYWQgaW4gT1JJR19IRUFELgorZWNobyAiRmlyc3QsIHJld2luZGluZyBoZWFkIHRvIHJlcGxheSB5b3VyIHdvcmsgb24gdG9wIG9mIGl0Li4uIgorZ2l0LXJlc2V0IC0taGFyZCAiJG9udG8iCisKKyMgSWYgdGhlICRvbnRvIGlzIGEgcHJvcGVyIGRlc2NlbmRhbnQgb2YgdGhlIHRpcCBvZiB0aGUgYnJhbmNoLCB0aGVuCisjIHdlIGp1c3QgZmFzdCBmb3J3YXJkZWQuCitpZiB0ZXN0ICIkbWIiID0gIiRicmFuY2giCit0aGVuCisJZWNobyA+JjIgIkZhc3QtZm9yd2FyZGVkICRicmFuY2hfbmFtZSB0byAkb250b19uYW1lLiIKKwltb3ZlX3RvX29yaWdpbmFsX2JyYW5jaAorCWV4aXQgMAorZmkKKworaWYgdGVzdCAteiAiJGRvX21lcmdlIgordGhlbgorCWdpdCBmb3JtYXQtcGF0Y2ggLWsgLS1zdGRvdXQgLS1mdWxsLWluZGV4IC0taWdub3JlLWlmLWluLXVwc3RyZWFtICIkdXBzdHJlYW0iLi5PUklHX0hFQUQgfAorCWdpdCBhbSAkZ2l0X2FtX29wdCAtLXJlYmFzaW5nIC0tcmVzb2x2ZW1zZz0iJFJFU09MVkVNU0ciICYmCisJbW92ZV90b19vcmlnaW5hbF9icmFuY2gKKwlyZXQ9JD8KKwl0ZXN0IDAgIT0gJHJldCAtYSAtZCAuZG90ZXN0ICYmCisJCWVjaG8gJGhlYWRfbmFtZSA+IC5kb3Rlc3QvaGVhZC1uYW1lICYmCisJCWVjaG8gJG9udG8gPiAuZG90ZXN0L29udG8gJiYKKwkJZWNobyAkb3JpZ19oZWFkID4gLmRvdGVzdC9vcmlnLWhlYWQKKwlleGl0ICRyZXQKK2ZpCisKKyMgc3RhcnQgZG9pbmcgYSByZWJhc2Ugd2l0aCBnaXQtbWVyZ2UKKyMgdGhpcyBpcyByZW5hbWUtYXdhcmUgaWYgdGhlIHJlY3Vyc2l2ZSAoZGVmYXVsdCkgc3RyYXRlZ3kgaXMgdXNlZAorCitta2RpciAtcCAiJGRvdGVzdCIKK2VjaG8gIiRvbnRvIiA+ICIkZG90ZXN0L29udG8iCitlY2hvICIkb250b19uYW1lIiA+ICIkZG90ZXN0L29udG9fbmFtZSIKK3ByZXZfaGVhZD0kb3JpZ19oZWFkCitlY2hvICIkcHJldl9oZWFkIiA+ICIkZG90ZXN0L3ByZXZfaGVhZCIKK2VjaG8gIiRvcmlnX2hlYWQiID4gIiRkb3Rlc3Qvb3JpZy1oZWFkIgorZWNobyAiJGhlYWRfbmFtZSIgPiAiJGRvdGVzdC9oZWFkLW5hbWUiCisKK21zZ251bT0wCitmb3IgY210IGluIGBnaXQgcmV2LWxpc3QgLS1yZXZlcnNlIC0tbm8tbWVyZ2VzICIkdXBzdHJlYW0iLi5PUklHX0hFQURgCitkbworCW1zZ251bT0kKCgkbXNnbnVtICsgMSkpCisJZWNobyAiJGNtdCIgPiAiJGRvdGVzdC9jbXQuJG1zZ251bSIKK2RvbmUKKworZWNobyAxID4iJGRvdGVzdC9tc2dudW0iCitlY2hvICRtc2dudW0gPiIkZG90ZXN0L2VuZCIKKworZW5kPSRtc2dudW0KK21zZ251bT0xCisKK3doaWxlIHRlc3QgIiRtc2dudW0iIC1sZSAiJGVuZCIKK2RvCisJY2FsbF9tZXJnZSAiJG1zZ251bSIKKwljb250aW51ZV9tZXJnZQorZG9uZQorCitmaW5pc2hfcmJfbWVyZ2UKZGlmZiAtLWdpdCBhL2dpdC1yZWxpbmsucGVybCBiL2dpdC1yZWxpbmsucGVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNWZiOTMyCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LXJlbGluay5wZXJsCkBAIC0wLDAgKzEsMTczIEBACisjIS91c3IvYmluL2VudiBwZXJsCisjIENvcHlyaWdodCAyMDA1LCBSeWFuIEFuZGVyc29uIDxyeWFuQG1pY2hvbmxpbmUuY29tPgorIyBEaXN0cmlidXRpb24gcGVybWl0dGVkIHVuZGVyIHRoZSBHUEwgdjIsIGFzIGRpc3RyaWJ1dGVkCisjIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjIExhdGVyIHZlcnNpb25zIG9mIHRoZSBHUEwgYXQgdGhlIGRpc2NyZXRpb24gb2YgTGludXMgVG9ydmFsZHMKKyMKKyMgU2NhbiB0d28gZ2l0IG9iamVjdC10cmVlcywgYW5kIGhhcmRsaW5rIGFueSBjb21tb24gb2JqZWN0cyBiZXR3ZWVuIHRoZW0uCisKK3VzZSA1LjAwNjsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgR2V0b3B0OjpMb25nOworCitzdWIgZ2V0X2Nhbm9uaWNhbF9mb3JtKCQpOworc3ViIGRvX3NjYW5fZGlyZWN0b3J5KCQkJCk7CitzdWIgY29tcGFyZV90d29fZmlsZXMoJCQpOworc3ViIHVzYWdlKCk7CitzdWIgbGlua190d29fZmlsZXMoJCQpOworCisjIHN0YXRzCitteSAkdG90YWxfbGlua2VkID0gMDsKK215ICR0b3RhbF9hbHJlYWR5ID0gMDsKK215ICgkbGlua2VkLCRhbHJlYWR5KTsKKworbXkgJGZhaWxfb25fZGlmZmVyZW50X3NpemVzID0gMDsKK215ICRoZWxwID0gMDsKK0dldE9wdGlvbnMoInNhZmUiID0+IFwkZmFpbF9vbl9kaWZmZXJlbnRfc2l6ZXMsCisJICAgImhlbHAiID0+IFwkaGVscCk7CisKK3VzYWdlKCkgaWYgJGhlbHA7CisKK215IChAZGlycykgPSBAQVJHVjsKKwordXNhZ2UoKSBpZiAoIWRlZmluZWQgJGRpcnNbMF0gfHwgIWRlZmluZWQgJGRpcnNbMV0pOworCiskXyA9IGdldF9jYW5vbmljYWxfZm9ybSgkXykgZm9yZWFjaCAoQGRpcnMpOworCitteSAkbWFzdGVyX2RpciA9IHBvcCBAZGlyczsKKworb3BlbmRpcihELCRtYXN0ZXJfZGlyIC4gIm9iamVjdHMvIikKKwlvciBkaWUgIkZhaWxlZCB0byBvcGVuICRtYXN0ZXJfZGlyL29iamVjdHMvIDogJCEiOworCitteSBAaGFzaGRpcnMgPSBncmVwIHsgKCRfIGVxICdwYWNrJykgfHwgL15bMC05YS1mXXsyfSQvIH0gcmVhZGRpcihEKTsKKworZm9yZWFjaCBteSAkcmVwbyAoQGRpcnMpIHsKKwkkbGlua2VkID0gMDsKKwkkYWxyZWFkeSA9IDA7CisJcHJpbnRmKCJTZWFyY2hpbmcgJyVzJyBhbmQgJyVzJyBmb3IgY29tbW9uIG9iamVjdHMgYW5kIGhhcmRsaW5raW5nIHRoZW0uLi5cbiIsCisJCSRtYXN0ZXJfZGlyLCRyZXBvKTsKKworCWZvcmVhY2ggbXkgJGhhc2hkaXIgKEBoYXNoZGlycykgeworCQlkb19zY2FuX2RpcmVjdG9yeSgkbWFzdGVyX2RpciwgJGhhc2hkaXIsICRyZXBvKTsKKwl9CisKKwlwcmludGYoIkxpbmtlZCAlZCBmaWxlcywgJWQgd2VyZSBhbHJlYWR5IGxpbmtlZC5cbiIsJGxpbmtlZCwgJGFscmVhZHkpOworCisJJHRvdGFsX2xpbmtlZCArPSAkbGlua2VkOworCSR0b3RhbF9hbHJlYWR5ICs9ICRhbHJlYWR5OworfQorCitwcmludGYoIlRvdGFsczogTGlua2VkICVkIGZpbGVzLCAlZCB3ZXJlIGFscmVhZHkgbGlua2VkLlxuIiwKKwkkdG90YWxfbGlua2VkLCAkdG90YWxfYWxyZWFkeSk7CisKKworc3ViIGRvX3NjYW5fZGlyZWN0b3J5KCQkJCkgeworCW15ICgkc3JjZGlyLCAkc3ViZGlyLCAkZHN0ZGlyKSA9IEBfOworCisJbXkgJHNmdWxsZGlyID0gc3ByaW50ZigiJXNvYmplY3RzLyVzLyIsJHNyY2Rpciwkc3ViZGlyKTsKKwlteSAkZGZ1bGxkaXIgPSBzcHJpbnRmKCIlc29iamVjdHMvJXMvIiwkZHN0ZGlyLCRzdWJkaXIpOworCisJb3BlbmRpcihTLCRzZnVsbGRpcikKKwkJb3IgZGllICJGYWlsZWQgdG8gb3BlbmRpciAkc2Z1bGxkaXI6ICQhIjsKKworCWZvcmVhY2ggbXkgJGZpbGUgKGdyZXAoIS9cLnsxLDJ9JC8sIHJlYWRkaXIoUykpKSB7CisJCW15ICRzZmlsZW5hbWUgPSAkc2Z1bGxkaXIgLiAkZmlsZTsKKwkJbXkgJGRmaWxlbmFtZSA9ICRkZnVsbGRpciAuICRmaWxlOworCisJCWNvbXBhcmVfdHdvX2ZpbGVzKCRzZmlsZW5hbWUsJGRmaWxlbmFtZSk7CisKKwl9CisJY2xvc2VkaXIoUyk7Cit9CisKK3N1YiBjb21wYXJlX3R3b19maWxlcygkJCkgeworCW15ICgkc2ZpbGVuYW1lLCAkZGZpbGVuYW1lKSA9IEBfOworCisJIyBQZXJsJ3Mgc3RhdCByZXR1cm5zIHJlbGV2YW50IGluZm9ybWF0aW9uIGFzIGZvbGxvd3M6CisJIyAwID0gZGV2IG51bWJlcgorCSMgMSA9IGlub2RlIG51bWJlcgorCSMgNyA9IHNpemUKKwlteSBAc3N0YXRpbmZvID0gc3RhdCgkc2ZpbGVuYW1lKTsKKwlteSBAZHN0YXRpbmZvID0gc3RhdCgkZGZpbGVuYW1lKTsKKworCWlmIChAc3N0YXRpbmZvID09IDAgJiYgQGRzdGF0aW5mbyA9PSAwKSB7CisJCWRpZSBzcHJpbnRmKCJTdGF0IG9mIGJvdGggJXMgYW5kICVzIGZhaWxlZDogJXNcbiIsJHNmaWxlbmFtZSwgJGRmaWxlbmFtZSwgJCEpOworCisJfSBlbHNpZiAoQGRzdGF0aW5mbyA9PSAwKSB7CisJCXJldHVybjsKKwl9CisKKwlpZiAoICgkc3N0YXRpbmZvWzBdID09ICRkc3RhdGluZm9bMF0pICYmCisJICAgICAoJHNzdGF0aW5mb1sxXSAhPSAkZHN0YXRpbmZvWzFdKSkgeworCQlpZiAoJHNzdGF0aW5mb1s3XSA9PSAkZHN0YXRpbmZvWzddKSB7CisJCQlsaW5rX3R3b19maWxlcygkc2ZpbGVuYW1lLCAkZGZpbGVuYW1lKTsKKworCQl9IGVsc2UgeworCQkJbXkgJGVyciA9IHNwcmludGYoIkVSUk9SOiBGaWxlIHNpemVzIGFyZSBub3QgdGhlIHNhbWUsIGNhbm5vdCByZWxpbmsgJXMgdG8gJXMuXG4iLAorCQkJCSRzZmlsZW5hbWUsICRkZmlsZW5hbWUpOworCQkJaWYgKCRmYWlsX29uX2RpZmZlcmVudF9zaXplcykgeworCQkJCWRpZSAkZXJyOworCQkJfSBlbHNlIHsKKwkJCQl3YXJuICRlcnI7CisJCQl9CisJCX0KKworCX0gZWxzaWYgKCAoJHNzdGF0aW5mb1swXSA9PSAkZHN0YXRpbmZvWzBdKSAmJgorCSAgICAgKCRzc3RhdGluZm9bMV0gPT0gJGRzdGF0aW5mb1sxXSkpIHsKKwkJJGFscmVhZHkrKzsKKwl9Cit9CisKK3N1YiBnZXRfY2Fub25pY2FsX2Zvcm0oJCkgeworCW15ICRkaXIgPSBzaGlmdDsKKwlteSAkb3JpZ2luYWwgPSAkZGlyOworCisJZGllICIkZGlyIGlzIG5vdCBhIGRpcmVjdG9yeS4iIHVubGVzcyAtZCAkZGlyOworCisJJGRpciAuPSAiLyIgdW5sZXNzICRkaXIgPX4gbSMvJCM7CisJJGRpciAuPSAiLmdpdC8iIHVubGVzcyAkZGlyID1+IG0jXC5naXQvJCM7CisKKwlkaWUgIiRvcmlnaW5hbCBkb2VzIG5vdCBoYXZlIGEgLmdpdC8gc3ViZGlyZWN0b3J5LlxuIiB1bmxlc3MgLWQgJGRpcjsKKworCXJldHVybiAkZGlyOworfQorCitzdWIgbGlua190d29fZmlsZXMoJCQpIHsKKwlteSAoJHNmaWxlbmFtZSwgJGRmaWxlbmFtZSkgPSBAXzsKKwlteSAkdG1wZG5hbWUgPSBzcHJpbnRmKCIlcy5vbGQiLCRkZmlsZW5hbWUpOworCXJlbmFtZSgkZGZpbGVuYW1lLCR0bXBkbmFtZSkKKwkJb3IgZGllIHNwcmludGYoIkZhaWx1cmUgcmVuYW1pbmcgJXMgdG8gJXM6ICVzIiwKKwkJCSRkZmlsZW5hbWUsICR0bXBkbmFtZSwgJCEpOworCisJaWYgKCEgbGluaygkc2ZpbGVuYW1lLCRkZmlsZW5hbWUpKSB7CisJCW15ICRmYWlsdHh0ID0gIiI7CisJCXVubGVzcyAocmVuYW1lKCR0bXBkbmFtZSwkZGZpbGVuYW1lKSkgeworCQkJJGZhaWx0eHQgPSBzcHJpbnRmKAorCQkJCSJHaXQgUmVwb3NpdG9yeSBjb250YWluaW5nICVzIGlzIHByb2JhYmx5IGNvcnJ1cHRlZCwgIiAuCisJCQkJInBsZWFzZSBjb3B5ICclcycgdG8gJyVzJyB0byBmaXguXG4iLAorCQkJCSR0bXBkbmFtZSwgJGRmaWxlbmFtZSk7CisJCX0KKworCQlkaWUgc3ByaW50ZigiRmFpbGVkIHRvIGxpbmsgJXMgdG8gJXM6ICVzXG4lcyIgLgorCQkJJHNmaWxlbmFtZSwgJGRmaWxlbmFtZSwKKwkJCSQhLCAkZGZpbGVuYW1lLCAkZmFpbHR4dCk7CisJfQorCisJdW5saW5rKCR0bXBkbmFtZSkKKwkJb3IgZGllIHNwcmludGYoIlVubGluayBvZiAlcyBmYWlsZWQ6ICVzXG4iLAorCQkJJGRmaWxlbmFtZSwgJCEpOworCisJJGxpbmtlZCsrOworfQorCisKK3N1YiB1c2FnZSgpIHsKKwlwcmludCgiVXNhZ2U6ICQwIFstLXNhZmVdIDxkaXI+IFs8ZGlyPiAuLi5dIDxtYXN0ZXJfZGlyPiBcbiIpOworCXByaW50KCJBbGwgZGlyZWN0b3JpZXMgc2hvdWxkIGNvbnRhaW4gYSAuZ2l0L29iamVjdHMvIHN1YmRpcmVjdG9yeS5cbiIpOworCXByaW50KCJPcHRpb25zXG4iKTsKKwlwcmludCgiXHQtLXNhZmVcdCIgLgorCQkiU3RvcHMgaWYgdHdvIG9iamVjdHMgd2l0aCB0aGUgc2FtZSBoYXNoIGV4aXN0IGJ1dCAiIC4KKwkJImhhdmUgZGlmZmVyZW50IHNpemVzLiAgRGVmYXVsdCBpcyB0byB3YXJuIGFuZCBjb250aW51ZS5cbiIpOworCWV4aXQoMSk7Cit9CmRpZmYgLS1naXQgYS9naXQtcmVwYWNrLnNoIGIvZ2l0LXJlcGFjay5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMThlYjNmCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LXJlcGFjay5zaApAQCAtMCwwICsxLDE0NCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBMaW51cyBUb3J2YWxkcworIworCitPUFRJT05TX0tFRVBEQVNIREFTSD0KK09QVElPTlNfU1BFQz0iXAorZ2l0LXJlcGFjayBbb3B0aW9uc10KKy0tCithICAgICAgICAgICAgICAgcGFjayBldmVyeXRoaW5nIGluIGEgc2luZ2xlIHBhY2sKK0EgICAgICAgICAgICAgICBzYW1lIGFzIC1hLCBhbmQga2VlcCB1bnJlYWNoYWJsZSBvYmplY3RzIHRvbworZCAgICAgICAgICAgICAgIHJlbW92ZSByZWR1bmRhbnQgcGFja3MsIGFuZCBydW4gZ2l0LXBydW5lLXBhY2tlZAorZiAgICAgICAgICAgICAgIHBhc3MgLS1uby1yZXVzZS1kZWx0YSB0byBnaXQtcGFjay1vYmplY3RzCitxLHF1aWV0ICAgICAgICAgYmUgcXVpZXQKK2wgICAgICAgICAgICAgICBwYXNzIC0tbG9jYWwgdG8gZ2l0LXBhY2stb2JqZWN0cworIFBhY2tpbmcgY29uc3RyYWludHMKK3dpbmRvdz0gICAgICAgICBzaXplIG9mIHRoZSB3aW5kb3cgdXNlZCBmb3IgZGVsdGEgY29tcHJlc3Npb24KK3dpbmRvdy1tZW1vcnk9ICBzYW1lIGFzIHRoZSBhYm92ZSwgYnV0IGxpbWl0IG1lbW9yeSBzaXplIGluc3RlYWQgb2YgZW50cmllcyBjb3VudAorZGVwdGg9ICAgICAgICAgIGxpbWl0cyB0aGUgbWF4aW11bSBkZWx0YSBkZXB0aAorbWF4LXBhY2stc2l6ZT0gIG1heGltdW0gc2l6ZSBvZiBlYWNoIHBhY2tmaWxlCisiCitTVUJESVJFQ1RPUllfT0s9J1llcycKKy4gZ2l0LXNoLXNldHVwCisKK25vX3VwZGF0ZV9pbmZvPSBhbGxfaW50b19vbmU9IHJlbW92ZV9yZWR1bmRhbnQ9IGtlZXBfdW5yZWFjaGFibGU9Citsb2NhbD0gcXVpZXQ9IG5vX3JldXNlPSBleHRyYT0KK3doaWxlIHRlc3QgJCMgIT0gMAorZG8KKwljYXNlICIkMSIgaW4KKwktbikJbm9fdXBkYXRlX2luZm89dCA7OworCS1hKQlhbGxfaW50b19vbmU9dCA7OworCS1BKQlhbGxfaW50b19vbmU9dAorCQlrZWVwX3VucmVhY2hhYmxlPS0ta2VlcC11bnJlYWNoYWJsZSA7OworCS1kKQlyZW1vdmVfcmVkdW5kYW50PXQgOzsKKwktcSkJcXVpZXQ9LXEgOzsKKwktZikJbm9fcmV1c2U9LS1uby1yZXVzZS1vYmplY3QgOzsKKwktbCkJbG9jYWw9LS1sb2NhbCA7OworCS0tbWF4LXBhY2stc2l6ZXwtLXdpbmRvd3wtLXdpbmRvdy1tZW1vcnl8LS1kZXB0aCkKKwkJZXh0cmE9IiRleHRyYSAkMT0kMiI7IHNoaWZ0IDs7CisJLS0pIHNoaWZ0OyBicmVhazs7CisJKikJdXNhZ2UgOzsKKwllc2FjCisJc2hpZnQKK2RvbmUKKworIyBMYXRlciB3ZSB3aWxsIGRlZmF1bHQgcmVwYWNrLlVzZURlbHRhQmFzZU9mZnNldCB0byB0cnVlCitkZWZhdWx0X2Ribz1mYWxzZQorCitjYXNlICJgZ2l0IGNvbmZpZyAtLWJvb2wgcmVwYWNrLnVzZWRlbHRhYmFzZW9mZnNldCB8fAorICAgICAgIGVjaG8gJGRlZmF1bHRfZGJvYCIgaW4KK3RydWUpCisJZXh0cmE9IiRleHRyYSAtLWRlbHRhLWJhc2Utb2Zmc2V0IiA7OworZXNhYworCitQQUNLRElSPSIkR0lUX09CSkVDVF9ESVJFQ1RPUlkvcGFjayIKK1BBQ0tUTVA9IiRHSVRfT0JKRUNUX0RJUkVDVE9SWS8udG1wLSQkLXBhY2siCitybSAtZiAiJFBBQ0tUTVAiLSoKK3RyYXAgJ3JtIC1mICIkUEFDS1RNUCItKicgMCAxIDIgMyAxNQorCisjIFRoZXJlIHdpbGwgYmUgbW9yZSByZXBhY2tpbmcgc3RyYXRlZ2llcyB0byBjb21lLi4uCitjYXNlICIsJGFsbF9pbnRvX29uZSwiIGluCissLCkKKwlhcmdzPSctLXVucGFja2VkIC0taW5jcmVtZW50YWwnCisJOzsKKyx0LCkKKwlpZiBbIC1kICIkUEFDS0RJUiIgXTsgdGhlbgorCQlmb3IgZSBpbiBgY2QgIiRQQUNLRElSIiAmJiBmaW5kIC4gLXR5cGUgZiAtbmFtZSAnKi5wYWNrJyBcCisJCQl8IHNlZCAtZSAncy9eXC5cLy8vJyAtZSAncy9cLnBhY2skLy8nYAorCQlkbworCQkJaWYgWyAtZSAiJFBBQ0tESVIvJGUua2VlcCIgXTsgdGhlbgorCQkJCToga2VlcAorCQkJZWxzZQorCQkJCWFyZ3M9IiRhcmdzIC0tdW5wYWNrZWQ9JGUucGFjayIKKwkJCQlleGlzdGluZz0iJGV4aXN0aW5nICRlIgorCQkJZmkKKwkJZG9uZQorCWZpCisJaWYgdGVzdCAteiAiJGFyZ3MiCisJdGhlbgorCQlhcmdzPSctLXVucGFja2VkIC0taW5jcmVtZW50YWwnCisJZWxpZiB0ZXN0IC1uICIka2VlcF91bnJlYWNoYWJsZSIKKwl0aGVuCisJCWFyZ3M9IiRhcmdzICRrZWVwX3VucmVhY2hhYmxlIgorCWZpCisJOzsKK2VzYWMKKworYXJncz0iJGFyZ3MgJGxvY2FsICRxdWlldCAkbm9fcmV1c2UkZXh0cmEiCituYW1lcz0kKGdpdCBwYWNrLW9iamVjdHMgLS1ub24tZW1wdHkgLS1hbGwgLS1yZWZsb2cgJGFyZ3MgPC9kZXYvbnVsbCAiJFBBQ0tUTVAiKSB8fAorCWV4aXQgMQoraWYgWyAteiAiJG5hbWVzIiBdOyB0aGVuCisJaWYgdGVzdCAteiAiJHF1aWV0IjsgdGhlbgorCQllY2hvIE5vdGhpbmcgbmV3IHRvIHBhY2suCisJZmkKK2ZpCitmb3IgbmFtZSBpbiAkbmFtZXMgOyBkbworCWZ1bGxiYXNlcz0iJGZ1bGxiYXNlcyBwYWNrLSRuYW1lIgorCWNobW9kIGEtdyAiJFBBQ0tUTVAtJG5hbWUucGFjayIKKwljaG1vZCBhLXcgIiRQQUNLVE1QLSRuYW1lLmlkeCIKKwlta2RpciAtcCAiJFBBQ0tESVIiIHx8IGV4aXQKKworCWZvciBzZnggaW4gcGFjayBpZHgKKwlkbworCQlpZiB0ZXN0IC1mICIkUEFDS0RJUi9wYWNrLSRuYW1lLiRzZngiCisJCXRoZW4KKwkJCW12IC1mICIkUEFDS0RJUi9wYWNrLSRuYW1lLiRzZngiIFwKKwkJCQkiJFBBQ0tESVIvb2xkLXBhY2stJG5hbWUuJHNmeCIKKwkJZmkKKwlkb25lICYmCisJbXYgLWYgIiRQQUNLVE1QLSRuYW1lLnBhY2siICIkUEFDS0RJUi9wYWNrLSRuYW1lLnBhY2siICYmCisJbXYgLWYgIiRQQUNLVE1QLSRuYW1lLmlkeCIgICIkUEFDS0RJUi9wYWNrLSRuYW1lLmlkeCIgJiYKKwl0ZXN0IC1mICIkUEFDS0RJUi9wYWNrLSRuYW1lLnBhY2siICYmCisJdGVzdCAtZiAiJFBBQ0tESVIvcGFjay0kbmFtZS5pZHgiIHx8IHsKKwkJZWNobyA+JjIgIkNvdWxkbid0IHJlcGxhY2UgdGhlIGV4aXN0aW5nIHBhY2sgd2l0aCB1cGRhdGVkIG9uZS4iCisJCWVjaG8gPiYyICJUaGUgb3JpZ2luYWwgc2V0IG9mIHBhY2tzIGhhdmUgYmVlbiBzYXZlZCBhcyIKKwkJZWNobyA+JjIgIm9sZC1wYWNrLSRuYW1lLntwYWNrLGlkeH0gaW4gJFBBQ0tESVIuIgorCQlleGl0IDEKKwl9CisJcm0gLWYgIiRQQUNLRElSL29sZC1wYWNrLSRuYW1lLnBhY2siICIkUEFDS0RJUi9vbGQtcGFjay0kbmFtZS5pZHgiCitkb25lCisKK2lmIHRlc3QgIiRyZW1vdmVfcmVkdW5kYW50IiA9IHQKK3RoZW4KKwkjIFdlIGtub3cgJGV4aXN0aW5nIGFyZSBhbGwgcmVkdW5kYW50LgorCWlmIFsgLW4gIiRleGlzdGluZyIgXQorCXRoZW4KKwkJc3luYworCQkoIGNkICIkUEFDS0RJUiIgJiYKKwkJICBmb3IgZSBpbiAkZXhpc3RpbmcKKwkJICBkbworCQkJY2FzZSAiICRmdWxsYmFzZXMgIiBpbgorCQkJKiIgJGUgIiopIDs7CisJCQkqKQlybSAtZiAiJGUucGFjayIgIiRlLmlkeCIgIiRlLmtlZXAiIDs7CisJCQllc2FjCisJCSAgZG9uZQorCQkpCisJZmkKKwlnaXQgcHJ1bmUtcGFja2VkICRxdWlldAorZmkKKworY2FzZSAiJG5vX3VwZGF0ZV9pbmZvIiBpbgordCkgOiA7OworKikgZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mbyA7OworZXNhYwpkaWZmIC0tZ2l0IGEvZ2l0LXJlcXVlc3QtcHVsbC5zaCBiL2dpdC1yZXF1ZXN0LXB1bGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDY4ZjVlMAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1yZXF1ZXN0LXB1bGwuc2gKQEAgLTAsMCArMSw1NyBAQAorIyEvYmluL3NoIC1lCisjIENvcHlyaWdodCAyMDA1LCBSeWFuIEFuZGVyc29uIDxyeWFuQG1pY2hvbmxpbmUuY29tPgorIworIyBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTCB2Miwgb3IgYSBsYXRlciB2ZXJzaW9uCisjIGF0IHRoZSBkaXNjcmV0aW9uIG9mIExpbnVzIFRvcnZhbGRzLgorCitVU0FHRT0nPGNvbW1pdD4gPHVybD4gWzxoZWFkPl0nCitMT05HX1VTQUdFPSdTdW1tYXJpemVzIHRoZSBjaGFuZ2VzIHNpbmNlIDxjb21taXQ+IHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQsCithbmQgaW5jbHVkZXMgPHVybD4gaW4gdGhlIG1lc3NhZ2UgZ2VuZXJhdGVkLicKK1NVQkRJUkVDVE9SWV9PSz0nWWVzJworT1BUSU9OU19TUEVDPQorLiBnaXQtc2gtc2V0dXAKKy4gZ2l0LXBhcnNlLXJlbW90ZQorCitiYXNlPSQxCit1cmw9JDIKK2hlYWQ9JHszLUhFQUR9CisKK1sgIiRiYXNlIiBdIHx8IHVzYWdlCitbICIkdXJsIiBdIHx8IHVzYWdlCisKK2Jhc2VyZXY9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgIiRiYXNlIl4wYCAmJgoraGVhZHJldj1gZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAiJGhlYWQiXjBgIHx8IGV4aXQKKworbWVyZ2VfYmFzZT1gZ2l0IG1lcmdlLWJhc2UgJGJhc2VyZXYgJGhlYWRyZXZgIHx8CitkaWUgImZhdGFsOiBObyBjb21taXRzIGluIGNvbW1vbiBiZXR3ZWVuICRiYXNlIGFuZCAkaGVhZCIKKwordXJsPSQoZ2V0X3JlbW90ZV91cmwgIiR1cmwiKQorYnJhbmNoPSQoZ2l0IHBlZWstcmVtb3RlICIkdXJsIiBcCisJfCBzZWQgLW4gLWUgIi9eJGhlYWRyZXYJcmVmcy5oZWFkcy4veworCQlzL14uKglyZWZzLmhlYWRzLi8vCisJCXAKKwkJcQorCX0iKQoraWYgWyAteiAiJGJyYW5jaCIgXTsgdGhlbgorCWVjaG8gIndhcm46IE5vIGJyYW5jaCBvZiAkdXJsIGlzIGF0OiIgPiYyCisJZ2l0IGxvZyAtLW1heC1jb3VudD0xIC0tcHJldHR5PSdmb3JtYXQ6d2FybjogICAlaDogJXMnICRoZWFkcmV2ID4mMgorCWVjaG8gIndhcm46IEFyZSB5b3Ugc3VyZSB5b3UgcHVzaGVkICRoZWFkIHRoZXJlPyIgPiYyCisJZWNobyA+JjIKKwllY2hvID4mMgorCWJyYW5jaD0uLkJSQU5DSC5OT1QuVkVSSUZJRUQuLgorCXN0YXR1cz0xCitmaQorCitQQUdFUj0KK2V4cG9ydCBQQUdFUgorZWNobyAiVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHNpbmNlIGNvbW1pdCAkYmFzZXJldjoiCitnaXQgc2hvcnRsb2cgLS1tYXgtY291bnQ9MSAkYmFzZXJldiB8IHNlZCAtZSAncy9eXCguXCkvICBcMS8nCisKK2VjaG8gImFyZSBhdmFpbGFibGUgaW4gdGhlIGdpdCByZXBvc2l0b3J5IGF0OiIKK2VjaG8KK2VjaG8gIiAgJHVybCAkYnJhbmNoIgorZWNobworCitnaXQgc2hvcnRsb2cgXiRiYXNlcmV2ICRoZWFkcmV2CitnaXQgZGlmZiAtTSAtLXN0YXQgLS1zdW1tYXJ5ICRtZXJnZV9iYXNlICRoZWFkcmV2CitleGl0ICRzdGF0dXMKZGlmZiAtLWdpdCBhL2dpdC1zZW5kLWVtYWlsLnBlcmwgYi9naXQtc2VuZC1lbWFpbC5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJlNGEyMGQKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtc2VuZC1lbWFpbC5wZXJsCkBAIC0wLDAgKzEsOTU4IEBACisjIS91c3IvYmluL3BlcmwgLXcKKyMKKyMgQ29weXJpZ2h0IDIwMDIsMjAwNSBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorIyBDb3B5cmlnaHQgMjAwNSBSeWFuIEFuZGVyc29uIDxyeWFuQG1pY2hvbmxpbmUuY29tPgorIworIyBHUEwgdjIgKFNlZSBDT1BZSU5HKQorIworIyBQb3J0ZWQgdG8gc3VwcG9ydCBnaXQgIm1ib3giIGZvcm1hdCBmaWxlcyBieSBSeWFuIEFuZGVyc29uIDxyeWFuQG1pY2hvbmxpbmUuY29tPgorIworIyBTZW5kcyBhIGNvbGxlY3Rpb24gb2YgZW1haWxzIHRvIHRoZSBnaXZlbiBlbWFpbCBhZGRyZXNzZXMsIGRpc3R1cmJpbmdseSBmYXN0LgorIworIyBTdXBwb3J0cyB0d28gZm9ybWF0czoKKyMgMS4gbWJveCBmb3JtYXQgZmlsZXMgKGlnbm9yaW5nIG1vc3QgaGVhZGVycyBhbmQgTUlNRSBmb3JtYXR0aW5nIC0gdGhpcyBpcyBkZXNpZ25lZCBmb3Igc2VuZGluZyBwYXRjaGVzKQorIyAyLiBUaGUgb3JpZ2luYWwgZm9ybWF0IHN1cHBvcnQgYnkgR3JlZydzIHNjcmlwdDoKKyMgICAgZmlyc3QgbGluZSBvZiB0aGUgbWVzc2FnZSBpcyB3aG8gdG8gQ0MsCisjICAgIGFuZCBzZWNvbmQgbGluZSBpcyB0aGUgc3ViamVjdCBvZiB0aGUgbWVzc2FnZS4KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBUZXJtOjpSZWFkTGluZTsKK3VzZSBHZXRvcHQ6Okxvbmc7Cit1c2UgRGF0YTo6RHVtcGVyOwordXNlIFRlcm06OkFOU0lDb2xvcjsKK3VzZSBHaXQ7CisKK3BhY2thZ2UgRmFrZVRlcm07CitzdWIgbmV3IHsKKwlteSAoJGNsYXNzLCAkcmVhc29uKSA9IEBfOworCXJldHVybiBibGVzcyBcJHJlYXNvbiwgc2hpZnQ7Cit9CitzdWIgcmVhZGxpbmUgeworCW15ICRzZWxmID0gc2hpZnQ7CisJZGllICJDYW5ub3QgdXNlIHJlYWRsaW5lIG9uIEZha2VUZXJtOiAkJHNlbGYiOworfQorcGFja2FnZSBtYWluOworCisKK3N1YiB1c2FnZSB7CisJcHJpbnQgPDxFT1Q7CitnaXQtc2VuZC1lbWFpbCBbb3B0aW9uc10gPGZpbGUgfCBkaXJlY3Rvcnk+Li4uCitPcHRpb25zOgorICAgLS1mcm9tICAgICAgICAgU3BlY2lmeSB0aGUgIkZyb206IiBsaW5lIG9mIHRoZSBlbWFpbCB0byBiZSBzZW50LgorCisgICAtLXRvICAgICAgICAgICBTcGVjaWZ5IHRoZSBwcmltYXJ5ICJUbzoiIGxpbmUgb2YgdGhlIGVtYWlsLgorCisgICAtLWNjICAgICAgICAgICBTcGVjaWZ5IGFuIGluaXRpYWwgIkNjOiIgbGlzdCBmb3IgdGhlIGVudGlyZSBzZXJpZXMKKyAgICAgICAgICAgICAgICAgIG9mIGVtYWlscy4KKworICAgLS1jYy1jbWQgICAgICAgU3BlY2lmeSBhIGNvbW1hbmQgdG8gZXhlY3V0ZSBwZXIgZmlsZSB3aGljaCBhZGRzCisgICAgICAgICAgICAgICAgICBwZXIgZmlsZSBzcGVjaWZpYyBjYyBhZGRyZXNzIGVudHJpZXMKKworICAgLS1iY2MgICAgICAgICAgU3BlY2lmeSBhIGxpc3Qgb2YgZW1haWwgYWRkcmVzc2VzIHRoYXQgc2hvdWxkIGJlIEJjYzoKKwkJICBvbiBhbGwgdGhlIGVtYWlscy4KKworICAgLS1jb21wb3NlICAgICAgVXNlIFwkR0lUX0VESVRPUiwgY29yZS5lZGl0b3IsIFwkRURJVE9SLCBvciBcJFZJU1VBTCB0byBlZGl0CisJCSAgYW4gaW50cm9kdWN0b3J5IG1lc3NhZ2UgZm9yIHRoZSBwYXRjaCBzZXJpZXMuCisKKyAgIC0tc3ViamVjdCAgICAgIFNwZWNpZnkgdGhlIGluaXRpYWwgIlN1YmplY3Q6IiBsaW5lLgorICAgICAgICAgICAgICAgICAgT25seSBuZWNlc3NhcnkgaWYgLS1jb21wb3NlIGlzIGFsc28gc2V0LiAgSWYgLS1jb21wb3NlCisJCSAgaXMgbm90IHNldCwgdGhpcyB3aWxsIGJlIHByb21wdGVkIGZvci4KKworICAgLS1pbi1yZXBseS10byAgU3BlY2lmeSB0aGUgZmlyc3QgIkluLVJlcGx5LVRvOiIgaGVhZGVyIGxpbmUuCisgICAgICAgICAgICAgICAgICBPbmx5IHVzZWQgaWYgLS1jb21wb3NlIGlzIGFsc28gc2V0LiAgSWYgLS1jb21wb3NlIGlzIG5vdAorCQkgIHNldCwgdGhpcyB3aWxsIGJlIHByb21wdGVkIGZvci4KKworICAgLS1jaGFpbi1yZXBseS10byBJZiBzZXQsIHRoZSByZXBsaWVzIHdpbGwgYWxsIGJlIHRvIHRoZSBwcmV2aW91cworICAgICAgICAgICAgICAgICAgZW1haWwgc2VudCwgcmF0aGVyIHRoYW4gdG8gdGhlIGZpcnN0IGVtYWlsIHNlbnQuCisgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBvbi4KKworICAgLS1zaWduZWQtb2ZmLWNjIEF1dG9tYXRpY2FsbHkgYWRkIGVtYWlsIGFkZHJlc3NlcyB0aGF0IGFwcGVhciBpbgorICAgICAgICAgICAgICAgICBTaWduZWQtb2ZmLWJ5OiBvciBDYzogbGluZXMgdG8gdGhlIGNjOiBsaXN0LiBEZWZhdWx0cyB0byBvbi4KKworICAgLS1pZGVudGl0eSAgICAgVGhlIGNvbmZpZ3VyYXRpb24gaWRlbnRpdHksIGEgc3Vic2VjdGlvbiB0byBwcmlvcml0aXNlIG92ZXIKKyAgICAgICAgICAgICAgICAgIHRoZSBkZWZhdWx0IHNlY3Rpb24uCisKKyAgIC0tc210cC1zZXJ2ZXIgIElmIHNldCwgc3BlY2lmaWVzIHRoZSBvdXRnb2luZyBTTVRQIHNlcnZlciB0byB1c2UuCisgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBsb2NhbGhvc3QuICBQb3J0IG51bWJlciBjYW4gYmUgc3BlY2lmaWVkIGhlcmUgd2l0aAorICAgICAgICAgICAgICAgICAgaG9zdG5hbWU6cG9ydCBmb3JtYXQgb3IgYnkgdXNpbmcgLS1zbXRwLXNlcnZlci1wb3J0IG9wdGlvbi4KKworICAgLS1zbXRwLXNlcnZlci1wb3J0IFNwZWNpZnkgYSBwb3J0IG9uIHRoZSBvdXRnb2luZyBTTVRQIHNlcnZlciB0byBjb25uZWN0IHRvLgorCisgICAtLXNtdHAtdXNlciAgICBUaGUgdXNlcm5hbWUgZm9yIFNNVFAtQVVUSC4KKworICAgLS1zbXRwLXBhc3MgICAgVGhlIHBhc3N3b3JkIGZvciBTTVRQLUFVVEguCisKKyAgIC0tc210cC1zc2wgICAgIElmIHNldCwgY29ubmVjdHMgdG8gdGhlIFNNVFAgc2VydmVyIHVzaW5nIFNTTC4KKworICAgLS1zdXBwcmVzcy1jYyAgU3VwcHJlc3MgdGhlIHNwZWNpZmllZCBjYXRlZ29yeSBvZiBhdXRvLUNDLiAgVGhlIGNhdGVnb3J5CisJCSAgY2FuIGJlIG9uZSBvZiAnYXV0aG9yJyBmb3IgdGhlIHBhdGNoIGF1dGhvciwgJ3NlbGYnIHRvCisJCSAgYXZvaWQgY29weWluZyB5b3Vyc2VsZiwgJ3NvYicgZm9yIFNpZ25lZC1vZmYtYnkgbGluZXMsCisJCSAgJ2NjY21kJyBmb3IgdGhlIG91dHB1dCBvZiB0aGUgY2NjbWQsIG9yICdhbGwnIHRvIHN1cHByZXNzCisJCSAgYWxsIG9mIHRoZXNlLgorCisgICAtLXN1cHByZXNzLWZyb20gU3VwcHJlc3Mgc2VuZGluZyBlbWFpbHMgdG8geW91cnNlbGYuIERlZmF1bHRzIHRvIG9mZi4KKworICAgLS10aHJlYWQgICAgICAgU3BlY2lmeSB0aGF0IHRoZSAiSW4tUmVwbHktVG86IiBoZWFkZXIgc2hvdWxkIGJlIHNldCBvbiBhbGwKKyAgICAgICAgICAgICAgICAgIGVtYWlscy4gRGVmYXVsdHMgdG8gb24uCisKKyAgIC0tcXVpZXQJICBNYWtlIGdpdC1zZW5kLWVtYWlsIGxlc3MgdmVyYm9zZS4gIE9uZSBsaW5lIHBlciBlbWFpbAorICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGFsbCB0aGF0IGlzIG91dHB1dC4KKworICAgLS1kcnktcnVuCSAgRG8gZXZlcnl0aGluZyBleGNlcHQgYWN0dWFsbHkgc2VuZCB0aGUgZW1haWxzLgorCisgICAtLWVudmVsb3BlLXNlbmRlcglTcGVjaWZ5IHRoZSBlbnZlbG9wZSBzZW5kZXIgdXNlZCB0byBzZW5kIHRoZSBlbWFpbHMuCisKKyAgIC0tbm8tdmFsaWRhdGUJRG9uJ3QgcGVyZm9ybSBhbnkgc2FuaXR5IGNoZWNrcyBvbiBwYXRjaGVzLgorCitFT1QKKwlleGl0KDEpOworfQorCisjIG1vc3QgbWFpbCBzZXJ2ZXJzIGdlbmVyYXRlIHRoZSBEYXRlOiBoZWFkZXIsIGJ1dCBub3QgYWxsLi4uCitzdWIgZm9ybWF0XzI4MjJfdGltZSB7CisJbXkgKCR0aW1lKSA9IEBfOworCW15IEBsb2NhbHRtID0gbG9jYWx0aW1lKCR0aW1lKTsKKwlteSBAZ210dG0gPSBnbXRpbWUoJHRpbWUpOworCW15ICRsb2NhbG1pbiA9ICRsb2NhbHRtWzFdICsgJGxvY2FsdG1bMl0gKiA2MDsKKwlteSAkZ210bWluID0gJGdtdHRtWzFdICsgJGdtdHRtWzJdICogNjA7CisJaWYgKCRsb2NhbHRtWzBdICE9ICRnbXR0bVswXSkgeworCQlkaWUgImxvY2FsIHpvbmUgZGlmZmVycyBmcm9tIEdNVCBieSBhIG5vbi1taW51dGUgaW50ZXJ2YWxcbiI7CisJfQorCWlmICgoKCRnbXR0bVs2XSArIDEpICUgNykgPT0gJGxvY2FsdG1bNl0pIHsKKwkJJGxvY2FsbWluICs9IDE0NDA7CisJfSBlbHNpZiAoKCgkZ210dG1bNl0gLSAxKSAlIDcpID09ICRsb2NhbHRtWzZdKSB7CisJCSRsb2NhbG1pbiAtPSAxNDQwOworCX0gZWxzaWYgKCRnbXR0bVs2XSAhPSAkbG9jYWx0bVs2XSkgeworCQlkaWUgImxvY2FsIHRpbWUgb2Zmc2V0IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAyNCBob3Vyc1xuIjsKKwl9CisJbXkgJG9mZnNldCA9ICRsb2NhbG1pbiAtICRnbXRtaW47CisJbXkgJG9mZmhvdXIgPSAkb2Zmc2V0IC8gNjA7CisJbXkgJG9mZm1pbiA9IGFicygkb2Zmc2V0ICUgNjApOworCWlmIChhYnMoJG9mZmhvdXIpID49IDI0KSB7CisJCWRpZSAoImxvY2FsIHRpbWUgb2Zmc2V0IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAyNCBob3Vyc1xuIik7CisJfQorCisJcmV0dXJuIHNwcmludGYoIiVzLCAlMmQgJXMgJWQgJTAyZDolMDJkOiUwMmQgJXMlMDJkJTAyZCIsCisJCSAgICAgICBxdyhTdW4gTW9uIFR1ZSBXZWQgVGh1IEZyaSBTYXQpWyRsb2NhbHRtWzZdXSwKKwkJICAgICAgICRsb2NhbHRtWzNdLAorCQkgICAgICAgcXcoSmFuIEZlYiBNYXIgQXByIE1heSBKdW4KKwkJCSAgSnVsIEF1ZyBTZXAgT2N0IE5vdiBEZWMpWyRsb2NhbHRtWzRdXSwKKwkJICAgICAgICRsb2NhbHRtWzVdKzE5MDAsCisJCSAgICAgICAkbG9jYWx0bVsyXSwKKwkJICAgICAgICRsb2NhbHRtWzFdLAorCQkgICAgICAgJGxvY2FsdG1bMF0sCisJCSAgICAgICAoJG9mZnNldCA+PSAwKSA/ICcrJyA6ICctJywKKwkJICAgICAgIGFicygkb2ZmaG91ciksCisJCSAgICAgICAkb2ZmbWluLAorCQkgICAgICAgKTsKK30KKworbXkgJGhhdmVfZW1haWxfdmFsaWQgPSBldmFsIHsgcmVxdWlyZSBFbWFpbDo6VmFsaWQ7IDEgfTsKK215ICRzbXRwOworbXkgJGF1dGg7CisKK3N1YiB1bmlxdWVfZW1haWxfbGlzdChAKTsKK3N1YiBjbGVhbnVwX2NvbXBvc2VfZmlsZXMoKTsKKworIyBDb25zdGFudHMgKGVzc2VudGlhbGx5KQorbXkgJGNvbXBvc2VfZmlsZW5hbWUgPSAiLm1zZy4kJCI7CisKKyMgVmFyaWFibGVzIHdlIGZpbGwgaW4gYXV0b21hdGljYWxseSwgb3IgdmlhIHByb21wdGluZzoKK215IChAdG8sQGNjLEBpbml0aWFsX2NjLEBiY2NsaXN0LEB4aCwKKwkkaW5pdGlhbF9yZXBseV90bywkaW5pdGlhbF9zdWJqZWN0LEBmaWxlcywkYXV0aG9yLCRzZW5kZXIsJHNtdHBfYXV0aHBhc3MsJGNvbXBvc2UsJHRpbWUpOworCitteSAkZW52ZWxvcGVfc2VuZGVyOworCisjIEV4YW1wbGUgcmVwbHkgdG86CisjJGluaXRpYWxfcmVwbHlfdG8gPSAnJzsgIzwyMDA1MDIwMzE3MzIwOC5HQTIzOTY0QGZvb2Jhci5jb20+JzsKKworbXkgJHJlcG8gPSBHaXQtPnJlcG9zaXRvcnkoKTsKK215ICR0ZXJtID0gZXZhbCB7CisJJEVOVnsiR0lUX1NFTkRfRU1BSUxfTk9UVFkifQorCQk/IG5ldyBUZXJtOjpSZWFkTGluZSAnZ2l0LXNlbmQtZW1haWwnLCBcKlNURElOLCBcKlNURE9VVAorCQk6IG5ldyBUZXJtOjpSZWFkTGluZSAnZ2l0LXNlbmQtZW1haWwnOworfTsKK2lmICgkQCkgeworCSR0ZXJtID0gbmV3IEZha2VUZXJtICIkQDogZ29pbmcgbm9uLWludGVyYWN0aXZlIjsKK30KKworIyBCZWhhdmlvciBtb2RpZmljYXRpb24gdmFyaWFibGVzCitteSAoJHF1aWV0LCAkZHJ5X3J1bikgPSAoMCwgMCk7CisKKyMgVmFyaWFibGVzIHdpdGggY29ycmVzcG9uZGluZyBjb25maWcgc2V0dGluZ3MKK215ICgkdGhyZWFkLCAkY2hhaW5fcmVwbHlfdG8sICRzdXBwcmVzc19mcm9tLCAkc2lnbmVkX29mZl9jYywgJGNjX2NtZCk7CitteSAoJHNtdHBfc2VydmVyLCAkc210cF9zZXJ2ZXJfcG9ydCwgJHNtdHBfYXV0aHVzZXIsICRzbXRwX3NzbCk7CitteSAoJGlkZW50aXR5LCAkYWxpYXNmaWxldHlwZSwgQGFsaWFzX2ZpbGVzLCBAc210cF9ob3N0X3BhcnRzKTsKK215ICgkbm9fdmFsaWRhdGUpOworbXkgKEBzdXBwcmVzc19jYyk7CisKK215ICVjb25maWdfYm9vbF9zZXR0aW5ncyA9ICgKKyAgICAidGhyZWFkIiA9PiBbXCR0aHJlYWQsIDFdLAorICAgICJjaGFpbnJlcGx5dG8iID0+IFtcJGNoYWluX3JlcGx5X3RvLCAxXSwKKyAgICAic3VwcHJlc3Nmcm9tIiA9PiBbXCRzdXBwcmVzc19mcm9tLCB1bmRlZl0sCisgICAgInNpZ25lZG9mZmNjIiA9PiBbXCRzaWduZWRfb2ZmX2NjLCB1bmRlZl0sCisgICAgInNtdHBzc2wiID0+IFtcJHNtdHBfc3NsLCAwXSwKKyk7CisKK215ICVjb25maWdfc2V0dGluZ3MgPSAoCisgICAgInNtdHBzZXJ2ZXIiID0+IFwkc210cF9zZXJ2ZXIsCisgICAgInNtdHBzZXJ2ZXJwb3J0IiA9PiBcJHNtdHBfc2VydmVyX3BvcnQsCisgICAgInNtdHB1c2VyIiA9PiBcJHNtdHBfYXV0aHVzZXIsCisgICAgInNtdHBwYXNzIiA9PiBcJHNtdHBfYXV0aHBhc3MsCisgICAgInRvIiA9PiBcQHRvLAorICAgICJjY2NtZCIgPT4gXCRjY19jbWQsCisgICAgImFsaWFzZmlsZXR5cGUiID0+IFwkYWxpYXNmaWxldHlwZSwKKyAgICAiYmNjIiA9PiBcQGJjY2xpc3QsCisgICAgImFsaWFzZXNmaWxlIiA9PiBcQGFsaWFzX2ZpbGVzLAorICAgICJzdXBwcmVzc2NjIiA9PiBcQHN1cHByZXNzX2NjLAorKTsKKworIyBIYW5kbGUgVW5jb3V0aCBUZXJtaW5hdGlvbgorc3ViIHNpZ25hbF9oYW5kbGVyIHsKKworCSMgTWFrZSB0ZXh0IG5vcm1hbAorCXByaW50IGNvbG9yKCJyZXNldCIpLCAiXG4iOworCisJIyBTTVRQIHBhc3N3b3JkIG1hc2tlZAorCXN5c3RlbSAic3R0eSBlY2hvIjsKKworCSMgdG1wIGZpbGVzIGZyb20gLS1jb21wb3NlCisJaWYgKC1lICRjb21wb3NlX2ZpbGVuYW1lKSB7CisJCXByaW50ICInJGNvbXBvc2VfZmlsZW5hbWUnIGNvbnRhaW5zIGFuIGludGVybWVkaWF0ZSB2ZXJzaW9uIG9mIHRoZSBlbWFpbCB5b3Ugd2VyZSBjb21wb3NpbmcuXG4iOworCX0KKwlpZiAoLWUgKCRjb21wb3NlX2ZpbGVuYW1lIC4gIi5maW5hbCIpKSB7CisJCXByaW50ICInJGNvbXBvc2VfZmlsZW5hbWUuZmluYWwnIGNvbnRhaW5zIHRoZSBjb21wb3NlZCBlbWFpbC5cbiIKKwl9CisKKwlleGl0OworfTsKKworJFNJR3tURVJNfSA9IFwmc2lnbmFsX2hhbmRsZXI7CiskU0lHe0lOVH0gID0gXCZzaWduYWxfaGFuZGxlcjsKKworIyBCZWdpbiBieSBhY2N1bXVsYXRpbmcgYWxsIHRoZSB2YXJpYWJsZXMgKGRlZmluZWQgYWJvdmUpLCB0aGF0IHdlIHdpbGwgZW5kIHVwCisjIG5lZWRpbmcsIGZpcnN0LCBmcm9tIHRoZSBjb21tYW5kIGxpbmU6CisKK215ICRyYyA9IEdldE9wdGlvbnMoInNlbmRlcnxmcm9tPXMiID0+IFwkc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAiaW4tcmVwbHktdG89cyIgPT4gXCRpbml0aWFsX3JlcGx5X3RvLAorCQkgICAgInN1YmplY3Q9cyIgPT4gXCRpbml0aWFsX3N1YmplY3QsCisJCSAgICAidG89cyIgPT4gXEB0bywKKwkJICAgICJjYz1zIiA9PiBcQGluaXRpYWxfY2MsCisJCSAgICAiYmNjPXMiID0+IFxAYmNjbGlzdCwKKwkJICAgICJjaGFpbi1yZXBseS10byEiID0+IFwkY2hhaW5fcmVwbHlfdG8sCisJCSAgICAic210cC1zZXJ2ZXI9cyIgPT4gXCRzbXRwX3NlcnZlciwKKwkJICAgICJzbXRwLXNlcnZlci1wb3J0PXMiID0+IFwkc210cF9zZXJ2ZXJfcG9ydCwKKwkJICAgICJzbXRwLXVzZXI9cyIgPT4gXCRzbXRwX2F1dGh1c2VyLAorCQkgICAgInNtdHAtcGFzczpzIiA9PiBcJHNtdHBfYXV0aHBhc3MsCisJCSAgICAic210cC1zc2whIiA9PiBcJHNtdHBfc3NsLAorCQkgICAgImlkZW50aXR5PXMiID0+IFwkaWRlbnRpdHksCisJCSAgICAiY29tcG9zZSIgPT4gXCRjb21wb3NlLAorCQkgICAgInF1aWV0IiA9PiBcJHF1aWV0LAorCQkgICAgImNjLWNtZD1zIiA9PiBcJGNjX2NtZCwKKwkJICAgICJzdXBwcmVzcy1mcm9tISIgPT4gXCRzdXBwcmVzc19mcm9tLAorCQkgICAgInN1cHByZXNzLWNjPXMiID0+IFxAc3VwcHJlc3NfY2MsCisJCSAgICAic2lnbmVkLW9mZi1jY3xzaWduZWQtb2ZmLWJ5LWNjISIgPT4gXCRzaWduZWRfb2ZmX2NjLAorCQkgICAgImRyeS1ydW4iID0+IFwkZHJ5X3J1biwKKwkJICAgICJlbnZlbG9wZS1zZW5kZXI9cyIgPT4gXCRlbnZlbG9wZV9zZW5kZXIsCisJCSAgICAidGhyZWFkISIgPT4gXCR0aHJlYWQsCisJCSAgICAibm8tdmFsaWRhdGUiID0+IFwkbm9fdmFsaWRhdGUsCisJICk7CisKK3VubGVzcyAoJHJjKSB7CisgICAgdXNhZ2UoKTsKK30KKworIyBOb3csIGxldCdzIGZpbGwgYW55IHRoYXQgYXJlbid0IHNldCBpbiB3aXRoIGRlZmF1bHRzOgorCitzdWIgcmVhZF9jb25maWcgeworCW15ICgkcHJlZml4KSA9IEBfOworCisJZm9yZWFjaCBteSAkc2V0dGluZyAoa2V5cyAlY29uZmlnX2Jvb2xfc2V0dGluZ3MpIHsKKwkJbXkgJHRhcmdldCA9ICRjb25maWdfYm9vbF9zZXR0aW5nc3skc2V0dGluZ30tPlswXTsKKwkJJCR0YXJnZXQgPSAkcmVwby0+Y29uZmlnX2Jvb2woIiRwcmVmaXguJHNldHRpbmciKSB1bmxlc3MgKGRlZmluZWQgJCR0YXJnZXQpOworCX0KKworCWZvcmVhY2ggbXkgJHNldHRpbmcgKGtleXMgJWNvbmZpZ19zZXR0aW5ncykgeworCQlteSAkdGFyZ2V0ID0gJGNvbmZpZ19zZXR0aW5nc3skc2V0dGluZ307CisJCWlmIChyZWYoJHRhcmdldCkgZXEgIkFSUkFZIikgeworCQkJdW5sZXNzIChAJHRhcmdldCkgeworCQkJCW15IEB2YWx1ZXMgPSAkcmVwby0+Y29uZmlnKCIkcHJlZml4LiRzZXR0aW5nIik7CisJCQkJQCR0YXJnZXQgPSBAdmFsdWVzIGlmIChAdmFsdWVzICYmIGRlZmluZWQgJHZhbHVlc1swXSk7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkkJHRhcmdldCA9ICRyZXBvLT5jb25maWcoIiRwcmVmaXguJHNldHRpbmciKSB1bmxlc3MgKGRlZmluZWQgJCR0YXJnZXQpOworCQl9CisJfQorfQorCisjIHJlYWQgY29uZmlndXJhdGlvbiBmcm9tIFtzZW5kZW1haWwgIiRpZGVudGl0eSJdLCBmYWxsIGJhY2sgb24gW3NlbmRlbWFpbF0KKyRpZGVudGl0eSA9ICRyZXBvLT5jb25maWcoInNlbmRlbWFpbC5pZGVudGl0eSIpIHVubGVzcyAoZGVmaW5lZCAkaWRlbnRpdHkpOworcmVhZF9jb25maWcoInNlbmRlbWFpbC4kaWRlbnRpdHkiKSBpZiAoZGVmaW5lZCAkaWRlbnRpdHkpOworcmVhZF9jb25maWcoInNlbmRlbWFpbCIpOworCisjIGZhbGwgYmFjayBvbiBidWlsdGluIGJvb2wgZGVmYXVsdHMKK2ZvcmVhY2ggbXkgJHNldHRpbmcgKHZhbHVlcyAlY29uZmlnX2Jvb2xfc2V0dGluZ3MpIHsKKwkkeyRzZXR0aW5nLT5bMF19ID0gJHNldHRpbmctPlsxXSB1bmxlc3MgKGRlZmluZWQgKCR7JHNldHRpbmctPlswXX0pKTsKK30KKworIyBTZXQgQ0Mgc3VwcHJlc3Npb25zCitteSglc3VwcHJlc3NfY2MpOworaWYgKEBzdXBwcmVzc19jYykgeworCWZvcmVhY2ggbXkgJGVudHJ5IChAc3VwcHJlc3NfY2MpIHsKKwkJZGllICJVbmtub3duIC0tc3VwcHJlc3MtY2MgZmllbGQ6ICckZW50cnknXG4iCisJCQl1bmxlc3MgJGVudHJ5ID1+IC9eKGFsbHxjY2NtZHxjY3xhdXRob3J8c2VsZnxzb2IpJC87CisJCSRzdXBwcmVzc19jY3skZW50cnl9ID0gMTsKKwl9Cit9CisKK2lmICgkc3VwcHJlc3NfY2N7J2FsbCd9KSB7CisJZm9yZWFjaCBteSAkZW50cnkgKHF3IChjY21kIGNjIGF1dGhvciBzZWxmIHNvYikpIHsKKwkJJHN1cHByZXNzX2NjeyRlbnRyeX0gPSAxOworCX0KKwlkZWxldGUgJHN1cHByZXNzX2NjeydhbGwnfTsKK30KKworIyBJZiBleHBsaWNpdCBvbGQtc3R5bGUgb25lcyBhcmUgc3BlY2lmaWVkLCB0aGV5IHRydW1wIC0tc3VwcHJlc3MtY2MuCiskc3VwcHJlc3NfY2N7J3NlbGYnfSA9ICRzdXBwcmVzc19mcm9tIGlmIGRlZmluZWQgJHN1cHByZXNzX2Zyb207Ciskc3VwcHJlc3NfY2N7J3NvYid9ID0gISRzaWduZWRfb2ZmX2NjIGlmIGRlZmluZWQgJHNpZ25lZF9vZmZfY2M7CisKKyMgRGVidWdnaW5nLCBwcmludCBvdXQgdGhlIHN1cHByZXNzaW9ucy4KK2lmICgwKSB7CisJcHJpbnQgInN1cHByZXNzaW9uczpcbiI7CisJZm9yZWFjaCBteSAkZW50cnkgKGtleXMgJXN1cHByZXNzX2NjKSB7CisJCXByaW50ZiAiICAlLTVzIC0+ICRzdXBwcmVzc19jY3skZW50cnl9XG4iLCAkZW50cnk7CisJfQorfQorCitteSAoJHJlcG9hdXRob3IpID0gJHJlcG8tPmlkZW50X3BlcnNvbignYXV0aG9yJyk7CitteSAoJHJlcG9jb21taXR0ZXIpID0gJHJlcG8tPmlkZW50X3BlcnNvbignY29tbWl0dGVyJyk7CisKKyMgVmVyaWZ5IHRoZSB1c2VyIGlucHV0CisKK2ZvcmVhY2ggbXkgJGVudHJ5IChAdG8pIHsKKwlkaWUgIkNvbW1hIGluIC0tdG8gZW50cnk6ICRlbnRyeSdcbiIgdW5sZXNzICRlbnRyeSAhfiBtLywvOworfQorCitmb3JlYWNoIG15ICRlbnRyeSAoQGluaXRpYWxfY2MpIHsKKwlkaWUgIkNvbW1hIGluIC0tY2MgZW50cnk6ICRlbnRyeSdcbiIgdW5sZXNzICRlbnRyeSAhfiBtLywvOworfQorCitmb3JlYWNoIG15ICRlbnRyeSAoQGJjY2xpc3QpIHsKKwlkaWUgIkNvbW1hIGluIC0tYmNjbGlzdCBlbnRyeTogJGVudHJ5J1xuIiB1bmxlc3MgJGVudHJ5ICF+IG0vLC87Cit9CisKK215ICVhbGlhc2VzOworbXkgJXBhcnNlX2FsaWFzID0gKAorCSMgbXVsdGlsaW5lIGZvcm1hdHMgY2FuIGJlIHN1cHBvcnRlZCBpbiB0aGUgZnV0dXJlCisJbXV0dCA9PiBzdWIgeyBteSAkZmggPSBzaGlmdDsgd2hpbGUgKDwkZmg+KSB7CisJCWlmICgvXlxzKmFsaWFzXHMrKFxTKylccysoLiopJC8pIHsKKwkJCW15ICgkYWxpYXMsICRhZGRyKSA9ICgkMSwgJDIpOworCQkJJGFkZHIgPX4gcy8jLiokLy87ICMgbXV0dCBhbGxvd3MgIyBjb21tZW50cworCQkJICMgY29tbWFzIGRlbGltaXQgbXVsdGlwbGUgYWRkcmVzc2VzCisJCQkkYWxpYXNlc3skYWxpYXN9ID0gWyBzcGxpdCgvXHMqLFxzKi8sICRhZGRyKSBdOworCQl9fX0sCisJbWFpbHJjID0+IHN1YiB7IG15ICRmaCA9IHNoaWZ0OyB3aGlsZSAoPCRmaD4pIHsKKwkJaWYgKC9eYWxpYXNccysoXFMrKVxzKyguKikkLykgeworCQkJIyBzcGFjZXMgZGVsaW1pdCBtdWx0aXBsZSBhZGRyZXNzZXMKKwkJCSRhbGlhc2VzeyQxfSA9IFsgc3BsaXQoL1xzKy8sICQyKSBdOworCQl9fX0sCisJcGluZSA9PiBzdWIgeyBteSAkZmggPSBzaGlmdDsgd2hpbGUgKDwkZmg+KSB7CisJCWlmICgvXihcUyspXHQuKlx0KC4qKSQvKSB7CisJCQkkYWxpYXNlc3skMX0gPSBbIHNwbGl0KC9ccyosXHMqLywgJDIpIF07CisJCX19fSwKKwlnbnVzID0+IHN1YiB7IG15ICRmaCA9IHNoaWZ0OyB3aGlsZSAoPCRmaD4pIHsKKwkJaWYgKC9cKGRlZmluZS1tYWlsLWFsaWFzXHMrIihcUys/KSJccysiKFxTKz8pIlwpLykgeworCQkJJGFsaWFzZXN7JDF9ID0gWyAkMiBdOworCQl9fX0KKyk7CisKK2lmIChAYWxpYXNfZmlsZXMgYW5kICRhbGlhc2ZpbGV0eXBlIGFuZCBkZWZpbmVkICRwYXJzZV9hbGlhc3skYWxpYXNmaWxldHlwZX0pIHsKKwlmb3JlYWNoIG15ICRmaWxlIChAYWxpYXNfZmlsZXMpIHsKKwkJb3BlbiBteSAkZmgsICc8JywgJGZpbGUgb3IgZGllICJvcGVuaW5nICRmaWxlOiAkIVxuIjsKKwkJJHBhcnNlX2FsaWFzeyRhbGlhc2ZpbGV0eXBlfS0+KCRmaCk7CisJCWNsb3NlICRmaDsKKwl9Cit9CisKKygkc2VuZGVyKSA9IGV4cGFuZF9hbGlhc2VzKCRzZW5kZXIpIGlmIGRlZmluZWQgJHNlbmRlcjsKKworIyBOb3cgdGhhdCBhbGwgdGhlIGRlZmF1bHRzIGFyZSBzZXQsIHByb2Nlc3MgdGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmQgbGluZQorIyBhcmd1bWVudHMgYW5kIGNvbGxlY3QgdXAgdGhlIGZpbGVzIHRoYXQgbmVlZCB0byBiZSBwcm9jZXNzZWQuCitmb3IgbXkgJGYgKEBBUkdWKSB7CisJaWYgKC1kICRmKSB7CisJCW9wZW5kaXIoREgsJGYpCisJCQlvciBkaWUgIkZhaWxlZCB0byBvcGVuZGlyICRmOiAkISI7CisKKwkJcHVzaCBAZmlsZXMsIGdyZXAgeyAtZiAkXyB9IG1hcCB7ICskZiAuICIvIiAuICRfIH0KKwkJCQlzb3J0IHJlYWRkaXIoREgpOworCisJfSBlbHNpZiAoLWYgJGYpIHsKKwkJcHVzaCBAZmlsZXMsICRmOworCisJfSBlbHNlIHsKKwkJcHJpbnQgU1RERVJSICJTa2lwcGluZyAkZiAtIG5vdCBmb3VuZC5cbiI7CisJfQorfQorCitpZiAoISRub192YWxpZGF0ZSkgeworCWZvcmVhY2ggbXkgJGYgKEBmaWxlcykgeworCQlteSAkZXJyb3IgPSB2YWxpZGF0ZV9wYXRjaCgkZik7CisJCSRlcnJvciBhbmQgZGllICJmYXRhbDogJGY6ICRlcnJvclxud2FybmluZzogbm8gcGF0Y2hlcyB3ZXJlIHNlbnRcbiI7CisJfQorfQorCitpZiAoQGZpbGVzKSB7CisJdW5sZXNzICgkcXVpZXQpIHsKKwkJcHJpbnQgJF8sIlxuIiBmb3IgKEBmaWxlcyk7CisJfQorfSBlbHNlIHsKKwlwcmludCBTVERFUlIgIlxuTm8gcGF0Y2ggZmlsZXMgc3BlY2lmaWVkIVxuXG4iOworCXVzYWdlKCk7Cit9CisKK215ICRwcm9tcHRpbmcgPSAwOworaWYgKCFkZWZpbmVkICRzZW5kZXIpIHsKKwkkc2VuZGVyID0gJHJlcG9hdXRob3IgfHwgJHJlcG9jb21taXR0ZXI7CisKKwl3aGlsZSAoMSkgeworCQkkXyA9ICR0ZXJtLT5yZWFkbGluZSgiV2hvIHNob3VsZCB0aGUgZW1haWxzIGFwcGVhciB0byBiZSBmcm9tPyBbJHNlbmRlcl0gIik7CisJCWxhc3QgaWYgZGVmaW5lZCAkXzsKKwkJcHJpbnQgIlxuIjsKKwl9CisKKwkkc2VuZGVyID0gJF8gaWYgKCRfKTsKKwlwcmludCAiRW1haWxzIHdpbGwgYmUgc2VudCBmcm9tOiAiLCAkc2VuZGVyLCAiXG4iOworCSRwcm9tcHRpbmcrKzsKK30KKworaWYgKCFAdG8pIHsKKworCisJd2hpbGUgKDEpIHsKKwkJJF8gPSAkdGVybS0+cmVhZGxpbmUoIldobyBzaG91bGQgdGhlIGVtYWlscyBiZSBzZW50IHRvPyAiLCAiIik7CisJCWxhc3QgaWYgZGVmaW5lZCAkXzsKKwkJcHJpbnQgIlxuIjsKKwl9CisKKwlteSAkdG8gPSAkXzsKKwlwdXNoIEB0bywgc3BsaXQgLywvLCAkdG87CisJJHByb21wdGluZysrOworfQorCitzdWIgZXhwYW5kX2FsaWFzZXMgeworCW15IEBjdXIgPSBAXzsKKwlteSBAbGFzdDsKKwlkbyB7CisJCUBsYXN0ID0gQGN1cjsKKwkJQGN1ciA9IG1hcCB7ICRhbGlhc2VzeyRffSA/IEB7JGFsaWFzZXN7JF99fSA6ICRfIH0gQGxhc3Q7CisJfSB3aGlsZSAoam9pbignLCcsQGN1cikgbmUgam9pbignLCcsQGxhc3QpKTsKKwlyZXR1cm4gQGN1cjsKK30KKworQHRvID0gZXhwYW5kX2FsaWFzZXMoQHRvKTsKK0B0byA9IChtYXAgeyBzYW5pdGl6ZV9hZGRyZXNzKCRfKSB9IEB0byk7CitAaW5pdGlhbF9jYyA9IGV4cGFuZF9hbGlhc2VzKEBpbml0aWFsX2NjKTsKK0BiY2NsaXN0ID0gZXhwYW5kX2FsaWFzZXMoQGJjY2xpc3QpOworCitpZiAoIWRlZmluZWQgJGluaXRpYWxfc3ViamVjdCAmJiAkY29tcG9zZSkgeworCXdoaWxlICgxKSB7CisJCSRfID0gJHRlcm0tPnJlYWRsaW5lKCJXaGF0IHN1YmplY3Qgc2hvdWxkIHRoZSBpbml0aWFsIGVtYWlsIHN0YXJ0IHdpdGg/ICIsICRpbml0aWFsX3N1YmplY3QpOworCQlsYXN0IGlmIGRlZmluZWQgJF87CisJCXByaW50ICJcbiI7CisJfQorCisJJGluaXRpYWxfc3ViamVjdCA9ICRfOworCSRwcm9tcHRpbmcrKzsKK30KKworaWYgKCR0aHJlYWQgJiYgIWRlZmluZWQgJGluaXRpYWxfcmVwbHlfdG8gJiYgJHByb21wdGluZykgeworCXdoaWxlICgxKSB7CisJCSRfPSAkdGVybS0+cmVhZGxpbmUoIk1lc3NhZ2UtSUQgdG8gYmUgdXNlZCBhcyBJbi1SZXBseS1UbyBmb3IgdGhlIGZpcnN0IGVtYWlsPyAiLCAkaW5pdGlhbF9yZXBseV90byk7CisJCWxhc3QgaWYgZGVmaW5lZCAkXzsKKwkJcHJpbnQgIlxuIjsKKwl9CisKKwkkaW5pdGlhbF9yZXBseV90byA9ICRfOworfQoraWYgKGRlZmluZWQgJGluaXRpYWxfcmVwbHlfdG8pIHsKKwkkaW5pdGlhbF9yZXBseV90byA9fiBzL15ccyo8Py8vOworCSRpbml0aWFsX3JlcGx5X3RvID1+IHMvPj9ccyokLy87CisJJGluaXRpYWxfcmVwbHlfdG8gPSAiPCRpbml0aWFsX3JlcGx5X3RvPiIgaWYgJGluaXRpYWxfcmVwbHlfdG8gbmUgJyc7Cit9CisKK2lmICghZGVmaW5lZCAkc210cF9zZXJ2ZXIpIHsKKwlmb3JlYWNoIChxdyggL3Vzci9zYmluL3NlbmRtYWlsIC91c3IvbGliL3NlbmRtYWlsICkpIHsKKwkJaWYgKC14ICRfKSB7CisJCQkkc210cF9zZXJ2ZXIgPSAkXzsKKwkJCWxhc3Q7CisJCX0KKwl9CisJJHNtdHBfc2VydmVyIHx8PSAnbG9jYWxob3N0JzsgIyBjb3VsZCBiZSAxMjcuMC4wLjEsIHRvby4uLiAqc2hydWcqCit9CisKK2lmICgkY29tcG9zZSkgeworCSMgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgbmVlZCB0byBiZSBzZWN1cmUsIGJ1dCB3ZSB3aWxsIG1ha2UgYSBzbWFsbAorCSMgZWZmb3J0IHRvIGhhdmUgaXQgYmUgdW5pcXVlCisJb3BlbihDLCI+IiwkY29tcG9zZV9maWxlbmFtZSkKKwkJb3IgZGllICJGYWlsZWQgdG8gb3BlbiBmb3Igd3JpdGluZyAkY29tcG9zZV9maWxlbmFtZTogJCEiOworCXByaW50IEMgIkZyb20gJHNlbmRlciAjIFRoaXMgbGluZSBpcyBpZ25vcmVkLlxuIjsKKwlwcmludGYgQyAiU3ViamVjdDogJXNcblxuIiwgJGluaXRpYWxfc3ViamVjdDsKKwlwcmludGYgQyA8PEVPVDsKK0dJVDogUGxlYXNlIGVudGVyIHlvdXIgZW1haWwgYmVsb3cuCitHSVQ6IExpbmVzIGJlZ2lubmluZyBpbiAiR0lUOiAiIHdpbGwgYmUgcmVtb3ZlZC4KK0dJVDogQ29uc2lkZXIgaW5jbHVkaW5nIGFuIG92ZXJhbGwgZGlmZnN0YXQgb3IgdGFibGUgb2YgY29udGVudHMKK0dJVDogZm9yIHRoZSBwYXRjaCB5b3UgYXJlIHdyaXRpbmcuCisKK0VPVAorCWNsb3NlKEMpOworCisJbXkgJGVkaXRvciA9ICRFTlZ7R0lUX0VESVRPUn0gfHwgJHJlcG8tPmNvbmZpZygiY29yZS5lZGl0b3IiKSB8fCAkRU5We1ZJU1VBTH0gfHwgJEVOVntFRElUT1J9IHx8ICJ2aSI7CisJc3lzdGVtKCdzaCcsICctYycsICckMCAkQCcsICRlZGl0b3IsICRjb21wb3NlX2ZpbGVuYW1lKTsKKworCW9wZW4oQzIsIj4iLCRjb21wb3NlX2ZpbGVuYW1lIC4gIi5maW5hbCIpCisJCW9yIGRpZSAiRmFpbGVkIHRvIG9wZW4gJGNvbXBvc2VfZmlsZW5hbWUuZmluYWwgOiAiIC4gJCE7CisKKwlvcGVuKEMsIjwiLCRjb21wb3NlX2ZpbGVuYW1lKQorCQlvciBkaWUgIkZhaWxlZCB0byBvcGVuICRjb21wb3NlX2ZpbGVuYW1lIDogIiAuICQhOworCisJd2hpbGUoPEM+KSB7CisJCW5leHQgaWYgbS9eR0lUOiAvOworCQlwcmludCBDMiAkXzsKKwl9CisJY2xvc2UoQyk7CisJY2xvc2UoQzIpOworCisJd2hpbGUgKDEpIHsKKwkJJF8gPSAkdGVybS0+cmVhZGxpbmUoIlNlbmQgdGhpcyBlbWFpbD8gKHl8bikgIik7CisJCWxhc3QgaWYgZGVmaW5lZCAkXzsKKwkJcHJpbnQgIlxuIjsKKwl9CisKKwlpZiAodWMgc3Vic3RyKCRfLDAsMSkgbmUgJ1knKSB7CisJCWNsZWFudXBfY29tcG9zZV9maWxlcygpOworCQlleGl0KDApOworCX0KKworCUBmaWxlcyA9ICgkY29tcG9zZV9maWxlbmFtZSAuICIuZmluYWwiLCBAZmlsZXMpOworfQorCisjIFZhcmlhYmxlcyB3ZSBzZXQgYXMgcGFydCBvZiB0aGUgbG9vcCBvdmVyIGZpbGVzCitvdXIgKCRtZXNzYWdlX2lkLCAlbWFpbCwgJHN1YmplY3QsICRyZXBseV90bywgJHJlZmVyZW5jZXMsICRtZXNzYWdlKTsKKworc3ViIGV4dHJhY3RfdmFsaWRfYWRkcmVzcyB7CisJbXkgJGFkZHJlc3MgPSBzaGlmdDsKKwlteSAkbG9jYWxfcGFydF9yZWdleHAgPSAnW148PiJcc0BdKyc7CisJbXkgJGRvbWFpbl9yZWdleHAgPSAnW14uPD4iXHNAXSsoPzpcLlteLjw+IlxzQF0rKSsnOworCisJIyBjaGVjayBmb3IgYSBsb2NhbCBhZGRyZXNzOgorCXJldHVybiAkYWRkcmVzcyBpZiAoJGFkZHJlc3MgPX4gL14oJGxvY2FsX3BhcnRfcmVnZXhwKSQvKTsKKworCSRhZGRyZXNzID1+IHMvXlxzKjwoLiopPlxzKiQvJDEvOworCWlmICgkaGF2ZV9lbWFpbF92YWxpZCkgeworCQlyZXR1cm4gc2NhbGFyIEVtYWlsOjpWYWxpZC0+YWRkcmVzcygkYWRkcmVzcyk7CisJfSBlbHNlIHsKKwkJIyBsZXNzIHJvYnVzdC9jb3JyZWN0IHRoYW4gdGhlIG1vbnN0ZXIgcmVnZXhwIGluIEVtYWlsOjpWYWxpZCwKKwkJIyBidXQgc3RpbGwgZG9lcyBhIDk5JSBqb2IsIGFuZCBvbmUgbGVzcyBkZXBlbmRlbmN5CisJCSRhZGRyZXNzID1+IC8oJGxvY2FsX3BhcnRfcmVnZXhwXEAkZG9tYWluX3JlZ2V4cCkvOworCQlyZXR1cm4gJDE7CisJfQorfQorCisjIFVzdWFsbHkgZG9uJ3QgbmVlZCB0byBjaGFuZ2UgYW55dGhpbmcgYmVsb3cgaGVyZS4KKworIyB3ZSBtYWtlIGEgImZha2UiIG1lc3NhZ2UgaWQgYnkgdGFraW5nIHRoZSBjdXJyZW50IG51bWJlcgorIyBvZiBzZWNvbmRzIHNpbmNlIHRoZSBiZWdpbm5pbmcgb2YgVW5peCB0aW1lIGFuZCB0YWNraW5nIG9uCisjIGEgcmFuZG9tIG51bWJlciB0byB0aGUgZW5kLCBpbiBjYXNlIHdlIGFyZSBjYWxsZWQgcXVpY2tlciB0aGFuCisjIDEgc2Vjb25kIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2Ugd2VyZSBjYWxsZWQuCisKKyMgV2UnbGwgc2V0dXAgYSB0ZW1wbGF0ZSBmb3IgdGhlIG1lc3NhZ2UgaWQsIHVzaW5nIHRoZSAiZnJvbSIgYWRkcmVzczoKKworbXkgKCRtZXNzYWdlX2lkX3N0YW1wLCAkbWVzc2FnZV9pZF9zZXJpYWwpOworc3ViIG1ha2VfbWVzc2FnZV9pZAoreworCW15ICR1bmlxOworCWlmICghZGVmaW5lZCAkbWVzc2FnZV9pZF9zdGFtcCkgeworCQkkbWVzc2FnZV9pZF9zdGFtcCA9IHNwcmludGYoIiVzLSVzIiwgdGltZSwgJCQpOworCQkkbWVzc2FnZV9pZF9zZXJpYWwgPSAwOworCX0KKwkkbWVzc2FnZV9pZF9zZXJpYWwrKzsKKwkkdW5pcSA9ICIkbWVzc2FnZV9pZF9zdGFtcC0kbWVzc2FnZV9pZF9zZXJpYWwiOworCisJbXkgJGR1X3BhcnQ7CisJZm9yICgkc2VuZGVyLCAkcmVwb2NvbW1pdHRlciwgJHJlcG9hdXRob3IpIHsKKwkJJGR1X3BhcnQgPSBleHRyYWN0X3ZhbGlkX2FkZHJlc3Moc2FuaXRpemVfYWRkcmVzcygkXykpOworCQlsYXN0IGlmIChkZWZpbmVkICRkdV9wYXJ0IGFuZCAkZHVfcGFydCBuZSAnJyk7CisJfQorCWlmIChub3QgZGVmaW5lZCAkZHVfcGFydCBvciAkZHVfcGFydCBlcSAnJykgeworCQl1c2UgU3lzOjpIb3N0bmFtZSBxdygpOworCQkkZHVfcGFydCA9ICd1c2VyQCcgLiBTeXM6Okhvc3RuYW1lOjpob3N0bmFtZSgpOworCX0KKwlteSAkbWVzc2FnZV9pZF90ZW1wbGF0ZSA9ICI8JXMtZ2l0LXNlbmQtZW1haWwtJXM+IjsKKwkkbWVzc2FnZV9pZCA9IHNwcmludGYoJG1lc3NhZ2VfaWRfdGVtcGxhdGUsICR1bmlxLCAkZHVfcGFydCk7CisJI3ByaW50ICJuZXcgbWVzc2FnZSBpZCA9ICRtZXNzYWdlX2lkXG4iOyAjIFdhcyB1c2VmdWwgZm9yIGRlYnVnZ2luZworfQorCisKKworJHRpbWUgPSB0aW1lIC0gc2NhbGFyICQjZmlsZXM7CisKK3N1YiB1bnF1b3RlX3JmYzIwNDcgeworCWxvY2FsICgkXykgPSBAXzsKKwlteSAkZW5jb2Rpbmc7CisJaWYgKHMvPVw/KFteP10rKVw/cVw/KC4qKVw/PS8kMi9nKSB7CisJCSRlbmNvZGluZyA9ICQxOworCQlzL18vIC9nOworCQlzLz0oWzAtOUEtRl17Mn0pL2NocihoZXgoJDEpKS9lZzsKKwl9CisJcmV0dXJuIHdhbnRhcnJheSA/ICgkXywgJGVuY29kaW5nKSA6ICRfOworfQorCisjIHVzZSB0aGUgc2ltcGxlc3QgcXVvdGluZyBiZWluZyBhYmxlIHRvIGhhbmRsZSB0aGUgcmVjaXBpZW50CitzdWIgc2FuaXRpemVfYWRkcmVzcworeworCW15ICgkcmVjaXBpZW50KSA9IEBfOworCW15ICgkcmVjaXBpZW50X25hbWUsICRyZWNpcGllbnRfYWRkcikgPSAoJHJlY2lwaWVudCA9fiAvXiguKj8pXHMqKDwuKikvKTsKKworCWlmIChub3QgJHJlY2lwaWVudF9uYW1lKSB7CisJCXJldHVybiAiJHJlY2lwaWVudCI7CisJfQorCisJIyBpZiByZWNpcGllbnRfbmFtZSBpcyBhbHJlYWR5IHF1b3RlZCwgZG8gbm90aGluZworCWlmICgkcmVjaXBpZW50X25hbWUgPX4gL14oIi4qInw9XD91dGYtOFw/cVw/LipcPz0pJC8pIHsKKwkJcmV0dXJuICRyZWNpcGllbnQ7CisJfQorCisJIyByZmMyMDQ3IGlzIG5lZWRlZCBpZiBhIG5vbi1hc2NpaSBjaGFyIGlzIGluY2x1ZGVkCisJaWYgKCRyZWNpcGllbnRfbmFtZSA9fiAvW15bOmFzY2lpOl1dLykgeworCQkkcmVjaXBpZW50X25hbWUgPX4gcy8oW14tYS16QS1aMC05ISorXC9dKS9zcHJpbnRmKCI9JTAyWCIsIG9yZCgkMSkpL2VnOworCQkkcmVjaXBpZW50X25hbWUgPX4gcy8oLiopLz1cP3V0Zi04XD9xXD8kMVw/PS87CisJfQorCisJIyBkb3VibGUgcXVvdGVzIGFyZSBuZWVkZWQgaWYgc3BlY2lhbHMgb3IgQ1RMcyBhcmUgaW5jbHVkZWQKKwllbHNpZiAoJHJlY2lwaWVudF9uYW1lID1+IC9bXVsoKTw+QCw7OlxcIi5cMDAwLVwwMzdcMTc3XS8pIHsKKwkJJHJlY2lwaWVudF9uYW1lID1+IHMvKFsiXFxccl0pL1xcJDEvOworCQkkcmVjaXBpZW50X25hbWUgPSAiXCIkcmVjaXBpZW50X25hbWVcIiI7CisJfQorCisJcmV0dXJuICIkcmVjaXBpZW50X25hbWUgJHJlY2lwaWVudF9hZGRyIjsKKworfQorCitzdWIgc2VuZF9tZXNzYWdlCit7CisJbXkgQHJlY2lwaWVudHMgPSB1bmlxdWVfZW1haWxfbGlzdChAdG8pOworCUBjYyA9IChncmVwIHsgbXkgJGNjID0gZXh0cmFjdF92YWxpZF9hZGRyZXNzKCRfKTsKKwkJICAgICAgbm90IGdyZXAgeyAkY2MgZXEgJF8gfSBAcmVjaXBpZW50cworCQkgICAgfQorCSAgICAgICBtYXAgeyBzYW5pdGl6ZV9hZGRyZXNzKCRfKSB9CisJICAgICAgIEBjYyk7CisJbXkgJHRvID0gam9pbiAoIixcblx0IiwgQHJlY2lwaWVudHMpOworCUByZWNpcGllbnRzID0gdW5pcXVlX2VtYWlsX2xpc3QoQHJlY2lwaWVudHMsQGNjLEBiY2NsaXN0KTsKKwlAcmVjaXBpZW50cyA9IChtYXAgeyBleHRyYWN0X3ZhbGlkX2FkZHJlc3MoJF8pIH0gQHJlY2lwaWVudHMpOworCW15ICRkYXRlID0gZm9ybWF0XzI4MjJfdGltZSgkdGltZSsrKTsKKwlteSAkZ2l0dmVyc2lvbiA9ICdAQEdJVF9WRVJTSU9OQEAnOworCWlmICgkZ2l0dmVyc2lvbiA9fiBtLy4uR0lUX1ZFUlNJT04uLi8pIHsKKwkgICAgJGdpdHZlcnNpb24gPSBHaXQ6OnZlcnNpb24oKTsKKwl9CisKKwlteSAkY2MgPSBqb2luKCIsICIsIHVuaXF1ZV9lbWFpbF9saXN0KEBjYykpOworCW15ICRjY2xpbmUgPSAiIjsKKwlpZiAoJGNjIG5lICcnKSB7CisJCSRjY2xpbmUgPSAiXG5DYzogJGNjIjsKKwl9CisJbXkgJHNhbml0aXplZF9zZW5kZXIgPSBzYW5pdGl6ZV9hZGRyZXNzKCRzZW5kZXIpOworCW1ha2VfbWVzc2FnZV9pZCgpIHVubGVzcyBkZWZpbmVkKCRtZXNzYWdlX2lkKTsKKworCW15ICRoZWFkZXIgPSAiRnJvbTogJHNhbml0aXplZF9zZW5kZXIKK1RvOiAkdG8ke2NjbGluZX0KK1N1YmplY3Q6ICRzdWJqZWN0CitEYXRlOiAkZGF0ZQorTWVzc2FnZS1JZDogJG1lc3NhZ2VfaWQKK1gtTWFpbGVyOiBnaXQtc2VuZC1lbWFpbCAkZ2l0dmVyc2lvbgorIjsKKwlpZiAoJHRocmVhZCAmJiAkcmVwbHlfdG8pIHsKKworCQkkaGVhZGVyIC49ICJJbi1SZXBseS1UbzogJHJlcGx5X3RvXG4iOworCQkkaGVhZGVyIC49ICJSZWZlcmVuY2VzOiAkcmVmZXJlbmNlc1xuIjsKKwl9CisJaWYgKEB4aCkgeworCQkkaGVhZGVyIC49IGpvaW4oIlxuIiwgQHhoKSAuICJcbiI7CisJfQorCisJbXkgQHNlbmRtYWlsX3BhcmFtZXRlcnMgPSAoJy1pJywgQHJlY2lwaWVudHMpOworCW15ICRyYXdfZnJvbSA9ICRzYW5pdGl6ZWRfc2VuZGVyOworCSRyYXdfZnJvbSA9ICRlbnZlbG9wZV9zZW5kZXIgaWYgKGRlZmluZWQgJGVudmVsb3BlX3NlbmRlcik7CisJJHJhd19mcm9tID0gZXh0cmFjdF92YWxpZF9hZGRyZXNzKCRyYXdfZnJvbSk7CisJdW5zaGlmdCAoQHNlbmRtYWlsX3BhcmFtZXRlcnMsCisJCQknLWYnLCAkcmF3X2Zyb20pIGlmKGRlZmluZWQgJGVudmVsb3BlX3NlbmRlcik7CisKKwlpZiAoJGRyeV9ydW4pIHsKKwkJIyBXZSBkb24ndCB3YW50IHRvIHNlbmQgdGhlIGVtYWlsLgorCX0gZWxzaWYgKCRzbXRwX3NlcnZlciA9fiBtI14vIykgeworCQlteSAkcGlkID0gb3BlbiBteSAkc20sICd8LSc7CisJCWRlZmluZWQgJHBpZCBvciBkaWUgJCE7CisJCWlmICghJHBpZCkgeworCQkJZXhlYygkc210cF9zZXJ2ZXIsIEBzZW5kbWFpbF9wYXJhbWV0ZXJzKSBvciBkaWUgJCE7CisJCX0KKwkJcHJpbnQgJHNtICIkaGVhZGVyXG4kbWVzc2FnZSI7CisJCWNsb3NlICRzbSBvciBkaWUgJD87CisJfSBlbHNlIHsKKworCQlpZiAoIWRlZmluZWQgJHNtdHBfc2VydmVyKSB7CisJCQlkaWUgIlRoZSByZXF1aXJlZCBTTVRQIHNlcnZlciBpcyBub3QgcHJvcGVybHkgZGVmaW5lZC4iCisJCX0KKworCQlpZiAoJHNtdHBfc3NsKSB7CisJCQkkc210cF9zZXJ2ZXJfcG9ydCB8fD0gNDY1OyAjIHNzbXRwCisJCQlyZXF1aXJlIE5ldDo6U01UUDo6U1NMOworCQkJJHNtdHAgfHw9IE5ldDo6U01UUDo6U1NMLT5uZXcoJHNtdHBfc2VydmVyLCBQb3J0ID0+ICRzbXRwX3NlcnZlcl9wb3J0KTsKKwkJfQorCQllbHNlIHsKKwkJCXJlcXVpcmUgTmV0OjpTTVRQOworCQkJJHNtdHAgfHw9IE5ldDo6U01UUC0+bmV3KChkZWZpbmVkICRzbXRwX3NlcnZlcl9wb3J0KQorCQkJCQkJID8gIiRzbXRwX3NlcnZlcjokc210cF9zZXJ2ZXJfcG9ydCIKKwkJCQkJCSA6ICRzbXRwX3NlcnZlcik7CisJCX0KKworCQlpZiAoISRzbXRwKSB7CisJCQlkaWUgIlVuYWJsZSB0byBpbml0aWFsaXplIFNNVFAgcHJvcGVybHkuICBJcyB0aGVyZSBzb21ldGhpbmcgd3Jvbmcgd2l0aCB5b3VyIGNvbmZpZz8iOworCQl9CisKKwkJaWYgKGRlZmluZWQgJHNtdHBfYXV0aHVzZXIpIHsKKworCQkJaWYgKCFkZWZpbmVkICRzbXRwX2F1dGhwYXNzKSB7CisKKwkJCQlzeXN0ZW0gInN0dHkgLWVjaG8iOworCisJCQkJZG8geworCQkJCQlwcmludCAiUGFzc3dvcmQ6ICI7CisJCQkJCSRfID0gPFNURElOPjsKKwkJCQkJcHJpbnQgIlxuIjsKKwkJCQl9IHdoaWxlICghZGVmaW5lZCAkXyk7CisKKwkJCQljaG9tcCgkc210cF9hdXRocGFzcyA9ICRfKTsKKworCQkJCXN5c3RlbSAic3R0eSBlY2hvIjsKKwkJCX0KKworCQkJJGF1dGggfHw9ICRzbXRwLT5hdXRoKCAkc210cF9hdXRodXNlciwgJHNtdHBfYXV0aHBhc3MgKSBvciBkaWUgJHNtdHAtPm1lc3NhZ2U7CisJCX0KKworCQkkc210cC0+bWFpbCggJHJhd19mcm9tICkgb3IgZGllICRzbXRwLT5tZXNzYWdlOworCQkkc210cC0+dG8oIEByZWNpcGllbnRzICkgb3IgZGllICRzbXRwLT5tZXNzYWdlOworCQkkc210cC0+ZGF0YSBvciBkaWUgJHNtdHAtPm1lc3NhZ2U7CisJCSRzbXRwLT5kYXRhc2VuZCgiJGhlYWRlclxuJG1lc3NhZ2UiKSBvciBkaWUgJHNtdHAtPm1lc3NhZ2U7CisJCSRzbXRwLT5kYXRhZW5kKCkgb3IgZGllICRzbXRwLT5tZXNzYWdlOworCQkkc210cC0+b2sgb3IgZGllICJGYWlsZWQgdG8gc2VuZCAkc3ViamVjdFxuIi4kc210cC0+bWVzc2FnZTsKKwl9CisJaWYgKCRxdWlldCkgeworCQlwcmludGYgKCgkZHJ5X3J1biA/ICJEcnktIiA6ICIiKS4iU2VudCAlc1xuIiwgJHN1YmplY3QpOworCX0gZWxzZSB7CisJCXByaW50ICgoJGRyeV9ydW4gPyAiRHJ5LSIgOiAiIikuIk9LLiBMb2cgc2F5czpcbiIpOworCQlpZiAoJHNtdHBfc2VydmVyICF+IG0jXi8jKSB7CisJCQlwcmludCAiU2VydmVyOiAkc210cF9zZXJ2ZXJcbiI7CisJCQlwcmludCAiTUFJTCBGUk9NOjwkcmF3X2Zyb20+XG4iOworCQkJcHJpbnQgIlJDUFQgVE86Ii5qb2luKCcsJywobWFwIHsgIjwkXz4iIH0gQHJlY2lwaWVudHMpKS4iXG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIlNlbmRtYWlsOiAkc210cF9zZXJ2ZXIgIi5qb2luKCcgJyxAc2VuZG1haWxfcGFyYW1ldGVycykuIlxuIjsKKwkJfQorCQlwcmludCAkaGVhZGVyLCAiXG4iOworCQlpZiAoJHNtdHApIHsKKwkJCXByaW50ICJSZXN1bHQ6ICIsICRzbXRwLT5jb2RlLCAnICcsCisJCQkJKCRzbXRwLT5tZXNzYWdlID1+IC9cbihbXlxuXStcbikkL3MpLCAiXG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIlJlc3VsdDogT0tcbiI7CisJCX0KKwl9Cit9CisKKyRyZXBseV90byA9ICRpbml0aWFsX3JlcGx5X3RvOworJHJlZmVyZW5jZXMgPSAkaW5pdGlhbF9yZXBseV90byB8fCAnJzsKKyRzdWJqZWN0ID0gJGluaXRpYWxfc3ViamVjdDsKKworZm9yZWFjaCBteSAkdCAoQGZpbGVzKSB7CisJb3BlbihGLCI8IiwkdCkgb3IgZGllICJjYW4ndCBvcGVuIGZpbGUgJHQiOworCisJbXkgJGF1dGhvciA9IHVuZGVmOworCW15ICRhdXRob3JfZW5jb2Rpbmc7CisJbXkgJGhhc19jb250ZW50X3R5cGU7CisJbXkgJGJvZHlfZW5jb2Rpbmc7CisJQGNjID0gQGluaXRpYWxfY2M7CisJQHhoID0gKCk7CisJbXkgJGlucHV0X2Zvcm1hdCA9IHVuZGVmOworCW15ICRoZWFkZXJfZG9uZSA9IDA7CisJJG1lc3NhZ2UgPSAiIjsKKwl3aGlsZSg8Rj4pIHsKKwkJaWYgKCEkaGVhZGVyX2RvbmUpIHsKKwkJCWlmICgvXkZyb20gLykgeworCQkJCSRpbnB1dF9mb3JtYXQgPSAnbWJveCc7CisJCQkJbmV4dDsKKwkJCX0KKwkJCWNob21wOworCQkJaWYgKCFkZWZpbmVkICRpbnB1dF9mb3JtYXQgJiYgL15bLUEtWmEtel0rOlxzLykgeworCQkJCSRpbnB1dF9mb3JtYXQgPSAnbWJveCc7CisJCQl9CisKKwkJCWlmIChkZWZpbmVkICRpbnB1dF9mb3JtYXQgJiYgJGlucHV0X2Zvcm1hdCBlcSAnbWJveCcpIHsKKwkJCQlpZiAoL15TdWJqZWN0OlxzKyguKikkLykgeworCQkJCQkkc3ViamVjdCA9ICQxOworCisJCQkJfSBlbHNpZiAoL14oQ2N8RnJvbSk6XHMrKC4qKSQvKSB7CisJCQkJCWlmICh1bnF1b3RlX3JmYzIwNDcoJDIpIGVxICRzZW5kZXIpIHsKKwkJCQkJCW5leHQgaWYgKCRzdXBwcmVzc19jY3snc2VsZid9KTsKKwkJCQkJfQorCQkJCQllbHNpZiAoJDEgZXEgJ0Zyb20nKSB7CisJCQkJCQkoJGF1dGhvciwgJGF1dGhvcl9lbmNvZGluZykKKwkJCQkJCSAgPSB1bnF1b3RlX3JmYzIwNDcoJDIpOworCQkJCQkJbmV4dCBpZiAoJHN1cHByZXNzX2NjeydhdXRob3InfSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQluZXh0IGlmICgkc3VwcHJlc3NfY2N7J2NjJ30pOworCQkJCQl9CisJCQkJCXByaW50ZigiKG1ib3gpIEFkZGluZyBjYzogJXMgZnJvbSBsaW5lICclcydcbiIsCisJCQkJCQkkMiwgJF8pIHVubGVzcyAkcXVpZXQ7CisJCQkJCXB1c2ggQGNjLCAkMjsKKwkJCQl9CisJCQkJZWxzaWYgKC9eQ29udGVudC10eXBlOi9pKSB7CisJCQkJCSRoYXNfY29udGVudF90eXBlID0gMTsKKwkJCQkJaWYgKC9jaGFyc2V0PSI/W14gIl0rLykgeworCQkJCQkJJGJvZHlfZW5jb2RpbmcgPSAkMTsKKwkJCQkJfQorCQkJCQlwdXNoIEB4aCwgJF87CisJCQkJfQorCQkJCWVsc2lmICgvXk1lc3NhZ2UtSWQ6ICguKikvaSkgeworCQkJCQkkbWVzc2FnZV9pZCA9ICQxOworCQkJCX0KKwkJCQllbHNpZiAoIS9eRGF0ZTpccy8gJiYgL15bLUEtWmEtel0rOlxzK1xTLykgeworCQkJCQlwdXNoIEB4aCwgJF87CisJCQkJfQorCisJCQl9IGVsc2UgeworCQkJCSMgSW4gdGhlIHRyYWRpdGlvbmFsCisJCQkJIyAic2VuZCBsb3RzIG9mIGVtYWlsIiBmb3JtYXQsCisJCQkJIyBsaW5lIDEgPSBjYworCQkJCSMgbGluZSAyID0gc3ViamVjdAorCQkJCSMgU28gbGV0J3Mgc3VwcG9ydCB0aGF0LCB0b28uCisJCQkJJGlucHV0X2Zvcm1hdCA9ICdsb3RzJzsKKwkJCQlpZiAoQGNjID09IDAgJiYgISRzdXBwcmVzc19jY3snY2MnfSkgeworCQkJCQlwcmludGYoIihub24tbWJveCkgQWRkaW5nIGNjOiAlcyBmcm9tIGxpbmUgJyVzJ1xuIiwKKwkJCQkJCSRfLCAkXykgdW5sZXNzICRxdWlldDsKKworCQkJCQlwdXNoIEBjYywgJF87CisKKwkJCQl9IGVsc2lmICghZGVmaW5lZCAkc3ViamVjdCkgeworCQkJCQkkc3ViamVjdCA9ICRfOworCQkJCX0KKwkJCX0KKworCQkJIyBBIHdoaXRlc3BhY2UgbGluZSB3aWxsIHRlcm1pbmF0ZSB0aGUgaGVhZGVycworCQkJaWYgKG0vXlxzKiQvKSB7CisJCQkJJGhlYWRlcl9kb25lID0gMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCSRtZXNzYWdlIC49ICAkXzsKKwkJCWlmICgvXihTaWduZWQtb2ZmLWJ5fENjKTogKC4qKSQvaSkgeworCQkJCW5leHQgaWYgKCRzdXBwcmVzc19jY3snc29iJ30pOworCQkJCWNob21wOworCQkJCW15ICRjID0gJDI7CisJCQkJY2hvbXAgJGM7CisJCQkJbmV4dCBpZiAoJGMgZXEgJHNlbmRlciBhbmQgJHN1cHByZXNzX2NjeydzZWxmJ30pOworCQkJCXB1c2ggQGNjLCAkYzsKKwkJCQlwcmludGYoIihzb2IpIEFkZGluZyBjYzogJXMgZnJvbSBsaW5lICclcydcbiIsCisJCQkJCSRjLCAkXykgdW5sZXNzICRxdWlldDsKKwkJCX0KKwkJfQorCX0KKwljbG9zZSBGOworCisJaWYgKGRlZmluZWQgJGNjX2NtZCAmJiAhJHN1cHByZXNzX2NjeydjY2NtZCd9KSB7CisJCW9wZW4oRiwgIiRjY19jbWQgJHQgfCIpCisJCQlvciBkaWUgIihjYy1jbWQpIENvdWxkIG5vdCBleGVjdXRlICckY2NfY21kJyI7CisJCXdoaWxlKDxGPikgeworCQkJbXkgJGMgPSAkXzsKKwkJCSRjID1+IHMvXlxzKi8vZzsKKwkJCSRjID1+IHMvXG4kLy9nOworCQkJbmV4dCBpZiAoJGMgZXEgJHNlbmRlciBhbmQgJHN1cHByZXNzX2Zyb20pOworCQkJcHVzaCBAY2MsICRjOworCQkJcHJpbnRmKCIoY2MtY21kKSBBZGRpbmcgY2M6ICVzIGZyb206ICclcydcbiIsCisJCQkJJGMsICRjY19jbWQpIHVubGVzcyAkcXVpZXQ7CisJCX0KKwkJY2xvc2UgRgorCQkJb3IgZGllICIoY2MtY21kKSBmYWlsZWQgdG8gY2xvc2UgcGlwZSB0byAnJGNjX2NtZCciOworCX0KKworCWlmIChkZWZpbmVkICRhdXRob3IpIHsKKwkJJG1lc3NhZ2UgPSAiRnJvbTogJGF1dGhvclxuXG4kbWVzc2FnZSI7CisJCWlmIChkZWZpbmVkICRhdXRob3JfZW5jb2RpbmcpIHsKKwkJCWlmICgkaGFzX2NvbnRlbnRfdHlwZSkgeworCQkJCWlmICgkYm9keV9lbmNvZGluZyBlcSAkYXV0aG9yX2VuY29kaW5nKSB7CisJCQkJCSMgb2ssIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQgZW5jb2RpbmcKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCSMgdWggb2gsIHdlIHNob3VsZCByZS1lbmNvZGUKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQlwdXNoIEB4aCwKKwkJCQkgICdNSU1FLVZlcnNpb246IDEuMCcsCisJCQkJICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSRhdXRob3JfZW5jb2RpbmciLAorCQkJCSAgJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQnOworCQkJfQorCQl9CisJfQorCisJc2VuZF9tZXNzYWdlKCk7CisKKwkjIHNldCB1cCBmb3IgdGhlIG5leHQgbWVzc2FnZQorCWlmICgkY2hhaW5fcmVwbHlfdG8gfHwgIWRlZmluZWQgJHJlcGx5X3RvIHx8IGxlbmd0aCgkcmVwbHlfdG8pID09IDApIHsKKwkJJHJlcGx5X3RvID0gJG1lc3NhZ2VfaWQ7CisJCWlmIChsZW5ndGggJHJlZmVyZW5jZXMgPiAwKSB7CisJCQkkcmVmZXJlbmNlcyAuPSAiXG4gJG1lc3NhZ2VfaWQiOworCQl9IGVsc2UgeworCQkJJHJlZmVyZW5jZXMgPSAiJG1lc3NhZ2VfaWQiOworCQl9CisJfQorCSRtZXNzYWdlX2lkID0gdW5kZWY7Cit9CisKK2lmICgkY29tcG9zZSkgeworCWNsZWFudXBfY29tcG9zZV9maWxlcygpOworfQorCitzdWIgY2xlYW51cF9jb21wb3NlX2ZpbGVzKCkgeworCXVubGluaygkY29tcG9zZV9maWxlbmFtZSwgJGNvbXBvc2VfZmlsZW5hbWUgLiAiLmZpbmFsIik7CisKK30KKworJHNtdHAtPnF1aXQgaWYgJHNtdHA7CisKK3N1YiB1bmlxdWVfZW1haWxfbGlzdChAKSB7CisJbXkgJXNlZW47CisJbXkgQGVtYWlsczsKKworCWZvcmVhY2ggbXkgJGVudHJ5IChAXykgeworCQlpZiAobXkgJGNsZWFuID0gZXh0cmFjdF92YWxpZF9hZGRyZXNzKCRlbnRyeSkpIHsKKwkJCSRzZWVueyRjbGVhbn0gfHw9IDA7CisJCQluZXh0IGlmICRzZWVueyRjbGVhbn0rKzsKKwkJCXB1c2ggQGVtYWlscywgJGVudHJ5OworCQl9IGVsc2UgeworCQkJcHJpbnQgU1RERVJSICJXOiB1bmFibGUgdG8gZXh0cmFjdCBhIHZhbGlkIGFkZHJlc3MiLAorCQkJCQkiIGZyb206ICRlbnRyeVxuIjsKKwkJfQorCX0KKwlyZXR1cm4gQGVtYWlsczsKK30KKworc3ViIHZhbGlkYXRlX3BhdGNoIHsKKwlteSAkZm4gPSBzaGlmdDsKKwlvcGVuKG15ICRmaCwgJzwnLCAkZm4pCisJCW9yIGRpZSAidW5hYmxlIHRvIG9wZW4gJGZuOiAkIVxuIjsKKwl3aGlsZSAobXkgJGxpbmUgPSA8JGZoPikgeworCQlpZiAobGVuZ3RoKCRsaW5lKSA+IDk5OCkgeworCQkJcmV0dXJuICIkLjogcGF0Y2ggY29udGFpbnMgYSBsaW5lIGxvbmdlciB0aGFuIDk5OCBjaGFyYWN0ZXJzIjsKKwkJfQorCX0KKwlyZXR1cm4gdW5kZWY7Cit9CmRpZmYgLS1naXQgYS9naXQtc2gtc2V0dXAuc2ggYi9naXQtc2gtc2V0dXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTQ0YjFjNwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1zaC1zZXR1cC5zaApAQCAtMCwwICsxLDE0NCBAQAorIyEvYmluL3NoCisjCisjIFRoaXMgaXMgaW5jbHVkZWQgaW4gY29tbWFuZHMgdGhhdCBlaXRoZXIgaGF2ZSB0byBiZSBydW4gZnJvbSB0aGUgdG9wbGV2ZWwKKyMgb2YgdGhlIHJlcG9zaXRvcnksIG9yIHdpdGggR0lUX0RJUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBwcm9wZXJseS4KKyMgSWYgdGhlIEdJVF9ESVIgZG9lcyBub3QgbG9vayBsaWtlIHRoZSByaWdodCBjb3JyZWN0IGdpdC1yZXBvc2l0b3J5LAorIyBpdCBkaWVzLgorCisjIEhhdmluZyB0aGlzIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgd291bGQgYnJlYWsgc2NyaXB0cyBiZWNhdXNlCisjIHlvdSB3b3VsZCBjYXVzZSAiY2QiIHRvIGJlIHRha2VuIHRvIHVuZXhwZWN0ZWQgcGxhY2VzLiAgSWYgeW91CisjIGxpa2UgQ0RQQVRILCBkZWZpbmUgaXQgZm9yIHlvdXIgaW50ZXJhY3RpdmUgc2hlbGwgc2Vzc2lvbnMgd2l0aG91dAorIyBleHBvcnRpbmcgaXQuCit1bnNldCBDRFBBVEgKKworZGllKCkgeworCWVjaG8gPiYyICIkQCIKKwlleGl0IDEKK30KKworaWYgdGVzdCAtbiAiJE9QVElPTlNfU1BFQyI7IHRoZW4KKwl1c2FnZSgpIHsKKwkJIiQwIiAtaAorCQlleGl0IDEKKwl9CisKKwlwYXJzZW9wdF9leHRyYT0KKwlbIC1uICIkT1BUSU9OU19LRUVQREFTSERBU0giIF0gJiYKKwkJcGFyc2VvcHRfZXh0cmE9Ii0ta2VlcC1kYXNoZGFzaCIKKworCWV2YWwgIiQoCisJCWVjaG8gIiRPUFRJT05TX1NQRUMiIHwKKwkJCWdpdCByZXYtcGFyc2UgLS1wYXJzZW9wdCAkcGFyc2VvcHRfZXh0cmEgLS0gIiRAIiB8fAorCQllY2hvIGV4aXQgJD8KKwkpIgorZWxzZQorCXVzYWdlKCkgeworCQlkaWUgIlVzYWdlOiAkMCAkVVNBR0UiCisJfQorCisJaWYgWyAteiAiJExPTkdfVVNBR0UiIF0KKwl0aGVuCisJCUxPTkdfVVNBR0U9IlVzYWdlOiAkMCAkVVNBR0UiCisJZWxzZQorCQlMT05HX1VTQUdFPSJVc2FnZTogJDAgJFVTQUdFCisKKyRMT05HX1VTQUdFIgorCWZpCisKKwljYXNlICIkMSIgaW4KKwkJLWh8LS1ofC0taGV8LS1oZWx8LS1oZWxwKQorCQllY2hvICIkTE9OR19VU0FHRSIKKwkJZXhpdAorCWVzYWMKK2ZpCisKK3NldF9yZWZsb2dfYWN0aW9uKCkgeworCWlmIFsgLXogIiR7R0lUX1JFRkxPR19BQ1RJT046K3NldH0iIF0KKwl0aGVuCisJCUdJVF9SRUZMT0dfQUNUSU9OPSIkKiIKKwkJZXhwb3J0IEdJVF9SRUZMT0dfQUNUSU9OCisJZmkKK30KKworZ2l0X2VkaXRvcigpIHsKKwk6ICIke0dJVF9FRElUT1I6PSQoZ2l0IGNvbmZpZyBjb3JlLmVkaXRvcil9IgorCTogIiR7R0lUX0VESVRPUjo9JHtWSVNVQUw6LSR7RURJVE9SfX19IgorCWNhc2UgIiRHSVRfRURJVE9SLCRURVJNIiBpbgorCSxkdW1iKQorCQllY2hvID4mMiAiTm8gZWRpdG9yIHNwZWNpZmllZCBpbiBHSVRfRURJVE9SLCBjb3JlLmVkaXRvciwgVklTVUFMLCIKKwkJZWNobyA+JjIgIm9yIEVESVRPUi4gVHJpZWQgdG8gZmFsbCBiYWNrIHRvIHZpIGJ1dCB0ZXJtaW5hbCBpcyBkdW1iLiIKKwkJZWNobyA+JjIgIlBsZWFzZSBzZXQgb25lIG9mIHRoZXNlIHZhcmlhYmxlcyB0byBhbiBhcHByb3ByaWF0ZSIKKwkJZWNobyA+JjIgImVkaXRvciBvciBydW4gJDAgd2l0aCBvcHRpb25zIHRoYXQgd2lsbCBub3QgY2F1c2UgYW4iCisJCWVjaG8gPiYyICJlZGl0b3IgdG8gYmUgaW52b2tlZCAoZS5nLiwgLW0gb3IgLUYgZm9yIGdpdC1jb21taXQpLiIKKwkJZXhpdCAxCisJCTs7CisJZXNhYworCWV2YWwgIiR7R0lUX0VESVRPUjo9dml9IiAnIiRAIicKK30KKworaXNfYmFyZV9yZXBvc2l0b3J5ICgpIHsKKwlnaXQgcmV2LXBhcnNlIC0taXMtYmFyZS1yZXBvc2l0b3J5Cit9CisKK2NkX3RvX3RvcGxldmVsICgpIHsKKwljZHVwPSQoZ2l0IHJldi1wYXJzZSAtLXNob3ctY2R1cCkKKwlpZiB0ZXN0ICEgLXogIiRjZHVwIgorCXRoZW4KKwkJY2QgIiRjZHVwIiB8fCB7CisJCQllY2hvID4mMiAiQ2Fubm90IGNoZGlyIHRvICRjZHVwLCB0aGUgdG9wbGV2ZWwgb2YgdGhlIHdvcmtpbmcgdHJlZSIKKwkJCWV4aXQgMQorCQl9CisJZmkKK30KKworcmVxdWlyZV93b3JrX3RyZWUgKCkgeworCXRlc3QgJChnaXQgcmV2LXBhcnNlIC0taXMtaW5zaWRlLXdvcmstdHJlZSkgPSB0cnVlIHx8CisJZGllICJmYXRhbDogJDAgY2Fubm90IGJlIHVzZWQgd2l0aG91dCBhIHdvcmtpbmcgdHJlZS4iCit9CisKK2dldF9hdXRob3JfaWRlbnRfZnJvbV9jb21taXQgKCkgeworCXBpY2tfYXV0aG9yX3NjcmlwdD0nCisJL15hdXRob3IgL3sKKwkJcy8nXCcnLydcJydcXCdcJ1wnJy9nCisJCWgKKwkJcy9eYXV0aG9yIFwoW148XSpcKSA8W14+XSo+IC4qJC9cMS8KKwkJcy8nXCcnLydcJydcJ1wnXCcnL2cKKwkJcy8uKi9HSVRfQVVUSE9SX05BTUU9J1wnJyYnXCcnL3AKKworCQlnCisJCXMvXmF1dGhvciBbXjxdKiA8XChbXj5dKlwpPiAuKiQvXDEvCisJCXMvJ1wnJy8nXCcnXCdcJ1wnJy9nCisJCXMvLiovR0lUX0FVVEhPUl9FTUFJTD0nXCcnJidcJycvcAorCisJCWcKKwkJcy9eYXV0aG9yIFtePF0qIDxbXj5dKj4gXCguKlwpJC9cMS8KKwkJcy8nXCcnLydcJydcJ1wnXCcnL2cKKwkJcy8uKi9HSVRfQVVUSE9SX0RBVEU9J1wnJyYnXCcnL3AKKworCQlxCisJfQorCScKKwllbmNvZGluZz0kKGdpdCBjb25maWcgaTE4bi5jb21taXRlbmNvZGluZyB8fCBlY2hvIFVURi04KQorCWdpdCBzaG93IC1zIC0tcHJldHR5PXJhdyAtLWVuY29kaW5nPSIkZW5jb2RpbmciICIkMSIgLS0gfAorCUxBTkc9QyBMQ19BTEw9QyBzZWQgLW5lICIkcGlja19hdXRob3Jfc2NyaXB0IgorfQorCisjIE1ha2Ugc3VyZSB3ZSBhcmUgaW4gYSB2YWxpZCByZXBvc2l0b3J5IG9mIGEgdmludGFnZSB3ZSB1bmRlcnN0YW5kLAorIyBpZiB3ZSByZXF1aXJlIHRvIGJlIGluIGEgZ2l0IHJlcG9zaXRvcnkuCitpZiB0ZXN0IC16ICIkTk9OR0lUX09LIgordGhlbgorCUdJVF9ESVI9JChnaXQgcmV2LXBhcnNlIC0tZ2l0LWRpcikgfHwgZXhpdAorCWlmIFsgLXogIiRTVUJESVJFQ1RPUllfT0siIF0KKwl0aGVuCisJCXRlc3QgLXogIiQoZ2l0IHJldi1wYXJzZSAtLXNob3ctY2R1cCkiIHx8IHsKKwkJCWV4aXQ9JD8KKwkJCWVjaG8gPiYyICJZb3UgbmVlZCB0byBydW4gdGhpcyBjb21tYW5kIGZyb20gdGhlIHRvcGxldmVsIG9mIHRoZSB3b3JraW5nIHRyZWUuIgorCQkJZXhpdCAkZXhpdAorCQl9CisJZmkKKwl0ZXN0IC1uICIkR0lUX0RJUiIgJiYgR0lUX0RJUj0kKGNkICIkR0lUX0RJUiIgJiYgcHdkKSB8fCB7CisJCWVjaG8gPiYyICJVbmFibGUgdG8gZGV0ZXJtaW5lIGFic29sdXRlIHBhdGggb2YgZ2l0IGRpcmVjdG9yeSIKKwkJZXhpdCAxCisJfQorCTogJHtHSVRfT0JKRUNUX0RJUkVDVE9SWT0iJEdJVF9ESVIvb2JqZWN0cyJ9CitmaQpkaWZmIC0tZ2l0IGEvZ2l0LXN0YXNoLnNoIGIvZ2l0LXN0YXNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMyYjY4MjAKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtc3Rhc2guc2gKQEAgLTAsMCArMSwyNzcgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKGMpIDIwMDcsIE5hbmFrbyBTaGlyYWlzaGkKKworVVNBR0U9J1sgIHwgc2F2ZSB8IGxpc3QgfCBzaG93IHwgYXBwbHkgfCBjbGVhciB8IGRyb3AgfCBwb3AgfCBjcmVhdGUgXScKKworU1VCRElSRUNUT1JZX09LPVllcworT1BUSU9OU19TUEVDPQorLiBnaXQtc2gtc2V0dXAKK3JlcXVpcmVfd29ya190cmVlCitjZF90b190b3BsZXZlbAorCitUTVA9IiRHSVRfRElSLy5naXQtc3Rhc2guJCQiCit0cmFwICdybSAtZiAiJFRNUC0qIicgMAorCityZWZfc3Rhc2g9cmVmcy9zdGFzaAorCitub19jaGFuZ2VzICgpIHsKKwlnaXQgZGlmZi1pbmRleCAtLXF1aWV0IC0tY2FjaGVkIEhFQUQgLS0gJiYKKwlnaXQgZGlmZi1maWxlcyAtLXF1aWV0Cit9CisKK2NsZWFyX3N0YXNoICgpIHsKKwlpZiB0ZXN0ICQjICE9IDAKKwl0aGVuCisJCWRpZSAiZ2l0IHN0YXNoIGNsZWFyIHdpdGggcGFyYW1ldGVycyBpcyB1bmltcGxlbWVudGVkIgorCWZpCisJaWYgY3VycmVudD0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgJHJlZl9zdGFzaCAyPi9kZXYvbnVsbCkKKwl0aGVuCisJCWdpdCB1cGRhdGUtcmVmIC1kICRyZWZfc3Rhc2ggJGN1cnJlbnQKKwlmaQorfQorCitjcmVhdGVfc3Rhc2ggKCkgeworCXN0YXNoX21zZz0iJDEiCisKKwlpZiBub19jaGFuZ2VzCisJdGhlbgorCQlleGl0IDAKKwlmaQorCisJIyBzdGF0ZSBvZiB0aGUgYmFzZSBjb21taXQKKwlpZiBiX2NvbW1pdD0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkKKwl0aGVuCisJCWhlYWQ9JChnaXQgbG9nIC0tbm8tY29sb3IgLS1hYmJyZXYtY29tbWl0IC0tcHJldHR5PW9uZWxpbmUgLW4gMSBIRUFEIC0tKQorCWVsc2UKKwkJZGllICJZb3UgZG8gbm90IGhhdmUgdGhlIGluaXRpYWwgY29tbWl0IHlldCIKKwlmaQorCisJaWYgYnJhbmNoPSQoZ2l0IHN5bWJvbGljLXJlZiAtcSBIRUFEKQorCXRoZW4KKwkJYnJhbmNoPSR7YnJhbmNoI3JlZnMvaGVhZHMvfQorCWVsc2UKKwkJYnJhbmNoPScobm8gYnJhbmNoKScKKwlmaQorCW1zZz0kKHByaW50ZiAnJXM6ICVzJyAiJGJyYW5jaCIgIiRoZWFkIikKKworCSMgc3RhdGUgb2YgdGhlIGluZGV4CisJaV90cmVlPSQoZ2l0IHdyaXRlLXRyZWUpICYmCisJaV9jb21taXQ9JChwcmludGYgJ2luZGV4IG9uICVzXG4nICIkbXNnIiB8CisJCWdpdCBjb21taXQtdHJlZSAkaV90cmVlIC1wICRiX2NvbW1pdCkgfHwKKwkJZGllICJDYW5ub3Qgc2F2ZSB0aGUgY3VycmVudCBpbmRleCBzdGF0ZSIKKworCSMgc3RhdGUgb2YgdGhlIHdvcmtpbmcgdHJlZQorCXdfdHJlZT0kKCAoCisJCXJtIC1mICIkVE1QLWluZGV4IiAmJgorCQljcCAtcCAke0dJVF9JTkRFWF9GSUxFLSIkR0lUX0RJUi9pbmRleCJ9ICIkVE1QLWluZGV4IiAmJgorCQlHSVRfSU5ERVhfRklMRT0iJFRNUC1pbmRleCIgJiYKKwkJZXhwb3J0IEdJVF9JTkRFWF9GSUxFICYmCisJCWdpdCByZWFkLXRyZWUgLW0gJGlfdHJlZSAmJgorCQlnaXQgYWRkIC11ICYmCisJCWdpdCB3cml0ZS10cmVlICYmCisJCXJtIC1mICIkVE1QLWluZGV4IgorCSkgKSB8fAorCQlkaWUgIkNhbm5vdCBzYXZlIHRoZSBjdXJyZW50IHdvcmt0cmVlIHN0YXRlIgorCisJIyBjcmVhdGUgdGhlIHN0YXNoCisJaWYgdGVzdCAteiAiJHN0YXNoX21zZyIKKwl0aGVuCisJCXN0YXNoX21zZz0kKHByaW50ZiAnV0lQIG9uICVzJyAiJG1zZyIpCisJZWxzZQorCQlzdGFzaF9tc2c9JChwcmludGYgJ09uICVzOiAlcycgIiRicmFuY2giICIkc3Rhc2hfbXNnIikKKwlmaQorCXdfY29tbWl0PSQocHJpbnRmICclc1xuJyAiJHN0YXNoX21zZyIgfAorCQlnaXQgY29tbWl0LXRyZWUgJHdfdHJlZSAtcCAkYl9jb21taXQgLXAgJGlfY29tbWl0KSB8fAorCQlkaWUgIkNhbm5vdCByZWNvcmQgd29ya2luZyB0cmVlIHN0YXRlIgorfQorCitzYXZlX3N0YXNoICgpIHsKKwlzdGFzaF9tc2c9IiQxIgorCisJaWYgbm9fY2hhbmdlcworCXRoZW4KKwkJZWNobyAnTm8gbG9jYWwgY2hhbmdlcyB0byBzYXZlJworCQlleGl0IDAKKwlmaQorCXRlc3QgLWYgIiRHSVRfRElSL2xvZ3MvJHJlZl9zdGFzaCIgfHwKKwkJY2xlYXJfc3Rhc2ggfHwgZGllICJDYW5ub3QgaW5pdGlhbGl6ZSBzdGFzaCIKKworCWNyZWF0ZV9zdGFzaCAiJHN0YXNoX21zZyIKKworCSMgTWFrZSBzdXJlIHRoZSByZWZsb2cgZm9yIHN0YXNoIGlzIGtlcHQuCisJOiA+PiIkR0lUX0RJUi9sb2dzLyRyZWZfc3Rhc2giCisKKwlnaXQgdXBkYXRlLXJlZiAtbSAiJHN0YXNoX21zZyIgJHJlZl9zdGFzaCAkd19jb21taXQgfHwKKwkJZGllICJDYW5ub3Qgc2F2ZSB0aGUgY3VycmVudCBzdGF0dXMiCisJcHJpbnRmICdTYXZlZCB3b3JraW5nIGRpcmVjdG9yeSBhbmQgaW5kZXggc3RhdGUgIiVzIlxuJyAiJHN0YXNoX21zZyIKK30KKworaGF2ZV9zdGFzaCAoKSB7CisJZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAkcmVmX3N0YXNoID4vZGV2L251bGwgMj4mMQorfQorCitsaXN0X3N0YXNoICgpIHsKKwloYXZlX3N0YXNoIHx8IHJldHVybiAwCisJZ2l0IGxvZyAtLW5vLWNvbG9yIC0tcHJldHR5PW9uZWxpbmUgLWcgIiRAIiAkcmVmX3N0YXNoIC0tIHwKKwlzZWQgLW4gLWUgJ3MvXlsuMC05YS1mXSogcmVmc1wvLy9wJworfQorCitzaG93X3N0YXNoICgpIHsKKwlmbGFncz0kKGdpdCByZXYtcGFyc2UgLS1uby1yZXZzIC0tZmxhZ3MgIiRAIikKKwlpZiB0ZXN0IC16ICIkZmxhZ3MiCisJdGhlbgorCQlmbGFncz0tLXN0YXQKKwlmaQorCXM9JChnaXQgcmV2LXBhcnNlIC0tcmV2cy1vbmx5IC0tbm8tZmxhZ3MgLS1kZWZhdWx0ICRyZWZfc3Rhc2ggIiRAIikKKworCXdfY29tbWl0PSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAiJHMiKSAmJgorCWJfY29tbWl0PSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAiJHNeIikgJiYKKwlnaXQgZGlmZiAkZmxhZ3MgJGJfY29tbWl0ICR3X2NvbW1pdAorfQorCithcHBseV9zdGFzaCAoKSB7CisJZ2l0IGRpZmYtZmlsZXMgLS1xdWlldCB8fAorCQlkaWUgJ0Nhbm5vdCByZXN0b3JlIG9uIHRvcCBvZiBhIGRpcnR5IHN0YXRlJworCisJdW5zdGFzaF9pbmRleD0KKwljYXNlICIkMSIgaW4KKwktLWluZGV4KQorCQl1bnN0YXNoX2luZGV4PXQKKwkJc2hpZnQKKwllc2FjCisKKwkjIGN1cnJlbnQgaW5kZXggc3RhdGUKKwljX3RyZWU9JChnaXQgd3JpdGUtdHJlZSkgfHwKKwkJZGllICdDYW5ub3QgYXBwbHkgYSBzdGFzaCBpbiB0aGUgbWlkZGxlIG9mIGEgbWVyZ2UnCisKKwkjIHN0YXNoIHJlY29yZHMgdGhlIHdvcmsgdHJlZSwgYW5kIGlzIGEgbWVyZ2UgYmV0d2VlbiB0aGUKKwkjIGJhc2UgY29tbWl0IChmaXJzdCBwYXJlbnQpIGFuZCB0aGUgaW5kZXggdHJlZSAoc2Vjb25kIHBhcmVudCkuCisJcz0kKGdpdCByZXYtcGFyc2UgLS1yZXZzLW9ubHkgLS1uby1mbGFncyAtLWRlZmF1bHQgJHJlZl9zdGFzaCAiJEAiKSAmJgorCXdfdHJlZT0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgIiRzOiIpICYmCisJYl90cmVlPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAiJHNeMToiKSAmJgorCWlfdHJlZT0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgIiRzXjI6IikgfHwKKwkJZGllICIkKjogbm8gdmFsaWQgc3Rhc2hlZCBzdGF0ZSBmb3VuZCIKKworCXVuc3Rhc2hlZF9pbmRleF90cmVlPQorCWlmIHRlc3QgLW4gIiR1bnN0YXNoX2luZGV4IiAmJiB0ZXN0ICIkYl90cmVlIiAhPSAiJGlfdHJlZSIKKwl0aGVuCisJCWdpdCBkaWZmLXRyZWUgLS1iaW5hcnkgJHNeMl4uLiRzXjIgfCBnaXQgYXBwbHkgLS1jYWNoZWQKKwkJdGVzdCAkPyAtbmUgMCAmJgorCQkJZGllICdDb25mbGljdHMgaW4gaW5kZXguIFRyeSB3aXRob3V0IC0taW5kZXguJworCQl1bnN0YXNoZWRfaW5kZXhfdHJlZT0kKGdpdC13cml0ZS10cmVlKSB8fAorCQkJZGllICdDb3VsZCBub3Qgc2F2ZSBpbmRleCB0cmVlJworCQlnaXQgcmVzZXQKKwlmaQorCisJZXZhbCAiCisJCUdJVEhFQURfJHdfdHJlZT0nU3Rhc2hlZCBjaGFuZ2VzJyAmJgorCQlHSVRIRUFEXyRjX3RyZWU9J1VwZGF0ZWQgdXBzdHJlYW0nICYmCisJCUdJVEhFQURfJGJfdHJlZT0nVmVyc2lvbiBzdGFzaCB3YXMgYmFzZWQgb24nICYmCisJCWV4cG9ydCBHSVRIRUFEXyR3X3RyZWUgR0lUSEVBRF8kY190cmVlIEdJVEhFQURfJGJfdHJlZQorCSIKKworCWlmIGdpdC1tZXJnZS1yZWN1cnNpdmUgJGJfdHJlZSAtLSAkY190cmVlICR3X3RyZWUKKwl0aGVuCisJCSMgTm8gY29uZmxpY3QKKwkJaWYgdGVzdCAtbiAiJHVuc3Rhc2hlZF9pbmRleF90cmVlIgorCQl0aGVuCisJCQlnaXQgcmVhZC10cmVlICIkdW5zdGFzaGVkX2luZGV4X3RyZWUiCisJCWVsc2UKKwkJCWE9IiRUTVAtYWRkZWQiICYmCisJCQlnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCAtLW5hbWUtb25seSAtLWRpZmYtZmlsdGVyPUEgJGNfdHJlZSA+IiRhIiAmJgorCQkJZ2l0IHJlYWQtdHJlZSAtLXJlc2V0ICRjX3RyZWUgJiYKKwkJCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgLS1zdGRpbiA8IiRhIiB8fAorCQkJCWRpZSAiQ2Fubm90IHVuc3RhZ2UgbW9kaWZpZWQgZmlsZXMiCisJCQlybSAtZiAiJGEiCisJCWZpCisJCWdpdCBzdGF0dXMgfHwgOgorCWVsc2UKKwkJIyBNZXJnZSBjb25mbGljdDsga2VlcCB0aGUgZXhpdCBzdGF0dXMgZnJvbSBtZXJnZS1yZWN1cnNpdmUKKwkJc3RhdHVzPSQ/CisJCWlmIHRlc3QgLW4gIiR1bnN0YXNoX2luZGV4IgorCQl0aGVuCisJCQllY2hvID4mMiAnSW5kZXggd2FzIG5vdCB1bnN0YXNoZWQuJworCQlmaQorCQlleGl0ICRzdGF0dXMKKwlmaQorfQorCitkcm9wX3N0YXNoICgpIHsKKwloYXZlX3N0YXNoIHx8IGRpZSAnTm8gc3Rhc2ggZW50cmllcyB0byBkcm9wJworCisJaWYgdGVzdCAkIyA9IDAKKwl0aGVuCisJCXNldCB4ICIkcmVmX3N0YXNoQHswfSIKKwkJc2hpZnQKKwlmaQorCSMgVmVyaWZ5IHN1cHBsaWVkIGFyZ3VtZW50IGxvb2tzIGxpa2UgYSBzdGFzaCBlbnRyeQorCXM9JChnaXQgcmV2LXBhcnNlIC0tcmV2cy1vbmx5IC0tbm8tZmxhZ3MgIiRAIikgJiYKKwlnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5ICIkczoiICAgPiAvZGV2L251bGwgMj4mMSAmJgorCWdpdCByZXYtcGFyc2UgLS12ZXJpZnkgIiRzXjE6IiA+IC9kZXYvbnVsbCAyPiYxICYmCisJZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAiJHNeMjoiID4gL2Rldi9udWxsIDI+JjEgfHwKKwkJZGllICIkKjogbm90IGEgdmFsaWQgc3Rhc2hlZCBzdGF0ZSIKKworCWdpdCByZWZsb2cgZGVsZXRlIC0tdXBkYXRlcmVmIC0tcmV3cml0ZSAiJEAiICYmCisJCWVjaG8gIkRyb3BwZWQgJCogKCRzKSIgfHwgZGllICIkKjogQ291bGQgbm90IGRyb3Agc3Rhc2ggZW50cnkiCisKKwkjIGNsZWFyX3N0YXNoIGlmIHdlIGp1c3QgZHJvcHBlZCB0aGUgbGFzdCBzdGFzaCBlbnRyeQorCWdpdCByZXYtcGFyc2UgLS12ZXJpZnkgIiRyZWZfc3Rhc2hAezB9IiA+IC9kZXYvbnVsbCAyPiYxIHx8IGNsZWFyX3N0YXNoCit9CisKKyMgTWFpbiBjb21tYW5kIHNldAorY2FzZSAiJDEiIGluCitsaXN0KQorCXNoaWZ0CisJaWYgdGVzdCAkIyA9IDAKKwl0aGVuCisJCXNldCB4IC1uIDEwCisJCXNoaWZ0CisJZmkKKwlsaXN0X3N0YXNoICIkQCIKKwk7Oworc2hvdykKKwlzaGlmdAorCXNob3dfc3Rhc2ggIiRAIgorCTs7CitzYXZlKQorCXNoaWZ0CisJc2F2ZV9zdGFzaCAiJCoiICYmIGdpdC1yZXNldCAtLWhhcmQKKwk7OworYXBwbHkpCisJc2hpZnQKKwlhcHBseV9zdGFzaCAiJEAiCisJOzsKK2NsZWFyKQorCXNoaWZ0CisJY2xlYXJfc3Rhc2ggIiRAIgorCTs7CitjcmVhdGUpCisJaWYgdGVzdCAkIyAtZ3QgMCAmJiB0ZXN0ICIkMSIgPSBjcmVhdGUKKwl0aGVuCisJCXNoaWZ0CisJZmkKKwljcmVhdGVfc3Rhc2ggIiQqIiAmJiBlY2hvICIkd19jb21taXQiCisJOzsKK2Ryb3ApCisJc2hpZnQKKwlkcm9wX3N0YXNoICIkQCIKKwk7OworcG9wKQorCXNoaWZ0CisJaWYgYXBwbHlfc3Rhc2ggIiRAIgorCXRoZW4KKwkJdGVzdCAteiAiJHVuc3Rhc2hfaW5kZXgiIHx8IHNoaWZ0CisJCWRyb3Bfc3Rhc2ggIiRAIgorCWZpCisJOzsKKyopCisJaWYgdGVzdCAkIyAtZXEgMAorCXRoZW4KKwkJc2F2ZV9zdGFzaCAmJgorCQllY2hvICcoVG8gcmVzdG9yZSB0aGVtIHR5cGUgImdpdCBzdGFzaCBhcHBseSIpJyAmJgorCQlnaXQtcmVzZXQgLS1oYXJkCisJZWxzZQorCQl1c2FnZQorCWZpCisJOzsKK2VzYWMKZGlmZiAtLWdpdCBhL2dpdC1zdWJtb2R1bGUuc2ggYi9naXQtc3VibW9kdWxlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU2ZWMzNTMKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtc3VibW9kdWxlLnNoCkBAIC0wLDAgKzEsNjE5IEBACisjIS9iaW4vc2gKKyMKKyMgZ2l0LXN1Ym1vZHVsZXMuc2g6IGFkZCwgaW5pdCwgdXBkYXRlIG9yIGxpc3QgZ2l0IHN1Ym1vZHVsZXMKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3IExhcnMgSGplbWxpCisKK1VTQUdFPSJbLS1xdWlldF0gWy0tY2FjaGVkXSBcCitbYWRkIDxyZXBvPiBbLWIgYnJhbmNoXXxzdGF0dXN8aW5pdHx1cGRhdGV8c3VtbWFyeSBbLW58LS1zdW1tYXJ5LWxpbWl0IDxuPl0gWzxjb21taXQ+XV0gXAorWy0tXSBbPHBhdGg+Li4uXSIKK09QVElPTlNfU1BFQz0KKy4gZ2l0LXNoLXNldHVwCityZXF1aXJlX3dvcmtfdHJlZQorCitjb21tYW5kPQorYnJhbmNoPQorcXVpZXQ9CitjYWNoZWQ9CisKKyMKKyMgcHJpbnQgc3R1ZmYgb24gc3Rkb3V0IHVubGVzcyAtcSB3YXMgc3BlY2lmaWVkCisjCitzYXkoKQoreworCWlmIHRlc3QgLXogIiRxdWlldCIKKwl0aGVuCisJCWVjaG8gIiRAIgorCWZpCit9CisKKyMgTkVFRFNXT1JLOiBpZGVudGljYWwgZnVuY3Rpb24gZXhpc3RzIGluIGdldF9yZXBvX2Jhc2UgaW4gY2xvbmUuc2gKK2dldF9yZXBvX2Jhc2UoKSB7CisJKAorCQljZCAiYC9iaW4vcHdkYCIgJiYKKwkJY2QgIiQxIiB8fCBjZCAiJDEuZ2l0IiAmJgorCQl7CisJCQljZCAuZ2l0CisJCQlwd2QKKwkJfQorCSkgMj4vZGV2L251bGwKK30KKworIyBSZXNvbHZlIHJlbGF0aXZlIHVybCBieSBhcHBlbmRpbmcgdG8gcGFyZW50J3MgdXJsCityZXNvbHZlX3JlbGF0aXZlX3VybCAoKQoreworCWJyYW5jaD0iJChnaXQgc3ltYm9saWMtcmVmIEhFQUQgMj4vZGV2L251bGwpIgorCXJlbW90ZT0iJChnaXQgY29uZmlnIGJyYW5jaC4ke2JyYW5jaCNyZWZzL2hlYWRzL30ucmVtb3RlKSIKKwlyZW1vdGU9IiR7cmVtb3RlOi1vcmlnaW59IgorCXJlbW90ZXVybD0iJChnaXQgY29uZmlnIHJlbW90ZS4kcmVtb3RlLnVybCkiIHx8CisJCWRpZSAicmVtb3RlICgkcmVtb3RlKSBkb2VzIG5vdCBoYXZlIGEgdXJsIGluIC5naXQvY29uZmlnIgorCXVybD0iJDEiCisJd2hpbGUgdGVzdCAtbiAiJHVybCIKKwlkbworCQljYXNlICIkdXJsIiBpbgorCQkuLi8qKQorCQkJdXJsPSIke3VybCMuLi99IgorCQkJcmVtb3RldXJsPSIke3JlbW90ZXVybCUvKn0iCisJCQk7OworCQkuLyopCisJCQl1cmw9IiR7dXJsIy4vfSIKKwkJCTs7CisJCSopCisJCQlicmVhazs7CisJCWVzYWMKKwlkb25lCisJZWNobyAiJHJlbW90ZXVybC8kdXJsIgorfQorCisjCisjIE1hcCBzdWJtb2R1bGUgcGF0aCB0byBzdWJtb2R1bGUgbmFtZQorIworIyAkMSA9IHBhdGgKKyMKK21vZHVsZV9uYW1lKCkKK3sKKwkjIERvIHdlIGhhdmUgInN1Ym1vZHVsZS48c29tZXRoaW5nPi5wYXRoID0gJDEiIGRlZmluZWQgaW4gLmdpdG1vZHVsZXMgZmlsZT8KKwlyZT0kKHByaW50ZiAnJXMnICIkMSIgfCBzZWQgLWUgJ3MvW10uW14kXFwqXS9cXCYvZycpCisJbmFtZT0kKCBHSVRfQ09ORklHPS5naXRtb2R1bGVzIFwKKwkJZ2l0IGNvbmZpZyAtLWdldC1yZWdleHAgJ15zdWJtb2R1bGVcLi4qXC5wYXRoJCcgfAorCQlzZWQgLW4gLWUgJ3N8XnN1Ym1vZHVsZVwuXCguKlwpXC5wYXRoICciJHJlIickfFwxfHAnICkKKyAgICAgICB0ZXN0IC16ICIkbmFtZSIgJiYKKyAgICAgICBkaWUgIk5vIHN1Ym1vZHVsZSBtYXBwaW5nIGZvdW5kIGluIC5naXRtb2R1bGVzIGZvciBwYXRoICckcGF0aCciCisgICAgICAgZWNobyAiJG5hbWUiCit9CisKKyMKKyMgQ2xvbmUgYSBzdWJtb2R1bGUKKyMKKyMgUHJpb3IgdG8gY2FsbGluZywgY21kX3VwZGF0ZSBjaGVja3MgdGhhdCBhIHBvc3NpYmx5IGV4aXN0aW5nCisjIHBhdGggaXMgbm90IGEgZ2l0IHJlcG9zaXRvcnkuCisjIExpa2V3aXNlLCBjbWRfYWRkIGNoZWNrcyB0aGF0IHBhdGggZG9lcyBub3QgZXhpc3QgYXQgYWxsLAorIyBzaW5jZSBpdCBpcyB0aGUgbG9jYXRpb24gb2YgYSBuZXcgc3VibW9kdWxlLgorIworbW9kdWxlX2Nsb25lKCkKK3sKKwlwYXRoPSQxCisJdXJsPSQyCisKKwkjIElmIHRoZXJlIGFscmVhZHkgaXMgYSBkaXJlY3RvcnkgYXQgdGhlIHN1Ym1vZHVsZSBwYXRoLAorCSMgZXhwZWN0IGl0IHRvIGJlIGVtcHR5IChzaW5jZSB0aGF0IGlzIHRoZSBkZWZhdWx0IGNoZWNrb3V0CisJIyBhY3Rpb24pIGFuZCB0cnkgdG8gcmVtb3ZlIGl0LgorCSMgTm90ZTogaWYgJHBhdGggaXMgYSBzeW1saW5rIHRvIGEgZGlyZWN0b3J5IHRoZSB0ZXN0IHdpbGwKKwkjIHN1Y2NlZWQgYnV0IHRoZSBybWRpciB3aWxsIGZhaWwuIFdlIG1pZ2h0IHdhbnQgdG8gZml4IHRoaXMuCisJaWYgdGVzdCAtZCAiJHBhdGgiCisJdGhlbgorCQlybWRpciAiJHBhdGgiIDI+L2Rldi9udWxsIHx8CisJCWRpZSAiRGlyZWN0b3J5ICckcGF0aCcgZXhpc3QsIGJ1dCBpcyBuZWl0aGVyIGVtcHR5IG5vciBhIGdpdCByZXBvc2l0b3J5IgorCWZpCisKKwl0ZXN0IC1lICIkcGF0aCIgJiYKKwlkaWUgIkEgZmlsZSBhbHJlYWR5IGV4aXN0IGF0IHBhdGggJyRwYXRoJyIKKworCWdpdC1jbG9uZSAtbiAiJHVybCIgIiRwYXRoIiB8fAorCWRpZSAiQ2xvbmUgb2YgJyR1cmwnIGludG8gc3VibW9kdWxlIHBhdGggJyRwYXRoJyBmYWlsZWQiCit9CisKKyMKKyMgQWRkIGEgbmV3IHN1Ym1vZHVsZSB0byB0aGUgd29ya2luZyB0cmVlLCAuZ2l0bW9kdWxlcyBhbmQgdGhlIGluZGV4CisjCisjICRAID0gcmVwbyBbcGF0aF0KKyMKKyMgb3B0aW9uYWwgYnJhbmNoIGlzIHN0b3JlZCBpbiBnbG9iYWwgYnJhbmNoIHZhcmlhYmxlCisjCitjbWRfYWRkKCkKK3sKKwkjIHBhcnNlICRhcmdzIGFmdGVyICJzdWJtb2R1bGUgLi4uIGFkZCIuCisJd2hpbGUgdGVzdCAkIyAtbmUgMAorCWRvCisJCWNhc2UgIiQxIiBpbgorCQktYiB8IC0tYnJhbmNoKQorCQkJY2FzZSAiJDIiIGluICcnKSB1c2FnZSA7OyBlc2FjCisJCQlicmFuY2g9JDIKKwkJCXNoaWZ0CisJCQk7OworCQktcXwtLXF1aWV0KQorCQkJcXVpZXQ9MQorCQkJOzsKKwkJLS0pCisJCQlzaGlmdAorCQkJYnJlYWsKKwkJCTs7CisJCS0qKQorCQkJdXNhZ2UKKwkJCTs7CisJCSopCisJCQlicmVhaworCQkJOzsKKwkJZXNhYworCQlzaGlmdAorCWRvbmUKKworCXJlcG89JDEKKwlwYXRoPSQyCisKKwlpZiB0ZXN0IC16ICIkcmVwbyI7IHRoZW4KKwkJdXNhZ2UKKwlmaQorCisJIyBHdWVzcyBwYXRoIGZyb20gcmVwbyBpZiBub3Qgc3BlY2lmaWVkIG9yIHN0cmlwIHRyYWlsaW5nIHNsYXNoZXMKKwlpZiB0ZXN0IC16ICIkcGF0aCI7IHRoZW4KKwkJcGF0aD0kKGVjaG8gIiRyZXBvIiB8IHNlZCAtZSAnc3wvKiR8fCcgLWUgJ3N8OiovKlwuZ2l0JHx8JyAtZSAnc3wuKlsvOl18fGcnKQorCWVsc2UKKwkJcGF0aD0kKGVjaG8gIiRwYXRoIiB8IHNlZCAtZSAnc3wvKiR8fCcpCisJZmkKKworCWdpdCBscy1maWxlcyAtLWVycm9yLXVubWF0Y2ggIiRwYXRoIiA+IC9kZXYvbnVsbCAyPiYxICYmCisJZGllICInJHBhdGgnIGFscmVhZHkgZXhpc3RzIGluIHRoZSBpbmRleCIKKworCSMgcGVyaGFwcyB0aGUgcGF0aCBleGlzdHMgYW5kIGlzIGFscmVhZHkgYSBnaXQgcmVwbywgZWxzZSBjbG9uZSBpdAorCWlmIHRlc3QgLWUgIiRwYXRoIgorCXRoZW4KKwkJaWYgdGVzdCAtZCAiJHBhdGgvLmdpdCIgJiYKKwkJdGVzdCAiJCh1bnNldCBHSVRfRElSOyBjZCAkcGF0aDsgZ2l0IHJldi1wYXJzZSAtLWdpdC1kaXIpIiA9ICIuZ2l0IgorCQl0aGVuCisJCQllY2hvICJBZGRpbmcgZXhpc3RpbmcgcmVwbyBhdCAnJHBhdGgnIHRvIHRoZSBpbmRleCIKKwkJZWxzZQorCQkJZGllICInJHBhdGgnIGFscmVhZHkgZXhpc3RzIGFuZCBpcyBub3QgYSB2YWxpZCBnaXQgcmVwbyIKKwkJZmkKKwllbHNlCisJCWNhc2UgIiRyZXBvIiBpbgorCQkuLyp8Li4vKikKKwkJCSMgZGVyZWZlcmVuY2Ugc291cmNlIHVybCByZWxhdGl2ZSB0byBwYXJlbnQncyB1cmwKKwkJCXJlYWxyZXBvPSIkKHJlc29sdmVfcmVsYXRpdmVfdXJsICRyZXBvKSIgOzsKKwkJKikKKwkJCSMgVHVybiB0aGUgc291cmNlIGludG8gYW4gYWJzb2x1dGUgcGF0aCBpZgorCQkJIyBpdCBpcyBsb2NhbAorCQkJaWYgYmFzZT0kKGdldF9yZXBvX2Jhc2UgIiRyZXBvIik7IHRoZW4KKwkJCQlyZXBvPSIkYmFzZSIKKwkJCWZpCisJCQlyZWFscmVwbz0kcmVwbworCQkJOzsKKwkJZXNhYworCisJCW1vZHVsZV9jbG9uZSAiJHBhdGgiICIkcmVhbHJlcG8iIHx8IGV4aXQKKwkJKHVuc2V0IEdJVF9ESVI7IGNkICIkcGF0aCIgJiYgZ2l0IGNoZWNrb3V0IC1xICR7YnJhbmNoOistYiAiJGJyYW5jaCIgIm9yaWdpbi8kYnJhbmNoIn0pIHx8CisJCWRpZSAiVW5hYmxlIHRvIGNoZWNrb3V0IHN1Ym1vZHVsZSAnJHBhdGgnIgorCWZpCisKKwlnaXQgYWRkICIkcGF0aCIgfHwKKwlkaWUgIkZhaWxlZCB0byBhZGQgc3VibW9kdWxlICckcGF0aCciCisKKwlHSVRfQ09ORklHPS5naXRtb2R1bGVzIGdpdCBjb25maWcgc3VibW9kdWxlLiIkcGF0aCIucGF0aCAiJHBhdGgiICYmCisJR0lUX0NPTkZJRz0uZ2l0bW9kdWxlcyBnaXQgY29uZmlnIHN1Ym1vZHVsZS4iJHBhdGgiLnVybCAiJHJlcG8iICYmCisJZ2l0IGFkZCAuZ2l0bW9kdWxlcyB8fAorCWRpZSAiRmFpbGVkIHRvIHJlZ2lzdGVyIHN1Ym1vZHVsZSAnJHBhdGgnIgorfQorCisjCisjIFJlZ2lzdGVyIHN1Ym1vZHVsZXMgaW4gLmdpdC9jb25maWcKKyMKKyMgJEAgPSByZXF1ZXN0ZWQgcGF0aHMgKGRlZmF1bHQgdG8gYWxsKQorIworY21kX2luaXQoKQoreworCSMgcGFyc2UgJGFyZ3MgYWZ0ZXIgInN1Ym1vZHVsZSAuLi4gaW5pdCIuCisJd2hpbGUgdGVzdCAkIyAtbmUgMAorCWRvCisJCWNhc2UgIiQxIiBpbgorCQktcXwtLXF1aWV0KQorCQkJcXVpZXQ9MQorCQkJOzsKKwkJLS0pCisJCQlzaGlmdAorCQkJYnJlYWsKKwkJCTs7CisJCS0qKQorCQkJdXNhZ2UKKwkJCTs7CisJCSopCisJCQlicmVhaworCQkJOzsKKwkJZXNhYworCQlzaGlmdAorCWRvbmUKKworCWdpdCBscy1maWxlcyAtLXN0YWdlIC0tICIkQCIgfCBncmVwICdeMTYwMDAwICcgfAorCXdoaWxlIHJlYWQgbW9kZSBzaGExIHN0YWdlIHBhdGgKKwlkbworCQkjIFNraXAgYWxyZWFkeSByZWdpc3RlcmVkIHBhdGhzCisJCW5hbWU9JChtb2R1bGVfbmFtZSAiJHBhdGgiKSB8fCBleGl0CisJCXVybD0kKGdpdCBjb25maWcgc3VibW9kdWxlLiIkbmFtZSIudXJsKQorCQl0ZXN0IC16ICIkdXJsIiB8fCBjb250aW51ZQorCisJCXVybD0kKEdJVF9DT05GSUc9LmdpdG1vZHVsZXMgZ2l0IGNvbmZpZyBzdWJtb2R1bGUuIiRuYW1lIi51cmwpCisJCXRlc3QgLXogIiR1cmwiICYmCisJCWRpZSAiTm8gdXJsIGZvdW5kIGZvciBzdWJtb2R1bGUgcGF0aCAnJHBhdGgnIGluIC5naXRtb2R1bGVzIgorCisJCSMgUG9zc2libHkgYSB1cmwgcmVsYXRpdmUgdG8gcGFyZW50CisJCWNhc2UgIiR1cmwiIGluCisJCS4vKnwuLi8qKQorCQkJdXJsPSIkKHJlc29sdmVfcmVsYXRpdmVfdXJsICIkdXJsIikiCisJCQk7OworCQllc2FjCisKKwkJZ2l0IGNvbmZpZyBzdWJtb2R1bGUuIiRuYW1lIi51cmwgIiR1cmwiIHx8CisJCWRpZSAiRmFpbGVkIHRvIHJlZ2lzdGVyIHVybCBmb3Igc3VibW9kdWxlIHBhdGggJyRwYXRoJyIKKworCQlzYXkgIlN1Ym1vZHVsZSAnJG5hbWUnICgkdXJsKSByZWdpc3RlcmVkIGZvciBwYXRoICckcGF0aCciCisJZG9uZQorfQorCisjCisjIFVwZGF0ZSBlYWNoIHN1Ym1vZHVsZSBwYXRoIHRvIGNvcnJlY3QgcmV2aXNpb24sIHVzaW5nIGNsb25lIGFuZCBjaGVja291dCBhcyBuZWVkZWQKKyMKKyMgJEAgPSByZXF1ZXN0ZWQgcGF0aHMgKGRlZmF1bHQgdG8gYWxsKQorIworY21kX3VwZGF0ZSgpCit7CisJIyBwYXJzZSAkYXJncyBhZnRlciAic3VibW9kdWxlIC4uLiB1cGRhdGUiLgorCXdoaWxlIHRlc3QgJCMgLW5lIDAKKwlkbworCQljYXNlICIkMSIgaW4KKwkJLXF8LS1xdWlldCkKKwkJCXF1aWV0PTEKKwkJCTs7CisJCS0tKQorCQkJc2hpZnQKKwkJCWJyZWFrCisJCQk7OworCQktKikKKwkJCXVzYWdlCisJCQk7OworCQkqKQorCQkJYnJlYWsKKwkJCTs7CisJCWVzYWMKKwkJc2hpZnQKKwlkb25lCisKKwlnaXQgbHMtZmlsZXMgLS1zdGFnZSAtLSAiJEAiIHwgZ3JlcCAnXjE2MDAwMCAnIHwKKwl3aGlsZSByZWFkIG1vZGUgc2hhMSBzdGFnZSBwYXRoCisJZG8KKwkJbmFtZT0kKG1vZHVsZV9uYW1lICIkcGF0aCIpIHx8IGV4aXQKKwkJdXJsPSQoZ2l0IGNvbmZpZyBzdWJtb2R1bGUuIiRuYW1lIi51cmwpCisJCWlmIHRlc3QgLXogIiR1cmwiCisJCXRoZW4KKwkJCSMgT25seSBtZW50aW9uIHVuaW5pdGlhbGl6ZWQgc3VibW9kdWxlcyB3aGVuIGl0cworCQkJIyBwYXRoIGhhdmUgYmVlbiBzcGVjaWZpZWQKKwkJCXRlc3QgIiQjIiAhPSAiMCIgJiYKKwkJCXNheSAiU3VibW9kdWxlIHBhdGggJyRwYXRoJyBub3QgaW5pdGlhbGl6ZWQiCisJCQljb250aW51ZQorCQlmaQorCisJCWlmICEgdGVzdCAtZCAiJHBhdGgiLy5naXQKKwkJdGhlbgorCQkJbW9kdWxlX2Nsb25lICIkcGF0aCIgIiR1cmwiIHx8IGV4aXQKKwkJCXN1YnNoYTE9CisJCWVsc2UKKwkJCXN1YnNoYTE9JCh1bnNldCBHSVRfRElSOyBjZCAiJHBhdGgiICYmCisJCQkJZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSB8fAorCQkJZGllICJVbmFibGUgdG8gZmluZCBjdXJyZW50IHJldmlzaW9uIGluIHN1Ym1vZHVsZSBwYXRoICckcGF0aCciCisJCWZpCisKKwkJaWYgdGVzdCAiJHN1YnNoYTEiICE9ICIkc2hhMSIKKwkJdGhlbgorCQkJKHVuc2V0IEdJVF9ESVI7IGNkICIkcGF0aCIgJiYgZ2l0LWZldGNoICYmCisJCQkJZ2l0LWNoZWNrb3V0IC1xICIkc2hhMSIpIHx8CisJCQlkaWUgIlVuYWJsZSB0byBjaGVja291dCAnJHNoYTEnIGluIHN1Ym1vZHVsZSBwYXRoICckcGF0aCciCisKKwkJCXNheSAiU3VibW9kdWxlIHBhdGggJyRwYXRoJzogY2hlY2tlZCBvdXQgJyRzaGExJyIKKwkJZmkKKwlkb25lCit9CisKK3NldF9uYW1lX3JldiAoKSB7CisJcmV2bmFtZT0kKCAoCisJCXVuc2V0IEdJVF9ESVIKKwkJY2QgIiQxIiAmJiB7CisJCQlnaXQgZGVzY3JpYmUgIiQyIiAyPi9kZXYvbnVsbCB8fAorCQkJZ2l0IGRlc2NyaWJlIC0tdGFncyAiJDIiIDI+L2Rldi9udWxsIHx8CisJCQlnaXQgZGVzY3JpYmUgLS1jb250YWlucyAtLXRhZ3MgIiQyIgorCQl9CisJKSApCisJdGVzdCAteiAiJHJldm5hbWUiIHx8IHJldm5hbWU9IiAoJHJldm5hbWUpIgorfQorIworIyBTaG93IGNvbW1pdCBzdW1tYXJ5IGZvciBzdWJtb2R1bGVzIGluIGluZGV4IG9yIHdvcmtpbmcgdHJlZQorIworIyBJZiAnLS1jYWNoZWQnIGlzIGdpdmVuLCBzaG93IHN1bW1hcnkgYmV0d2VlbiBpbmRleCBhbmQgZ2l2ZW4gY29tbWl0LAorIyBvciBiZXR3ZWVuIHdvcmtpbmcgdHJlZSBhbmQgZ2l2ZW4gY29tbWl0CisjCisjICRAID0gW2NvbW1pdCAoZGVmYXVsdCAnSEVBRCcpLF0gcmVxdWVzdGVkIHBhdGhzIChkZWZhdWx0IGFsbCkKKyMKK2NtZF9zdW1tYXJ5KCkgeworCXN1bW1hcnlfbGltaXQ9LTEKKworCSMgcGFyc2UgJGFyZ3MgYWZ0ZXIgInN1Ym1vZHVsZSAuLi4gc3VtbWFyeSIuCisJd2hpbGUgdGVzdCAkIyAtbmUgMAorCWRvCisJCWNhc2UgIiQxIiBpbgorCQktLWNhY2hlZCkKKwkJCWNhY2hlZD0iJDEiCisJCQk7OworCQktbnwtLXN1bW1hcnktbGltaXQpCisJCQlpZiBzdW1tYXJ5X2xpbWl0PSQoKCQyICsgMCkpIDI+L2Rldi9udWxsICYmIHRlc3QgIiRzdW1tYXJ5X2xpbWl0IiA9ICIkMiIKKwkJCXRoZW4KKwkJCQk6CisJCQllbHNlCisJCQkJdXNhZ2UKKwkJCWZpCisJCQlzaGlmdAorCQkJOzsKKwkJLS0pCisJCQlzaGlmdAorCQkJYnJlYWsKKwkJCTs7CisJCS0qKQorCQkJdXNhZ2UKKwkJCTs7CisJCSopCisJCQlicmVhaworCQkJOzsKKwkJZXNhYworCQlzaGlmdAorCWRvbmUKKworCXRlc3QgJHN1bW1hcnlfbGltaXQgPSAwICYmIHJldHVybgorCisJaWYgcmV2PSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAiJDFeMCIgMj4vZGV2L251bGwpCisJdGhlbgorCQloZWFkPSRyZXYKKwkJc2hpZnQKKwllbHNlCisJCWhlYWQ9SEVBRAorCWZpCisKKwljZF90b190b3BsZXZlbAorCSMgR2V0IG1vZGlmaWVkIG1vZHVsZXMgY2FyZWQgYnkgdXNlcgorCW1vZHVsZXM9JChnaXQgZGlmZi1pbmRleCAkY2FjaGVkIC0tcmF3ICRoZWFkIC0tICIkQCIgfAorCQlncmVwIC1lICdeOjE2MDAwMCcgLWUgJ146WzAtN10qIDE2MDAwMCcgfAorCQl3aGlsZSByZWFkIG1vZF9zcmMgbW9kX2RzdCBzaGExX3NyYyBzaGExX2RzdCBzdGF0dXMgbmFtZQorCQlkbworCQkJIyBBbHdheXMgc2hvdyBtb2R1bGVzIGRlbGV0ZWQgb3IgdHlwZS1jaGFuZ2VkIChibG9iPC0+bW9kdWxlKQorCQkJdGVzdCAkc3RhdHVzID0gRCAtbyAkc3RhdHVzID0gVCAmJiBlY2hvICIkbmFtZSIgJiYgY29udGludWUKKwkJCSMgQWxzbyBzaG93IGFkZGVkIG9yIG1vZGlmaWVkIG1vZHVsZXMgd2hpY2ggYXJlIGNoZWNrZWQgb3V0CisJCQlHSVRfRElSPSIkbmFtZS8uZ2l0IiBnaXQtcmV2LXBhcnNlIC0tZ2l0LWRpciA+L2Rldi9udWxsIDI+JjEgJiYKKwkJCWVjaG8gIiRuYW1lIgorCQlkb25lCisJKQorCisJdGVzdCAtbiAiJG1vZHVsZXMiICYmCisJZ2l0IGRpZmYtaW5kZXggJGNhY2hlZCAtLXJhdyAkaGVhZCAtLSAkbW9kdWxlcyB8CisJZ3JlcCAtZSAnXjoxNjAwMDAnIC1lICdeOlswLTddKiAxNjAwMDAnIHwKKwljdXQgLWMyLSB8CisJd2hpbGUgcmVhZCBtb2Rfc3JjIG1vZF9kc3Qgc2hhMV9zcmMgc2hhMV9kc3Qgc3RhdHVzIG5hbWUKKwlkbworCQlpZiB0ZXN0IC16ICIkY2FjaGVkIiAmJgorCQkJdGVzdCAkc2hhMV9kc3QgPSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisJCXRoZW4KKwkJCWNhc2UgIiRtb2RfZHN0IiBpbgorCQkJMTYwMDAwKQorCQkJCXNoYTFfZHN0PSQoR0lUX0RJUj0iJG5hbWUvLmdpdCIgZ2l0IHJldi1wYXJzZSBIRUFEKQorCQkJCTs7CisJCQkxMDA2NDQgfCAxMDA3NTUgfCAxMjAwMDApCisJCQkJc2hhMV9kc3Q9JChnaXQgaGFzaC1vYmplY3QgJG5hbWUpCisJCQkJOzsKKwkJCTAwMDAwMCkKKwkJCQk7OyAjIHJlbW92ZWQKKwkJCSopCisJCQkJIyB1bmV4cGVjdGVkIHR5cGUKKwkJCQllY2hvID4mMiAidW5leHBlY3RlZCBtb2RlICRtb2RfZHN0IgorCQkJCWNvbnRpbnVlIDs7CisJCQllc2FjCisJCWZpCisJCW1pc3Npbmdfc3JjPQorCQltaXNzaW5nX2RzdD0KKworCQl0ZXN0ICRtb2Rfc3JjID0gMTYwMDAwICYmCisJCSEgR0lUX0RJUj0iJG5hbWUvLmdpdCIgZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAkc2hhMV9zcmNeMCA+L2Rldi9udWxsIDI+JjEgJiYKKwkJbWlzc2luZ19zcmM9dAorCisJCXRlc3QgJG1vZF9kc3QgPSAxNjAwMDAgJiYKKwkJISBHSVRfRElSPSIkbmFtZS8uZ2l0IiBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICRzaGExX2RzdF4wID4vZGV2L251bGwgMj4mMSAmJgorCQltaXNzaW5nX2RzdD10CisKKwkJdG90YWxfY29tbWl0cz0KKwkJY2FzZSAiJG1pc3Npbmdfc3JjLCRtaXNzaW5nX2RzdCIgaW4KKwkJdCwpCisJCQllcnJtc2c9IiAgV2FybjogJG5hbWUgZG9lc24ndCBjb250YWluIGNvbW1pdCAkc2hhMV9zcmMiCisJCQk7OworCQksdCkKKwkJCWVycm1zZz0iICBXYXJuOiAkbmFtZSBkb2Vzbid0IGNvbnRhaW4gY29tbWl0ICRzaGExX2RzdCIKKwkJCTs7CisJCXQsdCkKKwkJCWVycm1zZz0iICBXYXJuOiAkbmFtZSBkb2Vzbid0IGNvbnRhaW4gY29tbWl0cyAkc2hhMV9zcmMgYW5kICRzaGExX2RzdCIKKwkJCTs7CisJCSopCisJCQllcnJtc2c9CisJCQl0b3RhbF9jb21taXRzPSQoCisJCQlpZiB0ZXN0ICRtb2Rfc3JjID0gMTYwMDAwIC1hICRtb2RfZHN0ID0gMTYwMDAwCisJCQl0aGVuCisJCQkJcmFuZ2U9IiRzaGExX3NyYy4uLiRzaGExX2RzdCIKKwkJCWVsaWYgdGVzdCAkbW9kX3NyYyA9IDE2MDAwMAorCQkJdGhlbgorCQkJCXJhbmdlPSRzaGExX3NyYworCQkJZWxzZQorCQkJCXJhbmdlPSRzaGExX2RzdAorCQkJZmkKKwkJCUdJVF9ESVI9IiRuYW1lLy5naXQiIFwKKwkJCWdpdCBsb2cgLS1wcmV0dHk9b25lbGluZSAtLWZpcnN0LXBhcmVudCAkcmFuZ2UgfCB3YyAtbAorCQkJKQorCQkJdG90YWxfY29tbWl0cz0iICgkKCgkdG90YWxfY29tbWl0cyArIDApKSkiCisJCQk7OworCQllc2FjCisKKwkJc2hhMV9hYmJyX3NyYz0kKGVjaG8gJHNoYTFfc3JjIHwgY3V0IC1jMS03KQorCQlzaGExX2FiYnJfZHN0PSQoZWNobyAkc2hhMV9kc3QgfCBjdXQgLWMxLTcpCisJCWlmIHRlc3QgJHN0YXR1cyA9IFQKKwkJdGhlbgorCQkJaWYgdGVzdCAkbW9kX2RzdCA9IDE2MDAwMAorCQkJdGhlbgorCQkJCWVjaG8gIiogJG5hbWUgJHNoYTFfYWJicl9zcmMoYmxvYiktPiRzaGExX2FiYnJfZHN0KHN1Ym1vZHVsZSkkdG90YWxfY29tbWl0czoiCisJCQllbHNlCisJCQkJZWNobyAiKiAkbmFtZSAkc2hhMV9hYmJyX3NyYyhzdWJtb2R1bGUpLT4kc2hhMV9hYmJyX2RzdChibG9iKSR0b3RhbF9jb21taXRzOiIKKwkJCWZpCisJCWVsc2UKKwkJCWVjaG8gIiogJG5hbWUgJHNoYTFfYWJicl9zcmMuLi4kc2hhMV9hYmJyX2RzdCR0b3RhbF9jb21taXRzOiIKKwkJZmkKKwkJaWYgdGVzdCAtbiAiJGVycm1zZyIKKwkJdGhlbgorCQkJIyBEb24ndCBnaXZlIGVycm9yIG1zZyBmb3IgbW9kaWZpY2F0aW9uIHdob3NlIGRzdCBpcyBub3Qgc3VibW9kdWxlCisJCQkjIGkuZS4gZGVsZXRlZCBvciBjaGFuZ2VkIHRvIGJsb2IKKwkJCXRlc3QgJG1vZF9kc3QgPSAxNjAwMDAgJiYgZWNobyAiJGVycm1zZyIKKwkJZWxzZQorCQkJaWYgdGVzdCAkbW9kX3NyYyA9IDE2MDAwMCAtYSAkbW9kX2RzdCA9IDE2MDAwMAorCQkJdGhlbgorCQkJCWxpbWl0PQorCQkJCXRlc3QgJHN1bW1hcnlfbGltaXQgLWd0IDAgJiYgbGltaXQ9Ii0kc3VtbWFyeV9saW1pdCIKKwkJCQlHSVRfRElSPSIkbmFtZS8uZ2l0IiBcCisJCQkJZ2l0IGxvZyAkbGltaXQgLS1wcmV0dHk9J2Zvcm1hdDogICVtICVzJyBcCisJCQkJLS1maXJzdC1wYXJlbnQgJHNoYTFfc3JjLi4uJHNoYTFfZHN0CisJCQllbGlmIHRlc3QgJG1vZF9kc3QgPSAxNjAwMDAKKwkJCXRoZW4KKwkJCQlHSVRfRElSPSIkbmFtZS8uZ2l0IiBcCisJCQkJZ2l0IGxvZyAtLXByZXR0eT0nZm9ybWF0OiAgPiAlcycgLTEgJHNoYTFfZHN0CisJCQllbHNlCisJCQkJR0lUX0RJUj0iJG5hbWUvLmdpdCIgXAorCQkJCWdpdCBsb2cgLS1wcmV0dHk9J2Zvcm1hdDogIDwgJXMnIC0xICRzaGExX3NyYworCQkJZmkKKwkJCWVjaG8KKwkJZmkKKwkJZWNobworCWRvbmUKK30KKyMKKyMgTGlzdCBhbGwgc3VibW9kdWxlcywgcHJlZml4ZWQgd2l0aDoKKyMgIC0gc3VibW9kdWxlIG5vdCBpbml0aWFsaXplZAorIyAgKyBkaWZmZXJlbnQgcmV2aXNpb24gY2hlY2tlZCBvdXQKKyMKKyMgSWYgLS1jYWNoZWQgd2FzIHNwZWNpZmllZCB0aGUgcmV2aXNpb24gaW4gdGhlIGluZGV4IHdpbGwgYmUgcHJpbnRlZAorIyBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50bHkgY2hlY2tlZCBvdXQgcmV2aXNpb24uCisjCisjICRAID0gcmVxdWVzdGVkIHBhdGhzIChkZWZhdWx0IHRvIGFsbCkKKyMKK2NtZF9zdGF0dXMoKQoreworCSMgcGFyc2UgJGFyZ3MgYWZ0ZXIgInN1Ym1vZHVsZSAuLi4gc3RhdHVzIi4KKwl3aGlsZSB0ZXN0ICQjIC1uZSAwCisJZG8KKwkJY2FzZSAiJDEiIGluCisJCS1xfC0tcXVpZXQpCisJCQlxdWlldD0xCisJCQk7OworCQktLWNhY2hlZCkKKwkJCWNhY2hlZD0xCisJCQk7OworCQktLSkKKwkJCXNoaWZ0CisJCQlicmVhaworCQkJOzsKKwkJLSopCisJCQl1c2FnZQorCQkJOzsKKwkJKikKKwkJCWJyZWFrCisJCQk7OworCQllc2FjCisJCXNoaWZ0CisJZG9uZQorCisJZ2l0IGxzLWZpbGVzIC0tc3RhZ2UgLS0gIiRAIiB8IGdyZXAgJ14xNjAwMDAgJyB8CisJd2hpbGUgcmVhZCBtb2RlIHNoYTEgc3RhZ2UgcGF0aAorCWRvCisJCW5hbWU9JChtb2R1bGVfbmFtZSAiJHBhdGgiKSB8fCBleGl0CisJCXVybD0kKGdpdCBjb25maWcgc3VibW9kdWxlLiIkbmFtZSIudXJsKQorCQlpZiB0ZXN0IC16ICIkdXJsIiB8fCAhIHRlc3QgLWQgIiRwYXRoIi8uZ2l0CisJCXRoZW4KKwkJCXNheSAiLSRzaGExICRwYXRoIgorCQkJY29udGludWU7CisJCWZpCisJCXNldF9uYW1lX3JldiAiJHBhdGgiICIkc2hhMSIKKwkJaWYgZ2l0IGRpZmYtZmlsZXMgLS1xdWlldCAtLSAiJHBhdGgiCisJCXRoZW4KKwkJCXNheSAiICRzaGExICRwYXRoJHJldm5hbWUiCisJCWVsc2UKKwkJCWlmIHRlc3QgLXogIiRjYWNoZWQiCisJCQl0aGVuCisJCQkJc2hhMT0kKHVuc2V0IEdJVF9ESVI7IGNkICIkcGF0aCIgJiYgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKQorCQkJCXNldF9uYW1lX3JldiAiJHBhdGgiICIkc2hhMSIKKwkJCWZpCisJCQlzYXkgIiskc2hhMSAkcGF0aCRyZXZuYW1lIgorCQlmaQorCWRvbmUKK30KKworIyBUaGlzIGxvb3AgcGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIGZpbmQgdGhlCisjIHN1YmNvbW1hbmQgbmFtZSB0byBkaXNwYXRjaC4gIFBhcnNpbmcgb2YgdGhlIHN1YmNvbW1hbmQgc3BlY2lmaWMKKyMgb3B0aW9ucyBhcmUgcHJpbWFyaWx5IGRvbmUgYnkgdGhlIHN1YmNvbW1hbmQgaW1wbGVtZW50YXRpb25zLgorIyBTdWJjb21tYW5kIHNwZWNpZmljIG9wdGlvbnMgc3VjaCBhcyAtLWJyYW5jaCBhbmQgLS1jYWNoZWQgYXJlCisjIHBhcnNlZCBoZXJlIGFzIHdlbGwsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorCit3aGlsZSB0ZXN0ICQjICE9IDAgJiYgdGVzdCAteiAiJGNvbW1hbmQiCitkbworCWNhc2UgIiQxIiBpbgorCWFkZCB8IGluaXQgfCB1cGRhdGUgfCBzdGF0dXMgfCBzdW1tYXJ5KQorCQljb21tYW5kPSQxCisJCTs7CisJLXF8LS1xdWlldCkKKwkJcXVpZXQ9MQorCQk7OworCS1ifC0tYnJhbmNoKQorCQljYXNlICIkMiIgaW4KKwkJJycpCisJCQl1c2FnZQorCQkJOzsKKwkJZXNhYworCQlicmFuY2g9IiQyIjsgc2hpZnQKKwkJOzsKKwktLWNhY2hlZCkKKwkJY2FjaGVkPSIkMSIKKwkJOzsKKwktLSkKKwkJYnJlYWsKKwkJOzsKKwktKikKKwkJdXNhZ2UKKwkJOzsKKwkqKQorCQlicmVhaworCQk7OworCWVzYWMKKwlzaGlmdAorZG9uZQorCisjIE5vIGNvbW1hbmQgd29yZCBkZWZhdWx0cyB0byAic3RhdHVzIgordGVzdCAtbiAiJGNvbW1hbmQiIHx8IGNvbW1hbmQ9c3RhdHVzCisKKyMgIi1iIGJyYW5jaCIgaXMgYWNjZXB0ZWQgb25seSBieSAiYWRkIgoraWYgdGVzdCAtbiAiJGJyYW5jaCIgJiYgdGVzdCAiJGNvbW1hbmQiICE9IGFkZAordGhlbgorCXVzYWdlCitmaQorCisjICItLWNhY2hlZCIgaXMgYWNjZXB0ZWQgb25seSBieSAic3RhdHVzIiBhbmQgInN1bW1hcnkiCitpZiB0ZXN0IC1uICIkY2FjaGVkIiAmJiB0ZXN0ICIkY29tbWFuZCIgIT0gc3RhdHVzIC1hICIkY29tbWFuZCIgIT0gc3VtbWFyeQordGhlbgorCXVzYWdlCitmaQorCisiY21kXyRjb21tYW5kIiAiJEAiCmRpZmYgLS1naXQgYS9naXQtc3ZuLnBlcmwgYi9naXQtc3ZuLnBlcmwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODFhZmI1YwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1zdm4ucGVybApAQCAtMCwwICsxLDQ4NjQgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKyMgQ29weXJpZ2h0IChDKSAyMDA2LCBFcmljIFdvbmcgPG5vcm1hbHBlcnNvbkB5aGJ0Lm5ldD4KKyMgTGljZW5zZTogR1BMIHYyIG9yIGxhdGVyCit1c2Ugd2FybmluZ3M7Cit1c2Ugc3RyaWN0OwordXNlIHZhcnMgcXcvCSRBVVRIT1IgJFZFUlNJT04KKwkJJHNoYTEgJHNoYTFfc2hvcnQgJF9yZXZpc2lvbgorCQkkX3EgJF9hdXRob3JzICV1c2Vycy87CiskQVVUSE9SID0gJ0VyaWMgV29uZyA8bm9ybWFscGVyc29uQHloYnQubmV0Pic7CiskVkVSU0lPTiA9ICdAQEdJVF9WRVJTSU9OQEAnOworCisjIEZyb20gd2hpY2ggc3ViZGlyIGhhdmUgd2UgYmVlbiBpbnZva2VkPworbXkgJGNtZF9kaXJfcHJlZml4ID0gZXZhbCB7CisJY29tbWFuZF9vbmVsaW5lKFtxdy9yZXYtcGFyc2UgLS1zaG93LXByZWZpeC9dLCBTVERFUlIgPT4gMCkKK30gfHwgJyc7CisKK215ICRnaXRfZGlyX3VzZXJfc2V0ID0gMSBpZiBkZWZpbmVkICRFTlZ7R0lUX0RJUn07CiskRU5We0dJVF9ESVJ9IHx8PSAnLmdpdCc7CiskR2l0OjpTVk46OmRlZmF1bHRfcmVwb19pZCA9ICdzdm4nOworJEdpdDo6U1ZOOjpkZWZhdWx0X3JlZl9pZCA9ICRFTlZ7R0lUX1NWTl9JRH0gfHwgJ2dpdC1zdm4nOworJEdpdDo6U1ZOOjpSYTo6X2xvZ193aW5kb3dfc2l6ZSA9IDEwMDsKKworJEdpdDo6U1ZOOjpMb2c6OlRaID0gJEVOVntUWn07CiskRU5We1RafSA9ICdVVEMnOworJHwgPSAxOyAjIHVuYnVmZmVyIFNURE9VVAorCitzdWIgZmF0YWwgKEApIHsgcHJpbnQgU1RERVJSICJAX1xuIjsgZXhpdCAxIH0KK3JlcXVpcmUgU1ZOOjpDb3JlOyAjIHVzZSgpLWluZyB0aGlzIGNhdXNlcyBzZWdmYXVsdHMgZm9yIG1lLi4uICpzaHJ1ZyoKK3JlcXVpcmUgU1ZOOjpSYTsKK3JlcXVpcmUgU1ZOOjpEZWx0YTsKK2lmICgkU1ZOOjpDb3JlOjpWRVJTSU9OIGx0ICcxLjEuMCcpIHsKKwlmYXRhbCAiTmVlZCBTVk46OkNvcmUgMS4xLjAgb3IgYmV0dGVyIChnb3QgJFNWTjo6Q29yZTo6VkVSU0lPTikiOworfQorcHVzaCBAR2l0OjpTVk46OlJhOjpJU0EsICdTVk46OlJhJzsKK3B1c2ggQFNWTjo6R2l0OjpFZGl0b3I6OklTQSwgJ1NWTjo6RGVsdGE6OkVkaXRvcic7CitwdXNoIEBTVk46OkdpdDo6RmV0Y2hlcjo6SVNBLCAnU1ZOOjpEZWx0YTo6RWRpdG9yJzsKK3VzZSBDYXJwIHF3L2Nyb2FrLzsKK3VzZSBEaWdlc3Q6Ok1ENTsKK3VzZSBJTzo6RmlsZSBxdy8vOwordXNlIEZpbGU6OkJhc2VuYW1lIHF3L2Rpcm5hbWUgYmFzZW5hbWUvOwordXNlIEZpbGU6OlBhdGggcXcvbWtwYXRoLzsKK3VzZSBHZXRvcHQ6OkxvbmcgcXcvOmNvbmZpZyBnbnVfZ2V0b3B0IG5vX2lnbm9yZV9jYXNlIGF1dG9fYWJicmV2LzsKK3VzZSBJUEM6Ok9wZW4zOwordXNlIEdpdDsKKworQkVHSU4geworCSMgaW1wb3J0IGZ1bmN0aW9ucyBmcm9tIEdpdCBpbnRvIG91ciBwYWNrYWdlcywgZW4gbWFzc2UKKwlubyBzdHJpY3QgJ3JlZnMnOworCWZvcmVhY2ggKHF3L2NvbW1hbmQgY29tbWFuZF9vbmVsaW5lIGNvbW1hbmRfbm9pc3kgY29tbWFuZF9vdXRwdXRfcGlwZQorCSAgICAgICAgICAgIGNvbW1hbmRfaW5wdXRfcGlwZSBjb21tYW5kX2Nsb3NlX3BpcGUvKSB7CisJCWZvciBteSAkcGFja2FnZSAoIHF3KFNWTjo6R2l0OjpFZGl0b3IgU1ZOOjpHaXQ6OkZldGNoZXIKKwkJCUdpdDo6U1ZOOjpNaWdyYXRpb24gR2l0OjpTVk46OkxvZyBHaXQ6OlNWTiksCisJCQlfX1BBQ0tBR0VfXykgeworCQkJKnsiJHtwYWNrYWdlfTo6JF8ifSA9IFwmeyJHaXQ6OiRfIn07CisJCX0KKwl9Cit9CisKK215ICgkU1ZOKTsKKworJHNoYTEgPSBxci9bYS1mXGRdezQwfS87Ciskc2hhMV9zaG9ydCA9IHFyL1thLWZcZF17NCw0MH0vOworbXkgKCRfc3RkaW4sICRfaGVscCwgJF9lZGl0LAorCSRfbWVzc2FnZSwgJF9maWxlLAorCSRfdGVtcGxhdGUsICRfc2hhcmVkLAorCSRfdmVyc2lvbiwgJF9mZXRjaF9hbGwsICRfbm9fcmViYXNlLAorCSRfbWVyZ2UsICRfc3RyYXRlZ3ksICRfZHJ5X3J1biwgJF9sb2NhbCwKKwkkX3ByZWZpeCwgJF9ub19jaGVja291dCwgJF91cmwsICRfdmVyYm9zZSk7CiskR2l0OjpTVk46Ol9mb2xsb3dfcGFyZW50ID0gMTsKK215ICVyZW1vdGVfb3B0cyA9ICggJ3VzZXJuYW1lPXMnID0+IFwkR2l0OjpTVk46OlByb21wdDo6X3VzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAnY29uZmlnLWRpcj1zJyA9PiBcJEdpdDo6U1ZOOjpSYTo6Y29uZmlnX2RpciwKKyAgICAgICAgICAgICAgICAgICAgJ25vLWF1dGgtY2FjaGUnID0+IFwkR2l0OjpTVk46OlByb21wdDo6X25vX2F1dGhfY2FjaGUgKTsKK215ICVmY19vcHRzID0gKCAnZm9sbG93LXBhcmVudHxmb2xsb3chJyA9PiBcJEdpdDo6U1ZOOjpfZm9sbG93X3BhcmVudCwKKwkJJ2F1dGhvcnMtZmlsZXxBPXMnID0+IFwkX2F1dGhvcnMsCisJCSdyZXBhY2s6aScgPT4gXCRHaXQ6OlNWTjo6X3JlcGFjaywKKwkJJ25vTWV0YWRhdGEnID0+IFwkR2l0OjpTVk46Ol9ub19tZXRhZGF0YSwKKwkJJ3VzZVN2bVByb3BzJyA9PiBcJEdpdDo6U1ZOOjpfdXNlX3N2bV9wcm9wcywKKwkJJ3VzZVN2bnN5bmNQcm9wcycgPT4gXCRHaXQ6OlNWTjo6X3VzZV9zdm5zeW5jX3Byb3BzLAorCQknbG9nLXdpbmRvdy1zaXplPWknID0+IFwkR2l0OjpTVk46OlJhOjpfbG9nX3dpbmRvd19zaXplLAorCQknbm8tY2hlY2tvdXQnID0+IFwkX25vX2NoZWNrb3V0LAorCQkncXVpZXR8cScgPT4gXCRfcSwKKwkJJ3JlcGFjay1mbGFnc3xyZXBhY2stYXJnc3xyZXBhY2stb3B0cz1zJyA9PgorCQkgICBcJEdpdDo6U1ZOOjpfcmVwYWNrX2ZsYWdzLAorCQkndXNlLWxvZy1hdXRob3InID0+IFwkR2l0OjpTVk46Ol91c2VfbG9nX2F1dGhvciwKKwkJJXJlbW90ZV9vcHRzICk7CisKK215ICgkX3RydW5rLCAkX3RhZ3MsICRfYnJhbmNoZXMsICRfc3RkbGF5b3V0KTsKK215ICVpY3Y7CitteSAlaW5pdF9vcHRzID0gKCAndGVtcGxhdGU9cycgPT4gXCRfdGVtcGxhdGUsICdzaGFyZWQ6cycgPT4gXCRfc2hhcmVkLAorICAgICAgICAgICAgICAgICAgJ3RydW5rfFQ9cycgPT4gXCRfdHJ1bmssICd0YWdzfHQ9cycgPT4gXCRfdGFncywKKyAgICAgICAgICAgICAgICAgICdicmFuY2hlc3xiPXMnID0+IFwkX2JyYW5jaGVzLCAncHJlZml4PXMnID0+IFwkX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICdzdGRsYXlvdXR8cycgPT4gXCRfc3RkbGF5b3V0LAorICAgICAgICAgICAgICAgICAgJ21pbmltaXplLXVybHxtJyA9PiBcJEdpdDo6U1ZOOjpfbWluaW1pemVfdXJsLAorCQkgICduby1tZXRhZGF0YScgPT4gc3ViIHsgJGljdntub01ldGFkYXRhfSA9IDEgfSwKKwkJICAndXNlLXN2bS1wcm9wcycgPT4gc3ViIHsgJGljdnt1c2VTdm1Qcm9wc30gPSAxIH0sCisJCSAgJ3VzZS1zdm5zeW5jLXByb3BzJyA9PiBzdWIgeyAkaWN2e3VzZVN2bnN5bmNQcm9wc30gPSAxIH0sCisJCSAgJ3Jld3JpdGUtcm9vdD1zJyA9PiBzdWIgeyAkaWN2e3Jld3JpdGVSb290fSA9ICRfWzFdIH0sCisgICAgICAgICAgICAgICAgICAlcmVtb3RlX29wdHMgKTsKK215ICVjbXRfb3B0cyA9ICggJ2VkaXR8ZScgPT4gXCRfZWRpdCwKKwkJJ3JtZGlyJyA9PiBcJFNWTjo6R2l0OjpFZGl0b3I6Ol9ybWRpciwKKwkJJ2ZpbmQtY29waWVzLWhhcmRlcicgPT4gXCRTVk46OkdpdDo6RWRpdG9yOjpfZmluZF9jb3BpZXNfaGFyZGVyLAorCQknbD1pJyA9PiBcJFNWTjo6R2l0OjpFZGl0b3I6Ol9yZW5hbWVfbGltaXQsCisJCSdjb3B5LXNpbWlsYXJpdHl8Qz1pJz0+IFwkU1ZOOjpHaXQ6OkVkaXRvcjo6X2NwX3NpbWlsYXJpdHkKKyk7CisKK215ICVjbWQgPSAoCisJZmV0Y2ggPT4gWyBcJmNtZF9mZXRjaCwgIkRvd25sb2FkIG5ldyByZXZpc2lvbnMgZnJvbSBTVk4iLAorCQkJeyAncmV2aXNpb258cj1zJyA9PiBcJF9yZXZpc2lvbiwKKwkJCSAgJ2ZldGNoLWFsbHxhbGwnID0+IFwkX2ZldGNoX2FsbCwKKwkJCSAgICVmY19vcHRzIH0gXSwKKwljbG9uZSA9PiBbIFwmY21kX2Nsb25lLCAiSW5pdGlhbGl6ZSBhbmQgZmV0Y2ggcmV2aXNpb25zIiwKKwkJCXsgJ3JldmlzaW9ufHI9cycgPT4gXCRfcmV2aXNpb24sCisJCQkgICAlZmNfb3B0cywgJWluaXRfb3B0cyB9IF0sCisJaW5pdCA9PiBbIFwmY21kX2luaXQsICJJbml0aWFsaXplIGEgcmVwbyBmb3IgdHJhY2tpbmciIC4KKwkJCSAgIiAocmVxdWlyZXMgVVJMIGFyZ3VtZW50KSIsCisJCQkgIFwlaW5pdF9vcHRzIF0sCisJJ211bHRpLWluaXQnID0+IFsgXCZjbWRfbXVsdGlfaW5pdCwKKwkgICAgICAgICAgICAgICAgICAiRGVwcmVjYXRlZCBhbGlhcyBmb3IgIi4KKwkJCSAgIickMCBpbml0IC1UPHRydW5rPiAtYjxicmFuY2hlcz4gLXQ8dGFncz4nIiwKKwkJCSAgXCVpbml0X29wdHMgXSwKKwlkY29tbWl0ID0+IFsgXCZjbWRfZGNvbW1pdCwKKwkgICAgICAgICAgICAgJ0NvbW1pdCBzZXZlcmFsIGRpZmZzIHRvIG1lcmdlIHdpdGggdXBzdHJlYW0nLAorCQkJeyAnbWVyZ2V8bXxNJyA9PiBcJF9tZXJnZSwKKwkJCSAgJ3N0cmF0ZWd5fHM9cycgPT4gXCRfc3RyYXRlZ3ksCisJCQkgICd2ZXJib3NlfHYnID0+IFwkX3ZlcmJvc2UsCisJCQkgICdkcnktcnVufG4nID0+IFwkX2RyeV9ydW4sCisJCQkgICdmZXRjaC1hbGx8YWxsJyA9PiBcJF9mZXRjaF9hbGwsCisJCQkgICduby1yZWJhc2UnID0+IFwkX25vX3JlYmFzZSwKKwkJCSVjbXRfb3B0cywgJWZjX29wdHMgfSBdLAorCSdzZXQtdHJlZScgPT4gWyBcJmNtZF9zZXRfdHJlZSwKKwkgICAgICAgICAgICAgICAgIlNldCBhbiBTVk4gcmVwb3NpdG9yeSB0byBhIGdpdCB0cmVlLWlzaCIsCisJCQl7ICdzdGRpbnwnID0+IFwkX3N0ZGluLCAlY210X29wdHMsICVmY19vcHRzLCB9IF0sCisJJ2NyZWF0ZS1pZ25vcmUnID0+IFsgXCZjbWRfY3JlYXRlX2lnbm9yZSwKKwkJCSAgICAgJ0NyZWF0ZSBhIC5naXRpZ25vcmUgcGVyIHN2bjppZ25vcmUnLAorCQkJICAgICB7ICdyZXZpc2lvbnxyPWknID0+IFwkX3JldmlzaW9uCisJCQkgICAgIH0gXSwKKyAgICAgICAgJ3Byb3BnZXQnID0+IFsgXCZjbWRfcHJvcGdldCwKKwkJICAgICAgICdQcmludCB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSBvbiBhIGZpbGUgb3IgZGlyZWN0b3J5JywKKwkJICAgICAgIHsgJ3JldmlzaW9ufHI9aScgPT4gXCRfcmV2aXNpb24gfSBdLAorICAgICAgICAncHJvcGxpc3QnID0+IFsgXCZjbWRfcHJvcGxpc3QsCisJCSAgICAgICAnTGlzdCBhbGwgcHJvcGVydGllcyBvZiBhIGZpbGUgb3IgZGlyZWN0b3J5JywKKwkJICAgICAgIHsgJ3JldmlzaW9ufHI9aScgPT4gXCRfcmV2aXNpb24gfSBdLAorCSdzaG93LWlnbm9yZScgPT4gWyBcJmNtZF9zaG93X2lnbm9yZSwgIlNob3cgc3ZuOmlnbm9yZSBsaXN0aW5ncyIsCisJCQl7ICdyZXZpc2lvbnxyPWknID0+IFwkX3JldmlzaW9uCisJCQl9IF0sCisJJ3Nob3ctZXh0ZXJuYWxzJyA9PiBbIFwmY21kX3Nob3dfZXh0ZXJuYWxzLCAiU2hvdyBzdm46ZXh0ZXJuYWxzIGxpc3RpbmdzIiwKKwkJCXsgJ3JldmlzaW9ufHI9aScgPT4gXCRfcmV2aXNpb24KKwkJCX0gXSwKKwknbXVsdGktZmV0Y2gnID0+IFsgXCZjbWRfbXVsdGlfZmV0Y2gsCisJICAgICAgICAgICAgICAgICAgICJEZXByZWNhdGVkIGFsaWFzIGZvciAkMCBmZXRjaCAtLWFsbCIsCisJCQkgICB7ICdyZXZpc2lvbnxyPXMnID0+IFwkX3JldmlzaW9uLCAlZmNfb3B0cyB9IF0sCisJJ21pZ3JhdGUnID0+IFsgc3ViIHsgfSwKKwkgICAgICAgICAgICAgICAjIG5vLW9wLCB3ZSBhdXRvbWF0aWNhbGx5IHJ1biB0aGlzIGFueXdheXMsCisJICAgICAgICAgICAgICAgJ01pZ3JhdGUgY29uZmlndXJhdGlvbi9tZXRhZGF0YS9sYXlvdXQgZnJvbQorCQkgICAgICAgIHByZXZpb3VzIHZlcnNpb25zIG9mIGdpdC1zdm4nLAorICAgICAgICAgICAgICAgICAgICAgICB7ICdtaW5pbWl6ZScgPT4gXCRHaXQ6OlNWTjo6TWlncmF0aW9uOjpfbWluaW1pemUsCisJCQkgJXJlbW90ZV9vcHRzIH0gXSwKKwknbG9nJyA9PiBbIFwmR2l0OjpTVk46OkxvZzo6Y21kX3Nob3dfbG9nLCAnU2hvdyBjb21taXQgbG9ncycsCisJCQl7ICdsaW1pdD1pJyA9PiBcJEdpdDo6U1ZOOjpMb2c6OmxpbWl0LAorCQkJICAncmV2aXNpb258cj1zJyA9PiBcJF9yZXZpc2lvbiwKKwkJCSAgJ3ZlcmJvc2V8dicgPT4gXCRHaXQ6OlNWTjo6TG9nOjp2ZXJib3NlLAorCQkJICAnaW5jcmVtZW50YWwnID0+IFwkR2l0OjpTVk46OkxvZzo6aW5jcmVtZW50YWwsCisJCQkgICdvbmVsaW5lJyA9PiBcJEdpdDo6U1ZOOjpMb2c6Om9uZWxpbmUsCisJCQkgICdzaG93LWNvbW1pdCcgPT4gXCRHaXQ6OlNWTjo6TG9nOjpzaG93X2NvbW1pdCwKKwkJCSAgJ25vbi1yZWN1cnNpdmUnID0+IFwkR2l0OjpTVk46OkxvZzo6bm9uX3JlY3Vyc2l2ZSwKKwkJCSAgJ2F1dGhvcnMtZmlsZXxBPXMnID0+IFwkX2F1dGhvcnMsCisJCQkgICdjb2xvcicgPT4gXCRHaXQ6OlNWTjo6TG9nOjpjb2xvciwKKwkJCSAgJ3BhZ2VyPXMnID0+IFwkR2l0OjpTVk46OkxvZzo6cGFnZXIKKwkJCX0gXSwKKwknZmluZC1yZXYnID0+IFsgXCZjbWRfZmluZF9yZXYsICJUcmFuc2xhdGUgYmV0d2VlbiBTVk4gcmV2aXNpb24gbnVtYmVycyBhbmQgdHJlZS1pc2giLAorCQkJe30gXSwKKwkncmViYXNlJyA9PiBbIFwmY21kX3JlYmFzZSwgIkZldGNoIGFuZCByZWJhc2UgeW91ciB3b3JraW5nIGRpcmVjdG9yeSIsCisJCQl7ICdtZXJnZXxtfE0nID0+IFwkX21lcmdlLAorCQkJICAndmVyYm9zZXx2JyA9PiBcJF92ZXJib3NlLAorCQkJICAnc3RyYXRlZ3l8cz1zJyA9PiBcJF9zdHJhdGVneSwKKwkJCSAgJ2xvY2FsfGwnID0+IFwkX2xvY2FsLAorCQkJICAnZmV0Y2gtYWxsfGFsbCcgPT4gXCRfZmV0Y2hfYWxsLAorCQkJICAlZmNfb3B0cyB9IF0sCisJJ2NvbW1pdC1kaWZmJyA9PiBbIFwmY21kX2NvbW1pdF9kaWZmLAorCSAgICAgICAgICAgICAgICAgICAnQ29tbWl0IGEgZGlmZiBiZXR3ZWVuIHR3byB0cmVlcycsCisJCQl7ICdtZXNzYWdlfG09cycgPT4gXCRfbWVzc2FnZSwKKwkJCSAgJ2ZpbGV8Rj1zJyA9PiBcJF9maWxlLAorCQkJICAncmV2aXNpb258cj1zJyA9PiBcJF9yZXZpc2lvbiwKKwkJCSVjbXRfb3B0cyB9IF0sCisJJ2luZm8nID0+IFsgXCZjbWRfaW5mbywKKwkJICAgICJTaG93IGluZm8gYWJvdXQgdGhlIGxhdGVzdCBTVk4gcmV2aXNpb24KKwkJICAgICBvbiB0aGUgY3VycmVudCBicmFuY2giLAorCQkgICAgeyAndXJsJyA9PiBcJF91cmwsIH0gXSwKKwknYmxhbWUnID0+IFsgXCZHaXQ6OlNWTjo6TG9nOjpjbWRfYmxhbWUsCisJICAgICAgICAgICAgIlNob3cgd2hhdCByZXZpc2lvbiBhbmQgYXV0aG9yIGxhc3QgbW9kaWZpZWQgZWFjaCBsaW5lIG9mIGEgZmlsZSIsCisJICAgICAgICAgICAge30gXSwKKyk7CisKK215ICRjbWQ7Citmb3IgKG15ICRpID0gMDsgJGkgPCBAQVJHVjsgJGkrKykgeworCWlmIChkZWZpbmVkICRjbWR7JEFSR1ZbJGldfSkgeworCQkkY21kID0gJEFSR1ZbJGldOworCQlzcGxpY2UgQEFSR1YsICRpLCAxOworCQlsYXN0OworCX0KK307CisKKyMgbWFrZSBzdXJlIHdlJ3JlIGFsd2F5cyBydW5uaW5nIGF0IHRoZSB0b3AtbGV2ZWwgd29ya2luZyBkaXJlY3RvcnkKK3VubGVzcyAoJGNtZCAmJiAkY21kID1+IC8oPzpjbG9uZXxpbml0fG11bHRpLWluaXQpJC8pIHsKKwl1bmxlc3MgKC1kICRFTlZ7R0lUX0RJUn0pIHsKKwkJaWYgKCRnaXRfZGlyX3VzZXJfc2V0KSB7CisJCQlkaWUgIkdJVF9ESVI9JEVOVntHSVRfRElSfSBleHBsaWNpdGx5IHNldCwgIiwKKwkJCSAgICAiYnV0IGl0IGlzIG5vdCBhIGRpcmVjdG9yeVxuIjsKKwkJfQorCQlteSAkZ2l0X2RpciA9IGRlbGV0ZSAkRU5We0dJVF9ESVJ9OworCQljaG9tcChteSAkY2R1cCA9IGNvbW1hbmRfb25lbGluZShxdy9yZXYtcGFyc2UgLS1zaG93LWNkdXAvKSk7CisJCXVubGVzcyAobGVuZ3RoICRjZHVwKSB7CisJCQlkaWUgIkFscmVhZHkgYXQgdG9wbGV2ZWwsIGJ1dCAkZ2l0X2RpciAiLAorCQkJICAgICJub3QgZm91bmQgJyRjZHVwJ1xuIjsKKwkJfQorCQljaGRpciAkY2R1cCBvciBkaWUgIlVuYWJsZSB0byBjaGRpciB1cCB0byAnJGNkdXAnXG4iOworCQl1bmxlc3MgKC1kICRnaXRfZGlyKSB7CisJCQlkaWUgIiRnaXRfZGlyIHN0aWxsIG5vdCBmb3VuZCBhZnRlciBnb2luZyB0byAiLAorCQkJICAgICInJGNkdXAnXG4iOworCQl9CisJCSRFTlZ7R0lUX0RJUn0gPSAkZ2l0X2RpcjsKKwl9Cit9CisKK215ICVvcHRzID0gJXskY21keyRjbWR9LT5bMl19IGlmIChkZWZpbmVkICRjbWQpOworCityZWFkX3JlcG9fY29uZmlnKFwlb3B0cyk7CitHZXRvcHQ6Okxvbmc6OkNvbmZpZ3VyZSgncGFzc190aHJvdWdoJykgaWYgKCRjbWQgJiYgJGNtZCBlcSAnbG9nJyk7CitteSAkcnYgPSBHZXRPcHRpb25zKCVvcHRzLCAnaGVscHxIfGgnID0+IFwkX2hlbHAsICd2ZXJzaW9ufFYnID0+IFwkX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICdtaW5pbWl6ZS1jb25uZWN0aW9ucycgPT4gXCRHaXQ6OlNWTjo6TWlncmF0aW9uOjpfbWluaW1pemUsCisgICAgICAgICAgICAgICAgICAgICdpZHxpPXMnID0+IFwkR2l0OjpTVk46OmRlZmF1bHRfcmVmX2lkLAorICAgICAgICAgICAgICAgICAgICAnc3ZuLXJlbW90ZXxyZW1vdGV8Uj1zJyA9PiBzdWIgeworICAgICAgICAgICAgICAgICAgICAgICAkR2l0OjpTVk46Om5vX3JldXNlX2V4aXN0aW5nID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgJEdpdDo6U1ZOOjpkZWZhdWx0X3JlcG9faWQgPSAkX1sxXSB9KTsKK2V4aXQgMSBpZiAoISRydiAmJiAkY21kICYmICRjbWQgbmUgJ2xvZycpOworCit1c2FnZSgwKSBpZiAkX2hlbHA7Cit2ZXJzaW9uKCkgaWYgJF92ZXJzaW9uOwordXNhZ2UoMSkgdW5sZXNzIGRlZmluZWQgJGNtZDsKK2xvYWRfYXV0aG9ycygpIGlmICRfYXV0aG9yczsKKwordW5sZXNzICgkY21kID1+IC9eKD86Y2xvbmV8aW5pdHxtdWx0aS1pbml0fGNvbW1pdC1kaWZmKSQvKSB7CisJR2l0OjpTVk46Ok1pZ3JhdGlvbjo6bWlncmF0aW9uX2NoZWNrKCk7Cit9CitHaXQ6OlNWTjo6aW5pdF92YXJzKCk7CitldmFsIHsKKwlHaXQ6OlNWTjo6dmVyaWZ5X3JlbW90ZXNfc2FuaXR5KCk7CisJJGNtZHskY21kfS0+WzBdLT4oQEFSR1YpOworfTsKK2ZhdGFsICRAIGlmICRAOworcG9zdF9mZXRjaF9jaGVja291dCgpOworZXhpdCAwOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBwcmltYXJ5IGZ1bmN0aW9ucyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWIgdXNhZ2UgeworCW15ICRleGl0ID0gc2hpZnQgfHwgMDsKKwlteSAkZmQgPSAkZXhpdCA/IFwqU1RERVJSIDogXCpTVERPVVQ7CisJcHJpbnQgJGZkIDw8IiI7CitnaXQtc3ZuIC0gYmlkaXJlY3Rpb25hbCBvcGVyYXRpb25zIGJldHdlZW4gYSBzaW5nbGUgU3VidmVyc2lvbiB0cmVlIGFuZCBnaXQKK1VzYWdlOiAkMCA8Y29tbWFuZD4gW29wdGlvbnNdIFthcmd1bWVudHNdXG4KKworCXByaW50ICRmZCAiQXZhaWxhYmxlIGNvbW1hbmRzOlxuIiB1bmxlc3MgJGNtZDsKKworCWZvcmVhY2ggKHNvcnQga2V5cyAlY21kKSB7CisJCW5leHQgaWYgJGNtZCAmJiAkY21kIG5lICRfOworCQluZXh0IGlmIC9ebXVsdGktLzsgIyBkb24ndCBzaG93IGRlcHJlY2F0ZWQgY29tbWFuZHMKKwkJcHJpbnQgJGZkICcgICcscGFjaygnQTE3JywkXyksJGNtZHskX30tPlsxXSwiXG4iOworCQlmb3JlYWNoIChzb3J0IGtleXMgJXskY21keyRffS0+WzJdfSkgeworCQkJIyBtaXhlZC1jYXNlIG9wdGlvbnMgYXJlIGZvciAuZ2l0L2NvbmZpZyBvbmx5CisJCQluZXh0IGlmIC9bQS1aXS8gJiYgL15bYS16XSskL2k7CisJCQkjIHByaW50cyBvdXQgYXJndW1lbnRzIGFzIHRoZXkgc2hvdWxkIGJlIHBhc3NlZDoKKwkJCW15ICR4ID0gcyNbOj1dcyQjIyA/ICc8YXJnPicgOiBzI1s6PV1pJCMjID8gJzxudW0+JyA6ICcnOworCQkJcHJpbnQgJGZkICcgJyB4IDIxLCBqb2luKCcsICcsIG1hcCB7IGxlbmd0aCAkXyA+IDEgPworCQkJCQkJCSItLSRfIiA6ICItJF8iIH0KKwkJCQkJCXNwbGl0IC9cfC8sJF8pLCIgJHhcbiI7CisJCX0KKwl9CisJcHJpbnQgJGZkIDw8IiI7CitcbkdJVF9TVk5fSUQgbWF5IGJlIHNldCBpbiB0aGUgZW52aXJvbm1lbnQgb3IgdmlhIHRoZSAtLWlkLy1pIHN3aXRjaCB0byBhbgorYXJiaXRyYXJ5IGlkZW50aWZpZXIgaWYgeW91J3JlIHRyYWNraW5nIG11bHRpcGxlIFNWTiBicmFuY2hlcy9yZXBvc2l0b3JpZXMgaW4KK29uZSBnaXQgcmVwb3NpdG9yeSBhbmQgd2FudCB0byBrZWVwIHRoZW0gc2VwYXJhdGUuICBTZWUgZ2l0LXN2bigxKSBmb3IgbW9yZQoraW5mb3JtYXRpb24uCisKKwlleGl0ICRleGl0OworfQorCitzdWIgdmVyc2lvbiB7CisJcHJpbnQgImdpdC1zdm4gdmVyc2lvbiAkVkVSU0lPTiAoc3ZuICRTVk46OkNvcmU6OlZFUlNJT04pXG4iOworCWV4aXQgMDsKK30KKworc3ViIGRvX2dpdF9pbml0X2RiIHsKKwl1bmxlc3MgKC1kICRFTlZ7R0lUX0RJUn0pIHsKKwkJbXkgQGluaXRfZGIgPSAoJ2luaXQnKTsKKwkJcHVzaCBAaW5pdF9kYiwgIi0tdGVtcGxhdGU9JF90ZW1wbGF0ZSIgaWYgZGVmaW5lZCAkX3RlbXBsYXRlOworCQlpZiAoZGVmaW5lZCAkX3NoYXJlZCkgeworCQkJaWYgKCRfc2hhcmVkID1+IC9bYS16XS8pIHsKKwkJCQlwdXNoIEBpbml0X2RiLCAiLS1zaGFyZWQ9JF9zaGFyZWQiOworCQkJfSBlbHNlIHsKKwkJCQlwdXNoIEBpbml0X2RiLCAiLS1zaGFyZWQiOworCQkJfQorCQl9CisJCWNvbW1hbmRfbm9pc3koQGluaXRfZGIpOworCX0KKwlteSAkc2V0OworCW15ICRwZnggPSAic3ZuLXJlbW90ZS4kR2l0OjpTVk46OmRlZmF1bHRfcmVwb19pZCI7CisJZm9yZWFjaCBteSAkaSAoa2V5cyAlaWN2KSB7CisJCWRpZSAiJyRzZXQnIGFuZCAnJGknIGNhbm5vdCBib3RoIGJlIHNldFxuIiBpZiAkc2V0OworCQluZXh0IHVubGVzcyBkZWZpbmVkICRpY3Z7JGl9OworCQljb21tYW5kX25vaXN5KCdjb25maWcnLCAiJHBmeC4kaSIsICRpY3Z7JGl9KTsKKwkJJHNldCA9ICRpOworCX0KK30KKworc3ViIGluaXRfc3ViZGlyIHsKKwlteSAkcmVwb19wYXRoID0gc2hpZnQgb3IgcmV0dXJuOworCW1rcGF0aChbJHJlcG9fcGF0aF0pIHVubGVzcyAtZCAkcmVwb19wYXRoOworCWNoZGlyICRyZXBvX3BhdGggb3IgZGllICJDb3VsZG4ndCBjaGRpciB0byAkcmVwb19wYXRoOiAkIVxuIjsKKwkkRU5We0dJVF9ESVJ9ID0gJy5naXQnOworfQorCitzdWIgY21kX2Nsb25lIHsKKwlteSAoJHVybCwgJHBhdGgpID0gQF87CisJaWYgKCFkZWZpbmVkICRwYXRoICYmCisJICAgIChkZWZpbmVkICRfdHJ1bmsgfHwgZGVmaW5lZCAkX2JyYW5jaGVzIHx8IGRlZmluZWQgJF90YWdzIHx8CisJICAgICBkZWZpbmVkICRfc3RkbGF5b3V0KSAmJgorCSAgICAkdXJsICF+IG0jXlthLXpcK10rOi8vIykgeworCQkkcGF0aCA9ICR1cmw7CisJfQorCSRwYXRoID0gYmFzZW5hbWUoJHVybCkgaWYgIWRlZmluZWQgJHBhdGggfHwgIWxlbmd0aCAkcGF0aDsKKwljbWRfaW5pdCgkdXJsLCAkcGF0aCk7CisJR2l0OjpTVk46OmZldGNoX2FsbCgkR2l0OjpTVk46OmRlZmF1bHRfcmVwb19pZCk7Cit9CisKK3N1YiBjbWRfaW5pdCB7CisJaWYgKGRlZmluZWQgJF9zdGRsYXlvdXQpIHsKKwkJJF90cnVuayA9ICd0cnVuaycgaWYgKCFkZWZpbmVkICRfdHJ1bmspOworCQkkX3RhZ3MgPSAndGFncycgaWYgKCFkZWZpbmVkICRfdGFncyk7CisJCSRfYnJhbmNoZXMgPSAnYnJhbmNoZXMnIGlmICghZGVmaW5lZCAkX2JyYW5jaGVzKTsKKwl9CisJaWYgKGRlZmluZWQgJF90cnVuayB8fCBkZWZpbmVkICRfYnJhbmNoZXMgfHwgZGVmaW5lZCAkX3RhZ3MpIHsKKwkJcmV0dXJuIGNtZF9tdWx0aV9pbml0KEBfKTsKKwl9CisJbXkgJHVybCA9IHNoaWZ0IG9yIGRpZSAiU1ZOIHJlcG9zaXRvcnkgbG9jYXRpb24gcmVxdWlyZWQgIiwKKwkgICAgICAgICAgICAgICAgICAgICAgICJhcyBhIGNvbW1hbmQtbGluZSBhcmd1bWVudFxuIjsKKwlpbml0X3N1YmRpcihAXyk7CisJZG9fZ2l0X2luaXRfZGIoKTsKKworCUdpdDo6U1ZOLT5pbml0KCR1cmwpOworfQorCitzdWIgY21kX2ZldGNoIHsKKwlpZiAoZ3JlcCAvXlxkKz0uLywgQF8pIHsKKwkJZGllICInPHJldj49PGNvbW1pdD4nIGZldGNoIGFyZ3VtZW50cyBhcmUgIiwKKwkJICAgICJubyBsb25nZXIgc3VwcG9ydGVkLlxuIjsKKwl9CisJbXkgKCRyZW1vdGUpID0gQF87CisJaWYgKEBfID4gMSkgeworCQlkaWUgIlVzYWdlOiAkMCBmZXRjaCBbLS1hbGxdIFtzdm4tcmVtb3RlXVxuIjsKKwl9CisJJHJlbW90ZSB8fD0gJEdpdDo6U1ZOOjpkZWZhdWx0X3JlcG9faWQ7CisJaWYgKCRfZmV0Y2hfYWxsKSB7CisJCWNtZF9tdWx0aV9mZXRjaCgpOworCX0gZWxzZSB7CisJCUdpdDo6U1ZOOjpmZXRjaF9hbGwoJHJlbW90ZSwgR2l0OjpTVk46OnJlYWRfYWxsX3JlbW90ZXMoKSk7CisJfQorfQorCitzdWIgY21kX3NldF90cmVlIHsKKwlteSAoQGNvbW1pdHMpID0gQF87CisJaWYgKCRfc3RkaW4gfHwgIUBjb21taXRzKSB7CisJCXByaW50ICJSZWFkaW5nIGZyb20gc3RkaW4uLi5cbiI7CisJCUBjb21taXRzID0gKCk7CisJCXdoaWxlICg8U1RESU4+KSB7CisJCQlpZiAoL1xiKCRzaGExX3Nob3J0KVxiL28pIHsKKwkJCQl1bnNoaWZ0IEBjb21taXRzLCAkMTsKKwkJCX0KKwkJfQorCX0KKwlteSBAcmV2czsKKwlmb3JlYWNoIG15ICRjIChAY29tbWl0cykgeworCQlteSBAdG1wID0gY29tbWFuZCgncmV2LXBhcnNlJywkYyk7CisJCWlmIChzY2FsYXIgQHRtcCA9PSAxKSB7CisJCQlwdXNoIEByZXZzLCAkdG1wWzBdOworCQl9IGVsc2lmIChzY2FsYXIgQHRtcCA+IDEpIHsKKwkJCXB1c2ggQHJldnMsIHJldmVyc2UoY29tbWFuZCgncmV2LWxpc3QnLEB0bXApKTsKKwkJfSBlbHNlIHsKKwkJCWZhdGFsICJGYWlsZWQgdG8gcmV2LXBhcnNlICRjIjsKKwkJfQorCX0KKwlteSAkZ3MgPSBHaXQ6OlNWTi0+bmV3OworCW15ICgkcl9sYXN0LCAkY210X2xhc3QpID0gJGdzLT5sYXN0X3Jldl9jb21taXQ7CisJJGdzLT5mZXRjaDsKKwlpZiAoZGVmaW5lZCAkZ3MtPntsYXN0X3Jldn0gJiYgJHJfbGFzdCAhPSAkZ3MtPntsYXN0X3Jldn0pIHsKKwkJZmF0YWwgIlRoZXJlIGFyZSBuZXcgcmV2aXNpb25zIHRoYXQgd2VyZSBmZXRjaGVkICIsCisJCSAgICAgICJhbmQgbmVlZCB0byBiZSBtZXJnZWQgKG9yIGFja25vd2xlZGdlZCkgIiwKKwkJICAgICAgImJlZm9yZSBjb21taXR0aW5nLlxubGFzdCByZXY6ICRyX2xhc3RcbiIsCisJCSAgICAgICIgY3VycmVudDogJGdzLT57bGFzdF9yZXZ9IjsKKwl9CisJJGdzLT5zZXRfdHJlZSgkXykgZm9yZWFjaCBAcmV2czsKKwlwcmludCAiRG9uZSBjb21taXR0aW5nICIsc2NhbGFyIEByZXZzLCIgcmV2aXNpb25zIHRvIFNWTlxuIjsKKwl1bmxpbmsgJGdzLT57aW5kZXh9OworfQorCitzdWIgY21kX2Rjb21taXQgeworCW15ICRoZWFkID0gc2hpZnQ7CisJZ2l0X2NtZF90cnkgeyBjb21tYW5kX29uZWxpbmUocXcvZGlmZi1pbmRleCAtLXF1aWV0IEhFQUQvKSB9CisJCSdDYW5ub3QgZGNvbW1pdCB3aXRoIGEgZGlydHkgaW5kZXguICBDb21taXQgeW91ciBjaGFuZ2VzIGZpcnN0LCAnCisJCS4gIm9yIHN0YXNoIHRoZW0gd2l0aCBgZ2l0IHN0YXNoJy5cbiI7CisJJGhlYWQgfHw9ICdIRUFEJzsKKwlteSBAcmVmczsKKwlteSAoJHVybCwgJHJldiwgJHV1aWQsICRncykgPSB3b3JraW5nX2hlYWRfaW5mbygkaGVhZCwgXEByZWZzKTsKKwlwcmludCAiQ29tbWl0dGluZyB0byAkdXJsIC4uLlxuIjsKKwl1bmxlc3MgKCRncykgeworCQlkaWUgIlVuYWJsZSB0byBkZXRlcm1pbmUgdXBzdHJlYW0gU1ZOIGluZm9ybWF0aW9uIGZyb20gIiwKKwkJICAgICIkaGVhZCBoaXN0b3J5XG4iOworCX0KKwlteSAkbGFzdF9yZXY7CisJbXkgKCRsaW5lYXJfcmVmcywgJHBhcmVudHMpID0gbGluZWFyaXplX2hpc3RvcnkoJGdzLCBcQHJlZnMpOworCWlmICgkX25vX3JlYmFzZSAmJiBzY2FsYXIoQCRsaW5lYXJfcmVmcykgPiAxKSB7CisJCXdhcm4gIkF0dGVtcHRpbmcgdG8gY29tbWl0IG1vcmUgdGhhbiBvbmUgY2hhbmdlIHdoaWxlICIsCisJCSAgICAgIi0tbm8tcmViYXNlIGlzIGVuYWJsZWQuXG4iLAorCQkgICAgICJJZiB0aGVzZSBjaGFuZ2VzIGRlcGVuZCBvbiBlYWNoIG90aGVyLCByZS1ydW5uaW5nICIsCisJCSAgICAgIndpdGhvdXQgLS1uby1yZWJhc2UgbWF5IGJlIHJlcXVpcmVkLiIKKwl9CisJd2hpbGUgKDEpIHsKKwkJbXkgJGQgPSBzaGlmdCBAJGxpbmVhcl9yZWZzIG9yIGxhc3Q7CisJCXVubGVzcyAoZGVmaW5lZCAkbGFzdF9yZXYpIHsKKwkJCSh1bmRlZiwgJGxhc3RfcmV2LCB1bmRlZikgPSBjbXRfbWV0YWRhdGEoIiRkfjEiKTsKKwkJCXVubGVzcyAoZGVmaW5lZCAkbGFzdF9yZXYpIHsKKwkJCQlmYXRhbCAiVW5hYmxlIHRvIGV4dHJhY3QgcmV2aXNpb24gaW5mb3JtYXRpb24gIiwKKwkJCQkgICAgICAiZnJvbSBjb21taXQgJGR+MSI7CisJCQl9CisJCX0KKwkJaWYgKCRfZHJ5X3J1bikgeworCQkJcHJpbnQgImRpZmYtdHJlZSAkZH4xICRkXG4iOworCQl9IGVsc2UgeworCQkJbXkgJGNtdF9yZXY7CisJCQlteSAlZWRfb3B0cyA9ICggciA9PiAkbGFzdF9yZXYsCisJCQkgICAgICAgICAgICAgICAgbG9nID0+IGdldF9jb21taXRfZW50cnkoJGQpLT57bG9nfSwKKwkJCSAgICAgICAgICAgICAgICByYSA9PiBHaXQ6OlNWTjo6UmEtPm5ldygkZ3MtPmZ1bGxfdXJsKSwKKwkJCSAgICAgICAgICAgICAgICBjb25maWcgPT4gU1ZOOjpDb3JlOjpjb25maWdfZ2V0X2NvbmZpZygKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICRHaXQ6OlNWTjo6UmE6OmNvbmZpZ19kaXIKKwkJCSAgICAgICAgICAgICAgICApLAorCQkJICAgICAgICAgICAgICAgIHRyZWVfYSA9PiAiJGR+MSIsCisJCQkgICAgICAgICAgICAgICAgdHJlZV9iID0+ICRkLAorCQkJICAgICAgICAgICAgICAgIGVkaXRvcl9jYiA9PiBzdWIgeworCQkJICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiQ29tbWl0dGVkIHIkX1swXVxuIjsKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgJGNtdF9yZXYgPSAkX1swXTsKKwkJCSAgICAgICAgICAgICAgICB9LAorCQkJICAgICAgICAgICAgICAgIHN2bl9wYXRoID0+ICcnKTsKKwkJCWlmICghU1ZOOjpHaXQ6OkVkaXRvci0+bmV3KFwlZWRfb3B0cyktPmFwcGx5X2RpZmYpIHsKKwkJCQlwcmludCAiTm8gY2hhbmdlc1xuJGR+MSA9PSAkZFxuIjsKKwkJCX0gZWxzaWYgKCRwYXJlbnRzLT57JGR9ICYmIEB7JHBhcmVudHMtPnskZH19KSB7CisJCQkJJGdzLT57aW5qZWN0X3BhcmVudHNfZGNvbW1pdH0tPnskY210X3Jldn0gPQorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyZW50cy0+eyRkfTsKKwkJCX0KKwkJCSRfZmV0Y2hfYWxsID8gJGdzLT5mZXRjaF9hbGwgOiAkZ3MtPmZldGNoOworCQkJJGxhc3RfcmV2ID0gJGNtdF9yZXY7CisJCQluZXh0IGlmICRfbm9fcmViYXNlOworCisJCQkjIHdlIGFsd2F5cyB3YW50IHRvIHJlYmFzZSBhZ2FpbnN0IHRoZSBjdXJyZW50IEhFQUQsCisJCQkjIG5vdCBhbnkgaGVhZCB0aGF0IHdhcyBwYXNzZWQgdG8gdXMKKwkJCW15IEBkaWZmID0gY29tbWFuZCgnZGlmZi10cmVlJywgJGQsCisJCQkgICAgICAgICAgICAgICAgICAgJGdzLT5yZWZuYW1lLCAnLS0nKTsKKwkJCW15IEBmaW5pc2g7CisJCQlpZiAoQGRpZmYpIHsKKwkJCQlAZmluaXNoID0gcmViYXNlX2NtZCgpOworCQkJCXByaW50IFNUREVSUiAiVzogJGQgYW5kICIsICRncy0+cmVmbmFtZSwKKwkJCQkgICAgICAgICAgICAgIiBkaWZmZXIsIHVzaW5nIEBmaW5pc2g6XG4iLAorCQkJCSAgICAgICAgICAgICBqb2luKCJcbiIsIEBkaWZmKSwgIlxuIjsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnQgIk5vIGNoYW5nZXMgYmV0d2VlbiBjdXJyZW50IEhFQUQgYW5kICIsCisJCQkJICAgICAgJGdzLT5yZWZuYW1lLAorCQkJCSAgICAgICJcblJlc2V0dGluZyB0byB0aGUgbGF0ZXN0ICIsCisJCQkJICAgICAgJGdzLT5yZWZuYW1lLCAiXG4iOworCQkJCUBmaW5pc2ggPSBxdy9yZXNldCAtLW1peGVkLzsKKwkJCX0KKwkJCWNvbW1hbmRfbm9pc3koQGZpbmlzaCwgJGdzLT5yZWZuYW1lKTsKKwkJCWlmIChAZGlmZikgeworCQkJCUByZWZzID0gKCk7CisJCQkJbXkgKCR1cmxfLCAkcmV2XywgJHV1aWRfLCAkZ3NfKSA9CisJCQkJICAgICAgICAgICAgICB3b3JraW5nX2hlYWRfaW5mbygkaGVhZCwgXEByZWZzKTsKKwkJCQlteSAoJGxpbmVhcl9yZWZzXywgJHBhcmVudHNfKSA9CisJCQkJICAgICAgICAgICAgICBsaW5lYXJpemVfaGlzdG9yeSgkZ3NfLCBcQHJlZnMpOworCQkJCWlmIChzY2FsYXIoQCRsaW5lYXJfcmVmcykgIT0KKwkJCQkgICAgc2NhbGFyKEAkbGluZWFyX3JlZnNfKSkgeworCQkJCQlmYXRhbCAiIyBvZiByZXZpc2lvbnMgY2hhbmdlZCAiLAorCQkJCQkgICJcbmJlZm9yZTpcbiIsCisJCQkJCSAgam9pbigiXG4iLCBAJGxpbmVhcl9yZWZzKSwKKwkJCQkJICAiXG5cbmFmdGVyOlxuIiwKKwkJCQkJICBqb2luKCJcbiIsIEAkbGluZWFyX3JlZnNfKSwgIlxuIiwKKwkJCQkJICAnSWYgeW91IGFyZSBhdHRlbXB0aW5nIHRvIGNvbW1pdCAnLAorCQkJCQkgICJtZXJnZXMsIHRyeSBydW5uaW5nOlxuXHQiLAorCQkJCQkgICdnaXQgcmViYXNlIC0taW50ZXJhY3RpdmUnLAorCQkJCQkgICctLXByZXNlcnZlLW1lcmdlcyAnLAorCQkJCQkgICRncy0+cmVmbmFtZSwKKwkJCQkJICAiXG5CZWZvcmUgZGNvbW1pdHRpbmciOworCQkJCX0KKwkJCQlpZiAoJHVybF8gbmUgJHVybCkgeworCQkJCQlmYXRhbCAiVVJMIG1pc21hdGNoIGFmdGVyIHJlYmFzZTogIiwKKwkJCQkJICAgICAgIiR1cmxfICE9ICR1cmwiOworCQkJCX0KKwkJCQlpZiAoJHV1aWRfIG5lICR1dWlkKSB7CisJCQkJCWZhdGFsICJ1dWlkIG1pc21hdGNoIGFmdGVyIHJlYmFzZTogIiwKKwkJCQkJICAgICAgIiR1dWlkXyAhPSAkdXVpZCI7CisJCQkJfQorCQkJCSMgcmVtYXAgcGFyZW50cworCQkJCW15ICglcCwgQGwsICRpKTsKKwkJCQlmb3IgKCRpID0gMDsgJGkgPCBzY2FsYXIgQCRsaW5lYXJfcmVmczsgJGkrKykgeworCQkJCQlteSAkbmV3ID0gJGxpbmVhcl9yZWZzXy0+WyRpXSBvciBuZXh0OworCQkJCQkkcHskbmV3fSA9CisJCQkJCQkkcGFyZW50cy0+eyRsaW5lYXJfcmVmcy0+WyRpXX07CisJCQkJCXB1c2ggQGwsICRuZXc7CisJCQkJfQorCQkJCSRwYXJlbnRzID0gXCVwOworCQkJCSRsaW5lYXJfcmVmcyA9IFxAbDsKKwkJCX0KKwkJfQorCX0KKwl1bmxpbmsgJGdzLT57aW5kZXh9OworfQorCitzdWIgY21kX2ZpbmRfcmV2IHsKKwlteSAkcmV2aXNpb25fb3JfaGFzaCA9IHNoaWZ0IG9yIGRpZSAiU1ZOIG9yIGdpdCByZXZpc2lvbiByZXF1aXJlZCAiLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcyBhIGNvbW1hbmQtbGluZSBhcmd1bWVudFxuIjsKKwlteSAkcmVzdWx0OworCWlmICgkcmV2aXNpb25fb3JfaGFzaCA9fiAvXnJcZCskLykgeworCQlteSAkaGVhZCA9IHNoaWZ0OworCQkkaGVhZCB8fD0gJ0hFQUQnOworCQlteSBAcmVmczsKKwkJbXkgKHVuZGVmLCB1bmRlZiwgdW5kZWYsICRncykgPSB3b3JraW5nX2hlYWRfaW5mbygkaGVhZCwgXEByZWZzKTsKKwkJdW5sZXNzICgkZ3MpIHsKKwkJCWRpZSAiVW5hYmxlIHRvIGRldGVybWluZSB1cHN0cmVhbSBTVk4gaW5mb3JtYXRpb24gZnJvbSAiLAorCQkJICAgICIkaGVhZCBoaXN0b3J5XG4iOworCQl9CisJCW15ICRkZXNpcmVkX3JldmlzaW9uID0gc3Vic3RyKCRyZXZpc2lvbl9vcl9oYXNoLCAxKTsKKwkJJHJlc3VsdCA9ICRncy0+cmV2X21hcF9nZXQoJGRlc2lyZWRfcmV2aXNpb24pOworCX0gZWxzZSB7CisJCW15ICh1bmRlZiwgJHJldiwgdW5kZWYpID0gY210X21ldGFkYXRhKCRyZXZpc2lvbl9vcl9oYXNoKTsKKwkJJHJlc3VsdCA9ICRyZXY7CisJfQorCXByaW50ICIkcmVzdWx0XG4iIGlmICRyZXN1bHQ7Cit9CisKK3N1YiBjbWRfcmViYXNlIHsKKwljb21tYW5kX25vaXN5KHF3L3VwZGF0ZS1pbmRleCAtLXJlZnJlc2gvKTsKKwlteSAoJHVybCwgJHJldiwgJHV1aWQsICRncykgPSB3b3JraW5nX2hlYWRfaW5mbygnSEVBRCcpOworCXVubGVzcyAoJGdzKSB7CisJCWRpZSAiVW5hYmxlIHRvIGRldGVybWluZSB1cHN0cmVhbSBTVk4gaW5mb3JtYXRpb24gZnJvbSAiLAorCQkgICAgIndvcmtpbmcgdHJlZSBoaXN0b3J5XG4iOworCX0KKwlpZiAoY29tbWFuZChxdy9kaWZmLWluZGV4IEhFQUQgLS0vKSkgeworCQlwcmludCBTVERFUlIgIkNhbm5vdCByZWJhc2Ugd2l0aCB1bmNvbW1pdGVkIGNoYW5nZXM6XG4iOworCQljb21tYW5kX25vaXN5KCdzdGF0dXMnKTsKKwkJZXhpdCAxOworCX0KKwl1bmxlc3MgKCRfbG9jYWwpIHsKKwkJIyByZWJhc2Ugd2lsbCBjaGVja291dCBmb3IgdXMsIHNvIG5vIG5lZWQgdG8gZG8gaXQgZXhwbGljaXRseQorCQkkX25vX2NoZWNrb3V0ID0gJ3RydWUnOworCQkkX2ZldGNoX2FsbCA/ICRncy0+ZmV0Y2hfYWxsIDogJGdzLT5mZXRjaDsKKwl9CisJY29tbWFuZF9ub2lzeShyZWJhc2VfY21kKCksICRncy0+cmVmbmFtZSk7Cit9CisKK3N1YiBjbWRfc2hvd19pZ25vcmUgeworCW15ICgkdXJsLCAkcmV2LCAkdXVpZCwgJGdzKSA9IHdvcmtpbmdfaGVhZF9pbmZvKCdIRUFEJyk7CisJJGdzIHx8PSBHaXQ6OlNWTi0+bmV3OworCW15ICRyID0gKGRlZmluZWQgJF9yZXZpc2lvbiA/ICRfcmV2aXNpb24gOiAkZ3MtPnJhLT5nZXRfbGF0ZXN0X3Jldm51bSk7CisJJGdzLT5wcm9wX3dhbGsoJGdzLT57cGF0aH0sICRyLCBzdWIgeworCQlteSAoJGdzLCAkcGF0aCwgJHByb3BzKSA9IEBfOworCQlwcmludCBTVERPVVQgIlxuIyAkcGF0aFxuIjsKKwkJbXkgJHMgPSAkcHJvcHMtPnsnc3ZuOmlnbm9yZSd9IG9yIHJldHVybjsKKwkJJHMgPX4gcy9bXHJcbl0rL1xuL2c7CisJCWNob21wICRzOworCQkkcyA9fiBzI14jJHBhdGgjZ207CisJCXByaW50IFNURE9VVCAiJHNcbiI7CisJfSk7Cit9CisKK3N1YiBjbWRfc2hvd19leHRlcm5hbHMgeworCW15ICgkdXJsLCAkcmV2LCAkdXVpZCwgJGdzKSA9IHdvcmtpbmdfaGVhZF9pbmZvKCdIRUFEJyk7CisJJGdzIHx8PSBHaXQ6OlNWTi0+bmV3OworCW15ICRyID0gKGRlZmluZWQgJF9yZXZpc2lvbiA/ICRfcmV2aXNpb24gOiAkZ3MtPnJhLT5nZXRfbGF0ZXN0X3Jldm51bSk7CisJJGdzLT5wcm9wX3dhbGsoJGdzLT57cGF0aH0sICRyLCBzdWIgeworCQlteSAoJGdzLCAkcGF0aCwgJHByb3BzKSA9IEBfOworCQlwcmludCBTVERPVVQgIlxuIyAkcGF0aFxuIjsKKwkJbXkgJHMgPSAkcHJvcHMtPnsnc3ZuOmV4dGVybmFscyd9IG9yIHJldHVybjsKKwkJJHMgPX4gcy9bXHJcbl0rL1xuL2c7CisJCWNob21wICRzOworCQkkcyA9fiBzI14jJHBhdGgjZ207CisJCXByaW50IFNURE9VVCAiJHNcbiI7CisJfSk7Cit9CisKK3N1YiBjbWRfY3JlYXRlX2lnbm9yZSB7CisJbXkgKCR1cmwsICRyZXYsICR1dWlkLCAkZ3MpID0gd29ya2luZ19oZWFkX2luZm8oJ0hFQUQnKTsKKwkkZ3MgfHw9IEdpdDo6U1ZOLT5uZXc7CisJbXkgJHIgPSAoZGVmaW5lZCAkX3JldmlzaW9uID8gJF9yZXZpc2lvbiA6ICRncy0+cmEtPmdldF9sYXRlc3RfcmV2bnVtKTsKKwkkZ3MtPnByb3Bfd2FsaygkZ3MtPntwYXRofSwgJHIsIHN1YiB7CisJCW15ICgkZ3MsICRwYXRoLCAkcHJvcHMpID0gQF87CisJCSMgJHBhdGggaXMgb2YgdGhlIGZvcm0gL3BhdGgvdG8vZGlyLworCQlteSAkaWdub3JlID0gJy4nIC4gJHBhdGggLiAnLmdpdGlnbm9yZSc7CisJCW15ICRzID0gJHByb3BzLT57J3N2bjppZ25vcmUnfSBvciByZXR1cm47CisJCW9wZW4oR0lUSUdOT1JFLCAnPicsICRpZ25vcmUpCisJCSAgb3IgZmF0YWwoIkZhaWxlZCB0byBvcGVuIGAkaWdub3JlJyBmb3Igd3JpdGluZzogJCEiKTsKKwkJJHMgPX4gcy9bXHJcbl0rL1xuL2c7CisJCWNob21wICRzOworCQkjIFByZWZpeCBhbGwgcGF0dGVybnMgc28gdGhhdCB0aGUgaWdub3JlIGRvZXNuJ3QgYXBwbHkKKwkJIyB0byBzdWItZGlyZWN0b3JpZXMuCisJCSRzID1+IHMjXiMvI2dtOworCQlwcmludCBHSVRJR05PUkUgIiRzXG4iOworCQljbG9zZShHSVRJR05PUkUpCisJCSAgb3IgZmF0YWwoIkZhaWxlZCB0byBjbG9zZSBgJGlnbm9yZSc6ICQhIik7CisJCWNvbW1hbmRfbm9pc3koJ2FkZCcsICRpZ25vcmUpOworCX0pOworfQorCitzdWIgY2Fub25pY2FsaXplX3BhdGggeworCW15ICgkcGF0aCkgPSBAXzsKKwlteSAkZG90X3NsYXNoX2FkZGVkID0gMDsKKwlpZiAoc3Vic3RyKCRwYXRoLCAwLCAxKSBuZSAiLyIpIHsKKwkJJHBhdGggPSAiLi8iIC4gJHBhdGg7CisJCSRkb3Rfc2xhc2hfYWRkZWQgPSAxOworCX0KKwkjIEZpbGU6OlNwZWMtPmNhbm9ucGF0aCBkb2Vzbid0IGNvbGxhcHNlIHgvLi4veSBpbnRvIHkgKGZvciBhCisJIyBnb29kIHJlYXNvbiksIHNvIGxldCdzIGRvIHRoaXMgbWFudWFsbHkuCisJJHBhdGggPX4gcyMvKyMvI2c7CisJJHBhdGggPX4gcyMvXC4oPzovfCQpIy8jZzsKKwkkcGF0aCA9fiBzIy9bXi9dKy9cLlwuIyNnOworCSRwYXRoID1+IHMjLyQjI2c7CisJJHBhdGggPX4gcyNeXC4vIyMgaWYgJGRvdF9zbGFzaF9hZGRlZDsKKwlyZXR1cm4gJHBhdGg7Cit9CisKKyMgZ2V0X3N2bnByb3BzKFBBVEgpCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBIZWxwZXIgZm9yIGNtZF9wcm9wZ2V0IGFuZCBjbWRfcHJvcGxpc3QgYmVsb3cuCitzdWIgZ2V0X3N2bnByb3BzIHsKKwlteSAkcGF0aCA9IHNoaWZ0OworCW15ICgkdXJsLCAkcmV2LCAkdXVpZCwgJGdzKSA9IHdvcmtpbmdfaGVhZF9pbmZvKCdIRUFEJyk7CisJJGdzIHx8PSBHaXQ6OlNWTi0+bmV3OworCisJIyBwcmVmaXggVEhFIFBBVEggYnkgdGhlIHN1Yi1kaXJlY3RvcnkgZnJvbSB3aGljaCB0aGUgdXNlcgorCSMgaW52b2tlZCB1cy4KKwkkcGF0aCA9ICRjbWRfZGlyX3ByZWZpeCAuICRwYXRoOworCWZhdGFsKCJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5OiAkcGF0aCIpIHVubGVzcyAtZSAkcGF0aDsKKwlteSAkaXNfZGlyID0gLWQgJHBhdGggPyAxIDogMDsKKwkkcGF0aCA9ICRncy0+e3BhdGh9IC4gJy8nIC4gJHBhdGg7CisKKwkjIGNhbm9uaWNhbGl6ZSB0aGUgcGF0aCAob3RoZXJ3aXNlIGxpYnN2biB3aWxsIGFib3J0IG9yIGZhaWwgdG8KKwkjIGZpbmQgdGhlIGZpbGUpCisJJHBhdGggPSBjYW5vbmljYWxpemVfcGF0aCgkcGF0aCk7CisKKwlteSAkciA9IChkZWZpbmVkICRfcmV2aXNpb24gPyAkX3JldmlzaW9uIDogJGdzLT5yYS0+Z2V0X2xhdGVzdF9yZXZudW0pOworCW15ICRwcm9wczsKKwlpZiAoJGlzX2RpcikgeworCQkodW5kZWYsIHVuZGVmLCAkcHJvcHMpID0gJGdzLT5yYS0+Z2V0X2RpcigkcGF0aCwgJHIpOworCX0KKwllbHNlIHsKKwkJKHVuZGVmLCAkcHJvcHMpID0gJGdzLT5yYS0+Z2V0X2ZpbGUoJHBhdGgsICRyLCB1bmRlZik7CisJfQorCXJldHVybiAkcHJvcHM7Cit9CisKKyMgY21kX3Byb3BnZXQgKFBST1AsIFBBVEgpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcmludCB0aGUgU1ZOIHByb3BlcnR5IFBST1AgZm9yIFBBVEguCitzdWIgY21kX3Byb3BnZXQgeworCW15ICgkcHJvcCwgJHBhdGgpID0gQF87CisJJHBhdGggPSAnLicgaWYgbm90IGRlZmluZWQgJHBhdGg7CisJdXNhZ2UoMSkgaWYgbm90IGRlZmluZWQgJHByb3A7CisJbXkgJHByb3BzID0gZ2V0X3N2bnByb3BzKCRwYXRoKTsKKwlpZiAobm90IGRlZmluZWQgJHByb3BzLT57JHByb3B9KSB7CisJCWZhdGFsKCJgJHBhdGgnIGRvZXMgbm90IGhhdmUgYSBgJHByb3AnIFNWTiBwcm9wZXJ0eS4iKTsKKwl9CisJcHJpbnQgJHByb3BzLT57JHByb3B9IC4gIlxuIjsKK30KKworIyBjbWRfcHJvcGxpc3QgKFBBVEgpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJpbnQgdGhlIGxpc3Qgb2YgU1ZOIHByb3BlcnRpZXMgZm9yIFBBVEguCitzdWIgY21kX3Byb3BsaXN0IHsKKwlteSAkcGF0aCA9IHNoaWZ0OworCSRwYXRoID0gJy4nIGlmIG5vdCBkZWZpbmVkICRwYXRoOworCW15ICRwcm9wcyA9IGdldF9zdm5wcm9wcygkcGF0aCk7CisJcHJpbnQgIlByb3BlcnRpZXMgb24gJyRwYXRoJzpcbiI7CisJZm9yZWFjaCAoc29ydCBrZXlzICV7JHByb3BzfSkgeworCQlwcmludCAiICAkX1xuIjsKKwl9Cit9CisKK3N1YiBjbWRfbXVsdGlfaW5pdCB7CisJbXkgJHVybCA9IHNoaWZ0OworCXVubGVzcyAoZGVmaW5lZCAkX3RydW5rIHx8IGRlZmluZWQgJF9icmFuY2hlcyB8fCBkZWZpbmVkICRfdGFncykgeworCQl1c2FnZSgxKTsKKwl9CisKKwkjIHRoZXJlIGFyZSBjdXJyZW50bHkgc29tZSBidWdzIHRoYXQgcHJldmVudCBtdWx0aS1pbml0L211bHRpLWZldGNoCisJIyBzZXR1cHMgZnJvbSB3b3JraW5nIHdlbGwgd2l0aG91dCB0aGlzLgorCSRHaXQ6OlNWTjo6X21pbmltaXplX3VybCA9IDE7CisKKwkkX3ByZWZpeCA9ICcnIHVubGVzcyBkZWZpbmVkICRfcHJlZml4OworCWlmIChkZWZpbmVkICR1cmwpIHsKKwkJJHVybCA9fiBzIy8rJCMjOworCQlpbml0X3N1YmRpcihAXyk7CisJfQorCWRvX2dpdF9pbml0X2RiKCk7CisJaWYgKGRlZmluZWQgJF90cnVuaykgeworCQlteSAkdHJ1bmtfcmVmID0gJF9wcmVmaXggLiAndHJ1bmsnOworCQkjIHRyeSBib3RoIG9sZC1zdHlsZSBhbmQgbmV3LXN0eWxlIGxvb2t1cHM6CisJCW15ICRnc190cnVuayA9IGV2YWwgeyBHaXQ6OlNWTi0+bmV3KCR0cnVua19yZWYpIH07CisJCXVubGVzcyAoJGdzX3RydW5rKSB7CisJCQlteSAoJHRydW5rX3VybCwgJHRydW5rX3BhdGgpID0KKwkJCSAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZV9zdm5fdXJsKCR1cmwsICRfdHJ1bmspOworCQkJJGdzX3RydW5rID0gR2l0OjpTVk4tPmluaXQoJHRydW5rX3VybCwgJHRydW5rX3BhdGgsCisJCQkJCQkgICB1bmRlZiwgJHRydW5rX3JlZik7CisJCX0KKwl9CisJcmV0dXJuIHVubGVzcyBkZWZpbmVkICRfYnJhbmNoZXMgfHwgZGVmaW5lZCAkX3RhZ3M7CisJbXkgJHJhID0gJHVybCA/IEdpdDo6U1ZOOjpSYS0+bmV3KCR1cmwpIDogdW5kZWY7CisJY29tcGxldGVfdXJsX2xzX2luaXQoJHJhLCAkX2JyYW5jaGVzLCAnLS1icmFuY2hlcy8tYicsICRfcHJlZml4KTsKKwljb21wbGV0ZV91cmxfbHNfaW5pdCgkcmEsICRfdGFncywgJy0tdGFncy8tdCcsICRfcHJlZml4IC4gJ3RhZ3MvJyk7Cit9CisKK3N1YiBjbWRfbXVsdGlfZmV0Y2ggeworCW15ICRyZW1vdGVzID0gR2l0OjpTVk46OnJlYWRfYWxsX3JlbW90ZXMoKTsKKwlmb3JlYWNoIG15ICRyZXBvX2lkIChzb3J0IGtleXMgJSRyZW1vdGVzKSB7CisJCWlmICgkcmVtb3Rlcy0+eyRyZXBvX2lkfS0+e3VybH0pIHsKKwkJCUdpdDo6U1ZOOjpmZXRjaF9hbGwoJHJlcG9faWQsICRyZW1vdGVzKTsKKwkJfQorCX0KK30KKworIyB0aGlzIGNvbW1hbmQgaXMgc3BlY2lhbCBiZWNhdXNlIGl0IHJlcXVpcmVzIG5vIG1ldGFkYXRhCitzdWIgY21kX2NvbW1pdF9kaWZmIHsKKwlteSAoJHRhLCAkdGIsICR1cmwpID0gQF87CisJbXkgJHVzYWdlID0gIlVzYWdlOiAkMCBjb21taXQtZGlmZiAtcjxyZXZpc2lvbj4gIi4KKwkgICAgICAgICAgICAiPHRyZWUtaXNoPiA8dHJlZS1pc2g+IFs8VVJMPl0iOworCWZhdGFsKCR1c2FnZSkgaWYgKCFkZWZpbmVkICR0YSB8fCAhZGVmaW5lZCAkdGIpOworCW15ICRzdm5fcGF0aDsKKwlpZiAoIWRlZmluZWQgJHVybCkgeworCQlteSAkZ3MgPSBldmFsIHsgR2l0OjpTVk4tPm5ldyB9OworCQlpZiAoISRncykgeworCQkJZmF0YWwoIk5lZWRlZCBVUkwgb3IgdXNhYmxlIGdpdC1zdm4gLS1pZCBpbiAiLAorCQkJICAgICAgInRoZSBjb21tYW5kLWxpbmVcbiIsICR1c2FnZSk7CisJCX0KKwkJJHVybCA9ICRncy0+e3VybH07CisJCSRzdm5fcGF0aCA9ICRncy0+e3BhdGh9OworCX0KKwl1bmxlc3MgKGRlZmluZWQgJF9yZXZpc2lvbikgeworCQlmYXRhbCgiLXJ8LS1yZXZpc2lvbiBpcyBhIHJlcXVpcmVkIGFyZ3VtZW50XG4iLCAkdXNhZ2UpOworCX0KKwlpZiAoZGVmaW5lZCAkX21lc3NhZ2UgJiYgZGVmaW5lZCAkX2ZpbGUpIHsKKwkJZmF0YWwoIkJvdGggLS1tZXNzYWdlLy1tIGFuZCAtLWZpbGUvLUYgc3BlY2lmaWVkICIsCisJCSAgICAgICJmb3IgdGhlIGNvbW1pdCBtZXNzYWdlLlxuIiwKKwkJICAgICAgIkkgaGF2ZSBubyBpZGVhIHdoYXQgeW91IG1lYW4iKTsKKwl9CisJaWYgKGRlZmluZWQgJF9maWxlKSB7CisJCSRfbWVzc2FnZSA9IGZpbGVfdG9fcygkX2ZpbGUpOworCX0gZWxzZSB7CisJCSRfbWVzc2FnZSB8fD0gZ2V0X2NvbW1pdF9lbnRyeSgkdGIpLT57bG9nfTsKKwl9CisJbXkgJHJhIHx8PSBHaXQ6OlNWTjo6UmEtPm5ldygkdXJsKTsKKwkkc3ZuX3BhdGggfHw9ICRyYS0+e3N2bl9wYXRofTsKKwlteSAkciA9ICRfcmV2aXNpb247CisJaWYgKCRyIGVxICdIRUFEJykgeworCQkkciA9ICRyYS0+Z2V0X2xhdGVzdF9yZXZudW07CisJfSBlbHNpZiAoJHIgIX4gL15cZCskLykgeworCQlkaWUgInJldmlzaW9uIGFyZ3VtZW50OiAkciBub3QgdW5kZXJzdG9vZCBieSBnaXQtc3ZuXG4iOworCX0KKwlteSAlZWRfb3B0cyA9ICggciA9PiAkciwKKwkgICAgICAgICAgICAgICAgbG9nID0+ICRfbWVzc2FnZSwKKwkgICAgICAgICAgICAgICAgcmEgPT4gJHJhLAorCSAgICAgICAgICAgICAgICB0cmVlX2EgPT4gJHRhLAorCSAgICAgICAgICAgICAgICB0cmVlX2IgPT4gJHRiLAorCSAgICAgICAgICAgICAgICBlZGl0b3JfY2IgPT4gc3ViIHsgcHJpbnQgIkNvbW1pdHRlZCByJF9bMF1cbiIgfSwKKwkgICAgICAgICAgICAgICAgc3ZuX3BhdGggPT4gJHN2bl9wYXRoICk7CisJaWYgKCFTVk46OkdpdDo6RWRpdG9yLT5uZXcoXCVlZF9vcHRzKS0+YXBwbHlfZGlmZikgeworCQlwcmludCAiTm8gY2hhbmdlc1xuJHRhID09ICR0YlxuIjsKKwl9Cit9CisKK3N1YiBjbWRfaW5mbyB7CisJbXkgJHBhdGggPSBjYW5vbmljYWxpemVfcGF0aChzaGlmdCBvciAiLiIpOworCXVubGVzcyAoc2NhbGFyKEBfKSA9PSAwKSB7CisJCWRpZSAiVG9vIG1hbnkgYXJndW1lbnRzIHNwZWNpZmllZFxuIjsKKwl9CisKKwlteSAoJGZpbGVfdHlwZSwgJGRpZmZfc3RhdHVzKSA9IGZpbmRfZmlsZV90eXBlX2FuZF9kaWZmX3N0YXR1cygkcGF0aCk7CisKKwlpZiAoISRmaWxlX3R5cGUgJiYgISRkaWZmX3N0YXR1cykgeworCQlwcmludCBTVERFUlIgIiRwYXRoOiAgKE5vdCBhIHZlcnNpb25lZCByZXNvdXJjZSlcblxuIjsKKwkJcmV0dXJuOworCX0KKworCW15ICgkdXJsLCAkcmV2LCAkdXVpZCwgJGdzKSA9IHdvcmtpbmdfaGVhZF9pbmZvKCdIRUFEJyk7CisJdW5sZXNzICgkZ3MpIHsKKwkJZGllICJVbmFibGUgdG8gZGV0ZXJtaW5lIHVwc3RyZWFtIFNWTiBpbmZvcm1hdGlvbiBmcm9tICIsCisJCSAgICAid29ya2luZyB0cmVlIGhpc3RvcnlcbiI7CisJfQorCW15ICRmdWxsX3VybCA9ICR1cmwgLiAoJHBhdGggZXEgIi4iID8gIiIgOiAiLyRwYXRoIik7CisKKwlpZiAoJF91cmwpIHsKKwkJcHJpbnQgJGZ1bGxfdXJsLCAiXG4iOworCQlyZXR1cm47CisJfQorCisJbXkgJHJlc3VsdCA9ICJQYXRoOiAkcGF0aFxuIjsKKwkkcmVzdWx0IC49ICJOYW1lOiAiIC4gYmFzZW5hbWUoJHBhdGgpIC4gIlxuIiBpZiAkZmlsZV90eXBlIG5lICJkaXIiOworCSRyZXN1bHQgLj0gIlVSTDogIiAuICRmdWxsX3VybCAuICJcbiI7CisKKwlldmFsIHsKKwkJbXkgJHJlcG9zX3Jvb3QgPSAkZ3MtPnJlcG9zX3Jvb3Q7CisJCUdpdDo6U1ZOOjpyZW1vdmVfdXNlcm5hbWUoJHJlcG9zX3Jvb3QpOworCQkkcmVzdWx0IC49ICJSZXBvc2l0b3J5IFJvb3Q6ICRyZXBvc19yb290XG4iOworCX07CisJaWYgKCRAKSB7CisJCSRyZXN1bHQgLj0gIlJlcG9zaXRvcnkgUm9vdDogKG9mZmxpbmUpXG4iOworCX0KKwkkcmVzdWx0IC49ICJSZXBvc2l0b3J5IFVVSUQ6ICR1dWlkXG4iIHVubGVzcyAkZGlmZl9zdGF0dXMgZXEgIkEiOworCSRyZXN1bHQgLj0gIlJldmlzaW9uOiAiIC4gKCRkaWZmX3N0YXR1cyBlcSAiQSIgPyAwIDogJHJldikgLiAiXG4iOworCisJJHJlc3VsdCAuPSAiTm9kZSBLaW5kOiAiIC4KKwkJICAgKCRmaWxlX3R5cGUgZXEgImRpciIgPyAiZGlyZWN0b3J5IiA6ICJmaWxlIikgLiAiXG4iOworCisJbXkgJHNjaGVkdWxlID0gJGRpZmZfc3RhdHVzIGVxICJBIgorCQkgICAgICAgPyAiYWRkIgorCQkgICAgICAgOiAoJGRpZmZfc3RhdHVzIGVxICJEIiA/ICJkZWxldGUiIDogIm5vcm1hbCIpOworCSRyZXN1bHQgLj0gIlNjaGVkdWxlOiAkc2NoZWR1bGVcbiI7CisKKwlpZiAoJGRpZmZfc3RhdHVzIGVxICJBIikgeworCQlwcmludCAkcmVzdWx0LCAiXG4iOworCQlyZXR1cm47CisJfQorCisJbXkgKCRsY19hdXRob3IsICRsY19yZXYsICRsY19kYXRlX3V0Yyk7CisJbXkgQGFyZ3MgPSBHaXQ6OlNWTjo6TG9nOjpnaXRfc3ZuX2xvZ19jbWQoJHJldiwgJHJldiwgIi0tIiwgJHBhdGgpOworCW15ICRsb2cgPSBjb21tYW5kX291dHB1dF9waXBlKEBhcmdzKTsKKwlteSAkZXNjX2NvbG9yID0gcXIvKD86XDAzM1xbKD86KD86XGQrOykqXGQqKT9tKSovOworCXdoaWxlICg8JGxvZz4pIHsKKwkJaWYgKC9eJHtlc2NfY29sb3J9YXV0aG9yICguKykgPFtePl0rPiAoXGQrKSAoW1wtXCtdP1xkKykkL28pIHsKKwkJCSRsY19hdXRob3IgPSAkMTsKKwkJCSRsY19kYXRlX3V0YyA9IEdpdDo6U1ZOOjpMb2c6OnBhcnNlX2dpdF9kYXRlKCQyLCAkMyk7CisJCX0gZWxzaWYgKC9eJHtlc2NfY29sb3J9ICAgIChnaXQtc3ZuLWlkOi4rKSQvbykgeworCQkJKHVuZGVmLCAkbGNfcmV2LCB1bmRlZikgPSA6OmV4dHJhY3RfbWV0YWRhdGEoJDEpOworCQl9CisJfQorCWNsb3NlICRsb2c7CisKKwlHaXQ6OlNWTjo6TG9nOjpzZXRfbG9jYWxfdGltZXpvbmUoKTsKKworCSRyZXN1bHQgLj0gIkxhc3QgQ2hhbmdlZCBBdXRob3I6ICRsY19hdXRob3JcbiI7CisJJHJlc3VsdCAuPSAiTGFzdCBDaGFuZ2VkIFJldjogJGxjX3JldlxuIjsKKwkkcmVzdWx0IC49ICJMYXN0IENoYW5nZWQgRGF0ZTogIiAuCisJCSAgIEdpdDo6U1ZOOjpMb2c6OmZvcm1hdF9zdm5fZGF0ZSgkbGNfZGF0ZV91dGMpIC4gIlxuIjsKKworCWlmICgkZmlsZV90eXBlIG5lICJkaXIiKSB7CisJCW15ICR0ZXh0X2xhc3RfdXBkYXRlZF9kYXRlID0KKwkJICAgICgkZGlmZl9zdGF0dXMgZXEgIkQiID8gJGxjX2RhdGVfdXRjIDogKHN0YXQgJHBhdGgpWzldKTsKKwkJJHJlc3VsdCAuPQorCQkgICAgIlRleHQgTGFzdCBVcGRhdGVkOiAiIC4KKwkJICAgIEdpdDo6U1ZOOjpMb2c6OmZvcm1hdF9zdm5fZGF0ZSgkdGV4dF9sYXN0X3VwZGF0ZWRfZGF0ZSkgLgorCQkgICAgIlxuIjsKKwkJbXkgJGNoZWNrc3VtOworCQlpZiAoJGRpZmZfc3RhdHVzIGVxICJEIikgeworCQkJbXkgKCRmaCwgJGN0eCkgPQorCQkJICAgIGNvbW1hbmRfb3V0cHV0X3BpcGUocXcoY2F0LWZpbGUgYmxvYiksICJIRUFEOiRwYXRoIik7CisJCQlpZiAoJGZpbGVfdHlwZSBlcSAibGluayIpIHsKKwkJCQlteSAkZmlsZV9uYW1lID0gPCRmaD47CisJCQkJJGNoZWNrc3VtID0gbWQ1c3VtKCJsaW5rICRmaWxlX25hbWUiKTsKKwkJCX0gZWxzZSB7CisJCQkJJGNoZWNrc3VtID0gbWQ1c3VtKCRmaCk7CisJCQl9CisJCQljb21tYW5kX2Nsb3NlX3BpcGUoJGZoLCAkY3R4KTsKKwkJfSBlbHNpZiAoJGZpbGVfdHlwZSBlcSAibGluayIpIHsKKwkJCW15ICRmaWxlX25hbWUgPQorCQkJICAgIGNvbW1hbmQocXcoY2F0LWZpbGUgYmxvYiksICJIRUFEOiRwYXRoIik7CisJCQkkY2hlY2tzdW0gPQorCQkJICAgIG1kNXN1bSgibGluayAiIC4gJGZpbGVfbmFtZSk7CisJCX0gZWxzZSB7CisJCQlvcGVuIEZJTEUsICI8IiwgJHBhdGggb3IgZGllICQhOworCQkJJGNoZWNrc3VtID0gbWQ1c3VtKFwqRklMRSk7CisJCQljbG9zZSBGSUxFIG9yIGRpZSAkITsKKwkJfQorCQkkcmVzdWx0IC49ICJDaGVja3N1bTogIiAuICRjaGVja3N1bSAuICJcbiI7CisJfQorCisJcHJpbnQgJHJlc3VsdCwgIlxuIjsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIHV0aWxpdHkgZnVuY3Rpb25zICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworc3ViIHJlYmFzZV9jbWQgeworCW15IEBjbWQgPSBxdy9yZWJhc2UvOworCXB1c2ggQGNtZCwgJy12JyBpZiAkX3ZlcmJvc2U7CisJcHVzaCBAY21kLCBxdy8tLW1lcmdlLyBpZiAkX21lcmdlOworCXB1c2ggQGNtZCwgIi0tc3RyYXRlZ3k9JF9zdHJhdGVneSIgaWYgJF9zdHJhdGVneTsKKwlAY21kOworfQorCitzdWIgcG9zdF9mZXRjaF9jaGVja291dCB7CisJcmV0dXJuIGlmICRfbm9fY2hlY2tvdXQ7CisJbXkgJGdzID0gJEdpdDo6U1ZOOjpfaGVhZCBvciByZXR1cm47CisJcmV0dXJuIGlmIHZlcmlmeV9yZWYoJ3JlZnMvaGVhZHMvbWFzdGVyXjAnKTsKKworCW15ICR2YWxpZF9oZWFkID0gdmVyaWZ5X3JlZignSEVBRF4wJyk7CisJY29tbWFuZF9ub2lzeShxdyh1cGRhdGUtcmVmIHJlZnMvaGVhZHMvbWFzdGVyKSwgJGdzLT5yZWZuYW1lKTsKKwlyZXR1cm4gaWYgKCR2YWxpZF9oZWFkIHx8ICF2ZXJpZnlfcmVmKCdIRUFEXjAnKSk7CisKKwlyZXR1cm4gaWYgJEVOVntHSVRfRElSfSAhfiBtI14oPzouKi8pP1wuZ2l0JCM7CisJbXkgJGluZGV4ID0gJEVOVntHSVRfSU5ERVhfRklMRX0gfHwgIiRFTlZ7R0lUX0RJUn0vaW5kZXgiOworCXJldHVybiBpZiAtZiAkaW5kZXg7CisKKwlyZXR1cm4gaWYgY29tbWFuZF9vbmVsaW5lKHF3L3Jldi1wYXJzZSAtLWlzLWluc2lkZS13b3JrLXRyZWUvKSBlcSAnZmFsc2UnOworCXJldHVybiBpZiBjb21tYW5kX29uZWxpbmUocXcvcmV2LXBhcnNlIC0taXMtaW5zaWRlLWdpdC1kaXIvKSBlcSAndHJ1ZSc7CisJY29tbWFuZF9ub2lzeShxdy9yZWFkLXRyZWUgLW0gLXUgLXYgSEVBRCBIRUFELyk7CisJcHJpbnQgU1RERVJSICJDaGVja2VkIG91dCBIRUFEOlxuICAiLAorCSAgICAgICAgICAgICAkZ3MtPmZ1bGxfdXJsLCAiIHIiLCAkZ3MtPmxhc3RfcmV2LCAiXG4iOworfQorCitzdWIgY29tcGxldGVfc3ZuX3VybCB7CisJbXkgKCR1cmwsICRwYXRoKSA9IEBfOworCSRwYXRoID1+IHMjLyskIyM7CisJaWYgKCRwYXRoICF+IG0jXlthLXpcK10rOi8vIykgeworCQlpZiAoIWRlZmluZWQgJHVybCB8fCAkdXJsICF+IG0jXlthLXpcK10rOi8vIykgeworCQkJZmF0YWwoIkU6ICckcGF0aCcgaXMgbm90IGEgY29tcGxldGUgVVJMICIsCisJCQkgICAgICAiYW5kIGEgc2VwYXJhdGUgVVJMIGlzIG5vdCBzcGVjaWZpZWQiKTsKKwkJfQorCQlyZXR1cm4gKCR1cmwsICRwYXRoKTsKKwl9CisJcmV0dXJuICgkcGF0aCwgJycpOworfQorCitzdWIgY29tcGxldGVfdXJsX2xzX2luaXQgeworCW15ICgkcmEsICRyZXBvX3BhdGgsICRzd2l0Y2gsICRwZngpID0gQF87CisJdW5sZXNzICgkcmVwb19wYXRoKSB7CisJCXByaW50IFNUREVSUiAiVzogJHN3aXRjaCBub3Qgc3BlY2lmaWVkXG4iOworCQlyZXR1cm47CisJfQorCSRyZXBvX3BhdGggPX4gcyMvKyQjIzsKKwlpZiAoJHJlcG9fcGF0aCA9fiBtI15bYS16XCtdKzovLyMpIHsKKwkJJHJhID0gR2l0OjpTVk46OlJhLT5uZXcoJHJlcG9fcGF0aCk7CisJCSRyZXBvX3BhdGggPSAnJzsKKwl9IGVsc2UgeworCQkkcmVwb19wYXRoID1+IHMjXi8rIyM7CisJCXVubGVzcyAoJHJhKSB7CisJCQlmYXRhbCgiRTogJyRyZXBvX3BhdGgnIGlzIG5vdCBhIGNvbXBsZXRlIFVSTCAiLAorCQkJICAgICAgImFuZCBhIHNlcGFyYXRlIFVSTCBpcyBub3Qgc3BlY2lmaWVkIik7CisJCX0KKwl9CisJbXkgJHVybCA9ICRyYS0+e3VybH07CisJbXkgJGdzID0gR2l0OjpTVk4tPmluaXQoJHVybCwgdW5kZWYsIHVuZGVmLCB1bmRlZiwgMSk7CisJbXkgJGsgPSAic3ZuLXJlbW90ZS4kZ3MtPntyZXBvX2lkfS51cmwiOworCW15ICRvcmlnX3VybCA9IGV2YWwgeyBjb21tYW5kX29uZWxpbmUocXcvY29uZmlnIC0tZ2V0LywgJGspIH07CisJaWYgKCRvcmlnX3VybCAmJiAoJG9yaWdfdXJsIG5lICRncy0+e3VybH0pKSB7CisJCWRpZSAiJGsgYWxyZWFkeSBzZXQ6ICRvcmlnX3VybFxuIiwKKwkJICAgICJ3YW50ZWQgdG8gc2V0IHRvOiAkZ3MtPnt1cmx9XG4iOworCX0KKwljb21tYW5kX29uZWxpbmUoJ2NvbmZpZycsICRrLCAkZ3MtPnt1cmx9KSB1bmxlc3MgJG9yaWdfdXJsOworCW15ICRyZW1vdGVfcGF0aCA9ICIkcmEtPntzdm5fcGF0aH0vJHJlcG9fcGF0aCI7CisJJHJlbW90ZV9wYXRoID1+IHMjLysjLyNnOworCSRyZW1vdGVfcGF0aCA9fiBzI14vIyNnOworCSRyZW1vdGVfcGF0aCAuPSAiLyoiIGlmICRyZW1vdGVfcGF0aCAhfiAvXCovOworCW15ICgkbikgPSAoJHN3aXRjaCA9fiAvXi0tKFx3KykvKTsKKwlpZiAobGVuZ3RoICRwZnggJiYgJHBmeCAhfiBtIy8kIykgeworCQlkaWUgIi0tcHJlZml4PSckcGZ4JyBtdXN0IGhhdmUgYSB0cmFpbGluZyBzbGFzaCAnLydcbiI7CisJfQorCWNvbW1hbmRfbm9pc3koJ2NvbmZpZycsICJzdm4tcmVtb3RlLiRncy0+e3JlcG9faWR9LiRuIiwKKwkJCQkiJHJlbW90ZV9wYXRoOnJlZnMvcmVtb3Rlcy8kcGZ4KiIpOworfQorCitzdWIgdmVyaWZ5X3JlZiB7CisJbXkgKCRyZWYpID0gQF87CisJZXZhbCB7IGNvbW1hbmRfb25lbGluZShbICdyZXYtcGFyc2UnLCAnLS12ZXJpZnknLCAkcmVmIF0sCisJICAgICAgICAgICAgICAgICAgICAgICB7IFNUREVSUiA9PiAwIH0pOyB9OworfQorCitzdWIgZ2V0X3RyZWVfZnJvbV90cmVlaXNoIHsKKwlteSAoJHRyZWVpc2gpID0gQF87CisJIyAkdHJlZWlzaCBjYW4gYmUgYSBzeW1ib2xpYyByZWYsIHRvbzoKKwlteSAkdHlwZSA9IGNvbW1hbmRfb25lbGluZShxdy9jYXQtZmlsZSAtdC8sICR0cmVlaXNoKTsKKwlteSAkZXhwZWN0ZWQ7CisJd2hpbGUgKCR0eXBlIGVxICd0YWcnKSB7CisJCSgkdHJlZWlzaCwgJHR5cGUpID0gY29tbWFuZChxdy9jYXQtZmlsZSB0YWcvLCAkdHJlZWlzaCk7CisJfQorCWlmICgkdHlwZSBlcSAnY29tbWl0JykgeworCQkkZXhwZWN0ZWQgPSAoZ3JlcCAvXnRyZWUgLywgY29tbWFuZChxdy9jYXQtZmlsZSBjb21taXQvLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHJlZWlzaCkpWzBdOworCQkoJGV4cGVjdGVkKSA9ICgkZXhwZWN0ZWQgPX4gL150cmVlICgkc2hhMSkkL28pOworCQlkaWUgIlVuYWJsZSB0byBnZXQgdHJlZSBmcm9tICR0cmVlaXNoXG4iIHVubGVzcyAkZXhwZWN0ZWQ7CisJfSBlbHNpZiAoJHR5cGUgZXEgJ3RyZWUnKSB7CisJCSRleHBlY3RlZCA9ICR0cmVlaXNoOworCX0gZWxzZSB7CisJCWRpZSAiJHRyZWVpc2ggaXMgYSAkdHlwZSwgZXhwZWN0ZWQgdHJlZSwgdGFnIG9yIGNvbW1pdFxuIjsKKwl9CisJcmV0dXJuICRleHBlY3RlZDsKK30KKworc3ViIGdldF9jb21taXRfZW50cnkgeworCW15ICgkdHJlZWlzaCkgPSBzaGlmdDsKKwlteSAlbG9nX2VudHJ5ID0gKCBsb2cgPT4gJycsIHRyZWUgPT4gZ2V0X3RyZWVfZnJvbV90cmVlaXNoKCR0cmVlaXNoKSApOworCW15ICRjb21taXRfZWRpdG1zZyA9ICIkRU5We0dJVF9ESVJ9L0NPTU1JVF9FRElUTVNHIjsKKwlteSAkY29tbWl0X21zZyA9ICIkRU5We0dJVF9ESVJ9L0NPTU1JVF9NU0ciOworCW9wZW4gbXkgJGxvZ19maCwgJz4nLCAkY29tbWl0X2VkaXRtc2cgb3IgY3JvYWsgJCE7CisKKwlteSAkdHlwZSA9IGNvbW1hbmRfb25lbGluZShxdy9jYXQtZmlsZSAtdC8sICR0cmVlaXNoKTsKKwlpZiAoJHR5cGUgZXEgJ2NvbW1pdCcgfHwgJHR5cGUgZXEgJ3RhZycpIHsKKwkJbXkgKCRtc2dfZmgsICRjdHgpID0gY29tbWFuZF9vdXRwdXRfcGlwZSgnY2F0LWZpbGUnLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0eXBlLCAkdHJlZWlzaCk7CisJCW15ICRpbl9tc2cgPSAwOworCQl3aGlsZSAoPCRtc2dfZmg+KSB7CisJCQlpZiAoISRpbl9tc2cpIHsKKwkJCQkkaW5fbXNnID0gMSBpZiAoL15ccyokLyk7CisJCQl9IGVsc2lmICgvXmdpdC1zdm4taWQ6IC8pIHsKKwkJCQkjIHNraXAgdGhpcyBmb3Igbm93LCB3ZSByZWdlbmVyYXRlIHRoZQorCQkJCSMgY29ycmVjdCBvbmUgb24gcmUtZmV0Y2ggYW55d2F5cworCQkJCSMgVE9ETzogc2V0ICo6bWVyZ2UgcHJvcGVydGllcyBvciBsaWtlLi4uCisJCQl9IGVsc2UgeworCQkJCXByaW50ICRsb2dfZmggJF8gb3IgY3JvYWsgJCE7CisJCQl9CisJCX0KKwkJY29tbWFuZF9jbG9zZV9waXBlKCRtc2dfZmgsICRjdHgpOworCX0KKwljbG9zZSAkbG9nX2ZoIG9yIGNyb2FrICQhOworCisJaWYgKCRfZWRpdCB8fCAoJHR5cGUgZXEgJ3RyZWUnKSkgeworCQlteSAkZWRpdG9yID0gJEVOVntWSVNVQUx9IHx8ICRFTlZ7RURJVE9SfSB8fCAndmknOworCQkjIFRPRE86IHN0cmlwIG91dCBzcGFjZXMsIGNvbW1lbnRzLCBsaWtlIGdpdC1jb21taXQuc2gKKwkJc3lzdGVtKCRlZGl0b3IsICRjb21taXRfZWRpdG1zZyk7CisJfQorCXJlbmFtZSAkY29tbWl0X2VkaXRtc2csICRjb21taXRfbXNnIG9yIGNyb2FrICQhOworCW9wZW4gJGxvZ19maCwgJzwnLCAkY29tbWl0X21zZyBvciBjcm9hayAkITsKKwl7IGxvY2FsICQvOyBjaG9tcCgkbG9nX2VudHJ5e2xvZ30gPSA8JGxvZ19maD4pOyB9CisJY2xvc2UgJGxvZ19maCBvciBjcm9hayAkITsKKwl1bmxpbmsgJGNvbW1pdF9tc2c7CisJXCVsb2dfZW50cnk7Cit9CisKK3N1YiBzX3RvX2ZpbGUgeworCW15ICgkc3RyLCAkZmlsZSwgJG1vZGUpID0gQF87CisJb3BlbiBteSAkZmQsJz4nLCRmaWxlIG9yIGNyb2FrICQhOworCXByaW50ICRmZCAkc3RyLCJcbiIgb3IgY3JvYWsgJCE7CisJY2xvc2UgJGZkIG9yIGNyb2FrICQhOworCWNobW9kICgkbW9kZSAmfiB1bWFzaywgJGZpbGUpIGlmIChkZWZpbmVkICRtb2RlKTsKK30KKworc3ViIGZpbGVfdG9fcyB7CisJbXkgJGZpbGUgPSBzaGlmdDsKKwlvcGVuIG15ICRmZCwnPCcsJGZpbGUgb3IgY3JvYWsgIiQhOiBmaWxlOiAkZmlsZVxuIjsKKwlsb2NhbCAkLzsKKwlteSAkcmV0ID0gPCRmZD47CisJY2xvc2UgJGZkIG9yIGNyb2FrICQhOworCSRyZXQgPX4gcy9ccyokLy9zOworCXJldHVybiAkcmV0OworfQorCisjICc8c3ZuIHVzZXJuYW1lPiA9IHJlYWwtbmFtZSA8ZW1haWwgYWRkcmVzcz4nIG1hcHBpbmcgYmFzZWQgb24gZ2l0LXN2bmltcG9ydDoKK3N1YiBsb2FkX2F1dGhvcnMgeworCW9wZW4gbXkgJGF1dGhvcnMsICc8JywgJF9hdXRob3JzIG9yIGRpZSAiQ2FuJ3Qgb3BlbiAkX2F1dGhvcnMgJCFcbiI7CisJbXkgJGxvZyA9ICRjbWQgZXEgJ2xvZyc7CisJd2hpbGUgKDwkYXV0aG9ycz4pIHsKKwkJY2hvbXA7CisJCW5leHQgdW5sZXNzIC9eKC4rP3xcKG5vIGF1dGhvclwpKVxzKj1ccyooLis/KVxzKjwoLispPlxzKiQvOworCQlteSAoJHVzZXIsICRuYW1lLCAkZW1haWwpID0gKCQxLCAkMiwgJDMpOworCQlpZiAoJGxvZykgeworCQkJJEdpdDo6U1ZOOjpMb2c6OnJ1c2Vyc3siJG5hbWUgPCRlbWFpbD4ifSA9ICR1c2VyOworCQl9IGVsc2UgeworCQkJJHVzZXJzeyR1c2VyfSA9IFskbmFtZSwgJGVtYWlsXTsKKwkJfQorCX0KKwljbG9zZSAkYXV0aG9ycyBvciBjcm9hayAkITsKK30KKworIyBjb252ZXJ0IEdldE9wdDo6TG9uZyBzcGVjcyBmb3IgdXNlIGJ5IGdpdC1jb25maWcKK3N1YiByZWFkX3JlcG9fY29uZmlnIHsKKwlyZXR1cm4gdW5sZXNzIC1kICRFTlZ7R0lUX0RJUn07CisJbXkgJG9wdHMgPSBzaGlmdDsKKwlteSBAY29uZmlnX29ubHk7CisJZm9yZWFjaCBteSAkbyAoa2V5cyAlJG9wdHMpIHsKKwkJIyBpZiB3ZSBoYXZlIG1peGVkQ2FzZSBhbmQgYSBsb25nIG9wdGlvbi1vbmx5LCB0aGVuCisJCSMgaXQncyBhIGNvbmZpZy1vbmx5IHZhcmlhYmxlIHRoYXQgd2UgZG9uJ3QgbmVlZCBmb3IKKwkJIyB0aGUgY29tbWFuZC1saW5lLgorCQlwdXNoIEBjb25maWdfb25seSwgJG8gaWYgKCRvID1+IC9bQS1aXS8gJiYgJG8gPX4gL15bYS16XSskL2kpOworCQlteSAkdiA9ICRvcHRzLT57JG99OworCQlteSAoJGtleSkgPSAoJG8gPX4gL14oW2EtekEtWlwtXSspLyk7CisJCSRrZXkgPX4gcy8tLy9nOworCQlteSAkYXJnID0gJ2dpdC1jb25maWcnOworCQkkYXJnIC49ICcgLS1pbnQnIGlmICgkbyA9fiAvWzo9XWkkLyk7CisJCSRhcmcgLj0gJyAtLWJvb2wnIGlmICgkbyAhfiAvWzo9XVtzZmldJC8pOworCQlpZiAocmVmICR2IGVxICdBUlJBWScpIHsKKwkJCWNob21wKG15IEB0bXAgPSBgJGFyZyAtLWdldC1hbGwgc3ZuLiRrZXlgKTsKKwkJCUAkdiA9IEB0bXAgaWYgQHRtcDsKKwkJfSBlbHNlIHsKKwkJCWNob21wKG15ICR0bXAgPSBgJGFyZyAtLWdldCBzdm4uJGtleWApOworCQkJaWYgKCR0bXAgJiYgISgkYXJnID1+IC8gLS1ib29sLyAmJiAkdG1wIGVxICdmYWxzZScpKSB7CisJCQkJJCR2ID0gJHRtcDsKKwkJCX0KKwkJfQorCX0KKwlkZWxldGUgQCRvcHRze0Bjb25maWdfb25seX0gaWYgQGNvbmZpZ19vbmx5OworfQorCitzdWIgZXh0cmFjdF9tZXRhZGF0YSB7CisJbXkgJGlkID0gc2hpZnQgb3IgcmV0dXJuICh1bmRlZiwgdW5kZWYsIHVuZGVmKTsKKwlteSAoJHVybCwgJHJldiwgJHV1aWQpID0gKCRpZCA9fiAvXlxzKmdpdC1zdm4taWQ6XHMrKC4qKVxAKFxkKykKKwkJCQkJCQlccyhbYS1mXGRcLV0rKSQveCk7CisJaWYgKCFkZWZpbmVkICRyZXYgfHwgISR1dWlkIHx8ICEkdXJsKSB7CisJCSMgc29tZSBvZiB0aGUgb3JpZ2luYWwgcmVwb3NpdG9yaWVzIEkgbWFkZSBoYWQKKwkJIyBpZGVudGlmaWVycyBsaWtlIHRoaXM6CisJCSgkcmV2LCAkdXVpZCkgPSAoJGlkID1+L15ccypnaXQtc3ZuLWlkOlxzKFxkKylcQChbYS1mXGRcLV0rKS8pOworCX0KKwlyZXR1cm4gKCR1cmwsICRyZXYsICR1dWlkKTsKK30KKworc3ViIGNtdF9tZXRhZGF0YSB7CisJcmV0dXJuIGV4dHJhY3RfbWV0YWRhdGEoKGdyZXAoL15naXQtc3ZuLWlkOiAvLAorCQljb21tYW5kKHF3L2NhdC1maWxlIGNvbW1pdC8sIHNoaWZ0KSkpWy0xXSk7Cit9CisKK3N1YiB3b3JraW5nX2hlYWRfaW5mbyB7CisJbXkgKCRoZWFkLCAkcmVmcykgPSBAXzsKKwlteSBAYXJncyA9ICgnbG9nJywgJy0tbm8tY29sb3InLCAnLS1maXJzdC1wYXJlbnQnKTsKKwlteSAoJGZoLCAkY3R4KSA9IGNvbW1hbmRfb3V0cHV0X3BpcGUoQGFyZ3MsICRoZWFkKTsKKwlteSAkaGFzaDsKKwlteSAlbWF4OworCXdoaWxlICg8JGZoPikgeworCQlpZiAoIG17XmNvbW1pdCAoJDo6c2hhMSkkfSApIHsKKwkJCXVuc2hpZnQgQCRyZWZzLCAkaGFzaCBpZiAkaGFzaCBhbmQgJHJlZnM7CisJCQkkaGFzaCA9ICQxOworCQkJbmV4dDsKKwkJfQorCQluZXh0IHVubGVzcyBze15ccyooZ2l0LXN2bi1pZDopfXskMX07CisJCW15ICgkdXJsLCAkcmV2LCAkdXVpZCkgPSBleHRyYWN0X21ldGFkYXRhKCRfKTsKKwkJaWYgKGRlZmluZWQgJHVybCAmJiBkZWZpbmVkICRyZXYpIHsKKwkJCW5leHQgaWYgJG1heHskdXJsfSBhbmQgJG1heHskdXJsfSA8ICRyZXY7CisJCQlpZiAobXkgJGdzID0gR2l0OjpTVk4tPmZpbmRfYnlfdXJsKCR1cmwpKSB7CisJCQkJbXkgJGMgPSAkZ3MtPnJldl9tYXBfZ2V0KCRyZXYpOworCQkJCWlmICgkYyAmJiAkYyBlcSAkaGFzaCkgeworCQkJCQljbG9zZSAkZmg7ICMgYnJlYWsgdGhlIHBpcGUKKwkJCQkJcmV0dXJuICgkdXJsLCAkcmV2LCAkdXVpZCwgJGdzKTsKKwkJCQl9IGVsc2UgeworCQkJCQkkbWF4eyR1cmx9IHx8PSAkZ3MtPnJldl9tYXBfbWF4OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwljb21tYW5kX2Nsb3NlX3BpcGUoJGZoLCAkY3R4KTsKKwkodW5kZWYsIHVuZGVmLCB1bmRlZiwgdW5kZWYpOworfQorCitzdWIgcmVhZF9jb21taXRfcGFyZW50cyB7CisJbXkgKCRwYXJlbnRzLCAkYykgPSBAXzsKKwljaG9tcChteSAkcCA9IGNvbW1hbmRfb25lbGluZShxdy9yZXYtbGlzdCAtLXBhcmVudHMgLTEvLCAkYykpOworCSRwID1+IHMvXigkYylccyovLyBvciBkaWUgInJldi1saXN0IC0tcGFyZW50cyAtMSAkYyBmYWlsZWQhXG4iOworCUB7JHBhcmVudHMtPnskY319ID0gc3BsaXQoLyAvLCAkcCk7Cit9CisKK3N1YiBsaW5lYXJpemVfaGlzdG9yeSB7CisJbXkgKCRncywgJHJlZnMpID0gQF87CisJbXkgJXBhcmVudHM7CisJZm9yZWFjaCBteSAkYyAoQCRyZWZzKSB7CisJCXJlYWRfY29tbWl0X3BhcmVudHMoXCVwYXJlbnRzLCAkYyk7CisJfQorCisJbXkgQGxpbmVhcl9yZWZzOworCW15ICVza2lwID0gKCk7CisJbXkgJGxhc3Rfc3ZuX2NvbW1pdCA9ICRncy0+bGFzdF9jb21taXQ7CisJZm9yZWFjaCBteSAkYyAocmV2ZXJzZSBAJHJlZnMpIHsKKwkJbmV4dCBpZiAkYyBlcSAkbGFzdF9zdm5fY29tbWl0OworCQlsYXN0IGlmICRza2lweyRjfTsKKworCQl1bnNoaWZ0IEBsaW5lYXJfcmVmcywgJGM7CisJCSRza2lweyRjfSA9IDE7CisKKwkJIyB3ZSBvbmx5IHdhbnQgdGhlIGZpcnN0IHBhcmVudCB0byBkaWZmIGFnYWluc3QgZm9yIGxpbmVhcgorCQkjIGhpc3RvcnksIHdlIHNhdmUgdGhlIHJlc3QgdG8gaW5qZWN0IHdoZW4gd2UgZmluYWxpemUgdGhlCisJCSMgc3ZuIGNvbW1pdAorCQlteSAkZnBfYSA9IHZlcmlmeV9yZWYoIiRjfjEiKTsKKwkJbXkgJGZwX2IgPSBzaGlmdCBAeyRwYXJlbnRzeyRjfX0gaWYgJHBhcmVudHN7JGN9OworCQlpZiAoISRmcF9hIHx8ICEkZnBfYikgeworCQkJZGllICJDb21taXQgJGNcbiIsCisJCQkgICAgImhhcyBubyBwYXJlbnQgY29tbWl0LCBhbmQgdGhlcmVmb3JlICIsCisJCQkgICAgIm5vdGhpbmcgdG8gZGlmZiBhZ2FpbnN0LlxuIiwKKwkJCSAgICAiWW91IHNob3VsZCBiZSB3b3JraW5nIGZyb20gYSByZXBvc2l0b3J5ICIsCisJCQkgICAgIm9yaWdpbmFsbHkgY3JlYXRlZCBieSBnaXQtc3ZuXG4iOworCQl9CisJCWlmICgkZnBfYSBuZSAkZnBfYikgeworCQkJZGllICIkY34xID0gJGZwX2EsIGhvd2V2ZXIgcGFyc2luZyBjb21taXQgJGMgIiwKKwkJCSAgICAicmV2ZWFsZWQgdGhhdDpcbiRjfjEgPSAkZnBfYlxuQlVHIVxuIjsKKwkJfQorCisJCWZvcmVhY2ggbXkgJHAgKEB7JHBhcmVudHN7JGN9fSkgeworCQkJJHNraXB7JHB9ID0gMTsKKwkJfQorCX0KKwkoXEBsaW5lYXJfcmVmcywgXCVwYXJlbnRzKTsKK30KKworc3ViIGZpbmRfZmlsZV90eXBlX2FuZF9kaWZmX3N0YXR1cyB7CisJbXkgKCRwYXRoKSA9IEBfOworCXJldHVybiAoJ2RpcicsICcnKSBpZiAkcGF0aCBlcSAnLic7CisKKwlteSAkZGlmZl9vdXRwdXQgPQorCSAgICBjb21tYW5kX29uZWxpbmUocXcoZGlmZiAtLWNhY2hlZCAtLW5hbWUtc3RhdHVzIC0tKSwgJHBhdGgpIHx8ICIiOworCW15ICRkaWZmX3N0YXR1cyA9IChzcGxpdCgnICcsICRkaWZmX291dHB1dCkpWzBdIHx8ICIiOworCisJbXkgJGxzX3RyZWUgPSBjb21tYW5kX29uZWxpbmUocXcobHMtdHJlZSBIRUFEKSwgJHBhdGgpIHx8ICIiOworCisJcmV0dXJuICh1bmRlZiwgdW5kZWYpIGlmICEkZGlmZl9zdGF0dXMgJiYgISRsc190cmVlOworCisJaWYgKCRkaWZmX3N0YXR1cyBlcSAiQSIpIHsKKwkJcmV0dXJuICgibGluayIsICRkaWZmX3N0YXR1cykgaWYgLWwgJHBhdGg7CisJCXJldHVybiAoImRpciIsICRkaWZmX3N0YXR1cykgaWYgLWQgJHBhdGg7CisJCXJldHVybiAoImZpbGUiLCAkZGlmZl9zdGF0dXMpOworCX0KKworCW15ICRtb2RlID0gKHNwbGl0KCcgJywgJGxzX3RyZWUpKVswXSB8fCAiIjsKKworCXJldHVybiAoImxpbmsiLCAkZGlmZl9zdGF0dXMpIGlmICRtb2RlIGVxICIxMjAwMDAiOworCXJldHVybiAoImRpciIsICRkaWZmX3N0YXR1cykgaWYgJG1vZGUgZXEgIjA0MDAwMCI7CisJcmV0dXJuICgiZmlsZSIsICRkaWZmX3N0YXR1cyk7Cit9CisKK3N1YiBtZDVzdW0geworCW15ICRhcmcgPSBzaGlmdDsKKwlteSAkcmVmID0gcmVmICRhcmc7CisJbXkgJG1kNSA9IERpZ2VzdDo6TUQ1LT5uZXcoKTsKKyAgICAgICAgaWYgKCRyZWYgZXEgJ0dMT0InIHx8ICRyZWYgZXEgJ0lPOjpGaWxlJykgeworCQkkbWQ1LT5hZGRmaWxlKCRhcmcpIG9yIGNyb2FrICQhOworCX0gZWxzaWYgKCRyZWYgZXEgJ1NDQUxBUicpIHsKKwkJJG1kNS0+YWRkKCQkYXJnKSBvciBjcm9hayAkITsKKwl9IGVsc2lmICghJHJlZikgeworCQkkbWQ1LT5hZGQoJGFyZykgb3IgY3JvYWsgJCE7CisJfSBlbHNlIHsKKwkJOjpmYXRhbCAiQ2FuJ3QgcHJvdmlkZSBNRDUgaGFzaCBmb3IgdW5rbm93biByZWYgdHlwZTogJyIsICRyZWYsICInIjsKKwl9CisJcmV0dXJuICRtZDUtPmhleGRpZ2VzdCgpOworfQorCitwYWNrYWdlIEdpdDo6U1ZOOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBGY250bCBxdy86REVGQVVMVCA6c2Vlay87Cit1c2UgY29uc3RhbnQgcmV2X21hcF9mbXQgPT4gJ05INDAnOwordXNlIHZhcnMgcXcvJGRlZmF1bHRfcmVwb19pZCAkZGVmYXVsdF9yZWZfaWQgJF9ub19tZXRhZGF0YSAkX2ZvbGxvd19wYXJlbnQKKyAgICAgICAgICAgICRfcmVwYWNrICRfcmVwYWNrX2ZsYWdzICRfdXNlX3N2bV9wcm9wcyAkX2hlYWQKKyAgICAgICAgICAgICRfdXNlX3N2bnN5bmNfcHJvcHMgJG5vX3JldXNlX2V4aXN0aW5nICRfbWluaW1pemVfdXJsCisJICAgICRfdXNlX2xvZ19hdXRob3IvOwordXNlIENhcnAgcXcvY3JvYWsvOwordXNlIEZpbGU6OlBhdGggcXcvbWtwYXRoLzsKK3VzZSBGaWxlOjpDb3B5IHF3L2NvcHkvOwordXNlIElQQzo6T3BlbjM7CisKK215ICgkX2djX25yLCAkX2djX3BlcmlvZCk7CisKKyMgcHJvcGVydGllcyB0aGF0IHdlIGRvIG5vdCBsb2c6CitteSAlU0tJUF9QUk9QOworQkVHSU4geworCSVTS0lQX1BST1AgPSBtYXAgeyAkXyA9PiAxIH0gcXcvc3ZuOndjOnJhX2Rhdjp2ZXJzaW9uLXVybAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZuOnNwZWNpYWwgc3ZuOmV4ZWN1dGFibGUKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2bjplbnRyeTpjb21taXR0ZWQtcmV2CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdm46ZW50cnk6bGFzdC1hdXRob3IKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2bjplbnRyeTp1dWlkCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdm46ZW50cnk6Y29tbWl0dGVkLWRhdGUvOworCisJIyBzb21lIG9wdGlvbnMgYXJlIHJlYWQgZ2xvYmFsbHksIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiBsb2NhbGx5CisJIyBwZXIgW3N2bi1yZW1vdGUgIi4uLiJdIHNlY3Rpb24uICBDb21tYW5kLWxpbmUgb3B0aW9ucyB3aWxsICpOT1QqCisJIyBvdmVycmlkZSBvcHRpb25zIHNldCBpbiBhbiBbc3ZuLXJlbW90ZSAiLi4uIl0gc2VjdGlvbgorCW5vIHN0cmljdCAncmVmcyc7CisJZm9yIG15ICRvcHRpb24gKHF3L2ZvbGxvd19wYXJlbnQgbm9fbWV0YWRhdGEgdXNlX3N2bV9wcm9wcworCQkJICAgdXNlX3N2bnN5bmNfcHJvcHMvKSB7CisJCW15ICRrZXkgPSAkb3B0aW9uOworCQkka2V5ID1+IHRyL18vL2Q7CisJCW15ICRwcm9wID0gIi0kb3B0aW9uIjsKKwkJKiRvcHRpb24gPSBzdWIgeworCQkJbXkgKCRzZWxmKSA9IEBfOworCQkJcmV0dXJuICRzZWxmLT57JHByb3B9IGlmIGV4aXN0cyAkc2VsZi0+eyRwcm9wfTsKKwkJCW15ICRrID0gInN2bi1yZW1vdGUuJHNlbGYtPntyZXBvX2lkfS4ka2V5IjsKKwkJCWV2YWwgeyBjb21tYW5kX29uZWxpbmUocXcvY29uZmlnIC0tZ2V0LywgJGspIH07CisJCQlpZiAoJEApIHsKKwkJCQkkc2VsZi0+eyRwcm9wfSA9ICR7IkdpdDo6U1ZOOjpfJG9wdGlvbiJ9OworCQkJfSBlbHNlIHsKKwkJCQlteSAkdiA9IGNvbW1hbmRfb25lbGluZShxdy9jb25maWcgLS1ib29sLywkayk7CisJCQkJJHNlbGYtPnskcHJvcH0gPSAkdiBlcSAnZmFsc2UnID8gMCA6IDE7CisJCQl9CisJCQlyZXR1cm4gJHNlbGYtPnskcHJvcH07CisJCX0KKwl9Cit9CisKK215ICglTE9DS0ZJTEVTLCAlSU5ERVhfRklMRVMpOworRU5EIHsKKwl1bmxpbmsga2V5cyAlTE9DS0ZJTEVTIGlmICVMT0NLRklMRVM7CisJdW5saW5rIGtleXMgJUlOREVYX0ZJTEVTIGlmICVJTkRFWF9GSUxFUzsKK30KKworc3ViIHJlc29sdmVfbG9jYWxfZ2xvYnMgeworCW15ICgkdXJsLCAkZmV0Y2gsICRnbG9iX3NwZWMpID0gQF87CisJcmV0dXJuIHVubGVzcyBkZWZpbmVkICRnbG9iX3NwZWM7CisJbXkgJHJlZiA9ICRnbG9iX3NwZWMtPntyZWZ9OworCW15ICRwYXRoID0gJGdsb2Jfc3BlYy0+e3BhdGh9OworCWZvcmVhY2ggKGNvbW1hbmQocXcjZm9yLWVhY2gtcmVmIC0tZm9ybWF0PSUocmVmbmFtZSkgcmVmcy9yZW1vdGVzIykpIHsKKwkJbmV4dCB1bmxlc3MgbSNecmVmcy9yZW1vdGVzLyRyZWYtPntyZWdleH0kIzsKKwkJbXkgJHAgPSAkMTsKKwkJbXkgJHBhdGhuYW1lID0gZGVzYW5pdGl6ZV9yZWZuYW1lKCRwYXRoLT5mdWxsX3BhdGgoJHApKTsKKwkJbXkgJHJlZm5hbWUgPSBkZXNhbml0aXplX3JlZm5hbWUoJHJlZi0+ZnVsbF9wYXRoKCRwKSk7CisJCWlmIChteSAkZXhpc3RpbmcgPSAkZmV0Y2gtPnskcGF0aG5hbWV9KSB7CisJCQlpZiAoJGV4aXN0aW5nIG5lICRyZWZuYW1lKSB7CisJCQkJZGllICJSZWZzcGVjIGNvbmZsaWN0OlxuIiwKKwkJCQkgICAgImV4aXN0aW5nOiByZWZzL3JlbW90ZXMvJGV4aXN0aW5nXG4iLAorCQkJCSAgICAiIGdsb2JiZWQ6IHJlZnMvcmVtb3Rlcy8kcmVmbmFtZVxuIjsKKwkJCX0KKwkJCW15ICR1ID0gKDo6Y210X21ldGFkYXRhKCJyZWZzL3JlbW90ZXMvJHJlZm5hbWUiKSlbMF07CisJCQkkdSA9fiBzIV5cUSR1cmxcRSgvfCQpISEgb3IgZGllCisJCQkgICJyZWZzL3JlbW90ZXMvJHJlZm5hbWU6ICckdXJsJyBub3QgZm91bmQgaW4gJyR1J1xuIjsKKwkJCWlmICgkcGF0aG5hbWUgbmUgJHUpIHsKKwkJCQl3YXJuICJXOiBSZWZzcGVjIGdsb2IgY29uZmxpY3QgIiwKKwkJCQkgICAgICIocmVmOiByZWZzL3JlbW90ZXMvJHJlZm5hbWUpOlxuIiwKKwkJCQkgICAgICJleHBlY3RlZCBwYXRoOiAkcGF0aG5hbWVcbiIsCisJCQkJICAgICAiICAgIHJlYWwgcGF0aDogJHVcbiIsCisJCQkJICAgICAiQ29udGludWluZyBhaGVhZCB3aXRoICR1XG4iOworCQkJCW5leHQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQkkZmV0Y2gtPnskcGF0aG5hbWV9ID0gJHJlZm5hbWU7CisJCX0KKwl9Cit9CisKK3N1YiBwYXJzZV9yZXZpc2lvbl9hcmd1bWVudCB7CisJbXkgKCRiYXNlLCAkaGVhZCkgPSBAXzsKKwlpZiAoIWRlZmluZWQgJDo6X3JldmlzaW9uIHx8ICQ6Ol9yZXZpc2lvbiBlcSAnQkFTRTpIRUFEJykgeworCQlyZXR1cm4gKCRiYXNlLCAkaGVhZCk7CisJfQorCXJldHVybiAoJDEsICQyKSBpZiAoJDo6X3JldmlzaW9uID1+IC9eKFxkKyk6KFxkKykkLyk7CisJcmV0dXJuICgkOjpfcmV2aXNpb24sICQ6Ol9yZXZpc2lvbikgaWYgKCQ6Ol9yZXZpc2lvbiA9fiAvXlxkKyQvKTsKKwlyZXR1cm4gKCRoZWFkLCAkaGVhZCkgaWYgKCQ6Ol9yZXZpc2lvbiBlcSAnSEVBRCcpOworCXJldHVybiAoJGJhc2UsICQxKSBpZiAoJDo6X3JldmlzaW9uID1+IC9eQkFTRTooXGQrKSQvKTsKKwlyZXR1cm4gKCQxLCAkaGVhZCkgaWYgKCQ6Ol9yZXZpc2lvbiA9fiAvXihcZCspOkhFQUQkLyk7CisJZGllICJyZXZpc2lvbiBhcmd1bWVudDogJDo6X3JldmlzaW9uIG5vdCB1bmRlcnN0b29kIGJ5IGdpdC1zdm5cbiI7Cit9CisKK3N1YiBmZXRjaF9hbGwgeworCW15ICgkcmVwb19pZCwgJHJlbW90ZXMpID0gQF87CisJaWYgKHJlZiAkcmVwb19pZCkgeworCQlteSAkZ3MgPSAkcmVwb19pZDsKKwkJJHJlcG9faWQgPSB1bmRlZjsKKwkJJHJlcG9faWQgPSAkZ3MtPntyZXBvX2lkfTsKKwl9CisJJHJlbW90ZXMgfHw9IHJlYWRfYWxsX3JlbW90ZXMoKTsKKwlteSAkcmVtb3RlID0gJHJlbW90ZXMtPnskcmVwb19pZH0gb3IKKwkgICAgICAgICAgICAgZGllICJbc3ZuLXJlbW90ZSBcIiRyZXBvX2lkXCJdIHVua25vd25cbiI7CisJbXkgJGZldGNoID0gJHJlbW90ZS0+e2ZldGNofTsKKwlteSAkdXJsID0gJHJlbW90ZS0+e3VybH0gb3IgZGllICJzdm4tcmVtb3RlLiRyZXBvX2lkLnVybCBub3QgZGVmaW5lZFxuIjsKKwlteSAoQGdzLCBAZ2xvYnMpOworCW15ICRyYSA9IEdpdDo6U1ZOOjpSYS0+bmV3KCR1cmwpOworCW15ICR1dWlkID0gJHJhLT5nZXRfdXVpZDsKKwlteSAkaGVhZCA9ICRyYS0+Z2V0X2xhdGVzdF9yZXZudW07CisJbXkgJGJhc2UgPSBkZWZpbmVkICRmZXRjaCA/ICRoZWFkIDogMDsKKworCSMgcmVhZCB0aGUgbWF4IHJldnMgZm9yIHdpbGRjYXJkIGV4cGFuc2lvbiAoYnJhbmNoZXMvKiwgdGFncy8qKQorCWZvcmVhY2ggbXkgJHQgKHF3L2JyYW5jaGVzIHRhZ3MvKSB7CisJCWRlZmluZWQgJHJlbW90ZS0+eyR0fSBvciBuZXh0OworCQlwdXNoIEBnbG9icywgJHJlbW90ZS0+eyR0fTsKKwkJbXkgJG1heF9yZXYgPSBldmFsIHsgdG1wX2NvbmZpZyhxdy8tLWludCAtLWdldC8sCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAic3ZuLXJlbW90ZS4kcmVwb19pZC4ke3R9LW1heFJldiIpIH07CisJCWlmIChkZWZpbmVkICRtYXhfcmV2ICYmICgkbWF4X3JldiA8ICRiYXNlKSkgeworCQkJJGJhc2UgPSAkbWF4X3JldjsKKwkJfSBlbHNpZiAoIWRlZmluZWQgJG1heF9yZXYpIHsKKwkJCSRiYXNlID0gMDsKKwkJfQorCX0KKworCWlmICgkZmV0Y2gpIHsKKwkJZm9yZWFjaCBteSAkcCAoc29ydCBrZXlzICUkZmV0Y2gpIHsKKwkJCW15ICRncyA9IEdpdDo6U1ZOLT5uZXcoJGZldGNoLT57JHB9LCAkcmVwb19pZCwgJHApOworCQkJbXkgJGxyID0gJGdzLT5yZXZfbWFwX21heDsKKwkJCWlmIChkZWZpbmVkICRscikgeworCQkJCSRiYXNlID0gJGxyIGlmICgkbHIgPCAkYmFzZSk7CisJCQl9CisJCQlwdXNoIEBncywgJGdzOworCQl9CisJfQorCisJKCRiYXNlLCAkaGVhZCkgPSBwYXJzZV9yZXZpc2lvbl9hcmd1bWVudCgkYmFzZSwgJGhlYWQpOworCSRyYS0+Z3NfZmV0Y2hfbG9vcF9jb21tb24oJGJhc2UsICRoZWFkLCBcQGdzLCBcQGdsb2JzKTsKK30KKworc3ViIHJlYWRfYWxsX3JlbW90ZXMgeworCW15ICRyID0ge307CisJZm9yZWFjaCAoZ3JlcCB7IHMvXnN2bi1yZW1vdGVcLi8vIH0gY29tbWFuZChxdy9jb25maWcgLWwvKSkgeworCQlpZiAobSFeKC4rKVwuZmV0Y2g9XHMqKC4qKVxzKjpccypyZWZzL3JlbW90ZXMvKC4rKVxzKiQhKSB7CisJCQlteSAoJHJlbW90ZSwgJGxvY2FsX3JlZiwgJHJlbW90ZV9yZWYpID0gKCQxLCAkMiwgJDMpOworCQkJJGxvY2FsX3JlZiA9fiBze14vfXt9OworCQkJJHItPnskcmVtb3RlfS0+e2ZldGNofS0+eyRsb2NhbF9yZWZ9ID0gJHJlbW90ZV9yZWY7CisJCX0gZWxzaWYgKG0hXiguKylcLnVybD1ccyooLiopXHMqJCEpIHsKKwkJCSRyLT57JDF9LT57dXJsfSA9ICQyOworCQl9IGVsc2lmIChtIV4oLispXC4oYnJhbmNoZXN8dGFncyk9CisJCSAgICAgICAgICAgKC4qKTpyZWZzL3JlbW90ZXMvKC4rKVxzKiQvIXgpIHsKKwkJCW15ICgkcCwgJGcpID0gKCQzLCAkNCk7CisJCQlteSAkcnMgPSAkci0+eyQxfS0+eyQyfSA9IHsKKwkJCSAgICAgICAgICAgICAgICAgIHQgPT4gJDIsCisJCQkJCSAgcmVtb3RlID0+ICQxLAorCQkJICAgICAgICAgICAgICAgICAgcGF0aCA9PiBHaXQ6OlNWTjo6R2xvYlNwZWMtPm5ldygkcCksCisJCQkgICAgICAgICAgICAgICAgICByZWYgPT4gR2l0OjpTVk46Okdsb2JTcGVjLT5uZXcoJGcpIH07CisJCQlpZiAobGVuZ3RoKCRycy0+e3JlZn0tPntyaWdodH0pICE9IDApIHsKKwkJCQlkaWUgIlRoZSAnKicgZ2xvYiBjaGFyYWN0ZXIgbXVzdCBiZSB0aGUgbGFzdCAiLAorCQkJCSAgICAiY2hhcmFjdGVyIG9mICckZydcbiI7CisJCQl9CisJCX0KKwl9CisJJHI7Cit9CisKK3N1YiBpbml0X3ZhcnMgeworCSRfZ2NfbnIgPSAkX2djX3BlcmlvZCA9IDEwMDA7CisJaWYgKGRlZmluZWQgJF9yZXBhY2sgfHwgZGVmaW5lZCAkX3JlcGFja19mbGFncykgeworCSAgICAgICB3YXJuICJSZXBhY2sgb3B0aW9ucyBhcmUgb2Jzb2xldGU7IHRoZXkgaGF2ZSBubyBlZmZlY3QuXG4iOworCX0KK30KKworc3ViIHZlcmlmeV9yZW1vdGVzX3Nhbml0eSB7CisJcmV0dXJuIHVubGVzcyAtZCAkRU5We0dJVF9ESVJ9OworCW15ICVzZWVuOworCWZvcmVhY2ggKGNvbW1hbmQocXcvY29uZmlnIC1sLykpIHsKKwkJaWYgKG0hXnN2bi1yZW1vdGVcLig/Oi4rKVwuZmV0Y2g9Lio6cmVmcy9yZW1vdGVzLyhcUyspXHMqJCEpIHsKKwkJCWlmICgkc2VlbnskMX0pIHsKKwkJCQlkaWUgIlJlbW90ZSByZWYgcmVmcy9yZW1vdGUvJDEgaXMgdHJhY2tlZCBieSIsCisJCQkJICAgICJcbiAgXCIkX1wiXG5hbmRcbiAgXCIkc2VlbnskMX1cIlxuIiwKKwkJCQkgICAgIlBsZWFzZSByZXNvbHZlIHRoaXMgYW1iaWd1aXR5IGluICIsCisJCQkJICAgICJ5b3VyIGdpdCBjb25maWd1cmF0aW9uIGZpbGUgYmVmb3JlICIsCisJCQkJICAgICJjb250aW51aW5nXG4iOworCQkJfQorCQkJJHNlZW57JDF9ID0gJF87CisJCX0KKwl9Cit9CisKKyMgd2UgYWxsb3cgbW9yZSBjaGFycyB0aGFuIHJlbW90ZXMyY29uZmlnLnNoLi4uCitzdWIgc2FuaXRpemVfcmVtb3RlX25hbWUgeworCW15ICgkbmFtZSkgPSBAXzsKKwkkbmFtZSA9fiB0cntBLVphLXowLTk6LC8rLX17Ln1jOworCSRuYW1lOworfQorCitzdWIgZmluZF9leGlzdGluZ19yZW1vdGUgeworCW15ICgkdXJsLCAkcmVtb3RlcykgPSBAXzsKKwlyZXR1cm4gdW5kZWYgaWYgJG5vX3JldXNlX2V4aXN0aW5nOworCW15ICRleGlzdGluZzsKKwlmb3JlYWNoIG15ICRyZXBvX2lkIChrZXlzICUkcmVtb3RlcykgeworCQlteSAkdSA9ICRyZW1vdGVzLT57JHJlcG9faWR9LT57dXJsfSBvciBuZXh0OworCQluZXh0IGlmICR1IG5lICR1cmw7CisJCSRleGlzdGluZyA9ICRyZXBvX2lkOworCQlsYXN0OworCX0KKwkkZXhpc3Rpbmc7Cit9CisKK3N1YiBpbml0X3JlbW90ZV9jb25maWcgeworCW15ICgkc2VsZiwgJHVybCwgJG5vX3dyaXRlKSA9IEBfOworCSR1cmwgPX4gcyEvKyQhITsgIyBzdHJpcCB0cmFpbGluZyBzbGFzaAorCW15ICRyID0gcmVhZF9hbGxfcmVtb3RlcygpOworCW15ICRleGlzdGluZyA9IGZpbmRfZXhpc3RpbmdfcmVtb3RlKCR1cmwsICRyKTsKKwlpZiAoJGV4aXN0aW5nKSB7CisJCXVubGVzcyAoJG5vX3dyaXRlKSB7CisJCQlwcmludCBTVERFUlIgIlVzaW5nIGV4aXN0aW5nICIsCisJCQkJICAgICAiW3N2bi1yZW1vdGUgXCIkZXhpc3RpbmdcIl1cbiI7CisJCX0KKwkJJHNlbGYtPntyZXBvX2lkfSA9ICRleGlzdGluZzsKKwl9IGVsc2lmICgkX21pbmltaXplX3VybCkgeworCQlteSAkbWluX3VybCA9IEdpdDo6U1ZOOjpSYS0+bmV3KCR1cmwpLT5taW5pbWl6ZV91cmw7CisJCSRleGlzdGluZyA9IGZpbmRfZXhpc3RpbmdfcmVtb3RlKCRtaW5fdXJsLCAkcik7CisJCWlmICgkZXhpc3RpbmcpIHsKKwkJCXVubGVzcyAoJG5vX3dyaXRlKSB7CisJCQkJcHJpbnQgU1RERVJSICJVc2luZyBleGlzdGluZyAiLAorCQkJCQkgICAgICJbc3ZuLXJlbW90ZSBcIiRleGlzdGluZ1wiXVxuIjsKKwkJCX0KKwkJCSRzZWxmLT57cmVwb19pZH0gPSAkZXhpc3Rpbmc7CisJCX0KKwkJaWYgKCRtaW5fdXJsIG5lICR1cmwpIHsKKwkJCXVubGVzcyAoJG5vX3dyaXRlKSB7CisJCQkJcHJpbnQgU1RERVJSICJVc2luZyBoaWdoZXIgbGV2ZWwgb2YgVVJMOiAiLAorCQkJCQkgICAgICIkdXJsID0+ICRtaW5fdXJsXG4iOworCQkJfQorCQkJbXkgJG9sZF9wYXRoID0gJHNlbGYtPntwYXRofTsKKwkJCSRzZWxmLT57cGF0aH0gPSAkdXJsOworCQkJJHNlbGYtPntwYXRofSA9fiBzIV5cUSRtaW5fdXJsXEUoL3wkKSEhOworCQkJaWYgKGxlbmd0aCAkb2xkX3BhdGgpIHsKKwkJCQkkc2VsZi0+e3BhdGh9IC49ICIvJG9sZF9wYXRoIjsKKwkJCX0KKwkJCSR1cmwgPSAkbWluX3VybDsKKwkJfQorCX0KKwlteSAkb3JpZ191cmw7CisJaWYgKCEkZXhpc3RpbmcpIHsKKwkJIyB2ZXJpZnkgdGhhdCB3ZSBhcmVuJ3Qgb3ZlcndyaXRpbmcgYW55dGhpbmc6CisJCSRvcmlnX3VybCA9IGV2YWwgeworCQkJY29tbWFuZF9vbmVsaW5lKCdjb25maWcnLCAnLS1nZXQnLAorCQkJCQkic3ZuLXJlbW90ZS4kc2VsZi0+e3JlcG9faWR9LnVybCIpCisJCX07CisJCWlmICgkb3JpZ191cmwgJiYgKCRvcmlnX3VybCBuZSAkdXJsKSkgeworCQkJZGllICJzdm4tcmVtb3RlLiRzZWxmLT57cmVwb19pZH0udXJsIGFscmVhZHkgc2V0OiAiLAorCQkJICAgICIkb3JpZ191cmxcbndhbnRlZCB0byBzZXQgdG86ICR1cmxcbiI7CisJCX0KKwl9CisJbXkgKCR4cmVwb19pZCwgJHhwYXRoKSA9IGZpbmRfcmVmKCRzZWxmLT5yZWZuYW1lKTsKKwlpZiAoZGVmaW5lZCAkeHBhdGgpIHsKKwkJZGllICJzdm4tcmVtb3RlLiR4cmVwb19pZC5mZXRjaCBhbHJlYWR5IHNldCB0byB0cmFjayAiLAorCQkgICAgIiR4cGF0aDpyZWZzL3JlbW90ZXMvIiwgJHNlbGYtPnJlZm5hbWUsICJcbiI7CisJfQorCXVubGVzcyAoJG5vX3dyaXRlKSB7CisJCWNvbW1hbmRfbm9pc3koJ2NvbmZpZycsCisJCQkgICAgICAic3ZuLXJlbW90ZS4kc2VsZi0+e3JlcG9faWR9LnVybCIsICR1cmwpOworCQkkc2VsZi0+e3BhdGh9ID1+IHN7Xi99e307CisJCWNvbW1hbmRfbm9pc3koJ2NvbmZpZycsICctLWFkZCcsCisJCQkgICAgICAic3ZuLXJlbW90ZS4kc2VsZi0+e3JlcG9faWR9LmZldGNoIiwKKwkJCSAgICAgICIkc2VsZi0+e3BhdGh9OiIuJHNlbGYtPnJlZm5hbWUpOworCX0KKwkkc2VsZi0+e3VybH0gPSAkdXJsOworfQorCitzdWIgZmluZF9ieV91cmwgeyAjIHJlcG9zX3Jvb3QgYW5kLCBwYXRoIGFyZSBvcHRpb25hbAorCW15ICgkY2xhc3MsICRmdWxsX3VybCwgJHJlcG9zX3Jvb3QsICRwYXRoKSA9IEBfOworCisJcmV0dXJuIHVuZGVmIHVubGVzcyBkZWZpbmVkICRmdWxsX3VybDsKKwlyZW1vdmVfdXNlcm5hbWUoJGZ1bGxfdXJsKTsKKwlyZW1vdmVfdXNlcm5hbWUoJHJlcG9zX3Jvb3QpIGlmIGRlZmluZWQgJHJlcG9zX3Jvb3Q7CisJbXkgJHJlbW90ZXMgPSByZWFkX2FsbF9yZW1vdGVzKCk7CisJaWYgKGRlZmluZWQgJGZ1bGxfdXJsICYmIGRlZmluZWQgJHJlcG9zX3Jvb3QgJiYgIWRlZmluZWQgJHBhdGgpIHsKKwkJJHBhdGggPSAkZnVsbF91cmw7CisJCSRwYXRoID1+IHMjXlxRJHJlcG9zX3Jvb3RcRSg/Oi98JCkjIzsKKwl9CisJZm9yZWFjaCBteSAkcmVwb19pZCAoa2V5cyAlJHJlbW90ZXMpIHsKKwkJbXkgJHUgPSAkcmVtb3Rlcy0+eyRyZXBvX2lkfS0+e3VybH0gb3IgbmV4dDsKKwkJcmVtb3ZlX3VzZXJuYW1lKCR1KTsKKwkJbmV4dCBpZiBkZWZpbmVkICRyZXBvc19yb290ICYmICRyZXBvc19yb290IG5lICR1OworCisJCW15ICRmZXRjaCA9ICRyZW1vdGVzLT57JHJlcG9faWR9LT57ZmV0Y2h9IHx8IHt9OworCQlmb3JlYWNoIChxdy9icmFuY2hlcyB0YWdzLykgeworCQkJcmVzb2x2ZV9sb2NhbF9nbG9icygkdSwgJGZldGNoLAorCQkJICAgICAgICAgICAgICAgICAgICAkcmVtb3Rlcy0+eyRyZXBvX2lkfS0+eyRffSk7CisJCX0KKwkJbXkgJHAgPSAkcGF0aDsKKwkJbXkgJHJ3ciA9IHJld3JpdGVfcm9vdCh7cmVwb19pZCA9PiAkcmVwb19pZH0pOworCQl1bmxlc3MgKGRlZmluZWQgJHApIHsKKwkJCSRwID0gJGZ1bGxfdXJsOworCQkJbXkgJHogPSAkdTsKKwkJCWlmICgkcndyKSB7CisJCQkJJHogPSAkcndyOworCQkJfQorCQkJJHAgPX4gcyNeXFEkelxFKD86L3wkKSMjIG9yIG5leHQ7CisJCX0KKwkJZm9yZWFjaCBteSAkZiAoa2V5cyAlJGZldGNoKSB7CisJCQluZXh0IGlmICRmIG5lICRwOworCQkJcmV0dXJuIEdpdDo6U1ZOLT5uZXcoJGZldGNoLT57JGZ9LCAkcmVwb19pZCwgJGYpOworCQl9CisJfQorCXVuZGVmOworfQorCitzdWIgaW5pdCB7CisJbXkgKCRjbGFzcywgJHVybCwgJHBhdGgsICRyZXBvX2lkLCAkcmVmX2lkLCAkbm9fd3JpdGUpID0gQF87CisJbXkgJHNlbGYgPSBfbmV3KCRjbGFzcywgJHJlcG9faWQsICRyZWZfaWQsICRwYXRoKTsKKwlpZiAoZGVmaW5lZCAkdXJsKSB7CisJCSRzZWxmLT5pbml0X3JlbW90ZV9jb25maWcoJHVybCwgJG5vX3dyaXRlKTsKKwl9CisJJHNlbGY7Cit9CisKK3N1YiBmaW5kX3JlZiB7CisJbXkgKCRyZWZfaWQpID0gQF87CisJZm9yZWFjaCAoY29tbWFuZChxdy9jb25maWcgLWwvKSkgeworCQluZXh0IHVubGVzcyBtIV5zdm4tcmVtb3RlXC4oLispXC5mZXRjaD0KKwkJICAgICAgICAgICAgICBccyooLiopXHMqOlxzKnJlZnMvcmVtb3Rlcy8oLispXHMqJCF4OworCQlteSAoJHJlcG9faWQsICRwYXRoLCAkcmVmKSA9ICgkMSwgJDIsICQzKTsKKwkJaWYgKCRyZWYgZXEgJHJlZl9pZCkgeworCQkJJHBhdGggPSAnJyBpZiAoJHBhdGggPX4gbSNeXC4vPyMpOworCQkJcmV0dXJuICgkcmVwb19pZCwgJHBhdGgpOworCQl9CisJfQorCSh1bmRlZiwgdW5kZWYsIHVuZGVmKTsKK30KKworc3ViIG5ldyB7CisJbXkgKCRjbGFzcywgJHJlZl9pZCwgJHJlcG9faWQsICRwYXRoKSA9IEBfOworCWlmIChkZWZpbmVkICRyZWZfaWQgJiYgIWRlZmluZWQgJHJlcG9faWQgJiYgIWRlZmluZWQgJHBhdGgpIHsKKwkJKCRyZXBvX2lkLCAkcGF0aCkgPSBmaW5kX3JlZigkcmVmX2lkKTsKKwkJaWYgKCFkZWZpbmVkICRyZXBvX2lkKSB7CisJCQlkaWUgIkNvdWxkIG5vdCBmaW5kIGEgXCJzdm4tcmVtb3RlLiouZmV0Y2hcIiBrZXkgIiwKKwkJCSAgICAiaW4gdGhlIHJlcG9zaXRvcnkgY29uZmlndXJhdGlvbiBtYXRjaGluZzogIiwKKwkJCSAgICAicmVmcy9yZW1vdGVzLyRyZWZfaWRcbiI7CisJCX0KKwl9CisJbXkgJHNlbGYgPSBfbmV3KCRjbGFzcywgJHJlcG9faWQsICRyZWZfaWQsICRwYXRoKTsKKwlpZiAoIWRlZmluZWQgJHNlbGYtPntwYXRofSB8fCAhbGVuZ3RoICRzZWxmLT57cGF0aH0pIHsKKwkJbXkgJGZldGNoID0gY29tbWFuZF9vbmVsaW5lKCdjb25maWcnLCAnLS1nZXQnLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN2bi1yZW1vdGUuJHJlcG9faWQuZmV0Y2giLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjpyZWZzL3JlbW90ZXMvJHJlZl9pZFwkIikgb3IKKwkJICAgICBkaWUgIkZhaWxlZCB0byByZWFkIFwic3ZuLXJlbW90ZS4kcmVwb19pZC5mZXRjaFwiICIsCisJCSAgICAgICAgICJcIjpyZWZzL3JlbW90ZXMvJHJlZl9pZFwkXCIgaW4gY29uZmlnXG4iOworCQkoJHNlbGYtPntwYXRofSwgdW5kZWYpID0gc3BsaXQoL1xzKjpccyovLCAkZmV0Y2gpOworCX0KKwkkc2VsZi0+e3VybH0gPSBjb21tYW5kX29uZWxpbmUoJ2NvbmZpZycsICctLWdldCcsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdm4tcmVtb3RlLiRyZXBvX2lkLnVybCIpIG9yCisgICAgICAgICAgICAgICAgICBkaWUgIkZhaWxlZCB0byByZWFkIFwic3ZuLXJlbW90ZS4kcmVwb19pZC51cmxcIiBpbiBjb25maWdcbiI7CisJJHNlbGYtPnJlYnVpbGQ7CisJJHNlbGY7Cit9CisKK3N1YiByZWZuYW1lIHsKKwlteSAoJHJlZm5hbWUpID0gInJlZnMvcmVtb3Rlcy8kX1swXS0+e3JlZl9pZH0iIDsKKworCSMgSXQgY2Fubm90IGVuZCB3aXRoIGEgc2xhc2ggLywgd2UnbGwgdGhyb3cgdXAgb24gdGhpcyBiZWNhdXNlCisJIyBTVk4gY2FuJ3QgaGF2ZSBkaXJlY3RvcmllcyB3aXRoIGEgc2xhc2ggaW4gdGhlaXIgbmFtZSwgZWl0aGVyOgorCWlmICgkcmVmbmFtZSA9fiBtey8kfSkgeworCQlkaWUgInJlZjogJyRyZWZuYW1lJyBlbmRzIHdpdGggYSB0cmFpbGluZyBzbGFzaCwgdGhpcyBpcyAiLAorCQkgICAgIm5vdCBwZXJtaXR0ZWQgYnkgZ2l0IG5vciBTdWJ2ZXJzaW9uXG4iOworCX0KKworCSMgSXQgY2Fubm90IGhhdmUgQVNDSUkgY29udHJvbCBjaGFyYWN0ZXIgc3BhY2UsIHRpbGRlIH4sIGNhcmV0IF4sCisJIyBjb2xvbiA6LCBxdWVzdGlvbi1tYXJrID8sIGFzdGVyaXNrICosIHNwYWNlLCBvciBvcGVuIGJyYWNrZXQgWworCSMgYW55d2hlcmUuCisJIworCSMgQWRkaXRpb25hbGx5LCAlIG11c3QgYmUgZXNjYXBlZCBiZWNhdXNlIGl0IGlzIHVzZWQgZm9yIGVzY2FwaW5nCisJIyBhbmQgd2Ugd2FudCBvdXIgZXNjYXBlZCByZWZuYW1lIHRvIGJlIHJldmVyc2libGUKKwkkcmVmbmFtZSA9fiBzeyhbIFwlflxeOlw/XCpcW1x0XSl9e3VjIHNwcmludGYoJyUlJTAyeCcsb3JkKCQxKSl9ZWc7CisKKwkjIG5vIHNsYXNoLXNlcGFyYXRlZCBjb21wb25lbnQgY2FuIGJlZ2luIHdpdGggYSBkb3QgLgorCSMgLy4qIGJlY29tZXMgLyUyRSoKKwkkcmVmbmFtZSA9fiBzey9cLn17LyUyRX1nOworCisJIyBJdCBjYW5ub3QgaGF2ZSB0d28gY29uc2VjdXRpdmUgZG90cyAuLiBhbnl3aGVyZQorCSMgLi4gYmVjb21lcyAlMkUlMkUKKwkkcmVmbmFtZSA9fiBze1wuXC59eyUyRSUyRX1nOworCisJcmV0dXJuICRyZWZuYW1lOworfQorCitzdWIgZGVzYW5pdGl6ZV9yZWZuYW1lIHsKKwlteSAoJHJlZm5hbWUpID0gQF87CisJJHJlZm5hbWUgPX4gc3slKD86KFswLTlBLUZdezJ9KSl9e2NociBoZXgoJDEpfWVnOworCXJldHVybiAkcmVmbmFtZTsKK30KKworc3ViIHN2bV91dWlkIHsKKwlteSAoJHNlbGYpID0gQF87CisJcmV0dXJuICRzZWxmLT57c3ZtfS0+e3V1aWR9IGlmICRzZWxmLT5zdm07CisJJHNlbGYtPnJhOworCXVubGVzcyAoJHNlbGYtPntzdm19KSB7CisJCWRpZSAiU1ZNIFVVSUQgbm90IGNhY2hlZCwgYW5kIHJlYWRpbmcgcmVtb3RlbHkgZmFpbGVkXG4iOworCX0KKwkkc2VsZi0+e3N2bX0tPnt1dWlkfTsKK30KKworc3ViIHN2bSB7CisJbXkgKCRzZWxmKSA9IEBfOworCXJldHVybiAkc2VsZi0+e3N2bX0gaWYgJHNlbGYtPntzdm19OworCW15ICRzdm07CisJIyBzZWUgaWYgd2UgaGF2ZSBpdCBpbiBvdXIgY29uZmlnLCBmaXJzdDoKKwlldmFsIHsKKwkJbXkgJHNlY3Rpb24gPSAic3ZuLXJlbW90ZS4kc2VsZi0+e3JlcG9faWR9IjsKKwkJJHN2bSA9IHsKKwkJICBzb3VyY2UgPT4gdG1wX2NvbmZpZygnLS1nZXQnLCAiJHNlY3Rpb24uc3ZtLXNvdXJjZSIpLAorCQkgIHV1aWQgPT4gdG1wX2NvbmZpZygnLS1nZXQnLCAiJHNlY3Rpb24uc3ZtLXV1aWQiKSwKKwkJICByZXBsYWNlID0+IHRtcF9jb25maWcoJy0tZ2V0JywgIiRzZWN0aW9uLnN2bS1yZXBsYWNlIiksCisJCX0KKwl9OworCWlmICgkc3ZtICYmICRzdm0tPntzb3VyY2V9ICYmICRzdm0tPnt1dWlkfSAmJiAkc3ZtLT57cmVwbGFjZX0pIHsKKwkJJHNlbGYtPntzdm19ID0gJHN2bTsKKwl9CisJJHNlbGYtPntzdm19OworfQorCitzdWIgX3NldF9zdm1fdmFycyB7CisJbXkgKCRzZWxmLCAkcmEpID0gQF87CisJcmV0dXJuICRyYSBpZiAkc2VsZi0+c3ZtOworCisJbXkgQGVyciA9ICggInVzZVN2bVByb3BzIHNldCwgYnV0IGZhaWxlZCB0byByZWFkIFNWTSBwcm9wZXJ0aWVzXG4iLAorCQkgICAgIihzdm06c291cmNlLCBzdm06dXVpZCkgIiwKKwkJICAgICJmcm9tIHRoZSBmb2xsb3dpbmcgVVJMczpcbiIgKTsKKwlzdWIgcmVhZF9zdm1fcHJvcHMgeworCQlteSAoJHNlbGYsICRyYSwgJHBhdGgsICRyKSA9IEBfOworCQlteSAkcHJvcHMgPSAoJHJhLT5nZXRfZGlyKCRwYXRoLCAkcikpWzJdOworCQlteSAkc3JjID0gJHByb3BzLT57J3N2bTpzb3VyY2UnfTsKKwkJbXkgJHV1aWQgPSAkcHJvcHMtPnsnc3ZtOnV1aWQnfTsKKwkJcmV0dXJuIHVuZGVmIGlmICghJHNyYyB8fCAhJHV1aWQpOworCisJCWNob21wKCRzcmMsICR1dWlkKTsKKworCQkkdXVpZCA9fiBte15bMC05YS1mXC1dezMwLH0kfQorCQkgICAgb3IgZGllICJkb2Vzbid0IGxvb2sgcmlnaHQgLSBzdm06dXVpZCBpcyAnJHV1aWQnXG4iOworCisJCSMgdGhlICchJyBpcyB1c2VkIHRvIG1hcmsgdGhlIHJlcG9zX3Jvb3QhL3JlbGF0aXZlL3BhdGgKKwkJJHNyYyA9fiBzey8/IS8/fXsvfTsKKwkJJHNyYyA9fiBzey8rJH17fTsgIyBubyB0cmFpbGluZyBzbGFzaGVzIHBsZWFzZQorCQkjIHVzZXJuYW1lIGlzIG9mIG5vIGludGVyZXN0CisJCSRzcmMgPX4gc3soXlthLXpcK10qOi8vKVteL0BdKkB9eyQxfTsKKworCQlteSAkcmVwbGFjZSA9ICRyYS0+e3VybH07CisJCSRyZXBsYWNlIC49ICIvJHBhdGgiIGlmIGxlbmd0aCAkcGF0aDsKKworCQlteSAkc2VjdGlvbiA9ICJzdm4tcmVtb3RlLiRzZWxmLT57cmVwb19pZH0iOworCQl0bXBfY29uZmlnKCIkc2VjdGlvbi5zdm0tc291cmNlIiwgJHNyYyk7CisJCXRtcF9jb25maWcoIiRzZWN0aW9uLnN2bS1yZXBsYWNlIiwgJHJlcGxhY2UpOworCQl0bXBfY29uZmlnKCIkc2VjdGlvbi5zdm0tdXVpZCIsICR1dWlkKTsKKwkJJHNlbGYtPntzdm19ID0geworCQkJc291cmNlID0+ICRzcmMsCisJCQl1dWlkID0+ICR1dWlkLAorCQkJcmVwbGFjZSA9PiAkcmVwbGFjZQorCQl9OworCX0KKworCW15ICRyID0gJHJhLT5nZXRfbGF0ZXN0X3Jldm51bTsKKwlteSAkcGF0aCA9ICRzZWxmLT57cGF0aH07CisJbXkgJXRyaWVkOworCXdoaWxlIChsZW5ndGggJHBhdGgpIHsKKwkJdW5sZXNzICgkdHJpZWR7IiRzZWxmLT57dXJsfS8kcGF0aCJ9KSB7CisJCQlyZXR1cm4gJHJhIGlmICRzZWxmLT5yZWFkX3N2bV9wcm9wcygkcmEsICRwYXRoLCAkcik7CisJCQkkdHJpZWR7IiRzZWxmLT57dXJsfS8kcGF0aCJ9ID0gMTsKKwkJfQorCQkkcGF0aCA9fiBzIy8/W14vXSskIyM7CisJfQorCWRpZSAiUGF0aDogJyRwYXRoJyBzaG91bGQgYmUgJydcbiIgaWYgJHBhdGggbmUgJyc7CisJcmV0dXJuICRyYSBpZiAkc2VsZi0+cmVhZF9zdm1fcHJvcHMoJHJhLCAkcGF0aCwgJHIpOworCSR0cmllZHsiJHNlbGYtPnt1cmx9LyRwYXRoIn0gPSAxOworCisJaWYgKCRyYS0+e3JlcG9zX3Jvb3R9IGVxICRzZWxmLT57dXJsfSkgeworCQlkaWUgQGVyciwgKG1hcCB7ICIgICRfXG4iIH0ga2V5cyAldHJpZWQpLCAiXG4iOworCX0KKworCSMgbm9wZSwgbWFrZSBzdXJlIHdlJ3JlIGNvbm5lY3RlZCB0byB0aGUgcmVwb3NpdG9yeSByb290OgorCW15ICRvazsKKwlteSBAdHJpZWRfYjsKKwkkcGF0aCA9ICRyYS0+e3N2bl9wYXRofTsKKwkkcmEgPSBHaXQ6OlNWTjo6UmEtPm5ldygkcmEtPntyZXBvc19yb290fSk7CisJd2hpbGUgKGxlbmd0aCAkcGF0aCkgeworCQl1bmxlc3MgKCR0cmllZHsiJHJhLT57dXJsfS8kcGF0aCJ9KSB7CisJCQkkb2sgPSAkc2VsZi0+cmVhZF9zdm1fcHJvcHMoJHJhLCAkcGF0aCwgJHIpOworCQkJbGFzdCBpZiAkb2s7CisJCQkkdHJpZWR7IiRyYS0+e3VybH0vJHBhdGgifSA9IDE7CisJCX0KKwkJJHBhdGggPX4gcyMvP1teL10rJCMjOworCX0KKwlkaWUgIlBhdGg6ICckcGF0aCcgc2hvdWxkIGJlICcnXG4iIGlmICRwYXRoIG5lICcnOworCSRvayB8fD0gJHNlbGYtPnJlYWRfc3ZtX3Byb3BzKCRyYSwgJHBhdGgsICRyKTsKKwkkdHJpZWR7IiRyYS0+e3VybH0vJHBhdGgifSA9IDE7CisJaWYgKCEkb2spIHsKKwkJZGllIEBlcnIsIChtYXAgeyAiICAkX1xuIiB9IGtleXMgJXRyaWVkKSwgIlxuIjsKKwl9CisJR2l0OjpTVk46OlJhLT5uZXcoJHNlbGYtPnt1cmx9KTsKK30KKworc3ViIHN2bnN5bmMgeworCW15ICgkc2VsZikgPSBAXzsKKwlyZXR1cm4gJHNlbGYtPntzdm5zeW5jfSBpZiAkc2VsZi0+e3N2bnN5bmN9OworCisJaWYgKCRzZWxmLT5ub19tZXRhZGF0YSkgeworCQlkaWUgIkNhbid0IGhhdmUgYm90aCAnbm9NZXRhZGF0YScgYW5kICIsCisJCSAgICAiJ3VzZVN2bnN5bmNQcm9wcycgb3B0aW9ucyBzZXQhXG4iOworCX0KKwlpZiAoJHNlbGYtPnJld3JpdGVfcm9vdCkgeworCQlkaWUgIkNhbid0IGhhdmUgYm90aCAndXNlU3Zuc3luY1Byb3BzJyBhbmQgJ3Jld3JpdGVSb290JyAiLAorCQkgICAgIm9wdGlvbnMgc2V0IVxuIjsKKwl9CisKKwlteSAkc3Zuc3luYzsKKwkjIHNlZSBpZiB3ZSBoYXZlIGl0IGluIG91ciBjb25maWcsIGZpcnN0OgorCWV2YWwgeworCQlteSAkc2VjdGlvbiA9ICJzdm4tcmVtb3RlLiRzZWxmLT57cmVwb19pZH0iOworCisJCW15ICR1cmwgPSB0bXBfY29uZmlnKCctLWdldCcsICIkc2VjdGlvbi5zdm5zeW5jLXVybCIpOworCQkoJHVybCkgPSAoJHVybCA9fiBte14oW2EtelwrXSs6Ly9cUyspJH0pIG9yCisJCSAgIGRpZSAiZG9lc24ndCBsb29rIHJpZ2h0IC0gc3ZuOnN5bmMtZnJvbS11cmwgaXMgJyR1cmwnXG4iOworCisJCW15ICR1dWlkID0gdG1wX2NvbmZpZygnLS1nZXQnLCAiJHNlY3Rpb24uc3Zuc3luYy11dWlkIik7CisJCSgkdXVpZCkgPSAoJHV1aWQgPX4gbXteKFswLTlhLWZcLV17MzAsfSkkfSkgb3IKKwkJICAgZGllICJkb2Vzbid0IGxvb2sgcmlnaHQgLSBzdm46c3luYy1mcm9tLXV1aWQgaXMgJyR1dWlkJ1xuIjsKKworCQkkc3Zuc3luYyA9IHsgdXJsID0+ICR1cmwsIHV1aWQgPT4gJHV1aWQgfQorCX07CisJaWYgKCRzdm5zeW5jICYmICRzdm5zeW5jLT57dXJsfSAmJiAkc3Zuc3luYy0+e3V1aWR9KSB7CisJCXJldHVybiAkc2VsZi0+e3N2bnN5bmN9ID0gJHN2bnN5bmM7CisJfQorCisJbXkgJGVyciA9ICJ1c2VTdm5zeW5jUHJvcHMgc2V0LCBidXQgZmFpbGVkIHRvIHJlYWQgIiAuCisJICAgICAgICAgICJzdm5zeW5jIHByb3BlcnR5OiBzdm46c3luYy1mcm9tLSI7CisJbXkgJHJwID0gJHNlbGYtPnJhLT5yZXZfcHJvcGxpc3QoMCk7CisKKwlteSAkdXJsID0gJHJwLT57J3N2bjpzeW5jLWZyb20tdXJsJ30gb3IgZGllICRlcnIgLiAidXJsXG4iOworCSgkdXJsKSA9ICgkdXJsID1+IG17XihbYS16XCtdKzovL1xTKykkfSkgb3IKKwkgICAgICAgICAgIGRpZSAiZG9lc24ndCBsb29rIHJpZ2h0IC0gc3ZuOnN5bmMtZnJvbS11cmwgaXMgJyR1cmwnXG4iOworCisJbXkgJHV1aWQgPSAkcnAtPnsnc3ZuOnN5bmMtZnJvbS11dWlkJ30gb3IgZGllICRlcnIgLiAidXVpZFxuIjsKKwkoJHV1aWQpID0gKCR1dWlkID1+IG17XihbMC05YS1mXC1dezMwLH0pJH0pIG9yCisJICAgICAgICAgICBkaWUgImRvZXNuJ3QgbG9vayByaWdodCAtIHN2bjpzeW5jLWZyb20tdXVpZCBpcyAnJHV1aWQnXG4iOworCisJbXkgJHNlY3Rpb24gPSAic3ZuLXJlbW90ZS4kc2VsZi0+e3JlcG9faWR9IjsKKwl0bXBfY29uZmlnKCctLWFkZCcsICIkc2VjdGlvbi5zdm5zeW5jLXV1aWQiLCAkdXVpZCk7CisJdG1wX2NvbmZpZygnLS1hZGQnLCAiJHNlY3Rpb24uc3Zuc3luYy11cmwiLCAkdXJsKTsKKwlyZXR1cm4gJHNlbGYtPntzdm5zeW5jfSA9IHsgdXJsID0+ICR1cmwsIHV1aWQgPT4gJHV1aWQgfTsKK30KKworIyB0aGlzIGFsbG93cyB1cyB0byBtZW1vaXplIG91ciBTVk46OlJhIFVVSUQgbG9jYWxseSBhbmQgYXZvaWQgYQorIyByZW1vdGUgbG9va3VwICh1c2VmdWwgZm9yICdnaXQgc3ZuIGxvZycpLgorc3ViIHJhX3V1aWQgeworCW15ICgkc2VsZikgPSBAXzsKKwl1bmxlc3MgKCRzZWxmLT57cmFfdXVpZH0pIHsKKwkJbXkgJGtleSA9ICJzdm4tcmVtb3RlLiRzZWxmLT57cmVwb19pZH0udXVpZCI7CisJCW15ICR1dWlkID0gZXZhbCB7IHRtcF9jb25maWcoJy0tZ2V0JywgJGtleSkgfTsKKwkJaWYgKCEkQCAmJiAkdXVpZCAmJiAkdXVpZCA9fiAvXihbYS1mXGRcLV17MzAsfSkkLykgeworCQkJJHNlbGYtPntyYV91dWlkfSA9ICR1dWlkOworCQl9IGVsc2UgeworCQkJZGllICJyYV91dWlkIGNhbGxlZCB3aXRob3V0IFVSTFxuIiB1bmxlc3MgJHNlbGYtPnt1cmx9OworCQkJJHNlbGYtPntyYV91dWlkfSA9ICRzZWxmLT5yYS0+Z2V0X3V1aWQ7CisJCQl0bXBfY29uZmlnKCctLWFkZCcsICRrZXksICRzZWxmLT57cmFfdXVpZH0pOworCQl9CisJfQorCSRzZWxmLT57cmFfdXVpZH07Cit9CisKK3N1YiBfc2V0X3JlcG9zX3Jvb3QgeworCW15ICgkc2VsZiwgJHJlcG9zX3Jvb3QpID0gQF87CisJbXkgJGsgPSAic3ZuLXJlbW90ZS4kc2VsZi0+e3JlcG9faWR9LnJlcG9zUm9vdCI7CisJJHJlcG9zX3Jvb3QgfHw9ICRzZWxmLT5yYS0+e3JlcG9zX3Jvb3R9OworCXRtcF9jb25maWcoJGssICRyZXBvc19yb290KTsKKwkkcmVwb3Nfcm9vdDsKK30KKworc3ViIHJlcG9zX3Jvb3QgeworCW15ICgkc2VsZikgPSBAXzsKKwlteSAkayA9ICJzdm4tcmVtb3RlLiRzZWxmLT57cmVwb19pZH0ucmVwb3NSb290IjsKKwlldmFsIHsgdG1wX2NvbmZpZygnLS1nZXQnLCAkaykgfSB8fCAkc2VsZi0+X3NldF9yZXBvc19yb290OworfQorCitzdWIgcmEgeworCW15ICgkc2VsZikgPSBzaGlmdDsKKwlteSAkcmEgPSBHaXQ6OlNWTjo6UmEtPm5ldygkc2VsZi0+e3VybH0pOworCSRzZWxmLT5fc2V0X3JlcG9zX3Jvb3QoJHJhLT57cmVwb3Nfcm9vdH0pOworCWlmICgkc2VsZi0+dXNlX3N2bV9wcm9wcyAmJiAhJHNlbGYtPntzdm19KSB7CisJCWlmICgkc2VsZi0+bm9fbWV0YWRhdGEpIHsKKwkJCWRpZSAiQ2FuJ3QgaGF2ZSBib3RoICdub01ldGFkYXRhJyBhbmQgIiwKKwkJCSAgICAiJ3VzZVN2bVByb3BzJyBvcHRpb25zIHNldCFcbiI7CisJCX0gZWxzaWYgKCRzZWxmLT51c2Vfc3Zuc3luY19wcm9wcykgeworCQkJZGllICJDYW4ndCBoYXZlIGJvdGggJ3VzZVN2bnN5bmNQcm9wcycgYW5kICIsCisJCQkgICAgIid1c2VTdm1Qcm9wcycgb3B0aW9ucyBzZXQhXG4iOworCQl9CisJCSRyYSA9ICRzZWxmLT5fc2V0X3N2bV92YXJzKCRyYSk7CisJCSRzZWxmLT57LXdhbnRfcmV2cHJvcHN9ID0gMTsKKwl9CisJJHJhOworfQorCitzdWIgcmVsX3BhdGggeworCW15ICgkc2VsZikgPSBAXzsKKwlteSAkcmVwb3Nfcm9vdCA9ICRzZWxmLT5yYS0+e3JlcG9zX3Jvb3R9OworCXJldHVybiAkc2VsZi0+e3BhdGh9IGlmICgkc2VsZi0+e3VybH0gZXEgJHJlcG9zX3Jvb3QpOworCW15ICR1cmwgPSAkc2VsZi0+e3VybH0gLgorCSAgICAgICAgICAobGVuZ3RoICRzZWxmLT57cGF0aH0gPyAiLyRzZWxmLT57cGF0aH0iIDogJHNlbGYtPntwYXRofSk7CisJJHVybCA9fiBzIV5cUSRyZXBvc19yb290XEUoPzovK3wkKSEhZzsKKwkkdXJsOworfQorCisjIHByb3Bfd2FsayhQQVRILCBSRVYsIFNVQikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSZWN1cnNpdmVseSB0cmF2ZXJzZSBQQVRIIGF0IHJldmlzaW9uIFJFViBhbmQgaW52b2tlIFNVQiBmb3IgZWFjaAorIyBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBhIFNWTiBwcm9wZXJ0eS4gIFNVQiB3aWxsIGJlIGludm9rZWQgYXMKKyMgZm9sbG93czogICZTVUIoZ3MsIHBhdGgsIHByb3BzKTsgIHdoZXJlIGBncycgaXMgdGhpcyBpbnN0YW5jZSBvZgorIyBHaXQ6OlNWTiwgYHBhdGgnIHRoZSBwYXRoIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHByb3BlcnRpZXMKKyMgYHByb3BzJyB3ZXJlIGZvdW5kLiAgVGhlIGBwYXRoJyB3aWxsIGJlIHJlbGF0aXZlIHRvIHBvaW50IG9mIGNoZWNrb3V0LAorIyB0aGF0IGlzLCBpZiB1cmw6Ly9yZXBvL3RydW5rIGlzIHRoZSBjdXJyZW50IEdpdCBicmFuY2gsIGFuZCB0aGF0CisjIGRpcmVjdG9yeSBjb250YWlucyBhIHN1Yi1kaXJlY3RvcnkgYGQnLCBTVUIgd2lsbCBiZSBpbnZva2VkIHdpdGggYC9kLycKKyMgYXMgYHBhdGgnIChub3RlIHRoZSB0cmFpbGluZyBgLycpLgorc3ViIHByb3Bfd2FsayB7CisJbXkgKCRzZWxmLCAkcGF0aCwgJHJldiwgJHN1YikgPSBAXzsKKworCSRwYXRoID1+IHMjXi8jIzsKKwlteSAoJGRpcmVudCwgdW5kZWYsICRwcm9wcykgPSAkc2VsZi0+cmEtPmdldF9kaXIoJHBhdGgsICRyZXYpOworCSRwYXRoID1+IHMjXi8qIy8jZzsKKwlteSAkcCA9ICRwYXRoOworCSMgU3RyaXAgdGhlIGlycmVsZXZhbnQgcGFydCBvZiB0aGUgcGF0aC4KKwkkcCA9fiBzI14vK1xRJHNlbGYtPntwYXRofVxFKC98JCkjLyM7CisJIyBFbnN1cmUgdGhlIHBhdGggaXMgdGVybWluYXRlZCBieSBhIGAvJy4KKwkkcCA9fiBzIy8qJCMvIzsKKworCSMgVGhlIHByb3BlcnRpZXMgY29udGFpbiBhbGwgdGhlIGludGVybmFsIFNWTiBzdHVmZiBub2JvZHkKKwkjICh1c3VhbGx5KSBjYXJlcyBhYm91dC4KKwlteSAkaW50ZXJlc3RpbmdfcHJvcHMgPSAwOworCWZvcmVhY2ggKGtleXMgJXskcHJvcHN9KSB7CisJCSMgSWYgaXQgZG9lc24ndCBzdGFydCB3aXRoIGBzdm46JywgaXQgbXVzdCBiZSBhCisJCSMgdXNlci1kZWZpbmVkIHByb3BlcnR5LgorCQkrKyRpbnRlcmVzdGluZ19wcm9wcyBhbmQgbmV4dCBpZiAkXyAhfiAvXnN2bjovOworCQkjIEZJWE1FOiBGcmFnaWxlLCBpZiBTVk4gYWRkcyBuZXcgcHVibGljIHByb3BlcnRpZXMsCisJCSMgdGhpcyBuZWVkcyB0byBiZSB1cGRhdGVkLgorCQkrKyRpbnRlcmVzdGluZ19wcm9wcyBpZiAvXnN2bjooPzppZ25vcmV8a2V5d29yZHN8ZXhlY3V0YWJsZQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ZW9sLXN0eWxlfG1pbWUtdHlwZQorCQkJCQkJIHxleHRlcm5hbHN8bmVlZHMtbG9jaykkL3g7CisJfQorCSYkc3ViKCRzZWxmLCAkcCwgJHByb3BzKSBpZiAkaW50ZXJlc3RpbmdfcHJvcHM7CisKKwlmb3JlYWNoIChzb3J0IGtleXMgJSRkaXJlbnQpIHsKKwkJbmV4dCBpZiAkZGlyZW50LT57JF99LT57a2luZH0gIT0gJFNWTjo6Tm9kZTo6ZGlyOworCQkkc2VsZi0+cHJvcF93YWxrKCRwIC4gJF8sICRyZXYsICRzdWIpOworCX0KK30KKworc3ViIGxhc3RfcmV2IHsgKCRfWzBdLT5sYXN0X3Jldl9jb21taXQpWzBdIH0KK3N1YiBsYXN0X2NvbW1pdCB7ICgkX1swXS0+bGFzdF9yZXZfY29tbWl0KVsxXSB9CisKKyMgcmV0dXJucyB0aGUgbmV3ZXN0IFNWTiByZXZpc2lvbiBudW1iZXIgYW5kIG5ld2VzdCBjb21taXQgU0hBMQorc3ViIGxhc3RfcmV2X2NvbW1pdCB7CisJbXkgKCRzZWxmKSA9IEBfOworCWlmIChkZWZpbmVkICRzZWxmLT57bGFzdF9yZXZ9ICYmIGRlZmluZWQgJHNlbGYtPntsYXN0X2NvbW1pdH0pIHsKKwkJcmV0dXJuICgkc2VsZi0+e2xhc3RfcmV2fSwgJHNlbGYtPntsYXN0X2NvbW1pdH0pOworCX0KKwlteSAkYyA9IDo6dmVyaWZ5X3JlZigkc2VsZi0+cmVmbmFtZS4nXjAnKTsKKwlpZiAoJGMgJiYgISRzZWxmLT51c2Vfc3ZtX3Byb3BzICYmICEkc2VsZi0+bm9fbWV0YWRhdGEpIHsKKwkJbXkgJHJldiA9ICg6OmNtdF9tZXRhZGF0YSgkYykpWzFdOworCQlpZiAoZGVmaW5lZCAkcmV2KSB7CisJCQkoJHNlbGYtPntsYXN0X3Jldn0sICRzZWxmLT57bGFzdF9jb21taXR9KSA9ICgkcmV2LCAkYyk7CisJCQlyZXR1cm4gKCRyZXYsICRjKTsKKwkJfQorCX0KKwlteSAkbWFwX3BhdGggPSAkc2VsZi0+bWFwX3BhdGg7CisJdW5sZXNzICgtZSAkbWFwX3BhdGgpIHsKKwkJKCRzZWxmLT57bGFzdF9yZXZ9LCAkc2VsZi0+e2xhc3RfY29tbWl0fSkgPSAodW5kZWYsIHVuZGVmKTsKKwkJcmV0dXJuICh1bmRlZiwgdW5kZWYpOworCX0KKwlteSAoJHJldiwgJGNvbW1pdCkgPSAkc2VsZi0+cmV2X21hcF9tYXgoMSk7CisJKCRzZWxmLT57bGFzdF9yZXZ9LCAkc2VsZi0+e2xhc3RfY29tbWl0fSkgPSAoJHJldiwgJGNvbW1pdCk7CisJcmV0dXJuICgkcmV2LCAkY29tbWl0KTsKK30KKworc3ViIGdldF9mZXRjaF9yYW5nZSB7CisJbXkgKCRzZWxmLCAkbWluLCAkbWF4KSA9IEBfOworCSRtYXggfHw9ICRzZWxmLT5yYS0+Z2V0X2xhdGVzdF9yZXZudW07CisJJG1pbiB8fD0gJHNlbGYtPnJldl9tYXBfbWF4OworCSgrKyRtaW4sICRtYXgpOworfQorCitzdWIgdG1wX2NvbmZpZyB7CisJbXkgKEBhcmdzKSA9IEBfOworCW15ICRvbGRfZGVmX2NvbmZpZyA9ICIkRU5We0dJVF9ESVJ9L3N2bi9jb25maWciOworCW15ICRjb25maWcgPSAiJEVOVntHSVRfRElSfS9zdm4vLm1ldGFkYXRhIjsKKwlpZiAoISAtZiAkY29uZmlnICYmIC1mICRvbGRfZGVmX2NvbmZpZykgeworCQlyZW5hbWUgJG9sZF9kZWZfY29uZmlnLCAkY29uZmlnIG9yCisJCSAgICAgICBkaWUgIkZhaWxlZCByZW5hbWUgJG9sZF9kZWZfY29uZmlnID0+ICRjb25maWc6ICQhXG4iOworCX0KKwlteSAkb2xkX2NvbmZpZyA9ICRFTlZ7R0lUX0NPTkZJR307CisJJEVOVntHSVRfQ09ORklHfSA9ICRjb25maWc7CisJJEAgPSB1bmRlZjsKKwlteSBAcmV0ID0gZXZhbCB7CisJCXVubGVzcyAoLWYgJGNvbmZpZykgeworCQkJbWtmaWxlKCRjb25maWcpOworCQkJb3BlbiBteSAkZmgsICc+JywgJGNvbmZpZyBvcgorCQkJICAgIGRpZSAiQ2FuJ3Qgb3BlbiAkY29uZmlnOiAkIVxuIjsKKwkJCXByaW50ICRmaCAiOyBUaGlzIGZpbGUgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5ICIsCisJCQkgICAgICAgICAgImdpdC1zdm5cbiIgb3IgZGllCisJCQkJICAiQ291bGRuJ3Qgd3JpdGUgdG8gJGNvbmZpZzogJCFcbiI7CisJCQlwcmludCAkZmggIjsgWW91IHNob3VsZCBub3QgaGF2ZSB0byBlZGl0IGl0XG4iIG9yCisJCQkgICAgICBkaWUgIkNvdWxkbid0IHdyaXRlIHRvICRjb25maWc6ICQhXG4iOworCQkJY2xvc2UgJGZoIG9yIGRpZSAiQ291bGRuJ3QgY2xvc2UgJGNvbmZpZzogJCFcbiI7CisJCX0KKwkJY29tbWFuZCgnY29uZmlnJywgQGFyZ3MpOworCX07CisJbXkgJGVyciA9ICRAOworCWlmIChkZWZpbmVkICRvbGRfY29uZmlnKSB7CisJCSRFTlZ7R0lUX0NPTkZJR30gPSAkb2xkX2NvbmZpZzsKKwl9IGVsc2UgeworCQlkZWxldGUgJEVOVntHSVRfQ09ORklHfTsKKwl9CisJZGllICRlcnIgaWYgJGVycjsKKwl3YW50YXJyYXkgPyBAcmV0IDogJHJldFswXTsKK30KKworc3ViIHRtcF9pbmRleF9kbyB7CisJbXkgKCRzZWxmLCAkc3ViKSA9IEBfOworCW15ICRvbGRfaW5kZXggPSAkRU5We0dJVF9JTkRFWF9GSUxFfTsKKwkkRU5We0dJVF9JTkRFWF9GSUxFfSA9ICRzZWxmLT57aW5kZXh9OworCSRAID0gdW5kZWY7CisJbXkgQHJldCA9IGV2YWwgeworCQlteSAoJGRpciwgJGJhc2UpID0gKCRzZWxmLT57aW5kZXh9ID1+IG0jXiguKj8pLz8oW14vXSspJCMpOworCQlta3BhdGgoWyRkaXJdKSB1bmxlc3MgLWQgJGRpcjsKKwkJJiRzdWI7CisJfTsKKwlteSAkZXJyID0gJEA7CisJaWYgKGRlZmluZWQgJG9sZF9pbmRleCkgeworCQkkRU5We0dJVF9JTkRFWF9GSUxFfSA9ICRvbGRfaW5kZXg7CisJfSBlbHNlIHsKKwkJZGVsZXRlICRFTlZ7R0lUX0lOREVYX0ZJTEV9OworCX0KKwlkaWUgJGVyciBpZiAkZXJyOworCXdhbnRhcnJheSA/IEByZXQgOiAkcmV0WzBdOworfQorCitzdWIgYXNzZXJ0X2luZGV4X2NsZWFuIHsKKwlteSAoJHNlbGYsICR0cmVlaXNoKSA9IEBfOworCisJJHNlbGYtPnRtcF9pbmRleF9kbyhzdWIgeworCQljb21tYW5kX25vaXN5KCdyZWFkLXRyZWUnLCAkdHJlZWlzaCkgdW5sZXNzIC1lICRzZWxmLT57aW5kZXh9OworCQlteSAkeCA9IGNvbW1hbmRfb25lbGluZSgnd3JpdGUtdHJlZScpOworCQlteSAoJHkpID0gKGNvbW1hbmQocXcvY2F0LWZpbGUgY29tbWl0LywgJHRyZWVpc2gpID1+CisJCSAgICAgICAgICAgL150cmVlICgkOjpzaGExKS9tbyk7CisJCXJldHVybiBpZiAkeSBlcSAkeDsKKworCQl3YXJuICJJbmRleCBtaXNtYXRjaDogJHkgIT0gJHhcbnJlcmVhZGluZyAkdHJlZWlzaFxuIjsKKwkJdW5saW5rICRzZWxmLT57aW5kZXh9IG9yIGRpZSAidW5saW5rICRzZWxmLT57aW5kZXh9OiAkIVxuIjsKKwkJY29tbWFuZF9ub2lzeSgncmVhZC10cmVlJywgJHRyZWVpc2gpOworCQkkeCA9IGNvbW1hbmRfb25lbGluZSgnd3JpdGUtdHJlZScpOworCQlpZiAoJHkgbmUgJHgpIHsKKwkJCTo6ZmF0YWwgInRyZWVzICgkdHJlZWlzaCkgJHkgIT0gJHhcbiIsCisJCQkgICAgICAgICJTb21ldGhpbmcgaXMgc2VyaW91c2x5IHdyb25nLi4uIjsKKwkJfQorCX0pOworfQorCitzdWIgZ2V0X2NvbW1pdF9wYXJlbnRzIHsKKwlteSAoJHNlbGYsICRsb2dfZW50cnkpID0gQF87CisJbXkgKCVzZWVuLCBAcmV0LCBAdG1wKTsKKwkjIGxlZ2FjeSBzdXBwb3J0IGZvciAnc2V0LXRyZWUnOyB0aGlzIGlzIG9ubHkgdXNlZCBieSBzZXRfdHJlZV9jYjoKKwlpZiAobXkgJGlwID0gJHNlbGYtPntpbmplY3RfcGFyZW50c30pIHsKKwkJaWYgKG15ICRjb21taXQgPSBkZWxldGUgJGlwLT57JGxvZ19lbnRyeS0+e3JldmlzaW9ufX0pIHsKKwkJCXB1c2ggQHRtcCwgJGNvbW1pdDsKKwkJfQorCX0KKwlpZiAobXkgJGN1ciA9IDo6dmVyaWZ5X3JlZigkc2VsZi0+cmVmbmFtZS4nXjAnKSkgeworCQlwdXNoIEB0bXAsICRjdXI7CisJfQorCWlmIChteSAkaXBkID0gJHNlbGYtPntpbmplY3RfcGFyZW50c19kY29tbWl0fSkgeworCQlpZiAobXkgJGNvbW1pdCA9IGRlbGV0ZSAkaXBkLT57JGxvZ19lbnRyeS0+e3JldmlzaW9ufX0pIHsKKwkJCXB1c2ggQHRtcCwgQCRjb21taXQ7CisJCX0KKwl9CisJcHVzaCBAdG1wLCAkXyBmb3JlYWNoIChAeyRsb2dfZW50cnktPntwYXJlbnRzfX0sIEB0bXApOworCXdoaWxlIChteSAkcCA9IHNoaWZ0IEB0bXApIHsKKwkJbmV4dCBpZiAkc2VlbnskcH07CisJCSRzZWVueyRwfSA9IDE7CisJCXB1c2ggQHJldCwgJHA7CisJCSMgTUFYUEFSRU5UIGlzIGRlZmluZWQgdG8gMTYgaW4gY29tbWl0LXRyZWUuYzoKKwkJbGFzdCBpZiBAcmV0ID49IDE2OworCX0KKwlpZiAoQHRtcCkgeworCQlkaWUgInIkbG9nX2VudHJ5LT57cmV2aXNpb259OiBObyByb29tIGZvciBwYXJlbnRzOlxuXHQiLAorCQkgICAgam9pbigiXG5cdCIsIEB0bXApLCAiXG4iOworCX0KKwlAcmV0OworfQorCitzdWIgcmV3cml0ZV9yb290IHsKKwlteSAoJHNlbGYpID0gQF87CisJcmV0dXJuICRzZWxmLT57LXJld3JpdGVfcm9vdH0gaWYgZXhpc3RzICRzZWxmLT57LXJld3JpdGVfcm9vdH07CisJbXkgJGsgPSAic3ZuLXJlbW90ZS4kc2VsZi0+e3JlcG9faWR9LnJld3JpdGVSb290IjsKKwlteSAkcndyID0gZXZhbCB7IGNvbW1hbmRfb25lbGluZShxdy9jb25maWcgLS1nZXQvLCAkaykgfTsKKwlpZiAoJHJ3cikgeworCQkkcndyID1+IHMjLyskIyM7CisJCWlmICgkcndyICF+IG0jXlthLXpcK10rOi8vIykgeworCQkJZGllICIkcndyIGlzIG5vdCBhIHZhbGlkIFVSTCAoa2V5OiAkaylcbiI7CisJCX0KKwl9CisJJHNlbGYtPnstcmV3cml0ZV9yb290fSA9ICRyd3I7Cit9CisKK3N1YiBtZXRhZGF0YV91cmwgeworCW15ICgkc2VsZikgPSBAXzsKKwkoJHNlbGYtPnJld3JpdGVfcm9vdCB8fCAkc2VsZi0+e3VybH0pIC4KKwkgICAobGVuZ3RoICRzZWxmLT57cGF0aH0gPyAnLycgLiAkc2VsZi0+e3BhdGh9IDogJycpOworfQorCitzdWIgZnVsbF91cmwgeworCW15ICgkc2VsZikgPSBAXzsKKwkkc2VsZi0+e3VybH0gLiAobGVuZ3RoICRzZWxmLT57cGF0aH0gPyAnLycgLiAkc2VsZi0+e3BhdGh9IDogJycpOworfQorCisKK3N1YiBzZXRfY29tbWl0X2hlYWRlcl9lbnYgeworCW15ICgkbG9nX2VudHJ5KSA9IEBfOworCW15ICVlbnY7CisJZm9yZWFjaCBteSAkbmVkIChxdy9OQU1FIEVNQUlMIERBVEUvKSB7CisJCWZvcmVhY2ggbXkgJGFjIChxdy9BVVRIT1IgQ09NTUlUVEVSLykgeworCQkJJGVudnsiR0lUXyR7YWN9XyR7bmVkfSJ9ID0gJEVOVnsiR0lUXyR7YWN9XyR7bmVkfSJ9OworCQl9CisJfQorCisJJEVOVntHSVRfQVVUSE9SX05BTUV9ID0gJGxvZ19lbnRyeS0+e25hbWV9OworCSRFTlZ7R0lUX0FVVEhPUl9FTUFJTH0gPSAkbG9nX2VudHJ5LT57ZW1haWx9OworCSRFTlZ7R0lUX0FVVEhPUl9EQVRFfSA9ICRFTlZ7R0lUX0NPTU1JVFRFUl9EQVRFfSA9ICRsb2dfZW50cnktPntkYXRlfTsKKworCSRFTlZ7R0lUX0NPTU1JVFRFUl9OQU1FfSA9IChkZWZpbmVkICRsb2dfZW50cnktPntjb21taXRfbmFtZX0pCisJCQkJCQk/ICRsb2dfZW50cnktPntjb21taXRfbmFtZX0KKwkJCQkJCTogJGxvZ19lbnRyeS0+e25hbWV9OworCSRFTlZ7R0lUX0NPTU1JVFRFUl9FTUFJTH0gPSAoZGVmaW5lZCAkbG9nX2VudHJ5LT57Y29tbWl0X2VtYWlsfSkKKwkJCQkJCT8gJGxvZ19lbnRyeS0+e2NvbW1pdF9lbWFpbH0KKwkJCQkJCTogJGxvZ19lbnRyeS0+e2VtYWlsfTsKKwlcJWVudjsKK30KKworc3ViIHJlc3RvcmVfY29tbWl0X2hlYWRlcl9lbnYgeworCW15ICgkZW52KSA9IEBfOworCWZvcmVhY2ggbXkgJG5lZCAocXcvTkFNRSBFTUFJTCBEQVRFLykgeworCQlmb3JlYWNoIG15ICRhYyAocXcvQVVUSE9SIENPTU1JVFRFUi8pIHsKKwkJCW15ICRrID0gIkdJVF8ke2FjfV8ke25lZH0iOworCQkJaWYgKGRlZmluZWQgJGVudi0+eyRrfSkgeworCQkJCSRFTlZ7JGt9ID0gJGVudi0+eyRrfTsKKwkJCX0gZWxzZSB7CisJCQkJZGVsZXRlICRFTlZ7JGt9OworCQkJfQorCQl9CisJfQorfQorCitzdWIgZ2MgeworCWNvbW1hbmRfbm9pc3koJ2djJywgJy0tYXV0bycpOworfTsKKworc3ViIGRvX2dpdF9jb21taXQgeworCW15ICgkc2VsZiwgJGxvZ19lbnRyeSkgPSBAXzsKKwlteSAkbHIgPSAkc2VsZi0+bGFzdF9yZXY7CisJaWYgKGRlZmluZWQgJGxyICYmICRsciA+PSAkbG9nX2VudHJ5LT57cmV2aXNpb259KSB7CisJCWRpZSAiTGFzdCBmZXRjaGVkIHJldmlzaW9uIG9mICIsICRzZWxmLT5yZWZuYW1lLAorCQkgICAgIiB3YXMgciRsciwgYnV0IHdlIGFyZSBhYm91dCB0byBmZXRjaDogIiwKKwkJICAgICJyJGxvZ19lbnRyeS0+e3JldmlzaW9ufSFcbiI7CisJfQorCWlmIChteSAkYyA9ICRzZWxmLT5yZXZfbWFwX2dldCgkbG9nX2VudHJ5LT57cmV2aXNpb259KSkgeworCQljcm9hayAiJGxvZ19lbnRyeS0+e3JldmlzaW9ufSA9ICRjIGFscmVhZHkgZXhpc3RzISAiLAorCQkgICAgICAiV2h5IGFyZSB3ZSByZWZldGNoaW5nIGl0P1xuIjsKKwl9CisJbXkgJG9sZF9lbnYgPSBzZXRfY29tbWl0X2hlYWRlcl9lbnYoJGxvZ19lbnRyeSk7CisJbXkgJHRyZWUgPSAkbG9nX2VudHJ5LT57dHJlZX07CisJaWYgKCFkZWZpbmVkICR0cmVlKSB7CisJCSR0cmVlID0gJHNlbGYtPnRtcF9pbmRleF9kbyhzdWIgeworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZF9vbmVsaW5lKCd3cml0ZS10cmVlJykgfSk7CisJfQorCWRpZSAiVHJlZSBpcyBub3QgYSB2YWxpZCBzaGExOiAkdHJlZVxuIiBpZiAkdHJlZSAhfiAvXiQ6OnNoYTEkL287CisKKwlteSBAZXhlYyA9ICgnZ2l0LWNvbW1pdC10cmVlJywgJHRyZWUpOworCWZvcmVhY2ggKCRzZWxmLT5nZXRfY29tbWl0X3BhcmVudHMoJGxvZ19lbnRyeSkpIHsKKwkJcHVzaCBAZXhlYywgJy1wJywgJF87CisJfQorCWRlZmluZWQobXkgJHBpZCA9IG9wZW4zKG15ICRtc2dfZmgsIG15ICRvdXRfZmgsICc+JlNUREVSUicsIEBleGVjKSkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNyb2FrICQhOworCXByaW50ICRtc2dfZmggJGxvZ19lbnRyeS0+e2xvZ30gb3IgY3JvYWsgJCE7CisJcmVzdG9yZV9jb21taXRfaGVhZGVyX2Vudigkb2xkX2Vudik7CisJdW5sZXNzICgkc2VsZi0+bm9fbWV0YWRhdGEpIHsKKwkJcHJpbnQgJG1zZ19maCAiXG5naXQtc3ZuLWlkOiAkbG9nX2VudHJ5LT57bWV0YWRhdGF9XG4iCisJCSAgICAgICAgICAgICAgb3IgY3JvYWsgJCE7CisJfQorCSRtc2dfZmgtPmZsdXNoID09IDAgb3IgY3JvYWsgJCE7CisJY2xvc2UgJG1zZ19maCBvciBjcm9hayAkITsKKwljaG9tcChteSAkY29tbWl0ID0gZG8geyBsb2NhbCAkLzsgPCRvdXRfZmg+IH0pOworCWNsb3NlICRvdXRfZmggb3IgY3JvYWsgJCE7CisJd2FpdHBpZCAkcGlkLCAwOworCWNyb2FrICQ/IGlmICQ/OworCWlmICgkY29tbWl0ICF+IC9eJDo6c2hhMSQvbykgeworCQlkaWUgIkZhaWxlZCB0byBjb21taXQsIGludmFsaWQgc2hhMTogJGNvbW1pdFxuIjsKKwl9CisKKwkkc2VsZi0+cmV2X21hcF9zZXQoJGxvZ19lbnRyeS0+e3JldmlzaW9ufSwgJGNvbW1pdCwgMSk7CisKKwkkc2VsZi0+e2xhc3RfcmV2fSA9ICRsb2dfZW50cnktPntyZXZpc2lvbn07CisJJHNlbGYtPntsYXN0X2NvbW1pdH0gPSAkY29tbWl0OworCXByaW50ICJyJGxvZ19lbnRyeS0+e3JldmlzaW9ufSI7CisJaWYgKGRlZmluZWQgJGxvZ19lbnRyeS0+e3N2bV9yZXZpc2lvbn0pIHsKKwkJIHByaW50ICIgKFxAJGxvZ19lbnRyeS0+e3N2bV9yZXZpc2lvbn0pIjsKKwkJICRzZWxmLT5yZXZfbWFwX3NldCgkbG9nX2VudHJ5LT57c3ZtX3JldmlzaW9ufSwgJGNvbW1pdCwKKwkJICAgICAgICAgICAgICAgICAgIDAsICRzZWxmLT5zdm1fdXVpZCk7CisJfQorCXByaW50ICIgPSAkY29tbWl0ICgkc2VsZi0+e3JlZl9pZH0pXG4iOworCWlmICgtLSRfZ2NfbnIgPT0gMCkgeworCQkkX2djX25yID0gJF9nY19wZXJpb2Q7CisJCWdjKCk7CisJfQorCXJldHVybiAkY29tbWl0OworfQorCitzdWIgbWF0Y2hfcGF0aHMgeworCW15ICgkc2VsZiwgJHBhdGhzLCAkcikgPSBAXzsKKwlyZXR1cm4gMSBpZiAkc2VsZi0+e3BhdGh9IGVxICcnOworCWlmIChteSAkcGF0aCA9ICRwYXRocy0+eyIvJHNlbGYtPntwYXRofSJ9KSB7CisJCXJldHVybiAoJHBhdGgtPnthY3Rpb259IGVxICdEJykgPyAwIDogMTsKKwl9CisJJHNlbGYtPntwYXRoX3JlZ2V4fSB8fD0gcXIvXlwvXFEkc2VsZi0+e3BhdGh9XEVcLy87CisJaWYgKGdyZXAgLyRzZWxmLT57cGF0aF9yZWdleH0vLCBrZXlzICUkcGF0aHMpIHsKKwkJcmV0dXJuIDE7CisJfQorCW15ICRjID0gJyc7CisJZm9yZWFjaCAoc3BsaXQgbSMvIywgJHNlbGYtPntwYXRofSkgeworCQkkYyAuPSAiLyRfIjsKKwkJbmV4dCB1bmxlc3MgKCRwYXRocy0+eyRjfSAmJgorCQkgICAgICAgICAgICAgKCRwYXRocy0+eyRjfS0+e2FjdGlvbn0gPX4gL15bQVJdJC8pKTsKKwkJaWYgKCRzZWxmLT5yYS0+Y2hlY2tfcGF0aCgkc2VsZi0+e3BhdGh9LCAkcikgPT0KKwkJICAgICRTVk46Ok5vZGU6OmRpcikgeworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N1YiBmaW5kX3BhcmVudF9icmFuY2ggeworCW15ICgkc2VsZiwgJHBhdGhzLCAkcmV2KSA9IEBfOworCXJldHVybiB1bmRlZiB1bmxlc3MgJHNlbGYtPmZvbGxvd19wYXJlbnQ7CisJdW5sZXNzIChkZWZpbmVkICRwYXRocykgeworCQlteSAkZXJyX2hhbmRsZXIgPSAkU1ZOOjpFcnJvcjo6aGFuZGxlcjsKKwkJJFNWTjo6RXJyb3I6OmhhbmRsZXIgPSBcJkdpdDo6U1ZOOjpSYTo6c2tpcF91bmtub3duX3JldnM7CisJCSRzZWxmLT5yYS0+Z2V0X2xvZyhbJHNlbGYtPntwYXRofV0sICRyZXYsICRyZXYsIDAsIDEsIDEsIHN1YiB7CisJCSAgICAgICAgICAgICAgICAgICAkcGF0aHMgPQorCQkJCSAgICAgIEdpdDo6U1ZOOjpSYTo6ZHVwX2NoYW5nZWRfcGF0aHMoJF9bMF0pIH0pOworCQkkU1ZOOjpFcnJvcjo6aGFuZGxlciA9ICRlcnJfaGFuZGxlcjsKKwl9CisJcmV0dXJuIHVuZGVmIHVubGVzcyBkZWZpbmVkICRwYXRoczsKKworCSMgbG9vayBmb3IgYSBwYXJlbnQgZnJvbSBhbm90aGVyIGJyYW5jaDoKKwlteSBAYl9wYXRoX2NvbXBvbmVudHMgPSBzcGxpdCBtIy8jLCAkc2VsZi0+cmVsX3BhdGg7CisJbXkgQGFfcGF0aF9jb21wb25lbnRzOworCW15ICRpOworCXdoaWxlIChAYl9wYXRoX2NvbXBvbmVudHMpIHsKKwkJJGkgPSAkcGF0aHMtPnsnLycuam9pbignLycsIEBiX3BhdGhfY29tcG9uZW50cyl9OworCQlsYXN0IGlmICRpICYmIGRlZmluZWQgJGktPntjb3B5ZnJvbV9wYXRofTsKKwkJdW5zaGlmdChAYV9wYXRoX2NvbXBvbmVudHMsIHBvcChAYl9wYXRoX2NvbXBvbmVudHMpKTsKKwl9CisJcmV0dXJuIHVuZGVmIHVubGVzcyBkZWZpbmVkICRpICYmIGRlZmluZWQgJGktPntjb3B5ZnJvbV9wYXRofTsKKwlteSAkYnJhbmNoX2Zyb20gPSAkaS0+e2NvcHlmcm9tX3BhdGh9OworCWlmIChAYV9wYXRoX2NvbXBvbmVudHMpIHsKKwkJcHJpbnQgU1RERVJSICJicmFuY2hfZnJvbTogJGJyYW5jaF9mcm9tID0+ICI7CisJCSRicmFuY2hfZnJvbSAuPSAnLycuam9pbignLycsIEBhX3BhdGhfY29tcG9uZW50cyk7CisJCXByaW50IFNUREVSUiAkYnJhbmNoX2Zyb20sICJcbiI7CisJfQorCW15ICRyID0gJGktPntjb3B5ZnJvbV9yZXZ9OworCW15ICRyZXBvc19yb290ID0gJHNlbGYtPnJhLT57cmVwb3Nfcm9vdH07CisJbXkgJHVybCA9ICRzZWxmLT5yYS0+e3VybH07CisJbXkgJG5ld191cmwgPSAkcmVwb3Nfcm9vdCAuICRicmFuY2hfZnJvbTsKKwlwcmludCBTVERFUlIgICJGb3VuZCBwb3NzaWJsZSBicmFuY2ggcG9pbnQ6ICIsCisJICAgICAgICAgICAgICAiJG5ld191cmwgPT4gIiwgJHNlbGYtPmZ1bGxfdXJsLCAiLCAkclxuIjsKKwkkYnJhbmNoX2Zyb20gPX4gcyNeLyMjOworCW15ICRncyA9IEdpdDo6U1ZOLT5maW5kX2J5X3VybCgkbmV3X3VybCwgJHJlcG9zX3Jvb3QsICRicmFuY2hfZnJvbSk7CisJdW5sZXNzICgkZ3MpIHsKKwkJbXkgJHJlZl9pZCA9ICRzZWxmLT57cmVmX2lkfTsKKwkJJHJlZl9pZCA9fiBzL1xAXGQrJC8vOworCQkkcmVmX2lkIC49ICJcQCRyIjsKKwkJIyBqdXN0IGdyb3cgYSB0YWlsIGlmIHdlJ3JlIG5vdCB1bmlxdWUgZW5vdWdoIDp4CisJCSRyZWZfaWQgLj0gJy0nIHdoaWxlIGZpbmRfcmVmKCRyZWZfaWQpOworCQlwcmludCBTVERFUlIgIkluaXRpYWxpemluZyBwYXJlbnQ6ICRyZWZfaWRcbiI7CisJCW15ICgkdSwgJHAsICRyZXBvX2lkKSA9ICgkbmV3X3VybCwgJycsICRyZWZfaWQpOworCQlpZiAoJHUgPX4gcyNeXFEkdXJsXEUoL3wkKSMjKSB7CisJCQkkcCA9ICR1OworCQkJJHUgPSAkdXJsOworCQkJJHJlcG9faWQgPSAkc2VsZi0+e3JlcG9faWR9OworCQl9CisJCSRncyA9IEdpdDo6U1ZOLT5pbml0KCR1LCAkcCwgJHJlcG9faWQsICRyZWZfaWQsIDEpOworCX0KKwlteSAoJHIwLCAkcGFyZW50KSA9ICRncy0+ZmluZF9yZXZfYmVmb3JlKCRyLCAxKTsKKwlpZiAoIWRlZmluZWQgJHIwIHx8ICFkZWZpbmVkICRwYXJlbnQpIHsKKwkJbXkgKCRiYXNlLCAkaGVhZCkgPSBwYXJzZV9yZXZpc2lvbl9hcmd1bWVudCgwLCAkcik7CisJCWlmICgkYmFzZSA8PSAkcikgeworCQkJJGdzLT5mZXRjaCgkYmFzZSwgJHIpOworCQl9CisJCSgkcjAsICRwYXJlbnQpID0gJGdzLT5sYXN0X3Jldl9jb21taXQ7CisJfQorCWlmIChkZWZpbmVkICRyMCAmJiBkZWZpbmVkICRwYXJlbnQpIHsKKwkJcHJpbnQgU1RERVJSICJGb3VuZCBicmFuY2ggcGFyZW50OiAoJHNlbGYtPntyZWZfaWR9KSAkcGFyZW50XG4iOworCQlteSAkZWQ7CisJCWlmICgkc2VsZi0+cmEtPmNhbl9kb19zd2l0Y2gpIHsKKwkJCSRzZWxmLT5hc3NlcnRfaW5kZXhfY2xlYW4oJHBhcmVudCk7CisJCQlwcmludCBTVERFUlIgIkZvbGxvd2luZyBwYXJlbnQgd2l0aCBkb19zd2l0Y2hcbiI7CisJCQkjIGRvX3N3aXRjaCB3b3JrcyB3aXRoIHN2bi90cnVuayA+PSByMjIzMTIsIGJ1dCB0aGF0CisJCQkjIGlzIG5vdCBpbmNsdWRlZCB3aXRoIFNWTiAxLjQuMyAodGhlIGxhdGVzdCB2ZXJzaW9uCisJCQkjIGF0IHRoZSBtb21lbnQpLCBzbyB3ZSBjYW4ndCByZWx5IG9uIGl0CisJCQkkc2VsZi0+e2xhc3RfY29tbWl0fSA9ICRwYXJlbnQ7CisJCQkkZWQgPSBTVk46OkdpdDo6RmV0Y2hlci0+bmV3KCRzZWxmKTsKKwkJCSRncy0+cmEtPmdzX2RvX3N3aXRjaCgkcjAsICRyZXYsICRncywKKwkJCQkJICAgICAgJHNlbGYtPmZ1bGxfdXJsLCAkZWQpCisJCQkgIG9yIGRpZSAiU1ZOIGNvbm5lY3Rpb24gZmFpbGVkIHNvbWV3aGVyZS4uLlxuIjsKKwkJfSBlbHNpZiAoJHNlbGYtPnJhLT50cmVlc19tYXRjaCgkbmV3X3VybCwgJHIwLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPmZ1bGxfdXJsLCAkcmV2KSkgeworCQkJcHJpbnQgU1RERVJSICJUcmVlcyBtYXRjaDpcbiIsCisJCQkgICAgICAgICAgICAgIiAgJG5ld191cmxcQCRyMFxuIiwKKwkJCSAgICAgICAgICAgICAiICAke1wkc2VsZi0+ZnVsbF91cmx9XEAkcmV2XG4iLAorCQkJCSAgICAgIkZvbGxvd2luZyBwYXJlbnQgd2l0aCBubyBjaGFuZ2VzXG4iOworCQkJJHNlbGYtPnRtcF9pbmRleF9kbyhzdWIgeworCQkJICAgIGNvbW1hbmRfbm9pc3koJ3JlYWQtdHJlZScsICRwYXJlbnQpOworCQkJfSk7CisJCQkkc2VsZi0+e2xhc3RfY29tbWl0fSA9ICRwYXJlbnQ7CisJCX0gZWxzZSB7CisJCQlwcmludCBTVERFUlIgIkZvbGxvd2luZyBwYXJlbnQgd2l0aCBkb191cGRhdGVcbiI7CisJCQkkZWQgPSBTVk46OkdpdDo6RmV0Y2hlci0+bmV3KCRzZWxmKTsKKwkJCSRzZWxmLT5yYS0+Z3NfZG9fdXBkYXRlKCRyZXYsICRyZXYsICRzZWxmLCAkZWQpCisJCQkgIG9yIGRpZSAiU1ZOIGNvbm5lY3Rpb24gZmFpbGVkIHNvbWV3aGVyZS4uLlxuIjsKKwkJfQorCQlwcmludCBTVERFUlIgIlN1Y2Nlc3NmdWxseSBmb2xsb3dlZCBwYXJlbnRcbiI7CisJCXJldHVybiAkc2VsZi0+bWFrZV9sb2dfZW50cnkoJHJldiwgWyRwYXJlbnRdLCAkZWQpOworCX0KKwlyZXR1cm4gdW5kZWY7Cit9CisKK3N1YiBkb19mZXRjaCB7CisJbXkgKCRzZWxmLCAkcGF0aHMsICRyZXYpID0gQF87CisJbXkgJGVkOworCW15ICgkbGFzdF9yZXYsIEBwYXJlbnRzKTsKKwlpZiAobXkgJGxjID0gJHNlbGYtPmxhc3RfY29tbWl0KSB7CisJCSMgd2UgY2FuIGhhdmUgYSBicmFuY2ggdGhhdCB3YXMgZGVsZXRlZCwgdGhlbiByZS1hZGRlZAorCQkjIHVuZGVyIHRoZSBzYW1lIG5hbWUgYnV0IGNvcGllZCBmcm9tIGFub3RoZXIgcGF0aCwgaW4KKwkJIyB3aGljaCBjYXNlIHdlJ2xsIGhhdmUgbXVsdGlwbGUgcGFyZW50cyAod2UgZG9uJ3QKKwkJIyB3YW50IHRvIGJyZWFrIHRoZSBvcmlnaW5hbCByZWYsIG5vciBsb3NlIGNvcHlwYXRoIGluZm8pOgorCQlpZiAobXkgJGxvZ19lbnRyeSA9ICRzZWxmLT5maW5kX3BhcmVudF9icmFuY2goJHBhdGhzLCAkcmV2KSkgeworCQkJcHVzaCBAeyRsb2dfZW50cnktPntwYXJlbnRzfX0sICRsYzsKKwkJCXJldHVybiAkbG9nX2VudHJ5OworCQl9CisJCSRlZCA9IFNWTjo6R2l0OjpGZXRjaGVyLT5uZXcoJHNlbGYpOworCQkkbGFzdF9yZXYgPSAkc2VsZi0+e2xhc3RfcmV2fTsKKwkJJGVkLT57Y30gPSAkbGM7CisJCUBwYXJlbnRzID0gKCRsYyk7CisJfSBlbHNlIHsKKwkJJGxhc3RfcmV2ID0gJHJldjsKKwkJaWYgKG15ICRsb2dfZW50cnkgPSAkc2VsZi0+ZmluZF9wYXJlbnRfYnJhbmNoKCRwYXRocywgJHJldikpIHsKKwkJCXJldHVybiAkbG9nX2VudHJ5OworCQl9CisJCSRlZCA9IFNWTjo6R2l0OjpGZXRjaGVyLT5uZXcoJHNlbGYpOworCX0KKwl1bmxlc3MgKCRzZWxmLT5yYS0+Z3NfZG9fdXBkYXRlKCRsYXN0X3JldiwgJHJldiwgJHNlbGYsICRlZCkpIHsKKwkJZGllICJTVk4gY29ubmVjdGlvbiBmYWlsZWQgc29tZXdoZXJlLi4uXG4iOworCX0KKwkkc2VsZi0+bWFrZV9sb2dfZW50cnkoJHJldiwgXEBwYXJlbnRzLCAkZWQpOworfQorCitzdWIgZ2V0X3VudHJhY2tlZCB7CisJbXkgKCRzZWxmLCAkZWQpID0gQF87CisJbXkgQG91dDsKKwlteSAkaCA9ICRlZC0+e2VtcHR5fTsKKwlmb3JlYWNoIChzb3J0IGtleXMgJSRoKSB7CisJCW15ICRhY3QgPSAkaC0+eyRffSA/ICcrZW1wdHlfZGlyJyA6ICctZW1wdHlfZGlyJzsKKwkJcHVzaCBAb3V0LCAiICAkYWN0OiAiIC4gdXJpX2VuY29kZSgkXyk7CisJCXdhcm4gIlc6ICRhY3Q6ICRfXG4iOworCX0KKwlmb3JlYWNoIG15ICR0IChxdy9kaXJfcHJvcCBmaWxlX3Byb3AvKSB7CisJCSRoID0gJGVkLT57JHR9IG9yIG5leHQ7CisJCWZvcmVhY2ggbXkgJHBhdGggKHNvcnQga2V5cyAlJGgpIHsKKwkJCW15ICRwcGF0aCA9ICRwYXRoIGVxICcnID8gJy4nIDogJHBhdGg7CisJCQlmb3JlYWNoIG15ICRwcm9wIChzb3J0IGtleXMgJXskaC0+eyRwYXRofX0pIHsKKwkJCQluZXh0IGlmICRTS0lQX1BST1B7JHByb3B9OworCQkJCW15ICR2ID0gJGgtPnskcGF0aH0tPnskcHJvcH07CisJCQkJbXkgJHRfcHBhdGhfcHJvcCA9ICIkdDogIiAuCisJCQkJICAgICAgICAgICAgICAgICAgICB1cmlfZW5jb2RlKCRwcGF0aCkgLiAnICcgLgorCQkJCSAgICAgICAgICAgICAgICAgICAgdXJpX2VuY29kZSgkcHJvcCk7CisJCQkJaWYgKGRlZmluZWQgJHYpIHsKKwkJCQkJcHVzaCBAb3V0LCAiICArJHRfcHBhdGhfcHJvcCAiIC4KKwkJCQkJICAgICAgICAgICB1cmlfZW5jb2RlKCR2KTsKKwkJCQl9IGVsc2UgeworCQkJCQlwdXNoIEBvdXQsICIgIC0kdF9wcGF0aF9wcm9wIjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZm9yZWFjaCBteSAkdCAocXcvYWJzZW50X2ZpbGUgYWJzZW50X2RpcmVjdG9yeS8pIHsKKwkJJGggPSAkZWQtPnskdH0gb3IgbmV4dDsKKwkJZm9yZWFjaCBteSAkcGFyZW50IChzb3J0IGtleXMgJSRoKSB7CisJCQlmb3JlYWNoIG15ICRwYXRoIChzb3J0IEB7JGgtPnskcGFyZW50fX0pIHsKKwkJCQlwdXNoIEBvdXQsICIgICR0OiAiIC4KKwkJCQkgICAgICAgICAgIHVyaV9lbmNvZGUoIiRwYXJlbnQvJHBhdGgiKTsKKwkJCQl3YXJuICJXOiAkdDogJHBhcmVudC8kcGF0aCAiLAorCQkJCSAgICAgIkluc3VmZmljaWVudCBwZXJtaXNzaW9ucz9cbiI7CisJCQl9CisJCX0KKwl9CisJXEBvdXQ7Cit9CisKK3N1YiBwYXJzZV9zdm5fZGF0ZSB7CisJbXkgJGRhdGUgPSBzaGlmdCB8fCByZXR1cm4gJyswMDAwIDE5NzAtMDEtMDEgMDA6MDA6MDAnOworCW15ICgkWSwkbSwkZCwkSCwkTSwkUykgPSAoJGRhdGUgPX4gL14oXGR7NH0pXC0oXGRcZClcLShcZFxkKVQKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXGRcZClcOihcZFxkKVw6KFxkXGQpLlxkK1okL3gpIG9yCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvYWsgIlVuYWJsZSB0byBwYXJzZSBkYXRlOiAkZGF0ZVxuIjsKKwkiKzAwMDAgJFktJG0tJGQgJEg6JE06JFMiOworfQorCitzdWIgY2hlY2tfYXV0aG9yIHsKKwlteSAoJGF1dGhvcikgPSBAXzsKKwlpZiAoIWRlZmluZWQgJGF1dGhvciB8fCBsZW5ndGggJGF1dGhvciA9PSAwKSB7CisJCSRhdXRob3IgPSAnKG5vIGF1dGhvciknOworCX0KKwlpZiAoZGVmaW5lZCAkOjpfYXV0aG9ycyAmJiAhIGRlZmluZWQgJDo6dXNlcnN7JGF1dGhvcn0pIHsKKwkJZGllICJBdXRob3I6ICRhdXRob3Igbm90IGRlZmluZWQgaW4gJDo6X2F1dGhvcnMgZmlsZVxuIjsKKwl9CisJJGF1dGhvcjsKK30KKworc3ViIG1ha2VfbG9nX2VudHJ5IHsKKwlteSAoJHNlbGYsICRyZXYsICRwYXJlbnRzLCAkZWQpID0gQF87CisJbXkgJHVudHJhY2tlZCA9ICRzZWxmLT5nZXRfdW50cmFja2VkKCRlZCk7CisKKwlvcGVuIG15ICR1biwgJz4+JywgIiRzZWxmLT57ZGlyfS91bmhhbmRsZWQubG9nIiBvciBjcm9hayAkITsKKwlwcmludCAkdW4gInIkcmV2XG4iIG9yIGNyb2FrICQhOworCXByaW50ICR1biAkXywgIlxuIiBmb3JlYWNoIEAkdW50cmFja2VkOworCW15ICVsb2dfZW50cnkgPSAoIHBhcmVudHMgPT4gJHBhcmVudHMgfHwgW10sIHJldmlzaW9uID0+ICRyZXYsCisJICAgICAgICAgICAgICAgICAgbG9nID0+ICcnKTsKKworCW15ICRoZWFkcmV2OworCW15ICRsb2dnZWQgPSBkZWxldGUgJHNlbGYtPntsb2dnZWRfcmV2X3Byb3BzfTsKKwlpZiAoISRsb2dnZWQgfHwgJHNlbGYtPnstd2FudF9yZXZwcm9wc30pIHsKKwkJbXkgJHJwID0gJHNlbGYtPnJhLT5yZXZfcHJvcGxpc3QoJHJldik7CisJCWZvcmVhY2ggKHNvcnQga2V5cyAlJHJwKSB7CisJCQlteSAkdiA9ICRycC0+eyRffTsKKwkJCWlmICgvXnN2bjooYXV0aG9yfGRhdGV8bG9nKSQvKSB7CisJCQkJJGxvZ19lbnRyeXskMX0gPSAkdjsKKwkJCX0gZWxzaWYgKCRfIGVxICdzdm06aGVhZHJldicpIHsKKwkJCQkkaGVhZHJldiA9ICR2OworCQkJfSBlbHNlIHsKKwkJCQlwcmludCAkdW4gIiAgcmV2X3Byb3A6ICIsIHVyaV9lbmNvZGUoJF8pLCAnICcsCisJCQkJCSAgdXJpX2VuY29kZSgkdiksICJcbiI7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQltYXAgeyAkbG9nX2VudHJ5eyRffSA9ICRsb2dnZWQtPnskX30gfSBrZXlzICUkbG9nZ2VkOworCX0KKwljbG9zZSAkdW4gb3IgY3JvYWsgJCE7CisKKwkkbG9nX2VudHJ5e2RhdGV9ID0gcGFyc2Vfc3ZuX2RhdGUoJGxvZ19lbnRyeXtkYXRlfSk7CisJJGxvZ19lbnRyeXtsb2d9IC49ICJcbiI7CisJbXkgJGF1dGhvciA9ICRsb2dfZW50cnl7YXV0aG9yfSA9IGNoZWNrX2F1dGhvcigkbG9nX2VudHJ5e2F1dGhvcn0pOworCW15ICgkbmFtZSwgJGVtYWlsKSA9IGRlZmluZWQgJDo6dXNlcnN7JGF1dGhvcn0gPyBAeyQ6OnVzZXJzeyRhdXRob3J9fQorCQkJCQkJICAgICAgIDogKCRhdXRob3IsIHVuZGVmKTsKKworCW15ICgkY29tbWl0X25hbWUsICRjb21taXRfZW1haWwpID0gKCRuYW1lLCAkZW1haWwpOworCWlmICgkX3VzZV9sb2dfYXV0aG9yKSB7CisJCW15ICRuYW1lX2ZpZWxkOworCQlpZiAoJGxvZ19lbnRyeXtsb2d9ID1+IC9Gcm9tOlxzKyguKlxTKVxzKlxuL2kpIHsKKwkJCSRuYW1lX2ZpZWxkID0gJDE7CisJCX0gZWxzaWYgKCRsb2dfZW50cnl7bG9nfSA9fiAvU2lnbmVkLW9mZi1ieTpccysoLipcUylccypcbi9pKSB7CisJCQkkbmFtZV9maWVsZCA9ICQxOworCQl9CisJCWlmICghZGVmaW5lZCAkbmFtZV9maWVsZCkgeworCQkJIworCQl9IGVsc2lmICgkbmFtZV9maWVsZCA9fiAvKC4qPylccys8KC4qKT4vKSB7CisJCQkoJG5hbWUsICRlbWFpbCkgPSAoJDEsICQyKTsKKwkJfSBlbHNpZiAoJG5hbWVfZmllbGQgPX4gLyguKilALykgeworCQkJKCRuYW1lLCAkZW1haWwpID0gKCQxLCAkbmFtZV9maWVsZCk7CisJCX0gZWxzZSB7CisJCQkoJG5hbWUsICRlbWFpbCkgPSAoJG5hbWVfZmllbGQsICd1bmtub3duJyk7CisJCX0KKwl9CisJaWYgKGRlZmluZWQgJGhlYWRyZXYgJiYgJHNlbGYtPnVzZV9zdm1fcHJvcHMpIHsKKwkJaWYgKCRzZWxmLT5yZXdyaXRlX3Jvb3QpIHsKKwkJCWRpZSAiQ2FuJ3QgaGF2ZSBib3RoICd1c2VTdm1Qcm9wcycgYW5kICdyZXdyaXRlUm9vdCcgIiwKKwkJCSAgICAib3B0aW9ucyBzZXQhXG4iOworCQl9CisJCW15ICgkdXVpZCwgJHIpID0gJGhlYWRyZXYgPX4gbXteKFthLWZcZFwtXXszMCx9KTooXGQrKSR9OworCQkjIHdlIGRvbid0IHdhbnQgIlNWTTogaW5pdGlhbGl6aW5nIG1pcnJvciBmb3IganVuayIgLi4uCisJCXJldHVybiB1bmRlZiBpZiAkciA9PSAwOworCQlteSAkc3ZtID0gJHNlbGYtPnN2bTsKKwkJaWYgKCR1dWlkIG5lICRzdm0tPnt1dWlkfSkgeworCQkJZGllICJVVUlEIG1pc21hdGNoIG9uIFNWTSBwYXRoOlxuIiwKKwkJCSAgICAiZXhwZWN0ZWQ6ICRzdm0tPnt1dWlkfVxuIiwKKwkJCSAgICAiICAgICBnb3Q6ICR1dWlkXG4iOworCQl9CisJCW15ICRmdWxsX3VybCA9ICRzZWxmLT5mdWxsX3VybDsKKwkJJGZ1bGxfdXJsID1+IHMjXlxRJHN2bS0+e3JlcGxhY2V9XEUoL3wkKSMkc3ZtLT57c291cmNlfSQxIyBvcgorCQkgICAgICAgICAgICAgZGllICJGYWlsZWQgdG8gcmVwbGFjZSAnJHN2bS0+e3JlcGxhY2V9JyB3aXRoICIsCisJCSAgICAgICAgICAgICAgICAgIickc3ZtLT57c291cmNlfScgaW4gJGZ1bGxfdXJsXG4iOworCQkjIHRocm93IGF3YXkgdXNlcm5hbWUgZm9yIHN0b3JpbmcgaW4gcmVjb3JkcworCQlyZW1vdmVfdXNlcm5hbWUoJGZ1bGxfdXJsKTsKKwkJJGxvZ19lbnRyeXttZXRhZGF0YX0gPSAiJGZ1bGxfdXJsXEAkciAkdXVpZCI7CisJCSRsb2dfZW50cnl7c3ZtX3JldmlzaW9ufSA9ICRyOworCQkkZW1haWwgfHw9ICIkYXV0aG9yXEAkdXVpZCI7CisJCSRjb21taXRfZW1haWwgfHw9ICIkYXV0aG9yXEAkdXVpZCI7CisJfSBlbHNpZiAoJHNlbGYtPnVzZV9zdm5zeW5jX3Byb3BzKSB7CisJCW15ICRmdWxsX3VybCA9ICRzZWxmLT5zdm5zeW5jLT57dXJsfTsKKwkJJGZ1bGxfdXJsIC49ICIvJHNlbGYtPntwYXRofSIgaWYgbGVuZ3RoICRzZWxmLT57cGF0aH07CisJCXJlbW92ZV91c2VybmFtZSgkZnVsbF91cmwpOworCQlteSAkdXVpZCA9ICRzZWxmLT5zdm5zeW5jLT57dXVpZH07CisJCSRsb2dfZW50cnl7bWV0YWRhdGF9ID0gIiRmdWxsX3VybFxAJHJldiAkdXVpZCI7CisJCSRlbWFpbCB8fD0gIiRhdXRob3JcQCR1dWlkIjsKKwkJJGNvbW1pdF9lbWFpbCB8fD0gIiRhdXRob3JcQCR1dWlkIjsKKwl9IGVsc2UgeworCQlteSAkdXJsID0gJHNlbGYtPm1ldGFkYXRhX3VybDsKKwkJcmVtb3ZlX3VzZXJuYW1lKCR1cmwpOworCQkkbG9nX2VudHJ5e21ldGFkYXRhfSA9ICIkdXJsXEAkcmV2ICIgLgorCQkgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT5yYS0+Z2V0X3V1aWQ7CisJCSRlbWFpbCB8fD0gIiRhdXRob3JcQCIgLiAkc2VsZi0+cmEtPmdldF91dWlkOworCQkkY29tbWl0X2VtYWlsIHx8PSAiJGF1dGhvclxAIiAuICRzZWxmLT5yYS0+Z2V0X3V1aWQ7CisJfQorCSRsb2dfZW50cnl7bmFtZX0gPSAkbmFtZTsKKwkkbG9nX2VudHJ5e2VtYWlsfSA9ICRlbWFpbDsKKwkkbG9nX2VudHJ5e2NvbW1pdF9uYW1lfSA9ICRjb21taXRfbmFtZTsKKwkkbG9nX2VudHJ5e2NvbW1pdF9lbWFpbH0gPSAkY29tbWl0X2VtYWlsOworCVwlbG9nX2VudHJ5OworfQorCitzdWIgZmV0Y2ggeworCW15ICgkc2VsZiwgJG1pbl9yZXYsICRtYXhfcmV2LCBAcGFyZW50cykgPSBAXzsKKwlteSAoJGxhc3RfcmV2LCAkbGFzdF9jb21taXQpID0gJHNlbGYtPmxhc3RfcmV2X2NvbW1pdDsKKwlteSAoJGJhc2UsICRoZWFkKSA9ICRzZWxmLT5nZXRfZmV0Y2hfcmFuZ2UoJG1pbl9yZXYsICRtYXhfcmV2KTsKKwkkc2VsZi0+cmEtPmdzX2ZldGNoX2xvb3BfY29tbW9uKCRiYXNlLCAkaGVhZCwgWyRzZWxmXSk7Cit9CisKK3N1YiBzZXRfdHJlZV9jYiB7CisJbXkgKCRzZWxmLCAkbG9nX2VudHJ5LCAkdHJlZSwgJHJldiwgJGRhdGUsICRhdXRob3IpID0gQF87CisJJHNlbGYtPntpbmplY3RfcGFyZW50c30gPSB7ICRyZXYgPT4gJHRyZWUgfTsKKwkkc2VsZi0+ZmV0Y2godW5kZWYsIHVuZGVmKTsKK30KKworc3ViIHNldF90cmVlIHsKKwlteSAoJHNlbGYsICR0cmVlKSA9IChzaGlmdCwgc2hpZnQpOworCW15ICRsb2dfZW50cnkgPSA6OmdldF9jb21taXRfZW50cnkoJHRyZWUpOworCXVubGVzcyAoJHNlbGYtPntsYXN0X3Jldn0pIHsKKwkJZmF0YWwoIk11c3QgaGF2ZSBhbiBleGlzdGluZyByZXZpc2lvbiB0byBjb21taXQiKTsKKwl9CisJbXkgJWVkX29wdHMgPSAoIHIgPT4gJHNlbGYtPntsYXN0X3Jldn0sCisJICAgICAgICAgICAgICAgIGxvZyA9PiAkbG9nX2VudHJ5LT57bG9nfSwKKwkgICAgICAgICAgICAgICAgcmEgPT4gJHNlbGYtPnJhLAorCSAgICAgICAgICAgICAgICB0cmVlX2EgPT4gJHNlbGYtPntsYXN0X2NvbW1pdH0sCisJICAgICAgICAgICAgICAgIHRyZWVfYiA9PiAkdHJlZSwKKwkgICAgICAgICAgICAgICAgZWRpdG9yX2NiID0+IHN1YiB7CisJCQkgICAgICAgJHNlbGYtPnNldF90cmVlX2NiKCRsb2dfZW50cnksICR0cmVlLCBAXykgfSwKKwkgICAgICAgICAgICAgICAgc3ZuX3BhdGggPT4gJHNlbGYtPntwYXRofSApOworCWlmICghU1ZOOjpHaXQ6OkVkaXRvci0+bmV3KFwlZWRfb3B0cyktPmFwcGx5X2RpZmYpIHsKKwkJcHJpbnQgIk5vIGNoYW5nZXNcbnIkc2VsZi0+e2xhc3RfcmV2fSA9ICR0cmVlXG4iOworCX0KK30KKworc3ViIHJlYnVpbGRfZnJvbV9yZXZfZGIgeworCW15ICgkc2VsZiwgJHBhdGgpID0gQF87CisJbXkgJHIgPSAtMTsKKwlvcGVuIG15ICRmaCwgJzwnLCAkcGF0aCBvciBjcm9hayAib3BlbjogJCEiOworCXdoaWxlICg8JGZoPikgeworCQlsZW5ndGgoJF8pID09IDQxIG9yIGNyb2FrICJpbmNvbnNpc3RlbnQgc2l6ZSBpbiAoJF8pICE9IDQxIjsKKwkJY2hvbXAoJF8pOworCQkrKyRyOworCQluZXh0IGlmICRfIGVxICgnMCcgeCA0MCk7CisJCSRzZWxmLT5yZXZfbWFwX3NldCgkciwgJF8pOworCQlwcmludCAiciRyID0gJF9cbiI7CisJfQorCWNsb3NlICRmaCBvciBjcm9hayAiY2xvc2U6ICQhIjsKKwl1bmxpbmsgJHBhdGggb3IgY3JvYWsgInVubGluazogJCEiOworfQorCitzdWIgcmVidWlsZCB7CisJbXkgKCRzZWxmKSA9IEBfOworCW15ICRtYXBfcGF0aCA9ICRzZWxmLT5tYXBfcGF0aDsKKwlyZXR1cm4gaWYgKC1lICRtYXBfcGF0aCAmJiAhIC16ICRtYXBfcGF0aCk7CisJcmV0dXJuIHVubGVzcyA6OnZlcmlmeV9yZWYoJHNlbGYtPnJlZm5hbWUuJ14wJyk7CisJaWYgKCRzZWxmLT51c2Vfc3ZtX3Byb3BzIHx8ICRzZWxmLT5ub19tZXRhZGF0YSkgeworCQlteSAkcmV2X2RiID0gJHNlbGYtPnJldl9kYl9wYXRoOworCQkkc2VsZi0+cmVidWlsZF9mcm9tX3Jldl9kYigkcmV2X2RiKTsKKwkJaWYgKCRzZWxmLT51c2Vfc3ZtX3Byb3BzKSB7CisJCQlteSAkc3ZtX3Jldl9kYiA9ICRzZWxmLT5yZXZfZGJfcGF0aCgkc2VsZi0+c3ZtX3V1aWQpOworCQkJJHNlbGYtPnJlYnVpbGRfZnJvbV9yZXZfZGIoJHN2bV9yZXZfZGIpOworCQl9CisJCSRzZWxmLT51bmxpbmtfcmV2X2RiX3N5bWxpbms7CisJCXJldHVybjsKKwl9CisJcHJpbnQgIlJlYnVpbGRpbmcgJG1hcF9wYXRoIC4uLlxuIjsKKwlteSAoJGxvZywgJGN0eCkgPQorCSAgICBjb21tYW5kX291dHB1dF9waXBlKHF3L3Jldi1saXN0IC0tcHJldHR5PXJhdyAtLW5vLWNvbG9yIC0tcmV2ZXJzZS8sCisJICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPnJlZm5hbWUsICctLScpOworCW15ICRmdWxsX3VybCA9ICRzZWxmLT5mdWxsX3VybDsKKwlyZW1vdmVfdXNlcm5hbWUoJGZ1bGxfdXJsKTsKKwlteSAkc3ZuX3V1aWQgPSAkc2VsZi0+cmFfdXVpZDsKKwlteSAkYzsKKwl3aGlsZSAoPCRsb2c+KSB7CisJCWlmICggbXteY29tbWl0ICgkOjpzaGExKSR9ICkgeworCQkJJGMgPSAkMTsKKwkJCW5leHQ7CisJCX0KKwkJbmV4dCB1bmxlc3Mgc3teXHMqKGdpdC1zdm4taWQ6KX17JDF9OworCQlteSAoJHVybCwgJHJldiwgJHV1aWQpID0gOjpleHRyYWN0X21ldGFkYXRhKCRfKTsKKwkJcmVtb3ZlX3VzZXJuYW1lKCR1cmwpOworCisJCSMgaWdub3JlIG1lcmdlcyAoZnJvbSBzZXQtdHJlZSkKKwkJbmV4dCBpZiAoIWRlZmluZWQgJHJldiB8fCAhJHV1aWQpOworCisJCSMgaWYgd2UgbWVyZ2VkIG9yIG90aGVyd2lzZSBzdGFydGVkIGVsc2V3aGVyZSwgdGhpcyBpcworCQkjIGhvdyB3ZSBicmVhayBvdXQgb2YgaXQKKwkJaWYgKCgkdXVpZCBuZSAkc3ZuX3V1aWQpIHx8CisJCSAgICAoJGZ1bGxfdXJsICYmICR1cmwgJiYgKCR1cmwgbmUgJGZ1bGxfdXJsKSkpIHsKKwkJCW5leHQ7CisJCX0KKworCQkkc2VsZi0+cmV2X21hcF9zZXQoJHJldiwgJGMpOworCQlwcmludCAiciRyZXYgPSAkY1xuIjsKKwl9CisJY29tbWFuZF9jbG9zZV9waXBlKCRsb2csICRjdHgpOworCXByaW50ICJEb25lIHJlYnVpbGRpbmcgJG1hcF9wYXRoXG4iOworCW15ICRyZXZfZGJfcGF0aCA9ICRzZWxmLT5yZXZfZGJfcGF0aDsKKwlpZiAoLWYgJHNlbGYtPnJldl9kYl9wYXRoKSB7CisJCXVubGluayAkc2VsZi0+cmV2X2RiX3BhdGggb3IgY3JvYWsgInVubGluazogJCEiOworCX0KKwkkc2VsZi0+dW5saW5rX3Jldl9kYl9zeW1saW5rOworfQorCisjIHJldl9tYXA6CisjIFRpZTo6RmlsZSBzZWVtcyB0byBiZSBwcm9uZSB0byBvZmZzZXQgZXJyb3JzIGlmIHJldmlzaW9ucyBnZXQgc3BhcnNlLAorIyBpdCdzIG5vdCB0aGF0IGZhc3QsIGVpdGhlci4gIFRpZTo6RmlsZSBpcyBhbHNvIG5vdCBpbiBQZXJsIDUuNi4gIFNvCisjIG9uZSBvZiBteSBmYXZvcml0ZSBtb2R1bGVzIGlzIG91dCA6PCAgTmV4dCB1cCB3b3VsZCBiZSBvbmUgb2YgdGhlIERCTQorIyBtb2R1bGVzLCBidXQgSSdtIG5vdCBzdXJlIHdoaWNoIGlzIG1vc3QgcG9ydGFibGUuLi4KKyMKKyMgVGhpcyBpcyB0aGUgcmVwbGFjZW1lbnQgZm9yIHRoZSByZXZfZGIgZm9ybWF0LCB3aGljaCB3YXMgdG9vIGJpZworIyBhbmQgaW5lZmZpY2llbnQgZm9yIGxhcmdlIHJlcG9zaXRvcmllcyB3aXRoIGEgbG90IG9mIHNwYXJzZSBoaXN0b3J5CisjIChtYWlubHkgdGFncykKKyMKKyMgVGhlIGZvcm1hdCBpcyB0aGlzOgorIyAgIC0gMjQgYnl0ZXMgZm9yIGV2ZXJ5IHJlY29yZCwKKyMgICAgICogNCBieXRlcyBmb3IgdGhlIGludGVnZXIgcmVwcmVzZW50aW5nIGFuIFNWTiByZXZpc2lvbiBudW1iZXIKKyMgICAgICogMjAgYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBzaGExIG9mIGEgZ2l0IGNvbW1pdAorIyAgIC0gTm8gZW1wdHkgcGFkZGluZyByZWNvcmRzIGxpa2UgdGhlIG9sZCBmb3JtYXQKKyMgICAgIChleGNlcHQgdGhlIGxhc3QgcmVjb3JkLCB3aGljaCBjYW4gYmUgb3ZlcndyaXR0ZW4pCisjICAgLSBuZXcgcmVjb3JkcyBhcmUgd3JpdHRlbiBhcHBlbmQtb25seSBzaW5jZSBTVk4gcmV2aXNpb24gbnVtYmVycworIyAgICAgaW5jcmVhc2UgbW9ub3RvbmljYWxseQorIyAgIC0gbG9va3VwcyBvbiBTVk4gcmV2aXNpb24gbnVtYmVyIGFyZSBkb25lIHZpYSBhIGJpbmFyeSBzZWFyY2gKKyMgICAtIFBpcGluZyB0aGUgZmlsZSB0byB4eGQgLWMyNCBpcyBhIGdvb2Qgd2F5IG9mIGR1bXBpbmcgaXQgZm9yCisjICAgICB2aWV3aW5nIG9yIGVkaXRpbmcgKHBpcGVkIGJhY2sgdGhyb3VnaCB4eGQgLXIpLCBzaG91bGQgdGhlIG5lZWQKKyMgICAgIGV2ZXIgYXJpc2UuCisjICAgLSBUaGUgbGFzdCByZWNvcmQgY2FuIGJlIHBhZGRpbmcgcmV2aXNpb24gd2l0aCBhbiBhbGwtemVybyBzaGExCisjICAgICBUaGlzIGlzIHVzZWQgdG8gb3B0aW1pemUgZmV0Y2ggcGVyZm9ybWFuY2Ugd2hlbiB1c2luZyBtdWx0aXBsZQorIyAgICAgImZldGNoIiBkaXJlY3RpdmVzIGluIC5naXQvY29uZmlnCisjCisjIFRoZXNlIGZpbGVzIGFyZSBkaXNwb3NhYmxlIHVubGVzcyBub01ldGFkYXRhIG9yIHVzZVN2bVByb3BzIGlzIHNldAorCitzdWIgX3Jldl9tYXBfc2V0IHsKKwlteSAoJGZoLCAkcmV2LCAkY29tbWl0KSA9IEBfOworCisJbXkgJHNpemUgPSAoc3RhdCgkZmgpKVs3XTsKKwkoJHNpemUgJSAyNCkgPT0gMCBvciBjcm9hayAiaW5jb25zaXN0ZW50IHNpemU6ICRzaXplIjsKKworCW15ICR3cl9vZmZzZXQgPSAwOworCWlmICgkc2l6ZSA+IDApIHsKKwkJc3lzc2VlaygkZmgsIC0yNCwgU0VFS19FTkQpIG9yIGNyb2FrICJzZWVrOiAkISI7CisJCW15ICRyZWFkID0gc3lzcmVhZCgkZmgsIG15ICRidWYsIDI0KSBvciBjcm9hayAicmVhZDogJCEiOworCQkkcmVhZCA9PSAyNCBvciBjcm9hayAicmVhZCBvbmx5ICRyZWFkIGJ5dGVzICghPSAyNCkiOworCQlteSAoJGxhc3RfcmV2LCAkbGFzdF9jb21taXQpID0gdW5wYWNrKHJldl9tYXBfZm10LCAkYnVmKTsKKwkJaWYgKCRsYXN0X2NvbW1pdCBlcSAoJzAnIHg0MCkpIHsKKwkJCWlmICgkc2l6ZSA+PSA0OCkgeworCQkJCXN5c3NlZWsoJGZoLCAtNDgsIFNFRUtfRU5EKSBvciBjcm9hayAic2VlazogJCEiOworCQkJCSRyZWFkID0gc3lzcmVhZCgkZmgsICRidWYsIDI0KSBvcgorCQkJCSAgICBjcm9hayAicmVhZDogJCEiOworCQkJCSRyZWFkID09IDI0IG9yCisJCQkJICAgIGNyb2FrICJyZWFkIG9ubHkgJHJlYWQgYnl0ZXMgKCE9IDI0KSI7CisJCQkJKCRsYXN0X3JldiwgJGxhc3RfY29tbWl0KSA9CisJCQkJICAgIHVucGFjayhyZXZfbWFwX2ZtdCwgJGJ1Zik7CisJCQkJaWYgKCRsYXN0X2NvbW1pdCBlcSAoJzAnIHg0MCkpIHsKKwkJCQkJY3JvYWsgImluY29uc2lzdGVudCAucmV2X21hcFxuIjsKKwkJCQl9CisJCQl9CisJCQlpZiAoJGxhc3RfcmV2ID49ICRyZXYpIHsKKwkJCQljcm9hayAibGFzdF9yZXYgaXMgaGlnaGVyITogJGxhc3RfcmV2ID49ICRyZXYiOworCQkJfQorCQkJJHdyX29mZnNldCA9IC0yNDsKKwkJfQorCX0KKwlzeXNzZWVrKCRmaCwgJHdyX29mZnNldCwgU0VFS19FTkQpIG9yIGNyb2FrICJzZWVrOiAkISI7CisJc3lzd3JpdGUoJGZoLCBwYWNrKHJldl9tYXBfZm10LCAkcmV2LCAkY29tbWl0KSwgMjQpID09IDI0IG9yCisJICBjcm9hayAid3JpdGU6ICQhIjsKK30KKworc3ViIG1rZmlsZSB7CisJbXkgKCRwYXRoKSA9IEBfOworCXVubGVzcyAoLWUgJHBhdGgpIHsKKwkJbXkgKCRkaXIsICRiYXNlKSA9ICgkcGF0aCA9fiBtI14oLio/KS8/KFteL10rKSQjKTsKKwkJbWtwYXRoKFskZGlyXSkgdW5sZXNzIC1kICRkaXI7CisJCW9wZW4gbXkgJGZoLCAnPj4nLCAkcGF0aCBvciBkaWUgIkNvdWxkbid0IGNyZWF0ZSAkcGF0aDogJCFcbiI7CisJCWNsb3NlICRmaCBvciBkaWUgIkNvdWxkbid0IGNsb3NlIChjcmVhdGUpICRwYXRoOiAkIVxuIjsKKwl9Cit9CisKK3N1YiByZXZfbWFwX3NldCB7CisJbXkgKCRzZWxmLCAkcmV2LCAkY29tbWl0LCAkdXBkYXRlX3JlZiwgJHV1aWQpID0gQF87CisJbGVuZ3RoICRjb21taXQgPT0gNDAgb3IgZGllICJhcmczIG11c3QgYmUgYSBmdWxsIFNIQTEgaGV4c3VtXG4iOworCW15ICRkYiA9ICRzZWxmLT5tYXBfcGF0aCgkdXVpZCk7CisJbXkgJGRiX2xvY2sgPSAiJGRiLmxvY2siOworCW15ICRzaWc7CisJaWYgKCR1cGRhdGVfcmVmKSB7CisJCSRTSUd7SU5UfSA9ICRTSUd7SFVQfSA9ICRTSUd7VEVSTX0gPSAkU0lHe0FMUk19ID0gJFNJR3tQSVBFfSA9CisJCSAgICAgICAgICAgICRTSUd7VVNSMX0gPSAkU0lHe1VTUjJ9ID0gc3ViIHsgJHNpZyA9ICRfWzBdIH07CisJfQorCW1rZmlsZSgkZGIpOworCisJJExPQ0tGSUxFU3skZGJfbG9ja30gPSAxOworCW15ICRzeW5jOworCSMgYm90aCBvZiB0aGVzZSBvcHRpb25zIG1ha2Ugb3VyIC5yZXZfZGIgZmlsZSB2ZXJ5LCB2ZXJ5IGltcG9ydGFudAorCSMgYW5kIHdlIGNhbid0IGFmZm9yZCB0byBsb3NlIGl0IGJlY2F1c2UgcmVidWlsZCgpIHdvbid0IHdvcmsKKwlpZiAoJHNlbGYtPnVzZV9zdm1fcHJvcHMgfHwgJHNlbGYtPm5vX21ldGFkYXRhKSB7CisJCSRzeW5jID0gMTsKKwkJY29weSgkZGIsICRkYl9sb2NrKSBvciBkaWUgInJldl9tYXBfc2V0KEBfKTogIiwKKwkJCQkJICAgIkZhaWxlZCB0byBjb3B5OiAiLAorCQkJCQkgICAiJGRiID0+ICRkYl9sb2NrICgkISlcbiI7CisJfSBlbHNlIHsKKwkJcmVuYW1lICRkYiwgJGRiX2xvY2sgb3IgZGllICJyZXZfbWFwX3NldChAXyk6ICIsCisJCQkJCSAgICAiRmFpbGVkIHRvIHJlbmFtZTogIiwKKwkJCQkJICAgICIkZGIgPT4gJGRiX2xvY2sgKCQhKVxuIjsKKwl9CisKKwlzeXNvcGVuKG15ICRmaCwgJGRiX2xvY2ssIE9fUkRXUiB8IE9fQ1JFQVQpCisJICAgICBvciBjcm9hayAiQ291bGRuJ3Qgb3BlbiAkZGJfbG9jazogJCFcbiI7CisJX3Jldl9tYXBfc2V0KCRmaCwgJHJldiwgJGNvbW1pdCk7CisJaWYgKCRzeW5jKSB7CisJCSRmaC0+Zmx1c2ggb3IgZGllICJDb3VsZG4ndCBmbHVzaCAkZGJfbG9jazogJCFcbiI7CisJCSRmaC0+c3luYyBvciBkaWUgIkNvdWxkbid0IHN5bmMgJGRiX2xvY2s6ICQhXG4iOworCX0KKwljbG9zZSAkZmggb3IgY3JvYWsgJCE7CisJaWYgKCR1cGRhdGVfcmVmKSB7CisJCSRfaGVhZCA9ICRzZWxmOworCQljb21tYW5kX25vaXN5KCd1cGRhdGUtcmVmJywgJy1tJywgInIkcmV2IiwKKwkJICAgICAgICAgICAgICAkc2VsZi0+cmVmbmFtZSwgJGNvbW1pdCk7CisJfQorCXJlbmFtZSAkZGJfbG9jaywgJGRiIG9yIGRpZSAicmV2X21hcF9zZXQoQF8pOiAiLCAiRmFpbGVkIHRvIHJlbmFtZTogIiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRkYl9sb2NrID0+ICRkYiAoJCEpXG4iOworCWRlbGV0ZSAkTE9DS0ZJTEVTeyRkYl9sb2NrfTsKKwlpZiAoJHVwZGF0ZV9yZWYpIHsKKwkJJFNJR3tJTlR9ID0gJFNJR3tIVVB9ID0gJFNJR3tURVJNfSA9ICRTSUd7QUxSTX0gPSAkU0lHe1BJUEV9ID0KKwkJICAgICAgICAgICAgJFNJR3tVU1IxfSA9ICRTSUd7VVNSMn0gPSAnREVGQVVMVCc7CisJCWtpbGwgJHNpZywgJCQgaWYgZGVmaW5lZCAkc2lnOworCX0KK30KKworIyBJZiB3YW50X2NvbW1pdCwgdGhpcyB3aWxsIHJldHVybiBhbiBhcnJheSBvZiAocmV2LCBjb21taXQpIHdoZXJlCisjIGNvbW1pdCBfbXVzdF8gYmUgYSB2YWxpZCBjb21taXQgaW4gdGhlIGFyY2hpdmUuCisjIE90aGVyd2lzZSwgaXQnbGwgcmV0dXJuIHRoZSBtYXggcmV2aXNpb24gKHdoZXRoZXIgb3Igbm90IHRoZQorIyBjb21taXQgaXMgdmFsaWQgb3IganVzdCBhIDB4NDAgcGxhY2Vob2xkZXIpLgorc3ViIHJldl9tYXBfbWF4IHsKKwlteSAoJHNlbGYsICR3YW50X2NvbW1pdCkgPSBAXzsKKwkkc2VsZi0+cmVidWlsZDsKKwlteSAkbWFwX3BhdGggPSAkc2VsZi0+bWFwX3BhdGg7CisJc3RhdCAkbWFwX3BhdGggb3IgcmV0dXJuICR3YW50X2NvbW1pdCA/ICgwLCB1bmRlZikgOiAwOworCXN5c29wZW4obXkgJGZoLCAkbWFwX3BhdGgsIE9fUkRPTkxZKSBvciBjcm9hayAib3BlbjogJCEiOworCW15ICRzaXplID0gKHN0YXQoJGZoKSlbN107CisJKCRzaXplICUgMjQpID09IDAgb3IgY3JvYWsgImluY29uc2lzdGVudCBzaXplOiAkc2l6ZSI7CisKKwlpZiAoJHNpemUgPT0gMCkgeworCQljbG9zZSAkZmggb3IgY3JvYWsgImNsb3NlOiAkISI7CisJCXJldHVybiAkd2FudF9jb21taXQgPyAoMCwgdW5kZWYpIDogMDsKKwl9CisKKwlzeXNzZWVrKCRmaCwgLTI0LCBTRUVLX0VORCkgb3IgY3JvYWsgInNlZWs6ICQhIjsKKwlzeXNyZWFkKCRmaCwgbXkgJGJ1ZiwgMjQpID09IDI0IG9yIGNyb2FrICJyZWFkOiAkISI7CisJbXkgKCRyLCAkYykgPSB1bnBhY2socmV2X21hcF9mbXQsICRidWYpOworCWlmICgkd2FudF9jb21taXQgJiYgJGMgZXEgKCcwJyB4NDApKSB7CisJCWlmICgkc2l6ZSA8IDQ4KSB7CisJCQlyZXR1cm4gJHdhbnRfY29tbWl0ID8gKDAsIHVuZGVmKSA6IDA7CisJCX0KKwkJc3lzc2VlaygkZmgsIC00OCwgU0VFS19FTkQpIG9yIGNyb2FrICJzZWVrOiAkISI7CisJCXN5c3JlYWQoJGZoLCAkYnVmLCAyNCkgPT0gMjQgb3IgY3JvYWsgInJlYWQ6ICQhIjsKKwkJKCRyLCAkYykgPSB1bnBhY2socmV2X21hcF9mbXQsICRidWYpOworCQlpZiAoJGMgZXEgKCcwJ3g0MCkpIHsKKwkJCWNyb2FrICJQZW51bHRpbWF0ZSByZWNvcmQgaXMgYWxsLXplcm9lcyBpbiAkbWFwX3BhdGgiOworCQl9CisJfQorCWNsb3NlICRmaCBvciBjcm9hayAiY2xvc2U6ICQhIjsKKwkkd2FudF9jb21taXQgPyAoJHIsICRjKSA6ICRyOworfQorCitzdWIgcmV2X21hcF9nZXQgeworCW15ICgkc2VsZiwgJHJldiwgJHV1aWQpID0gQF87CisJbXkgJG1hcF9wYXRoID0gJHNlbGYtPm1hcF9wYXRoKCR1dWlkKTsKKwlyZXR1cm4gdW5kZWYgdW5sZXNzIC1lICRtYXBfcGF0aDsKKworCXN5c29wZW4obXkgJGZoLCAkbWFwX3BhdGgsIE9fUkRPTkxZKSBvciBjcm9hayAib3BlbjogJCEiOworCW15ICRzaXplID0gKHN0YXQoJGZoKSlbN107CisJKCRzaXplICUgMjQpID09IDAgb3IgY3JvYWsgImluY29uc2lzdGVudCBzaXplOiAkc2l6ZSI7CisKKwlpZiAoJHNpemUgPT0gMCkgeworCQljbG9zZSAkZmggb3IgY3JvYWsgImNsb3NlOiAkZmgiOworCQlyZXR1cm4gdW5kZWY7CisJfQorCisJbXkgKCRsLCAkdSkgPSAoMCwgJHNpemUgLSAyNCk7CisJbXkgKCRyLCAkYywgJGJ1Zik7CisKKwl3aGlsZSAoJGwgPD0gJHUpIHsKKwkJbXkgJGkgPSBpbnQoKCRsLzI0ICsgJHUvMjQpIC8gMikgKiAyNDsKKwkJc3lzc2VlaygkZmgsICRpLCBTRUVLX1NFVCkgb3IgY3JvYWsgInNlZWs6ICQhIjsKKwkJc3lzcmVhZCgkZmgsIG15ICRidWYsIDI0KSA9PSAyNCBvciBjcm9hayAicmVhZDogJCEiOworCQlteSAoJHIsICRjKSA9IHVucGFjaygnTkg0MCcsICRidWYpOworCisJCWlmICgkciA8ICRyZXYpIHsKKwkJCSRsID0gJGkgKyAyNDsKKwkJfSBlbHNpZiAoJHIgPiAkcmV2KSB7CisJCQkkdSA9ICRpIC0gMjQ7CisJCX0gZWxzZSB7ICMgJHIgPT0gJHJldgorCQkJY2xvc2UoJGZoKSBvciBjcm9hayAiY2xvc2U6ICQhIjsKKwkJCXJldHVybiAkYyBlcSAoJzAnIHggNDApID8gdW5kZWYgOiAkYzsKKwkJfQorCX0KKwljbG9zZSgkZmgpIG9yIGNyb2FrICJjbG9zZTogJCEiOworCXVuZGVmOworfQorCisjIEZpbmRzIHRoZSBmaXJzdCBzdm4gcmV2aXNpb24gdGhhdCBleGlzdHMgb24gKGlmICRlcV9vayBpcyB0cnVlKSBvcgorIyBiZWZvcmUgJHJldiBmb3IgdGhlIGN1cnJlbnQgYnJhbmNoLiAgSXQgd2lsbCBub3Qgc2VhcmNoIGFueSBsb3dlcgorIyB0aGFuICRtaW5fcmV2LiAgUmV0dXJucyB0aGUgZ2l0IGNvbW1pdCBoYXNoIGFuZCBzdm4gcmV2aXNpb24gbnVtYmVyCisjIGlmIGZvdW5kLCBlbHNlICh1bmRlZiwgdW5kZWYpLgorc3ViIGZpbmRfcmV2X2JlZm9yZSB7CisJbXkgKCRzZWxmLCAkcmV2LCAkZXFfb2ssICRtaW5fcmV2KSA9IEBfOworCS0tJHJldiB1bmxlc3MgJGVxX29rOworCSRtaW5fcmV2IHx8PSAxOworCXdoaWxlICgkcmV2ID49ICRtaW5fcmV2KSB7CisJCWlmIChteSAkYyA9ICRzZWxmLT5yZXZfbWFwX2dldCgkcmV2KSkgeworCQkJcmV0dXJuICgkcmV2LCAkYyk7CisJCX0KKwkJLS0kcmV2OworCX0KKwlyZXR1cm4gKHVuZGVmLCB1bmRlZik7Cit9CisKKyMgRmluZHMgdGhlIGZpcnN0IHN2biByZXZpc2lvbiB0aGF0IGV4aXN0cyBvbiAoaWYgJGVxX29rIGlzIHRydWUpIG9yCisjIGFmdGVyICRyZXYgZm9yIHRoZSBjdXJyZW50IGJyYW5jaC4gIEl0IHdpbGwgbm90IHNlYXJjaCBhbnkgaGlnaGVyCisjIHRoYW4gJG1heF9yZXYuICBSZXR1cm5zIHRoZSBnaXQgY29tbWl0IGhhc2ggYW5kIHN2biByZXZpc2lvbiBudW1iZXIKKyMgaWYgZm91bmQsIGVsc2UgKHVuZGVmLCB1bmRlZikuCitzdWIgZmluZF9yZXZfYWZ0ZXIgeworCW15ICgkc2VsZiwgJHJldiwgJGVxX29rLCAkbWF4X3JldikgPSBAXzsKKwkrKyRyZXYgdW5sZXNzICRlcV9vazsKKwkkbWF4X3JldiB8fD0gJHNlbGYtPnJldl9tYXBfbWF4OworCXdoaWxlICgkcmV2IDw9ICRtYXhfcmV2KSB7CisJCWlmIChteSAkYyA9ICRzZWxmLT5yZXZfbWFwX2dldCgkcmV2KSkgeworCQkJcmV0dXJuICgkcmV2LCAkYyk7CisJCX0KKwkJKyskcmV2OworCX0KKwlyZXR1cm4gKHVuZGVmLCB1bmRlZik7Cit9CisKK3N1YiBfbmV3IHsKKwlteSAoJGNsYXNzLCAkcmVwb19pZCwgJHJlZl9pZCwgJHBhdGgpID0gQF87CisJdW5sZXNzIChkZWZpbmVkICRyZXBvX2lkICYmIGxlbmd0aCAkcmVwb19pZCkgeworCQkkcmVwb19pZCA9ICRHaXQ6OlNWTjo6ZGVmYXVsdF9yZXBvX2lkOworCX0KKwl1bmxlc3MgKGRlZmluZWQgJHJlZl9pZCAmJiBsZW5ndGggJHJlZl9pZCkgeworCQkkX1syXSA9ICRyZWZfaWQgPSAkR2l0OjpTVk46OmRlZmF1bHRfcmVmX2lkOworCX0KKwkkX1sxXSA9ICRyZXBvX2lkID0gc2FuaXRpemVfcmVtb3RlX25hbWUoJHJlcG9faWQpOworCW15ICRkaXIgPSAiJEVOVntHSVRfRElSfS9zdm4vJHJlZl9pZCI7CisJJF9bM10gPSAkcGF0aCA9ICcnIHVubGVzcyAoZGVmaW5lZCAkcGF0aCk7CisJbWtwYXRoKFsiJEVOVntHSVRfRElSfS9zdm4iXSk7CisJYmxlc3MgeworCQlyZWZfaWQgPT4gJHJlZl9pZCwgZGlyID0+ICRkaXIsIGluZGV4ID0+ICIkZGlyL2luZGV4IiwKKwkgICAgICAgIHBhdGggPT4gJHBhdGgsIGNvbmZpZyA9PiAiJEVOVntHSVRfRElSfS9zdm4vY29uZmlnIiwKKwkgICAgICAgIG1hcF9yb290ID0+ICIkZGlyLy5yZXZfbWFwIiwgcmVwb19pZCA9PiAkcmVwb19pZCB9LCAkY2xhc3M7Cit9CisKKyMgZm9yIHJlYWQtb25seSBhY2Nlc3Mgb2Ygb2xkIC5yZXZfZGIgZm9ybWF0cworc3ViIHVubGlua19yZXZfZGJfc3ltbGluayB7CisJbXkgKCRzZWxmKSA9IEBfOworCW15ICRsaW5rID0gJHNlbGYtPnJldl9kYl9wYXRoOworCSRsaW5rID1+IHMvXC5bXHctXSskLy8gb3IgY3JvYWsgIm1pc3NpbmcgVVVJRCBhdCB0aGUgZW5kIG9mICRsaW5rIjsKKwlpZiAoLWwgJGxpbmspIHsKKwkJdW5saW5rICRsaW5rIG9yIGNyb2FrICJ1bmxpbms6ICRsaW5rIGZhaWxlZCEiOworCX0KK30KKworc3ViIHJldl9kYl9wYXRoIHsKKwlteSAoJHNlbGYsICR1dWlkKSA9IEBfOworCW15ICRkYl9wYXRoID0gJHNlbGYtPm1hcF9wYXRoKCR1dWlkKTsKKwkkZGJfcGF0aCA9fiBzey9cLnJldl9tYXBcLn17L1wucmV2X2RiXC59CisJICAgIG9yIGNyb2FrICJtYXBfcGF0aDogJGRiX3BhdGggZG9lcyBub3QgY29udGFpbiAnLy5yZXZfbWFwLicgISI7CisJJGRiX3BhdGg7Cit9CisKKyMgdGhlIG5ldyByZXBsYWNlbWVudCBmb3IgLnJldl9kYgorc3ViIG1hcF9wYXRoIHsKKwlteSAoJHNlbGYsICR1dWlkKSA9IEBfOworCSR1dWlkIHx8PSAkc2VsZi0+cmFfdXVpZDsKKwkiJHNlbGYtPnttYXBfcm9vdH0uJHV1aWQiOworfQorCitzdWIgdXJpX2VuY29kZSB7CisJbXkgKCRmKSA9IEBfOworCSRmID1+IHMjKFteYS16QS1aMC05XCohXDpfXC4vXC1dKSN1YyBzcHJpbnRmKCIlJSUwMngiLG9yZCgkMSkpI2VnOworCSRmCit9CisKK3N1YiByZW1vdmVfdXNlcm5hbWUgeworCSRfWzBdID1+IHN7XihbXjpdKjovLylbXkBdK0B9eyQxfTsKK30KKworcGFja2FnZSBHaXQ6OlNWTjo6UHJvbXB0OwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3JlcXVpcmUgU1ZOOjpDb3JlOwordXNlIHZhcnMgcXcvJF9ub19hdXRoX2NhY2hlICRfdXNlcm5hbWUvOworCitzdWIgc2ltcGxlIHsKKwlteSAoJGNyZWQsICRyZWFsbSwgJGRlZmF1bHRfdXNlcm5hbWUsICRtYXlfc2F2ZSwgJHBvb2wpID0gQF87CisJJG1heV9zYXZlID0gdW5kZWYgaWYgJF9ub19hdXRoX2NhY2hlOworCSRkZWZhdWx0X3VzZXJuYW1lID0gJF91c2VybmFtZSBpZiBkZWZpbmVkICRfdXNlcm5hbWU7CisJaWYgKGRlZmluZWQgJGRlZmF1bHRfdXNlcm5hbWUgJiYgbGVuZ3RoICRkZWZhdWx0X3VzZXJuYW1lKSB7CisJCWlmIChkZWZpbmVkICRyZWFsbSAmJiBsZW5ndGggJHJlYWxtKSB7CisJCQlwcmludCBTVERFUlIgIkF1dGhlbnRpY2F0aW9uIHJlYWxtOiAkcmVhbG1cbiI7CisJCQlTVERFUlItPmZsdXNoOworCQl9CisJCSRjcmVkLT51c2VybmFtZSgkZGVmYXVsdF91c2VybmFtZSk7CisJfSBlbHNlIHsKKwkJdXNlcm5hbWUoJGNyZWQsICRyZWFsbSwgJG1heV9zYXZlLCAkcG9vbCk7CisJfQorCSRjcmVkLT5wYXNzd29yZChfcmVhZF9wYXNzd29yZCgiUGFzc3dvcmQgZm9yICciIC4KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNyZWQtPnVzZXJuYW1lIC4gIic6ICIsICRyZWFsbSkpOworCSRjcmVkLT5tYXlfc2F2ZSgkbWF5X3NhdmUpOworCSRTVk46Ol9Db3JlOjpTVk5fTk9fRVJST1I7Cit9CisKK3N1YiBzc2xfc2VydmVyX3RydXN0IHsKKwlteSAoJGNyZWQsICRyZWFsbSwgJGZhaWx1cmVzLCAkY2VydF9pbmZvLCAkbWF5X3NhdmUsICRwb29sKSA9IEBfOworCSRtYXlfc2F2ZSA9IHVuZGVmIGlmICRfbm9fYXV0aF9jYWNoZTsKKwlwcmludCBTVERFUlIgIkVycm9yIHZhbGlkYXRpbmcgc2VydmVyIGNlcnRpZmljYXRlIGZvciAnJHJlYWxtJzpcbiI7CisJeworCQlubyB3YXJuaW5ncyAnb25jZSc7CisJCSMgQWxsIHZhcmlhYmxlcyBTVk46OkF1dGg6OlNTTDo6KiBhcmUgdXNlZCBvbmx5IG9uY2UsCisJCSMgc28gd2UncmUgc2h1dHRpbmcgdXAgUGVybCB3YXJuaW5ncyBhYm91dCB0aGlzLgorCQlpZiAoJGZhaWx1cmVzICYgJFNWTjo6QXV0aDo6U1NMOjpVTktOT1dOQ0EpIHsKKwkJCXByaW50IFNUREVSUiAiIC0gVGhlIGNlcnRpZmljYXRlIGlzIG5vdCBpc3N1ZWQgIiwKKwkJCSAgICAiYnkgYSB0cnVzdGVkIGF1dGhvcml0eS4gVXNlIHRoZVxuIiwKKwkJCSAgICAiICAgZmluZ2VycHJpbnQgdG8gdmFsaWRhdGUgIiwKKwkJCSAgICAidGhlIGNlcnRpZmljYXRlIG1hbnVhbGx5IVxuIjsKKwkJfQorCQlpZiAoJGZhaWx1cmVzICYgJFNWTjo6QXV0aDo6U1NMOjpDTk1JU01BVENIKSB7CisJCQlwcmludCBTVERFUlIgIiAtIFRoZSBjZXJ0aWZpY2F0ZSBob3N0bmFtZSAiLAorCQkJICAgICJkb2VzIG5vdCBtYXRjaC5cbiI7CisJCX0KKwkJaWYgKCRmYWlsdXJlcyAmICRTVk46OkF1dGg6OlNTTDo6Tk9UWUVUVkFMSUQpIHsKKwkJCXByaW50IFNUREVSUiAiIC0gVGhlIGNlcnRpZmljYXRlIGlzIG5vdCB5ZXQgdmFsaWQuXG4iOworCQl9CisJCWlmICgkZmFpbHVyZXMgJiAkU1ZOOjpBdXRoOjpTU0w6OkVYUElSRUQpIHsKKwkJCXByaW50IFNUREVSUiAiIC0gVGhlIGNlcnRpZmljYXRlIGhhcyBleHBpcmVkLlxuIjsKKwkJfQorCQlpZiAoJGZhaWx1cmVzICYgJFNWTjo6QXV0aDo6U1NMOjpPVEhFUikgeworCQkJcHJpbnQgU1RERVJSICIgLSBUaGUgY2VydGlmaWNhdGUgaGFzICIsCisJCQkgICAgImFuIHVua25vd24gZXJyb3IuXG4iOworCQl9CisJfSAjIG5vIHdhcm5pbmdzICdvbmNlJworCXByaW50ZiBTVERFUlIKKwkgICAgICAgICJDZXJ0aWZpY2F0ZSBpbmZvcm1hdGlvbjpcbiIuCisJICAgICAgICAiIC0gSG9zdG5hbWU6ICVzXG4iLgorCSAgICAgICAgIiAtIFZhbGlkOiBmcm9tICVzIHVudGlsICVzXG4iLgorCSAgICAgICAgIiAtIElzc3VlcjogJXNcbiIuCisJICAgICAgICAiIC0gRmluZ2VycHJpbnQ6ICVzXG4iLAorCSAgICAgICAgbWFwICRjZXJ0X2luZm8tPiRfLCBxdyhob3N0bmFtZSB2YWxpZF9mcm9tIHZhbGlkX3VudGlsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzc3Vlcl9kbmFtZSBmaW5nZXJwcmludCk7CisJbXkgJGNob2ljZTsKK3Byb21wdDoKKwlwcmludCBTVERFUlIgJG1heV9zYXZlID8KKwkgICAgICAiKFIpZWplY3QsIGFjY2VwdCAodCllbXBvcmFyaWx5IG9yIGFjY2VwdCAocCllcm1hbmVudGx5PyAiIDoKKwkgICAgICAiKFIpZWplY3Qgb3IgYWNjZXB0ICh0KWVtcG9yYXJpbHk/ICI7CisJU1RERVJSLT5mbHVzaDsKKwkkY2hvaWNlID0gbGMoc3Vic3RyKDxTVERJTj4gfHwgJ1InLCAwLCAxKSk7CisJaWYgKCRjaG9pY2UgPX4gL150JC9pKSB7CisJCSRjcmVkLT5tYXlfc2F2ZSh1bmRlZik7CisJfSBlbHNpZiAoJGNob2ljZSA9fiAvXnIkL2kpIHsKKwkJcmV0dXJuIC0xOworCX0gZWxzaWYgKCRtYXlfc2F2ZSAmJiAkY2hvaWNlID1+IC9ecCQvaSkgeworCQkkY3JlZC0+bWF5X3NhdmUoJG1heV9zYXZlKTsKKwl9IGVsc2UgeworCQlnb3RvIHByb21wdDsKKwl9CisJJGNyZWQtPmFjY2VwdGVkX2ZhaWx1cmVzKCRmYWlsdXJlcyk7CisJJFNWTjo6X0NvcmU6OlNWTl9OT19FUlJPUjsKK30KKworc3ViIHNzbF9jbGllbnRfY2VydCB7CisJbXkgKCRjcmVkLCAkcmVhbG0sICRtYXlfc2F2ZSwgJHBvb2wpID0gQF87CisJJG1heV9zYXZlID0gdW5kZWYgaWYgJF9ub19hdXRoX2NhY2hlOworCXByaW50IFNUREVSUiAiQ2xpZW50IGNlcnRpZmljYXRlIGZpbGVuYW1lOiAiOworCVNUREVSUi0+Zmx1c2g7CisJY2hvbXAobXkgJGZpbGVuYW1lID0gPFNURElOPik7CisJJGNyZWQtPmNlcnRfZmlsZSgkZmlsZW5hbWUpOworCSRjcmVkLT5tYXlfc2F2ZSgkbWF5X3NhdmUpOworCSRTVk46Ol9Db3JlOjpTVk5fTk9fRVJST1I7Cit9CisKK3N1YiBzc2xfY2xpZW50X2NlcnRfcHcgeworCW15ICgkY3JlZCwgJHJlYWxtLCAkbWF5X3NhdmUsICRwb29sKSA9IEBfOworCSRtYXlfc2F2ZSA9IHVuZGVmIGlmICRfbm9fYXV0aF9jYWNoZTsKKwkkY3JlZC0+cGFzc3dvcmQoX3JlYWRfcGFzc3dvcmQoIlBhc3N3b3JkOiAiLCAkcmVhbG0pKTsKKwkkY3JlZC0+bWF5X3NhdmUoJG1heV9zYXZlKTsKKwkkU1ZOOjpfQ29yZTo6U1ZOX05PX0VSUk9SOworfQorCitzdWIgdXNlcm5hbWUgeworCW15ICgkY3JlZCwgJHJlYWxtLCAkbWF5X3NhdmUsICRwb29sKSA9IEBfOworCSRtYXlfc2F2ZSA9IHVuZGVmIGlmICRfbm9fYXV0aF9jYWNoZTsKKwlpZiAoZGVmaW5lZCAkcmVhbG0gJiYgbGVuZ3RoICRyZWFsbSkgeworCQlwcmludCBTVERFUlIgIkF1dGhlbnRpY2F0aW9uIHJlYWxtOiAkcmVhbG1cbiI7CisJfQorCW15ICR1c2VybmFtZTsKKwlpZiAoZGVmaW5lZCAkX3VzZXJuYW1lKSB7CisJCSR1c2VybmFtZSA9ICRfdXNlcm5hbWU7CisJfSBlbHNlIHsKKwkJcHJpbnQgU1RERVJSICJVc2VybmFtZTogIjsKKwkJU1RERVJSLT5mbHVzaDsKKwkJY2hvbXAoJHVzZXJuYW1lID0gPFNURElOPik7CisJfQorCSRjcmVkLT51c2VybmFtZSgkdXNlcm5hbWUpOworCSRjcmVkLT5tYXlfc2F2ZSgkbWF5X3NhdmUpOworCSRTVk46Ol9Db3JlOjpTVk5fTk9fRVJST1I7Cit9CisKK3N1YiBfcmVhZF9wYXNzd29yZCB7CisJbXkgKCRwcm9tcHQsICRyZWFsbSkgPSBAXzsKKwlwcmludCBTVERFUlIgJHByb21wdDsKKwlTVERFUlItPmZsdXNoOworCXJlcXVpcmUgVGVybTo6UmVhZEtleTsKKwlUZXJtOjpSZWFkS2V5OjpSZWFkTW9kZSgnbm9lY2hvJyk7CisJbXkgJHBhc3N3b3JkID0gJyc7CisJd2hpbGUgKGRlZmluZWQobXkgJGtleSA9IFRlcm06OlJlYWRLZXk6OlJlYWRLZXkoMCkpKSB7CisJCWxhc3QgaWYgJGtleSA9fiAvW1wwMTJcMDE1XS87ICMgXG5ccgorCQkkcGFzc3dvcmQgLj0gJGtleTsKKwl9CisJVGVybTo6UmVhZEtleTo6UmVhZE1vZGUoJ3Jlc3RvcmUnKTsKKwlwcmludCBTVERFUlIgIlxuIjsKKwlTVERFUlItPmZsdXNoOworCSRwYXNzd29yZDsKK30KKworcGFja2FnZSBTVk46OkdpdDo6RmV0Y2hlcjsKK3VzZSB2YXJzIHF3L0BJU0EvOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBDYXJwIHF3L2Nyb2FrLzsKK3VzZSBJTzo6RmlsZSBxdy8vOworCisjIGZpbGUgYmF0b24gbWVtYmVyczogcGF0aCwgbW9kZV9hLCBtb2RlX2IsIHBvb2wsIGZoLCBibG9iLCBiYXNlCitzdWIgbmV3IHsKKwlteSAoJGNsYXNzLCAkZ2l0X3N2bikgPSBAXzsKKwlteSAkc2VsZiA9IFNWTjo6RGVsdGE6OkVkaXRvci0+bmV3OworCWJsZXNzICRzZWxmLCAkY2xhc3M7CisJJHNlbGYtPntjfSA9ICRnaXRfc3ZuLT57bGFzdF9jb21taXR9IGlmIGV4aXN0cyAkZ2l0X3N2bi0+e2xhc3RfY29tbWl0fTsKKwkkc2VsZi0+e2VtcHR5fSA9IHt9OworCSRzZWxmLT57ZGlyX3Byb3B9ID0ge307CisJJHNlbGYtPntmaWxlX3Byb3B9ID0ge307CisJJHNlbGYtPnthYnNlbnRfZGlyfSA9IHt9OworCSRzZWxmLT57YWJzZW50X2ZpbGV9ID0ge307CisJJHNlbGYtPntnaWl9ID0gJGdpdF9zdm4tPnRtcF9pbmRleF9kbyhzdWIgeyBHaXQ6OkluZGV4SW5mby0+bmV3IH0pOworCSRzZWxmOworfQorCitzdWIgc2V0X3BhdGhfc3RyaXAgeworCW15ICgkc2VsZiwgJHBhdGgpID0gQF87CisJJHNlbGYtPntwYXRoX3N0cmlwfSA9IHFyL15cUSRwYXRoXEUoXC98JCkvIGlmIGxlbmd0aCAkcGF0aDsKK30KKworc3ViIG9wZW5fcm9vdCB7CisJeyBwYXRoID0+ICcnIH07Cit9CisKK3N1YiBvcGVuX2RpcmVjdG9yeSB7CisJbXkgKCRzZWxmLCAkcGF0aCwgJHBiLCAkcmV2KSA9IEBfOworCXsgcGF0aCA9PiAkcGF0aCB9OworfQorCitzdWIgZ2l0X3BhdGggeworCW15ICgkc2VsZiwgJHBhdGgpID0gQF87CisJaWYgKCRzZWxmLT57cGF0aF9zdHJpcH0pIHsKKwkJJHBhdGggPX4gcyEkc2VsZi0+e3BhdGhfc3RyaXB9ISEgb3IKKwkJICBkaWUgIkZhaWxlZCB0byBzdHJpcCBwYXRoICckcGF0aCcgKCRzZWxmLT57cGF0aF9zdHJpcH0pXG4iOworCX0KKwkkcGF0aDsKK30KKworc3ViIGRlbGV0ZV9lbnRyeSB7CisJbXkgKCRzZWxmLCAkcGF0aCwgJHJldiwgJHBiKSA9IEBfOworCisJbXkgJGdwYXRoID0gJHNlbGYtPmdpdF9wYXRoKCRwYXRoKTsKKwlyZXR1cm4gdW5kZWYgaWYgKCRncGF0aCBlcSAnJyk7CisKKwkjIHJlbW92ZSBlbnRpcmUgZGlyZWN0b3JpZXMuCisJaWYgKGNvbW1hbmQoJ2xzLXRyZWUnLCAkc2VsZi0+e2N9LCAnLS0nLCAkZ3BhdGgpID1+IC9eMDQwMDAwIHRyZWUvKSB7CisJCW15ICgkbHMsICRjdHgpID0gY29tbWFuZF9vdXRwdXRfcGlwZShxdy9scy10cmVlCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtciAtLW5hbWUtb25seSAtei8sCisJCQkJICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntjfSwgJy0tJywgJGdwYXRoKTsKKwkJbG9jYWwgJC8gPSAiXDAiOworCQl3aGlsZSAoPCRscz4pIHsKKwkJCWNob21wOworCQkJJHNlbGYtPntnaWl9LT5yZW1vdmUoJF8pOworCQkJcHJpbnQgIlx0RFx0JF9cbiIgdW5sZXNzICQ6Ol9xOworCQl9CisJCXByaW50ICJcdERcdCRncGF0aC9cbiIgdW5sZXNzICQ6Ol9xOworCQljb21tYW5kX2Nsb3NlX3BpcGUoJGxzLCAkY3R4KTsKKwkJJHNlbGYtPntlbXB0eX0tPnskcGF0aH0gPSAwCisJfSBlbHNlIHsKKwkJJHNlbGYtPntnaWl9LT5yZW1vdmUoJGdwYXRoKTsKKwkJcHJpbnQgIlx0RFx0JGdwYXRoXG4iIHVubGVzcyAkOjpfcTsKKwl9CisJdW5kZWY7Cit9CisKK3N1YiBvcGVuX2ZpbGUgeworCW15ICgkc2VsZiwgJHBhdGgsICRwYiwgJHJldikgPSBAXzsKKwlteSAkZ3BhdGggPSAkc2VsZi0+Z2l0X3BhdGgoJHBhdGgpOworCW15ICgkbW9kZSwgJGJsb2IpID0gKGNvbW1hbmQoJ2xzLXRyZWUnLCAkc2VsZi0+e2N9LCAnLS0nLCAkZ3BhdGgpCisJICAgICAgICAgICAgICAgICAgICAgPX4gL14oXGR7Nn0pIGJsb2IgKFthLWZcZF17NDB9KVx0Lyk7CisJdW5sZXNzIChkZWZpbmVkICRtb2RlICYmIGRlZmluZWQgJGJsb2IpIHsKKwkJZGllICIkcGF0aCB3YXMgbm90IGZvdW5kIGluIGNvbW1pdCAkc2VsZi0+e2N9IChyJHJldilcbiI7CisJfQorCXsgcGF0aCA9PiAkcGF0aCwgbW9kZV9hID0+ICRtb2RlLCBtb2RlX2IgPT4gJG1vZGUsIGJsb2IgPT4gJGJsb2IsCisJICBwb29sID0+IFNWTjo6UG9vbC0+bmV3LCBhY3Rpb24gPT4gJ00nIH07Cit9CisKK3N1YiBhZGRfZmlsZSB7CisJbXkgKCRzZWxmLCAkcGF0aCwgJHBiLCAkY3BfcGF0aCwgJGNwX3JldikgPSBAXzsKKwlteSAoJGRpciwgJGZpbGUpID0gKCRwYXRoID1+IG0jXiguKj8pLz8oW14vXSspJCMpOworCWRlbGV0ZSAkc2VsZi0+e2VtcHR5fS0+eyRkaXJ9OworCXsgcGF0aCA9PiAkcGF0aCwgbW9kZV9hID0+IDEwMDY0NCwgbW9kZV9iID0+IDEwMDY0NCwKKwkgIHBvb2wgPT4gU1ZOOjpQb29sLT5uZXcsIGFjdGlvbiA9PiAnQScgfTsKK30KKworc3ViIGFkZF9kaXJlY3RvcnkgeworCW15ICgkc2VsZiwgJHBhdGgsICRjcF9wYXRoLCAkY3BfcmV2KSA9IEBfOworCW15ICRncGF0aCA9ICRzZWxmLT5naXRfcGF0aCgkcGF0aCk7CisJaWYgKCRncGF0aCBlcSAnJykgeworCQlteSAoJGxzLCAkY3R4KSA9IGNvbW1hbmRfb3V0cHV0X3BpcGUocXcvbHMtdHJlZQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXIgLS1uYW1lLW9ubHkgLXovLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57Y30pOworCQlsb2NhbCAkLyA9ICJcMCI7CisJCXdoaWxlICg8JGxzPikgeworCQkJY2hvbXA7CisJCQkkc2VsZi0+e2dpaX0tPnJlbW92ZSgkXyk7CisJCQlwcmludCAiXHREXHQkX1xuIiB1bmxlc3MgJDo6X3E7CisJCX0KKwkJY29tbWFuZF9jbG9zZV9waXBlKCRscywgJGN0eCk7CisJCSRzZWxmLT57ZW1wdHl9LT57JHBhdGh9ID0gMDsKKwl9CisJbXkgKCRkaXIsICRmaWxlKSA9ICgkcGF0aCA9fiBtI14oLio/KS8/KFteL10rKSQjKTsKKwlkZWxldGUgJHNlbGYtPntlbXB0eX0tPnskZGlyfTsKKwkkc2VsZi0+e2VtcHR5fS0+eyRwYXRofSA9IDE7CisJeyBwYXRoID0+ICRwYXRoIH07Cit9CisKK3N1YiBjaGFuZ2VfZGlyX3Byb3AgeworCW15ICgkc2VsZiwgJGRiLCAkcHJvcCwgJHZhbHVlKSA9IEBfOworCSRzZWxmLT57ZGlyX3Byb3B9LT57JGRiLT57cGF0aH19IHx8PSB7fTsKKwkkc2VsZi0+e2Rpcl9wcm9wfS0+eyRkYi0+e3BhdGh9fS0+eyRwcm9wfSA9ICR2YWx1ZTsKKwl1bmRlZjsKK30KKworc3ViIGFic2VudF9kaXJlY3RvcnkgeworCW15ICgkc2VsZiwgJHBhdGgsICRwYikgPSBAXzsKKwkkc2VsZi0+e2Fic2VudF9kaXJ9LT57JHBiLT57cGF0aH19IHx8PSBbXTsKKwlwdXNoIEB7JHNlbGYtPnthYnNlbnRfZGlyfS0+eyRwYi0+e3BhdGh9fX0sICRwYXRoOworCXVuZGVmOworfQorCitzdWIgYWJzZW50X2ZpbGUgeworCW15ICgkc2VsZiwgJHBhdGgsICRwYikgPSBAXzsKKwkkc2VsZi0+e2Fic2VudF9maWxlfS0+eyRwYi0+e3BhdGh9fSB8fD0gW107CisJcHVzaCBAeyRzZWxmLT57YWJzZW50X2ZpbGV9LT57JHBiLT57cGF0aH19fSwgJHBhdGg7CisJdW5kZWY7Cit9CisKK3N1YiBjaGFuZ2VfZmlsZV9wcm9wIHsKKwlteSAoJHNlbGYsICRmYiwgJHByb3AsICR2YWx1ZSkgPSBAXzsKKwlpZiAoJHByb3AgZXEgJ3N2bjpleGVjdXRhYmxlJykgeworCQlpZiAoJGZiLT57bW9kZV9ifSAhPSAxMjAwMDApIHsKKwkJCSRmYi0+e21vZGVfYn0gPSBkZWZpbmVkICR2YWx1ZSA/IDEwMDc1NSA6IDEwMDY0NDsKKwkJfQorCX0gZWxzaWYgKCRwcm9wIGVxICdzdm46c3BlY2lhbCcpIHsKKwkJJGZiLT57bW9kZV9ifSA9IGRlZmluZWQgJHZhbHVlID8gMTIwMDAwIDogMTAwNjQ0OworCX0gZWxzZSB7CisJCSRzZWxmLT57ZmlsZV9wcm9wfS0+eyRmYi0+e3BhdGh9fSB8fD0ge307CisJCSRzZWxmLT57ZmlsZV9wcm9wfS0+eyRmYi0+e3BhdGh9fS0+eyRwcm9wfSA9ICR2YWx1ZTsKKwl9CisJdW5kZWY7Cit9CisKK3N1YiBhcHBseV90ZXh0ZGVsdGEgeworCW15ICgkc2VsZiwgJGZiLCAkZXhwKSA9IEBfOworCW15ICRmaCA9IElPOjpGaWxlLT5uZXdfdG1wZmlsZTsKKwkkZmgtPmF1dG9mbHVzaCgxKTsKKwkjICRmaCBnZXRzIGF1dG8tY2xvc2VkKCkgYnkgU1ZOOjpUeERlbHRhOjphcHBseSgpLAorCSMgKGJ1dCAkYmFzZSBkb2VzIG5vdCwpIHNvIGR1cCgpIGl0IGZvciByZWFkaW5nIGluIGNsb3NlX2ZpbGUKKwlvcGVuIG15ICRkdXAsICc8JicsICRmaCBvciBjcm9hayAkITsKKwlteSAkYmFzZSA9IElPOjpGaWxlLT5uZXdfdG1wZmlsZTsKKwkkYmFzZS0+YXV0b2ZsdXNoKDEpOworCWlmICgkZmItPntibG9ifSkgeworCQlkZWZpbmVkIChteSAkcGlkID0gZm9yaykgb3IgY3JvYWsgJCE7CisJCWlmICghJHBpZCkgeworCQkJb3BlbiBTVERPVVQsICc+JicsICRiYXNlIG9yIGNyb2FrICQhOworCQkJcHJpbnQgU1RET1VUICdsaW5rICcgaWYgKCRmYi0+e21vZGVfYX0gPT0gMTIwMDAwKTsKKwkJCWV4ZWMgcXcvZ2l0LWNhdC1maWxlIGJsb2IvLCAkZmItPntibG9ifSBvciBjcm9hayAkITsKKwkJfQorCQl3YWl0cGlkICRwaWQsIDA7CisJCWNyb2FrICQ/IGlmICQ/OworCisJCWlmIChkZWZpbmVkICRleHApIHsKKwkJCXNlZWsgJGJhc2UsIDAsIDAgb3IgY3JvYWsgJCE7CisJCQlteSAkZ290ID0gOjptZDVzdW0oJGJhc2UpOworCQkJZGllICJDaGVja3N1bSBtaXNtYXRjaDogJGZiLT57cGF0aH0gJGZiLT57YmxvYn1cbiIsCisJCQkgICAgImV4cGVjdGVkOiAkZXhwXG4iLAorCQkJICAgICIgICAgIGdvdDogJGdvdFxuIiBpZiAoJGdvdCBuZSAkZXhwKTsKKwkJfQorCX0KKwlzZWVrICRiYXNlLCAwLCAwIG9yIGNyb2FrICQhOworCSRmYi0+e2ZofSA9ICRkdXA7CisJJGZiLT57YmFzZX0gPSAkYmFzZTsKKwlbIFNWTjo6VHhEZWx0YTo6YXBwbHkoJGJhc2UsICRmaCwgdW5kZWYsICRmYi0+e3BhdGh9LCAkZmItPntwb29sfSkgXTsKK30KKworc3ViIGNsb3NlX2ZpbGUgeworCW15ICgkc2VsZiwgJGZiLCAkZXhwKSA9IEBfOworCW15ICRoYXNoOworCW15ICRwYXRoID0gJHNlbGYtPmdpdF9wYXRoKCRmYi0+e3BhdGh9KTsKKwlpZiAobXkgJGZoID0gJGZiLT57Zmh9KSB7CisJCWlmIChkZWZpbmVkICRleHApIHsKKwkJCXNlZWsoJGZoLCAwLCAwKSBvciBjcm9hayAkITsKKwkJCW15ICRnb3QgPSA6Om1kNXN1bSgkZmgpOworCQkJaWYgKCRnb3QgbmUgJGV4cCkgeworCQkJCWRpZSAiQ2hlY2tzdW0gbWlzbWF0Y2g6ICRwYXRoXG4iLAorCQkJCSAgICAiZXhwZWN0ZWQ6ICRleHBcbiAgICBnb3Q6ICRnb3RcbiI7CisJCQl9CisJCX0KKwkJc3lzc2VlaygkZmgsIDAsIDApIG9yIGNyb2FrICQhOworCQlpZiAoJGZiLT57bW9kZV9ifSA9PSAxMjAwMDApIHsKKwkJCWV2YWwgeworCQkJCXN5c3JlYWQoJGZoLCBteSAkYnVmLCA1KSA9PSA1IG9yIGNyb2FrICQhOworCQkJCSRidWYgZXEgJ2xpbmsgJyBvciBkaWUgIiRwYXRoIGhhcyBtb2RlIDEyMDAwMCIsCisJCQkJCQkgICAgICAgIiBidXQgaXMgbm90IGEgbGluayI7CisJCQl9OworCQkJaWYgKCRAKSB7CisJCQkJd2FybiAiJEBcbiI7CisJCQkJc3lzc2VlaygkZmgsIDAsIDApIG9yIGNyb2FrICQhOworCQkJfQorCQl9CisJCWRlZmluZWQobXkgJHBpZCA9IG9wZW4gbXkgJG91dCwnLXwnKSBvciBkaWUgIkNhbid0IGZvcms6ICQhXG4iOworCQlpZiAoISRwaWQpIHsKKwkJCW9wZW4gU1RESU4sICc8JicsICRmaCBvciBjcm9hayAkITsKKwkJCWV4ZWMgcXcvZ2l0LWhhc2gtb2JqZWN0IC13IC0tc3RkaW4vIG9yIGNyb2FrICQhOworCQl9CisJCWNob21wKCRoYXNoID0gZG8geyBsb2NhbCAkLzsgPCRvdXQ+IH0pOworCQljbG9zZSAkb3V0IG9yIGNyb2FrICQhOworCQljbG9zZSAkZmggb3IgY3JvYWsgJCE7CisJCSRoYXNoID1+IC9eW2EtZlxkXXs0MH0kLyBvciBkaWUgIm5vdCBhIHNoYTE6ICRoYXNoXG4iOworCQljbG9zZSAkZmItPntiYXNlfSBvciBjcm9hayAkITsKKwl9IGVsc2UgeworCQkkaGFzaCA9ICRmYi0+e2Jsb2J9IG9yIGRpZSAibm8gYmxvYiBpbmZvcm1hdGlvblxuIjsKKwl9CisJJGZiLT57cG9vbH0tPmNsZWFyOworCSRzZWxmLT57Z2lpfS0+dXBkYXRlKCRmYi0+e21vZGVfYn0sICRoYXNoLCAkcGF0aCkgb3IgY3JvYWsgJCE7CisJcHJpbnQgIlx0JGZiLT57YWN0aW9ufVx0JHBhdGhcbiIgaWYgJGZiLT57YWN0aW9ufSAmJiAhICQ6Ol9xOworCXVuZGVmOworfQorCitzdWIgYWJvcnRfZWRpdCB7CisJbXkgJHNlbGYgPSBzaGlmdDsKKwkkc2VsZi0+e25yfSA9ICRzZWxmLT57Z2lpfS0+e25yfTsKKwlkZWxldGUgJHNlbGYtPntnaWl9OworCSRzZWxmLT5TVVBFUjo6YWJvcnRfZWRpdChAXyk7Cit9CisKK3N1YiBjbG9zZV9lZGl0IHsKKwlteSAkc2VsZiA9IHNoaWZ0OworCSRzZWxmLT57Z2l0X2NvbW1pdF9va30gPSAxOworCSRzZWxmLT57bnJ9ID0gJHNlbGYtPntnaWl9LT57bnJ9OworCWRlbGV0ZSAkc2VsZi0+e2dpaX07CisJJHNlbGYtPlNVUEVSOjpjbG9zZV9lZGl0KEBfKTsKK30KKworcGFja2FnZSBTVk46OkdpdDo6RWRpdG9yOwordXNlIHZhcnMgcXcvQElTQSAkX3JtZGlyICRfY3Bfc2ltaWxhcml0eSAkX2ZpbmRfY29waWVzX2hhcmRlciAkX3JlbmFtZV9saW1pdC87Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIENhcnAgcXcvY3JvYWsvOwordXNlIElPOjpGaWxlOworCitzdWIgbmV3IHsKKwlteSAoJGNsYXNzLCAkb3B0cykgPSBAXzsKKwlmb3JlYWNoIChxdy9zdm5fcGF0aCByIHJhIHRyZWVfYSB0cmVlX2IgbG9nIGVkaXRvcl9jYi8pIHsKKwkJZGllICIkXyByZXF1aXJlZCFcbiIgdW5sZXNzIChkZWZpbmVkICRvcHRzLT57JF99KTsKKwl9CisKKwlteSAkcG9vbCA9IFNWTjo6UG9vbC0+bmV3OworCW15ICRtb2RzID0gZ2VuZXJhdGVfZGlmZigkb3B0cy0+e3RyZWVfYX0sICRvcHRzLT57dHJlZV9ifSk7CisJbXkgJHR5cGVzID0gY2hlY2tfZGlmZl9wYXRocygkb3B0cy0+e3JhfSwgJG9wdHMtPntzdm5fcGF0aH0sCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb3B0cy0+e3J9LCAkbW9kcyk7CisKKwkjICRvcHRzLT57cmF9IGZ1bmN0aW9ucyBzaG91bGQgbm90IGJlIHVzZWQgYWZ0ZXIgdGhpczoKKwlteSBAY2UgID0gJG9wdHMtPntyYX0tPmdldF9jb21taXRfZWRpdG9yKCRvcHRzLT57bG9nfSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9wdHMtPntlZGl0b3JfY2J9LCAkcG9vbCk7CisJbXkgJHNlbGYgPSBTVk46OkRlbHRhOjpFZGl0b3ItPm5ldyhAY2UsICRwb29sKTsKKwlibGVzcyAkc2VsZiwgJGNsYXNzOworCWZvcmVhY2ggKHF3L3N2bl9wYXRoIHIgdHJlZV9hIHRyZWVfYi8pIHsKKwkJJHNlbGYtPnskX30gPSAkb3B0cy0+eyRffTsKKwl9CisJJHNlbGYtPnt1cmx9ID0gJG9wdHMtPntyYX0tPnt1cmx9OworCSRzZWxmLT57bW9kc30gPSAkbW9kczsKKwkkc2VsZi0+e3R5cGVzfSA9ICR0eXBlczsKKwkkc2VsZi0+e3Bvb2x9ID0gJHBvb2w7CisJJHNlbGYtPntiYXR9ID0geyAnJyA9PiAkc2VsZi0+b3Blbl9yb290KCRzZWxmLT57cn0sICRzZWxmLT57cG9vbH0pIH07CisJJHNlbGYtPntybX0gPSB7IH07CisJJHNlbGYtPntwYXRoX3ByZWZpeH0gPSBsZW5ndGggJHNlbGYtPntzdm5fcGF0aH0gPworCSAgICAgICAgICAgICAgICAgICAgICAgIiRzZWxmLT57c3ZuX3BhdGh9LyIgOiAnJzsKKwlyZXR1cm4gJHNlbGY7Cit9CisKK3N1YiBnZW5lcmF0ZV9kaWZmIHsKKwlteSAoJHRyZWVfYSwgJHRyZWVfYikgPSBAXzsKKwlteSBAZGlmZl90cmVlID0gcXcoZGlmZi10cmVlIC16IC1yKTsKKwlpZiAoJF9jcF9zaW1pbGFyaXR5KSB7CisJCXB1c2ggQGRpZmZfdHJlZSwgIi1DJF9jcF9zaW1pbGFyaXR5IjsKKwl9IGVsc2UgeworCQlwdXNoIEBkaWZmX3RyZWUsICctQyc7CisJfQorCXB1c2ggQGRpZmZfdHJlZSwgJy0tZmluZC1jb3BpZXMtaGFyZGVyJyBpZiAkX2ZpbmRfY29waWVzX2hhcmRlcjsKKwlwdXNoIEBkaWZmX3RyZWUsICItbCRfcmVuYW1lX2xpbWl0IiBpZiBkZWZpbmVkICRfcmVuYW1lX2xpbWl0OworCXB1c2ggQGRpZmZfdHJlZSwgJHRyZWVfYSwgJHRyZWVfYjsKKwlteSAoJGRpZmZfZmgsICRjdHgpID0gY29tbWFuZF9vdXRwdXRfcGlwZShAZGlmZl90cmVlKTsKKwlsb2NhbCAkLyA9ICJcMCI7CisJbXkgJHN0YXRlID0gJ21ldGEnOworCW15IEBtb2RzOworCXdoaWxlICg8JGRpZmZfZmg+KSB7CisJCWNob21wICRfOyAjIHRoaXMgZ2V0cyByaWQgb2YgdGhlIHRyYWlsaW5nICJcMCIKKwkJaWYgKCRzdGF0ZSBlcSAnbWV0YScgJiYgL146KFxkezZ9KVxzKFxkezZ9KVxzCisJCQkJCSQ6OnNoYTFccygkOjpzaGExKVxzCisJCQkJCShbTVRDUkFEXSlcZCokL3hvKSB7CisJCQlwdXNoIEBtb2RzLCB7CW1vZGVfYSA9PiAkMSwgbW9kZV9iID0+ICQyLAorCQkJCQlzaGExX2IgPT4gJDMsIGNoZyA9PiAkNCB9OworCQkJaWYgKCQ0ID1+IC9eKD86Q3xSKSQvKSB7CisJCQkJJHN0YXRlID0gJ2ZpbGVfYSc7CisJCQl9IGVsc2UgeworCQkJCSRzdGF0ZSA9ICdmaWxlX2InOworCQkJfQorCQl9IGVsc2lmICgkc3RhdGUgZXEgJ2ZpbGVfYScpIHsKKwkJCW15ICR4ID0gJG1vZHNbJCNtb2RzXSBvciBjcm9hayAiRW1wdHkgYXJyYXlcbiI7CisJCQlpZiAoJHgtPntjaGd9ICF+IC9eKD86Q3xSKSQvKSB7CisJCQkJY3JvYWsgIkVycm9yIHBhcnNpbmcgJF8sICR4LT57Y2hnfVxuIjsKKwkJCX0KKwkJCSR4LT57ZmlsZV9hfSA9ICRfOworCQkJJHN0YXRlID0gJ2ZpbGVfYic7CisJCX0gZWxzaWYgKCRzdGF0ZSBlcSAnZmlsZV9iJykgeworCQkJbXkgJHggPSAkbW9kc1skI21vZHNdIG9yIGNyb2FrICJFbXB0eSBhcnJheVxuIjsKKwkJCWlmIChleGlzdHMgJHgtPntmaWxlX2F9ICYmICR4LT57Y2hnfSAhfiAvXig/OkN8UikkLykgeworCQkJCWNyb2FrICJFcnJvciBwYXJzaW5nICRfLCAkeC0+e2NoZ31cbiI7CisJCQl9CisJCQlpZiAoIWV4aXN0cyAkeC0+e2ZpbGVfYX0gJiYgJHgtPntjaGd9ID1+IC9eKD86Q3xSKSQvKSB7CisJCQkJY3JvYWsgIkVycm9yIHBhcnNpbmcgJF8sICR4LT57Y2hnfVxuIjsKKwkJCX0KKwkJCSR4LT57ZmlsZV9ifSA9ICRfOworCQkJJHN0YXRlID0gJ21ldGEnOworCQl9IGVsc2UgeworCQkJY3JvYWsgIkVycm9yIHBhcnNpbmcgJF9cbiI7CisJCX0KKwl9CisJY29tbWFuZF9jbG9zZV9waXBlKCRkaWZmX2ZoLCAkY3R4KTsKKwlcQG1vZHM7Cit9CisKK3N1YiBjaGVja19kaWZmX3BhdGhzIHsKKwlteSAoJHJhLCAkcGZ4LCAkcmV2LCAkbW9kcykgPSBAXzsKKwlteSAldHlwZXM7CisJJHBmeCAuPSAnLycgaWYgbGVuZ3RoICRwZng7CisKKwlzdWIgdHlwZV9kaWZmX3BhdGhzIHsKKwkJbXkgKCRyYSwgJHR5cGVzLCAkcGF0aCwgJHJldikgPSBAXzsKKwkJbXkgQHAgPSBzcGxpdCBtIy8rIywgJHBhdGg7CisJCW15ICRjID0gc2hpZnQgQHA7CisJCXVubGVzcyAoZGVmaW5lZCAkdHlwZXMtPnskY30pIHsKKwkJCSR0eXBlcy0+eyRjfSA9ICRyYS0+Y2hlY2tfcGF0aCgkYywgJHJldik7CisJCX0KKwkJd2hpbGUgKEBwKSB7CisJCQkkYyAuPSAnLycgLiBzaGlmdCBAcDsKKwkJCW5leHQgaWYgZGVmaW5lZCAkdHlwZXMtPnskY307CisJCQkkdHlwZXMtPnskY30gPSAkcmEtPmNoZWNrX3BhdGgoJGMsICRyZXYpOworCQl9CisJfQorCisJZm9yZWFjaCBteSAkbSAoQCRtb2RzKSB7CisJCWZvcmVhY2ggbXkgJGYgKHF3L2ZpbGVfYSBmaWxlX2IvKSB7CisJCQluZXh0IHVubGVzcyBkZWZpbmVkICRtLT57JGZ9OworCQkJbXkgKCRkaXIpID0gKCRtLT57JGZ9ID1+IG0jXiguKj8pLz8oPzpbXi9dKykkIyk7CisJCQlpZiAobGVuZ3RoICRwZnguJGRpciAmJiAhIGRlZmluZWQgJHR5cGVzeyRkaXJ9KSB7CisJCQkJdHlwZV9kaWZmX3BhdGhzKCRyYSwgXCV0eXBlcywgJHBmeC4kZGlyLCAkcmV2KTsKKwkJCX0KKwkJfQorCX0KKwlcJXR5cGVzOworfQorCitzdWIgc3BsaXRfcGF0aCB7CisJcmV0dXJuICgkX1swXSA9fiBtI14oLio/KS8/KFteL10rKSQjKTsKK30KKworc3ViIHJlcG9fcGF0aCB7CisJbXkgKCRzZWxmLCAkcGF0aCkgPSBAXzsKKwkkc2VsZi0+e3BhdGhfcHJlZml4fS4oZGVmaW5lZCAkcGF0aCA/ICRwYXRoIDogJycpOworfQorCitzdWIgdXJsX3BhdGggeworCW15ICgkc2VsZiwgJHBhdGgpID0gQF87CisJaWYgKCRzZWxmLT57dXJsfSA9fiBtI15odHRwcz86Ly8jKSB7CisJCSRwYXRoID1+IHMvKFteYS16QS1aMC05Xy4tXSkvdWMgc3ByaW50ZigiJSUlMDJ4IixvcmQoJDEpKS9lZzsKKwl9CisJJHNlbGYtPnt1cmx9IC4gJy8nIC4gJHNlbGYtPnJlcG9fcGF0aCgkcGF0aCk7Cit9CisKK3N1YiBybWRpcnMgeworCW15ICgkc2VsZikgPSBAXzsKKwlteSAkcm0gPSAkc2VsZi0+e3JtfTsKKwlkZWxldGUgJHJtLT57Jyd9OyAjIHdlIG5ldmVyIGRlbGV0ZSB0aGUgdXJsIHdlJ3JlIHRyYWNraW5nCisJcmV0dXJuIHVubGVzcyAlJHJtOworCisJZm9yZWFjaCAoa2V5cyAlJHJtKSB7CisJCW15IEBkID0gc3BsaXQgbSMvIywgJF87CisJCW15ICRjID0gc2hpZnQgQGQ7CisJCSRybS0+eyRjfSA9IDE7CisJCXdoaWxlIChAZCkgeworCQkJJGMgLj0gJy8nIC4gc2hpZnQgQGQ7CisJCQkkcm0tPnskY30gPSAxOworCQl9CisJfQorCWRlbGV0ZSAkcm0tPnskc2VsZi0+e3N2bl9wYXRofX07CisJZGVsZXRlICRybS0+eycnfTsgIyB3ZSBuZXZlciBkZWxldGUgdGhlIHVybCB3ZSdyZSB0cmFja2luZworCXJldHVybiB1bmxlc3MgJSRybTsKKworCW15ICgkZmgsICRjdHgpID0gY29tbWFuZF9vdXRwdXRfcGlwZShxdy9scy10cmVlIC0tbmFtZS1vbmx5IC1yIC16LywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPnt0cmVlX2J9KTsKKwlsb2NhbCAkLyA9ICJcMCI7CisJd2hpbGUgKDwkZmg+KSB7CisJCWNob21wOworCQlteSBAZG4gPSBzcGxpdCBtIy8jLCAkXzsKKwkJd2hpbGUgKHBvcCBAZG4pIHsKKwkJCWRlbGV0ZSAkcm0tPntqb2luICcvJywgQGRufTsKKwkJfQorCQl1bmxlc3MgKCUkcm0pIHsKKwkJCWNsb3NlICRmaDsKKwkJCXJldHVybjsKKwkJfQorCX0KKwljb21tYW5kX2Nsb3NlX3BpcGUoJGZoLCAkY3R4KTsKKworCW15ICgkciwgJHAsICRiYXQpID0gKCRzZWxmLT57cn0sICRzZWxmLT57cG9vbH0sICRzZWxmLT57YmF0fSk7CisJZm9yZWFjaCBteSAkZCAoc29ydCB7ICRiID1+IHRyIy8jLyMgPD0+ICRhID1+IHRyIy8jLyMgfSBrZXlzICUkcm0pIHsKKwkJJHNlbGYtPmNsb3NlX2RpcmVjdG9yeSgkYmF0LT57JGR9LCAkcCk7CisJCW15ICgkZG4pID0gKCRkID1+IG0jXiguKj8pLz8oPzpbXi9dKykkIyk7CisJCXByaW50ICJcdEQrXHQkZC9cbiIgdW5sZXNzICQ6Ol9xOworCQkkc2VsZi0+U1VQRVI6OmRlbGV0ZV9lbnRyeSgkZCwgJHIsICRiYXQtPnskZG59LCAkcCk7CisJCWRlbGV0ZSAkYmF0LT57JGR9OworCX0KK30KKworc3ViIG9wZW5fb3JfYWRkX2RpciB7CisJbXkgKCRzZWxmLCAkZnVsbF9wYXRoLCAkYmF0b24pID0gQF87CisJbXkgJHQgPSAkc2VsZi0+e3R5cGVzfS0+eyRmdWxsX3BhdGh9OworCWlmICghZGVmaW5lZCAkdCkgeworCQlkaWUgIiRmdWxsX3BhdGggbm90IGtub3duIGluIHIkc2VsZi0+e3J9IG9yIHdlIGhhdmUgYSBidWchXG4iOworCX0KKwl7CisJCW5vIHdhcm5pbmdzICdvbmNlJzsKKwkJIyBTVk46Ok5vZGU6Om5vbmUgYW5kIFNWTjo6Tm9kZTo6ZmlsZSBhcmUgdXNlZCBvbmx5IG9uY2UsCisJCSMgc28gd2UncmUgc2h1dHRpbmcgdXAgUGVybCdzIHdhcm5pbmdzIGFib3V0IHRoZW0uCisJCWlmICgkdCA9PSAkU1ZOOjpOb2RlOjpub25lKSB7CisJCQlyZXR1cm4gJHNlbGYtPmFkZF9kaXJlY3RvcnkoJGZ1bGxfcGF0aCwgJGJhdG9uLAorCQkJICAgIHVuZGVmLCAtMSwgJHNlbGYtPntwb29sfSk7CisJCX0gZWxzaWYgKCR0ID09ICRTVk46Ok5vZGU6OmRpcikgeworCQkJcmV0dXJuICRzZWxmLT5vcGVuX2RpcmVjdG9yeSgkZnVsbF9wYXRoLCAkYmF0b24sCisJCQkgICAgJHNlbGYtPntyfSwgJHNlbGYtPntwb29sfSk7CisJCX0gIyBubyB3YXJuaW5ncyAnb25jZScKKwkJcHJpbnQgU1RERVJSICIkZnVsbF9wYXRoIGFscmVhZHkgZXhpc3RzIGluIHJlcG9zaXRvcnkgYXQgIiwKKwkJICAgICJyJHNlbGYtPntyfSBhbmQgaXQgaXMgbm90IGEgZGlyZWN0b3J5ICgiLAorCQkgICAgKCR0ID09ICRTVk46Ok5vZGU6OmZpbGUgPyAnZmlsZScgOiAndW5rbm93bicpLCIvJHQpXG4iOworCX0gIyBubyB3YXJuaW5ncyAnb25jZScKKwlleGl0IDE7Cit9CisKK3N1YiBlbnN1cmVfcGF0aCB7CisJbXkgKCRzZWxmLCAkcGF0aCkgPSBAXzsKKwlteSAkYmF0ID0gJHNlbGYtPntiYXR9OworCW15ICRyZXBvX3BhdGggPSAkc2VsZi0+cmVwb19wYXRoKCRwYXRoKTsKKwlyZXR1cm4gJGJhdC0+eycnfSB1bmxlc3MgKGxlbmd0aCAkcmVwb19wYXRoKTsKKwlteSBAcCA9IHNwbGl0IG0jLysjLCAkcmVwb19wYXRoOworCW15ICRjID0gc2hpZnQgQHA7CisJJGJhdC0+eyRjfSB8fD0gJHNlbGYtPm9wZW5fb3JfYWRkX2RpcigkYywgJGJhdC0+eycnfSk7CisJd2hpbGUgKEBwKSB7CisJCW15ICRjMCA9ICRjOworCQkkYyAuPSAnLycgLiBzaGlmdCBAcDsKKwkJJGJhdC0+eyRjfSB8fD0gJHNlbGYtPm9wZW5fb3JfYWRkX2RpcigkYywgJGJhdC0+eyRjMH0pOworCX0KKwlyZXR1cm4gJGJhdC0+eyRjfTsKK30KKworc3ViIEEgeworCW15ICgkc2VsZiwgJG0pID0gQF87CisJbXkgKCRkaXIsICRmaWxlKSA9IHNwbGl0X3BhdGgoJG0tPntmaWxlX2J9KTsKKwlteSAkcGJhdCA9ICRzZWxmLT5lbnN1cmVfcGF0aCgkZGlyKTsKKwlteSAkZmJhdCA9ICRzZWxmLT5hZGRfZmlsZSgkc2VsZi0+cmVwb19wYXRoKCRtLT57ZmlsZV9ifSksICRwYmF0LAorCQkJCQl1bmRlZiwgLTEpOworCXByaW50ICJcdEFcdCRtLT57ZmlsZV9ifVxuIiB1bmxlc3MgJDo6X3E7CisJJHNlbGYtPmNoZ19maWxlKCRmYmF0LCAkbSk7CisJJHNlbGYtPmNsb3NlX2ZpbGUoJGZiYXQsdW5kZWYsJHNlbGYtPntwb29sfSk7Cit9CisKK3N1YiBDIHsKKwlteSAoJHNlbGYsICRtKSA9IEBfOworCW15ICgkZGlyLCAkZmlsZSkgPSBzcGxpdF9wYXRoKCRtLT57ZmlsZV9ifSk7CisJbXkgJHBiYXQgPSAkc2VsZi0+ZW5zdXJlX3BhdGgoJGRpcik7CisJbXkgJGZiYXQgPSAkc2VsZi0+YWRkX2ZpbGUoJHNlbGYtPnJlcG9fcGF0aCgkbS0+e2ZpbGVfYn0pLCAkcGJhdCwKKwkJCQkkc2VsZi0+dXJsX3BhdGgoJG0tPntmaWxlX2F9KSwgJHNlbGYtPntyfSk7CisJcHJpbnQgIlx0Q1x0JG0tPntmaWxlX2F9ID0+ICRtLT57ZmlsZV9ifVxuIiB1bmxlc3MgJDo6X3E7CisJJHNlbGYtPmNoZ19maWxlKCRmYmF0LCAkbSk7CisJJHNlbGYtPmNsb3NlX2ZpbGUoJGZiYXQsdW5kZWYsJHNlbGYtPntwb29sfSk7Cit9CisKK3N1YiBkZWxldGVfZW50cnkgeworCW15ICgkc2VsZiwgJHBhdGgsICRwYmF0KSA9IEBfOworCW15ICRycGF0aCA9ICRzZWxmLT5yZXBvX3BhdGgoJHBhdGgpOworCW15ICgkZGlyLCAkZmlsZSkgPSBzcGxpdF9wYXRoKCRycGF0aCk7CisJJHNlbGYtPntybX0tPnskZGlyfSA9IDE7CisJJHNlbGYtPlNVUEVSOjpkZWxldGVfZW50cnkoJHJwYXRoLCAkc2VsZi0+e3J9LCAkcGJhdCwgJHNlbGYtPntwb29sfSk7Cit9CisKK3N1YiBSIHsKKwlteSAoJHNlbGYsICRtKSA9IEBfOworCW15ICgkZGlyLCAkZmlsZSkgPSBzcGxpdF9wYXRoKCRtLT57ZmlsZV9ifSk7CisJbXkgJHBiYXQgPSAkc2VsZi0+ZW5zdXJlX3BhdGgoJGRpcik7CisJbXkgJGZiYXQgPSAkc2VsZi0+YWRkX2ZpbGUoJHNlbGYtPnJlcG9fcGF0aCgkbS0+e2ZpbGVfYn0pLCAkcGJhdCwKKwkJCQkkc2VsZi0+dXJsX3BhdGgoJG0tPntmaWxlX2F9KSwgJHNlbGYtPntyfSk7CisJcHJpbnQgIlx0Ulx0JG0tPntmaWxlX2F9ID0+ICRtLT57ZmlsZV9ifVxuIiB1bmxlc3MgJDo6X3E7CisJJHNlbGYtPmNoZ19maWxlKCRmYmF0LCAkbSk7CisJJHNlbGYtPmNsb3NlX2ZpbGUoJGZiYXQsdW5kZWYsJHNlbGYtPntwb29sfSk7CisKKwkoJGRpciwgJGZpbGUpID0gc3BsaXRfcGF0aCgkbS0+e2ZpbGVfYX0pOworCSRwYmF0ID0gJHNlbGYtPmVuc3VyZV9wYXRoKCRkaXIpOworCSRzZWxmLT5kZWxldGVfZW50cnkoJG0tPntmaWxlX2F9LCAkcGJhdCk7Cit9CisKK3N1YiBNIHsKKwlteSAoJHNlbGYsICRtKSA9IEBfOworCW15ICgkZGlyLCAkZmlsZSkgPSBzcGxpdF9wYXRoKCRtLT57ZmlsZV9ifSk7CisJbXkgJHBiYXQgPSAkc2VsZi0+ZW5zdXJlX3BhdGgoJGRpcik7CisJbXkgJGZiYXQgPSAkc2VsZi0+b3Blbl9maWxlKCRzZWxmLT5yZXBvX3BhdGgoJG0tPntmaWxlX2J9KSwKKwkJCQkkcGJhdCwkc2VsZi0+e3J9LCRzZWxmLT57cG9vbH0pOworCXByaW50ICJcdCRtLT57Y2hnfVx0JG0tPntmaWxlX2J9XG4iIHVubGVzcyAkOjpfcTsKKwkkc2VsZi0+Y2hnX2ZpbGUoJGZiYXQsICRtKTsKKwkkc2VsZi0+Y2xvc2VfZmlsZSgkZmJhdCx1bmRlZiwkc2VsZi0+e3Bvb2x9KTsKK30KKworc3ViIFQgeyBzaGlmdC0+TShAXykgfQorCitzdWIgY2hhbmdlX2ZpbGVfcHJvcCB7CisJbXkgKCRzZWxmLCAkZmJhdCwgJHBuYW1lLCAkcHZhbCkgPSBAXzsKKwkkc2VsZi0+U1VQRVI6OmNoYW5nZV9maWxlX3Byb3AoJGZiYXQsICRwbmFtZSwgJHB2YWwsICRzZWxmLT57cG9vbH0pOworfQorCitzdWIgY2hnX2ZpbGUgeworCW15ICgkc2VsZiwgJGZiYXQsICRtKSA9IEBfOworCWlmICgkbS0+e21vZGVfYn0gPX4gLzc1NSQvICYmICRtLT57bW9kZV9hfSAhfiAvNzU1JC8pIHsKKwkJJHNlbGYtPmNoYW5nZV9maWxlX3Byb3AoJGZiYXQsJ3N2bjpleGVjdXRhYmxlJywnKicpOworCX0gZWxzaWYgKCRtLT57bW9kZV9ifSAhfiAvNzU1JC8gJiYgJG0tPnttb2RlX2F9ID1+IC83NTUkLykgeworCQkkc2VsZi0+Y2hhbmdlX2ZpbGVfcHJvcCgkZmJhdCwnc3ZuOmV4ZWN1dGFibGUnLHVuZGVmKTsKKwl9CisJbXkgJGZoID0gSU86OkZpbGUtPm5ld190bXBmaWxlIG9yIGNyb2FrICQhOworCWlmICgkbS0+e21vZGVfYn0gPX4gL14xMjAvKSB7CisJCXByaW50ICRmaCAnbGluayAnIG9yIGNyb2FrICQhOworCQkkc2VsZi0+Y2hhbmdlX2ZpbGVfcHJvcCgkZmJhdCwnc3ZuOnNwZWNpYWwnLCcqJyk7CisJfSBlbHNpZiAoJG0tPnttb2RlX2F9ID1+IC9eMTIwLyAmJiAkbS0+e21vZGVfYn0gIX4gL14xMjAvKSB7CisJCSRzZWxmLT5jaGFuZ2VfZmlsZV9wcm9wKCRmYmF0LCdzdm46c3BlY2lhbCcsdW5kZWYpOworCX0KKwlkZWZpbmVkKG15ICRwaWQgPSBmb3JrKSBvciBjcm9hayAkITsKKwlpZiAoISRwaWQpIHsKKwkJb3BlbiBTVERPVVQsICc+JicsICRmaCBvciBjcm9hayAkITsKKwkJZXhlYyBxdy9naXQtY2F0LWZpbGUgYmxvYi8sICRtLT57c2hhMV9ifSBvciBjcm9hayAkITsKKwl9CisJd2FpdHBpZCAkcGlkLCAwOworCWNyb2FrICQ/IGlmICQ/OworCSRmaC0+Zmx1c2ggPT0gMCBvciBjcm9hayAkITsKKwlzZWVrICRmaCwgMCwgMCBvciBjcm9hayAkITsKKworCW15ICRleHAgPSA6Om1kNXN1bSgkZmgpOworCXNlZWsgJGZoLCAwLCAwIG9yIGNyb2FrICQhOworCisJbXkgJHBvb2wgPSBTVk46OlBvb2wtPm5ldzsKKwlteSAkYXRkID0gJHNlbGYtPmFwcGx5X3RleHRkZWx0YSgkZmJhdCwgdW5kZWYsICRwb29sKTsKKwlteSAkZ290ID0gU1ZOOjpUeERlbHRhOjpzZW5kX3N0cmVhbSgkZmgsIEAkYXRkLCAkcG9vbCk7CisJZGllICJDaGVja3N1bSBtaXNtYXRjaFxuZXhwZWN0ZWQ6ICRleHBcbmdvdDogJGdvdFxuIiBpZiAoJGdvdCBuZSAkZXhwKTsKKwkkcG9vbC0+Y2xlYXI7CisKKwljbG9zZSAkZmggb3IgY3JvYWsgJCE7Cit9CisKK3N1YiBEIHsKKwlteSAoJHNlbGYsICRtKSA9IEBfOworCW15ICgkZGlyLCAkZmlsZSkgPSBzcGxpdF9wYXRoKCRtLT57ZmlsZV9ifSk7CisJbXkgJHBiYXQgPSAkc2VsZi0+ZW5zdXJlX3BhdGgoJGRpcik7CisJcHJpbnQgIlx0RFx0JG0tPntmaWxlX2J9XG4iIHVubGVzcyAkOjpfcTsKKwkkc2VsZi0+ZGVsZXRlX2VudHJ5KCRtLT57ZmlsZV9ifSwgJHBiYXQpOworfQorCitzdWIgY2xvc2VfZWRpdCB7CisJbXkgKCRzZWxmKSA9IEBfOworCW15ICgkcCwkYmF0KSA9ICgkc2VsZi0+e3Bvb2x9LCAkc2VsZi0+e2JhdH0pOworCWZvcmVhY2ggKHNvcnQgeyAkYiA9fiB0ciMvIy8jIDw9PiAkYSA9fiB0ciMvIy8jIH0ga2V5cyAlJGJhdCkgeworCQluZXh0IGlmICRfIGVxICcnOworCQkkc2VsZi0+Y2xvc2VfZGlyZWN0b3J5KCRiYXQtPnskX30sICRwKTsKKwl9CisJJHNlbGYtPmNsb3NlX2RpcmVjdG9yeSgkYmF0LT57Jyd9LCAkcCk7CisJJHNlbGYtPlNVUEVSOjpjbG9zZV9lZGl0KCRwKTsKKwkkcC0+Y2xlYXI7Cit9CisKK3N1YiBhYm9ydF9lZGl0IHsKKwlteSAoJHNlbGYpID0gQF87CisJJHNlbGYtPlNVUEVSOjphYm9ydF9lZGl0KCRzZWxmLT57cG9vbH0pOworfQorCitzdWIgREVTVFJPWSB7CisJbXkgJHNlbGYgPSBzaGlmdDsKKwkkc2VsZi0+U1VQRVI6OkRFU1RST1koQF8pOworCSRzZWxmLT57cG9vbH0tPmNsZWFyOworfQorCisjIHRoaXMgZHJpdmVzIHRoZSBlZGl0b3IKK3N1YiBhcHBseV9kaWZmIHsKKwlteSAoJHNlbGYpID0gQF87CisJbXkgJG1vZHMgPSAkc2VsZi0+e21vZHN9OworCW15ICVvID0gKCBEID0+IDEsIFIgPT4gMCwgQyA9PiAtMSwgQSA9PiAzLCBNID0+IDMsIFQgPT4gMyApOworCWZvcmVhY2ggbXkgJG0gKHNvcnQgeyAkb3skYS0+e2NoZ319IDw9PiAkb3skYi0+e2NoZ319IH0gQCRtb2RzKSB7CisJCW15ICRmID0gJG0tPntjaGd9OworCQlpZiAoZGVmaW5lZCAkb3skZn0pIHsKKwkJCSRzZWxmLT4kZigkbSk7CisJCX0gZWxzZSB7CisJCQlmYXRhbCgiSW52YWxpZCBjaGFuZ2UgdHlwZTogJGYiKTsKKwkJfQorCX0KKwkkc2VsZi0+cm1kaXJzIGlmICRfcm1kaXI7CisJaWYgKEAkbW9kcyA9PSAwKSB7CisJCSRzZWxmLT5hYm9ydF9lZGl0OworCX0gZWxzZSB7CisJCSRzZWxmLT5jbG9zZV9lZGl0OworCX0KKwlyZXR1cm4gc2NhbGFyIEAkbW9kczsKK30KKworcGFja2FnZSBHaXQ6OlNWTjo6UmE7Cit1c2UgdmFycyBxdy9ASVNBICRjb25maWdfZGlyICRfbG9nX3dpbmRvd19zaXplLzsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CitteSAoJHJhX2ludmFsaWQsICRjYW5fZG9fc3dpdGNoLCAlaWdub3JlZF9lcnIsICRSQSk7CisKK0JFR0lOIHsKKwkjIGVuZm9yY2UgdGVtcG9yYXJ5IHBvb2wgdXNhZ2UgZm9yIHNvbWUgc2ltcGxlIGZ1bmN0aW9ucworCW5vIHN0cmljdCAncmVmcyc7CisJZm9yIG15ICRmIChxdy9yZXZfcHJvcGxpc3QgZ2V0X2xhdGVzdF9yZXZudW0gZ2V0X3V1aWQgZ2V0X3JlcG9zX3Jvb3QvKSB7CisJCW15ICRTVVBFUiA9ICJTVVBFUjo6JGYiOworCQkqJGYgPSBzdWIgeworCQkJbXkgJHNlbGYgPSBzaGlmdDsKKwkJCW15ICRwb29sID0gU1ZOOjpQb29sLT5uZXc7CisJCQlteSBAcmV0ID0gJHNlbGYtPiRTVVBFUihAXywkcG9vbCk7CisJCQkkcG9vbC0+Y2xlYXI7CisJCQl3YW50YXJyYXkgPyBAcmV0IDogJHJldFswXTsKKwkJfTsKKwl9Cit9CisKK3N1YiBfYXV0aF9wcm92aWRlcnMgKCkgeworCVsKKwkgIFNWTjo6Q2xpZW50OjpnZXRfc2ltcGxlX3Byb3ZpZGVyKCksCisJICBTVk46OkNsaWVudDo6Z2V0X3NzbF9zZXJ2ZXJfdHJ1c3RfZmlsZV9wcm92aWRlcigpLAorCSAgU1ZOOjpDbGllbnQ6OmdldF9zaW1wbGVfcHJvbXB0X3Byb3ZpZGVyKAorCSAgICBcJkdpdDo6U1ZOOjpQcm9tcHQ6OnNpbXBsZSwgMiksCisJICBTVk46OkNsaWVudDo6Z2V0X3NzbF9jbGllbnRfY2VydF9maWxlX3Byb3ZpZGVyKCksCisJICBTVk46OkNsaWVudDo6Z2V0X3NzbF9jbGllbnRfY2VydF9wcm9tcHRfcHJvdmlkZXIoCisJICAgIFwmR2l0OjpTVk46OlByb21wdDo6c3NsX2NsaWVudF9jZXJ0LCAyKSwKKwkgIFNWTjo6Q2xpZW50OjpnZXRfc3NsX2NsaWVudF9jZXJ0X3B3X2ZpbGVfcHJvdmlkZXIoKSwKKwkgIFNWTjo6Q2xpZW50OjpnZXRfc3NsX2NsaWVudF9jZXJ0X3B3X3Byb21wdF9wcm92aWRlcigKKwkgICAgXCZHaXQ6OlNWTjo6UHJvbXB0Ojpzc2xfY2xpZW50X2NlcnRfcHcsIDIpLAorCSAgU1ZOOjpDbGllbnQ6OmdldF91c2VybmFtZV9wcm92aWRlcigpLAorCSAgU1ZOOjpDbGllbnQ6OmdldF9zc2xfc2VydmVyX3RydXN0X3Byb21wdF9wcm92aWRlcigKKwkgICAgXCZHaXQ6OlNWTjo6UHJvbXB0Ojpzc2xfc2VydmVyX3RydXN0KSwKKwkgIFNWTjo6Q2xpZW50OjpnZXRfdXNlcm5hbWVfcHJvbXB0X3Byb3ZpZGVyKAorCSAgICBcJkdpdDo6U1ZOOjpQcm9tcHQ6OnVzZXJuYW1lLCAyKQorCV0KK30KKworc3ViIGVzY2FwZV91cmlfb25seSB7CisJbXkgKCR1cmkpID0gQF87CisJbXkgQHRtcDsKKwlmb3JlYWNoIChzcGxpdCBtey99LCAkdXJpKSB7CisJCXMvKFteXHcuJS1dfCUoPyFbYS1mQS1GMC05XXsyfSkpL3NwcmludGYoIiUlJTAyWCIsb3JkKCQxKSkvZWc7CisJCXB1c2ggQHRtcCwgJF87CisJfQorCWpvaW4oJy8nLCBAdG1wKTsKK30KKworc3ViIGVzY2FwZV91cmwgeworCW15ICgkdXJsKSA9IEBfOworCWlmICgkdXJsID1+IG0jXihodHRwcz8pOi8vKFteL10rKSguKikkIykgeworCQlteSAoJHNjaGVtZSwgJGRvbWFpbiwgJHVyaSkgPSAoJDEsICQyLCBlc2NhcGVfdXJpX29ubHkoJDMpKTsKKwkJJHVybCA9ICIkc2NoZW1lOi8vJGRvbWFpbiR1cmkiOworCX0KKwkkdXJsOworfQorCitzdWIgbmV3IHsKKwlteSAoJGNsYXNzLCAkdXJsKSA9IEBfOworCSR1cmwgPX4gcyEvKyQhITsKKwlyZXR1cm4gJFJBIGlmICgkUkEgJiYgJFJBLT57dXJsfSBlcSAkdXJsKTsKKworCVNWTjo6X0NvcmU6OnN2bl9jb25maWdfZW5zdXJlKCRjb25maWdfZGlyLCB1bmRlZik7CisJbXkgKCRiYXRvbiwgJGNhbGxiYWNrcykgPSBTVk46OkNvcmU6OmF1dGhfb3Blbl9oZWxwZXIoX2F1dGhfcHJvdmlkZXJzKTsKKwlteSAkY29uZmlnID0gU1ZOOjpDb3JlOjpjb25maWdfZ2V0X2NvbmZpZygkY29uZmlnX2Rpcik7CisJJFJBID0gdW5kZWY7CisJbXkgJGRvbnRfc3RvcmVfcGFzc3dvcmRzID0gMTsKKwlteSAkY29uZl90ID0gJHskY29uZmlnfXsnY29uZmlnJ307CisJeworCQlubyB3YXJuaW5ncyAnb25jZSc7CisJCSMgVGhlIHVzYWdlIG9mICRTVk46Ol9Db3JlOjpTVk5fQ09ORklHXyogdmFyaWFibGVzCisJCSMgcHJvZHVjZXMgd2FybmluZ3MgdGhhdCB2YXJpYWJsZXMgYXJlIHVzZWQgb25seSBvbmNlLgorCQkjIEkgaGFkIG5vdCBmb3VuZCB0aGUgYmV0dGVyIHdheSB0byBzaHV0IHRoZW0gdXAsIHNvCisJCSMgdGhlIHdhcm5pbmdzIG9mIHR5cGUgJ29uY2UnIGFyZSBkaXNhYmxlZCBpbiB0aGlzIGJsb2NrLgorCQlpZiAoU1ZOOjpfQ29yZTo6c3ZuX2NvbmZpZ19nZXRfYm9vbCgkY29uZl90LAorCQkgICAgJFNWTjo6X0NvcmU6OlNWTl9DT05GSUdfU0VDVElPTl9BVVRILAorCQkgICAgJFNWTjo6X0NvcmU6OlNWTl9DT05GSUdfT1BUSU9OX1NUT1JFX1BBU1NXT1JEUywKKwkJICAgIDEpID09IDApIHsKKwkJCVNWTjo6X0NvcmU6OnN2bl9hdXRoX3NldF9wYXJhbWV0ZXIoJGJhdG9uLAorCQkJICAgICRTVk46Ol9Db3JlOjpTVk5fQVVUSF9QQVJBTV9ET05UX1NUT1JFX1BBU1NXT1JEUywKKwkJCSAgICBibGVzcyAoXCRkb250X3N0b3JlX3Bhc3N3b3JkcywgIl9wX3ZvaWQiKSk7CisJCX0KKwkJaWYgKFNWTjo6X0NvcmU6OnN2bl9jb25maWdfZ2V0X2Jvb2woJGNvbmZfdCwKKwkJICAgICRTVk46Ol9Db3JlOjpTVk5fQ09ORklHX1NFQ1RJT05fQVVUSCwKKwkJICAgICRTVk46Ol9Db3JlOjpTVk5fQ09ORklHX09QVElPTl9TVE9SRV9BVVRIX0NSRURTLAorCQkgICAgMSkgPT0gMCkgeworCQkJJEdpdDo6U1ZOOjpQcm9tcHQ6Ol9ub19hdXRoX2NhY2hlID0gMTsKKwkJfQorCX0gIyBubyB3YXJuaW5ncyAnb25jZScKKwlteSAkc2VsZiA9IFNWTjo6UmEtPm5ldyh1cmwgPT4gZXNjYXBlX3VybCgkdXJsKSwgYXV0aCA9PiAkYmF0b24sCisJICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9PiAkY29uZmlnLAorCQkJICAgICAgcG9vbCA9PiBTVk46OlBvb2wtPm5ldywKKwkgICAgICAgICAgICAgICAgICAgICAgYXV0aF9wcm92aWRlcl9jYWxsYmFja3MgPT4gJGNhbGxiYWNrcyk7CisJJHNlbGYtPnt1cmx9ID0gJHVybDsKKwkkc2VsZi0+e3N2bl9wYXRofSA9ICR1cmw7CisJJHNlbGYtPntyZXBvc19yb290fSA9ICRzZWxmLT5nZXRfcmVwb3Nfcm9vdDsKKwkkc2VsZi0+e3N2bl9wYXRofSA9fiBzI15cUSRzZWxmLT57cmVwb3Nfcm9vdH1cRSgvfCQpIyM7CisJJHNlbGYtPntjYWNoZX0gPSB7IGNoZWNrX3BhdGggPT4geyByID0+IDAsIGRhdGEgPT4ge30gfSwKKwkgICAgICAgICAgICAgICAgICAgZ2V0X2RpciA9PiB7IHIgPT4gMCwgZGF0YSA9PiB7fSB9IH07CisJJFJBID0gYmxlc3MgJHNlbGYsICRjbGFzczsKK30KKworc3ViIGNoZWNrX3BhdGggeworCW15ICgkc2VsZiwgJHBhdGgsICRyKSA9IEBfOworCW15ICRjYWNoZSA9ICRzZWxmLT57Y2FjaGV9LT57Y2hlY2tfcGF0aH07CisJaWYgKCRyID09ICRjYWNoZS0+e3J9ICYmIGV4aXN0cyAkY2FjaGUtPntkYXRhfS0+eyRwYXRofSkgeworCQlyZXR1cm4gJGNhY2hlLT57ZGF0YX0tPnskcGF0aH07CisJfQorCW15ICRwb29sID0gU1ZOOjpQb29sLT5uZXc7CisJbXkgJHQgPSAkc2VsZi0+U1VQRVI6OmNoZWNrX3BhdGgoJHBhdGgsICRyLCAkcG9vbCk7CisJJHBvb2wtPmNsZWFyOworCWlmICgkciAhPSAkY2FjaGUtPntyfSkgeworCQkleyRjYWNoZS0+e2RhdGF9fSA9ICgpOworCQkkY2FjaGUtPntyfSA9ICRyOworCX0KKwkkY2FjaGUtPntkYXRhfS0+eyRwYXRofSA9ICR0OworfQorCitzdWIgZ2V0X2RpciB7CisJbXkgKCRzZWxmLCAkZGlyLCAkcikgPSBAXzsKKwlteSAkY2FjaGUgPSAkc2VsZi0+e2NhY2hlfS0+e2dldF9kaXJ9OworCWlmICgkciA9PSAkY2FjaGUtPntyfSkgeworCQlpZiAobXkgJHggPSAkY2FjaGUtPntkYXRhfS0+eyRkaXJ9KSB7CisJCQlyZXR1cm4gd2FudGFycmF5ID8gQCR4IDogJHgtPlswXTsKKwkJfQorCX0KKwlteSAkcG9vbCA9IFNWTjo6UG9vbC0+bmV3OworCW15ICgkZCwgdW5kZWYsICRwcm9wcykgPSAkc2VsZi0+U1VQRVI6OmdldF9kaXIoJGRpciwgJHIsICRwb29sKTsKKwlteSAlZGlyZW50cyA9IG1hcCB7ICRfID0+IHsga2luZCA9PiAkZC0+eyRffS0+a2luZCB9IH0ga2V5cyAlJGQ7CisJJHBvb2wtPmNsZWFyOworCWlmICgkciAhPSAkY2FjaGUtPntyfSkgeworCQkleyRjYWNoZS0+e2RhdGF9fSA9ICgpOworCQkkY2FjaGUtPntyfSA9ICRyOworCX0KKwkkY2FjaGUtPntkYXRhfS0+eyRkaXJ9ID0gWyBcJWRpcmVudHMsICRyLCAkcHJvcHMgXTsKKwl3YW50YXJyYXkgPyAoXCVkaXJlbnRzLCAkciwgJHByb3BzKSA6IFwlZGlyZW50czsKK30KKworc3ViIERFU1RST1kgeworCSMgZG8gbm90IGNhbGwgdGhlIHJlYWwgREVTVFJPWSBzaW5jZSB3ZSBzdG9yZSBvdXJzZWx2ZXMgaW4gJFJBCit9CisKK3N1YiBnZXRfbG9nIHsKKwlteSAoJHNlbGYsIEBhcmdzKSA9IEBfOworCW15ICRwb29sID0gU1ZOOjpQb29sLT5uZXc7CisJc3BsaWNlKEBhcmdzLCAzLCAxKSBpZiAoJFNWTjo6Q29yZTo6VkVSU0lPTiBsZSAnMS4yLjAnKTsKKwlteSAkcmV0ID0gJHNlbGYtPlNVUEVSOjpnZXRfbG9nKEBhcmdzLCAkcG9vbCk7CisJJHBvb2wtPmNsZWFyOworCSRyZXQ7Cit9CisKK3N1YiB0cmVlc19tYXRjaCB7CisJbXkgKCRzZWxmLCAkdXJsMSwgJHJldjEsICR1cmwyLCAkcmV2MikgPSBAXzsKKwlteSAkY3R4ID0gU1ZOOjpDbGllbnQtPm5ldyhhdXRoID0+IF9hdXRoX3Byb3ZpZGVycyk7CisJbXkgJG91dCA9IElPOjpGaWxlLT5uZXdfdG1wZmlsZTsKKworCSMgb2xkZXIgU1ZOICgxLjEueCkgZG9lc24ndCB0YWtlICRwb29sIGFzIHRoZSBsYXN0IHBhcmFtZXRlciBmb3IKKwkjICRjdHgtPmRpZmYoKSwgc28gd2UnbGwgY3JlYXRlIGEgZGVmYXVsdCBvbmUKKwlteSAkcG9vbCA9IFNWTjo6UG9vbC0+bmV3X2RlZmF1bHRfc3ViOworCisJJHJhX2ludmFsaWQgPSAxOyAjIHRoaXMgd2lsbCBvcGVuIGEgbmV3IFNWTjo6UmEgY29ubmVjdGlvbiB0byAkdXJsMQorCSRjdHgtPmRpZmYoW10sICR1cmwxLCAkcmV2MSwgJHVybDIsICRyZXYyLCAxLCAxLCAwLCAkb3V0LCAkb3V0KTsKKwkkb3V0LT5mbHVzaDsKKwlteSAkcmV0ID0gKCgkb3V0LT5zdGF0KVs3XSA9PSAwKTsKKwljbG9zZSAkb3V0IG9yIGNyb2FrICQhOworCisJJHJldDsKK30KKworc3ViIGdldF9jb21taXRfZWRpdG9yIHsKKwlteSAoJHNlbGYsICRsb2csICRjYiwgJHBvb2wpID0gQF87CisJbXkgQGxvY2sgPSAkU1ZOOjpDb3JlOjpWRVJTSU9OIGdlICcxLjIuMCcgPyAodW5kZWYsIDApIDogKCk7CisJJHNlbGYtPlNVUEVSOjpnZXRfY29tbWl0X2VkaXRvcigkbG9nLCAkY2IsIEBsb2NrLCAkcG9vbCk7Cit9CisKK3N1YiBnc19kb191cGRhdGUgeworCW15ICgkc2VsZiwgJHJldl9hLCAkcmV2X2IsICRncywgJGVkaXRvcikgPSBAXzsKKwlteSAkbmV3ID0gKCRyZXZfYSA9PSAkcmV2X2IpOworCW15ICRwYXRoID0gJGdzLT57cGF0aH07CisKKwlpZiAoJG5ldyAmJiAtZSAkZ3MtPntpbmRleH0pIHsKKwkJdW5saW5rICRncy0+e2luZGV4fSBvciBkaWUKKwkJICAiQ291bGRuJ3QgdW5saW5rIGluZGV4OiAkZ3MtPntpbmRleH06ICQhXG4iOworCX0KKwlteSAkcG9vbCA9IFNWTjo6UG9vbC0+bmV3OworCSRlZGl0b3ItPnNldF9wYXRoX3N0cmlwKCRwYXRoKTsKKwlteSAoQHBjKSA9IHNwbGl0IG0jLyMsICRwYXRoOworCW15ICRyZXBvcnRlciA9ICRzZWxmLT5kb191cGRhdGUoJHJldl9iLCAoQHBjID8gc2hpZnQgQHBjIDogJycpLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgJGVkaXRvciwgJHBvb2wpOworCW15IEBsb2NrID0gJFNWTjo6Q29yZTo6VkVSU0lPTiBnZSAnMS4yLjAnID8gKHVuZGVmKSA6ICgpOworCisJIyBTaW5jZSB3ZSBjYW4ndCByZWx5IG9uIHN2bl9yYV9yZXBhcmVudCBiZWluZyBhdmFpbGFibGUsIHdlJ2xsCisJIyBqdXN0IGhhdmUgdG8gZG8gc29tZSBtYWdpYyB3aXRoIHNldF9wYXRoIHRvIG1ha2UgaXQgc28KKwkjIHdlIG9ubHkgd2FudCBhIHBhcnRpYWwgcGF0aC4KKwlteSAkc3AgPSAnJzsKKwlteSAkZmluYWwgPSBqb2luKCcvJywgQHBjKTsKKwl3aGlsZSAoQHBjKSB7CisJCSRyZXBvcnRlci0+c2V0X3BhdGgoJHNwLCAkcmV2X2IsIDAsIEBsb2NrLCAkcG9vbCk7CisJCSRzcCAuPSAnLycgaWYgbGVuZ3RoICRzcDsKKwkJJHNwIC49IHNoaWZ0IEBwYzsKKwl9CisJZGllICJCVUc6ICckc3AnICE9ICckZmluYWwnXG4iIGlmICgkc3AgbmUgJGZpbmFsKTsKKworCSRyZXBvcnRlci0+c2V0X3BhdGgoJHNwLCAkcmV2X2EsICRuZXcsIEBsb2NrLCAkcG9vbCk7CisKKwkkcmVwb3J0ZXItPmZpbmlzaF9yZXBvcnQoJHBvb2wpOworCSRwb29sLT5jbGVhcjsKKwkkZWRpdG9yLT57Z2l0X2NvbW1pdF9va307Cit9CisKKyMgdGhpcyByZXF1aXJlcyBTVk4gMS40LjMgb3IgbGF0ZXIgKGRvX3N3aXRjaCBkaWRuJ3Qgd29yayBiZWZvcmUgMS40LjMsIGFuZAorIyBzdm5fcmFfcmVwYXJlbnQgZGlkbid0IHdvcmsgYmVmb3JlIDEuNCkKK3N1YiBnc19kb19zd2l0Y2ggeworCW15ICgkc2VsZiwgJHJldl9hLCAkcmV2X2IsICRncywgJHVybF9iLCAkZWRpdG9yKSA9IEBfOworCW15ICRwYXRoID0gJGdzLT57cGF0aH07CisJbXkgJHBvb2wgPSBTVk46OlBvb2wtPm5ldzsKKworCW15ICRmdWxsX3VybCA9ICRzZWxmLT57dXJsfTsKKwlteSAkb2xkX3VybCA9ICRmdWxsX3VybDsKKwkkZnVsbF91cmwgLj0gJy8nIC4gZXNjYXBlX3VyaV9vbmx5KCRwYXRoKSBpZiBsZW5ndGggJHBhdGg7CisJbXkgKCRyYSwgJHJlcGFyZW50ZWQpOworCWlmICgkb2xkX3VybCBuZSAkZnVsbF91cmwpIHsKKwkJaWYgKCRvbGRfdXJsICF+IG0jXnN2bihcK3NzaCk/Oi8vIykgeworCQkJU1ZOOjpfUmE6OnN2bl9yYV9yZXBhcmVudCgkc2VsZi0+e3Nlc3Npb259LCAkZnVsbF91cmwsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICRwb29sKTsKKwkJCSRzZWxmLT57dXJsfSA9ICRmdWxsX3VybDsKKwkJCSRyZXBhcmVudGVkID0gMTsKKwkJfSBlbHNlIHsKKwkJCSRfWzBdID0gdW5kZWY7CisJCQkkc2VsZiA9IHVuZGVmOworCQkJJFJBID0gdW5kZWY7CisJCQkkcmEgPSBHaXQ6OlNWTjo6UmEtPm5ldygkZnVsbF91cmwpOworCQkJJHJhX2ludmFsaWQgPSAxOworCQl9CisJfQorCSRyYSB8fD0gJHNlbGY7CisJbXkgJHJlcG9ydGVyID0gJHJhLT5kb19zd2l0Y2goJHJldl9iLCAnJywgMSwgJHVybF9iLCAkZWRpdG9yLCAkcG9vbCk7CisJbXkgQGxvY2sgPSAkU1ZOOjpDb3JlOjpWRVJTSU9OIGdlICcxLjIuMCcgPyAodW5kZWYpIDogKCk7CisJJHJlcG9ydGVyLT5zZXRfcGF0aCgnJywgJHJldl9hLCAwLCBAbG9jaywgJHBvb2wpOworCSRyZXBvcnRlci0+ZmluaXNoX3JlcG9ydCgkcG9vbCk7CisKKwlpZiAoJHJlcGFyZW50ZWQpIHsKKwkJU1ZOOjpfUmE6OnN2bl9yYV9yZXBhcmVudCgkc2VsZi0+e3Nlc3Npb259LCAkb2xkX3VybCwgJHBvb2wpOworCQkkc2VsZi0+e3VybH0gPSAkb2xkX3VybDsKKwl9CisKKwkkcG9vbC0+Y2xlYXI7CisJJGVkaXRvci0+e2dpdF9jb21taXRfb2t9OworfQorCitzdWIgbG9uZ2VzdF9jb21tb25fcGF0aCB7CisJbXkgKCRnc3YsICRnbG9icykgPSBAXzsKKwlteSAlY29tbW9uOworCW15ICRjb21tb25fbWF4ID0gc2NhbGFyIEAkZ3N2OworCisJZm9yZWFjaCBteSAkZ3MgKEAkZ3N2KSB7CisJCW15IEB0bXAgPSBzcGxpdCBtIy8jLCAkZ3MtPntwYXRofTsKKwkJbXkgJHAgPSAnJzsKKwkJZm9yZWFjaCAoQHRtcCkgeworCQkJJHAgLj0gbGVuZ3RoKCRwKSA/ICIvJF8iIDogJF87CisJCQkkY29tbW9ueyRwfSB8fD0gMDsKKwkJCSRjb21tb257JHB9Kys7CisJCX0KKwl9CisJJGdsb2JzIHx8PSBbXTsKKwkkY29tbW9uX21heCArPSBzY2FsYXIgQCRnbG9iczsKKwlmb3JlYWNoIG15ICRnbG9iIChAJGdsb2JzKSB7CisJCW15IEB0bXAgPSBzcGxpdCBtIy8jLCAkZ2xvYi0+e3BhdGh9LT57bGVmdH07CisJCW15ICRwID0gJyc7CisJCWZvcmVhY2ggKEB0bXApIHsKKwkJCSRwIC49IGxlbmd0aCgkcCkgPyAiLyRfIiA6ICRfOworCQkJJGNvbW1vbnskcH0gfHw9IDA7CisJCQkkY29tbW9ueyRwfSsrOworCQl9CisJfQorCisJbXkgJGxvbmdlc3RfcGF0aCA9ICcnOworCWZvcmVhY2ggKHNvcnQge2xlbmd0aCAkYiA8PT4gbGVuZ3RoICRhfSBrZXlzICVjb21tb24pIHsKKwkJaWYgKCRjb21tb257JF99ID09ICRjb21tb25fbWF4KSB7CisJCQkkbG9uZ2VzdF9wYXRoID0gJF87CisJCQlsYXN0OworCQl9CisJfQorCSRsb25nZXN0X3BhdGg7Cit9CisKK3N1YiBnc19mZXRjaF9sb29wX2NvbW1vbiB7CisJbXkgKCRzZWxmLCAkYmFzZSwgJGhlYWQsICRnc3YsICRnbG9icykgPSBAXzsKKwlyZXR1cm4gaWYgKCRiYXNlID4gJGhlYWQpOworCW15ICRpbmMgPSAkX2xvZ193aW5kb3dfc2l6ZTsKKwlteSAoJG1pbiwgJG1heCkgPSAoJGJhc2UsICRoZWFkIDwgJGJhc2UgKyAkaW5jID8gJGhlYWQgOiAkYmFzZSArICRpbmMpOworCW15ICRsb25nZXN0X3BhdGggPSBsb25nZXN0X2NvbW1vbl9wYXRoKCRnc3YsICRnbG9icyk7CisJbXkgJHJhX3VybCA9ICRzZWxmLT57dXJsfTsKKwl3aGlsZSAoMSkgeworCQlteSAlcmV2czsKKwkJbXkgJGVycjsKKwkJbXkgJGVycl9oYW5kbGVyID0gJFNWTjo6RXJyb3I6OmhhbmRsZXI7CisJCSRTVk46OkVycm9yOjpoYW5kbGVyID0gc3ViIHsKKwkJCSgkZXJyKSA9IEBfOworCQkJc2tpcF91bmtub3duX3JldnMoJGVycik7CisJCX07CisJCXN1YiBfY2IgeworCQkJbXkgKCRwYXRocywgJHIsICRhdXRob3IsICRkYXRlLCAkbG9nKSA9IEBfOworCQkJWyBkdXBfY2hhbmdlZF9wYXRocygkcGF0aHMpLAorCQkJICB7IGF1dGhvciA9PiAkYXV0aG9yLCBkYXRlID0+ICRkYXRlLCBsb2cgPT4gJGxvZyB9IF07CisJCX0KKwkJJHNlbGYtPmdldF9sb2coWyRsb25nZXN0X3BhdGhdLCAkbWluLCAkbWF4LCAwLCAxLCAxLAorCQkgICAgICAgICAgICAgICBzdWIgeyAkcmV2c3skX1sxXX0gPSBfY2IoQF8pIH0pOworCQlpZiAoJGVyciAmJiAkbWF4ID49ICRoZWFkKSB7CisJCQlwcmludCBTVERFUlIgIlBhdGggJyRsb25nZXN0X3BhdGgnICIsCisJCQkJICAgICAid2FzIHByb2JhYmx5IGRlbGV0ZWQ6XG4iLAorCQkJCSAgICAgJGVyci0+ZXhwYW5kZWRfbWVzc2FnZSwKKwkJCQkgICAgICJcbldpbGwgYXR0ZW1wdCB0byBmb2xsb3cgIiwKKwkJCQkgICAgICJyZXZpc2lvbnMgciRtaW4gLi4gciRtYXggIiwKKwkJCQkgICAgICJjb21taXR0ZWQgYmVmb3JlIHRoZSBkZWxldGlvblxuIjsKKwkJCW15ICRoaSA9ICRtYXg7CisJCQl3aGlsZSAoLS0kaGkgPj0gJG1pbikgeworCQkJCW15ICRvazsKKwkJCQkkc2VsZi0+Z2V0X2xvZyhbJGxvbmdlc3RfcGF0aF0sICRtaW4sICRoaSwKKwkJCQkgICAgICAgICAgICAgICAwLCAxLCAxLCBzdWIgeworCQkJCSAgICAgICAgICAgICAgICRvayB8fD0gJF9bMV07CisJCQkJICAgICAgICAgICAgICAgJHJldnN7JF9bMV19ID0gX2NiKEBfKSB9KTsKKwkJCQlpZiAoJG9rKSB7CisJCQkJCXByaW50IFNUREVSUiAiciRtaW4gLi4gciRvayBPS1xuIjsKKwkJCQkJbGFzdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJJFNWTjo6RXJyb3I6OmhhbmRsZXIgPSAkZXJyX2hhbmRsZXI7CisKKwkJbXkgJWV4aXN0cyA9IG1hcCB7ICRfLT57cGF0aH0gPT4gJF8gfSBAJGdzdjsKKwkJZm9yZWFjaCBteSAkciAoc29ydCB7JGEgPD0+ICRifSBrZXlzICVyZXZzKSB7CisJCQlteSAoJHBhdGhzLCAkbG9nZ2VkKSA9IEB7JHJldnN7JHJ9fTsKKworCQkJZm9yZWFjaCBteSAkZ3MgKCRzZWxmLT5tYXRjaF9nbG9icyhcJWV4aXN0cywgJHBhdGhzLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZ2xvYnMsICRyKSkgeworCQkJCWlmICgkZ3MtPnJldl9tYXBfbWF4ID49ICRyKSB7CisJCQkJCW5leHQ7CisJCQkJfQorCQkJCW5leHQgdW5sZXNzICRncy0+bWF0Y2hfcGF0aHMoJHBhdGhzLCAkcik7CisJCQkJJGdzLT57bG9nZ2VkX3Jldl9wcm9wc30gPSAkbG9nZ2VkOworCQkJCWlmIChteSAkbGFzdF9jb21taXQgPSAkZ3MtPmxhc3RfY29tbWl0KSB7CisJCQkJCSRncy0+YXNzZXJ0X2luZGV4X2NsZWFuKCRsYXN0X2NvbW1pdCk7CisJCQkJfQorCQkJCW15ICRsb2dfZW50cnkgPSAkZ3MtPmRvX2ZldGNoKCRwYXRocywgJHIpOworCQkJCWlmICgkbG9nX2VudHJ5KSB7CisJCQkJCSRncy0+ZG9fZ2l0X2NvbW1pdCgkbG9nX2VudHJ5KTsKKwkJCQl9CisJCQkJJElOREVYX0ZJTEVTeyRncy0+e2luZGV4fX0gPSAxOworCQkJfQorCQkJZm9yZWFjaCBteSAkZyAoQCRnbG9icykgeworCQkJCW15ICRrID0gInN2bi1yZW1vdGUuJGctPntyZW1vdGV9LiIgLgorCQkJCSAgICAgICAgIiRnLT57dH0tbWF4UmV2IjsKKwkJCQlHaXQ6OlNWTjo6dG1wX2NvbmZpZygkaywgJHIpOworCQkJfQorCQkJaWYgKCRyYV9pbnZhbGlkKSB7CisJCQkJJF9bMF0gPSB1bmRlZjsKKwkJCQkkc2VsZiA9IHVuZGVmOworCQkJCSRSQSA9IHVuZGVmOworCQkJCSRzZWxmID0gR2l0OjpTVk46OlJhLT5uZXcoJHJhX3VybCk7CisJCQkJJHJhX2ludmFsaWQgPSB1bmRlZjsKKwkJCX0KKwkJfQorCQkjIHByZS1maWxsIHRoZSAucmV2X2RiIHNpbmNlIGl0J2xsIGV2ZW50dWFsbHkgZ2V0IGZpbGxlZCBpbgorCQkjIHdpdGggJzAnIHg0MCBpZiBzb21ldGhpbmcgbmV3IGdldHMgY29tbWl0dGVkCisJCWZvcmVhY2ggbXkgJGdzIChAJGdzdikgeworCQkJbmV4dCBpZiAkZ3MtPnJldl9tYXBfbWF4ID49ICRtYXg7CisJCQluZXh0IGlmIGRlZmluZWQgJGdzLT5yZXZfbWFwX2dldCgkbWF4KTsKKwkJCSRncy0+cmV2X21hcF9zZXQoJG1heCwgMCB4NDApOworCQl9CisJCWZvcmVhY2ggbXkgJGcgKEAkZ2xvYnMpIHsKKwkJCW15ICRrID0gInN2bi1yZW1vdGUuJGctPntyZW1vdGV9LiRnLT57dH0tbWF4UmV2IjsKKwkJCUdpdDo6U1ZOOjp0bXBfY29uZmlnKCRrLCAkbWF4KTsKKwkJfQorCQlsYXN0IGlmICRtYXggPj0gJGhlYWQ7CisJCSRtaW4gPSAkbWF4ICsgMTsKKwkJJG1heCArPSAkaW5jOworCQkkbWF4ID0gJGhlYWQgaWYgKCRtYXggPiAkaGVhZCk7CisJfQorCUdpdDo6U1ZOOjpnYygpOworfQorCitzdWIgbWF0Y2hfZ2xvYnMgeworCW15ICgkc2VsZiwgJGV4aXN0cywgJHBhdGhzLCAkZ2xvYnMsICRyKSA9IEBfOworCisJc3ViIGdldF9kaXJfY2hlY2sgeworCQlteSAoJHNlbGYsICRleGlzdHMsICRnLCAkcikgPSBAXzsKKwkJbXkgQHggPSBldmFsIHsgJHNlbGYtPmdldF9kaXIoJGctPntwYXRofS0+e2xlZnR9LCAkcikgfTsKKwkJcmV0dXJuIHVubGVzcyBzY2FsYXIgQHggPT0gMzsKKwkJbXkgJGRpcmVudHMgPSAkeFswXTsKKwkJZm9yZWFjaCBteSAkZGUgKGtleXMgJSRkaXJlbnRzKSB7CisJCQluZXh0IGlmICRkaXJlbnRzLT57JGRlfS0+e2tpbmR9ICE9ICRTVk46Ok5vZGU6OmRpcjsKKwkJCW15ICRwID0gJGctPntwYXRofS0+ZnVsbF9wYXRoKCRkZSk7CisJCQluZXh0IGlmICRleGlzdHMtPnskcH07CisJCQluZXh0IGlmIChsZW5ndGggJGctPntwYXRofS0+e3JpZ2h0fSAmJgorCQkJCSAoJHNlbGYtPmNoZWNrX3BhdGgoJHAsICRyKSAhPQorCQkJCSAgJFNWTjo6Tm9kZTo6ZGlyKSk7CisJCQkkZXhpc3RzLT57JHB9ID0gR2l0OjpTVk4tPmluaXQoJHNlbGYtPnt1cmx9LCAkcCwgdW5kZWYsCisJCQkJCSAkZy0+e3JlZn0tPmZ1bGxfcGF0aCgkZGUpLCAxKTsKKwkJfQorCX0KKwlmb3JlYWNoIG15ICRnIChAJGdsb2JzKSB7CisJCWlmIChteSAkcGF0aCA9ICRwYXRocy0+eyIvJGctPntwYXRofS0+e2xlZnR9In0pIHsKKwkJCWlmICgkcGF0aC0+e2FjdGlvbn0gPX4gL15bQVJdJC8pIHsKKwkJCQlnZXRfZGlyX2NoZWNrKCRzZWxmLCAkZXhpc3RzLCAkZywgJHIpOworCQkJfQorCQl9CisJCWZvcmVhY2ggKGtleXMgJSRwYXRocykgeworCQkJaWYgKC8kZy0+e3BhdGh9LT57bGVmdF9yZWdleH0vICYmCisJCQkgICAgIS8kZy0+e3BhdGh9LT57cmVnZXh9LykgeworCQkJCW5leHQgaWYgJHBhdGhzLT57JF99LT57YWN0aW9ufSAhfiAvXltBUl0kLzsKKwkJCQlnZXRfZGlyX2NoZWNrKCRzZWxmLCAkZXhpc3RzLCAkZywgJHIpOworCQkJfQorCQkJbmV4dCB1bmxlc3MgLyRnLT57cGF0aH0tPntyZWdleH0vOworCQkJbXkgJHAgPSAkMTsKKwkJCW15ICRwYXRobmFtZSA9ICRnLT57cGF0aH0tPmZ1bGxfcGF0aCgkcCk7CisJCQluZXh0IGlmICRleGlzdHMtPnskcGF0aG5hbWV9OworCQkJbmV4dCBpZiAoJHNlbGYtPmNoZWNrX3BhdGgoJHBhdGhuYW1lLCAkcikgIT0KKwkJCSAgICAgICAgICRTVk46Ok5vZGU6OmRpcik7CisJCQkkZXhpc3RzLT57JHBhdGhuYW1lfSA9IEdpdDo6U1ZOLT5pbml0KAorCQkJICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57dXJsfSwgJHBhdGhuYW1lLCB1bmRlZiwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAkZy0+e3JlZn0tPmZ1bGxfcGF0aCgkcCksIDEpOworCQl9CisJCW15ICRjID0gJyc7CisJCWZvcmVhY2ggKHNwbGl0IG0jLyMsICRnLT57cGF0aH0tPntsZWZ0fSkgeworCQkJJGMgLj0gIi8kXyI7CisJCQluZXh0IHVubGVzcyAoJHBhdGhzLT57JGN9ICYmCisJCQkgICAgICAgICAgICAgKCRwYXRocy0+eyRjfS0+e2FjdGlvbn0gPX4gL15bQVJdJC8pKTsKKwkJCWdldF9kaXJfY2hlY2soJHNlbGYsICRleGlzdHMsICRnLCAkcik7CisJCX0KKwl9CisJdmFsdWVzICUkZXhpc3RzOworfQorCitzdWIgbWluaW1pemVfdXJsIHsKKwlteSAoJHNlbGYpID0gQF87CisJcmV0dXJuICRzZWxmLT57dXJsfSBpZiAoJHNlbGYtPnt1cmx9IGVxICRzZWxmLT57cmVwb3Nfcm9vdH0pOworCW15ICR1cmwgPSAkc2VsZi0+e3JlcG9zX3Jvb3R9OworCW15IEBjb21wb25lbnRzID0gc3BsaXQobSEvISwgJHNlbGYtPntzdm5fcGF0aH0pOworCW15ICRjID0gJyc7CisJZG8geworCQkkdXJsIC49ICIvJGMiIGlmIGxlbmd0aCAkYzsKKwkJZXZhbCB7IChyZWYgJHNlbGYpLT5uZXcoJHVybCktPmdldF9sYXRlc3RfcmV2bnVtIH07CisJfSB3aGlsZSAoJEAgJiYgKCRjID0gc2hpZnQgQGNvbXBvbmVudHMpKTsKKwkkdXJsOworfQorCitzdWIgY2FuX2RvX3N3aXRjaCB7CisJbXkgJHNlbGYgPSBzaGlmdDsKKwl1bmxlc3MgKGRlZmluZWQgJGNhbl9kb19zd2l0Y2gpIHsKKwkJbXkgJHBvb2wgPSBTVk46OlBvb2wtPm5ldzsKKwkJbXkgJHJlcCA9IGV2YWwgeworCQkJJHNlbGYtPmRvX3N3aXRjaCgxLCAnJywgMCwgJHNlbGYtPnt1cmx9LAorCQkJICAgICAgICAgICAgICAgICBTVk46OkRlbHRhOjpFZGl0b3ItPm5ldywgJHBvb2wpOworCQl9OworCQlpZiAoJEApIHsKKwkJCSRjYW5fZG9fc3dpdGNoID0gMDsKKwkJfSBlbHNlIHsKKwkJCSRyZXAtPmFib3J0X3JlcG9ydCgkcG9vbCk7CisJCQkkY2FuX2RvX3N3aXRjaCA9IDE7CisJCX0KKwkJJHBvb2wtPmNsZWFyOworCX0KKwkkY2FuX2RvX3N3aXRjaDsKK30KKworc3ViIHNraXBfdW5rbm93bl9yZXZzIHsKKwlteSAoJGVycikgPSBAXzsKKwlteSAkZXJybm8gPSAkZXJyLT5hcHJfZXJyKCk7CisJIyBNYXliZSB0aGUgYnJhbmNoIHdlJ3JlIHRyYWNraW5nIGRpZG4ndAorCSMgZXhpc3Qgd2hlbiB0aGUgcmVwbyBzdGFydGVkLCBzbyBpdCdzCisJIyBub3QgYW4gZXJyb3IgaWYgaXQgZG9lc24ndCwganVzdCBjb250aW51ZQorCSMKKwkjIFdvbmRlcmZ1bGx5IGNvbnNpc3RlbnQgbGlicmFyeSwgZWg/CisJIyAxNjAwMTMgLSBzdm46Ly8gYW5kIGZpbGU6Ly8KKwkjIDE3NTAwMiAtIGh0dHAocyk6Ly8KKwkjIDE3NTAwNyAtIGh0dHAocyk6Ly8gKHRoaXMgcmVwbyByZXF1aXJlZCBhdXRob3JpemF0aW9uLCB0b28uLi4pCisJIyAgIE1vcmUgY29kZXMgbWF5IGJlIGRpc2NvdmVyZWQgbGF0ZXIuLi4KKwlpZiAoJGVycm5vID09IDE3NTAwNyB8fCAkZXJybm8gPT0gMTc1MDAyIHx8ICRlcnJubyA9PSAxNjAwMTMpIHsKKwkJbXkgJGVycl9rZXkgPSAkZXJyLT5leHBhbmRlZF9tZXNzYWdlOworCQkjIHJldmlzaW9uIG51bWJlcnMgY2hhbmdlIGV2ZXJ5IHRpbWUsIGZpbHRlciB0aGVtIG91dAorCQkkZXJyX2tleSA9fiBzL1xkKy9cMC9nOworCQkkZXJyX2tleSA9ICIkZXJybm9cMCRlcnJfa2V5IjsKKwkJdW5sZXNzICgkaWdub3JlZF9lcnJ7JGVycl9rZXl9KSB7CisJCQl3YXJuICJXOiBJZ25vcmluZyBlcnJvciBmcm9tIFNWTiwgcGF0aCBwcm9iYWJseSAiLAorCQkJICAgICAiZG9lcyBub3QgZXhpc3Q6ICgkZXJybm8pOiAiLAorCQkJICAgICAkZXJyLT5leHBhbmRlZF9tZXNzYWdlLCJcbiI7CisJCQl3YXJuICJXOiBEbyBub3QgYmUgYWxhcm1lZCBhdCB0aGUgYWJvdmUgbWVzc2FnZSAiLAorCQkJICAgICAiZ2l0LXN2biBpcyBqdXN0IHNlYXJjaGluZyBhZ2dyZXNzaXZlbHkgZm9yICIsCisJCQkgICAgICJvbGQgaGlzdG9yeS5cbiIsCisJCQkgICAgICJUaGlzIG1heSB0YWtlIGEgd2hpbGUgb24gbGFyZ2UgcmVwb3NpdG9yaWVzXG4iOworCQkJJGlnbm9yZWRfZXJyeyRlcnJfa2V5fSA9IDE7CisJCX0KKwkJcmV0dXJuOworCX0KKwlkaWUgIkVycm9yIGZyb20gU1ZOLCAoJGVycm5vKTogIiwgJGVyci0+ZXhwYW5kZWRfbWVzc2FnZSwiXG4iOworfQorCisjIHN2bl9sb2dfY2hhbmdlZF9wYXRoX3Qgb2JqZWN0cyBwYXNzZWQgdG8gZ2V0X2xvZyBhcmUgbGlrZWx5IHRvIGJlCisjIG92ZXJ3cml0dGVuIGV2ZW4gaWYgb25seSB0aGUgcmVmcyBhcmUgY29waWVkIHRvIGFuIGV4dGVybmFsIHZhcmlhYmxlLAorIyBzbyB3ZSBzaG91bGQgZHVwIHRoZSBzdHJ1Y3R1cmVzIGluIHRoZWlyIGVudGlyZXR5LiAgVXNpbmcgYW4gZXh0ZXJuYWxseQorIyBwYXNzZWQgcG9vbCAoaW5zdGVhZCBvZiBvdXIgdGVtcG9yYXJ5IGFuZCBxdWlja2x5IGNsZWFyZWQgcG9vbCBpbgorIyBHaXQ6OlNWTjo6UmEpIGRvZXMgbm90IGhlbHAgbWF0dGVycyBhdCBhbGwuLi4KK3N1YiBkdXBfY2hhbmdlZF9wYXRocyB7CisJbXkgKCRwYXRocykgPSBAXzsKKwlyZXR1cm4gdW5kZWYgdW5sZXNzICRwYXRoczsKKwlteSAlcmV0OworCWZvcmVhY2ggbXkgJHAgKGtleXMgJSRwYXRocykgeworCQlteSAkaSA9ICRwYXRocy0+eyRwfTsKKwkJbXkgJXMgPSBtYXAgeyAkXyA9PiAkaS0+JF8gfQorCQkgICAgICAgICAgICAgIHF3L2NvcHlmcm9tX3BhdGggY29weWZyb21fcmV2IGFjdGlvbi87CisJCSRyZXR7JHB9ID0gXCVzOworCX0KKwlcJXJldDsKK30KKworcGFja2FnZSBHaXQ6OlNWTjo6TG9nOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBQT1NJWCBxdy9zdHJmdGltZS87Cit1c2UgY29uc3RhbnQgY29tbWl0X2xvZ19zZXBhcmF0b3IgPT4gKCctJyB4IDcyKSAuICJcbiI7Cit1c2UgdmFycyBxdy8kVFogJGxpbWl0ICRjb2xvciAkcGFnZXIgJG5vbl9yZWN1cnNpdmUgJHZlcmJvc2UgJG9uZWxpbmUKKyAgICAgICAgICAgICVydXNlcnMgJHNob3dfY29tbWl0ICRpbmNyZW1lbnRhbC87CitteSAkbF9mbXQ7CisKK3N1YiBjbXRfc2hvd2FibGUgeworCW15ICgkYykgPSBAXzsKKwlyZXR1cm4gMSBpZiBkZWZpbmVkICRjLT57cn07CisKKwkjIGJpZyBjb21taXQgbWVzc2FnZSBnb3QgdHJ1bmNhdGVkIGJ5IHRoZSAxNmsgcHJldHR5IGJ1ZmZlciBpbiByZXYtbGlzdAorCWlmICgkYy0+e2x9ICYmICRjLT57bH0tPlstMV0gZXEgIi4uLlxuIiAmJgorCQkJCSRjLT57YV9yYXd9ID1+IC9cQChbYS1mXGRcLV0rKT4kLykgeworCQlAeyRjLT57bH19ID0gKCk7CisJCW15IEBsb2cgPSBjb21tYW5kKHF3L2NhdC1maWxlIGNvbW1pdC8sICRjLT57Y30pOworCisJCSMgc2hpZnQgb2ZmIHRoZSBoZWFkZXJzCisJCXNoaWZ0IEBsb2cgd2hpbGUgKCRsb2dbMF0gbmUgJycpOworCQlzaGlmdCBAbG9nOworCisJCSMgVE9ETzogbWFrZSAkYy0+e2x9IG5vdCBoYXZlIGEgdHJhaWxpbmcgbmV3bGluZSBpbiB0aGUgZnV0dXJlCisJCUB7JGMtPntsfX0gPSBtYXAgeyAiJF9cbiIgfSBncmVwICEvXmdpdC1zdm4taWQ6IC8sIEBsb2c7CisKKwkJKHVuZGVmLCAkYy0+e3J9LCB1bmRlZikgPSA6OmV4dHJhY3RfbWV0YWRhdGEoCisJCQkJKGdyZXAoL15naXQtc3ZuLWlkOiAvLCBAbG9nKSlbLTFdKTsKKwl9CisJcmV0dXJuIGRlZmluZWQgJGMtPntyfTsKK30KKworc3ViIGxvZ191c2VfY29sb3IgeworCXJldHVybiAkY29sb3IgfHwgR2l0LT5yZXBvc2l0b3J5LT5nZXRfY29sb3Jib29sKCdjb2xvci5kaWZmJyk7Cit9CisKK3N1YiBnaXRfc3ZuX2xvZ19jbWQgeworCW15ICgkcl9taW4sICRyX21heCwgQGFyZ3MpID0gQF87CisJbXkgJGhlYWQgPSAnSEVBRCc7CisJbXkgKEBmaWxlcywgQGxvZ19vcHRzKTsKKwlmb3JlYWNoIG15ICR4IChAYXJncykgeworCQlpZiAoJHggZXEgJy0tJyB8fCBAZmlsZXMpIHsKKwkJCXB1c2ggQGZpbGVzLCAkeDsKKwkJfSBlbHNlIHsKKwkJCWlmICg6OnZlcmlmeV9yZWYoIiR4XjAiKSkgeworCQkJCSRoZWFkID0gJHg7CisJCQl9IGVsc2UgeworCQkJCXB1c2ggQGxvZ19vcHRzLCAkeDsKKwkJCX0KKwkJfQorCX0KKworCW15ICgkdXJsLCAkcmV2LCAkdXVpZCwgJGdzKSA9IDo6d29ya2luZ19oZWFkX2luZm8oJGhlYWQpOworCSRncyB8fD0gR2l0OjpTVk4tPl9uZXc7CisJbXkgQGNtZCA9IChxdy9sb2cgLS1hYmJyZXYtY29tbWl0IC0tcHJldHR5PXJhdyAtLWRlZmF1bHQvLAorCSAgICAgICAgICAgJGdzLT5yZWZuYW1lKTsKKwlwdXNoIEBjbWQsICctcicgdW5sZXNzICRub25fcmVjdXJzaXZlOworCXB1c2ggQGNtZCwgcXcvLS1yYXcgLS1uYW1lLXN0YXR1cy8gaWYgJHZlcmJvc2U7CisJcHVzaCBAY21kLCAnLS1jb2xvcicgaWYgbG9nX3VzZV9jb2xvcigpOworCXB1c2ggQGNtZCwgQGxvZ19vcHRzOworCWlmIChkZWZpbmVkICRyX21heCAmJiAkcl9tYXggPT0gJHJfbWluKSB7CisJCXB1c2ggQGNtZCwgJy0tbWF4LWNvdW50PTEnOworCQlpZiAobXkgJGMgPSAkZ3MtPnJldl9tYXBfZ2V0KCRyX21heCkpIHsKKwkJCXB1c2ggQGNtZCwgJGM7CisJCX0KKwl9IGVsc2lmIChkZWZpbmVkICRyX21heCkgeworCQlpZiAoJHJfbWF4IDwgJHJfbWluKSB7CisJCQkoJHJfbWluLCAkcl9tYXgpID0gKCRyX21heCwgJHJfbWluKTsKKwkJfQorCQlteSAodW5kZWYsICRjX21heCkgPSAkZ3MtPmZpbmRfcmV2X2JlZm9yZSgkcl9tYXgsIDEsICRyX21pbik7CisJCW15ICh1bmRlZiwgJGNfbWluKSA9ICRncy0+ZmluZF9yZXZfYWZ0ZXIoJHJfbWluLCAxLCAkcl9tYXgpOworCQkjIElmIHRoZXJlIGFyZSBubyBjb21taXRzIGluIHRoZSByYW5nZSwgYm90aCAkY19tYXggYW5kICRjX21pbgorCQkjIHdpbGwgYmUgdW5kZWZpbmVkLiAgSWYgdGhlcmUgaXMgYXQgbGVhc3QgMSBjb21taXQgaW4gdGhlCisJCSMgcmFuZ2UsIGJvdGggd2lsbCBiZSBkZWZpbmVkLgorCQlyZXR1cm4gKCkgaWYgIWRlZmluZWQgJGNfbWluIHx8ICFkZWZpbmVkICRjX21heDsKKwkJaWYgKCRjX21pbiBlcSAkY19tYXgpIHsKKwkJCXB1c2ggQGNtZCwgJy0tbWF4LWNvdW50PTEnLCAkY19taW47CisJCX0gZWxzZSB7CisJCQlwdXNoIEBjbWQsICctLWJvdW5kYXJ5JywgIiRjX21pbi4uJGNfbWF4IjsKKwkJfQorCX0KKwlyZXR1cm4gKEBjbWQsIEBmaWxlcyk7Cit9CisKKyMgYWRhcHRlZCBmcm9tIHBhZ2VyLmMKK3N1YiBjb25maWdfcGFnZXIgeworCSRwYWdlciB8fD0gJEVOVntHSVRfUEFHRVJ9IHx8ICRFTlZ7UEFHRVJ9OworCWlmICghZGVmaW5lZCAkcGFnZXIpIHsKKwkJJHBhZ2VyID0gJ2xlc3MnOworCX0gZWxzaWYgKGxlbmd0aCAkcGFnZXIgPT0gMCB8fCAkcGFnZXIgZXEgJ2NhdCcpIHsKKwkJJHBhZ2VyID0gdW5kZWY7CisJfQorCSRFTlZ7R0lUX1BBR0VSX0lOX1VTRX0gPSBkZWZpbmVkKCRwYWdlcik7Cit9CisKK3N1YiBydW5fcGFnZXIgeworCXJldHVybiB1bmxlc3MgLXQgKlNURE9VVCAmJiBkZWZpbmVkICRwYWdlcjsKKwlwaXBlIG15ICRyZmQsIG15ICR3ZmQgb3IgcmV0dXJuOworCWRlZmluZWQobXkgJHBpZCA9IGZvcmspIG9yIDo6ZmF0YWwgIkNhbid0IGZvcms6ICQhIjsKKwlpZiAoISRwaWQpIHsKKwkJb3BlbiBTVERPVVQsICc+JicsICR3ZmQgb3IKKwkJICAgICAgICAgICAgICAgICAgICAgOjpmYXRhbCAiQ2FuJ3QgcmVkaXJlY3QgdG8gc3Rkb3V0OiAkISI7CisJCXJldHVybjsKKwl9CisJb3BlbiBTVERJTiwgJzwmJywgJHJmZCBvciA6OmZhdGFsICJDYW4ndCByZWRpcmVjdCBzdGRpbjogJCEiOworCSRFTlZ7TEVTU30gfHw9ICdGUlNYJzsKKwlleGVjICRwYWdlciBvciA6OmZhdGFsICJDYW4ndCBydW4gcGFnZXI6ICQhICgkcGFnZXIpIjsKK30KKworc3ViIGZvcm1hdF9zdm5fZGF0ZSB7CisJcmV0dXJuIHN0cmZ0aW1lKCIlWS0lbS0lZCAlSDolTTolUyAleiAoJWEsICVkICViICVZKSIsIGxvY2FsdGltZShzaGlmdCkpOworfQorCitzdWIgcGFyc2VfZ2l0X2RhdGUgeworCW15ICgkdCwgJHR6KSA9IEBfOworCSMgRGF0ZTo6UGFyc2UgaXNuJ3QgaW4gdGhlIHN0YW5kYXJkIFBlcmwgZGlzdHJvIDooCisJaWYgKCR0eiA9fiBzL15cKy8vKSB7CisJCSR0ICs9IHR6X3RvX3Nfb2Zmc2V0KCR0eik7CisJfSBlbHNpZiAoJHR6ID1+IHMvXlwtLy8pIHsKKwkJJHQgLT0gdHpfdG9fc19vZmZzZXQoJHR6KTsKKwl9CisJcmV0dXJuICR0OworfQorCitzdWIgc2V0X2xvY2FsX3RpbWV6b25lIHsKKwlpZiAoZGVmaW5lZCAkVFopIHsKKwkJJEVOVntUWn0gPSAkVFo7CisJfSBlbHNlIHsKKwkJZGVsZXRlICRFTlZ7VFp9OworCX0KK30KKworc3ViIHR6X3RvX3Nfb2Zmc2V0IHsKKwlteSAoJHR6KSA9IEBfOworCSR0eiA9fiBzLyhcZFxkKSQvLzsKKwlyZXR1cm4gKCQxICogNjApICsgKCR0eiAqIDM2MDApOworfQorCitzdWIgZ2V0X2F1dGhvcl9pbmZvIHsKKwlteSAoJGRlc3QsICRhdXRob3IsICR0LCAkdHopID0gQF87CisJJGF1dGhvciA9fiBzLyg/Ol5ccyp8XHMqJCkvL2c7CisJJGRlc3QtPnthX3Jhd30gPSAkYXV0aG9yOworCW15ICRhdTsKKwlpZiAoJDo6X2F1dGhvcnMpIHsKKwkJJGF1ID0gJHJ1c2Vyc3skYXV0aG9yfSB8fCB1bmRlZjsKKwl9CisJaWYgKCEkYXUpIHsKKwkJKCRhdSkgPSAoJGF1dGhvciA9fiAvPChbXj5dKylcQFtePl0rPiQvKTsKKwl9CisJJGRlc3QtPnt0fSA9ICR0OworCSRkZXN0LT57dHp9ID0gJHR6OworCSRkZXN0LT57YX0gPSAkYXU7CisJJGRlc3QtPnt0X3V0Y30gPSBwYXJzZV9naXRfZGF0ZSgkdCwgJHR6KTsKK30KKworc3ViIHByb2Nlc3NfY29tbWl0IHsKKwlteSAoJGMsICRyX21pbiwgJHJfbWF4LCAkZGVmZXIpID0gQF87CisJaWYgKGRlZmluZWQgJHJfbWluICYmIGRlZmluZWQgJHJfbWF4KSB7CisJCWlmICgkcl9taW4gPT0gJGMtPntyfSAmJiAkcl9taW4gPT0gJHJfbWF4KSB7CisJCQlzaG93X2NvbW1pdCgkYyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gMSBpZiAkcl9taW4gPT0gJHJfbWF4OworCQlpZiAoJHJfbWluIDwgJHJfbWF4KSB7CisJCQkjIHdlIG5lZWQgdG8gcmV2ZXJzZSB0aGUgcHJpbnQgb3JkZXIKKwkJCXJldHVybiAwIGlmIChkZWZpbmVkICRsaW1pdCAmJiAtLSRsaW1pdCA8IDApOworCQkJcHVzaCBAJGRlZmVyLCAkYzsKKwkJCXJldHVybiAxOworCQl9CisJCWlmICgkcl9taW4gIT0gJHJfbWF4KSB7CisJCQlyZXR1cm4gMSBpZiAoJHJfbWluIDwgJGMtPntyfSk7CisJCQlyZXR1cm4gMSBpZiAoJHJfbWF4ID4gJGMtPntyfSk7CisJCX0KKwl9CisJcmV0dXJuIDAgaWYgKGRlZmluZWQgJGxpbWl0ICYmIC0tJGxpbWl0IDwgMCk7CisJc2hvd19jb21taXQoJGMpOworCXJldHVybiAxOworfQorCitzdWIgc2hvd19jb21taXQgeworCW15ICRjID0gc2hpZnQ7CisJaWYgKCRvbmVsaW5lKSB7CisJCW15ICR4ID0gIlxuIjsKKwkJaWYgKG15ICRsID0gJGMtPntsfSkgeworCQkJd2hpbGUgKCRsLT5bMF0gPX4gL15ccyokLykgeyBzaGlmdCBAJGwgfQorCQkJJHggPSAkbC0+WzBdOworCQl9CisJCSRsX2ZtdCB8fD0gJ0EnIC4gbGVuZ3RoKCRjLT57cn0pOworCQlwcmludCAncicscGFjaygkbF9mbXQsICRjLT57cn0pLCcgfCAnOworCQlwcmludCAiJGMtPntjfSB8ICIgaWYgJHNob3dfY29tbWl0OworCQlwcmludCAkeDsKKwl9IGVsc2UgeworCQlzaG93X2NvbW1pdF9ub3JtYWwoJGMpOworCX0KK30KKworc3ViIHNob3dfY29tbWl0X2NoYW5nZWRfcGF0aHMgeworCW15ICgkYykgPSBAXzsKKwlyZXR1cm4gdW5sZXNzICRjLT57Y2hhbmdlZH07CisJcHJpbnQgIkNoYW5nZWQgcGF0aHM6XG4iLCBAeyRjLT57Y2hhbmdlZH19OworfQorCitzdWIgc2hvd19jb21taXRfbm9ybWFsIHsKKwlteSAoJGMpID0gQF87CisJcHJpbnQgY29tbWl0X2xvZ19zZXBhcmF0b3IsICJyJGMtPntyfSB8ICI7CisJcHJpbnQgIiRjLT57Y30gfCAiIGlmICRzaG93X2NvbW1pdDsKKwlwcmludCAiJGMtPnthfSB8ICIsIGZvcm1hdF9zdm5fZGF0ZSgkYy0+e3RfdXRjfSksICcgfCAnOworCW15ICRucl9saW5lID0gMDsKKworCWlmIChteSAkbCA9ICRjLT57bH0pIHsKKwkJd2hpbGUgKCRsLT5bJCMkbF0gZXEgIlxuIiAmJiAkIyRsID4gMAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICYmICRsLT5bKCQjJGwgLSAxKV0gZXEgIlxuIikgeworCQkJcG9wIEAkbDsKKwkJfQorCQkkbnJfbGluZSA9IHNjYWxhciBAJGw7CisJCWlmICghJG5yX2xpbmUpIHsKKwkJCXByaW50ICIxIGxpbmVcblxuXG4iOworCQl9IGVsc2UgeworCQkJaWYgKCRucl9saW5lID09IDEpIHsKKwkJCQkkbnJfbGluZSA9ICcxIGxpbmUnOworCQkJfSBlbHNlIHsKKwkJCQkkbnJfbGluZSAuPSAnIGxpbmVzJzsKKwkJCX0KKwkJCXByaW50ICRucl9saW5lLCAiXG4iOworCQkJc2hvd19jb21taXRfY2hhbmdlZF9wYXRocygkYyk7CisJCQlwcmludCAiXG4iOworCQkJcHJpbnQgJF8gZm9yZWFjaCBAJGw7CisJCX0KKwl9IGVsc2UgeworCQlwcmludCAiMSBsaW5lXG4iOworCQlzaG93X2NvbW1pdF9jaGFuZ2VkX3BhdGhzKCRjKTsKKwkJcHJpbnQgIlxuIjsKKworCX0KKwlmb3JlYWNoIG15ICR4IChxdy9yYXcgc3RhdCBkaWZmLykgeworCQlpZiAoJGMtPnskeH0pIHsKKwkJCXByaW50ICJcbiI7CisJCQlwcmludCAkXyBmb3JlYWNoIEB7JGMtPnskeH19CisJCX0KKwl9Cit9CisKK3N1YiBjbWRfc2hvd19sb2cgeworCW15IChAYXJncykgPSBAXzsKKwlteSAoJHJfbWluLCAkcl9tYXgpOworCW15ICRyX2xhc3QgPSAtMTsgIyBwcmV2ZW50IGR1cGVzCisJc2V0X2xvY2FsX3RpbWV6b25lKCk7CisJaWYgKGRlZmluZWQgJDo6X3JldmlzaW9uKSB7CisJCWlmICgkOjpfcmV2aXNpb24gPX4gL14oXGQrKTooXGQrKSQvKSB7CisJCQkoJHJfbWluLCAkcl9tYXgpID0gKCQxLCAkMik7CisJCX0gZWxzaWYgKCQ6Ol9yZXZpc2lvbiA9fiAvXlxkKyQvKSB7CisJCQkkcl9taW4gPSAkcl9tYXggPSAkOjpfcmV2aXNpb247CisJCX0gZWxzZSB7CisJCQk6OmZhdGFsICItciQ6Ol9yZXZpc2lvbiBpcyBub3Qgc3VwcG9ydGVkLCB1c2UgIiwKKwkJCQkic3RhbmRhcmQgJ2dpdCBsb2cnIGFyZ3VtZW50cyBpbnN0ZWFkIjsKKwkJfQorCX0KKworCWNvbmZpZ19wYWdlcigpOworCUBhcmdzID0gZ2l0X3N2bl9sb2dfY21kKCRyX21pbiwgJHJfbWF4LCBAYXJncyk7CisJaWYgKCFAYXJncykgeworCQlwcmludCBjb21taXRfbG9nX3NlcGFyYXRvciB1bmxlc3MgJGluY3JlbWVudGFsIHx8ICRvbmVsaW5lOworCQlyZXR1cm47CisJfQorCW15ICRsb2cgPSBjb21tYW5kX291dHB1dF9waXBlKEBhcmdzKTsKKwlydW5fcGFnZXIoKTsKKwlteSAoQGssICRjLCAkZCwgJHN0YXQpOworCW15ICRlc2NfY29sb3IgPSBxci8oPzpcMDMzXFsoPzooPzpcZCs7KSpcZCopP20pKi87CisJd2hpbGUgKDwkbG9nPikgeworCQlpZiAoL14ke2VzY19jb2xvcn1jb21taXQgLT8oJDo6c2hhMV9zaG9ydCkvbykgeworCQkJbXkgJGNtdCA9ICQxOworCQkJaWYgKCRjICYmIGNtdF9zaG93YWJsZSgkYykgJiYgJGMtPntyfSAhPSAkcl9sYXN0KSB7CisJCQkJJHJfbGFzdCA9ICRjLT57cn07CisJCQkJcHJvY2Vzc19jb21taXQoJGMsICRyX21pbiwgJHJfbWF4LCBcQGspIG9yCisJCQkJCQkJCWdvdG8gb3V0OworCQkJfQorCQkJJGQgPSB1bmRlZjsKKwkJCSRjID0geyBjID0+ICRjbXQgfTsKKwkJfSBlbHNpZiAoL14ke2VzY19jb2xvcn1hdXRob3IgKC4rKSAoXGQrKSAoW1wtXCtdP1xkKykkL28pIHsKKwkJCWdldF9hdXRob3JfaW5mbygkYywgJDEsICQyLCAkMyk7CisJCX0gZWxzaWYgKC9eJHtlc2NfY29sb3J9KD86dHJlZXxwYXJlbnR8Y29tbWl0dGVyKSAvbykgeworCQkJIyBpZ25vcmUKKwkJfSBlbHNpZiAoL14ke2VzY19jb2xvcn06XGR7Nn0gXGR7Nn0gJDo6c2hhMV9zaG9ydC9vKSB7CisJCQlwdXNoIEB7JGMtPntyYXd9fSwgJF87CisJCX0gZWxzaWYgKC9eJHtlc2NfY29sb3J9W0FDUk1EVF1cdC8pIHsKKwkJCSMgd2UgY291bGQgYWRkICRTVk4tPntzdm5fcGF0aH0gaGVyZSwgYnV0IHRoYXQgcmVxdWlyZXMKKwkJCSMgcmVtb3RlIGFjY2VzcyBhdCB0aGUgbW9tZW50IChyZXBvX3BhdGhfc3BsaXQpLi4uCisJCQlzI14oJHtlc2NfY29sb3J9KShbQUNSTURUXSlcdCMkMSAgICQyICNvOworCQkJcHVzaCBAeyRjLT57Y2hhbmdlZH19LCAkXzsKKwkJfSBlbHNpZiAoL14ke2VzY19jb2xvcn1kaWZmIC9vKSB7CisJCQkkZCA9IDE7CisJCQlwdXNoIEB7JGMtPntkaWZmfX0sICRfOworCQl9IGVsc2lmICgkZCkgeworCQkJcHVzaCBAeyRjLT57ZGlmZn19LCAkXzsKKwkJfSBlbHNpZiAoL15cIC4rXCBcfFxzKlxkK1wgJGVzY19jb2xvcltcK1wtXSoKKwkJICAgICAgICAgICRlc2NfY29sb3IqW1wrXC1dKiRlc2NfY29sb3IkL3gpIHsKKwkJCSRzdGF0ID0gMTsKKwkJCXB1c2ggQHskYy0+e3N0YXR9fSwgJF87CisJCX0gZWxzaWYgKCRzdGF0ICYmIC9eIFxkKyBmaWxlcyBjaGFuZ2VkLCBcZCsgaW5zZXJ0aW9ucy8pIHsKKwkJCXB1c2ggQHskYy0+e3N0YXR9fSwgJF87CisJCQkkc3RhdCA9IHVuZGVmOworCQl9IGVsc2lmICgvXiR7ZXNjX2NvbG9yfSAgICAoZ2l0LXN2bi1pZDouKykkL28pIHsKKwkJCSgkYy0+e3VybH0sICRjLT57cn0sIHVuZGVmKSA9IDo6ZXh0cmFjdF9tZXRhZGF0YSgkMSk7CisJCX0gZWxzaWYgKHMvXiR7ZXNjX2NvbG9yfSAgICAvL28pIHsKKwkJCXB1c2ggQHskYy0+e2x9fSwgJF87CisJCX0KKwl9CisJaWYgKCRjICYmIGRlZmluZWQgJGMtPntyfSAmJiAkYy0+e3J9ICE9ICRyX2xhc3QpIHsKKwkJJHJfbGFzdCA9ICRjLT57cn07CisJCXByb2Nlc3NfY29tbWl0KCRjLCAkcl9taW4sICRyX21heCwgXEBrKTsKKwl9CisJaWYgKEBrKSB7CisJCSgkcl9taW4sICRyX21heCkgPSAoJHJfbWF4LCAkcl9taW4pOworCQlwcm9jZXNzX2NvbW1pdCgkXywgJHJfbWluLCAkcl9tYXgpIGZvcmVhY2ggcmV2ZXJzZSBAazsKKwl9CitvdXQ6CisJY2xvc2UgJGxvZzsKKwlwcmludCBjb21taXRfbG9nX3NlcGFyYXRvciB1bmxlc3MgJGluY3JlbWVudGFsIHx8ICRvbmVsaW5lOworfQorCitzdWIgY21kX2JsYW1lIHsKKwlteSAkcGF0aCA9IHNoaWZ0OworCisJY29uZmlnX3BhZ2VyKCk7CisJcnVuX3BhZ2VyKCk7CisKKwlteSAoJGZoLCAkY3R4KSA9IGNvbW1hbmRfb3V0cHV0X3BpcGUoJ2JsYW1lJywgQF8sICRwYXRoKTsKKwl3aGlsZSAobXkgJGxpbmUgPSA8JGZoPikgeworCQlpZiAoJGxpbmUgPX4gL15cXj8oW1s6eGRpZ2l0Ol1dKylccy8pIHsKKwkJCW15ICh1bmRlZiwgJHJldiwgdW5kZWYpID0gOjpjbXRfbWV0YWRhdGEoJDEpOworCQkJJHJldiA9IHNwcmludGYoJyUtMTBzJywgJHJldik7CisJCQkkbGluZSA9fiBzL15cXj9bWzp4ZGlnaXQ6XV0rKFxzKS8kcmV2JDEvOworCQl9CisJCXByaW50ICRsaW5lOworCX0KKwljb21tYW5kX2Nsb3NlX3BpcGUoJGZoLCAkY3R4KTsKK30KKworcGFja2FnZSBHaXQ6OlNWTjo6TWlncmF0aW9uOworIyB0aGVzZSB2ZXJzaW9uIG51bWJlcnMgZG8gTk9UIGNvcnJlc3BvbmQgdG8gYWN0dWFsIHZlcnNpb24gbnVtYmVycworIyBvZiBnaXQgbm9yIGdpdC1zdm4uICBUaGV5IGFyZSBqdXN0IHJlbGF0aXZlLgorIworIyB2MCBsYXlvdXQ6IC5naXQvJGlkL2luZm8vdXJsLCByZWZzL2hlYWRzLyRpZC1IRUFECisjCisjIHYxIGxheW91dDogLmdpdC8kaWQvaW5mby91cmwsIHJlZnMvcmVtb3Rlcy8kaWQKKyMKKyMgdjIgbGF5b3V0OiAuZ2l0L3N2bi8kaWQvaW5mby91cmwsIHJlZnMvcmVtb3Rlcy8kaWQKKyMKKyMgdjMgbGF5b3V0OiAuZ2l0L3N2bi8kaWQsIHJlZnMvcmVtb3Rlcy8kaWQKKyMgICAgICAgICAgICAtIGluZm8vdXJsIG1heSByZW1haW4gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisjICAgICAgICAgICAgLSB0aGlzIGlzIHdoYXQgd2UgbWlncmF0ZSB1cCB0byB0aGlzIGxheW91dCBhdXRvbWF0aWNhbGx5LAorIyAgICAgICAgICAgIC0gdGhpcyB3aWxsIGJlIHVzZWQgYnkgZ2l0IHN2biBpbml0IG9uIHNpbmdsZSBicmFuY2hlcworIyB2My4xIGxheW91dCAoYXV0byBtaWdyYXRlZCk6CisjICAgICAgICAgICAgLSAucmV2X2RiID0+IC5yZXZfZGIuJFVVSUQsIC5yZXZfZGIgd2lsbCByZW1haW4gYXMgYSBzeW1saW5rCisjICAgICAgICAgICAgICBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyMKKyMgdjQgbGF5b3V0OiAuZ2l0L3N2bi8kcmVwb19pZC8kaWQsIHJlZnMvcmVtb3Rlcy8kcmVwb19pZC8kaWQKKyMgICAgICAgICAgICAtIHRoaXMgaXMgb25seSBjcmVhdGVkIGZvciBuZXdseSBtdWx0aS1pbml0LWVkCisjICAgICAgICAgICAgICByZXBvc2l0b3JpZXMuICBTaW1pbGFyIGluIHNwaXJpdCB0byB0aGUKKyMgICAgICAgICAgICAgIC0tdXNlLXNlcGFyYXRlLXJlbW90ZXMgb3B0aW9uIGluIGdpdC1jbG9uZSAobm93IGRlZmF1bHQpCisjICAgICAgICAgICAgLSB3ZSBkbyBub3QgYXV0b21hdGljYWxseSBtaWdyYXRlIHRvIHRoaXMgKGZvbGxvd2luZworIyAgICAgICAgICAgICAgdGhlIGV4YW1wbGUgc2V0IGJ5IGNvcmUgZ2l0KQorIworIyB2NSBsYXlvdXQ6IC5yZXZfZGIuJFVVSUQgPT4gLnJldl9tYXAuJFVVSUQKKyMgICAgICAgICAgICAtIG5ld2VyLCBtb3JlLWVmZmljaWVudCBmb3JtYXQgdGhhdCB1c2VzIDI0LWJ5dGVzIHBlciByZWNvcmQKKyMgICAgICAgICAgICAgIHdpdGggbm8gZmlsbGVyIHNwYWNlLgorIyAgICAgICAgICAgIC0gdXNlIHh4ZCAtYzI0IDwgLnJldl9tYXAuJFVVSUQgdG8gdmlldyBhbmQgZGVidWcKKyMgICAgICAgICAgICAtIFRoaXMgaXMgYSBvbmUtd2F5IG1pZ3JhdGlvbiwgcmVwb3NpdG9yaWVzIHVwZGF0ZWQgdG8gdGhlCisjICAgICAgICAgICAgICBuZXcgZm9ybWF0IHdpbGwgbm90IGJlIGFibGUgdG8gdXNlIG9sZCBnaXQtc3ZuIHdpdGhvdXQKKyMgICAgICAgICAgICAgIHJlYnVpbGRpbmcgdGhlIC5yZXZfZGIuICBSZWJ1aWxkaW5nIHRoZSByZXZfZGIgaXMgbm90CisjICAgICAgICAgICAgICBwb3NzaWJsZSBpZiBub01ldGFkYXRhIG9yIHVzZVN2bVByb3BzIGFyZSBzZXQ7IGJ1dCBzaG91bGQKKyMgICAgICAgICAgICAgIGJlIG5vIHByb2JsZW0gZm9yIHVzZXJzIHRoYXQgdXNlIHRoZSAoc2Vuc2libGUpIGRlZmF1bHRzLgordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBDYXJwIHF3L2Nyb2FrLzsKK3VzZSBGaWxlOjpQYXRoIHF3L21rcGF0aC87Cit1c2UgRmlsZTo6QmFzZW5hbWUgcXcvZGlybmFtZSBiYXNlbmFtZS87Cit1c2UgdmFycyBxdy8kX21pbmltaXplLzsKKworc3ViIG1pZ3JhdGVfZnJvbV92MCB7CisJbXkgJGdpdF9kaXIgPSAkRU5We0dJVF9ESVJ9OworCXJldHVybiB1bmRlZiB1bmxlc3MgLWQgJGdpdF9kaXI7CisJbXkgKCRmaCwgJGN0eCkgPSBjb21tYW5kX291dHB1dF9waXBlKHF3L3Jldi1wYXJzZSAtLXN5bWJvbGljIC0tYWxsLyk7CisJbXkgJG1pZ3JhdGVkID0gMDsKKwl3aGlsZSAoPCRmaD4pIHsKKwkJY2hvbXA7CisJCW15ICgkaWQsICRvcmlnX3JlZikgPSAoJF8sICRfKTsKKwkJbmV4dCB1bmxlc3MgJGlkID1+IHMjXnJlZnMvaGVhZHMvKC4rKS1IRUFEJCMkMSM7CisJCW5leHQgdW5sZXNzIC1mICIkZ2l0X2Rpci8kaWQvaW5mby91cmwiOworCQlteSAkbmV3X3JlZiA9ICJyZWZzL3JlbW90ZXMvJGlkIjsKKwkJaWYgKDo6dmVyaWZ5X3JlZigiJG5ld19yZWZeMCIpKSB7CisJCQlwcmludCBTVERFUlIgIlc6ICRvcmlnX3JlZiBpcyBwcm9iYWJseSBhbiBvbGQgIiwKKwkJCSAgICAgICAgICAgICAiYnJhbmNoIHVzZWQgYnkgYW4gYW5jaWVudCB2ZXJzaW9uIG9mICIsCisJCQkJICAgICAiZ2l0LXN2bi5cbiIsCisJCQkJICAgICAiSG93ZXZlciwgJG5ld19yZWYgYWxzbyBleGlzdHMuXG4iLAorCQkJCSAgICAgIldlIHdpbGwgbm90IGJlIGFibGUgIiwKKwkJCQkgICAgICJ0byB1c2UgdGhpcyBicmFuY2ggdW50aWwgdGhpcyAiLAorCQkJCSAgICAgImFtYmlndWl0eSBpcyByZXNvbHZlZC5cbiI7CisJCQluZXh0OworCQl9CisJCXByaW50IFNUREVSUiAiTWlncmF0aW5nIGZyb20gdjAgbGF5b3V0Li4uXG4iIGlmICEkbWlncmF0ZWQ7CisJCXByaW50IFNUREVSUiAiUmVuYW1pbmcgcmVmOiAkb3JpZ19yZWYgPT4gJG5ld19yZWZcbiI7CisJCWNvbW1hbmRfbm9pc3koJ3VwZGF0ZS1yZWYnLCAkbmV3X3JlZiwgJG9yaWdfcmVmKTsKKwkJY29tbWFuZF9ub2lzeSgndXBkYXRlLXJlZicsICctZCcsICRvcmlnX3JlZiwgJG9yaWdfcmVmKTsKKwkJJG1pZ3JhdGVkKys7CisJfQorCWNvbW1hbmRfY2xvc2VfcGlwZSgkZmgsICRjdHgpOworCXByaW50IFNUREVSUiAiRG9uZSBtaWdyYXRpbmcgZnJvbSB2MCBsYXlvdXQuLi5cbiIgaWYgJG1pZ3JhdGVkOworCSRtaWdyYXRlZDsKK30KKworc3ViIG1pZ3JhdGVfZnJvbV92MSB7CisJbXkgJGdpdF9kaXIgPSAkRU5We0dJVF9ESVJ9OworCW15ICRtaWdyYXRlZCA9IDA7CisJcmV0dXJuICRtaWdyYXRlZCB1bmxlc3MgLWQgJGdpdF9kaXI7CisJbXkgJHN2bl9kaXIgPSAiJGdpdF9kaXIvc3ZuIjsKKworCSMganVzdCBpbiBjYXNlIHNvbWVib2R5IHVzZWQgJ3N2bicgYXMgdGhlaXIgJGlkIGF0IHNvbWUgcG9pbnQuLi4KKwlyZXR1cm4gJG1pZ3JhdGVkIGlmIC1kICRzdm5fZGlyICYmICEgLWYgIiRzdm5fZGlyL2luZm8vdXJsIjsKKworCXByaW50IFNUREVSUiAiTWlncmF0aW5nIGZyb20gYSBnaXQtc3ZuIHYxIGxheW91dC4uLlxuIjsKKwlta3BhdGgoWyRzdm5fZGlyXSk7CisJcHJpbnQgU1RERVJSICJEYXRhIGZyb20gYSBwcmV2aW91cyB2ZXJzaW9uIG9mIGdpdC1zdm4gZXhpc3RzLCBidXRcblx0IiwKKwkgICAgICAgICAgICAgIiRzdm5fZGlyXG5cdChyZXF1aXJlZCBmb3IgdGhpcyB2ZXJzaW9uICIsCisJICAgICAgICAgICAgICIoJDo6VkVSU0lPTikgb2YgZ2l0LXN2bikgZG9lcyBub3QuIGV4aXN0XG4iOworCW15ICgkZmgsICRjdHgpID0gY29tbWFuZF9vdXRwdXRfcGlwZShxdy9yZXYtcGFyc2UgLS1zeW1ib2xpYyAtLWFsbC8pOworCXdoaWxlICg8JGZoPikgeworCQlteSAkeCA9ICRfOworCQluZXh0IHVubGVzcyAkeCA9fiBzI15yZWZzL3JlbW90ZXMvIyM7CisJCWNob21wICR4OworCQluZXh0IHVubGVzcyAtZiAiJGdpdF9kaXIvJHgvaW5mby91cmwiOworCQlteSAkdSA9IGV2YWwgeyA6OmZpbGVfdG9fcygiJGdpdF9kaXIvJHgvaW5mby91cmwiKSB9OworCQluZXh0IHVubGVzcyAkdTsKKwkJbXkgJGRuID0gZGlybmFtZSgiJGdpdF9kaXIvc3ZuLyR4Iik7CisJCW1rcGF0aChbJGRuXSkgdW5sZXNzIC1kICRkbjsKKwkJaWYgKCR4IGVxICdzdm4nKSB7ICMgdGhleSB1c2VkICdzdm4nIGFzIEdJVF9TVk5fSUQ6CisJCQlta3BhdGgoWyIkZ2l0X2Rpci9zdm4vc3ZuIl0pOworCQkJcHJpbnQgU1RERVJSICIgLSAkZ2l0X2Rpci8keC9pbmZvID0+ICIsCisJCQkgICAgICAgICAgICAgICAgIiRnaXRfZGlyL3N2bi8keC9pbmZvXG4iOworCQkJcmVuYW1lICIkZ2l0X2Rpci8keC9pbmZvIiwgIiRnaXRfZGlyL3N2bi8keC9pbmZvIiBvcgorCQkJICAgICAgIGNyb2FrICIkITogJHgiOworCQkJIyBkb24ndCB3b3JyeSB0b28gbXVjaCBhYm91dCB0aGVzZSwgdGhleSBwcm9iYWJseQorCQkJIyBkb24ndCBleGlzdCB3aXRoIHJlcG9zIHRoaXMgb2xkIChzYXZlIGZvciBpbmRleCwKKwkJCSMgYW5kIHdlIGNhbiBlYXNpbHkgcmVnZW5lcmF0ZSB0aGF0KQorCQkJZm9yZWFjaCBteSAkZiAocXcvdW5oYW5kbGVkLmxvZyBpbmRleCAucmV2X2RiLykgeworCQkJCXJlbmFtZSAiJGdpdF9kaXIvJHgvJGYiLCAiJGdpdF9kaXIvc3ZuLyR4LyRmIjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXByaW50IFNUREVSUiAiIC0gJGdpdF9kaXIvJHggPT4gJGdpdF9kaXIvc3ZuLyR4XG4iOworCQkJcmVuYW1lICIkZ2l0X2Rpci8keCIsICIkZ2l0X2Rpci9zdm4vJHgiIG9yCisJCQkgICAgICAgY3JvYWsgIiQhOiAkeCI7CisJCX0KKwkJJG1pZ3JhdGVkKys7CisJfQorCWNvbW1hbmRfY2xvc2VfcGlwZSgkZmgsICRjdHgpOworCXByaW50IFNUREVSUiAiRG9uZSBtaWdyYXRpbmcgZnJvbSBhIGdpdC1zdm4gdjEgbGF5b3V0XG4iOworCSRtaWdyYXRlZDsKK30KKworc3ViIHJlYWRfb2xkX3VybHMgeworCW15ICgkbF9tYXAsICRwZngsICRwYXRoKSA9IEBfOworCW15IEBkaXI7CisJZm9yZWFjaCAoPCRwYXRoLyo+KSB7CisJCWlmICgtciAiJF8vaW5mby91cmwiKSB7CisJCQkkcGZ4IC49ICcvJyBpZiAkcGZ4ICYmICRwZnggIX4gbSEvJCE7CisJCQlteSAkcmVmX2lkID0gJHBmeCAuIGJhc2VuYW1lICRfOworCQkJbXkgJHVybCA9IDo6ZmlsZV90b19zKCIkXy9pbmZvL3VybCIpOworCQkJJGxfbWFwLT57JHJlZl9pZH0gPSAkdXJsOworCQl9IGVsc2lmICgtZCAkXykgeworCQkJcHVzaCBAZGlyLCAkXzsKKwkJfQorCX0KKwlmb3JlYWNoIChAZGlyKSB7CisJCW15ICR4ID0gJF87CisJCSR4ID1+IHMhXlxRJEVOVntHSVRfRElSfVxFL3N2bi8hIW87CisJCXJlYWRfb2xkX3VybHMoJGxfbWFwLCAkeCwgJF8pOworCX0KK30KKworc3ViIG1pZ3JhdGVfZnJvbV92MiB7CisJbXkgQGNmZyA9IGNvbW1hbmQocXcvY29uZmlnIC1sLyk7CisJcmV0dXJuIGlmIGdyZXAgL15zdm4tcmVtb3RlXC4uK1wudXJsPS8sIEBjZmc7CisJbXkgJWxfbWFwOworCXJlYWRfb2xkX3VybHMoXCVsX21hcCwgJycsICIkRU5We0dJVF9ESVJ9L3N2biIpOworCW15ICRtaWdyYXRlZCA9IDA7CisKKwlmb3JlYWNoIG15ICRyZWZfaWQgKHNvcnQga2V5cyAlbF9tYXApIHsKKwkJZXZhbCB7IEdpdDo6U1ZOLT5pbml0KCRsX21hcHskcmVmX2lkfSwgJycsIHVuZGVmLCAkcmVmX2lkKSB9OworCQlpZiAoJEApIHsKKwkJCUdpdDo6U1ZOLT5pbml0KCRsX21hcHskcmVmX2lkfSwgJycsICRyZWZfaWQsICRyZWZfaWQpOworCQl9CisJCSRtaWdyYXRlZCsrOworCX0KKwkkbWlncmF0ZWQ7Cit9CisKK3N1YiBtaW5pbWl6ZV9jb25uZWN0aW9ucyB7CisJbXkgJHIgPSBHaXQ6OlNWTjo6cmVhZF9hbGxfcmVtb3RlcygpOworCW15ICRuZXdfdXJscyA9IHt9OworCW15ICRyb290X3JlcG9zID0ge307CisJZm9yZWFjaCBteSAkcmVwb19pZCAoa2V5cyAlJHIpIHsKKwkJbXkgJHVybCA9ICRyLT57JHJlcG9faWR9LT57dXJsfSBvciBuZXh0OworCQlteSAkZmV0Y2ggPSAkci0+eyRyZXBvX2lkfS0+e2ZldGNofSBvciBuZXh0OworCQlteSAkcmEgPSBHaXQ6OlNWTjo6UmEtPm5ldygkdXJsKTsKKworCQkjIHNraXAgZXhpc3RpbmcgY2FzZXMgd2hlcmUgd2UgYWxyZWFkeSBjb25uZWN0IHRvIHRoZSByb290CisJCWlmICgoJHJhLT57dXJsfSBlcSAkcmEtPntyZXBvc19yb290fSkgfHwKKwkJICAgIChHaXQ6OlNWTjo6c2FuaXRpemVfcmVtb3RlX25hbWUoJHJhLT57cmVwb3Nfcm9vdH0pIGVxCisJCSAgICAgJHJlcG9faWQpKSB7CisJCQkkcm9vdF9yZXBvcy0+eyRyYS0+e3VybH19ID0gJHJlcG9faWQ7CisJCQluZXh0OworCQl9CisKKwkJbXkgJHJvb3RfcmEgPSBHaXQ6OlNWTjo6UmEtPm5ldygkcmEtPntyZXBvc19yb290fSk7CisJCW15ICRyb290X3BhdGggPSAkcmEtPnt1cmx9OworCQkkcm9vdF9wYXRoID1+IHMjXlxRJHJhLT57cmVwb3Nfcm9vdH1cRSgvfCQpIyM7CisJCWZvcmVhY2ggbXkgJHBhdGggKGtleXMgJSRmZXRjaCkgeworCQkJbXkgJHJlZl9pZCA9ICRmZXRjaC0+eyRwYXRofTsKKwkJCW15ICRncyA9IEdpdDo6U1ZOLT5uZXcoJHJlZl9pZCwgJHJlcG9faWQsICRwYXRoKTsKKworCQkJIyBtYWtlIHN1cmUgd2UgY2FuIHJlYWQgd2hlbiBjb25uZWN0aW5nIHRvCisJCQkjIGEgaGlnaGVyIGxldmVsIG9mIGEgcmVwb3NpdG9yeQorCQkJbXkgKCRsYXN0X3JldiwgdW5kZWYpID0gJGdzLT5sYXN0X3Jldl9jb21taXQ7CisJCQlpZiAoIWRlZmluZWQgJGxhc3RfcmV2KSB7CisJCQkJJGxhc3RfcmV2ID0gZXZhbCB7CisJCQkJCSRyb290X3JhLT5nZXRfbGF0ZXN0X3Jldm51bTsKKwkJCQl9OworCQkJCW5leHQgaWYgJEA7CisJCQl9CisJCQlteSAkbmV3ID0gJHJvb3RfcGF0aDsKKwkJCSRuZXcgLj0gbGVuZ3RoICRwYXRoID8gIi8kcGF0aCIgOiAnJzsKKwkJCWV2YWwgeworCQkJCSRyb290X3JhLT5nZXRfbG9nKFskbmV3XSwgJGxhc3RfcmV2LCAkbGFzdF9yZXYsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDEsIHN1YiB7IH0pOworCQkJfTsKKwkJCW5leHQgaWYgJEA7CisJCQkkbmV3X3VybHMtPnskcmEtPntyZXBvc19yb290fX0tPnskbmV3fSA9CisJCQkgICAgICAgIHsgcmVmX2lkID0+ICRyZWZfaWQsCisJCQkJICBvbGRfcmVwb19pZCA9PiAkcmVwb19pZCwKKwkJCQkgIG9sZF9wYXRoID0+ICRwYXRoIH07CisJCX0KKwl9CisKKwlteSBAZW1wdGllZDsKKwlmb3JlYWNoIG15ICR1cmwgKGtleXMgJSRuZXdfdXJscykgeworCQkjIHNlZSBpZiB3ZSBjYW4gcmUtdXNlIGFuIGV4aXN0aW5nIFtzdm4tcmVtb3RlICJyZXBvX2lkIl0KKwkJIyBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEobiB1Z2x5KSBuZXcgc2VjdGlvbjoKKwkJbXkgJHJlcG9faWQgPSAkcm9vdF9yZXBvcy0+eyR1cmx9IHx8CisJCSAgICAgICAgICAgICAgR2l0OjpTVk46OnNhbml0aXplX3JlbW90ZV9uYW1lKCR1cmwpOworCisJCW15ICRmZXRjaCA9ICRuZXdfdXJscy0+eyR1cmx9OworCQlmb3JlYWNoIG15ICRwYXRoIChrZXlzICUkZmV0Y2gpIHsKKwkJCW15ICR4ID0gJGZldGNoLT57JHBhdGh9OworCQkJR2l0OjpTVk4tPmluaXQoJHVybCwgJHBhdGgsICRyZXBvX2lkLCAkeC0+e3JlZl9pZH0pOworCQkJbXkgJHBmeCA9ICJzdm4tcmVtb3RlLiR4LT57b2xkX3JlcG9faWR9IjsKKworCQkJbXkgJG9sZF9mZXRjaCA9IHF1b3RlbWV0YSgiJHgtPntvbGRfcGF0aH06Ii4KKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZnMvcmVtb3Rlcy8keC0+e3JlZl9pZH0iKTsKKwkJCWNvbW1hbmRfbm9pc3kocXcvY29uZmlnIC0tdW5zZXQvLAorCQkJICAgICAgICAgICAgICAiJHBmeC5mZXRjaCIsICdeJy4gJG9sZF9mZXRjaCAuICckJyk7CisJCQlkZWxldGUgJHItPnskeC0+e29sZF9yZXBvX2lkfX0tPgorCQkJICAgICAgIHtmZXRjaH0tPnskeC0+e29sZF9wYXRofX07CisJCQlpZiAoIWtleXMgJXskci0+eyR4LT57b2xkX3JlcG9faWR9fS0+e2ZldGNofX0pIHsKKwkJCQljb21tYW5kX25vaXN5KHF3L2NvbmZpZyAtLXVuc2V0LywKKwkJCQkgICAgICAgICAgICAgICIkcGZ4LnVybCIpOworCQkJCXB1c2ggQGVtcHRpZWQsICR4LT57b2xkX3JlcG9faWR9CisJCQl9CisJCX0KKwl9CisJaWYgKEBlbXB0aWVkKSB7CisJCW15ICRmaWxlID0gJEVOVntHSVRfQ09ORklHfSB8fCAkRU5We0dJVF9DT05GSUdfTE9DQUx9IHx8CisJCSAgICAgICAgICAgIiRFTlZ7R0lUX0RJUn0vY29uZmlnIjsKKwkJcHJpbnQgU1RERVJSIDw8RU9GOworVGhlIGZvbGxvd2luZyBbc3ZuLXJlbW90ZV0gc2VjdGlvbnMgaW4geW91ciBjb25maWcgZmlsZSAoJGZpbGUpIGFyZSBlbXB0eQorYW5kIGNhbiBiZSBzYWZlbHkgcmVtb3ZlZDoKK0VPRgorCQlwcmludCBTVERFUlIgIltzdm4tcmVtb3RlIFwiJF9cIl1cbiIgZm9yZWFjaCBAZW1wdGllZDsKKwl9Cit9CisKK3N1YiBtaWdyYXRpb25fY2hlY2sgeworCW1pZ3JhdGVfZnJvbV92MCgpOworCW1pZ3JhdGVfZnJvbV92MSgpOworCW1pZ3JhdGVfZnJvbV92MigpOworCW1pbmltaXplX2Nvbm5lY3Rpb25zKCkgaWYgJF9taW5pbWl6ZTsKK30KKworcGFja2FnZSBHaXQ6OkluZGV4SW5mbzsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgR2l0IHF3L2NvbW1hbmRfaW5wdXRfcGlwZSBjb21tYW5kX2Nsb3NlX3BpcGUvOworCitzdWIgbmV3IHsKKwlteSAoJGNsYXNzKSA9IEBfOworCW15ICgkZ3VpLCAkY3R4KSA9IGNvbW1hbmRfaW5wdXRfcGlwZShxdy91cGRhdGUtaW5kZXggLXogLS1pbmRleC1pbmZvLyk7CisJYmxlc3MgeyBndWkgPT4gJGd1aSwgY3R4ID0+ICRjdHgsIG5yID0+IDB9LCAkY2xhc3M7Cit9CisKK3N1YiByZW1vdmUgeworCW15ICgkc2VsZiwgJHBhdGgpID0gQF87CisJaWYgKHByaW50IHsgJHNlbGYtPntndWl9IH0gJzAgJywgMCB4IDQwLCAiXHQiLCAkcGF0aCwgIlwwIikgeworCQlyZXR1cm4gKyskc2VsZi0+e25yfTsKKwl9CisJdW5kZWY7Cit9CisKK3N1YiB1cGRhdGUgeworCW15ICgkc2VsZiwgJG1vZGUsICRoYXNoLCAkcGF0aCkgPSBAXzsKKwlpZiAocHJpbnQgeyAkc2VsZi0+e2d1aX0gfSAkbW9kZSwgJyAnLCAkaGFzaCwgIlx0IiwgJHBhdGgsICJcMCIpIHsKKwkJcmV0dXJuICsrJHNlbGYtPntucn07CisJfQorCXVuZGVmOworfQorCitzdWIgREVTVFJPWSB7CisJbXkgKCRzZWxmKSA9IEBfOworCWNvbW1hbmRfY2xvc2VfcGlwZSgkc2VsZi0+e2d1aX0sICRzZWxmLT57Y3R4fSk7Cit9CisKK3BhY2thZ2UgR2l0OjpTVk46Okdsb2JTcGVjOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKworc3ViIG5ldyB7CisJbXkgKCRjbGFzcywgJGdsb2IpID0gQF87CisJbXkgJHJlID0gJGdsb2I7CisJJHJlID1+IHMhLyskISFnOyAjIG5vIG5lZWQgZm9yIHRyYWlsaW5nIHNsYXNoZXMKKwlteSAkbnIgPSAoJHJlID1+IHMhXiguKilcKiguKikkIVwoXFteL1xdK1wpIWcpOworCW15ICgkbGVmdCwgJHJpZ2h0KSA9ICgkMSwgJDIpOworCWlmICgkbnIgPiAxKSB7CisJCWRpZSAiT25seSBvbmUgJyonIHdpbGRjYXJkIGV4cGFuc2lvbiAiLAorCQkgICAgImlzIHN1cHBvcnRlZCAoZ290ICRucik6ICckZ2xvYidcbiI7CisJfSBlbHNpZiAoJG5yID09IDApIHsKKwkJZGllICJPbmUgJyonIGlzIG5lZWRlZCBmb3IgZ2xvYjogJyRnbG9iJ1xuIjsKKwl9CisJJHJlID0gcXVvdGVtZXRhKCRsZWZ0KSAuICRyZSAuIHF1b3RlbWV0YSgkcmlnaHQpOworCWlmIChsZW5ndGggJGxlZnQgJiYgISgkbGVmdCA9fiBzIS8rJCEhZykpIHsKKwkJZGllICJNaXNzaW5nIHRyYWlsaW5nICcvJyBvbiBsZWZ0IHNpZGUgb2Y6ICckZ2xvYicgKCRsZWZ0KVxuIjsKKwl9CisJaWYgKGxlbmd0aCAkcmlnaHQgJiYgISgkcmlnaHQgPX4gcyFeLyshIWcpKSB7CisJCWRpZSAiTWlzc2luZyBsZWFkaW5nICcvJyBvbiByaWdodCBzaWRlIG9mOiAnJGdsb2InICgkcmlnaHQpXG4iOworCX0KKwlteSAkbGVmdF9yZSA9IHFyL15cL1xRJGxlZnRcRShcL3wkKS87CisJYmxlc3MgeyBsZWZ0ID0+ICRsZWZ0LCByaWdodCA9PiAkcmlnaHQsIGxlZnRfcmVnZXggPT4gJGxlZnRfcmUsCisJICAgICAgICByZWdleCA9PiBxci8kcmUvLCBnbG9iID0+ICRnbG9iIH0sICRjbGFzczsKK30KKworc3ViIGZ1bGxfcGF0aCB7CisJbXkgKCRzZWxmLCAkcGF0aCkgPSBAXzsKKwlyZXR1cm4gKGxlbmd0aCAkc2VsZi0+e2xlZnR9ID8gIiRzZWxmLT57bGVmdH0vIiA6ICcnKSAuCisJICAgICAgICRwYXRoIC4gKGxlbmd0aCAkc2VsZi0+e3JpZ2h0fSA/ICIvJHNlbGYtPntyaWdodH0iIDogJycpOworfQorCitfX0VORF9fCisKK0RhdGEgc3RydWN0dXJlczoKKworCiskcmVtb3RlcyA9IHsgIyByZXR1cm5lZCBieSByZWFkX2FsbF9yZW1vdGVzKCkKKwknc3ZuJyA9PiB7CisJCSMgc3ZuLXJlbW90ZS5zdm4udXJsPWh0dHBzOi8vc3ZuLm11c2ljcGQub3JnCisJCXVybCA9PiAnaHR0cHM6Ly9zdm4ubXVzaWNwZC5vcmcnLAorCQkjIHN2bi1yZW1vdGUuc3ZuLmZldGNoPW1wZC90cnVuazp0cnVuaworCQlmZXRjaCA9PiB7CisJCQknbXBkL3RydW5rJyA9PiAndHJ1bmsnLAorCQl9LAorCQkjIHN2bi1yZW1vdGUuc3ZuLnRhZ3M9bXBkL3RhZ3MvKjp0YWdzLyoKKwkJdGFncyA9PiB7CisJCQlwYXRoID0+IHsKKwkJCQlsZWZ0ID0+ICdtcGQvdGFncycsCisJCQkJcmlnaHQgPT4gJycsCisJCQkJcmVnZXggPT4gcXIhbXBkL3RhZ3MvKFteL10rKSQhLAorCQkJCWdsb2IgPT4gJ3RhZ3MvKicsCisJCQl9LAorCQkJcmVmID0+IHsKKwkJCQlsZWZ0ID0+ICd0YWdzJywKKwkJCQlyaWdodCA9PiAnJywKKwkJCQlyZWdleCA9PiBxciF0YWdzLyhbXi9dKykkISwKKwkJCQlnbG9iID0+ICd0YWdzLyonLAorCQkJfSwKKwkJfQorCX0KK307CisKKyRsb2dfZW50cnkgaGFzaHJlZiBhcyByZXR1cm5lZCBieSBsaWJzdm5fbG9nX2VudHJ5KCkKK3sKKwlsb2cgPT4gJ3doaXRlc3BhY2UtZm9ybWF0dGVkIGxvZyBlbnRyeQorJywJCQkJCQkjIHRyYWlsaW5nIG5ld2xpbmUgaXMgcHJlc2VydmVkCisJcmV2aXNpb24gPT4gJzgnLAkJCSMgaW50ZWdlcgorCWRhdGUgPT4gJzIwMDQtMDItMjRUMTc6MDE6NDQuMTA4MzQ1WicsCSMgY29tbWl0IGRhdGUKKwlhdXRob3IgPT4gJ2NvbW1pdHRlciBuYW1lJworfTsKKworCisjIHRoaXMgaXMgZ2VuZXJhdGVkIGJ5IGdlbmVyYXRlX2RpZmYoKTsKK0Btb2RzID0gYXJyYXkgb2YgZGlmZi1pbmRleCBsaW5lIGhhc2hlcywgZWFjaCBlbGVtZW50IHJlcHJlc2VudHMgb25lIGxpbmUKKwlvZiBkaWZmLWluZGV4IG91dHB1dAorCitkaWZmLWluZGV4IGxpbmUgKCRtIGhhc2gpCit7CisJbW9kZV9hID0+IGZpcnN0IGNvbHVtbiBvZiBkaWZmLWluZGV4IG91dHB1dCwgbm8gbGVhZGluZyAnOicsCisJbW9kZV9iID0+IHNlY29uZCBjb2x1bW4gb2YgZGlmZi1pbmRleCBvdXRwdXQsCisJc2hhMV9iID0+IHNoYTFzdW0gb2YgdGhlIGZpbmFsIGJsb2IsCisJY2hnID0+IGNoYW5nZSB0eXBlIFtNQ1JBRFRdLAorCWZpbGVfYSA9PiBvcmlnaW5hbCBmaWxlIG5hbWUgb2YgYSBmaWxlIChpZmYgY2hnIGlzICdDJyBvciAnUicpCisJZmlsZV9iID0+IG5ldy9jdXJyZW50IGZpbGUgbmFtZSBvZiBhIGZpbGUgKGFueSBjaGcpCit9Cis7CisKKyMgcmV0dmFsIG9mIHJlYWRfdXJsX3BhdGhzeyxfYWxsfSgpOworJGxfbWFwID0geworCSMgcmVwb3NpdG9yeSByb290IHVybAorCSdodHRwczovL3N2bi5tdXNpY3BkLm9yZycgPT4geworCQkjIHJlcG9zaXRvcnkgcGF0aCAJCSMgR0lUX1NWTl9JRAorCQknbXBkL3RydW5rJwkJPT4JJ3RydW5rJywKKwkJJ21wZC90YWdzLzAuMTEuNScJPT4JJ3RhZ3MvMC4xMS41JywKKwl9LAorfQorCitOb3RlczoKKwlJIGRvbid0IHRydXN0IHRoZSBlYWNoKCkgZnVuY3Rpb24gb24gdW5sZXNzIEkgY3JlYXRlZCAlaGFzaCBteXNlbGYKKwliZWNhdXNlIHRoZSBpbnRlcm5hbCBpdGVyYXRvciBtYXkgbm90IGhhdmUgc3RhcnRlZCBhdCBiYXNlLgpkaWZmIC0tZ2l0IGEvZ2l0LXdlYi0tYnJvd3NlLnNoIGIvZ2l0LXdlYi0tYnJvd3NlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM4NDE0OGEKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtd2ViLS1icm93c2Uuc2gKQEAgLTAsMCArMSwxNzEgQEAKKyMhL2Jpbi9zaAorIworIyBUaGlzIHByb2dyYW0gbGF1bmNoIGEgd2ViIGJyb3dzZXIgb24gdGhlIGh0bWwgcGFnZQorIyBkZXNjcmliaW5nIGEgZ2l0IGNvbW1hbmQuCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBDaHJpc3RpYW4gQ291ZGVyCisjIENvcHlyaWdodCAoYykgMjAwNiBUaGVvZG9yZSBZLiBUcydvCisjCisjIFRoaXMgZmlsZSBpcyBoZWF2aWx5IHN0b2xlbiBmcm9tIGdpdC1tZXJnZXRvb2wuc2gsIGJ5CisjIFRoZW9kb3JlIFkuIFRzJ28gKHRoYW5rcykgdGhhdCBpczoKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IFRoZW9kb3JlIFkuIFRzJ28KKyMKKyMgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwgdjIsIG9yIGEgbGF0ZXIgdmVyc2lvbgorIyBhdCB0aGUgZGlzY3JldGlvbiBvZiBKdW5pbyBDIEhhbWFubyBvciBhbnkgb3RoZXIgb2ZmaWNpYWwKKyMgZ2l0IG1haW50YWluZXIuCisjCisKK1VTQUdFPSdbLS1icm93c2VyPWJyb3dzZXJ8LS10b29sPWJyb3dzZXJdIFstLWNvbmZpZz1jb25mLnZhcl0gdXJsL2ZpbGUgLi4uJworCisjIFRoaXMgbXVzdCBiZSBjYXBhYmxlIG9mIHJ1bm5pbmcgb3V0c2lkZSBvZiBnaXQgZGlyZWN0b3J5LCBzbworIyB0aGUgdmFuaWxsYSBnaXQtc2gtc2V0dXAgc2hvdWxkIG5vdCBiZSB1c2VkLgorTk9OR0lUX09LPVllcworLiBnaXQtc2gtc2V0dXAKKwordmFsaWRfY3VzdG9tX3Rvb2woKQoreworCWJyb3dzZXJfY21kPSIkKGdpdCBjb25maWcgImJyb3dzZXIuJDEuY21kIikiCisJdGVzdCAtbiAiJGJyb3dzZXJfY21kIgorfQorCit2YWxpZF90b29sKCkgeworCWNhc2UgIiQxIiBpbgorCQlmaXJlZm94IHwgaWNld2Vhc2VsIHwga29ucXVlcm9yIHwgdzNtIHwgbGlua3MgfCBseW54IHwgZGlsbG8gfCBvcGVuKQorCQkJOzsgIyBoYXBweQorCQkqKQorCQkJdmFsaWRfY3VzdG9tX3Rvb2wgIiQxIiB8fCByZXR1cm4gMQorCQkJOzsKKwllc2FjCit9CisKK2luaXRfYnJvd3Nlcl9wYXRoKCkgeworCWJyb3dzZXJfcGF0aD0kKGdpdCBjb25maWcgImJyb3dzZXIuJDEucGF0aCIpCisJdGVzdCAteiAiJGJyb3dzZXJfcGF0aCIgJiYgYnJvd3Nlcl9wYXRoPSIkMSIKK30KKword2hpbGUgdGVzdCAkIyAhPSAwCitkbworICAgIGNhc2UgIiQxIiBpbgorCS1ifC0tYnJvd3Nlcip8LXR8LS10b29sKikKKwkgICAgY2FzZSAiJCMsJDEiIGluCisJCSosKj0qKQorCQkgICAgYnJvd3Nlcj1gZXhwciAieiQxIiA6ICd6LVtePV0qPVwoLipcKSdgCisJCSAgICA7OworCQkxLCopCisJCSAgICB1c2FnZSA7OworCQkqKQorCQkgICAgYnJvd3Nlcj0iJDIiCisJCSAgICBzaGlmdCA7OworCSAgICBlc2FjCisJICAgIDs7CisJLWN8LS1jb25maWcqKQorCSAgICBjYXNlICIkIywkMSIgaW4KKwkJKiwqPSopCisJCSAgICBjb25mPWBleHByICJ6JDEiIDogJ3otW149XSo9XCguKlwpJ2AKKwkJICAgIDs7CisJCTEsKikKKwkJICAgIHVzYWdlIDs7CisJCSopCisJCSAgICBjb25mPSIkMiIKKwkJICAgIHNoaWZ0IDs7CisJICAgIGVzYWMKKwkgICAgOzsKKwktLSkKKwkgICAgYnJlYWsKKwkgICAgOzsKKwktKikKKwkgICAgdXNhZ2UKKwkgICAgOzsKKwkqKQorCSAgICBicmVhaworCSAgICA7OworICAgIGVzYWMKKyAgICBzaGlmdAorZG9uZQorCit0ZXN0ICQjID0gMCAmJiB1c2FnZQorCitpZiB0ZXN0IC16ICIkYnJvd3NlciIKK3RoZW4KKyAgICBmb3Igb3B0IGluICIkY29uZiIgIndlYi5icm93c2VyIgorICAgIGRvCisJdGVzdCAteiAiJG9wdCIgJiYgY29udGludWUKKwlicm93c2VyPSJgZ2l0IGNvbmZpZyAkb3B0YCIKKwl0ZXN0IC16ICIkYnJvd3NlciIgfHwgYnJlYWsKKyAgICBkb25lCisgICAgaWYgdGVzdCAtbiAiJGJyb3dzZXIiICYmICEgdmFsaWRfdG9vbCAiJGJyb3dzZXIiOyB0aGVuCisJZWNobyA+JjIgImdpdCBjb25maWcgb3B0aW9uICRvcHQgc2V0IHRvIHVua25vd24gYnJvd3NlcjogJGJyb3dzZXIiCisJZWNobyA+JjIgIlJlc2V0dGluZyB0byBkZWZhdWx0Li4uIgorCXVuc2V0IGJyb3dzZXIKKyAgICBmaQorZmkKKworaWYgdGVzdCAteiAiJGJyb3dzZXIiIDsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRESVNQTEFZIjsgdGhlbgorCWJyb3dzZXJfY2FuZGlkYXRlcz0iZmlyZWZveCBpY2V3ZWFzZWwga29ucXVlcm9yIHczbSBsaW5rcyBseW54IGRpbGxvIgorCWlmIHRlc3QgIiRLREVfRlVMTF9TRVNTSU9OIiA9ICJ0cnVlIjsgdGhlbgorCSAgICBicm93c2VyX2NhbmRpZGF0ZXM9ImtvbnF1ZXJvciAkYnJvd3Nlcl9jYW5kaWRhdGVzIgorCWZpCisgICAgZWxzZQorCWJyb3dzZXJfY2FuZGlkYXRlcz0idzNtIGxpbmtzIGx5bngiCisgICAgZmkKKyAgICAjIFNFQ1VSSVRZU0VTU0lPTklEIGluZGljYXRlcyBhbiBPUyBYIEdVSSBsb2dpbiBzZXNzaW9uCisgICAgaWYgdGVzdCAtbiAiJFNFQ1VSSVRZU0VTU0lPTklEIjsgdGhlbgorCWJyb3dzZXJfY2FuZGlkYXRlcz0ib3BlbiAkYnJvd3Nlcl9jYW5kaWRhdGVzIgorICAgIGZpCisKKyAgICBmb3IgaSBpbiAkYnJvd3Nlcl9jYW5kaWRhdGVzOyBkbworCWluaXRfYnJvd3Nlcl9wYXRoICRpCisJaWYgdHlwZSAiJGJyb3dzZXJfcGF0aCIgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICBicm93c2VyPSRpCisJICAgIGJyZWFrCisJZmkKKyAgICBkb25lCisgICAgdGVzdCAteiAiJGJyb3dzZXIiICYmIGRpZSAiTm8ga25vd24gYnJvd3NlciBhdmFpbGFibGUuIgorZWxzZQorICAgIHZhbGlkX3Rvb2wgIiRicm93c2VyIiB8fCBkaWUgIlVua25vd24gYnJvd3NlciAnJGJyb3dzZXInLiIKKworICAgIGluaXRfYnJvd3Nlcl9wYXRoICIkYnJvd3NlciIKKworICAgIGlmIHRlc3QgLXogIiRicm93c2VyX2NtZCIgJiYgISB0eXBlICIkYnJvd3Nlcl9wYXRoIiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisJZGllICJUaGUgYnJvd3NlciAkYnJvd3NlciBpcyBub3QgYXZhaWxhYmxlIGFzICckYnJvd3Nlcl9wYXRoJy4iCisgICAgZmkKK2ZpCisKK2Nhc2UgIiRicm93c2VyIiBpbgorICAgIGZpcmVmb3h8aWNld2Vhc2VsKQorCSMgQ2hlY2sgdmVyc2lvbiBiZWNhdXNlIGZpcmVmb3ggPCAyLjAgZG9lcyBub3Qgc3VwcG9ydCAiLW5ldy10YWIiLgorCXZlcnM9JChleHByICIkKCRicm93c2VyX3BhdGggLXZlcnNpb24pIiA6ICcuKiBcKFswLTldWzAtOV0qXClcLi4qJykKKwlORVdUQUI9Jy1uZXctdGFiJworCXRlc3QgIiR2ZXJzIiAtbHQgMiAmJiBORVdUQUI9JycKKwkiJGJyb3dzZXJfcGF0aCIgJE5FV1RBQiAiJEAiICYKKwk7OworICAgIGtvbnF1ZXJvcikKKwljYXNlICIkKGJhc2VuYW1lICIkYnJvd3Nlcl9wYXRoIikiIGluCisJICAgIGtvbnF1ZXJvcikKKwkJIyBJdCdzIHNpbXBsZXIgdG8gdXNlIGtmbWNsaWVudCB0byBvcGVuIGEgbmV3IHRhYiBpbiBrb25xdWVyb3IuCisJCWJyb3dzZXJfcGF0aD0iJChlY2hvICIkYnJvd3Nlcl9wYXRoIiB8IHNlZCAtZSAncy9rb25xdWVyb3IkL2tmbWNsaWVudC8nKSIKKwkJdHlwZSAiJGJyb3dzZXJfcGF0aCIgPiAvZGV2L251bGwgMj4mMSB8fCBkaWUgIk5vICckYnJvd3Nlcl9wYXRoJyBmb3VuZC4iCisJCWV2YWwgIiRicm93c2VyX3BhdGgiIG5ld1RhYiAiJEAiCisJCTs7CisJICAgIGtmbWNsaWVudCkKKwkJZXZhbCAiJGJyb3dzZXJfcGF0aCIgbmV3VGFiICIkQCIKKwkJOzsKKwkgICAgKikKKwkJIiRicm93c2VyX3BhdGgiICIkQCIgJgorCQk7OworCWVzYWMKKwk7OworICAgIHczbXxsaW5rc3xseW54fG9wZW4pCisJZXZhbCAiJGJyb3dzZXJfcGF0aCIgIiRAIgorCTs7CisgICAgZGlsbG8pCisJIiRicm93c2VyX3BhdGgiICIkQCIgJgorCTs7CisgICAgKikKKwlpZiB0ZXN0IC1uICIkYnJvd3Nlcl9jbWQiOyB0aGVuCisJICAgICggZXZhbCAkYnJvd3Nlcl9jbWQgIiRAIiApCisJZmkKKwk7OworZXNhYwpkaWZmIC0tZ2l0IGEvZ2l0LmMgYi9naXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGU0NjQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2dpdC5jCkBAIC0wLDAgKzEsNDcxIEBACisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorCitjb25zdCBjaGFyIGdpdF91c2FnZV9zdHJpbmdbXSA9CisJImdpdCBbLS12ZXJzaW9uXSBbLS1leGVjLXBhdGhbPUdJVF9FWEVDX1BBVEhdXSBbLXB8LS1wYWdpbmF0ZXwtLW5vLXBhZ2VyXSBbLS1iYXJlXSBbLS1naXQtZGlyPUdJVF9ESVJdIFstLXdvcmstdHJlZT1HSVRfV09SS19UUkVFXSBbLS1oZWxwXSBDT01NQU5EIFtBUkdTXSI7CisKK3N0YXRpYyBpbnQgaGFuZGxlX29wdGlvbnMoY29uc3QgY2hhcioqKiBhcmd2LCBpbnQqIGFyZ2MsIGludCogZW52Y2hhbmdlZCkKK3sKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwl3aGlsZSAoKmFyZ2MgPiAwKSB7CisJCWNvbnN0IGNoYXIgKmNtZCA9ICgqYXJndilbMF07CisJCWlmIChjbWRbMF0gIT0gJy0nKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogRm9yIGxlZ2FjeSByZWFzb25zLCB0aGUgInZlcnNpb24iIGFuZCAiaGVscCIKKwkJICogY29tbWFuZHMgY2FuIGJlIHdyaXR0ZW4gd2l0aCAiLS0iIHByZXBlbmRlZAorCQkgKiB0byBtYWtlIHRoZW0gbG9vayBsaWtlIGZsYWdzLgorCQkgKi8KKwkJaWYgKCFzdHJjbXAoY21kLCAiLS1oZWxwIikgfHwgIXN0cmNtcChjbWQsICItLXZlcnNpb24iKSkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIENoZWNrIHJlbWFpbmluZyBmbGFncy4KKwkJICovCisJCWlmICghcHJlZml4Y21wKGNtZCwgIi0tZXhlYy1wYXRoIikpIHsKKwkJCWNtZCArPSAxMTsKKwkJCWlmICgqY21kID09ICc9JykKKwkJCQlnaXRfc2V0X2FyZ3ZfZXhlY19wYXRoKGNtZCArIDEpOworCQkJZWxzZSB7CisJCQkJcHV0cyhnaXRfZXhlY19wYXRoKCkpOworCQkJCWV4aXQoMCk7CisJCQl9CisJCX0gZWxzZSBpZiAoIXN0cmNtcChjbWQsICItcCIpIHx8ICFzdHJjbXAoY21kLCAiLS1wYWdpbmF0ZSIpKSB7CisJCQlzZXR1cF9wYWdlcigpOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAiLS1uby1wYWdlciIpKSB7CisJCQlzZXRlbnYoIkdJVF9QQUdFUiIsICJjYXQiLCAxKTsKKwkJCWlmIChlbnZjaGFuZ2VkKQorCQkJCSplbnZjaGFuZ2VkID0gMTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGNtZCwgIi0tZ2l0LWRpciIpKSB7CisJCQlpZiAoKmFyZ2MgPCAyKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJObyBkaXJlY3RvcnkgZ2l2ZW4gZm9yIC0tZ2l0LWRpci5cbiIgKTsKKwkJCQl1c2FnZShnaXRfdXNhZ2Vfc3RyaW5nKTsKKwkJCX0KKwkJCXNldGVudihHSVRfRElSX0VOVklST05NRU5ULCAoKmFyZ3YpWzFdLCAxKTsKKwkJCWlmIChlbnZjaGFuZ2VkKQorCQkJCSplbnZjaGFuZ2VkID0gMTsKKwkJCSgqYXJndikrKzsKKwkJCSgqYXJnYyktLTsKKwkJCWhhbmRsZWQrKzsKKwkJfSBlbHNlIGlmICghcHJlZml4Y21wKGNtZCwgIi0tZ2l0LWRpcj0iKSkgeworCQkJc2V0ZW52KEdJVF9ESVJfRU5WSVJPTk1FTlQsIGNtZCArIDEwLCAxKTsKKwkJCWlmIChlbnZjaGFuZ2VkKQorCQkJCSplbnZjaGFuZ2VkID0gMTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGNtZCwgIi0td29yay10cmVlIikpIHsKKwkJCWlmICgqYXJnYyA8IDIpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIk5vIGRpcmVjdG9yeSBnaXZlbiBmb3IgLS13b3JrLXRyZWUuXG4iICk7CisJCQkJdXNhZ2UoZ2l0X3VzYWdlX3N0cmluZyk7CisJCQl9CisJCQlzZXRlbnYoR0lUX1dPUktfVFJFRV9FTlZJUk9OTUVOVCwgKCphcmd2KVsxXSwgMSk7CisJCQlpZiAoZW52Y2hhbmdlZCkKKwkJCQkqZW52Y2hhbmdlZCA9IDE7CisJCQkoKmFyZ3YpKys7CisJCQkoKmFyZ2MpLS07CisJCX0gZWxzZSBpZiAoIXByZWZpeGNtcChjbWQsICItLXdvcmstdHJlZT0iKSkgeworCQkJc2V0ZW52KEdJVF9XT1JLX1RSRUVfRU5WSVJPTk1FTlQsIGNtZCArIDEyLCAxKTsKKwkJCWlmIChlbnZjaGFuZ2VkKQorCQkJCSplbnZjaGFuZ2VkID0gMTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGNtZCwgIi0tYmFyZSIpKSB7CisJCQlzdGF0aWMgY2hhciBnaXRfZGlyW1BBVEhfTUFYKzFdOworCQkJaXNfYmFyZV9yZXBvc2l0b3J5X2NmZyA9IDE7CisJCQlzZXRlbnYoR0lUX0RJUl9FTlZJUk9OTUVOVCwgZ2V0Y3dkKGdpdF9kaXIsIHNpemVvZihnaXRfZGlyKSksIDApOworCQkJaWYgKGVudmNoYW5nZWQpCisJCQkJKmVudmNoYW5nZWQgPSAxOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJVbmtub3duIG9wdGlvbjogJXNcbiIsIGNtZCk7CisJCQl1c2FnZShnaXRfdXNhZ2Vfc3RyaW5nKTsKKwkJfQorCisJCSgqYXJndikrKzsKKwkJKCphcmdjKS0tOworCQloYW5kbGVkKys7CisJfQorCXJldHVybiBoYW5kbGVkOworfQorCitzdGF0aWMgaW50IHNwbGl0X2NtZGxpbmUoY2hhciAqY21kbGluZSwgY29uc3QgY2hhciAqKiphcmd2KQoreworCWludCBzcmMsIGRzdCwgY291bnQgPSAwLCBzaXplID0gMTY7CisJY2hhciBxdW90ZWQgPSAwOworCisJKmFyZ3YgPSB4bWFsbG9jKHNpemVvZihjaGFyKikgKiBzaXplKTsKKworCS8qIHNwbGl0IGFsaWFzX3N0cmluZyAqLworCSgqYXJndilbY291bnQrK10gPSBjbWRsaW5lOworCWZvciAoc3JjID0gZHN0ID0gMDsgY21kbGluZVtzcmNdOykgeworCQljaGFyIGMgPSBjbWRsaW5lW3NyY107CisJCWlmICghcXVvdGVkICYmIGlzc3BhY2UoYykpIHsKKwkJCWNtZGxpbmVbZHN0KytdID0gMDsKKwkJCXdoaWxlIChjbWRsaW5lWysrc3JjXQorCQkJCQkmJiBpc3NwYWNlKGNtZGxpbmVbc3JjXSkpCisJCQkJOyAvKiBza2lwICovCisJCQlpZiAoY291bnQgPj0gc2l6ZSkgeworCQkJCXNpemUgKz0gMTY7CisJCQkJKmFyZ3YgPSB4cmVhbGxvYygqYXJndiwgc2l6ZW9mKGNoYXIqKSAqIHNpemUpOworCQkJfQorCQkJKCphcmd2KVtjb3VudCsrXSA9IGNtZGxpbmUgKyBkc3Q7CisJCX0gZWxzZSBpZighcXVvdGVkICYmIChjID09ICdcJycgfHwgYyA9PSAnIicpKSB7CisJCQlxdW90ZWQgPSBjOworCQkJc3JjKys7CisJCX0gZWxzZSBpZiAoYyA9PSBxdW90ZWQpIHsKKwkJCXF1b3RlZCA9IDA7CisJCQlzcmMrKzsKKwkJfSBlbHNlIHsKKwkJCWlmIChjID09ICdcXCcgJiYgcXVvdGVkICE9ICdcJycpIHsKKwkJCQlzcmMrKzsKKwkJCQljID0gY21kbGluZVtzcmNdOworCQkJCWlmICghYykgeworCQkJCQlmcmVlKCphcmd2KTsKKwkJCQkJKmFyZ3YgPSBOVUxMOworCQkJCQlyZXR1cm4gZXJyb3IoImNtZGxpbmUgZW5kcyB3aXRoIFxcIik7CisJCQkJfQorCQkJfQorCQkJY21kbGluZVtkc3QrK10gPSBjOworCQkJc3JjKys7CisJCX0KKwl9CisKKwljbWRsaW5lW2RzdF0gPSAwOworCisJaWYgKHF1b3RlZCkgeworCQlmcmVlKCphcmd2KTsKKwkJKmFyZ3YgPSBOVUxMOworCQlyZXR1cm4gZXJyb3IoInVuY2xvc2VkIHF1b3RlIik7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IGhhbmRsZV9hbGlhcyhpbnQgKmFyZ2NwLCBjb25zdCBjaGFyICoqKmFyZ3YpCit7CisJaW50IGVudmNoYW5nZWQgPSAwLCByZXQgPSAwLCBzYXZlZF9lcnJubyA9IGVycm5vOworCWNvbnN0IGNoYXIgKnN1YmRpcjsKKwlpbnQgY291bnQsIG9wdGlvbl9jb3VudDsKKwljb25zdCBjaGFyKiogbmV3X2FyZ3Y7CisJY29uc3QgY2hhciAqYWxpYXNfY29tbWFuZDsKKwljaGFyICphbGlhc19zdHJpbmc7CisJaW50IHVudXNlZF9ub25naXQ7CisKKwlzdWJkaXIgPSBzZXR1cF9naXRfZGlyZWN0b3J5X2dlbnRseSgmdW51c2VkX25vbmdpdCk7CisKKwlhbGlhc19jb21tYW5kID0gKCphcmd2KVswXTsKKwlhbGlhc19zdHJpbmcgPSBhbGlhc19sb29rdXAoYWxpYXNfY29tbWFuZCk7CisJaWYgKGFsaWFzX3N0cmluZykgeworCQlpZiAoYWxpYXNfc3RyaW5nWzBdID09ICchJykgeworCQkJaWYgKCphcmdjcCA+IDEpIHsKKwkJCQlzdHJ1Y3Qgc3RyYnVmIGJ1ZjsKKworCQkJCXN0cmJ1Zl9pbml0KCZidWYsIFBBVEhfTUFYKTsKKwkJCQlzdHJidWZfYWRkc3RyKCZidWYsIGFsaWFzX3N0cmluZyk7CisJCQkJc3FfcXVvdGVfYXJndigmYnVmLCAoKmFyZ3YpICsgMSwgUEFUSF9NQVgpOworCQkJCWZyZWUoYWxpYXNfc3RyaW5nKTsKKwkJCQlhbGlhc19zdHJpbmcgPSBidWYuYnVmOworCQkJfQorCQkJdHJhY2VfcHJpbnRmKCJ0cmFjZTogYWxpYXMgdG8gc2hlbGwgY21kOiAlcyA9PiAlc1xuIiwKKwkJCQkgICAgIGFsaWFzX2NvbW1hbmQsIGFsaWFzX3N0cmluZyArIDEpOworCQkJcmV0ID0gc3lzdGVtKGFsaWFzX3N0cmluZyArIDEpOworCQkJaWYgKHJldCA+PSAwICYmIFdJRkVYSVRFRChyZXQpICYmCisJCQkgICAgV0VYSVRTVEFUVVMocmV0KSAhPSAxMjcpCisJCQkJZXhpdChXRVhJVFNUQVRVUyhyZXQpKTsKKwkJCWRpZSgiRmFpbGVkIHRvIHJ1biAnJXMnIHdoZW4gZXhwYW5kaW5nIGFsaWFzICclcydcbiIsCisJCQkgICAgYWxpYXNfc3RyaW5nICsgMSwgYWxpYXNfY29tbWFuZCk7CisJCX0KKwkJY291bnQgPSBzcGxpdF9jbWRsaW5lKGFsaWFzX3N0cmluZywgJm5ld19hcmd2KTsKKwkJb3B0aW9uX2NvdW50ID0gaGFuZGxlX29wdGlvbnMoJm5ld19hcmd2LCAmY291bnQsICZlbnZjaGFuZ2VkKTsKKwkJaWYgKGVudmNoYW5nZWQpCisJCQlkaWUoImFsaWFzICclcycgY2hhbmdlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiIKKwkJCQkgIllvdSBjYW4gdXNlICchZ2l0JyBpbiB0aGUgYWxpYXMgdG8gZG8gdGhpcy4iLAorCQkJCSBhbGlhc19jb21tYW5kKTsKKwkJbWVtbW92ZShuZXdfYXJndiAtIG9wdGlvbl9jb3VudCwgbmV3X2FyZ3YsCisJCQkJY291bnQgKiBzaXplb2YoY2hhciAqKSk7CisJCW5ld19hcmd2IC09IG9wdGlvbl9jb3VudDsKKworCQlpZiAoY291bnQgPCAxKQorCQkJZGllKCJlbXB0eSBhbGlhcyBmb3IgJXMiLCBhbGlhc19jb21tYW5kKTsKKworCQlpZiAoIXN0cmNtcChhbGlhc19jb21tYW5kLCBuZXdfYXJndlswXSkpCisJCQlkaWUoInJlY3Vyc2l2ZSBhbGlhczogJXMiLCBhbGlhc19jb21tYW5kKTsKKworCQl0cmFjZV9hcmd2X3ByaW50ZihuZXdfYXJndiwKKwkJCQkgICJ0cmFjZTogYWxpYXMgZXhwYW5zaW9uOiAlcyA9PiIsCisJCQkJICBhbGlhc19jb21tYW5kKTsKKworCQluZXdfYXJndiA9IHhyZWFsbG9jKG5ld19hcmd2LCBzaXplb2YoY2hhciopICoKKwkJCQkgICAgKGNvdW50ICsgKmFyZ2NwICsgMSkpOworCQkvKiBpbnNlcnQgYWZ0ZXIgY29tbWFuZCBuYW1lICovCisJCW1lbWNweShuZXdfYXJndiArIGNvdW50LCAqYXJndiArIDEsIHNpemVvZihjaGFyKikgKiAqYXJnY3ApOworCQluZXdfYXJndltjb3VudCsqYXJnY3BdID0gTlVMTDsKKworCQkqYXJndiA9IG5ld19hcmd2OworCQkqYXJnY3AgKz0gY291bnQgLSAxOworCisJCXJldCA9IDE7CisJfQorCisJaWYgKHN1YmRpcikKKwkJY2hkaXIoc3ViZGlyKTsKKworCWVycm5vID0gc2F2ZWRfZXJybm87CisKKwlyZXR1cm4gcmV0OworfQorCitjb25zdCBjaGFyIGdpdF92ZXJzaW9uX3N0cmluZ1tdID0gR0lUX1ZFUlNJT047CisKKyNkZWZpbmUgUlVOX1NFVFVQCSgxPDwwKQorI2RlZmluZSBVU0VfUEFHRVIJKDE8PDEpCisvKgorICogcmVxdWlyZSB3b3JraW5nIHRyZWUgdG8gYmUgcHJlc2VudCAtLSBhbnl0aGluZyB1c2VzIHRoaXMgbmVlZHMKKyAqIFJVTl9TRVRVUCBmb3IgcmVhZGluZyBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisgKi8KKyNkZWZpbmUgTkVFRF9XT1JLX1RSRUUJKDE8PDIpCisKK3N0cnVjdCBjbWRfc3RydWN0IHsKKwljb25zdCBjaGFyICpjbWQ7CisJaW50ICgqZm4pKGludCwgY29uc3QgY2hhciAqKiwgY29uc3QgY2hhciAqKTsKKwlpbnQgb3B0aW9uOworfTsKKworc3RhdGljIGludCBydW5fY29tbWFuZChzdHJ1Y3QgY21kX3N0cnVjdCAqcCwgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCWludCBzdGF0dXM7CisJc3RydWN0IHN0YXQgc3Q7CisJY29uc3QgY2hhciAqcHJlZml4OworCisJcHJlZml4ID0gTlVMTDsKKwlpZiAocC0+b3B0aW9uICYgUlVOX1NFVFVQKQorCQlwcmVmaXggPSBzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJaWYgKHAtPm9wdGlvbiAmIFVTRV9QQUdFUikKKwkJc2V0dXBfcGFnZXIoKTsKKwlpZiAocC0+b3B0aW9uICYgTkVFRF9XT1JLX1RSRUUpCisJCXNldHVwX3dvcmtfdHJlZSgpOworCisJdHJhY2VfYXJndl9wcmludGYoYXJndiwgInRyYWNlOiBidWlsdC1pbjogZ2l0Iik7CisKKwlzdGF0dXMgPSBwLT5mbihhcmdjLCBhcmd2LCBwcmVmaXgpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXMgJiAweGZmOworCisJLyogU29tZWJvZHkgY2xvc2VkIHN0ZG91dD8gKi8KKwlpZiAoZnN0YXQoZmlsZW5vKHN0ZG91dCksICZzdCkpCisJCXJldHVybiAwOworCS8qIElnbm9yZSB3cml0ZSBlcnJvcnMgZm9yIHBpcGVzIGFuZCBzb2NrZXRzLi4gKi8KKwlpZiAoU19JU0ZJRk8oc3Quc3RfbW9kZSkgfHwgU19JU1NPQ0soc3Quc3RfbW9kZSkpCisJCXJldHVybiAwOworCisJLyogQ2hlY2sgZm9yIEVOT1NQQyBhbmQgRUlPIGVycm9ycy4uICovCisJaWYgKGZmbHVzaChzdGRvdXQpKQorCQlkaWUoIndyaXRlIGZhaWx1cmUgb24gc3RhbmRhcmQgb3V0cHV0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKGZlcnJvcihzdGRvdXQpKQorCQlkaWUoInVua25vd24gd3JpdGUgZmFpbHVyZSBvbiBzdGFuZGFyZCBvdXRwdXQiKTsKKwlpZiAoZmNsb3NlKHN0ZG91dCkpCisJCWRpZSgiY2xvc2UgZmFpbGVkIG9uIHN0YW5kYXJkIG91dHB1dDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfaW50ZXJuYWxfY29tbWFuZChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqY21kID0gYXJndlswXTsKKwlzdGF0aWMgc3RydWN0IGNtZF9zdHJ1Y3QgY29tbWFuZHNbXSA9IHsKKwkJeyAiYWRkIiwgY21kX2FkZCwgUlVOX1NFVFVQIHwgTkVFRF9XT1JLX1RSRUUgfSwKKwkJeyAiYW5ub3RhdGUiLCBjbWRfYW5ub3RhdGUsIFJVTl9TRVRVUCB9LAorCQl7ICJhcHBseSIsIGNtZF9hcHBseSB9LAorCQl7ICJhcmNoaXZlIiwgY21kX2FyY2hpdmUgfSwKKwkJeyAiYmxhbWUiLCBjbWRfYmxhbWUsIFJVTl9TRVRVUCB9LAorCQl7ICJicmFuY2giLCBjbWRfYnJhbmNoLCBSVU5fU0VUVVAgfSwKKwkJeyAiYnVuZGxlIiwgY21kX2J1bmRsZSB9LAorCQl7ICJjYXQtZmlsZSIsIGNtZF9jYXRfZmlsZSwgUlVOX1NFVFVQIH0sCisJCXsgImNoZWNrb3V0IiwgY21kX2NoZWNrb3V0LCBSVU5fU0VUVVAgfCBORUVEX1dPUktfVFJFRSB9LAorCQl7ICJjaGVja291dC1pbmRleCIsIGNtZF9jaGVja291dF9pbmRleCwKKwkJCVJVTl9TRVRVUCB8IE5FRURfV09SS19UUkVFfSwKKwkJeyAiY2hlY2stcmVmLWZvcm1hdCIsIGNtZF9jaGVja19yZWZfZm9ybWF0IH0sCisJCXsgImNoZWNrLWF0dHIiLCBjbWRfY2hlY2tfYXR0ciwgUlVOX1NFVFVQIHwgTkVFRF9XT1JLX1RSRUUgfSwKKwkJeyAiY2hlcnJ5IiwgY21kX2NoZXJyeSwgUlVOX1NFVFVQIH0sCisJCXsgImNoZXJyeS1waWNrIiwgY21kX2NoZXJyeV9waWNrLCBSVU5fU0VUVVAgfCBORUVEX1dPUktfVFJFRSB9LAorCQl7ICJjbGVhbiIsIGNtZF9jbGVhbiwgUlVOX1NFVFVQIHwgTkVFRF9XT1JLX1RSRUUgfSwKKwkJeyAiY29tbWl0IiwgY21kX2NvbW1pdCwgUlVOX1NFVFVQIHwgTkVFRF9XT1JLX1RSRUUgfSwKKwkJeyAiY29tbWl0LXRyZWUiLCBjbWRfY29tbWl0X3RyZWUsIFJVTl9TRVRVUCB9LAorCQl7ICJjb25maWciLCBjbWRfY29uZmlnIH0sCisJCXsgImNvdW50LW9iamVjdHMiLCBjbWRfY291bnRfb2JqZWN0cywgUlVOX1NFVFVQIH0sCisJCXsgImRlc2NyaWJlIiwgY21kX2Rlc2NyaWJlLCBSVU5fU0VUVVAgfSwKKwkJeyAiZGlmZiIsIGNtZF9kaWZmIH0sCisJCXsgImRpZmYtZmlsZXMiLCBjbWRfZGlmZl9maWxlcyB9LAorCQl7ICJkaWZmLWluZGV4IiwgY21kX2RpZmZfaW5kZXgsIFJVTl9TRVRVUCB9LAorCQl7ICJkaWZmLXRyZWUiLCBjbWRfZGlmZl90cmVlLCBSVU5fU0VUVVAgfSwKKwkJeyAiZmFzdC1leHBvcnQiLCBjbWRfZmFzdF9leHBvcnQsIFJVTl9TRVRVUCB9LAorCQl7ICJmZXRjaCIsIGNtZF9mZXRjaCwgUlVOX1NFVFVQIH0sCisJCXsgImZldGNoLXBhY2siLCBjbWRfZmV0Y2hfcGFjaywgUlVOX1NFVFVQIH0sCisJCXsgImZldGNoLS10b29sIiwgY21kX2ZldGNoX190b29sLCBSVU5fU0VUVVAgfSwKKwkJeyAiZm10LW1lcmdlLW1zZyIsIGNtZF9mbXRfbWVyZ2VfbXNnLCBSVU5fU0VUVVAgfSwKKwkJeyAiZm9yLWVhY2gtcmVmIiwgY21kX2Zvcl9lYWNoX3JlZiwgUlVOX1NFVFVQIH0sCisJCXsgImZvcm1hdC1wYXRjaCIsIGNtZF9mb3JtYXRfcGF0Y2gsIFJVTl9TRVRVUCB9LAorCQl7ICJmc2NrIiwgY21kX2ZzY2ssIFJVTl9TRVRVUCB9LAorCQl7ICJmc2NrLW9iamVjdHMiLCBjbWRfZnNjaywgUlVOX1NFVFVQIH0sCisJCXsgImdjIiwgY21kX2djLCBSVU5fU0VUVVAgfSwKKwkJeyAiZ2V0LXRhci1jb21taXQtaWQiLCBjbWRfZ2V0X3Rhcl9jb21taXRfaWQgfSwKKwkJeyAiZ3JlcCIsIGNtZF9ncmVwLCBSVU5fU0VUVVAgfCBVU0VfUEFHRVIgfSwKKwkJeyAiaGVscCIsIGNtZF9oZWxwIH0sCisjaWZuZGVmIE5PX0NVUkwKKwkJeyAiaHR0cC1mZXRjaCIsIGNtZF9odHRwX2ZldGNoLCBSVU5fU0VUVVAgfSwKKyNlbmRpZgorCQl7ICJpbml0IiwgY21kX2luaXRfZGIgfSwKKwkJeyAiaW5pdC1kYiIsIGNtZF9pbml0X2RiIH0sCisJCXsgImxvZyIsIGNtZF9sb2csIFJVTl9TRVRVUCB8IFVTRV9QQUdFUiB9LAorCQl7ICJscy1maWxlcyIsIGNtZF9sc19maWxlcywgUlVOX1NFVFVQIH0sCisJCXsgImxzLXRyZWUiLCBjbWRfbHNfdHJlZSwgUlVOX1NFVFVQIH0sCisJCXsgImxzLXJlbW90ZSIsIGNtZF9sc19yZW1vdGUgfSwKKwkJeyAibWFpbGluZm8iLCBjbWRfbWFpbGluZm8gfSwKKwkJeyAibWFpbHNwbGl0IiwgY21kX21haWxzcGxpdCB9LAorCQl7ICJtZXJnZS1iYXNlIiwgY21kX21lcmdlX2Jhc2UsIFJVTl9TRVRVUCB9LAorCQl7ICJtZXJnZS1maWxlIiwgY21kX21lcmdlX2ZpbGUgfSwKKwkJeyAibWVyZ2Utb3VycyIsIGNtZF9tZXJnZV9vdXJzLCBSVU5fU0VUVVAgfSwKKwkJeyAibWVyZ2UtcmVjdXJzaXZlIiwgY21kX21lcmdlX3JlY3Vyc2l2ZSwgUlVOX1NFVFVQIHwgTkVFRF9XT1JLX1RSRUUgfSwKKwkJeyAibWVyZ2Utc3VidHJlZSIsIGNtZF9tZXJnZV9yZWN1cnNpdmUsIFJVTl9TRVRVUCB8IE5FRURfV09SS19UUkVFIH0sCisJCXsgIm12IiwgY21kX212LCBSVU5fU0VUVVAgfCBORUVEX1dPUktfVFJFRSB9LAorCQl7ICJuYW1lLXJldiIsIGNtZF9uYW1lX3JldiwgUlVOX1NFVFVQIH0sCisJCXsgInBhY2stb2JqZWN0cyIsIGNtZF9wYWNrX29iamVjdHMsIFJVTl9TRVRVUCB9LAorCQl7ICJwZWVrLXJlbW90ZSIsIGNtZF9sc19yZW1vdGUgfSwKKwkJeyAicGlja2F4ZSIsIGNtZF9ibGFtZSwgUlVOX1NFVFVQIH0sCisJCXsgInBydW5lIiwgY21kX3BydW5lLCBSVU5fU0VUVVAgfSwKKwkJeyAicHJ1bmUtcGFja2VkIiwgY21kX3BydW5lX3BhY2tlZCwgUlVOX1NFVFVQIH0sCisJCXsgInB1c2giLCBjbWRfcHVzaCwgUlVOX1NFVFVQIH0sCisJCXsgInJlYWQtdHJlZSIsIGNtZF9yZWFkX3RyZWUsIFJVTl9TRVRVUCB9LAorCQl7ICJyZWZsb2ciLCBjbWRfcmVmbG9nLCBSVU5fU0VUVVAgfSwKKwkJeyAicmVtb3RlIiwgY21kX3JlbW90ZSwgUlVOX1NFVFVQIH0sCisJCXsgInJlcG8tY29uZmlnIiwgY21kX2NvbmZpZyB9LAorCQl7ICJyZXJlcmUiLCBjbWRfcmVyZXJlLCBSVU5fU0VUVVAgfSwKKwkJeyAicmVzZXQiLCBjbWRfcmVzZXQsIFJVTl9TRVRVUCB9LAorCQl7ICJyZXYtbGlzdCIsIGNtZF9yZXZfbGlzdCwgUlVOX1NFVFVQIH0sCisJCXsgInJldi1wYXJzZSIsIGNtZF9yZXZfcGFyc2UgfSwKKwkJeyAicmV2ZXJ0IiwgY21kX3JldmVydCwgUlVOX1NFVFVQIHwgTkVFRF9XT1JLX1RSRUUgfSwKKwkJeyAicm0iLCBjbWRfcm0sIFJVTl9TRVRVUCB9LAorCQl7ICJzZW5kLXBhY2siLCBjbWRfc2VuZF9wYWNrLCBSVU5fU0VUVVAgfSwKKwkJeyAic2hvcnRsb2ciLCBjbWRfc2hvcnRsb2csIFVTRV9QQUdFUiB9LAorCQl7ICJzaG93LWJyYW5jaCIsIGNtZF9zaG93X2JyYW5jaCwgUlVOX1NFVFVQIH0sCisJCXsgInNob3ciLCBjbWRfc2hvdywgUlVOX1NFVFVQIHwgVVNFX1BBR0VSIH0sCisJCXsgInN0YXR1cyIsIGNtZF9zdGF0dXMsIFJVTl9TRVRVUCB8IE5FRURfV09SS19UUkVFIH0sCisJCXsgInN0cmlwc3BhY2UiLCBjbWRfc3RyaXBzcGFjZSB9LAorCQl7ICJzeW1ib2xpYy1yZWYiLCBjbWRfc3ltYm9saWNfcmVmLCBSVU5fU0VUVVAgfSwKKwkJeyAidGFnIiwgY21kX3RhZywgUlVOX1NFVFVQIH0sCisJCXsgInRhci10cmVlIiwgY21kX3Rhcl90cmVlIH0sCisJCXsgInVucGFjay1vYmplY3RzIiwgY21kX3VucGFja19vYmplY3RzLCBSVU5fU0VUVVAgfSwKKwkJeyAidXBkYXRlLWluZGV4IiwgY21kX3VwZGF0ZV9pbmRleCwgUlVOX1NFVFVQIH0sCisJCXsgInVwZGF0ZS1yZWYiLCBjbWRfdXBkYXRlX3JlZiwgUlVOX1NFVFVQIH0sCisJCXsgInVwbG9hZC1hcmNoaXZlIiwgY21kX3VwbG9hZF9hcmNoaXZlIH0sCisJCXsgInZlcmlmeS10YWciLCBjbWRfdmVyaWZ5X3RhZywgUlVOX1NFVFVQIH0sCisJCXsgInZlcnNpb24iLCBjbWRfdmVyc2lvbiB9LAorCQl7ICJ3aGF0Y2hhbmdlZCIsIGNtZF93aGF0Y2hhbmdlZCwgUlVOX1NFVFVQIHwgVVNFX1BBR0VSIH0sCisJCXsgIndyaXRlLXRyZWUiLCBjbWRfd3JpdGVfdHJlZSwgUlVOX1NFVFVQIH0sCisJCXsgInZlcmlmeS1wYWNrIiwgY21kX3ZlcmlmeV9wYWNrIH0sCisJCXsgInNob3ctcmVmIiwgY21kX3Nob3dfcmVmLCBSVU5fU0VUVVAgfSwKKwkJeyAicGFjay1yZWZzIiwgY21kX3BhY2tfcmVmcywgUlVOX1NFVFVQIH0sCisJfTsKKwlpbnQgaTsKKworCS8qIFR1cm4gImdpdCBjbWQgLS1oZWxwIiBpbnRvICJnaXQgaGVscCBjbWQiICovCisJaWYgKGFyZ2MgPiAxICYmICFzdHJjbXAoYXJndlsxXSwgIi0taGVscCIpKSB7CisJCWFyZ3ZbMV0gPSBhcmd2WzBdOworCQlhcmd2WzBdID0gY21kID0gImhlbHAiOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvbW1hbmRzKTsgaSsrKSB7CisJCXN0cnVjdCBjbWRfc3RydWN0ICpwID0gY29tbWFuZHMraTsKKwkJaWYgKHN0cmNtcChwLT5jbWQsIGNtZCkpCisJCQljb250aW51ZTsKKwkJZXhpdChydW5fY29tbWFuZChwLCBhcmdjLCBhcmd2KSk7CisJfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqY21kID0gYXJndlswXSA/IGFyZ3ZbMF0gOiAiZ2l0LWhlbHAiOworCWNoYXIgKnNsYXNoID0gc3RycmNocihjbWQsICcvJyk7CisJY29uc3QgY2hhciAqY21kX3BhdGggPSBOVUxMOworCWludCBkb25lX2FsaWFzID0gMDsKKworCS8qCisJICogVGFrZSB0aGUgYmFzZW5hbWUgb2YgYXJndlswXSBhcyB0aGUgY29tbWFuZAorCSAqIG5hbWUsIGFuZCB0aGUgZGlybmFtZSBhcyB0aGUgZGVmYXVsdCBleGVjX3BhdGgKKwkgKiBpZiB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIGJldHRlci4KKwkgKi8KKwlpZiAoc2xhc2gpIHsKKwkJKnNsYXNoKysgPSAwOworCQljbWRfcGF0aCA9IGNtZDsKKwkJY21kID0gc2xhc2g7CisJfQorCisJLyoKKwkgKiAiZ2l0LXh4eHgiIGlzIHRoZSBzYW1lIGFzICJnaXQgeHh4eCIsIGJ1dCB3ZSBvYnZpb3VzbHk6CisJICoKKwkgKiAgLSBjYW5ub3QgdGFrZSBmbGFncyBpbiBiZXR3ZWVuIHRoZSAiZ2l0IiBhbmQgdGhlICJ4eHh4Ii4KKwkgKiAgLSBjYW5ub3QgZXhlY3V0ZSBpdCBleHRlcm5hbGx5IChzaW5jZSBpdCB3b3VsZCBqdXN0IGRvCisJICogICAgdGhlIHNhbWUgdGhpbmcgb3ZlciBhZ2FpbikKKwkgKgorCSAqIFNvIHdlIGp1c3QgZGlyZWN0bHkgY2FsbCB0aGUgaW50ZXJuYWwgY29tbWFuZCBoYW5kbGVyLCBhbmQKKwkgKiBkaWUgaWYgdGhhdCBvbmUgY2Fubm90IGhhbmRsZSBpdC4KKwkgKi8KKwlpZiAoIXByZWZpeGNtcChjbWQsICJnaXQtIikpIHsKKwkJY21kICs9IDQ7CisJCWFyZ3ZbMF0gPSBjbWQ7CisJCWhhbmRsZV9pbnRlcm5hbF9jb21tYW5kKGFyZ2MsIGFyZ3YpOworCQlkaWUoImNhbm5vdCBoYW5kbGUgJXMgaW50ZXJuYWxseSIsIGNtZCk7CisJfQorCisJLyogTG9vayBmb3IgZmxhZ3MuLiAqLworCWFyZ3YrKzsKKwlhcmdjLS07CisJaGFuZGxlX29wdGlvbnMoJmFyZ3YsICZhcmdjLCBOVUxMKTsKKwlpZiAoYXJnYyA+IDApIHsKKwkJaWYgKCFwcmVmaXhjbXAoYXJndlswXSwgIi0tIikpCisJCQlhcmd2WzBdICs9IDI7CisJfSBlbHNlIHsKKwkJLyogVGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgYSBjb21tYW5kOyBnaXZlIHRoZW0gaGVscCAqLworCQlwcmludGYoInVzYWdlOiAlc1xuXG4iLCBnaXRfdXNhZ2Vfc3RyaW5nKTsKKwkJbGlzdF9jb21tb25fY21kc19oZWxwKCk7CisJCWV4aXQoMSk7CisJfQorCWNtZCA9IGFyZ3ZbMF07CisKKwkvKgorCSAqIFdlIHVzZSBQQVRIIHRvIGZpbmQgZ2l0IGNvbW1hbmRzLCBidXQgd2UgcHJlcGVuZCBzb21lIGhpZ2hlcgorCSAqIHByZWNpZGVuY2UgcGF0aHM6IHRoZSAiLS1leGVjLXBhdGgiIG9wdGlvbiwgdGhlIEdJVF9FWEVDX1BBVEgKKwkgKiBlbnZpcm9ubWVudCwgYW5kIHRoZSAkKGdpdGV4ZWNkaXIpIGZyb20gdGhlIE1ha2VmaWxlIGF0IGJ1aWxkCisJICogdGltZS4KKwkgKi8KKwlzZXR1cF9wYXRoKGNtZF9wYXRoKTsKKworCXdoaWxlICgxKSB7CisJCS8qIFNlZSBpZiBpdCdzIGFuIGludGVybmFsIGNvbW1hbmQgKi8KKwkJaGFuZGxlX2ludGVybmFsX2NvbW1hbmQoYXJnYywgYXJndik7CisKKwkJLyogLi4gdGhlbiB0cnkgdGhlIGV4dGVybmFsIG9uZXMgKi8KKwkJZXhlY3ZfZ2l0X2NtZChhcmd2KTsKKworCQkvKiBJdCBjb3VsZCBiZSBhbiBhbGlhcyAtLSB0aGlzIHdvcmtzIGFyb3VuZCB0aGUgaW5zYW5pdHkKKwkJICogb2Ygb3ZlcnJpZGluZyAiZ2l0IGxvZyIgd2l0aCAiZ2l0IHNob3ciIGJ5IGhhdmluZworCQkgKiBhbGlhcy5sb2cgPSBzaG93CisJCSAqLworCQlpZiAoZG9uZV9hbGlhcyB8fCAhaGFuZGxlX2FsaWFzKCZhcmdjLCAmYXJndikpCisJCQlicmVhazsKKwkJZG9uZV9hbGlhcyA9IDE7CisJfQorCisJaWYgKGVycm5vID09IEVOT0VOVCkgeworCQlpZiAoZG9uZV9hbGlhcykgeworCQkJZnByaW50ZihzdGRlcnIsICJFeHBhbnNpb24gb2YgYWxpYXMgJyVzJyBmYWlsZWQ7ICIKKwkJCQkiJyVzJyBpcyBub3QgYSBnaXQtY29tbWFuZFxuIiwKKwkJCQljbWQsIGFyZ3ZbMF0pOworCQkJZXhpdCgxKTsKKwkJfQorCQloZWxwX3Vua25vd25fY21kKGNtZCk7CisJfQorCisJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcnVuIGNvbW1hbmQgJyVzJzogJXNcbiIsCisJCWNtZCwgc3RyZXJyb3IoZXJybm8pKTsKKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZ2l0LnNwZWMuaW4gYi9naXQuc3BlYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2EyNmJlCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LnNwZWMuaW4KQEAgLTAsMCArMSwyNzkgQEAKKyMgUGFzcyAtLXdpdGhvdXQgZG9jcyB0byBycG1idWlsZCBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUgZG9jdW1lbnRhdGlvbgorCitOYW1lOiAJCWdpdAorVmVyc2lvbjogCUBAVkVSU0lPTkBACitSZWxlYXNlOiAJMSV7P2Rpc3R9CitTdW1tYXJ5OiAgCUNvcmUgZ2l0IHRvb2xzCitMaWNlbnNlOiAJR1BMCitHcm91cDogCQlEZXZlbG9wbWVudC9Ub29scworVVJMOiAJCWh0dHA6Ly9rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0LworU291cmNlOiAJaHR0cDovL2tlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvJXtuYW1lfS0le3ZlcnNpb259LnRhci5negorQnVpbGRSZXF1aXJlczoJemxpYi1kZXZlbCA+PSAxLjIsIG9wZW5zc2wtZGV2ZWwsIGN1cmwtZGV2ZWwsIGV4cGF0LWRldmVsLCBnZXR0ZXh0ICAleyE/X3dpdGhvdXRfZG9jczosIHhtbHRvLCBhc2NpaWRvYyA+IDYuMC4zfQorQnVpbGRSb290Ogkle190bXBwYXRofS8le25hbWV9LSV7dmVyc2lvbn0tJXtyZWxlYXNlfS1yb290LSUoJXtfX2lkX3V9IC1uKQorCitSZXF1aXJlczoJcGVybC1HaXQgPSAle3ZlcnNpb259LSV7cmVsZWFzZX0KK1JlcXVpcmVzOgl6bGliID49IDEuMiwgcnN5bmMsIGN1cmwsIGxlc3MsIG9wZW5zc2gtY2xpZW50cywgZXhwYXQKK1Byb3ZpZGVzOglnaXQtY29yZSA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfQorT2Jzb2xldGVzOglnaXQtY29yZSA8PSAxLjUuNC4yCitPYnNvbGV0ZXM6CWdpdC1wNAorCislZGVzY3JpcHRpb24KK0dpdCBpcyBhIGZhc3QsIHNjYWxhYmxlLCBkaXN0cmlidXRlZCByZXZpc2lvbiBjb250cm9sIHN5c3RlbSB3aXRoIGFuCit1bnVzdWFsbHkgcmljaCBjb21tYW5kIHNldCB0aGF0IHByb3ZpZGVzIGJvdGggaGlnaC1sZXZlbCBvcGVyYXRpb25zCithbmQgZnVsbCBhY2Nlc3MgdG8gaW50ZXJuYWxzLgorCitUaGUgZ2l0IHJwbSBpbnN0YWxscyB0aGUgY29yZSB0b29scyB3aXRoIG1pbmltYWwgZGVwZW5kZW5jaWVzLiAgVG8KK2luc3RhbGwgYWxsIGdpdCBwYWNrYWdlcywgaW5jbHVkaW5nIHRvb2xzIGZvciBpbnRlZ3JhdGluZyB3aXRoIG90aGVyCitTQ01zLCBpbnN0YWxsIHRoZSBnaXQtYWxsIG1ldGEtcGFja2FnZS4KKworJXBhY2thZ2UgYWxsCitTdW1tYXJ5OglNZXRhLXBhY2thZ2UgdG8gcHVsbCBpbiBhbGwgZ2l0IHRvb2xzCitHcm91cDoJCURldmVsb3BtZW50L1Rvb2xzCitSZXF1aXJlczoJZ2l0ID0gJXt2ZXJzaW9ufS0le3JlbGVhc2V9CitSZXF1aXJlczoJZ2l0LXN2biA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfQorUmVxdWlyZXM6CWdpdC1jdnMgPSAle3ZlcnNpb259LSV7cmVsZWFzZX0KK1JlcXVpcmVzOglnaXQtYXJjaCA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfQorUmVxdWlyZXM6CWdpdC1lbWFpbCA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfQorUmVxdWlyZXM6CWdpdGsgPSAle3ZlcnNpb259LSV7cmVsZWFzZX0KK1JlcXVpcmVzOglnaXQtZ3VpID0gJXt2ZXJzaW9ufS0le3JlbGVhc2V9CitPYnNvbGV0ZXM6CWdpdCA8PSAxLjUuNC4yCisKKyVkZXNjcmlwdGlvbiBhbGwKK0dpdCBpcyBhIGZhc3QsIHNjYWxhYmxlLCBkaXN0cmlidXRlZCByZXZpc2lvbiBjb250cm9sIHN5c3RlbSB3aXRoIGFuCit1bnVzdWFsbHkgcmljaCBjb21tYW5kIHNldCB0aGF0IHByb3ZpZGVzIGJvdGggaGlnaC1sZXZlbCBvcGVyYXRpb25zCithbmQgZnVsbCBhY2Nlc3MgdG8gaW50ZXJuYWxzLgorCitUaGlzIGlzIGEgZHVtbXkgcGFja2FnZSB3aGljaCBicmluZ3MgaW4gYWxsIHN1YnBhY2thZ2VzLgorCislcGFja2FnZSBzdm4KK1N1bW1hcnk6ICAgICAgICBHaXQgdG9vbHMgZm9yIGltcG9ydGluZyBTdWJ2ZXJzaW9uIHJlcG9zaXRvcmllcworR3JvdXA6ICAgICAgICAgIERldmVsb3BtZW50L1Rvb2xzCitSZXF1aXJlczogICAgICAgZ2l0ID0gJXt2ZXJzaW9ufS0le3JlbGVhc2V9LCBzdWJ2ZXJzaW9uCislZGVzY3JpcHRpb24gc3ZuCitHaXQgdG9vbHMgZm9yIGltcG9ydGluZyBTdWJ2ZXJzaW9uIHJlcG9zaXRvcmllcy4KKworJXBhY2thZ2UgY3ZzCitTdW1tYXJ5OiAgICAgICAgR2l0IHRvb2xzIGZvciBpbXBvcnRpbmcgQ1ZTIHJlcG9zaXRvcmllcworR3JvdXA6ICAgICAgICAgIERldmVsb3BtZW50L1Rvb2xzCitSZXF1aXJlczogICAgICAgZ2l0ID0gJXt2ZXJzaW9ufS0le3JlbGVhc2V9LCBjdnMsIGN2c3BzCislZGVzY3JpcHRpb24gY3ZzCitHaXQgdG9vbHMgZm9yIGltcG9ydGluZyBDVlMgcmVwb3NpdG9yaWVzLgorCislcGFja2FnZSBhcmNoCitTdW1tYXJ5OiAgICAgICAgR2l0IHRvb2xzIGZvciBpbXBvcnRpbmcgQXJjaCByZXBvc2l0b3JpZXMKK0dyb3VwOiAgICAgICAgICBEZXZlbG9wbWVudC9Ub29scworUmVxdWlyZXM6ICAgICAgIGdpdCA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfSwgdGxhCislZGVzY3JpcHRpb24gYXJjaAorR2l0IHRvb2xzIGZvciBpbXBvcnRpbmcgQXJjaCByZXBvc2l0b3JpZXMuCisKKyVwYWNrYWdlIGVtYWlsCitTdW1tYXJ5OiAgICAgICAgR2l0IHRvb2xzIGZvciBzZW5kaW5nIGVtYWlsCitHcm91cDogICAgICAgICAgRGV2ZWxvcG1lbnQvVG9vbHMKK1JlcXVpcmVzOglnaXQgPSAle3ZlcnNpb259LSV7cmVsZWFzZX0KKyVkZXNjcmlwdGlvbiBlbWFpbAorR2l0IHRvb2xzIGZvciBzZW5kaW5nIGVtYWlsLgorCislcGFja2FnZSBndWkKK1N1bW1hcnk6ICAgICAgICBHaXQgR1VJIHRvb2wKK0dyb3VwOiAgICAgICAgICBEZXZlbG9wbWVudC9Ub29scworUmVxdWlyZXM6ICAgICAgIGdpdCA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfSwgdGsgPj0gOC40CislZGVzY3JpcHRpb24gZ3VpCitHaXQgR1VJIHRvb2wKKworJXBhY2thZ2UgLW4gZ2l0aworU3VtbWFyeTogICAgICAgIEdpdCByZXZpc2lvbiB0cmVlIHZpc3VhbGlzZXIgKCdnaXRrJykKK0dyb3VwOiAgICAgICAgICBEZXZlbG9wbWVudC9Ub29scworUmVxdWlyZXM6ICAgICAgIGdpdCA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfSwgdGsgPj0gOC40CislZGVzY3JpcHRpb24gLW4gZ2l0aworR2l0IHJldmlzaW9uIHRyZWUgdmlzdWFsaXNlciAoJ2dpdGsnKQorCislcGFja2FnZSAtbiBwZXJsLUdpdAorU3VtbWFyeTogICAgICAgIFBlcmwgaW50ZXJmYWNlIHRvIEdpdAorR3JvdXA6ICAgICAgICAgIERldmVsb3BtZW50L0xpYnJhcmllcworUmVxdWlyZXM6ICAgICAgIGdpdCA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfQorUmVxdWlyZXM6ICAgICAgIHBlcmwoOk1PRFVMRV9DT01QQVRfJShldmFsICJgJXtfX3Blcmx9IC1WOnZlcnNpb25gIjsgZWNobyAkdmVyc2lvbikpCitCdWlsZFJlcXVpcmVzOiAgcGVybChFcnJvcikKKworJWRlc2NyaXB0aW9uIC1uIHBlcmwtR2l0CitQZXJsIGludGVyZmFjZSB0byBHaXQKKworJWRlZmluZSBwYXRoX3NldHRpbmdzIEVUQ19HSVRDT05GSUc9L2V0Yy9naXRjb25maWcgcHJlZml4PSV7X3ByZWZpeH0gbWFuZGlyPSV7X21hbmRpcn0gaHRtbGRpcj0le19kb2NkaXJ9LyV7bmFtZX0tY29yZS0le3ZlcnNpb259CisKKyVwcmVwCislc2V0dXAgLXEKKworJWJ1aWxkCittYWtlICV7X3NtcF9tZmxhZ3N9IENGTEFHUz0iJFJQTV9PUFRfRkxBR1MiIFwKKyAgICAgJXtwYXRoX3NldHRpbmdzfSBcCisgICAgIGFsbCAleyE/X3dpdGhvdXRfZG9jczogZG9jfQorCislaW5zdGFsbAorcm0gLXJmICRSUE1fQlVJTERfUk9PVAorbWFrZSAle19zbXBfbWZsYWdzfSBDRkxBR1M9IiRSUE1fT1BUX0ZMQUdTIiBERVNURElSPSRSUE1fQlVJTERfUk9PVCBcCisgICAgICV7cGF0aF9zZXR0aW5nc30gXAorICAgICBJTlNUQUxMRElSUz12ZW5kb3IgaW5zdGFsbCAleyE/X3dpdGhvdXRfZG9jczogaW5zdGFsbC1kb2N9CitmaW5kICRSUE1fQlVJTERfUk9PVCAtdHlwZSBmIC1uYW1lIC5wYWNrbGlzdCAtZXhlYyBybSAtZiB7fSAnOycKK2ZpbmQgJFJQTV9CVUlMRF9ST09UIC10eXBlIGYgLW5hbWUgJyouYnMnIC1lbXB0eSAtZXhlYyBybSAtZiB7fSAnOycKK2ZpbmQgJFJQTV9CVUlMRF9ST09UIC10eXBlIGYgLW5hbWUgcGVybGxvY2FsLnBvZCAtZXhlYyBybSAtZiB7fSAnOycKKworKGZpbmQgJFJQTV9CVUlMRF9ST09UJXtfYmluZGlyfSAtdHlwZSBmIHwgZ3JlcCAtdkUgImFyY2hpbXBvcnR8c3ZufGN2c3xlbWFpbHxnaXRrfGdpdC1ndWl8Z2l0LWNpdG9vbCIgfCBzZWQgLWUgc0BeJFJQTV9CVUlMRF9ST09UQEApICAgICAgICAgICAgICAgPiBiaW4tbWFuLWRvYy1maWxlcworKGZpbmQgJFJQTV9CVUlMRF9ST09UJXtwZXJsX3ZlbmRvcmxpYn0gLXR5cGUgZiB8IHNlZCAtZSBzQF4kUlBNX0JVSUxEX1JPT1RAQCkgPj4gcGVybC1maWxlcworJWlmICV7IT9fd2l0aG91dF9kb2NzOjF9MAorKGZpbmQgJFJQTV9CVUlMRF9ST09UJXtfbWFuZGlyfSAkUlBNX0JVSUxEX1JPT1QvRG9jdW1lbnRhdGlvbiAtdHlwZSBmIHwgZ3JlcCAtdkUgImFyY2hpbXBvcnR8c3ZufGdpdC1jdnN8ZW1haWx8Z2l0a3xnaXQtZ3VpfGdpdC1jaXRvb2wiIHwgc2VkIC1lIHNAXiRSUE1fQlVJTERfUk9PVEBAIC1lICdzLyQvKi8nICkgPj4gYmluLW1hbi1kb2MtZmlsZXMKKyVlbHNlCitybSAtcmYgJFJQTV9CVUlMRF9ST09UJXtfbWFuZGlyfQorJWVuZGlmCisKKyVjbGVhbgorcm0gLXJmICRSUE1fQlVJTERfUk9PVAorCislZmlsZXMgLWYgYmluLW1hbi1kb2MtZmlsZXMKKyVkZWZhdHRyKC0scm9vdCxyb290KQorJXtfZGF0YWRpcn0vZ2l0LWNvcmUvCislZG9jIFJFQURNRSBDT1BZSU5HIERvY3VtZW50YXRpb24vKi50eHQKKyV7IT9fd2l0aG91dF9kb2NzOiAlZG9jIERvY3VtZW50YXRpb24vKi5odG1sIERvY3VtZW50YXRpb24vaG93dG99CisleyE/X3dpdGhvdXRfZG9jczogJWRvYyBEb2N1bWVudGF0aW9uL3RlY2huaWNhbH0KKworJWZpbGVzIHN2bgorJWRlZmF0dHIoLSxyb290LHJvb3QpCisle19iaW5kaXJ9Lypzdm4qCislZG9jIERvY3VtZW50YXRpb24vKnN2bioudHh0CisleyE/X3dpdGhvdXRfZG9jczogJXtfbWFuZGlyfS9tYW4xLypzdm4qLjEqfQorJXshP193aXRob3V0X2RvY3M6ICVkb2MgRG9jdW1lbnRhdGlvbi8qc3ZuKi5odG1sIH0KKworJWZpbGVzIGN2cworJWRlZmF0dHIoLSxyb290LHJvb3QpCislZG9jIERvY3VtZW50YXRpb24vKmdpdC1jdnMqLnR4dAorJXtfYmluZGlyfS8qY3ZzKgorJXshP193aXRob3V0X2RvY3M6ICV7X21hbmRpcn0vbWFuMS8qY3ZzKi4xKn0KKyV7IT9fd2l0aG91dF9kb2NzOiAlZG9jIERvY3VtZW50YXRpb24vKmdpdC1jdnMqLmh0bWwgfQorCislZmlsZXMgYXJjaAorJWRlZmF0dHIoLSxyb290LHJvb3QpCislZG9jIERvY3VtZW50YXRpb24vZ2l0LWFyY2hpbXBvcnQudHh0Cisle19iaW5kaXJ9L2dpdC1hcmNoaW1wb3J0CisleyE/X3dpdGhvdXRfZG9jczogJXtfbWFuZGlyfS9tYW4xL2dpdC1hcmNoaW1wb3J0LjEqfQorJXshP193aXRob3V0X2RvY3M6ICVkb2MgRG9jdW1lbnRhdGlvbi9naXQtYXJjaGltcG9ydC5odG1sIH0KKworJWZpbGVzIGVtYWlsCislZGVmYXR0cigtLHJvb3Qscm9vdCkKKyVkb2MgRG9jdW1lbnRhdGlvbi8qZW1haWwqLnR4dAorJXtfYmluZGlyfS8qZW1haWwqCisleyE/X3dpdGhvdXRfZG9jczogJXtfbWFuZGlyfS9tYW4xLyplbWFpbCouMSp9CisleyE/X3dpdGhvdXRfZG9jczogJWRvYyBEb2N1bWVudGF0aW9uLyplbWFpbCouaHRtbCB9CisKKyVmaWxlcyBndWkKKyVkZWZhdHRyKC0scm9vdCxyb290KQorJXtfYmluZGlyfS9naXQtZ3VpCisle19iaW5kaXJ9L2dpdC1jaXRvb2wKKyV7X2RhdGFkaXJ9L2dpdC1ndWkvCisleyE/X3dpdGhvdXRfZG9jczogJXtfbWFuZGlyfS9tYW4xL2dpdC1ndWkuMSp9CisleyE/X3dpdGhvdXRfZG9jczogJWRvYyBEb2N1bWVudGF0aW9uL2dpdC1ndWkuaHRtbH0KKyV7IT9fd2l0aG91dF9kb2NzOiAle19tYW5kaXJ9L21hbjEvZ2l0LWNpdG9vbC4xKn0KKyV7IT9fd2l0aG91dF9kb2NzOiAlZG9jIERvY3VtZW50YXRpb24vZ2l0LWNpdG9vbC5odG1sfQorCislZmlsZXMgLW4gZ2l0aworJWRlZmF0dHIoLSxyb290LHJvb3QpCislZG9jIERvY3VtZW50YXRpb24vKmdpdGsqLnR4dAorJXtfYmluZGlyfS8qZ2l0ayoKKyV7X2RhdGFkaXJ9L2dpdGsvCisleyE/X3dpdGhvdXRfZG9jczogJXtfbWFuZGlyfS9tYW4xLypnaXRrKi4xKn0KKyV7IT9fd2l0aG91dF9kb2NzOiAlZG9jIERvY3VtZW50YXRpb24vKmdpdGsqLmh0bWwgfQorCislZmlsZXMgLW4gcGVybC1HaXQgLWYgcGVybC1maWxlcworJWRlZmF0dHIoLSxyb290LHJvb3QpCisKKyVmaWxlcyBhbGwKKyMgTm8gZmlsZXMgZm9yIHlvdSEKKworJWNoYW5nZWxvZworKiBGcmkgRmViIDE1IDIwMDggS3Jpc3RpYW4gSMO4Z3NiZXJnIDxrcmhAcmVkaGF0LmNvbT4KKy0gUmVuYW1lIGdpdC1jb3JlIHRvIGp1c3QgZ2l0IGFuZCByZW5hbWUgbWV0YSBwYWNrYWdlIGZyb20gZ2l0IHRvIGdpdC1hbGwuCisKKyogU3VuIEZlYiAwMyAyMDA4IEphbWVzIEJvd2VzIDxqYm93ZXNAZGFuZ2Vyb3VzbHlpbmMuY29tPgorLSBBZGQgYSBCdWlsZFJlcXVpcmVzIGZvciBnZXR0ZXh0CisKKyogRnJpIEphbiAxMSAyMDA4IEp1bmlvIEMgSGFtYW5vIDxnaXRzdGVyQHBvYm94LmNvbT4KKy0gSW5jbHVkZSBnaXRrIG1lc3NhZ2UgZmlsZXMKKworKiBTdW4gSmFuIDA2IDIwMDggSmFtZXMgQm93ZXMgPGpib3dlc0BkYW5nZXJvdXNseWluYy5jb20+CistIE1ha2UgdGhlIG1ldGFwYWNrYWdlIHJlcXVpcmUgdGhlIHNhbWUgdmVyc2lvbiBvZiB0aGUgc3VicGFja2FnZXMuCisKKyogV2VkIERlYyAxMiAyMDA3IEp1bmlvIEMgSGFtYW5vIDxnaXRzdGVyQHBvYm94LmNvbT4KKy0gQWRqdXN0IGh0bWxkaXIgdG8gcG9pbnQgYXQgL3Vzci9zaGFyZS9kb2MvZ2l0LWNvcmUtJHZlcnNpb24vCisKKyogU3VuIEp1bCAxNSAyMDA3IFNlYW4gRXN0YWJyb29rcyA8c2VhbmxrbWxAc3ltcGF0aWNvLmNhPgorLSBSZW1vdmVkIHA0aW1wb3J0LgorCisqIFR1ZSBKdW4gMjYgMjAwNyBRdXkgVG9udGhhdCA8cXRvbnRoYXRAZ21haWwuY29tPgorLSBGaXhlZCBwcm9ibGVtcyBsb29raW5nIGZvciB3cm9uZyBtYW5wYWdlcy4KKworKiBUaHUgSnVuIDIxIDIwMDcgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPgorLSBBZGRlZCBkb2N1bWVudGF0aW9uIGZpbGVzIGZvciBnaXQtZ3VpCisKKyogVHVlIE1heSAxMyAyMDA3IFF1eSBUb250aGF0IDxxdG9udGhhdEBnbWFpbC5jb20+CistIEFkZGVkIGxpYiBmaWxlcyBmb3IgZ2l0LWd1aQorLSBBZGRlZCBEb2N1bWVudGF0aW9uL3RlY2huaWNhbCAoQXMgbmVlZGVkIGJ5IEdpdCBVc2VycyBNYW51YWwpCisKKyogVHVlIE1heSA4IDIwMDcgUXV5IFRvbnRoYXQgPHF0b250aGF0QGdtYWlsLmNvbT4KKy0gQWRkZWQgaG93dG8gZmlsZXMKKworKiBUdWUgTWFyIDI3IDIwMDcgRXlnZW5lIFJ5YWJpbmtpbiA8cmVhLWdpdEBjb2RlbGFicy5ydT4KKy0gQWRkZWQgdGhlIGdpdC1wNCBwYWNrYWdlOiBQZXJmb3JjZSBpbXBvcnQgc3R1ZmYuCisKKyogTW9uIEZlYiAxMyAyMDA3IE5pY29sYXMgUGl0cmUgPG5pY29AY2FtLm9yZz4KKy0gVXBkYXRlIGNvcmUgcGFja2FnZSBkZXNjcmlwdGlvbiAoR2l0IGlzbid0IGFzIHN0dXBpZCBhcyBpdCB1c2VkIHRvIGJlKQorCisqIE1vbiBGZWIgMTIgMjAwNyBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CistIEFkZCBnaXQtZ3VpIGFuZCBnaXQtY2l0b29sLgorCisqIE1vbiBOb3YgMTQgMjAwNSBILiBQZXRlciBBbnZpbiA8aHBhQHp5dG9yLmNvbT4gMC45OS45ai0xCistIENoYW5nZSBzdWJwYWNrYWdlIG5hbWVzIHRvIGdpdC08bmFtZT4gaW5zdGVhZCBvZiBnaXQtY29yZS08bmFtZT4KKy0gQ3JlYXRlIGVtcHR5IHJvb3QgcGFja2FnZSB3aGljaCBicmluZ3MgaW4gYWxsIHN1YnBhY2thZ2VzCistIFJlbmFtZSBnaXQtdGsgLT4gZ2l0aworCisqIFRodSBOb3YgMTAgMjAwNSBDaHJpcyBXcmlnaHQgPGNocmlzd0Bvc2RsLm9yZz4gMC45OS45Zy0xCistIHpsaWIgZGVwZW5kZW5jeSBmaXgKKy0gTWlub3IgY2xlYW51cHMgZnJvbSBzcGxpdAorLSBNb3ZlIGFyY2ggaW1wb3J0IHRvIHNlcGFyYXRlIHBhY2thZ2UgYXMgd2VsbAorCisqIFR1ZSBTZXAgMjcgMjAwNSBKaW0gUmFkZm9yZCA8cmFkZm9yZEBibGFja2JlYW4ub3JnPgorLSBNb3ZlIHByb2dyYW1zIHdpdGggbm9uLXN0YW5kYXJkIGRlcGVuZGVuY2llcyAoc3ZuLCBjdnMsIGVtYWlsKQorICBpbnRvIHNlcGFyYXRlIHBhY2thZ2VzCisKKyogVHVlIFNlcCAyNyAyMDA1IEguIFBldGVyIEFudmluIDxocGFAenl0b3IuY29tPgorLSBwYXJhbGxlbGl6ZSBidWlsZAorLSBDT1BUUyAtPiBDRkxBR1MKKworKiBGcmkgU2VwIDE2IDIwMDUgQ2hyaXMgV3JpZ2h0IDxjaHJpc3dAb3NkbC5vcmc+IDAuOTkuNi0xCistIHVwZGF0ZSB0byAwLjk5LjYKKworKiBGcmkgU2VwIDE2IDIwMDUgSG9yc3QgSC4gdm9uIEJyYW5kIDx2b25icmFuZEBpbmYudXRmc20uY2w+CistIExpbnVzIG5vdGljZWQgdGhhdCBsZXNzIGlzIHJlcXVpcmVkLCBhZGRlZCB0byB0aGUgZGVwZW5kZW5jaWVzCisKKyogU3VuIFNlcCAxMSAyMDA1IEhvcnN0IEguIHZvbiBCcmFuZCA8dm9uYnJhbmRAaW5mLnV0ZnNtLmNsPgorLSBVcGRhdGVkIGRlcGVuZGVuY2llcworLSBEb24ndCBhc3N1bWUgbWFucGFnZXMgYXJlIGd6aXBwZWQKKworKiBUaHUgQXVnIDE4IDIwMDUgQ2hyaXMgV3JpZ2h0IDxjaHJpc3dAb3NkbC5vcmc+IDAuOTkuNC00CistIGRyb3Agc2hfdXRpbHMsIHNoLXV0aWxzLCBkaWZmdXRpbHMsIG1rdGVtcCwgYW5kIG9wZW5zc2wgUmVxdWlyZXMKKy0gdXNlIFJQTV9PUFRfRkxBR1MgaW4gc3BlYyBmaWxlLCBkcm9wIHBhdGNoMAorCisqIFdlZCBBdWcgMTcgMjAwNSBUb20gInNwb3QiIENhbGxhd2F5IDx0Y2FsbGF3YUByZWRoYXQuY29tPiAwLjk5LjQtMworLSB1c2UgZGlzdCB0YWcgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGJyYW5jaGVzCistIHVzZSBycG0gb3B0ZmxhZ3MgYnkgZGVmYXVsdCAocGF0Y2gwKQorLSBvd24gJXtfZGF0YWRpcn0vZ2l0LWNvcmUvCisKKyogTW9uIEF1ZyAxNSAyMDA1IENocmlzIFdyaWdodCA8Y2hyaXN3QG9zZGwub3JnPgorLSB1cGRhdGUgc3BlYyBmaWxlIHRvIGZpeCBCdWlsZHJvb3QsIFJlcXVpcmVzLCBhbmQgZHJvcCBWZW5kb3IKKworKiBTdW4gQXVnIDA3IDIwMDUgSG9yc3QgSC4gdm9uIEJyYW5kIDx2b25icmFuZEBpbmYudXRmc20uY2w+CistIFJlZGlkIHRoZSBkZXNjcmlwdGlvbgorLSBDdXQgb3ZlcmxvbmcgbWFrZSBsaW5lLCBsb29zZW5lZCBjaGFuZ2Vsb2cgYSBiaXQKKy0gSSB0aGluayBKdW5pbyAob3IgcGVyaGFwcyBPU0RMPykgc2hvdWxkIGJlIHZlbmRvci4uLgorCisqIFRodSBKdWwgMTQgMjAwNSBFcmljIEJpZWRlcm1hbiA8ZWJpZWRlcm1AeG1pc3Npb24uY29tPgorLSBBZGQgdGhlIG1hbiBwYWdlcywgYW5kIHRoZSAtLXdpdGhvdXQgZG9jcyBidWlsZCBvcHRpb24KKworKiBXZWQgSnVsIDcgMjAwNSBDaHJpcyBXcmlnaHQgPGNocmlzQG9zZGwub3JnPgorLSBpbml0aWFsIGdpdCBzcGVjIGZpbGUKZGlmZiAtLWdpdCBhL2dpdGstZ2l0L01ha2VmaWxlIGIvZ2l0ay1naXQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkwZGZhYgotLS0gL2Rldi9udWxsCisrKyBiL2dpdGstZ2l0L01ha2VmaWxlCkBAIC0wLDAgKzEsNjcgQEAKKyMgVGhlIGRlZmF1bHQgdGFyZ2V0IG9mIHRoaXMgTWFrZWZpbGUgaXMuLi4KK2FsbDo6CisKK3ByZWZpeCA/PSAkKEhPTUUpCitiaW5kaXIgPz0gJChwcmVmaXgpL2Jpbgorc2hhcmVkaXIgPz0gJChwcmVmaXgpL3NoYXJlCitnaXRrX2xpYmRpciAgID89ICQoc2hhcmVkaXIpL2dpdGsvbGliCittc2dzZGlyICAgID89ICQoZ2l0a19saWJkaXIpL21zZ3MKK21zZ3NkaXJfU1EgID0gJChzdWJzdCAnLCdcJycsJChtc2dzZGlyKSkKKworVENMX1BBVEggPz0gdGNsc2gKK1RDTFRLX1BBVEggPz0gd2lzaAorSU5TVEFMTCA/PSBpbnN0YWxsCitSTSA/PSBybSAtZgorCitERVNURElSX1NRID0gJChzdWJzdCAnLCdcJycsJChERVNURElSKSkKK2JpbmRpcl9TUSA9ICQoc3Vic3QgJywnXCcnLCQoYmluZGlyKSkKK1RDTFRLX1BBVEhfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKFRDTFRLX1BBVEgpKQorCisjIyBwby1maWxlIGNyZWF0aW9uIHJ1bGVzCitYR0VUVEVYVCAgID89IHhnZXR0ZXh0CitpZmRlZiBOT19NU0dGTVQKKwlNU0dGTVQgPz0gJChUQ0xfUEFUSCkgcG8vcG8ybXNnLnNoCitlbHNlCisJTVNHRk1UID89IG1zZ2ZtdAorCWlmbmVxICgkKHNoZWxsICQoTVNHRk1UKSAtLXRjbCAtbCBDIC1kIC4gL2Rldi9udWxsIDI+L2Rldi9udWxsOyBlY2hvICQkPyksMCkKKwkJTVNHRk1UIDo9ICQoVENMX1BBVEgpIHBvL3BvMm1zZy5zaAorCWVuZGlmCitlbmRpZgorCitQT19URU1QTEFURSA9IHBvL2dpdGsucG90CitBTExfUE9GSUxFUyA9ICQod2lsZGNhcmQgcG8vKi5wbykKK0FMTF9NU0dGSUxFUyA9ICQoc3Vic3QgLnBvLC5tc2csJChBTExfUE9GSUxFUykpCisKK2lmbmRlZiBWCisJUVVJRVQgICAgICAgICAgPSBACisJUVVJRVRfR0VOICAgICAgPSAkKFFVSUVUKWVjaG8gJyAgICcgR0VOICRAICYmCitlbmRpZgorCithbGw6OiBnaXRrLXdpc2ggJChBTExfTVNHRklMRVMpCisKK2luc3RhbGw6OiBhbGwKKwkkKElOU1RBTEwpIGdpdGstd2lzaCAnJChERVNURElSX1NRKSQoYmluZGlyX1NRKScvZ2l0aworCSQoSU5TVEFMTCkgLWQgJyQoREVTVERJUl9TUSkkKG1zZ3NkaXJfU1EpJworCSQoZm9yZWFjaCBwLCQoQUxMX01TR0ZJTEVTKSwgJChJTlNUQUxMKSAkcCAnJChERVNURElSX1NRKSQobXNnc2Rpcl9TUSknICYmKSB0cnVlCisKK3VuaW5zdGFsbDo6CisJJChmb3JlYWNoIHAsJChBTExfTVNHRklMRVMpLCAkKFJNKSAnJChERVNURElSX1NRKSQobXNnc2Rpcl9TUSknLyQobm90ZGlyICRwKSAmJikgdHJ1ZQorCSQoUk0pICckKERFU1RESVJfU1EpJChiaW5kaXJfU1EpJy9naXRrCisKK2NsZWFuOjoKKwkkKFJNKSBnaXRrLXdpc2ggcG8vKi5tc2cKKworZ2l0ay13aXNoOiBnaXRrCisJJChRVUlFVF9HRU4pJChSTSkgJEAgJEArICYmIFwKKwlzZWQgLWUgJzEsM3N8XmV4ZWMgLiogIiQkMCJ8ZXhlYyAkKHN1YnN0IHwsJ1x8JywkKFRDTFRLX1BBVEhfU1EpKSAiJCQwInwnIDxnaXRrID4kQCsgJiYgXAorCWNobW9kICt4ICRAKyAmJiBcCisJbXYgLWYgJEArICRACisKKyQoUE9fVEVNUExBVEUpOiBnaXRrCisJJChYR0VUVEVYVCkgLWttYyAtTFRjbCAtbyAkQCBnaXRrCit1cGRhdGUtcG86OiAkKFBPX1RFTVBMQVRFKQorCSQoZm9yZWFjaCBwLCAkKEFMTF9QT0ZJTEVTKSwgZWNobyBVcGRhdGluZyAkcCA7IG1zZ21lcmdlIC1VICRwICQoUE9fVEVNUExBVEUpIDsgKQorJChBTExfTVNHRklMRVMpOiAlLm1zZyA6ICUucG8KKwlAZWNobyBHZW5lcmF0aW5nIGNhdGFsb2cgJEAKKwkkKE1TR0ZNVCkgLS1zdGF0aXN0aWNzIC0tdGNsICQ8IC1sICQoYmFzZW5hbWUgJChub3RkaXIgJDwpKSAtZCAkKGRpciAkQCkKKwpkaWZmIC0tZ2l0IGEvZ2l0ayBiL2dpdGstZ2l0L2dpdGsKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZ2l0awpyZW5hbWUgdG8gZ2l0ay1naXQvZ2l0awpkaWZmIC0tZ2l0IGEvcG8vLmdpdGlnbm9yZSBiL2dpdGstZ2l0L3BvLy5naXRpZ25vcmUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBvLy5naXRpZ25vcmUKcmVuYW1lIHRvIGdpdGstZ2l0L3BvLy5naXRpZ25vcmUKZGlmZiAtLWdpdCBhL3BvL2RlLnBvIGIvZ2l0ay1naXQvcG8vZGUucG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBvL2RlLnBvCnJlbmFtZSB0byBnaXRrLWdpdC9wby9kZS5wbwpkaWZmIC0tZ2l0IGEvcG8vaXQucG8gYi9naXRrLWdpdC9wby9pdC5wbwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcG8vaXQucG8KcmVuYW1lIHRvIGdpdGstZ2l0L3BvL2l0LnBvCmRpZmYgLS1naXQgYS9wby9wbzJtc2cuc2ggYi9naXRrLWdpdC9wby9wbzJtc2cuc2gKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBvL3BvMm1zZy5zaApyZW5hbWUgdG8gZ2l0ay1naXQvcG8vcG8ybXNnLnNoCmRpZmYgLS1naXQgYS9naXR3ZWIvSU5TVEFMTCBiL2dpdHdlYi9JTlNUQUxMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZDViMGEKLS0tIC9kZXYvbnVsbAorKysgYi9naXR3ZWIvSU5TVEFMTApAQCAtMCwwICsxLDIyNSBAQAorR0lUIHdlYiBJbnRlcmZhY2UgKGdpdHdlYikgSW5zdGFsbGF0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRmlyc3QgeW91IGhhdmUgdG8gZ2VuZXJhdGUgZ2l0d2ViLmNnaSBmcm9tIGdpdHdlYi5wZXJsIHVzaW5nCisibWFrZSBnaXR3ZWIvZ2l0d2ViLmNnaSIsIHRoZW4gY29weSBhcHByb3ByaWF0ZSBmaWxlcyAoZ2l0d2ViLmNnaSwKK2dpdHdlYi5jc3MsIGdpdC1sb2dvLnBuZyBhbmQgZ2l0LWZhdmljb24ucG5nKSB0byB0aGVpciBkZXN0aW5hdGlvbi4KK0ZvciBleGFtcGxlIGlmIGdpdCB3YXMgKG9yIGlzKSBpbnN0YWxsZWQgd2l0aCAvdXNyIHByZWZpeCwgeW91IGNhbiBkbworCisJJCBtYWtlIHByZWZpeD0vdXNyIGdpdHdlYi9naXR3ZWIuY2dpICA7IyBhcyB5b3Vyc2VsZgorCSMgY3AgZ2l0d2ViL2dpdCogL3Zhci93d3cvY2dpLWJpbi8gICAgOyMgYXMgcm9vdAorCitBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gdXNlIGF1dG9jb25mIGdlbmVyYXRlZCAuL2NvbmZpZ3VyZSBzY3JpcHQgdG8KK3NldCB1cCBwYXRoIHRvIGdpdCBiaW5hcmllcyAodmlhIGNvbmZpZy5tYWsuYXV0b2dlbiksIHNvIHlvdSBjYW4gd3JpdGUKK2luc3RlYWQKKworCSQgbWFrZSBjb25maWd1cmUgICAgICAgICAgICAgICAgICAgICA7IyBhcyB5b3Vyc2VsZgorCSQgLi9jb25maWd1cmUgLS1wcmVmaXg9L3VzciAgICAgICAgICA7IyBhcyB5b3Vyc2VsZgorCSQgbWFrZSBnaXR3ZWIvZ2l0d2ViLmNnaSAgICAgICAgICAgICA7IyBhcyB5b3Vyc2VsZgorCSMgY3AgZ2l0d2ViL2dpdCogL3Zhci93d3cvY2dpLWJpbi8gICA7IyBhcyByb290CisKK1RoZSBhYm92ZSBleGFtcGxlIGFzc3VtZXMgdGhhdCB5b3VyIHdlYiBzZXJ2ZXIgaXMgY29uZmlndXJlZCB0byBydW4KK1tleGVjdXRhYmxlXSBmaWxlcyBpbiAvdmFyL3d3dy9jZ2ktYmluLyBhcyBzZXJ2ZXIgc2NyaXB0cyAoYXMgQ0dJCitzY3JpcHRzKS4KKworCitCdWlsZCB0aW1lIGNvbmZpZ3VyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTZWUgYWxzbyAiSG93IHRvIGNvbmZpZ3VyZSBnaXR3ZWIgZm9yIHlvdXIgbG9jYWwgc3lzdGVtIiBpbiBSRUFETUUKK2ZpbGUgZm9yIGdpdHdlYiAoaW4gZ2l0d2ViL1JFQURNRSkuCisKKy0gVGhlcmUgYXJlIG1hbnkgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgd2hpY2ggYWZmZWN0cyBidWlsZGluZyBvZgorICBnaXR3ZWIuY2dpOyBzZWUgImRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgZ2l0d2ViIiBzZWN0aW9uIGluIG1haW4KKyAgKHRvcCBkaXIpIE1ha2VmaWxlLCBhbmQgaW5zdHJ1Y3Rpb25zIGZvciBidWlsZGluZyBnaXR3ZWIvZ2l0d2ViLmNnaQorICB0YXJnZXQuCisKKyAgT25lIG9mIG1vc3QgaW1wb3J0YW50IGlzIHdoZXJlIHRvIGZpbmQgZ2l0IHdyYXBwZXIgYmluYXJ5LiBHaXR3ZWIKKyAgdHJpZXMgdG8gZmluZCBnaXQgd3JhcHBlciBhdCAkKGJpbmRpcikvZ2l0LCBzbyB5b3UgaGF2ZSB0byBzZXQgJGJpbmRpcgorICB3aGVuIGJ1aWxkaW5nIGdpdHdlYi5jZ2ksIG9yICRwcmVmaXggZnJvbSB3aGljaCAkYmluZGlyIGlzIGRlcml2ZWQuIElmCisgIHlvdSBidWlsZCBhbmQgaW5zdGFsbCBnaXR3ZWIgdG9nZXRoZXIgd2l0aCB0aGUgcmVzdCBvZiBnaXQgc3VpdGUsCisgIHRoZXJlIHNob3VsZCBiZSBubyBwcm9ibGVtcy4gT3RoZXJ3aXNlLCBpZiBnaXQgd2FzIGZvciBleGFtcGxlCisgIGluc3RhbGxlZCBmcm9tIGEgYmluYXJ5IHBhY2thZ2UsIHlvdSBoYXZlIHRvIHNldCAkcHJlZml4IChvciAkYmluZGlyKQorICBhY2NvcmRpbmdseS4KKworLSBBbm90aGVyIGltcG9ydGFudCBpc3N1ZSBpcyB3aGVyZSBhcmUgZ2l0IHJlcG9zaXRvcmllcyB5b3Ugd2FudCB0byBtYWtlCisgIGF2YWlsYWJsZSB0byBnaXR3ZWIuIEJ5IGRlZmF1bHQgZ2l0d2ViIHNlYXJjaCBmb3IgcmVwb3NpdG9yaWVzIHVuZGVyCisgIC9wdWIvZ2l0OyBpZiB5b3Ugd2FudCB0byBoYXZlIHByb2plY3RzIHNvbWV3aGVyZSBlbHNlLCBsaWtlIC9ob21lL2dpdCwKKyAgdXNlIEdJVFdFQl9QUk9KRUNUUk9PVCBidWlsZCBjb25maWd1cmF0aW9uIHZhcmlhYmxlLgorCisgIEJ5IGRlZmF1bHQgYWxsIGdpdCByZXBvc2l0b3JpZXMgdW5kZXIgcHJvamVjdHJvb3QgYXJlIHZpc2libGUgYW5kCisgIGF2YWlsYWJsZSB0byBnaXR3ZWIuIExpc3Qgb2YgcHJvamVjdHMgaXMgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgYnkKKyAgc2Nhbm5pbmcgdGhlIHByb2plY3Ryb290IGRpcmVjdG9yeSBmb3IgZ2l0IHJlcG9zaXRvcmllcy4gVGhpcyBjYW4gYmUKKyAgY2hhbmdlZCAoY29uZmlndXJlZCkgYXMgZGVzY3JpYmVkIGluICJHaXR3ZWIgcmVwb3NpdG9yaWVzIiBzZWN0aW9uCisgIGJlbG93LgorCisgIE5vdGUgdGhhdCBnaXR3ZWIgZGVhbHMgZGlyZWN0bHkgd2l0aCBvYmplY3QgZGF0YWJhc2UsIGFuZCBkb2VzIG5vdAorICBuZWVkIHdvcmtpbmcgZGlyZWN0b3J5OyB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBpcyB0aGUgbmFtZSBvZiBpdHMKKyAgcmVwb3NpdG9yeSBvYmplY3QgZGF0YWJhc2UsIHVzdWFsbHkgcHJvamVjdG5hbWUuZ2l0IGZvciBiYXJlCisgIHJlcG9zaXRvcmllcy4gSWYgeW91IHdhbnQgdG8gcHJvdmlkZSBnaXR3ZWIgYWNjZXNzIHRvIG5vbi1iYXJlIChsaXZlKQorICByZXBvc2l0b3J5LCB5b3UgY2FuIG1ha2UgcHJvamVjdG5hbWUuZ2l0IHN5bWJvbGljIGxpbmsgdW5kZXIKKyAgcHJvamVjdHJvb3QgbGlua2luZyB0byBwcm9qZWN0bmFtZS8uZ2l0IChidXQgaXQgaXMganVzdAorICBhIHN1Z2dlc3Rpb24pLgorCistIFlvdSBjYW4gY29udHJvbCB3aGVyZSBnaXR3ZWIgdHJpZXMgdG8gZmluZCBpdHMgbWFpbiBDU1Mgc3R5bGUgZmlsZSwKKyAgaXRzIGZhdmljb24gYW5kIGxvZ28gd2l0aCBHSVRXRUJfQ1NTLCBHSVRXRUJfRkFWSUNPTiBhbmQgR0lUV0VCX0xPR08KKyAgYnVpbGQgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMuIEJ5IGRlZmF1bHQgZ2l0d2ViIHRyaWVzIHRvIGZpbmQgdGhlbQorICBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgZ2l0d2ViLmNnaSBzY3JpcHQuCisKK0J1aWxkIGV4YW1wbGUKK35+fn5+fn5+fn5+fn4KKworLSBUbyBpbnN0YWxsIGdpdHdlYiB0byAvdmFyL3d3dy9jZ2ktYmluL2dpdHdlYi8gd2hlbiBnaXQgd3JhcHBlcgorICBpcyBpbnN0YWxsZWQgYXQgL3Vzci9sb2NhbC9iaW4vZ2l0IGFuZCB0aGUgcmVwb3NpdG9yaWVzIChwcm9qZWN0cykKKyAgd2Ugd2FudCB0byBkaXNwbGF5IGFyZSB1bmRlciAvaG9tZS9sb2NhbC9zY20sIHlvdSBjYW4gZG8KKworCW1ha2UgR0lUV0VCX1BST0pFQ1RST09UPSIvaG9tZS9sb2NhbC9zY20iIFwKKwkgICAgIEdJVFdFQl9DU1M9Ii9naXR3ZWIvZ2l0d2ViLmNzcyIgXAorCSAgICAgR0lUV0VCX0xPR089Ii9naXR3ZWIvZ2l0LWxvZ28ucG5nIiBcCisJICAgICBHSVRXRUJfRkFWSUNPTj0iL2dpdHdlYi9naXQtZmF2aWNvbi5wbmciIFwKKwkgICAgIGJpbmRpcj0vdXNyL2xvY2FsL2JpbiBcCisJICAgICBnaXR3ZWIvZ2l0d2ViLmNnaQorCisJY3AgLWZ2IH4vZ2l0L2dpdHdlYi9naXR3ZWIue2NnaSxjc3N9IFwKKwkgICAgICAgfi9naXQvZ2l0d2ViL2dpdC17ZmF2aWNvbixsb2dvfS5wbmcgXAorCSAgICAgL3Zhci93d3cvY2dpLWJpbi9naXR3ZWIvCisKKworR2l0d2ViIGNvbmZpZyBmaWxlCistLS0tLS0tLS0tLS0tLS0tLS0KKworU2VlIGFsc28gIlJ1bnRpbWUgZ2l0d2ViIGNvbmZpZ3VyYXRpb24iIHNlY3Rpb24gaW4gUkVBRE1FIGZpbGUKK2ZvciBnaXR3ZWIgKGluIGdpdHdlYi9SRUFETUUpLgorCistIFlvdSBjYW4gY29uZmlndXJlIGdpdHdlYiBmdXJ0aGVyIHVzaW5nIGdpdHdlYiBjb25maWd1cmF0aW9uIGZpbGU7CisgIGJ5IGRlZmF1bHQgaXQgaXMgZmlsZSBuYW1lZCBnaXR3ZWJfY29uZmlnLnBlcmwgaW4gdGhlIHNhbWUgcGxhY2UgYXMKKyAgZ2l0d2ViLmNnaSBzY3JpcHQuIFlvdSBjYW4gY29udHJvbCBkZWZhdWx0IHBsYWNlIGZvciBjb25maWcgZmlsZQorICB1c2luZyBHSVRXRUJfQ09ORklHIGJ1aWxkIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUsIGFuZCB5b3UgY2FuIHNldCBpdAorICB1c2luZyBHSVRXRUJfQ09ORklHIGVudmlyb25tZW50YWwgdmFyaWFibGUuCisKKy0gR2l0d2ViIGNvbmZpZyBmaWxlIGlzIFtmcmFnbWVudF0gb2YgcGVybCBjb2RlLiBZb3UgY2FuIHNldCB2YXJpYWJsZXMKKyAgdXNpbmcgIm91ciAkdmFyaWFibGUgPSB2YWx1ZSI7IHRleHQgZnJvbSAiIyIgY2hhcmFjdGVyIHVudGlsIHRoZSBlbmQKKyAgb2YgYSBsaW5lIGlzIGlnbm9yZWQuIFNlZSBwZXJsc3luKDEpIGZvciBkZXRhaWxzLgorCisgIFNlZSB0aGUgdG9wIG9mIGdpdHdlYi5wZXJsIGZpbGUgZm9yIGV4YW1wbGVzIG9mIGN1c3RvbWl6YWJsZSBvcHRpb25zLgorCitDb25maWcgZmlsZSBleGFtcGxlCit+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RvIGVuYWJsZSBibGFtZSwgcGlja2F4ZSBzZWFyY2gsIGFuZCBzbmFwc2hvdCBzdXBwb3J0LCB3aGlsZSBhbGxvd2luZworaW5kaXZpZHVhbCBwcm9qZWN0cyB0byB0dXJuIHRoZW0gb2ZmLCBwdXQgdGhlIGZvbGxvd2luZyBpbiB5b3VyCitHSVRXRUJfQ09ORklHIGZpbGU6CisKKwkkZmVhdHVyZXsnYmxhbWUnfXsnZGVmYXVsdCd9ID0gWzFdOworCSRmZWF0dXJleydibGFtZSd9eydvdmVycmlkZSd9ID0gMTsKKworCSRmZWF0dXJleydwaWNrYXhlJ317J2RlZmF1bHQnfSA9IFsxXTsKKwkkZmVhdHVyZXsncGlja2F4ZSd9eydvdmVycmlkZSd9ID0gMTsKKworCSRmZWF0dXJleydzbmFwc2hvdCd9eydkZWZhdWx0J30gPSBbJ3ppcCcsICd0Z3onXTsKKwkkZmVhdHVyZXsnc25hcHNob3QnfXsnb3ZlcnJpZGUnfSA9IDE7CisKKworR2l0d2ViIHJlcG9zaXRvcmllcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEJ5IGRlZmF1bHQgYWxsIGdpdCByZXBvc2l0b3JpZXMgdW5kZXIgcHJvamVjdHJvb3QgYXJlIHZpc2libGUgYW5kCisgIGF2YWlsYWJsZSB0byBnaXR3ZWIuIExpc3Qgb2YgcHJvamVjdHMgaXMgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgYnkKKyAgc2Nhbm5pbmcgdGhlIHByb2plY3Ryb290IGRpcmVjdG9yeSBmb3IgZ2l0IHJlcG9zaXRvcmllcyAoZm9yIG9iamVjdAorICBkYXRhYmFzZXMgdG8gYmUgbW9yZSBleGFjdCkuCisKKyAgWW91IGNhbiBwcm92aWRlIHByZS1nZW5lcmF0ZWQgbGlzdCBvZiBbdmlzaWJsZV0gcmVwb3NpdG9yaWVzLAorICB0b2dldGhlciB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZWlyIG93bmVycyAodGhlIHByb2plY3Qgb3duZXJzaGlwCisgIGlzIHRha2VuIGZyb20gb3duZXIgb2YgcmVwb3NpdG9yeSBkaXJlY3Rvcnkgb3RoZXJ3aXNlKSwgYnkgc2V0dGluZworICBHSVRXRUJfTElTVCBidWlsZCBjb25maWd1cmF0aW9uIHZhcmlhYmxlIChvciAkcHJvamVjdHNfbGlzdCB2YXJpYWJsZQorICBpbiBnaXR3ZWIgY29uZmlnIGZpbGUpIHRvIHBvaW50IHRvIGEgcGxhaW4gZmlsZS4KKworICBFYWNoIGxpbmUgb2YgcHJvamVjdHMgbGlzdCBmaWxlIHNob3VsZCBjb25zaXN0IG9mIHVybC1lbmNvZGVkIHBhdGgKKyAgdG8gcHJvamVjdCByZXBvc2l0b3J5IGRhdGFiYXNlIChyZWxhdGl2ZSB0byBwcm9qZWN0cm9vdCkgc2VwYXJhdGVkCisgIGJ5IHNwYWNlIGZyb20gdXJsLWVuY29kZWQgcHJvamVjdCBvd25lcjsgc3BhY2VzIGluIGJvdGggcHJvamVjdCBwYXRoCisgIGFuZCBwcm9qZWN0IG93bmVyIGhhdmUgdG8gYmUgZW5jb2RlZCBhcyBlaXRoZXIgJyUyMCcgb3IgJysnLgorCisgIFlvdSBjYW4gZ2VuZXJhdGUgcHJvamVjdHMgbGlzdCBpbmRleCBmaWxlIHVzaW5nIHByb2plY3RfaW5kZXggYWN0aW9uCisgICh0aGUgJ1RYVCcgbGluayBvbiBwcm9qZWN0cyBsaXN0IHBhZ2UpIGRpcmVjdGx5IGZyb20gZ2l0d2ViLgorCistIEJ5IGRlZmF1bHQgZXZlbiBpZiBwcm9qZWN0IGlzIG5vdCB2aXNpYmxlIG9uIHByb2plY3RzIGxpc3QgcGFnZSwgeW91CisgIGNhbiB2aWV3IGl0IG5ldmVydGhlbGVzcyBieSBoYW5kLWNyYWZ0aW5nIGdpdHdlYiBVUkwuIFlvdSBjYW4gc2V0CisgIEdJVFdFQl9TVFJJQ1RfRVhQT1JUIGJ1aWxkIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgKG9yICRzdHJpY3RfZXhwb3J0CisgIHZhcmlhYmxlIGluIGdpdHdlYiBjb25maWcgZmlsZSkgdG8gb25seSBhbGxvdyB2aWV3aW5nIG9mCisgIHJlcG9zaXRvcmllcyBhbHNvIHNob3duIG9uIHRoZSBvdmVydmlldyBwYWdlLgorCistIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gY29uZmlndXJlIGdpdHdlYiB0byBvbmx5IGxpc3QgYW5kIGFsbG93CisgIHZpZXdpbmcgb2YgdGhlIGV4cGxpY2l0bHkgZXhwb3J0ZWQgcmVwb3NpdG9yaWVzLCB2aWEKKyAgR0lUV0VCX0VYUE9SVF9PSyBidWlsZCBjb25maWd1cmF0aW9uIHZhcmlhYmxlIChvciAkZXhwb3J0X29rCisgIHZhcmlhYmxlIGluIGdpdHdlYiBjb25maWcgZmlsZSkuIElmIGl0IGV2YWx1YXRlcyB0byB0cnVlLCBnaXR3ZWIKKyAgc2hvdyByZXBvc2l0b3J5IG9ubHkgaWYgdGhpcyBmaWxlIGV4aXN0cyBpbiBpdHMgb2JqZWN0IGRhdGFiYXNlCisgIChpZiBkaXJlY3RvcnkgaGFzIHRoZSBtYWdpYyBmaWxlICRleHBvcnRfb2spLgorCitHZW5lcmF0aW5nIHByb2plY3RzIGxpc3QgdXNpbmcgZ2l0d2ViCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1dlIGFzc3VtZSB0aGF0IEdJVFdFQl9DT05GSUcgaGFzIGl0cyBkZWZhdWx0IE1ha2VmaWxlIHZhbHVlLCBuYW1lbHkKK2dpdHdlYl9jb25maWcucGVybC4gUHV0IHRoZSBmb2xsb3dpbmcgaW4gZ2l0d2ViX21ha2VfaW5kZXgucGVybCBmaWxlOgorCisJJEdJVFdFQl9DT05GSUcgPSAiZ2l0d2ViX2NvbmZpZy5wZXJsIjsKKwlkbyAkR0lUV0VCX0NPTkZJRyBpZiAtZSAkR0lUV0VCX0NPTkZJRzsKKworCSRwcm9qZWN0c19saXN0ID0gJHByb2plY3Ryb290OworCitUaGVuIGNyZWF0ZSB0aGUgZm9sbG93aW5nIHNjcmlwdCB0byBnZXQgbGlzdCBvZiBwcm9qZWN0IGluIHRoZSBmb3JtYXQKK3N1aXRhYmxlIGZvciBHSVRXRUJfTElTVCBidWlsZCBjb25maWd1cmF0aW9uIHZhcmlhYmxlIChvcgorJHByb2plY3RzX2xpc3QgdmFyaWFibGUgaW4gZ2l0d2ViIGNvbmZpZyk6CisKKwkjIS9iaW4vc2gKKworCWV4cG9ydCBHSVRXRUJfQ09ORklHPSJnaXR3ZWJfbWFrZV9pbmRleC5wZXJsIgorCWV4cG9ydCBHQVRFV0FZX0lOVEVSRkFDRT0iQ0dJLzEuMSIKKwlleHBvcnQgSFRUUF9BQ0NFUFQ9IiovKiIKKwlleHBvcnQgUkVRVUVTVF9NRVRIT0Q9IkdFVCIKKwlleHBvcnQgUVVFUllfU1RSSU5HPSJhPXByb2plY3RfaW5kZXgiCisKKwlwZXJsIC0tIC92YXIvd3d3L2NnaS1iaW4vZ2l0d2ViLmNnaQorCisKK1JlcXVpcmVtZW50cworLS0tLS0tLS0tLS0tCisKKyAtIENvcmUgZ2l0IHRvb2xzCisgLSBQZXJsCisgLSBQZXJsIG1vZHVsZXM6IENHSSwgRW5jb2RlLCBGY250bCwgRmlsZTo6RmluZCwgRmlsZTo6QmFzZW5hbWUuCisgLSB3ZWIgc2VydmVyCisKKworRXhhbXBsZSB3ZWIgc2VydmVyIGNvbmZpZ3VyYXRpb24KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1NlZSBhbHNvICJXZWJzZXJ2ZXIgY29uZmlndXJhdGlvbiIgc2VjdGlvbiBpbiBSRUFETUUgZmlsZSBmb3IgZ2l0d2ViCisoaW4gZ2l0d2ViL1JFQURNRSkuCisKKworLSBBcGFjaGUyLCBnaXR3ZWIgaW5zdGFsbGVkIGFzIENHSSBzY3JpcHQsCisgIHVuZGVyIC92YXIvd3d3L2NnaS1iaW4vCisKKwlTY3JpcHRBbGlhcyAvY2dpLWJpbi8gIi92YXIvd3d3L2NnaS1iaW4vIgorCisJPERpcmVjdG9yeSAiL3Zhci93d3cvY2dpLWJpbiI+CisJICAgIE9wdGlvbnMgSW5kZXhlcyBGb2xsb3dTeW1saW5rcyBFeGVjQ0dJCisJICAgIEFsbG93T3ZlcnJpZGUgTm9uZQorCSAgICBPcmRlciBhbGxvdyxkZW55CisJICAgIEFsbG93IGZyb20gYWxsCisJPC9EaXJlY3Rvcnk+CisKKy0gQXBhY2hlMiwgZ2l0d2ViIGluc3RhbGxlZCBhcyBtb2RfcGVybCBsZWdhY3kgc2NyaXB0LAorICB1bmRlciAvdmFyL3d3dy9wZXJsLworCisJQWxpYXMgL3BlcmwgIi92YXIvd3d3L3BlcmwiCisKKwk8RGlyZWN0b3J5ICIvdmFyL3d3dy9wZXJsIj4KKwkgICAgU2V0SGFuZGxlciBwZXJsLXNjcmlwdAorCSAgICBQZXJsUmVzcG9uc2VIYW5kbGVyIE1vZFBlcmw6OlJlZ2lzdHJ5CisJICAgIFBlcmxPcHRpb25zICtQYXJzZUhlYWRlcnMKKwkgICAgT3B0aW9ucyBJbmRleGVzIEZvbGxvd1N5bWxpbmtzICtFeGVjQ0dJCisJICAgIEFsbG93T3ZlcnJpZGUgTm9uZQorCSAgICBPcmRlciBhbGxvdyxkZW55CisJICAgIEFsbG93IGZyb20gYWxsCisJPC9EaXJlY3Rvcnk+CmRpZmYgLS1naXQgYS9naXR3ZWIvUkVBRE1FIGIvZ2l0d2ViL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTYzMDcxCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0d2ViL1JFQURNRQpAQCAtMCwwICsxLDI3NyBAQAorR0lUIHdlYiBJbnRlcmZhY2UKKz09PT09PT09PT09PT09PT09CisKK1RoZSBvbmUgd29ya2luZyBvbjoKKyAgaHR0cDovL3d3dy5rZXJuZWwub3JnL2dpdC8KKworRnJvbSB0aGUgZ2l0IHZlcnNpb24gMS40LjAgZ2l0d2ViIGlzIGJ1bmRsZWQgd2l0aCBnaXQuCisKKworSG93IHRvIGNvbmZpZ3VyZSBnaXR3ZWIgZm9yIHlvdXIgbG9jYWwgc3lzdGVtCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2VlIGFsc28gIkJ1aWxkIHRpbWUgY29uZmlndXJhdGlvbiIgc2VjdGlvbiBpbiBJTlNUQUxMCitmaWxlIGZvciBnaXR3ZWIgKGluIGdpdHdlYi9JTlNUQUxMKS4KKworWW91IGNhbiBzcGVjaWZ5IHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgd2hlbiBidWlsZGluZyBHSVQ6CisgKiBHSVRfQklORElSCisgICBQb2ludHMgb3V0IHdoZXJlIHRvIGZpbmQgZ2l0IGV4ZWN1dGFibGUuICBZb3Ugc2hvdWxkIHNldCB1cCBpdCB0bworICAgdGhlIHBsYWNlIHdoZXJlIGdpdCBiaW5hcnkgd2FzIGluc3RhbGxlZCAodXN1YWxseSAvdXNyL2JpbikgaWYgeW91CisgICBkb24ndCBpbnN0YWxsIGdpdCBmcm9tIHNvdXJjZXMgdG9nZXRoZXIgd2l0aCBnaXR3ZWIuICBbRGVmYXVsdDogJChiaW5kaXIpXQorICogR0lUV0VCX1NJVEVOQU1FCisgICBTaG93biBpbiB0aGUgdGl0bGUgb2YgYWxsIGdlbmVyYXRlZCBwYWdlcywgZGVmYXVsdHMgdG8gdGhlIHNlcnZlciBuYW1lCisgICAoU0VSVkVSX05BTUUgQ0dJIGVudmlyb25tZW50IHZhcmlhYmxlKSBpZiBub3Qgc2V0LiBbTm8gZGVmYXVsdF0KKyAqIEdJVFdFQl9QUk9KRUNUUk9PVAorICAgVGhlIHJvb3QgZGlyZWN0b3J5IGZvciBhbGwgcHJvamVjdHMgc2hvd24gYnkgZ2l0d2ViLiBNdXN0IGJlIHNldAorICAgY29ycmVjdGx5IGZvciBnaXR3ZWIgdG8gZmluZCByZXBvc2l0b3JpZXMgdG8gZGlzcGxheS4gIFNlZSBhbHNvCisgICAiR2l0d2ViIHJlcG9zaXRvcmllcyIgaW4gSU5TVEFMTCBmaWxlIGZvciBnaXR3ZWIuICBbRGVmYXVsdDogL3B1Yi9naXRdCisgKiBHSVRXRUJfUFJPSkVDVF9NQVhERVBUSAorICAgVGhlIGZpbGVzeXN0ZW0gdHJhdmVyc2luZyBsaW1pdCBmb3IgZ2V0dGluZyBwcm9qZWN0cyBsaXN0OyB0aGUgbnVtYmVyCisgICBpcyB0YWtlbiBhcyBkZXB0aCByZWxhdGl2ZSB0byB0aGUgcHJvamVjdHJvb3QuICBJdCBpcyB1c2VkIHdoZW4KKyAgIEdJVFdFQl9MSVNUIGlzIGEgZGlyZWN0b3J5IChvciBpcyBub3Qgc2V0OyB0aGVuIHByb2plY3Qgcm9vdCBpcyB1c2VkKS4KKyAgIElzIGlzIG1lYW50IHRvIHNwZWVkIHVwIHByb2plY3QgbGlzdGluZyBvbiBsYXJnZSB3b3JrIHRyZWVzIGJ5IGxpbWl0aW5nCisgICBmaW5kIGRlcHRoLiAgW0RlZmF1bHQ6IDIwMDddCisgKiBHSVRXRUJfTElTVAorICAgUG9pbnRzIHRvIGEgZGlyZWN0b3J5IHRvIHNjYW4gZm9yIHByb2plY3RzIChkZWZhdWx0cyB0byBwcm9qZWN0IHJvb3QKKyAgIGlmIG5vdCBzZXQgLyBpZiBlbXB0eSkgb3IgdG8gYSBmaWxlIHdpdGggZXhwbGljaXQgbGlzdGluZyBvZiBwcm9qZWN0cworICAgKHRvZ2V0aGVyIHdpdGggcHJvamVjdHMnIG93bmVyc2hpcCkuIFNlZSAiR2VuZXJhdGluZyBwcm9qZWN0cyBsaXN0CisgICB1c2luZyBnaXR3ZWIiIGluIElOU1RBTEwgZmlsZSBmb3IgZ2l0d2ViIHRvIGZpbmQgb3V0IGhvdyB0byBnZW5lcmF0ZQorICAgc3VjaCBmaWxlIGZyb20gc2NhbiBvZiBhIGRpcmVjdG9yeS4gW05vIGRlZmF1bHQsIHdoaWNoIG1lYW5zIHVzZSByb290CisgICBkaXJlY3RvcnkgZm9yIHByb2plY3RzXQorICogR0lUV0VCX0VYUE9SVF9PSworICAgU2hvdyByZXBvc2l0b3J5IG9ubHkgaWYgdGhpcyBmaWxlIGV4aXN0cyAoaW4gcmVwb3NpdG9yeSkuICBPbmx5CisgICBlZmZlY3RpdmUgaWYgdGhpcyB2YXJpYWJsZSBldmFsdWF0ZXMgdG8gdHJ1ZS4gIFtObyBkZWZhdWx0IC8gTm90IHNldF0KKyAqIEdJVFdFQl9TVFJJQ1RfRVhQT1JUCisgICBPbmx5IGFsbG93IHZpZXdpbmcgb2YgcmVwb3NpdG9yaWVzIGFsc28gc2hvd24gb24gdGhlIG92ZXJ2aWV3IHBhZ2UuCisgICBUaGlzIGZvciBleGFtcGxlIG1ha2VzIEdJVFdFQl9FWFBPUlRfT0sgdG8gZGVjaWRlIGlmIHJlcG9zaXRvcnkgaXMKKyAgIGF2YWlsYWJsZSBhbmQgbm90IG9ubHkgaWYgaXQgaXMgc2hvd24uICBJZiBHSVRXRUJfTElTVCBwb2ludHMgdG8KKyAgIGZpbGUgd2l0aCBsaXN0IG9mIHByb2plY3QsIG9ubHkgdGhvc2UgcmVwb3NpdG9yaWVzIGxpc3RlZCB3b3VsZCBiZQorICAgYXZhaWxhYmxlIGZvciBnaXR3ZWIuICBbTm8gZGVmYXVsdF0KKyAqIEdJVFdFQl9IT01FVEVYVAorICAgUG9pbnRzIHRvIGFuIC5odG1sIGZpbGUgd2hpY2ggaXMgaW5jbHVkZWQgb24gdGhlIGdpdHdlYiBwcm9qZWN0CisgICBvdmVydmlldyBwYWdlICgncHJvamVjdHNfbGlzdCcgdmlldyksIGlmIGl0IGV4aXN0cy4gIFJlbGF0aXZlIHRvCisgICBnaXR3ZWIuY2dpIHNjcmlwdC4gIFtEZWZhdWx0OiBpbmRleHRleHQuaHRtbF0KKyAqIEdJVFdFQl9TSVRFX0hFQURFUgorICAgRmlsZW5hbWUgb2YgaHRtbCB0ZXh0IHRvIGluY2x1ZGUgYXQgdG9wIG9mIGVhY2ggcGFnZS4gIFJlbGF0aXZlIHRvCisgICBnaXR3ZWIuY2dpIHNjcmlwdC4gIFtObyBkZWZhdWx0XQorICogR0lUV0VCX1NJVEVfRk9PVEVSCisgICBGaWxlbmFtZSBvZiBodG1sIHRleHQgdG8gaW5jbHVkZSBhdCBib3R0b20gb2YgZWFjaCBwYWdlLiAgUmVsYXRpdmUgdG8KKyAgIGdpdHdlYi5jZ2kgc2NyaXB0LiAgW05vIGRlZmF1bHRdCisgKiBHSVRXRUJfSE9NRV9MSU5LX1NUUgorICAgU3RyaW5nIG9mIHRoZSBob21lIGxpbmsgb24gdG9wIG9mIGFsbCBwYWdlcywgbGVhZGluZyB0byAkaG9tZV9saW5rCisgICAodXN1YWxseSBtYWluIGdpdHdlYiBwYWdlLCB3aGljaCBtZWFucyBwcm9qZWN0cyBsaXN0KS4gIFVzZWQgYXMgZmlyc3QKKyAgIHBhcnQgb2YgZ2l0d2ViIHZpZXcgImJyZWFkY3J1bWIgdHJhaWwiOiA8aG9tZT4gLyA8cHJvamVjdD4gLyA8dmlldz4uCisgICBbRGVmYXVsdDogcHJvamVjdHNdCisgKiBHSVRXRUJfU0lURU5BTUUKKyAgIE5hbWUgb2YgeW91ciBzaXRlIG9yIG9yZ2FuaXphdGlvbiB0byBhcHBlYXIgaW4gcGFnZSB0aXRsZXMuICBTZXQgaXQKKyAgIHRvIHNvbWV0aGluZyBkZXNjcmlwdGl2ZSBmb3IgY2xlYXJlciBib29rbWFya3MgZXRjLiAgSWYgbm90IHNldAorICAgKGlmIGVtcHR5KSBnaXR3ZWIgdXNlcyAiJFNFUlZFUl9OQU1FIEdpdCIsIG9yICJVbnRpdGxlZCBHaXQiIGlmCisgICBTRVJWRVJfTkFNRSBDR0kgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldCAoZS5nLiBpZiBydW5uaW5nCisgICBnaXR3ZWIgYXMgc3RhbmRhbG9uZSBzY3JpcHQpLiAgW05vIGRlZmF1bHRdCisgKiBHSVRXRUJfQkFTRV9VUkwKKyAgIEdpdCBiYXNlIFVSTHMgdXNlZCBmb3IgVVJMIHRvIHdoZXJlIGZldGNoIHByb2plY3QgZnJvbSwgaS5lLiBmdWxsCisgICBVUkwgaXMgIiRnaXRfYmFzZV91cmwvJHByb2plY3QiLiAgU2hvd24gb24gcHJvamVjdHMgc3VtbWFyeSBwYWdlLgorICAgUmVwb3NpdG9yeSBVUkwgZm9yIHByb2plY3QgY2FuIGJlIGFsc28gY29uZmlndXJlZCBwZXIgcmVwb3NpdG9yeTsgdGhpcworICAgdGFrZXMgcHJlY2VuZGVuY2Ugb3ZlciBVUkwgY29tcG9zZWQgZnJvbSBiYXNlIFVSTCBhbmQgcHJvamVjdCBuYW1lLgorICAgTm90ZSB0aGF0IHlvdSBjYW4gc2V0dXAgbXVsdGlwbGUgYmFzZSBVUkxzIChmb3IgZXhhbXBsZSBvbmUgZm9yCisgICBnaXQ6Ly8gcHJvdG9jb2wgYWNjZXNzLCBvbmUgZm9yIGh0dHA6Ly8gYWNjZXNzKSBmcm9tIGdpdHdlYiBjb25maWcKKyAgIGZpbGUuICBbTm8gZGVmYXVsdF0KKyAqIEdJVFdFQl9DU1MKKyAgIFBvaW50cyB0byB0aGUgbG9jYXRpb24gd2hlcmUgeW91IHB1dCBnaXR3ZWIuY3NzIG9uIHlvdXIgd2ViIHNlcnZlcgorICAgKG9yIHRvIGJlIG1vcmUgZ2VuZXJpYyBVUkkgb2YgZ2l0d2ViIHN0eWxlc2hlZXQpLiAgUmVsYXRpdmUgdG8gYmFzZQorICAgVVJJIG9mIGdpdHdlYi4gIE5vdGUgdGhhdCB5b3UgY2FuIHNldHVwIG11bHRpcGxlIHN0eWxlc2hlZXRzIGZyb20KKyAgIGdpdHdlYiBjb25maWcgZmlsZS4gIFtEZWZhdWx0OiBnaXR3ZWIuY3NzXQorICogR0lUV0VCX0xPR08KKyAgIFBvaW50cyB0byB0aGUgbG9jYXRpb24gd2hlcmUgeW91IHB1dCBnaXQtbG9nby5wbmcgb24geW91ciB3ZWIgc2VydmVyCisgICAob3IgdG8gYmUgbW9yZSBnZW5lcmljIFVSSSBvZiBsb2dvLCA3MngyNyBzaXplLCBkaXNwbGF5ZWQgaW4gdG9wIHJpZ2h0CisgICBjb3JuZXIgb2YgZWFjaCBnaXR3ZWIgcGFnZSwgYW5kIHVzZWQgYXMgbG9nbyBmb3IgQXRvbSBmZWVkKS4gIFJlbGF0aXZlCisgICB0byBiYXNlIFVSSSBvZiBnaXR3ZWIuICBbRGVmYXVsdDogZ2l0LWxvZ28ucG5nXQorICogR0lUV0VCX0ZBVklDT04KKyAgIFBvaW50cyB0byB0aGUgbG9jYXRpb24gd2hlcmUgeW91IHB1dCBnaXQtZmF2aWNvbi5wbmcgb24geW91ciB3ZWIgc2VydmVyCisgICAob3IgdG8gYmUgbW9yZSBnZW5lcmljIFVSSSBvZiBmYXZpY29uLCBhc3N1bWVkIHRvIGJlIGltYWdlL3BuZyB0eXBlOworICAgd2ViIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBmYXZpY29ucyAod2Vic2l0ZSBpY29ucykgbWF5IGRpc3BsYXkgdGhlbQorICAgaW4gdGhlIGJyb3dzZXIncyBVUkwgYmFyIGFuZCBuZXh0IHRvIHNpdGUgbmFtZSBpbiBib29rbWFya3MpLiAgUmVsYXRpdmUKKyAgIHRvIGJhc2UgVVJJIG9mIGdpdHdlYi4gIFtEZWZhdWx0OiBnaXQtZmF2aWNvbi5wbmddCisgKiBHSVRXRUJfQ09ORklHCisgICBUaGlzIFBlcmwgZmlsZSB3aWxsIGJlIGxvYWRlZCB1c2luZyAnZG8nIGFuZCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSBhbnkKKyAgIG9mIHRoZSBvcHRpb25zIGFib3ZlIGFzIHdlbGwgYXMgc29tZSBvdGhlciBvcHRpb25zIC0tIHNlZSB0aGUgIlJ1bnRpbWUKKyAgIGdpdHdlYiBjb25maWd1cmF0aW9uIiBzZWN0aW9uIGJlbG93LCBhbmQgdG9wIG9mICdnaXR3ZWIuY2dpJyBmb3IgdGhlaXIKKyAgIGZ1bGwgbGlzdCBhbmQgZGVzY3JpcHRpb24uICBJZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgR0lUV0VCX0NPTkZJRworICAgaXMgc2V0IHdoZW4gZ2l0d2ViLmNnaSBpcyBleGVjdXRlZCwgdGhlbiB0aGUgZmlsZSBzcGVjaWZpZWQgaW4gdGhlCisgICBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aWxsIGJlIGxvYWRlZCBpbnN0ZWFkIG9mIHRoZSBmaWxlIHNwZWNpZmllZAorICAgd2hlbiBnaXR3ZWIuY2dpIHdhcyBjcmVhdGVkLiAgW0RlZmF1bHQ6IGdpdHdlYl9jb25maWcucGVybF0KKworCitSdW50aW1lIGdpdHdlYiBjb25maWd1cmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1lvdSBjYW4gYWRqdXN0IGdpdHdlYiBiZWhhdmlvdXIgdXNpbmcgdGhlIGZpbGUgc3BlY2lmaWVkIGluIGBHSVRXRUJfQ09ORklHYAorKGRlZmF1bHRzIHRvICdnaXR3ZWJfY29uZmlnLnBlcmwnIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgQ0dJKS4KK1RoZSBtb3N0IG5vdGFibGUgdGhpbmcgdGhhdCBpcyBub3QgY29uZmlndXJhYmxlIGF0IGNvbXBpbGUgdGltZSBhcmUgdGhlCitvcHRpb25hbCBmZWF0dXJlcywgc3RvcmVkIGluIHRoZSAnJWZlYXR1cmVzJyB2YXJpYWJsZS4KKworVWx0aW1hdGUgZGVzY3JpcHRpb24gb24gaG93IHRvIHJlY29uZmlndXJlIHRoZSBkZWZhdWx0IGZlYXR1cmVzIHNldHRpbmcKK2luIHlvdXIgYEdJVFdFQl9DT05GSUdgIG9yIHBlci1wcm9qZWN0IGluIGBwcm9qZWN0LmdpdC9jb25maWdgIGNhbiBiZSBmb3VuZAorYXMgY29tbWVudHMgaW5zaWRlICdnaXR3ZWIuY2dpJy4KKworU2VlIGFsc28gIkdpdHdlYiBjb25maWcgZmlsZSIgKHdpdGggZXhhbXBsZSBvZiBnaXR3ZWIgY29uZmlnIGZpbGUpLCBhbmQKKyJHaXR3ZWIgcmVwb3NpdG9yaWVzIiBzZWN0aW9ucyBpbiBJTlNUQUxMIGZpbGUgZm9yIGdpdHdlYi4KKworCitHaXR3ZWIgY29uZmlnIGZpbGUgaXMgW2ZyYWdtZW50XSBvZiBwZXJsIGNvZGUuIFlvdSBjYW4gc2V0IHZhcmlhYmxlcwordXNpbmcgIm91ciAkdmFyaWFibGUgPSB2YWx1ZSI7IHRleHQgZnJvbSAiIyIgY2hhcmFjdGVyIHVudGlsIHRoZSBlbmQKK29mIGEgbGluZSBpcyBpZ25vcmVkLiBTZWUgcGVybHN5bigxKSBtYW4gcGFnZSBmb3IgZGV0YWlscy4KKworQmVsb3cgdGhlcmUgaXMgbGlzdCBvZiB2YWlhYmxlcyB3aGljaCB5b3UgbWlnaHQgd2FudCB0byBzZXQgaW4gZ2l0d2ViIGNvbmZpZy4KK1NlZSB0aGUgdG9wIG9mICdnaXR3ZWIuY2dpJyBmb3IgdGhlIGZ1bGwgbGlzdCBvZiB2YXJpYWJsZXMgYW5kIHRoZWlyCitkZXNjcmlwdGlvbnMuCisKK0dpdHdlYiBjb25maWcgZmlsZSB2YXJpYWJsZXMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworWW91IGNhbiBzZXQsIGFtb25nIG90aGVycywgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgaW4gZ2l0d2ViIGNvbmZpZyBmaWxlcworKHdpdGggdGhlIGV4Y2VwdGlvbiBvZiAkcHJvamVjdHJvb3QgYW5kICRwcm9qZWN0c19saXN0IHRoaXMgbGlzdCBkb2VzCitub3QgaW5jbHVkZSB2YXJpYWJsZXMgdXN1YWxseSBkaXJlY3RseSBzZXQgZHVyaW5nIGJ1aWxkKToKKyAqICRHSVQKKyAgIEN1cmUgZ2l0IGV4ZWN1dGFibGUgdG8gdXNlLiAgQnkgZGVmYXVsdCBzZXQgdG8gIiRHSVRfQklORElSL2dpdCIsIHdoaWNoCisgICBpbiB0dXJuIGlzIGJ5IGRlZmF1bHQgc2V0IHRvICIkKGJpbmRpcikvZ2l0Ii4gIElmIHlvdSB1c2UgZ2l0IGZyb20gYmluYXJ5CisgICBwYWNrYWdlLCBzZXQgdGhpcyB0byAiL3Vzci9iaW4vZ2l0Ii4gIFRoaXMgY2FuIGp1c3QgYmUgImdpdCIgaWYgeW91cgorICAgd2Vic2VydmVyIGhhcyBhIHNlbnNpYmxlIFBBVEguICBJZiB5b3UgaGF2ZSBtdWx0aXBsZSBnaXQgdmVyc2lvbnMKKyAgIGluc3RhbGxlZCBpdCBjYW4gYmUgdXNlZCB0byBjaG9vc2Ugd2hpY2ggb25lIHRvIHVzZS4KKyAqICR2ZXJzaW9uCisgICBHaXR3ZWIgdmVyc2lvbiwgc2V0IGF1dG9tYXRpY2FsbHkgd2hlbiBjcmVhdGluZyBnaXR3ZWIuY2dpIGZyb20KKyAgIGdpdHdlYi5wZXJsLiBZb3UgbWlnaHQgd2FudCB0byBtb2RpZnkgaXQgaWYgeW91IGFyZSBydW5uaW5nIG1vZGlmaWVkCisgICBnaXR3ZWIuCisgKiAkcHJvamVjdHJvb3QKKyAgIEFic29sdXRlIGZpbGVzeXN0ZW0gcGF0aCB3aGljaCB3aWxsIGJlIHByZXBlbmRlZCB0byBwcm9qZWN0IHBhdGg7CisgICB0aGUgcGF0aCB0byByZXBvc2l0b3J5IGlzICRwcm9qZWN0cm9vdC8kcHJvamVjdC4gIFNldCB0bworICAgJEdJVFdFQl9QUk9KRUNUUk9PVCBkdXJpbmcgaW5zdGFsbGF0aW9uLiAgVGhpcyB2YXJpYWJsZSBoYXZlIHRvIGJlCisgICBzZXQgY29ycmVjdGx5IGZvciBnaXR3ZWIgdG8gZmluZCByZXBvc2l0b3JpZXMuCisgKiAkcHJvamVjdHNfbGlzdAorICAgU291cmNlIG9mIHByb2plY3RzIGxpc3QsIGVpdGhlciBkaXJlY3RvcnkgdG8gc2Nhbiwgb3IgdGV4dCBmaWxlCisgICB3aXRoIGxpc3Qgb2YgcmVwb3NpdG9yaWVzIChpbiB0aGUgIjxVUkktZW5jb2RlZCByZXBvc2l0b3J5IHBhdGg+IFNQQworICAgPFVSSS1lbmNvZGVkIHJlcG9zaXRvcnkgb3duZXI+IiBmb3JtYXQpLiAgU2V0IHRvICRHSVRXRUJfTElTVAorICAgZHVyaW5nIGluc3RhbGxhdGlvbi4gIElmIGVtcHR5LCAkcHJvamVjdHJvb3QgaXMgdXNlZCB0byBzY2FuIGZvcgorICAgcmVwb3NpdG9yaWVzLgorICogJG15X3VybCwgJG15X3VyaQorICAgVVJMIGFuZCBhYnNvbHV0ZSBVUkwgb2YgZ2l0d2ViIHNjcmlwdDsgeW91IG1pZ2h0IG5lZWQgdG8gc2V0IHRob3NlCisgICB2YXJpYWJsZXMgaWYgeW91IGFyZSB1c2luZyAncGF0aGluZm8nIGZlYXR1cmU6IHNlZSBhbHNvIGJlbG93LgorICogJGhvbWVfbGluaworICAgVGFyZ2V0IG9mIHRoZSBob21lIGxpbmsgb24gdG9wIG9mIGFsbCBwYWdlcyAodGhlIGZpcnN0IHBhcnQgb2YgdmlldworICAgImJyZWFkY3J1bWJzIikuICBCeSBkZWZhdWx0IHNldCB0byBhYnNvbHV0ZSBVUkkgb2YgYSBwYWdlOyB5b3UgbWlnaHQKKyAgIG5lZWQgdG8gc2V0IGl0IHVwIHRvIFtiYXNlXSBnaXR3ZWIgVVJJIGlmIHlvdSB1c2UgJ3BhdGhpbmZvJyBmZWF0dXJlCisgICAoYWx0ZXJuYXRpdmUgZm9ybWF0IG9mIHRoZSBVUkxzLCB3aXRoIHByb2plY3QgbmFtZSBlbWJlZGRlZCBkaXJlY3RseQorICAgaW4gdGhlIHBhdGggcGFydCBvZiBVUkwpLgorICogQHN0eWxlc2hlZXRzCisgICBMaXN0IG9mIFVSSXMgb2Ygc3R5bGVzaGVldHMgKHJlbGF0aXZlIHRvIGJhc2UgVVJJIG9mIGEgcGFnZSkuIFlvdQorICAgbWlnaHQgc3BlY2lmeSBtb3JlIHRoYW4gb25lIHN0eWxlc2hlZXQsIGZvciBleGFtcGxlIHVzZSBnaXR3ZWIuY3NzCisgICBhcyBiYXNlLCB3aXRoIHNpdGUgc3BlY2lmaWMgbW9kaWZpY2F0aW9ucyBpbiBzZXBhcmF0ZSBzdHlsZXNoZWV0CisgICB0byBtYWtlIGl0IGVhc2llciB0byB1cGdyYWRlIGdpdHdlYi4gWW91IGNhbiBhZGQgJ3NpdGUnIHN0eWxlc2hlZXQKKyAgIGZvciBleGFtcGxlIGJ5IHVzaW5nCisgICAgICBwdXNoIEBzdHlsZXNoZWV0cywgImdpdHdlYi1zaXRlLmNzcyI7CisgICBpbiBnaXR3ZWIgY29uZmlnIGZpbGUuCisgKiAkbG9nb191cmwsICRsb2dvX2xhYmVsCisgICBVUkkgYW5kIGxhYmVsICh0aXRsZSkgb2YgR0lUIGxvZ28gbGluayAob3IgeW91ciBzaXRlIGxvZ28sIGlmIHlvdSBjaG9vc2UKKyAgIHRvIHVzZSBkaWZmZXJlbnQgbG9nbyBpbWFnZSkuIEJ5IGRlZmF1bHQgdGhleSBwb2ludCB0byBnaXQgaG9tZXBhZ2U7CisgICBpbiB0aGUgcGFzdCB0aGV5IHBvaW50ZWQgdG8gZ2l0IGRvY3VtZW50YXRpb24gYXQgd3d3Lmtlcm5lbC5vcmcuCisgKiAkcHJvamVjdHNfbGlzdF9kZXNjcmlwdGlvbl93aWR0aAorICAgVGhlIHdpZHRoIChpbiBjaGFyYWN0ZXJzKSBvZiB0aGUgcHJvamVjdHMgbGlzdCAiRGVzY3JpcHRpb24iIGNvbHVtbi4KKyAgIExvbmdlciBkZXNjcmlwdGlvbnMgd2lsbCBiZSBjdXQgKHRyeWluZyB0byBjdXQgYXQgd29yZCBib3VuZGFyeSk7CisgICBmdWxsIGRlc2NyaXB0aW9uIGlzIGF2YWlsYWJsZSBhcyAndGl0bGUnIGF0dHJpYnV0ZSAodXN1YWxseSBzaG93biBvbgorICAgbW91c2VvdmVyKS4gIEJ5IGRlZmF1bHQgc2V0IHRvIDI1LCB3aGljaCBtaWdodCBiZSB0b28gc21hbGwgaWYgeW91CisgICB1c2UgbG9uZyBwcm9qZWN0IGRlc2NyaXB0aW9ucy4KKyAqIEBnaXRfYmFzZV91cmxfbGlzdAorICAgTGlzdCBvZiBnaXQgYmFzZSBVUkxzIHVzZWQgZm9yIFVSTCB0byB3aGVyZSBmZXRjaCBwcm9qZWN0IGZyb20sIHNob3duCisgICBpbiBwcm9qZWN0IHN1bW1hcnkgcGFnZS4gIEZ1bGwgVVJMIGlzICIkZ2l0X2Jhc2VfdXJsLyRwcm9qZWN0Ii4KKyAgIFlvdSBjYW4gc2V0dXAgbXVsdGlwbGUgYmFzZSBVUkxzIChmb3IgZXhhbXBsZSBvbmUgZm9yICBnaXQ6Ly8gcHJvdG9jb2wKKyAgIGFjY2VzcywgYW5kIG9uZSBmb3IgaHR0cDovLyAiZHVtYiIgcHJvdG9jb2wgYWNjZXNzKS4gIE5vdGUgdGhhdCBwZXIKKyAgIHJlcG9zaXRvcnkgY29uZmlndXJhdGlvbiBpbiAnY2xvbmV1cmwnIGZpbGUsIG9yIGFzIHZhbHVlcyBvZiBnaXR3ZWIudXJsCisgICBwcm9qZWN0IGNvbmZpZy4KKyAqICRkZWZhdWx0X2Jsb2JfcGxhaW5fbWltZXR5cGUKKyAgIERlZmF1bHQgbWltZXR5cGUgZm9yIGJsb2JfcGxhaW4gKHJhdykgdmlldywgaWYgbWltZXR5cGUgY2hlY2tpbmcKKyAgIGRvZXNuJ3QgcmVzdWx0IGluIHNvbWUgb3RoZXIgdHlwZTsgYnkgZGVmYXVsdCAndGV4dC9wbGFpbicuCisgKiAkZGVmYXVsdF90ZXh0X3BsYWluX2NoYXJzZXQKKyAgIERlZmF1bHQgY2hhcnNldCBmb3IgdGV4dCBmaWxlcy4gSWYgbm90IHNldCwgd2ViIHNlcndlciBjb25maWd1cmF0aW9uCisgICB3b3VsZCBiZSB1c2VkLgorICogJG1pbWV0eXBlc19maWxlCisgICBGaWxlIHRvIHVzZSBmb3IgKGZpbGVuYW1lIGV4dGVuc2lvbiBiYXNlZCkgZ3Vlc3Npbmcgb2YgTUlNRSB0eXBlcyBiZWZvcmUKKyAgIHRyeWluZyAvZXRjL21pbWUudHlwZXMuIFBhdGgsIGlmIHJlbGF0aXZlLCBpcyB0YWtlbiBjdXJyZW50bHkgYXMgdGFrZW4KKyAgIHJlbGF0aXZlIHRvIGN1cnJlbnQgZ2l0IHJlcG9zaXRveS4KKyAqICRmYWxsYmFja19lbmNvZGluZworICAgR2l0d2ViIGFzc3VtZXMgdGhpcyBjaGFyc2V0IGlmIGxpbmUgY29udGFpbnMgbm9uLVVURi04IGNoYXJhY3RlcnMuCisgICBGYWxsYmFjayBkZWNvZGluZyBpcyB1c2VkIHdpdGhvdXQgZXJyb3IgY2hlY2tpbmcsIHNvIGl0IGNhbiBiZSBldmVuCisgICAndXRmLTgnLiBWYWx1ZSBtaXN0IGJlIHZhbGlkIGVuY29kaWc7IHNlZSBFbmNvZGluZzo6U3VwcG9ydGVkKDNwbSkgbWFuCisgICBwYWdlIGZvciBhIGxpc3QuICAgQnkgZGVmYXVsdCAnbGF0aW4xJywgYWthLiAnaXNvLTg4NTktMScuCisgKiBAZGlmZl9vcHRzCisgICBSZW5hbWUgZGV0ZWN0aW9uIG9wdGlvbnMgZm9yIGdpdC1kaWZmIGFuZCBnaXQtZGlmZi10cmVlLiBCeSBkZWZhdWx0CisgICAoJy1NJyk7IHNldCBpdCB0byAoJy1DJykgb3IgKCctQycsICctQycpIHRvIGFsc28gZGV0ZWN0IGNvcGllcywgb3IKKyAgIHNldCBpdCB0byAoKSBpZiB5b3UgZG9uJ3Qgd2FudCB0byBoYXZlIHJlbmFtZXMgZGV0ZWN0aW9uLgorCitQZXItcmVwb3NpdG9yeSBnaXR3ZWIgY29uZmlndXJhdGlvbgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworWW91IGNhbiBhbHNvIGNvbmZpZ3VyZSBpbmRpdmlkdWFsIHJlcG9zaXRvcmllcyBzaG93biBpbiBnaXR3ZWIgYnkgY3JlYXRpbmcKK2ZpbGUgaW4gdGhlIEdJVF9ESVIgb2YgZ2l0IHJlcG9zaXRvcnksIG9yIGJ5IHNldHRpbmcgc29tZSByZXBvIGNvbmZpZ3VyYXRpb24KK3ZhcmlhYmxlIChpbiBHSVRfRElSL2NvbmZpZykuCisKK1lvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgZmlsZXMgaW4gcmVwb3NpdG9yeToKKyAqIFJFQURNRS5odG1sCisgICBBIC5odG1sIGZpbGUgKEhUTUwgZnJhZ21lbnQpIHdoaWNoIGlzIGluY2x1ZGVkIG9uIHRoZSBnaXR3ZWIgcHJvamVjdAorICAgc3VtbWFyeSBwYWdlIGluc2lkZSA8ZGl2PiBibG9jayBlbGVtZW50LiBZb3UgY2FuIHVzZSBpdCBmb3IgbG9uZ2VyCisgICBkZXNjcmlwdGlvbiBvZiBhIHByb2plY3QsIHRvIHByb3ZpZGUgbGlua3MgZm9yIGV4YW1wbGUgdG8gcHJvamVjdHMKKyAgIGhvbWVwYWdlLCBldGMuCisgKiBkZXNjcmlwdGlvbiAob3IgZ2l0d2ViLmRlc2NyaXB0aW9uKQorICAgU2hvcnQgKHNob3J0ZW5lZCBieSBkZWZhdWx0IHRvIDI1IGNoYXJhY3RlcnMgaW4gdGhlIHByb2plY3RzIGxpc3QgcGFnZSkKKyAgIHNpbmdsZSBsaW5lIGRlc2NyaXB0aW9uIG9mIGEgcHJvamVjdCAob2YgYSByZXBvc2l0b3J5KS4gUGxhaW4gdGV4dCBmaWxlOworICAgSFRNTCB3aWxsIGJlIGVzY2FwZWQuIEJ5IGRlZmF1bHQgc2V0IHRvCisgICAgIFVubmFtZWQgcmVwb3NpdG9yeTsgZWRpdCB0aGlzIGZpbGUgdG8gbmFtZSBpdCBmb3IgZ2l0d2ViLgorICAgZnJvbSB0aGUgdGVtcGxhdGUgZHVyaW5nIGNyZWF0aW5nIHJlcG9zaXRvcnkuIFlvdSBjYW4gdXNlCisgICBnaXR3ZWIuZGVzY3JpcHRpb24gcmVwbyBjb25maWd1cmF0aW9uIHZhcmlhYmxlLCBidXQgdGhlIGZpbGUgdGFrZXMKKyAgIHByZWNlbmRlbmNlLgorICogY2xvbmV1cmwgKG9yIG11bHRpcGxlLXZhbHVlZCBnaXR3ZWIudXJsKQorICAgRmlsZSB3aXRoIHJlcG9zaXRvcnkgVVJMICh1c2VkIGZvciBjbG9uZSBhbmQgZmV0Y2gpLCBvbmUgcGVyIGxpbmUuCisgICBEaXNwbGF5ZWQgaW4gdGhlIHByb2plY3Qgc3VtbWFyeSBwYWdlLiBZb3UgY2FuIHVzZSBtdWx0aXBsZS12YWx1ZWQKKyAgIGdpdHdlYi51cmwgcmVwb3NpdG9yeSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGZvciB0aGF0LCBidXQgdGhlIGZpbGUKKyAgIHRha2VzIHByZWNlbmRlbmNlLgorICogZ2l0d2ViLm93bmVyCisgICBZb3UgY2FuIHVzZSB0aGUgZ2l0d2ViLm93bmVyIHJlcG9zaXRvcnkgY29uZmlndXJhdGlvbiB2YXJpYWJsZSB0byBzZXQKKyAgIHJlcG9zaXRvcnkncyBvd25lci4gSXQgaXMgZGlzcGxheWVkIGluIHRoZSBwcm9qZWN0IGxpc3QgYW5kIHN1bW1hcnkKKyAgIHBhZ2UuIElmIGl0J3Mgbm90IHNldCwgZmlsZXN5c3RlbSBkaXJlY3RvcnkncyBvd25lciBpcyB1c2VkLgorICogdmFyaW91cyBnaXR3ZWIuKiBjb25maWcgdmFyaWFibGVzIChpbiBjb25maWcpCisgICBSZWFkIGRlc2NyaXB0aW9uIG9mICVmZWF0dXJlIGhhc2ggZm9yIGRldGFpbGVkIGxpc3QsIGFuZCBzb21lCisgICBkZXNjcmlwdGlvbnMuCisKKworV2Vic2VydmVyIGNvbmZpZ3VyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHlvdSB3YW50IHRvIGhhdmUgb25lIFVSTCBmb3IgYm90aCBnaXR3ZWIgYW5kIHlvdXIgaHR0cDovLworcmVwb3NpdG9yaWVzLCB5b3UgY2FuIGNvbmZpZ3VyZSBhcGFjaGUgbGlrZSB0aGlzOgorCis8VmlydHVhbEhvc3Qgd3d3OjgwPgorICAgIFNlcnZlck5hbWUgZ2l0LmRvbWFpbi5vcmcKKyAgICBEb2N1bWVudFJvb3QgL3B1Yi9naXQKKyAgICBSZXdyaXRlRW5naW5lIG9uCisgICAgUmV3cml0ZVJ1bGUgXi8oLipcLmdpdC8oPyEvPyhpbmZvfG9iamVjdHN8cmVmcykpLiopPyQgL2NnaS1iaW4vZ2l0d2ViLmNnaSV7UkVRVUVTVF9VUkl9ICBbTCxQVF0KKyAgICBTZXRFbnYJR0lUV0VCX0NPTkZJRwkvZXRjL2dpdHdlYi5jb25mCis8L1ZpcnR1YWxIb3N0PgorCitUaGUgYWJvdmUgY29uZmlndXJhdGlvbiBleHBlY3RzIHlvdXIgcHVibGljIHJlcG9zaXRvcmllcyB0byBsaXZlIHVuZGVyCisvcHViL2dpdCBhbmQgd2lsbCBzZXJ2ZSB0aGVtIGFzIGh0dHA6Ly9naXQuZG9tYWluLm9yZy9kaXItdW5kZXItcHViLWdpdCwKK2JvdGggYXMgY2xvbmVhYmxlIEdJVCBVUkwgYW5kIGFzIGJyb3dzZWFibGUgZ2l0d2ViIGludGVyZmFjZS4KK0lmIHlvdSB0aGVuIHN0YXJ0IHlvdXIgZ2l0LWRhZW1vbiB3aXRoIC0tYmFzZS1wYXRoPS9wdWIvZ2l0IC0tZXhwb3J0LWFsbAordGhlbiB5b3UgY2FuIGV2ZW4gdXNlIHRoZSBnaXQ6Ly8gVVJMIHdpdGggZXhhY3RseSB0aGUgc2FtZSBwYXRoLgorCitTZXR0aW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBHSVRXRUJfQ09ORklHIHdpbGwgdGVsbCBnaXR3ZWIgdG8gdXNlCit0aGUgbmFtZWQgZmlsZSAoaS5lLiBpbiB0aGlzIGV4YW1wbGUgL2V0Yy9naXR3ZWIuY29uZikgYXMgYQorY29uZmlndXJhdGlvbiBmb3IgZ2l0d2ViLiAgUGVybCB2YXJpYWJsZXMgZGVmaW5lZCBpbiBoZXJlIHdpbGwKK292ZXJyaWRlIHRoZSBkZWZhdWx0cyBnaXZlbiBhdCB0aGUgaGVhZCBvZiB0aGUgZ2l0d2ViLnBlcmwgKG9yCitnaXR3ZWIuY2dpKS4gIExvb2sgYXQgdGhlIGNvbW1lbnRzIGluIHRoYXQgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24KK3doaWNoIHZhcmlhYmxlcyBhbmQgd2hhdCB0aGV5IG1lYW4uCisKKworT3JpZ2luYWxseSB3cml0dGVuIGJ5OgorICBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisKK0FueSBjb21tZW50L3F1ZXN0aW9uL2NvbmNlcm4gdG86CisgIEdpdCBtYWlsaW5nIGxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+CmRpZmYgLS1naXQgYS9naXR3ZWIvZ2l0LWZhdmljb24ucG5nIGIvZ2l0d2ViL2dpdC1mYXZpY29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTYzN2MwCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0d2ViL2dpdC1mYXZpY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9naXR3ZWIvZ2l0LWxvZ28ucG5nIGIvZ2l0d2ViL2dpdC1sb2dvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmFlOGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0d2ViL2dpdC1sb2dvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9naXR3ZWIvZ2l0d2ViLmNzcyBiL2dpdHdlYi9naXR3ZWIuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NmExYzMKLS0tIC9kZXYvbnVsbAorKysgYi9naXR3ZWIvZ2l0d2ViLmNzcwpAQCAtMCwwICsxLDUwMSBAQAorYm9keSB7CisJZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CisJZm9udC1zaXplOiBzbWFsbDsKKwlib3JkZXI6IHNvbGlkICNkOWQ4ZDE7CisJYm9yZGVyLXdpZHRoOiAxcHg7CisJbWFyZ2luOiAxMHB4OworCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CisJY29sb3I6ICMwMDAwMDA7Cit9CisKK2EgeworCWNvbG9yOiAjMDAwMGNjOworfQorCithOmhvdmVyLCBhOnZpc2l0ZWQsIGE6YWN0aXZlIHsKKwljb2xvcjogIzg4MDAwMDsKK30KKworc3Bhbi5jbnRybCB7CisJYm9yZGVyOiBkYXNoZWQgI2FhYWFhYTsKKwlib3JkZXItd2lkdGg6IDFweDsKKwlwYWRkaW5nOiAwcHggMnB4IDBweCAycHg7CisJbWFyZ2luOiAgMHB4IDJweCAwcHggMnB4OworfQorCitpbWcubG9nbyB7CisJZmxvYXQ6IHJpZ2h0OworCWJvcmRlci13aWR0aDogMHB4OworfQorCitkaXYucGFnZV9oZWFkZXIgeworCWhlaWdodDogMjVweDsKKwlwYWRkaW5nOiA4cHg7CisJZm9udC1zaXplOiAxNTAlOworCWZvbnQtd2VpZ2h0OiBib2xkOworCWJhY2tncm91bmQtY29sb3I6ICNkOWQ4ZDE7Cit9CisKK2Rpdi5wYWdlX2hlYWRlciBhOnZpc2l0ZWQsIGEuaGVhZGVyIHsKKwljb2xvcjogIzAwMDBjYzsKK30KKworZGl2LnBhZ2VfaGVhZGVyIGE6aG92ZXIgeworCWNvbG9yOiAjODgwMDAwOworfQorCitkaXYucGFnZV9uYXYgeworCXBhZGRpbmc6IDhweDsKK30KKworZGl2LnBhZ2VfbmF2IGE6dmlzaXRlZCB7CisJY29sb3I6ICMwMDAwY2M7Cit9CisKK2Rpdi5wYWdlX3BhdGggeworCXBhZGRpbmc6IDhweDsKKwlmb250LXdlaWdodDogYm9sZDsKKwlib3JkZXI6IHNvbGlkICNkOWQ4ZDE7CisJYm9yZGVyLXdpZHRoOiAwcHggMHB4IDFweDsKK30KKworZGl2LnBhZ2VfZm9vdGVyIHsKKwloZWlnaHQ6IDE3cHg7CisJcGFkZGluZzogNHB4IDhweDsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZDlkOGQxOworfQorCitkaXYucGFnZV9mb290ZXJfdGV4dCB7CisJZmxvYXQ6IGxlZnQ7CisJY29sb3I6ICM1NTU1NTU7CisJZm9udC1zdHlsZTogaXRhbGljOworfQorCitkaXYucGFnZV9ib2R5IHsKKwlwYWRkaW5nOiA4cHg7CisJZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKK30KKworZGl2LnRpdGxlLCBhLnRpdGxlIHsKKwlkaXNwbGF5OiBibG9jazsKKwlwYWRkaW5nOiA2cHggOHB4OworCWZvbnQtd2VpZ2h0OiBib2xkOworCWJhY2tncm91bmQtY29sb3I6ICNlZGVjZTY7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworCWNvbG9yOiAjMDAwMDAwOworfQorCitkaXYucmVhZG1lIHsKKwlwYWRkaW5nOiA4cHg7Cit9CisKK2EudGl0bGU6aG92ZXIgeworCWJhY2tncm91bmQtY29sb3I6ICNkOWQ4ZDE7Cit9CisKK2Rpdi50aXRsZV90ZXh0IHsKKwlwYWRkaW5nOiA2cHggMHB4OworCWJvcmRlcjogc29saWQgI2Q5ZDhkMTsKKwlib3JkZXItd2lkdGg6IDBweCAwcHggMXB4OworCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Cit9CisKK2Rpdi5sb2dfYm9keSB7CisJcGFkZGluZzogOHB4IDhweCA4cHggMTUwcHg7Cit9CisKK3NwYW4uYWdlIHsKKwlwb3NpdGlvbjogcmVsYXRpdmU7CisJZmxvYXQ6IGxlZnQ7CisJd2lkdGg6IDE0MnB4OworCWZvbnQtc3R5bGU6IGl0YWxpYzsKK30KKworc3Bhbi5zaWdub2ZmIHsKKwljb2xvcjogIzg4ODg4ODsKK30KKworZGl2LmxvZ19saW5rIHsKKwlwYWRkaW5nOiAwcHggOHB4OworCWZvbnQtc2l6ZTogNzAlOworCWZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOworCWZvbnQtc3R5bGU6IG5vcm1hbDsKKwlwb3NpdGlvbjogcmVsYXRpdmU7CisJZmxvYXQ6IGxlZnQ7CisJd2lkdGg6IDEzNnB4OworfQorCitkaXYubGlzdF9oZWFkIHsKKwlwYWRkaW5nOiA2cHggOHB4IDRweDsKKwlib3JkZXI6IHNvbGlkICNkOWQ4ZDE7CisJYm9yZGVyLXdpZHRoOiAxcHggMHB4IDBweDsKKwlmb250LXN0eWxlOiBpdGFsaWM7Cit9CisKK2Rpdi5hdXRob3JfZGF0ZSB7CisJcGFkZGluZzogOHB4OworCWJvcmRlcjogc29saWQgI2Q5ZDhkMTsKKwlib3JkZXItd2lkdGg6IDBweCAwcHggMXB4IDBweDsKKwlmb250LXN0eWxlOiBpdGFsaWM7Cit9CisKK2EubGlzdCB7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworCWNvbG9yOiAjMDAwMDAwOworfQorCithLnN1YmplY3QsIGEubmFtZSB7CisJZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK3RhYmxlLnRhZ3MgYS5zdWJqZWN0IHsKKwlmb250LXdlaWdodDogbm9ybWFsOworfQorCithLmxpc3Q6aG92ZXIgeworCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworCWNvbG9yOiAjODgwMDAwOworfQorCithLnRleHQgeworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKKwljb2xvcjogIzAwMDBjYzsKK30KKworYS50ZXh0OnZpc2l0ZWQgeworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKKwljb2xvcjogIzg4MDAwMDsKK30KKworYS50ZXh0OmhvdmVyIHsKKwl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKKwljb2xvcjogIzg4MDAwMDsKK30KKwordGFibGUgeworCXBhZGRpbmc6IDhweCA0cHg7CisJYm9yZGVyLXNwYWNpbmc6IDA7Cit9CisKK3RhYmxlLmRpZmZfdHJlZSB7CisJZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKK30KKwordGFibGUuY29tYmluZWQuZGlmZl90cmVlIHRoIHsKKwl0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKK3RhYmxlLmNvbWJpbmVkLmRpZmZfdHJlZSB0ZCB7CisJcGFkZGluZy1yaWdodDogMjRweDsKK30KKwordGFibGUuY29tYmluZWQuZGlmZl90cmVlIHRoLmxpbmssCit0YWJsZS5jb21iaW5lZC5kaWZmX3RyZWUgdGQubGluayB7CisJcGFkZGluZzogMHB4IDJweDsKK30KKwordGFibGUuY29tYmluZWQuZGlmZl90cmVlIHRkLm5vY2hhbmdlIGEgeworCWNvbG9yOiAjNjY2NmZmOworfQorCit0YWJsZS5jb21iaW5lZC5kaWZmX3RyZWUgdGQubm9jaGFuZ2UgYTpob3ZlciwKK3RhYmxlLmNvbWJpbmVkLmRpZmZfdHJlZSB0ZC5ub2NoYW5nZSBhOnZpc2l0ZWQgeworCWNvbG9yOiAjZDA2NjY2OworfQorCit0YWJsZS5ibGFtZSB7CisJYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKK30KKwordGFibGUuYmxhbWUgdGQgeworCXBhZGRpbmc6IDBweCA1cHg7CisJZm9udC1zaXplOiAxMDAlOworCXZlcnRpY2FsLWFsaWduOiB0b3A7Cit9CisKK3RoIHsKKwlwYWRkaW5nOiAycHggNXB4OworCWZvbnQtc2l6ZTogMTAwJTsKKwl0ZXh0LWFsaWduOiBsZWZ0OworfQorCit0ci5saWdodDpob3ZlciB7CisJYmFja2dyb3VuZC1jb2xvcjogI2VkZWNlNjsKK30KKwordHIuZGFyayB7CisJYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjZmMDsKK30KKwordHIuZGFyazIgeworCWJhY2tncm91bmQtY29sb3I6ICNmNmY2ZjA7Cit9CisKK3RyLmRhcms6aG92ZXIgeworCWJhY2tncm91bmQtY29sb3I6ICNlZGVjZTY7Cit9CisKK3RkIHsKKwlwYWRkaW5nOiAycHggNXB4OworCWZvbnQtc2l6ZTogMTAwJTsKKwl2ZXJ0aWNhbC1hbGlnbjogdG9wOworfQorCit0ZC5saW5rLCB0ZC5zZWxmbGluayB7CisJcGFkZGluZzogMnB4IDVweDsKKwlmb250LWZhbWlseTogc2Fucy1zZXJpZjsKKwlmb250LXNpemU6IDcwJTsKK30KKwordGQuc2VsZmxpbmsgeworCXBhZGRpbmctcmlnaHQ6IDBweDsKK30KKwordGQuc2hhMSB7CisJZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKK30KKwordGQuZXJyb3IgeworCWNvbG9yOiByZWQ7CisJYmFja2dyb3VuZC1jb2xvcjogeWVsbG93OworfQorCit0ZC5jdXJyZW50X2hlYWQgeworCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCit0YWJsZS5kaWZmX3RyZWUgc3Bhbi5maWxlX3N0YXR1cy5uZXcgeworCWNvbG9yOiAjMDA4MDAwOworfQorCit0YWJsZS5kaWZmX3RyZWUgc3Bhbi5maWxlX3N0YXR1cy5kZWxldGVkIHsKKwljb2xvcjogI2MwMDAwMDsKK30KKwordGFibGUuZGlmZl90cmVlIHNwYW4uZmlsZV9zdGF0dXMubW92ZWQsCit0YWJsZS5kaWZmX3RyZWUgc3Bhbi5maWxlX3N0YXR1cy5tb2RlX2NobmdlIHsKKwljb2xvcjogIzc3Nzc3NzsKK30KKwordGFibGUuZGlmZl90cmVlIHNwYW4uZmlsZV9zdGF0dXMuY29waWVkIHsKKyAgY29sb3I6ICM3MGEwNzA7Cit9CisKKy8qIG5vYWdlOiAiTm8gY29tbWl0cyIgKi8KK3RhYmxlLnByb2plY3RfbGlzdCB0ZC5ub2FnZSB7CisJY29sb3I6ICM4MDgwODA7CisJZm9udC1zdHlsZTogaXRhbGljOworfQorCisvKiBhZ2UyOiA2MCo2MCoyNCoyIDw9IGFnZSAqLwordGFibGUucHJvamVjdF9saXN0IHRkLmFnZTIsIHRhYmxlLmJsYW1lIHRkLmFnZTIgeworCWZvbnQtc3R5bGU6IGl0YWxpYzsKK30KKworLyogYWdlMTogNjAqNjAqMiA8PSBhZ2UgPCA2MCo2MCoyNCoyICovCit0YWJsZS5wcm9qZWN0X2xpc3QgdGQuYWdlMSB7CisJY29sb3I6ICMwMDk5MDA7CisJZm9udC1zdHlsZTogaXRhbGljOworfQorCit0YWJsZS5ibGFtZSB0ZC5hZ2UxIHsKKwljb2xvcjogIzAwOTkwMDsKKwliYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKK30KKworLyogYWdlMDogYWdlIDwgNjAqNjAqMiAqLwordGFibGUucHJvamVjdF9saXN0IHRkLmFnZTAgeworCWNvbG9yOiAjMDA5OTAwOworCWZvbnQtc3R5bGU6IGl0YWxpYzsKKwlmb250LXdlaWdodDogYm9sZDsKK30KKwordGFibGUuYmxhbWUgdGQuYWdlMCB7CisJY29sb3I6ICMwMDk5MDA7CisJYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CisJZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK3RkLnByZSwgZGl2LnByZSwgZGl2LmRpZmYgeworCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CisJZm9udC1zaXplOiAxMnB4OworCXdoaXRlLXNwYWNlOiBwcmU7Cit9CisKK3RkLm1vZGUgeworCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Cit9CisKKy8qIHN0eWxpbmcgb2YgZGlmZnMgKHBhdGNoc2V0cyk6IGNvbW1pdGRpZmYgYW5kIGJsb2JkaWZmIHZpZXdzICovCitkaXYuZGlmZi5oZWFkZXIsCitkaXYuZGlmZi5leHRlbmRlZF9oZWFkZXIgeworCXdoaXRlLXNwYWNlOiBub3JtYWw7Cit9CisKK2Rpdi5kaWZmLmhlYWRlciB7CisJZm9udC13ZWlnaHQ6IGJvbGQ7CisKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZWRlY2U2OworCisJbWFyZ2luLXRvcDogNHB4OworCXBhZGRpbmc6IDRweCAwcHggMnB4IDBweDsKKwlib3JkZXI6IHNvbGlkICNkOWQ4ZDE7CisJYm9yZGVyLXdpZHRoOiAxcHggMHB4IDFweCAwcHg7Cit9CisKK2Rpdi5kaWZmLmhlYWRlciBhLnBhdGggeworCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCitkaXYuZGlmZi5leHRlbmRlZF9oZWFkZXIsCitkaXYuZGlmZi5leHRlbmRlZF9oZWFkZXIgYS5wYXRoLAorZGl2LmRpZmYuZXh0ZW5kZWRfaGVhZGVyIGEuaGFzaCB7CisJY29sb3I6ICM3Nzc3Nzc7Cit9CisKK2Rpdi5kaWZmLmV4dGVuZGVkX2hlYWRlciAuaW5mbyB7CisJY29sb3I6ICNiMGIwYjA7Cit9CisKK2Rpdi5kaWZmLmV4dGVuZGVkX2hlYWRlciB7CisJYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjVlZTsKKwlwYWRkaW5nOiAycHggMHB4IDJweCAwcHg7Cit9CisKK2Rpdi5kaWZmIGEubGlzdCwKK2Rpdi5kaWZmIGEucGF0aCwKK2Rpdi5kaWZmIGEuaGFzaCB7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCitkaXYuZGlmZiBhLmxpc3Q6aG92ZXIsCitkaXYuZGlmZiBhLnBhdGg6aG92ZXIsCitkaXYuZGlmZiBhLmhhc2g6aG92ZXIgeworCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCitkaXYuZGlmZi50b19maWxlIGEucGF0aCwKK2Rpdi5kaWZmLnRvX2ZpbGUgeworCWNvbG9yOiAjMDA3MDAwOworfQorCitkaXYuZGlmZi5hZGQgeworCWNvbG9yOiAjMDA4ODAwOworfQorCitkaXYuZGlmZi5mcm9tX2ZpbGUgYS5wYXRoLAorZGl2LmRpZmYuZnJvbV9maWxlIHsKKwljb2xvcjogI2FhMDAwMDsKK30KKworZGl2LmRpZmYucmVtIHsKKwljb2xvcjogI2NjMDAwMDsKK30KKworZGl2LmRpZmYuY2h1bmtfaGVhZGVyIGEsCitkaXYuZGlmZi5jaHVua19oZWFkZXIgeworCWNvbG9yOiAjOTkwMDk5OworfQorCitkaXYuZGlmZi5jaHVua19oZWFkZXIgeworCWJvcmRlcjogZG90dGVkICNmZmUwZmY7CisJYm9yZGVyLXdpZHRoOiAxcHggMHB4IDBweCAwcHg7CisJbWFyZ2luLXRvcDogMnB4OworfQorCitkaXYuZGlmZi5jaHVua19oZWFkZXIgc3Bhbi5jaHVua19pbmZvIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZmZlZWZmOworfQorCitkaXYuZGlmZi5jaHVua19oZWFkZXIgc3Bhbi5zZWN0aW9uIHsKKwljb2xvcjogI2FhMjJhYTsKK30KKworZGl2LmRpZmYuaW5jb21wbGV0ZSB7CisJY29sb3I6ICNjY2NjY2M7Cit9CisKK2Rpdi5kaWZmLm5vZGlmZmVyZW5jZXMgeworCWZvbnQtd2VpZ2h0OiBib2xkOworCWNvbG9yOiAjNjAwMDAwOworfQorCitkaXYuaW5kZXhfaW5jbHVkZSB7CisJYm9yZGVyOiBzb2xpZCAjZDlkOGQxOworCWJvcmRlci13aWR0aDogMHB4IDBweCAxcHg7CisJcGFkZGluZzogMTJweCA4cHg7Cit9CisKK2Rpdi5zZWFyY2ggeworCWZvbnQtc2l6ZTogMTAwJTsKKwlmb250LXdlaWdodDogbm9ybWFsOworCW1hcmdpbjogNHB4IDhweDsKKwlmbG9hdDogcmlnaHQ7CisJdG9wOiA1NnB4OworCXJpZ2h0OiAxMnB4Cit9CisKK3RkLmxpbmVuciB7CisJdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisKK2EubGluZW5yIHsKKwljb2xvcjogIzk5OTk5OTsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmUKK30KKworYS5yc3NfbG9nbyB7CisJZmxvYXQ6IHJpZ2h0OworCXBhZGRpbmc6IDNweCAwcHg7CisJd2lkdGg6IDM1cHg7CisJbGluZS1oZWlnaHQ6IDEwcHg7CisJYm9yZGVyOiAxcHggc29saWQ7CisJYm9yZGVyLWNvbG9yOiAjZmNjN2E1ICM3ZDMzMDIgIzNlMWEwMSAjZmY5NTRlOworCWNvbG9yOiAjZmZmZmZmOworCWJhY2tncm91bmQtY29sb3I6ICNmZjY2MDA7CisJZm9udC13ZWlnaHQ6IGJvbGQ7CisJZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CisJZm9udC1zaXplOiA3MCU7CisJdGV4dC1hbGlnbjogY2VudGVyOworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworYS5yc3NfbG9nbzpob3ZlciB7CisJYmFja2dyb3VuZC1jb2xvcjogI2VlNTUwMDsKK30KKworc3Bhbi5yZWZzIHNwYW4geworCXBhZGRpbmc6IDBweCA0cHg7CisJZm9udC1zaXplOiA3MCU7CisJZm9udC13ZWlnaHQ6IG5vcm1hbDsKKwlib3JkZXI6IDFweCBzb2xpZDsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZmZhYWZmOworCWJvcmRlci1jb2xvcjogI2ZmY2NmZiAjZmYwMGVlICNmZjAwZWUgI2ZmY2NmZjsKK30KKworc3Bhbi5yZWZzIHNwYW4ucmVmIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjYWFhYWZmOworCWJvcmRlci1jb2xvcjogI2NjY2NmZiAjMDAzM2NjICMwMDMzY2MgI2NjY2NmZjsKK30KKworc3Bhbi5yZWZzIHNwYW4udGFnIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmFhOworCWJvcmRlci1jb2xvcjogI2ZmZmZjYyAjZmZlZTAwICNmZmVlMDAgI2ZmZmZjYzsKK30KKworc3Bhbi5yZWZzIHNwYW4uaGVhZCB7CisJYmFja2dyb3VuZC1jb2xvcjogI2FhZmZhYTsKKwlib3JkZXItY29sb3I6ICNjY2ZmY2MgIzAwY2MzMyAjMDBjYzMzICNjY2ZmY2M7Cit9CisKK3NwYW4uYXRuaWdodCB7CisJY29sb3I6ICNjYzAwMDA7Cit9CisKK3NwYW4ubWF0Y2ggeworCWNvbG9yOiAjZTAwMDAwOworfQorCitkaXYuYmluYXJ5IHsKKwlmb250LXN0eWxlOiBpdGFsaWM7Cit9CmRpZmYgLS1naXQgYS9naXR3ZWIvZ2l0d2ViLnBlcmwgYi9naXR3ZWIvZ2l0d2ViLnBlcmwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzNkMDk4YQotLS0gL2Rldi9udWxsCisrKyBiL2dpdHdlYi9naXR3ZWIucGVybApAQCAtMCwwICsxLDU3ODAgQEAKKyMhL3Vzci9iaW4vcGVybAorCisjIGdpdHdlYiAtIHNpbXBsZSB3ZWIgaW50ZXJmYWNlIHRvIHRyYWNrIGNoYW5nZXMgaW4gZ2l0IHJlcG9zaXRvcmllcworIworIyAoQykgMjAwNS0yMDA2LCBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisjIChDKSAyMDA1LCBDaHJpc3RpYW4gR2llcmtlCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMdjIKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBDR0kgcXcoOnN0YW5kYXJkIDplc2NhcGVIVE1MIC1ub3N0aWNreSk7Cit1c2UgQ0dJOjpVdGlsIHF3KHVuZXNjYXBlKTsKK3VzZSBDR0k6OkNhcnAgcXcoZmF0YWxzVG9Ccm93c2VyKTsKK3VzZSBFbmNvZGU7Cit1c2UgRmNudGwgJzptb2RlJzsKK3VzZSBGaWxlOjpGaW5kIHF3KCk7Cit1c2UgRmlsZTo6QmFzZW5hbWUgcXcoYmFzZW5hbWUpOworYmlubW9kZSBTVERPVVQsICc6dXRmOCc7CisKK0JFR0lOIHsKKwlDR0ktPmNvbXBpbGUoKSBpZiAkRU5WeydNT0RfUEVSTCd9OworfQorCitvdXIgJGNnaSA9IG5ldyBDR0k7CitvdXIgJHZlcnNpb24gPSAiKytHSVRfVkVSU0lPTisrIjsKK291ciAkbXlfdXJsID0gJGNnaS0+dXJsKCk7CitvdXIgJG15X3VyaSA9ICRjZ2ktPnVybCgtYWJzb2x1dGUgPT4gMSk7CisKKyMgY29yZSBnaXQgZXhlY3V0YWJsZSB0byB1c2UKKyMgdGhpcyBjYW4ganVzdCBiZSAiZ2l0IiBpZiB5b3VyIHdlYnNlcnZlciBoYXMgYSBzZW5zaWJsZSBQQVRICitvdXIgJEdJVCA9ICIrK0dJVF9CSU5ESVIrKy9naXQiOworCisjIGFic29sdXRlIGZzLXBhdGggd2hpY2ggd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhlIHByb2plY3QgcGF0aAorI291ciAkcHJvamVjdHJvb3QgPSAiL3B1Yi9zY20iOworb3VyICRwcm9qZWN0cm9vdCA9ICIrK0dJVFdFQl9QUk9KRUNUUk9PVCsrIjsKKworIyBmcyB0cmF2ZXJzaW5nIGxpbWl0IGZvciBnZXR0aW5nIHByb2plY3QgbGlzdAorIyB0aGUgbnVtYmVyIGlzIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0cm9vdAorb3VyICRwcm9qZWN0X21heGRlcHRoID0gIisrR0lUV0VCX1BST0pFQ1RfTUFYREVQVEgrKyI7CisKKyMgdGFyZ2V0IG9mIHRoZSBob21lIGxpbmsgb24gdG9wIG9mIGFsbCBwYWdlcworb3VyICRob21lX2xpbmsgPSAkbXlfdXJpIHx8ICIvIjsKKworIyBzdHJpbmcgb2YgdGhlIGhvbWUgbGluayBvbiB0b3Agb2YgYWxsIHBhZ2VzCitvdXIgJGhvbWVfbGlua19zdHIgPSAiKytHSVRXRUJfSE9NRV9MSU5LX1NUUisrIjsKKworIyBuYW1lIG9mIHlvdXIgc2l0ZSBvciBvcmdhbml6YXRpb24gdG8gYXBwZWFyIGluIHBhZ2UgdGl0bGVzCisjIHJlcGxhY2UgdGhpcyB3aXRoIHNvbWV0aGluZyBtb3JlIGRlc2NyaXB0aXZlIGZvciBjbGVhcmVyIGJvb2ttYXJrcworb3VyICRzaXRlX25hbWUgPSAiKytHSVRXRUJfU0lURU5BTUUrKyIKKyAgICAgICAgICAgICAgICAgfHwgKCRFTlZ7J1NFUlZFUl9OQU1FJ30gfHwgIlVudGl0bGVkIikgLiAiIEdpdCI7CisKKyMgZmlsZW5hbWUgb2YgaHRtbCB0ZXh0IHRvIGluY2x1ZGUgYXQgdG9wIG9mIGVhY2ggcGFnZQorb3VyICRzaXRlX2hlYWRlciA9ICIrK0dJVFdFQl9TSVRFX0hFQURFUisrIjsKKyMgaHRtbCB0ZXh0IHRvIGluY2x1ZGUgYXQgaG9tZSBwYWdlCitvdXIgJGhvbWVfdGV4dCA9ICIrK0dJVFdFQl9IT01FVEVYVCsrIjsKKyMgZmlsZW5hbWUgb2YgaHRtbCB0ZXh0IHRvIGluY2x1ZGUgYXQgYm90dG9tIG9mIGVhY2ggcGFnZQorb3VyICRzaXRlX2Zvb3RlciA9ICIrK0dJVFdFQl9TSVRFX0ZPT1RFUisrIjsKKworIyBVUkkgb2Ygc3R5bGVzaGVldHMKK291ciBAc3R5bGVzaGVldHMgPSAoIisrR0lUV0VCX0NTUysrIik7CisjIFVSSSBvZiBhIHNpbmdsZSBzdHlsZXNoZWV0LCB3aGljaCBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBHSVRXRUJfQ09ORklHLgorb3VyICRzdHlsZXNoZWV0ID0gdW5kZWY7CisjIFVSSSBvZiBHSVQgbG9nbyAoNzJ4Mjcgc2l6ZSkKK291ciAkbG9nbyA9ICIrK0dJVFdFQl9MT0dPKysiOworIyBVUkkgb2YgR0lUIGZhdmljb24sIGFzc3VtZWQgdG8gYmUgaW1hZ2UvcG5nIHR5cGUKK291ciAkZmF2aWNvbiA9ICIrK0dJVFdFQl9GQVZJQ09OKysiOworCisjIFVSSSBhbmQgbGFiZWwgKHRpdGxlKSBvZiBHSVQgbG9nbyBsaW5rCisjb3VyICRsb2dvX3VybCA9ICJodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy8iOworI291ciAkbG9nb19sYWJlbCA9ICJnaXQgZG9jdW1lbnRhdGlvbiI7CitvdXIgJGxvZ29fdXJsID0gImh0dHA6Ly9naXQub3IuY3ovIjsKK291ciAkbG9nb19sYWJlbCA9ICJnaXQgaG9tZXBhZ2UiOworCisjIHNvdXJjZSBvZiBwcm9qZWN0cyBsaXN0CitvdXIgJHByb2plY3RzX2xpc3QgPSAiKytHSVRXRUJfTElTVCsrIjsKKworIyB0aGUgd2lkdGggKGluIGNoYXJhY3RlcnMpIG9mIHRoZSBwcm9qZWN0cyBsaXN0ICJEZXNjcmlwdGlvbiIgY29sdW1uCitvdXIgJHByb2plY3RzX2xpc3RfZGVzY3JpcHRpb25fd2lkdGggPSAyNTsKKworIyBkZWZhdWx0IG9yZGVyIG9mIHByb2plY3RzIGxpc3QKKyMgdmFsaWQgdmFsdWVzIGFyZSBub25lLCBwcm9qZWN0LCBkZXNjciwgb3duZXIsIGFuZCBhZ2UKK291ciAkZGVmYXVsdF9wcm9qZWN0c19vcmRlciA9ICJwcm9qZWN0IjsKKworIyBzaG93IHJlcG9zaXRvcnkgb25seSBpZiB0aGlzIGZpbGUgZXhpc3RzCisjIChvbmx5IGVmZmVjdGl2ZSBpZiB0aGlzIHZhcmlhYmxlIGV2YWx1YXRlcyB0byB0cnVlKQorb3VyICRleHBvcnRfb2sgPSAiKytHSVRXRUJfRVhQT1JUX09LKysiOworCisjIG9ubHkgYWxsb3cgdmlld2luZyBvZiByZXBvc2l0b3JpZXMgYWxzbyBzaG93biBvbiB0aGUgb3ZlcnZpZXcgcGFnZQorb3VyICRzdHJpY3RfZXhwb3J0ID0gIisrR0lUV0VCX1NUUklDVF9FWFBPUlQrKyI7CisKKyMgbGlzdCBvZiBnaXQgYmFzZSBVUkxzIHVzZWQgZm9yIFVSTCB0byB3aGVyZSBmZXRjaCBwcm9qZWN0IGZyb20sCisjIGkuZS4gZnVsbCBVUkwgaXMgIiRnaXRfYmFzZV91cmwvJHByb2plY3QiCitvdXIgQGdpdF9iYXNlX3VybF9saXN0ID0gZ3JlcCB7ICRfIG5lICcnIH0gKCIrK0dJVFdFQl9CQVNFX1VSTCsrIik7CisKKyMgZGVmYXVsdCBibG9iX3BsYWluIG1pbWV0eXBlIGFuZCBkZWZhdWx0IGNoYXJzZXQgZm9yIHRleHQvcGxhaW4gYmxvYgorb3VyICRkZWZhdWx0X2Jsb2JfcGxhaW5fbWltZXR5cGUgPSAndGV4dC9wbGFpbic7CitvdXIgJGRlZmF1bHRfdGV4dF9wbGFpbl9jaGFyc2V0ICA9IHVuZGVmOworCisjIGZpbGUgdG8gdXNlIGZvciBndWVzc2luZyBNSU1FIHR5cGVzIGJlZm9yZSB0cnlpbmcgL2V0Yy9taW1lLnR5cGVzCisjIChyZWxhdGl2ZSB0byB0aGUgY3VycmVudCBnaXQgcmVwb3NpdG9yeSkKK291ciAkbWltZXR5cGVzX2ZpbGUgPSB1bmRlZjsKKworIyBhc3N1bWUgdGhpcyBjaGFyc2V0IGlmIGxpbmUgY29udGFpbnMgbm9uLVVURi04IGNoYXJhY3RlcnM7CisjIGl0IHNob3VsZCBiZSB2YWxpZCBlbmNvZGluZyAoc2VlIEVuY29kaW5nOjpTdXBwb3J0ZWQoM3BtKSBmb3IgbGlzdCksCisjIGZvciB3aGljaCBlbmNvZGluZyBhbGwgYnl0ZSBzZXF1ZW5jZXMgYXJlIHZhbGlkLCBmb3IgZXhhbXBsZQorIyAnaXNvLTg4NTktMScgYWthICdsYXRpbjEnIChpdCBpcyBkZWNvZGVkIHdpdGhvdXQgY2hlY2tpbmcsIHNvIGl0CisjIGNvdWxkIGJlIGV2ZW4gJ3V0Zi04JyBmb3IgdGhlIG9sZCBiZWhhdmlvcikKK291ciAkZmFsbGJhY2tfZW5jb2RpbmcgPSAnbGF0aW4xJzsKKworIyByZW5hbWUgZGV0ZWN0aW9uIG9wdGlvbnMgZm9yIGdpdC1kaWZmIGFuZCBnaXQtZGlmZi10cmVlCisjIC0gZGVmYXVsdCBpcyAnLU0nLCB3aXRoIHRoZSBjb3N0IHByb3BvcnRpb25hbCB0bworIyAgIChudW1iZXIgb2YgcmVtb3ZlZCBmaWxlcykgKiAobnVtYmVyIG9mIG5ldyBmaWxlcykuCisjIC0gbW9yZSBjb3N0bHkgaXMgJy1DJyAod2hpY2ggaW1wbGllcyAnLU0nKSwgd2l0aCB0aGUgY29zdCBwcm9wb3J0aW9uYWwgdG8KKyMgICAobnVtYmVyIG9mIGNoYW5nZWQgZmlsZXMgKyBudW1iZXIgb2YgcmVtb3ZlZCBmaWxlcykgKiAobnVtYmVyIG9mIG5ldyBmaWxlcykKKyMgLSBldmVuIG1vcmUgY29zdGx5IGlzICctQycsICctLWZpbmQtY29waWVzLWhhcmRlcicgd2l0aCBjb3N0CisjICAgKG51bWJlciBvZiBmaWxlcyBpbiB0aGUgb3JpZ2luYWwgdHJlZSkgKiAobnVtYmVyIG9mIG5ldyBmaWxlcykKKyMgLSBvbmUgbWlnaHQgd2FudCB0byBpbmNsdWRlICctQicgb3B0aW9uLCBlLmcuICctQicsICctTScKK291ciBAZGlmZl9vcHRzID0gKCctTScpOyAjIHRha2VuIGZyb20gZ2l0X2NvbW1pdAorCisjIGluZm9ybWF0aW9uIGFib3V0IHNuYXBzaG90IGZvcm1hdHMgdGhhdCBnaXR3ZWIgaXMgY2FwYWJsZSBvZiBzZXJ2aW5nCitvdXIgJWtub3duX3NuYXBzaG90X2Zvcm1hdHMgPSAoCisJIyBuYW1lID0+IHsKKwkjIAknZGlzcGxheScgPT4gZGlzcGxheSBuYW1lLAorCSMgCSd0eXBlJyA9PiBtaW1lIHR5cGUsCisJIyAJJ3N1ZmZpeCcgPT4gZmlsZW5hbWUgc3VmZml4LAorCSMgCSdmb3JtYXQnID0+IC0tZm9ybWF0IGZvciBnaXQtYXJjaGl2ZSwKKwkjIAknY29tcHJlc3NvcicgPT4gW2NvbXByZXNzb3IgY29tbWFuZCBhbmQgYXJndW1lbnRzXQorCSMgCSAgICAgICAgICAgICAgICAoYXJyYXkgcmVmZXJlbmNlLCBvcHRpb25hbCl9CisJIworCSd0Z3onID0+IHsKKwkJJ2Rpc3BsYXknID0+ICd0YXIuZ3onLAorCQkndHlwZScgPT4gJ2FwcGxpY2F0aW9uL3gtZ3ppcCcsCisJCSdzdWZmaXgnID0+ICcudGFyLmd6JywKKwkJJ2Zvcm1hdCcgPT4gJ3RhcicsCisJCSdjb21wcmVzc29yJyA9PiBbJ2d6aXAnXX0sCisKKwkndGJ6MicgPT4geworCQknZGlzcGxheScgPT4gJ3Rhci5iejInLAorCQkndHlwZScgPT4gJ2FwcGxpY2F0aW9uL3gtYnppcDInLAorCQknc3VmZml4JyA9PiAnLnRhci5iejInLAorCQknZm9ybWF0JyA9PiAndGFyJywKKwkJJ2NvbXByZXNzb3InID0+IFsnYnppcDInXX0sCisKKwknemlwJyA9PiB7CisJCSdkaXNwbGF5JyA9PiAnemlwJywKKwkJJ3R5cGUnID0+ICdhcHBsaWNhdGlvbi94LXppcCcsCisJCSdzdWZmaXgnID0+ICcuemlwJywKKwkJJ2Zvcm1hdCcgPT4gJ3ppcCd9LAorKTsKKworIyBBbGlhc2VzIHNvIHdlIHVuZGVyc3RhbmQgb2xkIGdpdHdlYi5zbmFwc2hvdCB2YWx1ZXMgaW4gcmVwb3NpdG9yeQorIyBjb25maWd1cmF0aW9uLgorb3VyICVrbm93bl9zbmFwc2hvdF9mb3JtYXRfYWxpYXNlcyA9ICgKKwknZ3ppcCcgID0+ICd0Z3onLAorCSdiemlwMicgPT4gJ3RiejInLAorCisJIyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OiBsZWdhY3kgZ2l0d2ViIGNvbmZpZyBzdXBwb3J0CisJJ3gtZ3ppcCcgPT4gdW5kZWYsICdneicgPT4gdW5kZWYsCisJJ3gtYnppcDInID0+IHVuZGVmLCAnYnoyJyA9PiB1bmRlZiwKKwkneC16aXAnID0+IHVuZGVmLCAnJyA9PiB1bmRlZiwKKyk7CisKKyMgWW91IGRlZmluZSBzaXRlLXdpZGUgZmVhdHVyZSBkZWZhdWx0cyBoZXJlOyBvdmVycmlkZSB0aGVtIHdpdGgKKyMgJEdJVFdFQl9DT05GSUcgYXMgbmVjZXNzYXJ5Lgorb3VyICVmZWF0dXJlID0gKAorCSMgZmVhdHVyZSA9PiB7CisJIyAJJ3N1YicgPT4gZmVhdHVyZS1zdWIgKHN1YnJvdXRpbmUpLAorCSMgCSdvdmVycmlkZScgPT4gYWxsb3ctb3ZlcnJpZGUgKGJvb2xlYW4pLAorCSMgCSdkZWZhdWx0JyA9PiBbIGRlZmF1bHQgb3B0aW9ucy4uLl0gKGFycmF5IHJlZmVyZW5jZSl9CisJIworCSMgaWYgZmVhdHVyZSBpcyBvdmVycmlkYWJsZSAoaXQgbWVhbnMgdGhhdCBhbGxvdy1vdmVycmlkZSBoYXMgdHJ1ZSB2YWx1ZSksCisJIyB0aGVuIGZlYXR1cmUtc3ViIHdpbGwgYmUgY2FsbGVkIHdpdGggZGVmYXVsdCBvcHRpb25zIGFzIHBhcmFtZXRlcnM7CisJIyByZXR1cm4gdmFsdWUgb2YgZmVhdHVyZS1zdWIgaW5kaWNhdGVzIGlmIHRvIGVuYWJsZSBzcGVjaWZpZWQgZmVhdHVyZQorCSMKKwkjIGlmIHRoZXJlIGlzIG5vICdzdWInIGtleSAobm8gZmVhdHVyZS1zdWIpLCB0aGVuIGZlYXR1cmUgY2Fubm90IGJlCisJIyBvdmVycmlkZW4KKwkjCisJIyB1c2UgZ2l0d2ViX2NoZWNrX2ZlYXR1cmUoPGZlYXR1cmU+KSB0byBjaGVjayBpZiA8ZmVhdHVyZT4gaXMgZW5hYmxlZAorCisJIyBFbmFibGUgdGhlICdibGFtZScgYmxvYiB2aWV3LCBzaG93aW5nIHRoZSBsYXN0IGNvbW1pdCB0aGF0IG1vZGlmaWVkCisJIyBlYWNoIGxpbmUgaW4gdGhlIGZpbGUuIFRoaXMgY2FuIGJlIHZlcnkgQ1BVLWludGVuc2l2ZS4KKworCSMgVG8gZW5hYmxlIHN5c3RlbSB3aWRlIGhhdmUgaW4gJEdJVFdFQl9DT05GSUcKKwkjICRmZWF0dXJleydibGFtZSd9eydkZWZhdWx0J30gPSBbMV07CisJIyBUbyBoYXZlIHByb2plY3Qgc3BlY2lmaWMgY29uZmlnIGVuYWJsZSBvdmVycmlkZSBpbiAkR0lUV0VCX0NPTkZJRworCSMgJGZlYXR1cmV7J2JsYW1lJ317J292ZXJyaWRlJ30gPSAxOworCSMgYW5kIGluIHByb2plY3QgY29uZmlnIGdpdHdlYi5ibGFtZSA9IDB8MTsKKwknYmxhbWUnID0+IHsKKwkJJ3N1YicgPT4gXCZmZWF0dXJlX2JsYW1lLAorCQknb3ZlcnJpZGUnID0+IDAsCisJCSdkZWZhdWx0JyA9PiBbMF19LAorCisJIyBFbmFibGUgdGhlICdzbmFwc2hvdCcgbGluaywgcHJvdmlkaW5nIGEgY29tcHJlc3NlZCBhcmNoaXZlIG9mIGFueQorCSMgdHJlZS4gVGhpcyBjYW4gcG90ZW50aWFsbHkgZ2VuZXJhdGUgaGlnaCB0cmFmZmljIGlmIHlvdSBoYXZlIGxhcmdlCisJIyBwcm9qZWN0LgorCisJIyBWYWx1ZSBpcyBhIGxpc3Qgb2YgZm9ybWF0cyBkZWZpbmVkIGluICVrbm93bl9zbmFwc2hvdF9mb3JtYXRzIHRoYXQKKwkjIHlvdSB3aXNoIHRvIG9mZmVyLgorCSMgVG8gZGlzYWJsZSBzeXN0ZW0gd2lkZSBoYXZlIGluICRHSVRXRUJfQ09ORklHCisJIyAkZmVhdHVyZXsnc25hcHNob3QnfXsnZGVmYXVsdCd9ID0gW107CisJIyBUbyBoYXZlIHByb2plY3Qgc3BlY2lmaWMgY29uZmlnIGVuYWJsZSBvdmVycmlkZSBpbiAkR0lUV0VCX0NPTkZJRworCSMgJGZlYXR1cmV7J3NuYXBzaG90J317J292ZXJyaWRlJ30gPSAxOworCSMgYW5kIGluIHByb2plY3QgY29uZmlnLCBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZvcm1hdHMgb3IgIm5vbmUiCisJIyB0byBkaXNhYmxlLiAgRXhhbXBsZTogZ2l0d2ViLnNuYXBzaG90ID0gdGJ6Mix6aXA7CisJJ3NuYXBzaG90JyA9PiB7CisJCSdzdWInID0+IFwmZmVhdHVyZV9zbmFwc2hvdCwKKwkJJ292ZXJyaWRlJyA9PiAwLAorCQknZGVmYXVsdCcgPT4gWyd0Z3onXX0sCisKKwkjIEVuYWJsZSB0ZXh0IHNlYXJjaCwgd2hpY2ggd2lsbCBsaXN0IHRoZSBjb21taXRzIHdoaWNoIG1hdGNoIGF1dGhvciwKKwkjIGNvbW1pdHRlciBvciBjb21taXQgdGV4dCB0byBhIGdpdmVuIHN0cmluZy4gIEVuYWJsZWQgYnkgZGVmYXVsdC4KKwkjIFByb2plY3Qgc3BlY2lmaWMgb3ZlcnJpZGUgaXMgbm90IHN1cHBvcnRlZC4KKwknc2VhcmNoJyA9PiB7CisJCSdvdmVycmlkZScgPT4gMCwKKwkJJ2RlZmF1bHQnID0+IFsxXX0sCisKKwkjIEVuYWJsZSBncmVwIHNlYXJjaCwgd2hpY2ggd2lsbCBsaXN0IHRoZSBmaWxlcyBpbiBjdXJyZW50bHkgc2VsZWN0ZWQKKwkjIHRyZWUgY29udGFpbmluZyB0aGUgZ2l2ZW4gc3RyaW5nLiBFbmFibGVkIGJ5IGRlZmF1bHQuIFRoaXMgY2FuIGJlCisJIyBwb3RlbnRpYWxseSBDUFUtaW50ZW5zaXZlLCBvZiBjb3Vyc2UuCisKKwkjIFRvIGVuYWJsZSBzeXN0ZW0gd2lkZSBoYXZlIGluICRHSVRXRUJfQ09ORklHCisJIyAkZmVhdHVyZXsnZ3JlcCd9eydkZWZhdWx0J30gPSBbMV07CisJIyBUbyBoYXZlIHByb2plY3Qgc3BlY2lmaWMgY29uZmlnIGVuYWJsZSBvdmVycmlkZSBpbiAkR0lUV0VCX0NPTkZJRworCSMgJGZlYXR1cmV7J2dyZXAnfXsnb3ZlcnJpZGUnfSA9IDE7CisJIyBhbmQgaW4gcHJvamVjdCBjb25maWcgZ2l0d2ViLmdyZXAgPSAwfDE7CisJJ2dyZXAnID0+IHsKKwkJJ292ZXJyaWRlJyA9PiAwLAorCQknZGVmYXVsdCcgPT4gWzFdfSwKKworCSMgRW5hYmxlIHRoZSBwaWNrYXhlIHNlYXJjaCwgd2hpY2ggd2lsbCBsaXN0IHRoZSBjb21taXRzIHRoYXQgbW9kaWZpZWQKKwkjIGEgZ2l2ZW4gc3RyaW5nIGluIGEgZmlsZS4gVGhpcyBjYW4gYmUgcHJhY3RpY2FsIGFuZCBxdWl0ZSBmYXN0ZXIKKwkjIGFsdGVybmF0aXZlIHRvICdibGFtZScsIGJ1dCBzdGlsbCBwb3RlbnRpYWxseSBDUFUtaW50ZW5zaXZlLgorCisJIyBUbyBlbmFibGUgc3lzdGVtIHdpZGUgaGF2ZSBpbiAkR0lUV0VCX0NPTkZJRworCSMgJGZlYXR1cmV7J3BpY2theGUnfXsnZGVmYXVsdCd9ID0gWzFdOworCSMgVG8gaGF2ZSBwcm9qZWN0IHNwZWNpZmljIGNvbmZpZyBlbmFibGUgb3ZlcnJpZGUgaW4gJEdJVFdFQl9DT05GSUcKKwkjICRmZWF0dXJleydwaWNrYXhlJ317J292ZXJyaWRlJ30gPSAxOworCSMgYW5kIGluIHByb2plY3QgY29uZmlnIGdpdHdlYi5waWNrYXhlID0gMHwxOworCSdwaWNrYXhlJyA9PiB7CisJCSdzdWInID0+IFwmZmVhdHVyZV9waWNrYXhlLAorCQknb3ZlcnJpZGUnID0+IDAsCisJCSdkZWZhdWx0JyA9PiBbMV19LAorCisJIyBNYWtlIGdpdHdlYiB1c2UgYW4gYWx0ZXJuYXRpdmUgZm9ybWF0IG9mIHRoZSBVUkxzIHdoaWNoIGNhbiBiZQorCSMgbW9yZSByZWFkYWJsZSBhbmQgbmF0dXJhbC1sb29raW5nOiBwcm9qZWN0IG5hbWUgaXMgZW1iZWRkZWQKKwkjIGRpcmVjdGx5IGluIHRoZSBwYXRoIGFuZCB0aGUgcXVlcnkgc3RyaW5nIGNvbnRhaW5zIG90aGVyCisJIyBhdXhpbGlhcnkgaW5mb3JtYXRpb24uIEFsbCBnaXR3ZWIgaW5zdGFsbGF0aW9ucyByZWNvZ25pemUKKwkjIFVSTCBpbiBlaXRoZXIgZm9ybWF0OyB0aGlzIGNvbmZpZ3VyZXMgaW4gd2hpY2ggZm9ybWF0cyBnaXR3ZWIKKwkjIGdlbmVyYXRlcyBsaW5rcy4KKworCSMgVG8gZW5hYmxlIHN5c3RlbSB3aWRlIGhhdmUgaW4gJEdJVFdFQl9DT05GSUcKKwkjICRmZWF0dXJleydwYXRoaW5mbyd9eydkZWZhdWx0J30gPSBbMV07CisJIyBQcm9qZWN0IHNwZWNpZmljIG92ZXJyaWRlIGlzIG5vdCBzdXBwb3J0ZWQuCisKKwkjIE5vdGUgdGhhdCB5b3Ugd2lsbCBuZWVkIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiBDU1MsCisJIyBmYXZpY29uLCBsb2dvIGFuZCBwb3NzaWJseSBvdGhlciBmaWxlcyB0byBhbiBhYnNvbHV0ZSBVUkwuIEFsc28sCisJIyBpZiBnaXR3ZWIuY2dpIHNlcnZlcyBhcyB5b3VyIGluZGV4ZmlsZSwgeW91IHdpbGwgbmVlZCB0byBmb3JjZQorCSMgJG15X3VyaSB0byBjb250YWluIHRoZSBzY3JpcHQgbmFtZSBpbiB5b3VyICRHSVRXRUJfQ09ORklHLgorCSdwYXRoaW5mbycgPT4geworCQknb3ZlcnJpZGUnID0+IDAsCisJCSdkZWZhdWx0JyA9PiBbMF19LAorCisJIyBNYWtlIGdpdHdlYiBjb25zaWRlciBwcm9qZWN0cyBpbiBwcm9qZWN0IHJvb3Qgc3ViZGlyZWN0b3JpZXMKKwkjIHRvIGJlIGZvcmtzIG9mIGV4aXN0aW5nIHByb2plY3RzLiBHaXZlbiBwcm9qZWN0ICRwcm9qbmFtZS5naXQsCisJIyBwcm9qZWN0cyBtYXRjaGluZyAkcHJvam5hbWUvKi5naXQgd2lsbCBub3QgYmUgc2hvd24gaW4gdGhlIG1haW4KKwkjIHByb2plY3RzIGxpc3QsIGluc3RlYWQgYSAnKycgbWFyayB3aWxsIGJlIGFkZGVkIHRvICRwcm9qbmFtZQorCSMgdGhlcmUgYW5kIGEgJ2ZvcmtzJyB2aWV3IHdpbGwgYmUgZW5hYmxlZCBmb3IgdGhlIHByb2plY3QsIGxpc3RpbmcKKwkjIGFsbCB0aGUgZm9ya3MuIElmIHByb2plY3QgbGlzdCBpcyB0YWtlbiBmcm9tIGEgZmlsZSwgZm9ya3MgaGF2ZQorCSMgdG8gYmUgbGlzdGVkIGFmdGVyIHRoZSBtYWluIHByb2plY3QuCisKKwkjIFRvIGVuYWJsZSBzeXN0ZW0gd2lkZSBoYXZlIGluICRHSVRXRUJfQ09ORklHCisJIyAkZmVhdHVyZXsnZm9ya3MnfXsnZGVmYXVsdCd9ID0gWzFdOworCSMgUHJvamVjdCBzcGVjaWZpYyBvdmVycmlkZSBpcyBub3Qgc3VwcG9ydGVkLgorCSdmb3JrcycgPT4geworCQknb3ZlcnJpZGUnID0+IDAsCisJCSdkZWZhdWx0JyA9PiBbMF19LAorKTsKKworc3ViIGdpdHdlYl9jaGVja19mZWF0dXJlIHsKKwlteSAoJG5hbWUpID0gQF87CisJcmV0dXJuIHVubGVzcyBleGlzdHMgJGZlYXR1cmV7JG5hbWV9OworCW15ICgkc3ViLCAkb3ZlcnJpZGUsIEBkZWZhdWx0cykgPSAoCisJCSRmZWF0dXJleyRuYW1lfXsnc3ViJ30sCisJCSRmZWF0dXJleyRuYW1lfXsnb3ZlcnJpZGUnfSwKKwkJQHskZmVhdHVyZXskbmFtZX17J2RlZmF1bHQnfX0pOworCWlmICghJG92ZXJyaWRlKSB7IHJldHVybiBAZGVmYXVsdHM7IH0KKwlpZiAoIWRlZmluZWQgJHN1YikgeworCQl3YXJuICJmZWF0dXJlICRuYW1lIGlzIG5vdCBvdmVycmlkZWFibGUiOworCQlyZXR1cm4gQGRlZmF1bHRzOworCX0KKwlyZXR1cm4gJHN1Yi0+KEBkZWZhdWx0cyk7Cit9CisKK3N1YiBmZWF0dXJlX2JsYW1lIHsKKwlteSAoJHZhbCkgPSBnaXRfZ2V0X3Byb2plY3RfY29uZmlnKCdibGFtZScsICctLWJvb2wnKTsKKworCWlmICgkdmFsIGVxICd0cnVlJykgeworCQlyZXR1cm4gMTsKKwl9IGVsc2lmICgkdmFsIGVxICdmYWxzZScpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuICRfWzBdOworfQorCitzdWIgZmVhdHVyZV9zbmFwc2hvdCB7CisJbXkgKEBmbXRzKSA9IEBfOworCisJbXkgKCR2YWwpID0gZ2l0X2dldF9wcm9qZWN0X2NvbmZpZygnc25hcHNob3QnKTsKKworCWlmICgkdmFsKSB7CisJCUBmbXRzID0gKCR2YWwgZXEgJ25vbmUnID8gKCkgOiBzcGxpdCAvXHMqWyxcc11ccyovLCAkdmFsKTsKKwl9CisKKwlyZXR1cm4gQGZtdHM7Cit9CisKK3N1YiBmZWF0dXJlX2dyZXAgeworCW15ICgkdmFsKSA9IGdpdF9nZXRfcHJvamVjdF9jb25maWcoJ2dyZXAnLCAnLS1ib29sJyk7CisKKwlpZiAoJHZhbCBlcSAndHJ1ZScpIHsKKwkJcmV0dXJuICgxKTsKKwl9IGVsc2lmICgkdmFsIGVxICdmYWxzZScpIHsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlyZXR1cm4gKCRfWzBdKTsKK30KKworc3ViIGZlYXR1cmVfcGlja2F4ZSB7CisJbXkgKCR2YWwpID0gZ2l0X2dldF9wcm9qZWN0X2NvbmZpZygncGlja2F4ZScsICctLWJvb2wnKTsKKworCWlmICgkdmFsIGVxICd0cnVlJykgeworCQlyZXR1cm4gKDEpOworCX0gZWxzaWYgKCR2YWwgZXEgJ2ZhbHNlJykgeworCQlyZXR1cm4gKDApOworCX0KKworCXJldHVybiAoJF9bMF0pOworfQorCisjIGNoZWNraW5nIEhFQUQgZmlsZSB3aXRoIC1lIGlzIGZyYWdpbGUgaWYgdGhlIHJlcG9zaXRvcnkgd2FzCisjIGluaXRpYWxpemVkIGxvbmcgdGltZSBhZ28gKGkuZS4gc3ltbGluayBIRUFEKSBhbmQgd2FzIHBhY2stcmVmJ2VkCisjIGFuZCB0aGVuIHBydW5lZC4KK3N1YiBjaGVja19oZWFkX2xpbmsgeworCW15ICgkZGlyKSA9IEBfOworCW15ICRoZWFkZmlsZSA9ICIkZGlyL0hFQUQiOworCXJldHVybiAoKC1lICRoZWFkZmlsZSkgfHwKKwkJKC1sICRoZWFkZmlsZSAmJiByZWFkbGluaygkaGVhZGZpbGUpID1+IC9ecmVmc1wvaGVhZHNcLy8pKTsKK30KKworc3ViIGNoZWNrX2V4cG9ydF9vayB7CisJbXkgKCRkaXIpID0gQF87CisJcmV0dXJuIChjaGVja19oZWFkX2xpbmsoJGRpcikgJiYKKwkJKCEkZXhwb3J0X29rIHx8IC1lICIkZGlyLyRleHBvcnRfb2siKSk7Cit9CisKKyMgcHJvY2VzcyBhbHRlcm5hdGUgbmFtZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyMgZmlsdGVyIG91dCB1bnN1cHBvcnRlZCAodW5rbm93bikgc25hcHNob3QgZm9ybWF0cworc3ViIGZpbHRlcl9zbmFwc2hvdF9mbXRzIHsKKwlteSBAZm10cyA9IEBfOworCisJQGZtdHMgPSBtYXAgeworCQlleGlzdHMgJGtub3duX3NuYXBzaG90X2Zvcm1hdF9hbGlhc2VzeyRffSA/CisJCSAgICAgICAka25vd25fc25hcHNob3RfZm9ybWF0X2FsaWFzZXN7JF99IDogJF99IEBmbXRzOworCUBmbXRzID0gZ3JlcChleGlzdHMgJGtub3duX3NuYXBzaG90X2Zvcm1hdHN7JF99LCBAZm10cyk7CisKK30KKworb3VyICRHSVRXRUJfQ09ORklHID0gJEVOVnsnR0lUV0VCX0NPTkZJRyd9IHx8ICIrK0dJVFdFQl9DT05GSUcrKyI7CitkbyAkR0lUV0VCX0NPTkZJRyBpZiAtZSAkR0lUV0VCX0NPTkZJRzsKKworIyB2ZXJzaW9uIG9mIHRoZSBjb3JlIGdpdCBiaW5hcnkKK291ciAkZ2l0X3ZlcnNpb24gPSBxeCgkR0lUIC0tdmVyc2lvbikgPX4gbS9naXQgdmVyc2lvbiAoLiopJC8gPyAkMSA6ICJ1bmtub3duIjsKKworJHByb2plY3RzX2xpc3QgfHw9ICRwcm9qZWN0cm9vdDsKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIGlucHV0IHZhbGlkYXRpb24gYW5kIGRpc3BhdGNoCitvdXIgJGFjdGlvbiA9ICRjZ2ktPnBhcmFtKCdhJyk7CitpZiAoZGVmaW5lZCAkYWN0aW9uKSB7CisJaWYgKCRhY3Rpb24gPX4gbS9bXjAtOWEtekEtWlwuXC1fXS8pIHsKKwkJZGllX2Vycm9yKHVuZGVmLCAiSW52YWxpZCBhY3Rpb24gcGFyYW1ldGVyIik7CisJfQorfQorCisjIHBhcmFtZXRlcnMgd2hpY2ggYXJlIHBhdGhuYW1lcworb3VyICRwcm9qZWN0ID0gJGNnaS0+cGFyYW0oJ3AnKTsKK2lmIChkZWZpbmVkICRwcm9qZWN0KSB7CisJaWYgKCF2YWxpZGF0ZV9wYXRobmFtZSgkcHJvamVjdCkgfHwKKwkgICAgISgtZCAiJHByb2plY3Ryb290LyRwcm9qZWN0IikgfHwKKwkgICAgIWNoZWNrX2hlYWRfbGluaygiJHByb2plY3Ryb290LyRwcm9qZWN0IikgfHwKKwkgICAgKCRleHBvcnRfb2sgJiYgISgtZSAiJHByb2plY3Ryb290LyRwcm9qZWN0LyRleHBvcnRfb2siKSkgfHwKKwkgICAgKCRzdHJpY3RfZXhwb3J0ICYmICFwcm9qZWN0X2luX2xpc3QoJHByb2plY3QpKSkgeworCQl1bmRlZiAkcHJvamVjdDsKKwkJZGllX2Vycm9yKHVuZGVmLCAiTm8gc3VjaCBwcm9qZWN0Iik7CisJfQorfQorCitvdXIgJGZpbGVfbmFtZSA9ICRjZ2ktPnBhcmFtKCdmJyk7CitpZiAoZGVmaW5lZCAkZmlsZV9uYW1lKSB7CisJaWYgKCF2YWxpZGF0ZV9wYXRobmFtZSgkZmlsZV9uYW1lKSkgeworCQlkaWVfZXJyb3IodW5kZWYsICJJbnZhbGlkIGZpbGUgcGFyYW1ldGVyIik7CisJfQorfQorCitvdXIgJGZpbGVfcGFyZW50ID0gJGNnaS0+cGFyYW0oJ2ZwJyk7CitpZiAoZGVmaW5lZCAkZmlsZV9wYXJlbnQpIHsKKwlpZiAoIXZhbGlkYXRlX3BhdGhuYW1lKCRmaWxlX3BhcmVudCkpIHsKKwkJZGllX2Vycm9yKHVuZGVmLCAiSW52YWxpZCBmaWxlIHBhcmVudCBwYXJhbWV0ZXIiKTsKKwl9Cit9CisKKyMgcGFyYW1ldGVycyB3aGljaCBhcmUgcmVmbmFtZXMKK291ciAkaGFzaCA9ICRjZ2ktPnBhcmFtKCdoJyk7CitpZiAoZGVmaW5lZCAkaGFzaCkgeworCWlmICghdmFsaWRhdGVfcmVmbmFtZSgkaGFzaCkpIHsKKwkJZGllX2Vycm9yKHVuZGVmLCAiSW52YWxpZCBoYXNoIHBhcmFtZXRlciIpOworCX0KK30KKworb3VyICRoYXNoX3BhcmVudCA9ICRjZ2ktPnBhcmFtKCdocCcpOworaWYgKGRlZmluZWQgJGhhc2hfcGFyZW50KSB7CisJaWYgKCF2YWxpZGF0ZV9yZWZuYW1lKCRoYXNoX3BhcmVudCkpIHsKKwkJZGllX2Vycm9yKHVuZGVmLCAiSW52YWxpZCBoYXNoIHBhcmVudCBwYXJhbWV0ZXIiKTsKKwl9Cit9CisKK291ciAkaGFzaF9iYXNlID0gJGNnaS0+cGFyYW0oJ2hiJyk7CitpZiAoZGVmaW5lZCAkaGFzaF9iYXNlKSB7CisJaWYgKCF2YWxpZGF0ZV9yZWZuYW1lKCRoYXNoX2Jhc2UpKSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIkludmFsaWQgaGFzaCBiYXNlIHBhcmFtZXRlciIpOworCX0KK30KKworbXkgJWFsbG93ZWRfb3B0aW9ucyA9ICgKKwkiLS1uby1tZXJnZXMiID0+IFsgcXcocnNzIGF0b20gbG9nIHNob3J0bG9nIGhpc3RvcnkpIF0sCispOworCitvdXIgQGV4dHJhX29wdGlvbnMgPSAkY2dpLT5wYXJhbSgnb3B0Jyk7CitpZiAoZGVmaW5lZCBAZXh0cmFfb3B0aW9ucykgeworCWZvcmVhY2ggbXkgJG9wdCAoQGV4dHJhX29wdGlvbnMpIHsKKwkJaWYgKG5vdCBleGlzdHMgJGFsbG93ZWRfb3B0aW9uc3skb3B0fSkgeworCQkJZGllX2Vycm9yKHVuZGVmLCAiSW52YWxpZCBvcHRpb24gcGFyYW1ldGVyIik7CisJCX0KKwkJaWYgKG5vdCBncmVwKC9eJGFjdGlvbiQvLCBAeyRhbGxvd2VkX29wdGlvbnN7JG9wdH19KSkgeworCQkJZGllX2Vycm9yKHVuZGVmLCAiSW52YWxpZCBvcHRpb24gcGFyYW1ldGVyIGZvciB0aGlzIGFjdGlvbiIpOworCQl9CisJfQorfQorCitvdXIgJGhhc2hfcGFyZW50X2Jhc2UgPSAkY2dpLT5wYXJhbSgnaHBiJyk7CitpZiAoZGVmaW5lZCAkaGFzaF9wYXJlbnRfYmFzZSkgeworCWlmICghdmFsaWRhdGVfcmVmbmFtZSgkaGFzaF9wYXJlbnRfYmFzZSkpIHsKKwkJZGllX2Vycm9yKHVuZGVmLCAiSW52YWxpZCBoYXNoIHBhcmVudCBiYXNlIHBhcmFtZXRlciIpOworCX0KK30KKworIyBvdGhlciBwYXJhbWV0ZXJzCitvdXIgJHBhZ2UgPSAkY2dpLT5wYXJhbSgncGcnKTsKK2lmIChkZWZpbmVkICRwYWdlKSB7CisJaWYgKCRwYWdlID1+IG0vW14wLTldLykgeworCQlkaWVfZXJyb3IodW5kZWYsICJJbnZhbGlkIHBhZ2UgcGFyYW1ldGVyIik7CisJfQorfQorCitvdXIgJHNlYXJjaHR5cGUgPSAkY2dpLT5wYXJhbSgnc3QnKTsKK2lmIChkZWZpbmVkICRzZWFyY2h0eXBlKSB7CisJaWYgKCRzZWFyY2h0eXBlID1+IG0vW15hLXpdLykgeworCQlkaWVfZXJyb3IodW5kZWYsICJJbnZhbGlkIHNlYXJjaHR5cGUgcGFyYW1ldGVyIik7CisJfQorfQorCitvdXIgJHNlYXJjaF91c2VfcmVnZXhwID0gJGNnaS0+cGFyYW0oJ3NyJyk7CisKK291ciAkc2VhcmNodGV4dCA9ICRjZ2ktPnBhcmFtKCdzJyk7CitvdXIgJHNlYXJjaF9yZWdleHA7CitpZiAoZGVmaW5lZCAkc2VhcmNodGV4dCkgeworCWlmIChsZW5ndGgoJHNlYXJjaHRleHQpIDwgMikgeworCQlkaWVfZXJyb3IodW5kZWYsICJBdCBsZWFzdCB0d28gY2hhcmFjdGVycyBhcmUgcmVxdWlyZWQgZm9yIHNlYXJjaCBwYXJhbWV0ZXIiKTsKKwl9CisJJHNlYXJjaF9yZWdleHAgPSAkc2VhcmNoX3VzZV9yZWdleHAgPyAkc2VhcmNodGV4dCA6IHF1b3RlbWV0YSAkc2VhcmNodGV4dDsKK30KKworIyBub3cgcmVhZCBQQVRIX0lORk8gYW5kIHVzZSBpdCBhcyBhbHRlcm5hdGl2ZSB0byBwYXJhbWV0ZXJzCitzdWIgZXZhbHVhdGVfcGF0aF9pbmZvIHsKKwlyZXR1cm4gaWYgZGVmaW5lZCAkcHJvamVjdDsKKwlteSAkcGF0aF9pbmZvID0gJEVOVnsiUEFUSF9JTkZPIn07CisJcmV0dXJuIGlmICEkcGF0aF9pbmZvOworCSRwYXRoX2luZm8gPX4gcyxeLyssLDsKKwlyZXR1cm4gaWYgISRwYXRoX2luZm87CisJIyBmaW5kIHdoaWNoIHBhcnQgb2YgUEFUSF9JTkZPIGlzIHByb2plY3QKKwkkcHJvamVjdCA9ICRwYXRoX2luZm87CisJJHByb2plY3QgPX4gcywvKyQsLDsKKwl3aGlsZSAoJHByb2plY3QgJiYgIWNoZWNrX2hlYWRfbGluaygiJHByb2plY3Ryb290LyRwcm9qZWN0IikpIHsKKwkJJHByb2plY3QgPX4gcywvKlteL10qJCwsOworCX0KKwkjIHZhbGlkYXRlIHByb2plY3QKKwkkcHJvamVjdCA9IHZhbGlkYXRlX3BhdGhuYW1lKCRwcm9qZWN0KTsKKwlpZiAoISRwcm9qZWN0IHx8CisJICAgICgkZXhwb3J0X29rICYmICEtZSAiJHByb2plY3Ryb290LyRwcm9qZWN0LyRleHBvcnRfb2siKSB8fAorCSAgICAoJHN0cmljdF9leHBvcnQgJiYgIXByb2plY3RfaW5fbGlzdCgkcHJvamVjdCkpKSB7CisJCXVuZGVmICRwcm9qZWN0OworCQlyZXR1cm47CisJfQorCSMgZG8gbm90IGNoYW5nZSBhbnkgcGFyYW1ldGVycyBpZiBhbiBhY3Rpb24gaXMgZ2l2ZW4gdXNpbmcgdGhlIHF1ZXJ5IHN0cmluZworCXJldHVybiBpZiAkYWN0aW9uOworCSRwYXRoX2luZm8gPX4gcyxeJHByb2plY3QvKiwsOworCW15ICgkcmVmbmFtZSwgJHBhdGhuYW1lKSA9IHNwbGl0KC86LywgJHBhdGhfaW5mbywgMik7CisJaWYgKGRlZmluZWQgJHBhdGhuYW1lKSB7CisJCSMgd2UgZ290ICJwcm9qZWN0LmdpdC9icmFuY2g6ZmlsZW5hbWUiIG9yICJwcm9qZWN0LmdpdC9icmFuY2g6ZGlyLyIKKwkJIyB3ZSBjb3VsZCB1c2UgZ2l0X2dldF90eXBlKGJyYW5jaDpwYXRobmFtZSksIGJ1dCBpdCBuZWVkcyAkZ2l0X2RpcgorCQkkcGF0aG5hbWUgPX4gcyxeLyssLDsKKwkJaWYgKCEkcGF0aG5hbWUgfHwgc3Vic3RyKCRwYXRobmFtZSwgLTEpIGVxICIvIikgeworCQkJJGFjdGlvbiAgfHw9ICJ0cmVlIjsKKwkJCSRwYXRobmFtZSA9fiBzLC8kLCw7CisJCX0gZWxzZSB7CisJCQkkYWN0aW9uICB8fD0gImJsb2JfcGxhaW4iOworCQl9CisJCSRoYXNoX2Jhc2UgfHw9IHZhbGlkYXRlX3JlZm5hbWUoJHJlZm5hbWUpOworCQkkZmlsZV9uYW1lIHx8PSB2YWxpZGF0ZV9wYXRobmFtZSgkcGF0aG5hbWUpOworCX0gZWxzaWYgKGRlZmluZWQgJHJlZm5hbWUpIHsKKwkJIyB3ZSBnb3QgInByb2plY3QuZ2l0L2JyYW5jaCIKKwkJJGFjdGlvbiB8fD0gInNob3J0bG9nIjsKKwkJJGhhc2ggICB8fD0gdmFsaWRhdGVfcmVmbmFtZSgkcmVmbmFtZSk7CisJfQorfQorZXZhbHVhdGVfcGF0aF9pbmZvKCk7CisKKyMgcGF0aCB0byB0aGUgY3VycmVudCBnaXQgcmVwb3NpdG9yeQorb3VyICRnaXRfZGlyOworJGdpdF9kaXIgPSAiJHByb2plY3Ryb290LyRwcm9qZWN0IiBpZiAkcHJvamVjdDsKKworIyBkaXNwYXRjaAorbXkgJWFjdGlvbnMgPSAoCisJImJsYW1lIiA9PiBcJmdpdF9ibGFtZTIsCisJImJsb2JkaWZmIiA9PiBcJmdpdF9ibG9iZGlmZiwKKwkiYmxvYmRpZmZfcGxhaW4iID0+IFwmZ2l0X2Jsb2JkaWZmX3BsYWluLAorCSJibG9iIiA9PiBcJmdpdF9ibG9iLAorCSJibG9iX3BsYWluIiA9PiBcJmdpdF9ibG9iX3BsYWluLAorCSJjb21taXRkaWZmIiA9PiBcJmdpdF9jb21taXRkaWZmLAorCSJjb21taXRkaWZmX3BsYWluIiA9PiBcJmdpdF9jb21taXRkaWZmX3BsYWluLAorCSJjb21taXQiID0+IFwmZ2l0X2NvbW1pdCwKKwkiZm9ya3MiID0+IFwmZ2l0X2ZvcmtzLAorCSJoZWFkcyIgPT4gXCZnaXRfaGVhZHMsCisJImhpc3RvcnkiID0+IFwmZ2l0X2hpc3RvcnksCisJImxvZyIgPT4gXCZnaXRfbG9nLAorCSJyc3MiID0+IFwmZ2l0X3JzcywKKwkiYXRvbSIgPT4gXCZnaXRfYXRvbSwKKwkic2VhcmNoIiA9PiBcJmdpdF9zZWFyY2gsCisJInNlYXJjaF9oZWxwIiA9PiBcJmdpdF9zZWFyY2hfaGVscCwKKwkic2hvcnRsb2ciID0+IFwmZ2l0X3Nob3J0bG9nLAorCSJzdW1tYXJ5IiA9PiBcJmdpdF9zdW1tYXJ5LAorCSJ0YWciID0+IFwmZ2l0X3RhZywKKwkidGFncyIgPT4gXCZnaXRfdGFncywKKwkidHJlZSIgPT4gXCZnaXRfdHJlZSwKKwkic25hcHNob3QiID0+IFwmZ2l0X3NuYXBzaG90LAorCSJvYmplY3QiID0+IFwmZ2l0X29iamVjdCwKKwkjIHRob3NlIGJlbG93IGRvbid0IG5lZWQgJHByb2plY3QKKwkib3BtbCIgPT4gXCZnaXRfb3BtbCwKKwkicHJvamVjdF9saXN0IiA9PiBcJmdpdF9wcm9qZWN0X2xpc3QsCisJInByb2plY3RfaW5kZXgiID0+IFwmZ2l0X3Byb2plY3RfaW5kZXgsCispOworCitpZiAoIWRlZmluZWQgJGFjdGlvbikgeworCWlmIChkZWZpbmVkICRoYXNoKSB7CisJCSRhY3Rpb24gPSBnaXRfZ2V0X3R5cGUoJGhhc2gpOworCX0gZWxzaWYgKGRlZmluZWQgJGhhc2hfYmFzZSAmJiBkZWZpbmVkICRmaWxlX25hbWUpIHsKKwkJJGFjdGlvbiA9IGdpdF9nZXRfdHlwZSgiJGhhc2hfYmFzZTokZmlsZV9uYW1lIik7CisJfSBlbHNpZiAoZGVmaW5lZCAkcHJvamVjdCkgeworCQkkYWN0aW9uID0gJ3N1bW1hcnknOworCX0gZWxzZSB7CisJCSRhY3Rpb24gPSAncHJvamVjdF9saXN0JzsKKwl9Cit9CitpZiAoIWRlZmluZWQoJGFjdGlvbnN7JGFjdGlvbn0pKSB7CisJZGllX2Vycm9yKHVuZGVmLCAiVW5rbm93biBhY3Rpb24iKTsKK30KK2lmICgkYWN0aW9uICF+IG0vXihvcG1sfHByb2plY3RfbGlzdHxwcm9qZWN0X2luZGV4KSQvICYmCisgICAgISRwcm9qZWN0KSB7CisJZGllX2Vycm9yKHVuZGVmLCAiUHJvamVjdCBuZWVkZWQiKTsKK30KKyRhY3Rpb25zeyRhY3Rpb259LT4oKTsKK2V4aXQ7CisKKyMjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMjIGFjdGlvbiBsaW5rcworCitzdWIgaHJlZiglKSB7CisJbXkgJXBhcmFtcyA9IEBfOworCSMgZGVmYXVsdCBpcyB0byB1c2UgLWFic29sdXRlIHVybCgpIGkuZS4gJG15X3VyaQorCW15ICRocmVmID0gJHBhcmFtc3stZnVsbH0gPyAkbXlfdXJsIDogJG15X3VyaTsKKworCSMgWFhYOiBXYXJuaW5nOiBJZiB5b3UgdG91Y2ggdGhpcywgY2hlY2sgdGhlIHNlYXJjaCBmb3JtIGZvciB1cGRhdGluZywKKwkjIHRvby4KKworCW15IEBtYXBwaW5nID0gKAorCQlwcm9qZWN0ID0+ICJwIiwKKwkJYWN0aW9uID0+ICJhIiwKKwkJZmlsZV9uYW1lID0+ICJmIiwKKwkJZmlsZV9wYXJlbnQgPT4gImZwIiwKKwkJaGFzaCA9PiAiaCIsCisJCWhhc2hfcGFyZW50ID0+ICJocCIsCisJCWhhc2hfYmFzZSA9PiAiaGIiLAorCQloYXNoX3BhcmVudF9iYXNlID0+ICJocGIiLAorCQlwYWdlID0+ICJwZyIsCisJCW9yZGVyID0+ICJvIiwKKwkJc2VhcmNodGV4dCA9PiAicyIsCisJCXNlYXJjaHR5cGUgPT4gInN0IiwKKwkJc25hcHNob3RfZm9ybWF0ID0+ICJzZiIsCisJCWV4dHJhX29wdGlvbnMgPT4gIm9wdCIsCisJCXNlYXJjaF91c2VfcmVnZXhwID0+ICJzciIsCisJKTsKKwlteSAlbWFwcGluZyA9IEBtYXBwaW5nOworCisJJHBhcmFtc3sncHJvamVjdCd9ID0gJHByb2plY3QgdW5sZXNzIGV4aXN0cyAkcGFyYW1zeydwcm9qZWN0J307CisKKwlpZiAoJHBhcmFtc3stcmVwbGF5fSkgeworCQl3aGlsZSAobXkgKCRuYW1lLCAkc3ltYm9sKSA9IGVhY2ggJW1hcHBpbmcpIHsKKwkJCWlmICghZXhpc3RzICRwYXJhbXN7JG5hbWV9KSB7CisJCQkJIyB0byBhbGxvdyBmb3IgbXVsdGl2YWx1ZWQgcGFyYW1zIHdlIHVzZSBhcnJheXJlZiBmb3JtCisJCQkJJHBhcmFtc3skbmFtZX0gPSBbICRjZ2ktPnBhcmFtKCRzeW1ib2wpIF07CisJCQl9CisJCX0KKwl9CisKKwlteSAoJHVzZV9wYXRoaW5mbykgPSBnaXR3ZWJfY2hlY2tfZmVhdHVyZSgncGF0aGluZm8nKTsKKwlpZiAoJHVzZV9wYXRoaW5mbykgeworCQkjIHVzZSBQQVRIX0lORk8gZm9yIHByb2plY3QgbmFtZQorCQkkaHJlZiAuPSAiLyRwYXJhbXN7J3Byb2plY3QnfSIgaWYgZGVmaW5lZCAkcGFyYW1zeydwcm9qZWN0J307CisJCWRlbGV0ZSAkcGFyYW1zeydwcm9qZWN0J307CisKKwkJIyBTdW1tYXJ5IGp1c3QgdXNlcyB0aGUgcHJvamVjdCBwYXRoIFVSTAorCQlpZiAoZGVmaW5lZCAkcGFyYW1zeydhY3Rpb24nfSAmJiAkcGFyYW1zeydhY3Rpb24nfSBlcSAnc3VtbWFyeScpIHsKKwkJCWRlbGV0ZSAkcGFyYW1zeydhY3Rpb24nfTsKKwkJfQorCX0KKworCSMgbm93IGVuY29kZSB0aGUgcGFyYW1ldGVycyBleHBsaWNpdGx5CisJbXkgQHJlc3VsdCA9ICgpOworCWZvciAobXkgJGkgPSAwOyAkaSA8IEBtYXBwaW5nOyAkaSArPSAyKSB7CisJCW15ICgkbmFtZSwgJHN5bWJvbCkgPSAoJG1hcHBpbmdbJGldLCAkbWFwcGluZ1skaSsxXSk7CisJCWlmIChkZWZpbmVkICRwYXJhbXN7JG5hbWV9KSB7CisJCQlpZiAocmVmKCRwYXJhbXN7JG5hbWV9KSBlcSAiQVJSQVkiKSB7CisJCQkJZm9yZWFjaCBteSAkcGFyIChAeyRwYXJhbXN7JG5hbWV9fSkgeworCQkJCQlwdXNoIEByZXN1bHQsICRzeW1ib2wgLiAiPSIgLiBlc2NfcGFyYW0oJHBhcik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlwdXNoIEByZXN1bHQsICRzeW1ib2wgLiAiPSIgLiBlc2NfcGFyYW0oJHBhcmFtc3skbmFtZX0pOworCQkJfQorCQl9CisJfQorCSRocmVmIC49ICI/IiAuIGpvaW4oJzsnLCBAcmVzdWx0KSBpZiBzY2FsYXIgQHJlc3VsdDsKKworCXJldHVybiAkaHJlZjsKK30KKworCisjIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIyB2YWxpZGF0aW9uLCBxdW90aW5nL3VucXVvdGluZyBhbmQgZXNjYXBpbmcKKworc3ViIHZhbGlkYXRlX3BhdGhuYW1lIHsKKwlteSAkaW5wdXQgPSBzaGlmdCB8fCByZXR1cm4gdW5kZWY7CisKKwkjIG5vICcuJyBvciAnLi4nIGFzIGVsZW1lbnRzIG9mIHBhdGgsIGkuZS4gbm8gJy4nIG5vciAnLi4nCisJIyBhdCB0aGUgYmVnaW5uaW5nLCBhdCB0aGUgZW5kLCBhbmQgYmV0d2VlbiBzbGFzaGVzLgorCSMgYWxzbyB0aGlzIGNhdGNoZXMgZG91YmxlZCBzbGFzaGVzCisJaWYgKCRpbnB1dCA9fiBtIShefC8pKHxcLnxcLlwuKSgvfCQpISkgeworCQlyZXR1cm4gdW5kZWY7CisJfQorCSMgbm8gbnVsbCBjaGFyYWN0ZXJzCisJaWYgKCRpbnB1dCA9fiBtIVwwISkgeworCQlyZXR1cm4gdW5kZWY7CisJfQorCXJldHVybiAkaW5wdXQ7Cit9CisKK3N1YiB2YWxpZGF0ZV9yZWZuYW1lIHsKKwlteSAkaW5wdXQgPSBzaGlmdCB8fCByZXR1cm4gdW5kZWY7CisKKwkjIHRleHR1YWwgaGFzaGVzIGFyZSBPLksuCisJaWYgKCRpbnB1dCA9fiBtL15bMC05YS1mQS1GXXs0MH0kLykgeworCQlyZXR1cm4gJGlucHV0OworCX0KKwkjIGl0IG11c3QgYmUgY29ycmVjdCBwYXRobmFtZQorCSRpbnB1dCA9IHZhbGlkYXRlX3BhdGhuYW1lKCRpbnB1dCkKKwkJb3IgcmV0dXJuIHVuZGVmOworCSMgcmVzdHJpY3Rpb25zIG9uIHJlZiBuYW1lIGFjY29yZGluZyB0byBnaXQtY2hlY2stcmVmLWZvcm1hdAorCWlmICgkaW5wdXQgPX4gbSEoL1wufFwuXC58W1wwMDAtXDA0MFwxNzcgfl46PypcW118LyQpISkgeworCQlyZXR1cm4gdW5kZWY7CisJfQorCXJldHVybiAkaW5wdXQ7Cit9CisKKyMgZGVjb2RlIHNlcXVlbmNlcyBvZiBvY3RldHMgaW4gdXRmOCBpbnRvIFBlcmwncyBpbnRlcm5hbCBmb3JtLAorIyB3aGljaCBpcyB1dGYtOCB3aXRoIHV0ZjggZmxhZyBzZXQgaWYgbmVlZGVkLiAgZ2l0d2ViIHdyaXRlcyBvdXQKKyMgaW4gdXRmLTggdGhhbmtzIHRvICJiaW5tb2RlIFNURE9VVCwgJzp1dGY4JyIgYXQgYmVnaW5uaW5nCitzdWIgdG9fdXRmOCB7CisJbXkgJHN0ciA9IHNoaWZ0OworCWlmICh1dGY4Ojp2YWxpZCgkc3RyKSkgeworCQl1dGY4OjpkZWNvZGUoJHN0cik7CisJCXJldHVybiAkc3RyOworCX0gZWxzZSB7CisJCXJldHVybiBkZWNvZGUoJGZhbGxiYWNrX2VuY29kaW5nLCAkc3RyLCBFbmNvZGU6OkZCX0RFRkFVTFQpOworCX0KK30KKworIyBxdW90ZSB1bnNhZmUgY2hhcnMsIGJ1dCBrZWVwIHRoZSBzbGFzaCwgZXZlbiB3aGVuIGl0J3Mgbm90CisjIGNvcnJlY3QsIGJ1dCBxdW90ZWQgc2xhc2hlcyBsb29rIHRvbyBob3JyaWJsZSBpbiBib29rbWFya3MKK3N1YiBlc2NfcGFyYW0geworCW15ICRzdHIgPSBzaGlmdDsKKwkkc3RyID1+IHMvKFteQS1aYS16MC05XC1fLn4oKVwvOkBdKS9zcHJpbnRmKCIlJSUwMlgiLCBvcmQoJDEpKS9lZzsKKwkkc3RyID1+IHMvXCsvJTJCL2c7CisJJHN0ciA9fiBzLyAvXCsvZzsKKwlyZXR1cm4gJHN0cjsKK30KKworIyBxdW90ZSB1bnNhZmUgY2hhcnMgaW4gd2hvbGUgVVJMLCBzbyBzb21lIGNoYXJhY3RycyBjYW5ub3QgYmUgcXVvdGVkCitzdWIgZXNjX3VybCB7CisJbXkgJHN0ciA9IHNoaWZ0OworCSRzdHIgPX4gcy8oW15BLVphLXowLTlcLV8ufigpO1wvOz86QCY9XSkvc3ByaW50ZigiJSUlMDJYIiwgb3JkKCQxKSkvZWc7CisJJHN0ciA9fiBzL1wrLyUyQi9nOworCSRzdHIgPX4gcy8gL1wrL2c7CisJcmV0dXJuICRzdHI7Cit9CisKKyMgcmVwbGFjZSBpbnZhbGlkIHV0ZjggY2hhcmFjdGVyIHdpdGggU1VCU1RJVFVUSU9OIHNlcXVlbmNlCitzdWIgZXNjX2h0bWwgKCQ7JSkgeworCW15ICRzdHIgPSBzaGlmdDsKKwlteSAlb3B0cyA9IEBfOworCisJJHN0ciA9IHRvX3V0ZjgoJHN0cik7CisJJHN0ciA9ICRjZ2ktPmVzY2FwZUhUTUwoJHN0cik7CisJaWYgKCRvcHRzeyctbmJzcCd9KSB7CisJCSRzdHIgPX4gcy8gLyZuYnNwOy9nOworCX0KKwkkc3RyID1+IHN8KFtbOmNudHJsOl1dKXwoKCQxIG5lICJcdCIpID8gcXVvdF9jZWMoJDEpIDogJDEpfGVnOworCXJldHVybiAkc3RyOworfQorCisjIHF1b3RlIGNvbnRyb2wgY2hhcmFjdGVycyBhbmQgZXNjYXBlIGZpbGVuYW1lIHRvIEhUTUwKK3N1YiBlc2NfcGF0aCB7CisJbXkgJHN0ciA9IHNoaWZ0OworCW15ICVvcHRzID0gQF87CisKKwkkc3RyID0gdG9fdXRmOCgkc3RyKTsKKwkkc3RyID0gJGNnaS0+ZXNjYXBlSFRNTCgkc3RyKTsKKwlpZiAoJG9wdHN7Jy1uYnNwJ30pIHsKKwkJJHN0ciA9fiBzLyAvJm5ic3A7L2c7CisJfQorCSRzdHIgPX4gc3woW1s6Y250cmw6XV0pfHF1b3RfY2VjKCQxKXxlZzsKKwlyZXR1cm4gJHN0cjsKK30KKworIyBNYWtlIGNvbnRyb2wgY2hhcmFjdGVycyAicHJpbnRhYmxlIiwgdXNpbmcgY2hhcmFjdGVyIGVzY2FwZSBjb2RlcyAoQ0VDKQorc3ViIHF1b3RfY2VjIHsKKwlteSAkY250cmwgPSBzaGlmdDsKKwlteSAlb3B0cyA9IEBfOworCW15ICVlcyA9ICggIyBjaGFyYWN0ZXIgZXNjYXBlIGNvZGVzLCBha2EgZXNjYXBlIHNlcXVlbmNlcworCQkiXHQiID0+ICdcdCcsICAgIyB0YWIgICAgICAgICAgICAoSFQpCisJCSJcbiIgPT4gJ1xuJywgICAjIGxpbmUgZmVlZCAgICAgIChMRikKKwkJIlxyIiA9PiAnXHInLCAgICMgY2FycmlnZSByZXR1cm4gKENSKQorCQkiXGYiID0+ICdcZicsICAgIyBmb3JtIGZlZWQgICAgICAoRkYpCisJCSJcYiIgPT4gJ1xiJywgICAjIGJhY2tzcGFjZSAgICAgIChCUykKKwkJIlxhIiA9PiAnXGEnLCAgICMgYWxhcm0gKGJlbGwpICAgKEJFTCkKKwkJIlxlIiA9PiAnXGUnLCAgICMgZXNjYXBlICAgICAgICAgKEVTQykKKwkJIlwwMTMiID0+ICdcdicsICMgdmVydGljYWwgdGFiICAgKFZUKQorCQkiXDAwMCIgPT4gJ1wwJywgIyBudWwgY2hhcmFjdGVyICAoTlVMKQorCSk7CisJbXkgJGNociA9ICggKGV4aXN0cyAkZXN7JGNudHJsfSkKKwkJICAgID8gJGVzeyRjbnRybH0KKwkJICAgIDogc3ByaW50ZignXCUwM28nLCBvcmQoJGNudHJsKSkgKTsKKwlpZiAoJG9wdHN7LW5vaHRtbH0pIHsKKwkJcmV0dXJuICRjaHI7CisJfSBlbHNlIHsKKwkJcmV0dXJuICI8c3BhbiBjbGFzcz1cImNudHJsXCI+JGNocjwvc3Bhbj4iOworCX0KK30KKworIyBBbHRlcm5hdGl2ZWx5IHVzZSB1bmljb2RlIGNvbnRyb2wgcGljdHVyZXMgY29kZXBvaW50cywKKyMgVW5pY29kZSAicHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIiAoUFIpCitzdWIgcXVvdF91cHIgeworCW15ICRjbnRybCA9IHNoaWZ0OworCW15ICVvcHRzID0gQF87CisKKwlteSAkY2hyID0gc3ByaW50ZignJiMlMDRkOycsIDB4MjQwMCtvcmQoJGNudHJsKSk7CisJaWYgKCRvcHRzey1ub2h0bWx9KSB7CisJCXJldHVybiAkY2hyOworCX0gZWxzZSB7CisJCXJldHVybiAiPHNwYW4gY2xhc3M9XCJjbnRybFwiPiRjaHI8L3NwYW4+IjsKKwl9Cit9CisKKyMgZ2l0IG1heSByZXR1cm4gcXVvdGVkIGFuZCBlc2NhcGVkIGZpbGVuYW1lcworc3ViIHVucXVvdGUgeworCW15ICRzdHIgPSBzaGlmdDsKKworCXN1YiB1bnEgeworCQlteSAkc2VxID0gc2hpZnQ7CisJCW15ICVlcyA9ICggIyBjaGFyYWN0ZXIgZXNjYXBlIGNvZGVzLCBha2EgZXNjYXBlIHNlcXVlbmNlcworCQkJJ3QnID0+ICJcdCIsICAgIyB0YWIgICAgICAgICAgICAoSFQsIFRBQikKKwkJCSduJyA9PiAiXG4iLCAgICMgbmV3bGluZSAgICAgICAgKE5MKQorCQkJJ3InID0+ICJcciIsICAgIyByZXR1cm4gICAgICAgICAoQ1IpCisJCQknZicgPT4gIlxmIiwgICAjIGZvcm0gZmVlZCAgICAgIChGRikKKwkJCSdiJyA9PiAiXGIiLCAgICMgYmFja3NwYWNlICAgICAgKEJTKQorCQkJJ2EnID0+ICJcYSIsICAgIyBhbGFybSAoYmVsbCkgICAoQkVMKQorCQkJJ2UnID0+ICJcZSIsICAgIyBlc2NhcGUgICAgICAgICAoRVNDKQorCQkJJ3YnID0+ICJcMDEzIiwgIyB2ZXJ0aWNhbCB0YWIgICAoVlQpCisJCSk7CisKKwkJaWYgKCRzZXEgPX4gbS9eWzAtN117MSwzfSQvKSB7CisJCQkjIG9jdGFsIGNoYXIgc2VxdWVuY2UKKwkJCXJldHVybiBjaHIob2N0KCRzZXEpKTsKKwkJfSBlbHNpZiAoZXhpc3RzICRlc3skc2VxfSkgeworCQkJIyBDIGVzY2FwZSBzZXF1ZW5jZSwgYWthIGNoYXJhY3RlciBlc2NhcGUgY29kZQorCQkJcmV0dXJuICRlc3skc2VxfTsKKwkJfQorCQkjIHF1b3RlZCBvcmRpbmFyeSBjaGFyYWN0ZXIKKwkJcmV0dXJuICRzZXE7CisJfQorCisJaWYgKCRzdHIgPX4gbS9eIiguKikiJC8pIHsKKwkJIyBuZWVkcyB1bnF1b3RpbmcKKwkJJHN0ciA9ICQxOworCQkkc3RyID1+IHMvXFwoW14wLTddfFswLTddezEsM30pL3VucSgkMSkvZWc7CisJfQorCXJldHVybiAkc3RyOworfQorCisjIGVzY2FwZSB0YWJzIChjb252ZXJ0IHRhYnMgdG8gc3BhY2VzKQorc3ViIHVudGFiaWZ5IHsKKwlteSAkbGluZSA9IHNoaWZ0OworCisJd2hpbGUgKChteSAkcG9zID0gaW5kZXgoJGxpbmUsICJcdCIpKSAhPSAtMSkgeworCQlpZiAobXkgJGNvdW50ID0gKDggLSAoJHBvcyAlIDgpKSkgeworCQkJbXkgJHNwYWNlcyA9ICcgJyB4ICRjb3VudDsKKwkJCSRsaW5lID1+IHMvXHQvJHNwYWNlcy87CisJCX0KKwl9CisKKwlyZXR1cm4gJGxpbmU7Cit9CisKK3N1YiBwcm9qZWN0X2luX2xpc3QgeworCW15ICRwcm9qZWN0ID0gc2hpZnQ7CisJbXkgQGxpc3QgPSBnaXRfZ2V0X3Byb2plY3RzX2xpc3QoKTsKKwlyZXR1cm4gQGxpc3QgJiYgc2NhbGFyKGdyZXAgeyAkXy0+eydwYXRoJ30gZXEgJHByb2plY3QgfSBAbGlzdCk7Cit9CisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIEhUTUwgYXdhcmUgc3RyaW5nIG1hbmlwdWxhdGlvbgorCisjIFRyeSB0byBjaG9wIGdpdmVuIHN0cmluZyBvbiBhIHdvcmQgYm91bmRhcnkgYmV0d2VlbiBwb3NpdGlvbgorIyAkbGVuIGFuZCAkbGVuKyRhZGRfbGVuLiBJZiB0aGVyZSBpcyBubyB3b3JkIGJvdW5kYXJ5IHRoZXJlLAorIyBjaG9wIGF0ICRsZW4rJGFkZF9sZW4uIERvIG5vdCBjaG9wIGlmIGNob3BwZWQgcGFydCBwbHVzIGVsbGlwc2lzCisjIChtYXJraW5nIGNob3BwZWQgcGFydCkgd291bGQgYmUgbG9uZ2VyIHRoYW4gZ2l2ZW4gc3RyaW5nLgorc3ViIGNob3Bfc3RyIHsKKwlteSAkc3RyID0gc2hpZnQ7CisJbXkgJGxlbiA9IHNoaWZ0OworCW15ICRhZGRfbGVuID0gc2hpZnQgfHwgMTA7CisJbXkgJHdoZXJlID0gc2hpZnQgfHwgJ3JpZ2h0JzsgIyAnbGVmdCcgfCAnY2VudGVyJyB8ICdyaWdodCcKKworCSMgYWxsb3cgb25seSAkbGVuIGNoYXJzLCBidXQgZG9uJ3QgY3V0IGEgd29yZCBpZiBpdCB3b3VsZCBmaXQgaW4gJGFkZF9sZW4KKwkjIGlmIGl0IGRvZXNuJ3QgZml0LCBjdXQgaXQgaWYgaXQncyBzdGlsbCBsb25nZXIgdGhhbiB0aGUgZG90cyB3ZSB3b3VsZCBhZGQKKwkjIHJlbW92ZSBjaG9wcGVkIGNoYXJhY3RlciBlbnRpdGllcyBlbnRpcmVseQorCisJIyB3aGVuIGNob3BwaW5nIGluIHRoZSBtaWRkbGUsIGRpc3RyaWJ1dGUgJGxlbiBpbnRvIGxlZnQgYW5kIHJpZ2h0IHBhcnQKKwkjIHJldHVybiBlYXJseSBpZiBjaG9wcGluZyB3b3VsZG4ndCBtYWtlIHN0cmluZyBzaG9ydGVyCisJaWYgKCR3aGVyZSBlcSAnY2VudGVyJykgeworCQlyZXR1cm4gJHN0ciBpZiAoJGxlbiArIDUgPj0gbGVuZ3RoKCRzdHIpKTsgIyBmaWxsZXIgaXMgbGVuZ3RoIDUKKwkJJGxlbiA9IGludCgkbGVuLzIpOworCX0gZWxzZSB7CisJCXJldHVybiAkc3RyIGlmICgkbGVuICsgNCA+PSBsZW5ndGgoJHN0cikpOyAjIGZpbGxlciBpcyBsZW5ndGggNAorCX0KKworCSMgcmVnZXhwczogZW5kaW5nIGFuZCBiZWdpbm5pbmcgd2l0aCB3b3JkIHBhcnQgdXAgdG8gJGFkZF9sZW4KKwlteSAkZW5kcmUgPSBxci8ueyRsZW59XHd7MCwkYWRkX2xlbn0vOworCW15ICRiZWdyZSA9IHFyL1x3ezAsJGFkZF9sZW59LnskbGVufS87CisKKwlpZiAoJHdoZXJlIGVxICdsZWZ0JykgeworCQkkc3RyID1+IG0vXiguKj8pKCRiZWdyZSkkLzsKKwkJbXkgKCRsZWFkLCAkYm9keSkgPSAoJDEsICQyKTsKKwkJaWYgKGxlbmd0aCgkbGVhZCkgPiA0KSB7CisJCQkkYm9keSA9fiBzL15bXjtdKjsvLyBpZiAoJGxlYWQgPX4gbS8mW147XSokLyk7CisJCQkkbGVhZCA9ICIgLi4uIjsKKwkJfQorCQlyZXR1cm4gIiRsZWFkJGJvZHkiOworCisJfSBlbHNpZiAoJHdoZXJlIGVxICdjZW50ZXInKSB7CisJCSRzdHIgPX4gbS9eKCRlbmRyZSkoLiopJC87CisJCW15ICgkbGVmdCwgJHN0cikgID0gKCQxLCAkMik7CisJCSRzdHIgPX4gbS9eKC4qPykoJGJlZ3JlKSQvOworCQlteSAoJG1pZCwgJHJpZ2h0KSA9ICgkMSwgJDIpOworCQlpZiAobGVuZ3RoKCRtaWQpID4gNSkgeworCQkJJGxlZnQgID1+IHMvJlteO10qJC8vOworCQkJJHJpZ2h0ID1+IHMvXlteO10qOy8vIGlmICgkbWlkID1+IG0vJlteO10qJC8pOworCQkJJG1pZCA9ICIgLi4uICI7CisJCX0KKwkJcmV0dXJuICIkbGVmdCRtaWQkcmlnaHQiOworCisJfSBlbHNlIHsKKwkJJHN0ciA9fiBtL14oJGVuZHJlKSguKikkLzsKKwkJbXkgJGJvZHkgPSAkMTsKKwkJbXkgJHRhaWwgPSAkMjsKKwkJaWYgKGxlbmd0aCgkdGFpbCkgPiA0KSB7CisJCQkkYm9keSA9fiBzLyZbXjtdKiQvLzsKKwkJCSR0YWlsID0gIi4uLiAiOworCQl9CisJCXJldHVybiAiJGJvZHkkdGFpbCI7CisJfQorfQorCisjIHRha2VzIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyBjaG9wX3N0ciwgYnV0IGFsc28gd3JhcHMgYSA8c3Bhbj4gYXJvdW5kIHRoZQorIyByZXN1bHQgd2l0aCBhIHRpdGxlIGF0dHJpYnV0ZSBpZiBpdCBkb2VzIGdldCBjaG9wcGVkLiBBZGRpdGlvbmFsbHksIHRoZQorIyBzdHJpbmcgaXMgSFRNTC1lc2NhcGVkLgorc3ViIGNob3BfYW5kX2VzY2FwZV9zdHIgeworCW15ICgkc3RyKSA9IEBfOworCisJbXkgJGNob3BwZWQgPSBjaG9wX3N0cihAXyk7CisJaWYgKCRjaG9wcGVkIGVxICRzdHIpIHsKKwkJcmV0dXJuIGVzY19odG1sKCRjaG9wcGVkKTsKKwl9IGVsc2UgeworCQkkc3RyID1+IHMvKFtbOmNudHJsOl1dKS8/L2c7CisJCXJldHVybiAkY2dpLT5zcGFuKHstdGl0bGU9PiRzdHJ9LCBlc2NfaHRtbCgkY2hvcHBlZCkpOworCX0KK30KKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgZnVuY3Rpb25zIHJldHVybmluZyBzaG9ydCBzdHJpbmdzCisKKyMgQ1NTIGNsYXNzIGZvciBnaXZlbiBhZ2UgdmFsdWUgKGluIHNlY29uZHMpCitzdWIgYWdlX2NsYXNzIHsKKwlteSAkYWdlID0gc2hpZnQ7CisKKwlpZiAoIWRlZmluZWQgJGFnZSkgeworCQlyZXR1cm4gIm5vYWdlIjsKKwl9IGVsc2lmICgkYWdlIDwgNjAqNjAqMikgeworCQlyZXR1cm4gImFnZTAiOworCX0gZWxzaWYgKCRhZ2UgPCA2MCo2MCoyNCoyKSB7CisJCXJldHVybiAiYWdlMSI7CisJfSBlbHNlIHsKKwkJcmV0dXJuICJhZ2UyIjsKKwl9Cit9CisKKyMgY29udmVydCBhZ2UgaW4gc2Vjb25kcyB0byAibm4gdW5pdHMgYWdvIiBzdHJpbmcKK3N1YiBhZ2Vfc3RyaW5nIHsKKwlteSAkYWdlID0gc2hpZnQ7CisJbXkgJGFnZV9zdHI7CisKKwlpZiAoJGFnZSA+IDYwKjYwKjI0KjM2NSoyKSB7CisJCSRhZ2Vfc3RyID0gKGludCAkYWdlLzYwLzYwLzI0LzM2NSk7CisJCSRhZ2Vfc3RyIC49ICIgeWVhcnMgYWdvIjsKKwl9IGVsc2lmICgkYWdlID4gNjAqNjAqMjQqKDM2NS8xMikqMikgeworCQkkYWdlX3N0ciA9IGludCAkYWdlLzYwLzYwLzI0LygzNjUvMTIpOworCQkkYWdlX3N0ciAuPSAiIG1vbnRocyBhZ28iOworCX0gZWxzaWYgKCRhZ2UgPiA2MCo2MCoyNCo3KjIpIHsKKwkJJGFnZV9zdHIgPSBpbnQgJGFnZS82MC82MC8yNC83OworCQkkYWdlX3N0ciAuPSAiIHdlZWtzIGFnbyI7CisJfSBlbHNpZiAoJGFnZSA+IDYwKjYwKjI0KjIpIHsKKwkJJGFnZV9zdHIgPSBpbnQgJGFnZS82MC82MC8yNDsKKwkJJGFnZV9zdHIgLj0gIiBkYXlzIGFnbyI7CisJfSBlbHNpZiAoJGFnZSA+IDYwKjYwKjIpIHsKKwkJJGFnZV9zdHIgPSBpbnQgJGFnZS82MC82MDsKKwkJJGFnZV9zdHIgLj0gIiBob3VycyBhZ28iOworCX0gZWxzaWYgKCRhZ2UgPiA2MCoyKSB7CisJCSRhZ2Vfc3RyID0gaW50ICRhZ2UvNjA7CisJCSRhZ2Vfc3RyIC49ICIgbWluIGFnbyI7CisJfSBlbHNpZiAoJGFnZSA+IDIpIHsKKwkJJGFnZV9zdHIgPSBpbnQgJGFnZTsKKwkJJGFnZV9zdHIgLj0gIiBzZWMgYWdvIjsKKwl9IGVsc2UgeworCQkkYWdlX3N0ciAuPSAiIHJpZ2h0IG5vdyI7CisJfQorCXJldHVybiAkYWdlX3N0cjsKK30KKwordXNlIGNvbnN0YW50IHsKKwlTX0lGSU5WQUxJRCA9PiAwMDMwMDAwLAorCVNfSUZHSVRMSU5LID0+IDAxNjAwMDAsCit9OworCisjIHN1Ym1vZHVsZS9zdWJwcm9qZWN0LCBhIGNvbW1pdCBvYmplY3QgcmVmZXJlbmNlCitzdWIgU19JU0dJVExJTksoJCkgeworCW15ICRtb2RlID0gc2hpZnQ7CisKKwlyZXR1cm4gKCgkbW9kZSAmIFNfSUZNVCkgPT0gU19JRkdJVExJTkspCit9CisKKyMgY29udmVydCBmaWxlIG1vZGUgaW4gb2N0YWwgdG8gc3ltYm9saWMgZmlsZSBtb2RlIHN0cmluZworc3ViIG1vZGVfc3RyIHsKKwlteSAkbW9kZSA9IG9jdCBzaGlmdDsKKworCWlmIChTX0lTR0lUTElOSygkbW9kZSkpIHsKKwkJcmV0dXJuICdtLS0tLS0tLS0tJzsKKwl9IGVsc2lmIChTX0lTRElSKCRtb2RlICYgU19JRk1UKSkgeworCQlyZXR1cm4gJ2Ryd3hyLXhyLXgnOworCX0gZWxzaWYgKFNfSVNMTksoJG1vZGUpKSB7CisJCXJldHVybiAnbHJ3eHJ3eHJ3eCc7CisJfSBlbHNpZiAoU19JU1JFRygkbW9kZSkpIHsKKwkJIyBnaXQgY2FyZXMgb25seSBhYm91dCB0aGUgZXhlY3V0YWJsZSBiaXQKKwkJaWYgKCRtb2RlICYgU19JWFVTUikgeworCQkJcmV0dXJuICctcnd4ci14ci14JzsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAnLXJ3LXItLXItLSc7CisJCX07CisJfSBlbHNlIHsKKwkJcmV0dXJuICctLS0tLS0tLS0tJzsKKwl9Cit9CisKKyMgY29udmVydCBmaWxlIG1vZGUgaW4gb2N0YWwgdG8gZmlsZSB0eXBlIHN0cmluZworc3ViIGZpbGVfdHlwZSB7CisJbXkgJG1vZGUgPSBzaGlmdDsKKworCWlmICgkbW9kZSAhfiBtL15bMC03XSskLykgeworCQlyZXR1cm4gJG1vZGU7CisJfSBlbHNlIHsKKwkJJG1vZGUgPSBvY3QgJG1vZGU7CisJfQorCisJaWYgKFNfSVNHSVRMSU5LKCRtb2RlKSkgeworCQlyZXR1cm4gInN1Ym1vZHVsZSI7CisJfSBlbHNpZiAoU19JU0RJUigkbW9kZSAmIFNfSUZNVCkpIHsKKwkJcmV0dXJuICJkaXJlY3RvcnkiOworCX0gZWxzaWYgKFNfSVNMTksoJG1vZGUpKSB7CisJCXJldHVybiAic3ltbGluayI7CisJfSBlbHNpZiAoU19JU1JFRygkbW9kZSkpIHsKKwkJcmV0dXJuICJmaWxlIjsKKwl9IGVsc2UgeworCQlyZXR1cm4gInVua25vd24iOworCX0KK30KKworIyBjb252ZXJ0IGZpbGUgbW9kZSBpbiBvY3RhbCB0byBmaWxlIHR5cGUgZGVzY3JpcHRpb24gc3RyaW5nCitzdWIgZmlsZV90eXBlX2xvbmcgeworCW15ICRtb2RlID0gc2hpZnQ7CisKKwlpZiAoJG1vZGUgIX4gbS9eWzAtN10rJC8pIHsKKwkJcmV0dXJuICRtb2RlOworCX0gZWxzZSB7CisJCSRtb2RlID0gb2N0ICRtb2RlOworCX0KKworCWlmIChTX0lTR0lUTElOSygkbW9kZSkpIHsKKwkJcmV0dXJuICJzdWJtb2R1bGUiOworCX0gZWxzaWYgKFNfSVNESVIoJG1vZGUgJiBTX0lGTVQpKSB7CisJCXJldHVybiAiZGlyZWN0b3J5IjsKKwl9IGVsc2lmIChTX0lTTE5LKCRtb2RlKSkgeworCQlyZXR1cm4gInN5bWxpbmsiOworCX0gZWxzaWYgKFNfSVNSRUcoJG1vZGUpKSB7CisJCWlmICgkbW9kZSAmIFNfSVhVU1IpIHsKKwkJCXJldHVybiAiZXhlY3V0YWJsZSI7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gImZpbGUiOworCQl9OworCX0gZWxzZSB7CisJCXJldHVybiAidW5rbm93biI7CisJfQorfQorCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIGZ1bmN0aW9ucyByZXR1cm5pbmcgc2hvcnQgSFRNTCBmcmFnbWVudHMsIG9yIHRyYW5zZm9ybWluZyBIVE1MIGZyYWdtZW50cworIyMgd2hpY2ggZG9uJ3QgYmVsb25nIHRvIG90aGVyIHNlY3Rpb25zCisKKyMgZm9ybWF0IGxpbmUgb2YgY29tbWl0IG1lc3NhZ2UuCitzdWIgZm9ybWF0X2xvZ19saW5lX2h0bWwgeworCW15ICRsaW5lID0gc2hpZnQ7CisKKwkkbGluZSA9IGVzY19odG1sKCRsaW5lLCAtbmJzcD0+MSk7CisJaWYgKCRsaW5lID1+IG0vKFswLTlhLWZBLUZdezgsNDB9KS8pIHsKKwkJbXkgJGhhc2hfdGV4dCA9ICQxOworCQlteSAkbGluayA9CisJCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+Im9iamVjdCIsIGhhc2g9PiRoYXNoX3RleHQpLAorCQkJICAgICAgICAtY2xhc3MgPT4gInRleHQifSwgJGhhc2hfdGV4dCk7CisJCSRsaW5lID1+IHMvJGhhc2hfdGV4dC8kbGluay87CisJfQorCXJldHVybiAkbGluZTsKK30KKworIyBmb3JtYXQgbWFya2VyIG9mIHJlZnMgcG9pbnRpbmcgdG8gZ2l2ZW4gb2JqZWN0CitzdWIgZm9ybWF0X3JlZl9tYXJrZXIgeworCW15ICgkcmVmcywgJGlkKSA9IEBfOworCW15ICRtYXJrZXJzID0gJyc7CisKKwlpZiAoZGVmaW5lZCAkcmVmcy0+eyRpZH0pIHsKKwkJZm9yZWFjaCBteSAkcmVmIChAeyRyZWZzLT57JGlkfX0pIHsKKwkJCW15ICgkdHlwZSwgJG5hbWUpID0gcXcoKTsKKwkJCSMgZS5nLiB0YWdzL3YyLjYuMTEgb3IgaGVhZHMvbmV4dAorCQkJaWYgKCRyZWYgPX4gbSFeKC4qPylzPy8oLiopJCEpIHsKKwkJCQkkdHlwZSA9ICQxOworCQkJCSRuYW1lID0gJDI7CisJCQl9IGVsc2UgeworCQkJCSR0eXBlID0gInJlZiI7CisJCQkJJG5hbWUgPSAkcmVmOworCQkJfQorCisJCQkkbWFya2VycyAuPSAiIDxzcGFuIGNsYXNzPVwiJHR5cGVcIiB0aXRsZT1cIiRyZWZcIj4iIC4KKwkJCSAgICAgICAgICAgIGVzY19odG1sKCRuYW1lKSAuICI8L3NwYW4+IjsKKwkJfQorCX0KKworCWlmICgkbWFya2VycykgeworCQlyZXR1cm4gJyA8c3BhbiBjbGFzcz0icmVmcyI+Jy4gJG1hcmtlcnMgLiAnPC9zcGFuPic7CisJfSBlbHNlIHsKKwkJcmV0dXJuICIiOworCX0KK30KKworIyBmb3JtYXQsIHBlcmhhcHMgc2hvcnRlbmVkIGFuZCB3aXRoIG1hcmtlcnMsIHRpdGxlIGxpbmUKK3N1YiBmb3JtYXRfc3ViamVjdF9odG1sIHsKKwlteSAoJGxvbmcsICRzaG9ydCwgJGhyZWYsICRleHRyYSkgPSBAXzsKKwkkZXh0cmEgPSAnJyB1bmxlc3MgZGVmaW5lZCgkZXh0cmEpOworCisJaWYgKGxlbmd0aCgkc2hvcnQpIDwgbGVuZ3RoKCRsb25nKSkgeworCQlyZXR1cm4gJGNnaS0+YSh7LWhyZWYgPT4gJGhyZWYsIC1jbGFzcyA9PiAibGlzdCBzdWJqZWN0IiwKKwkJICAgICAgICAgICAgICAgIC10aXRsZSA9PiB0b191dGY4KCRsb25nKX0sCisJCSAgICAgICBlc2NfaHRtbCgkc2hvcnQpIC4gJGV4dHJhKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gJGNnaS0+YSh7LWhyZWYgPT4gJGhyZWYsIC1jbGFzcyA9PiAibGlzdCBzdWJqZWN0In0sCisJCSAgICAgICBlc2NfaHRtbCgkbG9uZykgIC4gJGV4dHJhKTsKKwl9Cit9CisKKyMgZm9ybWF0IGdpdCBkaWZmIGhlYWRlciBsaW5lLCBpLmUuICJkaWZmIC0tKGdpdHxjb21iaW5lZHxjYykgLi4uIgorc3ViIGZvcm1hdF9naXRfZGlmZl9oZWFkZXJfbGluZSB7CisJbXkgJGxpbmUgPSBzaGlmdDsKKwlteSAkZGlmZmluZm8gPSBzaGlmdDsKKwlteSAoJGZyb20sICR0bykgPSBAXzsKKworCWlmICgkZGlmZmluZm8tPnsnbnBhcmVudHMnfSkgeworCQkjIGNvbWJpbmVkIGRpZmYKKwkJJGxpbmUgPX4gcyFeKGRpZmYgKC4qPykgKSI/LiokISQxITsKKwkJaWYgKCR0by0+eydocmVmJ30pIHsKKwkJCSRsaW5lIC49ICRjZ2ktPmEoey1ocmVmID0+ICR0by0+eydocmVmJ30sIC1jbGFzcyA9PiAicGF0aCJ9LAorCQkJICAgICAgICAgICAgICAgICBlc2NfcGF0aCgkdG8tPnsnZmlsZSd9KSk7CisJCX0gZWxzZSB7ICMgZmlsZSB3YXMgZGVsZXRlZCAobm8gaHJlZikKKwkJCSRsaW5lIC49IGVzY19wYXRoKCR0by0+eydmaWxlJ30pOworCQl9CisJfSBlbHNlIHsKKwkJIyAib3JkaW5hcnkiIGRpZmYKKwkJJGxpbmUgPX4gcyFeKGRpZmYgKC4qPykgKSI/YS8uKiQhJDEhOworCQlpZiAoJGZyb20tPnsnaHJlZid9KSB7CisJCQkkbGluZSAuPSAkY2dpLT5hKHstaHJlZiA9PiAkZnJvbS0+eydocmVmJ30sIC1jbGFzcyA9PiAicGF0aCJ9LAorCQkJICAgICAgICAgICAgICAgICAnYS8nIC4gZXNjX3BhdGgoJGZyb20tPnsnZmlsZSd9KSk7CisJCX0gZWxzZSB7ICMgZmlsZSB3YXMgYWRkZWQgKG5vIGhyZWYpCisJCQkkbGluZSAuPSAnYS8nIC4gZXNjX3BhdGgoJGZyb20tPnsnZmlsZSd9KTsKKwkJfQorCQkkbGluZSAuPSAnICc7CisJCWlmICgkdG8tPnsnaHJlZid9KSB7CisJCQkkbGluZSAuPSAkY2dpLT5hKHstaHJlZiA9PiAkdG8tPnsnaHJlZid9LCAtY2xhc3MgPT4gInBhdGgifSwKKwkJCSAgICAgICAgICAgICAgICAgJ2IvJyAuIGVzY19wYXRoKCR0by0+eydmaWxlJ30pKTsKKwkJfSBlbHNlIHsgIyBmaWxlIHdhcyBkZWxldGVkCisJCQkkbGluZSAuPSAnYi8nIC4gZXNjX3BhdGgoJHRvLT57J2ZpbGUnfSk7CisJCX0KKwl9CisKKwlyZXR1cm4gIjxkaXYgY2xhc3M9XCJkaWZmIGhlYWRlclwiPiRsaW5lPC9kaXY+XG4iOworfQorCisjIGZvcm1hdCBleHRlbmRlZCBkaWZmIGhlYWRlciBsaW5lLCBiZWZvcmUgcGF0Y2ggaXRzZWxmCitzdWIgZm9ybWF0X2V4dGVuZGVkX2RpZmZfaGVhZGVyX2xpbmUgeworCW15ICRsaW5lID0gc2hpZnQ7CisJbXkgJGRpZmZpbmZvID0gc2hpZnQ7CisJbXkgKCRmcm9tLCAkdG8pID0gQF87CisKKwkjIG1hdGNoIDxwYXRoPgorCWlmICgkbGluZSA9fiBzIV4oKGNvcHl8cmVuYW1lKSBmcm9tICkuKiQhJDEhICYmICRmcm9tLT57J2hyZWYnfSkgeworCQkkbGluZSAuPSAkY2dpLT5hKHstaHJlZj0+JGZyb20tPnsnaHJlZid9LCAtY2xhc3M9PiJwYXRoIn0sCisJCSAgICAgICAgICAgICAgICAgICAgICAgZXNjX3BhdGgoJGZyb20tPnsnZmlsZSd9KSk7CisJfQorCWlmICgkbGluZSA9fiBzIV4oKGNvcHl8cmVuYW1lKSB0byApLiokISQxISAmJiAkdG8tPnsnaHJlZid9KSB7CisJCSRsaW5lIC49ICRjZ2ktPmEoey1ocmVmPT4kdG8tPnsnaHJlZid9LCAtY2xhc3M9PiJwYXRoIn0sCisJCSAgICAgICAgICAgICAgICAgZXNjX3BhdGgoJHRvLT57J2ZpbGUnfSkpOworCX0KKwkjIG1hdGNoIHNpbmdsZSA8bW9kZT4KKwlpZiAoJGxpbmUgPX4gbS9ccyhcZHs2fSkkLykgeworCQkkbGluZSAuPSAnPHNwYW4gY2xhc3M9ImluZm8iPiAoJyAuCisJCSAgICAgICAgIGZpbGVfdHlwZV9sb25nKCQxKSAuCisJCSAgICAgICAgICcpPC9zcGFuPic7CisJfQorCSMgbWF0Y2ggPGhhc2g+CisJaWYgKCRsaW5lID1+IG0vXmluZGV4IFswLTlhLWZBLUZdezQwfSxbMC05YS1mQS1GXXs0MH0vKSB7CisJCSMgY2FuIG1hdGNoIG9ubHkgZm9yIGNvbWJpbmVkIGRpZmYKKwkJJGxpbmUgPSAnaW5kZXggJzsKKwkJZm9yIChteSAkaSA9IDA7ICRpIDwgJGRpZmZpbmZvLT57J25wYXJlbnRzJ307ICRpKyspIHsKKwkJCWlmICgkZnJvbS0+eydocmVmJ31bJGldKSB7CisJCQkJJGxpbmUgLj0gJGNnaS0+YSh7LWhyZWY9PiRmcm9tLT57J2hyZWYnfVskaV0sCisJCQkJICAgICAgICAgICAgICAgICAgLWNsYXNzPT4iaGFzaCJ9LAorCQkJCSAgICAgICAgICAgICAgICAgc3Vic3RyKCRkaWZmaW5mby0+eydmcm9tX2lkJ31bJGldLDAsNykpOworCQkJfSBlbHNlIHsKKwkJCQkkbGluZSAuPSAnMCcgeCA3OworCQkJfQorCQkJIyBzZXBhcmF0b3IKKwkJCSRsaW5lIC49ICcsJyBpZiAoJGkgPCAkZGlmZmluZm8tPnsnbnBhcmVudHMnfSAtIDEpOworCQl9CisJCSRsaW5lIC49ICcuLic7CisJCWlmICgkdG8tPnsnaHJlZid9KSB7CisJCQkkbGluZSAuPSAkY2dpLT5hKHstaHJlZj0+JHRvLT57J2hyZWYnfSwgLWNsYXNzPT4iaGFzaCJ9LAorCQkJICAgICAgICAgICAgICAgICBzdWJzdHIoJGRpZmZpbmZvLT57J3RvX2lkJ30sMCw3KSk7CisJCX0gZWxzZSB7CisJCQkkbGluZSAuPSAnMCcgeCA3OworCQl9CisKKwl9IGVsc2lmICgkbGluZSA9fiBtL15pbmRleCBbMC05YS1mQS1GXXs0MH0uLlswLTlhLWZBLUZdezQwfS8pIHsKKwkJIyBjYW4gbWF0Y2ggb25seSBmb3Igb3JkaW5hcnkgZGlmZgorCQlteSAoJGZyb21fbGluaywgJHRvX2xpbmspOworCQlpZiAoJGZyb20tPnsnaHJlZid9KSB7CisJCQkkZnJvbV9saW5rID0gJGNnaS0+YSh7LWhyZWY9PiRmcm9tLT57J2hyZWYnfSwgLWNsYXNzPT4iaGFzaCJ9LAorCQkJICAgICAgICAgICAgICAgICAgICAgc3Vic3RyKCRkaWZmaW5mby0+eydmcm9tX2lkJ30sMCw3KSk7CisJCX0gZWxzZSB7CisJCQkkZnJvbV9saW5rID0gJzAnIHggNzsKKwkJfQorCQlpZiAoJHRvLT57J2hyZWYnfSkgeworCQkJJHRvX2xpbmsgPSAkY2dpLT5hKHstaHJlZj0+JHRvLT57J2hyZWYnfSwgLWNsYXNzPT4iaGFzaCJ9LAorCQkJICAgICAgICAgICAgICAgICAgIHN1YnN0cigkZGlmZmluZm8tPnsndG9faWQnfSwwLDcpKTsKKwkJfSBlbHNlIHsKKwkJCSR0b19saW5rID0gJzAnIHggNzsKKwkJfQorCQlteSAoJGZyb21faWQsICR0b19pZCkgPSAoJGRpZmZpbmZvLT57J2Zyb21faWQnfSwgJGRpZmZpbmZvLT57J3RvX2lkJ30pOworCQkkbGluZSA9fiBzISRmcm9tX2lkXC5cLiR0b19pZCEkZnJvbV9saW5rLi4kdG9fbGluayE7CisJfQorCisJcmV0dXJuICRsaW5lIC4gIjxici8+XG4iOworfQorCisjIGZvcm1hdCBmcm9tLWZpbGUvdG8tZmlsZSBkaWZmIGhlYWRlcgorc3ViIGZvcm1hdF9kaWZmX2Zyb21fdG9faGVhZGVyIHsKKwlteSAoJGZyb21fbGluZSwgJHRvX2xpbmUsICRkaWZmaW5mbywgJGZyb20sICR0bywgQHBhcmVudHMpID0gQF87CisJbXkgJGxpbmU7CisJbXkgJHJlc3VsdCA9ICcnOworCisJJGxpbmUgPSAkZnJvbV9saW5lOworCSNhc3NlcnQoJGxpbmUgPX4gbS9eLS0tLykgaWYgREVCVUc7CisJIyBubyBleHRyYSBmb3JtYXR0aW5nIGZvciAiXi0tLSAvZGV2L251bGwiCisJaWYgKCEgJGRpZmZpbmZvLT57J25wYXJlbnRzJ30pIHsKKwkJIyBvcmRpbmFyeSAoc2luZ2xlIHBhcmVudCkgZGlmZgorCQlpZiAoJGxpbmUgPX4gbSFeLS0tICI/YS8hKSB7CisJCQlpZiAoJGZyb20tPnsnaHJlZid9KSB7CisJCQkJJGxpbmUgPSAnLS0tIGEvJyAuCisJCQkJICAgICAgICAkY2dpLT5hKHstaHJlZj0+JGZyb20tPnsnaHJlZid9LCAtY2xhc3M9PiJwYXRoIn0sCisJCQkJICAgICAgICAgICAgICAgIGVzY19wYXRoKCRmcm9tLT57J2ZpbGUnfSkpOworCQkJfSBlbHNlIHsKKwkJCQkkbGluZSA9ICctLS0gYS8nIC4KKwkJCQkgICAgICAgIGVzY19wYXRoKCRmcm9tLT57J2ZpbGUnfSk7CisJCQl9CisJCX0KKwkJJHJlc3VsdCAuPSBxcSE8ZGl2IGNsYXNzPSJkaWZmIGZyb21fZmlsZSI+JGxpbmU8L2Rpdj5cbiE7CisKKwl9IGVsc2UgeworCQkjIGNvbWJpbmVkIGRpZmYgKG1lcmdlIGNvbW1pdCkKKwkJZm9yIChteSAkaSA9IDA7ICRpIDwgJGRpZmZpbmZvLT57J25wYXJlbnRzJ307ICRpKyspIHsKKwkJCWlmICgkZnJvbS0+eydocmVmJ31bJGldKSB7CisJCQkJJGxpbmUgPSAnLS0tICcgLgorCQkJCSAgICAgICAgJGNnaS0+YSh7LWhyZWY9PmhyZWYoYWN0aW9uPT4iYmxvYmRpZmYiLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9wYXJlbnQ9PiRkaWZmaW5mby0+eydmcm9tX2lkJ31bJGldLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9wYXJlbnRfYmFzZT0+JHBhcmVudHNbJGldLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wYXJlbnQ9PiRmcm9tLT57J2ZpbGUnfVskaV0sCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoPT4kZGlmZmluZm8tPnsndG9faWQnfSwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfYmFzZT0+JGhhc2gsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiR0by0+eydmaWxlJ30pLAorCQkJCSAgICAgICAgICAgICAgICAgLWNsYXNzPT4icGF0aCIsCisJCQkJICAgICAgICAgICAgICAgICAtdGl0bGU9PiJkaWZmIiAuICgkaSsxKX0sCisJCQkJICAgICAgICAgICAgICAgICRpKzEpIC4KKwkJCQkgICAgICAgICcvJyAuCisJCQkJICAgICAgICAkY2dpLT5hKHstaHJlZj0+JGZyb20tPnsnaHJlZid9WyRpXSwgLWNsYXNzPT4icGF0aCJ9LAorCQkJCSAgICAgICAgICAgICAgICBlc2NfcGF0aCgkZnJvbS0+eydmaWxlJ31bJGldKSk7CisJCQl9IGVsc2UgeworCQkJCSRsaW5lID0gJy0tLSAvZGV2L251bGwnOworCQkJfQorCQkJJHJlc3VsdCAuPSBxcSE8ZGl2IGNsYXNzPSJkaWZmIGZyb21fZmlsZSI+JGxpbmU8L2Rpdj5cbiE7CisJCX0KKwl9CisKKwkkbGluZSA9ICR0b19saW5lOworCSNhc3NlcnQoJGxpbmUgPX4gbS9eXCtcK1wrLykgaWYgREVCVUc7CisJIyBubyBleHRyYSBmb3JtYXR0aW5nIGZvciAiXisrKyAvZGV2L251bGwiCisJaWYgKCRsaW5lID1+IG0hXlwrXCtcKyAiP2IvISkgeworCQlpZiAoJHRvLT57J2hyZWYnfSkgeworCQkJJGxpbmUgPSAnKysrIGIvJyAuCisJCQkgICAgICAgICRjZ2ktPmEoey1ocmVmPT4kdG8tPnsnaHJlZid9LCAtY2xhc3M9PiJwYXRoIn0sCisJCQkgICAgICAgICAgICAgICAgZXNjX3BhdGgoJHRvLT57J2ZpbGUnfSkpOworCQl9IGVsc2UgeworCQkJJGxpbmUgPSAnKysrIGIvJyAuCisJCQkgICAgICAgIGVzY19wYXRoKCR0by0+eydmaWxlJ30pOworCQl9CisJfQorCSRyZXN1bHQgLj0gcXEhPGRpdiBjbGFzcz0iZGlmZiB0b19maWxlIj4kbGluZTwvZGl2PlxuITsKKworCXJldHVybiAkcmVzdWx0OworfQorCisjIGNyZWF0ZSBub3RlIGZvciBwYXRjaCBzaW1wbGlmaWVkIGJ5IGNvbWJpbmVkIGRpZmYKK3N1YiBmb3JtYXRfZGlmZl9jY19zaW1wbGlmaWVkIHsKKwlteSAoJGRpZmZpbmZvLCBAcGFyZW50cykgPSBAXzsKKwlteSAkcmVzdWx0ID0gJyc7CisKKwkkcmVzdWx0IC49ICI8ZGl2IGNsYXNzPVwiZGlmZiBoZWFkZXJcIj4iIC4KKwkgICAgICAgICAgICJkaWZmIC0tY2MgIjsKKwlpZiAoIWlzX2RlbGV0ZWQoJGRpZmZpbmZvKSkgeworCQkkcmVzdWx0IC49ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYiIsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2Jhc2U9PiRoYXNoLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaD0+JGRpZmZpbmZvLT57J3RvX2lkJ30sCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiRkaWZmaW5mby0+eyd0b19maWxlJ30pLAorCQkgICAgICAgICAgICAgICAgICAgIC1jbGFzcyA9PiAicGF0aCJ9LAorCQkgICAgICAgICAgICAgICAgICAgZXNjX3BhdGgoJGRpZmZpbmZvLT57J3RvX2ZpbGUnfSkpOworCX0gZWxzZSB7CisJCSRyZXN1bHQgLj0gZXNjX3BhdGgoJGRpZmZpbmZvLT57J3RvX2ZpbGUnfSk7CisJfQorCSRyZXN1bHQgLj0gIjwvZGl2PlxuIiAuICMgY2xhc3M9ImRpZmYgaGVhZGVyIgorCSAgICAgICAgICAgIjxkaXYgY2xhc3M9XCJkaWZmIG5vZGlmZmVyZW5jZXNcIj4iIC4KKwkgICAgICAgICAgICJTaW1wbGUgbWVyZ2UiIC4KKwkgICAgICAgICAgICI8L2Rpdj5cbiI7ICMgY2xhc3M9ImRpZmYgbm9kaWZmZXJlbmNlcyIKKworCXJldHVybiAkcmVzdWx0OworfQorCisjIGZvcm1hdCBwYXRjaCAoZGlmZikgbGluZSAobm90IHRvIGJlIHVzZWQgZm9yIGRpZmYgaGVhZGVycykKK3N1YiBmb3JtYXRfZGlmZl9saW5lIHsKKwlteSAkbGluZSA9IHNoaWZ0OworCW15ICgkZnJvbSwgJHRvKSA9IEBfOworCW15ICRkaWZmX2NsYXNzID0gIiI7CisKKwljaG9tcCAkbGluZTsKKworCWlmICgkZnJvbSAmJiAkdG8gJiYgcmVmKCRmcm9tLT57J2hyZWYnfSkgZXEgIkFSUkFZIikgeworCQkjIGNvbWJpbmVkIGRpZmYKKwkJbXkgJHByZWZpeCA9IHN1YnN0cigkbGluZSwgMCwgc2NhbGFyIEB7JGZyb20tPnsnaHJlZid9fSk7CisJCWlmICgkbGluZSA9fiBtL15cQHszfS8pIHsKKwkJCSRkaWZmX2NsYXNzID0gIiBjaHVua19oZWFkZXIiOworCQl9IGVsc2lmICgkbGluZSA9fiBtL15cXC8pIHsKKwkJCSRkaWZmX2NsYXNzID0gIiBpbmNvbXBsZXRlIjsKKwkJfSBlbHNpZiAoJHByZWZpeCA9fiB0ci8rLysvKSB7CisJCQkkZGlmZl9jbGFzcyA9ICIgYWRkIjsKKwkJfSBlbHNpZiAoJHByZWZpeCA9fiB0ci8tLy0vKSB7CisJCQkkZGlmZl9jbGFzcyA9ICIgcmVtIjsKKwkJfQorCX0gZWxzZSB7CisJCSMgYXNzdW1lIG9yZGluYXJ5IGRpZmYKKwkJbXkgJGNoYXIgPSBzdWJzdHIoJGxpbmUsIDAsIDEpOworCQlpZiAoJGNoYXIgZXEgJysnKSB7CisJCQkkZGlmZl9jbGFzcyA9ICIgYWRkIjsKKwkJfSBlbHNpZiAoJGNoYXIgZXEgJy0nKSB7CisJCQkkZGlmZl9jbGFzcyA9ICIgcmVtIjsKKwkJfSBlbHNpZiAoJGNoYXIgZXEgJ0AnKSB7CisJCQkkZGlmZl9jbGFzcyA9ICIgY2h1bmtfaGVhZGVyIjsKKwkJfSBlbHNpZiAoJGNoYXIgZXEgIlxcIikgeworCQkJJGRpZmZfY2xhc3MgPSAiIGluY29tcGxldGUiOworCQl9CisJfQorCSRsaW5lID0gdW50YWJpZnkoJGxpbmUpOworCWlmICgkZnJvbSAmJiAkdG8gJiYgJGxpbmUgPX4gbS9eXEB7Mn0gLykgeworCQlteSAoJGZyb21fdGV4dCwgJGZyb21fc3RhcnQsICRmcm9tX2xpbmVzLCAkdG9fdGV4dCwgJHRvX3N0YXJ0LCAkdG9fbGluZXMsICRzZWN0aW9uKSA9CisJCQkkbGluZSA9fiBtL15cQHsyfSAoLShcZCspKD86LChcZCspKT8pIChcKyhcZCspKD86LChcZCspKT8pIFxAezJ9KC4qKSQvOworCisJCSRmcm9tX2xpbmVzID0gMCB1bmxlc3MgZGVmaW5lZCAkZnJvbV9saW5lczsKKwkJJHRvX2xpbmVzICAgPSAwIHVubGVzcyBkZWZpbmVkICR0b19saW5lczsKKworCQlpZiAoJGZyb20tPnsnaHJlZid9KSB7CisJCQkkZnJvbV90ZXh0ID0gJGNnaS0+YSh7LWhyZWY9PiIkZnJvbS0+eydocmVmJ30jbCRmcm9tX3N0YXJ0IiwKKwkJCSAgICAgICAgICAgICAgICAgICAgIC1jbGFzcz0+Imxpc3QifSwgJGZyb21fdGV4dCk7CisJCX0KKwkJaWYgKCR0by0+eydocmVmJ30pIHsKKwkJCSR0b190ZXh0ICAgPSAkY2dpLT5hKHstaHJlZj0+IiR0by0+eydocmVmJ30jbCR0b19zdGFydCIsCisJCQkgICAgICAgICAgICAgICAgICAgICAtY2xhc3M9PiJsaXN0In0sICR0b190ZXh0KTsKKwkJfQorCQkkbGluZSA9ICI8c3BhbiBjbGFzcz1cImNodW5rX2luZm9cIj5AQCAkZnJvbV90ZXh0ICR0b190ZXh0IEBAPC9zcGFuPiIgLgorCQkgICAgICAgICI8c3BhbiBjbGFzcz1cInNlY3Rpb25cIj4iIC4gZXNjX2h0bWwoJHNlY3Rpb24sIC1uYnNwPT4xKSAuICI8L3NwYW4+IjsKKwkJcmV0dXJuICI8ZGl2IGNsYXNzPVwiZGlmZiRkaWZmX2NsYXNzXCI+JGxpbmU8L2Rpdj5cbiI7CisJfSBlbHNpZiAoJGZyb20gJiYgJHRvICYmICRsaW5lID1+IG0vXlxAezN9LykgeworCQlteSAoJHByZWZpeCwgJHJhbmdlcywgJHNlY3Rpb24pID0gJGxpbmUgPX4gbS9eKFxAKykgKC4qPykgXEArKC4qKSQvOworCQlteSAoQGZyb21fdGV4dCwgQGZyb21fc3RhcnQsIEBmcm9tX25saW5lcywgJHRvX3RleHQsICR0b19zdGFydCwgJHRvX25saW5lcyk7CisKKwkJQGZyb21fdGV4dCA9IHNwbGl0KCcgJywgJHJhbmdlcyk7CisJCWZvciAobXkgJGkgPSAwOyAkaSA8IEBmcm9tX3RleHQ7ICsrJGkpIHsKKwkJCSgkZnJvbV9zdGFydFskaV0sICRmcm9tX25saW5lc1skaV0pID0KKwkJCQkoc3BsaXQoJywnLCBzdWJzdHIoJGZyb21fdGV4dFskaV0sIDEpKSwgMCk7CisJCX0KKworCQkkdG9fdGV4dCAgID0gcG9wIEBmcm9tX3RleHQ7CisJCSR0b19zdGFydCAgPSBwb3AgQGZyb21fc3RhcnQ7CisJCSR0b19ubGluZXMgPSBwb3AgQGZyb21fbmxpbmVzOworCisJCSRsaW5lID0gIjxzcGFuIGNsYXNzPVwiY2h1bmtfaW5mb1wiPiRwcmVmaXggIjsKKwkJZm9yIChteSAkaSA9IDA7ICRpIDwgQGZyb21fdGV4dDsgKyskaSkgeworCQkJaWYgKCRmcm9tLT57J2hyZWYnfVskaV0pIHsKKwkJCQkkbGluZSAuPSAkY2dpLT5hKHstaHJlZj0+IiRmcm9tLT57J2hyZWYnfVskaV0jbCRmcm9tX3N0YXJ0WyRpXSIsCisJCQkJICAgICAgICAgICAgICAgICAgLWNsYXNzPT4ibGlzdCJ9LCAkZnJvbV90ZXh0WyRpXSk7CisJCQl9IGVsc2UgeworCQkJCSRsaW5lIC49ICRmcm9tX3RleHRbJGldOworCQkJfQorCQkJJGxpbmUgLj0gIiAiOworCQl9CisJCWlmICgkdG8tPnsnaHJlZid9KSB7CisJCQkkbGluZSAuPSAkY2dpLT5hKHstaHJlZj0+IiR0by0+eydocmVmJ30jbCR0b19zdGFydCIsCisJCQkgICAgICAgICAgICAgICAgICAtY2xhc3M9PiJsaXN0In0sICR0b190ZXh0KTsKKwkJfSBlbHNlIHsKKwkJCSRsaW5lIC49ICR0b190ZXh0OworCQl9CisJCSRsaW5lIC49ICIgJHByZWZpeDwvc3Bhbj4iIC4KKwkJICAgICAgICAgIjxzcGFuIGNsYXNzPVwic2VjdGlvblwiPiIgLiBlc2NfaHRtbCgkc2VjdGlvbiwgLW5ic3A9PjEpIC4gIjwvc3Bhbj4iOworCQlyZXR1cm4gIjxkaXYgY2xhc3M9XCJkaWZmJGRpZmZfY2xhc3NcIj4kbGluZTwvZGl2PlxuIjsKKwl9CisJcmV0dXJuICI8ZGl2IGNsYXNzPVwiZGlmZiRkaWZmX2NsYXNzXCI+IiAuIGVzY19odG1sKCRsaW5lLCAtbmJzcD0+MSkgLiAiPC9kaXY+XG4iOworfQorCisjIEdlbmVyYXRlcyB1bmRlZiBvciBzb21ldGhpbmcgbGlrZSAiX3NuYXBzaG90XyIgb3IgInNuYXBzaG90IChfdGJ6Ml8gX3ppcF8pIiwKKyMgbGlua2VkLiAgUGFzcyB0aGUgaGFzaCBvZiB0aGUgdHJlZS9jb21taXQgdG8gc25hcHNob3QuCitzdWIgZm9ybWF0X3NuYXBzaG90X2xpbmtzIHsKKwlteSAoJGhhc2gpID0gQF87CisJbXkgQHNuYXBzaG90X2ZtdHMgPSBnaXR3ZWJfY2hlY2tfZmVhdHVyZSgnc25hcHNob3QnKTsKKwlAc25hcHNob3RfZm10cyA9IGZpbHRlcl9zbmFwc2hvdF9mbXRzKEBzbmFwc2hvdF9mbXRzKTsKKwlteSAkbnVtX2ZtdHMgPSBAc25hcHNob3RfZm10czsKKwlpZiAoJG51bV9mbXRzID4gMSkgeworCQkjIEEgcGFyZW50aGVzaXplZCBsaXN0IG9mIGxpbmtzIGJlYXJpbmcgZm9ybWF0IG5hbWVzLgorCQkjIGUuZy4gInNuYXBzaG90IChfdGFyLmd6XyBfemlwXykiCisJCXJldHVybiAic25hcHNob3QgKCIgLiBqb2luKCcgJywgbWFwCisJCQkkY2dpLT5hKHsKKwkJCQktaHJlZiA9PiBocmVmKAorCQkJCQlhY3Rpb249PiJzbmFwc2hvdCIsCisJCQkJCWhhc2g9PiRoYXNoLAorCQkJCQlzbmFwc2hvdF9mb3JtYXQ9PiRfCisJCQkJKQorCQkJfSwgJGtub3duX3NuYXBzaG90X2Zvcm1hdHN7JF99eydkaXNwbGF5J30pCisJCSwgQHNuYXBzaG90X2ZtdHMpIC4gIikiOworCX0gZWxzaWYgKCRudW1fZm10cyA9PSAxKSB7CisJCSMgQSBzaW5nbGUgInNuYXBzaG90IiBsaW5rIHdob3NlIHRvb2x0aXAgYmVhcnMgdGhlIGZvcm1hdCBuYW1lLgorCQkjIGkuZS4gIl9zbmFwc2hvdF8iCisJCW15ICgkZm10KSA9IEBzbmFwc2hvdF9mbXRzOworCQlyZXR1cm4KKwkJCSRjZ2ktPmEoeworCQkJCS1ocmVmID0+IGhyZWYoCisJCQkJCWFjdGlvbj0+InNuYXBzaG90IiwKKwkJCQkJaGFzaD0+JGhhc2gsCisJCQkJCXNuYXBzaG90X2Zvcm1hdD0+JGZtdAorCQkJCSksCisJCQkJLXRpdGxlID0+ICJpbiBmb3JtYXQ6ICRrbm93bl9zbmFwc2hvdF9mb3JtYXRzeyRmbXR9eydkaXNwbGF5J30iCisJCQl9LCAic25hcHNob3QiKTsKKwl9IGVsc2UgeyAjICRudW1fZm10cyA9PSAwCisJCXJldHVybiB1bmRlZjsKKwl9Cit9CisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIGdpdCB1dGlsaXR5IHN1YnJvdXRpbmVzLCBpbnZva2luZyBnaXQgY29tbWFuZHMKKworIyByZXR1cm5zIHBhdGggdG8gdGhlIGNvcmUgZ2l0IGV4ZWN1dGFibGUgYW5kIHRoZSAtLWdpdC1kaXIgcGFyYW1ldGVyIGFzIGxpc3QKK3N1YiBnaXRfY21kIHsKKwlyZXR1cm4gJEdJVCwgJy0tZ2l0LWRpcj0nLiRnaXRfZGlyOworfQorCisjIHJldHVybnMgcGF0aCB0byB0aGUgY29yZSBnaXQgZXhlY3V0YWJsZSBhbmQgdGhlIC0tZ2l0LWRpciBwYXJhbWV0ZXIgYXMgc3RyaW5nCitzdWIgZ2l0X2NtZF9zdHIgeworCXJldHVybiBqb2luKCcgJywgZ2l0X2NtZCgpKTsKK30KKworIyBnZXQgSEVBRCByZWYgb2YgZ2l2ZW4gcHJvamVjdCBhcyBoYXNoCitzdWIgZ2l0X2dldF9oZWFkX2hhc2ggeworCW15ICRwcm9qZWN0ID0gc2hpZnQ7CisJbXkgJG9fZ2l0X2RpciA9ICRnaXRfZGlyOworCW15ICRyZXR2YWwgPSB1bmRlZjsKKwkkZ2l0X2RpciA9ICIkcHJvamVjdHJvb3QvJHByb2plY3QiOworCWlmIChvcGVuIG15ICRmZCwgIi18IiwgZ2l0X2NtZCgpLCAicmV2LXBhcnNlIiwgIi0tdmVyaWZ5IiwgIkhFQUQiKSB7CisJCW15ICRoZWFkID0gPCRmZD47CisJCWNsb3NlICRmZDsKKwkJaWYgKGRlZmluZWQgJGhlYWQgJiYgJGhlYWQgPX4gL14oWzAtOWEtZkEtRl17NDB9KSQvKSB7CisJCQkkcmV0dmFsID0gJDE7CisJCX0KKwl9CisJaWYgKGRlZmluZWQgJG9fZ2l0X2RpcikgeworCQkkZ2l0X2RpciA9ICRvX2dpdF9kaXI7CisJfQorCXJldHVybiAkcmV0dmFsOworfQorCisjIGdldCB0eXBlIG9mIGdpdmVuIG9iamVjdAorc3ViIGdpdF9nZXRfdHlwZSB7CisJbXkgJGhhc2ggPSBzaGlmdDsKKworCW9wZW4gbXkgJGZkLCAiLXwiLCBnaXRfY21kKCksICJjYXQtZmlsZSIsICctdCcsICRoYXNoIG9yIHJldHVybjsKKwlteSAkdHlwZSA9IDwkZmQ+OworCWNsb3NlICRmZCBvciByZXR1cm47CisJY2hvbXAgJHR5cGU7CisJcmV0dXJuICR0eXBlOworfQorCisjIHJlcG9zaXRvcnkgY29uZmlndXJhdGlvbgorb3VyICRjb25maWdfZmlsZSA9ICcnOworb3VyICVjb25maWc7CisKKyMgc3RvcmUgbXVsdGlwbGUgdmFsdWVzIGZvciBzaW5nbGUga2V5IGFzIGFub255bW91cyBhcnJheSByZWZlcmVuY2UKKyMgc2luZ2xlIHZhbHVlcyBzdG9yZWQgZGlyZWN0bHkgaW4gdGhlIGhhc2gsIG5vdCBhcyBbIDx2YWx1ZT4gXQorc3ViIGhhc2hfc2V0X211bHRpIHsKKwlteSAoJGhhc2gsICRrZXksICR2YWx1ZSkgPSBAXzsKKworCWlmICghZXhpc3RzICRoYXNoLT57JGtleX0pIHsKKwkJJGhhc2gtPnska2V5fSA9ICR2YWx1ZTsKKwl9IGVsc2lmICghcmVmICRoYXNoLT57JGtleX0pIHsKKwkJJGhhc2gtPnska2V5fSA9IFsgJGhhc2gtPnska2V5fSwgJHZhbHVlIF07CisJfSBlbHNlIHsKKwkJcHVzaCBAeyRoYXNoLT57JGtleX19LCAkdmFsdWU7CisJfQorfQorCisjIHJldHVybiBoYXNoIG9mIGdpdCBwcm9qZWN0IGNvbmZpZ3VyYXRpb24KKyMgb3B0aW9uYWxseSBsaW1pdGVkIHRvIHNvbWUgc2VjdGlvbiwgZS5nLiAnZ2l0d2ViJworc3ViIGdpdF9wYXJzZV9wcm9qZWN0X2NvbmZpZyB7CisJbXkgJHNlY3Rpb25fcmVnZXhwID0gc2hpZnQ7CisJbXkgJWNvbmZpZzsKKworCWxvY2FsICQvID0gIlwwIjsKKworCW9wZW4gbXkgJGZoLCAiLXwiLCBnaXRfY21kKCksICJjb25maWciLCAnLXonLCAnLWwnLAorCQlvciByZXR1cm47CisKKwl3aGlsZSAobXkgJGtleXZhbCA9IDwkZmg+KSB7CisJCWNob21wICRrZXl2YWw7CisJCW15ICgka2V5LCAkdmFsdWUpID0gc3BsaXQoL1xuLywgJGtleXZhbCwgMik7CisKKwkJaGFzaF9zZXRfbXVsdGkoXCVjb25maWcsICRrZXksICR2YWx1ZSkKKwkJCWlmICghZGVmaW5lZCAkc2VjdGlvbl9yZWdleHAgfHwgJGtleSA9fiAvXig/OiRzZWN0aW9uX3JlZ2V4cClcLi9vKTsKKwl9CisJY2xvc2UgJGZoOworCisJcmV0dXJuICVjb25maWc7Cit9CisKKyMgY29udmVydCBjb25maWcgdmFsdWUgdG8gYm9vbGVhbiwgJ3RydWUnIG9yICdmYWxzZScKKyMgbm8gdmFsdWUsIG51bWJlciA+IDAsICd0cnVlJyBhbmQgJ3llcycgdmFsdWVzIGFyZSB0cnVlCisjIHJlc3Qgb2YgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIGZhbHNlIChuZXZlciBhcyBlcnJvcikKK3N1YiBjb25maWdfdG9fYm9vbCB7CisJbXkgJHZhbCA9IHNoaWZ0OworCisJIyBzdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlCisJJHZhbCA9fiBzL15ccysvLzsKKwkkdmFsID1+IHMvXHMrJC8vOworCisJcmV0dXJuICghZGVmaW5lZCAkdmFsIHx8ICAgICAgICAgICAgICAgIyBzZWN0aW9uLmtleQorCSAgICAgICAgKCR2YWwgPX4gL15cZCskLyAmJiAkdmFsKSB8fCAgICMgc2VjdGlvbi5rZXkgPSAxCisJICAgICAgICAoJHZhbCA9fiAvXig/OnRydWV8eWVzKSQvaSkpOyAgIyBzZWN0aW9uLmtleSA9IHRydWUKK30KKworIyBjb252ZXJ0IGNvbmZpZyB2YWx1ZSB0byBzaW1wbGUgZGVjaW1hbCBudW1iZXIKKyMgYW4gb3B0aW9uYWwgdmFsdWUgc3VmZml4IG9mICdrJywgJ20nLCBvciAnZycgd2lsbCBjYXVzZSB0aGUgdmFsdWUKKyMgdG8gYmUgbXVsdGlwbGllZCBieSAxMDI0LCAxMDQ4NTc2LCBvciAxMDczNzQxODI0CitzdWIgY29uZmlnX3RvX2ludCB7CisJbXkgJHZhbCA9IHNoaWZ0OworCisJIyBzdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlCisJJHZhbCA9fiBzL15ccysvLzsKKwkkdmFsID1+IHMvXHMrJC8vOworCisJaWYgKG15ICgkbnVtLCAkdW5pdCkgPSAoJHZhbCA9fiAvXihbMC05XSopKFtrbWddKSQvaSkpIHsKKwkJJHVuaXQgPSBsYygkdW5pdCk7CisJCSMgdW5rbm93biB1bml0IGlzIHRyZWF0ZWQgYXMgMQorCQlyZXR1cm4gJG51bSAqICgkdW5pdCBlcSAnZycgPyAxMDczNzQxODI0IDoKKwkJICAgICAgICAgICAgICAgJHVuaXQgZXEgJ20nID8gICAgMTA0ODU3NiA6CisJCSAgICAgICAgICAgICAgICR1bml0IGVxICdrJyA/ICAgICAgIDEwMjQgOiAxKTsKKwl9CisJcmV0dXJuICR2YWw7Cit9CisKKyMgY29udmVydCBjb25maWcgdmFsdWUgdG8gYXJyYXkgcmVmZXJlbmNlLCBpZiBuZWVkZWQKK3N1YiBjb25maWdfdG9fbXVsdGkgeworCW15ICR2YWwgPSBzaGlmdDsKKworCXJldHVybiByZWYoJHZhbCkgPyAkdmFsIDogKGRlZmluZWQoJHZhbCkgPyBbICR2YWwgXSA6IFtdKTsKK30KKworc3ViIGdpdF9nZXRfcHJvamVjdF9jb25maWcgeworCW15ICgka2V5LCAkdHlwZSkgPSBAXzsKKworCSMga2V5IHNhbml0eSBjaGVjaworCXJldHVybiB1bmxlc3MgKCRrZXkpOworCSRrZXkgPX4gcy9eZ2l0d2ViXC4vLzsKKwlyZXR1cm4gaWYgKCRrZXkgPX4gbS9cVy8pOworCisJIyB0eXBlIHNhbml0eSBjaGVjaworCWlmIChkZWZpbmVkICR0eXBlKSB7CisJCSR0eXBlID1+IHMvXi0tLy87CisJCSR0eXBlID0gdW5kZWYKKwkJCXVubGVzcyAoJHR5cGUgZXEgJ2Jvb2wnIHx8ICR0eXBlIGVxICdpbnQnKTsKKwl9CisKKwkjIGdldCBjb25maWcKKwlpZiAoIWRlZmluZWQgJGNvbmZpZ19maWxlIHx8CisJICAgICRjb25maWdfZmlsZSBuZSAiJGdpdF9kaXIvY29uZmlnIikgeworCQklY29uZmlnID0gZ2l0X3BhcnNlX3Byb2plY3RfY29uZmlnKCdnaXR3ZWInKTsKKwkJJGNvbmZpZ19maWxlID0gIiRnaXRfZGlyL2NvbmZpZyI7CisJfQorCisJIyBlbnN1cmUgZ2l2ZW4gdHlwZQorCWlmICghZGVmaW5lZCAkdHlwZSkgeworCQlyZXR1cm4gJGNvbmZpZ3siZ2l0d2ViLiRrZXkifTsKKwl9IGVsc2lmICgkdHlwZSBlcSAnYm9vbCcpIHsKKwkJIyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OiAnZ2l0IGNvbmZpZyAtLWJvb2wnIHJldHVybnMgdHJ1ZS9mYWxzZQorCQlyZXR1cm4gY29uZmlnX3RvX2Jvb2woJGNvbmZpZ3siZ2l0d2ViLiRrZXkifSkgPyAndHJ1ZScgOiAnZmFsc2UnOworCX0gZWxzaWYgKCR0eXBlIGVxICdpbnQnKSB7CisJCXJldHVybiBjb25maWdfdG9faW50KCRjb25maWd7ImdpdHdlYi4ka2V5In0pOworCX0KKwlyZXR1cm4gJGNvbmZpZ3siZ2l0d2ViLiRrZXkifTsKK30KKworIyBnZXQgaGFzaCBvZiBnaXZlbiBwYXRoIGF0IGdpdmVuIHJlZgorc3ViIGdpdF9nZXRfaGFzaF9ieV9wYXRoIHsKKwlteSAkYmFzZSA9IHNoaWZ0OworCW15ICRwYXRoID0gc2hpZnQgfHwgcmV0dXJuIHVuZGVmOworCW15ICR0eXBlID0gc2hpZnQ7CisKKwkkcGF0aCA9fiBzLC8rJCwsOworCisJb3BlbiBteSAkZmQsICItfCIsIGdpdF9jbWQoKSwgImxzLXRyZWUiLCAkYmFzZSwgIi0tIiwgJHBhdGgKKwkJb3IgZGllX2Vycm9yKHVuZGVmLCAiT3BlbiBnaXQtbHMtdHJlZSBmYWlsZWQiKTsKKwlteSAkbGluZSA9IDwkZmQ+OworCWNsb3NlICRmZCBvciByZXR1cm4gdW5kZWY7CisKKwlpZiAoIWRlZmluZWQgJGxpbmUpIHsKKwkJIyB0aGVyZSBpcyBubyB0cmVlIG9yIGhhc2ggZ2l2ZW4gYnkgJHBhdGggYXQgJGJhc2UKKwkJcmV0dXJuIHVuZGVmOworCX0KKworCSMnMTAwNjQ0IGJsb2IgMGZhM2YzYTY2ZmI2YTEzN2Y2ZWMyYzE5MzUxZWQ0ZDgwNzA3MGZmYQlwYW5pYy5jJworCSRsaW5lID1+IG0vXihbMC05XSspICguKykgKFswLTlhLWZBLUZdezQwfSlcdC87CisJaWYgKGRlZmluZWQgJHR5cGUgJiYgJHR5cGUgbmUgJDIpIHsKKwkJIyB0eXBlIGRvZXNuJ3QgbWF0Y2gKKwkJcmV0dXJuIHVuZGVmOworCX0KKwlyZXR1cm4gJDM7Cit9CisKKyMgZ2V0IHBhdGggb2YgZW50cnkgd2l0aCBnaXZlbiBoYXNoIGF0IGdpdmVuIHRyZWUtaXNoIChyZWYpCisjIHVzZWQgdG8gZ2V0ICdmcm9tJyBmaWxlbmFtZSBmb3IgY29tYmluZWQgZGlmZiAobWVyZ2UgY29tbWl0KSBmb3IgcmVuYW1lcworc3ViIGdpdF9nZXRfcGF0aF9ieV9oYXNoIHsKKwlteSAkYmFzZSA9IHNoaWZ0IHx8IHJldHVybjsKKwlteSAkaGFzaCA9IHNoaWZ0IHx8IHJldHVybjsKKworCWxvY2FsICQvID0gIlwwIjsKKworCW9wZW4gbXkgJGZkLCAiLXwiLCBnaXRfY21kKCksICJscy10cmVlIiwgJy1yJywgJy10JywgJy16JywgJGJhc2UKKwkJb3IgcmV0dXJuIHVuZGVmOworCXdoaWxlIChteSAkbGluZSA9IDwkZmQ+KSB7CisJCWNob21wICRsaW5lOworCisJCSMnMDQwMDAwIHRyZWUgNTk1NTk2YTZhOTExN2RkYmE5ZmUzNzliNmIwMTJiNTU4YmFjODQyMwlnaXR3ZWInCisJCSMnMTAwNjQ0IGJsb2IgZTAyZTkwZjA0MjliZTBkMmE2OWI3NjU3MTEwMWYyMGI4Zjc1NTMwZglnaXR3ZWIvUkVBRE1FJworCQlpZiAoJGxpbmUgPX4gbS8oPzpbMC05XSspICg/Oi4rKSAkaGFzaFx0KC4rKSQvKSB7CisJCQljbG9zZSAkZmQ7CisJCQlyZXR1cm4gJDE7CisJCX0KKwl9CisJY2xvc2UgJGZkOworCXJldHVybiB1bmRlZjsKK30KKworIyMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorIyMgZ2l0IHV0aWxpdHkgZnVuY3Rpb25zLCBkaXJlY3RseSBhY2Nlc3NpbmcgZ2l0IHJlcG9zaXRvcnkKKworc3ViIGdpdF9nZXRfcHJvamVjdF9kZXNjcmlwdGlvbiB7CisJbXkgJHBhdGggPSBzaGlmdDsKKworCSRnaXRfZGlyID0gIiRwcm9qZWN0cm9vdC8kcGF0aCI7CisJb3BlbiBteSAkZmQsICIkZ2l0X2Rpci9kZXNjcmlwdGlvbiIKKwkJb3IgcmV0dXJuIGdpdF9nZXRfcHJvamVjdF9jb25maWcoJ2Rlc2NyaXB0aW9uJyk7CisJbXkgJGRlc2NyID0gPCRmZD47CisJY2xvc2UgJGZkOworCWlmIChkZWZpbmVkICRkZXNjcikgeworCQljaG9tcCAkZGVzY3I7CisJfQorCXJldHVybiAkZGVzY3I7Cit9CisKK3N1YiBnaXRfZ2V0X3Byb2plY3RfdXJsX2xpc3QgeworCW15ICRwYXRoID0gc2hpZnQ7CisKKwkkZ2l0X2RpciA9ICIkcHJvamVjdHJvb3QvJHBhdGgiOworCW9wZW4gbXkgJGZkLCAiJGdpdF9kaXIvY2xvbmV1cmwiCisJCW9yIHJldHVybiB3YW50YXJyYXkgPworCQlAeyBjb25maWdfdG9fbXVsdGkoZ2l0X2dldF9wcm9qZWN0X2NvbmZpZygndXJsJykpIH0gOgorCQkgICBjb25maWdfdG9fbXVsdGkoZ2l0X2dldF9wcm9qZWN0X2NvbmZpZygndXJsJykpOworCW15IEBnaXRfcHJvamVjdF91cmxfbGlzdCA9IG1hcCB7IGNob21wOyAkXyB9IDwkZmQ+OworCWNsb3NlICRmZDsKKworCXJldHVybiB3YW50YXJyYXkgPyBAZ2l0X3Byb2plY3RfdXJsX2xpc3QgOiBcQGdpdF9wcm9qZWN0X3VybF9saXN0OworfQorCitzdWIgZ2l0X2dldF9wcm9qZWN0c19saXN0IHsKKwlteSAoJGZpbHRlcikgPSBAXzsKKwlteSBAbGlzdDsKKworCSRmaWx0ZXIgfHw9ICcnOworCSRmaWx0ZXIgPX4gcy9cLmdpdCQvLzsKKworCW15ICgkY2hlY2tfZm9ya3MpID0gZ2l0d2ViX2NoZWNrX2ZlYXR1cmUoJ2ZvcmtzJyk7CisKKwlpZiAoLWQgJHByb2plY3RzX2xpc3QpIHsKKwkJIyBzZWFyY2ggaW4gZGlyZWN0b3J5CisJCW15ICRkaXIgPSAkcHJvamVjdHNfbGlzdCAuICgkZmlsdGVyID8gIi8kZmlsdGVyIiA6ICcnKTsKKwkJIyByZW1vdmUgdGhlIHRyYWlsaW5nICIvIgorCQkkZGlyID1+IHMhLyskISE7CisJCW15ICRwZnhsZW4gPSBsZW5ndGgoIiRkaXIiKTsKKwkJbXkgJHBmeGRlcHRoID0gKCRkaXIgPX4gdHIhLyEhKTsKKworCQlGaWxlOjpGaW5kOjpmaW5kKHsKKwkJCWZvbGxvd19mYXN0ID0+IDEsICMgZm9sbG93IHN5bWJvbGljIGxpbmtzCisJCQlmb2xsb3dfc2tpcCA9PiAyLCAjIGlnbm9yZSBkdXBsaWNhdGVzCisJCQlkYW5nbGluZ19zeW1saW5rcyA9PiAwLCAjIGlnbm9yZSBkYW5nbGluZyBzeW1saW5rcywgc2lsZW50bHkKKwkJCXdhbnRlZCA9PiBzdWIgeworCQkJCSMgc2tpcCBwcm9qZWN0LWxpc3QgdG9wbGV2ZWwsIGlmIHdlIGdldCBpdC4KKwkJCQlyZXR1cm4gaWYgKG0hXlsvLl0kISk7CisJCQkJIyBvbmx5IGRpcmVjdG9yaWVzIGNhbiBiZSBnaXQgcmVwb3NpdG9yaWVzCisJCQkJcmV0dXJuIHVubGVzcyAoLWQgJF8pOworCQkJCSMgZG9uJ3QgdHJhdmVyc2UgdG9vIGRlZXAgKEZpbmQgaXMgc3VwZXIgc2xvdyBvbiBvcyB4KQorCQkJCWlmICgoJEZpbGU6OkZpbmQ6Om5hbWUgPX4gdHIhLyEhKSAtICRwZnhkZXB0aCA+ICRwcm9qZWN0X21heGRlcHRoKSB7CisJCQkJCSRGaWxlOjpGaW5kOjpwcnVuZSA9IDE7CisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCQlteSAkc3ViZGlyID0gc3Vic3RyKCRGaWxlOjpGaW5kOjpuYW1lLCAkcGZ4bGVuICsgMSk7CisJCQkJIyB3ZSBjaGVjayByZWxhdGVkIGZpbGUgaW4gJHByb2plY3Ryb290CisJCQkJaWYgKCRjaGVja19mb3JrcyBhbmQgJHN1YmRpciA9fiBtIy8uIykgeworCQkJCQkkRmlsZTo6RmluZDo6cHJ1bmUgPSAxOworCQkJCX0gZWxzaWYgKGNoZWNrX2V4cG9ydF9vaygiJHByb2plY3Ryb290LyRmaWx0ZXIvJHN1YmRpciIpKSB7CisJCQkJCXB1c2ggQGxpc3QsIHsgcGF0aCA9PiAoJGZpbHRlciA/ICIkZmlsdGVyLyIgOiAnJykgLiAkc3ViZGlyIH07CisJCQkJCSRGaWxlOjpGaW5kOjpwcnVuZSA9IDE7CisJCQkJfQorCQkJfSwKKwkJfSwgIiRkaXIiKTsKKworCX0gZWxzaWYgKC1mICRwcm9qZWN0c19saXN0KSB7CisJCSMgcmVhZCBmcm9tIGZpbGUodXJsLWVuY29kZWQpOgorCQkjICdnaXQlMkZnaXQuZ2l0IExpbnVzK1RvcnZhbGRzJworCQkjICdsaWJzJTJGa2xpYmMlMkZrbGliYy5naXQgSC4rUGV0ZXIrQW52aW4nCisJCSMgJ2xpbnV4JTJGaG90cGx1ZyUyRnVkZXYuZ2l0IEdyZWcrS3JvYWgtSGFydG1hbicKKwkJbXkgJXBhdGhzOworCQlvcGVuIG15ICgkZmQpLCAkcHJvamVjdHNfbGlzdCBvciByZXR1cm47CisJUFJPSkVDVDoKKwkJd2hpbGUgKG15ICRsaW5lID0gPCRmZD4pIHsKKwkJCWNob21wICRsaW5lOworCQkJbXkgKCRwYXRoLCAkb3duZXIpID0gc3BsaXQgJyAnLCAkbGluZTsKKwkJCSRwYXRoID0gdW5lc2NhcGUoJHBhdGgpOworCQkJJG93bmVyID0gdW5lc2NhcGUoJG93bmVyKTsKKwkJCWlmICghZGVmaW5lZCAkcGF0aCkgeworCQkJCW5leHQ7CisJCQl9CisJCQlpZiAoJGZpbHRlciBuZSAnJykgeworCQkJCSMgbG9va2luZyBmb3IgZm9ya3M7CisJCQkJbXkgJHBmeCA9IHN1YnN0cigkcGF0aCwgMCwgbGVuZ3RoKCRmaWx0ZXIpKTsKKwkJCQlpZiAoJHBmeCBuZSAkZmlsdGVyKSB7CisJCQkJCW5leHQgUFJPSkVDVDsKKwkJCQl9CisJCQkJbXkgJHNmeCA9IHN1YnN0cigkcGF0aCwgbGVuZ3RoKCRmaWx0ZXIpKTsKKwkJCQlpZiAoJHNmeCAhfiAvXlwvLipcLmdpdCQvKSB7CisJCQkJCW5leHQgUFJPSkVDVDsKKwkJCQl9CisJCQl9IGVsc2lmICgkY2hlY2tfZm9ya3MpIHsKKwkJCVBBVEg6CisJCQkJZm9yZWFjaCBteSAkZmlsdGVyIChrZXlzICVwYXRocykgeworCQkJCQkjIGxvb2tpbmcgZm9yIGZvcmtzOworCQkJCQlteSAkcGZ4ID0gc3Vic3RyKCRwYXRoLCAwLCBsZW5ndGgoJGZpbHRlcikpOworCQkJCQlpZiAoJHBmeCBuZSAkZmlsdGVyKSB7CisJCQkJCQluZXh0IFBBVEg7CisJCQkJCX0KKwkJCQkJbXkgJHNmeCA9IHN1YnN0cigkcGF0aCwgbGVuZ3RoKCRmaWx0ZXIpKTsKKwkJCQkJaWYgKCRzZnggIX4gL15cLy4qXC5naXQkLykgeworCQkJCQkJbmV4dCBQQVRIOworCQkJCQl9CisJCQkJCSMgaXMgYSBmb3JrLCBkb24ndCBpbmNsdWRlIGl0IGluCisJCQkJCSMgdGhlIGxpc3QKKwkJCQkJbmV4dCBQUk9KRUNUOworCQkJCX0KKwkJCX0KKwkJCWlmIChjaGVja19leHBvcnRfb2soIiRwcm9qZWN0cm9vdC8kcGF0aCIpKSB7CisJCQkJbXkgJHByID0geworCQkJCQlwYXRoID0+ICRwYXRoLAorCQkJCQlvd25lciA9PiB0b191dGY4KCRvd25lciksCisJCQkJfTsKKwkJCQlwdXNoIEBsaXN0LCAkcHI7CisJCQkJKG15ICRmb3Jrc19wYXRoID0gJHBhdGgpID1+IHMvXC5naXQkLy87CisJCQkJJHBhdGhzeyRmb3Jrc19wYXRofSsrOworCQkJfQorCQl9CisJCWNsb3NlICRmZDsKKwl9CisJcmV0dXJuIEBsaXN0OworfQorCitvdXIgJGdpdHdlYl9wcm9qZWN0X293bmVyID0gdW5kZWY7CitzdWIgZ2l0X2dldF9wcm9qZWN0X2xpc3RfZnJvbV9maWxlIHsKKworCXJldHVybiBpZiAoZGVmaW5lZCAkZ2l0d2ViX3Byb2plY3Rfb3duZXIpOworCisJJGdpdHdlYl9wcm9qZWN0X293bmVyID0ge307CisJIyByZWFkIGZyb20gZmlsZSAodXJsLWVuY29kZWQpOgorCSMgJ2dpdCUyRmdpdC5naXQgTGludXMrVG9ydmFsZHMnCisJIyAnbGlicyUyRmtsaWJjJTJGa2xpYmMuZ2l0IEguK1BldGVyK0FudmluJworCSMgJ2xpbnV4JTJGaG90cGx1ZyUyRnVkZXYuZ2l0IEdyZWcrS3JvYWgtSGFydG1hbicKKwlpZiAoLWYgJHByb2plY3RzX2xpc3QpIHsKKwkJb3BlbiAobXkgJGZkICwgJHByb2plY3RzX2xpc3QpOworCQl3aGlsZSAobXkgJGxpbmUgPSA8JGZkPikgeworCQkJY2hvbXAgJGxpbmU7CisJCQlteSAoJHByLCAkb3cpID0gc3BsaXQgJyAnLCAkbGluZTsKKwkJCSRwciA9IHVuZXNjYXBlKCRwcik7CisJCQkkb3cgPSB1bmVzY2FwZSgkb3cpOworCQkJJGdpdHdlYl9wcm9qZWN0X293bmVyLT57JHByfSA9IHRvX3V0ZjgoJG93KTsKKwkJfQorCQljbG9zZSAkZmQ7CisJfQorfQorCitzdWIgZ2l0X2dldF9wcm9qZWN0X293bmVyIHsKKwlteSAkcHJvamVjdCA9IHNoaWZ0OworCW15ICRvd25lcjsKKworCXJldHVybiB1bmRlZiB1bmxlc3MgJHByb2plY3Q7CisJJGdpdF9kaXIgPSAiJHByb2plY3Ryb290LyRwcm9qZWN0IjsKKworCWlmICghZGVmaW5lZCAkZ2l0d2ViX3Byb2plY3Rfb3duZXIpIHsKKwkJZ2l0X2dldF9wcm9qZWN0X2xpc3RfZnJvbV9maWxlKCk7CisJfQorCisJaWYgKGV4aXN0cyAkZ2l0d2ViX3Byb2plY3Rfb3duZXItPnskcHJvamVjdH0pIHsKKwkJJG93bmVyID0gJGdpdHdlYl9wcm9qZWN0X293bmVyLT57JHByb2plY3R9OworCX0KKwlpZiAoIWRlZmluZWQgJG93bmVyKXsKKwkJJG93bmVyID0gZ2l0X2dldF9wcm9qZWN0X2NvbmZpZygnb3duZXInKTsKKwl9CisJaWYgKCFkZWZpbmVkICRvd25lcikgeworCQkkb3duZXIgPSBnZXRfZmlsZV9vd25lcigiJGdpdF9kaXIiKTsKKwl9CisKKwlyZXR1cm4gJG93bmVyOworfQorCitzdWIgZ2l0X2dldF9sYXN0X2FjdGl2aXR5IHsKKwlteSAoJHBhdGgpID0gQF87CisJbXkgJGZkOworCisJJGdpdF9kaXIgPSAiJHByb2plY3Ryb290LyRwYXRoIjsKKwlvcGVuKCRmZCwgIi18IiwgZ2l0X2NtZCgpLCAnZm9yLWVhY2gtcmVmJywKKwkgICAgICctLWZvcm1hdD0lKGNvbW1pdHRlciknLAorCSAgICAgJy0tc29ydD0tY29tbWl0dGVyZGF0ZScsCisJICAgICAnLS1jb3VudD0xJywKKwkgICAgICdyZWZzL2hlYWRzJykgb3IgcmV0dXJuOworCW15ICRtb3N0X3JlY2VudCA9IDwkZmQ+OworCWNsb3NlICRmZCBvciByZXR1cm47CisJaWYgKGRlZmluZWQgJG1vc3RfcmVjZW50ICYmCisJICAgICRtb3N0X3JlY2VudCA9fiAvIChcZCspIFstK11bMDFdXGRcZFxkJC8pIHsKKwkJbXkgJHRpbWVzdGFtcCA9ICQxOworCQlteSAkYWdlID0gdGltZSAtICR0aW1lc3RhbXA7CisJCXJldHVybiAoJGFnZSwgYWdlX3N0cmluZygkYWdlKSk7CisJfQorCXJldHVybiAodW5kZWYsIHVuZGVmKTsKK30KKworc3ViIGdpdF9nZXRfcmVmZXJlbmNlcyB7CisJbXkgJHR5cGUgPSBzaGlmdCB8fCAiIjsKKwlteSAlcmVmczsKKwkjIDVkYzAxYzU5NWU2YzZlYzljY2RhNGY2ZjY5YzEzMWMwZGQ5NDVmOGMgcmVmcy90YWdzL3YyLjYuMTEKKwkjIGMzOWFlMDdmMzkzODA2Y2NmNDA2ZWY5NjZlOWExNWFmYzQzY2MzNmEgcmVmcy90YWdzL3YyLjYuMTFee30KKwlvcGVuIG15ICRmZCwgIi18IiwgZ2l0X2NtZCgpLCAic2hvdy1yZWYiLCAiLS1kZXJlZmVyZW5jZSIsCisJCSgkdHlwZSA/ICgiLS0iLCAicmVmcy8kdHlwZSIpIDogKCkpICMgdXNlIC0tIDxwYXR0ZXJuPiBpZiAkdHlwZQorCQlvciByZXR1cm47CisKKwl3aGlsZSAobXkgJGxpbmUgPSA8JGZkPikgeworCQljaG9tcCAkbGluZTsKKwkJaWYgKCRsaW5lID1+IG0hXihbMC05YS1mQS1GXXs0MH0pXHNyZWZzLygkdHlwZS8/W15eXSspISkgeworCQkJaWYgKGRlZmluZWQgJHJlZnN7JDF9KSB7CisJCQkJcHVzaCBAeyRyZWZzeyQxfX0sICQyOworCQkJfSBlbHNlIHsKKwkJCQkkcmVmc3skMX0gPSBbICQyIF07CisJCQl9CisJCX0KKwl9CisJY2xvc2UgJGZkIG9yIHJldHVybjsKKwlyZXR1cm4gXCVyZWZzOworfQorCitzdWIgZ2l0X2dldF9yZXZfbmFtZV90YWdzIHsKKwlteSAkaGFzaCA9IHNoaWZ0IHx8IHJldHVybiB1bmRlZjsKKworCW9wZW4gbXkgJGZkLCAiLXwiLCBnaXRfY21kKCksICJuYW1lLXJldiIsICItLXRhZ3MiLCAkaGFzaAorCQlvciByZXR1cm47CisJbXkgJG5hbWVfcmV2ID0gPCRmZD47CisJY2xvc2UgJGZkOworCisJaWYgKCRuYW1lX3JldiA9fiBtfF4kaGFzaCB0YWdzLyguKikkfCkgeworCQlyZXR1cm4gJDE7CisJfSBlbHNlIHsKKwkJIyBjYXRjaGVzIGFsc28gJyRoYXNoIHVuZGVmaW5lZCcgb3V0cHV0CisJCXJldHVybiB1bmRlZjsKKwl9Cit9CisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIHBhcnNlIHRvIGhhc2ggZnVuY3Rpb25zCisKK3N1YiBwYXJzZV9kYXRlIHsKKwlteSAkZXBvY2ggPSBzaGlmdDsKKwlteSAkdHogPSBzaGlmdCB8fCAiLTAwMDAiOworCisJbXkgJWRhdGU7CisJbXkgQG1vbnRocyA9ICgiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiKTsKKwlteSBAZGF5cyA9ICgiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0Iik7CisJbXkgKCRzZWMsICRtaW4sICRob3VyLCAkbWRheSwgJG1vbiwgJHllYXIsICR3ZGF5LCAkeWRheSkgPSBnbXRpbWUoJGVwb2NoKTsKKwkkZGF0ZXsnaG91cid9ID0gJGhvdXI7CisJJGRhdGV7J21pbnV0ZSd9ID0gJG1pbjsKKwkkZGF0ZXsnbWRheSd9ID0gJG1kYXk7CisJJGRhdGV7J2RheSd9ID0gJGRheXNbJHdkYXldOworCSRkYXRleydtb250aCd9ID0gJG1vbnRoc1skbW9uXTsKKwkkZGF0ZXsncmZjMjgyMid9ICAgPSBzcHJpbnRmICIlcywgJWQgJXMgJTRkICUwMmQ6JTAyZDolMDJkICswMDAwIiwKKwkgICAgICAgICAgICAgICAgICAgICAkZGF5c1skd2RheV0sICRtZGF5LCAkbW9udGhzWyRtb25dLCAxOTAwKyR5ZWFyLCAkaG91ciAsJG1pbiwgJHNlYzsKKwkkZGF0ZXsnbWRheS10aW1lJ30gPSBzcHJpbnRmICIlZCAlcyAlMDJkOiUwMmQiLAorCSAgICAgICAgICAgICAgICAgICAgICRtZGF5LCAkbW9udGhzWyRtb25dLCAkaG91ciAsJG1pbjsKKwkkZGF0ZXsnaXNvLTg2MDEnfSAgPSBzcHJpbnRmICIlMDRkLSUwMmQtJTAyZFQlMDJkOiUwMmQ6JTAyZFoiLAorCSAgICAgICAgICAgICAgICAgICAgIDE5MDArJHllYXIsIDErJG1vbiwgJG1kYXksICRob3VyICwkbWluLCAkc2VjOworCisJJHR6ID1+IG0vXihbK1wtXVswLTldWzAtOV0pKFswLTldWzAtOV0pJC87CisJbXkgJGxvY2FsID0gJGVwb2NoICsgKChpbnQgJDEgKyAoJDIvNjApKSAqIDM2MDApOworCSgkc2VjLCAkbWluLCAkaG91ciwgJG1kYXksICRtb24sICR5ZWFyLCAkd2RheSwgJHlkYXkpID0gZ210aW1lKCRsb2NhbCk7CisJJGRhdGV7J2hvdXJfbG9jYWwnfSA9ICRob3VyOworCSRkYXRleydtaW51dGVfbG9jYWwnfSA9ICRtaW47CisJJGRhdGV7J3R6X2xvY2FsJ30gPSAkdHo7CisJJGRhdGV7J2lzby10eid9ID0gc3ByaW50ZigiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQgJXMiLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgMTkwMCskeWVhciwgJG1vbisxLCAkbWRheSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICRob3VyLCAkbWluLCAkc2VjLCAkdHopOworCXJldHVybiAlZGF0ZTsKK30KKworc3ViIHBhcnNlX3RhZyB7CisJbXkgJHRhZ19pZCA9IHNoaWZ0OworCW15ICV0YWc7CisJbXkgQGNvbW1lbnQ7CisKKwlvcGVuIG15ICRmZCwgIi18IiwgZ2l0X2NtZCgpLCAiY2F0LWZpbGUiLCAidGFnIiwgJHRhZ19pZCBvciByZXR1cm47CisJJHRhZ3snaWQnfSA9ICR0YWdfaWQ7CisJd2hpbGUgKG15ICRsaW5lID0gPCRmZD4pIHsKKwkJY2hvbXAgJGxpbmU7CisJCWlmICgkbGluZSA9fiBtL15vYmplY3QgKFswLTlhLWZBLUZdezQwfSkkLykgeworCQkJJHRhZ3snb2JqZWN0J30gPSAkMTsKKwkJfSBlbHNpZiAoJGxpbmUgPX4gbS9edHlwZSAoLispJC8pIHsKKwkJCSR0YWd7J3R5cGUnfSA9ICQxOworCQl9IGVsc2lmICgkbGluZSA9fiBtL150YWcgKC4rKSQvKSB7CisJCQkkdGFneyduYW1lJ30gPSAkMTsKKwkJfSBlbHNpZiAoJGxpbmUgPX4gbS9edGFnZ2VyICguKikgKFswLTldKykgKC4qKSQvKSB7CisJCQkkdGFneydhdXRob3InfSA9ICQxOworCQkJJHRhZ3snZXBvY2gnfSA9ICQyOworCQkJJHRhZ3sndHonfSA9ICQzOworCQl9IGVsc2lmICgkbGluZSA9fiBtLy0tQkVHSU4vKSB7CisJCQlwdXNoIEBjb21tZW50LCAkbGluZTsKKwkJCWxhc3Q7CisJCX0gZWxzaWYgKCRsaW5lIGVxICIiKSB7CisJCQlsYXN0OworCQl9CisJfQorCXB1c2ggQGNvbW1lbnQsIDwkZmQ+OworCSR0YWd7J2NvbW1lbnQnfSA9IFxAY29tbWVudDsKKwljbG9zZSAkZmQgb3IgcmV0dXJuOworCWlmICghZGVmaW5lZCAkdGFneyduYW1lJ30pIHsKKwkJcmV0dXJuCisJfTsKKwlyZXR1cm4gJXRhZworfQorCitzdWIgcGFyc2VfY29tbWl0X3RleHQgeworCW15ICgkY29tbWl0X3RleHQsICR3aXRocGFyZW50cykgPSBAXzsKKwlteSBAY29tbWl0X2xpbmVzID0gc3BsaXQgJ1xuJywgJGNvbW1pdF90ZXh0OworCW15ICVjbzsKKworCXBvcCBAY29tbWl0X2xpbmVzOyAjIFJlbW92ZSAnXDAnCisKKwlpZiAoISBAY29tbWl0X2xpbmVzKSB7CisJCXJldHVybjsKKwl9CisKKwlteSAkaGVhZGVyID0gc2hpZnQgQGNvbW1pdF9saW5lczsKKwlpZiAoJGhlYWRlciAhfiBtL15bMC05YS1mQS1GXXs0MH0vKSB7CisJCXJldHVybjsKKwl9CisJKCRjb3snaWQnfSwgbXkgQHBhcmVudHMpID0gc3BsaXQgJyAnLCAkaGVhZGVyOworCXdoaWxlIChteSAkbGluZSA9IHNoaWZ0IEBjb21taXRfbGluZXMpIHsKKwkJbGFzdCBpZiAkbGluZSBlcSAiXG4iOworCQlpZiAoJGxpbmUgPX4gbS9edHJlZSAoWzAtOWEtZkEtRl17NDB9KSQvKSB7CisJCQkkY297J3RyZWUnfSA9ICQxOworCQl9IGVsc2lmICgoIWRlZmluZWQgJHdpdGhwYXJlbnRzKSAmJiAoJGxpbmUgPX4gbS9ecGFyZW50IChbMC05YS1mQS1GXXs0MH0pJC8pKSB7CisJCQlwdXNoIEBwYXJlbnRzLCAkMTsKKwkJfSBlbHNpZiAoJGxpbmUgPX4gbS9eYXV0aG9yICguKikgKFswLTldKykgKC4qKSQvKSB7CisJCQkkY297J2F1dGhvcid9ID0gJDE7CisJCQkkY297J2F1dGhvcl9lcG9jaCd9ID0gJDI7CisJCQkkY297J2F1dGhvcl90eid9ID0gJDM7CisJCQlpZiAoJGNveydhdXRob3InfSA9fiBtL14oW148XSspIDwoW14+XSopPi8pIHsKKwkJCQkkY297J2F1dGhvcl9uYW1lJ30gID0gJDE7CisJCQkJJGNveydhdXRob3JfZW1haWwnfSA9ICQyOworCQkJfSBlbHNlIHsKKwkJCQkkY297J2F1dGhvcl9uYW1lJ30gPSAkY297J2F1dGhvcid9OworCQkJfQorCQl9IGVsc2lmICgkbGluZSA9fiBtL15jb21taXR0ZXIgKC4qKSAoWzAtOV0rKSAoLiopJC8pIHsKKwkJCSRjb3snY29tbWl0dGVyJ30gPSAkMTsKKwkJCSRjb3snY29tbWl0dGVyX2Vwb2NoJ30gPSAkMjsKKwkJCSRjb3snY29tbWl0dGVyX3R6J30gPSAkMzsKKwkJCSRjb3snY29tbWl0dGVyX25hbWUnfSA9ICRjb3snY29tbWl0dGVyJ307CisJCQlpZiAoJGNveydjb21taXR0ZXInfSA9fiBtL14oW148XSspIDwoW14+XSopPi8pIHsKKwkJCQkkY297J2NvbW1pdHRlcl9uYW1lJ30gID0gJDE7CisJCQkJJGNveydjb21taXR0ZXJfZW1haWwnfSA9ICQyOworCQkJfSBlbHNlIHsKKwkJCQkkY297J2NvbW1pdHRlcl9uYW1lJ30gPSAkY297J2NvbW1pdHRlcid9OworCQkJfQorCQl9CisJfQorCWlmICghZGVmaW5lZCAkY297J3RyZWUnfSkgeworCQlyZXR1cm47CisJfTsKKwkkY297J3BhcmVudHMnfSA9IFxAcGFyZW50czsKKwkkY297J3BhcmVudCd9ID0gJHBhcmVudHNbMF07CisKKwlmb3JlYWNoIG15ICR0aXRsZSAoQGNvbW1pdF9saW5lcykgeworCQkkdGl0bGUgPX4gcy9eICAgIC8vOworCQlpZiAoJHRpdGxlIG5lICIiKSB7CisJCQkkY297J3RpdGxlJ30gPSBjaG9wX3N0cigkdGl0bGUsIDgwLCA1KTsKKwkJCSMgcmVtb3ZlIGxlYWRpbmcgc3R1ZmYgb2YgbWVyZ2VzIHRvIG1ha2UgdGhlIGludGVyZXN0aW5nIHBhcnQgdmlzaWJsZQorCQkJaWYgKGxlbmd0aCgkdGl0bGUpID4gNTApIHsKKwkJCQkkdGl0bGUgPX4gcy9eQXV0b21hdGljIC8vOworCQkJCSR0aXRsZSA9fiBzL15tZXJnZSAob2Z8d2l0aCkgL01lcmdlIC4uLiAvaTsKKwkJCQlpZiAobGVuZ3RoKCR0aXRsZSkgPiA1MCkgeworCQkJCQkkdGl0bGUgPX4gcy8oaHR0cHxyc3luYyk6XC9cLy8vOworCQkJCX0KKwkJCQlpZiAobGVuZ3RoKCR0aXRsZSkgPiA1MCkgeworCQkJCQkkdGl0bGUgPX4gcy8obWFzdGVyfHd3d3xyc3luYylcLi8vOworCQkJCX0KKwkJCQlpZiAobGVuZ3RoKCR0aXRsZSkgPiA1MCkgeworCQkJCQkkdGl0bGUgPX4gcy9rZXJuZWwub3JnOj8vLzsKKwkJCQl9CisJCQkJaWYgKGxlbmd0aCgkdGl0bGUpID4gNTApIHsKKwkJCQkJJHRpdGxlID1+IHMvXC9wdWJcL3NjbS8vOworCQkJCX0KKwkJCX0KKwkJCSRjb3sndGl0bGVfc2hvcnQnfSA9IGNob3Bfc3RyKCR0aXRsZSwgNTAsIDUpOworCQkJbGFzdDsKKwkJfQorCX0KKwlpZiAoJGNveyd0aXRsZSd9IGVxICIiKSB7CisJCSRjb3sndGl0bGUnfSA9ICRjb3sndGl0bGVfc2hvcnQnfSA9ICcobm8gY29tbWl0IG1lc3NhZ2UpJzsKKwl9CisJIyByZW1vdmUgYWRkZWQgc3BhY2VzCisJZm9yZWFjaCBteSAkbGluZSAoQGNvbW1pdF9saW5lcykgeworCQkkbGluZSA9fiBzL14gICAgLy87CisJfQorCSRjb3snY29tbWVudCd9ID0gXEBjb21taXRfbGluZXM7CisKKwlteSAkYWdlID0gdGltZSAtICRjb3snY29tbWl0dGVyX2Vwb2NoJ307CisJJGNveydhZ2UnfSA9ICRhZ2U7CisJJGNveydhZ2Vfc3RyaW5nJ30gPSBhZ2Vfc3RyaW5nKCRhZ2UpOworCW15ICgkc2VjLCAkbWluLCAkaG91ciwgJG1kYXksICRtb24sICR5ZWFyLCAkd2RheSwgJHlkYXkpID0gZ210aW1lKCRjb3snY29tbWl0dGVyX2Vwb2NoJ30pOworCWlmICgkYWdlID4gNjAqNjAqMjQqNyoyKSB7CisJCSRjb3snYWdlX3N0cmluZ19kYXRlJ30gPSBzcHJpbnRmICIlNGktJTAydS0lMDJpIiwgMTkwMCArICR5ZWFyLCAkbW9uKzEsICRtZGF5OworCQkkY297J2FnZV9zdHJpbmdfYWdlJ30gPSAkY297J2FnZV9zdHJpbmcnfTsKKwl9IGVsc2UgeworCQkkY297J2FnZV9zdHJpbmdfZGF0ZSd9ID0gJGNveydhZ2Vfc3RyaW5nJ307CisJCSRjb3snYWdlX3N0cmluZ19hZ2UnfSA9IHNwcmludGYgIiU0aS0lMDJ1LSUwMmkiLCAxOTAwICsgJHllYXIsICRtb24rMSwgJG1kYXk7CisJfQorCXJldHVybiAlY287Cit9CisKK3N1YiBwYXJzZV9jb21taXQgeworCW15ICgkY29tbWl0X2lkKSA9IEBfOworCW15ICVjbzsKKworCWxvY2FsICQvID0gIlwwIjsKKworCW9wZW4gbXkgJGZkLCAiLXwiLCBnaXRfY21kKCksICJyZXYtbGlzdCIsCisJCSItLXBhcmVudHMiLAorCQkiLS1oZWFkZXIiLAorCQkiLS1tYXgtY291bnQ9MSIsCisJCSRjb21taXRfaWQsCisJCSItLSIsCisJCW9yIGRpZV9lcnJvcih1bmRlZiwgIk9wZW4gZ2l0LXJldi1saXN0IGZhaWxlZCIpOworCSVjbyA9IHBhcnNlX2NvbW1pdF90ZXh0KDwkZmQ+LCAxKTsKKwljbG9zZSAkZmQ7CisKKwlyZXR1cm4gJWNvOworfQorCitzdWIgcGFyc2VfY29tbWl0cyB7CisJbXkgKCRjb21taXRfaWQsICRtYXhjb3VudCwgJHNraXAsICRmaWxlbmFtZSwgQGFyZ3MpID0gQF87CisJbXkgQGNvczsKKworCSRtYXhjb3VudCB8fD0gMTsKKwkkc2tpcCB8fD0gMDsKKworCWxvY2FsICQvID0gIlwwIjsKKworCW9wZW4gbXkgJGZkLCAiLXwiLCBnaXRfY21kKCksICJyZXYtbGlzdCIsCisJCSItLWhlYWRlciIsCisJCUBhcmdzLAorCQkoIi0tbWF4LWNvdW50PSIgLiAkbWF4Y291bnQpLAorCQkoIi0tc2tpcD0iIC4gJHNraXApLAorCQlAZXh0cmFfb3B0aW9ucywKKwkJJGNvbW1pdF9pZCwKKwkJIi0tIiwKKwkJKCRmaWxlbmFtZSA/ICgkZmlsZW5hbWUpIDogKCkpCisJCW9yIGRpZV9lcnJvcih1bmRlZiwgIk9wZW4gZ2l0LXJldi1saXN0IGZhaWxlZCIpOworCXdoaWxlIChteSAkbGluZSA9IDwkZmQ+KSB7CisJCW15ICVjbyA9IHBhcnNlX2NvbW1pdF90ZXh0KCRsaW5lKTsKKwkJcHVzaCBAY29zLCBcJWNvOworCX0KKwljbG9zZSAkZmQ7CisKKwlyZXR1cm4gd2FudGFycmF5ID8gQGNvcyA6IFxAY29zOworfQorCisjIHBhcnNlIHJlZiBmcm9tIHJlZl9maWxlLCBnaXZlbiBieSByZWZfaWQsIHdpdGggZ2l2ZW4gdHlwZQorc3ViIHBhcnNlX3JlZiB7CisJbXkgJHJlZl9maWxlID0gc2hpZnQ7CisJbXkgJHJlZl9pZCA9IHNoaWZ0OworCW15ICR0eXBlID0gc2hpZnQgfHwgZ2l0X2dldF90eXBlKCRyZWZfaWQpOworCW15ICVyZWZfaXRlbTsKKworCSRyZWZfaXRlbXsndHlwZSd9ID0gJHR5cGU7CisJJHJlZl9pdGVteydpZCd9ID0gJHJlZl9pZDsKKwkkcmVmX2l0ZW17J2Vwb2NoJ30gPSAwOworCSRyZWZfaXRlbXsnYWdlJ30gPSAidW5rbm93biI7CisJaWYgKCR0eXBlIGVxICJ0YWciKSB7CisJCW15ICV0YWcgPSBwYXJzZV90YWcoJHJlZl9pZCk7CisJCSRyZWZfaXRlbXsnY29tbWVudCd9ID0gJHRhZ3snY29tbWVudCd9OworCQlpZiAoJHRhZ3sndHlwZSd9IGVxICJjb21taXQiKSB7CisJCQlteSAlY28gPSBwYXJzZV9jb21taXQoJHRhZ3snb2JqZWN0J30pOworCQkJJHJlZl9pdGVteydlcG9jaCd9ID0gJGNveydjb21taXR0ZXJfZXBvY2gnfTsKKwkJCSRyZWZfaXRlbXsnYWdlJ30gPSAkY297J2FnZV9zdHJpbmcnfTsKKwkJfSBlbHNpZiAoZGVmaW5lZCgkdGFneydlcG9jaCd9KSkgeworCQkJbXkgJGFnZSA9IHRpbWUgLSAkdGFneydlcG9jaCd9OworCQkJJHJlZl9pdGVteydlcG9jaCd9ID0gJHRhZ3snZXBvY2gnfTsKKwkJCSRyZWZfaXRlbXsnYWdlJ30gPSBhZ2Vfc3RyaW5nKCRhZ2UpOworCQl9CisJCSRyZWZfaXRlbXsncmVmdHlwZSd9ID0gJHRhZ3sndHlwZSd9OworCQkkcmVmX2l0ZW17J25hbWUnfSA9ICR0YWd7J25hbWUnfTsKKwkJJHJlZl9pdGVteydyZWZpZCd9ID0gJHRhZ3snb2JqZWN0J307CisJfSBlbHNpZiAoJHR5cGUgZXEgImNvbW1pdCIpeworCQlteSAlY28gPSBwYXJzZV9jb21taXQoJHJlZl9pZCk7CisJCSRyZWZfaXRlbXsncmVmdHlwZSd9ID0gImNvbW1pdCI7CisJCSRyZWZfaXRlbXsnbmFtZSd9ID0gJHJlZl9maWxlOworCQkkcmVmX2l0ZW17J3RpdGxlJ30gPSAkY297J3RpdGxlJ307CisJCSRyZWZfaXRlbXsncmVmaWQnfSA9ICRyZWZfaWQ7CisJCSRyZWZfaXRlbXsnZXBvY2gnfSA9ICRjb3snY29tbWl0dGVyX2Vwb2NoJ307CisJCSRyZWZfaXRlbXsnYWdlJ30gPSAkY297J2FnZV9zdHJpbmcnfTsKKwl9IGVsc2UgeworCQkkcmVmX2l0ZW17J3JlZnR5cGUnfSA9ICR0eXBlOworCQkkcmVmX2l0ZW17J25hbWUnfSA9ICRyZWZfZmlsZTsKKwkJJHJlZl9pdGVteydyZWZpZCd9ID0gJHJlZl9pZDsKKwl9CisKKwlyZXR1cm4gJXJlZl9pdGVtOworfQorCisjIHBhcnNlIGxpbmUgb2YgZ2l0LWRpZmYtdHJlZSAicmF3IiBvdXRwdXQKK3N1YiBwYXJzZV9kaWZmdHJlZV9yYXdfbGluZSB7CisJbXkgJGxpbmUgPSBzaGlmdDsKKwlteSAlcmVzOworCisJIyAnOjEwMDY0NCAxMDA2NDQgMDNiMjE4MjYwZTk5Yjc4YzZkZjBlZDM3OGU1OWVkOTIwNWNjYzk2ZCAzYjkzZDVlN2NjN2Y3ZGQ0ZWJlZDEzYTVjYzFhNGFkOTc2ZmM5NGQ4IE0JbHMtZmlsZXMuYycKKwkjICc6MTAwNjQ0IDEwMDY0NCA3ZjkyODE5ODUwODY5NzFkMzg3N2FjYTI3NzA0ZjJhYWY5YzQ0OGNlIGJjMTkwZWJjNzFiYmQ5MjNmMmI3MjhlNTA1NDA4ZjVlNTRiZDA3M2EgTQlyZXYtdHJlZS5jJworCWlmICgkbGluZSA9fiBtL146KFswLTddezZ9KSAoWzAtN117Nn0pIChbMC05YS1mQS1GXXs0MH0pIChbMC05YS1mQS1GXXs0MH0pICguKShbMC05XXswLDN9KVx0KC4qKSQvKSB7CisJCSRyZXN7J2Zyb21fbW9kZSd9ID0gJDE7CisJCSRyZXN7J3RvX21vZGUnfSA9ICQyOworCQkkcmVzeydmcm9tX2lkJ30gPSAkMzsKKwkJJHJlc3sndG9faWQnfSA9ICQ0OworCQkkcmVzeydzdGF0dXMnfSA9ICQ1OworCQkkcmVzeydzaW1pbGFyaXR5J30gPSAkNjsKKwkJaWYgKCRyZXN7J3N0YXR1cyd9IGVxICdSJyB8fCAkcmVzeydzdGF0dXMnfSBlcSAnQycpIHsgIyByZW5hbWVkIG9yIGNvcGllZAorCQkJKCRyZXN7J2Zyb21fZmlsZSd9LCAkcmVzeyd0b19maWxlJ30pID0gbWFwIHsgdW5xdW90ZSgkXykgfSBzcGxpdCgiXHQiLCAkNyk7CisJCX0gZWxzZSB7CisJCQkkcmVzeydmcm9tX2ZpbGUnfSA9ICRyZXN7J3RvX2ZpbGUnfSA9ICRyZXN7J2ZpbGUnfSA9IHVucXVvdGUoJDcpOworCQl9CisJfQorCSMgJzo6MTAwNzU1IDEwMDc1NSAxMDA3NTUgNjBlNzljYTFiMDFiYzhiMDU3YWJlMTdkZGFiNDg0Njk5YTdmNWZkYiA5NDA2N2NjNWY3MzM4OGYzMzcyMmQ1MmFlMDJmNDQ2OTJiYzA3NDkwIDk0MDY3Y2M1ZjczMzg4ZjMzNzIyZDUyYWUwMmY0NDY5MmJjMDc0OTAgTVIJZ2l0LWd1aS9naXQtZ3VpLnNoJworCSMgY29tYmluZWQgZGlmZiAoZm9yIG1lcmdlIGNvbW1pdCkKKwllbHNpZiAoJGxpbmUgPX4gcy9eKDo6KykoKD86WzAtN117Nn0gKSspKCg/OlswLTlhLWZBLUZdezQwfSApKykoW2EtekEtWl0rKVx0KC4qKSQvLykgeworCQkkcmVzeyducGFyZW50cyd9ICA9IGxlbmd0aCgkMSk7CisJCSRyZXN7J2Zyb21fbW9kZSd9ID0gWyBzcGxpdCgnICcsICQyKSBdOworCQkkcmVzeyd0b19tb2RlJ30gPSBwb3AgQHskcmVzeydmcm9tX21vZGUnfX07CisJCSRyZXN7J2Zyb21faWQnfSA9IFsgc3BsaXQoJyAnLCAkMykgXTsKKwkJJHJlc3sndG9faWQnfSA9IHBvcCBAeyRyZXN7J2Zyb21faWQnfX07CisJCSRyZXN7J3N0YXR1cyd9ID0gWyBzcGxpdCgnJywgJDQpIF07CisJCSRyZXN7J3RvX2ZpbGUnfSA9IHVucXVvdGUoJDUpOworCX0KKwkjICdjNTEyYjUyMzQ3MjQ4NWFlZjRmZmY5ZTU3YjIyOWQ5ZDI0M2M5NjdmJworCWVsc2lmICgkbGluZSA9fiBtL14oWzAtOWEtZkEtRl17NDB9KSQvKSB7CisJCSRyZXN7J2NvbW1pdCd9ID0gJDE7CisJfQorCisJcmV0dXJuIHdhbnRhcnJheSA/ICVyZXMgOiBcJXJlczsKK30KKworIyB3cmFwcGVyOiByZXR1cm4gcGFyc2VkIGxpbmUgb2YgZ2l0LWRpZmYtdHJlZSAicmF3IiBvdXRwdXQKKyMgKHRoZSBhcmd1bWVudCBtaWdodCBiZSByYXcgbGluZSwgb3IgcGFyc2VkIGluZm8pCitzdWIgcGFyc2VkX2RpZmZ0cmVlX2xpbmUgeworCW15ICRsaW5lX29yX3JlZiA9IHNoaWZ0OworCisJaWYgKHJlZigkbGluZV9vcl9yZWYpIGVxICJIQVNIIikgeworCQkjIHByZS1wYXJzZWQgKG9yIGdlbmVyYXRlZCBieSBoYW5kKQorCQlyZXR1cm4gJGxpbmVfb3JfcmVmOworCX0gZWxzZSB7CisJCXJldHVybiBwYXJzZV9kaWZmdHJlZV9yYXdfbGluZSgkbGluZV9vcl9yZWYpOworCX0KK30KKworIyBwYXJzZSBsaW5lIG9mIGdpdC1scy10cmVlIG91dHB1dAorc3ViIHBhcnNlX2xzX3RyZWVfbGluZSAoJDslKSB7CisJbXkgJGxpbmUgPSBzaGlmdDsKKwlteSAlb3B0cyA9IEBfOworCW15ICVyZXM7CisKKwkjJzEwMDY0NCBibG9iIDBmYTNmM2E2NmZiNmExMzdmNmVjMmMxOTM1MWVkNGQ4MDcwNzBmZmEJcGFuaWMuYycKKwkkbGluZSA9fiBtL14oWzAtOV0rKSAoLispIChbMC05YS1mQS1GXXs0MH0pXHQoLispJC9zOworCisJJHJlc3snbW9kZSd9ID0gJDE7CisJJHJlc3sndHlwZSd9ID0gJDI7CisJJHJlc3snaGFzaCd9ID0gJDM7CisJaWYgKCRvcHRzeycteid9KSB7CisJCSRyZXN7J25hbWUnfSA9ICQ0OworCX0gZWxzZSB7CisJCSRyZXN7J25hbWUnfSA9IHVucXVvdGUoJDQpOworCX0KKworCXJldHVybiB3YW50YXJyYXkgPyAlcmVzIDogXCVyZXM7Cit9CisKKyMgZ2VuZXJhdGVzIF90d29fIGhhc2hlcywgcmVmZXJlbmNlcyB0byB3aGljaCBhcmUgcGFzc2VkIGFzIDIgYW5kIDMgYXJndW1lbnQKK3N1YiBwYXJzZV9mcm9tX3RvX2RpZmZpbmZvIHsKKwlteSAoJGRpZmZpbmZvLCAkZnJvbSwgJHRvLCBAcGFyZW50cykgPSBAXzsKKworCWlmICgkZGlmZmluZm8tPnsnbnBhcmVudHMnfSkgeworCQkjIGNvbWJpbmVkIGRpZmYKKwkJJGZyb20tPnsnZmlsZSd9ID0gW107CisJCSRmcm9tLT57J2hyZWYnfSA9IFtdOworCQlmaWxsX2Zyb21fZmlsZV9pbmZvKCRkaWZmaW5mbywgQHBhcmVudHMpCisJCQl1bmxlc3MgZXhpc3RzICRkaWZmaW5mby0+eydmcm9tX2ZpbGUnfTsKKwkJZm9yIChteSAkaSA9IDA7ICRpIDwgJGRpZmZpbmZvLT57J25wYXJlbnRzJ307ICRpKyspIHsKKwkJCSRmcm9tLT57J2ZpbGUnfVskaV0gPQorCQkJCWRlZmluZWQgJGRpZmZpbmZvLT57J2Zyb21fZmlsZSd9WyRpXSA/CisJCQkJICAgICAgICAkZGlmZmluZm8tPnsnZnJvbV9maWxlJ31bJGldIDoKKwkJCQkgICAgICAgICRkaWZmaW5mby0+eyd0b19maWxlJ307CisJCQlpZiAoJGRpZmZpbmZvLT57J3N0YXR1cyd9WyRpXSBuZSAiQSIpIHsgIyBub3QgbmV3IChhZGRlZCkgZmlsZQorCQkJCSRmcm9tLT57J2hyZWYnfVskaV0gPSBocmVmKGFjdGlvbj0+ImJsb2IiLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfYmFzZT0+JHBhcmVudHNbJGldLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2g9PiRkaWZmaW5mby0+eydmcm9tX2lkJ31bJGldLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZT0+JGZyb20tPnsnZmlsZSd9WyRpXSk7CisJCQl9IGVsc2UgeworCQkJCSRmcm9tLT57J2hyZWYnfVskaV0gPSB1bmRlZjsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCSMgb3JkaW5hcnkgKG5vdCBjb21iaW5lZCkgZGlmZgorCQkkZnJvbS0+eydmaWxlJ30gPSAkZGlmZmluZm8tPnsnZnJvbV9maWxlJ307CisJCWlmICgkZGlmZmluZm8tPnsnc3RhdHVzJ30gbmUgIkEiKSB7ICMgbm90IG5ldyAoYWRkZWQpIGZpbGUKKwkJCSRmcm9tLT57J2hyZWYnfSA9IGhyZWYoYWN0aW9uPT4iYmxvYiIsIGhhc2hfYmFzZT0+JGhhc2hfcGFyZW50LAorCQkJICAgICAgICAgICAgICAgICAgICAgICBoYXNoPT4kZGlmZmluZm8tPnsnZnJvbV9pZCd9LAorCQkJICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiRmcm9tLT57J2ZpbGUnfSk7CisJCX0gZWxzZSB7CisJCQlkZWxldGUgJGZyb20tPnsnaHJlZid9OworCQl9CisJfQorCisJJHRvLT57J2ZpbGUnfSA9ICRkaWZmaW5mby0+eyd0b19maWxlJ307CisJaWYgKCFpc19kZWxldGVkKCRkaWZmaW5mbykpIHsgIyBmaWxlIGV4aXN0cyBpbiByZXN1bHQKKwkJJHRvLT57J2hyZWYnfSA9IGhyZWYoYWN0aW9uPT4iYmxvYiIsIGhhc2hfYmFzZT0+JGhhc2gsCisJCSAgICAgICAgICAgICAgICAgICAgIGhhc2g9PiRkaWZmaW5mby0+eyd0b19pZCd9LAorCQkgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiR0by0+eydmaWxlJ30pOworCX0gZWxzZSB7CisJCWRlbGV0ZSAkdG8tPnsnaHJlZid9OworCX0KK30KKworIyMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorIyMgcGFyc2UgdG8gYXJyYXkgb2YgaGFzaGVzIGZ1bmN0aW9ucworCitzdWIgZ2l0X2dldF9oZWFkc19saXN0IHsKKwlteSAkbGltaXQgPSBzaGlmdDsKKwlteSBAaGVhZHNsaXN0OworCisJb3BlbiBteSAkZmQsICctfCcsIGdpdF9jbWQoKSwgJ2Zvci1lYWNoLXJlZicsCisJCSgkbGltaXQgPyAnLS1jb3VudD0nLigkbGltaXQrMSkgOiAoKSksICctLXNvcnQ9LWNvbW1pdHRlcmRhdGUnLAorCQknLS1mb3JtYXQ9JShvYmplY3RuYW1lKSAlKHJlZm5hbWUpICUoc3ViamVjdCklMDAlKGNvbW1pdHRlciknLAorCQkncmVmcy9oZWFkcycKKwkJb3IgcmV0dXJuOworCXdoaWxlIChteSAkbGluZSA9IDwkZmQ+KSB7CisJCW15ICVyZWZfaXRlbTsKKworCQljaG9tcCAkbGluZTsKKwkJbXkgKCRyZWZpbmZvLCAkY29tbWl0dGVyaW5mbykgPSBzcGxpdCgvXDAvLCAkbGluZSk7CisJCW15ICgkaGFzaCwgJG5hbWUsICR0aXRsZSkgPSBzcGxpdCgnICcsICRyZWZpbmZvLCAzKTsKKwkJbXkgKCRjb21taXR0ZXIsICRlcG9jaCwgJHR6KSA9CisJCQkoJGNvbW1pdHRlcmluZm8gPX4gL14oLiopIChbMC05XSspICguKikkLyk7CisJCSRyZWZfaXRlbXsnZnVsbG5hbWUnfSAgPSAkbmFtZTsKKwkJJG5hbWUgPX4gcyFecmVmcy9oZWFkcy8hITsKKworCQkkcmVmX2l0ZW17J25hbWUnfSAgPSAkbmFtZTsKKwkJJHJlZl9pdGVteydpZCd9ICAgID0gJGhhc2g7CisJCSRyZWZfaXRlbXsndGl0bGUnfSA9ICR0aXRsZSB8fCAnKG5vIGNvbW1pdCBtZXNzYWdlKSc7CisJCSRyZWZfaXRlbXsnZXBvY2gnfSA9ICRlcG9jaDsKKwkJaWYgKCRlcG9jaCkgeworCQkJJHJlZl9pdGVteydhZ2UnfSA9IGFnZV9zdHJpbmcodGltZSAtICRyZWZfaXRlbXsnZXBvY2gnfSk7CisJCX0gZWxzZSB7CisJCQkkcmVmX2l0ZW17J2FnZSd9ID0gInVua25vd24iOworCQl9CisKKwkJcHVzaCBAaGVhZHNsaXN0LCBcJXJlZl9pdGVtOworCX0KKwljbG9zZSAkZmQ7CisKKwlyZXR1cm4gd2FudGFycmF5ID8gQGhlYWRzbGlzdCA6IFxAaGVhZHNsaXN0OworfQorCitzdWIgZ2l0X2dldF90YWdzX2xpc3QgeworCW15ICRsaW1pdCA9IHNoaWZ0OworCW15IEB0YWdzbGlzdDsKKworCW9wZW4gbXkgJGZkLCAnLXwnLCBnaXRfY21kKCksICdmb3ItZWFjaC1yZWYnLAorCQkoJGxpbWl0ID8gJy0tY291bnQ9Jy4oJGxpbWl0KzEpIDogKCkpLCAnLS1zb3J0PS1jcmVhdG9yZGF0ZScsCisJCSctLWZvcm1hdD0lKG9iamVjdG5hbWUpICUob2JqZWN0dHlwZSkgJShyZWZuYW1lKSAnLgorCQknJSgqb2JqZWN0bmFtZSkgJSgqb2JqZWN0dHlwZSkgJShzdWJqZWN0KSUwMCUoY3JlYXRvciknLAorCQkncmVmcy90YWdzJworCQlvciByZXR1cm47CisJd2hpbGUgKG15ICRsaW5lID0gPCRmZD4pIHsKKwkJbXkgJXJlZl9pdGVtOworCisJCWNob21wICRsaW5lOworCQlteSAoJHJlZmluZm8sICRjcmVhdG9yaW5mbykgPSBzcGxpdCgvXDAvLCAkbGluZSk7CisJCW15ICgkaWQsICR0eXBlLCAkbmFtZSwgJHJlZmlkLCAkcmVmdHlwZSwgJHRpdGxlKSA9IHNwbGl0KCcgJywgJHJlZmluZm8sIDYpOworCQlteSAoJGNyZWF0b3IsICRlcG9jaCwgJHR6KSA9CisJCQkoJGNyZWF0b3JpbmZvID1+IC9eKC4qKSAoWzAtOV0rKSAoLiopJC8pOworCQkkcmVmX2l0ZW17J2Z1bGxuYW1lJ30gPSAkbmFtZTsKKwkJJG5hbWUgPX4gcyFecmVmcy90YWdzLyEhOworCisJCSRyZWZfaXRlbXsndHlwZSd9ID0gJHR5cGU7CisJCSRyZWZfaXRlbXsnaWQnfSA9ICRpZDsKKwkJJHJlZl9pdGVteyduYW1lJ30gPSAkbmFtZTsKKwkJaWYgKCR0eXBlIGVxICJ0YWciKSB7CisJCQkkcmVmX2l0ZW17J3N1YmplY3QnfSA9ICR0aXRsZTsKKwkJCSRyZWZfaXRlbXsncmVmdHlwZSd9ID0gJHJlZnR5cGU7CisJCQkkcmVmX2l0ZW17J3JlZmlkJ30gICA9ICRyZWZpZDsKKwkJfSBlbHNlIHsKKwkJCSRyZWZfaXRlbXsncmVmdHlwZSd9ID0gJHR5cGU7CisJCQkkcmVmX2l0ZW17J3JlZmlkJ30gICA9ICRpZDsKKwkJfQorCisJCWlmICgkdHlwZSBlcSAidGFnIiB8fCAkdHlwZSBlcSAiY29tbWl0IikgeworCQkJJHJlZl9pdGVteydlcG9jaCd9ID0gJGVwb2NoOworCQkJaWYgKCRlcG9jaCkgeworCQkJCSRyZWZfaXRlbXsnYWdlJ30gPSBhZ2Vfc3RyaW5nKHRpbWUgLSAkcmVmX2l0ZW17J2Vwb2NoJ30pOworCQkJfSBlbHNlIHsKKwkJCQkkcmVmX2l0ZW17J2FnZSd9ID0gInVua25vd24iOworCQkJfQorCQl9CisKKwkJcHVzaCBAdGFnc2xpc3QsIFwlcmVmX2l0ZW07CisJfQorCWNsb3NlICRmZDsKKworCXJldHVybiB3YW50YXJyYXkgPyBAdGFnc2xpc3QgOiBcQHRhZ3NsaXN0OworfQorCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBmaWxlc3lzdGVtLXJlbGF0ZWQgZnVuY3Rpb25zCisKK3N1YiBnZXRfZmlsZV9vd25lciB7CisJbXkgJHBhdGggPSBzaGlmdDsKKworCW15ICgkZGV2LCAkaW5vLCAkbW9kZSwgJG5saW5rLCAkc3RfdWlkLCAkc3RfZ2lkLCAkcmRldiwgJHNpemUpID0gc3RhdCgkcGF0aCk7CisJbXkgKCRuYW1lLCAkcGFzc3dkLCAkdWlkLCAkZ2lkLCAkcXVvdGEsICRjb21tZW50LCAkZ2NvcywgJGRpciwgJHNoZWxsKSA9IGdldHB3dWlkKCRzdF91aWQpOworCWlmICghZGVmaW5lZCAkZ2NvcykgeworCQlyZXR1cm4gdW5kZWY7CisJfQorCW15ICRvd25lciA9ICRnY29zOworCSRvd25lciA9fiBzL1ssO10uKiQvLzsKKwlyZXR1cm4gdG9fdXRmOCgkb3duZXIpOworfQorCisjIyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisjIyBtaW1ldHlwZSByZWxhdGVkIGZ1bmN0aW9ucworCitzdWIgbWltZXR5cGVfZ3Vlc3NfZmlsZSB7CisJbXkgJGZpbGVuYW1lID0gc2hpZnQ7CisJbXkgJG1pbWVtYXAgPSBzaGlmdDsKKwktciAkbWltZW1hcCBvciByZXR1cm4gdW5kZWY7CisKKwlteSAlbWltZW1hcDsKKwlvcGVuKE1JTUUsICRtaW1lbWFwKSBvciByZXR1cm4gdW5kZWY7CisJd2hpbGUgKDxNSU1FPikgeworCQluZXh0IGlmIG0vXiMvOyAjIHNraXAgY29tbWVudHMKKwkJbXkgKCRtaW1lLCAkZXh0cykgPSBzcGxpdCgvXHQrLyk7CisJCWlmIChkZWZpbmVkICRleHRzKSB7CisJCQlteSBAZXh0cyA9IHNwbGl0KC9ccysvLCAkZXh0cyk7CisJCQlmb3JlYWNoIG15ICRleHQgKEBleHRzKSB7CisJCQkJJG1pbWVtYXB7JGV4dH0gPSAkbWltZTsKKwkJCX0KKwkJfQorCX0KKwljbG9zZShNSU1FKTsKKworCSRmaWxlbmFtZSA9fiAvXC4oW14uXSopJC87CisJcmV0dXJuICRtaW1lbWFweyQxfTsKK30KKworc3ViIG1pbWV0eXBlX2d1ZXNzIHsKKwlteSAkZmlsZW5hbWUgPSBzaGlmdDsKKwlteSAkbWltZTsKKwkkZmlsZW5hbWUgPX4gL1wuLyBvciByZXR1cm4gdW5kZWY7CisKKwlpZiAoJG1pbWV0eXBlc19maWxlKSB7CisJCW15ICRmaWxlID0gJG1pbWV0eXBlc19maWxlOworCQlpZiAoJGZpbGUgIX4gbSFeLyEpIHsgIyBpZiBpdCBpcyByZWxhdGl2ZSBwYXRoCisJCQkjIGl0IGlzIHJlbGF0aXZlIHRvIHByb2plY3QKKwkJCSRmaWxlID0gIiRwcm9qZWN0cm9vdC8kcHJvamVjdC8kZmlsZSI7CisJCX0KKwkJJG1pbWUgPSBtaW1ldHlwZV9ndWVzc19maWxlKCRmaWxlbmFtZSwgJGZpbGUpOworCX0KKwkkbWltZSB8fD0gbWltZXR5cGVfZ3Vlc3NfZmlsZSgkZmlsZW5hbWUsICcvZXRjL21pbWUudHlwZXMnKTsKKwlyZXR1cm4gJG1pbWU7Cit9CisKK3N1YiBibG9iX21pbWV0eXBlIHsKKwlteSAkZmQgPSBzaGlmdDsKKwlteSAkZmlsZW5hbWUgPSBzaGlmdDsKKworCWlmICgkZmlsZW5hbWUpIHsKKwkJbXkgJG1pbWUgPSBtaW1ldHlwZV9ndWVzcygkZmlsZW5hbWUpOworCQkkbWltZSBhbmQgcmV0dXJuICRtaW1lOworCX0KKworCSMganVzdCBpbiBjYXNlCisJcmV0dXJuICRkZWZhdWx0X2Jsb2JfcGxhaW5fbWltZXR5cGUgdW5sZXNzICRmZDsKKworCWlmICgtVCAkZmQpIHsKKwkJcmV0dXJuICd0ZXh0L3BsYWluJyAuCisJCSAgICAgICAoJGRlZmF1bHRfdGV4dF9wbGFpbl9jaGFyc2V0ID8gJzsgY2hhcnNldD0nLiRkZWZhdWx0X3RleHRfcGxhaW5fY2hhcnNldCA6ICcnKTsKKwl9IGVsc2lmICghICRmaWxlbmFtZSkgeworCQlyZXR1cm4gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CisJfSBlbHNpZiAoJGZpbGVuYW1lID1+IG0vXC5wbmckL2kpIHsKKwkJcmV0dXJuICdpbWFnZS9wbmcnOworCX0gZWxzaWYgKCRmaWxlbmFtZSA9fiBtL1wuZ2lmJC9pKSB7CisJCXJldHVybiAnaW1hZ2UvZ2lmJzsKKwl9IGVsc2lmICgkZmlsZW5hbWUgPX4gbS9cLmpwZT9nJC9pKSB7CisJCXJldHVybiAnaW1hZ2UvanBlZyc7CisJfSBlbHNlIHsKKwkJcmV0dXJuICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nOworCX0KK30KKworIyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyMgZnVuY3Rpb25zIHByaW50aW5nIEhUTUw6IGhlYWRlciwgZm9vdGVyLCBlcnJvciBwYWdlCisKK3N1YiBnaXRfaGVhZGVyX2h0bWwgeworCW15ICRzdGF0dXMgPSBzaGlmdCB8fCAiMjAwIE9LIjsKKwlteSAkZXhwaXJlcyA9IHNoaWZ0OworCisJbXkgJHRpdGxlID0gIiRzaXRlX25hbWUiOworCWlmIChkZWZpbmVkICRwcm9qZWN0KSB7CisJCSR0aXRsZSAuPSAiIC0gIiAuIHRvX3V0ZjgoJHByb2plY3QpOworCQlpZiAoZGVmaW5lZCAkYWN0aW9uKSB7CisJCQkkdGl0bGUgLj0gIi8kYWN0aW9uIjsKKwkJCWlmIChkZWZpbmVkICRmaWxlX25hbWUpIHsKKwkJCQkkdGl0bGUgLj0gIiAtICIgLiBlc2NfcGF0aCgkZmlsZV9uYW1lKTsKKwkJCQlpZiAoJGFjdGlvbiBlcSAidHJlZSIgJiYgJGZpbGVfbmFtZSAhfiBtfC8kfCkgeworCQkJCQkkdGl0bGUgLj0gIi8iOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlteSAkY29udGVudF90eXBlOworCSMgcmVxdWlyZSBleHBsaWNpdCBzdXBwb3J0IGZyb20gdGhlIFVBIGlmIHdlIGFyZSB0byBzZW5kIHRoZSBwYWdlIGFzCisJIyAnYXBwbGljYXRpb24veGh0bWwreG1sJywgb3RoZXJ3aXNlIHNlbmQgaXQgYXMgcGxhaW4gb2xkICd0ZXh0L2h0bWwnLgorCSMgd2UgaGF2ZSB0byBkbyB0aGlzIGJlY2F1c2UgTVNJRSBzb21ldGltZXMgZ2xvYnMgJyovKicsIHByZXRlbmRpbmcgdG8KKwkjIHN1cHBvcnQgeGh0bWwreG1sIGJ1dCBjaG9raW5nIHdoZW4gaXQgZ2V0cyB3aGF0IGl0IGFza2VkIGZvci4KKwlpZiAoZGVmaW5lZCAkY2dpLT5odHRwKCdIVFRQX0FDQ0VQVCcpICYmCisJICAgICRjZ2ktPmh0dHAoJ0hUVFBfQUNDRVBUJykgPX4gbS8oLHw7fFxzfF4pYXBwbGljYXRpb25cL3hodG1sXCt4bWwoLHw7fFxzfCQpLyAmJgorCSAgICAkY2dpLT5BY2NlcHQoJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcpICE9IDApIHsKKwkJJGNvbnRlbnRfdHlwZSA9ICdhcHBsaWNhdGlvbi94aHRtbCt4bWwnOworCX0gZWxzZSB7CisJCSRjb250ZW50X3R5cGUgPSAndGV4dC9odG1sJzsKKwl9CisJcHJpbnQgJGNnaS0+aGVhZGVyKC10eXBlPT4kY29udGVudF90eXBlLCAtY2hhcnNldCA9PiAndXRmLTgnLAorCSAgICAgICAgICAgICAgICAgICAtc3RhdHVzPT4gJHN0YXR1cywgLWV4cGlyZXMgPT4gJGV4cGlyZXMpOworCW15ICRtb2RfcGVybF92ZXJzaW9uID0gJEVOVnsnTU9EX1BFUkwnfSA/ICIgJEVOVnsnTU9EX1BFUkwnfSIgOiAnJzsKKwlwcmludCA8PEVPRjsKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuLVVTIiBsYW5nPSJlbi1VUyI+Cis8IS0tIGdpdCB3ZWIgaW50ZXJmYWNlIHZlcnNpb24gJHZlcnNpb24sIChDKSAyMDA1LTIwMDYsIEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc1xAdnJmeS5vcmc+LCBDaHJpc3RpYW4gR2llcmtlIC0tPgorPCEtLSBnaXQgY29yZSBiaW5hcmllcyB2ZXJzaW9uICRnaXRfdmVyc2lvbiAtLT4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIkY29udGVudF90eXBlOyBjaGFyc2V0PXV0Zi04Ii8+Cis8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9ImdpdHdlYi8kdmVyc2lvbiBnaXQvJGdpdF92ZXJzaW9uJG1vZF9wZXJsX3ZlcnNpb24iLz4KKzxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0iaW5kZXgsIG5vZm9sbG93Ii8+Cis8dGl0bGU+JHRpdGxlPC90aXRsZT4KK0VPRgorIyBwcmludCBvdXQgZWFjaCBzdHlsZXNoZWV0IHRoYXQgZXhpc3QKKwlpZiAoZGVmaW5lZCAkc3R5bGVzaGVldCkgeworI3Byb3ZpZGVzIGJhY2t3YXJkcyBjYXBhYmlsaXR5IGZvciB0aG9zZSBwZW9wbGUgd2hvIGRlZmluZSBzdHlsZSBzaGVldCBpbiBhIGNvbmZpZyBmaWxlCisJCXByaW50ICc8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSInLiRzdHlsZXNoZWV0LiciLz4nLiJcbiI7CisJfSBlbHNlIHsKKwkJZm9yZWFjaCBteSAkc3R5bGVzaGVldCAoQHN0eWxlc2hlZXRzKSB7CisJCQluZXh0IHVubGVzcyAkc3R5bGVzaGVldDsKKwkJCXByaW50ICc8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSInLiRzdHlsZXNoZWV0LiciLz4nLiJcbiI7CisJCX0KKwl9CisJaWYgKGRlZmluZWQgJHByb2plY3QpIHsKKwkJcHJpbnRmKCc8bGluayByZWw9ImFsdGVybmF0ZSIgdGl0bGU9IiVzIGxvZyBSU1MgZmVlZCIgJy4KKwkJICAgICAgICdocmVmPSIlcyIgdHlwZT0iYXBwbGljYXRpb24vcnNzK3htbCIgLz4nLiJcbiIsCisJCSAgICAgICBlc2NfcGFyYW0oJHByb2plY3QpLCBocmVmKGFjdGlvbj0+InJzcyIpKTsKKwkJcHJpbnRmKCc8bGluayByZWw9ImFsdGVybmF0ZSIgdGl0bGU9IiVzIGxvZyBSU1MgZmVlZCAobm8gbWVyZ2VzKSIgJy4KKwkJICAgICAgICdocmVmPSIlcyIgdHlwZT0iYXBwbGljYXRpb24vcnNzK3htbCIgLz4nLiJcbiIsCisJCSAgICAgICBlc2NfcGFyYW0oJHByb2plY3QpLCBocmVmKGFjdGlvbj0+InJzcyIsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX29wdGlvbnM9PiItLW5vLW1lcmdlcyIpKTsKKwkJcHJpbnRmKCc8bGluayByZWw9ImFsdGVybmF0ZSIgdGl0bGU9IiVzIGxvZyBBdG9tIGZlZWQiICcuCisJCSAgICAgICAnaHJlZj0iJXMiIHR5cGU9ImFwcGxpY2F0aW9uL2F0b20reG1sIiAvPicuIlxuIiwKKwkJICAgICAgIGVzY19wYXJhbSgkcHJvamVjdCksIGhyZWYoYWN0aW9uPT4iYXRvbSIpKTsKKwkJcHJpbnRmKCc8bGluayByZWw9ImFsdGVybmF0ZSIgdGl0bGU9IiVzIGxvZyBBdG9tIGZlZWQgKG5vIG1lcmdlcykiICcuCisJCSAgICAgICAnaHJlZj0iJXMiIHR5cGU9ImFwcGxpY2F0aW9uL2F0b20reG1sIiAvPicuIlxuIiwKKwkJICAgICAgIGVzY19wYXJhbSgkcHJvamVjdCksIGhyZWYoYWN0aW9uPT4iYXRvbSIsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX29wdGlvbnM9PiItLW5vLW1lcmdlcyIpKTsKKwl9IGVsc2UgeworCQlwcmludGYoJzxsaW5rIHJlbD0iYWx0ZXJuYXRlIiB0aXRsZT0iJXMgcHJvamVjdHMgbGlzdCIgJy4KKwkJICAgICAgICdocmVmPSIlcyIgdHlwZT0idGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIvPicuIlxuIiwKKwkJICAgICAgICRzaXRlX25hbWUsIGhyZWYocHJvamVjdD0+dW5kZWYsIGFjdGlvbj0+InByb2plY3RfaW5kZXgiKSk7CisJCXByaW50ZignPGxpbmsgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSIlcyBwcm9qZWN0cyBmZWVkcyIgJy4KKwkJICAgICAgICdocmVmPSIlcyIgdHlwZT0idGV4dC94LW9wbWwiLz4nLiJcbiIsCisJCSAgICAgICAkc2l0ZV9uYW1lLCBocmVmKHByb2plY3Q9PnVuZGVmLCBhY3Rpb249PiJvcG1sIikpOworCX0KKwlpZiAoZGVmaW5lZCAkZmF2aWNvbikgeworCQlwcmludCBxcSg8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9IiRmYXZpY29uIiB0eXBlPSJpbWFnZS9wbmciLz5cbik7CisJfQorCisJcHJpbnQgIjwvaGVhZD5cbiIgLgorCSAgICAgICI8Ym9keT5cbiI7CisKKwlpZiAoLWYgJHNpdGVfaGVhZGVyKSB7CisJCW9wZW4gKG15ICRmZCwgJHNpdGVfaGVhZGVyKTsKKwkJcHJpbnQgPCRmZD47CisJCWNsb3NlICRmZDsKKwl9CisKKwlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfaGVhZGVyXCI+XG4iIC4KKwkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBlc2NfdXJsKCRsb2dvX3VybCksCisJICAgICAgICAgICAgICAgLXRpdGxlID0+ICRsb2dvX2xhYmVsfSwKKwkgICAgICAgICAgICAgIHFxKDxpbWcgc3JjPSIkbG9nbyIgd2lkdGg9IjcyIiBoZWlnaHQ9IjI3IiBhbHQ9ImdpdCIgY2xhc3M9ImxvZ28iLz4pKTsKKwlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBlc2NfdXJsKCRob21lX2xpbmspfSwgJGhvbWVfbGlua19zdHIpIC4gIiAvICI7CisJaWYgKGRlZmluZWQgJHByb2plY3QpIHsKKwkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJzdW1tYXJ5Iil9LCBlc2NfaHRtbCgkcHJvamVjdCkpOworCQlpZiAoZGVmaW5lZCAkYWN0aW9uKSB7CisJCQlwcmludCAiIC8gJGFjdGlvbiI7CisJCX0KKwkJcHJpbnQgIlxuIjsKKwl9CisJcHJpbnQgIjwvZGl2PlxuIjsKKworCW15ICgkaGF2ZV9zZWFyY2gpID0gZ2l0d2ViX2NoZWNrX2ZlYXR1cmUoJ3NlYXJjaCcpOworCWlmICgoZGVmaW5lZCAkcHJvamVjdCkgJiYgKCRoYXZlX3NlYXJjaCkpIHsKKwkJaWYgKCFkZWZpbmVkICRzZWFyY2h0ZXh0KSB7CisJCQkkc2VhcmNodGV4dCA9ICIiOworCQl9CisJCW15ICRzZWFyY2hfaGFzaDsKKwkJaWYgKGRlZmluZWQgJGhhc2hfYmFzZSkgeworCQkJJHNlYXJjaF9oYXNoID0gJGhhc2hfYmFzZTsKKwkJfSBlbHNpZiAoZGVmaW5lZCAkaGFzaCkgeworCQkJJHNlYXJjaF9oYXNoID0gJGhhc2g7CisJCX0gZWxzZSB7CisJCQkkc2VhcmNoX2hhc2ggPSAiSEVBRCI7CisJCX0KKwkJbXkgJGFjdGlvbiA9ICRteV91cmk7CisJCW15ICgkdXNlX3BhdGhpbmZvKSA9IGdpdHdlYl9jaGVja19mZWF0dXJlKCdwYXRoaW5mbycpOworCQlpZiAoJHVzZV9wYXRoaW5mbykgeworCQkJJGFjdGlvbiAuPSAiLyRwcm9qZWN0IjsKKwkJfSBlbHNlIHsKKwkJCSRjZ2ktPnBhcmFtKCJwIiwgJHByb2plY3QpOworCQl9CisJCSRjZ2ktPnBhcmFtKCJhIiwgInNlYXJjaCIpOworCQkkY2dpLT5wYXJhbSgiaCIsICRzZWFyY2hfaGFzaCk7CisJCXByaW50ICRjZ2ktPnN0YXJ0Zm9ybSgtbWV0aG9kID0+ICJnZXQiLCAtYWN0aW9uID0+ICRhY3Rpb24pIC4KKwkJICAgICAgIjxkaXYgY2xhc3M9XCJzZWFyY2hcIj5cbiIgLgorCQkgICAgICAoISR1c2VfcGF0aGluZm8gJiYgJGNnaS0+aGlkZGVuKC1uYW1lID0+ICJwIikgLiAiXG4iKSAuCisJCSAgICAgICRjZ2ktPmhpZGRlbigtbmFtZSA9PiAiYSIpIC4gIlxuIiAuCisJCSAgICAgICRjZ2ktPmhpZGRlbigtbmFtZSA9PiAiaCIpIC4gIlxuIiAuCisJCSAgICAgICRjZ2ktPnBvcHVwX21lbnUoLW5hbWUgPT4gJ3N0JywgLWRlZmF1bHQgPT4gJ2NvbW1pdCcsCisJCSAgICAgICAgICAgICAgICAgICAgICAgLXZhbHVlcyA9PiBbJ2NvbW1pdCcsICdncmVwJywgJ2F1dGhvcicsICdjb21taXR0ZXInLCAncGlja2F4ZSddKSAuCisJCSAgICAgICRjZ2ktPnN1cCgkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+InNlYXJjaF9oZWxwIil9LCAiPyIpKSAuCisJCSAgICAgICIgc2VhcmNoOlxuIiwKKwkJICAgICAgJGNnaS0+dGV4dGZpZWxkKC1uYW1lID0+ICJzIiwgLXZhbHVlID0+ICRzZWFyY2h0ZXh0KSAuICJcbiIgLgorCQkgICAgICAiPHNwYW4gdGl0bGU9XCJFeHRlbmRlZCByZWd1bGFyIGV4cHJlc3Npb25cIj4iIC4KKwkJICAgICAgJGNnaS0+Y2hlY2tib3goLW5hbWUgPT4gJ3NyJywgLXZhbHVlID0+IDEsIC1sYWJlbCA9PiAncmUnLAorCQkgICAgICAgICAgICAgICAgICAgICAtY2hlY2tlZCA9PiAkc2VhcmNoX3VzZV9yZWdleHApIC4KKwkJICAgICAgIjwvc3Bhbj4iIC4KKwkJICAgICAgIjwvZGl2PiIgLgorCQkgICAgICAkY2dpLT5lbmRfZm9ybSgpIC4gIlxuIjsKKwl9Cit9CisKK3N1YiBnaXRfZm9vdGVyX2h0bWwgeworCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9mb290ZXJcIj5cbiI7CisJaWYgKGRlZmluZWQgJHByb2plY3QpIHsKKwkJbXkgJGRlc2NyID0gZ2l0X2dldF9wcm9qZWN0X2Rlc2NyaXB0aW9uKCRwcm9qZWN0KTsKKwkJaWYgKGRlZmluZWQgJGRlc2NyKSB7CisJCQlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfZm9vdGVyX3RleHRcIj4iIC4gZXNjX2h0bWwoJGRlc2NyKSAuICI8L2Rpdj5cbiI7CisJCX0KKwkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJyc3MiKSwKKwkJICAgICAgICAgICAgICAtY2xhc3MgPT4gInJzc19sb2dvIn0sICJSU1MiKSAuICIgIjsKKwkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJhdG9tIiksCisJCSAgICAgICAgICAgICAgLWNsYXNzID0+ICJyc3NfbG9nbyJ9LCAiQXRvbSIpIC4gIlxuIjsKKwl9IGVsc2UgeworCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKHByb2plY3Q9PnVuZGVmLCBhY3Rpb249PiJvcG1sIiksCisJCSAgICAgICAgICAgICAgLWNsYXNzID0+ICJyc3NfbG9nbyJ9LCAiT1BNTCIpIC4gIiAiOworCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKHByb2plY3Q9PnVuZGVmLCBhY3Rpb249PiJwcm9qZWN0X2luZGV4IiksCisJCSAgICAgICAgICAgICAgLWNsYXNzID0+ICJyc3NfbG9nbyJ9LCAiVFhUIikgLiAiXG4iOworCX0KKwlwcmludCAiPC9kaXY+XG4iIDsKKworCWlmICgtZiAkc2l0ZV9mb290ZXIpIHsKKwkJb3BlbiAobXkgJGZkLCAkc2l0ZV9mb290ZXIpOworCQlwcmludCA8JGZkPjsKKwkJY2xvc2UgJGZkOworCX0KKworCXByaW50ICI8L2JvZHk+XG4iIC4KKwkgICAgICAiPC9odG1sPiI7Cit9CisKK3N1YiBkaWVfZXJyb3IgeworCW15ICRzdGF0dXMgPSBzaGlmdCB8fCAiNDAzIEZvcmJpZGRlbiI7CisJbXkgJGVycm9yID0gc2hpZnQgfHwgIk1hbGZvcm1lZCBxdWVyeSwgZmlsZSBtaXNzaW5nIG9yIHBlcm1pc3Npb24gZGVuaWVkIjsKKworCWdpdF9oZWFkZXJfaHRtbCgkc3RhdHVzKTsKKwlwcmludCA8PEVPRjsKKzxkaXYgY2xhc3M9InBhZ2VfYm9keSI+Cis8YnIgLz48YnIgLz4KKyRzdGF0dXMgLSAkZXJyb3IKKzxiciAvPgorPC9kaXY+CitFT0YKKwlnaXRfZm9vdGVyX2h0bWwoKTsKKwlleGl0OworfQorCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBmdW5jdGlvbnMgcHJpbnRpbmcgb3Igb3V0cHV0dGluZyBIVE1MOiBuYXZpZ2F0aW9uCisKK3N1YiBnaXRfcHJpbnRfcGFnZV9uYXYgeworCW15ICgkY3VycmVudCwgJHN1cHByZXNzLCAkaGVhZCwgJHRyZWVoZWFkLCAkdHJlZWJhc2UsICRleHRyYSkgPSBAXzsKKwkkZXh0cmEgPSAnJyBpZiAhZGVmaW5lZCAkZXh0cmE7ICMgcGFnZXIgb3IgZm9ybWF0cworCisJbXkgQG5hdnMgPSBxdyhzdW1tYXJ5IHNob3J0bG9nIGxvZyBjb21taXQgY29tbWl0ZGlmZiB0cmVlKTsKKwlpZiAoJHN1cHByZXNzKSB7CisJCUBuYXZzID0gZ3JlcCB7ICRfIG5lICRzdXBwcmVzcyB9IEBuYXZzOworCX0KKworCW15ICVhcmcgPSBtYXAgeyAkXyA9PiB7YWN0aW9uPT4kX30gfSBAbmF2czsKKwlpZiAoZGVmaW5lZCAkaGVhZCkgeworCQlmb3IgKHF3KGNvbW1pdCBjb21taXRkaWZmKSkgeworCQkJJGFyZ3skX317J2hhc2gnfSA9ICRoZWFkOworCQl9CisJCWlmICgkY3VycmVudCA9fiBtL14odHJlZSB8IGxvZyB8IHNob3J0bG9nIHwgY29tbWl0IHwgY29tbWl0ZGlmZiB8IHNlYXJjaCkkL3gpIHsKKwkJCWZvciAocXcoc2hvcnRsb2cgbG9nKSkgeworCQkJCSRhcmd7JF99eydoYXNoJ30gPSAkaGVhZDsKKwkJCX0KKwkJfQorCX0KKwkkYXJneyd0cmVlJ317J2hhc2gnfSA9ICR0cmVlaGVhZCBpZiBkZWZpbmVkICR0cmVlaGVhZDsKKwkkYXJneyd0cmVlJ317J2hhc2hfYmFzZSd9ID0gJHRyZWViYXNlIGlmIGRlZmluZWQgJHRyZWViYXNlOworCisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX25hdlwiPlxuIiAuCisJCShqb2luICIgfCAiLAorCQkgbWFwIHsgJF8gZXEgJGN1cnJlbnQgPworCQkgICAgICAgJF8gOiAkY2dpLT5hKHstaHJlZiA9PiBocmVmKCV7JGFyZ3skX319KX0sICIkXyIpCisJCSB9IEBuYXZzKTsKKwlwcmludCAiPGJyLz5cbiRleHRyYTxici8+XG4iIC4KKwkgICAgICAiPC9kaXY+XG4iOworfQorCitzdWIgZm9ybWF0X3BhZ2luZ19uYXYgeworCW15ICgkYWN0aW9uLCAkaGFzaCwgJGhlYWQsICRwYWdlLCAkbnJldnMpID0gQF87CisJbXkgJHBhZ2luZ19uYXY7CisKKworCWlmICgkaGFzaCBuZSAkaGVhZCB8fCAkcGFnZSkgeworCQkkcGFnaW5nX25hdiAuPSAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+JGFjdGlvbil9LCAiSEVBRCIpOworCX0gZWxzZSB7CisJCSRwYWdpbmdfbmF2IC49ICJIRUFEIjsKKwl9CisKKwlpZiAoJHBhZ2UgPiAwKSB7CisJCSRwYWdpbmdfbmF2IC49ICIgJnNkb3Q7ICIgLgorCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZigtcmVwbGF5PT4xLCBwYWdlPT4kcGFnZS0xKSwKKwkJCSAgICAgICAgIC1hY2Nlc3NrZXkgPT4gInAiLCAtdGl0bGUgPT4gIkFsdC1wIn0sICJwcmV2Iik7CisJfSBlbHNlIHsKKwkJJHBhZ2luZ19uYXYgLj0gIiAmc2RvdDsgcHJldiI7CisJfQorCisJaWYgKCRucmV2cyA+PSAoMTAwICogKCRwYWdlKzEpLTEpKSB7CisJCSRwYWdpbmdfbmF2IC49ICIgJnNkb3Q7ICIgLgorCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZigtcmVwbGF5PT4xLCBwYWdlPT4kcGFnZSsxKSwKKwkJCSAgICAgICAgIC1hY2Nlc3NrZXkgPT4gIm4iLCAtdGl0bGUgPT4gIkFsdC1uIn0sICJuZXh0Iik7CisJfSBlbHNlIHsKKwkJJHBhZ2luZ19uYXYgLj0gIiAmc2RvdDsgbmV4dCI7CisJfQorCisJcmV0dXJuICRwYWdpbmdfbmF2OworfQorCisjIyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisjIyBmdW5jdGlvbnMgcHJpbnRpbmcgb3Igb3V0cHV0dGluZyBIVE1MOiBkaXYKKworc3ViIGdpdF9wcmludF9oZWFkZXJfZGl2IHsKKwlteSAoJGFjdGlvbiwgJHRpdGxlLCAkaGFzaCwgJGhhc2hfYmFzZSkgPSBAXzsKKwlteSAlYXJncyA9ICgpOworCisJJGFyZ3N7J2FjdGlvbid9ID0gJGFjdGlvbjsKKwkkYXJnc3snaGFzaCd9ID0gJGhhc2ggaWYgJGhhc2g7CisJJGFyZ3N7J2hhc2hfYmFzZSd9ID0gJGhhc2hfYmFzZSBpZiAkaGFzaF9iYXNlOworCisJcHJpbnQgIjxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cbiIgLgorCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoJWFyZ3MpLCAtY2xhc3MgPT4gInRpdGxlIn0sCisJICAgICAgJHRpdGxlID8gJHRpdGxlIDogJGFjdGlvbikgLgorCSAgICAgICJcbjwvZGl2PlxuIjsKK30KKworI3N1YiBnaXRfcHJpbnRfYXV0aG9yc2hpcCAoXCUpIHsKK3N1YiBnaXRfcHJpbnRfYXV0aG9yc2hpcCB7CisJbXkgJGNvID0gc2hpZnQ7CisKKwlteSAlYWQgPSBwYXJzZV9kYXRlKCRjby0+eydhdXRob3JfZXBvY2gnfSwgJGNvLT57J2F1dGhvcl90eid9KTsKKwlwcmludCAiPGRpdiBjbGFzcz1cImF1dGhvcl9kYXRlXCI+IiAuCisJICAgICAgZXNjX2h0bWwoJGNvLT57J2F1dGhvcl9uYW1lJ30pIC4KKwkgICAgICAiIFskYWR7J3JmYzI4MjInfSI7CisJaWYgKCRhZHsnaG91cl9sb2NhbCd9IDwgNikgeworCQlwcmludGYoIiAoPHNwYW4gY2xhc3M9XCJhdG5pZ2h0XCI+JTAyZDolMDJkPC9zcGFuPiAlcykiLAorCQkgICAgICAgJGFkeydob3VyX2xvY2FsJ30sICRhZHsnbWludXRlX2xvY2FsJ30sICRhZHsndHpfbG9jYWwnfSk7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCIgKCUwMmQ6JTAyZCAlcykiLAorCQkgICAgICAgJGFkeydob3VyX2xvY2FsJ30sICRhZHsnbWludXRlX2xvY2FsJ30sICRhZHsndHpfbG9jYWwnfSk7CisJfQorCXByaW50ICJdPC9kaXY+XG4iOworfQorCitzdWIgZ2l0X3ByaW50X3BhZ2VfcGF0aCB7CisJbXkgJG5hbWUgPSBzaGlmdDsKKwlteSAkdHlwZSA9IHNoaWZ0OworCW15ICRoYiA9IHNoaWZ0OworCisKKwlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfcGF0aFwiPiI7CisJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJ0cmVlIiwgaGFzaF9iYXNlPT4kaGIpLAorCSAgICAgICAgICAgICAgLXRpdGxlID0+ICd0cmVlIHJvb3QnfSwgdG9fdXRmOCgiWyRwcm9qZWN0XSIpKTsKKwlwcmludCAiIC8gIjsKKwlpZiAoZGVmaW5lZCAkbmFtZSkgeworCQlteSBAZGlybmFtZSA9IHNwbGl0ICcvJywgJG5hbWU7CisJCW15ICRiYXNlbmFtZSA9IHBvcCBAZGlybmFtZTsKKwkJbXkgJGZ1bGxuYW1lID0gJyc7CisKKwkJZm9yZWFjaCBteSAkZGlyIChAZGlybmFtZSkgeworCQkJJGZ1bGxuYW1lIC49ICgkZnVsbG5hbWUgPyAnLycgOiAnJykgLiAkZGlyOworCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJ0cmVlIiwgZmlsZV9uYW1lPT4kZnVsbG5hbWUsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfYmFzZT0+JGhiKSwKKwkJCSAgICAgICAgICAgICAgLXRpdGxlID0+ICRmdWxsbmFtZX0sIGVzY19wYXRoKCRkaXIpKTsKKwkJCXByaW50ICIgLyAiOworCQl9CisJCWlmIChkZWZpbmVkICR0eXBlICYmICR0eXBlIGVxICdibG9iJykgeworCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJibG9iX3BsYWluIiwgZmlsZV9uYW1lPT4kZmlsZV9uYW1lLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2Jhc2U9PiRoYiksCisJCQkgICAgICAgICAgICAgIC10aXRsZSA9PiAkbmFtZX0sIGVzY19wYXRoKCRiYXNlbmFtZSkpOworCQl9IGVsc2lmIChkZWZpbmVkICR0eXBlICYmICR0eXBlIGVxICd0cmVlJykgeworCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJ0cmVlIiwgZmlsZV9uYW1lPT4kZmlsZV9uYW1lLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2Jhc2U9PiRoYiksCisJCQkgICAgICAgICAgICAgIC10aXRsZSA9PiAkbmFtZX0sIGVzY19wYXRoKCRiYXNlbmFtZSkpOworCQkJcHJpbnQgIiAvICI7CisJCX0gZWxzZSB7CisJCQlwcmludCBlc2NfcGF0aCgkYmFzZW5hbWUpOworCQl9CisJfQorCXByaW50ICI8YnIvPjwvZGl2PlxuIjsKK30KKworIyBzdWIgZ2l0X3ByaW50X2xvZyAoXEA7JSkgeworc3ViIGdpdF9wcmludF9sb2cgKCQ7JSkgeworCW15ICRsb2cgPSBzaGlmdDsKKwlteSAlb3B0cyA9IEBfOworCisJaWYgKCRvcHRzeyctcmVtb3ZlX3RpdGxlJ30pIHsKKwkJIyByZW1vdmUgdGl0bGUsIGkuZS4gZmlyc3QgbGluZSBvZiBsb2cKKwkJc2hpZnQgQCRsb2c7CisJfQorCSMgcmVtb3ZlIGxlYWRpbmcgZW1wdHkgbGluZXMKKwl3aGlsZSAoZGVmaW5lZCAkbG9nLT5bMF0gJiYgJGxvZy0+WzBdIGVxICIiKSB7CisJCXNoaWZ0IEAkbG9nOworCX0KKworCSMgcHJpbnQgbG9nCisJbXkgJHNpZ25vZmYgPSAwOworCW15ICRlbXB0eSA9IDA7CisJZm9yZWFjaCBteSAkbGluZSAoQCRsb2cpIHsKKwkJaWYgKCRsaW5lID1+IG0vXiAqKHNpZ25lZFsgXC1db2ZmWyBcLV1ieVsgOl18YWNrZWRbIFwtXWJ5WyA6XXxjY1sgOl0pL2kpIHsKKwkJCSRzaWdub2ZmID0gMTsKKwkJCSRlbXB0eSA9IDA7CisJCQlpZiAoISAkb3B0c3snLXJlbW92ZV9zaWdub2ZmJ30pIHsKKwkJCQlwcmludCAiPHNwYW4gY2xhc3M9XCJzaWdub2ZmXCI+IiAuIGVzY19odG1sKCRsaW5lKSAuICI8L3NwYW4+PGJyLz5cbiI7CisJCQkJbmV4dDsKKwkJCX0gZWxzZSB7CisJCQkJIyByZW1vdmUgc2lnbm9mZiBsaW5lcworCQkJCW5leHQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQkkc2lnbm9mZiA9IDA7CisJCX0KKworCQkjIHByaW50IG9ubHkgb25lIGVtcHR5IGxpbmUKKwkJIyBkbyBub3QgcHJpbnQgZW1wdHkgbGluZSBhZnRlciBzaWdub2ZmCisJCWlmICgkbGluZSBlcSAiIikgeworCQkJbmV4dCBpZiAoJGVtcHR5IHx8ICRzaWdub2ZmKTsKKwkJCSRlbXB0eSA9IDE7CisJCX0gZWxzZSB7CisJCQkkZW1wdHkgPSAwOworCQl9CisKKwkJcHJpbnQgZm9ybWF0X2xvZ19saW5lX2h0bWwoJGxpbmUpIC4gIjxici8+XG4iOworCX0KKworCWlmICgkb3B0c3snLWZpbmFsX2VtcHR5X2xpbmUnfSkgeworCQkjIGVuZCB3aXRoIHNpbmdsZSBlbXB0eSBsaW5lCisJCXByaW50ICI8YnIvPlxuIiB1bmxlc3MgJGVtcHR5OworCX0KK30KKworIyByZXR1cm4gbGluayB0YXJnZXQgKHdoYXQgbGluayBwb2ludHMgdG8pCitzdWIgZ2l0X2dldF9saW5rX3RhcmdldCB7CisJbXkgJGhhc2ggPSBzaGlmdDsKKwlteSAkbGlua190YXJnZXQ7CisKKwkjIHJlYWQgbGluaworCW9wZW4gbXkgJGZkLCAiLXwiLCBnaXRfY21kKCksICJjYXQtZmlsZSIsICJibG9iIiwgJGhhc2gKKwkJb3IgcmV0dXJuOworCXsKKwkJbG9jYWwgJC87CisJCSRsaW5rX3RhcmdldCA9IDwkZmQ+OworCX0KKwljbG9zZSAkZmQKKwkJb3IgcmV0dXJuOworCisJcmV0dXJuICRsaW5rX3RhcmdldDsKK30KKworIyBnaXZlbiBsaW5rIHRhcmdldCwgYW5kIHRoZSBkaXJlY3RvcnkgKGJhc2VkaXIpIHRoZSBsaW5rIGlzIGluLAorIyByZXR1cm4gdGFyZ2V0IG9mIGxpbmsgcmVsYXRpdmUgdG8gdG9wIGRpcmVjdG9yeSAodG9wIHRyZWUpOworIyByZXR1cm4gdW5kZWYgaWYgaXQgaXMgbm90IHBvc3NpYmxlIChpbmNsdWRpbmcgYWJzb2x1dGUgbGlua3MpLgorc3ViIG5vcm1hbGl6ZV9saW5rX3RhcmdldCB7CisJbXkgKCRsaW5rX3RhcmdldCwgJGJhc2VkaXIsICRoYXNoX2Jhc2UpID0gQF87CisKKwkjIHdlIGNhbiBub3JtYWxpemUgc3ltbGluayB0YXJnZXQgb25seSBpZiAkaGFzaF9iYXNlIGlzIHByb3ZpZGVkCisJcmV0dXJuIHVubGVzcyAkaGFzaF9iYXNlOworCisJIyBhYnNvbHV0ZSBzeW1saW5rcyAoYmVnaW5uaW5nIHdpdGggJy8nKSBjYW5ub3QgYmUgbm9ybWFsaXplZAorCXJldHVybiBpZiAoc3Vic3RyKCRsaW5rX3RhcmdldCwgMCwgMSkgZXEgJy8nKTsKKworCSMgbm9ybWFsaXplIGxpbmsgdGFyZ2V0IHRvIHBhdGggZnJvbSB0b3AgKHJvb3QpIHRyZWUgKGRpcikKKwlteSAkcGF0aDsKKwlpZiAoJGJhc2VkaXIpIHsKKwkJJHBhdGggPSAkYmFzZWRpciAuICcvJyAuICRsaW5rX3RhcmdldDsKKwl9IGVsc2UgeworCQkjIHdlIGFyZSBpbiB0b3AgKHJvb3QpIHRyZWUgKGRpcikKKwkJJHBhdGggPSAkbGlua190YXJnZXQ7CisJfQorCisJIyByZW1vdmUgLy8sIC8uLywgYW5kIC8uLi8KKwlteSBAcGF0aF9wYXJ0czsKKwlmb3JlYWNoIG15ICRwYXJ0IChzcGxpdCgnLycsICRwYXRoKSkgeworCQkjIGRpc2NhcmQgJy4nIGFuZCAnJworCQluZXh0IGlmICghJHBhcnQgfHwgJHBhcnQgZXEgJy4nKTsKKwkJIyBoYW5kbGUgJy4uJworCQlpZiAoJHBhcnQgZXEgJy4uJykgeworCQkJaWYgKEBwYXRoX3BhcnRzKSB7CisJCQkJcG9wIEBwYXRoX3BhcnRzOworCQkJfSBlbHNlIHsKKwkJCQkjIGxpbmsgbGVhZHMgb3V0c2lkZSByZXBvc2l0b3J5IChvdXRzaWRlIHRvcCBkaXIpCisJCQkJcmV0dXJuOworCQkJfQorCQl9IGVsc2UgeworCQkJcHVzaCBAcGF0aF9wYXJ0cywgJHBhcnQ7CisJCX0KKwl9CisJJHBhdGggPSBqb2luKCcvJywgQHBhdGhfcGFydHMpOworCisJcmV0dXJuICRwYXRoOworfQorCisjIHByaW50IHRyZWUgZW50cnkgKHJvdyBvZiBnaXRfdHJlZSksIGJ1dCB3aXRob3V0IGVuY29tcGFzc2luZyA8dHI+IGVsZW1lbnQKK3N1YiBnaXRfcHJpbnRfdHJlZV9lbnRyeSB7CisJbXkgKCR0LCAkYmFzZWRpciwgJGhhc2hfYmFzZSwgJGhhdmVfYmxhbWUpID0gQF87CisKKwlteSAlYmFzZV9rZXkgPSAoKTsKKwkkYmFzZV9rZXl7J2hhc2hfYmFzZSd9ID0gJGhhc2hfYmFzZSBpZiBkZWZpbmVkICRoYXNoX2Jhc2U7CisKKwkjIFRoZSBmb3JtYXQgb2YgYSB0YWJsZSByb3cgaXM6IG1vZGUgbGlzdCBsaW5rLiAgV2hlcmUgbW9kZSBpcworCSMgdGhlIG1vZGUgb2YgdGhlIGVudHJ5LCBsaXN0IGlzIHRoZSBuYW1lIG9mIHRoZSBlbnRyeSwgYW4gaHJlZiwKKwkjIGFuZCBsaW5rIGlzIHRoZSBhY3Rpb24gbGlua3Mgb2YgdGhlIGVudHJ5LgorCisJcHJpbnQgIjx0ZCBjbGFzcz1cIm1vZGVcIj4iIC4gbW9kZV9zdHIoJHQtPnsnbW9kZSd9KSAuICI8L3RkPlxuIjsKKwlpZiAoJHQtPnsndHlwZSd9IGVxICJibG9iIikgeworCQlwcmludCAiPHRkIGNsYXNzPVwibGlzdFwiPiIgLgorCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJibG9iIiwgaGFzaD0+JHQtPnsnaGFzaCd9LAorCQkJICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiIkYmFzZWRpciR0LT57J25hbWUnfSIsICViYXNlX2tleSksCisJCQkgICAgICAgIC1jbGFzcyA9PiAibGlzdCJ9LCBlc2NfcGF0aCgkdC0+eyduYW1lJ30pKTsKKwkJaWYgKFNfSVNMTksob2N0ICR0LT57J21vZGUnfSkpIHsKKwkJCW15ICRsaW5rX3RhcmdldCA9IGdpdF9nZXRfbGlua190YXJnZXQoJHQtPnsnaGFzaCd9KTsKKwkJCWlmICgkbGlua190YXJnZXQpIHsKKwkJCQlteSAkbm9ybV90YXJnZXQgPSBub3JtYWxpemVfbGlua190YXJnZXQoJGxpbmtfdGFyZ2V0LCAkYmFzZWRpciwgJGhhc2hfYmFzZSk7CisJCQkJaWYgKGRlZmluZWQgJG5vcm1fdGFyZ2V0KSB7CisJCQkJCXByaW50ICIgLT4gIiAuCisJCQkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4ib2JqZWN0IiwgaGFzaF9iYXNlPT4kaGFzaF9iYXNlLAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZT0+JG5vcm1fdGFyZ2V0KSwKKwkJCQkJICAgICAgICAgICAgICAgLXRpdGxlID0+ICRub3JtX3RhcmdldH0sIGVzY19wYXRoKCRsaW5rX3RhcmdldCkpOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50ICIgLT4gIiAuIGVzY19wYXRoKCRsaW5rX3RhcmdldCk7CisJCQkJfQorCQkJfQorCQl9CisJCXByaW50ICI8L3RkPlxuIjsKKwkJcHJpbnQgIjx0ZCBjbGFzcz1cImxpbmtcIj4iOworCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImJsb2IiLCBoYXNoPT4kdC0+eydoYXNoJ30sCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4iJGJhc2VkaXIkdC0+eyduYW1lJ30iLCAlYmFzZV9rZXkpfSwKKwkJICAgICAgICAgICAgICAiYmxvYiIpOworCQlpZiAoJGhhdmVfYmxhbWUpIHsKKwkJCXByaW50ICIgfCAiIC4KKwkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxhbWUiLCBoYXNoPT4kdC0+eydoYXNoJ30sCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZT0+IiRiYXNlZGlyJHQtPnsnbmFtZSd9IiwgJWJhc2Vfa2V5KX0sCisJCQkgICAgICAgICAgICAgICJibGFtZSIpOworCQl9CisJCWlmIChkZWZpbmVkICRoYXNoX2Jhc2UpIHsKKwkJCXByaW50ICIgfCAiIC4KKwkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iaGlzdG9yeSIsIGhhc2hfYmFzZT0+JGhhc2hfYmFzZSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaD0+JHQtPnsnaGFzaCd9LCBmaWxlX25hbWU9PiIkYmFzZWRpciR0LT57J25hbWUnfSIpfSwKKwkJCSAgICAgICAgICAgICAgImhpc3RvcnkiKTsKKwkJfQorCQlwcmludCAiIHwgIiAuCisJCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImJsb2JfcGxhaW4iLCBoYXNoX2Jhc2U9PiRoYXNoX2Jhc2UsCisJCQkgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZT0+IiRiYXNlZGlyJHQtPnsnbmFtZSd9Iil9LAorCQkJICAgICAgICAicmF3Iik7CisJCXByaW50ICI8L3RkPlxuIjsKKworCX0gZWxzaWYgKCR0LT57J3R5cGUnfSBlcSAidHJlZSIpIHsKKwkJcHJpbnQgIjx0ZCBjbGFzcz1cImxpc3RcIj4iOworCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+InRyZWUiLCBoYXNoPT4kdC0+eydoYXNoJ30sCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4iJGJhc2VkaXIkdC0+eyduYW1lJ30iLCAlYmFzZV9rZXkpfSwKKwkJICAgICAgICAgICAgICBlc2NfcGF0aCgkdC0+eyduYW1lJ30pKTsKKwkJcHJpbnQgIjwvdGQ+XG4iOworCQlwcmludCAiPHRkIGNsYXNzPVwibGlua1wiPiI7CisJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4idHJlZSIsIGhhc2g9PiR0LT57J2hhc2gnfSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiIkYmFzZWRpciR0LT57J25hbWUnfSIsICViYXNlX2tleSl9LAorCQkgICAgICAgICAgICAgICJ0cmVlIik7CisJCWlmIChkZWZpbmVkICRoYXNoX2Jhc2UpIHsKKwkJCXByaW50ICIgfCAiIC4KKwkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iaGlzdG9yeSIsIGhhc2hfYmFzZT0+JGhhc2hfYmFzZSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4iJGJhc2VkaXIkdC0+eyduYW1lJ30iKX0sCisJCQkgICAgICAgICAgICAgICJoaXN0b3J5Iik7CisJCX0KKwkJcHJpbnQgIjwvdGQ+XG4iOworCX0gZWxzZSB7CisJCSMgdW5rbm93biBvYmplY3Q6IHdlIGNhbiBvbmx5IHByZXNlbnQgaGlzdG9yeSBmb3IgaXQKKwkJIyAodGhpcyBpbmNsdWRlcyAnY29tbWl0JyBvYmplY3QsIGkuZS4gc3VibW9kdWxlIHN1cHBvcnQpCisJCXByaW50ICI8dGQgY2xhc3M9XCJsaXN0XCI+IiAuCisJCSAgICAgIGVzY19wYXRoKCR0LT57J25hbWUnfSkgLgorCQkgICAgICAiPC90ZD5cbiI7CisJCXByaW50ICI8dGQgY2xhc3M9XCJsaW5rXCI+IjsKKwkJaWYgKGRlZmluZWQgJGhhc2hfYmFzZSkgeworCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJoaXN0b3J5IiwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9iYXNlPT4kaGFzaF9iYXNlLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiIkYmFzZWRpciR0LT57J25hbWUnfSIpfSwKKwkJCSAgICAgICAgICAgICAgImhpc3RvcnkiKTsKKwkJfQorCQlwcmludCAiPC90ZD5cbiI7CisJfQorfQorCisjIyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisjIyBmdW5jdGlvbnMgcHJpbnRpbmcgbGFyZ2UgZnJhZ21lbnRzIG9mIEhUTUwKKworIyBnZXQgcHJlLWltYWdlIGZpbGVuYW1lcyBmb3IgbWVyZ2UgKGNvbWJpbmVkKSBkaWZmCitzdWIgZmlsbF9mcm9tX2ZpbGVfaW5mbyB7CisJbXkgKCRkaWZmLCBAcGFyZW50cykgPSBAXzsKKworCSRkaWZmLT57J2Zyb21fZmlsZSd9ID0gWyBdOworCSRkaWZmLT57J2Zyb21fZmlsZSd9WyRkaWZmLT57J25wYXJlbnRzJ30gLSAxXSA9IHVuZGVmOworCWZvciAobXkgJGkgPSAwOyAkaSA8ICRkaWZmLT57J25wYXJlbnRzJ307ICRpKyspIHsKKwkJaWYgKCRkaWZmLT57J3N0YXR1cyd9WyRpXSBlcSAnUicgfHwKKwkJICAgICRkaWZmLT57J3N0YXR1cyd9WyRpXSBlcSAnQycpIHsKKwkJCSRkaWZmLT57J2Zyb21fZmlsZSd9WyRpXSA9CisJCQkJZ2l0X2dldF9wYXRoX2J5X2hhc2goJHBhcmVudHNbJGldLCAkZGlmZi0+eydmcm9tX2lkJ31bJGldKTsKKwkJfQorCX0KKworCXJldHVybiAkZGlmZjsKK30KKworIyBpcyBjdXJyZW50IHJhdyBkaWZmdHJlZSBsaW5lIG9mIGZpbGUgZGVsZXRpb24KK3N1YiBpc19kZWxldGVkIHsKKwlteSAkZGlmZmluZm8gPSBzaGlmdDsKKworCXJldHVybiAkZGlmZmluZm8tPnsndG9faWQnfSBlcSAoJzAnIHggNDApOworfQorCisjIGRvZXMgcGF0Y2ggY29ycmVzcG9uZCB0byBbcHJldmlvdXNdIGRpZmZ0cmVlIHJhdyBsaW5lCisjICRkaWZmaW5mbyAgLSBoYXNocmVmIG9mIHBhcnNlZCByYXcgZGlmZiBmb3JtYXQKKyMgJHBhdGNoaW5mbyAtIGhhc2hyZWYgb2YgcGFyc2VkIHBhdGNoIGRpZmYgZm9ybWF0CisjICAgICAgICAgICAgICAodGhlIHNhbWUga2V5cyBhcyBpbiAkZGlmZmluZm8pCitzdWIgaXNfcGF0Y2hfc3BsaXQgeworCW15ICgkZGlmZmluZm8sICRwYXRjaGluZm8pID0gQF87CisKKwlyZXR1cm4gZGVmaW5lZCAkZGlmZmluZm8gJiYgZGVmaW5lZCAkcGF0Y2hpbmZvCisJCSYmICRkaWZmaW5mby0+eyd0b19maWxlJ30gZXEgJHBhdGNoaW5mby0+eyd0b19maWxlJ307Cit9CisKKworc3ViIGdpdF9kaWZmdHJlZV9ib2R5IHsKKwlteSAoJGRpZmZ0cmVlLCAkaGFzaCwgQHBhcmVudHMpID0gQF87CisJbXkgKCRwYXJlbnQpID0gJHBhcmVudHNbMF07CisJbXkgKCRoYXZlX2JsYW1lKSA9IGdpdHdlYl9jaGVja19mZWF0dXJlKCdibGFtZScpOworCXByaW50ICI8ZGl2IGNsYXNzPVwibGlzdF9oZWFkXCI+XG4iOworCWlmICgkI3skZGlmZnRyZWV9ID4gMTApIHsKKwkJcHJpbnQoKCQjeyRkaWZmdHJlZX0gKyAxKSAuICIgZmlsZXMgY2hhbmdlZDpcbiIpOworCX0KKwlwcmludCAiPC9kaXY+XG4iOworCisJcHJpbnQgIjx0YWJsZSBjbGFzcz1cIiIgLgorCSAgICAgIChAcGFyZW50cyA+IDEgPyAiY29tYmluZWQgIiA6ICIiKSAuCisJICAgICAgImRpZmZfdHJlZVwiPlxuIjsKKworCSMgaGVhZGVyIG9ubHkgZm9yIGNvbWJpbmVkIGRpZmYgaW4gJ2NvbW1pdGRpZmYnIHZpZXcKKwlteSAkaGFzX2hlYWRlciA9IEAkZGlmZnRyZWUgJiYgQHBhcmVudHMgPiAxICYmICRhY3Rpb24gZXEgJ2NvbW1pdGRpZmYnOworCWlmICgkaGFzX2hlYWRlcikgeworCQkjIHRhYmxlIGhlYWRlcgorCQlwcmludCAiPHRoZWFkPjx0cj5cbiIgLgorCQkgICAgICAgIjx0aD48L3RoPjx0aD48L3RoPlxuIjsgIyBmaWxlbmFtZSwgcGF0Y2hOIGxpbmsKKwkJZm9yIChteSAkaSA9IDA7ICRpIDwgQHBhcmVudHM7ICRpKyspIHsKKwkJCW15ICRwYXIgPSAkcGFyZW50c1skaV07CisJCQlwcmludCAiPHRoPiIgLgorCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJjb21taXRkaWZmIiwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaD0+JGhhc2gsIGhhc2hfcGFyZW50PT4kcGFyKSwKKwkJCSAgICAgICAgICAgICAgIC10aXRsZSA9PiAnY29tbWl0ZGlmZiB0byBwYXJlbnQgbnVtYmVyICcgLgorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAoJGkrMSkgLiAnOiAnIC4gc3Vic3RyKCRwYXIsMCw3KX0sCisJCQkgICAgICAgICAgICAgICRpKzEpIC4KKwkJCSAgICAgICImbmJzcDs8L3RoPlxuIjsKKwkJfQorCQlwcmludCAiPC90cj48L3RoZWFkPlxuPHRib2R5PlxuIjsKKwl9CisKKwlteSAkYWx0ZXJuYXRlID0gMTsKKwlteSAkcGF0Y2hubyA9IDA7CisJZm9yZWFjaCBteSAkbGluZSAoQHskZGlmZnRyZWV9KSB7CisJCW15ICRkaWZmID0gcGFyc2VkX2RpZmZ0cmVlX2xpbmUoJGxpbmUpOworCisJCWlmICgkYWx0ZXJuYXRlKSB7CisJCQlwcmludCAiPHRyIGNsYXNzPVwiZGFya1wiPlxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJsaWdodFwiPlxuIjsKKwkJfQorCQkkYWx0ZXJuYXRlIF49IDE7CisKKwkJaWYgKGV4aXN0cyAkZGlmZi0+eyducGFyZW50cyd9KSB7ICMgY29tYmluZWQgZGlmZgorCisJCQlmaWxsX2Zyb21fZmlsZV9pbmZvKCRkaWZmLCBAcGFyZW50cykKKwkJCQl1bmxlc3MgZXhpc3RzICRkaWZmLT57J2Zyb21fZmlsZSd9OworCisJCQlpZiAoIWlzX2RlbGV0ZWQoJGRpZmYpKSB7CisJCQkJIyBmaWxlIGV4aXN0cyBpbiB0aGUgcmVzdWx0IChjaGlsZCkgY29tbWl0CisJCQkJcHJpbnQgIjx0ZD4iIC4KKwkJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImJsb2IiLCBoYXNoPT4kZGlmZi0+eyd0b19pZCd9LAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4kZGlmZi0+eyd0b19maWxlJ30sCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2Jhc2U9PiRoYXNoKSwKKwkJCQkgICAgICAgICAgICAgIC1jbGFzcyA9PiAibGlzdCJ9LCBlc2NfcGF0aCgkZGlmZi0+eyd0b19maWxlJ30pKSAuCisJCQkJICAgICAgIjwvdGQ+XG4iOworCQkJfSBlbHNlIHsKKwkJCQlwcmludCAiPHRkPiIgLgorCQkJCSAgICAgIGVzY19wYXRoKCRkaWZmLT57J3RvX2ZpbGUnfSkgLgorCQkJCSAgICAgICI8L3RkPlxuIjsKKwkJCX0KKworCQkJaWYgKCRhY3Rpb24gZXEgJ2NvbW1pdGRpZmYnKSB7CisJCQkJIyBsaW5rIHRvIHBhdGNoCisJCQkJJHBhdGNobm8rKzsKKwkJCQlwcmludCAiPHRkIGNsYXNzPVwibGlua1wiPiIgLgorCQkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIjcGF0Y2gkcGF0Y2hubyJ9LCAicGF0Y2giKSAuCisJCQkJICAgICAgIiB8ICIgLgorCQkJCSAgICAgICI8L3RkPlxuIjsKKwkJCX0KKworCQkJbXkgJGhhc19oaXN0b3J5ID0gMDsKKwkJCW15ICRub3RfZGVsZXRlZCA9IDA7CisJCQlmb3IgKG15ICRpID0gMDsgJGkgPCAkZGlmZi0+eyducGFyZW50cyd9OyAkaSsrKSB7CisJCQkJbXkgJGhhc2hfcGFyZW50ID0gJHBhcmVudHNbJGldOworCQkJCW15ICRmcm9tX2hhc2ggPSAkZGlmZi0+eydmcm9tX2lkJ31bJGldOworCQkJCW15ICRmcm9tX3BhdGggPSAkZGlmZi0+eydmcm9tX2ZpbGUnfVskaV07CisJCQkJbXkgJHN0YXR1cyA9ICRkaWZmLT57J3N0YXR1cyd9WyRpXTsKKworCQkJCSRoYXNfaGlzdG9yeSB8fD0gKCRzdGF0dXMgbmUgJ0EnKTsKKwkJCQkkbm90X2RlbGV0ZWQgfHw9ICgkc3RhdHVzIG5lICdEJyk7CisKKwkJCQlpZiAoJHN0YXR1cyBlcSAnQScpIHsKKwkJCQkJcHJpbnQgIjx0ZCAgY2xhc3M9XCJsaW5rXCIgYWxpZ249XCJyaWdodFwiPiB8IDwvdGQ+XG4iOworCQkJCX0gZWxzaWYgKCRzdGF0dXMgZXEgJ0QnKSB7CisJCQkJCXByaW50ICI8dGQgY2xhc3M9XCJsaW5rXCI+IiAuCisJCQkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYiIsCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9iYXNlPT4kaGFzaCwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoPT4kZnJvbV9oYXNoLAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZT0+JGZyb21fcGF0aCl9LAorCQkJCQkgICAgICAgICAgICAgICJibG9iIiAuICgkaSsxKSkgLgorCQkJCQkgICAgICAiIHwgPC90ZD5cbiI7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKCRkaWZmLT57J3RvX2lkJ30gZXEgJGZyb21faGFzaCkgeworCQkJCQkJcHJpbnQgIjx0ZCBjbGFzcz1cImxpbmsgbm9jaGFuZ2VcIj4iOworCQkJCQl9IGVsc2UgeworCQkJCQkJcHJpbnQgIjx0ZCBjbGFzcz1cImxpbmtcIj4iOworCQkJCQl9CisJCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYmRpZmYiLAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2g9PiRkaWZmLT57J3RvX2lkJ30sCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9wYXJlbnQ9PiRmcm9tX2hhc2gsCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9iYXNlPT4kaGFzaCwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX3BhcmVudF9iYXNlPT4kaGFzaF9wYXJlbnQsCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4kZGlmZi0+eyd0b19maWxlJ30sCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wYXJlbnQ9PiRmcm9tX3BhdGgpfSwKKwkJCQkJICAgICAgICAgICAgICAiZGlmZiIgLiAoJGkrMSkpIC4KKwkJCQkJICAgICAgIiB8IDwvdGQ+XG4iOworCQkJCX0KKwkJCX0KKworCQkJcHJpbnQgIjx0ZCBjbGFzcz1cImxpbmtcIj4iOworCQkJaWYgKCRub3RfZGVsZXRlZCkgeworCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYiIsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoPT4kZGlmZi0+eyd0b19pZCd9LAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4kZGlmZi0+eyd0b19maWxlJ30sCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2Jhc2U9PiRoYXNoKX0sCisJCQkJICAgICAgICAgICAgICAiYmxvYiIpOworCQkJCXByaW50ICIgfCAiIGlmICgkaGFzX2hpc3RvcnkpOworCQkJfQorCQkJaWYgKCRoYXNfaGlzdG9yeSkgeworCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iaGlzdG9yeSIsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiRkaWZmLT57J3RvX2ZpbGUnfSwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfYmFzZT0+JGhhc2gpfSwKKwkJCQkgICAgICAgICAgICAgICJoaXN0b3J5Iik7CisJCQl9CisJCQlwcmludCAiPC90ZD5cbiI7CisKKwkJCXByaW50ICI8L3RyPlxuIjsKKwkJCW5leHQ7ICMgaW5zdGVhZCBvZiAnZWxzZScgY2xhdXNlLCB0byBhdm9pZCBleHRyYSBpbmRlbnQKKwkJfQorCQkjIGVsc2Ugb3JkaW5hcnkgZGlmZgorCisJCW15ICgkdG9fbW9kZV9vY3QsICR0b19tb2RlX3N0ciwgJHRvX2ZpbGVfdHlwZSk7CisJCW15ICgkZnJvbV9tb2RlX29jdCwgJGZyb21fbW9kZV9zdHIsICRmcm9tX2ZpbGVfdHlwZSk7CisJCWlmICgkZGlmZi0+eyd0b19tb2RlJ30gbmUgKCcwJyB4IDYpKSB7CisJCQkkdG9fbW9kZV9vY3QgPSBvY3QgJGRpZmYtPnsndG9fbW9kZSd9OworCQkJaWYgKFNfSVNSRUcoJHRvX21vZGVfb2N0KSkgeyAjIG9ubHkgZm9yIHJlZ3VsYXIgZmlsZQorCQkJCSR0b19tb2RlX3N0ciA9IHNwcmludGYoIiUwNG8iLCAkdG9fbW9kZV9vY3QgJiAwNzc3KTsgIyBwZXJtaXNzaW9uIGJpdHMKKwkJCX0KKwkJCSR0b19maWxlX3R5cGUgPSBmaWxlX3R5cGUoJGRpZmYtPnsndG9fbW9kZSd9KTsKKwkJfQorCQlpZiAoJGRpZmYtPnsnZnJvbV9tb2RlJ30gbmUgKCcwJyB4IDYpKSB7CisJCQkkZnJvbV9tb2RlX29jdCA9IG9jdCAkZGlmZi0+eydmcm9tX21vZGUnfTsKKwkJCWlmIChTX0lTUkVHKCR0b19tb2RlX29jdCkpIHsgIyBvbmx5IGZvciByZWd1bGFyIGZpbGUKKwkJCQkkZnJvbV9tb2RlX3N0ciA9IHNwcmludGYoIiUwNG8iLCAkZnJvbV9tb2RlX29jdCAmIDA3NzcpOyAjIHBlcm1pc3Npb24gYml0cworCQkJfQorCQkJJGZyb21fZmlsZV90eXBlID0gZmlsZV90eXBlKCRkaWZmLT57J2Zyb21fbW9kZSd9KTsKKwkJfQorCisJCWlmICgkZGlmZi0+eydzdGF0dXMnfSBlcSAiQSIpIHsgIyBjcmVhdGVkCisJCQlteSAkbW9kZV9jaG5nID0gIjxzcGFuIGNsYXNzPVwiZmlsZV9zdGF0dXMgbmV3XCI+W25ldyAkdG9fZmlsZV90eXBlIjsKKwkJCSRtb2RlX2NobmcgICAuPSAiIHdpdGggbW9kZTogJHRvX21vZGVfc3RyIiBpZiAkdG9fbW9kZV9zdHI7CisJCQkkbW9kZV9jaG5nICAgLj0gIl08L3NwYW4+IjsKKwkJCXByaW50ICI8dGQ+IjsKKwkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYiIsIGhhc2g9PiRkaWZmLT57J3RvX2lkJ30sCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfYmFzZT0+JGhhc2gsIGZpbGVfbmFtZT0+JGRpZmYtPnsnZmlsZSd9KSwKKwkJCSAgICAgICAgICAgICAgLWNsYXNzID0+ICJsaXN0In0sIGVzY19wYXRoKCRkaWZmLT57J2ZpbGUnfSkpOworCQkJcHJpbnQgIjwvdGQ+XG4iOworCQkJcHJpbnQgIjx0ZD4kbW9kZV9jaG5nPC90ZD5cbiI7CisJCQlwcmludCAiPHRkIGNsYXNzPVwibGlua1wiPiI7CisJCQlpZiAoJGFjdGlvbiBlcSAnY29tbWl0ZGlmZicpIHsKKwkJCQkjIGxpbmsgdG8gcGF0Y2gKKwkJCQkkcGF0Y2hubysrOworCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+ICIjcGF0Y2gkcGF0Y2hubyJ9LCAicGF0Y2giKTsKKwkJCQlwcmludCAiIHwgIjsKKwkJCX0KKwkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYiIsIGhhc2g9PiRkaWZmLT57J3RvX2lkJ30sCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfYmFzZT0+JGhhc2gsIGZpbGVfbmFtZT0+JGRpZmYtPnsnZmlsZSd9KX0sCisJCQkgICAgICAgICAgICAgICJibG9iIik7CisJCQlwcmludCAiPC90ZD5cbiI7CisKKwkJfSBlbHNpZiAoJGRpZmYtPnsnc3RhdHVzJ30gZXEgIkQiKSB7ICMgZGVsZXRlZAorCQkJbXkgJG1vZGVfY2huZyA9ICI8c3BhbiBjbGFzcz1cImZpbGVfc3RhdHVzIGRlbGV0ZWRcIj5bZGVsZXRlZCAkZnJvbV9maWxlX3R5cGVdPC9zcGFuPiI7CisJCQlwcmludCAiPHRkPiI7CisJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImJsb2IiLCBoYXNoPT4kZGlmZi0+eydmcm9tX2lkJ30sCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfYmFzZT0+JHBhcmVudCwgZmlsZV9uYW1lPT4kZGlmZi0+eydmaWxlJ30pLAorCQkJICAgICAgICAgICAgICAgLWNsYXNzID0+ICJsaXN0In0sIGVzY19wYXRoKCRkaWZmLT57J2ZpbGUnfSkpOworCQkJcHJpbnQgIjwvdGQ+XG4iOworCQkJcHJpbnQgIjx0ZD4kbW9kZV9jaG5nPC90ZD5cbiI7CisJCQlwcmludCAiPHRkIGNsYXNzPVwibGlua1wiPiI7CisJCQlpZiAoJGFjdGlvbiBlcSAnY29tbWl0ZGlmZicpIHsKKwkJCQkjIGxpbmsgdG8gcGF0Y2gKKwkJCQkkcGF0Y2hubysrOworCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+ICIjcGF0Y2gkcGF0Y2hubyJ9LCAicGF0Y2giKTsKKwkJCQlwcmludCAiIHwgIjsKKwkJCX0KKwkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYiIsIGhhc2g9PiRkaWZmLT57J2Zyb21faWQnfSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9iYXNlPT4kcGFyZW50LCBmaWxlX25hbWU9PiRkaWZmLT57J2ZpbGUnfSl9LAorCQkJICAgICAgICAgICAgICAiYmxvYiIpIC4gIiB8ICI7CisJCQlpZiAoJGhhdmVfYmxhbWUpIHsKKwkJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImJsYW1lIiwgaGFzaF9iYXNlPT4kcGFyZW50LAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4kZGlmZi0+eydmaWxlJ30pfSwKKwkJCQkgICAgICAgICAgICAgICJibGFtZSIpIC4gIiB8ICI7CisJCQl9CisJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+Imhpc3RvcnkiLCBoYXNoX2Jhc2U9PiRwYXJlbnQsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZT0+JGRpZmYtPnsnZmlsZSd9KX0sCisJCQkgICAgICAgICAgICAgICJoaXN0b3J5Iik7CisJCQlwcmludCAiPC90ZD5cbiI7CisKKwkJfSBlbHNpZiAoJGRpZmYtPnsnc3RhdHVzJ30gZXEgIk0iIHx8ICRkaWZmLT57J3N0YXR1cyd9IGVxICJUIikgeyAjIG1vZGlmaWVkLCBvciB0eXBlIGNoYW5nZWQKKwkJCW15ICRtb2RlX2NobmdlID0gIiI7CisJCQlpZiAoJGRpZmYtPnsnZnJvbV9tb2RlJ30gIT0gJGRpZmYtPnsndG9fbW9kZSd9KSB7CisJCQkJJG1vZGVfY2huZ2UgPSAiPHNwYW4gY2xhc3M9XCJmaWxlX3N0YXR1cyBtb2RlX2NobmdlXCI+W2NoYW5nZWQiOworCQkJCWlmICgkZnJvbV9maWxlX3R5cGUgbmUgJHRvX2ZpbGVfdHlwZSkgeworCQkJCQkkbW9kZV9jaG5nZSAuPSAiIGZyb20gJGZyb21fZmlsZV90eXBlIHRvICR0b19maWxlX3R5cGUiOworCQkJCX0KKwkJCQlpZiAoKCRmcm9tX21vZGVfb2N0ICYgMDc3NykgIT0gKCR0b19tb2RlX29jdCAmIDA3NzcpKSB7CisJCQkJCWlmICgkZnJvbV9tb2RlX3N0ciAmJiAkdG9fbW9kZV9zdHIpIHsKKwkJCQkJCSRtb2RlX2NobmdlIC49ICIgbW9kZTogJGZyb21fbW9kZV9zdHItPiR0b19tb2RlX3N0ciI7CisJCQkJCX0gZWxzaWYgKCR0b19tb2RlX3N0cikgeworCQkJCQkJJG1vZGVfY2huZ2UgLj0gIiBtb2RlOiAkdG9fbW9kZV9zdHIiOworCQkJCQl9CisJCQkJfQorCQkJCSRtb2RlX2NobmdlIC49ICJdPC9zcGFuPlxuIjsKKwkJCX0KKwkJCXByaW50ICI8dGQ+IjsKKwkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYiIsIGhhc2g9PiRkaWZmLT57J3RvX2lkJ30sCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfYmFzZT0+JGhhc2gsIGZpbGVfbmFtZT0+JGRpZmYtPnsnZmlsZSd9KSwKKwkJCSAgICAgICAgICAgICAgLWNsYXNzID0+ICJsaXN0In0sIGVzY19wYXRoKCRkaWZmLT57J2ZpbGUnfSkpOworCQkJcHJpbnQgIjwvdGQ+XG4iOworCQkJcHJpbnQgIjx0ZD4kbW9kZV9jaG5nZTwvdGQ+XG4iOworCQkJcHJpbnQgIjx0ZCBjbGFzcz1cImxpbmtcIj4iOworCQkJaWYgKCRhY3Rpb24gZXEgJ2NvbW1pdGRpZmYnKSB7CisJCQkJIyBsaW5rIHRvIHBhdGNoCisJCQkJJHBhdGNobm8rKzsKKwkJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiAiI3BhdGNoJHBhdGNobm8ifSwgInBhdGNoIikgLgorCQkJCSAgICAgICIgfCAiOworCQkJfSBlbHNpZiAoJGRpZmYtPnsndG9faWQnfSBuZSAkZGlmZi0+eydmcm9tX2lkJ30pIHsKKwkJCQkjICJjb21taXQiIHZpZXcgYW5kIG1vZGlmaWVkIGZpbGUgKG5vdCBvbmx1IG1vZGUgY2hhbmdlZCkKKwkJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImJsb2JkaWZmIiwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2g9PiRkaWZmLT57J3RvX2lkJ30sIGhhc2hfcGFyZW50PT4kZGlmZi0+eydmcm9tX2lkJ30sCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2Jhc2U9PiRoYXNoLCBoYXNoX3BhcmVudF9iYXNlPT4kcGFyZW50LAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4kZGlmZi0+eydmaWxlJ30pfSwKKwkJCQkgICAgICAgICAgICAgICJkaWZmIikgLgorCQkJCSAgICAgICIgfCAiOworCQkJfQorCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJibG9iIiwgaGFzaD0+JGRpZmYtPnsndG9faWQnfSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9iYXNlPT4kaGFzaCwgZmlsZV9uYW1lPT4kZGlmZi0+eydmaWxlJ30pfSwKKwkJCSAgICAgICAgICAgICAgICJibG9iIikgLiAiIHwgIjsKKwkJCWlmICgkaGF2ZV9ibGFtZSkgeworCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxhbWUiLCBoYXNoX2Jhc2U9PiRoYXNoLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4kZGlmZi0+eydmaWxlJ30pfSwKKwkJCQkgICAgICAgICAgICAgICJibGFtZSIpIC4gIiB8ICI7CisJCQl9CisJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+Imhpc3RvcnkiLCBoYXNoX2Jhc2U9PiRoYXNoLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiRkaWZmLT57J2ZpbGUnfSl9LAorCQkJICAgICAgICAgICAgICAiaGlzdG9yeSIpOworCQkJcHJpbnQgIjwvdGQ+XG4iOworCisJCX0gZWxzaWYgKCRkaWZmLT57J3N0YXR1cyd9IGVxICJSIiB8fCAkZGlmZi0+eydzdGF0dXMnfSBlcSAiQyIpIHsgIyByZW5hbWVkIG9yIGNvcGllZAorCQkJbXkgJXN0YXR1c19uYW1lID0gKCdSJyA9PiAnbW92ZWQnLCAnQycgPT4gJ2NvcGllZCcpOworCQkJbXkgJG5zdGF0dXMgPSAkc3RhdHVzX25hbWV7JGRpZmYtPnsnc3RhdHVzJ319OworCQkJbXkgJG1vZGVfY2huZyA9ICIiOworCQkJaWYgKCRkaWZmLT57J2Zyb21fbW9kZSd9ICE9ICRkaWZmLT57J3RvX21vZGUnfSkgeworCQkJCSMgbW9kZSBhbHNvIGZvciBkaXJlY3Rvcmllcywgc28gd2UgY2Fubm90IHVzZSAkdG9fbW9kZV9zdHIKKwkJCQkkbW9kZV9jaG5nID0gc3ByaW50ZigiLCBtb2RlOiAlMDRvIiwgJHRvX21vZGVfb2N0ICYgMDc3Nyk7CisJCQl9CisJCQlwcmludCAiPHRkPiIgLgorCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJibG9iIiwgaGFzaF9iYXNlPT4kaGFzaCwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaD0+JGRpZmYtPnsndG9faWQnfSwgZmlsZV9uYW1lPT4kZGlmZi0+eyd0b19maWxlJ30pLAorCQkJICAgICAgICAgICAgICAtY2xhc3MgPT4gImxpc3QifSwgZXNjX3BhdGgoJGRpZmYtPnsndG9fZmlsZSd9KSkgLiAiPC90ZD5cbiIgLgorCQkJICAgICAgIjx0ZD48c3BhbiBjbGFzcz1cImZpbGVfc3RhdHVzICRuc3RhdHVzXCI+WyRuc3RhdHVzIGZyb20gIiAuCisJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImJsb2IiLCBoYXNoX2Jhc2U9PiRwYXJlbnQsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2g9PiRkaWZmLT57J2Zyb21faWQnfSwgZmlsZV9uYW1lPT4kZGlmZi0+eydmcm9tX2ZpbGUnfSksCisJCQkgICAgICAgICAgICAgIC1jbGFzcyA9PiAibGlzdCJ9LCBlc2NfcGF0aCgkZGlmZi0+eydmcm9tX2ZpbGUnfSkpIC4KKwkJCSAgICAgICIgd2l0aCAiIC4gKGludCAkZGlmZi0+eydzaW1pbGFyaXR5J30pIC4gIiUgc2ltaWxhcml0eSRtb2RlX2NobmddPC9zcGFuPjwvdGQ+XG4iIC4KKwkJCSAgICAgICI8dGQgY2xhc3M9XCJsaW5rXCI+IjsKKwkJCWlmICgkYWN0aW9uIGVxICdjb21taXRkaWZmJykgeworCQkJCSMgbGluayB0byBwYXRjaAorCQkJCSRwYXRjaG5vKys7CisJCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gIiNwYXRjaCRwYXRjaG5vIn0sICJwYXRjaCIpIC4KKwkJCQkgICAgICAiIHwgIjsKKwkJCX0gZWxzaWYgKCRkaWZmLT57J3RvX2lkJ30gbmUgJGRpZmYtPnsnZnJvbV9pZCd9KSB7CisJCQkJIyAiY29tbWl0IiB2aWV3IGFuZCBtb2RpZmllZCBmaWxlIChub3Qgb25seSBwdXJlIHJlbmFtZSBvciBjb3B5KQorCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYmRpZmYiLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaD0+JGRpZmYtPnsndG9faWQnfSwgaGFzaF9wYXJlbnQ9PiRkaWZmLT57J2Zyb21faWQnfSwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfYmFzZT0+JGhhc2gsIGhhc2hfcGFyZW50X2Jhc2U9PiRwYXJlbnQsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiRkaWZmLT57J3RvX2ZpbGUnfSwgZmlsZV9wYXJlbnQ9PiRkaWZmLT57J2Zyb21fZmlsZSd9KX0sCisJCQkJICAgICAgICAgICAgICAiZGlmZiIpIC4KKwkJCQkgICAgICAiIHwgIjsKKwkJCX0KKwkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYiIsIGhhc2g9PiRkaWZmLT57J3RvX2lkJ30sCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfYmFzZT0+JHBhcmVudCwgZmlsZV9uYW1lPT4kZGlmZi0+eyd0b19maWxlJ30pfSwKKwkJCSAgICAgICAgICAgICAgImJsb2IiKSAuICIgfCAiOworCQkJaWYgKCRoYXZlX2JsYW1lKSB7CisJCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJibGFtZSIsIGhhc2hfYmFzZT0+JGhhc2gsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiRkaWZmLT57J3RvX2ZpbGUnfSl9LAorCQkJCSAgICAgICAgICAgICAgImJsYW1lIikgLiAiIHwgIjsKKwkJCX0KKwkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iaGlzdG9yeSIsIGhhc2hfYmFzZT0+JGhhc2gsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4kZGlmZi0+eyd0b19maWxlJ30pfSwKKwkJCSAgICAgICAgICAgICAgImhpc3RvcnkiKTsKKwkJCXByaW50ICI8L3RkPlxuIjsKKworCQl9ICMgd2Ugc2hvdWxkIG5vdCBlbmNvdW50ZXIgVW5tZXJnZWQgKFUpIG9yIFVua25vd24gKFgpIHN0YXR1cworCQlwcmludCAiPC90cj5cbiI7CisJfQorCXByaW50ICI8L3Rib2R5PiIgaWYgJGhhc19oZWFkZXI7CisJcHJpbnQgIjwvdGFibGU+XG4iOworfQorCitzdWIgZ2l0X3BhdGNoc2V0X2JvZHkgeworCW15ICgkZmQsICRkaWZmdHJlZSwgJGhhc2gsIEBoYXNoX3BhcmVudHMpID0gQF87CisJbXkgKCRoYXNoX3BhcmVudCkgPSAkaGFzaF9wYXJlbnRzWzBdOworCisJbXkgJGlzX2NvbWJpbmVkID0gKEBoYXNoX3BhcmVudHMgPiAxKTsKKwlteSAkcGF0Y2hfaWR4ID0gMDsKKwlteSAkcGF0Y2hfbnVtYmVyID0gMDsKKwlteSAkcGF0Y2hfbGluZTsKKwlteSAkZGlmZmluZm87CisJbXkgJHRvX25hbWU7CisJbXkgKCVmcm9tLCAldG8pOworCisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYXRjaHNldFwiPlxuIjsKKworCSMgc2tpcCB0byBmaXJzdCBwYXRjaAorCXdoaWxlICgkcGF0Y2hfbGluZSA9IDwkZmQ+KSB7CisJCWNob21wICRwYXRjaF9saW5lOworCisJCWxhc3QgaWYgKCRwYXRjaF9saW5lID1+IG0vXmRpZmYgLyk7CisJfQorCisgUEFUQ0g6CisJd2hpbGUgKCRwYXRjaF9saW5lKSB7CisKKwkJIyBwYXJzZSAiZ2l0IGRpZmYiIGhlYWRlciBsaW5lCisJCWlmICgkcGF0Y2hfbGluZSA9fiBtL15kaWZmIC0tZ2l0IChcIig/OlteXFxcIl0qKD86XFwuW15cXFwiXSopKilcInxbXiAiXSopICguKikkLykgeworCQkJIyAkMSBpcyBmcm9tX25hbWUsIHdoaWNoIHdlIGRvIG5vdCB1c2UKKwkJCSR0b19uYW1lID0gdW5xdW90ZSgkMik7CisJCQkkdG9fbmFtZSA9fiBzIV5iLyEhOworCQl9IGVsc2lmICgkcGF0Y2hfbGluZSA9fiBtL15kaWZmIC0tKGNjfGNvbWJpbmVkKSAoIj8uKiI/KSQvKSB7CisJCQkjICQxIGlzICdjYycgb3IgJ2NvbWJpbmVkJywgd2hpY2ggd2UgZG8gbm90IHVzZQorCQkJJHRvX25hbWUgPSB1bnF1b3RlKCQyKTsKKwkJfSBlbHNlIHsKKwkJCSR0b19uYW1lID0gdW5kZWY7CisJCX0KKworCQkjIGNoZWNrIGlmIGN1cnJlbnQgcGF0Y2ggYmVsb25nIHRvIGN1cnJlbnQgcmF3IGxpbmUKKwkJIyBhbmQgcGFyc2UgcmF3IGdpdC1kaWZmIGxpbmUgaWYgbmVlZGVkCisJCWlmIChpc19wYXRjaF9zcGxpdCgkZGlmZmluZm8sIHsgJ3RvX2ZpbGUnID0+ICR0b19uYW1lIH0pKSB7CisJCQkjIHRoaXMgaXMgY29udGludWF0aW9uIG9mIGEgc3BsaXQgcGF0Y2gKKwkJCXByaW50ICI8ZGl2IGNsYXNzPVwicGF0Y2ggY29udFwiPlxuIjsKKwkJfSBlbHNlIHsKKwkJCSMgYWR2YW5jZSByYXcgZ2l0LWRpZmYgb3V0cHV0IGlmIG5lZWRlZAorCQkJJHBhdGNoX2lkeCsrIGlmIGRlZmluZWQgJGRpZmZpbmZvOworCisJCQkjIHJlYWQgYW5kIHByZXBhcmUgcGF0Y2ggaW5mb3JtYXRpb24KKwkJCSRkaWZmaW5mbyA9IHBhcnNlZF9kaWZmdHJlZV9saW5lKCRkaWZmdHJlZS0+WyRwYXRjaF9pZHhdKTsKKworCQkJIyBjb21wYWN0IGNvbWJpbmVkIGRpZmYgb3V0cHV0IGNhbiBoYXZlIHNvbWUgcGF0Y2hlcyBza2lwcGVkCisJCQkjIGZpbmQgd2hpY2ggcGF0Y2ggKHVzaW5nIHBhdGhuYW1lIG9mIHJlc3VsdCkgd2UgYXJlIGF0IG5vdzsKKwkJCWlmICgkaXNfY29tYmluZWQpIHsKKwkJCQl3aGlsZSAoJHRvX25hbWUgbmUgJGRpZmZpbmZvLT57J3RvX2ZpbGUnfSkgeworCQkJCQlwcmludCAiPGRpdiBjbGFzcz1cInBhdGNoXCIgaWQ9XCJwYXRjaCIuICgkcGF0Y2hfaWR4KzEpIC4iXCI+XG4iIC4KKwkJCQkJICAgICAgZm9ybWF0X2RpZmZfY2Nfc2ltcGxpZmllZCgkZGlmZmluZm8sIEBoYXNoX3BhcmVudHMpIC4KKwkJCQkJICAgICAgIjwvZGl2PlxuIjsgICMgY2xhc3M9InBhdGNoIgorCisJCQkJCSRwYXRjaF9pZHgrKzsKKwkJCQkJJHBhdGNoX251bWJlcisrOworCisJCQkJCWxhc3QgaWYgJHBhdGNoX2lkeCA+ICQjJGRpZmZ0cmVlOworCQkJCQkkZGlmZmluZm8gPSBwYXJzZWRfZGlmZnRyZWVfbGluZSgkZGlmZnRyZWUtPlskcGF0Y2hfaWR4XSk7CisJCQkJfQorCQkJfQorCisJCQkjIG1vZGlmaWVzICVmcm9tLCAldG8gaGFzaGVzCisJCQlwYXJzZV9mcm9tX3RvX2RpZmZpbmZvKCRkaWZmaW5mbywgXCVmcm9tLCBcJXRvLCBAaGFzaF9wYXJlbnRzKTsKKworCQkJIyB0aGlzIGlzIGZpcnN0IHBhdGNoIGZvciByYXcgZGlmZnRyZWUgbGluZSB3aXRoICRwYXRjaF9pZHggaW5kZXgKKwkJCSMgd2UgaW5kZXggQCRkaWZmdHJlZSBhcnJheSBmcm9tIDAsIGJ1dCBudW1iZXIgcGF0Y2hlcyBmcm9tIDEKKwkJCXByaW50ICI8ZGl2IGNsYXNzPVwicGF0Y2hcIiBpZD1cInBhdGNoIi4gKCRwYXRjaF9pZHgrMSkgLiJcIj5cbiI7CisJCX0KKworCQkjIGdpdCBkaWZmIGhlYWRlcgorCQkjYXNzZXJ0KCRwYXRjaF9saW5lID1+IG0vXmRpZmYgLykgaWYgREVCVUc7CisJCSNhc3NlcnQoJHBhdGNoX2xpbmUgIX4gbSEkLyQhKSBpZiBERUJVRzsgIyBpcyBjaG9tcC1lZAorCQkkcGF0Y2hfbnVtYmVyKys7CisJCSMgcHJpbnQgImdpdCBkaWZmIiBoZWFkZXIKKwkJcHJpbnQgZm9ybWF0X2dpdF9kaWZmX2hlYWRlcl9saW5lKCRwYXRjaF9saW5lLCAkZGlmZmluZm8sCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcJWZyb20sIFwldG8pOworCisJCSMgcHJpbnQgZXh0ZW5kZWQgZGlmZiBoZWFkZXIKKwkJcHJpbnQgIjxkaXYgY2xhc3M9XCJkaWZmIGV4dGVuZGVkX2hlYWRlclwiPlxuIjsKKwlFWFRFTkRFRF9IRUFERVI6CisJCXdoaWxlICgkcGF0Y2hfbGluZSA9IDwkZmQ+KSB7CisJCQljaG9tcCAkcGF0Y2hfbGluZTsKKworCQkJbGFzdCBFWFRFTkRFRF9IRUFERVIgaWYgKCRwYXRjaF9saW5lID1+IG0vXi0tLSB8XmRpZmYgLyk7CisKKwkJCXByaW50IGZvcm1hdF9leHRlbmRlZF9kaWZmX2hlYWRlcl9saW5lKCRwYXRjaF9saW5lLCAkZGlmZmluZm8sCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcJWZyb20sIFwldG8pOworCQl9CisJCXByaW50ICI8L2Rpdj5cbiI7ICMgY2xhc3M9ImRpZmYgZXh0ZW5kZWRfaGVhZGVyIgorCisJCSMgZnJvbS1maWxlL3RvLWZpbGUgZGlmZiBoZWFkZXIKKwkJaWYgKCEgJHBhdGNoX2xpbmUpIHsKKwkJCXByaW50ICI8L2Rpdj5cbiI7ICMgY2xhc3M9InBhdGNoIgorCQkJbGFzdCBQQVRDSDsKKwkJfQorCQluZXh0IFBBVENIIGlmICgkcGF0Y2hfbGluZSA9fiBtL15kaWZmIC8pOworCQkjYXNzZXJ0KCRwYXRjaF9saW5lID1+IG0vXi0tLS8pIGlmIERFQlVHOworCisJCW15ICRsYXN0X3BhdGNoX2xpbmUgPSAkcGF0Y2hfbGluZTsKKwkJJHBhdGNoX2xpbmUgPSA8JGZkPjsKKwkJY2hvbXAgJHBhdGNoX2xpbmU7CisJCSNhc3NlcnQoJHBhdGNoX2xpbmUgPX4gbS9eXCtcK1wrLykgaWYgREVCVUc7CisKKwkJcHJpbnQgZm9ybWF0X2RpZmZfZnJvbV90b19oZWFkZXIoJGxhc3RfcGF0Y2hfbGluZSwgJHBhdGNoX2xpbmUsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkaWZmaW5mbywgXCVmcm9tLCBcJXRvLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaGFzaF9wYXJlbnRzKTsKKworCQkjIHRoZSBwYXRjaCBpdHNlbGYKKwlMSU5FOgorCQl3aGlsZSAoJHBhdGNoX2xpbmUgPSA8JGZkPikgeworCQkJY2hvbXAgJHBhdGNoX2xpbmU7CisKKwkJCW5leHQgUEFUQ0ggaWYgKCRwYXRjaF9saW5lID1+IG0vXmRpZmYgLyk7CisKKwkJCXByaW50IGZvcm1hdF9kaWZmX2xpbmUoJHBhdGNoX2xpbmUsIFwlZnJvbSwgXCV0byk7CisJCX0KKworCX0gY29udGludWUgeworCQlwcmludCAiPC9kaXY+XG4iOyAjIGNsYXNzPSJwYXRjaCIKKwl9CisKKwkjIGZvciBjb21wYWN0IGNvbWJpbmVkICgtLWNjKSBmb3JtYXQsIHdpdGggY2h1bmsgYW5kIHBhdGNoIHNpbXBsaWNpYWN0aW9uCisJIyBwYXRjaHNldCBtaWdodCBiZSBlbXB0eSwgYnV0IHRoZXJlIG1pZ2h0IGJlIHVucHJvY2Vzc2VkIHJhdyBsaW5lcworCWZvciAoKyskcGF0Y2hfaWR4IGlmICRwYXRjaF9udW1iZXIgPiAwOworCSAgICAgJHBhdGNoX2lkeCA8IEAkZGlmZnRyZWU7CisJICAgICArKyRwYXRjaF9pZHgpIHsKKwkJIyByZWFkIGFuZCBwcmVwYXJlIHBhdGNoIGluZm9ybWF0aW9uCisJCSRkaWZmaW5mbyA9IHBhcnNlZF9kaWZmdHJlZV9saW5lKCRkaWZmdHJlZS0+WyRwYXRjaF9pZHhdKTsKKworCQkjIGdlbmVyYXRlIGFuY2hvciBmb3IgInBhdGNoIiBsaW5rcyBpbiBkaWZmdHJlZSAvIHdoYXRjaGFuZ2VkIHBhcnQKKwkJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYXRjaFwiIGlkPVwicGF0Y2giLiAoJHBhdGNoX2lkeCsxKSAuIlwiPlxuIiAuCisJCSAgICAgIGZvcm1hdF9kaWZmX2NjX3NpbXBsaWZpZWQoJGRpZmZpbmZvLCBAaGFzaF9wYXJlbnRzKSAuCisJCSAgICAgICI8L2Rpdj5cbiI7ICAjIGNsYXNzPSJwYXRjaCIKKworCQkkcGF0Y2hfbnVtYmVyKys7CisJfQorCisJaWYgKCRwYXRjaF9udW1iZXIgPT0gMCkgeworCQlpZiAoQGhhc2hfcGFyZW50cyA+IDEpIHsKKwkJCXByaW50ICI8ZGl2IGNsYXNzPVwiZGlmZiBub2RpZmZlcmVuY2VzXCI+VHJpdmlhbCBtZXJnZTwvZGl2PlxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICI8ZGl2IGNsYXNzPVwiZGlmZiBub2RpZmZlcmVuY2VzXCI+Tm8gZGlmZmVyZW5jZXMgZm91bmQ8L2Rpdj5cbiI7CisJCX0KKwl9CisKKwlwcmludCAiPC9kaXY+XG4iOyAjIGNsYXNzPSJwYXRjaHNldCIKK30KKworIyAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLgorCitzdWIgZ2l0X3Byb2plY3RfbGlzdF9ib2R5IHsKKwlteSAoJHByb2psaXN0LCAkb3JkZXIsICRmcm9tLCAkdG8sICRleHRyYSwgJG5vX2hlYWRlcikgPSBAXzsKKworCW15ICgkY2hlY2tfZm9ya3MpID0gZ2l0d2ViX2NoZWNrX2ZlYXR1cmUoJ2ZvcmtzJyk7CisKKwlteSBAcHJvamVjdHM7CisJZm9yZWFjaCBteSAkcHIgKEAkcHJvamxpc3QpIHsKKwkJbXkgKEBhYSkgPSBnaXRfZ2V0X2xhc3RfYWN0aXZpdHkoJHByLT57J3BhdGgnfSk7CisJCXVubGVzcyAoQGFhKSB7CisJCQluZXh0OworCQl9CisJCSgkcHItPnsnYWdlJ30sICRwci0+eydhZ2Vfc3RyaW5nJ30pID0gQGFhOworCQlpZiAoIWRlZmluZWQgJHByLT57J2Rlc2NyJ30pIHsKKwkJCW15ICRkZXNjciA9IGdpdF9nZXRfcHJvamVjdF9kZXNjcmlwdGlvbigkcHItPnsncGF0aCd9KSB8fCAiIjsKKwkJCSRwci0+eydkZXNjcl9sb25nJ30gPSB0b191dGY4KCRkZXNjcik7CisJCQkkcHItPnsnZGVzY3InfSA9IGNob3Bfc3RyKCRkZXNjciwgJHByb2plY3RzX2xpc3RfZGVzY3JpcHRpb25fd2lkdGgsIDUpOworCQl9CisJCWlmICghZGVmaW5lZCAkcHItPnsnb3duZXInfSkgeworCQkJJHByLT57J293bmVyJ30gPSBnaXRfZ2V0X3Byb2plY3Rfb3duZXIoIiRwci0+eydwYXRoJ30iKSB8fCAiIjsKKwkJfQorCQlpZiAoJGNoZWNrX2ZvcmtzKSB7CisJCQlteSAkcG5hbWUgPSAkcHItPnsncGF0aCd9OworCQkJaWYgKCgkcG5hbWUgPX4gcy9cLmdpdCQvLykgJiYKKwkJCSAgICAoJHBuYW1lICF+IC9cLyQvKSAmJgorCQkJICAgICgtZCAiJHByb2plY3Ryb290LyRwbmFtZSIpKSB7CisJCQkJJHByLT57J2ZvcmtzJ30gPSAiLWQgJHByb2plY3Ryb290LyRwbmFtZSI7CisJCQl9CisJCQllbHNlIHsKKwkJCQkkcHItPnsnZm9ya3MnfSA9IDA7CisJCQl9CisJCX0KKwkJcHVzaCBAcHJvamVjdHMsICRwcjsKKwl9CisKKwkkb3JkZXIgfHw9ICRkZWZhdWx0X3Byb2plY3RzX29yZGVyOworCSRmcm9tID0gMCB1bmxlc3MgZGVmaW5lZCAkZnJvbTsKKwkkdG8gPSAkI3Byb2plY3RzIGlmICghZGVmaW5lZCAkdG8gfHwgJCNwcm9qZWN0cyA8ICR0byk7CisKKwlwcmludCAiPHRhYmxlIGNsYXNzPVwicHJvamVjdF9saXN0XCI+XG4iOworCXVubGVzcyAoJG5vX2hlYWRlcikgeworCQlwcmludCAiPHRyPlxuIjsKKwkJaWYgKCRjaGVja19mb3JrcykgeworCQkJcHJpbnQgIjx0aD48L3RoPlxuIjsKKwkJfQorCQlpZiAoJG9yZGVyIGVxICJwcm9qZWN0IikgeworCQkJQHByb2plY3RzID0gc29ydCB7JGEtPnsncGF0aCd9IGNtcCAkYi0+eydwYXRoJ319IEBwcm9qZWN0czsKKwkJCXByaW50ICI8dGg+UHJvamVjdDwvdGg+XG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIjx0aD4iIC4KKwkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYocHJvamVjdD0+dW5kZWYsIG9yZGVyPT4ncHJvamVjdCcpLAorCQkJICAgICAgICAgICAgICAgLWNsYXNzID0+ICJoZWFkZXIifSwgIlByb2plY3QiKSAuCisJCQkgICAgICAiPC90aD5cbiI7CisJCX0KKwkJaWYgKCRvcmRlciBlcSAiZGVzY3IiKSB7CisJCQlAcHJvamVjdHMgPSBzb3J0IHskYS0+eydkZXNjcid9IGNtcCAkYi0+eydkZXNjcid9fSBAcHJvamVjdHM7CisJCQlwcmludCAiPHRoPkRlc2NyaXB0aW9uPC90aD5cbiI7CisJCX0gZWxzZSB7CisJCQlwcmludCAiPHRoPiIgLgorCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihwcm9qZWN0PT51bmRlZiwgb3JkZXI9PidkZXNjcicpLAorCQkJICAgICAgICAgICAgICAgLWNsYXNzID0+ICJoZWFkZXIifSwgIkRlc2NyaXB0aW9uIikgLgorCQkJICAgICAgIjwvdGg+XG4iOworCQl9CisJCWlmICgkb3JkZXIgZXEgIm93bmVyIikgeworCQkJQHByb2plY3RzID0gc29ydCB7JGEtPnsnb3duZXInfSBjbXAgJGItPnsnb3duZXInfX0gQHByb2plY3RzOworCQkJcHJpbnQgIjx0aD5Pd25lcjwvdGg+XG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIjx0aD4iIC4KKwkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYocHJvamVjdD0+dW5kZWYsIG9yZGVyPT4nb3duZXInKSwKKwkJCSAgICAgICAgICAgICAgIC1jbGFzcyA9PiAiaGVhZGVyIn0sICJPd25lciIpIC4KKwkJCSAgICAgICI8L3RoPlxuIjsKKwkJfQorCQlpZiAoJG9yZGVyIGVxICJhZ2UiKSB7CisJCQlAcHJvamVjdHMgPSBzb3J0IHskYS0+eydhZ2UnfSA8PT4gJGItPnsnYWdlJ319IEBwcm9qZWN0czsKKwkJCXByaW50ICI8dGg+TGFzdCBDaGFuZ2U8L3RoPlxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICI8dGg+IiAuCisJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKHByb2plY3Q9PnVuZGVmLCBvcmRlcj0+J2FnZScpLAorCQkJICAgICAgICAgICAgICAgLWNsYXNzID0+ICJoZWFkZXIifSwgIkxhc3QgQ2hhbmdlIikgLgorCQkJICAgICAgIjwvdGg+XG4iOworCQl9CisJCXByaW50ICI8dGg+PC90aD5cbiIgLgorCQkgICAgICAiPC90cj5cbiI7CisJfQorCW15ICRhbHRlcm5hdGUgPSAxOworCWZvciAobXkgJGkgPSAkZnJvbTsgJGkgPD0gJHRvOyAkaSsrKSB7CisJCW15ICRwciA9ICRwcm9qZWN0c1skaV07CisJCWlmICgkYWx0ZXJuYXRlKSB7CisJCQlwcmludCAiPHRyIGNsYXNzPVwiZGFya1wiPlxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJsaWdodFwiPlxuIjsKKwkJfQorCQkkYWx0ZXJuYXRlIF49IDE7CisJCWlmICgkY2hlY2tfZm9ya3MpIHsKKwkJCXByaW50ICI8dGQ+IjsKKwkJCWlmICgkcHItPnsnZm9ya3MnfSkgeworCQkJCXByaW50ICI8IS0tICRwci0+eydmb3Jrcyd9IC0tPlxuIjsKKwkJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKHByb2plY3Q9PiRwci0+eydwYXRoJ30sIGFjdGlvbj0+ImZvcmtzIil9LCAiKyIpOworCQkJfQorCQkJcHJpbnQgIjwvdGQ+XG4iOworCQl9CisJCXByaW50ICI8dGQ+IiAuICRjZ2ktPmEoey1ocmVmID0+IGhyZWYocHJvamVjdD0+JHByLT57J3BhdGgnfSwgYWN0aW9uPT4ic3VtbWFyeSIpLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAtY2xhc3MgPT4gImxpc3QifSwgZXNjX2h0bWwoJHByLT57J3BhdGgnfSkpIC4gIjwvdGQ+XG4iIC4KKwkJICAgICAgIjx0ZD4iIC4gJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihwcm9qZWN0PT4kcHItPnsncGF0aCd9LCBhY3Rpb249PiJzdW1tYXJ5IiksCisJCSAgICAgICAgICAgICAgICAgICAgICAgIC1jbGFzcyA9PiAibGlzdCIsIC10aXRsZSA9PiAkcHItPnsnZGVzY3JfbG9uZyd9fSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgZXNjX2h0bWwoJHByLT57J2Rlc2NyJ30pKSAuICI8L3RkPlxuIiAuCisJCSAgICAgICI8dGQ+PGk+IiAuIGNob3BfYW5kX2VzY2FwZV9zdHIoJHByLT57J293bmVyJ30sIDE1KSAuICI8L2k+PC90ZD5cbiI7CisJCXByaW50ICI8dGQgY2xhc3M9XCIiLiBhZ2VfY2xhc3MoJHByLT57J2FnZSd9KSAuICJcIj4iIC4KKwkJICAgICAgKGRlZmluZWQgJHByLT57J2FnZV9zdHJpbmcnfSA/ICRwci0+eydhZ2Vfc3RyaW5nJ30gOiAiTm8gY29tbWl0cyIpIC4gIjwvdGQ+XG4iIC4KKwkJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihwcm9qZWN0PT4kcHItPnsncGF0aCd9LCBhY3Rpb249PiJzdW1tYXJ5Iil9LCAic3VtbWFyeSIpICAgLiAiIHwgIiAuCisJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYocHJvamVjdD0+JHByLT57J3BhdGgnfSwgYWN0aW9uPT4ic2hvcnRsb2ciKX0sICJzaG9ydGxvZyIpIC4gIiB8ICIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKHByb2plY3Q9PiRwci0+eydwYXRoJ30sIGFjdGlvbj0+ImxvZyIpfSwgImxvZyIpIC4gIiB8ICIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKHByb2plY3Q9PiRwci0+eydwYXRoJ30sIGFjdGlvbj0+InRyZWUiKX0sICJ0cmVlIikgLgorCQkgICAgICAoJHByLT57J2ZvcmtzJ30gPyAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+IGhyZWYocHJvamVjdD0+JHByLT57J3BhdGgnfSwgYWN0aW9uPT4iZm9ya3MiKX0sICJmb3JrcyIpIDogJycpIC4KKwkJICAgICAgIjwvdGQ+XG4iIC4KKwkJICAgICAgIjwvdHI+XG4iOworCX0KKwlpZiAoZGVmaW5lZCAkZXh0cmEpIHsKKwkJcHJpbnQgIjx0cj5cbiI7CisJCWlmICgkY2hlY2tfZm9ya3MpIHsKKwkJCXByaW50ICI8dGQ+PC90ZD5cbiI7CisJCX0KKwkJcHJpbnQgIjx0ZCBjb2xzcGFuPVwiNVwiPiRleHRyYTwvdGQ+XG4iIC4KKwkJICAgICAgIjwvdHI+XG4iOworCX0KKwlwcmludCAiPC90YWJsZT5cbiI7Cit9CisKK3N1YiBnaXRfc2hvcnRsb2dfYm9keSB7CisJIyB1c2VzIGdsb2JhbCB2YXJpYWJsZSAkcHJvamVjdAorCW15ICgkY29tbWl0bGlzdCwgJGZyb20sICR0bywgJHJlZnMsICRleHRyYSkgPSBAXzsKKworCSRmcm9tID0gMCB1bmxlc3MgZGVmaW5lZCAkZnJvbTsKKwkkdG8gPSAkI3skY29tbWl0bGlzdH0gaWYgKCFkZWZpbmVkICR0byB8fCAkI3skY29tbWl0bGlzdH0gPCAkdG8pOworCisJcHJpbnQgIjx0YWJsZSBjbGFzcz1cInNob3J0bG9nXCI+XG4iOworCW15ICRhbHRlcm5hdGUgPSAxOworCWZvciAobXkgJGkgPSAkZnJvbTsgJGkgPD0gJHRvOyAkaSsrKSB7CisJCW15ICVjbyA9ICV7JGNvbW1pdGxpc3QtPlskaV19OworCQlteSAkY29tbWl0ID0gJGNveydpZCd9OworCQlteSAkcmVmID0gZm9ybWF0X3JlZl9tYXJrZXIoJHJlZnMsICRjb21taXQpOworCQlpZiAoJGFsdGVybmF0ZSkgeworCQkJcHJpbnQgIjx0ciBjbGFzcz1cImRhcmtcIj5cbiI7CisJCX0gZWxzZSB7CisJCQlwcmludCAiPHRyIGNsYXNzPVwibGlnaHRcIj5cbiI7CisJCX0KKwkJJGFsdGVybmF0ZSBePSAxOworCQlteSAkYXV0aG9yID0gY2hvcF9hbmRfZXNjYXBlX3N0cigkY297J2F1dGhvcl9uYW1lJ30sIDEwKTsKKwkJIyBnaXRfc3VtbWFyeSgpIHVzZWQgcHJpbnQgIjx0ZD48aT4kY297J2FnZV9zdHJpbmcnfTwvaT48L3RkPlxuIiAuCisJCXByaW50ICI8dGQgdGl0bGU9XCIkY297J2FnZV9zdHJpbmdfYWdlJ31cIj48aT4kY297J2FnZV9zdHJpbmdfZGF0ZSd9PC9pPjwvdGQ+XG4iIC4KKwkJICAgICAgIjx0ZD48aT4iIC4gJGF1dGhvciAuICI8L2k+PC90ZD5cbiIgLgorCQkgICAgICAiPHRkPiI7CisJCXByaW50IGZvcm1hdF9zdWJqZWN0X2h0bWwoJGNveyd0aXRsZSd9LCAkY297J3RpdGxlX3Nob3J0J30sCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZihhY3Rpb249PiJjb21taXQiLCBoYXNoPT4kY29tbWl0KSwgJHJlZik7CisJCXByaW50ICI8L3RkPlxuIiAuCisJCSAgICAgICI8dGQgY2xhc3M9XCJsaW5rXCI+IiAuCisJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iY29tbWl0IiwgaGFzaD0+JGNvbW1pdCl9LCAiY29tbWl0IikgLiAiIHwgIiAuCisJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iY29tbWl0ZGlmZiIsIGhhc2g9PiRjb21taXQpfSwgImNvbW1pdGRpZmYiKSAuICIgfCAiIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJ0cmVlIiwgaGFzaD0+JGNvbW1pdCwgaGFzaF9iYXNlPT4kY29tbWl0KX0sICJ0cmVlIik7CisJCW15ICRzbmFwc2hvdF9saW5rcyA9IGZvcm1hdF9zbmFwc2hvdF9saW5rcygkY29tbWl0KTsKKwkJaWYgKGRlZmluZWQgJHNuYXBzaG90X2xpbmtzKSB7CisJCQlwcmludCAiIHwgIiAuICRzbmFwc2hvdF9saW5rczsKKwkJfQorCQlwcmludCAiPC90ZD5cbiIgLgorCQkgICAgICAiPC90cj5cbiI7CisJfQorCWlmIChkZWZpbmVkICRleHRyYSkgeworCQlwcmludCAiPHRyPlxuIiAuCisJCSAgICAgICI8dGQgY29sc3Bhbj1cIjRcIj4kZXh0cmE8L3RkPlxuIiAuCisJCSAgICAgICI8L3RyPlxuIjsKKwl9CisJcHJpbnQgIjwvdGFibGU+XG4iOworfQorCitzdWIgZ2l0X2hpc3RvcnlfYm9keSB7CisJIyBXYXJuaW5nOiBhc3N1bWVzIGNvbnN0YW50IHR5cGUgKGJsb2Igb3IgdHJlZSkgZHVyaW5nIGhpc3RvcnkKKwlteSAoJGNvbW1pdGxpc3QsICRmcm9tLCAkdG8sICRyZWZzLCAkaGFzaF9iYXNlLCAkZnR5cGUsICRleHRyYSkgPSBAXzsKKworCSRmcm9tID0gMCB1bmxlc3MgZGVmaW5lZCAkZnJvbTsKKwkkdG8gPSAkI3skY29tbWl0bGlzdH0gdW5sZXNzIChkZWZpbmVkICR0byAmJiAkdG8gPD0gJCN7JGNvbW1pdGxpc3R9KTsKKworCXByaW50ICI8dGFibGUgY2xhc3M9XCJoaXN0b3J5XCI+XG4iOworCW15ICRhbHRlcm5hdGUgPSAxOworCWZvciAobXkgJGkgPSAkZnJvbTsgJGkgPD0gJHRvOyAkaSsrKSB7CisJCW15ICVjbyA9ICV7JGNvbW1pdGxpc3QtPlskaV19OworCQlpZiAoISVjbykgeworCQkJbmV4dDsKKwkJfQorCQlteSAkY29tbWl0ID0gJGNveydpZCd9OworCisJCW15ICRyZWYgPSBmb3JtYXRfcmVmX21hcmtlcigkcmVmcywgJGNvbW1pdCk7CisKKwkJaWYgKCRhbHRlcm5hdGUpIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJkYXJrXCI+XG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIjx0ciBjbGFzcz1cImxpZ2h0XCI+XG4iOworCQl9CisJCSRhbHRlcm5hdGUgXj0gMTsKKwkjIHNob3J0bG9nIHVzZXMgICAgICBjaG9wX3N0cigkY297J2F1dGhvcl9uYW1lJ30sIDEwKQorCQlteSAkYXV0aG9yID0gY2hvcF9hbmRfZXNjYXBlX3N0cigkY297J2F1dGhvcl9uYW1lJ30sIDE1LCAzKTsKKwkJcHJpbnQgIjx0ZCB0aXRsZT1cIiRjb3snYWdlX3N0cmluZ19hZ2UnfVwiPjxpPiRjb3snYWdlX3N0cmluZ19kYXRlJ308L2k+PC90ZD5cbiIgLgorCQkgICAgICAiPHRkPjxpPiIgLiAkYXV0aG9yIC4gIjwvaT48L3RkPlxuIiAuCisJCSAgICAgICI8dGQ+IjsKKwkJIyBvcmlnaW5hbGx5IGdpdF9oaXN0b3J5IHVzZWQgY2hvcF9zdHIoJGNveyd0aXRsZSd9LCA1MCkKKwkJcHJpbnQgZm9ybWF0X3N1YmplY3RfaHRtbCgkY297J3RpdGxlJ30sICRjb3sndGl0bGVfc2hvcnQnfSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmKGFjdGlvbj0+ImNvbW1pdCIsIGhhc2g9PiRjb21taXQpLCAkcmVmKTsKKwkJcHJpbnQgIjwvdGQ+XG4iIC4KKwkJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiRmdHlwZSwgaGFzaF9iYXNlPT4kY29tbWl0LCBmaWxlX25hbWU9PiRmaWxlX25hbWUpfSwgJGZ0eXBlKSAuICIgfCAiIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJjb21taXRkaWZmIiwgaGFzaD0+JGNvbW1pdCl9LCAiY29tbWl0ZGlmZiIpOworCisJCWlmICgkZnR5cGUgZXEgJ2Jsb2InKSB7CisJCQlteSAkYmxvYl9jdXJyZW50ID0gZ2l0X2dldF9oYXNoX2J5X3BhdGgoJGhhc2hfYmFzZSwgJGZpbGVfbmFtZSk7CisJCQlteSAkYmxvYl9wYXJlbnQgID0gZ2l0X2dldF9oYXNoX2J5X3BhdGgoJGNvbW1pdCwgJGZpbGVfbmFtZSk7CisJCQlpZiAoZGVmaW5lZCAkYmxvYl9jdXJyZW50ICYmIGRlZmluZWQgJGJsb2JfcGFyZW50ICYmCisJCQkJCSRibG9iX2N1cnJlbnQgbmUgJGJsb2JfcGFyZW50KSB7CisJCQkJcHJpbnQgIiB8ICIgLgorCQkJCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImJsb2JkaWZmIiwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgICBoYXNoPT4kYmxvYl9jdXJyZW50LCBoYXNoX3BhcmVudD0+JGJsb2JfcGFyZW50LAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfYmFzZT0+JGhhc2hfYmFzZSwgaGFzaF9wYXJlbnRfYmFzZT0+JGNvbW1pdCwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiRmaWxlX25hbWUpfSwKKwkJCQkJICAgICAgICAiZGlmZiB0byBjdXJyZW50Iik7CisJCQl9CisJCX0KKwkJcHJpbnQgIjwvdGQ+XG4iIC4KKwkJICAgICAgIjwvdHI+XG4iOworCX0KKwlpZiAoZGVmaW5lZCAkZXh0cmEpIHsKKwkJcHJpbnQgIjx0cj5cbiIgLgorCQkgICAgICAiPHRkIGNvbHNwYW49XCI0XCI+JGV4dHJhPC90ZD5cbiIgLgorCQkgICAgICAiPC90cj5cbiI7CisJfQorCXByaW50ICI8L3RhYmxlPlxuIjsKK30KKworc3ViIGdpdF90YWdzX2JvZHkgeworCSMgdXNlcyBnbG9iYWwgdmFyaWFibGUgJHByb2plY3QKKwlteSAoJHRhZ2xpc3QsICRmcm9tLCAkdG8sICRleHRyYSkgPSBAXzsKKwkkZnJvbSA9IDAgdW5sZXNzIGRlZmluZWQgJGZyb207CisJJHRvID0gJCN7JHRhZ2xpc3R9IGlmICghZGVmaW5lZCAkdG8gfHwgJCN7JHRhZ2xpc3R9IDwgJHRvKTsKKworCXByaW50ICI8dGFibGUgY2xhc3M9XCJ0YWdzXCI+XG4iOworCW15ICRhbHRlcm5hdGUgPSAxOworCWZvciAobXkgJGkgPSAkZnJvbTsgJGkgPD0gJHRvOyAkaSsrKSB7CisJCW15ICRlbnRyeSA9ICR0YWdsaXN0LT5bJGldOworCQlteSAldGFnID0gJSRlbnRyeTsKKwkJbXkgJGNvbW1lbnQgPSAkdGFneydzdWJqZWN0J307CisJCW15ICRjb21tZW50X3Nob3J0OworCQlpZiAoZGVmaW5lZCAkY29tbWVudCkgeworCQkJJGNvbW1lbnRfc2hvcnQgPSBjaG9wX3N0cigkY29tbWVudCwgMzAsIDUpOworCQl9CisJCWlmICgkYWx0ZXJuYXRlKSB7CisJCQlwcmludCAiPHRyIGNsYXNzPVwiZGFya1wiPlxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJsaWdodFwiPlxuIjsKKwkJfQorCQkkYWx0ZXJuYXRlIF49IDE7CisJCWlmIChkZWZpbmVkICR0YWd7J2FnZSd9KSB7CisJCQlwcmludCAiPHRkPjxpPiR0YWd7J2FnZSd9PC9pPjwvdGQ+XG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIjx0ZD48L3RkPlxuIjsKKwkJfQorCQlwcmludCAiPHRkPiIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+JHRhZ3sncmVmdHlwZSd9LCBoYXNoPT4kdGFneydyZWZpZCd9KSwKKwkJICAgICAgICAgICAgICAgLWNsYXNzID0+ICJsaXN0IG5hbWUifSwgZXNjX2h0bWwoJHRhZ3snbmFtZSd9KSkgLgorCQkgICAgICAiPC90ZD5cbiIgLgorCQkgICAgICAiPHRkPiI7CisJCWlmIChkZWZpbmVkICRjb21tZW50KSB7CisJCQlwcmludCBmb3JtYXRfc3ViamVjdF9odG1sKCRjb21tZW50LCAkY29tbWVudF9zaG9ydCwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZihhY3Rpb249PiJ0YWciLCBoYXNoPT4kdGFneydpZCd9KSk7CisJCX0KKwkJcHJpbnQgIjwvdGQ+XG4iIC4KKwkJICAgICAgIjx0ZCBjbGFzcz1cInNlbGZsaW5rXCI+IjsKKwkJaWYgKCR0YWd7J3R5cGUnfSBlcSAidGFnIikgeworCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJ0YWciLCBoYXNoPT4kdGFneydpZCd9KX0sICJ0YWciKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICImbmJzcDsiOworCQl9CisJCXByaW50ICI8L3RkPlxuIiAuCisJCSAgICAgICI8dGQgY2xhc3M9XCJsaW5rXCI+IiAuICIgfCAiIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiR0YWd7J3JlZnR5cGUnfSwgaGFzaD0+JHRhZ3sncmVmaWQnfSl9LCAkdGFneydyZWZ0eXBlJ30pOworCQlpZiAoJHRhZ3sncmVmdHlwZSd9IGVxICJjb21taXQiKSB7CisJCQlwcmludCAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4ic2hvcnRsb2ciLCBoYXNoPT4kdGFneydmdWxsbmFtZSd9KX0sICJzaG9ydGxvZyIpIC4KKwkJCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJsb2ciLCBoYXNoPT4kdGFneydmdWxsbmFtZSd9KX0sICJsb2ciKTsKKwkJfSBlbHNpZiAoJHRhZ3sncmVmdHlwZSd9IGVxICJibG9iIikgeworCQkJcHJpbnQgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImJsb2JfcGxhaW4iLCBoYXNoPT4kdGFneydyZWZpZCd9KX0sICJyYXciKTsKKwkJfQorCQlwcmludCAiPC90ZD5cbiIgLgorCQkgICAgICAiPC90cj4iOworCX0KKwlpZiAoZGVmaW5lZCAkZXh0cmEpIHsKKwkJcHJpbnQgIjx0cj5cbiIgLgorCQkgICAgICAiPHRkIGNvbHNwYW49XCI1XCI+JGV4dHJhPC90ZD5cbiIgLgorCQkgICAgICAiPC90cj5cbiI7CisJfQorCXByaW50ICI8L3RhYmxlPlxuIjsKK30KKworc3ViIGdpdF9oZWFkc19ib2R5IHsKKwkjIHVzZXMgZ2xvYmFsIHZhcmlhYmxlICRwcm9qZWN0CisJbXkgKCRoZWFkbGlzdCwgJGhlYWQsICRmcm9tLCAkdG8sICRleHRyYSkgPSBAXzsKKwkkZnJvbSA9IDAgdW5sZXNzIGRlZmluZWQgJGZyb207CisJJHRvID0gJCN7JGhlYWRsaXN0fSBpZiAoIWRlZmluZWQgJHRvIHx8ICQjeyRoZWFkbGlzdH0gPCAkdG8pOworCisJcHJpbnQgIjx0YWJsZSBjbGFzcz1cImhlYWRzXCI+XG4iOworCW15ICRhbHRlcm5hdGUgPSAxOworCWZvciAobXkgJGkgPSAkZnJvbTsgJGkgPD0gJHRvOyAkaSsrKSB7CisJCW15ICRlbnRyeSA9ICRoZWFkbGlzdC0+WyRpXTsKKwkJbXkgJXJlZiA9ICUkZW50cnk7CisJCW15ICRjdXJyID0gJHJlZnsnaWQnfSBlcSAkaGVhZDsKKwkJaWYgKCRhbHRlcm5hdGUpIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJkYXJrXCI+XG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIjx0ciBjbGFzcz1cImxpZ2h0XCI+XG4iOworCQl9CisJCSRhbHRlcm5hdGUgXj0gMTsKKwkJcHJpbnQgIjx0ZD48aT4kcmVmeydhZ2UnfTwvaT48L3RkPlxuIiAuCisJCSAgICAgICgkY3VyciA/ICI8dGQgY2xhc3M9XCJjdXJyZW50X2hlYWRcIj4iIDogIjx0ZD4iKSAuCisJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4ic2hvcnRsb2ciLCBoYXNoPT4kcmVmeydmdWxsbmFtZSd9KSwKKwkJICAgICAgICAgICAgICAgLWNsYXNzID0+ICJsaXN0IG5hbWUifSxlc2NfaHRtbCgkcmVmeyduYW1lJ30pKSAuCisJCSAgICAgICI8L3RkPlxuIiAuCisJCSAgICAgICI8dGQgY2xhc3M9XCJsaW5rXCI+IiAuCisJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4ic2hvcnRsb2ciLCBoYXNoPT4kcmVmeydmdWxsbmFtZSd9KX0sICJzaG9ydGxvZyIpIC4gIiB8ICIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImxvZyIsIGhhc2g9PiRyZWZ7J2Z1bGxuYW1lJ30pfSwgImxvZyIpIC4gIiB8ICIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+InRyZWUiLCBoYXNoPT4kcmVmeydmdWxsbmFtZSd9LCBoYXNoX2Jhc2U9PiRyZWZ7J25hbWUnfSl9LCAidHJlZSIpIC4KKwkJICAgICAgIjwvdGQ+XG4iIC4KKwkJICAgICAgIjwvdHI+IjsKKwl9CisJaWYgKGRlZmluZWQgJGV4dHJhKSB7CisJCXByaW50ICI8dHI+XG4iIC4KKwkJICAgICAgIjx0ZCBjb2xzcGFuPVwiM1wiPiRleHRyYTwvdGQ+XG4iIC4KKwkJICAgICAgIjwvdHI+XG4iOworCX0KKwlwcmludCAiPC90YWJsZT5cbiI7Cit9CisKK3N1YiBnaXRfc2VhcmNoX2dyZXBfYm9keSB7CisJbXkgKCRjb21taXRsaXN0LCAkZnJvbSwgJHRvLCAkZXh0cmEpID0gQF87CisJJGZyb20gPSAwIHVubGVzcyBkZWZpbmVkICRmcm9tOworCSR0byA9ICQjeyRjb21taXRsaXN0fSBpZiAoIWRlZmluZWQgJHRvIHx8ICQjeyRjb21taXRsaXN0fSA8ICR0byk7CisKKwlwcmludCAiPHRhYmxlIGNsYXNzPVwiY29tbWl0X3NlYXJjaFwiPlxuIjsKKwlteSAkYWx0ZXJuYXRlID0gMTsKKwlmb3IgKG15ICRpID0gJGZyb207ICRpIDw9ICR0bzsgJGkrKykgeworCQlteSAlY28gPSAleyRjb21taXRsaXN0LT5bJGldfTsKKwkJaWYgKCElY28pIHsKKwkJCW5leHQ7CisJCX0KKwkJbXkgJGNvbW1pdCA9ICRjb3snaWQnfTsKKwkJaWYgKCRhbHRlcm5hdGUpIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJkYXJrXCI+XG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIjx0ciBjbGFzcz1cImxpZ2h0XCI+XG4iOworCQl9CisJCSRhbHRlcm5hdGUgXj0gMTsKKwkJbXkgJGF1dGhvciA9IGNob3BfYW5kX2VzY2FwZV9zdHIoJGNveydhdXRob3JfbmFtZSd9LCAxNSwgNSk7CisJCXByaW50ICI8dGQgdGl0bGU9XCIkY297J2FnZV9zdHJpbmdfYWdlJ31cIj48aT4kY297J2FnZV9zdHJpbmdfZGF0ZSd9PC9pPjwvdGQ+XG4iIC4KKwkJICAgICAgIjx0ZD48aT4iIC4gJGF1dGhvciAuICI8L2k+PC90ZD5cbiIgLgorCQkgICAgICAiPHRkPiIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImNvbW1pdCIsIGhhc2g9PiRjb3snaWQnfSksCisJCSAgICAgICAgICAgICAgIC1jbGFzcyA9PiAibGlzdCBzdWJqZWN0In0sCisJCSAgICAgICAgICAgICAgY2hvcF9hbmRfZXNjYXBlX3N0cigkY297J3RpdGxlJ30sIDUwKSAuICI8YnIvPiIpOworCQlteSAkY29tbWVudCA9ICRjb3snY29tbWVudCd9OworCQlmb3JlYWNoIG15ICRsaW5lIChAJGNvbW1lbnQpIHsKKwkJCWlmICgkbGluZSA9fiBtL14oLio/KSgkc2VhcmNoX3JlZ2V4cCkoLiopJC9pKSB7CisJCQkJbXkgKCRsZWFkLCAkbWF0Y2gsICR0cmFpbCkgPSAoJDEsICQyLCAkMyk7CisJCQkJJG1hdGNoID0gY2hvcF9zdHIoJG1hdGNoLCA3MCwgNSwgJ2NlbnRlcicpOworCQkJCW15ICRjb250ZXh0bGVuID0gaW50KCg4MCAtIGxlbmd0aCgkbWF0Y2gpKS8yKTsKKwkJCQkkY29udGV4dGxlbiA9IDMwIGlmICgkY29udGV4dGxlbiA+IDMwKTsKKwkJCQkkbGVhZCAgPSBjaG9wX3N0cigkbGVhZCwgICRjb250ZXh0bGVuLCAxMCwgJ2xlZnQnKTsKKwkJCQkkdHJhaWwgPSBjaG9wX3N0cigkdHJhaWwsICRjb250ZXh0bGVuLCAxMCwgJ3JpZ2h0Jyk7CisKKwkJCQkkbGVhZCAgPSBlc2NfaHRtbCgkbGVhZCk7CisJCQkJJG1hdGNoID0gZXNjX2h0bWwoJG1hdGNoKTsKKwkJCQkkdHJhaWwgPSBlc2NfaHRtbCgkdHJhaWwpOworCisJCQkJcHJpbnQgIiRsZWFkPHNwYW4gY2xhc3M9XCJtYXRjaFwiPiRtYXRjaDwvc3Bhbj4kdHJhaWw8YnIgLz4iOworCQkJfQorCQl9CisJCXByaW50ICI8L3RkPlxuIiAuCisJCSAgICAgICI8dGQgY2xhc3M9XCJsaW5rXCI+IiAuCisJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iY29tbWl0IiwgaGFzaD0+JGNveydpZCd9KX0sICJjb21taXQiKSAuCisJCSAgICAgICIgfCAiIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJjb21taXRkaWZmIiwgaGFzaD0+JGNveydpZCd9KX0sICJjb21taXRkaWZmIikgLgorCQkgICAgICAiIHwgIiAuCisJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4idHJlZSIsIGhhc2g9PiRjb3sndHJlZSd9LCBoYXNoX2Jhc2U9PiRjb3snaWQnfSl9LCAidHJlZSIpOworCQlwcmludCAiPC90ZD5cbiIgLgorCQkgICAgICAiPC90cj5cbiI7CisJfQorCWlmIChkZWZpbmVkICRleHRyYSkgeworCQlwcmludCAiPHRyPlxuIiAuCisJCSAgICAgICI8dGQgY29sc3Bhbj1cIjNcIj4kZXh0cmE8L3RkPlxuIiAuCisJCSAgICAgICI8L3RyPlxuIjsKKwl9CisJcHJpbnQgIjwvdGFibGU+XG4iOworfQorCisjIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIyBhY3Rpb25zCisKK3N1YiBnaXRfcHJvamVjdF9saXN0IHsKKwlteSAkb3JkZXIgPSAkY2dpLT5wYXJhbSgnbycpOworCWlmIChkZWZpbmVkICRvcmRlciAmJiAkb3JkZXIgIX4gbS9ub25lfHByb2plY3R8ZGVzY3J8b3duZXJ8YWdlLykgeworCQlkaWVfZXJyb3IodW5kZWYsICJVbmtub3duIG9yZGVyIHBhcmFtZXRlciIpOworCX0KKworCW15IEBsaXN0ID0gZ2l0X2dldF9wcm9qZWN0c19saXN0KCk7CisJaWYgKCFAbGlzdCkgeworCQlkaWVfZXJyb3IodW5kZWYsICJObyBwcm9qZWN0cyBmb3VuZCIpOworCX0KKworCWdpdF9oZWFkZXJfaHRtbCgpOworCWlmICgtZiAkaG9tZV90ZXh0KSB7CisJCXByaW50ICI8ZGl2IGNsYXNzPVwiaW5kZXhfaW5jbHVkZVwiPlxuIjsKKwkJb3BlbiAobXkgJGZkLCAkaG9tZV90ZXh0KTsKKwkJcHJpbnQgPCRmZD47CisJCWNsb3NlICRmZDsKKwkJcHJpbnQgIjwvZGl2PlxuIjsKKwl9CisJZ2l0X3Byb2plY3RfbGlzdF9ib2R5KFxAbGlzdCwgJG9yZGVyKTsKKwlnaXRfZm9vdGVyX2h0bWwoKTsKK30KKworc3ViIGdpdF9mb3JrcyB7CisJbXkgJG9yZGVyID0gJGNnaS0+cGFyYW0oJ28nKTsKKwlpZiAoZGVmaW5lZCAkb3JkZXIgJiYgJG9yZGVyICF+IG0vbm9uZXxwcm9qZWN0fGRlc2NyfG93bmVyfGFnZS8pIHsKKwkJZGllX2Vycm9yKHVuZGVmLCAiVW5rbm93biBvcmRlciBwYXJhbWV0ZXIiKTsKKwl9CisKKwlteSBAbGlzdCA9IGdpdF9nZXRfcHJvamVjdHNfbGlzdCgkcHJvamVjdCk7CisJaWYgKCFAbGlzdCkgeworCQlkaWVfZXJyb3IodW5kZWYsICJObyBmb3JrcyBmb3VuZCIpOworCX0KKworCWdpdF9oZWFkZXJfaHRtbCgpOworCWdpdF9wcmludF9wYWdlX25hdignJywnJyk7CisJZ2l0X3ByaW50X2hlYWRlcl9kaXYoJ3N1bW1hcnknLCAiJHByb2plY3QgZm9ya3MiKTsKKwlnaXRfcHJvamVjdF9saXN0X2JvZHkoXEBsaXN0LCAkb3JkZXIpOworCWdpdF9mb290ZXJfaHRtbCgpOworfQorCitzdWIgZ2l0X3Byb2plY3RfaW5kZXggeworCW15IEBwcm9qZWN0cyA9IGdpdF9nZXRfcHJvamVjdHNfbGlzdCgkcHJvamVjdCk7CisKKwlwcmludCAkY2dpLT5oZWFkZXIoCisJCS10eXBlID0+ICd0ZXh0L3BsYWluJywKKwkJLWNoYXJzZXQgPT4gJ3V0Zi04JywKKwkJLWNvbnRlbnRfZGlzcG9zaXRpb24gPT4gJ2lubGluZTsgZmlsZW5hbWU9ImluZGV4LmF1eCInKTsKKworCWZvcmVhY2ggbXkgJHByIChAcHJvamVjdHMpIHsKKwkJaWYgKCFleGlzdHMgJHByLT57J293bmVyJ30pIHsKKwkJCSRwci0+eydvd25lcid9ID0gZ2l0X2dldF9wcm9qZWN0X293bmVyKCIkcHItPnsncGF0aCd9Iik7CisJCX0KKworCQlteSAoJHBhdGgsICRvd25lcikgPSAoJHByLT57J3BhdGgnfSwgJHByLT57J293bmVyJ30pOworCQkjIHF1b3RlIGFzIGluIENHSTo6VXRpbDo6ZW5jb2RlLCBidXQga2VlcCB0aGUgc2xhc2gsIGFuZCB1c2UgJysnIGZvciAnICcKKwkJJHBhdGggID1+IHMvKFteYS16QS1aMC05Xy5cLVwvIF0pL3NwcmludGYoIiUlJTAyWCIsIG9yZCgkMSkpL2VnOworCQkkb3duZXIgPX4gcy8oW15hLXpBLVowLTlfLlwtXC8gXSkvc3ByaW50ZigiJSUlMDJYIiwgb3JkKCQxKSkvZWc7CisJCSRwYXRoICA9fiBzLyAvXCsvZzsKKwkJJG93bmVyID1+IHMvIC9cKy9nOworCisJCXByaW50ICIkcGF0aCAkb3duZXJcbiI7CisJfQorfQorCitzdWIgZ2l0X3N1bW1hcnkgeworCW15ICRkZXNjciA9IGdpdF9nZXRfcHJvamVjdF9kZXNjcmlwdGlvbigkcHJvamVjdCkgfHwgIm5vbmUiOworCW15ICVjbyA9IHBhcnNlX2NvbW1pdCgiSEVBRCIpOworCW15ICVjZCA9ICVjbyA/IHBhcnNlX2RhdGUoJGNveydjb21taXR0ZXJfZXBvY2gnfSwgJGNveydjb21taXR0ZXJfdHonfSkgOiAoKTsKKwlteSAkaGVhZCA9ICRjb3snaWQnfTsKKworCW15ICRvd25lciA9IGdpdF9nZXRfcHJvamVjdF9vd25lcigkcHJvamVjdCk7CisKKwlteSAkcmVmcyA9IGdpdF9nZXRfcmVmZXJlbmNlcygpOworCSMgVGhlc2UgZ2V0XypfbGlzdCBmdW5jdGlvbnMgcmV0dXJuIG9uZSBtb3JlIHRvIGFsbG93IHVzIHRvIHNlZSBpZgorCSMgdGhlcmUgYXJlIG1vcmUgLi4uCisJbXkgQHRhZ2xpc3QgID0gZ2l0X2dldF90YWdzX2xpc3QoMTYpOworCW15IEBoZWFkbGlzdCA9IGdpdF9nZXRfaGVhZHNfbGlzdCgxNik7CisJbXkgQGZvcmtsaXN0OworCW15ICgkY2hlY2tfZm9ya3MpID0gZ2l0d2ViX2NoZWNrX2ZlYXR1cmUoJ2ZvcmtzJyk7CisKKwlpZiAoJGNoZWNrX2ZvcmtzKSB7CisJCUBmb3JrbGlzdCA9IGdpdF9nZXRfcHJvamVjdHNfbGlzdCgkcHJvamVjdCk7CisJfQorCisJZ2l0X2hlYWRlcl9odG1sKCk7CisJZ2l0X3ByaW50X3BhZ2VfbmF2KCdzdW1tYXJ5JywnJywgJGhlYWQpOworCisJcHJpbnQgIjxkaXYgY2xhc3M9XCJ0aXRsZVwiPiZuYnNwOzwvZGl2PlxuIjsKKwlwcmludCAiPHRhYmxlIGNsYXNzPVwicHJvamVjdHNfbGlzdFwiPlxuIiAuCisJICAgICAgIjx0cj48dGQ+ZGVzY3JpcHRpb248L3RkPjx0ZD4iIC4gZXNjX2h0bWwoJGRlc2NyKSAuICI8L3RkPjwvdHI+XG4iIC4KKwkgICAgICAiPHRyPjx0ZD5vd25lcjwvdGQ+PHRkPiIgLiBlc2NfaHRtbCgkb3duZXIpIC4gIjwvdGQ+PC90cj5cbiI7CisJaWYgKGRlZmluZWQgJGNkeydyZmMyODIyJ30pIHsKKwkJcHJpbnQgIjx0cj48dGQ+bGFzdCBjaGFuZ2U8L3RkPjx0ZD4kY2R7J3JmYzI4MjInfTwvdGQ+PC90cj5cbiI7CisJfQorCisJIyB1c2UgcGVyIHByb2plY3QgZ2l0IFVSTCBsaXN0IGluICRwcm9qZWN0cm9vdC8kcHJvamVjdC9jbG9uZXVybAorCSMgb3IgbWFrZSBwcm9qZWN0IGdpdCBVUkwgZnJvbSBnaXQgYmFzZSBVUkwgYW5kIHByb2plY3QgbmFtZQorCW15ICR1cmxfdGFnID0gIlVSTCI7CisJbXkgQHVybF9saXN0ID0gZ2l0X2dldF9wcm9qZWN0X3VybF9saXN0KCRwcm9qZWN0KTsKKwlAdXJsX2xpc3QgPSBtYXAgeyAiJF8vJHByb2plY3QiIH0gQGdpdF9iYXNlX3VybF9saXN0IHVubGVzcyBAdXJsX2xpc3Q7CisJZm9yZWFjaCBteSAkZ2l0X3VybCAoQHVybF9saXN0KSB7CisJCW5leHQgdW5sZXNzICRnaXRfdXJsOworCQlwcmludCAiPHRyPjx0ZD4kdXJsX3RhZzwvdGQ+PHRkPiRnaXRfdXJsPC90ZD48L3RyPlxuIjsKKwkJJHVybF90YWcgPSAiIjsKKwl9CisJcHJpbnQgIjwvdGFibGU+XG4iOworCisJaWYgKC1zICIkcHJvamVjdHJvb3QvJHByb2plY3QvUkVBRE1FLmh0bWwiKSB7CisJCWlmIChvcGVuIG15ICRmZCwgIiRwcm9qZWN0cm9vdC8kcHJvamVjdC9SRUFETUUuaHRtbCIpIHsKKwkJCXByaW50ICI8ZGl2IGNsYXNzPVwidGl0bGVcIj5yZWFkbWU8L2Rpdj5cbiIgLgorCQkJICAgICAgIjxkaXYgY2xhc3M9XCJyZWFkbWVcIj5cbiI7CisJCQlwcmludCAkXyB3aGlsZSAoPCRmZD4pOworCQkJcHJpbnQgIlxuPC9kaXY+XG4iOyAjIGNsYXNzPSJyZWFkbWUiCisJCQljbG9zZSAkZmQ7CisJCX0KKwl9CisKKwkjIHdlIG5lZWQgdG8gcmVxdWVzdCBvbmUgbW9yZSB0aGFuIDE2ICgwLi4xNSkgdG8gY2hlY2sgaWYKKwkjIHRob3NlIDE2IGFyZSBhbGwKKwlteSBAY29tbWl0bGlzdCA9ICRoZWFkID8gcGFyc2VfY29tbWl0cygkaGVhZCwgMTcpIDogKCk7CisJaWYgKEBjb21taXRsaXN0KSB7CisJCWdpdF9wcmludF9oZWFkZXJfZGl2KCdzaG9ydGxvZycpOworCQlnaXRfc2hvcnRsb2dfYm9keShcQGNvbW1pdGxpc3QsIDAsIDE1LCAkcmVmcywKKwkJICAgICAgICAgICAgICAgICAgJCNjb21taXRsaXN0IDw9ICAxNSA/IHVuZGVmIDoKKwkJICAgICAgICAgICAgICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJzaG9ydGxvZyIpfSwgIi4uLiIpKTsKKwl9CisKKwlpZiAoQHRhZ2xpc3QpIHsKKwkJZ2l0X3ByaW50X2hlYWRlcl9kaXYoJ3RhZ3MnKTsKKwkJZ2l0X3RhZ3NfYm9keShcQHRhZ2xpc3QsIDAsIDE1LAorCQkgICAgICAgICAgICAgICQjdGFnbGlzdCA8PSAgMTUgPyB1bmRlZiA6CisJCSAgICAgICAgICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJ0YWdzIil9LCAiLi4uIikpOworCX0KKworCWlmIChAaGVhZGxpc3QpIHsKKwkJZ2l0X3ByaW50X2hlYWRlcl9kaXYoJ2hlYWRzJyk7CisJCWdpdF9oZWFkc19ib2R5KFxAaGVhZGxpc3QsICRoZWFkLCAwLCAxNSwKKwkJICAgICAgICAgICAgICAgJCNoZWFkbGlzdCA8PSAxNSA/IHVuZGVmIDoKKwkJICAgICAgICAgICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJoZWFkcyIpfSwgIi4uLiIpKTsKKwl9CisKKwlpZiAoQGZvcmtsaXN0KSB7CisJCWdpdF9wcmludF9oZWFkZXJfZGl2KCdmb3JrcycpOworCQlnaXRfcHJvamVjdF9saXN0X2JvZHkoXEBmb3JrbGlzdCwgdW5kZWYsIDAsIDE1LAorCQkgICAgICAgICAgICAgICAgICAgICAgJCNmb3JrbGlzdCA8PSAxNSA/IHVuZGVmIDoKKwkJICAgICAgICAgICAgICAgICAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iZm9ya3MiKX0sICIuLi4iKSwKKwkJICAgICAgICAgICAgICAgICAgICAgICdub2hlYWRlcicpOworCX0KKworCWdpdF9mb290ZXJfaHRtbCgpOworfQorCitzdWIgZ2l0X3RhZyB7CisJbXkgJGhlYWQgPSBnaXRfZ2V0X2hlYWRfaGFzaCgkcHJvamVjdCk7CisJZ2l0X2hlYWRlcl9odG1sKCk7CisJZ2l0X3ByaW50X3BhZ2VfbmF2KCcnLCcnLCAkaGVhZCx1bmRlZiwkaGVhZCk7CisJbXkgJXRhZyA9IHBhcnNlX3RhZygkaGFzaCk7CisKKwlpZiAoISAldGFnKSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIlVua25vd24gdGFnIG9iamVjdCIpOworCX0KKworCWdpdF9wcmludF9oZWFkZXJfZGl2KCdjb21taXQnLCBlc2NfaHRtbCgkdGFneyduYW1lJ30pLCAkaGFzaCk7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJ0aXRsZV90ZXh0XCI+XG4iIC4KKwkgICAgICAiPHRhYmxlIGNsYXNzPVwib2JqZWN0X2hlYWRlclwiPlxuIiAuCisJICAgICAgIjx0cj5cbiIgLgorCSAgICAgICI8dGQ+b2JqZWN0PC90ZD5cbiIgLgorCSAgICAgICI8dGQ+IiAuICRjZ2ktPmEoey1jbGFzcyA9PiAibGlzdCIsIC1ocmVmID0+IGhyZWYoYWN0aW9uPT4kdGFneyd0eXBlJ30sIGhhc2g9PiR0YWd7J29iamVjdCd9KX0sCisJICAgICAgICAgICAgICAgICAgICAgICAkdGFneydvYmplY3QnfSkgLiAiPC90ZD5cbiIgLgorCSAgICAgICI8dGQgY2xhc3M9XCJsaW5rXCI+IiAuICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4kdGFneyd0eXBlJ30sIGhhc2g9PiR0YWd7J29iamVjdCd9KX0sCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGFneyd0eXBlJ30pIC4gIjwvdGQ+XG4iIC4KKwkgICAgICAiPC90cj5cbiI7CisJaWYgKGRlZmluZWQoJHRhZ3snYXV0aG9yJ30pKSB7CisJCW15ICVhZCA9IHBhcnNlX2RhdGUoJHRhZ3snZXBvY2gnfSwgJHRhZ3sndHonfSk7CisJCXByaW50ICI8dHI+PHRkPmF1dGhvcjwvdGQ+PHRkPiIgLiBlc2NfaHRtbCgkdGFneydhdXRob3InfSkgLiAiPC90ZD48L3RyPlxuIjsKKwkJcHJpbnQgIjx0cj48dGQ+PC90ZD48dGQ+IiAuICRhZHsncmZjMjgyMid9IC4KKwkJCXNwcmludGYoIiAoJTAyZDolMDJkICVzKSIsICRhZHsnaG91cl9sb2NhbCd9LCAkYWR7J21pbnV0ZV9sb2NhbCd9LCAkYWR7J3R6X2xvY2FsJ30pIC4KKwkJCSI8L3RkPjwvdHI+XG4iOworCX0KKwlwcmludCAiPC90YWJsZT5cblxuIiAuCisJICAgICAgIjwvZGl2PlxuIjsKKwlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfYm9keVwiPiI7CisJbXkgJGNvbW1lbnQgPSAkdGFneydjb21tZW50J307CisJZm9yZWFjaCBteSAkbGluZSAoQCRjb21tZW50KSB7CisJCWNob21wICRsaW5lOworCQlwcmludCBlc2NfaHRtbCgkbGluZSwgLW5ic3A9PjEpIC4gIjxici8+XG4iOworCX0KKwlwcmludCAiPC9kaXY+XG4iOworCWdpdF9mb290ZXJfaHRtbCgpOworfQorCitzdWIgZ2l0X2JsYW1lMiB7CisJbXkgJGZkOworCW15ICRmdHlwZTsKKworCW15ICgkaGF2ZV9ibGFtZSkgPSBnaXR3ZWJfY2hlY2tfZmVhdHVyZSgnYmxhbWUnKTsKKwlpZiAoISRoYXZlX2JsYW1lKSB7CisJCWRpZV9lcnJvcignNDAzIFBlcm1pc3Npb24gZGVuaWVkJywgIlBlcm1pc3Npb24gZGVuaWVkIik7CisJfQorCWRpZV9lcnJvcignNDA0IE5vdCBGb3VuZCcsICJGaWxlIG5hbWUgbm90IGRlZmluZWQiKSBpZiAoISRmaWxlX25hbWUpOworCSRoYXNoX2Jhc2UgfHw9IGdpdF9nZXRfaGVhZF9oYXNoKCRwcm9qZWN0KTsKKwlkaWVfZXJyb3IodW5kZWYsICJDb3VsZG4ndCBmaW5kIGJhc2UgY29tbWl0IikgdW5sZXNzICgkaGFzaF9iYXNlKTsKKwlteSAlY28gPSBwYXJzZV9jb21taXQoJGhhc2hfYmFzZSkKKwkJb3IgZGllX2Vycm9yKHVuZGVmLCAiUmVhZGluZyBjb21taXQgZmFpbGVkIik7CisJaWYgKCFkZWZpbmVkICRoYXNoKSB7CisJCSRoYXNoID0gZ2l0X2dldF9oYXNoX2J5X3BhdGgoJGhhc2hfYmFzZSwgJGZpbGVfbmFtZSwgImJsb2IiKQorCQkJb3IgZGllX2Vycm9yKHVuZGVmLCAiRXJyb3IgbG9va2luZyB1cCBmaWxlIik7CisJfQorCSRmdHlwZSA9IGdpdF9nZXRfdHlwZSgkaGFzaCk7CisJaWYgKCRmdHlwZSAhfiAiYmxvYiIpIHsKKwkJZGllX2Vycm9yKCc0MDAgQmFkIFJlcXVlc3QnLCAiT2JqZWN0IGlzIG5vdCBhIGJsb2IiKTsKKwl9CisJb3BlbiAoJGZkLCAiLXwiLCBnaXRfY21kKCksICJibGFtZSIsICctcCcsICctLScsCisJICAgICAgJGZpbGVfbmFtZSwgJGhhc2hfYmFzZSkKKwkJb3IgZGllX2Vycm9yKHVuZGVmLCAiT3BlbiBnaXQtYmxhbWUgZmFpbGVkIik7CisJZ2l0X2hlYWRlcl9odG1sKCk7CisJbXkgJGZvcm1hdHNfbmF2ID0KKwkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJibG9iIiwgLXJlcGxheT0+MSl9LAorCQkgICAgICAgICJibG9iIikgLgorCQkiIHwgIiAuCisJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iaGlzdG9yeSIsIC1yZXBsYXk9PjEpfSwKKwkJICAgICAgICAiaGlzdG9yeSIpIC4KKwkJIiB8ICIgLgorCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImJsYW1lIiwgZmlsZV9uYW1lPT4kZmlsZV9uYW1lKX0sCisJCSAgICAgICAgIkhFQUQiKTsKKwlnaXRfcHJpbnRfcGFnZV9uYXYoJycsJycsICRoYXNoX2Jhc2UsJGNveyd0cmVlJ30sJGhhc2hfYmFzZSwgJGZvcm1hdHNfbmF2KTsKKwlnaXRfcHJpbnRfaGVhZGVyX2RpdignY29tbWl0JywgZXNjX2h0bWwoJGNveyd0aXRsZSd9KSwgJGhhc2hfYmFzZSk7CisJZ2l0X3ByaW50X3BhZ2VfcGF0aCgkZmlsZV9uYW1lLCAkZnR5cGUsICRoYXNoX2Jhc2UpOworCW15IEByZXZfY29sb3IgPSAocXcobGlnaHQyIGRhcmsyKSk7CisJbXkgJG51bV9jb2xvcnMgPSBzY2FsYXIoQHJldl9jb2xvcik7CisJbXkgJGN1cnJlbnRfY29sb3IgPSAwOworCW15ICRsYXN0X3JldjsKKwlwcmludCA8PEhUTUw7Cis8ZGl2IGNsYXNzPSJwYWdlX2JvZHkiPgorPHRhYmxlIGNsYXNzPSJibGFtZSI+Cis8dHI+PHRoPkNvbW1pdDwvdGg+PHRoPkxpbmU8L3RoPjx0aD5EYXRhPC90aD48L3RyPgorSFRNTAorCW15ICVtZXRhaW5mbyA9ICgpOworCXdoaWxlICgxKSB7CisJCSRfID0gPCRmZD47CisJCWxhc3QgdW5sZXNzIGRlZmluZWQgJF87CisJCW15ICgkZnVsbF9yZXYsICRvcmlnX2xpbmVubywgJGxpbmVubywgJGdyb3VwX3NpemUpID0KKwkJICAgIC9eKFswLTlhLWZdezQwfSkgKFxkKykgKFxkKykoPzogKFxkKykpPyQvOworCQlpZiAoIWV4aXN0cyAkbWV0YWluZm97JGZ1bGxfcmV2fSkgeworCQkJJG1ldGFpbmZveyRmdWxsX3Jldn0gPSB7fTsKKwkJfQorCQlteSAkbWV0YSA9ICRtZXRhaW5mb3skZnVsbF9yZXZ9OworCQl3aGlsZSAoPCRmZD4pIHsKKwkJCWxhc3QgaWYgKHMvXlx0Ly8pOworCQkJaWYgKC9eKFxTKykgKC4qKSQvKSB7CisJCQkJJG1ldGEtPnskMX0gPSAkMjsKKwkJCX0KKwkJfQorCQlteSAkZGF0YSA9ICRfOworCQljaG9tcCAkZGF0YTsKKwkJbXkgJHJldiA9IHN1YnN0cigkZnVsbF9yZXYsIDAsIDgpOworCQlteSAkYXV0aG9yID0gJG1ldGEtPnsnYXV0aG9yJ307CisJCW15ICVkYXRlID0gcGFyc2VfZGF0ZSgkbWV0YS0+eydhdXRob3ItdGltZSd9LAorCQkgICAgICAgICAgICAgICAgICAgICAgJG1ldGEtPnsnYXV0aG9yLXR6J30pOworCQlteSAkZGF0ZSA9ICRkYXRleydpc28tdHonfTsKKwkJaWYgKCRncm91cF9zaXplKSB7CisJCQkkY3VycmVudF9jb2xvciA9ICsrJGN1cnJlbnRfY29sb3IgJSAkbnVtX2NvbG9yczsKKwkJfQorCQlwcmludCAiPHRyIGNsYXNzPVwiJHJldl9jb2xvclskY3VycmVudF9jb2xvcl1cIj5cbiI7CisJCWlmICgkZ3JvdXBfc2l6ZSkgeworCQkJcHJpbnQgIjx0ZCBjbGFzcz1cInNoYTFcIiI7CisJCQlwcmludCAiIHRpdGxlPVwiIi4gZXNjX2h0bWwoJGF1dGhvcikgLiAiLCAkZGF0ZVwiIjsKKwkJCXByaW50ICIgcm93c3Bhbj1cIiRncm91cF9zaXplXCIiIGlmICgkZ3JvdXBfc2l6ZSA+IDEpOworCQkJcHJpbnQgIj4iOworCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJjb21taXQiLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoPT4kZnVsbF9yZXYsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZT0+JGZpbGVfbmFtZSl9LAorCQkJICAgICAgICAgICAgICBlc2NfaHRtbCgkcmV2KSk7CisJCQlwcmludCAiPC90ZD5cbiI7CisJCX0KKwkJb3BlbiAobXkgJGRkLCAiLXwiLCBnaXRfY21kKCksICJyZXYtcGFyc2UiLCAiJGZ1bGxfcmV2XiIpCisJCQlvciBkaWVfZXJyb3IodW5kZWYsICJPcGVuIGdpdC1yZXYtcGFyc2UgZmFpbGVkIik7CisJCW15ICRwYXJlbnRfY29tbWl0ID0gPCRkZD47CisJCWNsb3NlICRkZDsKKwkJY2hvbXAoJHBhcmVudF9jb21taXQpOworCQlteSAkYmxhbWVkID0gaHJlZihhY3Rpb24gPT4gJ2JsYW1lJywKKwkJICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lID0+ICRtZXRhLT57J2ZpbGVuYW1lJ30sCisJCSAgICAgICAgICAgICAgICAgIGhhc2hfYmFzZSA9PiAkcGFyZW50X2NvbW1pdCk7CisJCXByaW50ICI8dGQgY2xhc3M9XCJsaW5lbnJcIj4iOworCQlwcmludCAkY2dpLT5hKHsgLWhyZWYgPT4gIiRibGFtZWQjbCRvcmlnX2xpbmVubyIsCisJCSAgICAgICAgICAgICAgICAtaWQgPT4gImwkbGluZW5vIiwKKwkJICAgICAgICAgICAgICAgIC1jbGFzcyA9PiAibGluZW5yIiB9LAorCQkgICAgICAgICAgICAgIGVzY19odG1sKCRsaW5lbm8pKTsKKwkJcHJpbnQgIjwvdGQ+IjsKKwkJcHJpbnQgIjx0ZCBjbGFzcz1cInByZVwiPiIgLiBlc2NfaHRtbCgkZGF0YSkgLiAiPC90ZD5cbiI7CisJCXByaW50ICI8L3RyPlxuIjsKKwl9CisJcHJpbnQgIjwvdGFibGU+XG4iOworCXByaW50ICI8L2Rpdj4iOworCWNsb3NlICRmZAorCQlvciBwcmludCAiUmVhZGluZyBibG9iIGZhaWxlZFxuIjsKKwlnaXRfZm9vdGVyX2h0bWwoKTsKK30KKworc3ViIGdpdF9ibGFtZSB7CisJbXkgJGZkOworCisJbXkgKCRoYXZlX2JsYW1lKSA9IGdpdHdlYl9jaGVja19mZWF0dXJlKCdibGFtZScpOworCWlmICghJGhhdmVfYmxhbWUpIHsKKwkJZGllX2Vycm9yKCc0MDMgUGVybWlzc2lvbiBkZW5pZWQnLCAiUGVybWlzc2lvbiBkZW5pZWQiKTsKKwl9CisJZGllX2Vycm9yKCc0MDQgTm90IEZvdW5kJywgIkZpbGUgbmFtZSBub3QgZGVmaW5lZCIpIGlmICghJGZpbGVfbmFtZSk7CisJJGhhc2hfYmFzZSB8fD0gZ2l0X2dldF9oZWFkX2hhc2goJHByb2plY3QpOworCWRpZV9lcnJvcih1bmRlZiwgIkNvdWxkbid0IGZpbmQgYmFzZSBjb21taXQiKSB1bmxlc3MgKCRoYXNoX2Jhc2UpOworCW15ICVjbyA9IHBhcnNlX2NvbW1pdCgkaGFzaF9iYXNlKQorCQlvciBkaWVfZXJyb3IodW5kZWYsICJSZWFkaW5nIGNvbW1pdCBmYWlsZWQiKTsKKwlpZiAoIWRlZmluZWQgJGhhc2gpIHsKKwkJJGhhc2ggPSBnaXRfZ2V0X2hhc2hfYnlfcGF0aCgkaGFzaF9iYXNlLCAkZmlsZV9uYW1lLCAiYmxvYiIpCisJCQlvciBkaWVfZXJyb3IodW5kZWYsICJFcnJvciBsb29rdXAgZmlsZSIpOworCX0KKwlvcGVuICgkZmQsICItfCIsIGdpdF9jbWQoKSwgImFubm90YXRlIiwgJy1sJywgJy10JywgJy1yJywgJGZpbGVfbmFtZSwgJGhhc2hfYmFzZSkKKwkJb3IgZGllX2Vycm9yKHVuZGVmLCAiT3BlbiBnaXQtYW5ub3RhdGUgZmFpbGVkIik7CisJZ2l0X2hlYWRlcl9odG1sKCk7CisJbXkgJGZvcm1hdHNfbmF2ID0KKwkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJibG9iIiwgaGFzaD0+JGhhc2gsIGhhc2hfYmFzZT0+JGhhc2hfYmFzZSwgZmlsZV9uYW1lPT4kZmlsZV9uYW1lKX0sCisJCSAgICAgICAgImJsb2IiKSAuCisJCSIgfCAiIC4KKwkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJoaXN0b3J5IiwgaGFzaD0+JGhhc2gsIGhhc2hfYmFzZT0+JGhhc2hfYmFzZSwgZmlsZV9uYW1lPT4kZmlsZV9uYW1lKX0sCisJCQkiaGlzdG9yeSIpIC4KKwkJIiB8ICIgLgorCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImJsYW1lIiwgZmlsZV9uYW1lPT4kZmlsZV9uYW1lKX0sCisJCSAgICAgICAgIkhFQUQiKTsKKwlnaXRfcHJpbnRfcGFnZV9uYXYoJycsJycsICRoYXNoX2Jhc2UsJGNveyd0cmVlJ30sJGhhc2hfYmFzZSwgJGZvcm1hdHNfbmF2KTsKKwlnaXRfcHJpbnRfaGVhZGVyX2RpdignY29tbWl0JywgZXNjX2h0bWwoJGNveyd0aXRsZSd9KSwgJGhhc2hfYmFzZSk7CisJZ2l0X3ByaW50X3BhZ2VfcGF0aCgkZmlsZV9uYW1lLCAnYmxvYicsICRoYXNoX2Jhc2UpOworCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9ib2R5XCI+XG4iOworCXByaW50IDw8SFRNTDsKKzx0YWJsZSBjbGFzcz0iYmxhbWUiPgorICA8dHI+CisgICAgPHRoPkNvbW1pdDwvdGg+CisgICAgPHRoPkFnZTwvdGg+CisgICAgPHRoPkF1dGhvcjwvdGg+CisgICAgPHRoPkxpbmU8L3RoPgorICAgIDx0aD5EYXRhPC90aD4KKyAgPC90cj4KK0hUTUwKKwlteSBAbGluZV9jbGFzcyA9IChxdyhsaWdodCBkYXJrKSk7CisJbXkgJGxpbmVfY2xhc3NfbGVuID0gc2NhbGFyIChAbGluZV9jbGFzcyk7CisJbXkgJGxpbmVfY2xhc3NfbnVtID0gJCNsaW5lX2NsYXNzOworCXdoaWxlIChteSAkbGluZSA9IDwkZmQ+KSB7CisJCW15ICRsb25nX3JldjsKKwkJbXkgJHNob3J0X3JldjsKKwkJbXkgJGF1dGhvcjsKKwkJbXkgJHRpbWU7CisJCW15ICRsaW5lbm87CisJCW15ICRkYXRhOworCQlteSAkYWdlOworCQlteSAkYWdlX3N0cjsKKwkJbXkgJGFnZV9jbGFzczsKKworCQljaG9tcCAkbGluZTsKKwkJJGxpbmVfY2xhc3NfbnVtID0gKCRsaW5lX2NsYXNzX251bSArIDEpICUgJGxpbmVfY2xhc3NfbGVuOworCisJCWlmICgkbGluZSA9fiBtL14oWzAtOWEtZkEtRl17NDB9KVx0XChccyooW15cdF0rKVx0KFxkKykgWystXVxkXGRcZFxkXHQoXGQrKVwpKC4qKSQvKSB7CisJCQkkbG9uZ19yZXYgPSAkMTsKKwkJCSRhdXRob3IgICA9ICQyOworCQkJJHRpbWUgICAgID0gJDM7CisJCQkkbGluZW5vICAgPSAkNDsKKwkJCSRkYXRhICAgICA9ICQ1OworCQl9IGVsc2UgeworCQkJcHJpbnQgcXEoICA8dHI+PHRkIGNvbHNwYW49IjUiIGNsYXNzPSJlcnJvciI+VW5hYmxlIHRvIHBhcnNlOiAkbGluZTwvdGQ+PC90cj5cbik7CisJCQluZXh0OworCQl9CisJCSRzaG9ydF9yZXYgID0gc3Vic3RyICgkbG9uZ19yZXYsIDAsIDgpOworCQkkYWdlICAgICAgICA9IHRpbWUgKCkgLSAkdGltZTsKKwkJJGFnZV9zdHIgICAgPSBhZ2Vfc3RyaW5nICgkYWdlKTsKKwkJJGFnZV9zdHIgICAgPX4gcy8gLyZuYnNwOy9nOworCQkkYWdlX2NsYXNzICA9IGFnZV9jbGFzcygkYWdlKTsKKwkJJGF1dGhvciAgICAgPSBlc2NfaHRtbCAoJGF1dGhvcik7CisJCSRhdXRob3IgICAgID1+IHMvIC8mbmJzcDsvZzsKKworCQkkZGF0YSA9IHVudGFiaWZ5KCRkYXRhKTsKKwkJJGRhdGEgPSBlc2NfaHRtbCAoJGRhdGEpOworCisJCXByaW50IDw8SFRNTDsKKyAgPHRyIGNsYXNzPSIkbGluZV9jbGFzc1skbGluZV9jbGFzc19udW1dIj4KKyAgICA8dGQgY2xhc3M9InNoYTEiPjxhIGhyZWY9IiR7XGhyZWYgKGFjdGlvbj0+ImNvbW1pdCIsIGhhc2g9PiRsb25nX3Jldil9IiBjbGFzcz0idGV4dCI+JHNob3J0X3Jldi4uPC9hPjwvdGQ+CisgICAgPHRkIGNsYXNzPSIkYWdlX2NsYXNzIj4kYWdlX3N0cjwvdGQ+CisgICAgPHRkPiRhdXRob3I8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGluZW5yIj48YSBpZD0iJGxpbmVubyIgaHJlZj0iIyRsaW5lbm8iIGNsYXNzPSJsaW5lbnIiPiRsaW5lbm88L2E+PC90ZD4KKyAgICA8dGQgY2xhc3M9InByZSI+JGRhdGE8L3RkPgorICA8L3RyPgorSFRNTAorCX0gIyB3aGlsZSAobXkgJGxpbmUgPSA8JGZkPikKKwlwcmludCAiPC90YWJsZT5cblxuIjsKKwljbG9zZSAkZmQKKwkJb3IgcHJpbnQgIlJlYWRpbmcgYmxvYiBmYWlsZWQuXG4iOworCXByaW50ICI8L2Rpdj4iOworCWdpdF9mb290ZXJfaHRtbCgpOworfQorCitzdWIgZ2l0X3RhZ3MgeworCW15ICRoZWFkID0gZ2l0X2dldF9oZWFkX2hhc2goJHByb2plY3QpOworCWdpdF9oZWFkZXJfaHRtbCgpOworCWdpdF9wcmludF9wYWdlX25hdignJywnJywgJGhlYWQsdW5kZWYsJGhlYWQpOworCWdpdF9wcmludF9oZWFkZXJfZGl2KCdzdW1tYXJ5JywgJHByb2plY3QpOworCisJbXkgQHRhZ3NsaXN0ID0gZ2l0X2dldF90YWdzX2xpc3QoKTsKKwlpZiAoQHRhZ3NsaXN0KSB7CisJCWdpdF90YWdzX2JvZHkoXEB0YWdzbGlzdCk7CisJfQorCWdpdF9mb290ZXJfaHRtbCgpOworfQorCitzdWIgZ2l0X2hlYWRzIHsKKwlteSAkaGVhZCA9IGdpdF9nZXRfaGVhZF9oYXNoKCRwcm9qZWN0KTsKKwlnaXRfaGVhZGVyX2h0bWwoKTsKKwlnaXRfcHJpbnRfcGFnZV9uYXYoJycsJycsICRoZWFkLHVuZGVmLCRoZWFkKTsKKwlnaXRfcHJpbnRfaGVhZGVyX2Rpdignc3VtbWFyeScsICRwcm9qZWN0KTsKKworCW15IEBoZWFkc2xpc3QgPSBnaXRfZ2V0X2hlYWRzX2xpc3QoKTsKKwlpZiAoQGhlYWRzbGlzdCkgeworCQlnaXRfaGVhZHNfYm9keShcQGhlYWRzbGlzdCwgJGhlYWQpOworCX0KKwlnaXRfZm9vdGVyX2h0bWwoKTsKK30KKworc3ViIGdpdF9ibG9iX3BsYWluIHsKKwlteSAkZXhwaXJlczsKKworCWlmICghZGVmaW5lZCAkaGFzaCkgeworCQlpZiAoZGVmaW5lZCAkZmlsZV9uYW1lKSB7CisJCQlteSAkYmFzZSA9ICRoYXNoX2Jhc2UgfHwgZ2l0X2dldF9oZWFkX2hhc2goJHByb2plY3QpOworCQkJJGhhc2ggPSBnaXRfZ2V0X2hhc2hfYnlfcGF0aCgkYmFzZSwgJGZpbGVfbmFtZSwgImJsb2IiKQorCQkJCW9yIGRpZV9lcnJvcih1bmRlZiwgIkVycm9yIGxvb2t1cCBmaWxlIik7CisJCX0gZWxzZSB7CisJCQlkaWVfZXJyb3IodW5kZWYsICJObyBmaWxlIG5hbWUgZGVmaW5lZCIpOworCQl9CisJfSBlbHNpZiAoJGhhc2ggPX4gbS9eWzAtOWEtZkEtRl17NDB9JC8pIHsKKwkJIyBibG9icyBkZWZpbmVkIGJ5IG5vbi10ZXh0dWFsIGhhc2ggaWQncyBjYW4gYmUgY2FjaGVkCisJCSRleHBpcmVzID0gIisxZCI7CisJfQorCisJbXkgJHR5cGUgPSBzaGlmdDsKKwlvcGVuIG15ICRmZCwgIi18IiwgZ2l0X2NtZCgpLCAiY2F0LWZpbGUiLCAiYmxvYiIsICRoYXNoCisJCW9yIGRpZV9lcnJvcih1bmRlZiwgIkNvdWxkbid0IGNhdCAkZmlsZV9uYW1lLCAkaGFzaCIpOworCisJJHR5cGUgfHw9IGJsb2JfbWltZXR5cGUoJGZkLCAkZmlsZV9uYW1lKTsKKworCSMgc2F2ZSBhcyBmaWxlbmFtZSwgZXZlbiB3aGVuIG5vICRmaWxlX25hbWUgaXMgZ2l2ZW4KKwlteSAkc2F2ZV9hcyA9ICIkaGFzaCI7CisJaWYgKGRlZmluZWQgJGZpbGVfbmFtZSkgeworCQkkc2F2ZV9hcyA9ICRmaWxlX25hbWU7CisJfSBlbHNpZiAoJHR5cGUgPX4gbS9edGV4dFwvLykgeworCQkkc2F2ZV9hcyAuPSAnLnR4dCc7CisJfQorCisJcHJpbnQgJGNnaS0+aGVhZGVyKAorCQktdHlwZSA9PiAiJHR5cGUiLAorCQktZXhwaXJlcz0+JGV4cGlyZXMsCisJCS1jb250ZW50X2Rpc3Bvc2l0aW9uID0+ICdpbmxpbmU7IGZpbGVuYW1lPSInIC4gIiRzYXZlX2FzIiAuICciJyk7CisJdW5kZWYgJC87CisJYmlubW9kZSBTVERPVVQsICc6cmF3JzsKKwlwcmludCA8JGZkPjsKKwliaW5tb2RlIFNURE9VVCwgJzp1dGY4JzsgIyBhcyBzZXQgYXQgdGhlIGJlZ2lubmluZyBvZiBnaXR3ZWIuY2dpCisJJC8gPSAiXG4iOworCWNsb3NlICRmZDsKK30KKworc3ViIGdpdF9ibG9iIHsKKwlteSAkZXhwaXJlczsKKworCWlmICghZGVmaW5lZCAkaGFzaCkgeworCQlpZiAoZGVmaW5lZCAkZmlsZV9uYW1lKSB7CisJCQlteSAkYmFzZSA9ICRoYXNoX2Jhc2UgfHwgZ2l0X2dldF9oZWFkX2hhc2goJHByb2plY3QpOworCQkJJGhhc2ggPSBnaXRfZ2V0X2hhc2hfYnlfcGF0aCgkYmFzZSwgJGZpbGVfbmFtZSwgImJsb2IiKQorCQkJCW9yIGRpZV9lcnJvcih1bmRlZiwgIkVycm9yIGxvb2t1cCBmaWxlIik7CisJCX0gZWxzZSB7CisJCQlkaWVfZXJyb3IodW5kZWYsICJObyBmaWxlIG5hbWUgZGVmaW5lZCIpOworCQl9CisJfSBlbHNpZiAoJGhhc2ggPX4gbS9eWzAtOWEtZkEtRl17NDB9JC8pIHsKKwkJIyBibG9icyBkZWZpbmVkIGJ5IG5vbi10ZXh0dWFsIGhhc2ggaWQncyBjYW4gYmUgY2FjaGVkCisJCSRleHBpcmVzID0gIisxZCI7CisJfQorCisJbXkgKCRoYXZlX2JsYW1lKSA9IGdpdHdlYl9jaGVja19mZWF0dXJlKCdibGFtZScpOworCW9wZW4gbXkgJGZkLCAiLXwiLCBnaXRfY21kKCksICJjYXQtZmlsZSIsICJibG9iIiwgJGhhc2gKKwkJb3IgZGllX2Vycm9yKHVuZGVmLCAiQ291bGRuJ3QgY2F0ICRmaWxlX25hbWUsICRoYXNoIik7CisJbXkgJG1pbWV0eXBlID0gYmxvYl9taW1ldHlwZSgkZmQsICRmaWxlX25hbWUpOworCWlmICgkbWltZXR5cGUgIX4gbSFeKD86dGV4dC98aW1hZ2UvKD86Z2lmfHBuZ3xqcGVnKSQpISAmJiAtQiAkZmQpIHsKKwkJY2xvc2UgJGZkOworCQlyZXR1cm4gZ2l0X2Jsb2JfcGxhaW4oJG1pbWV0eXBlKTsKKwl9CisJIyB3ZSBjYW4gaGF2ZSBibGFtZSBvbmx5IGZvciB0ZXh0LyogbWltZXR5cGUKKwkkaGF2ZV9ibGFtZSAmJj0gKCRtaW1ldHlwZSA9fiBtIV50ZXh0LyEpOworCisJZ2l0X2hlYWRlcl9odG1sKHVuZGVmLCAkZXhwaXJlcyk7CisJbXkgJGZvcm1hdHNfbmF2ID0gJyc7CisJaWYgKGRlZmluZWQgJGhhc2hfYmFzZSAmJiAobXkgJWNvID0gcGFyc2VfY29tbWl0KCRoYXNoX2Jhc2UpKSkgeworCQlpZiAoZGVmaW5lZCAkZmlsZV9uYW1lKSB7CisJCQlpZiAoJGhhdmVfYmxhbWUpIHsKKwkJCQkkZm9ybWF0c19uYXYgLj0KKwkJCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJibGFtZSIsIC1yZXBsYXk9PjEpfSwKKwkJCQkJICAgICAgICAiYmxhbWUiKSAuCisJCQkJCSIgfCAiOworCQkJfQorCQkJJGZvcm1hdHNfbmF2IC49CisJCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJoaXN0b3J5IiwgLXJlcGxheT0+MSl9LAorCQkJCSAgICAgICAgImhpc3RvcnkiKSAuCisJCQkJIiB8ICIgLgorCQkJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYl9wbGFpbiIsIC1yZXBsYXk9PjEpfSwKKwkJCQkgICAgICAgICJyYXciKSAuCisJCQkJIiB8ICIgLgorCQkJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYiIsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2Jhc2U9PiJIRUFEIiwgZmlsZV9uYW1lPT4kZmlsZV9uYW1lKX0sCisJCQkJICAgICAgICAiSEVBRCIpOworCQl9IGVsc2UgeworCQkJJGZvcm1hdHNfbmF2IC49CisJCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJibG9iX3BsYWluIiwgLXJlcGxheT0+MSl9LAorCQkJCSAgICAgICAgInJhdyIpOworCQl9CisJCWdpdF9wcmludF9wYWdlX25hdignJywnJywgJGhhc2hfYmFzZSwkY297J3RyZWUnfSwkaGFzaF9iYXNlLCAkZm9ybWF0c19uYXYpOworCQlnaXRfcHJpbnRfaGVhZGVyX2RpdignY29tbWl0JywgZXNjX2h0bWwoJGNveyd0aXRsZSd9KSwgJGhhc2hfYmFzZSk7CisJfSBlbHNlIHsKKwkJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX25hdlwiPlxuIiAuCisJCSAgICAgICI8YnIvPjxici8+PC9kaXY+XG4iIC4KKwkJICAgICAgIjxkaXYgY2xhc3M9XCJ0aXRsZVwiPiRoYXNoPC9kaXY+XG4iOworCX0KKwlnaXRfcHJpbnRfcGFnZV9wYXRoKCRmaWxlX25hbWUsICJibG9iIiwgJGhhc2hfYmFzZSk7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX2JvZHlcIj5cbiI7CisJaWYgKCRtaW1ldHlwZSA9fiBtIV5pbWFnZS8hKSB7CisJCXByaW50IHFxITxpbWcgdHlwZT0iJG1pbWV0eXBlIiE7CisJCWlmICgkZmlsZV9uYW1lKSB7CisJCQlwcmludCBxcSEgYWx0PSIkZmlsZV9uYW1lIiB0aXRsZT0iJGZpbGVfbmFtZSIhOworCQl9CisJCXByaW50IHFxISBzcmM9IiEgLgorCQkgICAgICBocmVmKGFjdGlvbj0+ImJsb2JfcGxhaW4iLCBoYXNoPT4kaGFzaCwKKwkJICAgICAgICAgICBoYXNoX2Jhc2U9PiRoYXNoX2Jhc2UsIGZpbGVfbmFtZT0+JGZpbGVfbmFtZSkgLgorCQkgICAgICBxcSEiIC8+XG4hOworCX0gZWxzZSB7CisJCW15ICRucjsKKwkJd2hpbGUgKG15ICRsaW5lID0gPCRmZD4pIHsKKwkJCWNob21wICRsaW5lOworCQkJJG5yKys7CisJCQkkbGluZSA9IHVudGFiaWZ5KCRsaW5lKTsKKwkJCXByaW50ZiAiPGRpdiBjbGFzcz1cInByZVwiPjxhIGlkPVwibCVpXCIgaHJlZj1cIiNsJWlcIiBjbGFzcz1cImxpbmVuclwiPiU0aTwvYT4gJXM8L2Rpdj5cbiIsCisJCQkgICAgICAgJG5yLCAkbnIsICRuciwgZXNjX2h0bWwoJGxpbmUsIC1uYnNwPT4xKTsKKwkJfQorCX0KKwljbG9zZSAkZmQKKwkJb3IgcHJpbnQgIlJlYWRpbmcgYmxvYiBmYWlsZWQuXG4iOworCXByaW50ICI8L2Rpdj4iOworCWdpdF9mb290ZXJfaHRtbCgpOworfQorCitzdWIgZ2l0X3RyZWUgeworCWlmICghZGVmaW5lZCAkaGFzaF9iYXNlKSB7CisJCSRoYXNoX2Jhc2UgPSAiSEVBRCI7CisJfQorCWlmICghZGVmaW5lZCAkaGFzaCkgeworCQlpZiAoZGVmaW5lZCAkZmlsZV9uYW1lKSB7CisJCQkkaGFzaCA9IGdpdF9nZXRfaGFzaF9ieV9wYXRoKCRoYXNoX2Jhc2UsICRmaWxlX25hbWUsICJ0cmVlIik7CisJCX0gZWxzZSB7CisJCQkkaGFzaCA9ICRoYXNoX2Jhc2U7CisJCX0KKwl9CisJJC8gPSAiXDAiOworCW9wZW4gbXkgJGZkLCAiLXwiLCBnaXRfY21kKCksICJscy10cmVlIiwgJy16JywgJGhhc2gKKwkJb3IgZGllX2Vycm9yKHVuZGVmLCAiT3BlbiBnaXQtbHMtdHJlZSBmYWlsZWQiKTsKKwlteSBAZW50cmllcyA9IG1hcCB7IGNob21wOyAkXyB9IDwkZmQ+OworCWNsb3NlICRmZCBvciBkaWVfZXJyb3IodW5kZWYsICJSZWFkaW5nIHRyZWUgZmFpbGVkIik7CisJJC8gPSAiXG4iOworCisJbXkgJHJlZnMgPSBnaXRfZ2V0X3JlZmVyZW5jZXMoKTsKKwlteSAkcmVmID0gZm9ybWF0X3JlZl9tYXJrZXIoJHJlZnMsICRoYXNoX2Jhc2UpOworCWdpdF9oZWFkZXJfaHRtbCgpOworCW15ICRiYXNlZGlyID0gJyc7CisJbXkgKCRoYXZlX2JsYW1lKSA9IGdpdHdlYl9jaGVja19mZWF0dXJlKCdibGFtZScpOworCWlmIChkZWZpbmVkICRoYXNoX2Jhc2UgJiYgKG15ICVjbyA9IHBhcnNlX2NvbW1pdCgkaGFzaF9iYXNlKSkpIHsKKwkJbXkgQHZpZXdzX25hdiA9ICgpOworCQlpZiAoZGVmaW5lZCAkZmlsZV9uYW1lKSB7CisJCQlwdXNoIEB2aWV3c19uYXYsCisJCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJoaXN0b3J5IiwgLXJlcGxheT0+MSl9LAorCQkJCSAgICAgICAgImhpc3RvcnkiKSwKKwkJCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+InRyZWUiLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9iYXNlPT4iSEVBRCIsIGZpbGVfbmFtZT0+JGZpbGVfbmFtZSl9LAorCQkJCSAgICAgICAgIkhFQUQiKSwKKwkJfQorCQlteSAkc25hcHNob3RfbGlua3MgPSBmb3JtYXRfc25hcHNob3RfbGlua3MoJGhhc2gpOworCQlpZiAoZGVmaW5lZCAkc25hcHNob3RfbGlua3MpIHsKKwkJCSMgRklYTUU6IFNob3VsZCBiZSBhdmFpbGFibGUgd2hlbiB3ZSBoYXZlIG5vIGhhc2ggYmFzZSBhcyB3ZWxsLgorCQkJcHVzaCBAdmlld3NfbmF2LCAkc25hcHNob3RfbGlua3M7CisJCX0KKwkJZ2l0X3ByaW50X3BhZ2VfbmF2KCd0cmVlJywnJywgJGhhc2hfYmFzZSwgdW5kZWYsIHVuZGVmLCBqb2luKCcgfCAnLCBAdmlld3NfbmF2KSk7CisJCWdpdF9wcmludF9oZWFkZXJfZGl2KCdjb21taXQnLCBlc2NfaHRtbCgkY297J3RpdGxlJ30pIC4gJHJlZiwgJGhhc2hfYmFzZSk7CisJfSBlbHNlIHsKKwkJdW5kZWYgJGhhc2hfYmFzZTsKKwkJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX25hdlwiPlxuIjsKKwkJcHJpbnQgIjxici8+PGJyLz48L2Rpdj5cbiI7CisJCXByaW50ICI8ZGl2IGNsYXNzPVwidGl0bGVcIj4kaGFzaDwvZGl2PlxuIjsKKwl9CisJaWYgKGRlZmluZWQgJGZpbGVfbmFtZSkgeworCQkkYmFzZWRpciA9ICRmaWxlX25hbWU7CisJCWlmICgkYmFzZWRpciBuZSAnJyAmJiBzdWJzdHIoJGJhc2VkaXIsIC0xKSBuZSAnLycpIHsKKwkJCSRiYXNlZGlyIC49ICcvJzsKKwkJfQorCX0KKwlnaXRfcHJpbnRfcGFnZV9wYXRoKCRmaWxlX25hbWUsICd0cmVlJywgJGhhc2hfYmFzZSk7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX2JvZHlcIj5cbiI7CisJcHJpbnQgIjx0YWJsZSBjbGFzcz1cInRyZWVcIj5cbiI7CisJbXkgJGFsdGVybmF0ZSA9IDE7CisJIyAnLi4nICh0b3AgZGlyZWN0b3J5KSBsaW5rIGlmIHBvc3NpYmxlCisJaWYgKGRlZmluZWQgJGhhc2hfYmFzZSAmJgorCSAgICBkZWZpbmVkICRmaWxlX25hbWUgJiYgJGZpbGVfbmFtZSA9fiBtIVteL10rJCEpIHsKKwkJaWYgKCRhbHRlcm5hdGUpIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJkYXJrXCI+XG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIjx0ciBjbGFzcz1cImxpZ2h0XCI+XG4iOworCQl9CisJCSRhbHRlcm5hdGUgXj0gMTsKKworCQlteSAkdXAgPSAkZmlsZV9uYW1lOworCQkkdXAgPX4gcyEvP1teL10rJCEhOworCQl1bmRlZiAkdXAgdW5sZXNzICR1cDsKKwkJIyBiYXNlZCBvbiBnaXRfcHJpbnRfdHJlZV9lbnRyeQorCQlwcmludCAnPHRkIGNsYXNzPSJtb2RlIj4nIC4gbW9kZV9zdHIoJzA0MDAwMCcpIC4gIjwvdGQ+XG4iOworCQlwcmludCAnPHRkIGNsYXNzPSJsaXN0Ij4nOworCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+InRyZWUiLCBoYXNoX2Jhc2U9PiRoYXNoX2Jhc2UsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4kdXApfSwKKwkJICAgICAgICAgICAgICAiLi4iKTsKKwkJcHJpbnQgIjwvdGQ+XG4iOworCQlwcmludCAiPHRkIGNsYXNzPVwibGlua1wiPjwvdGQ+XG4iOworCisJCXByaW50ICI8L3RyPlxuIjsKKwl9CisJZm9yZWFjaCBteSAkbGluZSAoQGVudHJpZXMpIHsKKwkJbXkgJXQgPSBwYXJzZV9sc190cmVlX2xpbmUoJGxpbmUsIC16ID0+IDEpOworCisJCWlmICgkYWx0ZXJuYXRlKSB7CisJCQlwcmludCAiPHRyIGNsYXNzPVwiZGFya1wiPlxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJsaWdodFwiPlxuIjsKKwkJfQorCQkkYWx0ZXJuYXRlIF49IDE7CisKKwkJZ2l0X3ByaW50X3RyZWVfZW50cnkoXCV0LCAkYmFzZWRpciwgJGhhc2hfYmFzZSwgJGhhdmVfYmxhbWUpOworCisJCXByaW50ICI8L3RyPlxuIjsKKwl9CisJcHJpbnQgIjwvdGFibGU+XG4iIC4KKwkgICAgICAiPC9kaXY+IjsKKwlnaXRfZm9vdGVyX2h0bWwoKTsKK30KKworc3ViIGdpdF9zbmFwc2hvdCB7CisJbXkgQHN1cHBvcnRlZF9mbXRzID0gZ2l0d2ViX2NoZWNrX2ZlYXR1cmUoJ3NuYXBzaG90Jyk7CisJQHN1cHBvcnRlZF9mbXRzID0gZmlsdGVyX3NuYXBzaG90X2ZtdHMoQHN1cHBvcnRlZF9mbXRzKTsKKworCW15ICRmb3JtYXQgPSAkY2dpLT5wYXJhbSgnc2YnKTsKKwlpZiAoIUBzdXBwb3J0ZWRfZm10cykgeworCQlkaWVfZXJyb3IoJzQwMyBQZXJtaXNzaW9uIGRlbmllZCcsICJQZXJtaXNzaW9uIGRlbmllZCIpOworCX0KKwkjIGRlZmF1bHQgdG8gZmlyc3Qgc3VwcG9ydGVkIHNuYXBzaG90IGZvcm1hdAorCSRmb3JtYXQgfHw9ICRzdXBwb3J0ZWRfZm10c1swXTsKKwlpZiAoJGZvcm1hdCAhfiBtL15bYS16MC05XSskLykgeworCQlkaWVfZXJyb3IodW5kZWYsICJJbnZhbGlkIHNuYXBzaG90IGZvcm1hdCBwYXJhbWV0ZXIiKTsKKwl9IGVsc2lmICghZXhpc3RzKCRrbm93bl9zbmFwc2hvdF9mb3JtYXRzeyRmb3JtYXR9KSkgeworCQlkaWVfZXJyb3IodW5kZWYsICJVbmtub3duIHNuYXBzaG90IGZvcm1hdCIpOworCX0gZWxzaWYgKCFncmVwKCRfIGVxICRmb3JtYXQsIEBzdXBwb3J0ZWRfZm10cykpIHsKKwkJZGllX2Vycm9yKHVuZGVmLCAiVW5zdXBwb3J0ZWQgc25hcHNob3QgZm9ybWF0Iik7CisJfQorCisJaWYgKCFkZWZpbmVkICRoYXNoKSB7CisJCSRoYXNoID0gZ2l0X2dldF9oZWFkX2hhc2goJHByb2plY3QpOworCX0KKworCW15ICRnaXRfY29tbWFuZCA9IGdpdF9jbWRfc3RyKCk7CisJbXkgJG5hbWUgPSAkcHJvamVjdDsKKwkkbmFtZSA9fiBzLChbXi9dKS8qXC5naXQkLCQxLDsKKwkkbmFtZSA9IGJhc2VuYW1lKCRuYW1lKTsKKwlteSAkZmlsZW5hbWUgPSB0b191dGY4KCRuYW1lKTsKKwkkbmFtZSA9fiBzL1wwNDcvXDA0N1xcXDA0N1wwNDcvZzsKKwlteSAkY21kOworCSRmaWxlbmFtZSAuPSAiLSRoYXNoJGtub3duX3NuYXBzaG90X2Zvcm1hdHN7JGZvcm1hdH17J3N1ZmZpeCd9IjsKKwkkY21kID0gIiRnaXRfY29tbWFuZCBhcmNoaXZlICIgLgorCQkiLS1mb3JtYXQ9JGtub3duX3NuYXBzaG90X2Zvcm1hdHN7JGZvcm1hdH17J2Zvcm1hdCd9ICIgLgorCQkiLS1wcmVmaXg9XCckbmFtZVwnLyAkaGFzaCI7CisJaWYgKGV4aXN0cyAka25vd25fc25hcHNob3RfZm9ybWF0c3skZm9ybWF0fXsnY29tcHJlc3Nvcid9KSB7CisJCSRjbWQgLj0gJyB8ICcgLiBqb2luICcgJywgQHska25vd25fc25hcHNob3RfZm9ybWF0c3skZm9ybWF0fXsnY29tcHJlc3Nvcid9fTsKKwl9CisKKwlwcmludCAkY2dpLT5oZWFkZXIoCisJCS10eXBlID0+ICRrbm93bl9zbmFwc2hvdF9mb3JtYXRzeyRmb3JtYXR9eyd0eXBlJ30sCisJCS1jb250ZW50X2Rpc3Bvc2l0aW9uID0+ICdpbmxpbmU7IGZpbGVuYW1lPSInIC4gIiRmaWxlbmFtZSIgLiAnIicsCisJCS1zdGF0dXMgPT4gJzIwMCBPSycpOworCisJb3BlbiBteSAkZmQsICItfCIsICRjbWQKKwkJb3IgZGllX2Vycm9yKHVuZGVmLCAiRXhlY3V0ZSBnaXQtYXJjaGl2ZSBmYWlsZWQiKTsKKwliaW5tb2RlIFNURE9VVCwgJzpyYXcnOworCXByaW50IDwkZmQ+OworCWJpbm1vZGUgU1RET1VULCAnOnV0ZjgnOyAjIGFzIHNldCBhdCB0aGUgYmVnaW5uaW5nIG9mIGdpdHdlYi5jZ2kKKwljbG9zZSAkZmQ7Cit9CisKK3N1YiBnaXRfbG9nIHsKKwlteSAkaGVhZCA9IGdpdF9nZXRfaGVhZF9oYXNoKCRwcm9qZWN0KTsKKwlpZiAoIWRlZmluZWQgJGhhc2gpIHsKKwkJJGhhc2ggPSAkaGVhZDsKKwl9CisJaWYgKCFkZWZpbmVkICRwYWdlKSB7CisJCSRwYWdlID0gMDsKKwl9CisJbXkgJHJlZnMgPSBnaXRfZ2V0X3JlZmVyZW5jZXMoKTsKKworCW15IEBjb21taXRsaXN0ID0gcGFyc2VfY29tbWl0cygkaGFzaCwgMTAxLCAoMTAwICogJHBhZ2UpKTsKKworCW15ICRwYWdpbmdfbmF2ID0gZm9ybWF0X3BhZ2luZ19uYXYoJ2xvZycsICRoYXNoLCAkaGVhZCwgJHBhZ2UsICgxMDAgKiAoJHBhZ2UrMSkpKTsKKworCWdpdF9oZWFkZXJfaHRtbCgpOworCWdpdF9wcmludF9wYWdlX25hdignbG9nJywnJywgJGhhc2gsdW5kZWYsdW5kZWYsICRwYWdpbmdfbmF2KTsKKworCWlmICghQGNvbW1pdGxpc3QpIHsKKwkJbXkgJWNvID0gcGFyc2VfY29tbWl0KCRoYXNoKTsKKworCQlnaXRfcHJpbnRfaGVhZGVyX2Rpdignc3VtbWFyeScsICRwcm9qZWN0KTsKKwkJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX2JvZHlcIj4gTGFzdCBjaGFuZ2UgJGNveydhZ2Vfc3RyaW5nJ30uPGJyLz48YnIvPjwvZGl2PlxuIjsKKwl9CisJbXkgJHRvID0gKCQjY29tbWl0bGlzdCA+PSA5OSkgPyAoOTkpIDogKCQjY29tbWl0bGlzdCk7CisJZm9yIChteSAkaSA9IDA7ICRpIDw9ICR0bzsgJGkrKykgeworCQlteSAlY28gPSAleyRjb21taXRsaXN0WyRpXX07CisJCW5leHQgaWYgISVjbzsKKwkJbXkgJGNvbW1pdCA9ICRjb3snaWQnfTsKKwkJbXkgJHJlZiA9IGZvcm1hdF9yZWZfbWFya2VyKCRyZWZzLCAkY29tbWl0KTsKKwkJbXkgJWFkID0gcGFyc2VfZGF0ZSgkY297J2F1dGhvcl9lcG9jaCd9KTsKKwkJZ2l0X3ByaW50X2hlYWRlcl9kaXYoJ2NvbW1pdCcsCisJCSAgICAgICAgICAgICAgICI8c3BhbiBjbGFzcz1cImFnZVwiPiRjb3snYWdlX3N0cmluZyd9PC9zcGFuPiIgLgorCQkgICAgICAgICAgICAgICBlc2NfaHRtbCgkY297J3RpdGxlJ30pIC4gJHJlZiwKKwkJICAgICAgICAgICAgICAgJGNvbW1pdCk7CisJCXByaW50ICI8ZGl2IGNsYXNzPVwidGl0bGVfdGV4dFwiPlxuIiAuCisJCSAgICAgICI8ZGl2IGNsYXNzPVwibG9nX2xpbmtcIj5cbiIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImNvbW1pdCIsIGhhc2g9PiRjb21taXQpfSwgImNvbW1pdCIpIC4KKwkJICAgICAgIiB8ICIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImNvbW1pdGRpZmYiLCBoYXNoPT4kY29tbWl0KX0sICJjb21taXRkaWZmIikgLgorCQkgICAgICAiIHwgIiAuCisJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4idHJlZSIsIGhhc2g9PiRjb21taXQsIGhhc2hfYmFzZT0+JGNvbW1pdCl9LCAidHJlZSIpIC4KKwkJICAgICAgIjxici8+XG4iIC4KKwkJICAgICAgIjwvZGl2PlxuIiAuCisJCSAgICAgICI8aT4iIC4gZXNjX2h0bWwoJGNveydhdXRob3JfbmFtZSd9KSAuICAiIFskYWR7J3JmYzI4MjInfV08L2k+PGJyLz5cbiIgLgorCQkgICAgICAiPC9kaXY+XG4iOworCisJCXByaW50ICI8ZGl2IGNsYXNzPVwibG9nX2JvZHlcIj5cbiI7CisJCWdpdF9wcmludF9sb2coJGNveydjb21tZW50J30sIC1maW5hbF9lbXB0eV9saW5lPT4gMSk7CisJCXByaW50ICI8L2Rpdj5cbiI7CisJfQorCWlmICgkI2NvbW1pdGxpc3QgPj0gMTAwKSB7CisJCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9uYXZcIj5cbiI7CisJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoLXJlcGxheT0+MSwgcGFnZT0+JHBhZ2UrMSksCisJCQkgICAgICAgLWFjY2Vzc2tleSA9PiAibiIsIC10aXRsZSA9PiAiQWx0LW4ifSwgIm5leHQiKTsKKwkJcHJpbnQgIjwvZGl2PlxuIjsKKwl9CisJZ2l0X2Zvb3Rlcl9odG1sKCk7Cit9CisKK3N1YiBnaXRfY29tbWl0IHsKKwkkaGFzaCB8fD0gJGhhc2hfYmFzZSB8fCAiSEVBRCI7CisJbXkgJWNvID0gcGFyc2VfY29tbWl0KCRoYXNoKTsKKwlpZiAoISVjbykgeworCQlkaWVfZXJyb3IodW5kZWYsICJVbmtub3duIGNvbW1pdCBvYmplY3QiKTsKKwl9CisJbXkgJWFkID0gcGFyc2VfZGF0ZSgkY297J2F1dGhvcl9lcG9jaCd9LCAkY297J2F1dGhvcl90eid9KTsKKwlteSAlY2QgPSBwYXJzZV9kYXRlKCRjb3snY29tbWl0dGVyX2Vwb2NoJ30sICRjb3snY29tbWl0dGVyX3R6J30pOworCisJbXkgJHBhcmVudCAgPSAkY297J3BhcmVudCd9OworCW15ICRwYXJlbnRzID0gJGNveydwYXJlbnRzJ307ICMgbGlzdHJlZgorCisJIyB3ZSBuZWVkIHRvIHByZXBhcmUgJGZvcm1hdHNfbmF2IGJlZm9yZSBhbnkgcGFyYW1ldGVyIG11bmdpbmcKKwlteSAkZm9ybWF0c19uYXY7CisJaWYgKCFkZWZpbmVkICRwYXJlbnQpIHsKKwkJIyAtLXJvb3QgY29tbWl0ZGlmZgorCQkkZm9ybWF0c19uYXYgLj0gJyhpbml0aWFsKSc7CisJfSBlbHNpZiAoQCRwYXJlbnRzID09IDEpIHsKKwkJIyBzaW5nbGUgcGFyZW50IGNvbW1pdAorCQkkZm9ybWF0c19uYXYgLj0KKwkJCScocGFyZW50OiAnIC4KKwkJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iY29tbWl0IiwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgaGFzaD0+JHBhcmVudCl9LAorCQkJICAgICAgICBlc2NfaHRtbChzdWJzdHIoJHBhcmVudCwgMCwgNykpKSAuCisJCQknKSc7CisJfSBlbHNlIHsKKwkJIyBtZXJnZSBjb21taXQKKwkJJGZvcm1hdHNfbmF2IC49CisJCQknKG1lcmdlOiAnIC4KKwkJCWpvaW4oJyAnLCBtYXAgeworCQkJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iY29tbWl0IiwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgIGhhc2g9PiRfKX0sCisJCQkJICAgICAgICBlc2NfaHRtbChzdWJzdHIoJF8sIDAsIDcpKSk7CisJCQl9IEAkcGFyZW50cyApIC4KKwkJCScpJzsKKwl9CisKKwlpZiAoIWRlZmluZWQgJHBhcmVudCkgeworCQkkcGFyZW50ID0gIi0tcm9vdCI7CisJfQorCW15IEBkaWZmdHJlZTsKKwlvcGVuIG15ICRmZCwgIi18IiwgZ2l0X2NtZCgpLCAiZGlmZi10cmVlIiwgJy1yJywgIi0tbm8tY29tbWl0LWlkIiwKKwkJQGRpZmZfb3B0cywKKwkJKEAkcGFyZW50cyA8PSAxID8gJHBhcmVudCA6ICctYycpLAorCQkkaGFzaCwgIi0tIgorCQlvciBkaWVfZXJyb3IodW5kZWYsICJPcGVuIGdpdC1kaWZmLXRyZWUgZmFpbGVkIik7CisJQGRpZmZ0cmVlID0gbWFwIHsgY2hvbXA7ICRfIH0gPCRmZD47CisJY2xvc2UgJGZkIG9yIGRpZV9lcnJvcih1bmRlZiwgIlJlYWRpbmcgZ2l0LWRpZmYtdHJlZSBmYWlsZWQiKTsKKworCSMgbm9uLXRleHR1YWwgaGFzaCBpZCdzIGNhbiBiZSBjYWNoZWQKKwlteSAkZXhwaXJlczsKKwlpZiAoJGhhc2ggPX4gbS9eWzAtOWEtZkEtRl17NDB9JC8pIHsKKwkJJGV4cGlyZXMgPSAiKzFkIjsKKwl9CisJbXkgJHJlZnMgPSBnaXRfZ2V0X3JlZmVyZW5jZXMoKTsKKwlteSAkcmVmID0gZm9ybWF0X3JlZl9tYXJrZXIoJHJlZnMsICRjb3snaWQnfSk7CisKKwlnaXRfaGVhZGVyX2h0bWwodW5kZWYsICRleHBpcmVzKTsKKwlnaXRfcHJpbnRfcGFnZV9uYXYoJ2NvbW1pdCcsICcnLAorCSAgICAgICAgICAgICAgICAgICAkaGFzaCwgJGNveyd0cmVlJ30sICRoYXNoLAorCSAgICAgICAgICAgICAgICAgICAkZm9ybWF0c19uYXYpOworCisJaWYgKGRlZmluZWQgJGNveydwYXJlbnQnfSkgeworCQlnaXRfcHJpbnRfaGVhZGVyX2RpdignY29tbWl0ZGlmZicsIGVzY19odG1sKCRjb3sndGl0bGUnfSkgLiAkcmVmLCAkaGFzaCk7CisJfSBlbHNlIHsKKwkJZ2l0X3ByaW50X2hlYWRlcl9kaXYoJ3RyZWUnLCBlc2NfaHRtbCgkY297J3RpdGxlJ30pIC4gJHJlZiwgJGNveyd0cmVlJ30sICRoYXNoKTsKKwl9CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJ0aXRsZV90ZXh0XCI+XG4iIC4KKwkgICAgICAiPHRhYmxlIGNsYXNzPVwib2JqZWN0X2hlYWRlclwiPlxuIjsKKwlwcmludCAiPHRyPjx0ZD5hdXRob3I8L3RkPjx0ZD4iIC4gZXNjX2h0bWwoJGNveydhdXRob3InfSkgLiAiPC90ZD48L3RyPlxuIi4KKwkgICAgICAiPHRyPiIgLgorCSAgICAgICI8dGQ+PC90ZD48dGQ+ICRhZHsncmZjMjgyMid9IjsKKwlpZiAoJGFkeydob3VyX2xvY2FsJ30gPCA2KSB7CisJCXByaW50ZigiICg8c3BhbiBjbGFzcz1cImF0bmlnaHRcIj4lMDJkOiUwMmQ8L3NwYW4+ICVzKSIsCisJCSAgICAgICAkYWR7J2hvdXJfbG9jYWwnfSwgJGFkeydtaW51dGVfbG9jYWwnfSwgJGFkeyd0el9sb2NhbCd9KTsKKwl9IGVsc2UgeworCQlwcmludGYoIiAoJTAyZDolMDJkICVzKSIsCisJCSAgICAgICAkYWR7J2hvdXJfbG9jYWwnfSwgJGFkeydtaW51dGVfbG9jYWwnfSwgJGFkeyd0el9sb2NhbCd9KTsKKwl9CisJcHJpbnQgIjwvdGQ+IiAuCisJICAgICAgIjwvdHI+XG4iOworCXByaW50ICI8dHI+PHRkPmNvbW1pdHRlcjwvdGQ+PHRkPiIgLiBlc2NfaHRtbCgkY297J2NvbW1pdHRlcid9KSAuICI8L3RkPjwvdHI+XG4iOworCXByaW50ICI8dHI+PHRkPjwvdGQ+PHRkPiAkY2R7J3JmYzI4MjInfSIgLgorCSAgICAgIHNwcmludGYoIiAoJTAyZDolMDJkICVzKSIsICRjZHsnaG91cl9sb2NhbCd9LCAkY2R7J21pbnV0ZV9sb2NhbCd9LCAkY2R7J3R6X2xvY2FsJ30pIC4KKwkgICAgICAiPC90ZD48L3RyPlxuIjsKKwlwcmludCAiPHRyPjx0ZD5jb21taXQ8L3RkPjx0ZCBjbGFzcz1cInNoYTFcIj4kY297J2lkJ308L3RkPjwvdHI+XG4iOworCXByaW50ICI8dHI+IiAuCisJICAgICAgIjx0ZD50cmVlPC90ZD4iIC4KKwkgICAgICAiPHRkIGNsYXNzPVwic2hhMVwiPiIgLgorCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4idHJlZSIsIGhhc2g9PiRjb3sndHJlZSd9LCBoYXNoX2Jhc2U9PiRoYXNoKSwKKwkgICAgICAgICAgICAgICBjbGFzcyA9PiAibGlzdCJ9LCAkY297J3RyZWUnfSkgLgorCSAgICAgICI8L3RkPiIgLgorCSAgICAgICI8dGQgY2xhc3M9XCJsaW5rXCI+IiAuCisJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJ0cmVlIiwgaGFzaD0+JGNveyd0cmVlJ30sIGhhc2hfYmFzZT0+JGhhc2gpfSwKKwkgICAgICAgICAgICAgICJ0cmVlIik7CisJbXkgJHNuYXBzaG90X2xpbmtzID0gZm9ybWF0X3NuYXBzaG90X2xpbmtzKCRoYXNoKTsKKwlpZiAoZGVmaW5lZCAkc25hcHNob3RfbGlua3MpIHsKKwkJcHJpbnQgIiB8ICIgLiAkc25hcHNob3RfbGlua3M7CisJfQorCXByaW50ICI8L3RkPiIgLgorCSAgICAgICI8L3RyPlxuIjsKKworCWZvcmVhY2ggbXkgJHBhciAoQCRwYXJlbnRzKSB7CisJCXByaW50ICI8dHI+IiAuCisJCSAgICAgICI8dGQ+cGFyZW50PC90ZD4iIC4KKwkJICAgICAgIjx0ZCBjbGFzcz1cInNoYTFcIj4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJjb21taXQiLCBoYXNoPT4kcGFyKSwKKwkJICAgICAgICAgICAgICAgY2xhc3MgPT4gImxpc3QifSwgJHBhcikgLgorCQkgICAgICAiPC90ZD4iIC4KKwkJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJjb21taXQiLCBoYXNoPT4kcGFyKX0sICJjb21taXQiKSAuCisJCSAgICAgICIgfCAiIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJjb21taXRkaWZmIiwgaGFzaD0+JGhhc2gsIGhhc2hfcGFyZW50PT4kcGFyKX0sICJkaWZmIikgLgorCQkgICAgICAiPC90ZD4iIC4KKwkJICAgICAgIjwvdHI+XG4iOworCX0KKwlwcmludCAiPC90YWJsZT4iLgorCSAgICAgICI8L2Rpdj5cbiI7CisKKwlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfYm9keVwiPlxuIjsKKwlnaXRfcHJpbnRfbG9nKCRjb3snY29tbWVudCd9KTsKKwlwcmludCAiPC9kaXY+XG4iOworCisJZ2l0X2RpZmZ0cmVlX2JvZHkoXEBkaWZmdHJlZSwgJGhhc2gsIEAkcGFyZW50cyk7CisKKwlnaXRfZm9vdGVyX2h0bWwoKTsKK30KKworc3ViIGdpdF9vYmplY3QgeworCSMgb2JqZWN0IGlzIGRlZmluZWQgYnk6CisJIyAtIGhhc2ggb3IgaGFzaF9iYXNlIGFsb25lCisJIyAtIGhhc2hfYmFzZSBhbmQgZmlsZV9uYW1lCisJbXkgJHR5cGU7CisKKwkjIC0gaGFzaCBvciBoYXNoX2Jhc2UgYWxvbmUKKwlpZiAoJGhhc2ggfHwgKCRoYXNoX2Jhc2UgJiYgIWRlZmluZWQgJGZpbGVfbmFtZSkpIHsKKwkJbXkgJG9iamVjdF9pZCA9ICRoYXNoIHx8ICRoYXNoX2Jhc2U7CisKKwkJbXkgJGdpdF9jb21tYW5kID0gZ2l0X2NtZF9zdHIoKTsKKwkJb3BlbiBteSAkZmQsICItfCIsICIkZ2l0X2NvbW1hbmQgY2F0LWZpbGUgLXQgJG9iamVjdF9pZCAyPi9kZXYvbnVsbCIKKwkJCW9yIGRpZV9lcnJvcignNDA0IE5vdCBGb3VuZCcsICJPYmplY3QgZG9lcyBub3QgZXhpc3QiKTsKKwkJJHR5cGUgPSA8JGZkPjsKKwkJY2hvbXAgJHR5cGU7CisJCWNsb3NlICRmZAorCQkJb3IgZGllX2Vycm9yKCc0MDQgTm90IEZvdW5kJywgIk9iamVjdCBkb2VzIG5vdCBleGlzdCIpOworCisJIyAtIGhhc2hfYmFzZSBhbmQgZmlsZV9uYW1lCisJfSBlbHNpZiAoJGhhc2hfYmFzZSAmJiBkZWZpbmVkICRmaWxlX25hbWUpIHsKKwkJJGZpbGVfbmFtZSA9fiBzLC8rJCwsOworCisJCXN5c3RlbShnaXRfY21kKCksICJjYXQtZmlsZSIsICctZScsICRoYXNoX2Jhc2UpID09IDAKKwkJCW9yIGRpZV9lcnJvcignNDA0IE5vdCBGb3VuZCcsICJCYXNlIG9iamVjdCBkb2VzIG5vdCBleGlzdCIpOworCisJCSMgaGVyZSBlcnJvcnMgc2hvdWxkIG5vdCBoYXBlbgorCQlvcGVuIG15ICRmZCwgIi18IiwgZ2l0X2NtZCgpLCAibHMtdHJlZSIsICRoYXNoX2Jhc2UsICItLSIsICRmaWxlX25hbWUKKwkJCW9yIGRpZV9lcnJvcih1bmRlZiwgIk9wZW4gZ2l0LWxzLXRyZWUgZmFpbGVkIik7CisJCW15ICRsaW5lID0gPCRmZD47CisJCWNsb3NlICRmZDsKKworCQkjJzEwMDY0NCBibG9iIDBmYTNmM2E2NmZiNmExMzdmNmVjMmMxOTM1MWVkNGQ4MDcwNzBmZmEJcGFuaWMuYycKKwkJdW5sZXNzICgkbGluZSAmJiAkbGluZSA9fiBtL14oWzAtOV0rKSAoLispIChbMC05YS1mQS1GXXs0MH0pXHQvKSB7CisJCQlkaWVfZXJyb3IoJzQwNCBOb3QgRm91bmQnLCAiRmlsZSBvciBkaXJlY3RvcnkgZm9yIGdpdmVuIGJhc2UgZG9lcyBub3QgZXhpc3QiKTsKKwkJfQorCQkkdHlwZSA9ICQyOworCQkkaGFzaCA9ICQzOworCX0gZWxzZSB7CisJCWRpZV9lcnJvcignNDA0IE5vdCBGb3VuZCcsICJOb3QgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGZpbmQgb2JqZWN0Iik7CisJfQorCisJcHJpbnQgJGNnaS0+cmVkaXJlY3QoLXVyaSA9PiBocmVmKGFjdGlvbj0+JHR5cGUsIC1mdWxsPT4xLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoPT4kaGFzaCwgaGFzaF9iYXNlPT4kaGFzaF9iYXNlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU9PiRmaWxlX25hbWUpLAorCSAgICAgICAgICAgICAgICAgICAgIC1zdGF0dXMgPT4gJzMwMiBGb3VuZCcpOworfQorCitzdWIgZ2l0X2Jsb2JkaWZmIHsKKwlteSAkZm9ybWF0ID0gc2hpZnQgfHwgJ2h0bWwnOworCisJbXkgJGZkOworCW15IEBkaWZmdHJlZTsKKwlteSAlZGlmZmluZm87CisJbXkgJGV4cGlyZXM7CisKKwkjIHByZXBhcmluZyAkZmQgYW5kICVkaWZmaW5mbyBmb3IgZ2l0X3BhdGNoc2V0X2JvZHkKKwkjIG5ldyBzdHlsZSBVUkkKKwlpZiAoZGVmaW5lZCAkaGFzaF9iYXNlICYmIGRlZmluZWQgJGhhc2hfcGFyZW50X2Jhc2UpIHsKKwkJaWYgKGRlZmluZWQgJGZpbGVfbmFtZSkgeworCQkJIyByZWFkIHJhdyBvdXRwdXQKKwkJCW9wZW4gJGZkLCAiLXwiLCBnaXRfY21kKCksICJkaWZmLXRyZWUiLCAnLXInLCBAZGlmZl9vcHRzLAorCQkJCSRoYXNoX3BhcmVudF9iYXNlLCAkaGFzaF9iYXNlLAorCQkJCSItLSIsIChkZWZpbmVkICRmaWxlX3BhcmVudCA/ICRmaWxlX3BhcmVudCA6ICgpKSwgJGZpbGVfbmFtZQorCQkJCW9yIGRpZV9lcnJvcih1bmRlZiwgIk9wZW4gZ2l0LWRpZmYtdHJlZSBmYWlsZWQiKTsKKwkJCUBkaWZmdHJlZSA9IG1hcCB7IGNob21wOyAkXyB9IDwkZmQ+OworCQkJY2xvc2UgJGZkCisJCQkJb3IgZGllX2Vycm9yKHVuZGVmLCAiUmVhZGluZyBnaXQtZGlmZi10cmVlIGZhaWxlZCIpOworCQkJQGRpZmZ0cmVlCisJCQkJb3IgZGllX2Vycm9yKCc0MDQgTm90IEZvdW5kJywgIkJsb2IgZGlmZiBub3QgZm91bmQiKTsKKworCQl9IGVsc2lmIChkZWZpbmVkICRoYXNoICYmCisJCSAgICAgICAgICRoYXNoID1+IC9bMC05YS1mQS1GXXs0MH0vKSB7CisJCQkjIHRyeSB0byBmaW5kIGZpbGVuYW1lIGZyb20gJGhhc2gKKworCQkJIyByZWFkIGZpbHRlcmVkIHJhdyBvdXRwdXQKKwkJCW9wZW4gJGZkLCAiLXwiLCBnaXRfY21kKCksICJkaWZmLXRyZWUiLCAnLXInLCBAZGlmZl9vcHRzLAorCQkJCSRoYXNoX3BhcmVudF9iYXNlLCAkaGFzaF9iYXNlLCAiLS0iCisJCQkJb3IgZGllX2Vycm9yKHVuZGVmLCAiT3BlbiBnaXQtZGlmZi10cmVlIGZhaWxlZCIpOworCQkJQGRpZmZ0cmVlID0KKwkJCQkjICc6MTAwNjQ0IDEwMDY0NCAwM2IyMTgyNi4uLiAzYjkzZDVlNy4uLiBNCWxzLWZpbGVzLmMnCisJCQkJIyAkaGFzaCA9PSB0b19pZAorCQkJCWdyZXAgeyAvXjpbMC03XXs2fSBbMC03XXs2fSBbMC05YS1mQS1GXXs0MH0gJGhhc2gvIH0KKwkJCQltYXAgeyBjaG9tcDsgJF8gfSA8JGZkPjsKKwkJCWNsb3NlICRmZAorCQkJCW9yIGRpZV9lcnJvcih1bmRlZiwgIlJlYWRpbmcgZ2l0LWRpZmYtdHJlZSBmYWlsZWQiKTsKKwkJCUBkaWZmdHJlZQorCQkJCW9yIGRpZV9lcnJvcignNDA0IE5vdCBGb3VuZCcsICJCbG9iIGRpZmYgbm90IGZvdW5kIik7CisKKwkJfSBlbHNlIHsKKwkJCWRpZV9lcnJvcignNDA0IE5vdCBGb3VuZCcsICJNaXNzaW5nIG9uZSBvZiB0aGUgYmxvYiBkaWZmIHBhcmFtZXRlcnMiKTsKKwkJfQorCisJCWlmIChAZGlmZnRyZWUgPiAxKSB7CisJCQlkaWVfZXJyb3IoJzQwNCBOb3QgRm91bmQnLCAiQW1iaWd1b3VzIGJsb2IgZGlmZiBzcGVjaWZpY2F0aW9uIik7CisJCX0KKworCQklZGlmZmluZm8gPSBwYXJzZV9kaWZmdHJlZV9yYXdfbGluZSgkZGlmZnRyZWVbMF0pOworCQkkZmlsZV9wYXJlbnQgfHw9ICRkaWZmaW5mb3snZnJvbV9maWxlJ30gfHwgJGZpbGVfbmFtZTsKKwkJJGZpbGVfbmFtZSAgIHx8PSAkZGlmZmluZm97J3RvX2ZpbGUnfTsKKworCQkkaGFzaF9wYXJlbnQgfHw9ICRkaWZmaW5mb3snZnJvbV9pZCd9OworCQkkaGFzaCAgICAgICAgfHw9ICRkaWZmaW5mb3sndG9faWQnfTsKKworCQkjIG5vbi10ZXh0dWFsIGhhc2ggaWQncyBjYW4gYmUgY2FjaGVkCisJCWlmICgkaGFzaF9iYXNlID1+IG0vXlswLTlhLWZBLUZdezQwfSQvICYmCisJCSAgICAkaGFzaF9wYXJlbnRfYmFzZSA9fiBtL15bMC05YS1mQS1GXXs0MH0kLykgeworCQkJJGV4cGlyZXMgPSAnKzFkJzsKKwkJfQorCisJCSMgb3BlbiBwYXRjaCBvdXRwdXQKKwkJb3BlbiAkZmQsICItfCIsIGdpdF9jbWQoKSwgImRpZmYtdHJlZSIsICctcicsIEBkaWZmX29wdHMsCisJCQknLXAnLCAoJGZvcm1hdCBlcSAnaHRtbCcgPyAiLS1mdWxsLWluZGV4IiA6ICgpKSwKKwkJCSRoYXNoX3BhcmVudF9iYXNlLCAkaGFzaF9iYXNlLAorCQkJIi0tIiwgKGRlZmluZWQgJGZpbGVfcGFyZW50ID8gJGZpbGVfcGFyZW50IDogKCkpLCAkZmlsZV9uYW1lCisJCQlvciBkaWVfZXJyb3IodW5kZWYsICJPcGVuIGdpdC1kaWZmLXRyZWUgZmFpbGVkIik7CisJfQorCisJIyBvbGQvbGVnYWN5IHN0eWxlIFVSSQorCWlmICghJWRpZmZpbmZvICYmICMgaWYgbmV3IHN0eWxlIFVSSSBmYWlsZWQKKwkgICAgZGVmaW5lZCAkaGFzaCAmJiBkZWZpbmVkICRoYXNoX3BhcmVudCkgeworCQkjIGZha2UgZ2l0LWRpZmYtdHJlZSByYXcgb3V0cHV0CisJCSRkaWZmaW5mb3snZnJvbV9tb2RlJ30gPSAkZGlmZmluZm97J3RvX21vZGUnfSA9ICJibG9iIjsKKwkJJGRpZmZpbmZveydmcm9tX2lkJ30gPSAkaGFzaF9wYXJlbnQ7CisJCSRkaWZmaW5mb3sndG9faWQnfSAgID0gJGhhc2g7CisJCWlmIChkZWZpbmVkICRmaWxlX25hbWUpIHsKKwkJCWlmIChkZWZpbmVkICRmaWxlX3BhcmVudCkgeworCQkJCSRkaWZmaW5mb3snc3RhdHVzJ30gPSAnMic7CisJCQkJJGRpZmZpbmZveydmcm9tX2ZpbGUnfSA9ICRmaWxlX3BhcmVudDsKKwkJCQkkZGlmZmluZm97J3RvX2ZpbGUnfSAgID0gJGZpbGVfbmFtZTsKKwkJCX0gZWxzZSB7ICMgYXNzdW1lIG5vdCByZW5hbWVkCisJCQkJJGRpZmZpbmZveydzdGF0dXMnfSA9ICcxJzsKKwkJCQkkZGlmZmluZm97J2Zyb21fZmlsZSd9ID0gJGZpbGVfbmFtZTsKKwkJCQkkZGlmZmluZm97J3RvX2ZpbGUnfSAgID0gJGZpbGVfbmFtZTsKKwkJCX0KKwkJfSBlbHNlIHsgIyBubyBmaWxlbmFtZSBnaXZlbgorCQkJJGRpZmZpbmZveydzdGF0dXMnfSA9ICcyJzsKKwkJCSRkaWZmaW5mb3snZnJvbV9maWxlJ30gPSAkaGFzaF9wYXJlbnQ7CisJCQkkZGlmZmluZm97J3RvX2ZpbGUnfSAgID0gJGhhc2g7CisJCX0KKworCQkjIG5vbi10ZXh0dWFsIGhhc2ggaWQncyBjYW4gYmUgY2FjaGVkCisJCWlmICgkaGFzaCA9fiBtL15bMC05YS1mQS1GXXs0MH0kLyAmJgorCQkgICAgJGhhc2hfcGFyZW50ID1+IG0vXlswLTlhLWZBLUZdezQwfSQvKSB7CisJCQkkZXhwaXJlcyA9ICcrMWQnOworCQl9CisKKwkJIyBvcGVuIHBhdGNoIG91dHB1dAorCQlvcGVuICRmZCwgIi18IiwgZ2l0X2NtZCgpLCAiZGlmZiIsIEBkaWZmX29wdHMsCisJCQknLXAnLCAoJGZvcm1hdCBlcSAnaHRtbCcgPyAiLS1mdWxsLWluZGV4IiA6ICgpKSwKKwkJCSRoYXNoX3BhcmVudCwgJGhhc2gsICItLSIKKwkJCW9yIGRpZV9lcnJvcih1bmRlZiwgIk9wZW4gZ2l0LWRpZmYgZmFpbGVkIik7CisJfSBlbHNlICB7CisJCWRpZV9lcnJvcignNDA0IE5vdCBGb3VuZCcsICJNaXNzaW5nIG9uZSBvZiB0aGUgYmxvYiBkaWZmIHBhcmFtZXRlcnMiKQorCQkJdW5sZXNzICVkaWZmaW5mbzsKKwl9CisKKwkjIGhlYWRlcgorCWlmICgkZm9ybWF0IGVxICdodG1sJykgeworCQlteSAkZm9ybWF0c19uYXYgPQorCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJibG9iZGlmZl9wbGFpbiIsIC1yZXBsYXk9PjEpfSwKKwkJCSAgICAgICAgInJhdyIpOworCQlnaXRfaGVhZGVyX2h0bWwodW5kZWYsICRleHBpcmVzKTsKKwkJaWYgKGRlZmluZWQgJGhhc2hfYmFzZSAmJiAobXkgJWNvID0gcGFyc2VfY29tbWl0KCRoYXNoX2Jhc2UpKSkgeworCQkJZ2l0X3ByaW50X3BhZ2VfbmF2KCcnLCcnLCAkaGFzaF9iYXNlLCRjb3sndHJlZSd9LCRoYXNoX2Jhc2UsICRmb3JtYXRzX25hdik7CisJCQlnaXRfcHJpbnRfaGVhZGVyX2RpdignY29tbWl0JywgZXNjX2h0bWwoJGNveyd0aXRsZSd9KSwgJGhhc2hfYmFzZSk7CisJCX0gZWxzZSB7CisJCQlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfbmF2XCI+PGJyLz4kZm9ybWF0c19uYXY8YnIvPjwvZGl2PlxuIjsKKwkJCXByaW50ICI8ZGl2IGNsYXNzPVwidGl0bGVcIj4kaGFzaCB2cyAkaGFzaF9wYXJlbnQ8L2Rpdj5cbiI7CisJCX0KKwkJaWYgKGRlZmluZWQgJGZpbGVfbmFtZSkgeworCQkJZ2l0X3ByaW50X3BhZ2VfcGF0aCgkZmlsZV9uYW1lLCAiYmxvYiIsICRoYXNoX2Jhc2UpOworCQl9IGVsc2UgeworCQkJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX3BhdGhcIj48L2Rpdj5cbiI7CisJCX0KKworCX0gZWxzaWYgKCRmb3JtYXQgZXEgJ3BsYWluJykgeworCQlwcmludCAkY2dpLT5oZWFkZXIoCisJCQktdHlwZSA9PiAndGV4dC9wbGFpbicsCisJCQktY2hhcnNldCA9PiAndXRmLTgnLAorCQkJLWV4cGlyZXMgPT4gJGV4cGlyZXMsCisJCQktY29udGVudF9kaXNwb3NpdGlvbiA9PiAnaW5saW5lOyBmaWxlbmFtZT0iJyAuICIkZmlsZV9uYW1lIiAuICcucGF0Y2giJyk7CisKKwkJcHJpbnQgIlgtR2l0LVVybDogIiAuICRjZ2ktPnNlbGZfdXJsKCkgLiAiXG5cbiI7CisKKwl9IGVsc2UgeworCQlkaWVfZXJyb3IodW5kZWYsICJVbmtub3duIGJsb2JkaWZmIGZvcm1hdCIpOworCX0KKworCSMgcGF0Y2gKKwlpZiAoJGZvcm1hdCBlcSAnaHRtbCcpIHsKKwkJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX2JvZHlcIj5cbiI7CisKKwkJZ2l0X3BhdGNoc2V0X2JvZHkoJGZkLCBbIFwlZGlmZmluZm8gXSwgJGhhc2hfYmFzZSwgJGhhc2hfcGFyZW50X2Jhc2UpOworCQljbG9zZSAkZmQ7CisKKwkJcHJpbnQgIjwvZGl2PlxuIjsgIyBjbGFzcz0icGFnZV9ib2R5IgorCQlnaXRfZm9vdGVyX2h0bWwoKTsKKworCX0gZWxzZSB7CisJCXdoaWxlIChteSAkbGluZSA9IDwkZmQ+KSB7CisJCQkkbGluZSA9fiBzIWEvKCRoYXNofCRoYXNoX3BhcmVudCkhJ2EvJy5lc2NfcGF0aCgkZGlmZmluZm97J2Zyb21fZmlsZSd9KSFlZzsKKwkJCSRsaW5lID1+IHMhYi8oJGhhc2h8JGhhc2hfcGFyZW50KSEnYi8nLmVzY19wYXRoKCRkaWZmaW5mb3sndG9fZmlsZSd9KSFlZzsKKworCQkJcHJpbnQgJGxpbmU7CisKKwkJCWxhc3QgaWYgJGxpbmUgPX4gbSFeXCtcK1wrITsKKwkJfQorCQlsb2NhbCAkLyA9IHVuZGVmOworCQlwcmludCA8JGZkPjsKKwkJY2xvc2UgJGZkOworCX0KK30KKworc3ViIGdpdF9ibG9iZGlmZl9wbGFpbiB7CisJZ2l0X2Jsb2JkaWZmKCdwbGFpbicpOworfQorCitzdWIgZ2l0X2NvbW1pdGRpZmYgeworCW15ICRmb3JtYXQgPSBzaGlmdCB8fCAnaHRtbCc7CisJJGhhc2ggfHw9ICRoYXNoX2Jhc2UgfHwgIkhFQUQiOworCW15ICVjbyA9IHBhcnNlX2NvbW1pdCgkaGFzaCk7CisJaWYgKCElY28pIHsKKwkJZGllX2Vycm9yKHVuZGVmLCAiVW5rbm93biBjb21taXQgb2JqZWN0Iik7CisJfQorCisJIyBjaG9vc2UgZm9ybWF0IGZvciBjb21taXRkaWZmIGZvciBtZXJnZQorCWlmICghIGRlZmluZWQgJGhhc2hfcGFyZW50ICYmIEB7JGNveydwYXJlbnRzJ319ID4gMSkgeworCQkkaGFzaF9wYXJlbnQgPSAnLS1jYyc7CisJfQorCSMgd2UgbmVlZCB0byBwcmVwYXJlICRmb3JtYXRzX25hdiBiZWZvcmUgYWxtb3N0IGFueSBwYXJhbWV0ZXIgbXVuZ2luZworCW15ICRmb3JtYXRzX25hdjsKKwlpZiAoJGZvcm1hdCBlcSAnaHRtbCcpIHsKKwkJJGZvcm1hdHNfbmF2ID0KKwkJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iY29tbWl0ZGlmZl9wbGFpbiIsIC1yZXBsYXk9PjEpfSwKKwkJCSAgICAgICAgInJhdyIpOworCisJCWlmIChkZWZpbmVkICRoYXNoX3BhcmVudCAmJgorCQkgICAgJGhhc2hfcGFyZW50IG5lICctYycgJiYgJGhhc2hfcGFyZW50IG5lICctLWNjJykgeworCQkJIyBjb21taXRkaWZmIHdpdGggdHdvIGNvbW1pdHMgZ2l2ZW4KKwkJCW15ICRoYXNoX3BhcmVudF9zaG9ydCA9ICRoYXNoX3BhcmVudDsKKwkJCWlmICgkaGFzaF9wYXJlbnQgPX4gbS9eWzAtOWEtZkEtRl17NDB9JC8pIHsKKwkJCQkkaGFzaF9wYXJlbnRfc2hvcnQgPSBzdWJzdHIoJGhhc2hfcGFyZW50LCAwLCA3KTsKKwkJCX0KKwkJCSRmb3JtYXRzX25hdiAuPQorCQkJCScgKGZyb20nOworCQkJZm9yIChteSAkaSA9IDA7ICRpIDwgQHskY297J3BhcmVudHMnfX07ICRpKyspIHsKKwkJCQlpZiAoJGNveydwYXJlbnRzJ31bJGldIGVxICRoYXNoX3BhcmVudCkgeworCQkJCQkkZm9ybWF0c19uYXYgLj0gJyBwYXJlbnQgJyAuICgkaSsxKTsKKwkJCQkJbGFzdDsKKwkJCQl9CisJCQl9CisJCQkkZm9ybWF0c19uYXYgLj0gJzogJyAuCisJCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJjb21taXRkaWZmIiwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgIGhhc2g9PiRoYXNoX3BhcmVudCl9LAorCQkJCSAgICAgICAgZXNjX2h0bWwoJGhhc2hfcGFyZW50X3Nob3J0KSkgLgorCQkJCScpJzsKKwkJfSBlbHNpZiAoISRjb3sncGFyZW50J30pIHsKKwkJCSMgLS1yb290IGNvbW1pdGRpZmYKKwkJCSRmb3JtYXRzX25hdiAuPSAnIChpbml0aWFsKSc7CisJCX0gZWxzaWYgKHNjYWxhciBAeyRjb3sncGFyZW50cyd9fSA9PSAxKSB7CisJCQkjIHNpbmdsZSBwYXJlbnQgY29tbWl0CisJCQkkZm9ybWF0c19uYXYgLj0KKwkJCQknIChwYXJlbnQ6ICcgLgorCQkJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iY29tbWl0ZGlmZiIsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICBoYXNoPT4kY297J3BhcmVudCd9KX0sCisJCQkJICAgICAgICBlc2NfaHRtbChzdWJzdHIoJGNveydwYXJlbnQnfSwgMCwgNykpKSAuCisJCQkJJyknOworCQl9IGVsc2UgeworCQkJIyBtZXJnZSBjb21taXQKKwkJCWlmICgkaGFzaF9wYXJlbnQgZXEgJy0tY2MnKSB7CisJCQkJJGZvcm1hdHNfbmF2IC49ICcgfCAnIC4KKwkJCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJjb21taXRkaWZmIiwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgICBoYXNoPT4kaGFzaCwgaGFzaF9wYXJlbnQ9PictYycpfSwKKwkJCQkJICAgICAgICAnY29tYmluZWQnKTsKKwkJCX0gZWxzZSB7ICMgJGhhc2hfcGFyZW50IGVxICctYycKKwkJCQkkZm9ybWF0c19uYXYgLj0gJyB8ICcgLgorCQkJCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImNvbW1pdGRpZmYiLAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgIGhhc2g9PiRoYXNoLCBoYXNoX3BhcmVudD0+Jy0tY2MnKX0sCisJCQkJCSAgICAgICAgJ2NvbXBhY3QnKTsKKwkJCX0KKwkJCSRmb3JtYXRzX25hdiAuPQorCQkJCScgKG1lcmdlOiAnIC4KKwkJCQlqb2luKCcgJywgbWFwIHsKKwkJCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJjb21taXRkaWZmIiwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgICBoYXNoPT4kXyl9LAorCQkJCQkgICAgICAgIGVzY19odG1sKHN1YnN0cigkXywgMCwgNykpKTsKKwkJCQl9IEB7JGNveydwYXJlbnRzJ319ICkgLgorCQkJCScpJzsKKwkJfQorCX0KKworCW15ICRoYXNoX3BhcmVudF9wYXJhbSA9ICRoYXNoX3BhcmVudDsKKwlpZiAoIWRlZmluZWQgJGhhc2hfcGFyZW50X3BhcmFtKSB7CisJCSMgLS1jYyBmb3IgbXVsdGlwbGUgcGFyZW50cywgLS1yb290IGZvciBwYXJlbnRsZXNzCisJCSRoYXNoX3BhcmVudF9wYXJhbSA9CisJCQlAeyRjb3sncGFyZW50cyd9fSA+IDEgPyAnLS1jYycgOiAkY297J3BhcmVudCd9IHx8ICctLXJvb3QnOworCX0KKworCSMgcmVhZCBjb21taXRkaWZmCisJbXkgJGZkOworCW15IEBkaWZmdHJlZTsKKwlpZiAoJGZvcm1hdCBlcSAnaHRtbCcpIHsKKwkJb3BlbiAkZmQsICItfCIsIGdpdF9jbWQoKSwgImRpZmYtdHJlZSIsICctcicsIEBkaWZmX29wdHMsCisJCQkiLS1uby1jb21taXQtaWQiLCAiLS1wYXRjaC13aXRoLXJhdyIsICItLWZ1bGwtaW5kZXgiLAorCQkJJGhhc2hfcGFyZW50X3BhcmFtLCAkaGFzaCwgIi0tIgorCQkJb3IgZGllX2Vycm9yKHVuZGVmLCAiT3BlbiBnaXQtZGlmZi10cmVlIGZhaWxlZCIpOworCisJCXdoaWxlIChteSAkbGluZSA9IDwkZmQ+KSB7CisJCQljaG9tcCAkbGluZTsKKwkJCSMgZW1wdHkgbGluZSBlbmRzIHJhdyBwYXJ0IG9mIGRpZmYtdHJlZSBvdXRwdXQKKwkJCWxhc3QgdW5sZXNzICRsaW5lOworCQkJcHVzaCBAZGlmZnRyZWUsIHNjYWxhciBwYXJzZV9kaWZmdHJlZV9yYXdfbGluZSgkbGluZSk7CisJCX0KKworCX0gZWxzaWYgKCRmb3JtYXQgZXEgJ3BsYWluJykgeworCQlvcGVuICRmZCwgIi18IiwgZ2l0X2NtZCgpLCAiZGlmZi10cmVlIiwgJy1yJywgQGRpZmZfb3B0cywKKwkJCSctcCcsICRoYXNoX3BhcmVudF9wYXJhbSwgJGhhc2gsICItLSIKKwkJCW9yIGRpZV9lcnJvcih1bmRlZiwgIk9wZW4gZ2l0LWRpZmYtdHJlZSBmYWlsZWQiKTsKKworCX0gZWxzZSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIlVua25vd24gY29tbWl0ZGlmZiBmb3JtYXQiKTsKKwl9CisKKwkjIG5vbi10ZXh0dWFsIGhhc2ggaWQncyBjYW4gYmUgY2FjaGVkCisJbXkgJGV4cGlyZXM7CisJaWYgKCRoYXNoID1+IG0vXlswLTlhLWZBLUZdezQwfSQvKSB7CisJCSRleHBpcmVzID0gIisxZCI7CisJfQorCisJIyB3cml0ZSBjb21taXQgbWVzc2FnZQorCWlmICgkZm9ybWF0IGVxICdodG1sJykgeworCQlteSAkcmVmcyA9IGdpdF9nZXRfcmVmZXJlbmNlcygpOworCQlteSAkcmVmID0gZm9ybWF0X3JlZl9tYXJrZXIoJHJlZnMsICRjb3snaWQnfSk7CisKKwkJZ2l0X2hlYWRlcl9odG1sKHVuZGVmLCAkZXhwaXJlcyk7CisJCWdpdF9wcmludF9wYWdlX25hdignY29tbWl0ZGlmZicsJycsICRoYXNoLCRjb3sndHJlZSd9LCRoYXNoLCAkZm9ybWF0c19uYXYpOworCQlnaXRfcHJpbnRfaGVhZGVyX2RpdignY29tbWl0JywgZXNjX2h0bWwoJGNveyd0aXRsZSd9KSAuICRyZWYsICRoYXNoKTsKKwkJZ2l0X3ByaW50X2F1dGhvcnNoaXAoXCVjbyk7CisJCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9ib2R5XCI+XG4iOworCQlpZiAoQHskY297J2NvbW1lbnQnfX0gPiAxKSB7CisJCQlwcmludCAiPGRpdiBjbGFzcz1cImxvZ1wiPlxuIjsKKwkJCWdpdF9wcmludF9sb2coJGNveydjb21tZW50J30sIC1maW5hbF9lbXB0eV9saW5lPT4gMSwgLXJlbW92ZV90aXRsZSA9PiAxKTsKKwkJCXByaW50ICI8L2Rpdj5cbiI7ICMgY2xhc3M9ImxvZyIKKwkJfQorCisJfSBlbHNpZiAoJGZvcm1hdCBlcSAncGxhaW4nKSB7CisJCW15ICRyZWZzID0gZ2l0X2dldF9yZWZlcmVuY2VzKCJ0YWdzIik7CisJCW15ICR0YWduYW1lID0gZ2l0X2dldF9yZXZfbmFtZV90YWdzKCRoYXNoKTsKKwkJbXkgJGZpbGVuYW1lID0gYmFzZW5hbWUoJHByb2plY3QpIC4gIi0kaGFzaC5wYXRjaCI7CisKKwkJcHJpbnQgJGNnaS0+aGVhZGVyKAorCQkJLXR5cGUgPT4gJ3RleHQvcGxhaW4nLAorCQkJLWNoYXJzZXQgPT4gJ3V0Zi04JywKKwkJCS1leHBpcmVzID0+ICRleHBpcmVzLAorCQkJLWNvbnRlbnRfZGlzcG9zaXRpb24gPT4gJ2lubGluZTsgZmlsZW5hbWU9IicgLiAiJGZpbGVuYW1lIiAuICciJyk7CisJCW15ICVhZCA9IHBhcnNlX2RhdGUoJGNveydhdXRob3JfZXBvY2gnfSwgJGNveydhdXRob3JfdHonfSk7CisJCXByaW50ICJGcm9tOiAiIC4gdG9fdXRmOCgkY297J2F1dGhvcid9KSAuICJcbiI7CisJCXByaW50ICJEYXRlOiAkYWR7J3JmYzI4MjInfSAoJGFkeyd0el9sb2NhbCd9KVxuIjsKKwkJcHJpbnQgIlN1YmplY3Q6ICIgLiB0b191dGY4KCRjb3sndGl0bGUnfSkgLiAiXG4iOworCisJCXByaW50ICJYLUdpdC1UYWc6ICR0YWduYW1lXG4iIGlmICR0YWduYW1lOworCQlwcmludCAiWC1HaXQtVXJsOiAiIC4gJGNnaS0+c2VsZl91cmwoKSAuICJcblxuIjsKKworCQlmb3JlYWNoIG15ICRsaW5lIChAeyRjb3snY29tbWVudCd9fSkgeworCQkJcHJpbnQgdG9fdXRmOCgkbGluZSkgLiAiXG4iOworCQl9CisJCXByaW50ICItLS1cblxuIjsKKwl9CisKKwkjIHdyaXRlIHBhdGNoCisJaWYgKCRmb3JtYXQgZXEgJ2h0bWwnKSB7CisJCW15ICR1c2VfcGFyZW50cyA9ICFkZWZpbmVkICRoYXNoX3BhcmVudCB8fAorCQkJJGhhc2hfcGFyZW50IGVxICctYycgfHwgJGhhc2hfcGFyZW50IGVxICctLWNjJzsKKwkJZ2l0X2RpZmZ0cmVlX2JvZHkoXEBkaWZmdHJlZSwgJGhhc2gsCisJCSAgICAgICAgICAgICAgICAgICR1c2VfcGFyZW50cyA/IEB7JGNveydwYXJlbnRzJ319IDogJGhhc2hfcGFyZW50KTsKKwkJcHJpbnQgIjxici8+XG4iOworCisJCWdpdF9wYXRjaHNldF9ib2R5KCRmZCwgXEBkaWZmdHJlZSwgJGhhc2gsCisJCSAgICAgICAgICAgICAgICAgICR1c2VfcGFyZW50cyA/IEB7JGNveydwYXJlbnRzJ319IDogJGhhc2hfcGFyZW50KTsKKwkJY2xvc2UgJGZkOworCQlwcmludCAiPC9kaXY+XG4iOyAjIGNsYXNzPSJwYWdlX2JvZHkiCisJCWdpdF9mb290ZXJfaHRtbCgpOworCisJfSBlbHNpZiAoJGZvcm1hdCBlcSAncGxhaW4nKSB7CisJCWxvY2FsICQvID0gdW5kZWY7CisJCXByaW50IDwkZmQ+OworCQljbG9zZSAkZmQKKwkJCW9yIHByaW50ICJSZWFkaW5nIGdpdC1kaWZmLXRyZWUgZmFpbGVkXG4iOworCX0KK30KKworc3ViIGdpdF9jb21taXRkaWZmX3BsYWluIHsKKwlnaXRfY29tbWl0ZGlmZigncGxhaW4nKTsKK30KKworc3ViIGdpdF9oaXN0b3J5IHsKKwlpZiAoIWRlZmluZWQgJGhhc2hfYmFzZSkgeworCQkkaGFzaF9iYXNlID0gZ2l0X2dldF9oZWFkX2hhc2goJHByb2plY3QpOworCX0KKwlpZiAoIWRlZmluZWQgJHBhZ2UpIHsKKwkJJHBhZ2UgPSAwOworCX0KKwlteSAkZnR5cGU7CisJbXkgJWNvID0gcGFyc2VfY29tbWl0KCRoYXNoX2Jhc2UpOworCWlmICghJWNvKSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIlVua25vd24gY29tbWl0IG9iamVjdCIpOworCX0KKworCW15ICRyZWZzID0gZ2l0X2dldF9yZWZlcmVuY2VzKCk7CisJbXkgJGxpbWl0ID0gc3ByaW50ZigiLS1tYXgtY291bnQ9JWkiLCAoMTAwICogKCRwYWdlKzEpKSk7CisKKwlpZiAoIWRlZmluZWQgJGhhc2ggJiYgZGVmaW5lZCAkZmlsZV9uYW1lKSB7CisJCSRoYXNoID0gZ2l0X2dldF9oYXNoX2J5X3BhdGgoJGhhc2hfYmFzZSwgJGZpbGVfbmFtZSk7CisJfQorCWlmIChkZWZpbmVkICRoYXNoKSB7CisJCSRmdHlwZSA9IGdpdF9nZXRfdHlwZSgkaGFzaCk7CisJfQorCisJbXkgQGNvbW1pdGxpc3QgPSBwYXJzZV9jb21taXRzKCRoYXNoX2Jhc2UsIDEwMSwgKDEwMCAqICRwYWdlKSwgJGZpbGVfbmFtZSwgIi0tZnVsbC1oaXN0b3J5Iik7CisKKwlteSAkcGFnaW5nX25hdiA9ICcnOworCWlmICgkcGFnZSA+IDApIHsKKwkJJHBhZ2luZ19uYXYgLj0KKwkJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iaGlzdG9yeSIsIGhhc2g9PiRoYXNoLCBoYXNoX2Jhc2U9PiRoYXNoX2Jhc2UsCisJCQkgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZT0+JGZpbGVfbmFtZSl9LAorCQkJICAgICAgICAiZmlyc3QiKTsKKwkJJHBhZ2luZ19uYXYgLj0gIiAmc2RvdDsgIiAuCisJCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKC1yZXBsYXk9PjEsIHBhZ2U9PiRwYWdlLTEpLAorCQkJICAgICAgICAgLWFjY2Vzc2tleSA9PiAicCIsIC10aXRsZSA9PiAiQWx0LXAifSwgInByZXYiKTsKKwl9IGVsc2UgeworCQkkcGFnaW5nX25hdiAuPSAiZmlyc3QiOworCQkkcGFnaW5nX25hdiAuPSAiICZzZG90OyBwcmV2IjsKKwl9CisJbXkgJG5leHRfbGluayA9ICcnOworCWlmICgkI2NvbW1pdGxpc3QgPj0gMTAwKSB7CisJCSRuZXh0X2xpbmsgPQorCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZigtcmVwbGF5PT4xLCBwYWdlPT4kcGFnZSsxKSwKKwkJCSAgICAgICAgIC1hY2Nlc3NrZXkgPT4gIm4iLCAtdGl0bGUgPT4gIkFsdC1uIn0sICJuZXh0Iik7CisJCSRwYWdpbmdfbmF2IC49ICIgJnNkb3Q7ICRuZXh0X2xpbmsiOworCX0gZWxzZSB7CisJCSRwYWdpbmdfbmF2IC49ICIgJnNkb3Q7IG5leHQiOworCX0KKworCWdpdF9oZWFkZXJfaHRtbCgpOworCWdpdF9wcmludF9wYWdlX25hdignaGlzdG9yeScsJycsICRoYXNoX2Jhc2UsJGNveyd0cmVlJ30sJGhhc2hfYmFzZSwgJHBhZ2luZ19uYXYpOworCWdpdF9wcmludF9oZWFkZXJfZGl2KCdjb21taXQnLCBlc2NfaHRtbCgkY297J3RpdGxlJ30pLCAkaGFzaF9iYXNlKTsKKwlnaXRfcHJpbnRfcGFnZV9wYXRoKCRmaWxlX25hbWUsICRmdHlwZSwgJGhhc2hfYmFzZSk7CisKKwlnaXRfaGlzdG9yeV9ib2R5KFxAY29tbWl0bGlzdCwgMCwgOTksCisJICAgICAgICAgICAgICAgICAkcmVmcywgJGhhc2hfYmFzZSwgJGZ0eXBlLCAkbmV4dF9saW5rKTsKKworCWdpdF9mb290ZXJfaHRtbCgpOworfQorCitzdWIgZ2l0X3NlYXJjaCB7CisJbXkgKCRoYXZlX3NlYXJjaCkgPSBnaXR3ZWJfY2hlY2tfZmVhdHVyZSgnc2VhcmNoJyk7CisJaWYgKCEkaGF2ZV9zZWFyY2gpIHsKKwkJZGllX2Vycm9yKCc0MDMgUGVybWlzc2lvbiBkZW5pZWQnLCAiUGVybWlzc2lvbiBkZW5pZWQiKTsKKwl9CisJaWYgKCFkZWZpbmVkICRzZWFyY2h0ZXh0KSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIlRleHQgZmllbGQgZW1wdHkiKTsKKwl9CisJaWYgKCFkZWZpbmVkICRoYXNoKSB7CisJCSRoYXNoID0gZ2l0X2dldF9oZWFkX2hhc2goJHByb2plY3QpOworCX0KKwlteSAlY28gPSBwYXJzZV9jb21taXQoJGhhc2gpOworCWlmICghJWNvKSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIlVua25vd24gY29tbWl0IG9iamVjdCIpOworCX0KKwlpZiAoIWRlZmluZWQgJHBhZ2UpIHsKKwkJJHBhZ2UgPSAwOworCX0KKworCSRzZWFyY2h0eXBlIHx8PSAnY29tbWl0JzsKKwlpZiAoJHNlYXJjaHR5cGUgZXEgJ3BpY2theGUnKSB7CisJCSMgcGlja2F4ZSBtYXkgdGFrZSBhbGwgcmVzb3VyY2VzIG9mIHlvdXIgYm94IGFuZCBydW4gZm9yIHNldmVyYWwgbWludXRlcworCQkjIHdpdGggZXZlcnkgcXVlcnkgLSBzbyBkZWNpZGUgYnkgeW91cnNlbGYgaG93IHB1YmxpYyB5b3UgbWFrZSB0aGlzIGZlYXR1cmUKKwkJbXkgKCRoYXZlX3BpY2theGUpID0gZ2l0d2ViX2NoZWNrX2ZlYXR1cmUoJ3BpY2theGUnKTsKKwkJaWYgKCEkaGF2ZV9waWNrYXhlKSB7CisJCQlkaWVfZXJyb3IoJzQwMyBQZXJtaXNzaW9uIGRlbmllZCcsICJQZXJtaXNzaW9uIGRlbmllZCIpOworCQl9CisJfQorCWlmICgkc2VhcmNodHlwZSBlcSAnZ3JlcCcpIHsKKwkJbXkgKCRoYXZlX2dyZXApID0gZ2l0d2ViX2NoZWNrX2ZlYXR1cmUoJ2dyZXAnKTsKKwkJaWYgKCEkaGF2ZV9ncmVwKSB7CisJCQlkaWVfZXJyb3IoJzQwMyBQZXJtaXNzaW9uIGRlbmllZCcsICJQZXJtaXNzaW9uIGRlbmllZCIpOworCQl9CisJfQorCisJZ2l0X2hlYWRlcl9odG1sKCk7CisKKwlpZiAoJHNlYXJjaHR5cGUgZXEgJ2NvbW1pdCcgb3IgJHNlYXJjaHR5cGUgZXEgJ2F1dGhvcicgb3IgJHNlYXJjaHR5cGUgZXEgJ2NvbW1pdHRlcicpIHsKKwkJbXkgJGdyZXB0eXBlOworCQlpZiAoJHNlYXJjaHR5cGUgZXEgJ2NvbW1pdCcpIHsKKwkJCSRncmVwdHlwZSA9ICItLWdyZXA9IjsKKwkJfSBlbHNpZiAoJHNlYXJjaHR5cGUgZXEgJ2F1dGhvcicpIHsKKwkJCSRncmVwdHlwZSA9ICItLWF1dGhvcj0iOworCQl9IGVsc2lmICgkc2VhcmNodHlwZSBlcSAnY29tbWl0dGVyJykgeworCQkJJGdyZXB0eXBlID0gIi0tY29tbWl0dGVyPSI7CisJCX0KKwkJJGdyZXB0eXBlIC49ICRzZWFyY2h0ZXh0OworCQlteSBAY29tbWl0bGlzdCA9IHBhcnNlX2NvbW1pdHMoJGhhc2gsIDEwMSwgKDEwMCAqICRwYWdlKSwgdW5kZWYsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZ3JlcHR5cGUsICctLXJlZ2V4cC1pZ25vcmUtY2FzZScsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VhcmNoX3VzZV9yZWdleHAgPyAnLS1leHRlbmRlZC1yZWdleHAnIDogJy0tZml4ZWQtc3RyaW5ncycpOworCisJCW15ICRwYWdpbmdfbmF2ID0gJyc7CisJCWlmICgkcGFnZSA+IDApIHsKKwkJCSRwYWdpbmdfbmF2IC49CisJCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJzZWFyY2giLCBoYXNoPT4kaGFzaCwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaHRleHQ9PiRzZWFyY2h0ZXh0LAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNodHlwZT0+JHNlYXJjaHR5cGUpfSwKKwkJCQkgICAgICAgICJmaXJzdCIpOworCQkJJHBhZ2luZ19uYXYgLj0gIiAmc2RvdDsgIiAuCisJCQkJJGNnaS0+YSh7LWhyZWYgPT4gaHJlZigtcmVwbGF5PT4xLCBwYWdlPT4kcGFnZS0xKSwKKwkJCQkgICAgICAgICAtYWNjZXNza2V5ID0+ICJwIiwgLXRpdGxlID0+ICJBbHQtcCJ9LCAicHJldiIpOworCQl9IGVsc2UgeworCQkJJHBhZ2luZ19uYXYgLj0gImZpcnN0IjsKKwkJCSRwYWdpbmdfbmF2IC49ICIgJnNkb3Q7IHByZXYiOworCQl9CisJCW15ICRuZXh0X2xpbmsgPSAnJzsKKwkJaWYgKCQjY29tbWl0bGlzdCA+PSAxMDApIHsKKwkJCSRuZXh0X2xpbmsgPQorCQkJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoLXJlcGxheT0+MSwgcGFnZT0+JHBhZ2UrMSksCisJCQkJICAgICAgICAgLWFjY2Vzc2tleSA9PiAibiIsIC10aXRsZSA9PiAiQWx0LW4ifSwgIm5leHQiKTsKKwkJCSRwYWdpbmdfbmF2IC49ICIgJnNkb3Q7ICRuZXh0X2xpbmsiOworCQl9IGVsc2UgeworCQkJJHBhZ2luZ19uYXYgLj0gIiAmc2RvdDsgbmV4dCI7CisJCX0KKworCQlpZiAoJCNjb21taXRsaXN0ID49IDEwMCkgeworCQl9CisKKwkJZ2l0X3ByaW50X3BhZ2VfbmF2KCcnLCcnLCAkaGFzaCwkY297J3RyZWUnfSwkaGFzaCwgJHBhZ2luZ19uYXYpOworCQlnaXRfcHJpbnRfaGVhZGVyX2RpdignY29tbWl0JywgZXNjX2h0bWwoJGNveyd0aXRsZSd9KSwgJGhhc2gpOworCQlnaXRfc2VhcmNoX2dyZXBfYm9keShcQGNvbW1pdGxpc3QsIDAsIDk5LCAkbmV4dF9saW5rKTsKKwl9CisKKwlpZiAoJHNlYXJjaHR5cGUgZXEgJ3BpY2theGUnKSB7CisJCWdpdF9wcmludF9wYWdlX25hdignJywnJywgJGhhc2gsJGNveyd0cmVlJ30sJGhhc2gpOworCQlnaXRfcHJpbnRfaGVhZGVyX2RpdignY29tbWl0JywgZXNjX2h0bWwoJGNveyd0aXRsZSd9KSwgJGhhc2gpOworCisJCXByaW50ICI8dGFibGUgY2xhc3M9XCJwaWNrYXhlIHNlYXJjaFwiPlxuIjsKKwkJbXkgJGFsdGVybmF0ZSA9IDE7CisJCSQvID0gIlxuIjsKKwkJb3BlbiBteSAkZmQsICctfCcsIGdpdF9jbWQoKSwgJy0tbm8tcGFnZXInLCAnbG9nJywgQGRpZmZfb3B0cywKKwkJCSctLXByZXR0eT1mb3JtYXQ6JUgnLCAnLS1uby1hYmJyZXYnLCAnLS1yYXcnLCAiLVMkc2VhcmNodGV4dCIsCisJCQkoJHNlYXJjaF91c2VfcmVnZXhwID8gJy0tcGlja2F4ZS1yZWdleCcgOiAoKSk7CisJCXVuZGVmICVjbzsKKwkJbXkgQGZpbGVzOworCQl3aGlsZSAobXkgJGxpbmUgPSA8JGZkPikgeworCQkJY2hvbXAgJGxpbmU7CisJCQluZXh0IHVubGVzcyAkbGluZTsKKworCQkJbXkgJXNldCA9IHBhcnNlX2RpZmZ0cmVlX3Jhd19saW5lKCRsaW5lKTsKKwkJCWlmIChkZWZpbmVkICRzZXR7J2NvbW1pdCd9KSB7CisJCQkJIyBmaW5pc2ggcHJldmlvdXMgY29tbWl0CisJCQkJaWYgKCVjbykgeworCQkJCQlwcmludCAiPC90ZD5cbiIgLgorCQkJCQkgICAgICAiPHRkIGNsYXNzPVwibGlua1wiPiIgLgorCQkJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImNvbW1pdCIsIGhhc2g9PiRjb3snaWQnfSl9LCAiY29tbWl0IikgLgorCQkJCQkgICAgICAiIHwgIiAuCisJCQkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4idHJlZSIsIGhhc2g9PiRjb3sndHJlZSd9LCBoYXNoX2Jhc2U9PiRjb3snaWQnfSl9LCAidHJlZSIpOworCQkJCQlwcmludCAiPC90ZD5cbiIgLgorCQkJCQkgICAgICAiPC90cj5cbiI7CisJCQkJfQorCisJCQkJaWYgKCRhbHRlcm5hdGUpIHsKKwkJCQkJcHJpbnQgIjx0ciBjbGFzcz1cImRhcmtcIj5cbiI7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnQgIjx0ciBjbGFzcz1cImxpZ2h0XCI+XG4iOworCQkJCX0KKwkJCQkkYWx0ZXJuYXRlIF49IDE7CisJCQkJJWNvID0gcGFyc2VfY29tbWl0KCRzZXR7J2NvbW1pdCd9KTsKKwkJCQlteSAkYXV0aG9yID0gY2hvcF9hbmRfZXNjYXBlX3N0cigkY297J2F1dGhvcl9uYW1lJ30sIDE1LCA1KTsKKwkJCQlwcmludCAiPHRkIHRpdGxlPVwiJGNveydhZ2Vfc3RyaW5nX2FnZSd9XCI+PGk+JGNveydhZ2Vfc3RyaW5nX2RhdGUnfTwvaT48L3RkPlxuIiAuCisJCQkJICAgICAgIjx0ZD48aT4kYXV0aG9yPC9pPjwvdGQ+XG4iIC4KKwkJCQkgICAgICAiPHRkPiIgLgorCQkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iY29tbWl0IiwgaGFzaD0+JGNveydpZCd9KSwKKwkJCQkgICAgICAgICAgICAgIC1jbGFzcyA9PiAibGlzdCBzdWJqZWN0In0sCisJCQkJICAgICAgICAgICAgICBjaG9wX2FuZF9lc2NhcGVfc3RyKCRjb3sndGl0bGUnfSwgNTApIC4gIjxici8+Iik7CisJCQl9IGVsc2lmIChkZWZpbmVkICRzZXR7J3RvX2lkJ30pIHsKKwkJCQluZXh0IGlmICgkc2V0eyd0b19pZCd9ID1+IG0vXjB7NDB9JC8pOworCisJCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJibG9iIiwgaGFzaF9iYXNlPT4kY297J2lkJ30sCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoPT4kc2V0eyd0b19pZCd9LCBmaWxlX25hbWU9PiRzZXR7J3RvX2ZpbGUnfSksCisJCQkJICAgICAgICAgICAgICAtY2xhc3MgPT4gImxpc3QifSwKKwkJCQkgICAgICAgICAgICAgICI8c3BhbiBjbGFzcz1cIm1hdGNoXCI+IiAuIGVzY19wYXRoKCRzZXR7J2ZpbGUnfSkgLiAiPC9zcGFuPiIpIC4KKwkJCQkgICAgICAiPGJyLz5cbiI7CisJCQl9CisJCX0KKwkJY2xvc2UgJGZkOworCisJCSMgZmluaXNoIGxhc3QgY29tbWl0ICh3YXJuaW5nOiByZXBldGl0aW9uISkKKwkJaWYgKCVjbykgeworCQkJcHJpbnQgIjwvdGQ+XG4iIC4KKwkJCSAgICAgICI8dGQgY2xhc3M9XCJsaW5rXCI+IiAuCisJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImNvbW1pdCIsIGhhc2g9PiRjb3snaWQnfSl9LCAiY29tbWl0IikgLgorCQkJICAgICAgIiB8ICIgLgorCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gaHJlZihhY3Rpb249PiJ0cmVlIiwgaGFzaD0+JGNveyd0cmVlJ30sIGhhc2hfYmFzZT0+JGNveydpZCd9KX0sICJ0cmVlIik7CisJCQlwcmludCAiPC90ZD5cbiIgLgorCQkJICAgICAgIjwvdHI+XG4iOworCQl9CisKKwkJcHJpbnQgIjwvdGFibGU+XG4iOworCX0KKworCWlmICgkc2VhcmNodHlwZSBlcSAnZ3JlcCcpIHsKKwkJZ2l0X3ByaW50X3BhZ2VfbmF2KCcnLCcnLCAkaGFzaCwkY297J3RyZWUnfSwkaGFzaCk7CisJCWdpdF9wcmludF9oZWFkZXJfZGl2KCdjb21taXQnLCBlc2NfaHRtbCgkY297J3RpdGxlJ30pLCAkaGFzaCk7CisKKwkJcHJpbnQgIjx0YWJsZSBjbGFzcz1cImdyZXBfc2VhcmNoXCI+XG4iOworCQlteSAkYWx0ZXJuYXRlID0gMTsKKwkJbXkgJG1hdGNoZXMgPSAwOworCQkkLyA9ICJcbiI7CisJCW9wZW4gbXkgJGZkLCAiLXwiLCBnaXRfY21kKCksICdncmVwJywgJy1uJywKKwkJCSRzZWFyY2hfdXNlX3JlZ2V4cCA/ICgnLUUnLCAnLWknKSA6ICctRicsCisJCQkkc2VhcmNodGV4dCwgJGNveyd0cmVlJ307CisJCW15ICRsYXN0ZmlsZSA9ICcnOworCQl3aGlsZSAobXkgJGxpbmUgPSA8JGZkPikgeworCQkJY2hvbXAgJGxpbmU7CisJCQlteSAoJGZpbGUsICRsbm8sICRsdGV4dCwgJGJpbmFyeSk7CisJCQlsYXN0IGlmICgkbWF0Y2hlcysrID4gMTAwMCk7CisJCQlpZiAoJGxpbmUgPX4gL15CaW5hcnkgZmlsZSAoLispIG1hdGNoZXMkLykgeworCQkJCSRmaWxlID0gJDE7CisJCQkJJGJpbmFyeSA9IDE7CisJCQl9IGVsc2UgeworCQkJCSh1bmRlZiwgJGZpbGUsICRsbm8sICRsdGV4dCkgPSBzcGxpdCgvOi8sICRsaW5lLCA0KTsKKwkJCX0KKwkJCWlmICgkZmlsZSBuZSAkbGFzdGZpbGUpIHsKKwkJCQkkbGFzdGZpbGUgYW5kIHByaW50ICI8L3RkPjwvdHI+XG4iOworCQkJCWlmICgkYWx0ZXJuYXRlKyspIHsKKwkJCQkJcHJpbnQgIjx0ciBjbGFzcz1cImRhcmtcIj5cbiI7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnQgIjx0ciBjbGFzcz1cImxpZ2h0XCI+XG4iOworCQkJCX0KKwkJCQlwcmludCAiPHRkIGNsYXNzPVwibGlzdFwiPiIuCisJCQkJCSRjZ2ktPmEoey1ocmVmID0+IGhyZWYoYWN0aW9uPT4iYmxvYiIsIGhhc2g9PiRjb3snaGFzaCd9LAorCQkJCQkJCSAgICAgICBmaWxlX25hbWU9PiIkZmlsZSIpLAorCQkJCQkJLWNsYXNzID0+ICJsaXN0In0sIGVzY19wYXRoKCRmaWxlKSk7CisJCQkJcHJpbnQgIjwvdGQ+PHRkPlxuIjsKKwkJCQkkbGFzdGZpbGUgPSAkZmlsZTsKKwkJCX0KKwkJCWlmICgkYmluYXJ5KSB7CisJCQkJcHJpbnQgIjxkaXYgY2xhc3M9XCJiaW5hcnlcIj5CaW5hcnkgZmlsZTwvZGl2PlxuIjsKKwkJCX0gZWxzZSB7CisJCQkJJGx0ZXh0ID0gdW50YWJpZnkoJGx0ZXh0KTsKKwkJCQlpZiAoJGx0ZXh0ID1+IG0vXiguKikoJHNlYXJjaF9yZWdleHApKC4qKSQvaSkgeworCQkJCQkkbHRleHQgPSBlc2NfaHRtbCgkMSwgLW5ic3A9PjEpOworCQkJCQkkbHRleHQgLj0gJzxzcGFuIGNsYXNzPSJtYXRjaCI+JzsKKwkJCQkJJGx0ZXh0IC49IGVzY19odG1sKCQyLCAtbmJzcD0+MSk7CisJCQkJCSRsdGV4dCAuPSAnPC9zcGFuPic7CisJCQkJCSRsdGV4dCAuPSBlc2NfaHRtbCgkMywgLW5ic3A9PjEpOworCQkJCX0gZWxzZSB7CisJCQkJCSRsdGV4dCA9IGVzY19odG1sKCRsdGV4dCwgLW5ic3A9PjEpOworCQkJCX0KKwkJCQlwcmludCAiPGRpdiBjbGFzcz1cInByZVwiPiIgLgorCQkJCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKGFjdGlvbj0+ImJsb2IiLCBoYXNoPT4kY297J2hhc2gnfSwKKwkJCQkJCQkgICAgICAgZmlsZV9uYW1lPT4iJGZpbGUiKS4nI2wnLiRsbm8sCisJCQkJCQktY2xhc3MgPT4gImxpbmVuciJ9LCBzcHJpbnRmKCclNGknLCAkbG5vKSkKKwkJCQkJLiAnICcgLiAgJGx0ZXh0IC4gIjwvZGl2PlxuIjsKKwkJCX0KKwkJfQorCQlpZiAoJGxhc3RmaWxlKSB7CisJCQlwcmludCAiPC90ZD48L3RyPlxuIjsKKwkJCWlmICgkbWF0Y2hlcyA+IDEwMDApIHsKKwkJCQlwcmludCAiPGRpdiBjbGFzcz1cImRpZmYgbm9kaWZmZXJlbmNlc1wiPlRvbyBtYW55IG1hdGNoZXMsIGxpc3RpbmcgdHJpbW1lZDwvZGl2PlxuIjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXByaW50ICI8ZGl2IGNsYXNzPVwiZGlmZiBub2RpZmZlcmVuY2VzXCI+Tm8gbWF0Y2hlcyBmb3VuZDwvZGl2PlxuIjsKKwkJfQorCQljbG9zZSAkZmQ7CisKKwkJcHJpbnQgIjwvdGFibGU+XG4iOworCX0KKwlnaXRfZm9vdGVyX2h0bWwoKTsKK30KKworc3ViIGdpdF9zZWFyY2hfaGVscCB7CisJZ2l0X2hlYWRlcl9odG1sKCk7CisJZ2l0X3ByaW50X3BhZ2VfbmF2KCcnLCcnLCAkaGFzaCwkaGFzaCwkaGFzaCk7CisJcHJpbnQgPDxFT1Q7Cis8cD48c3Ryb25nPlBhdHRlcm48L3N0cm9uZz4gaXMgYnkgZGVmYXVsdCBhIG5vcm1hbCBzdHJpbmcgdGhhdCBpcyBtYXRjaGVkIHByZWNpc2VseSAoYnV0IHdpdGhvdXQKK3JlZ2FyZCB0byBjYXNlLCBleGNlcHQgaW4gdGhlIGNhc2Ugb2YgcGlja2F4ZSkuIEhvd2V2ZXIsIHdoZW4geW91IGNoZWNrIHRoZSA8ZW0+cmU8L2VtPiBjaGVja2JveCwKK3RoZSBwYXR0ZXJuIGVudGVyZWQgaXMgcmVjb2duaXplZCBhcyB0aGUgUE9TSVggZXh0ZW5kZWQKKzxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUmVndWxhcl9leHByZXNzaW9uIj5yZWd1bGFyIGV4cHJlc3Npb248L2E+IChhbHNvIGNhc2UKK2luc2Vuc2l0aXZlKS48L3A+Cis8ZGw+Cis8ZHQ+PGI+Y29tbWl0PC9iPjwvZHQ+Cis8ZGQ+VGhlIGNvbW1pdCBtZXNzYWdlcyBhbmQgYXV0aG9yc2hpcCBpbmZvcm1hdGlvbiB3aWxsIGJlIHNjYW5uZWQgZm9yIHRoZSBnaXZlbiBwYXR0ZXJuLjwvZGQ+CitFT1QKKwlteSAoJGhhdmVfZ3JlcCkgPSBnaXR3ZWJfY2hlY2tfZmVhdHVyZSgnZ3JlcCcpOworCWlmICgkaGF2ZV9ncmVwKSB7CisJCXByaW50IDw8RU9UOworPGR0PjxiPmdyZXA8L2I+PC9kdD4KKzxkZD5BbGwgZmlsZXMgaW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0cmVlIChIRUFEIHVubGVzcyB5b3UgYXJlIGV4cGxpY2l0bHkgYnJvd3NpbmcKKyAgICBhIGRpZmZlcmVudCBvbmUpIGFyZSBzZWFyY2hlZCBmb3IgdGhlIGdpdmVuIHBhdHRlcm4uIE9uIGxhcmdlIHRyZWVzLCB0aGlzIHNlYXJjaCBjYW4gdGFrZQorYSB3aGlsZSBhbmQgcHV0IHNvbWUgc3RyYWluIG9uIHRoZSBzZXJ2ZXIsIHNvIHBsZWFzZSB1c2UgaXQgd2l0aCBzb21lIGNvbnNpZGVyYXRpb24uIE5vdGUgdGhhdAorZHVlIHRvIGdpdC1ncmVwIHBlY3VsaWFyaXR5LCBjdXJyZW50bHkgaWYgcmVnZXhwIG1vZGUgaXMgdHVybmVkIG9mZiwgdGhlIG1hdGNoZXMgYXJlCitjYXNlLXNlbnNpdGl2ZS48L2RkPgorRU9UCisJfQorCXByaW50IDw8RU9UOworPGR0PjxiPmF1dGhvcjwvYj48L2R0PgorPGRkPk5hbWUgYW5kIGUtbWFpbCBvZiB0aGUgY2hhbmdlIGF1dGhvciBhbmQgZGF0ZSBvZiBiaXJ0aCBvZiB0aGUgcGF0Y2ggd2lsbCBiZSBzY2FubmVkIGZvciB0aGUgZ2l2ZW4gcGF0dGVybi48L2RkPgorPGR0PjxiPmNvbW1pdHRlcjwvYj48L2R0PgorPGRkPk5hbWUgYW5kIGUtbWFpbCBvZiB0aGUgY29tbWl0dGVyIGFuZCBkYXRlIG9mIGNvbW1pdCB3aWxsIGJlIHNjYW5uZWQgZm9yIHRoZSBnaXZlbiBwYXR0ZXJuLjwvZGQ+CitFT1QKKwlteSAoJGhhdmVfcGlja2F4ZSkgPSBnaXR3ZWJfY2hlY2tfZmVhdHVyZSgncGlja2F4ZScpOworCWlmICgkaGF2ZV9waWNrYXhlKSB7CisJCXByaW50IDw8RU9UOworPGR0PjxiPnBpY2theGU8L2I+PC9kdD4KKzxkZD5BbGwgY29tbWl0cyB0aGF0IGNhdXNlZCB0aGUgc3RyaW5nIHRvIGFwcGVhciBvciBkaXNhcHBlYXIgZnJvbSBhbnkgZmlsZSAoY2hhbmdlcyB0aGF0CithZGRlZCwgcmVtb3ZlZCBvciAibW9kaWZpZWQiIHRoZSBzdHJpbmcpIHdpbGwgYmUgbGlzdGVkLiBUaGlzIHNlYXJjaCBjYW4gdGFrZSBhIHdoaWxlIGFuZAordGFrZXMgYSBsb3Qgb2Ygc3RyYWluIG9uIHRoZSBzZXJ2ZXIsIHNvIHBsZWFzZSB1c2UgaXQgd2lzZWx5LiBOb3RlIHRoYXQgc2luY2UgeW91IG1heSBiZQoraW50ZXJlc3RlZCBldmVuIGluIGNoYW5nZXMganVzdCBjaGFuZ2luZyB0aGUgY2FzZSBhcyB3ZWxsLCB0aGlzIHNlYXJjaCBpcyBjYXNlIHNlbnNpdGl2ZS48L2RkPgorRU9UCisJfQorCXByaW50ICI8L2RsPlxuIjsKKwlnaXRfZm9vdGVyX2h0bWwoKTsKK30KKworc3ViIGdpdF9zaG9ydGxvZyB7CisJbXkgJGhlYWQgPSBnaXRfZ2V0X2hlYWRfaGFzaCgkcHJvamVjdCk7CisJaWYgKCFkZWZpbmVkICRoYXNoKSB7CisJCSRoYXNoID0gJGhlYWQ7CisJfQorCWlmICghZGVmaW5lZCAkcGFnZSkgeworCQkkcGFnZSA9IDA7CisJfQorCW15ICRyZWZzID0gZ2l0X2dldF9yZWZlcmVuY2VzKCk7CisKKwlteSBAY29tbWl0bGlzdCA9IHBhcnNlX2NvbW1pdHMoJGhhc2gsIDEwMSwgKDEwMCAqICRwYWdlKSk7CisKKwlteSAkcGFnaW5nX25hdiA9IGZvcm1hdF9wYWdpbmdfbmF2KCdzaG9ydGxvZycsICRoYXNoLCAkaGVhZCwgJHBhZ2UsICgxMDAgKiAoJHBhZ2UrMSkpKTsKKwlteSAkbmV4dF9saW5rID0gJyc7CisJaWYgKCQjY29tbWl0bGlzdCA+PSAxMDApIHsKKwkJJG5leHRfbGluayA9CisJCQkkY2dpLT5hKHstaHJlZiA9PiBocmVmKC1yZXBsYXk9PjEsIHBhZ2U9PiRwYWdlKzEpLAorCQkJICAgICAgICAgLWFjY2Vzc2tleSA9PiAibiIsIC10aXRsZSA9PiAiQWx0LW4ifSwgIm5leHQiKTsKKwl9CisKKwlnaXRfaGVhZGVyX2h0bWwoKTsKKwlnaXRfcHJpbnRfcGFnZV9uYXYoJ3Nob3J0bG9nJywnJywgJGhhc2gsJGhhc2gsJGhhc2gsICRwYWdpbmdfbmF2KTsKKwlnaXRfcHJpbnRfaGVhZGVyX2Rpdignc3VtbWFyeScsICRwcm9qZWN0KTsKKworCWdpdF9zaG9ydGxvZ19ib2R5KFxAY29tbWl0bGlzdCwgMCwgOTksICRyZWZzLCAkbmV4dF9saW5rKTsKKworCWdpdF9mb290ZXJfaHRtbCgpOworfQorCisjIyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisjIyBmZWVkcyAoUlNTLCBBdG9tOyBPUE1MKQorCitzdWIgZ2l0X2ZlZWQgeworCW15ICRmb3JtYXQgPSBzaGlmdCB8fCAnYXRvbSc7CisJbXkgKCRoYXZlX2JsYW1lKSA9IGdpdHdlYl9jaGVja19mZWF0dXJlKCdibGFtZScpOworCisJIyBBdG9tOiBodHRwOi8vd3d3LmF0b21lbmFibGVkLm9yZy9kZXZlbG9wZXJzL3N5bmRpY2F0aW9uLworCSMgUlNTOiAgaHR0cDovL3d3dy5ub3Rlc3RpcHMuY29tLzgwMjU2QjNBMDA3RjI2OTIvMS9OQU1PNVA5VVBRCisJaWYgKCRmb3JtYXQgbmUgJ3JzcycgJiYgJGZvcm1hdCBuZSAnYXRvbScpIHsKKwkJZGllX2Vycm9yKHVuZGVmLCAiVW5rbm93biB3ZWIgZmVlZCBmb3JtYXQiKTsKKwl9CisKKwkjIGxvZy9mZWVkIG9mIGN1cnJlbnQgKEhFQUQpIGJyYW5jaCwgbG9nIG9mIGdpdmVuIGJyYW5jaCwgaGlzdG9yeSBvZiBmaWxlL2RpcmVjdG9yeQorCW15ICRoZWFkID0gJGhhc2ggfHwgJ0hFQUQnOworCW15IEBjb21taXRsaXN0ID0gcGFyc2VfY29tbWl0cygkaGVhZCwgMTUwLCAwLCAkZmlsZV9uYW1lKTsKKworCW15ICVsYXRlc3RfY29tbWl0OworCW15ICVsYXRlc3RfZGF0ZTsKKwlteSAkY29udGVudF90eXBlID0gImFwcGxpY2F0aW9uLyRmb3JtYXQreG1sIjsKKwlpZiAoZGVmaW5lZCAkY2dpLT5odHRwKCdIVFRQX0FDQ0VQVCcpICYmCisJCSAkY2dpLT5BY2NlcHQoJ3RleHQveG1sJykgPiAkY2dpLT5BY2NlcHQoJGNvbnRlbnRfdHlwZSkpIHsKKwkJIyBicm93c2VyIChmZWVkIHJlYWRlcikgcHJlZmVycyB0ZXh0L3htbAorCQkkY29udGVudF90eXBlID0gJ3RleHQveG1sJzsKKwl9CisJaWYgKGRlZmluZWQoJGNvbW1pdGxpc3RbMF0pKSB7CisJCSVsYXRlc3RfY29tbWl0ID0gJXskY29tbWl0bGlzdFswXX07CisJCSVsYXRlc3RfZGF0ZSAgID0gcGFyc2VfZGF0ZSgkbGF0ZXN0X2NvbW1pdHsnYXV0aG9yX2Vwb2NoJ30pOworCQlwcmludCAkY2dpLT5oZWFkZXIoCisJCQktdHlwZSA9PiAkY29udGVudF90eXBlLAorCQkJLWNoYXJzZXQgPT4gJ3V0Zi04JywKKwkJCS1sYXN0X21vZGlmaWVkID0+ICRsYXRlc3RfZGF0ZXsncmZjMjgyMid9KTsKKwl9IGVsc2UgeworCQlwcmludCAkY2dpLT5oZWFkZXIoCisJCQktdHlwZSA9PiAkY29udGVudF90eXBlLAorCQkJLWNoYXJzZXQgPT4gJ3V0Zi04Jyk7CisJfQorCisJIyBPcHRpbWl6YXRpb246IHNraXAgZ2VuZXJhdGluZyB0aGUgYm9keSBpZiBjbGllbnQgYXNrcyBvbmx5CisJIyBmb3IgTGFzdC1Nb2RpZmllZCBkYXRlLgorCXJldHVybiBpZiAoJGNnaS0+cmVxdWVzdF9tZXRob2QoKSBlcSAnSEVBRCcpOworCisJIyBoZWFkZXIgdmFyaWFibGVzCisJbXkgJHRpdGxlID0gIiRzaXRlX25hbWUgLSAkcHJvamVjdC8kYWN0aW9uIjsKKwlteSAkZmVlZF90eXBlID0gJ2xvZyc7CisJaWYgKGRlZmluZWQgJGhhc2gpIHsKKwkJJHRpdGxlIC49ICIgLSAnJGhhc2gnIjsKKwkJJGZlZWRfdHlwZSA9ICdicmFuY2ggbG9nJzsKKwkJaWYgKGRlZmluZWQgJGZpbGVfbmFtZSkgeworCQkJJHRpdGxlIC49ICIgOjogJGZpbGVfbmFtZSI7CisJCQkkZmVlZF90eXBlID0gJ2hpc3RvcnknOworCQl9CisJfSBlbHNpZiAoZGVmaW5lZCAkZmlsZV9uYW1lKSB7CisJCSR0aXRsZSAuPSAiIC0gJGZpbGVfbmFtZSI7CisJCSRmZWVkX3R5cGUgPSAnaGlzdG9yeSc7CisJfQorCSR0aXRsZSAuPSAiICRmZWVkX3R5cGUiOworCW15ICRkZXNjciA9IGdpdF9nZXRfcHJvamVjdF9kZXNjcmlwdGlvbigkcHJvamVjdCk7CisJaWYgKGRlZmluZWQgJGRlc2NyKSB7CisJCSRkZXNjciA9IGVzY19odG1sKCRkZXNjcik7CisJfSBlbHNlIHsKKwkJJGRlc2NyID0gIiRwcm9qZWN0ICIgLgorCQkgICAgICAgICAoJGZvcm1hdCBlcSAncnNzJyA/ICdSU1MnIDogJ0F0b20nKSAuCisJCSAgICAgICAgICIgZmVlZCI7CisJfQorCW15ICRvd25lciA9IGdpdF9nZXRfcHJvamVjdF9vd25lcigkcHJvamVjdCk7CisJJG93bmVyID0gZXNjX2h0bWwoJG93bmVyKTsKKworCSNoZWFkZXIKKwlteSAkYWx0X3VybDsKKwlpZiAoZGVmaW5lZCAkZmlsZV9uYW1lKSB7CisJCSRhbHRfdXJsID0gaHJlZigtZnVsbD0+MSwgYWN0aW9uPT4iaGlzdG9yeSIsIGhhc2g9PiRoYXNoLCBmaWxlX25hbWU9PiRmaWxlX25hbWUpOworCX0gZWxzaWYgKGRlZmluZWQgJGhhc2gpIHsKKwkJJGFsdF91cmwgPSBocmVmKC1mdWxsPT4xLCBhY3Rpb249PiJsb2ciLCBoYXNoPT4kaGFzaCk7CisJfSBlbHNlIHsKKwkJJGFsdF91cmwgPSBocmVmKC1mdWxsPT4xLCBhY3Rpb249PiJzdW1tYXJ5Iik7CisJfQorCXByaW50IHFxITw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+XG4hOworCWlmICgkZm9ybWF0IGVxICdyc3MnKSB7CisJCXByaW50IDw8WE1MOworPHJzcyB2ZXJzaW9uPSIyLjAiIHhtbG5zOmNvbnRlbnQ9Imh0dHA6Ly9wdXJsLm9yZy9yc3MvMS4wL21vZHVsZXMvY29udGVudC8iPgorPGNoYW5uZWw+CitYTUwKKwkJcHJpbnQgIjx0aXRsZT4kdGl0bGU8L3RpdGxlPlxuIiAuCisJCSAgICAgICI8bGluaz4kYWx0X3VybDwvbGluaz5cbiIgLgorCQkgICAgICAiPGRlc2NyaXB0aW9uPiRkZXNjcjwvZGVzY3JpcHRpb24+XG4iIC4KKwkJICAgICAgIjxsYW5ndWFnZT5lbjwvbGFuZ3VhZ2U+XG4iOworCX0gZWxzaWYgKCRmb3JtYXQgZXEgJ2F0b20nKSB7CisJCXByaW50IDw8WE1MOworPGZlZWQgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvQXRvbSI+CitYTUwKKwkJcHJpbnQgIjx0aXRsZT4kdGl0bGU8L3RpdGxlPlxuIiAuCisJCSAgICAgICI8c3VidGl0bGU+JGRlc2NyPC9zdWJ0aXRsZT5cbiIgLgorCQkgICAgICAnPGxpbmsgcmVsPSJhbHRlcm5hdGUiIHR5cGU9InRleHQvaHRtbCIgaHJlZj0iJyAuCisJCSAgICAgICRhbHRfdXJsIC4gJyIgLz4nIC4gIlxuIiAuCisJCSAgICAgICc8bGluayByZWw9InNlbGYiIHR5cGU9IicgLiAkY29udGVudF90eXBlIC4gJyIgaHJlZj0iJyAuCisJCSAgICAgICRjZ2ktPnNlbGZfdXJsKCkgLiAnIiAvPicgLiAiXG4iIC4KKwkJICAgICAgIjxpZD4iIC4gaHJlZigtZnVsbD0+MSkgLiAiPC9pZD5cbiIgLgorCQkgICAgICAjIHVzZSBwcm9qZWN0IG93bmVyIGZvciBmZWVkIGF1dGhvcgorCQkgICAgICAiPGF1dGhvcj48bmFtZT4kb3duZXI8L25hbWU+PC9hdXRob3I+XG4iOworCQlpZiAoZGVmaW5lZCAkZmF2aWNvbikgeworCQkJcHJpbnQgIjxpY29uPiIgLiBlc2NfdXJsKCRmYXZpY29uKSAuICI8L2ljb24+XG4iOworCQl9CisJCWlmIChkZWZpbmVkICRsb2dvX3VybCkgeworCQkJIyBub3QgdHdpY2UgYXMgd2lkZSBhcyB0YWxsOiA3MiB4IDI3IHBpeGVscworCQkJcHJpbnQgIjxsb2dvPiIgLiBlc2NfdXJsKCRsb2dvKSAuICI8L2xvZ28+XG4iOworCQl9CisJCWlmICghICVsYXRlc3RfZGF0ZSkgeworCQkJIyBkdW1teSBkYXRlIHRvIGtlZXAgdGhlIGZlZWQgdmFsaWQgdW50aWwgY29tbWl0cyB0cmlja2xlIGluOgorCQkJcHJpbnQgIjx1cGRhdGVkPjE5NzAtMDEtMDFUMDA6MDA6MDBaPC91cGRhdGVkPlxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICI8dXBkYXRlZD4kbGF0ZXN0X2RhdGV7J2lzby04NjAxJ308L3VwZGF0ZWQ+XG4iOworCQl9CisJfQorCisJIyBjb250ZW50cworCWZvciAobXkgJGkgPSAwOyAkaSA8PSAkI2NvbW1pdGxpc3Q7ICRpKyspIHsKKwkJbXkgJWNvID0gJXskY29tbWl0bGlzdFskaV19OworCQlteSAkY29tbWl0ID0gJGNveydpZCd9OworCQkjIHdlIHJlYWQgMTUwLCB3ZSBhbHdheXMgc2hvdyAzMCBhbmQgdGhlIG9uZXMgbW9yZSByZWNlbnQgdGhhbiA0OCBob3VycworCQlpZiAoKCRpID49IDIwKSAmJiAoKHRpbWUgLSAkY297J2F1dGhvcl9lcG9jaCd9KSA+IDQ4KjYwKjYwKSkgeworCQkJbGFzdDsKKwkJfQorCQlteSAlY2QgPSBwYXJzZV9kYXRlKCRjb3snYXV0aG9yX2Vwb2NoJ30pOworCisJCSMgZ2V0IGxpc3Qgb2YgY2hhbmdlZCBmaWxlcworCQlvcGVuIG15ICRmZCwgIi18IiwgZ2l0X2NtZCgpLCAiZGlmZi10cmVlIiwgJy1yJywgQGRpZmZfb3B0cywKKwkJCSRjb3sncGFyZW50J30gfHwgIi0tcm9vdCIsCisJCQkkY297J2lkJ30sICItLSIsIChkZWZpbmVkICRmaWxlX25hbWUgPyAkZmlsZV9uYW1lIDogKCkpCisJCQlvciBuZXh0OworCQlteSBAZGlmZnRyZWUgPSBtYXAgeyBjaG9tcDsgJF8gfSA8JGZkPjsKKwkJY2xvc2UgJGZkCisJCQlvciBuZXh0OworCisJCSMgcHJpbnQgZWxlbWVudCAoZW50cnksIGl0ZW0pCisJCW15ICRjb191cmwgPSBocmVmKC1mdWxsPT4xLCBhY3Rpb249PiJjb21taXRkaWZmIiwgaGFzaD0+JGNvbW1pdCk7CisJCWlmICgkZm9ybWF0IGVxICdyc3MnKSB7CisJCQlwcmludCAiPGl0ZW0+XG4iIC4KKwkJCSAgICAgICI8dGl0bGU+IiAuIGVzY19odG1sKCRjb3sndGl0bGUnfSkgLiAiPC90aXRsZT5cbiIgLgorCQkJICAgICAgIjxhdXRob3I+IiAuIGVzY19odG1sKCRjb3snYXV0aG9yJ30pIC4gIjwvYXV0aG9yPlxuIiAuCisJCQkgICAgICAiPHB1YkRhdGU+JGNkeydyZmMyODIyJ308L3B1YkRhdGU+XG4iIC4KKwkJCSAgICAgICI8Z3VpZCBpc1Blcm1hTGluaz1cInRydWVcIj4kY29fdXJsPC9ndWlkPlxuIiAuCisJCQkgICAgICAiPGxpbms+JGNvX3VybDwvbGluaz5cbiIgLgorCQkJICAgICAgIjxkZXNjcmlwdGlvbj4iIC4gZXNjX2h0bWwoJGNveyd0aXRsZSd9KSAuICI8L2Rlc2NyaXB0aW9uPlxuIiAuCisJCQkgICAgICAiPGNvbnRlbnQ6ZW5jb2RlZD4iIC4KKwkJCSAgICAgICI8IVtDREFUQVtcbiI7CisJCX0gZWxzaWYgKCRmb3JtYXQgZXEgJ2F0b20nKSB7CisJCQlwcmludCAiPGVudHJ5PlxuIiAuCisJCQkgICAgICAiPHRpdGxlIHR5cGU9XCJodG1sXCI+IiAuIGVzY19odG1sKCRjb3sndGl0bGUnfSkgLiAiPC90aXRsZT5cbiIgLgorCQkJICAgICAgIjx1cGRhdGVkPiRjZHsnaXNvLTg2MDEnfTwvdXBkYXRlZD5cbiIgLgorCQkJICAgICAgIjxhdXRob3I+XG4iIC4KKwkJCSAgICAgICIgIDxuYW1lPiIgLiBlc2NfaHRtbCgkY297J2F1dGhvcl9uYW1lJ30pIC4gIjwvbmFtZT5cbiI7CisJCQlpZiAoJGNveydhdXRob3JfZW1haWwnfSkgeworCQkJCXByaW50ICIgIDxlbWFpbD4iIC4gZXNjX2h0bWwoJGNveydhdXRob3JfZW1haWwnfSkgLiAiPC9lbWFpbD5cbiI7CisJCQl9CisJCQlwcmludCAiPC9hdXRob3I+XG4iIC4KKwkJCSAgICAgICMgdXNlIGNvbW1pdHRlciBmb3IgY29udHJpYnV0b3IKKwkJCSAgICAgICI8Y29udHJpYnV0b3I+XG4iIC4KKwkJCSAgICAgICIgIDxuYW1lPiIgLiBlc2NfaHRtbCgkY297J2NvbW1pdHRlcl9uYW1lJ30pIC4gIjwvbmFtZT5cbiI7CisJCQlpZiAoJGNveydjb21taXR0ZXJfZW1haWwnfSkgeworCQkJCXByaW50ICIgIDxlbWFpbD4iIC4gZXNjX2h0bWwoJGNveydjb21taXR0ZXJfZW1haWwnfSkgLiAiPC9lbWFpbD5cbiI7CisJCQl9CisJCQlwcmludCAiPC9jb250cmlidXRvcj5cbiIgLgorCQkJICAgICAgIjxwdWJsaXNoZWQ+JGNkeydpc28tODYwMSd9PC9wdWJsaXNoZWQ+XG4iIC4KKwkJCSAgICAgICI8bGluayByZWw9XCJhbHRlcm5hdGVcIiB0eXBlPVwidGV4dC9odG1sXCIgaHJlZj1cIiRjb191cmxcIiAvPlxuIiAuCisJCQkgICAgICAiPGlkPiRjb191cmw8L2lkPlxuIiAuCisJCQkgICAgICAiPGNvbnRlbnQgdHlwZT1cInhodG1sXCIgeG1sOmJhc2U9XCIiIC4gZXNjX3VybCgkbXlfdXJsKSAuICJcIj5cbiIgLgorCQkJICAgICAgIjxkaXYgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI+XG4iOworCQl9CisJCW15ICRjb21tZW50ID0gJGNveydjb21tZW50J307CisJCXByaW50ICI8cHJlPlxuIjsKKwkJZm9yZWFjaCBteSAkbGluZSAoQCRjb21tZW50KSB7CisJCQkkbGluZSA9IGVzY19odG1sKCRsaW5lKTsKKwkJCXByaW50ICIkbGluZVxuIjsKKwkJfQorCQlwcmludCAiPC9wcmU+PHVsPlxuIjsKKwkJZm9yZWFjaCBteSAkZGlmZnRyZWVfbGluZSAoQGRpZmZ0cmVlKSB7CisJCQlteSAlZGlmZnRyZWUgPSBwYXJzZV9kaWZmdHJlZV9yYXdfbGluZSgkZGlmZnRyZWVfbGluZSk7CisJCQluZXh0IGlmICEkZGlmZnRyZWV7J2Zyb21faWQnfTsKKworCQkJbXkgJGZpbGUgPSAkZGlmZnRyZWV7J2ZpbGUnfSB8fCAkZGlmZnRyZWV7J3RvX2ZpbGUnfTsKKworCQkJcHJpbnQgIjxsaT4iIC4KKwkJCSAgICAgICJbIiAuCisJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiBocmVmKC1mdWxsPT4xLCBhY3Rpb249PiJibG9iZGlmZiIsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2g9PiRkaWZmdHJlZXsndG9faWQnfSwgaGFzaF9wYXJlbnQ9PiRkaWZmdHJlZXsnZnJvbV9pZCd9LAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2Jhc2U9PiRjb3snaWQnfSwgaGFzaF9wYXJlbnRfYmFzZT0+JGNveydwYXJlbnQnfSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4kZmlsZSwgZmlsZV9wYXJlbnQ9PiRkaWZmdHJlZXsnZnJvbV9maWxlJ30pLAorCQkJICAgICAgICAgICAgICAtdGl0bGUgPT4gImRpZmYifSwgJ0QnKTsKKwkJCWlmICgkaGF2ZV9ibGFtZSkgeworCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoLWZ1bGw9PjEsIGFjdGlvbj0+ImJsYW1lIiwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZT0+JGZpbGUsIGhhc2hfYmFzZT0+JGNvbW1pdCksCisJCQkJICAgICAgICAgICAgICAtdGl0bGUgPT4gImJsYW1lIn0sICdCJyk7CisJCQl9CisJCQkjIGlmIHRoaXMgaXMgbm90IGEgZmVlZCBvZiBhIGZpbGUgaGlzdG9yeQorCQkJaWYgKCFkZWZpbmVkICRmaWxlX25hbWUgfHwgJGZpbGVfbmFtZSBuZSAkZmlsZSkgeworCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+IGhyZWYoLWZ1bGw9PjEsIGFjdGlvbj0+Imhpc3RvcnkiLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lPT4kZmlsZSwgaGFzaD0+JGNvbW1pdCksCisJCQkJICAgICAgICAgICAgICAtdGl0bGUgPT4gImhpc3RvcnkifSwgJ0gnKTsKKwkJCX0KKwkJCSRmaWxlID0gZXNjX3BhdGgoJGZpbGUpOworCQkJcHJpbnQgIl0gIi4KKwkJCSAgICAgICIkZmlsZTwvbGk+XG4iOworCQl9CisJCWlmICgkZm9ybWF0IGVxICdyc3MnKSB7CisJCQlwcmludCAiPC91bD5dXT5cbiIgLgorCQkJICAgICAgIjwvY29udGVudDplbmNvZGVkPlxuIiAuCisJCQkgICAgICAiPC9pdGVtPlxuIjsKKwkJfSBlbHNpZiAoJGZvcm1hdCBlcSAnYXRvbScpIHsKKwkJCXByaW50ICI8L3VsPlxuPC9kaXY+XG4iIC4KKwkJCSAgICAgICI8L2NvbnRlbnQ+XG4iIC4KKwkJCSAgICAgICI8L2VudHJ5PlxuIjsKKwkJfQorCX0KKworCSMgZW5kIG9mIGZlZWQKKwlpZiAoJGZvcm1hdCBlcSAncnNzJykgeworCQlwcmludCAiPC9jaGFubmVsPlxuPC9yc3M+XG4iOworCX0JZWxzaWYgKCRmb3JtYXQgZXEgJ2F0b20nKSB7CisJCXByaW50ICI8L2ZlZWQ+XG4iOworCX0KK30KKworc3ViIGdpdF9yc3MgeworCWdpdF9mZWVkKCdyc3MnKTsKK30KKworc3ViIGdpdF9hdG9tIHsKKwlnaXRfZmVlZCgnYXRvbScpOworfQorCitzdWIgZ2l0X29wbWwgeworCW15IEBsaXN0ID0gZ2l0X2dldF9wcm9qZWN0c19saXN0KCk7CisKKwlwcmludCAkY2dpLT5oZWFkZXIoLXR5cGUgPT4gJ3RleHQveG1sJywgLWNoYXJzZXQgPT4gJ3V0Zi04Jyk7CisJcHJpbnQgPDxYTUw7Cis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPG9wbWwgdmVyc2lvbj0iMS4wIj4KKzxoZWFkPgorICA8dGl0bGU+JHNpdGVfbmFtZSBPUE1MIEV4cG9ydDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxvdXRsaW5lIHRleHQ9ImdpdCBSU1MgZmVlZHMiPgorWE1MCisKKwlmb3JlYWNoIG15ICRwciAoQGxpc3QpIHsKKwkJbXkgJXByb2ogPSAlJHByOworCQlteSAkaGVhZCA9IGdpdF9nZXRfaGVhZF9oYXNoKCRwcm9qeydwYXRoJ30pOworCQlpZiAoIWRlZmluZWQgJGhlYWQpIHsKKwkJCW5leHQ7CisJCX0KKwkJJGdpdF9kaXIgPSAiJHByb2plY3Ryb290LyRwcm9qeydwYXRoJ30iOworCQlteSAlY28gPSBwYXJzZV9jb21taXQoJGhlYWQpOworCQlpZiAoISVjbykgeworCQkJbmV4dDsKKwkJfQorCisJCW15ICRwYXRoID0gZXNjX2h0bWwoY2hvcF9zdHIoJHByb2p7J3BhdGgnfSwgMjUsIDUpKTsKKwkJbXkgJHJzcyAgPSAiJG15X3VybD9wPSRwcm9qeydwYXRoJ307YT1yc3MiOworCQlteSAkaHRtbCA9ICIkbXlfdXJsP3A9JHByb2p7J3BhdGgnfTthPXN1bW1hcnkiOworCQlwcmludCAiPG91dGxpbmUgdHlwZT1cInJzc1wiIHRleHQ9XCIkcGF0aFwiIHRpdGxlPVwiJHBhdGhcIiB4bWxVcmw9XCIkcnNzXCIgaHRtbFVybD1cIiRodG1sXCIvPlxuIjsKKwl9CisJcHJpbnQgPDxYTUw7Cis8L291dGxpbmU+Cis8L2JvZHk+Cis8L29wbWw+CitYTUwKK30KZGlmZiAtLWdpdCAiYS9naXR3ZWIvdGVzdC9NXDMwM1wyNDRyY2hlbiIgImIvZ2l0d2ViL3Rlc3QvTVwzMDNcMjQ0cmNoZW4iCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmN2ExZDMKLS0tIC9kZXYvbnVsbAorKysgImIvZ2l0d2ViL3Rlc3QvTVwzMDNcMjQ0cmNoZW4iCkBAIC0wLDAgKzEsMiBAQAorTcOkcmNoZW4KK03kcmNoZW4KZGlmZiAtLWdpdCBhL2dpdHdlYi90ZXN0L2ZpbGUgd2l0aCBzcGFjZXMgYi9naXR3ZWIvdGVzdC9maWxlIHdpdGggc3BhY2VzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMDg1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9naXR3ZWIvdGVzdC9maWxlIHdpdGggc3BhY2VzCkBAIC0wLDAgKzEsNCBAQAorVGhpcworZmlsZW5hbWUKK2NvbnRhaW5zCitzcGFjZXMuCmRpZmYgLS1naXQgYS9naXR3ZWIvdGVzdC9maWxlK3BsdXMrc2lnbiBiL2dpdHdlYi90ZXN0L2ZpbGUrcGx1cytzaWduCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMDUyNzgKLS0tIC9kZXYvbnVsbAorKysgYi9naXR3ZWIvdGVzdC9maWxlK3BsdXMrc2lnbgpAQCAtMCwwICsxLDYgQEAKK1RoaXMKK2ZpbGVuYW1lCitjb250YWlucworKworcGx1cworY2hhcnMuCmRpZmYgLS1naXQgYS9ncmVwLmMgYi9ncmVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY3ZDY3MQotLS0gL2Rldi9udWxsCisrKyBiL2dyZXAuYwpAQCAtMCwwICsxLDU2NSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZ3JlcC5oIgorI2luY2x1ZGUgInhkaWZmLWludGVyZmFjZS5oIgorCit2b2lkIGFwcGVuZF9ncmVwX3BhdHRlcm4oc3RydWN0IGdyZXBfb3B0ICpvcHQsIGNvbnN0IGNoYXIgKnBhdCwKKwkJCSBjb25zdCBjaGFyICpvcmlnaW4sIGludCBubywgZW51bSBncmVwX3BhdF90b2tlbiB0KQoreworCXN0cnVjdCBncmVwX3BhdCAqcCA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpwKSk7CisJcC0+cGF0dGVybiA9IHBhdDsKKwlwLT5vcmlnaW4gPSBvcmlnaW47CisJcC0+bm8gPSBubzsKKwlwLT50b2tlbiA9IHQ7CisJKm9wdC0+cGF0dGVybl90YWlsID0gcDsKKwlvcHQtPnBhdHRlcm5fdGFpbCA9ICZwLT5uZXh0OworCXAtPm5leHQgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBjb21waWxlX3JlZ2V4cChzdHJ1Y3QgZ3JlcF9wYXQgKnAsIHN0cnVjdCBncmVwX29wdCAqb3B0KQoreworCWludCBlcnIgPSByZWdjb21wKCZwLT5yZWdleHAsIHAtPnBhdHRlcm4sIG9wdC0+cmVnZmxhZ3MpOworCWlmIChlcnIpIHsKKwkJY2hhciBlcnJidWZbMTAyNF07CisJCWNoYXIgd2hlcmVbMTAyNF07CisJCWlmIChwLT5ubykKKwkJCXNwcmludGYod2hlcmUsICJJbiAnJXMnIGF0ICVkLCAiLAorCQkJCXAtPm9yaWdpbiwgcC0+bm8pOworCQllbHNlIGlmIChwLT5vcmlnaW4pCisJCQlzcHJpbnRmKHdoZXJlLCAiJXMsICIsIHAtPm9yaWdpbik7CisJCWVsc2UKKwkJCXdoZXJlWzBdID0gMDsKKwkJcmVnZXJyb3IoZXJyLCAmcC0+cmVnZXhwLCBlcnJidWYsIDEwMjQpOworCQlyZWdmcmVlKCZwLT5yZWdleHApOworCQlkaWUoIiVzJyVzJzogJXMiLCB3aGVyZSwgcC0+cGF0dGVybiwgZXJyYnVmKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3JlcF9leHByICpjb21waWxlX3BhdHRlcm5fb3Ioc3RydWN0IGdyZXBfcGF0ICoqKTsKK3N0YXRpYyBzdHJ1Y3QgZ3JlcF9leHByICpjb21waWxlX3BhdHRlcm5fYXRvbShzdHJ1Y3QgZ3JlcF9wYXQgKipsaXN0KQoreworCXN0cnVjdCBncmVwX3BhdCAqcDsKKwlzdHJ1Y3QgZ3JlcF9leHByICp4OworCisJcCA9ICpsaXN0OworCXN3aXRjaCAocC0+dG9rZW4pIHsKKwljYXNlIEdSRVBfUEFUVEVSTjogLyogYXRvbSAqLworCWNhc2UgR1JFUF9QQVRURVJOX0hFQUQ6CisJY2FzZSBHUkVQX1BBVFRFUk5fQk9EWToKKwkJeCA9IHhjYWxsb2MoMSwgc2l6ZW9mIChzdHJ1Y3QgZ3JlcF9leHByKSk7CisJCXgtPm5vZGUgPSBHUkVQX05PREVfQVRPTTsKKwkJeC0+dS5hdG9tID0gcDsKKwkJKmxpc3QgPSBwLT5uZXh0OworCQlyZXR1cm4geDsKKwljYXNlIEdSRVBfT1BFTl9QQVJFTjoKKwkJKmxpc3QgPSBwLT5uZXh0OworCQl4ID0gY29tcGlsZV9wYXR0ZXJuX29yKGxpc3QpOworCQlpZiAoIXgpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKCEqbGlzdCB8fCAoKmxpc3QpLT50b2tlbiAhPSBHUkVQX0NMT1NFX1BBUkVOKQorCQkJZGllKCJ1bm1hdGNoZWQgcGFyZW50aGVzaXMiKTsKKwkJKmxpc3QgPSAoKmxpc3QpLT5uZXh0OworCQlyZXR1cm4geDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3JlcF9leHByICpjb21waWxlX3BhdHRlcm5fbm90KHN0cnVjdCBncmVwX3BhdCAqKmxpc3QpCit7CisJc3RydWN0IGdyZXBfcGF0ICpwOworCXN0cnVjdCBncmVwX2V4cHIgKng7CisKKwlwID0gKmxpc3Q7CisJc3dpdGNoIChwLT50b2tlbikgeworCWNhc2UgR1JFUF9OT1Q6CisJCWlmICghcC0+bmV4dCkKKwkJCWRpZSgiLS1ub3Qgbm90IGZvbGxvd2VkIGJ5IHBhdHRlcm4gZXhwcmVzc2lvbiIpOworCQkqbGlzdCA9IHAtPm5leHQ7CisJCXggPSB4Y2FsbG9jKDEsIHNpemVvZiAoc3RydWN0IGdyZXBfZXhwcikpOworCQl4LT5ub2RlID0gR1JFUF9OT0RFX05PVDsKKwkJeC0+dS51bmFyeSA9IGNvbXBpbGVfcGF0dGVybl9ub3QobGlzdCk7CisJCWlmICgheC0+dS51bmFyeSkKKwkJCWRpZSgiLS1ub3QgZm9sbG93ZWQgYnkgbm9uIHBhdHRlcm4gZXhwcmVzc2lvbiIpOworCQlyZXR1cm4geDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gY29tcGlsZV9wYXR0ZXJuX2F0b20obGlzdCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGdyZXBfZXhwciAqY29tcGlsZV9wYXR0ZXJuX2FuZChzdHJ1Y3QgZ3JlcF9wYXQgKipsaXN0KQoreworCXN0cnVjdCBncmVwX3BhdCAqcDsKKwlzdHJ1Y3QgZ3JlcF9leHByICp4LCAqeSwgKno7CisKKwl4ID0gY29tcGlsZV9wYXR0ZXJuX25vdChsaXN0KTsKKwlwID0gKmxpc3Q7CisJaWYgKHAgJiYgcC0+dG9rZW4gPT0gR1JFUF9BTkQpIHsKKwkJaWYgKCFwLT5uZXh0KQorCQkJZGllKCItLWFuZCBub3QgZm9sbG93ZWQgYnkgcGF0dGVybiBleHByZXNzaW9uIik7CisJCSpsaXN0ID0gcC0+bmV4dDsKKwkJeSA9IGNvbXBpbGVfcGF0dGVybl9hbmQobGlzdCk7CisJCWlmICgheSkKKwkJCWRpZSgiLS1hbmQgbm90IGZvbGxvd2VkIGJ5IHBhdHRlcm4gZXhwcmVzc2lvbiIpOworCQl6ID0geGNhbGxvYygxLCBzaXplb2YgKHN0cnVjdCBncmVwX2V4cHIpKTsKKwkJei0+bm9kZSA9IEdSRVBfTk9ERV9BTkQ7CisJCXotPnUuYmluYXJ5LmxlZnQgPSB4OworCQl6LT51LmJpbmFyeS5yaWdodCA9IHk7CisJCXJldHVybiB6OworCX0KKwlyZXR1cm4geDsKK30KKworc3RhdGljIHN0cnVjdCBncmVwX2V4cHIgKmNvbXBpbGVfcGF0dGVybl9vcihzdHJ1Y3QgZ3JlcF9wYXQgKipsaXN0KQoreworCXN0cnVjdCBncmVwX3BhdCAqcDsKKwlzdHJ1Y3QgZ3JlcF9leHByICp4LCAqeSwgKno7CisKKwl4ID0gY29tcGlsZV9wYXR0ZXJuX2FuZChsaXN0KTsKKwlwID0gKmxpc3Q7CisJaWYgKHggJiYgcCAmJiBwLT50b2tlbiAhPSBHUkVQX0NMT1NFX1BBUkVOKSB7CisJCXkgPSBjb21waWxlX3BhdHRlcm5fb3IobGlzdCk7CisJCWlmICgheSkKKwkJCWRpZSgibm90IGEgcGF0dGVybiBleHByZXNzaW9uICVzIiwgcC0+cGF0dGVybik7CisJCXogPSB4Y2FsbG9jKDEsIHNpemVvZiAoc3RydWN0IGdyZXBfZXhwcikpOworCQl6LT5ub2RlID0gR1JFUF9OT0RFX09SOworCQl6LT51LmJpbmFyeS5sZWZ0ID0geDsKKwkJei0+dS5iaW5hcnkucmlnaHQgPSB5OworCQlyZXR1cm4gejsKKwl9CisJcmV0dXJuIHg7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3JlcF9leHByICpjb21waWxlX3BhdHRlcm5fZXhwcihzdHJ1Y3QgZ3JlcF9wYXQgKipsaXN0KQoreworCXJldHVybiBjb21waWxlX3BhdHRlcm5fb3IobGlzdCk7Cit9CisKK3ZvaWQgY29tcGlsZV9ncmVwX3BhdHRlcm5zKHN0cnVjdCBncmVwX29wdCAqb3B0KQoreworCXN0cnVjdCBncmVwX3BhdCAqcDsKKworCWlmIChvcHQtPmFsbF9tYXRjaCkKKwkJb3B0LT5leHRlbmRlZCA9IDE7CisKKwlmb3IgKHAgPSBvcHQtPnBhdHRlcm5fbGlzdDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJc3dpdGNoIChwLT50b2tlbikgeworCQljYXNlIEdSRVBfUEFUVEVSTjogLyogYXRvbSAqLworCQljYXNlIEdSRVBfUEFUVEVSTl9IRUFEOgorCQljYXNlIEdSRVBfUEFUVEVSTl9CT0RZOgorCQkJaWYgKCFvcHQtPmZpeGVkKQorCQkJCWNvbXBpbGVfcmVnZXhwKHAsIG9wdCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW9wdC0+ZXh0ZW5kZWQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIW9wdC0+ZXh0ZW5kZWQpCisJCXJldHVybjsKKworCS8qIFRoZW4gYnVuZGxlIHRoZW0gdXAgaW4gYW4gZXhwcmVzc2lvbi4KKwkgKiBBIGNsYXNzaWMgcmVjdXJzaXZlIGRlc2NlbnQgcGFyc2VyIHdvdWxkIGRvLgorCSAqLworCXAgPSBvcHQtPnBhdHRlcm5fbGlzdDsKKwlvcHQtPnBhdHRlcm5fZXhwcmVzc2lvbiA9IGNvbXBpbGVfcGF0dGVybl9leHByKCZwKTsKKwlpZiAocCkKKwkJZGllKCJpbmNvbXBsZXRlIHBhdHRlcm4gZXhwcmVzc2lvbjogJXMiLCBwLT5wYXR0ZXJuKTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9wYXR0ZXJuX2V4cHIoc3RydWN0IGdyZXBfZXhwciAqeCkKK3sKKwlzd2l0Y2ggKHgtPm5vZGUpIHsKKwljYXNlIEdSRVBfTk9ERV9BVE9NOgorCQlicmVhazsKKwljYXNlIEdSRVBfTk9ERV9OT1Q6CisJCWZyZWVfcGF0dGVybl9leHByKHgtPnUudW5hcnkpOworCQlicmVhazsKKwljYXNlIEdSRVBfTk9ERV9BTkQ6CisJY2FzZSBHUkVQX05PREVfT1I6CisJCWZyZWVfcGF0dGVybl9leHByKHgtPnUuYmluYXJ5LmxlZnQpOworCQlmcmVlX3BhdHRlcm5fZXhwcih4LT51LmJpbmFyeS5yaWdodCk7CisJCWJyZWFrOworCX0KKwlmcmVlKHgpOworfQorCit2b2lkIGZyZWVfZ3JlcF9wYXR0ZXJucyhzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCkKK3sKKwlzdHJ1Y3QgZ3JlcF9wYXQgKnAsICpuOworCisJZm9yIChwID0gb3B0LT5wYXR0ZXJuX2xpc3Q7IHA7IHAgPSBuKSB7CisJCW4gPSBwLT5uZXh0OworCQlzd2l0Y2ggKHAtPnRva2VuKSB7CisJCWNhc2UgR1JFUF9QQVRURVJOOiAvKiBhdG9tICovCisJCWNhc2UgR1JFUF9QQVRURVJOX0hFQUQ6CisJCWNhc2UgR1JFUF9QQVRURVJOX0JPRFk6CisJCQlyZWdmcmVlKCZwLT5yZWdleHApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlmcmVlKHApOworCX0KKworCWlmICghb3B0LT5leHRlbmRlZCkKKwkJcmV0dXJuOworCWZyZWVfcGF0dGVybl9leHByKG9wdC0+cGF0dGVybl9leHByZXNzaW9uKTsKK30KKworc3RhdGljIGNoYXIgKmVuZF9vZl9saW5lKGNoYXIgKmNwLCB1bnNpZ25lZCBsb25nICpsZWZ0KQoreworCXVuc2lnbmVkIGxvbmcgbCA9ICpsZWZ0OworCXdoaWxlIChsICYmICpjcCAhPSAnXG4nKSB7CisJCWwtLTsKKwkJY3ArKzsKKwl9CisJKmxlZnQgPSBsOworCXJldHVybiBjcDsKK30KKworc3RhdGljIGludCB3b3JkX2NoYXIoY2hhciBjaCkKK3sKKwlyZXR1cm4gaXNhbG51bShjaCkgfHwgY2ggPT0gJ18nOworfQorCitzdGF0aWMgdm9pZCBzaG93X2xpbmUoc3RydWN0IGdyZXBfb3B0ICpvcHQsIGNvbnN0IGNoYXIgKmJvbCwgY29uc3QgY2hhciAqZW9sLAorCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsbm8sIGNoYXIgc2lnbikKK3sKKwlpZiAob3B0LT5wYXRobmFtZSkKKwkJcHJpbnRmKCIlcyVjIiwgbmFtZSwgc2lnbik7CisJaWYgKG9wdC0+bGluZW51bSkKKwkJcHJpbnRmKCIlZCVjIiwgbG5vLCBzaWduKTsKKwlwcmludGYoIiUuKnNcbiIsIChpbnQpKGVvbC1ib2wpLCBib2wpOworfQorCitzdGF0aWMgaW50IGZpeG1hdGNoKGNvbnN0IGNoYXIgKnBhdHRlcm4sIGNoYXIgKmxpbmUsIHJlZ21hdGNoX3QgKm1hdGNoKQoreworCWNoYXIgKmhpdCA9IHN0cnN0cihsaW5lLCBwYXR0ZXJuKTsKKwlpZiAoIWhpdCkgeworCQltYXRjaC0+cm1fc28gPSBtYXRjaC0+cm1fZW8gPSAtMTsKKwkJcmV0dXJuIFJFR19OT01BVENIOworCX0KKwllbHNlIHsKKwkJbWF0Y2gtPnJtX3NvID0gaGl0IC0gbGluZTsKKwkJbWF0Y2gtPnJtX2VvID0gbWF0Y2gtPnJtX3NvICsgc3RybGVuKHBhdHRlcm4pOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWF0Y2hfb25lX3BhdHRlcm4oc3RydWN0IGdyZXBfb3B0ICpvcHQsIHN0cnVjdCBncmVwX3BhdCAqcCwgY2hhciAqYm9sLCBjaGFyICplb2wsIGVudW0gZ3JlcF9jb250ZXh0IGN0eCkKK3sKKwlpbnQgaGl0ID0gMDsKKwlpbnQgYXRfdHJ1ZV9ib2wgPSAxOworCXJlZ21hdGNoX3QgcG1hdGNoWzEwXTsKKworCWlmICgocC0+dG9rZW4gIT0gR1JFUF9QQVRURVJOKSAmJgorCSAgICAoKHAtPnRva2VuID09IEdSRVBfUEFUVEVSTl9IRUFEKSAhPSAoY3R4ID09IEdSRVBfQ09OVEVYVF9IRUFEKSkpCisJCXJldHVybiAwOworCisgYWdhaW46CisJaWYgKCFvcHQtPmZpeGVkKSB7CisJCXJlZ2V4X3QgKmV4cCA9ICZwLT5yZWdleHA7CisJCWhpdCA9ICFyZWdleGVjKGV4cCwgYm9sLCBBUlJBWV9TSVpFKHBtYXRjaCksCisJCQkgICAgICAgcG1hdGNoLCAwKTsKKwl9CisJZWxzZSB7CisJCWhpdCA9ICFmaXhtYXRjaChwLT5wYXR0ZXJuLCBib2wsIHBtYXRjaCk7CisJfQorCisJaWYgKGhpdCAmJiBvcHQtPndvcmRfcmVnZXhwKSB7CisJCWlmICgocG1hdGNoWzBdLnJtX3NvIDwgMCkgfHwKKwkJICAgIChlb2wgLSBib2wpIDw9IHBtYXRjaFswXS5ybV9zbyB8fAorCQkgICAgKHBtYXRjaFswXS5ybV9lbyA8IDApIHx8CisJCSAgICAoZW9sIC0gYm9sKSA8IHBtYXRjaFswXS5ybV9lbykKKwkJCWRpZSgicmVnZXhwIHJldHVybmVkIG5vbnNlbnNlIik7CisKKwkJLyogTWF0Y2ggYmVnaW5uaW5nIG11c3QgYmUgZWl0aGVyIGJlZ2lubmluZyBvZiB0aGUKKwkJICogbGluZSwgb3IgYXQgd29yZCBib3VuZGFyeSAoaS5lLiB0aGUgbGFzdCBjaGFyIG11c3QKKwkJICogbm90IGJlIGEgd29yZCBjaGFyKS4gIFNpbWlsYXJseSwgbWF0Y2ggZW5kIG11c3QgYmUKKwkJICogZWl0aGVyIGVuZCBvZiB0aGUgbGluZSwgb3IgYXQgd29yZCBib3VuZGFyeQorCQkgKiAoaS5lLiB0aGUgbmV4dCBjaGFyIG11c3Qgbm90IGJlIGEgd29yZCBjaGFyKS4KKwkJICovCisJCWlmICggKChwbWF0Y2hbMF0ucm1fc28gPT0gMCAmJiBhdF90cnVlX2JvbCkgfHwKKwkJICAgICAgIXdvcmRfY2hhcihib2xbcG1hdGNoWzBdLnJtX3NvLTFdKSkgJiYKKwkJICAgICAoKHBtYXRjaFswXS5ybV9lbyA9PSAoZW9sLWJvbCkpIHx8CisJCSAgICAgICF3b3JkX2NoYXIoYm9sW3BtYXRjaFswXS5ybV9lb10pKSApCisJCQk7CisJCWVsc2UKKwkJCWhpdCA9IDA7CisKKwkJaWYgKCFoaXQgJiYgcG1hdGNoWzBdLnJtX3NvICsgYm9sICsgMSA8IGVvbCkgeworCQkJLyogVGhlcmUgY291bGQgYmUgbW9yZSB0aGFuIG9uZSBtYXRjaCBvbiB0aGUKKwkJCSAqIGxpbmUsIGFuZCB0aGUgZmlyc3QgbWF0Y2ggbWlnaHQgbm90IGJlCisJCQkgKiBzdHJpY3Qgd29yZCBtYXRjaC4gIEJ1dCBsYXRlciBvbmVzIGNvdWxkIGJlIQorCQkJICovCisJCQlib2wgPSBwbWF0Y2hbMF0ucm1fc28gKyBib2wgKyAxOworCQkJYXRfdHJ1ZV9ib2wgPSAwOworCQkJZ290byBhZ2FpbjsKKwkJfQorCX0KKwlyZXR1cm4gaGl0OworfQorCitzdGF0aWMgaW50IG1hdGNoX2V4cHJfZXZhbChzdHJ1Y3QgZ3JlcF9vcHQgKm8sCisJCQkgICBzdHJ1Y3QgZ3JlcF9leHByICp4LAorCQkJICAgY2hhciAqYm9sLCBjaGFyICplb2wsCisJCQkgICBlbnVtIGdyZXBfY29udGV4dCBjdHgsCisJCQkgICBpbnQgY29sbGVjdF9oaXRzKQoreworCWludCBoID0gMDsKKworCXN3aXRjaCAoeC0+bm9kZSkgeworCWNhc2UgR1JFUF9OT0RFX0FUT006CisJCWggPSBtYXRjaF9vbmVfcGF0dGVybihvLCB4LT51LmF0b20sIGJvbCwgZW9sLCBjdHgpOworCQlicmVhazsKKwljYXNlIEdSRVBfTk9ERV9OT1Q6CisJCWggPSAhbWF0Y2hfZXhwcl9ldmFsKG8sIHgtPnUudW5hcnksIGJvbCwgZW9sLCBjdHgsIDApOworCQlicmVhazsKKwljYXNlIEdSRVBfTk9ERV9BTkQ6CisJCWlmICghY29sbGVjdF9oaXRzKQorCQkJcmV0dXJuIChtYXRjaF9leHByX2V2YWwobywgeC0+dS5iaW5hcnkubGVmdCwKKwkJCQkJCWJvbCwgZW9sLCBjdHgsIDApICYmCisJCQkJbWF0Y2hfZXhwcl9ldmFsKG8sIHgtPnUuYmluYXJ5LnJpZ2h0LAorCQkJCQkJYm9sLCBlb2wsIGN0eCwgMCkpOworCQloID0gbWF0Y2hfZXhwcl9ldmFsKG8sIHgtPnUuYmluYXJ5LmxlZnQsIGJvbCwgZW9sLCBjdHgsIDApOworCQloICY9IG1hdGNoX2V4cHJfZXZhbChvLCB4LT51LmJpbmFyeS5yaWdodCwgYm9sLCBlb2wsIGN0eCwgMCk7CisJCWJyZWFrOworCWNhc2UgR1JFUF9OT0RFX09SOgorCQlpZiAoIWNvbGxlY3RfaGl0cykKKwkJCXJldHVybiAobWF0Y2hfZXhwcl9ldmFsKG8sIHgtPnUuYmluYXJ5LmxlZnQsCisJCQkJCQlib2wsIGVvbCwgY3R4LCAwKSB8fAorCQkJCW1hdGNoX2V4cHJfZXZhbChvLCB4LT51LmJpbmFyeS5yaWdodCwKKwkJCQkJCWJvbCwgZW9sLCBjdHgsIDApKTsKKwkJaCA9IG1hdGNoX2V4cHJfZXZhbChvLCB4LT51LmJpbmFyeS5sZWZ0LCBib2wsIGVvbCwgY3R4LCAwKTsKKwkJeC0+dS5iaW5hcnkubGVmdC0+aGl0IHw9IGg7CisJCWggfD0gbWF0Y2hfZXhwcl9ldmFsKG8sIHgtPnUuYmluYXJ5LnJpZ2h0LCBib2wsIGVvbCwgY3R4LCAxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGllKCJVbmV4cGVjdGVkIG5vZGUgdHlwZSAoaW50ZXJuYWwgZXJyb3IpICVkXG4iLCB4LT5ub2RlKTsKKwl9CisJaWYgKGNvbGxlY3RfaGl0cykKKwkJeC0+aGl0IHw9IGg7CisJcmV0dXJuIGg7Cit9CisKK3N0YXRpYyBpbnQgbWF0Y2hfZXhwcihzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCwgY2hhciAqYm9sLCBjaGFyICplb2wsCisJCSAgICAgIGVudW0gZ3JlcF9jb250ZXh0IGN0eCwgaW50IGNvbGxlY3RfaGl0cykKK3sKKwlzdHJ1Y3QgZ3JlcF9leHByICp4ID0gb3B0LT5wYXR0ZXJuX2V4cHJlc3Npb247CisJcmV0dXJuIG1hdGNoX2V4cHJfZXZhbChvcHQsIHgsIGJvbCwgZW9sLCBjdHgsIGNvbGxlY3RfaGl0cyk7Cit9CisKK3N0YXRpYyBpbnQgbWF0Y2hfbGluZShzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCwgY2hhciAqYm9sLCBjaGFyICplb2wsCisJCSAgICAgIGVudW0gZ3JlcF9jb250ZXh0IGN0eCwgaW50IGNvbGxlY3RfaGl0cykKK3sKKwlzdHJ1Y3QgZ3JlcF9wYXQgKnA7CisJaWYgKG9wdC0+ZXh0ZW5kZWQpCisJCXJldHVybiBtYXRjaF9leHByKG9wdCwgYm9sLCBlb2wsIGN0eCwgY29sbGVjdF9oaXRzKTsKKworCS8qIHdlIGRvIG5vdCBjYWxsIHdpdGggY29sbGVjdF9oaXRzIHdpdGhvdXQgYmVpbmcgZXh0ZW5kZWQgKi8KKwlmb3IgKHAgPSBvcHQtPnBhdHRlcm5fbGlzdDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJaWYgKG1hdGNoX29uZV9wYXR0ZXJuKG9wdCwgcCwgYm9sLCBlb2wsIGN0eCkpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3JlcF9idWZmZXJfMShzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IGNvbGxlY3RfaGl0cykKK3sKKwljaGFyICpib2wgPSBidWY7CisJdW5zaWduZWQgbG9uZyBsZWZ0ID0gc2l6ZTsKKwl1bnNpZ25lZCBsbm8gPSAxOworCXN0cnVjdCBwcmVfY29udGV4dF9saW5lIHsKKwkJY2hhciAqYm9sOworCQljaGFyICplb2w7CisJfSAqcHJldiA9IE5VTEwsICpwY2w7CisJdW5zaWduZWQgbGFzdF9oaXQgPSAwOworCXVuc2lnbmVkIGxhc3Rfc2hvd24gPSAwOworCWludCBiaW5hcnlfbWF0Y2hfb25seSA9IDA7CisJY29uc3QgY2hhciAqaHVua19tYXJrID0gIiI7CisJdW5zaWduZWQgY291bnQgPSAwOworCWVudW0gZ3JlcF9jb250ZXh0IGN0eCA9IEdSRVBfQ09OVEVYVF9IRUFEOworCisJaWYgKGJ1ZmZlcl9pc19iaW5hcnkoYnVmLCBzaXplKSkgeworCQlzd2l0Y2ggKG9wdC0+YmluYXJ5KSB7CisJCWNhc2UgR1JFUF9CSU5BUllfREVGQVVMVDoKKwkJCWJpbmFyeV9tYXRjaF9vbmx5ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIEdSRVBfQklOQVJZX05PTUFUQ0g6CisJCQlyZXR1cm4gMDsgLyogQXNzdW1lIHVubWF0Y2ggKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAob3B0LT5wcmVfY29udGV4dCkKKwkJcHJldiA9IHhjYWxsb2Mob3B0LT5wcmVfY29udGV4dCwgc2l6ZW9mKCpwcmV2KSk7CisJaWYgKG9wdC0+cHJlX2NvbnRleHQgfHwgb3B0LT5wb3N0X2NvbnRleHQpCisJCWh1bmtfbWFyayA9ICItLVxuIjsKKworCXdoaWxlIChsZWZ0KSB7CisJCWNoYXIgKmVvbCwgY2g7CisJCWludCBoaXQ7CisKKwkJZW9sID0gZW5kX29mX2xpbmUoYm9sLCAmbGVmdCk7CisJCWNoID0gKmVvbDsKKwkJKmVvbCA9IDA7CisKKwkJaWYgKChjdHggPT0gR1JFUF9DT05URVhUX0hFQUQpICYmIChlb2wgPT0gYm9sKSkKKwkJCWN0eCA9IEdSRVBfQ09OVEVYVF9CT0RZOworCisJCWhpdCA9IG1hdGNoX2xpbmUob3B0LCBib2wsIGVvbCwgY3R4LCBjb2xsZWN0X2hpdHMpOworCQkqZW9sID0gY2g7CisKKwkJaWYgKGNvbGxlY3RfaGl0cykKKwkJCWdvdG8gbmV4dF9saW5lOworCisJCS8qICJncmVwIC12IC1lIGZvbyAtZSBibGEiIHNob3VsZCBsaXN0IGxpbmVzCisJCSAqIHRoYXQgZG8gbm90IGhhdmUgZWl0aGVyLCBzbyBpbnZlcnNpb24gc2hvdWxkCisJCSAqIGJlIGRvbmUgb3V0c2lkZS4KKwkJICovCisJCWlmIChvcHQtPmludmVydCkKKwkJCWhpdCA9ICFoaXQ7CisJCWlmIChvcHQtPnVubWF0Y2hfbmFtZV9vbmx5KSB7CisJCQlpZiAoaGl0KQorCQkJCXJldHVybiAwOworCQkJZ290byBuZXh0X2xpbmU7CisJCX0KKwkJaWYgKGhpdCkgeworCQkJY291bnQrKzsKKwkJCWlmIChvcHQtPnN0YXR1c19vbmx5KQorCQkJCXJldHVybiAxOworCQkJaWYgKGJpbmFyeV9tYXRjaF9vbmx5KSB7CisJCQkJcHJpbnRmKCJCaW5hcnkgZmlsZSAlcyBtYXRjaGVzXG4iLCBuYW1lKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWlmIChvcHQtPm5hbWVfb25seSkgeworCQkJCXByaW50ZigiJXNcbiIsIG5hbWUpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJLyogSGl0IGF0IHRoaXMgbGluZS4gIElmIHdlIGhhdmVuJ3Qgc2hvd24gdGhlCisJCQkgKiBwcmUtY29udGV4dCBsaW5lcywgd2Ugd291bGQgbmVlZCB0byBzaG93IHRoZW0uCisJCQkgKiBXaGVuIGFza2VkIHRvIGRvICJjb3VudCIsIHRoaXMgc3RpbGwgc2hvdworCQkJICogdGhlIGNvbnRleHQgd2hpY2ggaXMgbm9uc2Vuc2UsIGJ1dCB0aGUgdXNlcgorCQkJICogZGVzZXJ2ZXMgdG8gZ2V0IHRoYXQgOy0pLgorCQkJICovCisJCQlpZiAob3B0LT5wcmVfY29udGV4dCkgeworCQkJCXVuc2lnbmVkIGZyb207CisJCQkJaWYgKG9wdC0+cHJlX2NvbnRleHQgPCBsbm8pCisJCQkJCWZyb20gPSBsbm8gLSBvcHQtPnByZV9jb250ZXh0OworCQkJCWVsc2UKKwkJCQkJZnJvbSA9IDE7CisJCQkJaWYgKGZyb20gPD0gbGFzdF9zaG93bikKKwkJCQkJZnJvbSA9IGxhc3Rfc2hvd24gKyAxOworCQkJCWlmIChsYXN0X3Nob3duICYmIGZyb20gIT0gbGFzdF9zaG93biArIDEpCisJCQkJCXByaW50ZihodW5rX21hcmspOworCQkJCXdoaWxlIChmcm9tIDwgbG5vKSB7CisJCQkJCXBjbCA9ICZwcmV2W2xuby1mcm9tLTFdOworCQkJCQlzaG93X2xpbmUob3B0LCBwY2wtPmJvbCwgcGNsLT5lb2wsCisJCQkJCQkgIG5hbWUsIGZyb20sICctJyk7CisJCQkJCWZyb20rKzsKKwkJCQl9CisJCQkJbGFzdF9zaG93biA9IGxuby0xOworCQkJfQorCQkJaWYgKGxhc3Rfc2hvd24gJiYgbG5vICE9IGxhc3Rfc2hvd24gKyAxKQorCQkJCXByaW50ZihodW5rX21hcmspOworCQkJaWYgKCFvcHQtPmNvdW50KQorCQkJCXNob3dfbGluZShvcHQsIGJvbCwgZW9sLCBuYW1lLCBsbm8sICc6Jyk7CisJCQlsYXN0X3Nob3duID0gbGFzdF9oaXQgPSBsbm87CisJCX0KKwkJZWxzZSBpZiAobGFzdF9oaXQgJiYKKwkJCSBsbm8gPD0gbGFzdF9oaXQgKyBvcHQtPnBvc3RfY29udGV4dCkgeworCQkJLyogSWYgdGhlIGxhc3QgaGl0IGlzIHdpdGhpbiB0aGUgcG9zdCBjb250ZXh0LAorCQkJICogd2UgbmVlZCB0byBzaG93IHRoaXMgbGluZS4KKwkJCSAqLworCQkJaWYgKGxhc3Rfc2hvd24gJiYgbG5vICE9IGxhc3Rfc2hvd24gKyAxKQorCQkJCXByaW50ZihodW5rX21hcmspOworCQkJc2hvd19saW5lKG9wdCwgYm9sLCBlb2wsIG5hbWUsIGxubywgJy0nKTsKKwkJCWxhc3Rfc2hvd24gPSBsbm87CisJCX0KKwkJaWYgKG9wdC0+cHJlX2NvbnRleHQpIHsKKwkJCW1lbW1vdmUocHJldisxLCBwcmV2LAorCQkJCShvcHQtPnByZV9jb250ZXh0LTEpICogc2l6ZW9mKCpwcmV2KSk7CisJCQlwcmV2LT5ib2wgPSBib2w7CisJCQlwcmV2LT5lb2wgPSBlb2w7CisJCX0KKworCW5leHRfbGluZToKKwkJYm9sID0gZW9sICsgMTsKKwkJaWYgKCFsZWZ0KQorCQkJYnJlYWs7CisJCWxlZnQtLTsKKwkJbG5vKys7CisJfQorCisJZnJlZShwcmV2KTsKKwlpZiAoY29sbGVjdF9oaXRzKQorCQlyZXR1cm4gMDsKKworCWlmIChvcHQtPnN0YXR1c19vbmx5KQorCQlyZXR1cm4gMDsKKwlpZiAob3B0LT51bm1hdGNoX25hbWVfb25seSkgeworCQkvKiBXZSBkaWQgbm90IHNlZSBhbnkgaGl0LCBzbyB3ZSB3YW50IHRvIHNob3cgdGhpcyAqLworCQlwcmludGYoIiVzXG4iLCBuYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogTkVFRFNXT1JLOgorCSAqIFRoZSByZWFsICJncmVwIC1jIGZvbyAqLmMiIGdpdmVzIG1hbnkgImJhci5jOjAiIGxpbmVzLAorCSAqIHdoaWNoIGZlZWxzIG1vc3RseSB1c2VsZXNzIGJ1dCBzb21ldGltZXMgdXNlZnVsLiAgTWF5YmUKKwkgKiBtYWtlIGl0IGFub3RoZXIgb3B0aW9uPyAgRm9yIG5vdyBzdXBwcmVzcyB0aGVtLgorCSAqLworCWlmIChvcHQtPmNvdW50ICYmIGNvdW50KQorCQlwcmludGYoIiVzOiV1XG4iLCBuYW1lLCBjb3VudCk7CisJcmV0dXJuICEhbGFzdF9oaXQ7Cit9CisKK3N0YXRpYyB2b2lkIGNscl9oaXRfbWFya2VyKHN0cnVjdCBncmVwX2V4cHIgKngpCit7CisJLyogQWxsLWhpdCBtYXJrZXJzIGFyZSBtZWFuaW5nZnVsIG9ubHkgYXQgdGhlIHZlcnkgdG9wIGxldmVsCisJICogT1Igbm9kZS4KKwkgKi8KKwl3aGlsZSAoMSkgeworCQl4LT5oaXQgPSAwOworCQlpZiAoeC0+bm9kZSAhPSBHUkVQX05PREVfT1IpCisJCQlyZXR1cm47CisJCXgtPnUuYmluYXJ5LmxlZnQtPmhpdCA9IDA7CisJCXggPSB4LT51LmJpbmFyeS5yaWdodDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY2hrX2hpdF9tYXJrZXIoc3RydWN0IGdyZXBfZXhwciAqeCkKK3sKKwkvKiBUb3AgbGV2ZWwgbm9kZXMgaGF2ZSBoaXQgbWFya2Vycy4gIFNlZSBpZiB0aGV5IGFsbCBhcmUgaGl0cyAqLworCXdoaWxlICgxKSB7CisJCWlmICh4LT5ub2RlICE9IEdSRVBfTk9ERV9PUikKKwkJCXJldHVybiB4LT5oaXQ7CisJCWlmICgheC0+dS5iaW5hcnkubGVmdC0+aGl0KQorCQkJcmV0dXJuIDA7CisJCXggPSB4LT51LmJpbmFyeS5yaWdodDsKKwl9Cit9CisKK2ludCBncmVwX2J1ZmZlcihzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCwgY29uc3QgY2hhciAqbmFtZSwgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJLyoKKwkgKiB3ZSBkbyBub3QgaGF2ZSB0byBkbyB0aGUgdHdvLXBhc3MgZ3JlcCB3aGVuIHdlIGRvIG5vdCBjaGVjaworCSAqIGJ1ZmZlci13aWRlICJhbGwtbWF0Y2giLgorCSAqLworCWlmICghb3B0LT5hbGxfbWF0Y2gpCisJCXJldHVybiBncmVwX2J1ZmZlcl8xKG9wdCwgbmFtZSwgYnVmLCBzaXplLCAwKTsKKworCS8qIE90aGVyd2lzZSB0aGUgdG9wbGV2ZWwgIm9yIiB0ZXJtcyBoaXQgYSBiaXQgZGlmZmVyZW50bHkuCisJICogV2UgZmlyc3QgY2xlYXIgaGl0IG1hcmtlcnMgZnJvbSB0aGVtLgorCSAqLworCWNscl9oaXRfbWFya2VyKG9wdC0+cGF0dGVybl9leHByZXNzaW9uKTsKKwlncmVwX2J1ZmZlcl8xKG9wdCwgbmFtZSwgYnVmLCBzaXplLCAxKTsKKworCWlmICghY2hrX2hpdF9tYXJrZXIob3B0LT5wYXR0ZXJuX2V4cHJlc3Npb24pKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBncmVwX2J1ZmZlcl8xKG9wdCwgbmFtZSwgYnVmLCBzaXplLCAwKTsKK30KZGlmZiAtLWdpdCBhL2dyZXAuaCBiL2dyZXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjUyZGQyCi0tLSAvZGV2L251bGwKKysrIGIvZ3JlcC5oCkBAIC0wLDAgKzEsODEgQEAKKyNpZm5kZWYgR1JFUF9ICisjZGVmaW5lIEdSRVBfSAorCitlbnVtIGdyZXBfcGF0X3Rva2VuIHsKKwlHUkVQX1BBVFRFUk4sCisJR1JFUF9QQVRURVJOX0hFQUQsCisJR1JFUF9QQVRURVJOX0JPRFksCisJR1JFUF9BTkQsCisJR1JFUF9PUEVOX1BBUkVOLAorCUdSRVBfQ0xPU0VfUEFSRU4sCisJR1JFUF9OT1QsCisJR1JFUF9PUiwKK307CisKK2VudW0gZ3JlcF9jb250ZXh0IHsKKwlHUkVQX0NPTlRFWFRfSEVBRCwKKwlHUkVQX0NPTlRFWFRfQk9EWSwKK307CisKK3N0cnVjdCBncmVwX3BhdCB7CisJc3RydWN0IGdyZXBfcGF0ICpuZXh0OworCWNvbnN0IGNoYXIgKm9yaWdpbjsKKwlpbnQgbm87CisJZW51bSBncmVwX3BhdF90b2tlbiB0b2tlbjsKKwljb25zdCBjaGFyICpwYXR0ZXJuOworCXJlZ2V4X3QgcmVnZXhwOworfTsKKworZW51bSBncmVwX2V4cHJfbm9kZSB7CisJR1JFUF9OT0RFX0FUT00sCisJR1JFUF9OT0RFX05PVCwKKwlHUkVQX05PREVfQU5ELAorCUdSRVBfTk9ERV9PUiwKK307CisKK3N0cnVjdCBncmVwX2V4cHIgeworCWVudW0gZ3JlcF9leHByX25vZGUgbm9kZTsKKwl1bnNpZ25lZCBoaXQ7CisJdW5pb24geworCQlzdHJ1Y3QgZ3JlcF9wYXQgKmF0b207CisJCXN0cnVjdCBncmVwX2V4cHIgKnVuYXJ5OworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGdyZXBfZXhwciAqbGVmdDsKKwkJCXN0cnVjdCBncmVwX2V4cHIgKnJpZ2h0OworCQl9IGJpbmFyeTsKKwl9IHU7Cit9OworCitzdHJ1Y3QgZ3JlcF9vcHQgeworCXN0cnVjdCBncmVwX3BhdCAqcGF0dGVybl9saXN0OworCXN0cnVjdCBncmVwX3BhdCAqKnBhdHRlcm5fdGFpbDsKKwlzdHJ1Y3QgZ3JlcF9leHByICpwYXR0ZXJuX2V4cHJlc3Npb247CisJaW50IHByZWZpeF9sZW5ndGg7CisJcmVnZXhfdCByZWdleHA7CisJdW5zaWduZWQgbGluZW51bToxOworCXVuc2lnbmVkIGludmVydDoxOworCXVuc2lnbmVkIHN0YXR1c19vbmx5OjE7CisJdW5zaWduZWQgbmFtZV9vbmx5OjE7CisJdW5zaWduZWQgdW5tYXRjaF9uYW1lX29ubHk6MTsKKwl1bnNpZ25lZCBjb3VudDoxOworCXVuc2lnbmVkIHdvcmRfcmVnZXhwOjE7CisJdW5zaWduZWQgZml4ZWQ6MTsKKwl1bnNpZ25lZCBhbGxfbWF0Y2g6MTsKKyNkZWZpbmUgR1JFUF9CSU5BUllfREVGQVVMVAkwCisjZGVmaW5lIEdSRVBfQklOQVJZX05PTUFUQ0gJMQorI2RlZmluZSBHUkVQX0JJTkFSWV9URVhUCTIKKwl1bnNpZ25lZCBiaW5hcnk6MjsKKwl1bnNpZ25lZCBleHRlbmRlZDoxOworCXVuc2lnbmVkIHJlbGF0aXZlOjE7CisJdW5zaWduZWQgcGF0aG5hbWU6MTsKKwlpbnQgcmVnZmxhZ3M7CisJdW5zaWduZWQgcHJlX2NvbnRleHQ7CisJdW5zaWduZWQgcG9zdF9jb250ZXh0OworfTsKKworZXh0ZXJuIHZvaWQgYXBwZW5kX2dyZXBfcGF0dGVybihzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCwgY29uc3QgY2hhciAqcGF0LCBjb25zdCBjaGFyICpvcmlnaW4sIGludCBubywgZW51bSBncmVwX3BhdF90b2tlbiB0KTsKK2V4dGVybiB2b2lkIGNvbXBpbGVfZ3JlcF9wYXR0ZXJucyhzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCk7CitleHRlcm4gdm9pZCBmcmVlX2dyZXBfcGF0dGVybnMoc3RydWN0IGdyZXBfb3B0ICpvcHQpOworZXh0ZXJuIGludCBncmVwX2J1ZmZlcihzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCwgY29uc3QgY2hhciAqbmFtZSwgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2hhc2gtb2JqZWN0LmMgYi9oYXNoLW9iamVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZTcxNjAKLS0tIC9kZXYvbnVsbAorKysgYi9oYXNoLW9iamVjdC5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKiBDb3B5cmlnaHQgKEMpIEp1bmlvIEMgSGFtYW5vLCAyMDA1CisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImJsb2IuaCIKKworc3RhdGljIHZvaWQgaGFzaF9vYmplY3QoY29uc3QgY2hhciAqcGF0aCwgZW51bSBvYmplY3RfdHlwZSB0eXBlLCBpbnQgd3JpdGVfb2JqZWN0KQoreworCWludCBmZDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCB8fAorCSAgICBmc3RhdChmZCwgJnN0KSA8IDAgfHwKKwkgICAgaW5kZXhfZmQoc2hhMSwgZmQsICZzdCwgd3JpdGVfb2JqZWN0LCB0eXBlLCBwYXRoKSkKKwkJZGllKHdyaXRlX29iamVjdAorCQkgICAgPyAiVW5hYmxlIHRvIGFkZCAlcyB0byBkYXRhYmFzZSIKKwkJICAgIDogIlVuYWJsZSB0byBoYXNoICVzIiwgcGF0aCk7CisJcHJpbnRmKCIlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOworfQorCitzdGF0aWMgdm9pZCBoYXNoX3N0ZGluKGNvbnN0IGNoYXIgKnR5cGUsIGludCB3cml0ZV9vYmplY3QpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlpZiAoaW5kZXhfcGlwZShzaGExLCAwLCB0eXBlLCB3cml0ZV9vYmplY3QpKQorCQlkaWUoIlVuYWJsZSB0byBhZGQgc3RkaW4gdG8gZGF0YWJhc2UiKTsKKwlwcmludGYoIiVzXG4iLCBzaGExX3RvX2hleChzaGExKSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGhhc2hfb2JqZWN0X3VzYWdlW10gPQorImdpdC1oYXNoLW9iamVjdCBbLXQgPHR5cGU+XSBbLXddIFstLXN0ZGluXSA8ZmlsZT4uLi4iOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisJY29uc3QgY2hhciAqdHlwZSA9IGJsb2JfdHlwZTsKKwlpbnQgd3JpdGVfb2JqZWN0ID0gMDsKKwljb25zdCBjaGFyICpwcmVmaXggPSBOVUxMOworCWludCBwcmVmaXhfbGVuZ3RoID0gLTE7CisJaW50IG5vX21vcmVfZmxhZ3MgPSAwOworCWludCBoYXNoc3RkaW4gPSAwOworCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJZm9yIChpID0gMSA7IGkgPCBhcmdjOyBpKyspIHsKKwkJaWYgKCFub19tb3JlX2ZsYWdzICYmIGFyZ3ZbaV1bMF0gPT0gJy0nKSB7CisJCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXQiKSkgeworCQkJCWlmIChhcmdjIDw9ICsraSkKKwkJCQkJdXNhZ2UoaGFzaF9vYmplY3RfdXNhZ2UpOworCQkJCXR5cGUgPSBhcmd2W2ldOworCQkJfQorCQkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXciKSkgeworCQkJCWlmIChwcmVmaXhfbGVuZ3RoIDwgMCkgeworCQkJCQlwcmVmaXggPSBzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJCQkJCXByZWZpeF9sZW5ndGggPQorCQkJCQkJcHJlZml4ID8gc3RybGVuKHByZWZpeCkgOiAwOworCQkJCX0KKwkJCQl3cml0ZV9vYmplY3QgPSAxOworCQkJfQorCQkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS0iKSkgeworCQkJCW5vX21vcmVfZmxhZ3MgPSAxOworCQkJfQorCQkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS1oZWxwIikpCisJCQkJdXNhZ2UoaGFzaF9vYmplY3RfdXNhZ2UpOworCQkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS1zdGRpbiIpKSB7CisJCQkJaWYgKGhhc2hzdGRpbikKKwkJCQkJZGllKCJNdWx0aXBsZSAtLXN0ZGluIGFyZ3VtZW50cyBhcmUgbm90IHN1cHBvcnRlZCIpOworCQkJCWhhc2hzdGRpbiA9IDE7CisJCQl9CisJCQllbHNlCisJCQkJdXNhZ2UoaGFzaF9vYmplY3RfdXNhZ2UpOworCQl9CisJCWVsc2UgeworCQkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworCQkJaWYgKGhhc2hzdGRpbikgeworCQkJCWhhc2hfc3RkaW4odHlwZSwgd3JpdGVfb2JqZWN0KTsKKwkJCQloYXNoc3RkaW4gPSAwOworCQkJfQorCQkJaWYgKDAgPD0gcHJlZml4X2xlbmd0aCkKKwkJCQlhcmcgPSBwcmVmaXhfZmlsZW5hbWUocHJlZml4LCBwcmVmaXhfbGVuZ3RoLAorCQkJCQkJICAgICAgYXJnKTsKKwkJCWhhc2hfb2JqZWN0KGFyZywgdHlwZV9mcm9tX3N0cmluZyh0eXBlKSwgd3JpdGVfb2JqZWN0KTsKKwkJCW5vX21vcmVfZmxhZ3MgPSAxOworCQl9CisJfQorCWlmIChoYXNoc3RkaW4pCisJCWhhc2hfc3RkaW4odHlwZSwgd3JpdGVfb2JqZWN0KTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2hhc2guYyBiL2hhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2Q0YzlkCi0tLSAvZGV2L251bGwKKysrIGIvaGFzaC5jCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogU29tZSBnZW5lcmljIGhhc2hpbmcgaGVscGVycy4KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiaGFzaC5oIgorCisvKgorICogTG9vayB1cCBhIGhhc2ggZW50cnkgaW4gdGhlIGhhc2ggdGFibGUuIFJldHVybiB0aGUgcG9pbnRlciB0bworICogdGhlIGV4aXN0aW5nIGVudHJ5LCBvciB0aGUgZW1wdHkgc2xvdCBpZiBub25lIGV4aXN0ZWQuIFRoZSBjYWxsZXIKKyAqIGNhbiB0aGVuIGxvb2sgYXQgdGhlICgqcHRyKSB0byBzZWUgd2hldGhlciBpdCBleGlzdGVkIG9yIG5vdC4KKyAqLworc3RhdGljIHN0cnVjdCBoYXNoX3RhYmxlX2VudHJ5ICpsb29rdXBfaGFzaF9lbnRyeSh1bnNpZ25lZCBpbnQgaGFzaCwgY29uc3Qgc3RydWN0IGhhc2hfdGFibGUgKnRhYmxlKQoreworCXVuc2lnbmVkIGludCBzaXplID0gdGFibGUtPnNpemUsIG5yID0gaGFzaCAlIHNpemU7CisJc3RydWN0IGhhc2hfdGFibGVfZW50cnkgKmFycmF5ID0gdGFibGUtPmFycmF5OworCisJd2hpbGUgKGFycmF5W25yXS5wdHIpIHsKKwkJaWYgKGFycmF5W25yXS5oYXNoID09IGhhc2gpCisJCQlicmVhazsKKwkJbnIrKzsKKwkJaWYgKG5yID49IHNpemUpCisJCQluciA9IDA7CisJfQorCXJldHVybiBhcnJheSArIG5yOworfQorCisKKy8qCisgKiBJbnNlcnQgYSBuZXcgaGFzaCBlbnRyeSBwb2ludGVyIGludG8gdGhlIHRhYmxlLgorICoKKyAqIElmIHRoYXQgaGFzaCBlbnRyeSBhbHJlYWR5IGV4aXN0ZWQsIHJldHVybiB0aGUgcG9pbnRlciB0bworICogdGhlIGV4aXN0aW5nIGVudHJ5IChhbmQgdGhlIGNhbGxlciBjYW4gY3JlYXRlIGEgbGlzdCBvZiB0aGUKKyAqIHBvaW50ZXJzIG9yIGRvIGFueXRoaW5nIGVsc2UpLiBJZiBpdCBkaWRuJ3QgZXhpc3QsIHJldHVybgorICogTlVMTCAoYW5kIHRoZSBjYWxsZXIga25vd3MgdGhlIHBvaW50ZXIgaGFzIGJlZW4gaW5zZXJ0ZWQpLgorICovCitzdGF0aWMgdm9pZCAqKmluc2VydF9oYXNoX2VudHJ5KHVuc2lnbmVkIGludCBoYXNoLCB2b2lkICpwdHIsIHN0cnVjdCBoYXNoX3RhYmxlICp0YWJsZSkKK3sKKwlzdHJ1Y3QgaGFzaF90YWJsZV9lbnRyeSAqZW50cnkgPSBsb29rdXBfaGFzaF9lbnRyeShoYXNoLCB0YWJsZSk7CisKKwlpZiAoIWVudHJ5LT5wdHIpIHsKKwkJZW50cnktPnB0ciA9IHB0cjsKKwkJZW50cnktPmhhc2ggPSBoYXNoOworCQl0YWJsZS0+bnIrKzsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiAmZW50cnktPnB0cjsKK30KKworc3RhdGljIHZvaWQgZ3Jvd19oYXNoX3RhYmxlKHN0cnVjdCBoYXNoX3RhYmxlICp0YWJsZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgb2xkX3NpemUgPSB0YWJsZS0+c2l6ZSwgbmV3X3NpemU7CisJc3RydWN0IGhhc2hfdGFibGVfZW50cnkgKm9sZF9hcnJheSA9IHRhYmxlLT5hcnJheSwgKm5ld19hcnJheTsKKworCW5ld19zaXplID0gYWxsb2NfbnIob2xkX3NpemUpOworCW5ld19hcnJheSA9IHhjYWxsb2Moc2l6ZW9mKHN0cnVjdCBoYXNoX3RhYmxlX2VudHJ5KSwgbmV3X3NpemUpOworCXRhYmxlLT5zaXplID0gbmV3X3NpemU7CisJdGFibGUtPmFycmF5ID0gbmV3X2FycmF5OworCXRhYmxlLT5uciA9IDA7CisJZm9yIChpID0gMDsgaSA8IG9sZF9zaXplOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IGhhc2ggPSBvbGRfYXJyYXlbaV0uaGFzaDsKKwkJdm9pZCAqcHRyID0gb2xkX2FycmF5W2ldLnB0cjsKKwkJaWYgKHB0cikKKwkJCWluc2VydF9oYXNoX2VudHJ5KGhhc2gsIHB0ciwgdGFibGUpOworCX0KKwlmcmVlKG9sZF9hcnJheSk7Cit9CisKK3ZvaWQgKmxvb2t1cF9oYXNoKHVuc2lnbmVkIGludCBoYXNoLCBjb25zdCBzdHJ1Y3QgaGFzaF90YWJsZSAqdGFibGUpCit7CisJaWYgKCF0YWJsZS0+YXJyYXkpCisJCXJldHVybiBOVUxMOworCXJldHVybiBsb29rdXBfaGFzaF9lbnRyeShoYXNoLCB0YWJsZSktPnB0cjsKK30KKwordm9pZCAqKmluc2VydF9oYXNoKHVuc2lnbmVkIGludCBoYXNoLCB2b2lkICpwdHIsIHN0cnVjdCBoYXNoX3RhYmxlICp0YWJsZSkKK3sKKwl1bnNpZ25lZCBpbnQgbnIgPSB0YWJsZS0+bnI7CisJaWYgKG5yID49IHRhYmxlLT5zaXplLzIpCisJCWdyb3dfaGFzaF90YWJsZSh0YWJsZSk7CisJcmV0dXJuIGluc2VydF9oYXNoX2VudHJ5KGhhc2gsIHB0ciwgdGFibGUpOworfQorCitpbnQgZm9yX2VhY2hfaGFzaChjb25zdCBzdHJ1Y3QgaGFzaF90YWJsZSAqdGFibGUsIGludCAoKmZuKSh2b2lkICopKQoreworCWludCBzdW0gPSAwOworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBzaXplID0gdGFibGUtPnNpemU7CisJc3RydWN0IGhhc2hfdGFibGVfZW50cnkgKmFycmF5ID0gdGFibGUtPmFycmF5OworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQl2b2lkICpwdHIgPSBhcnJheS0+cHRyOworCQlhcnJheSsrOworCQlpZiAocHRyKSB7CisJCQlpbnQgdmFsID0gZm4ocHRyKTsKKwkJCWlmICh2YWwgPCAwKQorCQkJCXJldHVybiB2YWw7CisJCQlzdW0gKz0gdmFsOworCQl9CisJfQorCXJldHVybiBzdW07Cit9CisKK3ZvaWQgZnJlZV9oYXNoKHN0cnVjdCBoYXNoX3RhYmxlICp0YWJsZSkKK3sKKwlmcmVlKHRhYmxlLT5hcnJheSk7CisJdGFibGUtPmFycmF5ID0gTlVMTDsKKwl0YWJsZS0+c2l6ZSA9IDA7CisJdGFibGUtPm5yID0gMDsKK30KZGlmZiAtLWdpdCBhL2hhc2guaCBiL2hhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWUzM2E0Ci0tLSAvZGV2L251bGwKKysrIGIvaGFzaC5oCkBAIC0wLDAgKzEsNDMgQEAKKyNpZm5kZWYgSEFTSF9ICisjZGVmaW5lIEhBU0hfSAorCisvKgorICogVGhlc2UgYXJlIHNvbWUgc2ltcGxlIGdlbmVyaWMgaGFzaCB0YWJsZSBoZWxwZXIgZnVuY3Rpb25zLgorICogTm90IG5lY2Vzc2FyaWx5IHN1aXRhYmxlIGZvciBhbGwgdXNlcnMsIGJ1dCBnb29kIGZvciB0aGluZ3MKKyAqIHdoZXJlIHlvdSB3YW50IHRvIGp1c3Qga2VlcCB0cmFjayBvZiBhIGxpc3Qgb2YgdGhpbmdzLCBhbmQKKyAqIGhhdmUgYSBnb29kIGhhc2ggdG8gdXNlIG9uIHRoZW0uCisgKgorICogSXQga2VlcHMgdGhlIGhhc2ggdGFibGUgYXQgcm91Z2hseSA1MC03NSUgZnJlZSwgc28gdGhlIG1lbW9yeQorICogY29zdCBvZiB0aGUgaGFzaCB0YWJsZSBpdHNlbGYgaXMgcm91Z2hseQorICoKKyAqCTMgKiAyKnNpemVvZih2b2lkICopICogbnJfb2Zfb2JqZWN0cworICoKKyAqIGJ5dGVzLgorICoKKyAqIEZJWE1FOiBvbiA2NC1iaXQgYXJjaGl0ZWN0dXJlcywgd2Ugd2FzdGUgbWVtb3J5LiBJdCB3b3VsZCBiZQorICogZ29vZCB0byBoYXZlIGp1c3QgMzItYml0IHBvaW50ZXJzLCByZXF1aXJpbmcgYSBzcGVjaWFsIGFsbG9jYXRvcgorICogZm9yIGhhc2hlZCBlbnRyaWVzIG9yIHNvbWV0aGluZy4KKyAqLworc3RydWN0IGhhc2hfdGFibGVfZW50cnkgeworCXVuc2lnbmVkIGludCBoYXNoOworCXZvaWQgKnB0cjsKK307CisKK3N0cnVjdCBoYXNoX3RhYmxlIHsKKwl1bnNpZ25lZCBpbnQgc2l6ZSwgbnI7CisJc3RydWN0IGhhc2hfdGFibGVfZW50cnkgKmFycmF5OworfTsKKworZXh0ZXJuIHZvaWQgKmxvb2t1cF9oYXNoKHVuc2lnbmVkIGludCBoYXNoLCBjb25zdCBzdHJ1Y3QgaGFzaF90YWJsZSAqdGFibGUpOworZXh0ZXJuIHZvaWQgKippbnNlcnRfaGFzaCh1bnNpZ25lZCBpbnQgaGFzaCwgdm9pZCAqcHRyLCBzdHJ1Y3QgaGFzaF90YWJsZSAqdGFibGUpOworZXh0ZXJuIGludCBmb3JfZWFjaF9oYXNoKGNvbnN0IHN0cnVjdCBoYXNoX3RhYmxlICp0YWJsZSwgaW50ICgqZm4pKHZvaWQgKikpOworZXh0ZXJuIHZvaWQgZnJlZV9oYXNoKHN0cnVjdCBoYXNoX3RhYmxlICp0YWJsZSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2hhc2goc3RydWN0IGhhc2hfdGFibGUgKnRhYmxlKQoreworCXRhYmxlLT5zaXplID0gMDsKKwl0YWJsZS0+bnIgPSAwOworCXRhYmxlLT5hcnJheSA9IE5VTEw7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaGVscC5jIGIvaGVscC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMjk4ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9oZWxwLmMKQEAgLTAsMCArMSw1NTMgQEAKKy8qCisgKiBidWlsdGluLWhlbHAuYworICoKKyAqIEJ1aWx0aW4gaGVscC1yZWxhdGVkIGNvbW1hbmRzIChoZWxwLCB1c2FnZSwgdmVyc2lvbikKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisjaW5jbHVkZSAiY29tbW9uLWNtZHMuaCIKKyNpbmNsdWRlICJwYXJzZS1vcHRpb25zLmgiCisjaW5jbHVkZSAicnVuLWNvbW1hbmQuaCIKKworc3RhdGljIHN0cnVjdCBtYW5fdmlld2VyX2xpc3QgeworCXZvaWQgKCpleGVjKShjb25zdCBjaGFyICopOworCXN0cnVjdCBtYW5fdmlld2VyX2xpc3QgKm5leHQ7Cit9ICptYW5fdmlld2VyX2xpc3Q7CisKK2VudW0gaGVscF9mb3JtYXQgeworCUhFTFBfRk9STUFUX01BTiwKKwlIRUxQX0ZPUk1BVF9JTkZPLAorCUhFTFBfRk9STUFUX1dFQiwKK307CisKK3N0YXRpYyBpbnQgc2hvd19hbGwgPSAwOworc3RhdGljIGVudW0gaGVscF9mb3JtYXQgaGVscF9mb3JtYXQgPSBIRUxQX0ZPUk1BVF9NQU47CitzdGF0aWMgc3RydWN0IG9wdGlvbiBidWlsdGluX2hlbHBfb3B0aW9uc1tdID0geworCU9QVF9CT09MRUFOKCdhJywgImFsbCIsICZzaG93X2FsbCwgInByaW50IGFsbCBhdmFpbGFibGUgY29tbWFuZHMiKSwKKwlPUFRfU0VUX0lOVCgnbScsICJtYW4iLCAmaGVscF9mb3JtYXQsICJzaG93IG1hbiBwYWdlIiwgSEVMUF9GT1JNQVRfTUFOKSwKKwlPUFRfU0VUX0lOVCgndycsICJ3ZWIiLCAmaGVscF9mb3JtYXQsICJzaG93IG1hbnVhbCBpbiB3ZWIgYnJvd3NlciIsCisJCQlIRUxQX0ZPUk1BVF9XRUIpLAorCU9QVF9TRVRfSU5UKCdpJywgImluZm8iLCAmaGVscF9mb3JtYXQsICJzaG93IGluZm8gcGFnZSIsCisJCQlIRUxQX0ZPUk1BVF9JTkZPKSwKKwlPUFRfRU5EKCksCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJ1aWx0aW5faGVscF91c2FnZVtdID0geworCSJnaXQtaGVscCBbLS1hbGxdIFstLW1hbnwtLXdlYnwtLWluZm9dIFtjb21tYW5kXSIsCisJTlVMTAorfTsKKworc3RhdGljIGVudW0gaGVscF9mb3JtYXQgcGFyc2VfaGVscF9mb3JtYXQoY29uc3QgY2hhciAqZm9ybWF0KQoreworCWlmICghc3RyY21wKGZvcm1hdCwgIm1hbiIpKQorCQlyZXR1cm4gSEVMUF9GT1JNQVRfTUFOOworCWlmICghc3RyY21wKGZvcm1hdCwgImluZm8iKSkKKwkJcmV0dXJuIEhFTFBfRk9STUFUX0lORk87CisJaWYgKCFzdHJjbXAoZm9ybWF0LCAid2ViIikgfHwgIXN0cmNtcChmb3JtYXQsICJodG1sIikpCisJCXJldHVybiBIRUxQX0ZPUk1BVF9XRUI7CisJZGllKCJ1bnJlY29nbml6ZWQgaGVscCBmb3JtYXQgJyVzJyIsIGZvcm1hdCk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfZW1hY3NjbGllbnRfdmVyc2lvbih2b2lkKQoreworCXN0cnVjdCBzdHJidWYgYnVmZmVyID0gU1RSQlVGX0lOSVQ7CisJc3RydWN0IGNoaWxkX3Byb2Nlc3MgZWNfcHJvY2VzczsKKwljb25zdCBjaGFyICphcmd2X2VjW10gPSB7ICJlbWFjc2NsaWVudCIsICItLXZlcnNpb24iLCBOVUxMIH07CisJaW50IHZlcnNpb247CisKKwkvKiBlbWFjc2NsaWVudCBwcmludHMgaXRzIHZlcnNpb24gbnVtYmVyIG9uIHN0ZGVyciAqLworCW1lbXNldCgmZWNfcHJvY2VzcywgMCwgc2l6ZW9mKGVjX3Byb2Nlc3MpKTsKKwllY19wcm9jZXNzLmFyZ3YgPSBhcmd2X2VjOworCWVjX3Byb2Nlc3MuZXJyID0gLTE7CisJZWNfcHJvY2Vzcy5zdGRvdXRfdG9fc3RkZXJyID0gMTsKKwlpZiAoc3RhcnRfY29tbWFuZCgmZWNfcHJvY2VzcykpIHsKKwkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gc3RhcnQgZW1hY3NjbGllbnQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzdHJidWZfcmVhZCgmYnVmZmVyLCBlY19wcm9jZXNzLmVyciwgMjApOworCWNsb3NlKGVjX3Byb2Nlc3MuZXJyKTsKKworCS8qCisJICogRG9uJ3QgYm90aGVyIGNoZWNraW5nIHJldHVybiB2YWx1ZSwgYmVjYXVzZSAiZW1hY3NjbGllbnQgLS12ZXJzaW9uIgorCSAqIHNlZW1zIHRvIGFsd2F5cyBleGl0cyB3aXRoIGNvZGUgMS4KKwkgKi8KKwlmaW5pc2hfY29tbWFuZCgmZWNfcHJvY2Vzcyk7CisKKwlpZiAocHJlZml4Y21wKGJ1ZmZlci5idWYsICJlbWFjc2NsaWVudCIpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHBhcnNlIGVtYWNzY2xpZW50IHZlcnNpb24uXG4iKTsKKwkJc3RyYnVmX3JlbGVhc2UoJmJ1ZmZlcik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzdHJidWZfcmVtb3ZlKCZidWZmZXIsIDAsIHN0cmxlbigiZW1hY3NjbGllbnQiKSk7CisJdmVyc2lvbiA9IGF0b2koYnVmZmVyLmJ1Zik7CisKKwlpZiAodmVyc2lvbiA8IDIyKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJImVtYWNzY2xpZW50IHZlcnNpb24gJyVkJyB0b28gb2xkICg8IDIyKS5cbiIsCisJCQl2ZXJzaW9uKTsKKwkJc3RyYnVmX3JlbGVhc2UoJmJ1ZmZlcik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzdHJidWZfcmVsZWFzZSgmYnVmZmVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZXhlY193b21hbl9lbWFjcyhjb25zdCBjaGFyICpwYWdlKQoreworCWlmICghY2hlY2tfZW1hY3NjbGllbnRfdmVyc2lvbigpKSB7CisJCS8qIFRoaXMgd29ya3Mgb25seSB3aXRoIGVtYWNzY2xpZW50IHZlcnNpb24gPj0gMjIuICovCisJCXN0cnVjdCBzdHJidWYgbWFuX3BhZ2UgPSBTVFJCVUZfSU5JVDsKKwkJc3RyYnVmX2FkZGYoJm1hbl9wYWdlLCAiKHdvbWFuIFwiJXNcIikiLCBwYWdlKTsKKwkJZXhlY2xwKCJlbWFjc2NsaWVudCIsICJlbWFjc2NsaWVudCIsICItZSIsIG1hbl9wYWdlLmJ1ZiwgTlVMTCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBleGVjX21hbl9rb25xdWVyb3IoY29uc3QgY2hhciAqcGFnZSkKK3sKKwljb25zdCBjaGFyICpkaXNwbGF5ID0gZ2V0ZW52KCJESVNQTEFZIik7CisJaWYgKGRpc3BsYXkgJiYgKmRpc3BsYXkpIHsKKwkJc3RydWN0IHN0cmJ1ZiBtYW5fcGFnZSA9IFNUUkJVRl9JTklUOworCQlzdHJidWZfYWRkZigmbWFuX3BhZ2UsICJtYW46JXMoMSkiLCBwYWdlKTsKKwkJZXhlY2xwKCJrZm1jbGllbnQiLCAia2ZtY2xpZW50IiwgIm5ld1RhYiIsIG1hbl9wYWdlLmJ1ZiwgTlVMTCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBleGVjX21hbl9tYW4oY29uc3QgY2hhciAqcGFnZSkKK3sKKwlleGVjbHAoIm1hbiIsICJtYW4iLCBwYWdlLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgZG9fYWRkX21hbl92aWV3ZXIodm9pZCAoKmV4ZWMpKGNvbnN0IGNoYXIgKikpCit7CisJc3RydWN0IG1hbl92aWV3ZXJfbGlzdCAqKnAgPSAmbWFuX3ZpZXdlcl9saXN0OworCisJd2hpbGUgKCpwKQorCQlwID0gJigoKnApLT5uZXh0KTsKKwkqcCA9IHhtYWxsb2Moc2l6ZW9mKCoqcCkpOworCSgqcCktPm5leHQgPSBOVUxMOworCSgqcCktPmV4ZWMgPSBleGVjOworfQorCitzdGF0aWMgaW50IGFkZF9tYW5fdmlld2VyKGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICghc3RyY2FzZWNtcCh2YWx1ZSwgIm1hbiIpKQorCQlkb19hZGRfbWFuX3ZpZXdlcihleGVjX21hbl9tYW4pOworCWVsc2UgaWYgKCFzdHJjYXNlY21wKHZhbHVlLCAid29tYW4iKSkKKwkJZG9fYWRkX21hbl92aWV3ZXIoZXhlY193b21hbl9lbWFjcyk7CisJZWxzZSBpZiAoIXN0cmNhc2VjbXAodmFsdWUsICJrb25xdWVyb3IiKSkKKwkJZG9fYWRkX21hbl92aWV3ZXIoZXhlY19tYW5fa29ucXVlcm9yKTsKKwllbHNlCisJCXdhcm5pbmcoIiclcyc6IHVuc3VwcG9ydGVkIG1hbiB2aWV3ZXIuIiwgdmFsdWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2l0X2hlbHBfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCFzdHJjbXAodmFyLCAiaGVscC5mb3JtYXQiKSkgeworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIGNvbmZpZ19lcnJvcl9ub25ib29sKHZhcik7CisJCWhlbHBfZm9ybWF0ID0gcGFyc2VfaGVscF9mb3JtYXQodmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAodmFyLCAibWFuLnZpZXdlciIpKSB7CisJCWlmICghdmFsdWUpCisJCQlyZXR1cm4gY29uZmlnX2Vycm9yX25vbmJvb2wodmFyKTsKKwkJcmV0dXJuIGFkZF9tYW5fdmlld2VyKHZhbHVlKTsKKwl9CisJcmV0dXJuIGdpdF9kZWZhdWx0X2NvbmZpZyh2YXIsIHZhbHVlKTsKK30KKworLyogbW9zdCBHVUkgdGVybWluYWxzIHNldCBDT0xVTU5TIChhbHRob3VnaCBzb21lIGRvbid0IGV4cG9ydCBpdCkgKi8KK3N0YXRpYyBpbnQgdGVybV9jb2x1bW5zKHZvaWQpCit7CisJY2hhciAqY29sX3N0cmluZyA9IGdldGVudigiQ09MVU1OUyIpOworCWludCBuX2NvbHM7CisKKwlpZiAoY29sX3N0cmluZyAmJiAobl9jb2xzID0gYXRvaShjb2xfc3RyaW5nKSkgPiAwKQorCQlyZXR1cm4gbl9jb2xzOworCisjaWZkZWYgVElPQ0dXSU5TWgorCXsKKwkJc3RydWN0IHdpbnNpemUgd3M7CisJCWlmICghaW9jdGwoMSwgVElPQ0dXSU5TWiwgJndzKSkgeworCQkJaWYgKHdzLndzX2NvbCkKKwkJCQlyZXR1cm4gd3Mud3NfY29sOworCQl9CisJfQorI2VuZGlmCisKKwlyZXR1cm4gODA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtcHV0X2NoYXIoY2hhciBjLCB1bnNpZ25lZCBpbnQgbnVtKQoreworCXdoaWxlKG51bS0tKQorCQlwdXRjaGFyKGMpOworfQorCitzdGF0aWMgc3RydWN0IGNtZG5hbWVzIHsKKwlpbnQgYWxsb2M7CisJaW50IGNudDsKKwlzdHJ1Y3QgY21kbmFtZSB7CisJCXNpemVfdCBsZW47CisJCWNoYXIgbmFtZVsxXTsKKwl9ICoqbmFtZXM7Cit9IG1haW5fY21kcywgb3RoZXJfY21kczsKKworc3RhdGljIHZvaWQgYWRkX2NtZG5hbWUoc3RydWN0IGNtZG5hbWVzICpjbWRzLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQoreworCXN0cnVjdCBjbWRuYW1lICplbnQgPSB4bWFsbG9jKHNpemVvZigqZW50KSArIGxlbik7CisKKwllbnQtPmxlbiA9IGxlbjsKKwltZW1jcHkoZW50LT5uYW1lLCBuYW1lLCBsZW4pOworCWVudC0+bmFtZVtsZW5dID0gMDsKKworCUFMTE9DX0dST1coY21kcy0+bmFtZXMsIGNtZHMtPmNudCArIDEsIGNtZHMtPmFsbG9jKTsKKwljbWRzLT5uYW1lc1tjbWRzLT5jbnQrK10gPSBlbnQ7Cit9CisKK3N0YXRpYyBpbnQgY21kbmFtZV9jb21wYXJlKGNvbnN0IHZvaWQgKmFfLCBjb25zdCB2b2lkICpiXykKK3sKKwlzdHJ1Y3QgY21kbmFtZSAqYSA9ICooc3RydWN0IGNtZG5hbWUgKiopYV87CisJc3RydWN0IGNtZG5hbWUgKmIgPSAqKHN0cnVjdCBjbWRuYW1lICoqKWJfOworCXJldHVybiBzdHJjbXAoYS0+bmFtZSwgYi0+bmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHVuaXEoc3RydWN0IGNtZG5hbWVzICpjbWRzKQoreworCWludCBpLCBqOworCisJaWYgKCFjbWRzLT5jbnQpCisJCXJldHVybjsKKworCWZvciAoaSA9IGogPSAxOyBpIDwgY21kcy0+Y250OyBpKyspCisJCWlmIChzdHJjbXAoY21kcy0+bmFtZXNbaV0tPm5hbWUsIGNtZHMtPm5hbWVzW2ktMV0tPm5hbWUpKQorCQkJY21kcy0+bmFtZXNbaisrXSA9IGNtZHMtPm5hbWVzW2ldOworCisJY21kcy0+Y250ID0gajsKK30KKworc3RhdGljIHZvaWQgZXhjbHVkZV9jbWRzKHN0cnVjdCBjbWRuYW1lcyAqY21kcywgc3RydWN0IGNtZG5hbWVzICpleGNsdWRlcykKK3sKKwlpbnQgY2ksIGNqLCBlaTsKKwlpbnQgY21wOworCisJY2kgPSBjaiA9IGVpID0gMDsKKwl3aGlsZSAoY2kgPCBjbWRzLT5jbnQgJiYgZWkgPCBleGNsdWRlcy0+Y250KSB7CisJCWNtcCA9IHN0cmNtcChjbWRzLT5uYW1lc1tjaV0tPm5hbWUsIGV4Y2x1ZGVzLT5uYW1lc1tlaV0tPm5hbWUpOworCQlpZiAoY21wIDwgMCkKKwkJCWNtZHMtPm5hbWVzW2NqKytdID0gY21kcy0+bmFtZXNbY2krK107CisJCWVsc2UgaWYgKGNtcCA9PSAwKQorCQkJY2krKywgZWkrKzsKKwkJZWxzZSBpZiAoY21wID4gMCkKKwkJCWVpKys7CisJfQorCisJd2hpbGUgKGNpIDwgY21kcy0+Y250KQorCQljbWRzLT5uYW1lc1tjaisrXSA9IGNtZHMtPm5hbWVzW2NpKytdOworCisJY21kcy0+Y250ID0gY2o7Cit9CisKK3N0YXRpYyB2b2lkIHByZXR0eV9wcmludF9zdHJpbmdfbGlzdChzdHJ1Y3QgY21kbmFtZXMgKmNtZHMsIGludCBsb25nZXN0KQoreworCWludCBjb2xzID0gMSwgcm93czsKKwlpbnQgc3BhY2UgPSBsb25nZXN0ICsgMTsgLyogbWluIDEgU1AgYmV0d2VlbiB3b3JkcyAqLworCWludCBtYXhfY29scyA9IHRlcm1fY29sdW1ucygpIC0gMTsgLyogZG9uJ3QgcHJpbnQgKm9uKiB0aGUgZWRnZSAqLworCWludCBpLCBqOworCisJaWYgKHNwYWNlIDwgbWF4X2NvbHMpCisJCWNvbHMgPSBtYXhfY29scyAvIHNwYWNlOworCXJvd3MgPSAoY21kcy0+Y250ICsgY29scyAtIDEpIC8gY29sczsKKworCWZvciAoaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKKwkJcHJpbnRmKCIgICIpOworCisJCWZvciAoaiA9IDA7IGogPCBjb2xzOyBqKyspIHsKKwkJCWludCBuID0gaiAqIHJvd3MgKyBpOworCQkJaW50IHNpemUgPSBzcGFjZTsKKwkJCWlmIChuID49IGNtZHMtPmNudCkKKwkJCQlicmVhazsKKwkJCWlmIChqID09IGNvbHMtMSB8fCBuICsgcm93cyA+PSBjbWRzLT5jbnQpCisJCQkJc2l6ZSA9IDE7CisJCQlwcmludGYoIiUtKnMiLCBzaXplLCBjbWRzLT5uYW1lc1tuXS0+bmFtZSk7CisJCX0KKwkJcHV0Y2hhcignXG4nKTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbGlzdF9jb21tYW5kc19pbl9kaXIoc3RydWN0IGNtZG5hbWVzICpjbWRzLAorCQkJCQkgY29uc3QgY2hhciAqcGF0aCkKK3sKKwl1bnNpZ25lZCBpbnQgbG9uZ2VzdCA9IDA7CisJY29uc3QgY2hhciAqcHJlZml4ID0gImdpdC0iOworCWludCBwcmVmaXhfbGVuID0gc3RybGVuKHByZWZpeCk7CisJRElSICpkaXIgPSBvcGVuZGlyKHBhdGgpOworCXN0cnVjdCBkaXJlbnQgKmRlOworCisJaWYgKCFkaXIgfHwgY2hkaXIocGF0aCkpCisJCXJldHVybiAwOworCisJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJaW50IGVudGxlbjsKKworCQlpZiAocHJlZml4Y21wKGRlLT5kX25hbWUsIHByZWZpeCkpCisJCQljb250aW51ZTsKKworCQlpZiAoc3RhdChkZS0+ZF9uYW1lLCAmc3QpIHx8IC8qIHN0YXQsIG5vdCBsc3RhdCAqLworCQkgICAgIVNfSVNSRUcoc3Quc3RfbW9kZSkgfHwKKwkJICAgICEoc3Quc3RfbW9kZSAmIFNfSVhVU1IpKQorCQkJY29udGludWU7CisKKwkJZW50bGVuID0gc3RybGVuKGRlLT5kX25hbWUpIC0gcHJlZml4X2xlbjsKKwkJaWYgKGhhc19leHRlbnNpb24oZGUtPmRfbmFtZSwgIi5leGUiKSkKKwkJCWVudGxlbiAtPSA0OworCisJCWlmIChsb25nZXN0IDwgZW50bGVuKQorCQkJbG9uZ2VzdCA9IGVudGxlbjsKKworCQlhZGRfY21kbmFtZShjbWRzLCBkZS0+ZF9uYW1lICsgcHJlZml4X2xlbiwgZW50bGVuKTsKKwl9CisJY2xvc2VkaXIoZGlyKTsKKworCXJldHVybiBsb25nZXN0OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGxvYWRfY29tbWFuZF9saXN0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGxvbmdlc3QgPSAwOworCXVuc2lnbmVkIGludCBsZW47CisJY29uc3QgY2hhciAqZW52X3BhdGggPSBnZXRlbnYoIlBBVEgiKTsKKwljaGFyICpwYXRocywgKnBhdGgsICpjb2xvbjsKKwljb25zdCBjaGFyICpleGVjX3BhdGggPSBnaXRfZXhlY19wYXRoKCk7CisKKwlpZiAoZXhlY19wYXRoKQorCQlsb25nZXN0ID0gbGlzdF9jb21tYW5kc19pbl9kaXIoJm1haW5fY21kcywgZXhlY19wYXRoKTsKKworCWlmICghZW52X3BhdGgpIHsKKwkJZnByaW50ZihzdGRlcnIsICJQQVRIIG5vdCBzZXRcbiIpOworCQlleGl0KDEpOworCX0KKworCXBhdGggPSBwYXRocyA9IHhzdHJkdXAoZW52X3BhdGgpOworCXdoaWxlICgxKSB7CisJCWlmICgoY29sb24gPSBzdHJjaHIocGF0aCwgJzonKSkpCisJCQkqY29sb24gPSAwOworCisJCWxlbiA9IGxpc3RfY29tbWFuZHNfaW5fZGlyKCZvdGhlcl9jbWRzLCBwYXRoKTsKKwkJaWYgKGxlbiA+IGxvbmdlc3QpCisJCQlsb25nZXN0ID0gbGVuOworCisJCWlmICghY29sb24pCisJCQlicmVhazsKKwkJcGF0aCA9IGNvbG9uICsgMTsKKwl9CisJZnJlZShwYXRocyk7CisKKwlxc29ydChtYWluX2NtZHMubmFtZXMsIG1haW5fY21kcy5jbnQsCisJICAgICAgc2l6ZW9mKCptYWluX2NtZHMubmFtZXMpLCBjbWRuYW1lX2NvbXBhcmUpOworCXVuaXEoJm1haW5fY21kcyk7CisKKwlxc29ydChvdGhlcl9jbWRzLm5hbWVzLCBvdGhlcl9jbWRzLmNudCwKKwkgICAgICBzaXplb2YoKm90aGVyX2NtZHMubmFtZXMpLCBjbWRuYW1lX2NvbXBhcmUpOworCXVuaXEoJm90aGVyX2NtZHMpOworCWV4Y2x1ZGVfY21kcygmb3RoZXJfY21kcywgJm1haW5fY21kcyk7CisKKwlyZXR1cm4gbG9uZ2VzdDsKK30KKworc3RhdGljIHZvaWQgbGlzdF9jb21tYW5kcyh2b2lkKQoreworCXVuc2lnbmVkIGludCBsb25nZXN0ID0gbG9hZF9jb21tYW5kX2xpc3QoKTsKKwljb25zdCBjaGFyICpleGVjX3BhdGggPSBnaXRfZXhlY19wYXRoKCk7CisKKwlpZiAobWFpbl9jbWRzLmNudCkgeworCQlwcmludGYoImF2YWlsYWJsZSBnaXQgY29tbWFuZHMgaW4gJyVzJ1xuIiwgZXhlY19wYXRoKTsKKwkJcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisJCW1wdXRfY2hhcignLScsIHN0cmxlbihleGVjX3BhdGgpKTsKKwkJcHV0Y2hhcignXG4nKTsKKwkJcHJldHR5X3ByaW50X3N0cmluZ19saXN0KCZtYWluX2NtZHMsIGxvbmdlc3QpOworCQlwdXRjaGFyKCdcbicpOworCX0KKworCWlmIChvdGhlcl9jbWRzLmNudCkgeworCQlwcmludGYoImdpdCBjb21tYW5kcyBhdmFpbGFibGUgZnJvbSBlbHNld2hlcmUgb24geW91ciAkUEFUSFxuIik7CisJCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwkJcHJldHR5X3ByaW50X3N0cmluZ19saXN0KCZvdGhlcl9jbWRzLCBsb25nZXN0KTsKKwkJcHV0Y2hhcignXG4nKTsKKwl9Cit9CisKK3ZvaWQgbGlzdF9jb21tb25fY21kc19oZWxwKHZvaWQpCit7CisJaW50IGksIGxvbmdlc3QgPSAwOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29tbW9uX2NtZHMpOyBpKyspIHsKKwkJaWYgKGxvbmdlc3QgPCBzdHJsZW4oY29tbW9uX2NtZHNbaV0ubmFtZSkpCisJCQlsb25nZXN0ID0gc3RybGVuKGNvbW1vbl9jbWRzW2ldLm5hbWUpOworCX0KKworCXB1dHMoIlRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgZ2l0IGNvbW1hbmRzIGFyZToiKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb21tb25fY21kcyk7IGkrKykgeworCQlwcmludGYoIiAgICVzICAgIiwgY29tbW9uX2NtZHNbaV0ubmFtZSk7CisJCW1wdXRfY2hhcignICcsIGxvbmdlc3QgLSBzdHJsZW4oY29tbW9uX2NtZHNbaV0ubmFtZSkpOworCQlwdXRzKGNvbW1vbl9jbWRzW2ldLmhlbHApOworCX0KK30KKworc3RhdGljIGludCBpc19pbl9jbWRsaXN0KHN0cnVjdCBjbWRuYW1lcyAqYywgY29uc3QgY2hhciAqcykKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgYy0+Y250OyBpKyspCisJCWlmICghc3RyY21wKHMsIGMtPm5hbWVzW2ldLT5uYW1lKSkKKwkJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlzX2dpdF9jb21tYW5kKGNvbnN0IGNoYXIgKnMpCit7CisJbG9hZF9jb21tYW5kX2xpc3QoKTsKKwlyZXR1cm4gaXNfaW5fY21kbGlzdCgmbWFpbl9jbWRzLCBzKSB8fAorCQlpc19pbl9jbWRsaXN0KCZvdGhlcl9jbWRzLCBzKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNtZF90b19wYWdlKGNvbnN0IGNoYXIgKmdpdF9jbWQpCit7CisJaWYgKCFnaXRfY21kKQorCQlyZXR1cm4gImdpdCI7CisJZWxzZSBpZiAoIXByZWZpeGNtcChnaXRfY21kLCAiZ2l0IikpCisJCXJldHVybiBnaXRfY21kOworCWVsc2UgeworCQlpbnQgcGFnZV9sZW4gPSBzdHJsZW4oZ2l0X2NtZCkgKyA0OworCQljaGFyICpwID0geG1hbGxvYyhwYWdlX2xlbiArIDEpOworCQlzdHJjcHkocCwgImdpdC0iKTsKKwkJc3RyY3B5KHAgKyA0LCBnaXRfY21kKTsKKwkJcFtwYWdlX2xlbl0gPSAwOworCQlyZXR1cm4gcDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX21hbl9wYXRoKHZvaWQpCit7CisJc3RydWN0IHN0cmJ1ZiBuZXdfcGF0aDsKKwljb25zdCBjaGFyICpvbGRfcGF0aCA9IGdldGVudigiTUFOUEFUSCIpOworCisJc3RyYnVmX2luaXQoJm5ld19wYXRoLCAwKTsKKworCS8qIFdlIHNob3VsZCBhbHdheXMgcHV0ICc6JyBhZnRlciBvdXIgcGF0aC4gSWYgdGhlcmUgaXMgbm8KKwkgKiBvbGRfcGF0aCwgdGhlICc6JyBhdCB0aGUgZW5kIHdpbGwgbGV0ICdtYW4nIHRvIHRyeQorCSAqIHN5c3RlbS13aWRlIHBhdGhzIGFmdGVyIG91cnMgdG8gZmluZCB0aGUgbWFudWFsIHBhZ2UuIElmCisJICogdGhlcmUgaXMgb2xkX3BhdGgsIHdlIG5lZWQgJzonIGFzIGRlbGltaXRlci4gKi8KKwlzdHJidWZfYWRkc3RyKCZuZXdfcGF0aCwgR0lUX01BTl9QQVRIKTsKKwlzdHJidWZfYWRkY2goJm5ld19wYXRoLCAnOicpOworCWlmIChvbGRfcGF0aCkKKwkJc3RyYnVmX2FkZHN0cigmbmV3X3BhdGgsIG9sZF9wYXRoKTsKKworCXNldGVudigiTUFOUEFUSCIsIG5ld19wYXRoLmJ1ZiwgMSk7CisKKwlzdHJidWZfcmVsZWFzZSgmbmV3X3BhdGgpOworfQorCitzdGF0aWMgdm9pZCBzaG93X21hbl9wYWdlKGNvbnN0IGNoYXIgKmdpdF9jbWQpCit7CisJc3RydWN0IG1hbl92aWV3ZXJfbGlzdCAqdmlld2VyOworCWNvbnN0IGNoYXIgKnBhZ2UgPSBjbWRfdG9fcGFnZShnaXRfY21kKTsKKworCXNldHVwX21hbl9wYXRoKCk7CisJZm9yICh2aWV3ZXIgPSBtYW5fdmlld2VyX2xpc3Q7IHZpZXdlcjsgdmlld2VyID0gdmlld2VyLT5uZXh0KQorCXsKKwkJdmlld2VyLT5leGVjKHBhZ2UpOyAvKiB3aWxsIHJldHVybiB3aGVuIHVuYWJsZSAqLworCX0KKwlleGVjX21hbl9tYW4ocGFnZSk7CisJZGllKCJubyBtYW4gdmlld2VyIGhhbmRsZWQgdGhlIHJlcXVlc3QiKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19pbmZvX3BhZ2UoY29uc3QgY2hhciAqZ2l0X2NtZCkKK3sKKwljb25zdCBjaGFyICpwYWdlID0gY21kX3RvX3BhZ2UoZ2l0X2NtZCk7CisJc2V0ZW52KCJJTkZPUEFUSCIsIEdJVF9JTkZPX1BBVEgsIDEpOworCWV4ZWNscCgiaW5mbyIsICJpbmZvIiwgImdpdG1hbiIsIHBhZ2UsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBnZXRfaHRtbF9wYWdlX3BhdGgoc3RydWN0IHN0cmJ1ZiAqcGFnZV9wYXRoLCBjb25zdCBjaGFyICpwYWdlKQoreworCXN0cnVjdCBzdGF0IHN0OworCisJLyogQ2hlY2sgdGhhdCB3ZSBoYXZlIGEgZ2l0IGRvY3VtZW50YXRpb24gZGlyZWN0b3J5LiAqLworCWlmIChzdGF0KEdJVF9IVE1MX1BBVEggIi9naXQuaHRtbCIsICZzdCkgfHwgIVNfSVNSRUcoc3Quc3RfbW9kZSkpCisJCWRpZSgiJyVzJzogbm90IGEgZG9jdW1lbnRhdGlvbiBkaXJlY3RvcnkuIiwgR0lUX0hUTUxfUEFUSCk7CisKKwlzdHJidWZfaW5pdChwYWdlX3BhdGgsIDApOworCXN0cmJ1Zl9hZGRmKHBhZ2VfcGF0aCwgR0lUX0hUTUxfUEFUSCAiLyVzLmh0bWwiLCBwYWdlKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19odG1sX3BhZ2UoY29uc3QgY2hhciAqZ2l0X2NtZCkKK3sKKwljb25zdCBjaGFyICpwYWdlID0gY21kX3RvX3BhZ2UoZ2l0X2NtZCk7CisJc3RydWN0IHN0cmJ1ZiBwYWdlX3BhdGg7IC8qIGl0IGxlYWtzIGJ1dCB3ZSBleGVjIGJlbGxvdyAqLworCisJZ2V0X2h0bWxfcGFnZV9wYXRoKCZwYWdlX3BhdGgsIHBhZ2UpOworCisJZXhlY2xfZ2l0X2NtZCgid2ViLS1icm93c2UiLCAiLWMiLCAiaGVscC5icm93c2VyIiwgcGFnZV9wYXRoLmJ1ZiwgTlVMTCk7Cit9CisKK3ZvaWQgaGVscF91bmtub3duX2NtZChjb25zdCBjaGFyICpjbWQpCit7CisJZnByaW50ZihzdGRlcnIsICJnaXQ6ICclcycgaXMgbm90IGEgZ2l0LWNvbW1hbmQuIFNlZSAnZ2l0IC0taGVscCcuXG4iLCBjbWQpOworCWV4aXQoMSk7Cit9CisKK2ludCBjbWRfdmVyc2lvbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlwcmludGYoImdpdCB2ZXJzaW9uICVzXG4iLCBnaXRfdmVyc2lvbl9zdHJpbmcpOworCXJldHVybiAwOworfQorCitpbnQgY21kX2hlbHAoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IG5vbmdpdDsKKwljb25zdCBjaGFyICphbGlhczsKKworCXNldHVwX2dpdF9kaXJlY3RvcnlfZ2VudGx5KCZub25naXQpOworCWdpdF9jb25maWcoZ2l0X2hlbHBfY29uZmlnKTsKKworCWFyZ2MgPSBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIGJ1aWx0aW5faGVscF9vcHRpb25zLAorCQkJYnVpbHRpbl9oZWxwX3VzYWdlLCAwKTsKKworCWlmIChzaG93X2FsbCkgeworCQlwcmludGYoInVzYWdlOiAlc1xuXG4iLCBnaXRfdXNhZ2Vfc3RyaW5nKTsKKwkJbGlzdF9jb21tYW5kcygpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWFyZ3ZbMF0pIHsKKwkJcHJpbnRmKCJ1c2FnZTogJXNcblxuIiwgZ2l0X3VzYWdlX3N0cmluZyk7CisJCWxpc3RfY29tbW9uX2NtZHNfaGVscCgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlhbGlhcyA9IGFsaWFzX2xvb2t1cChhcmd2WzBdKTsKKwlpZiAoYWxpYXMgJiYgIWlzX2dpdF9jb21tYW5kKGFyZ3ZbMF0pKSB7CisJCXByaW50ZigiYGdpdCAlcycgaXMgYWxpYXNlZCB0byBgJXMnXG4iLCBhcmd2WzBdLCBhbGlhcyk7CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAoaGVscF9mb3JtYXQpIHsKKwljYXNlIEhFTFBfRk9STUFUX01BTjoKKwkJc2hvd19tYW5fcGFnZShhcmd2WzBdKTsKKwkJYnJlYWs7CisJY2FzZSBIRUxQX0ZPUk1BVF9JTkZPOgorCQlzaG93X2luZm9fcGFnZShhcmd2WzBdKTsKKwkJYnJlYWs7CisJY2FzZSBIRUxQX0ZPUk1BVF9XRUI6CisJCXNob3dfaHRtbF9wYWdlKGFyZ3ZbMF0pOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2h0dHAtcHVzaC5jIGIvaHR0cC1wdXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIyMzAzOAotLS0gL2Rldi9udWxsCisrKyBiL2h0dHAtcHVzaC5jCkBAIC0wLDAgKzEsMjQ1NyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAicGFjay5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJodHRwLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisjaW5jbHVkZSAicmVtb3RlLmgiCisKKyNpbmNsdWRlIDxleHBhdC5oPgorCitzdGF0aWMgY29uc3QgY2hhciBodHRwX3B1c2hfdXNhZ2VbXSA9CisiZ2l0LWh0dHAtcHVzaCBbLS1hbGxdIFstLWRyeS1ydW5dIFstLWZvcmNlXSBbLS12ZXJib3NlXSA8cmVtb3RlPiBbPGhlYWQ+Li4uXVxuIjsKKworI2lmbmRlZiBYTUxfU1RBVFVTX09LCitlbnVtIFhNTF9TdGF0dXMgeworICBYTUxfU1RBVFVTX09LID0gMSwKKyAgWE1MX1NUQVRVU19FUlJPUiA9IDAKK307CisjZGVmaW5lIFhNTF9TVEFUVVNfT0sgICAgMQorI2RlZmluZSBYTUxfU1RBVFVTX0VSUk9SIDAKKyNlbmRpZgorCisjZGVmaW5lIFBSRVZfQlVGX1NJWkUgNDA5NgorI2RlZmluZSBSQU5HRV9IRUFERVJfU0laRSAzMAorCisvKiBEQVYgbWV0aG9kcyAqLworI2RlZmluZSBEQVZfTE9DSyAiTE9DSyIKKyNkZWZpbmUgREFWX01LQ09MICJNS0NPTCIKKyNkZWZpbmUgREFWX01PVkUgIk1PVkUiCisjZGVmaW5lIERBVl9QUk9QRklORCAiUFJPUEZJTkQiCisjZGVmaW5lIERBVl9QVVQgIlBVVCIKKyNkZWZpbmUgREFWX1VOTE9DSyAiVU5MT0NLIgorI2RlZmluZSBEQVZfREVMRVRFICJERUxFVEUiCisKKy8qIERBViBsb2NrIGZsYWdzICovCisjZGVmaW5lIERBVl9QUk9QX0xPQ0tXUiAoMXUgPDwgMCkKKyNkZWZpbmUgREFWX1BST1BfTE9DS0VYICgxdSA8PCAxKQorI2RlZmluZSBEQVZfTE9DS19PSyAoMXUgPDwgMikKKworLyogREFWIFhNTCBwcm9wZXJ0aWVzICovCisjZGVmaW5lIERBVl9DVFhfTE9DS0VOVFJZICIubXVsdGlzdGF0dXMucmVzcG9uc2UucHJvcHN0YXQucHJvcC5zdXBwb3J0ZWRsb2NrLmxvY2tlbnRyeSIKKyNkZWZpbmUgREFWX0NUWF9MT0NLVFlQRV9XUklURSAiLm11bHRpc3RhdHVzLnJlc3BvbnNlLnByb3BzdGF0LnByb3Auc3VwcG9ydGVkbG9jay5sb2NrZW50cnkubG9ja3R5cGUud3JpdGUiCisjZGVmaW5lIERBVl9DVFhfTE9DS1RZUEVfRVhDTFVTSVZFICIubXVsdGlzdGF0dXMucmVzcG9uc2UucHJvcHN0YXQucHJvcC5zdXBwb3J0ZWRsb2NrLmxvY2tlbnRyeS5sb2Nrc2NvcGUuZXhjbHVzaXZlIgorI2RlZmluZSBEQVZfQUNUSVZFTE9DS19PV05FUiAiLnByb3AubG9ja2Rpc2NvdmVyeS5hY3RpdmVsb2NrLm93bmVyLmhyZWYiCisjZGVmaW5lIERBVl9BQ1RJVkVMT0NLX1RJTUVPVVQgIi5wcm9wLmxvY2tkaXNjb3ZlcnkuYWN0aXZlbG9jay50aW1lb3V0IgorI2RlZmluZSBEQVZfQUNUSVZFTE9DS19UT0tFTiAiLnByb3AubG9ja2Rpc2NvdmVyeS5hY3RpdmVsb2NrLmxvY2t0b2tlbi5ocmVmIgorI2RlZmluZSBEQVZfUFJPUEZJTkRfUkVTUCAiLm11bHRpc3RhdHVzLnJlc3BvbnNlIgorI2RlZmluZSBEQVZfUFJPUEZJTkRfTkFNRSAiLm11bHRpc3RhdHVzLnJlc3BvbnNlLmhyZWYiCisjZGVmaW5lIERBVl9QUk9QRklORF9DT0xMRUNUSU9OICIubXVsdGlzdGF0dXMucmVzcG9uc2UucHJvcHN0YXQucHJvcC5yZXNvdXJjZXR5cGUuY29sbGVjdGlvbiIKKworLyogREFWIHJlcXVlc3QgYm9keSB0ZW1wbGF0ZXMgKi8KKyNkZWZpbmUgUFJPUEZJTkRfU1VQUE9SVEVETE9DS19SRVFVRVNUICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJ1dGYtOFwiID8+XG48RDpwcm9wZmluZCB4bWxuczpEPVwiREFWOlwiPlxuPEQ6cHJvcCB4bWxuczpSPVwiJXNcIj5cbjxEOnN1cHBvcnRlZGxvY2svPlxuPC9EOnByb3A+XG48L0Q6cHJvcGZpbmQ+IgorI2RlZmluZSBQUk9QRklORF9BTExfUkVRVUVTVCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwidXRmLThcIiA/PlxuPEQ6cHJvcGZpbmQgeG1sbnM6RD1cIkRBVjpcIj5cbjxEOmFsbHByb3AvPlxuPC9EOnByb3BmaW5kPiIKKyNkZWZpbmUgTE9DS19SRVFVRVNUICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJ1dGYtOFwiID8+XG48RDpsb2NraW5mbyB4bWxuczpEPVwiREFWOlwiPlxuPEQ6bG9ja3Njb3BlPjxEOmV4Y2x1c2l2ZS8+PC9EOmxvY2tzY29wZT5cbjxEOmxvY2t0eXBlPjxEOndyaXRlLz48L0Q6bG9ja3R5cGU+XG48RDpvd25lcj5cbjxEOmhyZWY+bWFpbHRvOiVzPC9EOmhyZWY+XG48L0Q6b3duZXI+XG48L0Q6bG9ja2luZm8+IgorCisjZGVmaW5lIExPQ0tfVElNRSA2MDAKKyNkZWZpbmUgTE9DS19SRUZSRVNIIDMwCisKKy8qIGJpdHMgIzAtMTUgaW4gcmV2aXNpb24uaCAqLworCisjZGVmaW5lIExPQ0FMICAgICgxdTw8MTYpCisjZGVmaW5lIFJFTU9URSAgICgxdTw8MTcpCisjZGVmaW5lIEZFVENISU5HICgxdTw8MTgpCisjZGVmaW5lIFBVU0hJTkcgICgxdTw8MTkpCisKKy8qIFdlIGFsbG93ICJyZWN1cnNpdmUiIHN5bWJvbGljIHJlZnMuIE9ubHkgd2l0aGluIHJlYXNvbiwgdGhvdWdoICovCisjZGVmaW5lIE1BWERFUFRIIDUKKworc3RhdGljIGludCBwdXNoaW5nOworc3RhdGljIGludCBhYm9ydGVkOworc3RhdGljIHNpZ25lZCBjaGFyIHJlbW90ZV9kaXJfZXhpc3RzWzI1Nl07CisKK3N0YXRpYyBzdHJ1Y3QgY3VybF9zbGlzdCAqbm9fcHJhZ21hX2hlYWRlcjsKKworc3RhdGljIGludCBwdXNoX3ZlcmJvc2VseTsKK3N0YXRpYyBpbnQgcHVzaF9hbGwgPSBNQVRDSF9SRUZTX05PTkU7CitzdGF0aWMgaW50IGZvcmNlX2FsbDsKK3N0YXRpYyBpbnQgZHJ5X3J1bjsKKworc3RhdGljIHN0cnVjdCBvYmplY3RfbGlzdCAqb2JqZWN0czsKKworc3RydWN0IHJlcG8KK3sKKwljaGFyICp1cmw7CisJaW50IHBhdGhfbGVuOworCWludCBoYXNfaW5mb19yZWZzOworCWludCBjYW5fdXBkYXRlX2luZm9fcmVmczsKKwlpbnQgaGFzX2luZm9fcGFja3M7CisJc3RydWN0IHBhY2tlZF9naXQgKnBhY2tzOworCXN0cnVjdCByZW1vdGVfbG9jayAqbG9ja3M7Cit9OworCitzdGF0aWMgc3RydWN0IHJlcG8gKnJlbW90ZTsKKworZW51bSB0cmFuc2Zlcl9zdGF0ZSB7CisJTkVFRF9GRVRDSCwKKwlSVU5fRkVUQ0hfTE9PU0UsCisJUlVOX0ZFVENIX1BBQ0tFRCwKKwlORUVEX1BVU0gsCisJUlVOX01LQ09MLAorCVJVTl9QVVQsCisJUlVOX01PVkUsCisJQUJPUlRFRCwKKwlDT01QTEVURSwKK307CisKK3N0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0Cit7CisJc3RydWN0IG9iamVjdCAqb2JqOworCWNoYXIgKnVybDsKKwljaGFyICpkZXN0OworCXN0cnVjdCByZW1vdGVfbG9jayAqbG9jazsKKwlzdHJ1Y3QgY3VybF9zbGlzdCAqaGVhZGVyczsKKwlzdHJ1Y3QgYnVmZmVyIGJ1ZmZlcjsKKwljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKKwljaGFyIHRtcGZpbGVbUEFUSF9NQVhdOworCWludCBsb2NhbF9maWxlbm87CisJRklMRSAqbG9jYWxfc3RyZWFtOworCWVudW0gdHJhbnNmZXJfc3RhdGUgc3RhdGU7CisJQ1VSTGNvZGUgY3VybF9yZXN1bHQ7CisJY2hhciBlcnJvcnN0cltDVVJMX0VSUk9SX1NJWkVdOworCWxvbmcgaHR0cF9jb2RlOworCXVuc2lnbmVkIGNoYXIgcmVhbF9zaGExWzIwXTsKKwlTSEFfQ1RYIGM7CisJel9zdHJlYW0gc3RyZWFtOworCWludCB6cmV0OworCWludCByZW5hbWU7CisJdm9pZCAqdXNlckRhdGE7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKm5leHQ7Cit9OworCitzdGF0aWMgc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3RfcXVldWVfaGVhZDsKKworc3RydWN0IHhtbF9jdHgKK3sKKwljaGFyICpuYW1lOworCWludCBsZW47CisJY2hhciAqY2RhdGE7CisJdm9pZCAoKnVzZXJGdW5jKShzdHJ1Y3QgeG1sX2N0eCAqY3R4LCBpbnQgdGFnX2Nsb3NlZCk7CisJdm9pZCAqdXNlckRhdGE7Cit9OworCitzdHJ1Y3QgcmVtb3RlX2xvY2sKK3sKKwljaGFyICp1cmw7CisJY2hhciAqb3duZXI7CisJY2hhciAqdG9rZW47CisJdGltZV90IHN0YXJ0X3RpbWU7CisJbG9uZyB0aW1lb3V0OworCWludCByZWZyZXNoaW5nOworCXN0cnVjdCByZW1vdGVfbG9jayAqbmV4dDsKK307CisKKy8qIEZsYWdzIHRoYXQgY29udHJvbCByZW1vdGVfbHMgcHJvY2Vzc2luZyAqLworI2RlZmluZSBQUk9DRVNTX0ZJTEVTICgxdSA8PCAwKQorI2RlZmluZSBQUk9DRVNTX0RJUlMgICgxdSA8PCAxKQorI2RlZmluZSBSRUNVUlNJVkUgICAgICgxdSA8PCAyKQorCisvKiBGbGFncyB0aGF0IHJlbW90ZV9scyBwYXNzZXMgdG8gY2FsbGJhY2sgZnVuY3Rpb25zICovCisjZGVmaW5lIElTX0RJUiAoMXUgPDwgMCkKKworc3RydWN0IHJlbW90ZV9sc19jdHgKK3sKKwljaGFyICpwYXRoOworCXZvaWQgKCp1c2VyRnVuYykoc3RydWN0IHJlbW90ZV9sc19jdHggKmxzKTsKKwl2b2lkICp1c2VyRGF0YTsKKwlpbnQgZmxhZ3M7CisJY2hhciAqZGVudHJ5X25hbWU7CisJaW50IGRlbnRyeV9mbGFnczsKKwlzdHJ1Y3QgcmVtb3RlX2xzX2N0eCAqcGFyZW50OworfTsKKworc3RhdGljIHZvaWQgZmluaXNoX3JlcXVlc3Qoc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QpOworc3RhdGljIHZvaWQgcmVsZWFzZV9yZXF1ZXN0KHN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICpyZXF1ZXN0KTsKKworc3RhdGljIHZvaWQgcHJvY2Vzc19yZXNwb25zZSh2b2lkICpjYWxsYmFja19kYXRhKQoreworCXN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICpyZXF1ZXN0ID0KKwkJKHN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICopY2FsbGJhY2tfZGF0YTsKKworCWZpbmlzaF9yZXF1ZXN0KHJlcXVlc3QpOworfQorCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKK3N0YXRpYyBzaXplX3QgZndyaXRlX3NoYTFfZmlsZSh2b2lkICpwdHIsIHNpemVfdCBlbHRzaXplLCBzaXplX3Qgbm1lbWIsCisJCQkgICAgICAgdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBjaGFyIGV4cG5bNDA5Nl07CisJc2l6ZV90IHNpemUgPSBlbHRzaXplICogbm1lbWI7CisJaW50IHBvc24gPSAwOworCXN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICpyZXF1ZXN0ID0gKHN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICopZGF0YTsKKwlkbyB7CisJCXNzaXplX3QgcmV0dmFsID0geHdyaXRlKHJlcXVlc3QtPmxvY2FsX2ZpbGVubywKKwkJCQkgICAgICAgKGNoYXIgKikgcHRyICsgcG9zbiwgc2l6ZSAtIHBvc24pOworCQlpZiAocmV0dmFsIDwgMCkKKwkJCXJldHVybiBwb3NuOworCQlwb3NuICs9IHJldHZhbDsKKwl9IHdoaWxlIChwb3NuIDwgc2l6ZSk7CisKKwlyZXF1ZXN0LT5zdHJlYW0uYXZhaWxfaW4gPSBzaXplOworCXJlcXVlc3QtPnN0cmVhbS5uZXh0X2luID0gcHRyOworCWRvIHsKKwkJcmVxdWVzdC0+c3RyZWFtLm5leHRfb3V0ID0gZXhwbjsKKwkJcmVxdWVzdC0+c3RyZWFtLmF2YWlsX291dCA9IHNpemVvZihleHBuKTsKKwkJcmVxdWVzdC0+enJldCA9IGluZmxhdGUoJnJlcXVlc3QtPnN0cmVhbSwgWl9TWU5DX0ZMVVNIKTsKKwkJU0hBMV9VcGRhdGUoJnJlcXVlc3QtPmMsIGV4cG4sCisJCQkgICAgc2l6ZW9mKGV4cG4pIC0gcmVxdWVzdC0+c3RyZWFtLmF2YWlsX291dCk7CisJfSB3aGlsZSAocmVxdWVzdC0+c3RyZWFtLmF2YWlsX2luICYmIHJlcXVlc3QtPnpyZXQgPT0gWl9PSyk7CisJZGF0YV9yZWNlaXZlZCsrOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9mZXRjaF9sb29zZShzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdCkKK3sKKwljaGFyICpoZXggPSBzaGExX3RvX2hleChyZXF1ZXN0LT5vYmotPnNoYTEpOworCWNoYXIgKmZpbGVuYW1lOworCWNoYXIgcHJldmZpbGVbUEFUSF9NQVhdOworCWNoYXIgKnVybDsKKwljaGFyICpwb3NuOworCWludCBwcmV2bG9jYWw7CisJdW5zaWduZWQgY2hhciBwcmV2X2J1ZltQUkVWX0JVRl9TSVpFXTsKKwlzc2l6ZV90IHByZXZfcmVhZCA9IDA7CisJbG9uZyBwcmV2X3Bvc24gPSAwOworCWNoYXIgcmFuZ2VbUkFOR0VfSEVBREVSX1NJWkVdOworCXN0cnVjdCBjdXJsX3NsaXN0ICpyYW5nZV9oZWFkZXIgPSBOVUxMOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCisJZmlsZW5hbWUgPSBzaGExX2ZpbGVfbmFtZShyZXF1ZXN0LT5vYmotPnNoYTEpOworCXNucHJpbnRmKHJlcXVlc3QtPmZpbGVuYW1lLCBzaXplb2YocmVxdWVzdC0+ZmlsZW5hbWUpLCAiJXMiLCBmaWxlbmFtZSk7CisJc25wcmludGYocmVxdWVzdC0+dG1wZmlsZSwgc2l6ZW9mKHJlcXVlc3QtPnRtcGZpbGUpLAorCQkgIiVzLnRlbXAiLCBmaWxlbmFtZSk7CisKKwlzbnByaW50ZihwcmV2ZmlsZSwgc2l6ZW9mKHByZXZmaWxlKSwgIiVzLnByZXYiLCByZXF1ZXN0LT5maWxlbmFtZSk7CisJdW5saW5rKHByZXZmaWxlKTsKKwlyZW5hbWUocmVxdWVzdC0+dG1wZmlsZSwgcHJldmZpbGUpOworCXVubGluayhyZXF1ZXN0LT50bXBmaWxlKTsKKworCWlmIChyZXF1ZXN0LT5sb2NhbF9maWxlbm8gIT0gLTEpCisJCWVycm9yKCJmZCBsZWFrYWdlIGluIHN0YXJ0OiAlZCIsIHJlcXVlc3QtPmxvY2FsX2ZpbGVubyk7CisJcmVxdWVzdC0+bG9jYWxfZmlsZW5vID0gb3BlbihyZXF1ZXN0LT50bXBmaWxlLAorCQkJCSAgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMLCAwNjY2KTsKKwkvKiBUaGlzIGNvdWxkIGhhdmUgZmFpbGVkIGR1ZSB0byB0aGUgImxhenkgZGlyZWN0b3J5IGNyZWF0aW9uIjsKKwkgKiB0cnkgdG8gbWtkaXIgdGhlIGxhc3QgcGF0aCBjb21wb25lbnQuCisJICovCisJaWYgKHJlcXVlc3QtPmxvY2FsX2ZpbGVubyA8IDAgJiYgZXJybm8gPT0gRU5PRU5UKSB7CisJCWNoYXIgKmRpciA9IHN0cnJjaHIocmVxdWVzdC0+dG1wZmlsZSwgJy8nKTsKKwkJaWYgKGRpcikgeworCQkJKmRpciA9IDA7CisJCQlta2RpcihyZXF1ZXN0LT50bXBmaWxlLCAwNzc3KTsKKwkJCSpkaXIgPSAnLyc7CisJCX0KKwkJcmVxdWVzdC0+bG9jYWxfZmlsZW5vID0gb3BlbihyZXF1ZXN0LT50bXBmaWxlLAorCQkJCQkgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCwgMDY2Nik7CisJfQorCisJaWYgKHJlcXVlc3QtPmxvY2FsX2ZpbGVubyA8IDApIHsKKwkJcmVxdWVzdC0+c3RhdGUgPSBBQk9SVEVEOworCQllcnJvcigiQ291bGRuJ3QgY3JlYXRlIHRlbXBvcmFyeSBmaWxlICVzIGZvciAlczogJXMiLAorCQkgICAgICByZXF1ZXN0LT50bXBmaWxlLCByZXF1ZXN0LT5maWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuOworCX0KKworCW1lbXNldCgmcmVxdWVzdC0+c3RyZWFtLCAwLCBzaXplb2YocmVxdWVzdC0+c3RyZWFtKSk7CisKKwlpbmZsYXRlSW5pdCgmcmVxdWVzdC0+c3RyZWFtKTsKKworCVNIQTFfSW5pdCgmcmVxdWVzdC0+Yyk7CisKKwl1cmwgPSB4bWFsbG9jKHN0cmxlbihyZW1vdGUtPnVybCkgKyA1MCk7CisJcmVxdWVzdC0+dXJsID0geG1hbGxvYyhzdHJsZW4ocmVtb3RlLT51cmwpICsgNTApOworCXN0cmNweSh1cmwsIHJlbW90ZS0+dXJsKTsKKwlwb3NuID0gdXJsICsgc3RybGVuKHJlbW90ZS0+dXJsKTsKKwlzdHJjcHkocG9zbiwgIm9iamVjdHMvIik7CisJcG9zbiArPSA4OworCW1lbWNweShwb3NuLCBoZXgsIDIpOworCXBvc24gKz0gMjsKKwkqKHBvc24rKykgPSAnLyc7CisJc3RyY3B5KHBvc24sIGhleCArIDIpOworCXN0cmNweShyZXF1ZXN0LT51cmwsIHVybCk7CisKKwkvKiBJZiBhIHByZXZpb3VzIHRlbXAgZmlsZSBpcyBwcmVzZW50LCBwcm9jZXNzIHdoYXQgd2FzIGFscmVhZHkKKwkgICBmZXRjaGVkLiAqLworCXByZXZsb2NhbCA9IG9wZW4ocHJldmZpbGUsIE9fUkRPTkxZKTsKKwlpZiAocHJldmxvY2FsICE9IC0xKSB7CisJCWRvIHsKKwkJCXByZXZfcmVhZCA9IHhyZWFkKHByZXZsb2NhbCwgcHJldl9idWYsIFBSRVZfQlVGX1NJWkUpOworCQkJaWYgKHByZXZfcmVhZD4wKSB7CisJCQkJaWYgKGZ3cml0ZV9zaGExX2ZpbGUocHJldl9idWYsCisJCQkJCQkgICAgIDEsCisJCQkJCQkgICAgIHByZXZfcmVhZCwKKwkJCQkJCSAgICAgcmVxdWVzdCkgPT0gcHJldl9yZWFkKSB7CisJCQkJCXByZXZfcG9zbiArPSBwcmV2X3JlYWQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJldl9yZWFkID0gLTE7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlIChwcmV2X3JlYWQgPiAwKTsKKwkJY2xvc2UocHJldmxvY2FsKTsKKwl9CisJdW5saW5rKHByZXZmaWxlKTsKKworCS8qIFJlc2V0IGluZmxhdGUvU0hBMSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyB0aGUgcHJldmlvdXMgdGVtcAorCSAgIGZpbGU7IGFsc28gcmV3aW5kIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxvY2FsIGZpbGUuICovCisJaWYgKHByZXZfcmVhZCA9PSAtMSkgeworCQltZW1zZXQoJnJlcXVlc3QtPnN0cmVhbSwgMCwgc2l6ZW9mKHJlcXVlc3QtPnN0cmVhbSkpOworCQlpbmZsYXRlSW5pdCgmcmVxdWVzdC0+c3RyZWFtKTsKKwkJU0hBMV9Jbml0KCZyZXF1ZXN0LT5jKTsKKwkJaWYgKHByZXZfcG9zbj4wKSB7CisJCQlwcmV2X3Bvc24gPSAwOworCQkJbHNlZWsocmVxdWVzdC0+bG9jYWxfZmlsZW5vLCAwLCBTRUVLX1NFVCk7CisJCQlmdHJ1bmNhdGUocmVxdWVzdC0+bG9jYWxfZmlsZW5vLCAwKTsKKwkJfQorCX0KKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5jYWxsYmFja19mdW5jID0gcHJvY2Vzc19yZXNwb25zZTsKKwlzbG90LT5jYWxsYmFja19kYXRhID0gcmVxdWVzdDsKKwlyZXF1ZXN0LT5zbG90ID0gc2xvdDsKKworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCByZXF1ZXN0KTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX3NoYTFfZmlsZSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0VSUk9SQlVGRkVSLCByZXF1ZXN0LT5lcnJvcnN0cik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgbm9fcHJhZ21hX2hlYWRlcik7CisKKwkvKiBJZiB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgZGF0YSBmcm9tIGEgcHJldmlvdXMgZmV0Y2gKKwkgICBhdHRlbXB0LCBvbmx5IGZldGNoIHRoZSBkYXRhIHdlIGRvbid0IGFscmVhZHkgaGF2ZS4gKi8KKwlpZiAocHJldl9wb3NuPjApIHsKKwkJaWYgKHB1c2hfdmVyYm9zZWx5KQorCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlJlc3VtaW5nIGZldGNoIG9mIG9iamVjdCAlcyBhdCBieXRlICVsZFxuIiwKKwkJCQloZXgsIHByZXZfcG9zbik7CisJCXNwcmludGYocmFuZ2UsICJSYW5nZTogYnl0ZXM9JWxkLSIsIHByZXZfcG9zbik7CisJCXJhbmdlX2hlYWRlciA9IGN1cmxfc2xpc3RfYXBwZW5kKHJhbmdlX2hlYWRlciwgcmFuZ2UpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsCisJCQkJIENVUkxPUFRfSFRUUEhFQURFUiwgcmFuZ2VfaGVhZGVyKTsKKwl9CisKKwkvKiBUcnkgdG8gZ2V0IHRoZSByZXF1ZXN0IHN0YXJ0ZWQsIGFib3J0IHRoZSByZXF1ZXN0IG9uIGVycm9yICovCisJcmVxdWVzdC0+c3RhdGUgPSBSVU5fRkVUQ0hfTE9PU0U7CisJaWYgKCFzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBzdGFydCBHRVQgcmVxdWVzdFxuIik7CisJCXJlbW90ZS0+Y2FuX3VwZGF0ZV9pbmZvX3JlZnMgPSAwOworCQlyZWxlYXNlX3JlcXVlc3QocmVxdWVzdCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdGFydF9ta2NvbChzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdCkKK3sKKwljaGFyICpoZXggPSBzaGExX3RvX2hleChyZXF1ZXN0LT5vYmotPnNoYTEpOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCWNoYXIgKnBvc247CisKKwlyZXF1ZXN0LT51cmwgPSB4bWFsbG9jKHN0cmxlbihyZW1vdGUtPnVybCkgKyAxMyk7CisJc3RyY3B5KHJlcXVlc3QtPnVybCwgcmVtb3RlLT51cmwpOworCXBvc24gPSByZXF1ZXN0LT51cmwgKyBzdHJsZW4ocmVtb3RlLT51cmwpOworCXN0cmNweShwb3NuLCAib2JqZWN0cy8iKTsKKwlwb3NuICs9IDg7CisJbWVtY3B5KHBvc24sIGhleCwgMik7CisJcG9zbiArPSAyOworCXN0cmNweShwb3NuLCAiLyIpOworCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPmNhbGxiYWNrX2Z1bmMgPSBwcm9jZXNzX3Jlc3BvbnNlOworCXNsb3QtPmNhbGxiYWNrX2RhdGEgPSByZXF1ZXN0OworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQR0VULCAxKTsgLyogdW5kbyBQVVQgc2V0dXAgKi8KKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCByZXF1ZXN0LT51cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9FUlJPUkJVRkZFUiwgcmVxdWVzdC0+ZXJyb3JzdHIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBEQVZfTUtDT0wpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfbnVsbCk7CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcmVxdWVzdC0+c2xvdCA9IHNsb3Q7CisJCXJlcXVlc3QtPnN0YXRlID0gUlVOX01LQ09MOworCX0gZWxzZSB7CisJCXJlcXVlc3QtPnN0YXRlID0gQUJPUlRFRDsKKwkJZnJlZShyZXF1ZXN0LT51cmwpOworCQlyZXF1ZXN0LT51cmwgPSBOVUxMOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzdGFydF9mZXRjaF9wYWNrZWQoc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QpCit7CisJY2hhciAqdXJsOworCXN0cnVjdCBwYWNrZWRfZ2l0ICp0YXJnZXQ7CisJRklMRSAqcGFja2ZpbGU7CisJY2hhciAqZmlsZW5hbWU7CisJbG9uZyBwcmV2X3Bvc24gPSAwOworCWNoYXIgcmFuZ2VbUkFOR0VfSEVBREVSX1NJWkVdOworCXN0cnVjdCBjdXJsX3NsaXN0ICpyYW5nZV9oZWFkZXIgPSBOVUxMOworCisJc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKmNoZWNrX3JlcXVlc3QgPSByZXF1ZXN0X3F1ZXVlX2hlYWQ7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisKKwl0YXJnZXQgPSBmaW5kX3NoYTFfcGFjayhyZXF1ZXN0LT5vYmotPnNoYTEsIHJlbW90ZS0+cGFja3MpOworCWlmICghdGFyZ2V0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGZldGNoICVzLCB3aWxsIG5vdCBiZSBhYmxlIHRvIHVwZGF0ZSBzZXJ2ZXIgaW5mbyByZWZzXG4iLCBzaGExX3RvX2hleChyZXF1ZXN0LT5vYmotPnNoYTEpKTsKKwkJcmVtb3RlLT5jYW5fdXBkYXRlX2luZm9fcmVmcyA9IDA7CisJCXJlbGVhc2VfcmVxdWVzdChyZXF1ZXN0KTsKKwkJcmV0dXJuOworCX0KKworCWZwcmludGYoc3RkZXJyLAkiRmV0Y2hpbmcgcGFjayAlc1xuIiwgc2hhMV90b19oZXgodGFyZ2V0LT5zaGExKSk7CisJZnByaW50ZihzdGRlcnIsICIgd2hpY2ggY29udGFpbnMgJXNcbiIsIHNoYTFfdG9faGV4KHJlcXVlc3QtPm9iai0+c2hhMSkpOworCisJZmlsZW5hbWUgPSBzaGExX3BhY2tfbmFtZSh0YXJnZXQtPnNoYTEpOworCXNucHJpbnRmKHJlcXVlc3QtPmZpbGVuYW1lLCBzaXplb2YocmVxdWVzdC0+ZmlsZW5hbWUpLCAiJXMiLCBmaWxlbmFtZSk7CisJc25wcmludGYocmVxdWVzdC0+dG1wZmlsZSwgc2l6ZW9mKHJlcXVlc3QtPnRtcGZpbGUpLAorCQkgIiVzLnRlbXAiLCBmaWxlbmFtZSk7CisKKwl1cmwgPSB4bWFsbG9jKHN0cmxlbihyZW1vdGUtPnVybCkgKyA2NCk7CisJc3ByaW50Zih1cmwsICIlc29iamVjdHMvcGFjay9wYWNrLSVzLnBhY2siLAorCQlyZW1vdGUtPnVybCwgc2hhMV90b19oZXgodGFyZ2V0LT5zaGExKSk7CisKKwkvKiBNYWtlIHN1cmUgdGhlcmUgaXNuJ3QgYW5vdGhlciBvcGVuIHJlcXVlc3QgZm9yIHRoaXMgcGFjayAqLworCXdoaWxlIChjaGVja19yZXF1ZXN0KSB7CisJCWlmIChjaGVja19yZXF1ZXN0LT5zdGF0ZSA9PSBSVU5fRkVUQ0hfUEFDS0VEICYmCisJCSAgICAhc3RyY21wKGNoZWNrX3JlcXVlc3QtPnVybCwgdXJsKSkgeworCQkJZnJlZSh1cmwpOworCQkJcmVsZWFzZV9yZXF1ZXN0KHJlcXVlc3QpOworCQkJcmV0dXJuOworCQl9CisJCWNoZWNrX3JlcXVlc3QgPSBjaGVja19yZXF1ZXN0LT5uZXh0OworCX0KKworCXBhY2tmaWxlID0gZm9wZW4ocmVxdWVzdC0+dG1wZmlsZSwgImEiKTsKKwlpZiAoIXBhY2tmaWxlKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIG9wZW4gbG9jYWwgZmlsZSAlcyBmb3IgcGFjayIsCisJCQlyZXF1ZXN0LT50bXBmaWxlKTsKKwkJcmVtb3RlLT5jYW5fdXBkYXRlX2luZm9fcmVmcyA9IDA7CisJCWZyZWUodXJsKTsKKwkJcmV0dXJuOworCX0KKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5jYWxsYmFja19mdW5jID0gcHJvY2Vzc19yZXNwb25zZTsKKwlzbG90LT5jYWxsYmFja19kYXRhID0gcmVxdWVzdDsKKwlyZXF1ZXN0LT5zbG90ID0gc2xvdDsKKwlyZXF1ZXN0LT5sb2NhbF9zdHJlYW0gPSBwYWNrZmlsZTsKKwlyZXF1ZXN0LT51c2VyRGF0YSA9IHRhcmdldDsKKworCXJlcXVlc3QtPnVybCA9IHVybDsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfRklMRSwgcGFja2ZpbGUpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGUpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIG5vX3ByYWdtYV9oZWFkZXIpOworCXNsb3QtPmxvY2FsID0gcGFja2ZpbGU7CisKKwkvKiBJZiB0aGVyZSBpcyBkYXRhIHByZXNlbnQgZnJvbSBhIHByZXZpb3VzIHRyYW5zZmVyIGF0dGVtcHQsCisJICAgcmVzdW1lIHdoZXJlIGl0IGxlZnQgb2ZmICovCisJcHJldl9wb3NuID0gZnRlbGwocGFja2ZpbGUpOworCWlmIChwcmV2X3Bvc24+MCkgeworCQlpZiAocHVzaF92ZXJib3NlbHkpCisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiUmVzdW1pbmcgZmV0Y2ggb2YgcGFjayAlcyBhdCBieXRlICVsZFxuIiwKKwkJCQlzaGExX3RvX2hleCh0YXJnZXQtPnNoYTEpLCBwcmV2X3Bvc24pOworCQlzcHJpbnRmKHJhbmdlLCAiUmFuZ2U6IGJ5dGVzPSVsZC0iLCBwcmV2X3Bvc24pOworCQlyYW5nZV9oZWFkZXIgPSBjdXJsX3NsaXN0X2FwcGVuZChyYW5nZV9oZWFkZXIsIHJhbmdlKTsKKwkJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIHJhbmdlX2hlYWRlcik7CisJfQorCisJLyogVHJ5IHRvIGdldCB0aGUgcmVxdWVzdCBzdGFydGVkLCBhYm9ydCB0aGUgcmVxdWVzdCBvbiBlcnJvciAqLworCXJlcXVlc3QtPnN0YXRlID0gUlVOX0ZFVENIX1BBQ0tFRDsKKwlpZiAoIXN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIHN0YXJ0IEdFVCByZXF1ZXN0XG4iKTsKKwkJcmVtb3RlLT5jYW5fdXBkYXRlX2luZm9fcmVmcyA9IDA7CisJCXJlbGVhc2VfcmVxdWVzdChyZXF1ZXN0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X3B1dChzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdCkKK3sKKwljaGFyICpoZXggPSBzaGExX3RvX2hleChyZXF1ZXN0LT5vYmotPnNoYTEpOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCWNoYXIgKnBvc247CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCWNoYXIgaGRyWzUwXTsKKwl2b2lkICp1bnBhY2tlZDsKKwl1bnNpZ25lZCBsb25nIGxlbjsKKwlpbnQgaGRybGVuOworCXNzaXplX3Qgc2l6ZTsKKwl6X3N0cmVhbSBzdHJlYW07CisKKwl1bnBhY2tlZCA9IHJlYWRfc2hhMV9maWxlKHJlcXVlc3QtPm9iai0+c2hhMSwgJnR5cGUsICZsZW4pOworCWhkcmxlbiA9IHNwcmludGYoaGRyLCAiJXMgJWx1IiwgdHlwZW5hbWUodHlwZSksIGxlbikgKyAxOworCisJLyogU2V0IGl0IHVwICovCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlkZWZsYXRlSW5pdCgmc3RyZWFtLCB6bGliX2NvbXByZXNzaW9uX2xldmVsKTsKKwlzaXplID0gZGVmbGF0ZUJvdW5kKCZzdHJlYW0sIGxlbiArIGhkcmxlbik7CisJc3RyYnVmX2luaXQoJnJlcXVlc3QtPmJ1ZmZlci5idWYsIHNpemUpOworCXJlcXVlc3QtPmJ1ZmZlci5wb3NuID0gMDsKKworCS8qIENvbXByZXNzIGl0ICovCisJc3RyZWFtLm5leHRfb3V0ID0gKHVuc2lnbmVkIGNoYXIgKilyZXF1ZXN0LT5idWZmZXIuYnVmLmJ1ZjsKKwlzdHJlYW0uYXZhaWxfb3V0ID0gc2l6ZTsKKworCS8qIEZpcnN0IGhlYWRlci4uICovCisJc3RyZWFtLm5leHRfaW4gPSAodm9pZCAqKWhkcjsKKwlzdHJlYW0uYXZhaWxfaW4gPSBoZHJsZW47CisJd2hpbGUgKGRlZmxhdGUoJnN0cmVhbSwgMCkgPT0gWl9PSykKKwkJLyogbm90aGluZyAqLzsKKworCS8qIFRoZW4gdGhlIGRhdGEgaXRzZWxmLi4gKi8KKwlzdHJlYW0ubmV4dF9pbiA9IHVucGFja2VkOworCXN0cmVhbS5hdmFpbF9pbiA9IGxlbjsKKwl3aGlsZSAoZGVmbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCkgPT0gWl9PSykKKwkJLyogbm90aGluZyAqLzsKKwlkZWZsYXRlRW5kKCZzdHJlYW0pOworCWZyZWUodW5wYWNrZWQpOworCisJcmVxdWVzdC0+YnVmZmVyLmJ1Zi5sZW4gPSBzdHJlYW0udG90YWxfb3V0OworCisJcmVxdWVzdC0+dXJsID0geG1hbGxvYyhzdHJsZW4ocmVtb3RlLT51cmwpICsKKwkJCSAgICAgICBzdHJsZW4ocmVxdWVzdC0+bG9jay0+dG9rZW4pICsgNTEpOworCXN0cmNweShyZXF1ZXN0LT51cmwsIHJlbW90ZS0+dXJsKTsKKwlwb3NuID0gcmVxdWVzdC0+dXJsICsgc3RybGVuKHJlbW90ZS0+dXJsKTsKKwlzdHJjcHkocG9zbiwgIm9iamVjdHMvIik7CisJcG9zbiArPSA4OworCW1lbWNweShwb3NuLCBoZXgsIDIpOworCXBvc24gKz0gMjsKKwkqKHBvc24rKykgPSAnLyc7CisJc3RyY3B5KHBvc24sIGhleCArIDIpOworCXJlcXVlc3QtPmRlc3QgPSB4bWFsbG9jKHN0cmxlbihyZXF1ZXN0LT51cmwpICsgMTQpOworCXNwcmludGYocmVxdWVzdC0+ZGVzdCwgIkRlc3RpbmF0aW9uOiAlcyIsIHJlcXVlc3QtPnVybCk7CisJcG9zbiArPSAzODsKKwkqKHBvc24rKykgPSAnXyc7CisJc3RyY3B5KHBvc24sIHJlcXVlc3QtPmxvY2stPnRva2VuKTsKKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5jYWxsYmFja19mdW5jID0gcHJvY2Vzc19yZXNwb25zZTsKKwlzbG90LT5jYWxsYmFja19kYXRhID0gcmVxdWVzdDsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSU5GSUxFLCAmcmVxdWVzdC0+YnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSU5GSUxFU0laRSwgcmVxdWVzdC0+YnVmZmVyLmJ1Zi5sZW4pOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9SRUFERlVOQ1RJT04sIGZyZWFkX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZV9udWxsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgREFWX1BVVCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VQTE9BRCwgMSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1BVVCwgMSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX05PQk9EWSwgMCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgcmVxdWVzdC0+dXJsKTsKKworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlyZXF1ZXN0LT5zbG90ID0gc2xvdDsKKwkJcmVxdWVzdC0+c3RhdGUgPSBSVU5fUFVUOworCX0gZWxzZSB7CisJCXJlcXVlc3QtPnN0YXRlID0gQUJPUlRFRDsKKwkJZnJlZShyZXF1ZXN0LT51cmwpOworCQlyZXF1ZXN0LT51cmwgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgc3RhcnRfbW92ZShzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdCkKK3sKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3QgY3VybF9zbGlzdCAqZGF2X2hlYWRlcnMgPSBOVUxMOworCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPmNhbGxiYWNrX2Z1bmMgPSBwcm9jZXNzX3Jlc3BvbnNlOworCXNsb3QtPmNhbGxiYWNrX2RhdGEgPSByZXF1ZXN0OworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQR0VULCAxKTsgLyogdW5kbyBQVVQgc2V0dXAgKi8KKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgREFWX01PVkUpOworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsIHJlcXVlc3QtPmRlc3QpOworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsICJPdmVyd3JpdGU6IFQiKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgZGF2X2hlYWRlcnMpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfbnVsbCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgcmVxdWVzdC0+dXJsKTsKKworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlyZXF1ZXN0LT5zbG90ID0gc2xvdDsKKwkJcmVxdWVzdC0+c3RhdGUgPSBSVU5fTU9WRTsKKwl9IGVsc2UgeworCQlyZXF1ZXN0LT5zdGF0ZSA9IEFCT1JURUQ7CisJCWZyZWUocmVxdWVzdC0+dXJsKTsKKwkJcmVxdWVzdC0+dXJsID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmVmcmVzaF9sb2NrKHN0cnVjdCByZW1vdGVfbG9jayAqbG9jaykKK3sKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisJY2hhciAqaWZfaGVhZGVyOworCWNoYXIgdGltZW91dF9oZWFkZXJbMjVdOworCXN0cnVjdCBjdXJsX3NsaXN0ICpkYXZfaGVhZGVycyA9IE5VTEw7CisJaW50IHJjID0gMDsKKworCWxvY2stPnJlZnJlc2hpbmcgPSAxOworCisJaWZfaGVhZGVyID0geG1hbGxvYyhzdHJsZW4obG9jay0+dG9rZW4pICsgMjUpOworCXNwcmludGYoaWZfaGVhZGVyLCAiSWY6ICg8b3BhcXVlbG9ja3Rva2VuOiVzPikiLCBsb2NrLT50b2tlbik7CisJc3ByaW50Zih0aW1lb3V0X2hlYWRlciwgIlRpbWVvdXQ6IFNlY29uZC0lbGQiLCBsb2NrLT50aW1lb3V0KTsKKwlkYXZfaGVhZGVycyA9IGN1cmxfc2xpc3RfYXBwZW5kKGRhdl9oZWFkZXJzLCBpZl9oZWFkZXIpOworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsIHRpbWVvdXRfaGVhZGVyKTsKKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBHRVQsIDEpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfbnVsbCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgbG9jay0+dXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgREFWX0xPQ0spOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBkYXZfaGVhZGVycyk7CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQkJZnByaW50ZihzdGRlcnIsICJMT0NLIEhUVFAgZXJyb3IgJWxkXG4iLAorCQkJCXJlc3VsdHMuaHR0cF9jb2RlKTsKKwkJfSBlbHNlIHsKKwkJCWxvY2stPnN0YXJ0X3RpbWUgPSB0aW1lKE5VTEwpOworCQkJcmMgPSAxOworCQl9CisJfQorCisJbG9jay0+cmVmcmVzaGluZyA9IDA7CisJY3VybF9zbGlzdF9mcmVlX2FsbChkYXZfaGVhZGVycyk7CisJZnJlZShpZl9oZWFkZXIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBjaGVja19sb2Nrcyh2b2lkKQoreworCXN0cnVjdCByZW1vdGVfbG9jayAqbG9jayA9IHJlbW90ZS0+bG9ja3M7CisJdGltZV90IGN1cnJlbnRfdGltZSA9IHRpbWUoTlVMTCk7CisJaW50IHRpbWVfcmVtYWluaW5nOworCisJd2hpbGUgKGxvY2spIHsKKwkJdGltZV9yZW1haW5pbmcgPSBsb2NrLT5zdGFydF90aW1lICsgbG9jay0+dGltZW91dCAtCisJCQljdXJyZW50X3RpbWU7CisJCWlmICghbG9jay0+cmVmcmVzaGluZyAmJiB0aW1lX3JlbWFpbmluZyA8IExPQ0tfUkVGUkVTSCkgeworCQkJaWYgKCFyZWZyZXNoX2xvY2sobG9jaykpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJIlVuYWJsZSB0byByZWZyZXNoIGxvY2sgZm9yICVzXG4iLAorCQkJCQlsb2NrLT51cmwpOworCQkJCWFib3J0ZWQgPSAxOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQlsb2NrID0gbG9jay0+bmV4dDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfcmVxdWVzdChzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdCkKK3sKKwlzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqZW50cnkgPSByZXF1ZXN0X3F1ZXVlX2hlYWQ7CisKKwlpZiAocmVxdWVzdCA9PSByZXF1ZXN0X3F1ZXVlX2hlYWQpIHsKKwkJcmVxdWVzdF9xdWV1ZV9oZWFkID0gcmVxdWVzdC0+bmV4dDsKKwl9IGVsc2UgeworCQl3aGlsZSAoZW50cnktPm5leHQgIT0gTlVMTCAmJiBlbnRyeS0+bmV4dCAhPSByZXF1ZXN0KQorCQkJZW50cnkgPSBlbnRyeS0+bmV4dDsKKwkJaWYgKGVudHJ5LT5uZXh0ID09IHJlcXVlc3QpCisJCQllbnRyeS0+bmV4dCA9IGVudHJ5LT5uZXh0LT5uZXh0OworCX0KKworCWlmIChyZXF1ZXN0LT5sb2NhbF9maWxlbm8gIT0gLTEpCisJCWNsb3NlKHJlcXVlc3QtPmxvY2FsX2ZpbGVubyk7CisJaWYgKHJlcXVlc3QtPmxvY2FsX3N0cmVhbSkKKwkJZmNsb3NlKHJlcXVlc3QtPmxvY2FsX3N0cmVhbSk7CisJZnJlZShyZXF1ZXN0LT51cmwpOworCWZyZWUocmVxdWVzdCk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmlzaF9yZXF1ZXN0KHN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICpyZXF1ZXN0KQoreworCXN0cnVjdCBzdGF0IHN0OworCXN0cnVjdCBwYWNrZWRfZ2l0ICp0YXJnZXQ7CisJc3RydWN0IHBhY2tlZF9naXQgKipsc3Q7CisKKwlyZXF1ZXN0LT5jdXJsX3Jlc3VsdCA9IHJlcXVlc3QtPnNsb3QtPmN1cmxfcmVzdWx0OworCXJlcXVlc3QtPmh0dHBfY29kZSA9IHJlcXVlc3QtPnNsb3QtPmh0dHBfY29kZTsKKwlyZXF1ZXN0LT5zbG90ID0gTlVMTDsKKworCS8qIEtlZXAgbG9ja3MgYWN0aXZlICovCisJY2hlY2tfbG9ja3MoKTsKKworCWlmIChyZXF1ZXN0LT5oZWFkZXJzICE9IE5VTEwpCisJCWN1cmxfc2xpc3RfZnJlZV9hbGwocmVxdWVzdC0+aGVhZGVycyk7CisKKwkvKiBVUkwgaXMgcmV1c2VkIGZvciBNT1ZFIGFmdGVyIFBVVCAqLworCWlmIChyZXF1ZXN0LT5zdGF0ZSAhPSBSVU5fUFVUKSB7CisJCWZyZWUocmVxdWVzdC0+dXJsKTsKKwkJcmVxdWVzdC0+dXJsID0gTlVMTDsKKwl9CisKKwlpZiAocmVxdWVzdC0+c3RhdGUgPT0gUlVOX01LQ09MKSB7CisJCWlmIChyZXF1ZXN0LT5jdXJsX3Jlc3VsdCA9PSBDVVJMRV9PSyB8fAorCQkgICAgcmVxdWVzdC0+aHR0cF9jb2RlID09IDQwNSkgeworCQkJcmVtb3RlX2Rpcl9leGlzdHNbcmVxdWVzdC0+b2JqLT5zaGExWzBdXSA9IDE7CisJCQlzdGFydF9wdXQocmVxdWVzdCk7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIk1LQ09MICVzIGZhaWxlZCwgYWJvcnRpbmcgKCVkLyVsZClcbiIsCisJCQkJc2hhMV90b19oZXgocmVxdWVzdC0+b2JqLT5zaGExKSwKKwkJCQlyZXF1ZXN0LT5jdXJsX3Jlc3VsdCwgcmVxdWVzdC0+aHR0cF9jb2RlKTsKKwkJCXJlcXVlc3QtPnN0YXRlID0gQUJPUlRFRDsKKwkJCWFib3J0ZWQgPSAxOworCQl9CisJfSBlbHNlIGlmIChyZXF1ZXN0LT5zdGF0ZSA9PSBSVU5fUFVUKSB7CisJCWlmIChyZXF1ZXN0LT5jdXJsX3Jlc3VsdCA9PSBDVVJMRV9PSykgeworCQkJc3RhcnRfbW92ZShyZXF1ZXN0KTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLAkiUFVUICVzIGZhaWxlZCwgYWJvcnRpbmcgKCVkLyVsZClcbiIsCisJCQkJc2hhMV90b19oZXgocmVxdWVzdC0+b2JqLT5zaGExKSwKKwkJCQlyZXF1ZXN0LT5jdXJsX3Jlc3VsdCwgcmVxdWVzdC0+aHR0cF9jb2RlKTsKKwkJCXJlcXVlc3QtPnN0YXRlID0gQUJPUlRFRDsKKwkJCWFib3J0ZWQgPSAxOworCQl9CisJfSBlbHNlIGlmIChyZXF1ZXN0LT5zdGF0ZSA9PSBSVU5fTU9WRSkgeworCQlpZiAocmVxdWVzdC0+Y3VybF9yZXN1bHQgPT0gQ1VSTEVfT0spIHsKKwkJCWlmIChwdXNoX3ZlcmJvc2VseSkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiAgICBzZW50ICVzXG4iLAorCQkJCQlzaGExX3RvX2hleChyZXF1ZXN0LT5vYmotPnNoYTEpKTsKKwkJCXJlcXVlc3QtPm9iai0+ZmxhZ3MgfD0gUkVNT1RFOworCQkJcmVsZWFzZV9yZXF1ZXN0KHJlcXVlc3QpOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJNT1ZFICVzIGZhaWxlZCwgYWJvcnRpbmcgKCVkLyVsZClcbiIsCisJCQkJc2hhMV90b19oZXgocmVxdWVzdC0+b2JqLT5zaGExKSwKKwkJCQlyZXF1ZXN0LT5jdXJsX3Jlc3VsdCwgcmVxdWVzdC0+aHR0cF9jb2RlKTsKKwkJCXJlcXVlc3QtPnN0YXRlID0gQUJPUlRFRDsKKwkJCWFib3J0ZWQgPSAxOworCQl9CisJfSBlbHNlIGlmIChyZXF1ZXN0LT5zdGF0ZSA9PSBSVU5fRkVUQ0hfTE9PU0UpIHsKKwkJZmNobW9kKHJlcXVlc3QtPmxvY2FsX2ZpbGVubywgMDQ0NCk7CisJCWNsb3NlKHJlcXVlc3QtPmxvY2FsX2ZpbGVubyk7IHJlcXVlc3QtPmxvY2FsX2ZpbGVubyA9IC0xOworCisJCWlmIChyZXF1ZXN0LT5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSyAmJgorCQkgICAgcmVxdWVzdC0+aHR0cF9jb2RlICE9IDQxNikgeworCQkJaWYgKHN0YXQocmVxdWVzdC0+dG1wZmlsZSwgJnN0KSA9PSAwKSB7CisJCQkJaWYgKHN0LnN0X3NpemUgPT0gMCkKKwkJCQkJdW5saW5rKHJlcXVlc3QtPnRtcGZpbGUpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHJlcXVlc3QtPmh0dHBfY29kZSA9PSA0MTYpCisJCQkJZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiByZXF1ZXN0ZWQgcmFuZ2UgaW52YWxpZDsgd2UgbWF5IGFscmVhZHkgaGF2ZSBhbGwgdGhlIGRhdGEuXG4iKTsKKworCQkJaW5mbGF0ZUVuZCgmcmVxdWVzdC0+c3RyZWFtKTsKKwkJCVNIQTFfRmluYWwocmVxdWVzdC0+cmVhbF9zaGExLCAmcmVxdWVzdC0+Yyk7CisJCQlpZiAocmVxdWVzdC0+enJldCAhPSBaX1NUUkVBTV9FTkQpIHsKKwkJCQl1bmxpbmsocmVxdWVzdC0+dG1wZmlsZSk7CisJCQl9IGVsc2UgaWYgKGhhc2hjbXAocmVxdWVzdC0+b2JqLT5zaGExLCByZXF1ZXN0LT5yZWFsX3NoYTEpKSB7CisJCQkJdW5saW5rKHJlcXVlc3QtPnRtcGZpbGUpOworCQkJfSBlbHNlIHsKKwkJCQlyZXF1ZXN0LT5yZW5hbWUgPQorCQkJCQltb3ZlX3RlbXBfdG9fZmlsZSgKKwkJCQkJCXJlcXVlc3QtPnRtcGZpbGUsCisJCQkJCQlyZXF1ZXN0LT5maWxlbmFtZSk7CisJCQkJaWYgKHJlcXVlc3QtPnJlbmFtZSA9PSAwKSB7CisJCQkJCXJlcXVlc3QtPm9iai0+ZmxhZ3MgfD0gKExPQ0FMIHwgUkVNT1RFKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBUcnkgZmV0Y2hpbmcgcGFja2VkIGlmIG5lY2Vzc2FyeSAqLworCQlpZiAocmVxdWVzdC0+b2JqLT5mbGFncyAmIExPQ0FMKQorCQkJcmVsZWFzZV9yZXF1ZXN0KHJlcXVlc3QpOworCQllbHNlCisJCQlzdGFydF9mZXRjaF9wYWNrZWQocmVxdWVzdCk7CisKKwl9IGVsc2UgaWYgKHJlcXVlc3QtPnN0YXRlID09IFJVTl9GRVRDSF9QQUNLRUQpIHsKKwkJaWYgKHJlcXVlc3QtPmN1cmxfcmVzdWx0ICE9IENVUkxFX09LKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBnZXQgcGFjayBmaWxlICVzXG4lcyIsCisJCQkJcmVxdWVzdC0+dXJsLCBjdXJsX2Vycm9yc3RyKTsKKwkJCXJlbW90ZS0+Y2FuX3VwZGF0ZV9pbmZvX3JlZnMgPSAwOworCQl9IGVsc2UgeworCQkJb2ZmX3QgcGFja19zaXplID0gZnRlbGwocmVxdWVzdC0+bG9jYWxfc3RyZWFtKTsKKworCQkJZmNsb3NlKHJlcXVlc3QtPmxvY2FsX3N0cmVhbSk7CisJCQlyZXF1ZXN0LT5sb2NhbF9zdHJlYW0gPSBOVUxMOworCQkJaWYgKCFtb3ZlX3RlbXBfdG9fZmlsZShyZXF1ZXN0LT50bXBmaWxlLAorCQkJCQkgICAgICAgcmVxdWVzdC0+ZmlsZW5hbWUpKSB7CisJCQkJdGFyZ2V0ID0gKHN0cnVjdCBwYWNrZWRfZ2l0ICopcmVxdWVzdC0+dXNlckRhdGE7CisJCQkJdGFyZ2V0LT5wYWNrX3NpemUgPSBwYWNrX3NpemU7CisJCQkJbHN0ID0gJnJlbW90ZS0+cGFja3M7CisJCQkJd2hpbGUgKCpsc3QgIT0gdGFyZ2V0KQorCQkJCQlsc3QgPSAmKCgqbHN0KS0+bmV4dCk7CisJCQkJKmxzdCA9ICgqbHN0KS0+bmV4dDsKKworCQkJCWlmICghdmVyaWZ5X3BhY2sodGFyZ2V0LCAwKSkKKwkJCQkJaW5zdGFsbF9wYWNrZWRfZ2l0KHRhcmdldCk7CisJCQkJZWxzZQorCQkJCQlyZW1vdGUtPmNhbl91cGRhdGVfaW5mb19yZWZzID0gMDsKKwkJCX0KKwkJfQorCQlyZWxlYXNlX3JlcXVlc3QocmVxdWVzdCk7CisJfQorfQorCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKK3N0YXRpYyBpbnQgZmlsbF9hY3RpdmVfc2xvdCh2b2lkICp1bnVzZWQpCit7CisJc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QgPSByZXF1ZXN0X3F1ZXVlX2hlYWQ7CisKKwlpZiAoYWJvcnRlZCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKHJlcXVlc3QgPSByZXF1ZXN0X3F1ZXVlX2hlYWQ7IHJlcXVlc3Q7IHJlcXVlc3QgPSByZXF1ZXN0LT5uZXh0KSB7CisJCWlmIChyZXF1ZXN0LT5zdGF0ZSA9PSBORUVEX0ZFVENIKSB7CisJCQlzdGFydF9mZXRjaF9sb29zZShyZXF1ZXN0KTsKKwkJCXJldHVybiAxOworCQl9IGVsc2UgaWYgKHB1c2hpbmcgJiYgcmVxdWVzdC0+c3RhdGUgPT0gTkVFRF9QVVNIKSB7CisJCQlpZiAocmVtb3RlX2Rpcl9leGlzdHNbcmVxdWVzdC0+b2JqLT5zaGExWzBdXSA9PSAxKSB7CisJCQkJc3RhcnRfcHV0KHJlcXVlc3QpOworCQkJfSBlbHNlIHsKKwkJCQlzdGFydF9ta2NvbChyZXF1ZXN0KTsKKwkJCX0KKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGdldF9yZW1vdGVfb2JqZWN0X2xpc3QodW5zaWduZWQgY2hhciBwYXJlbnQpOworCitzdGF0aWMgdm9pZCBhZGRfZmV0Y2hfcmVxdWVzdChzdHJ1Y3Qgb2JqZWN0ICpvYmopCit7CisJc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3Q7CisKKwljaGVja19sb2NrcygpOworCisJLyoKKwkgKiBEb24ndCBmZXRjaCB0aGUgb2JqZWN0IGlmIGl0J3Mga25vd24gdG8gZXhpc3QgbG9jYWxseQorCSAqIG9yIGlzIGFscmVhZHkgaW4gdGhlIHJlcXVlc3QgcXVldWUKKwkgKi8KKwlpZiAocmVtb3RlX2Rpcl9leGlzdHNbb2JqLT5zaGExWzBdXSA9PSAtMSkKKwkJZ2V0X3JlbW90ZV9vYmplY3RfbGlzdChvYmotPnNoYTFbMF0pOworCWlmIChvYmotPmZsYWdzICYgKExPQ0FMIHwgRkVUQ0hJTkcpKQorCQlyZXR1cm47CisKKwlvYmotPmZsYWdzIHw9IEZFVENISU5HOworCXJlcXVlc3QgPSB4bWFsbG9jKHNpemVvZigqcmVxdWVzdCkpOworCXJlcXVlc3QtPm9iaiA9IG9iajsKKwlyZXF1ZXN0LT51cmwgPSBOVUxMOworCXJlcXVlc3QtPmxvY2sgPSBOVUxMOworCXJlcXVlc3QtPmhlYWRlcnMgPSBOVUxMOworCXJlcXVlc3QtPmxvY2FsX2ZpbGVubyA9IC0xOworCXJlcXVlc3QtPmxvY2FsX3N0cmVhbSA9IE5VTEw7CisJcmVxdWVzdC0+c3RhdGUgPSBORUVEX0ZFVENIOworCXJlcXVlc3QtPm5leHQgPSByZXF1ZXN0X3F1ZXVlX2hlYWQ7CisJcmVxdWVzdF9xdWV1ZV9oZWFkID0gcmVxdWVzdDsKKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJZmlsbF9hY3RpdmVfc2xvdHMoKTsKKwlzdGVwX2FjdGl2ZV9zbG90cygpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgYWRkX3NlbmRfcmVxdWVzdChzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCByZW1vdGVfbG9jayAqbG9jaykKK3sKKwlzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdCA9IHJlcXVlc3RfcXVldWVfaGVhZDsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqdGFyZ2V0OworCisJLyogS2VlcCBsb2NrcyBhY3RpdmUgKi8KKwljaGVja19sb2NrcygpOworCisJLyoKKwkgKiBEb24ndCBwdXNoIHRoZSBvYmplY3QgaWYgaXQncyBrbm93biB0byBleGlzdCBvbiB0aGUgcmVtb3RlCisJICogb3IgaXMgYWxyZWFkeSBpbiB0aGUgcmVxdWVzdCBxdWV1ZQorCSAqLworCWlmIChyZW1vdGVfZGlyX2V4aXN0c1tvYmotPnNoYTFbMF1dID09IC0xKQorCQlnZXRfcmVtb3RlX29iamVjdF9saXN0KG9iai0+c2hhMVswXSk7CisJaWYgKG9iai0+ZmxhZ3MgJiAoUkVNT1RFIHwgUFVTSElORykpCisJCXJldHVybiAwOworCXRhcmdldCA9IGZpbmRfc2hhMV9wYWNrKG9iai0+c2hhMSwgcmVtb3RlLT5wYWNrcyk7CisJaWYgKHRhcmdldCkgeworCQlvYmotPmZsYWdzIHw9IFJFTU9URTsKKwkJcmV0dXJuIDA7CisJfQorCisJb2JqLT5mbGFncyB8PSBQVVNISU5HOworCXJlcXVlc3QgPSB4bWFsbG9jKHNpemVvZigqcmVxdWVzdCkpOworCXJlcXVlc3QtPm9iaiA9IG9iajsKKwlyZXF1ZXN0LT51cmwgPSBOVUxMOworCXJlcXVlc3QtPmxvY2sgPSBsb2NrOworCXJlcXVlc3QtPmhlYWRlcnMgPSBOVUxMOworCXJlcXVlc3QtPmxvY2FsX2ZpbGVubyA9IC0xOworCXJlcXVlc3QtPmxvY2FsX3N0cmVhbSA9IE5VTEw7CisJcmVxdWVzdC0+c3RhdGUgPSBORUVEX1BVU0g7CisJcmVxdWVzdC0+bmV4dCA9IHJlcXVlc3RfcXVldWVfaGVhZDsKKwlyZXF1ZXN0X3F1ZXVlX2hlYWQgPSByZXF1ZXN0OworCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwlmaWxsX2FjdGl2ZV9zbG90cygpOworCXN0ZXBfYWN0aXZlX3Nsb3RzKCk7CisjZW5kaWYKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGZldGNoX2luZGV4KHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJY2hhciAqaGV4ID0gc2hhMV90b19oZXgoc2hhMSk7CisJY2hhciAqZmlsZW5hbWU7CisJY2hhciAqdXJsOworCWNoYXIgdG1wZmlsZVtQQVRIX01BWF07CisJbG9uZyBwcmV2X3Bvc24gPSAwOworCWNoYXIgcmFuZ2VbUkFOR0VfSEVBREVSX1NJWkVdOworCXN0cnVjdCBjdXJsX3NsaXN0ICpyYW5nZV9oZWFkZXIgPSBOVUxMOworCisJRklMRSAqaW5kZXhmaWxlOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBzbG90X3Jlc3VsdHMgcmVzdWx0czsKKworCS8qIERvbid0IHVzZSB0aGUgaW5kZXggaWYgdGhlIHBhY2sgaXNuJ3QgdGhlcmUgKi8KKwl1cmwgPSB4bWFsbG9jKHN0cmxlbihyZW1vdGUtPnVybCkgKyA2NCk7CisJc3ByaW50Zih1cmwsICIlc29iamVjdHMvcGFjay9wYWNrLSVzLnBhY2siLCByZW1vdGUtPnVybCwgaGV4KTsKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX05PQk9EWSwgMSk7CisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgIT0gQ1VSTEVfT0spIHsKKwkJCWZyZWUodXJsKTsKKwkJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIHZlcmlmeSBwYWNrICVzIGlzIGF2YWlsYWJsZSIsCisJCQkJICAgICBoZXgpOworCQl9CisJfSBlbHNlIHsKKwkJZnJlZSh1cmwpOworCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0Iik7CisJfQorCisJaWYgKGhhc19wYWNrX2luZGV4KHNoYTEpKSB7CisJCWZyZWUodXJsKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHB1c2hfdmVyYm9zZWx5KQorCQlmcHJpbnRmKHN0ZGVyciwgIkdldHRpbmcgaW5kZXggZm9yIHBhY2sgJXNcbiIsIGhleCk7CisKKwlzcHJpbnRmKHVybCwgIiVzb2JqZWN0cy9wYWNrL3BhY2stJXMuaWR4IiwgcmVtb3RlLT51cmwsIGhleCk7CisKKwlmaWxlbmFtZSA9IHNoYTFfcGFja19pbmRleF9uYW1lKHNoYTEpOworCXNucHJpbnRmKHRtcGZpbGUsIHNpemVvZih0bXBmaWxlKSwgIiVzLnRlbXAiLCBmaWxlbmFtZSk7CisJaW5kZXhmaWxlID0gZm9wZW4odG1wZmlsZSwgImEiKTsKKwlpZiAoIWluZGV4ZmlsZSkgeworCQlmcmVlKHVybCk7CisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIG9wZW4gbG9jYWwgZmlsZSAlcyBmb3IgcGFjayBpbmRleCIsCisJCQkgICAgIHRtcGZpbGUpOworCX0KKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX05PQk9EWSwgMCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBHRVQsIDEpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCBpbmRleGZpbGUpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGUpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIG5vX3ByYWdtYV9oZWFkZXIpOworCXNsb3QtPmxvY2FsID0gaW5kZXhmaWxlOworCisJLyogSWYgdGhlcmUgaXMgZGF0YSBwcmVzZW50IGZyb20gYSBwcmV2aW91cyB0cmFuc2ZlciBhdHRlbXB0LAorCSAgIHJlc3VtZSB3aGVyZSBpdCBsZWZ0IG9mZiAqLworCXByZXZfcG9zbiA9IGZ0ZWxsKGluZGV4ZmlsZSk7CisJaWYgKHByZXZfcG9zbj4wKSB7CisJCWlmIChwdXNoX3ZlcmJvc2VseSkKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJSZXN1bWluZyBmZXRjaCBvZiBpbmRleCBmb3IgcGFjayAlcyBhdCBieXRlICVsZFxuIiwKKwkJCQloZXgsIHByZXZfcG9zbik7CisJCXNwcmludGYocmFuZ2UsICJSYW5nZTogYnl0ZXM9JWxkLSIsIHByZXZfcG9zbik7CisJCXJhbmdlX2hlYWRlciA9IGN1cmxfc2xpc3RfYXBwZW5kKHJhbmdlX2hlYWRlciwgcmFuZ2UpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgcmFuZ2VfaGVhZGVyKTsKKwl9CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQkJZnJlZSh1cmwpOworCQkJZmNsb3NlKGluZGV4ZmlsZSk7CisJCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBnZXQgcGFjayBpbmRleCAlc1xuJXMiLCB1cmwsCisJCQkJICAgICBjdXJsX2Vycm9yc3RyKTsKKwkJfQorCX0gZWxzZSB7CisJCWZyZWUodXJsKTsKKwkJZmNsb3NlKGluZGV4ZmlsZSk7CisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIHN0YXJ0IHJlcXVlc3QiKTsKKwl9CisKKwlmcmVlKHVybCk7CisJZmNsb3NlKGluZGV4ZmlsZSk7CisKKwlyZXR1cm4gbW92ZV90ZW1wX3RvX2ZpbGUodG1wZmlsZSwgZmlsZW5hbWUpOworfQorCitzdGF0aWMgaW50IHNldHVwX2luZGV4KHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHBhY2tlZF9naXQgKm5ld19wYWNrOworCisJaWYgKGZldGNoX2luZGV4KHNoYTEpKQorCQlyZXR1cm4gLTE7CisKKwluZXdfcGFjayA9IHBhcnNlX3BhY2tfaW5kZXgoc2hhMSk7CisJbmV3X3BhY2stPm5leHQgPSByZW1vdGUtPnBhY2tzOworCXJlbW90ZS0+cGFja3MgPSBuZXdfcGFjazsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmZXRjaF9pbmRpY2VzKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljaGFyICp1cmw7CisJc3RydWN0IHN0cmJ1ZiBidWZmZXIgPSBTVFJCVUZfSU5JVDsKKwljaGFyICpkYXRhOworCWludCBpID0gMDsKKworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBzbG90X3Jlc3VsdHMgcmVzdWx0czsKKworCWlmIChwdXNoX3ZlcmJvc2VseSkKKwkJZnByaW50ZihzdGRlcnIsICJHZXR0aW5nIHBhY2sgbGlzdFxuIik7CisKKwl1cmwgPSB4bWFsbG9jKHN0cmxlbihyZW1vdGUtPnVybCkgKyAyMCk7CisJc3ByaW50Zih1cmwsICIlc29iamVjdHMvaW5mby9wYWNrcyIsIHJlbW90ZS0+dXJsKTsKKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0ZJTEUsICZidWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBOVUxMKTsKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQkJc3RyYnVmX3JlbGVhc2UoJmJ1ZmZlcik7CisJCQlmcmVlKHVybCk7CisJCQlpZiAocmVzdWx0cy5odHRwX2NvZGUgPT0gNDA0KQorCQkJCXJldHVybiAwOworCQkJZWxzZQorCQkJCXJldHVybiBlcnJvcigiJXMiLCBjdXJsX2Vycm9yc3RyKTsKKwkJfQorCX0gZWxzZSB7CisJCXN0cmJ1Zl9yZWxlYXNlKCZidWZmZXIpOworCQlmcmVlKHVybCk7CisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIHN0YXJ0IHJlcXVlc3QiKTsKKwl9CisJZnJlZSh1cmwpOworCisJZGF0YSA9IGJ1ZmZlci5idWY7CisJd2hpbGUgKGkgPCBidWZmZXIubGVuKSB7CisJCXN3aXRjaCAoZGF0YVtpXSkgeworCQljYXNlICdQJzoKKwkJCWkrKzsKKwkJCWlmIChpICsgNTIgPCBidWZmZXIubGVuICYmCisJCQkgICAgIXByZWZpeGNtcChkYXRhICsgaSwgIiBwYWNrLSIpICYmCisJCQkgICAgIXByZWZpeGNtcChkYXRhICsgaSArIDQ2LCAiLnBhY2tcbiIpKSB7CisJCQkJZ2V0X3NoYTFfaGV4KGRhdGEgKyBpICsgNiwgc2hhMSk7CisJCQkJc2V0dXBfaW5kZXgoc2hhMSk7CisJCQkJaSArPSA1MTsKKwkJCQlicmVhazsKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCXdoaWxlIChkYXRhW2ldICE9ICdcbicpCisJCQkJaSsrOworCQl9CisJCWkrKzsKKwl9CisKKwlzdHJidWZfcmVsZWFzZSgmYnVmZmVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgb25lX3JlbW90ZV9vYmplY3QoY29uc3QgY2hhciAqaGV4KQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJc3RydWN0IG9iamVjdCAqb2JqOworCisJaWYgKGdldF9zaGExX2hleChoZXgsIHNoYTEpICE9IDApCisJCXJldHVybjsKKworCW9iaiA9IGxvb2t1cF9vYmplY3Qoc2hhMSk7CisJaWYgKCFvYmopCisJCW9iaiA9IHBhcnNlX29iamVjdChzaGExKTsKKworCS8qIElnbm9yZSByZW1vdGUgb2JqZWN0cyB0aGF0IGRvbid0IGV4aXN0IGxvY2FsbHkgKi8KKwlpZiAoIW9iaikKKwkJcmV0dXJuOworCisJb2JqLT5mbGFncyB8PSBSRU1PVEU7CisJaWYgKCFvYmplY3RfbGlzdF9jb250YWlucyhvYmplY3RzLCBvYmopKQorCQlvYmplY3RfbGlzdF9pbnNlcnQob2JqLCAmb2JqZWN0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9sb2NrcHJvcF9jdHgoc3RydWN0IHhtbF9jdHggKmN0eCwgaW50IHRhZ19jbG9zZWQpCit7CisJaW50ICpsb2NrX2ZsYWdzID0gKGludCAqKWN0eC0+dXNlckRhdGE7CisKKwlpZiAodGFnX2Nsb3NlZCkgeworCQlpZiAoIXN0cmNtcChjdHgtPm5hbWUsIERBVl9DVFhfTE9DS0VOVFJZKSkgeworCQkJaWYgKCgqbG9ja19mbGFncyAmIERBVl9QUk9QX0xPQ0tFWCkgJiYKKwkJCSAgICAoKmxvY2tfZmxhZ3MgJiBEQVZfUFJPUF9MT0NLV1IpKSB7CisJCQkJKmxvY2tfZmxhZ3MgfD0gREFWX0xPQ0tfT0s7CisJCQl9CisJCQkqbG9ja19mbGFncyAmPSBEQVZfTE9DS19PSzsKKwkJfSBlbHNlIGlmICghc3RyY21wKGN0eC0+bmFtZSwgREFWX0NUWF9MT0NLVFlQRV9XUklURSkpIHsKKwkJCSpsb2NrX2ZsYWdzIHw9IERBVl9QUk9QX0xPQ0tXUjsKKwkJfSBlbHNlIGlmICghc3RyY21wKGN0eC0+bmFtZSwgREFWX0NUWF9MT0NLVFlQRV9FWENMVVNJVkUpKSB7CisJCQkqbG9ja19mbGFncyB8PSBEQVZfUFJPUF9MT0NLRVg7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9uZXdfbG9ja19jdHgoc3RydWN0IHhtbF9jdHggKmN0eCwgaW50IHRhZ19jbG9zZWQpCit7CisJc3RydWN0IHJlbW90ZV9sb2NrICpsb2NrID0gKHN0cnVjdCByZW1vdGVfbG9jayAqKWN0eC0+dXNlckRhdGE7CisKKwlpZiAodGFnX2Nsb3NlZCAmJiBjdHgtPmNkYXRhKSB7CisJCWlmICghc3RyY21wKGN0eC0+bmFtZSwgREFWX0FDVElWRUxPQ0tfT1dORVIpKSB7CisJCQlsb2NrLT5vd25lciA9IHhtYWxsb2Moc3RybGVuKGN0eC0+Y2RhdGEpICsgMSk7CisJCQlzdHJjcHkobG9jay0+b3duZXIsIGN0eC0+Y2RhdGEpOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoY3R4LT5uYW1lLCBEQVZfQUNUSVZFTE9DS19USU1FT1VUKSkgeworCQkJaWYgKCFwcmVmaXhjbXAoY3R4LT5jZGF0YSwgIlNlY29uZC0iKSkKKwkJCQlsb2NrLT50aW1lb3V0ID0KKwkJCQkJc3RydG9sKGN0eC0+Y2RhdGEgKyA3LCBOVUxMLCAxMCk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChjdHgtPm5hbWUsIERBVl9BQ1RJVkVMT0NLX1RPS0VOKSkgeworCQkJaWYgKCFwcmVmaXhjbXAoY3R4LT5jZGF0YSwgIm9wYXF1ZWxvY2t0b2tlbjoiKSkgeworCQkJCWxvY2stPnRva2VuID0geG1hbGxvYyhzdHJsZW4oY3R4LT5jZGF0YSkgLSAxNSk7CisJCQkJc3RyY3B5KGxvY2stPnRva2VuLCBjdHgtPmNkYXRhICsgMTYpOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBvbmVfcmVtb3RlX3JlZihjaGFyICpyZWZuYW1lKTsKKworc3RhdGljIHZvaWQKK3htbF9zdGFydF90YWcodm9pZCAqdXNlckRhdGEsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRzKQoreworCXN0cnVjdCB4bWxfY3R4ICpjdHggPSAoc3RydWN0IHhtbF9jdHggKil1c2VyRGF0YTsKKwljb25zdCBjaGFyICpjID0gc3RyY2hyKG5hbWUsICc6Jyk7CisJaW50IG5ld19sZW47CisKKwlpZiAoYyA9PSBOVUxMKQorCQljID0gbmFtZTsKKwllbHNlCisJCWMrKzsKKworCW5ld19sZW4gPSBzdHJsZW4oY3R4LT5uYW1lKSArIHN0cmxlbihjKSArIDI7CisKKwlpZiAobmV3X2xlbiA+IGN0eC0+bGVuKSB7CisJCWN0eC0+bmFtZSA9IHhyZWFsbG9jKGN0eC0+bmFtZSwgbmV3X2xlbik7CisJCWN0eC0+bGVuID0gbmV3X2xlbjsKKwl9CisJc3RyY2F0KGN0eC0+bmFtZSwgIi4iKTsKKwlzdHJjYXQoY3R4LT5uYW1lLCBjKTsKKworCWZyZWUoY3R4LT5jZGF0YSk7CisJY3R4LT5jZGF0YSA9IE5VTEw7CisKKwljdHgtPnVzZXJGdW5jKGN0eCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCit4bWxfZW5kX3RhZyh2b2lkICp1c2VyRGF0YSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgeG1sX2N0eCAqY3R4ID0gKHN0cnVjdCB4bWxfY3R4ICopdXNlckRhdGE7CisJY29uc3QgY2hhciAqYyA9IHN0cmNocihuYW1lLCAnOicpOworCWNoYXIgKmVwOworCisJY3R4LT51c2VyRnVuYyhjdHgsIDEpOworCisJaWYgKGMgPT0gTlVMTCkKKwkJYyA9IG5hbWU7CisJZWxzZQorCQljKys7CisKKwllcCA9IGN0eC0+bmFtZSArIHN0cmxlbihjdHgtPm5hbWUpIC0gc3RybGVuKGMpIC0gMTsKKwkqZXAgPSAwOworfQorCitzdGF0aWMgdm9pZAoreG1sX2NkYXRhKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqcywgaW50IGxlbikKK3sKKwlzdHJ1Y3QgeG1sX2N0eCAqY3R4ID0gKHN0cnVjdCB4bWxfY3R4ICopdXNlckRhdGE7CisJZnJlZShjdHgtPmNkYXRhKTsKKwljdHgtPmNkYXRhID0geG1lbWR1cHoocywgbGVuKTsKK30KKworc3RhdGljIHN0cnVjdCByZW1vdGVfbG9jayAqbG9ja19yZW1vdGUoY29uc3QgY2hhciAqcGF0aCwgbG9uZyB0aW1lb3V0KQoreworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBzbG90X3Jlc3VsdHMgcmVzdWx0czsKKwlzdHJ1Y3QgYnVmZmVyIG91dF9idWZmZXIgPSB7IFNUUkJVRl9JTklULCAwIH07CisJc3RydWN0IHN0cmJ1ZiBpbl9idWZmZXIgPSBTVFJCVUZfSU5JVDsKKwljaGFyICp1cmw7CisJY2hhciAqZXA7CisJY2hhciB0aW1lb3V0X2hlYWRlclsyNV07CisJc3RydWN0IHJlbW90ZV9sb2NrICpsb2NrID0gTlVMTDsKKwlzdHJ1Y3QgY3VybF9zbGlzdCAqZGF2X2hlYWRlcnMgPSBOVUxMOworCXN0cnVjdCB4bWxfY3R4IGN0eDsKKworCXVybCA9IHhtYWxsb2Moc3RybGVuKHJlbW90ZS0+dXJsKSArIHN0cmxlbihwYXRoKSArIDEpOworCXNwcmludGYodXJsLCAiJXMlcyIsIHJlbW90ZS0+dXJsLCBwYXRoKTsKKworCS8qIE1ha2Ugc3VyZSBsZWFkaW5nIGRpcmVjdG9yaWVzIGV4aXN0IGZvciB0aGUgcmVtb3RlIHJlZiAqLworCWVwID0gc3RyY2hyKHVybCArIHN0cmxlbihyZW1vdGUtPnVybCkgKyAxLCAnLycpOworCXdoaWxlIChlcCkgeworCQkqZXAgPSAwOworCQlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJCXNsb3QtPnJlc3VsdHMgPSAmcmVzdWx0czsKKwkJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBHRVQsIDEpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgREFWX01LQ09MKTsKKwkJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZV9udWxsKTsKKwkJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSyAmJgorCQkJICAgIHJlc3VsdHMuaHR0cF9jb2RlICE9IDQwNSkgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiVW5hYmxlIHRvIGNyZWF0ZSBicmFuY2ggcGF0aCAlc1xuIiwKKwkJCQkJdXJsKTsKKwkJCQlmcmVlKHVybCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBzdGFydCBNS0NPTCByZXF1ZXN0XG4iKTsKKwkJCWZyZWUodXJsKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCSplcCA9ICcvJzsKKwkJZXAgPSBzdHJjaHIoZXAgKyAxLCAnLycpOworCX0KKworCXN0cmJ1Zl9hZGRmKCZvdXRfYnVmZmVyLmJ1ZiwgTE9DS19SRVFVRVNULCBnaXRfZGVmYXVsdF9lbWFpbCk7CisKKwlzcHJpbnRmKHRpbWVvdXRfaGVhZGVyLCAiVGltZW91dDogU2Vjb25kLSVsZCIsIHRpbWVvdXQpOworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsIHRpbWVvdXRfaGVhZGVyKTsKKwlkYXZfaGVhZGVycyA9IGN1cmxfc2xpc3RfYXBwZW5kKGRhdl9oZWFkZXJzLCAiQ29udGVudC1UeXBlOiB0ZXh0L3htbCIpOworCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPnJlc3VsdHMgPSAmcmVzdWx0czsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSU5GSUxFLCAmb3V0X2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0lORklMRVNJWkUsIG91dF9idWZmZXIuYnVmLmxlbik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1JFQURGVU5DVElPTiwgZnJlYWRfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfRklMRSwgJmluX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZV9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VQTE9BRCwgMSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsIERBVl9MT0NLKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgZGF2X2hlYWRlcnMpOworCisJbG9jayA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpsb2NrKSk7CisJbG9jay0+dGltZW91dCA9IC0xOworCisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgPT0gQ1VSTEVfT0spIHsKKwkJCVhNTF9QYXJzZXIgcGFyc2VyID0gWE1MX1BhcnNlckNyZWF0ZShOVUxMKTsKKwkJCWVudW0gWE1MX1N0YXR1cyByZXN1bHQ7CisJCQljdHgubmFtZSA9IHhjYWxsb2MoMTAsIDEpOworCQkJY3R4LmxlbiA9IDA7CisJCQljdHguY2RhdGEgPSBOVUxMOworCQkJY3R4LnVzZXJGdW5jID0gaGFuZGxlX25ld19sb2NrX2N0eDsKKwkJCWN0eC51c2VyRGF0YSA9IGxvY2s7CisJCQlYTUxfU2V0VXNlckRhdGEocGFyc2VyLCAmY3R4KTsKKwkJCVhNTF9TZXRFbGVtZW50SGFuZGxlcihwYXJzZXIsIHhtbF9zdGFydF90YWcsCisJCQkJCSAgICAgIHhtbF9lbmRfdGFnKTsKKwkJCVhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihwYXJzZXIsIHhtbF9jZGF0YSk7CisJCQlyZXN1bHQgPSBYTUxfUGFyc2UocGFyc2VyLCBpbl9idWZmZXIuYnVmLAorCQkJCQkgICBpbl9idWZmZXIubGVuLCAxKTsKKwkJCWZyZWUoY3R4Lm5hbWUpOworCQkJaWYgKHJlc3VsdCAhPSBYTUxfU1RBVFVTX09LKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJYTUwgZXJyb3I6ICVzXG4iLAorCQkJCQlYTUxfRXJyb3JTdHJpbmcoCisJCQkJCQlYTUxfR2V0RXJyb3JDb2RlKHBhcnNlcikpKTsKKwkJCQlsb2NrLT50aW1lb3V0ID0gLTE7CisJCQl9CisJCQlYTUxfUGFyc2VyRnJlZShwYXJzZXIpOworCQl9CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gc3RhcnQgTE9DSyByZXF1ZXN0XG4iKTsKKwl9CisKKwljdXJsX3NsaXN0X2ZyZWVfYWxsKGRhdl9oZWFkZXJzKTsKKwlzdHJidWZfcmVsZWFzZSgmb3V0X2J1ZmZlci5idWYpOworCXN0cmJ1Zl9yZWxlYXNlKCZpbl9idWZmZXIpOworCisJaWYgKGxvY2stPnRva2VuID09IE5VTEwgfHwgbG9jay0+dGltZW91dCA8PSAwKSB7CisJCWZyZWUobG9jay0+dG9rZW4pOworCQlmcmVlKGxvY2stPm93bmVyKTsKKwkJZnJlZSh1cmwpOworCQlmcmVlKGxvY2spOworCQlsb2NrID0gTlVMTDsKKwl9IGVsc2UgeworCQlsb2NrLT51cmwgPSB1cmw7CisJCWxvY2stPnN0YXJ0X3RpbWUgPSB0aW1lKE5VTEwpOworCQlsb2NrLT5uZXh0ID0gcmVtb3RlLT5sb2NrczsKKwkJcmVtb3RlLT5sb2NrcyA9IGxvY2s7CisJfQorCisJcmV0dXJuIGxvY2s7Cit9CisKK3N0YXRpYyBpbnQgdW5sb2NrX3JlbW90ZShzdHJ1Y3QgcmVtb3RlX2xvY2sgKmxvY2spCit7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfcmVzdWx0cyByZXN1bHRzOworCXN0cnVjdCByZW1vdGVfbG9jayAqcHJldiA9IHJlbW90ZS0+bG9ja3M7CisJY2hhciAqbG9ja190b2tlbl9oZWFkZXI7CisJc3RydWN0IGN1cmxfc2xpc3QgKmRhdl9oZWFkZXJzID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCisJbG9ja190b2tlbl9oZWFkZXIgPSB4bWFsbG9jKHN0cmxlbihsb2NrLT50b2tlbikgKyAzMSk7CisJc3ByaW50Zihsb2NrX3Rva2VuX2hlYWRlciwgIkxvY2stVG9rZW46IDxvcGFxdWVsb2NrdG9rZW46JXM+IiwKKwkJbG9jay0+dG9rZW4pOworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsIGxvY2tfdG9rZW5faGVhZGVyKTsKKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZV9udWxsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCBsb2NrLT51cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBEQVZfVU5MT0NLKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgZGF2X2hlYWRlcnMpOworCisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgPT0gQ1VSTEVfT0spCisJCQlyYyA9IDE7CisJCWVsc2UKKwkJCWZwcmludGYoc3RkZXJyLCAiVU5MT0NLIEhUVFAgZXJyb3IgJWxkXG4iLAorCQkJCXJlc3VsdHMuaHR0cF9jb2RlKTsKKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBzdGFydCBVTkxPQ0sgcmVxdWVzdFxuIik7CisJfQorCisJY3VybF9zbGlzdF9mcmVlX2FsbChkYXZfaGVhZGVycyk7CisJZnJlZShsb2NrX3Rva2VuX2hlYWRlcik7CisKKwlpZiAocmVtb3RlLT5sb2NrcyA9PSBsb2NrKSB7CisJCXJlbW90ZS0+bG9ja3MgPSBsb2NrLT5uZXh0OworCX0gZWxzZSB7CisJCXdoaWxlIChwcmV2ICYmIHByZXYtPm5leHQgIT0gbG9jaykKKwkJCXByZXYgPSBwcmV2LT5uZXh0OworCQlpZiAocHJldikKKwkJCXByZXYtPm5leHQgPSBwcmV2LT5uZXh0LT5uZXh0OworCX0KKworCWZyZWUobG9jay0+b3duZXIpOworCWZyZWUobG9jay0+dXJsKTsKKwlmcmVlKGxvY2stPnRva2VuKTsKKwlmcmVlKGxvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCByZW1vdGVfbHMoY29uc3QgY2hhciAqcGF0aCwgaW50IGZsYWdzLAorCQkgICAgICB2b2lkICgqdXNlckZ1bmMpKHN0cnVjdCByZW1vdGVfbHNfY3R4ICpscyksCisJCSAgICAgIHZvaWQgKnVzZXJEYXRhKTsKKworc3RhdGljIHZvaWQgcHJvY2Vzc19sc19vYmplY3Qoc3RydWN0IHJlbW90ZV9sc19jdHggKmxzKQoreworCXVuc2lnbmVkIGludCAqcGFyZW50ID0gKHVuc2lnbmVkIGludCAqKWxzLT51c2VyRGF0YTsKKwljaGFyICpwYXRoID0gbHMtPmRlbnRyeV9uYW1lOworCWNoYXIgKm9ial9oZXg7CisKKwlpZiAoIXN0cmNtcChscy0+cGF0aCwgbHMtPmRlbnRyeV9uYW1lKSAmJiAobHMtPmZsYWdzICYgSVNfRElSKSkgeworCQlyZW1vdGVfZGlyX2V4aXN0c1sqcGFyZW50XSA9IDE7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc3RybGVuKHBhdGgpICE9IDQ5KQorCQlyZXR1cm47CisJcGF0aCArPSA4OworCW9ial9oZXggPSB4bWFsbG9jKHN0cmxlbihwYXRoKSk7CisJLyogTkI6IHBhdGggaXMgbm90IG51bGwtdGVybWluYXRlZCwgY2FuIG5vdCB1c2Ugc3RybGNweSBoZXJlICovCisJbWVtY3B5KG9ial9oZXgsIHBhdGgsIDIpOworCXN0cmNweShvYmpfaGV4ICsgMiwgcGF0aCArIDMpOworCW9uZV9yZW1vdGVfb2JqZWN0KG9ial9oZXgpOworCWZyZWUob2JqX2hleCk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfbHNfcmVmKHN0cnVjdCByZW1vdGVfbHNfY3R4ICpscykKK3sKKwlpZiAoIXN0cmNtcChscy0+cGF0aCwgbHMtPmRlbnRyeV9uYW1lKSAmJiAobHMtPmRlbnRyeV9mbGFncyAmIElTX0RJUikpIHsKKwkJZnByaW50ZihzdGRlcnIsICIgICVzXG4iLCBscy0+ZGVudHJ5X25hbWUpOworCQlyZXR1cm47CisJfQorCisJaWYgKCEobHMtPmRlbnRyeV9mbGFncyAmIElTX0RJUikpCisJCW9uZV9yZW1vdGVfcmVmKGxzLT5kZW50cnlfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9yZW1vdGVfbHNfY3R4KHN0cnVjdCB4bWxfY3R4ICpjdHgsIGludCB0YWdfY2xvc2VkKQoreworCXN0cnVjdCByZW1vdGVfbHNfY3R4ICpscyA9IChzdHJ1Y3QgcmVtb3RlX2xzX2N0eCAqKWN0eC0+dXNlckRhdGE7CisKKwlpZiAodGFnX2Nsb3NlZCkgeworCQlpZiAoIXN0cmNtcChjdHgtPm5hbWUsIERBVl9QUk9QRklORF9SRVNQKSAmJiBscy0+ZGVudHJ5X25hbWUpIHsKKwkJCWlmIChscy0+ZGVudHJ5X2ZsYWdzICYgSVNfRElSKSB7CisJCQkJaWYgKGxzLT5mbGFncyAmIFBST0NFU1NfRElSUykgeworCQkJCQlscy0+dXNlckZ1bmMobHMpOworCQkJCX0KKwkJCQlpZiAoc3RyY21wKGxzLT5kZW50cnlfbmFtZSwgbHMtPnBhdGgpICYmCisJCQkJICAgIGxzLT5mbGFncyAmIFJFQ1VSU0lWRSkgeworCQkJCQlyZW1vdGVfbHMobHMtPmRlbnRyeV9uYW1lLAorCQkJCQkJICBscy0+ZmxhZ3MsCisJCQkJCQkgIGxzLT51c2VyRnVuYywKKwkJCQkJCSAgbHMtPnVzZXJEYXRhKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGxzLT5mbGFncyAmIFBST0NFU1NfRklMRVMpIHsKKwkJCQlscy0+dXNlckZ1bmMobHMpOworCQkJfQorCQl9IGVsc2UgaWYgKCFzdHJjbXAoY3R4LT5uYW1lLCBEQVZfUFJPUEZJTkRfTkFNRSkgJiYgY3R4LT5jZGF0YSkgeworCQkJbHMtPmRlbnRyeV9uYW1lID0geG1hbGxvYyhzdHJsZW4oY3R4LT5jZGF0YSkgLQorCQkJCQkJICByZW1vdGUtPnBhdGhfbGVuICsgMSk7CisJCQlzdHJjcHkobHMtPmRlbnRyeV9uYW1lLCBjdHgtPmNkYXRhICsgcmVtb3RlLT5wYXRoX2xlbik7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChjdHgtPm5hbWUsIERBVl9QUk9QRklORF9DT0xMRUNUSU9OKSkgeworCQkJbHMtPmRlbnRyeV9mbGFncyB8PSBJU19ESVI7CisJCX0KKwl9IGVsc2UgaWYgKCFzdHJjbXAoY3R4LT5uYW1lLCBEQVZfUFJPUEZJTkRfUkVTUCkpIHsKKwkJZnJlZShscy0+ZGVudHJ5X25hbWUpOworCQlscy0+ZGVudHJ5X25hbWUgPSBOVUxMOworCQlscy0+ZGVudHJ5X2ZsYWdzID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlbW90ZV9scyhjb25zdCBjaGFyICpwYXRoLCBpbnQgZmxhZ3MsCisJCSAgICAgIHZvaWQgKCp1c2VyRnVuYykoc3RydWN0IHJlbW90ZV9sc19jdHggKmxzKSwKKwkJICAgICAgdm9pZCAqdXNlckRhdGEpCit7CisJY2hhciAqdXJsID0geG1hbGxvYyhzdHJsZW4ocmVtb3RlLT51cmwpICsgc3RybGVuKHBhdGgpICsgMSk7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfcmVzdWx0cyByZXN1bHRzOworCXN0cnVjdCBzdHJidWYgaW5fYnVmZmVyID0gU1RSQlVGX0lOSVQ7CisJc3RydWN0IGJ1ZmZlciBvdXRfYnVmZmVyID0geyBTVFJCVUZfSU5JVCwgMCB9OworCXN0cnVjdCBjdXJsX3NsaXN0ICpkYXZfaGVhZGVycyA9IE5VTEw7CisJc3RydWN0IHhtbF9jdHggY3R4OworCXN0cnVjdCByZW1vdGVfbHNfY3R4IGxzOworCisJbHMuZmxhZ3MgPSBmbGFnczsKKwlscy5wYXRoID0geHN0cmR1cChwYXRoKTsKKwlscy5kZW50cnlfbmFtZSA9IE5VTEw7CisJbHMuZGVudHJ5X2ZsYWdzID0gMDsKKwlscy51c2VyRGF0YSA9IHVzZXJEYXRhOworCWxzLnVzZXJGdW5jID0gdXNlckZ1bmM7CisKKwlzcHJpbnRmKHVybCwgIiVzJXMiLCByZW1vdGUtPnVybCwgcGF0aCk7CisKKwlzdHJidWZfYWRkZigmb3V0X2J1ZmZlci5idWYsIFBST1BGSU5EX0FMTF9SRVFVRVNUKTsKKworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsICJEZXB0aDogMSIpOworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsICJDb250ZW50LVR5cGU6IHRleHQveG1sIik7CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9JTkZJTEUsICZvdXRfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSU5GSUxFU0laRSwgb3V0X2J1ZmZlci5idWYubGVuKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfUkVBREZVTkNUSU9OLCBmcmVhZF9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCAmaW5fYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVBMT0FELCAxKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgREFWX1BST1BGSU5EKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgZGF2X2hlYWRlcnMpOworCisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgPT0gQ1VSTEVfT0spIHsKKwkJCVhNTF9QYXJzZXIgcGFyc2VyID0gWE1MX1BhcnNlckNyZWF0ZShOVUxMKTsKKwkJCWVudW0gWE1MX1N0YXR1cyByZXN1bHQ7CisJCQljdHgubmFtZSA9IHhjYWxsb2MoMTAsIDEpOworCQkJY3R4LmxlbiA9IDA7CisJCQljdHguY2RhdGEgPSBOVUxMOworCQkJY3R4LnVzZXJGdW5jID0gaGFuZGxlX3JlbW90ZV9sc19jdHg7CisJCQljdHgudXNlckRhdGEgPSAmbHM7CisJCQlYTUxfU2V0VXNlckRhdGEocGFyc2VyLCAmY3R4KTsKKwkJCVhNTF9TZXRFbGVtZW50SGFuZGxlcihwYXJzZXIsIHhtbF9zdGFydF90YWcsCisJCQkJCSAgICAgIHhtbF9lbmRfdGFnKTsKKwkJCVhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihwYXJzZXIsIHhtbF9jZGF0YSk7CisJCQlyZXN1bHQgPSBYTUxfUGFyc2UocGFyc2VyLCBpbl9idWZmZXIuYnVmLAorCQkJCQkgICBpbl9idWZmZXIubGVuLCAxKTsKKwkJCWZyZWUoY3R4Lm5hbWUpOworCisJCQlpZiAocmVzdWx0ICE9IFhNTF9TVEFUVVNfT0spIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlhNTCBlcnJvcjogJXNcbiIsCisJCQkJCVhNTF9FcnJvclN0cmluZygKKwkJCQkJCVhNTF9HZXRFcnJvckNvZGUocGFyc2VyKSkpOworCQkJfQorCQkJWE1MX1BhcnNlckZyZWUocGFyc2VyKTsKKwkJfQorCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIHN0YXJ0IFBST1BGSU5EIHJlcXVlc3RcbiIpOworCX0KKworCWZyZWUobHMucGF0aCk7CisJZnJlZSh1cmwpOworCXN0cmJ1Zl9yZWxlYXNlKCZvdXRfYnVmZmVyLmJ1Zik7CisJc3RyYnVmX3JlbGVhc2UoJmluX2J1ZmZlcik7CisJY3VybF9zbGlzdF9mcmVlX2FsbChkYXZfaGVhZGVycyk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9yZW1vdGVfb2JqZWN0X2xpc3QodW5zaWduZWQgY2hhciBwYXJlbnQpCit7CisJY2hhciBwYXRoW10gPSAib2JqZWN0cy9YWC8iOworCXN0YXRpYyBjb25zdCBjaGFyIGhleFtdID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCXVuc2lnbmVkIGludCB2YWwgPSBwYXJlbnQ7CisKKwlwYXRoWzhdID0gaGV4W3ZhbCA+PiA0XTsKKwlwYXRoWzldID0gaGV4W3ZhbCAmIDB4Zl07CisJcmVtb3RlX2Rpcl9leGlzdHNbdmFsXSA9IDA7CisJcmVtb3RlX2xzKHBhdGgsIChQUk9DRVNTX0ZJTEVTIHwgUFJPQ0VTU19ESVJTKSwKKwkJICBwcm9jZXNzX2xzX29iamVjdCwgJnZhbCk7Cit9CisKK3N0YXRpYyBpbnQgbG9ja2luZ19hdmFpbGFibGUodm9pZCkKK3sKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisJc3RydWN0IHN0cmJ1ZiBpbl9idWZmZXIgPSBTVFJCVUZfSU5JVDsKKwlzdHJ1Y3QgYnVmZmVyIG91dF9idWZmZXIgPSB7IFNUUkJVRl9JTklULCAwIH07CisJc3RydWN0IGN1cmxfc2xpc3QgKmRhdl9oZWFkZXJzID0gTlVMTDsKKwlzdHJ1Y3QgeG1sX2N0eCBjdHg7CisJaW50IGxvY2tfZmxhZ3MgPSAwOworCisJc3RyYnVmX2FkZGYoJm91dF9idWZmZXIuYnVmLCBQUk9QRklORF9TVVBQT1JURURMT0NLX1JFUVVFU1QsIHJlbW90ZS0+dXJsKTsKKworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsICJEZXB0aDogMCIpOworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsICJDb250ZW50LVR5cGU6IHRleHQveG1sIik7CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9JTkZJTEUsICZvdXRfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSU5GSUxFU0laRSwgb3V0X2J1ZmZlci5idWYubGVuKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfUkVBREZVTkNUSU9OLCBmcmVhZF9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCAmaW5fYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgcmVtb3RlLT51cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUExPQUQsIDEpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBEQVZfUFJPUEZJTkQpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBkYXZfaGVhZGVycyk7CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCA9PSBDVVJMRV9PSykgeworCQkJWE1MX1BhcnNlciBwYXJzZXIgPSBYTUxfUGFyc2VyQ3JlYXRlKE5VTEwpOworCQkJZW51bSBYTUxfU3RhdHVzIHJlc3VsdDsKKwkJCWN0eC5uYW1lID0geGNhbGxvYygxMCwgMSk7CisJCQljdHgubGVuID0gMDsKKwkJCWN0eC5jZGF0YSA9IE5VTEw7CisJCQljdHgudXNlckZ1bmMgPSBoYW5kbGVfbG9ja3Byb3BfY3R4OworCQkJY3R4LnVzZXJEYXRhID0gJmxvY2tfZmxhZ3M7CisJCQlYTUxfU2V0VXNlckRhdGEocGFyc2VyLCAmY3R4KTsKKwkJCVhNTF9TZXRFbGVtZW50SGFuZGxlcihwYXJzZXIsIHhtbF9zdGFydF90YWcsCisJCQkJCSAgICAgIHhtbF9lbmRfdGFnKTsKKwkJCXJlc3VsdCA9IFhNTF9QYXJzZShwYXJzZXIsIGluX2J1ZmZlci5idWYsCisJCQkJCSAgIGluX2J1ZmZlci5sZW4sIDEpOworCQkJZnJlZShjdHgubmFtZSk7CisKKwkJCWlmIChyZXN1bHQgIT0gWE1MX1NUQVRVU19PSykgeworCQkJCWZwcmludGYoc3RkZXJyLCAiWE1MIGVycm9yOiAlc1xuIiwKKwkJCQkJWE1MX0Vycm9yU3RyaW5nKAorCQkJCQkJWE1MX0dldEVycm9yQ29kZShwYXJzZXIpKSk7CisJCQkJbG9ja19mbGFncyA9IDA7CisJCQl9CisJCQlYTUxfUGFyc2VyRnJlZShwYXJzZXIpOworCQkJaWYgKCFsb2NrX2ZsYWdzKQorCQkJCWVycm9yKCJFcnJvcjogbm8gREFWIGxvY2tpbmcgc3VwcG9ydCBvbiAlcyIsCisJCQkJICAgICAgcmVtb3RlLT51cmwpOworCisJCX0gZWxzZSB7CisJCQllcnJvcigiQ2Fubm90IGFjY2VzcyBVUkwgJXMsIHJldHVybiBjb2RlICVkIiwKKwkJCSAgICAgIHJlbW90ZS0+dXJsLCByZXN1bHRzLmN1cmxfcmVzdWx0KTsKKwkJCWxvY2tfZmxhZ3MgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJZXJyb3IoIlVuYWJsZSB0byBzdGFydCBQUk9QRklORCByZXF1ZXN0IG9uICVzIiwgcmVtb3RlLT51cmwpOworCX0KKworCXN0cmJ1Zl9yZWxlYXNlKCZvdXRfYnVmZmVyLmJ1Zik7CisJc3RyYnVmX3JlbGVhc2UoJmluX2J1ZmZlcik7CisJY3VybF9zbGlzdF9mcmVlX2FsbChkYXZfaGVhZGVycyk7CisKKwlyZXR1cm4gbG9ja19mbGFnczsKK30KKworc3RhdGljIHN0cnVjdCBvYmplY3RfbGlzdCAqKmFkZF9vbmVfb2JqZWN0KHN0cnVjdCBvYmplY3QgKm9iaiwgc3RydWN0IG9iamVjdF9saXN0ICoqcCkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2xpc3QgKmVudHJ5ID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IG9iamVjdF9saXN0KSk7CisJZW50cnktPml0ZW0gPSBvYmo7CisJZW50cnktPm5leHQgPSAqcDsKKwkqcCA9IGVudHJ5OworCXJldHVybiAmZW50cnktPm5leHQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X2xpc3QgKipwcm9jZXNzX2Jsb2Ioc3RydWN0IGJsb2IgKmJsb2IsCisJCQkJCSBzdHJ1Y3Qgb2JqZWN0X2xpc3QgKipwLAorCQkJCQkgc3RydWN0IG5hbWVfcGF0aCAqcGF0aCwKKwkJCQkJIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IG9iamVjdCAqb2JqID0gJmJsb2ItPm9iamVjdDsKKworCW9iai0+ZmxhZ3MgfD0gTE9DQUw7CisKKwlpZiAob2JqLT5mbGFncyAmIChVTklOVEVSRVNUSU5HIHwgU0VFTikpCisJCXJldHVybiBwOworCisJb2JqLT5mbGFncyB8PSBTRUVOOworCXJldHVybiBhZGRfb25lX29iamVjdChvYmosIHApOworfQorCitzdGF0aWMgc3RydWN0IG9iamVjdF9saXN0ICoqcHJvY2Vzc190cmVlKHN0cnVjdCB0cmVlICp0cmVlLAorCQkJCQkgc3RydWN0IG9iamVjdF9saXN0ICoqcCwKKwkJCQkJIHN0cnVjdCBuYW1lX3BhdGggKnBhdGgsCisJCQkJCSBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBvYmplY3QgKm9iaiA9ICZ0cmVlLT5vYmplY3Q7CisJc3RydWN0IHRyZWVfZGVzYyBkZXNjOworCXN0cnVjdCBuYW1lX2VudHJ5IGVudHJ5OworCXN0cnVjdCBuYW1lX3BhdGggbWU7CisKKwlvYmotPmZsYWdzIHw9IExPQ0FMOworCisJaWYgKG9iai0+ZmxhZ3MgJiAoVU5JTlRFUkVTVElORyB8IFNFRU4pKQorCQlyZXR1cm4gcDsKKwlpZiAocGFyc2VfdHJlZSh0cmVlKSA8IDApCisJCWRpZSgiYmFkIHRyZWUgb2JqZWN0ICVzIiwgc2hhMV90b19oZXgob2JqLT5zaGExKSk7CisKKwlvYmotPmZsYWdzIHw9IFNFRU47CisJbmFtZSA9IHhzdHJkdXAobmFtZSk7CisJcCA9IGFkZF9vbmVfb2JqZWN0KG9iaiwgcCk7CisJbWUudXAgPSBwYXRoOworCW1lLmVsZW0gPSBuYW1lOworCW1lLmVsZW1fbGVuID0gc3RybGVuKG5hbWUpOworCisJaW5pdF90cmVlX2Rlc2MoJmRlc2MsIHRyZWUtPmJ1ZmZlciwgdHJlZS0+c2l6ZSk7CisKKwl3aGlsZSAodHJlZV9lbnRyeSgmZGVzYywgJmVudHJ5KSkKKwkJc3dpdGNoIChvYmplY3RfdHlwZShlbnRyeS5tb2RlKSkgeworCQljYXNlIE9CSl9UUkVFOgorCQkJcCA9IHByb2Nlc3NfdHJlZShsb29rdXBfdHJlZShlbnRyeS5zaGExKSwgcCwgJm1lLCBuYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIE9CSl9CTE9COgorCQkJcCA9IHByb2Nlc3NfYmxvYihsb29rdXBfYmxvYihlbnRyeS5zaGExKSwgcCwgJm1lLCBuYW1lKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogU3VicHJvamVjdCBjb21taXQgLSBub3QgaW4gdGhpcyByZXBvc2l0b3J5ICovCisJCQlicmVhazsKKwkJfQorCisJZnJlZSh0cmVlLT5idWZmZXIpOworCXRyZWUtPmJ1ZmZlciA9IE5VTEw7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2RlbHRhKHN0cnVjdCByZXZfaW5mbyAqcmV2cywgc3RydWN0IHJlbW90ZV9sb2NrICpsb2NrKQoreworCWludCBpOworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwlzdHJ1Y3Qgb2JqZWN0X2xpc3QgKipwID0gJm9iamVjdHM7CisJaW50IGNvdW50ID0gMDsKKworCXdoaWxlICgoY29tbWl0ID0gZ2V0X3JldmlzaW9uKHJldnMpKSAhPSBOVUxMKSB7CisJCXAgPSBwcm9jZXNzX3RyZWUoY29tbWl0LT50cmVlLCBwLCBOVUxMLCAiIik7CisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IExPQ0FMOworCQlpZiAoIShjb21taXQtPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpKQorCQkJY291bnQgKz0gYWRkX3NlbmRfcmVxdWVzdCgmY29tbWl0LT5vYmplY3QsIGxvY2spOworCX0KKworCWZvciAoaSA9IDA7IGkgPCByZXZzLT5wZW5kaW5nLm5yOyBpKyspIHsKKwkJc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSAqZW50cnkgPSByZXZzLT5wZW5kaW5nLm9iamVjdHMgKyBpOworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBlbnRyeS0+aXRlbTsKKwkJY29uc3QgY2hhciAqbmFtZSA9IGVudHJ5LT5uYW1lOworCisJCWlmIChvYmotPmZsYWdzICYgKFVOSU5URVJFU1RJTkcgfCBTRUVOKSkKKwkJCWNvbnRpbnVlOworCQlpZiAob2JqLT50eXBlID09IE9CSl9UQUcpIHsKKwkJCW9iai0+ZmxhZ3MgfD0gU0VFTjsKKwkJCXAgPSBhZGRfb25lX29iamVjdChvYmosIHApOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG9iai0+dHlwZSA9PSBPQkpfVFJFRSkgeworCQkJcCA9IHByb2Nlc3NfdHJlZSgoc3RydWN0IHRyZWUgKilvYmosIHAsIE5VTEwsIG5hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG9iai0+dHlwZSA9PSBPQkpfQkxPQikgeworCQkJcCA9IHByb2Nlc3NfYmxvYigoc3RydWN0IGJsb2IgKilvYmosIHAsIE5VTEwsIG5hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJZGllKCJ1bmtub3duIHBlbmRpbmcgb2JqZWN0ICVzICglcykiLCBzaGExX3RvX2hleChvYmotPnNoYTEpLCBuYW1lKTsKKwl9CisKKwl3aGlsZSAob2JqZWN0cykgeworCQlpZiAoIShvYmplY3RzLT5pdGVtLT5mbGFncyAmIFVOSU5URVJFU1RJTkcpKQorCQkJY291bnQgKz0gYWRkX3NlbmRfcmVxdWVzdChvYmplY3RzLT5pdGVtLCBsb2NrKTsKKwkJb2JqZWN0cyA9IG9iamVjdHMtPm5leHQ7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHVwZGF0ZV9yZW1vdGUodW5zaWduZWQgY2hhciAqc2hhMSwgc3RydWN0IHJlbW90ZV9sb2NrICpsb2NrKQoreworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBzbG90X3Jlc3VsdHMgcmVzdWx0czsKKwljaGFyICppZl9oZWFkZXI7CisJc3RydWN0IGJ1ZmZlciBvdXRfYnVmZmVyID0geyBTVFJCVUZfSU5JVCwgMCB9OworCXN0cnVjdCBjdXJsX3NsaXN0ICpkYXZfaGVhZGVycyA9IE5VTEw7CisKKwlpZl9oZWFkZXIgPSB4bWFsbG9jKHN0cmxlbihsb2NrLT50b2tlbikgKyAyNSk7CisJc3ByaW50ZihpZl9oZWFkZXIsICJJZjogKDxvcGFxdWVsb2NrdG9rZW46JXM+KSIsIGxvY2stPnRva2VuKTsKKwlkYXZfaGVhZGVycyA9IGN1cmxfc2xpc3RfYXBwZW5kKGRhdl9oZWFkZXJzLCBpZl9oZWFkZXIpOworCisJc3RyYnVmX2FkZGYoJm91dF9idWZmZXIuYnVmLCAiJXNcbiIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0lORklMRSwgJm91dF9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9JTkZJTEVTSVpFLCBvdXRfYnVmZmVyLmJ1Zi5sZW4pOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9SRUFERlVOQ1RJT04sIGZyZWFkX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZV9udWxsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgREFWX1BVVCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIGRhdl9oZWFkZXJzKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVBMT0FELCAxKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfUFVULCAxKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCBsb2NrLT51cmwpOworCisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJc3RyYnVmX3JlbGVhc2UoJm91dF9idWZmZXIuYnVmKTsKKwkJZnJlZShpZl9oZWFkZXIpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlBVVCBlcnJvcjogY3VybCByZXN1bHQ9JWQsIEhUVFAgY29kZT0lbGRcbiIsCisJCQkJcmVzdWx0cy5jdXJsX3Jlc3VsdCwgcmVzdWx0cy5odHRwX2NvZGUpOworCQkJLyogV2Ugc2hvdWxkIGF0dGVtcHQgcmVjb3Zlcnk/ICovCisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CisJCXN0cmJ1Zl9yZWxlYXNlKCZvdXRfYnVmZmVyLmJ1Zik7CisJCWZyZWUoaWZfaGVhZGVyKTsKKwkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gc3RhcnQgUFVUIHJlcXVlc3RcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCByZWYgKmxvY2FsX3JlZnMsICoqbG9jYWxfdGFpbDsKK3N0YXRpYyBzdHJ1Y3QgcmVmICpyZW1vdGVfcmVmcywgKipyZW1vdGVfdGFpbDsKKworc3RhdGljIGludCBvbmVfbG9jYWxfcmVmKGNvbnN0IGNoYXIgKnJlZm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFnLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCByZWYgKnJlZjsKKwlpbnQgbGVuID0gc3RybGVuKHJlZm5hbWUpICsgMTsKKwlyZWYgPSB4Y2FsbG9jKDEsIHNpemVvZigqcmVmKSArIGxlbik7CisJaGFzaGNweShyZWYtPm5ld19zaGExLCBzaGExKTsKKwltZW1jcHkocmVmLT5uYW1lLCByZWZuYW1lLCBsZW4pOworCSpsb2NhbF90YWlsID0gcmVmOworCWxvY2FsX3RhaWwgPSAmcmVmLT5uZXh0OworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBvbmVfcmVtb3RlX3JlZihjaGFyICpyZWZuYW1lKQoreworCXN0cnVjdCByZWYgKnJlZjsKKwl1bnNpZ25lZCBjaGFyIHJlbW90ZV9zaGExWzIwXTsKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmo7CisJaW50IGxlbiA9IHN0cmxlbihyZWZuYW1lKSArIDE7CisKKwlpZiAoaHR0cF9mZXRjaF9yZWYocmVtb3RlLT51cmwsIHJlZm5hbWUgKyA1IC8qICJyZWZzLyIgKi8sCisJCQkgICByZW1vdGVfc2hhMSkgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJVbmFibGUgdG8gZmV0Y2ggcmVmICVzIGZyb20gJXNcbiIsCisJCQlyZWZuYW1lLCByZW1vdGUtPnVybCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIEZldGNoIGEgY29weSBvZiB0aGUgb2JqZWN0IGlmIGl0IGRvZXNuJ3QgZXhpc3QgbG9jYWxseSAtIGl0CisJICogbWF5IGJlIHJlcXVpcmVkIGZvciB1cGRhdGluZyBzZXJ2ZXIgaW5mbyBsYXRlci4KKwkgKi8KKwlpZiAocmVtb3RlLT5jYW5fdXBkYXRlX2luZm9fcmVmcyAmJiAhaGFzX3NoYTFfZmlsZShyZW1vdGVfc2hhMSkpIHsKKwkJb2JqID0gbG9va3VwX3Vua25vd25fb2JqZWN0KHJlbW90ZV9zaGExKTsKKwkJaWYgKG9iaikgeworCQkJZnByaW50ZihzdGRlcnIsCSIgIGZldGNoICVzIGZvciAlc1xuIiwKKwkJCQlzaGExX3RvX2hleChyZW1vdGVfc2hhMSksIHJlZm5hbWUpOworCQkJYWRkX2ZldGNoX3JlcXVlc3Qob2JqKTsKKwkJfQorCX0KKworCXJlZiA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpyZWYpICsgbGVuKTsKKwloYXNoY3B5KHJlZi0+b2xkX3NoYTEsIHJlbW90ZV9zaGExKTsKKwltZW1jcHkocmVmLT5uYW1lLCByZWZuYW1lLCBsZW4pOworCSpyZW1vdGVfdGFpbCA9IHJlZjsKKwlyZW1vdGVfdGFpbCA9ICZyZWYtPm5leHQ7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9sb2NhbF9oZWFkcyh2b2lkKQoreworCWxvY2FsX3RhaWwgPSAmbG9jYWxfcmVmczsKKwlmb3JfZWFjaF9yZWYob25lX2xvY2FsX3JlZiwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9kYXZfcmVtb3RlX2hlYWRzKHZvaWQpCit7CisJcmVtb3RlX3RhaWwgPSAmcmVtb3RlX3JlZnM7CisJcmVtb3RlX2xzKCJyZWZzLyIsIChQUk9DRVNTX0ZJTEVTIHwgUFJPQ0VTU19ESVJTIHwgUkVDVVJTSVZFKSwgcHJvY2Vzc19sc19yZWYsIE5VTEwpOworfQorCitzdGF0aWMgaW50IGlzX3plcm9fc2hhMShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKwkJaWYgKCpzaGExKyspCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHVubWFya19hbmRfZnJlZShzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3QsIHVuc2lnbmVkIGludCBtYXJrKQoreworCXdoaWxlIChsaXN0KSB7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqdGVtcCA9IGxpc3Q7CisJCXRlbXAtPml0ZW0tPm9iamVjdC5mbGFncyAmPSB+bWFyazsKKwkJbGlzdCA9IHRlbXAtPm5leHQ7CisJCWZyZWUodGVtcCk7CisJfQorfQorCitzdGF0aWMgaW50IHJlZl9uZXdlcihjb25zdCB1bnNpZ25lZCBjaGFyICpuZXdfc2hhMSwKKwkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpvbGRfc2hhMSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvOworCXN0cnVjdCBjb21taXQgKm9sZCwgKm5ldzsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3QsICp1c2VkOworCWludCBmb3VuZCA9IDA7CisKKwkvKiBCb3RoIG5ldyBhbmQgb2xkIG11c3QgYmUgY29tbWl0LWlzaCBhbmQgbmV3IGlzIGRlc2NlbmRhbnQgb2YKKwkgKiBvbGQuICBPdGhlcndpc2Ugd2UgcmVxdWlyZSAtLWZvcmNlLgorCSAqLworCW8gPSBkZXJlZl90YWcocGFyc2Vfb2JqZWN0KG9sZF9zaGExKSwgTlVMTCwgMCk7CisJaWYgKCFvIHx8IG8tPnR5cGUgIT0gT0JKX0NPTU1JVCkKKwkJcmV0dXJuIDA7CisJb2xkID0gKHN0cnVjdCBjb21taXQgKikgbzsKKworCW8gPSBkZXJlZl90YWcocGFyc2Vfb2JqZWN0KG5ld19zaGExKSwgTlVMTCwgMCk7CisJaWYgKCFvIHx8IG8tPnR5cGUgIT0gT0JKX0NPTU1JVCkKKwkJcmV0dXJuIDA7CisJbmV3ID0gKHN0cnVjdCBjb21taXQgKikgbzsKKworCWlmIChwYXJzZV9jb21taXQobmV3KSA8IDApCisJCXJldHVybiAwOworCisJdXNlZCA9IGxpc3QgPSBOVUxMOworCWNvbW1pdF9saXN0X2luc2VydChuZXcsICZsaXN0KTsKKwl3aGlsZSAobGlzdCkgeworCQluZXcgPSBwb3BfbW9zdF9yZWNlbnRfY29tbWl0KCZsaXN0LCBUTVBfTUFSSyk7CisJCWNvbW1pdF9saXN0X2luc2VydChuZXcsICZ1c2VkKTsKKwkJaWYgKG5ldyA9PSBvbGQpIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXVubWFya19hbmRfZnJlZShsaXN0LCBUTVBfTUFSSyk7CisJdW5tYXJrX2FuZF9mcmVlKHVzZWQsIFRNUF9NQVJLKTsKKwlyZXR1cm4gZm91bmQ7Cit9CisKK3N0YXRpYyB2b2lkIG1hcmtfZWRnZV9wYXJlbnRzX3VuaW50ZXJlc3Rpbmcoc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50czsKKworCWZvciAocGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsgcGFyZW50czsgcGFyZW50cyA9IHBhcmVudHMtPm5leHQpIHsKKwkJc3RydWN0IGNvbW1pdCAqcGFyZW50ID0gcGFyZW50cy0+aXRlbTsKKwkJaWYgKCEocGFyZW50LT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSkKKwkJCWNvbnRpbnVlOworCQltYXJrX3RyZWVfdW5pbnRlcmVzdGluZyhwYXJlbnQtPnRyZWUpOworCX0KK30KKworc3RhdGljIHZvaWQgbWFya19lZGdlc191bmludGVyZXN0aW5nKHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCkKK3sKKwlmb3IgKCA7IGxpc3Q7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxpc3QtPml0ZW07CisKKwkJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykgeworCQkJbWFya190cmVlX3VuaW50ZXJlc3RpbmcoY29tbWl0LT50cmVlKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCW1hcmtfZWRnZV9wYXJlbnRzX3VuaW50ZXJlc3RpbmcoY29tbWl0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9yZW1vdGVfaW5mb19yZWYoc3RydWN0IHJlbW90ZV9sc19jdHggKmxzKQoreworCXN0cnVjdCBzdHJidWYgKmJ1ZiA9IChzdHJ1Y3Qgc3RyYnVmICopbHMtPnVzZXJEYXRhOworCXVuc2lnbmVkIGNoYXIgcmVtb3RlX3NoYTFbMjBdOworCXN0cnVjdCBvYmplY3QgKm87CisJaW50IGxlbjsKKwljaGFyICpyZWZfaW5mbzsKKworCWlmIChodHRwX2ZldGNoX3JlZihyZW1vdGUtPnVybCwgbHMtPmRlbnRyeV9uYW1lICsgNSAvKiAicmVmcy8iICovLAorCQkJICAgcmVtb3RlX3NoYTEpICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiVW5hYmxlIHRvIGZldGNoIHJlZiAlcyBmcm9tICVzXG4iLAorCQkJbHMtPmRlbnRyeV9uYW1lLCByZW1vdGUtPnVybCk7CisJCWFib3J0ZWQgPSAxOworCQlyZXR1cm47CisJfQorCisJbyA9IHBhcnNlX29iamVjdChyZW1vdGVfc2hhMSk7CisJaWYgKCFvKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIlVuYWJsZSB0byBwYXJzZSBvYmplY3QgJXMgZm9yIHJlbW90ZSByZWYgJXNcbiIsCisJCQlzaGExX3RvX2hleChyZW1vdGVfc2hhMSksIGxzLT5kZW50cnlfbmFtZSk7CisJCWFib3J0ZWQgPSAxOworCQlyZXR1cm47CisJfQorCisJbGVuID0gc3RybGVuKGxzLT5kZW50cnlfbmFtZSkgKyA0MjsKKwlyZWZfaW5mbyA9IHhjYWxsb2MobGVuICsgMSwgMSk7CisJc3ByaW50ZihyZWZfaW5mbywgIiVzCSVzXG4iLAorCQlzaGExX3RvX2hleChyZW1vdGVfc2hhMSksIGxzLT5kZW50cnlfbmFtZSk7CisJZndyaXRlX2J1ZmZlcihyZWZfaW5mbywgMSwgbGVuLCBidWYpOworCWZyZWUocmVmX2luZm8pOworCisJaWYgKG8tPnR5cGUgPT0gT0JKX1RBRykgeworCQlvID0gZGVyZWZfdGFnKG8sIGxzLT5kZW50cnlfbmFtZSwgMCk7CisJCWlmIChvKSB7CisJCQlsZW4gPSBzdHJsZW4obHMtPmRlbnRyeV9uYW1lKSArIDQ1OworCQkJcmVmX2luZm8gPSB4Y2FsbG9jKGxlbiArIDEsIDEpOworCQkJc3ByaW50ZihyZWZfaW5mbywgIiVzCSVzXnt9XG4iLAorCQkJCXNoYTFfdG9faGV4KG8tPnNoYTEpLCBscy0+ZGVudHJ5X25hbWUpOworCQkJZndyaXRlX2J1ZmZlcihyZWZfaW5mbywgMSwgbGVuLCBidWYpOworCQkJZnJlZShyZWZfaW5mbyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9yZW1vdGVfaW5mb19yZWZzKHN0cnVjdCByZW1vdGVfbG9jayAqbG9jaykKK3sKKwlzdHJ1Y3QgYnVmZmVyIGJ1ZmZlciA9IHsgU1RSQlVGX0lOSVQsIDAgfTsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisJY2hhciAqaWZfaGVhZGVyOworCXN0cnVjdCBjdXJsX3NsaXN0ICpkYXZfaGVhZGVycyA9IE5VTEw7CisKKwlyZW1vdGVfbHMoInJlZnMvIiwgKFBST0NFU1NfRklMRVMgfCBSRUNVUlNJVkUpLAorCQkgIGFkZF9yZW1vdGVfaW5mb19yZWYsICZidWZmZXIuYnVmKTsKKwlpZiAoIWFib3J0ZWQpIHsKKwkJaWZfaGVhZGVyID0geG1hbGxvYyhzdHJsZW4obG9jay0+dG9rZW4pICsgMjUpOworCQlzcHJpbnRmKGlmX2hlYWRlciwgIklmOiAoPG9wYXF1ZWxvY2t0b2tlbjolcz4pIiwgbG9jay0+dG9rZW4pOworCQlkYXZfaGVhZGVycyA9IGN1cmxfc2xpc3RfYXBwZW5kKGRhdl9oZWFkZXJzLCBpZl9oZWFkZXIpOworCisJCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwkJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSU5GSUxFLCAmYnVmZmVyKTsKKwkJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0lORklMRVNJWkUsIGJ1ZmZlci5idWYubGVuKTsKKwkJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1JFQURGVU5DVElPTiwgZnJlYWRfYnVmZmVyKTsKKwkJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZV9udWxsKTsKKwkJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsIERBVl9QVVQpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgZGF2X2hlYWRlcnMpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVBMT0FELCAxKTsKKwkJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1BVVCwgMSk7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIGxvY2stPnVybCk7CisKKwkJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiUFVUIGVycm9yOiBjdXJsIHJlc3VsdD0lZCwgSFRUUCBjb2RlPSVsZFxuIiwKKwkJCQkJcmVzdWx0cy5jdXJsX3Jlc3VsdCwgcmVzdWx0cy5odHRwX2NvZGUpOworCQkJfQorCQl9CisJCWZyZWUoaWZfaGVhZGVyKTsKKwl9CisJc3RyYnVmX3JlbGVhc2UoJmJ1ZmZlci5idWYpOworfQorCitzdGF0aWMgaW50IHJlbW90ZV9leGlzdHMoY29uc3QgY2hhciAqcGF0aCkKK3sKKwljaGFyICp1cmwgPSB4bWFsbG9jKHN0cmxlbihyZW1vdGUtPnVybCkgKyBzdHJsZW4ocGF0aCkgKyAxKTsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisJaW50IHJldCA9IC0xOworCisJc3ByaW50Zih1cmwsICIlcyVzIiwgcmVtb3RlLT51cmwsIHBhdGgpOworCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPnJlc3VsdHMgPSAmcmVzdWx0czsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9OT0JPRFksIDEpOworCisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJaWYgKHJlc3VsdHMuaHR0cF9jb2RlID09IDQwNCkKKwkJCXJldCA9IDA7CisJCWVsc2UgaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgPT0gQ1VSTEVfT0spCisJCQlyZXQgPSAxOworCQllbHNlCisJCQlmcHJpbnRmKHN0ZGVyciwgIkhFQUQgSFRUUCBlcnJvciAlbGRcbiIsIHJlc3VsdHMuaHR0cF9jb2RlKTsKKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBzdGFydCBIRUFEIHJlcXVlc3RcbiIpOworCX0KKworCWZyZWUodXJsKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBmZXRjaF9zeW1yZWYoY29uc3QgY2hhciAqcGF0aCwgY2hhciAqKnN5bXJlZiwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwljaGFyICp1cmw7CisJc3RydWN0IHN0cmJ1ZiBidWZmZXIgPSBTVFJCVUZfSU5JVDsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisKKwl1cmwgPSB4bWFsbG9jKHN0cmxlbihyZW1vdGUtPnVybCkgKyBzdHJsZW4ocGF0aCkgKyAxKTsKKwlzcHJpbnRmKHVybCwgIiVzJXMiLCByZW1vdGUtPnVybCwgcGF0aCk7CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCAmYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIE5VTEwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgIT0gQ1VSTEVfT0spIHsKKwkJCWRpZSgiQ291bGRuJ3QgZ2V0ICVzIGZvciByZW1vdGUgc3ltcmVmXG4lcyIsCisJCQkgICAgdXJsLCBjdXJsX2Vycm9yc3RyKTsKKwkJfQorCX0gZWxzZSB7CisJCWRpZSgiVW5hYmxlIHRvIHN0YXJ0IHJlbW90ZSBzeW1yZWYgcmVxdWVzdCIpOworCX0KKwlmcmVlKHVybCk7CisKKwlmcmVlKCpzeW1yZWYpOworCSpzeW1yZWYgPSBOVUxMOworCWhhc2hjbHIoc2hhMSk7CisKKwlpZiAoYnVmZmVyLmxlbiA9PSAwKQorCQlyZXR1cm47CisKKwkvKiBJZiBpdCdzIGEgc3ltcmVmLCBzZXQgdGhlIHJlZm5hbWU7IG90aGVyd2lzZSB0cnkgZm9yIGEgc2hhMSAqLworCWlmICghcHJlZml4Y21wKChjaGFyICopYnVmZmVyLmJ1ZiwgInJlZjogIikpIHsKKwkJKnN5bXJlZiA9IHhtZW1kdXB6KChjaGFyICopYnVmZmVyLmJ1ZiArIDUsIGJ1ZmZlci5sZW4gLSA2KTsKKwl9IGVsc2UgeworCQlnZXRfc2hhMV9oZXgoYnVmZmVyLmJ1Ziwgc2hhMSk7CisJfQorCisJc3RyYnVmX3JlbGVhc2UoJmJ1ZmZlcik7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X21lcmdlX2Jhc2UodW5zaWduZWQgY2hhciAqaGVhZF9zaGExLCB1bnNpZ25lZCBjaGFyICpicmFuY2hfc2hhMSkKK3sKKwlzdHJ1Y3QgY29tbWl0ICpoZWFkID0gbG9va3VwX2NvbW1pdChoZWFkX3NoYTEpOworCXN0cnVjdCBjb21taXQgKmJyYW5jaCA9IGxvb2t1cF9jb21taXQoYnJhbmNoX3NoYTEpOworCXN0cnVjdCBjb21taXRfbGlzdCAqbWVyZ2VfYmFzZXMgPSBnZXRfbWVyZ2VfYmFzZXMoaGVhZCwgYnJhbmNoLCAxKTsKKworCXJldHVybiAobWVyZ2VfYmFzZXMgJiYgIW1lcmdlX2Jhc2VzLT5uZXh0ICYmIG1lcmdlX2Jhc2VzLT5pdGVtID09IGJyYW5jaCk7Cit9CisKK3N0YXRpYyBpbnQgZGVsZXRlX3JlbW90ZV9icmFuY2goY2hhciAqcGF0dGVybiwgaW50IGZvcmNlKQoreworCXN0cnVjdCByZWYgKnJlZnMgPSByZW1vdGVfcmVmczsKKwlzdHJ1Y3QgcmVmICpyZW1vdGVfcmVmID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyIGhlYWRfc2hhMVsyMF07CisJY2hhciAqc3ltcmVmID0gTlVMTDsKKwlpbnQgbWF0Y2g7CisJaW50IHBhdGxlbiA9IHN0cmxlbihwYXR0ZXJuKTsKKwlpbnQgaTsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisJY2hhciAqdXJsOworCisJLyogRmluZCB0aGUgcmVtb3RlIGJyYW5jaChlcykgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBicmFuY2ggbmFtZSAqLworCWZvciAobWF0Y2ggPSAwOyByZWZzOyByZWZzID0gcmVmcy0+bmV4dCkgeworCQljaGFyICpuYW1lID0gcmVmcy0+bmFtZTsKKwkJaW50IG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisJCWlmIChuYW1lbGVuIDwgcGF0bGVuIHx8CisJCSAgICBtZW1jbXAobmFtZSArIG5hbWVsZW4gLSBwYXRsZW4sIHBhdHRlcm4sIHBhdGxlbikpCisJCQljb250aW51ZTsKKwkJaWYgKG5hbWVsZW4gIT0gcGF0bGVuICYmIG5hbWVbbmFtZWxlbiAtIHBhdGxlbiAtIDFdICE9ICcvJykKKwkJCWNvbnRpbnVlOworCQltYXRjaCsrOworCQlyZW1vdGVfcmVmID0gcmVmczsKKwl9CisJaWYgKG1hdGNoID09IDApCisJCXJldHVybiBlcnJvcigiTm8gcmVtb3RlIGJyYW5jaCBtYXRjaGVzICVzIiwgcGF0dGVybik7CisJaWYgKG1hdGNoICE9IDEpCisJCXJldHVybiBlcnJvcigiTW9yZSB0aGFuIG9uZSByZW1vdGUgYnJhbmNoIG1hdGNoZXMgJXMiLAorCQkJICAgICBwYXR0ZXJuKTsKKworCS8qCisJICogUmVtb3RlIEhFQUQgbXVzdCBiZSBhIHN5bXJlZiAobm90IGV4YWN0bHkgZm9vbHByb29mOyBhIHJlbW90ZQorCSAqIHN5bWxpbmsgdG8gYSBzeW1yZWYgd2lsbCBsb29rIGxpa2UgYSBzeW1yZWYpCisJICovCisJZmV0Y2hfc3ltcmVmKCJIRUFEIiwgJnN5bXJlZiwgaGVhZF9zaGExKTsKKwlpZiAoIXN5bXJlZikKKwkJcmV0dXJuIGVycm9yKCJSZW1vdGUgSEVBRCBpcyBub3QgYSBzeW1yZWYiKTsKKworCS8qIFJlbW90ZSBicmFuY2ggbXVzdCBub3QgYmUgdGhlIHJlbW90ZSBIRUFEICovCisJZm9yIChpPTA7IHN5bXJlZiAmJiBpPE1BWERFUFRIOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAocmVtb3RlX3JlZi0+bmFtZSwgc3ltcmVmKSkKKwkJCXJldHVybiBlcnJvcigiUmVtb3RlIGJyYW5jaCAlcyBpcyB0aGUgY3VycmVudCBIRUFEIiwKKwkJCQkgICAgIHJlbW90ZV9yZWYtPm5hbWUpOworCQlmZXRjaF9zeW1yZWYoc3ltcmVmLCAmc3ltcmVmLCBoZWFkX3NoYTEpOworCX0KKworCS8qIFJ1biBleHRyYSBzYW5pdHkgY2hlY2tzIGlmIGRlbGV0ZSBpcyBub3QgZm9yY2VkICovCisJaWYgKCFmb3JjZSkgeworCQkvKiBSZW1vdGUgSEVBRCBtdXN0IHJlc29sdmUgdG8gYSBrbm93biBvYmplY3QgKi8KKwkJaWYgKHN5bXJlZikKKwkJCXJldHVybiBlcnJvcigiUmVtb3RlIEhFQUQgc3ltcmVmcyB0b28gZGVlcCIpOworCQlpZiAoaXNfemVyb19zaGExKGhlYWRfc2hhMSkpCisJCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byByZXNvbHZlIHJlbW90ZSBIRUFEIik7CisJCWlmICghaGFzX3NoYTFfZmlsZShoZWFkX3NoYTEpKQorCQkJcmV0dXJuIGVycm9yKCJSZW1vdGUgSEVBRCByZXNvbHZlcyB0byBvYmplY3QgJXNcbndoaWNoIGRvZXMgbm90IGV4aXN0IGxvY2FsbHksIHBlcmhhcHMgeW91IG5lZWQgdG8gZmV0Y2g/Iiwgc2hhMV90b19oZXgoaGVhZF9zaGExKSk7CisKKwkJLyogUmVtb3RlIGJyYW5jaCBtdXN0IHJlc29sdmUgdG8gYSBrbm93biBvYmplY3QgKi8KKwkJaWYgKGlzX3plcm9fc2hhMShyZW1vdGVfcmVmLT5vbGRfc2hhMSkpCisJCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byByZXNvbHZlIHJlbW90ZSBicmFuY2ggJXMiLAorCQkJCSAgICAgcmVtb3RlX3JlZi0+bmFtZSk7CisJCWlmICghaGFzX3NoYTFfZmlsZShyZW1vdGVfcmVmLT5vbGRfc2hhMSkpCisJCQlyZXR1cm4gZXJyb3IoIlJlbW90ZSBicmFuY2ggJXMgcmVzb2x2ZXMgdG8gb2JqZWN0ICVzXG53aGljaCBkb2VzIG5vdCBleGlzdCBsb2NhbGx5LCBwZXJoYXBzIHlvdSBuZWVkIHRvIGZldGNoPyIsIHJlbW90ZV9yZWYtPm5hbWUsIHNoYTFfdG9faGV4KHJlbW90ZV9yZWYtPm9sZF9zaGExKSk7CisKKwkJLyogUmVtb3RlIGJyYW5jaCBtdXN0IGJlIGFuIGFuY2VzdG9yIG9mIHJlbW90ZSBIRUFEICovCisJCWlmICghdmVyaWZ5X21lcmdlX2Jhc2UoaGVhZF9zaGExLCByZW1vdGVfcmVmLT5vbGRfc2hhMSkpIHsKKwkJCXJldHVybiBlcnJvcigiVGhlIGJyYW5jaCAnJXMnIGlzIG5vdCBhbiBhbmNlc3RvciAiCisJCQkJICAgICAib2YgeW91ciBjdXJyZW50IEhFQUQuXG4iCisJCQkJICAgICAiSWYgeW91IGFyZSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSBpdCwiCisJCQkJICAgICAiIHJ1bjpcblx0J2dpdCBodHRwLXB1c2ggLUQgJXMgJXMnIiwKKwkJCQkgICAgIHJlbW90ZV9yZWYtPm5hbWUsIHJlbW90ZS0+dXJsLCBwYXR0ZXJuKTsKKwkJfQorCX0KKworCS8qIFNlbmQgZGVsZXRlIHJlcXVlc3QgKi8KKwlmcHJpbnRmKHN0ZGVyciwgIlJlbW92aW5nIHJlbW90ZSBicmFuY2ggJyVzJ1xuIiwgcmVtb3RlX3JlZi0+bmFtZSk7CisJaWYgKGRyeV9ydW4pCisJCXJldHVybiAwOworCXVybCA9IHhtYWxsb2Moc3RybGVuKHJlbW90ZS0+dXJsKSArIHN0cmxlbihyZW1vdGVfcmVmLT5uYW1lKSArIDEpOworCXNwcmludGYodXJsLCAiJXMlcyIsIHJlbW90ZS0+dXJsLCByZW1vdGVfcmVmLT5uYW1lKTsKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQR0VULCAxKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX251bGwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsIERBVl9ERUxFVEUpOworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWZyZWUodXJsKTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgIT0gQ1VSTEVfT0spCisJCQlyZXR1cm4gZXJyb3IoIkRFTEVURSByZXF1ZXN0IGZhaWxlZCAoJWQvJWxkKVxuIiwKKwkJCQkgICAgIHJlc3VsdHMuY3VybF9yZXN1bHQsIHJlc3VsdHMuaHR0cF9jb2RlKTsKKwl9IGVsc2UgeworCQlmcmVlKHVybCk7CisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIHN0YXJ0IERFTEVURSByZXF1ZXN0Iik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdDsKKwlzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqbmV4dF9yZXF1ZXN0OworCWludCBucl9yZWZzcGVjID0gMDsKKwljaGFyICoqcmVmc3BlYyA9IE5VTEw7CisJc3RydWN0IHJlbW90ZV9sb2NrICpyZWZfbG9jayA9IE5VTEw7CisJc3RydWN0IHJlbW90ZV9sb2NrICppbmZvX3JlZl9sb2NrID0gTlVMTDsKKwlzdHJ1Y3QgcmV2X2luZm8gcmV2czsKKwlpbnQgZGVsZXRlX2JyYW5jaCA9IDA7CisJaW50IGZvcmNlX2RlbGV0ZSA9IDA7CisJaW50IG9iamVjdHNfdG9fc2VuZDsKKwlpbnQgcmMgPSAwOworCWludCBpOworCWludCBuZXdfcmVmczsKKwlzdHJ1Y3QgcmVmICpyZWY7CisJY2hhciAqcmV3cml0dGVuX3VybCA9IE5VTEw7CisKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisKKwlyZW1vdGUgPSB4Y2FsbG9jKHNpemVvZigqcmVtb3RlKSwgMSk7CisKKwlhcmd2Kys7CisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKywgYXJndisrKSB7CisJCWNoYXIgKmFyZyA9ICphcmd2OworCisJCWlmICgqYXJnID09ICctJykgeworCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1hbGwiKSkgeworCQkJCXB1c2hfYWxsID0gTUFUQ0hfUkVGU19BTEw7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWZvcmNlIikpIHsKKwkJCQlmb3JjZV9hbGwgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1kcnktcnVuIikpIHsKKwkJCQlkcnlfcnVuID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tdmVyYm9zZSIpKSB7CisJCQkJcHVzaF92ZXJib3NlbHkgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLWQiKSkgeworCQkJCWRlbGV0ZV9icmFuY2ggPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLUQiKSkgeworCQkJCWRlbGV0ZV9icmFuY2ggPSAxOworCQkJCWZvcmNlX2RlbGV0ZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJaWYgKCFyZW1vdGUtPnVybCkgeworCQkJY2hhciAqcGF0aCA9IHN0cnN0cihhcmcsICIvLyIpOworCQkJcmVtb3RlLT51cmwgPSBhcmc7CisJCQlpZiAocGF0aCkgeworCQkJCXBhdGggPSBzdHJjaHIocGF0aCsyLCAnLycpOworCQkJCWlmIChwYXRoKQorCQkJCQlyZW1vdGUtPnBhdGhfbGVuID0gc3RybGVuKHBhdGgpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJcmVmc3BlYyA9IGFyZ3Y7CisJCW5yX3JlZnNwZWMgPSBhcmdjIC0gaTsKKwkJYnJlYWs7CisJfQorCisjaWZuZGVmIFVTRV9DVVJMX01VTFRJCisJZGllKCJnaXQtcHVzaCBpcyBub3QgYXZhaWxhYmxlIGZvciBodHRwL2h0dHBzIHJlcG9zaXRvcnkgd2hlbiBub3QgY29tcGlsZWQgd2l0aCBVU0VfQ1VSTF9NVUxUSSIpOworI2VuZGlmCisKKwlpZiAoIXJlbW90ZS0+dXJsKQorCQl1c2FnZShodHRwX3B1c2hfdXNhZ2UpOworCisJaWYgKGRlbGV0ZV9icmFuY2ggJiYgbnJfcmVmc3BlYyAhPSAxKQorCQlkaWUoIllvdSBtdXN0IHNwZWNpZnkgb25seSBvbmUgYnJhbmNoIG5hbWUgd2hlbiBkZWxldGluZyBhIHJlbW90ZSBicmFuY2giKTsKKworCW1lbXNldChyZW1vdGVfZGlyX2V4aXN0cywgLTEsIDI1Nik7CisKKwlodHRwX2luaXQoTlVMTCk7CisKKwlub19wcmFnbWFfaGVhZGVyID0gY3VybF9zbGlzdF9hcHBlbmQobm9fcHJhZ21hX2hlYWRlciwgIlByYWdtYToiKTsKKworCWlmIChyZW1vdGUtPnVybCAmJiByZW1vdGUtPnVybFtzdHJsZW4ocmVtb3RlLT51cmwpLTFdICE9ICcvJykgeworCQlyZXdyaXR0ZW5fdXJsID0gbWFsbG9jKHN0cmxlbihyZW1vdGUtPnVybCkrMik7CisJCXN0cmNweShyZXdyaXR0ZW5fdXJsLCByZW1vdGUtPnVybCk7CisJCXN0cmNhdChyZXdyaXR0ZW5fdXJsLCAiLyIpOworCQlyZW1vdGUtPnVybCA9IHJld3JpdHRlbl91cmw7CisJCSsrcmVtb3RlLT5wYXRoX2xlbjsKKwl9CisKKwkvKiBWZXJpZnkgREFWIGNvbXBsaWFuY2UvbG9jayBzdXBwb3J0ICovCisJaWYgKCFsb2NraW5nX2F2YWlsYWJsZSgpKSB7CisJCXJjID0gMTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIENoZWNrIHdoZXRoZXIgdGhlIHJlbW90ZSBoYXMgc2VydmVyIGluZm8gZmlsZXMgKi8KKwlyZW1vdGUtPmNhbl91cGRhdGVfaW5mb19yZWZzID0gMDsKKwlyZW1vdGUtPmhhc19pbmZvX3JlZnMgPSByZW1vdGVfZXhpc3RzKCJpbmZvL3JlZnMiKTsKKwlyZW1vdGUtPmhhc19pbmZvX3BhY2tzID0gcmVtb3RlX2V4aXN0cygib2JqZWN0cy9pbmZvL3BhY2tzIik7CisJaWYgKHJlbW90ZS0+aGFzX2luZm9fcmVmcykgeworCQlpbmZvX3JlZl9sb2NrID0gbG9ja19yZW1vdGUoImluZm8vcmVmcyIsIExPQ0tfVElNRSk7CisJCWlmIChpbmZvX3JlZl9sb2NrKQorCQkJcmVtb3RlLT5jYW5fdXBkYXRlX2luZm9fcmVmcyA9IDE7CisJCWVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogY2Fubm90IGxvY2sgZXhpc3RpbmcgaW5mby9yZWZzXG4iKTsKKwkJCXJjID0gMTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCX0KKwlpZiAocmVtb3RlLT5oYXNfaW5mb19wYWNrcykKKwkJZmV0Y2hfaW5kaWNlcygpOworCisJLyogR2V0IGEgbGlzdCBvZiBhbGwgbG9jYWwgYW5kIHJlbW90ZSBoZWFkcyB0byB2YWxpZGF0ZSByZWZzcGVjcyAqLworCWdldF9sb2NhbF9oZWFkcygpOworCWZwcmludGYoc3RkZXJyLCAiRmV0Y2hpbmcgcmVtb3RlIGhlYWRzLi4uXG4iKTsKKwlnZXRfZGF2X3JlbW90ZV9oZWFkcygpOworCisJLyogUmVtb3ZlIGEgcmVtb3RlIGJyYW5jaCBpZiAtZCBvciAtRCB3YXMgc3BlY2lmaWVkICovCisJaWYgKGRlbGV0ZV9icmFuY2gpIHsKKwkJaWYgKGRlbGV0ZV9yZW1vdGVfYnJhbmNoKHJlZnNwZWNbMF0sIGZvcmNlX2RlbGV0ZSkgPT0gLTEpCisJCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBkZWxldGUgcmVtb3RlIGJyYW5jaCAlc1xuIiwKKwkJCQlyZWZzcGVjWzBdKTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIG1hdGNoIHRoZW0gdXAgKi8KKwlpZiAoIXJlbW90ZV90YWlsKQorCQlyZW1vdGVfdGFpbCA9ICZyZW1vdGVfcmVmczsKKwlpZiAobWF0Y2hfcmVmcyhsb2NhbF9yZWZzLCByZW1vdGVfcmVmcywgJnJlbW90ZV90YWlsLAorCQkgICAgICAgbnJfcmVmc3BlYywgKGNvbnN0IGNoYXIgKiopIHJlZnNwZWMsIHB1c2hfYWxsKSkgeworCQlyYyA9IC0xOworCQlnb3RvIGNsZWFudXA7CisJfQorCWlmICghcmVtb3RlX3JlZnMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJObyByZWZzIGluIGNvbW1vbiBhbmQgbm9uZSBzcGVjaWZpZWQ7IGRvaW5nIG5vdGhpbmcuXG4iKTsKKwkJcmMgPSAwOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJbmV3X3JlZnMgPSAwOworCWZvciAocmVmID0gcmVtb3RlX3JlZnM7IHJlZjsgcmVmID0gcmVmLT5uZXh0KSB7CisJCWNoYXIgb2xkX2hleFs2MF0sICpuZXdfaGV4OworCQljb25zdCBjaGFyICpjb21taXRfYXJndls0XTsKKwkJaW50IGNvbW1pdF9hcmdjOworCQljaGFyICpuZXdfc2hhMV9oZXgsICpvbGRfc2hhMV9oZXg7CisKKwkJaWYgKCFyZWYtPnBlZXJfcmVmKQorCQkJY29udGludWU7CisKKwkJaWYgKGlzX3plcm9fc2hhMShyZWYtPnBlZXJfcmVmLT5uZXdfc2hhMSkpIHsKKwkJCWlmIChkZWxldGVfcmVtb3RlX2JyYW5jaChyZWYtPm5hbWUsIDEpID09IC0xKSB7CisJCQkJZXJyb3IoIkNvdWxkIG5vdCByZW1vdmUgJXMiLCByZWYtPm5hbWUpOworCQkJCXJjID0gLTQ7CisJCQl9CisJCQluZXdfcmVmcysrOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIWhhc2hjbXAocmVmLT5vbGRfc2hhMSwgcmVmLT5wZWVyX3JlZi0+bmV3X3NoYTEpKSB7CisJCQlpZiAocHVzaF92ZXJib3NlbHkgfHwgMSkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiclcyc6IHVwLXRvLWRhdGVcbiIsIHJlZi0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghZm9yY2VfYWxsICYmCisJCSAgICAhaXNfemVyb19zaGExKHJlZi0+b2xkX3NoYTEpICYmCisJCSAgICAhcmVmLT5mb3JjZSkgeworCQkJaWYgKCFoYXNfc2hhMV9maWxlKHJlZi0+b2xkX3NoYTEpIHx8CisJCQkgICAgIXJlZl9uZXdlcihyZWYtPnBlZXJfcmVmLT5uZXdfc2hhMSwKKwkJCQkgICAgICAgcmVmLT5vbGRfc2hhMSkpIHsKKwkJCQkvKgorCQkJCSAqIFdlIGRvIG5vdCBoYXZlIHRoZSByZW1vdGUgcmVmLCBvcgorCQkJCSAqIHdlIGtub3cgdGhhdCB0aGUgcmVtb3RlIHJlZiBpcyBub3QKKwkJCQkgKiBhbiBhbmNlc3RvciBvZiB3aGF0IHdlIGFyZSB0cnlpbmcgdG8KKwkJCQkgKiBwdXNoLiAgRWl0aGVyIHdheSB0aGlzIGNhbiBiZSBsb3NpbmcKKwkJCQkgKiBjb21taXRzIGF0IHRoZSByZW1vdGUgZW5kIGFuZCBsaWtlbHkKKwkJCQkgKiB3ZSB3ZXJlIG5vdCB1cCB0byBkYXRlIHRvIGJlZ2luIHdpdGguCisJCQkJICovCisJCQkJZXJyb3IoInJlbW90ZSAnJXMnIGlzIG5vdCBhbiBhbmNlc3RvciBvZlxuIgorCQkJCSAgICAgICJsb2NhbCAnJXMnLlxuIgorCQkJCSAgICAgICJNYXliZSB5b3UgYXJlIG5vdCB1cC10by1kYXRlIGFuZCAiCisJCQkJICAgICAgIm5lZWQgdG8gcHVsbCBmaXJzdD8iLAorCQkJCSAgICAgIHJlZi0+bmFtZSwKKwkJCQkgICAgICByZWYtPnBlZXJfcmVmLT5uYW1lKTsKKwkJCQlyYyA9IC0yOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWhhc2hjcHkocmVmLT5uZXdfc2hhMSwgcmVmLT5wZWVyX3JlZi0+bmV3X3NoYTEpOworCQluZXdfcmVmcysrOworCQlzdHJjcHkob2xkX2hleCwgc2hhMV90b19oZXgocmVmLT5vbGRfc2hhMSkpOworCQluZXdfaGV4ID0gc2hhMV90b19oZXgocmVmLT5uZXdfc2hhMSk7CisKKwkJZnByaW50ZihzdGRlcnIsICJ1cGRhdGluZyAnJXMnIiwgcmVmLT5uYW1lKTsKKwkJaWYgKHN0cmNtcChyZWYtPm5hbWUsIHJlZi0+cGVlcl9yZWYtPm5hbWUpKQorCQkJZnByaW50ZihzdGRlcnIsICIgdXNpbmcgJyVzJyIsIHJlZi0+cGVlcl9yZWYtPm5hbWUpOworCQlmcHJpbnRmKHN0ZGVyciwgIlxuICBmcm9tICVzXG4gIHRvICAgJXNcbiIsIG9sZF9oZXgsIG5ld19oZXgpOworCQlpZiAoZHJ5X3J1bikKKwkJCWNvbnRpbnVlOworCisJCS8qIExvY2sgcmVtb3RlIGJyYW5jaCByZWYgKi8KKwkJcmVmX2xvY2sgPSBsb2NrX3JlbW90ZShyZWYtPm5hbWUsIExPQ0tfVElNRSk7CisJCWlmIChyZWZfbG9jayA9PSBOVUxMKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBsb2NrIHJlbW90ZSBicmFuY2ggJXNcbiIsCisJCQkJcmVmLT5uYW1lKTsKKwkJCXJjID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogU2V0IHVwIHJldmlzaW9uIGluZm8gZm9yIHRoaXMgcmVmc3BlYyAqLworCQljb21taXRfYXJnYyA9IDM7CisJCW5ld19zaGExX2hleCA9IHhzdHJkdXAoc2hhMV90b19oZXgocmVmLT5uZXdfc2hhMSkpOworCQlvbGRfc2hhMV9oZXggPSBOVUxMOworCQljb21taXRfYXJndlsxXSA9ICItLW9iamVjdHMiOworCQljb21taXRfYXJndlsyXSA9IG5ld19zaGExX2hleDsKKwkJaWYgKCFwdXNoX2FsbCAmJiAhaXNfemVyb19zaGExKHJlZi0+b2xkX3NoYTEpKSB7CisJCQlvbGRfc2hhMV9oZXggPSB4bWFsbG9jKDQyKTsKKwkJCXNwcmludGYob2xkX3NoYTFfaGV4LCAiXiVzIiwKKwkJCQlzaGExX3RvX2hleChyZWYtPm9sZF9zaGExKSk7CisJCQljb21taXRfYXJndlszXSA9IG9sZF9zaGExX2hleDsKKwkJCWNvbW1pdF9hcmdjKys7CisJCX0KKwkJaW5pdF9yZXZpc2lvbnMoJnJldnMsIHNldHVwX2dpdF9kaXJlY3RvcnkoKSk7CisJCXNldHVwX3JldmlzaW9ucyhjb21taXRfYXJnYywgY29tbWl0X2FyZ3YsICZyZXZzLCBOVUxMKTsKKwkJZnJlZShuZXdfc2hhMV9oZXgpOworCQlpZiAob2xkX3NoYTFfaGV4KSB7CisJCQlmcmVlKG9sZF9zaGExX2hleCk7CisJCQljb21taXRfYXJndlsxXSA9IE5VTEw7CisJCX0KKworCQkvKiBHZW5lcmF0ZSBhIGxpc3Qgb2Ygb2JqZWN0cyB0aGF0IG5lZWQgdG8gYmUgcHVzaGVkICovCisJCXB1c2hpbmcgPSAwOworCQlpZiAocHJlcGFyZV9yZXZpc2lvbl93YWxrKCZyZXZzKSkKKwkJCWRpZSgicmV2aXNpb24gd2FsayBzZXR1cCBmYWlsZWQiKTsKKwkJbWFya19lZGdlc191bmludGVyZXN0aW5nKHJldnMuY29tbWl0cyk7CisJCW9iamVjdHNfdG9fc2VuZCA9IGdldF9kZWx0YSgmcmV2cywgcmVmX2xvY2spOworCQlmaW5pc2hfYWxsX2FjdGl2ZV9zbG90cygpOworCisJCS8qIFB1c2ggbWlzc2luZyBvYmplY3RzIHRvIHJlbW90ZSwgdGhpcyB3b3VsZCBiZSBhCisJCSAgIGNvbnZlbmllbnQgdGltZSB0byBwYWNrIHRoZW0gZmlyc3QgaWYgYXBwcm9wcmlhdGUuICovCisJCXB1c2hpbmcgPSAxOworCQlpZiAob2JqZWN0c190b19zZW5kKQorCQkJZnByaW50ZihzdGRlcnIsICIgICAgc2VuZGluZyAlZCBvYmplY3RzXG4iLAorCQkJCW9iamVjdHNfdG9fc2VuZCk7CisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwkJZmlsbF9hY3RpdmVfc2xvdHMoKTsKKwkJYWRkX2ZpbGxfZnVuY3Rpb24oTlVMTCwgZmlsbF9hY3RpdmVfc2xvdCk7CisjZW5kaWYKKwkJZG8geworCQkJZmluaXNoX2FsbF9hY3RpdmVfc2xvdHMoKTsKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorCQkJZmlsbF9hY3RpdmVfc2xvdHMoKTsKKyNlbmRpZgorCQl9IHdoaWxlIChyZXF1ZXN0X3F1ZXVlX2hlYWQgJiYgIWFib3J0ZWQpOworCisJCS8qIFVwZGF0ZSB0aGUgcmVtb3RlIGJyYW5jaCBpZiBhbGwgd2VudCB3ZWxsICovCisJCWlmIChhYm9ydGVkIHx8ICF1cGRhdGVfcmVtb3RlKHJlZi0+bmV3X3NoYTEsIHJlZl9sb2NrKSkKKwkJCXJjID0gMTsKKworCQlpZiAoIXJjKQorCQkJZnByaW50ZihzdGRlcnIsICIgICAgZG9uZVxuIik7CisJCXVubG9ja19yZW1vdGUocmVmX2xvY2spOworCQljaGVja19sb2NrcygpOworCX0KKworCS8qIFVwZGF0ZSByZW1vdGUgc2VydmVyIGluZm8gaWYgYXBwcm9wcmlhdGUgKi8KKwlpZiAocmVtb3RlLT5oYXNfaW5mb19yZWZzICYmIG5ld19yZWZzKSB7CisJCWlmIChpbmZvX3JlZl9sb2NrICYmIHJlbW90ZS0+Y2FuX3VwZGF0ZV9pbmZvX3JlZnMpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiVXBkYXRpbmcgcmVtb3RlIHNlcnZlciBpbmZvXG4iKTsKKwkJCWlmICghZHJ5X3J1bikKKwkJCQl1cGRhdGVfcmVtb3RlX2luZm9fcmVmcyhpbmZvX3JlZl9sb2NrKTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIHVwZGF0ZSBzZXJ2ZXIgaW5mb1xuIik7CisJCX0KKwl9CisKKyBjbGVhbnVwOgorCWZyZWUocmV3cml0dGVuX3VybCk7CisJaWYgKGluZm9fcmVmX2xvY2spCisJCXVubG9ja19yZW1vdGUoaW5mb19yZWZfbG9jayk7CisJZnJlZShyZW1vdGUpOworCisJY3VybF9zbGlzdF9mcmVlX2FsbChub19wcmFnbWFfaGVhZGVyKTsKKworCWh0dHBfY2xlYW51cCgpOworCisJcmVxdWVzdCA9IHJlcXVlc3RfcXVldWVfaGVhZDsKKwl3aGlsZSAocmVxdWVzdCAhPSBOVUxMKSB7CisJCW5leHRfcmVxdWVzdCA9IHJlcXVlc3QtPm5leHQ7CisJCXJlbGVhc2VfcmVxdWVzdChyZXF1ZXN0KTsKKwkJcmVxdWVzdCA9IG5leHRfcmVxdWVzdDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9odHRwLXdhbGtlci5jIGIvaHR0cC13YWxrZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmRhMzRkCi0tLSAvZGV2L251bGwKKysrIGIvaHR0cC13YWxrZXIuYwpAQCAtMCwwICsxLDkzOCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAicGFjay5oIgorI2luY2x1ZGUgIndhbGtlci5oIgorI2luY2x1ZGUgImh0dHAuaCIKKworI2RlZmluZSBQUkVWX0JVRl9TSVpFIDQwOTYKKyNkZWZpbmUgUkFOR0VfSEVBREVSX1NJWkUgMzAKKworc3RydWN0IGFsdF9iYXNlCit7CisJY2hhciAqYmFzZTsKKwlpbnQgZ290X2luZGljZXM7CisJc3RydWN0IHBhY2tlZF9naXQgKnBhY2tzOworCXN0cnVjdCBhbHRfYmFzZSAqbmV4dDsKK307CisKK2VudW0gb2JqZWN0X3JlcXVlc3Rfc3RhdGUgeworCVdBSVRJTkcsCisJQUJPUlRFRCwKKwlBQ1RJVkUsCisJQ09NUExFVEUsCit9OworCitzdHJ1Y3Qgb2JqZWN0X3JlcXVlc3QKK3sKKwlzdHJ1Y3Qgd2Fsa2VyICp3YWxrZXI7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3QgYWx0X2Jhc2UgKnJlcG87CisJY2hhciAqdXJsOworCWNoYXIgZmlsZW5hbWVbUEFUSF9NQVhdOworCWNoYXIgdG1wZmlsZVtQQVRIX01BWF07CisJaW50IGxvY2FsOworCWVudW0gb2JqZWN0X3JlcXVlc3Rfc3RhdGUgc3RhdGU7CisJQ1VSTGNvZGUgY3VybF9yZXN1bHQ7CisJY2hhciBlcnJvcnN0cltDVVJMX0VSUk9SX1NJWkVdOworCWxvbmcgaHR0cF9jb2RlOworCXVuc2lnbmVkIGNoYXIgcmVhbF9zaGExWzIwXTsKKwlTSEFfQ1RYIGM7CisJel9zdHJlYW0gc3RyZWFtOworCWludCB6cmV0OworCWludCByZW5hbWU7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IG9iamVjdF9yZXF1ZXN0ICpuZXh0OworfTsKKworc3RydWN0IGFsdGVybmF0ZXNfcmVxdWVzdCB7CisJc3RydWN0IHdhbGtlciAqd2Fsa2VyOworCWNvbnN0IGNoYXIgKmJhc2U7CisJY2hhciAqdXJsOworCXN0cnVjdCBzdHJidWYgKmJ1ZmZlcjsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlpbnQgaHR0cF9zcGVjaWZpYzsKK307CisKK3N0cnVjdCB3YWxrZXJfZGF0YSB7CisJY29uc3QgY2hhciAqdXJsOworCWludCBnb3RfYWx0ZXJuYXRlczsKKwlzdHJ1Y3QgYWx0X2Jhc2UgKmFsdDsKKwlzdHJ1Y3QgY3VybF9zbGlzdCAqbm9fcHJhZ21hX2hlYWRlcjsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X3JlcXVlc3QgKm9iamVjdF9xdWV1ZV9oZWFkOworCitzdGF0aWMgc2l6ZV90IGZ3cml0ZV9zaGExX2ZpbGUodm9pZCAqcHRyLCBzaXplX3QgZWx0c2l6ZSwgc2l6ZV90IG5tZW1iLAorCQkJICAgICAgIHZvaWQgKmRhdGEpCit7CisJdW5zaWduZWQgY2hhciBleHBuWzQwOTZdOworCXNpemVfdCBzaXplID0gZWx0c2l6ZSAqIG5tZW1iOworCWludCBwb3NuID0gMDsKKwlzdHJ1Y3Qgb2JqZWN0X3JlcXVlc3QgKm9ial9yZXEgPSAoc3RydWN0IG9iamVjdF9yZXF1ZXN0ICopZGF0YTsKKwlkbyB7CisJCXNzaXplX3QgcmV0dmFsID0geHdyaXRlKG9ial9yZXEtPmxvY2FsLAorCQkJCSAgICAgICAoY2hhciAqKSBwdHIgKyBwb3NuLCBzaXplIC0gcG9zbik7CisJCWlmIChyZXR2YWwgPCAwKQorCQkJcmV0dXJuIHBvc247CisJCXBvc24gKz0gcmV0dmFsOworCX0gd2hpbGUgKHBvc24gPCBzaXplKTsKKworCW9ial9yZXEtPnN0cmVhbS5hdmFpbF9pbiA9IHNpemU7CisJb2JqX3JlcS0+c3RyZWFtLm5leHRfaW4gPSBwdHI7CisJZG8geworCQlvYmpfcmVxLT5zdHJlYW0ubmV4dF9vdXQgPSBleHBuOworCQlvYmpfcmVxLT5zdHJlYW0uYXZhaWxfb3V0ID0gc2l6ZW9mKGV4cG4pOworCQlvYmpfcmVxLT56cmV0ID0gaW5mbGF0ZSgmb2JqX3JlcS0+c3RyZWFtLCBaX1NZTkNfRkxVU0gpOworCQlTSEExX1VwZGF0ZSgmb2JqX3JlcS0+YywgZXhwbiwKKwkJCSAgICBzaXplb2YoZXhwbikgLSBvYmpfcmVxLT5zdHJlYW0uYXZhaWxfb3V0KTsKKwl9IHdoaWxlIChvYmpfcmVxLT5zdHJlYW0uYXZhaWxfaW4gJiYgb2JqX3JlcS0+enJldCA9PSBaX09LKTsKKwlkYXRhX3JlY2VpdmVkKys7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyB2b2lkIGZldGNoX2FsdGVybmF0ZXMoc3RydWN0IHdhbGtlciAqd2Fsa2VyLCBjb25zdCBjaGFyICpiYXNlKTsKKworc3RhdGljIHZvaWQgcHJvY2Vzc19vYmplY3RfcmVzcG9uc2Uodm9pZCAqY2FsbGJhY2tfZGF0YSk7CisKK3N0YXRpYyB2b2lkIHN0YXJ0X29iamVjdF9yZXF1ZXN0KHN0cnVjdCB3YWxrZXIgKndhbGtlciwKKwkJCQkgc3RydWN0IG9iamVjdF9yZXF1ZXN0ICpvYmpfcmVxKQoreworCWNoYXIgKmhleCA9IHNoYTFfdG9faGV4KG9ial9yZXEtPnNoYTEpOworCWNoYXIgcHJldmZpbGVbUEFUSF9NQVhdOworCWNoYXIgKnVybDsKKwljaGFyICpwb3NuOworCWludCBwcmV2bG9jYWw7CisJdW5zaWduZWQgY2hhciBwcmV2X2J1ZltQUkVWX0JVRl9TSVpFXTsKKwlzc2l6ZV90IHByZXZfcmVhZCA9IDA7CisJbG9uZyBwcmV2X3Bvc24gPSAwOworCWNoYXIgcmFuZ2VbUkFOR0VfSEVBREVSX1NJWkVdOworCXN0cnVjdCBjdXJsX3NsaXN0ICpyYW5nZV9oZWFkZXIgPSBOVUxMOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCB3YWxrZXJfZGF0YSAqZGF0YSA9IHdhbGtlci0+ZGF0YTsKKworCXNucHJpbnRmKHByZXZmaWxlLCBzaXplb2YocHJldmZpbGUpLCAiJXMucHJldiIsIG9ial9yZXEtPmZpbGVuYW1lKTsKKwl1bmxpbmsocHJldmZpbGUpOworCXJlbmFtZShvYmpfcmVxLT50bXBmaWxlLCBwcmV2ZmlsZSk7CisJdW5saW5rKG9ial9yZXEtPnRtcGZpbGUpOworCisJaWYgKG9ial9yZXEtPmxvY2FsICE9IC0xKQorCQllcnJvcigiZmQgbGVha2FnZSBpbiBzdGFydDogJWQiLCBvYmpfcmVxLT5sb2NhbCk7CisJb2JqX3JlcS0+bG9jYWwgPSBvcGVuKG9ial9yZXEtPnRtcGZpbGUsCisJCQkgICAgICBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0VYQ0wsIDA2NjYpOworCS8qIFRoaXMgY291bGQgaGF2ZSBmYWlsZWQgZHVlIHRvIHRoZSAibGF6eSBkaXJlY3RvcnkgY3JlYXRpb24iOworCSAqIHRyeSB0byBta2RpciB0aGUgbGFzdCBwYXRoIGNvbXBvbmVudC4KKwkgKi8KKwlpZiAob2JqX3JlcS0+bG9jYWwgPCAwICYmIGVycm5vID09IEVOT0VOVCkgeworCQljaGFyICpkaXIgPSBzdHJyY2hyKG9ial9yZXEtPnRtcGZpbGUsICcvJyk7CisJCWlmIChkaXIpIHsKKwkJCSpkaXIgPSAwOworCQkJbWtkaXIob2JqX3JlcS0+dG1wZmlsZSwgMDc3Nyk7CisJCQkqZGlyID0gJy8nOworCQl9CisJCW9ial9yZXEtPmxvY2FsID0gb3BlbihvYmpfcmVxLT50bXBmaWxlLAorCQkJCSAgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCwgMDY2Nik7CisJfQorCisJaWYgKG9ial9yZXEtPmxvY2FsIDwgMCkgeworCQlvYmpfcmVxLT5zdGF0ZSA9IEFCT1JURUQ7CisJCWVycm9yKCJDb3VsZG4ndCBjcmVhdGUgdGVtcG9yYXJ5IGZpbGUgJXMgZm9yICVzOiAlcyIsCisJCSAgICAgIG9ial9yZXEtPnRtcGZpbGUsIG9ial9yZXEtPmZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm47CisJfQorCisJbWVtc2V0KCZvYmpfcmVxLT5zdHJlYW0sIDAsIHNpemVvZihvYmpfcmVxLT5zdHJlYW0pKTsKKworCWluZmxhdGVJbml0KCZvYmpfcmVxLT5zdHJlYW0pOworCisJU0hBMV9Jbml0KCZvYmpfcmVxLT5jKTsKKworCXVybCA9IHhtYWxsb2Moc3RybGVuKG9ial9yZXEtPnJlcG8tPmJhc2UpICsgNTEpOworCW9ial9yZXEtPnVybCA9IHhtYWxsb2Moc3RybGVuKG9ial9yZXEtPnJlcG8tPmJhc2UpICsgNTEpOworCXN0cmNweSh1cmwsIG9ial9yZXEtPnJlcG8tPmJhc2UpOworCXBvc24gPSB1cmwgKyBzdHJsZW4ob2JqX3JlcS0+cmVwby0+YmFzZSk7CisJc3RyY3B5KHBvc24sICIvb2JqZWN0cy8iKTsKKwlwb3NuICs9IDk7CisJbWVtY3B5KHBvc24sIGhleCwgMik7CisJcG9zbiArPSAyOworCSoocG9zbisrKSA9ICcvJzsKKwlzdHJjcHkocG9zbiwgaGV4ICsgMik7CisJc3RyY3B5KG9ial9yZXEtPnVybCwgdXJsKTsKKworCS8qIElmIGEgcHJldmlvdXMgdGVtcCBmaWxlIGlzIHByZXNlbnQsIHByb2Nlc3Mgd2hhdCB3YXMgYWxyZWFkeQorCSAgIGZldGNoZWQuICovCisJcHJldmxvY2FsID0gb3BlbihwcmV2ZmlsZSwgT19SRE9OTFkpOworCWlmIChwcmV2bG9jYWwgIT0gLTEpIHsKKwkJZG8geworCQkJcHJldl9yZWFkID0geHJlYWQocHJldmxvY2FsLCBwcmV2X2J1ZiwgUFJFVl9CVUZfU0laRSk7CisJCQlpZiAocHJldl9yZWFkPjApIHsKKwkJCQlpZiAoZndyaXRlX3NoYTFfZmlsZShwcmV2X2J1ZiwKKwkJCQkJCSAgICAgMSwKKwkJCQkJCSAgICAgcHJldl9yZWFkLAorCQkJCQkJICAgICBvYmpfcmVxKSA9PSBwcmV2X3JlYWQpIHsKKwkJCQkJcHJldl9wb3NuICs9IHByZXZfcmVhZDsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmV2X3JlYWQgPSAtMTsKKwkJCQl9CisJCQl9CisJCX0gd2hpbGUgKHByZXZfcmVhZCA+IDApOworCQljbG9zZShwcmV2bG9jYWwpOworCX0KKwl1bmxpbmsocHJldmZpbGUpOworCisJLyogUmVzZXQgaW5mbGF0ZS9TSEExIGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIHRoZSBwcmV2aW91cyB0ZW1wCisJICAgZmlsZTsgYWxzbyByZXdpbmQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbG9jYWwgZmlsZS4gKi8KKwlpZiAocHJldl9yZWFkID09IC0xKSB7CisJCW1lbXNldCgmb2JqX3JlcS0+c3RyZWFtLCAwLCBzaXplb2Yob2JqX3JlcS0+c3RyZWFtKSk7CisJCWluZmxhdGVJbml0KCZvYmpfcmVxLT5zdHJlYW0pOworCQlTSEExX0luaXQoJm9ial9yZXEtPmMpOworCQlpZiAocHJldl9wb3NuPjApIHsKKwkJCXByZXZfcG9zbiA9IDA7CisJCQlsc2VlayhvYmpfcmVxLT5sb2NhbCwgMCwgU0VFS19TRVQpOworCQkJZnRydW5jYXRlKG9ial9yZXEtPmxvY2FsLCAwKTsKKwkJfQorCX0KKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5jYWxsYmFja19mdW5jID0gcHJvY2Vzc19vYmplY3RfcmVzcG9uc2U7CisJc2xvdC0+Y2FsbGJhY2tfZGF0YSA9IG9ial9yZXE7CisJb2JqX3JlcS0+c2xvdCA9IHNsb3Q7CisKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfRklMRSwgb2JqX3JlcSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZV9zaGExX2ZpbGUpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9FUlJPUkJVRkZFUiwgb2JqX3JlcS0+ZXJyb3JzdHIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIGRhdGEtPm5vX3ByYWdtYV9oZWFkZXIpOworCisJLyogSWYgd2UgaGF2ZSBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkIGRhdGEgZnJvbSBhIHByZXZpb3VzIGZldGNoCisJICAgYXR0ZW1wdCwgb25seSBmZXRjaCB0aGUgZGF0YSB3ZSBkb24ndCBhbHJlYWR5IGhhdmUuICovCisJaWYgKHByZXZfcG9zbj4wKSB7CisJCWlmICh3YWxrZXItPmdldF92ZXJib3NlbHkpCisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiUmVzdW1pbmcgZmV0Y2ggb2Ygb2JqZWN0ICVzIGF0IGJ5dGUgJWxkXG4iLAorCQkJCWhleCwgcHJldl9wb3NuKTsKKwkJc3ByaW50ZihyYW5nZSwgIlJhbmdlOiBieXRlcz0lbGQtIiwgcHJldl9wb3NuKTsKKwkJcmFuZ2VfaGVhZGVyID0gY3VybF9zbGlzdF9hcHBlbmQocmFuZ2VfaGVhZGVyLCByYW5nZSk7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwKKwkJCQkgQ1VSTE9QVF9IVFRQSEVBREVSLCByYW5nZV9oZWFkZXIpOworCX0KKworCS8qIFRyeSB0byBnZXQgdGhlIHJlcXVlc3Qgc3RhcnRlZCwgYWJvcnQgdGhlIHJlcXVlc3Qgb24gZXJyb3IgKi8KKwlvYmpfcmVxLT5zdGF0ZSA9IEFDVElWRTsKKwlpZiAoIXN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCW9ial9yZXEtPnN0YXRlID0gQUJPUlRFRDsKKwkJb2JqX3JlcS0+c2xvdCA9IE5VTEw7CisJCWNsb3NlKG9ial9yZXEtPmxvY2FsKTsgb2JqX3JlcS0+bG9jYWwgPSAtMTsKKwkJZnJlZShvYmpfcmVxLT51cmwpOworCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgdm9pZCBmaW5pc2hfb2JqZWN0X3JlcXVlc3Qoc3RydWN0IG9iamVjdF9yZXF1ZXN0ICpvYmpfcmVxKQoreworCXN0cnVjdCBzdGF0IHN0OworCisJZmNobW9kKG9ial9yZXEtPmxvY2FsLCAwNDQ0KTsKKwljbG9zZShvYmpfcmVxLT5sb2NhbCk7IG9ial9yZXEtPmxvY2FsID0gLTE7CisKKwlpZiAob2JqX3JlcS0+aHR0cF9jb2RlID09IDQxNikgeworCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IHJlcXVlc3RlZCByYW5nZSBpbnZhbGlkOyB3ZSBtYXkgYWxyZWFkeSBoYXZlIGFsbCB0aGUgZGF0YS5cbiIpOworCX0gZWxzZSBpZiAob2JqX3JlcS0+Y3VybF9yZXN1bHQgIT0gQ1VSTEVfT0spIHsKKwkJaWYgKHN0YXQob2JqX3JlcS0+dG1wZmlsZSwgJnN0KSA9PSAwKQorCQkJaWYgKHN0LnN0X3NpemUgPT0gMCkKKwkJCQl1bmxpbmsob2JqX3JlcS0+dG1wZmlsZSk7CisJCXJldHVybjsKKwl9CisKKwlpbmZsYXRlRW5kKCZvYmpfcmVxLT5zdHJlYW0pOworCVNIQTFfRmluYWwob2JqX3JlcS0+cmVhbF9zaGExLCAmb2JqX3JlcS0+Yyk7CisJaWYgKG9ial9yZXEtPnpyZXQgIT0gWl9TVFJFQU1fRU5EKSB7CisJCXVubGluayhvYmpfcmVxLT50bXBmaWxlKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoaGFzaGNtcChvYmpfcmVxLT5zaGExLCBvYmpfcmVxLT5yZWFsX3NoYTEpKSB7CisJCXVubGluayhvYmpfcmVxLT50bXBmaWxlKTsKKwkJcmV0dXJuOworCX0KKwlvYmpfcmVxLT5yZW5hbWUgPQorCQltb3ZlX3RlbXBfdG9fZmlsZShvYmpfcmVxLT50bXBmaWxlLCBvYmpfcmVxLT5maWxlbmFtZSk7CisKKwlpZiAob2JqX3JlcS0+cmVuYW1lID09IDApCisJCXdhbGtlcl9zYXkob2JqX3JlcS0+d2Fsa2VyLCAiZ290ICVzXG4iLCBzaGExX3RvX2hleChvYmpfcmVxLT5zaGExKSk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3Nfb2JqZWN0X3Jlc3BvbnNlKHZvaWQgKmNhbGxiYWNrX2RhdGEpCit7CisJc3RydWN0IG9iamVjdF9yZXF1ZXN0ICpvYmpfcmVxID0KKwkJKHN0cnVjdCBvYmplY3RfcmVxdWVzdCAqKWNhbGxiYWNrX2RhdGE7CisJc3RydWN0IHdhbGtlciAqd2Fsa2VyID0gb2JqX3JlcS0+d2Fsa2VyOworCXN0cnVjdCB3YWxrZXJfZGF0YSAqZGF0YSA9IHdhbGtlci0+ZGF0YTsKKwlzdHJ1Y3QgYWx0X2Jhc2UgKmFsdCA9IGRhdGEtPmFsdDsKKworCW9ial9yZXEtPmN1cmxfcmVzdWx0ID0gb2JqX3JlcS0+c2xvdC0+Y3VybF9yZXN1bHQ7CisJb2JqX3JlcS0+aHR0cF9jb2RlID0gb2JqX3JlcS0+c2xvdC0+aHR0cF9jb2RlOworCW9ial9yZXEtPnNsb3QgPSBOVUxMOworCW9ial9yZXEtPnN0YXRlID0gQ09NUExFVEU7CisKKwkvKiBVc2UgYWx0ZXJuYXRlcyBpZiBuZWNlc3NhcnkgKi8KKwlpZiAobWlzc2luZ190YXJnZXQob2JqX3JlcSkpIHsKKwkJZmV0Y2hfYWx0ZXJuYXRlcyh3YWxrZXIsIGFsdC0+YmFzZSk7CisJCWlmIChvYmpfcmVxLT5yZXBvLT5uZXh0ICE9IE5VTEwpIHsKKwkJCW9ial9yZXEtPnJlcG8gPQorCQkJCW9ial9yZXEtPnJlcG8tPm5leHQ7CisJCQljbG9zZShvYmpfcmVxLT5sb2NhbCk7CisJCQlvYmpfcmVxLT5sb2NhbCA9IC0xOworCQkJc3RhcnRfb2JqZWN0X3JlcXVlc3Qod2Fsa2VyLCBvYmpfcmVxKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWZpbmlzaF9vYmplY3RfcmVxdWVzdChvYmpfcmVxKTsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9vYmplY3RfcmVxdWVzdChzdHJ1Y3Qgb2JqZWN0X3JlcXVlc3QgKm9ial9yZXEpCit7CisJc3RydWN0IG9iamVjdF9yZXF1ZXN0ICplbnRyeSA9IG9iamVjdF9xdWV1ZV9oZWFkOworCisJaWYgKG9ial9yZXEtPmxvY2FsICE9IC0xKQorCQllcnJvcigiZmQgbGVha2FnZSBpbiByZWxlYXNlOiAlZCIsIG9ial9yZXEtPmxvY2FsKTsKKwlpZiAob2JqX3JlcSA9PSBvYmplY3RfcXVldWVfaGVhZCkgeworCQlvYmplY3RfcXVldWVfaGVhZCA9IG9ial9yZXEtPm5leHQ7CisJfSBlbHNlIHsKKwkJd2hpbGUgKGVudHJ5LT5uZXh0ICE9IE5VTEwgJiYgZW50cnktPm5leHQgIT0gb2JqX3JlcSkKKwkJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJCWlmIChlbnRyeS0+bmV4dCA9PSBvYmpfcmVxKQorCQkJZW50cnktPm5leHQgPSBlbnRyeS0+bmV4dC0+bmV4dDsKKwl9CisKKwlmcmVlKG9ial9yZXEtPnVybCk7CisJZnJlZShvYmpfcmVxKTsKK30KKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCitzdGF0aWMgaW50IGZpbGxfYWN0aXZlX3Nsb3Qoc3RydWN0IHdhbGtlciAqd2Fsa2VyKQoreworCXN0cnVjdCBvYmplY3RfcmVxdWVzdCAqb2JqX3JlcTsKKworCWZvciAob2JqX3JlcSA9IG9iamVjdF9xdWV1ZV9oZWFkOyBvYmpfcmVxOyBvYmpfcmVxID0gb2JqX3JlcS0+bmV4dCkgeworCQlpZiAob2JqX3JlcS0+c3RhdGUgPT0gV0FJVElORykgeworCQkJaWYgKGhhc19zaGExX2ZpbGUob2JqX3JlcS0+c2hhMSkpCisJCQkJb2JqX3JlcS0+c3RhdGUgPSBDT01QTEVURTsKKwkJCWVsc2UgeworCQkJCXN0YXJ0X29iamVjdF9yZXF1ZXN0KHdhbGtlciwgb2JqX3JlcSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgcHJlZmV0Y2goc3RydWN0IHdhbGtlciAqd2Fsa2VyLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBvYmplY3RfcmVxdWVzdCAqbmV3cmVxOworCXN0cnVjdCBvYmplY3RfcmVxdWVzdCAqdGFpbDsKKwlzdHJ1Y3Qgd2Fsa2VyX2RhdGEgKmRhdGEgPSB3YWxrZXItPmRhdGE7CisJY2hhciAqZmlsZW5hbWUgPSBzaGExX2ZpbGVfbmFtZShzaGExKTsKKworCW5ld3JlcSA9IHhtYWxsb2Moc2l6ZW9mKCpuZXdyZXEpKTsKKwluZXdyZXEtPndhbGtlciA9IHdhbGtlcjsKKwloYXNoY3B5KG5ld3JlcS0+c2hhMSwgc2hhMSk7CisJbmV3cmVxLT5yZXBvID0gZGF0YS0+YWx0OworCW5ld3JlcS0+dXJsID0gTlVMTDsKKwluZXdyZXEtPmxvY2FsID0gLTE7CisJbmV3cmVxLT5zdGF0ZSA9IFdBSVRJTkc7CisJc25wcmludGYobmV3cmVxLT5maWxlbmFtZSwgc2l6ZW9mKG5ld3JlcS0+ZmlsZW5hbWUpLCAiJXMiLCBmaWxlbmFtZSk7CisJc25wcmludGYobmV3cmVxLT50bXBmaWxlLCBzaXplb2YobmV3cmVxLT50bXBmaWxlKSwKKwkJICIlcy50ZW1wIiwgZmlsZW5hbWUpOworCW5ld3JlcS0+c2xvdCA9IE5VTEw7CisJbmV3cmVxLT5uZXh0ID0gTlVMTDsKKworCWlmIChvYmplY3RfcXVldWVfaGVhZCA9PSBOVUxMKSB7CisJCW9iamVjdF9xdWV1ZV9oZWFkID0gbmV3cmVxOworCX0gZWxzZSB7CisJCXRhaWwgPSBvYmplY3RfcXVldWVfaGVhZDsKKwkJd2hpbGUgKHRhaWwtPm5leHQgIT0gTlVMTCkgeworCQkJdGFpbCA9IHRhaWwtPm5leHQ7CisJCX0KKwkJdGFpbC0+bmV4dCA9IG5ld3JlcTsKKwl9CisKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorCWZpbGxfYWN0aXZlX3Nsb3RzKCk7CisJc3RlcF9hY3RpdmVfc2xvdHMoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IGZldGNoX2luZGV4KHN0cnVjdCB3YWxrZXIgKndhbGtlciwgc3RydWN0IGFsdF9iYXNlICpyZXBvLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWNoYXIgKmhleCA9IHNoYTFfdG9faGV4KHNoYTEpOworCWNoYXIgKmZpbGVuYW1lOworCWNoYXIgKnVybDsKKwljaGFyIHRtcGZpbGVbUEFUSF9NQVhdOworCWxvbmcgcHJldl9wb3NuID0gMDsKKwljaGFyIHJhbmdlW1JBTkdFX0hFQURFUl9TSVpFXTsKKwlzdHJ1Y3QgY3VybF9zbGlzdCAqcmFuZ2VfaGVhZGVyID0gTlVMTDsKKwlzdHJ1Y3Qgd2Fsa2VyX2RhdGEgKmRhdGEgPSB3YWxrZXItPmRhdGE7CisKKwlGSUxFICppbmRleGZpbGU7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfcmVzdWx0cyByZXN1bHRzOworCisJaWYgKGhhc19wYWNrX2luZGV4KHNoYTEpKQorCQlyZXR1cm4gMDsKKworCWlmICh3YWxrZXItPmdldF92ZXJib3NlbHkpCisJCWZwcmludGYoc3RkZXJyLCAiR2V0dGluZyBpbmRleCBmb3IgcGFjayAlc1xuIiwgaGV4KTsKKworCXVybCA9IHhtYWxsb2Moc3RybGVuKHJlcG8tPmJhc2UpICsgNjQpOworCXNwcmludGYodXJsLCAiJXMvb2JqZWN0cy9wYWNrL3BhY2stJXMuaWR4IiwgcmVwby0+YmFzZSwgaGV4KTsKKworCWZpbGVuYW1lID0gc2hhMV9wYWNrX2luZGV4X25hbWUoc2hhMSk7CisJc25wcmludGYodG1wZmlsZSwgc2l6ZW9mKHRtcGZpbGUpLCAiJXMudGVtcCIsIGZpbGVuYW1lKTsKKwlpbmRleGZpbGUgPSBmb3Blbih0bXBmaWxlLCAiYSIpOworCWlmICghaW5kZXhmaWxlKQorCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBvcGVuIGxvY2FsIGZpbGUgJXMgZm9yIHBhY2sgaW5kZXgiLAorCQkJICAgICB0bXBmaWxlKTsKKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0ZJTEUsIGluZGV4ZmlsZSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgZGF0YS0+bm9fcHJhZ21hX2hlYWRlcik7CisJc2xvdC0+bG9jYWwgPSBpbmRleGZpbGU7CisKKwkvKiBJZiB0aGVyZSBpcyBkYXRhIHByZXNlbnQgZnJvbSBhIHByZXZpb3VzIHRyYW5zZmVyIGF0dGVtcHQsCisJICAgcmVzdW1lIHdoZXJlIGl0IGxlZnQgb2ZmICovCisJcHJldl9wb3NuID0gZnRlbGwoaW5kZXhmaWxlKTsKKwlpZiAocHJldl9wb3NuPjApIHsKKwkJaWYgKHdhbGtlci0+Z2V0X3ZlcmJvc2VseSkKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJSZXN1bWluZyBmZXRjaCBvZiBpbmRleCBmb3IgcGFjayAlcyBhdCBieXRlICVsZFxuIiwKKwkJCQloZXgsIHByZXZfcG9zbik7CisJCXNwcmludGYocmFuZ2UsICJSYW5nZTogYnl0ZXM9JWxkLSIsIHByZXZfcG9zbik7CisJCXJhbmdlX2hlYWRlciA9IGN1cmxfc2xpc3RfYXBwZW5kKHJhbmdlX2hlYWRlciwgcmFuZ2UpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgcmFuZ2VfaGVhZGVyKTsKKwl9CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQkJZmNsb3NlKGluZGV4ZmlsZSk7CisJCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBnZXQgcGFjayBpbmRleCAlc1xuJXMiLCB1cmwsCisJCQkJICAgICBjdXJsX2Vycm9yc3RyKTsKKwkJfQorCX0gZWxzZSB7CisJCWZjbG9zZShpbmRleGZpbGUpOworCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0Iik7CisJfQorCisJZmNsb3NlKGluZGV4ZmlsZSk7CisKKwlyZXR1cm4gbW92ZV90ZW1wX3RvX2ZpbGUodG1wZmlsZSwgZmlsZW5hbWUpOworfQorCitzdGF0aWMgaW50IHNldHVwX2luZGV4KHN0cnVjdCB3YWxrZXIgKndhbGtlciwgc3RydWN0IGFsdF9iYXNlICpyZXBvLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBwYWNrZWRfZ2l0ICpuZXdfcGFjazsKKwlpZiAoaGFzX3BhY2tfZmlsZShzaGExKSkKKwkJcmV0dXJuIDA7IC8qIGRvbid0IGxpc3QgdGhpcyBhcyBzb21ldGhpbmcgd2UgY2FuIGdldCAqLworCisJaWYgKGZldGNoX2luZGV4KHdhbGtlciwgcmVwbywgc2hhMSkpCisJCXJldHVybiAtMTsKKworCW5ld19wYWNrID0gcGFyc2VfcGFja19pbmRleChzaGExKTsKKwluZXdfcGFjay0+bmV4dCA9IHJlcG8tPnBhY2tzOworCXJlcG8tPnBhY2tzID0gbmV3X3BhY2s7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfYWx0ZXJuYXRlc19yZXNwb25zZSh2b2lkICpjYWxsYmFja19kYXRhKQoreworCXN0cnVjdCBhbHRlcm5hdGVzX3JlcXVlc3QgKmFsdF9yZXEgPQorCQkoc3RydWN0IGFsdGVybmF0ZXNfcmVxdWVzdCAqKWNhbGxiYWNrX2RhdGE7CisJc3RydWN0IHdhbGtlciAqd2Fsa2VyID0gYWx0X3JlcS0+d2Fsa2VyOworCXN0cnVjdCB3YWxrZXJfZGF0YSAqY2RhdGEgPSB3YWxrZXItPmRhdGE7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3QgPSBhbHRfcmVxLT5zbG90OworCXN0cnVjdCBhbHRfYmFzZSAqdGFpbCA9IGNkYXRhLT5hbHQ7CisJY29uc3QgY2hhciAqYmFzZSA9IGFsdF9yZXEtPmJhc2U7CisJc3RhdGljIGNvbnN0IGNoYXIgbnVsbF9ieXRlID0gJ1wwJzsKKwljaGFyICpkYXRhOworCWludCBpID0gMDsKKworCWlmIChhbHRfcmVxLT5odHRwX3NwZWNpZmljKSB7CisJCWlmIChzbG90LT5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSyB8fAorCQkgICAgIWFsdF9yZXEtPmJ1ZmZlci0+bGVuKSB7CisKKwkJCS8qIFRyeSByZXVzaW5nIHRoZSBzbG90IHRvIGdldCBub24taHR0cCBhbHRlcm5hdGVzICovCisJCQlhbHRfcmVxLT5odHRwX3NwZWNpZmljID0gMDsKKwkJCXNwcmludGYoYWx0X3JlcS0+dXJsLCAiJXMvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXMiLAorCQkJCWJhc2UpOworCQkJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwKKwkJCQkJIGFsdF9yZXEtPnVybCk7CisJCQlhY3RpdmVfcmVxdWVzdHMrKzsKKwkJCXNsb3QtPmluX3VzZSA9IDE7CisJCQlpZiAoc2xvdC0+ZmluaXNoZWQgIT0gTlVMTCkKKwkJCQkoKnNsb3QtPmZpbmlzaGVkKSA9IDA7CisJCQlpZiAoIXN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCQkJY2RhdGEtPmdvdF9hbHRlcm5hdGVzID0gLTE7CisJCQkJc2xvdC0+aW5fdXNlID0gMDsKKwkJCQlpZiAoc2xvdC0+ZmluaXNoZWQgIT0gTlVMTCkKKwkJCQkJKCpzbG90LT5maW5pc2hlZCkgPSAxOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIGlmIChzbG90LT5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQlpZiAoIW1pc3NpbmdfdGFyZ2V0KHNsb3QpKSB7CisJCQljZGF0YS0+Z290X2FsdGVybmF0ZXMgPSAtMTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWZ3cml0ZV9idWZmZXIoJm51bGxfYnl0ZSwgMSwgMSwgYWx0X3JlcS0+YnVmZmVyKTsKKwlhbHRfcmVxLT5idWZmZXItPmxlbi0tOworCWRhdGEgPSBhbHRfcmVxLT5idWZmZXItPmJ1ZjsKKworCXdoaWxlIChpIDwgYWx0X3JlcS0+YnVmZmVyLT5sZW4pIHsKKwkJaW50IHBvc24gPSBpOworCQl3aGlsZSAocG9zbiA8IGFsdF9yZXEtPmJ1ZmZlci0+bGVuICYmIGRhdGFbcG9zbl0gIT0gJ1xuJykKKwkJCXBvc24rKzsKKwkJaWYgKGRhdGFbcG9zbl0gPT0gJ1xuJykgeworCQkJaW50IG9rYXkgPSAwOworCQkJaW50IHNlcnZlcmxlbiA9IDA7CisJCQlzdHJ1Y3QgYWx0X2Jhc2UgKm5ld2FsdDsKKwkJCWNoYXIgKnRhcmdldCA9IE5VTEw7CisJCQlpZiAoZGF0YVtpXSA9PSAnLycpIHsKKwkJCQkvKiBUaGlzIGNvdW50cworCQkJCSAqIGh0dHA6Ly9naXQuaG9zdC9wdWIvc2NtL2xpbnV4LmdpdC8KKwkJCQkgKiAtLS0tLS0tLS0tLWhlcmVeCisJCQkJICogc28gbWVtY3B5KGRzdCwgYmFzZSwgc2VydmVybGVuKSB3aWxsCisJCQkJICogY29weSB1cCB0byAiLi4uZ2l0Lmhvc3QiLgorCQkJCSAqLworCQkJCWNvbnN0IGNoYXIgKmNvbG9uX3NzID0gc3Ryc3RyKGJhc2UsIjovLyIpOworCQkJCWlmIChjb2xvbl9zcykgeworCQkJCQlzZXJ2ZXJsZW4gPSAoc3RyY2hyKGNvbG9uX3NzICsgMywgJy8nKQorCQkJCQkJICAgICAtIGJhc2UpOworCQkJCQlva2F5ID0gMTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKCFtZW1jbXAoZGF0YSArIGksICIuLi8iLCAzKSkgeworCQkJCS8qIFJlbGF0aXZlIFVSTDsgY2hvcCB0aGUgY29ycmVzcG9uZGluZworCQkJCSAqIG51bWJlciBvZiBzdWJwYXRoIGZyb20gYmFzZSAoYW5kIC4uLworCQkJCSAqIGZyb20gZGF0YSksIGFuZCBjb25jYXRlbmF0ZSB0aGUgcmVzdWx0LgorCQkJCSAqCisJCQkJICogVGhlIGNvZGUgZmlyc3QgZHJvcHMgLi4vIGZyb20gZGF0YSwgYW5kCisJCQkJICogdGhlbiBkcm9wcyBvbmUgLi4vIGZyb20gZGF0YSBhbmQgb25lIHBhdGgKKwkJCQkgKiBmcm9tIGJhc2UuICBJT1csIG9uZSBleHRyYSAuLi8gaXMgZHJvcHBlZAorCQkJCSAqIGZyb20gZGF0YSB0aGFuIHBhdGggaXMgZHJvcHBlZCBmcm9tIGJhc2UuCisJCQkJICoKKwkJCQkgKiBUaGlzIGlzIG5vdCB3cm9uZy4gIFRoZSBhbHRlcm5hdGUgaW4KKwkJCQkgKiAgICAgaHR0cDovL2dpdC5ob3N0L3B1Yi9zY20vbGludXguZ2l0LworCQkJCSAqIHRvIGJvcnJvdyBmcm9tCisJCQkJICogICAgIGh0dHA6Ly9naXQuaG9zdC9wdWIvc2NtL2xpbnVzLmdpdC8KKwkJCQkgKiBpcyAuLi8uLi9saW51cy5naXQvb2JqZWN0cy8uICBZb3UgbmVlZAorCQkJCSAqIHR3byAuLi8uLi8gdG8gYm9ycm93IGZyb20geW91ciBkaXJlY3QKKwkJCQkgKiBuZWlnaGJvdXIuCisJCQkJICovCisJCQkJaSArPSAzOworCQkJCXNlcnZlcmxlbiA9IHN0cmxlbihiYXNlKTsKKwkJCQl3aGlsZSAoaSArIDIgPCBwb3NuICYmCisJCQkJICAgICAgICFtZW1jbXAoZGF0YSArIGksICIuLi8iLCAzKSkgeworCQkJCQlkbyB7CisJCQkJCQlzZXJ2ZXJsZW4tLTsKKwkJCQkJfSB3aGlsZSAoc2VydmVybGVuICYmCisJCQkJCQkgYmFzZVtzZXJ2ZXJsZW4gLSAxXSAhPSAnLycpOworCQkJCQlpICs9IDM7CisJCQkJfQorCQkJCS8qIElmIHRoZSBzZXJ2ZXIgZ290IHJlbW92ZWQsIGdpdmUgdXAuICovCisJCQkJb2theSA9IHN0cmNocihiYXNlLCAnOicpIC0gYmFzZSArIDMgPAorCQkJCQlzZXJ2ZXJsZW47CisJCQl9IGVsc2UgaWYgKGFsdF9yZXEtPmh0dHBfc3BlY2lmaWMpIHsKKwkJCQljaGFyICpjb2xvbiA9IHN0cmNocihkYXRhICsgaSwgJzonKTsKKwkJCQljaGFyICpzbGFzaCA9IHN0cmNocihkYXRhICsgaSwgJy8nKTsKKwkJCQlpZiAoY29sb24gJiYgc2xhc2ggJiYgY29sb24gPCBkYXRhICsgcG9zbiAmJgorCQkJCSAgICBzbGFzaCA8IGRhdGEgKyBwb3NuICYmIGNvbG9uIDwgc2xhc2gpIHsKKwkJCQkJb2theSA9IDE7CisJCQkJfQorCQkJfQorCQkJLyogc2tpcCAib2JqZWN0c1xuIiBhdCBlbmQgKi8KKwkJCWlmIChva2F5KSB7CisJCQkJdGFyZ2V0ID0geG1hbGxvYyhzZXJ2ZXJsZW4gKyBwb3NuIC0gaSAtIDYpOworCQkJCW1lbWNweSh0YXJnZXQsIGJhc2UsIHNlcnZlcmxlbik7CisJCQkJbWVtY3B5KHRhcmdldCArIHNlcnZlcmxlbiwgZGF0YSArIGksCisJCQkJICAgICAgIHBvc24gLSBpIC0gNyk7CisJCQkJdGFyZ2V0W3NlcnZlcmxlbiArIHBvc24gLSBpIC0gN10gPSAwOworCQkJCWlmICh3YWxrZXItPmdldF92ZXJib3NlbHkpCisJCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkJIkFsc28gbG9vayBhdCAlc1xuIiwgdGFyZ2V0KTsKKwkJCQluZXdhbHQgPSB4bWFsbG9jKHNpemVvZigqbmV3YWx0KSk7CisJCQkJbmV3YWx0LT5uZXh0ID0gTlVMTDsKKwkJCQluZXdhbHQtPmJhc2UgPSB0YXJnZXQ7CisJCQkJbmV3YWx0LT5nb3RfaW5kaWNlcyA9IDA7CisJCQkJbmV3YWx0LT5wYWNrcyA9IE5VTEw7CisKKwkJCQl3aGlsZSAodGFpbC0+bmV4dCAhPSBOVUxMKQorCQkJCQl0YWlsID0gdGFpbC0+bmV4dDsKKwkJCQl0YWlsLT5uZXh0ID0gbmV3YWx0OworCQkJfQorCQl9CisJCWkgPSBwb3NuICsgMTsKKwl9CisKKwljZGF0YS0+Z290X2FsdGVybmF0ZXMgPSAxOworfQorCitzdGF0aWMgdm9pZCBmZXRjaF9hbHRlcm5hdGVzKHN0cnVjdCB3YWxrZXIgKndhbGtlciwgY29uc3QgY2hhciAqYmFzZSkKK3sKKwlzdHJ1Y3Qgc3RyYnVmIGJ1ZmZlciA9IFNUUkJVRl9JTklUOworCWNoYXIgKnVybDsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3QgYWx0ZXJuYXRlc19yZXF1ZXN0IGFsdF9yZXE7CisJc3RydWN0IHdhbGtlcl9kYXRhICpjZGF0YSA9IHdhbGtlci0+ZGF0YTsKKworCS8qIElmIGFub3RoZXIgcmVxdWVzdCBoYXMgYWxyZWFkeSBzdGFydGVkIGZldGNoaW5nIGFsdGVybmF0ZXMsCisJICAgd2FpdCBmb3IgdGhlbSB0byBhcnJpdmUgYW5kIHJldHVybiB0byBwcm9jZXNzaW5nIHRoaXMgcmVxdWVzdCdzCisJICAgY3VybCBtZXNzYWdlICovCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwl3aGlsZSAoY2RhdGEtPmdvdF9hbHRlcm5hdGVzID09IDApIHsKKwkJc3RlcF9hY3RpdmVfc2xvdHMoKTsKKwl9CisjZW5kaWYKKworCS8qIE5vdGhpbmcgdG8gZG8gaWYgdGhleSd2ZSBhbHJlYWR5IGJlZW4gZmV0Y2hlZCAqLworCWlmIChjZGF0YS0+Z290X2FsdGVybmF0ZXMgPT0gMSkKKwkJcmV0dXJuOworCisJLyogU3RhcnQgdGhlIGZldGNoICovCisJY2RhdGEtPmdvdF9hbHRlcm5hdGVzID0gMDsKKworCWlmICh3YWxrZXItPmdldF92ZXJib3NlbHkpCisJCWZwcmludGYoc3RkZXJyLCAiR2V0dGluZyBhbHRlcm5hdGVzIGxpc3QgZm9yICVzXG4iLCBiYXNlKTsKKworCXVybCA9IHhtYWxsb2Moc3RybGVuKGJhc2UpICsgMzEpOworCXNwcmludGYodXJsLCAiJXMvb2JqZWN0cy9pbmZvL2h0dHAtYWx0ZXJuYXRlcyIsIGJhc2UpOworCisJLyogVXNlIGEgY2FsbGJhY2sgdG8gcHJvY2VzcyB0aGUgcmVzdWx0LCBzaW5jZSBhbm90aGVyIHJlcXVlc3QKKwkgICBtYXkgZmFpbCBhbmQgbmVlZCB0byBoYXZlIGFsdGVybmF0ZXMgbG9hZGVkIGJlZm9yZSBjb250aW51aW5nICovCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPmNhbGxiYWNrX2Z1bmMgPSBwcm9jZXNzX2FsdGVybmF0ZXNfcmVzcG9uc2U7CisJYWx0X3JlcS53YWxrZXIgPSB3YWxrZXI7CisJc2xvdC0+Y2FsbGJhY2tfZGF0YSA9ICZhbHRfcmVxOworCisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0ZJTEUsICZidWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCisJYWx0X3JlcS5iYXNlID0gYmFzZTsKKwlhbHRfcmVxLnVybCA9IHVybDsKKwlhbHRfcmVxLmJ1ZmZlciA9ICZidWZmZXI7CisJYWx0X3JlcS5odHRwX3NwZWNpZmljID0gMTsKKwlhbHRfcmVxLnNsb3QgPSBzbG90OworCisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKQorCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJZWxzZQorCQljZGF0YS0+Z290X2FsdGVybmF0ZXMgPSAtMTsKKworCXN0cmJ1Zl9yZWxlYXNlKCZidWZmZXIpOworCWZyZWUodXJsKTsKK30KKworc3RhdGljIGludCBmZXRjaF9pbmRpY2VzKHN0cnVjdCB3YWxrZXIgKndhbGtlciwgc3RydWN0IGFsdF9iYXNlICpyZXBvKQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY2hhciAqdXJsOworCXN0cnVjdCBzdHJidWYgYnVmZmVyID0gU1RSQlVGX0lOSVQ7CisJY2hhciAqZGF0YTsKKwlpbnQgaSA9IDA7CisJaW50IHJldCA9IDA7CisKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisKKwlpZiAocmVwby0+Z290X2luZGljZXMpCisJCXJldHVybiAwOworCisJaWYgKHdhbGtlci0+Z2V0X3ZlcmJvc2VseSkKKwkJZnByaW50ZihzdGRlcnIsICJHZXR0aW5nIHBhY2sgbGlzdCBmb3IgJXNcbiIsIHJlcG8tPmJhc2UpOworCisJdXJsID0geG1hbGxvYyhzdHJsZW4ocmVwby0+YmFzZSkgKyAyMSk7CisJc3ByaW50Zih1cmwsICIlcy9vYmplY3RzL2luZm8vcGFja3MiLCByZXBvLT5iYXNlKTsKKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0ZJTEUsICZidWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBOVUxMKTsKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQkJaWYgKG1pc3NpbmdfdGFyZ2V0KCZyZXN1bHRzKSkgeworCQkJCXJlcG8tPmdvdF9pbmRpY2VzID0gMTsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQl9IGVsc2UgeworCQkJCXJlcG8tPmdvdF9pbmRpY2VzID0gMDsKKwkJCQlyZXQgPSBlcnJvcigiJXMiLCBjdXJsX2Vycm9yc3RyKTsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlyZXBvLT5nb3RfaW5kaWNlcyA9IDA7CisJCXJldCA9IGVycm9yKCJVbmFibGUgdG8gc3RhcnQgcmVxdWVzdCIpOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJZGF0YSA9IGJ1ZmZlci5idWY7CisJd2hpbGUgKGkgPCBidWZmZXIubGVuKSB7CisJCXN3aXRjaCAoZGF0YVtpXSkgeworCQljYXNlICdQJzoKKwkJCWkrKzsKKwkJCWlmIChpICsgNTIgPD0gYnVmZmVyLmxlbiAmJgorCQkJICAgICFwcmVmaXhjbXAoZGF0YSArIGksICIgcGFjay0iKSAmJgorCQkJICAgICFwcmVmaXhjbXAoZGF0YSArIGkgKyA0NiwgIi5wYWNrXG4iKSkgeworCQkJCWdldF9zaGExX2hleChkYXRhICsgaSArIDYsIHNoYTEpOworCQkJCXNldHVwX2luZGV4KHdhbGtlciwgcmVwbywgc2hhMSk7CisJCQkJaSArPSA1MTsKKwkJCQlicmVhazsKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCXdoaWxlIChpIDwgYnVmZmVyLmxlbiAmJiBkYXRhW2ldICE9ICdcbicpCisJCQkJaSsrOworCQl9CisJCWkrKzsKKwl9CisKKwlyZXBvLT5nb3RfaW5kaWNlcyA9IDE7CitjbGVhbnVwOgorCXN0cmJ1Zl9yZWxlYXNlKCZidWZmZXIpOworCWZyZWUodXJsKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZldGNoX3BhY2soc3RydWN0IHdhbGtlciAqd2Fsa2VyLCBzdHJ1Y3QgYWx0X2Jhc2UgKnJlcG8sIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJY2hhciAqdXJsOworCXN0cnVjdCBwYWNrZWRfZ2l0ICp0YXJnZXQ7CisJc3RydWN0IHBhY2tlZF9naXQgKipsc3Q7CisJRklMRSAqcGFja2ZpbGU7CisJY2hhciAqZmlsZW5hbWU7CisJY2hhciB0bXBmaWxlW1BBVEhfTUFYXTsKKwlpbnQgcmV0OworCWxvbmcgcHJldl9wb3NuID0gMDsKKwljaGFyIHJhbmdlW1JBTkdFX0hFQURFUl9TSVpFXTsKKwlzdHJ1Y3QgY3VybF9zbGlzdCAqcmFuZ2VfaGVhZGVyID0gTlVMTDsKKwlzdHJ1Y3Qgd2Fsa2VyX2RhdGEgKmRhdGEgPSB3YWxrZXItPmRhdGE7CisKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisKKwlpZiAoZmV0Y2hfaW5kaWNlcyh3YWxrZXIsIHJlcG8pKQorCQlyZXR1cm4gLTE7CisJdGFyZ2V0ID0gZmluZF9zaGExX3BhY2soc2hhMSwgcmVwby0+cGFja3MpOworCWlmICghdGFyZ2V0KQorCQlyZXR1cm4gLTE7CisKKwlpZiAod2Fsa2VyLT5nZXRfdmVyYm9zZWx5KSB7CisJCWZwcmludGYoc3RkZXJyLCAiR2V0dGluZyBwYWNrICVzXG4iLAorCQkJc2hhMV90b19oZXgodGFyZ2V0LT5zaGExKSk7CisJCWZwcmludGYoc3RkZXJyLCAiIHdoaWNoIGNvbnRhaW5zICVzXG4iLAorCQkJc2hhMV90b19oZXgoc2hhMSkpOworCX0KKworCXVybCA9IHhtYWxsb2Moc3RybGVuKHJlcG8tPmJhc2UpICsgNjUpOworCXNwcmludGYodXJsLCAiJXMvb2JqZWN0cy9wYWNrL3BhY2stJXMucGFjayIsCisJCXJlcG8tPmJhc2UsIHNoYTFfdG9faGV4KHRhcmdldC0+c2hhMSkpOworCisJZmlsZW5hbWUgPSBzaGExX3BhY2tfbmFtZSh0YXJnZXQtPnNoYTEpOworCXNucHJpbnRmKHRtcGZpbGUsIHNpemVvZih0bXBmaWxlKSwgIiVzLnRlbXAiLCBmaWxlbmFtZSk7CisJcGFja2ZpbGUgPSBmb3Blbih0bXBmaWxlLCAiYSIpOworCWlmICghcGFja2ZpbGUpCisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIG9wZW4gbG9jYWwgZmlsZSAlcyBmb3IgcGFjayIsCisJCQkgICAgIHRtcGZpbGUpOworCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPnJlc3VsdHMgPSAmcmVzdWx0czsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfRklMRSwgcGFja2ZpbGUpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGUpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIGRhdGEtPm5vX3ByYWdtYV9oZWFkZXIpOworCXNsb3QtPmxvY2FsID0gcGFja2ZpbGU7CisKKwkvKiBJZiB0aGVyZSBpcyBkYXRhIHByZXNlbnQgZnJvbSBhIHByZXZpb3VzIHRyYW5zZmVyIGF0dGVtcHQsCisJICAgcmVzdW1lIHdoZXJlIGl0IGxlZnQgb2ZmICovCisJcHJldl9wb3NuID0gZnRlbGwocGFja2ZpbGUpOworCWlmIChwcmV2X3Bvc24+MCkgeworCQlpZiAod2Fsa2VyLT5nZXRfdmVyYm9zZWx5KQorCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlJlc3VtaW5nIGZldGNoIG9mIHBhY2sgJXMgYXQgYnl0ZSAlbGRcbiIsCisJCQkJc2hhMV90b19oZXgodGFyZ2V0LT5zaGExKSwgcHJldl9wb3NuKTsKKwkJc3ByaW50ZihyYW5nZSwgIlJhbmdlOiBieXRlcz0lbGQtIiwgcHJldl9wb3NuKTsKKwkJcmFuZ2VfaGVhZGVyID0gY3VybF9zbGlzdF9hcHBlbmQocmFuZ2VfaGVhZGVyLCByYW5nZSk7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCByYW5nZV9oZWFkZXIpOworCX0KKworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ICE9IENVUkxFX09LKSB7CisJCQlmY2xvc2UocGFja2ZpbGUpOworCQkJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gZ2V0IHBhY2sgZmlsZSAlc1xuJXMiLCB1cmwsCisJCQkJICAgICBjdXJsX2Vycm9yc3RyKTsKKwkJfQorCX0gZWxzZSB7CisJCWZjbG9zZShwYWNrZmlsZSk7CisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIHN0YXJ0IHJlcXVlc3QiKTsKKwl9CisKKwl0YXJnZXQtPnBhY2tfc2l6ZSA9IGZ0ZWxsKHBhY2tmaWxlKTsKKwlmY2xvc2UocGFja2ZpbGUpOworCisJcmV0ID0gbW92ZV90ZW1wX3RvX2ZpbGUodG1wZmlsZSwgZmlsZW5hbWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlsc3QgPSAmcmVwby0+cGFja3M7CisJd2hpbGUgKCpsc3QgIT0gdGFyZ2V0KQorCQlsc3QgPSAmKCgqbHN0KS0+bmV4dCk7CisJKmxzdCA9ICgqbHN0KS0+bmV4dDsKKworCWlmICh2ZXJpZnlfcGFjayh0YXJnZXQsIDApKQorCQlyZXR1cm4gLTE7CisJaW5zdGFsbF9wYWNrZWRfZ2l0KHRhcmdldCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWJvcnRfb2JqZWN0X3JlcXVlc3Qoc3RydWN0IG9iamVjdF9yZXF1ZXN0ICpvYmpfcmVxKQoreworCWlmIChvYmpfcmVxLT5sb2NhbCA+PSAwKSB7CisJCWNsb3NlKG9ial9yZXEtPmxvY2FsKTsKKwkJb2JqX3JlcS0+bG9jYWwgPSAtMTsKKwl9CisJdW5saW5rKG9ial9yZXEtPnRtcGZpbGUpOworCWlmIChvYmpfcmVxLT5zbG90KSB7CisJCXJlbGVhc2VfYWN0aXZlX3Nsb3Qob2JqX3JlcS0+c2xvdCk7CisJCW9ial9yZXEtPnNsb3QgPSBOVUxMOworCX0KKwlyZWxlYXNlX29iamVjdF9yZXF1ZXN0KG9ial9yZXEpOworfQorCitzdGF0aWMgaW50IGZldGNoX29iamVjdChzdHJ1Y3Qgd2Fsa2VyICp3YWxrZXIsIHN0cnVjdCBhbHRfYmFzZSAqcmVwbywgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwljaGFyICpoZXggPSBzaGExX3RvX2hleChzaGExKTsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgb2JqZWN0X3JlcXVlc3QgKm9ial9yZXEgPSBvYmplY3RfcXVldWVfaGVhZDsKKworCXdoaWxlIChvYmpfcmVxICE9IE5VTEwgJiYgaGFzaGNtcChvYmpfcmVxLT5zaGExLCBzaGExKSkKKwkJb2JqX3JlcSA9IG9ial9yZXEtPm5leHQ7CisJaWYgKG9ial9yZXEgPT0gTlVMTCkKKwkJcmV0dXJuIGVycm9yKCJDb3VsZG4ndCBmaW5kIHJlcXVlc3QgZm9yICVzIGluIHRoZSBxdWV1ZSIsIGhleCk7CisKKwlpZiAoaGFzX3NoYTFfZmlsZShvYmpfcmVxLT5zaGExKSkgeworCQlhYm9ydF9vYmplY3RfcmVxdWVzdChvYmpfcmVxKTsKKwkJcmV0dXJuIDA7CisJfQorCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwl3aGlsZSAob2JqX3JlcS0+c3RhdGUgPT0gV0FJVElORykgeworCQlzdGVwX2FjdGl2ZV9zbG90cygpOworCX0KKyNlbHNlCisJc3RhcnRfb2JqZWN0X3JlcXVlc3Qod2Fsa2VyLCBvYmpfcmVxKTsKKyNlbmRpZgorCisJd2hpbGUgKG9ial9yZXEtPnN0YXRlID09IEFDVElWRSkgeworCQlydW5fYWN0aXZlX3Nsb3Qob2JqX3JlcS0+c2xvdCk7CisJfQorCWlmIChvYmpfcmVxLT5sb2NhbCAhPSAtMSkgeworCQljbG9zZShvYmpfcmVxLT5sb2NhbCk7IG9ial9yZXEtPmxvY2FsID0gLTE7CisJfQorCisJaWYgKG9ial9yZXEtPnN0YXRlID09IEFCT1JURUQpIHsKKwkJcmV0ID0gZXJyb3IoIlJlcXVlc3QgZm9yICVzIGFib3J0ZWQiLCBoZXgpOworCX0gZWxzZSBpZiAob2JqX3JlcS0+Y3VybF9yZXN1bHQgIT0gQ1VSTEVfT0sgJiYKKwkJICAgb2JqX3JlcS0+aHR0cF9jb2RlICE9IDQxNikgeworCQlpZiAobWlzc2luZ190YXJnZXQob2JqX3JlcSkpCisJCQlyZXQgPSAtMTsgLyogQmUgc2lsZW50LCBpdCBpcyBwcm9iYWJseSBpbiBhIHBhY2suICovCisJCWVsc2UKKwkJCXJldCA9IGVycm9yKCIlcyAoY3VybF9yZXN1bHQgPSAlZCwgaHR0cF9jb2RlID0gJWxkLCBzaGExID0gJXMpIiwKKwkJCQkgICAgb2JqX3JlcS0+ZXJyb3JzdHIsIG9ial9yZXEtPmN1cmxfcmVzdWx0LAorCQkJCSAgICBvYmpfcmVxLT5odHRwX2NvZGUsIGhleCk7CisJfSBlbHNlIGlmIChvYmpfcmVxLT56cmV0ICE9IFpfU1RSRUFNX0VORCkgeworCQl3YWxrZXItPmNvcnJ1cHRfb2JqZWN0X2ZvdW5kKys7CisJCXJldCA9IGVycm9yKCJGaWxlICVzICglcykgY29ycnVwdCIsIGhleCwgb2JqX3JlcS0+dXJsKTsKKwl9IGVsc2UgaWYgKGhhc2hjbXAob2JqX3JlcS0+c2hhMSwgb2JqX3JlcS0+cmVhbF9zaGExKSkgeworCQlyZXQgPSBlcnJvcigiRmlsZSAlcyBoYXMgYmFkIGhhc2giLCBoZXgpOworCX0gZWxzZSBpZiAob2JqX3JlcS0+cmVuYW1lIDwgMCkgeworCQlyZXQgPSBlcnJvcigidW5hYmxlIHRvIHdyaXRlIHNoYTEgZmlsZW5hbWUgJXMiLAorCQkJICAgIG9ial9yZXEtPmZpbGVuYW1lKTsKKwl9CisKKwlyZWxlYXNlX29iamVjdF9yZXF1ZXN0KG9ial9yZXEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmV0Y2goc3RydWN0IHdhbGtlciAqd2Fsa2VyLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCB3YWxrZXJfZGF0YSAqZGF0YSA9IHdhbGtlci0+ZGF0YTsKKwlzdHJ1Y3QgYWx0X2Jhc2UgKmFsdGJhc2UgPSBkYXRhLT5hbHQ7CisKKwlpZiAoIWZldGNoX29iamVjdCh3YWxrZXIsIGFsdGJhc2UsIHNoYTEpKQorCQlyZXR1cm4gMDsKKwl3aGlsZSAoYWx0YmFzZSkgeworCQlpZiAoIWZldGNoX3BhY2sod2Fsa2VyLCBhbHRiYXNlLCBzaGExKSkKKwkJCXJldHVybiAwOworCQlmZXRjaF9hbHRlcm5hdGVzKHdhbGtlciwgZGF0YS0+YWx0LT5iYXNlKTsKKwkJYWx0YmFzZSA9IGFsdGJhc2UtPm5leHQ7CisJfQorCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIGZpbmQgJXMgdW5kZXIgJXMiLCBzaGExX3RvX2hleChzaGExKSwKKwkJICAgICBkYXRhLT5hbHQtPmJhc2UpOworfQorCitzdGF0aWMgaW50IGZldGNoX3JlZihzdHJ1Y3Qgd2Fsa2VyICp3YWxrZXIsIGNoYXIgKnJlZiwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgd2Fsa2VyX2RhdGEgKmRhdGEgPSB3YWxrZXItPmRhdGE7CisJcmV0dXJuIGh0dHBfZmV0Y2hfcmVmKGRhdGEtPmFsdC0+YmFzZSwgcmVmLCBzaGExKTsKK30KKworc3RhdGljIHZvaWQgY2xlYW51cChzdHJ1Y3Qgd2Fsa2VyICp3YWxrZXIpCit7CisJc3RydWN0IHdhbGtlcl9kYXRhICpkYXRhID0gd2Fsa2VyLT5kYXRhOworCWh0dHBfY2xlYW51cCgpOworCisJY3VybF9zbGlzdF9mcmVlX2FsbChkYXRhLT5ub19wcmFnbWFfaGVhZGVyKTsKK30KKworc3RydWN0IHdhbGtlciAqZ2V0X2h0dHBfd2Fsa2VyKGNvbnN0IGNoYXIgKnVybCwgc3RydWN0IHJlbW90ZSAqcmVtb3RlKQoreworCWNoYXIgKnM7CisJc3RydWN0IHdhbGtlcl9kYXRhICpkYXRhID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IHdhbGtlcl9kYXRhKSk7CisJc3RydWN0IHdhbGtlciAqd2Fsa2VyID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IHdhbGtlcikpOworCisJaHR0cF9pbml0KHJlbW90ZSk7CisKKwlkYXRhLT5ub19wcmFnbWFfaGVhZGVyID0gY3VybF9zbGlzdF9hcHBlbmQoTlVMTCwgIlByYWdtYToiKTsKKworCWRhdGEtPmFsdCA9IHhtYWxsb2Moc2l6ZW9mKCpkYXRhLT5hbHQpKTsKKwlkYXRhLT5hbHQtPmJhc2UgPSB4bWFsbG9jKHN0cmxlbih1cmwpICsgMSk7CisJc3RyY3B5KGRhdGEtPmFsdC0+YmFzZSwgdXJsKTsKKwlmb3IgKHMgPSBkYXRhLT5hbHQtPmJhc2UgKyBzdHJsZW4oZGF0YS0+YWx0LT5iYXNlKSAtIDE7ICpzID09ICcvJzsgLS1zKQorCQkqcyA9IDA7CisKKwlkYXRhLT5hbHQtPmdvdF9pbmRpY2VzID0gMDsKKwlkYXRhLT5hbHQtPnBhY2tzID0gTlVMTDsKKwlkYXRhLT5hbHQtPm5leHQgPSBOVUxMOworCWRhdGEtPmdvdF9hbHRlcm5hdGVzID0gLTE7CisKKwl3YWxrZXItPmNvcnJ1cHRfb2JqZWN0X2ZvdW5kID0gMDsKKwl3YWxrZXItPmZldGNoID0gZmV0Y2g7CisJd2Fsa2VyLT5mZXRjaF9yZWYgPSBmZXRjaF9yZWY7CisJd2Fsa2VyLT5wcmVmZXRjaCA9IHByZWZldGNoOworCXdhbGtlci0+Y2xlYW51cCA9IGNsZWFudXA7CisJd2Fsa2VyLT5kYXRhID0gZGF0YTsKKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJYWRkX2ZpbGxfZnVuY3Rpb24od2Fsa2VyLCAoaW50ICgqKSh2b2lkICopKSBmaWxsX2FjdGl2ZV9zbG90KTsKKyNlbmRpZgorCisJcmV0dXJuIHdhbGtlcjsKK30KZGlmZiAtLWdpdCBhL2h0dHAuYyBiL2h0dHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTZhNWYxCi0tLSAvZGV2L251bGwKKysrIGIvaHR0cC5jCkBAIC0wLDAgKzEsNjQxIEBACisjaW5jbHVkZSAiaHR0cC5oIgorCitpbnQgZGF0YV9yZWNlaXZlZDsKK2ludCBhY3RpdmVfcmVxdWVzdHMgPSAwOworCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKK3N0YXRpYyBpbnQgbWF4X3JlcXVlc3RzID0gLTE7CitzdGF0aWMgQ1VSTE0gKmN1cmxtOworI2VuZGlmCisjaWZuZGVmIE5PX0NVUkxfRUFTWV9EVVBIQU5ETEUKK3N0YXRpYyBDVVJMICpjdXJsX2RlZmF1bHQ7CisjZW5kaWYKK2NoYXIgY3VybF9lcnJvcnN0cltDVVJMX0VSUk9SX1NJWkVdOworCitzdGF0aWMgaW50IGN1cmxfc3NsX3ZlcmlmeSA9IC0xOworc3RhdGljIGNoYXIgKnNzbF9jZXJ0ID0gTlVMTDsKKyNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNID49IDB4MDcwOTAyCitzdGF0aWMgY2hhciAqc3NsX2tleSA9IE5VTEw7CisjZW5kaWYKKyNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNID49IDB4MDcwOTA4CitzdGF0aWMgY2hhciAqc3NsX2NhcGF0aCA9IE5VTEw7CisjZW5kaWYKK3N0YXRpYyBjaGFyICpzc2xfY2FpbmZvID0gTlVMTDsKK3N0YXRpYyBsb25nIGN1cmxfbG93X3NwZWVkX2xpbWl0ID0gLTE7CitzdGF0aWMgbG9uZyBjdXJsX2xvd19zcGVlZF90aW1lID0gLTE7CitzdGF0aWMgaW50IGN1cmxfZnRwX25vX2Vwc3YgPSAwOworc3RhdGljIGNoYXIgKmN1cmxfaHR0cF9wcm94eSA9IE5VTEw7CisKK3N0YXRpYyBzdHJ1Y3QgY3VybF9zbGlzdCAqcHJhZ21hX2hlYWRlcjsKKworc3RhdGljIHN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICphY3RpdmVfcXVldWVfaGVhZCA9IE5VTEw7CisKK3NpemVfdCBmcmVhZF9idWZmZXIodm9pZCAqcHRyLCBzaXplX3QgZWx0c2l6ZSwgc2l6ZV90IG5tZW1iLAorCQkJICAgc3RydWN0IGJ1ZmZlciAqYnVmZmVyKQoreworCXNpemVfdCBzaXplID0gZWx0c2l6ZSAqIG5tZW1iOworCWlmIChzaXplID4gYnVmZmVyLT5idWYubGVuIC0gYnVmZmVyLT5wb3NuKQorCQlzaXplID0gYnVmZmVyLT5idWYubGVuIC0gYnVmZmVyLT5wb3NuOworCW1lbWNweShwdHIsIGJ1ZmZlci0+YnVmLmJ1ZiArIGJ1ZmZlci0+cG9zbiwgc2l6ZSk7CisJYnVmZmVyLT5wb3NuICs9IHNpemU7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc2l6ZV90IGZ3cml0ZV9idWZmZXIoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3QgZWx0c2l6ZSwKKwkJCSAgICBzaXplX3Qgbm1lbWIsIHN0cnVjdCBzdHJidWYgKmJ1ZmZlcikKK3sKKwlzaXplX3Qgc2l6ZSA9IGVsdHNpemUgKiBubWVtYjsKKwlzdHJidWZfYWRkKGJ1ZmZlciwgcHRyLCBzaXplKTsKKwlkYXRhX3JlY2VpdmVkKys7CisJcmV0dXJuIHNpemU7Cit9CisKK3NpemVfdCBmd3JpdGVfbnVsbChjb25zdCB2b2lkICpwdHIsIHNpemVfdCBlbHRzaXplLAorCQkJICBzaXplX3Qgbm1lbWIsIHN0cnVjdCBzdHJidWYgKmJ1ZmZlcikKK3sKKwlkYXRhX3JlY2VpdmVkKys7CisJcmV0dXJuIGVsdHNpemUgKiBubWVtYjsKK30KKworc3RhdGljIHZvaWQgZmluaXNoX2FjdGl2ZV9zbG90KHN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90KTsKKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCitzdGF0aWMgdm9pZCBwcm9jZXNzX2N1cmxfbWVzc2FnZXModm9pZCkKK3sKKwlpbnQgbnVtX21lc3NhZ2VzOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCUNVUkxNc2cgKmN1cmxfbWVzc2FnZSA9IGN1cmxfbXVsdGlfaW5mb19yZWFkKGN1cmxtLCAmbnVtX21lc3NhZ2VzKTsKKworCXdoaWxlIChjdXJsX21lc3NhZ2UgIT0gTlVMTCkgeworCQlpZiAoY3VybF9tZXNzYWdlLT5tc2cgPT0gQ1VSTE1TR19ET05FKSB7CisJCQlpbnQgY3VybF9yZXN1bHQgPSBjdXJsX21lc3NhZ2UtPmRhdGEucmVzdWx0OworCQkJc2xvdCA9IGFjdGl2ZV9xdWV1ZV9oZWFkOworCQkJd2hpbGUgKHNsb3QgIT0gTlVMTCAmJgorCQkJICAgICAgIHNsb3QtPmN1cmwgIT0gY3VybF9tZXNzYWdlLT5lYXN5X2hhbmRsZSkKKwkJCQlzbG90ID0gc2xvdC0+bmV4dDsKKwkJCWlmIChzbG90ICE9IE5VTEwpIHsKKwkJCQljdXJsX211bHRpX3JlbW92ZV9oYW5kbGUoY3VybG0sIHNsb3QtPmN1cmwpOworCQkJCXNsb3QtPmN1cmxfcmVzdWx0ID0gY3VybF9yZXN1bHQ7CisJCQkJZmluaXNoX2FjdGl2ZV9zbG90KHNsb3QpOworCQkJfSBlbHNlIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlJlY2VpdmVkIERPTkUgbWVzc2FnZSBmb3IgdW5rbm93biByZXF1ZXN0IVxuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gQ1VSTCBtZXNzYWdlIHJlY2VpdmVkOiAlZFxuIiwKKwkJCQkoaW50KWN1cmxfbWVzc2FnZS0+bXNnKTsKKwkJfQorCQljdXJsX21lc3NhZ2UgPSBjdXJsX211bHRpX2luZm9fcmVhZChjdXJsbSwgJm51bV9tZXNzYWdlcyk7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgaHR0cF9vcHRpb25zKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCFzdHJjbXAoImh0dHAuc3NsdmVyaWZ5IiwgdmFyKSkgeworCQlpZiAoY3VybF9zc2xfdmVyaWZ5ID09IC0xKSB7CisJCQljdXJsX3NzbF92ZXJpZnkgPSBnaXRfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAoImh0dHAuc3NsY2VydCIsIHZhcikpIHsKKwkJaWYgKHNzbF9jZXJ0ID09IE5VTEwpIHsKKwkJCWlmICghdmFsdWUpCisJCQkJcmV0dXJuIGNvbmZpZ19lcnJvcl9ub25ib29sKHZhcik7CisJCQlzc2xfY2VydCA9IHhzdHJkdXAodmFsdWUpOworCQl9CisJCXJldHVybiAwOworCX0KKyNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNID49IDB4MDcwOTAyCisJaWYgKCFzdHJjbXAoImh0dHAuc3Nsa2V5IiwgdmFyKSkgeworCQlpZiAoc3NsX2tleSA9PSBOVUxMKSB7CisJCQlpZiAoIXZhbHVlKQorCQkJCXJldHVybiBjb25maWdfZXJyb3Jfbm9uYm9vbCh2YXIpOworCQkJc3NsX2tleSA9IHhzdHJkdXAodmFsdWUpOworCQl9CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorI2lmIExJQkNVUkxfVkVSU0lPTl9OVU0gPj0gMHgwNzA5MDgKKwlpZiAoIXN0cmNtcCgiaHR0cC5zc2xjYXBhdGgiLCB2YXIpKSB7CisJCWlmIChzc2xfY2FwYXRoID09IE5VTEwpIHsKKwkJCWlmICghdmFsdWUpCisJCQkJcmV0dXJuIGNvbmZpZ19lcnJvcl9ub25ib29sKHZhcik7CisJCQlzc2xfY2FwYXRoID0geHN0cmR1cCh2YWx1ZSk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisJaWYgKCFzdHJjbXAoImh0dHAuc3NsY2FpbmZvIiwgdmFyKSkgeworCQlpZiAoc3NsX2NhaW5mbyA9PSBOVUxMKSB7CisJCQlpZiAoIXZhbHVlKQorCQkJCXJldHVybiBjb25maWdfZXJyb3Jfbm9uYm9vbCh2YXIpOworCQkJc3NsX2NhaW5mbyA9IHhzdHJkdXAodmFsdWUpOworCQl9CisJCXJldHVybiAwOworCX0KKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJaWYgKCFzdHJjbXAoImh0dHAubWF4cmVxdWVzdHMiLCB2YXIpKSB7CisJCWlmIChtYXhfcmVxdWVzdHMgPT0gLTEpCisJCQltYXhfcmVxdWVzdHMgPSBnaXRfY29uZmlnX2ludCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisKKwlpZiAoIXN0cmNtcCgiaHR0cC5sb3dzcGVlZGxpbWl0IiwgdmFyKSkgeworCQlpZiAoY3VybF9sb3dfc3BlZWRfbGltaXQgPT0gLTEpCisJCQljdXJsX2xvd19zcGVlZF9saW1pdCA9IChsb25nKWdpdF9jb25maWdfaW50KHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAoImh0dHAubG93c3BlZWR0aW1lIiwgdmFyKSkgeworCQlpZiAoY3VybF9sb3dfc3BlZWRfdGltZSA9PSAtMSkKKwkJCWN1cmxfbG93X3NwZWVkX3RpbWUgPSAobG9uZylnaXRfY29uZmlnX2ludCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAoImh0dHAubm9lcHN2IiwgdmFyKSkgeworCQljdXJsX2Z0cF9ub19lcHN2ID0gZ2l0X2NvbmZpZ19ib29sKHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAoImh0dHAucHJveHkiLCB2YXIpKSB7CisJCWlmIChjdXJsX2h0dHBfcHJveHkgPT0gTlVMTCkgeworCQkJaWYgKCF2YWx1ZSkKKwkJCQlyZXR1cm4gY29uZmlnX2Vycm9yX25vbmJvb2wodmFyKTsKKwkJCWN1cmxfaHR0cF9wcm94eSA9IHhzdHJkdXAodmFsdWUpOworCQl9CisJCXJldHVybiAwOworCX0KKworCS8qIEZhbGwgYmFjayBvbiB0aGUgZGVmYXVsdCBvbmVzICovCisJcmV0dXJuIGdpdF9kZWZhdWx0X2NvbmZpZyh2YXIsIHZhbHVlKTsKK30KKworc3RhdGljIENVUkwqIGdldF9jdXJsX2hhbmRsZSh2b2lkKQoreworCUNVUkwqIHJlc3VsdCA9IGN1cmxfZWFzeV9pbml0KCk7CisKKwljdXJsX2Vhc3lfc2V0b3B0KHJlc3VsdCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgY3VybF9zc2xfdmVyaWZ5KTsKKyNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNID49IDB4MDcwOTA3CisJY3VybF9lYXN5X3NldG9wdChyZXN1bHQsIENVUkxPUFRfTkVUUkMsIENVUkxfTkVUUkNfT1BUSU9OQUwpOworI2VuZGlmCisKKwlpZiAoc3NsX2NlcnQgIT0gTlVMTCkKKwkJY3VybF9lYXN5X3NldG9wdChyZXN1bHQsIENVUkxPUFRfU1NMQ0VSVCwgc3NsX2NlcnQpOworI2lmIExJQkNVUkxfVkVSU0lPTl9OVU0gPj0gMHgwNzA5MDIKKwlpZiAoc3NsX2tleSAhPSBOVUxMKQorCQljdXJsX2Vhc3lfc2V0b3B0KHJlc3VsdCwgQ1VSTE9QVF9TU0xLRVksIHNzbF9rZXkpOworI2VuZGlmCisjaWYgTElCQ1VSTF9WRVJTSU9OX05VTSA+PSAweDA3MDkwOAorCWlmIChzc2xfY2FwYXRoICE9IE5VTEwpCisJCWN1cmxfZWFzeV9zZXRvcHQocmVzdWx0LCBDVVJMT1BUX0NBUEFUSCwgc3NsX2NhcGF0aCk7CisjZW5kaWYKKwlpZiAoc3NsX2NhaW5mbyAhPSBOVUxMKQorCQljdXJsX2Vhc3lfc2V0b3B0KHJlc3VsdCwgQ1VSTE9QVF9DQUlORk8sIHNzbF9jYWluZm8pOworCWN1cmxfZWFzeV9zZXRvcHQocmVzdWx0LCBDVVJMT1BUX0ZBSUxPTkVSUk9SLCAxKTsKKworCWlmIChjdXJsX2xvd19zcGVlZF9saW1pdCA+IDAgJiYgY3VybF9sb3dfc3BlZWRfdGltZSA+IDApIHsKKwkJY3VybF9lYXN5X3NldG9wdChyZXN1bHQsIENVUkxPUFRfTE9XX1NQRUVEX0xJTUlULAorCQkJCSBjdXJsX2xvd19zcGVlZF9saW1pdCk7CisJCWN1cmxfZWFzeV9zZXRvcHQocmVzdWx0LCBDVVJMT1BUX0xPV19TUEVFRF9USU1FLAorCQkJCSBjdXJsX2xvd19zcGVlZF90aW1lKTsKKwl9CisKKwljdXJsX2Vhc3lfc2V0b3B0KHJlc3VsdCwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgMSk7CisKKwlpZiAoZ2V0ZW52KCJHSVRfQ1VSTF9WRVJCT1NFIikpCisJCWN1cmxfZWFzeV9zZXRvcHQocmVzdWx0LCBDVVJMT1BUX1ZFUkJPU0UsIDEpOworCisJY3VybF9lYXN5X3NldG9wdChyZXN1bHQsIENVUkxPUFRfVVNFUkFHRU5ULCBHSVRfVVNFUl9BR0VOVCk7CisKKwlpZiAoY3VybF9mdHBfbm9fZXBzdikKKwkJY3VybF9lYXN5X3NldG9wdChyZXN1bHQsIENVUkxPUFRfRlRQX1VTRV9FUFNWLCAwKTsKKworCWlmIChjdXJsX2h0dHBfcHJveHkpCisJCWN1cmxfZWFzeV9zZXRvcHQocmVzdWx0LCBDVVJMT1BUX1BST1hZLCBjdXJsX2h0dHBfcHJveHkpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBodHRwX2luaXQoc3RydWN0IHJlbW90ZSAqcmVtb3RlKQoreworCWNoYXIgKmxvd19zcGVlZF9saW1pdDsKKwljaGFyICpsb3dfc3BlZWRfdGltZTsKKworCWN1cmxfZ2xvYmFsX2luaXQoQ1VSTF9HTE9CQUxfQUxMKTsKKworCWlmIChyZW1vdGUgJiYgcmVtb3RlLT5odHRwX3Byb3h5KQorCQljdXJsX2h0dHBfcHJveHkgPSB4c3RyZHVwKHJlbW90ZS0+aHR0cF9wcm94eSk7CisKKwlwcmFnbWFfaGVhZGVyID0gY3VybF9zbGlzdF9hcHBlbmQocHJhZ21hX2hlYWRlciwgIlByYWdtYTogbm8tY2FjaGUiKTsKKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJeworCQljaGFyICpodHRwX21heF9yZXF1ZXN0cyA9IGdldGVudigiR0lUX0hUVFBfTUFYX1JFUVVFU1RTIik7CisJCWlmIChodHRwX21heF9yZXF1ZXN0cyAhPSBOVUxMKQorCQkJbWF4X3JlcXVlc3RzID0gYXRvaShodHRwX21heF9yZXF1ZXN0cyk7CisJfQorCisJY3VybG0gPSBjdXJsX211bHRpX2luaXQoKTsKKwlpZiAoY3VybG0gPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGNyZWF0aW5nIGN1cmwgbXVsdGkgaGFuZGxlLlxuIik7CisJCWV4aXQoMSk7CisJfQorI2VuZGlmCisKKwlpZiAoZ2V0ZW52KCJHSVRfU1NMX05PX1ZFUklGWSIpKQorCQljdXJsX3NzbF92ZXJpZnkgPSAwOworCisJc3NsX2NlcnQgPSBnZXRlbnYoIkdJVF9TU0xfQ0VSVCIpOworI2lmIExJQkNVUkxfVkVSU0lPTl9OVU0gPj0gMHgwNzA5MDIKKwlzc2xfa2V5ID0gZ2V0ZW52KCJHSVRfU1NMX0tFWSIpOworI2VuZGlmCisjaWYgTElCQ1VSTF9WRVJTSU9OX05VTSA+PSAweDA3MDkwOAorCXNzbF9jYXBhdGggPSBnZXRlbnYoIkdJVF9TU0xfQ0FQQVRIIik7CisjZW5kaWYKKwlzc2xfY2FpbmZvID0gZ2V0ZW52KCJHSVRfU1NMX0NBSU5GTyIpOworCisJbG93X3NwZWVkX2xpbWl0ID0gZ2V0ZW52KCJHSVRfSFRUUF9MT1dfU1BFRURfTElNSVQiKTsKKwlpZiAobG93X3NwZWVkX2xpbWl0ICE9IE5VTEwpCisJCWN1cmxfbG93X3NwZWVkX2xpbWl0ID0gc3RydG9sKGxvd19zcGVlZF9saW1pdCwgTlVMTCwgMTApOworCWxvd19zcGVlZF90aW1lID0gZ2V0ZW52KCJHSVRfSFRUUF9MT1dfU1BFRURfVElNRSIpOworCWlmIChsb3dfc3BlZWRfdGltZSAhPSBOVUxMKQorCQljdXJsX2xvd19zcGVlZF90aW1lID0gc3RydG9sKGxvd19zcGVlZF90aW1lLCBOVUxMLCAxMCk7CisKKwlnaXRfY29uZmlnKGh0dHBfb3B0aW9ucyk7CisKKwlpZiAoY3VybF9zc2xfdmVyaWZ5ID09IC0xKQorCQljdXJsX3NzbF92ZXJpZnkgPSAxOworCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwlpZiAobWF4X3JlcXVlc3RzIDwgMSkKKwkJbWF4X3JlcXVlc3RzID0gREVGQVVMVF9NQVhfUkVRVUVTVFM7CisjZW5kaWYKKworCWlmIChnZXRlbnYoIkdJVF9DVVJMX0ZUUF9OT19FUFNWIikpCisJCWN1cmxfZnRwX25vX2Vwc3YgPSAxOworCisjaWZuZGVmIE5PX0NVUkxfRUFTWV9EVVBIQU5ETEUKKwljdXJsX2RlZmF1bHQgPSBnZXRfY3VybF9oYW5kbGUoKTsKKyNlbmRpZgorfQorCit2b2lkIGh0dHBfY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90ID0gYWN0aXZlX3F1ZXVlX2hlYWQ7CisKKwl3aGlsZSAoc2xvdCAhPSBOVUxMKSB7CisJCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpuZXh0ID0gc2xvdC0+bmV4dDsKKwkJaWYgKHNsb3QtPmN1cmwgIT0gTlVMTCkgeworI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJCQljdXJsX211bHRpX3JlbW92ZV9oYW5kbGUoY3VybG0sIHNsb3QtPmN1cmwpOworI2VuZGlmCisJCQljdXJsX2Vhc3lfY2xlYW51cChzbG90LT5jdXJsKTsKKwkJfQorCQlmcmVlKHNsb3QpOworCQlzbG90ID0gbmV4dDsKKwl9CisJYWN0aXZlX3F1ZXVlX2hlYWQgPSBOVUxMOworCisjaWZuZGVmIE5PX0NVUkxfRUFTWV9EVVBIQU5ETEUKKwljdXJsX2Vhc3lfY2xlYW51cChjdXJsX2RlZmF1bHQpOworI2VuZGlmCisKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorCWN1cmxfbXVsdGlfY2xlYW51cChjdXJsbSk7CisjZW5kaWYKKwljdXJsX2dsb2JhbF9jbGVhbnVwKCk7CisKKwljdXJsX3NsaXN0X2ZyZWVfYWxsKHByYWdtYV9oZWFkZXIpOworCXByYWdtYV9oZWFkZXIgPSBOVUxMOworCisJaWYgKGN1cmxfaHR0cF9wcm94eSkgeworCQlmcmVlKGN1cmxfaHR0cF9wcm94eSk7CisJCWN1cmxfaHR0cF9wcm94eSA9IE5VTEw7CisJfQorfQorCitzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqZ2V0X2FjdGl2ZV9zbG90KHZvaWQpCit7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3QgPSBhY3RpdmVfcXVldWVfaGVhZDsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqbmV3c2xvdDsKKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJaW50IG51bV90cmFuc2ZlcnM7CisKKwkvKiBXYWl0IGZvciBhIHNsb3QgdG8gb3BlbiB1cCBpZiB0aGUgcXVldWUgaXMgZnVsbCAqLworCXdoaWxlIChhY3RpdmVfcmVxdWVzdHMgPj0gbWF4X3JlcXVlc3RzKSB7CisJCWN1cmxfbXVsdGlfcGVyZm9ybShjdXJsbSwgJm51bV90cmFuc2ZlcnMpOworCQlpZiAobnVtX3RyYW5zZmVycyA8IGFjdGl2ZV9yZXF1ZXN0cykgeworCQkJcHJvY2Vzc19jdXJsX21lc3NhZ2VzKCk7CisJCX0KKwl9CisjZW5kaWYKKworCXdoaWxlIChzbG90ICE9IE5VTEwgJiYgc2xvdC0+aW5fdXNlKSB7CisJCXNsb3QgPSBzbG90LT5uZXh0OworCX0KKwlpZiAoc2xvdCA9PSBOVUxMKSB7CisJCW5ld3Nsb3QgPSB4bWFsbG9jKHNpemVvZigqbmV3c2xvdCkpOworCQluZXdzbG90LT5jdXJsID0gTlVMTDsKKwkJbmV3c2xvdC0+aW5fdXNlID0gMDsKKwkJbmV3c2xvdC0+bmV4dCA9IE5VTEw7CisKKwkJc2xvdCA9IGFjdGl2ZV9xdWV1ZV9oZWFkOworCQlpZiAoc2xvdCA9PSBOVUxMKSB7CisJCQlhY3RpdmVfcXVldWVfaGVhZCA9IG5ld3Nsb3Q7CisJCX0gZWxzZSB7CisJCQl3aGlsZSAoc2xvdC0+bmV4dCAhPSBOVUxMKSB7CisJCQkJc2xvdCA9IHNsb3QtPm5leHQ7CisJCQl9CisJCQlzbG90LT5uZXh0ID0gbmV3c2xvdDsKKwkJfQorCQlzbG90ID0gbmV3c2xvdDsKKwl9CisKKwlpZiAoc2xvdC0+Y3VybCA9PSBOVUxMKSB7CisjaWZkZWYgTk9fQ1VSTF9FQVNZX0RVUEhBTkRMRQorCQlzbG90LT5jdXJsID0gZ2V0X2N1cmxfaGFuZGxlKCk7CisjZWxzZQorCQlzbG90LT5jdXJsID0gY3VybF9lYXN5X2R1cGhhbmRsZShjdXJsX2RlZmF1bHQpOworI2VuZGlmCisJfQorCisJYWN0aXZlX3JlcXVlc3RzKys7CisJc2xvdC0+aW5fdXNlID0gMTsKKwlzbG90LT5sb2NhbCA9IE5VTEw7CisJc2xvdC0+cmVzdWx0cyA9IE5VTEw7CisJc2xvdC0+ZmluaXNoZWQgPSBOVUxMOworCXNsb3QtPmNhbGxiYWNrX2RhdGEgPSBOVUxMOworCXNsb3QtPmNhbGxiYWNrX2Z1bmMgPSBOVUxMOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBwcmFnbWFfaGVhZGVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfRVJST1JCVUZGRVIsIGN1cmxfZXJyb3JzdHIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBOVUxMKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfUkVBREZVTkNUSU9OLCBOVUxMKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgTlVMTCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VQTE9BRCwgMCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBHRVQsIDEpOworCisJcmV0dXJuIHNsb3Q7Cit9CisKK2ludCBzdGFydF9hY3RpdmVfc2xvdChzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdCkKK3sKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorCUNVUkxNY29kZSBjdXJsbV9yZXN1bHQgPSBjdXJsX211bHRpX2FkZF9oYW5kbGUoY3VybG0sIHNsb3QtPmN1cmwpOworCWludCBudW1fdHJhbnNmZXJzOworCisJaWYgKGN1cmxtX3Jlc3VsdCAhPSBDVVJMTV9PSyAmJgorCSAgICBjdXJsbV9yZXN1bHQgIT0gQ1VSTE1fQ0FMTF9NVUxUSV9QRVJGT1JNKSB7CisJCWFjdGl2ZV9yZXF1ZXN0cy0tOworCQlzbG90LT5pbl91c2UgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFdlIGtub3cgdGhlcmUgbXVzdCBiZSBzb21ldGhpbmcgdG8gZG8sIHNpbmNlIHdlIGp1c3QgYWRkZWQKKwkgKiBzb21ldGhpbmcuCisJICovCisJY3VybF9tdWx0aV9wZXJmb3JtKGN1cmxtLCAmbnVtX3RyYW5zZmVycyk7CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCitzdHJ1Y3QgZmlsbF9jaGFpbiB7CisJdm9pZCAqZGF0YTsKKwlpbnQgKCpmaWxsKSh2b2lkICopOworCXN0cnVjdCBmaWxsX2NoYWluICpuZXh0OworfTsKKworc3RhdGljIHN0cnVjdCBmaWxsX2NoYWluICpmaWxsX2NmZyA9IE5VTEw7CisKK3ZvaWQgYWRkX2ZpbGxfZnVuY3Rpb24odm9pZCAqZGF0YSwgaW50ICgqZmlsbCkodm9pZCAqKSkKK3sKKwlzdHJ1Y3QgZmlsbF9jaGFpbiAqbmV3ID0gbWFsbG9jKHNpemVvZigqbmV3KSk7CisJc3RydWN0IGZpbGxfY2hhaW4gKipsaW5rcCA9ICZmaWxsX2NmZzsKKwluZXctPmRhdGEgPSBkYXRhOworCW5ldy0+ZmlsbCA9IGZpbGw7CisJbmV3LT5uZXh0ID0gTlVMTDsKKwl3aGlsZSAoKmxpbmtwKQorCQlsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dDsKKwkqbGlua3AgPSBuZXc7Cit9CisKK3ZvaWQgZmlsbF9hY3RpdmVfc2xvdHModm9pZCkKK3sKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdCA9IGFjdGl2ZV9xdWV1ZV9oZWFkOworCisJd2hpbGUgKGFjdGl2ZV9yZXF1ZXN0cyA8IG1heF9yZXF1ZXN0cykgeworCQlzdHJ1Y3QgZmlsbF9jaGFpbiAqZmlsbDsKKwkJZm9yIChmaWxsID0gZmlsbF9jZmc7IGZpbGw7IGZpbGwgPSBmaWxsLT5uZXh0KQorCQkJaWYgKGZpbGwtPmZpbGwoZmlsbC0+ZGF0YSkpCisJCQkJYnJlYWs7CisKKwkJaWYgKCFmaWxsKQorCQkJYnJlYWs7CisJfQorCisJd2hpbGUgKHNsb3QgIT0gTlVMTCkgeworCQlpZiAoIXNsb3QtPmluX3VzZSAmJiBzbG90LT5jdXJsICE9IE5VTEwpIHsKKwkJCWN1cmxfZWFzeV9jbGVhbnVwKHNsb3QtPmN1cmwpOworCQkJc2xvdC0+Y3VybCA9IE5VTEw7CisJCX0KKwkJc2xvdCA9IHNsb3QtPm5leHQ7CisJfQorfQorCit2b2lkIHN0ZXBfYWN0aXZlX3Nsb3RzKHZvaWQpCit7CisJaW50IG51bV90cmFuc2ZlcnM7CisJQ1VSTE1jb2RlIGN1cmxtX3Jlc3VsdDsKKworCWRvIHsKKwkJY3VybG1fcmVzdWx0ID0gY3VybF9tdWx0aV9wZXJmb3JtKGN1cmxtLCAmbnVtX3RyYW5zZmVycyk7CisJfSB3aGlsZSAoY3VybG1fcmVzdWx0ID09IENVUkxNX0NBTExfTVVMVElfUEVSRk9STSk7CisJaWYgKG51bV90cmFuc2ZlcnMgPCBhY3RpdmVfcmVxdWVzdHMpIHsKKwkJcHJvY2Vzc19jdXJsX21lc3NhZ2VzKCk7CisJCWZpbGxfYWN0aXZlX3Nsb3RzKCk7CisJfQorfQorI2VuZGlmCisKK3ZvaWQgcnVuX2FjdGl2ZV9zbG90KHN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90KQoreworI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJbG9uZyBsYXN0X3BvcyA9IDA7CisJbG9uZyBjdXJyZW50X3BvczsKKwlmZF9zZXQgcmVhZGZkczsKKwlmZF9zZXQgd3JpdGVmZHM7CisJZmRfc2V0IGV4Y2ZkczsKKwlpbnQgbWF4X2ZkOworCXN0cnVjdCB0aW1ldmFsIHNlbGVjdF90aW1lb3V0OworCWludCBmaW5pc2hlZCA9IDA7CisKKwlzbG90LT5maW5pc2hlZCA9ICZmaW5pc2hlZDsKKwl3aGlsZSAoIWZpbmlzaGVkKSB7CisJCWRhdGFfcmVjZWl2ZWQgPSAwOworCQlzdGVwX2FjdGl2ZV9zbG90cygpOworCisJCWlmICghZGF0YV9yZWNlaXZlZCAmJiBzbG90LT5sb2NhbCAhPSBOVUxMKSB7CisJCQljdXJyZW50X3BvcyA9IGZ0ZWxsKHNsb3QtPmxvY2FsKTsKKwkJCWlmIChjdXJyZW50X3BvcyA+IGxhc3RfcG9zKQorCQkJCWRhdGFfcmVjZWl2ZWQrKzsKKwkJCWxhc3RfcG9zID0gY3VycmVudF9wb3M7CisJCX0KKworCQlpZiAoc2xvdC0+aW5fdXNlICYmICFkYXRhX3JlY2VpdmVkKSB7CisJCQltYXhfZmQgPSAwOworCQkJRkRfWkVSTygmcmVhZGZkcyk7CisJCQlGRF9aRVJPKCZ3cml0ZWZkcyk7CisJCQlGRF9aRVJPKCZleGNmZHMpOworCQkJc2VsZWN0X3RpbWVvdXQudHZfc2VjID0gMDsKKwkJCXNlbGVjdF90aW1lb3V0LnR2X3VzZWMgPSA1MDAwMDsKKwkJCXNlbGVjdChtYXhfZmQsICZyZWFkZmRzLCAmd3JpdGVmZHMsCisJCQkgICAgICAgJmV4Y2ZkcywgJnNlbGVjdF90aW1lb3V0KTsKKwkJfQorCX0KKyNlbHNlCisJd2hpbGUgKHNsb3QtPmluX3VzZSkgeworCQlzbG90LT5jdXJsX3Jlc3VsdCA9IGN1cmxfZWFzeV9wZXJmb3JtKHNsb3QtPmN1cmwpOworCQlmaW5pc2hfYWN0aXZlX3Nsb3Qoc2xvdCk7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGNsb3NlZG93bl9hY3RpdmVfc2xvdChzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdCkKK3sKKwlhY3RpdmVfcmVxdWVzdHMtLTsKKwlzbG90LT5pbl91c2UgPSAwOworfQorCit2b2lkIHJlbGVhc2VfYWN0aXZlX3Nsb3Qoc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3QpCit7CisJY2xvc2Vkb3duX2FjdGl2ZV9zbG90KHNsb3QpOworCWlmIChzbG90LT5jdXJsKSB7CisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwkJY3VybF9tdWx0aV9yZW1vdmVfaGFuZGxlKGN1cmxtLCBzbG90LT5jdXJsKTsKKyNlbmRpZgorCQljdXJsX2Vhc3lfY2xlYW51cChzbG90LT5jdXJsKTsKKwkJc2xvdC0+Y3VybCA9IE5VTEw7CisJfQorI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJZmlsbF9hY3RpdmVfc2xvdHMoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBmaW5pc2hfYWN0aXZlX3Nsb3Qoc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3QpCit7CisJY2xvc2Vkb3duX2FjdGl2ZV9zbG90KHNsb3QpOworCWN1cmxfZWFzeV9nZXRpbmZvKHNsb3QtPmN1cmwsIENVUkxJTkZPX0hUVFBfQ09ERSwgJnNsb3QtPmh0dHBfY29kZSk7CisKKwlpZiAoc2xvdC0+ZmluaXNoZWQgIT0gTlVMTCkKKwkJKCpzbG90LT5maW5pc2hlZCkgPSAxOworCisJLyogU3RvcmUgc2xvdCByZXN1bHRzIHNvIHRoZXkgY2FuIGJlIHJlYWQgYWZ0ZXIgdGhlIHNsb3QgaXMgcmV1c2VkICovCisJaWYgKHNsb3QtPnJlc3VsdHMgIT0gTlVMTCkgeworCQlzbG90LT5yZXN1bHRzLT5jdXJsX3Jlc3VsdCA9IHNsb3QtPmN1cmxfcmVzdWx0OworCQlzbG90LT5yZXN1bHRzLT5odHRwX2NvZGUgPSBzbG90LT5odHRwX2NvZGU7CisJfQorCisJLyogUnVuIGNhbGxiYWNrIGlmIGFwcHJvcHJpYXRlICovCisJaWYgKHNsb3QtPmNhbGxiYWNrX2Z1bmMgIT0gTlVMTCkgeworCQlzbG90LT5jYWxsYmFja19mdW5jKHNsb3QtPmNhbGxiYWNrX2RhdGEpOworCX0KK30KKwordm9pZCBmaW5pc2hfYWxsX2FjdGl2ZV9zbG90cyh2b2lkKQoreworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90ID0gYWN0aXZlX3F1ZXVlX2hlYWQ7CisKKwl3aGlsZSAoc2xvdCAhPSBOVUxMKQorCQlpZiAoc2xvdC0+aW5fdXNlKSB7CisJCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCQlzbG90ID0gYWN0aXZlX3F1ZXVlX2hlYWQ7CisJCX0gZWxzZSB7CisJCQlzbG90ID0gc2xvdC0+bmV4dDsKKwkJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBuZWVkc19xdW90ZShpbnQgY2gpCit7CisJaWYgKCgoY2ggPj0gJ0EnKSAmJiAoY2ggPD0gJ1onKSkKKwkJCXx8ICgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ3onKSkKKwkJCXx8ICgoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkKKwkJCXx8IChjaCA9PSAnLycpCisJCQl8fCAoY2ggPT0gJy0nKQorCQkJfHwgKGNoID09ICcuJykpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBoZXgoaW50IHYpCit7CisJaWYgKHYgPCAxMCkgcmV0dXJuICcwJyArIHY7CisJZWxzZSByZXR1cm4gJ0EnICsgdiAtIDEwOworfQorCitzdGF0aWMgY2hhciAqcXVvdGVfcmVmX3VybChjb25zdCBjaGFyICpiYXNlLCBjb25zdCBjaGFyICpyZWYpCit7CisJY29uc3QgY2hhciAqY3A7CisJY2hhciAqZHAsICpxcmVmOworCWludCBsZW4sIGJhc2VsZW4sIGNoOworCisJYmFzZWxlbiA9IHN0cmxlbihiYXNlKTsKKwlsZW4gPSBiYXNlbGVuICsgNzsgLyogIi9yZWZzLyIgKyBOVUwgKi8KKwlmb3IgKGNwID0gcmVmOyAoY2ggPSAqY3ApICE9IDA7IGNwKyssIGxlbisrKQorCQlpZiAobmVlZHNfcXVvdGUoY2gpKQorCQkJbGVuICs9IDI7IC8qIGV4dHJhIHR3byBoZXggcGx1cyByZXBsYWNlbWVudCAlICovCisJcXJlZiA9IHhtYWxsb2MobGVuKTsKKwltZW1jcHkocXJlZiwgYmFzZSwgYmFzZWxlbik7CisJbWVtY3B5KHFyZWYgKyBiYXNlbGVuLCAiL3JlZnMvIiwgNik7CisJZm9yIChjcCA9IHJlZiwgZHAgPSBxcmVmICsgYmFzZWxlbiArIDY7IChjaCA9ICpjcCkgIT0gMDsgY3ArKykgeworCQlpZiAobmVlZHNfcXVvdGUoY2gpKSB7CisJCQkqZHArKyA9ICclJzsKKwkJCSpkcCsrID0gaGV4KChjaCA+PiA0KSAmIDB4Rik7CisJCQkqZHArKyA9IGhleChjaCAmIDB4Rik7CisJCX0KKwkJZWxzZQorCQkJKmRwKysgPSBjaDsKKwl9CisJKmRwID0gMDsKKworCXJldHVybiBxcmVmOworfQorCitpbnQgaHR0cF9mZXRjaF9yZWYoY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqcmVmLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWNoYXIgKnVybDsKKwlzdHJ1Y3Qgc3RyYnVmIGJ1ZmZlciA9IFNUUkJVRl9JTklUOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBzbG90X3Jlc3VsdHMgcmVzdWx0czsKKwlpbnQgcmV0OworCisJdXJsID0gcXVvdGVfcmVmX3VybChiYXNlLCByZWYpOworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0ZJTEUsICZidWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgTlVMTCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCA9PSBDVVJMRV9PSykgeworCQkJc3RyYnVmX3J0cmltKCZidWZmZXIpOworCQkJaWYgKGJ1ZmZlci5sZW4gPT0gNDApCisJCQkJcmV0ID0gZ2V0X3NoYTFfaGV4KGJ1ZmZlci5idWYsIHNoYTEpOworCQkJZWxzZQorCQkJCXJldCA9IDE7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBlcnJvcigiQ291bGRuJ3QgZ2V0ICVzIGZvciAlc1xuJXMiLAorCQkJCSAgICB1cmwsIHJlZiwgY3VybF9lcnJvcnN0cik7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSBlcnJvcigiVW5hYmxlIHRvIHN0YXJ0IHJlcXVlc3QiKTsKKwl9CisKKwlzdHJidWZfcmVsZWFzZSgmYnVmZmVyKTsKKwlmcmVlKHVybCk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2h0dHAuaCBiL2h0dHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDE2OWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvaHR0cC5oCkBAIC0wLDAgKzEsMTEwIEBACisjaWZuZGVmIEhUVFBfSAorI2RlZmluZSBIVFRQX0gKKworI2luY2x1ZGUgImNhY2hlLmgiCisKKyNpbmNsdWRlIDxjdXJsL2N1cmwuaD4KKyNpbmNsdWRlIDxjdXJsL2Vhc3kuaD4KKworI2luY2x1ZGUgInN0cmJ1Zi5oIgorI2luY2x1ZGUgInJlbW90ZS5oIgorCisvKgorICogV2UgZGV0ZWN0IGJhc2VkIG9uIHRoZSBjVVJMIHZlcnNpb24gaWYgbXVsdGktdHJhbnNmZXIgaXMKKyAqIHVzYWJsZSBpbiB0aGlzIGltcGxlbWVudGF0aW9uIGFuZCBkZWZpbmUgdGhpcyBzeW1ib2wgYWNjb3JkaW5nbHkuCisgKiBUaGlzIGlzIG5vdCBzb21ldGhpbmcgTWFrZWZpbGUgc2hvdWxkIHNldCBub3IgdXNlcnMgc2hvdWxkIHBhc3MKKyAqIHZpYSBDRkxBR1MuCisgKi8KKyN1bmRlZiBVU0VfQ1VSTF9NVUxUSQorCisjaWYgTElCQ1VSTF9WRVJTSU9OX05VTSA+PSAweDA3MTAwMAorI2RlZmluZSBVU0VfQ1VSTF9NVUxUSQorI2RlZmluZSBERUZBVUxUX01BWF9SRVFVRVNUUyA1CisjZW5kaWYKKworI2lmIExJQkNVUkxfVkVSU0lPTl9OVU0gPCAweDA3MDcwNAorI2RlZmluZSBjdXJsX2dsb2JhbF9jbGVhbnVwKCkgZG8geyAvKiBub3RoaW5nICovIH0gd2hpbGUoMCkKKyNlbmRpZgorI2lmIExJQkNVUkxfVkVSU0lPTl9OVU0gPCAweDA3MDgwMAorI2RlZmluZSBjdXJsX2dsb2JhbF9pbml0KGEpIGRvIHsgLyogbm90aGluZyAqLyB9IHdoaWxlKDApCisjZW5kaWYKKworI2lmIChMSUJDVVJMX1ZFUlNJT05fTlVNIDwgMHgwNzBjMDQpIHx8IChMSUJDVVJMX1ZFUlNJT05fTlVNID09IDB4MDcxMDAwKQorI2RlZmluZSBOT19DVVJMX0VBU1lfRFVQSEFORExFCisjZW5kaWYKKworI2lmIExJQkNVUkxfVkVSU0lPTl9OVU0gPCAweDA3MGEwMworI2RlZmluZSBDVVJMRV9IVFRQX1JFVFVSTkVEX0VSUk9SIENVUkxFX0hUVFBfTk9UX0ZPVU5ECisjZW5kaWYKKworc3RydWN0IHNsb3RfcmVzdWx0cworeworCUNVUkxjb2RlIGN1cmxfcmVzdWx0OworCWxvbmcgaHR0cF9jb2RlOworfTsKKworc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QKK3sKKwlDVVJMICpjdXJsOworCUZJTEUgKmxvY2FsOworCWludCBpbl91c2U7CisJQ1VSTGNvZGUgY3VybF9yZXN1bHQ7CisJbG9uZyBodHRwX2NvZGU7CisJaW50ICpmaW5pc2hlZDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzICpyZXN1bHRzOworCXZvaWQgKmNhbGxiYWNrX2RhdGE7CisJdm9pZCAoKmNhbGxiYWNrX2Z1bmMpKHZvaWQgKmRhdGEpOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpuZXh0OworfTsKKworc3RydWN0IGJ1ZmZlcgoreworCXN0cnVjdCBzdHJidWYgYnVmOworCXNpemVfdCBwb3NuOworfTsKKworLyogQ3VybCByZXF1ZXN0IHJlYWQvd3JpdGUgY2FsbGJhY2tzICovCitleHRlcm4gc2l6ZV90IGZyZWFkX2J1ZmZlcih2b2lkICpwdHIsIHNpemVfdCBlbHRzaXplLCBzaXplX3Qgbm1lbWIsCisJCQkgICBzdHJ1Y3QgYnVmZmVyICpidWZmZXIpOworZXh0ZXJuIHNpemVfdCBmd3JpdGVfYnVmZmVyKGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IGVsdHNpemUsCisJCQkgICAgc2l6ZV90IG5tZW1iLCBzdHJ1Y3Qgc3RyYnVmICpidWZmZXIpOworZXh0ZXJuIHNpemVfdCBmd3JpdGVfbnVsbChjb25zdCB2b2lkICpwdHIsIHNpemVfdCBlbHRzaXplLAorCQkJICBzaXplX3Qgbm1lbWIsIHN0cnVjdCBzdHJidWYgKmJ1ZmZlcik7CisKKy8qIFNsb3QgbGlmZWN5Y2xlIGZ1bmN0aW9ucyAqLworZXh0ZXJuIHN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpnZXRfYWN0aXZlX3Nsb3Qodm9pZCk7CitleHRlcm4gaW50IHN0YXJ0X2FjdGl2ZV9zbG90KHN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90KTsKK2V4dGVybiB2b2lkIHJ1bl9hY3RpdmVfc2xvdChzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdCk7CitleHRlcm4gdm9pZCBmaW5pc2hfYWxsX2FjdGl2ZV9zbG90cyh2b2lkKTsKK2V4dGVybiB2b2lkIHJlbGVhc2VfYWN0aXZlX3Nsb3Qoc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3QpOworCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKK2V4dGVybiB2b2lkIGZpbGxfYWN0aXZlX3Nsb3RzKHZvaWQpOworZXh0ZXJuIHZvaWQgYWRkX2ZpbGxfZnVuY3Rpb24odm9pZCAqZGF0YSwgaW50ICgqZmlsbCkodm9pZCAqKSk7CitleHRlcm4gdm9pZCBzdGVwX2FjdGl2ZV9zbG90cyh2b2lkKTsKKyNlbmRpZgorCitleHRlcm4gdm9pZCBodHRwX2luaXQoc3RydWN0IHJlbW90ZSAqcmVtb3RlKTsKK2V4dGVybiB2b2lkIGh0dHBfY2xlYW51cCh2b2lkKTsKKworZXh0ZXJuIGludCBkYXRhX3JlY2VpdmVkOworZXh0ZXJuIGludCBhY3RpdmVfcmVxdWVzdHM7CisKK2V4dGVybiBjaGFyIGN1cmxfZXJyb3JzdHJbQ1VSTF9FUlJPUl9TSVpFXTsKKworc3RhdGljIGlubGluZSBpbnQgbWlzc2luZ19fdGFyZ2V0KGludCBjb2RlLCBpbnQgcmVzdWx0KQoreworCXJldHVybgkvKiBmaWxlOi8vIFVSTCAtLSBkbyB3ZSBldmVyIHVzZSBvbmU/Pz8gKi8KKwkJKHJlc3VsdCA9PSBDVVJMRV9GSUxFX0NPVUxETlRfUkVBRF9GSUxFKSB8fAorCQkvKiBodHRwOi8vIGFuZCBodHRwczovLyBVUkwgKi8KKwkJKGNvZGUgPT0gNDA0ICYmIHJlc3VsdCA9PSBDVVJMRV9IVFRQX1JFVFVSTkVEX0VSUk9SKSB8fAorCQkvKiBmdHA6Ly8gVVJMICovCisJCShjb2RlID09IDU1MCAmJiByZXN1bHQgPT0gQ1VSTEVfRlRQX0NPVUxETlRfUkVUUl9GSUxFKQorCQk7Cit9CisKKyNkZWZpbmUgbWlzc2luZ190YXJnZXQoYSkgbWlzc2luZ19fdGFyZ2V0KChhKS0+aHR0cF9jb2RlLCAoYSktPmN1cmxfcmVzdWx0KQorCitleHRlcm4gaW50IGh0dHBfZmV0Y2hfcmVmKGNvbnN0IGNoYXIgKmJhc2UsIGNvbnN0IGNoYXIgKnJlZiwgdW5zaWduZWQgY2hhciAqc2hhMSk7CisKKyNlbmRpZiAvKiBIVFRQX0ggKi8KZGlmZiAtLWdpdCBhL2lkZW50LmMgYi9pZGVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNDRhNTMKLS0tIC9kZXYvbnVsbAorKysgYi9pZGVudC5jCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogaWRlbnQuYworICoKKyAqIGNyZWF0ZSBnaXQgaWRlbnRpZmllciBsaW5lcyBvZiB0aGUgZm9ybSAibmFtZSA8ZW1haWw+IGRhdGUiCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IExpbnVzIFRvcnZhbGRzCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorCitzdGF0aWMgY2hhciBnaXRfZGVmYXVsdF9kYXRlWzUwXTsKKworc3RhdGljIHZvaWQgY29weV9nZWNvcyhjb25zdCBzdHJ1Y3QgcGFzc3dkICp3LCBjaGFyICpuYW1lLCBzaXplX3Qgc3opCit7CisJY2hhciAqc3JjLCAqZHN0OworCXNpemVfdCBsZW4sIG5sZW47CisKKwlubGVuID0gc3RybGVuKHctPnB3X25hbWUpOworCisJLyogVHJhZGl0aW9uYWxseSBHRUNPUyBmaWVsZCBoYWQgb2ZmaWNlIHBob25lIG51bWJlcnMgZXRjLCBzZXBhcmF0ZWQKKwkgKiB3aXRoIGNvbW1hcy4gIEFsc28gJiBzdGFuZHMgZm9yIGNhcGl0YWxpemVkIGZvcm0gb2YgdGhlIGxvZ2luIG5hbWUuCisJICovCisKKwlmb3IgKGxlbiA9IDAsIGRzdCA9IG5hbWUsIHNyYyA9IHctPnB3X2dlY29zOyBsZW4gPCBzejsgc3JjKyspIHsKKwkJaW50IGNoID0gKnNyYzsKKwkJaWYgKGNoICE9ICcmJykgeworCQkJKmRzdCsrID0gY2g7CisJCQlpZiAoY2ggPT0gMCB8fCBjaCA9PSAnLCcpCisJCQkJYnJlYWs7CisJCQlsZW4rKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChsZW4gKyBubGVuIDwgc3opIHsKKwkJCS8qIFNvcnJ5LCBNci4gTWNEb25hbGQuLi4gKi8KKwkJCSpkc3QrKyA9IHRvdXBwZXIoKnctPnB3X25hbWUpOworCQkJbWVtY3B5KGRzdCwgdy0+cHdfbmFtZSArIDEsIG5sZW4gLSAxKTsKKwkJCWRzdCArPSBubGVuIC0gMTsKKwkJfQorCX0KKwlpZiAobGVuIDwgc3opCisJCW5hbWVbbGVuXSA9IDA7CisJZWxzZQorCQlkaWUoIllvdXIgcGFyZW50cyBtdXN0IGhhdmUgaGF0ZWQgeW91ISIpOworCit9CisKK3N0YXRpYyB2b2lkIGNvcHlfZW1haWwoY29uc3Qgc3RydWN0IHBhc3N3ZCAqcHcpCit7CisJLyoKKwkgKiBNYWtlIHVwIGEgZmFrZSBlbWFpbCBhZGRyZXNzCisJICogKG5hbWUgKyAnQCcgKyBob3N0bmFtZSBbKyAnLicgKyBkb21haW5uYW1lXSkKKwkgKi8KKwlzaXplX3QgbGVuID0gc3RybGVuKHB3LT5wd19uYW1lKTsKKwlpZiAobGVuID4gc2l6ZW9mKGdpdF9kZWZhdWx0X2VtYWlsKS8yKQorCQlkaWUoIllvdXIgc3lzYWRtaW4gbXVzdCBoYXRlIHlvdSEiKTsKKwltZW1jcHkoZ2l0X2RlZmF1bHRfZW1haWwsIHB3LT5wd19uYW1lLCBsZW4pOworCWdpdF9kZWZhdWx0X2VtYWlsW2xlbisrXSA9ICdAJzsKKwlnZXRob3N0bmFtZShnaXRfZGVmYXVsdF9lbWFpbCArIGxlbiwgc2l6ZW9mKGdpdF9kZWZhdWx0X2VtYWlsKSAtIGxlbik7CisJaWYgKCFzdHJjaHIoZ2l0X2RlZmF1bHRfZW1haWwrbGVuLCAnLicpKSB7CisJCXN0cnVjdCBob3N0ZW50ICpoZSA9IGdldGhvc3RieW5hbWUoZ2l0X2RlZmF1bHRfZW1haWwgKyBsZW4pOworCQljaGFyICpkb21haW5uYW1lOworCisJCWxlbiA9IHN0cmxlbihnaXRfZGVmYXVsdF9lbWFpbCk7CisJCWdpdF9kZWZhdWx0X2VtYWlsW2xlbisrXSA9ICcuJzsKKwkJaWYgKGhlICYmIChkb21haW5uYW1lID0gc3RyY2hyKGhlLT5oX25hbWUsICcuJykpKQorCQkJc3RybGNweShnaXRfZGVmYXVsdF9lbWFpbCArIGxlbiwgZG9tYWlubmFtZSArIDEsCisJCQkJc2l6ZW9mKGdpdF9kZWZhdWx0X2VtYWlsKSAtIGxlbik7CisJCWVsc2UKKwkJCXN0cmxjcHkoZ2l0X2RlZmF1bHRfZW1haWwgKyBsZW4sICIobm9uZSkiLAorCQkJCXNpemVvZihnaXRfZGVmYXVsdF9lbWFpbCkgLSBsZW4pOworCX0KK30KKworc3RhdGljIHZvaWQgc2V0dXBfaWRlbnQodm9pZCkKK3sKKwlzdHJ1Y3QgcGFzc3dkICpwdyA9IE5VTEw7CisKKwkvKiBHZXQgdGhlIG5hbWUgKCJnZWNvcyIpICovCisJaWYgKCFnaXRfZGVmYXVsdF9uYW1lWzBdKSB7CisJCXB3ID0gZ2V0cHd1aWQoZ2V0dWlkKCkpOworCQlpZiAoIXB3KQorCQkJZGllKCJZb3UgZG9uJ3QgZXhpc3QuIEdvIGF3YXkhIik7CisJCWNvcHlfZ2Vjb3MocHcsIGdpdF9kZWZhdWx0X25hbWUsIHNpemVvZihnaXRfZGVmYXVsdF9uYW1lKSk7CisJfQorCisJaWYgKCFnaXRfZGVmYXVsdF9lbWFpbFswXSkgeworCQljb25zdCBjaGFyICplbWFpbCA9IGdldGVudigiRU1BSUwiKTsKKworCQlpZiAoZW1haWwgJiYgZW1haWxbMF0pCisJCQlzdHJsY3B5KGdpdF9kZWZhdWx0X2VtYWlsLCBlbWFpbCwKKwkJCQlzaXplb2YoZ2l0X2RlZmF1bHRfZW1haWwpKTsKKwkJZWxzZSB7CisJCQlpZiAoIXB3KQorCQkJCXB3ID0gZ2V0cHd1aWQoZ2V0dWlkKCkpOworCQkJaWYgKCFwdykKKwkJCQlkaWUoIllvdSBkb24ndCBleGlzdC4gR28gYXdheSEiKTsKKwkJCWNvcHlfZW1haWwocHcpOworCQl9CisJfQorCisJLyogQW5kIHNldCB0aGUgZGVmYXVsdCBkYXRlICovCisJaWYgKCFnaXRfZGVmYXVsdF9kYXRlWzBdKQorCQlkYXRlc3RhbXAoZ2l0X2RlZmF1bHRfZGF0ZSwgc2l6ZW9mKGdpdF9kZWZhdWx0X2RhdGUpKTsKK30KKworc3RhdGljIGludCBhZGRfcmF3KGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUsIGludCBvZmZzZXQsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlzaXplX3QgbGVuID0gc3RybGVuKHN0cik7CisJaWYgKG9mZnNldCArIGxlbiA+IHNpemUpCisJCXJldHVybiBzaXplOworCW1lbWNweShidWYgKyBvZmZzZXQsIHN0ciwgbGVuKTsKKwlyZXR1cm4gb2Zmc2V0ICsgbGVuOworfQorCitzdGF0aWMgaW50IGNydWQodW5zaWduZWQgY2hhciBjKQoreworCXJldHVybiAgYyA8PSAzMiAgfHwKKwkJYyA9PSAnLicgfHwKKwkJYyA9PSAnLCcgfHwKKwkJYyA9PSAnOicgfHwKKwkJYyA9PSAnOycgfHwKKwkJYyA9PSAnPCcgfHwKKwkJYyA9PSAnPicgfHwKKwkJYyA9PSAnIicgfHwKKwkJYyA9PSAnXCcnOworfQorCisvKgorICogQ29weSBvdmVyIGEgc3RyaW5nIHRvIHRoZSBkZXN0aW5hdGlvbiwgYnV0IGF2b2lkIHNwZWNpYWwKKyAqIGNoYXJhY3RlcnMgKCdcbicsICc8JyBhbmQgJz4nKSBhbmQgcmVtb3ZlIGNydWQgYXQgdGhlIGVuZAorICovCitzdGF0aWMgaW50IGNvcHkoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgaW50IG9mZnNldCwgY29uc3QgY2hhciAqc3JjKQoreworCXNpemVfdCBpLCBsZW47CisJdW5zaWduZWQgY2hhciBjOworCisJLyogUmVtb3ZlIGNydWQgZnJvbSB0aGUgYmVnaW5uaW5nLi4gKi8KKwl3aGlsZSAoKGMgPSAqc3JjKSAhPSAwKSB7CisJCWlmICghY3J1ZChjKSkKKwkJCWJyZWFrOworCQlzcmMrKzsKKwl9CisKKwkvKiBSZW1vdmUgY3J1ZCBmcm9tIHRoZSBlbmQuLiAqLworCWxlbiA9IHN0cmxlbihzcmMpOworCXdoaWxlIChsZW4gPiAwKSB7CisJCWMgPSBzcmNbbGVuLTFdOworCQlpZiAoIWNydWQoYykpCisJCQlicmVhazsKKwkJLS1sZW47CisJfQorCisJLyoKKwkgKiBDb3B5IHRoZSByZXN0IHRvIHRoZSBidWZmZXIsIGJ1dCBhdm9pZCB0aGUgc3BlY2lhbAorCSAqIGNoYXJhY3RlcnMgJ1xuJyAnPCcgYW5kICc+JyB0aGF0IGFjdCBhcyBkZWxpbWl0ZXJzIG9uCisJICogYW4gaWRlbnRpZmljYXRpb24gbGluZQorCSAqLworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQljID0gKnNyYysrOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnXG4nOiBjYXNlICc8JzogY2FzZSAnPic6CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAob2Zmc2V0ID49IHNpemUpCisJCQlyZXR1cm4gc2l6ZTsKKwkJYnVmW29mZnNldCsrXSA9IGM7CisJfQorCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGF1X2VudltdID0gIkdJVF9BVVRIT1JfTkFNRSI7CitzdGF0aWMgY29uc3QgY2hhciBjb19lbnZbXSA9ICJHSVRfQ09NTUlUVEVSX05BTUUiOworc3RhdGljIGNvbnN0IGNoYXIgKmVudl9oaW50ID0KKyJcbiIKKyIqKiogUGxlYXNlIHRlbGwgbWUgd2hvIHlvdSBhcmUuXG4iCisiXG4iCisiUnVuXG4iCisiXG4iCisiICBnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgXCJ5b3VAZXhhbXBsZS5jb21cIlxuIgorIiAgZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLm5hbWUgXCJZb3VyIE5hbWVcIlxuIgorIlxuIgorInRvIHNldCB5b3VyIGFjY291bnRcJ3MgZGVmYXVsdCBpZGVudGl0eS5cbiIKKyJPbWl0IC0tZ2xvYmFsIHRvIHNldCB0aGUgaWRlbnRpdHkgb25seSBpbiB0aGlzIHJlcG9zaXRvcnkuXG4iCisiXG4iOworCitjb25zdCBjaGFyICpmbXRfaWRlbnQoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZW1haWwsCisJCSAgICAgIGNvbnN0IGNoYXIgKmRhdGVfc3RyLCBpbnQgZmxhZykKK3sKKwlzdGF0aWMgY2hhciBidWZmZXJbMTAwMF07CisJY2hhciBkYXRlWzUwXTsKKwlpbnQgaTsKKwlpbnQgZXJyb3Jfb25fbm9fbmFtZSA9IChmbGFnICYgSURFTlRfRVJST1JfT05fTk9fTkFNRSk7CisJaW50IHdhcm5fb25fbm9fbmFtZSA9IChmbGFnICYgSURFTlRfV0FSTl9PTl9OT19OQU1FKTsKKwlpbnQgbmFtZV9hZGRyX29ubHkgPSAoZmxhZyAmIElERU5UX05PX0RBVEUpOworCisJc2V0dXBfaWRlbnQoKTsKKwlpZiAoIW5hbWUpCisJCW5hbWUgPSBnaXRfZGVmYXVsdF9uYW1lOworCWlmICghZW1haWwpCisJCWVtYWlsID0gZ2l0X2RlZmF1bHRfZW1haWw7CisKKwlpZiAoISpuYW1lKSB7CisJCXN0cnVjdCBwYXNzd2QgKnB3OworCisJCWlmICgod2Fybl9vbl9ub19uYW1lIHx8IGVycm9yX29uX25vX25hbWUpICYmCisJCSAgICBuYW1lID09IGdpdF9kZWZhdWx0X25hbWUgJiYgZW52X2hpbnQpIHsKKwkJCWZwcmludGYoc3RkZXJyLCBlbnZfaGludCwgYXVfZW52LCBjb19lbnYpOworCQkJZW52X2hpbnQgPSBOVUxMOyAvKiB3YXJuIG9ubHkgb25jZSwgZm9yICJnaXQtdmFyIC1sIiAqLworCQl9CisJCWlmIChlcnJvcl9vbl9ub19uYW1lKQorCQkJZGllKCJlbXB0eSBpZGVudCAlcyA8JXM+IG5vdCBhbGxvd2VkIiwgbmFtZSwgZW1haWwpOworCQlwdyA9IGdldHB3dWlkKGdldHVpZCgpKTsKKwkJaWYgKCFwdykKKwkJCWRpZSgiWW91IGRvbid0IGV4aXN0LiBHbyBhd2F5ISIpOworCQlzdHJsY3B5KGdpdF9kZWZhdWx0X25hbWUsIHB3LT5wd19uYW1lLAorCQkJc2l6ZW9mKGdpdF9kZWZhdWx0X25hbWUpKTsKKwkJbmFtZSA9IGdpdF9kZWZhdWx0X25hbWU7CisJfQorCisJc3RyY3B5KGRhdGUsIGdpdF9kZWZhdWx0X2RhdGUpOworCWlmICghbmFtZV9hZGRyX29ubHkgJiYgZGF0ZV9zdHIpCisJCXBhcnNlX2RhdGUoZGF0ZV9zdHIsIGRhdGUsIHNpemVvZihkYXRlKSk7CisKKwlpID0gY29weShidWZmZXIsIHNpemVvZihidWZmZXIpLCAwLCBuYW1lKTsKKwlpID0gYWRkX3JhdyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBpLCAiIDwiKTsKKwlpID0gY29weShidWZmZXIsIHNpemVvZihidWZmZXIpLCBpLCBlbWFpbCk7CisJaWYgKCFuYW1lX2FkZHJfb25seSkgeworCQlpID0gYWRkX3JhdyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBpLCAgIj4gIik7CisJCWkgPSBjb3B5KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGksIGRhdGUpOworCX0gZWxzZSB7CisJCWkgPSBhZGRfcmF3KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGksICI+Iik7CisJfQorCWlmIChpID49IHNpemVvZihidWZmZXIpKQorCQlkaWUoIkltcG9zc2libHkgbG9uZyBwZXJzb25hbCBpZGVudGlmaWVyIik7CisJYnVmZmVyW2ldID0gMDsKKwlyZXR1cm4gYnVmZmVyOworfQorCitjb25zdCBjaGFyICpmbXRfbmFtZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICplbWFpbCkKK3sKKwlyZXR1cm4gZm10X2lkZW50KG5hbWUsIGVtYWlsLCBOVUxMLCBJREVOVF9FUlJPUl9PTl9OT19OQU1FIHwgSURFTlRfTk9fREFURSk7Cit9CisKK2NvbnN0IGNoYXIgKmdpdF9hdXRob3JfaW5mbyhpbnQgZmxhZykKK3sKKwlyZXR1cm4gZm10X2lkZW50KGdldGVudigiR0lUX0FVVEhPUl9OQU1FIiksCisJCQkgZ2V0ZW52KCJHSVRfQVVUSE9SX0VNQUlMIiksCisJCQkgZ2V0ZW52KCJHSVRfQVVUSE9SX0RBVEUiKSwKKwkJCSBmbGFnKTsKK30KKworY29uc3QgY2hhciAqZ2l0X2NvbW1pdHRlcl9pbmZvKGludCBmbGFnKQoreworCXJldHVybiBmbXRfaWRlbnQoZ2V0ZW52KCJHSVRfQ09NTUlUVEVSX05BTUUiKSwKKwkJCSBnZXRlbnYoIkdJVF9DT01NSVRURVJfRU1BSUwiKSwKKwkJCSBnZXRlbnYoIkdJVF9DT01NSVRURVJfREFURSIpLAorCQkJIGZsYWcpOworfQpkaWZmIC0tZ2l0IGEvaW1hcC1zZW5kLmMgYi9pbWFwLXNlbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGFmYmM0Ci0tLSAvZGV2L251bGwKKysrIGIvaW1hcC1zZW5kLmMKQEAgLTAsMCArMSwxMzQ1IEBACisvKgorICogZ2l0LWltYXAtc2VuZCAtIGRyb3BzIHBhdGNoZXMgaW50byBhbiBpbWFwIERyYWZ0cyBmb2xkZXIKKyAqICAgICAgICAgICAgICAgICBkZXJpdmVkIGZyb20gaXN5bmMvbWJzeW5jIC0gbWFpbGJveCBzeW5jaHJvbml6ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiBNaWNoYWVsIFIuIEVsa2lucyA8bWVAbXV0dC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBPc3dhbGQgQnVkZGVuaGFnZW4gPG9zc2lAdXNlcnMuc2YubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA0IFRoZW9kb3JlIFkuIFRzJ28gPHR5dHNvQG1pdC5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWlrZSBNY0Nvcm1hY2sKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSAiY2FjaGUuaCIKKwordHlwZWRlZiBzdHJ1Y3Qgc3RvcmVfY29uZiB7CisJY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpwYXRoOyAvKiBzaG91bGQgdGhpcyBiZSBoZXJlPyBpdHMgaW50ZXJwcmV0YXRpb24gaXMgZHJpdmVyLXNwZWNpZmljICovCisJY2hhciAqbWFwX2luYm94OworCWNoYXIgKnRyYXNoOworCXVuc2lnbmVkIG1heF9zaXplOyAvKiBvZmZfdCBpcyBvdmVya2lsbCAqLworCXVuc2lnbmVkIHRyYXNoX3JlbW90ZV9uZXc6MSwgdHJhc2hfb25seV9uZXc6MTsKK30gc3RvcmVfY29uZl90OworCit0eXBlZGVmIHN0cnVjdCBzdHJpbmdfbGlzdCB7CisJc3RydWN0IHN0cmluZ19saXN0ICpuZXh0OworCWNoYXIgc3RyaW5nWzFdOworfSBzdHJpbmdfbGlzdF90OworCit0eXBlZGVmIHN0cnVjdCBjaGFubmVsX2NvbmYgeworCXN0cnVjdCBjaGFubmVsX2NvbmYgKm5leHQ7CisJY2hhciAqbmFtZTsKKwlzdG9yZV9jb25mX3QgKm1hc3RlciwgKnNsYXZlOworCWNoYXIgKm1hc3Rlcl9uYW1lLCAqc2xhdmVfbmFtZTsKKwljaGFyICpzeW5jX3N0YXRlOworCXN0cmluZ19saXN0X3QgKnBhdHRlcm5zOworCWludCBtb3BzLCBzb3BzOworCXVuc2lnbmVkIG1heF9tZXNzYWdlczsgLyogZm9yIHNsYXZlIG9ubHkgKi8KK30gY2hhbm5lbF9jb25mX3Q7CisKK3R5cGVkZWYgc3RydWN0IGdyb3VwX2NvbmYgeworCXN0cnVjdCBncm91cF9jb25mICpuZXh0OworCWNoYXIgKm5hbWU7CisJc3RyaW5nX2xpc3RfdCAqY2hhbm5lbHM7Cit9IGdyb3VwX2NvbmZfdDsKKworLyogRm9yIG1lc3NhZ2UtPnN0YXR1cyAqLworI2RlZmluZSBNX1JFQ0VOVCAgICAgICAoMTw8MCkgLyogdW5zeW5jYWJsZSBmbGFnOyBtYWlsZGlyXyogZGVwZW5kIG9uIHRoaXMgYmVpbmcgMTw8MCAqLworI2RlZmluZSBNX0RFQUQgICAgICAgICAoMTw8MSkgLyogZXhwdW5nZWQgKi8KKyNkZWZpbmUgTV9GTEFHUyAgICAgICAgKDE8PDIpIC8qIGZsYWdzIGZldGNoZWQgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbWVzc2FnZSB7CisJc3RydWN0IG1lc3NhZ2UgKm5leHQ7CisJLyogc3RyaW5nX2xpc3RfdCAqa2V5d29yZHM7ICovCisJc2l6ZV90IHNpemU7IC8qIHplcm8gaW1wbGllcyAibm90IGZldGNoZWQiICovCisJaW50IHVpZDsKKwl1bnNpZ25lZCBjaGFyIGZsYWdzLCBzdGF0dXM7Cit9IG1lc3NhZ2VfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc3RvcmUgeworCXN0b3JlX2NvbmZfdCAqY29uZjsgLyogZm9yZWlnbiAqLworCisJLyogY3VycmVudGx5IG9wZW4gbWFpbGJveCAqLworCWNvbnN0IGNoYXIgKm5hbWU7IC8qIGZvcmVpZ24hIG1heWJlIHByZXNldD8gKi8KKwljaGFyICpwYXRoOyAvKiBvd24gKi8KKwltZXNzYWdlX3QgKm1zZ3M7IC8qIG93biAqLworCWludCB1aWR2YWxpZGl0eTsKKwl1bnNpZ25lZCBjaGFyIG9wdHM7IC8qIG1heWJlIHByZXNldD8gKi8KKwkvKiBub3RlIHRoYXQgdGhlIGZvbGxvd2luZyBkbyBfbm90XyByZWZsZWN0IHN0YXRzIGZyb20gbXNncywgYnV0IG1haWxib3ggdG90YWxzICovCisJaW50IGNvdW50OyAvKiAjIG9mIG1lc3NhZ2VzICovCisJaW50IHJlY2VudDsgLyogIyBvZiByZWNlbnQgbWVzc2FnZXMgLSBkb24ndCB0cnVzdCB0aGlzIGJleW9uZCB0aGUgaW5pdGlhbCByZWFkICovCit9IHN0b3JlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyICpkYXRhOworCWludCBsZW47CisJdW5zaWduZWQgY2hhciBmbGFnczsKKwl1bnNpZ25lZCBpbnQgY3JsZjoxOworfSBtc2dfZGF0YV90OworCisjZGVmaW5lIERSVl9PSyAgICAgICAgICAwCisjZGVmaW5lIERSVl9NU0dfQkFEICAgICAtMQorI2RlZmluZSBEUlZfQk9YX0JBRCAgICAgLTIKKyNkZWZpbmUgRFJWX1NUT1JFX0JBRCAgIC0zCisKK3N0YXRpYyBpbnQgVmVyYm9zZSwgUXVpZXQ7CisKK3N0YXRpYyB2b2lkIGltYXBfaW5mbyggY29uc3QgY2hhciAqLCAuLi4gKTsKK3N0YXRpYyB2b2lkIGltYXBfd2FybiggY29uc3QgY2hhciAqLCAuLi4gKTsKKworc3RhdGljIGNoYXIgKm5leHRfYXJnKCBjaGFyICoqICk7CisKK3N0YXRpYyB2b2lkIGZyZWVfZ2VuZXJpY19tZXNzYWdlcyggbWVzc2FnZV90ICogKTsKKworc3RhdGljIGludCBuZnNucHJpbnRmKCBjaGFyICpidWYsIGludCBibGVuLCBjb25zdCBjaGFyICpmbXQsIC4uLiApOworCitzdGF0aWMgaW50IG5mdmFzcHJpbnRmKGNoYXIgKipzdHJwLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCit7CisJaW50IGxlbjsKKwljaGFyIHRtcFs4MTkyXTsKKworCWxlbiA9IHZzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCBmbXQsIGFwKTsKKwlpZiAobGVuIDwgMCkKKwkJZGllKCJGYXRhbDogT3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKGxlbiA+PSBzaXplb2YodG1wKSkKKwkJZGllKCJpbWFwIGNvbW1hbmQgb3ZlcmZsb3cgIVxuIik7CisJKnN0cnAgPSB4bWVtZHVweih0bXAsIGxlbik7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHZvaWQgYXJjNF9pbml0KCB2b2lkICk7CitzdGF0aWMgdW5zaWduZWQgY2hhciBhcmM0X2dldGJ5dGUoIHZvaWQgKTsKKwordHlwZWRlZiBzdHJ1Y3QgaW1hcF9zZXJ2ZXJfY29uZiB7CisJY2hhciAqbmFtZTsKKwljaGFyICp0dW5uZWw7CisJY2hhciAqaG9zdDsKKwlpbnQgcG9ydDsKKwljaGFyICp1c2VyOworCWNoYXIgKnBhc3M7Cit9IGltYXBfc2VydmVyX2NvbmZfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaW1hcF9zdG9yZV9jb25mIHsKKwlzdG9yZV9jb25mX3QgZ2VuOworCWltYXBfc2VydmVyX2NvbmZfdCAqc2VydmVyOworCXVuc2lnbmVkIHVzZV9uYW1lc3BhY2U6MTsKK30gaW1hcF9zdG9yZV9jb25mX3Q7CisKKyNkZWZpbmUgTklMCSh2b2lkKikweDEKKyNkZWZpbmUgTElTVAkodm9pZCopMHgyCisKK3R5cGVkZWYgc3RydWN0IF9saXN0IHsKKwlzdHJ1Y3QgX2xpc3QgKm5leHQsICpjaGlsZDsKKwljaGFyICp2YWw7CisJaW50IGxlbjsKK30gbGlzdF90OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGZkOworfSBTb2NrZXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCVNvY2tldF90IHNvY2s7CisJaW50IGJ5dGVzOworCWludCBvZmZzZXQ7CisJY2hhciBidWZbMTAyNF07Cit9IGJ1ZmZlcl90OworCitzdHJ1Y3QgaW1hcF9jbWQ7CisKK3R5cGVkZWYgc3RydWN0IGltYXAgeworCWludCB1aWRuZXh0OyAvKiBmcm9tIFNFTEVDVCByZXNwb25zZXMgKi8KKwlsaXN0X3QgKm5zX3BlcnNvbmFsLCAqbnNfb3RoZXIsICpuc19zaGFyZWQ7IC8qIE5BTUVTUEFDRSBpbmZvICovCisJdW5zaWduZWQgY2FwcywgcmNhcHM7IC8qIENBUEFCSUxJVFkgcmVzdWx0cyAqLworCS8qIGNvbW1hbmQgcXVldWUgKi8KKwlpbnQgbmV4dHRhZywgbnVtX2luX3Byb2dyZXNzLCBsaXRlcmFsX3BlbmRpbmc7CisJc3RydWN0IGltYXBfY21kICppbl9wcm9ncmVzcywgKippbl9wcm9ncmVzc19hcHBlbmQ7CisJYnVmZmVyX3QgYnVmOyAvKiB0aGlzIGlzIEJJRywgc28gcHV0IGl0IGxhc3QgKi8KK30gaW1hcF90OworCit0eXBlZGVmIHN0cnVjdCBpbWFwX3N0b3JlIHsKKwlzdG9yZV90IGdlbjsKKwlpbnQgdWlkdmFsaWRpdHk7CisJaW1hcF90ICppbWFwOworCWNvbnN0IGNoYXIgKnByZWZpeDsKKwl1bnNpZ25lZCAvKmN1cnJlbnRuYzoxLCovIHRyYXNobmM6MTsKK30gaW1hcF9zdG9yZV90OworCitzdHJ1Y3QgaW1hcF9jbWRfY2IgeworCWludCAoKmNvbnQpKCBpbWFwX3N0b3JlX3QgKmN0eCwgc3RydWN0IGltYXBfY21kICpjbWQsIGNvbnN0IGNoYXIgKnByb21wdCApOworCXZvaWQgKCpkb25lKSggaW1hcF9zdG9yZV90ICpjdHgsIHN0cnVjdCBpbWFwX2NtZCAqY21kLCBpbnQgcmVzcG9uc2UpOworCXZvaWQgKmN0eDsKKwljaGFyICpkYXRhOworCWludCBkbGVuOworCWludCB1aWQ7CisJdW5zaWduZWQgY3JlYXRlOjEsIHRyeWNyZWF0ZToxOworfTsKKworc3RydWN0IGltYXBfY21kIHsKKwlzdHJ1Y3QgaW1hcF9jbWQgKm5leHQ7CisJc3RydWN0IGltYXBfY21kX2NiIGNiOworCWNoYXIgKmNtZDsKKwlpbnQgdGFnOworfTsKKworI2RlZmluZSBDQVAoY2FwKSAoaW1hcC0+Y2FwcyAmICgxIDw8IChjYXApKSkKKworZW51bSBDQVBBQklMSVRZIHsKKwlOT0xPR0lOID0gMCwKKwlVSURQTFVTLAorCUxJVEVSQUxQTFVTLAorCU5BTUVTUEFDRSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjYXBfbGlzdFtdID0geworCSJMT0dJTkRJU0FCTEVEIiwKKwkiVUlEUExVUyIsCisJIkxJVEVSQUwrIiwKKwkiTkFNRVNQQUNFIiwKK307CisKKyNkZWZpbmUgUkVTUF9PSyAgICAwCisjZGVmaW5lIFJFU1BfTk8gICAgMQorI2RlZmluZSBSRVNQX0JBRCAgIDIKKworc3RhdGljIGludCBnZXRfY21kX3Jlc3VsdCggaW1hcF9zdG9yZV90ICpjdHgsIHN0cnVjdCBpbWFwX2NtZCAqdGNtZCApOworCisKK3N0YXRpYyBjb25zdCBjaGFyICpGbGFnc1tdID0geworCSJEcmFmdCIsCisJIkZsYWdnZWQiLAorCSJBbnN3ZXJlZCIsCisJIlNlZW4iLAorCSJEZWxldGVkIiwKK307CisKK3N0YXRpYyB2b2lkCitzb2NrZXRfcGVycm9yKCBjb25zdCBjaGFyICpmdW5jLCBTb2NrZXRfdCAqc29jaywgaW50IHJldCApCit7CisJaWYgKHJldCA8IDApCisJCXBlcnJvciggZnVuYyApOworCWVsc2UKKwkJZnByaW50Ziggc3RkZXJyLCAiJXM6IHVuZXhwZWN0ZWQgRU9GXG4iLCBmdW5jICk7Cit9CisKK3N0YXRpYyBpbnQKK3NvY2tldF9yZWFkKCBTb2NrZXRfdCAqc29jaywgY2hhciAqYnVmLCBpbnQgbGVuICkKK3sKKwlzc2l6ZV90IG4gPSB4cmVhZCggc29jay0+ZmQsIGJ1ZiwgbGVuICk7CisJaWYgKG4gPD0gMCkgeworCQlzb2NrZXRfcGVycm9yKCAicmVhZCIsIHNvY2ssIG4gKTsKKwkJY2xvc2UoIHNvY2stPmZkICk7CisJCXNvY2stPmZkID0gLTE7CisJfQorCXJldHVybiBuOworfQorCitzdGF0aWMgaW50Citzb2NrZXRfd3JpdGUoIFNvY2tldF90ICpzb2NrLCBjb25zdCBjaGFyICpidWYsIGludCBsZW4gKQoreworCWludCBuID0gd3JpdGVfaW5fZnVsbCggc29jay0+ZmQsIGJ1ZiwgbGVuICk7CisJaWYgKG4gIT0gbGVuKSB7CisJCXNvY2tldF9wZXJyb3IoICJ3cml0ZSIsIHNvY2ssIG4gKTsKKwkJY2xvc2UoIHNvY2stPmZkICk7CisJCXNvY2stPmZkID0gLTE7CisJfQorCXJldHVybiBuOworfQorCisvKiBzaW1wbGUgbGluZSBidWZmZXJpbmcgKi8KK3N0YXRpYyBpbnQKK2J1ZmZlcl9nZXRzKCBidWZmZXJfdCAqIGIsIGNoYXIgKipzICkKK3sKKwlpbnQgbjsKKwlpbnQgc3RhcnQgPSBiLT5vZmZzZXQ7CisKKwkqcyA9IGItPmJ1ZiArIHN0YXJ0OworCisJZm9yICg7OykgeworCQkvKiBtYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggZGF0YSB0byByZWFkIHRoZSBcclxuIHNlcXVlbmNlICovCisJCWlmIChiLT5vZmZzZXQgKyAxID49IGItPmJ5dGVzKSB7CisJCQlpZiAoc3RhcnQpIHsKKwkJCQkvKiBzaGlmdCBkb3duIHVzZWQgYnl0ZXMgKi8KKwkJCQkqcyA9IGItPmJ1ZjsKKworCQkJCWFzc2VydCggc3RhcnQgPD0gYi0+Ynl0ZXMgKTsKKwkJCQluID0gYi0+Ynl0ZXMgLSBzdGFydDsKKworCQkJCWlmIChuKQorCQkJCQltZW1tb3ZlKGItPmJ1ZiwgYi0+YnVmICsgc3RhcnQsIG4pOworCQkJCWItPm9mZnNldCAtPSBzdGFydDsKKwkJCQliLT5ieXRlcyA9IG47CisJCQkJc3RhcnQgPSAwOworCQkJfQorCisJCQluID0gc29ja2V0X3JlYWQoICZiLT5zb2NrLCBiLT5idWYgKyBiLT5ieXRlcywKKwkJCQkJIHNpemVvZihiLT5idWYpIC0gYi0+Ynl0ZXMgKTsKKworCQkJaWYgKG4gPD0gMCkKKwkJCQlyZXR1cm4gLTE7CisKKwkJCWItPmJ5dGVzICs9IG47CisJCX0KKworCQlpZiAoYi0+YnVmW2ItPm9mZnNldF0gPT0gJ1xyJykgeworCQkJYXNzZXJ0KCBiLT5vZmZzZXQgKyAxIDwgYi0+Ynl0ZXMgKTsKKwkJCWlmIChiLT5idWZbYi0+b2Zmc2V0ICsgMV0gPT0gJ1xuJykgeworCQkJCWItPmJ1ZltiLT5vZmZzZXRdID0gMDsgIC8qIHRlcm1pbmF0ZSB0aGUgc3RyaW5nICovCisJCQkJYi0+b2Zmc2V0ICs9IDI7IC8qIG5leHQgbGluZSAqLworCQkJCWlmIChWZXJib3NlKQorCQkJCQlwdXRzKCAqcyApOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisKKwkJYi0+b2Zmc2V0Kys7CisJfQorCS8qIG5vdCByZWFjaGVkICovCit9CisKK3N0YXRpYyB2b2lkCitpbWFwX2luZm8oIGNvbnN0IGNoYXIgKm1zZywgLi4uICkKK3sKKwl2YV9saXN0IHZhOworCisJaWYgKCFRdWlldCkgeworCQl2YV9zdGFydCggdmEsIG1zZyApOworCQl2cHJpbnRmKCBtc2csIHZhICk7CisJCXZhX2VuZCggdmEgKTsKKwkJZmZsdXNoKCBzdGRvdXQgKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitpbWFwX3dhcm4oIGNvbnN0IGNoYXIgKm1zZywgLi4uICkKK3sKKwl2YV9saXN0IHZhOworCisJaWYgKFF1aWV0IDwgMikgeworCQl2YV9zdGFydCggdmEsIG1zZyApOworCQl2ZnByaW50Ziggc3RkZXJyLCBtc2csIHZhICk7CisJCXZhX2VuZCggdmEgKTsKKwl9Cit9CisKK3N0YXRpYyBjaGFyICoKK25leHRfYXJnKCBjaGFyICoqcyApCit7CisJY2hhciAqcmV0OworCisJaWYgKCFzIHx8ICEqcykKKwkJcmV0dXJuIE5VTEw7CisJd2hpbGUgKGlzc3BhY2UoICh1bnNpZ25lZCBjaGFyKSAqKnMgKSkKKwkJKCpzKSsrOworCWlmICghKipzKSB7CisJCSpzID0gTlVMTDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICgqKnMgPT0gJyInKSB7CisJCSsrKnM7CisJCXJldCA9ICpzOworCQkqcyA9IHN0cmNociggKnMsICciJyApOworCX0gZWxzZSB7CisJCXJldCA9ICpzOworCQl3aGlsZSAoKipzICYmICFpc3NwYWNlKCAodW5zaWduZWQgY2hhcikgKipzICkpCisJCQkoKnMpKys7CisJfQorCWlmICgqcykgeworCQlpZiAoKipzKQorCQkJKigqcykrKyA9IDA7CisJCWlmICghKipzKQorCQkJKnMgPSBOVUxMOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZnJlZV9nZW5lcmljX21lc3NhZ2VzKCBtZXNzYWdlX3QgKm1zZ3MgKQoreworCW1lc3NhZ2VfdCAqdG1zZzsKKworCWZvciAoOyBtc2dzOyBtc2dzID0gdG1zZykgeworCQl0bXNnID0gbXNncy0+bmV4dDsKKwkJZnJlZSggbXNncyApOworCX0KK30KKworc3RhdGljIGludAorbmZzbnByaW50ZiggY2hhciAqYnVmLCBpbnQgYmxlbiwgY29uc3QgY2hhciAqZm10LCAuLi4gKQoreworCWludCByZXQ7CisJdmFfbGlzdCB2YTsKKworCXZhX3N0YXJ0KCB2YSwgZm10ICk7CisJaWYgKGJsZW4gPD0gMCB8fCAodW5zaWduZWQpKHJldCA9IHZzbnByaW50ZiggYnVmLCBibGVuLCBmbXQsIHZhICkpID49ICh1bnNpZ25lZClibGVuKQorCQlkaWUoICJGYXRhbDogYnVmZmVyIHRvbyBzbWFsbC4gUGxlYXNlIHJlcG9ydCBhIGJ1Zy5cbiIpOworCXZhX2VuZCggdmEgKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIGksIGosIHNbMjU2XTsKK30gcnM7CisKK3N0YXRpYyB2b2lkCithcmM0X2luaXQoIHZvaWQgKQoreworCWludCBpLCBmZDsKKwl1bnNpZ25lZCBjaGFyIGosIHNpLCBkYXRbMTI4XTsKKworCWlmICgoZmQgPSBvcGVuKCAiL2Rldi91cmFuZG9tIiwgT19SRE9OTFkgKSkgPCAwICYmIChmZCA9IG9wZW4oICIvZGV2L3JhbmRvbSIsIE9fUkRPTkxZICkpIDwgMCkgeworCQlmcHJpbnRmKCBzdGRlcnIsICJGYXRhbDogbm8gcmFuZG9tIG51bWJlciBzb3VyY2UgYXZhaWxhYmxlLlxuIiApOworCQlleGl0KCAzICk7CisJfQorCWlmIChyZWFkX2luX2Z1bGwoIGZkLCBkYXQsIDEyOCApICE9IDEyOCkgeworCQlmcHJpbnRmKCBzdGRlcnIsICJGYXRhbDogY2Fubm90IHJlYWQgcmFuZG9tIG51bWJlciBzb3VyY2UuXG4iICk7CisJCWV4aXQoIDMgKTsKKwl9CisJY2xvc2UoIGZkICk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCXJzLnNbaV0gPSBpOworCWZvciAoaSA9IGogPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJc2kgPSBycy5zW2ldOworCQlqICs9IHNpICsgZGF0W2kgJiAxMjddOworCQlycy5zW2ldID0gcnMuc1tqXTsKKwkJcnMuc1tqXSA9IHNpOworCX0KKwlycy5pID0gcnMuaiA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCWFyYzRfZ2V0Ynl0ZSgpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhcgorYXJjNF9nZXRieXRlKCB2b2lkICkKK3sKKwl1bnNpZ25lZCBjaGFyIHNpLCBzajsKKworCXJzLmkrKzsKKwlzaSA9IHJzLnNbcnMuaV07CisJcnMuaiArPSBzaTsKKwlzaiA9IHJzLnNbcnMual07CisJcnMuc1tycy5pXSA9IHNqOworCXJzLnNbcnMual0gPSBzaTsKKwlyZXR1cm4gcnMuc1soc2kgKyBzaikgJiAweGZmXTsKK30KKworc3RhdGljIHN0cnVjdCBpbWFwX2NtZCAqCit2X2lzc3VlX2ltYXBfY21kKCBpbWFwX3N0b3JlX3QgKmN0eCwgc3RydWN0IGltYXBfY21kX2NiICpjYiwKKwkJICBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXAgKQoreworCWltYXBfdCAqaW1hcCA9IGN0eC0+aW1hcDsKKwlzdHJ1Y3QgaW1hcF9jbWQgKmNtZDsKKwlpbnQgbiwgYnVmbDsKKwljaGFyIGJ1ZlsxMDI0XTsKKworCWNtZCA9IHhtYWxsb2MoIHNpemVvZihzdHJ1Y3QgaW1hcF9jbWQpICk7CisJbmZ2YXNwcmludGYoICZjbWQtPmNtZCwgZm10LCBhcCApOworCWNtZC0+dGFnID0gKytpbWFwLT5uZXh0dGFnOworCisJaWYgKGNiKQorCQljbWQtPmNiID0gKmNiOworCWVsc2UKKwkJbWVtc2V0KCAmY21kLT5jYiwgMCwgc2l6ZW9mKGNtZC0+Y2IpICk7CisKKwl3aGlsZSAoaW1hcC0+bGl0ZXJhbF9wZW5kaW5nKQorCQlnZXRfY21kX3Jlc3VsdCggY3R4LCBOVUxMICk7CisKKwlidWZsID0gbmZzbnByaW50ZiggYnVmLCBzaXplb2YoYnVmKSwgY21kLT5jYi5kYXRhID8gQ0FQKExJVEVSQUxQTFVTKSA/CisJCQkgICAiJWQgJXN7JWQrfVxyXG4iIDogIiVkICVzeyVkfVxyXG4iIDogIiVkICVzXHJcbiIsCisJCQkgICBjbWQtPnRhZywgY21kLT5jbWQsIGNtZC0+Y2IuZGxlbiApOworCWlmIChWZXJib3NlKSB7CisJCWlmIChpbWFwLT5udW1faW5fcHJvZ3Jlc3MpCisJCQlwcmludGYoICIoJWQgaW4gcHJvZ3Jlc3MpICIsIGltYXAtPm51bV9pbl9wcm9ncmVzcyApOworCQlpZiAobWVtY21wKCBjbWQtPmNtZCwgIkxPR0lOIiwgNSApKQorCQkJcHJpbnRmKCAiPj4+ICVzIiwgYnVmICk7CisJCWVsc2UKKwkJCXByaW50ZiggIj4+PiAlZCBMT0dJTiA8dXNlcj4gPHBhc3M+XG4iLCBjbWQtPnRhZyApOworCX0KKwlpZiAoc29ja2V0X3dyaXRlKCAmaW1hcC0+YnVmLnNvY2ssIGJ1ZiwgYnVmbCApICE9IGJ1ZmwpIHsKKwkJZnJlZSggY21kLT5jbWQgKTsKKwkJZnJlZSggY21kICk7CisJCWlmIChjYikKKwkJCWZyZWUoIGNiLT5kYXRhICk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoY21kLT5jYi5kYXRhKSB7CisJCWlmIChDQVAoTElURVJBTFBMVVMpKSB7CisJCQluID0gc29ja2V0X3dyaXRlKCAmaW1hcC0+YnVmLnNvY2ssIGNtZC0+Y2IuZGF0YSwgY21kLT5jYi5kbGVuICk7CisJCQlmcmVlKCBjbWQtPmNiLmRhdGEgKTsKKwkJCWlmIChuICE9IGNtZC0+Y2IuZGxlbiB8fAorCQkJICAgIChuID0gc29ja2V0X3dyaXRlKCAmaW1hcC0+YnVmLnNvY2ssICJcclxuIiwgMiApKSAhPSAyKQorCQkJeworCQkJCWZyZWUoIGNtZC0+Y21kICk7CisJCQkJZnJlZSggY21kICk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQljbWQtPmNiLmRhdGEgPSBOVUxMOworCQl9IGVsc2UKKwkJCWltYXAtPmxpdGVyYWxfcGVuZGluZyA9IDE7CisJfSBlbHNlIGlmIChjbWQtPmNiLmNvbnQpCisJCWltYXAtPmxpdGVyYWxfcGVuZGluZyA9IDE7CisJY21kLT5uZXh0ID0gTlVMTDsKKwkqaW1hcC0+aW5fcHJvZ3Jlc3NfYXBwZW5kID0gY21kOworCWltYXAtPmluX3Byb2dyZXNzX2FwcGVuZCA9ICZjbWQtPm5leHQ7CisJaW1hcC0+bnVtX2luX3Byb2dyZXNzKys7CisJcmV0dXJuIGNtZDsKK30KKworc3RhdGljIHN0cnVjdCBpbWFwX2NtZCAqCitpc3N1ZV9pbWFwX2NtZCggaW1hcF9zdG9yZV90ICpjdHgsIHN0cnVjdCBpbWFwX2NtZF9jYiAqY2IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uICkKK3sKKwlzdHJ1Y3QgaW1hcF9jbWQgKnJldDsKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoIGFwLCBmbXQgKTsKKwlyZXQgPSB2X2lzc3VlX2ltYXBfY21kKCBjdHgsIGNiLCBmbXQsIGFwICk7CisJdmFfZW5kKCBhcCApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2ltYXBfZXhlYyggaW1hcF9zdG9yZV90ICpjdHgsIHN0cnVjdCBpbWFwX2NtZF9jYiAqY2IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uICkKK3sKKwl2YV9saXN0IGFwOworCXN0cnVjdCBpbWFwX2NtZCAqY21kcDsKKworCXZhX3N0YXJ0KCBhcCwgZm10ICk7CisJY21kcCA9IHZfaXNzdWVfaW1hcF9jbWQoIGN0eCwgY2IsIGZtdCwgYXAgKTsKKwl2YV9lbmQoIGFwICk7CisJaWYgKCFjbWRwKQorCQlyZXR1cm4gUkVTUF9CQUQ7CisKKwlyZXR1cm4gZ2V0X2NtZF9yZXN1bHQoIGN0eCwgY21kcCApOworfQorCitzdGF0aWMgaW50CitpbWFwX2V4ZWNfbSggaW1hcF9zdG9yZV90ICpjdHgsIHN0cnVjdCBpbWFwX2NtZF9jYiAqY2IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uICkKK3sKKwl2YV9saXN0IGFwOworCXN0cnVjdCBpbWFwX2NtZCAqY21kcDsKKworCXZhX3N0YXJ0KCBhcCwgZm10ICk7CisJY21kcCA9IHZfaXNzdWVfaW1hcF9jbWQoIGN0eCwgY2IsIGZtdCwgYXAgKTsKKwl2YV9lbmQoIGFwICk7CisJaWYgKCFjbWRwKQorCQlyZXR1cm4gRFJWX1NUT1JFX0JBRDsKKworCXN3aXRjaCAoZ2V0X2NtZF9yZXN1bHQoIGN0eCwgY21kcCApKSB7CisJY2FzZSBSRVNQX0JBRDogcmV0dXJuIERSVl9TVE9SRV9CQUQ7CisJY2FzZSBSRVNQX05POiByZXR1cm4gRFJWX01TR19CQUQ7CisJZGVmYXVsdDogcmV0dXJuIERSVl9PSzsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2lzX2F0b20oIGxpc3RfdCAqbGlzdCApCit7CisJcmV0dXJuIGxpc3QgJiYgbGlzdC0+dmFsICYmIGxpc3QtPnZhbCAhPSBOSUwgJiYgbGlzdC0+dmFsICE9IExJU1Q7Cit9CisKK3N0YXRpYyBpbnQKK2lzX2xpc3QoIGxpc3RfdCAqbGlzdCApCit7CisJcmV0dXJuIGxpc3QgJiYgbGlzdC0+dmFsID09IExJU1Q7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX2xpc3QoIGxpc3RfdCAqbGlzdCApCit7CisJbGlzdF90ICp0bXA7CisKKwlmb3IgKDsgbGlzdDsgbGlzdCA9IHRtcCkgeworCQl0bXAgPSBsaXN0LT5uZXh0OworCQlpZiAoaXNfbGlzdCggbGlzdCApKQorCQkJZnJlZV9saXN0KCBsaXN0LT5jaGlsZCApOworCQllbHNlIGlmIChpc19hdG9tKCBsaXN0ICkpCisJCQlmcmVlKCBsaXN0LT52YWwgKTsKKwkJZnJlZSggbGlzdCApOworCX0KK30KKworc3RhdGljIGludAorcGFyc2VfaW1hcF9saXN0X2woIGltYXBfdCAqaW1hcCwgY2hhciAqKnNwLCBsaXN0X3QgKipjdXJwLCBpbnQgbGV2ZWwgKQoreworCWxpc3RfdCAqY3VyOworCWNoYXIgKnMgPSAqc3AsICpwOworCWludCBuLCBieXRlczsKKworCWZvciAoOzspIHsKKwkJd2hpbGUgKGlzc3BhY2UoICh1bnNpZ25lZCBjaGFyKSpzICkpCisJCQlzKys7CisJCWlmIChsZXZlbCAmJiAqcyA9PSAnKScpIHsKKwkJCXMrKzsKKwkJCWJyZWFrOworCQl9CisJCSpjdXJwID0gY3VyID0geG1hbGxvYyggc2l6ZW9mKCpjdXIpICk7CisJCWN1cnAgPSAmY3VyLT5uZXh0OworCQljdXItPnZhbCA9IE5VTEw7IC8qIGZvciBjbGVhbiBiYWlsICovCisJCWlmICgqcyA9PSAnKCcpIHsKKwkJCS8qIHN1Ymxpc3QgKi8KKwkJCXMrKzsKKwkJCWN1ci0+dmFsID0gTElTVDsKKwkJCWlmIChwYXJzZV9pbWFwX2xpc3RfbCggaW1hcCwgJnMsICZjdXItPmNoaWxkLCBsZXZlbCArIDEgKSkKKwkJCQlnb3RvIGJhaWw7CisJCX0gZWxzZSBpZiAoaW1hcCAmJiAqcyA9PSAneycpIHsKKwkJCS8qIGxpdGVyYWwgKi8KKwkJCWJ5dGVzID0gY3VyLT5sZW4gPSBzdHJ0b2woIHMgKyAxLCAmcywgMTAgKTsKKwkJCWlmICgqcyAhPSAnfScpCisJCQkJZ290byBiYWlsOworCisJCQlzID0gY3VyLT52YWwgPSB4bWFsbG9jKCBjdXItPmxlbiApOworCisJCQkvKiBkdW1wIHdoYXRzIGxlZnQgb3ZlciBpbiB0aGUgaW5wdXQgYnVmZmVyICovCisJCQluID0gaW1hcC0+YnVmLmJ5dGVzIC0gaW1hcC0+YnVmLm9mZnNldDsKKworCQkJaWYgKG4gPiBieXRlcykKKwkJCQkvKiB0aGUgZW50aXJlIG1lc3NhZ2UgZml0IGluIHRoZSBidWZmZXIgKi8KKwkJCQluID0gYnl0ZXM7CisKKwkJCW1lbWNweSggcywgaW1hcC0+YnVmLmJ1ZiArIGltYXAtPmJ1Zi5vZmZzZXQsIG4gKTsKKwkJCXMgKz0gbjsKKwkJCWJ5dGVzIC09IG47CisKKwkJCS8qIG1hcmsgdGhhdCB3ZSB1c2VkIHBhcnQgb2YgdGhlIGJ1ZmZlciAqLworCQkJaW1hcC0+YnVmLm9mZnNldCArPSBuOworCisJCQkvKiBub3cgcmVhZCB0aGUgcmVzdCBvZiB0aGUgbWVzc2FnZSAqLworCQkJd2hpbGUgKGJ5dGVzID4gMCkgeworCQkJCWlmICgobiA9IHNvY2tldF9yZWFkICgmaW1hcC0+YnVmLnNvY2ssIHMsIGJ5dGVzKSkgPD0gMCkKKwkJCQkJZ290byBiYWlsOworCQkJCXMgKz0gbjsKKwkJCQlieXRlcyAtPSBuOworCQkJfQorCisJCQlpZiAoYnVmZmVyX2dldHMoICZpbWFwLT5idWYsICZzICkpCisJCQkJZ290byBiYWlsOworCQl9IGVsc2UgaWYgKCpzID09ICciJykgeworCQkJLyogcXVvdGVkIHN0cmluZyAqLworCQkJcysrOworCQkJcCA9IHM7CisJCQlmb3IgKDsgKnMgIT0gJyInOyBzKyspCisJCQkJaWYgKCEqcykKKwkJCQkJZ290byBiYWlsOworCQkJY3VyLT5sZW4gPSBzIC0gcDsKKwkJCXMrKzsKKwkJCWN1ci0+dmFsID0geG1lbWR1cHoocCwgY3VyLT5sZW4pOworCQl9IGVsc2UgeworCQkJLyogYXRvbSAqLworCQkJcCA9IHM7CisJCQlmb3IgKDsgKnMgJiYgIWlzc3BhY2UoICh1bnNpZ25lZCBjaGFyKSpzICk7IHMrKykKKwkJCQlpZiAobGV2ZWwgJiYgKnMgPT0gJyknKQorCQkJCQlicmVhazsKKwkJCWN1ci0+bGVuID0gcyAtIHA7CisJCQlpZiAoY3VyLT5sZW4gPT0gMyAmJiAhbWVtY21wICgiTklMIiwgcCwgMykpIHsKKwkJCQljdXItPnZhbCA9IE5JTDsKKwkJCX0gZWxzZSB7CisJCQkJY3VyLT52YWwgPSB4bWVtZHVweihwLCBjdXItPmxlbik7CisJCQl9CisJCX0KKworCQlpZiAoIWxldmVsKQorCQkJYnJlYWs7CisJCWlmICghKnMpCisJCQlnb3RvIGJhaWw7CisJfQorCSpzcCA9IHM7CisJKmN1cnAgPSBOVUxMOworCXJldHVybiAwOworCisgIGJhaWw6CisJKmN1cnAgPSBOVUxMOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGxpc3RfdCAqCitwYXJzZV9pbWFwX2xpc3QoIGltYXBfdCAqaW1hcCwgY2hhciAqKnNwICkKK3sKKwlsaXN0X3QgKmhlYWQ7CisKKwlpZiAoIXBhcnNlX2ltYXBfbGlzdF9sKCBpbWFwLCBzcCwgJmhlYWQsIDAgKSkKKwkJcmV0dXJuIGhlYWQ7CisJZnJlZV9saXN0KCBoZWFkICk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBsaXN0X3QgKgorcGFyc2VfbGlzdCggY2hhciAqKnNwICkKK3sKKwlyZXR1cm4gcGFyc2VfaW1hcF9saXN0KCBOVUxMLCBzcCApOworfQorCitzdGF0aWMgdm9pZAorcGFyc2VfY2FwYWJpbGl0eSggaW1hcF90ICppbWFwLCBjaGFyICpjbWQgKQoreworCWNoYXIgKmFyZzsKKwl1bnNpZ25lZCBpOworCisJaW1hcC0+Y2FwcyA9IDB4ODAwMDAwMDA7CisJd2hpbGUgKChhcmcgPSBuZXh0X2FyZyggJmNtZCApKSkKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2FwX2xpc3QpOyBpKyspCisJCQlpZiAoIXN0cmNtcCggY2FwX2xpc3RbaV0sIGFyZyApKQorCQkJCWltYXAtPmNhcHMgfD0gMSA8PCBpOworCWltYXAtPnJjYXBzID0gaW1hcC0+Y2FwczsKK30KKworc3RhdGljIGludAorcGFyc2VfcmVzcG9uc2VfY29kZSggaW1hcF9zdG9yZV90ICpjdHgsIHN0cnVjdCBpbWFwX2NtZF9jYiAqY2IsIGNoYXIgKnMgKQoreworCWltYXBfdCAqaW1hcCA9IGN0eC0+aW1hcDsKKwljaGFyICphcmcsICpwOworCisJaWYgKCpzICE9ICdbJykKKwkJcmV0dXJuIFJFU1BfT0s7CQkvKiBubyByZXNwb25zZSBjb2RlICovCisJcysrOworCWlmICghKHAgPSBzdHJjaHIoIHMsICddJyApKSkgeworCQlmcHJpbnRmKCBzdGRlcnIsICJJTUFQIGVycm9yOiBtYWxmb3JtZWQgcmVzcG9uc2UgY29kZVxuIiApOworCQlyZXR1cm4gUkVTUF9CQUQ7CisJfQorCSpwKysgPSAwOworCWFyZyA9IG5leHRfYXJnKCAmcyApOworCWlmICghc3RyY21wKCAiVUlEVkFMSURJVFkiLCBhcmcgKSkgeworCQlpZiAoIShhcmcgPSBuZXh0X2FyZyggJnMgKSkgfHwgIShjdHgtPmdlbi51aWR2YWxpZGl0eSA9IGF0b2koIGFyZyApKSkgeworCQkJZnByaW50Ziggc3RkZXJyLCAiSU1BUCBlcnJvcjogbWFsZm9ybWVkIFVJRFZBTElESVRZIHN0YXR1c1xuIiApOworCQkJcmV0dXJuIFJFU1BfQkFEOworCQl9CisJfSBlbHNlIGlmICghc3RyY21wKCAiVUlETkVYVCIsIGFyZyApKSB7CisJCWlmICghKGFyZyA9IG5leHRfYXJnKCAmcyApKSB8fCAhKGltYXAtPnVpZG5leHQgPSBhdG9pKCBhcmcgKSkpIHsKKwkJCWZwcmludGYoIHN0ZGVyciwgIklNQVAgZXJyb3I6IG1hbGZvcm1lZCBORVhUVUlEIHN0YXR1c1xuIiApOworCQkJcmV0dXJuIFJFU1BfQkFEOworCQl9CisJfSBlbHNlIGlmICghc3RyY21wKCAiQ0FQQUJJTElUWSIsIGFyZyApKSB7CisJCXBhcnNlX2NhcGFiaWxpdHkoIGltYXAsIHMgKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoICJBTEVSVCIsIGFyZyApKSB7CisJCS8qIFJGQzIwNjAgc2F5cyB0aGF0IHRoZXNlIG1lc3NhZ2VzIE1VU1QgYmUgZGlzcGxheWVkCisJCSAqIHRvIHRoZSB1c2VyCisJCSAqLworCQlmb3IgKDsgaXNzcGFjZSggKHVuc2lnbmVkIGNoYXIpKnAgKTsgcCsrKTsKKwkJZnByaW50Ziggc3RkZXJyLCAiKioqIElNQVAgQUxFUlQgKioqICVzXG4iLCBwICk7CisJfSBlbHNlIGlmIChjYiAmJiBjYi0+Y3R4ICYmICFzdHJjbXAoICJBUFBFTkRVSUQiLCBhcmcgKSkgeworCQlpZiAoIShhcmcgPSBuZXh0X2FyZyggJnMgKSkgfHwgIShjdHgtPmdlbi51aWR2YWxpZGl0eSA9IGF0b2koIGFyZyApKSB8fAorCQkgICAgIShhcmcgPSBuZXh0X2FyZyggJnMgKSkgfHwgISgqKGludCAqKWNiLT5jdHggPSBhdG9pKCBhcmcgKSkpCisJCXsKKwkJCWZwcmludGYoIHN0ZGVyciwgIklNQVAgZXJyb3I6IG1hbGZvcm1lZCBBUFBFTkRVSUQgc3RhdHVzXG4iICk7CisJCQlyZXR1cm4gUkVTUF9CQUQ7CisJCX0KKwl9CisJcmV0dXJuIFJFU1BfT0s7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9jbWRfcmVzdWx0KCBpbWFwX3N0b3JlX3QgKmN0eCwgc3RydWN0IGltYXBfY21kICp0Y21kICkKK3sKKwlpbWFwX3QgKmltYXAgPSBjdHgtPmltYXA7CisJc3RydWN0IGltYXBfY21kICpjbWRwLCAqKnBjbWRwLCAqbmNtZHA7CisJY2hhciAqY21kLCAqYXJnLCAqYXJnMSwgKnA7CisJaW50IG4sIHJlc3AsIHJlc3AyLCB0YWc7CisKKwlmb3IgKDs7KSB7CisJCWlmIChidWZmZXJfZ2V0cyggJmltYXAtPmJ1ZiwgJmNtZCApKQorCQkJcmV0dXJuIFJFU1BfQkFEOworCisJCWFyZyA9IG5leHRfYXJnKCAmY21kICk7CisJCWlmICgqYXJnID09ICcqJykgeworCQkJYXJnID0gbmV4dF9hcmcoICZjbWQgKTsKKwkJCWlmICghYXJnKSB7CisJCQkJZnByaW50Ziggc3RkZXJyLCAiSU1BUCBlcnJvcjogdW5hYmxlIHRvIHBhcnNlIHVudGFnZ2VkIHJlc3BvbnNlXG4iICk7CisJCQkJcmV0dXJuIFJFU1BfQkFEOworCQkJfQorCisJCQlpZiAoIXN0cmNtcCggIk5BTUVTUEFDRSIsIGFyZyApKSB7CisJCQkJaW1hcC0+bnNfcGVyc29uYWwgPSBwYXJzZV9saXN0KCAmY21kICk7CisJCQkJaW1hcC0+bnNfb3RoZXIgPSBwYXJzZV9saXN0KCAmY21kICk7CisJCQkJaW1hcC0+bnNfc2hhcmVkID0gcGFyc2VfbGlzdCggJmNtZCApOworCQkJfSBlbHNlIGlmICghc3RyY21wKCAiT0siLCBhcmcgKSB8fCAhc3RyY21wKCAiQkFEIiwgYXJnICkgfHwKKwkJCQkgICAhc3RyY21wKCAiTk8iLCBhcmcgKSB8fCAhc3RyY21wKCAiQllFIiwgYXJnICkpIHsKKwkJCQlpZiAoKHJlc3AgPSBwYXJzZV9yZXNwb25zZV9jb2RlKCBjdHgsIE5VTEwsIGNtZCApKSAhPSBSRVNQX09LKQorCQkJCQlyZXR1cm4gcmVzcDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcCggIkNBUEFCSUxJVFkiLCBhcmcgKSkKKwkJCQlwYXJzZV9jYXBhYmlsaXR5KCBpbWFwLCBjbWQgKTsKKwkJCWVsc2UgaWYgKChhcmcxID0gbmV4dF9hcmcoICZjbWQgKSkpIHsKKwkJCQlpZiAoIXN0cmNtcCggIkVYSVNUUyIsIGFyZzEgKSkKKwkJCQkJY3R4LT5nZW4uY291bnQgPSBhdG9pKCBhcmcgKTsKKwkJCQllbHNlIGlmICghc3RyY21wKCAiUkVDRU5UIiwgYXJnMSApKQorCQkJCQljdHgtPmdlbi5yZWNlbnQgPSBhdG9pKCBhcmcgKTsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50Ziggc3RkZXJyLCAiSU1BUCBlcnJvcjogdW5hYmxlIHRvIHBhcnNlIHVudGFnZ2VkIHJlc3BvbnNlXG4iICk7CisJCQkJcmV0dXJuIFJFU1BfQkFEOworCQkJfQorCQl9IGVsc2UgaWYgKCFpbWFwLT5pbl9wcm9ncmVzcykgeworCQkJZnByaW50Ziggc3RkZXJyLCAiSU1BUCBlcnJvcjogdW5leHBlY3RlZCByZXBseTogJXMgJXNcbiIsIGFyZywgY21kID8gY21kIDogIiIgKTsKKwkJCXJldHVybiBSRVNQX0JBRDsKKwkJfSBlbHNlIGlmICgqYXJnID09ICcrJykgeworCQkJLyogVGhpcyBjYW4gaGFwcGVuIG9ubHkgd2l0aCB0aGUgbGFzdCBjb21tYW5kIHVuZGVyd2F5LCBhcworCQkJICAgaXQgZW5mb3JjZXMgYSByb3VuZC10cmlwLiAqLworCQkJY21kcCA9IChzdHJ1Y3QgaW1hcF9jbWQgKikoKGNoYXIgKilpbWFwLT5pbl9wcm9ncmVzc19hcHBlbmQgLQorCQkJICAgICAgIG9mZnNldG9mKHN0cnVjdCBpbWFwX2NtZCwgbmV4dCkpOworCQkJaWYgKGNtZHAtPmNiLmRhdGEpIHsKKwkJCQluID0gc29ja2V0X3dyaXRlKCAmaW1hcC0+YnVmLnNvY2ssIGNtZHAtPmNiLmRhdGEsIGNtZHAtPmNiLmRsZW4gKTsKKwkJCQlmcmVlKCBjbWRwLT5jYi5kYXRhICk7CisJCQkJY21kcC0+Y2IuZGF0YSA9IE5VTEw7CisJCQkJaWYgKG4gIT0gKGludCljbWRwLT5jYi5kbGVuKQorCQkJCQlyZXR1cm4gUkVTUF9CQUQ7CisJCQl9IGVsc2UgaWYgKGNtZHAtPmNiLmNvbnQpIHsKKwkJCQlpZiAoY21kcC0+Y2IuY29udCggY3R4LCBjbWRwLCBjbWQgKSkKKwkJCQkJcmV0dXJuIFJFU1BfQkFEOworCQkJfSBlbHNlIHsKKwkJCQlmcHJpbnRmKCBzdGRlcnIsICJJTUFQIGVycm9yOiB1bmV4cGVjdGVkIGNvbW1hbmQgY29udGludWF0aW9uIHJlcXVlc3RcbiIgKTsKKwkJCQlyZXR1cm4gUkVTUF9CQUQ7CisJCQl9CisJCQlpZiAoc29ja2V0X3dyaXRlKCAmaW1hcC0+YnVmLnNvY2ssICJcclxuIiwgMiApICE9IDIpCisJCQkJcmV0dXJuIFJFU1BfQkFEOworCQkJaWYgKCFjbWRwLT5jYi5jb250KQorCQkJCWltYXAtPmxpdGVyYWxfcGVuZGluZyA9IDA7CisJCQlpZiAoIXRjbWQpCisJCQkJcmV0dXJuIERSVl9PSzsKKwkJfSBlbHNlIHsKKwkJCXRhZyA9IGF0b2koIGFyZyApOworCQkJZm9yIChwY21kcCA9ICZpbWFwLT5pbl9wcm9ncmVzczsgKGNtZHAgPSAqcGNtZHApOyBwY21kcCA9ICZjbWRwLT5uZXh0KQorCQkJCWlmIChjbWRwLT50YWcgPT0gdGFnKQorCQkJCQlnb3RvIGdvdHRhZzsKKwkJCWZwcmludGYoIHN0ZGVyciwgIklNQVAgZXJyb3I6IHVuZXhwZWN0ZWQgdGFnICVzXG4iLCBhcmcgKTsKKwkJCXJldHVybiBSRVNQX0JBRDsKKwkJICBnb3R0YWc6CisJCQlpZiAoISgqcGNtZHAgPSBjbWRwLT5uZXh0KSkKKwkJCQlpbWFwLT5pbl9wcm9ncmVzc19hcHBlbmQgPSBwY21kcDsKKwkJCWltYXAtPm51bV9pbl9wcm9ncmVzcy0tOworCQkJaWYgKGNtZHAtPmNiLmNvbnQgfHwgY21kcC0+Y2IuZGF0YSkKKwkJCQlpbWFwLT5saXRlcmFsX3BlbmRpbmcgPSAwOworCQkJYXJnID0gbmV4dF9hcmcoICZjbWQgKTsKKwkJCWlmICghc3RyY21wKCAiT0siLCBhcmcgKSkKKwkJCQlyZXNwID0gRFJWX09LOworCQkJZWxzZSB7CisJCQkJaWYgKCFzdHJjbXAoICJOTyIsIGFyZyApKSB7CisJCQkJCWlmIChjbWRwLT5jYi5jcmVhdGUgJiYgY21kICYmIChjbWRwLT5jYi50cnljcmVhdGUgfHwgIW1lbWNtcCggY21kLCAiW1RSWUNSRUFURV0iLCAxMSApKSkgeyAvKiBTRUxFQ1QsIEFQUEVORCBvciBVSUQgQ09QWSAqLworCQkJCQkJcCA9IHN0cmNociggY21kcC0+Y21kLCAnIicgKTsKKwkJCQkJCWlmICghaXNzdWVfaW1hcF9jbWQoIGN0eCwgTlVMTCwgIkNSRUFURSBcIiUuKnNcIiIsIHN0cmNociggcCArIDEsICciJyApIC0gcCArIDEsIHAgKSkgeworCQkJCQkJCXJlc3AgPSBSRVNQX0JBRDsKKwkJCQkJCQlnb3RvIG5vcm1hbDsKKwkJCQkJCX0KKwkJCQkJCS8qIG5vdCB3YWl0aW5nIGhlcmUgdmlvbGF0ZXMgdGhlIHNwZWMsIGJ1dCBhIHNlcnZlciB0aGF0IGRvZXMgbm90CisJCQkJCQkgICBncm9rIHRoaXMgbm9uZXRoZWxlc3MgdmlvbGF0ZXMgaXQgdG9vLiAqLworCQkJCQkJY21kcC0+Y2IuY3JlYXRlID0gMDsKKwkJCQkJCWlmICghKG5jbWRwID0gaXNzdWVfaW1hcF9jbWQoIGN0eCwgJmNtZHAtPmNiLCAiJXMiLCBjbWRwLT5jbWQgKSkpIHsKKwkJCQkJCQlyZXNwID0gUkVTUF9CQUQ7CisJCQkJCQkJZ290byBub3JtYWw7CisJCQkJCQl9CisJCQkJCQlmcmVlKCBjbWRwLT5jbWQgKTsKKwkJCQkJCWZyZWUoIGNtZHAgKTsKKwkJCQkJCWlmICghdGNtZCkKKwkJCQkJCQlyZXR1cm4gMDsJLyogaWdub3JlZCAqLworCQkJCQkJaWYgKGNtZHAgPT0gdGNtZCkKKwkJCQkJCQl0Y21kID0gbmNtZHA7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlyZXNwID0gUkVTUF9OTzsKKwkJCQl9IGVsc2UgLyppZiAoIXN0cmNtcCggIkJBRCIsIGFyZyApKSovCisJCQkJCXJlc3AgPSBSRVNQX0JBRDsKKwkJCQlmcHJpbnRmKCBzdGRlcnIsICJJTUFQIGNvbW1hbmQgJyVzJyByZXR1cm5lZCByZXNwb25zZSAoJXMpIC0gJXNcbiIsCisJCQkJCSBtZW1jbXAgKGNtZHAtPmNtZCwgIkxPR0lOIiwgNSkgPworCQkJCQkJCWNtZHAtPmNtZCA6ICJMT0dJTiA8dXNlcj4gPHBhc3M+IiwKKwkJCQkJCQlhcmcsIGNtZCA/IGNtZCA6ICIiKTsKKwkJCX0KKwkJCWlmICgocmVzcDIgPSBwYXJzZV9yZXNwb25zZV9jb2RlKCBjdHgsICZjbWRwLT5jYiwgY21kICkpID4gcmVzcCkKKwkJCQlyZXNwID0gcmVzcDI7CisJCSAgbm9ybWFsOgorCQkJaWYgKGNtZHAtPmNiLmRvbmUpCisJCQkJY21kcC0+Y2IuZG9uZSggY3R4LCBjbWRwLCByZXNwICk7CisJCQlmcmVlKCBjbWRwLT5jYi5kYXRhICk7CisJCQlmcmVlKCBjbWRwLT5jbWQgKTsKKwkJCWZyZWUoIGNtZHAgKTsKKwkJCWlmICghdGNtZCB8fCB0Y21kID09IGNtZHApCisJCQkJcmV0dXJuIHJlc3A7CisJCX0KKwl9CisJLyogbm90IHJlYWNoZWQgKi8KK30KKworc3RhdGljIHZvaWQKK2ltYXBfY2xvc2Vfc2VydmVyKCBpbWFwX3N0b3JlX3QgKmljdHggKQoreworCWltYXBfdCAqaW1hcCA9IGljdHgtPmltYXA7CisKKwlpZiAoaW1hcC0+YnVmLnNvY2suZmQgIT0gLTEpIHsKKwkJaW1hcF9leGVjKCBpY3R4LCBOVUxMLCAiTE9HT1VUIiApOworCQljbG9zZSggaW1hcC0+YnVmLnNvY2suZmQgKTsKKwl9CisJZnJlZV9saXN0KCBpbWFwLT5uc19wZXJzb25hbCApOworCWZyZWVfbGlzdCggaW1hcC0+bnNfb3RoZXIgKTsKKwlmcmVlX2xpc3QoIGltYXAtPm5zX3NoYXJlZCApOworCWZyZWUoIGltYXAgKTsKK30KKworc3RhdGljIHZvaWQKK2ltYXBfY2xvc2Vfc3RvcmUoIHN0b3JlX3QgKmN0eCApCit7CisJaW1hcF9jbG9zZV9zZXJ2ZXIoIChpbWFwX3N0b3JlX3QgKiljdHggKTsKKwlmcmVlX2dlbmVyaWNfbWVzc2FnZXMoIGN0eC0+bXNncyApOworCWZyZWUoIGN0eCApOworfQorCitzdGF0aWMgc3RvcmVfdCAqCitpbWFwX29wZW5fc3RvcmUoIGltYXBfc2VydmVyX2NvbmZfdCAqc3J2YyApCit7CisJaW1hcF9zdG9yZV90ICpjdHg7CisJaW1hcF90ICppbWFwOworCWNoYXIgKmFyZywgKnJzcDsKKwlzdHJ1Y3QgaG9zdGVudCAqaGU7CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJaW50IHMsIGFbMl0sIHByZWF1dGg7CisJcGlkX3QgcGlkOworCisJY3R4ID0geGNhbGxvYyggc2l6ZW9mKCpjdHgpLCAxICk7CisKKwljdHgtPmltYXAgPSBpbWFwID0geGNhbGxvYyggc2l6ZW9mKCppbWFwKSwgMSApOworCWltYXAtPmJ1Zi5zb2NrLmZkID0gLTE7CisJaW1hcC0+aW5fcHJvZ3Jlc3NfYXBwZW5kID0gJmltYXAtPmluX3Byb2dyZXNzOworCisJLyogb3BlbiBjb25uZWN0aW9uIHRvIElNQVAgc2VydmVyICovCisKKwlpZiAoc3J2Yy0+dHVubmVsKSB7CisJCWltYXBfaW5mbyggIlN0YXJ0aW5nIHR1bm5lbCAnJXMnLi4uICIsIHNydmMtPnR1bm5lbCApOworCisJCWlmIChzb2NrZXRwYWlyKCBQRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgYSApKSB7CisJCQlwZXJyb3IoICJzb2NrZXRwYWlyIiApOworCQkJZXhpdCggMSApOworCQl9CisKKwkJcGlkID0gZm9yaygpOworCQlpZiAocGlkIDwgMCkKKwkJCV9leGl0KCAxMjcgKTsKKwkJaWYgKCFwaWQpIHsKKwkJCWlmIChkdXAyKCBhWzBdLCAwICkgPT0gLTEgfHwgZHVwMiggYVswXSwgMSApID09IC0xKQorCQkJCV9leGl0KCAxMjcgKTsKKwkJCWNsb3NlKCBhWzBdICk7CisJCQljbG9zZSggYVsxXSApOworCQkJZXhlY2woICIvYmluL3NoIiwgInNoIiwgIi1jIiwgc3J2Yy0+dHVubmVsLCBOVUxMICk7CisJCQlfZXhpdCggMTI3ICk7CisJCX0KKworCQljbG9zZSAoYVswXSk7CisKKwkJaW1hcC0+YnVmLnNvY2suZmQgPSBhWzFdOworCisJCWltYXBfaW5mbyggIm9rXG4iICk7CisJfSBlbHNlIHsKKwkJbWVtc2V0KCAmYWRkciwgMCwgc2l6ZW9mKGFkZHIpICk7CisJCWFkZHIuc2luX3BvcnQgPSBodG9ucyggc3J2Yy0+cG9ydCApOworCQlhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCisJCWltYXBfaW5mbyggIlJlc29sdmluZyAlcy4uLiAiLCBzcnZjLT5ob3N0ICk7CisJCWhlID0gZ2V0aG9zdGJ5bmFtZSggc3J2Yy0+aG9zdCApOworCQlpZiAoIWhlKSB7CisJCQlwZXJyb3IoICJnZXRob3N0YnluYW1lIiApOworCQkJZ290byBiYWlsOworCQl9CisJCWltYXBfaW5mbyggIm9rXG4iICk7CisKKwkJYWRkci5zaW5fYWRkci5zX2FkZHIgPSAqKChpbnQgKikgaGUtPmhfYWRkcl9saXN0WzBdKTsKKworCQlzID0gc29ja2V0KCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgMCApOworCisJCWltYXBfaW5mbyggIkNvbm5lY3RpbmcgdG8gJXM6JWh1Li4uICIsIGluZXRfbnRvYSggYWRkci5zaW5fYWRkciApLCBudG9ocyggYWRkci5zaW5fcG9ydCApICk7CisJCWlmIChjb25uZWN0KCBzLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSApKSB7CisJCQljbG9zZSggcyApOworCQkJcGVycm9yKCAiY29ubmVjdCIgKTsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCQlpbWFwX2luZm8oICJva1xuIiApOworCisJCWltYXAtPmJ1Zi5zb2NrLmZkID0gczsKKworCX0KKworCS8qIHJlYWQgdGhlIGdyZWV0aW5nIHN0cmluZyAqLworCWlmIChidWZmZXJfZ2V0cyggJmltYXAtPmJ1ZiwgJnJzcCApKSB7CisJCWZwcmludGYoIHN0ZGVyciwgIklNQVAgZXJyb3I6IG5vIGdyZWV0aW5nIHJlc3BvbnNlXG4iICk7CisJCWdvdG8gYmFpbDsKKwl9CisJYXJnID0gbmV4dF9hcmcoICZyc3AgKTsKKwlpZiAoIWFyZyB8fCAqYXJnICE9ICcqJyB8fCAoYXJnID0gbmV4dF9hcmcoICZyc3AgKSkgPT0gTlVMTCkgeworCQlmcHJpbnRmKCBzdGRlcnIsICJJTUFQIGVycm9yOiBpbnZhbGlkIGdyZWV0aW5nIHJlc3BvbnNlXG4iICk7CisJCWdvdG8gYmFpbDsKKwl9CisJcHJlYXV0aCA9IDA7CisJaWYgKCFzdHJjbXAoICJQUkVBVVRIIiwgYXJnICkpCisJCXByZWF1dGggPSAxOworCWVsc2UgaWYgKHN0cmNtcCggIk9LIiwgYXJnICkgIT0gMCkgeworCQlmcHJpbnRmKCBzdGRlcnIsICJJTUFQIGVycm9yOiB1bmtub3duIGdyZWV0aW5nIHJlc3BvbnNlXG4iICk7CisJCWdvdG8gYmFpbDsKKwl9CisJcGFyc2VfcmVzcG9uc2VfY29kZSggY3R4LCBOVUxMLCByc3AgKTsKKwlpZiAoIWltYXAtPmNhcHMgJiYgaW1hcF9leGVjKCBjdHgsIE5VTEwsICJDQVBBQklMSVRZIiApICE9IFJFU1BfT0spCisJCWdvdG8gYmFpbDsKKworCWlmICghcHJlYXV0aCkgeworCisJCWltYXBfaW5mbyAoIkxvZ2dpbmcgaW4uLi5cbiIpOworCQlpZiAoIXNydmMtPnVzZXIpIHsKKwkJCWZwcmludGYoIHN0ZGVyciwgIlNraXBwaW5nIHNlcnZlciAlcywgbm8gdXNlclxuIiwgc3J2Yy0+aG9zdCApOworCQkJZ290byBiYWlsOworCQl9CisJCWlmICghc3J2Yy0+cGFzcykgeworCQkJY2hhciBwcm9tcHRbODBdOworCQkJc3ByaW50ZiggcHJvbXB0LCAiUGFzc3dvcmQgKCVzQCVzKTogIiwgc3J2Yy0+dXNlciwgc3J2Yy0+aG9zdCApOworCQkJYXJnID0gZ2V0cGFzcyggcHJvbXB0ICk7CisJCQlpZiAoIWFyZykgeworCQkJCXBlcnJvciggImdldHBhc3MiICk7CisJCQkJZXhpdCggMSApOworCQkJfQorCQkJaWYgKCEqYXJnKSB7CisJCQkJZnByaW50Ziggc3RkZXJyLCAiU2tpcHBpbmcgYWNjb3VudCAlc0Alcywgbm8gcGFzc3dvcmRcbiIsIHNydmMtPnVzZXIsIHNydmMtPmhvc3QgKTsKKwkJCQlnb3RvIGJhaWw7CisJCQl9CisJCQkvKgorCQkJICogZ2V0cGFzcygpIHJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RhdGljIGJ1ZmZlci4gIG1ha2UgYSBjb3B5CisJCQkgKiBmb3IgbG9uZyB0ZXJtIHN0b3JhZ2UuCisJCQkgKi8KKwkJCXNydmMtPnBhc3MgPSB4c3RyZHVwKCBhcmcgKTsKKwkJfQorCQlpZiAoQ0FQKE5PTE9HSU4pKSB7CisJCQlmcHJpbnRmKCBzdGRlcnIsICJTa2lwcGluZyBhY2NvdW50ICVzQCVzLCBzZXJ2ZXIgZm9yYmlkcyBMT0dJTlxuIiwgc3J2Yy0+dXNlciwgc3J2Yy0+aG9zdCApOworCQkJZ290byBiYWlsOworCQl9CisJCWltYXBfd2FybiggIioqKiBJTUFQIFdhcm5pbmcgKioqIFBhc3N3b3JkIGlzIGJlaW5nIHNlbnQgaW4gdGhlIGNsZWFyXG4iICk7CisJCWlmIChpbWFwX2V4ZWMoIGN0eCwgTlVMTCwgIkxPR0lOIFwiJXNcIiBcIiVzXCIiLCBzcnZjLT51c2VyLCBzcnZjLT5wYXNzICkgIT0gUkVTUF9PSykgeworCQkJZnByaW50Ziggc3RkZXJyLCAiSU1BUCBlcnJvcjogTE9HSU4gZmFpbGVkXG4iICk7CisJCQlnb3RvIGJhaWw7CisJCX0KKwl9IC8qICFwcmVhdXRoICovCisKKwljdHgtPnByZWZpeCA9ICIiOworCWN0eC0+dHJhc2huYyA9IDE7CisJcmV0dXJuIChzdG9yZV90ICopY3R4OworCisgIGJhaWw6CisJaW1hcF9jbG9zZV9zdG9yZSggJmN0eC0+Z2VuICk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK2ltYXBfbWFrZV9mbGFncyggaW50IGZsYWdzLCBjaGFyICpidWYgKQoreworCWNvbnN0IGNoYXIgKnM7CisJdW5zaWduZWQgaSwgZDsKKworCWZvciAoaSA9IGQgPSAwOyBpIDwgQVJSQVlfU0laRShGbGFncyk7IGkrKykKKwkJaWYgKGZsYWdzICYgKDEgPDwgaSkpIHsKKwkJCWJ1ZltkKytdID0gJyAnOworCQkJYnVmW2QrK10gPSAnXFwnOworCQkJZm9yIChzID0gRmxhZ3NbaV07ICpzOyBzKyspCisJCQkJYnVmW2QrK10gPSAqczsKKwkJfQorCWJ1ZlswXSA9ICcoJzsKKwlidWZbZCsrXSA9ICcpJzsKKwlyZXR1cm4gZDsKK30KKworI2RlZmluZSBUVUlETCA4CisKK3N0YXRpYyBpbnQKK2ltYXBfc3RvcmVfbXNnKCBzdG9yZV90ICpnY3R4LCBtc2dfZGF0YV90ICpkYXRhLCBpbnQgKnVpZCApCit7CisJaW1hcF9zdG9yZV90ICpjdHggPSAoaW1hcF9zdG9yZV90ICopZ2N0eDsKKwlpbWFwX3QgKmltYXAgPSBjdHgtPmltYXA7CisJc3RydWN0IGltYXBfY21kX2NiIGNiOworCWNoYXIgKmZtYXAsICpidWY7CisJY29uc3QgY2hhciAqcHJlZml4LCAqYm94OworCWludCByZXQsIGksIGosIGQsIGxlbiwgZXh0cmEsIG5vY3I7CisJaW50IHN0YXJ0LCBzYnJlYWsgPSAwLCBlYnJlYWsgPSAwOworCWNoYXIgZmxhZ3N0clsxMjhdLCB0dWlkW1RVSURMICogMiArIDFdOworCisJbWVtc2V0KCAmY2IsIDAsIHNpemVvZihjYikgKTsKKworCWZtYXAgPSBkYXRhLT5kYXRhOworCWxlbiA9IGRhdGEtPmxlbjsKKwlub2NyID0gIWRhdGEtPmNybGY7CisJZXh0cmEgPSAwLCBpID0gMDsKKwlpZiAoIUNBUChVSURQTFVTKSAmJiB1aWQpIHsKKwkgIG5sb29wOgorCQlzdGFydCA9IGk7CisJCXdoaWxlIChpIDwgbGVuKQorCQkJaWYgKGZtYXBbaSsrXSA9PSAnXG4nKSB7CisJCQkJZXh0cmEgKz0gbm9jcjsKKwkJCQlpZiAoaSAtIDIgKyBub2NyID09IHN0YXJ0KSB7CisJCQkJCXNicmVhayA9IGVicmVhayA9IGkgLSAyICsgbm9jcjsKKwkJCQkJZ290byBta3RpZDsKKwkJCQl9CisJCQkJaWYgKCFtZW1jbXAoIGZtYXAgKyBzdGFydCwgIlgtVFVJRDogIiwgOCApKSB7CisJCQkJCWV4dHJhIC09IChlYnJlYWsgPSBpKSAtIChzYnJlYWsgPSBzdGFydCkgKyBub2NyOworCQkJCQlnb3RvIG1rdGlkOworCQkJCX0KKwkJCQlnb3RvIG5sb29wOworCQkJfQorCQkvKiBpbnZhbGlkIG1lc3NhZ2UgKi8KKwkJZnJlZSggZm1hcCApOworCQlyZXR1cm4gRFJWX01TR19CQUQ7CisJIG1rdGlkOgorCQlmb3IgKGogPSAwOyBqIDwgVFVJREw7IGorKykKKwkJCXNwcmludGYoIHR1aWQgKyBqICogMiwgIiUwMngiLCBhcmM0X2dldGJ5dGUoKSApOworCQlleHRyYSArPSA4ICsgVFVJREwgKiAyICsgMjsKKwl9CisJaWYgKG5vY3IpCisJCWZvciAoOyBpIDwgbGVuOyBpKyspCisJCQlpZiAoZm1hcFtpXSA9PSAnXG4nKQorCQkJCWV4dHJhKys7CisKKwljYi5kbGVuID0gbGVuICsgZXh0cmE7CisJYnVmID0gY2IuZGF0YSA9IHhtYWxsb2MoIGNiLmRsZW4gKTsKKwlpID0gMDsKKwlpZiAoIUNBUChVSURQTFVTKSAmJiB1aWQpIHsKKwkJaWYgKG5vY3IpIHsKKwkJCWZvciAoOyBpIDwgc2JyZWFrOyBpKyspCisJCQkJaWYgKGZtYXBbaV0gPT0gJ1xuJykgeworCQkJCQkqYnVmKysgPSAnXHInOworCQkJCQkqYnVmKysgPSAnXG4nOworCQkJCX0gZWxzZQorCQkJCQkqYnVmKysgPSBmbWFwW2ldOworCQl9IGVsc2UgeworCQkJbWVtY3B5KCBidWYsIGZtYXAsIHNicmVhayApOworCQkJYnVmICs9IHNicmVhazsKKwkJfQorCQltZW1jcHkoIGJ1ZiwgIlgtVFVJRDogIiwgOCApOworCQlidWYgKz0gODsKKwkJbWVtY3B5KCBidWYsIHR1aWQsIFRVSURMICogMiApOworCQlidWYgKz0gVFVJREwgKiAyOworCQkqYnVmKysgPSAnXHInOworCQkqYnVmKysgPSAnXG4nOworCQlpID0gZWJyZWFrOworCX0KKwlpZiAobm9jcikgeworCQlmb3IgKDsgaSA8IGxlbjsgaSsrKQorCQkJaWYgKGZtYXBbaV0gPT0gJ1xuJykgeworCQkJCSpidWYrKyA9ICdccic7CisJCQkJKmJ1ZisrID0gJ1xuJzsKKwkJCX0gZWxzZQorCQkJCSpidWYrKyA9IGZtYXBbaV07CisJfSBlbHNlCisJCW1lbWNweSggYnVmLCBmbWFwICsgaSwgbGVuIC0gaSApOworCisJZnJlZSggZm1hcCApOworCisJZCA9IDA7CisJaWYgKGRhdGEtPmZsYWdzKSB7CisJCWQgPSBpbWFwX21ha2VfZmxhZ3MoIGRhdGEtPmZsYWdzLCBmbGFnc3RyICk7CisJCWZsYWdzdHJbZCsrXSA9ICcgJzsKKwl9CisJZmxhZ3N0cltkXSA9IDA7CisKKwlpZiAoIXVpZCkgeworCQlib3ggPSBnY3R4LT5jb25mLT50cmFzaDsKKwkJcHJlZml4ID0gY3R4LT5wcmVmaXg7CisJCWNiLmNyZWF0ZSA9IDE7CisJCWlmIChjdHgtPnRyYXNobmMpCisJCQlpbWFwLT5jYXBzID0gaW1hcC0+cmNhcHMgJiB+KDEgPDwgTElURVJBTFBMVVMpOworCX0gZWxzZSB7CisJCWJveCA9IGdjdHgtPm5hbWU7CisJCXByZWZpeCA9ICFzdHJjbXAoIGJveCwgIklOQk9YIiApID8gIiIgOiBjdHgtPnByZWZpeDsKKwkJY2IuY3JlYXRlID0gMDsKKwl9CisJY2IuY3R4ID0gdWlkOworCXJldCA9IGltYXBfZXhlY19tKCBjdHgsICZjYiwgIkFQUEVORCBcIiVzJXNcIiAlcyIsIHByZWZpeCwgYm94LCBmbGFnc3RyICk7CisJaW1hcC0+Y2FwcyA9IGltYXAtPnJjYXBzOworCWlmIChyZXQgIT0gRFJWX09LKQorCQlyZXR1cm4gcmV0OworCWlmICghdWlkKQorCQljdHgtPnRyYXNobmMgPSAwOworCWVsc2UKKwkJZ2N0eC0+Y291bnQrKzsKKworCXJldHVybiBEUlZfT0s7Cit9CisKKyNkZWZpbmUgQ0hVTktTSVpFIDB4MTAwMAorCitzdGF0aWMgaW50CityZWFkX21lc3NhZ2UoIEZJTEUgKmYsIG1zZ19kYXRhX3QgKm1zZyApCit7CisJc3RydWN0IHN0cmJ1ZiBidWY7CisKKwltZW1zZXQobXNnLCAwLCBzaXplb2YoKm1zZykpOworCXN0cmJ1Zl9pbml0KCZidWYsIDApOworCisJZG8geworCQlpZiAoc3RyYnVmX2ZyZWFkKCZidWYsIENIVU5LU0laRSwgZikgPD0gMCkKKwkJCWJyZWFrOworCX0gd2hpbGUgKCFmZW9mKGYpKTsKKworCW1zZy0+bGVuICA9IGJ1Zi5sZW47CisJbXNnLT5kYXRhID0gc3RyYnVmX2RldGFjaCgmYnVmLCBOVUxMKTsKKwlyZXR1cm4gbXNnLT5sZW47Cit9CisKK3N0YXRpYyBpbnQKK2NvdW50X21lc3NhZ2VzKCBtc2dfZGF0YV90ICptc2cgKQoreworCWludCBjb3VudCA9IDA7CisJY2hhciAqcCA9IG1zZy0+ZGF0YTsKKworCXdoaWxlICgxKSB7CisJCWlmICghcHJlZml4Y21wKHAsICJGcm9tICIpKSB7CisJCQljb3VudCsrOworCQkJcCArPSA1OworCQl9CisJCXAgPSBzdHJzdHIoIHArNSwgIlxuRnJvbSAiKTsKKwkJaWYgKCFwKQorCQkJYnJlYWs7CisJCXArKzsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50CitzcGxpdF9tc2coIG1zZ19kYXRhX3QgKmFsbF9tc2dzLCBtc2dfZGF0YV90ICptc2csIGludCAqb2ZzICkKK3sKKwljaGFyICpwLCAqZGF0YTsKKworCW1lbXNldCggbXNnLCAwLCBzaXplb2YgKm1zZyApOworCWlmICgqb2ZzID49IGFsbF9tc2dzLT5sZW4pCisJCXJldHVybiAwOworCisJZGF0YSA9ICZhbGxfbXNncy0+ZGF0YVsgKm9mcyBdOworCW1zZy0+bGVuID0gYWxsX21zZ3MtPmxlbiAtICpvZnM7CisKKwlpZiAobXNnLT5sZW4gPCA1IHx8IHByZWZpeGNtcChkYXRhLCAiRnJvbSAiKSkKKwkJcmV0dXJuIDA7CisKKwlwID0gc3RyY2hyKCBkYXRhLCAnXG4nICk7CisJaWYgKHApIHsKKwkJcCA9ICZwWzFdOworCQltc2ctPmxlbiAtPSBwLWRhdGE7CisJCSpvZnMgKz0gcC1kYXRhOworCQlkYXRhID0gcDsKKwl9CisKKwlwID0gc3Ryc3RyKCBkYXRhLCAiXG5Gcm9tICIgKTsKKwlpZiAocCkKKwkJbXNnLT5sZW4gPSAmcFsxXSAtIGRhdGE7CisKKwltc2ctPmRhdGEgPSB4bWVtZHVweihkYXRhLCBtc2ctPmxlbik7CisJKm9mcyArPSBtc2ctPmxlbjsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGltYXBfc2VydmVyX2NvbmZfdCBzZXJ2ZXIgPQoreworCU5VTEwsCS8qIG5hbWUgKi8KKwlOVUxMLAkvKiB0dW5uZWwgKi8KKwlOVUxMLAkvKiBob3N0ICovCisJMCwJLyogcG9ydCAqLworCU5VTEwsCS8qIHVzZXIgKi8KKwlOVUxMLAkvKiBwYXNzICovCit9OworCitzdGF0aWMgY2hhciAqaW1hcF9mb2xkZXI7CisKK3N0YXRpYyBpbnQKK2dpdF9pbWFwX2NvbmZpZyhjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbCkKK3sKKwljaGFyIGltYXBfa2V5W10gPSAiaW1hcC4iOworCisJaWYgKHN0cm5jbXAoIGtleSwgaW1hcF9rZXksIHNpemVvZiBpbWFwX2tleSAtIDEgKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXZhbCkKKwkJcmV0dXJuIGNvbmZpZ19lcnJvcl9ub25ib29sKGtleSk7CisKKwlrZXkgKz0gc2l6ZW9mIGltYXBfa2V5IC0gMTsKKworCWlmICghc3RyY21wKCAiZm9sZGVyIiwga2V5ICkpIHsKKwkJaW1hcF9mb2xkZXIgPSB4c3RyZHVwKCB2YWwgKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoICJob3N0Iiwga2V5ICkpIHsKKwkJeworCQkJaWYgKCFwcmVmaXhjbXAodmFsLCAiaW1hcDoiKSkKKwkJCQl2YWwgKz0gNTsKKwkJCWlmICghc2VydmVyLnBvcnQpCisJCQkJc2VydmVyLnBvcnQgPSAxNDM7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAodmFsLCAiLy8iKSkKKwkJCXZhbCArPSAyOworCQlzZXJ2ZXIuaG9zdCA9IHhzdHJkdXAoIHZhbCApOworCX0KKwllbHNlIGlmICghc3RyY21wKCAidXNlciIsIGtleSApKQorCQlzZXJ2ZXIudXNlciA9IHhzdHJkdXAoIHZhbCApOworCWVsc2UgaWYgKCFzdHJjbXAoICJwYXNzIiwga2V5ICkpCisJCXNlcnZlci5wYXNzID0geHN0cmR1cCggdmFsICk7CisJZWxzZSBpZiAoIXN0cmNtcCggInBvcnQiLCBrZXkgKSkKKwkJc2VydmVyLnBvcnQgPSBnaXRfY29uZmlnX2ludCgga2V5LCB2YWwgKTsKKwllbHNlIGlmICghc3RyY21wKCAidHVubmVsIiwga2V5ICkpCisJCXNlcnZlci50dW5uZWwgPSB4c3RyZHVwKCB2YWwgKTsKKwlyZXR1cm4gMDsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwltc2dfZGF0YV90IGFsbF9tc2dzLCBtc2c7CisJc3RvcmVfdCAqY3R4ID0gTlVMTDsKKwlpbnQgdWlkID0gMDsKKwlpbnQgb2ZzID0gMDsKKwlpbnQgcjsKKwlpbnQgdG90YWwsIG4gPSAwOworCisJLyogaW5pdCB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgKi8KKwlhcmM0X2luaXQoKTsKKworCWdpdF9jb25maWcoIGdpdF9pbWFwX2NvbmZpZyApOworCisJaWYgKCFpbWFwX2ZvbGRlcikgeworCQlmcHJpbnRmKCBzdGRlcnIsICJubyBpbWFwIHN0b3JlIHNwZWNpZmllZFxuIiApOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKCFzZXJ2ZXIuaG9zdCkgeworCQlmcHJpbnRmKCBzdGRlcnIsICJubyBpbWFwIGhvc3Qgc3BlY2lmaWVkXG4iICk7CisJCXJldHVybiAxOworCX0KKworCS8qIHJlYWQgdGhlIG1lc3NhZ2VzICovCisJaWYgKCFyZWFkX21lc3NhZ2UoIHN0ZGluLCAmYWxsX21zZ3MgKSkgeworCQlmcHJpbnRmKHN0ZGVyciwibm90aGluZyB0byBzZW5kXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJdG90YWwgPSBjb3VudF9tZXNzYWdlcyggJmFsbF9tc2dzICk7CisJaWYgKCF0b3RhbCkgeworCQlmcHJpbnRmKHN0ZGVyciwibm8gbWVzc2FnZXMgdG8gc2VuZFxuIik7CisJCXJldHVybiAxOworCX0KKworCS8qIHdyaXRlIGl0IHRvIHRoZSBpbWFwIHNlcnZlciAqLworCWN0eCA9IGltYXBfb3Blbl9zdG9yZSggJnNlcnZlciApOworCWlmICghY3R4KSB7CisJCWZwcmludGYoIHN0ZGVyciwiZmFpbGVkIHRvIG9wZW4gc3RvcmVcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlmcHJpbnRmKCBzdGRlcnIsICJzZW5kaW5nICVkIG1lc3NhZ2Ulc1xuIiwgdG90YWwsICh0b3RhbCE9MSk/InMiOiIiICk7CisJY3R4LT5uYW1lID0gaW1hcF9mb2xkZXI7CisJd2hpbGUgKDEpIHsKKwkJdW5zaWduZWQgcGVyY2VudCA9IG4gKiAxMDAgLyB0b3RhbDsKKwkJZnByaW50Ziggc3RkZXJyLCAiJTR1JSUgKCVkLyVkKSBkb25lXHIiLCBwZXJjZW50LCBuLCB0b3RhbCApOworCQlpZiAoIXNwbGl0X21zZyggJmFsbF9tc2dzLCAmbXNnLCAmb2ZzICkpCisJCQlicmVhazsKKwkJciA9IGltYXBfc3RvcmVfbXNnKCBjdHgsICZtc2csICZ1aWQgKTsKKwkJaWYgKHIgIT0gRFJWX09LKSBicmVhazsKKwkJbisrOworCX0KKwlmcHJpbnRmKCBzdGRlcnIsIlxuIiApOworCisJaW1hcF9jbG9zZV9zdG9yZSggY3R4ICk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2luZGV4LXBhY2suYyBiL2luZGV4LXBhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzBjMjc4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5kZXgtcGFjay5jCkBAIC0wLDAgKzEsOTIxIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkZWx0YS5oIgorI2luY2x1ZGUgInBhY2suaCIKKyNpbmNsdWRlICJjc3VtLWZpbGUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgInByb2dyZXNzLmgiCisjaW5jbHVkZSAiZnNjay5oIgorCitzdGF0aWMgY29uc3QgY2hhciBpbmRleF9wYWNrX3VzYWdlW10gPQorImdpdC1pbmRleC1wYWNrIFstdl0gWy1vIDxpbmRleC1maWxlPl0gW3sgLS0ta2VlcCB8IC0ta2VlcD08bXNnPiB9XSBbLS1zdHJpY3RdIHsgPHBhY2stZmlsZT4gfCAtLXN0ZGluIFstLWZpeC10aGluXSBbPHBhY2stZmlsZT5dIH0iOworCitzdHJ1Y3Qgb2JqZWN0X2VudHJ5Cit7CisJc3RydWN0IHBhY2tfaWR4X2VudHJ5IGlkeDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgaW50IGhkcl9zaXplOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwllbnVtIG9iamVjdF90eXBlIHJlYWxfdHlwZTsKK307CisKK3VuaW9uIGRlbHRhX2Jhc2UgeworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJb2ZmX3Qgb2Zmc2V0OworfTsKKworLyoKKyAqIEV2ZW4gaWYgc2l6ZW9mKHVuaW9uIGRlbHRhX2Jhc2UpID09IDI0IG9uIDY0LWJpdCBhcmNocywgd2UgcmVhbGx5IHdhbnQKKyAqIHRvIG1lbWNtcCgpIG9ubHkgdGhlIGZpcnN0IDIwIGJ5dGVzLgorICovCisjZGVmaW5lIFVOSU9OX0JBU0VfU1oJMjAKKworI2RlZmluZSBGTEFHX0xJTksgKDF1PDwyMCkKKyNkZWZpbmUgRkxBR19DSEVDS0VEICgxdTw8MjEpCisKK3N0cnVjdCBkZWx0YV9lbnRyeQoreworCXVuaW9uIGRlbHRhX2Jhc2UgYmFzZTsKKwlpbnQgb2JqX25vOworfTsKKworc3RhdGljIHN0cnVjdCBvYmplY3RfZW50cnkgKm9iamVjdHM7CitzdGF0aWMgc3RydWN0IGRlbHRhX2VudHJ5ICpkZWx0YXM7CitzdGF0aWMgaW50IG5yX29iamVjdHM7CitzdGF0aWMgaW50IG5yX2RlbHRhczsKK3N0YXRpYyBpbnQgbnJfcmVzb2x2ZWRfZGVsdGFzOworCitzdGF0aWMgaW50IGZyb21fc3RkaW47CitzdGF0aWMgaW50IHN0cmljdDsKK3N0YXRpYyBpbnQgdmVyYm9zZTsKKworc3RhdGljIHN0cnVjdCBwcm9ncmVzcyAqcHJvZ3Jlc3M7CisKKy8qIFdlIGFsd2F5cyByZWFkIGluIDRrQiBjaHVua3MuICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBpbnB1dF9idWZmZXJbNDA5Nl07CitzdGF0aWMgdW5zaWduZWQgaW50IGlucHV0X29mZnNldCwgaW5wdXRfbGVuOworc3RhdGljIG9mZl90IGNvbnN1bWVkX2J5dGVzOworc3RhdGljIFNIQV9DVFggaW5wdXRfY3R4Oworc3RhdGljIHVpbnQzMl90IGlucHV0X2NyYzMyOworc3RhdGljIGludCBpbnB1dF9mZCwgb3V0cHV0X2ZkLCBwYWNrX2ZkOworCitzdGF0aWMgaW50IG1hcmtfbGluayhzdHJ1Y3Qgb2JqZWN0ICpvYmosIGludCB0eXBlLCB2b2lkICpkYXRhKQoreworCWlmICghb2JqKQorCQlyZXR1cm4gLTE7CisKKwlpZiAodHlwZSAhPSBPQkpfQU5ZICYmIG9iai0+dHlwZSAhPSB0eXBlKQorCQlkaWUoIm9iamVjdCB0eXBlIG1pc21hdGNoIGF0ICVzIiwgc2hhMV90b19oZXgob2JqLT5zaGExKSk7CisKKwlvYmotPmZsYWdzIHw9IEZMQUdfTElOSzsKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIGNvbnRlbnQgb2YgZWFjaCBsaW5rZWQgb2JqZWN0IG11c3QgaGF2ZSBiZWVuIGNoZWNrZWQKKyAgIG9yIGl0IG11c3QgYmUgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBvYmplY3QgZGF0YWJhc2UgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX29iamVjdChzdHJ1Y3Qgb2JqZWN0ICpvYmopCit7CisJaWYgKCFvYmopCisJCXJldHVybjsKKworCWlmICghKG9iai0+ZmxhZ3MgJiBGTEFHX0xJTkspKQorCQlyZXR1cm47CisKKwlpZiAoIShvYmotPmZsYWdzICYgRkxBR19DSEVDS0VEKSkgeworCQl1bnNpZ25lZCBsb25nIHNpemU7CisJCWludCB0eXBlID0gc2hhMV9vYmplY3RfaW5mbyhvYmotPnNoYTEsICZzaXplKTsKKwkJaWYgKHR5cGUgIT0gb2JqLT50eXBlIHx8IHR5cGUgPD0gMCkKKwkJCWRpZSgib2JqZWN0IG9mIHVuZXhwZWN0ZWQgdHlwZSIpOworCQlvYmotPmZsYWdzIHw9IEZMQUdfQ0hFQ0tFRDsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIHZvaWQgY2hlY2tfb2JqZWN0cyh2b2lkKQoreworCXVuc2lnbmVkIGksIG1heDsKKworCW1heCA9IGdldF9tYXhfb2JqZWN0X2luZGV4KCk7CisJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKQorCQljaGVja19vYmplY3QoZ2V0X2luZGV4ZWRfb2JqZWN0KGkpKTsKK30KKworCisvKiBEaXNjYXJkIGN1cnJlbnQgYnVmZmVyIHVzZWQgY29udGVudC4gKi8KK3N0YXRpYyB2b2lkIGZsdXNoKHZvaWQpCit7CisJaWYgKGlucHV0X29mZnNldCkgeworCQlpZiAob3V0cHV0X2ZkID49IDApCisJCQl3cml0ZV9vcl9kaWUob3V0cHV0X2ZkLCBpbnB1dF9idWZmZXIsIGlucHV0X29mZnNldCk7CisJCVNIQTFfVXBkYXRlKCZpbnB1dF9jdHgsIGlucHV0X2J1ZmZlciwgaW5wdXRfb2Zmc2V0KTsKKwkJbWVtbW92ZShpbnB1dF9idWZmZXIsIGlucHV0X2J1ZmZlciArIGlucHV0X29mZnNldCwgaW5wdXRfbGVuKTsKKwkJaW5wdXRfb2Zmc2V0ID0gMDsKKwl9Cit9CisKKy8qCisgKiBNYWtlIHN1cmUgYXQgbGVhc3QgIm1pbiIgYnl0ZXMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgYnVmZmVyLCBhbmQKKyAqIHJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgYnVmZmVyLgorICovCitzdGF0aWMgdm9pZCAqZmlsbChpbnQgbWluKQoreworCWlmIChtaW4gPD0gaW5wdXRfbGVuKQorCQlyZXR1cm4gaW5wdXRfYnVmZmVyICsgaW5wdXRfb2Zmc2V0OworCWlmIChtaW4gPiBzaXplb2YoaW5wdXRfYnVmZmVyKSkKKwkJZGllKCJjYW5ub3QgZmlsbCAlZCBieXRlcyIsIG1pbik7CisJZmx1c2goKTsKKwlkbyB7CisJCXNzaXplX3QgcmV0ID0geHJlYWQoaW5wdXRfZmQsIGlucHV0X2J1ZmZlciArIGlucHV0X2xlbiwKKwkJCQlzaXplb2YoaW5wdXRfYnVmZmVyKSAtIGlucHV0X2xlbik7CisJCWlmIChyZXQgPD0gMCkgeworCQkJaWYgKCFyZXQpCisJCQkJZGllKCJlYXJseSBFT0YiKTsKKwkJCWRpZSgicmVhZCBlcnJvciBvbiBpbnB1dDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQl9CisJCWlucHV0X2xlbiArPSByZXQ7CisJCWlmIChmcm9tX3N0ZGluKQorCQkJZGlzcGxheV90aHJvdWdocHV0KHByb2dyZXNzLCBjb25zdW1lZF9ieXRlcyArIGlucHV0X2xlbik7CisJfSB3aGlsZSAoaW5wdXRfbGVuIDwgbWluKTsKKwlyZXR1cm4gaW5wdXRfYnVmZmVyOworfQorCitzdGF0aWMgdm9pZCB1c2UoaW50IGJ5dGVzKQoreworCWlmIChieXRlcyA+IGlucHV0X2xlbikKKwkJZGllKCJ1c2VkIG1vcmUgYnl0ZXMgdGhhbiB3ZXJlIGF2YWlsYWJsZSIpOworCWlucHV0X2NyYzMyID0gY3JjMzIoaW5wdXRfY3JjMzIsIGlucHV0X2J1ZmZlciArIGlucHV0X29mZnNldCwgYnl0ZXMpOworCWlucHV0X2xlbiAtPSBieXRlczsKKwlpbnB1dF9vZmZzZXQgKz0gYnl0ZXM7CisKKwkvKiBtYWtlIHN1cmUgb2ZmX3QgaXMgc3VmZmljaWVudGx5IGxhcmdlIG5vdCB0byB3cmFwICovCisJaWYgKGNvbnN1bWVkX2J5dGVzID4gY29uc3VtZWRfYnl0ZXMgKyBieXRlcykKKwkJZGllKCJwYWNrIHRvbyBsYXJnZSBmb3IgY3VycmVudCBkZWZpbml0aW9uIG9mIG9mZl90Iik7CisJY29uc3VtZWRfYnl0ZXMgKz0gYnl0ZXM7Cit9CisKK3N0YXRpYyBjaGFyICpvcGVuX3BhY2tfZmlsZShjaGFyICpwYWNrX25hbWUpCit7CisJaWYgKGZyb21fc3RkaW4pIHsKKwkJaW5wdXRfZmQgPSAwOworCQlpZiAoIXBhY2tfbmFtZSkgeworCQkJc3RhdGljIGNoYXIgdG1wZmlsZVtQQVRIX01BWF07CisJCQlzbnByaW50Zih0bXBmaWxlLCBzaXplb2YodG1wZmlsZSksCisJCQkJICIlcy90bXBfcGFja19YWFhYWFgiLCBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpKTsKKwkJCW91dHB1dF9mZCA9IHhta3N0ZW1wKHRtcGZpbGUpOworCQkJcGFja19uYW1lID0geHN0cmR1cCh0bXBmaWxlKTsKKwkJfSBlbHNlCisJCQlvdXRwdXRfZmQgPSBvcGVuKHBhY2tfbmFtZSwgT19DUkVBVHxPX0VYQ0x8T19SRFdSLCAwNjAwKTsKKwkJaWYgKG91dHB1dF9mZCA8IDApCisJCQlkaWUoInVuYWJsZSB0byBjcmVhdGUgJXM6ICVzXG4iLCBwYWNrX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXBhY2tfZmQgPSBvdXRwdXRfZmQ7CisJfSBlbHNlIHsKKwkJaW5wdXRfZmQgPSBvcGVuKHBhY2tfbmFtZSwgT19SRE9OTFkpOworCQlpZiAoaW5wdXRfZmQgPCAwKQorCQkJZGllKCJjYW5ub3Qgb3BlbiBwYWNrZmlsZSAnJXMnOiAlcyIsCisJCQkgICAgcGFja19uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlvdXRwdXRfZmQgPSAtMTsKKwkJcGFja19mZCA9IGlucHV0X2ZkOworCX0KKwlTSEExX0luaXQoJmlucHV0X2N0eCk7CisJcmV0dXJuIHBhY2tfbmFtZTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfcGFja19oZWFkZXIodm9pZCkKK3sKKwlzdHJ1Y3QgcGFja19oZWFkZXIgKmhkciA9IGZpbGwoc2l6ZW9mKHN0cnVjdCBwYWNrX2hlYWRlcikpOworCisJLyogSGVhZGVyIGNvbnNpc3RlbmN5IGNoZWNrICovCisJaWYgKGhkci0+aGRyX3NpZ25hdHVyZSAhPSBodG9ubChQQUNLX1NJR05BVFVSRSkpCisJCWRpZSgicGFjayBzaWduYXR1cmUgbWlzbWF0Y2giKTsKKwlpZiAoIXBhY2tfdmVyc2lvbl9vayhoZHItPmhkcl92ZXJzaW9uKSkKKwkJZGllKCJwYWNrIHZlcnNpb24gJWQgdW5zdXBwb3J0ZWQiLCBudG9obChoZHItPmhkcl92ZXJzaW9uKSk7CisKKwlucl9vYmplY3RzID0gbnRvaGwoaGRyLT5oZHJfZW50cmllcyk7CisJdXNlKHNpemVvZihzdHJ1Y3QgcGFja19oZWFkZXIpKTsKK30KKworc3RhdGljIHZvaWQgYmFkX29iamVjdCh1bnNpZ25lZCBsb25nIG9mZnNldCwgY29uc3QgY2hhciAqZm9ybWF0LAorCQkgICAgICAgLi4uKSBOT1JFVFVSTiBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKKworc3RhdGljIHZvaWQgYmFkX29iamVjdCh1bnNpZ25lZCBsb25nIG9mZnNldCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBwYXJhbXM7CisJY2hhciBidWZbMTAyNF07CisKKwl2YV9zdGFydChwYXJhbXMsIGZvcm1hdCk7CisJdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZvcm1hdCwgcGFyYW1zKTsKKwl2YV9lbmQocGFyYW1zKTsKKwlkaWUoInBhY2sgaGFzIGJhZCBvYmplY3QgYXQgb2Zmc2V0ICVsdTogJXMiLCBvZmZzZXQsIGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkICp1bnBhY2tfZW50cnlfZGF0YSh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXpfc3RyZWFtIHN0cmVhbTsKKwl2b2lkICpidWYgPSB4bWFsbG9jKHNpemUpOworCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlzdHJlYW0ubmV4dF9vdXQgPSBidWY7CisJc3RyZWFtLmF2YWlsX291dCA9IHNpemU7CisJc3RyZWFtLm5leHRfaW4gPSBmaWxsKDEpOworCXN0cmVhbS5hdmFpbF9pbiA9IGlucHV0X2xlbjsKKwlpbmZsYXRlSW5pdCgmc3RyZWFtKTsKKworCWZvciAoOzspIHsKKwkJaW50IHJldCA9IGluZmxhdGUoJnN0cmVhbSwgMCk7CisJCXVzZShpbnB1dF9sZW4gLSBzdHJlYW0uYXZhaWxfaW4pOworCQlpZiAoc3RyZWFtLnRvdGFsX291dCA9PSBzaXplICYmIHJldCA9PSBaX1NUUkVBTV9FTkQpCisJCQlicmVhazsKKwkJaWYgKHJldCAhPSBaX09LKQorCQkJYmFkX29iamVjdChvZmZzZXQsICJpbmZsYXRlIHJldHVybmVkICVkIiwgcmV0KTsKKwkJc3RyZWFtLm5leHRfaW4gPSBmaWxsKDEpOworCQlzdHJlYW0uYXZhaWxfaW4gPSBpbnB1dF9sZW47CisJfQorCWluZmxhdGVFbmQoJnN0cmVhbSk7CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIHZvaWQgKnVucGFja19yYXdfZW50cnkoc3RydWN0IG9iamVjdF9lbnRyeSAqb2JqLCB1bmlvbiBkZWx0YV9iYXNlICpkZWx0YV9iYXNlKQoreworCXVuc2lnbmVkIGNoYXIgKnAsIGM7CisJdW5zaWduZWQgbG9uZyBzaXplOworCW9mZl90IGJhc2Vfb2Zmc2V0OworCXVuc2lnbmVkIHNoaWZ0OworCXZvaWQgKmRhdGE7CisKKwlvYmotPmlkeC5vZmZzZXQgPSBjb25zdW1lZF9ieXRlczsKKwlpbnB1dF9jcmMzMiA9IGNyYzMyKDAsIFpfTlVMTCwgMCk7CisKKwlwID0gZmlsbCgxKTsKKwljID0gKnA7CisJdXNlKDEpOworCW9iai0+dHlwZSA9IChjID4+IDQpICYgNzsKKwlzaXplID0gKGMgJiAxNSk7CisJc2hpZnQgPSA0OworCXdoaWxlIChjICYgMHg4MCkgeworCQlwID0gZmlsbCgxKTsKKwkJYyA9ICpwOworCQl1c2UoMSk7CisJCXNpemUgKz0gKGMgJiAweDdmVUwpIDw8IHNoaWZ0OworCQlzaGlmdCArPSA3OworCX0KKwlvYmotPnNpemUgPSBzaXplOworCisJc3dpdGNoIChvYmotPnR5cGUpIHsKKwljYXNlIE9CSl9SRUZfREVMVEE6CisJCWhhc2hjcHkoZGVsdGFfYmFzZS0+c2hhMSwgZmlsbCgyMCkpOworCQl1c2UoMjApOworCQlicmVhazsKKwljYXNlIE9CSl9PRlNfREVMVEE6CisJCW1lbXNldChkZWx0YV9iYXNlLCAwLCBzaXplb2YoKmRlbHRhX2Jhc2UpKTsKKwkJcCA9IGZpbGwoMSk7CisJCWMgPSAqcDsKKwkJdXNlKDEpOworCQliYXNlX29mZnNldCA9IGMgJiAxMjc7CisJCXdoaWxlIChjICYgMTI4KSB7CisJCQliYXNlX29mZnNldCArPSAxOworCQkJaWYgKCFiYXNlX29mZnNldCB8fCBNU0IoYmFzZV9vZmZzZXQsIDcpKQorCQkJCWJhZF9vYmplY3Qob2JqLT5pZHgub2Zmc2V0LCAib2Zmc2V0IHZhbHVlIG92ZXJmbG93IGZvciBkZWx0YSBiYXNlIG9iamVjdCIpOworCQkJcCA9IGZpbGwoMSk7CisJCQljID0gKnA7CisJCQl1c2UoMSk7CisJCQliYXNlX29mZnNldCA9IChiYXNlX29mZnNldCA8PCA3KSArIChjICYgMTI3KTsKKwkJfQorCQlkZWx0YV9iYXNlLT5vZmZzZXQgPSBvYmotPmlkeC5vZmZzZXQgLSBiYXNlX29mZnNldDsKKwkJaWYgKGRlbHRhX2Jhc2UtPm9mZnNldCA+PSBvYmotPmlkeC5vZmZzZXQpCisJCQliYWRfb2JqZWN0KG9iai0+aWR4Lm9mZnNldCwgImRlbHRhIGJhc2Ugb2Zmc2V0IGlzIG91dCBvZiBib3VuZCIpOworCQlicmVhazsKKwljYXNlIE9CSl9DT01NSVQ6CisJY2FzZSBPQkpfVFJFRToKKwljYXNlIE9CSl9CTE9COgorCWNhc2UgT0JKX1RBRzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYmFkX29iamVjdChvYmotPmlkeC5vZmZzZXQsICJ1bmtub3duIG9iamVjdCB0eXBlICVkIiwgb2JqLT50eXBlKTsKKwl9CisJb2JqLT5oZHJfc2l6ZSA9IGNvbnN1bWVkX2J5dGVzIC0gb2JqLT5pZHgub2Zmc2V0OworCisJZGF0YSA9IHVucGFja19lbnRyeV9kYXRhKG9iai0+aWR4Lm9mZnNldCwgb2JqLT5zaXplKTsKKwlvYmotPmlkeC5jcmMzMiA9IGlucHV0X2NyYzMyOworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgdm9pZCAqZ2V0X2RhdGFfZnJvbV9wYWNrKHN0cnVjdCBvYmplY3RfZW50cnkgKm9iaikKK3sKKwlvZmZfdCBmcm9tID0gb2JqWzBdLmlkeC5vZmZzZXQgKyBvYmpbMF0uaGRyX3NpemU7CisJdW5zaWduZWQgbG9uZyBsZW4gPSBvYmpbMV0uaWR4Lm9mZnNldCAtIGZyb207CisJdW5zaWduZWQgbG9uZyByZHkgPSAwOworCXVuc2lnbmVkIGNoYXIgKnNyYywgKmRhdGE7CisJel9zdHJlYW0gc3RyZWFtOworCWludCBzdDsKKworCXNyYyA9IHhtYWxsb2MobGVuKTsKKwlkYXRhID0gc3JjOworCWRvIHsKKwkJc3NpemVfdCBuID0gcHJlYWQocGFja19mZCwgZGF0YSArIHJkeSwgbGVuIC0gcmR5LCBmcm9tICsgcmR5KTsKKwkJaWYgKG4gPD0gMCkKKwkJCWRpZSgiY2Fubm90IHByZWFkIHBhY2sgZmlsZTogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQlyZHkgKz0gbjsKKwl9IHdoaWxlIChyZHkgPCBsZW4pOworCWRhdGEgPSB4bWFsbG9jKG9iai0+c2l6ZSk7CisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlzdHJlYW0ubmV4dF9vdXQgPSBkYXRhOworCXN0cmVhbS5hdmFpbF9vdXQgPSBvYmotPnNpemU7CisJc3RyZWFtLm5leHRfaW4gPSBzcmM7CisJc3RyZWFtLmF2YWlsX2luID0gbGVuOworCWluZmxhdGVJbml0KCZzdHJlYW0pOworCXdoaWxlICgoc3QgPSBpbmZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKSkgPT0gWl9PSyk7CisJaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKwlpZiAoc3QgIT0gWl9TVFJFQU1fRU5EIHx8IHN0cmVhbS50b3RhbF9vdXQgIT0gb2JqLT5zaXplKQorCQlkaWUoInNlcmlvdXMgaW5mbGF0ZSBpbmNvbnNpc3RlbmN5Iik7CisJZnJlZShzcmMpOworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IGZpbmRfZGVsdGEoY29uc3QgdW5pb24gZGVsdGFfYmFzZSAqYmFzZSkKK3sKKwlpbnQgZmlyc3QgPSAwLCBsYXN0ID0gbnJfZGVsdGFzOworCisgICAgICAgIHdoaWxlIChmaXJzdCA8IGxhc3QpIHsKKyAgICAgICAgICAgICAgICBpbnQgbmV4dCA9IChmaXJzdCArIGxhc3QpIC8gMjsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGVsdGFfZW50cnkgKmRlbHRhID0gJmRlbHRhc1tuZXh0XTsKKyAgICAgICAgICAgICAgICBpbnQgY21wOworCisgICAgICAgICAgICAgICAgY21wID0gbWVtY21wKGJhc2UsICZkZWx0YS0+YmFzZSwgVU5JT05fQkFTRV9TWik7CisgICAgICAgICAgICAgICAgaWYgKCFjbXApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDsKKyAgICAgICAgICAgICAgICBpZiAoY21wIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmlyc3QgPSBuZXh0KzE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC1maXJzdC0xOworfQorCitzdGF0aWMgaW50IGZpbmRfZGVsdGFfY2hpbGRyZW4oY29uc3QgdW5pb24gZGVsdGFfYmFzZSAqYmFzZSwKKwkJCSAgICAgICBpbnQgKmZpcnN0X2luZGV4LCBpbnQgKmxhc3RfaW5kZXgpCit7CisJaW50IGZpcnN0ID0gZmluZF9kZWx0YShiYXNlKTsKKwlpbnQgbGFzdCA9IGZpcnN0OworCWludCBlbmQgPSBucl9kZWx0YXMgLSAxOworCisJaWYgKGZpcnN0IDwgMCkKKwkJcmV0dXJuIC0xOworCXdoaWxlIChmaXJzdCA+IDAgJiYgIW1lbWNtcCgmZGVsdGFzW2ZpcnN0IC0gMV0uYmFzZSwgYmFzZSwgVU5JT05fQkFTRV9TWikpCisJCS0tZmlyc3Q7CisJd2hpbGUgKGxhc3QgPCBlbmQgJiYgIW1lbWNtcCgmZGVsdGFzW2xhc3QgKyAxXS5iYXNlLCBiYXNlLCBVTklPTl9CQVNFX1NaKSkKKwkJKytsYXN0OworCSpmaXJzdF9pbmRleCA9IGZpcnN0OworCSpsYXN0X2luZGV4ID0gbGFzdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2hhMV9vYmplY3QoY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJZW51bSBvYmplY3RfdHlwZSB0eXBlLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWhhc2hfc2hhMV9maWxlKGRhdGEsIHNpemUsIHR5cGVuYW1lKHR5cGUpLCBzaGExKTsKKwlpZiAoaGFzX3NoYTFfZmlsZShzaGExKSkgeworCQl2b2lkICpoYXNfZGF0YTsKKwkJZW51bSBvYmplY3RfdHlwZSBoYXNfdHlwZTsKKwkJdW5zaWduZWQgbG9uZyBoYXNfc2l6ZTsKKwkJaGFzX2RhdGEgPSByZWFkX3NoYTFfZmlsZShzaGExLCAmaGFzX3R5cGUsICZoYXNfc2l6ZSk7CisJCWlmICghaGFzX2RhdGEpCisJCQlkaWUoImNhbm5vdCByZWFkIGV4aXN0aW5nIG9iamVjdCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJaWYgKHNpemUgIT0gaGFzX3NpemUgfHwgdHlwZSAhPSBoYXNfdHlwZSB8fAorCQkgICAgbWVtY21wKGRhdGEsIGhhc19kYXRhLCBzaXplKSAhPSAwKQorCQkJZGllKCJTSEExIENPTExJU0lPTiBGT1VORCBXSVRIICVzICEiLCBzaGExX3RvX2hleChzaGExKSk7CisJCWZyZWUoaGFzX2RhdGEpOworCX0KKwlpZiAoc3RyaWN0KSB7CisJCWlmICh0eXBlID09IE9CSl9CTE9CKSB7CisJCQlzdHJ1Y3QgYmxvYiAqYmxvYiA9IGxvb2t1cF9ibG9iKHNoYTEpOworCQkJaWYgKGJsb2IpCisJCQkJYmxvYi0+b2JqZWN0LmZsYWdzIHw9IEZMQUdfQ0hFQ0tFRDsKKwkJCWVsc2UKKwkJCQlkaWUoImludmFsaWQgYmxvYiBvYmplY3QgJXMiLCBzaGExX3RvX2hleChzaGExKSk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgb2JqZWN0ICpvYmo7CisJCQlpbnQgZWF0ZW47CisJCQl2b2lkICpidWYgPSAodm9pZCAqKSBkYXRhOworCisJCQkvKgorCQkJICogd2UgZG8gbm90IG5lZWQgdG8gZnJlZSB0aGUgbWVtb3J5IGhlcmUsIGFzIHRoZQorCQkJICogYnVmIGlzIGRlbGV0ZWQgYnkgdGhlIGNhbGxlci4KKwkJCSAqLworCQkJb2JqID0gcGFyc2Vfb2JqZWN0X2J1ZmZlcihzaGExLCB0eXBlLCBzaXplLCBidWYsICZlYXRlbik7CisJCQlpZiAoIW9iaikKKwkJCQlkaWUoImludmFsaWQgJXMiLCB0eXBlbmFtZSh0eXBlKSk7CisJCQlpZiAoZnNja19vYmplY3Qob2JqLCAxLCBmc2NrX2Vycm9yX2Z1bmN0aW9uKSkKKwkJCQlkaWUoIkVycm9yIGluIG9iamVjdCIpOworCQkJaWYgKGZzY2tfd2FsayhvYmosIG1hcmtfbGluaywgMCkpCisJCQkJZGllKCJOb3QgYWxsIGNoaWxkIG9iamVjdHMgb2YgJXMgYXJlIHJlYWNoYWJsZSIsIHNoYTFfdG9faGV4KG9iai0+c2hhMSkpOworCisJCQlpZiAob2JqLT50eXBlID09IE9CSl9UUkVFKSB7CisJCQkJc3RydWN0IHRyZWUgKml0ZW0gPSAoc3RydWN0IHRyZWUgKikgb2JqOworCQkJCWl0ZW0tPmJ1ZmZlciA9IE5VTEw7CisJCQl9CisJCQlpZiAob2JqLT50eXBlID09IE9CSl9DT01NSVQpIHsKKwkJCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSAoc3RydWN0IGNvbW1pdCAqKSBvYmo7CisJCQkJY29tbWl0LT5idWZmZXIgPSBOVUxMOworCQkJfQorCQkJb2JqLT5mbGFncyB8PSBGTEFHX0NIRUNLRUQ7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlc29sdmVfZGVsdGEoc3RydWN0IG9iamVjdF9lbnRyeSAqZGVsdGFfb2JqLCB2b2lkICpiYXNlX2RhdGEsCisJCQkgIHVuc2lnbmVkIGxvbmcgYmFzZV9zaXplLCBlbnVtIG9iamVjdF90eXBlIHR5cGUpCit7CisJdm9pZCAqZGVsdGFfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRlbHRhX3NpemU7CisJdm9pZCAqcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgcmVzdWx0X3NpemU7CisJdW5pb24gZGVsdGFfYmFzZSBkZWx0YV9iYXNlOworCWludCBqLCBmaXJzdCwgbGFzdDsKKworCWRlbHRhX29iai0+cmVhbF90eXBlID0gdHlwZTsKKwlkZWx0YV9kYXRhID0gZ2V0X2RhdGFfZnJvbV9wYWNrKGRlbHRhX29iaik7CisJZGVsdGFfc2l6ZSA9IGRlbHRhX29iai0+c2l6ZTsKKwlyZXN1bHQgPSBwYXRjaF9kZWx0YShiYXNlX2RhdGEsIGJhc2Vfc2l6ZSwgZGVsdGFfZGF0YSwgZGVsdGFfc2l6ZSwKKwkJCSAgICAgJnJlc3VsdF9zaXplKTsKKwlmcmVlKGRlbHRhX2RhdGEpOworCWlmICghcmVzdWx0KQorCQliYWRfb2JqZWN0KGRlbHRhX29iai0+aWR4Lm9mZnNldCwgImZhaWxlZCB0byBhcHBseSBkZWx0YSIpOworCXNoYTFfb2JqZWN0KHJlc3VsdCwgcmVzdWx0X3NpemUsIHR5cGUsIGRlbHRhX29iai0+aWR4LnNoYTEpOworCW5yX3Jlc29sdmVkX2RlbHRhcysrOworCisJaGFzaGNweShkZWx0YV9iYXNlLnNoYTEsIGRlbHRhX29iai0+aWR4LnNoYTEpOworCWlmICghZmluZF9kZWx0YV9jaGlsZHJlbigmZGVsdGFfYmFzZSwgJmZpcnN0LCAmbGFzdCkpIHsKKwkJZm9yIChqID0gZmlyc3Q7IGogPD0gbGFzdDsgaisrKSB7CisJCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpjaGlsZCA9IG9iamVjdHMgKyBkZWx0YXNbal0ub2JqX25vOworCQkJaWYgKGNoaWxkLT5yZWFsX3R5cGUgPT0gT0JKX1JFRl9ERUxUQSkKKwkJCQlyZXNvbHZlX2RlbHRhKGNoaWxkLCByZXN1bHQsIHJlc3VsdF9zaXplLCB0eXBlKTsKKwkJfQorCX0KKworCW1lbXNldCgmZGVsdGFfYmFzZSwgMCwgc2l6ZW9mKGRlbHRhX2Jhc2UpKTsKKwlkZWx0YV9iYXNlLm9mZnNldCA9IGRlbHRhX29iai0+aWR4Lm9mZnNldDsKKwlpZiAoIWZpbmRfZGVsdGFfY2hpbGRyZW4oJmRlbHRhX2Jhc2UsICZmaXJzdCwgJmxhc3QpKSB7CisJCWZvciAoaiA9IGZpcnN0OyBqIDw9IGxhc3Q7IGorKykgeworCQkJc3RydWN0IG9iamVjdF9lbnRyeSAqY2hpbGQgPSBvYmplY3RzICsgZGVsdGFzW2pdLm9ial9ubzsKKwkJCWlmIChjaGlsZC0+cmVhbF90eXBlID09IE9CSl9PRlNfREVMVEEpCisJCQkJcmVzb2x2ZV9kZWx0YShjaGlsZCwgcmVzdWx0LCByZXN1bHRfc2l6ZSwgdHlwZSk7CisJCX0KKwl9CisKKwlmcmVlKHJlc3VsdCk7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZV9kZWx0YV9lbnRyeShjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCWNvbnN0IHN0cnVjdCBkZWx0YV9lbnRyeSAqZGVsdGFfYSA9IGE7CisJY29uc3Qgc3RydWN0IGRlbHRhX2VudHJ5ICpkZWx0YV9iID0gYjsKKwlyZXR1cm4gbWVtY21wKCZkZWx0YV9hLT5iYXNlLCAmZGVsdGFfYi0+YmFzZSwgVU5JT05fQkFTRV9TWik7Cit9CisKKy8qIFBhcnNlIGFsbCBvYmplY3RzIGFuZCByZXR1cm4gdGhlIHBhY2sgY29udGVudCBTSEExIGhhc2ggKi8KK3N0YXRpYyB2b2lkIHBhcnNlX3BhY2tfb2JqZWN0cyh1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBpOworCXN0cnVjdCBkZWx0YV9lbnRyeSAqZGVsdGEgPSBkZWx0YXM7CisJdm9pZCAqZGF0YTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCS8qCisJICogRmlyc3QgcGFzczoKKwkgKiAtIGZpbmQgbG9jYXRpb25zIG9mIGFsbCBvYmplY3RzOworCSAqIC0gY2FsY3VsYXRlIFNIQTEgb2YgYWxsIG5vbi1kZWx0YSBvYmplY3RzOworCSAqIC0gcmVtZW1iZXIgYmFzZSAoU0hBMSBvciBvZmZzZXQpIGZvciBhbGwgZGVsdGFzLgorCSAqLworCWlmICh2ZXJib3NlKQorCQlwcm9ncmVzcyA9IHN0YXJ0X3Byb2dyZXNzKAorCQkJCWZyb21fc3RkaW4gPyAiUmVjZWl2aW5nIG9iamVjdHMiIDogIkluZGV4aW5nIG9iamVjdHMiLAorCQkJCW5yX29iamVjdHMpOworCWZvciAoaSA9IDA7IGkgPCBucl9vYmplY3RzOyBpKyspIHsKKwkJc3RydWN0IG9iamVjdF9lbnRyeSAqb2JqID0gJm9iamVjdHNbaV07CisJCWRhdGEgPSB1bnBhY2tfcmF3X2VudHJ5KG9iaiwgJmRlbHRhLT5iYXNlKTsKKwkJb2JqLT5yZWFsX3R5cGUgPSBvYmotPnR5cGU7CisJCWlmIChvYmotPnR5cGUgPT0gT0JKX1JFRl9ERUxUQSB8fCBvYmotPnR5cGUgPT0gT0JKX09GU19ERUxUQSkgeworCQkJbnJfZGVsdGFzKys7CisJCQlkZWx0YS0+b2JqX25vID0gaTsKKwkJCWRlbHRhKys7CisJCX0gZWxzZQorCQkJc2hhMV9vYmplY3QoZGF0YSwgb2JqLT5zaXplLCBvYmotPnR5cGUsIG9iai0+aWR4LnNoYTEpOworCQlmcmVlKGRhdGEpOworCQlkaXNwbGF5X3Byb2dyZXNzKHByb2dyZXNzLCBpKzEpOworCX0KKwlvYmplY3RzW2ldLmlkeC5vZmZzZXQgPSBjb25zdW1lZF9ieXRlczsKKwlzdG9wX3Byb2dyZXNzKCZwcm9ncmVzcyk7CisKKwkvKiBDaGVjayBwYWNrIGludGVncml0eSAqLworCWZsdXNoKCk7CisJU0hBMV9GaW5hbChzaGExLCAmaW5wdXRfY3R4KTsKKwlpZiAoaGFzaGNtcChmaWxsKDIwKSwgc2hhMSkpCisJCWRpZSgicGFjayBpcyBjb3JydXB0ZWQgKFNIQTEgbWlzbWF0Y2gpIik7CisJdXNlKDIwKTsKKworCS8qIElmIGlucHV0X2ZkIGlzIGEgZmlsZSwgd2Ugc2hvdWxkIGhhdmUgcmVhY2hlZCBpdHMgZW5kIG5vdy4gKi8KKwlpZiAoZnN0YXQoaW5wdXRfZmQsICZzdCkpCisJCWRpZSgiY2Fubm90IGZzdGF0IHBhY2tmaWxlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKFNfSVNSRUcoc3Quc3RfbW9kZSkgJiYKKwkJCWxzZWVrKGlucHV0X2ZkLCAwLCBTRUVLX0NVUikgLSBpbnB1dF9sZW4gIT0gc3Quc3Rfc2l6ZSkKKwkJZGllKCJwYWNrIGhhcyBqdW5rIGF0IHRoZSBlbmQiKTsKKworCWlmICghbnJfZGVsdGFzKQorCQlyZXR1cm47CisKKwkvKiBTb3J0IGRlbHRhcyBieSBiYXNlIFNIQTEvb2Zmc2V0IGZvciBmYXN0IHNlYXJjaGluZyAqLworCXFzb3J0KGRlbHRhcywgbnJfZGVsdGFzLCBzaXplb2Yoc3RydWN0IGRlbHRhX2VudHJ5KSwKKwkgICAgICBjb21wYXJlX2RlbHRhX2VudHJ5KTsKKworCS8qCisJICogU2Vjb25kIHBhc3M6CisJICogLSBmb3IgYWxsIG5vbi1kZWx0YSBvYmplY3RzLCBsb29rIGlmIGl0IGlzIHVzZWQgYXMgYSBiYXNlIGZvcgorCSAqICAgZGVsdGFzOworCSAqIC0gaWYgdXNlZCBhcyBhIGJhc2UsIHVuY29tcHJlc3MgdGhlIG9iamVjdCBhbmQgYXBwbHkgYWxsIGRlbHRhcywKKwkgKiAgIHJlY3Vyc2l2ZWx5IGNoZWNraW5nIGlmIHRoZSByZXN1bHRpbmcgb2JqZWN0IGlzIHVzZWQgYXMgYSBiYXNlCisJICogICBmb3Igc29tZSBtb3JlIGRlbHRhcy4KKwkgKi8KKwlpZiAodmVyYm9zZSkKKwkJcHJvZ3Jlc3MgPSBzdGFydF9wcm9ncmVzcygiUmVzb2x2aW5nIGRlbHRhcyIsIG5yX2RlbHRhcyk7CisJZm9yIChpID0gMDsgaSA8IG5yX29iamVjdHM7IGkrKykgeworCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpvYmogPSAmb2JqZWN0c1tpXTsKKwkJdW5pb24gZGVsdGFfYmFzZSBiYXNlOworCQlpbnQgaiwgcmVmLCByZWZfZmlyc3QsIHJlZl9sYXN0LCBvZnMsIG9mc19maXJzdCwgb2ZzX2xhc3Q7CisKKwkJaWYgKG9iai0+dHlwZSA9PSBPQkpfUkVGX0RFTFRBIHx8IG9iai0+dHlwZSA9PSBPQkpfT0ZTX0RFTFRBKQorCQkJY29udGludWU7CisJCWhhc2hjcHkoYmFzZS5zaGExLCBvYmotPmlkeC5zaGExKTsKKwkJcmVmID0gIWZpbmRfZGVsdGFfY2hpbGRyZW4oJmJhc2UsICZyZWZfZmlyc3QsICZyZWZfbGFzdCk7CisJCW1lbXNldCgmYmFzZSwgMCwgc2l6ZW9mKGJhc2UpKTsKKwkJYmFzZS5vZmZzZXQgPSBvYmotPmlkeC5vZmZzZXQ7CisJCW9mcyA9ICFmaW5kX2RlbHRhX2NoaWxkcmVuKCZiYXNlLCAmb2ZzX2ZpcnN0LCAmb2ZzX2xhc3QpOworCQlpZiAoIXJlZiAmJiAhb2ZzKQorCQkJY29udGludWU7CisJCWRhdGEgPSBnZXRfZGF0YV9mcm9tX3BhY2sob2JqKTsKKwkJaWYgKHJlZikKKwkJCWZvciAoaiA9IHJlZl9maXJzdDsgaiA8PSByZWZfbGFzdDsgaisrKSB7CisJCQkJc3RydWN0IG9iamVjdF9lbnRyeSAqY2hpbGQgPSBvYmplY3RzICsgZGVsdGFzW2pdLm9ial9ubzsKKwkJCQlpZiAoY2hpbGQtPnJlYWxfdHlwZSA9PSBPQkpfUkVGX0RFTFRBKQorCQkJCQlyZXNvbHZlX2RlbHRhKGNoaWxkLCBkYXRhLAorCQkJCQkJICAgICAgb2JqLT5zaXplLCBvYmotPnR5cGUpOworCQkJfQorCQlpZiAob2ZzKQorCQkJZm9yIChqID0gb2ZzX2ZpcnN0OyBqIDw9IG9mc19sYXN0OyBqKyspIHsKKwkJCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpjaGlsZCA9IG9iamVjdHMgKyBkZWx0YXNbal0ub2JqX25vOworCQkJCWlmIChjaGlsZC0+cmVhbF90eXBlID09IE9CSl9PRlNfREVMVEEpCisJCQkJCXJlc29sdmVfZGVsdGEoY2hpbGQsIGRhdGEsCisJCQkJCQkgICAgICBvYmotPnNpemUsIG9iai0+dHlwZSk7CisJCQl9CisJCWZyZWUoZGF0YSk7CisJCWRpc3BsYXlfcHJvZ3Jlc3MocHJvZ3Jlc3MsIG5yX3Jlc29sdmVkX2RlbHRhcyk7CisJfQorfQorCitzdGF0aWMgaW50IHdyaXRlX2NvbXByZXNzZWQoaW50IGZkLCB2b2lkICppbiwgdW5zaWduZWQgaW50IHNpemUsIHVpbnQzMl90ICpvYmpfY3JjKQoreworCXpfc3RyZWFtIHN0cmVhbTsKKwl1bnNpZ25lZCBsb25nIG1heHNpemU7CisJdm9pZCAqb3V0OworCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlkZWZsYXRlSW5pdCgmc3RyZWFtLCB6bGliX2NvbXByZXNzaW9uX2xldmVsKTsKKwltYXhzaXplID0gZGVmbGF0ZUJvdW5kKCZzdHJlYW0sIHNpemUpOworCW91dCA9IHhtYWxsb2MobWF4c2l6ZSk7CisKKwkvKiBDb21wcmVzcyBpdCAqLworCXN0cmVhbS5uZXh0X2luID0gaW47CisJc3RyZWFtLmF2YWlsX2luID0gc2l6ZTsKKwlzdHJlYW0ubmV4dF9vdXQgPSBvdXQ7CisJc3RyZWFtLmF2YWlsX291dCA9IG1heHNpemU7CisJd2hpbGUgKGRlZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpID09IFpfT0spOworCWRlZmxhdGVFbmQoJnN0cmVhbSk7CisKKwlzaXplID0gc3RyZWFtLnRvdGFsX291dDsKKwl3cml0ZV9vcl9kaWUoZmQsIG91dCwgc2l6ZSk7CisJKm9ial9jcmMgPSBjcmMzMigqb2JqX2NyYywgb3V0LCBzaXplKTsKKwlmcmVlKG91dCk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyB2b2lkIGFwcGVuZF9vYmpfdG9fcGFjayhjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCB2b2lkICpidWYsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCBlbnVtIG9iamVjdF90eXBlIHR5cGUpCit7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqb2JqID0gJm9iamVjdHNbbnJfb2JqZWN0cysrXTsKKwl1bnNpZ25lZCBjaGFyIGhlYWRlclsxMF07CisJdW5zaWduZWQgbG9uZyBzID0gc2l6ZTsKKwlpbnQgbiA9IDA7CisJdW5zaWduZWQgY2hhciBjID0gKHR5cGUgPDwgNCkgfCAocyAmIDE1KTsKKwlzID4+PSA0OworCXdoaWxlIChzKSB7CisJCWhlYWRlcltuKytdID0gYyB8IDB4ODA7CisJCWMgPSBzICYgMHg3ZjsKKwkJcyA+Pj0gNzsKKwl9CisJaGVhZGVyW24rK10gPSBjOworCXdyaXRlX29yX2RpZShvdXRwdXRfZmQsIGhlYWRlciwgbik7CisJb2JqWzBdLmlkeC5jcmMzMiA9IGNyYzMyKDAsIFpfTlVMTCwgMCk7CisJb2JqWzBdLmlkeC5jcmMzMiA9IGNyYzMyKG9ialswXS5pZHguY3JjMzIsIGhlYWRlciwgbik7CisJb2JqWzFdLmlkeC5vZmZzZXQgPSBvYmpbMF0uaWR4Lm9mZnNldCArIG47CisJb2JqWzFdLmlkeC5vZmZzZXQgKz0gd3JpdGVfY29tcHJlc3NlZChvdXRwdXRfZmQsIGJ1Ziwgc2l6ZSwgJm9ialswXS5pZHguY3JjMzIpOworCWhhc2hjcHkob2JqLT5pZHguc2hhMSwgc2hhMSk7Cit9CisKK3N0YXRpYyBpbnQgZGVsdGFfcG9zX2NvbXBhcmUoY29uc3Qgdm9pZCAqX2EsIGNvbnN0IHZvaWQgKl9iKQoreworCXN0cnVjdCBkZWx0YV9lbnRyeSAqYSA9ICooc3RydWN0IGRlbHRhX2VudHJ5ICoqKV9hOworCXN0cnVjdCBkZWx0YV9lbnRyeSAqYiA9ICooc3RydWN0IGRlbHRhX2VudHJ5ICoqKV9iOworCXJldHVybiBhLT5vYmpfbm8gLSBiLT5vYmpfbm87Cit9CisKK3N0YXRpYyB2b2lkIGZpeF91bnJlc29sdmVkX2RlbHRhcyhpbnQgbnJfdW5yZXNvbHZlZCkKK3sKKwlzdHJ1Y3QgZGVsdGFfZW50cnkgKipzb3J0ZWRfYnlfcG9zOworCWludCBpLCBuID0gMDsKKworCS8qCisJICogU2luY2UgbWFueSB1bnJlc29sdmVkIGRlbHRhcyBtYXkgd2VsbCBiZSB0aGVtc2VsdmVzIGJhc2Ugb2JqZWN0cworCSAqIGZvciBtb3JlIHVucmVzb2x2ZWQgZGVsdGFzLCB3ZSByZWFsbHkgd2FudCB0byBpbmNsdWRlIHRoZQorCSAqIHNtYWxsZXN0IG51bWJlciBvZiBiYXNlIG9iamVjdHMgdGhhdCB3b3VsZCBjb3ZlciBhcyBtdWNoIGRlbHRhCisJICogYXMgcG9zc2libGUgYnkgcGlja2luZyB0aGUKKwkgKiB0cnVuYyBkZWx0YXMgZmlyc3QsIGFsbG93aW5nIGZvciBvdGhlciBkZWx0YXMgdG8gcmVzb2x2ZSB3aXRob3V0CisJICogYWRkaXRpb25hbCBiYXNlIG9iamVjdHMuICBTaW5jZSBtb3N0IGJhc2Ugb2JqZWN0cyBhcmUgdG8gYmUgZm91bmQKKwkgKiBiZWZvcmUgZGVsdGFzIGRlcGVuZGluZyBvbiB0aGVtLCBhIGdvb2QgaGV1cmlzdGljIGlzIHRvIHN0YXJ0CisJICogcmVzb2x2aW5nIGRlbHRhcyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGVpciBwb3NpdGlvbiBpbiB0aGUgcGFjay4KKwkgKi8KKwlzb3J0ZWRfYnlfcG9zID0geG1hbGxvYyhucl91bnJlc29sdmVkICogc2l6ZW9mKCpzb3J0ZWRfYnlfcG9zKSk7CisJZm9yIChpID0gMDsgaSA8IG5yX2RlbHRhczsgaSsrKSB7CisJCWlmIChvYmplY3RzW2RlbHRhc1tpXS5vYmpfbm9dLnJlYWxfdHlwZSAhPSBPQkpfUkVGX0RFTFRBKQorCQkJY29udGludWU7CisJCXNvcnRlZF9ieV9wb3NbbisrXSA9ICZkZWx0YXNbaV07CisJfQorCXFzb3J0KHNvcnRlZF9ieV9wb3MsIG4sIHNpemVvZigqc29ydGVkX2J5X3BvcyksIGRlbHRhX3Bvc19jb21wYXJlKTsKKworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJc3RydWN0IGRlbHRhX2VudHJ5ICpkID0gc29ydGVkX2J5X3Bvc1tpXTsKKwkJdm9pZCAqZGF0YTsKKwkJdW5zaWduZWQgbG9uZyBzaXplOworCQllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJCWludCBqLCBmaXJzdCwgbGFzdDsKKworCQlpZiAob2JqZWN0c1tkLT5vYmpfbm9dLnJlYWxfdHlwZSAhPSBPQkpfUkVGX0RFTFRBKQorCQkJY29udGludWU7CisJCWRhdGEgPSByZWFkX3NoYTFfZmlsZShkLT5iYXNlLnNoYTEsICZ0eXBlLCAmc2l6ZSk7CisJCWlmICghZGF0YSkKKwkJCWNvbnRpbnVlOworCisJCWZpbmRfZGVsdGFfY2hpbGRyZW4oJmQtPmJhc2UsICZmaXJzdCwgJmxhc3QpOworCQlmb3IgKGogPSBmaXJzdDsgaiA8PSBsYXN0OyBqKyspIHsKKwkJCXN0cnVjdCBvYmplY3RfZW50cnkgKmNoaWxkID0gb2JqZWN0cyArIGRlbHRhc1tqXS5vYmpfbm87CisJCQlpZiAoY2hpbGQtPnJlYWxfdHlwZSA9PSBPQkpfUkVGX0RFTFRBKQorCQkJCXJlc29sdmVfZGVsdGEoY2hpbGQsIGRhdGEsIHNpemUsIHR5cGUpOworCQl9CisKKwkJaWYgKGNoZWNrX3NoYTFfc2lnbmF0dXJlKGQtPmJhc2Uuc2hhMSwgZGF0YSwgc2l6ZSwgdHlwZW5hbWUodHlwZSkpKQorCQkJZGllKCJsb2NhbCBvYmplY3QgJXMgaXMgY29ycnVwdCIsIHNoYTFfdG9faGV4KGQtPmJhc2Uuc2hhMSkpOworCQlhcHBlbmRfb2JqX3RvX3BhY2soZC0+YmFzZS5zaGExLCBkYXRhLCBzaXplLCB0eXBlKTsKKwkJZnJlZShkYXRhKTsKKwkJZGlzcGxheV9wcm9ncmVzcyhwcm9ncmVzcywgbnJfcmVzb2x2ZWRfZGVsdGFzKTsKKwl9CisJZnJlZShzb3J0ZWRfYnlfcG9zKTsKK30KKworc3RhdGljIHZvaWQgZmluYWwoY29uc3QgY2hhciAqZmluYWxfcGFja19uYW1lLCBjb25zdCBjaGFyICpjdXJyX3BhY2tfbmFtZSwKKwkJICBjb25zdCBjaGFyICpmaW5hbF9pbmRleF9uYW1lLCBjb25zdCBjaGFyICpjdXJyX2luZGV4X25hbWUsCisJCSAgY29uc3QgY2hhciAqa2VlcF9uYW1lLCBjb25zdCBjaGFyICprZWVwX21zZywKKwkJICB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWNvbnN0IGNoYXIgKnJlcG9ydCA9ICJwYWNrIjsKKwljaGFyIG5hbWVbUEFUSF9NQVhdOworCWludCBlcnI7CisKKwlpZiAoIWZyb21fc3RkaW4pIHsKKwkJY2xvc2UoaW5wdXRfZmQpOworCX0gZWxzZSB7CisJCWVyciA9IGNsb3NlKG91dHB1dF9mZCk7CisJCWlmIChlcnIpCisJCQlkaWUoImVycm9yIHdoaWxlIGNsb3NpbmcgcGFjayBmaWxlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWNobW9kKGN1cnJfcGFja19uYW1lLCAwNDQ0KTsKKwl9CisKKwlpZiAoa2VlcF9tc2cpIHsKKwkJaW50IGtlZXBfZmQsIGtlZXBfbXNnX2xlbiA9IHN0cmxlbihrZWVwX21zZyk7CisJCWlmICgha2VlcF9uYW1lKSB7CisJCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcy9wYWNrL3BhY2stJXMua2VlcCIsCisJCQkJIGdldF9vYmplY3RfZGlyZWN0b3J5KCksIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJCWtlZXBfbmFtZSA9IG5hbWU7CisJCX0KKwkJa2VlcF9mZCA9IG9wZW4oa2VlcF9uYW1lLCBPX1JEV1J8T19DUkVBVHxPX0VYQ0wsIDA2MDApOworCQlpZiAoa2VlcF9mZCA8IDApIHsKKwkJCWlmIChlcnJubyAhPSBFRVhJU1QpCisJCQkJZGllKCJjYW5ub3Qgd3JpdGUga2VlcCBmaWxlIik7CisJCX0gZWxzZSB7CisJCQlpZiAoa2VlcF9tc2dfbGVuID4gMCkgeworCQkJCXdyaXRlX29yX2RpZShrZWVwX2ZkLCBrZWVwX21zZywga2VlcF9tc2dfbGVuKTsKKwkJCQl3cml0ZV9vcl9kaWUoa2VlcF9mZCwgIlxuIiwgMSk7CisJCQl9CisJCQlpZiAoY2xvc2Uoa2VlcF9mZCkgIT0gMCkKKwkJCQlkaWUoImNhbm5vdCB3cml0ZSBrZWVwIGZpbGUiKTsKKwkJCXJlcG9ydCA9ICJrZWVwIjsKKwkJfQorCX0KKworCWlmIChmaW5hbF9wYWNrX25hbWUgIT0gY3Vycl9wYWNrX25hbWUpIHsKKwkJaWYgKCFmaW5hbF9wYWNrX25hbWUpIHsKKwkJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzL3BhY2svcGFjay0lcy5wYWNrIiwKKwkJCQkgZ2V0X29iamVjdF9kaXJlY3RvcnkoKSwgc2hhMV90b19oZXgoc2hhMSkpOworCQkJZmluYWxfcGFja19uYW1lID0gbmFtZTsKKwkJfQorCQlpZiAobW92ZV90ZW1wX3RvX2ZpbGUoY3Vycl9wYWNrX25hbWUsIGZpbmFsX3BhY2tfbmFtZSkpCisJCQlkaWUoImNhbm5vdCBzdG9yZSBwYWNrIGZpbGUiKTsKKwl9CisKKwljaG1vZChjdXJyX2luZGV4X25hbWUsIDA0NDQpOworCWlmIChmaW5hbF9pbmRleF9uYW1lICE9IGN1cnJfaW5kZXhfbmFtZSkgeworCQlpZiAoIWZpbmFsX2luZGV4X25hbWUpIHsKKwkJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzL3BhY2svcGFjay0lcy5pZHgiLAorCQkJCSBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpLCBzaGExX3RvX2hleChzaGExKSk7CisJCQlmaW5hbF9pbmRleF9uYW1lID0gbmFtZTsKKwkJfQorCQlpZiAobW92ZV90ZW1wX3RvX2ZpbGUoY3Vycl9pbmRleF9uYW1lLCBmaW5hbF9pbmRleF9uYW1lKSkKKwkJCWRpZSgiY2Fubm90IHN0b3JlIGluZGV4IGZpbGUiKTsKKwl9CisKKwlpZiAoIWZyb21fc3RkaW4pIHsKKwkJcHJpbnRmKCIlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOworCX0gZWxzZSB7CisJCWNoYXIgYnVmWzQ4XTsKKwkJaW50IGxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlc1x0JXNcbiIsCisJCQkJICAgcmVwb3J0LCBzaGExX3RvX2hleChzaGExKSk7CisJCXdyaXRlX29yX2RpZSgxLCBidWYsIGxlbik7CisKKwkJLyoKKwkJICogTGV0J3MganVzdCBtaW1pYyBnaXQtdW5wYWNrLW9iamVjdHMgaGVyZSBhbmQgd3JpdGUKKwkJICogdGhlIGxhc3QgcGFydCBvZiB0aGUgaW5wdXQgYnVmZmVyIHRvIHN0ZG91dC4KKwkJICovCisJCXdoaWxlIChpbnB1dF9sZW4pIHsKKwkJCWVyciA9IHh3cml0ZSgxLCBpbnB1dF9idWZmZXIgKyBpbnB1dF9vZmZzZXQsIGlucHV0X2xlbik7CisJCQlpZiAoZXJyIDw9IDApCisJCQkJYnJlYWs7CisJCQlpbnB1dF9sZW4gLT0gZXJyOworCQkJaW5wdXRfb2Zmc2V0ICs9IGVycjsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBnaXRfaW5kZXhfcGFja19jb25maWcoY29uc3QgY2hhciAqaywgY29uc3QgY2hhciAqdikKK3sKKwlpZiAoIXN0cmNtcChrLCAicGFjay5pbmRleHZlcnNpb24iKSkgeworCQlwYWNrX2lkeF9kZWZhdWx0X3ZlcnNpb24gPSBnaXRfY29uZmlnX2ludChrLCB2KTsKKwkJaWYgKHBhY2tfaWR4X2RlZmF1bHRfdmVyc2lvbiA+IDIpCisJCQlkaWUoImJhZCBwYWNrLmluZGV4dmVyc2lvbj0lZCIsIHBhY2tfaWR4X2RlZmF1bHRfdmVyc2lvbik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gZ2l0X2RlZmF1bHRfY29uZmlnKGssIHYpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGksIGZpeF90aGluX3BhY2sgPSAwOworCWNoYXIgKmN1cnJfcGFjaywgKnBhY2tfbmFtZSA9IE5VTEw7CisJY2hhciAqY3Vycl9pbmRleCwgKmluZGV4X25hbWUgPSBOVUxMOworCWNvbnN0IGNoYXIgKmtlZXBfbmFtZSA9IE5VTEwsICprZWVwX21zZyA9IE5VTEw7CisJY2hhciAqaW5kZXhfbmFtZV9idWYgPSBOVUxMLCAqa2VlcF9uYW1lX2J1ZiA9IE5VTEw7CisJc3RydWN0IHBhY2tfaWR4X2VudHJ5ICoqaWR4X29iamVjdHM7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKworCWdpdF9jb25maWcoZ2l0X2luZGV4X3BhY2tfY29uZmlnKTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoKmFyZyA9PSAnLScpIHsKKwkJCWlmICghc3RyY21wKGFyZywgIi0tc3RkaW4iKSkgeworCQkJCWZyb21fc3RkaW4gPSAxOworCQkJfSBlbHNlIGlmICghc3RyY21wKGFyZywgIi0tZml4LXRoaW4iKSkgeworCQkJCWZpeF90aGluX3BhY2sgPSAxOworCQkJfSBlbHNlIGlmICghc3RyY21wKGFyZywgIi0tc3RyaWN0IikpIHsKKwkJCQlzdHJpY3QgPSAxOworCQkJfSBlbHNlIGlmICghc3RyY21wKGFyZywgIi0ta2VlcCIpKSB7CisJCQkJa2VlcF9tc2cgPSAiIjsKKwkJCX0gZWxzZSBpZiAoIXByZWZpeGNtcChhcmcsICItLWtlZXA9IikpIHsKKwkJCQlrZWVwX21zZyA9IGFyZyArIDc7CisJCQl9IGVsc2UgaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1wYWNrX2hlYWRlcj0iKSkgeworCQkJCXN0cnVjdCBwYWNrX2hlYWRlciAqaGRyOworCQkJCWNoYXIgKmM7CisKKwkJCQloZHIgPSAoc3RydWN0IHBhY2tfaGVhZGVyICopaW5wdXRfYnVmZmVyOworCQkJCWhkci0+aGRyX3NpZ25hdHVyZSA9IGh0b25sKFBBQ0tfU0lHTkFUVVJFKTsKKwkJCQloZHItPmhkcl92ZXJzaW9uID0gaHRvbmwoc3RydG91bChhcmcgKyAxNCwgJmMsIDEwKSk7CisJCQkJaWYgKCpjICE9ICcsJykKKwkJCQkJZGllKCJiYWQgJXMiLCBhcmcpOworCQkJCWhkci0+aGRyX2VudHJpZXMgPSBodG9ubChzdHJ0b3VsKGMgKyAxLCAmYywgMTApKTsKKwkJCQlpZiAoKmMpCisJCQkJCWRpZSgiYmFkICVzIiwgYXJnKTsKKwkJCQlpbnB1dF9sZW4gPSBzaXplb2YoKmhkcik7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLXYiKSkgeworCQkJCXZlcmJvc2UgPSAxOworCQkJfSBlbHNlIGlmICghc3RyY21wKGFyZywgIi1vIikpIHsKKwkJCQlpZiAoaW5kZXhfbmFtZSB8fCAoaSsxKSA+PSBhcmdjKQorCQkJCQl1c2FnZShpbmRleF9wYWNrX3VzYWdlKTsKKwkJCQlpbmRleF9uYW1lID0gYXJndlsrK2ldOworCQkJfSBlbHNlIGlmICghcHJlZml4Y21wKGFyZywgIi0taW5kZXgtdmVyc2lvbj0iKSkgeworCQkJCWNoYXIgKmM7CisJCQkJcGFja19pZHhfZGVmYXVsdF92ZXJzaW9uID0gc3RydG91bChhcmcgKyAxNiwgJmMsIDEwKTsKKwkJCQlpZiAocGFja19pZHhfZGVmYXVsdF92ZXJzaW9uID4gMikKKwkJCQkJZGllKCJiYWQgJXMiLCBhcmcpOworCQkJCWlmICgqYyA9PSAnLCcpCisJCQkJCXBhY2tfaWR4X29mZjMyX2xpbWl0ID0gc3RydG91bChjKzEsICZjLCAwKTsKKwkJCQlpZiAoKmMgfHwgcGFja19pZHhfb2ZmMzJfbGltaXQgJiAweDgwMDAwMDAwKQorCQkJCQlkaWUoImJhZCAlcyIsIGFyZyk7CisJCQl9IGVsc2UKKwkJCQl1c2FnZShpbmRleF9wYWNrX3VzYWdlKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHBhY2tfbmFtZSkKKwkJCXVzYWdlKGluZGV4X3BhY2tfdXNhZ2UpOworCQlwYWNrX25hbWUgPSBhcmc7CisJfQorCisJaWYgKCFwYWNrX25hbWUgJiYgIWZyb21fc3RkaW4pCisJCXVzYWdlKGluZGV4X3BhY2tfdXNhZ2UpOworCWlmIChmaXhfdGhpbl9wYWNrICYmICFmcm9tX3N0ZGluKQorCQlkaWUoIi0tZml4LXRoaW4gY2Fubm90IGJlIHVzZWQgd2l0aG91dCAtLXN0ZGluIik7CisJaWYgKCFpbmRleF9uYW1lICYmIHBhY2tfbmFtZSkgeworCQlpbnQgbGVuID0gc3RybGVuKHBhY2tfbmFtZSk7CisJCWlmICghaGFzX2V4dGVuc2lvbihwYWNrX25hbWUsICIucGFjayIpKQorCQkJZGllKCJwYWNrZmlsZSBuYW1lICclcycgZG9lcyBub3QgZW5kIHdpdGggJy5wYWNrJyIsCisJCQkgICAgcGFja19uYW1lKTsKKwkJaW5kZXhfbmFtZV9idWYgPSB4bWFsbG9jKGxlbik7CisJCW1lbWNweShpbmRleF9uYW1lX2J1ZiwgcGFja19uYW1lLCBsZW4gLSA1KTsKKwkJc3RyY3B5KGluZGV4X25hbWVfYnVmICsgbGVuIC0gNSwgIi5pZHgiKTsKKwkJaW5kZXhfbmFtZSA9IGluZGV4X25hbWVfYnVmOworCX0KKwlpZiAoa2VlcF9tc2cgJiYgIWtlZXBfbmFtZSAmJiBwYWNrX25hbWUpIHsKKwkJaW50IGxlbiA9IHN0cmxlbihwYWNrX25hbWUpOworCQlpZiAoIWhhc19leHRlbnNpb24ocGFja19uYW1lLCAiLnBhY2siKSkKKwkJCWRpZSgicGFja2ZpbGUgbmFtZSAnJXMnIGRvZXMgbm90IGVuZCB3aXRoICcucGFjayciLAorCQkJICAgIHBhY2tfbmFtZSk7CisJCWtlZXBfbmFtZV9idWYgPSB4bWFsbG9jKGxlbik7CisJCW1lbWNweShrZWVwX25hbWVfYnVmLCBwYWNrX25hbWUsIGxlbiAtIDUpOworCQlzdHJjcHkoa2VlcF9uYW1lX2J1ZiArIGxlbiAtIDUsICIua2VlcCIpOworCQlrZWVwX25hbWUgPSBrZWVwX25hbWVfYnVmOworCX0KKworCWN1cnJfcGFjayA9IG9wZW5fcGFja19maWxlKHBhY2tfbmFtZSk7CisJcGFyc2VfcGFja19oZWFkZXIoKTsKKwlvYmplY3RzID0geG1hbGxvYygobnJfb2JqZWN0cyArIDEpICogc2l6ZW9mKHN0cnVjdCBvYmplY3RfZW50cnkpKTsKKwlkZWx0YXMgPSB4bWFsbG9jKG5yX29iamVjdHMgKiBzaXplb2Yoc3RydWN0IGRlbHRhX2VudHJ5KSk7CisJcGFyc2VfcGFja19vYmplY3RzKHNoYTEpOworCWlmIChucl9kZWx0YXMgPT0gbnJfcmVzb2x2ZWRfZGVsdGFzKSB7CisJCXN0b3BfcHJvZ3Jlc3MoJnByb2dyZXNzKTsKKwkJLyogRmx1c2ggcmVtYWluaW5nIHBhY2sgZmluYWwgMjAtYnl0ZSBTSEExLiAqLworCQlmbHVzaCgpOworCX0gZWxzZSB7CisJCWlmIChmaXhfdGhpbl9wYWNrKSB7CisJCQljaGFyIG1zZ1s0OF07CisJCQlpbnQgbnJfdW5yZXNvbHZlZCA9IG5yX2RlbHRhcyAtIG5yX3Jlc29sdmVkX2RlbHRhczsKKwkJCWludCBucl9vYmplY3RzX2luaXRpYWwgPSBucl9vYmplY3RzOworCQkJaWYgKG5yX3VucmVzb2x2ZWQgPD0gMCkKKwkJCQlkaWUoImNvbmZ1c2lvbiBiZXlvbmQgaW5zYW5pdHkiKTsKKwkJCW9iamVjdHMgPSB4cmVhbGxvYyhvYmplY3RzLAorCQkJCQkgICAobnJfb2JqZWN0cyArIG5yX3VucmVzb2x2ZWQgKyAxKQorCQkJCQkgICAqIHNpemVvZigqb2JqZWN0cykpOworCQkJZml4X3VucmVzb2x2ZWRfZGVsdGFzKG5yX3VucmVzb2x2ZWQpOworCQkJc3ByaW50Zihtc2csICJjb21wbGV0ZWQgd2l0aCAlZCBsb2NhbCBvYmplY3RzIiwKKwkJCQlucl9vYmplY3RzIC0gbnJfb2JqZWN0c19pbml0aWFsKTsKKwkJCXN0b3BfcHJvZ3Jlc3NfbXNnKCZwcm9ncmVzcywgbXNnKTsKKwkJCWZpeHVwX3BhY2tfaGVhZGVyX2Zvb3RlcihvdXRwdXRfZmQsIHNoYTEsCisJCQkJCQkgY3Vycl9wYWNrLCBucl9vYmplY3RzKTsKKwkJfQorCQlpZiAobnJfZGVsdGFzICE9IG5yX3Jlc29sdmVkX2RlbHRhcykKKwkJCWRpZSgicGFjayBoYXMgJWQgdW5yZXNvbHZlZCBkZWx0YXMiLAorCQkJICAgIG5yX2RlbHRhcyAtIG5yX3Jlc29sdmVkX2RlbHRhcyk7CisJfQorCWZyZWUoZGVsdGFzKTsKKwlpZiAoc3RyaWN0KQorCQljaGVja19vYmplY3RzKCk7CisKKwlpZHhfb2JqZWN0cyA9IHhtYWxsb2MoKG5yX29iamVjdHMpICogc2l6ZW9mKHN0cnVjdCBwYWNrX2lkeF9lbnRyeSAqKSk7CisJZm9yIChpID0gMDsgaSA8IG5yX29iamVjdHM7IGkrKykKKwkJaWR4X29iamVjdHNbaV0gPSAmb2JqZWN0c1tpXS5pZHg7CisJY3Vycl9pbmRleCA9IHdyaXRlX2lkeF9maWxlKGluZGV4X25hbWUsIGlkeF9vYmplY3RzLCBucl9vYmplY3RzLCBzaGExKTsKKwlmcmVlKGlkeF9vYmplY3RzKTsKKworCWZpbmFsKHBhY2tfbmFtZSwgY3Vycl9wYWNrLAorCQlpbmRleF9uYW1lLCBjdXJyX2luZGV4LAorCQlrZWVwX25hbWUsIGtlZXBfbXNnLAorCQlzaGExKTsKKwlmcmVlKG9iamVjdHMpOworCWZyZWUoaW5kZXhfbmFtZV9idWYpOworCWZyZWUoa2VlcF9uYW1lX2J1Zik7CisJaWYgKHBhY2tfbmFtZSA9PSBOVUxMKQorCQlmcmVlKGN1cnJfcGFjayk7CisJaWYgKGluZGV4X25hbWUgPT0gTlVMTCkKKwkJZnJlZShjdXJyX2luZGV4KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvaW50ZXJwb2xhdGUuYyBiL2ludGVycG9sYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwM2JkOQotLS0gL2Rldi9udWxsCisrKyBiL2ludGVycG9sYXRlLmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNiBKb24gTG9lbGlnZXIKKyAqLworCisjaW5jbHVkZSAiZ2l0LWNvbXBhdC11dGlsLmgiCisjaW5jbHVkZSAiaW50ZXJwb2xhdGUuaCIKKworCit2b2lkIGludGVycF9zZXRfZW50cnkoc3RydWN0IGludGVycCAqdGFibGUsIGludCBzbG90LCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwljaGFyICpvbGR2YWwgPSB0YWJsZVtzbG90XS52YWx1ZTsKKwljaGFyICpuZXd2YWwgPSBOVUxMOworCisJZnJlZShvbGR2YWwpOworCisJaWYgKHZhbHVlKQorCQluZXd2YWwgPSB4c3RyZHVwKHZhbHVlKTsKKworCXRhYmxlW3Nsb3RdLnZhbHVlID0gbmV3dmFsOworfQorCisKK3ZvaWQgaW50ZXJwX2NsZWFyX3RhYmxlKHN0cnVjdCBpbnRlcnAgKnRhYmxlLCBpbnQgbmludGVycHMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmludGVycHM7IGkrKykgeworCQlpbnRlcnBfc2V0X2VudHJ5KHRhYmxlLCBpLCBOVUxMKTsKKwl9Cit9CisKKworLyoKKyAqIENvbnZlcnQgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcgaW4gYnVmZmVyIG9yaWcKKyAqIGludG8gdGhlIHN1cHBsaWVkIGJ1ZmZlciwgcmVzdWx0LCB3aG9zZSBsZW5ndGggaXMgcmVzbGVuLAorICogcGVyZm9ybWluZyBzdWJzdGl0dXRpb25zIG9uICUtbmFtZWQgc3ViLXN0cmluZ3MgZnJvbQorICogdGhlIHRhYmxlLCBpbnRlcnBzLCB3aXRoIG5pbnRlcnBzIGVudHJpZXMuCisgKgorICogRXhhbXBsZSBpbnRlcnBzOgorICogICAgeworICogICAgICAgIHsgIiVIIiwgImV4YW1wbGUub3JnIn0sCisgKiAgICAgICAgeyAiJXBvcnQiLCAiMTIzIn0sCisgKiAgICAgICAgeyAiJSUiLCAiJSJ9LAorICogICAgfQorICoKKyAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgc3Vic3RpdHV0ZWQgc3RyaW5nIChub3QgaW5jbHVkaW5nIHRoZSBmaW5hbCBcMCkuCisgKiBMaWtlIHdpdGggc25wcmludGYsIGlmIHRoZSByZXN1bHQgaXMgPj0gcmVzbGVuLCB0aGVuIGl0IG92ZXJmbG93ZWQuCisgKi8KKwordW5zaWduZWQgbG9uZyBpbnRlcnBvbGF0ZShjaGFyICpyZXN1bHQsIHVuc2lnbmVkIGxvbmcgcmVzbGVuLAorCQljb25zdCBjaGFyICpvcmlnLAorCQljb25zdCBzdHJ1Y3QgaW50ZXJwICppbnRlcnBzLCBpbnQgbmludGVycHMpCit7CisJY29uc3QgY2hhciAqc3JjID0gb3JpZzsKKwljaGFyICpkZXN0ID0gcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgbmV3bGVuID0gMDsKKwljb25zdCBjaGFyICpuYW1lLCAqdmFsdWU7CisJdW5zaWduZWQgbG9uZyBuYW1lbGVuLCB2YWx1ZWxlbjsKKwlpbnQgaTsKKwljaGFyIGM7CisKKwl3aGlsZSAoKGMgPSAqc3JjKSkgeworCQlpZiAoYyA9PSAnJScpIHsKKwkJCS8qIFRyeSB0byBtYXRjaCBhbiBpbnRlcnBvbGF0aW9uIHN0cmluZy4gKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBuaW50ZXJwczsgaSsrKSB7CisJCQkJbmFtZSA9IGludGVycHNbaV0ubmFtZTsKKwkJCQluYW1lbGVuID0gc3RybGVuKG5hbWUpOworCQkJCWlmIChzdHJuY21wKHNyYywgbmFtZSwgbmFtZWxlbikgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIENoZWNrIGZvciB2YWxpZCBpbnRlcnBvbGF0aW9uLiAqLworCQkJaWYgKGkgPCBuaW50ZXJwcykgeworCQkJCXZhbHVlID0gaW50ZXJwc1tpXS52YWx1ZTsKKwkJCQlpZiAoIXZhbHVlKSB7CisJCQkJCXNyYyArPSBuYW1lbGVuOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQl2YWx1ZWxlbiA9IHN0cmxlbih2YWx1ZSk7CisJCQkJaWYgKG5ld2xlbiArIHZhbHVlbGVuIDwgcmVzbGVuKSB7CisJCQkJCS8qIFN1YnN0aXR1dGUuICovCisJCQkJCW1lbWNweShkZXN0LCB2YWx1ZSwgdmFsdWVsZW4pOworCQkJCQlkZXN0ICs9IHZhbHVlbGVuOworCQkJCX0KKwkJCQluZXdsZW4gKz0gdmFsdWVsZW47CisJCQkJc3JjICs9IG5hbWVsZW47CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJLyogU3RyYWlnaHQgY29weSBvbmUgbm9uLWludGVycG9sYXRpb24gY2hhcmFjdGVyLiAqLworCQlpZiAobmV3bGVuICsgMSA8IHJlc2xlbikKKwkJCSpkZXN0KysgPSAqc3JjOworCQlzcmMrKzsKKwkJbmV3bGVuKys7CisJfQorCisJLyogWFhYOiB0aGUgcHJldmlvdXMgbG9vcCBhbHdheXMga2VlcCByb29tIGZvciB0aGUgZW5kaW5nIE5VTCwKKwkgICB3ZSBqdXN0IG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUgd2FzIHJvb20gZm9yIGEgTlVMIGluIHRoZSBmaXJzdCBwbGFjZSAqLworCWlmIChyZXNsZW4gPiAwKQorCQkqZGVzdCA9ICdcMCc7CisJcmV0dXJuIG5ld2xlbjsKK30KZGlmZiAtLWdpdCBhL2ludGVycG9sYXRlLmggYi9pbnRlcnBvbGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NDA3ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRlcnBvbGF0ZS5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNiBKb24gTG9lbGlnZXIKKyAqLworCisjaWZuZGVmIElOVEVSUE9MQVRFX0gKKyNkZWZpbmUgSU5URVJQT0xBVEVfSAorCisvKgorICogQ29udmVydCBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBpbiBidWZmZXIgb3JpZywKKyAqIHBlcmZvcm1pbmcgc3Vic3RpdHV0aW9ucyBvbiAlLW5hbWVkIHN1Yi1zdHJpbmdzIGZyb20KKyAqIHRoZSBpbnRlcnByZXRhdGlvbiB0YWJsZS4KKyAqLworCitzdHJ1Y3QgaW50ZXJwIHsKKwljb25zdCBjaGFyICpuYW1lOworCWNoYXIgKnZhbHVlOworfTsKKworZXh0ZXJuIHZvaWQgaW50ZXJwX3NldF9lbnRyeShzdHJ1Y3QgaW50ZXJwICp0YWJsZSwgaW50IHNsb3QsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK2V4dGVybiB2b2lkIGludGVycF9jbGVhcl90YWJsZShzdHJ1Y3QgaW50ZXJwICp0YWJsZSwgaW50IG5pbnRlcnBzKTsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50ZXJwb2xhdGUoY2hhciAqcmVzdWx0LCB1bnNpZ25lZCBsb25nIHJlc2xlbiwKKwkJCQkgY29uc3QgY2hhciAqb3JpZywKKwkJCQkgY29uc3Qgc3RydWN0IGludGVycCAqaW50ZXJwcywgaW50IG5pbnRlcnBzKTsKKworI2VuZGlmIC8qIElOVEVSUE9MQVRFX0ggKi8KZGlmZiAtLWdpdCBhL2xpc3Qtb2JqZWN0cy5jIGIvbGlzdC1vYmplY3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiODM3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpc3Qtb2JqZWN0cy5jCkBAIC0wLDAgKzEsMTg0IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJ0cmVlLXdhbGsuaCIKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorI2luY2x1ZGUgImxpc3Qtb2JqZWN0cy5oIgorCitzdGF0aWMgdm9pZCBwcm9jZXNzX2Jsb2Ioc3RydWN0IHJldl9pbmZvICpyZXZzLAorCQkJIHN0cnVjdCBibG9iICpibG9iLAorCQkJIHN0cnVjdCBvYmplY3RfYXJyYXkgKnAsCisJCQkgc3RydWN0IG5hbWVfcGF0aCAqcGF0aCwKKwkJCSBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBvYmplY3QgKm9iaiA9ICZibG9iLT5vYmplY3Q7CisKKwlpZiAoIXJldnMtPmJsb2Jfb2JqZWN0cykKKwkJcmV0dXJuOworCWlmICghb2JqKQorCQlkaWUoImJhZCBibG9iIG9iamVjdCIpOworCWlmIChvYmotPmZsYWdzICYgKFVOSU5URVJFU1RJTkcgfCBTRUVOKSkKKwkJcmV0dXJuOworCW9iai0+ZmxhZ3MgfD0gU0VFTjsKKwluYW1lID0geHN0cmR1cChuYW1lKTsKKwlhZGRfb2JqZWN0KG9iaiwgcCwgcGF0aCwgbmFtZSk7Cit9CisKKy8qCisgKiBQcm9jZXNzaW5nIGEgZ2l0bGluayBlbnRyeSBjdXJyZW50bHkgZG9lcyBub3RoaW5nLCBzaW5jZQorICogd2UgZG8gbm90IHJlY3Vyc2UgaW50byB0aGUgc3VicHJvamVjdC4KKyAqCisgKiBXZSAqY291bGQqIGV2ZW50dWFsbHkgYWRkIGEgZmxhZyB0aGF0IGFjdHVhbGx5IGRvZXMgdGhhdCwKKyAqIHdoaWNoIHdvdWxkIGludm9sdmU6CisgKiAgLSBpcyB0aGUgc3VicHJvamVjdCBhY3R1YWxseSBjaGVja2VkIG91dD8KKyAqICAtIGlmIHNvLCBzZWUgaWYgdGhlIHN1YnByb2plY3QgaGFzIGFscmVhZHkgYmVlbiBhZGRlZAorICogICAgdG8gdGhlIGFsdGVybmF0ZXMgbGlzdCwgYW5kIGFkZCBpdCBpZiBub3QuCisgKiAgLSBwcm9jZXNzIHRoZSBjb21taXQgKG9yIHRhZykgdGhlIGdpdGxpbmsgcG9pbnRzIHRvCisgKiAgICByZWN1cnNpdmVseS4KKyAqCisgKiBIb3dldmVyLCBpdCdzIHVuY2xlYXIgd2hldGhlciB0aGVyZSBpcyByZWFsbHkgZXZlciBhbnkKKyAqIHJlYXNvbiB0byBzZWUgc3VwZXJwcm9qZWN0cyBhbmQgc3VicHJvamVjdHMgYXMgc3VjaCBhCisgKiAidW5pZmllZCIgb2JqZWN0IHBvb2wgKHBvdGVudGlhbGx5IHJlc3VsdGluZyBpbiBhIHRvdGFsbHkKKyAqIGh1bW9uZ291cyBwYWNrIC0gYXZvaWRpbmcgd2hpY2ggd2FzIHRoZSB3aG9sZSBwb2ludCBvZgorICogaGF2aW5nIGdpdGxpbmtzIGluIHRoZSBmaXJzdCBwbGFjZSEpLgorICoKKyAqIFNvIGZvciBub3csIHRoZXJlIGlzIGp1c3QgYSBub3RlIHRoYXQgd2UgKmNvdWxkKiBmb2xsb3cKKyAqIHRoZSBsaW5rLCBhbmQgaG93IHRvIGRvIGl0LiBXaGV0aGVyIGl0IG5lY2Vzc2FyaWx5IG1ha2VzCisgKiBhbnkgc2Vuc2Ugd2hhdC1zby1ldmVyIHRvIGV2ZXIgZG8gdGhhdCBpcyBhbm90aGVyIGlzc3VlLgorICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX2dpdGxpbmsoc3RydWN0IHJldl9pbmZvICpyZXZzLAorCQkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkgICAgc3RydWN0IG9iamVjdF9hcnJheSAqcCwKKwkJCSAgICBzdHJ1Y3QgbmFtZV9wYXRoICpwYXRoLAorCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJLyogTm90aGluZyB0byBkbyAqLworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX3RyZWUoc3RydWN0IHJldl9pbmZvICpyZXZzLAorCQkJIHN0cnVjdCB0cmVlICp0cmVlLAorCQkJIHN0cnVjdCBvYmplY3RfYXJyYXkgKnAsCisJCQkgc3RydWN0IG5hbWVfcGF0aCAqcGF0aCwKKwkJCSBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBvYmplY3QgKm9iaiA9ICZ0cmVlLT5vYmplY3Q7CisJc3RydWN0IHRyZWVfZGVzYyBkZXNjOworCXN0cnVjdCBuYW1lX2VudHJ5IGVudHJ5OworCXN0cnVjdCBuYW1lX3BhdGggbWU7CisKKwlpZiAoIXJldnMtPnRyZWVfb2JqZWN0cykKKwkJcmV0dXJuOworCWlmICghb2JqKQorCQlkaWUoImJhZCB0cmVlIG9iamVjdCIpOworCWlmIChvYmotPmZsYWdzICYgKFVOSU5URVJFU1RJTkcgfCBTRUVOKSkKKwkJcmV0dXJuOworCWlmIChwYXJzZV90cmVlKHRyZWUpIDwgMCkKKwkJZGllKCJiYWQgdHJlZSBvYmplY3QgJXMiLCBzaGExX3RvX2hleChvYmotPnNoYTEpKTsKKwlvYmotPmZsYWdzIHw9IFNFRU47CisJbmFtZSA9IHhzdHJkdXAobmFtZSk7CisJYWRkX29iamVjdChvYmosIHAsIHBhdGgsIG5hbWUpOworCW1lLnVwID0gcGF0aDsKKwltZS5lbGVtID0gbmFtZTsKKwltZS5lbGVtX2xlbiA9IHN0cmxlbihuYW1lKTsKKworCWluaXRfdHJlZV9kZXNjKCZkZXNjLCB0cmVlLT5idWZmZXIsIHRyZWUtPnNpemUpOworCisJd2hpbGUgKHRyZWVfZW50cnkoJmRlc2MsICZlbnRyeSkpIHsKKwkJaWYgKFNfSVNESVIoZW50cnkubW9kZSkpCisJCQlwcm9jZXNzX3RyZWUocmV2cywKKwkJCQkgICAgIGxvb2t1cF90cmVlKGVudHJ5LnNoYTEpLAorCQkJCSAgICAgcCwgJm1lLCBlbnRyeS5wYXRoKTsKKwkJZWxzZSBpZiAoU19JU0dJVExJTksoZW50cnkubW9kZSkpCisJCQlwcm9jZXNzX2dpdGxpbmsocmV2cywgZW50cnkuc2hhMSwKKwkJCQkJcCwgJm1lLCBlbnRyeS5wYXRoKTsKKwkJZWxzZQorCQkJcHJvY2Vzc19ibG9iKHJldnMsCisJCQkJICAgICBsb29rdXBfYmxvYihlbnRyeS5zaGExKSwKKwkJCQkgICAgIHAsICZtZSwgZW50cnkucGF0aCk7CisJfQorCWZyZWUodHJlZS0+YnVmZmVyKTsKKwl0cmVlLT5idWZmZXIgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBtYXJrX2VkZ2VfcGFyZW50c191bmludGVyZXN0aW5nKHN0cnVjdCBjb21taXQgKmNvbW1pdCwKKwkJCQkJICAgIHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJCQkJICAgIHNob3dfZWRnZV9mbiBzaG93X2VkZ2UpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCisJZm9yIChwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOyBwYXJlbnRzOyBwYXJlbnRzID0gcGFyZW50cy0+bmV4dCkgeworCQlzdHJ1Y3QgY29tbWl0ICpwYXJlbnQgPSBwYXJlbnRzLT5pdGVtOworCQlpZiAoIShwYXJlbnQtPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpKQorCQkJY29udGludWU7CisJCW1hcmtfdHJlZV91bmludGVyZXN0aW5nKHBhcmVudC0+dHJlZSk7CisJCWlmIChyZXZzLT5lZGdlX2hpbnQgJiYgIShwYXJlbnQtPm9iamVjdC5mbGFncyAmIFNIT1dOKSkgeworCQkJcGFyZW50LT5vYmplY3QuZmxhZ3MgfD0gU0hPV047CisJCQlzaG93X2VkZ2UocGFyZW50KTsKKwkJfQorCX0KK30KKwordm9pZCBtYXJrX2VkZ2VzX3VuaW50ZXJlc3Rpbmcoc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0LAorCQkJICAgICAgc3RydWN0IHJldl9pbmZvICpyZXZzLAorCQkJICAgICAgc2hvd19lZGdlX2ZuIHNob3dfZWRnZSkKK3sKKwlmb3IgKCA7IGxpc3Q7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxpc3QtPml0ZW07CisKKwkJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykgeworCQkJbWFya190cmVlX3VuaW50ZXJlc3RpbmcoY29tbWl0LT50cmVlKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCW1hcmtfZWRnZV9wYXJlbnRzX3VuaW50ZXJlc3RpbmcoY29tbWl0LCByZXZzLCBzaG93X2VkZ2UpOworCX0KK30KKwordm9pZCB0cmF2ZXJzZV9jb21taXRfbGlzdChzdHJ1Y3QgcmV2X2luZm8gKnJldnMsCisJCQkgIHZvaWQgKCpzaG93X2NvbW1pdCkoc3RydWN0IGNvbW1pdCAqKSwKKwkJCSAgdm9pZCAoKnNob3dfb2JqZWN0KShzdHJ1Y3Qgb2JqZWN0X2FycmF5X2VudHJ5ICopKQoreworCWludCBpOworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwlzdHJ1Y3Qgb2JqZWN0X2FycmF5IG9iamVjdHMgPSB7IDAsIDAsIE5VTEwgfTsKKworCXdoaWxlICgoY29tbWl0ID0gZ2V0X3JldmlzaW9uKHJldnMpKSAhPSBOVUxMKSB7CisJCXByb2Nlc3NfdHJlZShyZXZzLCBjb21taXQtPnRyZWUsICZvYmplY3RzLCBOVUxMLCAiIik7CisJCXNob3dfY29tbWl0KGNvbW1pdCk7CisJfQorCWZvciAoaSA9IDA7IGkgPCByZXZzLT5wZW5kaW5nLm5yOyBpKyspIHsKKwkJc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSAqcGVuZGluZyA9IHJldnMtPnBlbmRpbmcub2JqZWN0cyArIGk7CisJCXN0cnVjdCBvYmplY3QgKm9iaiA9IHBlbmRpbmctPml0ZW07CisJCWNvbnN0IGNoYXIgKm5hbWUgPSBwZW5kaW5nLT5uYW1lOworCQlpZiAob2JqLT5mbGFncyAmIChVTklOVEVSRVNUSU5HIHwgU0VFTikpCisJCQljb250aW51ZTsKKwkJaWYgKG9iai0+dHlwZSA9PSBPQkpfVEFHKSB7CisJCQlvYmotPmZsYWdzIHw9IFNFRU47CisJCQlhZGRfb2JqZWN0X2FycmF5KG9iaiwgbmFtZSwgJm9iamVjdHMpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG9iai0+dHlwZSA9PSBPQkpfVFJFRSkgeworCQkJcHJvY2Vzc190cmVlKHJldnMsIChzdHJ1Y3QgdHJlZSAqKW9iaiwgJm9iamVjdHMsCisJCQkJICAgICBOVUxMLCBuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChvYmotPnR5cGUgPT0gT0JKX0JMT0IpIHsKKwkJCXByb2Nlc3NfYmxvYihyZXZzLCAoc3RydWN0IGJsb2IgKilvYmosICZvYmplY3RzLAorCQkJCSAgICAgTlVMTCwgbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlkaWUoInVua25vd24gcGVuZGluZyBvYmplY3QgJXMgKCVzKSIsCisJCSAgICBzaGExX3RvX2hleChvYmotPnNoYTEpLCBuYW1lKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IG9iamVjdHMubnI7IGkrKykKKwkJc2hvd19vYmplY3QoJm9iamVjdHMub2JqZWN0c1tpXSk7CisJZnJlZShvYmplY3RzLm9iamVjdHMpOworCWlmIChyZXZzLT5wZW5kaW5nLm5yKSB7CisJCWZyZWUocmV2cy0+cGVuZGluZy5vYmplY3RzKTsKKwkJcmV2cy0+cGVuZGluZy5uciA9IDA7CisJCXJldnMtPnBlbmRpbmcuYWxsb2MgPSAwOworCQlyZXZzLT5wZW5kaW5nLm9iamVjdHMgPSBOVUxMOworCX0KK30KZGlmZiAtLWdpdCBhL2xpc3Qtb2JqZWN0cy5oIGIvbGlzdC1vYmplY3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY0MTM5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpc3Qtb2JqZWN0cy5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgTElTVF9PQkpFQ1RTX0gKKyNkZWZpbmUgTElTVF9PQkpFQ1RTX0gKKwordHlwZWRlZiB2b2lkICgqc2hvd19jb21taXRfZm4pKHN0cnVjdCBjb21taXQgKik7Cit0eXBlZGVmIHZvaWQgKCpzaG93X29iamVjdF9mbikoc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSAqKTsKK3R5cGVkZWYgdm9pZCAoKnNob3dfZWRnZV9mbikoc3RydWN0IGNvbW1pdCAqKTsKKwordm9pZCB0cmF2ZXJzZV9jb21taXRfbGlzdChzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIHNob3dfY29tbWl0X2ZuLCBzaG93X29iamVjdF9mbik7CisKK3ZvaWQgbWFya19lZGdlc191bmludGVyZXN0aW5nKHN0cnVjdCBjb21taXRfbGlzdCAqLCBzdHJ1Y3QgcmV2X2luZm8gKiwgc2hvd19lZGdlX2ZuKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9sbC1tZXJnZS5jIGIvbGwtbWVyZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWU3NDMzCi0tLSAvZGV2L251bGwKKysrIGIvbGwtbWVyZ2UuYwpAQCAtMCwwICsxLDM3OSBAQAorLyoKKyAqIExvdyBsZXZlbCAzLXdheSBpbi1jb3JlIGZpbGUgbWVyZ2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IEp1bmlvIEMgSGFtYW5vCisgKi8KKworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYXR0ci5oIgorI2luY2x1ZGUgInhkaWZmLWludGVyZmFjZS5oIgorI2luY2x1ZGUgInJ1bi1jb21tYW5kLmgiCisjaW5jbHVkZSAiaW50ZXJwb2xhdGUuaCIKKyNpbmNsdWRlICJsbC1tZXJnZS5oIgorCitzdHJ1Y3QgbGxfbWVyZ2VfZHJpdmVyOworCit0eXBlZGVmIGludCAoKmxsX21lcmdlX2ZuKShjb25zdCBzdHJ1Y3QgbGxfbWVyZ2VfZHJpdmVyICosCisJCQkgICBtbWJ1ZmZlcl90ICpyZXN1bHQsCisJCQkgICBjb25zdCBjaGFyICpwYXRoLAorCQkJICAgbW1maWxlX3QgKm9yaWcsCisJCQkgICBtbWZpbGVfdCAqc3JjMSwgY29uc3QgY2hhciAqbmFtZTEsCisJCQkgICBtbWZpbGVfdCAqc3JjMiwgY29uc3QgY2hhciAqbmFtZTIsCisJCQkgICBpbnQgdmlydHVhbF9hbmNlc3Rvcik7CisKK3N0cnVjdCBsbF9tZXJnZV9kcml2ZXIgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqZGVzY3JpcHRpb247CisJbGxfbWVyZ2VfZm4gZm47CisJY29uc3QgY2hhciAqcmVjdXJzaXZlOworCXN0cnVjdCBsbF9tZXJnZV9kcml2ZXIgKm5leHQ7CisJY2hhciAqY21kbGluZTsKK307CisKKy8qCisgKiBCdWlsdC1pbiBsb3ctbGV2ZWxzCisgKi8KK3N0YXRpYyBpbnQgbGxfYmluYXJ5X21lcmdlKGNvbnN0IHN0cnVjdCBsbF9tZXJnZV9kcml2ZXIgKmRydl91bnVzZWQsCisJCQkgICBtbWJ1ZmZlcl90ICpyZXN1bHQsCisJCQkgICBjb25zdCBjaGFyICpwYXRoX3VudXNlZCwKKwkJCSAgIG1tZmlsZV90ICpvcmlnLAorCQkJICAgbW1maWxlX3QgKnNyYzEsIGNvbnN0IGNoYXIgKm5hbWUxLAorCQkJICAgbW1maWxlX3QgKnNyYzIsIGNvbnN0IGNoYXIgKm5hbWUyLAorCQkJICAgaW50IHZpcnR1YWxfYW5jZXN0b3IpCit7CisJLyoKKwkgKiBUaGUgdGVudGF0aXZlIG1lcmdlIHJlc3VsdCBpcyAib3VycyIgZm9yIHRoZSBmaW5hbCByb3VuZCwKKwkgKiBvciBjb21tb24gYW5jZXN0b3IgZm9yIGFuIGludGVybmFsIG1lcmdlLiAgU3RpbGwgcmV0dXJuCisJICogImNvbmZsaWN0ZWQgbWVyZ2UiIHN0YXR1cy4KKwkgKi8KKwltbWZpbGVfdCAqc3RvbGVuID0gdmlydHVhbF9hbmNlc3RvciA/IG9yaWcgOiBzcmMxOworCisJcmVzdWx0LT5wdHIgPSBzdG9sZW4tPnB0cjsKKwlyZXN1bHQtPnNpemUgPSBzdG9sZW4tPnNpemU7CisJc3RvbGVuLT5wdHIgPSBOVUxMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGxsX3hkbF9tZXJnZShjb25zdCBzdHJ1Y3QgbGxfbWVyZ2VfZHJpdmVyICpkcnZfdW51c2VkLAorCQkJbW1idWZmZXJfdCAqcmVzdWx0LAorCQkJY29uc3QgY2hhciAqcGF0aF91bnVzZWQsCisJCQltbWZpbGVfdCAqb3JpZywKKwkJCW1tZmlsZV90ICpzcmMxLCBjb25zdCBjaGFyICpuYW1lMSwKKwkJCW1tZmlsZV90ICpzcmMyLCBjb25zdCBjaGFyICpuYW1lMiwKKwkJCWludCB2aXJ0dWFsX2FuY2VzdG9yKQoreworCXhwcGFyYW1fdCB4cHA7CisKKwlpZiAoYnVmZmVyX2lzX2JpbmFyeShvcmlnLT5wdHIsIG9yaWctPnNpemUpIHx8CisJICAgIGJ1ZmZlcl9pc19iaW5hcnkoc3JjMS0+cHRyLCBzcmMxLT5zaXplKSB8fAorCSAgICBidWZmZXJfaXNfYmluYXJ5KHNyYzItPnB0ciwgc3JjMi0+c2l6ZSkpIHsKKwkJd2FybmluZygiQ2Fubm90IG1lcmdlIGJpbmFyeSBmaWxlczogJXMgdnMuICVzXG4iLAorCQkJbmFtZTEsIG5hbWUyKTsKKwkJcmV0dXJuIGxsX2JpbmFyeV9tZXJnZShkcnZfdW51c2VkLCByZXN1bHQsCisJCQkJICAgICAgIHBhdGhfdW51c2VkLAorCQkJCSAgICAgICBvcmlnLCBzcmMxLCBuYW1lMSwKKwkJCQkgICAgICAgc3JjMiwgbmFtZTIsCisJCQkJICAgICAgIHZpcnR1YWxfYW5jZXN0b3IpOworCX0KKworCW1lbXNldCgmeHBwLCAwLCBzaXplb2YoeHBwKSk7CisJcmV0dXJuIHhkbF9tZXJnZShvcmlnLAorCQkJIHNyYzEsIG5hbWUxLAorCQkJIHNyYzIsIG5hbWUyLAorCQkJICZ4cHAsIFhETF9NRVJHRV9aRUFMT1VTLAorCQkJIHJlc3VsdCk7Cit9CisKK3N0YXRpYyBpbnQgbGxfdW5pb25fbWVyZ2UoY29uc3Qgc3RydWN0IGxsX21lcmdlX2RyaXZlciAqZHJ2X3VudXNlZCwKKwkJCSAgbW1idWZmZXJfdCAqcmVzdWx0LAorCQkJICBjb25zdCBjaGFyICpwYXRoX3VudXNlZCwKKwkJCSAgbW1maWxlX3QgKm9yaWcsCisJCQkgIG1tZmlsZV90ICpzcmMxLCBjb25zdCBjaGFyICpuYW1lMSwKKwkJCSAgbW1maWxlX3QgKnNyYzIsIGNvbnN0IGNoYXIgKm5hbWUyLAorCQkJICBpbnQgdmlydHVhbF9hbmNlc3RvcikKK3sKKwljaGFyICpzcmMsICpkc3Q7CisJbG9uZyBzaXplOworCWNvbnN0IGludCBtYXJrZXJfc2l6ZSA9IDc7CisKKwlpbnQgc3RhdHVzID0gbGxfeGRsX21lcmdlKGRydl91bnVzZWQsIHJlc3VsdCwgcGF0aF91bnVzZWQsCisJCQkJICBvcmlnLCBzcmMxLCBOVUxMLCBzcmMyLCBOVUxMLAorCQkJCSAgdmlydHVhbF9hbmNlc3Rvcik7CisJaWYgKHN0YXR1cyA8PSAwKQorCQlyZXR1cm4gc3RhdHVzOworCXNpemUgPSByZXN1bHQtPnNpemU7CisJc3JjID0gZHN0ID0gcmVzdWx0LT5wdHI7CisJd2hpbGUgKHNpemUpIHsKKwkJY2hhciBjaDsKKwkJaWYgKChtYXJrZXJfc2l6ZSA8IHNpemUpICYmCisJCSAgICAoKnNyYyA9PSAnPCcgfHwgKnNyYyA9PSAnPScgfHwgKnNyYyA9PSAnPicpKSB7CisJCQlpbnQgaTsKKwkJCWNoID0gKnNyYzsKKwkJCWZvciAoaSA9IDA7IGkgPCBtYXJrZXJfc2l6ZTsgaSsrKQorCQkJCWlmIChzcmNbaV0gIT0gY2gpCisJCQkJCWdvdG8gbm90X2FfbWFya2VyOworCQkJaWYgKHNyY1ttYXJrZXJfc2l6ZV0gIT0gJ1xuJykKKwkJCQlnb3RvIG5vdF9hX21hcmtlcjsKKwkJCXNyYyArPSBtYXJrZXJfc2l6ZSArIDE7CisJCQlzaXplIC09IG1hcmtlcl9zaXplICsgMTsKKwkJCWNvbnRpbnVlOworCQl9CisJbm90X2FfbWFya2VyOgorCQlkbyB7CisJCQljaCA9ICpzcmMrKzsKKwkJCSpkc3QrKyA9IGNoOworCQkJc2l6ZS0tOworCQl9IHdoaWxlIChjaCAhPSAnXG4nICYmIHNpemUpOworCX0KKwlyZXN1bHQtPnNpemUgPSBkc3QgLSByZXN1bHQtPnB0cjsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBMTF9CSU5BUllfTUVSR0UgMAorI2RlZmluZSBMTF9URVhUX01FUkdFIDEKKyNkZWZpbmUgTExfVU5JT05fTUVSR0UgMgorc3RhdGljIHN0cnVjdCBsbF9tZXJnZV9kcml2ZXIgbGxfbWVyZ2VfZHJ2W10gPSB7CisJeyAiYmluYXJ5IiwgImJ1aWx0LWluIGJpbmFyeSBtZXJnZSIsIGxsX2JpbmFyeV9tZXJnZSB9LAorCXsgInRleHQiLCAiYnVpbHQtaW4gMy13YXkgdGV4dCBtZXJnZSIsIGxsX3hkbF9tZXJnZSB9LAorCXsgInVuaW9uIiwgImJ1aWx0LWluIHVuaW9uIG1lcmdlIiwgbGxfdW5pb25fbWVyZ2UgfSwKK307CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV90ZW1wKG1tZmlsZV90ICpzcmMsIGNoYXIgKnBhdGgpCit7CisJaW50IGZkOworCisJc3RyY3B5KHBhdGgsICIubWVyZ2VfZmlsZV9YWFhYWFgiKTsKKwlmZCA9IHhta3N0ZW1wKHBhdGgpOworCWlmICh3cml0ZV9pbl9mdWxsKGZkLCBzcmMtPnB0ciwgc3JjLT5zaXplKSAhPSBzcmMtPnNpemUpCisJCWRpZSgidW5hYmxlIHRvIHdyaXRlIHRlbXAtZmlsZSIpOworCWNsb3NlKGZkKTsKK30KKworLyoKKyAqIFVzZXIgZGVmaW5lZCBsb3ctbGV2ZWwgbWVyZ2UgZHJpdmVyIHN1cHBvcnQuCisgKi8KK3N0YXRpYyBpbnQgbGxfZXh0X21lcmdlKGNvbnN0IHN0cnVjdCBsbF9tZXJnZV9kcml2ZXIgKmZuLAorCQkJbW1idWZmZXJfdCAqcmVzdWx0LAorCQkJY29uc3QgY2hhciAqcGF0aCwKKwkJCW1tZmlsZV90ICpvcmlnLAorCQkJbW1maWxlX3QgKnNyYzEsIGNvbnN0IGNoYXIgKm5hbWUxLAorCQkJbW1maWxlX3QgKnNyYzIsIGNvbnN0IGNoYXIgKm5hbWUyLAorCQkJaW50IHZpcnR1YWxfYW5jZXN0b3IpCit7CisJY2hhciB0ZW1wWzNdWzUwXTsKKwljaGFyIGNtZGJ1ZlsyMDQ4XTsKKwlzdHJ1Y3QgaW50ZXJwIHRhYmxlW10gPSB7CisJCXsgIiVPIiB9LAorCQl7ICIlQSIgfSwKKwkJeyAiJUIiIH0sCisJfTsKKwlzdHJ1Y3QgY2hpbGRfcHJvY2VzcyBjaGlsZDsKKwljb25zdCBjaGFyICphcmdzWzIwXTsKKwlpbnQgc3RhdHVzLCBmZCwgaTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChmbi0+Y21kbGluZSA9PSBOVUxMKQorCQlkaWUoImN1c3RvbSBtZXJnZSBkcml2ZXIgJXMgbGFja3MgY29tbWFuZCBsaW5lLiIsIGZuLT5uYW1lKTsKKworCXJlc3VsdC0+cHRyID0gTlVMTDsKKwlyZXN1bHQtPnNpemUgPSAwOworCWNyZWF0ZV90ZW1wKG9yaWcsIHRlbXBbMF0pOworCWNyZWF0ZV90ZW1wKHNyYzEsIHRlbXBbMV0pOworCWNyZWF0ZV90ZW1wKHNyYzIsIHRlbXBbMl0pOworCisJaW50ZXJwX3NldF9lbnRyeSh0YWJsZSwgMCwgdGVtcFswXSk7CisJaW50ZXJwX3NldF9lbnRyeSh0YWJsZSwgMSwgdGVtcFsxXSk7CisJaW50ZXJwX3NldF9lbnRyeSh0YWJsZSwgMiwgdGVtcFsyXSk7CisKKwlpbnRlcnBvbGF0ZShjbWRidWYsIHNpemVvZihjbWRidWYpLCBmbi0+Y21kbGluZSwgdGFibGUsIDMpOworCisJbWVtc2V0KCZjaGlsZCwgMCwgc2l6ZW9mKGNoaWxkKSk7CisJY2hpbGQuYXJndiA9IGFyZ3M7CisJYXJnc1swXSA9ICJzaCI7CisJYXJnc1sxXSA9ICItYyI7CisJYXJnc1syXSA9IGNtZGJ1ZjsKKwlhcmdzWzNdID0gTlVMTDsKKworCXN0YXR1cyA9IHJ1bl9jb21tYW5kKCZjaGlsZCk7CisJaWYgKHN0YXR1cyA8IC1FUlJfUlVOX0NPTU1BTkRfRk9SSykKKwkJOyAvKiBmYWlsdXJlIGluIHJ1bi1jb21tYW5kICovCisJZWxzZQorCQlzdGF0dXMgPSAtc3RhdHVzOworCWZkID0gb3Blbih0ZW1wWzFdLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJZ290byBiYWQ7CisJaWYgKGZzdGF0KGZkLCAmc3QpKQorCQlnb3RvIGNsb3NlX2JhZDsKKwlyZXN1bHQtPnNpemUgPSBzdC5zdF9zaXplOworCXJlc3VsdC0+cHRyID0geG1hbGxvYyhyZXN1bHQtPnNpemUgKyAxKTsKKwlpZiAocmVhZF9pbl9mdWxsKGZkLCByZXN1bHQtPnB0ciwgcmVzdWx0LT5zaXplKSAhPSByZXN1bHQtPnNpemUpIHsKKwkJZnJlZShyZXN1bHQtPnB0cik7CisJCXJlc3VsdC0+cHRyID0gTlVMTDsKKwkJcmVzdWx0LT5zaXplID0gMDsKKwl9CisgY2xvc2VfYmFkOgorCWNsb3NlKGZkKTsKKyBiYWQ6CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJdW5saW5rKHRlbXBbaV0pOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBtZXJnZS5kZWZhdWx0IGFuZCBtZXJnZS5kcml2ZXIgY29uZmlndXJhdGlvbiBpdGVtcworICovCitzdGF0aWMgc3RydWN0IGxsX21lcmdlX2RyaXZlciAqbGxfdXNlcl9tZXJnZSwgKipsbF91c2VyX21lcmdlX3RhaWw7CitzdGF0aWMgY29uc3QgY2hhciAqZGVmYXVsdF9sbF9tZXJnZTsKKworc3RhdGljIGludCByZWFkX21lcmdlX2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCXN0cnVjdCBsbF9tZXJnZV9kcml2ZXIgKmZuOworCWNvbnN0IGNoYXIgKmVwLCAqbmFtZTsKKwlpbnQgbmFtZWxlbjsKKworCWlmICghc3RyY21wKHZhciwgIm1lcmdlLmRlZmF1bHQiKSkgeworCQlpZiAodmFsdWUpCisJCQlkZWZhdWx0X2xsX21lcmdlID0gc3RyZHVwKHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBXZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gYW55dGhpbmcgYnV0ICJtZXJnZS48bmFtZT4udmFyaWFibGUiOworCSAqIGVzcGVjaWFsbHksIHdlIGRvIG5vdCB3YW50IHRvIGxvb2sgYXQgdmFyaWFibGVzIHN1Y2ggYXMKKwkgKiAibWVyZ2Uuc3VtbWFyeSIsICJtZXJnZS50b29sIiwgYW5kICJtZXJnZS52ZXJib3NpdHkiLgorCSAqLworCWlmIChwcmVmaXhjbXAodmFyLCAibWVyZ2UuIikgfHwgKGVwID0gc3RycmNocih2YXIsICcuJykpID09IHZhciArIDUpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBGaW5kIGV4aXN0aW5nIG9uZSBhcyB3ZSBtaWdodCBiZSBwcm9jZXNzaW5nIG1lcmdlLjxuYW1lPi52YXIyCisJICogYWZ0ZXIgc2VlaW5nIG1lcmdlLjxuYW1lPi52YXIxLgorCSAqLworCW5hbWUgPSB2YXIgKyA2OworCW5hbWVsZW4gPSBlcCAtIG5hbWU7CisJZm9yIChmbiA9IGxsX3VzZXJfbWVyZ2U7IGZuOyBmbiA9IGZuLT5uZXh0KQorCQlpZiAoIXN0cm5jbXAoZm4tPm5hbWUsIG5hbWUsIG5hbWVsZW4pICYmICFmbi0+bmFtZVtuYW1lbGVuXSkKKwkJCWJyZWFrOworCWlmICghZm4pIHsKKwkJZm4gPSB4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgbGxfbWVyZ2VfZHJpdmVyKSk7CisJCWZuLT5uYW1lID0geG1lbWR1cHoobmFtZSwgbmFtZWxlbik7CisJCWZuLT5mbiA9IGxsX2V4dF9tZXJnZTsKKwkJKmxsX3VzZXJfbWVyZ2VfdGFpbCA9IGZuOworCQlsbF91c2VyX21lcmdlX3RhaWwgPSAmKGZuLT5uZXh0KTsKKwl9CisKKwllcCsrOworCisJaWYgKCFzdHJjbXAoIm5hbWUiLCBlcCkpIHsKKwkJaWYgKCF2YWx1ZSkKKwkJCXJldHVybiBlcnJvcigiJXM6IGxhY2tzIHZhbHVlIiwgdmFyKTsKKwkJZm4tPmRlc2NyaXB0aW9uID0gc3RyZHVwKHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAoImRyaXZlciIsIGVwKSkgeworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIGVycm9yKCIlczogbGFja3MgdmFsdWUiLCB2YXIpOworCQkvKgorCQkgKiBtZXJnZS48bmFtZT4uZHJpdmVyIHNwZWNpZmllcyB0aGUgY29tbWFuZCBsaW5lOgorCQkgKgorCQkgKgljb21tYW5kLWxpbmUKKwkJICoKKwkJICogVGhlIGNvbW1hbmQtbGluZSB3aWxsIGJlIGludGVycG9sYXRlZCB3aXRoIHRoZSBmb2xsb3dpbmcKKwkJICogdG9rZW5zIGFuZCBpcyBnaXZlbiB0byB0aGUgc2hlbGw6CisJCSAqCisJCSAqICAgICVPIC0gdGVtcG9yYXJ5IGZpbGUgbmFtZSBmb3IgdGhlIG1lcmdlIGJhc2UuCisJCSAqICAgICVBIC0gdGVtcG9yYXJ5IGZpbGUgbmFtZSBmb3Igb3VyIHZlcnNpb24uCisJCSAqICAgICVCIC0gdGVtcG9yYXJ5IGZpbGUgbmFtZSBmb3IgdGhlIG90aGVyIGJyYW5jaGVzJyB2ZXJzaW9uLgorCQkgKgorCQkgKiBUaGUgZXh0ZXJuYWwgbWVyZ2UgZHJpdmVyIHNob3VsZCB3cml0ZSB0aGUgcmVzdWx0cyBpbiB0aGUKKwkJICogZmlsZSBuYW1lZCBieSAlQSwgYW5kIHNpZ25hbCB0aGF0IGl0IGhhcyBkb25lIHdpdGggemVybyBleGl0CisJCSAqIHN0YXR1cy4KKwkJICovCisJCWZuLT5jbWRsaW5lID0gc3RyZHVwKHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAoInJlY3Vyc2l2ZSIsIGVwKSkgeworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIGVycm9yKCIlczogbGFja3MgdmFsdWUiLCB2YXIpOworCQlmbi0+cmVjdXJzaXZlID0gc3RyZHVwKHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRpYWxpemVfbGxfbWVyZ2Uodm9pZCkKK3sKKwlpZiAobGxfdXNlcl9tZXJnZV90YWlsKQorCQlyZXR1cm47CisJbGxfdXNlcl9tZXJnZV90YWlsID0gJmxsX3VzZXJfbWVyZ2U7CisJZ2l0X2NvbmZpZyhyZWFkX21lcmdlX2NvbmZpZyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGxfbWVyZ2VfZHJpdmVyICpmaW5kX2xsX21lcmdlX2RyaXZlcihjb25zdCBjaGFyICptZXJnZV9hdHRyKQoreworCXN0cnVjdCBsbF9tZXJnZV9kcml2ZXIgKmZuOworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGk7CisKKwlpbml0aWFsaXplX2xsX21lcmdlKCk7CisKKwlpZiAoQVRUUl9UUlVFKG1lcmdlX2F0dHIpKQorCQlyZXR1cm4gJmxsX21lcmdlX2RydltMTF9URVhUX01FUkdFXTsKKwllbHNlIGlmIChBVFRSX0ZBTFNFKG1lcmdlX2F0dHIpKQorCQlyZXR1cm4gJmxsX21lcmdlX2RydltMTF9CSU5BUllfTUVSR0VdOworCWVsc2UgaWYgKEFUVFJfVU5TRVQobWVyZ2VfYXR0cikpIHsKKwkJaWYgKCFkZWZhdWx0X2xsX21lcmdlKQorCQkJcmV0dXJuICZsbF9tZXJnZV9kcnZbTExfVEVYVF9NRVJHRV07CisJCWVsc2UKKwkJCW5hbWUgPSBkZWZhdWx0X2xsX21lcmdlOworCX0KKwllbHNlCisJCW5hbWUgPSBtZXJnZV9hdHRyOworCisJZm9yIChmbiA9IGxsX3VzZXJfbWVyZ2U7IGZuOyBmbiA9IGZuLT5uZXh0KQorCQlpZiAoIXN0cmNtcChmbi0+bmFtZSwgbmFtZSkpCisJCQlyZXR1cm4gZm47CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsbF9tZXJnZV9kcnYpOyBpKyspCisJCWlmICghc3RyY21wKGxsX21lcmdlX2RydltpXS5uYW1lLCBuYW1lKSkKKwkJCXJldHVybiAmbGxfbWVyZ2VfZHJ2W2ldOworCisJLyogZGVmYXVsdCB0byB0aGUgMy13YXkgKi8KKwlyZXR1cm4gJmxsX21lcmdlX2RydltMTF9URVhUX01FUkdFXTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmdpdF9wYXRoX2NoZWNrX21lcmdlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc3RhdGljIHN0cnVjdCBnaXRfYXR0cl9jaGVjayBhdHRyX21lcmdlX2NoZWNrOworCisJaWYgKCFhdHRyX21lcmdlX2NoZWNrLmF0dHIpCisJCWF0dHJfbWVyZ2VfY2hlY2suYXR0ciA9IGdpdF9hdHRyKCJtZXJnZSIsIDUpOworCisJaWYgKGdpdF9jaGVja2F0dHIocGF0aCwgMSwgJmF0dHJfbWVyZ2VfY2hlY2spKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gYXR0cl9tZXJnZV9jaGVjay52YWx1ZTsKK30KKworaW50IGxsX21lcmdlKG1tYnVmZmVyX3QgKnJlc3VsdF9idWYsCisJICAgICBjb25zdCBjaGFyICpwYXRoLAorCSAgICAgbW1maWxlX3QgKmFuY2VzdG9yLAorCSAgICAgbW1maWxlX3QgKm91cnMsIGNvbnN0IGNoYXIgKm91cl9sYWJlbCwKKwkgICAgIG1tZmlsZV90ICp0aGVpcnMsIGNvbnN0IGNoYXIgKnRoZWlyX2xhYmVsLAorCSAgICAgaW50IHZpcnR1YWxfYW5jZXN0b3IpCit7CisJY29uc3QgY2hhciAqbGxfZHJpdmVyX25hbWU7CisJY29uc3Qgc3RydWN0IGxsX21lcmdlX2RyaXZlciAqZHJpdmVyOworCisJbGxfZHJpdmVyX25hbWUgPSBnaXRfcGF0aF9jaGVja19tZXJnZShwYXRoKTsKKwlkcml2ZXIgPSBmaW5kX2xsX21lcmdlX2RyaXZlcihsbF9kcml2ZXJfbmFtZSk7CisKKwlpZiAodmlydHVhbF9hbmNlc3RvciAmJiBkcml2ZXItPnJlY3Vyc2l2ZSkKKwkJZHJpdmVyID0gZmluZF9sbF9tZXJnZV9kcml2ZXIoZHJpdmVyLT5yZWN1cnNpdmUpOworCXJldHVybiBkcml2ZXItPmZuKGRyaXZlciwgcmVzdWx0X2J1ZiwgcGF0aCwKKwkJCSAgYW5jZXN0b3IsCisJCQkgIG91cnMsIG91cl9sYWJlbCwKKwkJCSAgdGhlaXJzLCB0aGVpcl9sYWJlbCwgdmlydHVhbF9hbmNlc3Rvcik7Cit9CmRpZmYgLS1naXQgYS9sbC1tZXJnZS5oIGIvbGwtbWVyZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mzg4NDIyCi0tLSAvZGV2L251bGwKKysrIGIvbGwtbWVyZ2UuaApAQCAtMCwwICsxLDE1IEBACisvKgorICogTG93IGxldmVsIDMtd2F5IGluLWNvcmUgZmlsZSBtZXJnZS4KKyAqLworCisjaWZuZGVmIExMX01FUkdFX0gKKyNkZWZpbmUgTExfTUVSR0VfSAorCitpbnQgbGxfbWVyZ2UobW1idWZmZXJfdCAqcmVzdWx0X2J1ZiwKKwkgICAgIGNvbnN0IGNoYXIgKnBhdGgsCisJICAgICBtbWZpbGVfdCAqYW5jZXN0b3IsCisJICAgICBtbWZpbGVfdCAqb3VycywgY29uc3QgY2hhciAqb3VyX2xhYmVsLAorCSAgICAgbW1maWxlX3QgKnRoZWlycywgY29uc3QgY2hhciAqdGhlaXJfbGFiZWwsCisJICAgICBpbnQgdmlydHVhbF9hbmNlc3Rvcik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbG9ja2ZpbGUuYyBiL2xvY2tmaWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYzZjE4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xvY2tmaWxlLmMKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEp1bmlvIEMgSGFtYW5vCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorCitzdGF0aWMgc3RydWN0IGxvY2tfZmlsZSAqbG9ja19maWxlX2xpc3Q7CitzdGF0aWMgY29uc3QgY2hhciAqYWx0ZXJuYXRlX2luZGV4X291dHB1dDsKKworc3RhdGljIHZvaWQgcmVtb3ZlX2xvY2tfZmlsZSh2b2lkKQoreworCXBpZF90IG1lID0gZ2V0cGlkKCk7CisKKwl3aGlsZSAobG9ja19maWxlX2xpc3QpIHsKKwkJaWYgKGxvY2tfZmlsZV9saXN0LT5vd25lciA9PSBtZSAmJgorCQkgICAgbG9ja19maWxlX2xpc3QtPmZpbGVuYW1lWzBdKSB7CisJCQlpZiAobG9ja19maWxlX2xpc3QtPmZkID49IDApCisJCQkJY2xvc2UobG9ja19maWxlX2xpc3QtPmZkKTsKKwkJCXVubGluayhsb2NrX2ZpbGVfbGlzdC0+ZmlsZW5hbWUpOworCQl9CisJCWxvY2tfZmlsZV9saXN0ID0gbG9ja19maWxlX2xpc3QtPm5leHQ7CisJfQorfQorCitzdGF0aWMgdm9pZCByZW1vdmVfbG9ja19maWxlX29uX3NpZ25hbChpbnQgc2lnbm8pCit7CisJcmVtb3ZlX2xvY2tfZmlsZSgpOworCXNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworCXJhaXNlKHNpZ25vKTsKK30KKworLyoKKyAqIHAgPSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRoIG5hbWUKKyAqCisgKiBSZXR1cm4gYSBwb2ludGVyIGludG8gcCBzaG93aW5nIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxhc3QgcGF0aCBuYW1lCisgKiBlbGVtZW50LiAgSWYgcCBpcyBlbXB0eSBvciB0aGUgcm9vdCBkaXJlY3RvcnkgKCIvIiksIGp1c3QgcmV0dXJuIHAuCisgKi8KK3N0YXRpYyBjaGFyICpsYXN0X3BhdGhfZWxtKGNoYXIgKnApCit7CisJLyogciBzdGFydHMgcG9pbnRpbmcgdG8gbnVsbCBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgKi8KKwljaGFyICpyID0gc3RyY2hyKHAsICdcMCcpOworCisJaWYgKHIgPT0gcCkKKwkJcmV0dXJuIHA7IC8qIGp1c3QgcmV0dXJuIGVtcHR5IHN0cmluZyAqLworCisJci0tOyAvKiBiYWNrIHVwIHRvIGxhc3Qgbm9uLW51bGwgY2hhcmFjdGVyICovCisKKwkvKiBiYWNrIHVwIHBhc3QgdHJhaWxpbmcgc2xhc2hlcywgaWYgYW55ICovCisJd2hpbGUgKHIgPiBwICYmICpyID09ICcvJykKKwkJci0tOworCisJLyoKKwkgKiB0aGVuIGdvIGJhY2t3YXJkcyB1bnRpbCBJIGhpdCBhIHNsYXNoLCBvciB0aGUgYmVnaW5uaW5nIG9mCisJICogdGhlIHN0cmluZworCSAqLworCXdoaWxlIChyID4gcCAmJiAqKHItMSkgIT0gJy8nKQorCQlyLS07CisJcmV0dXJuIHI7Cit9CisKKworLyogV2UgYWxsb3cgInJlY3Vyc2l2ZSIgc3ltYm9saWMgbGlua3MuIE9ubHkgd2l0aGluIHJlYXNvbiwgdGhvdWdoICovCisjZGVmaW5lIE1BWERFUFRIIDUKKworLyoKKyAqIHAgPSBwYXRoIHRoYXQgbWF5IGJlIGEgc3ltbGluaworICogcyA9IGZ1bGwgc2l6ZSBvZiBwCisgKgorICogSWYgcCBpcyBhIHN5bWxpbmssIGF0dGVtcHQgdG8gb3ZlcndyaXRlIHAgd2l0aCBhIHBhdGggdG8gdGhlIHJlYWwKKyAqIGZpbGUgb3IgZGlyZWN0b3J5ICh3aGljaCBtYXkgb3IgbWF5IG5vdCBleGlzdCksIGZvbGxvd2luZyBhIGNoYWluIG9mCisgKiBzeW1saW5rcyBpZiBuZWNlc3NhcnkuICBPdGhlcndpc2UsIGxlYXZlIHAgdW5tb2RpZmllZC4KKyAqCisgKiBUaGlzIGlzIGEgYmVzdC1lZmZvcnQgcm91dGluZS4gIElmIGFuIGVycm9yIG9jY3VycywgcCB3aWxsIGVpdGhlciBiZQorICogbGVmdCB1bm1vZGlmaWVkIG9yIHdpbGwgbmFtZSBhIGRpZmZlcmVudCBzeW1saW5rIGluIGEgc3ltbGluayBjaGFpbgorICogdGhhdCBzdGFydGVkIHdpdGggcCdzIGluaXRpYWwgY29udGVudHMuCisgKgorICogQWx3YXlzIHJldHVybnMgcC4KKyAqLworCitzdGF0aWMgY2hhciAqcmVzb2x2ZV9zeW1saW5rKGNoYXIgKnAsIHNpemVfdCBzKQoreworCWludCBkZXB0aCA9IE1BWERFUFRIOworCisJd2hpbGUgKGRlcHRoLS0pIHsKKwkJY2hhciBsaW5rW1BBVEhfTUFYXTsKKwkJaW50IGxpbmtfbGVuID0gcmVhZGxpbmsocCwgbGluaywgc2l6ZW9mKGxpbmspKTsKKwkJaWYgKGxpbmtfbGVuIDwgMCkgeworCQkJLyogbm90IGEgc3ltbGluayBhbnltb3JlICovCisJCQlyZXR1cm4gcDsKKwkJfQorCQllbHNlIGlmIChsaW5rX2xlbiA8IHNpemVvZihsaW5rKSkKKwkJCS8qIHJlYWRsaW5rKCkgbmV2ZXIgbnVsbC10ZXJtaW5hdGVzICovCisJCQlsaW5rW2xpbmtfbGVuXSA9ICdcMCc7CisJCWVsc2UgeworCQkJd2FybmluZygiJXM6IHN5bWxpbmsgdG9vIGxvbmciLCBwKTsKKwkJCXJldHVybiBwOworCQl9CisKKwkJaWYgKGlzX2Fic29sdXRlX3BhdGgobGluaykpIHsKKwkJCS8qIGFic29sdXRlIHBhdGggc2ltcGx5IHJlcGxhY2VzIHAgKi8KKwkJCWlmIChsaW5rX2xlbiA8IHMpCisJCQkJc3RyY3B5KHAsIGxpbmspOworCQkJZWxzZSB7CisJCQkJd2FybmluZygiJXM6IHN5bWxpbmsgdG9vIGxvbmciLCBwKTsKKwkJCQlyZXR1cm4gcDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBsaW5rIGlzIGEgcmVsYXRpdmUgcGF0aCwgc28gSSBtdXN0IHJlcGxhY2UgdGhlCisJCQkgKiBsYXN0IGVsZW1lbnQgb2YgcCB3aXRoIGl0LgorCQkJICovCisJCQljaGFyICpyID0gKGNoYXIqKWxhc3RfcGF0aF9lbG0ocCk7CisJCQlpZiAociAtIHAgKyBsaW5rX2xlbiA8IHMpCisJCQkJc3RyY3B5KHIsIGxpbmspOworCQkJZWxzZSB7CisJCQkJd2FybmluZygiJXM6IHN5bWxpbmsgdG9vIGxvbmciLCBwKTsKKwkJCQlyZXR1cm4gcDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcDsKK30KKworCitzdGF0aWMgaW50IGxvY2tfZmlsZShzdHJ1Y3QgbG9ja19maWxlICpsaywgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpZiAoc3RybGVuKHBhdGgpID49IHNpemVvZihsay0+ZmlsZW5hbWUpKSByZXR1cm4gLTE7CisJc3RyY3B5KGxrLT5maWxlbmFtZSwgcGF0aCk7CisJLyoKKwkgKiBzdWJ0cmFjdCA1IGZyb20gc2l6ZSB0byBtYWtlIHN1cmUgdGhlcmUncyByb29tIGZvciBhZGRpbmcKKwkgKiAiLmxvY2siIGZvciB0aGUgbG9jayBmaWxlIG5hbWUKKwkgKi8KKwlyZXNvbHZlX3N5bWxpbmsobGstPmZpbGVuYW1lLCBzaXplb2YobGstPmZpbGVuYW1lKS01KTsKKwlzdHJjYXQobGstPmZpbGVuYW1lLCAiLmxvY2siKTsKKwlsay0+ZmQgPSBvcGVuKGxrLT5maWxlbmFtZSwgT19SRFdSIHwgT19DUkVBVCB8IE9fRVhDTCwgMDY2Nik7CisJaWYgKDAgPD0gbGstPmZkKSB7CisJCWlmICghbG9ja19maWxlX2xpc3QpIHsKKwkJCXNpZ25hbChTSUdJTlQsIHJlbW92ZV9sb2NrX2ZpbGVfb25fc2lnbmFsKTsKKwkJCWF0ZXhpdChyZW1vdmVfbG9ja19maWxlKTsKKwkJfQorCQlsay0+b3duZXIgPSBnZXRwaWQoKTsKKwkJaWYgKCFsay0+b25fbGlzdCkgeworCQkJbGstPm5leHQgPSBsb2NrX2ZpbGVfbGlzdDsKKwkJCWxvY2tfZmlsZV9saXN0ID0gbGs7CisJCQlsay0+b25fbGlzdCA9IDE7CisJCX0KKwkJaWYgKGFkanVzdF9zaGFyZWRfcGVybShsay0+ZmlsZW5hbWUpKQorCQkJcmV0dXJuIGVycm9yKCJjYW5ub3QgZml4IHBlcm1pc3Npb24gYml0cyBvbiAlcyIsCisJCQkJICAgICBsay0+ZmlsZW5hbWUpOworCX0KKwllbHNlCisJCWxrLT5maWxlbmFtZVswXSA9IDA7CisJcmV0dXJuIGxrLT5mZDsKK30KKworaW50IGhvbGRfbG9ja19maWxlX2Zvcl91cGRhdGUoc3RydWN0IGxvY2tfZmlsZSAqbGssIGNvbnN0IGNoYXIgKnBhdGgsIGludCBkaWVfb25fZXJyb3IpCit7CisJaW50IGZkID0gbG9ja19maWxlKGxrLCBwYXRoKTsKKwlpZiAoZmQgPCAwICYmIGRpZV9vbl9lcnJvcikKKwkJZGllKCJ1bmFibGUgdG8gY3JlYXRlICclcy5sb2NrJzogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworCXJldHVybiBmZDsKK30KKworaW50IGNsb3NlX2xvY2tfZmlsZShzdHJ1Y3QgbG9ja19maWxlICpsaykKK3sKKwlpbnQgZmQgPSBsay0+ZmQ7CisJbGstPmZkID0gLTE7CisJcmV0dXJuIGNsb3NlKGZkKTsKK30KKworaW50IGNvbW1pdF9sb2NrX2ZpbGUoc3RydWN0IGxvY2tfZmlsZSAqbGspCit7CisJY2hhciByZXN1bHRfZmlsZVtQQVRIX01BWF07CisJc2l6ZV90IGk7CisJaWYgKGxrLT5mZCA+PSAwICYmIGNsb3NlX2xvY2tfZmlsZShsaykpCisJCXJldHVybiAtMTsKKwlzdHJjcHkocmVzdWx0X2ZpbGUsIGxrLT5maWxlbmFtZSk7CisJaSA9IHN0cmxlbihyZXN1bHRfZmlsZSkgLSA1OyAvKiAubG9jayAqLworCXJlc3VsdF9maWxlW2ldID0gMDsKKwlpZiAocmVuYW1lKGxrLT5maWxlbmFtZSwgcmVzdWx0X2ZpbGUpKQorCQlyZXR1cm4gLTE7CisJbGstPmZpbGVuYW1lWzBdID0gMDsKKwlyZXR1cm4gMDsKK30KKworaW50IGhvbGRfbG9ja2VkX2luZGV4KHN0cnVjdCBsb2NrX2ZpbGUgKmxrLCBpbnQgZGllX29uX2Vycm9yKQoreworCXJldHVybiBob2xkX2xvY2tfZmlsZV9mb3JfdXBkYXRlKGxrLCBnZXRfaW5kZXhfZmlsZSgpLCBkaWVfb25fZXJyb3IpOworfQorCit2b2lkIHNldF9hbHRlcm5hdGVfaW5kZXhfb3V0cHV0KGNvbnN0IGNoYXIgKm5hbWUpCit7CisJYWx0ZXJuYXRlX2luZGV4X291dHB1dCA9IG5hbWU7Cit9CisKK2ludCBjb21taXRfbG9ja2VkX2luZGV4KHN0cnVjdCBsb2NrX2ZpbGUgKmxrKQoreworCWlmIChhbHRlcm5hdGVfaW5kZXhfb3V0cHV0KSB7CisJCWlmIChsay0+ZmQgPj0gMCAmJiBjbG9zZV9sb2NrX2ZpbGUobGspKQorCQkJcmV0dXJuIC0xOworCQlpZiAocmVuYW1lKGxrLT5maWxlbmFtZSwgYWx0ZXJuYXRlX2luZGV4X291dHB1dCkpCisJCQlyZXR1cm4gLTE7CisJCWxrLT5maWxlbmFtZVswXSA9IDA7CisJCXJldHVybiAwOworCX0KKwllbHNlCisJCXJldHVybiBjb21taXRfbG9ja19maWxlKGxrKTsKK30KKwordm9pZCByb2xsYmFja19sb2NrX2ZpbGUoc3RydWN0IGxvY2tfZmlsZSAqbGspCit7CisJaWYgKGxrLT5maWxlbmFtZVswXSkgeworCQlpZiAobGstPmZkID49IDApCisJCQljbG9zZShsay0+ZmQpOworCQl1bmxpbmsobGstPmZpbGVuYW1lKTsKKwl9CisJbGstPmZpbGVuYW1lWzBdID0gMDsKK30KZGlmZiAtLWdpdCBhL2xvZy10cmVlLmMgYi9sb2ctdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMjk2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9sb2ctdHJlZS5jCkBAIC0wLDAgKzEsNDM3IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAibG9nLXRyZWUuaCIKKyNpbmNsdWRlICJyZWZsb2ctd2Fsay5oIgorCitzdHJ1Y3QgZGVjb3JhdGlvbiBuYW1lX2RlY29yYXRpb24gPSB7ICJvYmplY3QgbmFtZXMiIH07CisKK3N0YXRpYyB2b2lkIHNob3dfcGFyZW50cyhzdHJ1Y3QgY29tbWl0ICpjb21taXQsIGludCBhYmJyZXYpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwOworCWZvciAocCA9IGNvbW1pdC0+cGFyZW50czsgcCA7IHAgPSBwLT5uZXh0KSB7CisJCXN0cnVjdCBjb21taXQgKnBhcmVudCA9IHAtPml0ZW07CisJCXByaW50ZigiICVzIiwgZGlmZl91bmlxdWVfYWJicmV2KHBhcmVudC0+b2JqZWN0LnNoYTEsIGFiYnJldikpOworCX0KK30KKwordm9pZCBzaG93X2RlY29yYXRpb25zKHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwljb25zdCBjaGFyICpwcmVmaXg7CisJc3RydWN0IG5hbWVfZGVjb3JhdGlvbiAqZGVjb3JhdGlvbjsKKworCWRlY29yYXRpb24gPSBsb29rdXBfZGVjb3JhdGlvbigmbmFtZV9kZWNvcmF0aW9uLCAmY29tbWl0LT5vYmplY3QpOworCWlmICghZGVjb3JhdGlvbikKKwkJcmV0dXJuOworCXByZWZpeCA9ICIgKCI7CisJd2hpbGUgKGRlY29yYXRpb24pIHsKKwkJcHJpbnRmKCIlcyVzIiwgcHJlZml4LCBkZWNvcmF0aW9uLT5uYW1lKTsKKwkJcHJlZml4ID0gIiwgIjsKKwkJZGVjb3JhdGlvbiA9IGRlY29yYXRpb24tPm5leHQ7CisJfQorCXB1dGNoYXIoJyknKTsKK30KKworLyoKKyAqIFNlYXJjaCBmb3IgIl5bLUEtWmEtel0rOiBbXkBdK0AiIHBhdHRlcm4uIEl0IHVzdWFsbHkgbWF0Y2hlcworICogU2lnbmVkLW9mZi1ieTogYW5kIEFja2VkLWJ5OiBsaW5lcy4KKyAqLworc3RhdGljIGludCBkZXRlY3RfYW55X3NpZ25vZmYoY2hhciAqbGV0dGVyLCBpbnQgc2l6ZSkKK3sKKwljaGFyIGNoLCAqY3A7CisJaW50IHNlZW5fY29sb24gPSAwOworCWludCBzZWVuX2F0ID0gMDsKKwlpbnQgc2Vlbl9uYW1lID0gMDsKKwlpbnQgc2Vlbl9oZWFkID0gMDsKKworCWNwID0gbGV0dGVyICsgc2l6ZTsKKwl3aGlsZSAobGV0dGVyIDw9IC0tY3AgJiYgKGNoID0gKmNwKSA9PSAnXG4nKQorCQljb250aW51ZTsKKworCXdoaWxlIChsZXR0ZXIgPD0gY3ApIHsKKwkJY2ggPSAqY3AtLTsKKwkJaWYgKGNoID09ICdcbicpCisJCQlicmVhazsKKworCQlpZiAoIXNlZW5fYXQpIHsKKwkJCWlmIChjaCA9PSAnQCcpCisJCQkJc2Vlbl9hdCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXNlZW5fY29sb24pIHsKKwkJCWlmIChjaCA9PSAnQCcpCisJCQkJcmV0dXJuIDA7CisJCQllbHNlIGlmIChjaCA9PSAnOicpCisJCQkJc2Vlbl9jb2xvbiA9IDE7CisJCQllbHNlCisJCQkJc2Vlbl9uYW1lID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgoJ0EnIDw9IGNoICYmIGNoIDw9ICdaJykgfHwKKwkJICAgICgnYScgPD0gY2ggJiYgY2ggPD0gJ3onKSB8fAorCQkgICAgY2ggPT0gJy0nKSB7CisJCQlzZWVuX2hlYWQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJLyogbm8gZW1wdHkgbGFzdCBsaW5lIGRvZXNuJ3QgbWF0Y2ggKi8KKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBzZWVuX2hlYWQgJiYgc2Vlbl9uYW1lOworfQorCitzdGF0aWMgdm9pZCBhcHBlbmRfc2lnbm9mZihzdHJ1Y3Qgc3RyYnVmICpzYiwgY29uc3QgY2hhciAqc2lnbm9mZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBzaWduZWRfb2ZmX2J5W10gPSAiU2lnbmVkLW9mZi1ieTogIjsKKwlzaXplX3Qgc2lnbm9mZl9sZW4gPSBzdHJsZW4oc2lnbm9mZik7CisJaW50IGhhc19zaWdub2ZmID0gMDsKKwljaGFyICpjcDsKKworCWNwID0gc2ItPmJ1ZjsKKworCS8qIEZpcnN0IHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIHNpZ24tb2ZmIGJ5IHRoZSBzaWduZXIgKi8KKwl3aGlsZSAoKGNwID0gc3Ryc3RyKGNwLCBzaWduZWRfb2ZmX2J5KSkpIHsKKworCQloYXNfc2lnbm9mZiA9IDE7CisKKwkJY3AgKz0gc3RybGVuKHNpZ25lZF9vZmZfYnkpOworCQlpZiAoY3AgKyBzaWdub2ZmX2xlbiA+PSBzYi0+YnVmICsgc2ItPmxlbikKKwkJCWJyZWFrOworCQlpZiAoc3RybmNtcChjcCwgc2lnbm9mZiwgc2lnbm9mZl9sZW4pKQorCQkJY29udGludWU7CisJCWlmICghaXNzcGFjZShjcFtzaWdub2ZmX2xlbl0pKQorCQkJY29udGludWU7CisJCS8qIHdlIGFscmVhZHkgaGF2ZSBoaW0gKi8KKwkJcmV0dXJuOworCX0KKworCWlmICghaGFzX3NpZ25vZmYpCisJCWhhc19zaWdub2ZmID0gZGV0ZWN0X2FueV9zaWdub2ZmKHNiLT5idWYsIHNiLT5sZW4pOworCisJaWYgKCFoYXNfc2lnbm9mZikKKwkJc3RyYnVmX2FkZGNoKHNiLCAnXG4nKTsKKworCXN0cmJ1Zl9hZGRzdHIoc2IsIHNpZ25lZF9vZmZfYnkpOworCXN0cmJ1Zl9hZGQoc2IsIHNpZ25vZmYsIHNpZ25vZmZfbGVuKTsKKwlzdHJidWZfYWRkY2goc2IsICdcbicpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRpZ2l0c19pbl9udW1iZXIodW5zaWduZWQgaW50IG51bWJlcikKK3sKKwl1bnNpZ25lZCBpbnQgaSA9IDEwLCByZXN1bHQgPSAxOworCXdoaWxlIChpIDw9IG51bWJlcikgeworCQlpICo9IDEwOworCQlyZXN1bHQrKzsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBoYXNfbm9uX2FzY2lpKGNvbnN0IGNoYXIgKnMpCit7CisJaW50IGNoOworCWlmICghcykKKwkJcmV0dXJuIDA7CisJd2hpbGUgKChjaCA9ICpzKyspICE9ICdcMCcpIHsKKwkJaWYgKG5vbl9hc2NpaShjaCkpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbG9nX3dyaXRlX2VtYWlsX2hlYWRlcnMoc3RydWN0IHJldl9pbmZvICpvcHQsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgIGNvbnN0IGNoYXIgKipzdWJqZWN0X3AsCisJCQkgICAgIGNvbnN0IGNoYXIgKipleHRyYV9oZWFkZXJzX3AsCisJCQkgICAgIGludCAqbmVlZF84Yml0X2N0ZV9wKQoreworCWNvbnN0IGNoYXIgKnN1YmplY3QgPSBOVUxMOworCWNvbnN0IGNoYXIgKmV4dHJhX2hlYWRlcnMgPSBvcHQtPmV4dHJhX2hlYWRlcnM7CisKKwkqbmVlZF84Yml0X2N0ZV9wID0gMDsgLyogdW5rbm93biAqLworCWlmIChvcHQtPnRvdGFsID4gMCkgeworCQlzdGF0aWMgY2hhciBidWZmZXJbNjRdOworCQlzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAorCQkJICJTdWJqZWN0OiBbJXMgJTAqZC8lZF0gIiwKKwkJCSBvcHQtPnN1YmplY3RfcHJlZml4LAorCQkJIGRpZ2l0c19pbl9udW1iZXIob3B0LT50b3RhbCksCisJCQkgb3B0LT5uciwgb3B0LT50b3RhbCk7CisJCXN1YmplY3QgPSBidWZmZXI7CisJfSBlbHNlIGlmIChvcHQtPnRvdGFsID09IDAgJiYgb3B0LT5zdWJqZWN0X3ByZWZpeCAmJiAqb3B0LT5zdWJqZWN0X3ByZWZpeCkgeworCQlzdGF0aWMgY2hhciBidWZmZXJbMjU2XTsKKwkJc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKwkJCSAiU3ViamVjdDogWyVzXSAiLAorCQkJIG9wdC0+c3ViamVjdF9wcmVmaXgpOworCQlzdWJqZWN0ID0gYnVmZmVyOworCX0gZWxzZSB7CisJCXN1YmplY3QgPSAiU3ViamVjdDogIjsKKwl9CisKKwlwcmludGYoIkZyb20gJXMgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxXG4iLCBuYW1lKTsKKwlpZiAob3B0LT5tZXNzYWdlX2lkKQorCQlwcmludGYoIk1lc3NhZ2UtSWQ6IDwlcz5cbiIsIG9wdC0+bWVzc2FnZV9pZCk7CisJaWYgKG9wdC0+cmVmX21lc3NhZ2VfaWQpCisJCXByaW50ZigiSW4tUmVwbHktVG86IDwlcz5cblJlZmVyZW5jZXM6IDwlcz5cbiIsCisJCSAgICAgICBvcHQtPnJlZl9tZXNzYWdlX2lkLCBvcHQtPnJlZl9tZXNzYWdlX2lkKTsKKwlpZiAob3B0LT5taW1lX2JvdW5kYXJ5KSB7CisJCXN0YXRpYyBjaGFyIHN1YmplY3RfYnVmZmVyWzEwMjRdOworCQlzdGF0aWMgY2hhciBidWZmZXJbMTAyNF07CisJCSpuZWVkXzhiaXRfY3RlX3AgPSAtMTsgLyogTkVWRVIgKi8KKwkJc25wcmludGYoc3ViamVjdF9idWZmZXIsIHNpemVvZihzdWJqZWN0X2J1ZmZlcikgLSAxLAorCQkJICIlcyIKKwkJCSAiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKwkJCSAiQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IgorCQkJICIgYm91bmRhcnk9XCIlcyVzXCJcbiIKKwkJCSAiXG4iCisJCQkgIlRoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSAiCisJCQkgImZvcm1hdC5cbiIKKwkJCSAiLS0lcyVzXG4iCisJCQkgIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgIgorCQkJICJjaGFyc2V0PVVURi04OyBmb3JtYXQ9Zml4ZWRcbiIKKwkJCSAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuXG4iLAorCQkJIGV4dHJhX2hlYWRlcnMgPyBleHRyYV9oZWFkZXJzIDogIiIsCisJCQkgbWltZV9ib3VuZGFyeV9sZWFkZXIsIG9wdC0+bWltZV9ib3VuZGFyeSwKKwkJCSBtaW1lX2JvdW5kYXJ5X2xlYWRlciwgb3B0LT5taW1lX2JvdW5kYXJ5KTsKKwkJZXh0cmFfaGVhZGVycyA9IHN1YmplY3RfYnVmZmVyOworCisJCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgLSAxLAorCQkJICItLSVzJXNcbiIKKwkJCSAiQ29udGVudC1UeXBlOiB0ZXh0L3gtcGF0Y2g7IgorCQkJICIgbmFtZT1cIiVzLmRpZmZcIlxuIgorCQkJICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisJCQkgIkNvbnRlbnQtRGlzcG9zaXRpb246ICVzOyIKKwkJCSAiIGZpbGVuYW1lPVwiJXMuZGlmZlwiXG5cbiIsCisJCQkgbWltZV9ib3VuZGFyeV9sZWFkZXIsIG9wdC0+bWltZV9ib3VuZGFyeSwKKwkJCSBuYW1lLAorCQkJIG9wdC0+bm9faW5saW5lID8gImF0dGFjaG1lbnQiIDogImlubGluZSIsCisJCQkgbmFtZSk7CisJCW9wdC0+ZGlmZm9wdC5zdGF0X3NlcCA9IGJ1ZmZlcjsKKwl9CisJKnN1YmplY3RfcCA9IHN1YmplY3Q7CisJKmV4dHJhX2hlYWRlcnNfcCA9IGV4dHJhX2hlYWRlcnM7Cit9CisKK3ZvaWQgc2hvd19sb2coc3RydWN0IHJldl9pbmZvICpvcHQsIGNvbnN0IGNoYXIgKnNlcCkKK3sKKwlzdHJ1Y3Qgc3RyYnVmIG1zZ2J1ZjsKKwlzdHJ1Y3QgbG9nX2luZm8gKmxvZyA9IG9wdC0+bG9naW5mbzsKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsb2ctPmNvbW1pdCwgKnBhcmVudCA9IGxvZy0+cGFyZW50OworCWludCBhYmJyZXYgPSBvcHQtPmRpZmZvcHQuYWJicmV2OworCWludCBhYmJyZXZfY29tbWl0ID0gb3B0LT5hYmJyZXZfY29tbWl0ID8gb3B0LT5hYmJyZXYgOiA0MDsKKwljb25zdCBjaGFyICpleHRyYTsKKwljb25zdCBjaGFyICpzdWJqZWN0ID0gTlVMTCwgKmV4dHJhX2hlYWRlcnMgPSBvcHQtPmV4dHJhX2hlYWRlcnM7CisJaW50IG5lZWRfOGJpdF9jdGUgPSAwOworCisJb3B0LT5sb2dpbmZvID0gTlVMTDsKKwlpZiAoIW9wdC0+dmVyYm9zZV9oZWFkZXIpIHsKKwkJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgQk9VTkRBUlkpCisJCQlwdXRjaGFyKCctJyk7CisJCWVsc2UgaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykKKwkJCXB1dGNoYXIoJ14nKTsKKwkJZWxzZSBpZiAob3B0LT5sZWZ0X3JpZ2h0KSB7CisJCQlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBTWU1NRVRSSUNfTEVGVCkKKwkJCQlwdXRjaGFyKCc8Jyk7CisJCQllbHNlCisJCQkJcHV0Y2hhcignPicpOworCQl9CisJCWZwdXRzKGRpZmZfdW5pcXVlX2FiYnJldihjb21taXQtPm9iamVjdC5zaGExLCBhYmJyZXZfY29tbWl0KSwgc3Rkb3V0KTsKKwkJaWYgKG9wdC0+cGFyZW50cykKKwkJCXNob3dfcGFyZW50cyhjb21taXQsIGFiYnJldl9jb21taXQpOworCQlzaG93X2RlY29yYXRpb25zKGNvbW1pdCk7CisJCXB1dGNoYXIob3B0LT5kaWZmb3B0LmxpbmVfdGVybWluYXRpb24pOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBUaGUgIm9uZWxpbmUiIGZvcm1hdCBoYXMgc2V2ZXJhbCBzcGVjaWFsIGNhc2VzOgorCSAqICAtIFRoZSBwcmV0dHktcHJpbnRlZCBjb21taXQgbGFja3MgYSBuZXdsaW5lIGF0IHRoZSBlbmQKKwkgKiAgICBvZiB0aGUgYnVmZmVyLCBidXQgd2UgZG8gd2FudCB0byBtYWtlIHN1cmUgdGhhdCB3ZQorCSAqICAgIGhhdmUgYSBuZXdsaW5lIHRoZXJlLiBJZiB0aGUgc2VwYXJhdG9yIGlzbid0IGFscmVhZHkKKwkgKiAgICBhIG5ld2xpbmUsIGFkZCBhbiBleHRyYSBvbmUuCisJICogIC0gdW5saWtlIG90aGVyIGxvZyBtZXNzYWdlcywgdGhlIG9uZS1saW5lIGZvcm1hdCBkb2VzCisJICogICAgbm90IGhhdmUgYW4gZW1wdHkgbGluZSBiZXR3ZWVuIGVudHJpZXMuCisJICovCisJZXh0cmEgPSAiIjsKKwlpZiAoKnNlcCAhPSAnXG4nICYmIG9wdC0+Y29tbWl0X2Zvcm1hdCA9PSBDTUlUX0ZNVF9PTkVMSU5FKQorCQlleHRyYSA9ICJcbiI7CisJaWYgKG9wdC0+c2hvd25fb25lICYmIG9wdC0+Y29tbWl0X2Zvcm1hdCAhPSBDTUlUX0ZNVF9PTkVMSU5FKQorCQlwdXRjaGFyKG9wdC0+ZGlmZm9wdC5saW5lX3Rlcm1pbmF0aW9uKTsKKwlvcHQtPnNob3duX29uZSA9IDE7CisKKwkvKgorCSAqIFByaW50IGhlYWRlciBsaW5lIG9mIGhlYWRlci4uCisJICovCisKKwlpZiAob3B0LT5jb21taXRfZm9ybWF0ID09IENNSVRfRk1UX0VNQUlMKSB7CisJCWxvZ193cml0ZV9lbWFpbF9oZWFkZXJzKG9wdCwgc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSksCisJCQkJCSZzdWJqZWN0LCAmZXh0cmFfaGVhZGVycywKKwkJCQkJJm5lZWRfOGJpdF9jdGUpOworCX0gZWxzZSBpZiAob3B0LT5jb21taXRfZm9ybWF0ICE9IENNSVRfRk1UX1VTRVJGT1JNQVQpIHsKKwkJZnB1dHMoZGlmZl9nZXRfY29sb3Jfb3B0KCZvcHQtPmRpZmZvcHQsIERJRkZfQ09NTUlUKSwgc3Rkb3V0KTsKKwkJaWYgKG9wdC0+Y29tbWl0X2Zvcm1hdCAhPSBDTUlUX0ZNVF9PTkVMSU5FKQorCQkJZnB1dHMoImNvbW1pdCAiLCBzdGRvdXQpOworCQlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBCT1VOREFSWSkKKwkJCXB1dGNoYXIoJy0nKTsKKwkJZWxzZSBpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQkJcHV0Y2hhcignXicpOworCQllbHNlIGlmIChvcHQtPmxlZnRfcmlnaHQpIHsKKwkJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIFNZTU1FVFJJQ19MRUZUKQorCQkJCXB1dGNoYXIoJzwnKTsKKwkJCWVsc2UKKwkJCQlwdXRjaGFyKCc+Jyk7CisJCX0KKwkJZnB1dHMoZGlmZl91bmlxdWVfYWJicmV2KGNvbW1pdC0+b2JqZWN0LnNoYTEsIGFiYnJldl9jb21taXQpLAorCQkgICAgICBzdGRvdXQpOworCQlpZiAob3B0LT5wYXJlbnRzKQorCQkJc2hvd19wYXJlbnRzKGNvbW1pdCwgYWJicmV2X2NvbW1pdCk7CisJCWlmIChwYXJlbnQpCisJCQlwcmludGYoIiAoZnJvbSAlcykiLAorCQkJICAgICAgIGRpZmZfdW5pcXVlX2FiYnJldihwYXJlbnQtPm9iamVjdC5zaGExLAorCQkJCQkJICBhYmJyZXZfY29tbWl0KSk7CisJCXNob3dfZGVjb3JhdGlvbnMoY29tbWl0KTsKKwkJcHJpbnRmKCIlcyIsIGRpZmZfZ2V0X2NvbG9yX29wdCgmb3B0LT5kaWZmb3B0LCBESUZGX1JFU0VUKSk7CisJCXB1dGNoYXIob3B0LT5jb21taXRfZm9ybWF0ID09IENNSVRfRk1UX09ORUxJTkUgPyAnICcgOiAnXG4nKTsKKwkJaWYgKG9wdC0+cmVmbG9nX2luZm8pIHsKKwkJCXNob3dfcmVmbG9nX21lc3NhZ2Uob3B0LT5yZWZsb2dfaW5mbywKKwkJCQkgICAgb3B0LT5jb21taXRfZm9ybWF0ID09IENNSVRfRk1UX09ORUxJTkUsCisJCQkJICAgIG9wdC0+ZGF0ZV9tb2RlKTsKKwkJCWlmIChvcHQtPmNvbW1pdF9mb3JtYXQgPT0gQ01JVF9GTVRfT05FTElORSkgeworCQkJCXByaW50ZigiJXMiLCBzZXApOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KKworCWlmICghY29tbWl0LT5idWZmZXIpCisJCXJldHVybjsKKworCS8qCisJICogQW5kIHRoZW4gdGhlIHByZXR0eS1wcmludGVkIG1lc3NhZ2UgaXRzZWxmCisJICovCisJc3RyYnVmX2luaXQoJm1zZ2J1ZiwgMCk7CisJaWYgKG5lZWRfOGJpdF9jdGUgPj0gMCkKKwkJbmVlZF84Yml0X2N0ZSA9IGhhc19ub25fYXNjaWkob3B0LT5hZGRfc2lnbm9mZik7CisJcHJldHR5X3ByaW50X2NvbW1pdChvcHQtPmNvbW1pdF9mb3JtYXQsIGNvbW1pdCwgJm1zZ2J1ZiwKKwkJCSAgICBhYmJyZXYsIHN1YmplY3QsIGV4dHJhX2hlYWRlcnMsIG9wdC0+ZGF0ZV9tb2RlLAorCQkJICAgIG5lZWRfOGJpdF9jdGUpOworCisJaWYgKG9wdC0+YWRkX3NpZ25vZmYpCisJCWFwcGVuZF9zaWdub2ZmKCZtc2didWYsIG9wdC0+YWRkX3NpZ25vZmYpOworCWlmIChvcHQtPnNob3dfbG9nX3NpemUpCisJCXByaW50ZigibG9nIHNpemUgJWlcbiIsIChpbnQpbXNnYnVmLmxlbik7CisKKwlpZiAobXNnYnVmLmxlbikKKwkJcHJpbnRmKCIlcyVzJXMiLCBtc2didWYuYnVmLCBleHRyYSwgc2VwKTsKKwlzdHJidWZfcmVsZWFzZSgmbXNnYnVmKTsKK30KKworaW50IGxvZ190cmVlX2RpZmZfZmx1c2goc3RydWN0IHJldl9pbmZvICpvcHQpCit7CisJZGlmZmNvcmVfc3RkKCZvcHQtPmRpZmZvcHQpOworCisJaWYgKGRpZmZfcXVldWVfaXNfZW1wdHkoKSkgeworCQlpbnQgc2F2ZWRfZm10ID0gb3B0LT5kaWZmb3B0Lm91dHB1dF9mb3JtYXQ7CisJCW9wdC0+ZGlmZm9wdC5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfTk9fT1VUUFVUOworCQlkaWZmX2ZsdXNoKCZvcHQtPmRpZmZvcHQpOworCQlvcHQtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCA9IHNhdmVkX2ZtdDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG9wdC0+bG9naW5mbyAmJiAhb3B0LT5ub19jb21taXRfaWQpIHsKKwkJLyogV2hlbiBzaG93aW5nIGEgdmVyYm9zZSBoZWFkZXIgKGkuZS4gbG9nIG1lc3NhZ2UpLAorCQkgKiBhbmQgbm90IGluIC0tcHJldHR5PW9uZWxpbmUgZm9ybWF0LCB3ZSB3b3VsZCB3YW50CisJCSAqIGFuIGV4dHJhIG5ld2xpbmUgYmV0d2VlbiB0aGUgZW5kIG9mIGxvZyBhbmQgdGhlCisJCSAqIG91dHB1dCBmb3IgcmVhZGFiaWxpdHkuCisJCSAqLworCQlzaG93X2xvZyhvcHQsIG9wdC0+ZGlmZm9wdC5tc2dfc2VwKTsKKwkJaWYgKChvcHQtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCAmIH5ESUZGX0ZPUk1BVF9OT19PVVRQVVQpICYmCisJCSAgICBvcHQtPnZlcmJvc2VfaGVhZGVyICYmCisJCSAgICBvcHQtPmNvbW1pdF9mb3JtYXQgIT0gQ01JVF9GTVRfT05FTElORSkgeworCQkJaW50IHBjaCA9IERJRkZfRk9STUFUX0RJRkZTVEFUIHwgRElGRl9GT1JNQVRfUEFUQ0g7CisJCQlpZiAoKHBjaCAmIG9wdC0+ZGlmZm9wdC5vdXRwdXRfZm9ybWF0KSA9PSBwY2gpCisJCQkJcHJpbnRmKCItLS0iKTsKKwkJCXB1dGNoYXIoJ1xuJyk7CisJCX0KKwl9CisJZGlmZl9mbHVzaCgmb3B0LT5kaWZmb3B0KTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBkb19kaWZmX2NvbWJpbmVkKHN0cnVjdCByZXZfaW5mbyAqb3B0LCBzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJdW5zaWduZWQgY29uc3QgY2hhciAqc2hhMSA9IGNvbW1pdC0+b2JqZWN0LnNoYTE7CisKKwlkaWZmX3RyZWVfY29tYmluZWRfbWVyZ2Uoc2hhMSwgb3B0LT5kZW5zZV9jb21iaW5lZF9tZXJnZXMsIG9wdCk7CisJcmV0dXJuICFvcHQtPmxvZ2luZm87Cit9CisKKy8qCisgKiBTaG93IHRoZSBkaWZmIG9mIGEgY29tbWl0LgorICoKKyAqIFJldHVybiB0cnVlIGlmIHdlIHByaW50ZWQgYW55IGxvZyBpbmZvIG1lc3NhZ2VzCisgKi8KK3N0YXRpYyBpbnQgbG9nX3RyZWVfZGlmZihzdHJ1Y3QgcmV2X2luZm8gKm9wdCwgc3RydWN0IGNvbW1pdCAqY29tbWl0LCBzdHJ1Y3QgbG9nX2luZm8gKmxvZykKK3sKKwlpbnQgc2hvd2VkX2xvZzsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHM7CisJdW5zaWduZWQgY29uc3QgY2hhciAqc2hhMSA9IGNvbW1pdC0+b2JqZWN0LnNoYTE7CisKKwlpZiAoIW9wdC0+ZGlmZikKKwkJcmV0dXJuIDA7CisKKwkvKiBSb290IGNvbW1pdD8gKi8KKwlwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOworCWlmICghcGFyZW50cykgeworCQlpZiAob3B0LT5zaG93X3Jvb3RfZGlmZikgeworCQkJZGlmZl9yb290X3RyZWVfc2hhMShzaGExLCAiIiwgJm9wdC0+ZGlmZm9wdCk7CisJCQlsb2dfdHJlZV9kaWZmX2ZsdXNoKG9wdCk7CisJCX0KKwkJcmV0dXJuICFvcHQtPmxvZ2luZm87CisJfQorCisJLyogTW9yZSB0aGFuIG9uZSBwYXJlbnQ/ICovCisJaWYgKHBhcmVudHMgJiYgcGFyZW50cy0+bmV4dCkgeworCQlpZiAob3B0LT5pZ25vcmVfbWVyZ2VzKQorCQkJcmV0dXJuIDA7CisJCWVsc2UgaWYgKG9wdC0+Y29tYmluZV9tZXJnZXMpCisJCQlyZXR1cm4gZG9fZGlmZl9jb21iaW5lZChvcHQsIGNvbW1pdCk7CisKKwkJLyogSWYgd2Ugc2hvdyBpbmRpdmlkdWFsIGRpZmZzLCBzaG93IHRoZSBwYXJlbnQgaW5mbyAqLworCQlsb2ctPnBhcmVudCA9IHBhcmVudHMtPml0ZW07CisJfQorCisJc2hvd2VkX2xvZyA9IDA7CisJZm9yICg7OykgeworCQlzdHJ1Y3QgY29tbWl0ICpwYXJlbnQgPSBwYXJlbnRzLT5pdGVtOworCisJCWRpZmZfdHJlZV9zaGExKHBhcmVudC0+b2JqZWN0LnNoYTEsIHNoYTEsICIiLCAmb3B0LT5kaWZmb3B0KTsKKwkJbG9nX3RyZWVfZGlmZl9mbHVzaChvcHQpOworCisJCXNob3dlZF9sb2cgfD0gIW9wdC0+bG9naW5mbzsKKworCQkvKiBTZXQgdXAgdGhlIGxvZyBpbmZvIGZvciB0aGUgbmV4dCBwYXJlbnQsIGlmIGFueS4uICovCisJCXBhcmVudHMgPSBwYXJlbnRzLT5uZXh0OworCQlpZiAoIXBhcmVudHMpCisJCQlicmVhazsKKwkJbG9nLT5wYXJlbnQgPSBwYXJlbnRzLT5pdGVtOworCQlvcHQtPmxvZ2luZm8gPSBsb2c7CisJfQorCXJldHVybiBzaG93ZWRfbG9nOworfQorCitpbnQgbG9nX3RyZWVfY29tbWl0KHN0cnVjdCByZXZfaW5mbyAqb3B0LCBzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJc3RydWN0IGxvZ19pbmZvIGxvZzsKKwlpbnQgc2hvd247CisKKwlsb2cuY29tbWl0ID0gY29tbWl0OworCWxvZy5wYXJlbnQgPSBOVUxMOworCW9wdC0+bG9naW5mbyA9ICZsb2c7CisKKwlzaG93biA9IGxvZ190cmVlX2RpZmYob3B0LCBjb21taXQsICZsb2cpOworCWlmICghc2hvd24gJiYgb3B0LT5sb2dpbmZvICYmIG9wdC0+YWx3YXlzX3Nob3dfaGVhZGVyKSB7CisJCWxvZy5wYXJlbnQgPSBOVUxMOworCQlzaG93X2xvZyhvcHQsICIiKTsKKwkJc2hvd24gPSAxOworCX0KKwlvcHQtPmxvZ2luZm8gPSBOVUxMOworCW1heWJlX2ZsdXNoX29yX2RpZShzdGRvdXQsICJzdGRvdXQiKTsKKwlyZXR1cm4gc2hvd247Cit9CmRpZmYgLS1naXQgYS9sb2ctdHJlZS5oIGIvbG9nLXRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTQ2ZmYzCi0tLSAvZGV2L251bGwKKysrIGIvbG9nLXRyZWUuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIExPR19UUkVFX0gKKyNkZWZpbmUgTE9HX1RSRUVfSAorCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKworc3RydWN0IGxvZ19pbmZvIHsKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQsICpwYXJlbnQ7Cit9OworCit2b2lkIGluaXRfbG9nX3RyZWVfb3B0KHN0cnVjdCByZXZfaW5mbyAqKTsKK2ludCBsb2dfdHJlZV9kaWZmX2ZsdXNoKHN0cnVjdCByZXZfaW5mbyAqKTsKK2ludCBsb2dfdHJlZV9jb21taXQoc3RydWN0IHJldl9pbmZvICosIHN0cnVjdCBjb21taXQgKik7CitpbnQgbG9nX3RyZWVfb3B0X3BhcnNlKHN0cnVjdCByZXZfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBpbnQpOwordm9pZCBzaG93X2xvZyhzdHJ1Y3QgcmV2X2luZm8gKm9wdCwgY29uc3QgY2hhciAqc2VwKTsKK3ZvaWQgc2hvd19kZWNvcmF0aW9ucyhzdHJ1Y3QgY29tbWl0ICpjb21taXQpOwordm9pZCBsb2dfd3JpdGVfZW1haWxfaGVhZGVycyhzdHJ1Y3QgcmV2X2luZm8gKm9wdCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgY29uc3QgY2hhciAqKnN1YmplY3RfcCwKKwkJCSAgICAgY29uc3QgY2hhciAqKmV4dHJhX2hlYWRlcnNfcCwKKwkJCSAgICAgaW50ICpuZWVkXzhiaXRfY3RlX3ApOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21haWxtYXAuYyBiL21haWxtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDE3MjU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWFpbG1hcC5jCkBAIC0wLDAgKzEsOTIgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInBhdGgtbGlzdC5oIgorI2luY2x1ZGUgIm1haWxtYXAuaCIKKworaW50IHJlYWRfbWFpbG1hcChzdHJ1Y3QgcGF0aF9saXN0ICptYXAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjaGFyICoqcmVwb19hYmJyZXYpCit7CisJY2hhciBidWZmZXJbMTAyNF07CisJRklMRSAqZiA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworCisJaWYgKGYgPT0gTlVMTCkKKwkJcmV0dXJuIDE7CisJd2hpbGUgKGZnZXRzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGYpICE9IE5VTEwpIHsKKwkJY2hhciAqZW5kX29mX25hbWUsICpsZWZ0X2JyYWNrZXQsICpyaWdodF9icmFja2V0OworCQljaGFyICpuYW1lLCAqZW1haWw7CisJCWludCBpOworCQlpZiAoYnVmZmVyWzBdID09ICcjJykgeworCQkJc3RhdGljIGNvbnN0IGNoYXIgYWJicmV2W10gPSAiIyByZXBvLWFiYnJldjoiOworCQkJaW50IGFiYmxlbiA9IHNpemVvZihhYmJyZXYpIC0gMTsKKwkJCWludCBsZW4gPSBzdHJsZW4oYnVmZmVyKTsKKworCQkJaWYgKCFyZXBvX2FiYnJldikKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGxlbiAmJiBidWZmZXJbbGVuIC0gMV0gPT0gJ1xuJykKKwkJCQlidWZmZXJbLS1sZW5dID0gMDsKKwkJCWlmICghc3RybmNtcChidWZmZXIsIGFiYnJldiwgYWJibGVuKSkgeworCQkJCWNoYXIgKmNwOworCisJCQkJaWYgKHJlcG9fYWJicmV2KQorCQkJCQlmcmVlKCpyZXBvX2FiYnJldik7CisJCQkJKnJlcG9fYWJicmV2ID0geG1hbGxvYyhsZW4pOworCisJCQkJZm9yIChjcCA9IGJ1ZmZlciArIGFiYmxlbjsgaXNzcGFjZSgqY3ApOyBjcCsrKQorCQkJCQk7IC8qIG5vdGhpbmcgKi8KKwkJCQlzdHJjcHkoKnJlcG9fYWJicmV2LCBjcCk7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKGxlZnRfYnJhY2tldCA9IHN0cmNocihidWZmZXIsICc8JykpID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJaWYgKChyaWdodF9icmFja2V0ID0gc3RyY2hyKGxlZnRfYnJhY2tldCArIDEsICc+JykpID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJaWYgKHJpZ2h0X2JyYWNrZXQgPT0gbGVmdF9icmFja2V0ICsgMSkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGVuZF9vZl9uYW1lID0gbGVmdF9icmFja2V0OworCQkgICAgIGVuZF9vZl9uYW1lICE9IGJ1ZmZlciAmJiBpc3NwYWNlKGVuZF9vZl9uYW1lWy0xXSk7CisJCSAgICAgZW5kX29mX25hbWUtLSkKKwkJCTsgLyoga2VlcCBvbiBsb29raW5nICovCisJCWlmIChlbmRfb2ZfbmFtZSA9PSBidWZmZXIpCisJCQljb250aW51ZTsKKwkJbmFtZSA9IHhtYWxsb2MoZW5kX29mX25hbWUgLSBidWZmZXIgKyAxKTsKKwkJc3RybGNweShuYW1lLCBidWZmZXIsIGVuZF9vZl9uYW1lIC0gYnVmZmVyICsgMSk7CisJCWVtYWlsID0geG1hbGxvYyhyaWdodF9icmFja2V0IC0gbGVmdF9icmFja2V0KTsKKwkJZm9yIChpID0gMDsgaSA8IHJpZ2h0X2JyYWNrZXQgLSBsZWZ0X2JyYWNrZXQgLSAxOyBpKyspCisJCQllbWFpbFtpXSA9IHRvbG93ZXIobGVmdF9icmFja2V0W2kgKyAxXSk7CisJCWVtYWlsW3JpZ2h0X2JyYWNrZXQgLSBsZWZ0X2JyYWNrZXQgLSAxXSA9ICdcMCc7CisJCXBhdGhfbGlzdF9pbnNlcnQoZW1haWwsIG1hcCktPnV0aWwgPSBuYW1lOworCX0KKwlmY2xvc2UoZik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBtYXBfZW1haWwoc3RydWN0IHBhdGhfbGlzdCAqbWFwLCBjb25zdCBjaGFyICplbWFpbCwgY2hhciAqbmFtZSwgaW50IG1heGxlbikKK3sKKwljaGFyICpwOworCXN0cnVjdCBwYXRoX2xpc3RfaXRlbSAqaXRlbTsKKwljaGFyIGJ1ZlsxMDI0XSwgKm1haWxidWY7CisJaW50IGk7CisKKwkvKiBhdXRvY29tcGxldGUgY29tbW9uIGRldmVsb3BlcnMgKi8KKwlwID0gc3RyY2hyKGVtYWlsLCAnPicpOworCWlmICghcCkKKwkJcmV0dXJuIDA7CisJaWYgKHAgLSBlbWFpbCArIDEgPCBzaXplb2YoYnVmKSkKKwkJbWFpbGJ1ZiA9IGJ1ZjsKKwllbHNlCisJCW1haWxidWYgPSB4bWFsbG9jKHAgLSBlbWFpbCArIDEpOworCisJLyogZG93bmNhc2UgdGhlIGVtYWlsIGFkZHJlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcCAtIGVtYWlsOyBpKyspCisJCW1haWxidWZbaV0gPSB0b2xvd2VyKGVtYWlsW2ldKTsKKwltYWlsYnVmW2ldID0gMDsKKwlpdGVtID0gcGF0aF9saXN0X2xvb2t1cChtYWlsYnVmLCBtYXApOworCWlmIChtYWlsYnVmICE9IGJ1ZikKKwkJZnJlZShtYWlsYnVmKTsKKwlpZiAoaXRlbSAhPSBOVUxMKSB7CisJCWNvbnN0IGNoYXIgKnJlYWxuYW1lID0gKGNvbnN0IGNoYXIgKilpdGVtLT51dGlsOworCQlzdHJsY3B5KG5hbWUsIHJlYWxuYW1lLCBtYXhsZW4pOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tYWlsbWFwLmggYi9tYWlsbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwM2ZkMgotLS0gL2Rldi9udWxsCisrKyBiL21haWxtYXAuaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgTUFJTE1BUF9ICisjZGVmaW5lIE1BSUxNQVBfSAorCitpbnQgcmVhZF9tYWlsbWFwKHN0cnVjdCBwYXRoX2xpc3QgKm1hcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGNoYXIgKipyZXBvX2FiYnJldik7CitpbnQgbWFwX2VtYWlsKHN0cnVjdCBwYXRoX2xpc3QgKm1haWxtYXAsIGNvbnN0IGNoYXIgKmVtYWlsLCBjaGFyICpuYW1lLCBpbnQgbWF4bGVuKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tYXRjaC10cmVlcy5jIGIvbWF0Y2gtdHJlZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmQ2ZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWF0Y2gtdHJlZXMuYwpAQCAtMCwwICsxLDMwMyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorCitzdGF0aWMgaW50IHNjb3JlX21pc3NpbmcodW5zaWduZWQgbW9kZSwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgc2NvcmU7CisKKwlpZiAoU19JU0RJUihtb2RlKSkKKwkJc2NvcmUgPSAtMTAwMDsKKwllbHNlIGlmIChTX0lTTE5LKG1vZGUpKQorCQlzY29yZSA9IC01MDA7CisJZWxzZQorCQlzY29yZSA9IC01MDsKKwlyZXR1cm4gc2NvcmU7Cit9CisKK3N0YXRpYyBpbnQgc2NvcmVfZGlmZmVycyh1bnNpZ25lZCBtb2RlMSwgdW5zaWduZWQgbW9kZTIsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IHNjb3JlOworCisJaWYgKFNfSVNESVIobW9kZTEpICE9IFNfSVNESVIobW9kZTIpKQorCQlzY29yZSA9IC0xMDA7CisJZWxzZSBpZiAoU19JU0xOSyhtb2RlMSkgIT0gU19JU0xOSyhtb2RlMikpCisJCXNjb3JlID0gLTUwOworCWVsc2UKKwkJc2NvcmUgPSAtNTsKKwlyZXR1cm4gc2NvcmU7Cit9CisKK3N0YXRpYyBpbnQgc2NvcmVfbWF0Y2hlcyh1bnNpZ25lZCBtb2RlMSwgdW5zaWduZWQgbW9kZTIsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IHNjb3JlOworCisJLyogSGVoLCB3ZSBmb3VuZCBTSEEtMSBjb2xsaXNpb25zIGJldHdlZW4gZGlmZmVyZW50IGtpbmQgb2Ygb2JqZWN0cyAqLworCWlmIChTX0lTRElSKG1vZGUxKSAhPSBTX0lTRElSKG1vZGUyKSkKKwkJc2NvcmUgPSAtMTAwOworCWVsc2UgaWYgKFNfSVNMTksobW9kZTEpICE9IFNfSVNMTksobW9kZTIpKQorCQlzY29yZSA9IC01MDsKKworCWVsc2UgaWYgKFNfSVNESVIobW9kZTEpKQorCQlzY29yZSA9IDEwMDA7CisJZWxzZSBpZiAoU19JU0xOSyhtb2RlMSkpCisJCXNjb3JlID0gNTAwOworCWVsc2UKKwkJc2NvcmUgPSAyNTA7CisJcmV0dXJuIHNjb3JlOworfQorCisvKgorICogSW5zcGVjdCB0d28gdHJlZXMsIGFuZCBnaXZlIGEgc2NvcmUgdGhhdCB0ZWxscyBob3cgc2ltaWxhciB0aGV5IGFyZS4KKyAqLworc3RhdGljIGludCBzY29yZV90cmVlcyhjb25zdCB1bnNpZ25lZCBjaGFyICpoYXNoMSwgY29uc3QgdW5zaWduZWQgY2hhciAqaGFzaDIpCit7CisJc3RydWN0IHRyZWVfZGVzYyBvbmU7CisJc3RydWN0IHRyZWVfZGVzYyB0d287CisJdm9pZCAqb25lX2J1ZiwgKnR3b19idWY7CisJaW50IHNjb3JlID0gMDsKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJb25lX2J1ZiA9IHJlYWRfc2hhMV9maWxlKGhhc2gxLCAmdHlwZSwgJnNpemUpOworCWlmICghb25lX2J1ZikKKwkJZGllKCJ1bmFibGUgdG8gcmVhZCB0cmVlICglcykiLCBzaGExX3RvX2hleChoYXNoMSkpOworCWlmICh0eXBlICE9IE9CSl9UUkVFKQorCQlkaWUoIiVzIGlzIG5vdCBhIHRyZWUiLCBzaGExX3RvX2hleChoYXNoMSkpOworCWluaXRfdHJlZV9kZXNjKCZvbmUsIG9uZV9idWYsIHNpemUpOworCXR3b19idWYgPSByZWFkX3NoYTFfZmlsZShoYXNoMiwgJnR5cGUsICZzaXplKTsKKwlpZiAoIXR3b19idWYpCisJCWRpZSgidW5hYmxlIHRvIHJlYWQgdHJlZSAoJXMpIiwgc2hhMV90b19oZXgoaGFzaDIpKTsKKwlpZiAodHlwZSAhPSBPQkpfVFJFRSkKKwkJZGllKCIlcyBpcyBub3QgYSB0cmVlIiwgc2hhMV90b19oZXgoaGFzaDIpKTsKKwlpbml0X3RyZWVfZGVzYygmdHdvLCB0d29fYnVmLCBzaXplKTsKKwl3aGlsZSAob25lLnNpemUgfCB0d28uc2l6ZSkgeworCQljb25zdCB1bnNpZ25lZCBjaGFyICplbGVtMSA9IGVsZW0xOworCQljb25zdCB1bnNpZ25lZCBjaGFyICplbGVtMiA9IGVsZW0yOworCQljb25zdCBjaGFyICpwYXRoMSA9IHBhdGgxOworCQljb25zdCBjaGFyICpwYXRoMiA9IHBhdGgyOworCQl1bnNpZ25lZCBtb2RlMSA9IG1vZGUxOworCQl1bnNpZ25lZCBtb2RlMiA9IG1vZGUyOworCQlpbnQgY21wOworCisJCWlmIChvbmUuc2l6ZSkKKwkJCWVsZW0xID0gdHJlZV9lbnRyeV9leHRyYWN0KCZvbmUsICZwYXRoMSwgJm1vZGUxKTsKKwkJaWYgKHR3by5zaXplKQorCQkJZWxlbTIgPSB0cmVlX2VudHJ5X2V4dHJhY3QoJnR3bywgJnBhdGgyLCAmbW9kZTIpOworCisJCWlmICghb25lLnNpemUpIHsKKwkJCS8qIHR3byBoYXMgbW9yZSBlbnRyaWVzICovCisJCQlzY29yZSArPSBzY29yZV9taXNzaW5nKG1vZGUyLCBwYXRoMik7CisJCQl1cGRhdGVfdHJlZV9lbnRyeSgmdHdvKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghdHdvLnNpemUpIHsKKwkJCS8qIHR3byBsYWNrcyB0aGlzIGVudHJ5ICovCisJCQlzY29yZSArPSBzY29yZV9taXNzaW5nKG1vZGUxLCBwYXRoMSk7CisJCQl1cGRhdGVfdHJlZV9lbnRyeSgmb25lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNtcCA9IGJhc2VfbmFtZV9jb21wYXJlKHBhdGgxLCBzdHJsZW4ocGF0aDEpLCBtb2RlMSwKKwkJCQkJcGF0aDIsIHN0cmxlbihwYXRoMiksIG1vZGUyKTsKKwkJaWYgKGNtcCA8IDApIHsKKwkJCS8qIHBhdGgxIGRvZXMgbm90IGFwcGVhciBpbiB0d28gKi8KKwkJCXNjb3JlICs9IHNjb3JlX21pc3NpbmcobW9kZTEsIHBhdGgxKTsKKwkJCXVwZGF0ZV90cmVlX2VudHJ5KCZvbmUpOworCQkJY29udGludWU7CisJCX0KKwkJZWxzZSBpZiAoY21wID4gMCkgeworCQkJLyogcGF0aDIgZG9lcyBub3QgYXBwZWFyIGluIG9uZSAqLworCQkJc2NvcmUgKz0gc2NvcmVfbWlzc2luZyhtb2RlMiwgcGF0aDIpOworCQkJdXBkYXRlX3RyZWVfZW50cnkoJnR3byk7CisJCQljb250aW51ZTsKKwkJfQorCQllbHNlIGlmIChoYXNoY21wKGVsZW0xLCBlbGVtMikpCisJCQkvKiB0aGV5IGFyZSBkaWZmZXJlbnQgKi8KKwkJCXNjb3JlICs9IHNjb3JlX2RpZmZlcnMobW9kZTEsIG1vZGUyLCBwYXRoMSk7CisJCWVsc2UKKwkJCS8qIHNhbWUgc3VidHJlZSBvciBibG9iICovCisJCQlzY29yZSArPSBzY29yZV9tYXRjaGVzKG1vZGUxLCBtb2RlMiwgcGF0aDEpOworCQl1cGRhdGVfdHJlZV9lbnRyeSgmb25lKTsKKwkJdXBkYXRlX3RyZWVfZW50cnkoJnR3byk7CisJfQorCWZyZWUob25lX2J1Zik7CisJZnJlZSh0d29fYnVmKTsKKwlyZXR1cm4gc2NvcmU7Cit9CisKKy8qCisgKiBNYXRjaCBvbmUgaXRzZWxmIGFuZCBpdHMgc3VidHJlZXMgd2l0aCB0d28gYW5kIHBpY2sgdGhlIGJlc3QgbWF0Y2guCisgKi8KK3N0YXRpYyB2b2lkIG1hdGNoX3RyZWVzKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhhc2gxLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqaGFzaDIsCisJCQlpbnQgKmJlc3Rfc2NvcmUsCisJCQljaGFyICoqYmVzdF9tYXRjaCwKKwkJCWNvbnN0IGNoYXIgKmJhc2UsCisJCQlpbnQgcmVjdXJzZV9saW1pdCkKK3sKKwlzdHJ1Y3QgdHJlZV9kZXNjIG9uZTsKKwl2b2lkICpvbmVfYnVmOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlvbmVfYnVmID0gcmVhZF9zaGExX2ZpbGUoaGFzaDEsICZ0eXBlLCAmc2l6ZSk7CisJaWYgKCFvbmVfYnVmKQorCQlkaWUoInVuYWJsZSB0byByZWFkIHRyZWUgKCVzKSIsIHNoYTFfdG9faGV4KGhhc2gxKSk7CisJaWYgKHR5cGUgIT0gT0JKX1RSRUUpCisJCWRpZSgiJXMgaXMgbm90IGEgdHJlZSIsIHNoYTFfdG9faGV4KGhhc2gxKSk7CisJaW5pdF90cmVlX2Rlc2MoJm9uZSwgb25lX2J1Ziwgc2l6ZSk7CisKKwl3aGlsZSAob25lLnNpemUpIHsKKwkJY29uc3QgY2hhciAqcGF0aDsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqZWxlbTsKKwkJdW5zaWduZWQgbW9kZTsKKwkJaW50IHNjb3JlOworCisJCWVsZW0gPSB0cmVlX2VudHJ5X2V4dHJhY3QoJm9uZSwgJnBhdGgsICZtb2RlKTsKKwkJaWYgKCFTX0lTRElSKG1vZGUpKQorCQkJZ290byBuZXh0OworCQlzY29yZSA9IHNjb3JlX3RyZWVzKGVsZW0sIGhhc2gyKTsKKwkJaWYgKCpiZXN0X3Njb3JlIDwgc2NvcmUpIHsKKwkJCWNoYXIgKm5ld3BhdGg7CisJCQluZXdwYXRoID0geG1hbGxvYyhzdHJsZW4oYmFzZSkgKyBzdHJsZW4ocGF0aCkgKyAxKTsKKwkJCXNwcmludGYobmV3cGF0aCwgIiVzJXMiLCBiYXNlLCBwYXRoKTsKKwkJCWZyZWUoKmJlc3RfbWF0Y2gpOworCQkJKmJlc3RfbWF0Y2ggPSBuZXdwYXRoOworCQkJKmJlc3Rfc2NvcmUgPSBzY29yZTsKKwkJfQorCQlpZiAocmVjdXJzZV9saW1pdCkgeworCQkJY2hhciAqbmV3YmFzZTsKKwkJCW5ld2Jhc2UgPSB4bWFsbG9jKHN0cmxlbihiYXNlKSArIHN0cmxlbihwYXRoKSArIDIpOworCQkJc3ByaW50ZihuZXdiYXNlLCAiJXMlcy8iLCBiYXNlLCBwYXRoKTsKKwkJCW1hdGNoX3RyZWVzKGVsZW0sIGhhc2gyLCBiZXN0X3Njb3JlLCBiZXN0X21hdGNoLAorCQkJCSAgICBuZXdiYXNlLCByZWN1cnNlX2xpbWl0IC0gMSk7CisJCQlmcmVlKG5ld2Jhc2UpOworCQl9CisKKwluZXh0OgorCQl1cGRhdGVfdHJlZV9lbnRyeSgmb25lKTsKKwl9CisJZnJlZShvbmVfYnVmKTsKK30KKworLyoKKyAqIEEgdHJlZSAiaGFzaDEiIGhhcyBhIHN1YmRpcmVjdG9yeSBhdCAicHJlZml4Ii4gIENvbWUgdXAgd2l0aCBhCisgKiB0cmVlIG9iamVjdCBieSByZXBsYWNpbmcgaXQgd2l0aCBhbm90aGVyIHRyZWUgImhhc2gyIi4KKyAqLworc3RhdGljIGludCBzcGxpY2VfdHJlZShjb25zdCB1bnNpZ25lZCBjaGFyICpoYXNoMSwKKwkJICAgICAgIGNoYXIgKnByZWZpeCwKKwkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhhc2gyLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqcmVzdWx0KQoreworCWNoYXIgKnN1YnBhdGg7CisJaW50IHRvcGxlbjsKKwljaGFyICpidWY7CisJdW5zaWduZWQgbG9uZyBzejsKKwlzdHJ1Y3QgdHJlZV9kZXNjIGRlc2M7CisJdW5zaWduZWQgY2hhciAqcmV3cml0ZV9oZXJlOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnJld3JpdGVfd2l0aDsKKwl1bnNpZ25lZCBjaGFyIHN1YnRyZWVbMjBdOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwlpbnQgc3RhdHVzOworCisJc3VicGF0aCA9IHN0cmNocihwcmVmaXgsICcvJyk7CisJaWYgKCFzdWJwYXRoKQorCQl0b3BsZW4gPSBzdHJsZW4ocHJlZml4KTsKKwllbHNlIHsKKwkJdG9wbGVuID0gc3VicGF0aCAtIHByZWZpeDsKKwkJc3VicGF0aCsrOworCX0KKworCWJ1ZiA9IHJlYWRfc2hhMV9maWxlKGhhc2gxLCAmdHlwZSwgJnN6KTsKKwlpZiAoIWJ1ZikKKwkJZGllKCJjYW5ub3QgcmVhZCB0cmVlICVzIiwgc2hhMV90b19oZXgoaGFzaDEpKTsKKwlpbml0X3RyZWVfZGVzYygmZGVzYywgYnVmLCBzeik7CisKKwlyZXdyaXRlX2hlcmUgPSBOVUxMOworCXdoaWxlIChkZXNjLnNpemUpIHsKKwkJY29uc3QgY2hhciAqbmFtZTsKKwkJdW5zaWduZWQgbW9kZTsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMTsKKworCQlzaGExID0gdHJlZV9lbnRyeV9leHRyYWN0KCZkZXNjLCAmbmFtZSwgJm1vZGUpOworCQlpZiAoc3RybGVuKG5hbWUpID09IHRvcGxlbiAmJgorCQkgICAgIW1lbWNtcChuYW1lLCBwcmVmaXgsIHRvcGxlbikpIHsKKwkJCWlmICghU19JU0RJUihtb2RlKSkKKwkJCQlkaWUoImVudHJ5ICVzIGluIHRyZWUgJXMgaXMgbm90IGEgdHJlZSIsCisJCQkJICAgIG5hbWUsIHNoYTFfdG9faGV4KGhhc2gxKSk7CisJCQlyZXdyaXRlX2hlcmUgPSAodW5zaWduZWQgY2hhciAqKSBzaGExOworCQkJYnJlYWs7CisJCX0KKwkJdXBkYXRlX3RyZWVfZW50cnkoJmRlc2MpOworCX0KKwlpZiAoIXJld3JpdGVfaGVyZSkKKwkJZGllKCJlbnRyeSAlLipzIG5vdCBmb3VuZCBpbiB0cmVlICVzIiwKKwkJICAgIHRvcGxlbiwgcHJlZml4LCBzaGExX3RvX2hleChoYXNoMSkpOworCWlmIChzdWJwYXRoKSB7CisJCXN0YXR1cyA9IHNwbGljZV90cmVlKHJld3JpdGVfaGVyZSwgc3VicGF0aCwgaGFzaDIsIHN1YnRyZWUpOworCQlpZiAoc3RhdHVzKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJcmV3cml0ZV93aXRoID0gc3VidHJlZTsKKwl9CisJZWxzZQorCQlyZXdyaXRlX3dpdGggPSBoYXNoMjsKKwloYXNoY3B5KHJld3JpdGVfaGVyZSwgcmV3cml0ZV93aXRoKTsKKwlzdGF0dXMgPSB3cml0ZV9zaGExX2ZpbGUoYnVmLCBzeiwgdHJlZV90eXBlLCByZXN1bHQpOworCWZyZWUoYnVmKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogV2UgYXJlIHRyeWluZyB0byBjb21lIHVwIHdpdGggYSBtZXJnZSBiZXR3ZWVuIG9uZSBhbmQgdHdvIHRoYXQKKyAqIHJlc3VsdHMgaW4gYSB0cmVlIHNoYXBlIHNpbWlsYXIgdG8gb25lLiAgVGhlIHRyZWUgdHdvIG1pZ2h0CisgKiBjb3JyZXNwb25kIHRvIGEgc3VidHJlZSBvZiBvbmUsIGluIHdoaWNoIGNhc2UgaXQgbmVlZHMgdG8gYmUKKyAqIHNoaWZ0ZWQgZG93biBieSBwcmVmaXhpbmcgb3RoZXJ3aXNlIGVtcHR5IGRpcmVjdG9yaWVzLiAgT24gdGhlCisgKiBvdGhlciBoYW5kLCBpdCBjb3VsZCBjb3ZlciB0cmVlIG9uZSBhbmQgd2UgbWlnaHQgbmVlZCB0byBwaWNrIGEKKyAqIHN1YnRyZWUgb2YgaXQuCisgKi8KK3ZvaWQgc2hpZnRfdHJlZShjb25zdCB1bnNpZ25lZCBjaGFyICpoYXNoMSwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqaGFzaDIsCisJCXVuc2lnbmVkIGNoYXIgKnNoaWZ0ZWQsCisJCWludCBkZXB0aF9saW1pdCkKK3sKKwljaGFyICphZGRfcHJlZml4OworCWNoYXIgKmRlbF9wcmVmaXg7CisJaW50IGFkZF9zY29yZSwgZGVsX3Njb3JlOworCisJYWRkX3Njb3JlID0gZGVsX3Njb3JlID0gc2NvcmVfdHJlZXMoaGFzaDEsIGhhc2gyKTsKKwlhZGRfcHJlZml4ID0geGNhbGxvYygxLCAxKTsKKwlkZWxfcHJlZml4ID0geGNhbGxvYygxLCAxKTsKKworCS8qCisJICogU2VlIGlmIG9uZSdzIHN1YnRyZWUgcmVzZW1ibGVzIHR3bzsgaWYgc28gd2UgbmVlZCB0byBwcmVmaXgKKwkgKiB0d28gd2l0aCBhIGZldyBmYWtlIHRyZWVzIHRvIG1hdGNoIHRoZSBwcmVmaXguCisJICovCisJbWF0Y2hfdHJlZXMoaGFzaDEsIGhhc2gyLCAmYWRkX3Njb3JlLCAmYWRkX3ByZWZpeCwgIiIsIGRlcHRoX2xpbWl0KTsKKworCS8qCisJICogU2VlIGlmIHR3bydzIHN1YnRyZWUgcmVzZW1ibGVzIG9uZTsgaWYgc28gd2UgbmVlZCB0bworCSAqIHBpY2sgb25seSBzdWJ0cmVlIG9mIHR3by4KKwkgKi8KKwltYXRjaF90cmVlcyhoYXNoMiwgaGFzaDEsICZkZWxfc2NvcmUsICZkZWxfcHJlZml4LCAiIiwgZGVwdGhfbGltaXQpOworCisJLyogQXNzdW1lIHdlIGRvIG5vdCBoYXZlIHRvIGRvIGFueSBzaGlmdGluZyAqLworCWhhc2hjcHkoc2hpZnRlZCwgaGFzaDIpOworCisJaWYgKGFkZF9zY29yZSA8IGRlbF9zY29yZSkgeworCQkvKiBXZSBuZWVkIHRvIHBpY2sgYSBzdWJ0cmVlIG9mIHR3byAqLworCQl1bnNpZ25lZCBtb2RlOworCisJCWlmICghKmRlbF9wcmVmaXgpCisJCQlyZXR1cm47CisKKwkJaWYgKGdldF90cmVlX2VudHJ5KGhhc2gyLCBkZWxfcHJlZml4LCBzaGlmdGVkLCAmbW9kZSkpCisJCQlkaWUoImNhbm5vdCBmaW5kIHBhdGggJXMgaW4gdHJlZSAlcyIsCisJCQkgICAgZGVsX3ByZWZpeCwgc2hhMV90b19oZXgoaGFzaDIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghKmFkZF9wcmVmaXgpCisJCXJldHVybjsKKworCXNwbGljZV90cmVlKGhhc2gxLCBhZGRfcHJlZml4LCBoYXNoMiwgc2hpZnRlZCk7Cit9CmRpZmYgLS1naXQgYS9tZXJnZS1maWxlLmMgYi9tZXJnZS1maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE5MzljOQotLS0gL2Rldi9udWxsCisrKyBiL21lcmdlLWZpbGUuYwpAQCAtMCwwICsxLDExOCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicnVuLWNvbW1hbmQuaCIKKyNpbmNsdWRlICJ4ZGlmZi1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJibG9iLmgiCisKK3N0YXRpYyBpbnQgZmlsbF9tbWZpbGVfYmxvYihtbWZpbGVfdCAqZiwgc3RydWN0IGJsb2IgKm9iaikKK3sKKwl2b2lkICpidWY7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKworCWJ1ZiA9IHJlYWRfc2hhMV9maWxlKG9iai0+b2JqZWN0LnNoYTEsICZ0eXBlLCAmc2l6ZSk7CisJaWYgKCFidWYpCisJCXJldHVybiAtMTsKKwlpZiAodHlwZSAhPSBPQkpfQkxPQikKKwkJcmV0dXJuIC0xOworCWYtPnB0ciA9IGJ1ZjsKKwlmLT5zaXplID0gc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9tbWZpbGUobW1maWxlX3QgKmYpCit7CisJZnJlZShmLT5wdHIpOworfQorCitzdGF0aWMgdm9pZCAqdGhyZWVfd2F5X2ZpbGVtZXJnZShtbWZpbGVfdCAqYmFzZSwgbW1maWxlX3QgKm91ciwgbW1maWxlX3QgKnRoZWlyLCB1bnNpZ25lZCBsb25nICpzaXplKQoreworCW1tYnVmZmVyX3QgcmVzOworCXhwcGFyYW1fdCB4cHA7CisJaW50IG1lcmdlX3N0YXR1czsKKworCW1lbXNldCgmeHBwLCAwLCBzaXplb2YoeHBwKSk7CisJbWVyZ2Vfc3RhdHVzID0geGRsX21lcmdlKGJhc2UsIG91ciwgIi5vdXIiLCB0aGVpciwgIi50aGVpciIsCisJCSZ4cHAsIFhETF9NRVJHRV9aRUFMT1VTLCAmcmVzKTsKKworCWlmIChtZXJnZV9zdGF0dXMgPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCSpzaXplID0gcmVzLnNpemU7CisJcmV0dXJuIHJlcy5wdHI7Cit9CisKK3N0YXRpYyBpbnQgY29tbW9uX291dGYodm9pZCAqcHJpdl8sIG1tYnVmZmVyX3QgKm1iLCBpbnQgbmJ1ZikKK3sKKwlpbnQgaTsKKwltbWZpbGVfdCAqZHN0ID0gcHJpdl87CisKKwlmb3IgKGkgPSAwOyBpIDwgbmJ1ZjsgaSsrKSB7CisJCW1lbWNweShkc3QtPnB0ciArIGRzdC0+c2l6ZSwgbWJbaV0ucHRyLCBtYltpXS5zaXplKTsKKwkJZHN0LT5zaXplICs9IG1iW2ldLnNpemU7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlbmVyYXRlX2NvbW1vbl9maWxlKG1tZmlsZV90ICpyZXMsIG1tZmlsZV90ICpmMSwgbW1maWxlX3QgKmYyKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IGYxLT5zaXplIDwgZjItPnNpemUgPyBmMS0+c2l6ZSA6IGYyLT5zaXplOworCXZvaWQgKnB0ciA9IHhtYWxsb2Moc2l6ZSk7CisJeHBwYXJhbV90IHhwcDsKKwl4ZGVtaXRjb25mX3QgeGVjZmc7CisJeGRlbWl0Y2JfdCBlY2I7CisKKwl4cHAuZmxhZ3MgPSBYREZfTkVFRF9NSU5JTUFMOworCW1lbXNldCgmeGVjZmcsIDAsIHNpemVvZih4ZWNmZykpOworCXhlY2ZnLmN0eGxlbiA9IDM7CisJeGVjZmcuZmxhZ3MgPSBYRExfRU1JVF9DT01NT047CisJZWNiLm91dGYgPSBjb21tb25fb3V0ZjsKKworCXJlcy0+cHRyID0gcHRyOworCXJlcy0+c2l6ZSA9IDA7CisKKwllY2IucHJpdiA9IHJlczsKKwlyZXR1cm4geGRpX2RpZmYoZjEsIGYyLCAmeHBwLCAmeGVjZmcsICZlY2IpOworfQorCit2b2lkICptZXJnZV9maWxlKHN0cnVjdCBibG9iICpiYXNlLCBzdHJ1Y3QgYmxvYiAqb3VyLCBzdHJ1Y3QgYmxvYiAqdGhlaXIsIHVuc2lnbmVkIGxvbmcgKnNpemUpCit7CisJdm9pZCAqcmVzID0gTlVMTDsKKwltbWZpbGVfdCBmMSwgZjIsIGNvbW1vbjsKKworCS8qCisJICogUmVtb3ZlZCBpbiBlaXRoZXIgYnJhbmNoPworCSAqCisJICogTk9URSEgVGhpcyBkZXBlbmRzIG9uIHRoZSBjYWxsZXIgaGF2aW5nIGRvbmUgdGhlCisJICogcHJvcGVyIHdhcm5pbmcgYWJvdXQgcmVtb3ZpbmcgYSBmaWxlIHRoYXQgZ290CisJICogbW9kaWZpZWQgaW4gdGhlIG90aGVyIGJyYW5jaCEKKwkgKi8KKwlpZiAoIW91ciB8fCAhdGhlaXIpIHsKKwkJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCQlpZiAoYmFzZSkKKwkJCXJldHVybiBOVUxMOworCQlpZiAoIW91cikKKwkJCW91ciA9IHRoZWlyOworCQlyZXR1cm4gcmVhZF9zaGExX2ZpbGUob3VyLT5vYmplY3Quc2hhMSwgJnR5cGUsIHNpemUpOworCX0KKworCWlmIChmaWxsX21tZmlsZV9ibG9iKCZmMSwgb3VyKSA8IDApCisJCWdvdG8gb3V0X25vX21tZmlsZTsKKwlpZiAoZmlsbF9tbWZpbGVfYmxvYigmZjIsIHRoZWlyKSA8IDApCisJCWdvdG8gb3V0X2ZyZWVfZjE7CisKKwlpZiAoYmFzZSkgeworCQlpZiAoZmlsbF9tbWZpbGVfYmxvYigmY29tbW9uLCBiYXNlKSA8IDApCisJCQlnb3RvIG91dF9mcmVlX2YyX2YxOworCX0gZWxzZSB7CisJCWlmIChnZW5lcmF0ZV9jb21tb25fZmlsZSgmY29tbW9uLCAmZjEsICZmMikgPCAwKQorCQkJZ290byBvdXRfZnJlZV9mMl9mMTsKKwl9CisJcmVzID0gdGhyZWVfd2F5X2ZpbGVtZXJnZSgmY29tbW9uLCAmZjEsICZmMiwgc2l6ZSk7CisJZnJlZV9tbWZpbGUoJmNvbW1vbik7CitvdXRfZnJlZV9mMl9mMToKKwlmcmVlX21tZmlsZSgmZjIpOworb3V0X2ZyZWVfZjE6CisJZnJlZV9tbWZpbGUoJmYxKTsKK291dF9ub19tbWZpbGU6CisJcmV0dXJuIHJlczsKK30KZGlmZiAtLWdpdCBhL21lcmdlLWluZGV4LmMgYi9tZXJnZS1pbmRleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0OTFjNTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZXJnZS1pbmRleC5jCkBAIC0wLDAgKzEsMTI3IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJydW4tY29tbWFuZC5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqcGdtOworc3RhdGljIGNvbnN0IGNoYXIgKmFyZ3VtZW50c1s5XTsKK3N0YXRpYyBpbnQgb25lX3Nob3QsIHF1aWV0Oworc3RhdGljIGludCBlcnI7CisKK3N0YXRpYyB2b2lkIHJ1bl9wcm9ncmFtKHZvaWQpCit7CisJc3RydWN0IGNoaWxkX3Byb2Nlc3MgY2hpbGQ7CisJbWVtc2V0KCZjaGlsZCwgMCwgc2l6ZW9mKGNoaWxkKSk7CisJY2hpbGQuYXJndiA9IGFyZ3VtZW50czsKKwlpZiAocnVuX2NvbW1hbmQoJmNoaWxkKSkgeworCQlpZiAob25lX3Nob3QpIHsKKwkJCWVycisrOworCQl9IGVsc2UgeworCQkJaWYgKCFxdWlldCkKKwkJCQlkaWUoIm1lcmdlIHByb2dyYW0gZmFpbGVkIik7CisJCQlleGl0KDEpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IG1lcmdlX2VudHJ5KGludCBwb3MsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IGZvdW5kOworCisJaWYgKHBvcyA+PSBhY3RpdmVfbnIpCisJCWRpZSgiZ2l0LW1lcmdlLWluZGV4OiAlcyBub3QgaW4gdGhlIGNhY2hlIiwgcGF0aCk7CisJYXJndW1lbnRzWzBdID0gcGdtOworCWFyZ3VtZW50c1sxXSA9ICIiOworCWFyZ3VtZW50c1syXSA9ICIiOworCWFyZ3VtZW50c1szXSA9ICIiOworCWFyZ3VtZW50c1s0XSA9IHBhdGg7CisJYXJndW1lbnRzWzVdID0gIiI7CisJYXJndW1lbnRzWzZdID0gIiI7CisJYXJndW1lbnRzWzddID0gIiI7CisJYXJndW1lbnRzWzhdID0gTlVMTDsKKwlmb3VuZCA9IDA7CisJZG8geworCQlzdGF0aWMgY2hhciBoZXhidWZbNF1bNjBdOworCQlzdGF0aWMgY2hhciBvd25idWZbNF1bNjBdOworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW3Bvc107CisJCWludCBzdGFnZSA9IGNlX3N0YWdlKGNlKTsKKworCQlpZiAoc3RyY21wKGNlLT5uYW1lLCBwYXRoKSkKKwkJCWJyZWFrOworCQlmb3VuZCsrOworCQlzdHJjcHkoaGV4YnVmW3N0YWdlXSwgc2hhMV90b19oZXgoY2UtPnNoYTEpKTsKKwkJc3ByaW50Zihvd25idWZbc3RhZ2VdLCAiJW8iLCBjZS0+Y2VfbW9kZSk7CisJCWFyZ3VtZW50c1tzdGFnZV0gPSBoZXhidWZbc3RhZ2VdOworCQlhcmd1bWVudHNbc3RhZ2UgKyA0XSA9IG93bmJ1ZltzdGFnZV07CisJfSB3aGlsZSAoKytwb3MgPCBhY3RpdmVfbnIpOworCWlmICghZm91bmQpCisJCWRpZSgiZ2l0LW1lcmdlLWluZGV4OiAlcyBub3QgaW4gdGhlIGNhY2hlIiwgcGF0aCk7CisJcnVuX3Byb2dyYW0oKTsKKwlyZXR1cm4gZm91bmQ7Cit9CisKK3N0YXRpYyB2b2lkIG1lcmdlX2ZpbGUoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgcG9zID0gY2FjaGVfbmFtZV9wb3MocGF0aCwgc3RybGVuKHBhdGgpKTsKKworCS8qCisJICogSWYgaXQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGNhY2hlIGFzIHN0YWdlMCwgaXQncworCSAqIGFscmVhZHkgbWVyZ2VkIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLgorCSAqLworCWlmIChwb3MgPCAwKQorCQltZXJnZV9lbnRyeSgtcG9zLTEsIHBhdGgpOworfQorCitzdGF0aWMgdm9pZCBtZXJnZV9hbGwodm9pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yOyBpKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtpXTsKKwkJaWYgKCFjZV9zdGFnZShjZSkpCisJCQljb250aW51ZTsKKwkJaSArPSBtZXJnZV9lbnRyeShpLCBjZS0+bmFtZSktMTsKKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSwgZm9yY2VfZmlsZSA9IDA7CisKKwkvKiBXaXRob3V0IHRoaXMgd2UgY2Fubm90IHJlbHkgb24gd2FpdHBpZCgpIHRvIHRlbGwKKwkgKiB3aGF0IGhhcHBlbmVkIHRvIG91ciBjaGlsZHJlbi4KKwkgKi8KKwlzaWduYWwoU0lHQ0hMRCwgU0lHX0RGTCk7CisKKwlpZiAoYXJnYyA8IDMpCisJCXVzYWdlKCJnaXQtbWVyZ2UtaW5kZXggWy1vXSBbLXFdIDxtZXJnZS1wcm9ncmFtPiAoLWEgfCBbLS1dIDxmaWxlbmFtZT4qKSIpOworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCXJlYWRfY2FjaGUoKTsKKworCWkgPSAxOworCWlmICghc3RyY21wKGFyZ3ZbaV0sICItbyIpKSB7CisJCW9uZV9zaG90ID0gMTsKKwkJaSsrOworCX0KKwlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXEiKSkgeworCQlxdWlldCA9IDE7CisJCWkrKzsKKwl9CisJcGdtID0gYXJndltpKytdOworCWZvciAoOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCWlmICghZm9yY2VfZmlsZSAmJiAqYXJnID09ICctJykgeworCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkgeworCQkJCWZvcmNlX2ZpbGUgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLWEiKSkgeworCQkJCW1lcmdlX2FsbCgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZGllKCJnaXQtbWVyZ2UtaW5kZXg6IHVua25vd24gb3B0aW9uICVzIiwgYXJnKTsKKwkJfQorCQltZXJnZV9maWxlKGFyZyk7CisJfQorCWlmIChlcnIgJiYgIXF1aWV0KQorCQlkaWUoIm1lcmdlIHByb2dyYW0gZmFpbGVkIik7CisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL21lcmdlLXJlY3Vyc2l2ZS5oIGIvbWVyZ2UtcmVjdXJzaXZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3NjMwYQotLS0gL2Rldi9udWxsCisrKyBiL21lcmdlLXJlY3Vyc2l2ZS5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgTUVSR0VfUkVDVVJTSVZFX0gKKyNkZWZpbmUgTUVSR0VfUkVDVVJTSVZFX0gKKworaW50IG1lcmdlX3JlY3Vyc2l2ZShzdHJ1Y3QgY29tbWl0ICpoMSwKKwkJICAgIHN0cnVjdCBjb21taXQgKmgyLAorCQkgICAgY29uc3QgY2hhciAqYnJhbmNoMSwKKwkJICAgIGNvbnN0IGNoYXIgKmJyYW5jaDIsCisJCSAgICBzdHJ1Y3QgY29tbWl0X2xpc3QgKmFuY2VzdG9ycywKKwkJICAgIHN0cnVjdCBjb21taXQgKipyZXN1bHQpOworCitpbnQgbWVyZ2VfdHJlZXMoc3RydWN0IHRyZWUgKmhlYWQsCisJCXN0cnVjdCB0cmVlICptZXJnZSwKKwkJc3RydWN0IHRyZWUgKmNvbW1vbiwKKwkJY29uc3QgY2hhciAqYnJhbmNoMSwKKwkJY29uc3QgY2hhciAqYnJhbmNoMiwKKwkJc3RydWN0IHRyZWUgKipyZXN1bHQpOworCitzdHJ1Y3QgdHJlZSAqd3JpdGVfdHJlZV9mcm9tX21lbW9yeSh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZXJnZS10cmVlLmMgYi9tZXJnZS10cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJmYzEwZgotLS0gL2Rldi9udWxsCisrKyBiL21lcmdlLXRyZWUuYwpAQCAtMCwwICsxLDM2MCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisjaW5jbHVkZSAieGRpZmYtaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorCitzdGF0aWMgY29uc3QgY2hhciBtZXJnZV90cmVlX3VzYWdlW10gPSAiZ2l0LW1lcmdlLXRyZWUgPGJhc2UtdHJlZT4gPGJyYW5jaDE+IDxicmFuY2gyPiI7CitzdGF0aWMgaW50IHJlc29sdmVfZGlyZWN0b3JpZXMgPSAxOworCitzdHJ1Y3QgbWVyZ2VfbGlzdCB7CisJc3RydWN0IG1lcmdlX2xpc3QgKm5leHQ7CisJc3RydWN0IG1lcmdlX2xpc3QgKmxpbms7CS8qIG90aGVyIHN0YWdlcyBmb3IgdGhpcyBvYmplY3QgKi8KKworCXVuc2lnbmVkIGludCBzdGFnZSA6IDIsCisJCSAgICAgZmxhZ3MgOiAzMDsKKwl1bnNpZ25lZCBpbnQgbW9kZTsKKwljb25zdCBjaGFyICpwYXRoOworCXN0cnVjdCBibG9iICpibG9iOworfTsKKworc3RhdGljIHN0cnVjdCBtZXJnZV9saXN0ICptZXJnZV9yZXN1bHQsICoqbWVyZ2VfcmVzdWx0X2VuZCA9ICZtZXJnZV9yZXN1bHQ7CisKK3N0YXRpYyB2b2lkIGFkZF9tZXJnZV9lbnRyeShzdHJ1Y3QgbWVyZ2VfbGlzdCAqZW50cnkpCit7CisJKm1lcmdlX3Jlc3VsdF9lbmQgPSBlbnRyeTsKKwltZXJnZV9yZXN1bHRfZW5kID0gJmVudHJ5LT5uZXh0OworfQorCitzdGF0aWMgdm9pZCBtZXJnZV90cmVlcyhzdHJ1Y3QgdHJlZV9kZXNjIHRbM10sIGNvbnN0IGNoYXIgKmJhc2UpOworCitzdGF0aWMgY29uc3QgY2hhciAqZXhwbGFuYXRpb24oc3RydWN0IG1lcmdlX2xpc3QgKmVudHJ5KQoreworCXN3aXRjaCAoZW50cnktPnN0YWdlKSB7CisJY2FzZSAwOgorCQlyZXR1cm4gIm1lcmdlZCI7CisJY2FzZSAzOgorCQlyZXR1cm4gImFkZGVkIGluIHJlbW90ZSI7CisJY2FzZSAyOgorCQlpZiAoZW50cnktPmxpbmspCisJCQlyZXR1cm4gImFkZGVkIGluIGJvdGgiOworCQlyZXR1cm4gImFkZGVkIGluIGxvY2FsIjsKKwl9CisKKwkvKiBFeGlzdGVkIGluIGJhc2UgKi8KKwllbnRyeSA9IGVudHJ5LT5saW5rOworCWlmICghZW50cnkpCisJCXJldHVybiAicmVtb3ZlZCBpbiBib3RoIjsKKworCWlmIChlbnRyeS0+bGluaykKKwkJcmV0dXJuICJjaGFuZ2VkIGluIGJvdGgiOworCisJaWYgKGVudHJ5LT5zdGFnZSA9PSAzKQorCQlyZXR1cm4gInJlbW92ZWQgaW4gbG9jYWwiOworCXJldHVybiAicmVtb3ZlZCBpbiByZW1vdGUiOworfQorCitleHRlcm4gdm9pZCAqbWVyZ2VfZmlsZShzdHJ1Y3QgYmxvYiAqLCBzdHJ1Y3QgYmxvYiAqLCBzdHJ1Y3QgYmxvYiAqLCB1bnNpZ25lZCBsb25nICopOworCitzdGF0aWMgdm9pZCAqcmVzdWx0KHN0cnVjdCBtZXJnZV9saXN0ICplbnRyeSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKK3sKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJc3RydWN0IGJsb2IgKmJhc2UsICpvdXIsICp0aGVpcjsKKworCWlmICghZW50cnktPnN0YWdlKQorCQlyZXR1cm4gcmVhZF9zaGExX2ZpbGUoZW50cnktPmJsb2ItPm9iamVjdC5zaGExLCAmdHlwZSwgc2l6ZSk7CisJYmFzZSA9IE5VTEw7CisJaWYgKGVudHJ5LT5zdGFnZSA9PSAxKSB7CisJCWJhc2UgPSBlbnRyeS0+YmxvYjsKKwkJZW50cnkgPSBlbnRyeS0+bGluazsKKwl9CisJb3VyID0gTlVMTDsKKwlpZiAoZW50cnkgJiYgZW50cnktPnN0YWdlID09IDIpIHsKKwkJb3VyID0gZW50cnktPmJsb2I7CisJCWVudHJ5ID0gZW50cnktPmxpbms7CisJfQorCXRoZWlyID0gTlVMTDsKKwlpZiAoZW50cnkpCisJCXRoZWlyID0gZW50cnktPmJsb2I7CisJcmV0dXJuIG1lcmdlX2ZpbGUoYmFzZSwgb3VyLCB0aGVpciwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkICpvcmlnaW4oc3RydWN0IG1lcmdlX2xpc3QgKmVudHJ5LCB1bnNpZ25lZCBsb25nICpzaXplKQoreworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwl3aGlsZSAoZW50cnkpIHsKKwkJaWYgKGVudHJ5LT5zdGFnZSA9PSAyKQorCQkJcmV0dXJuIHJlYWRfc2hhMV9maWxlKGVudHJ5LT5ibG9iLT5vYmplY3Quc2hhMSwgJnR5cGUsIHNpemUpOworCQllbnRyeSA9IGVudHJ5LT5saW5rOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBzaG93X291dGYodm9pZCAqcHJpdl8sIG1tYnVmZmVyX3QgKm1iLCBpbnQgbmJ1ZikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbmJ1ZjsgaSsrKQorCQlwcmludGYoIiUuKnMiLCAoaW50KSBtYltpXS5zaXplLCBtYltpXS5wdHIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzaG93X2RpZmYoc3RydWN0IG1lcmdlX2xpc3QgKmVudHJ5KQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwltbWZpbGVfdCBzcmMsIGRzdDsKKwl4cHBhcmFtX3QgeHBwOworCXhkZW1pdGNvbmZfdCB4ZWNmZzsKKwl4ZGVtaXRjYl90IGVjYjsKKworCXhwcC5mbGFncyA9IFhERl9ORUVEX01JTklNQUw7CisJbWVtc2V0KCZ4ZWNmZywgMCwgc2l6ZW9mKHhlY2ZnKSk7CisJeGVjZmcuY3R4bGVuID0gMzsKKwllY2Iub3V0ZiA9IHNob3dfb3V0ZjsKKwllY2IucHJpdiA9IE5VTEw7CisKKwlzcmMucHRyID0gb3JpZ2luKGVudHJ5LCAmc2l6ZSk7CisJaWYgKCFzcmMucHRyKQorCQlzaXplID0gMDsKKwlzcmMuc2l6ZSA9IHNpemU7CisJZHN0LnB0ciA9IHJlc3VsdChlbnRyeSwgJnNpemUpOworCWlmICghZHN0LnB0cikKKwkJc2l6ZSA9IDA7CisJZHN0LnNpemUgPSBzaXplOworCXhkaV9kaWZmKCZzcmMsICZkc3QsICZ4cHAsICZ4ZWNmZywgJmVjYik7CisJZnJlZShzcmMucHRyKTsKKwlmcmVlKGRzdC5wdHIpOworfQorCitzdGF0aWMgdm9pZCBzaG93X3Jlc3VsdF9saXN0KHN0cnVjdCBtZXJnZV9saXN0ICplbnRyeSkKK3sKKwlwcmludGYoIiVzXG4iLCBleHBsYW5hdGlvbihlbnRyeSkpOworCWRvIHsKKwkJc3RydWN0IG1lcmdlX2xpc3QgKmxpbmsgPSBlbnRyeS0+bGluazsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmRlc2NbNF0gPSB7ICJyZXN1bHQiLCAiYmFzZSIsICJvdXIiLCAidGhlaXIiIH07CisJCXByaW50ZigiICAlLTZzICVvICVzICVzXG4iLCBkZXNjW2VudHJ5LT5zdGFnZV0sIGVudHJ5LT5tb2RlLCBzaGExX3RvX2hleChlbnRyeS0+YmxvYi0+b2JqZWN0LnNoYTEpLCBlbnRyeS0+cGF0aCk7CisJCWVudHJ5ID0gbGluazsKKwl9IHdoaWxlIChlbnRyeSk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfcmVzdWx0KHZvaWQpCit7CisJc3RydWN0IG1lcmdlX2xpc3QgKndhbGs7CisKKwl3YWxrID0gbWVyZ2VfcmVzdWx0OworCXdoaWxlICh3YWxrKSB7CisJCXNob3dfcmVzdWx0X2xpc3Qod2Fsayk7CisJCXNob3dfZGlmZih3YWxrKTsKKwkJd2FsayA9IHdhbGstPm5leHQ7CisJfQorfQorCisvKiBBbiBlbXB0eSBlbnRyeSBuZXZlciBjb21wYXJlcyBzYW1lLCBub3QgZXZlbiB0byBhbm90aGVyIGVtcHR5IGVudHJ5ICovCitzdGF0aWMgaW50IHNhbWVfZW50cnkoc3RydWN0IG5hbWVfZW50cnkgKmEsIHN0cnVjdCBuYW1lX2VudHJ5ICpiKQoreworCXJldHVybglhLT5zaGExICYmCisJCWItPnNoYTEgJiYKKwkJIWhhc2hjbXAoYS0+c2hhMSwgYi0+c2hhMSkgJiYKKwkJYS0+bW9kZSA9PSBiLT5tb2RlOworfQorCitzdGF0aWMgc3RydWN0IG1lcmdlX2xpc3QgKmNyZWF0ZV9lbnRyeSh1bnNpZ25lZCBzdGFnZSwgdW5zaWduZWQgbW9kZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3QgbWVyZ2VfbGlzdCAqcmVzID0geG1hbGxvYyhzaXplb2YoKnJlcykpOworCisJbWVtc2V0KHJlcywgMCwgc2l6ZW9mKCpyZXMpKTsKKwlyZXMtPnN0YWdlID0gc3RhZ2U7CisJcmVzLT5wYXRoID0gcGF0aDsKKwlyZXMtPm1vZGUgPSBtb2RlOworCXJlcy0+YmxvYiA9IGxvb2t1cF9ibG9iKHNoYTEpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBjaGFyICp0cmF2ZXJzZV9wYXRoKGNvbnN0IHN0cnVjdCB0cmF2ZXJzZV9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgbmFtZV9lbnRyeSAqbikKK3sKKwljaGFyICpwYXRoID0geG1hbGxvYyh0cmF2ZXJzZV9wYXRoX2xlbihpbmZvLCBuKSArIDEpOworCXJldHVybiBtYWtlX3RyYXZlcnNlX3BhdGgocGF0aCwgaW5mbywgbik7Cit9CisKK3N0YXRpYyB2b2lkIHJlc29sdmUoY29uc3Qgc3RydWN0IHRyYXZlcnNlX2luZm8gKmluZm8sIHN0cnVjdCBuYW1lX2VudHJ5ICpicmFuY2gxLCBzdHJ1Y3QgbmFtZV9lbnRyeSAqcmVzdWx0KQoreworCXN0cnVjdCBtZXJnZV9saXN0ICpvcmlnLCAqZmluYWw7CisJY29uc3QgY2hhciAqcGF0aDsKKworCS8qIElmIGl0J3MgYWxyZWFkeSBicmFuY2gxLCBkb24ndCBib3RoZXIgc2hvd2luZyBpdCAqLworCWlmICghYnJhbmNoMSkKKwkJcmV0dXJuOworCisJcGF0aCA9IHRyYXZlcnNlX3BhdGgoaW5mbywgcmVzdWx0KTsKKwlvcmlnID0gY3JlYXRlX2VudHJ5KDIsIGJyYW5jaDEtPm1vZGUsIGJyYW5jaDEtPnNoYTEsIHBhdGgpOworCWZpbmFsID0gY3JlYXRlX2VudHJ5KDAsIHJlc3VsdC0+bW9kZSwgcmVzdWx0LT5zaGExLCBwYXRoKTsKKworCWZpbmFsLT5saW5rID0gb3JpZzsKKworCWFkZF9tZXJnZV9lbnRyeShmaW5hbCk7Cit9CisKK3N0YXRpYyBpbnQgdW5yZXNvbHZlZF9kaXJlY3RvcnkoY29uc3Qgc3RydWN0IHRyYXZlcnNlX2luZm8gKmluZm8sIHN0cnVjdCBuYW1lX2VudHJ5IG5bM10pCit7CisJY2hhciAqbmV3YmFzZTsKKwlzdHJ1Y3QgbmFtZV9lbnRyeSAqcDsKKwlzdHJ1Y3QgdHJlZV9kZXNjIHRbM107CisJdm9pZCAqYnVmMCwgKmJ1ZjEsICpidWYyOworCisJaWYgKCFyZXNvbHZlX2RpcmVjdG9yaWVzKQorCQlyZXR1cm4gMDsKKwlwID0gbjsKKwlpZiAoIXAtPm1vZGUpIHsKKwkJcCsrOworCQlpZiAoIXAtPm1vZGUpCisJCQlwKys7CisJfQorCWlmICghU19JU0RJUihwLT5tb2RlKSkKKwkJcmV0dXJuIDA7CisJbmV3YmFzZSA9IHRyYXZlcnNlX3BhdGgoaW5mbywgcCk7CisJYnVmMCA9IGZpbGxfdHJlZV9kZXNjcmlwdG9yKHQrMCwgblswXS5zaGExKTsKKwlidWYxID0gZmlsbF90cmVlX2Rlc2NyaXB0b3IodCsxLCBuWzFdLnNoYTEpOworCWJ1ZjIgPSBmaWxsX3RyZWVfZGVzY3JpcHRvcih0KzIsIG5bMl0uc2hhMSk7CisJbWVyZ2VfdHJlZXModCwgbmV3YmFzZSk7CisKKwlmcmVlKGJ1ZjApOworCWZyZWUoYnVmMSk7CisJZnJlZShidWYyKTsKKwlmcmVlKG5ld2Jhc2UpOworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbWVyZ2VfbGlzdCAqbGlua19lbnRyeSh1bnNpZ25lZCBzdGFnZSwgY29uc3Qgc3RydWN0IHRyYXZlcnNlX2luZm8gKmluZm8sIHN0cnVjdCBuYW1lX2VudHJ5ICpuLCBzdHJ1Y3QgbWVyZ2VfbGlzdCAqZW50cnkpCit7CisJY29uc3QgY2hhciAqcGF0aDsKKwlzdHJ1Y3QgbWVyZ2VfbGlzdCAqbGluazsKKworCWlmICghbi0+bW9kZSkKKwkJcmV0dXJuIGVudHJ5OworCWlmIChlbnRyeSkKKwkJcGF0aCA9IGVudHJ5LT5wYXRoOworCWVsc2UKKwkJcGF0aCA9IHRyYXZlcnNlX3BhdGgoaW5mbywgbik7CisJbGluayA9IGNyZWF0ZV9lbnRyeShzdGFnZSwgbi0+bW9kZSwgbi0+c2hhMSwgcGF0aCk7CisJbGluay0+bGluayA9IGVudHJ5OworCXJldHVybiBsaW5rOworfQorCitzdGF0aWMgdm9pZCB1bnJlc29sdmVkKGNvbnN0IHN0cnVjdCB0cmF2ZXJzZV9pbmZvICppbmZvLCBzdHJ1Y3QgbmFtZV9lbnRyeSBuWzNdKQoreworCXN0cnVjdCBtZXJnZV9saXN0ICplbnRyeSA9IE5VTEw7CisKKwlpZiAodW5yZXNvbHZlZF9kaXJlY3RvcnkoaW5mbywgbikpCisJCXJldHVybjsKKworCS8qCisJICogRG8gdGhlbSBpbiByZXZlcnNlIG9yZGVyIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBsaW5rCisJICogbGlzdCBoYXMgdGhlIHN0YWdlcyBpbiBvcmRlciAtIGxpbmtfZW50cnkgYWRkcyBuZXcKKwkgKiBsaW5rcyBhdCB0aGUgZnJvbnQuCisJICovCisJZW50cnkgPSBsaW5rX2VudHJ5KDMsIGluZm8sIG4gKyAyLCBlbnRyeSk7CisJZW50cnkgPSBsaW5rX2VudHJ5KDIsIGluZm8sIG4gKyAxLCBlbnRyeSk7CisJZW50cnkgPSBsaW5rX2VudHJ5KDEsIGluZm8sIG4gKyAwLCBlbnRyeSk7CisKKwlhZGRfbWVyZ2VfZW50cnkoZW50cnkpOworfQorCisvKgorICogTWVyZ2UgdHdvIHRyZWVzIHRvZ2V0aGVyICh0WzFdIGFuZCB0WzJdKSwgdXNpbmcgYSBjb21tb24gYmFzZSAodFswXSkKKyAqIGFzIHRoZSBvcmlnaW4uCisgKgorICogVGhpcyB3YWxrcyB0aGUgKHNvcnRlZCkgdHJlZXMgaW4gbG9jay1zdGVwLCBjaGVja2luZyBldmVyeSBwb3NzaWJsZQorICogbmFtZS4gTm90ZSB0aGF0IGRpcmVjdG9yaWVzIGF1dG9tYXRpY2FsbHkgc29ydCBkaWZmZXJlbnRseSBmcm9tIG90aGVyCisgKiBmaWxlcyAoc2VlICJiYXNlX25hbWVfY29tcGFyZSIpLCBzbyB5b3UnbGwgbmV2ZXIgc2VlIGZpbGUvZGlyZWN0b3J5CisgKiBjb25mbGljdHMsIGJlY2F1c2UgdGhleSB3b24ndCBldmVyIGNvbXBhcmUgdGhlIHNhbWUuCisgKgorICogSU9XLCBpZiBhIGRpcmVjdG9yeSBjaGFuZ2VzIHRvIGEgZmlsZW5hbWUsIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZQorICogc2VlbiBhcyB0aGUgZGlyZWN0b3J5IGdvaW5nIGF3YXksIGFuZCB0aGUgZmlsZW5hbWUgYmVpbmcgY3JlYXRlZC4KKyAqCisgKiBUaGluayBvZiB0aGlzIGFzIGEgdGhyZWUtd2F5IGRpZmYuCisgKgorICogVGhlIG91dHB1dCB3aWxsIGJlIGVpdGhlcjoKKyAqICAtIHN1Y2Nlc3NmdWwgbWVyZ2UKKyAqCSAiMCBtb2RlIHNoYTEgZmlsZW5hbWUiCisgKiAgICBOT1RFIE5PVEUgTk9URSEgRklYTUUhIFdlIHJlYWxseSByZWFsbHkgbmVlZCB0byB3YWxrIHRoZSBpbmRleAorICogICAgaW4gcGFyYWxsZWwgd2l0aCB0aGlzIHRvbyEKKyAqCisgKiAgLSBjb25mbGljdDoKKyAqCSIxIG1vZGUgc2hhMSBmaWxlbmFtZSIKKyAqCSIyIG1vZGUgc2hhMSBmaWxlbmFtZSIKKyAqCSIzIG1vZGUgc2hhMSBmaWxlbmFtZSIKKyAqICAgIHdoZXJlIG5vdCBhbGwgb2YgdGhlIDEvMi8zIGxpbmVzIG1heSBleGlzdCwgb2YgY291cnNlLgorICoKKyAqIFRoZSBzdWNjZXNzZnVsIG1lcmdlIHJ1bGVzIGFyZSB0aGUgc2FtZSBhcyBmb3IgdGhlIHRocmVlLXdheSBtZXJnZQorICogaW4gZ2l0LXJlYWQtdHJlZS4KKyAqLworc3RhdGljIGludCB0aHJlZXdheV9jYWxsYmFjayhpbnQgbiwgdW5zaWduZWQgbG9uZyBtYXNrLCB1bnNpZ25lZCBsb25nIGRpcm1hc2ssIHN0cnVjdCBuYW1lX2VudHJ5ICplbnRyeSwgc3RydWN0IHRyYXZlcnNlX2luZm8gKmluZm8pCit7CisJLyogU2FtZSBpbiBib3RoPyAqLworCWlmIChzYW1lX2VudHJ5KGVudHJ5KzEsIGVudHJ5KzIpKSB7CisJCWlmIChlbnRyeVswXS5zaGExKSB7CisJCQlyZXNvbHZlKGluZm8sIE5VTEwsIGVudHJ5KzEpOworCQkJcmV0dXJuIG1hc2s7CisJCX0KKwl9CisKKwlpZiAoc2FtZV9lbnRyeShlbnRyeSswLCBlbnRyeSsxKSkgeworCQlpZiAoZW50cnlbMl0uc2hhMSAmJiAhU19JU0RJUihlbnRyeVsyXS5tb2RlKSkgeworCQkJcmVzb2x2ZShpbmZvLCBlbnRyeSsxLCBlbnRyeSsyKTsKKwkJCXJldHVybiBtYXNrOworCQl9CisJfQorCisJaWYgKHNhbWVfZW50cnkoZW50cnkrMCwgZW50cnkrMikpIHsKKwkJaWYgKGVudHJ5WzFdLnNoYTEgJiYgIVNfSVNESVIoZW50cnlbMV0ubW9kZSkpIHsKKwkJCXJlc29sdmUoaW5mbywgTlVMTCwgZW50cnkrMSk7CisJCQlyZXR1cm4gbWFzazsKKwkJfQorCX0KKworCXVucmVzb2x2ZWQoaW5mbywgZW50cnkpOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgdm9pZCBtZXJnZV90cmVlcyhzdHJ1Y3QgdHJlZV9kZXNjIHRbM10sIGNvbnN0IGNoYXIgKmJhc2UpCit7CisJc3RydWN0IHRyYXZlcnNlX2luZm8gaW5mbzsKKworCXNldHVwX3RyYXZlcnNlX2luZm8oJmluZm8sIGJhc2UpOworCWluZm8uZm4gPSB0aHJlZXdheV9jYWxsYmFjazsKKwl0cmF2ZXJzZV90cmVlcygzLCB0LCAmaW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkICpnZXRfdHJlZV9kZXNjcmlwdG9yKHN0cnVjdCB0cmVlX2Rlc2MgKmRlc2MsIGNvbnN0IGNoYXIgKnJldikKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXZvaWQgKmJ1ZjsKKworCWlmIChnZXRfc2hhMShyZXYsIHNoYTEpKQorCQlkaWUoInVua25vd24gcmV2ICVzIiwgcmV2KTsKKwlidWYgPSBmaWxsX3RyZWVfZGVzY3JpcHRvcihkZXNjLCBzaGExKTsKKwlpZiAoIWJ1ZikKKwkJZGllKCIlcyBpcyBub3QgYSB0cmVlIiwgcmV2KTsKKwlyZXR1cm4gYnVmOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHRyZWVfZGVzYyB0WzNdOworCXZvaWQgKmJ1ZjEsICpidWYyLCAqYnVmMzsKKworCWlmIChhcmdjICE9IDQpCisJCXVzYWdlKG1lcmdlX3RyZWVfdXNhZ2UpOworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCisJYnVmMSA9IGdldF90cmVlX2Rlc2NyaXB0b3IodCswLCBhcmd2WzFdKTsKKwlidWYyID0gZ2V0X3RyZWVfZGVzY3JpcHRvcih0KzEsIGFyZ3ZbMl0pOworCWJ1ZjMgPSBnZXRfdHJlZV9kZXNjcmlwdG9yKHQrMiwgYXJndlszXSk7CisJbWVyZ2VfdHJlZXModCwgIiIpOworCWZyZWUoYnVmMSk7CisJZnJlZShidWYyKTsKKwlmcmVlKGJ1ZjMpOworCisJc2hvd19yZXN1bHQoKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21rdGFnLmMgYi9ta3RhZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzQzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9ta3RhZy5jCkBAIC0wLDAgKzEsMTgwIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKworLyoKKyAqIEEgc2lnbmF0dXJlIGZpbGUgaGFzIGEgdmVyeSBzaW1wbGUgZml4ZWQgZm9ybWF0OiBmb3VyIGxpbmVzCisgKiBvZiAib2JqZWN0IDxzaGExPiIgKyAidHlwZSA8dHlwZW5hbWU+IiArICJ0YWcgPHRhZ25hbWU+IiArCisgKiAidGFnZ2VyIDxjb21taXR0ZXI+IiwgZm9sbG93ZWQgYnkgYSBibGFuayBsaW5lLCBhIGZyZWUtZm9ybSB0YWcKKyAqIG1lc3NhZ2UgYW5kIGEgc2lnbmF0dXJlIGJsb2NrIHRoYXQgZ2l0IGl0c2VsZiBkb2Vzbid0IGNhcmUgYWJvdXQsCisgKiBidXQgdGhhdCBjYW4gYmUgdmVyaWZpZWQgd2l0aCBncGcgb3Igc2ltaWxhci4KKyAqCisgKiBUaGUgZmlyc3QgZm91ciBsaW5lcyBhcmUgZ3VhcmFudGVlZCB0byBiZSBhdCBsZWFzdCA4MyBieXRlczoKKyAqICJvYmplY3QgPHNoYTE+XG4iIGlzIDQ4IGJ5dGVzLCAidHlwZSB0YWdcbiIgYXQgOSBieXRlcyBpcyB0aGUKKyAqIHNob3J0ZXN0IHBvc3NpYmxlIHR5cGUtbGluZSwgInRhZyAuXG4iIGF0IDYgYnl0ZXMgaXMgdGhlIHNob3J0ZXN0CisgKiBzaW5nbGUtY2hhcmFjdGVyLXRhZyBsaW5lLCBhbmQgInRhZ2dlciAuIDw+IDAgKzAwMDBcbiIgYXQgMjAgYnl0ZXMgaXMKKyAqIHRoZSBzaG9ydGVzdCBwb3NzaWJsZSB0YWdnZXItbGluZS4KKyAqLworCisvKgorICogV2UgcmVmdXNlIHRvIHRhZyBzb21ldGhpbmcgd2UgY2FuJ3QgdmVyaWZ5LiBKdXN0IGJlY2F1c2UuCisgKi8KK3N0YXRpYyBpbnQgdmVyaWZ5X29iamVjdCh1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCBjaGFyICpleHBlY3RlZF90eXBlKQoreworCWludCByZXQgPSAtMTsKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXZvaWQgKmJ1ZmZlciA9IHJlYWRfc2hhMV9maWxlKHNoYTEsICZ0eXBlLCAmc2l6ZSk7CisKKwlpZiAoYnVmZmVyKSB7CisJCWlmICh0eXBlID09IHR5cGVfZnJvbV9zdHJpbmcoZXhwZWN0ZWRfdHlwZSkpCisJCQlyZXQgPSBjaGVja19zaGExX3NpZ25hdHVyZShzaGExLCBidWZmZXIsIHNpemUsIGV4cGVjdGVkX3R5cGUpOworCQlmcmVlKGJ1ZmZlcik7CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBOT19DOTlfRk9STUFUCisjZGVmaW5lIFBEX0ZNVCAiJWQiCisjZWxzZQorI2RlZmluZSBQRF9GTVQgIiV0ZCIKKyNlbmRpZgorCitzdGF0aWMgaW50IHZlcmlmeV90YWcoY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaW50IHR5cGVsZW47CisJY2hhciB0eXBlWzIwXTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWNvbnN0IGNoYXIgKm9iamVjdCwgKnR5cGVfbGluZSwgKnRhZ19saW5lLCAqdGFnZ2VyX2xpbmUsICpsYiwgKnJiOworCXNpemVfdCBsZW47CisKKwlpZiAoc2l6ZSA8IDg0KQorCQlyZXR1cm4gZXJyb3IoIndhbm5hIGZvb2wgbWUgPyB5b3Ugb2J2aW91c2x5IGdvdCB0aGUgc2l6ZSB3cm9uZyAhIik7CisKKwlidWZmZXJbc2l6ZV0gPSAwOworCisJLyogVmVyaWZ5IG9iamVjdCBsaW5lICovCisJb2JqZWN0ID0gYnVmZmVyOworCWlmIChtZW1jbXAob2JqZWN0LCAib2JqZWN0ICIsIDcpKQorCQlyZXR1cm4gZXJyb3IoImNoYXIlZDogZG9lcyBub3Qgc3RhcnQgd2l0aCBcIm9iamVjdCBcIiIsIDApOworCisJaWYgKGdldF9zaGExX2hleChvYmplY3QgKyA3LCBzaGExKSkKKwkJcmV0dXJuIGVycm9yKCJjaGFyJWQ6IGNvdWxkIG5vdCBnZXQgU0hBMSBoYXNoIiwgNyk7CisKKwkvKiBWZXJpZnkgdHlwZSBsaW5lICovCisJdHlwZV9saW5lID0gb2JqZWN0ICsgNDg7CisJaWYgKG1lbWNtcCh0eXBlX2xpbmUgLSAxLCAiXG50eXBlICIsIDYpKQorCQlyZXR1cm4gZXJyb3IoImNoYXIlZDogY291bGQgbm90IGZpbmQgXCJcXG50eXBlIFwiIiwgNDcpOworCisJLyogVmVyaWZ5IHRhZy1saW5lICovCisJdGFnX2xpbmUgPSBzdHJjaHIodHlwZV9saW5lLCAnXG4nKTsKKwlpZiAoIXRhZ19saW5lKQorCQlyZXR1cm4gZXJyb3IoImNoYXIiIFBEX0ZNVCAiOiBjb3VsZCBub3QgZmluZCBuZXh0IFwiXFxuXCIiLCB0eXBlX2xpbmUgLSBidWZmZXIpOworCXRhZ19saW5lKys7CisJaWYgKG1lbWNtcCh0YWdfbGluZSwgInRhZyAiLCA0KSB8fCB0YWdfbGluZVs0XSA9PSAnXG4nKQorCQlyZXR1cm4gZXJyb3IoImNoYXIiIFBEX0ZNVCAiOiBubyBcInRhZyBcIiBmb3VuZCIsIHRhZ19saW5lIC0gYnVmZmVyKTsKKworCS8qIEdldCB0aGUgYWN0dWFsIHR5cGUgKi8KKwl0eXBlbGVuID0gdGFnX2xpbmUgLSB0eXBlX2xpbmUgLSBzdHJsZW4oInR5cGUgXG4iKTsKKwlpZiAodHlwZWxlbiA+PSBzaXplb2YodHlwZSkpCisJCXJldHVybiBlcnJvcigiY2hhciIgUERfRk1UICI6IHR5cGUgdG9vIGxvbmciLCB0eXBlX2xpbmUrNSAtIGJ1ZmZlcik7CisKKwltZW1jcHkodHlwZSwgdHlwZV9saW5lKzUsIHR5cGVsZW4pOworCXR5cGVbdHlwZWxlbl0gPSAwOworCisJLyogVmVyaWZ5IHRoYXQgdGhlIG9iamVjdCBtYXRjaGVzICovCisJaWYgKHZlcmlmeV9vYmplY3Qoc2hhMSwgdHlwZSkpCisJCXJldHVybiBlcnJvcigiY2hhciVkOiBjb3VsZCBub3QgdmVyaWZ5IG9iamVjdCAlcyIsIDcsIHNoYTFfdG9faGV4KHNoYTEpKTsKKworCS8qIFZlcmlmeSB0aGUgdGFnLW5hbWU6IHdlIGRvbid0IGFsbG93IGNvbnRyb2wgY2hhcmFjdGVycyBvciBzcGFjZXMgaW4gaXQgKi8KKwl0YWdfbGluZSArPSA0OworCWZvciAoOzspIHsKKwkJdW5zaWduZWQgY2hhciBjID0gKnRhZ19saW5lKys7CisJCWlmIChjID09ICdcbicpCisJCQlicmVhazsKKwkJaWYgKGMgPiAnICcpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIGVycm9yKCJjaGFyIiBQRF9GTVQgIjogY291bGQgbm90IHZlcmlmeSB0YWcgbmFtZSIsIHRhZ19saW5lIC0gYnVmZmVyKTsKKwl9CisKKwkvKiBWZXJpZnkgdGhlIHRhZ2dlciBsaW5lICovCisJdGFnZ2VyX2xpbmUgPSB0YWdfbGluZTsKKworCWlmIChtZW1jbXAodGFnZ2VyX2xpbmUsICJ0YWdnZXIgIiwgNykpCisJCXJldHVybiBlcnJvcigiY2hhciIgUERfRk1UICI6IGNvdWxkIG5vdCBmaW5kIFwidGFnZ2VyIFwiIiwKKwkJCXRhZ2dlcl9saW5lIC0gYnVmZmVyKTsKKworCS8qCisJICogQ2hlY2sgZm9yIGNvcnJlY3QgZm9ybSBmb3IgbmFtZSBhbmQgZW1haWwKKwkgKiBpLmUuICIgPCIgZm9sbG93ZWQgYnkgIj4gIiBvbiBfdGhpc18gbGluZQorCSAqIE5vIGFuZ2xlIGJyYWNrZXRzIHdpdGhpbiB0aGUgbmFtZSBvciBlbWFpbCBhZGRyZXNzIGZpZWxkcy4KKwkgKiBObyBzcGFjZXMgd2l0aGluIHRoZSBlbWFpbCBhZGRyZXNzIGZpZWxkLgorCSAqLworCXRhZ2dlcl9saW5lICs9IDc7CisJaWYgKCEobGIgPSBzdHJzdHIodGFnZ2VyX2xpbmUsICIgPCIpKSB8fCAhKHJiID0gc3Ryc3RyKGxiKzIsICI+ICIpKSB8fAorCQlzdHJwYnJrKHRhZ2dlcl9saW5lLCAiPD5cbiIpICE9IGxiKzEgfHwKKwkJc3RycGJyayhsYisyLCAiPjxcbiAiKSAhPSByYikKKwkJcmV0dXJuIGVycm9yKCJjaGFyIiBQRF9GTVQgIjogbWFsZm9ybWVkIHRhZ2dlciBmaWVsZCIsCisJCQl0YWdnZXJfbGluZSAtIGJ1ZmZlcik7CisKKwkvKiBDaGVjayBmb3IgYXV0aG9yIG5hbWUsIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIHNwYWNlIGlzIGFjY2VwdGFibGUgKi8KKwlpZiAobGIgPT0gdGFnZ2VyX2xpbmUpCisJCXJldHVybiBlcnJvcigiY2hhciIgUERfRk1UICI6IG1pc3NpbmcgdGFnZ2VyIG5hbWUiLAorCQkJdGFnZ2VyX2xpbmUgLSBidWZmZXIpOworCisJLyogdGltZXN0YW1wLCAxIG9yIG1vcmUgZGlnaXRzIGZvbGxvd2VkIGJ5IHNwYWNlICovCisJdGFnZ2VyX2xpbmUgPSByYiArIDI7CisJaWYgKCEobGVuID0gc3Ryc3BuKHRhZ2dlcl9saW5lLCAiMDEyMzQ1Njc4OSIpKSkKKwkJcmV0dXJuIGVycm9yKCJjaGFyIiBQRF9GTVQgIjogbWlzc2luZyB0YWcgdGltZXN0YW1wIiwKKwkJCXRhZ2dlcl9saW5lIC0gYnVmZmVyKTsKKwl0YWdnZXJfbGluZSArPSBsZW47CisJaWYgKCp0YWdnZXJfbGluZSAhPSAnICcpCisJCXJldHVybiBlcnJvcigiY2hhciIgUERfRk1UICI6IG1hbGZvcm1lZCB0YWcgdGltZXN0YW1wIiwKKwkJCXRhZ2dlcl9saW5lIC0gYnVmZmVyKTsKKwl0YWdnZXJfbGluZSsrOworCisJLyogdGltZXpvbmUsIDUgZGlnaXRzIFsrLV1oaG1tLCBtYXguIDE0MDAgKi8KKwlpZiAoISgodGFnZ2VyX2xpbmVbMF0gPT0gJysnIHx8IHRhZ2dlcl9saW5lWzBdID09ICctJykgJiYKKwkgICAgICBzdHJzcG4odGFnZ2VyX2xpbmUrMSwgIjAxMjM0NTY3ODkiKSA9PSA0ICYmCisJICAgICAgdGFnZ2VyX2xpbmVbNV0gPT0gJ1xuJyAmJiBhdG9pKHRhZ2dlcl9saW5lKzEpIDw9IDE0MDApKQorCQlyZXR1cm4gZXJyb3IoImNoYXIiIFBEX0ZNVCAiOiBtYWxmb3JtZWQgdGFnIHRpbWV6b25lIiwKKwkJCXRhZ2dlcl9saW5lIC0gYnVmZmVyKTsKKwl0YWdnZXJfbGluZSArPSA2OworCisJLyogVmVyaWZ5IHRoZSBibGFuayBsaW5lIHNlcGFyYXRpbmcgdGhlIGhlYWRlciBmcm9tIHRoZSBib2R5ICovCisJaWYgKCp0YWdnZXJfbGluZSAhPSAnXG4nKQorCQlyZXR1cm4gZXJyb3IoImNoYXIiIFBEX0ZNVCAiOiB0cmFpbGluZyBnYXJiYWdlIGluIHRhZyBoZWFkZXIiLAorCQkJdGFnZ2VyX2xpbmUgLSBidWZmZXIpOworCisJLyogVGhlIGFjdHVhbCBzdHVmZiBhZnRlcndhcmRzIHdlIGRvbid0IGNhcmUgYWJvdXQuLiAqLworCXJldHVybiAwOworfQorCisjdW5kZWYgUERfRk1UCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3Qgc3RyYnVmIGJ1ZjsKKwl1bnNpZ25lZCBjaGFyIHJlc3VsdF9zaGExWzIwXTsKKworCWlmIChhcmdjICE9IDEpCisJCXVzYWdlKCJnaXQtbWt0YWcgPCBzaWduYXR1cmVmaWxlIik7CisKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisKKwlzdHJidWZfaW5pdCgmYnVmLCAwKTsKKwlpZiAoc3RyYnVmX3JlYWQoJmJ1ZiwgMCwgNDA5NikgPCAwKSB7CisJCWRpZSgiY291bGQgbm90IHJlYWQgZnJvbSBzdGRpbiIpOworCX0KKworCS8qIFZlcmlmeSBpdCBmb3Igc29tZSBiYXNpYyBzYW5pdHk6IGl0IG5lZWRzIHRvIHN0YXJ0IHdpdGgKKwkgICAib2JqZWN0IDxzaGExPlxudHlwZVxudGFnZ2VyICIgKi8KKwlpZiAodmVyaWZ5X3RhZyhidWYuYnVmLCBidWYubGVuKSA8IDApCisJCWRpZSgiaW52YWxpZCB0YWcgc2lnbmF0dXJlIGZpbGUiKTsKKworCWlmICh3cml0ZV9zaGExX2ZpbGUoYnVmLmJ1ZiwgYnVmLmxlbiwgdGFnX3R5cGUsIHJlc3VsdF9zaGExKSA8IDApCisJCWRpZSgidW5hYmxlIHRvIHdyaXRlIHRhZyBmaWxlIik7CisKKwlzdHJidWZfcmVsZWFzZSgmYnVmKTsKKwlwcmludGYoIiVzXG4iLCBzaGExX3RvX2hleChyZXN1bHRfc2hhMSkpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWt0cmVlLmMgYi9ta3RyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGRhMTEwCi0tLSAvZGV2L251bGwKKysrIGIvbWt0cmVlLmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBHSVQgLSB0aGUgc3R1cGlkIGNvbnRlbnQgdHJhY2tlcgorICoKKyAqIENvcHlyaWdodCAoYykgSnVuaW8gQyBIYW1hbm8sIDIwMDYKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisKK3N0YXRpYyBzdHJ1Y3QgdHJlZWVudCB7CisJdW5zaWduZWQgbW9kZTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWludCBsZW47CisJY2hhciBuYW1lW0ZMRVhfQVJSQVldOworfSAqKmVudHJpZXM7CitzdGF0aWMgaW50IGFsbG9jLCB1c2VkOworCitzdGF0aWMgdm9pZCBhcHBlbmRfdG9fdHJlZSh1bnNpZ25lZCBtb2RlLCB1bnNpZ25lZCBjaGFyICpzaGExLCBjaGFyICpwYXRoKQoreworCXN0cnVjdCB0cmVlZW50ICplbnQ7CisJaW50IGxlbiA9IHN0cmxlbihwYXRoKTsKKwlpZiAoc3RyY2hyKHBhdGgsICcvJykpCisJCWRpZSgicGF0aCAlcyBjb250YWlucyBzbGFzaCIsIHBhdGgpOworCisJaWYgKGFsbG9jIDw9IHVzZWQpIHsKKwkJYWxsb2MgPSBhbGxvY19ucih1c2VkKTsKKwkJZW50cmllcyA9IHhyZWFsbG9jKGVudHJpZXMsIHNpemVvZigqZW50cmllcykgKiBhbGxvYyk7CisJfQorCWVudCA9IGVudHJpZXNbdXNlZCsrXSA9IHhtYWxsb2Moc2l6ZW9mKCoqZW50cmllcykgKyBsZW4gKyAxKTsKKwllbnQtPm1vZGUgPSBtb2RlOworCWVudC0+bGVuID0gbGVuOworCWhhc2hjcHkoZW50LT5zaGExLCBzaGExKTsKKwltZW1jcHkoZW50LT5uYW1lLCBwYXRoLCBsZW4rMSk7Cit9CisKK3N0YXRpYyBpbnQgZW50X2NvbXBhcmUoY29uc3Qgdm9pZCAqYV8sIGNvbnN0IHZvaWQgKmJfKQoreworCXN0cnVjdCB0cmVlZW50ICphID0gKihzdHJ1Y3QgdHJlZWVudCAqKilhXzsKKwlzdHJ1Y3QgdHJlZWVudCAqYiA9ICooc3RydWN0IHRyZWVlbnQgKiopYl87CisJcmV0dXJuIGJhc2VfbmFtZV9jb21wYXJlKGEtPm5hbWUsIGEtPmxlbiwgYS0+bW9kZSwKKwkJCQkgYi0+bmFtZSwgYi0+bGVuLCBiLT5tb2RlKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfdHJlZSh1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBzdHJidWYgYnVmOworCXNpemVfdCBzaXplOworCWludCBpOworCisJcXNvcnQoZW50cmllcywgdXNlZCwgc2l6ZW9mKCplbnRyaWVzKSwgZW50X2NvbXBhcmUpOworCWZvciAoc2l6ZSA9IGkgPSAwOyBpIDwgdXNlZDsgaSsrKQorCQlzaXplICs9IDMyICsgZW50cmllc1tpXS0+bGVuOworCisJc3RyYnVmX2luaXQoJmJ1Ziwgc2l6ZSk7CisJZm9yIChpID0gMDsgaSA8IHVzZWQ7IGkrKykgeworCQlzdHJ1Y3QgdHJlZWVudCAqZW50ID0gZW50cmllc1tpXTsKKwkJc3RyYnVmX2FkZGYoJmJ1ZiwgIiVvICVzJWMiLCBlbnQtPm1vZGUsIGVudC0+bmFtZSwgJ1wwJyk7CisJCXN0cmJ1Zl9hZGQoJmJ1ZiwgZW50LT5zaGExLCAyMCk7CisJfQorCisJd3JpdGVfc2hhMV9maWxlKGJ1Zi5idWYsIGJ1Zi5sZW4sIHRyZWVfdHlwZSwgc2hhMSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIG1rdHJlZV91c2FnZVtdID0gImdpdC1ta3RyZWUgWy16XSI7CisKK2ludCBtYWluKGludCBhYywgY2hhciAqKmF2KQoreworCXN0cnVjdCBzdHJidWYgc2I7CisJc3RydWN0IHN0cmJ1ZiBwX3VxOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaW50IGxpbmVfdGVybWluYXRpb24gPSAnXG4nOworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCisJd2hpbGUgKCgxIDwgYWMpICYmIGF2WzFdWzBdID09ICctJykgeworCQljaGFyICphcmcgPSBhdlsxXTsKKwkJaWYgKCFzdHJjbXAoIi16IiwgYXJnKSkKKwkJCWxpbmVfdGVybWluYXRpb24gPSAwOworCQllbHNlCisJCQl1c2FnZShta3RyZWVfdXNhZ2UpOworCQlhYy0tOworCQlhdisrOworCX0KKworCXN0cmJ1Zl9pbml0KCZzYiwgMCk7CisJc3RyYnVmX2luaXQoJnBfdXEsIDApOworCXdoaWxlIChzdHJidWZfZ2V0bGluZSgmc2IsIHN0ZGluLCBsaW5lX3Rlcm1pbmF0aW9uKSAhPSBFT0YpIHsKKwkJY2hhciAqcHRyLCAqbnRyOworCQl1bnNpZ25lZCBtb2RlOworCQllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJCWNoYXIgKnBhdGg7CisKKwkJcHRyID0gc2IuYnVmOworCQkvKiBJbnB1dCBpcyBub24tcmVjdXJzaXZlIGxzLXRyZWUgb3V0cHV0IGZvcm1hdAorCQkgKiBtb2RlIFNQIHR5cGUgU1Agc2hhMSBUQUIgbmFtZQorCQkgKi8KKwkJbW9kZSA9IHN0cnRvdWwocHRyLCAmbnRyLCA4KTsKKwkJaWYgKHB0ciA9PSBudHIgfHwgIW50ciB8fCAqbnRyICE9ICcgJykKKwkJCWRpZSgiaW5wdXQgZm9ybWF0IGVycm9yOiAlcyIsIHNiLmJ1Zik7CisJCXB0ciA9IG50ciArIDE7IC8qIHR5cGUgKi8KKwkJbnRyID0gc3RyY2hyKHB0ciwgJyAnKTsKKwkJaWYgKCFudHIgfHwgc2IuYnVmICsgc2IubGVuIDw9IG50ciArIDQwIHx8CisJCSAgICBudHJbNDFdICE9ICdcdCcgfHwKKwkJICAgIGdldF9zaGExX2hleChudHIgKyAxLCBzaGExKSkKKwkJCWRpZSgiaW5wdXQgZm9ybWF0IGVycm9yOiAlcyIsIHNiLmJ1Zik7CisJCXR5cGUgPSBzaGExX29iamVjdF9pbmZvKHNoYTEsIE5VTEwpOworCQlpZiAodHlwZSA8IDApCisJCQlkaWUoIm9iamVjdCAlcyB1bmF2YWlsYWJsZSIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJKm50cisrID0gMDsgLyogbm93IGF0IHRoZSBiZWdpbm5pbmcgb2YgU0hBMSAqLworCQlpZiAodHlwZSAhPSB0eXBlX2Zyb21fc3RyaW5nKHB0cikpCisJCQlkaWUoIm9iamVjdCB0eXBlICVzIG1pc21hdGNoICglcykiLCBwdHIsIHR5cGVuYW1lKHR5cGUpKTsKKworCQlwYXRoID0gbnRyICsgNDE7ICAvKiBhdCB0aGUgYmVnaW5uaW5nIG9mIG5hbWUgKi8KKwkJaWYgKGxpbmVfdGVybWluYXRpb24gJiYgcGF0aFswXSA9PSAnIicpIHsKKwkJCXN0cmJ1Zl9yZXNldCgmcF91cSk7CisJCQlpZiAodW5xdW90ZV9jX3N0eWxlKCZwX3VxLCBwYXRoLCBOVUxMKSkgeworCQkJCWRpZSgiaW52YWxpZCBxdW90aW5nIik7CisJCQl9CisJCQlwYXRoID0gcF91cS5idWY7CisJCX0KKworCQlhcHBlbmRfdG9fdHJlZShtb2RlLCBzaGExLCBwYXRoKTsKKwl9CisJc3RyYnVmX3JlbGVhc2UoJnBfdXEpOworCXN0cmJ1Zl9yZWxlYXNlKCZzYik7CisKKwl3cml0ZV90cmVlKHNoYTEpOworCXB1dHMoc2hhMV90b19oZXgoc2hhMSkpOworCWV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS9tb3ppbGxhLXNoYTEvc2hhMS5jIGIvbW96aWxsYS1zaGExL3NoYTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjA2YjgzCi0tLSAvZGV2L251bGwKKysrIGIvbW96aWxsYS1zaGExL3NoYTEuYwpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljCisgKiBMaWNlbnNlIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KKyAqCisgKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMKKyAqIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAqIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworICogcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBTSEEgMTgwLTEgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uIChDb21wYWN0IHZlcnNpb24pCisgKgorICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFBhdWwgS29jaGVyIG9mCisgKiBDcnlwdG9ncmFwaHkgUmVzZWFyY2guICBQb3J0aW9ucyBjcmVhdGVkIGJ5IFBhdWwgS29jaGVyIGFyZQorICogQ29weXJpZ2h0IChDKSAxOTk1LTkgYnkgQ3J5cHRvZ3JhcGh5IFJlc2VhcmNoLCBJbmMuICBBbGwKKyAqIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBDb250cmlidXRvcihzKToKKyAqCisgKiAgICAgUGF1bCBLb2NoZXIKKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlCisgKiAiR1BMIiksIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZQorICogaW5zdGVhZCBvZiB0aG9zZSBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyCisgKiB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8KKyAqIGFsbG93IG90aGVycyB0byB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgTVBMLAorICogaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQKKyAqIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkKKyAqIHRoZSBHUEwuICBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQKKyAqIG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUKKyAqIEdQTC4KKyAqLworCisjaW5jbHVkZSAic2hhMS5oIgorCitzdGF0aWMgdm9pZCBzaGFIYXNoQmxvY2soU0hBX0NUWCAqY3R4KTsKKwordm9pZCBTSEExX0luaXQoU0hBX0NUWCAqY3R4KSB7CisgIGludCBpOworCisgIGN0eC0+bGVuVyA9IDA7CisgIGN0eC0+c2l6ZUhpID0gY3R4LT5zaXplTG8gPSAwOworCisgIC8qIEluaXRpYWxpemUgSCB3aXRoIHRoZSBtYWdpYyBjb25zdGFudHMgKHNlZSBGSVBTMTgwIGZvciBjb25zdGFudHMpCisgICAqLworICBjdHgtPkhbMF0gPSAweDY3NDUyMzAxOworICBjdHgtPkhbMV0gPSAweGVmY2RhYjg5OworICBjdHgtPkhbMl0gPSAweDk4YmFkY2ZlOworICBjdHgtPkhbM10gPSAweDEwMzI1NDc2OworICBjdHgtPkhbNF0gPSAweGMzZDJlMWYwOworCisgIGZvciAoaSA9IDA7IGkgPCA4MDsgaSsrKQorICAgIGN0eC0+V1tpXSA9IDA7Cit9CisKKwordm9pZCBTSEExX1VwZGF0ZShTSEFfQ1RYICpjdHgsIGNvbnN0IHZvaWQgKl9kYXRhSW4sIGludCBsZW4pIHsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YUluID0gX2RhdGFJbjsKKyAgaW50IGk7CisKKyAgLyogUmVhZCB0aGUgZGF0YSBpbnRvIFcgYW5kIHByb2Nlc3MgYmxvY2tzIGFzIHRoZXkgZ2V0IGZ1bGwKKyAgICovCisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIGN0eC0+V1tjdHgtPmxlblcgLyA0XSA8PD0gODsKKyAgICBjdHgtPldbY3R4LT5sZW5XIC8gNF0gfD0gKHVuc2lnbmVkIGludClkYXRhSW5baV07CisgICAgaWYgKCgrK2N0eC0+bGVuVykgJSA2NCA9PSAwKSB7CisgICAgICBzaGFIYXNoQmxvY2soY3R4KTsKKyAgICAgIGN0eC0+bGVuVyA9IDA7CisgICAgfQorICAgIGN0eC0+c2l6ZUxvICs9IDg7CisgICAgY3R4LT5zaXplSGkgKz0gKGN0eC0+c2l6ZUxvIDwgOCk7CisgIH0KK30KKworCit2b2lkIFNIQTFfRmluYWwodW5zaWduZWQgY2hhciBoYXNob3V0WzIwXSwgU0hBX0NUWCAqY3R4KSB7CisgIHVuc2lnbmVkIGNoYXIgcGFkMHg4MCA9IDB4ODA7CisgIHVuc2lnbmVkIGNoYXIgcGFkMHgwMCA9IDB4MDA7CisgIHVuc2lnbmVkIGNoYXIgcGFkbGVuWzhdOworICBpbnQgaTsKKworICAvKiBQYWQgd2l0aCBhIGJpbmFyeSAxIChlLmcuIDB4ODApLCB0aGVuIHplcm9lcywgdGhlbiBsZW5ndGgKKyAgICovCisgIHBhZGxlblswXSA9ICh1bnNpZ25lZCBjaGFyKSgoY3R4LT5zaXplSGkgPj4gMjQpICYgMjU1KTsKKyAgcGFkbGVuWzFdID0gKHVuc2lnbmVkIGNoYXIpKChjdHgtPnNpemVIaSA+PiAxNikgJiAyNTUpOworICBwYWRsZW5bMl0gPSAodW5zaWduZWQgY2hhcikoKGN0eC0+c2l6ZUhpID4+IDgpICYgMjU1KTsKKyAgcGFkbGVuWzNdID0gKHVuc2lnbmVkIGNoYXIpKChjdHgtPnNpemVIaSA+PiAwKSAmIDI1NSk7CisgIHBhZGxlbls0XSA9ICh1bnNpZ25lZCBjaGFyKSgoY3R4LT5zaXplTG8gPj4gMjQpICYgMjU1KTsKKyAgcGFkbGVuWzVdID0gKHVuc2lnbmVkIGNoYXIpKChjdHgtPnNpemVMbyA+PiAxNikgJiAyNTUpOworICBwYWRsZW5bNl0gPSAodW5zaWduZWQgY2hhcikoKGN0eC0+c2l6ZUxvID4+IDgpICYgMjU1KTsKKyAgcGFkbGVuWzddID0gKHVuc2lnbmVkIGNoYXIpKChjdHgtPnNpemVMbyA+PiAwKSAmIDI1NSk7CisgIFNIQTFfVXBkYXRlKGN0eCwgJnBhZDB4ODAsIDEpOworICB3aGlsZSAoY3R4LT5sZW5XICE9IDU2KQorICAgIFNIQTFfVXBkYXRlKGN0eCwgJnBhZDB4MDAsIDEpOworICBTSEExX1VwZGF0ZShjdHgsIHBhZGxlbiwgOCk7CisKKyAgLyogT3V0cHV0IGhhc2gKKyAgICovCisgIGZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgaGFzaG91dFtpXSA9ICh1bnNpZ25lZCBjaGFyKShjdHgtPkhbaSAvIDRdID4+IDI0KTsKKyAgICBjdHgtPkhbaSAvIDRdIDw8PSA4OworICB9CisKKyAgLyoKKyAgICogIFJlLWluaXRpYWxpemUgdGhlIGNvbnRleHQgKGFsc28gemVyb2l6ZXMgY29udGVudHMpCisgICAqLworICBTSEExX0luaXQoY3R4KTsKK30KKworCisjZGVmaW5lIFNIQV9ST1QoWCxuKSAoKChYKSA8PCAobikpIHwgKChYKSA+PiAoMzItKG4pKSkpCisKK3N0YXRpYyB2b2lkIHNoYUhhc2hCbG9jayhTSEFfQ1RYICpjdHgpIHsKKyAgaW50IHQ7CisgIHVuc2lnbmVkIGludCBBLEIsQyxELEUsVEVNUDsKKworICBmb3IgKHQgPSAxNjsgdCA8PSA3OTsgdCsrKQorICAgIGN0eC0+V1t0XSA9CisgICAgICBTSEFfUk9UKGN0eC0+V1t0LTNdIF4gY3R4LT5XW3QtOF0gXiBjdHgtPldbdC0xNF0gXiBjdHgtPldbdC0xNl0sIDEpOworCisgIEEgPSBjdHgtPkhbMF07CisgIEIgPSBjdHgtPkhbMV07CisgIEMgPSBjdHgtPkhbMl07CisgIEQgPSBjdHgtPkhbM107CisgIEUgPSBjdHgtPkhbNF07CisKKyAgZm9yICh0ID0gMDsgdCA8PSAxOTsgdCsrKSB7CisgICAgVEVNUCA9IFNIQV9ST1QoQSw1KSArICgoKENeRCkmQileRCkgICAgICsgRSArIGN0eC0+V1t0XSArIDB4NWE4Mjc5OTk7CisgICAgRSA9IEQ7IEQgPSBDOyBDID0gU0hBX1JPVChCLCAzMCk7IEIgPSBBOyBBID0gVEVNUDsKKyAgfQorICBmb3IgKHQgPSAyMDsgdCA8PSAzOTsgdCsrKSB7CisgICAgVEVNUCA9IFNIQV9ST1QoQSw1KSArIChCXkNeRCkgICAgICAgICAgICsgRSArIGN0eC0+V1t0XSArIDB4NmVkOWViYTE7CisgICAgRSA9IEQ7IEQgPSBDOyBDID0gU0hBX1JPVChCLCAzMCk7IEIgPSBBOyBBID0gVEVNUDsKKyAgfQorICBmb3IgKHQgPSA0MDsgdCA8PSA1OTsgdCsrKSB7CisgICAgVEVNUCA9IFNIQV9ST1QoQSw1KSArICgoQiZDKXwoRCYoQnxDKSkpICsgRSArIGN0eC0+V1t0XSArIDB4OGYxYmJjZGM7CisgICAgRSA9IEQ7IEQgPSBDOyBDID0gU0hBX1JPVChCLCAzMCk7IEIgPSBBOyBBID0gVEVNUDsKKyAgfQorICBmb3IgKHQgPSA2MDsgdCA8PSA3OTsgdCsrKSB7CisgICAgVEVNUCA9IFNIQV9ST1QoQSw1KSArIChCXkNeRCkgICAgICAgICAgICsgRSArIGN0eC0+V1t0XSArIDB4Y2E2MmMxZDY7CisgICAgRSA9IEQ7IEQgPSBDOyBDID0gU0hBX1JPVChCLCAzMCk7IEIgPSBBOyBBID0gVEVNUDsKKyAgfQorCisgIGN0eC0+SFswXSArPSBBOworICBjdHgtPkhbMV0gKz0gQjsKKyAgY3R4LT5IWzJdICs9IEM7CisgIGN0eC0+SFszXSArPSBEOworICBjdHgtPkhbNF0gKz0gRTsKK30KZGlmZiAtLWdpdCBhL21vemlsbGEtc2hhMS9zaGExLmggYi9tb3ppbGxhLXNoYTEvc2hhMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZjJkM2QKLS0tIC9kZXYvbnVsbAorKysgYi9tb3ppbGxhLXNoYTEvc2hhMS5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYworICogTGljZW5zZSBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCisgKgorICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTCisgKiBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgKiBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyAqIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogVGhlIE9yaWdpbmFsIENvZGUgaXMgU0hBIDE4MC0xIEhlYWRlciBGaWxlCisgKgorICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFBhdWwgS29jaGVyIG9mCisgKiBDcnlwdG9ncmFwaHkgUmVzZWFyY2guICBQb3J0aW9ucyBjcmVhdGVkIGJ5IFBhdWwgS29jaGVyIGFyZQorICogQ29weXJpZ2h0IChDKSAxOTk1LTkgYnkgQ3J5cHRvZ3JhcGh5IFJlc2VhcmNoLCBJbmMuICBBbGwKKyAqIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBDb250cmlidXRvcihzKToKKyAqCisgKiAgICAgUGF1bCBLb2NoZXIKKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlCisgKiAiR1BMIiksIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZQorICogaW5zdGVhZCBvZiB0aG9zZSBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyCisgKiB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8KKyAqIGFsbG93IG90aGVycyB0byB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgTVBMLAorICogaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQKKyAqIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkKKyAqIHRoZSBHUEwuICBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQKKyAqIG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUKKyAqIEdQTC4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBIWzVdOworICB1bnNpZ25lZCBpbnQgV1s4MF07CisgIGludCBsZW5XOworICB1bnNpZ25lZCBpbnQgc2l6ZUhpLHNpemVMbzsKK30gU0hBX0NUWDsKKwordm9pZCBTSEExX0luaXQoU0hBX0NUWCAqY3R4KTsKK3ZvaWQgU0hBMV9VcGRhdGUoU0hBX0NUWCAqY3R4LCBjb25zdCB2b2lkICpkYXRhSW4sIGludCBsZW4pOwordm9pZCBTSEExX0ZpbmFsKHVuc2lnbmVkIGNoYXIgaGFzaG91dFsyMF0sIFNIQV9DVFggKmN0eCk7CmRpZmYgLS1naXQgYS9vYmplY3QuYyBiL29iamVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYjY1MjgKLS0tIC9kZXYvbnVsbAorKysgYi9vYmplY3QuYwpAQCAtMCwwICsxLDI3MCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKworc3RhdGljIHN0cnVjdCBvYmplY3QgKipvYmpfaGFzaDsKK3N0YXRpYyBpbnQgbnJfb2Jqcywgb2JqX2hhc2hfc2l6ZTsKKwordW5zaWduZWQgaW50IGdldF9tYXhfb2JqZWN0X2luZGV4KHZvaWQpCit7CisJcmV0dXJuIG9ial9oYXNoX3NpemU7Cit9CisKK3N0cnVjdCBvYmplY3QgKmdldF9pbmRleGVkX29iamVjdCh1bnNpZ25lZCBpbnQgaWR4KQoreworCXJldHVybiBvYmpfaGFzaFtpZHhdOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqb2JqZWN0X3R5cGVfc3RyaW5nc1tdID0geworCU5VTEwsCQkvKiBPQkpfTk9ORSA9IDAgKi8KKwkiY29tbWl0IiwJLyogT0JKX0NPTU1JVCA9IDEgKi8KKwkidHJlZSIsCQkvKiBPQkpfVFJFRSA9IDIgKi8KKwkiYmxvYiIsCQkvKiBPQkpfQkxPQiA9IDMgKi8KKwkidGFnIiwJCS8qIE9CSl9UQUcgPSA0ICovCit9OworCitjb25zdCBjaGFyICp0eXBlbmFtZSh1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlpZiAodHlwZSA+PSBBUlJBWV9TSVpFKG9iamVjdF90eXBlX3N0cmluZ3MpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gb2JqZWN0X3R5cGVfc3RyaW5nc1t0eXBlXTsKK30KKworaW50IHR5cGVfZnJvbV9zdHJpbmcoY29uc3QgY2hhciAqc3RyKQoreworCWludCBpOworCisJZm9yIChpID0gMTsgaSA8IEFSUkFZX1NJWkUob2JqZWN0X3R5cGVfc3RyaW5ncyk7IGkrKykKKwkJaWYgKCFzdHJjbXAoc3RyLCBvYmplY3RfdHlwZV9zdHJpbmdzW2ldKSkKKwkJCXJldHVybiBpOworCWRpZSgiaW52YWxpZCBvYmplY3QgdHlwZSBcIiVzXCIiLCBzdHIpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGhhc2hfb2JqKHN0cnVjdCBvYmplY3QgKm9iaiwgdW5zaWduZWQgaW50IG4pCit7CisJdW5zaWduZWQgaW50IGhhc2ggPSAqKHVuc2lnbmVkIGludCAqKW9iai0+c2hhMTsKKwlyZXR1cm4gaGFzaCAlIG47Cit9CisKK3N0YXRpYyB2b2lkIGluc2VydF9vYmpfaGFzaChzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCBvYmplY3QgKipoYXNoLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlpbnQgaiA9IGhhc2hfb2JqKG9iaiwgc2l6ZSk7CisKKwl3aGlsZSAoaGFzaFtqXSkgeworCQlqKys7CisJCWlmIChqID49IHNpemUpCisJCQlqID0gMDsKKwl9CisJaGFzaFtqXSA9IG9iajsKK30KKworc3RhdGljIGludCBoYXNodGFibGVfaW5kZXgoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwltZW1jcHkoJmksIHNoYTEsIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKwlyZXR1cm4gKGludCkoaSAlIG9ial9oYXNoX3NpemUpOworfQorCitzdHJ1Y3Qgb2JqZWN0ICpsb29rdXBfb2JqZWN0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaW50IGk7CisJc3RydWN0IG9iamVjdCAqb2JqOworCisJaWYgKCFvYmpfaGFzaCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpID0gaGFzaHRhYmxlX2luZGV4KHNoYTEpOworCXdoaWxlICgob2JqID0gb2JqX2hhc2hbaV0pICE9IE5VTEwpIHsKKwkJaWYgKCFoYXNoY21wKHNoYTEsIG9iai0+c2hhMSkpCisJCQlicmVhazsKKwkJaSsrOworCQlpZiAoaSA9PSBvYmpfaGFzaF9zaXplKQorCQkJaSA9IDA7CisJfQorCXJldHVybiBvYmo7Cit9CisKK3N0YXRpYyB2b2lkIGdyb3dfb2JqZWN0X2hhc2godm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgbmV3X2hhc2hfc2l6ZSA9IG9ial9oYXNoX3NpemUgPCAzMiA/IDMyIDogMiAqIG9ial9oYXNoX3NpemU7CisJc3RydWN0IG9iamVjdCAqKm5ld19oYXNoOworCisJbmV3X2hhc2ggPSB4Y2FsbG9jKG5ld19oYXNoX3NpemUsIHNpemVvZihzdHJ1Y3Qgb2JqZWN0ICopKTsKKwlmb3IgKGkgPSAwOyBpIDwgb2JqX2hhc2hfc2l6ZTsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3QgKm9iaiA9IG9ial9oYXNoW2ldOworCQlpZiAoIW9iaikKKwkJCWNvbnRpbnVlOworCQlpbnNlcnRfb2JqX2hhc2gob2JqLCBuZXdfaGFzaCwgbmV3X2hhc2hfc2l6ZSk7CisJfQorCWZyZWUob2JqX2hhc2gpOworCW9ial9oYXNoID0gbmV3X2hhc2g7CisJb2JqX2hhc2hfc2l6ZSA9IG5ld19oYXNoX3NpemU7Cit9CisKK3ZvaWQgKmNyZWF0ZV9vYmplY3QoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IHR5cGUsIHZvaWQgKm8pCit7CisJc3RydWN0IG9iamVjdCAqb2JqID0gbzsKKworCW9iai0+cGFyc2VkID0gMDsKKwlvYmotPnVzZWQgPSAwOworCW9iai0+dHlwZSA9IHR5cGU7CisJb2JqLT5mbGFncyA9IDA7CisJaGFzaGNweShvYmotPnNoYTEsIHNoYTEpOworCisJaWYgKG9ial9oYXNoX3NpemUgLSAxIDw9IG5yX29ianMgKiAyKQorCQlncm93X29iamVjdF9oYXNoKCk7CisKKwlpbnNlcnRfb2JqX2hhc2gob2JqLCBvYmpfaGFzaCwgb2JqX2hhc2hfc2l6ZSk7CisJbnJfb2JqcysrOworCXJldHVybiBvYmo7Cit9CisKK3N0cnVjdCBvYmplY3QgKmxvb2t1cF91bmtub3duX29iamVjdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBvYmplY3QgKm9iaiA9IGxvb2t1cF9vYmplY3Qoc2hhMSk7CisJaWYgKCFvYmopCisJCW9iaiA9IGNyZWF0ZV9vYmplY3Qoc2hhMSwgT0JKX05PTkUsIGFsbG9jX29iamVjdF9ub2RlKCkpOworCXJldHVybiBvYmo7Cit9CisKK3N0cnVjdCBvYmplY3QgKnBhcnNlX29iamVjdF9idWZmZXIoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgZW51bSBvYmplY3RfdHlwZSB0eXBlLCB1bnNpZ25lZCBsb25nIHNpemUsIHZvaWQgKmJ1ZmZlciwgaW50ICplYXRlbl9wKQoreworCXN0cnVjdCBvYmplY3QgKm9iajsKKwlpbnQgZWF0ZW4gPSAwOworCisJb2JqID0gTlVMTDsKKwlpZiAodHlwZSA9PSBPQkpfQkxPQikgeworCQlzdHJ1Y3QgYmxvYiAqYmxvYiA9IGxvb2t1cF9ibG9iKHNoYTEpOworCQlpZiAoYmxvYikgeworCQkJaWYgKHBhcnNlX2Jsb2JfYnVmZmVyKGJsb2IsIGJ1ZmZlciwgc2l6ZSkpCisJCQkJcmV0dXJuIE5VTEw7CisJCQlvYmogPSAmYmxvYi0+b2JqZWN0OworCQl9CisJfSBlbHNlIGlmICh0eXBlID09IE9CSl9UUkVFKSB7CisJCXN0cnVjdCB0cmVlICp0cmVlID0gbG9va3VwX3RyZWUoc2hhMSk7CisJCWlmICh0cmVlKSB7CisJCQlvYmogPSAmdHJlZS0+b2JqZWN0OworCQkJaWYgKCF0cmVlLT5vYmplY3QucGFyc2VkKSB7CisJCQkJaWYgKHBhcnNlX3RyZWVfYnVmZmVyKHRyZWUsIGJ1ZmZlciwgc2l6ZSkpCisJCQkJCXJldHVybiBOVUxMOworCQkJCWVhdGVuID0gMTsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAodHlwZSA9PSBPQkpfQ09NTUlUKSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxvb2t1cF9jb21taXQoc2hhMSk7CisJCWlmIChjb21taXQpIHsKKwkJCWlmIChwYXJzZV9jb21taXRfYnVmZmVyKGNvbW1pdCwgYnVmZmVyLCBzaXplKSkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCWlmICghY29tbWl0LT5idWZmZXIpIHsKKwkJCQljb21taXQtPmJ1ZmZlciA9IGJ1ZmZlcjsKKwkJCQllYXRlbiA9IDE7CisJCQl9CisJCQlvYmogPSAmY29tbWl0LT5vYmplY3Q7CisJCX0KKwl9IGVsc2UgaWYgKHR5cGUgPT0gT0JKX1RBRykgeworCQlzdHJ1Y3QgdGFnICp0YWcgPSBsb29rdXBfdGFnKHNoYTEpOworCQlpZiAodGFnKSB7CisJCQlpZiAocGFyc2VfdGFnX2J1ZmZlcih0YWcsIGJ1ZmZlciwgc2l6ZSkpCisJCQkgICAgICAgcmV0dXJuIE5VTEw7CisJCQlvYmogPSAmdGFnLT5vYmplY3Q7CisJCX0KKwl9IGVsc2UgeworCQl3YXJuaW5nKCJvYmplY3QgJXMgaGFzIHVua25vd24gdHlwZSBpZCAlZFxuIiwgc2hhMV90b19oZXgoc2hhMSksIHR5cGUpOworCQlvYmogPSBOVUxMOworCX0KKwlpZiAob2JqICYmIG9iai0+dHlwZSA9PSBPQkpfTk9ORSkKKwkJb2JqLT50eXBlID0gdHlwZTsKKwkqZWF0ZW5fcCA9IGVhdGVuOworCXJldHVybiBvYmo7Cit9CisKK3N0cnVjdCBvYmplY3QgKnBhcnNlX29iamVjdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJaW50IGVhdGVuOworCXZvaWQgKmJ1ZmZlciA9IHJlYWRfc2hhMV9maWxlKHNoYTEsICZ0eXBlLCAmc2l6ZSk7CisKKwlpZiAoYnVmZmVyKSB7CisJCXN0cnVjdCBvYmplY3QgKm9iajsKKwkJaWYgKGNoZWNrX3NoYTFfc2lnbmF0dXJlKHNoYTEsIGJ1ZmZlciwgc2l6ZSwgdHlwZW5hbWUodHlwZSkpIDwgMCkgeworCQkJZnJlZShidWZmZXIpOworCQkJZXJyb3IoInNoYTEgbWlzbWF0Y2ggJXNcbiIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJb2JqID0gcGFyc2Vfb2JqZWN0X2J1ZmZlcihzaGExLCB0eXBlLCBzaXplLCBidWZmZXIsICZlYXRlbik7CisJCWlmICghZWF0ZW4pCisJCQlmcmVlKGJ1ZmZlcik7CisJCXJldHVybiBvYmo7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3Qgb2JqZWN0X2xpc3QgKm9iamVjdF9saXN0X2luc2VydChzdHJ1Y3Qgb2JqZWN0ICppdGVtLAorCQkJCSAgICAgICBzdHJ1Y3Qgb2JqZWN0X2xpc3QgKipsaXN0X3ApCit7CisJc3RydWN0IG9iamVjdF9saXN0ICpuZXdfbGlzdCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBvYmplY3RfbGlzdCkpOworICAgICAgICBuZXdfbGlzdC0+aXRlbSA9IGl0ZW07CisgICAgICAgIG5ld19saXN0LT5uZXh0ID0gKmxpc3RfcDsKKyAgICAgICAgKmxpc3RfcCA9IG5ld19saXN0OworICAgICAgICByZXR1cm4gbmV3X2xpc3Q7Cit9CisKK3ZvaWQgb2JqZWN0X2xpc3RfYXBwZW5kKHN0cnVjdCBvYmplY3QgKml0ZW0sCisJCQlzdHJ1Y3Qgb2JqZWN0X2xpc3QgKipsaXN0X3ApCit7CisJd2hpbGUgKCpsaXN0X3ApIHsKKwkJbGlzdF9wID0gJigoKmxpc3RfcCktPm5leHQpOworCX0KKwkqbGlzdF9wID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IG9iamVjdF9saXN0KSk7CisJKCpsaXN0X3ApLT5uZXh0ID0gTlVMTDsKKwkoKmxpc3RfcCktPml0ZW0gPSBpdGVtOworfQorCit1bnNpZ25lZCBvYmplY3RfbGlzdF9sZW5ndGgoc3RydWN0IG9iamVjdF9saXN0ICpsaXN0KQoreworCXVuc2lnbmVkIHJldCA9IDA7CisJd2hpbGUgKGxpc3QpIHsKKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJCXJldCsrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgb2JqZWN0X2xpc3RfY29udGFpbnMoc3RydWN0IG9iamVjdF9saXN0ICpsaXN0LCBzdHJ1Y3Qgb2JqZWN0ICpvYmopCit7CisJd2hpbGUgKGxpc3QpIHsKKwkJaWYgKGxpc3QtPml0ZW0gPT0gb2JqKQorCQkJcmV0dXJuIDE7CisJCWxpc3QgPSBsaXN0LT5uZXh0OworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBhZGRfb2JqZWN0X2FycmF5KHN0cnVjdCBvYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG9iamVjdF9hcnJheSAqYXJyYXkpCit7CisJYWRkX29iamVjdF9hcnJheV93aXRoX21vZGUob2JqLCBuYW1lLCBhcnJheSwgU19JRklOVkFMSUQpOworfQorCit2b2lkIGFkZF9vYmplY3RfYXJyYXlfd2l0aF9tb2RlKHN0cnVjdCBvYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG9iamVjdF9hcnJheSAqYXJyYXksIHVuc2lnbmVkIG1vZGUpCit7CisJdW5zaWduZWQgbnIgPSBhcnJheS0+bnI7CisJdW5zaWduZWQgYWxsb2MgPSBhcnJheS0+YWxsb2M7CisJc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSAqb2JqZWN0cyA9IGFycmF5LT5vYmplY3RzOworCisJaWYgKG5yID49IGFsbG9jKSB7CisJCWFsbG9jID0gKGFsbG9jICsgMzIpICogMjsKKwkJb2JqZWN0cyA9IHhyZWFsbG9jKG9iamVjdHMsIGFsbG9jICogc2l6ZW9mKCpvYmplY3RzKSk7CisJCWFycmF5LT5hbGxvYyA9IGFsbG9jOworCQlhcnJheS0+b2JqZWN0cyA9IG9iamVjdHM7CisJfQorCW9iamVjdHNbbnJdLml0ZW0gPSBvYmo7CisJb2JqZWN0c1tucl0ubmFtZSA9IG5hbWU7CisJb2JqZWN0c1tucl0ubW9kZSA9IG1vZGU7CisJYXJyYXktPm5yID0gKytucjsKK30KZGlmZiAtLWdpdCBhL29iamVjdC5oIGIvb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM2YmQ2NgotLS0gL2Rldi9udWxsCisrKyBiL29iamVjdC5oCkBAIC0wLDAgKzEsNzUgQEAKKyNpZm5kZWYgT0JKRUNUX0gKKyNkZWZpbmUgT0JKRUNUX0gKKworc3RydWN0IG9iamVjdF9saXN0IHsKKwlzdHJ1Y3Qgb2JqZWN0ICppdGVtOworCXN0cnVjdCBvYmplY3RfbGlzdCAqbmV4dDsKK307CisKK3N0cnVjdCBvYmplY3RfcmVmcyB7CisJdW5zaWduZWQgY291bnQ7CisJc3RydWN0IG9iamVjdCAqcmVmW0ZMRVhfQVJSQVldOyAvKiBtb3JlICovCit9OworCitzdHJ1Y3Qgb2JqZWN0X2FycmF5IHsKKwl1bnNpZ25lZCBpbnQgbnI7CisJdW5zaWduZWQgaW50IGFsbG9jOworCXN0cnVjdCBvYmplY3RfYXJyYXlfZW50cnkgeworCQlzdHJ1Y3Qgb2JqZWN0ICppdGVtOworCQljb25zdCBjaGFyICpuYW1lOworCQl1bnNpZ25lZCBtb2RlOworCX0gKm9iamVjdHM7Cit9OworCisjZGVmaW5lIFRZUEVfQklUUyAgIDMKKyNkZWZpbmUgRkxBR19CSVRTICAyNworCisvKgorICogVGhlIG9iamVjdCB0eXBlIGlzIHN0b3JlZCBpbiAzIGJpdHMuCisgKi8KK3N0cnVjdCBvYmplY3QgeworCXVuc2lnbmVkIHBhcnNlZCA6IDE7CisJdW5zaWduZWQgdXNlZCA6IDE7CisJdW5zaWduZWQgdHlwZSA6IFRZUEVfQklUUzsKKwl1bnNpZ25lZCBmbGFncyA6IEZMQUdfQklUUzsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworfTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKnR5cGVuYW1lKHVuc2lnbmVkIGludCB0eXBlKTsKK2V4dGVybiBpbnQgdHlwZV9mcm9tX3N0cmluZyhjb25zdCBjaGFyICpzdHIpOworCitleHRlcm4gdW5zaWduZWQgaW50IGdldF9tYXhfb2JqZWN0X2luZGV4KHZvaWQpOworZXh0ZXJuIHN0cnVjdCBvYmplY3QgKmdldF9pbmRleGVkX29iamVjdCh1bnNpZ25lZCBpbnQpOworCisvKiogSW50ZXJuYWwgb25seSAqKi8KK3N0cnVjdCBvYmplY3QgKmxvb2t1cF9vYmplY3QoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSk7CisKK2V4dGVybiB2b2lkICpjcmVhdGVfb2JqZWN0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCB0eXBlLCB2b2lkICpvYmopOworCisvKiogUmV0dXJucyB0aGUgb2JqZWN0LCBoYXZpbmcgcGFyc2VkIGl0IHRvIGZpbmQgb3V0IHdoYXQgaXQgaXMuICoqLworc3RydWN0IG9iamVjdCAqcGFyc2Vfb2JqZWN0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCisvKiBHaXZlbiB0aGUgcmVzdWx0IG9mIHJlYWRfc2hhMV9maWxlKCksIHJldHVybnMgdGhlIG9iamVjdCBhZnRlcgorICogcGFyc2luZyBpdC4gIGVhdGVuX3AgaW5kaWNhdGVzIGlmIHRoZSBvYmplY3QgaGFzIGEgYm9ycm93ZWQgY29weQorICogb2YgYnVmZmVyIGFuZCB0aGUgY2FsbGVyIHNob3VsZCBub3QgZnJlZSgpIGl0LgorICovCitzdHJ1Y3Qgb2JqZWN0ICpwYXJzZV9vYmplY3RfYnVmZmVyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGVudW0gb2JqZWN0X3R5cGUgdHlwZSwgdW5zaWduZWQgbG9uZyBzaXplLCB2b2lkICpidWZmZXIsIGludCAqZWF0ZW5fcCk7CisKKy8qKiBSZXR1cm5zIHRoZSBvYmplY3QsIHdpdGggcG90ZW50aWFsbHkgZXhjZXNzIG1lbW9yeSBhbGxvY2F0ZWQuICoqLworc3RydWN0IG9iamVjdCAqbG9va3VwX3Vua25vd25fb2JqZWN0KGNvbnN0IHVuc2lnbmVkICBjaGFyICpzaGExKTsKKworc3RydWN0IG9iamVjdF9saXN0ICpvYmplY3RfbGlzdF9pbnNlcnQoc3RydWN0IG9iamVjdCAqaXRlbSwKKwkJCQkgICAgICAgc3RydWN0IG9iamVjdF9saXN0ICoqbGlzdF9wKTsKKwordm9pZCBvYmplY3RfbGlzdF9hcHBlbmQoc3RydWN0IG9iamVjdCAqaXRlbSwKKwkJCXN0cnVjdCBvYmplY3RfbGlzdCAqKmxpc3RfcCk7CisKK3Vuc2lnbmVkIG9iamVjdF9saXN0X2xlbmd0aChzdHJ1Y3Qgb2JqZWN0X2xpc3QgKmxpc3QpOworCitpbnQgb2JqZWN0X2xpc3RfY29udGFpbnMoc3RydWN0IG9iamVjdF9saXN0ICpsaXN0LCBzdHJ1Y3Qgb2JqZWN0ICpvYmopOworCisvKiBPYmplY3QgYXJyYXkgaGFuZGxpbmcgLi4gKi8KK3ZvaWQgYWRkX29iamVjdF9hcnJheShzdHJ1Y3Qgb2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBvYmplY3RfYXJyYXkgKmFycmF5KTsKK3ZvaWQgYWRkX29iamVjdF9hcnJheV93aXRoX21vZGUoc3RydWN0IG9iamVjdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgb2JqZWN0X2FycmF5ICphcnJheSwgdW5zaWduZWQgbW9kZSk7CisKKyNlbmRpZiAvKiBPQkpFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvcGFjay1jaGVjay5jIGIvcGFjay1jaGVjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOGFkMmMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrLWNoZWNrLmMKQEAgLTAsMCArMSwxOTQgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInBhY2suaCIKKyNpbmNsdWRlICJwYWNrLXJldmluZGV4LmgiCisKK3N0cnVjdCBpZHhfZW50cnkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExOworCW9mZl90ICAgICAgICAgICAgICAgIG9mZnNldDsKK307CisKK3N0YXRpYyBpbnQgY29tcGFyZV9lbnRyaWVzKGNvbnN0IHZvaWQgKmUxLCBjb25zdCB2b2lkICplMikKK3sKKwljb25zdCBzdHJ1Y3QgaWR4X2VudHJ5ICplbnRyeTEgPSBlMTsKKwljb25zdCBzdHJ1Y3QgaWR4X2VudHJ5ICplbnRyeTIgPSBlMjsKKwlpZiAoZW50cnkxLT5vZmZzZXQgPCBlbnRyeTItPm9mZnNldCkKKwkJcmV0dXJuIC0xOworCWlmIChlbnRyeTEtPm9mZnNldCA+IGVudHJ5Mi0+b2Zmc2V0KQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJpZnlfcGFja2ZpbGUoc3RydWN0IHBhY2tlZF9naXQgKnAsCisJCXN0cnVjdCBwYWNrX3dpbmRvdyAqKndfY3VycykKK3sKKwlvZmZfdCBpbmRleF9zaXplID0gcC0+aW5kZXhfc2l6ZTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICppbmRleF9iYXNlID0gcC0+aW5kZXhfZGF0YTsKKwlTSEFfQ1RYIGN0eDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCW9mZl90IG9mZnNldCA9IDAsIHBhY2tfc2lnID0gcC0+cGFja19zaXplIC0gMjA7CisJdWludDMyX3QgbnJfb2JqZWN0cywgaTsKKwlpbnQgZXJyOworCXN0cnVjdCBpZHhfZW50cnkgKmVudHJpZXM7CisKKwkvKiBOb3RlIHRoYXQgdGhlIHBhY2sgaGVhZGVyIGNoZWNrcyBhcmUgYWN0dWFsbHkgcGVyZm9ybWVkIGJ5CisJICogdXNlX3BhY2sgd2hlbiBpdCBmaXJzdCBvcGVucyB0aGUgcGFjayBmaWxlLiAgSWYgYW55dGhpbmcKKwkgKiBnb2VzIHdyb25nIGR1cmluZyB0aG9zZSBjaGVja3MgdGhlbiB0aGUgY2FsbCB3aWxsIGRpZSBvdXQKKwkgKiBpbW1lZGlhdGVseS4KKwkgKi8KKworCVNIQTFfSW5pdCgmY3R4KTsKKwl3aGlsZSAob2Zmc2V0IDwgcGFja19zaWcpIHsKKwkJdW5zaWduZWQgaW50IHJlbWFpbmluZzsKKwkJdW5zaWduZWQgY2hhciAqaW4gPSB1c2VfcGFjayhwLCB3X2N1cnMsIG9mZnNldCwgJnJlbWFpbmluZyk7CisJCW9mZnNldCArPSByZW1haW5pbmc7CisJCWlmIChvZmZzZXQgPiBwYWNrX3NpZykKKwkJCXJlbWFpbmluZyAtPSAodW5zaWduZWQgaW50KShvZmZzZXQgLSBwYWNrX3NpZyk7CisJCVNIQTFfVXBkYXRlKCZjdHgsIGluLCByZW1haW5pbmcpOworCX0KKwlTSEExX0ZpbmFsKHNoYTEsICZjdHgpOworCWlmIChoYXNoY21wKHNoYTEsIHVzZV9wYWNrKHAsIHdfY3VycywgcGFja19zaWcsIE5VTEwpKSkKKwkJcmV0dXJuIGVycm9yKCJQYWNrZmlsZSAlcyBTSEExIG1pc21hdGNoIHdpdGggaXRzZWxmIiwKKwkJCSAgICAgcC0+cGFja19uYW1lKTsKKwlpZiAoaGFzaGNtcChzaGExLCBpbmRleF9iYXNlICsgaW5kZXhfc2l6ZSAtIDQwKSkKKwkJcmV0dXJuIGVycm9yKCJQYWNrZmlsZSAlcyBTSEExIG1pc21hdGNoIHdpdGggaWR4IiwKKwkJCSAgICAgcC0+cGFja19uYW1lKTsKKwl1bnVzZV9wYWNrKHdfY3Vycyk7CisKKwkvKiBNYWtlIHN1cmUgZXZlcnl0aGluZyByZWFjaGFibGUgZnJvbSBpZHggaXMgdmFsaWQuICBTaW5jZSB3ZQorCSAqIGhhdmUgdmVyaWZpZWQgdGhhdCBucl9vYmplY3RzIG1hdGNoZXMgYmV0d2VlbiBpZHggYW5kIHBhY2ssCisJICogd2UgZG8gbm90IGRvIHNjYW4tc3RyZWFtaW5nIGNoZWNrIG9uIHRoZSBwYWNrIGZpbGUuCisJICovCisJbnJfb2JqZWN0cyA9IHAtPm51bV9vYmplY3RzOworCWVudHJpZXMgPSB4bWFsbG9jKG5yX29iamVjdHMgKiBzaXplb2YoKmVudHJpZXMpKTsKKwkvKiBmaXJzdCBzb3J0IGVudHJpZXMgYnkgcGFjayBvZmZzZXQsIHNpbmNlIHVucGFja2luZyB0aGVtIGlzIG1vcmUgZWZmaWNpZW50IHRoYXQgd2F5ICovCisJZm9yIChpID0gMDsgaSA8IG5yX29iamVjdHM7IGkrKykgeworCQllbnRyaWVzW2ldLnNoYTEgPSBudGhfcGFja2VkX29iamVjdF9zaGExKHAsIGkpOworCQlpZiAoIWVudHJpZXNbaV0uc2hhMSkKKwkJCWRpZSgiaW50ZXJuYWwgZXJyb3IgcGFjay1jaGVjayBudGgtcGFja2VkLW9iamVjdCIpOworCQllbnRyaWVzW2ldLm9mZnNldCA9IGZpbmRfcGFja19lbnRyeV9vbmUoZW50cmllc1tpXS5zaGExLCBwKTsKKwkJaWYgKCFlbnRyaWVzW2ldLm9mZnNldCkKKwkJCWRpZSgiaW50ZXJuYWwgZXJyb3IgcGFjay1jaGVjayBmaW5kLXBhY2stZW50cnktb25lIik7CisJfQorCXFzb3J0KGVudHJpZXMsIG5yX29iamVjdHMsIHNpemVvZigqZW50cmllcyksIGNvbXBhcmVfZW50cmllcyk7CisKKwlmb3IgKGkgPSAwLCBlcnIgPSAwOyBpIDwgbnJfb2JqZWN0czsgaSsrKSB7CisJCXZvaWQgKmRhdGE7CisJCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwkJdW5zaWduZWQgbG9uZyBzaXplOworCisJCWRhdGEgPSB1bnBhY2tfZW50cnkocCwgZW50cmllc1tpXS5vZmZzZXQsICZ0eXBlLCAmc2l6ZSk7CisJCWlmICghZGF0YSkgeworCQkJZXJyID0gZXJyb3IoImNhbm5vdCB1bnBhY2sgJXMgZnJvbSAlcyIsCisJCQkJICAgIHNoYTFfdG9faGV4KGVudHJpZXNbaV0uc2hhMSksIHAtPnBhY2tfbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY2hlY2tfc2hhMV9zaWduYXR1cmUoZW50cmllc1tpXS5zaGExLCBkYXRhLCBzaXplLCB0eXBlbmFtZSh0eXBlKSkpIHsKKwkJCWVyciA9IGVycm9yKCJwYWNrZWQgJXMgZnJvbSAlcyBpcyBjb3JydXB0IiwKKwkJCQkgICAgc2hhMV90b19oZXgoZW50cmllc1tpXS5zaGExKSwgcC0+cGFja19uYW1lKTsKKwkJCWZyZWUoZGF0YSk7CisJCQljb250aW51ZTsKKwkJfQorCQlmcmVlKGRhdGEpOworCX0KKwlmcmVlKGVudHJpZXMpOworCisJcmV0dXJuIGVycjsKK30KKworCisjZGVmaW5lIE1BWF9DSEFJTiA1MAorCitzdGF0aWMgdm9pZCBzaG93X3BhY2tfaW5mbyhzdHJ1Y3QgcGFja2VkX2dpdCAqcCkKK3sKKwl1aW50MzJfdCBucl9vYmplY3RzLCBpLCBjaGFpbl9oaXN0b2dyYW1bTUFYX0NIQUlOKzFdOworCisJbnJfb2JqZWN0cyA9IHAtPm51bV9vYmplY3RzOworCW1lbXNldChjaGFpbl9oaXN0b2dyYW0sIDAsIHNpemVvZihjaGFpbl9oaXN0b2dyYW0pKTsKKwlpbml0X3BhY2tfcmV2aW5kZXgoKTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9vYmplY3RzOyBpKyspIHsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMTsKKwkJdW5zaWduZWQgY2hhciBiYXNlX3NoYTFbMjBdOworCQljb25zdCBjaGFyICp0eXBlOworCQl1bnNpZ25lZCBsb25nIHNpemU7CisJCXVuc2lnbmVkIGxvbmcgc3RvcmVfc2l6ZTsKKwkJb2ZmX3Qgb2Zmc2V0OworCQl1bnNpZ25lZCBpbnQgZGVsdGFfY2hhaW5fbGVuZ3RoOworCisJCXNoYTEgPSBudGhfcGFja2VkX29iamVjdF9zaGExKHAsIGkpOworCQlpZiAoIXNoYTEpCisJCQlkaWUoImludGVybmFsIGVycm9yIHBhY2stY2hlY2sgbnRoLXBhY2tlZC1vYmplY3QiKTsKKwkJb2Zmc2V0ID0gZmluZF9wYWNrX2VudHJ5X29uZShzaGExLCBwKTsKKwkJaWYgKCFvZmZzZXQpCisJCQlkaWUoImludGVybmFsIGVycm9yIHBhY2stY2hlY2sgZmluZC1wYWNrLWVudHJ5LW9uZSIpOworCisJCXR5cGUgPSBwYWNrZWRfb2JqZWN0X2luZm9fZGV0YWlsKHAsIG9mZnNldCwgJnNpemUsICZzdG9yZV9zaXplLAorCQkJCQkJICZkZWx0YV9jaGFpbl9sZW5ndGgsCisJCQkJCQkgYmFzZV9zaGExKTsKKwkJcHJpbnRmKCIlcyAiLCBzaGExX3RvX2hleChzaGExKSk7CisJCWlmICghZGVsdGFfY2hhaW5fbGVuZ3RoKQorCQkJcHJpbnRmKCIlLTZzICVsdSAlbHUgJSJQUkl1TUFYIlxuIiwKKwkJCSAgICAgICB0eXBlLCBzaXplLCBzdG9yZV9zaXplLCAodWludG1heF90KW9mZnNldCk7CisJCWVsc2UgeworCQkJcHJpbnRmKCIlLTZzICVsdSAlbHUgJSJQUkl1TUFYIiAldSAlc1xuIiwKKwkJCSAgICAgICB0eXBlLCBzaXplLCBzdG9yZV9zaXplLCAodWludG1heF90KW9mZnNldCwKKwkJCSAgICAgICBkZWx0YV9jaGFpbl9sZW5ndGgsIHNoYTFfdG9faGV4KGJhc2Vfc2hhMSkpOworCQkJaWYgKGRlbHRhX2NoYWluX2xlbmd0aCA8PSBNQVhfQ0hBSU4pCisJCQkJY2hhaW5faGlzdG9ncmFtW2RlbHRhX2NoYWluX2xlbmd0aF0rKzsKKwkJCWVsc2UKKwkJCQljaGFpbl9oaXN0b2dyYW1bMF0rKzsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPD0gTUFYX0NIQUlOOyBpKyspIHsKKwkJaWYgKCFjaGFpbl9oaXN0b2dyYW1baV0pCisJCQljb250aW51ZTsKKwkJcHJpbnRmKCJjaGFpbiBsZW5ndGggPSAlZDogJWQgb2JqZWN0JXNcbiIsIGksCisJCSAgICAgICBjaGFpbl9oaXN0b2dyYW1baV0sIGNoYWluX2hpc3RvZ3JhbVtpXSA+IDEgPyAicyIgOiAiIik7CisJfQorCWlmIChjaGFpbl9oaXN0b2dyYW1bMF0pCisJCXByaW50ZigiY2hhaW4gbGVuZ3RoID4gJWQ6ICVkIG9iamVjdCVzXG4iLCBNQVhfQ0hBSU4sCisJCSAgICAgICBjaGFpbl9oaXN0b2dyYW1bMF0sIGNoYWluX2hpc3RvZ3JhbVswXSA+IDEgPyAicyIgOiAiIik7Cit9CisKK2ludCB2ZXJpZnlfcGFjayhzdHJ1Y3QgcGFja2VkX2dpdCAqcCwgaW50IHZlcmJvc2UpCit7CisJb2ZmX3QgaW5kZXhfc2l6ZTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICppbmRleF9iYXNlOworCVNIQV9DVFggY3R4OworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaW50IHJldDsKKworCWlmIChvcGVuX3BhY2tfaW5kZXgocCkpCisJCXJldHVybiBlcnJvcigicGFja2ZpbGUgJXMgaW5kZXggbm90IG9wZW5lZCIsIHAtPnBhY2tfbmFtZSk7CisJaW5kZXhfc2l6ZSA9IHAtPmluZGV4X3NpemU7CisJaW5kZXhfYmFzZSA9IHAtPmluZGV4X2RhdGE7CisKKwlyZXQgPSAwOworCS8qIFZlcmlmeSBTSEExIHN1bSBvZiB0aGUgaW5kZXggZmlsZSAqLworCVNIQTFfSW5pdCgmY3R4KTsKKwlTSEExX1VwZGF0ZSgmY3R4LCBpbmRleF9iYXNlLCAodW5zaWduZWQgaW50KShpbmRleF9zaXplIC0gMjApKTsKKwlTSEExX0ZpbmFsKHNoYTEsICZjdHgpOworCWlmIChoYXNoY21wKHNoYTEsIGluZGV4X2Jhc2UgKyBpbmRleF9zaXplIC0gMjApKQorCQlyZXQgPSBlcnJvcigiUGFja2ZpbGUgaW5kZXggZm9yICVzIFNIQTEgbWlzbWF0Y2giLAorCQkJICAgIHAtPnBhY2tfbmFtZSk7CisKKwlpZiAoIXJldCkgeworCQkvKiBWZXJpZnkgcGFjayBmaWxlICovCisJCXN0cnVjdCBwYWNrX3dpbmRvdyAqd19jdXJzID0gTlVMTDsKKwkJcmV0ID0gdmVyaWZ5X3BhY2tmaWxlKHAsICZ3X2N1cnMpOworCQl1bnVzZV9wYWNrKCZ3X2N1cnMpOworCX0KKworCWlmICh2ZXJib3NlKSB7CisJCWlmIChyZXQpCisJCQlwcmludGYoIiVzOiBiYWRcbiIsIHAtPnBhY2tfbmFtZSk7CisJCWVsc2UgeworCQkJc2hvd19wYWNrX2luZm8ocCk7CisJCQlwcmludGYoIiVzOiBva1xuIiwgcC0+cGFja19uYW1lKTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9wYWNrLXJlZHVuZGFudC5jIGIvcGFjay1yZWR1bmRhbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWNkMGFjCi0tLSAvZGV2L251bGwKKysrIGIvcGFjay1yZWR1bmRhbnQuYwpAQCAtMCwwICsxLDY5NSBAQAorLyoKKyoKKyogQ29weXJpZ2h0IDIwMDUsIEx1a2FzIFNhbmRzdHJvbSA8bHVrYXNzQGV0ZWsuY2hhbG1lcnMuc2U+CisqCisqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMIHYyLgorKgorKi8KKworI2luY2x1ZGUgImNhY2hlLmgiCisKKyNkZWZpbmUgQkxLU0laRSA1MTIKKworc3RhdGljIGNvbnN0IGNoYXIgcGFja19yZWR1bmRhbnRfdXNhZ2VbXSA9CisiZ2l0LXBhY2stcmVkdW5kYW50IFsgLS12ZXJib3NlIF0gWyAtLWFsdC1vZGIgXSA8IC0tYWxsIHwgPC5wYWNrIGZpbGVuYW1lPiAuLi4+IjsKKworc3RhdGljIGludCBsb2FkX2FsbF9wYWNrcywgdmVyYm9zZSwgYWx0X29kYjsKKworc3RydWN0IGxsaXN0X2l0ZW0geworCXN0cnVjdCBsbGlzdF9pdGVtICpuZXh0OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTE7Cit9Oworc3RhdGljIHN0cnVjdCBsbGlzdCB7CisJc3RydWN0IGxsaXN0X2l0ZW0gKmZyb250OworCXN0cnVjdCBsbGlzdF9pdGVtICpiYWNrOworCXNpemVfdCBzaXplOworfSAqYWxsX29iamVjdHM7IC8qIGFsbCBvYmplY3RzIHdoaWNoIG11c3QgYmUgcHJlc2VudCBpbiBsb2NhbCBwYWNrZmlsZXMgKi8KKworc3RhdGljIHN0cnVjdCBwYWNrX2xpc3QgeworCXN0cnVjdCBwYWNrX2xpc3QgKm5leHQ7CisJc3RydWN0IHBhY2tlZF9naXQgKnBhY2s7CisJc3RydWN0IGxsaXN0ICp1bmlxdWVfb2JqZWN0czsKKwlzdHJ1Y3QgbGxpc3QgKmFsbF9vYmplY3RzOworfSAqbG9jYWxfcGFja3MgPSBOVUxMLCAqYWx0b2RiX3BhY2tzID0gTlVMTDsKKworc3RydWN0IHBsbCB7CisJc3RydWN0IHBsbCAqbmV4dDsKKwlzdHJ1Y3QgcGFja19saXN0ICpwbDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxpc3RfaXRlbSAqZnJlZV9ub2RlczsKKworc3RhdGljIGlubGluZSB2b2lkIGxsaXN0X2l0ZW1fcHV0KHN0cnVjdCBsbGlzdF9pdGVtICppdGVtKQoreworCWl0ZW0tPm5leHQgPSBmcmVlX25vZGVzOworCWZyZWVfbm9kZXMgPSBpdGVtOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBsbGlzdF9pdGVtICpsbGlzdF9pdGVtX2dldCh2b2lkKQoreworCXN0cnVjdCBsbGlzdF9pdGVtICpuZXc7CisJaWYgKCBmcmVlX25vZGVzICkgeworCQluZXcgPSBmcmVlX25vZGVzOworCQlmcmVlX25vZGVzID0gZnJlZV9ub2Rlcy0+bmV4dDsKKwl9IGVsc2UgeworCQlpbnQgaSA9IDE7CisJCW5ldyA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsbGlzdF9pdGVtKSAqIEJMS1NJWkUpOworCQlmb3IoO2kgPCBCTEtTSVpFOyBpKyspIHsKKwkJCWxsaXN0X2l0ZW1fcHV0KCZuZXdbaV0pOworCQl9CisJfQorCXJldHVybiBuZXc7Cit9CisKK3N0YXRpYyB2b2lkIGxsaXN0X2ZyZWUoc3RydWN0IGxsaXN0ICpsaXN0KQoreworCXdoaWxlKChsaXN0LT5iYWNrID0gbGlzdC0+ZnJvbnQpKSB7CisJCWxpc3QtPmZyb250ID0gbGlzdC0+ZnJvbnQtPm5leHQ7CisJCWxsaXN0X2l0ZW1fcHV0KGxpc3QtPmJhY2spOworCX0KKwlmcmVlKGxpc3QpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbGxpc3RfaW5pdChzdHJ1Y3QgbGxpc3QgKipsaXN0KQoreworCSpsaXN0ID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGxsaXN0KSk7CisJKCpsaXN0KS0+ZnJvbnQgPSAoKmxpc3QpLT5iYWNrID0gTlVMTDsKKwkoKmxpc3QpLT5zaXplID0gMDsKK30KKworc3RhdGljIHN0cnVjdCBsbGlzdCAqIGxsaXN0X2NvcHkoc3RydWN0IGxsaXN0ICpsaXN0KQoreworCXN0cnVjdCBsbGlzdCAqcmV0OworCXN0cnVjdCBsbGlzdF9pdGVtICpuZXcsICpvbGQsICpwcmV2OworCisJbGxpc3RfaW5pdCgmcmV0KTsKKworCWlmICgocmV0LT5zaXplID0gbGlzdC0+c2l6ZSkgPT0gMCkKKwkJcmV0dXJuIHJldDsKKworCW5ldyA9IHJldC0+ZnJvbnQgPSBsbGlzdF9pdGVtX2dldCgpOworCW5ldy0+c2hhMSA9IGxpc3QtPmZyb250LT5zaGExOworCisJb2xkID0gbGlzdC0+ZnJvbnQtPm5leHQ7CisJd2hpbGUgKG9sZCkgeworCQlwcmV2ID0gbmV3OworCQluZXcgPSBsbGlzdF9pdGVtX2dldCgpOworCQlwcmV2LT5uZXh0ID0gbmV3OworCQluZXctPnNoYTEgPSBvbGQtPnNoYTE7CisJCW9sZCA9IG9sZC0+bmV4dDsKKwl9CisJbmV3LT5uZXh0ID0gTlVMTDsKKwlyZXQtPmJhY2sgPSBuZXc7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBsbGlzdF9pdGVtICpsbGlzdF9pbnNlcnQoc3RydWN0IGxsaXN0ICpsaXN0LAorCQkJCQkgICAgICBzdHJ1Y3QgbGxpc3RfaXRlbSAqYWZ0ZXIsCisJCQkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBsbGlzdF9pdGVtICpuZXcgPSBsbGlzdF9pdGVtX2dldCgpOworCW5ldy0+c2hhMSA9IHNoYTE7CisJbmV3LT5uZXh0ID0gTlVMTDsKKworCWlmIChhZnRlciAhPSBOVUxMKSB7CisJCW5ldy0+bmV4dCA9IGFmdGVyLT5uZXh0OworCQlhZnRlci0+bmV4dCA9IG5ldzsKKwkJaWYgKGFmdGVyID09IGxpc3QtPmJhY2spCisJCQlsaXN0LT5iYWNrID0gbmV3OworCX0gZWxzZSB7LyogaW5zZXJ0IGluIGZyb250ICovCisJCWlmIChsaXN0LT5zaXplID09IDApCisJCQlsaXN0LT5iYWNrID0gbmV3OworCQllbHNlCisJCQluZXctPm5leHQgPSBsaXN0LT5mcm9udDsKKwkJbGlzdC0+ZnJvbnQgPSBuZXc7CisJfQorCWxpc3QtPnNpemUrKzsKKwlyZXR1cm4gbmV3OworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBsbGlzdF9pdGVtICpsbGlzdF9pbnNlcnRfYmFjayhzdHJ1Y3QgbGxpc3QgKmxpc3QsCisJCQkJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXJldHVybiBsbGlzdF9pbnNlcnQobGlzdCwgbGlzdC0+YmFjaywgc2hhMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGxsaXN0X2l0ZW0gKmxsaXN0X2luc2VydF9zb3J0ZWRfdW5pcXVlKHN0cnVjdCBsbGlzdCAqbGlzdCwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHN0cnVjdCBsbGlzdF9pdGVtICpoaW50KQoreworCXN0cnVjdCBsbGlzdF9pdGVtICpwcmV2ID0gTlVMTCwgKmw7CisKKwlsID0gKGhpbnQgPT0gTlVMTCkgPyBsaXN0LT5mcm9udCA6IGhpbnQ7CisJd2hpbGUgKGwpIHsKKwkJaW50IGNtcCA9IGhhc2hjbXAobC0+c2hhMSwgc2hhMSk7CisJCWlmIChjbXAgPiAwKSB7IC8qIHdlIGluc2VydCBiZWZvcmUgdGhpcyBlbnRyeSAqLworCQkJcmV0dXJuIGxsaXN0X2luc2VydChsaXN0LCBwcmV2LCBzaGExKTsKKwkJfQorCQlpZighY21wKSB7IC8qIGFscmVhZHkgZXhpc3RzICovCisJCQlyZXR1cm4gbDsKKwkJfQorCQlwcmV2ID0gbDsKKwkJbCA9IGwtPm5leHQ7CisJfQorCS8qIGluc2VydCBhdCB0aGUgZW5kICovCisJcmV0dXJuIGxsaXN0X2luc2VydF9iYWNrKGxpc3QsIHNoYTEpOworfQorCisvKiByZXR1cm5zIGEgcG9pbnRlciB0byBhbiBpdGVtIGluIGZyb250IG9mIHNoYTEgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGxsaXN0X2l0ZW0gKiBsbGlzdF9zb3J0ZWRfcmVtb3ZlKHN0cnVjdCBsbGlzdCAqbGlzdCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgc3RydWN0IGxsaXN0X2l0ZW0gKmhpbnQpCit7CisJc3RydWN0IGxsaXN0X2l0ZW0gKnByZXYsICpsOworCityZWRvX2Zyb21fc3RhcnQ6CisJbCA9IChoaW50ID09IE5VTEwpID8gbGlzdC0+ZnJvbnQgOiBoaW50OworCXByZXYgPSBOVUxMOworCXdoaWxlIChsKSB7CisJCWludCBjbXAgPSBoYXNoY21wKGwtPnNoYTEsIHNoYTEpOworCQlpZiAoY21wID4gMCkgLyogbm90IGluIGxpc3QsIHNpbmNlIHNvcnRlZCAqLworCQkJcmV0dXJuIHByZXY7CisJCWlmKCFjbXApIHsgLyogZm91bmQgKi8KKwkJCWlmIChwcmV2ID09IE5VTEwpIHsKKwkJCQlpZiAoaGludCAhPSBOVUxMICYmIGhpbnQgIT0gbGlzdC0+ZnJvbnQpIHsKKwkJCQkJLyogd2UgZG9uJ3Qga25vdyB0aGUgcHJldmlvdXMgZWxlbWVudCAqLworCQkJCQloaW50ID0gTlVMTDsKKwkJCQkJZ290byByZWRvX2Zyb21fc3RhcnQ7CisJCQkJfQorCQkJCWxpc3QtPmZyb250ID0gbC0+bmV4dDsKKwkJCX0gZWxzZQorCQkJCXByZXYtPm5leHQgPSBsLT5uZXh0OworCQkJaWYgKGwgPT0gbGlzdC0+YmFjaykKKwkJCQlsaXN0LT5iYWNrID0gcHJldjsKKwkJCWxsaXN0X2l0ZW1fcHV0KGwpOworCQkJbGlzdC0+c2l6ZS0tOworCQkJcmV0dXJuIHByZXY7CisJCX0KKwkJcHJldiA9IGw7CisJCWwgPSBsLT5uZXh0OworCX0KKwlyZXR1cm4gcHJldjsKK30KKworLyogY29tcHV0ZXMgQVxCICovCitzdGF0aWMgdm9pZCBsbGlzdF9zb3J0ZWRfZGlmZmVyZW5jZV9pbnBsYWNlKHN0cnVjdCBsbGlzdCAqQSwKKwkJCQkgICAgIHN0cnVjdCBsbGlzdCAqQikKK3sKKwlzdHJ1Y3QgbGxpc3RfaXRlbSAqaGludCwgKmI7CisKKwloaW50ID0gTlVMTDsKKwliID0gQi0+ZnJvbnQ7CisKKwl3aGlsZSAoYikgeworCQloaW50ID0gbGxpc3Rfc29ydGVkX3JlbW92ZShBLCBiLT5zaGExLCBoaW50KTsKKwkJYiA9IGItPm5leHQ7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWNrX2xpc3QgKiBwYWNrX2xpc3RfaW5zZXJ0KHN0cnVjdCBwYWNrX2xpc3QgKipwbCwKKwkJCQkJICAgc3RydWN0IHBhY2tfbGlzdCAqZW50cnkpCit7CisJc3RydWN0IHBhY2tfbGlzdCAqcCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWNrX2xpc3QpKTsKKwltZW1jcHkocCwgZW50cnksIHNpemVvZihzdHJ1Y3QgcGFja19saXN0KSk7CisJcC0+bmV4dCA9ICpwbDsKKwkqcGwgPSBwOworCXJldHVybiBwOworfQorCitzdGF0aWMgaW5saW5lIHNpemVfdCBwYWNrX2xpc3Rfc2l6ZShzdHJ1Y3QgcGFja19saXN0ICpwbCkKK3sKKwlzaXplX3QgcmV0ID0gMDsKKwl3aGlsZShwbCkgeworCQlyZXQrKzsKKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBwYWNrX2xpc3QgKiBwYWNrX2xpc3RfZGlmZmVyZW5jZShjb25zdCBzdHJ1Y3QgcGFja19saXN0ICpBLAorCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBhY2tfbGlzdCAqQikKK3sKKwlzdHJ1Y3QgcGFja19saXN0ICpyZXQ7CisJY29uc3Qgc3RydWN0IHBhY2tfbGlzdCAqcGw7CisKKwlpZiAoQSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXBsID0gQjsKKwl3aGlsZSAocGwgIT0gTlVMTCkgeworCQlpZiAoQS0+cGFjayA9PSBwbC0+cGFjaykKKwkJCXJldHVybiBwYWNrX2xpc3RfZGlmZmVyZW5jZShBLT5uZXh0LCBCKTsKKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisJcmV0ID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IHBhY2tfbGlzdCkpOworCW1lbWNweShyZXQsIEEsIHNpemVvZihzdHJ1Y3QgcGFja19saXN0KSk7CisJcmV0LT5uZXh0ID0gcGFja19saXN0X2RpZmZlcmVuY2UoQS0+bmV4dCwgQik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgY21wX3R3b19wYWNrcyhzdHJ1Y3QgcGFja19saXN0ICpwMSwgc3RydWN0IHBhY2tfbGlzdCAqcDIpCit7CisJdW5zaWduZWQgbG9uZyBwMV9vZmYgPSAwLCBwMl9vZmYgPSAwLCBwMV9zdGVwLCBwMl9zdGVwOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAxX2Jhc2UsICpwMl9iYXNlOworCXN0cnVjdCBsbGlzdF9pdGVtICpwMV9oaW50ID0gTlVMTCwgKnAyX2hpbnQgPSBOVUxMOworCisJcDFfYmFzZSA9IHAxLT5wYWNrLT5pbmRleF9kYXRhOworCXAyX2Jhc2UgPSBwMi0+cGFjay0+aW5kZXhfZGF0YTsKKwlwMV9iYXNlICs9IDI1NiAqIDQgKyAoKHAxLT5wYWNrLT5pbmRleF92ZXJzaW9uIDwgMikgPyA0IDogOCk7CisJcDJfYmFzZSArPSAyNTYgKiA0ICsgKChwMi0+cGFjay0+aW5kZXhfdmVyc2lvbiA8IDIpID8gNCA6IDgpOworCXAxX3N0ZXAgPSAocDEtPnBhY2stPmluZGV4X3ZlcnNpb24gPCAyKSA/IDI0IDogMjA7CisJcDJfc3RlcCA9IChwMi0+cGFjay0+aW5kZXhfdmVyc2lvbiA8IDIpID8gMjQgOiAyMDsKKworCXdoaWxlIChwMV9vZmYgPCBwMS0+cGFjay0+bnVtX29iamVjdHMgKiBwMV9zdGVwICYmCisJICAgICAgIHAyX29mZiA8IHAyLT5wYWNrLT5udW1fb2JqZWN0cyAqIHAyX3N0ZXApCisJeworCQlpbnQgY21wID0gaGFzaGNtcChwMV9iYXNlICsgcDFfb2ZmLCBwMl9iYXNlICsgcDJfb2ZmKTsKKwkJLyogY21wIH4gcDEgLSBwMiAqLworCQlpZiAoY21wID09IDApIHsKKwkJCXAxX2hpbnQgPSBsbGlzdF9zb3J0ZWRfcmVtb3ZlKHAxLT51bmlxdWVfb2JqZWN0cywKKwkJCQkJcDFfYmFzZSArIHAxX29mZiwgcDFfaGludCk7CisJCQlwMl9oaW50ID0gbGxpc3Rfc29ydGVkX3JlbW92ZShwMi0+dW5pcXVlX29iamVjdHMsCisJCQkJCXAxX2Jhc2UgKyBwMV9vZmYsIHAyX2hpbnQpOworCQkJcDFfb2ZmICs9IHAxX3N0ZXA7CisJCQlwMl9vZmYgKz0gcDJfc3RlcDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjbXAgPCAwKSB7IC8qIHAxIGhhcyB0aGUgb2JqZWN0LCBwMiBkb2Vzbid0ICovCisJCQlwMV9vZmYgKz0gcDFfc3RlcDsKKwkJfSBlbHNlIHsgLyogcDIgaGFzIHRoZSBvYmplY3QsIHAxIGRvZXNuJ3QgKi8KKwkJCXAyX29mZiArPSBwMl9zdGVwOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBwbGxfZnJlZShzdHJ1Y3QgcGxsICpsKQoreworCXN0cnVjdCBwbGwgKm9sZDsKKwlzdHJ1Y3QgcGFja19saXN0ICpvcGw7CisKKwl3aGlsZSAobCkgeworCQlvbGQgPSBsOworCQl3aGlsZSAobC0+cGwpIHsKKwkJCW9wbCA9IGwtPnBsOworCQkJbC0+cGwgPSBvcGwtPm5leHQ7CisJCQlmcmVlKG9wbCk7CisJCX0KKwkJbCA9IGwtPm5leHQ7CisJCWZyZWUob2xkKTsKKwl9Cit9CisKKy8qIGFsbCB0aGUgcGVybXV0YXRpb25zIGhhdmUgdG8gYmUgZnJlZSgpZCBhdCB0aGUgc2FtZSB0aW1lLAorICogc2luY2UgdGhleSByZWZlciB0byBlYWNoIG90aGVyCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxsICogZ2V0X3Blcm11dGF0aW9ucyhzdHJ1Y3QgcGFja19saXN0ICpsaXN0LCBpbnQgbikKK3sKKwlzdHJ1Y3QgcGxsICpzdWJzZXQsICpyZXQgPSBOVUxMLCAqbmV3X3BsbCA9IE5VTEwsICpwbGw7CisKKwlpZiAobGlzdCA9PSBOVUxMIHx8IHBhY2tfbGlzdF9zaXplKGxpc3QpIDwgbiB8fCBuID09IDApCisJCXJldHVybiBOVUxMOworCisJaWYgKG4gPT0gMSkgeworCQl3aGlsZSAobGlzdCkgeworCQkJbmV3X3BsbCA9IHhtYWxsb2Moc2l6ZW9mKHBsbCkpOworCQkJbmV3X3BsbC0+cGwgPSBOVUxMOworCQkJcGFja19saXN0X2luc2VydCgmbmV3X3BsbC0+cGwsIGxpc3QpOworCQkJbmV3X3BsbC0+bmV4dCA9IHJldDsKKwkJCXJldCA9IG5ld19wbGw7CisJCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJfQorCQlyZXR1cm4gcmV0OworCX0KKworCXdoaWxlIChsaXN0LT5uZXh0KSB7CisJCXN1YnNldCA9IGdldF9wZXJtdXRhdGlvbnMobGlzdC0+bmV4dCwgbiAtIDEpOworCQl3aGlsZSAoc3Vic2V0KSB7CisJCQluZXdfcGxsID0geG1hbGxvYyhzaXplb2YocGxsKSk7CisJCQluZXdfcGxsLT5wbCA9IHN1YnNldC0+cGw7CisJCQlwYWNrX2xpc3RfaW5zZXJ0KCZuZXdfcGxsLT5wbCwgbGlzdCk7CisJCQluZXdfcGxsLT5uZXh0ID0gcmV0OworCQkJcmV0ID0gbmV3X3BsbDsKKwkJCXN1YnNldCA9IHN1YnNldC0+bmV4dDsKKwkJfQorCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpc19zdXBlcnNldChzdHJ1Y3QgcGFja19saXN0ICpwbCwgc3RydWN0IGxsaXN0ICpsaXN0KQoreworCXN0cnVjdCBsbGlzdCAqZGlmZjsKKworCWRpZmYgPSBsbGlzdF9jb3B5KGxpc3QpOworCisJd2hpbGUgKHBsKSB7CisJCWxsaXN0X3NvcnRlZF9kaWZmZXJlbmNlX2lucGxhY2UoZGlmZiwgcGwtPmFsbF9vYmplY3RzKTsKKwkJaWYgKGRpZmYtPnNpemUgPT0gMCkgeyAvKiB3ZSdyZSBkb25lICovCisJCQlsbGlzdF9mcmVlKGRpZmYpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisJbGxpc3RfZnJlZShkaWZmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNpemVfdCBzaXplb2ZfdW5pb24oc3RydWN0IHBhY2tlZF9naXQgKnAxLCBzdHJ1Y3QgcGFja2VkX2dpdCAqcDIpCit7CisJc2l6ZV90IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBwMV9vZmYgPSAwLCBwMl9vZmYgPSAwLCBwMV9zdGVwLCBwMl9zdGVwOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAxX2Jhc2UsICpwMl9iYXNlOworCisJcDFfYmFzZSA9IHAxLT5pbmRleF9kYXRhOworCXAyX2Jhc2UgPSBwMi0+aW5kZXhfZGF0YTsKKwlwMV9iYXNlICs9IDI1NiAqIDQgKyAoKHAxLT5pbmRleF92ZXJzaW9uIDwgMikgPyA0IDogOCk7CisJcDJfYmFzZSArPSAyNTYgKiA0ICsgKChwMi0+aW5kZXhfdmVyc2lvbiA8IDIpID8gNCA6IDgpOworCXAxX3N0ZXAgPSAocDEtPmluZGV4X3ZlcnNpb24gPCAyKSA/IDI0IDogMjA7CisJcDJfc3RlcCA9IChwMi0+aW5kZXhfdmVyc2lvbiA8IDIpID8gMjQgOiAyMDsKKworCXdoaWxlIChwMV9vZmYgPCBwMS0+bnVtX29iamVjdHMgKiBwMV9zdGVwICYmCisJICAgICAgIHAyX29mZiA8IHAyLT5udW1fb2JqZWN0cyAqIHAyX3N0ZXApCisJeworCQlpbnQgY21wID0gaGFzaGNtcChwMV9iYXNlICsgcDFfb2ZmLCBwMl9iYXNlICsgcDJfb2ZmKTsKKwkJLyogY21wIH4gcDEgLSBwMiAqLworCQlpZiAoY21wID09IDApIHsKKwkJCXJldCsrOworCQkJcDFfb2ZmICs9IHAxX3N0ZXA7CisJCQlwMl9vZmYgKz0gcDJfc3RlcDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjbXAgPCAwKSB7IC8qIHAxIGhhcyB0aGUgb2JqZWN0LCBwMiBkb2Vzbid0ICovCisJCQlwMV9vZmYgKz0gcDFfc3RlcDsKKwkJfSBlbHNlIHsgLyogcDIgaGFzIHRoZSBvYmplY3QsIHAxIGRvZXNuJ3QgKi8KKwkJCXAyX29mZiArPSBwMl9zdGVwOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIGFub3RoZXIgTyhuXjIpIGZ1bmN0aW9uIC4uLiAqLworc3RhdGljIHNpemVfdCBnZXRfcGFja19yZWR1bmRhbmN5KHN0cnVjdCBwYWNrX2xpc3QgKnBsKQoreworCXN0cnVjdCBwYWNrX2xpc3QgKnN1YnNldDsKKwlzaXplX3QgcmV0ID0gMDsKKworCWlmIChwbCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgoc3Vic2V0ID0gcGwtPm5leHQpKSB7CisJCXdoaWxlKHN1YnNldCkgeworCQkJcmV0ICs9IHNpemVvZl91bmlvbihwbC0+cGFjaywgc3Vic2V0LT5wYWNrKTsKKwkJCXN1YnNldCA9IHN1YnNldC0+bmV4dDsKKwkJfQorCQlwbCA9IHBsLT5uZXh0OworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIG9mZl90IHBhY2tfc2V0X2J5dGVjb3VudChzdHJ1Y3QgcGFja19saXN0ICpwbCkKK3sKKwlvZmZfdCByZXQgPSAwOworCXdoaWxlIChwbCkgeworCQlyZXQgKz0gcGwtPnBhY2stPnBhY2tfc2l6ZTsKKwkJcmV0ICs9IHBsLT5wYWNrLT5pbmRleF9zaXplOworCQlwbCA9IHBsLT5uZXh0OworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtaW5pbWl6ZShzdHJ1Y3QgcGFja19saXN0ICoqbWluKQoreworCXN0cnVjdCBwYWNrX2xpc3QgKnBsLCAqdW5pcXVlID0gTlVMTCwKKwkJKm5vbl91bmlxdWUgPSBOVUxMLCAqbWluX3Blcm0gPSBOVUxMOworCXN0cnVjdCBwbGwgKnBlcm0sICpwZXJtX2FsbCwgKnBlcm1fb2sgPSBOVUxMLCAqbmV3X3Blcm07CisJc3RydWN0IGxsaXN0ICptaXNzaW5nOworCW9mZl90IG1pbl9wZXJtX3NpemUgPSAwLCBwZXJtX3NpemU7CisJaW50IG47CisKKwlwbCA9IGxvY2FsX3BhY2tzOworCXdoaWxlIChwbCkgeworCQlpZihwbC0+dW5pcXVlX29iamVjdHMtPnNpemUpCisJCQlwYWNrX2xpc3RfaW5zZXJ0KCZ1bmlxdWUsIHBsKTsKKwkJZWxzZQorCQkJcGFja19saXN0X2luc2VydCgmbm9uX3VuaXF1ZSwgcGwpOworCQlwbCA9IHBsLT5uZXh0OworCX0KKwkvKiBmaW5kIG91dCB3aGljaCBvYmplY3RzIGFyZSBtaXNzaW5nIGZyb20gdGhlIHNldCBvZiB1bmlxdWUgcGFja3MgKi8KKwltaXNzaW5nID0gbGxpc3RfY29weShhbGxfb2JqZWN0cyk7CisJcGwgPSB1bmlxdWU7CisJd2hpbGUgKHBsKSB7CisJCWxsaXN0X3NvcnRlZF9kaWZmZXJlbmNlX2lucGxhY2UobWlzc2luZywgcGwtPmFsbF9vYmplY3RzKTsKKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisKKwkvKiByZXR1cm4gaWYgdGhlcmUgYXJlIG5vIG9iamVjdHMgbWlzc2luZyBmcm9tIHRoZSB1bmlxdWUgc2V0ICovCisJaWYgKG1pc3NpbmctPnNpemUgPT0gMCkgeworCQkqbWluID0gdW5pcXVlOworCQlyZXR1cm47CisJfQorCisJLyogZmluZCB0aGUgcGVybXV0YXRpb25zIHdoaWNoIGNvbnRhaW4gYWxsIG1pc3Npbmcgb2JqZWN0cyAqLworCWZvciAobiA9IDE7IG4gPD0gcGFja19saXN0X3NpemUobm9uX3VuaXF1ZSkgJiYgIXBlcm1fb2s7IG4rKykgeworCQlwZXJtX2FsbCA9IHBlcm0gPSBnZXRfcGVybXV0YXRpb25zKG5vbl91bmlxdWUsIG4pOworCQl3aGlsZSAocGVybSkgeworCQkJaWYgKGlzX3N1cGVyc2V0KHBlcm0tPnBsLCBtaXNzaW5nKSkgeworCQkJCW5ld19wZXJtID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IHBsbCkpOworCQkJCW1lbWNweShuZXdfcGVybSwgcGVybSwgc2l6ZW9mKHN0cnVjdCBwbGwpKTsKKwkJCQluZXdfcGVybS0+bmV4dCA9IHBlcm1fb2s7CisJCQkJcGVybV9vayA9IG5ld19wZXJtOworCQkJfQorCQkJcGVybSA9IHBlcm0tPm5leHQ7CisJCX0KKwkJaWYgKHBlcm1fb2spCisJCQlicmVhazsKKwkJcGxsX2ZyZWUocGVybV9hbGwpOworCX0KKwlpZiAocGVybV9vayA9PSBOVUxMKQorCQlkaWUoIkludGVybmFsIGVycm9yOiBObyBjb21wbGV0ZSBzZXRzIGZvdW5kIVxuIik7CisKKwkvKiBmaW5kIHRoZSBwZXJtdXRhdGlvbiB3aXRoIHRoZSBzbWFsbGVzdCBzaXplICovCisJcGVybSA9IHBlcm1fb2s7CisJd2hpbGUgKHBlcm0pIHsKKwkJcGVybV9zaXplID0gcGFja19zZXRfYnl0ZWNvdW50KHBlcm0tPnBsKTsKKwkJaWYgKCFtaW5fcGVybV9zaXplIHx8IG1pbl9wZXJtX3NpemUgPiBwZXJtX3NpemUpIHsKKwkJCW1pbl9wZXJtX3NpemUgPSBwZXJtX3NpemU7CisJCQltaW5fcGVybSA9IHBlcm0tPnBsOworCQl9CisJCXBlcm0gPSBwZXJtLT5uZXh0OworCX0KKwkqbWluID0gbWluX3Blcm07CisJLyogYWRkIHRoZSB1bmlxdWUgcGFja3MgdG8gdGhlIGxpc3QgKi8KKwlwbCA9IHVuaXF1ZTsKKwl3aGlsZShwbCkgeworCQlwYWNrX2xpc3RfaW5zZXJ0KG1pbiwgcGwpOworCQlwbCA9IHBsLT5uZXh0OworCX0KK30KKworc3RhdGljIHZvaWQgbG9hZF9hbGxfb2JqZWN0cyh2b2lkKQoreworCXN0cnVjdCBwYWNrX2xpc3QgKnBsID0gbG9jYWxfcGFja3M7CisJc3RydWN0IGxsaXN0X2l0ZW0gKmhpbnQsICpsOworCisJbGxpc3RfaW5pdCgmYWxsX29iamVjdHMpOworCisJd2hpbGUgKHBsKSB7CisJCWhpbnQgPSBOVUxMOworCQlsID0gcGwtPmFsbF9vYmplY3RzLT5mcm9udDsKKwkJd2hpbGUgKGwpIHsKKwkJCWhpbnQgPSBsbGlzdF9pbnNlcnRfc29ydGVkX3VuaXF1ZShhbGxfb2JqZWN0cywKKwkJCQkJCQkgIGwtPnNoYTEsIGhpbnQpOworCQkJbCA9IGwtPm5leHQ7CisJCX0KKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisJLyogcmVtb3ZlIG9iamVjdHMgcHJlc2VudCBpbiByZW1vdGUgcGFja3MgKi8KKwlwbCA9IGFsdG9kYl9wYWNrczsKKwl3aGlsZSAocGwpIHsKKwkJbGxpc3Rfc29ydGVkX2RpZmZlcmVuY2VfaW5wbGFjZShhbGxfb2JqZWN0cywgcGwtPmFsbF9vYmplY3RzKTsKKwkJcGwgPSBwbC0+bmV4dDsKKwl9Cit9CisKKy8qIHRoaXMgc2NhbGVzIGxpa2UgTyhuXjIpICovCitzdGF0aWMgdm9pZCBjbXBfbG9jYWxfcGFja3Modm9pZCkKK3sKKwlzdHJ1Y3QgcGFja19saXN0ICpzdWJzZXQsICpwbCA9IGxvY2FsX3BhY2tzOworCisJd2hpbGUgKChzdWJzZXQgPSBwbCkpIHsKKwkJd2hpbGUoKHN1YnNldCA9IHN1YnNldC0+bmV4dCkpCisJCQljbXBfdHdvX3BhY2tzKHBsLCBzdWJzZXQpOworCQlwbCA9IHBsLT5uZXh0OworCX0KK30KKworc3RhdGljIHZvaWQgc2Nhbl9hbHRfb2RiX3BhY2tzKHZvaWQpCit7CisJc3RydWN0IHBhY2tfbGlzdCAqbG9jYWwsICphbHQ7CisKKwlhbHQgPSBhbHRvZGJfcGFja3M7CisJd2hpbGUgKGFsdCkgeworCQlsb2NhbCA9IGxvY2FsX3BhY2tzOworCQl3aGlsZSAobG9jYWwpIHsKKwkJCWxsaXN0X3NvcnRlZF9kaWZmZXJlbmNlX2lucGxhY2UobG9jYWwtPnVuaXF1ZV9vYmplY3RzLAorCQkJCQkJCWFsdC0+YWxsX29iamVjdHMpOworCQkJbG9jYWwgPSBsb2NhbC0+bmV4dDsKKwkJfQorCQlsbGlzdF9zb3J0ZWRfZGlmZmVyZW5jZV9pbnBsYWNlKGFsbF9vYmplY3RzLCBhbHQtPmFsbF9vYmplY3RzKTsKKwkJYWx0ID0gYWx0LT5uZXh0OworCX0KK30KKworc3RhdGljIHN0cnVjdCBwYWNrX2xpc3QgKiBhZGRfcGFjayhzdHJ1Y3QgcGFja2VkX2dpdCAqcCkKK3sKKwlzdHJ1Y3QgcGFja19saXN0IGw7CisJdW5zaWduZWQgbG9uZyBvZmYgPSAwLCBzdGVwOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJhc2U7CisKKwlpZiAoIXAtPnBhY2tfbG9jYWwgJiYgIShhbHRfb2RiIHx8IHZlcmJvc2UpKQorCQlyZXR1cm4gTlVMTDsKKworCWwucGFjayA9IHA7CisJbGxpc3RfaW5pdCgmbC5hbGxfb2JqZWN0cyk7CisKKwlpZiAob3Blbl9wYWNrX2luZGV4KHApKQorCQlyZXR1cm4gTlVMTDsKKworCWJhc2UgPSBwLT5pbmRleF9kYXRhOworCWJhc2UgKz0gMjU2ICogNCArICgocC0+aW5kZXhfdmVyc2lvbiA8IDIpID8gNCA6IDgpOworCXN0ZXAgPSAocC0+aW5kZXhfdmVyc2lvbiA8IDIpID8gMjQgOiAyMDsKKwl3aGlsZSAob2ZmIDwgcC0+bnVtX29iamVjdHMgKiBzdGVwKSB7CisJCWxsaXN0X2luc2VydF9iYWNrKGwuYWxsX29iamVjdHMsIGJhc2UgKyBvZmYpOworCQlvZmYgKz0gc3RlcDsKKwl9CisJLyogdGhpcyBsaXN0IHdpbGwgYmUgcHJ1bmVkIGluIGNtcF90d29fcGFja3MgbGF0ZXIgKi8KKwlsLnVuaXF1ZV9vYmplY3RzID0gbGxpc3RfY29weShsLmFsbF9vYmplY3RzKTsKKwlpZiAocC0+cGFja19sb2NhbCkKKwkJcmV0dXJuIHBhY2tfbGlzdF9pbnNlcnQoJmxvY2FsX3BhY2tzLCAmbCk7CisJZWxzZQorCQlyZXR1cm4gcGFja19saXN0X2luc2VydCgmYWx0b2RiX3BhY2tzLCAmbCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFja19saXN0ICogYWRkX3BhY2tfZmlsZShjaGFyICpmaWxlbmFtZSkKK3sKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcCA9IHBhY2tlZF9naXQ7CisKKwlpZiAoc3RybGVuKGZpbGVuYW1lKSA8IDQwKQorCQlkaWUoIkJhZCBwYWNrIGZpbGVuYW1lOiAlc1xuIiwgZmlsZW5hbWUpOworCisJd2hpbGUgKHApIHsKKwkJaWYgKHN0cnN0cihwLT5wYWNrX25hbWUsIGZpbGVuYW1lKSkKKwkJCXJldHVybiBhZGRfcGFjayhwKTsKKwkJcCA9IHAtPm5leHQ7CisJfQorCWRpZSgiRmlsZW5hbWUgJXMgbm90IGZvdW5kIGluIHBhY2tlZF9naXRcbiIsIGZpbGVuYW1lKTsKK30KKworc3RhdGljIHZvaWQgbG9hZF9hbGwodm9pZCkKK3sKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcCA9IHBhY2tlZF9naXQ7CisKKwl3aGlsZSAocCkgeworCQlhZGRfcGFjayhwKTsKKwkJcCA9IHAtPm5leHQ7CisJfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisJc3RydWN0IHBhY2tfbGlzdCAqbWluLCAqcmVkLCAqcGw7CisJc3RydWN0IGxsaXN0ICppZ25vcmU7CisJdW5zaWduZWQgY2hhciAqc2hhMTsKKwljaGFyIGJ1Zls0Ml07IC8qIDQwIGJ5dGUgc2hhMSArIFxuICsgXDAgKi8KKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKwkJaWYoIXN0cmNtcChhcmcsICItLSIpKSB7CisJCQlpKys7CisJCQlicmVhazsKKwkJfQorCQlpZighc3RyY21wKGFyZywgIi0tYWxsIikpIHsKKwkJCWxvYWRfYWxsX3BhY2tzID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmKCFzdHJjbXAoYXJnLCAiLS12ZXJib3NlIikpIHsKKwkJCXZlcmJvc2UgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYoIXN0cmNtcChhcmcsICItLWFsdC1vZGIiKSkgeworCQkJYWx0X29kYiA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZigqYXJnID09ICctJykKKwkJCXVzYWdlKHBhY2tfcmVkdW5kYW50X3VzYWdlKTsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCisJcHJlcGFyZV9wYWNrZWRfZ2l0KCk7CisKKwlpZiAobG9hZF9hbGxfcGFja3MpCisJCWxvYWRfYWxsKCk7CisJZWxzZQorCQl3aGlsZSAoKihhcmd2ICsgaSkgIT0gTlVMTCkKKwkJCWFkZF9wYWNrX2ZpbGUoKihhcmd2ICsgaSsrKSk7CisKKwlpZiAobG9jYWxfcGFja3MgPT0gTlVMTCkKKwkJZGllKCJaZXJvIHBhY2tzIGZvdW5kIVxuIik7CisKKwlsb2FkX2FsbF9vYmplY3RzKCk7CisKKwljbXBfbG9jYWxfcGFja3MoKTsKKwlpZiAoYWx0X29kYikKKwkJc2Nhbl9hbHRfb2RiX3BhY2tzKCk7CisKKwkvKiBpZ25vcmUgb2JqZWN0cyBnaXZlbiBvbiBzdGRpbiAqLworCWxsaXN0X2luaXQoJmlnbm9yZSk7CisJaWYgKCFpc2F0dHkoMCkpIHsKKwkJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHN0ZGluKSkgeworCQkJc2hhMSA9IHhtYWxsb2MoMjApOworCQkJaWYgKGdldF9zaGExX2hleChidWYsIHNoYTEpKQorCQkJCWRpZSgiQmFkIHNoYTEgb24gc3RkaW46ICVzIiwgYnVmKTsKKwkJCWxsaXN0X2luc2VydF9zb3J0ZWRfdW5pcXVlKGlnbm9yZSwgc2hhMSwgTlVMTCk7CisJCX0KKwl9CisJbGxpc3Rfc29ydGVkX2RpZmZlcmVuY2VfaW5wbGFjZShhbGxfb2JqZWN0cywgaWdub3JlKTsKKwlwbCA9IGxvY2FsX3BhY2tzOworCXdoaWxlIChwbCkgeworCQlsbGlzdF9zb3J0ZWRfZGlmZmVyZW5jZV9pbnBsYWNlKHBsLT51bmlxdWVfb2JqZWN0cywgaWdub3JlKTsKKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisKKwltaW5pbWl6ZSgmbWluKTsKKworCWlmICh2ZXJib3NlKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVGhlcmUgYXJlICVsdSBwYWNrcyBhdmFpbGFibGUgaW4gYWx0LW9kYnMuXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpcGFja19saXN0X3NpemUoYWx0b2RiX3BhY2tzKSk7CisJCWZwcmludGYoc3RkZXJyLCAiVGhlIHNtYWxsZXN0IChieXRld2lzZSkgc2V0IG9mIHBhY2tzIGlzOlxuIik7CisJCXBsID0gbWluOworCQl3aGlsZSAocGwpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiXHQlc1xuIiwgcGwtPnBhY2stPnBhY2tfbmFtZSk7CisJCQlwbCA9IHBsLT5uZXh0OworCQl9CisJCWZwcmludGYoc3RkZXJyLCAiY29udGFpbmluZyAlbHUgZHVwbGljYXRlIG9iamVjdHMgIgorCQkJCSJ3aXRoIGEgdG90YWwgc2l6ZSBvZiAlbHVrYi5cbiIsCisJCQkodW5zaWduZWQgbG9uZylnZXRfcGFja19yZWR1bmRhbmN5KG1pbiksCisJCQkodW5zaWduZWQgbG9uZylwYWNrX3NldF9ieXRlY291bnQobWluKS8xMDI0KTsKKwkJZnByaW50ZihzdGRlcnIsICJBIHRvdGFsIG9mICVsdSB1bmlxdWUgb2JqZWN0cyB3ZXJlIGNvbnNpZGVyZWQuXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpYWxsX29iamVjdHMtPnNpemUpOworCQlmcHJpbnRmKHN0ZGVyciwgIlJlZHVuZGFudCBwYWNrcyAod2l0aCBpbmRleGVzKTpcbiIpOworCX0KKwlwbCA9IHJlZCA9IHBhY2tfbGlzdF9kaWZmZXJlbmNlKGxvY2FsX3BhY2tzLCBtaW4pOworCXdoaWxlIChwbCkgeworCQlwcmludGYoIiVzXG4lc1xuIiwKKwkJICAgICAgIHNoYTFfcGFja19pbmRleF9uYW1lKHBsLT5wYWNrLT5zaGExKSwKKwkJICAgICAgIHBsLT5wYWNrLT5wYWNrX25hbWUpOworCQlwbCA9IHBsLT5uZXh0OworCX0KKwlpZiAodmVyYm9zZSkKKwkJZnByaW50ZihzdGRlcnIsICIlbHVNQiBvZiByZWR1bmRhbnQgcGFja3MgaW4gdG90YWwuXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpcGFja19zZXRfYnl0ZWNvdW50KHJlZCkvKDEwMjQqMTAyNCkpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9wYWNrLXJldmluZGV4LmMgYi9wYWNrLXJldmluZGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThhYTJjZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2stcmV2aW5kZXguYwpAQCAtMCwwICsxLDE0MiBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicGFjay1yZXZpbmRleC5oIgorCisvKgorICogUGFjayBpbmRleCBmb3IgZXhpc3RpbmcgcGFja3MgZ2l2ZSB1cyBlYXN5IGFjY2VzcyB0byB0aGUgb2Zmc2V0cyBpbnRvCisgKiBjb3JyZXNwb25kaW5nIHBhY2sgZmlsZSB3aGVyZSBlYWNoIG9iamVjdCdzIGRhdGEgc3RhcnRzLCBidXQgdGhlIGVudHJpZXMKKyAqIGRvIG5vdCBzdG9yZSB0aGUgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCByZXByZXNlbnRhdGlvbiAodW5jb21wcmVzc2VkCisgKiBzaXplIGlzIGVhc2lseSBhdmFpbGFibGUgYnkgZXhhbWluaW5nIHRoZSBwYWNrIGVudHJ5IGhlYWRlcikuICBJdCBpcworICogYWxzbyByYXRoZXIgZXhwZW5zaXZlIHRvIGZpbmQgdGhlIHNoYTEgZm9yIGFuIG9iamVjdCBnaXZlbiBpdHMgb2Zmc2V0LgorICoKKyAqIFdlIGJ1aWxkIGEgaGFzaHRhYmxlIG9mIGV4aXN0aW5nIHBhY2tzIChwYWNrX3JldmluZGV4KSwgYW5kIGtlZXAgcmV2ZXJzZQorICogaW5kZXggaGVyZSAtLSBwYWNrIGluZGV4IGZpbGUgaXMgc29ydGVkIGJ5IG9iamVjdCBuYW1lIG1hcHBpbmcgdG8gb2Zmc2V0OworICogdGhpcyBwYWNrX3JldmluZGV4W10ucmV2aW5kZXggYXJyYXkgaXMgYSBsaXN0IG9mIG9mZnNldC9pbmRleF9uciBwYWlycworICogb3JkZXJlZCBieSBvZmZzZXQsIHNvIGlmIHlvdSBrbm93IHRoZSBvZmZzZXQgb2YgYW4gb2JqZWN0LCBuZXh0IG9mZnNldAorICogaXMgd2hlcmUgaXRzIHBhY2tlZCByZXByZXNlbnRhdGlvbiBlbmRzIGFuZCB0aGUgaW5kZXhfbnIgY2FuIGJlIHVzZWQgdG8KKyAqIGdldCB0aGUgb2JqZWN0IHNoYTEgZnJvbSB0aGUgbWFpbiBpbmRleC4KKyAqLworCitzdHJ1Y3QgcGFja19yZXZpbmRleCB7CisJc3RydWN0IHBhY2tlZF9naXQgKnA7CisJc3RydWN0IHJldmluZGV4X2VudHJ5ICpyZXZpbmRleDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGFja19yZXZpbmRleCAqcGFja19yZXZpbmRleDsKK3N0YXRpYyBpbnQgcGFja19yZXZpbmRleF9oYXNoc3o7CisKK3N0YXRpYyBpbnQgcGFja19yZXZpbmRleF9peChzdHJ1Y3QgcGFja2VkX2dpdCAqcCkKK3sKKwl1bnNpZ25lZCBsb25nIHVpID0gKHVuc2lnbmVkIGxvbmcpcDsKKwlpbnQgaTsKKworCXVpID0gdWkgXiAodWkgPj4gMTYpOyAvKiBkZWZlYXQgc3RydWN0dXJlIGFsaWdubWVudCAqLworCWkgPSAoaW50KSh1aSAlIHBhY2tfcmV2aW5kZXhfaGFzaHN6KTsKKwl3aGlsZSAocGFja19yZXZpbmRleFtpXS5wKSB7CisJCWlmIChwYWNrX3JldmluZGV4W2ldLnAgPT0gcCkKKwkJCXJldHVybiBpOworCQlpZiAoKytpID09IHBhY2tfcmV2aW5kZXhfaGFzaHN6KQorCQkJaSA9IDA7CisJfQorCXJldHVybiAtMSAtIGk7Cit9CisKK3ZvaWQgaW5pdF9wYWNrX3JldmluZGV4KHZvaWQpCit7CisJaW50IG51bTsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcDsKKworCWZvciAobnVtID0gMCwgcCA9IHBhY2tlZF9naXQ7IHA7IHAgPSBwLT5uZXh0KQorCQludW0rKzsKKwlpZiAoIW51bSkKKwkJcmV0dXJuOworCXBhY2tfcmV2aW5kZXhfaGFzaHN6ID0gbnVtICogMTE7CisJcGFja19yZXZpbmRleCA9IHhjYWxsb2Moc2l6ZW9mKCpwYWNrX3JldmluZGV4KSwgcGFja19yZXZpbmRleF9oYXNoc3opOworCWZvciAocCA9IHBhY2tlZF9naXQ7IHA7IHAgPSBwLT5uZXh0KSB7CisJCW51bSA9IHBhY2tfcmV2aW5kZXhfaXgocCk7CisJCW51bSA9IC0gMSAtIG51bTsKKwkJcGFja19yZXZpbmRleFtudW1dLnAgPSBwOworCX0KKwkvKiByZXZpbmRleCBlbGVtZW50cyBhcmUgbGF6aWx5IGluaXRpYWxpemVkICovCit9CisKK3N0YXRpYyBpbnQgY21wX29mZnNldChjb25zdCB2b2lkICphXywgY29uc3Qgdm9pZCAqYl8pCit7CisJY29uc3Qgc3RydWN0IHJldmluZGV4X2VudHJ5ICphID0gYV87CisJY29uc3Qgc3RydWN0IHJldmluZGV4X2VudHJ5ICpiID0gYl87CisJcmV0dXJuIChhLT5vZmZzZXQgPCBiLT5vZmZzZXQpID8gLTEgOiAoYS0+b2Zmc2V0ID4gYi0+b2Zmc2V0KSA/IDEgOiAwOworfQorCisvKgorICogT3JkZXJlZCBsaXN0IG9mIG9mZnNldHMgb2Ygb2JqZWN0cyBpbiB0aGUgcGFjay4KKyAqLworc3RhdGljIHZvaWQgY3JlYXRlX3BhY2tfcmV2aW5kZXgoc3RydWN0IHBhY2tfcmV2aW5kZXggKnJpeCkKK3sKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcCA9IHJpeC0+cDsKKwlpbnQgbnVtX2VudCA9IHAtPm51bV9vYmplY3RzOworCWludCBpOworCWNvbnN0IGNoYXIgKmluZGV4ID0gcC0+aW5kZXhfZGF0YTsKKworCXJpeC0+cmV2aW5kZXggPSB4bWFsbG9jKHNpemVvZigqcml4LT5yZXZpbmRleCkgKiAobnVtX2VudCArIDEpKTsKKwlpbmRleCArPSA0ICogMjU2OworCisJaWYgKHAtPmluZGV4X3ZlcnNpb24gPiAxKSB7CisJCWNvbnN0IHVpbnQzMl90ICpvZmZfMzIgPQorCQkJKHVpbnQzMl90ICopKGluZGV4ICsgOCArIHAtPm51bV9vYmplY3RzICogKDIwICsgNCkpOworCQljb25zdCB1aW50MzJfdCAqb2ZmXzY0ID0gb2ZmXzMyICsgcC0+bnVtX29iamVjdHM7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fZW50OyBpKyspIHsKKwkJCXVpbnQzMl90IG9mZiA9IG50b2hsKCpvZmZfMzIrKyk7CisJCQlpZiAoIShvZmYgJiAweDgwMDAwMDAwKSkgeworCQkJCXJpeC0+cmV2aW5kZXhbaV0ub2Zmc2V0ID0gb2ZmOworCQkJfSBlbHNlIHsKKwkJCQlyaXgtPnJldmluZGV4W2ldLm9mZnNldCA9CisJCQkJCSgodWludDY0X3QpbnRvaGwoKm9mZl82NCsrKSkgPDwgMzI7CisJCQkJcml4LT5yZXZpbmRleFtpXS5vZmZzZXQgfD0KKwkJCQkJbnRvaGwoKm9mZl82NCsrKTsKKwkJCX0KKwkJCXJpeC0+cmV2aW5kZXhbaV0ubnIgPSBpOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9lbnQ7IGkrKykgeworCQkJdWludDMyX3QgaGwgPSAqKCh1aW50MzJfdCAqKShpbmRleCArIDI0ICogaSkpOworCQkJcml4LT5yZXZpbmRleFtpXS5vZmZzZXQgPSBudG9obChobCk7CisJCQlyaXgtPnJldmluZGV4W2ldLm5yID0gaTsKKwkJfQorCX0KKworCS8qIFRoaXMga25vd3MgdGhlIHBhY2sgZm9ybWF0IC0tIHRoZSAyMC1ieXRlIHRyYWlsZXIKKwkgKiBmb2xsb3dzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBsYXN0IG9iamVjdCBkYXRhLgorCSAqLworCXJpeC0+cmV2aW5kZXhbbnVtX2VudF0ub2Zmc2V0ID0gcC0+cGFja19zaXplIC0gMjA7CisJcml4LT5yZXZpbmRleFtudW1fZW50XS5uciA9IC0xOworCXFzb3J0KHJpeC0+cmV2aW5kZXgsIG51bV9lbnQsIHNpemVvZigqcml4LT5yZXZpbmRleCksIGNtcF9vZmZzZXQpOworfQorCitzdHJ1Y3QgcmV2aW5kZXhfZW50cnkgKmZpbmRfcGFja19yZXZpbmRleChzdHJ1Y3QgcGFja2VkX2dpdCAqcCwgb2ZmX3Qgb2ZzKQoreworCWludCBudW07CisJaW50IGxvLCBoaTsKKwlzdHJ1Y3QgcGFja19yZXZpbmRleCAqcml4OworCXN0cnVjdCByZXZpbmRleF9lbnRyeSAqcmV2aW5kZXg7CisKKwludW0gPSBwYWNrX3JldmluZGV4X2l4KHApOworCWlmIChudW0gPCAwKQorCQlkaWUoImludGVybmFsIGVycm9yOiBwYWNrIHJldmluZGV4IHVuaW5pdGlhbGl6ZWQiKTsKKworCXJpeCA9ICZwYWNrX3JldmluZGV4W251bV07CisJaWYgKCFyaXgtPnJldmluZGV4KQorCQljcmVhdGVfcGFja19yZXZpbmRleChyaXgpOworCXJldmluZGV4ID0gcml4LT5yZXZpbmRleDsKKworCWxvID0gMDsKKwloaSA9IHAtPm51bV9vYmplY3RzICsgMTsKKwlkbyB7CisJCWludCBtaSA9IChsbyArIGhpKSAvIDI7CisJCWlmIChyZXZpbmRleFttaV0ub2Zmc2V0ID09IG9mcykgeworCQkJcmV0dXJuIHJldmluZGV4ICsgbWk7CisJCX0gZWxzZSBpZiAob2ZzIDwgcmV2aW5kZXhbbWldLm9mZnNldCkKKwkJCWhpID0gbWk7CisJCWVsc2UKKwkJCWxvID0gbWkgKyAxOworCX0gd2hpbGUgKGxvIDwgaGkpOworCWRpZSgiaW50ZXJuYWwgZXJyb3I6IHBhY2sgcmV2aW5kZXggY29ycnVwdCIpOworfQpkaWZmIC0tZ2l0IGEvcGFjay1yZXZpbmRleC5oIGIvcGFjay1yZXZpbmRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNTI3YTcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrLXJldmluZGV4LmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBQQUNLX1JFVklOREVYX0gKKyNkZWZpbmUgUEFDS19SRVZJTkRFWF9ICisKK3N0cnVjdCByZXZpbmRleF9lbnRyeSB7CisJb2ZmX3Qgb2Zmc2V0OworCXVuc2lnbmVkIGludCBucjsKK307CisKK3ZvaWQgaW5pdF9wYWNrX3JldmluZGV4KHZvaWQpOworc3RydWN0IHJldmluZGV4X2VudHJ5ICpmaW5kX3BhY2tfcmV2aW5kZXgoc3RydWN0IHBhY2tlZF9naXQgKnAsIG9mZl90IG9mcyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcGFjay13cml0ZS5jIGIvcGFjay13cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NWUyYjIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrLXdyaXRlLmMKQEAgLTAsMCArMSwyMDggQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInBhY2suaCIKKyNpbmNsdWRlICJjc3VtLWZpbGUuaCIKKwordWludDMyX3QgcGFja19pZHhfZGVmYXVsdF92ZXJzaW9uID0gMTsKK3VpbnQzMl90IHBhY2tfaWR4X29mZjMyX2xpbWl0ID0gMHg3ZmZmZmZmZjsKKworc3RhdGljIGludCBzaGExX2NvbXBhcmUoY29uc3Qgdm9pZCAqX2EsIGNvbnN0IHZvaWQgKl9iKQoreworCXN0cnVjdCBwYWNrX2lkeF9lbnRyeSAqYSA9ICooc3RydWN0IHBhY2tfaWR4X2VudHJ5ICoqKV9hOworCXN0cnVjdCBwYWNrX2lkeF9lbnRyeSAqYiA9ICooc3RydWN0IHBhY2tfaWR4X2VudHJ5ICoqKV9iOworCXJldHVybiBoYXNoY21wKGEtPnNoYTEsIGItPnNoYTEpOworfQorCisvKgorICogT24gZW50cnkgKnNoYTEgY29udGFpbnMgdGhlIHBhY2sgY29udGVudCBTSEExIGhhc2gsIG9uIGV4aXQgaXQgaXMKKyAqIHRoZSBTSEExIGhhc2ggb2Ygc29ydGVkIG9iamVjdCBuYW1lcy4gVGhlIG9iamVjdHMgYXJyYXkgcGFzc2VkIGluCisgKiB3aWxsIGJlIHNvcnRlZCBieSBTSEExIG9uIGV4aXQuCisgKi8KK2NoYXIgKndyaXRlX2lkeF9maWxlKGNoYXIgKmluZGV4X25hbWUsIHN0cnVjdCBwYWNrX2lkeF9lbnRyeSAqKm9iamVjdHMsCisJCSAgICAgaW50IG5yX29iamVjdHMsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHNoYTFmaWxlICpmOworCXN0cnVjdCBwYWNrX2lkeF9lbnRyeSAqKnNvcnRlZF9ieV9zaGEsICoqbGlzdCwgKipsYXN0OworCW9mZl90IGxhc3Rfb2JqX29mZnNldCA9IDA7CisJdWludDMyX3QgYXJyYXlbMjU2XTsKKwlpbnQgaSwgZmQ7CisJU0hBX0NUWCBjdHg7CisJdWludDMyX3QgaW5kZXhfdmVyc2lvbjsKKworCWlmIChucl9vYmplY3RzKSB7CisJCXNvcnRlZF9ieV9zaGEgPSBvYmplY3RzOworCQlsaXN0ID0gc29ydGVkX2J5X3NoYTsKKwkJbGFzdCA9IHNvcnRlZF9ieV9zaGEgKyBucl9vYmplY3RzOworCQlmb3IgKGkgPSAwOyBpIDwgbnJfb2JqZWN0czsgKytpKSB7CisJCQlpZiAob2JqZWN0c1tpXS0+b2Zmc2V0ID4gbGFzdF9vYmpfb2Zmc2V0KQorCQkJCWxhc3Rfb2JqX29mZnNldCA9IG9iamVjdHNbaV0tPm9mZnNldDsKKwkJfQorCQlxc29ydChzb3J0ZWRfYnlfc2hhLCBucl9vYmplY3RzLCBzaXplb2Yoc29ydGVkX2J5X3NoYVswXSksCisJCSAgICAgIHNoYTFfY29tcGFyZSk7CisJfQorCWVsc2UKKwkJc29ydGVkX2J5X3NoYSA9IGxpc3QgPSBsYXN0ID0gTlVMTDsKKworCWlmICghaW5kZXhfbmFtZSkgeworCQlzdGF0aWMgY2hhciB0bXBmaWxlW1BBVEhfTUFYXTsKKwkJc25wcmludGYodG1wZmlsZSwgc2l6ZW9mKHRtcGZpbGUpLAorCQkJICIlcy90bXBfaWR4X1hYWFhYWCIsIGdldF9vYmplY3RfZGlyZWN0b3J5KCkpOworCQlmZCA9IHhta3N0ZW1wKHRtcGZpbGUpOworCQlpbmRleF9uYW1lID0geHN0cmR1cCh0bXBmaWxlKTsKKwl9IGVsc2UgeworCQl1bmxpbmsoaW5kZXhfbmFtZSk7CisJCWZkID0gb3BlbihpbmRleF9uYW1lLCBPX0NSRUFUfE9fRVhDTHxPX1dST05MWSwgMDYwMCk7CisJfQorCWlmIChmZCA8IDApCisJCWRpZSgidW5hYmxlIHRvIGNyZWF0ZSAlczogJXMiLCBpbmRleF9uYW1lLCBzdHJlcnJvcihlcnJubykpOworCWYgPSBzaGExZmQoZmQsIGluZGV4X25hbWUpOworCisJLyogaWYgbGFzdCBvYmplY3QncyBvZmZzZXQgaXMgPj0gMl4zMSB3ZSBzaG91bGQgdXNlIGluZGV4IFYyICovCisJaW5kZXhfdmVyc2lvbiA9IChsYXN0X29ial9vZmZzZXQgPj4gMzEpID8gMiA6IHBhY2tfaWR4X2RlZmF1bHRfdmVyc2lvbjsKKworCS8qIGluZGV4IHZlcnNpb25zIDIgYW5kIGFib3ZlIG5lZWQgYSBoZWFkZXIgKi8KKwlpZiAoaW5kZXhfdmVyc2lvbiA+PSAyKSB7CisJCXN0cnVjdCBwYWNrX2lkeF9oZWFkZXIgaGRyOworCQloZHIuaWR4X3NpZ25hdHVyZSA9IGh0b25sKFBBQ0tfSURYX1NJR05BVFVSRSk7CisJCWhkci5pZHhfdmVyc2lvbiA9IGh0b25sKGluZGV4X3ZlcnNpb24pOworCQlzaGExd3JpdGUoZiwgJmhkciwgc2l6ZW9mKGhkcikpOworCX0KKworCS8qCisJICogV3JpdGUgdGhlIGZpcnN0LWxldmVsIHRhYmxlICh0aGUgbGlzdCBpcyBzb3J0ZWQsCisJICogYnV0IHdlIHVzZSBhIDI1Ni1lbnRyeSBsb29rdXAgdG8gYmUgYWJsZSB0byBhdm9pZAorCSAqIGhhdmluZyB0byBkbyBlaWdodCBleHRyYSBiaW5hcnkgc2VhcmNoIGl0ZXJhdGlvbnMpLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlzdHJ1Y3QgcGFja19pZHhfZW50cnkgKipuZXh0ID0gbGlzdDsKKwkJd2hpbGUgKG5leHQgPCBsYXN0KSB7CisJCQlzdHJ1Y3QgcGFja19pZHhfZW50cnkgKm9iaiA9ICpuZXh0OworCQkJaWYgKG9iai0+c2hhMVswXSAhPSBpKQorCQkJCWJyZWFrOworCQkJbmV4dCsrOworCQl9CisJCWFycmF5W2ldID0gaHRvbmwobmV4dCAtIHNvcnRlZF9ieV9zaGEpOworCQlsaXN0ID0gbmV4dDsKKwl9CisJc2hhMXdyaXRlKGYsIGFycmF5LCAyNTYgKiA0KTsKKworCS8qIGNvbXB1dGUgdGhlIFNIQTEgaGFzaCBvZiBzb3J0ZWQgb2JqZWN0IG5hbWVzLiAqLworCVNIQTFfSW5pdCgmY3R4KTsKKworCS8qCisJICogV3JpdGUgdGhlIGFjdHVhbCBTSEExIGVudHJpZXMuLgorCSAqLworCWxpc3QgPSBzb3J0ZWRfYnlfc2hhOworCWZvciAoaSA9IDA7IGkgPCBucl9vYmplY3RzOyBpKyspIHsKKwkJc3RydWN0IHBhY2tfaWR4X2VudHJ5ICpvYmogPSAqbGlzdCsrOworCQlpZiAoaW5kZXhfdmVyc2lvbiA8IDIpIHsKKwkJCXVpbnQzMl90IG9mZnNldCA9IGh0b25sKG9iai0+b2Zmc2V0KTsKKwkJCXNoYTF3cml0ZShmLCAmb2Zmc2V0LCA0KTsKKwkJfQorCQlzaGExd3JpdGUoZiwgb2JqLT5zaGExLCAyMCk7CisJCVNIQTFfVXBkYXRlKCZjdHgsIG9iai0+c2hhMSwgMjApOworCX0KKworCWlmIChpbmRleF92ZXJzaW9uID49IDIpIHsKKwkJdW5zaWduZWQgaW50IG5yX2xhcmdlX29mZnNldCA9IDA7CisKKwkJLyogd3JpdGUgdGhlIGNyYzMyIHRhYmxlICovCisJCWxpc3QgPSBzb3J0ZWRfYnlfc2hhOworCQlmb3IgKGkgPSAwOyBpIDwgbnJfb2JqZWN0czsgaSsrKSB7CisJCQlzdHJ1Y3QgcGFja19pZHhfZW50cnkgKm9iaiA9ICpsaXN0Kys7CisJCQl1aW50MzJfdCBjcmMzMl92YWwgPSBodG9ubChvYmotPmNyYzMyKTsKKwkJCXNoYTF3cml0ZShmLCAmY3JjMzJfdmFsLCA0KTsKKwkJfQorCisJCS8qIHdyaXRlIHRoZSAzMi1iaXQgb2Zmc2V0IHRhYmxlICovCisJCWxpc3QgPSBzb3J0ZWRfYnlfc2hhOworCQlmb3IgKGkgPSAwOyBpIDwgbnJfb2JqZWN0czsgaSsrKSB7CisJCQlzdHJ1Y3QgcGFja19pZHhfZW50cnkgKm9iaiA9ICpsaXN0Kys7CisJCQl1aW50MzJfdCBvZmZzZXQgPSAob2JqLT5vZmZzZXQgPD0gcGFja19pZHhfb2ZmMzJfbGltaXQpID8KKwkJCQlvYmotPm9mZnNldCA6ICgweDgwMDAwMDAwIHwgbnJfbGFyZ2Vfb2Zmc2V0KyspOworCQkJb2Zmc2V0ID0gaHRvbmwob2Zmc2V0KTsKKwkJCXNoYTF3cml0ZShmLCAmb2Zmc2V0LCA0KTsKKwkJfQorCisJCS8qIHdyaXRlIHRoZSBsYXJnZSBvZmZzZXQgdGFibGUgKi8KKwkJbGlzdCA9IHNvcnRlZF9ieV9zaGE7CisJCXdoaWxlIChucl9sYXJnZV9vZmZzZXQpIHsKKwkJCXN0cnVjdCBwYWNrX2lkeF9lbnRyeSAqb2JqID0gKmxpc3QrKzsKKwkJCXVpbnQ2NF90IG9mZnNldCA9IG9iai0+b2Zmc2V0OworCQkJaWYgKG9mZnNldCA+IHBhY2tfaWR4X29mZjMyX2xpbWl0KSB7CisJCQkJdWludDMyX3Qgc3BsaXRbMl07CisJCQkJc3BsaXRbMF0gPSBodG9ubChvZmZzZXQgPj4gMzIpOworCQkJCXNwbGl0WzFdID0gaHRvbmwob2Zmc2V0ICYgMHhmZmZmZmZmZik7CisJCQkJc2hhMXdyaXRlKGYsIHNwbGl0LCA4KTsKKwkJCQlucl9sYXJnZV9vZmZzZXQtLTsKKwkJCX0KKwkJfQorCX0KKworCXNoYTF3cml0ZShmLCBzaGExLCAyMCk7CisJc2hhMWNsb3NlKGYsIE5VTEwsIDEpOworCVNIQTFfRmluYWwoc2hhMSwgJmN0eCk7CisJcmV0dXJuIGluZGV4X25hbWU7Cit9CisKK3ZvaWQgZml4dXBfcGFja19oZWFkZXJfZm9vdGVyKGludCBwYWNrX2ZkLAorCQkJIHVuc2lnbmVkIGNoYXIgKnBhY2tfZmlsZV9zaGExLAorCQkJIGNvbnN0IGNoYXIgKnBhY2tfbmFtZSwKKwkJCSB1aW50MzJfdCBvYmplY3RfY291bnQpCit7CisJc3RhdGljIGNvbnN0IGludCBidWZfc3ogPSAxMjggKiAxMDI0OworCVNIQV9DVFggYzsKKwlzdHJ1Y3QgcGFja19oZWFkZXIgaGRyOworCWNoYXIgKmJ1ZjsKKworCWlmIChsc2VlayhwYWNrX2ZkLCAwLCBTRUVLX1NFVCkgIT0gMCkKKwkJZGllKCJGYWlsZWQgc2Vla2luZyB0byBzdGFydDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCWlmIChyZWFkX2luX2Z1bGwocGFja19mZCwgJmhkciwgc2l6ZW9mKGhkcikpICE9IHNpemVvZihoZHIpKQorCQlkaWUoIlVuYWJsZSB0byByZXJlYWQgaGVhZGVyIG9mICVzOiAlcyIsIHBhY2tfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwlpZiAobHNlZWsocGFja19mZCwgMCwgU0VFS19TRVQpICE9IDApCisJCWRpZSgiRmFpbGVkIHNlZWtpbmcgdG8gc3RhcnQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwloZHIuaGRyX2VudHJpZXMgPSBodG9ubChvYmplY3RfY291bnQpOworCXdyaXRlX29yX2RpZShwYWNrX2ZkLCAmaGRyLCBzaXplb2YoaGRyKSk7CisKKwlTSEExX0luaXQoJmMpOworCVNIQTFfVXBkYXRlKCZjLCAmaGRyLCBzaXplb2YoaGRyKSk7CisKKwlidWYgPSB4bWFsbG9jKGJ1Zl9zeik7CisJZm9yICg7OykgeworCQlzc2l6ZV90IG4gPSB4cmVhZChwYWNrX2ZkLCBidWYsIGJ1Zl9zeik7CisJCWlmICghbikKKwkJCWJyZWFrOworCQlpZiAobiA8IDApCisJCQlkaWUoIkZhaWxlZCB0byBjaGVja3N1bSAlczogJXMiLCBwYWNrX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCVNIQTFfVXBkYXRlKCZjLCBidWYsIG4pOworCX0KKwlmcmVlKGJ1Zik7CisKKwlTSEExX0ZpbmFsKHBhY2tfZmlsZV9zaGExLCAmYyk7CisJd3JpdGVfb3JfZGllKHBhY2tfZmQsIHBhY2tfZmlsZV9zaGExLCAyMCk7Cit9CisKK2NoYXIgKmluZGV4X3BhY2tfbG9ja2ZpbGUoaW50IGlwX291dCkKK3sKKwlpbnQgbGVuLCBzOworCWNoYXIgcGFja25hbWVbNDZdOworCisJLyoKKwkgKiBUaGUgZmlyc3QgdGhpbmcgd2UgZXhwZWN0cyBmcm9tIGluZGV4LXBhY2sncyBvdXRwdXQKKwkgKiBpcyAicGFja1x0JTQwc1xuIiBvciAia2VlcFx0JTQwc1xuIiAoNDYgYnl0ZXMpIHdoZXJlCisJICogJTQwcyBpcyB0aGUgbmV3bHkgY3JlYXRlZCBwYWNrIFNIQTEgbmFtZS4gIEluIHRoZSAia2VlcCIKKwkgKiBjYXNlLCB3ZSBuZWVkIGl0IHRvIHJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyAua2VlcCBmaWxlCisJICogbGF0ZXIgb24uICBJZiB3ZSBkb24ndCBnZXQgdGhhdCB0aGVuIHRvdWdoIGx1Y2sgd2l0aCBpdC4KKwkgKi8KKwlmb3IgKGxlbiA9IDA7CisJCSBsZW4gPCA0NiAmJiAocyA9IHhyZWFkKGlwX291dCwgcGFja25hbWUrbGVuLCA0Ni1sZW4pKSA+IDA7CisJCSBsZW4gKz0gcyk7CisJaWYgKGxlbiA9PSA0NiAmJiBwYWNrbmFtZVs0NV0gPT0gJ1xuJyAmJgorCQltZW1jbXAocGFja25hbWUsICJrZWVwXHQiLCA1KSA9PSAwKSB7CisJCWNoYXIgcGF0aFtQQVRIX01BWF07CisJCXBhY2tuYW1lWzQ1XSA9IDA7CisJCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIiVzL3BhY2svcGFjay0lcy5rZWVwIiwKKwkJCSBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpLCBwYWNrbmFtZSArIDUpOworCQlyZXR1cm4geHN0cmR1cChwYXRoKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9wYWNrLmggYi9wYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxYjM3NgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2suaApAQCAtMCwwICsxLDY4IEBACisjaWZuZGVmIFBBQ0tfSAorI2RlZmluZSBQQUNLX0gKKworI2luY2x1ZGUgIm9iamVjdC5oIgorCisvKgorICogUGFja2VkIG9iamVjdCBoZWFkZXIKKyAqLworI2RlZmluZSBQQUNLX1NJR05BVFVSRSAweDUwNDE0MzRiCS8qICJQQUNLIiAqLworI2RlZmluZSBQQUNLX1ZFUlNJT04gMgorI2RlZmluZSBwYWNrX3ZlcnNpb25fb2sodikgKCh2KSA9PSBodG9ubCgyKSB8fCAodikgPT0gaHRvbmwoMykpCitzdHJ1Y3QgcGFja19oZWFkZXIgeworCXVpbnQzMl90IGhkcl9zaWduYXR1cmU7CisJdWludDMyX3QgaGRyX3ZlcnNpb247CisJdWludDMyX3QgaGRyX2VudHJpZXM7Cit9OworCisvKgorICogVGhlIGZpcnN0IGZvdXIgYnl0ZXMgb2YgaW5kZXggZm9ybWF0cyBsYXRlciB0aGFuIHZlcnNpb24gMSBzaG91bGQKKyAqIHN0YXJ0IHdpdGggdGhpcyBzaWduYXR1cmUsIGFzIGFsbCBvbGRlciBnaXQgYmluYXJpZXMgd291bGQgZmluZCB0aGlzCisgKiB2YWx1ZSBpbGxlZ2FsIGFuZCBhYm9ydCByZWFkaW5nIHRoZSBmaWxlLgorICoKKyAqIFRoaXMgaXMgdGhlIGNhc2UgYmVjYXVzZSB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4gYSBwYWNrZmlsZQorICogY2Fubm90IGV4Y2VlZCAxLDQzMSw2NjAsMDAwIGFzIGV2ZXJ5IG9iamVjdCB3b3VsZCBuZWVkIGF0IGxlYXN0CisgKiAzIGJ5dGVzIG9mIGRhdGEgYW5kIHRoZSBvdmVyYWxsIHBhY2tmaWxlIGNhbm5vdCBleGNlZWQgNCBHaUIgd2l0aAorICogdmVyc2lvbiAxIG9mIHRoZSBpbmRleCBmaWxlIGR1ZSB0byB0aGUgb2Zmc2V0cyBsaW1pdGVkIHRvIDMyIGJpdHMuCisgKiBDbGVhcmx5IHRoZSBzaWduYXR1cmUgZXhjZWVkcyB0aGlzIG1heGltdW0uCisgKgorICogVmVyeSBvbGQgZ2l0IGJpbmFyaWVzIHdpbGwgYWxzbyBjb21wYXJlIHRoZSBmaXJzdCA0IGJ5dGVzIHRvIHRoZQorICogbmV4dCA0IGJ5dGVzIGluIHRoZSBpbmRleCBhbmQgYWJvcnQgd2l0aCBhICJub24tbW9ub3RvbmljIGluZGV4IgorICogZXJyb3IgaWYgdGhlIHNlY29uZCA0IGJ5dGUgd29yZCBpcyBzbWFsbGVyIHRoYW4gdGhlIGZpcnN0IDQKKyAqIGJ5dGUgd29yZC4gIFRoaXMgd291bGQgYmUgdHJ1ZSBpbiB0aGUgcHJvcG9zZWQgZnV0dXJlIGluZGV4CisgKiBmb3JtYXQgYXMgaWR4X3NpZ25hdHVyZSB3b3VsZCBiZSBncmVhdGVyIHRoYW4gaWR4X3ZlcnNpb24uCisgKi8KKyNkZWZpbmUgUEFDS19JRFhfU0lHTkFUVVJFIDB4ZmY3NDRmNjMJLyogIlwzNzd0T2MiICovCisKKy8qIFRoZXNlIG1heSBiZSBvdmVycmlkZGVuIGJ5IGNvbW1hbmQtbGluZSBwYXJhbWV0ZXJzICovCitleHRlcm4gdWludDMyX3QgcGFja19pZHhfZGVmYXVsdF92ZXJzaW9uOworZXh0ZXJuIHVpbnQzMl90IHBhY2tfaWR4X29mZjMyX2xpbWl0OworCisvKgorICogUGFja2VkIG9iamVjdCBpbmRleCBoZWFkZXIKKyAqLworc3RydWN0IHBhY2tfaWR4X2hlYWRlciB7CisJdWludDMyX3QgaWR4X3NpZ25hdHVyZTsKKwl1aW50MzJfdCBpZHhfdmVyc2lvbjsKK307CisKKy8qCisgKiBDb21tb24gcGFydCBvZiBvYmplY3Qgc3RydWN0dXJlIHVzZWQgZm9yIHdyaXRlX2lkeF9maWxlCisgKi8KK3N0cnVjdCBwYWNrX2lkeF9lbnRyeSB7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwl1aW50MzJfdCBjcmMzMjsKKwlvZmZfdCBvZmZzZXQ7Cit9OworCitleHRlcm4gY2hhciAqd3JpdGVfaWR4X2ZpbGUoY2hhciAqaW5kZXhfbmFtZSwgc3RydWN0IHBhY2tfaWR4X2VudHJ5ICoqb2JqZWN0cywgaW50IG5yX29iamVjdHMsIHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCitleHRlcm4gaW50IHZlcmlmeV9wYWNrKHN0cnVjdCBwYWNrZWRfZ2l0ICosIGludCk7CitleHRlcm4gdm9pZCBmaXh1cF9wYWNrX2hlYWRlcl9mb290ZXIoaW50LCB1bnNpZ25lZCBjaGFyICosIGNvbnN0IGNoYXIgKiwgdWludDMyX3QpOworZXh0ZXJuIGNoYXIgKmluZGV4X3BhY2tfbG9ja2ZpbGUoaW50IGZkKTsKKworI2RlZmluZSBQSF9FUlJPUl9FT0YJCSgtMSkKKyNkZWZpbmUgUEhfRVJST1JfUEFDS19TSUdOQVRVUkUJKC0yKQorI2RlZmluZSBQSF9FUlJPUl9QUk9UT0NPTAkoLTMpCitleHRlcm4gaW50IHJlYWRfcGFja19oZWFkZXIoaW50IGZkLCBzdHJ1Y3QgcGFja19oZWFkZXIgKik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3BhZ2VyLmMgYi9wYWdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMDAyZjkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWdlci5jCkBAIC0wLDAgKzEsODYgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorCisvKgorICogVGhpcyBpcyBzcGxpdCB1cCBmcm9tIHRoZSByZXN0IG9mIGdpdCBzbyB0aGF0IHdlIG1pZ2h0IGRvCisgKiBzb21ldGhpbmcgZGlmZmVyZW50IG9uIFdpbmRvd3MsIGZvciBleGFtcGxlLgorICovCisKK3N0YXRpYyBpbnQgc3Bhd25lZF9wYWdlcjsKKworc3RhdGljIHZvaWQgcnVuX3BhZ2VyKGNvbnN0IGNoYXIgKnBhZ2VyKQoreworCS8qCisJICogV29yayBhcm91bmQgYnVnIGluICJsZXNzIiBieSBub3Qgc3RhcnRpbmcgaXQgdW50aWwgd2UKKwkgKiBoYXZlIHJlYWwgaW5wdXQKKwkgKi8KKwlmZF9zZXQgaW47CisKKwlGRF9aRVJPKCZpbik7CisJRkRfU0VUKDAsICZpbik7CisJc2VsZWN0KDEsICZpbiwgTlVMTCwgJmluLCBOVUxMKTsKKworCWV4ZWNscChwYWdlciwgcGFnZXIsIE5VTEwpOworCWV4ZWNsKCIvYmluL3NoIiwgInNoIiwgIi1jIiwgcGFnZXIsIE5VTEwpOworfQorCit2b2lkIHNldHVwX3BhZ2VyKHZvaWQpCit7CisJcGlkX3QgcGlkOworCWludCBmZFsyXTsKKwljb25zdCBjaGFyICpwYWdlciA9IGdldGVudigiR0lUX1BBR0VSIik7CisKKwlpZiAoIWlzYXR0eSgxKSkKKwkJcmV0dXJuOworCWlmICghcGFnZXIpIHsKKwkJaWYgKCFwYWdlcl9wcm9ncmFtKQorCQkJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCQlwYWdlciA9IHBhZ2VyX3Byb2dyYW07CisJfQorCWlmICghcGFnZXIpCisJCXBhZ2VyID0gZ2V0ZW52KCJQQUdFUiIpOworCWlmICghcGFnZXIpCisJCXBhZ2VyID0gImxlc3MiOworCWVsc2UgaWYgKCEqcGFnZXIgfHwgIXN0cmNtcChwYWdlciwgImNhdCIpKQorCQlyZXR1cm47CisKKwlzcGF3bmVkX3BhZ2VyID0gMTsgLyogbWVhbnMgd2UgYXJlIGVtaXR0aW5nIHRvIHRlcm1pbmFsICovCisKKwlpZiAocGlwZShmZCkgPCAwKQorCQlyZXR1cm47CisJcGlkID0gZm9yaygpOworCWlmIChwaWQgPCAwKSB7CisJCWNsb3NlKGZkWzBdKTsKKwkJY2xvc2UoZmRbMV0pOworCQlyZXR1cm47CisJfQorCisJLyogcmV0dXJuIGluIHRoZSBjaGlsZCAqLworCWlmICghcGlkKSB7CisJCWR1cDIoZmRbMV0sIDEpOworCQlkdXAyKGZkWzFdLCAyKTsKKwkJY2xvc2UoZmRbMF0pOworCQljbG9zZShmZFsxXSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBUaGUgb3JpZ2luYWwgcHJvY2VzcyB0dXJucyBpbnRvIHRoZSBQQUdFUiAqLworCWR1cDIoZmRbMF0sIDApOworCWNsb3NlKGZkWzBdKTsKKwljbG9zZShmZFsxXSk7CisKKwlzZXRlbnYoIkxFU1MiLCAiRlJTWCIsIDApOworCXJ1bl9wYWdlcihwYWdlcik7CisJZGllKCJ1bmFibGUgdG8gZXhlY3V0ZSBwYWdlciAnJXMnIiwgcGFnZXIpOworCWV4aXQoMjU1KTsKK30KKworaW50IHBhZ2VyX2luX3VzZSh2b2lkKQoreworCWNvbnN0IGNoYXIgKmVudjsKKworCWlmIChzcGF3bmVkX3BhZ2VyKQorCQlyZXR1cm4gMTsKKworCWVudiA9IGdldGVudigiR0lUX1BBR0VSX0lOX1VTRSIpOworCXJldHVybiBlbnYgPyBnaXRfY29uZmlnX2Jvb2woIkdJVF9QQUdFUl9JTl9VU0UiLCBlbnYpIDogMDsKK30KZGlmZiAtLWdpdCBhL3BhcnNlLW9wdGlvbnMuYyBiL3BhcnNlLW9wdGlvbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODdjYWZiCi0tLSAvZGV2L251bGwKKysrIGIvcGFyc2Utb3B0aW9ucy5jCkBAIC0wLDAgKzEsNDE4IEBACisjaW5jbHVkZSAiZ2l0LWNvbXBhdC11dGlsLmgiCisjaW5jbHVkZSAicGFyc2Utb3B0aW9ucy5oIgorCisjZGVmaW5lIE9QVF9TSE9SVCAxCisjZGVmaW5lIE9QVF9VTlNFVCAyCisKK3N0cnVjdCBvcHRwYXJzZV90IHsKKwljb25zdCBjaGFyICoqYXJndjsKKwljb25zdCBjaGFyICoqb3V0OworCWludCBhcmdjLCBjcGlkeDsKKwljb25zdCBjaGFyICpvcHQ7Cit9OworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmdldF9hcmcoc3RydWN0IG9wdHBhcnNlX3QgKnApCit7CisJaWYgKHAtPm9wdCkgeworCQljb25zdCBjaGFyICpyZXMgPSBwLT5vcHQ7CisJCXAtPm9wdCA9IE5VTEw7CisJCXJldHVybiByZXM7CisJfQorCXAtPmFyZ2MtLTsKKwlyZXR1cm4gKisrcC0+YXJndjsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpza2lwX3ByZWZpeChjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzaXplX3QgbGVuID0gc3RybGVuKHByZWZpeCk7CisJcmV0dXJuIHN0cm5jbXAoc3RyLCBwcmVmaXgsIGxlbikgPyBOVUxMIDogc3RyICsgbGVuOworfQorCitzdGF0aWMgaW50IG9wdGVycm9yKGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdCwgY29uc3QgY2hhciAqcmVhc29uLCBpbnQgZmxhZ3MpCit7CisJaWYgKGZsYWdzICYgT1BUX1NIT1JUKQorCQlyZXR1cm4gZXJyb3IoInN3aXRjaCBgJWMnICVzIiwgb3B0LT5zaG9ydF9uYW1lLCByZWFzb24pOworCWlmIChmbGFncyAmIE9QVF9VTlNFVCkKKwkJcmV0dXJuIGVycm9yKCJvcHRpb24gYG5vLSVzJyAlcyIsIG9wdC0+bG9uZ19uYW1lLCByZWFzb24pOworCXJldHVybiBlcnJvcigib3B0aW9uIGAlcycgJXMiLCBvcHQtPmxvbmdfbmFtZSwgcmVhc29uKTsKK30KKworc3RhdGljIGludCBnZXRfdmFsdWUoc3RydWN0IG9wdHBhcnNlX3QgKnAsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHQsIGludCBmbGFncykKK3sKKwljb25zdCBjaGFyICpzLCAqYXJnOworCWNvbnN0IGludCB1bnNldCA9IGZsYWdzICYgT1BUX1VOU0VUOworCisJaWYgKHVuc2V0ICYmIHAtPm9wdCkKKwkJcmV0dXJuIG9wdGVycm9yKG9wdCwgInRha2VzIG5vIHZhbHVlIiwgZmxhZ3MpOworCWlmICh1bnNldCAmJiAob3B0LT5mbGFncyAmIFBBUlNFX09QVF9OT05FRykpCisJCXJldHVybiBvcHRlcnJvcihvcHQsICJpc24ndCBhdmFpbGFibGUiLCBmbGFncyk7CisKKwlpZiAoIShmbGFncyAmIE9QVF9TSE9SVCkgJiYgcC0+b3B0KSB7CisJCXN3aXRjaCAob3B0LT50eXBlKSB7CisJCWNhc2UgT1BUSU9OX0NBTExCQUNLOgorCQkJaWYgKCEob3B0LT5mbGFncyAmIFBBUlNFX09QVF9OT0FSRykpCisJCQkJYnJlYWs7CisJCQkvKiBGQUxMVEhST1VHSCAqLworCQljYXNlIE9QVElPTl9CT09MRUFOOgorCQljYXNlIE9QVElPTl9CSVQ6CisJCWNhc2UgT1BUSU9OX1NFVF9JTlQ6CisJCWNhc2UgT1BUSU9OX1NFVF9QVFI6CisJCQlyZXR1cm4gb3B0ZXJyb3Iob3B0LCAidGFrZXMgbm8gdmFsdWUiLCBmbGFncyk7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCWFyZyA9IHAtPm9wdCA/IHAtPm9wdCA6IChwLT5hcmdjID4gMSA/IHAtPmFyZ3ZbMV0gOiBOVUxMKTsKKwlzd2l0Y2ggKG9wdC0+dHlwZSkgeworCWNhc2UgT1BUSU9OX0JJVDoKKwkJaWYgKHVuc2V0KQorCQkJKihpbnQgKilvcHQtPnZhbHVlICY9IH5vcHQtPmRlZnZhbDsKKwkJZWxzZQorCQkJKihpbnQgKilvcHQtPnZhbHVlIHw9IG9wdC0+ZGVmdmFsOworCQlyZXR1cm4gMDsKKworCWNhc2UgT1BUSU9OX0JPT0xFQU46CisJCSooaW50ICopb3B0LT52YWx1ZSA9IHVuc2V0ID8gMCA6ICooaW50ICopb3B0LT52YWx1ZSArIDE7CisJCXJldHVybiAwOworCisJY2FzZSBPUFRJT05fU0VUX0lOVDoKKwkJKihpbnQgKilvcHQtPnZhbHVlID0gdW5zZXQgPyAwIDogb3B0LT5kZWZ2YWw7CisJCXJldHVybiAwOworCisJY2FzZSBPUFRJT05fU0VUX1BUUjoKKwkJKih2b2lkICoqKW9wdC0+dmFsdWUgPSB1bnNldCA/IE5VTEwgOiAodm9pZCAqKW9wdC0+ZGVmdmFsOworCQlyZXR1cm4gMDsKKworCWNhc2UgT1BUSU9OX1NUUklORzoKKwkJaWYgKHVuc2V0KSB7CisJCQkqKGNvbnN0IGNoYXIgKiopb3B0LT52YWx1ZSA9IE5VTEw7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAob3B0LT5mbGFncyAmIFBBUlNFX09QVF9PUFRBUkcgJiYgIXAtPm9wdCkgeworCQkJKihjb25zdCBjaGFyICoqKW9wdC0+dmFsdWUgPSAoY29uc3QgY2hhciAqKW9wdC0+ZGVmdmFsOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCFhcmcpCisJCQlyZXR1cm4gb3B0ZXJyb3Iob3B0LCAicmVxdWlyZXMgYSB2YWx1ZSIsIGZsYWdzKTsKKwkJKihjb25zdCBjaGFyICoqKW9wdC0+dmFsdWUgPSBnZXRfYXJnKHApOworCQlyZXR1cm4gMDsKKworCWNhc2UgT1BUSU9OX0NBTExCQUNLOgorCQlpZiAodW5zZXQpCisJCQlyZXR1cm4gKCpvcHQtPmNhbGxiYWNrKShvcHQsIE5VTEwsIDEpOworCQlpZiAob3B0LT5mbGFncyAmIFBBUlNFX09QVF9OT0FSRykKKwkJCXJldHVybiAoKm9wdC0+Y2FsbGJhY2spKG9wdCwgTlVMTCwgMCk7CisJCWlmIChvcHQtPmZsYWdzICYgUEFSU0VfT1BUX09QVEFSRyAmJiAhcC0+b3B0KQorCQkJcmV0dXJuICgqb3B0LT5jYWxsYmFjaykob3B0LCBOVUxMLCAwKTsKKwkJaWYgKCFhcmcpCisJCQlyZXR1cm4gb3B0ZXJyb3Iob3B0LCAicmVxdWlyZXMgYSB2YWx1ZSIsIGZsYWdzKTsKKwkJcmV0dXJuICgqb3B0LT5jYWxsYmFjaykob3B0LCBnZXRfYXJnKHApLCAwKTsKKworCWNhc2UgT1BUSU9OX0lOVEVHRVI6CisJCWlmICh1bnNldCkgeworCQkJKihpbnQgKilvcHQtPnZhbHVlID0gMDsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChvcHQtPmZsYWdzICYgUEFSU0VfT1BUX09QVEFSRyAmJiAhcC0+b3B0KSB7CisJCQkqKGludCAqKW9wdC0+dmFsdWUgPSBvcHQtPmRlZnZhbDsKKwkJCXJldHVybiAwOworCQl9CisJCWlmICghYXJnKQorCQkJcmV0dXJuIG9wdGVycm9yKG9wdCwgInJlcXVpcmVzIGEgdmFsdWUiLCBmbGFncyk7CisJCSooaW50ICopb3B0LT52YWx1ZSA9IHN0cnRvbChnZXRfYXJnKHApLCAoY2hhciAqKikmcywgMTApOworCQlpZiAoKnMpCisJCQlyZXR1cm4gb3B0ZXJyb3Iob3B0LCAiZXhwZWN0cyBhIG51bWVyaWNhbCB2YWx1ZSIsIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlkaWUoInNob3VsZCBub3QgaGFwcGVuLCBzb21lb25lIG11c3QgYmUgaGl0IG9uIHRoZSBmb3JlaGVhZCIpOworCX0KK30KKworc3RhdGljIGludCBwYXJzZV9zaG9ydF9vcHQoc3RydWN0IG9wdHBhcnNlX3QgKnAsIGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdGlvbnMpCit7CisJZm9yICg7IG9wdGlvbnMtPnR5cGUgIT0gT1BUSU9OX0VORDsgb3B0aW9ucysrKSB7CisJCWlmIChvcHRpb25zLT5zaG9ydF9uYW1lID09ICpwLT5vcHQpIHsKKwkJCXAtPm9wdCA9IHAtPm9wdFsxXSA/IHAtPm9wdCArIDEgOiBOVUxMOworCQkJcmV0dXJuIGdldF92YWx1ZShwLCBvcHRpb25zLCBPUFRfU0hPUlQpOworCQl9CisJfQorCXJldHVybiBlcnJvcigidW5rbm93biBzd2l0Y2ggYCVjJyIsICpwLT5vcHQpOworfQorCitzdGF0aWMgaW50IHBhcnNlX2xvbmdfb3B0KHN0cnVjdCBvcHRwYXJzZV90ICpwLCBjb25zdCBjaGFyICphcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdGlvbnMpCit7CisJY29uc3QgY2hhciAqYXJnX2VuZCA9IHN0cmNocihhcmcsICc9Jyk7CisJY29uc3Qgc3RydWN0IG9wdGlvbiAqYWJicmV2X29wdGlvbiA9IE5VTEwsICphbWJpZ3VvdXNfb3B0aW9uID0gTlVMTDsKKwlpbnQgYWJicmV2X2ZsYWdzID0gMCwgYW1iaWd1b3VzX2ZsYWdzID0gMDsKKworCWlmICghYXJnX2VuZCkKKwkJYXJnX2VuZCA9IGFyZyArIHN0cmxlbihhcmcpOworCisJZm9yICg7IG9wdGlvbnMtPnR5cGUgIT0gT1BUSU9OX0VORDsgb3B0aW9ucysrKSB7CisJCWNvbnN0IGNoYXIgKnJlc3Q7CisJCWludCBmbGFncyA9IDA7CisKKwkJaWYgKCFvcHRpb25zLT5sb25nX25hbWUpCisJCQljb250aW51ZTsKKworCQlyZXN0ID0gc2tpcF9wcmVmaXgoYXJnLCBvcHRpb25zLT5sb25nX25hbWUpOworCQlpZiAob3B0aW9ucy0+dHlwZSA9PSBPUFRJT05fQVJHVU1FTlQpIHsKKwkJCWlmICghcmVzdCkKKwkJCQljb250aW51ZTsKKwkJCWlmICgqcmVzdCA9PSAnPScpCisJCQkJcmV0dXJuIG9wdGVycm9yKG9wdGlvbnMsICJ0YWtlcyBubyB2YWx1ZSIsIGZsYWdzKTsKKwkJCWlmICgqcmVzdCkKKwkJCQljb250aW51ZTsKKwkJCXAtPm91dFtwLT5jcGlkeCsrXSA9IGFyZyAtIDI7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIXJlc3QpIHsKKwkJCS8qIGFiYnJldmlhdGVkPyAqLworCQkJaWYgKCFzdHJuY21wKG9wdGlvbnMtPmxvbmdfbmFtZSwgYXJnLCBhcmdfZW5kIC0gYXJnKSkgeworaXNfYWJicmV2aWF0ZWQ6CisJCQkJaWYgKGFiYnJldl9vcHRpb24pIHsKKwkJCQkJLyoKKwkJCQkJICogSWYgdGhpcyBpcyBhYmJyZXZpYXRlZCwgaXQgaXMKKwkJCQkJICogYW1iaWd1b3VzLiBTbyB3aGVuIHRoZXJlIGlzIG5vCisJCQkJCSAqIGV4YWN0IG1hdGNoIGxhdGVyLCB3ZSBuZWVkIHRvCisJCQkJCSAqIGVycm9yIG91dC4KKwkJCQkJICovCisJCQkJCWFtYmlndW91c19vcHRpb24gPSBhYmJyZXZfb3B0aW9uOworCQkJCQlhbWJpZ3VvdXNfZmxhZ3MgPSBhYmJyZXZfZmxhZ3M7CisJCQkJfQorCQkJCWlmICghKGZsYWdzICYgT1BUX1VOU0VUKSAmJiAqYXJnX2VuZCkKKwkJCQkJcC0+b3B0ID0gYXJnX2VuZCArIDE7CisJCQkJYWJicmV2X29wdGlvbiA9IG9wdGlvbnM7CisJCQkJYWJicmV2X2ZsYWdzID0gZmxhZ3M7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBuZWdhdGVkIGFuZCBhYmJyZXZpYXRlZCB2ZXJ5IG11Y2g/ICovCisJCQlpZiAoIXByZWZpeGNtcCgibm8tIiwgYXJnKSkgeworCQkJCWZsYWdzIHw9IE9QVF9VTlNFVDsKKwkJCQlnb3RvIGlzX2FiYnJldmlhdGVkOworCQkJfQorCQkJLyogbmVnYXRlZD8gKi8KKwkJCWlmIChzdHJuY21wKGFyZywgIm5vLSIsIDMpKQorCQkJCWNvbnRpbnVlOworCQkJZmxhZ3MgfD0gT1BUX1VOU0VUOworCQkJcmVzdCA9IHNraXBfcHJlZml4KGFyZyArIDMsIG9wdGlvbnMtPmxvbmdfbmFtZSk7CisJCQkvKiBhYmJyZXZpYXRlZCBhbmQgbmVnYXRlZD8gKi8KKwkJCWlmICghcmVzdCAmJiAhcHJlZml4Y21wKG9wdGlvbnMtPmxvbmdfbmFtZSwgYXJnICsgMykpCisJCQkJZ290byBpc19hYmJyZXZpYXRlZDsKKwkJCWlmICghcmVzdCkKKwkJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKnJlc3QpIHsKKwkJCWlmICgqcmVzdCAhPSAnPScpCisJCQkJY29udGludWU7CisJCQlwLT5vcHQgPSByZXN0ICsgMTsKKwkJfQorCQlyZXR1cm4gZ2V0X3ZhbHVlKHAsIG9wdGlvbnMsIGZsYWdzKTsKKwl9CisKKwlpZiAoYW1iaWd1b3VzX29wdGlvbikKKwkJcmV0dXJuIGVycm9yKCJBbWJpZ3VvdXMgb3B0aW9uOiAlcyAiCisJCQkiKGNvdWxkIGJlIC0tJXMlcyBvciAtLSVzJXMpIiwKKwkJCWFyZywKKwkJCShhbWJpZ3VvdXNfZmxhZ3MgJiBPUFRfVU5TRVQpID8gICJuby0iIDogIiIsCisJCQlhbWJpZ3VvdXNfb3B0aW9uLT5sb25nX25hbWUsCisJCQkoYWJicmV2X2ZsYWdzICYgT1BUX1VOU0VUKSA/ICAibm8tIiA6ICIiLAorCQkJYWJicmV2X29wdGlvbi0+bG9uZ19uYW1lKTsKKwlpZiAoYWJicmV2X29wdGlvbikKKwkJcmV0dXJuIGdldF92YWx1ZShwLCBhYmJyZXZfb3B0aW9uLCBhYmJyZXZfZmxhZ3MpOworCXJldHVybiBlcnJvcigidW5rbm93biBvcHRpb24gYCVzJyIsIGFyZyk7Cit9CisKK3ZvaWQgY2hlY2tfdHlwb3MoY29uc3QgY2hhciAqYXJnLCBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zKQoreworCWlmIChzdHJsZW4oYXJnKSA8IDMpCisJCXJldHVybjsKKworCWlmICghcHJlZml4Y21wKGFyZywgIm5vLSIpKSB7CisJCWVycm9yICgiZGlkIHlvdSBtZWFuIGAtLSVzYCAod2l0aCB0d28gZGFzaGVzID8pIiwgYXJnKTsKKwkJZXhpdCgxMjkpOworCX0KKworCWZvciAoOyBvcHRpb25zLT50eXBlICE9IE9QVElPTl9FTkQ7IG9wdGlvbnMrKykgeworCQlpZiAoIW9wdGlvbnMtPmxvbmdfbmFtZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXByZWZpeGNtcChvcHRpb25zLT5sb25nX25hbWUsIGFyZykpIHsKKwkJCWVycm9yICgiZGlkIHlvdSBtZWFuIGAtLSVzYCAod2l0aCB0d28gZGFzaGVzID8pIiwgYXJnKTsKKwkJCWV4aXQoMTI5KTsKKwkJfQorCX0KK30KKworc3RhdGljIE5PUkVUVVJOIHZvaWQgdXNhZ2Vfd2l0aF9vcHRpb25zX2ludGVybmFsKGNvbnN0IGNoYXIgKiBjb25zdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKiwgaW50KTsKKworaW50IHBhcnNlX29wdGlvbnMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0IHVzYWdlc3RyW10sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgb3B0cGFyc2VfdCBhcmdzID0geyBhcmd2ICsgMSwgYXJndiwgYXJnYyAtIDEsIDAsIE5VTEwgfTsKKworCWZvciAoOyBhcmdzLmFyZ2M7IGFyZ3MuYXJnYy0tLCBhcmdzLmFyZ3YrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmdzLmFyZ3ZbMF07CisKKwkJaWYgKCphcmcgIT0gJy0nIHx8ICFhcmdbMV0pIHsKKwkJCWlmIChmbGFncyAmIFBBUlNFX09QVF9TVE9QX0FUX05PTl9PUFRJT04pCisJCQkJYnJlYWs7CisJCQlhcmdzLm91dFthcmdzLmNwaWR4KytdID0gYXJncy5hcmd2WzBdOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoYXJnWzFdICE9ICctJykgeworCQkJYXJncy5vcHQgPSBhcmcgKyAxOworCQkJaWYgKCphcmdzLm9wdCA9PSAnaCcpCisJCQkJdXNhZ2Vfd2l0aF9vcHRpb25zKHVzYWdlc3RyLCBvcHRpb25zKTsKKwkJCWlmIChwYXJzZV9zaG9ydF9vcHQoJmFyZ3MsIG9wdGlvbnMpIDwgMCkKKwkJCQl1c2FnZV93aXRoX29wdGlvbnModXNhZ2VzdHIsIG9wdGlvbnMpOworCQkJaWYgKGFyZ3Mub3B0KQorCQkJCWNoZWNrX3R5cG9zKGFyZyArIDEsIG9wdGlvbnMpOworCQkJd2hpbGUgKGFyZ3Mub3B0KSB7CisJCQkJaWYgKCphcmdzLm9wdCA9PSAnaCcpCisJCQkJCXVzYWdlX3dpdGhfb3B0aW9ucyh1c2FnZXN0ciwgb3B0aW9ucyk7CisJCQkJaWYgKHBhcnNlX3Nob3J0X29wdCgmYXJncywgb3B0aW9ucykgPCAwKQorCQkJCQl1c2FnZV93aXRoX29wdGlvbnModXNhZ2VzdHIsIG9wdGlvbnMpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIWFyZ1syXSkgeyAvKiAiLS0iICovCisJCQlpZiAoIShmbGFncyAmIFBBUlNFX09QVF9LRUVQX0RBU0hEQVNIKSkgeworCQkJCWFyZ3MuYXJnYy0tOworCQkJCWFyZ3MuYXJndisrOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIXN0cmNtcChhcmcgKyAyLCAiaGVscC1hbGwiKSkKKwkJCXVzYWdlX3dpdGhfb3B0aW9uc19pbnRlcm5hbCh1c2FnZXN0ciwgb3B0aW9ucywgMSk7CisJCWlmICghc3RyY21wKGFyZyArIDIsICJoZWxwIikpCisJCQl1c2FnZV93aXRoX29wdGlvbnModXNhZ2VzdHIsIG9wdGlvbnMpOworCQlpZiAocGFyc2VfbG9uZ19vcHQoJmFyZ3MsIGFyZyArIDIsIG9wdGlvbnMpKQorCQkJdXNhZ2Vfd2l0aF9vcHRpb25zKHVzYWdlc3RyLCBvcHRpb25zKTsKKwl9CisKKwltZW1tb3ZlKGFyZ3Mub3V0ICsgYXJncy5jcGlkeCwgYXJncy5hcmd2LCBhcmdzLmFyZ2MgKiBzaXplb2YoKmFyZ3Mub3V0KSk7CisJYXJncy5vdXRbYXJncy5jcGlkeCArIGFyZ3MuYXJnY10gPSBOVUxMOworCXJldHVybiBhcmdzLmNwaWR4ICsgYXJncy5hcmdjOworfQorCisjZGVmaW5lIFVTQUdFX09QVFNfV0lEVEggMjQKKyNkZWZpbmUgVVNBR0VfR0FQICAgICAgICAgMgorCit2b2lkIHVzYWdlX3dpdGhfb3B0aW9uc19pbnRlcm5hbChjb25zdCBjaGFyICogY29uc3QgKnVzYWdlc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0cywgaW50IGZ1bGwpCit7CisJZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXNcbiIsICp1c2FnZXN0cisrKTsKKwl3aGlsZSAoKnVzYWdlc3RyICYmICoqdXNhZ2VzdHIpCisJCWZwcmludGYoc3RkZXJyLCAiICAgb3I6ICVzXG4iLCAqdXNhZ2VzdHIrKyk7CisJd2hpbGUgKCp1c2FnZXN0cikKKwkJZnByaW50ZihzdGRlcnIsICIgICAgJXNcbiIsICp1c2FnZXN0cisrKTsKKworCWlmIChvcHRzLT50eXBlICE9IE9QVElPTl9HUk9VUCkKKwkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKKworCWZvciAoOyBvcHRzLT50eXBlICE9IE9QVElPTl9FTkQ7IG9wdHMrKykgeworCQlzaXplX3QgcG9zOworCQlpbnQgcGFkOworCisJCWlmIChvcHRzLT50eXBlID09IE9QVElPTl9HUk9VUCkgeworCQkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwkJCWlmICgqb3B0cy0+aGVscCkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBvcHRzLT5oZWxwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghZnVsbCAmJiAob3B0cy0+ZmxhZ3MgJiBQQVJTRV9PUFRfSElEREVOKSkKKwkJCWNvbnRpbnVlOworCisJCXBvcyA9IGZwcmludGYoc3RkZXJyLCAiICAgICIpOworCQlpZiAob3B0cy0+c2hvcnRfbmFtZSkKKwkJCXBvcyArPSBmcHJpbnRmKHN0ZGVyciwgIi0lYyIsIG9wdHMtPnNob3J0X25hbWUpOworCQlpZiAob3B0cy0+bG9uZ19uYW1lICYmIG9wdHMtPnNob3J0X25hbWUpCisJCQlwb3MgKz0gZnByaW50ZihzdGRlcnIsICIsICIpOworCQlpZiAob3B0cy0+bG9uZ19uYW1lKQorCQkJcG9zICs9IGZwcmludGYoc3RkZXJyLCAiLS0lcyIsIG9wdHMtPmxvbmdfbmFtZSk7CisKKwkJc3dpdGNoIChvcHRzLT50eXBlKSB7CisJCWNhc2UgT1BUSU9OX0FSR1VNRU5UOgorCQkJYnJlYWs7CisJCWNhc2UgT1BUSU9OX0lOVEVHRVI6CisJCQlpZiAob3B0cy0+ZmxhZ3MgJiBQQVJTRV9PUFRfT1BUQVJHKQorCQkJCXBvcyArPSBmcHJpbnRmKHN0ZGVyciwgIiBbPG4+XSIpOworCQkJZWxzZQorCQkJCXBvcyArPSBmcHJpbnRmKHN0ZGVyciwgIiA8bj4iKTsKKwkJCWJyZWFrOworCQljYXNlIE9QVElPTl9DQUxMQkFDSzoKKwkJCWlmIChvcHRzLT5mbGFncyAmIFBBUlNFX09QVF9OT0FSRykKKwkJCQlicmVhazsKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWNhc2UgT1BUSU9OX1NUUklORzoKKwkJCWlmIChvcHRzLT5hcmdoKSB7CisJCQkJaWYgKG9wdHMtPmZsYWdzICYgUEFSU0VfT1BUX09QVEFSRykKKwkJCQkJcG9zICs9IGZwcmludGYoc3RkZXJyLCAiIFs8JXM+XSIsIG9wdHMtPmFyZ2gpOworCQkJCWVsc2UKKwkJCQkJcG9zICs9IGZwcmludGYoc3RkZXJyLCAiIDwlcz4iLCBvcHRzLT5hcmdoKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKG9wdHMtPmZsYWdzICYgUEFSU0VfT1BUX09QVEFSRykKKwkJCQkJcG9zICs9IGZwcmludGYoc3RkZXJyLCAiIFsuLi5dIik7CisJCQkJZWxzZQorCQkJCQlwb3MgKz0gZnByaW50ZihzdGRlcnIsICIgLi4uIik7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDogLyogT1BUSU9OX3tCSVQsQk9PTEVBTixTRVRfSU5ULFNFVF9QVFJ9ICovCisJCQlicmVhazsKKwkJfQorCisJCWlmIChwb3MgPD0gVVNBR0VfT1BUU19XSURUSCkKKwkJCXBhZCA9IFVTQUdFX09QVFNfV0lEVEggLSBwb3M7CisJCWVsc2UgeworCQkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwkJCXBhZCA9IFVTQUdFX09QVFNfV0lEVEg7CisJCX0KKwkJZnByaW50ZihzdGRlcnIsICIlKnMlc1xuIiwgcGFkICsgVVNBR0VfR0FQLCAiIiwgb3B0cy0+aGVscCk7CisJfQorCWZwdXRjKCdcbicsIHN0ZGVycik7CisKKwlleGl0KDEyOSk7Cit9CisKK3ZvaWQgdXNhZ2Vfd2l0aF9vcHRpb25zKGNvbnN0IGNoYXIgKiBjb25zdCAqdXNhZ2VzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHRzKQoreworCXVzYWdlX3dpdGhfb3B0aW9uc19pbnRlcm5hbCh1c2FnZXN0ciwgb3B0cywgMCk7Cit9CisKKy8qLS0tLS0gc29tZSBvZnRlbiB1c2VkIG9wdGlvbnMgLS0tLS0qLworI2luY2x1ZGUgImNhY2hlLmgiCisKK2ludCBwYXJzZV9vcHRfYWJicmV2X2NiKGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdCwgY29uc3QgY2hhciAqYXJnLCBpbnQgdW5zZXQpCit7CisJaW50IHY7CisKKwlpZiAoIWFyZykgeworCQl2ID0gdW5zZXQgPyAwIDogREVGQVVMVF9BQkJSRVY7CisJfSBlbHNlIHsKKwkJdiA9IHN0cnRvbChhcmcsIChjaGFyICoqKSZhcmcsIDEwKTsKKwkJaWYgKCphcmcpCisJCQlyZXR1cm4gb3B0ZXJyb3Iob3B0LCAiZXhwZWN0cyBhIG51bWVyaWNhbCB2YWx1ZSIsIDApOworCQlpZiAodiAmJiB2IDwgTUlOSU1VTV9BQkJSRVYpCisJCQl2ID0gTUlOSU1VTV9BQkJSRVY7CisJCWVsc2UgaWYgKHYgPiA0MCkKKwkJCXYgPSA0MDsKKwl9CisJKihpbnQgKikob3B0LT52YWx1ZSkgPSB2OworCXJldHVybiAwOworfQorCitpbnQgcGFyc2Vfb3B0X2FwcHJveGlkYXRlX2NiKGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdCwgY29uc3QgY2hhciAqYXJnLAorCQkJICAgICBpbnQgdW5zZXQpCit7CisJKih1bnNpZ25lZCBsb25nICopKG9wdC0+dmFsdWUpID0gYXBwcm94aWRhdGUoYXJnKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3BhcnNlLW9wdGlvbnMuaCBiL3BhcnNlLW9wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWU0NDNkCi0tLSAvZGV2L251bGwKKysrIGIvcGFyc2Utb3B0aW9ucy5oCkBAIC0wLDAgKzEsMTI2IEBACisjaWZuZGVmIFBBUlNFX09QVElPTlNfSAorI2RlZmluZSBQQVJTRV9PUFRJT05TX0gKKworZW51bSBwYXJzZV9vcHRfdHlwZSB7CisJLyogc3BlY2lhbCB0eXBlcyAqLworCU9QVElPTl9FTkQsCisJT1BUSU9OX0FSR1VNRU5ULAorCU9QVElPTl9HUk9VUCwKKwkvKiBvcHRpb25zIHdpdGggbm8gYXJndW1lbnRzICovCisJT1BUSU9OX0JJVCwKKwlPUFRJT05fQk9PTEVBTiwgLyogX0lOQ1Igd291bGQgaGF2ZSBiZWVuIGEgYmV0dGVyIG5hbWUgKi8KKwlPUFRJT05fU0VUX0lOVCwKKwlPUFRJT05fU0VUX1BUUiwKKwkvKiBvcHRpb25zIHdpdGggYXJndW1lbnRzICh1c3VhbGx5KSAqLworCU9QVElPTl9TVFJJTkcsCisJT1BUSU9OX0lOVEVHRVIsCisJT1BUSU9OX0NBTExCQUNLLAorfTsKKworZW51bSBwYXJzZV9vcHRfZmxhZ3MgeworCVBBUlNFX09QVF9LRUVQX0RBU0hEQVNIID0gMSwKKwlQQVJTRV9PUFRfU1RPUF9BVF9OT05fT1BUSU9OID0gMiwKK307CisKK2VudW0gcGFyc2Vfb3B0X29wdGlvbl9mbGFncyB7CisJUEFSU0VfT1BUX09QVEFSRyAgPSAxLAorCVBBUlNFX09QVF9OT0FSRyAgID0gMiwKKwlQQVJTRV9PUFRfTk9ORUcgICA9IDQsCisJUEFSU0VfT1BUX0hJRERFTiAgPSA4LAorfTsKKworc3RydWN0IG9wdGlvbjsKK3R5cGVkZWYgaW50IHBhcnNlX29wdF9jYihjb25zdCBzdHJ1Y3Qgb3B0aW9uICosIGNvbnN0IGNoYXIgKmFyZywgaW50IHVuc2V0KTsKKworLyoKKyAqIGB0eXBlYDo6CisgKiAgIGhvbGRzIHRoZSB0eXBlIG9mIHRoZSBvcHRpb24sIHlvdSBtdXN0IGhhdmUgYW4gT1BUSU9OX0VORCBsYXN0IGluIHlvdXIKKyAqICAgYXJyYXkuCisgKgorICogYHNob3J0X25hbWVgOjoKKyAqICAgdGhlIGNoYXJhY3RlciB0byB1c2UgYXMgYSBzaG9ydCBvcHRpb24gbmFtZSwgJ1wwJyBpZiBub25lLgorICoKKyAqIGBsb25nX25hbWVgOjoKKyAqICAgdGhlIGxvbmcgb3B0aW9uIG5hbWUsIHdpdGhvdXQgdGhlIGxlYWRpbmcgZGFzaGVzLCBOVUxMIGlmIG5vbmUuCisgKgorICogYHZhbHVlYDo6CisgKiAgIHN0b3JlcyBwb2ludGVycyB0byB0aGUgdmFsdWVzIHRvIGJlIGZpbGxlZC4KKyAqCisgKiBgYXJnaGA6OgorICogICB0b2tlbiB0byBleHBsYWluIHRoZSBraW5kIG9mIGFyZ3VtZW50IHRoaXMgb3B0aW9uIHdhbnRzLiBLZWVwIGl0CisgKiAgIGhvbW9nZW5vdXMgYWNyb3NzIHRoZSByZXBvc2l0b3J5LgorICoKKyAqIGBoZWxwYDo6CisgKiAgIHRoZSBzaG9ydCBoZWxwIGFzc29jaWF0ZWQgdG8gd2hhdCB0aGUgb3B0aW9uIGRvZXMuCisgKiAgIE11c3QgbmV2ZXIgYmUgTlVMTCAoZXhjZXB0IGZvciBPUFRJT05fRU5EKS4KKyAqICAgT1BUSU9OX0dST1VQIHVzZXMgdGhpcyBwb2ludGVyIHRvIHN0b3JlIHRoZSBncm91cCBoZWFkZXIuCisgKgorICogYGZsYWdzYDo6CisgKiAgIG1hc2sgb2YgcGFyc2Vfb3B0X29wdGlvbl9mbGFncy4KKyAqICAgUEFSU0VfT1BUX09QVEFSRzogc2F5cyB0aGF0IHRoZSBhcmd1bWVudCBpcyBvcHRpb25uYWwgKG5vdCBmb3IgQk9PTEVBTnMpCisgKiAgIFBBUlNFX09QVF9OT0FSRzogc2F5cyB0aGF0IHRoaXMgb3B0aW9uIHRha2VzIG5vIGFyZ3VtZW50LCBmb3IgQ0FMTEJBQ0tzCisgKiAgIFBBUlNFX09QVF9OT05FRzogc2F5cyB0aGF0IHRoaXMgb3B0aW9uIGNhbm5vdCBiZSBuZWdhdGVkCisgKiAgIFBBUlNFX09QVF9ISURERU4gdGhpcyBvcHRpb24gaXMgc2tpcHBlZCBpbiB0aGUgZGVmYXVsdCB1c2FnZSwgc2hvd2VkIGluCisgKiAgICAgICAgICAgICAgICAgICAgdGhlIGxvbmcgb25lLgorICoKKyAqIGBjYWxsYmFja2A6OgorICogICBwb2ludGVyIHRvIHRoZSBjYWxsYmFjayB0byB1c2UgZm9yIE9QVElPTl9DQUxMQkFDSy4KKyAqCisgKiBgZGVmdmFsYDo6CisgKiAgIGRlZmF1bHQgdmFsdWUgdG8gZmlsbCAoKi0+dmFsdWUpIHdpdGggZm9yIFBBUlNFX09QVF9PUFRBUkcuCisgKiAgIE9QVElPTl97QklULFNFVF9JTlQsU0VUX1BUUn0gc3RvcmUgdGhlIHttYXNrLGludGVnZXIscG9pbnRlcn0gdG8gcHV0IGluCisgKiAgIHRoZSB2YWx1ZSB3aGVuIG1ldC4KKyAqICAgQ0FMTEJBQ0tTIGNhbiB1c2UgaXQgbGlrZSB0aGV5IHdhbnQuCisgKi8KK3N0cnVjdCBvcHRpb24geworCWVudW0gcGFyc2Vfb3B0X3R5cGUgdHlwZTsKKwlpbnQgc2hvcnRfbmFtZTsKKwljb25zdCBjaGFyICpsb25nX25hbWU7CisJdm9pZCAqdmFsdWU7CisJY29uc3QgY2hhciAqYXJnaDsKKwljb25zdCBjaGFyICpoZWxwOworCisJaW50IGZsYWdzOworCXBhcnNlX29wdF9jYiAqY2FsbGJhY2s7CisJaW50cHRyX3QgZGVmdmFsOworfTsKKworI2RlZmluZSBPUFRfRU5EKCkgICAgICAgICAgICAgICAgICAgeyBPUFRJT05fRU5EIH0KKyNkZWZpbmUgT1BUX0FSR1VNRU5UKGwsIGgpICAgICAgICAgIHsgT1BUSU9OX0FSR1VNRU5ULCAwLCAobCksIE5VTEwsIE5VTEwsIChoKSB9CisjZGVmaW5lIE9QVF9HUk9VUChoKSAgICAgICAgICAgICAgICB7IE9QVElPTl9HUk9VUCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgKGgpIH0KKyNkZWZpbmUgT1BUX0JJVChzLCBsLCB2LCBoLCBiKSAgICAgIHsgT1BUSU9OX0JJVCwgKHMpLCAobCksICh2KSwgTlVMTCwgKGgpLCAwLCBOVUxMLCAoYikgfQorI2RlZmluZSBPUFRfQk9PTEVBTihzLCBsLCB2LCBoKSAgICAgeyBPUFRJT05fQk9PTEVBTiwgKHMpLCAobCksICh2KSwgTlVMTCwgKGgpIH0KKyNkZWZpbmUgT1BUX1NFVF9JTlQocywgbCwgdiwgaCwgaSkgIHsgT1BUSU9OX1NFVF9JTlQsIChzKSwgKGwpLCAodiksIE5VTEwsIChoKSwgMCwgTlVMTCwgKGkpIH0KKyNkZWZpbmUgT1BUX1NFVF9QVFIocywgbCwgdiwgaCwgcCkgIHsgT1BUSU9OX1NFVF9QVFIsIChzKSwgKGwpLCAodiksIE5VTEwsIChoKSwgMCwgTlVMTCwgKHApIH0KKyNkZWZpbmUgT1BUX0lOVEVHRVIocywgbCwgdiwgaCkgICAgIHsgT1BUSU9OX0lOVEVHRVIsIChzKSwgKGwpLCAodiksIE5VTEwsIChoKSB9CisjZGVmaW5lIE9QVF9TVFJJTkcocywgbCwgdiwgYSwgaCkgICB7IE9QVElPTl9TVFJJTkcsICAocyksIChsKSwgKHYpLCAoYSksIChoKSB9CisjZGVmaW5lIE9QVF9EQVRFKHMsIGwsIHYsIGgpIFwKKwl7IE9QVElPTl9DQUxMQkFDSywgKHMpLCAobCksICh2KSwgInRpbWUiLChoKSwgMCwgXAorCSAgcGFyc2Vfb3B0X2FwcHJveGlkYXRlX2NiIH0KKyNkZWZpbmUgT1BUX0NBTExCQUNLKHMsIGwsIHYsIGEsIGgsIGYpIFwKKwl7IE9QVElPTl9DQUxMQkFDSywgKHMpLCAobCksICh2KSwgKGEpLCAoaCksIDAsIChmKSB9CisKKy8qIHBhcnNlX29wdGlvbnMoKSB3aWxsIGZpbHRlciBvdXQgdGhlIHByb2Nlc3NlZCBvcHRpb25zIGFuZCBsZWF2ZSB0aGUKKyAqIG5vbi1vcHRpb24gYXJnbWVudHMgaW4gYXJndltdLgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBsZWZ0IGluIGFyZ3ZbXS4KKyAqLworZXh0ZXJuIGludCBwYXJzZV9vcHRpb25zKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCB1c2FnZXN0cltdLCBpbnQgZmxhZ3MpOworCitleHRlcm4gTk9SRVRVUk4gdm9pZCB1c2FnZV93aXRoX29wdGlvbnMoY29uc3QgY2hhciAqIGNvbnN0ICp1c2FnZXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zKTsKKworLyotLS0tLSBzb21lIG9mdGVuIHVzZWQgb3B0aW9ucyAtLS0tLSovCitleHRlcm4gaW50IHBhcnNlX29wdF9hYmJyZXZfY2IoY29uc3Qgc3RydWN0IG9wdGlvbiAqLCBjb25zdCBjaGFyICosIGludCk7CitleHRlcm4gaW50IHBhcnNlX29wdF9hcHByb3hpZGF0ZV9jYihjb25zdCBzdHJ1Y3Qgb3B0aW9uICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKworI2RlZmluZSBPUFRfX1ZFUkJPU0UodmFyKSAgT1BUX0JPT0xFQU4oJ3YnLCAidmVyYm9zZSIsICh2YXIpLCAiYmUgdmVyYm9zZSIpCisjZGVmaW5lIE9QVF9fUVVJRVQodmFyKSAgICBPUFRfQk9PTEVBTigncScsICJxdWlldCIsICAgKHZhciksICJiZSBxdWlldCIpCisjZGVmaW5lIE9QVF9fRFJZX1JVTih2YXIpICBPUFRfQk9PTEVBTignbicsICJkcnktcnVuIiwgKHZhciksICJkcnkgcnVuIikKKyNkZWZpbmUgT1BUX19BQkJSRVYodmFyKSAgXAorCXsgT1BUSU9OX0NBTExCQUNLLCAwLCAiYWJicmV2IiwgKHZhciksICJuIiwgXAorCSAgInVzZSA8bj4gZGlnaXRzIHRvIGRpc3BsYXkgU0hBLTFzIiwgXAorCSAgUEFSU0VfT1BUX09QVEFSRywgJnBhcnNlX29wdF9hYmJyZXZfY2IsIDAgfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3BhdGNoLWRlbHRhLmMgYi9wYXRjaC1kZWx0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOWRiODEKLS0tIC9kZXYvbnVsbAorKysgYi9wYXRjaC1kZWx0YS5jCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBwYXRjaC1kZWx0YS5jOgorICogcmVjcmVhdGUgYSBidWZmZXIgZnJvbSBhIHNvdXJjZSBhbmQgdGhlIGRlbHRhIHByb2R1Y2VkIGJ5IGRpZmYtZGVsdGEuYworICoKKyAqIChDKSAyMDA1IE5pY29sYXMgUGl0cmUgPG5pY29AY2FtLm9yZz4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlICJnaXQtY29tcGF0LXV0aWwuaCIKKyNpbmNsdWRlICJkZWx0YS5oIgorCit2b2lkICpwYXRjaF9kZWx0YShjb25zdCB2b2lkICpzcmNfYnVmLCB1bnNpZ25lZCBsb25nIHNyY19zaXplLAorCQkgIGNvbnN0IHZvaWQgKmRlbHRhX2J1ZiwgdW5zaWduZWQgbG9uZyBkZWx0YV9zaXplLAorCQkgIHVuc2lnbmVkIGxvbmcgKmRzdF9zaXplKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsICp0b3A7CisJdW5zaWduZWQgY2hhciAqZHN0X2J1ZiwgKm91dCwgY21kOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCWlmIChkZWx0YV9zaXplIDwgREVMVEFfU0laRV9NSU4pCisJCXJldHVybiBOVUxMOworCisJZGF0YSA9IGRlbHRhX2J1ZjsKKwl0b3AgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBkZWx0YV9idWYgKyBkZWx0YV9zaXplOworCisJLyogbWFrZSBzdXJlIHRoZSBvcmlnIGZpbGUgc2l6ZSBtYXRjaGVzIHdoYXQgd2UgZXhwZWN0ICovCisJc2l6ZSA9IGdldF9kZWx0YV9oZHJfc2l6ZSgmZGF0YSwgdG9wKTsKKwlpZiAoc2l6ZSAhPSBzcmNfc2l6ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBub3cgdGhlIHJlc3VsdCBzaXplICovCisJc2l6ZSA9IGdldF9kZWx0YV9oZHJfc2l6ZSgmZGF0YSwgdG9wKTsKKwlkc3RfYnVmID0geG1hbGxvYyhzaXplICsgMSk7CisJZHN0X2J1ZltzaXplXSA9IDA7CisKKwlvdXQgPSBkc3RfYnVmOworCXdoaWxlIChkYXRhIDwgdG9wKSB7CisJCWNtZCA9ICpkYXRhKys7CisJCWlmIChjbWQgJiAweDgwKSB7CisJCQl1bnNpZ25lZCBsb25nIGNwX29mZiA9IDAsIGNwX3NpemUgPSAwOworCQkJaWYgKGNtZCAmIDB4MDEpIGNwX29mZiA9ICpkYXRhKys7CisJCQlpZiAoY21kICYgMHgwMikgY3Bfb2ZmIHw9ICgqZGF0YSsrIDw8IDgpOworCQkJaWYgKGNtZCAmIDB4MDQpIGNwX29mZiB8PSAoKmRhdGErKyA8PCAxNik7CisJCQlpZiAoY21kICYgMHgwOCkgY3Bfb2ZmIHw9ICgqZGF0YSsrIDw8IDI0KTsKKwkJCWlmIChjbWQgJiAweDEwKSBjcF9zaXplID0gKmRhdGErKzsKKwkJCWlmIChjbWQgJiAweDIwKSBjcF9zaXplIHw9ICgqZGF0YSsrIDw8IDgpOworCQkJaWYgKGNtZCAmIDB4NDApIGNwX3NpemUgfD0gKCpkYXRhKysgPDwgMTYpOworCQkJaWYgKGNwX3NpemUgPT0gMCkgY3Bfc2l6ZSA9IDB4MTAwMDA7CisJCQlpZiAoY3Bfb2ZmICsgY3Bfc2l6ZSA8IGNwX3NpemUgfHwKKwkJCSAgICBjcF9vZmYgKyBjcF9zaXplID4gc3JjX3NpemUgfHwKKwkJCSAgICBjcF9zaXplID4gc2l6ZSkKKwkJCQlicmVhazsKKwkJCW1lbWNweShvdXQsIChjaGFyICopIHNyY19idWYgKyBjcF9vZmYsIGNwX3NpemUpOworCQkJb3V0ICs9IGNwX3NpemU7CisJCQlzaXplIC09IGNwX3NpemU7CisJCX0gZWxzZSBpZiAoY21kKSB7CisJCQlpZiAoY21kID4gc2l6ZSkKKwkJCQlicmVhazsKKwkJCW1lbWNweShvdXQsIGRhdGEsIGNtZCk7CisJCQlvdXQgKz0gY21kOworCQkJZGF0YSArPSBjbWQ7CisJCQlzaXplIC09IGNtZDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBjbWQgPT0gMCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGVuY29kaW5nCisJCQkgKiBleHRlbnNpb25zLiBJbiB0aGUgbWVhbiB0aW1lIHdlIG11c3QgZmFpbCB3aGVuCisJCQkgKiBlbmNvdW50ZXJpbmcgdGhlbSAobWlnaHQgYmUgZGF0YSBjb3JydXB0aW9uKS4KKwkJCSAqLworCQkJZXJyb3IoInVuZXhwZWN0ZWQgZGVsdGEgb3Bjb2RlIDAiKTsKKwkJCWdvdG8gYmFkOworCQl9CisJfQorCisJLyogc2FuaXR5IGNoZWNrICovCisJaWYgKGRhdGEgIT0gdG9wIHx8IHNpemUgIT0gMCkgeworCQllcnJvcigiZGVsdGEgcmVwbGF5IGhhcyBnb25lIHdpbGQiKTsKKwkJYmFkOgorCQlmcmVlKGRzdF9idWYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkqZHN0X3NpemUgPSBvdXQgLSBkc3RfYnVmOworCXJldHVybiBkc3RfYnVmOworfQpkaWZmIC0tZ2l0IGEvcGF0Y2gtaWQuYyBiL3BhdGNoLWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM0OWJjNQotLS0gL2Rldi9udWxsCisrKyBiL3BhdGNoLWlkLmMKQEAgLTAsMCArMSw4NCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisKK3N0YXRpYyB2b2lkIGZsdXNoX2N1cnJlbnRfaWQoaW50IHBhdGNobGVuLCB1bnNpZ25lZCBjaGFyICppZCwgU0hBX0NUWCAqYykKK3sKKwl1bnNpZ25lZCBjaGFyIHJlc3VsdFsyMF07CisJY2hhciBuYW1lWzUwXTsKKworCWlmICghcGF0Y2hsZW4pCisJCXJldHVybjsKKworCVNIQTFfRmluYWwocmVzdWx0LCBjKTsKKwltZW1jcHkobmFtZSwgc2hhMV90b19oZXgoaWQpLCA0MSk7CisJcHJpbnRmKCIlcyAlc1xuIiwgc2hhMV90b19oZXgocmVzdWx0KSwgbmFtZSk7CisJU0hBMV9Jbml0KGMpOworfQorCitzdGF0aWMgaW50IHJlbW92ZV9zcGFjZShjaGFyICpsaW5lKQoreworCWNoYXIgKnNyYyA9IGxpbmU7CisJY2hhciAqZHN0ID0gbGluZTsKKwl1bnNpZ25lZCBjaGFyIGM7CisKKwl3aGlsZSAoKGMgPSAqc3JjKyspICE9ICdcMCcpIHsKKwkJaWYgKCFpc3NwYWNlKGMpKQorCQkJKmRzdCsrID0gYzsKKwl9CisJcmV0dXJuIGRzdCAtIGxpbmU7Cit9CisKK3N0YXRpYyB2b2lkIGdlbmVyYXRlX2lkX2xpc3Qodm9pZCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdGF0aWMgY2hhciBsaW5lWzEwMDBdOworCVNIQV9DVFggY3R4OworCWludCBwYXRjaGxlbiA9IDA7CisKKwlTSEExX0luaXQoJmN0eCk7CisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgc3RkaW4pICE9IE5VTEwpIHsKKwkJdW5zaWduZWQgY2hhciBuWzIwXTsKKwkJY2hhciAqcCA9IGxpbmU7CisJCWludCBsZW47CisKKwkJaWYgKCFtZW1jbXAobGluZSwgImRpZmYtdHJlZSAiLCAxMCkpCisJCQlwICs9IDEwOworCQllbHNlIGlmICghbWVtY21wKGxpbmUsICJjb21taXQgIiwgNykpCisJCQlwICs9IDc7CisKKwkJaWYgKCFnZXRfc2hhMV9oZXgocCwgbikpIHsKKwkJCWZsdXNoX2N1cnJlbnRfaWQocGF0Y2hsZW4sIHNoYTEsICZjdHgpOworCQkJaGFzaGNweShzaGExLCBuKTsKKwkJCXBhdGNobGVuID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogSWdub3JlIGNvbW1pdCBjb21tZW50cyAqLworCQlpZiAoIXBhdGNobGVuICYmIG1lbWNtcChsaW5lLCAiZGlmZiAiLCA1KSkKKwkJCWNvbnRpbnVlOworCisJCS8qIElnbm9yZSBnaXQtZGlmZiBpbmRleCBoZWFkZXIgKi8KKwkJaWYgKCFtZW1jbXAobGluZSwgImluZGV4ICIsIDYpKQorCQkJY29udGludWU7CisKKwkJLyogSWdub3JlIGxpbmUgbnVtYmVycyB3aGVuIGNvbXB1dGluZyB0aGUgU0hBMSBvZiB0aGUgcGF0Y2ggKi8KKwkJaWYgKCFtZW1jbXAobGluZSwgIkBAIC0iLCA0KSkKKwkJCWNvbnRpbnVlOworCisJCS8qIENvbXB1dGUgdGhlIHNoYSB3aXRob3V0IHdoaXRlc3BhY2UgKi8KKwkJbGVuID0gcmVtb3ZlX3NwYWNlKGxpbmUpOworCQlwYXRjaGxlbiArPSBsZW47CisJCVNIQTFfVXBkYXRlKCZjdHgsIGxpbmUsIGxlbik7CisJfQorCWZsdXNoX2N1cnJlbnRfaWQocGF0Y2hsZW4sIHNoYTEsICZjdHgpOworfQorCitzdGF0aWMgY29uc3QgY2hhciBwYXRjaF9pZF91c2FnZVtdID0gImdpdC1wYXRjaC1pZCA8IHBhdGNoIjsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWlmIChhcmdjICE9IDEpCisJCXVzYWdlKHBhdGNoX2lkX3VzYWdlKTsKKworCWdlbmVyYXRlX2lkX2xpc3QoKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3BhdGNoLWlkcy5jIGIvcGF0Y2gtaWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JlNWQzMQotLS0gL2Rldi9udWxsCisrKyBiL3BhdGNoLWlkcy5jCkBAIC0wLDAgKzEsMTkyIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAicGF0Y2gtaWRzLmgiCisKK3N0YXRpYyBpbnQgY29tbWl0X3BhdGNoX2lkKHN0cnVjdCBjb21taXQgKmNvbW1pdCwgc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywKKwkJICAgIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaWYgKGNvbW1pdC0+cGFyZW50cykKKwkJZGlmZl90cmVlX3NoYTEoY29tbWl0LT5wYXJlbnRzLT5pdGVtLT5vYmplY3Quc2hhMSwKKwkJICAgICAgICAgICAgICAgY29tbWl0LT5vYmplY3Quc2hhMSwgIiIsIG9wdGlvbnMpOworCWVsc2UKKwkJZGlmZl9yb290X3RyZWVfc2hhMShjb21taXQtPm9iamVjdC5zaGExLCAiIiwgb3B0aW9ucyk7CisJZGlmZmNvcmVfc3RkKG9wdGlvbnMpOworCXJldHVybiBkaWZmX2ZsdXNoX3BhdGNoX2lkKG9wdGlvbnMsIHNoYTEpOworfQorCitzdGF0aWMgdWludDMyX3QgdGFrZTIoY29uc3QgdW5zaWduZWQgY2hhciAqaWQpCit7CisJcmV0dXJuICgoaWRbMF0gPDwgOCkgfCBpZFsxXSk7Cit9CisKKy8qCisgKiBDb252ZW50aW9uYWwgYmluYXJ5IHNlYXJjaCBsb29wIGxvb2tzIGxpa2UgdGhpczoKKyAqCisgKiAgICAgIGRvIHsKKyAqICAgICAgICAgICAgICBpbnQgbWkgPSAobG8gKyBoaSkgLyAyOworICogICAgICAgICAgICAgIGludCBjbXAgPSAiZW50cnkgcG9pbnRlZCBhdCBieSBtaSIgbWludXMgInRhcmdldCI7CisgKiAgICAgICAgICAgICAgaWYgKCFjbXApCisgKiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG1pIGlzIHRoZSB3YW50ZWQgb25lKQorICogICAgICAgICAgICAgIGlmIChjbXAgPiAwKQorICogICAgICAgICAgICAgICAgICAgICAgaGkgPSBtaTsgIm1pIGlzIGxhcmdlciB0aGFuIHRhcmdldCIKKyAqICAgICAgICAgICAgICBlbHNlCisgKiAgICAgICAgICAgICAgICAgICAgICBsbyA9IG1pKzE7ICJtaSBpcyBzbWFsbGVyIHRoYW4gdGFyZ2V0IgorICogICAgICB9IHdoaWxlIChsbyA8IGhpKTsKKyAqCisgKiBUaGUgaW52YXJpYW50cyBhcmU6CisgKgorICogLSBXaGVuIGVudGVyaW5nIHRoZSBsb29wLCBsbyBwb2ludHMgYXQgYSBzbG90IHRoYXQgaXMgbmV2ZXIKKyAqICAgYWJvdmUgdGhlIHRhcmdldCAoaXQgY291bGQgYmUgYXQgdGhlIHRhcmdldCksIGhpIHBvaW50cyBhdCBhCisgKiAgIHNsb3QgdGhhdCBpcyBndWFyYW50ZWVkIHRvIGJlIGFib3ZlIHRoZSB0YXJnZXQgKGl0IGNhbiBuZXZlcgorICogICBiZSBhdCB0aGUgdGFyZ2V0KS4KKyAqCisgKiAtIFdlIGZpbmQgYSBwb2ludCAnbWknIGJldHdlZW4gbG8gYW5kIGhpIChtaSBjb3VsZCBiZSB0aGUgc2FtZQorICogICBhcyBsbywgYnV0IG5ldmVyIGNhbiBiZSB0aGUgc2FtZSBhcyBoaSksIGFuZCBjaGVjayBpZiBpdCBoaXRzCisgKiAgIHRoZSB0YXJnZXQuICBUaGVyZSBhcmUgdGhyZWUgY2FzZXM6CisgKgorICogICAgLSBpZiBpdCBpcyBhIGhpdCwgd2UgYXJlIGhhcHB5LgorICoKKyAqICAgIC0gaWYgaXQgaXMgc3RyaWN0bHkgaGlnaGVyIHRoYW4gdGhlIHRhcmdldCwgd2UgdXBkYXRlIGhpIHdpdGgKKyAqICAgICAgaXQuCisgKgorICogICAgLSBpZiBpdCBpcyBzdHJpY3RseSBsb3dlciB0aGFuIHRoZSB0YXJnZXQsIHdlIHVwZGF0ZSBsbyB0byBiZQorICogICAgICBvbmUgc2xvdCBhZnRlciBpdCwgYmVjYXVzZSB3ZSBhbGxvdyBsbyB0byBiZSBhdCB0aGUgdGFyZ2V0LgorICoKKyAqIFdoZW4gY2hvb3NpbmcgJ21pJywgd2UgZG8gbm90IGhhdmUgdG8gdGFrZSB0aGUgIm1pZGRsZSIgYnV0CisgKiBhbnl3aGVyZSBpbiBiZXR3ZWVuIGxvIGFuZCBoaSwgYXMgbG9uZyBhcyBsbyA8PSBtaSA8IGhpIGlzCisgKiBzYXRpc2ZpZWQuICBXaGVuIHdlIHNvbWVob3cga25vdyB0aGF0IHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZQorICogdGFyZ2V0IGFuZCBsbyBpcyBtdWNoIHNob3J0ZXIgdGhhbiB0aGUgdGFyZ2V0IGFuZCBoaSwgd2UgY291bGQKKyAqIHBpY2sgbWkgdGhhdCBpcyBtdWNoIGNsb3NlciB0byBsbyB0aGFuIHRoZSBtaWR3YXkuCisgKi8KK3N0YXRpYyBpbnQgcGF0Y2hfcG9zKHN0cnVjdCBwYXRjaF9pZCAqKnRhYmxlLCBpbnQgbnIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlkKQoreworCWludCBoaSA9IG5yOworCWludCBsbyA9IDA7CisJaW50IG1pID0gMDsKKworCWlmICghbnIpCisJCXJldHVybiAtMTsKKworCWlmIChuciAhPSAxKSB7CisJCXVuc2lnbmVkIGxvdiwgaGl2LCBtaXYsIG9mczsKKworCQlmb3IgKG9mcyA9IDA7IG9mcyA8IDE4OyBvZnMgKz0gMikgeworCQkJbG92ID0gdGFrZTIodGFibGVbMF0tPnBhdGNoX2lkICsgb2ZzKTsKKwkJCWhpdiA9IHRha2UyKHRhYmxlW25yLTFdLT5wYXRjaF9pZCArIG9mcyk7CisJCQltaXYgPSB0YWtlMihpZCArIG9mcyk7CisJCQlpZiAobWl2IDwgbG92KQorCQkJCXJldHVybiAtMTsKKwkJCWlmIChoaXYgPCBtaXYpCisJCQkJcmV0dXJuIC0xIC0gbnI7CisJCQlpZiAobG92ICE9IGhpdikgeworCQkJCS8qCisJCQkJICogQXQgdGhpcyBwb2ludCBtaXYgY291bGQgYmUgZXF1YWwKKwkJCQkgKiB0byBoaXYgKGJ1dCBpZCBjb3VsZCBzdGlsbCBiZSBoaWdoZXIpOworCQkJCSAqIHRoZSBpbnZhcmlhbnQgb2YgKG1pIDwgaGkpIHNob3VsZCBiZQorCQkJCSAqIGtlcHQuCisJCQkJICovCisJCQkJbWkgPSAobnItMSkgKiAobWl2IC0gbG92KSAvIChoaXYgLSBsb3YpOworCQkJCWlmIChsbyA8PSBtaSAmJiBtaSA8IGhpKQorCQkJCQlicmVhazsKKwkJCQlkaWUoIm9vcHMiKTsKKwkJCX0KKwkJfQorCQlpZiAoMTggPD0gb2ZzKQorCQkJZGllKCJjYW5ub3QgaGFwcGVuIC0tIGxvIGFuZCBoaSBhcmUgaWRlbnRpY2FsIik7CisJfQorCisJZG8geworCQlpbnQgY21wOworCQljbXAgPSBoYXNoY21wKHRhYmxlW21pXS0+cGF0Y2hfaWQsIGlkKTsKKwkJaWYgKCFjbXApCisJCQlyZXR1cm4gbWk7CisJCWlmIChjbXAgPiAwKQorCQkJaGkgPSBtaTsKKwkJZWxzZQorCQkJbG8gPSBtaSArIDE7CisJCW1pID0gKGhpICsgbG8pIC8gMjsKKwl9IHdoaWxlIChsbyA8IGhpKTsKKwlyZXR1cm4gLWxvLTE7Cit9CisKKyNkZWZpbmUgQlVDS0VUX1NJWkUgMTkwIC8qIDE5MCAqIDIxID0gMzk5MCwgd2l0aCBzbG9wIGNsb3NlIGVub3VnaCB0byA0SyAqLworc3RydWN0IHBhdGNoX2lkX2J1Y2tldCB7CisJc3RydWN0IHBhdGNoX2lkX2J1Y2tldCAqbmV4dDsKKwlpbnQgbnI7CisJc3RydWN0IHBhdGNoX2lkIGJ1Y2tldFtCVUNLRVRfU0laRV07Cit9OworCitpbnQgaW5pdF9wYXRjaF9pZHMoc3RydWN0IHBhdGNoX2lkcyAqaWRzKQoreworCW1lbXNldChpZHMsIDAsIHNpemVvZigqaWRzKSk7CisJZGlmZl9zZXR1cCgmaWRzLT5kaWZmb3B0cyk7CisJRElGRl9PUFRfU0VUKCZpZHMtPmRpZmZvcHRzLCBSRUNVUlNJVkUpOworCWlmIChkaWZmX3NldHVwX2RvbmUoJmlkcy0+ZGlmZm9wdHMpIDwgMCkKKwkJcmV0dXJuIGVycm9yKCJkaWZmX3NldHVwX2RvbmUgZmFpbGVkIik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBmcmVlX3BhdGNoX2lkcyhzdHJ1Y3QgcGF0Y2hfaWRzICppZHMpCit7CisJc3RydWN0IHBhdGNoX2lkX2J1Y2tldCAqbmV4dCwgKnBhdGNoZXM7CisKKwlmcmVlKGlkcy0+dGFibGUpOworCWZvciAocGF0Y2hlcyA9IGlkcy0+cGF0Y2hlczsgcGF0Y2hlczsgcGF0Y2hlcyA9IG5leHQpIHsKKwkJbmV4dCA9IHBhdGNoZXMtPm5leHQ7CisJCWZyZWUocGF0Y2hlcyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBhdGNoX2lkICphZGRfY29tbWl0KHN0cnVjdCBjb21taXQgKmNvbW1pdCwKKwkJCQkgICBzdHJ1Y3QgcGF0Y2hfaWRzICppZHMsCisJCQkJICAgaW50IG5vX2FkZCkKK3sKKwlzdHJ1Y3QgcGF0Y2hfaWRfYnVja2V0ICpidWNrZXQ7CisJc3RydWN0IHBhdGNoX2lkICplbnQ7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlpbnQgcG9zOworCisJaWYgKGNvbW1pdF9wYXRjaF9pZChjb21taXQsICZpZHMtPmRpZmZvcHRzLCBzaGExKSkKKwkJcmV0dXJuIE5VTEw7CisJcG9zID0gcGF0Y2hfcG9zKGlkcy0+dGFibGUsIGlkcy0+bnIsIHNoYTEpOworCWlmICgwIDw9IHBvcykKKwkJcmV0dXJuIGlkcy0+dGFibGVbcG9zXTsKKwlpZiAobm9fYWRkKQorCQlyZXR1cm4gTlVMTDsKKworCXBvcyA9IC0xIC0gcG9zOworCisJYnVja2V0ID0gaWRzLT5wYXRjaGVzOworCWlmICghYnVja2V0IHx8IChCVUNLRVRfU0laRSA8PSBidWNrZXQtPm5yKSkgeworCQlidWNrZXQgPSB4Y2FsbG9jKDEsIHNpemVvZigqYnVja2V0KSk7CisJCWJ1Y2tldC0+bmV4dCA9IGlkcy0+cGF0Y2hlczsKKwkJaWRzLT5wYXRjaGVzID0gYnVja2V0OworCX0KKwllbnQgPSAmYnVja2V0LT5idWNrZXRbYnVja2V0LT5ucisrXTsKKwloYXNoY3B5KGVudC0+cGF0Y2hfaWQsIHNoYTEpOworCisJaWYgKGlkcy0+YWxsb2MgPD0gaWRzLT5ucikgeworCQlpZHMtPmFsbG9jID0gYWxsb2NfbnIoaWRzLT5ucik7CisJCWlkcy0+dGFibGUgPSB4cmVhbGxvYyhpZHMtPnRhYmxlLCBzaXplb2YoZW50KSAqIGlkcy0+YWxsb2MpOworCX0KKwlpZiAocG9zIDwgaWRzLT5ucikKKwkJbWVtbW92ZShpZHMtPnRhYmxlICsgcG9zICsgMSwgaWRzLT50YWJsZSArIHBvcywKKwkJCXNpemVvZihlbnQpICogKGlkcy0+bnIgLSBwb3MpKTsKKwlpZHMtPm5yKys7CisJaWRzLT50YWJsZVtwb3NdID0gZW50OworCXJldHVybiBpZHMtPnRhYmxlW3Bvc107Cit9CisKK3N0cnVjdCBwYXRjaF9pZCAqaGFzX2NvbW1pdF9wYXRjaF9pZChzdHJ1Y3QgY29tbWl0ICpjb21taXQsCisJCQkJICAgICBzdHJ1Y3QgcGF0Y2hfaWRzICppZHMpCit7CisJcmV0dXJuIGFkZF9jb21taXQoY29tbWl0LCBpZHMsIDEpOworfQorCitzdHJ1Y3QgcGF0Y2hfaWQgKmFkZF9jb21taXRfcGF0Y2hfaWQoc3RydWN0IGNvbW1pdCAqY29tbWl0LAorCQkJCSAgICAgc3RydWN0IHBhdGNoX2lkcyAqaWRzKQoreworCXJldHVybiBhZGRfY29tbWl0KGNvbW1pdCwgaWRzLCAwKTsKK30KZGlmZiAtLWdpdCBhL3BhdGNoLWlkcy5oIGIvcGF0Y2gtaWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjN2NhMQotLS0gL2Rldi9udWxsCisrKyBiL3BhdGNoLWlkcy5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgUEFUQ0hfSURTX0gKKyNkZWZpbmUgUEFUQ0hfSURTX0gKKworc3RydWN0IHBhdGNoX2lkIHsKKwl1bnNpZ25lZCBjaGFyIHBhdGNoX2lkWzIwXTsKKwljaGFyIHNlZW47Cit9OworCitzdHJ1Y3QgcGF0Y2hfaWRzIHsKKwlzdHJ1Y3QgZGlmZl9vcHRpb25zIGRpZmZvcHRzOworCWludCBuciwgYWxsb2M7CisJc3RydWN0IHBhdGNoX2lkICoqdGFibGU7CisJc3RydWN0IHBhdGNoX2lkX2J1Y2tldCAqcGF0Y2hlczsKK307CisKK2ludCBpbml0X3BhdGNoX2lkcyhzdHJ1Y3QgcGF0Y2hfaWRzICopOworaW50IGZyZWVfcGF0Y2hfaWRzKHN0cnVjdCBwYXRjaF9pZHMgKik7CitzdHJ1Y3QgcGF0Y2hfaWQgKmFkZF9jb21taXRfcGF0Y2hfaWQoc3RydWN0IGNvbW1pdCAqLCBzdHJ1Y3QgcGF0Y2hfaWRzICopOworc3RydWN0IHBhdGNoX2lkICpoYXNfY29tbWl0X3BhdGNoX2lkKHN0cnVjdCBjb21taXQgKiwgc3RydWN0IHBhdGNoX2lkcyAqKTsKKworI2VuZGlmIC8qIFBBVENIX0lEU19IICovCmRpZmYgLS1naXQgYS9wYXRoLWxpc3QuYyBiL3BhdGgtbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZTVjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9wYXRoLWxpc3QuYwpAQCAtMCwwICsxLDEzNCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicGF0aC1saXN0LmgiCisKKy8qIGlmIHRoZXJlIGlzIG5vIGV4YWN0IG1hdGNoLCBwb2ludCB0byB0aGUgaW5kZXggd2hlcmUgdGhlIGVudHJ5IGNvdWxkIGJlCisgKiBpbnNlcnRlZCAqLworc3RhdGljIGludCBnZXRfZW50cnlfaW5kZXgoY29uc3Qgc3RydWN0IHBhdGhfbGlzdCAqbGlzdCwgY29uc3QgY2hhciAqcGF0aCwKKwkJaW50ICpleGFjdF9tYXRjaCkKK3sKKwlpbnQgbGVmdCA9IC0xLCByaWdodCA9IGxpc3QtPm5yOworCisJd2hpbGUgKGxlZnQgKyAxIDwgcmlnaHQpIHsKKwkJaW50IG1pZGRsZSA9IChsZWZ0ICsgcmlnaHQpIC8gMjsKKwkJaW50IGNvbXBhcmUgPSBzdHJjbXAocGF0aCwgbGlzdC0+aXRlbXNbbWlkZGxlXS5wYXRoKTsKKwkJaWYgKGNvbXBhcmUgPCAwKQorCQkJcmlnaHQgPSBtaWRkbGU7CisJCWVsc2UgaWYgKGNvbXBhcmUgPiAwKQorCQkJbGVmdCA9IG1pZGRsZTsKKwkJZWxzZSB7CisJCQkqZXhhY3RfbWF0Y2ggPSAxOworCQkJcmV0dXJuIG1pZGRsZTsKKwkJfQorCX0KKworCSpleGFjdF9tYXRjaCA9IDA7CisJcmV0dXJuIHJpZ2h0OworfQorCisvKiByZXR1cm5zIC0xLWluZGV4IGlmIGFscmVhZHkgZXhpc3RzICovCitzdGF0aWMgaW50IGFkZF9lbnRyeShzdHJ1Y3QgcGF0aF9saXN0ICpsaXN0LCBjb25zdCBjaGFyICpwYXRoKQoreworCWludCBleGFjdF9tYXRjaDsKKwlpbnQgaW5kZXggPSBnZXRfZW50cnlfaW5kZXgobGlzdCwgcGF0aCwgJmV4YWN0X21hdGNoKTsKKworCWlmIChleGFjdF9tYXRjaCkKKwkJcmV0dXJuIC0xIC0gaW5kZXg7CisKKwlpZiAobGlzdC0+bnIgKyAxID49IGxpc3QtPmFsbG9jKSB7CisJCWxpc3QtPmFsbG9jICs9IDMyOworCQlsaXN0LT5pdGVtcyA9IHhyZWFsbG9jKGxpc3QtPml0ZW1zLCBsaXN0LT5hbGxvYworCQkJCSogc2l6ZW9mKHN0cnVjdCBwYXRoX2xpc3RfaXRlbSkpOworCX0KKwlpZiAoaW5kZXggPCBsaXN0LT5ucikKKwkJbWVtbW92ZShsaXN0LT5pdGVtcyArIGluZGV4ICsgMSwgbGlzdC0+aXRlbXMgKyBpbmRleCwKKwkJCQkobGlzdC0+bnIgLSBpbmRleCkKKwkJCQkqIHNpemVvZihzdHJ1Y3QgcGF0aF9saXN0X2l0ZW0pKTsKKwlsaXN0LT5pdGVtc1tpbmRleF0ucGF0aCA9IGxpc3QtPnN0cmR1cF9wYXRocyA/CisJCXhzdHJkdXAocGF0aCkgOiAoY2hhciAqKXBhdGg7CisJbGlzdC0+aXRlbXNbaW5kZXhdLnV0aWwgPSBOVUxMOworCWxpc3QtPm5yKys7CisKKwlyZXR1cm4gaW5kZXg7Cit9CisKK3N0cnVjdCBwYXRoX2xpc3RfaXRlbSAqcGF0aF9saXN0X2luc2VydChjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgcGF0aF9saXN0ICpsaXN0KQoreworCWludCBpbmRleCA9IGFkZF9lbnRyeShsaXN0LCBwYXRoKTsKKworCWlmIChpbmRleCA8IDApCisJCWluZGV4ID0gLTEgLSBpbmRleDsKKworCXJldHVybiBsaXN0LT5pdGVtcyArIGluZGV4OworfQorCitpbnQgcGF0aF9saXN0X2hhc19wYXRoKGNvbnN0IHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IGV4YWN0X21hdGNoOworCWdldF9lbnRyeV9pbmRleChsaXN0LCBwYXRoLCAmZXhhY3RfbWF0Y2gpOworCXJldHVybiBleGFjdF9tYXRjaDsKK30KKworc3RydWN0IHBhdGhfbGlzdF9pdGVtICpwYXRoX2xpc3RfbG9va3VwKGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QpCit7CisJaW50IGV4YWN0X21hdGNoLCBpID0gZ2V0X2VudHJ5X2luZGV4KGxpc3QsIHBhdGgsICZleGFjdF9tYXRjaCk7CisJaWYgKCFleGFjdF9tYXRjaCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGxpc3QtPml0ZW1zICsgaTsKK30KKwordm9pZCBwYXRoX2xpc3RfY2xlYXIoc3RydWN0IHBhdGhfbGlzdCAqbGlzdCwgaW50IGZyZWVfdXRpbCkKK3sKKwlpZiAobGlzdC0+aXRlbXMpIHsKKwkJaW50IGk7CisJCWlmIChsaXN0LT5zdHJkdXBfcGF0aHMpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBsaXN0LT5ucjsgaSsrKQorCQkJCWZyZWUobGlzdC0+aXRlbXNbaV0ucGF0aCk7CisJCX0KKwkJaWYgKGZyZWVfdXRpbCkgeworCQkJZm9yIChpID0gMDsgaSA8IGxpc3QtPm5yOyBpKyspCisJCQkJZnJlZShsaXN0LT5pdGVtc1tpXS51dGlsKTsKKwkJfQorCQlmcmVlKGxpc3QtPml0ZW1zKTsKKwl9CisJbGlzdC0+aXRlbXMgPSBOVUxMOworCWxpc3QtPm5yID0gbGlzdC0+YWxsb2MgPSAwOworfQorCit2b2lkIHByaW50X3BhdGhfbGlzdChjb25zdCBjaGFyICp0ZXh0LCBjb25zdCBzdHJ1Y3QgcGF0aF9saXN0ICpwKQoreworCWludCBpOworCWlmICggdGV4dCApCisJCXByaW50ZigiJXNcbiIsIHRleHQpOworCWZvciAoaSA9IDA7IGkgPCBwLT5ucjsgaSsrKQorCQlwcmludGYoIiVzOiVwXG4iLCBwLT5pdGVtc1tpXS5wYXRoLCBwLT5pdGVtc1tpXS51dGlsKTsKK30KKworc3RydWN0IHBhdGhfbGlzdF9pdGVtICpwYXRoX2xpc3RfYXBwZW5kKGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QpCit7CisJQUxMT0NfR1JPVyhsaXN0LT5pdGVtcywgbGlzdC0+bnIgKyAxLCBsaXN0LT5hbGxvYyk7CisJbGlzdC0+aXRlbXNbbGlzdC0+bnJdLnBhdGggPQorCQlsaXN0LT5zdHJkdXBfcGF0aHMgPyB4c3RyZHVwKHBhdGgpIDogKGNoYXIgKilwYXRoOworCXJldHVybiBsaXN0LT5pdGVtcyArIGxpc3QtPm5yKys7Cit9CisKK3N0YXRpYyBpbnQgY21wX2l0ZW1zKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJY29uc3Qgc3RydWN0IHBhdGhfbGlzdF9pdGVtICpvbmUgPSBhOworCWNvbnN0IHN0cnVjdCBwYXRoX2xpc3RfaXRlbSAqdHdvID0gYjsKKwlyZXR1cm4gc3RyY21wKG9uZS0+cGF0aCwgdHdvLT5wYXRoKTsKK30KKwordm9pZCBzb3J0X3BhdGhfbGlzdChzdHJ1Y3QgcGF0aF9saXN0ICpsaXN0KQoreworCXFzb3J0KGxpc3QtPml0ZW1zLCBsaXN0LT5uciwgc2l6ZW9mKCpsaXN0LT5pdGVtcyksIGNtcF9pdGVtcyk7Cit9CisKK2ludCB1bnNvcnRlZF9wYXRoX2xpc3RfaGFzX3BhdGgoc3RydWN0IHBhdGhfbGlzdCAqbGlzdCwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbGlzdC0+bnI7IGkrKykKKwkJaWYgKCFzdHJjbXAocGF0aCwgbGlzdC0+aXRlbXNbaV0ucGF0aCkpCisJCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvcGF0aC1saXN0LmggYi9wYXRoLWxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTJjYmJhCi0tLSAvZGV2L251bGwKKysrIGIvcGF0aC1saXN0LmgKQEAgLTAsMCArMSwyOCBAQAorI2lmbmRlZiBQQVRIX0xJU1RfSAorI2RlZmluZSBQQVRIX0xJU1RfSAorCitzdHJ1Y3QgcGF0aF9saXN0X2l0ZW0geworCWNoYXIgKnBhdGg7CisJdm9pZCAqdXRpbDsKK307CitzdHJ1Y3QgcGF0aF9saXN0Cit7CisJc3RydWN0IHBhdGhfbGlzdF9pdGVtICppdGVtczsKKwl1bnNpZ25lZCBpbnQgbnIsIGFsbG9jOworCXVuc2lnbmVkIGludCBzdHJkdXBfcGF0aHM6MTsKK307CisKK3ZvaWQgcHJpbnRfcGF0aF9saXN0KGNvbnN0IGNoYXIgKnRleHQsIGNvbnN0IHN0cnVjdCBwYXRoX2xpc3QgKnApOwordm9pZCBwYXRoX2xpc3RfY2xlYXIoc3RydWN0IHBhdGhfbGlzdCAqbGlzdCwgaW50IGZyZWVfdXRpbCk7CisKKy8qIFVzZSB0aGVzZSBmdW5jdGlvbnMgb25seSBvbiBzb3J0ZWQgbGlzdHM6ICovCitpbnQgcGF0aF9saXN0X2hhc19wYXRoKGNvbnN0IHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QsIGNvbnN0IGNoYXIgKnBhdGgpOworc3RydWN0IHBhdGhfbGlzdF9pdGVtICpwYXRoX2xpc3RfaW5zZXJ0KGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QpOworc3RydWN0IHBhdGhfbGlzdF9pdGVtICpwYXRoX2xpc3RfbG9va3VwKGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QpOworCisvKiBVc2UgdGhlc2UgZnVuY3Rpb25zIG9ubHkgb24gdW5zb3J0ZWQgbGlzdHM6ICovCitzdHJ1Y3QgcGF0aF9saXN0X2l0ZW0gKnBhdGhfbGlzdF9hcHBlbmQoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IHBhdGhfbGlzdCAqbGlzdCk7Cit2b2lkIHNvcnRfcGF0aF9saXN0KHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QpOworaW50IHVuc29ydGVkX3BhdGhfbGlzdF9oYXNfcGF0aChzdHJ1Y3QgcGF0aF9saXN0ICpsaXN0LCBjb25zdCBjaGFyICpwYXRoKTsKKworI2VuZGlmIC8qIFBBVEhfTElTVF9IICovCmRpZmYgLS1naXQgYS9wYXRoLmMgYi9wYXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRlZDk3OQotLS0gL2Rldi9udWxsCisrKyBiL3BhdGguYwpAQCAtMCwwICsxLDM1NyBAQAorLyoKKyAqIEknbSB0aXJlZCBvZiBkb2luZyAidnNucHJpbnRmKCkiIGV0YyBqdXN0IHRvIG9wZW4gYQorICogZmlsZSwgc28gaGVyZSdzIGEgInJldHVybiBzdGF0aWMgYnVmZmVyIHdpdGggcHJpbnRmIgorICogaW50ZXJmYWNlIGZvciBwYXRocy4KKyAqCisgKiBJdCdzIG9idmlvdXNseSBub3QgdGhyZWFkLXNhZmUuIFN1ZSBtZS4gQnV0IGl0J3MgcXVpdGUKKyAqIHVzZWZ1bCBmb3IgZG9pbmcgdGhpbmdzIGxpa2UKKyAqCisgKiAgIGYgPSBvcGVuKG1rcGF0aCgiJXMvJXMuZ2l0IiwgYmFzZSwgbmFtZSksIE9fUkRPTkxZKTsKKyAqCisgKiB3aGljaCBpcyB3aGF0IGl0J3MgZGVzaWduZWQgZm9yLgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKworc3RhdGljIGNoYXIgYmFkX3BhdGhbXSA9ICIvYmFkLXBhdGgvIjsKKworc3RhdGljIGNoYXIgKmdldF9wYXRobmFtZSh2b2lkKQoreworCXN0YXRpYyBjaGFyIHBhdGhuYW1lX2FycmF5WzRdW1BBVEhfTUFYXTsKKwlzdGF0aWMgaW50IGluZGV4OworCXJldHVybiBwYXRobmFtZV9hcnJheVszICYgKytpbmRleF07Cit9CisKK3N0YXRpYyBjaGFyICpjbGVhbnVwX3BhdGgoY2hhciAqcGF0aCkKK3sKKwkvKiBDbGVhbiBpdCB1cCAqLworCWlmICghbWVtY21wKHBhdGgsICIuLyIsIDIpKSB7CisJCXBhdGggKz0gMjsKKwkJd2hpbGUgKCpwYXRoID09ICcvJykKKwkJCXBhdGgrKzsKKwl9CisJcmV0dXJuIHBhdGg7Cit9CisKK2NoYXIgKm1rcGF0aChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJdW5zaWduZWQgbGVuOworCWNoYXIgKnBhdGhuYW1lID0gZ2V0X3BhdGhuYW1lKCk7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWxlbiA9IHZzbnByaW50ZihwYXRobmFtZSwgUEFUSF9NQVgsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCWlmIChsZW4gPj0gUEFUSF9NQVgpCisJCXJldHVybiBiYWRfcGF0aDsKKwlyZXR1cm4gY2xlYW51cF9wYXRoKHBhdGhuYW1lKTsKK30KKworY2hhciAqZ2l0X3BhdGgoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJY29uc3QgY2hhciAqZ2l0X2RpciA9IGdldF9naXRfZGlyKCk7CisJY2hhciAqcGF0aG5hbWUgPSBnZXRfcGF0aG5hbWUoKTsKKwl2YV9saXN0IGFyZ3M7CisJdW5zaWduZWQgbGVuOworCisJbGVuID0gc3RybGVuKGdpdF9kaXIpOworCWlmIChsZW4gPiBQQVRIX01BWC0xMDApCisJCXJldHVybiBiYWRfcGF0aDsKKwltZW1jcHkocGF0aG5hbWUsIGdpdF9kaXIsIGxlbik7CisJaWYgKGxlbiAmJiBnaXRfZGlyW2xlbi0xXSAhPSAnLycpCisJCXBhdGhuYW1lW2xlbisrXSA9ICcvJzsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWxlbiArPSB2c25wcmludGYocGF0aG5hbWUgKyBsZW4sIFBBVEhfTUFYIC0gbGVuLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlpZiAobGVuID49IFBBVEhfTUFYKQorCQlyZXR1cm4gYmFkX3BhdGg7CisJcmV0dXJuIGNsZWFudXBfcGF0aChwYXRobmFtZSk7Cit9CisKKworLyogZ2l0X21rc3RlbXAoKSAtIGNyZWF0ZSB0bXAgZmlsZSBob25vcmluZyBUTVBESVIgdmFyaWFibGUgKi8KK2ludCBnaXRfbWtzdGVtcChjaGFyICpwYXRoLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICp0ZW1wbGF0ZSkKK3sKKwljb25zdCBjaGFyICp0bXA7CisJc2l6ZV90IG47CisKKwl0bXAgPSBnZXRlbnYoIlRNUERJUiIpOworCWlmICghdG1wKQorCQl0bXAgPSAiL3RtcCI7CisJbiA9IHNucHJpbnRmKHBhdGgsIGxlbiwgIiVzLyVzIiwgdG1wLCB0ZW1wbGF0ZSk7CisJaWYgKGxlbiA8PSBuKSB7CisJCWVycm5vID0gRU5BTUVUT09MT05HOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiBta3N0ZW1wKHBhdGgpOworfQorCisKK2ludCB2YWxpZGF0ZV9oZWFkcmVmKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJY2hhciAqYnVmLCBidWZmZXJbMjU2XTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWludCBsZW4sIGZkOworCisJaWYgKGxzdGF0KHBhdGgsICZzdCkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBNYWtlIHN1cmUgaXQgaXMgYSAicmVmcy8uLiIgc3ltbGluayAqLworCWlmIChTX0lTTE5LKHN0LnN0X21vZGUpKSB7CisJCWxlbiA9IHJlYWRsaW5rKHBhdGgsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciktMSk7CisJCWlmIChsZW4gPj0gNSAmJiAhbWVtY21wKCJyZWZzLyIsIGJ1ZmZlciwgNSkpCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogQW55dGhpbmcgZWxzZSwganVzdCBvcGVuIGl0IGFuZCB0cnkgdG8gc2VlIGlmIGl0IGlzIGEgc3ltYm9saWMgcmVmLgorCSAqLworCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCWxlbiA9IHJlYWRfaW5fZnVsbChmZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKS0xKTsKKwljbG9zZShmZCk7CisKKwkvKgorCSAqIElzIGl0IGEgc3ltYm9saWMgcmVmPworCSAqLworCWlmIChsZW4gPCA0KQorCQlyZXR1cm4gLTE7CisJaWYgKCFtZW1jbXAoInJlZjoiLCBidWZmZXIsIDQpKSB7CisJCWJ1ZiA9IGJ1ZmZlciArIDQ7CisJCWxlbiAtPSA0OworCQl3aGlsZSAobGVuICYmIGlzc3BhY2UoKmJ1ZikpCisJCQlidWYrKywgbGVuLS07CisJCWlmIChsZW4gPj0gNSAmJiAhbWVtY21wKCJyZWZzLyIsIGJ1ZiwgNSkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIElzIHRoaXMgYSBkZXRhY2hlZCBIRUFEPworCSAqLworCWlmICghZ2V0X3NoYTFfaGV4KGJ1ZmZlciwgc2hhMSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgY2hhciAqdXNlcl9wYXRoKGNoYXIgKmJ1ZiwgY2hhciAqcGF0aCwgaW50IHN6KQoreworCXN0cnVjdCBwYXNzd2QgKnB3OworCWNoYXIgKnNsYXNoOworCWludCBsZW4sIGJhc2VsZW47CisKKwlpZiAoIXBhdGggfHwgcGF0aFswXSAhPSAnficpCisJCXJldHVybiBOVUxMOworCXBhdGgrKzsKKwlzbGFzaCA9IHN0cmNocihwYXRoLCAnLycpOworCWlmIChwYXRoWzBdID09ICcvJyB8fCAhcGF0aFswXSkgeworCQlwdyA9IGdldHB3dWlkKGdldHVpZCgpKTsKKwl9CisJZWxzZSB7CisJCWlmIChzbGFzaCkgeworCQkJKnNsYXNoID0gMDsKKwkJCXB3ID0gZ2V0cHduYW0ocGF0aCk7CisJCQkqc2xhc2ggPSAnLyc7CisJCX0KKwkJZWxzZQorCQkJcHcgPSBnZXRwd25hbShwYXRoKTsKKwl9CisJaWYgKCFwdyB8fCAhcHctPnB3X2RpciB8fCBzeiA8PSBzdHJsZW4ocHctPnB3X2RpcikpCisJCXJldHVybiBOVUxMOworCWJhc2VsZW4gPSBzdHJsZW4ocHctPnB3X2Rpcik7CisJbWVtY3B5KGJ1ZiwgcHctPnB3X2RpciwgYmFzZWxlbik7CisJd2hpbGUgKCgxIDwgYmFzZWxlbikgJiYgKGJ1ZltiYXNlbGVuLTFdID09ICcvJykpIHsKKwkJYnVmW2Jhc2VsZW4tMV0gPSAwOworCQliYXNlbGVuLS07CisJfQorCWlmIChzbGFzaCAmJiBzbGFzaFsxXSkgeworCQlsZW4gPSBzdHJsZW4oc2xhc2gpOworCQlpZiAoc3ogPD0gYmFzZWxlbiArIGxlbikKKwkJCXJldHVybiBOVUxMOworCQltZW1jcHkoYnVmICsgYmFzZWxlbiwgc2xhc2gsIGxlbiArIDEpOworCX0KKwlyZXR1cm4gYnVmOworfQorCisvKgorICogRmlyc3QsIG9uZSBkaXJlY3RvcnkgdG8gdHJ5IGlzIGRldGVybWluZWQgYnkgdGhlIGZvbGxvd2luZyBhbGdvcml0aG0uCisgKgorICogKDApIElmICJzdHJpY3QiIGlzIGdpdmVuLCB0aGUgcGF0aCBpcyB1c2VkIGFzIGdpdmVuIGFuZCBubyBEV0lNIGlzCisgKiAgICAgZG9uZS4gT3RoZXJ3aXNlOgorICogKDEpICJ+L3BhdGgiIHRvIG1lYW4gcGF0aCB1bmRlciB0aGUgcnVubmluZyB1c2VyJ3MgaG9tZSBkaXJlY3Rvcnk7CisgKiAoMikgIn51c2VyL3BhdGgiIHRvIG1lYW4gcGF0aCB1bmRlciBuYW1lZCB1c2VyJ3MgaG9tZSBkaXJlY3Rvcnk7CisgKiAoMykgInJlbGF0aXZlL3BhdGgiIHRvIG1lYW4gY3dkIHJlbGF0aXZlIGRpcmVjdG9yeTsgb3IKKyAqICg0KSAiL2Fic29sdXRlL3BhdGgiIHRvIG1lYW4gYWJzb2x1dGUgZGlyZWN0b3J5LgorICoKKyAqIFVubGVzcyAic3RyaWN0IiBpcyBnaXZlbiwgd2UgdHJ5IGFjY2VzcygpIGZvciBleGlzdGVuY2Ugb2YgIiVzLmdpdC8uZ2l0IiwKKyAqICIlcy8uZ2l0IiwgIiVzLmdpdCIsICIlcyIgaW4gdGhpcyBvcmRlci4gIFRoZSBmaXJzdCBvbmUgdGhhdCBleGlzdHMgaXMKKyAqIHdoYXQgd2UgdHJ5LgorICoKKyAqIFNlY29uZCwgd2UgdHJ5IGNoZGlyKCkgdG8gdGhhdC4gIFVwb24gZmFpbHVyZSwgd2UgcmV0dXJuIE5VTEwuCisgKgorICogVGhlbiwgd2UgdHJ5IGlmIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBhIHZhbGlkIGdpdCByZXBvc2l0b3J5LgorICogVXBvbiBmYWlsdXJlLCB3ZSByZXR1cm4gTlVMTC4KKyAqCisgKiBJZiBhbGwgZ29lcyB3ZWxsLCB3ZSByZXR1cm4gdGhlIGRpcmVjdG9yeSB3ZSB1c2VkIHRvIGNoZGlyKCkgKGJ1dAorICogYmVmb3JlIH51c2VyIGlzIGV4cGFuZGVkKSwgYXZvaWRpbmcgZ2V0Y3dkKCkgcmVzb2x2aW5nIHN5bWJvbGljCisgKiBsaW5rcy4gIFVzZXIgcmVsYXRpdmUgcGF0aHMgYXJlIGFsc28gcmV0dXJuZWQgYXMgdGhleSBhcmUgZ2l2ZW4sCisgKiBleGNlcHQgRFdJTSBzdWZmaXhpbmcuCisgKi8KK2NoYXIgKmVudGVyX3JlcG8oY2hhciAqcGF0aCwgaW50IHN0cmljdCkKK3sKKwlzdGF0aWMgY2hhciB1c2VkX3BhdGhbUEFUSF9NQVhdOworCXN0YXRpYyBjaGFyIHZhbGlkYXRlZF9wYXRoW1BBVEhfTUFYXTsKKworCWlmICghcGF0aCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIXN0cmljdCkgeworCQlzdGF0aWMgY29uc3QgY2hhciAqc3VmZml4W10gPSB7CisJCQkiLmdpdC8uZ2l0IiwgIi8uZ2l0IiwgIi5naXQiLCAiIiwgTlVMTCwKKwkJfTsKKwkJaW50IGxlbiA9IHN0cmxlbihwYXRoKTsKKwkJaW50IGk7CisJCXdoaWxlICgoMSA8IGxlbikgJiYgKHBhdGhbbGVuLTFdID09ICcvJykpIHsKKwkJCXBhdGhbbGVuLTFdID0gMDsKKwkJCWxlbi0tOworCQl9CisJCWlmIChQQVRIX01BWCA8PSBsZW4pCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKHBhdGhbMF0gPT0gJ34nKSB7CisJCQlpZiAoIXVzZXJfcGF0aCh1c2VkX3BhdGgsIHBhdGgsIFBBVEhfTUFYKSkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCXN0cmNweSh2YWxpZGF0ZWRfcGF0aCwgcGF0aCk7CisJCQlwYXRoID0gdXNlZF9wYXRoOworCQl9CisJCWVsc2UgaWYgKFBBVEhfTUFYIC0gMTAgPCBsZW4pCisJCQlyZXR1cm4gTlVMTDsKKwkJZWxzZSB7CisJCQlwYXRoID0gc3RyY3B5KHVzZWRfcGF0aCwgcGF0aCk7CisJCQlzdHJjcHkodmFsaWRhdGVkX3BhdGgsIHBhdGgpOworCQl9CisJCWxlbiA9IHN0cmxlbihwYXRoKTsKKwkJZm9yIChpID0gMDsgc3VmZml4W2ldOyBpKyspIHsKKwkJCXN0cmNweShwYXRoICsgbGVuLCBzdWZmaXhbaV0pOworCQkJaWYgKCFhY2Nlc3MocGF0aCwgRl9PSykpIHsKKwkJCQlzdHJjYXQodmFsaWRhdGVkX3BhdGgsIHN1ZmZpeFtpXSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCFzdWZmaXhbaV0gfHwgY2hkaXIocGF0aCkpCisJCQlyZXR1cm4gTlVMTDsKKwkJcGF0aCA9IHZhbGlkYXRlZF9wYXRoOworCX0KKwllbHNlIGlmIChjaGRpcihwYXRoKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoYWNjZXNzKCJvYmplY3RzIiwgWF9PSykgPT0gMCAmJiBhY2Nlc3MoInJlZnMiLCBYX09LKSA9PSAwICYmCisJICAgIHZhbGlkYXRlX2hlYWRyZWYoIkhFQUQiKSA9PSAwKSB7CisJCXNldGVudihHSVRfRElSX0VOVklST05NRU5ULCAiLiIsIDEpOworCQljaGVja19yZXBvc2l0b3J5X2Zvcm1hdCgpOworCQlyZXR1cm4gcGF0aDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IGFkanVzdF9zaGFyZWRfcGVybShjb25zdCBjaGFyICpwYXRoKQoreworCXN0cnVjdCBzdGF0IHN0OworCWludCBtb2RlOworCisJaWYgKCFzaGFyZWRfcmVwb3NpdG9yeSkKKwkJcmV0dXJuIDA7CisJaWYgKGxzdGF0KHBhdGgsICZzdCkgPCAwKQorCQlyZXR1cm4gLTE7CisJbW9kZSA9IHN0LnN0X21vZGU7CisJaWYgKG1vZGUgJiBTX0lSVVNSKQorCQltb2RlIHw9IChzaGFyZWRfcmVwb3NpdG9yeSA9PSBQRVJNX0dST1VQCisJCQkgPyBTX0lSR1JQCisJCQkgOiAoc2hhcmVkX3JlcG9zaXRvcnkgPT0gUEVSTV9FVkVSWUJPRFkKKwkJCSAgICA/IChTX0lSR1JQfFNfSVJPVEgpCisJCQkgICAgOiAwKSk7CisKKwlpZiAobW9kZSAmIFNfSVdVU1IpCisJCW1vZGUgfD0gU19JV0dSUDsKKworCWlmIChtb2RlICYgU19JWFVTUikKKwkJbW9kZSB8PSAoc2hhcmVkX3JlcG9zaXRvcnkgPT0gUEVSTV9HUk9VUAorCQkJID8gU19JWEdSUAorCQkJIDogKHNoYXJlZF9yZXBvc2l0b3J5ID09IFBFUk1fRVZFUllCT0RZCisJCQkgICAgPyAoU19JWEdSUHxTX0lYT1RIKQorCQkJICAgIDogMCkpOworCWlmIChTX0lTRElSKG1vZGUpKQorCQltb2RlIHw9IEZPUkNFX0RJUl9TRVRfR0lEOworCWlmICgobW9kZSAmIHN0LnN0X21vZGUpICE9IG1vZGUgJiYgY2htb2QocGF0aCwgbW9kZSkgPCAwKQorCQlyZXR1cm4gLTI7CisJcmV0dXJuIDA7Cit9CisKKy8qIFdlIGFsbG93ICJyZWN1cnNpdmUiIHN5bWJvbGljIGxpbmtzLiBPbmx5IHdpdGhpbiByZWFzb24sIHRob3VnaC4gKi8KKyNkZWZpbmUgTUFYREVQVEggNQorCitjb25zdCBjaGFyICptYWtlX2Fic29sdXRlX3BhdGgoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdGF0aWMgY2hhciBidWZzWzJdW1BBVEhfTUFYICsgMV0sICpidWYgPSBidWZzWzBdLCAqbmV4dF9idWYgPSBidWZzWzFdOworCWNoYXIgY3dkWzEwMjRdID0gIiI7CisJaW50IGJ1Zl9pbmRleCA9IDEsIGxlbjsKKworCWludCBkZXB0aCA9IE1BWERFUFRIOworCWNoYXIgKmxhc3RfZWxlbSA9IE5VTEw7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAoc3RybGNweShidWYsIHBhdGgsIFBBVEhfTUFYKSA+PSBQQVRIX01BWCkKKwkJZGllICgiVG9vIGxvbmcgcGF0aDogJS4qcyIsIDYwLCBwYXRoKTsKKworCXdoaWxlIChkZXB0aC0tKSB7CisJCWlmIChzdGF0KGJ1ZiwgJnN0KSB8fCAhU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJY2hhciAqbGFzdF9zbGFzaCA9IHN0cnJjaHIoYnVmLCAnLycpOworCQkJaWYgKGxhc3Rfc2xhc2gpIHsKKwkJCQkqbGFzdF9zbGFzaCA9ICdcMCc7CisJCQkJbGFzdF9lbGVtID0geHN0cmR1cChsYXN0X3NsYXNoICsgMSk7CisJCQl9IGVsc2UgeworCQkJCWxhc3RfZWxlbSA9IHhzdHJkdXAoYnVmKTsKKwkJCQkqYnVmID0gJ1wwJzsKKwkJCX0KKwkJfQorCisJCWlmICgqYnVmKSB7CisJCQlpZiAoISpjd2QgJiYgIWdldGN3ZChjd2QsIHNpemVvZihjd2QpKSkKKwkJCQlkaWUgKCJDb3VsZCBub3QgZ2V0IGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkiKTsKKworCQkJaWYgKGNoZGlyKGJ1ZikpCisJCQkJZGllICgiQ291bGQgbm90IHN3aXRjaCB0byAnJXMnIiwgYnVmKTsKKwkJfQorCQlpZiAoIWdldGN3ZChidWYsIFBBVEhfTUFYKSkKKwkJCWRpZSAoIkNvdWxkIG5vdCBnZXQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSIpOworCisJCWlmIChsYXN0X2VsZW0pIHsKKwkJCWludCBsZW4gPSBzdHJsZW4oYnVmKTsKKwkJCWlmIChsZW4gKyBzdHJsZW4obGFzdF9lbGVtKSArIDIgPiBQQVRIX01BWCkKKwkJCQlkaWUgKCJUb28gbG9uZyBwYXRoIG5hbWU6ICclcy8lcyciLAorCQkJCQkJYnVmLCBsYXN0X2VsZW0pOworCQkJYnVmW2xlbl0gPSAnLyc7CisJCQlzdHJjcHkoYnVmICsgbGVuICsgMSwgbGFzdF9lbGVtKTsKKwkJCWZyZWUobGFzdF9lbGVtKTsKKwkJCWxhc3RfZWxlbSA9IE5VTEw7CisJCX0KKworCQlpZiAoIWxzdGF0KGJ1ZiwgJnN0KSAmJiBTX0lTTE5LKHN0LnN0X21vZGUpKSB7CisJCQlsZW4gPSByZWFkbGluayhidWYsIG5leHRfYnVmLCBQQVRIX01BWCk7CisJCQlpZiAobGVuIDwgMCkKKwkJCQlkaWUgKCJJbnZhbGlkIHN5bWxpbms6ICVzIiwgYnVmKTsKKwkJCW5leHRfYnVmW2xlbl0gPSAnXDAnOworCQkJYnVmID0gbmV4dF9idWY7CisJCQlidWZfaW5kZXggPSAxIC0gYnVmX2luZGV4OworCQkJbmV4dF9idWYgPSBidWZzW2J1Zl9pbmRleF07CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCisJaWYgKCpjd2QgJiYgY2hkaXIoY3dkKSkKKwkJZGllICgiQ291bGQgbm90IGNoYW5nZSBiYWNrIHRvICclcyciLCBjd2QpOworCisJcmV0dXJuIGJ1ZjsKK30KZGlmZiAtLWdpdCBhL3BlcmwvLmdpdGlnbm9yZSBiL3BlcmwvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGIyNDc3Ci0tLSAvZGV2L251bGwKKysrIGIvcGVybC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNSBAQAorcGVybC5tYWsKK3BlcmwubWFrLm9sZAorYmxpYgorYmxpYmRpcnMKK3BtX3RvX2JsaWIKZGlmZiAtLWdpdCBhL3BlcmwvR2l0LnBtIGIvcGVybC9HaXQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI4MTJlYQotLS0gL2Rldi9udWxsCisrKyBiL3BlcmwvR2l0LnBtCkBAIC0wLDAgKzEsOTUwIEBACis9aGVhZDEgTkFNRQorCitHaXQgLSBQZXJsIGludGVyZmFjZSB0byB0aGUgR2l0IHZlcnNpb24gY29udHJvbCBzeXN0ZW0KKworPWN1dAorCisKK3BhY2thZ2UgR2l0OworCit1c2Ugc3RyaWN0OworCisKK0JFR0lOIHsKKworb3VyICgkVkVSU0lPTiwgQElTQSwgQEVYUE9SVCwgQEVYUE9SVF9PSyk7CisKKyMgVG90YWxseSB1bnN0YWJsZSBBUEkuCiskVkVSU0lPTiA9ICcwLjAxJzsKKworCis9aGVhZDEgU1lOT1BTSVMKKworICB1c2UgR2l0OworCisgIG15ICR2ZXJzaW9uID0gR2l0Ojpjb21tYW5kX29uZWxpbmUoJ3ZlcnNpb24nKTsKKworICBnaXRfY21kX3RyeSB7IEdpdDo6Y29tbWFuZF9ub2lzeSgndXBkYXRlLXNlcnZlci1pbmZvJykgfQorICAgICAgICAgICAgICAnJXMgZmFpbGVkIHcvIGNvZGUgJWQnOworCisgIG15ICRyZXBvID0gR2l0LT5yZXBvc2l0b3J5IChEaXJlY3RvcnkgPT4gJy9zcnYvZ2l0L2NvZ2l0by5naXQnKTsKKworCisgIG15IEByZXZzID0gJHJlcG8tPmNvbW1hbmQoJ3Jldi1saXN0JywgJy0tc2luY2U9bGFzdCBtb25kYXknLCAnLS1hbGwnKTsKKworICBteSAoJGZoLCAkYykgPSAkcmVwby0+Y29tbWFuZF9vdXRwdXRfcGlwZSgncmV2LWxpc3QnLCAnLS1zaW5jZT1sYXN0IG1vbmRheScsICctLWFsbCcpOworICBteSAkbGFzdHJldiA9IDwkZmg+OyBjaG9tcCAkbGFzdHJldjsKKyAgJHJlcG8tPmNvbW1hbmRfY2xvc2VfcGlwZSgkZmgsICRjKTsKKworICBteSAkbGFzdHJldiA9ICRyZXBvLT5jb21tYW5kX29uZWxpbmUoIFsgJ3Jldi1saXN0JywgJy0tYWxsJyBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUREVSUiA9PiAwICk7CisKKz1jdXQKKworCityZXF1aXJlIEV4cG9ydGVyOworCitASVNBID0gcXcoRXhwb3J0ZXIpOworCitARVhQT1JUID0gcXcoZ2l0X2NtZF90cnkpOworCisjIE1ldGhvZHMgd2hpY2ggY2FuIGJlIGNhbGxlZCBhcyBzdGFuZGFsb25lIGZ1bmN0aW9ucyBhcyB3ZWxsOgorQEVYUE9SVF9PSyA9IHF3KGNvbW1hbmQgY29tbWFuZF9vbmVsaW5lIGNvbW1hbmRfbm9pc3kKKyAgICAgICAgICAgICAgICBjb21tYW5kX291dHB1dF9waXBlIGNvbW1hbmRfaW5wdXRfcGlwZSBjb21tYW5kX2Nsb3NlX3BpcGUKKyAgICAgICAgICAgICAgICB2ZXJzaW9uIGV4ZWNfcGF0aCBoYXNoX29iamVjdCBnaXRfY21kX3RyeSk7CisKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIHByb3ZpZGVzIFBlcmwgc2NyaXB0cyBlYXN5IHdheSB0byBpbnRlcmZhY2UgdGhlIEdpdCB2ZXJzaW9uIGNvbnRyb2wKK3N5c3RlbS4gVGhlIG1vZHVsZXMgaGF2ZSBhbiBlYXN5IGFuZCB3ZWxsLXRlc3RlZCB3YXkgdG8gY2FsbCBhcmJpdHJhcnkgR2l0Citjb21tYW5kczsgaW4gdGhlIGZ1dHVyZSwgdGhlIGludGVyZmFjZSB3aWxsIGFsc28gcHJvdmlkZSBzcGVjaWFsaXplZCBtZXRob2RzCitmb3IgZG9pbmcgZWFzaWx5IG9wZXJhdGlvbnMgd2hpY2ggYXJlIG5vdCB0b3RhbGx5IHRyaXZpYWwgdG8gZG8gb3ZlcgordGhlIGdlbmVyaWMgY29tbWFuZCBpbnRlcmZhY2UuCisKK1doaWxlIHNvbWUgY29tbWFuZHMgY2FuIGJlIGV4ZWN1dGVkIG91dHNpZGUgb2YgYW55IGNvbnRleHQgKGUuZy4gJ3ZlcnNpb24nCitvciAnaW5pdCcpLCBtb3N0IG9wZXJhdGlvbnMgcmVxdWlyZSBhIHJlcG9zaXRvcnkgY29udGV4dCwgd2hpY2ggaW4gcHJhY3RpY2UKK21lYW5zIGdldHRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhlIEdpdCBvYmplY3QgdXNpbmcgdGhlIHJlcG9zaXRvcnkoKSBjb25zdHJ1Y3Rvci4KKyhJbiB0aGUgZnV0dXJlLCB3ZSB3aWxsIGFsc28gZ2V0IGEgbmV3X3JlcG9zaXRvcnkoKSBjb25zdHJ1Y3Rvci4pIEFsbCBjb21tYW5kcworY2FsbGVkIGFzIG1ldGhvZHMgb2YgdGhlIG9iamVjdCBhcmUgdGhlbiBleGVjdXRlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUKK3JlcG9zaXRvcnkuCisKK1BhcnQgb2YgdGhlICJyZXBvc2l0b3J5IHN0YXRlIiBpcyBhbHNvIGluZm9ybWF0aW9uIGFib3V0IHBhdGggdG8gdGhlIGF0dGFjaGVkCit3b3JraW5nIGNvcHkgKHVubGVzcyB5b3Ugd29yayB3aXRoIGEgYmFyZSByZXBvc2l0b3J5KS4gWW91IGNhbiBhbHNvIG5hdmlnYXRlCitpbnNpZGUgb2YgdGhlIHdvcmtpbmcgY29weSB1c2luZyB0aGUgQzx3Y19jaGRpcigpPiBtZXRob2QuIChOb3RlIHRoYXQKK3RoZSByZXBvc2l0b3J5IG9iamVjdCBpcyBzZWxmLWNvbnRhaW5lZCBhbmQgd2lsbCBub3QgY2hhbmdlIHdvcmtpbmcgZGlyZWN0b3J5CitvZiB5b3VyIHByb2Nlc3MuKQorCitUT0RPOiBJbiB0aGUgZnV0dXJlLCB3ZSBtaWdodCBhbHNvIGRvCisKKwlteSAkcmVtb3RlcmVwbyA9ICRyZXBvLT5yZW1vdGVfcmVwb3NpdG9yeSAoTmFtZSA9PiAnY29naXRvJywgQnJhbmNoID0+ICdtYXN0ZXInKTsKKwkkcmVtb3RlcmVwbyB8fD0gR2l0LT5yZW1vdGVfcmVwb3NpdG9yeSAoJ2h0dHA6Ly9naXQub3IuY3ovY29naXRvLmdpdC8nKTsKKwlteSBAcmVmcyA9ICRyZW1vdGVyZXBvLT5yZWZzKCk7CisKK0N1cnJlbnRseSwgdGhlIG1vZHVsZSBtZXJlbHkgd3JhcHMgY2FsbHMgdG8gZXh0ZXJuYWwgR2l0IHRvb2xzLiBJbiB0aGUgZnV0dXJlLAoraXQgd2lsbCBwcm92aWRlIGEgbXVjaCBmYXN0ZXIgd2F5IHRvIGludGVyYWN0IHdpdGggR2l0IGJ5IGxpbmtpbmcgZGlyZWN0bHkKK3RvIGxpYmdpdC4gVGhpcyBzaG91bGQgYmUgY29tcGxldGVseSBvcGFxdWUgdG8gdGhlIHVzZXIsIHRob3VnaCAocGVyZm9ybWFuY2UKK2luY3JlYXRlIG5vbndpdGhzdGFuZGluZykuCisKKz1jdXQKKworCit1c2UgQ2FycCBxdyhjYXJwIGNyb2FrKTsgIyBidXQgY3JvYWsgaXMgYmFkIC0gdGhyb3cgaW5zdGVhZAordXNlIEVycm9yIHF3KDp0cnkpOwordXNlIEN3ZCBxdyhhYnNfcGF0aCk7CisKK30KKworCis9aGVhZDEgQ09OU1RSVUNUT1JTCisKKz1vdmVyIDQKKworPWl0ZW0gcmVwb3NpdG9yeSAoIE9QVElPTlMgKQorCis9aXRlbSByZXBvc2l0b3J5ICggRElSRUNUT1JZICkKKworPWl0ZW0gcmVwb3NpdG9yeSAoKQorCitDb25zdHJ1Y3QgYSBuZXcgcmVwb3NpdG9yeSBvYmplY3QuCitDPE9QVElPTlM+IGFyZSBwYXNzZWQgaW4gYSBoYXNoIGxpa2UgZmFzaGlvbiwgdXNpbmcga2V5IGFuZCB2YWx1ZSBwYWlycy4KK1Bvc3NpYmxlIG9wdGlvbnMgYXJlOgorCitCPFJlcG9zaXRvcnk+IC0gUGF0aCB0byB0aGUgR2l0IHJlcG9zaXRvcnkuCisKK0I8V29ya2luZ0NvcHk+IC0gUGF0aCB0byB0aGUgYXNzb2NpYXRlZCB3b3JraW5nIGNvcHk7IG5vdCBzdHJpY3RseSByZXF1aXJlZAorYXMgbWFueSBjb21tYW5kcyB3aWxsIGhhcHBpbHkgY3J1bmNoIG9uIGEgYmFyZSByZXBvc2l0b3J5LgorCitCPFdvcmtpbmdTdWJkaXI+IC0gU3ViZGlyZWN0b3J5IGluIHRoZSB3b3JraW5nIGNvcHkgdG8gd29yayBpbnNpZGUuCitKdXN0IGxlZnQgdW5kZWZpbmVkIGlmIHlvdSBkbyBub3Qgd2FudCB0byBsaW1pdCB0aGUgc2NvcGUgb2Ygb3BlcmF0aW9ucy4KKworQjxEaXJlY3Rvcnk+IC0gUGF0aCB0byB0aGUgR2l0IHdvcmtpbmcgZGlyZWN0b3J5IGluIGl0cyB1c3VhbCBzZXR1cC4KK1RoZSBDPC5naXQ+IGRpcmVjdG9yeSBpcyBzZWFyY2hlZCBpbiB0aGUgZGlyZWN0b3J5IGFuZCBhbGwgdGhlIHBhcmVudAorZGlyZWN0b3JpZXM7IGlmIGZvdW5kLCBDPFdvcmtpbmdDb3B5PiBpcyBzZXQgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nCitpdCBhbmQgQzxSZXBvc2l0b3J5PiB0byB0aGUgQzwuZ2l0PiBkaXJlY3RvcnkgaXRzZWxmLiBJZiBubyBDPC5naXQ+CitkaXJlY3Rvcnkgd2FzIGZvdW5kLCB0aGUgQzxEaXJlY3Rvcnk+IGlzIGFzc3VtZWQgdG8gYmUgYSBiYXJlIHJlcG9zaXRvcnksCitDPFJlcG9zaXRvcnk+IGlzIHNldCB0byBwb2ludCBhdCBpdCBhbmQgQzxXb3JraW5nQ29weT4gaXMgbGVmdCB1bmRlZmluZWQuCitJZiB0aGUgQzwkR0lUX0RJUj4gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LCB0aGluZ3MgYmVoYXZlIGFzIGV4cGVjdGVkCithcyB3ZWxsLgorCitZb3Ugc2hvdWxkIG5vdCB1c2UgYm90aCBDPERpcmVjdG9yeT4gYW5kIGVpdGhlciBvZiBDPFJlcG9zaXRvcnk+IGFuZAorQzxXb3JraW5nQ29weT4gLSB0aGUgcmVzdWx0cyBvZiB0aGF0IGFyZSB1bmRlZmluZWQuCisKK0FsdGVybmF0aXZlbHksIGEgZGlyZWN0b3J5IHBhdGggbWF5IGJlIHBhc3NlZCBhcyBhIHNpbmdsZSBzY2FsYXIgYXJndW1lbnQKK3RvIHRoZSBjb25zdHJ1Y3RvcjsgaXQgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIG9ubHkgdGhlIEM8RGlyZWN0b3J5PiBvcHRpb24KK2ZpZWxkLgorCitDYWxsaW5nIHRoZSBjb25zdHJ1Y3RvciB3aXRoIG5vIG9wdGlvbnMgd2hhdHNvZXZlciBpcyBlcXVpdmFsZW50IHRvCitjYWxsaW5nIGl0IHdpdGggQzw8IERpcmVjdG9yeSA9PiAnLicgPj4uIEluIGdlbmVyYWwsIGlmIHlvdSBhcmUgYnVpbGRpbmcKK2Egc3RhbmRhcmQgcG9yY2VsYWluIGNvbW1hbmQsIHNpbXBseSBkb2luZyBDPDwgR2l0LT5yZXBvc2l0b3J5KCkgPj4gc2hvdWxkCitkbyB0aGUgcmlnaHQgdGhpbmcgYW5kIHNldHVwIHRoZSBvYmplY3QgdG8gcmVmbGVjdCBleGFjdGx5IHdoZXJlIHRoZSB1c2VyCitpcyByaWdodCBub3cuCisKKz1jdXQKKworc3ViIHJlcG9zaXRvcnkgeworCW15ICRjbGFzcyA9IHNoaWZ0OworCW15IEBhcmdzID0gQF87CisJbXkgJW9wdHMgPSAoKTsKKwlteSAkc2VsZjsKKworCWlmIChkZWZpbmVkICRhcmdzWzBdKSB7CisJCWlmICgkI2FyZ3MgJSAyICE9IDEpIHsKKwkJCSMgTm90IGEgaGFzaC4KKwkJCSQjYXJncyA9PSAwIG9yIHRocm93IEVycm9yOjpTaW1wbGUoImJhZCB1c2FnZSIpOworCQkJJW9wdHMgPSAoIERpcmVjdG9yeSA9PiAkYXJnc1swXSApOworCQl9IGVsc2UgeworCQkJJW9wdHMgPSBAYXJnczsKKwkJfQorCX0KKworCWlmIChub3QgZGVmaW5lZCAkb3B0c3tSZXBvc2l0b3J5fSBhbmQgbm90IGRlZmluZWQgJG9wdHN7V29ya2luZ0NvcHl9KSB7CisJCSRvcHRze0RpcmVjdG9yeX0gfHw9ICcuJzsKKwl9CisKKwlpZiAoJG9wdHN7RGlyZWN0b3J5fSkgeworCQktZCAkb3B0c3tEaXJlY3Rvcnl9IG9yIHRocm93IEVycm9yOjpTaW1wbGUoIkRpcmVjdG9yeSBub3QgZm91bmQ6ICQhIik7CisKKwkJbXkgJHNlYXJjaCA9IEdpdC0+cmVwb3NpdG9yeShXb3JraW5nQ29weSA9PiAkb3B0c3tEaXJlY3Rvcnl9KTsKKwkJbXkgJGRpcjsKKwkJdHJ5IHsKKwkJCSRkaXIgPSAkc2VhcmNoLT5jb21tYW5kX29uZWxpbmUoWydyZXYtcGFyc2UnLCAnLS1naXQtZGlyJ10sCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUREVSUiA9PiAwKTsKKwkJfSBjYXRjaCBHaXQ6OkVycm9yOjpDb21tYW5kIHdpdGggeworCQkJJGRpciA9IHVuZGVmOworCQl9OworCisJCWlmICgkZGlyKSB7CisJCQkkZGlyID1+IG0jXi8jIG9yICRkaXIgPSAkb3B0c3tEaXJlY3Rvcnl9IC4gJy8nIC4gJGRpcjsKKwkJCSRvcHRze1JlcG9zaXRvcnl9ID0gJGRpcjsKKworCQkJIyBJZiAtLWdpdC1kaXIgd2VudCBvaywgdGhpcyBzaG91bGRuJ3QgZGllIGVpdGhlci4KKwkJCW15ICRwcmVmaXggPSAkc2VhcmNoLT5jb21tYW5kX29uZWxpbmUoJ3Jldi1wYXJzZScsICctLXNob3ctcHJlZml4Jyk7CisJCQkkZGlyID0gYWJzX3BhdGgoJG9wdHN7RGlyZWN0b3J5fSkgLiAnLyc7CisJCQlpZiAoJHByZWZpeCkgeworCQkJCWlmIChzdWJzdHIoJGRpciwgLWxlbmd0aCgkcHJlZml4KSkgbmUgJHByZWZpeCkgeworCQkJCQl0aHJvdyBFcnJvcjo6U2ltcGxlKCJyZXYtcGFyc2UgY29uZnVzZWQgbWUgLSAkZGlyIGRvZXMgbm90IGhhdmUgdHJhaWxpbmcgJHByZWZpeCIpOworCQkJCX0KKwkJCQlzdWJzdHIoJGRpciwgLWxlbmd0aCgkcHJlZml4KSkgPSAnJzsKKwkJCX0KKwkJCSRvcHRze1dvcmtpbmdDb3B5fSA9ICRkaXI7CisJCQkkb3B0c3tXb3JraW5nU3ViZGlyfSA9ICRwcmVmaXg7CisKKwkJfSBlbHNlIHsKKwkJCSMgQSBiYXJlIHJlcG9zaXRvcnk/IExldCdzIHNlZS4uLgorCQkJJGRpciA9ICRvcHRze0RpcmVjdG9yeX07CisKKwkJCXVubGVzcyAoLWQgIiRkaXIvcmVmcyIgYW5kIC1kICIkZGlyL29iamVjdHMiIGFuZCAtZSAiJGRpci9IRUFEIikgeworCQkJCSMgTWltaWNrIGdpdC1yZXYtcGFyc2UgLS1naXQtZGlyIGVycm9yIG1lc3NhZ2U6CisJCQkJdGhyb3cgRXJyb3I6OlNpbXBsZSgnZmF0YWw6IE5vdCBhIGdpdCByZXBvc2l0b3J5Jyk7CisJCQl9CisJCQlteSAkc2VhcmNoID0gR2l0LT5yZXBvc2l0b3J5KFJlcG9zaXRvcnkgPT4gJGRpcik7CisJCQl0cnkgeworCQkJCSRzZWFyY2gtPmNvbW1hbmQoJ3N5bWJvbGljLXJlZicsICdIRUFEJyk7CisJCQl9IGNhdGNoIEdpdDo6RXJyb3I6OkNvbW1hbmQgd2l0aCB7CisJCQkJIyBNaW1pY2sgZ2l0LXJldi1wYXJzZSAtLWdpdC1kaXIgZXJyb3IgbWVzc2FnZToKKwkJCQl0aHJvdyBFcnJvcjo6U2ltcGxlKCdmYXRhbDogTm90IGEgZ2l0IHJlcG9zaXRvcnknKTsKKwkJCX0KKworCQkJJG9wdHN7UmVwb3NpdG9yeX0gPSBhYnNfcGF0aCgkZGlyKTsKKwkJfQorCisJCWRlbGV0ZSAkb3B0c3tEaXJlY3Rvcnl9OworCX0KKworCSRzZWxmID0geyBvcHRzID0+IFwlb3B0cyB9OworCWJsZXNzICRzZWxmLCAkY2xhc3M7Cit9CisKKworPWJhY2sKKworPWhlYWQxIE1FVEhPRFMKKworPW92ZXIgNAorCis9aXRlbSBjb21tYW5kICggQ09NTUFORCBbLCBBUkdVTUVOVFMuLi4gXSApCisKKz1pdGVtIGNvbW1hbmQgKCBbIENPTU1BTkQsIEFSR1VNRU5UUy4uLiBdLCB7IE9wdCA9PiBWYWwgLi4uIH0gKQorCitFeGVjdXRlIHRoZSBnaXZlbiBHaXQgQzxDT01NQU5EPiAoc3BlY2lmeSBpdCB3aXRob3V0IHRoZSAnZ2l0LScKK3ByZWZpeCksIG9wdGlvbmFsbHkgd2l0aCB0aGUgc3BlY2lmaWVkIGV4dHJhIEM8QVJHVU1FTlRTPi4KKworVGhlIHNlY29uZCBtb3JlIGVsYWJvcmF0ZSBmb3JtIGNhbiBiZSB1c2VkIGlmIHlvdSB3YW50IHRvIGZ1cnRoZXIgYWRqdXN0Cit0aGUgY29tbWFuZCBleGVjdXRpb24uIEN1cnJlbnRseSwgb25seSBvbmUgb3B0aW9uIGlzIHN1cHBvcnRlZDoKKworQjxTVERFUlI+IC0gSG93IHRvIGRlYWwgd2l0aCB0aGUgY29tbWFuZCdzIGVycm9yIG91dHB1dC4gQnkgZGVmYXVsdCAoQzx1bmRlZj4pCitpdCBpcyBkZWxpdmVyZWQgdG8gdGhlIGNhbGxlcidzIEM8U1RERVJSPi4gQSBmYWxzZSB2YWx1ZSAoMCBvciAnJykgd2lsbCBjYXVzZQoraXQgdG8gYmUgdGhyb3duIGF3YXkuIElmIHlvdSB3YW50IHRvIHByb2Nlc3MgaXQsIHlvdSBjYW4gZ2V0IGl0IGluIGEgZmlsZWhhbmRsZQoreW91IHNwZWNpZnksIGJ1dCB5b3UgbXVzdCBiZSBleHRyZW1lbHkgY2FyZWZ1bDsgaWYgdGhlIGVycm9yIG91dHB1dCBpcyBub3QKK3Zlcnkgc2hvcnQgYW5kIHlvdSB3YW50IHRvIHJlYWQgaXQgaW4gdGhlIHNhbWUgcHJvY2VzcyBhcyB3aGVyZSB5b3UgY2FsbGVkCitDPGNvbW1hbmQoKT4sIHlvdSBhcmUgc2V0IHVwIGZvciBhIG5pY2UgZGVhZGxvY2shCisKK1RoZSBtZXRob2QgY2FuIGJlIGNhbGxlZCB3aXRob3V0IGFueSBpbnN0YW5jZSBvciBvbiBhIHNwZWNpZmllZCBHaXQgcmVwb3NpdG9yeQorKGluIHRoYXQgY2FzZSB0aGUgY29tbWFuZCB3aWxsIGJlIHJ1biBpbiB0aGUgcmVwb3NpdG9yeSBjb250ZXh0KS4KKworSW4gc2NhbGFyIGNvbnRleHQsIGl0IHJldHVybnMgYWxsIHRoZSBjb21tYW5kIG91dHB1dCBpbiBhIHNpbmdsZSBzdHJpbmcKKyh2ZXJiYXRpbSkuCisKK0luIGFycmF5IGNvbnRleHQsIGl0IHJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBsaW5lcyBwcmludGVkIHRvIHRoZQorY29tbWFuZCdzIHN0ZG91dCAod2l0aG91dCB0cmFpbGluZyBuZXdsaW5lcykuCisKK0luIGJvdGggY2FzZXMsIHRoZSBjb21tYW5kJ3Mgc3RkaW4gYW5kIHN0ZGVyciBhcmUgdGhlIHNhbWUgYXMgdGhlIGNhbGxlcidzLgorCis9Y3V0CisKK3N1YiBjb21tYW5kIHsKKwlteSAoJGZoLCAkY3R4KSA9IGNvbW1hbmRfb3V0cHV0X3BpcGUoQF8pOworCisJaWYgKG5vdCBkZWZpbmVkIHdhbnRhcnJheSkgeworCQkjIE5vdGhpbmcgdG8gcGVwcGVyIHRoZSBwb3NzaWJsZSBleGNlcHRpb24gd2l0aC4KKwkJX2NtZF9jbG9zZSgkZmgsICRjdHgpOworCisJfSBlbHNpZiAobm90IHdhbnRhcnJheSkgeworCQlsb2NhbCAkLzsKKwkJbXkgJHRleHQgPSA8JGZoPjsKKwkJdHJ5IHsKKwkJCV9jbWRfY2xvc2UoJGZoLCAkY3R4KTsKKwkJfSBjYXRjaCBHaXQ6OkVycm9yOjpDb21tYW5kIHdpdGggeworCQkJIyBQZXBwZXIgd2l0aCB0aGUgb3V0cHV0OgorCQkJbXkgJEUgPSBzaGlmdDsKKwkJCSRFLT57Jy1vdXRwdXRyZWYnfSA9IFwkdGV4dDsKKwkJCXRocm93ICRFOworCQl9OworCQlyZXR1cm4gJHRleHQ7CisKKwl9IGVsc2UgeworCQlteSBAbGluZXMgPSA8JGZoPjsKKwkJZGVmaW5lZCBhbmQgY2hvbXAgZm9yIEBsaW5lczsKKwkJdHJ5IHsKKwkJCV9jbWRfY2xvc2UoJGZoLCAkY3R4KTsKKwkJfSBjYXRjaCBHaXQ6OkVycm9yOjpDb21tYW5kIHdpdGggeworCQkJbXkgJEUgPSBzaGlmdDsKKwkJCSRFLT57Jy1vdXRwdXRyZWYnfSA9IFxAbGluZXM7CisJCQl0aHJvdyAkRTsKKwkJfTsKKwkJcmV0dXJuIEBsaW5lczsKKwl9Cit9CisKKworPWl0ZW0gY29tbWFuZF9vbmVsaW5lICggQ09NTUFORCBbLCBBUkdVTUVOVFMuLi4gXSApCisKKz1pdGVtIGNvbW1hbmRfb25lbGluZSAoIFsgQ09NTUFORCwgQVJHVU1FTlRTLi4uIF0sIHsgT3B0ID0+IFZhbCAuLi4gfSApCisKK0V4ZWN1dGUgdGhlIGdpdmVuIEM8Q09NTUFORD4gaW4gdGhlIHNhbWUgd2F5IGFzIGNvbW1hbmQoKQorZG9lcyBidXQgYWx3YXlzIHJldHVybiBhIHNjYWxhciBzdHJpbmcgY29udGFpbmluZyB0aGUgZmlyc3QgbGluZQorb2YgdGhlIGNvbW1hbmQncyBzdGFuZGFyZCBvdXRwdXQuCisKKz1jdXQKKworc3ViIGNvbW1hbmRfb25lbGluZSB7CisJbXkgKCRmaCwgJGN0eCkgPSBjb21tYW5kX291dHB1dF9waXBlKEBfKTsKKworCW15ICRsaW5lID0gPCRmaD47CisJZGVmaW5lZCAkbGluZSBhbmQgY2hvbXAgJGxpbmU7CisJdHJ5IHsKKwkJX2NtZF9jbG9zZSgkZmgsICRjdHgpOworCX0gY2F0Y2ggR2l0OjpFcnJvcjo6Q29tbWFuZCB3aXRoIHsKKwkJIyBQZXBwZXIgd2l0aCB0aGUgb3V0cHV0OgorCQlteSAkRSA9IHNoaWZ0OworCQkkRS0+eyctb3V0cHV0cmVmJ30gPSBcJGxpbmU7CisJCXRocm93ICRFOworCX07CisJcmV0dXJuICRsaW5lOworfQorCisKKz1pdGVtIGNvbW1hbmRfb3V0cHV0X3BpcGUgKCBDT01NQU5EIFssIEFSR1VNRU5UUy4uLiBdICkKKworPWl0ZW0gY29tbWFuZF9vdXRwdXRfcGlwZSAoIFsgQ09NTUFORCwgQVJHVU1FTlRTLi4uIF0sIHsgT3B0ID0+IFZhbCAuLi4gfSApCisKK0V4ZWN1dGUgdGhlIGdpdmVuIEM8Q09NTUFORD4gaW4gdGhlIHNhbWUgd2F5IGFzIGNvbW1hbmQoKQorZG9lcyBidXQgcmV0dXJuIGEgcGlwZSBmaWxlaGFuZGxlIGZyb20gd2hpY2ggdGhlIGNvbW1hbmQgb3V0cHV0IGNhbiBiZQorcmVhZC4KKworVGhlIGZ1bmN0aW9uIGNhbiByZXR1cm4gQzwoJHBpcGUsICRjdHgpPiBpbiBhcnJheSBjb250ZXh0LgorU2VlIEM8Y29tbWFuZF9jbG9zZV9waXBlKCk+IGZvciBkZXRhaWxzLgorCis9Y3V0CisKK3N1YiBjb21tYW5kX291dHB1dF9waXBlIHsKKwlfY29tbWFuZF9jb21tb25fcGlwZSgnLXwnLCBAXyk7Cit9CisKKworPWl0ZW0gY29tbWFuZF9pbnB1dF9waXBlICggQ09NTUFORCBbLCBBUkdVTUVOVFMuLi4gXSApCisKKz1pdGVtIGNvbW1hbmRfaW5wdXRfcGlwZSAoIFsgQ09NTUFORCwgQVJHVU1FTlRTLi4uIF0sIHsgT3B0ID0+IFZhbCAuLi4gfSApCisKK0V4ZWN1dGUgdGhlIGdpdmVuIEM8Q09NTUFORD4gaW4gdGhlIHNhbWUgd2F5IGFzIGNvbW1hbmRfb3V0cHV0X3BpcGUoKQorZG9lcyBidXQgcmV0dXJuIGFuIGlucHV0IHBpcGUgZmlsZWhhbmRsZSBpbnN0ZWFkOyB0aGUgY29tbWFuZCBvdXRwdXQKK2lzIG5vdCBjYXB0dXJlZC4KKworVGhlIGZ1bmN0aW9uIGNhbiByZXR1cm4gQzwoJHBpcGUsICRjdHgpPiBpbiBhcnJheSBjb250ZXh0LgorU2VlIEM8Y29tbWFuZF9jbG9zZV9waXBlKCk+IGZvciBkZXRhaWxzLgorCis9Y3V0CisKK3N1YiBjb21tYW5kX2lucHV0X3BpcGUgeworCV9jb21tYW5kX2NvbW1vbl9waXBlKCd8LScsIEBfKTsKK30KKworCis9aXRlbSBjb21tYW5kX2Nsb3NlX3BpcGUgKCBQSVBFIFssIENUWCBdICkKKworQ2xvc2UgdGhlIEM8UElQRT4gYXMgcmV0dXJuZWQgZnJvbSBDPGNvbW1hbmRfKl9waXBlKCk+LCBjaGVja2luZword2hldGhlciB0aGUgY29tbWFuZCBmaW5pc2hlZCBzdWNjZXNzZnVsbHkuIFRoZSBvcHRpb25hbCBDPENUWD4gYXJndW1lbnQKK2lzIHJlcXVpcmVkIGlmIHlvdSB3YW50IHRvIHNlZSB0aGUgY29tbWFuZCBuYW1lIGluIHRoZSBlcnJvciBtZXNzYWdlLAorYW5kIGl0IGlzIHRoZSBzZWNvbmQgdmFsdWUgcmV0dXJuZWQgYnkgQzxjb21tYW5kXypfcGlwZSgpPiB3aGVuCitjYWxsZWQgaW4gYXJyYXkgY29udGV4dC4gVGhlIGNhbGwgaWRpb20gaXM6CisKKwlteSAoJGZoLCAkY3R4KSA9ICRyLT5jb21tYW5kX291dHB1dF9waXBlKCdzdGF0dXMnKTsKKwl3aGlsZSAoPCRmaD4pIHsgLi4uIH0KKwkkci0+Y29tbWFuZF9jbG9zZV9waXBlKCRmaCwgJGN0eCk7CisKK05vdGUgdGhhdCB5b3Ugc2hvdWxkIG5vdCByZWx5IG9uIHdoYXRldmVyIGFjdHVhbGx5IGlzIGluIEM8Q1RYPjsKK2N1cnJlbnRseSBpdCBpcyBzaW1wbHkgdGhlIGNvbW1hbmQgbmFtZSBidXQgaW4gZnV0dXJlIHRoZSBjb250ZXh0IG1pZ2h0CitoYXZlIG1vcmUgY29tcGxpY2F0ZWQgc3RydWN0dXJlLgorCis9Y3V0CisKK3N1YiBjb21tYW5kX2Nsb3NlX3BpcGUgeworCW15ICgkc2VsZiwgJGZoLCAkY3R4KSA9IF9tYXliZV9zZWxmKEBfKTsKKwkkY3R4IHx8PSAnPHVua25vd24+JzsKKwlfY21kX2Nsb3NlKCRmaCwgJGN0eCk7Cit9CisKKworPWl0ZW0gY29tbWFuZF9ub2lzeSAoIENPTU1BTkQgWywgQVJHVU1FTlRTLi4uIF0gKQorCitFeGVjdXRlIHRoZSBnaXZlbiBDPENPTU1BTkQ+IGluIHRoZSBzYW1lIHdheSBhcyBjb21tYW5kKCkgZG9lcyBidXQgZG8gbm90CitjYXB0dXJlIHRoZSBjb21tYW5kIG91dHB1dCAtIHRoZSBzdGFuZGFyZCBvdXRwdXQgaXMgbm90IHJlZGlyZWN0ZWQgYW5kIGdvZXMKK3RvIHRoZSBzdGFuZGFyZCBvdXRwdXQgb2YgdGhlIGNhbGxlciBhcHBsaWNhdGlvbi4KKworV2hpbGUgdGhlIG1ldGhvZCBpcyBjYWxsZWQgY29tbWFuZF9ub2lzeSgpLCB5b3UgbWlnaHQgd2FudCB0byBhcyB3ZWxsIHVzZQoraXQgZm9yIHRoZSBtb3N0IHNpbGVudCBHaXQgY29tbWFuZHMgd2hpY2ggeW91IGtub3cgd2lsbCBuZXZlciBwb2xsdXRlIHlvdXIKK3N0ZG91dCBidXQgeW91IHdhbnQgdG8gYXZvaWQgdGhlIG92ZXJoZWFkIG9mIHRoZSBwaXBlIHNldHVwIHdoZW4gY2FsbGluZyB0aGVtLgorCitUaGUgZnVuY3Rpb24gcmV0dXJucyBvbmx5IGFmdGVyIHRoZSBjb21tYW5kIGhhcyBmaW5pc2hlZCBydW5uaW5nLgorCis9Y3V0CisKK3N1YiBjb21tYW5kX25vaXN5IHsKKwlteSAoJHNlbGYsICRjbWQsIEBhcmdzKSA9IF9tYXliZV9zZWxmKEBfKTsKKwlfY2hlY2tfdmFsaWRfY21kKCRjbWQpOworCisJbXkgJHBpZCA9IGZvcms7CisJaWYgKG5vdCBkZWZpbmVkICRwaWQpIHsKKwkJdGhyb3cgRXJyb3I6OlNpbXBsZSgiZm9yayBmYWlsZWQ6ICQhIik7CisJfSBlbHNpZiAoJHBpZCA9PSAwKSB7CisJCV9jbWRfZXhlYygkc2VsZiwgJGNtZCwgQGFyZ3MpOworCX0KKwlpZiAod2FpdHBpZCgkcGlkLCAwKSA+IDAgYW5kICQ/Pj44ICE9IDApIHsKKwkJdGhyb3cgR2l0OjpFcnJvcjo6Q29tbWFuZChqb2luKCcgJywgJGNtZCwgQGFyZ3MpLCAkPyA+PiA4KTsKKwl9Cit9CisKKworPWl0ZW0gdmVyc2lvbiAoKQorCitSZXR1cm4gdGhlIEdpdCB2ZXJzaW9uIGluIHVzZS4KKworPWN1dAorCitzdWIgdmVyc2lvbiB7CisJbXkgJHZlcnN0ciA9IGNvbW1hbmRfb25lbGluZSgnLS12ZXJzaW9uJyk7CisJJHZlcnN0ciA9fiBzL15naXQgdmVyc2lvbiAvLzsKKwkkdmVyc3RyOworfQorCisKKz1pdGVtIGV4ZWNfcGF0aCAoKQorCitSZXR1cm4gcGF0aCB0byB0aGUgR2l0IHN1Yi1jb21tYW5kIGV4ZWN1dGFibGVzICh0aGUgc2FtZSBhcworQzxnaXQgLS1leGVjLXBhdGg+KS4gVXNlZnVsIG1vc3RseSBvbmx5IGludGVybmFsbHkuCisKKz1jdXQKKworc3ViIGV4ZWNfcGF0aCB7IGNvbW1hbmRfb25lbGluZSgnLS1leGVjLXBhdGgnKSB9CisKKworPWl0ZW0gcmVwb19wYXRoICgpCisKK1JldHVybiBwYXRoIHRvIHRoZSBnaXQgcmVwb3NpdG9yeS4gTXVzdCBiZSBjYWxsZWQgb24gYSByZXBvc2l0b3J5IGluc3RhbmNlLgorCis9Y3V0CisKK3N1YiByZXBvX3BhdGggeyAkX1swXS0+e29wdHN9LT57UmVwb3NpdG9yeX0gfQorCisKKz1pdGVtIHdjX3BhdGggKCkKKworUmV0dXJuIHBhdGggdG8gdGhlIHdvcmtpbmcgY29weS4gTXVzdCBiZSBjYWxsZWQgb24gYSByZXBvc2l0b3J5IGluc3RhbmNlLgorCis9Y3V0CisKK3N1YiB3Y19wYXRoIHsgJF9bMF0tPntvcHRzfS0+e1dvcmtpbmdDb3B5fSB9CisKKworPWl0ZW0gd2Nfc3ViZGlyICgpCisKK1JldHVybiBwYXRoIHRvIHRoZSBzdWJkaXJlY3RvcnkgaW5zaWRlIG9mIGEgd29ya2luZyBjb3B5LiBNdXN0IGJlIGNhbGxlZAorb24gYSByZXBvc2l0b3J5IGluc3RhbmNlLgorCis9Y3V0CisKK3N1YiB3Y19zdWJkaXIgeyAkX1swXS0+e29wdHN9LT57V29ya2luZ1N1YmRpcn0gfHw9ICcnIH0KKworCis9aXRlbSB3Y19jaGRpciAoIFNVQkRJUiApCisKK0NoYW5nZSB0aGUgd29ya2luZyBjb3B5IHN1YmRpcmVjdG9yeSB0byB3b3JrIHdpdGhpbi4gVGhlIEM8U1VCRElSPiBpcworcmVsYXRpdmUgdG8gdGhlIHdvcmtpbmcgY29weSByb290IGRpcmVjdG9yeSAobm90IHRoZSBjdXJyZW50IHN1YmRpcmVjdG9yeSkuCitNdXN0IGJlIGNhbGxlZCBvbiBhIHJlcG9zaXRvcnkgaW5zdGFuY2UgYXR0YWNoZWQgdG8gYSB3b3JraW5nIGNvcHkKK2FuZCB0aGUgZGlyZWN0b3J5IG11c3QgZXhpc3QuCisKKz1jdXQKKworc3ViIHdjX2NoZGlyIHsKKwlteSAoJHNlbGYsICRzdWJkaXIpID0gQF87CisJJHNlbGYtPndjX3BhdGgoKQorCQlvciB0aHJvdyBFcnJvcjo6U2ltcGxlKCJiYXJlIHJlcG9zaXRvcnkiKTsKKworCS1kICRzZWxmLT53Y19wYXRoKCkuJy8nLiRzdWJkaXIKKwkJb3IgdGhyb3cgRXJyb3I6OlNpbXBsZSgic3ViZGlyIG5vdCBmb3VuZDogJCEiKTsKKwkjIE9mIGNvdXJzZSB3ZSB3aWxsIG5vdCAiaG9sZCIgdGhlIHN1YmRpcmVjdG9yeSBzbyBhbnlvbmUKKwkjIGNhbiBkZWxldGUgaXQgbm93IGFuZCB3ZSB3aWxsIG5ldmVyIGtub3cuIEJ1dCBhdCBsZWFzdCB3ZSB0cmllZC4KKworCSRzZWxmLT57b3B0c30tPntXb3JraW5nU3ViZGlyfSA9ICRzdWJkaXI7Cit9CisKKworPWl0ZW0gY29uZmlnICggVkFSSUFCTEUgKQorCitSZXRyaWV2ZSB0aGUgY29uZmlndXJhdGlvbiBDPFZBUklBQkxFPiBpbiB0aGUgc2FtZSBtYW5uZXIgYXMgQzxjb25maWc+Citkb2VzLiBJbiBzY2FsYXIgY29udGV4dCByZXF1aXJlcyB0aGUgdmFyaWFibGUgdG8gYmUgc2V0IG9ubHkgb25lIHRpbWUKKyhleGNlcHRpb24gaXMgdGhyb3duIG90aGVyd2lzZSksIGluIGFycmF5IGNvbnRleHQgcmV0dXJucyBhbGxvd3MgdGhlCit2YXJpYWJsZSB0byBiZSBzZXQgbXVsdGlwbGUgdGltZXMgYW5kIHJldHVybnMgYWxsIHRoZSB2YWx1ZXMuCisKK011c3QgYmUgY2FsbGVkIG9uIGEgcmVwb3NpdG9yeSBpbnN0YW5jZS4KKworVGhpcyBjdXJyZW50bHkgd3JhcHMgY29tbWFuZCgnY29uZmlnJykgc28gaXQgaXMgbm90IHNvIGZhc3QuCisKKz1jdXQKKworc3ViIGNvbmZpZyB7CisJbXkgKCRzZWxmLCAkdmFyKSA9IEBfOworCSRzZWxmLT5yZXBvX3BhdGgoKQorCQlvciB0aHJvdyBFcnJvcjo6U2ltcGxlKCJub3QgYSByZXBvc2l0b3J5Iik7CisKKwl0cnkgeworCQlpZiAod2FudGFycmF5KSB7CisJCQlyZXR1cm4gJHNlbGYtPmNvbW1hbmQoJ2NvbmZpZycsICctLWdldC1hbGwnLCAkdmFyKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAkc2VsZi0+Y29tbWFuZF9vbmVsaW5lKCdjb25maWcnLCAnLS1nZXQnLCAkdmFyKTsKKwkJfQorCX0gY2F0Y2ggR2l0OjpFcnJvcjo6Q29tbWFuZCB3aXRoIHsKKwkJbXkgJEUgPSBzaGlmdDsKKwkJaWYgKCRFLT52YWx1ZSgpID09IDEpIHsKKwkJCSMgS2V5IG5vdCBmb3VuZC4KKwkJCXJldHVybiB1bmRlZjsKKwkJfSBlbHNlIHsKKwkJCXRocm93ICRFOworCQl9CisJfTsKK30KKworCis9aXRlbSBjb25maWdfYm9vbCAoIFZBUklBQkxFICkKKworUmV0cmlldmUgdGhlIGJvb2wgY29uZmlndXJhdGlvbiBDPFZBUklBQkxFPi4gVGhlIHJldHVybiB2YWx1ZQoraXMgdXNhYmxlIGFzIGEgYm9vbGVhbiBpbiBwZXJsIChhbmQgQzx1bmRlZj4gaWYgaXQncyBub3QgZGVmaW5lZCwKK29mIGNvdXJzZSkuCisKK011c3QgYmUgY2FsbGVkIG9uIGEgcmVwb3NpdG9yeSBpbnN0YW5jZS4KKworVGhpcyBjdXJyZW50bHkgd3JhcHMgY29tbWFuZCgnY29uZmlnJykgc28gaXQgaXMgbm90IHNvIGZhc3QuCisKKz1jdXQKKworc3ViIGNvbmZpZ19ib29sIHsKKwlteSAoJHNlbGYsICR2YXIpID0gQF87CisJJHNlbGYtPnJlcG9fcGF0aCgpCisJCW9yIHRocm93IEVycm9yOjpTaW1wbGUoIm5vdCBhIHJlcG9zaXRvcnkiKTsKKworCXRyeSB7CisJCW15ICR2YWwgPSAkc2VsZi0+Y29tbWFuZF9vbmVsaW5lKCdjb25maWcnLCAnLS1ib29sJywgJy0tZ2V0JywKKwkJCQkJICAgICAgJHZhcik7CisJCXJldHVybiB1bmRlZiB1bmxlc3MgZGVmaW5lZCAkdmFsOworCQlyZXR1cm4gJHZhbCBlcSAndHJ1ZSc7CisJfSBjYXRjaCBHaXQ6OkVycm9yOjpDb21tYW5kIHdpdGggeworCQlteSAkRSA9IHNoaWZ0OworCQlpZiAoJEUtPnZhbHVlKCkgPT0gMSkgeworCQkJIyBLZXkgbm90IGZvdW5kLgorCQkJcmV0dXJuIHVuZGVmOworCQl9IGVsc2UgeworCQkJdGhyb3cgJEU7CisJCX0KKwl9OworfQorCis9aXRlbSBjb25maWdfaW50ICggVkFSSUFCTEUgKQorCitSZXRyaWV2ZSB0aGUgaW50ZWdlciBjb25maWd1cmF0aW9uIEM8VkFSSUFCTEU+LiBUaGUgcmV0dXJuIHZhbHVlCitpcyBzaW1wbGUgZGVjaW1hbCBudW1iZXIuICBBbiBvcHRpb25hbCB2YWx1ZSBzdWZmaXggb2YgJ2snLCAnbScsCitvciAnZycgaW4gdGhlIGNvbmZpZyBmaWxlIHdpbGwgY2F1c2UgdGhlIHZhbHVlIHRvIGJlIG11bHRpcGxpZWQKK2J5IDEwMjQsIDEwNDg1NzYgKDEwMjReMiksIG9yIDEwNzM3NDE4MjQgKDEwMjReMykgcHJpb3IgdG8gb3V0cHV0LgorSXQgd291bGQgcmV0dXJuIEM8dW5kZWY+IGlmIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgaXMgbm90IGRlZmluZWQsCisKK011c3QgYmUgY2FsbGVkIG9uIGEgcmVwb3NpdG9yeSBpbnN0YW5jZS4KKworVGhpcyBjdXJyZW50bHkgd3JhcHMgY29tbWFuZCgnY29uZmlnJykgc28gaXQgaXMgbm90IHNvIGZhc3QuCisKKz1jdXQKKworc3ViIGNvbmZpZ19pbnQgeworCW15ICgkc2VsZiwgJHZhcikgPSBAXzsKKwkkc2VsZi0+cmVwb19wYXRoKCkKKwkJb3IgdGhyb3cgRXJyb3I6OlNpbXBsZSgibm90IGEgcmVwb3NpdG9yeSIpOworCisJdHJ5IHsKKwkJcmV0dXJuICRzZWxmLT5jb21tYW5kX29uZWxpbmUoJ2NvbmZpZycsICctLWludCcsICctLWdldCcsICR2YXIpOworCX0gY2F0Y2ggR2l0OjpFcnJvcjo6Q29tbWFuZCB3aXRoIHsKKwkJbXkgJEUgPSBzaGlmdDsKKwkJaWYgKCRFLT52YWx1ZSgpID09IDEpIHsKKwkJCSMgS2V5IG5vdCBmb3VuZC4KKwkJCXJldHVybiB1bmRlZjsKKwkJfSBlbHNlIHsKKwkJCXRocm93ICRFOworCQl9CisJfTsKK30KKworPWl0ZW0gZ2V0X2NvbG9yYm9vbCAoIE5BTUUgKQorCitGaW5kcyBpZiBjb2xvciBzaG91bGQgYmUgdXNlZCBmb3IgTkFNRWQgb3BlcmF0aW9uIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24sCithbmQgcmV0dXJucyBib29sZWFuICh0cnVlIGZvciAidXNlIGNvbG9yIiwgZmFsc2UgZm9yICJkbyBub3QgdXNlIGNvbG9yIikuCisKKz1jdXQKKworc3ViIGdldF9jb2xvcmJvb2wgeworCW15ICgkc2VsZiwgJHZhcikgPSBAXzsKKwlteSAkc3Rkb3V0X3RvX3R0eSA9ICgtdCBTVERPVVQpID8gInRydWUiIDogImZhbHNlIjsKKwlteSAkdXNlX2NvbG9yID0gJHNlbGYtPmNvbW1hbmRfb25lbGluZSgnY29uZmlnJywgJy0tZ2V0LWNvbG9yYm9vbCcsCisJCQkJCSAgICAgICAkdmFyLCAkc3Rkb3V0X3RvX3R0eSk7CisJcmV0dXJuICgkdXNlX2NvbG9yIGVxICd0cnVlJyk7Cit9CisKKz1pdGVtIGdldF9jb2xvciAoIFNMT1QsIENPTE9SICkKKworRmluZHMgY29sb3IgZm9yIFNMT1QgZnJvbSB0aGUgY29uZmlndXJhdGlvbiwgd2hpbGUgZGVmYXVsdGluZyB0byBDT0xPUiwKK2FuZCByZXR1cm5zIHRoZSBBTlNJIGNvbG9yIGVzY2FwZSBzZXF1ZW5jZToKKworCXByaW50ICRyZXBvLT5nZXRfY29sb3IoImNvbG9yLmludGVyYWN0aXZlLnByb21wdCIsICJ1bmRlcmxpbmUgYmx1ZSB3aGl0ZSIpOworCXByaW50ICJzb21lIHRleHQiOworCXByaW50ICRyZXBvLT5nZXRfY29sb3IoIiIsICJub3JtYWwiKTsKKworPWN1dAorCitzdWIgZ2V0X2NvbG9yIHsKKwlteSAoJHNlbGYsICRzbG90LCAkZGVmYXVsdCkgPSBAXzsKKwlteSAkY29sb3IgPSAkc2VsZi0+Y29tbWFuZF9vbmVsaW5lKCdjb25maWcnLCAnLS1nZXQtY29sb3InLCAkc2xvdCwgJGRlZmF1bHQpOworCWlmICghZGVmaW5lZCAkY29sb3IpIHsKKwkJJGNvbG9yID0gIiI7CisJfQorCXJldHVybiAkY29sb3I7Cit9CisKKz1pdGVtIGlkZW50ICggVFlQRSB8IElERU5UU1RSICkKKworPWl0ZW0gaWRlbnRfcGVyc29uICggVFlQRSB8IElERU5UU1RSIHwgSURFTlRBUlJBWSApCisKK1RoaXMgc3VpdGUgb2YgZnVuY3Rpb25zIHJldHJpZXZlcyBhbmQgcGFyc2VzIGlkZW50IGluZm9ybWF0aW9uLCBhcyBzdG9yZWQKK2luIHRoZSBjb21taXQgYW5kIHRhZyBvYmplY3RzIG9yIHByb2R1Y2VkIGJ5IEM8dmFyIEdJVF90eXBlX0lERU5UPiAodGh1cworQzxUWVBFPiBjYW4gYmUgZWl0aGVyIEk8YXV0aG9yPiBvciBJPGNvbW1pdHRlcj47IGNhc2UgaXMgaW5zaWduaWZpY2FudCkuCisKK1RoZSBDPGlkZW50PiBtZXRob2QgcmV0cmlldmVzIHRoZSBpZGVudCBpbmZvcm1hdGlvbiBmcm9tIEM8Z2l0LXZhcj4KK2FuZCBlaXRoZXIgcmV0dXJucyBpdCBhcyBhIHNjYWxhciBzdHJpbmcgb3IgYXMgYW4gYXJyYXkgd2l0aCB0aGUgZmllbGRzIHBhcnNlZC4KK0FsdGVybmF0aXZlbHksIGl0IGNhbiB0YWtlIGEgcHJlcGFyZWQgaWRlbnQgc3RyaW5nIChlLmcuIGZyb20gdGhlIGNvbW1pdAorb2JqZWN0KSBhbmQganVzdCBwYXJzZSBpdC4KKworQzxpZGVudF9wZXJzb24+IHJldHVybnMgdGhlIHBlcnNvbiBwYXJ0IG9mIHRoZSBpZGVudCAtIG5hbWUgYW5kIGVtYWlsOworaXQgY2FuIHRha2UgdGhlIHNhbWUgYXJndW1lbnRzIGFzIEM8aWRlbnQ+IG9yIHRoZSBhcnJheSByZXR1cm5lZCBieSBDPGlkZW50Pi4KKworVGhlIHN5bm9wc2lzIGlzIGxpa2U6CisKKwlteSAoJG5hbWUsICRlbWFpbCwgJHRpbWVfdHopID0gaWRlbnQoJ2F1dGhvcicpOworCSIkbmFtZSA8JGVtYWlsPiIgZXEgaWRlbnRfcGVyc29uKCdhdXRob3InKTsKKwkiJG5hbWUgPCRlbWFpbD4iIGVxIGlkZW50X3BlcnNvbigkbmFtZSk7CisJJHRpbWVfdHogPX4gL15cZCsgWystXVxkezR9JC87CisKK0JvdGggbWV0aG9kcyBtdXN0IGJlIGNhbGxlZCBvbiBhIHJlcG9zaXRvcnkgaW5zdGFuY2UuCisKKz1jdXQKKworc3ViIGlkZW50IHsKKwlteSAoJHNlbGYsICR0eXBlKSA9IEBfOworCW15ICRpZGVudHN0cjsKKwlpZiAobGMgJHR5cGUgZXEgbGMgJ2NvbW1pdHRlcicgb3IgbGMgJHR5cGUgZXEgbGMgJ2F1dGhvcicpIHsKKwkJJGlkZW50c3RyID0gJHNlbGYtPmNvbW1hbmRfb25lbGluZSgndmFyJywgJ0dJVF8nLnVjKCR0eXBlKS4nX0lERU5UJyk7CisJfSBlbHNlIHsKKwkJJGlkZW50c3RyID0gJHR5cGU7CisJfQorCWlmICh3YW50YXJyYXkpIHsKKwkJcmV0dXJuICRpZGVudHN0ciA9fiAvXiguKikgPCguKik+IChcZCsgWystXVxkezR9KSQvOworCX0gZWxzZSB7CisJCXJldHVybiAkaWRlbnRzdHI7CisJfQorfQorCitzdWIgaWRlbnRfcGVyc29uIHsKKwlteSAoJHNlbGYsIEBpZGVudCkgPSBAXzsKKwkkI2lkZW50ID09IDAgYW5kIEBpZGVudCA9ICRzZWxmLT5pZGVudCgkaWRlbnRbMF0pOworCXJldHVybiAiJGlkZW50WzBdIDwkaWRlbnRbMV0+IjsKK30KKworCis9aXRlbSBoYXNoX29iamVjdCAoIFRZUEUsIEZJTEVOQU1FICkKKworQ29tcHV0ZSB0aGUgU0hBMSBvYmplY3QgaWQgb2YgdGhlIGdpdmVuIEM8RklMRU5BTUU+IChvciBkYXRhIHdhaXRpbmcgaW4KK0M8RklMRUhBTkRMRT4pIGNvbnNpZGVyaW5nIGl0IGlzIG9mIHRoZSBDPFRZUEU+IG9iamVjdCB0eXBlIChDPGJsb2I+LAorQzxjb21taXQ+LCBDPHRyZWU+KS4KKworVGhlIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHdpdGhvdXQgYW55IGluc3RhbmNlIG9yIG9uIGEgc3BlY2lmaWVkIEdpdCByZXBvc2l0b3J5LAoraXQgbWFrZXMgemVybyBkaWZmZXJlbmNlLgorCitUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgU0hBMSBoYXNoLgorCis9Y3V0CisKKyMgVE9ETzogU3VwcG9ydCBmb3IgcGFzc2luZyBGSUxFSEFORExFIGluc3RlYWQgb2YgRklMRU5BTUUKK3N1YiBoYXNoX29iamVjdCB7CisJbXkgKCRzZWxmLCAkdHlwZSwgJGZpbGUpID0gX21heWJlX3NlbGYoQF8pOworCWNvbW1hbmRfb25lbGluZSgnaGFzaC1vYmplY3QnLCAnLXQnLCAkdHlwZSwgJGZpbGUpOworfQorCisKKworPWJhY2sKKworPWhlYWQxIEVSUk9SIEhBTkRMSU5HCisKK0FsbCBmdW5jdGlvbnMgYXJlIHN1cHBvc2VkIHRvIHRocm93IFBlcmwgZXhjZXB0aW9ucyBpbiBjYXNlIG9mIGVycm9ycy4KK1NlZSB0aGUgTDxFcnJvcj4gbW9kdWxlIG9uIGhvdyB0byBjYXRjaCB0aG9zZS4gTW9zdCBleGNlcHRpb25zIGFyZSBtZXJlCitMPEVycm9yOjpTaW1wbGU+IGluc3RhbmNlcy4KKworSG93ZXZlciwgdGhlIEM8Y29tbWFuZCgpPiwgQzxjb21tYW5kX29uZWxpbmUoKT4gYW5kIEM8Y29tbWFuZF9ub2lzeSgpPgorZnVuY3Rpb25zIHN1aXRlIGNhbiB0aHJvdyBDPEdpdDo6RXJyb3I6OkNvbW1hbmQ+IGV4Y2VwdGlvbnMgYXMgd2VsbDogdGhvc2UgYXJlCit0aHJvd24gd2hlbiB0aGUgZXh0ZXJuYWwgY29tbWFuZCByZXR1cm5zIGFuIGVycm9yIGNvZGUgYW5kIGNvbnRhaW4gdGhlIGVycm9yCitjb2RlIGFzIHdlbGwgYXMgYWNjZXNzIHRvIHRoZSBjYXB0dXJlZCBjb21tYW5kJ3Mgb3V0cHV0LiBUaGUgZXhjZXB0aW9uIGNsYXNzCitwcm92aWRlcyB0aGUgdXN1YWwgQzxzdHJpbmdpZnk+IGFuZCBDPHZhbHVlPiAoY29tbWFuZCdzIGV4aXQgY29kZSkgbWV0aG9kcyBhbmQKK2luIGFkZGl0aW9uIGFsc28gYSBDPGNtZF9vdXRwdXQ+IG1ldGhvZCB0aGF0IHJldHVybnMgZWl0aGVyIGFuIGFycmF5IG9yIGEKK3N0cmluZyB3aXRoIHRoZSBjYXB0dXJlZCBjb21tYW5kIG91dHB1dCAoZGVwZW5kaW5nIG9uIHRoZSBvcmlnaW5hbCBmdW5jdGlvbgorY2FsbCBjb250ZXh0OyBDPGNvbW1hbmRfbm9pc3koKT4gcmV0dXJucyBDPHVuZGVmPikgYW5kICQ8Y21kbGluZT4gd2hpY2gKK3JldHVybnMgdGhlIGNvbW1hbmQgYW5kIGl0cyBhcmd1bWVudHMgKGJ1dCB3aXRob3V0IHByb3BlciBxdW90aW5nKS4KKworTm90ZSB0aGF0IHRoZSBDPGNvbW1hbmRfKl9waXBlKCk+IGZ1bmN0aW9ucyBjYW5ub3QgdGhyb3cgdGhpcyBleGNlcHRpb24gc2luY2UKK2l0IGhhcyBubyBpZGVhIHdoZXRoZXIgdGhlIGNvbW1hbmQgZmFpbGVkIG9yIG5vdC4gWW91IHdpbGwgb25seSBmaW5kIG91dAorYXQgdGhlIHRpbWUgeW91IEM8Y2xvc2U+IHRoZSBwaXBlOyBpZiB5b3Ugd2FudCB0byBoYXZlIHRoYXQgYXV0b21hdGVkLAordXNlIEM8Y29tbWFuZF9jbG9zZV9waXBlKCk+LCB3aGljaCBjYW4gdGhyb3cgdGhlIGV4Y2VwdGlvbi4KKworPWN1dAorCit7CisJcGFja2FnZSBHaXQ6OkVycm9yOjpDb21tYW5kOworCisJQEdpdDo6RXJyb3I6OkNvbW1hbmQ6OklTQSA9IHF3KEVycm9yKTsKKworCXN1YiBuZXcgeworCQlteSAkc2VsZiA9IHNoaWZ0OworCQlteSAkY21kbGluZSA9ICcnIC4gc2hpZnQ7CisJCW15ICR2YWx1ZSA9IDAgKyBzaGlmdDsKKwkJbXkgJG91dHB1dHJlZiA9IHNoaWZ0OworCQlteShAYXJncykgPSAoKTsKKworCQlsb2NhbCAkRXJyb3I6OkRlcHRoID0gJEVycm9yOjpEZXB0aCArIDE7CisKKwkJcHVzaChAYXJncywgJy1jbWRsaW5lJywgJGNtZGxpbmUpOworCQlwdXNoKEBhcmdzLCAnLXZhbHVlJywgJHZhbHVlKTsKKwkJcHVzaChAYXJncywgJy1vdXRwdXRyZWYnLCAkb3V0cHV0cmVmKTsKKworCQkkc2VsZi0+U1VQRVI6Om5ldygtdGV4dCA9PiAnY29tbWFuZCByZXR1cm5lZCBlcnJvcicsIEBhcmdzKTsKKwl9CisKKwlzdWIgc3RyaW5naWZ5IHsKKwkJbXkgJHNlbGYgPSBzaGlmdDsKKwkJbXkgJHRleHQgPSAkc2VsZi0+U1VQRVI6OnN0cmluZ2lmeTsKKwkJJHNlbGYtPmNtZGxpbmUoKSAuICc6ICcgLiAkdGV4dCAuICc6ICcgLiAkc2VsZi0+dmFsdWUoKSAuICJcbiI7CisJfQorCisJc3ViIGNtZGxpbmUgeworCQlteSAkc2VsZiA9IHNoaWZ0OworCQkkc2VsZi0+eyctY21kbGluZSd9OworCX0KKworCXN1YiBjbWRfb3V0cHV0IHsKKwkJbXkgJHNlbGYgPSBzaGlmdDsKKwkJbXkgJHJlZiA9ICRzZWxmLT57Jy1vdXRwdXRyZWYnfTsKKwkJZGVmaW5lZCAkcmVmIG9yIHVuZGVmOworCQlpZiAocmVmICRyZWYgZXEgJ0FSUkFZJykgeworCQkJcmV0dXJuIEAkcmVmOworCQl9IGVsc2UgeyAjIFNDQUxBUgorCQkJcmV0dXJuICQkcmVmOworCQl9CisJfQorfQorCis9b3ZlciA0CisKKz1pdGVtIGdpdF9jbWRfdHJ5IHsgQ09ERSB9IEVSUk1TRworCitUaGlzIG1hZ2ljYWwgc3RhdGVtZW50IHdpbGwgYXV0b21hdGljYWxseSBjYXRjaCBhbnkgQzxHaXQ6OkVycm9yOjpDb21tYW5kPgorZXhjZXB0aW9ucyB0aHJvd24gYnkgQzxDT0RFPiBhbmQgbWFrZSB5b3VyIHByb2dyYW0gZGllIHdpdGggQzxFUlJNU0c+CitvbiBpdHMgbGlwczsgdGhlIG1lc3NhZ2Ugd2lsbCBoYXZlICVzIHN1YnN0aXR1dGVkIGZvciB0aGUgY29tbWFuZCBsaW5lCithbmQgJWQgZm9yIHRoZSBleGl0IHN0YXR1cy4gVGhpcyBzdGF0ZW1lbnQgaXMgdXNlZnVsIG1vc3RseSBmb3IgcHJvZHVjaW5nCittb3JlIHVzZXItZnJpZW5kbHkgZXJyb3IgbWVzc2FnZXMuCisKK0luIGNhc2Ugb2Ygbm8gZXhjZXB0aW9uIGNhdWdodCB0aGUgc3RhdGVtZW50IHJldHVybnMgQzxDT0RFPidzIHJldHVybiB2YWx1ZS4KKworTm90ZSB0aGF0IHRoaXMgaXMgdGhlIG9ubHkgYXV0by1leHBvcnRlZCBmdW5jdGlvbi4KKworPWN1dAorCitzdWIgZ2l0X2NtZF90cnkoJiQpIHsKKwlteSAoJGNvZGUsICRlcnJtc2cpID0gQF87CisJbXkgQHJlc3VsdDsKKwlteSAkZXJyOworCW15ICRhcnJheSA9IHdhbnRhcnJheTsKKwl0cnkgeworCQlpZiAoJGFycmF5KSB7CisJCQlAcmVzdWx0ID0gJiRjb2RlOworCQl9IGVsc2UgeworCQkJJHJlc3VsdFswXSA9ICYkY29kZTsKKwkJfQorCX0gY2F0Y2ggR2l0OjpFcnJvcjo6Q29tbWFuZCB3aXRoIHsKKwkJbXkgJEUgPSBzaGlmdDsKKwkJJGVyciA9ICRlcnJtc2c7CisJCSRlcnIgPX4gcy9cJXMvJEUtPmNtZGxpbmUoKS9nZTsKKwkJJGVyciA9fiBzL1wlZC8kRS0+dmFsdWUoKS9nZTsKKwkJIyBXZSBjYW4ndCBjcm9hayBoZXJlIHNpbmNlIEVycm9yLnBtIHdvdWxkIG1hbmdsZQorCQkjIHRoYXQgdG8gRXJyb3I6OlNpbXBsZS4KKwl9OworCSRlcnIgYW5kIGNyb2FrICRlcnI7CisJcmV0dXJuICRhcnJheSA/IEByZXN1bHQgOiAkcmVzdWx0WzBdOworfQorCisKKz1iYWNrCisKKz1oZWFkMSBDT1BZUklHSFQKKworQ29weXJpZ2h0IDIwMDYgYnkgUGV0ciBCYXVkaXMgRTxsdD5wYXNreUBzdXNlLmN6RTxndD4uCisKK1RoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmU7IGl0IG1heSBiZSB1c2VkLCBjb3BpZWQsIG1vZGlmaWVkCithbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSwKK2VpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKz1jdXQKKworCisjIFRha2UgcmF3IG1ldGhvZCBhcmd1bWVudCBsaXN0IGFuZCByZXR1cm4gKCRvYmosIEBhcmdzKSBpbiBjYXNlCisjIHRoZSBtZXRob2Qgd2FzIGNhbGxlZCB1cG9uIGFuIGluc3RhbmNlIGFuZCAodW5kZWYsIEBhcmdzKSBpZgorIyBpdCB3YXMgY2FsbGVkIGRpcmVjdGx5Lgorc3ViIF9tYXliZV9zZWxmIHsKKwkjIFRoaXMgYnJlYWtzIGluaGVyaXRhbmNlLiBPaCB3ZWxsLgorCXJlZiAkX1swXSBlcSAnR2l0JyA/IEBfIDogKHVuZGVmLCBAXyk7Cit9CisKKyMgQ2hlY2sgaWYgdGhlIGNvbW1hbmQgaWQgaXMgc29tZXRoaW5nIHJlYXNvbmFibGUuCitzdWIgX2NoZWNrX3ZhbGlkX2NtZCB7CisJbXkgKCRjbWQpID0gQF87CisJJGNtZCA9fiAvXlthLXowLTlBLVpfLV0rJC8gb3IgdGhyb3cgRXJyb3I6OlNpbXBsZSgiYmFkIGNvbW1hbmQ6ICRjbWQiKTsKK30KKworIyBDb21tb24gYmFja2VuZCBmb3IgdGhlIHBpcGUgY3JlYXRvcnMuCitzdWIgX2NvbW1hbmRfY29tbW9uX3BpcGUgeworCW15ICRkaXJlY3Rpb24gPSBzaGlmdDsKKwlteSAoJHNlbGYsIEBwKSA9IF9tYXliZV9zZWxmKEBfKTsKKwlteSAoJW9wdHMsICRjbWQsIEBhcmdzKTsKKwlpZiAocmVmICRwWzBdKSB7CisJCSgkY21kLCBAYXJncykgPSBAe3NoaWZ0IEBwfTsKKwkJJW9wdHMgPSByZWYgJHBbMF0gPyAleyRwWzBdfSA6IEBwOworCX0gZWxzZSB7CisJCSgkY21kLCBAYXJncykgPSBAcDsKKwl9CisJX2NoZWNrX3ZhbGlkX2NtZCgkY21kKTsKKworCW15ICRmaDsKKwlpZiAoJF5PIGVxICdNU1dpbjMyJykgeworCQkjIEFjdGl2ZVN0YXRlIFBlcmwKKwkJI2RlZmluZWQgJG9wdHN7U1RERVJSfSBhbmQKKwkJIwl3YXJuICdpZ25vcmluZyBTVERFUlIgb3B0aW9uIC0gcnVubmluZyB3LyBBY3RpdmVTdGF0ZSc7CisJCSRkaXJlY3Rpb24gZXEgJy18JyBvcgorCQkJZGllICdpbnB1dCBwaXBlIGZvciBBY3RpdmVTdGF0ZSBub3QgaW1wbGVtZW50ZWQnOworCQkjIHRoZSBzdHJhbmdlIGNvbnN0cnVjdGlvbiB3aXRoICpBQ1BJUEUgaXMganVzdCB0bworCQkjIGV4cGxhaW4gdGhlIHRpZSBiZWxvdyB0aGF0IHdlIHdhbnQgdG8gYmluZCB0bworCQkjIGEgaGFuZGxlIGNsYXNzLCBub3Qgc2NhbGFyLiBJdCBpcyBub3Qga25vd24gaWYKKwkJIyBpdCBpcyBzb21ldGhpbmcgc3BlY2lmaWMgdG8gQWN0aXZlU3RhdGUgUGVybCBvcgorCQkjIGp1c3QgYSBQZXJsIHF1aXJrLgorCQl0aWUgKCpBQ1BJUEUsICdHaXQ6OmFjdGl2ZXN0YXRlX3BpcGUnLCAkY21kLCBAYXJncyk7CisJCSRmaCA9ICpBQ1BJUEU7CisKKwl9IGVsc2UgeworCQlteSAkcGlkID0gb3BlbigkZmgsICRkaXJlY3Rpb24pOworCQlpZiAobm90IGRlZmluZWQgJHBpZCkgeworCQkJdGhyb3cgRXJyb3I6OlNpbXBsZSgib3BlbiBmYWlsZWQ6ICQhIik7CisJCX0gZWxzaWYgKCRwaWQgPT0gMCkgeworCQkJaWYgKGRlZmluZWQgJG9wdHN7U1RERVJSfSkgeworCQkJCWNsb3NlIFNUREVSUjsKKwkJCX0KKwkJCWlmICgkb3B0c3tTVERFUlJ9KSB7CisJCQkJb3BlbiAoU1RERVJSLCAnPiYnLCAkb3B0c3tTVERFUlJ9KQorCQkJCQlvciBkaWUgImR1cCBmYWlsZWQ6ICQhIjsKKwkJCX0KKwkJCV9jbWRfZXhlYygkc2VsZiwgJGNtZCwgQGFyZ3MpOworCQl9CisJfQorCXJldHVybiB3YW50YXJyYXkgPyAoJGZoLCBqb2luKCcgJywgJGNtZCwgQGFyZ3MpKSA6ICRmaDsKK30KKworIyBXaGVuIGFscmVhZHkgaW4gdGhlIHN1YnByb2Nlc3MsIHNldCB1cCB0aGUgYXBwcm9wcmlhdGUgc3RhdGUKKyMgZm9yIHRoZSBnaXZlbiByZXBvc2l0b3J5IGFuZCBleGVjdXRlIHRoZSBnaXQgY29tbWFuZC4KK3N1YiBfY21kX2V4ZWMgeworCW15ICgkc2VsZiwgQGFyZ3MpID0gQF87CisJaWYgKCRzZWxmKSB7CisJCSRzZWxmLT5yZXBvX3BhdGgoKSBhbmQgJEVOVnsnR0lUX0RJUid9ID0gJHNlbGYtPnJlcG9fcGF0aCgpOworCQkkc2VsZi0+d2NfcGF0aCgpIGFuZCBjaGRpcigkc2VsZi0+d2NfcGF0aCgpKTsKKwkJJHNlbGYtPndjX3N1YmRpcigpIGFuZCBjaGRpcigkc2VsZi0+d2Nfc3ViZGlyKCkpOworCX0KKwlfZXhlY3ZfZ2l0X2NtZChAYXJncyk7CisJZGllIHFxW2V4ZWMgIkBhcmdzIiBmYWlsZWQ6ICQhXTsKK30KKworIyBFeGVjdXRlIHRoZSBnaXZlbiBHaXQgY29tbWFuZCAoJF9bMF0pIHdpdGggYXJndW1lbnRzICgkX1sxLi5dKQorIyBieSBzZWFyY2hpbmcgZm9yIGl0IGF0IHByb3BlciBwbGFjZXMuCitzdWIgX2V4ZWN2X2dpdF9jbWQgeyBleGVjKCdnaXQnLCBAXyk7IH0KKworIyBDbG9zZSBwaXBlIHRvIGEgc3VicHJvY2Vzcy4KK3N1YiBfY21kX2Nsb3NlIHsKKwlteSAoJGZoLCAkY3R4KSA9IEBfOworCWlmIChub3QgY2xvc2UgJGZoKSB7CisJCWlmICgkISkgeworCQkJIyBJdCdzIGp1c3QgY2xvc2UsIG5vIHBvaW50IGluIGZhdGFsaXRpZXMKKwkJCWNhcnAgImVycm9yIGNsb3NpbmcgcGlwZTogJCEiOworCQl9IGVsc2lmICgkPyA+PiA4KSB7CisJCQkjIFRoZSBjYWxsZXIgc2hvdWxkIHBlcHBlciB0aGlzLgorCQkJdGhyb3cgR2l0OjpFcnJvcjo6Q29tbWFuZCgkY3R4LCAkPyA+PiA4KTsKKwkJfQorCQkjIGVsc2Ugd2UgbWlnaHQgZS5nLiBjbG9zZWQgYSBsaXZlIHN0cmVhbTsgdGhlIGNvbW1hbmQKKwkJIyBkeWluZyBvZiBTSUdQSVBFIHdvdWxkIGRyaXZlIHVzIGhlcmUuCisJfQorfQorCisKK3N1YiBERVNUUk9ZIHsgfQorCisKKyMgUGlwZSBpbXBsZW1lbnRhdGlvbiBmb3IgQWN0aXZlU3RhdGUgUGVybC4KKworcGFja2FnZSBHaXQ6OmFjdGl2ZXN0YXRlX3BpcGU7Cit1c2Ugc3RyaWN0OworCitzdWIgVElFSEFORExFIHsKKwlteSAoJGNsYXNzLCBAcGFyYW1zKSA9IEBfOworCSMgRklYTUU6IFRoaXMgaXMgcHJvYmFibHkgaG9ycmlibGUgaWRlYSBhbmQgdGhlIHRoaW5nIHdpbGwgZXhwbG9kZQorCSMgYXQgdGhlIG1vbWVudCB5b3UgZ2l2ZSBpdCBhcmd1bWVudHMgdGhhdCByZXF1aXJlIHNvbWUgcXVvdGluZywKKwkjIGJ1dCBJIGhhdmUgbm8gQWN0aXZlU3RhdGUgY2x1ZS4uLiAtLXBhc2t5CisJIyBMZXQncyBqdXN0IGhvcGUgQWN0aXZlU3RhdGUgUGVybCBkb2VzIGF0IGxlYXN0IHRoZSBxdW90aW5nCisJIyBjb3JyZWN0bHkuCisJbXkgQGRhdGEgPSBxeHtnaXQgQHBhcmFtc307CisJYmxlc3MgeyBpID0+IDAsIGRhdGEgPT4gXEBkYXRhIH0sICRjbGFzczsKK30KKworc3ViIFJFQURMSU5FIHsKKwlteSAkc2VsZiA9IHNoaWZ0OworCWlmICgkc2VsZi0+e2l9ID49IHNjYWxhciBAeyRzZWxmLT57ZGF0YX19KSB7CisJCXJldHVybiB1bmRlZjsKKwl9CisJbXkgJGkgPSAkc2VsZi0+e2l9OworCWlmICh3YW50YXJyYXkpIHsKKwkJJHNlbGYtPntpfSA9ICQjeyRzZWxmLT57J2RhdGEnfX0gKyAxOworCQlyZXR1cm4gc3BsaWNlKEB7JHNlbGYtPnsnZGF0YSd9fSwgJGkpOworCX0KKwkkc2VsZi0+e2l9ID0gJGkgKyAxOworCXJldHVybiAkc2VsZi0+eydkYXRhJ30tPlsgJGkgXTsKK30KKworc3ViIENMT1NFIHsKKwlteSAkc2VsZiA9IHNoaWZ0OworCWRlbGV0ZSAkc2VsZi0+e2RhdGF9OworCWRlbGV0ZSAkc2VsZi0+e2l9OworfQorCitzdWIgRU9GIHsKKwlteSAkc2VsZiA9IHNoaWZ0OworCXJldHVybiAoJHNlbGYtPntpfSA+PSBzY2FsYXIgQHskc2VsZi0+e2RhdGF9fSk7Cit9CisKKworMTsgIyBGYW1vdXMgbGFzdCB3b3JkcwpkaWZmIC0tZ2l0IGEvcGVybC9NYWtlZmlsZSBiL3BlcmwvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUwNzlhZAotLS0gL2Rldi9udWxsCisrKyBiL3BlcmwvTWFrZWZpbGUKQEAgLTAsMCArMSw0MiBAQAorIworIyBNYWtlZmlsZSBmb3IgcGVybCBzdXBwb3J0IG1vZHVsZXMgYW5kIHJvdXRpbmUKKyMKK21ha2ZpbGU6PXBlcmwubWFrCisKK1BFUkxfUEFUSF9TUSA9ICQoc3Vic3QgJywnXCcnLCQoUEVSTF9QQVRIKSkKK3ByZWZpeF9TUSA9ICQoc3Vic3QgJywnXCcnLCQocHJlZml4KSkKKworaWZuZGVmIFYKKwlRVUlFVCA9IEAKK2VuZGlmCisKK2FsbCBpbnN0YWxsIGluc3RsaWJkaXI6ICQobWFrZmlsZSkKKwkkKFFVSUVUKSQoTUFLRSkgLWYgJChtYWtmaWxlKSAkQAorCitjbGVhbjoKKwkkKFFVSUVUKXRlc3QgLWYgJChtYWtmaWxlKSAmJiAkKE1BS0UpIC1mICQobWFrZmlsZSkgJEAgfHwgZXhpdCAwCisJJChSTSkgcHBwb3J0LmgKKwkkKFJNKSAkKG1ha2ZpbGUpCisJJChSTSkgJChtYWtmaWxlKS5vbGQKKworaWZkZWYgTk9fUEVSTF9NQUtFTUFLRVIKK2luc3RkaXJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKHByZWZpeCkvbGliKQorJChtYWtmaWxlKTogLi4vR0lULUNGTEFHUyBNYWtlZmlsZQorCWVjaG8gYWxsOiA+ICRACisJZWNobyAnCTonID4+ICRACisJZWNobyBpbnN0YWxsOiA+PiAkQAorCWVjaG8gJwlta2RpciAtcCAkKGluc3RkaXJfU1EpJyA+PiAkQAorCWVjaG8gJwkkKFJNKSAkKGluc3RkaXJfU1EpL0dpdC5wbTsgY3AgR2l0LnBtICQoaW5zdGRpcl9TUSknID4+ICRACisJZWNobyAnCSQoUk0pICQoaW5zdGRpcl9TUSkvRXJyb3IucG07IFwKKwljcCBwcml2YXRlLUVycm9yLnBtICQoaW5zdGRpcl9TUSkvRXJyb3IucG0nID4+ICRACisJZWNobyBpbnN0bGliZGlyOiA+PiAkQAorCWVjaG8gJwllY2hvICQoaW5zdGRpcl9TUSknID4+ICRACitlbHNlCiskKG1ha2ZpbGUpOiBNYWtlZmlsZS5QTCAuLi9HSVQtQ0ZMQUdTCisJJChQRVJMX1BBVEgpICQ8IFBSRUZJWD0nJChwcmVmaXhfU1EpJworZW5kaWYKKworIyB0aGlzIGlzIGp1c3QgYWRkZWQgY29tZm9ydCBmb3IgY2FsbGluZyBtYWtlIGRpcmVjdGx5IGluIHBlcmwgZGlyCisjIChldmVuIHRob3VnaCBHSVQtQ0ZMQUdTIGFyZW4ndCB1c2VkIHlldC4gSWYgZXZlcikKKy4uL0dJVC1DRkxBR1M6CisJJChNQUtFKSAtQyAuLiBHSVQtQ0ZMQUdTCmRpZmYgLS1naXQgYS9wZXJsL01ha2VmaWxlLlBMIGIvcGVybC9NYWtlZmlsZS5QTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjAyNTNlCi0tLSAvZGV2L251bGwKKysrIGIvcGVybC9NYWtlZmlsZS5QTApAQCAtMCwwICsxLDMwIEBACit1c2UgRXh0VXRpbHM6Ok1ha2VNYWtlcjsKKworc3ViIE1ZOjpwb3N0YW1ibGUgeworCXJldHVybiA8PCdNQUtFX0ZSQUcnOworaW5zdGxpYmRpcjoKKwlAZWNobyAnJChJTlNUQUxMU0lURUxJQiknCisKK01BS0VfRlJBRworfQorCitteSAlcG0gPSAoJ0dpdC5wbScgPT4gJyQoSU5TVF9MSUJESVIpL0dpdC5wbScpOworCisjIFdlIGNvbWUgd2l0aCBvdXIgb3duIGJ1bmRsZWQgRXJyb3IucG0uIEl0J3Mgbm90IGluIHRoZSBzZXQgb2YgZGVmYXVsdAorIyBQZXJsIG1vZHVsZXMgc28gaW5zdGFsbCBpdCBpZiBpdCdzIG5vdCBhdmFpbGFibGUgb24gdGhlIHN5c3RlbSB5ZXQuCitldmFsIHsgcmVxdWlyZSBFcnJvciB9OworaWYgKCRAIHx8ICRFcnJvcjo6VkVSU0lPTiA8IDAuMTUwMDkpIHsKKwkkcG17J3ByaXZhdGUtRXJyb3IucG0nfSA9ICckKElOU1RfTElCRElSKS9FcnJvci5wbSc7Cit9CisKKyMgcmVkaXJlY3Qgc3Rkb3V0LCBvdGhlcndpc2UgdGhlIG1lc3NhZ2UgIldyaXRpbmcgcGVybC5tYWsgZm9yIEdpdCIKKyMgZGlzcnVwdHMgdGhlIG91dHB1dCBmb3IgdGhlIHRhcmdldCAnaW5zdGxpYmRpcicKK29wZW4gU1RET1VULCAiPiZTVERFUlIiOworCitXcml0ZU1ha2VmaWxlKAorCU5BTUUgICAgICAgICAgICA9PiAnR2l0JywKKwlWRVJTSU9OX0ZST00gICAgPT4gJ0dpdC5wbScsCisJUE0JCT0+IFwlcG0sCisJTUFLRUZJTEUJPT4gJ3BlcmwubWFrJywKKwlJTlNUQUxMU0lURU1BTjNESVIgPT4gJyQoU0lURVBSRUZJWCkvc2hhcmUvbWFuL21hbjMnCispOwpkaWZmIC0tZ2l0IGEvcGVybC9wcml2YXRlLUVycm9yLnBtIGIvcGVybC9wcml2YXRlLUVycm9yLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZTljZDkKLS0tIC9kZXYvbnVsbAorKysgYi9wZXJsL3ByaXZhdGUtRXJyb3IucG0KQEAgLTAsMCArMSw4MjcgQEAKKyMgRXJyb3IucG0KKyMKKyMgQ29weXJpZ2h0IChjKSAxOTk3LTggR3JhaGFtIEJhcnIgPGdiYXJyQHRpLmNvbT4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgorIworIyBCYXNlZCBvbiBteSBvcmlnaW5hbCBFcnJvci5wbSwgYW5kIEV4Y2VwdGlvbnMucG0gYnkgUGV0ZXIgU2VpYmVsCisjIDxwZXRlckB3ZWJsb2dpYy5jb20+IGFuZCBhZGFwdGVkIGJ5IEplc3NlIEdsaWNrIDxqZ2xpY2tAc2lnLmJzaC5jb20+LgorIworIyBidXQgbW9kaWZpZWQgKioqc2lnbmlmaWNhbnRseSoqKgorCitwYWNrYWdlIEVycm9yOworCit1c2Ugc3RyaWN0OwordXNlIHZhcnMgcXcoJFZFUlNJT04pOwordXNlIDUuMDA0OworCiskVkVSU0lPTiA9ICIwLjE1MDA5IjsKKwordXNlIG92ZXJsb2FkICgKKwknIiInCSAgID0+CSdzdHJpbmdpZnknLAorCScwKycJICAgPT4JJ3ZhbHVlJywKKwknYm9vbCcgICAgID0+CXN1YiB7IHJldHVybiAxOyB9LAorCSdmYWxsYmFjaycgPT4JMQorKTsKKworJEVycm9yOjpEZXB0aCA9IDA7CSMgRGVwdGggdG8gcGFzcyB0byBjYWxsZXIoKQorJEVycm9yOjpEZWJ1ZyA9IDA7CSMgR2VuZXJhdGUgdmVyYm9zZSBzdGFjayB0cmFjZXMKK0BFcnJvcjo6U1RBQ0sgPSAoKTsJIyBDbGF1c2Ugc3RhY2sgZm9yIHRyeQorJEVycm9yOjpUSFJPV04gPSB1bmRlZjsJIyBsYXN0IGVycm9yIHRocm93biwgYSB3b3JrYXJvdW5kIHVudGlsIGRpZSAkcmVmIHdvcmtzCisKK215ICRMQVNUOwkJIyBMYXN0IGVycm9yIGNyZWF0ZWQKK215ICVFUlJPUjsJCSMgTGFzdCBlcnJvciBhc3NvY2lhdGVkIHdpdGggcGFja2FnZQorCitzdWIgdGhyb3dfRXJyb3JfU2ltcGxlCit7CisgICAgbXkgJGFyZ3MgPSBzaGlmdDsKKyAgICByZXR1cm4gRXJyb3I6OlNpbXBsZS0+bmV3KCRhcmdzLT57J3RleHQnfSk7Cit9CisKKyRFcnJvcjo6T2JqZWN0aWZ5Q2FsbGJhY2sgPSBcJnRocm93X0Vycm9yX1NpbXBsZTsKKworCisjIEV4cG9ydGVkIHN1YnMgYXJlIGRlZmluZWQgaW4gRXJyb3I6OnN1YnMKKworc3ViIGltcG9ydCB7CisgICAgc2hpZnQ7CisgICAgbG9jYWwgJEV4cG9ydGVyOjpFeHBvcnRMZXZlbCA9ICRFeHBvcnRlcjo6RXhwb3J0TGV2ZWwgKyAxOworICAgIEVycm9yOjpzdWJzLT5pbXBvcnQoQF8pOworfQorCisjIEkgcmVhbGx5IHdhbnQgdG8gdXNlIGxhc3QgZm9yIHRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kLCBidXQgaXQgaXMgYSBrZXl3b3JkCisjIHdoaWNoIHByZXZlbnQgdGhlIHN5bnRheCAgbGFzdCBFcnJvcgorCitzdWIgcHJpb3IgeworICAgIHNoaWZ0OyAjIGlnbm9yZQorCisgICAgcmV0dXJuICRMQVNUIHVubGVzcyBAXzsKKworICAgIG15ICRwa2cgPSBzaGlmdDsKKyAgICByZXR1cm4gZXhpc3RzICRFUlJPUnskcGtnfSA/ICRFUlJPUnskcGtnfSA6IHVuZGVmCisJdW5sZXNzIHJlZigkcGtnKTsKKworICAgIG15ICRvYmogPSAkcGtnOworICAgIG15ICRlcnIgPSB1bmRlZjsKKyAgICBpZigkb2JqLT5pc2EoJ0hBU0gnKSkgeworCSRlcnIgPSAkb2JqLT57J19fRXJyb3JfXyd9CisJICAgIGlmIGV4aXN0cyAkb2JqLT57J19fRXJyb3JfXyd9OworICAgIH0KKyAgICBlbHNpZigkb2JqLT5pc2EoJ0dMT0InKSkgeworCSRlcnIgPSAkeyokb2JqfXsnX19FcnJvcl9fJ30KKwkgICAgaWYgZXhpc3RzICR7KiRvYmp9eydfX0Vycm9yX18nfTsKKyAgICB9CisKKyAgICAkZXJyOworfQorCitzdWIgZmx1c2ggeworICAgIHNoaWZ0OyAjaWdub3JlCisKKyAgICB1bmxlc3MgKEBfKSB7CisgICAgICAgJExBU1QgPSB1bmRlZjsKKyAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbXkgJHBrZyA9IHNoaWZ0OworICAgIHJldHVybiB1bmxlc3MgcmVmKCRwa2cpOworCisgICAgdW5kZWYgJEVSUk9SeyRwa2d9IGlmIGRlZmluZWQgJEVSUk9SeyRwa2d9OworfQorCisjIFJldHVybiBhcyBtdWNoIGluZm9ybWF0aW9uIGFzIHBvc3NpYmxlIGFib3V0IHdoZXJlIHRoZSBlcnJvcgorIyBoYXBwZW5lZC4gVGhlIC1zdGFja3RyYWNlIGVsZW1lbnQgb25seSBleGlzdHMgaWYgJEVycm9yOjpERUJVRworIyB3YXMgc2V0IHdoZW4gdGhlIGVycm9yIHdhcyBjcmVhdGVkCisKK3N1YiBzdGFja3RyYWNlIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Jy1zdGFja3RyYWNlJ30KKwlpZiBleGlzdHMgJHNlbGYtPnsnLXN0YWNrdHJhY2UnfTsKKworICAgIG15ICR0ZXh0ID0gZXhpc3RzICRzZWxmLT57Jy10ZXh0J30gPyAkc2VsZi0+eyctdGV4dCd9IDogIkRpZWQiOworCisgICAgJHRleHQgLj0gc3ByaW50ZigiIGF0ICVzIGxpbmUgJWQuXG4iLCAkc2VsZi0+ZmlsZSwgJHNlbGYtPmxpbmUpCisJdW5sZXNzKCR0ZXh0ID1+IC9cbiQvcyk7CisKKyAgICAkdGV4dDsKK30KKworIyBBbGxvdyBlcnJvciBwcm9wYWdhdGlvbiwgaWUKKyMKKyMgJGJlci0+ZW5jb2RlKC4uLikgb3IKKyMgICAgcmV0dXJuIEVycm9yLT5wcmlvcigkYmVyKS0+YXNzb2NpYXRlKCRsZGFwKTsKKworc3ViIGFzc29jaWF0ZSB7CisgICAgbXkgJGVyciA9IHNoaWZ0OworICAgIG15ICRvYmogPSBzaGlmdDsKKworICAgIHJldHVybiB1bmxlc3MgcmVmKCRvYmopOworCisgICAgaWYoJG9iai0+aXNhKCdIQVNIJykpIHsKKwkkb2JqLT57J19fRXJyb3JfXyd9ID0gJGVycjsKKyAgICB9CisgICAgZWxzaWYoJG9iai0+aXNhKCdHTE9CJykpIHsKKwkkeyokb2JqfXsnX19FcnJvcl9fJ30gPSAkZXJyOworICAgIH0KKyAgICAkb2JqID0gcmVmKCRvYmopOworICAgICRFUlJPUnsgcmVmKCRvYmopIH0gPSAkZXJyOworCisgICAgcmV0dXJuOworfQorCitzdWIgbmV3IHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15KCRwa2csJGZpbGUsJGxpbmUpID0gY2FsbGVyKCRFcnJvcjo6RGVwdGgpOworCisgICAgbXkgJGVyciA9IGJsZXNzIHsKKwknLXBhY2thZ2UnID0+ICRwa2csCisJJy1maWxlJyAgICA9PiAkZmlsZSwKKwknLWxpbmUnICAgID0+ICRsaW5lLAorCUBfCisgICAgfSwgJHNlbGY7CisKKyAgICAkZXJyLT5hc3NvY2lhdGUoJGVyci0+eyctb2JqZWN0J30pCisJaWYoZXhpc3RzICRlcnItPnsnLW9iamVjdCd9KTsKKworICAgICMgVG8gYWx3YXlzIGNyZWF0ZSBhIHN0YWNrdHJhY2Ugd291bGQgYmUgdmVyeSBpbmVmZmljaWVudCwgc28KKyAgICAjIHdlIG9ubHkgZG8gaXQgaWYgJEVycm9yOjpEZWJ1ZyBpcyBzZXQKKworICAgIGlmKCRFcnJvcjo6RGVidWcpIHsKKwlyZXF1aXJlIENhcnA7CisJbG9jYWwgJENhcnA6OkNhcnBMZXZlbCA9ICRFcnJvcjo6RGVwdGg7CisJbXkgJHRleHQgPSBkZWZpbmVkKCRlcnItPnsnLXRleHQnfSkgPyAkZXJyLT57Jy10ZXh0J30gOiAiRXJyb3IiOworCW15ICR0cmFjZSA9IENhcnA6OmxvbmdtZXNzKCR0ZXh0KTsKKwkjIFJlbW92ZSB0cnkgY2FsbHMgZnJvbSB0aGUgdHJhY2UKKwkkdHJhY2UgPX4gcy8oXG5ccytcUytfX0FOT05fX1teXG5dKyk/XG5ccytldmFsW15cbl0rXG5ccytFcnJvcjo6c3Viczo6dHJ5W15cbl0rKD89XG4pLy9zb2c7CisJJHRyYWNlID1+IHMvKFxuXHMrXFMrX19BTk9OX19bXlxuXSspP1xuXHMrZXZhbFteXG5dK1xuXHMrRXJyb3I6OnN1YnM6OnJ1bl9jbGF1c2VzW15cbl0rXG5ccytFcnJvcjo6c3Viczo6dHJ5W15cbl0rKD89XG4pLy9zb2c7CisJJGVyci0+eyctc3RhY2t0cmFjZSd9ID0gJHRyYWNlCisgICAgfQorCisgICAgJEAgPSAkTEFTVCA9ICRFUlJPUnskcGtnfSA9ICRlcnI7Cit9CisKKyMgVGhyb3cgYW4gZXJyb3IuIHRoaXMgY29udGFpbnMgc29tZSB2ZXJ5IGdvcnkgY29kZS4KKworc3ViIHRocm93IHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIGxvY2FsICRFcnJvcjo6RGVwdGggPSAkRXJyb3I6OkRlcHRoICsgMTsKKworICAgICMgaWYgd2UgYXJlIG5vdCByZXRocm93LWluZyB0aGVuIGNyZWF0ZSB0aGUgb2JqZWN0IHRvIHRocm93CisgICAgJHNlbGYgPSAkc2VsZi0+bmV3KEBfKSB1bmxlc3MgcmVmKCRzZWxmKTsKKworICAgIGRpZSAkRXJyb3I6OlRIUk9XTiA9ICRzZWxmOworfQorCisjIHN5bnRhY3RpYyBzdWdhciBmb3IKKyMKKyMgICAgZGllIHdpdGggRXJyb3IoIC4uLiApOworCitzdWIgd2l0aCB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBsb2NhbCAkRXJyb3I6OkRlcHRoID0gJEVycm9yOjpEZXB0aCArIDE7CisKKyAgICAkc2VsZi0+bmV3KEBfKTsKK30KKworIyBzeW50YWN0aWMgc3VnYXIgZm9yCisjCisjICAgIHJlY29yZCBFcnJvciggLi4uICkgYW5kIHJldHVybjsKKworc3ViIHJlY29yZCB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBsb2NhbCAkRXJyb3I6OkRlcHRoID0gJEVycm9yOjpEZXB0aCArIDE7CisKKyAgICAkc2VsZi0+bmV3KEBfKTsKK30KKworIyBjYXRjaCBjbGF1c2UgZm9yCisjCisjIHRyeSB7IC4uLiB9IGNhdGNoIENMQVNTIHdpdGggeyAuLi4gfQorCitzdWIgY2F0Y2ggeworICAgIG15ICRwa2cgPSBzaGlmdDsKKyAgICBteSAkY29kZSA9IHNoaWZ0OworICAgIG15ICRjbGF1c2VzID0gc2hpZnQgfHwge307CisgICAgbXkgJGNhdGNoID0gJGNsYXVzZXMtPnsnY2F0Y2gnfSB8fD0gW107CisKKyAgICB1bnNoaWZ0IEAkY2F0Y2gsICAkcGtnLCAkY29kZTsKKworICAgICRjbGF1c2VzOworfQorCisjIE9iamVjdCBxdWVyeSBtZXRob2RzCisKK3N1YiBvYmplY3QgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgZXhpc3RzICRzZWxmLT57Jy1vYmplY3QnfSA/ICRzZWxmLT57Jy1vYmplY3QnfSA6IHVuZGVmOworfQorCitzdWIgZmlsZSB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBleGlzdHMgJHNlbGYtPnsnLWZpbGUnfSA/ICRzZWxmLT57Jy1maWxlJ30gOiB1bmRlZjsKK30KKworc3ViIGxpbmUgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgZXhpc3RzICRzZWxmLT57Jy1saW5lJ30gPyAkc2VsZi0+eyctbGluZSd9IDogdW5kZWY7Cit9CisKK3N1YiB0ZXh0IHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIGV4aXN0cyAkc2VsZi0+eyctdGV4dCd9ID8gJHNlbGYtPnsnLXRleHQnfSA6IHVuZGVmOworfQorCisjIG92ZXJsb2FkIG1ldGhvZHMKKworc3ViIHN0cmluZ2lmeSB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBkZWZpbmVkICRzZWxmLT57Jy10ZXh0J30gPyAkc2VsZi0+eyctdGV4dCd9IDogIkRpZWQiOworfQorCitzdWIgdmFsdWUgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgZXhpc3RzICRzZWxmLT57Jy12YWx1ZSd9ID8gJHNlbGYtPnsnLXZhbHVlJ30gOiB1bmRlZjsKK30KKworcGFja2FnZSBFcnJvcjo6U2ltcGxlOworCitARXJyb3I6OlNpbXBsZTo6SVNBID0gcXcoRXJyb3IpOworCitzdWIgbmV3IHsKKyAgICBteSAkc2VsZiAgPSBzaGlmdDsKKyAgICBteSAkdGV4dCAgPSAiIiAuIHNoaWZ0OworICAgIG15ICR2YWx1ZSA9IHNoaWZ0OworICAgIG15KEBhcmdzKSA9ICgpOworCisgICAgbG9jYWwgJEVycm9yOjpEZXB0aCA9ICRFcnJvcjo6RGVwdGggKyAxOworCisgICAgQGFyZ3MgPSAoIC1maWxlID0+ICQxLCAtbGluZSA9PiAkMikKKwlpZigkdGV4dCA9fiBzL1xzK2F0XHMrKFxTKylccytsaW5lXHMrKFxkKykoPzosXHMqPFtePl0qPlxzK2xpbmVccytcZCspP1wuP1xuPyQvL3MpOworICAgIHB1c2goQGFyZ3MsICctdmFsdWUnLCAwICsgJHZhbHVlKQorCWlmIGRlZmluZWQoJHZhbHVlKTsKKworICAgICRzZWxmLT5TVVBFUjo6bmV3KC10ZXh0ID0+ICR0ZXh0LCBAYXJncyk7Cit9CisKK3N1YiBzdHJpbmdpZnkgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHRleHQgPSAkc2VsZi0+U1VQRVI6OnN0cmluZ2lmeTsKKyAgICAkdGV4dCAuPSBzcHJpbnRmKCIgYXQgJXMgbGluZSAlZC5cbiIsICRzZWxmLT5maWxlLCAkc2VsZi0+bGluZSkKKwl1bmxlc3MoJHRleHQgPX4gL1xuJC9zKTsKKyAgICAkdGV4dDsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgSW5zcGlyZWQgYnkgY29kZSBmcm9tIEplc3NlIEdsaWNrIDxqZ2xpY2tAc2lnLmJzaC5jb20+IGFuZAorIyBQZXRlciBTZWliZWwgPHBldGVyQHdlYmxvZ2ljLmNvbT4KKworcGFja2FnZSBFcnJvcjo6c3ViczsKKwordXNlIEV4cG9ydGVyICgpOwordXNlIHZhcnMgcXcoQEVYUE9SVF9PSyBASVNBICVFWFBPUlRfVEFHUyk7CisKK0BFWFBPUlRfT0sgICA9IHF3KHRyeSB3aXRoIGZpbmFsbHkgZXhjZXB0IG90aGVyd2lzZSk7CislRVhQT1JUX1RBR1MgPSAodHJ5ID0+IFxARVhQT1JUX09LKTsKKworQElTQSA9IHF3KEV4cG9ydGVyKTsKKworCitzdWIgYmxlc3NlZCB7CisJbXkgJGl0ZW0gPSBzaGlmdDsKKwlsb2NhbCAkQDsgIyBkb24ndCBraWxsIGFuIG91dGVyICRACisJcmVmICRpdGVtIGFuZCBldmFsIHsgJGl0ZW0tPmNhbignY2FuJykgfTsKK30KKworCitzdWIgcnVuX2NsYXVzZXMgKCQkJFxAKSB7CisgICAgbXkoJGNsYXVzZXMsJGVyciwkd2FudGFycmF5LCRyZXN1bHQpID0gQF87CisgICAgbXkgJGNvZGUgPSB1bmRlZjsKKworICAgICRlcnIgPSAkRXJyb3I6Ok9iamVjdGlmeUNhbGxiYWNrLT4oeyd0ZXh0JyA9PiRlcnJ9KSB1bmxlc3MgcmVmKCRlcnIpOworCisgICAgQ0FUQ0g6IHsKKworCSMgY2F0Y2gKKwlteSAkY2F0Y2g7CisJaWYoZGVmaW5lZCgkY2F0Y2ggPSAkY2xhdXNlcy0+eydjYXRjaCd9KSkgeworCSAgICBteSAkaSA9IDA7CisKKwkgICAgQ0FUQ0hMT09QOgorCSAgICBmb3IoIDsgJGkgPCBAJGNhdGNoIDsgJGkgKz0gMikgeworCQlteSAkcGtnID0gJGNhdGNoLT5bJGldOworCQl1bmxlc3MoZGVmaW5lZCAkcGtnKSB7CisJCSAgICAjZXhjZXB0CisJCSAgICBzcGxpY2UoQCRjYXRjaCwkaSwyLCRjYXRjaC0+WyRpKzFdLT4oKSk7CisJCSAgICAkaSAtPSAyOworCQkgICAgbmV4dCBDQVRDSExPT1A7CisJCX0KKwkJZWxzaWYoYmxlc3NlZCgkZXJyKSAmJiAkZXJyLT5pc2EoJHBrZykpIHsKKwkJICAgICRjb2RlID0gJGNhdGNoLT5bJGkrMV07CisJCSAgICB3aGlsZSgxKSB7CisJCQlteSAkbW9yZSA9IDA7CisJCQlsb2NhbCgkRXJyb3I6OlRIUk9XTik7CisJCQlteSAkb2sgPSBldmFsIHsKKwkJCSAgICBpZigkd2FudGFycmF5KSB7CisJCQkJQHskcmVzdWx0fSA9ICRjb2RlLT4oJGVycixcJG1vcmUpOworCQkJICAgIH0KKwkJCSAgICBlbHNpZihkZWZpbmVkKCR3YW50YXJyYXkpKSB7CisJCQkgICAgICAgIEB7JHJlc3VsdH0gPSAoKTsKKwkJCQkkcmVzdWx0LT5bMF0gPSAkY29kZS0+KCRlcnIsXCRtb3JlKTsKKwkJCSAgICB9CisJCQkgICAgZWxzZSB7CisJCQkJJGNvZGUtPigkZXJyLFwkbW9yZSk7CisJCQkgICAgfQorCQkJICAgIDE7CisJCQl9OworCQkJaWYoICRvayApIHsKKwkJCSAgICBuZXh0IENBVENITE9PUCBpZiAkbW9yZTsKKwkJCSAgICB1bmRlZiAkZXJyOworCQkJfQorCQkJZWxzZSB7CisJCQkgICAgJGVyciA9IGRlZmluZWQoJEVycm9yOjpUSFJPV04pCisJCQkJICAgID8gJEVycm9yOjpUSFJPV04gOiAkQDsKKyAgICAgICAgICAgICAgICAkZXJyID0gJEVycm9yOjpPYmplY3RpZnlDYWxsYmFjay0+KHsndGV4dCcgPT4kZXJyfSkKKyAgICAgICAgICAgICAgICAgICAgdW5sZXNzIHJlZigkZXJyKTsKKwkJCX0KKwkJCWxhc3QgQ0FUQ0g7CisJCSAgICB9OworCQl9CisJICAgIH0KKwl9CisKKwkjIG90aGVyd2lzZQorCW15ICRvd2lzZTsKKwlpZihkZWZpbmVkKCRvd2lzZSA9ICRjbGF1c2VzLT57J290aGVyd2lzZSd9KSkgeworCSAgICBteSAkY29kZSA9ICRjbGF1c2VzLT57J290aGVyd2lzZSd9OworCSAgICBteSAkbW9yZSA9IDA7CisJICAgIG15ICRvayA9IGV2YWwgeworCQlpZigkd2FudGFycmF5KSB7CisJCSAgICBAeyRyZXN1bHR9ID0gJGNvZGUtPigkZXJyLFwkbW9yZSk7CisJCX0KKwkJZWxzaWYoZGVmaW5lZCgkd2FudGFycmF5KSkgeworCQkgICAgQHskcmVzdWx0fSA9ICgpOworCQkgICAgJHJlc3VsdC0+WzBdID0gJGNvZGUtPigkZXJyLFwkbW9yZSk7CisJCX0KKwkJZWxzZSB7CisJCSAgICAkY29kZS0+KCRlcnIsXCRtb3JlKTsKKwkJfQorCQkxOworCSAgICB9OworCSAgICBpZiggJG9rICkgeworCQl1bmRlZiAkZXJyOworCSAgICB9CisJICAgIGVsc2UgeworCQkkZXJyID0gZGVmaW5lZCgkRXJyb3I6OlRIUk9XTikKKwkJCT8gJEVycm9yOjpUSFJPV04gOiAkQDsKKworICAgICAgICAkZXJyID0gJEVycm9yOjpPYmplY3RpZnlDYWxsYmFjay0+KHsndGV4dCcgPT4kZXJyfSkKKyAgICAgICAgICAgIHVubGVzcyByZWYoJGVycik7CisJICAgIH0KKwl9CisgICAgfQorICAgICRlcnI7Cit9CisKK3N1YiB0cnkgKCY7JCkgeworICAgIG15ICR0cnkgPSBzaGlmdDsKKyAgICBteSAkY2xhdXNlcyA9IEBfID8gc2hpZnQgOiB7fTsKKyAgICBteSAkb2sgPSAwOworICAgIG15ICRlcnIgPSB1bmRlZjsKKyAgICBteSBAcmVzdWx0ID0gKCk7CisKKyAgICB1bnNoaWZ0IEBFcnJvcjo6U1RBQ0ssICRjbGF1c2VzOworCisgICAgbXkgJHdhbnRhcnJheSA9IHdhbnRhcnJheSgpOworCisgICAgZG8geworCWxvY2FsICRFcnJvcjo6VEhST1dOID0gdW5kZWY7CisgICAgbG9jYWwgJEAgPSB1bmRlZjsKKworCSRvayA9IGV2YWwgeworCSAgICBpZigkd2FudGFycmF5KSB7CisJCUByZXN1bHQgPSAkdHJ5LT4oKTsKKwkgICAgfQorCSAgICBlbHNpZihkZWZpbmVkICR3YW50YXJyYXkpIHsKKwkJJHJlc3VsdFswXSA9ICR0cnktPigpOworCSAgICB9CisJICAgIGVsc2UgeworCQkkdHJ5LT4oKTsKKwkgICAgfQorCSAgICAxOworCX07CisKKwkkZXJyID0gZGVmaW5lZCgkRXJyb3I6OlRIUk9XTikgPyAkRXJyb3I6OlRIUk9XTiA6ICRACisJICAgIHVubGVzcyAkb2s7CisgICAgfTsKKworICAgIHNoaWZ0IEBFcnJvcjo6U1RBQ0s7CisKKyAgICAkZXJyID0gcnVuX2NsYXVzZXMoJGNsYXVzZXMsJGVycix3YW50YXJyYXksQHJlc3VsdCkKKwl1bmxlc3MoJG9rKTsKKworICAgICRjbGF1c2VzLT57J2ZpbmFsbHknfS0+KCkKKwlpZihkZWZpbmVkKCRjbGF1c2VzLT57J2ZpbmFsbHknfSkpOworCisgICAgaWYgKGRlZmluZWQoJGVycikpCisgICAgeworICAgICAgICBpZiAoYmxlc3NlZCgkZXJyKSAmJiAkZXJyLT5jYW4oJ3Rocm93JykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93ICRlcnI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkaWUgJGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdhbnRhcnJheSA/IEByZXN1bHQgOiAkcmVzdWx0WzBdOworfQorCisjIEVhY2ggY2xhdXNlIGFkZHMgYSBzdWIgdG8gdGhlIGxpc3Qgb2YgY2xhdXNlcy4gVGhlIGZpbmFsbHkgY2xhdXNlIGlzCisjIGFsd2F5cyB0aGUgbGFzdCwgYW5kIHRoZSBvdGhlcndpc2UgY2xhdXNlIGlzIGFsd2F5cyBhZGRlZCBqdXN0IGJlZm9yZQorIyB0aGUgZmluYWxseSBjbGF1c2UuCisjCisjIEFsbCBjbGF1c2VzLCBleGNlcHQgdGhlIGZpbmFsbHkgY2xhdXNlLCBhZGQgYSBzdWIgd2hpY2ggdGFrZXMgb25lIGFyZ3VtZW50CisjIHRoaXMgYXJndW1lbnQgd2lsbCBiZSB0aGUgZXJyb3IgYmVpbmcgdGhyb3duLiBUaGUgc3ViIHdpbGwgcmV0dXJuIGEgY29kZSByZWYKKyMgaWYgdGhhdCBjbGF1c2UgY2FuIGhhbmRsZSB0aGF0IGVycm9yLCBvdGhlcndpc2UgdW5kZWYgaXMgcmV0dXJuZWQuCisjCisjIFRoZSBvdGhlcndpc2UgY2xhdXNlIGFkZHMgYSBzdWIgd2hpY2ggdW5jb25kaXRpb25hbGx5IHJldHVybnMgdGhlIHVzZXJzCisjIGNvZGUgcmVmZXJlbmNlLCB0aGlzIGlzIHdoeSBpdCBpcyBmb3JjZWQgdG8gYmUgbGFzdC4KKyMKKyMgVGhlIGNhdGNoIGNsYXVzZSBpcyBkZWZpbmVkIGluIEVycm9yLnBtLCBhcyB0aGUgc3ludGF4IGNhdXNlcyBpdCB0bworIyBiZSBjYWxsZWQgYXMgYSBtZXRob2QKKworc3ViIHdpdGggKCY7JCkgeworICAgIEBfCit9CisKK3N1YiBmaW5hbGx5ICgmKSB7CisgICAgbXkgJGNvZGUgPSBzaGlmdDsKKyAgICBteSAkY2xhdXNlcyA9IHsgJ2ZpbmFsbHknID0+ICRjb2RlIH07CisgICAgJGNsYXVzZXM7Cit9CisKKyMgVGhlIGV4Y2VwdCBjbGF1c2UgaXMgYSBibG9jayB3aGljaCByZXR1cm5zIGEgaGFzaHJlZiBvciBhIGxpc3Qgb2YKKyMga2V5LXZhbHVlIHBhaXJzLCB3aGVyZSB0aGUga2V5cyBhcmUgdGhlIGNsYXNzZXMgYW5kIHRoZSB2YWx1ZXMgYXJlIHN1YnMuCisKK3N1YiBleGNlcHQgKCY7JCkgeworICAgIG15ICRjb2RlID0gc2hpZnQ7CisgICAgbXkgJGNsYXVzZXMgPSBzaGlmdCB8fCB7fTsKKyAgICBteSAkY2F0Y2ggPSAkY2xhdXNlcy0+eydjYXRjaCd9IHx8PSBbXTsKKworICAgIG15ICRzdWIgPSBzdWIgeworCW15ICRyZWY7CisJbXkoQGFycmF5KSA9ICRjb2RlLT4oJF9bMF0pOworCWlmKEBhcnJheSA9PSAxICYmIHJlZigkYXJyYXlbMF0pKSB7CisJICAgICRyZWYgPSAkYXJyYXlbMF07CisJICAgICRyZWYgPSBbICUkcmVmIF0KKwkJaWYoVU5JVkVSU0FMOjppc2EoJHJlZiwnSEFTSCcpKTsKKwl9CisJZWxzZSB7CisJICAgICRyZWYgPSBcQGFycmF5OworCX0KKwlAJHJlZgorICAgIH07CisKKyAgICB1bnNoaWZ0IEB7JGNhdGNofSwgdW5kZWYsICRzdWI7CisKKyAgICAkY2xhdXNlczsKK30KKworc3ViIG90aGVyd2lzZSAoJjskKSB7CisgICAgbXkgJGNvZGUgPSBzaGlmdDsKKyAgICBteSAkY2xhdXNlcyA9IHNoaWZ0IHx8IHt9OworCisgICAgaWYoZXhpc3RzICRjbGF1c2VzLT57J290aGVyd2lzZSd9KSB7CisJcmVxdWlyZSBDYXJwOworCUNhcnA6OmNyb2FrKCJNdWx0aXBsZSBvdGhlcndpc2UgY2xhdXNlcyIpOworICAgIH0KKworICAgICRjbGF1c2VzLT57J290aGVyd2lzZSd9ID0gJGNvZGU7CisKKyAgICAkY2xhdXNlczsKK30KKworMTsKK19fRU5EX18KKworPWhlYWQxIE5BTUUKKworRXJyb3IgLSBFcnJvci9leGNlcHRpb24gaGFuZGxpbmcgaW4gYW4gT08taXNoIHdheQorCis9aGVhZDEgU1lOT1BTSVMKKworICAgIHVzZSBFcnJvciBxdyg6dHJ5KTsKKworICAgIHRocm93IEVycm9yOjpTaW1wbGUoICJBIHNpbXBsZSBlcnJvciIpOworCisgICAgc3ViIHh5eiB7CisgICAgICAgIC4uLgorCXJlY29yZCBFcnJvcjo6U2ltcGxlKCJBIHNpbXBsZSBlcnJvciIpCisJICAgIGFuZCByZXR1cm47CisgICAgfQorCisgICAgdW5saW5rKCRmaWxlKSBvciB0aHJvdyBFcnJvcjo6U2ltcGxlKCIkZmlsZTogJCEiLCQhKTsKKworICAgIHRyeSB7CisJZG9fc29tZV9zdHVmZigpOworCWRpZSAiZXJyb3IhIiBpZiAkY29uZGl0aW9uOworCXRocm93IEVycm9yOjpTaW1wbGUgLXRleHQgPT4gIk9vcHMhIiBpZiAkb3RoZXJfY29uZGl0aW9uOworICAgIH0KKyAgICBjYXRjaCBFcnJvcjo6SU8gd2l0aCB7CisJbXkgJEUgPSBzaGlmdDsKKwlwcmludCBTVERFUlIgIkZpbGUgIiwgJEUtPnsnLWZpbGUnfSwgIiBoYWQgYSBwcm9ibGVtXG4iOworICAgIH0KKyAgICBleGNlcHQgeworCW15ICRFID0gc2hpZnQ7CisJbXkgJGdlbmVyYWxfaGFuZGxlcj1zdWIge3NlbmRfbWVzc2FnZSAkRS0+ey1kZXNjcmlwdGlvbn19OworCXJldHVybiB7CisJICAgIFVzZXJFeGNlcHRpb24xID0+ICRnZW5lcmFsX2hhbmRsZXIsCisJICAgIFVzZXJFeGNlcHRpb24yID0+ICRnZW5lcmFsX2hhbmRsZXIKKwl9OworICAgIH0KKyAgICBvdGhlcndpc2UgeworCXByaW50IFNUREVSUiAiV2VsbCBJIGRvbid0IGtub3cgd2hhdCB0byBzYXlcbiI7CisgICAgfQorICAgIGZpbmFsbHkgeworCWNsb3NlX3RoZV9nYXJhZ2VfZG9vcl9hbHJlYWR5KCk7ICMgU2hvdWxkIGJlIHJlbGlhYmxlCisgICAgfTsgIyBEb24ndCBmb3JnZXQgdGhlIHRyYWlsaW5nIDsgb3IgeW91IG1pZ2h0IGJlIHN1cnByaXNlZAorCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhlIEM8RXJyb3I+IHBhY2thZ2UgcHJvdmlkZXMgdHdvIGludGVyZmFjZXMuIEZpcnN0bHkgQzxFcnJvcj4gcHJvdmlkZXMKK2EgcHJvY2VkdXJhbCBpbnRlcmZhY2UgdG8gZXhjZXB0aW9uIGhhbmRsaW5nLiBTZWNvbmRseSBDPEVycm9yPiBpcyBhCitiYXNlIGNsYXNzIGZvciBlcnJvcnMvZXhjZXB0aW9ucyB0aGF0IGNhbiBlaXRoZXIgYmUgdGhyb3duLCBmb3IKK3N1YnNlcXVlbnQgY2F0Y2gsIG9yIGNhbiBzaW1wbHkgYmUgcmVjb3JkZWQuCisKK0Vycm9ycyBpbiB0aGUgY2xhc3MgQzxFcnJvcj4gc2hvdWxkIG5vdCBiZSB0aHJvd24gZGlyZWN0bHksIGJ1dCB0aGUKK3VzZXIgc2hvdWxkIHRocm93IGVycm9ycyBmcm9tIGEgc3ViLWNsYXNzIG9mIEM8RXJyb3I+LgorCis9aGVhZDEgUFJPQ0VEVVJBTCBJTlRFUkZBQ0UKKworQzxFcnJvcj4gZXhwb3J0cyBzdWJyb3V0aW5lcyB0byBwZXJmb3JtIGV4Y2VwdGlvbiBoYW5kbGluZy4gVGhlc2Ugd2lsbAorYmUgZXhwb3J0ZWQgaWYgdGhlIEM8OnRyeT4gdGFnIGlzIHVzZWQgaW4gdGhlIEM8dXNlPiBsaW5lLgorCis9b3ZlciA0CisKKz1pdGVtIHRyeSBCTE9DSyBDTEFVU0VTCisKK0M8dHJ5PiBpcyB0aGUgbWFpbiBzdWJyb3V0aW5lIGNhbGxlZCBieSB0aGUgdXNlci4gQWxsIG90aGVyIHN1YnJvdXRpbmVzCitleHBvcnRlZCBhcmUgY2xhdXNlcyB0byB0aGUgdHJ5IHN1YnJvdXRpbmUuCisKK1RoZSBCTE9DSyB3aWxsIGJlIGV2YWx1YXRlZCBhbmQsIGlmIG5vIGVycm9yIGlzIHRocm93LCB0cnkgd2lsbCByZXR1cm4KK3RoZSByZXN1bHQgb2YgdGhlIGJsb2NrLgorCitDPENMQVVTRVM+IGFyZSB0aGUgc3Vicm91dGluZXMgYmVsb3csIHdoaWNoIGRlc2NyaWJlIHdoYXQgdG8gZG8gaW4gdGhlCitldmVudCBvZiBhbiBlcnJvciBiZWluZyB0aHJvd24gd2l0aGluIEJMT0NLLgorCis9aXRlbSBjYXRjaCBDTEFTUyB3aXRoIEJMT0NLCisKK1RoaXMgY2xhdXNlcyB3aWxsIGNhdXNlIGFsbCBlcnJvcnMgdGhhdCBzYXRpc2Z5IEM8JGVyci1FPGd0PmlzYShDTEFTUyk+Cit0byBiZSBjYXVnaHQgYW5kIGhhbmRsZWQgYnkgZXZhbHVhdGluZyBDPEJMT0NLPi4KKworQzxCTE9DSz4gd2lsbCBiZSBwYXNzZWQgdHdvIGFyZ3VtZW50cy4gVGhlIGZpcnN0IHdpbGwgYmUgdGhlIGVycm9yCitiZWluZyB0aHJvd24uIFRoZSBzZWNvbmQgaXMgYSByZWZlcmVuY2UgdG8gYSBzY2FsYXIgdmFyaWFibGUuIElmIHRoaXMKK3ZhcmlhYmxlIGlzIHNldCBieSB0aGUgY2F0Y2ggYmxvY2sgdGhlbiwgb24gcmV0dXJuIGZyb20gdGhlIGNhdGNoCitibG9jaywgdHJ5IHdpbGwgY29udGludWUgcHJvY2Vzc2luZyBhcyBpZiB0aGUgY2F0Y2ggYmxvY2sgd2FzIG5ldmVyCitmb3VuZC4KKworVG8gcHJvcGFnYXRlIHRoZSBlcnJvciB0aGUgY2F0Y2ggYmxvY2sgbWF5IGNhbGwgQzwkZXJyLUU8Z3Q+dGhyb3c+CisKK0lmIHRoZSBzY2FsYXIgcmVmZXJlbmNlIGJ5IHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgbm90IHNldCwgYW5kIHRoZQorZXJyb3IgaXMgbm90IHRocm93bi4gVGhlbiB0aGUgY3VycmVudCB0cnkgYmxvY2sgd2lsbCByZXR1cm4gd2l0aCB0aGUKK3Jlc3VsdCBmcm9tIHRoZSBjYXRjaCBibG9jay4KKworPWl0ZW0gZXhjZXB0IEJMT0NLCisKK1doZW4gQzx0cnk+IGlzIGxvb2tpbmcgZm9yIGEgaGFuZGxlciwgaWYgYW4gZXhjZXB0IGNsYXVzZSBpcyBmb3VuZAorQzxCTE9DSz4gaXMgZXZhbHVhdGVkLiBUaGUgcmV0dXJuIHZhbHVlIGZyb20gdGhpcyBibG9jayBzaG91bGQgYmUgYQorSEFTSFJFRiBvciBhIGxpc3Qgb2Yga2V5LXZhbHVlIHBhaXJzLCB3aGVyZSB0aGUga2V5cyBhcmUgY2xhc3MgbmFtZXMKK2FuZCB0aGUgdmFsdWVzIGFyZSBDT0RFIHJlZmVyZW5jZXMgZm9yIHRoZSBoYW5kbGVyIG9mIGVycm9ycyBvZiB0aGF0Cit0eXBlLgorCis9aXRlbSBvdGhlcndpc2UgQkxPQ0sKKworQ2F0Y2ggYW55IGVycm9yIGJ5IGV4ZWN1dGluZyB0aGUgY29kZSBpbiBDPEJMT0NLPgorCitXaGVuIGV2YWx1YXRlZCBDPEJMT0NLPiB3aWxsIGJlIHBhc3NlZCBvbmUgYXJndW1lbnQsIHdoaWNoIHdpbGwgYmUgdGhlCitlcnJvciBiZWluZyBwcm9jZXNzZWQuCisKK09ubHkgb25lIG90aGVyd2lzZSBibG9jayBtYXkgYmUgc3BlY2lmaWVkIHBlciB0cnkgYmxvY2sKKworPWl0ZW0gZmluYWxseSBCTE9DSworCitFeGVjdXRlIHRoZSBjb2RlIGluIEM8QkxPQ0s+IGVpdGhlciBhZnRlciB0aGUgY29kZSBpbiB0aGUgdHJ5IGJsb2NrIGhhcworc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCwgb3IgaWYgdGhlIHRyeSBibG9jayB0aHJvd3MgYW4gZXJyb3IgdGhlbgorQzxCTE9DSz4gd2lsbCBiZSBleGVjdXRlZCBhZnRlciB0aGUgaGFuZGxlciBoYXMgY29tcGxldGVkLgorCitJZiB0aGUgaGFuZGxlciB0aHJvd3MgYW4gZXJyb3IgdGhlbiB0aGUgZXJyb3Igd2lsbCBiZSBjYXVnaHQsIHRoZQorZmluYWxseSBibG9jayB3aWxsIGJlIGV4ZWN1dGVkIGFuZCB0aGUgZXJyb3Igd2lsbCBiZSByZS10aHJvd24uCisKK09ubHkgb25lIGZpbmFsbHkgYmxvY2sgbWF5IGJlIHNwZWNpZmllZCBwZXIgdHJ5IGJsb2NrCisKKz1iYWNrCisKKz1oZWFkMSBDTEFTUyBJTlRFUkZBQ0UKKworPWhlYWQyIENPTlNUUlVDVE9SUworCitUaGUgQzxFcnJvcj4gb2JqZWN0IGlzIGltcGxlbWVudGVkIGFzIGEgSEFTSC4gVGhpcyBIQVNIIGlzIGluaXRpYWxpemVkCit3aXRoIHRoZSBhcmd1bWVudHMgdGhhdCBhcmUgcGFzc2VkIHRvIGl0J3MgY29uc3RydWN0b3IuIFRoZSBlbGVtZW50cwordGhhdCBhcmUgdXNlZCBieSwgb3IgYXJlIHJldHJpZXZhYmxlIGJ5IHRoZSBDPEVycm9yPiBjbGFzcyBhcmUgbGlzdGVkCitiZWxvdywgb3RoZXIgY2xhc3NlcyBtYXkgYWRkIHRvIHRoZXNlLgorCisJLWZpbGUKKwktbGluZQorCS10ZXh0CisJLXZhbHVlCisJLW9iamVjdAorCitJZiBDPC1maWxlPiBvciBDPC1saW5lPiBhcmUgbm90IHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IgYXJndW1lbnRzCit0aGVuIHRoZXNlIHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciB3aGVyZQordGhlIGNvbnN0cnVjdG9yIHdhcyBjYWxsZWQgZnJvbS4KKworSWYgdGhlIGVycm9yIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBvYmplY3QgdGhlbiB0aGUgb2JqZWN0IHNob3VsZCBiZQorcGFzc2VkIGFzIHRoZSBDPC1vYmplY3Q+IGFyZ3VtZW50LiBUaGlzIHdpbGwgYWxsb3cgdGhlIEM8RXJyb3I+IHBhY2thZ2UKK3RvIGFzc29jaWF0ZSB0aGUgZXJyb3Igd2l0aCB0aGUgb2JqZWN0LgorCitUaGUgQzxFcnJvcj4gcGFja2FnZSByZW1lbWJlcnMgdGhlIGxhc3QgZXJyb3IgY3JlYXRlZCwgYW5kIGFsc28gdGhlCitsYXN0IGVycm9yIGFzc29jaWF0ZWQgd2l0aCBhIHBhY2thZ2UuIFRoaXMgY291bGQgZWl0aGVyIGJlIHRoZSBsYXN0CitlcnJvciBjcmVhdGVkIGJ5IGEgc3ViIGluIHRoYXQgcGFja2FnZSwgb3IgdGhlIGxhc3QgZXJyb3Igd2hpY2ggcGFzc2VkCithbiBvYmplY3QgYmxlc3NlZCBpbnRvIHRoYXQgcGFja2FnZSBhcyB0aGUgQzwtb2JqZWN0PiBhcmd1bWVudC4KKworPW92ZXIgNAorCis9aXRlbSB0aHJvdyAoIFsgQVJHUyBdICkKKworQ3JlYXRlIGEgbmV3IEM8RXJyb3I+IG9iamVjdCBhbmQgdGhyb3cgYW4gZXJyb3IsIHdoaWNoIHdpbGwgYmUgY2F1Z2h0CitieSBhIHN1cnJvdW5kaW5nIEM8dHJ5PiBibG9jaywgaWYgdGhlcmUgaXMgb25lLiBPdGhlcndpc2UgaXQgd2lsbCBjYXVzZQordGhlIHByb2dyYW0gdG8gZXhpdC4KKworQzx0aHJvdz4gbWF5IGFsc28gYmUgY2FsbGVkIG9uIGFuIGV4aXN0aW5nIGVycm9yIHRvIHJlLXRocm93IGl0LgorCis9aXRlbSB3aXRoICggWyBBUkdTIF0gKQorCitDcmVhdGUgYSBuZXcgQzxFcnJvcj4gb2JqZWN0IGFuZCByZXR1cm5zIGl0LiBUaGlzIGlzIGRlZmluZWQgZm9yCitzeW50YWN0aWMgc3VnYXIsIGVnCisKKyAgICBkaWUgd2l0aCBTb21lOjpFcnJvciAoIC4uLiApOworCis9aXRlbSByZWNvcmQgKCBbIEFSR1MgXSApCisKK0NyZWF0ZSBhIG5ldyBDPEVycm9yPiBvYmplY3QgYW5kIHJldHVybnMgaXQuIFRoaXMgaXMgZGVmaW5lZCBmb3IKK3N5bnRhY3RpYyBzdWdhciwgZWcKKworICAgIHJlY29yZCBTb21lOjpFcnJvciAoIC4uLiApCisJYW5kIHJldHVybjsKKworPWJhY2sKKworPWhlYWQyIFNUQVRJQyBNRVRIT0RTCisKKz1vdmVyIDQKKworPWl0ZW0gcHJpb3IgKCBbIFBBQ0tBR0UgXSApCisKK1JldHVybiB0aGUgbGFzdCBlcnJvciBjcmVhdGVkLCBvciB0aGUgbGFzdCBlcnJvciBhc3NvY2lhdGVkIHdpdGgKK0M8UEFDS0FHRT4KKworPWl0ZW0gZmx1c2ggKCBbIFBBQ0tBR0UgXSApCisKK0ZsdXNoIHRoZSBsYXN0IGVycm9yIGNyZWF0ZWQsIG9yIHRoZSBsYXN0IGVycm9yIGFzc29jaWF0ZWQgd2l0aAorQzxQQUNLQUdFPi5JdCBpcyBuZWNlc3NhcnkgdG8gY2xlYXIgdGhlIGVycm9yIHN0YWNrIGJlZm9yZSBleGl0aW5nIHRoZQorcGFja2FnZSBvciB1bmNhdWdodCBlcnJvcnMgZ2VuZXJhdGVkIHVzaW5nIEM8cmVjb3JkPiB3aWxsIGJlIHJlcG9ydGVkLgorCisgICAgICRFcnJvci0+Zmx1c2g7CisKKz1jdXQKKworPWJhY2sKKworPWhlYWQyIE9CSkVDVCBNRVRIT0RTCisKKz1vdmVyIDQKKworPWl0ZW0gc3RhY2t0cmFjZQorCitJZiB0aGUgdmFyaWFibGUgQzwkRXJyb3I6OkRlYnVnPiB3YXMgbm9uLXplcm8gd2hlbiB0aGUgZXJyb3Igd2FzCitjcmVhdGVkLCB0aGVuIEM8c3RhY2t0cmFjZT4gcmV0dXJucyBhIHN0cmluZyBjcmVhdGVkIGJ5IGNhbGxpbmcKK0M8Q2FycDo6bG9uZ21lc3M+LiBJZiB0aGUgdmFyaWFibGUgd2FzIHplcm8gdGhlIEM8c3RhY2t0cmFjZT4gcmV0dXJucwordGhlIHRleHQgb2YgdGhlIGVycm9yIGFwcGVuZGVkIHdpdGggdGhlIGZpbGVuYW1lIGFuZCBsaW5lIG51bWJlciBvZgord2hlcmUgdGhlIGVycm9yIHdhcyBjcmVhdGVkLCBwcm92aWRpbmcgdGhlIHRleHQgZG9lcyBub3QgZW5kIHdpdGggYQorbmV3bGluZS4KKworPWl0ZW0gb2JqZWN0CisKK1RoZSBvYmplY3QgdGhpcyBlcnJvciB3YXMgYXNzb2NpYXRlZCB3aXRoCisKKz1pdGVtIGZpbGUKKworVGhlIGZpbGUgd2hlcmUgdGhlIGNvbnN0cnVjdG9yIG9mIHRoaXMgZXJyb3Igd2FzIGNhbGxlZCBmcm9tCisKKz1pdGVtIGxpbmUKKworVGhlIGxpbmUgd2hlcmUgdGhlIGNvbnN0cnVjdG9yIG9mIHRoaXMgZXJyb3Igd2FzIGNhbGxlZCBmcm9tCisKKz1pdGVtIHRleHQKKworVGhlIHRleHQgb2YgdGhlIGVycm9yCisKKz1iYWNrCisKKz1oZWFkMiBPVkVSTE9BRCBNRVRIT0RTCisKKz1vdmVyIDQKKworPWl0ZW0gc3RyaW5naWZ5CisKK0EgbWV0aG9kIHRoYXQgY29udmVydHMgdGhlIG9iamVjdCBpbnRvIGEgc3RyaW5nLiBUaGlzIG1ldGhvZCBtYXkgc2ltcGx5CityZXR1cm4gdGhlIHNhbWUgYXMgdGhlIEM8dGV4dD4gbWV0aG9kLCBvciBpdCBtYXkgYXBwZW5kIG1vcmUKK2luZm9ybWF0aW9uLiBGb3IgZXhhbXBsZSB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlci4KKworQnkgZGVmYXVsdCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBDPC10ZXh0PiBhcmd1bWVudCB0aGF0IHdhcyBwYXNzZWQgdG8KK3RoZSBjb25zdHJ1Y3Rvciwgb3IgdGhlIHN0cmluZyBDPCJEaWVkIj4gaWYgbm9uZSB3YXMgZ2l2ZW4uCisKKz1pdGVtIHZhbHVlCisKK0EgbWV0aG9kIHRoYXQgd2lsbCByZXR1cm4gYSB2YWx1ZSB0aGF0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggdGhlCitlcnJvci4gRm9yIGV4YW1wbGUgaWYgYW4gZXJyb3Igd2FzIGNyZWF0ZWQgZHVlIHRvIHRoZSBmYWlsdXJlIG9mIGEKK3N5c3RlbSBjYWxsLCB0aGVuIHRoaXMgbWF5IHJldHVybiB0aGUgbnVtZXJpYyB2YWx1ZSBvZiBDPCQhPiBhdCB0aGUKK3RpbWUuCisKK0J5IGRlZmF1bHQgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgQzwtdmFsdWU+IGFyZ3VtZW50IHRoYXQgd2FzIHBhc3NlZAordG8gdGhlIGNvbnN0cnVjdG9yLgorCis9YmFjaworCis9aGVhZDEgUFJFLURFRklORUQgRVJST1IgQ0xBU1NFUworCis9b3ZlciA0CisKKz1pdGVtIEVycm9yOjpTaW1wbGUKKworVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBob2xkIHNpbXBsZSBlcnJvciBzdHJpbmdzIGFuZCB2YWx1ZXMuIEl0J3MKK2NvbnN0cnVjdG9yIHRha2VzIHR3byBhcmd1bWVudHMuIFRoZSBmaXJzdCBpcyBhIHRleHQgdmFsdWUsIHRoZSBzZWNvbmQKK2lzIGEgbnVtZXJpYyB2YWx1ZS4gVGhlc2UgdmFsdWVzIGFyZSB3aGF0IHdpbGwgYmUgcmV0dXJuZWQgYnkgdGhlCitvdmVybG9hZCBtZXRob2RzLgorCitJZiB0aGUgdGV4dCB2YWx1ZSBlbmRzIHdpdGggQzxhdCBmaWxlIGxpbmUgMT4gYXMgJEAgc3RyaW5ncyBkbywgdGhlbgordGhpcyBpbmZvbWF0aW9uIHdpbGwgYmUgdXNlZCB0byBzZXQgdGhlIEM8LWZpbGU+IGFuZCBDPC1saW5lPiBhcmd1bWVudHMKK29mIHRoZSBlcnJvciBvYmplY3QuCisKK1RoaXMgY2xhc3MgaXMgdXNlZCBpbnRlcm5hbGx5IGlmIGFuIGV2YWwnZCBibG9jayBkaWUncyB3aXRoIGFuIGVycm9yCit0aGF0IGlzIGEgcGxhaW4gc3RyaW5nLiAoVW5sZXNzIEM8JEVycm9yOjpPYmplY3RpZnlDYWxsYmFjaz4gaXMgbW9kaWZpZWQpCisKKz1iYWNrCisKKz1oZWFkMSAkRXJyb3I6Ok9iamVjdGlmeUNhbGxiYWNrCisKK1RoaXMgdmFyaWFibGUgaG9sZHMgYSByZWZlcmVuY2UgdG8gYSBzdWJyb3V0aW5lIHRoYXQgY29udmVydHMgZXJyb3JzIHRoYXQKK2FyZSBwbGFpbiBzdHJpbmdzIHRvIG9iamVjdHMuIEl0IGlzIHVzZWQgYnkgRXJyb3IucG0gdG8gY29udmVydCB0ZXh0dWFsCitlcnJvcnMgdG8gb2JqZWN0cywgYW5kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSB1c2VyLgorCitJdCBhY2NlcHRzIGEgc2luZ2xlIGFyZ3VtZW50IHdoaWNoIGlzIGEgaGFzaCByZWZlcmVuY2UgdG8gbmFtZWQgcGFyYW1ldGVycy4KK0N1cnJlbnRseSB0aGUgb25seSBuYW1lZCBwYXJhbWV0ZXIgcGFzc2VkIGlzIEM8J3RleHQnPiB3aGljaCBpcyB0aGUgdGV4dAorb2YgdGhlIGVycm9yLCBidXQgb3RoZXJzIG1heSBiZSBhdmFpbGFibGUgaW4gdGhlIGZ1dHVyZS4KKworRm9yIGV4YW1wbGUgdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgY2F1c2UgRXJyb3IucG0gdG8gdGhyb3cgb2JqZWN0cyBvZiB0aGUKK2NsYXNzIE15RXJyb3I6OkJhciBieSBkZWZhdWx0OgorCisgICAgc3ViIHRocm93X015RXJyb3JfQmFyCisgICAgeworICAgICAgICBteSAkYXJncyA9IHNoaWZ0OworICAgICAgICBteSAkZXJyID0gTXlFcnJvcjo6QmFyLT5uZXcoKTsKKyAgICAgICAgJGVyci0+eydNeUJhclRleHQnfSA9ICRhcmdzLT57J3RleHQnfTsKKyAgICAgICAgcmV0dXJuICRlcnI7CisgICAgfQorCisgICAgeworICAgICAgICBsb2NhbCAkRXJyb3I6Ok9iamVjdGlmeUNhbGxiYWNrID0gXCZ0aHJvd19NeUVycm9yX0JhcjsKKworICAgICAgICAjIEVycm9yIGhhbmRsaW5nIGhlcmUuCisgICAgfQorCis9aGVhZDEgS05PV04gQlVHUworCitOb25lLCBidXQgdGhhdCBkb2VzIG5vdCBtZWFuIHRoZXJlIGFyZSBub3QgYW55LgorCis9aGVhZDEgQVVUSE9SUworCitHcmFoYW0gQmFyciA8Z2JhcnJAcG9ib3guY29tPgorCitUaGUgY29kZSB0aGF0IGluc3BpcmVkIG1lIHRvIHdyaXRlIHRoaXMgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieQorUGV0ZXIgU2VpYmVsIDxwZXRlckB3ZWJsb2dpYy5jb20+IGFuZCBhZGFwdGVkIGJ5IEplc3NlIEdsaWNrCis8amdsaWNrQHNpZy5ic2guY29tPi4KKworPWhlYWQxIE1BSU5UQUlORVIKKworU2hsb21pIEZpc2ggPHNobG9taWZAaWdsdS5vcmcuaWw+CisKKz1oZWFkMSBQQVNUIE1BSU5UQUlORVJTCisKK0FydW4gS3VtYXIgVSA8dV9hcnVua3VtYXJAeWFob28uY29tPgorCis9Y3V0CmRpZmYgLS1naXQgYS9wa3QtbGluZS5jIGIvcGt0LWxpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTU1NDZhCi0tLSAvZGV2L251bGwKKysrIGIvcGt0LWxpbmUuYwpAQCAtMCwwICsxLDExNCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicGt0LWxpbmUuaCIKKworLyoKKyAqIFdyaXRlIGEgcGFja2V0aXplZCBzdHJlYW0sIHdoZXJlIGVhY2ggbGluZSBpcyBwcmVjZWRlZCBieQorICogaXRzIGxlbmd0aCAoaW5jbHVkaW5nIHRoZSBoZWFkZXIpIGFzIGEgNC1ieXRlIGhleCBudW1iZXIuCisgKiBBIGxlbmd0aCBvZiAnemVybycgbWVhbnMgZW5kIG9mIHN0cmVhbSAoYW5kIGEgbGVuZ3RoIG9mIDEtMworICogd291bGQgYmUgYW4gZXJyb3IpLgorICoKKyAqIFRoaXMgaXMgYWxsIHByZXR0eSBzdHVwaWQsIGJ1dCB3ZSB1c2UgdGhpcyBwYWNrZXRpemVkIGxpbmUKKyAqIGZvcm1hdCB0byBtYWtlIGEgc3RyZWFtaW5nIGZvcm1hdCBwb3NzaWJsZSB3aXRob3V0IGV2ZXIKKyAqIG92ZXItcnVubmluZyB0aGUgcmVhZCBidWZmZXJzLiBUaGF0IHdheSB3ZSdsbCBuZXZlciByZWFkCisgKiBpbnRvIHdoYXQgbWlnaHQgYmUgdGhlIHBhY2sgZGF0YSAod2hpY2ggc2hvdWxkIGdvIHRvIGFub3RoZXIKKyAqIHByb2Nlc3MgZW50aXJlbHkpLgorICoKKyAqIFRoZSB3cml0aW5nIHNpZGUgY291bGQgdXNlIHN0ZGlvLCBidXQgc2luY2UgdGhlIHJlYWRpbmcKKyAqIHNpZGUgY2FuJ3QsIHdlIHN0YXkgd2l0aCBwdXJlIHJlYWQvd3JpdGUgaW50ZXJmYWNlcy4KKyAqLworc3NpemVfdCBzYWZlX3dyaXRlKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzc2l6ZV90IG4pCit7CisJc3NpemVfdCBubiA9IG47CisJd2hpbGUgKG4pIHsKKwkJaW50IHJldCA9IHh3cml0ZShmZCwgYnVmLCBuKTsKKwkJaWYgKHJldCA+IDApIHsKKwkJCWJ1ZiA9IChjaGFyICopIGJ1ZiArIHJldDsKKwkJCW4gLT0gcmV0OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFyZXQpCisJCQlkaWUoIndyaXRlIGVycm9yIChkaXNrIGZ1bGw/KSIpOworCQlkaWUoIndyaXRlIGVycm9yICglcykiLCBzdHJlcnJvcihlcnJubykpOworCX0KKwlyZXR1cm4gbm47Cit9CisKKy8qCisgKiBJZiB3ZSBidWZmZXJlZCB0aGluZ3MgdXAgYWJvdmUgKHdlIGRvbid0LCBidXQgd2Ugc2hvdWxkKSwKKyAqIHdlJ2QgZmx1c2ggaXQgaGVyZQorICovCit2b2lkIHBhY2tldF9mbHVzaChpbnQgZmQpCit7CisJc2FmZV93cml0ZShmZCwgIjAwMDAiLCA0KTsKK30KKworI2RlZmluZSBoZXgoYSkgKGhleGNoYXJbKGEpICYgMTVdKQordm9pZCBwYWNrZXRfd3JpdGUoaW50IGZkLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlzdGF0aWMgY2hhciBidWZmZXJbMTAwMF07CisJc3RhdGljIGNoYXIgaGV4Y2hhcltdID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCXZhX2xpc3QgYXJnczsKKwl1bnNpZ25lZCBuOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwluID0gdnNucHJpbnRmKGJ1ZmZlciArIDQsIHNpemVvZihidWZmZXIpIC0gNCwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJaWYgKG4gPj0gc2l6ZW9mKGJ1ZmZlciktNCkKKwkJZGllKCJwcm90b2NvbCBlcnJvcjogaW1wb3NzaWJseSBsb25nIGxpbmUiKTsKKwluICs9IDQ7CisJYnVmZmVyWzBdID0gaGV4KG4gPj4gMTIpOworCWJ1ZmZlclsxXSA9IGhleChuID4+IDgpOworCWJ1ZmZlclsyXSA9IGhleChuID4+IDQpOworCWJ1ZmZlclszXSA9IGhleChuKTsKKwlzYWZlX3dyaXRlKGZkLCBidWZmZXIsIG4pOworfQorCitzdGF0aWMgdm9pZCBzYWZlX3JlYWQoaW50IGZkLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIHNpemUpCit7CisJc2l6ZV90IG4gPSAwOworCisJd2hpbGUgKG4gPCBzaXplKSB7CisJCXNzaXplX3QgcmV0ID0geHJlYWQoZmQsIChjaGFyICopIGJ1ZmZlciArIG4sIHNpemUgLSBuKTsKKwkJaWYgKHJldCA8IDApCisJCQlkaWUoInJlYWQgZXJyb3IgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CisJCWlmICghcmV0KQorCQkJZGllKCJUaGUgcmVtb3RlIGVuZCBodW5nIHVwIHVuZXhwZWN0ZWRseSIpOworCQluICs9IHJldDsKKwl9Cit9CisKK2ludCBwYWNrZXRfcmVhZF9saW5lKGludCBmZCwgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBzaXplKQoreworCWludCBuOworCXVuc2lnbmVkIGxlbjsKKwljaGFyIGxpbmVsZW5bNF07CisKKwlzYWZlX3JlYWQoZmQsIGxpbmVsZW4sIDQpOworCisJbGVuID0gMDsKKwlmb3IgKG4gPSAwOyBuIDwgNDsgbisrKSB7CisJCXVuc2lnbmVkIGNoYXIgYyA9IGxpbmVsZW5bbl07CisJCWxlbiA8PD0gNDsKKwkJaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7CisJCQlsZW4gKz0gYyAtICcwJzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID49ICdhJyAmJiBjIDw9ICdmJykgeworCQkJbGVuICs9IGMgLSAnYScgKyAxMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID49ICdBJyAmJiBjIDw9ICdGJykgeworCQkJbGVuICs9IGMgLSAnQScgKyAxMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRpZSgicHJvdG9jb2wgZXJyb3I6IGJhZCBsaW5lIGxlbmd0aCBjaGFyYWN0ZXIiKTsKKwl9CisJaWYgKCFsZW4pCisJCXJldHVybiAwOworCWxlbiAtPSA0OworCWlmIChsZW4gPj0gc2l6ZSkKKwkJZGllKCJwcm90b2NvbCBlcnJvcjogYmFkIGxpbmUgbGVuZ3RoICVkIiwgbGVuKTsKKwlzYWZlX3JlYWQoZmQsIGJ1ZmZlciwgbGVuKTsKKwlidWZmZXJbbGVuXSA9IDA7CisJcmV0dXJuIGxlbjsKK30KZGlmZiAtLWdpdCBhL3BrdC1saW5lLmggYi9wa3QtbGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZjY1M2YKLS0tIC9kZXYvbnVsbAorKysgYi9wa3QtbGluZS5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgUEtUTElORV9ICisjZGVmaW5lIFBLVExJTkVfSAorCisjaW5jbHVkZSAiZ2l0LWNvbXBhdC11dGlsLmgiCisKKy8qCisgKiBTaWxseSBwYWNrZXRpemVkIGxpbmUgd3JpdGluZyBpbnRlcmZhY2UKKyAqLwordm9pZCBwYWNrZXRfZmx1c2goaW50IGZkKTsKK3ZvaWQgcGFja2V0X3dyaXRlKGludCBmZCwgY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworCitpbnQgcGFja2V0X3JlYWRfbGluZShpbnQgZmQsIGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgc2l6ZSk7Citzc2l6ZV90IHNhZmVfd3JpdGUoaW50LCBjb25zdCB2b2lkICosIHNzaXplX3QpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3BwYy9zaGExLmMgYi9wcGMvc2hhMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOGUzNmMKLS0tIC9kZXYvbnVsbAorKysgYi9wcGMvc2hhMS5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBTSEEtMSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgUGF1bCBNYWNrZXJyYXMgPHBhdWx1c0BzYW1iYS5vcmc+CisgKgorICogVGhpcyB2ZXJzaW9uIGFzc3VtZXMgd2UgYXJlIHJ1bm5pbmcgb24gYSBiaWctZW5kaWFuIG1hY2hpbmUuCisgKiBJdCBjYWxscyBhbiBleHRlcm5hbCBzaGExX2NvcmUoKSB0byBwcm9jZXNzIGJsb2NrcyBvZiA2NCBieXRlcy4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAic2hhMS5oIgorCitleHRlcm4gdm9pZCBzaGExX2NvcmUodWludDMyX3QgKmhhc2gsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsCisJCSAgICAgIHVuc2lnbmVkIGludCBuYmxvY2tzKTsKKworaW50IFNIQTFfSW5pdChTSEFfQ1RYICpjKQoreworCWMtPmhhc2hbMF0gPSAweDY3NDUyMzAxOworCWMtPmhhc2hbMV0gPSAweEVGQ0RBQjg5OworCWMtPmhhc2hbMl0gPSAweDk4QkFEQ0ZFOworCWMtPmhhc2hbM10gPSAweDEwMzI1NDc2OworCWMtPmhhc2hbNF0gPSAweEMzRDJFMUYwOworCWMtPmxlbiA9IDA7CisJYy0+Y250ID0gMDsKKwlyZXR1cm4gMDsKK30KKworaW50IFNIQTFfVXBkYXRlKFNIQV9DVFggKmMsIGNvbnN0IHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyBuKQoreworCXVuc2lnbmVkIGxvbmcgbmI7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IHB0cjsKKworCWMtPmxlbiArPSAodWludDY0X3QpIG4gPDwgMzsKKwl3aGlsZSAobiAhPSAwKSB7CisJCWlmIChjLT5jbnQgfHwgbiA8IDY0KSB7CisJCQluYiA9IDY0IC0gYy0+Y250OworCQkJaWYgKG5iID4gbikKKwkJCQluYiA9IG47CisJCQltZW1jcHkoJmMtPmJ1Zi5iW2MtPmNudF0sIHAsIG5iKTsKKwkJCWlmICgoYy0+Y250ICs9IG5iKSA9PSA2NCkgeworCQkJCXNoYTFfY29yZShjLT5oYXNoLCBjLT5idWYuYiwgMSk7CisJCQkJYy0+Y250ID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW5iID0gbiA+PiA2OworCQkJc2hhMV9jb3JlKGMtPmhhc2gsIHAsIG5iKTsKKwkJCW5iIDw8PSA2OworCQl9CisJCW4gLT0gbmI7CisJCXAgKz0gbmI7CisJfQorCXJldHVybiAwOworfQorCitpbnQgU0hBMV9GaW5hbCh1bnNpZ25lZCBjaGFyICpoYXNoLCBTSEFfQ1RYICpjKQoreworCXVuc2lnbmVkIGludCBjbnQgPSBjLT5jbnQ7CisKKwljLT5idWYuYltjbnQrK10gPSAweDgwOworCWlmIChjbnQgPiA1NikgeworCQlpZiAoY250IDwgNjQpCisJCQltZW1zZXQoJmMtPmJ1Zi5iW2NudF0sIDAsIDY0IC0gY250KTsKKwkJc2hhMV9jb3JlKGMtPmhhc2gsIGMtPmJ1Zi5iLCAxKTsKKwkJY250ID0gMDsKKwl9CisJaWYgKGNudCA8IDU2KQorCQltZW1zZXQoJmMtPmJ1Zi5iW2NudF0sIDAsIDU2IC0gY250KTsKKwljLT5idWYubFs3XSA9IGMtPmxlbjsKKwlzaGExX2NvcmUoYy0+aGFzaCwgYy0+YnVmLmIsIDEpOworCW1lbWNweShoYXNoLCBjLT5oYXNoLCAyMCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9wcGMvc2hhMS5oIGIvcHBjL3NoYTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2M1MWFhCi0tLSAvZGV2L251bGwKKysrIGIvcHBjL3NoYTEuaApAQCAtMCwwICsxLDIwIEBACisvKgorICogU0hBLTEgaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgorICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3R5cGVkZWYgc3RydWN0IHNoYV9jb250ZXh0IHsKKwl1aW50MzJfdCBoYXNoWzVdOworCXVpbnQzMl90IGNudDsKKwl1aW50NjRfdCBsZW47CisJdW5pb24geworCQl1bnNpZ25lZCBjaGFyIGJbNjRdOworCQl1aW50NjRfdCBsWzhdOworCX0gYnVmOworfSBTSEFfQ1RYOworCitpbnQgU0hBMV9Jbml0KFNIQV9DVFggKmMpOworaW50IFNIQTFfVXBkYXRlKFNIQV9DVFggKmMsIGNvbnN0IHZvaWQgKnAsIHVuc2lnbmVkIGxvbmcgbik7CitpbnQgU0hBMV9GaW5hbCh1bnNpZ25lZCBjaGFyICpoYXNoLCBTSEFfQ1RYICpjKTsKZGlmZiAtLWdpdCBhL3BwYy9zaGExcHBjLlMgYi9wcGMvc2hhMXBwYy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMzI2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9wcGMvc2hhMXBwYy5TCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogU0hBLTEgaW1wbGVtZW50YXRpb24gZm9yIFBvd2VyUEMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgorICovCisKKy8qCisgKiBQb3dlclBDIGNhbGxpbmcgY29udmVudGlvbjoKKyAqICVyMCAtIHZvbGF0aWxlIHRlbXAKKyAqICVyMSAtIHN0YWNrIHBvaW50ZXIuCisgKiAlcjIgLSByZXNlcnZlZAorICogJXIzLSVyMTIgLSBJbmNvbWluZyBhcmd1bWVudHMgJiByZXR1cm4gdmFsdWVzOyB2b2xhdGlsZS4KKyAqICVyMTMtJXIzMSAtIENhbGxlZS1zYXZlIHJlZ2lzdGVycworICogJWxyIC0gUmV0dXJuIGFkZHJlc3MsIHZvbGF0aWxlCisgKiAlY3RyIC0gdm9sYXRpbGUKKyAqCisgKiBSZWdpc3RlciB1c2FnZSBpbiB0aGlzIHJvdXRpbmU6CisgKiAlcjAgLSB0ZW1wCisgKiAlcjMgLSBhcmd1bWVudCAocG9pbnRlciB0byA1IHdvcmRzIG9mIFNIQSBzdGF0ZSkKKyAqICVyNCAtIGFyZ3VtZW50IChwb2ludGVyIHRvIGRhdGEgdG8gaGFzaCkKKyAqICVyNSAtIENvbnN0YW50IEsgaW4gU0hBIHJvdW5kIChpbml0aWFsbHkgbnVtYmVyIG9mIGJsb2NrcyB0byBoYXNoKQorICogJXI2LSVyMTAgLSBXb3JraW5nIGNvcGllcyBvZiBTSEEgdmFyaWFibGVzIEEuLkUgKGFjdHVhbGx5IEUuLkEgb3JkZXIpCisgKiAlcjExLSVyMjYgLSBEYXRhIGJlaW5nIGhhc2hlZCBXW10uCisgKiAlcjI3LSVyMzEgLSBQcmV2aW91cyBjb3BpZXMgb2YgQS4uRSwgZm9yIGZpbmFsIGFkZCBiYWNrLgorICogJWN0ciAtIGxvb3AgY291bnQKKyAqLworCisKKy8qCisgKiBXZSByb2xsIHRoZSByZWdpc3RlcnMgZm9yIEEsIEIsIEMsIEQsIEUgYXJvdW5kIG9uIGVhY2gKKyAqIGl0ZXJhdGlvbjsgRSBvbiBpdGVyYXRpb24gdCBpcyBEIG9uIGl0ZXJhdGlvbiB0KzEsIGFuZCBzbyBvbi4KKyAqIFdlIHVzZSByZWdpc3RlcnMgNiAtIDEwIGZvciB0aGlzLiAgKFJlZ2lzdGVycyAyNyAtIDMxIGhvbGQKKyAqIHRoZSBwcmV2aW91cyB2YWx1ZXMuKQorICovCisjZGVmaW5lIFJBKHQpCSgoKHQpKzQpJTUrNikKKyNkZWZpbmUgUkIodCkJKCgodCkrMyklNSs2KQorI2RlZmluZSBSQyh0KQkoKCh0KSsyKSU1KzYpCisjZGVmaW5lIFJEKHQpCSgoKHQpKzEpJTUrNikKKyNkZWZpbmUgUkUodCkJKCgodCkrMCklNSs2KQorCisvKiBXZSB1c2UgcmVnaXN0ZXJzIDExIC0gMjYgZm9yIHRoZSBXIHZhbHVlcyAqLworI2RlZmluZSBXKHQpCSgodCklMTYrMTEpCisKKy8qIFJlZ2lzdGVyIDUgaXMgdXNlZCBmb3IgdGhlIGNvbnN0YW50IGsgKi8KKworLyoKKyAqIFRoZSBiYXNpYyBTSEEtMSByb3VuZCBmdW5jdGlvbiBpczoKKyAqIEUgKz0gUk9UTChBLDUpICsgRihCLEMsRCkgKyBXW2ldICsgSzsgIEIgPSBST1RMKEIsMzApCisgKiBUaGVuIHRoZSB2YXJpYWJsZXMgYXJlIHJlbmFtZWQ6IChBLEIsQyxELEUpID0gKEUsQSxCLEMsRCkuCisgKgorICogRXZlcnkgMjAgcm91bmRzLCB0aGUgZnVuY3Rpb24gRigpIGFuZCB0aGUgY29uc3RhbnQgSyBjaGFuZ2VzOgorICogLSAyMCByb3VuZHMgb2YgZjAoYixjLGQpID0gImJpdCB3aXNlIGIgPyBjIDogZCIgPSAgKF5iICYgZCkgKyAoYiAmIGMpCisgKiAtIDIwIHJvdW5kcyBvZiBmMShiLGMsZCkgPSBiXmNeZCA9IChiXmQpXmMKKyAqIC0gMjAgcm91bmRzIG9mIGYyKGIsYyxkKSA9IG1ham9yaXR5KGIsYyxkKSA9IChiJmQpICsgKChiXmQpJmMpCisgKiAtIDIwIG1vcmUgcm91bmRzIG9mIGYxKGIsYyxkKQorICoKKyAqIFRoZXNlIGFyZSBhbGwgc2NoZWR1bGVkIGZvciBuZWFyLW9wdGltYWwgcGVyZm9ybWFuY2Ugb24gYSBHNC4KKyAqIFRoZSBHNCBpcyBhIDMtaXNzdWUgb3V0LW9mLW9yZGVyIG1hY2hpbmUgd2l0aCAzIEFMVXMsIGJ1dCBpdCBjYW4gb25seQorICogKmNvbnNpZGVyKiBzdGFydGluZyB0aGUgb2xkZXN0IDMgaW5zdHJ1Y3Rpb25zIHBlciBjeWNsZS4gIFNvIHRvIGdldAorICogbWF4aW11bSBwZXJmb3JtYW5jZSBvdXQgb2YgaXQsIHlvdSBoYXZlIHRvIHRyZWF0IGl0IGFzIGFuIGluLW9yZGVyCisgKiBtYWNoaW5lLiAgV2hpY2ggbWVhbnMgaW50ZXJsZWF2aW5nIHRoZSBjb21wdXRhdGlvbiByb3VuZCB0IHdpdGggdGhlCisgKiBjb21wdXRhdGlvbiBvZiBXW3QrNF0uCisgKgorICogVGhlIGZpcnN0IDE2IHJvdW5kcyB1c2UgVyB2YWx1ZXMgbG9hZGVkIGRpcmVjdGx5IGZyb20gbWVtb3J5LCB3aGlsZSB0aGUKKyAqIHJlbWFpbmluZyA2NCB1c2UgdmFsdWVzIGNvbXB1dGVkIGZyb20gdGhvc2UgZmlyc3QgMTYuICBXZSBwcmVsb2FkCisgKiA0IHZhbHVlcyBiZWZvcmUgc3RhcnRpbmcsIHNvIHRoZXJlIGFyZSB0aHJlZSBraW5kcyBvZiByb3VuZHM6CisgKiAtIFRoZSBmaXJzdCAxMiAoYWxsIGYwKSBhbHNvIGxvYWQgdGhlIFcgdmFsdWVzIGZyb20gbWVtb3J5LgorICogLSBUaGUgbmV4dCA2NCBjb21wdXRlIFcoaSs0KSBpbiBwYXJhbGxlbC4gOCpmMCwgMjAqZjEsIDIwKmYyLCAxNipmMS4KKyAqIC0gVGhlIGxhc3QgNCAoYWxsIGYxKSBkbyBub3QgZG8gYW55dGhpbmcgd2l0aCBXLgorICoKKyAqIFRoZXJlZm9yZSwgd2UgaGF2ZSA2IGRpZmZlcmVudCByb3VuZCBmdW5jdGlvbnM6CisgKiBTVEVQRDBfTE9BRCh0LHMpIC0gUGVyZm9ybSByb3VuZCB0IGFuZCBsb2FkIFcocykuICBzIDwgMTYKKyAqIFNURVBEMF9VUERBVEUodCxzKSAtIFBlcmZvcm0gcm91bmQgdCBhbmQgY29tcHV0ZSBXKHMpLiAgcyA+PSAxNi4KKyAqIFNURVBEMV9VUERBVEUodCxzKQorICogU1RFUEQyX1VQREFURSh0LHMpCisgKiBTVEVQRDEodCkgLSBQZXJmb3JtIHJvdW5kIHQgd2l0aCBubyBsb2FkIG9yIHVwZGF0ZS4KKyAqCisgKiBUaGUgRzUgaXMgbW9yZSBmdWxseSBvdXQtb2Ytb3JkZXIsIGFuZCBjYW4gZmluZCB0aGUgcGFyYWxsZWxpc20KKyAqIGJ5IGl0c2VsZi4gIFRoZSBiaWcgbGltaXQgaXMgdGhhdCBpdCBoYXMgYSAyLWN5Y2xlIEFMVSBsYXRlbmN5LCBzbworICogZXZlbiB0aG91Z2ggaXQncyAyLXdheSwgdGhlIGNvZGUgaGFzIHRvIGJlIHNjaGVkdWxlZCBhcyBpZiBpdCdzCisgKiA0LXdheSwgd2hpY2ggY2FuIGJlIGEgbGltaXQuICBUbyBoZWxwIGl0LCB3ZSB0cnkgdG8gc2NoZWR1bGUgdGhlCisgKiByZWFkIG9mIFJBKHQpIGFzIGxhdGUgYXMgcG9zc2libGUgc28gaXQgZG9lc24ndCBzdGFsbCB3YWl0aW5nIGZvcgorICogdGhlIHByZXZpb3VzIHJvdW5kJ3MgUkUodC0xKSwgYW5kIHdlIHRyeSB0byByb3RhdGUgUkIodCkgYXMgZWFybHkKKyAqIGFzIHBvc3NpYmxlIHdoaWxlIHJlYWRpbmcgUkModCkgKD0gUkIodC0xKSkgYXMgbGF0ZSBhcyBwb3NzaWJsZS4KKyAqLworCisvKiB0aGUgaW5pdGlhbCBsb2Fkcy4gKi8KKyNkZWZpbmUgTE9BRFcocykgXAorCWx3eglXKHMpLChzKSo0KCVyNCkKKworLyoKKyAqIFBlcmZvcm0gYSBzdGVwIHdpdGggRjAsIGFuZCBsb2FkIFcocykuICBVc2VzIFcocykgYXMgYSB0ZW1wb3JhcnkKKyAqIGJlZm9yZSBsb2FkaW5nIGl0LgorICogVGhpcyBpcyBhY3R1YWxseSAxMCBpbnN0cnVjdGlvbnMsIHdoaWNoIGlzIGFuIGF3a3dhcmQgZml0LgorICogSXQgY2FuIGV4ZWN1dGUgZ3JvdXBlZCBhcyBsaXN0ZWQsIG9yIGRlbGF5ZWQgb25lIGluc3RydWN0aW9uLgorICogKElmIGRlbGF5ZWQgdHdvIGluc3RydWN0aW9ucywgdGhlcmUgaXMgYSBzdGFsbCBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZQorICogc2Vjb25kIGxpbmUuKSAgVGh1cywgdHdvIGl0ZXJhdGlvbnMgdGFrZSA3IGN5Y2xlcywgMy41IGN5Y2xlcyBwZXIgcm91bmQuCisgKi8KKyNkZWZpbmUgU1RFUEQwX0xPQUQodCxzKSBcCithZGQgUkUodCksUkUodCksVyh0KTsgYW5kYyAgICVyMCxSRCh0KSxSQih0KTsgIGFuZCAgICBXKHMpLFJDKHQpLFJCKHQpOyBcCithZGQgUkUodCksUkUodCksJXIwOyAgcm90bHdpICVyMCxSQSh0KSw1OyAgICAgIHJvdGx3aSBSQih0KSxSQih0KSwzMDsgICBcCithZGQgUkUodCksUkUodCksVyhzKTsgYWRkICAgICVyMCwlcjAsJXI1OyAgICAgIGx3eiAgICBXKHMpLChzKSo0KCVyNCk7ICBcCithZGQgUkUodCksUkUodCksJXIwCisKKy8qCisgKiBUaGlzIGlzIGxpa2V3aXNlIGF3a3dhcmQsIDEzIGluc3RydWN0aW9ucy4gIEhvd2V2ZXIsIGl0IGNhbiBhbHNvCisgKiBleGVjdXRlIHN0YXJ0aW5nIHdpdGggMiBvdXQgb2YgMyBwb3NzaWJsZSBtb2R1bGksIHNvIGl0IGRvZXMgMiByb3VuZHMKKyAqIGluIDkgY3ljbGVzLCA0LjUgY3ljbGVzL3JvdW5kLgorICovCisjZGVmaW5lIFNURVBEMF9VUERBVEUodCxzLGxvYWRrLi4uKSBcCithZGQgUkUodCksUkUodCksVyh0KTsgYW5kYyAgICVyMCxSRCh0KSxSQih0KTsgeG9yICAgIFcocyksVygocyktMTYpLFcoKHMpLTMpOyBcCithZGQgUkUodCksUkUodCksJXIwOyAgYW5kICAgICVyMCxSQyh0KSxSQih0KTsgeG9yICAgIFcocyksVyhzKSxXKChzKS04KTsgICAgICBcCithZGQgUkUodCksUkUodCksJXIwOyAgcm90bHdpICVyMCxSQSh0KSw1OyAgICAgeG9yICAgIFcocyksVyhzKSxXKChzKS0xNCk7ICAgICBcCithZGQgUkUodCksUkUodCksJXI1OyAgbG9hZGs7IHJvdGx3aSBSQih0KSxSQih0KSwzMDsgIHJvdGx3aSBXKHMpLFcocyksMTsgICAgIFwKK2FkZCBSRSh0KSxSRSh0KSwlcjAKKworLyogTmljZWx5IG9wdGltYWwuICBDb252ZW5pZW50bHksIGFsc28gdGhlIG1vc3QgY29tbW9uLiAqLworI2RlZmluZSBTVEVQRDFfVVBEQVRFKHQscyxsb2Fkay4uLikgXAorYWRkIFJFKHQpLFJFKHQpLFcodCk7IHhvciAgICAlcjAsUkQodCksUkIodCk7IHhvciAgICBXKHMpLFcoKHMpLTE2KSxXKChzKS0zKTsgXAorYWRkIFJFKHQpLFJFKHQpLCVyNTsgIGxvYWRrOyB4b3IgJXIwLCVyMCxSQyh0KTsgIHhvciBXKHMpLFcocyksVygocyktOCk7ICAgICAgXAorYWRkIFJFKHQpLFJFKHQpLCVyMDsgIHJvdGx3aSAlcjAsUkEodCksNTsgICAgIHhvciAgICBXKHMpLFcocyksVygocyktMTQpOyAgICAgXAorYWRkIFJFKHQpLFJFKHQpLCVyMDsgIHJvdGx3aSBSQih0KSxSQih0KSwzMDsgIHJvdGx3aSBXKHMpLFcocyksMQorCisvKgorICogVGhlIG5ha2VkIHZlcnNpb24sIG5vIFVQREFURSwgZm9yIHRoZSBsYXN0IDQgcm91bmRzLiAgMyBjeWNsZXMgcGVyLgorICogV2UgY291bGQgdXNlIFcocykgYXMgYSB0ZW1wIHJlZ2lzdGVyLCBidXQgd2UgZG9uJ3QgbmVlZCBpdC4KKyAqLworI2RlZmluZSBTVEVQRDEodCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgYWRkICAgUkUodCksUkUodCksVyh0KTsgeG9yICAgICVyMCxSRCh0KSxSQih0KTsgXAorcm90bHdpIFJCKHQpLFJCKHQpLDMwOyAgYWRkICAgUkUodCksUkUodCksJXI1OyAgeG9yICAgICVyMCwlcjAsUkModCk7ICAgXAorYWRkICAgIFJFKHQpLFJFKHQpLCVyMDsgcm90bHdpICVyMCxSQSh0KSw1OyAgICAgLyogc3BhcmUgc2xvdCAqLyAgICAgICAgXAorYWRkICAgIFJFKHQpLFJFKHQpLCVyMAorCisvKgorICogMTQgaW5zdHJ1Y3Rpb25zLCA1IGN5Y2xlcyBwZXIuICBUaGUgbWFqb3JpdHkgZnVuY3Rpb24gaXMgYSBiaXQKKyAqIGF3a3dhcmQgdG8gY29tcHV0ZS4gIFRoaXMgY2FuIGV4ZWN1dGUgd2l0aCBhIDEtaW5zdHJ1Y3Rpb24gZGVsYXksCisgKiBidXQgaXQgY2F1c2VzIGEgMi1pbnN0cnVjdGlvbiBkZWxheSwgd2hpY2ggdHJpZ2dlcnMgYSBzdGFsbC4KKyAqLworI2RlZmluZSBTVEVQRDJfVVBEQVRFKHQscyxsb2Fkay4uLikgXAorYWRkIFJFKHQpLFJFKHQpLFcodCk7IGFuZCAgICAlcjAsUkQodCksUkIodCk7IHhvciAgICBXKHMpLFcoKHMpLTE2KSxXKChzKS0zKTsgXAorYWRkIFJFKHQpLFJFKHQpLCVyMDsgIHhvciAgICAlcjAsUkQodCksUkIodCk7IHhvciAgICBXKHMpLFcocyksVygocyktOCk7ICAgICAgXAorYWRkIFJFKHQpLFJFKHQpLCVyNTsgIGxvYWRrOyBhbmQgJXIwLCVyMCxSQyh0KTsgIHhvciBXKHMpLFcocyksVygocyktMTQpOyAgICAgXAorYWRkIFJFKHQpLFJFKHQpLCVyMDsgIHJvdGx3aSAlcjAsUkEodCksNTsgICAgIHJvdGx3aSBXKHMpLFcocyksMTsgICAgICAgICAgICAgXAorYWRkIFJFKHQpLFJFKHQpLCVyMDsgIHJvdGx3aSBSQih0KSxSQih0KSwzMAorCisjZGVmaW5lIFNURVAwX0xPQUQ0KHQscykJCVwKKwlTVEVQRDBfTE9BRCh0LHMpOwkJXAorCVNURVBEMF9MT0FEKCh0KzEpLChzKSsxKTsJXAorCVNURVBEMF9MT0FEKCh0KSsyLChzKSsyKTsJXAorCVNURVBEMF9MT0FEKCh0KSszLChzKSszKQorCisjZGVmaW5lIFNURVBVUDQoZm4sIHQsIHMsIGxvYWRrLi4uKQkJXAorCVNURVAjI2ZuIyNfVVBEQVRFKHQscywpOwkJXAorCVNURVAjI2ZuIyNfVVBEQVRFKCh0KSsxLChzKSsxLCk7CVwKKwlTVEVQIyNmbiMjX1VQREFURSgodCkrMiwocykrMiwpOwlcCisJU1RFUCMjZm4jI19VUERBVEUoKHQpKzMsKHMpKzMsbG9hZGspCisKKyNkZWZpbmUgU1RFUFVQMjAoZm4sIHQsIHMsIGxvYWRrLi4uKQlcCisJU1RFUFVQNChmbiwgdCwgcywpOwkJXAorCVNURVBVUDQoZm4sICh0KSs0LCAocykrNCwpOwlcCisJU1RFUFVQNChmbiwgKHQpKzgsIChzKSs4LCk7CVwKKwlTVEVQVVA0KGZuLCAodCkrMTIsIChzKSsxMiwpOwlcCisJU1RFUFVQNChmbiwgKHQpKzE2LCAocykrMTYsIGxvYWRrKQorCisJLmdsb2JsCXNoYTFfY29yZQorc2hhMV9jb3JlOgorCXN0d3UJJXIxLC04MCglcjEpCisJc3RtdwklcjEzLDQoJXIxKQorCisJLyogTG9hZCB1cCBBIC0gRSAqLworCWxtdwklcjI3LDAoJXIzKQorCisJbXRjdHIJJXI1CisKKzE6CisJTE9BRFcoMCkKKwlsaXMJJXI1LDB4NWE4MgorCW1yCVJFKDApLCVyMzEKKwlMT0FEVygxKQorCW1yCVJEKDApLCVyMzAKKwltcglSQygwKSwlcjI5CisJTE9BRFcoMikKKwlvcmkJJXI1LCVyNSwweDc5OTkJLyogSzAtMTkgKi8KKwltcglSQigwKSwlcjI4CisJTE9BRFcoMykKKwltcglSQSgwKSwlcjI3CisKKwlTVEVQMF9MT0FENCgwLCA0KQorCVNURVAwX0xPQUQ0KDQsIDgpCisJU1RFUDBfTE9BRDQoOCwgMTIpCisJU1RFUFVQNChEMCwgMTIsIDE2LCkKKwlTVEVQVVA0KEQwLCAxNiwgMjAsIGxpcyAlcjUsMHg2ZWQ5KQorCisJb3JpCSVyNSwlcjUsMHhlYmExCS8qIEsyMC0zOSAqLworCVNURVBVUDIwKEQxLCAyMCwgMjQsIGxpcyAlcjUsMHg4ZjFiKQorCisJb3JpCSVyNSwlcjUsMHhiY2RjCS8qIEs0MC01OSAqLworCVNURVBVUDIwKEQyLCA0MCwgNDQsIGxpcyAlcjUsMHhjYTYyKQorCisJb3JpCSVyNSwlcjUsMHhjMWQ2CS8qIEs2MC03OSAqLworCVNURVBVUDQoRDEsIDYwLCA2NCwpCisJU1RFUFVQNChEMSwgNjQsIDY4LCkKKwlTVEVQVVA0KEQxLCA2OCwgNzIsKQorCVNURVBVUDQoRDEsIDcyLCA3NiwpCisJYWRkaQklcjQsJXI0LDY0CisJU1RFUEQxKDc2KQorCVNURVBEMSg3NykKKwlTVEVQRDEoNzgpCisJU1RFUEQxKDc5KQorCisJLyogQWRkIHJlc3VsdHMgdG8gb3JpZ2luYWwgdmFsdWVzICovCisJYWRkCSVyMzEsJXIzMSxSRSgwKQorCWFkZAklcjMwLCVyMzAsUkQoMCkKKwlhZGQJJXIyOSwlcjI5LFJDKDApCisJYWRkCSVyMjgsJXIyOCxSQigwKQorCWFkZAklcjI3LCVyMjcsUkEoMCkKKworCWJkbnoJMWIKKworCS8qIFNhdmUgZmluYWwgaGFzaCwgcmVzdG9yZSByZWdpc3RlcnMsIGFuZCByZXR1cm4gKi8KKwlzdG13CSVyMjcsMCglcjMpCisJbG13CSVyMTMsNCglcjEpCisJYWRkaQklcjEsJXIxLDgwCisJYmxyCmRpZmYgLS1naXQgYS9wcmV0dHkuYyBiL3ByZXR0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YmZiODYKLS0tIC9kZXYvbnVsbAorKysgYi9wcmV0dHkuYwpAQCAtMCwwICsxLDgxMCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidXRmOC5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorCitzdGF0aWMgc3RydWN0IGNtdF9mbXRfbWFwIHsKKwljb25zdCBjaGFyICpuOworCXNpemVfdCBjbXBfbGVuOworCWVudW0gY21pdF9mbXQgdjsKK30gY210X2ZtdHNbXSA9IHsKKwl7ICJyYXciLAkxLAlDTUlUX0ZNVF9SQVcgfSwKKwl7ICJtZWRpdW0iLAkxLAlDTUlUX0ZNVF9NRURJVU0gfSwKKwl7ICJzaG9ydCIsCTEsCUNNSVRfRk1UX1NIT1JUIH0sCisJeyAiZW1haWwiLAkxLAlDTUlUX0ZNVF9FTUFJTCB9LAorCXsgImZ1bGwiLAk1LAlDTUlUX0ZNVF9GVUxMIH0sCisJeyAiZnVsbGVyIiwJNSwJQ01JVF9GTVRfRlVMTEVSIH0sCisJeyAib25lbGluZSIsCTEsCUNNSVRfRk1UX09ORUxJTkUgfSwKKwl7ICJmb3JtYXQ6IiwJNywJQ01JVF9GTVRfVVNFUkZPUk1BVH0sCit9OworCitzdGF0aWMgY2hhciAqdXNlcl9mb3JtYXQ7CisKK2VudW0gY21pdF9mbXQgZ2V0X2NvbW1pdF9mb3JtYXQoY29uc3QgY2hhciAqYXJnKQoreworCWludCBpOworCisJaWYgKCFhcmcgfHwgISphcmcpCisJCXJldHVybiBDTUlUX0ZNVF9ERUZBVUxUOworCWlmICgqYXJnID09ICc9JykKKwkJYXJnKys7CisJaWYgKCFwcmVmaXhjbXAoYXJnLCAiZm9ybWF0OiIpKSB7CisJCWZyZWUodXNlcl9mb3JtYXQpOworCQl1c2VyX2Zvcm1hdCA9IHhzdHJkdXAoYXJnICsgNyk7CisJCXJldHVybiBDTUlUX0ZNVF9VU0VSRk9STUFUOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjbXRfZm10cyk7IGkrKykgeworCQlpZiAoIXN0cm5jbXAoYXJnLCBjbXRfZm10c1tpXS5uLCBjbXRfZm10c1tpXS5jbXBfbGVuKSAmJgorCQkgICAgIXN0cm5jbXAoYXJnLCBjbXRfZm10c1tpXS5uLCBzdHJsZW4oYXJnKSkpCisJCQlyZXR1cm4gY210X2ZtdHNbaV0udjsKKwl9CisKKwlkaWUoImludmFsaWQgLS1wcmV0dHkgZm9ybWF0OiAlcyIsIGFyZyk7Cit9CisKKy8qCisgKiBHZW5lcmljIHN1cHBvcnQgZm9yIHByZXR0eS1wcmludGluZyB0aGUgaGVhZGVyCisgKi8KK3N0YXRpYyBpbnQgZ2V0X29uZV9saW5lKGNvbnN0IGNoYXIgKm1zZykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWZvciAoOzspIHsKKwkJY2hhciBjID0gKm1zZysrOworCQlpZiAoIWMpCisJCQlicmVhazsKKwkJcmV0Kys7CisJCWlmIChjID09ICdcbicpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogSGlnaCBiaXQgc2V0LCBvciBJU08tMjAyMi1JTlQgKi8KK2ludCBub25fYXNjaWkoaW50IGNoKQoreworCWNoID0gKGNoICYgMHhmZik7CisJcmV0dXJuICgoY2ggJiAweDgwKSB8fCAoY2ggPT0gMHgxYikpOworfQorCitzdGF0aWMgaW50IGlzX3JmYzIwNDdfc3BlY2lhbChjaGFyIGNoKQoreworCXJldHVybiAobm9uX2FzY2lpKGNoKSB8fCAoY2ggPT0gJz0nKSB8fCAoY2ggPT0gJz8nKSB8fCAoY2ggPT0gJ18nKSk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9yZmMyMDQ3KHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFyICpsaW5lLCBpbnQgbGVuLAorCQkgICAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcpCit7CisJaW50IGksIGxhc3Q7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaW50IGNoID0gbGluZVtpXTsKKwkJaWYgKG5vbl9hc2NpaShjaCkpCisJCQlnb3RvIG5lZWRxdW90ZTsKKwkJaWYgKChpICsgMSA8IGxlbikgJiYgKGNoID09ICc9JyAmJiBsaW5lW2krMV0gPT0gJz8nKSkKKwkJCWdvdG8gbmVlZHF1b3RlOworCX0KKwlzdHJidWZfYWRkKHNiLCBsaW5lLCBsZW4pOworCXJldHVybjsKKworbmVlZHF1b3RlOgorCXN0cmJ1Zl9ncm93KHNiLCBsZW4gKiAzICsgc3RybGVuKGVuY29kaW5nKSArIDEwMCk7CisJc3RyYnVmX2FkZGYoc2IsICI9PyVzP3E/IiwgZW5jb2RpbmcpOworCWZvciAoaSA9IGxhc3QgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJdW5zaWduZWQgY2ggPSBsaW5lW2ldICYgMHhGRjsKKwkJLyoKKwkJICogV2UgZW5jb2RlICcgJyB1c2luZyAnPTIwJyBldmVuIHRob3VnaCByZmMyMDQ3CisJCSAqIGFsbG93cyB1c2luZyAnXycgZm9yIHJlYWRhYmlsaXR5LiAgVW5mb3J0dW5hdGVseSwKKwkJICogbWFueSBwcm9ncmFtcyBkbyBub3QgdW5kZXJzdGFuZCB0aGlzIGFuZCBqdXN0CisJCSAqIGxlYXZlIHRoZSB1bmRlcnNjb3JlIGluIHBsYWNlLgorCQkgKi8KKwkJaWYgKGlzX3JmYzIwNDdfc3BlY2lhbChjaCkgfHwgY2ggPT0gJyAnKSB7CisJCQlzdHJidWZfYWRkKHNiLCBsaW5lICsgbGFzdCwgaSAtIGxhc3QpOworCQkJc3RyYnVmX2FkZGYoc2IsICI9JTAyWCIsIGNoKTsKKwkJCWxhc3QgPSBpICsgMTsKKwkJfQorCX0KKwlzdHJidWZfYWRkKHNiLCBsaW5lICsgbGFzdCwgbGVuIC0gbGFzdCk7CisJc3RyYnVmX2FkZHN0cihzYiwgIj89Iik7Cit9CisKK3ZvaWQgcHBfdXNlcl9pbmZvKGNvbnN0IGNoYXIgKndoYXQsIGVudW0gY21pdF9mbXQgZm10LCBzdHJ1Y3Qgc3RyYnVmICpzYiwKKwkJICBjb25zdCBjaGFyICpsaW5lLCBlbnVtIGRhdGVfbW9kZSBkbW9kZSwKKwkJICBjb25zdCBjaGFyICplbmNvZGluZykKK3sKKwljaGFyICpkYXRlOworCWludCBuYW1lbGVuOworCXVuc2lnbmVkIGxvbmcgdGltZTsKKwlpbnQgdHo7CisJY29uc3QgY2hhciAqZmlsbGVyID0gIiAgICAiOworCisJaWYgKGZtdCA9PSBDTUlUX0ZNVF9PTkVMSU5FKQorCQlyZXR1cm47CisJZGF0ZSA9IHN0cmNocihsaW5lLCAnPicpOworCWlmICghZGF0ZSkKKwkJcmV0dXJuOworCW5hbWVsZW4gPSArK2RhdGUgLSBsaW5lOworCXRpbWUgPSBzdHJ0b3VsKGRhdGUsICZkYXRlLCAxMCk7CisJdHogPSBzdHJ0b2woZGF0ZSwgTlVMTCwgMTApOworCisJaWYgKGZtdCA9PSBDTUlUX0ZNVF9FTUFJTCkgeworCQljaGFyICpuYW1lX3RhaWwgPSBzdHJjaHIobGluZSwgJzwnKTsKKwkJaW50IGRpc3BsYXlfbmFtZV9sZW5ndGg7CisJCWlmICghbmFtZV90YWlsKQorCQkJcmV0dXJuOworCQl3aGlsZSAobGluZSA8IG5hbWVfdGFpbCAmJiBpc3NwYWNlKG5hbWVfdGFpbFstMV0pKQorCQkJbmFtZV90YWlsLS07CisJCWRpc3BsYXlfbmFtZV9sZW5ndGggPSBuYW1lX3RhaWwgLSBsaW5lOworCQlmaWxsZXIgPSAiIjsKKwkJc3RyYnVmX2FkZHN0cihzYiwgIkZyb206ICIpOworCQlhZGRfcmZjMjA0NyhzYiwgbGluZSwgZGlzcGxheV9uYW1lX2xlbmd0aCwgZW5jb2RpbmcpOworCQlzdHJidWZfYWRkKHNiLCBuYW1lX3RhaWwsIG5hbWVsZW4gLSBkaXNwbGF5X25hbWVfbGVuZ3RoKTsKKwkJc3RyYnVmX2FkZGNoKHNiLCAnXG4nKTsKKwl9IGVsc2UgeworCQlzdHJidWZfYWRkZihzYiwgIiVzOiAlLipzJS4qc1xuIiwgd2hhdCwKKwkJCSAgICAgIChmbXQgPT0gQ01JVF9GTVRfRlVMTEVSKSA/IDQgOiAwLAorCQkJICAgICAgZmlsbGVyLCBuYW1lbGVuLCBsaW5lKTsKKwl9CisJc3dpdGNoIChmbXQpIHsKKwljYXNlIENNSVRfRk1UX01FRElVTToKKwkJc3RyYnVmX2FkZGYoc2IsICJEYXRlOiAgICVzXG4iLCBzaG93X2RhdGUodGltZSwgdHosIGRtb2RlKSk7CisJCWJyZWFrOworCWNhc2UgQ01JVF9GTVRfRU1BSUw6CisJCXN0cmJ1Zl9hZGRmKHNiLCAiRGF0ZTogJXNcbiIsIHNob3dfZGF0ZSh0aW1lLCB0eiwgREFURV9SRkMyODIyKSk7CisJCWJyZWFrOworCWNhc2UgQ01JVF9GTVRfRlVMTEVSOgorCQlzdHJidWZfYWRkZihzYiwgIiVzRGF0ZTogJXNcbiIsIHdoYXQsIHNob3dfZGF0ZSh0aW1lLCB0eiwgZG1vZGUpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogbm90aW4nICovCisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBpc19lbXB0eV9saW5lKGNvbnN0IGNoYXIgKmxpbmUsIGludCAqbGVuX3ApCit7CisJaW50IGxlbiA9ICpsZW5fcDsKKwl3aGlsZSAobGVuICYmIGlzc3BhY2UobGluZVtsZW4tMV0pKQorCQlsZW4tLTsKKwkqbGVuX3AgPSBsZW47CisJcmV0dXJuICFsZW47Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9tZXJnZV9pbmZvKGVudW0gY21pdF9mbXQgZm10LCBzdHJ1Y3Qgc3RyYnVmICpzYiwKKwkJCWNvbnN0IHN0cnVjdCBjb21taXQgKmNvbW1pdCwgaW50IGFiYnJldikKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudCA9IGNvbW1pdC0+cGFyZW50czsKKworCWlmICgoZm10ID09IENNSVRfRk1UX09ORUxJTkUpIHx8IChmbXQgPT0gQ01JVF9GTVRfRU1BSUwpIHx8CisJICAgICFwYXJlbnQgfHwgIXBhcmVudC0+bmV4dCkKKwkJcmV0dXJuOworCisJc3RyYnVmX2FkZHN0cihzYiwgIk1lcmdlOiIpOworCisJd2hpbGUgKHBhcmVudCkgeworCQlzdHJ1Y3QgY29tbWl0ICpwID0gcGFyZW50LT5pdGVtOworCQljb25zdCBjaGFyICpoZXggPSBOVUxMOworCQljb25zdCBjaGFyICpkb3RzOworCQlpZiAoYWJicmV2KQorCQkJaGV4ID0gZmluZF91bmlxdWVfYWJicmV2KHAtPm9iamVjdC5zaGExLCBhYmJyZXYpOworCQlpZiAoIWhleCkKKwkJCWhleCA9IHNoYTFfdG9faGV4KHAtPm9iamVjdC5zaGExKTsKKwkJZG90cyA9IChhYmJyZXYgJiYgc3RybGVuKGhleCkgIT0gNDApID8gICIuLi4iIDogIiI7CisJCXBhcmVudCA9IHBhcmVudC0+bmV4dDsKKworCQlzdHJidWZfYWRkZihzYiwgIiAlcyVzIiwgaGV4LCBkb3RzKTsKKwl9CisJc3RyYnVmX2FkZGNoKHNiLCAnXG4nKTsKK30KKworc3RhdGljIGNoYXIgKmdldF9oZWFkZXIoY29uc3Qgc3RydWN0IGNvbW1pdCAqY29tbWl0LCBjb25zdCBjaGFyICprZXkpCit7CisJaW50IGtleV9sZW4gPSBzdHJsZW4oa2V5KTsKKwljb25zdCBjaGFyICpsaW5lID0gY29tbWl0LT5idWZmZXI7CisKKwlmb3IgKDs7KSB7CisJCWNvbnN0IGNoYXIgKmVvbCA9IHN0cmNocihsaW5lLCAnXG4nKSwgKm5leHQ7CisKKwkJaWYgKGxpbmUgPT0gZW9sKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmICghZW9sKSB7CisJCQllb2wgPSBsaW5lICsgc3RybGVuKGxpbmUpOworCQkJbmV4dCA9IE5VTEw7CisJCX0gZWxzZQorCQkJbmV4dCA9IGVvbCArIDE7CisJCWlmIChlb2wgLSBsaW5lID4ga2V5X2xlbiAmJgorCQkgICAgIXN0cm5jbXAobGluZSwga2V5LCBrZXlfbGVuKSAmJgorCQkgICAgbGluZVtrZXlfbGVuXSA9PSAnICcpIHsKKwkJCXJldHVybiB4bWVtZHVweihsaW5lICsga2V5X2xlbiArIDEsIGVvbCAtIGxpbmUgLSBrZXlfbGVuIC0gMSk7CisJCX0KKwkJbGluZSA9IG5leHQ7CisJfQorfQorCitzdGF0aWMgY2hhciAqcmVwbGFjZV9lbmNvZGluZ19oZWFkZXIoY2hhciAqYnVmLCBjb25zdCBjaGFyICplbmNvZGluZykKK3sKKwlzdHJ1Y3Qgc3RyYnVmIHRtcDsKKwlzaXplX3Qgc3RhcnQsIGxlbjsKKwljaGFyICpjcCA9IGJ1ZjsKKworCS8qIGd1ZXNzIGlmIHRoZXJlIGlzIGFuIGVuY29kaW5nIGhlYWRlciBiZWZvcmUgYSBcblxuICovCisJd2hpbGUgKHN0cm5jbXAoY3AsICJlbmNvZGluZyAiLCBzdHJsZW4oImVuY29kaW5nICIpKSkgeworCQljcCA9IHN0cmNocihjcCwgJ1xuJyk7CisJCWlmICghY3AgfHwgKisrY3AgPT0gJ1xuJykKKwkJCXJldHVybiBidWY7CisJfQorCXN0YXJ0ID0gY3AgLSBidWY7CisJY3AgPSBzdHJjaHIoY3AsICdcbicpOworCWlmICghY3ApCisJCXJldHVybiBidWY7IC8qIHNob3VsZCBub3QgaGFwcGVuIGJ1dCBiZSBkZWZlbnNpdmUgKi8KKwlsZW4gPSBjcCArIDEgLSAoYnVmICsgc3RhcnQpOworCisJc3RyYnVmX2luaXQoJnRtcCwgMCk7CisJc3RyYnVmX2F0dGFjaCgmdG1wLCBidWYsIHN0cmxlbihidWYpLCBzdHJsZW4oYnVmKSArIDEpOworCWlmIChpc19lbmNvZGluZ191dGY4KGVuY29kaW5nKSkgeworCQkvKiB3ZSBoYXZlIHJlLWNvZGVkIHRvIFVURi04OyBkcm9wIHRoZSBoZWFkZXIgKi8KKwkJc3RyYnVmX3JlbW92ZSgmdG1wLCBzdGFydCwgbGVuKTsKKwl9IGVsc2UgeworCQkvKiBqdXN0IHJlcGxhY2VzIFhYWFggaW4gJ2VuY29kaW5nIFhYWFhcbicgKi8KKwkJc3RyYnVmX3NwbGljZSgmdG1wLCBzdGFydCArIHN0cmxlbigiZW5jb2RpbmcgIiksCisJCQkJCSAgbGVuIC0gc3RybGVuKCJlbmNvZGluZyBcbiIpLAorCQkJCQkgIGVuY29kaW5nLCBzdHJsZW4oZW5jb2RpbmcpKTsKKwl9CisJcmV0dXJuIHN0cmJ1Zl9kZXRhY2goJnRtcCwgTlVMTCk7Cit9CisKK3N0YXRpYyBjaGFyICpsb2dtc2dfcmVlbmNvZGUoY29uc3Qgc3RydWN0IGNvbW1pdCAqY29tbWl0LAorCQkJICAgICBjb25zdCBjaGFyICpvdXRwdXRfZW5jb2RpbmcpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKnV0ZjggPSAidXRmLTgiOworCWNvbnN0IGNoYXIgKnVzZV9lbmNvZGluZzsKKwljaGFyICplbmNvZGluZzsKKwljaGFyICpvdXQ7CisKKwlpZiAoISpvdXRwdXRfZW5jb2RpbmcpCisJCXJldHVybiBOVUxMOworCWVuY29kaW5nID0gZ2V0X2hlYWRlcihjb21taXQsICJlbmNvZGluZyIpOworCXVzZV9lbmNvZGluZyA9IGVuY29kaW5nID8gZW5jb2RpbmcgOiB1dGY4OworCWlmICghc3RyY21wKHVzZV9lbmNvZGluZywgb3V0cHV0X2VuY29kaW5nKSkKKwkJaWYgKGVuY29kaW5nKSAvKiB3ZSdsbCBzdHJpcCBlbmNvZGluZyBoZWFkZXIgbGF0ZXIgKi8KKwkJCW91dCA9IHhzdHJkdXAoY29tbWl0LT5idWZmZXIpOworCQllbHNlCisJCQlyZXR1cm4gTlVMTDsgLyogbm90aGluZyB0byBkbyAqLworCWVsc2UKKwkJb3V0ID0gcmVlbmNvZGVfc3RyaW5nKGNvbW1pdC0+YnVmZmVyLAorCQkJCSAgICAgIG91dHB1dF9lbmNvZGluZywgdXNlX2VuY29kaW5nKTsKKwlpZiAob3V0KQorCQlvdXQgPSByZXBsYWNlX2VuY29kaW5nX2hlYWRlcihvdXQsIG91dHB1dF9lbmNvZGluZyk7CisKKwlmcmVlKGVuY29kaW5nKTsKKwlyZXR1cm4gb3V0OworfQorCitzdGF0aWMgc2l6ZV90IGZvcm1hdF9wZXJzb25fcGFydChzdHJ1Y3Qgc3RyYnVmICpzYiwgY2hhciBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1zZywgaW50IGxlbikKK3sKKwkvKiBjdXJyZW50bHkgYWxsIHBsYWNlaG9sZGVycyBoYXZlIHNhbWUgbGVuZ3RoICovCisJY29uc3QgaW50IHBsYWNlaG9sZGVyX2xlbiA9IDI7CisJaW50IHN0YXJ0LCBlbmQsIHR6ID0gMDsKKwl1bnNpZ25lZCBsb25nIGRhdGUgPSAwOworCWNoYXIgKmVwOworCisJLyogYWR2YW5jZSAnZW5kJyB0byBwb2ludCB0byBlbWFpbCBzdGFydCBkZWxpbWl0ZXIgKi8KKwlmb3IgKGVuZCA9IDA7IGVuZCA8IGxlbiAmJiBtc2dbZW5kXSAhPSAnPCc7IGVuZCsrKQorCQk7IC8qIGRvIG5vdGhpbmcgKi8KKworCS8qCisJICogV2hlbiBlbmQgcG9pbnRzIGF0IHRoZSAnPCcgdGhhdCB3ZSBmb3VuZCwgaXQgc2hvdWxkIGhhdmUKKwkgKiBtYXRjaGluZyAnPicgbGF0ZXIsIHdoaWNoIG1lYW5zICdlbmQnIG11c3QgYmUgc3RyaWN0bHkKKwkgKiBiZWxvdyBsZW4gLSAxLgorCSAqLworCWlmIChlbmQgPj0gbGVuIC0gMikKKwkJZ290byBza2lwOworCisJaWYgKHBhcnQgPT0gJ24nKSB7CS8qIG5hbWUgKi8KKwkJd2hpbGUgKGVuZCA+IDAgJiYgaXNzcGFjZShtc2dbZW5kIC0gMV0pKQorCQkJZW5kLS07CisJCXN0cmJ1Zl9hZGQoc2IsIG1zZywgZW5kKTsKKwkJcmV0dXJuIHBsYWNlaG9sZGVyX2xlbjsKKwl9CisJc3RhcnQgPSArK2VuZDsgLyogc2F2ZSBlbWFpbCBzdGFydCBwb3NpdGlvbiAqLworCisJLyogYWR2YW5jZSAnZW5kJyB0byBwb2ludCB0byBlbWFpbCBlbmQgZGVsaW1pdGVyICovCisJZm9yICggOyBlbmQgPCBsZW4gJiYgbXNnW2VuZF0gIT0gJz4nOyBlbmQrKykKKwkJOyAvKiBkbyBub3RoaW5nICovCisKKwlpZiAoZW5kID49IGxlbikKKwkJZ290byBza2lwOworCisJaWYgKHBhcnQgPT0gJ2UnKSB7CS8qIGVtYWlsICovCisJCXN0cmJ1Zl9hZGQoc2IsIG1zZyArIHN0YXJ0LCBlbmQgLSBzdGFydCk7CisJCXJldHVybiBwbGFjZWhvbGRlcl9sZW47CisJfQorCisJLyogYWR2YW5jZSAnc3RhcnQnIHRvIHBvaW50IHRvIGRhdGUgc3RhcnQgZGVsaW1pdGVyICovCisJZm9yIChzdGFydCA9IGVuZCArIDE7IHN0YXJ0IDwgbGVuICYmIGlzc3BhY2UobXNnW3N0YXJ0XSk7IHN0YXJ0KyspCisJCTsgLyogZG8gbm90aGluZyAqLworCWlmIChzdGFydCA+PSBsZW4pCisJCWdvdG8gc2tpcDsKKwlkYXRlID0gc3RydG91bChtc2cgKyBzdGFydCwgJmVwLCAxMCk7CisJaWYgKG1zZyArIHN0YXJ0ID09IGVwKQorCQlnb3RvIHNraXA7CisKKwlpZiAocGFydCA9PSAndCcpIHsJLyogZGF0ZSwgVU5JWCB0aW1lc3RhbXAgKi8KKwkJc3RyYnVmX2FkZChzYiwgbXNnICsgc3RhcnQsIGVwIC0gKG1zZyArIHN0YXJ0KSk7CisJCXJldHVybiBwbGFjZWhvbGRlcl9sZW47CisJfQorCisJLyogcGFyc2UgdHogKi8KKwlmb3IgKHN0YXJ0ID0gZXAgLSBtc2cgKyAxOyBzdGFydCA8IGxlbiAmJiBpc3NwYWNlKG1zZ1tzdGFydF0pOyBzdGFydCsrKQorCQk7IC8qIGRvIG5vdGhpbmcgKi8KKwlpZiAoc3RhcnQgKyAxIDwgbGVuKSB7CisJCXR6ID0gc3RydG91bChtc2cgKyBzdGFydCArIDEsIE5VTEwsIDEwKTsKKwkJaWYgKG1zZ1tzdGFydF0gPT0gJy0nKQorCQkJdHogPSAtdHo7CisJfQorCisJc3dpdGNoIChwYXJ0KSB7CisJY2FzZSAnZCc6CS8qIGRhdGUgKi8KKwkJc3RyYnVmX2FkZHN0cihzYiwgc2hvd19kYXRlKGRhdGUsIHR6LCBEQVRFX05PUk1BTCkpOworCQlyZXR1cm4gcGxhY2Vob2xkZXJfbGVuOworCWNhc2UgJ0QnOgkvKiBkYXRlLCBSRkMyODIyIHN0eWxlICovCisJCXN0cmJ1Zl9hZGRzdHIoc2IsIHNob3dfZGF0ZShkYXRlLCB0eiwgREFURV9SRkMyODIyKSk7CisJCXJldHVybiBwbGFjZWhvbGRlcl9sZW47CisJY2FzZSAncic6CS8qIGRhdGUsIHJlbGF0aXZlICovCisJCXN0cmJ1Zl9hZGRzdHIoc2IsIHNob3dfZGF0ZShkYXRlLCB0eiwgREFURV9SRUxBVElWRSkpOworCQlyZXR1cm4gcGxhY2Vob2xkZXJfbGVuOworCWNhc2UgJ2knOgkvKiBkYXRlLCBJU08gODYwMSAqLworCQlzdHJidWZfYWRkc3RyKHNiLCBzaG93X2RhdGUoZGF0ZSwgdHosIERBVEVfSVNPODYwMSkpOworCQlyZXR1cm4gcGxhY2Vob2xkZXJfbGVuOworCX0KKworc2tpcDoKKwkvKgorCSAqIGJvZ3VzIGNvbW1pdCwgJ3NiJyBjYW5ub3QgYmUgdXBkYXRlZCwgYnV0IHdlIHN0aWxsIG5lZWQgdG8KKwkgKiBjb21wdXRlIGEgdmFsaWQgcmV0dXJuIHZhbHVlLgorCSAqLworCWlmIChwYXJ0ID09ICduJyB8fCBwYXJ0ID09ICdlJyB8fCBwYXJ0ID09ICd0JyB8fCBwYXJ0ID09ICdkJworCSAgICB8fCBwYXJ0ID09ICdEJyB8fCBwYXJ0ID09ICdyJyB8fCBwYXJ0ID09ICdpJykKKwkJcmV0dXJuIHBsYWNlaG9sZGVyX2xlbjsKKworCXJldHVybiAwOyAvKiB1bmtub3duIHBsYWNlaG9sZGVyICovCit9CisKK3N0cnVjdCBjaHVuayB7CisJc2l6ZV90IG9mZjsKKwlzaXplX3QgbGVuOworfTsKKworc3RydWN0IGZvcm1hdF9jb21taXRfY29udGV4dCB7CisJY29uc3Qgc3RydWN0IGNvbW1pdCAqY29tbWl0OworCisJLyogVGhlc2Ugb2Zmc2V0cyBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb21taXQgbWVzc2FnZS4gKi8KKwlpbnQgY29tbWl0X2hlYWRlcl9wYXJzZWQ7CisJc3RydWN0IGNodW5rIHN1YmplY3Q7CisJc3RydWN0IGNodW5rIGF1dGhvcjsKKwlzdHJ1Y3QgY2h1bmsgY29tbWl0dGVyOworCXN0cnVjdCBjaHVuayBlbmNvZGluZzsKKwlzaXplX3QgYm9keV9vZmY7CisKKwkvKiBUaGUgZm9sbG93aW5nIG9uZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSByZXN1bHQgc3RydWN0IHN0cmJ1Zi4gKi8KKwlzdHJ1Y3QgY2h1bmsgYWJicmV2X2NvbW1pdF9oYXNoOworCXN0cnVjdCBjaHVuayBhYmJyZXZfdHJlZV9oYXNoOworCXN0cnVjdCBjaHVuayBhYmJyZXZfcGFyZW50X2hhc2hlczsKK307CisKK3N0YXRpYyBpbnQgYWRkX2FnYWluKHN0cnVjdCBzdHJidWYgKnNiLCBzdHJ1Y3QgY2h1bmsgKmNodW5rKQoreworCWlmIChjaHVuay0+bGVuKSB7CisJCXN0cmJ1Zl9hZGRkdXAoc2IsIGNodW5rLT5vZmYsIGNodW5rLT5sZW4pOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIFdlIGhhdmVuJ3Qgc2VlbiB0aGlzIGNodW5rIGJlZm9yZS4gIE91ciBjYWxsZXIgaXMgc3VyZWx5CisJICogZ29pbmcgdG8gYWRkIGl0IHRoZSBoYXJkIHdheSBub3cuICBSZW1lbWJlciB0aGUgbW9zdCBsaWtlbHkKKwkgKiBzdGFydCBvZiB0aGUgdG8tYmUtYWRkZWQgY2h1bms6IHRoZSBjdXJyZW50IGVuZCBvZiB0aGUKKwkgKiBzdHJ1Y3Qgc3RyYnVmLgorCSAqLworCWNodW5rLT5vZmYgPSBzYi0+bGVuOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9jb21taXRfaGVhZGVyKHN0cnVjdCBmb3JtYXRfY29tbWl0X2NvbnRleHQgKmNvbnRleHQpCit7CisJY29uc3QgY2hhciAqbXNnID0gY29udGV4dC0+Y29tbWl0LT5idWZmZXI7CisJaW50IGk7CisJZW51bSB7IEhFQURFUiwgU1VCSkVDVCwgQk9EWSB9IHN0YXRlOworCisJZm9yIChpID0gMCwgc3RhdGUgPSBIRUFERVI7IG1zZ1tpXSAmJiBzdGF0ZSA8IEJPRFk7IGkrKykgeworCQlpbnQgZW9sOworCQlmb3IgKGVvbCA9IGk7IG1zZ1tlb2xdICYmIG1zZ1tlb2xdICE9ICdcbic7IGVvbCsrKQorCQkJOyAvKiBkbyBub3RoaW5nICovCisKKwkJaWYgKHN0YXRlID09IFNVQkpFQ1QpIHsKKwkJCWNvbnRleHQtPnN1YmplY3Qub2ZmID0gaTsKKwkJCWNvbnRleHQtPnN1YmplY3QubGVuID0gZW9sIC0gaTsKKwkJCWkgPSBlb2w7CisJCX0KKwkJaWYgKGkgPT0gZW9sKSB7CisJCQlzdGF0ZSsrOworCQkJLyogc3RyaXAgZW1wdHkgbGluZXMgKi8KKwkJCXdoaWxlIChtc2dbZW9sXSA9PSAnXG4nICYmIG1zZ1tlb2wgKyAxXSA9PSAnXG4nKQorCQkJCWVvbCsrOworCQl9IGVsc2UgaWYgKCFwcmVmaXhjbXAobXNnICsgaSwgImF1dGhvciAiKSkgeworCQkJY29udGV4dC0+YXV0aG9yLm9mZiA9IGkgKyA3OworCQkJY29udGV4dC0+YXV0aG9yLmxlbiA9IGVvbCAtIGkgLSA3OworCQl9IGVsc2UgaWYgKCFwcmVmaXhjbXAobXNnICsgaSwgImNvbW1pdHRlciAiKSkgeworCQkJY29udGV4dC0+Y29tbWl0dGVyLm9mZiA9IGkgKyAxMDsKKwkJCWNvbnRleHQtPmNvbW1pdHRlci5sZW4gPSBlb2wgLSBpIC0gMTA7CisJCX0gZWxzZSBpZiAoIXByZWZpeGNtcChtc2cgKyBpLCAiZW5jb2RpbmcgIikpIHsKKwkJCWNvbnRleHQtPmVuY29kaW5nLm9mZiA9IGkgKyA5OworCQkJY29udGV4dC0+ZW5jb2RpbmcubGVuID0gZW9sIC0gaSAtIDk7CisJCX0KKwkJaSA9IGVvbDsKKwkJaWYgKCFtc2dbaV0pCisJCQlicmVhazsKKwl9CisJY29udGV4dC0+Ym9keV9vZmYgPSBpOworCWNvbnRleHQtPmNvbW1pdF9oZWFkZXJfcGFyc2VkID0gMTsKK30KKworc3RhdGljIHNpemVfdCBmb3JtYXRfY29tbWl0X2l0ZW0oc3RydWN0IHN0cmJ1ZiAqc2IsIGNvbnN0IGNoYXIgKnBsYWNlaG9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGZvcm1hdF9jb21taXRfY29udGV4dCAqYyA9IGNvbnRleHQ7CisJY29uc3Qgc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gYy0+Y29tbWl0OworCWNvbnN0IGNoYXIgKm1zZyA9IGNvbW1pdC0+YnVmZmVyOworCXN0cnVjdCBjb21taXRfbGlzdCAqcDsKKworCS8qIHRoZXNlIGFyZSBpbmRlcGVuZGVudCBvZiB0aGUgY29tbWl0ICovCisJc3dpdGNoIChwbGFjZWhvbGRlclswXSkgeworCWNhc2UgJ0MnOgorCQlpZiAoIXByZWZpeGNtcChwbGFjZWhvbGRlciArIDEsICJyZWQiKSkgeworCQkJc3RyYnVmX2FkZHN0cihzYiwgIlwwMzNbMzFtIik7CisJCQlyZXR1cm4gNDsKKwkJfSBlbHNlIGlmICghcHJlZml4Y21wKHBsYWNlaG9sZGVyICsgMSwgImdyZWVuIikpIHsKKwkJCXN0cmJ1Zl9hZGRzdHIoc2IsICJcMDMzWzMybSIpOworCQkJcmV0dXJuIDY7CisJCX0gZWxzZSBpZiAoIXByZWZpeGNtcChwbGFjZWhvbGRlciArIDEsICJibHVlIikpIHsKKwkJCXN0cmJ1Zl9hZGRzdHIoc2IsICJcMDMzWzM0bSIpOworCQkJcmV0dXJuIDU7CisJCX0gZWxzZSBpZiAoIXByZWZpeGNtcChwbGFjZWhvbGRlciArIDEsICJyZXNldCIpKSB7CisJCQlzdHJidWZfYWRkc3RyKHNiLCAiXDAzM1ttIik7CisJCQlyZXR1cm4gNjsKKwkJfSBlbHNlCisJCQlyZXR1cm4gMDsKKwljYXNlICduJzoJCS8qIG5ld2xpbmUgKi8KKwkJc3RyYnVmX2FkZGNoKHNiLCAnXG4nKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogdGhlc2UgZGVwZW5kIG9uIHRoZSBjb21taXQgKi8KKwlpZiAoIWNvbW1pdC0+b2JqZWN0LnBhcnNlZCkKKwkJcGFyc2Vfb2JqZWN0KGNvbW1pdC0+b2JqZWN0LnNoYTEpOworCisJc3dpdGNoIChwbGFjZWhvbGRlclswXSkgeworCWNhc2UgJ0gnOgkJLyogY29tbWl0IGhhc2ggKi8KKwkJc3RyYnVmX2FkZHN0cihzYiwgc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCQlyZXR1cm4gMTsKKwljYXNlICdoJzoJCS8qIGFiYnJldmlhdGVkIGNvbW1pdCBoYXNoICovCisJCWlmIChhZGRfYWdhaW4oc2IsICZjLT5hYmJyZXZfY29tbWl0X2hhc2gpKQorCQkJcmV0dXJuIDE7CisJCXN0cmJ1Zl9hZGRzdHIoc2IsIGZpbmRfdW5pcXVlX2FiYnJldihjb21taXQtPm9iamVjdC5zaGExLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9BQkJSRVYpKTsKKwkJYy0+YWJicmV2X2NvbW1pdF9oYXNoLmxlbiA9IHNiLT5sZW4gLSBjLT5hYmJyZXZfY29tbWl0X2hhc2gub2ZmOworCQlyZXR1cm4gMTsKKwljYXNlICdUJzoJCS8qIHRyZWUgaGFzaCAqLworCQlzdHJidWZfYWRkc3RyKHNiLCBzaGExX3RvX2hleChjb21taXQtPnRyZWUtPm9iamVjdC5zaGExKSk7CisJCXJldHVybiAxOworCWNhc2UgJ3QnOgkJLyogYWJicmV2aWF0ZWQgdHJlZSBoYXNoICovCisJCWlmIChhZGRfYWdhaW4oc2IsICZjLT5hYmJyZXZfdHJlZV9oYXNoKSkKKwkJCXJldHVybiAxOworCQlzdHJidWZfYWRkc3RyKHNiLCBmaW5kX3VuaXF1ZV9hYmJyZXYoY29tbWl0LT50cmVlLT5vYmplY3Quc2hhMSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUJCUkVWKSk7CisJCWMtPmFiYnJldl90cmVlX2hhc2gubGVuID0gc2ItPmxlbiAtIGMtPmFiYnJldl90cmVlX2hhc2gub2ZmOworCQlyZXR1cm4gMTsKKwljYXNlICdQJzoJCS8qIHBhcmVudCBoYXNoZXMgKi8KKwkJZm9yIChwID0gY29tbWl0LT5wYXJlbnRzOyBwOyBwID0gcC0+bmV4dCkgeworCQkJaWYgKHAgIT0gY29tbWl0LT5wYXJlbnRzKQorCQkJCXN0cmJ1Zl9hZGRjaChzYiwgJyAnKTsKKwkJCXN0cmJ1Zl9hZGRzdHIoc2IsIHNoYTFfdG9faGV4KHAtPml0ZW0tPm9iamVjdC5zaGExKSk7CisJCX0KKwkJcmV0dXJuIDE7CisJY2FzZSAncCc6CQkvKiBhYmJyZXZpYXRlZCBwYXJlbnQgaGFzaGVzICovCisJCWlmIChhZGRfYWdhaW4oc2IsICZjLT5hYmJyZXZfcGFyZW50X2hhc2hlcykpCisJCQlyZXR1cm4gMTsKKwkJZm9yIChwID0gY29tbWl0LT5wYXJlbnRzOyBwOyBwID0gcC0+bmV4dCkgeworCQkJaWYgKHAgIT0gY29tbWl0LT5wYXJlbnRzKQorCQkJCXN0cmJ1Zl9hZGRjaChzYiwgJyAnKTsKKwkJCXN0cmJ1Zl9hZGRzdHIoc2IsIGZpbmRfdW5pcXVlX2FiYnJldigKKwkJCQkJcC0+aXRlbS0+b2JqZWN0LnNoYTEsIERFRkFVTFRfQUJCUkVWKSk7CisJCX0KKwkJYy0+YWJicmV2X3BhcmVudF9oYXNoZXMubGVuID0gc2ItPmxlbiAtCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmFiYnJldl9wYXJlbnRfaGFzaGVzLm9mZjsKKwkJcmV0dXJuIDE7CisJY2FzZSAnbSc6CQkvKiBsZWZ0L3JpZ2h0L2JvdHRvbSAqLworCQlzdHJidWZfYWRkY2goc2IsIChjb21taXQtPm9iamVjdC5mbGFncyAmIEJPVU5EQVJZKQorCQkgICAgICAgICAgICAgICAgID8gJy0nCisJCSAgICAgICAgICAgICAgICAgOiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBTWU1NRVRSSUNfTEVGVCkKKwkJICAgICAgICAgICAgICAgICA/ICc8JworCQkgICAgICAgICAgICAgICAgIDogJz4nKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogRm9yIHRoZSByZXN0IHdlIGhhdmUgdG8gcGFyc2UgdGhlIGNvbW1pdCBoZWFkZXIuICovCisJaWYgKCFjLT5jb21taXRfaGVhZGVyX3BhcnNlZCkKKwkJcGFyc2VfY29tbWl0X2hlYWRlcihjKTsKKworCXN3aXRjaCAocGxhY2Vob2xkZXJbMF0pIHsKKwljYXNlICdzJzoJLyogc3ViamVjdCAqLworCQlzdHJidWZfYWRkKHNiLCBtc2cgKyBjLT5zdWJqZWN0Lm9mZiwgYy0+c3ViamVjdC5sZW4pOworCQlyZXR1cm4gMTsKKwljYXNlICdhJzoJLyogYXV0aG9yIC4uLiAqLworCQlyZXR1cm4gZm9ybWF0X3BlcnNvbl9wYXJ0KHNiLCBwbGFjZWhvbGRlclsxXSwKKwkJICAgICAgICAgICAgICAgICAgIG1zZyArIGMtPmF1dGhvci5vZmYsIGMtPmF1dGhvci5sZW4pOworCWNhc2UgJ2MnOgkvKiBjb21taXR0ZXIgLi4uICovCisJCXJldHVybiBmb3JtYXRfcGVyc29uX3BhcnQoc2IsIHBsYWNlaG9sZGVyWzFdLAorCQkgICAgICAgICAgICAgICAgICAgbXNnICsgYy0+Y29tbWl0dGVyLm9mZiwgYy0+Y29tbWl0dGVyLmxlbik7CisJY2FzZSAnZSc6CS8qIGVuY29kaW5nICovCisJCXN0cmJ1Zl9hZGQoc2IsIG1zZyArIGMtPmVuY29kaW5nLm9mZiwgYy0+ZW5jb2RpbmcubGVuKTsKKwkJcmV0dXJuIDE7CisJY2FzZSAnYic6CS8qIGJvZHkgKi8KKwkJc3RyYnVmX2FkZHN0cihzYiwgbXNnICsgYy0+Ym9keV9vZmYpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7CS8qIHVua25vd24gcGxhY2Vob2xkZXIgKi8KK30KKwordm9pZCBmb3JtYXRfY29tbWl0X21lc3NhZ2UoY29uc3Qgc3RydWN0IGNvbW1pdCAqY29tbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZm9ybWF0LCBzdHJ1Y3Qgc3RyYnVmICpzYikKK3sKKwlzdHJ1Y3QgZm9ybWF0X2NvbW1pdF9jb250ZXh0IGNvbnRleHQ7CisKKwltZW1zZXQoJmNvbnRleHQsIDAsIHNpemVvZihjb250ZXh0KSk7CisJY29udGV4dC5jb21taXQgPSBjb21taXQ7CisJc3RyYnVmX2V4cGFuZChzYiwgZm9ybWF0LCBmb3JtYXRfY29tbWl0X2l0ZW0sICZjb250ZXh0KTsKK30KKworc3RhdGljIHZvaWQgcHBfaGVhZGVyKGVudW0gY21pdF9mbXQgZm10LAorCQkgICAgICBpbnQgYWJicmV2LAorCQkgICAgICBlbnVtIGRhdGVfbW9kZSBkbW9kZSwKKwkJICAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBjb21taXQgKmNvbW1pdCwKKwkJICAgICAgY29uc3QgY2hhciAqKm1zZ19wLAorCQkgICAgICBzdHJ1Y3Qgc3RyYnVmICpzYikKK3sKKwlpbnQgcGFyZW50c19zaG93biA9IDA7CisKKwlmb3IgKDs7KSB7CisJCWNvbnN0IGNoYXIgKmxpbmUgPSAqbXNnX3A7CisJCWludCBsaW5lbGVuID0gZ2V0X29uZV9saW5lKCptc2dfcCk7CisKKwkJaWYgKCFsaW5lbGVuKQorCQkJcmV0dXJuOworCQkqbXNnX3AgKz0gbGluZWxlbjsKKworCQlpZiAobGluZWxlbiA9PSAxKQorCQkJLyogRW5kIG9mIGhlYWRlciAqLworCQkJcmV0dXJuOworCisJCWlmIChmbXQgPT0gQ01JVF9GTVRfUkFXKSB7CisJCQlzdHJidWZfYWRkKHNiLCBsaW5lLCBsaW5lbGVuKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFtZW1jbXAobGluZSwgInBhcmVudCAiLCA3KSkgeworCQkJaWYgKGxpbmVsZW4gIT0gNDgpCisJCQkJZGllKCJiYWQgcGFyZW50IGxpbmUgaW4gY29tbWl0Iik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghcGFyZW50c19zaG93bikgeworCQkJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnQ7CisJCQlpbnQgbnVtOworCQkJZm9yIChwYXJlbnQgPSBjb21taXQtPnBhcmVudHMsIG51bSA9IDA7CisJCQkgICAgIHBhcmVudDsKKwkJCSAgICAgcGFyZW50ID0gcGFyZW50LT5uZXh0LCBudW0rKykKKwkJCQk7CisJCQkvKiB3aXRoIGVub3VnaCBzbG9wICovCisJCQlzdHJidWZfZ3JvdyhzYiwgbnVtICogNTAgKyAyMCk7CisJCQlhZGRfbWVyZ2VfaW5mbyhmbXQsIHNiLCBjb21taXQsIGFiYnJldik7CisJCQlwYXJlbnRzX3Nob3duID0gMTsKKwkJfQorCisJCS8qCisJCSAqIE1FRElVTSA9PSBERUZBVUxUIHNob3dzIG9ubHkgYXV0aG9yIHdpdGggZGF0ZXMuCisJCSAqIEZVTEwgc2hvd3MgYm90aCBhdXRob3JzIGJ1dCBub3QgZGF0ZXMuCisJCSAqIEZVTExFUiBzaG93cyBib3RoIGF1dGhvcnMgYW5kIGRhdGVzLgorCQkgKi8KKwkJaWYgKCFtZW1jbXAobGluZSwgImF1dGhvciAiLCA3KSkgeworCQkJc3RyYnVmX2dyb3coc2IsIGxpbmVsZW4gKyA4MCk7CisJCQlwcF91c2VyX2luZm8oIkF1dGhvciIsIGZtdCwgc2IsIGxpbmUgKyA3LCBkbW9kZSwgZW5jb2RpbmcpOworCQl9CisJCWlmICghbWVtY21wKGxpbmUsICJjb21taXR0ZXIgIiwgMTApICYmCisJCSAgICAoZm10ID09IENNSVRfRk1UX0ZVTEwgfHwgZm10ID09IENNSVRfRk1UX0ZVTExFUikpIHsKKwkJCXN0cmJ1Zl9ncm93KHNiLCBsaW5lbGVuICsgODApOworCQkJcHBfdXNlcl9pbmZvKCJDb21taXQiLCBmbXQsIHNiLCBsaW5lICsgMTAsIGRtb2RlLCBlbmNvZGluZyk7CisJCX0KKwl9Cit9CisKK3ZvaWQgcHBfdGl0bGVfbGluZShlbnVtIGNtaXRfZm10IGZtdCwKKwkJICAgY29uc3QgY2hhciAqKm1zZ19wLAorCQkgICBzdHJ1Y3Qgc3RyYnVmICpzYiwKKwkJICAgY29uc3QgY2hhciAqc3ViamVjdCwKKwkJICAgY29uc3QgY2hhciAqYWZ0ZXJfc3ViamVjdCwKKwkJICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCisJCSAgIGludCBuZWVkXzhiaXRfY3RlKQoreworCXN0cnVjdCBzdHJidWYgdGl0bGU7CisKKwlzdHJidWZfaW5pdCgmdGl0bGUsIDgwKTsKKworCWZvciAoOzspIHsKKwkJY29uc3QgY2hhciAqbGluZSA9ICptc2dfcDsKKwkJaW50IGxpbmVsZW4gPSBnZXRfb25lX2xpbmUobGluZSk7CisKKwkJKm1zZ19wICs9IGxpbmVsZW47CisJCWlmICghbGluZWxlbiB8fCBpc19lbXB0eV9saW5lKGxpbmUsICZsaW5lbGVuKSkKKwkJCWJyZWFrOworCisJCXN0cmJ1Zl9ncm93KCZ0aXRsZSwgbGluZWxlbiArIDIpOworCQlpZiAodGl0bGUubGVuKSB7CisJCQlpZiAoZm10ID09IENNSVRfRk1UX0VNQUlMKSB7CisJCQkJc3RyYnVmX2FkZGNoKCZ0aXRsZSwgJ1xuJyk7CisJCQl9CisJCQlzdHJidWZfYWRkY2goJnRpdGxlLCAnICcpOworCQl9CisJCXN0cmJ1Zl9hZGQoJnRpdGxlLCBsaW5lLCBsaW5lbGVuKTsKKwl9CisKKwlzdHJidWZfZ3JvdyhzYiwgdGl0bGUubGVuICsgMTAyNCk7CisJaWYgKHN1YmplY3QpIHsKKwkJc3RyYnVmX2FkZHN0cihzYiwgc3ViamVjdCk7CisJCWFkZF9yZmMyMDQ3KHNiLCB0aXRsZS5idWYsIHRpdGxlLmxlbiwgZW5jb2RpbmcpOworCX0gZWxzZSB7CisJCXN0cmJ1Zl9hZGRidWYoc2IsICZ0aXRsZSk7CisJfQorCXN0cmJ1Zl9hZGRjaChzYiwgJ1xuJyk7CisKKwlpZiAobmVlZF84Yml0X2N0ZSA+IDApIHsKKwkJY29uc3QgY2hhciAqaGVhZGVyX2ZtdCA9CisJCQkiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKwkJCSJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9JXNcbiIKKwkJCSJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iOworCQlzdHJidWZfYWRkZihzYiwgaGVhZGVyX2ZtdCwgZW5jb2RpbmcpOworCX0KKwlpZiAoYWZ0ZXJfc3ViamVjdCkgeworCQlzdHJidWZfYWRkc3RyKHNiLCBhZnRlcl9zdWJqZWN0KTsKKwl9CisJaWYgKGZtdCA9PSBDTUlUX0ZNVF9FTUFJTCkgeworCQlzdHJidWZfYWRkY2goc2IsICdcbicpOworCX0KKwlzdHJidWZfcmVsZWFzZSgmdGl0bGUpOworfQorCit2b2lkIHBwX3JlbWFpbmRlcihlbnVtIGNtaXRfZm10IGZtdCwKKwkJICBjb25zdCBjaGFyICoqbXNnX3AsCisJCSAgc3RydWN0IHN0cmJ1ZiAqc2IsCisJCSAgaW50IGluZGVudCkKK3sKKwlpbnQgZmlyc3QgPSAxOworCWZvciAoOzspIHsKKwkJY29uc3QgY2hhciAqbGluZSA9ICptc2dfcDsKKwkJaW50IGxpbmVsZW4gPSBnZXRfb25lX2xpbmUobGluZSk7CisJCSptc2dfcCArPSBsaW5lbGVuOworCisJCWlmICghbGluZWxlbikKKwkJCWJyZWFrOworCisJCWlmIChpc19lbXB0eV9saW5lKGxpbmUsICZsaW5lbGVuKSkgeworCQkJaWYgKGZpcnN0KQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGZtdCA9PSBDTUlUX0ZNVF9TSE9SVCkKKwkJCQlicmVhazsKKwkJfQorCQlmaXJzdCA9IDA7CisKKwkJc3RyYnVmX2dyb3coc2IsIGxpbmVsZW4gKyBpbmRlbnQgKyAyMCk7CisJCWlmIChpbmRlbnQpIHsKKwkJCW1lbXNldChzYi0+YnVmICsgc2ItPmxlbiwgJyAnLCBpbmRlbnQpOworCQkJc3RyYnVmX3NldGxlbihzYiwgc2ItPmxlbiArIGluZGVudCk7CisJCX0KKwkJc3RyYnVmX2FkZChzYiwgbGluZSwgbGluZWxlbik7CisJCXN0cmJ1Zl9hZGRjaChzYiwgJ1xuJyk7CisJfQorfQorCit2b2lkIHByZXR0eV9wcmludF9jb21taXQoZW51bSBjbWl0X2ZtdCBmbXQsIGNvbnN0IHN0cnVjdCBjb21taXQgKmNvbW1pdCwKKwkJCSBzdHJ1Y3Qgc3RyYnVmICpzYiwgaW50IGFiYnJldiwKKwkJCSBjb25zdCBjaGFyICpzdWJqZWN0LCBjb25zdCBjaGFyICphZnRlcl9zdWJqZWN0LAorCQkJIGVudW0gZGF0ZV9tb2RlIGRtb2RlLCBpbnQgbmVlZF84Yml0X2N0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGJlZ2lubmluZ19vZl9ib2R5OworCWludCBpbmRlbnQgPSA0OworCWNvbnN0IGNoYXIgKm1zZyA9IGNvbW1pdC0+YnVmZmVyOworCWNoYXIgKnJlZW5jb2RlZDsKKwljb25zdCBjaGFyICplbmNvZGluZzsKKworCWlmIChmbXQgPT0gQ01JVF9GTVRfVVNFUkZPUk1BVCkgeworCQlmb3JtYXRfY29tbWl0X21lc3NhZ2UoY29tbWl0LCB1c2VyX2Zvcm1hdCwgc2IpOworCQlyZXR1cm47CisJfQorCisJZW5jb2RpbmcgPSAoZ2l0X2xvZ19vdXRwdXRfZW5jb2RpbmcKKwkJICAgID8gZ2l0X2xvZ19vdXRwdXRfZW5jb2RpbmcKKwkJICAgIDogZ2l0X2NvbW1pdF9lbmNvZGluZyk7CisJaWYgKCFlbmNvZGluZykKKwkJZW5jb2RpbmcgPSAidXRmLTgiOworCXJlZW5jb2RlZCA9IGxvZ21zZ19yZWVuY29kZShjb21taXQsIGVuY29kaW5nKTsKKwlpZiAocmVlbmNvZGVkKSB7CisJCW1zZyA9IHJlZW5jb2RlZDsKKwl9CisKKwlpZiAoZm10ID09IENNSVRfRk1UX09ORUxJTkUgfHwgZm10ID09IENNSVRfRk1UX0VNQUlMKQorCQlpbmRlbnQgPSAwOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIGNoZWNrIGFuZCBlbWl0IENvbnRlbnQtdHlwZTogdG8gbWFyayBpdAorCSAqIGFzIDgtYml0IGlmIHdlIGhhdmVuJ3QgZG9uZSBzby4KKwkgKi8KKwlpZiAoZm10ID09IENNSVRfRk1UX0VNQUlMICYmIG5lZWRfOGJpdF9jdGUgPT0gMCkgeworCQlpbnQgaSwgY2gsIGluX2JvZHk7CisKKwkJZm9yIChpbl9ib2R5ID0gaSA9IDA7IChjaCA9IG1zZ1tpXSk7IGkrKykgeworCQkJaWYgKCFpbl9ib2R5KSB7CisJCQkJLyogYXV0aG9yIGNvdWxkIGJlIG5vbiA3LWJpdCBBU0NJSSBidXQKKwkJCQkgKiB0aGUgbG9nIG1heSBiZSBzbzsgc2tpcCBvdmVyIHRoZQorCQkJCSAqIGhlYWRlciBwYXJ0IGZpcnN0LgorCQkJCSAqLworCQkJCWlmIChjaCA9PSAnXG4nICYmIG1zZ1tpKzFdID09ICdcbicpCisJCQkJCWluX2JvZHkgPSAxOworCQkJfQorCQkJZWxzZSBpZiAobm9uX2FzY2lpKGNoKSkgeworCQkJCW5lZWRfOGJpdF9jdGUgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcHBfaGVhZGVyKGZtdCwgYWJicmV2LCBkbW9kZSwgZW5jb2RpbmcsIGNvbW1pdCwgJm1zZywgc2IpOworCWlmIChmbXQgIT0gQ01JVF9GTVRfT05FTElORSAmJiAhc3ViamVjdCkgeworCQlzdHJidWZfYWRkY2goc2IsICdcbicpOworCX0KKworCS8qIFNraXAgZXhjZXNzIGJsYW5rIGxpbmVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYm9keSwgaWYgYW55Li4uICovCisJZm9yICg7OykgeworCQlpbnQgbGluZWxlbiA9IGdldF9vbmVfbGluZShtc2cpOworCQlpbnQgbGwgPSBsaW5lbGVuOworCQlpZiAoIWxpbmVsZW4pCisJCQlicmVhazsKKwkJaWYgKCFpc19lbXB0eV9saW5lKG1zZywgJmxsKSkKKwkJCWJyZWFrOworCQltc2cgKz0gbGluZWxlbjsKKwl9CisKKwkvKiBUaGVzZSBmb3JtYXRzIHRyZWF0IHRoZSB0aXRsZSBsaW5lIHNwZWNpYWxseS4gKi8KKwlpZiAoZm10ID09IENNSVRfRk1UX09ORUxJTkUgfHwgZm10ID09IENNSVRfRk1UX0VNQUlMKQorCQlwcF90aXRsZV9saW5lKGZtdCwgJm1zZywgc2IsIHN1YmplY3QsCisJCQkgICAgICBhZnRlcl9zdWJqZWN0LCBlbmNvZGluZywgbmVlZF84Yml0X2N0ZSk7CisKKwliZWdpbm5pbmdfb2ZfYm9keSA9IHNiLT5sZW47CisJaWYgKGZtdCAhPSBDTUlUX0ZNVF9PTkVMSU5FKQorCQlwcF9yZW1haW5kZXIoZm10LCAmbXNnLCBzYiwgaW5kZW50KTsKKwlzdHJidWZfcnRyaW0oc2IpOworCisJLyogTWFrZSBzdXJlIHRoZXJlIGlzIGFuIEVPTE4gZm9yIHRoZSBub24tb25lbGluZSBjYXNlICovCisJaWYgKGZtdCAhPSBDTUlUX0ZNVF9PTkVMSU5FKQorCQlzdHJidWZfYWRkY2goc2IsICdcbicpOworCisJLyoKKwkgKiBUaGUgY2FsbGVyIG1heSBhcHBlbmQgYWRkaXRpb25hbCBib2R5IHRleHQgaW4gZS1tYWlsCisJICogZm9ybWF0LiAgTWFrZSBzdXJlIHdlIGRpZCBub3Qgc3RyaXAgdGhlIGJsYW5rIGxpbmUKKwkgKiBiZXR3ZWVuIHRoZSBoZWFkZXIgYW5kIHRoZSBib2R5LgorCSAqLworCWlmIChmbXQgPT0gQ01JVF9GTVRfRU1BSUwgJiYgc2ItPmxlbiA8PSBiZWdpbm5pbmdfb2ZfYm9keSkKKwkJc3RyYnVmX2FkZGNoKHNiLCAnXG4nKTsKKwlmcmVlKHJlZW5jb2RlZCk7Cit9CmRpZmYgLS1naXQgYS9wcm9ncmVzcy5jIGIvcHJvZ3Jlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTlmODBjCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3Jlc3MuYwpAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqIFNpbXBsZSB0ZXh0LWJhc2VkIHByb2dyZXNzIGRpc3BsYXkgbW9kdWxlIGZvciBHSVQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgYnkgTmljb2xhcyBQaXRyZSA8bmljb0BjYW0ub3JnPgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgImdpdC1jb21wYXQtdXRpbC5oIgorI2luY2x1ZGUgInByb2dyZXNzLmgiCisKKyNkZWZpbmUgVFBfSURYX01BWCAgICAgIDgKKworc3RydWN0IHRocm91Z2hwdXQgeworCW9mZl90IGN1cnJfdG90YWw7CisJb2ZmX3QgcHJldl90b3RhbDsKKwlzdHJ1Y3QgdGltZXZhbCBwcmV2X3R2OworCXVuc2lnbmVkIGludCBhdmdfYnl0ZXM7CisJdW5zaWduZWQgaW50IGF2Z19taXNlY3M7CisJdW5zaWduZWQgaW50IGxhc3RfYnl0ZXNbVFBfSURYX01BWF07CisJdW5zaWduZWQgaW50IGxhc3RfbWlzZWNzW1RQX0lEWF9NQVhdOworCXVuc2lnbmVkIGludCBpZHg7CisJY2hhciBkaXNwbGF5WzMyXTsKK307CisKK3N0cnVjdCBwcm9ncmVzcyB7CisJY29uc3QgY2hhciAqdGl0bGU7CisJaW50IGxhc3RfdmFsdWU7CisJdW5zaWduZWQgdG90YWw7CisJdW5zaWduZWQgbGFzdF9wZXJjZW50OworCXVuc2lnbmVkIGRlbGF5OworCXVuc2lnbmVkIGRlbGF5ZWRfcGVyY2VudF90cmVzaG9sZDsKKwlzdHJ1Y3QgdGhyb3VnaHB1dCAqdGhyb3VnaHB1dDsKK307CisKK3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3QgcHJvZ3Jlc3NfdXBkYXRlOworCitzdGF0aWMgdm9pZCBwcm9ncmVzc19pbnRlcnZhbChpbnQgc2lnbnVtKQoreworCXByb2dyZXNzX3VwZGF0ZSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9wcm9ncmVzc19zaWduYWwodm9pZCkKK3sKKwlzdHJ1Y3Qgc2lnYWN0aW9uIHNhOworCXN0cnVjdCBpdGltZXJ2YWwgdjsKKworCXByb2dyZXNzX3VwZGF0ZSA9IDA7CisKKwltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKwlzYS5zYV9oYW5kbGVyID0gcHJvZ3Jlc3NfaW50ZXJ2YWw7CisJc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOworCXNhLnNhX2ZsYWdzID0gU0FfUkVTVEFSVDsKKwlzaWdhY3Rpb24oU0lHQUxSTSwgJnNhLCBOVUxMKTsKKworCXYuaXRfaW50ZXJ2YWwudHZfc2VjID0gMTsKKwl2Lml0X2ludGVydmFsLnR2X3VzZWMgPSAwOworCXYuaXRfdmFsdWUgPSB2Lml0X2ludGVydmFsOworCXNldGl0aW1lcihJVElNRVJfUkVBTCwgJnYsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9wcm9ncmVzc19zaWduYWwodm9pZCkKK3sKKwlzdHJ1Y3QgaXRpbWVydmFsIHYgPSB7ezAsfSx9OworCXNldGl0aW1lcihJVElNRVJfUkVBTCwgJnYsIE5VTEwpOworCXNpZ25hbChTSUdBTFJNLCBTSUdfSUdOKTsKKwlwcm9ncmVzc191cGRhdGUgPSAwOworfQorCitzdGF0aWMgaW50IGRpc3BsYXkoc3RydWN0IHByb2dyZXNzICpwcm9ncmVzcywgdW5zaWduZWQgbiwgY29uc3QgY2hhciAqZG9uZSkKK3sKKwljb25zdCBjaGFyICplb2wsICp0cDsKKworCWlmIChwcm9ncmVzcy0+ZGVsYXkpIHsKKwkJaWYgKCFwcm9ncmVzc191cGRhdGUgfHwgLS1wcm9ncmVzcy0+ZGVsYXkpCisJCQlyZXR1cm4gMDsKKwkJaWYgKHByb2dyZXNzLT50b3RhbCkgeworCQkJdW5zaWduZWQgcGVyY2VudCA9IG4gKiAxMDAgLyBwcm9ncmVzcy0+dG90YWw7CisJCQlpZiAocGVyY2VudCA+IHByb2dyZXNzLT5kZWxheWVkX3BlcmNlbnRfdHJlc2hvbGQpIHsKKwkJCQkvKiBpbmhpYml0IHRoaXMgcHJvZ3Jlc3MgcmVwb3J0IGVudGlyZWx5ICovCisJCQkJY2xlYXJfcHJvZ3Jlc3Nfc2lnbmFsKCk7CisJCQkJcHJvZ3Jlc3MtPmRlbGF5ID0gLTE7CisJCQkJcHJvZ3Jlc3MtPnRvdGFsID0gMDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKworCXByb2dyZXNzLT5sYXN0X3ZhbHVlID0gbjsKKwl0cCA9IChwcm9ncmVzcy0+dGhyb3VnaHB1dCkgPyBwcm9ncmVzcy0+dGhyb3VnaHB1dC0+ZGlzcGxheSA6ICIiOworCWVvbCA9IGRvbmUgPyBkb25lIDogIiAgIFxyIjsKKwlpZiAocHJvZ3Jlc3MtPnRvdGFsKSB7CisJCXVuc2lnbmVkIHBlcmNlbnQgPSBuICogMTAwIC8gcHJvZ3Jlc3MtPnRvdGFsOworCQlpZiAocGVyY2VudCAhPSBwcm9ncmVzcy0+bGFzdF9wZXJjZW50IHx8IHByb2dyZXNzX3VwZGF0ZSkgeworCQkJcHJvZ3Jlc3MtPmxhc3RfcGVyY2VudCA9IHBlcmNlbnQ7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAlM3UlJSAoJXUvJXUpJXMlcyIsCisJCQkJcHJvZ3Jlc3MtPnRpdGxlLCBwZXJjZW50LCBuLAorCQkJCXByb2dyZXNzLT50b3RhbCwgdHAsIGVvbCk7CisJCQlmZmx1c2goc3RkZXJyKTsKKwkJCXByb2dyZXNzX3VwZGF0ZSA9IDA7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gZWxzZSBpZiAocHJvZ3Jlc3NfdXBkYXRlKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6ICV1JXMlcyIsIHByb2dyZXNzLT50aXRsZSwgbiwgdHAsIGVvbCk7CisJCWZmbHVzaChzdGRlcnIpOworCQlwcm9ncmVzc191cGRhdGUgPSAwOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGhyb3VnaHB1dF9zdHJpbmcoc3RydWN0IHRocm91Z2hwdXQgKnRwLCBvZmZfdCB0b3RhbCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCByYXRlKQoreworCWludCBsID0gc2l6ZW9mKHRwLT5kaXNwbGF5KTsKKwlpZiAodG90YWwgPiAxIDw8IDMwKSB7CisJCWwgLT0gc25wcmludGYodHAtPmRpc3BsYXksIGwsICIsICV1LiUyLjJ1IEdpQiIsCisJCQkgICAgICAoaW50KSh0b3RhbCA+PiAzMCksCisJCQkgICAgICAoaW50KSh0b3RhbCAmICgoMSA8PCAzMCkgLSAxKSkgLyAxMDczNzQxOSk7CisJfSBlbHNlIGlmICh0b3RhbCA+IDEgPDwgMjApIHsKKwkJbCAtPSBzbnByaW50Zih0cC0+ZGlzcGxheSwgbCwgIiwgJXUuJTIuMnUgTWlCIiwKKwkJCSAgICAgIChpbnQpKHRvdGFsID4+IDIwKSwKKwkJCSAgICAgICgoaW50KSh0b3RhbCAmICgoMSA8PCAyMCkgLSAxKSkgKiAxMDApID4+IDIwKTsKKwl9IGVsc2UgaWYgKHRvdGFsID4gMSA8PCAxMCkgeworCQlsIC09IHNucHJpbnRmKHRwLT5kaXNwbGF5LCBsLCAiLCAldS4lMi4ydSBLaUIiLAorCQkJICAgICAgKGludCkodG90YWwgPj4gMTApLAorCQkJICAgICAgKChpbnQpKHRvdGFsICYgKCgxIDw8IDEwKSAtIDEpKSAqIDEwMCkgPj4gMTApOworCX0gZWxzZSB7CisJCWwgLT0gc25wcmludGYodHAtPmRpc3BsYXksIGwsICIsICV1IGJ5dGVzIiwgKGludCl0b3RhbCk7CisJfQorCWlmIChyYXRlKQorCQlzbnByaW50Zih0cC0+ZGlzcGxheSArIHNpemVvZih0cC0+ZGlzcGxheSkgLSBsLCBsLAorCQkJICIgfCAldSBLaUIvcyIsIHJhdGUpOworfQorCit2b2lkIGRpc3BsYXlfdGhyb3VnaHB1dChzdHJ1Y3QgcHJvZ3Jlc3MgKnByb2dyZXNzLCBvZmZfdCB0b3RhbCkKK3sKKwlzdHJ1Y3QgdGhyb3VnaHB1dCAqdHA7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJdW5zaWduZWQgaW50IG1pc2VjczsKKworCWlmICghcHJvZ3Jlc3MpCisJCXJldHVybjsKKwl0cCA9IHByb2dyZXNzLT50aHJvdWdocHV0OworCisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisKKwlpZiAoIXRwKSB7CisJCXByb2dyZXNzLT50aHJvdWdocHV0ID0gdHAgPSBjYWxsb2MoMSwgc2l6ZW9mKCp0cCkpOworCQlpZiAodHApIHsKKwkJCXRwLT5wcmV2X3RvdGFsID0gdHAtPmN1cnJfdG90YWwgPSB0b3RhbDsKKwkJCXRwLT5wcmV2X3R2ID0gdHY7CisJCX0KKwkJcmV0dXJuOworCX0KKwl0cC0+Y3Vycl90b3RhbCA9IHRvdGFsOworCisJLyoKKwkgKiBXZSBoYXZlIHggPSBieXRlcyBhbmQgeSA9IG1pY3Jvc2Vjcy4gIFdlIHdhbnQgeiA9IEtpQi9zOgorCSAqCisJICoJeiA9ICh4IC8gMTAyNCkgLyAoeSAvIDEwMDAwMDApCisJICoJeiA9IHggLyB5ICogMTAwMDAwMCAvIDEwMjQKKwkgKgl6ID0geCAvICh5ICogMTAyNCAvIDEwMDAwMDApCisJICoJeiA9IHggLyB5JworCSAqCisJICogVG8gc2ltcGxpZnkgdGhpbmdzIHdlJ2xsIGtlZXAgdHJhY2sgb2YgbWlzZWNzLCBvciAxMDI0dGggb2YgYSBzZWMKKwkgKiBvYnRhaW5lZCB3aXRoOgorCSAqCisJICoJeScgPSB5ICogMTAyNCAvIDEwMDAwMDAKKwkgKgl5JyA9IHkgLyAoMTAwMDAwMCAvIDEwMjQpCisJICoJeScgPSB5IC8gOTc3CisJICovCisJbWlzZWNzID0gKHR2LnR2X3NlYyAtIHRwLT5wcmV2X3R2LnR2X3NlYykgKiAxMDI0OworCW1pc2VjcyArPSAoaW50KSh0di50dl91c2VjIC0gdHAtPnByZXZfdHYudHZfdXNlYykgLyA5Nzc7CisKKwlpZiAobWlzZWNzID4gNTEyKSB7CisJCXVuc2lnbmVkIGludCBjb3VudCwgcmF0ZTsKKworCQljb3VudCA9IHRvdGFsIC0gdHAtPnByZXZfdG90YWw7CisJCXRwLT5wcmV2X3RvdGFsID0gdG90YWw7CisJCXRwLT5wcmV2X3R2ID0gdHY7CisJCXRwLT5hdmdfYnl0ZXMgKz0gY291bnQ7CisJCXRwLT5hdmdfbWlzZWNzICs9IG1pc2VjczsKKwkJcmF0ZSA9IHRwLT5hdmdfYnl0ZXMgLyB0cC0+YXZnX21pc2VjczsKKwkJdHAtPmF2Z19ieXRlcyAtPSB0cC0+bGFzdF9ieXRlc1t0cC0+aWR4XTsKKwkJdHAtPmF2Z19taXNlY3MgLT0gdHAtPmxhc3RfbWlzZWNzW3RwLT5pZHhdOworCQl0cC0+bGFzdF9ieXRlc1t0cC0+aWR4XSA9IGNvdW50OworCQl0cC0+bGFzdF9taXNlY3NbdHAtPmlkeF0gPSBtaXNlY3M7CisJCXRwLT5pZHggPSAodHAtPmlkeCArIDEpICUgVFBfSURYX01BWDsKKworCQl0aHJvdWdocHV0X3N0cmluZyh0cCwgdG90YWwsIHJhdGUpOworCQlpZiAocHJvZ3Jlc3MtPmxhc3RfdmFsdWUgIT0gLTEgJiYgcHJvZ3Jlc3NfdXBkYXRlKQorCQkJZGlzcGxheShwcm9ncmVzcywgcHJvZ3Jlc3MtPmxhc3RfdmFsdWUsIE5VTEwpOworCX0KK30KKworaW50IGRpc3BsYXlfcHJvZ3Jlc3Moc3RydWN0IHByb2dyZXNzICpwcm9ncmVzcywgdW5zaWduZWQgbikKK3sKKwlyZXR1cm4gcHJvZ3Jlc3MgPyBkaXNwbGF5KHByb2dyZXNzLCBuLCBOVUxMKSA6IDA7Cit9CisKK3N0cnVjdCBwcm9ncmVzcyAqc3RhcnRfcHJvZ3Jlc3NfZGVsYXkoY29uc3QgY2hhciAqdGl0bGUsIHVuc2lnbmVkIHRvdGFsLAorCQkJCSAgICAgICB1bnNpZ25lZCBwZXJjZW50X3RyZXNob2xkLCB1bnNpZ25lZCBkZWxheSkKK3sKKwlzdHJ1Y3QgcHJvZ3Jlc3MgKnByb2dyZXNzID0gbWFsbG9jKHNpemVvZigqcHJvZ3Jlc3MpKTsKKwlpZiAoIXByb2dyZXNzKSB7CisJCS8qIHVubGlrZWx5LCBidXQgaGVyZSdzIGEgZ29vZCBmYWxsYmFjayAqLworCQlmcHJpbnRmKHN0ZGVyciwgIiVzLi4uXG4iLCB0aXRsZSk7CisJCWZmbHVzaChzdGRlcnIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcHJvZ3Jlc3MtPnRpdGxlID0gdGl0bGU7CisJcHJvZ3Jlc3MtPnRvdGFsID0gdG90YWw7CisJcHJvZ3Jlc3MtPmxhc3RfdmFsdWUgPSAtMTsKKwlwcm9ncmVzcy0+bGFzdF9wZXJjZW50ID0gLTE7CisJcHJvZ3Jlc3MtPmRlbGF5ZWRfcGVyY2VudF90cmVzaG9sZCA9IHBlcmNlbnRfdHJlc2hvbGQ7CisJcHJvZ3Jlc3MtPmRlbGF5ID0gZGVsYXk7CisJcHJvZ3Jlc3MtPnRocm91Z2hwdXQgPSBOVUxMOworCXNldF9wcm9ncmVzc19zaWduYWwoKTsKKwlyZXR1cm4gcHJvZ3Jlc3M7Cit9CisKK3N0cnVjdCBwcm9ncmVzcyAqc3RhcnRfcHJvZ3Jlc3MoY29uc3QgY2hhciAqdGl0bGUsIHVuc2lnbmVkIHRvdGFsKQoreworCXJldHVybiBzdGFydF9wcm9ncmVzc19kZWxheSh0aXRsZSwgdG90YWwsIDAsIDApOworfQorCit2b2lkIHN0b3BfcHJvZ3Jlc3Moc3RydWN0IHByb2dyZXNzICoqcF9wcm9ncmVzcykKK3sKKwlzdG9wX3Byb2dyZXNzX21zZyhwX3Byb2dyZXNzLCAiZG9uZSIpOworfQorCit2b2lkIHN0b3BfcHJvZ3Jlc3NfbXNnKHN0cnVjdCBwcm9ncmVzcyAqKnBfcHJvZ3Jlc3MsIGNvbnN0IGNoYXIgKm1zZykKK3sKKwlzdHJ1Y3QgcHJvZ3Jlc3MgKnByb2dyZXNzID0gKnBfcHJvZ3Jlc3M7CisJaWYgKCFwcm9ncmVzcykKKwkJcmV0dXJuOworCSpwX3Byb2dyZXNzID0gTlVMTDsKKwlpZiAocHJvZ3Jlc3MtPmxhc3RfdmFsdWUgIT0gLTEpIHsKKwkJLyogRm9yY2UgdGhlIGxhc3QgdXBkYXRlICovCisJCWNoYXIgYnVmW3N0cmxlbihtc2cpICsgNV07CisJCXN0cnVjdCB0aHJvdWdocHV0ICp0cCA9IHByb2dyZXNzLT50aHJvdWdocHV0OworCQlpZiAodHApIHsKKwkJCXVuc2lnbmVkIGludCByYXRlID0gIXRwLT5hdmdfbWlzZWNzID8gMCA6CisJCQkJCXRwLT5hdmdfYnl0ZXMgLyB0cC0+YXZnX21pc2VjczsKKwkJCXRocm91Z2hwdXRfc3RyaW5nKHRwLCB0cC0+Y3Vycl90b3RhbCwgcmF0ZSk7CisJCX0KKwkJcHJvZ3Jlc3NfdXBkYXRlID0gMTsKKwkJc3ByaW50ZihidWYsICIsICVzLlxuIiwgbXNnKTsKKwkJZGlzcGxheShwcm9ncmVzcywgcHJvZ3Jlc3MtPmxhc3RfdmFsdWUsIGJ1Zik7CisJfQorCWNsZWFyX3Byb2dyZXNzX3NpZ25hbCgpOworCWZyZWUocHJvZ3Jlc3MtPnRocm91Z2hwdXQpOworCWZyZWUocHJvZ3Jlc3MpOworfQpkaWZmIC0tZ2l0IGEvcHJvZ3Jlc3MuaCBiL3Byb2dyZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjExZTRjNAotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyZXNzLmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBQUk9HUkVTU19ICisjZGVmaW5lIFBST0dSRVNTX0gKKworc3RydWN0IHByb2dyZXNzOworCit2b2lkIGRpc3BsYXlfdGhyb3VnaHB1dChzdHJ1Y3QgcHJvZ3Jlc3MgKnByb2dyZXNzLCBvZmZfdCB0b3RhbCk7CitpbnQgZGlzcGxheV9wcm9ncmVzcyhzdHJ1Y3QgcHJvZ3Jlc3MgKnByb2dyZXNzLCB1bnNpZ25lZCBuKTsKK3N0cnVjdCBwcm9ncmVzcyAqc3RhcnRfcHJvZ3Jlc3MoY29uc3QgY2hhciAqdGl0bGUsIHVuc2lnbmVkIHRvdGFsKTsKK3N0cnVjdCBwcm9ncmVzcyAqc3RhcnRfcHJvZ3Jlc3NfZGVsYXkoY29uc3QgY2hhciAqdGl0bGUsIHVuc2lnbmVkIHRvdGFsLAorCQkJCSAgICAgICB1bnNpZ25lZCBwZXJjZW50X3RyZXNob2xkLCB1bnNpZ25lZCBkZWxheSk7Cit2b2lkIHN0b3BfcHJvZ3Jlc3Moc3RydWN0IHByb2dyZXNzICoqcHJvZ3Jlc3MpOwordm9pZCBzdG9wX3Byb2dyZXNzX21zZyhzdHJ1Y3QgcHJvZ3Jlc3MgKipwcm9ncmVzcywgY29uc3QgY2hhciAqbXNnKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9xdW90ZS5jIGIvcXVvdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWNmOWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcXVvdGUuYwpAQCAtMCwwICsxLDQ0NSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKworLyogSGVscCB0byBjb3B5IHRoZSB0aGluZyBwcm9wZXJseSBxdW90ZWQgZm9yIHRoZSBzaGVsbCBzYWZldHkuCisgKiBhbnkgc2luZ2xlIHF1b3RlIGlzIHJlcGxhY2VkIHdpdGggJ1wnJywgYW55IGV4Y2xhbWF0aW9uIHBvaW50CisgKiBpcyByZXBsYWNlZCB3aXRoICdcIScsIGFuZCB0aGUgd2hvbGUgdGhpbmcgaXMgZW5jbG9zZWQgaW4gYQorICoKKyAqIEUuZy4KKyAqICBvcmlnaW5hbCAgICAgc3FfcXVvdGUgICAgIHJlc3VsdAorICogIG5hbWUgICAgID09PiBuYW1lICAgICAgPT0+ICduYW1lJworICogIGEgYiAgICAgID09PiBhIGIgICAgICAgPT0+ICdhIGInCisgKiAgYSdiICAgICAgPT0+IGEnXCcnYiAgICA9PT4gJ2EnXCcnYicKKyAqICBhIWIgICAgICA9PT4gYSdcISdiICAgID09PiAnYSdcISdiJworICovCitzdGF0aWMgaW5saW5lIGludCBuZWVkX2JzX3F1b3RlKGNoYXIgYykKK3sKKwlyZXR1cm4gKGMgPT0gJ1wnJyB8fCBjID09ICchJyk7Cit9CisKK3ZvaWQgc3FfcXVvdGVfYnVmKHN0cnVjdCBzdHJidWYgKmRzdCwgY29uc3QgY2hhciAqc3JjKQoreworCWNoYXIgKnRvX2ZyZWUgPSBOVUxMOworCisJaWYgKGRzdC0+YnVmID09IHNyYykKKwkJdG9fZnJlZSA9IHN0cmJ1Zl9kZXRhY2goZHN0LCBOVUxMKTsKKworCXN0cmJ1Zl9hZGRjaChkc3QsICdcJycpOworCXdoaWxlICgqc3JjKSB7CisJCXNpemVfdCBsZW4gPSBzdHJjc3BuKHNyYywgIichIik7CisJCXN0cmJ1Zl9hZGQoZHN0LCBzcmMsIGxlbik7CisJCXNyYyArPSBsZW47CisJCXdoaWxlIChuZWVkX2JzX3F1b3RlKCpzcmMpKSB7CisJCQlzdHJidWZfYWRkc3RyKGRzdCwgIidcXCIpOworCQkJc3RyYnVmX2FkZGNoKGRzdCwgKnNyYysrKTsKKwkJCXN0cmJ1Zl9hZGRjaChkc3QsICdcJycpOworCQl9CisJfQorCXN0cmJ1Zl9hZGRjaChkc3QsICdcJycpOworCWZyZWUodG9fZnJlZSk7Cit9CisKK3ZvaWQgc3FfcXVvdGVfcHJpbnQoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpzcmMpCit7CisJY2hhciBjOworCisJZnB1dGMoJ1wnJywgc3RyZWFtKTsKKwl3aGlsZSAoKGMgPSAqc3JjKyspKSB7CisJCWlmIChuZWVkX2JzX3F1b3RlKGMpKSB7CisJCQlmcHV0cygiJ1xcIiwgc3RyZWFtKTsKKwkJCWZwdXRjKGMsIHN0cmVhbSk7CisJCQlmcHV0YygnXCcnLCBzdHJlYW0pOworCQl9IGVsc2UgeworCQkJZnB1dGMoYywgc3RyZWFtKTsKKwkJfQorCX0KKwlmcHV0YygnXCcnLCBzdHJlYW0pOworfQorCit2b2lkIHNxX3F1b3RlX2FyZ3Yoc3RydWN0IHN0cmJ1ZiAqZHN0LCBjb25zdCBjaGFyKiogYXJndiwgc2l6ZV90IG1heGxlbikKK3sKKwlpbnQgaTsKKworCS8qIENvcHkgaW50byBkZXN0aW5hdGlvbiBidWZmZXIuICovCisJc3RyYnVmX2dyb3coZHN0LCAyNTUpOworCWZvciAoaSA9IDA7IGFyZ3ZbaV07ICsraSkgeworCQlzdHJidWZfYWRkY2goZHN0LCAnICcpOworCQlzcV9xdW90ZV9idWYoZHN0LCBhcmd2W2ldKTsKKwkJaWYgKG1heGxlbiAmJiBkc3QtPmxlbiA+IG1heGxlbikKKwkJCWRpZSgiVG9vIG1hbnkgb3IgbG9uZyBhcmd1bWVudHMiKTsKKwl9Cit9CisKK2NoYXIgKnNxX2RlcXVvdGUoY2hhciAqYXJnKQoreworCWNoYXIgKmRzdCA9IGFyZzsKKwljaGFyICpzcmMgPSBhcmc7CisJY2hhciBjOworCisJaWYgKCpzcmMgIT0gJ1wnJykKKwkJcmV0dXJuIE5VTEw7CisJZm9yICg7OykgeworCQljID0gKisrc3JjOworCQlpZiAoIWMpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKGMgIT0gJ1wnJykgeworCQkJKmRzdCsrID0gYzsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIFdlIHN0ZXBwZWQgb3V0IG9mIHNxICovCisJCXN3aXRjaCAoKisrc3JjKSB7CisJCWNhc2UgJ1wwJzoKKwkJCSpkc3QgPSAwOworCQkJcmV0dXJuIGFyZzsKKwkJY2FzZSAnXFwnOgorCQkJYyA9ICorK3NyYzsKKwkJCWlmIChuZWVkX2JzX3F1b3RlKGMpICYmICorK3NyYyA9PSAnXCcnKSB7CisJCQkJKmRzdCsrID0gYzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJLyogRmFsbHRocm91Z2ggKi8KKwkJZGVmYXVsdDoKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorfQorCisvKiAxIG1lYW5zOiBxdW90ZSBhcyBvY3RhbAorICogMCBtZWFuczogcXVvdGUgYXMgb2N0YWwgaWYgKHF1b3RlX3BhdGhfZnVsbHkpCisgKiAtMSBtZWFuczogbmV2ZXIgcXVvdGUKKyAqIGM6IHF1b3RlIGFzICJcXGMiCisgKi8KKyNkZWZpbmUgWDgoeCkgICB4LCB4LCB4LCB4LCB4LCB4LCB4LCB4CisjZGVmaW5lIFgxNih4KSAgWDgoeCksIFg4KHgpCitzdGF0aWMgc2lnbmVkIGNoYXIgY29uc3Qgc3FfbG9va3VwWzI1Nl0gPSB7CisJLyogICAgICAgICAgIDAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAqLworCS8qIDB4MDAgKi8gICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAnYScsCisJLyogMHgwOCAqLyAnYicsICd0JywgJ24nLCAndicsICdmJywgJ3InLCAgIDEsICAgMSwKKwkvKiAweDEwICovIFgxNigxKSwKKwkvKiAweDIwICovICAtMSwgIC0xLCAnIicsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLAorCS8qIDB4MjggKi8gWDE2KC0xKSwgWDE2KC0xKSwgWDE2KC0xKSwKKwkvKiAweDU4ICovICAtMSwgIC0xLCAgLTEsICAtMSwnXFwnLCAgLTEsICAtMSwgIC0xLAorCS8qIDB4NjAgKi8gWDE2KC0xKSwgWDgoLTEpLAorCS8qIDB4NzggKi8gIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgIDEsCisJLyogMHg4MCAqLyAvKiBzZXQgdG8gMCAqLworfTsKKworc3RhdGljIGlubGluZSBpbnQgc3FfbXVzdF9xdW90ZShjaGFyIGMpCit7CisJcmV0dXJuIHNxX2xvb2t1cFsodW5zaWduZWQgY2hhciljXSArIHF1b3RlX3BhdGhfZnVsbHkgPiAwOworfQorCisvKiByZXR1cm5zIHRoZSBsb25nZXN0IHByZWZpeCBub3QgbmVlZGluZyBhIHF1b3RlIHVwIHRvIG1heGxlbiBpZiBwb3NpdGl2ZS4KKyAgIFRoaXMgc3RvcHMgYXQgdGhlIGZpcnN0IFwwIGJlY2F1c2UgaXQncyBtYXJrZWQgYXMgYSBjaGFyYWN0ZXIgbmVlZGluZyBhbgorICAgZXNjYXBlICovCitzdGF0aWMgc2l6ZV90IG5leHRfcXVvdGVfcG9zKGNvbnN0IGNoYXIgKnMsIHNzaXplX3QgbWF4bGVuKQoreworCXNpemVfdCBsZW47CisJaWYgKG1heGxlbiA8IDApIHsKKwkJZm9yIChsZW4gPSAwOyAhc3FfbXVzdF9xdW90ZShzW2xlbl0pOyBsZW4rKyk7CisJfSBlbHNlIHsKKwkJZm9yIChsZW4gPSAwOyBsZW4gPCBtYXhsZW4gJiYgIXNxX211c3RfcXVvdGUoc1tsZW5dKTsgbGVuKyspOworCX0KKwlyZXR1cm4gbGVuOworfQorCisvKgorICogQy1zdHlsZSBuYW1lIHF1b3RpbmcuCisgKgorICogKDEpIGlmIHNiIGFuZCBmcCBhcmUgYm90aCBOVUxMLCBpbnNwZWN0IHRoZSBpbnB1dCBuYW1lIGFuZCBjb3VudHMgdGhlCisgKiAgICAgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYXJlIG5lZWRlZCB0byBob2xkIGNfc3R5bGUgcXVvdGVkIHZlcnNpb24gb2YgbmFtZSwKKyAqICAgICBjb3VudGluZyB0aGUgZG91YmxlIHF1b3RlcyBhcm91bmQgaXQgYnV0IG5vdCB0ZXJtaW5hdGluZyBOVUwsIGFuZAorICogICAgIHJldHVybnMgaXQuCisgKiAgICAgSG93ZXZlciwgaWYgbmFtZSBkb2VzIG5vdCBuZWVkIGNfc3R5bGUgcXVvdGluZywgaXQgcmV0dXJucyAwLgorICoKKyAqICgyKSBpZiBzYiBvciBmcCBhcmUgbm90IE5VTEwsIGl0IGVtaXRzIHRoZSBjX3N0eWxlIHF1b3RlZCB2ZXJzaW9uCisgKiAgICAgb2YgbmFtZSwgZW5jbG9zZWQgd2l0aCBkb3VibGUgcXVvdGVzIGlmIGFza2VkIGFuZCBuZWVkZWQgb25seS4KKyAqICAgICBSZXR1cm4gdmFsdWUgaXMgdGhlIHNhbWUgYXMgaW4gKDEpLgorICovCitzdGF0aWMgc2l6ZV90IHF1b3RlX2Nfc3R5bGVfY291bnRlZChjb25zdCBjaGFyICpuYW1lLCBzc2l6ZV90IG1heGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzdHJidWYgKnNiLCBGSUxFICpmcCwgaW50IG5vX2RxKQoreworI3VuZGVmIEVNSVQKKyNkZWZpbmUgRU1JVChjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKHNiKSBzdHJidWZfYWRkY2goc2IsIChjKSk7ICAgICAgICAgIFwKKwkJaWYgKGZwKSBmcHV0YygoYyksIGZwKTsgICAgICAgICAgICAgICAgIFwKKwkJY291bnQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBFTUlUQlVGKHMsIGwpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoc2IpIHN0cmJ1Zl9hZGQoc2IsIChzKSwgKGwpKTsgICAgICAgXAorCQlpZiAoZnApIGZ3cml0ZSgocyksIChsKSwgMSwgZnApOyAgICAgICAgXAorCQljb3VudCArPSAobCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gd2hpbGUgKDApCisKKwlzaXplX3QgbGVuLCBjb3VudCA9IDA7CisJY29uc3QgY2hhciAqcCA9IG5hbWU7CisKKwlmb3IgKDs7KSB7CisJCWludCBjaDsKKworCQlsZW4gPSBuZXh0X3F1b3RlX3BvcyhwLCBtYXhsZW4pOworCQlpZiAobGVuID09IG1heGxlbiB8fCAhcFtsZW5dKQorCQkJYnJlYWs7CisKKwkJaWYgKCFub19kcSAmJiBwID09IG5hbWUpCisJCQlFTUlUKCciJyk7CisKKwkJRU1JVEJVRihwLCBsZW4pOworCQlFTUlUKCdcXCcpOworCQlwICs9IGxlbjsKKwkJY2ggPSAodW5zaWduZWQgY2hhcikqcCsrOworCQlpZiAoc3FfbG9va3VwW2NoXSA+PSAnICcpIHsKKwkJCUVNSVQoc3FfbG9va3VwW2NoXSk7CisJCX0gZWxzZSB7CisJCQlFTUlUKCgoY2ggPj4gNikgJiAwMykgKyAnMCcpOworCQkJRU1JVCgoKGNoID4+IDMpICYgMDcpICsgJzAnKTsKKwkJCUVNSVQoKChjaCA+PiAwKSAmIDA3KSArICcwJyk7CisJCX0KKwl9CisKKwlFTUlUQlVGKHAsIGxlbik7CisJaWYgKHAgPT0gbmFtZSkgICAvKiBubyBlbmRpbmcgcXVvdGUgbmVlZGVkICovCisJCXJldHVybiAwOworCisJaWYgKCFub19kcSkKKwkJRU1JVCgnIicpOworCXJldHVybiBjb3VudDsKK30KKworc2l6ZV90IHF1b3RlX2Nfc3R5bGUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHN0cmJ1ZiAqc2IsIEZJTEUgKmZwLCBpbnQgbm9kcSkKK3sKKwlyZXR1cm4gcXVvdGVfY19zdHlsZV9jb3VudGVkKG5hbWUsIC0xLCBzYiwgZnAsIG5vZHEpOworfQorCit2b2lkIHF1b3RlX3R3b19jX3N0eWxlKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKnBhdGgsIGludCBub2RxKQoreworCWlmIChxdW90ZV9jX3N0eWxlKHByZWZpeCwgTlVMTCwgTlVMTCwgMCkgfHwKKwkgICAgcXVvdGVfY19zdHlsZShwYXRoLCBOVUxMLCBOVUxMLCAwKSkgeworCQlpZiAoIW5vZHEpCisJCQlzdHJidWZfYWRkY2goc2IsICciJyk7CisJCXF1b3RlX2Nfc3R5bGUocHJlZml4LCBzYiwgTlVMTCwgMSk7CisJCXF1b3RlX2Nfc3R5bGUocGF0aCwgc2IsIE5VTEwsIDEpOworCQlpZiAoIW5vZHEpCisJCQlzdHJidWZfYWRkY2goc2IsICciJyk7CisJfSBlbHNlIHsKKwkJc3RyYnVmX2FkZHN0cihzYiwgcHJlZml4KTsKKwkJc3RyYnVmX2FkZHN0cihzYiwgcGF0aCk7CisJfQorfQorCit2b2lkIHdyaXRlX25hbWVfcXVvdGVkKGNvbnN0IGNoYXIgKm5hbWUsIEZJTEUgKmZwLCBpbnQgdGVybWluYXRvcikKK3sKKwlpZiAodGVybWluYXRvcikgeworCQlxdW90ZV9jX3N0eWxlKG5hbWUsIE5VTEwsIGZwLCAwKTsKKwl9IGVsc2UgeworCQlmcHV0cyhuYW1lLCBmcCk7CisJfQorCWZwdXRjKHRlcm1pbmF0b3IsIGZwKTsKK30KKworZXh0ZXJuIHZvaWQgd3JpdGVfbmFtZV9xdW90ZWRwZngoY29uc3QgY2hhciAqcGZ4LCBzaXplX3QgcGZ4bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgRklMRSAqZnAsIGludCB0ZXJtaW5hdG9yKQoreworCWludCBuZWVkcXVvdGUgPSAwOworCisJaWYgKHRlcm1pbmF0b3IpIHsKKwkJbmVlZHF1b3RlID0gbmV4dF9xdW90ZV9wb3MocGZ4LCBwZnhsZW4pIDwgcGZ4bGVuCisJCQl8fCBuYW1lW25leHRfcXVvdGVfcG9zKG5hbWUsIC0xKV07CisJfQorCWlmIChuZWVkcXVvdGUpIHsKKwkJZnB1dGMoJyInLCBmcCk7CisJCXF1b3RlX2Nfc3R5bGVfY291bnRlZChwZngsIHBmeGxlbiwgTlVMTCwgZnAsIDEpOworCQlxdW90ZV9jX3N0eWxlKG5hbWUsIE5VTEwsIGZwLCAxKTsKKwkJZnB1dGMoJyInLCBmcCk7CisJfSBlbHNlIHsKKwkJZndyaXRlKHBmeCwgcGZ4bGVuLCAxLCBmcCk7CisJCWZwdXRzKG5hbWUsIGZwKTsKKwl9CisJZnB1dGModGVybWluYXRvciwgZnApOworfQorCisvKiBxdW90ZSBwYXRoIGFzIHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBwcmVmaXggKi8KK2NoYXIgKnF1b3RlX3BhdGhfcmVsYXRpdmUoY29uc3QgY2hhciAqaW4sIGludCBsZW4sCisJCQkgIHN0cnVjdCBzdHJidWYgKm91dCwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBuZWVkcXVvdGU7CisKKwlpZiAobGVuIDwgMCkKKwkJbGVuID0gc3RybGVuKGluKTsKKworCS8qICIuLi8iIHByZWZpeCBpdHNlbGYgZG9lcyBub3QgbmVlZCBxdW90aW5nLCBidXQgImluIiBtaWdodC4gKi8KKwluZWVkcXVvdGUgPSBuZXh0X3F1b3RlX3BvcyhpbiwgbGVuKSA8IGxlbjsKKwlzdHJidWZfc2V0bGVuKG91dCwgMCk7CisJc3RyYnVmX2dyb3cob3V0LCBsZW4pOworCisJaWYgKG5lZWRxdW90ZSkKKwkJc3RyYnVmX2FkZGNoKG91dCwgJyInKTsKKwlpZiAocHJlZml4KSB7CisJCWludCBvZmYgPSAwOworCQl3aGlsZSAocHJlZml4W29mZl0gJiYgb2ZmIDwgbGVuICYmIHByZWZpeFtvZmZdID09IGluW29mZl0pCisJCQlpZiAocHJlZml4W29mZl0gPT0gJy8nKSB7CisJCQkJcHJlZml4ICs9IG9mZiArIDE7CisJCQkJaW4gKz0gb2ZmICsgMTsKKwkJCQlsZW4gLT0gb2ZmICsgMTsKKwkJCQlvZmYgPSAwOworCQkJfSBlbHNlCisJCQkJb2ZmKys7CisKKwkJZm9yICg7ICpwcmVmaXg7IHByZWZpeCsrKQorCQkJaWYgKCpwcmVmaXggPT0gJy8nKQorCQkJCXN0cmJ1Zl9hZGRzdHIob3V0LCAiLi4vIik7CisJfQorCisJcXVvdGVfY19zdHlsZV9jb3VudGVkIChpbiwgbGVuLCBvdXQsIE5VTEwsIDEpOworCisJaWYgKG5lZWRxdW90ZSkKKwkJc3RyYnVmX2FkZGNoKG91dCwgJyInKTsKKwlpZiAoIW91dC0+bGVuKQorCQlzdHJidWZfYWRkc3RyKG91dCwgIi4vIik7CisKKwlyZXR1cm4gb3V0LT5idWY7Cit9CisKKy8qCisgKiBDLXN0eWxlIG5hbWUgdW5xdW90aW5nLgorICoKKyAqIFF1b3RlZCBzaG91bGQgcG9pbnQgYXQgdGhlIG9wZW5pbmcgZG91YmxlIHF1b3RlLgorICogKyBSZXR1cm5zIDAgaWYgaXQgd2FzIGFibGUgdG8gdW5xdW90ZSB0aGUgc3RyaW5nIHByb3Blcmx5LCBhbmQgYXBwZW5kcyB0aGUKKyAqICAgcmVzdWx0IGluIHRoZSBzdHJidWYgYHNiJy4KKyAqICsgUmV0dXJucyAtMSBpbiBjYXNlIG9mIGVycm9yLCBhbmQgZG9lc24ndCB0b3VjaCB0aGUgc3RyYnVmLiBUaG91Z2ggbm90ZQorICogICB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZSBtZW1vcnkgaW4gdGhlIHN0cmJ1Ziwgc28gY2FsbGluZworICogICBzdHJidWZfcmVsZWFzZSBpcyBtYW5kYXRvcnkgd2hpY2hldmVyIHJlc3VsdCB1bnF1b3RlX2Nfc3R5bGUgcmV0dXJucy4KKyAqCisgKiBVcGRhdGVzIGVuZHAgcG9pbnRlciB0byBwb2ludCBhdCBvbmUgcGFzdCB0aGUgZW5kaW5nIGRvdWJsZSBxdW90ZSBpZiBnaXZlbi4KKyAqLworaW50IHVucXVvdGVfY19zdHlsZShzdHJ1Y3Qgc3RyYnVmICpzYiwgY29uc3QgY2hhciAqcXVvdGVkLCBjb25zdCBjaGFyICoqZW5kcCkKK3sKKwlzaXplX3Qgb2xkbGVuID0gc2ItPmxlbiwgbGVuOworCWludCBjaCwgYWM7CisKKwlpZiAoKnF1b3RlZCsrICE9ICciJykKKwkJcmV0dXJuIC0xOworCisJZm9yICg7OykgeworCQlsZW4gPSBzdHJjc3BuKHF1b3RlZCwgIlwiXFwiKTsKKwkJc3RyYnVmX2FkZChzYiwgcXVvdGVkLCBsZW4pOworCQlxdW90ZWQgKz0gbGVuOworCisJCXN3aXRjaCAoKnF1b3RlZCsrKSB7CisJCSAgY2FzZSAnIic6CisJCQlpZiAoZW5kcCkKKwkJCQkqZW5kcCA9IHF1b3RlZDsKKwkJCXJldHVybiAwOworCQkgIGNhc2UgJ1xcJzoKKwkJCWJyZWFrOworCQkgIGRlZmF1bHQ6CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJc3dpdGNoICgoY2ggPSAqcXVvdGVkKyspKSB7CisJCWNhc2UgJ2EnOiBjaCA9ICdcYSc7IGJyZWFrOworCQljYXNlICdiJzogY2ggPSAnXGInOyBicmVhazsKKwkJY2FzZSAnZic6IGNoID0gJ1xmJzsgYnJlYWs7CisJCWNhc2UgJ24nOiBjaCA9ICdcbic7IGJyZWFrOworCQljYXNlICdyJzogY2ggPSAnXHInOyBicmVhazsKKwkJY2FzZSAndCc6IGNoID0gJ1x0JzsgYnJlYWs7CisJCWNhc2UgJ3YnOiBjaCA9ICdcdic7IGJyZWFrOworCisJCWNhc2UgJ1xcJzogY2FzZSAnIic6CisJCQlicmVhazsgLyogdmVyYmF0aW0gKi8KKworCQkvKiBvY3RhbCB2YWx1ZXMgd2l0aCBmaXJzdCBkaWdpdCBvdmVyIDQgb3ZlcmZsb3cgKi8KKwkJY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6CisJCQkJCWFjID0gKChjaCAtICcwJykgPDwgNik7CisJCQlpZiAoKGNoID0gKnF1b3RlZCsrKSA8ICcwJyB8fCAnNycgPCBjaCkKKwkJCQlnb3RvIGVycm9yOworCQkJCQlhYyB8PSAoKGNoIC0gJzAnKSA8PCAzKTsKKwkJCWlmICgoY2ggPSAqcXVvdGVkKyspIDwgJzAnIHx8ICc3JyA8IGNoKQorCQkJCWdvdG8gZXJyb3I7CisJCQkJCWFjIHw9IChjaCAtICcwJyk7CisJCQkJCWNoID0gYWM7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQlnb3RvIGVycm9yOworCQkJfQorCQlzdHJidWZfYWRkY2goc2IsIGNoKTsKKwkJfQorCisgIGVycm9yOgorCXN0cmJ1Zl9zZXRsZW4oc2IsIG9sZGxlbik7CisJcmV0dXJuIC0xOworfQorCisvKiBxdW90aW5nIGFzIGEgc3RyaW5nIGxpdGVyYWwgZm9yIG90aGVyIGxhbmd1YWdlcyAqLworCit2b2lkIHBlcmxfcXVvdGVfcHJpbnQoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpzcmMpCit7CisJY29uc3QgY2hhciBzcSA9ICdcJyc7CisJY29uc3QgY2hhciBicSA9ICdcXCc7CisJY2hhciBjOworCisJZnB1dGMoc3EsIHN0cmVhbSk7CisJd2hpbGUgKChjID0gKnNyYysrKSkgeworCQlpZiAoYyA9PSBzcSB8fCBjID09IGJxKQorCQkJZnB1dGMoYnEsIHN0cmVhbSk7CisJCWZwdXRjKGMsIHN0cmVhbSk7CisJfQorCWZwdXRjKHNxLCBzdHJlYW0pOworfQorCit2b2lkIHB5dGhvbl9xdW90ZV9wcmludChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKnNyYykKK3sKKwljb25zdCBjaGFyIHNxID0gJ1wnJzsKKwljb25zdCBjaGFyIGJxID0gJ1xcJzsKKwljb25zdCBjaGFyIG5sID0gJ1xuJzsKKwljaGFyIGM7CisKKwlmcHV0YyhzcSwgc3RyZWFtKTsKKwl3aGlsZSAoKGMgPSAqc3JjKyspKSB7CisJCWlmIChjID09IG5sKSB7CisJCQlmcHV0YyhicSwgc3RyZWFtKTsKKwkJCWZwdXRjKCduJywgc3RyZWFtKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID09IHNxIHx8IGMgPT0gYnEpCisJCQlmcHV0YyhicSwgc3RyZWFtKTsKKwkJZnB1dGMoYywgc3RyZWFtKTsKKwl9CisJZnB1dGMoc3EsIHN0cmVhbSk7Cit9CisKK3ZvaWQgdGNsX3F1b3RlX3ByaW50KEZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqc3JjKQoreworCWNoYXIgYzsKKworCWZwdXRjKCciJywgc3RyZWFtKTsKKwl3aGlsZSAoKGMgPSAqc3JjKyspKSB7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdbJzogY2FzZSAnXSc6CisJCWNhc2UgJ3snOiBjYXNlICd9JzoKKwkJY2FzZSAnJCc6IGNhc2UgJ1xcJzogY2FzZSAnIic6CisJCQlmcHV0YygnXFwnLCBzdHJlYW0pOworCQlkZWZhdWx0OgorCQkJZnB1dGMoYywgc3RyZWFtKTsKKwkJCWJyZWFrOworCQljYXNlICdcZic6CisJCQlmcHV0cygiXFxmIiwgc3RyZWFtKTsKKwkJCWJyZWFrOworCQljYXNlICdccic6CisJCQlmcHV0cygiXFxyIiwgc3RyZWFtKTsKKwkJCWJyZWFrOworCQljYXNlICdcbic6CisJCQlmcHV0cygiXFxuIiwgc3RyZWFtKTsKKwkJCWJyZWFrOworCQljYXNlICdcdCc6CisJCQlmcHV0cygiXFx0Iiwgc3RyZWFtKTsKKwkJCWJyZWFrOworCQljYXNlICdcdic6CisJCQlmcHV0cygiXFx2Iiwgc3RyZWFtKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWZwdXRjKCciJywgc3RyZWFtKTsKK30KZGlmZiAtLWdpdCBhL3F1b3RlLmggYi9xdW90ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZWVhNmYKLS0tIC9kZXYvbnVsbAorKysgYi9xdW90ZS5oCkBAIC0wLDAgKzEsNTkgQEAKKyNpZm5kZWYgUVVPVEVfSAorI2RlZmluZSBRVU9URV9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKiBIZWxwIHRvIGNvcHkgdGhlIHRoaW5nIHByb3Blcmx5IHF1b3RlZCBmb3IgdGhlIHNoZWxsIHNhZmV0eS4KKyAqIGFueSBzaW5nbGUgcXVvdGUgaXMgcmVwbGFjZWQgd2l0aCAnXCcnLCBhbnkgZXhjbGFtYXRpb24gcG9pbnQKKyAqIGlzIHJlcGxhY2VkIHdpdGggJ1whJywgYW5kIHRoZSB3aG9sZSB0aGluZyBpcyBlbmNsb3NlZCBpbiBhCisgKiBzaW5nbGUgcXVvdGUgcGFpci4KKyAqCisgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBwYXNzaW5nIHRoZSByZXN1bHQgdG8gc3lzdGVtKCkgYXMgYW4KKyAqIGFyZ3VtZW50OgorICoKKyAqIHNwcmludGYoY21kLCAiZm9vYmFyICVzICVzIiwgc3FfcXVvdGUoYXJnMCksIHNxX3F1b3RlKGFyZzEpKQorICoKKyAqIHdvdWxkIGJlIGFwcHJvcHJpYXRlLiAgSWYgdGhlIHN5c3RlbSgpIGlzIGdvaW5nIHRvIGNhbGwgc3NoIHRvCisgKiBydW4gdGhlIGNvbW1hbmQgb24gdGhlIG90aGVyIHNpZGU6CisgKgorICogc3ByaW50ZihjbWQsICJnaXQtZGlmZi10cmVlICVzICVzIiwgc3FfcXVvdGUoYXJnMCksIHNxX3F1b3RlKGFyZzEpKTsKKyAqIHNwcmludGYocmNtZCwgInNzaCAlcyAlcyIsIHNxX3F1b3RlKGhvc3QpLCBzcV9xdW90ZShjbWQpKTsKKyAqCisgKiBOb3RlIHRoYXQgdGhlIGFib3ZlIGV4YW1wbGVzIGxlYWsgbWVtb3J5ISAgUmVtZW1iZXIgdG8gZnJlZSByZXN1bHQgZnJvbQorICogc3FfcXVvdGUoKSBpbiBhIHJlYWwgYXBwbGljYXRpb24uCisgKgorICogc3FfcXVvdGVfYnVmKCkgd3JpdGVzIHRvIGFuIGV4aXN0aW5nIGJ1ZmZlciBvZiBzcGVjaWZpZWQgc2l6ZTsgaXQKKyAqIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGhhdmUgYmVlbiB3cml0dGVuCisgKiBleGNsdWRpbmcgdGhlIGZpbmFsIG51bGwgcmVnYXJkbGVzcyBvZiB0aGUgYnVmZmVyIHNpemUuCisgKi8KKworZXh0ZXJuIHZvaWQgc3FfcXVvdGVfcHJpbnQoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpzcmMpOworCitleHRlcm4gdm9pZCBzcV9xdW90ZV9idWYoc3RydWN0IHN0cmJ1ZiAqLCBjb25zdCBjaGFyICpzcmMpOworZXh0ZXJuIHZvaWQgc3FfcXVvdGVfYXJndihzdHJ1Y3Qgc3RyYnVmICosIGNvbnN0IGNoYXIgKiphcmd2LCBzaXplX3QgbWF4bGVuKTsKKworLyogVGhpcyB1bndyYXBzIHdoYXQgc3FfcXVvdGUoKSBwcm9kdWNlcyBpbiBwbGFjZSwgYnV0IHJldHVybnMKKyAqIE5VTEwgaWYgdGhlIGlucHV0IGRvZXMgbm90IGxvb2sgbGlrZSB3aGF0IHNxX3F1b3RlIHdvdWxkIGhhdmUKKyAqIHByb2R1Y2VkLgorICovCitleHRlcm4gY2hhciAqc3FfZGVxdW90ZShjaGFyICopOworCitleHRlcm4gaW50IHVucXVvdGVfY19zdHlsZShzdHJ1Y3Qgc3RyYnVmICosIGNvbnN0IGNoYXIgKnF1b3RlZCwgY29uc3QgY2hhciAqKmVuZHApOworZXh0ZXJuIHNpemVfdCBxdW90ZV9jX3N0eWxlKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzdHJidWYgKiwgRklMRSAqLCBpbnQgbm9fZHEpOworZXh0ZXJuIHZvaWQgcXVvdGVfdHdvX2Nfc3R5bGUoc3RydWN0IHN0cmJ1ZiAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKworZXh0ZXJuIHZvaWQgd3JpdGVfbmFtZV9xdW90ZWQoY29uc3QgY2hhciAqbmFtZSwgRklMRSAqLCBpbnQgdGVybWluYXRvcik7CitleHRlcm4gdm9pZCB3cml0ZV9uYW1lX3F1b3RlZHBmeChjb25zdCBjaGFyICpwZngsIHNpemVfdCBwZnhsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBGSUxFICosIGludCB0ZXJtaW5hdG9yKTsKKworLyogcXVvdGUgcGF0aCBhcyByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gcHJlZml4ICovCitjaGFyICpxdW90ZV9wYXRoX3JlbGF0aXZlKGNvbnN0IGNoYXIgKmluLCBpbnQgbGVuLAorCQkJICBzdHJ1Y3Qgc3RyYnVmICpvdXQsIGNvbnN0IGNoYXIgKnByZWZpeCk7CisKKy8qIHF1b3RpbmcgYXMgYSBzdHJpbmcgbGl0ZXJhbCBmb3Igb3RoZXIgbGFuZ3VhZ2VzICovCitleHRlcm4gdm9pZCBwZXJsX3F1b3RlX3ByaW50KEZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqc3JjKTsKK2V4dGVybiB2b2lkIHB5dGhvbl9xdW90ZV9wcmludChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKnNyYyk7CitleHRlcm4gdm9pZCB0Y2xfcXVvdGVfcHJpbnQoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpzcmMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3JlYWNoYWJsZS5jIGIvcmVhY2hhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxYzE4ZgotLS0gL2Rldi9udWxsCisrKyBiL3JlYWNoYWJsZS5jCkBAIC0wLDAgKzEsMjI3IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorI2luY2x1ZGUgInJlYWNoYWJsZS5oIgorI2luY2x1ZGUgImNhY2hlLXRyZWUuaCIKKworc3RhdGljIHZvaWQgcHJvY2Vzc19ibG9iKHN0cnVjdCBibG9iICpibG9iLAorCQkJIHN0cnVjdCBvYmplY3RfYXJyYXkgKnAsCisJCQkgc3RydWN0IG5hbWVfcGF0aCAqcGF0aCwKKwkJCSBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBvYmplY3QgKm9iaiA9ICZibG9iLT5vYmplY3Q7CisKKwlpZiAoIWJsb2IpCisJCWRpZSgiYmFkIGJsb2Igb2JqZWN0Iik7CisJaWYgKG9iai0+ZmxhZ3MgJiBTRUVOKQorCQlyZXR1cm47CisJb2JqLT5mbGFncyB8PSBTRUVOOworCS8qIE5vdGhpbmcgdG8gZG8sIHJlYWxseSAuLiBUaGUgYmxvYiBsb29rdXAgd2FzIHRoZSBpbXBvcnRhbnQgcGFydCAqLworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX2dpdGxpbmsoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCSAgICBzdHJ1Y3Qgb2JqZWN0X2FycmF5ICpwLAorCQkJICAgIHN0cnVjdCBuYW1lX3BhdGggKnBhdGgsCisJCQkgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKwkvKiBJIGRvbid0IHRoaW5rIHdlIHdhbnQgdG8gcmVjdXJzZSBpbnRvIHRoaXMsIHJlYWxseS4gKi8KK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc190cmVlKHN0cnVjdCB0cmVlICp0cmVlLAorCQkJIHN0cnVjdCBvYmplY3RfYXJyYXkgKnAsCisJCQkgc3RydWN0IG5hbWVfcGF0aCAqcGF0aCwKKwkJCSBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBvYmplY3QgKm9iaiA9ICZ0cmVlLT5vYmplY3Q7CisJc3RydWN0IHRyZWVfZGVzYyBkZXNjOworCXN0cnVjdCBuYW1lX2VudHJ5IGVudHJ5OworCXN0cnVjdCBuYW1lX3BhdGggbWU7CisKKwlpZiAoIXRyZWUpCisJCWRpZSgiYmFkIHRyZWUgb2JqZWN0Iik7CisJaWYgKG9iai0+ZmxhZ3MgJiBTRUVOKQorCQlyZXR1cm47CisJb2JqLT5mbGFncyB8PSBTRUVOOworCWlmIChwYXJzZV90cmVlKHRyZWUpIDwgMCkKKwkJZGllKCJiYWQgdHJlZSBvYmplY3QgJXMiLCBzaGExX3RvX2hleChvYmotPnNoYTEpKTsKKwluYW1lID0geHN0cmR1cChuYW1lKTsKKwlhZGRfb2JqZWN0KG9iaiwgcCwgcGF0aCwgbmFtZSk7CisJbWUudXAgPSBwYXRoOworCW1lLmVsZW0gPSBuYW1lOworCW1lLmVsZW1fbGVuID0gc3RybGVuKG5hbWUpOworCisJaW5pdF90cmVlX2Rlc2MoJmRlc2MsIHRyZWUtPmJ1ZmZlciwgdHJlZS0+c2l6ZSk7CisKKwl3aGlsZSAodHJlZV9lbnRyeSgmZGVzYywgJmVudHJ5KSkgeworCQlpZiAoU19JU0RJUihlbnRyeS5tb2RlKSkKKwkJCXByb2Nlc3NfdHJlZShsb29rdXBfdHJlZShlbnRyeS5zaGExKSwgcCwgJm1lLCBlbnRyeS5wYXRoKTsKKwkJZWxzZSBpZiAoU19JU0dJVExJTksoZW50cnkubW9kZSkpCisJCQlwcm9jZXNzX2dpdGxpbmsoZW50cnkuc2hhMSwgcCwgJm1lLCBlbnRyeS5wYXRoKTsKKwkJZWxzZQorCQkJcHJvY2Vzc19ibG9iKGxvb2t1cF9ibG9iKGVudHJ5LnNoYTEpLCBwLCAmbWUsIGVudHJ5LnBhdGgpOworCX0KKwlmcmVlKHRyZWUtPmJ1ZmZlcik7CisJdHJlZS0+YnVmZmVyID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc190YWcoc3RydWN0IHRhZyAqdGFnLCBzdHJ1Y3Qgb2JqZWN0X2FycmF5ICpwLCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBvYmplY3QgKm9iaiA9ICZ0YWctPm9iamVjdDsKKwlzdHJ1Y3QgbmFtZV9wYXRoIG1lOworCisJaWYgKG9iai0+ZmxhZ3MgJiBTRUVOKQorCQlyZXR1cm47CisJb2JqLT5mbGFncyB8PSBTRUVOOworCisJbWUudXAgPSBOVUxMOworCW1lLmVsZW0gPSAidGFnOi8iOworCW1lLmVsZW1fbGVuID0gNTsKKworCWlmIChwYXJzZV90YWcodGFnKSA8IDApCisJCWRpZSgiYmFkIHRhZyBvYmplY3QgJXMiLCBzaGExX3RvX2hleChvYmotPnNoYTEpKTsKKwlpZiAodGFnLT50YWdnZWQpCisJCWFkZF9vYmplY3QodGFnLT50YWdnZWQsIHAsIE5VTEwsIG5hbWUpOworfQorCitzdGF0aWMgdm9pZCB3YWxrX2NvbW1pdF9saXN0KHN0cnVjdCByZXZfaW5mbyAqcmV2cykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisJc3RydWN0IG9iamVjdF9hcnJheSBvYmplY3RzID0geyAwLCAwLCBOVUxMIH07CisKKwkvKiBXYWxrIGFsbCBjb21taXRzLCBwcm9jZXNzIHRoZWlyIHRyZWVzICovCisJd2hpbGUgKChjb21taXQgPSBnZXRfcmV2aXNpb24ocmV2cykpICE9IE5VTEwpCisJCXByb2Nlc3NfdHJlZShjb21taXQtPnRyZWUsICZvYmplY3RzLCBOVUxMLCAiIik7CisKKwkvKiBUaGVuIHdhbGsgYWxsIHRoZSBwZW5kaW5nIG9iamVjdHMsIHJlY3Vyc2l2ZWx5IHByb2Nlc3NpbmcgdGhlbSB0b28gKi8KKwlmb3IgKGkgPSAwOyBpIDwgcmV2cy0+cGVuZGluZy5ucjsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3RfYXJyYXlfZW50cnkgKnBlbmRpbmcgPSByZXZzLT5wZW5kaW5nLm9iamVjdHMgKyBpOworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBwZW5kaW5nLT5pdGVtOworCQljb25zdCBjaGFyICpuYW1lID0gcGVuZGluZy0+bmFtZTsKKwkJaWYgKG9iai0+dHlwZSA9PSBPQkpfVEFHKSB7CisJCQlwcm9jZXNzX3RhZygoc3RydWN0IHRhZyAqKSBvYmosICZvYmplY3RzLCBuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChvYmotPnR5cGUgPT0gT0JKX1RSRUUpIHsKKwkJCXByb2Nlc3NfdHJlZSgoc3RydWN0IHRyZWUgKilvYmosICZvYmplY3RzLCBOVUxMLCBuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChvYmotPnR5cGUgPT0gT0JKX0JMT0IpIHsKKwkJCXByb2Nlc3NfYmxvYigoc3RydWN0IGJsb2IgKilvYmosICZvYmplY3RzLCBOVUxMLCBuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRpZSgidW5rbm93biBwZW5kaW5nIG9iamVjdCAlcyAoJXMpIiwgc2hhMV90b19oZXgob2JqLT5zaGExKSwgbmFtZSk7CisJfQorfQorCitzdGF0aWMgaW50IGFkZF9vbmVfcmVmbG9nX2VudCh1bnNpZ25lZCBjaGFyICpvc2hhMSwgdW5zaWduZWQgY2hhciAqbnNoYTEsCisJCWNvbnN0IGNoYXIgKmVtYWlsLCB1bnNpZ25lZCBsb25nIHRpbWVzdGFtcCwgaW50IHR6LAorCQljb25zdCBjaGFyICptZXNzYWdlLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCBvYmplY3QgKm9iamVjdDsKKwlzdHJ1Y3QgcmV2X2luZm8gKnJldnMgPSAoc3RydWN0IHJldl9pbmZvICopY2JfZGF0YTsKKworCW9iamVjdCA9IHBhcnNlX29iamVjdChvc2hhMSk7CisJaWYgKG9iamVjdCkKKwkJYWRkX3BlbmRpbmdfb2JqZWN0KHJldnMsIG9iamVjdCwgIiIpOworCW9iamVjdCA9IHBhcnNlX29iamVjdChuc2hhMSk7CisJaWYgKG9iamVjdCkKKwkJYWRkX3BlbmRpbmdfb2JqZWN0KHJldnMsIG9iamVjdCwgIiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZF9vbmVfcmVmKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFnLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCBvYmplY3QgKm9iamVjdCA9IHBhcnNlX29iamVjdChzaGExKTsKKwlzdHJ1Y3QgcmV2X2luZm8gKnJldnMgPSAoc3RydWN0IHJldl9pbmZvICopY2JfZGF0YTsKKworCWlmICghb2JqZWN0KQorCQlkaWUoImJhZCBvYmplY3QgcmVmOiAlczolcyIsIHBhdGgsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwlhZGRfcGVuZGluZ19vYmplY3QocmV2cywgb2JqZWN0LCAiIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGRfb25lX3JlZmxvZyhjb25zdCBjaGFyICpwYXRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmxhZywgdm9pZCAqY2JfZGF0YSkKK3sKKwlmb3JfZWFjaF9yZWZsb2dfZW50KHBhdGgsIGFkZF9vbmVfcmVmbG9nX2VudCwgY2JfZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9vbmVfdHJlZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBzdHJ1Y3QgcmV2X2luZm8gKnJldnMpCit7CisJc3RydWN0IHRyZWUgKnRyZWUgPSBsb29rdXBfdHJlZShzaGExKTsKKwlpZiAodHJlZSkKKwkJYWRkX3BlbmRpbmdfb2JqZWN0KHJldnMsICZ0cmVlLT5vYmplY3QsICIiKTsKK30KKworc3RhdGljIHZvaWQgYWRkX2NhY2hlX3RyZWUoc3RydWN0IGNhY2hlX3RyZWUgKml0LCBzdHJ1Y3QgcmV2X2luZm8gKnJldnMpCit7CisJaW50IGk7CisKKwlpZiAoaXQtPmVudHJ5X2NvdW50ID49IDApCisJCWFkZF9vbmVfdHJlZShpdC0+c2hhMSwgcmV2cyk7CisJZm9yIChpID0gMDsgaSA8IGl0LT5zdWJ0cmVlX25yOyBpKyspCisJCWFkZF9jYWNoZV90cmVlKGl0LT5kb3duW2ldLT5jYWNoZV90cmVlLCByZXZzKTsKK30KKworc3RhdGljIHZvaWQgYWRkX2NhY2hlX3JlZnMoc3RydWN0IHJldl9pbmZvICpyZXZzKQoreworCWludCBpOworCisJcmVhZF9jYWNoZSgpOworCWZvciAoaSA9IDA7IGkgPCBhY3RpdmVfbnI7IGkrKykgeworCQkvKgorCQkgKiBUaGUgaW5kZXggY2FuIGNvbnRhaW4gYmxvYnMgYW5kIEdJVExJTktzLCBHSVRMSU5LcyBhcmUgaGFzaGVzCisJCSAqIHRoYXQgZG9uJ3QgYWN0dWFsbHkgcG9pbnQgdG8gb2JqZWN0cyBpbiB0aGUgcmVwb3NpdG9yeSwgaXQncworCQkgKiBhbG1vc3QgZ3VhcmFudGVlZCB0aGF0IHRoZXkgYXJlIE5PVCBibG9icywgc28gd2UgZG9uJ3QgY2FsbAorCQkgKiBsb29rdXBfYmxvYigpIG9uIHRoZW0sIHRvIGF2b2lkIHBvcHVsYXRpbmcgdGhlIGhhc2ggdGFibGUKKwkJICogd2l0aCBpbnZhbGlkIGluZm9ybWF0aW9uCisJCSAqLworCQlpZiAoU19JU0dJVExJTksoYWN0aXZlX2NhY2hlW2ldLT5jZV9tb2RlKSkKKwkJCWNvbnRpbnVlOworCisJCWxvb2t1cF9ibG9iKGFjdGl2ZV9jYWNoZVtpXS0+c2hhMSk7CisJCS8qCisJCSAqIFdlIGNvdWxkIGFkZCB0aGUgYmxvYnMgdG8gdGhlIHBlbmRpbmcgbGlzdCwgYnV0IHF1aXRlCisJCSAqIGZyYW5rbHksIHdlIGRvbid0IGNhcmUuIE9uY2Ugd2UndmUgbG9va2VkIHRoZW0gdXAsIGFuZAorCQkgKiBhZGRlZCB0aGVtIGFzIG9iamVjdHMsIHdlJ3ZlIHJlYWxseSBkb25lIGV2ZXJ5dGhpbmcKKwkJICogdGhlcmUgaXMgdG8gZG8gZm9yIGEgYmxvYgorCQkgKi8KKwl9CisJaWYgKGFjdGl2ZV9jYWNoZV90cmVlKQorCQlhZGRfY2FjaGVfdHJlZShhY3RpdmVfY2FjaGVfdHJlZSwgcmV2cyk7Cit9CisKK3ZvaWQgbWFya19yZWFjaGFibGVfb2JqZWN0cyhzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIGludCBtYXJrX3JlZmxvZykKK3sKKwkvKgorCSAqIFNldCB1cCByZXZpc2lvbiBwYXJzaW5nLCBhbmQgbWFyayB1cyBhcyBiZWluZyBpbnRlcmVzdGVkCisJICogaW4gYWxsIG9iamVjdCB0eXBlcywgbm90IGp1c3QgY29tbWl0cy4KKwkgKi8KKwlyZXZzLT50YWdfb2JqZWN0cyA9IDE7CisJcmV2cy0+YmxvYl9vYmplY3RzID0gMTsKKwlyZXZzLT50cmVlX29iamVjdHMgPSAxOworCisJLyogQWRkIGFsbCByZWZzIGZyb20gdGhlIGluZGV4IGZpbGUgKi8KKwlhZGRfY2FjaGVfcmVmcyhyZXZzKTsKKworCS8qIEFkZCBhbGwgZXh0ZXJuYWwgcmVmcyAqLworCWZvcl9lYWNoX3JlZihhZGRfb25lX3JlZiwgcmV2cyk7CisKKwkvKiBBZGQgYWxsIHJlZmxvZyBpbmZvICovCisJaWYgKG1hcmtfcmVmbG9nKQorCQlmb3JfZWFjaF9yZWZsb2coYWRkX29uZV9yZWZsb2csIHJldnMpOworCisJLyoKKwkgKiBTZXQgdXAgdGhlIHJldmlzaW9uIHdhbGsgLSB0aGlzIHdpbGwgbW92ZSBhbGwgY29tbWl0cworCSAqIGZyb20gdGhlIHBlbmRpbmcgbGlzdCB0byB0aGUgY29tbWl0IHdhbGtpbmcgbGlzdC4KKwkgKi8KKwlpZiAocHJlcGFyZV9yZXZpc2lvbl93YWxrKHJldnMpKQorCQlkaWUoInJldmlzaW9uIHdhbGsgc2V0dXAgZmFpbGVkIik7CisJd2Fsa19jb21taXRfbGlzdChyZXZzKTsKK30KZGlmZiAtLWdpdCBhL3JlYWNoYWJsZS5oIGIvcmVhY2hhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA3NTE4MQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWNoYWJsZS5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBSRUFDSEVBQkxFX0gKKyNkZWZpbmUgUkVBQ0hFQUJMRV9ICisKK2V4dGVybiB2b2lkIG1hcmtfcmVhY2hhYmxlX29iamVjdHMoc3RydWN0IHJldl9pbmZvICpyZXZzLCBpbnQgbWFya19yZWZsb2cpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3JlYWQtY2FjaGUuYyBiL3JlYWQtY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTJiMjViCi0tLSAvZGV2L251bGwKKysrIGIvcmVhZC1jYWNoZS5jCkBAIC0wLDAgKzEsMTM5MiBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqLworI2RlZmluZSBOT19USEVfSU5ERVhfQ09NUEFUSUJJTElUWV9NQUNST1MKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNhY2hlLXRyZWUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAiZGlyLmgiCisKKy8qIEluZGV4IGV4dGVuc2lvbnMuCisgKgorICogVGhlIGZpcnN0IGxldHRlciBzaG91bGQgYmUgJ0EnLi4nWicgZm9yIGV4dGVuc2lvbnMgdGhhdCBhcmUgbm90CisgKiBuZWNlc3NhcnkgZm9yIGEgY29ycmVjdCBvcGVyYXRpb24gKGkuZS4gb3B0aW1pemF0aW9uIGRhdGEpLgorICogV2hlbiBuZXcgZXh0ZW5zaW9ucyBhcmUgYWRkZWQgdGhhdCBfbmVlZHNfIHRvIGJlIHVuZGVyc3Rvb2QgaW4KKyAqIG9yZGVyIHRvIGNvcnJlY3RseSBpbnRlcnByZXQgdGhlIGluZGV4IGZpbGUsIHBpY2sgY2hhcmFjdGVyIHRoYXQKKyAqIGlzIG91dHNpZGUgdGhlIHJhbmdlLCB0byBjYXVzZSB0aGUgcmVhZGVyIHRvIGFib3J0LgorICovCisKKyNkZWZpbmUgQ0FDSEVfRVhUKHMpICggKHNbMF08PDI0KXwoc1sxXTw8MTYpfChzWzJdPDw4KXwoc1szXSkgKQorI2RlZmluZSBDQUNIRV9FWFRfVFJFRSAweDU0NTI0NTQ1CS8qICJUUkVFIiAqLworCitzdHJ1Y3QgaW5kZXhfc3RhdGUgdGhlX2luZGV4OworCitzdGF0aWMgdW5zaWduZWQgaW50IGhhc2hfbmFtZShjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikKK3sKKwl1bnNpZ25lZCBpbnQgaGFzaCA9IDB4MTIzOworCisJZG8geworCQl1bnNpZ25lZCBjaGFyIGMgPSAqbmFtZSsrOworCQloYXNoID0gaGFzaCoxMDEgKyBjOworCX0gd2hpbGUgKC0tbmFtZWxlbik7CisJcmV0dXJuIGhhc2g7Cit9CisKK3N0YXRpYyB2b2lkIGhhc2hfaW5kZXhfZW50cnkoc3RydWN0IGluZGV4X3N0YXRlICppc3RhdGUsIHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UpCit7CisJdm9pZCAqKnBvczsKKwl1bnNpZ25lZCBpbnQgaGFzaDsKKworCWlmIChjZS0+Y2VfZmxhZ3MgJiBDRV9IQVNIRUQpCisJCXJldHVybjsKKwljZS0+Y2VfZmxhZ3MgfD0gQ0VfSEFTSEVEOworCWNlLT5uZXh0ID0gTlVMTDsKKwloYXNoID0gaGFzaF9uYW1lKGNlLT5uYW1lLCBjZV9uYW1lbGVuKGNlKSk7CisJcG9zID0gaW5zZXJ0X2hhc2goaGFzaCwgY2UsICZpc3RhdGUtPm5hbWVfaGFzaCk7CisJaWYgKHBvcykgeworCQljZS0+bmV4dCA9ICpwb3M7CisJCSpwb3MgPSBjZTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxhenlfaW5pdF9uYW1lX2hhc2goc3RydWN0IGluZGV4X3N0YXRlICppc3RhdGUpCit7CisJaW50IG5yOworCisJaWYgKGlzdGF0ZS0+bmFtZV9oYXNoX2luaXRpYWxpemVkKQorCQlyZXR1cm47CisJZm9yIChuciA9IDA7IG5yIDwgaXN0YXRlLT5jYWNoZV9ucjsgbnIrKykKKwkJaGFzaF9pbmRleF9lbnRyeShpc3RhdGUsIGlzdGF0ZS0+Y2FjaGVbbnJdKTsKKwlpc3RhdGUtPm5hbWVfaGFzaF9pbml0aWFsaXplZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9pbmRleF9lbnRyeShzdHJ1Y3QgaW5kZXhfc3RhdGUgKmlzdGF0ZSwgaW50IG5yLCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlKQoreworCWNlLT5jZV9mbGFncyAmPSB+Q0VfVU5IQVNIRUQ7CisJaXN0YXRlLT5jYWNoZVtucl0gPSBjZTsKKwlpZiAoaXN0YXRlLT5uYW1lX2hhc2hfaW5pdGlhbGl6ZWQpCisJCWhhc2hfaW5kZXhfZW50cnkoaXN0YXRlLCBjZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlcGxhY2VfaW5kZXhfZW50cnkoc3RydWN0IGluZGV4X3N0YXRlICppc3RhdGUsIGludCBuciwgc3RydWN0IGNhY2hlX2VudHJ5ICpjZSkKK3sKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKm9sZCA9IGlzdGF0ZS0+Y2FjaGVbbnJdOworCisJcmVtb3ZlX2luZGV4X2VudHJ5KG9sZCk7CisJc2V0X2luZGV4X2VudHJ5KGlzdGF0ZSwgbnIsIGNlKTsKKwlpc3RhdGUtPmNhY2hlX2NoYW5nZWQgPSAxOworfQorCitpbnQgaW5kZXhfbmFtZV9leGlzdHMoc3RydWN0IGluZGV4X3N0YXRlICppc3RhdGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQoreworCXVuc2lnbmVkIGludCBoYXNoID0gaGFzaF9uYW1lKG5hbWUsIG5hbWVsZW4pOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisKKwlsYXp5X2luaXRfbmFtZV9oYXNoKGlzdGF0ZSk7CisJY2UgPSBsb29rdXBfaGFzaChoYXNoLCAmaXN0YXRlLT5uYW1lX2hhc2gpOworCisJd2hpbGUgKGNlKSB7CisJCWlmICghKGNlLT5jZV9mbGFncyAmIENFX1VOSEFTSEVEKSkgeworCQkJaWYgKCFjYWNoZV9uYW1lX2NvbXBhcmUobmFtZSwgbmFtZWxlbiwgY2UtPm5hbWUsIGNlLT5jZV9mbGFncykpCisJCQkJcmV0dXJuIDE7CisJCX0KKwkJY2UgPSBjZS0+bmV4dDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIG9ubHkgdXBkYXRlcyB0aGUgIm5vbi1jcml0aWNhbCIgcGFydHMgb2YgdGhlIGRpcmVjdG9yeQorICogY2FjaGUsIGllIHRoZSBwYXJ0cyB0aGF0IGFyZW4ndCB0cmFja2VkIGJ5IEdJVCwgYW5kIG9ubHkgdXNlZAorICogdG8gdmFsaWRhdGUgdGhlIGNhY2hlLgorICovCit2b2lkIGZpbGxfc3RhdF9jYWNoZV9pbmZvKHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIHN0cnVjdCBzdGF0ICpzdCkKK3sKKwljZS0+Y2VfY3RpbWUgPSBzdC0+c3RfY3RpbWU7CisJY2UtPmNlX210aW1lID0gc3QtPnN0X210aW1lOworCWNlLT5jZV9kZXYgPSBzdC0+c3RfZGV2OworCWNlLT5jZV9pbm8gPSBzdC0+c3RfaW5vOworCWNlLT5jZV91aWQgPSBzdC0+c3RfdWlkOworCWNlLT5jZV9naWQgPSBzdC0+c3RfZ2lkOworCWNlLT5jZV9zaXplID0gc3QtPnN0X3NpemU7CisKKwlpZiAoYXNzdW1lX3VuY2hhbmdlZCkKKwkJY2UtPmNlX2ZsYWdzIHw9IENFX1ZBTElEOworCisJaWYgKFNfSVNSRUcoc3QtPnN0X21vZGUpKQorCQljZV9tYXJrX3VwdG9kYXRlKGNlKTsKK30KKworc3RhdGljIGludCBjZV9jb21wYXJlX2RhdGEoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgc3RydWN0IHN0YXQgKnN0KQoreworCWludCBtYXRjaCA9IC0xOworCWludCBmZCA9IG9wZW4oY2UtPm5hbWUsIE9fUkRPTkxZKTsKKworCWlmIChmZCA+PSAwKSB7CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCWlmICghaW5kZXhfZmQoc2hhMSwgZmQsIHN0LCAwLCBPQkpfQkxPQiwgY2UtPm5hbWUpKQorCQkJbWF0Y2ggPSBoYXNoY21wKHNoYTEsIGNlLT5zaGExKTsKKwkJLyogaW5kZXhfZmQoKSBjbG9zZWQgdGhlIGZpbGUgZGVzY3JpcHRvciBhbHJlYWR5ICovCisJfQorCXJldHVybiBtYXRjaDsKK30KKworc3RhdGljIGludCBjZV9jb21wYXJlX2xpbmsoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgc2l6ZV90IGV4cGVjdGVkX3NpemUpCit7CisJaW50IG1hdGNoID0gLTE7CisJY2hhciAqdGFyZ2V0OworCXZvaWQgKmJ1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCWludCBsZW47CisKKwl0YXJnZXQgPSB4bWFsbG9jKGV4cGVjdGVkX3NpemUpOworCWxlbiA9IHJlYWRsaW5rKGNlLT5uYW1lLCB0YXJnZXQsIGV4cGVjdGVkX3NpemUpOworCWlmIChsZW4gIT0gZXhwZWN0ZWRfc2l6ZSkgeworCQlmcmVlKHRhcmdldCk7CisJCXJldHVybiAtMTsKKwl9CisJYnVmZmVyID0gcmVhZF9zaGExX2ZpbGUoY2UtPnNoYTEsICZ0eXBlLCAmc2l6ZSk7CisJaWYgKCFidWZmZXIpIHsKKwkJZnJlZSh0YXJnZXQpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChzaXplID09IGV4cGVjdGVkX3NpemUpCisJCW1hdGNoID0gbWVtY21wKGJ1ZmZlciwgdGFyZ2V0LCBzaXplKTsKKwlmcmVlKGJ1ZmZlcik7CisJZnJlZSh0YXJnZXQpOworCXJldHVybiBtYXRjaDsKK30KKworc3RhdGljIGludCBjZV9jb21wYXJlX2dpdGxpbmsoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCisJLyoKKwkgKiBXZSBkb24ndCBhY3R1YWxseSByZXF1aXJlIHRoYXQgdGhlIC5naXQgZGlyZWN0b3J5CisJICogdW5kZXIgR0lUTElOSyBkaXJlY3RvcnkgYmUgYSB2YWxpZCBnaXQgZGlyZWN0b3J5LiBJdAorCSAqIG1pZ2h0IGV2ZW4gYmUgbWlzc2luZyAoaW4gY2FzZSBub2JvZHkgcG9wdWxhdGVkIHRoYXQKKwkgKiBzdWItcHJvamVjdCkuCisJICoKKwkgKiBJZiBzbywgd2UgY29uc2lkZXIgaXQgYWx3YXlzIHRvIG1hdGNoLgorCSAqLworCWlmIChyZXNvbHZlX2dpdGxpbmtfcmVmKGNlLT5uYW1lLCAiSEVBRCIsIHNoYTEpIDwgMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGhhc2hjbXAoc2hhMSwgY2UtPnNoYTEpOworfQorCitzdGF0aWMgaW50IGNlX21vZGlmaWVkX2NoZWNrX2ZzKHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIHN0cnVjdCBzdGF0ICpzdCkKK3sKKwlzd2l0Y2ggKHN0LT5zdF9tb2RlICYgU19JRk1UKSB7CisJY2FzZSBTX0lGUkVHOgorCQlpZiAoY2VfY29tcGFyZV9kYXRhKGNlLCBzdCkpCisJCQlyZXR1cm4gREFUQV9DSEFOR0VEOworCQlicmVhazsKKwljYXNlIFNfSUZMTks6CisJCWlmIChjZV9jb21wYXJlX2xpbmsoY2UsIHhzaXplX3Qoc3QtPnN0X3NpemUpKSkKKwkJCXJldHVybiBEQVRBX0NIQU5HRUQ7CisJCWJyZWFrOworCWNhc2UgU19JRkRJUjoKKwkJaWYgKFNfSVNHSVRMSU5LKGNlLT5jZV9tb2RlKSkKKwkJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiBUWVBFX0NIQU5HRUQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNlX21hdGNoX3N0YXRfYmFzaWMoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgc3RydWN0IHN0YXQgKnN0KQoreworCXVuc2lnbmVkIGludCBjaGFuZ2VkID0gMDsKKworCWlmIChjZS0+Y2VfZmxhZ3MgJiBDRV9SRU1PVkUpCisJCXJldHVybiBNT0RFX0NIQU5HRUQgfCBEQVRBX0NIQU5HRUQgfCBUWVBFX0NIQU5HRUQ7CisKKwlzd2l0Y2ggKGNlLT5jZV9tb2RlICYgU19JRk1UKSB7CisJY2FzZSBTX0lGUkVHOgorCQljaGFuZ2VkIHw9ICFTX0lTUkVHKHN0LT5zdF9tb2RlKSA/IFRZUEVfQ0hBTkdFRCA6IDA7CisJCS8qIFdlIGNvbnNpZGVyIG9ubHkgdGhlIG93bmVyIHggYml0IHRvIGJlIHJlbGV2YW50IGZvcgorCQkgKiAibW9kZSBjaGFuZ2VzIgorCQkgKi8KKwkJaWYgKHRydXN0X2V4ZWN1dGFibGVfYml0ICYmCisJCSAgICAoMDEwMCAmIChjZS0+Y2VfbW9kZSBeIHN0LT5zdF9tb2RlKSkpCisJCQljaGFuZ2VkIHw9IE1PREVfQ0hBTkdFRDsKKwkJYnJlYWs7CisJY2FzZSBTX0lGTE5LOgorCQlpZiAoIVNfSVNMTksoc3QtPnN0X21vZGUpICYmCisJCSAgICAoaGFzX3N5bWxpbmtzIHx8ICFTX0lTUkVHKHN0LT5zdF9tb2RlKSkpCisJCQljaGFuZ2VkIHw9IFRZUEVfQ0hBTkdFRDsKKwkJYnJlYWs7CisJY2FzZSBTX0lGR0lUTElOSzoKKwkJaWYgKCFTX0lTRElSKHN0LT5zdF9tb2RlKSkKKwkJCWNoYW5nZWQgfD0gVFlQRV9DSEFOR0VEOworCQllbHNlIGlmIChjZV9jb21wYXJlX2dpdGxpbmsoY2UpKQorCQkJY2hhbmdlZCB8PSBEQVRBX0NIQU5HRUQ7CisJCXJldHVybiBjaGFuZ2VkOworCWRlZmF1bHQ6CisJCWRpZSgiaW50ZXJuYWwgZXJyb3I6IGNlX21vZGUgaXMgJW8iLCBjZS0+Y2VfbW9kZSk7CisJfQorCWlmIChjZS0+Y2VfbXRpbWUgIT0gKHVuc2lnbmVkIGludCkgc3QtPnN0X210aW1lKQorCQljaGFuZ2VkIHw9IE1USU1FX0NIQU5HRUQ7CisJaWYgKGNlLT5jZV9jdGltZSAhPSAodW5zaWduZWQgaW50KSBzdC0+c3RfY3RpbWUpCisJCWNoYW5nZWQgfD0gQ1RJTUVfQ0hBTkdFRDsKKworCWlmIChjZS0+Y2VfdWlkICE9ICh1bnNpZ25lZCBpbnQpIHN0LT5zdF91aWQgfHwKKwkgICAgY2UtPmNlX2dpZCAhPSAodW5zaWduZWQgaW50KSBzdC0+c3RfZ2lkKQorCQljaGFuZ2VkIHw9IE9XTkVSX0NIQU5HRUQ7CisJaWYgKGNlLT5jZV9pbm8gIT0gKHVuc2lnbmVkIGludCkgc3QtPnN0X2lubykKKwkJY2hhbmdlZCB8PSBJTk9ERV9DSEFOR0VEOworCisjaWZkZWYgVVNFX1NUREVWCisJLyoKKwkgKiBzdF9kZXYgYnJlYWtzIG9uIG5ldHdvcmsgZmlsZXN5c3RlbXMgd2hlcmUgZGlmZmVyZW50CisJICogY2xpZW50cyB3aWxsIGhhdmUgZGlmZmVyZW50IHZpZXdzIG9mIHdoYXQgImRldmljZSIKKwkgKiB0aGUgZmlsZXN5c3RlbSBpcyBvbgorCSAqLworCWlmIChjZS0+Y2VfZGV2ICE9ICh1bnNpZ25lZCBpbnQpIHN0LT5zdF9kZXYpCisJCWNoYW5nZWQgfD0gSU5PREVfQ0hBTkdFRDsKKyNlbmRpZgorCisJaWYgKGNlLT5jZV9zaXplICE9ICh1bnNpZ25lZCBpbnQpIHN0LT5zdF9zaXplKQorCQljaGFuZ2VkIHw9IERBVEFfQ0hBTkdFRDsKKworCXJldHVybiBjaGFuZ2VkOworfQorCitzdGF0aWMgaW50IGlzX3JhY3lfdGltZXN0YW1wKGNvbnN0IHN0cnVjdCBpbmRleF9zdGF0ZSAqaXN0YXRlLCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlKQoreworCXJldHVybiAoaXN0YXRlLT50aW1lc3RhbXAgJiYKKwkJKCh1bnNpZ25lZCBpbnQpaXN0YXRlLT50aW1lc3RhbXApIDw9IGNlLT5jZV9tdGltZSk7Cit9CisKK2ludCBpZV9tYXRjaF9zdGF0KGNvbnN0IHN0cnVjdCBpbmRleF9zdGF0ZSAqaXN0YXRlLAorCQkgIHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIHN0cnVjdCBzdGF0ICpzdCwKKwkJICB1bnNpZ25lZCBpbnQgb3B0aW9ucykKK3sKKwl1bnNpZ25lZCBpbnQgY2hhbmdlZDsKKwlpbnQgaWdub3JlX3ZhbGlkID0gb3B0aW9ucyAmIENFX01BVENIX0lHTk9SRV9WQUxJRDsKKwlpbnQgYXNzdW1lX3JhY3lfaXNfbW9kaWZpZWQgPSBvcHRpb25zICYgQ0VfTUFUQ0hfUkFDWV9JU19ESVJUWTsKKworCS8qCisJICogSWYgaXQncyBtYXJrZWQgYXMgYWx3YXlzIHZhbGlkIGluIHRoZSBpbmRleCwgaXQncworCSAqIHZhbGlkIHdoYXRldmVyIHRoZSBjaGVja2VkLW91dCBjb3B5IHNheXMuCisJICovCisJaWYgKCFpZ25vcmVfdmFsaWQgJiYgKGNlLT5jZV9mbGFncyAmIENFX1ZBTElEKSkKKwkJcmV0dXJuIDA7CisKKwljaGFuZ2VkID0gY2VfbWF0Y2hfc3RhdF9iYXNpYyhjZSwgc3QpOworCisJLyoKKwkgKiBXaXRoaW4gMSBzZWNvbmQgb2YgdGhpcyBzZXF1ZW5jZToKKwkgKiAJZWNobyB4eXp6eSA+ZmlsZSAmJiBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZpbGUKKwkgKiBydW5uaW5nIHRoaXMgY29tbWFuZDoKKwkgKiAJZWNobyBmcm90eiA+ZmlsZQorCSAqIHdvdWxkIGdpdmUgYSBmYWxzZWx5IGNsZWFuIGNhY2hlIGVudHJ5LiAgVGhlIG10aW1lIGFuZAorCSAqIGxlbmd0aCBtYXRjaCB0aGUgY2FjaGUsIGFuZCBvdGhlciBzdGF0IGZpZWxkcyBkbyBub3QgY2hhbmdlLgorCSAqCisJICogV2UgY291bGQgZGV0ZWN0IHRoaXMgYXQgdXBkYXRlLWluZGV4IHRpbWUgKHRoZSBjYWNoZSBlbnRyeQorCSAqIGJlaW5nIHJlZ2lzdGVyZWQvdXBkYXRlZCByZWNvcmRzIHRoZSBzYW1lIHRpbWUgYXMgIm5vdyIpCisJICogYW5kIGRlbGF5IHRoZSByZXR1cm4gZnJvbSBnaXQtdXBkYXRlLWluZGV4LCBidXQgdGhhdCB3b3VsZAorCSAqIGVmZmVjdGl2ZWx5IG1lYW4gd2UgY2FuIG1ha2UgYXQgbW9zdCBvbmUgY29tbWl0IHBlciBzZWNvbmQsCisJICogd2hpY2ggaXMgbm90IGFjY2VwdGFibGUuICBJbnN0ZWFkLCB3ZSBjaGVjayBjYWNoZSBlbnRyaWVzCisJICogd2hvc2UgbXRpbWUgYXJlIHRoZSBzYW1lIGFzIHRoZSBpbmRleCBmaWxlIHRpbWVzdGFtcCBtb3JlCisJICogY2FyZWZ1bGx5IHRoYW4gb3RoZXJzLgorCSAqLworCWlmICghY2hhbmdlZCAmJiBpc19yYWN5X3RpbWVzdGFtcChpc3RhdGUsIGNlKSkgeworCQlpZiAoYXNzdW1lX3JhY3lfaXNfbW9kaWZpZWQpCisJCQljaGFuZ2VkIHw9IERBVEFfQ0hBTkdFRDsKKwkJZWxzZQorCQkJY2hhbmdlZCB8PSBjZV9tb2RpZmllZF9jaGVja19mcyhjZSwgc3QpOworCX0KKworCXJldHVybiBjaGFuZ2VkOworfQorCitpbnQgaWVfbW9kaWZpZWQoY29uc3Qgc3RydWN0IGluZGV4X3N0YXRlICppc3RhdGUsCisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIHN0cnVjdCBzdGF0ICpzdCwgdW5zaWduZWQgaW50IG9wdGlvbnMpCit7CisJaW50IGNoYW5nZWQsIGNoYW5nZWRfZnM7CisKKwljaGFuZ2VkID0gaWVfbWF0Y2hfc3RhdChpc3RhdGUsIGNlLCBzdCwgb3B0aW9ucyk7CisJaWYgKCFjaGFuZ2VkKQorCQlyZXR1cm4gMDsKKwkvKgorCSAqIElmIHRoZSBtb2RlIG9yIHR5cGUgaGFzIGNoYW5nZWQsIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gdHJ5aW5nCisJICogdG8gcmVmcmVzaCB0aGUgZW50cnkgLSBpdCdzIG5vdCBnb2luZyB0byBtYXRjaAorCSAqLworCWlmIChjaGFuZ2VkICYgKE1PREVfQ0hBTkdFRCB8IFRZUEVfQ0hBTkdFRCkpCisJCXJldHVybiBjaGFuZ2VkOworCisJLyogSW1tZWRpYXRlbHkgYWZ0ZXIgcmVhZC10cmVlIG9yIHVwZGF0ZS1pbmRleCAtLWNhY2hlaW5mbywKKwkgKiB0aGUgbGVuZ3RoIGZpZWxkIGlzIHplcm8uICBGb3Igb3RoZXIgY2FzZXMgdGhlIGNlX3NpemUKKwkgKiBzaG91bGQgbWF0Y2ggdGhlIFNIQTEgcmVjb3JkZWQgaW4gdGhlIGluZGV4IGVudHJ5LgorCSAqLworCWlmICgoY2hhbmdlZCAmIERBVEFfQ0hBTkdFRCkgJiYgY2UtPmNlX3NpemUgIT0gMCkKKwkJcmV0dXJuIGNoYW5nZWQ7CisKKwljaGFuZ2VkX2ZzID0gY2VfbW9kaWZpZWRfY2hlY2tfZnMoY2UsIHN0KTsKKwlpZiAoY2hhbmdlZF9mcykKKwkJcmV0dXJuIGNoYW5nZWQgfCBjaGFuZ2VkX2ZzOworCXJldHVybiAwOworfQorCitpbnQgYmFzZV9uYW1lX2NvbXBhcmUoY29uc3QgY2hhciAqbmFtZTEsIGludCBsZW4xLCBpbnQgbW9kZTEsCisJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUyLCBpbnQgbGVuMiwgaW50IG1vZGUyKQoreworCXVuc2lnbmVkIGNoYXIgYzEsIGMyOworCWludCBsZW4gPSBsZW4xIDwgbGVuMiA/IGxlbjEgOiBsZW4yOworCWludCBjbXA7CisKKwljbXAgPSBtZW1jbXAobmFtZTEsIG5hbWUyLCBsZW4pOworCWlmIChjbXApCisJCXJldHVybiBjbXA7CisJYzEgPSBuYW1lMVtsZW5dOworCWMyID0gbmFtZTJbbGVuXTsKKwlpZiAoIWMxICYmIFNfSVNESVIobW9kZTEpKQorCQljMSA9ICcvJzsKKwlpZiAoIWMyICYmIFNfSVNESVIobW9kZTIpKQorCQljMiA9ICcvJzsKKwlyZXR1cm4gKGMxIDwgYzIpID8gLTEgOiAoYzEgPiBjMikgPyAxIDogMDsKK30KKworLyoKKyAqIGRmX25hbWVfY29tcGFyZSgpIGlzIGlkZW50aWNhbCB0byBiYXNlX25hbWVfY29tcGFyZSgpLCBleGNlcHQgaXQKKyAqIGNvbXBhcmVzIGNvbmZsaWN0aW5nIGRpcmVjdG9yeS9maWxlIGVudHJpZXMgYXMgZXF1YWwuIE5vdGUgdGhhdAorICogd2hpbGUgYSBkaXJlY3RvcnkgbmFtZSBjb21wYXJlcyBhcyBlcXVhbCB0byBhIHJlZ3VsYXIgZmlsZSwgdGhleQorICogdGhlbiBpbmRpdmlkdWFsbHkgY29tcGFyZSBfZGlmZmVyZW50bHlfIHRvIGEgZmlsZW5hbWUgdGhhdCBoYXMKKyAqIGEgZG90IGFmdGVyIHRoZSBiYXNlbmFtZSAoYmVjYXVzZSAnXDAnIDwgJy4nIDwgJy8nKS4KKyAqCisgKiBUaGlzIGlzIHVzZWQgYnkgcm91dGluZXMgdGhhdCB3YW50IHRvIHRyYXZlcnNlIHRoZSBnaXQgbmFtZXNwYWNlCisgKiBidXQgdGhlbiBoYW5kbGUgY29uZmxpY3RpbmcgZW50cmllcyB0b2dldGhlciB3aGVuIHBvc3NpYmxlLgorICovCitpbnQgZGZfbmFtZV9jb21wYXJlKGNvbnN0IGNoYXIgKm5hbWUxLCBpbnQgbGVuMSwgaW50IG1vZGUxLAorCQkgICAgY29uc3QgY2hhciAqbmFtZTIsIGludCBsZW4yLCBpbnQgbW9kZTIpCit7CisJaW50IGxlbiA9IGxlbjEgPCBsZW4yID8gbGVuMSA6IGxlbjIsIGNtcDsKKwl1bnNpZ25lZCBjaGFyIGMxLCBjMjsKKworCWNtcCA9IG1lbWNtcChuYW1lMSwgbmFtZTIsIGxlbik7CisJaWYgKGNtcCkKKwkJcmV0dXJuIGNtcDsKKwkvKiBEaXJlY3RvcmllcyBhbmQgZmlsZXMgY29tcGFyZSBlcXVhbCAoc2FtZSBsZW5ndGgsIHNhbWUgbmFtZSkgKi8KKwlpZiAobGVuMSA9PSBsZW4yKQorCQlyZXR1cm4gMDsKKwljMSA9IG5hbWUxW2xlbl07CisJaWYgKCFjMSAmJiBTX0lTRElSKG1vZGUxKSkKKwkJYzEgPSAnLyc7CisJYzIgPSBuYW1lMltsZW5dOworCWlmICghYzIgJiYgU19JU0RJUihtb2RlMikpCisJCWMyID0gJy8nOworCWlmIChjMSA9PSAnLycgJiYgIWMyKQorCQlyZXR1cm4gMDsKKwlpZiAoYzIgPT0gJy8nICYmICFjMSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGMxIC0gYzI7Cit9CisKK2ludCBjYWNoZV9uYW1lX2NvbXBhcmUoY29uc3QgY2hhciAqbmFtZTEsIGludCBmbGFnczEsIGNvbnN0IGNoYXIgKm5hbWUyLCBpbnQgZmxhZ3MyKQoreworCWludCBsZW4xID0gZmxhZ3MxICYgQ0VfTkFNRU1BU0s7CisJaW50IGxlbjIgPSBmbGFnczIgJiBDRV9OQU1FTUFTSzsKKwlpbnQgbGVuID0gbGVuMSA8IGxlbjIgPyBsZW4xIDogbGVuMjsKKwlpbnQgY21wOworCisJY21wID0gbWVtY21wKG5hbWUxLCBuYW1lMiwgbGVuKTsKKwlpZiAoY21wKQorCQlyZXR1cm4gY21wOworCWlmIChsZW4xIDwgbGVuMikKKwkJcmV0dXJuIC0xOworCWlmIChsZW4xID4gbGVuMikKKwkJcmV0dXJuIDE7CisKKwkvKiBDb21wYXJlIHN0YWdlcyAgKi8KKwlmbGFnczEgJj0gQ0VfU1RBR0VNQVNLOworCWZsYWdzMiAmPSBDRV9TVEFHRU1BU0s7CisKKwlpZiAoZmxhZ3MxIDwgZmxhZ3MyKQorCQlyZXR1cm4gLTE7CisJaWYgKGZsYWdzMSA+IGZsYWdzMikKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBpbmRleF9uYW1lX3Bvcyhjb25zdCBzdHJ1Y3QgaW5kZXhfc3RhdGUgKmlzdGF0ZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pCit7CisJaW50IGZpcnN0LCBsYXN0OworCisJZmlyc3QgPSAwOworCWxhc3QgPSBpc3RhdGUtPmNhY2hlX25yOworCXdoaWxlIChsYXN0ID4gZmlyc3QpIHsKKwkJaW50IG5leHQgPSAobGFzdCArIGZpcnN0KSA+PiAxOworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gaXN0YXRlLT5jYWNoZVtuZXh0XTsKKwkJaW50IGNtcCA9IGNhY2hlX25hbWVfY29tcGFyZShuYW1lLCBuYW1lbGVuLCBjZS0+bmFtZSwgY2UtPmNlX2ZsYWdzKTsKKwkJaWYgKCFjbXApCisJCQlyZXR1cm4gbmV4dDsKKwkJaWYgKGNtcCA8IDApIHsKKwkJCWxhc3QgPSBuZXh0OworCQkJY29udGludWU7CisJCX0KKwkJZmlyc3QgPSBuZXh0KzE7CisJfQorCXJldHVybiAtZmlyc3QtMTsKK30KKworLyogUmVtb3ZlIGVudHJ5LCByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgbW9yZSBlbnRyaWVzIHRvIGdvLi4gKi8KK2ludCByZW1vdmVfaW5kZXhfZW50cnlfYXQoc3RydWN0IGluZGV4X3N0YXRlICppc3RhdGUsIGludCBwb3MpCit7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGlzdGF0ZS0+Y2FjaGVbcG9zXTsKKworCXJlbW92ZV9pbmRleF9lbnRyeShjZSk7CisJaXN0YXRlLT5jYWNoZV9jaGFuZ2VkID0gMTsKKwlpc3RhdGUtPmNhY2hlX25yLS07CisJaWYgKHBvcyA+PSBpc3RhdGUtPmNhY2hlX25yKQorCQlyZXR1cm4gMDsKKwltZW1tb3ZlKGlzdGF0ZS0+Y2FjaGUgKyBwb3MsCisJCWlzdGF0ZS0+Y2FjaGUgKyBwb3MgKyAxLAorCQkoaXN0YXRlLT5jYWNoZV9uciAtIHBvcykgKiBzaXplb2Yoc3RydWN0IGNhY2hlX2VudHJ5ICopKTsKKwlyZXR1cm4gMTsKK30KKworaW50IHJlbW92ZV9maWxlX2Zyb21faW5kZXgoc3RydWN0IGluZGV4X3N0YXRlICppc3RhdGUsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IHBvcyA9IGluZGV4X25hbWVfcG9zKGlzdGF0ZSwgcGF0aCwgc3RybGVuKHBhdGgpKTsKKwlpZiAocG9zIDwgMCkKKwkJcG9zID0gLXBvcy0xOworCWNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKGlzdGF0ZS0+Y2FjaGVfdHJlZSwgcGF0aCk7CisJd2hpbGUgKHBvcyA8IGlzdGF0ZS0+Y2FjaGVfbnIgJiYgIXN0cmNtcChpc3RhdGUtPmNhY2hlW3Bvc10tPm5hbWUsIHBhdGgpKQorCQlyZW1vdmVfaW5kZXhfZW50cnlfYXQoaXN0YXRlLCBwb3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbXBhcmVfbmFtZShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBjb25zdCBjaGFyICpwYXRoLCBpbnQgbmFtZWxlbikKK3sKKwlyZXR1cm4gbmFtZWxlbiAhPSBjZV9uYW1lbGVuKGNlKSB8fCBtZW1jbXAocGF0aCwgY2UtPm5hbWUsIG5hbWVsZW4pOworfQorCitzdGF0aWMgaW50IGluZGV4X25hbWVfcG9zX2Fsc29fdW5tZXJnZWQoc3RydWN0IGluZGV4X3N0YXRlICppc3RhdGUsCisJY29uc3QgY2hhciAqcGF0aCwgaW50IG5hbWVsZW4pCit7CisJaW50IHBvcyA9IGluZGV4X25hbWVfcG9zKGlzdGF0ZSwgcGF0aCwgbmFtZWxlbik7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpjZTsKKworCWlmIChwb3MgPj0gMCkKKwkJcmV0dXJuIHBvczsKKworCS8qIG1heWJlIHVubWVyZ2VkPyAqLworCXBvcyA9IC0xIC0gcG9zOworCWlmIChwb3MgPj0gaXN0YXRlLT5jYWNoZV9uciB8fAorCQkJY29tcGFyZV9uYW1lKChjZSA9IGlzdGF0ZS0+Y2FjaGVbcG9zXSksIHBhdGgsIG5hbWVsZW4pKQorCQlyZXR1cm4gLTE7CisKKwkvKiBvcmRlciBvZiBwcmVmZXJlbmNlOiBzdGFnZSAyLCAxLCAzICovCisJaWYgKGNlX3N0YWdlKGNlKSA9PSAxICYmIHBvcyArIDEgPCBpc3RhdGUtPmNhY2hlX25yICYmCisJCQljZV9zdGFnZSgoY2UgPSBpc3RhdGUtPmNhY2hlW3BvcyArIDFdKSkgPT0gMiAmJgorCQkJIWNvbXBhcmVfbmFtZShjZSwgcGF0aCwgbmFtZWxlbikpCisJCXBvcysrOworCXJldHVybiBwb3M7Cit9CisKK2ludCBhZGRfZmlsZV90b19pbmRleChzdHJ1Y3QgaW5kZXhfc3RhdGUgKmlzdGF0ZSwgY29uc3QgY2hhciAqcGF0aCwgaW50IHZlcmJvc2UpCit7CisJaW50IHNpemUsIG5hbWVsZW4sIHBvczsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlOworCXVuc2lnbmVkIGNlX29wdGlvbiA9IENFX01BVENIX0lHTk9SRV9WQUxJRHxDRV9NQVRDSF9SQUNZX0lTX0RJUlRZOworCisJaWYgKGxzdGF0KHBhdGgsICZzdCkpCisJCWRpZSgiJXM6IHVuYWJsZSB0byBzdGF0ICglcykiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworCisJaWYgKCFTX0lTUkVHKHN0LnN0X21vZGUpICYmICFTX0lTTE5LKHN0LnN0X21vZGUpICYmICFTX0lTRElSKHN0LnN0X21vZGUpKQorCQlkaWUoIiVzOiBjYW4gb25seSBhZGQgcmVndWxhciBmaWxlcywgc3ltYm9saWMgbGlua3Mgb3IgZ2l0LWRpcmVjdG9yaWVzIiwgcGF0aCk7CisKKwluYW1lbGVuID0gc3RybGVuKHBhdGgpOworCWlmIChTX0lTRElSKHN0LnN0X21vZGUpKSB7CisJCXdoaWxlIChuYW1lbGVuICYmIHBhdGhbbmFtZWxlbi0xXSA9PSAnLycpCisJCQluYW1lbGVuLS07CisJfQorCXNpemUgPSBjYWNoZV9lbnRyeV9zaXplKG5hbWVsZW4pOworCWNlID0geGNhbGxvYygxLCBzaXplKTsKKwltZW1jcHkoY2UtPm5hbWUsIHBhdGgsIG5hbWVsZW4pOworCWNlLT5jZV9mbGFncyA9IG5hbWVsZW47CisJZmlsbF9zdGF0X2NhY2hlX2luZm8oY2UsICZzdCk7CisKKwlpZiAodHJ1c3RfZXhlY3V0YWJsZV9iaXQgJiYgaGFzX3N5bWxpbmtzKQorCQljZS0+Y2VfbW9kZSA9IGNyZWF0ZV9jZV9tb2RlKHN0LnN0X21vZGUpOworCWVsc2UgeworCQkvKiBJZiB0aGVyZSBpcyBhbiBleGlzdGluZyBlbnRyeSwgcGljayB0aGUgbW9kZSBiaXRzIGFuZCB0eXBlCisJCSAqIGZyb20gaXQsIG90aGVyd2lzZSBhc3N1bWUgdW5leGVjdXRhYmxlIHJlZ3VsYXIgZmlsZS4KKwkJICovCisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqZW50OworCQlpbnQgcG9zID0gaW5kZXhfbmFtZV9wb3NfYWxzb191bm1lcmdlZChpc3RhdGUsIHBhdGgsIG5hbWVsZW4pOworCisJCWVudCA9ICgwIDw9IHBvcykgPyBpc3RhdGUtPmNhY2hlW3Bvc10gOiBOVUxMOworCQljZS0+Y2VfbW9kZSA9IGNlX21vZGVfZnJvbV9zdGF0KGVudCwgc3Quc3RfbW9kZSk7CisJfQorCisJcG9zID0gaW5kZXhfbmFtZV9wb3MoaXN0YXRlLCBjZS0+bmFtZSwgbmFtZWxlbik7CisJaWYgKDAgPD0gcG9zICYmCisJICAgICFjZV9zdGFnZShpc3RhdGUtPmNhY2hlW3Bvc10pICYmCisJICAgICFpZV9tYXRjaF9zdGF0KGlzdGF0ZSwgaXN0YXRlLT5jYWNoZVtwb3NdLCAmc3QsIGNlX29wdGlvbikpIHsKKwkJLyogTm90aGluZyBjaGFuZ2VkLCByZWFsbHkgKi8KKwkJZnJlZShjZSk7CisJCWNlX21hcmtfdXB0b2RhdGUoaXN0YXRlLT5jYWNoZVtwb3NdKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGluZGV4X3BhdGgoY2UtPnNoYTEsIHBhdGgsICZzdCwgMSkpCisJCWRpZSgidW5hYmxlIHRvIGluZGV4IGZpbGUgJXMiLCBwYXRoKTsKKwlpZiAoYWRkX2luZGV4X2VudHJ5KGlzdGF0ZSwgY2UsIEFERF9DQUNIRV9PS19UT19BRER8QUREX0NBQ0hFX09LX1RPX1JFUExBQ0UpKQorCQlkaWUoInVuYWJsZSB0byBhZGQgJXMgdG8gaW5kZXgiLHBhdGgpOworCWlmICh2ZXJib3NlKQorCQlwcmludGYoImFkZCAnJXMnXG4iLCBwYXRoKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGNhY2hlX2VudHJ5ICptYWtlX2NhY2hlX2VudHJ5KHVuc2lnbmVkIGludCBtb2RlLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCBjaGFyICpwYXRoLCBpbnQgc3RhZ2UsCisJCWludCByZWZyZXNoKQoreworCWludCBzaXplLCBsZW47CisJc3RydWN0IGNhY2hlX2VudHJ5ICpjZTsKKworCWlmICghdmVyaWZ5X3BhdGgocGF0aCkpCisJCXJldHVybiBOVUxMOworCisJbGVuID0gc3RybGVuKHBhdGgpOworCXNpemUgPSBjYWNoZV9lbnRyeV9zaXplKGxlbik7CisJY2UgPSB4Y2FsbG9jKDEsIHNpemUpOworCisJaGFzaGNweShjZS0+c2hhMSwgc2hhMSk7CisJbWVtY3B5KGNlLT5uYW1lLCBwYXRoLCBsZW4pOworCWNlLT5jZV9mbGFncyA9IGNyZWF0ZV9jZV9mbGFncyhsZW4sIHN0YWdlKTsKKwljZS0+Y2VfbW9kZSA9IGNyZWF0ZV9jZV9tb2RlKG1vZGUpOworCisJaWYgKHJlZnJlc2gpCisJCXJldHVybiByZWZyZXNoX2NhY2hlX2VudHJ5KGNlLCAwKTsKKworCXJldHVybiBjZTsKK30KKworaW50IGNlX3NhbWVfbmFtZShzdHJ1Y3QgY2FjaGVfZW50cnkgKmEsIHN0cnVjdCBjYWNoZV9lbnRyeSAqYikKK3sKKwlpbnQgbGVuID0gY2VfbmFtZWxlbihhKTsKKwlyZXR1cm4gY2VfbmFtZWxlbihiKSA9PSBsZW4gJiYgIW1lbWNtcChhLT5uYW1lLCBiLT5uYW1lLCBsZW4pOworfQorCitpbnQgY2VfcGF0aF9tYXRjaChjb25zdCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBjb25zdCBjaGFyICoqcGF0aHNwZWMpCit7CisJY29uc3QgY2hhciAqbWF0Y2gsICpuYW1lOworCWludCBsZW47CisKKwlpZiAoIXBhdGhzcGVjKQorCQlyZXR1cm4gMTsKKworCWxlbiA9IGNlX25hbWVsZW4oY2UpOworCW5hbWUgPSBjZS0+bmFtZTsKKwl3aGlsZSAoKG1hdGNoID0gKnBhdGhzcGVjKyspICE9IE5VTEwpIHsKKwkJaW50IG1hdGNobGVuID0gc3RybGVuKG1hdGNoKTsKKwkJaWYgKG1hdGNobGVuID4gbGVuKQorCQkJY29udGludWU7CisJCWlmIChtZW1jbXAobmFtZSwgbWF0Y2gsIG1hdGNobGVuKSkKKwkJCWNvbnRpbnVlOworCQlpZiAobWF0Y2hsZW4gJiYgbmFtZVttYXRjaGxlbi0xXSA9PSAnLycpCisJCQlyZXR1cm4gMTsKKwkJaWYgKG5hbWVbbWF0Y2hsZW5dID09ICcvJyB8fCAhbmFtZVttYXRjaGxlbl0pCisJCQlyZXR1cm4gMTsKKwkJaWYgKCFtYXRjaGxlbikKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdlIGZ1bmRhbWVudGFsbHkgZG9uJ3QgbGlrZSBzb21lIHBhdGhzOiB3ZSBkb24ndCB3YW50CisgKiBkb3Qgb3IgZG90LWRvdCBhbnl3aGVyZSwgYW5kIGZvciBvYnZpb3VzIHJlYXNvbnMgZG9uJ3QKKyAqIHdhbnQgdG8gcmVjdXJzZSBpbnRvICIuZ2l0IiBlaXRoZXIuCisgKgorICogQWxzbywgd2UgZG9uJ3Qgd2FudCBkb3VibGUgc2xhc2hlcyBvciBzbGFzaGVzIGF0IHRoZQorICogZW5kIHRoYXQgY2FuIG1ha2UgcGF0aG5hbWVzIGFtYmlndW91cy4KKyAqLworc3RhdGljIGludCB2ZXJpZnlfZG90ZmlsZShjb25zdCBjaGFyICpyZXN0KQoreworCS8qCisJICogVGhlIGZpcnN0IGNoYXJhY3RlciB3YXMgJy4nLCBidXQgdGhhdAorCSAqIGhhcyBhbHJlYWR5IGJlZW4gZGlzY2FyZGVkLCB3ZSBub3cgdGVzdAorCSAqIHRoZSByZXN0LgorCSAqLworCXN3aXRjaCAoKnJlc3QpIHsKKwkvKiAiLiIgaXMgbm90IGFsbG93ZWQgKi8KKwljYXNlICdcMCc6IGNhc2UgJy8nOgorCQlyZXR1cm4gMDsKKworCS8qCisJICogIi5naXQiIGZvbGxvd2VkIGJ5ICBOVUwgb3Igc2xhc2ggaXMgYmFkLiBUaGlzCisJICogc2hhcmVzIHRoZSBwYXRoIGVuZCB0ZXN0IHdpdGggdGhlICIuLiIgY2FzZS4KKwkgKi8KKwljYXNlICdnJzoKKwkJaWYgKHJlc3RbMV0gIT0gJ2knKQorCQkJYnJlYWs7CisJCWlmIChyZXN0WzJdICE9ICd0JykKKwkJCWJyZWFrOworCQlyZXN0ICs9IDI7CisJLyogZmFsbHRocm91Z2ggKi8KKwljYXNlICcuJzoKKwkJaWYgKHJlc3RbMV0gPT0gJ1wwJyB8fCByZXN0WzFdID09ICcvJykKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworaW50IHZlcmlmeV9wYXRoKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJY2hhciBjOworCisJZ290byBpbnNpZGU7CisJZm9yICg7OykgeworCQlpZiAoIWMpCisJCQlyZXR1cm4gMTsKKwkJaWYgKGMgPT0gJy8nKSB7CitpbnNpZGU6CisJCQljID0gKnBhdGgrKzsKKwkJCXN3aXRjaCAoYykgeworCQkJZGVmYXVsdDoKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgJy8nOiBjYXNlICdcMCc6CisJCQkJYnJlYWs7CisJCQljYXNlICcuJzoKKwkJCQlpZiAodmVyaWZ5X2RvdGZpbGUocGF0aCkpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwkJYyA9ICpwYXRoKys7CisJfQorfQorCisvKgorICogRG8gd2UgaGF2ZSBhbm90aGVyIGZpbGUgdGhhdCBoYXMgdGhlIGJlZ2lubmluZyBjb21wb25lbnRzIGJlaW5nIGEKKyAqIHByb3BlciBzdXBlcnNldCBvZiB0aGUgbmFtZSB3ZSdyZSB0cnlpbmcgdG8gYWRkPworICovCitzdGF0aWMgaW50IGhhc19maWxlX25hbWUoc3RydWN0IGluZGV4X3N0YXRlICppc3RhdGUsCisJCQkgY29uc3Qgc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgaW50IHBvcywgaW50IG9rX3RvX3JlcGxhY2UpCit7CisJaW50IHJldHZhbCA9IDA7CisJaW50IGxlbiA9IGNlX25hbWVsZW4oY2UpOworCWludCBzdGFnZSA9IGNlX3N0YWdlKGNlKTsKKwljb25zdCBjaGFyICpuYW1lID0gY2UtPm5hbWU7CisKKwl3aGlsZSAocG9zIDwgaXN0YXRlLT5jYWNoZV9ucikgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKnAgPSBpc3RhdGUtPmNhY2hlW3BvcysrXTsKKworCQlpZiAobGVuID49IGNlX25hbWVsZW4ocCkpCisJCQlicmVhazsKKwkJaWYgKG1lbWNtcChuYW1lLCBwLT5uYW1lLCBsZW4pKQorCQkJYnJlYWs7CisJCWlmIChjZV9zdGFnZShwKSAhPSBzdGFnZSkKKwkJCWNvbnRpbnVlOworCQlpZiAocC0+bmFtZVtsZW5dICE9ICcvJykKKwkJCWNvbnRpbnVlOworCQlpZiAocC0+Y2VfZmxhZ3MgJiBDRV9SRU1PVkUpCisJCQljb250aW51ZTsKKwkJcmV0dmFsID0gLTE7CisJCWlmICghb2tfdG9fcmVwbGFjZSkKKwkJCWJyZWFrOworCQlyZW1vdmVfaW5kZXhfZW50cnlfYXQoaXN0YXRlLCAtLXBvcyk7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBEbyB3ZSBoYXZlIGFub3RoZXIgZmlsZSB3aXRoIGEgcGF0aG5hbWUgdGhhdCBpcyBhIHByb3BlcgorICogc3Vic2V0IG9mIHRoZSBuYW1lIHdlJ3JlIHRyeWluZyB0byBhZGQ/CisgKi8KK3N0YXRpYyBpbnQgaGFzX2Rpcl9uYW1lKHN0cnVjdCBpbmRleF9zdGF0ZSAqaXN0YXRlLAorCQkJY29uc3Qgc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgaW50IHBvcywgaW50IG9rX3RvX3JlcGxhY2UpCit7CisJaW50IHJldHZhbCA9IDA7CisJaW50IHN0YWdlID0gY2Vfc3RhZ2UoY2UpOworCWNvbnN0IGNoYXIgKm5hbWUgPSBjZS0+bmFtZTsKKwljb25zdCBjaGFyICpzbGFzaCA9IG5hbWUgKyBjZV9uYW1lbGVuKGNlKTsKKworCWZvciAoOzspIHsKKwkJaW50IGxlbjsKKworCQlmb3IgKDs7KSB7CisJCQlpZiAoKi0tc2xhc2ggPT0gJy8nKQorCQkJCWJyZWFrOworCQkJaWYgKHNsYXNoIDw9IGNlLT5uYW1lKQorCQkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJbGVuID0gc2xhc2ggLSBuYW1lOworCisJCXBvcyA9IGluZGV4X25hbWVfcG9zKGlzdGF0ZSwgbmFtZSwgY3JlYXRlX2NlX2ZsYWdzKGxlbiwgc3RhZ2UpKTsKKwkJaWYgKHBvcyA+PSAwKSB7CisJCQkvKgorCQkJICogRm91bmQgb25lLCBidXQgbm90IHNvIGZhc3QuICBUaGlzIGNvdWxkCisJCQkgKiBiZSBhIG1hcmtlciB0aGF0IHNheXMgIkkgd2FzIGhlcmUsIGJ1dAorCQkJICogSSBhbSBiZWluZyByZW1vdmVkIi4gIFN1Y2ggYW4gZW50cnkgaXMKKwkJCSAqIG5vdCBhIHBhcnQgb2YgdGhlIHJlc3VsdGluZyB0cmVlLCBhbmQKKwkJCSAqIGl0IGlzIE9rIHRvIGhhdmUgYSBkaXJlY3RvcnkgYXQgdGhlIHNhbWUKKwkJCSAqIHBhdGguCisJCQkgKi8KKwkJCWlmICghKGlzdGF0ZS0+Y2FjaGVbcG9zXS0+Y2VfZmxhZ3MgJiBDRV9SRU1PVkUpKSB7CisJCQkJcmV0dmFsID0gLTE7CisJCQkJaWYgKCFva190b19yZXBsYWNlKQorCQkJCQlicmVhazsKKwkJCQlyZW1vdmVfaW5kZXhfZW50cnlfYXQoaXN0YXRlLCBwb3MpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWVsc2UKKwkJCXBvcyA9IC1wb3MtMTsKKworCQkvKgorCQkgKiBUcml2aWFsIG9wdGltaXphdGlvbjogaWYgd2UgZmluZCBhbiBlbnRyeSB0aGF0CisJCSAqIGFscmVhZHkgbWF0Y2hlcyB0aGUgc3ViLWRpcmVjdG9yeSwgdGhlbiB3ZSBrbm93CisJCSAqIHdlJ3JlIG9rLCBhbmQgd2UgY2FuIGV4aXQuCisJCSAqLworCQl3aGlsZSAocG9zIDwgaXN0YXRlLT5jYWNoZV9ucikgeworCQkJc3RydWN0IGNhY2hlX2VudHJ5ICpwID0gaXN0YXRlLT5jYWNoZVtwb3NdOworCQkJaWYgKChjZV9uYW1lbGVuKHApIDw9IGxlbikgfHwKKwkJCSAgICAocC0+bmFtZVtsZW5dICE9ICcvJykgfHwKKwkJCSAgICBtZW1jbXAocC0+bmFtZSwgbmFtZSwgbGVuKSkKKwkJCQlicmVhazsgLyogbm90IG91ciBzdWJkaXJlY3RvcnkgKi8KKwkJCWlmIChjZV9zdGFnZShwKSA9PSBzdGFnZSAmJiAhKHAtPmNlX2ZsYWdzICYgQ0VfUkVNT1ZFKSkKKwkJCQkvKgorCQkJCSAqIHAgaXMgYXQgdGhlIHNhbWUgc3RhZ2UgYXMgb3VyIGVudHJ5LCBhbmQKKwkJCQkgKiBpcyBhIHN1YmRpcmVjdG9yeSBvZiB3aGF0IHdlIGFyZSBsb29raW5nCisJCQkJICogYXQsIHNvIHdlIGNhbm5vdCBoYXZlIGNvbmZsaWN0cyBhdCBvdXIKKwkJCQkgKiBsZXZlbCBvciBhbnl0aGluZyBzaG9ydGVyLgorCQkJCSAqLworCQkJCXJldHVybiByZXR2YWw7CisJCQlwb3MrKzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBXZSBtYXkgYmUgaW4gYSBzaXR1YXRpb24gd2hlcmUgd2UgYWxyZWFkeSBoYXZlIHBhdGgvZmlsZSBhbmQgcGF0aAorICogaXMgYmVpbmcgYWRkZWQsIG9yIHdlIGFscmVhZHkgaGF2ZSBwYXRoIGFuZCBwYXRoL2ZpbGUgaXMgYmVpbmcKKyAqIGFkZGVkLiAgRWl0aGVyIG9uZSB3b3VsZCByZXN1bHQgaW4gYSBub25zZW5zZSB0cmVlIHRoYXQgaGFzIHBhdGgKKyAqIHR3aWNlIHdoZW4gZ2l0LXdyaXRlLXRyZWUgdHJpZXMgdG8gd3JpdGUgaXQgb3V0LiAgUHJldmVudCBpdC4KKyAqCisgKiBJZiBvay10by1yZXBsYWNlIGlzIHNwZWNpZmllZCwgd2UgcmVtb3ZlIHRoZSBjb25mbGljdGluZyBlbnRyaWVzCisgKiBmcm9tIHRoZSBjYWNoZSBzbyB0aGUgY2FsbGVyIHNob3VsZCByZWNvbXB1dGUgdGhlIGluc2VydCBwb3NpdGlvbi4KKyAqIFdoZW4gdGhpcyBoYXBwZW5zLCB3ZSByZXR1cm4gbm9uLXplcm8uCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfZmlsZV9kaXJlY3RvcnlfY29uZmxpY3Qoc3RydWN0IGluZGV4X3N0YXRlICppc3RhdGUsCisJCQkJCSBjb25zdCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLAorCQkJCQkgaW50IHBvcywgaW50IG9rX3RvX3JlcGxhY2UpCit7CisJaW50IHJldHZhbDsKKworCS8qCisJICogV2hlbiBjZSBpcyBhbiAiSSBhbSBnb2luZyBhd2F5IiBlbnRyeSwgd2UgYWxsb3cgaXQgdG8gYmUgYWRkZWQKKwkgKi8KKwlpZiAoY2UtPmNlX2ZsYWdzICYgQ0VfUkVNT1ZFKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogV2UgY2hlY2sgaWYgdGhlIHBhdGggaXMgYSBzdWItcGF0aCBvZiBhIHN1YnNlcXVlbnQgcGF0aG5hbWUKKwkgKiBmaXJzdCwgc2luY2UgcmVtb3ZpbmcgdGhvc2Ugd2lsbCBub3QgY2hhbmdlIHRoZSBwb3NpdGlvbgorCSAqIGluIHRoZSBhcnJheS4KKwkgKi8KKwlyZXR2YWwgPSBoYXNfZmlsZV9uYW1lKGlzdGF0ZSwgY2UsIHBvcywgb2tfdG9fcmVwbGFjZSk7CisKKwkvKgorCSAqIFRoZW4gY2hlY2sgaWYgdGhlIHBhdGggbWlnaHQgaGF2ZSBhIGNsYXNoaW5nIHN1Yi1kaXJlY3RvcnkKKwkgKiBiZWZvcmUgaXQuCisJICovCisJcmV0dXJuIHJldHZhbCArIGhhc19kaXJfbmFtZShpc3RhdGUsIGNlLCBwb3MsIG9rX3RvX3JlcGxhY2UpOworfQorCitzdGF0aWMgaW50IGFkZF9pbmRleF9lbnRyeV93aXRoX2NoZWNrKHN0cnVjdCBpbmRleF9zdGF0ZSAqaXN0YXRlLCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBpbnQgb3B0aW9uKQoreworCWludCBwb3M7CisJaW50IG9rX3RvX2FkZCA9IG9wdGlvbiAmIEFERF9DQUNIRV9PS19UT19BREQ7CisJaW50IG9rX3RvX3JlcGxhY2UgPSBvcHRpb24gJiBBRERfQ0FDSEVfT0tfVE9fUkVQTEFDRTsKKwlpbnQgc2tpcF9kZl9jaGVjayA9IG9wdGlvbiAmIEFERF9DQUNIRV9TS0lQX0RGQ0hFQ0s7CisKKwljYWNoZV90cmVlX2ludmFsaWRhdGVfcGF0aChpc3RhdGUtPmNhY2hlX3RyZWUsIGNlLT5uYW1lKTsKKwlwb3MgPSBpbmRleF9uYW1lX3Bvcyhpc3RhdGUsIGNlLT5uYW1lLCBjZS0+Y2VfZmxhZ3MpOworCisJLyogZXhpc3RpbmcgbWF0Y2g/IEp1c3QgcmVwbGFjZSBpdC4gKi8KKwlpZiAocG9zID49IDApIHsKKwkJcmVwbGFjZV9pbmRleF9lbnRyeShpc3RhdGUsIHBvcywgY2UpOworCQlyZXR1cm4gMDsKKwl9CisJcG9zID0gLXBvcy0xOworCisJLyoKKwkgKiBJbnNlcnRpbmcgYSBtZXJnZWQgZW50cnkgKCJzdGFnZSAwIikgaW50byB0aGUgaW5kZXgKKwkgKiB3aWxsIGFsd2F5cyByZXBsYWNlIGFsbCBub24tbWVyZ2VkIGVudHJpZXMuLgorCSAqLworCWlmIChwb3MgPCBpc3RhdGUtPmNhY2hlX25yICYmIGNlX3N0YWdlKGNlKSA9PSAwKSB7CisJCXdoaWxlIChjZV9zYW1lX25hbWUoaXN0YXRlLT5jYWNoZVtwb3NdLCBjZSkpIHsKKwkJCW9rX3RvX2FkZCA9IDE7CisJCQlpZiAoIXJlbW92ZV9pbmRleF9lbnRyeV9hdChpc3RhdGUsIHBvcykpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIW9rX3RvX2FkZCkKKwkJcmV0dXJuIC0xOworCWlmICghdmVyaWZ5X3BhdGgoY2UtPm5hbWUpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIXNraXBfZGZfY2hlY2sgJiYKKwkgICAgY2hlY2tfZmlsZV9kaXJlY3RvcnlfY29uZmxpY3QoaXN0YXRlLCBjZSwgcG9zLCBva190b19yZXBsYWNlKSkgeworCQlpZiAoIW9rX3RvX3JlcGxhY2UpCisJCQlyZXR1cm4gZXJyb3IoIiclcycgYXBwZWFycyBhcyBib3RoIGEgZmlsZSBhbmQgYXMgYSBkaXJlY3RvcnkiLAorCQkJCSAgICAgY2UtPm5hbWUpOworCQlwb3MgPSBpbmRleF9uYW1lX3Bvcyhpc3RhdGUsIGNlLT5uYW1lLCBjZS0+Y2VfZmxhZ3MpOworCQlwb3MgPSAtcG9zLTE7CisJfQorCXJldHVybiBwb3MgKyAxOworfQorCitpbnQgYWRkX2luZGV4X2VudHJ5KHN0cnVjdCBpbmRleF9zdGF0ZSAqaXN0YXRlLCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBpbnQgb3B0aW9uKQoreworCWludCBwb3M7CisKKwlpZiAob3B0aW9uICYgQUREX0NBQ0hFX0pVU1RfQVBQRU5EKQorCQlwb3MgPSBpc3RhdGUtPmNhY2hlX25yOworCWVsc2UgeworCQlpbnQgcmV0OworCQlyZXQgPSBhZGRfaW5kZXhfZW50cnlfd2l0aF9jaGVjayhpc3RhdGUsIGNlLCBvcHRpb24pOworCQlpZiAocmV0IDw9IDApCisJCQlyZXR1cm4gcmV0OworCQlwb3MgPSByZXQgLSAxOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGUgYXJyYXkgaXMgYmlnIGVub3VnaCAuLiAqLworCWlmIChpc3RhdGUtPmNhY2hlX25yID09IGlzdGF0ZS0+Y2FjaGVfYWxsb2MpIHsKKwkJaXN0YXRlLT5jYWNoZV9hbGxvYyA9IGFsbG9jX25yKGlzdGF0ZS0+Y2FjaGVfYWxsb2MpOworCQlpc3RhdGUtPmNhY2hlID0geHJlYWxsb2MoaXN0YXRlLT5jYWNoZSwKKwkJCQkJaXN0YXRlLT5jYWNoZV9hbGxvYyAqIHNpemVvZihzdHJ1Y3QgY2FjaGVfZW50cnkgKikpOworCX0KKworCS8qIEFkZCBpdCBpbi4uICovCisJaXN0YXRlLT5jYWNoZV9ucisrOworCWlmIChpc3RhdGUtPmNhY2hlX25yID4gcG9zICsgMSkKKwkJbWVtbW92ZShpc3RhdGUtPmNhY2hlICsgcG9zICsgMSwKKwkJCWlzdGF0ZS0+Y2FjaGUgKyBwb3MsCisJCQkoaXN0YXRlLT5jYWNoZV9uciAtIHBvcyAtIDEpICogc2l6ZW9mKGNlKSk7CisJc2V0X2luZGV4X2VudHJ5KGlzdGF0ZSwgcG9zLCBjZSk7CisJaXN0YXRlLT5jYWNoZV9jaGFuZ2VkID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICJyZWZyZXNoIiBkb2VzIG5vdCBjYWxjdWxhdGUgYSBuZXcgc2hhMSBmaWxlIG9yIGJyaW5nIHRoZQorICogY2FjaGUgdXAtdG8tZGF0ZSBmb3IgbW9kZS9jb250ZW50IGNoYW5nZXMuIEJ1dCB3aGF0IGl0CisgKiBfZG9lc18gZG8gaXMgdG8gInJlLW1hdGNoIiB0aGUgc3RhdCBpbmZvcm1hdGlvbiBvZiBhIGZpbGUKKyAqIHdpdGggdGhlIGNhY2hlLCBzbyB0aGF0IHlvdSBjYW4gcmVmcmVzaCB0aGUgY2FjaGUgZm9yIGEKKyAqIGZpbGUgdGhhdCBoYXNuJ3QgYmVlbiBjaGFuZ2VkIGJ1dCB3aGVyZSB0aGUgc3RhdCBlbnRyeSBpcworICogb3V0IG9mIGRhdGUuCisgKgorICogRm9yIGV4YW1wbGUsIHlvdSdkIHdhbnQgdG8gZG8gdGhpcyBhZnRlciBkb2luZyBhICJnaXQtcmVhZC10cmVlIiwKKyAqIHRvIGxpbmsgdXAgdGhlIHN0YXQgY2FjaGUgZGV0YWlscyB3aXRoIHRoZSBwcm9wZXIgZmlsZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2FjaGVfZW50cnkgKnJlZnJlc2hfY2FjaGVfZW50KHN0cnVjdCBpbmRleF9zdGF0ZSAqaXN0YXRlLAorCQkJCQkgICAgIHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IG9wdGlvbnMsIGludCAqZXJyKQoreworCXN0cnVjdCBzdGF0IHN0OworCXN0cnVjdCBjYWNoZV9lbnRyeSAqdXBkYXRlZDsKKwlpbnQgY2hhbmdlZCwgc2l6ZTsKKwlpbnQgaWdub3JlX3ZhbGlkID0gb3B0aW9ucyAmIENFX01BVENIX0lHTk9SRV9WQUxJRDsKKworCWlmIChjZV91cHRvZGF0ZShjZSkpCisJCXJldHVybiBjZTsKKworCWlmIChsc3RhdChjZS0+bmFtZSwgJnN0KSA8IDApIHsKKwkJaWYgKGVycikKKwkJCSplcnIgPSBlcnJubzsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY2hhbmdlZCA9IGllX21hdGNoX3N0YXQoaXN0YXRlLCBjZSwgJnN0LCBvcHRpb25zKTsKKwlpZiAoIWNoYW5nZWQpIHsKKwkJLyoKKwkJICogVGhlIHBhdGggaXMgdW5jaGFuZ2VkLiAgSWYgd2Ugd2VyZSB0b2xkIHRvIGlnbm9yZQorCQkgKiB2YWxpZCBiaXQsIHRoZW4gd2UgZGlkIHRoZSBhY3R1YWwgc3RhdCBjaGVjayBhbmQKKwkJICogZm91bmQgdGhhdCB0aGUgZW50cnkgaXMgdW5tb2RpZmllZC4gIElmIHRoZSBlbnRyeQorCQkgKiBpcyBub3QgbWFya2VkIFZBTElELCB0aGlzIGlzIHRoZSBwbGFjZSB0byBtYXJrIGl0CisJCSAqIHZhbGlkIGFnYWluLCB1bmRlciAiYXNzdW1lIHVuY2hhbmdlZCIgbW9kZS4KKwkJICovCisJCWlmIChpZ25vcmVfdmFsaWQgJiYgYXNzdW1lX3VuY2hhbmdlZCAmJgorCQkgICAgIShjZS0+Y2VfZmxhZ3MgJiBDRV9WQUxJRCkpCisJCQk7IC8qIG1hcmsgdGhpcyBvbmUgVkFMSUQgYWdhaW4gKi8KKwkJZWxzZSB7CisJCQkvKgorCQkJICogV2UgZG8gbm90IG1hcmsgdGhlIGluZGV4IGl0c2VsZiAibW9kaWZpZWQiCisJCQkgKiBiZWNhdXNlIENFX1VQVE9EQVRFIGZsYWcgaXMgaW4tY29yZSBvbmx5OworCQkJICogd2UgYXJlIG5vdCBnb2luZyB0byB3cml0ZSB0aGlzIGNoYW5nZSBvdXQuCisJCQkgKi8KKwkJCWNlX21hcmtfdXB0b2RhdGUoY2UpOworCQkJcmV0dXJuIGNlOworCQl9CisJfQorCisJaWYgKGllX21vZGlmaWVkKGlzdGF0ZSwgY2UsICZzdCwgb3B0aW9ucykpIHsKKwkJaWYgKGVycikKKwkJCSplcnIgPSBFSU5WQUw7CisJCXJldHVybiBOVUxMOworCX0KKworCXNpemUgPSBjZV9zaXplKGNlKTsKKwl1cGRhdGVkID0geG1hbGxvYyhzaXplKTsKKwltZW1jcHkodXBkYXRlZCwgY2UsIHNpemUpOworCWZpbGxfc3RhdF9jYWNoZV9pbmZvKHVwZGF0ZWQsICZzdCk7CisJLyoKKwkgKiBJZiBpZ25vcmVfdmFsaWQgaXMgbm90IHNldCwgd2Ugc2hvdWxkIGxlYXZlIENFX1ZBTElEIGJpdAorCSAqIGFsb25lLiAgT3RoZXJ3aXNlLCBwYXRocyBtYXJrZWQgd2l0aCAtLW5vLWFzc3VtZS11bmNoYW5nZWQKKwkgKiAoaS5lLiB0aGluZ3MgdG8gYmUgZWRpdGVkKSB3aWxsIHJlYWNxdWlyZSBDRV9WQUxJRCBiaXQKKwkgKiBhdXRvbWF0aWNhbGx5LCB3aGljaCBpcyBub3QgcmVhbGx5IHdoYXQgd2Ugd2FudC4KKwkgKi8KKwlpZiAoIWlnbm9yZV92YWxpZCAmJiBhc3N1bWVfdW5jaGFuZ2VkICYmCisJICAgICEoY2UtPmNlX2ZsYWdzICYgQ0VfVkFMSUQpKQorCQl1cGRhdGVkLT5jZV9mbGFncyAmPSB+Q0VfVkFMSUQ7CisKKwlyZXR1cm4gdXBkYXRlZDsKK30KKworaW50IHJlZnJlc2hfaW5kZXgoc3RydWN0IGluZGV4X3N0YXRlICppc3RhdGUsIHVuc2lnbmVkIGludCBmbGFncywgY29uc3QgY2hhciAqKnBhdGhzcGVjLCBjaGFyICpzZWVuKQoreworCWludCBpOworCWludCBoYXNfZXJyb3JzID0gMDsKKwlpbnQgcmVhbGx5ID0gKGZsYWdzICYgUkVGUkVTSF9SRUFMTFkpICE9IDA7CisJaW50IGFsbG93X3VubWVyZ2VkID0gKGZsYWdzICYgUkVGUkVTSF9VTk1FUkdFRCkgIT0gMDsKKwlpbnQgcXVpZXQgPSAoZmxhZ3MgJiBSRUZSRVNIX1FVSUVUKSAhPSAwOworCWludCBub3RfbmV3ID0gKGZsYWdzICYgUkVGUkVTSF9JR05PUkVfTUlTU0lORykgIT0gMDsKKwl1bnNpZ25lZCBpbnQgb3B0aW9ucyA9IHJlYWxseSA/IENFX01BVENIX0lHTk9SRV9WQUxJRCA6IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgaXN0YXRlLT5jYWNoZV9ucjsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsICpuZXc7CisJCWludCBjYWNoZV9lcnJubyA9IDA7CisKKwkJY2UgPSBpc3RhdGUtPmNhY2hlW2ldOworCQlpZiAoY2Vfc3RhZ2UoY2UpKSB7CisJCQl3aGlsZSAoKGkgPCBpc3RhdGUtPmNhY2hlX25yKSAmJgorCQkJICAgICAgICEgc3RyY21wKGlzdGF0ZS0+Y2FjaGVbaV0tPm5hbWUsIGNlLT5uYW1lKSkKKwkJCQlpKys7CisJCQlpLS07CisJCQlpZiAoYWxsb3dfdW5tZXJnZWQpCisJCQkJY29udGludWU7CisJCQlwcmludGYoIiVzOiBuZWVkcyBtZXJnZVxuIiwgY2UtPm5hbWUpOworCQkJaGFzX2Vycm9ycyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChwYXRoc3BlYyAmJiAhbWF0Y2hfcGF0aHNwZWMocGF0aHNwZWMsIGNlLT5uYW1lLCBzdHJsZW4oY2UtPm5hbWUpLCAwLCBzZWVuKSkKKwkJCWNvbnRpbnVlOworCisJCW5ldyA9IHJlZnJlc2hfY2FjaGVfZW50KGlzdGF0ZSwgY2UsIG9wdGlvbnMsICZjYWNoZV9lcnJubyk7CisJCWlmIChuZXcgPT0gY2UpCisJCQljb250aW51ZTsKKwkJaWYgKCFuZXcpIHsKKwkJCWlmIChub3RfbmV3ICYmIGNhY2hlX2Vycm5vID09IEVOT0VOVCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChyZWFsbHkgJiYgY2FjaGVfZXJybm8gPT0gRUlOVkFMKSB7CisJCQkJLyogSWYgd2UgYXJlIGRvaW5nIC0tcmVhbGx5LXJlZnJlc2ggdGhhdAorCQkJCSAqIG1lYW5zIHRoZSBpbmRleCBpcyBub3QgdmFsaWQgYW55bW9yZS4KKwkJCQkgKi8KKwkJCQljZS0+Y2VfZmxhZ3MgJj0gfkNFX1ZBTElEOworCQkJCWlzdGF0ZS0+Y2FjaGVfY2hhbmdlZCA9IDE7CisJCQl9CisJCQlpZiAocXVpZXQpCisJCQkJY29udGludWU7CisJCQlwcmludGYoIiVzOiBuZWVkcyB1cGRhdGVcbiIsIGNlLT5uYW1lKTsKKwkJCWhhc19lcnJvcnMgPSAxOworCQkJY29udGludWU7CisJCX0KKworCQlyZXBsYWNlX2luZGV4X2VudHJ5KGlzdGF0ZSwgaSwgbmV3KTsKKwl9CisJcmV0dXJuIGhhc19lcnJvcnM7Cit9CisKK3N0cnVjdCBjYWNoZV9lbnRyeSAqcmVmcmVzaF9jYWNoZV9lbnRyeShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBpbnQgcmVhbGx5KQoreworCXJldHVybiByZWZyZXNoX2NhY2hlX2VudCgmdGhlX2luZGV4LCBjZSwgcmVhbGx5LCBOVUxMKTsKK30KKworc3RhdGljIGludCB2ZXJpZnlfaGRyKHN0cnVjdCBjYWNoZV9oZWFkZXIgKmhkciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCVNIQV9DVFggYzsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCisJaWYgKGhkci0+aGRyX3NpZ25hdHVyZSAhPSBodG9ubChDQUNIRV9TSUdOQVRVUkUpKQorCQlyZXR1cm4gZXJyb3IoImJhZCBzaWduYXR1cmUiKTsKKwlpZiAoaGRyLT5oZHJfdmVyc2lvbiAhPSBodG9ubCgyKSkKKwkJcmV0dXJuIGVycm9yKCJiYWQgaW5kZXggdmVyc2lvbiIpOworCVNIQTFfSW5pdCgmYyk7CisJU0hBMV9VcGRhdGUoJmMsIGhkciwgc2l6ZSAtIDIwKTsKKwlTSEExX0ZpbmFsKHNoYTEsICZjKTsKKwlpZiAoaGFzaGNtcChzaGExLCAodW5zaWduZWQgY2hhciAqKWhkciArIHNpemUgLSAyMCkpCisJCXJldHVybiBlcnJvcigiYmFkIGluZGV4IGZpbGUgc2hhMSBzaWduYXR1cmUiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX2luZGV4X2V4dGVuc2lvbihzdHJ1Y3QgaW5kZXhfc3RhdGUgKmlzdGF0ZSwKKwkJCQljb25zdCBjaGFyICpleHQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc3opCit7CisJc3dpdGNoIChDQUNIRV9FWFQoZXh0KSkgeworCWNhc2UgQ0FDSEVfRVhUX1RSRUU6CisJCWlzdGF0ZS0+Y2FjaGVfdHJlZSA9IGNhY2hlX3RyZWVfcmVhZChkYXRhLCBzeik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmICgqZXh0IDwgJ0EnIHx8ICdaJyA8ICpleHQpCisJCQlyZXR1cm4gZXJyb3IoImluZGV4IHVzZXMgJS40cyBleHRlbnNpb24sIHdoaWNoIHdlIGRvIG5vdCB1bmRlcnN0YW5kIiwKKwkJCQkgICAgIGV4dCk7CisJCWZwcmludGYoc3RkZXJyLCAiaWdub3JpbmcgJS40cyBleHRlbnNpb25cbiIsIGV4dCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHJlYWRfaW5kZXgoc3RydWN0IGluZGV4X3N0YXRlICppc3RhdGUpCit7CisJcmV0dXJuIHJlYWRfaW5kZXhfZnJvbShpc3RhdGUsIGdldF9pbmRleF9maWxlKCkpOworfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0X2Zyb21fZGlzayhzdHJ1Y3Qgb25kaXNrX2NhY2hlX2VudHJ5ICpvbmRpc2ssIHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UpCit7CisJc2l6ZV90IGxlbjsKKworCWNlLT5jZV9jdGltZSA9IG50b2hsKG9uZGlzay0+Y3RpbWUuc2VjKTsKKwljZS0+Y2VfbXRpbWUgPSBudG9obChvbmRpc2stPm10aW1lLnNlYyk7CisJY2UtPmNlX2RldiAgID0gbnRvaGwob25kaXNrLT5kZXYpOworCWNlLT5jZV9pbm8gICA9IG50b2hsKG9uZGlzay0+aW5vKTsKKwljZS0+Y2VfbW9kZSAgPSBudG9obChvbmRpc2stPm1vZGUpOworCWNlLT5jZV91aWQgICA9IG50b2hsKG9uZGlzay0+dWlkKTsKKwljZS0+Y2VfZ2lkICAgPSBudG9obChvbmRpc2stPmdpZCk7CisJY2UtPmNlX3NpemUgID0gbnRvaGwob25kaXNrLT5zaXplKTsKKwkvKiBPbi1kaXNrIGZsYWdzIGFyZSBqdXN0IDE2IGJpdHMgKi8KKwljZS0+Y2VfZmxhZ3MgPSBudG9ocyhvbmRpc2stPmZsYWdzKTsKKwloYXNoY3B5KGNlLT5zaGExLCBvbmRpc2stPnNoYTEpOworCisJbGVuID0gY2UtPmNlX2ZsYWdzICYgQ0VfTkFNRU1BU0s7CisJaWYgKGxlbiA9PSBDRV9OQU1FTUFTSykKKwkJbGVuID0gc3RybGVuKG9uZGlzay0+bmFtZSk7CisJLyoKKwkgKiBORUVEU1dPUks6IElmIHRoZSBvcmlnaW5hbCBpbmRleCBpcyBjcmFmdGVkLCB0aGlzIGNvcHkgY291bGQKKwkgKiBnbyB1bmNoZWNrZWQuCisJICovCisJbWVtY3B5KGNlLT5uYW1lLCBvbmRpc2stPm5hbWUsIGxlbiArIDEpOworfQorCitzdGF0aWMgaW5saW5lIHNpemVfdCBlc3RpbWF0ZV9jYWNoZV9zaXplKHNpemVfdCBvbmRpc2tfc2l6ZSwgdW5zaWduZWQgaW50IGVudHJpZXMpCit7CisJbG9uZyBwZXJfZW50cnk7CisKKwlwZXJfZW50cnkgPSBzaXplb2Yoc3RydWN0IGNhY2hlX2VudHJ5KSAtIHNpemVvZihzdHJ1Y3Qgb25kaXNrX2NhY2hlX2VudHJ5KTsKKworCS8qCisJICogQWxpZ25tZW50IGNhbiBjYXVzZSBkaWZmZXJlbmNlcy4gVGhpcyBzaG91bGQgYmUgImFsaWdub2YiLCBidXQKKwkgKiBzaW5jZSB0aGF0J3MgYSBnY2MnaXNtLCBqdXN0IHVzZSB0aGUgc2l6ZSBvZiBhIHBvaW50ZXIuCisJICovCisJcGVyX2VudHJ5ICs9IHNpemVvZih2b2lkICopOworCXJldHVybiBvbmRpc2tfc2l6ZSArIGVudHJpZXMqcGVyX2VudHJ5OworfQorCisvKiByZW1lbWJlciB0byBkaXNjYXJkX2NhY2hlKCkgYmVmb3JlIHJlYWRpbmcgYSBkaWZmZXJlbnQgY2FjaGUhICovCitpbnQgcmVhZF9pbmRleF9mcm9tKHN0cnVjdCBpbmRleF9zdGF0ZSAqaXN0YXRlLCBjb25zdCBjaGFyICpwYXRoKQoreworCWludCBmZCwgaTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwl1bnNpZ25lZCBsb25nIHNyY19vZmZzZXQsIGRzdF9vZmZzZXQ7CisJc3RydWN0IGNhY2hlX2hlYWRlciAqaGRyOworCXZvaWQgKm1tYXA7CisJc2l6ZV90IG1tYXBfc2l6ZTsKKworCWVycm5vID0gRUJVU1k7CisJaWYgKGlzdGF0ZS0+YWxsb2MpCisJCXJldHVybiBpc3RhdGUtPmNhY2hlX25yOworCisJZXJybm8gPSBFTk9FTlQ7CisJaXN0YXRlLT50aW1lc3RhbXAgPSAwOworCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkgeworCQlpZiAoZXJybm8gPT0gRU5PRU5UKQorCQkJcmV0dXJuIDA7CisJCWRpZSgiaW5kZXggZmlsZSBvcGVuIGZhaWxlZCAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisKKwlpZiAoZnN0YXQoZmQsICZzdCkpCisJCWRpZSgiY2Fubm90IHN0YXQgdGhlIG9wZW4gaW5kZXggKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CisKKwllcnJubyA9IEVJTlZBTDsKKwltbWFwX3NpemUgPSB4c2l6ZV90KHN0LnN0X3NpemUpOworCWlmIChtbWFwX3NpemUgPCBzaXplb2Yoc3RydWN0IGNhY2hlX2hlYWRlcikgKyAyMCkKKwkJZGllKCJpbmRleCBmaWxlIHNtYWxsZXIgdGhhbiBleHBlY3RlZCIpOworCisJbW1hcCA9IHhtbWFwKE5VTEwsIG1tYXBfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwljbG9zZShmZCk7CisJaWYgKG1tYXAgPT0gTUFQX0ZBSUxFRCkKKwkJZGllKCJ1bmFibGUgdG8gbWFwIGluZGV4IGZpbGUiKTsKKworCWhkciA9IG1tYXA7CisJaWYgKHZlcmlmeV9oZHIoaGRyLCBtbWFwX3NpemUpIDwgMCkKKwkJZ290byB1bm1hcDsKKworCWlzdGF0ZS0+Y2FjaGVfbnIgPSBudG9obChoZHItPmhkcl9lbnRyaWVzKTsKKwlpc3RhdGUtPmNhY2hlX2FsbG9jID0gYWxsb2NfbnIoaXN0YXRlLT5jYWNoZV9ucik7CisJaXN0YXRlLT5jYWNoZSA9IHhjYWxsb2MoaXN0YXRlLT5jYWNoZV9hbGxvYywgc2l6ZW9mKHN0cnVjdCBjYWNoZV9lbnRyeSAqKSk7CisKKwkvKgorCSAqIFRoZSBkaXNrIGZvcm1hdCBpcyBhY3R1YWxseSBsYXJnZXIgdGhhbiB0aGUgaW4tbWVtb3J5IGZvcm1hdCwKKwkgKiBkdWUgdG8gc3BhY2UgZm9yIG5zZWMgZXRjLCBzbyBldmVuIHRob3VnaCB0aGUgaW4tbWVtb3J5IG9uZQorCSAqIGhhcyByb29tIGZvciBhIGZldyAgbW9yZSBmbGFncywgd2UgY2FuIGFsbG9jYXRlIHVzaW5nIHRoZSBzYW1lCisJICogaW5kZXggc2l6ZQorCSAqLworCWlzdGF0ZS0+YWxsb2MgPSB4bWFsbG9jKGVzdGltYXRlX2NhY2hlX3NpemUobW1hcF9zaXplLCBpc3RhdGUtPmNhY2hlX25yKSk7CisKKwlzcmNfb2Zmc2V0ID0gc2l6ZW9mKCpoZHIpOworCWRzdF9vZmZzZXQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBpc3RhdGUtPmNhY2hlX25yOyBpKyspIHsKKwkJc3RydWN0IG9uZGlza19jYWNoZV9lbnRyeSAqZGlza19jZTsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZTsKKworCQlkaXNrX2NlID0gKHN0cnVjdCBvbmRpc2tfY2FjaGVfZW50cnkgKikoKGNoYXIgKiltbWFwICsgc3JjX29mZnNldCk7CisJCWNlID0gKHN0cnVjdCBjYWNoZV9lbnRyeSAqKSgoY2hhciAqKWlzdGF0ZS0+YWxsb2MgKyBkc3Rfb2Zmc2V0KTsKKwkJY29udmVydF9mcm9tX2Rpc2soZGlza19jZSwgY2UpOworCQlzZXRfaW5kZXhfZW50cnkoaXN0YXRlLCBpLCBjZSk7CisKKwkJc3JjX29mZnNldCArPSBvbmRpc2tfY2Vfc2l6ZShjZSk7CisJCWRzdF9vZmZzZXQgKz0gY2Vfc2l6ZShjZSk7CisJfQorCWlzdGF0ZS0+dGltZXN0YW1wID0gc3Quc3RfbXRpbWU7CisJd2hpbGUgKHNyY19vZmZzZXQgPD0gbW1hcF9zaXplIC0gMjAgLSA4KSB7CisJCS8qIEFmdGVyIGFuIGFycmF5IG9mIGFjdGl2ZV9uciBpbmRleCBlbnRyaWVzLAorCQkgKiB0aGVyZSBjYW4gYmUgYXJiaXRyYXJ5IG51bWJlciBvZiBleHRlbmRlZAorCQkgKiBzZWN0aW9ucywgZWFjaCBvZiB3aGljaCBpcyBwcmVmaXhlZCB3aXRoCisJCSAqIGV4dGVuc2lvbiBuYW1lICg0LWJ5dGUpIGFuZCBzZWN0aW9uIGxlbmd0aAorCQkgKiBpbiA0LWJ5dGUgbmV0d29yayBieXRlIG9yZGVyLgorCQkgKi8KKwkJdW5zaWduZWQgbG9uZyBleHRzaXplOworCQltZW1jcHkoJmV4dHNpemUsIChjaGFyICopbW1hcCArIHNyY19vZmZzZXQgKyA0LCA0KTsKKwkJZXh0c2l6ZSA9IG50b2hsKGV4dHNpemUpOworCQlpZiAocmVhZF9pbmRleF9leHRlbnNpb24oaXN0YXRlLAorCQkJCQkgKGNvbnN0IGNoYXIgKikgbW1hcCArIHNyY19vZmZzZXQsCisJCQkJCSAoY2hhciAqKSBtbWFwICsgc3JjX29mZnNldCArIDgsCisJCQkJCSBleHRzaXplKSA8IDApCisJCQlnb3RvIHVubWFwOworCQlzcmNfb2Zmc2V0ICs9IDg7CisJCXNyY19vZmZzZXQgKz0gZXh0c2l6ZTsKKwl9CisJbXVubWFwKG1tYXAsIG1tYXBfc2l6ZSk7CisJcmV0dXJuIGlzdGF0ZS0+Y2FjaGVfbnI7CisKK3VubWFwOgorCW11bm1hcChtbWFwLCBtbWFwX3NpemUpOworCWVycm5vID0gRUlOVkFMOworCWRpZSgiaW5kZXggZmlsZSBjb3JydXB0Iik7Cit9CisKK2ludCBkaXNjYXJkX2luZGV4KHN0cnVjdCBpbmRleF9zdGF0ZSAqaXN0YXRlKQoreworCWlzdGF0ZS0+Y2FjaGVfbnIgPSAwOworCWlzdGF0ZS0+Y2FjaGVfY2hhbmdlZCA9IDA7CisJaXN0YXRlLT50aW1lc3RhbXAgPSAwOworCWZyZWVfaGFzaCgmaXN0YXRlLT5uYW1lX2hhc2gpOworCWNhY2hlX3RyZWVfZnJlZSgmKGlzdGF0ZS0+Y2FjaGVfdHJlZSkpOworCWZyZWUoaXN0YXRlLT5hbGxvYyk7CisJaXN0YXRlLT5hbGxvYyA9IE5VTEw7CisKKwkvKiBubyBuZWVkIHRvIHRocm93IGF3YXkgYWxsb2NhdGVkIGFjdGl2ZV9jYWNoZSAqLworCXJldHVybiAwOworfQorCitpbnQgdW5tZXJnZWRfaW5kZXgoY29uc3Qgc3RydWN0IGluZGV4X3N0YXRlICppc3RhdGUpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGlzdGF0ZS0+Y2FjaGVfbnI7IGkrKykgeworCQlpZiAoY2Vfc3RhZ2UoaXN0YXRlLT5jYWNoZVtpXSkpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgV1JJVEVfQlVGRkVSX1NJWkUgODE5Mgorc3RhdGljIHVuc2lnbmVkIGNoYXIgd3JpdGVfYnVmZmVyW1dSSVRFX0JVRkZFUl9TSVpFXTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdyaXRlX2J1ZmZlcl9sZW47CisKK3N0YXRpYyBpbnQgY2Vfd3JpdGVfZmx1c2goU0hBX0NUWCAqY29udGV4dCwgaW50IGZkKQoreworCXVuc2lnbmVkIGludCBidWZmZXJlZCA9IHdyaXRlX2J1ZmZlcl9sZW47CisJaWYgKGJ1ZmZlcmVkKSB7CisJCVNIQTFfVXBkYXRlKGNvbnRleHQsIHdyaXRlX2J1ZmZlciwgYnVmZmVyZWQpOworCQlpZiAod3JpdGVfaW5fZnVsbChmZCwgd3JpdGVfYnVmZmVyLCBidWZmZXJlZCkgIT0gYnVmZmVyZWQpCisJCQlyZXR1cm4gLTE7CisJCXdyaXRlX2J1ZmZlcl9sZW4gPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjZV93cml0ZShTSEFfQ1RYICpjb250ZXh0LCBpbnQgZmQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCit7CisJd2hpbGUgKGxlbikgeworCQl1bnNpZ25lZCBpbnQgYnVmZmVyZWQgPSB3cml0ZV9idWZmZXJfbGVuOworCQl1bnNpZ25lZCBpbnQgcGFydGlhbCA9IFdSSVRFX0JVRkZFUl9TSVpFIC0gYnVmZmVyZWQ7CisJCWlmIChwYXJ0aWFsID4gbGVuKQorCQkJcGFydGlhbCA9IGxlbjsKKwkJbWVtY3B5KHdyaXRlX2J1ZmZlciArIGJ1ZmZlcmVkLCBkYXRhLCBwYXJ0aWFsKTsKKwkJYnVmZmVyZWQgKz0gcGFydGlhbDsKKwkJaWYgKGJ1ZmZlcmVkID09IFdSSVRFX0JVRkZFUl9TSVpFKSB7CisJCQl3cml0ZV9idWZmZXJfbGVuID0gYnVmZmVyZWQ7CisJCQlpZiAoY2Vfd3JpdGVfZmx1c2goY29udGV4dCwgZmQpKQorCQkJCXJldHVybiAtMTsKKwkJCWJ1ZmZlcmVkID0gMDsKKwkJfQorCQl3cml0ZV9idWZmZXJfbGVuID0gYnVmZmVyZWQ7CisJCWxlbiAtPSBwYXJ0aWFsOworCQlkYXRhID0gKGNoYXIgKikgZGF0YSArIHBhcnRpYWw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX2luZGV4X2V4dF9oZWFkZXIoU0hBX0NUWCAqY29udGV4dCwgaW50IGZkLAorCQkJCSAgdW5zaWduZWQgaW50IGV4dCwgdW5zaWduZWQgaW50IHN6KQoreworCWV4dCA9IGh0b25sKGV4dCk7CisJc3ogPSBodG9ubChzeik7CisJcmV0dXJuICgoY2Vfd3JpdGUoY29udGV4dCwgZmQsICZleHQsIDQpIDwgMCkgfHwKKwkJKGNlX3dyaXRlKGNvbnRleHQsIGZkLCAmc3osIDQpIDwgMCkpID8gLTEgOiAwOworfQorCitzdGF0aWMgaW50IGNlX2ZsdXNoKFNIQV9DVFggKmNvbnRleHQsIGludCBmZCkKK3sKKwl1bnNpZ25lZCBpbnQgbGVmdCA9IHdyaXRlX2J1ZmZlcl9sZW47CisKKwlpZiAobGVmdCkgeworCQl3cml0ZV9idWZmZXJfbGVuID0gMDsKKwkJU0hBMV9VcGRhdGUoY29udGV4dCwgd3JpdGVfYnVmZmVyLCBsZWZ0KTsKKwl9CisKKwkvKiBGbHVzaCBmaXJzdCBpZiBub3QgZW5vdWdoIHNwYWNlIGZvciBTSEExIHNpZ25hdHVyZSAqLworCWlmIChsZWZ0ICsgMjAgPiBXUklURV9CVUZGRVJfU0laRSkgeworCQlpZiAod3JpdGVfaW5fZnVsbChmZCwgd3JpdGVfYnVmZmVyLCBsZWZ0KSAhPSBsZWZ0KQorCQkJcmV0dXJuIC0xOworCQlsZWZ0ID0gMDsKKwl9CisKKwkvKiBBcHBlbmQgdGhlIFNIQTEgc2lnbmF0dXJlIGF0IHRoZSBlbmQgKi8KKwlTSEExX0ZpbmFsKHdyaXRlX2J1ZmZlciArIGxlZnQsIGNvbnRleHQpOworCWxlZnQgKz0gMjA7CisJcmV0dXJuICh3cml0ZV9pbl9mdWxsKGZkLCB3cml0ZV9idWZmZXIsIGxlZnQpICE9IGxlZnQpID8gLTEgOiAwOworfQorCitzdGF0aWMgdm9pZCBjZV9zbXVkZ2VfcmFjaWx5X2NsZWFuX2VudHJ5KHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UpCit7CisJLyoKKwkgKiBUaGUgb25seSB0aGluZyB3ZSBjYXJlIGFib3V0IGluIHRoaXMgZnVuY3Rpb24gaXMgdG8gc211ZGdlIHRoZQorCSAqIGZhbHNlbHkgY2xlYW4gZW50cnkgZHVlIHRvIHRvdWNoLXVwZGF0ZS10b3VjaCByYWNlLCBzbyB3ZSBsZWF2ZQorCSAqIGV2ZXJ5dGhpbmcgZWxzZSBhcyB0aGV5IGFyZS4gIFdlIGFyZSBjYWxsZWQgZm9yIGVudHJpZXMgd2hvc2UKKwkgKiBjZV9tdGltZSBtYXRjaCB0aGUgaW5kZXggZmlsZSBtdGltZS4KKwkgKi8KKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChsc3RhdChjZS0+bmFtZSwgJnN0KSA8IDApCisJCXJldHVybjsKKwlpZiAoY2VfbWF0Y2hfc3RhdF9iYXNpYyhjZSwgJnN0KSkKKwkJcmV0dXJuOworCWlmIChjZV9tb2RpZmllZF9jaGVja19mcyhjZSwgJnN0KSkgeworCQkvKiBUaGlzIGlzICJyYWNpbHkgY2xlYW4iOyBzbXVkZ2UgaXQuICBOb3RlIHRoYXQgdGhpcworCQkgKiBpcyBhIHRyaWNreSBjb2RlLiAgQXQgZmlyc3QgZ2xhbmNlLCBpdCBtYXkgYXBwZWFyCisJCSAqIHRoYXQgaXQgY2FuIGJyZWFrIHdpdGggdGhpcyBzZXF1ZW5jZToKKwkJICoKKwkJICogJCBlY2hvIHh5enp5ID5mcm90egorCQkgKiAkIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgZnJvdHoKKwkJICogJCA6ID5mcm90egorCQkgKiAkIHNsZWVwIDMKKwkJICogJCBlY2hvIGZpbGZyZSA+bml0Zm9sCisJCSAqICQgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBuaXRmb2wKKwkJICoKKwkJICogYnV0IGl0IGRvZXMgbm90LiAgV2hlbiB0aGUgc2Vjb25kIHVwZGF0ZS1pbmRleCBydW5zLAorCQkgKiBpdCBub3RpY2VzIHRoYXQgdGhlIGVudHJ5ICJmcm90eiIgaGFzIHRoZSBzYW1lIHRpbWVzdGFtcAorCQkgKiBhcyBpbmRleCwgYW5kIGlmIHdlIHdlcmUgdG8gc211ZGdlIGl0IGJ5IHJlc2V0dGluZyBpdHMKKwkJICogc2l6ZSB0byB6ZXJvIGhlcmUsIHRoZW4gdGhlIG9iamVjdCBuYW1lIHJlY29yZGVkCisJCSAqIGluIGluZGV4IGlzIHRoZSA2LWJ5dGUgZmlsZSBidXQgdGhlIGNhY2hlZCBzdGF0IGluZm9ybWF0aW9uCisJCSAqIGJlY29tZXMgemVybyAtLS0gd2hpY2ggd291bGQgdGhlbiBtYXRjaCB3aGF0IHdlIHdvdWxkCisJCSAqIG9idGFpbiBmcm9tIHRoZSBmaWxlc3lzdGVtIG5leHQgdGltZSB3ZSBzdGF0KCJmcm90eiIpLgorCQkgKgorCQkgKiBIb3dldmVyLCB0aGUgc2Vjb25kIHVwZGF0ZS1pbmRleCwgYmVmb3JlIGNhbGxpbmcKKwkJICogdGhpcyBmdW5jdGlvbiwgbm90aWNlcyB0aGF0IHRoZSBjYWNoZWQgc2l6ZSBpcyA2CisJCSAqIGJ5dGVzIGFuZCB3aGF0IGlzIG9uIHRoZSBmaWxlc3lzdGVtIGlzIGFuIGVtcHR5CisJCSAqIGZpbGUsIGFuZCBuZXZlciBjYWxscyB1cywgc28gdGhlIGNhY2hlZCBzaXplIGluZm9ybWF0aW9uCisJCSAqIGZvciAiZnJvdHoiIHN0YXlzIDYgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlIGZpbGVzeXN0ZW0uCisJCSAqLworCQljZS0+Y2Vfc2l6ZSA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IGNlX3dyaXRlX2VudHJ5KFNIQV9DVFggKmMsIGludCBmZCwgc3RydWN0IGNhY2hlX2VudHJ5ICpjZSkKK3sKKwlpbnQgc2l6ZSA9IG9uZGlza19jZV9zaXplKGNlKTsKKwlzdHJ1Y3Qgb25kaXNrX2NhY2hlX2VudHJ5ICpvbmRpc2sgPSB4Y2FsbG9jKDEsIHNpemUpOworCisJb25kaXNrLT5jdGltZS5zZWMgPSBodG9ubChjZS0+Y2VfY3RpbWUpOworCW9uZGlzay0+Y3RpbWUubnNlYyA9IDA7CisJb25kaXNrLT5tdGltZS5zZWMgPSBodG9ubChjZS0+Y2VfbXRpbWUpOworCW9uZGlzay0+bXRpbWUubnNlYyA9IDA7CisJb25kaXNrLT5kZXYgID0gaHRvbmwoY2UtPmNlX2Rldik7CisJb25kaXNrLT5pbm8gID0gaHRvbmwoY2UtPmNlX2lubyk7CisJb25kaXNrLT5tb2RlID0gaHRvbmwoY2UtPmNlX21vZGUpOworCW9uZGlzay0+dWlkICA9IGh0b25sKGNlLT5jZV91aWQpOworCW9uZGlzay0+Z2lkICA9IGh0b25sKGNlLT5jZV9naWQpOworCW9uZGlzay0+c2l6ZSA9IGh0b25sKGNlLT5jZV9zaXplKTsKKwloYXNoY3B5KG9uZGlzay0+c2hhMSwgY2UtPnNoYTEpOworCW9uZGlzay0+ZmxhZ3MgPSBodG9ucyhjZS0+Y2VfZmxhZ3MpOworCW1lbWNweShvbmRpc2stPm5hbWUsIGNlLT5uYW1lLCBjZV9uYW1lbGVuKGNlKSk7CisKKwlyZXR1cm4gY2Vfd3JpdGUoYywgZmQsIG9uZGlzaywgc2l6ZSk7Cit9CisKK2ludCB3cml0ZV9pbmRleChjb25zdCBzdHJ1Y3QgaW5kZXhfc3RhdGUgKmlzdGF0ZSwgaW50IG5ld2ZkKQoreworCVNIQV9DVFggYzsKKwlzdHJ1Y3QgY2FjaGVfaGVhZGVyIGhkcjsKKwlpbnQgaSwgZXJyLCByZW1vdmVkOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqKmNhY2hlID0gaXN0YXRlLT5jYWNoZTsKKwlpbnQgZW50cmllcyA9IGlzdGF0ZS0+Y2FjaGVfbnI7CisKKwlmb3IgKGkgPSByZW1vdmVkID0gMDsgaSA8IGVudHJpZXM7IGkrKykKKwkJaWYgKGNhY2hlW2ldLT5jZV9mbGFncyAmIENFX1JFTU9WRSkKKwkJCXJlbW92ZWQrKzsKKworCWhkci5oZHJfc2lnbmF0dXJlID0gaHRvbmwoQ0FDSEVfU0lHTkFUVVJFKTsKKwloZHIuaGRyX3ZlcnNpb24gPSBodG9ubCgyKTsKKwloZHIuaGRyX2VudHJpZXMgPSBodG9ubChlbnRyaWVzIC0gcmVtb3ZlZCk7CisKKwlTSEExX0luaXQoJmMpOworCWlmIChjZV93cml0ZSgmYywgbmV3ZmQsICZoZHIsIHNpemVvZihoZHIpKSA8IDApCisJCXJldHVybiAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGNhY2hlW2ldOworCQlpZiAoY2UtPmNlX2ZsYWdzICYgQ0VfUkVNT1ZFKQorCQkJY29udGludWU7CisJCWlmIChpc19yYWN5X3RpbWVzdGFtcChpc3RhdGUsIGNlKSkKKwkJCWNlX3NtdWRnZV9yYWNpbHlfY2xlYW5fZW50cnkoY2UpOworCQlpZiAoY2Vfd3JpdGVfZW50cnkoJmMsIG5ld2ZkLCBjZSkgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCS8qIFdyaXRlIGV4dGVuc2lvbiBkYXRhIGhlcmUgKi8KKwlpZiAoaXN0YXRlLT5jYWNoZV90cmVlKSB7CisJCXN0cnVjdCBzdHJidWYgc2I7CisKKwkJc3RyYnVmX2luaXQoJnNiLCAwKTsKKwkJY2FjaGVfdHJlZV93cml0ZSgmc2IsIGlzdGF0ZS0+Y2FjaGVfdHJlZSk7CisJCWVyciA9IHdyaXRlX2luZGV4X2V4dF9oZWFkZXIoJmMsIG5ld2ZkLCBDQUNIRV9FWFRfVFJFRSwgc2IubGVuKSA8IDAKKwkJCXx8IGNlX3dyaXRlKCZjLCBuZXdmZCwgc2IuYnVmLCBzYi5sZW4pIDwgMDsKKwkJc3RyYnVmX3JlbGVhc2UoJnNiKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIGNlX2ZsdXNoKCZjLCBuZXdmZCk7Cit9CmRpZmYgLS1naXQgYS9yZWNlaXZlLXBhY2suYyBiL3JlY2VpdmUtcGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4M2FlODcKLS0tIC9kZXYvbnVsbAorKysgYi9yZWNlaXZlLXBhY2suYwpAQCAtMCwwICsxLDUwOSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicGFjay5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJwa3QtbGluZS5oIgorI2luY2x1ZGUgInJ1bi1jb21tYW5kLmgiCisjaW5jbHVkZSAiZXhlY19jbWQuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgcmVjZWl2ZV9wYWNrX3VzYWdlW10gPSAiZ2l0LXJlY2VpdmUtcGFjayA8Z2l0LWRpcj4iOworCitzdGF0aWMgaW50IGRlbnlfbm9uX2Zhc3RfZm9yd2FyZHMgPSAwOworc3RhdGljIGludCByZWNlaXZlX3VucGFja19saW1pdCA9IC0xOworc3RhdGljIGludCB0cmFuc2Zlcl91bnBhY2tfbGltaXQgPSAtMTsKK3N0YXRpYyBpbnQgdW5wYWNrX2xpbWl0ID0gMTAwOworc3RhdGljIGludCByZXBvcnRfc3RhdHVzOworCitzdGF0aWMgY2hhciBjYXBhYmlsaXRpZXNbXSA9ICIgcmVwb3J0LXN0YXR1cyBkZWxldGUtcmVmcyAiOworc3RhdGljIGludCBjYXBhYmlsaXRpZXNfc2VudDsKKworc3RhdGljIGludCByZWNlaXZlX3BhY2tfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKHN0cmNtcCh2YXIsICJyZWNlaXZlLmRlbnlub25mYXN0Zm9yd2FyZHMiKSA9PSAwKSB7CisJCWRlbnlfbm9uX2Zhc3RfZm9yd2FyZHMgPSBnaXRfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChzdHJjbXAodmFyLCAicmVjZWl2ZS51bnBhY2tsaW1pdCIpID09IDApIHsKKwkJcmVjZWl2ZV91bnBhY2tfbGltaXQgPSBnaXRfY29uZmlnX2ludCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0cmNtcCh2YXIsICJ0cmFuc2Zlci51bnBhY2tsaW1pdCIpID09IDApIHsKKwkJdHJhbnNmZXJfdW5wYWNrX2xpbWl0ID0gZ2l0X2NvbmZpZ19pbnQodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBnaXRfZGVmYXVsdF9jb25maWcodmFyLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19yZWYoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZsYWcsIHZvaWQgKmNiX2RhdGEpCit7CisJaWYgKGNhcGFiaWxpdGllc19zZW50KQorCQlwYWNrZXRfd3JpdGUoMSwgIiVzICVzXG4iLCBzaGExX3RvX2hleChzaGExKSwgcGF0aCk7CisJZWxzZQorCQlwYWNrZXRfd3JpdGUoMSwgIiVzICVzJWMlc1xuIiwKKwkJCSAgICAgc2hhMV90b19oZXgoc2hhMSksIHBhdGgsIDAsIGNhcGFiaWxpdGllcyk7CisJY2FwYWJpbGl0aWVzX3NlbnQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9oZWFkX2luZm8odm9pZCkKK3sKKwlmb3JfZWFjaF9yZWYoc2hvd19yZWYsIE5VTEwpOworCWlmICghY2FwYWJpbGl0aWVzX3NlbnQpCisJCXNob3dfcmVmKCJjYXBhYmlsaXRpZXNee30iLCBudWxsX3NoYTEsIDAsIE5VTEwpOworCit9CisKK3N0cnVjdCBjb21tYW5kIHsKKwlzdHJ1Y3QgY29tbWFuZCAqbmV4dDsKKwljb25zdCBjaGFyICplcnJvcl9zdHJpbmc7CisJdW5zaWduZWQgY2hhciBvbGRfc2hhMVsyMF07CisJdW5zaWduZWQgY2hhciBuZXdfc2hhMVsyMF07CisJY2hhciByZWZfbmFtZVtGTEVYX0FSUkFZXTsgLyogbW9yZSAqLworfTsKKworc3RhdGljIHN0cnVjdCBjb21tYW5kICpjb21tYW5kczsKKworc3RhdGljIGNvbnN0IGNoYXIgcHJlX3JlY2VpdmVfaG9va1tdID0gImhvb2tzL3ByZS1yZWNlaXZlIjsKK3N0YXRpYyBjb25zdCBjaGFyIHBvc3RfcmVjZWl2ZV9ob29rW10gPSAiaG9va3MvcG9zdC1yZWNlaXZlIjsKKworc3RhdGljIGludCBob29rX3N0YXR1cyhpbnQgY29kZSwgY29uc3QgY2hhciAqaG9va19uYW1lKQoreworCXN3aXRjaCAoY29kZSkgeworCWNhc2UgMDoKKwkJcmV0dXJuIDA7CisJY2FzZSAtRVJSX1JVTl9DT01NQU5EX0ZPUks6CisJCXJldHVybiBlcnJvcigiaG9vayBmb3JrIGZhaWxlZCIpOworCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9FWEVDOgorCQlyZXR1cm4gZXJyb3IoImhvb2sgZXhlY3V0ZSBmYWlsZWQiKTsKKwljYXNlIC1FUlJfUlVOX0NPTU1BTkRfUElQRToKKwkJcmV0dXJuIGVycm9yKCJob29rIHBpcGUgZmFpbGVkIik7CisJY2FzZSAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSUQ6CisJCXJldHVybiBlcnJvcigid2FpdHBpZCBmYWlsZWQiKTsKKwljYXNlIC1FUlJfUlVOX0NPTU1BTkRfV0FJVFBJRF9XUk9OR19QSUQ6CisJCXJldHVybiBlcnJvcigid2FpdHBpZCBpcyBjb25mdXNlZCIpOworCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1NJR05BTDoKKwkJcmV0dXJuIGVycm9yKCIlcyBkaWVkIG9mIHNpZ25hbCIsIGhvb2tfbmFtZSk7CisJY2FzZSAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfTk9FWElUOgorCQlyZXR1cm4gZXJyb3IoIiVzIGRpZWQgc3RyYW5nZWx5IiwgaG9va19uYW1lKTsKKwlkZWZhdWx0OgorCQllcnJvcigiJXMgZXhpdGVkIHdpdGggZXJyb3IgY29kZSAlZCIsIGhvb2tfbmFtZSwgLWNvZGUpOworCQlyZXR1cm4gLWNvZGU7CisJfQorfQorCitzdGF0aWMgaW50IHJ1bl9ob29rKGNvbnN0IGNoYXIgKmhvb2tfbmFtZSkKK3sKKwlzdGF0aWMgY2hhciBidWZbc2l6ZW9mKGNvbW1hbmRzLT5vbGRfc2hhMSkgKiAyICsgUEFUSF9NQVggKyA0XTsKKwlzdHJ1Y3QgY29tbWFuZCAqY21kOworCXN0cnVjdCBjaGlsZF9wcm9jZXNzIHByb2M7CisJY29uc3QgY2hhciAqYXJndlsyXTsKKwlpbnQgaGF2ZV9pbnB1dCA9IDAsIGNvZGU7CisKKwlmb3IgKGNtZCA9IGNvbW1hbmRzOyAhaGF2ZV9pbnB1dCAmJiBjbWQ7IGNtZCA9IGNtZC0+bmV4dCkgeworCQlpZiAoIWNtZC0+ZXJyb3Jfc3RyaW5nKQorCQkJaGF2ZV9pbnB1dCA9IDE7CisJfQorCisJaWYgKCFoYXZlX2lucHV0IHx8IGFjY2Vzcyhob29rX25hbWUsIFhfT0spIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlhcmd2WzBdID0gaG9va19uYW1lOworCWFyZ3ZbMV0gPSBOVUxMOworCisJbWVtc2V0KCZwcm9jLCAwLCBzaXplb2YocHJvYykpOworCXByb2MuYXJndiA9IGFyZ3Y7CisJcHJvYy5pbiA9IC0xOworCXByb2Muc3Rkb3V0X3RvX3N0ZGVyciA9IDE7CisKKwljb2RlID0gc3RhcnRfY29tbWFuZCgmcHJvYyk7CisJaWYgKGNvZGUpCisJCXJldHVybiBob29rX3N0YXR1cyhjb2RlLCBob29rX25hbWUpOworCWZvciAoY21kID0gY29tbWFuZHM7IGNtZDsgY21kID0gY21kLT5uZXh0KSB7CisJCWlmICghY21kLT5lcnJvcl9zdHJpbmcpIHsKKwkJCXNpemVfdCBuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzICVzICVzXG4iLAorCQkJCXNoYTFfdG9faGV4KGNtZC0+b2xkX3NoYTEpLAorCQkJCXNoYTFfdG9faGV4KGNtZC0+bmV3X3NoYTEpLAorCQkJCWNtZC0+cmVmX25hbWUpOworCQkJaWYgKHdyaXRlX2luX2Z1bGwocHJvYy5pbiwgYnVmLCBuKSAhPSBuKQorCQkJCWJyZWFrOworCQl9CisJfQorCWNsb3NlKHByb2MuaW4pOworCXJldHVybiBob29rX3N0YXR1cyhmaW5pc2hfY29tbWFuZCgmcHJvYyksIGhvb2tfbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgcnVuX3VwZGF0ZV9ob29rKHN0cnVjdCBjb21tYW5kICpjbWQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgdXBkYXRlX2hvb2tbXSA9ICJob29rcy91cGRhdGUiOworCXN0cnVjdCBjaGlsZF9wcm9jZXNzIHByb2M7CisJY29uc3QgY2hhciAqYXJndls1XTsKKworCWlmIChhY2Nlc3ModXBkYXRlX2hvb2ssIFhfT0spIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlhcmd2WzBdID0gdXBkYXRlX2hvb2s7CisJYXJndlsxXSA9IGNtZC0+cmVmX25hbWU7CisJYXJndlsyXSA9IHNoYTFfdG9faGV4KGNtZC0+b2xkX3NoYTEpOworCWFyZ3ZbM10gPSBzaGExX3RvX2hleChjbWQtPm5ld19zaGExKTsKKwlhcmd2WzRdID0gTlVMTDsKKworCW1lbXNldCgmcHJvYywgMCwgc2l6ZW9mKHByb2MpKTsKKwlwcm9jLmFyZ3YgPSBhcmd2OworCXByb2Mubm9fc3RkaW4gPSAxOworCXByb2Muc3Rkb3V0X3RvX3N0ZGVyciA9IDE7CisKKwlyZXR1cm4gaG9va19zdGF0dXMocnVuX2NvbW1hbmQoJnByb2MpLCB1cGRhdGVfaG9vayk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp1cGRhdGUoc3RydWN0IGNvbW1hbmQgKmNtZCkKK3sKKwljb25zdCBjaGFyICpuYW1lID0gY21kLT5yZWZfbmFtZTsKKwl1bnNpZ25lZCBjaGFyICpvbGRfc2hhMSA9IGNtZC0+b2xkX3NoYTE7CisJdW5zaWduZWQgY2hhciAqbmV3X3NoYTEgPSBjbWQtPm5ld19zaGExOworCXN0cnVjdCByZWZfbG9jayAqbG9jazsKKworCS8qIG9ubHkgcmVmcy8uLi4gYXJlIGFsbG93ZWQgKi8KKwlpZiAocHJlZml4Y21wKG5hbWUsICJyZWZzLyIpIHx8IGNoZWNrX3JlZl9mb3JtYXQobmFtZSArIDUpKSB7CisJCWVycm9yKCJyZWZ1c2luZyB0byBjcmVhdGUgZnVubnkgcmVmICclcycgcmVtb3RlbHkiLCBuYW1lKTsKKwkJcmV0dXJuICJmdW5ueSByZWZuYW1lIjsKKwl9CisKKwlpZiAoIWlzX251bGxfc2hhMShuZXdfc2hhMSkgJiYgIWhhc19zaGExX2ZpbGUobmV3X3NoYTEpKSB7CisJCWVycm9yKCJ1bnBhY2sgc2hvdWxkIGhhdmUgZ2VuZXJhdGVkICVzLCAiCisJCSAgICAgICJidXQgSSBjYW4ndCBmaW5kIGl0ISIsIHNoYTFfdG9faGV4KG5ld19zaGExKSk7CisJCXJldHVybiAiYmFkIHBhY2siOworCX0KKwlpZiAoZGVueV9ub25fZmFzdF9mb3J3YXJkcyAmJiAhaXNfbnVsbF9zaGExKG5ld19zaGExKSAmJgorCSAgICAhaXNfbnVsbF9zaGExKG9sZF9zaGExKSAmJgorCSAgICAhcHJlZml4Y21wKG5hbWUsICJyZWZzL2hlYWRzLyIpKSB7CisJCXN0cnVjdCBvYmplY3QgKm9sZF9vYmplY3QsICpuZXdfb2JqZWN0OworCQlzdHJ1Y3QgY29tbWl0ICpvbGRfY29tbWl0LCAqbmV3X2NvbW1pdDsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICpiYXNlcywgKmVudDsKKworCQlvbGRfb2JqZWN0ID0gcGFyc2Vfb2JqZWN0KG9sZF9zaGExKTsKKwkJbmV3X29iamVjdCA9IHBhcnNlX29iamVjdChuZXdfc2hhMSk7CisKKwkJaWYgKCFvbGRfb2JqZWN0IHx8ICFuZXdfb2JqZWN0IHx8CisJCSAgICBvbGRfb2JqZWN0LT50eXBlICE9IE9CSl9DT01NSVQgfHwKKwkJICAgIG5ld19vYmplY3QtPnR5cGUgIT0gT0JKX0NPTU1JVCkgeworCQkJZXJyb3IoImJhZCBzaGExIG9iamVjdHMgZm9yICVzIiwgbmFtZSk7CisJCQlyZXR1cm4gImJhZCByZWYiOworCQl9CisJCW9sZF9jb21taXQgPSAoc3RydWN0IGNvbW1pdCAqKW9sZF9vYmplY3Q7CisJCW5ld19jb21taXQgPSAoc3RydWN0IGNvbW1pdCAqKW5ld19vYmplY3Q7CisJCWJhc2VzID0gZ2V0X21lcmdlX2Jhc2VzKG9sZF9jb21taXQsIG5ld19jb21taXQsIDEpOworCQlmb3IgKGVudCA9IGJhc2VzOyBlbnQ7IGVudCA9IGVudC0+bmV4dCkKKwkJCWlmICghaGFzaGNtcChvbGRfc2hhMSwgZW50LT5pdGVtLT5vYmplY3Quc2hhMSkpCisJCQkJYnJlYWs7CisJCWZyZWVfY29tbWl0X2xpc3QoYmFzZXMpOworCQlpZiAoIWVudCkgeworCQkJZXJyb3IoImRlbnlpbmcgbm9uLWZhc3QgZm9yd2FyZCAlcyIKKwkJCSAgICAgICIgKHlvdSBzaG91bGQgcHVsbCBmaXJzdCkiLCBuYW1lKTsKKwkJCXJldHVybiAibm9uLWZhc3QgZm9yd2FyZCI7CisJCX0KKwl9CisJaWYgKHJ1bl91cGRhdGVfaG9vayhjbWQpKSB7CisJCWVycm9yKCJob29rIGRlY2xpbmVkIHRvIHVwZGF0ZSAlcyIsIG5hbWUpOworCQlyZXR1cm4gImhvb2sgZGVjbGluZWQiOworCX0KKworCWlmIChpc19udWxsX3NoYTEobmV3X3NoYTEpKSB7CisJCWlmICghcGFyc2Vfb2JqZWN0KG9sZF9zaGExKSkgeworCQkJd2FybmluZyAoIkFsbG93aW5nIGRlbGV0aW9uIG9mIGNvcnJ1cHQgcmVmLiIpOworCQkJb2xkX3NoYTEgPSBOVUxMOworCQl9CisJCWlmIChkZWxldGVfcmVmKG5hbWUsIG9sZF9zaGExKSkgeworCQkJZXJyb3IoImZhaWxlZCB0byBkZWxldGUgJXMiLCBuYW1lKTsKKwkJCXJldHVybiAiZmFpbGVkIHRvIGRlbGV0ZSI7CisJCX0KKwkJcmV0dXJuIE5VTEw7IC8qIGdvb2QgKi8KKwl9CisJZWxzZSB7CisJCWxvY2sgPSBsb2NrX2FueV9yZWZfZm9yX3VwZGF0ZShuYW1lLCBvbGRfc2hhMSwgMCk7CisJCWlmICghbG9jaykgeworCQkJZXJyb3IoImZhaWxlZCB0byBsb2NrICVzIiwgbmFtZSk7CisJCQlyZXR1cm4gImZhaWxlZCB0byBsb2NrIjsKKwkJfQorCQlpZiAod3JpdGVfcmVmX3NoYTEobG9jaywgbmV3X3NoYTEsICJwdXNoIikpIHsKKwkJCXJldHVybiAiZmFpbGVkIHRvIHdyaXRlIjsgLyogZXJyb3IoKSBhbHJlYWR5IGNhbGxlZCAqLworCQl9CisJCXJldHVybiBOVUxMOyAvKiBnb29kICovCisJfQorfQorCitzdGF0aWMgY2hhciB1cGRhdGVfcG9zdF9ob29rW10gPSAiaG9va3MvcG9zdC11cGRhdGUiOworCitzdGF0aWMgdm9pZCBydW5fdXBkYXRlX3Bvc3RfaG9vayhzdHJ1Y3QgY29tbWFuZCAqY21kKQoreworCXN0cnVjdCBjb21tYW5kICpjbWRfcDsKKwlpbnQgYXJnYzsKKwljb25zdCBjaGFyICoqYXJndjsKKworCWZvciAoYXJnYyA9IDAsIGNtZF9wID0gY21kOyBjbWRfcDsgY21kX3AgPSBjbWRfcC0+bmV4dCkgeworCQlpZiAoY21kX3AtPmVycm9yX3N0cmluZykKKwkJCWNvbnRpbnVlOworCQlhcmdjKys7CisJfQorCWlmICghYXJnYyB8fCBhY2Nlc3ModXBkYXRlX3Bvc3RfaG9vaywgWF9PSykgPCAwKQorCQlyZXR1cm47CisJYXJndiA9IHhtYWxsb2Moc2l6ZW9mKCphcmd2KSAqICgyICsgYXJnYykpOworCWFyZ3ZbMF0gPSB1cGRhdGVfcG9zdF9ob29rOworCisJZm9yIChhcmdjID0gMSwgY21kX3AgPSBjbWQ7IGNtZF9wOyBjbWRfcCA9IGNtZF9wLT5uZXh0KSB7CisJCWNoYXIgKnA7CisJCWlmIChjbWRfcC0+ZXJyb3Jfc3RyaW5nKQorCQkJY29udGludWU7CisJCXAgPSB4bWFsbG9jKHN0cmxlbihjbWRfcC0+cmVmX25hbWUpICsgMSk7CisJCXN0cmNweShwLCBjbWRfcC0+cmVmX25hbWUpOworCQlhcmd2W2FyZ2NdID0gcDsKKwkJYXJnYysrOworCX0KKwlhcmd2W2FyZ2NdID0gTlVMTDsKKwlydW5fY29tbWFuZF92X29wdChhcmd2LCBSVU5fQ09NTUFORF9OT19TVERJTgorCQl8IFJVTl9DT01NQU5EX1NURE9VVF9UT19TVERFUlIpOworfQorCitzdGF0aWMgdm9pZCBleGVjdXRlX2NvbW1hbmRzKGNvbnN0IGNoYXIgKnVucGFja2VyX2Vycm9yKQoreworCXN0cnVjdCBjb21tYW5kICpjbWQgPSBjb21tYW5kczsKKworCWlmICh1bnBhY2tlcl9lcnJvcikgeworCQl3aGlsZSAoY21kKSB7CisJCQljbWQtPmVycm9yX3N0cmluZyA9ICJuL2EgKHVucGFja2VyIGVycm9yKSI7CisJCQljbWQgPSBjbWQtPm5leHQ7CisJCX0KKwkJcmV0dXJuOworCX0KKworCWlmIChydW5faG9vayhwcmVfcmVjZWl2ZV9ob29rKSkgeworCQl3aGlsZSAoY21kKSB7CisJCQljbWQtPmVycm9yX3N0cmluZyA9ICJwcmUtcmVjZWl2ZSBob29rIGRlY2xpbmVkIjsKKwkJCWNtZCA9IGNtZC0+bmV4dDsKKwkJfQorCQlyZXR1cm47CisJfQorCisJd2hpbGUgKGNtZCkgeworCQljbWQtPmVycm9yX3N0cmluZyA9IHVwZGF0ZShjbWQpOworCQljbWQgPSBjbWQtPm5leHQ7CisJfQorfQorCitzdGF0aWMgdm9pZCByZWFkX2hlYWRfaW5mbyh2b2lkKQoreworCXN0cnVjdCBjb21tYW5kICoqcCA9ICZjb21tYW5kczsKKwlmb3IgKDs7KSB7CisJCXN0YXRpYyBjaGFyIGxpbmVbMTAwMF07CisJCXVuc2lnbmVkIGNoYXIgb2xkX3NoYTFbMjBdLCBuZXdfc2hhMVsyMF07CisJCXN0cnVjdCBjb21tYW5kICpjbWQ7CisJCWNoYXIgKnJlZm5hbWU7CisJCWludCBsZW4sIHJlZmxlbjsKKworCQlsZW4gPSBwYWNrZXRfcmVhZF9saW5lKDAsIGxpbmUsIHNpemVvZihsaW5lKSk7CisJCWlmICghbGVuKQorCQkJYnJlYWs7CisJCWlmIChsaW5lW2xlbi0xXSA9PSAnXG4nKQorCQkJbGluZVstLWxlbl0gPSAwOworCQlpZiAobGVuIDwgODMgfHwKKwkJICAgIGxpbmVbNDBdICE9ICcgJyB8fAorCQkgICAgbGluZVs4MV0gIT0gJyAnIHx8CisJCSAgICBnZXRfc2hhMV9oZXgobGluZSwgb2xkX3NoYTEpIHx8CisJCSAgICBnZXRfc2hhMV9oZXgobGluZSArIDQxLCBuZXdfc2hhMSkpCisJCQlkaWUoInByb3RvY29sIGVycm9yOiBleHBlY3RlZCBvbGQvbmV3L3JlZiwgZ290ICclcyciLAorCQkJICAgIGxpbmUpOworCisJCXJlZm5hbWUgPSBsaW5lICsgODI7CisJCXJlZmxlbiA9IHN0cmxlbihyZWZuYW1lKTsKKwkJaWYgKHJlZmxlbiArIDgyIDwgbGVuKSB7CisJCQlpZiAoc3Ryc3RyKHJlZm5hbWUgKyByZWZsZW4gKyAxLCAicmVwb3J0LXN0YXR1cyIpKQorCQkJCXJlcG9ydF9zdGF0dXMgPSAxOworCQl9CisJCWNtZCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21tYW5kKSArIGxlbiAtIDgwKTsKKwkJaGFzaGNweShjbWQtPm9sZF9zaGExLCBvbGRfc2hhMSk7CisJCWhhc2hjcHkoY21kLT5uZXdfc2hhMSwgbmV3X3NoYTEpOworCQltZW1jcHkoY21kLT5yZWZfbmFtZSwgbGluZSArIDgyLCBsZW4gLSA4MSk7CisJCWNtZC0+ZXJyb3Jfc3RyaW5nID0gTlVMTDsKKwkJY21kLT5uZXh0ID0gTlVMTDsKKwkJKnAgPSBjbWQ7CisJCXAgPSAmY21kLT5uZXh0OworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnBhcnNlX3BhY2tfaGVhZGVyKHN0cnVjdCBwYWNrX2hlYWRlciAqaGRyKQoreworCXN3aXRjaCAocmVhZF9wYWNrX2hlYWRlcigwLCBoZHIpKSB7CisJY2FzZSBQSF9FUlJPUl9FT0Y6CisJCXJldHVybiAiZW9mIGJlZm9yZSBwYWNrIGhlYWRlciB3YXMgZnVsbHkgcmVhZCI7CisKKwljYXNlIFBIX0VSUk9SX1BBQ0tfU0lHTkFUVVJFOgorCQlyZXR1cm4gInByb3RvY29sIGVycm9yIChwYWNrIHNpZ25hdHVyZSBtaXNtYXRjaCBkZXRlY3RlZCkiOworCisJY2FzZSBQSF9FUlJPUl9QUk9UT0NPTDoKKwkJcmV0dXJuICJwcm90b2NvbCBlcnJvciAocGFjayB2ZXJzaW9uIHVuc3VwcG9ydGVkKSI7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gInVua25vd24gZXJyb3IgaW4gcGFyc2VfcGFja19oZWFkZXIiOworCisJY2FzZSAwOgorCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpwYWNrX2xvY2tmaWxlOworCitzdGF0aWMgY29uc3QgY2hhciAqdW5wYWNrKHZvaWQpCit7CisJc3RydWN0IHBhY2tfaGVhZGVyIGhkcjsKKwljb25zdCBjaGFyICpoZHJfZXJyOworCWNoYXIgaGRyX2FyZ1szOF07CisKKwloZHJfZXJyID0gcGFyc2VfcGFja19oZWFkZXIoJmhkcik7CisJaWYgKGhkcl9lcnIpCisJCXJldHVybiBoZHJfZXJyOworCXNucHJpbnRmKGhkcl9hcmcsIHNpemVvZihoZHJfYXJnKSwgIi0tcGFja19oZWFkZXI9JXUsJXUiLAorCQkJbnRvaGwoaGRyLmhkcl92ZXJzaW9uKSwgbnRvaGwoaGRyLmhkcl9lbnRyaWVzKSk7CisKKwlpZiAobnRvaGwoaGRyLmhkcl9lbnRyaWVzKSA8IHVucGFja19saW1pdCkgeworCQlpbnQgY29kZTsKKwkJY29uc3QgY2hhciAqdW5wYWNrZXJbM107CisJCXVucGFja2VyWzBdID0gInVucGFjay1vYmplY3RzIjsKKwkJdW5wYWNrZXJbMV0gPSBoZHJfYXJnOworCQl1bnBhY2tlclsyXSA9IE5VTEw7CisJCWNvZGUgPSBydW5fY29tbWFuZF92X29wdCh1bnBhY2tlciwgUlVOX0dJVF9DTUQpOworCQlzd2l0Y2ggKGNvZGUpIHsKKwkJY2FzZSAwOgorCQkJcmV0dXJuIE5VTEw7CisJCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9GT1JLOgorCQkJcmV0dXJuICJ1bnBhY2sgZm9yayBmYWlsZWQiOworCQljYXNlIC1FUlJfUlVOX0NPTU1BTkRfRVhFQzoKKwkJCXJldHVybiAidW5wYWNrIGV4ZWN1dGUgZmFpbGVkIjsKKwkJY2FzZSAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSUQ6CisJCQlyZXR1cm4gIndhaXRwaWQgZmFpbGVkIjsKKwkJY2FzZSAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfV1JPTkdfUElEOgorCQkJcmV0dXJuICJ3YWl0cGlkIGlzIGNvbmZ1c2VkIjsKKwkJY2FzZSAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfU0lHTkFMOgorCQkJcmV0dXJuICJ1bnBhY2tlciBkaWVkIG9mIHNpZ25hbCI7CisJCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX05PRVhJVDoKKwkJCXJldHVybiAidW5wYWNrZXIgZGllZCBzdHJhbmdlbHkiOworCQlkZWZhdWx0OgorCQkJcmV0dXJuICJ1bnBhY2tlciBleGl0ZWQgd2l0aCBlcnJvciBjb2RlIjsKKwkJfQorCX0gZWxzZSB7CisJCWNvbnN0IGNoYXIgKmtlZXBlcls2XTsKKwkJaW50IHMsIHN0YXR1czsKKwkJY2hhciBrZWVwX2FyZ1syNTZdOworCQlzdHJ1Y3QgY2hpbGRfcHJvY2VzcyBpcDsKKworCQlzID0gc3ByaW50ZihrZWVwX2FyZywgIi0ta2VlcD1yZWNlaXZlLXBhY2sgJWkgb24gIiwgZ2V0cGlkKCkpOworCQlpZiAoZ2V0aG9zdG5hbWUoa2VlcF9hcmcgKyBzLCBzaXplb2Yoa2VlcF9hcmcpIC0gcykpCisJCQlzdHJjcHkoa2VlcF9hcmcgKyBzLCAibG9jYWxob3N0Iik7CisKKwkJa2VlcGVyWzBdID0gImluZGV4LXBhY2siOworCQlrZWVwZXJbMV0gPSAiLS1zdGRpbiI7CisJCWtlZXBlclsyXSA9ICItLWZpeC10aGluIjsKKwkJa2VlcGVyWzNdID0gaGRyX2FyZzsKKwkJa2VlcGVyWzRdID0ga2VlcF9hcmc7CisJCWtlZXBlcls1XSA9IE5VTEw7CisJCW1lbXNldCgmaXAsIDAsIHNpemVvZihpcCkpOworCQlpcC5hcmd2ID0ga2VlcGVyOworCQlpcC5vdXQgPSAtMTsKKwkJaXAuZ2l0X2NtZCA9IDE7CisJCWlmIChzdGFydF9jb21tYW5kKCZpcCkpCisJCQlyZXR1cm4gImluZGV4LXBhY2sgZm9yayBmYWlsZWQiOworCQlwYWNrX2xvY2tmaWxlID0gaW5kZXhfcGFja19sb2NrZmlsZShpcC5vdXQpOworCQljbG9zZShpcC5vdXQpOworCQlzdGF0dXMgPSBmaW5pc2hfY29tbWFuZCgmaXApOworCQlpZiAoIXN0YXR1cykgeworCQkJcmVwcmVwYXJlX3BhY2tlZF9naXQoKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXJldHVybiAiaW5kZXgtcGFjayBhYm5vcm1hbCBleGl0IjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlcG9ydChjb25zdCBjaGFyICp1bnBhY2tfc3RhdHVzKQoreworCXN0cnVjdCBjb21tYW5kICpjbWQ7CisJcGFja2V0X3dyaXRlKDEsICJ1bnBhY2sgJXNcbiIsCisJCSAgICAgdW5wYWNrX3N0YXR1cyA/IHVucGFja19zdGF0dXMgOiAib2siKTsKKwlmb3IgKGNtZCA9IGNvbW1hbmRzOyBjbWQ7IGNtZCA9IGNtZC0+bmV4dCkgeworCQlpZiAoIWNtZC0+ZXJyb3Jfc3RyaW5nKQorCQkJcGFja2V0X3dyaXRlKDEsICJvayAlc1xuIiwKKwkJCQkgICAgIGNtZC0+cmVmX25hbWUpOworCQllbHNlCisJCQlwYWNrZXRfd3JpdGUoMSwgIm5nICVzICVzXG4iLAorCQkJCSAgICAgY21kLT5yZWZfbmFtZSwgY21kLT5lcnJvcl9zdHJpbmcpOworCX0KKwlwYWNrZXRfZmx1c2goMSk7Cit9CisKK3N0YXRpYyBpbnQgZGVsZXRlX29ubHkoc3RydWN0IGNvbW1hbmQgKmNtZCkKK3sKKwl3aGlsZSAoY21kKSB7CisJCWlmICghaXNfbnVsbF9zaGExKGNtZC0+bmV3X3NoYTEpKQorCQkJcmV0dXJuIDA7CisJCWNtZCA9IGNtZC0+bmV4dDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaTsKKwljaGFyICpkaXIgPSBOVUxMOworCisJYXJndisrOworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY2hhciAqYXJnID0gKmFyZ3YrKzsKKworCQlpZiAoKmFyZyA9PSAnLScpIHsKKwkJCS8qIERvIGZsYWcgaGFuZGxpbmcgaGVyZSAqLworCQkJdXNhZ2UocmVjZWl2ZV9wYWNrX3VzYWdlKTsKKwkJfQorCQlpZiAoZGlyKQorCQkJdXNhZ2UocmVjZWl2ZV9wYWNrX3VzYWdlKTsKKwkJZGlyID0gYXJnOworCX0KKwlpZiAoIWRpcikKKwkJdXNhZ2UocmVjZWl2ZV9wYWNrX3VzYWdlKTsKKworCXNldHVwX3BhdGgoTlVMTCk7CisKKwlpZiAoIWVudGVyX3JlcG8oZGlyLCAwKSkKKwkJZGllKCInJXMnOiB1bmFibGUgdG8gY2hkaXIgb3Igbm90IGEgZ2l0IGFyY2hpdmUiLCBkaXIpOworCisJaWYgKGlzX3JlcG9zaXRvcnlfc2hhbGxvdygpKQorCQlkaWUoImF0dGVtcHQgdG8gcHVzaCBpbnRvIGEgc2hhbGxvdyByZXBvc2l0b3J5Iik7CisKKwlnaXRfY29uZmlnKHJlY2VpdmVfcGFja19jb25maWcpOworCisJaWYgKDAgPD0gdHJhbnNmZXJfdW5wYWNrX2xpbWl0KQorCQl1bnBhY2tfbGltaXQgPSB0cmFuc2Zlcl91bnBhY2tfbGltaXQ7CisJZWxzZSBpZiAoMCA8PSByZWNlaXZlX3VucGFja19saW1pdCkKKwkJdW5wYWNrX2xpbWl0ID0gcmVjZWl2ZV91bnBhY2tfbGltaXQ7CisKKwl3cml0ZV9oZWFkX2luZm8oKTsKKworCS8qIEVPRiAqLworCXBhY2tldF9mbHVzaCgxKTsKKworCXJlYWRfaGVhZF9pbmZvKCk7CisJaWYgKGNvbW1hbmRzKSB7CisJCWNvbnN0IGNoYXIgKnVucGFja19zdGF0dXMgPSBOVUxMOworCisJCWlmICghZGVsZXRlX29ubHkoY29tbWFuZHMpKQorCQkJdW5wYWNrX3N0YXR1cyA9IHVucGFjaygpOworCQlleGVjdXRlX2NvbW1hbmRzKHVucGFja19zdGF0dXMpOworCQlpZiAocGFja19sb2NrZmlsZSkKKwkJCXVubGluayhwYWNrX2xvY2tmaWxlKTsKKwkJaWYgKHJlcG9ydF9zdGF0dXMpCisJCQlyZXBvcnQodW5wYWNrX3N0YXR1cyk7CisJCXJ1bl9ob29rKHBvc3RfcmVjZWl2ZV9ob29rKTsKKwkJcnVuX3VwZGF0ZV9wb3N0X2hvb2soY29tbWFuZHMpOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3JlZmxvZy13YWxrLmMgYi9yZWZsb2ctd2Fsay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMTQ1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9yZWZsb2ctd2Fsay5jCkBAIC0wLDAgKzEsMjc0IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgInJldmlzaW9uLmgiCisjaW5jbHVkZSAicGF0aC1saXN0LmgiCisjaW5jbHVkZSAicmVmbG9nLXdhbGsuaCIKKworc3RydWN0IGNvbXBsZXRlX3JlZmxvZ3MgeworCWNoYXIgKnJlZjsKKwlzdHJ1Y3QgcmVmbG9nX2luZm8geworCQl1bnNpZ25lZCBjaGFyIG9zaGExWzIwXSwgbnNoYTFbMjBdOworCQljaGFyICplbWFpbDsKKwkJdW5zaWduZWQgbG9uZyB0aW1lc3RhbXA7CisJCWludCB0ejsKKwkJY2hhciAqbWVzc2FnZTsKKwl9ICppdGVtczsKKwlpbnQgbnIsIGFsbG9jOworfTsKKworc3RhdGljIGludCByZWFkX29uZV9yZWZsb2codW5zaWduZWQgY2hhciAqb3NoYTEsIHVuc2lnbmVkIGNoYXIgKm5zaGExLAorCQljb25zdCBjaGFyICplbWFpbCwgdW5zaWduZWQgbG9uZyB0aW1lc3RhbXAsIGludCB0eiwKKwkJY29uc3QgY2hhciAqbWVzc2FnZSwgdm9pZCAqY2JfZGF0YSkKK3sKKwlzdHJ1Y3QgY29tcGxldGVfcmVmbG9ncyAqYXJyYXkgPSBjYl9kYXRhOworCXN0cnVjdCByZWZsb2dfaW5mbyAqaXRlbTsKKworCWlmIChhcnJheS0+bnIgPj0gYXJyYXktPmFsbG9jKSB7CisJCWFycmF5LT5hbGxvYyA9IGFsbG9jX25yKGFycmF5LT5uciArIDEpOworCQlhcnJheS0+aXRlbXMgPSB4cmVhbGxvYyhhcnJheS0+aXRlbXMsIGFycmF5LT5hbGxvYyAqCisJCQlzaXplb2Yoc3RydWN0IHJlZmxvZ19pbmZvKSk7CisJfQorCWl0ZW0gPSBhcnJheS0+aXRlbXMgKyBhcnJheS0+bnI7CisJbWVtY3B5KGl0ZW0tPm9zaGExLCBvc2hhMSwgMjApOworCW1lbWNweShpdGVtLT5uc2hhMSwgbnNoYTEsIDIwKTsKKwlpdGVtLT5lbWFpbCA9IHhzdHJkdXAoZW1haWwpOworCWl0ZW0tPnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwlpdGVtLT50eiA9IHR6OworCWl0ZW0tPm1lc3NhZ2UgPSB4c3RyZHVwKG1lc3NhZ2UpOworCWFycmF5LT5ucisrOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNvbXBsZXRlX3JlZmxvZ3MgKnJlYWRfY29tcGxldGVfcmVmbG9nKGNvbnN0IGNoYXIgKnJlZikKK3sKKwlzdHJ1Y3QgY29tcGxldGVfcmVmbG9ncyAqcmVmbG9ncyA9CisJCXhjYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21wbGV0ZV9yZWZsb2dzKSwgMSk7CisJcmVmbG9ncy0+cmVmID0geHN0cmR1cChyZWYpOworCWZvcl9lYWNoX3JlZmxvZ19lbnQocmVmLCByZWFkX29uZV9yZWZsb2csIHJlZmxvZ3MpOworCWlmIChyZWZsb2dzLT5uciA9PSAwKSB7CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCWNvbnN0IGNoYXIgKm5hbWUgPSByZXNvbHZlX3JlZihyZWYsIHNoYTEsIDEsIE5VTEwpOworCQlpZiAobmFtZSkKKwkJCWZvcl9lYWNoX3JlZmxvZ19lbnQobmFtZSwgcmVhZF9vbmVfcmVmbG9nLCByZWZsb2dzKTsKKwl9CisJaWYgKHJlZmxvZ3MtPm5yID09IDApIHsKKwkJaW50IGxlbiA9IHN0cmxlbihyZWYpOworCQljaGFyICpyZWZuYW1lID0geG1hbGxvYyhsZW4gKyAxMik7CisJCXNwcmludGYocmVmbmFtZSwgInJlZnMvJXMiLCByZWYpOworCQlmb3JfZWFjaF9yZWZsb2dfZW50KHJlZm5hbWUsIHJlYWRfb25lX3JlZmxvZywgcmVmbG9ncyk7CisJCWlmIChyZWZsb2dzLT5uciA9PSAwKSB7CisJCQlzcHJpbnRmKHJlZm5hbWUsICJyZWZzL2hlYWRzLyVzIiwgcmVmKTsKKwkJCWZvcl9lYWNoX3JlZmxvZ19lbnQocmVmbmFtZSwgcmVhZF9vbmVfcmVmbG9nLCByZWZsb2dzKTsKKwkJfQorCQlmcmVlKHJlZm5hbWUpOworCX0KKwlyZXR1cm4gcmVmbG9nczsKK30KKworc3RhdGljIGludCBnZXRfcmVmbG9nX3JlY25vX2J5X3RpbWUoc3RydWN0IGNvbXBsZXRlX3JlZmxvZ3MgKmFycmF5LAorCXVuc2lnbmVkIGxvbmcgdGltZXN0YW1wKQoreworCWludCBpOworCWZvciAoaSA9IGFycmF5LT5uciAtIDE7IGkgPj0gMDsgaS0tKQorCQlpZiAodGltZXN0YW1wID49IGFycmF5LT5pdGVtc1tpXS50aW1lc3RhbXApCisJCQlyZXR1cm4gaTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0cnVjdCBjb21taXRfaW5mb19saWZvIHsKKwlzdHJ1Y3QgY29tbWl0X2luZm8geworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisJCXZvaWQgKnV0aWw7CisJfSAqaXRlbXM7CisJaW50IG5yLCBhbGxvYzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0X2luZm8gKmdldF9jb21taXRfaW5mbyhzdHJ1Y3QgY29tbWl0ICpjb21taXQsCisJCXN0cnVjdCBjb21taXRfaW5mb19saWZvICpsaWZvLCBpbnQgcG9wKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBsaWZvLT5ucjsgaSsrKQorCQlpZiAobGlmby0+aXRlbXNbaV0uY29tbWl0ID09IGNvbW1pdCkgeworCQkJc3RydWN0IGNvbW1pdF9pbmZvICpyZXN1bHQgPSAmbGlmby0+aXRlbXNbaV07CisJCQlpZiAocG9wKSB7CisJCQkJaWYgKGkgKyAxIDwgbGlmby0+bnIpCisJCQkJCW1lbW1vdmUobGlmby0+aXRlbXMgKyBpLAorCQkJCQkJbGlmby0+aXRlbXMgKyBpICsgMSwKKwkJCQkJCShsaWZvLT5uciAtIGkpICoKKwkJCQkJCXNpemVvZihzdHJ1Y3QgY29tbWl0X2luZm8pKTsKKwkJCQlsaWZvLT5uci0tOworCQkJfQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBhZGRfY29tbWl0X2luZm8oc3RydWN0IGNvbW1pdCAqY29tbWl0LCB2b2lkICp1dGlsLAorCQlzdHJ1Y3QgY29tbWl0X2luZm9fbGlmbyAqbGlmbykKK3sKKwlzdHJ1Y3QgY29tbWl0X2luZm8gKmluZm87CisJaWYgKGxpZm8tPm5yID49IGxpZm8tPmFsbG9jKSB7CisJCWxpZm8tPmFsbG9jID0gYWxsb2NfbnIobGlmby0+bnIgKyAxKTsKKwkJbGlmby0+aXRlbXMgPSB4cmVhbGxvYyhsaWZvLT5pdGVtcywKKwkJCWxpZm8tPmFsbG9jICogc2l6ZW9mKHN0cnVjdCBjb21taXRfaW5mbykpOworCX0KKwlpbmZvID0gbGlmby0+aXRlbXMgKyBsaWZvLT5ucjsKKwlpbmZvLT5jb21taXQgPSBjb21taXQ7CisJaW5mby0+dXRpbCA9IHV0aWw7CisJbGlmby0+bnIrKzsKK30KKworc3RydWN0IGNvbW1pdF9yZWZsb2cgeworCWludCBmbGFnLCByZWNubzsKKwlzdHJ1Y3QgY29tcGxldGVfcmVmbG9ncyAqcmVmbG9nczsKK307CisKK3N0cnVjdCByZWZsb2dfd2Fsa19pbmZvIHsKKwlzdHJ1Y3QgY29tbWl0X2luZm9fbGlmbyByZWZsb2dzOworCXN0cnVjdCBwYXRoX2xpc3QgY29tcGxldGVfcmVmbG9nczsKKwlzdHJ1Y3QgY29tbWl0X3JlZmxvZyAqbGFzdF9jb21taXRfcmVmbG9nOworfTsKKwordm9pZCBpbml0X3JlZmxvZ193YWxrKHN0cnVjdCByZWZsb2dfd2Fsa19pbmZvKiogaW5mbykKK3sKKwkqaW5mbyA9IHhjYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWZsb2dfd2Fsa19pbmZvKSwgMSk7Cit9CisKK2ludCBhZGRfcmVmbG9nX2Zvcl93YWxrKHN0cnVjdCByZWZsb2dfd2Fsa19pbmZvICppbmZvLAorCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lc3RhbXAgPSAwOworCWludCByZWNubyA9IC0xOworCXN0cnVjdCBwYXRoX2xpc3RfaXRlbSAqaXRlbTsKKwlzdHJ1Y3QgY29tcGxldGVfcmVmbG9ncyAqcmVmbG9nczsKKwljaGFyICpicmFuY2gsICphdCA9IHN0cmNocihuYW1lLCAnQCcpOworCXN0cnVjdCBjb21taXRfcmVmbG9nICpjb21taXRfcmVmbG9nOworCisJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykKKwkJZGllICgiQ2Fubm90IHdhbGsgcmVmbG9ncyBmb3IgJXMiLCBuYW1lKTsKKworCWJyYW5jaCA9IHhzdHJkdXAobmFtZSk7CisJaWYgKGF0ICYmIGF0WzFdID09ICd7JykgeworCQljaGFyICplcDsKKwkJYnJhbmNoW2F0IC0gbmFtZV0gPSAnXDAnOworCQlyZWNubyA9IHN0cnRvdWwoYXQgKyAyLCAmZXAsIDEwKTsKKwkJaWYgKCplcCAhPSAnfScpIHsKKwkJCXJlY25vID0gLTE7CisJCQl0aW1lc3RhbXAgPSBhcHByb3hpZGF0ZShhdCArIDIpOworCQl9CisJfSBlbHNlCisJCXJlY25vID0gMDsKKworCWl0ZW0gPSBwYXRoX2xpc3RfbG9va3VwKGJyYW5jaCwgJmluZm8tPmNvbXBsZXRlX3JlZmxvZ3MpOworCWlmIChpdGVtKQorCQlyZWZsb2dzID0gaXRlbS0+dXRpbDsKKwllbHNlIHsKKwkJaWYgKCpicmFuY2ggPT0gJ1wwJykgeworCQkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJCWNvbnN0IGNoYXIgKmhlYWQgPSByZXNvbHZlX3JlZigiSEVBRCIsIHNoYTEsIDAsIE5VTEwpOworCQkJaWYgKCFoZWFkKQorCQkJCWRpZSAoIk5vIGN1cnJlbnQgYnJhbmNoIik7CisJCQlmcmVlKGJyYW5jaCk7CisJCQlicmFuY2ggPSB4c3RyZHVwKGhlYWQpOworCQl9CisJCXJlZmxvZ3MgPSByZWFkX2NvbXBsZXRlX3JlZmxvZyhicmFuY2gpOworCQlpZiAoIXJlZmxvZ3MgfHwgcmVmbG9ncy0+bnIgPT0gMCkgeworCQkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJCWNoYXIgKmI7CisJCQlpZiAoZHdpbV9sb2coYnJhbmNoLCBzdHJsZW4oYnJhbmNoKSwgc2hhMSwgJmIpID09IDEpIHsKKwkJCQlpZiAocmVmbG9ncykgeworCQkJCQlmcmVlKHJlZmxvZ3MtPnJlZik7CisJCQkJCWZyZWUocmVmbG9ncyk7CisJCQkJfQorCQkJCWZyZWUoYnJhbmNoKTsKKwkJCQlicmFuY2ggPSBiOworCQkJCXJlZmxvZ3MgPSByZWFkX2NvbXBsZXRlX3JlZmxvZyhicmFuY2gpOworCQkJfQorCQl9CisJCWlmICghcmVmbG9ncyB8fCByZWZsb2dzLT5uciA9PSAwKQorCQkJcmV0dXJuIC0xOworCQlwYXRoX2xpc3RfaW5zZXJ0KGJyYW5jaCwgJmluZm8tPmNvbXBsZXRlX3JlZmxvZ3MpLT51dGlsCisJCQk9IHJlZmxvZ3M7CisJfQorCisJY29tbWl0X3JlZmxvZyA9IHhjYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21taXRfcmVmbG9nKSwgMSk7CisJaWYgKHJlY25vIDwgMCkgeworCQljb21taXRfcmVmbG9nLT5mbGFnID0gMTsKKwkJY29tbWl0X3JlZmxvZy0+cmVjbm8gPSBnZXRfcmVmbG9nX3JlY25vX2J5X3RpbWUocmVmbG9ncywgdGltZXN0YW1wKTsKKwkJaWYgKGNvbW1pdF9yZWZsb2ctPnJlY25vIDwgMCkgeworCQkJZnJlZShicmFuY2gpOworCQkJZnJlZShjb21taXRfcmVmbG9nKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0gZWxzZQorCQljb21taXRfcmVmbG9nLT5yZWNubyA9IHJlZmxvZ3MtPm5yIC0gcmVjbm8gLSAxOworCWNvbW1pdF9yZWZsb2ctPnJlZmxvZ3MgPSByZWZsb2dzOworCisJYWRkX2NvbW1pdF9pbmZvKGNvbW1pdCwgY29tbWl0X3JlZmxvZywgJmluZm8tPnJlZmxvZ3MpOworCXJldHVybiAwOworfQorCit2b2lkIGZha2VfcmVmbG9nX3BhcmVudChzdHJ1Y3QgcmVmbG9nX3dhbGtfaW5mbyAqaW5mbywgc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCXN0cnVjdCBjb21taXRfaW5mbyAqY29tbWl0X2luZm8gPQorCQlnZXRfY29tbWl0X2luZm8oY29tbWl0LCAmaW5mby0+cmVmbG9ncywgMCk7CisJc3RydWN0IGNvbW1pdF9yZWZsb2cgKmNvbW1pdF9yZWZsb2c7CisJc3RydWN0IHJlZmxvZ19pbmZvICpyZWZsb2c7CisKKwlpbmZvLT5sYXN0X2NvbW1pdF9yZWZsb2cgPSBOVUxMOworCWlmICghY29tbWl0X2luZm8pCisJCXJldHVybjsKKworCWNvbW1pdF9yZWZsb2cgPSBjb21taXRfaW5mby0+dXRpbDsKKwlpZiAoY29tbWl0X3JlZmxvZy0+cmVjbm8gPCAwKSB7CisJCWNvbW1pdC0+cGFyZW50cyA9IE5VTEw7CisJCXJldHVybjsKKwl9CisKKwlyZWZsb2cgPSAmY29tbWl0X3JlZmxvZy0+cmVmbG9ncy0+aXRlbXNbY29tbWl0X3JlZmxvZy0+cmVjbm9dOworCWluZm8tPmxhc3RfY29tbWl0X3JlZmxvZyA9IGNvbW1pdF9yZWZsb2c7CisJY29tbWl0X3JlZmxvZy0+cmVjbm8tLTsKKwljb21taXRfaW5mby0+Y29tbWl0ID0gKHN0cnVjdCBjb21taXQgKilwYXJzZV9vYmplY3QocmVmbG9nLT5vc2hhMSk7CisJaWYgKCFjb21taXRfaW5mby0+Y29tbWl0KSB7CisJCWNvbW1pdC0+cGFyZW50cyA9IE5VTEw7CisJCXJldHVybjsKKwl9CisKKwljb21taXQtPnBhcmVudHMgPSB4Y2FsbG9jKHNpemVvZihzdHJ1Y3QgY29tbWl0X2xpc3QpLCAxKTsKKwljb21taXQtPnBhcmVudHMtPml0ZW0gPSBjb21taXRfaW5mby0+Y29tbWl0OworCWNvbW1pdC0+b2JqZWN0LmZsYWdzICY9IH4oQURERUQgfCBTRUVOIHwgU0hPV04pOworfQorCit2b2lkIHNob3dfcmVmbG9nX21lc3NhZ2Uoc3RydWN0IHJlZmxvZ193YWxrX2luZm8qIGluZm8sIGludCBvbmVsaW5lLAorCWludCByZWxhdGl2ZV9kYXRlKQoreworCWlmIChpbmZvICYmIGluZm8tPmxhc3RfY29tbWl0X3JlZmxvZykgeworCQlzdHJ1Y3QgY29tbWl0X3JlZmxvZyAqY29tbWl0X3JlZmxvZyA9IGluZm8tPmxhc3RfY29tbWl0X3JlZmxvZzsKKwkJc3RydWN0IHJlZmxvZ19pbmZvICppbmZvOworCisJCWluZm8gPSAmY29tbWl0X3JlZmxvZy0+cmVmbG9ncy0+aXRlbXNbY29tbWl0X3JlZmxvZy0+cmVjbm8rMV07CisJCWlmIChvbmVsaW5lKSB7CisJCQlwcmludGYoIiVzQHsiLCBjb21taXRfcmVmbG9nLT5yZWZsb2dzLT5yZWYpOworCQkJaWYgKGNvbW1pdF9yZWZsb2ctPmZsYWcgfHwgcmVsYXRpdmVfZGF0ZSkKKwkJCQlwcmludGYoIiVzIiwgc2hvd19kYXRlKGluZm8tPnRpbWVzdGFtcCwgMCwgMSkpOworCQkJZWxzZQorCQkJCXByaW50ZigiJWQiLCBjb21taXRfcmVmbG9nLT5yZWZsb2dzLT5ucgorCQkJCSAgICAgICAtIDIgLSBjb21taXRfcmVmbG9nLT5yZWNubyk7CisJCQlwcmludGYoIn06ICVzIiwgaW5mby0+bWVzc2FnZSk7CisJCX0KKwkJZWxzZSB7CisJCQlwcmludGYoIlJlZmxvZzogJXNAeyIsIGNvbW1pdF9yZWZsb2ctPnJlZmxvZ3MtPnJlZik7CisJCQlpZiAoY29tbWl0X3JlZmxvZy0+ZmxhZyB8fCByZWxhdGl2ZV9kYXRlKQorCQkJCXByaW50ZigiJXMiLCBzaG93X2RhdGUoaW5mby0+dGltZXN0YW1wLAorCQkJCQkJCWluZm8tPnR6LAorCQkJCQkJCXJlbGF0aXZlX2RhdGUpKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiVkIiwgY29tbWl0X3JlZmxvZy0+cmVmbG9ncy0+bnIKKwkJCQkgICAgICAgLSAyIC0gY29tbWl0X3JlZmxvZy0+cmVjbm8pOworCQkJcHJpbnRmKCJ9ICglcylcblJlZmxvZyBtZXNzYWdlOiAlcyIsCisJCQkgICAgICAgaW5mby0+ZW1haWwsIGluZm8tPm1lc3NhZ2UpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvcmVmbG9nLXdhbGsuaCBiL3JlZmxvZy13YWxrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhMTQzOAotLS0gL2Rldi9udWxsCisrKyBiL3JlZmxvZy13YWxrLmgKQEAgLTAsMCArMSwxMSBAQAorI2lmbmRlZiBSRUZMT0dfV0FMS19ICisjZGVmaW5lIFJFRkxPR19XQUxLX0gKKworZXh0ZXJuIHZvaWQgaW5pdF9yZWZsb2dfd2FsayhzdHJ1Y3QgcmVmbG9nX3dhbGtfaW5mbyoqIGluZm8pOworZXh0ZXJuIGludCBhZGRfcmVmbG9nX2Zvcl93YWxrKHN0cnVjdCByZWZsb2dfd2Fsa19pbmZvICppbmZvLAorCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQsIGNvbnN0IGNoYXIgKm5hbWUpOworZXh0ZXJuIHZvaWQgZmFrZV9yZWZsb2dfcGFyZW50KHN0cnVjdCByZWZsb2dfd2Fsa19pbmZvICppbmZvLAorCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQpOworZXh0ZXJuIHZvaWQgc2hvd19yZWZsb2dfbWVzc2FnZShzdHJ1Y3QgcmVmbG9nX3dhbGtfaW5mbyAqaW5mbywgaW50LCBpbnQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3JlZnMuYyBiL3JlZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjAwNTBlCi0tLSAvZGV2L251bGwKKysrIGIvcmVmcy5jCkBAIC0wLDAgKzEsMTUyOCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgImRpci5oIgorCisvKiBJU1NZTVJFRj0wMSBhbmQgSVNQQUNLRUQ9MDIgYXJlIHB1YmxpYyBpbnRlcmZhY2VzICovCisjZGVmaW5lIFJFRl9LTk9XU19QRUVMRUQgMDQKKworc3RydWN0IHJlZl9saXN0IHsKKwlzdHJ1Y3QgcmVmX2xpc3QgKm5leHQ7CisJdW5zaWduZWQgY2hhciBmbGFnOyAvKiBJU1NZTVJFRj8gSVNQQUNLRUQ/ICovCisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwl1bnNpZ25lZCBjaGFyIHBlZWxlZFsyMF07CisJY2hhciBuYW1lW0ZMRVhfQVJSQVldOworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnBhcnNlX3JlZl9saW5lKGNoYXIgKmxpbmUsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJLyoKKwkgKiA0MjogdGhlIGFuc3dlciB0byBldmVyeXRoaW5nLgorCSAqCisJICogSW4gdGhpcyBjYXNlLCBpdCBoYXBwZW5zIHRvIGJlIHRoZSBhbnN3ZXIgdG8KKwkgKiAgNDAgKGxlbmd0aCBvZiBzaGExIGhleCByZXByZXNlbnRhdGlvbikKKwkgKiAgKzEgKHNwYWNlIGluIGJldHdlZW4gaGV4IGFuZCBuYW1lKQorCSAqICArMSAobmV3bGluZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lKQorCSAqLworCWludCBsZW4gPSBzdHJsZW4obGluZSkgLSA0MjsKKworCWlmIChsZW4gPD0gMCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGdldF9zaGExX2hleChsaW5lLCBzaGExKSA8IDApCisJCXJldHVybiBOVUxMOworCWlmICghaXNzcGFjZShsaW5lWzQwXSkpCisJCXJldHVybiBOVUxMOworCWxpbmUgKz0gNDE7CisJaWYgKGlzc3BhY2UoKmxpbmUpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobGluZVtsZW5dICE9ICdcbicpCisJCXJldHVybiBOVUxMOworCWxpbmVbbGVuXSA9IDA7CisKKwlyZXR1cm4gbGluZTsKK30KKworc3RhdGljIHN0cnVjdCByZWZfbGlzdCAqYWRkX3JlZihjb25zdCBjaGFyICpuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkJCWludCBmbGFnLCBzdHJ1Y3QgcmVmX2xpc3QgKmxpc3QsCisJCQkJc3RydWN0IHJlZl9saXN0ICoqbmV3X2VudHJ5KQoreworCWludCBsZW47CisJc3RydWN0IHJlZl9saXN0ICplbnRyeTsKKworCS8qIEFsbG9jYXRlIGl0IGFuZCBhZGQgaXQgaW4uLiAqLworCWxlbiA9IHN0cmxlbihuYW1lKSArIDE7CisJZW50cnkgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVmX2xpc3QpICsgbGVuKTsKKwloYXNoY3B5KGVudHJ5LT5zaGExLCBzaGExKTsKKwloYXNoY2xyKGVudHJ5LT5wZWVsZWQpOworCW1lbWNweShlbnRyeS0+bmFtZSwgbmFtZSwgbGVuKTsKKwllbnRyeS0+ZmxhZyA9IGZsYWc7CisJZW50cnktPm5leHQgPSBsaXN0OworCWlmIChuZXdfZW50cnkpCisJCSpuZXdfZW50cnkgPSBlbnRyeTsKKwlyZXR1cm4gZW50cnk7Cit9CisKKy8qIG1lcmdlIHNvcnQgdGhlIHJlZiBsaXN0ICovCitzdGF0aWMgc3RydWN0IHJlZl9saXN0ICpzb3J0X3JlZl9saXN0KHN0cnVjdCByZWZfbGlzdCAqbGlzdCkKK3sKKwlpbnQgcHNpemUsIHFzaXplLCBsYXN0X21lcmdlX2NvdW50LCBjbXA7CisJc3RydWN0IHJlZl9saXN0ICpwLCAqcSwgKmwsICplOworCXN0cnVjdCByZWZfbGlzdCAqbmV3X2xpc3QgPSBsaXN0OworCWludCBrID0gMTsKKwlpbnQgbWVyZ2VfY291bnQgPSAwOworCisJaWYgKCFsaXN0KQorCQlyZXR1cm4gbGlzdDsKKworCWRvIHsKKwkJbGFzdF9tZXJnZV9jb3VudCA9IG1lcmdlX2NvdW50OworCQltZXJnZV9jb3VudCA9IDA7CisKKwkJcHNpemUgPSAwOworCisJCXAgPSBuZXdfbGlzdDsKKwkJcSA9IG5ld19saXN0OworCQluZXdfbGlzdCA9IE5VTEw7CisJCWwgPSBOVUxMOworCisJCXdoaWxlIChwKSB7CisJCQltZXJnZV9jb3VudCsrOworCisJCQl3aGlsZSAocHNpemUgPCBrICYmIHEtPm5leHQpIHsKKwkJCQlxID0gcS0+bmV4dDsKKwkJCQlwc2l6ZSsrOworCQkJfQorCQkJcXNpemUgPSBrOworCisJCQl3aGlsZSAoKHBzaXplID4gMCkgfHwgKHFzaXplID4gMCAmJiBxKSkgeworCQkJCWlmIChxc2l6ZSA9PSAwIHx8ICFxKSB7CisJCQkJCWUgPSBwOworCQkJCQlwID0gcC0+bmV4dDsKKwkJCQkJcHNpemUtLTsKKwkJCQl9IGVsc2UgaWYgKHBzaXplID09IDApIHsKKwkJCQkJZSA9IHE7CisJCQkJCXEgPSBxLT5uZXh0OworCQkJCQlxc2l6ZS0tOworCQkJCX0gZWxzZSB7CisJCQkJCWNtcCA9IHN0cmNtcChxLT5uYW1lLCBwLT5uYW1lKTsKKwkJCQkJaWYgKGNtcCA8IDApIHsKKwkJCQkJCWUgPSBxOworCQkJCQkJcSA9IHEtPm5leHQ7CisJCQkJCQlxc2l6ZS0tOworCQkJCQl9IGVsc2UgaWYgKGNtcCA+IDApIHsKKwkJCQkJCWUgPSBwOworCQkJCQkJcCA9IHAtPm5leHQ7CisJCQkJCQlwc2l6ZS0tOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKGhhc2hjbXAocS0+c2hhMSwgcC0+c2hhMSkpCisJCQkJCQkJZGllKCJEdXBsaWNhdGVkIHJlZiwgYW5kIFNIQTFzIGRvbid0IG1hdGNoOiAlcyIsCisJCQkJCQkJICAgIHEtPm5hbWUpOworCQkJCQkJd2FybmluZygiRHVwbGljYXRlZCByZWY6ICVzIiwgcS0+bmFtZSk7CisJCQkJCQllID0gcTsKKwkJCQkJCXEgPSBxLT5uZXh0OworCQkJCQkJcXNpemUtLTsKKwkJCQkJCWZyZWUoZSk7CisJCQkJCQllID0gcDsKKwkJCQkJCXAgPSBwLT5uZXh0OworCQkJCQkJcHNpemUtLTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWUtPm5leHQgPSBOVUxMOworCisJCQkJaWYgKGwpCisJCQkJCWwtPm5leHQgPSBlOworCQkJCWlmICghbmV3X2xpc3QpCisJCQkJCW5ld19saXN0ID0gZTsKKwkJCQlsID0gZTsKKwkJCX0KKworCQkJcCA9IHE7CisJCX07CisKKwkJayA9IGsgKiAyOworCX0gd2hpbGUgKChsYXN0X21lcmdlX2NvdW50ICE9IG1lcmdlX2NvdW50KSB8fCAobGFzdF9tZXJnZV9jb3VudCAhPSAxKSk7CisKKwlyZXR1cm4gbmV3X2xpc3Q7Cit9CisKKy8qCisgKiBGdXR1cmU6IG5lZWQgdG8gYmUgaW4gInN0cnVjdCByZXBvc2l0b3J5IgorICogd2hlbiBkb2luZyBhIGZ1bGwgbGliaWZpY2F0aW9uLgorICovCitzdGF0aWMgc3RydWN0IGNhY2hlZF9yZWZzIHsKKwljaGFyIGRpZF9sb29zZTsKKwljaGFyIGRpZF9wYWNrZWQ7CisJc3RydWN0IHJlZl9saXN0ICpsb29zZTsKKwlzdHJ1Y3QgcmVmX2xpc3QgKnBhY2tlZDsKK30gY2FjaGVkX3JlZnM7CitzdGF0aWMgc3RydWN0IHJlZl9saXN0ICpjdXJyZW50X3JlZjsKKworc3RhdGljIHZvaWQgZnJlZV9yZWZfbGlzdChzdHJ1Y3QgcmVmX2xpc3QgKmxpc3QpCit7CisJc3RydWN0IHJlZl9saXN0ICpuZXh0OworCWZvciAoIDsgbGlzdDsgbGlzdCA9IG5leHQpIHsKKwkJbmV4dCA9IGxpc3QtPm5leHQ7CisJCWZyZWUobGlzdCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpbnZhbGlkYXRlX2NhY2hlZF9yZWZzKHZvaWQpCit7CisJc3RydWN0IGNhY2hlZF9yZWZzICpjYSA9ICZjYWNoZWRfcmVmczsKKworCWlmIChjYS0+ZGlkX2xvb3NlICYmIGNhLT5sb29zZSkKKwkJZnJlZV9yZWZfbGlzdChjYS0+bG9vc2UpOworCWlmIChjYS0+ZGlkX3BhY2tlZCAmJiBjYS0+cGFja2VkKQorCQlmcmVlX3JlZl9saXN0KGNhLT5wYWNrZWQpOworCWNhLT5sb29zZSA9IGNhLT5wYWNrZWQgPSBOVUxMOworCWNhLT5kaWRfbG9vc2UgPSBjYS0+ZGlkX3BhY2tlZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfcGFja2VkX3JlZnMoRklMRSAqZiwgc3RydWN0IGNhY2hlZF9yZWZzICpjYWNoZWRfcmVmcykKK3sKKwlzdHJ1Y3QgcmVmX2xpc3QgKmxpc3QgPSBOVUxMOworCXN0cnVjdCByZWZfbGlzdCAqbGFzdCA9IE5VTEw7CisJY2hhciByZWZsaW5lW1BBVEhfTUFYXTsKKwlpbnQgZmxhZyA9IFJFRl9JU1BBQ0tFRDsKKworCXdoaWxlIChmZ2V0cyhyZWZsaW5lLCBzaXplb2YocmVmbGluZSksIGYpKSB7CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJCXN0YXRpYyBjb25zdCBjaGFyIGhlYWRlcltdID0gIiMgcGFjay1yZWZzIHdpdGg6IjsKKworCQlpZiAoIXN0cm5jbXAocmVmbGluZSwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKS0xKSkgeworCQkJY29uc3QgY2hhciAqdHJhaXRzID0gcmVmbGluZSArIHNpemVvZihoZWFkZXIpIC0gMTsKKwkJCWlmIChzdHJzdHIodHJhaXRzLCAiIHBlZWxlZCAiKSkKKwkJCQlmbGFnIHw9IFJFRl9LTk9XU19QRUVMRUQ7CisJCQkvKiBwZXJoYXBzIG90aGVyIHRyYWl0cyBsYXRlciBhcyB3ZWxsICovCisJCQljb250aW51ZTsKKwkJfQorCisJCW5hbWUgPSBwYXJzZV9yZWZfbGluZShyZWZsaW5lLCBzaGExKTsKKwkJaWYgKG5hbWUpIHsKKwkJCWxpc3QgPSBhZGRfcmVmKG5hbWUsIHNoYTEsIGZsYWcsIGxpc3QsICZsYXN0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChsYXN0ICYmCisJCSAgICByZWZsaW5lWzBdID09ICdeJyAmJgorCQkgICAgc3RybGVuKHJlZmxpbmUpID09IDQyICYmCisJCSAgICByZWZsaW5lWzQxXSA9PSAnXG4nICYmCisJCSAgICAhZ2V0X3NoYTFfaGV4KHJlZmxpbmUgKyAxLCBzaGExKSkKKwkJCWhhc2hjcHkobGFzdC0+cGVlbGVkLCBzaGExKTsKKwl9CisJY2FjaGVkX3JlZnMtPnBhY2tlZCA9IHNvcnRfcmVmX2xpc3QobGlzdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVmX2xpc3QgKmdldF9wYWNrZWRfcmVmcyh2b2lkKQoreworCWlmICghY2FjaGVkX3JlZnMuZGlkX3BhY2tlZCkgeworCQlGSUxFICpmID0gZm9wZW4oZ2l0X3BhdGgoInBhY2tlZC1yZWZzIiksICJyIik7CisJCWNhY2hlZF9yZWZzLnBhY2tlZCA9IE5VTEw7CisJCWlmIChmKSB7CisJCQlyZWFkX3BhY2tlZF9yZWZzKGYsICZjYWNoZWRfcmVmcyk7CisJCQlmY2xvc2UoZik7CisJCX0KKwkJY2FjaGVkX3JlZnMuZGlkX3BhY2tlZCA9IDE7CisJfQorCXJldHVybiBjYWNoZWRfcmVmcy5wYWNrZWQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVmX2xpc3QgKmdldF9yZWZfZGlyKGNvbnN0IGNoYXIgKmJhc2UsIHN0cnVjdCByZWZfbGlzdCAqbGlzdCkKK3sKKwlESVIgKmRpciA9IG9wZW5kaXIoZ2l0X3BhdGgoIiVzIiwgYmFzZSkpOworCisJaWYgKGRpcikgeworCQlzdHJ1Y3QgZGlyZW50ICpkZTsKKwkJaW50IGJhc2VsZW4gPSBzdHJsZW4oYmFzZSk7CisJCWNoYXIgKnJlZiA9IHhtYWxsb2MoYmFzZWxlbiArIDI1Nyk7CisKKwkJbWVtY3B5KHJlZiwgYmFzZSwgYmFzZWxlbik7CisJCWlmIChiYXNlbGVuICYmIGJhc2VbYmFzZWxlbi0xXSAhPSAnLycpCisJCQlyZWZbYmFzZWxlbisrXSA9ICcvJzsKKworCQl3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQkJc3RydWN0IHN0YXQgc3Q7CisJCQlpbnQgZmxhZzsKKwkJCWludCBuYW1lbGVuOworCisJCQlpZiAoZGUtPmRfbmFtZVswXSA9PSAnLicpCisJCQkJY29udGludWU7CisJCQluYW1lbGVuID0gc3RybGVuKGRlLT5kX25hbWUpOworCQkJaWYgKG5hbWVsZW4gPiAyNTUpCisJCQkJY29udGludWU7CisJCQlpZiAoaGFzX2V4dGVuc2lvbihkZS0+ZF9uYW1lLCAiLmxvY2siKSkKKwkJCQljb250aW51ZTsKKwkJCW1lbWNweShyZWYgKyBiYXNlbGVuLCBkZS0+ZF9uYW1lLCBuYW1lbGVuKzEpOworCQkJaWYgKHN0YXQoZ2l0X3BhdGgoIiVzIiwgcmVmKSwgJnN0KSA8IDApCisJCQkJY29udGludWU7CisJCQlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJCWxpc3QgPSBnZXRfcmVmX2RpcihyZWYsIGxpc3QpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFyZXNvbHZlX3JlZihyZWYsIHNoYTEsIDEsICZmbGFnKSkgeworCQkJCWVycm9yKCIlcyBwb2ludHMgbm93aGVyZSEiLCByZWYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbGlzdCA9IGFkZF9yZWYocmVmLCBzaGExLCBmbGFnLCBsaXN0LCBOVUxMKTsKKwkJfQorCQlmcmVlKHJlZik7CisJCWNsb3NlZGlyKGRpcik7CisJfQorCXJldHVybiBzb3J0X3JlZl9saXN0KGxpc3QpOworfQorCitzdGF0aWMgc3RydWN0IHJlZl9saXN0ICpnZXRfbG9vc2VfcmVmcyh2b2lkKQoreworCWlmICghY2FjaGVkX3JlZnMuZGlkX2xvb3NlKSB7CisJCWNhY2hlZF9yZWZzLmxvb3NlID0gZ2V0X3JlZl9kaXIoInJlZnMiLCBOVUxMKTsKKwkJY2FjaGVkX3JlZnMuZGlkX2xvb3NlID0gMTsKKwl9CisJcmV0dXJuIGNhY2hlZF9yZWZzLmxvb3NlOworfQorCisvKiBXZSBhbGxvdyAicmVjdXJzaXZlIiBzeW1ib2xpYyByZWZzLiBPbmx5IHdpdGhpbiByZWFzb24sIHRob3VnaCAqLworI2RlZmluZSBNQVhERVBUSCA1CisjZGVmaW5lIE1BWFJFRkxFTiAoMTAyNCkKKworc3RhdGljIGludCByZXNvbHZlX2dpdGxpbmtfcGFja2VkX3JlZihjaGFyICpuYW1lLCBpbnQgcGF0aGxlbiwgY29uc3QgY2hhciAqcmVmbmFtZSwgdW5zaWduZWQgY2hhciAqcmVzdWx0KQoreworCUZJTEUgKmY7CisJc3RydWN0IGNhY2hlZF9yZWZzIHJlZnM7CisJc3RydWN0IHJlZl9saXN0ICpyZWY7CisJaW50IHJldHZhbDsKKworCXN0cmNweShuYW1lICsgcGF0aGxlbiwgInBhY2tlZC1yZWZzIik7CisJZiA9IGZvcGVuKG5hbWUsICJyIik7CisJaWYgKCFmKQorCQlyZXR1cm4gLTE7CisJcmVhZF9wYWNrZWRfcmVmcyhmLCAmcmVmcyk7CisJZmNsb3NlKGYpOworCXJlZiA9IHJlZnMucGFja2VkOworCXJldHZhbCA9IC0xOworCXdoaWxlIChyZWYpIHsKKwkJaWYgKCFzdHJjbXAocmVmLT5uYW1lLCByZWZuYW1lKSkgeworCQkJcmV0dmFsID0gMDsKKwkJCW1lbWNweShyZXN1bHQsIHJlZi0+c2hhMSwgMjApOworCQkJYnJlYWs7CisJCX0KKwkJcmVmID0gcmVmLT5uZXh0OworCX0KKwlmcmVlX3JlZl9saXN0KHJlZnMucGFja2VkKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHJlc29sdmVfZ2l0bGlua19yZWZfcmVjdXJzaXZlKGNoYXIgKm5hbWUsIGludCBwYXRobGVuLCBjb25zdCBjaGFyICpyZWZuYW1lLCB1bnNpZ25lZCBjaGFyICpyZXN1bHQsIGludCByZWN1cnNpb24pCit7CisJaW50IGZkLCBsZW4gPSBzdHJsZW4ocmVmbmFtZSk7CisJY2hhciBidWZmZXJbMTI4XSwgKnA7CisKKwlpZiAocmVjdXJzaW9uID4gTUFYREVQVEggfHwgbGVuID4gTUFYUkVGTEVOKQorCQlyZXR1cm4gLTE7CisJbWVtY3B5KG5hbWUgKyBwYXRobGVuLCByZWZuYW1lLCBsZW4rMSk7CisJZmQgPSBvcGVuKG5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gcmVzb2x2ZV9naXRsaW5rX3BhY2tlZF9yZWYobmFtZSwgcGF0aGxlbiwgcmVmbmFtZSwgcmVzdWx0KTsKKworCWxlbiA9IHJlYWQoZmQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciktMSk7CisJY2xvc2UoZmQpOworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gLTE7CisJd2hpbGUgKGxlbiAmJiBpc3NwYWNlKGJ1ZmZlcltsZW4tMV0pKQorCQlsZW4tLTsKKwlidWZmZXJbbGVuXSA9IDA7CisKKwkvKiBXYXMgaXQgYSBkZXRhY2hlZCBoZWFkIG9yIGFuIG9sZC1mYXNoaW9uZWQgc3ltbGluaz8gKi8KKwlpZiAoIWdldF9zaGExX2hleChidWZmZXIsIHJlc3VsdCkpCisJCXJldHVybiAwOworCisJLyogU3ltcmVmPyAqLworCWlmIChzdHJuY21wKGJ1ZmZlciwgInJlZjoiLCA0KSkKKwkJcmV0dXJuIC0xOworCXAgPSBidWZmZXIgKyA0OworCXdoaWxlIChpc3NwYWNlKCpwKSkKKwkJcCsrOworCisJcmV0dXJuIHJlc29sdmVfZ2l0bGlua19yZWZfcmVjdXJzaXZlKG5hbWUsIHBhdGhsZW4sIHAsIHJlc3VsdCwgcmVjdXJzaW9uKzEpOworfQorCitpbnQgcmVzb2x2ZV9naXRsaW5rX3JlZihjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpyZWZuYW1lLCB1bnNpZ25lZCBjaGFyICpyZXN1bHQpCit7CisJaW50IGxlbiA9IHN0cmxlbihwYXRoKSwgcmV0dmFsOworCWNoYXIgKmdpdGRpcjsKKworCXdoaWxlIChsZW4gJiYgcGF0aFtsZW4tMV0gPT0gJy8nKQorCQlsZW4tLTsKKwlpZiAoIWxlbikKKwkJcmV0dXJuIC0xOworCWdpdGRpciA9IHhtYWxsb2MobGVuICsgTUFYUkVGTEVOICsgOCk7CisJbWVtY3B5KGdpdGRpciwgcGF0aCwgbGVuKTsKKwltZW1jcHkoZ2l0ZGlyICsgbGVuLCAiLy5naXQvIiwgNyk7CisKKwlyZXR2YWwgPSByZXNvbHZlX2dpdGxpbmtfcmVmX3JlY3Vyc2l2ZShnaXRkaXIsIGxlbis2LCByZWZuYW1lLCByZXN1bHQsIDApOworCWZyZWUoZ2l0ZGlyKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitjb25zdCBjaGFyICpyZXNvbHZlX3JlZihjb25zdCBjaGFyICpyZWYsIHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCByZWFkaW5nLCBpbnQgKmZsYWcpCit7CisJaW50IGRlcHRoID0gTUFYREVQVEgsIGxlbjsKKwljaGFyIGJ1ZmZlclsyNTZdOworCXN0YXRpYyBjaGFyIHJlZl9idWZmZXJbMjU2XTsKKworCWlmIChmbGFnKQorCQkqZmxhZyA9IDA7CisKKwlmb3IgKDs7KSB7CisJCWNvbnN0IGNoYXIgKnBhdGggPSBnaXRfcGF0aCgiJXMiLCByZWYpOworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJY2hhciAqYnVmOworCQlpbnQgZmQ7CisKKwkJaWYgKC0tZGVwdGggPCAwKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJLyogU3BlY2lhbCBjYXNlOiBub24tZXhpc3RpbmcgZmlsZS4KKwkJICogTm90IGhhdmluZyB0aGUgcmVmcy9oZWFkcy9uZXctYnJhbmNoIGlzIE9LCisJCSAqIGlmIHdlIGFyZSB3cml0aW5nIGludG8gaXQsIHNvIGlzIC5naXQvSEVBRAorCQkgKiB0aGF0IHBvaW50cyBhdCByZWZzL2hlYWRzL21hc3RlciBzdGlsbCB0byBiZQorCQkgKiBib3JuLiAgSXQgaXMgTk9UIE9LIGlmIHdlIGFyZSByZXNvbHZpbmcgZm9yCisJCSAqIHJlYWRpbmcuCisJCSAqLworCQlpZiAobHN0YXQocGF0aCwgJnN0KSA8IDApIHsKKwkJCXN0cnVjdCByZWZfbGlzdCAqbGlzdCA9IGdldF9wYWNrZWRfcmVmcygpOworCQkJd2hpbGUgKGxpc3QpIHsKKwkJCQlpZiAoIXN0cmNtcChyZWYsIGxpc3QtPm5hbWUpKSB7CisJCQkJCWhhc2hjcHkoc2hhMSwgbGlzdC0+c2hhMSk7CisJCQkJCWlmIChmbGFnKQorCQkJCQkJKmZsYWcgfD0gUkVGX0lTUEFDS0VEOworCQkJCQlyZXR1cm4gcmVmOworCQkJCX0KKwkJCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJCX0KKwkJCWlmIChyZWFkaW5nIHx8IGVycm5vICE9IEVOT0VOVCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCWhhc2hjbHIoc2hhMSk7CisJCQlyZXR1cm4gcmVmOworCQl9CisKKwkJLyogRm9sbG93ICJub3JtYWxpemVkIiAtIGllICJyZWZzLy4uIiBzeW1saW5rcyBieSBoYW5kICovCisJCWlmIChTX0lTTE5LKHN0LnN0X21vZGUpKSB7CisJCQlsZW4gPSByZWFkbGluayhwYXRoLCBidWZmZXIsIHNpemVvZihidWZmZXIpLTEpOworCQkJaWYgKGxlbiA+PSA1ICYmICFtZW1jbXAoInJlZnMvIiwgYnVmZmVyLCA1KSkgeworCQkJCWJ1ZmZlcltsZW5dID0gMDsKKwkJCQlzdHJjcHkocmVmX2J1ZmZlciwgYnVmZmVyKTsKKwkJCQlyZWYgPSByZWZfYnVmZmVyOworCQkJCWlmIChmbGFnKQorCQkJCQkqZmxhZyB8PSBSRUZfSVNTWU1SRUY7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKiBJcyBpdCBhIGRpcmVjdG9yeT8gKi8KKwkJaWYgKFNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKwkJCWVycm5vID0gRUlTRElSOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQkvKgorCQkgKiBBbnl0aGluZyBlbHNlLCBqdXN0IG9wZW4gaXQgYW5kIHRyeSB0byB1c2UgaXQgYXMKKwkJICogYSByZWYKKwkJICovCisJCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJCWlmIChmZCA8IDApCisJCQlyZXR1cm4gTlVMTDsKKwkJbGVuID0gcmVhZF9pbl9mdWxsKGZkLCBidWZmZXIsIHNpemVvZihidWZmZXIpLTEpOworCQljbG9zZShmZCk7CisKKwkJLyoKKwkJICogSXMgaXQgYSBzeW1ib2xpYyByZWY/CisJCSAqLworCQlpZiAobGVuIDwgNCB8fCBtZW1jbXAoInJlZjoiLCBidWZmZXIsIDQpKQorCQkJYnJlYWs7CisJCWJ1ZiA9IGJ1ZmZlciArIDQ7CisJCWxlbiAtPSA0OworCQl3aGlsZSAobGVuICYmIGlzc3BhY2UoKmJ1ZikpCisJCQlidWYrKywgbGVuLS07CisJCXdoaWxlIChsZW4gJiYgaXNzcGFjZShidWZbbGVuLTFdKSkKKwkJCWxlbi0tOworCQlidWZbbGVuXSA9IDA7CisJCW1lbWNweShyZWZfYnVmZmVyLCBidWYsIGxlbiArIDEpOworCQlyZWYgPSByZWZfYnVmZmVyOworCQlpZiAoZmxhZykKKwkJCSpmbGFnIHw9IFJFRl9JU1NZTVJFRjsKKwl9CisJaWYgKGxlbiA8IDQwIHx8IGdldF9zaGExX2hleChidWZmZXIsIHNoYTEpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gcmVmOworfQorCitpbnQgcmVhZF9yZWYoY29uc3QgY2hhciAqcmVmLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWlmIChyZXNvbHZlX3JlZihyZWYsIHNoYTEsIDEsIE5VTEwpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZG9fb25lX3JlZihjb25zdCBjaGFyICpiYXNlLCBlYWNoX3JlZl9mbiBmbiwgaW50IHRyaW0sCisJCSAgICAgIHZvaWQgKmNiX2RhdGEsIHN0cnVjdCByZWZfbGlzdCAqZW50cnkpCit7CisJaWYgKHN0cm5jbXAoYmFzZSwgZW50cnktPm5hbWUsIHRyaW0pKQorCQlyZXR1cm4gMDsKKwlpZiAoaXNfbnVsbF9zaGExKGVudHJ5LT5zaGExKSkKKwkJcmV0dXJuIDA7CisJaWYgKCFoYXNfc2hhMV9maWxlKGVudHJ5LT5zaGExKSkgeworCQllcnJvcigiJXMgZG9lcyBub3QgcG9pbnQgdG8gYSB2YWxpZCBvYmplY3QhIiwgZW50cnktPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJY3VycmVudF9yZWYgPSBlbnRyeTsKKwlyZXR1cm4gZm4oZW50cnktPm5hbWUgKyB0cmltLCBlbnRyeS0+c2hhMSwgZW50cnktPmZsYWcsIGNiX2RhdGEpOworfQorCitpbnQgcGVlbF9yZWYoY29uc3QgY2hhciAqcmVmLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBmbGFnOworCXVuc2lnbmVkIGNoYXIgYmFzZVsyMF07CisJc3RydWN0IG9iamVjdCAqbzsKKworCWlmIChjdXJyZW50X3JlZiAmJiAoY3VycmVudF9yZWYtPm5hbWUgPT0gcmVmCisJCXx8ICFzdHJjbXAoY3VycmVudF9yZWYtPm5hbWUsIHJlZikpKSB7CisJCWlmIChjdXJyZW50X3JlZi0+ZmxhZyAmIFJFRl9LTk9XU19QRUVMRUQpIHsKKwkJCWhhc2hjcHkoc2hhMSwgY3VycmVudF9yZWYtPnBlZWxlZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQloYXNoY3B5KGJhc2UsIGN1cnJlbnRfcmVmLT5zaGExKTsKKwkJZ290byBmYWxsYmFjazsKKwl9CisKKwlpZiAoIXJlc29sdmVfcmVmKHJlZiwgYmFzZSwgMSwgJmZsYWcpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoKGZsYWcgJiBSRUZfSVNQQUNLRUQpKSB7CisJCXN0cnVjdCByZWZfbGlzdCAqbGlzdCA9IGdldF9wYWNrZWRfcmVmcygpOworCisJCXdoaWxlIChsaXN0KSB7CisJCQlpZiAoIXN0cmNtcChsaXN0LT5uYW1lLCByZWYpKSB7CisJCQkJaWYgKGxpc3QtPmZsYWcgJiBSRUZfS05PV1NfUEVFTEVEKSB7CisJCQkJCWhhc2hjcHkoc2hhMSwgbGlzdC0+cGVlbGVkKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCS8qIG9sZGVyIHBhY2stcmVmcyBkaWQgbm90IGxlYXZlIHBlZWxlZCBvbmVzICovCisJCQkJYnJlYWs7CisJCQl9CisJCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJfQorCX0KKworZmFsbGJhY2s6CisJbyA9IHBhcnNlX29iamVjdChiYXNlKTsKKwlpZiAobyAmJiBvLT50eXBlID09IE9CSl9UQUcpIHsKKwkJbyA9IGRlcmVmX3RhZyhvLCByZWYsIDApOworCQlpZiAobykgeworCQkJaGFzaGNweShzaGExLCBvLT5zaGExKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBkb19mb3JfZWFjaF9yZWYoY29uc3QgY2hhciAqYmFzZSwgZWFjaF9yZWZfZm4gZm4sIGludCB0cmltLAorCQkJICAgdm9pZCAqY2JfZGF0YSkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgcmVmX2xpc3QgKnBhY2tlZCA9IGdldF9wYWNrZWRfcmVmcygpOworCXN0cnVjdCByZWZfbGlzdCAqbG9vc2UgPSBnZXRfbG9vc2VfcmVmcygpOworCisJd2hpbGUgKHBhY2tlZCAmJiBsb29zZSkgeworCQlzdHJ1Y3QgcmVmX2xpc3QgKmVudHJ5OworCQlpbnQgY21wID0gc3RyY21wKHBhY2tlZC0+bmFtZSwgbG9vc2UtPm5hbWUpOworCQlpZiAoIWNtcCkgeworCQkJcGFja2VkID0gcGFja2VkLT5uZXh0OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNtcCA+IDApIHsKKwkJCWVudHJ5ID0gbG9vc2U7CisJCQlsb29zZSA9IGxvb3NlLT5uZXh0OworCQl9IGVsc2UgeworCQkJZW50cnkgPSBwYWNrZWQ7CisJCQlwYWNrZWQgPSBwYWNrZWQtPm5leHQ7CisJCX0KKwkJcmV0dmFsID0gZG9fb25lX3JlZihiYXNlLCBmbiwgdHJpbSwgY2JfZGF0YSwgZW50cnkpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBlbmRfZWFjaDsKKwl9CisKKwlmb3IgKHBhY2tlZCA9IHBhY2tlZCA/IHBhY2tlZCA6IGxvb3NlOyBwYWNrZWQ7IHBhY2tlZCA9IHBhY2tlZC0+bmV4dCkgeworCQlyZXR2YWwgPSBkb19vbmVfcmVmKGJhc2UsIGZuLCB0cmltLCBjYl9kYXRhLCBwYWNrZWQpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBlbmRfZWFjaDsKKwl9CisKK2VuZF9lYWNoOgorCWN1cnJlbnRfcmVmID0gTlVMTDsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgaGVhZF9yZWYoZWFjaF9yZWZfZm4gZm4sIHZvaWQgKmNiX2RhdGEpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlpbnQgZmxhZzsKKworCWlmIChyZXNvbHZlX3JlZigiSEVBRCIsIHNoYTEsIDEsICZmbGFnKSkKKwkJcmV0dXJuIGZuKCJIRUFEIiwgc2hhMSwgZmxhZywgY2JfZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBmb3JfZWFjaF9yZWYoZWFjaF9yZWZfZm4gZm4sIHZvaWQgKmNiX2RhdGEpCit7CisJcmV0dXJuIGRvX2Zvcl9lYWNoX3JlZigicmVmcy8iLCBmbiwgMCwgY2JfZGF0YSk7Cit9CisKK2ludCBmb3JfZWFjaF90YWdfcmVmKGVhY2hfcmVmX2ZuIGZuLCB2b2lkICpjYl9kYXRhKQoreworCXJldHVybiBkb19mb3JfZWFjaF9yZWYoInJlZnMvdGFncy8iLCBmbiwgMTAsIGNiX2RhdGEpOworfQorCitpbnQgZm9yX2VhY2hfYnJhbmNoX3JlZihlYWNoX3JlZl9mbiBmbiwgdm9pZCAqY2JfZGF0YSkKK3sKKwlyZXR1cm4gZG9fZm9yX2VhY2hfcmVmKCJyZWZzL2hlYWRzLyIsIGZuLCAxMSwgY2JfZGF0YSk7Cit9CisKK2ludCBmb3JfZWFjaF9yZW1vdGVfcmVmKGVhY2hfcmVmX2ZuIGZuLCB2b2lkICpjYl9kYXRhKQoreworCXJldHVybiBkb19mb3JfZWFjaF9yZWYoInJlZnMvcmVtb3Rlcy8iLCBmbiwgMTMsIGNiX2RhdGEpOworfQorCisvKgorICogTWFrZSBzdXJlICJyZWYiIGlzIHNvbWV0aGluZyByZWFzb25hYmxlIHRvIGhhdmUgdW5kZXIgIi5naXQvcmVmcy8iOworICogV2UgZG8gbm90IGxpa2UgaXQgaWY6CisgKgorICogLSBhbnkgcGF0aCBjb21wb25lbnQgb2YgaXQgYmVnaW5zIHdpdGggIi4iLCBvcgorICogLSBpdCBoYXMgZG91YmxlIGRvdHMgIi4uIiwgb3IKKyAqIC0gaXQgaGFzIEFTQ0lJIGNvbnRyb2wgY2hhcmFjdGVyLCAifiIsICJeIiwgIjoiIG9yIFNQLCBhbnl3aGVyZSwgb3IKKyAqIC0gaXQgZW5kcyB3aXRoIGEgIi8iLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGJhZF9yZWZfY2hhcihpbnQgY2gpCit7CisJaWYgKCgodW5zaWduZWQpIGNoKSA8PSAnICcgfHwKKwkgICAgY2ggPT0gJ34nIHx8IGNoID09ICdeJyB8fCBjaCA9PSAnOicpCisJCXJldHVybiAxOworCS8qIDIuMTMgUGF0dGVybiBNYXRjaGluZyBOb3RhdGlvbiAqLworCWlmIChjaCA9PSAnPycgfHwgY2ggPT0gJ1snKSAvKiBVbnN1cHBvcnRlZCAqLworCQlyZXR1cm4gMTsKKwlpZiAoY2ggPT0gJyonKSAvKiBTdXBwb3J0ZWQgYXQgdGhlIGVuZCAqLworCQlyZXR1cm4gMjsKKwlyZXR1cm4gMDsKK30KKworaW50IGNoZWNrX3JlZl9mb3JtYXQoY29uc3QgY2hhciAqcmVmKQoreworCWludCBjaCwgbGV2ZWwsIGJhZF90eXBlOworCWNvbnN0IGNoYXIgKmNwID0gcmVmOworCisJbGV2ZWwgPSAwOworCXdoaWxlICgxKSB7CisJCXdoaWxlICgoY2ggPSAqY3ArKykgPT0gJy8nKQorCQkJOyAvKiB0b2xlcmF0ZSBkdXBsaWNhdGVkIHNsYXNoZXMgKi8KKwkJaWYgKCFjaCkKKwkJCS8qIHNob3VsZCBub3QgZW5kIHdpdGggc2xhc2hlcyAqLworCQkJcmV0dXJuIENIRUNLX1JFRl9GT1JNQVRfRVJST1I7CisKKwkJLyogd2UgYXJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhdGggY29tcG9uZW50ICovCisJCWlmIChjaCA9PSAnLicpCisJCQlyZXR1cm4gQ0hFQ0tfUkVGX0ZPUk1BVF9FUlJPUjsKKwkJYmFkX3R5cGUgPSBiYWRfcmVmX2NoYXIoY2gpOworCQlpZiAoYmFkX3R5cGUpIHsKKwkJCXJldHVybiAoYmFkX3R5cGUgPT0gMiAmJiAhKmNwKQorCQkJCT8gQ0hFQ0tfUkVGX0ZPUk1BVF9XSUxEQ0FSRAorCQkJCTogQ0hFQ0tfUkVGX0ZPUk1BVF9FUlJPUjsKKwkJfQorCisJCS8qIHNjYW4gdGhlIHJlc3Qgb2YgdGhlIHBhdGggY29tcG9uZW50ICovCisJCXdoaWxlICgoY2ggPSAqY3ArKykgIT0gMCkgeworCQkJYmFkX3R5cGUgPSBiYWRfcmVmX2NoYXIoY2gpOworCQkJaWYgKGJhZF90eXBlKSB7CisJCQkJcmV0dXJuIChiYWRfdHlwZSA9PSAyICYmICEqY3ApCisJCQkJCT8gQ0hFQ0tfUkVGX0ZPUk1BVF9XSUxEQ0FSRAorCQkJCQk6IENIRUNLX1JFRl9GT1JNQVRfRVJST1I7CisJCQl9CisJCQlpZiAoY2ggPT0gJy8nKQorCQkJCWJyZWFrOworCQkJaWYgKGNoID09ICcuJyAmJiAqY3AgPT0gJy4nKQorCQkJCXJldHVybiBDSEVDS19SRUZfRk9STUFUX0VSUk9SOworCQl9CisJCWxldmVsKys7CisJCWlmICghY2gpIHsKKwkJCWlmIChsZXZlbCA8IDIpCisJCQkJcmV0dXJuIENIRUNLX1JFRl9GT1JNQVRfT05FTEVWRUw7CisJCQlyZXR1cm4gQ0hFQ0tfUkVGX0ZPUk1BVF9PSzsKKwkJfQorCX0KK30KKworY29uc3QgY2hhciAqcmVmX3Jldl9wYXJzZV9ydWxlc1tdID0geworCSIlLipzIiwKKwkicmVmcy8lLipzIiwKKwkicmVmcy90YWdzLyUuKnMiLAorCSJyZWZzL2hlYWRzLyUuKnMiLAorCSJyZWZzL3JlbW90ZXMvJS4qcyIsCisJInJlZnMvcmVtb3Rlcy8lLipzL0hFQUQiLAorCU5VTEwKK307CisKK2NvbnN0IGNoYXIgKnJlZl9mZXRjaF9ydWxlc1tdID0geworCSIlLipzIiwKKwkicmVmcy8lLipzIiwKKwkicmVmcy9oZWFkcy8lLipzIiwKKwlOVUxMCit9OworCitpbnQgcmVmbmFtZV9tYXRjaChjb25zdCBjaGFyICphYmJyZXZfbmFtZSwgY29uc3QgY2hhciAqZnVsbF9uYW1lLCBjb25zdCBjaGFyICoqcnVsZXMpCit7CisJY29uc3QgY2hhciAqKnA7CisJY29uc3QgaW50IGFiYnJldl9uYW1lX2xlbiA9IHN0cmxlbihhYmJyZXZfbmFtZSk7CisKKwlmb3IgKHAgPSBydWxlczsgKnA7IHArKykgeworCQlpZiAoIXN0cmNtcChmdWxsX25hbWUsIG1rcGF0aCgqcCwgYWJicmV2X25hbWVfbGVuLCBhYmJyZXZfbmFtZSkpKSB7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHJlZl9sb2NrICp2ZXJpZnlfbG9jayhzdHJ1Y3QgcmVmX2xvY2sgKmxvY2ssCisJY29uc3QgdW5zaWduZWQgY2hhciAqb2xkX3NoYTEsIGludCBtdXN0ZXhpc3QpCit7CisJaWYgKCFyZXNvbHZlX3JlZihsb2NrLT5yZWZfbmFtZSwgbG9jay0+b2xkX3NoYTEsIG11c3RleGlzdCwgTlVMTCkpIHsKKwkJZXJyb3IoIkNhbid0IHZlcmlmeSByZWYgJXMiLCBsb2NrLT5yZWZfbmFtZSk7CisJCXVubG9ja19yZWYobG9jayk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoaGFzaGNtcChsb2NrLT5vbGRfc2hhMSwgb2xkX3NoYTEpKSB7CisJCWVycm9yKCJSZWYgJXMgaXMgYXQgJXMgYnV0IGV4cGVjdGVkICVzIiwgbG9jay0+cmVmX25hbWUsCisJCQlzaGExX3RvX2hleChsb2NrLT5vbGRfc2hhMSksIHNoYTFfdG9faGV4KG9sZF9zaGExKSk7CisJCXVubG9ja19yZWYobG9jayk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gbG9jazsKK30KKworc3RhdGljIGludCByZW1vdmVfZW1wdHlfZGlyZWN0b3JpZXMoY29uc3QgY2hhciAqZmlsZSkKK3sKKwkvKiB3ZSB3YW50IHRvIGNyZWF0ZSBhIGZpbGUgYnV0IHRoZXJlIGlzIGEgZGlyZWN0b3J5IHRoZXJlOworCSAqIGlmIHRoYXQgaXMgYW4gZW1wdHkgZGlyZWN0b3J5IChvciBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zCisJICogb25seSBlbXB0eSBkaXJlY3RvcmllcyksIHJlbW92ZSB0aGVtLgorCSAqLworCXN0cnVjdCBzdHJidWYgcGF0aDsKKwlpbnQgcmVzdWx0OworCisJc3RyYnVmX2luaXQoJnBhdGgsIDIwKTsKKwlzdHJidWZfYWRkc3RyKCZwYXRoLCBmaWxlKTsKKworCXJlc3VsdCA9IHJlbW92ZV9kaXJfcmVjdXJzaXZlbHkoJnBhdGgsIDEpOworCisJc3RyYnVmX3JlbGVhc2UoJnBhdGgpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBpc19yZWZuYW1lX2F2YWlsYWJsZShjb25zdCBjaGFyICpyZWYsIGNvbnN0IGNoYXIgKm9sZHJlZiwKKwkJCQlzdHJ1Y3QgcmVmX2xpc3QgKmxpc3QsIGludCBxdWlldCkKK3sKKwlpbnQgbmFtbGVuID0gc3RybGVuKHJlZik7IC8qIGUuZy4gJ2Zvby9iYXInICovCisJd2hpbGUgKGxpc3QpIHsKKwkJLyogbGlzdC0+bmFtZSBjb3VsZCBiZSAnZm9vJyBvciAnZm9vL2Jhci9iYXonICovCisJCWlmICghb2xkcmVmIHx8IHN0cmNtcChvbGRyZWYsIGxpc3QtPm5hbWUpKSB7CisJCQlpbnQgbGVuID0gc3RybGVuKGxpc3QtPm5hbWUpOworCQkJaW50IGNtcGxlbiA9IChuYW1sZW4gPCBsZW4pID8gbmFtbGVuIDogbGVuOworCQkJY29uc3QgY2hhciAqbGVhZCA9IChuYW1sZW4gPCBsZW4pID8gbGlzdC0+bmFtZSA6IHJlZjsKKwkJCWlmICghc3RybmNtcChyZWYsIGxpc3QtPm5hbWUsIGNtcGxlbikgJiYKKwkJCSAgICBsZWFkW2NtcGxlbl0gPT0gJy8nKSB7CisJCQkJaWYgKCFxdWlldCkKKwkJCQkJZXJyb3IoIiclcycgZXhpc3RzOyBjYW5ub3QgY3JlYXRlICclcyciLAorCQkJCQkgICAgICBsaXN0LT5uYW1lLCByZWYpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCWxpc3QgPSBsaXN0LT5uZXh0OworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCByZWZfbG9jayAqbG9ja19yZWZfc2hhMV9iYXNpYyhjb25zdCBjaGFyICpyZWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZF9zaGExLCBpbnQgZmxhZ3MsIGludCAqdHlwZV9wKQoreworCWNoYXIgKnJlZl9maWxlOworCWNvbnN0IGNoYXIgKm9yaWdfcmVmID0gcmVmOworCXN0cnVjdCByZWZfbG9jayAqbG9jazsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlpbnQgbGFzdF9lcnJubyA9IDA7CisJaW50IHR5cGU7CisJaW50IG11c3RleGlzdCA9IChvbGRfc2hhMSAmJiAhaXNfbnVsbF9zaGExKG9sZF9zaGExKSk7CisKKwlsb2NrID0geGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHJlZl9sb2NrKSk7CisJbG9jay0+bG9ja19mZCA9IC0xOworCisJcmVmID0gcmVzb2x2ZV9yZWYocmVmLCBsb2NrLT5vbGRfc2hhMSwgbXVzdGV4aXN0LCAmdHlwZSk7CisJaWYgKCFyZWYgJiYgZXJybm8gPT0gRUlTRElSKSB7CisJCS8qIHdlIGFyZSB0cnlpbmcgdG8gbG9jayBmb28gYnV0IHdlIHVzZWQgdG8KKwkJICogaGF2ZSBmb28vYmFyIHdoaWNoIG5vdyBkb2VzIG5vdCBleGlzdDsKKwkJICogaXQgaXMgbm9ybWFsIGZvciB0aGUgZW1wdHkgZGlyZWN0b3J5ICdmb28nCisJCSAqIHRvIHJlbWFpbi4KKwkJICovCisJCXJlZl9maWxlID0gZ2l0X3BhdGgoIiVzIiwgb3JpZ19yZWYpOworCQlpZiAocmVtb3ZlX2VtcHR5X2RpcmVjdG9yaWVzKHJlZl9maWxlKSkgeworCQkJbGFzdF9lcnJubyA9IGVycm5vOworCQkJZXJyb3IoInRoZXJlIGFyZSBzdGlsbCByZWZzIHVuZGVyICclcyciLCBvcmlnX3JlZik7CisJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJfQorCQlyZWYgPSByZXNvbHZlX3JlZihvcmlnX3JlZiwgbG9jay0+b2xkX3NoYTEsIG11c3RleGlzdCwgJnR5cGUpOworCX0KKwlpZiAodHlwZV9wKQorCSAgICAqdHlwZV9wID0gdHlwZTsKKwlpZiAoIXJlZikgeworCQlsYXN0X2Vycm5vID0gZXJybm87CisJCWVycm9yKCJ1bmFibGUgdG8gcmVzb2x2ZSByZWZlcmVuY2UgJXM6ICVzIiwKKwkJCW9yaWdfcmVmLCBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIGVycm9yX3JldHVybjsKKwl9CisJLyogV2hlbiB0aGUgcmVmIGRpZCBub3QgZXhpc3QgYW5kIHdlIGFyZSBjcmVhdGluZyBpdCwKKwkgKiBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gZXhpc3RpbmcgcmVmIHRoYXQgaXMgcGFja2VkCisJICogd2hvc2UgbmFtZSBiZWdpbnMgd2l0aCBvdXIgcmVmbmFtZSwgbm9yIGEgcmVmIHdob3NlCisJICogbmFtZSBpcyBhIHByb3BlciBwcmVmaXggb2Ygb3VyIHJlZm5hbWUuCisJICovCisJaWYgKGlzX251bGxfc2hhMShsb2NrLT5vbGRfc2hhMSkgJiYKKyAgICAgICAgICAgICFpc19yZWZuYW1lX2F2YWlsYWJsZShyZWYsIE5VTEwsIGdldF9wYWNrZWRfcmVmcygpLCAwKSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisKKwlsb2NrLT5sayA9IHhjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBsb2NrX2ZpbGUpKTsKKworCWlmIChmbGFncyAmIFJFRl9OT0RFUkVGKQorCQlyZWYgPSBvcmlnX3JlZjsKKwlsb2NrLT5yZWZfbmFtZSA9IHhzdHJkdXAocmVmKTsKKwlsb2NrLT5vcmlnX3JlZl9uYW1lID0geHN0cmR1cChvcmlnX3JlZik7CisJcmVmX2ZpbGUgPSBnaXRfcGF0aCgiJXMiLCByZWYpOworCWlmIChsc3RhdChyZWZfZmlsZSwgJnN0KSAmJiBlcnJubyA9PSBFTk9FTlQpCisJCWxvY2stPmZvcmNlX3dyaXRlID0gMTsKKwlpZiAoKGZsYWdzICYgUkVGX05PREVSRUYpICYmICh0eXBlICYgUkVGX0lTU1lNUkVGKSkKKwkJbG9jay0+Zm9yY2Vfd3JpdGUgPSAxOworCisJaWYgKHNhZmVfY3JlYXRlX2xlYWRpbmdfZGlyZWN0b3JpZXMocmVmX2ZpbGUpKSB7CisJCWxhc3RfZXJybm8gPSBlcnJubzsKKwkJZXJyb3IoInVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3J5IGZvciAlcyIsIHJlZl9maWxlKTsKKwkJZ290byBlcnJvcl9yZXR1cm47CisJfQorCWxvY2stPmxvY2tfZmQgPSBob2xkX2xvY2tfZmlsZV9mb3JfdXBkYXRlKGxvY2stPmxrLCByZWZfZmlsZSwgMSk7CisKKwlyZXR1cm4gb2xkX3NoYTEgPyB2ZXJpZnlfbG9jayhsb2NrLCBvbGRfc2hhMSwgbXVzdGV4aXN0KSA6IGxvY2s7CisKKyBlcnJvcl9yZXR1cm46CisJdW5sb2NrX3JlZihsb2NrKTsKKwllcnJubyA9IGxhc3RfZXJybm87CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCByZWZfbG9jayAqbG9ja19yZWZfc2hhMShjb25zdCBjaGFyICpyZWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZF9zaGExKQoreworCWNoYXIgcmVmcGF0aFtQQVRIX01BWF07CisJaWYgKGNoZWNrX3JlZl9mb3JtYXQocmVmKSkKKwkJcmV0dXJuIE5VTEw7CisJc3RyY3B5KHJlZnBhdGgsIG1rcGF0aCgicmVmcy8lcyIsIHJlZikpOworCXJldHVybiBsb2NrX3JlZl9zaGExX2Jhc2ljKHJlZnBhdGgsIG9sZF9zaGExLCAwLCBOVUxMKTsKK30KKworc3RydWN0IHJlZl9sb2NrICpsb2NrX2FueV9yZWZfZm9yX3VwZGF0ZShjb25zdCBjaGFyICpyZWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZF9zaGExLCBpbnQgZmxhZ3MpCit7CisJc3dpdGNoIChjaGVja19yZWZfZm9ybWF0KHJlZikpIHsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwljYXNlIDA6CisJY2FzZSBDSEVDS19SRUZfRk9STUFUX09ORUxFVkVMOgorCQlyZXR1cm4gbG9ja19yZWZfc2hhMV9iYXNpYyhyZWYsIG9sZF9zaGExLCBmbGFncywgTlVMTCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGxvY2tfZmlsZSBwYWNrbG9jazsKKworc3RhdGljIGludCByZXBhY2tfd2l0aG91dF9yZWYoY29uc3QgY2hhciAqcmVmbmFtZSkKK3sKKwlzdHJ1Y3QgcmVmX2xpc3QgKmxpc3QsICpwYWNrZWRfcmVmX2xpc3Q7CisJaW50IGZkOworCWludCBmb3VuZCA9IDA7CisKKwlwYWNrZWRfcmVmX2xpc3QgPSBnZXRfcGFja2VkX3JlZnMoKTsKKwlmb3IgKGxpc3QgPSBwYWNrZWRfcmVmX2xpc3Q7IGxpc3Q7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCWlmICghc3RyY21wKHJlZm5hbWUsIGxpc3QtPm5hbWUpKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIWZvdW5kKQorCQlyZXR1cm4gMDsKKwlmZCA9IGhvbGRfbG9ja19maWxlX2Zvcl91cGRhdGUoJnBhY2tsb2NrLCBnaXRfcGF0aCgicGFja2VkLXJlZnMiKSwgMCk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGVycm9yKCJjYW5ub3QgZGVsZXRlICclcycgZnJvbSBwYWNrZWQgcmVmcyIsIHJlZm5hbWUpOworCisJZm9yIChsaXN0ID0gcGFja2VkX3JlZl9saXN0OyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQljaGFyIGxpbmVbUEFUSF9NQVggKyAxMDBdOworCQlpbnQgbGVuOworCisJCWlmICghc3RyY21wKHJlZm5hbWUsIGxpc3QtPm5hbWUpKQorCQkJY29udGludWU7CisJCWxlbiA9IHNucHJpbnRmKGxpbmUsIHNpemVvZihsaW5lKSwgIiVzICVzXG4iLAorCQkJICAgICAgIHNoYTFfdG9faGV4KGxpc3QtPnNoYTEpLCBsaXN0LT5uYW1lKTsKKwkJLyogdGhpcyBzaG91bGQgbm90IGhhcHBlbiBidXQganVzdCBiZWluZyBkZWZlbnNpdmUgKi8KKwkJaWYgKGxlbiA+IHNpemVvZihsaW5lKSkKKwkJCWRpZSgidG9vIGxvbmcgYSByZWZuYW1lICclcyciLCBsaXN0LT5uYW1lKTsKKwkJd3JpdGVfb3JfZGllKGZkLCBsaW5lLCBsZW4pOworCX0KKwlyZXR1cm4gY29tbWl0X2xvY2tfZmlsZSgmcGFja2xvY2spOworfQorCitpbnQgZGVsZXRlX3JlZihjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCByZWZfbG9jayAqbG9jazsKKwlpbnQgZXJyLCBpLCByZXQgPSAwLCBmbGFnID0gMDsKKworCWxvY2sgPSBsb2NrX3JlZl9zaGExX2Jhc2ljKHJlZm5hbWUsIHNoYTEsIDAsICZmbGFnKTsKKwlpZiAoIWxvY2spCisJCXJldHVybiAxOworCWlmICghKGZsYWcgJiBSRUZfSVNQQUNLRUQpKSB7CisJCS8qIGxvb3NlICovCisJCWkgPSBzdHJsZW4obG9jay0+bGstPmZpbGVuYW1lKSAtIDU7IC8qIC5sb2NrICovCisJCWxvY2stPmxrLT5maWxlbmFtZVtpXSA9IDA7CisJCWVyciA9IHVubGluayhsb2NrLT5say0+ZmlsZW5hbWUpOworCQlpZiAoZXJyKSB7CisJCQlyZXQgPSAxOworCQkJZXJyb3IoInVubGluayglcykgZmFpbGVkOiAlcyIsCisJCQkgICAgICBsb2NrLT5say0+ZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCX0KKwkJbG9jay0+bGstPmZpbGVuYW1lW2ldID0gJy4nOworCX0KKwkvKiByZW1vdmluZyB0aGUgbG9vc2Ugb25lIGNvdWxkIGhhdmUgcmVzdXJyZWN0ZWQgYW4gZWFybGllcgorCSAqIHBhY2tlZCBvbmUuICBBbHNvLCBpZiBpdCB3YXMgbm90IGxvb3NlIHdlIG5lZWQgdG8gcmVwYWNrCisJICogd2l0aG91dCBpdC4KKwkgKi8KKwlyZXQgfD0gcmVwYWNrX3dpdGhvdXRfcmVmKHJlZm5hbWUpOworCisJZXJyID0gdW5saW5rKGdpdF9wYXRoKCJsb2dzLyVzIiwgbG9jay0+cmVmX25hbWUpKTsKKwlpZiAoZXJyICYmIGVycm5vICE9IEVOT0VOVCkKKwkJZnByaW50ZihzdGRlcnIsICJ3YXJuaW5nOiB1bmxpbmsoJXMpIGZhaWxlZDogJXMiLAorCQkJZ2l0X3BhdGgoImxvZ3MvJXMiLCBsb2NrLT5yZWZfbmFtZSksIHN0cmVycm9yKGVycm5vKSk7CisJaW52YWxpZGF0ZV9jYWNoZWRfcmVmcygpOworCXVubG9ja19yZWYobG9jayk7CisJcmV0dXJuIHJldDsKK30KKworaW50IHJlbmFtZV9yZWYoY29uc3QgY2hhciAqb2xkcmVmLCBjb25zdCBjaGFyICpuZXdyZWYsIGNvbnN0IGNoYXIgKmxvZ21zZykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciByZW5hbWVkX3JlZltdID0gIlJFTkFNRUQtUkVGIjsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdLCBvcmlnX3NoYTFbMjBdOworCWludCBmbGFnID0gMCwgbG9nbW92ZWQgPSAwOworCXN0cnVjdCByZWZfbG9jayAqbG9jazsKKwlzdHJ1Y3Qgc3RhdCBsb2dpbmZvOworCWludCBsb2cgPSAhbHN0YXQoZ2l0X3BhdGgoImxvZ3MvJXMiLCBvbGRyZWYpLCAmbG9naW5mbyk7CisKKwlpZiAoU19JU0xOSyhsb2dpbmZvLnN0X21vZGUpKQorCQlyZXR1cm4gZXJyb3IoInJlZmxvZyBmb3IgJXMgaXMgYSBzeW1saW5rIiwgb2xkcmVmKTsKKworCWlmICghcmVzb2x2ZV9yZWYob2xkcmVmLCBvcmlnX3NoYTEsIDEsICZmbGFnKSkKKwkJcmV0dXJuIGVycm9yKCJyZWZuYW1lICVzIG5vdCBmb3VuZCIsIG9sZHJlZik7CisKKwlpZiAoIWlzX3JlZm5hbWVfYXZhaWxhYmxlKG5ld3JlZiwgb2xkcmVmLCBnZXRfcGFja2VkX3JlZnMoKSwgMCkpCisJCXJldHVybiAxOworCisJaWYgKCFpc19yZWZuYW1lX2F2YWlsYWJsZShuZXdyZWYsIG9sZHJlZiwgZ2V0X2xvb3NlX3JlZnMoKSwgMCkpCisJCXJldHVybiAxOworCisJbG9jayA9IGxvY2tfcmVmX3NoYTFfYmFzaWMocmVuYW1lZF9yZWYsIE5VTEwsIDAsIE5VTEwpOworCWlmICghbG9jaykKKwkJcmV0dXJuIGVycm9yKCJ1bmFibGUgdG8gbG9jayAlcyIsIHJlbmFtZWRfcmVmKTsKKwlsb2NrLT5mb3JjZV93cml0ZSA9IDE7CisJaWYgKHdyaXRlX3JlZl9zaGExKGxvY2ssIG9yaWdfc2hhMSwgbG9nbXNnKSkKKwkJcmV0dXJuIGVycm9yKCJ1bmFibGUgdG8gc2F2ZSBjdXJyZW50IHNoYTEgaW4gJXMiLCByZW5hbWVkX3JlZik7CisKKwlpZiAobG9nICYmIHJlbmFtZShnaXRfcGF0aCgibG9ncy8lcyIsIG9sZHJlZiksIGdpdF9wYXRoKCJ0bXAtcmVuYW1lZC1sb2ciKSkpCisJCXJldHVybiBlcnJvcigidW5hYmxlIHRvIG1vdmUgbG9nZmlsZSBsb2dzLyVzIHRvIHRtcC1yZW5hbWVkLWxvZzogJXMiLAorCQkJb2xkcmVmLCBzdHJlcnJvcihlcnJubykpOworCisJaWYgKGRlbGV0ZV9yZWYob2xkcmVmLCBvcmlnX3NoYTEpKSB7CisJCWVycm9yKCJ1bmFibGUgdG8gZGVsZXRlIG9sZCAlcyIsIG9sZHJlZik7CisJCWdvdG8gcm9sbGJhY2s7CisJfQorCisJaWYgKHJlc29sdmVfcmVmKG5ld3JlZiwgc2hhMSwgMSwgJmZsYWcpICYmIGRlbGV0ZV9yZWYobmV3cmVmLCBzaGExKSkgeworCQlpZiAoZXJybm89PUVJU0RJUikgeworCQkJaWYgKHJlbW92ZV9lbXB0eV9kaXJlY3RvcmllcyhnaXRfcGF0aCgiJXMiLCBuZXdyZWYpKSkgeworCQkJCWVycm9yKCJEaXJlY3Rvcnkgbm90IGVtcHR5OiAlcyIsIG5ld3JlZik7CisJCQkJZ290byByb2xsYmFjazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWVycm9yKCJ1bmFibGUgdG8gZGVsZXRlIGV4aXN0aW5nICVzIiwgbmV3cmVmKTsKKwkJCWdvdG8gcm9sbGJhY2s7CisJCX0KKwl9CisKKwlpZiAobG9nICYmIHNhZmVfY3JlYXRlX2xlYWRpbmdfZGlyZWN0b3JpZXMoZ2l0X3BhdGgoImxvZ3MvJXMiLCBuZXdyZWYpKSkgeworCQllcnJvcigidW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcnkgZm9yICVzIiwgbmV3cmVmKTsKKwkJZ290byByb2xsYmFjazsKKwl9CisKKyByZXRyeToKKwlpZiAobG9nICYmIHJlbmFtZShnaXRfcGF0aCgidG1wLXJlbmFtZWQtbG9nIiksIGdpdF9wYXRoKCJsb2dzLyVzIiwgbmV3cmVmKSkpIHsKKwkJaWYgKGVycm5vPT1FSVNESVIgfHwgZXJybm89PUVOT1RESVIpIHsKKwkJCS8qCisJCQkgKiByZW5hbWUoYSwgYikgd2hlbiBiIGlzIGFuIGV4aXN0aW5nCisJCQkgKiBkaXJlY3Rvcnkgb3VnaHQgdG8gcmVzdWx0IGluIElTRElSLCBidXQKKwkJCSAqIFNvbGFyaXMgNS44IGdpdmVzIEVOT1RESVIuICBTaGVlc2guCisJCQkgKi8KKwkJCWlmIChyZW1vdmVfZW1wdHlfZGlyZWN0b3JpZXMoZ2l0X3BhdGgoImxvZ3MvJXMiLCBuZXdyZWYpKSkgeworCQkJCWVycm9yKCJEaXJlY3Rvcnkgbm90IGVtcHR5OiBsb2dzLyVzIiwgbmV3cmVmKTsKKwkJCQlnb3RvIHJvbGxiYWNrOworCQkJfQorCQkJZ290byByZXRyeTsKKwkJfSBlbHNlIHsKKwkJCWVycm9yKCJ1bmFibGUgdG8gbW92ZSBsb2dmaWxlIHRtcC1yZW5hbWVkLWxvZyB0byBsb2dzLyVzOiAlcyIsCisJCQkJbmV3cmVmLCBzdHJlcnJvcihlcnJubykpOworCQkJZ290byByb2xsYmFjazsKKwkJfQorCX0KKwlsb2dtb3ZlZCA9IGxvZzsKKworCWxvY2sgPSBsb2NrX3JlZl9zaGExX2Jhc2ljKG5ld3JlZiwgTlVMTCwgMCwgTlVMTCk7CisJaWYgKCFsb2NrKSB7CisJCWVycm9yKCJ1bmFibGUgdG8gbG9jayAlcyBmb3IgdXBkYXRlIiwgbmV3cmVmKTsKKwkJZ290byByb2xsYmFjazsKKwl9CisKKwlsb2NrLT5mb3JjZV93cml0ZSA9IDE7CisJaGFzaGNweShsb2NrLT5vbGRfc2hhMSwgb3JpZ19zaGExKTsKKwlpZiAod3JpdGVfcmVmX3NoYTEobG9jaywgb3JpZ19zaGExLCBsb2dtc2cpKSB7CisJCWVycm9yKCJ1bmFibGUgdG8gd3JpdGUgY3VycmVudCBzaGExIGludG8gJXMiLCBuZXdyZWYpOworCQlnb3RvIHJvbGxiYWNrOworCX0KKworCXJldHVybiAwOworCisgcm9sbGJhY2s6CisJbG9jayA9IGxvY2tfcmVmX3NoYTFfYmFzaWMob2xkcmVmLCBOVUxMLCAwLCBOVUxMKTsKKwlpZiAoIWxvY2spIHsKKwkJZXJyb3IoInVuYWJsZSB0byBsb2NrICVzIGZvciByb2xsYmFjayIsIG9sZHJlZik7CisJCWdvdG8gcm9sbGJhY2tsb2c7CisJfQorCisJbG9jay0+Zm9yY2Vfd3JpdGUgPSAxOworCWZsYWcgPSBsb2dfYWxsX3JlZl91cGRhdGVzOworCWxvZ19hbGxfcmVmX3VwZGF0ZXMgPSAwOworCWlmICh3cml0ZV9yZWZfc2hhMShsb2NrLCBvcmlnX3NoYTEsIE5VTEwpKQorCQllcnJvcigidW5hYmxlIHRvIHdyaXRlIGN1cnJlbnQgc2hhMSBpbnRvICVzIiwgb2xkcmVmKTsKKwlsb2dfYWxsX3JlZl91cGRhdGVzID0gZmxhZzsKKworIHJvbGxiYWNrbG9nOgorCWlmIChsb2dtb3ZlZCAmJiByZW5hbWUoZ2l0X3BhdGgoImxvZ3MvJXMiLCBuZXdyZWYpLCBnaXRfcGF0aCgibG9ncy8lcyIsIG9sZHJlZikpKQorCQllcnJvcigidW5hYmxlIHRvIHJlc3RvcmUgbG9nZmlsZSAlcyBmcm9tICVzOiAlcyIsCisJCQlvbGRyZWYsIG5ld3JlZiwgc3RyZXJyb3IoZXJybm8pKTsKKwlpZiAoIWxvZ21vdmVkICYmIGxvZyAmJgorCSAgICByZW5hbWUoZ2l0X3BhdGgoInRtcC1yZW5hbWVkLWxvZyIpLCBnaXRfcGF0aCgibG9ncy8lcyIsIG9sZHJlZikpKQorCQllcnJvcigidW5hYmxlIHRvIHJlc3RvcmUgbG9nZmlsZSAlcyBmcm9tIHRtcC1yZW5hbWVkLWxvZzogJXMiLAorCQkJb2xkcmVmLCBzdHJlcnJvcihlcnJubykpOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBjbG9zZV9yZWYoc3RydWN0IHJlZl9sb2NrICpsb2NrKQoreworCWlmIChjbG9zZV9sb2NrX2ZpbGUobG9jay0+bGspKQorCQlyZXR1cm4gLTE7CisJbG9jay0+bG9ja19mZCA9IC0xOworCXJldHVybiAwOworfQorCitpbnQgY29tbWl0X3JlZihzdHJ1Y3QgcmVmX2xvY2sgKmxvY2spCit7CisJaWYgKGNvbW1pdF9sb2NrX2ZpbGUobG9jay0+bGspKQorCQlyZXR1cm4gLTE7CisJbG9jay0+bG9ja19mZCA9IC0xOworCXJldHVybiAwOworfQorCit2b2lkIHVubG9ja19yZWYoc3RydWN0IHJlZl9sb2NrICpsb2NrKQoreworCS8qIERvIG5vdCBmcmVlIGxvY2stPmxrIC0tIGF0ZXhpdCgpIHN0aWxsIGxvb2tzIGF0IHRoZW0gKi8KKwlpZiAobG9jay0+bGspCisJCXJvbGxiYWNrX2xvY2tfZmlsZShsb2NrLT5sayk7CisJZnJlZShsb2NrLT5yZWZfbmFtZSk7CisJZnJlZShsb2NrLT5vcmlnX3JlZl9uYW1lKTsKKwlmcmVlKGxvY2spOworfQorCisvKgorICogY29weSB0aGUgcmVmbG9nIG1lc3NhZ2UgbXNnIHRvIGJ1Ziwgd2hpY2ggaGFzIGJlZW4gYWxsb2NhdGVkIHN1ZmZpY2llbnRseQorICogbGFyZ2UsIHdoaWxlIGNsZWFuaW5nIHVwIHRoZSB3aGl0ZXNwYWNlcy4gIEVzcGVjaWFsbHksIGNvbnZlcnQgTEYgdG8gc3BhY2UsCisgKiBiZWNhdXNlIHJlZmxvZyBmaWxlIGlzIG9uZSBsaW5lIHBlciBlbnRyeS4KKyAqLworc3RhdGljIGludCBjb3B5X21zZyhjaGFyICpidWYsIGNvbnN0IGNoYXIgKm1zZykKK3sKKwljaGFyICpjcCA9IGJ1ZjsKKwljaGFyIGM7CisJaW50IHdhc3NwYWNlID0gMTsKKworCSpjcCsrID0gJ1x0JzsKKwl3aGlsZSAoKGMgPSAqbXNnKyspKSB7CisJCWlmICh3YXNzcGFjZSAmJiBpc3NwYWNlKGMpKQorCQkJY29udGludWU7CisJCXdhc3NwYWNlID0gaXNzcGFjZShjKTsKKwkJaWYgKHdhc3NwYWNlKQorCQkJYyA9ICcgJzsKKwkJKmNwKysgPSBjOworCX0KKwl3aGlsZSAoYnVmIDwgY3AgJiYgaXNzcGFjZShjcFstMV0pKQorCQljcC0tOworCSpjcCsrID0gJ1xuJzsKKwlyZXR1cm4gY3AgLSBidWY7Cit9CisKK3N0YXRpYyBpbnQgbG9nX3JlZl93cml0ZShjb25zdCBjaGFyICpyZWZfbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqb2xkX3NoYTEsCisJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqbmV3X3NoYTEsIGNvbnN0IGNoYXIgKm1zZykKK3sKKwlpbnQgbG9nZmQsIHdyaXR0ZW4sIG9mbGFncyA9IE9fQVBQRU5EIHwgT19XUk9OTFk7CisJdW5zaWduZWQgbWF4bGVuLCBsZW47CisJaW50IG1zZ2xlbjsKKwljaGFyICpsb2dfZmlsZSwgKmxvZ3JlYzsKKwljb25zdCBjaGFyICpjb21taXR0ZXI7CisKKwlpZiAobG9nX2FsbF9yZWZfdXBkYXRlcyA8IDApCisJCWxvZ19hbGxfcmVmX3VwZGF0ZXMgPSAhaXNfYmFyZV9yZXBvc2l0b3J5KCk7CisKKwlsb2dfZmlsZSA9IGdpdF9wYXRoKCJsb2dzLyVzIiwgcmVmX25hbWUpOworCisJaWYgKGxvZ19hbGxfcmVmX3VwZGF0ZXMgJiYKKwkgICAgKCFwcmVmaXhjbXAocmVmX25hbWUsICJyZWZzL2hlYWRzLyIpIHx8CisJICAgICAhcHJlZml4Y21wKHJlZl9uYW1lLCAicmVmcy9yZW1vdGVzLyIpIHx8CisJICAgICAhc3RyY21wKHJlZl9uYW1lLCAiSEVBRCIpKSkgeworCQlpZiAoc2FmZV9jcmVhdGVfbGVhZGluZ19kaXJlY3Rvcmllcyhsb2dfZmlsZSkgPCAwKQorCQkJcmV0dXJuIGVycm9yKCJ1bmFibGUgdG8gY3JlYXRlIGRpcmVjdG9yeSBmb3IgJXMiLAorCQkJCSAgICAgbG9nX2ZpbGUpOworCQlvZmxhZ3MgfD0gT19DUkVBVDsKKwl9CisKKwlsb2dmZCA9IG9wZW4obG9nX2ZpbGUsIG9mbGFncywgMDY2Nik7CisJaWYgKGxvZ2ZkIDwgMCkgeworCQlpZiAoIShvZmxhZ3MgJiBPX0NSRUFUKSAmJiBlcnJubyA9PSBFTk9FTlQpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoKG9mbGFncyAmIE9fQ1JFQVQpICYmIGVycm5vID09IEVJU0RJUikgeworCQkJaWYgKHJlbW92ZV9lbXB0eV9kaXJlY3Rvcmllcyhsb2dfZmlsZSkpIHsKKwkJCQlyZXR1cm4gZXJyb3IoIlRoZXJlIGFyZSBzdGlsbCBsb2dzIHVuZGVyICclcyciLAorCQkJCQkgICAgIGxvZ19maWxlKTsKKwkJCX0KKwkJCWxvZ2ZkID0gb3Blbihsb2dfZmlsZSwgb2ZsYWdzLCAwNjY2KTsKKwkJfQorCisJCWlmIChsb2dmZCA8IDApCisJCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBhcHBlbmQgdG8gJXM6ICVzIiwKKwkJCQkgICAgIGxvZ19maWxlLCBzdHJlcnJvcihlcnJubykpOworCX0KKworCWFkanVzdF9zaGFyZWRfcGVybShsb2dfZmlsZSk7CisKKwltc2dsZW4gPSBtc2cgPyBzdHJsZW4obXNnKSA6IDA7CisJY29tbWl0dGVyID0gZ2l0X2NvbW1pdHRlcl9pbmZvKDApOworCW1heGxlbiA9IHN0cmxlbihjb21taXR0ZXIpICsgbXNnbGVuICsgMTAwOworCWxvZ3JlYyA9IHhtYWxsb2MobWF4bGVuKTsKKwlsZW4gPSBzcHJpbnRmKGxvZ3JlYywgIiVzICVzICVzXG4iLAorCQkgICAgICBzaGExX3RvX2hleChvbGRfc2hhMSksCisJCSAgICAgIHNoYTFfdG9faGV4KG5ld19zaGExKSwKKwkJICAgICAgY29tbWl0dGVyKTsKKwlpZiAobXNnbGVuKQorCQlsZW4gKz0gY29weV9tc2cobG9ncmVjICsgbGVuIC0gMSwgbXNnKSAtIDE7CisJd3JpdHRlbiA9IGxlbiA8PSBtYXhsZW4gPyB3cml0ZV9pbl9mdWxsKGxvZ2ZkLCBsb2dyZWMsIGxlbikgOiAtMTsKKwlmcmVlKGxvZ3JlYyk7CisJaWYgKGNsb3NlKGxvZ2ZkKSAhPSAwIHx8IHdyaXR0ZW4gIT0gbGVuKQorCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBhcHBlbmQgdG8gJXMiLCBsb2dfZmlsZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNfYnJhbmNoKGNvbnN0IGNoYXIgKnJlZm5hbWUpCit7CisJcmV0dXJuICFzdHJjbXAocmVmbmFtZSwgIkhFQUQiKSB8fCAhcHJlZml4Y21wKHJlZm5hbWUsICJyZWZzL2hlYWRzLyIpOworfQorCitpbnQgd3JpdGVfcmVmX3NoYTEoc3RydWN0IHJlZl9sb2NrICpsb2NrLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKmxvZ21zZykKK3sKKwlzdGF0aWMgY2hhciB0ZXJtID0gJ1xuJzsKKwlzdHJ1Y3Qgb2JqZWN0ICpvOworCisJaWYgKCFsb2NrKQorCQlyZXR1cm4gLTE7CisJaWYgKCFsb2NrLT5mb3JjZV93cml0ZSAmJiAhaGFzaGNtcChsb2NrLT5vbGRfc2hhMSwgc2hhMSkpIHsKKwkJdW5sb2NrX3JlZihsb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCW8gPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJaWYgKCFvKSB7CisJCWVycm9yKCJUcnlpbmcgdG8gd3JpdGUgcmVmICVzIHdpdGggbm9uZXhpc3RhbnQgb2JqZWN0ICVzIiwKKwkJCWxvY2stPnJlZl9uYW1lLCBzaGExX3RvX2hleChzaGExKSk7CisJCXVubG9ja19yZWYobG9jayk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKG8tPnR5cGUgIT0gT0JKX0NPTU1JVCAmJiBpc19icmFuY2gobG9jay0+cmVmX25hbWUpKSB7CisJCWVycm9yKCJUcnlpbmcgdG8gd3JpdGUgbm9uLWNvbW1pdCBvYmplY3QgJXMgdG8gYnJhbmNoICVzIiwKKwkJCXNoYTFfdG9faGV4KHNoYTEpLCBsb2NrLT5yZWZfbmFtZSk7CisJCXVubG9ja19yZWYobG9jayk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHdyaXRlX2luX2Z1bGwobG9jay0+bG9ja19mZCwgc2hhMV90b19oZXgoc2hhMSksIDQwKSAhPSA0MCB8fAorCSAgICB3cml0ZV9pbl9mdWxsKGxvY2stPmxvY2tfZmQsICZ0ZXJtLCAxKSAhPSAxCisJCXx8IGNsb3NlX3JlZihsb2NrKSA8IDApIHsKKwkJZXJyb3IoIkNvdWxkbid0IHdyaXRlICVzIiwgbG9jay0+bGstPmZpbGVuYW1lKTsKKwkJdW5sb2NrX3JlZihsb2NrKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpbnZhbGlkYXRlX2NhY2hlZF9yZWZzKCk7CisJaWYgKGxvZ19yZWZfd3JpdGUobG9jay0+cmVmX25hbWUsIGxvY2stPm9sZF9zaGExLCBzaGExLCBsb2dtc2cpIDwgMCB8fAorCSAgICAoc3RyY21wKGxvY2stPnJlZl9uYW1lLCBsb2NrLT5vcmlnX3JlZl9uYW1lKSAmJgorCSAgICAgbG9nX3JlZl93cml0ZShsb2NrLT5vcmlnX3JlZl9uYW1lLCBsb2NrLT5vbGRfc2hhMSwgc2hhMSwgbG9nbXNnKSA8IDApKSB7CisJCXVubG9ja19yZWYobG9jayk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHN0cmNtcChsb2NrLT5vcmlnX3JlZl9uYW1lLCAiSEVBRCIpICE9IDApIHsKKwkJLyoKKwkJICogU3BlY2lhbCBoYWNrOiBJZiBhIGJyYW5jaCBpcyB1cGRhdGVkIGRpcmVjdGx5IGFuZCBIRUFECisJCSAqIHBvaW50cyB0byBpdCAobWF5IGhhcHBlbiBvbiB0aGUgcmVtb3RlIHNpZGUgb2YgYSBwdXNoCisJCSAqIGZvciBleGFtcGxlKSB0aGVuIGxvZ2ljYWxseSB0aGUgSEVBRCByZWZsb2cgc2hvdWxkIGJlCisJCSAqIHVwZGF0ZWQgdG9vLgorCQkgKiBBIGdlbmVyaWMgc29sdXRpb24gaW1wbGllcyByZXZlcnNlIHN5bXJlZiBpbmZvcm1hdGlvbiwKKwkJICogYnV0IGZpbmRpbmcgYWxsIHN5bXJlZnMgcG9pbnRpbmcgdG8gdGhlIGdpdmVuIGJyYW5jaAorCQkgKiB3b3VsZCBiZSByYXRoZXIgY29zdGx5IGZvciB0aGlzIHJhcmUgZXZlbnQgKHRoZSBkaXJlY3QKKwkJICogdXBkYXRlIG9mIGEgYnJhbmNoKSB0byBiZSB3b3J0aCBpdC4gIFNvIGxldCdzIGNoZWF0IGFuZAorCQkgKiBjaGVjayB3aXRoIEhFQUQgb25seSB3aGljaCBzaG91bGQgY292ZXIgOTklIG9mIGFsbCB1c2FnZQorCQkgKiBzY2VuYXJpb3MgKGV2ZW4gMTAwJSBvZiB0aGUgZGVmYXVsdCBvbmVzKS4KKwkJICovCisJCXVuc2lnbmVkIGNoYXIgaGVhZF9zaGExWzIwXTsKKwkJaW50IGhlYWRfZmxhZzsKKwkJY29uc3QgY2hhciAqaGVhZF9yZWY7CisJCWhlYWRfcmVmID0gcmVzb2x2ZV9yZWYoIkhFQUQiLCBoZWFkX3NoYTEsIDEsICZoZWFkX2ZsYWcpOworCQlpZiAoaGVhZF9yZWYgJiYgKGhlYWRfZmxhZyAmIFJFRl9JU1NZTVJFRikgJiYKKwkJICAgICFzdHJjbXAoaGVhZF9yZWYsIGxvY2stPnJlZl9uYW1lKSkKKwkJCWxvZ19yZWZfd3JpdGUoIkhFQUQiLCBsb2NrLT5vbGRfc2hhMSwgc2hhMSwgbG9nbXNnKTsKKwl9CisJaWYgKGNvbW1pdF9yZWYobG9jaykpIHsKKwkJZXJyb3IoIkNvdWxkbid0IHNldCAlcyIsIGxvY2stPnJlZl9uYW1lKTsKKwkJdW5sb2NrX3JlZihsb2NrKTsKKwkJcmV0dXJuIC0xOworCX0KKwl1bmxvY2tfcmVmKGxvY2spOworCXJldHVybiAwOworfQorCitpbnQgY3JlYXRlX3N5bXJlZihjb25zdCBjaGFyICpyZWZfdGFyZ2V0LCBjb25zdCBjaGFyICpyZWZzX2hlYWRzX21hc3RlciwKKwkJICBjb25zdCBjaGFyICpsb2dtc2cpCit7CisJY29uc3QgY2hhciAqbG9ja3BhdGg7CisJY2hhciByZWZbMTAwMF07CisJaW50IGZkLCBsZW4sIHdyaXR0ZW47CisJY2hhciAqZ2l0X0hFQUQgPSB4c3RyZHVwKGdpdF9wYXRoKCIlcyIsIHJlZl90YXJnZXQpKTsKKwl1bnNpZ25lZCBjaGFyIG9sZF9zaGExWzIwXSwgbmV3X3NoYTFbMjBdOworCisJaWYgKGxvZ21zZyAmJiByZWFkX3JlZihyZWZfdGFyZ2V0LCBvbGRfc2hhMSkpCisJCWhhc2hjbHIob2xkX3NoYTEpOworCisJaWYgKHNhZmVfY3JlYXRlX2xlYWRpbmdfZGlyZWN0b3JpZXMoZ2l0X0hFQUQpIDwgMCkKKwkJcmV0dXJuIGVycm9yKCJ1bmFibGUgdG8gY3JlYXRlIGRpcmVjdG9yeSBmb3IgJXMiLCBnaXRfSEVBRCk7CisKKyNpZm5kZWYgTk9fU1lNTElOS19IRUFECisJaWYgKHByZWZlcl9zeW1saW5rX3JlZnMpIHsKKwkJdW5saW5rKGdpdF9IRUFEKTsKKwkJaWYgKCFzeW1saW5rKHJlZnNfaGVhZHNfbWFzdGVyLCBnaXRfSEVBRCkpCisJCQlnb3RvIGRvbmU7CisJCWZwcmludGYoc3RkZXJyLCAibm8gc3ltbGluayAtIGZhbGxpbmcgYmFjayB0byBzeW1ib2xpYyByZWZcbiIpOworCX0KKyNlbmRpZgorCisJbGVuID0gc25wcmludGYocmVmLCBzaXplb2YocmVmKSwgInJlZjogJXNcbiIsIHJlZnNfaGVhZHNfbWFzdGVyKTsKKwlpZiAoc2l6ZW9mKHJlZikgPD0gbGVuKSB7CisJCWVycm9yKCJyZWZuYW1lIHRvbyBsb25nOiAlcyIsIHJlZnNfaGVhZHNfbWFzdGVyKTsKKwkJZ290byBlcnJvcl9mcmVlX3JldHVybjsKKwl9CisJbG9ja3BhdGggPSBta3BhdGgoIiVzLmxvY2siLCBnaXRfSEVBRCk7CisJZmQgPSBvcGVuKGxvY2twYXRoLCBPX0NSRUFUIHwgT19FWENMIHwgT19XUk9OTFksIDA2NjYpOworCWlmIChmZCA8IDApIHsKKwkJZXJyb3IoIlVuYWJsZSB0byBvcGVuICVzIGZvciB3cml0aW5nIiwgbG9ja3BhdGgpOworCQlnb3RvIGVycm9yX2ZyZWVfcmV0dXJuOworCX0KKwl3cml0dGVuID0gd3JpdGVfaW5fZnVsbChmZCwgcmVmLCBsZW4pOworCWlmIChjbG9zZShmZCkgIT0gMCB8fCB3cml0dGVuICE9IGxlbikgeworCQllcnJvcigiVW5hYmxlIHRvIHdyaXRlIHRvICVzIiwgbG9ja3BhdGgpOworCQlnb3RvIGVycm9yX3VubGlua19yZXR1cm47CisJfQorCWlmIChyZW5hbWUobG9ja3BhdGgsIGdpdF9IRUFEKSA8IDApIHsKKwkJZXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgJXMiLCBnaXRfSEVBRCk7CisJCWdvdG8gZXJyb3JfdW5saW5rX3JldHVybjsKKwl9CisJaWYgKGFkanVzdF9zaGFyZWRfcGVybShnaXRfSEVBRCkpIHsKKwkJZXJyb3IoIlVuYWJsZSB0byBmaXggcGVybWlzc2lvbnMgb24gJXMiLCBsb2NrcGF0aCk7CisJZXJyb3JfdW5saW5rX3JldHVybjoKKwkJdW5saW5rKGxvY2twYXRoKTsKKwllcnJvcl9mcmVlX3JldHVybjoKKwkJZnJlZShnaXRfSEVBRCk7CisJCXJldHVybiAtMTsKKwl9CisKKyNpZm5kZWYgTk9fU1lNTElOS19IRUFECisJZG9uZToKKyNlbmRpZgorCWlmIChsb2dtc2cgJiYgIXJlYWRfcmVmKHJlZnNfaGVhZHNfbWFzdGVyLCBuZXdfc2hhMSkpCisJCWxvZ19yZWZfd3JpdGUocmVmX3RhcmdldCwgb2xkX3NoYTEsIG5ld19zaGExLCBsb2dtc2cpOworCisJZnJlZShnaXRfSEVBRCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICpyZWZfbXNnKGNvbnN0IGNoYXIgKmxpbmUsIGNvbnN0IGNoYXIgKmVuZHApCit7CisJY29uc3QgY2hhciAqZXA7CisJbGluZSArPSA4MjsKKwllcCA9IG1lbWNocihsaW5lLCAnXG4nLCBlbmRwIC0gbGluZSk7CisJaWYgKCFlcCkKKwkJZXAgPSBlbmRwOworCXJldHVybiB4bWVtZHVweihsaW5lLCBlcCAtIGxpbmUpOworfQorCitpbnQgcmVhZF9yZWZfYXQoY29uc3QgY2hhciAqcmVmLCB1bnNpZ25lZCBsb25nIGF0X3RpbWUsIGludCBjbnQsIHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNoYXIgKiptc2csIHVuc2lnbmVkIGxvbmcgKmN1dG9mZl90aW1lLCBpbnQgKmN1dG9mZl90eiwgaW50ICpjdXRvZmZfY250KQoreworCWNvbnN0IGNoYXIgKmxvZ2ZpbGUsICpsb2dkYXRhLCAqbG9nZW5kLCAqcmVjLCAqbGFzdGd0LCAqbGFzdHJlYzsKKwljaGFyICp0el9jOworCWludCBsb2dmZCwgdHosIHJlY2NudCA9IDA7CisJc3RydWN0IHN0YXQgc3Q7CisJdW5zaWduZWQgbG9uZyBkYXRlOworCXVuc2lnbmVkIGNoYXIgbG9nZ2VkX3NoYTFbMjBdOworCXZvaWQgKmxvZ19tYXBwZWQ7CisJc2l6ZV90IG1hcHN6OworCisJbG9nZmlsZSA9IGdpdF9wYXRoKCJsb2dzLyVzIiwgcmVmKTsKKwlsb2dmZCA9IG9wZW4obG9nZmlsZSwgT19SRE9OTFksIDApOworCWlmIChsb2dmZCA8IDApCisJCWRpZSgiVW5hYmxlIHRvIHJlYWQgbG9nICVzOiAlcyIsIGxvZ2ZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisJZnN0YXQobG9nZmQsICZzdCk7CisJaWYgKCFzdC5zdF9zaXplKQorCQlkaWUoIkxvZyAlcyBpcyBlbXB0eS4iLCBsb2dmaWxlKTsKKwltYXBzeiA9IHhzaXplX3Qoc3Quc3Rfc2l6ZSk7CisJbG9nX21hcHBlZCA9IHhtbWFwKE5VTEwsIG1hcHN6LCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBsb2dmZCwgMCk7CisJbG9nZGF0YSA9IGxvZ19tYXBwZWQ7CisJY2xvc2UobG9nZmQpOworCisJbGFzdHJlYyA9IE5VTEw7CisJcmVjID0gbG9nZW5kID0gbG9nZGF0YSArIHN0LnN0X3NpemU7CisJd2hpbGUgKGxvZ2RhdGEgPCByZWMpIHsKKwkJcmVjY250Kys7CisJCWlmIChsb2dkYXRhIDwgcmVjICYmICoocmVjLTEpID09ICdcbicpCisJCQlyZWMtLTsKKwkJbGFzdGd0ID0gTlVMTDsKKwkJd2hpbGUgKGxvZ2RhdGEgPCByZWMgJiYgKihyZWMtMSkgIT0gJ1xuJykgeworCQkJcmVjLS07CisJCQlpZiAoKnJlYyA9PSAnPicpCisJCQkJbGFzdGd0ID0gcmVjOworCQl9CisJCWlmICghbGFzdGd0KQorCQkJZGllKCJMb2cgJXMgaXMgY29ycnVwdC4iLCBsb2dmaWxlKTsKKwkJZGF0ZSA9IHN0cnRvdWwobGFzdGd0ICsgMSwgJnR6X2MsIDEwKTsKKwkJaWYgKGRhdGUgPD0gYXRfdGltZSB8fCBjbnQgPT0gMCkgeworCQkJdHogPSBzdHJ0b3VsKHR6X2MsIE5VTEwsIDEwKTsKKwkJCWlmIChtc2cpCisJCQkJKm1zZyA9IHJlZl9tc2cocmVjLCBsb2dlbmQpOworCQkJaWYgKGN1dG9mZl90aW1lKQorCQkJCSpjdXRvZmZfdGltZSA9IGRhdGU7CisJCQlpZiAoY3V0b2ZmX3R6KQorCQkJCSpjdXRvZmZfdHogPSB0ejsKKwkJCWlmIChjdXRvZmZfY250KQorCQkJCSpjdXRvZmZfY250ID0gcmVjY250IC0gMTsKKwkJCWlmIChsYXN0cmVjKSB7CisJCQkJaWYgKGdldF9zaGExX2hleChsYXN0cmVjLCBsb2dnZWRfc2hhMSkpCisJCQkJCWRpZSgiTG9nICVzIGlzIGNvcnJ1cHQuIiwgbG9nZmlsZSk7CisJCQkJaWYgKGdldF9zaGExX2hleChyZWMgKyA0MSwgc2hhMSkpCisJCQkJCWRpZSgiTG9nICVzIGlzIGNvcnJ1cHQuIiwgbG9nZmlsZSk7CisJCQkJaWYgKGhhc2hjbXAobG9nZ2VkX3NoYTEsIHNoYTEpKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkJIndhcm5pbmc6IExvZyAlcyBoYXMgZ2FwIGFmdGVyICVzLlxuIiwKKwkJCQkJCWxvZ2ZpbGUsIHNob3dfZGF0ZShkYXRlLCB0eiwgREFURV9SRkMyODIyKSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoZGF0ZSA9PSBhdF90aW1lKSB7CisJCQkJaWYgKGdldF9zaGExX2hleChyZWMgKyA0MSwgc2hhMSkpCisJCQkJCWRpZSgiTG9nICVzIGlzIGNvcnJ1cHQuIiwgbG9nZmlsZSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZiAoZ2V0X3NoYTFfaGV4KHJlYyArIDQxLCBsb2dnZWRfc2hhMSkpCisJCQkJCWRpZSgiTG9nICVzIGlzIGNvcnJ1cHQuIiwgbG9nZmlsZSk7CisJCQkJaWYgKGhhc2hjbXAobG9nZ2VkX3NoYTEsIHNoYTEpKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkJIndhcm5pbmc6IExvZyAlcyB1bmV4cGVjdGVkbHkgZW5kZWQgb24gJXMuXG4iLAorCQkJCQkJbG9nZmlsZSwgc2hvd19kYXRlKGRhdGUsIHR6LCBEQVRFX1JGQzI4MjIpKTsKKwkJCQl9CisJCQl9CisJCQltdW5tYXAobG9nX21hcHBlZCwgbWFwc3opOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbGFzdHJlYyA9IHJlYzsKKwkJaWYgKGNudCA+IDApCisJCQljbnQtLTsKKwl9CisKKwlyZWMgPSBsb2dkYXRhOworCXdoaWxlIChyZWMgPCBsb2dlbmQgJiYgKnJlYyAhPSAnPicgJiYgKnJlYyAhPSAnXG4nKQorCQlyZWMrKzsKKwlpZiAocmVjID09IGxvZ2VuZCB8fCAqcmVjID09ICdcbicpCisJCWRpZSgiTG9nICVzIGlzIGNvcnJ1cHQuIiwgbG9nZmlsZSk7CisJZGF0ZSA9IHN0cnRvdWwocmVjICsgMSwgJnR6X2MsIDEwKTsKKwl0eiA9IHN0cnRvdWwodHpfYywgTlVMTCwgMTApOworCWlmIChnZXRfc2hhMV9oZXgobG9nZGF0YSwgc2hhMSkpCisJCWRpZSgiTG9nICVzIGlzIGNvcnJ1cHQuIiwgbG9nZmlsZSk7CisJaWYgKG1zZykKKwkJKm1zZyA9IHJlZl9tc2cobG9nZGF0YSwgbG9nZW5kKTsKKwltdW5tYXAobG9nX21hcHBlZCwgbWFwc3opOworCisJaWYgKGN1dG9mZl90aW1lKQorCQkqY3V0b2ZmX3RpbWUgPSBkYXRlOworCWlmIChjdXRvZmZfdHopCisJCSpjdXRvZmZfdHogPSB0ejsKKwlpZiAoY3V0b2ZmX2NudCkKKwkJKmN1dG9mZl9jbnQgPSByZWNjbnQ7CisJcmV0dXJuIDE7Cit9CisKK2ludCBmb3JfZWFjaF9yZWZsb2dfZW50KGNvbnN0IGNoYXIgKnJlZiwgZWFjaF9yZWZsb2dfZW50X2ZuIGZuLCB2b2lkICpjYl9kYXRhKQoreworCWNvbnN0IGNoYXIgKmxvZ2ZpbGU7CisJRklMRSAqbG9nZnA7CisJY2hhciBidWZbMTAyNF07CisJaW50IHJldCA9IDA7CisKKwlsb2dmaWxlID0gZ2l0X3BhdGgoImxvZ3MvJXMiLCByZWYpOworCWxvZ2ZwID0gZm9wZW4obG9nZmlsZSwgInIiKTsKKwlpZiAoIWxvZ2ZwKQorCQlyZXR1cm4gLTE7CisJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGxvZ2ZwKSkgeworCQl1bnNpZ25lZCBjaGFyIG9zaGExWzIwXSwgbnNoYTFbMjBdOworCQljaGFyICplbWFpbF9lbmQsICptZXNzYWdlOworCQl1bnNpZ25lZCBsb25nIHRpbWVzdGFtcDsKKwkJaW50IGxlbiwgdHo7CisKKwkJLyogb2xkIFNQIG5ldyBTUCBuYW1lIDxlbWFpbD4gU1AgdGltZSBUQUIgbXNnIExGICovCisJCWxlbiA9IHN0cmxlbihidWYpOworCQlpZiAobGVuIDwgODMgfHwgYnVmW2xlbi0xXSAhPSAnXG4nIHx8CisJCSAgICBnZXRfc2hhMV9oZXgoYnVmLCBvc2hhMSkgfHwgYnVmWzQwXSAhPSAnICcgfHwKKwkJICAgIGdldF9zaGExX2hleChidWYgKyA0MSwgbnNoYTEpIHx8IGJ1Zls4MV0gIT0gJyAnIHx8CisJCSAgICAhKGVtYWlsX2VuZCA9IHN0cmNocihidWYgKyA4MiwgJz4nKSkgfHwKKwkJICAgIGVtYWlsX2VuZFsxXSAhPSAnICcgfHwKKwkJICAgICEodGltZXN0YW1wID0gc3RydG91bChlbWFpbF9lbmQgKyAyLCAmbWVzc2FnZSwgMTApKSB8fAorCQkgICAgIW1lc3NhZ2UgfHwgbWVzc2FnZVswXSAhPSAnICcgfHwKKwkJICAgIChtZXNzYWdlWzFdICE9ICcrJyAmJiBtZXNzYWdlWzFdICE9ICctJykgfHwKKwkJICAgICFpc2RpZ2l0KG1lc3NhZ2VbMl0pIHx8ICFpc2RpZ2l0KG1lc3NhZ2VbM10pIHx8CisJCSAgICAhaXNkaWdpdChtZXNzYWdlWzRdKSB8fCAhaXNkaWdpdChtZXNzYWdlWzVdKSkKKwkJCWNvbnRpbnVlOyAvKiBjb3JydXB0PyAqLworCQllbWFpbF9lbmRbMV0gPSAnXDAnOworCQl0eiA9IHN0cnRvbChtZXNzYWdlICsgMSwgTlVMTCwgMTApOworCQlpZiAobWVzc2FnZVs2XSAhPSAnXHQnKQorCQkJbWVzc2FnZSArPSA2OworCQllbHNlCisJCQltZXNzYWdlICs9IDc7CisJCXJldCA9IGZuKG9zaGExLCBuc2hhMSwgYnVmKzgyLCB0aW1lc3RhbXAsIHR6LCBtZXNzYWdlLCBjYl9kYXRhKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCX0KKwlmY2xvc2UobG9nZnApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZG9fZm9yX2VhY2hfcmVmbG9nKGNvbnN0IGNoYXIgKmJhc2UsIGVhY2hfcmVmX2ZuIGZuLCB2b2lkICpjYl9kYXRhKQoreworCURJUiAqZGlyID0gb3BlbmRpcihnaXRfcGF0aCgibG9ncy8lcyIsIGJhc2UpKTsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChkaXIpIHsKKwkJc3RydWN0IGRpcmVudCAqZGU7CisJCWludCBiYXNlbGVuID0gc3RybGVuKGJhc2UpOworCQljaGFyICpsb2cgPSB4bWFsbG9jKGJhc2VsZW4gKyAyNTcpOworCisJCW1lbWNweShsb2csIGJhc2UsIGJhc2VsZW4pOworCQlpZiAoYmFzZWxlbiAmJiBiYXNlW2Jhc2VsZW4tMV0gIT0gJy8nKQorCQkJbG9nW2Jhc2VsZW4rK10gPSAnLyc7CisKKwkJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQkJc3RydWN0IHN0YXQgc3Q7CisJCQlpbnQgbmFtZWxlbjsKKworCQkJaWYgKGRlLT5kX25hbWVbMF0gPT0gJy4nKQorCQkJCWNvbnRpbnVlOworCQkJbmFtZWxlbiA9IHN0cmxlbihkZS0+ZF9uYW1lKTsKKwkJCWlmIChuYW1lbGVuID4gMjU1KQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGhhc19leHRlbnNpb24oZGUtPmRfbmFtZSwgIi5sb2NrIikpCisJCQkJY29udGludWU7CisJCQltZW1jcHkobG9nICsgYmFzZWxlbiwgZGUtPmRfbmFtZSwgbmFtZWxlbisxKTsKKwkJCWlmIChzdGF0KGdpdF9wYXRoKCJsb2dzLyVzIiwgbG9nKSwgJnN0KSA8IDApCisJCQkJY29udGludWU7CisJCQlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJCXJldHZhbCA9IGRvX2Zvcl9lYWNoX3JlZmxvZyhsb2csIGZuLCBjYl9kYXRhKTsKKwkJCX0gZWxzZSB7CisJCQkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJCQlpZiAoIXJlc29sdmVfcmVmKGxvZywgc2hhMSwgMCwgTlVMTCkpCisJCQkJCXJldHZhbCA9IGVycm9yKCJiYWQgcmVmIGZvciAlcyIsIGxvZyk7CisJCQkJZWxzZQorCQkJCQlyZXR2YWwgPSBmbihsb2csIHNoYTEsIDAsIGNiX2RhdGEpOworCQkJfQorCQkJaWYgKHJldHZhbCkKKwkJCQlicmVhazsKKwkJfQorCQlmcmVlKGxvZyk7CisJCWNsb3NlZGlyKGRpcik7CisJfQorCWVsc2UgaWYgKCpiYXNlKQorCQlyZXR1cm4gZXJybm87CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IGZvcl9lYWNoX3JlZmxvZyhlYWNoX3JlZl9mbiBmbiwgdm9pZCAqY2JfZGF0YSkKK3sKKwlyZXR1cm4gZG9fZm9yX2VhY2hfcmVmbG9nKCIiLCBmbiwgY2JfZGF0YSk7Cit9CisKK2ludCB1cGRhdGVfcmVmKGNvbnN0IGNoYXIgKmFjdGlvbiwgY29uc3QgY2hhciAqcmVmbmFtZSwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgdW5zaWduZWQgY2hhciAqb2xkdmFsLAorCQlpbnQgZmxhZ3MsIGVudW0gYWN0aW9uX29uX2VyciBvbmVycikKK3sKKwlzdGF0aWMgc3RydWN0IHJlZl9sb2NrICpsb2NrOworCWxvY2sgPSBsb2NrX2FueV9yZWZfZm9yX3VwZGF0ZShyZWZuYW1lLCBvbGR2YWwsIGZsYWdzKTsKKwlpZiAoIWxvY2spIHsKKwkJY29uc3QgY2hhciAqc3RyID0gIkNhbm5vdCBsb2NrIHRoZSByZWYgJyVzJy4iOworCQlzd2l0Y2ggKG9uZXJyKSB7CisJCWNhc2UgTVNHX09OX0VSUjogZXJyb3Ioc3RyLCByZWZuYW1lKTsgYnJlYWs7CisJCWNhc2UgRElFX09OX0VSUjogZGllKHN0ciwgcmVmbmFtZSk7IGJyZWFrOworCQljYXNlIFFVSUVUX09OX0VSUjogYnJlYWs7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCWlmICh3cml0ZV9yZWZfc2hhMShsb2NrLCBzaGExLCBhY3Rpb24pIDwgMCkgeworCQljb25zdCBjaGFyICpzdHIgPSAiQ2Fubm90IHVwZGF0ZSB0aGUgcmVmICclcycuIjsKKwkJc3dpdGNoIChvbmVycikgeworCQljYXNlIE1TR19PTl9FUlI6IGVycm9yKHN0ciwgcmVmbmFtZSk7IGJyZWFrOworCQljYXNlIERJRV9PTl9FUlI6IGRpZShzdHIsIHJlZm5hbWUpOyBicmVhazsKKwkJY2FzZSBRVUlFVF9PTl9FUlI6IGJyZWFrOworCQl9CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHJlZiAqZmluZF9yZWZfYnlfbmFtZShzdHJ1Y3QgcmVmICpsaXN0LCBjb25zdCBjaGFyICpuYW1lKQoreworCWZvciAoIDsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpCisJCWlmICghc3RyY21wKGxpc3QtPm5hbWUsIG5hbWUpKQorCQkJcmV0dXJuIGxpc3Q7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9yZWZzLmggYi9yZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhYmVlMQotLS0gL2Rldi9udWxsCisrKyBiL3JlZnMuaApAQCAtMCwwICsxLDc5IEBACisjaWZuZGVmIFJFRlNfSAorI2RlZmluZSBSRUZTX0gKKworc3RydWN0IHJlZl9sb2NrIHsKKwljaGFyICpyZWZfbmFtZTsKKwljaGFyICpvcmlnX3JlZl9uYW1lOworCXN0cnVjdCBsb2NrX2ZpbGUgKmxrOworCXVuc2lnbmVkIGNoYXIgb2xkX3NoYTFbMjBdOworCWludCBsb2NrX2ZkOworCWludCBmb3JjZV93cml0ZTsKK307CisKKyNkZWZpbmUgUkVGX0lTU1lNUkVGIDAxCisjZGVmaW5lIFJFRl9JU1BBQ0tFRCAwMgorCisvKgorICogQ2FsbHMgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBmb3IgZWFjaCByZWYgZmlsZSB1bnRpbCBpdCByZXR1cm5zIG5vbnplcm8sCisgKiBhbmQgcmV0dXJucyB0aGUgdmFsdWUKKyAqLwordHlwZWRlZiBpbnQgZWFjaF9yZWZfZm4oY29uc3QgY2hhciAqcmVmbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZsYWdzLCB2b2lkICpjYl9kYXRhKTsKK2V4dGVybiBpbnQgaGVhZF9yZWYoZWFjaF9yZWZfZm4sIHZvaWQgKik7CitleHRlcm4gaW50IGZvcl9lYWNoX3JlZihlYWNoX3JlZl9mbiwgdm9pZCAqKTsKK2V4dGVybiBpbnQgZm9yX2VhY2hfdGFnX3JlZihlYWNoX3JlZl9mbiwgdm9pZCAqKTsKK2V4dGVybiBpbnQgZm9yX2VhY2hfYnJhbmNoX3JlZihlYWNoX3JlZl9mbiwgdm9pZCAqKTsKK2V4dGVybiBpbnQgZm9yX2VhY2hfcmVtb3RlX3JlZihlYWNoX3JlZl9mbiwgdm9pZCAqKTsKKworZXh0ZXJuIGludCBwZWVsX3JlZihjb25zdCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKik7CisKKy8qKiBMb2NrcyBhICJyZWZzLyIgcmVmIHJldHVybmluZyB0aGUgbG9jayBvbiBzdWNjZXNzIGFuZCBOVUxMIG9uIGZhaWx1cmUuICoqLworZXh0ZXJuIHN0cnVjdCByZWZfbG9jayAqbG9ja19yZWZfc2hhMShjb25zdCBjaGFyICpyZWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZF9zaGExKTsKKworLyoqIExvY2tzIGFueSByZWYgKGZvciAnSEVBRCcgdHlwZSByZWZzKS4gKi8KKyNkZWZpbmUgUkVGX05PREVSRUYJMHgwMQorZXh0ZXJuIHN0cnVjdCByZWZfbG9jayAqbG9ja19hbnlfcmVmX2Zvcl91cGRhdGUoY29uc3QgY2hhciAqcmVmLCBjb25zdCB1bnNpZ25lZCBjaGFyICpvbGRfc2hhMSwgaW50IGZsYWdzKTsKKworLyoqIENsb3NlIHRoZSBmaWxlIGRlc2NyaXB0b3Igb3duZWQgYnkgYSBsb2NrIGFuZCByZXR1cm4gdGhlIHN0YXR1cyAqLworZXh0ZXJuIGludCBjbG9zZV9yZWYoc3RydWN0IHJlZl9sb2NrICpsb2NrKTsKKworLyoqIENsb3NlIGFuZCBjb21taXQgdGhlIHJlZiBsb2NrZWQgYnkgdGhlIGxvY2sgKi8KK2V4dGVybiBpbnQgY29tbWl0X3JlZihzdHJ1Y3QgcmVmX2xvY2sgKmxvY2spOworCisvKiogUmVsZWFzZSBhbnkgbG9jayB0YWtlbiBidXQgbm90IHdyaXR0ZW4uICoqLworZXh0ZXJuIHZvaWQgdW5sb2NrX3JlZihzdHJ1Y3QgcmVmX2xvY2sgKmxvY2spOworCisvKiogV3JpdGVzIHNoYTEgaW50byB0aGUgcmVmIHNwZWNpZmllZCBieSB0aGUgbG9jay4gKiovCitleHRlcm4gaW50IHdyaXRlX3JlZl9zaGExKHN0cnVjdCByZWZfbG9jayAqbG9jaywgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqbXNnKTsKKworLyoqIFJlYWRzIGxvZyBmb3IgdGhlIHZhbHVlIG9mIHJlZiBkdXJpbmcgYXRfdGltZS4gKiovCitleHRlcm4gaW50IHJlYWRfcmVmX2F0KGNvbnN0IGNoYXIgKnJlZiwgdW5zaWduZWQgbG9uZyBhdF90aW1lLCBpbnQgY250LCB1bnNpZ25lZCBjaGFyICpzaGExLCBjaGFyICoqbXNnLCB1bnNpZ25lZCBsb25nICpjdXRvZmZfdGltZSwgaW50ICpjdXRvZmZfdHosIGludCAqY3V0b2ZmX2NudCk7CisKKy8qIGl0ZXJhdGUgb3ZlciByZWZsb2cgZW50cmllcyAqLwordHlwZWRlZiBpbnQgZWFjaF9yZWZsb2dfZW50X2ZuKHVuc2lnbmVkIGNoYXIgKm9zaGExLCB1bnNpZ25lZCBjaGFyICpuc2hhMSwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQsIGNvbnN0IGNoYXIgKiwgdm9pZCAqKTsKK2ludCBmb3JfZWFjaF9yZWZsb2dfZW50KGNvbnN0IGNoYXIgKnJlZiwgZWFjaF9yZWZsb2dfZW50X2ZuIGZuLCB2b2lkICpjYl9kYXRhKTsKKworLyoKKyAqIENhbGxzIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gZm9yIGVhY2ggcmVmbG9nIGZpbGUgdW50aWwgaXQgcmV0dXJucyBub256ZXJvLAorICogYW5kIHJldHVybnMgdGhlIHZhbHVlCisgKi8KK2V4dGVybiBpbnQgZm9yX2VhY2hfcmVmbG9nKGVhY2hfcmVmX2ZuLCB2b2lkICopOworCisjZGVmaW5lIENIRUNLX1JFRl9GT1JNQVRfT0sgMAorI2RlZmluZSBDSEVDS19SRUZfRk9STUFUX0VSUk9SICgtMSkKKyNkZWZpbmUgQ0hFQ0tfUkVGX0ZPUk1BVF9PTkVMRVZFTCAoLTIpCisjZGVmaW5lIENIRUNLX1JFRl9GT1JNQVRfV0lMRENBUkQgKC0zKQorZXh0ZXJuIGludCBjaGVja19yZWZfZm9ybWF0KGNvbnN0IGNoYXIgKnRhcmdldCk7CisKKy8qKiByZW5hbWUgcmVmLCByZXR1cm4gMCBvbiBzdWNjZXNzICoqLworZXh0ZXJuIGludCByZW5hbWVfcmVmKGNvbnN0IGNoYXIgKm9sZHJlZiwgY29uc3QgY2hhciAqbmV3cmVmLCBjb25zdCBjaGFyICpsb2dtc2cpOworCisvKiogcmVzb2x2ZSByZWYgaW4gbmVzdGVkICJnaXRsaW5rIiByZXBvc2l0b3J5ICovCitleHRlcm4gaW50IHJlc29sdmVfZ2l0bGlua19yZWYoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcmVmbmFtZSwgdW5zaWduZWQgY2hhciAqcmVzdWx0KTsKKworLyoqIGxvY2sgYSByZWYgYW5kIHRoZW4gd3JpdGUgaXRzIGZpbGUgKi8KK2VudW0gYWN0aW9uX29uX2VyciB7IE1TR19PTl9FUlIsIERJRV9PTl9FUlIsIFFVSUVUX09OX0VSUiB9OworaW50IHVwZGF0ZV9yZWYoY29uc3QgY2hhciAqYWN0aW9uLCBjb25zdCBjaGFyICpyZWZuYW1lLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCB1bnNpZ25lZCBjaGFyICpvbGR2YWwsCisJCWludCBmbGFncywgZW51bSBhY3Rpb25fb25fZXJyIG9uZXJyKTsKKworI2VuZGlmIC8qIFJFRlNfSCAqLwpkaWZmIC0tZ2l0IGEvcmVtb3RlLmMgYi9yZW1vdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGFmN2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvcmVtb3RlLmMKQEAgLTAsMCArMSwxMTMzIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJyZW1vdGUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisKK3N0cnVjdCBjb3VudGVkX3N0cmluZyB7CisJc2l6ZV90IGxlbjsKKwljb25zdCBjaGFyICpzOworfTsKK3N0cnVjdCByZXdyaXRlIHsKKwljb25zdCBjaGFyICpiYXNlOworCXNpemVfdCBiYXNlbGVuOworCXN0cnVjdCBjb3VudGVkX3N0cmluZyAqaW5zdGVhZF9vZjsKKwlpbnQgaW5zdGVhZF9vZl9ucjsKKwlpbnQgaW5zdGVhZF9vZl9hbGxvYzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVtb3RlICoqcmVtb3RlczsKK3N0YXRpYyBpbnQgcmVtb3Rlc19hbGxvYzsKK3N0YXRpYyBpbnQgcmVtb3Rlc19ucjsKKworc3RhdGljIHN0cnVjdCBicmFuY2ggKipicmFuY2hlczsKK3N0YXRpYyBpbnQgYnJhbmNoZXNfYWxsb2M7CitzdGF0aWMgaW50IGJyYW5jaGVzX25yOworCitzdGF0aWMgc3RydWN0IGJyYW5jaCAqY3VycmVudF9icmFuY2g7CitzdGF0aWMgY29uc3QgY2hhciAqZGVmYXVsdF9yZW1vdGVfbmFtZTsKKworc3RhdGljIHN0cnVjdCByZXdyaXRlICoqcmV3cml0ZTsKK3N0YXRpYyBpbnQgcmV3cml0ZV9hbGxvYzsKK3N0YXRpYyBpbnQgcmV3cml0ZV9ucjsKKworI2RlZmluZSBCVUZfU0laRSAoMjA0OCkKK3N0YXRpYyBjaGFyIGJ1ZmZlcltCVUZfU0laRV07CisKK3N0YXRpYyBjb25zdCBjaGFyICphbGlhc191cmwoY29uc3QgY2hhciAqdXJsKQoreworCWludCBpLCBqOworCWNoYXIgKnJldDsKKwlzdHJ1Y3QgY291bnRlZF9zdHJpbmcgKmxvbmdlc3Q7CisJaW50IGxvbmdlc3RfaTsKKworCWxvbmdlc3QgPSBOVUxMOworCWxvbmdlc3RfaSA9IC0xOworCWZvciAoaSA9IDA7IGkgPCByZXdyaXRlX25yOyBpKyspIHsKKwkJaWYgKCFyZXdyaXRlW2ldKQorCQkJY29udGludWU7CisJCWZvciAoaiA9IDA7IGogPCByZXdyaXRlW2ldLT5pbnN0ZWFkX29mX25yOyBqKyspIHsKKwkJCWlmICghcHJlZml4Y21wKHVybCwgcmV3cml0ZVtpXS0+aW5zdGVhZF9vZltqXS5zKSAmJgorCQkJICAgICghbG9uZ2VzdCB8fAorCQkJICAgICBsb25nZXN0LT5sZW4gPCByZXdyaXRlW2ldLT5pbnN0ZWFkX29mW2pdLmxlbikpIHsKKwkJCQlsb25nZXN0ID0gJihyZXdyaXRlW2ldLT5pbnN0ZWFkX29mW2pdKTsKKwkJCQlsb25nZXN0X2kgPSBpOworCQkJfQorCQl9CisJfQorCWlmICghbG9uZ2VzdCkKKwkJcmV0dXJuIHVybDsKKworCXJldCA9IG1hbGxvYyhyZXdyaXRlW2xvbmdlc3RfaV0tPmJhc2VsZW4gKworCQkgICAgIChzdHJsZW4odXJsKSAtIGxvbmdlc3QtPmxlbikgKyAxKTsKKwlzdHJjcHkocmV0LCByZXdyaXRlW2xvbmdlc3RfaV0tPmJhc2UpOworCXN0cmNweShyZXQgKyByZXdyaXRlW2xvbmdlc3RfaV0tPmJhc2VsZW4sIHVybCArIGxvbmdlc3QtPmxlbik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYWRkX3B1c2hfcmVmc3BlYyhzdHJ1Y3QgcmVtb3RlICpyZW1vdGUsIGNvbnN0IGNoYXIgKnJlZikKK3sKKwlBTExPQ19HUk9XKHJlbW90ZS0+cHVzaF9yZWZzcGVjLAorCQkgICByZW1vdGUtPnB1c2hfcmVmc3BlY19uciArIDEsCisJCSAgIHJlbW90ZS0+cHVzaF9yZWZzcGVjX2FsbG9jKTsKKwlyZW1vdGUtPnB1c2hfcmVmc3BlY1tyZW1vdGUtPnB1c2hfcmVmc3BlY19ucisrXSA9IHJlZjsKK30KKworc3RhdGljIHZvaWQgYWRkX2ZldGNoX3JlZnNwZWMoc3RydWN0IHJlbW90ZSAqcmVtb3RlLCBjb25zdCBjaGFyICpyZWYpCit7CisJQUxMT0NfR1JPVyhyZW1vdGUtPmZldGNoX3JlZnNwZWMsCisJCSAgIHJlbW90ZS0+ZmV0Y2hfcmVmc3BlY19uciArIDEsCisJCSAgIHJlbW90ZS0+ZmV0Y2hfcmVmc3BlY19hbGxvYyk7CisJcmVtb3RlLT5mZXRjaF9yZWZzcGVjW3JlbW90ZS0+ZmV0Y2hfcmVmc3BlY19ucisrXSA9IHJlZjsKK30KKworc3RhdGljIHZvaWQgYWRkX3VybChzdHJ1Y3QgcmVtb3RlICpyZW1vdGUsIGNvbnN0IGNoYXIgKnVybCkKK3sKKwlBTExPQ19HUk9XKHJlbW90ZS0+dXJsLCByZW1vdGUtPnVybF9uciArIDEsIHJlbW90ZS0+dXJsX2FsbG9jKTsKKwlyZW1vdGUtPnVybFtyZW1vdGUtPnVybF9ucisrXSA9IHVybDsKK30KKworc3RhdGljIHZvaWQgYWRkX3VybF9hbGlhcyhzdHJ1Y3QgcmVtb3RlICpyZW1vdGUsIGNvbnN0IGNoYXIgKnVybCkKK3sKKwlhZGRfdXJsKHJlbW90ZSwgYWxpYXNfdXJsKHVybCkpOworfQorCitzdGF0aWMgc3RydWN0IHJlbW90ZSAqbWFrZV9yZW1vdGUoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgcmVtb3RlICpyZXQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVtb3Rlc19ucjsgaSsrKSB7CisJCWlmIChsZW4gPyAoIXN0cm5jbXAobmFtZSwgcmVtb3Rlc1tpXS0+bmFtZSwgbGVuKSAmJgorCQkJICAgIXJlbW90ZXNbaV0tPm5hbWVbbGVuXSkgOgorCQkgICAgIXN0cmNtcChuYW1lLCByZW1vdGVzW2ldLT5uYW1lKSkKKwkJCXJldHVybiByZW1vdGVzW2ldOworCX0KKworCXJldCA9IHhjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCByZW1vdGUpKTsKKwlBTExPQ19HUk9XKHJlbW90ZXMsIHJlbW90ZXNfbnIgKyAxLCByZW1vdGVzX2FsbG9jKTsKKwlyZW1vdGVzW3JlbW90ZXNfbnIrK10gPSByZXQ7CisJaWYgKGxlbikKKwkJcmV0LT5uYW1lID0geHN0cm5kdXAobmFtZSwgbGVuKTsKKwllbHNlCisJCXJldC0+bmFtZSA9IHhzdHJkdXAobmFtZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYWRkX21lcmdlKHN0cnVjdCBicmFuY2ggKmJyYW5jaCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlBTExPQ19HUk9XKGJyYW5jaC0+bWVyZ2VfbmFtZSwgYnJhbmNoLT5tZXJnZV9uciArIDEsCisJCSAgIGJyYW5jaC0+bWVyZ2VfYWxsb2MpOworCWJyYW5jaC0+bWVyZ2VfbmFtZVticmFuY2gtPm1lcmdlX25yKytdID0gbmFtZTsKK30KKworc3RhdGljIHN0cnVjdCBicmFuY2ggKm1ha2VfYnJhbmNoKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pCit7CisJc3RydWN0IGJyYW5jaCAqcmV0OworCWludCBpOworCWNoYXIgKnJlZm5hbWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnJhbmNoZXNfbnI7IGkrKykgeworCQlpZiAobGVuID8gKCFzdHJuY21wKG5hbWUsIGJyYW5jaGVzW2ldLT5uYW1lLCBsZW4pICYmCisJCQkgICAhYnJhbmNoZXNbaV0tPm5hbWVbbGVuXSkgOgorCQkgICAgIXN0cmNtcChuYW1lLCBicmFuY2hlc1tpXS0+bmFtZSkpCisJCQlyZXR1cm4gYnJhbmNoZXNbaV07CisJfQorCisJQUxMT0NfR1JPVyhicmFuY2hlcywgYnJhbmNoZXNfbnIgKyAxLCBicmFuY2hlc19hbGxvYyk7CisJcmV0ID0geGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGJyYW5jaCkpOworCWJyYW5jaGVzW2JyYW5jaGVzX25yKytdID0gcmV0OworCWlmIChsZW4pCisJCXJldC0+bmFtZSA9IHhzdHJuZHVwKG5hbWUsIGxlbik7CisJZWxzZQorCQlyZXQtPm5hbWUgPSB4c3RyZHVwKG5hbWUpOworCXJlZm5hbWUgPSBtYWxsb2Moc3RybGVuKG5hbWUpICsgc3RybGVuKCJyZWZzL2hlYWRzLyIpICsgMSk7CisJc3RyY3B5KHJlZm5hbWUsICJyZWZzL2hlYWRzLyIpOworCXN0cmNweShyZWZuYW1lICsgc3RybGVuKCJyZWZzL2hlYWRzLyIpLCByZXQtPm5hbWUpOworCXJldC0+cmVmbmFtZSA9IHJlZm5hbWU7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHJld3JpdGUgKm1ha2VfcmV3cml0ZShjb25zdCBjaGFyICpiYXNlLCBpbnQgbGVuKQoreworCXN0cnVjdCByZXdyaXRlICpyZXQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmV3cml0ZV9ucjsgaSsrKSB7CisJCWlmIChsZW4KKwkJICAgID8gKGxlbiA9PSByZXdyaXRlW2ldLT5iYXNlbGVuICYmCisJCSAgICAgICAhc3RybmNtcChiYXNlLCByZXdyaXRlW2ldLT5iYXNlLCBsZW4pKQorCQkgICAgOiAhc3RyY21wKGJhc2UsIHJld3JpdGVbaV0tPmJhc2UpKQorCQkJcmV0dXJuIHJld3JpdGVbaV07CisJfQorCisJQUxMT0NfR1JPVyhyZXdyaXRlLCByZXdyaXRlX25yICsgMSwgcmV3cml0ZV9hbGxvYyk7CisJcmV0ID0geGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHJld3JpdGUpKTsKKwlyZXdyaXRlW3Jld3JpdGVfbnIrK10gPSByZXQ7CisJaWYgKGxlbikgeworCQlyZXQtPmJhc2UgPSB4c3RybmR1cChiYXNlLCBsZW4pOworCQlyZXQtPmJhc2VsZW4gPSBsZW47CisJfQorCWVsc2UgeworCQlyZXQtPmJhc2UgPSB4c3RyZHVwKGJhc2UpOworCQlyZXQtPmJhc2VsZW4gPSBzdHJsZW4oYmFzZSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9pbnN0ZWFkX29mKHN0cnVjdCByZXdyaXRlICpyZXdyaXRlLCBjb25zdCBjaGFyICppbnN0ZWFkX29mKQoreworCUFMTE9DX0dST1cocmV3cml0ZS0+aW5zdGVhZF9vZiwgcmV3cml0ZS0+aW5zdGVhZF9vZl9uciArIDEsIHJld3JpdGUtPmluc3RlYWRfb2ZfYWxsb2MpOworCXJld3JpdGUtPmluc3RlYWRfb2ZbcmV3cml0ZS0+aW5zdGVhZF9vZl9ucl0ucyA9IGluc3RlYWRfb2Y7CisJcmV3cml0ZS0+aW5zdGVhZF9vZltyZXdyaXRlLT5pbnN0ZWFkX29mX25yXS5sZW4gPSBzdHJsZW4oaW5zdGVhZF9vZik7CisJcmV3cml0ZS0+aW5zdGVhZF9vZl9ucisrOworfQorCitzdGF0aWMgdm9pZCByZWFkX3JlbW90ZXNfZmlsZShzdHJ1Y3QgcmVtb3RlICpyZW1vdGUpCit7CisJRklMRSAqZiA9IGZvcGVuKGdpdF9wYXRoKCJyZW1vdGVzLyVzIiwgcmVtb3RlLT5uYW1lKSwgInIiKTsKKworCWlmICghZikKKwkJcmV0dXJuOworCXdoaWxlIChmZ2V0cyhidWZmZXIsIEJVRl9TSVpFLCBmKSkgeworCQlpbnQgdmFsdWVfbGlzdDsKKwkJY2hhciAqcywgKnA7CisKKwkJaWYgKCFwcmVmaXhjbXAoYnVmZmVyLCAiVVJMOiIpKSB7CisJCQl2YWx1ZV9saXN0ID0gMDsKKwkJCXMgPSBidWZmZXIgKyA0OworCQl9IGVsc2UgaWYgKCFwcmVmaXhjbXAoYnVmZmVyLCAiUHVzaDoiKSkgeworCQkJdmFsdWVfbGlzdCA9IDE7CisJCQlzID0gYnVmZmVyICsgNTsKKwkJfSBlbHNlIGlmICghcHJlZml4Y21wKGJ1ZmZlciwgIlB1bGw6IikpIHsKKwkJCXZhbHVlX2xpc3QgPSAyOworCQkJcyA9IGJ1ZmZlciArIDU7CisJCX0gZWxzZQorCQkJY29udGludWU7CisKKwkJd2hpbGUgKGlzc3BhY2UoKnMpKQorCQkJcysrOworCQlpZiAoISpzKQorCQkJY29udGludWU7CisKKwkJcCA9IHMgKyBzdHJsZW4ocyk7CisJCXdoaWxlIChpc3NwYWNlKHBbLTFdKSkKKwkJCSotLXAgPSAwOworCisJCXN3aXRjaCAodmFsdWVfbGlzdCkgeworCQljYXNlIDA6CisJCQlhZGRfdXJsX2FsaWFzKHJlbW90ZSwgeHN0cmR1cChzKSk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJYWRkX3B1c2hfcmVmc3BlYyhyZW1vdGUsIHhzdHJkdXAocykpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWFkZF9mZXRjaF9yZWZzcGVjKHJlbW90ZSwgeHN0cmR1cChzKSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlmY2xvc2UoZik7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfYnJhbmNoZXNfZmlsZShzdHJ1Y3QgcmVtb3RlICpyZW1vdGUpCit7CisJY29uc3QgY2hhciAqc2xhc2ggPSBzdHJjaHIocmVtb3RlLT5uYW1lLCAnLycpOworCWNoYXIgKmZyYWc7CisJc3RydWN0IHN0cmJ1ZiBicmFuY2g7CisJaW50IG4gPSBzbGFzaCA/IHNsYXNoIC0gcmVtb3RlLT5uYW1lIDogMTAwMDsKKwlGSUxFICpmID0gZm9wZW4oZ2l0X3BhdGgoImJyYW5jaGVzLyUuKnMiLCBuLCByZW1vdGUtPm5hbWUpLCAiciIpOworCWNoYXIgKnMsICpwOworCWludCBsZW47CisKKwlpZiAoIWYpCisJCXJldHVybjsKKwlzID0gZmdldHMoYnVmZmVyLCBCVUZfU0laRSwgZik7CisJZmNsb3NlKGYpOworCWlmICghcykKKwkJcmV0dXJuOworCXdoaWxlIChpc3NwYWNlKCpzKSkKKwkJcysrOworCWlmICghKnMpCisJCXJldHVybjsKKwlwID0gcyArIHN0cmxlbihzKTsKKwl3aGlsZSAoaXNzcGFjZShwWy0xXSkpCisJCSotLXAgPSAwOworCWxlbiA9IHAgLSBzOworCWlmIChzbGFzaCkKKwkJbGVuICs9IHN0cmxlbihzbGFzaCk7CisJcCA9IHhtYWxsb2MobGVuICsgMSk7CisJc3RyY3B5KHAsIHMpOworCWlmIChzbGFzaCkKKwkJc3RyY2F0KHAsIHNsYXNoKTsKKworCS8qCisJICogV2l0aCAic2xhc2giLCBlLmcuICJnaXQgZmV0Y2ggamdhcnppay9uZXRkZXYtMi42IiB3aGVuCisJICogcmVhZGluZyBmcm9tICRHSVRfRElSL2JyYW5jaGVzL2pnYXJ6aWsgZmV0Y2hlcyAiSEVBRCIgZnJvbQorCSAqIHRoZSBwYXJ0aWFsIFVSTCBvYnRhaW5lZCBmcm9tIHRoZSBicmFuY2hlcyBmaWxlIHBsdXMKKwkgKiAiL25ldGRldi0yLjYiIGFuZCBkb2VzIG5vdCBzdG9yZSBpdCBpbiBhbnkgdHJhY2tpbmcgcmVmLgorCSAqICNicmFuY2ggc3BlY2lmaWVyIGluIHRoZSBmaWxlIGlzIGlnbm9yZWQuCisJICoKKwkgKiBPdGhlcndpc2UsIHRoZSBicmFuY2hlcyBmaWxlIHdvdWxkIGhhdmUgVVJMIGFuZCBvcHRpb25hbGx5CisJICogI2JyYW5jaCBzcGVjaWZpZWQuICBUaGUgIm1hc3RlciIgKG9yIHNwZWNpZmllZCkgYnJhbmNoIGlzCisJICogZmV0Y2hlZCBhbmQgc3RvcmVkIGluIHRoZSBsb2NhbCBicmFuY2ggb2YgdGhlIHNhbWUgbmFtZS4KKwkgKi8KKwlzdHJidWZfaW5pdCgmYnJhbmNoLCAwKTsKKwlmcmFnID0gc3RyY2hyKHAsICcjJyk7CisJaWYgKGZyYWcpIHsKKwkJKihmcmFnKyspID0gJ1wwJzsKKwkJc3RyYnVmX2FkZGYoJmJyYW5jaCwgInJlZnMvaGVhZHMvJXMiLCBmcmFnKTsKKwl9IGVsc2UKKwkJc3RyYnVmX2FkZHN0cigmYnJhbmNoLCAicmVmcy9oZWFkcy9tYXN0ZXIiKTsKKwlpZiAoIXNsYXNoKSB7CisJCXN0cmJ1Zl9hZGRmKCZicmFuY2gsICI6cmVmcy9oZWFkcy8lcyIsIHJlbW90ZS0+bmFtZSk7CisJfSBlbHNlIHsKKwkJc3RyYnVmX3Jlc2V0KCZicmFuY2gpOworCQlzdHJidWZfYWRkc3RyKCZicmFuY2gsICJIRUFEOiIpOworCX0KKwlhZGRfdXJsX2FsaWFzKHJlbW90ZSwgcCk7CisJYWRkX2ZldGNoX3JlZnNwZWMocmVtb3RlLCBzdHJidWZfZGV0YWNoKCZicmFuY2gsIDApKTsKKwlyZW1vdGUtPmZldGNoX3RhZ3MgPSAxOyAvKiBhbHdheXMgYXV0by1mb2xsb3cgKi8KK30KKworc3RhdGljIGludCBoYW5kbGVfY29uZmlnKGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpzdWJrZXk7CisJc3RydWN0IHJlbW90ZSAqcmVtb3RlOworCXN0cnVjdCBicmFuY2ggKmJyYW5jaDsKKwlpZiAoIXByZWZpeGNtcChrZXksICJicmFuY2guIikpIHsKKwkJbmFtZSA9IGtleSArIDc7CisJCXN1YmtleSA9IHN0cnJjaHIobmFtZSwgJy4nKTsKKwkJaWYgKCFzdWJrZXkpCisJCQlyZXR1cm4gMDsKKwkJYnJhbmNoID0gbWFrZV9icmFuY2gobmFtZSwgc3Via2V5IC0gbmFtZSk7CisJCWlmICghc3RyY21wKHN1YmtleSwgIi5yZW1vdGUiKSkgeworCQkJaWYgKCF2YWx1ZSkKKwkJCQlyZXR1cm4gY29uZmlnX2Vycm9yX25vbmJvb2woa2V5KTsKKwkJCWJyYW5jaC0+cmVtb3RlX25hbWUgPSB4c3RyZHVwKHZhbHVlKTsKKwkJCWlmIChicmFuY2ggPT0gY3VycmVudF9icmFuY2gpCisJCQkJZGVmYXVsdF9yZW1vdGVfbmFtZSA9IGJyYW5jaC0+cmVtb3RlX25hbWU7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChzdWJrZXksICIubWVyZ2UiKSkgeworCQkJaWYgKCF2YWx1ZSkKKwkJCQlyZXR1cm4gY29uZmlnX2Vycm9yX25vbmJvb2woa2V5KTsKKwkJCWFkZF9tZXJnZShicmFuY2gsIHhzdHJkdXAodmFsdWUpKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFwcmVmaXhjbXAoa2V5LCAidXJsLiIpKSB7CisJCXN0cnVjdCByZXdyaXRlICpyZXdyaXRlOworCQluYW1lID0ga2V5ICsgNTsKKwkJc3Via2V5ID0gc3RycmNocihuYW1lLCAnLicpOworCQlpZiAoIXN1YmtleSkKKwkJCXJldHVybiAwOworCQlyZXdyaXRlID0gbWFrZV9yZXdyaXRlKG5hbWUsIHN1YmtleSAtIG5hbWUpOworCQlpZiAoIXN0cmNtcChzdWJrZXksICIuaW5zdGVhZG9mIikpIHsKKwkJCWlmICghdmFsdWUpCisJCQkJcmV0dXJuIGNvbmZpZ19lcnJvcl9ub25ib29sKGtleSk7CisJCQlhZGRfaW5zdGVhZF9vZihyZXdyaXRlLCB4c3RyZHVwKHZhbHVlKSk7CisJCX0KKwl9CisJaWYgKHByZWZpeGNtcChrZXksICAicmVtb3RlLiIpKQorCQlyZXR1cm4gMDsKKwluYW1lID0ga2V5ICsgNzsKKwlzdWJrZXkgPSBzdHJyY2hyKG5hbWUsICcuJyk7CisJaWYgKCFzdWJrZXkpCisJCXJldHVybiBlcnJvcigiQ29uZmlnIHdpdGggbm8ga2V5IGZvciByZW1vdGUgJXMiLCBuYW1lKTsKKwlpZiAoKnN1YmtleSA9PSAnLycpIHsKKwkJd2FybmluZygiQ29uZmlnIHJlbW90ZSBzaG9ydGhhbmQgY2Fubm90IGJlZ2luIHdpdGggJy8nOiAlcyIsIG5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJcmVtb3RlID0gbWFrZV9yZW1vdGUobmFtZSwgc3Via2V5IC0gbmFtZSk7CisJaWYgKCF2YWx1ZSkgeworCQkvKiBpZiB3ZSBldmVyIGhhdmUgYSBib29sZWFuIHZhcmlhYmxlLCBlLmcuICJyZW1vdGUuKi5kaXNhYmxlZCIKKwkJICogW3JlbW90ZSAiZnJvdHoiXQorCQkgKiAgICAgIGRpc2FibGVkCisJCSAqIGlzIGEgdmFsaWQgd2F5IHRvIHNldCBpdCB0byB0cnVlOyB3ZSBnZXQgTlVMTCBpbiB2YWx1ZSBzbworCQkgKiB3ZSBuZWVkIHRvIGhhbmRsZSBpdCBoZXJlLgorCQkgKgorCQkgKiBpZiAoIXN0cmNtcChzdWJrZXksICIuZGlzYWJsZWQiKSkgeworCQkgKiAgICAgIHZhbCA9IGdpdF9jb25maWdfYm9vbChrZXksIHZhbHVlKTsKKwkJICogICAgICByZXR1cm4gMDsKKwkJICogfSBlbHNlCisJCSAqCisJCSAqLworCQlyZXR1cm4gMDsgLyogaWdub3JlIHVua25vd24gYm9vbGVhbnMgKi8KKwl9CisJaWYgKCFzdHJjbXAoc3Via2V5LCAiLnVybCIpKSB7CisJCWFkZF91cmwocmVtb3RlLCB4c3RyZHVwKHZhbHVlKSk7CisJfSBlbHNlIGlmICghc3RyY21wKHN1YmtleSwgIi5wdXNoIikpIHsKKwkJYWRkX3B1c2hfcmVmc3BlYyhyZW1vdGUsIHhzdHJkdXAodmFsdWUpKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoc3Via2V5LCAiLmZldGNoIikpIHsKKwkJYWRkX2ZldGNoX3JlZnNwZWMocmVtb3RlLCB4c3RyZHVwKHZhbHVlKSk7CisJfSBlbHNlIGlmICghc3RyY21wKHN1YmtleSwgIi5yZWNlaXZlcGFjayIpKSB7CisJCWlmICghcmVtb3RlLT5yZWNlaXZlcGFjaykKKwkJCXJlbW90ZS0+cmVjZWl2ZXBhY2sgPSB4c3RyZHVwKHZhbHVlKTsKKwkJZWxzZQorCQkJZXJyb3IoIm1vcmUgdGhhbiBvbmUgcmVjZWl2ZXBhY2sgZ2l2ZW4sIHVzaW5nIHRoZSBmaXJzdCIpOworCX0gZWxzZSBpZiAoIXN0cmNtcChzdWJrZXksICIudXBsb2FkcGFjayIpKSB7CisJCWlmICghcmVtb3RlLT51cGxvYWRwYWNrKQorCQkJcmVtb3RlLT51cGxvYWRwYWNrID0geHN0cmR1cCh2YWx1ZSk7CisJCWVsc2UKKwkJCWVycm9yKCJtb3JlIHRoYW4gb25lIHVwbG9hZHBhY2sgZ2l2ZW4sIHVzaW5nIHRoZSBmaXJzdCIpOworCX0gZWxzZSBpZiAoIXN0cmNtcChzdWJrZXksICIudGFnb3B0IikpIHsKKwkJaWYgKCFzdHJjbXAodmFsdWUsICItLW5vLXRhZ3MiKSkKKwkJCXJlbW90ZS0+ZmV0Y2hfdGFncyA9IC0xOworCX0gZWxzZSBpZiAoIXN0cmNtcChzdWJrZXksICIucHJveHkiKSkgeworCQlyZW1vdGUtPmh0dHBfcHJveHkgPSB4c3RyZHVwKHZhbHVlKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoc3Via2V5LCAiLnNraXBkZWZhdWx0dXBkYXRlIikpCisJCXJlbW90ZS0+c2tpcF9kZWZhdWx0X3VwZGF0ZSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFsaWFzX2FsbF91cmxzKHZvaWQpCit7CisJaW50IGksIGo7CisJZm9yIChpID0gMDsgaSA8IHJlbW90ZXNfbnI7IGkrKykgeworCQlpZiAoIXJlbW90ZXNbaV0pCisJCQljb250aW51ZTsKKwkJZm9yIChqID0gMDsgaiA8IHJlbW90ZXNbaV0tPnVybF9ucjsgaisrKSB7CisJCQlyZW1vdGVzW2ldLT51cmxbal0gPSBhbGlhc191cmwocmVtb3Rlc1tpXS0+dXJsW2pdKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcmVhZF9jb25maWcodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWNvbnN0IGNoYXIgKmhlYWRfcmVmOworCWludCBmbGFnOworCWlmIChkZWZhdWx0X3JlbW90ZV9uYW1lKSAvLyBkaWQgdGhpcyBhbHJlYWR5CisJCXJldHVybjsKKwlkZWZhdWx0X3JlbW90ZV9uYW1lID0geHN0cmR1cCgib3JpZ2luIik7CisJY3VycmVudF9icmFuY2ggPSBOVUxMOworCWhlYWRfcmVmID0gcmVzb2x2ZV9yZWYoIkhFQUQiLCBzaGExLCAwLCAmZmxhZyk7CisJaWYgKGhlYWRfcmVmICYmIChmbGFnICYgUkVGX0lTU1lNUkVGKSAmJgorCSAgICAhcHJlZml4Y21wKGhlYWRfcmVmLCAicmVmcy9oZWFkcy8iKSkgeworCQljdXJyZW50X2JyYW5jaCA9CisJCQltYWtlX2JyYW5jaChoZWFkX3JlZiArIHN0cmxlbigicmVmcy9oZWFkcy8iKSwgMCk7CisJfQorCWdpdF9jb25maWcoaGFuZGxlX2NvbmZpZyk7CisJYWxpYXNfYWxsX3VybHMoKTsKK30KKworc3RhdGljIHN0cnVjdCByZWZzcGVjICpwYXJzZV9yZWZzcGVjX2ludGVybmFsKGludCBucl9yZWZzcGVjLCBjb25zdCBjaGFyICoqcmVmc3BlYywgaW50IGZldGNoKQoreworCWludCBpOworCWludCBzdDsKKwlzdHJ1Y3QgcmVmc3BlYyAqcnMgPSB4Y2FsbG9jKHNpemVvZigqcnMpLCBucl9yZWZzcGVjKTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9yZWZzcGVjOyBpKyspIHsKKwkJc2l6ZV90IGxsZW4sIHJsZW47CisJCWludCBpc19nbG9iOworCQljb25zdCBjaGFyICpsaHMsICpyaHM7CisKKwkJbGxlbiA9IHJsZW4gPSBpc19nbG9iID0gMDsKKworCQlsaHMgPSByZWZzcGVjW2ldOworCQlpZiAoKmxocyA9PSAnKycpIHsKKwkJCXJzW2ldLmZvcmNlID0gMTsKKwkJCWxocysrOworCQl9CisKKwkJcmhzID0gc3RycmNocihsaHMsICc6Jyk7CisJCWlmIChyaHMpIHsKKwkJCXJocysrOworCQkJcmxlbiA9IHN0cmxlbihyaHMpOworCQkJaXNfZ2xvYiA9ICgyIDw9IHJsZW4gJiYgIXN0cmNtcChyaHMgKyBybGVuIC0gMiwgIi8qIikpOworCQkJaWYgKGlzX2dsb2IpCisJCQkJcmxlbiAtPSAyOworCQkJcnNbaV0uZHN0ID0geHN0cm5kdXAocmhzLCBybGVuKTsKKwkJfQorCisJCWxsZW4gPSAocmhzID8gKHJocyAtIGxocyAtIDEpIDogc3RybGVuKGxocykpOworCQlpZiAoMiA8PSBsbGVuICYmICFtZW1jbXAobGhzICsgbGxlbiAtIDIsICIvKiIsIDIpKSB7CisJCQlpZiAoKHJocyAmJiAhaXNfZ2xvYikgfHwgKCFyaHMgJiYgZmV0Y2gpKQorCQkJCWdvdG8gaW52YWxpZDsKKwkJCWlzX2dsb2IgPSAxOworCQkJbGxlbiAtPSAyOworCQl9IGVsc2UgaWYgKHJocyAmJiBpc19nbG9iKSB7CisJCQlnb3RvIGludmFsaWQ7CisJCX0KKworCQlyc1tpXS5wYXR0ZXJuID0gaXNfZ2xvYjsKKwkJcnNbaV0uc3JjID0geHN0cm5kdXAobGhzLCBsbGVuKTsKKworCQlpZiAoZmV0Y2gpIHsKKwkJCS8qCisJCQkgKiBMSFMKKwkJCSAqIC0gZW1wdHkgaXMgYWxsb3dlZDsgaXQgbWVhbnMgSEVBRC4KKwkJCSAqIC0gb3RoZXJ3aXNlIGl0IG11c3QgYmUgYSB2YWxpZCBsb29raW5nIHJlZi4KKwkJCSAqLworCQkJaWYgKCEqcnNbaV0uc3JjKQorCQkJCTsgLyogZW1wdHkgaXMgb2sgKi8KKwkJCWVsc2UgeworCQkJCXN0ID0gY2hlY2tfcmVmX2Zvcm1hdChyc1tpXS5zcmMpOworCQkJCWlmIChzdCAmJiBzdCAhPSBDSEVDS19SRUZfRk9STUFUX09ORUxFVkVMKQorCQkJCQlnb3RvIGludmFsaWQ7CisJCQl9CisJCQkvKgorCQkJICogUkhTCisJCQkgKiAtIG1pc3NpbmcgaXMgb2ssIGFuZCBpcyBzYW1lIGFzIGVtcHR5LgorCQkJICogLSBlbXB0eSBpcyBvazsgaXQgbWVhbnMgbm90IHRvIHN0b3JlLgorCQkJICogLSBvdGhlcndpc2UgaXQgbXVzdCBiZSBhIHZhbGlkIGxvb2tpbmcgcmVmLgorCQkJICovCisJCQlpZiAoIXJzW2ldLmRzdCkgeworCQkJCTsgLyogb2sgKi8KKwkJCX0gZWxzZSBpZiAoISpyc1tpXS5kc3QpIHsKKwkJCQk7IC8qIG9rICovCisJCQl9IGVsc2UgeworCQkJCXN0ID0gY2hlY2tfcmVmX2Zvcm1hdChyc1tpXS5kc3QpOworCQkJCWlmIChzdCAmJiBzdCAhPSBDSEVDS19SRUZfRk9STUFUX09ORUxFVkVMKQorCQkJCQlnb3RvIGludmFsaWQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogTEhTCisJCQkgKiAtIGVtcHR5IGlzIGFsbG93ZWQ7IGl0IG1lYW5zIGRlbGV0ZS4KKwkJCSAqIC0gd2hlbiB3aWxkY2FyZGVkLCBpdCBtdXN0IGJlIGEgdmFsaWQgbG9va2luZyByZWYuCisJCQkgKiAtIG90aGVyd2lzZSwgaXQgbXVzdCBiZSBhbiBleHRlbmRlZCBTSEEtMSwgYnV0CisJCQkgKiAgIHRoZXJlIGlzIG5vIGV4aXN0aW5nIHdheSB0byB2YWxpZGF0ZSB0aGlzLgorCQkJICovCisJCQlpZiAoISpyc1tpXS5zcmMpCisJCQkJOyAvKiBlbXB0eSBpcyBvayAqLworCQkJZWxzZSBpZiAoaXNfZ2xvYikgeworCQkJCXN0ID0gY2hlY2tfcmVmX2Zvcm1hdChyc1tpXS5zcmMpOworCQkJCWlmIChzdCAmJiBzdCAhPSBDSEVDS19SRUZfRk9STUFUX09ORUxFVkVMKQorCQkJCQlnb3RvIGludmFsaWQ7CisJCQl9CisJCQllbHNlCisJCQkJOyAvKiBhbnl0aGluZyBnb2VzLCBmb3Igbm93ICovCisJCQkvKgorCQkJICogUkhTCisJCQkgKiAtIG1pc3NpbmcgaXMgYWxsb3dlZCwgYnV0IExIUyB0aGVuIG11c3QgYmUgYQorCQkJICogICB2YWxpZCBsb29raW5nIHJlZi4KKwkJCSAqIC0gZW1wdHkgaXMgbm90IGFsbG93ZWQuCisJCQkgKiAtIG90aGVyd2lzZSBpdCBtdXN0IGJlIGEgdmFsaWQgbG9va2luZyByZWYuCisJCQkgKi8KKwkJCWlmICghcnNbaV0uZHN0KSB7CisJCQkJc3QgPSBjaGVja19yZWZfZm9ybWF0KHJzW2ldLnNyYyk7CisJCQkJaWYgKHN0ICYmIHN0ICE9IENIRUNLX1JFRl9GT1JNQVRfT05FTEVWRUwpCisJCQkJCWdvdG8gaW52YWxpZDsKKwkJCX0gZWxzZSBpZiAoISpyc1tpXS5kc3QpIHsKKwkJCQlnb3RvIGludmFsaWQ7CisJCQl9IGVsc2UgeworCQkJCXN0ID0gY2hlY2tfcmVmX2Zvcm1hdChyc1tpXS5kc3QpOworCQkJCWlmIChzdCAmJiBzdCAhPSBDSEVDS19SRUZfRk9STUFUX09ORUxFVkVMKQorCQkJCQlnb3RvIGludmFsaWQ7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJzOworCisgaW52YWxpZDoKKwlkaWUoIkludmFsaWQgcmVmc3BlYyAnJXMnIiwgcmVmc3BlY1tpXSk7Cit9CisKK3N0cnVjdCByZWZzcGVjICpwYXJzZV9mZXRjaF9yZWZzcGVjKGludCBucl9yZWZzcGVjLCBjb25zdCBjaGFyICoqcmVmc3BlYykKK3sKKwlyZXR1cm4gcGFyc2VfcmVmc3BlY19pbnRlcm5hbChucl9yZWZzcGVjLCByZWZzcGVjLCAxKTsKK30KKworc3RydWN0IHJlZnNwZWMgKnBhcnNlX3B1c2hfcmVmc3BlYyhpbnQgbnJfcmVmc3BlYywgY29uc3QgY2hhciAqKnJlZnNwZWMpCit7CisJcmV0dXJuIHBhcnNlX3JlZnNwZWNfaW50ZXJuYWwobnJfcmVmc3BlYywgcmVmc3BlYywgMCk7Cit9CisKK3N0YXRpYyBpbnQgdmFsaWRfcmVtb3RlX25pY2soY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoIW5hbWVbMF0gfHwgLyogbm90IGVtcHR5ICovCisJICAgIChuYW1lWzBdID09ICcuJyAmJiAvKiBub3QgIi4iICovCisJICAgICAoIW5hbWVbMV0gfHwgLyogbm90ICIuLiIgKi8KKwkgICAgICAobmFtZVsxXSA9PSAnLicgJiYgIW5hbWVbMl0pKSkpCisJCXJldHVybiAwOworCXJldHVybiAhc3RyY2hyKG5hbWUsICcvJyk7IC8qIG5vIHNsYXNoICovCit9CisKK3N0cnVjdCByZW1vdGUgKnJlbW90ZV9nZXQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgcmVtb3RlICpyZXQ7CisKKwlyZWFkX2NvbmZpZygpOworCWlmICghbmFtZSkKKwkJbmFtZSA9IGRlZmF1bHRfcmVtb3RlX25hbWU7CisJcmV0ID0gbWFrZV9yZW1vdGUobmFtZSwgMCk7CisJaWYgKHZhbGlkX3JlbW90ZV9uaWNrKG5hbWUpKSB7CisJCWlmICghcmV0LT51cmwpCisJCQlyZWFkX3JlbW90ZXNfZmlsZShyZXQpOworCQlpZiAoIXJldC0+dXJsKQorCQkJcmVhZF9icmFuY2hlc19maWxlKHJldCk7CisJfQorCWlmICghcmV0LT51cmwpCisJCWFkZF91cmxfYWxpYXMocmV0LCBuYW1lKTsKKwlpZiAoIXJldC0+dXJsKQorCQlyZXR1cm4gTlVMTDsKKwlyZXQtPmZldGNoID0gcGFyc2VfZmV0Y2hfcmVmc3BlYyhyZXQtPmZldGNoX3JlZnNwZWNfbnIsIHJldC0+ZmV0Y2hfcmVmc3BlYyk7CisJcmV0LT5wdXNoID0gcGFyc2VfcHVzaF9yZWZzcGVjKHJldC0+cHVzaF9yZWZzcGVjX25yLCByZXQtPnB1c2hfcmVmc3BlYyk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGZvcl9lYWNoX3JlbW90ZShlYWNoX3JlbW90ZV9mbiBmbiwgdm9pZCAqcHJpdikKK3sKKwlpbnQgaSwgcmVzdWx0ID0gMDsKKwlyZWFkX2NvbmZpZygpOworCWZvciAoaSA9IDA7IGkgPCByZW1vdGVzX25yICYmICFyZXN1bHQ7IGkrKykgeworCQlzdHJ1Y3QgcmVtb3RlICpyID0gcmVtb3Rlc1tpXTsKKwkJaWYgKCFyKQorCQkJY29udGludWU7CisJCWlmICghci0+ZmV0Y2gpCisJCQlyLT5mZXRjaCA9IHBhcnNlX2ZldGNoX3JlZnNwZWMoci0+ZmV0Y2hfcmVmc3BlY19uciwKKwkJCQkJCSAgICAgICByLT5mZXRjaF9yZWZzcGVjKTsKKwkJaWYgKCFyLT5wdXNoKQorCQkJci0+cHVzaCA9IHBhcnNlX3B1c2hfcmVmc3BlYyhyLT5wdXNoX3JlZnNwZWNfbnIsCisJCQkJCQkgICAgIHItPnB1c2hfcmVmc3BlYyk7CisJCXJlc3VsdCA9IGZuKHIsIHByaXYpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCit2b2lkIHJlZl9yZW1vdmVfZHVwbGljYXRlcyhzdHJ1Y3QgcmVmICpyZWZfbWFwKQoreworCXN0cnVjdCByZWYgKipwb3NuOworCXN0cnVjdCByZWYgKm5leHQ7CisJZm9yICg7IHJlZl9tYXA7IHJlZl9tYXAgPSByZWZfbWFwLT5uZXh0KSB7CisJCWlmICghcmVmX21hcC0+cGVlcl9yZWYpCisJCQljb250aW51ZTsKKwkJcG9zbiA9ICZyZWZfbWFwLT5uZXh0OworCQl3aGlsZSAoKnBvc24pIHsKKwkJCWlmICgoKnBvc24pLT5wZWVyX3JlZiAmJgorCQkJICAgICFzdHJjbXAoKCpwb3NuKS0+cGVlcl9yZWYtPm5hbWUsCisJCQkJICAgIHJlZl9tYXAtPnBlZXJfcmVmLT5uYW1lKSkgeworCQkJCWlmIChzdHJjbXAoKCpwb3NuKS0+bmFtZSwgcmVmX21hcC0+bmFtZSkpCisJCQkJCWRpZSgiJXMgdHJhY2tzIGJvdGggJXMgYW5kICVzIiwKKwkJCQkJICAgIHJlZl9tYXAtPnBlZXJfcmVmLT5uYW1lLAorCQkJCQkgICAgKCpwb3NuKS0+bmFtZSwgcmVmX21hcC0+bmFtZSk7CisJCQkJbmV4dCA9ICgqcG9zbiktPm5leHQ7CisJCQkJZnJlZSgoKnBvc24pLT5wZWVyX3JlZik7CisJCQkJZnJlZSgqcG9zbik7CisJCQkJKnBvc24gPSBuZXh0OworCQkJfSBlbHNlIHsKKwkJCQlwb3NuID0gJigqcG9zbiktPm5leHQ7CisJCQl9CisJCX0KKwl9Cit9CisKK2ludCByZW1vdGVfaGFzX3VybChzdHJ1Y3QgcmVtb3RlICpyZW1vdGUsIGNvbnN0IGNoYXIgKnVybCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgcmVtb3RlLT51cmxfbnI7IGkrKykgeworCQlpZiAoIXN0cmNtcChyZW1vdGUtPnVybFtpXSwgdXJsKSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHJlbW90ZV9maW5kX3RyYWNraW5nKHN0cnVjdCByZW1vdGUgKnJlbW90ZSwgc3RydWN0IHJlZnNwZWMgKnJlZnNwZWMpCit7CisJaW50IGZpbmRfc3JjID0gcmVmc3BlYy0+c3JjID09IE5VTEw7CisJY2hhciAqbmVlZGxlLCAqKnJlc3VsdDsKKwlpbnQgaTsKKworCWlmIChmaW5kX3NyYykgeworCQlpZiAoIXJlZnNwZWMtPmRzdCkKKwkJCXJldHVybiBlcnJvcigiZmluZF90cmFja2luZzogbmVlZCBlaXRoZXIgc3JjIG9yIGRzdCIpOworCQluZWVkbGUgPSByZWZzcGVjLT5kc3Q7CisJCXJlc3VsdCA9ICZyZWZzcGVjLT5zcmM7CisJfSBlbHNlIHsKKwkJbmVlZGxlID0gcmVmc3BlYy0+c3JjOworCQlyZXN1bHQgPSAmcmVmc3BlYy0+ZHN0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCByZW1vdGUtPmZldGNoX3JlZnNwZWNfbnI7IGkrKykgeworCQlzdHJ1Y3QgcmVmc3BlYyAqZmV0Y2ggPSAmcmVtb3RlLT5mZXRjaFtpXTsKKwkJY29uc3QgY2hhciAqa2V5ID0gZmluZF9zcmMgPyBmZXRjaC0+ZHN0IDogZmV0Y2gtPnNyYzsKKwkJY29uc3QgY2hhciAqdmFsdWUgPSBmaW5kX3NyYyA/IGZldGNoLT5zcmMgOiBmZXRjaC0+ZHN0OworCQlpZiAoIWZldGNoLT5kc3QpCisJCQljb250aW51ZTsKKwkJaWYgKGZldGNoLT5wYXR0ZXJuKSB7CisJCQlpZiAoIXByZWZpeGNtcChuZWVkbGUsIGtleSkgJiYKKwkJCSAgICBuZWVkbGVbc3RybGVuKGtleSldID09ICcvJykgeworCQkJCSpyZXN1bHQgPSB4bWFsbG9jKHN0cmxlbih2YWx1ZSkgKworCQkJCQkJICBzdHJsZW4obmVlZGxlKSAtCisJCQkJCQkgIHN0cmxlbihrZXkpICsgMSk7CisJCQkJc3RyY3B5KCpyZXN1bHQsIHZhbHVlKTsKKwkJCQlzdHJjcHkoKnJlc3VsdCArIHN0cmxlbih2YWx1ZSksCisJCQkJICAgICAgIG5lZWRsZSArIHN0cmxlbihrZXkpKTsKKwkJCQlyZWZzcGVjLT5mb3JjZSA9IGZldGNoLT5mb3JjZTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfSBlbHNlIGlmICghc3RyY21wKG5lZWRsZSwga2V5KSkgeworCQkJKnJlc3VsdCA9IHhzdHJkdXAodmFsdWUpOworCQkJcmVmc3BlYy0+Zm9yY2UgPSBmZXRjaC0+Zm9yY2U7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0cnVjdCByZWYgKmFsbG9jX3JlZih1bnNpZ25lZCBuYW1lbGVuKQoreworCXN0cnVjdCByZWYgKnJldCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWYpICsgbmFtZWxlbik7CisJbWVtc2V0KHJldCwgMCwgc2l6ZW9mKHN0cnVjdCByZWYpICsgbmFtZWxlbik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCByZWYgKmNvcHlfcmVmKGNvbnN0IHN0cnVjdCByZWYgKnJlZikKK3sKKwlzdHJ1Y3QgcmVmICpyZXQgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVmKSArIHN0cmxlbihyZWYtPm5hbWUpICsgMSk7CisJbWVtY3B5KHJldCwgcmVmLCBzaXplb2Yoc3RydWN0IHJlZikgKyBzdHJsZW4ocmVmLT5uYW1lKSArIDEpOworCXJldC0+bmV4dCA9IE5VTEw7CisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IHJlZiAqY29weV9yZWZfbGlzdChjb25zdCBzdHJ1Y3QgcmVmICpyZWYpCit7CisJc3RydWN0IHJlZiAqcmV0ID0gTlVMTDsKKwlzdHJ1Y3QgcmVmICoqdGFpbCA9ICZyZXQ7CisJd2hpbGUgKHJlZikgeworCQkqdGFpbCA9IGNvcHlfcmVmKHJlZik7CisJCXJlZiA9IHJlZi0+bmV4dDsKKwkJdGFpbCA9ICYoKCp0YWlsKS0+bmV4dCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgZnJlZV9yZWZzKHN0cnVjdCByZWYgKnJlZikKK3sKKwlzdHJ1Y3QgcmVmICpuZXh0OworCXdoaWxlIChyZWYpIHsKKwkJbmV4dCA9IHJlZi0+bmV4dDsKKwkJZnJlZShyZWYtPnBlZXJfcmVmKTsKKwkJZnJlZShyZWYpOworCQlyZWYgPSBuZXh0OworCX0KK30KKworc3RhdGljIGludCBjb3VudF9yZWZzcGVjX21hdGNoKGNvbnN0IGNoYXIgKnBhdHRlcm4sCisJCQkgICAgICAgc3RydWN0IHJlZiAqcmVmcywKKwkJCSAgICAgICBzdHJ1Y3QgcmVmICoqbWF0Y2hlZF9yZWYpCit7CisJaW50IHBhdGxlbiA9IHN0cmxlbihwYXR0ZXJuKTsKKwlzdHJ1Y3QgcmVmICptYXRjaGVkX3dlYWsgPSBOVUxMOworCXN0cnVjdCByZWYgKm1hdGNoZWQgPSBOVUxMOworCWludCB3ZWFrX21hdGNoID0gMDsKKwlpbnQgbWF0Y2ggPSAwOworCisJZm9yICh3ZWFrX21hdGNoID0gbWF0Y2ggPSAwOyByZWZzOyByZWZzID0gcmVmcy0+bmV4dCkgeworCQljaGFyICpuYW1lID0gcmVmcy0+bmFtZTsKKwkJaW50IG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisKKwkJaWYgKCFyZWZuYW1lX21hdGNoKHBhdHRlcm4sIG5hbWUsIHJlZl9yZXZfcGFyc2VfcnVsZXMpKQorCQkJY29udGludWU7CisKKwkJLyogQSBtYXRjaCBpcyAid2VhayIgaWYgaXQgaXMgd2l0aCByZWZzIG91dHNpZGUKKwkJICogaGVhZHMgb3IgdGFncywgYW5kIGRpZCBub3Qgc3BlY2lmeSB0aGUgcGF0dGVybgorCQkgKiBpbiBmdWxsIChlLmcuICJyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlciIpIG9yIGF0CisJCSAqIGxlYXN0IGZyb20gdGhlIHRvcGxldmVsIChlLmcuICJyZW1vdGVzL29yaWdpbi9tYXN0ZXIiKTsKKwkJICogb3RoZXJ3aXNlICJnaXQgcHVzaCAkVVJMIG1hc3RlciIgd291bGQgcmVzdWx0IGluCisJCSAqIGFtYmlndWl0eSBiZXR3ZWVuIHJlbW90ZXMvb3JpZ2luL21hc3RlciBhbmQgaGVhZHMvbWFzdGVyCisJCSAqIGF0IHRoZSByZW1vdGUgc2l0ZS4KKwkJICovCisJCWlmIChuYW1lbGVuICE9IHBhdGxlbiAmJgorCQkgICAgcGF0bGVuICE9IG5hbWVsZW4gLSA1ICYmCisJCSAgICBwcmVmaXhjbXAobmFtZSwgInJlZnMvaGVhZHMvIikgJiYKKwkJICAgIHByZWZpeGNtcChuYW1lLCAicmVmcy90YWdzLyIpKSB7CisJCQkvKiBXZSB3YW50IHRvIGNhdGNoIHRoZSBjYXNlIHdoZXJlIG9ubHkgd2VhaworCQkJICogbWF0Y2hlcyBhcmUgZm91bmQgYW5kIHRoZXJlIGFyZSBtdWx0aXBsZQorCQkJICogbWF0Y2hlcywgYW5kIHdoZXJlIG1vcmUgdGhhbiBvbmUgc3Ryb25nCisJCQkgKiBtYXRjaGVzIGFyZSBmb3VuZCwgYXMgYW1iaWd1b3VzLiAgT25lCisJCQkgKiBzdHJvbmcgbWF0Y2ggd2l0aCB6ZXJvIG9yIG1vcmUgd2VhayBtYXRjaGVzCisJCQkgKiBhcmUgYWNjZXB0YWJsZSBhcyBhIHVuaXF1ZSBtYXRjaC4KKwkJCSAqLworCQkJbWF0Y2hlZF93ZWFrID0gcmVmczsKKwkJCXdlYWtfbWF0Y2grKzsKKwkJfQorCQllbHNlIHsKKwkJCW1hdGNoZWQgPSByZWZzOworCQkJbWF0Y2grKzsKKwkJfQorCX0KKwlpZiAoIW1hdGNoZWQpIHsKKwkJKm1hdGNoZWRfcmVmID0gbWF0Y2hlZF93ZWFrOworCQlyZXR1cm4gd2Vha19tYXRjaDsKKwl9CisJZWxzZSB7CisJCSptYXRjaGVkX3JlZiA9IG1hdGNoZWQ7CisJCXJldHVybiBtYXRjaDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRhaWxfbGlua19yZWYoc3RydWN0IHJlZiAqcmVmLCBzdHJ1Y3QgcmVmICoqKnRhaWwpCit7CisJKip0YWlsID0gcmVmOworCXdoaWxlIChyZWYtPm5leHQpCisJCXJlZiA9IHJlZi0+bmV4dDsKKwkqdGFpbCA9ICZyZWYtPm5leHQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVmICp0cnlfZXhwbGljaXRfb2JqZWN0X25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXN0cnVjdCByZWYgKnJlZjsKKwlpbnQgbGVuOworCisJaWYgKCEqbmFtZSkgeworCQlyZWYgPSBhbGxvY19yZWYoMjApOworCQlzdHJjcHkocmVmLT5uYW1lLCAiKGRlbGV0ZSkiKTsKKwkJaGFzaGNscihyZWYtPm5ld19zaGExKTsKKwkJcmV0dXJuIHJlZjsKKwl9CisJaWYgKGdldF9zaGExKG5hbWUsIHNoYTEpKQorCQlyZXR1cm4gTlVMTDsKKwlsZW4gPSBzdHJsZW4obmFtZSkgKyAxOworCXJlZiA9IGFsbG9jX3JlZihsZW4pOworCW1lbWNweShyZWYtPm5hbWUsIG5hbWUsIGxlbik7CisJaGFzaGNweShyZWYtPm5ld19zaGExLCBzaGExKTsKKwlyZXR1cm4gcmVmOworfQorCitzdGF0aWMgc3RydWN0IHJlZiAqbWFrZV9saW5rZWRfcmVmKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCByZWYgKioqdGFpbCkKK3sKKwlzdHJ1Y3QgcmVmICpyZXQ7CisJc2l6ZV90IGxlbjsKKworCWxlbiA9IHN0cmxlbihuYW1lKSArIDE7CisJcmV0ID0gYWxsb2NfcmVmKGxlbik7CisJbWVtY3B5KHJldC0+bmFtZSwgbmFtZSwgbGVuKTsKKwl0YWlsX2xpbmtfcmVmKHJldCwgdGFpbCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtYXRjaF9leHBsaWNpdChzdHJ1Y3QgcmVmICpzcmMsIHN0cnVjdCByZWYgKmRzdCwKKwkJCSAgc3RydWN0IHJlZiAqKipkc3RfdGFpbCwKKwkJCSAgc3RydWN0IHJlZnNwZWMgKnJzLAorCQkJICBpbnQgZXJycykKK3sKKwlzdHJ1Y3QgcmVmICptYXRjaGVkX3NyYywgKm1hdGNoZWRfZHN0OworCisJY29uc3QgY2hhciAqZHN0X3ZhbHVlID0gcnMtPmRzdDsKKworCWlmIChycy0+cGF0dGVybikKKwkJcmV0dXJuIGVycnM7CisKKwltYXRjaGVkX3NyYyA9IG1hdGNoZWRfZHN0ID0gTlVMTDsKKwlzd2l0Y2ggKGNvdW50X3JlZnNwZWNfbWF0Y2gocnMtPnNyYywgc3JjLCAmbWF0Y2hlZF9zcmMpKSB7CisJY2FzZSAxOgorCQlicmVhazsKKwljYXNlIDA6CisJCS8qIFRoZSBzb3VyY2UgY291bGQgYmUgaW4gdGhlIGdldF9zaGExKCkgZm9ybWF0CisJCSAqIG5vdCBhIHJlZmVyZW5jZSBuYW1lLiAgOnJlZnMvb3RoZXIgaXMgYQorCQkgKiB3YXkgdG8gZGVsZXRlICdvdGhlcicgcmVmIGF0IHRoZSByZW1vdGUgZW5kLgorCQkgKi8KKwkJbWF0Y2hlZF9zcmMgPSB0cnlfZXhwbGljaXRfb2JqZWN0X25hbWUocnMtPnNyYyk7CisJCWlmICghbWF0Y2hlZF9zcmMpCisJCQllcnJvcigic3JjIHJlZnNwZWMgJXMgZG9lcyBub3QgbWF0Y2ggYW55LiIsIHJzLT5zcmMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltYXRjaGVkX3NyYyA9IE5VTEw7CisJCWVycm9yKCJzcmMgcmVmc3BlYyAlcyBtYXRjaGVzIG1vcmUgdGhhbiBvbmUuIiwgcnMtPnNyYyk7CisJCWJyZWFrOworCX0KKworCWlmICghbWF0Y2hlZF9zcmMpCisJCWVycnMgPSAxOworCisJaWYgKCFkc3RfdmFsdWUpIHsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJaW50IGZsYWc7CisKKwkJaWYgKCFtYXRjaGVkX3NyYykKKwkJCXJldHVybiBlcnJzOworCQlkc3RfdmFsdWUgPSByZXNvbHZlX3JlZihtYXRjaGVkX3NyYy0+bmFtZSwgc2hhMSwgMSwgJmZsYWcpOworCQlpZiAoIWRzdF92YWx1ZSB8fAorCQkgICAgKChmbGFnICYgUkVGX0lTU1lNUkVGKSAmJgorCQkgICAgIHByZWZpeGNtcChkc3RfdmFsdWUsICJyZWZzL2hlYWRzLyIpKSkKKwkJCWRpZSgiJXMgY2Fubm90IGJlIHJlc29sdmVkIHRvIGJyYW5jaC4iLAorCQkJICAgIG1hdGNoZWRfc3JjLT5uYW1lKTsKKwl9CisKKwlzd2l0Y2ggKGNvdW50X3JlZnNwZWNfbWF0Y2goZHN0X3ZhbHVlLCBkc3QsICZtYXRjaGVkX2RzdCkpIHsKKwljYXNlIDE6CisJCWJyZWFrOworCWNhc2UgMDoKKwkJaWYgKCFtZW1jbXAoZHN0X3ZhbHVlLCAicmVmcy8iLCA1KSkKKwkJCW1hdGNoZWRfZHN0ID0gbWFrZV9saW5rZWRfcmVmKGRzdF92YWx1ZSwgZHN0X3RhaWwpOworCQllbHNlCisJCQllcnJvcigiZHN0IHJlZnNwZWMgJXMgZG9lcyBub3QgbWF0Y2ggYW55ICIKKwkJCSAgICAgICJleGlzdGluZyByZWYgb24gdGhlIHJlbW90ZSBhbmQgZG9lcyAiCisJCQkgICAgICAibm90IHN0YXJ0IHdpdGggcmVmcy8uIiwgZHN0X3ZhbHVlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWF0Y2hlZF9kc3QgPSBOVUxMOworCQllcnJvcigiZHN0IHJlZnNwZWMgJXMgbWF0Y2hlcyBtb3JlIHRoYW4gb25lLiIsCisJCSAgICAgIGRzdF92YWx1ZSk7CisJCWJyZWFrOworCX0KKwlpZiAoZXJycyB8fCAhbWF0Y2hlZF9kc3QpCisJCXJldHVybiAxOworCWlmIChtYXRjaGVkX2RzdC0+cGVlcl9yZWYpIHsKKwkJZXJycyA9IDE7CisJCWVycm9yKCJkc3QgcmVmICVzIHJlY2VpdmVzIGZyb20gbW9yZSB0aGFuIG9uZSBzcmMuIiwKKwkJICAgICAgbWF0Y2hlZF9kc3QtPm5hbWUpOworCX0KKwllbHNlIHsKKwkJbWF0Y2hlZF9kc3QtPnBlZXJfcmVmID0gbWF0Y2hlZF9zcmM7CisJCW1hdGNoZWRfZHN0LT5mb3JjZSA9IHJzLT5mb3JjZTsKKwl9CisJcmV0dXJuIGVycnM7Cit9CisKK3N0YXRpYyBpbnQgbWF0Y2hfZXhwbGljaXRfcmVmcyhzdHJ1Y3QgcmVmICpzcmMsIHN0cnVjdCByZWYgKmRzdCwKKwkJCSAgICAgICBzdHJ1Y3QgcmVmICoqKmRzdF90YWlsLCBzdHJ1Y3QgcmVmc3BlYyAqcnMsCisJCQkgICAgICAgaW50IHJzX25yKQoreworCWludCBpLCBlcnJzOworCWZvciAoaSA9IGVycnMgPSAwOyBpIDwgcnNfbnI7IGkrKykKKwkJZXJycyB8PSBtYXRjaF9leHBsaWNpdChzcmMsIGRzdCwgZHN0X3RhaWwsICZyc1tpXSwgZXJycyk7CisJcmV0dXJuIC1lcnJzOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZnNwZWMgKmNoZWNrX3BhdHRlcm5fbWF0Y2goY29uc3Qgc3RydWN0IHJlZnNwZWMgKnJzLAorCQkJCQkJIGludCByc19uciwKKwkJCQkJCSBjb25zdCBzdHJ1Y3QgcmVmICpzcmMpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHJzX25yOyBpKyspIHsKKwkJaWYgKHJzW2ldLnBhdHRlcm4gJiYKKwkJICAgICFwcmVmaXhjbXAoc3JjLT5uYW1lLCByc1tpXS5zcmMpICYmCisJCSAgICBzcmMtPm5hbWVbc3RybGVuKHJzW2ldLnNyYyldID09ICcvJykKKwkJCXJldHVybiBycyArIGk7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogTm90ZS4gVGhpcyBpcyB1c2VkIG9ubHkgYnkgInB1c2giOyByZWZzcGVjIG1hdGNoaW5nIHJ1bGVzIGZvcgorICogcHVzaCBhbmQgZmV0Y2ggYXJlIHN1YnRseSBkaWZmZXJlbnQsIHNvIGRvIG5vdCB0cnkgdG8gcmV1c2UgaXQKKyAqIHdpdGhvdXQgdGhpbmtpbmcuCisgKi8KK2ludCBtYXRjaF9yZWZzKHN0cnVjdCByZWYgKnNyYywgc3RydWN0IHJlZiAqZHN0LCBzdHJ1Y3QgcmVmICoqKmRzdF90YWlsLAorCSAgICAgICBpbnQgbnJfcmVmc3BlYywgY29uc3QgY2hhciAqKnJlZnNwZWMsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgcmVmc3BlYyAqcnMgPQorCQlwYXJzZV9wdXNoX3JlZnNwZWMobnJfcmVmc3BlYywgKGNvbnN0IGNoYXIgKiopIHJlZnNwZWMpOworCWludCBzZW5kX2FsbCA9IGZsYWdzICYgTUFUQ0hfUkVGU19BTEw7CisJaW50IHNlbmRfbWlycm9yID0gZmxhZ3MgJiBNQVRDSF9SRUZTX01JUlJPUjsKKworCWlmIChtYXRjaF9leHBsaWNpdF9yZWZzKHNyYywgZHN0LCBkc3RfdGFpbCwgcnMsIG5yX3JlZnNwZWMpKQorCQlyZXR1cm4gLTE7CisKKwkvKiBwaWNrIHRoZSByZW1haW5kZXIgKi8KKwlmb3IgKCA7IHNyYzsgc3JjID0gc3JjLT5uZXh0KSB7CisJCXN0cnVjdCByZWYgKmRzdF9wZWVyOworCQljb25zdCBzdHJ1Y3QgcmVmc3BlYyAqcGF0ID0gTlVMTDsKKwkJY2hhciAqZHN0X25hbWU7CisJCWlmIChzcmMtPnBlZXJfcmVmKQorCQkJY29udGludWU7CisJCWlmIChucl9yZWZzcGVjKSB7CisJCQlwYXQgPSBjaGVja19wYXR0ZXJuX21hdGNoKHJzLCBucl9yZWZzcGVjLCBzcmMpOworCQkJaWYgKCFwYXQpCisJCQkJY29udGludWU7CisJCX0KKwkJZWxzZSBpZiAoIXNlbmRfbWlycm9yICYmIHByZWZpeGNtcChzcmMtPm5hbWUsICJyZWZzL2hlYWRzLyIpKQorCQkJLyoKKwkJCSAqICJtYXRjaGluZyByZWZzIjsgdHJhZGl0aW9uYWxseSB3ZSBwdXNoZWQgZXZlcnl0aGluZworCQkJICogaW5jbHVkaW5nIHJlZnMgb3V0c2lkZSByZWZzL2hlYWRzLyBoaWVyYXJjaHksIGJ1dAorCQkJICogdGhhdCBkb2VzIG5vdCBtYWtlIG11Y2ggc2Vuc2UgdGhlc2UgZGF5cy4KKwkJCSAqLworCQkJY29udGludWU7CisKKwkJaWYgKHBhdCkgeworCQkJY29uc3QgY2hhciAqZHN0X3NpZGUgPSBwYXQtPmRzdCA/IHBhdC0+ZHN0IDogcGF0LT5zcmM7CisJCQlkc3RfbmFtZSA9IHhtYWxsb2Moc3RybGVuKGRzdF9zaWRlKSArCisJCQkJCSAgIHN0cmxlbihzcmMtPm5hbWUpIC0KKwkJCQkJICAgc3RybGVuKHBhdC0+c3JjKSArIDIpOworCQkJc3RyY3B5KGRzdF9uYW1lLCBkc3Rfc2lkZSk7CisJCQlzdHJjYXQoZHN0X25hbWUsIHNyYy0+bmFtZSArIHN0cmxlbihwYXQtPnNyYykpOworCQl9IGVsc2UKKwkJCWRzdF9uYW1lID0geHN0cmR1cChzcmMtPm5hbWUpOworCQlkc3RfcGVlciA9IGZpbmRfcmVmX2J5X25hbWUoZHN0LCBkc3RfbmFtZSk7CisJCWlmIChkc3RfcGVlciAmJiBkc3RfcGVlci0+cGVlcl9yZWYpCisJCQkvKiBXZSdyZSBhbHJlYWR5IHNlbmRpbmcgc29tZXRoaW5nIHRvIHRoaXMgcmVmLiAqLworCQkJZ290byBmcmVlX25hbWU7CisKKwkJaWYgKCFkc3RfcGVlciAmJiAhbnJfcmVmc3BlYyAmJiAhKHNlbmRfYWxsIHx8IHNlbmRfbWlycm9yKSkKKwkJCS8qCisJCQkgKiBSZW1vdGUgZG9lc24ndCBoYXZlIGl0LCBhbmQgd2UgaGF2ZSBubworCQkJICogZXhwbGljaXQgcGF0dGVybiwgYW5kIHdlIGRvbid0IGhhdmUKKwkJCSAqIC0tYWxsIG5vciAtLW1pcnJvci4KKwkJCSAqLworCQkJZ290byBmcmVlX25hbWU7CisJCWlmICghZHN0X3BlZXIpIHsKKwkJCS8qIENyZWF0ZSBhIG5ldyBvbmUgYW5kIGxpbmsgaXQgKi8KKwkJCWRzdF9wZWVyID0gbWFrZV9saW5rZWRfcmVmKGRzdF9uYW1lLCBkc3RfdGFpbCk7CisJCQloYXNoY3B5KGRzdF9wZWVyLT5uZXdfc2hhMSwgc3JjLT5uZXdfc2hhMSk7CisJCX0KKwkJZHN0X3BlZXItPnBlZXJfcmVmID0gc3JjOworCQlpZiAocGF0KQorCQkJZHN0X3BlZXItPmZvcmNlID0gcGF0LT5mb3JjZTsKKwlmcmVlX25hbWU6CisJCWZyZWUoZHN0X25hbWUpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGJyYW5jaCAqYnJhbmNoX2dldChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBicmFuY2ggKnJldDsKKworCXJlYWRfY29uZmlnKCk7CisJaWYgKCFuYW1lIHx8ICEqbmFtZSB8fCAhc3RyY21wKG5hbWUsICJIRUFEIikpCisJCXJldCA9IGN1cnJlbnRfYnJhbmNoOworCWVsc2UKKwkJcmV0ID0gbWFrZV9icmFuY2gobmFtZSwgMCk7CisJaWYgKHJldCAmJiByZXQtPnJlbW90ZV9uYW1lKSB7CisJCXJldC0+cmVtb3RlID0gcmVtb3RlX2dldChyZXQtPnJlbW90ZV9uYW1lKTsKKwkJaWYgKHJldC0+bWVyZ2VfbnIpIHsKKwkJCWludCBpOworCQkJcmV0LT5tZXJnZSA9IHhjYWxsb2Moc2l6ZW9mKCpyZXQtPm1lcmdlKSwKKwkJCQkJICAgICByZXQtPm1lcmdlX25yKTsKKwkJCWZvciAoaSA9IDA7IGkgPCByZXQtPm1lcmdlX25yOyBpKyspIHsKKwkJCQlyZXQtPm1lcmdlW2ldID0geGNhbGxvYygxLCBzaXplb2YoKipyZXQtPm1lcmdlKSk7CisJCQkJcmV0LT5tZXJnZVtpXS0+c3JjID0geHN0cmR1cChyZXQtPm1lcmdlX25hbWVbaV0pOworCQkJCXJlbW90ZV9maW5kX3RyYWNraW5nKHJldC0+cmVtb3RlLAorCQkJCQkJICAgICByZXQtPm1lcmdlW2ldKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgYnJhbmNoX2hhc19tZXJnZV9jb25maWcoc3RydWN0IGJyYW5jaCAqYnJhbmNoKQoreworCXJldHVybiBicmFuY2ggJiYgISFicmFuY2gtPm1lcmdlOworfQorCitpbnQgYnJhbmNoX21lcmdlX21hdGNoZXMoc3RydWN0IGJyYW5jaCAqYnJhbmNoLAorCQkgICAgICAgICAgICAgICAgIGludCBpLAorCQkgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlZm5hbWUpCit7CisJaWYgKCFicmFuY2ggfHwgaSA8IDAgfHwgaSA+PSBicmFuY2gtPm1lcmdlX25yKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gcmVmbmFtZV9tYXRjaChicmFuY2gtPm1lcmdlW2ldLT5zcmMsIHJlZm5hbWUsIHJlZl9mZXRjaF9ydWxlcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVmICpnZXRfZXhwYW5kZWRfbWFwKGNvbnN0IHN0cnVjdCByZWYgKnJlbW90ZV9yZWZzLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgcmVmc3BlYyAqcmVmc3BlYykKK3sKKwljb25zdCBzdHJ1Y3QgcmVmICpyZWY7CisJc3RydWN0IHJlZiAqcmV0ID0gTlVMTDsKKwlzdHJ1Y3QgcmVmICoqdGFpbCA9ICZyZXQ7CisKKwlpbnQgcmVtb3RlX3ByZWZpeF9sZW4gPSBzdHJsZW4ocmVmc3BlYy0+c3JjKTsKKwlpbnQgbG9jYWxfcHJlZml4X2xlbiA9IHN0cmxlbihyZWZzcGVjLT5kc3QpOworCisJZm9yIChyZWYgPSByZW1vdGVfcmVmczsgcmVmOyByZWYgPSByZWYtPm5leHQpIHsKKwkJaWYgKHN0cmNocihyZWYtPm5hbWUsICdeJykpCisJCQljb250aW51ZTsgLyogYSBkZXJlZmVyZW5jZSBpdGVtICovCisJCWlmICghcHJlZml4Y21wKHJlZi0+bmFtZSwgcmVmc3BlYy0+c3JjKSkgeworCQkJY29uc3QgY2hhciAqbWF0Y2g7CisJCQlzdHJ1Y3QgcmVmICpjcHkgPSBjb3B5X3JlZihyZWYpOworCQkJbWF0Y2ggPSByZWYtPm5hbWUgKyByZW1vdGVfcHJlZml4X2xlbjsKKworCQkJY3B5LT5wZWVyX3JlZiA9IGFsbG9jX3JlZihsb2NhbF9wcmVmaXhfbGVuICsKKwkJCQkJCSAgc3RybGVuKG1hdGNoKSArIDEpOworCQkJc3ByaW50ZihjcHktPnBlZXJfcmVmLT5uYW1lLCAiJXMlcyIsCisJCQkJcmVmc3BlYy0+ZHN0LCBtYXRjaCk7CisJCQlpZiAocmVmc3BlYy0+Zm9yY2UpCisJCQkJY3B5LT5wZWVyX3JlZi0+Zm9yY2UgPSAxOworCQkJKnRhaWwgPSBjcHk7CisJCQl0YWlsID0gJmNweS0+bmV4dDsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVmICpmaW5kX3JlZl9ieV9uYW1lX2FiYnJldihjb25zdCBzdHJ1Y3QgcmVmICpyZWZzLCBjb25zdCBjaGFyICpuYW1lKQoreworCWNvbnN0IHN0cnVjdCByZWYgKnJlZjsKKwlmb3IgKHJlZiA9IHJlZnM7IHJlZjsgcmVmID0gcmVmLT5uZXh0KSB7CisJCWlmIChyZWZuYW1lX21hdGNoKG5hbWUsIHJlZi0+bmFtZSwgcmVmX2ZldGNoX3J1bGVzKSkKKwkJCXJldHVybiByZWY7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgcmVmICpnZXRfcmVtb3RlX3JlZihjb25zdCBzdHJ1Y3QgcmVmICpyZW1vdGVfcmVmcywgY29uc3QgY2hhciAqbmFtZSkKK3sKKwljb25zdCBzdHJ1Y3QgcmVmICpyZWYgPSBmaW5kX3JlZl9ieV9uYW1lX2FiYnJldihyZW1vdGVfcmVmcywgbmFtZSk7CisKKwlpZiAoIXJlZikKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gY29weV9yZWYocmVmKTsKK30KKworc3RhdGljIHN0cnVjdCByZWYgKmdldF9sb2NhbF9yZWYoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgcmVmICpyZXQ7CisJaWYgKCFuYW1lKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghcHJlZml4Y21wKG5hbWUsICJyZWZzLyIpKSB7CisJCXJldCA9IGFsbG9jX3JlZihzdHJsZW4obmFtZSkgKyAxKTsKKwkJc3RyY3B5KHJldC0+bmFtZSwgbmFtZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCFwcmVmaXhjbXAobmFtZSwgImhlYWRzLyIpIHx8CisJICAgICFwcmVmaXhjbXAobmFtZSwgInRhZ3MvIikgfHwKKwkgICAgIXByZWZpeGNtcChuYW1lLCAicmVtb3Rlcy8iKSkgeworCQlyZXQgPSBhbGxvY19yZWYoc3RybGVuKG5hbWUpICsgNik7CisJCXNwcmludGYocmV0LT5uYW1lLCAicmVmcy8lcyIsIG5hbWUpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGFsbG9jX3JlZihzdHJsZW4obmFtZSkgKyAxMik7CisJc3ByaW50ZihyZXQtPm5hbWUsICJyZWZzL2hlYWRzLyVzIiwgbmFtZSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGdldF9mZXRjaF9tYXAoY29uc3Qgc3RydWN0IHJlZiAqcmVtb3RlX3JlZnMsCisJCSAgY29uc3Qgc3RydWN0IHJlZnNwZWMgKnJlZnNwZWMsCisJCSAgc3RydWN0IHJlZiAqKip0YWlsLAorCQkgIGludCBtaXNzaW5nX29rKQoreworCXN0cnVjdCByZWYgKnJlZl9tYXAsICoqcm1wOworCisJaWYgKHJlZnNwZWMtPnBhdHRlcm4pIHsKKwkJcmVmX21hcCA9IGdldF9leHBhbmRlZF9tYXAocmVtb3RlX3JlZnMsIHJlZnNwZWMpOworCX0gZWxzZSB7CisJCWNvbnN0IGNoYXIgKm5hbWUgPSByZWZzcGVjLT5zcmNbMF0gPyByZWZzcGVjLT5zcmMgOiAiSEVBRCI7CisKKwkJcmVmX21hcCA9IGdldF9yZW1vdGVfcmVmKHJlbW90ZV9yZWZzLCBuYW1lKTsKKwkJaWYgKCFtaXNzaW5nX29rICYmICFyZWZfbWFwKQorCQkJZGllKCJDb3VsZG4ndCBmaW5kIHJlbW90ZSByZWYgJXMiLCBuYW1lKTsKKwkJaWYgKHJlZl9tYXApIHsKKwkJCXJlZl9tYXAtPnBlZXJfcmVmID0gZ2V0X2xvY2FsX3JlZihyZWZzcGVjLT5kc3QpOworCQkJaWYgKHJlZl9tYXAtPnBlZXJfcmVmICYmIHJlZnNwZWMtPmZvcmNlKQorCQkJCXJlZl9tYXAtPnBlZXJfcmVmLT5mb3JjZSA9IDE7CisJCX0KKwl9CisKKwlmb3IgKHJtcCA9ICZyZWZfbWFwOyAqcm1wOyApIHsKKwkJaWYgKCgqcm1wKS0+cGVlcl9yZWYpIHsKKwkJCWludCBzdCA9IGNoZWNrX3JlZl9mb3JtYXQoKCpybXApLT5wZWVyX3JlZi0+bmFtZSArIDUpOworCQkJaWYgKHN0ICYmIHN0ICE9IENIRUNLX1JFRl9GT1JNQVRfT05FTEVWRUwpIHsKKwkJCQlzdHJ1Y3QgcmVmICppZ25vcmUgPSAqcm1wOworCQkJCWVycm9yKCIqIElnbm9yaW5nIGZ1bm55IHJlZiAnJXMnIGxvY2FsbHkiLAorCQkJCSAgICAgICgqcm1wKS0+cGVlcl9yZWYtPm5hbWUpOworCQkJCSpybXAgPSAoKnJtcCktPm5leHQ7CisJCQkJZnJlZShpZ25vcmUtPnBlZXJfcmVmKTsKKwkJCQlmcmVlKGlnbm9yZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJcm1wID0gJigoKnJtcCktPm5leHQpOworCX0KKworCWlmIChyZWZfbWFwKQorCQl0YWlsX2xpbmtfcmVmKHJlZl9tYXAsIHRhaWwpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9yZW1vdGUuaCBiL3JlbW90ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlOWFlNzkKLS0tIC9kZXYvbnVsbAorKysgYi9yZW1vdGUuaApAQCAtMCwwICsxLDEyMyBAQAorI2lmbmRlZiBSRU1PVEVfSAorI2RlZmluZSBSRU1PVEVfSAorCitzdHJ1Y3QgcmVtb3RlIHsKKwljb25zdCBjaGFyICpuYW1lOworCisJY29uc3QgY2hhciAqKnVybDsKKwlpbnQgdXJsX25yOworCWludCB1cmxfYWxsb2M7CisKKwljb25zdCBjaGFyICoqcHVzaF9yZWZzcGVjOworCXN0cnVjdCByZWZzcGVjICpwdXNoOworCWludCBwdXNoX3JlZnNwZWNfbnI7CisJaW50IHB1c2hfcmVmc3BlY19hbGxvYzsKKworCWNvbnN0IGNoYXIgKipmZXRjaF9yZWZzcGVjOworCXN0cnVjdCByZWZzcGVjICpmZXRjaDsKKwlpbnQgZmV0Y2hfcmVmc3BlY19ucjsKKwlpbnQgZmV0Y2hfcmVmc3BlY19hbGxvYzsKKworCS8qCisJICogLTEgdG8gbmV2ZXIgZmV0Y2ggdGFncworCSAqIDAgdG8gYXV0by1mb2xsb3cgdGFncyBvbiBoZXVyaXN0aWMgKGRlZmF1bHQpCisJICogMSB0byBhbHdheXMgYXV0by1mb2xsb3cgdGFncworCSAqIDIgdG8gYWx3YXlzIGZldGNoIHRhZ3MKKwkgKi8KKwlpbnQgZmV0Y2hfdGFnczsKKwlpbnQgc2tpcF9kZWZhdWx0X3VwZGF0ZTsKKworCWNvbnN0IGNoYXIgKnJlY2VpdmVwYWNrOworCWNvbnN0IGNoYXIgKnVwbG9hZHBhY2s7CisKKwkvKgorCSAqIGZvciBjdXJsIHJlbW90ZXMgb25seQorCSAqLworCWNoYXIgKmh0dHBfcHJveHk7Cit9OworCitzdHJ1Y3QgcmVtb3RlICpyZW1vdGVfZ2V0KGNvbnN0IGNoYXIgKm5hbWUpOworCit0eXBlZGVmIGludCBlYWNoX3JlbW90ZV9mbihzdHJ1Y3QgcmVtb3RlICpyZW1vdGUsIHZvaWQgKnByaXYpOworaW50IGZvcl9lYWNoX3JlbW90ZShlYWNoX3JlbW90ZV9mbiBmbiwgdm9pZCAqcHJpdik7CisKK2ludCByZW1vdGVfaGFzX3VybChzdHJ1Y3QgcmVtb3RlICpyZW1vdGUsIGNvbnN0IGNoYXIgKnVybCk7CisKK3N0cnVjdCByZWZzcGVjIHsKKwl1bnNpZ25lZCBmb3JjZSA6IDE7CisJdW5zaWduZWQgcGF0dGVybiA6IDE7CisKKwljaGFyICpzcmM7CisJY2hhciAqZHN0OworfTsKKworc3RydWN0IHJlZiAqYWxsb2NfcmVmKHVuc2lnbmVkIG5hbWVsZW4pOworCitzdHJ1Y3QgcmVmICpjb3B5X3JlZl9saXN0KGNvbnN0IHN0cnVjdCByZWYgKnJlZik7CisKK2ludCBjaGVja19yZWZfdHlwZShjb25zdCBzdHJ1Y3QgcmVmICpyZWYsIGludCBmbGFncyk7CisKKy8qCisgKiBGcmVlcyB0aGUgZW50aXJlIGxpc3QgYW5kIHBlZXJzIG9mIGVsZW1lbnRzLgorICovCit2b2lkIGZyZWVfcmVmcyhzdHJ1Y3QgcmVmICpyZWYpOworCisvKgorICogUmVtb3ZlcyBhbmQgZnJlZXMgYW55IGR1cGxpY2F0ZSByZWZzIGluIHRoZSBtYXAuCisgKi8KK3ZvaWQgcmVmX3JlbW92ZV9kdXBsaWNhdGVzKHN0cnVjdCByZWYgKnJlZl9tYXApOworCitzdHJ1Y3QgcmVmc3BlYyAqcGFyc2VfZmV0Y2hfcmVmc3BlYyhpbnQgbnJfcmVmc3BlYywgY29uc3QgY2hhciAqKnJlZnNwZWMpOworc3RydWN0IHJlZnNwZWMgKnBhcnNlX3B1c2hfcmVmc3BlYyhpbnQgbnJfcmVmc3BlYywgY29uc3QgY2hhciAqKnJlZnNwZWMpOworCitpbnQgbWF0Y2hfcmVmcyhzdHJ1Y3QgcmVmICpzcmMsIHN0cnVjdCByZWYgKmRzdCwgc3RydWN0IHJlZiAqKipkc3RfdGFpbCwKKwkgICAgICAgaW50IG5yX3JlZnNwZWMsIGNvbnN0IGNoYXIgKipyZWZzcGVjLCBpbnQgYWxsKTsKKworLyoKKyAqIEdpdmVuIGEgbGlzdCBvZiB0aGUgcmVtb3RlIHJlZnMgYW5kIHRoZSBzcGVjaWZpY2F0aW9uIG9mIHRoaW5ncyB0bworICogZmV0Y2gsIG1ha2VzIGEgKHNlcGFyYXRlKSBsaXN0IG9mIHRoZSByZWZzIHRvIGZldGNoIGFuZCB0aGUgbG9jYWwKKyAqIHJlZnMgdG8gc3RvcmUgaW50by4KKyAqCisgKiAqdGFpbCBpcyB0aGUgcG9pbnRlciB0byB0aGUgdGFpbCBwb2ludGVyIG9mIHRoZSBsaXN0IG9mIHJlc3VsdHMKKyAqIGJlZm9yZWhhbmQsIGFuZCB3aWxsIGJlIHNldCB0byB0aGUgdGFpbCBwb2ludGVyIG9mIHRoZSBsaXN0IG9mCisgKiByZXN1bHRzIGFmdGVyd2FyZC4KKyAqCisgKiBtaXNzaW5nX29rIGlzIHVzdWFsbHkgZmFsc2UsIGJ1dCB3aGVuIHdlIGFyZSBhZGRpbmcgYnJhbmNoLiRuYW1lLm1lcmdlCisgKiBpdCBpcyBPayBpZiB0aGUgYnJhbmNoIGlzIG5vdCBhdCB0aGUgcmVtb3RlIGFueW1vcmUuCisgKi8KK2ludCBnZXRfZmV0Y2hfbWFwKGNvbnN0IHN0cnVjdCByZWYgKnJlbW90ZV9yZWZzLCBjb25zdCBzdHJ1Y3QgcmVmc3BlYyAqcmVmc3BlYywKKwkJICBzdHJ1Y3QgcmVmICoqKnRhaWwsIGludCBtaXNzaW5nX29rKTsKKworc3RydWN0IHJlZiAqZ2V0X3JlbW90ZV9yZWYoY29uc3Qgc3RydWN0IHJlZiAqcmVtb3RlX3JlZnMsIGNvbnN0IGNoYXIgKm5hbWUpOworCisvKgorICogRm9yIHRoZSBnaXZlbiByZW1vdGUsIHJlYWRzIHRoZSByZWZzcGVjJ3Mgc3JjIGFuZCBzZXRzIHRoZSBvdGhlciBmaWVsZHMuCisgKi8KK2ludCByZW1vdGVfZmluZF90cmFja2luZyhzdHJ1Y3QgcmVtb3RlICpyZW1vdGUsIHN0cnVjdCByZWZzcGVjICpyZWZzcGVjKTsKKworc3RydWN0IGJyYW5jaCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpyZWZuYW1lOworCisJY29uc3QgY2hhciAqcmVtb3RlX25hbWU7CisJc3RydWN0IHJlbW90ZSAqcmVtb3RlOworCisJY29uc3QgY2hhciAqKm1lcmdlX25hbWU7CisJc3RydWN0IHJlZnNwZWMgKiptZXJnZTsKKwlpbnQgbWVyZ2VfbnI7CisJaW50IG1lcmdlX2FsbG9jOworfTsKKworc3RydWN0IGJyYW5jaCAqYnJhbmNoX2dldChjb25zdCBjaGFyICpuYW1lKTsKKworaW50IGJyYW5jaF9oYXNfbWVyZ2VfY29uZmlnKHN0cnVjdCBicmFuY2ggKmJyYW5jaCk7CitpbnQgYnJhbmNoX21lcmdlX21hdGNoZXMoc3RydWN0IGJyYW5jaCAqLCBpbnQgbiwgY29uc3QgY2hhciAqKTsKKworLyogRmxhZ3MgdG8gbWF0Y2hfcmVmcy4gKi8KK2VudW0gbWF0Y2hfcmVmc19mbGFncyB7CisJTUFUQ0hfUkVGU19OT05FCQk9IDAsCisJTUFUQ0hfUkVGU19BTEwgCQk9ICgxIDw8IDApLAorCU1BVENIX1JFRlNfTUlSUk9SCT0gKDEgPDwgMSksCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3JldmlzaW9uLmMgYi9yZXZpc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NmZlZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvcmV2aXNpb24uYwpAQCAtMCwwICsxLDE3MDUgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorI2luY2x1ZGUgImdyZXAuaCIKKyNpbmNsdWRlICJyZWZsb2ctd2Fsay5oIgorI2luY2x1ZGUgInBhdGNoLWlkcy5oIgorCit2b2xhdGlsZSBzaG93X2Vhcmx5X291dHB1dF9mbl90IHNob3dfZWFybHlfb3V0cHV0OworCitzdGF0aWMgY2hhciAqcGF0aF9uYW1lKHN0cnVjdCBuYW1lX3BhdGggKnBhdGgsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IG5hbWVfcGF0aCAqcDsKKwljaGFyICpuLCAqbTsKKwlpbnQgbmxlbiA9IHN0cmxlbihuYW1lKTsKKwlpbnQgbGVuID0gbmxlbiArIDE7CisKKwlmb3IgKHAgPSBwYXRoOyBwOyBwID0gcC0+dXApIHsKKwkJaWYgKHAtPmVsZW1fbGVuKQorCQkJbGVuICs9IHAtPmVsZW1fbGVuICsgMTsKKwl9CisJbiA9IHhtYWxsb2MobGVuKTsKKwltID0gbiArIGxlbiAtIChubGVuICsgMSk7CisJc3RyY3B5KG0sIG5hbWUpOworCWZvciAocCA9IHBhdGg7IHA7IHAgPSBwLT51cCkgeworCQlpZiAocC0+ZWxlbV9sZW4pIHsKKwkJCW0gLT0gcC0+ZWxlbV9sZW4gKyAxOworCQkJbWVtY3B5KG0sIHAtPmVsZW0sIHAtPmVsZW1fbGVuKTsKKwkJCW1bcC0+ZWxlbV9sZW5dID0gJy8nOworCQl9CisJfQorCXJldHVybiBuOworfQorCit2b2lkIGFkZF9vYmplY3Qoc3RydWN0IG9iamVjdCAqb2JqLAorCQlzdHJ1Y3Qgb2JqZWN0X2FycmF5ICpwLAorCQlzdHJ1Y3QgbmFtZV9wYXRoICpwYXRoLAorCQljb25zdCBjaGFyICpuYW1lKQoreworCWFkZF9vYmplY3RfYXJyYXkob2JqLCBwYXRoX25hbWUocGF0aCwgbmFtZSksIHApOworfQorCitzdGF0aWMgdm9pZCBtYXJrX2Jsb2JfdW5pbnRlcmVzdGluZyhzdHJ1Y3QgYmxvYiAqYmxvYikKK3sKKwlpZiAoIWJsb2IpCisJCXJldHVybjsKKwlpZiAoYmxvYi0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykKKwkJcmV0dXJuOworCWJsb2ItPm9iamVjdC5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworfQorCit2b2lkIG1hcmtfdHJlZV91bmludGVyZXN0aW5nKHN0cnVjdCB0cmVlICp0cmVlKQoreworCXN0cnVjdCB0cmVlX2Rlc2MgZGVzYzsKKwlzdHJ1Y3QgbmFtZV9lbnRyeSBlbnRyeTsKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSAmdHJlZS0+b2JqZWN0OworCisJaWYgKCF0cmVlKQorCQlyZXR1cm47CisJaWYgKG9iai0+ZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQlyZXR1cm47CisJb2JqLT5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworCWlmICghaGFzX3NoYTFfZmlsZShvYmotPnNoYTEpKQorCQlyZXR1cm47CisJaWYgKHBhcnNlX3RyZWUodHJlZSkgPCAwKQorCQlkaWUoImJhZCB0cmVlICVzIiwgc2hhMV90b19oZXgob2JqLT5zaGExKSk7CisKKwlpbml0X3RyZWVfZGVzYygmZGVzYywgdHJlZS0+YnVmZmVyLCB0cmVlLT5zaXplKTsKKwl3aGlsZSAodHJlZV9lbnRyeSgmZGVzYywgJmVudHJ5KSkgeworCQlzd2l0Y2ggKG9iamVjdF90eXBlKGVudHJ5Lm1vZGUpKSB7CisJCWNhc2UgT0JKX1RSRUU6CisJCQltYXJrX3RyZWVfdW5pbnRlcmVzdGluZyhsb29rdXBfdHJlZShlbnRyeS5zaGExKSk7CisJCQlicmVhazsKKwkJY2FzZSBPQkpfQkxPQjoKKwkJCW1hcmtfYmxvYl91bmludGVyZXN0aW5nKGxvb2t1cF9ibG9iKGVudHJ5LnNoYTEpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogU3VicHJvamVjdCBjb21taXQgLSBub3QgaW4gdGhpcyByZXBvc2l0b3J5ICovCisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgdHJlZSBhbnkgbW9yZQorCSAqIGFmdGVyIGl0IGhhcyBiZWVuIG1hcmtlZCB1bmludGVyZXN0aW5nLgorCSAqLworCWZyZWUodHJlZS0+YnVmZmVyKTsKKwl0cmVlLT5idWZmZXIgPSBOVUxMOworfQorCit2b2lkIG1hcmtfcGFyZW50c191bmludGVyZXN0aW5nKHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7CisKKwl3aGlsZSAocGFyZW50cykgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBwYXJlbnRzLT5pdGVtOworCQlpZiAoIShjb21taXQtPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpKSB7CisJCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworCisJCQkvKgorCQkJICogTm9ybWFsbHkgd2UgaGF2ZW4ndCBwYXJzZWQgdGhlIHBhcmVudAorCQkJICogeWV0LCBzbyB3ZSB3b24ndCBoYXZlIGEgcGFyZW50IG9mIGEgcGFyZW50CisJCQkgKiBoZXJlLiBIb3dldmVyLCBpdCBtYXkgdHVybiBvdXQgdGhhdCB3ZSd2ZQorCQkJICogcmVhY2hlZCB0aGlzIGNvbW1pdCBzb21lIG90aGVyIHdheSAod2hlcmUgaXQKKwkJCSAqIHdhc24ndCB1bmludGVyZXN0aW5nKSwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkCisJCQkgKiB0byBtYXJrIGl0cyBwYXJlbnRzIHJlY3Vyc2l2ZWx5IHRvby4uCisJCQkgKi8KKwkJCWlmIChjb21taXQtPnBhcmVudHMpCisJCQkJbWFya19wYXJlbnRzX3VuaW50ZXJlc3RpbmcoY29tbWl0KTsKKwkJfQorCisJCS8qCisJCSAqIEEgbWlzc2luZyBjb21taXQgaXMgb2sgaWZmIGl0cyBwYXJlbnQgaXMgbWFya2VkCisJCSAqIHVuaW50ZXJlc3RpbmcuCisJCSAqCisJCSAqIFdlIGp1c3QgbWFyayBzdWNoIGEgdGhpbmcgcGFyc2VkLCBzbyB0aGF0IHdoZW4KKwkJICogaXQgaXMgcG9wcGVkIG5leHQgdGltZSBhcm91bmQsIHdlIHdvbid0IGJlIHRyeWluZworCQkgKiB0byBwYXJzZSBpdCBhbmQgZ2V0IGFuIGVycm9yLgorCQkgKi8KKwkJaWYgKCFoYXNfc2hhMV9maWxlKGNvbW1pdC0+b2JqZWN0LnNoYTEpKQorCQkJY29tbWl0LT5vYmplY3QucGFyc2VkID0gMTsKKwkJcGFyZW50cyA9IHBhcmVudHMtPm5leHQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBhZGRfcGVuZGluZ19vYmplY3Rfd2l0aF9tb2RlKHN0cnVjdCByZXZfaW5mbyAqcmV2cywgc3RydWN0IG9iamVjdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBtb2RlKQoreworCWlmIChyZXZzLT5ub193YWxrICYmIChvYmotPmZsYWdzICYgVU5JTlRFUkVTVElORykpCisJCWRpZSgib2JqZWN0IHJhbmdlcyBkbyBub3QgbWFrZSBzZW5zZSB3aGVuIG5vdCB3YWxraW5nIHJldmlzaW9ucyIpOworCWlmIChyZXZzLT5yZWZsb2dfaW5mbyAmJiBvYmotPnR5cGUgPT0gT0JKX0NPTU1JVCAmJgorCQkJYWRkX3JlZmxvZ19mb3Jfd2FsayhyZXZzLT5yZWZsb2dfaW5mbywKKwkJCQkoc3RydWN0IGNvbW1pdCAqKW9iaiwgbmFtZSkpCisJCXJldHVybjsKKwlhZGRfb2JqZWN0X2FycmF5X3dpdGhfbW9kZShvYmosIG5hbWUsICZyZXZzLT5wZW5kaW5nLCBtb2RlKTsKK30KKwordm9pZCBhZGRfcGVuZGluZ19vYmplY3Qoc3RydWN0IHJldl9pbmZvICpyZXZzLCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJYWRkX3BlbmRpbmdfb2JqZWN0X3dpdGhfbW9kZShyZXZzLCBvYmosIG5hbWUsIFNfSUZJTlZBTElEKTsKK30KKwordm9pZCBhZGRfaGVhZF90b19wZW5kaW5nKHN0cnVjdCByZXZfaW5mbyAqcmV2cykKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXN0cnVjdCBvYmplY3QgKm9iajsKKwlpZiAoZ2V0X3NoYTEoIkhFQUQiLCBzaGExKSkKKwkJcmV0dXJuOworCW9iaiA9IHBhcnNlX29iamVjdChzaGExKTsKKwlpZiAoIW9iaikKKwkJcmV0dXJuOworCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCBvYmosICJIRUFEIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0ICpnZXRfcmVmZXJlbmNlKHN0cnVjdCByZXZfaW5mbyAqcmV2cywgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBvYmplY3QgKm9iamVjdDsKKworCW9iamVjdCA9IHBhcnNlX29iamVjdChzaGExKTsKKwlpZiAoIW9iamVjdCkKKwkJZGllKCJiYWQgb2JqZWN0ICVzIiwgbmFtZSk7CisJb2JqZWN0LT5mbGFncyB8PSBmbGFnczsKKwlyZXR1cm4gb2JqZWN0OworfQorCitzdGF0aWMgc3RydWN0IGNvbW1pdCAqaGFuZGxlX2NvbW1pdChzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIHN0cnVjdCBvYmplY3QgKm9iamVjdCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gb2JqZWN0LT5mbGFnczsKKworCS8qCisJICogVGFnIG9iamVjdD8gTG9vayB3aGF0IGl0IHBvaW50cyB0by4uCisJICovCisJd2hpbGUgKG9iamVjdC0+dHlwZSA9PSBPQkpfVEFHKSB7CisJCXN0cnVjdCB0YWcgKnRhZyA9IChzdHJ1Y3QgdGFnICopIG9iamVjdDsKKwkJaWYgKHJldnMtPnRhZ19vYmplY3RzICYmICEoZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSkKKwkJCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCBvYmplY3QsIHRhZy0+dGFnKTsKKwkJaWYgKCF0YWctPnRhZ2dlZCkKKwkJCWRpZSgiYmFkIHRhZyIpOworCQlvYmplY3QgPSBwYXJzZV9vYmplY3QodGFnLT50YWdnZWQtPnNoYTEpOworCQlpZiAoIW9iamVjdCkKKwkJCWRpZSgiYmFkIG9iamVjdCAlcyIsIHNoYTFfdG9faGV4KHRhZy0+dGFnZ2VkLT5zaGExKSk7CisJfQorCisJLyoKKwkgKiBDb21taXQgb2JqZWN0PyBKdXN0IHJldHVybiBpdCwgd2UnbGwgZG8gYWxsIHRoZSBjb21wbGV4CisJICogcmVhY2hhYmlsaXR5IGNydWQuCisJICovCisJaWYgKG9iamVjdC0+dHlwZSA9PSBPQkpfQ09NTUlUKSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IChzdHJ1Y3QgY29tbWl0ICopb2JqZWN0OworCQlpZiAocGFyc2VfY29tbWl0KGNvbW1pdCkgPCAwKQorCQkJZGllKCJ1bmFibGUgdG8gcGFyc2UgY29tbWl0ICVzIiwgbmFtZSk7CisJCWlmIChmbGFncyAmIFVOSU5URVJFU1RJTkcpIHsKKwkJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CisJCQltYXJrX3BhcmVudHNfdW5pbnRlcmVzdGluZyhjb21taXQpOworCQkJcmV2cy0+bGltaXRlZCA9IDE7CisJCX0KKwkJcmV0dXJuIGNvbW1pdDsKKwl9CisKKwkvKgorCSAqIFRyZWUgb2JqZWN0PyBFaXRoZXIgbWFyayBpdCB1bmluaXRlcmVzdGluZywgb3IgYWRkIGl0CisJICogdG8gdGhlIGxpc3Qgb2Ygb2JqZWN0cyB0byBsb29rIGF0IGxhdGVyLi4KKwkgKi8KKwlpZiAob2JqZWN0LT50eXBlID09IE9CSl9UUkVFKSB7CisJCXN0cnVjdCB0cmVlICp0cmVlID0gKHN0cnVjdCB0cmVlICopb2JqZWN0OworCQlpZiAoIXJldnMtPnRyZWVfb2JqZWN0cykKKwkJCXJldHVybiBOVUxMOworCQlpZiAoZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSB7CisJCQltYXJrX3RyZWVfdW5pbnRlcmVzdGluZyh0cmVlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCBvYmplY3QsICIiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyoKKwkgKiBCbG9iIG9iamVjdD8gWW91IGtub3cgdGhlIGRyaWxsIGJ5IG5vdy4uCisJICovCisJaWYgKG9iamVjdC0+dHlwZSA9PSBPQkpfQkxPQikgeworCQlzdHJ1Y3QgYmxvYiAqYmxvYiA9IChzdHJ1Y3QgYmxvYiAqKW9iamVjdDsKKwkJaWYgKCFyZXZzLT5ibG9iX29iamVjdHMpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKGZsYWdzICYgVU5JTlRFUkVTVElORykgeworCQkJbWFya19ibG9iX3VuaW50ZXJlc3RpbmcoYmxvYik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlhZGRfcGVuZGluZ19vYmplY3QocmV2cywgb2JqZWN0LCAiIik7CisJCXJldHVybiBOVUxMOworCX0KKwlkaWUoIiVzIGlzIHVua25vd24gb2JqZWN0IiwgbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgZXZlcnlib2R5X3VuaW50ZXJlc3Rpbmcoc3RydWN0IGNvbW1pdF9saXN0ICpvcmlnKQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCA9IG9yaWc7CisJd2hpbGUgKGxpc3QpIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gbGlzdC0+aXRlbTsKKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCisvKgorICogVGhlIGdvYWwgaXMgdG8gZ2V0IFJFVl9UUkVFX05FVyBhcyB0aGUgcmVzdWx0IG9ubHkgaWYgdGhlCisgKiBkaWZmIGNvbnNpc3RzIG9mIGFsbCAnKycgKGFuZCBubyBvdGhlciBjaGFuZ2VzKSwgYW5kCisgKiBSRVZfVFJFRV9ESUZGRVJFTlQgb3RoZXJ3aXNlIChvZiBjb3Vyc2UgaWYgdGhlIHRyZWVzIGFyZQorICogdGhlIHNhbWUgd2Ugd2FudCBSRVZfVFJFRV9TQU1FKS4gIFRoYXQgbWVhbnMgdGhhdCBvbmNlIHdlCisgKiBnZXQgdG8gUkVWX1RSRUVfRElGRkVSRU5ULCB3ZSBkbyBub3QgaGF2ZSB0byBsb29rIGFueSBmdXJ0aGVyLgorICovCitzdGF0aWMgaW50IHRyZWVfZGlmZmVyZW5jZSA9IFJFVl9UUkVFX1NBTUU7CisKK3N0YXRpYyB2b2lkIGZpbGVfYWRkX3JlbW92ZShzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHRpb25zLAorCQkgICAgaW50IGFkZHJlbW92ZSwgdW5zaWduZWQgbW9kZSwKKwkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCSAgICBjb25zdCBjaGFyICpiYXNlLCBjb25zdCBjaGFyICpwYXRoKQoreworCWludCBkaWZmID0gUkVWX1RSRUVfRElGRkVSRU5UOworCisJLyoKKwkgKiBJcyBpdCBhbiBhZGQgb2YgYSBuZXcgZmlsZT8gSXQgbWVhbnMgdGhhdCB0aGUgb2xkIHRyZWUKKwkgKiBkaWRuJ3QgaGF2ZSBpdCBhdCBhbGwsIHNvIHdlIHdpbGwgdHVybiAiUkVWX1RSRUVfU0FNRSIgLT4KKwkgKiAiUkVWX1RSRUVfTkVXIiwgYnV0IGxlYXZlIGFueSAiUkVWX1RSRUVfRElGRkVSRU5UIiBhbG9uZQorCSAqIChhbmQgaWYgaXQgYWxyZWFkeSB3YXMgIlJFVl9UUkVFX05FVyIsIHdlJ2xsIGtlZXAgaXQKKwkgKiAiUkVWX1RSRUVfTkVXIiBvZiBjb3Vyc2UpLgorCSAqLworCWlmIChhZGRyZW1vdmUgPT0gJysnKSB7CisJCWRpZmYgPSB0cmVlX2RpZmZlcmVuY2U7CisJCWlmIChkaWZmICE9IFJFVl9UUkVFX1NBTUUpCisJCQlyZXR1cm47CisJCWRpZmYgPSBSRVZfVFJFRV9ORVc7CisJfQorCXRyZWVfZGlmZmVyZW5jZSA9IGRpZmY7CisJaWYgKHRyZWVfZGlmZmVyZW5jZSA9PSBSRVZfVFJFRV9ESUZGRVJFTlQpCisJCURJRkZfT1BUX1NFVChvcHRpb25zLCBIQVNfQ0hBTkdFUyk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGVfY2hhbmdlKHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMsCisJCSB1bnNpZ25lZCBvbGRfbW9kZSwgdW5zaWduZWQgbmV3X21vZGUsCisJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpvbGRfc2hhMSwKKwkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ld19zaGExLAorCQkgY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwl0cmVlX2RpZmZlcmVuY2UgPSBSRVZfVFJFRV9ESUZGRVJFTlQ7CisJRElGRl9PUFRfU0VUKG9wdGlvbnMsIEhBU19DSEFOR0VTKTsKK30KKworc3RhdGljIGludCByZXZfY29tcGFyZV90cmVlKHN0cnVjdCByZXZfaW5mbyAqcmV2cywgc3RydWN0IHRyZWUgKnQxLCBzdHJ1Y3QgdHJlZSAqdDIpCit7CisJaWYgKCF0MSkKKwkJcmV0dXJuIFJFVl9UUkVFX05FVzsKKwlpZiAoIXQyKQorCQlyZXR1cm4gUkVWX1RSRUVfRElGRkVSRU5UOworCXRyZWVfZGlmZmVyZW5jZSA9IFJFVl9UUkVFX1NBTUU7CisJRElGRl9PUFRfQ0xSKCZyZXZzLT5wcnVuaW5nLCBIQVNfQ0hBTkdFUyk7CisJaWYgKGRpZmZfdHJlZV9zaGExKHQxLT5vYmplY3Quc2hhMSwgdDItPm9iamVjdC5zaGExLCAiIiwKKwkJCSAgICZyZXZzLT5wcnVuaW5nKSA8IDApCisJCXJldHVybiBSRVZfVFJFRV9ESUZGRVJFTlQ7CisJcmV0dXJuIHRyZWVfZGlmZmVyZW5jZTsKK30KKworc3RhdGljIGludCByZXZfc2FtZV90cmVlX2FzX2VtcHR5KHN0cnVjdCByZXZfaW5mbyAqcmV2cywgc3RydWN0IHRyZWUgKnQxKQoreworCWludCByZXR2YWw7CisJdm9pZCAqdHJlZTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJc3RydWN0IHRyZWVfZGVzYyBlbXB0eSwgcmVhbDsKKworCWlmICghdDEpCisJCXJldHVybiAwOworCisJdHJlZSA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKHQxLT5vYmplY3Quc2hhMSwgdHJlZV90eXBlLCAmc2l6ZSwgTlVMTCk7CisJaWYgKCF0cmVlKQorCQlyZXR1cm4gMDsKKwlpbml0X3RyZWVfZGVzYygmcmVhbCwgdHJlZSwgc2l6ZSk7CisJaW5pdF90cmVlX2Rlc2MoJmVtcHR5LCAiIiwgMCk7CisKKwl0cmVlX2RpZmZlcmVuY2UgPSBSRVZfVFJFRV9TQU1FOworCURJRkZfT1BUX0NMUigmcmV2cy0+cHJ1bmluZywgSEFTX0NIQU5HRVMpOworCXJldHZhbCA9IGRpZmZfdHJlZSgmZW1wdHksICZyZWFsLCAiIiwgJnJldnMtPnBydW5pbmcpOworCWZyZWUodHJlZSk7CisKKwlyZXR1cm4gcmV0dmFsID49IDAgJiYgKHRyZWVfZGlmZmVyZW5jZSA9PSBSRVZfVFJFRV9TQU1FKTsKK30KKworc3RhdGljIHZvaWQgdHJ5X3RvX3NpbXBsaWZ5X2NvbW1pdChzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKipwcCwgKnBhcmVudDsKKwlpbnQgdHJlZV9jaGFuZ2VkID0gMCwgdHJlZV9zYW1lID0gMDsKKworCS8qCisJICogSWYgd2UgZG9uJ3QgZG8gcHJ1bmluZywgZXZlcnl0aGluZyBpcyBpbnRlcmVzdGluZworCSAqLworCWlmICghcmV2cy0+cHJ1bmUpCisJCXJldHVybjsKKworCWlmICghY29tbWl0LT50cmVlKQorCQlyZXR1cm47CisKKwlpZiAoIWNvbW1pdC0+cGFyZW50cykgeworCQlpZiAocmV2X3NhbWVfdHJlZV9hc19lbXB0eShyZXZzLCBjb21taXQtPnRyZWUpKQorCQkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gVFJFRVNBTUU7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIE5vcm1hbCBub24tbWVyZ2UgY29tbWl0PyBJZiB3ZSBkb24ndCB3YW50IHRvIG1ha2UgdGhlCisJICogaGlzdG9yeSBkZW5zZSwgd2UgY29uc2lkZXIgaXQgYWx3YXlzIHRvIGJlIGEgY2hhbmdlLi4KKwkgKi8KKwlpZiAoIXJldnMtPmRlbnNlICYmICFjb21taXQtPnBhcmVudHMtPm5leHQpCisJCXJldHVybjsKKworCXBwID0gJmNvbW1pdC0+cGFyZW50czsKKwl3aGlsZSAoKHBhcmVudCA9ICpwcCkgIT0gTlVMTCkgeworCQlzdHJ1Y3QgY29tbWl0ICpwID0gcGFyZW50LT5pdGVtOworCisJCWlmIChwYXJzZV9jb21taXQocCkgPCAwKQorCQkJZGllKCJjYW5ub3Qgc2ltcGxpZnkgY29tbWl0ICVzIChiZWNhdXNlIG9mICVzKSIsCisJCQkgICAgc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSksCisJCQkgICAgc2hhMV90b19oZXgocC0+b2JqZWN0LnNoYTEpKTsKKwkJc3dpdGNoIChyZXZfY29tcGFyZV90cmVlKHJldnMsIHAtPnRyZWUsIGNvbW1pdC0+dHJlZSkpIHsKKwkJY2FzZSBSRVZfVFJFRV9TQU1FOgorCQkJdHJlZV9zYW1lID0gMTsKKwkJCWlmICghcmV2cy0+c2ltcGxpZnlfaGlzdG9yeSB8fCAocC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykpIHsKKwkJCQkvKiBFdmVuIGlmIGEgbWVyZ2Ugd2l0aCBhbiB1bmludGVyZXN0aW5nCisJCQkJICogc2lkZSBicmFuY2ggYnJvdWdodCB0aGUgZW50aXJlIGNoYW5nZQorCQkJCSAqIHdlIGFyZSBpbnRlcmVzdGVkIGluLCB3ZSBkbyBub3Qgd2FudAorCQkJCSAqIHRvIGxvc2UgdGhlIG90aGVyIGJyYW5jaGVzIG9mIHRoaXMKKwkJCQkgKiBtZXJnZSwgc28gd2UganVzdCBrZWVwIGdvaW5nLgorCQkJCSAqLworCQkJCXBwID0gJnBhcmVudC0+bmV4dDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXBhcmVudC0+bmV4dCA9IE5VTEw7CisJCQljb21taXQtPnBhcmVudHMgPSBwYXJlbnQ7CisJCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBUUkVFU0FNRTsKKwkJCXJldHVybjsKKworCQljYXNlIFJFVl9UUkVFX05FVzoKKwkJCWlmIChyZXZzLT5yZW1vdmVfZW1wdHlfdHJlZXMgJiYKKwkJCSAgICByZXZfc2FtZV90cmVlX2FzX2VtcHR5KHJldnMsIHAtPnRyZWUpKSB7CisJCQkJLyogV2UgYXJlIGFkZGluZyBhbGwgdGhlIHNwZWNpZmllZAorCQkJCSAqIHBhdGhzIGZyb20gdGhpcyBwYXJlbnQsIHNvIHRoZQorCQkJCSAqIGhpc3RvcnkgYmV5b25kIHRoaXMgcGFyZW50IGlzIG5vdAorCQkJCSAqIGludGVyZXN0aW5nLiAgUmVtb3ZlIGl0cyBwYXJlbnRzCisJCQkJICogKHRoZXkgYXJlIGdyYW5kcGFyZW50cyBmb3IgdXMpLgorCQkJCSAqIElPVywgd2UgcHJldGVuZCB0aGlzIHBhcmVudCBpcyBhCisJCQkJICogInJvb3QiIGNvbW1pdC4KKwkJCQkgKi8KKwkJCQlpZiAocGFyc2VfY29tbWl0KHApIDwgMCkKKwkJCQkJZGllKCJjYW5ub3Qgc2ltcGxpZnkgY29tbWl0ICVzIChpbnZhbGlkICVzKSIsCisJCQkJCSAgICBzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSwKKwkJCQkJICAgIHNoYTFfdG9faGV4KHAtPm9iamVjdC5zaGExKSk7CisJCQkJcC0+cGFyZW50cyA9IE5VTEw7CisJCQl9CisJCS8qIGZhbGx0aHJvdWdoICovCisJCWNhc2UgUkVWX1RSRUVfRElGRkVSRU5UOgorCQkJdHJlZV9jaGFuZ2VkID0gMTsKKwkJCXBwID0gJnBhcmVudC0+bmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRpZSgiYmFkIHRyZWUgY29tcGFyZSBmb3IgY29tbWl0ICVzIiwgc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCX0KKwlpZiAodHJlZV9jaGFuZ2VkICYmICF0cmVlX3NhbWUpCisJCXJldHVybjsKKwljb21taXQtPm9iamVjdC5mbGFncyB8PSBUUkVFU0FNRTsKK30KKworc3RhdGljIGludCBhZGRfcGFyZW50c190b19saXN0KHN0cnVjdCByZXZfaW5mbyAqcmV2cywgc3RydWN0IGNvbW1pdCAqY29tbWl0LCBzdHJ1Y3QgY29tbWl0X2xpc3QgKipsaXN0KQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50ID0gY29tbWl0LT5wYXJlbnRzOworCXVuc2lnbmVkIGxlZnRfZmxhZzsKKwlpbnQgYWRkLCByZXN0OworCisJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgQURERUQpCisJCXJldHVybiAwOworCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IEFEREVEOworCisJLyoKKwkgKiBJZiB0aGUgY29tbWl0IGlzIHVuaW50ZXJlc3RpbmcsIGRvbid0IHRyeSB0bworCSAqIHBydW5lIHBhcmVudHMgLSB3ZSB3YW50IHRoZSBtYXhpbWFsIHVuaW50ZXJlc3RpbmcKKwkgKiBzZXQuCisJICoKKwkgKiBOb3JtYWxseSB3ZSBoYXZlbid0IHBhcnNlZCB0aGUgcGFyZW50CisJICogeWV0LCBzbyB3ZSB3b24ndCBoYXZlIGEgcGFyZW50IG9mIGEgcGFyZW50CisJICogaGVyZS4gSG93ZXZlciwgaXQgbWF5IHR1cm4gb3V0IHRoYXQgd2UndmUKKwkgKiByZWFjaGVkIHRoaXMgY29tbWl0IHNvbWUgb3RoZXIgd2F5ICh3aGVyZSBpdAorCSAqIHdhc24ndCB1bmludGVyZXN0aW5nKSwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkCisJICogdG8gbWFyayBpdHMgcGFyZW50cyByZWN1cnNpdmVseSB0b28uLgorCSAqLworCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpIHsKKwkJd2hpbGUgKHBhcmVudCkgeworCQkJc3RydWN0IGNvbW1pdCAqcCA9IHBhcmVudC0+aXRlbTsKKwkJCXBhcmVudCA9IHBhcmVudC0+bmV4dDsKKwkJCWlmIChwYXJzZV9jb21taXQocCkgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJCXAtPm9iamVjdC5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworCQkJaWYgKHAtPnBhcmVudHMpCisJCQkJbWFya19wYXJlbnRzX3VuaW50ZXJlc3RpbmcocCk7CisJCQlpZiAocC0+b2JqZWN0LmZsYWdzICYgU0VFTikKKwkJCQljb250aW51ZTsKKwkJCXAtPm9iamVjdC5mbGFncyB8PSBTRUVOOworCQkJaW5zZXJ0X2J5X2RhdGUocCwgbGlzdCk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBPaywgdGhlIGNvbW1pdCB3YXNuJ3QgdW5pbnRlcmVzdGluZy4gVHJ5IHRvCisJICogc2ltcGxpZnkgdGhlIGNvbW1pdCBoaXN0b3J5IGFuZCBmaW5kIHRoZSBwYXJlbnQKKwkgKiB0aGF0IGhhcyBubyBkaWZmZXJlbmNlcyBpbiB0aGUgcGF0aCBzZXQgaWYgb25lIGV4aXN0cy4KKwkgKi8KKwl0cnlfdG9fc2ltcGxpZnlfY29tbWl0KHJldnMsIGNvbW1pdCk7CisKKwlpZiAocmV2cy0+bm9fd2FsaykKKwkJcmV0dXJuIDA7CisKKwlsZWZ0X2ZsYWcgPSAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBTWU1NRVRSSUNfTEVGVCk7CisKKwlyZXN0ID0gIXJldnMtPmZpcnN0X3BhcmVudF9vbmx5OworCWZvciAocGFyZW50ID0gY29tbWl0LT5wYXJlbnRzLCBhZGQgPSAxOyBwYXJlbnQ7IGFkZCA9IHJlc3QpIHsKKwkJc3RydWN0IGNvbW1pdCAqcCA9IHBhcmVudC0+aXRlbTsKKworCQlwYXJlbnQgPSBwYXJlbnQtPm5leHQ7CisJCWlmIChwYXJzZV9jb21taXQocCkgPCAwKQorCQkJcmV0dXJuIC0xOworCQlwLT5vYmplY3QuZmxhZ3MgfD0gbGVmdF9mbGFnOworCQlpZiAocC0+b2JqZWN0LmZsYWdzICYgU0VFTikKKwkJCWNvbnRpbnVlOworCQlwLT5vYmplY3QuZmxhZ3MgfD0gU0VFTjsKKwkJaWYgKGFkZCkKKwkJCWluc2VydF9ieV9kYXRlKHAsIGxpc3QpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2hlcnJ5X3BpY2tfbGlzdChzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3QsIHN0cnVjdCByZXZfaW5mbyAqcmV2cykKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnA7CisJaW50IGxlZnRfY291bnQgPSAwLCByaWdodF9jb3VudCA9IDA7CisJaW50IGxlZnRfZmlyc3Q7CisJc3RydWN0IHBhdGNoX2lkcyBpZHM7CisKKwkvKiBGaXJzdCBjb3VudCB0aGUgY29tbWl0cyBvbiB0aGUgbGVmdCBhbmQgb24gdGhlIHJpZ2h0ICovCisJZm9yIChwID0gbGlzdDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gcC0+aXRlbTsKKwkJdW5zaWduZWQgZmxhZ3MgPSBjb21taXQtPm9iamVjdC5mbGFnczsKKwkJaWYgKGZsYWdzICYgQk9VTkRBUlkpCisJCQk7CisJCWVsc2UgaWYgKGZsYWdzICYgU1lNTUVUUklDX0xFRlQpCisJCQlsZWZ0X2NvdW50Kys7CisJCWVsc2UKKwkJCXJpZ2h0X2NvdW50Kys7CisJfQorCisJbGVmdF9maXJzdCA9IGxlZnRfY291bnQgPCByaWdodF9jb3VudDsKKwlpbml0X3BhdGNoX2lkcygmaWRzKTsKKwlpZiAocmV2cy0+ZGlmZm9wdC5ucl9wYXRocykgeworCQlpZHMuZGlmZm9wdHMubnJfcGF0aHMgPSByZXZzLT5kaWZmb3B0Lm5yX3BhdGhzOworCQlpZHMuZGlmZm9wdHMucGF0aHMgPSByZXZzLT5kaWZmb3B0LnBhdGhzOworCQlpZHMuZGlmZm9wdHMucGF0aGxlbnMgPSByZXZzLT5kaWZmb3B0LnBhdGhsZW5zOworCX0KKworCS8qIENvbXB1dGUgcGF0Y2gtaWRzIGZvciBvbmUgc2lkZSAqLworCWZvciAocCA9IGxpc3Q7IHA7IHAgPSBwLT5uZXh0KSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IHAtPml0ZW07CisJCXVuc2lnbmVkIGZsYWdzID0gY29tbWl0LT5vYmplY3QuZmxhZ3M7CisKKwkJaWYgKGZsYWdzICYgQk9VTkRBUlkpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSBmZXdlciBsZWZ0LCBsZWZ0X2ZpcnN0IGlzIHNldCBhbmQgd2Ugb21pdAorCQkgKiBjb21taXRzIG9uIHRoZSByaWdodCBicmFuY2ggaW4gdGhpcyBsb29wLiAgSWYgd2UgaGF2ZQorCQkgKiBmZXdlciByaWdodCwgd2Ugc2tpcCB0aGUgbGVmdCBvbmVzLgorCQkgKi8KKwkJaWYgKGxlZnRfZmlyc3QgIT0gISEoZmxhZ3MgJiBTWU1NRVRSSUNfTEVGVCkpCisJCQljb250aW51ZTsKKwkJY29tbWl0LT51dGlsID0gYWRkX2NvbW1pdF9wYXRjaF9pZChjb21taXQsICZpZHMpOworCX0KKworCS8qIENoZWNrIHRoZSBvdGhlciBzaWRlICovCisJZm9yIChwID0gbGlzdDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gcC0+aXRlbTsKKwkJc3RydWN0IHBhdGNoX2lkICppZDsKKwkJdW5zaWduZWQgZmxhZ3MgPSBjb21taXQtPm9iamVjdC5mbGFnczsKKworCQlpZiAoZmxhZ3MgJiBCT1VOREFSWSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIGZld2VyIGxlZnQsIGxlZnRfZmlyc3QgaXMgc2V0IGFuZCB3ZSBvbWl0CisJCSAqIGNvbW1pdHMgb24gdGhlIGxlZnQgYnJhbmNoIGluIHRoaXMgbG9vcC4KKwkJICovCisJCWlmIChsZWZ0X2ZpcnN0ID09ICEhKGZsYWdzICYgU1lNTUVUUklDX0xFRlQpKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogSGF2ZSB3ZSBzZWVuIHRoZSBzYW1lIHBhdGNoIGlkPworCQkgKi8KKwkJaWQgPSBoYXNfY29tbWl0X3BhdGNoX2lkKGNvbW1pdCwgJmlkcyk7CisJCWlmICghaWQpCisJCQljb250aW51ZTsKKwkJaWQtPnNlZW4gPSAxOworCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBTSE9XTjsKKwl9CisKKwkvKiBOb3cgY2hlY2sgdGhlIG9yaWdpbmFsIHNpZGUgZm9yIHNlZW4gb25lcyAqLworCWZvciAocCA9IGxpc3Q7IHA7IHAgPSBwLT5uZXh0KSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IHAtPml0ZW07CisJCXN0cnVjdCBwYXRjaF9pZCAqZW50OworCisJCWVudCA9IGNvbW1pdC0+dXRpbDsKKwkJaWYgKCFlbnQpCisJCQljb250aW51ZTsKKwkJaWYgKGVudC0+c2VlbikKKwkJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFNIT1dOOworCQljb21taXQtPnV0aWwgPSBOVUxMOworCX0KKworCWZyZWVfcGF0Y2hfaWRzKCZpZHMpOworfQorCisvKiBIb3cgbWFueSBleHRyYSB1bmludGVyZXN0aW5nIGNvbW1pdHMgd2Ugd2FudCB0byBzZWUuLiAqLworI2RlZmluZSBTTE9QIDUKKworc3RhdGljIGludCBzdGlsbF9pbnRlcmVzdGluZyhzdHJ1Y3QgY29tbWl0X2xpc3QgKnNyYywgdW5zaWduZWQgbG9uZyBkYXRlLCBpbnQgc2xvcCkKK3sKKwkvKgorCSAqIE5vIHNvdXJjZSBsaXN0IGF0IGFsbD8gV2UncmUgZGVmaW5pdGVseSBkb25lLi4KKwkgKi8KKwlpZiAoIXNyYykKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIERvZXMgdGhlIGRlc3RpbmF0aW9uIGxpc3QgY29udGFpbiBlbnRyaWVzIHdpdGggYSBkYXRlCisJICogYmVmb3JlIHRoZSBzb3VyY2UgbGlzdD8gRGVmaW5pdGVseSBfbm90XyBkb25lLgorCSAqLworCWlmIChkYXRlIDwgc3JjLT5pdGVtLT5kYXRlKQorCQlyZXR1cm4gU0xPUDsKKworCS8qCisJICogRG9lcyB0aGUgc291cmNlIGxpc3Qgc3RpbGwgaGF2ZSBpbnRlcmVzdGluZyBjb21taXRzIGluCisJICogaXQ/IERlZmluaXRlbHkgbm90IGRvbmUuLgorCSAqLworCWlmICghZXZlcnlib2R5X3VuaW50ZXJlc3Rpbmcoc3JjKSkKKwkJcmV0dXJuIFNMT1A7CisKKwkvKiBPaywgd2UncmUgY2xvc2luZyBpbi4uICovCisJcmV0dXJuIHNsb3AtMTsKK30KKworc3RhdGljIGludCBsaW1pdF9saXN0KHN0cnVjdCByZXZfaW5mbyAqcmV2cykKK3sKKwlpbnQgc2xvcCA9IFNMT1A7CisJdW5zaWduZWQgbG9uZyBkYXRlID0gfjB1bDsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3QgPSByZXZzLT5jb21taXRzOworCXN0cnVjdCBjb21taXRfbGlzdCAqbmV3bGlzdCA9IE5VTEw7CisJc3RydWN0IGNvbW1pdF9saXN0ICoqcCA9ICZuZXdsaXN0OworCisJd2hpbGUgKGxpc3QpIHsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICplbnRyeSA9IGxpc3Q7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxpc3QtPml0ZW07CisJCXN0cnVjdCBvYmplY3QgKm9iaiA9ICZjb21taXQtPm9iamVjdDsKKwkJc2hvd19lYXJseV9vdXRwdXRfZm5fdCBzaG93OworCisJCWxpc3QgPSBsaXN0LT5uZXh0OworCQlmcmVlKGVudHJ5KTsKKworCQlpZiAocmV2cy0+bWF4X2FnZSAhPSAtMSAmJiAoY29tbWl0LT5kYXRlIDwgcmV2cy0+bWF4X2FnZSkpCisJCQlvYmotPmZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CisJCWlmIChhZGRfcGFyZW50c190b19saXN0KHJldnMsIGNvbW1pdCwgJmxpc3QpIDwgMCkKKwkJCXJldHVybiAtMTsKKwkJaWYgKG9iai0+ZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSB7CisJCQltYXJrX3BhcmVudHNfdW5pbnRlcmVzdGluZyhjb21taXQpOworCQkJaWYgKHJldnMtPnNob3dfYWxsKQorCQkJCXAgPSAmY29tbWl0X2xpc3RfaW5zZXJ0KGNvbW1pdCwgcCktPm5leHQ7CisJCQlzbG9wID0gc3RpbGxfaW50ZXJlc3RpbmcobGlzdCwgZGF0ZSwgc2xvcCk7CisJCQlpZiAoc2xvcCkKKwkJCQljb250aW51ZTsKKwkJCS8qIElmIHNob3dpbmcgYWxsLCBhZGQgdGhlIHdob2xlIHBlbmRpbmcgbGlzdCB0byB0aGUgZW5kICovCisJCQlpZiAocmV2cy0+c2hvd19hbGwpCisJCQkJKnAgPSBsaXN0OworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJldnMtPm1pbl9hZ2UgIT0gLTEgJiYgKGNvbW1pdC0+ZGF0ZSA+IHJldnMtPm1pbl9hZ2UpKQorCQkJY29udGludWU7CisJCWRhdGUgPSBjb21taXQtPmRhdGU7CisJCXAgPSAmY29tbWl0X2xpc3RfaW5zZXJ0KGNvbW1pdCwgcCktPm5leHQ7CisKKwkJc2hvdyA9IHNob3dfZWFybHlfb3V0cHV0OworCQlpZiAoIXNob3cpCisJCQljb250aW51ZTsKKworCQlzaG93KHJldnMsIG5ld2xpc3QpOworCQlzaG93X2Vhcmx5X291dHB1dCA9IE5VTEw7CisJfQorCWlmIChyZXZzLT5jaGVycnlfcGljaykKKwkJY2hlcnJ5X3BpY2tfbGlzdChuZXdsaXN0LCByZXZzKTsKKworCXJldnMtPmNvbW1pdHMgPSBuZXdsaXN0OworCXJldHVybiAwOworfQorCitzdHJ1Y3QgYWxsX3JlZnNfY2IgeworCWludCBhbGxfZmxhZ3M7CisJaW50IHdhcm5lZF9iYWRfcmVmbG9nOworCXN0cnVjdCByZXZfaW5mbyAqYWxsX3JldnM7CisJY29uc3QgY2hhciAqbmFtZV9mb3JfZXJyb3Jtc2c7Cit9OworCitzdGF0aWMgaW50IGhhbmRsZV9vbmVfcmVmKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFnLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCBhbGxfcmVmc19jYiAqY2IgPSBjYl9kYXRhOworCXN0cnVjdCBvYmplY3QgKm9iamVjdCA9IGdldF9yZWZlcmVuY2UoY2ItPmFsbF9yZXZzLCBwYXRoLCBzaGExLAorCQkJCQkgICAgICBjYi0+YWxsX2ZsYWdzKTsKKwlhZGRfcGVuZGluZ19vYmplY3QoY2ItPmFsbF9yZXZzLCBvYmplY3QsIHBhdGgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfcmVmcyhzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIHVuc2lnbmVkIGZsYWdzLAorCQlpbnQgKCpmb3JfZWFjaCkoZWFjaF9yZWZfZm4sIHZvaWQgKikpCit7CisJc3RydWN0IGFsbF9yZWZzX2NiIGNiOworCWNiLmFsbF9yZXZzID0gcmV2czsKKwljYi5hbGxfZmxhZ3MgPSBmbGFnczsKKwlmb3JfZWFjaChoYW5kbGVfb25lX3JlZiwgJmNiKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX29uZV9yZWZsb2dfY29tbWl0KHVuc2lnbmVkIGNoYXIgKnNoYTEsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IGFsbF9yZWZzX2NiICpjYiA9IGNiX2RhdGE7CisJaWYgKCFpc19udWxsX3NoYTEoc2hhMSkpIHsKKwkJc3RydWN0IG9iamVjdCAqbyA9IHBhcnNlX29iamVjdChzaGExKTsKKwkJaWYgKG8pIHsKKwkJCW8tPmZsYWdzIHw9IGNiLT5hbGxfZmxhZ3M7CisJCQlhZGRfcGVuZGluZ19vYmplY3QoY2ItPmFsbF9yZXZzLCBvLCAiIik7CisJCX0KKwkJZWxzZSBpZiAoIWNiLT53YXJuZWRfYmFkX3JlZmxvZykgeworCQkJd2FybmluZygicmVmbG9nIG9mICclcycgcmVmZXJlbmNlcyBwcnVuZWQgY29tbWl0cyIsCisJCQkJY2ItPm5hbWVfZm9yX2Vycm9ybXNnKTsKKwkJCWNiLT53YXJuZWRfYmFkX3JlZmxvZyA9IDE7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX29uZV9yZWZsb2dfZW50KHVuc2lnbmVkIGNoYXIgKm9zaGExLCB1bnNpZ25lZCBjaGFyICpuc2hhMSwKKwkJY29uc3QgY2hhciAqZW1haWwsIHVuc2lnbmVkIGxvbmcgdGltZXN0YW1wLCBpbnQgdHosCisJCWNvbnN0IGNoYXIgKm1lc3NhZ2UsIHZvaWQgKmNiX2RhdGEpCit7CisJaGFuZGxlX29uZV9yZWZsb2dfY29tbWl0KG9zaGExLCBjYl9kYXRhKTsKKwloYW5kbGVfb25lX3JlZmxvZ19jb21taXQobnNoYTEsIGNiX2RhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9vbmVfcmVmbG9nKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFnLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCBhbGxfcmVmc19jYiAqY2IgPSBjYl9kYXRhOworCWNiLT53YXJuZWRfYmFkX3JlZmxvZyA9IDA7CisJY2ItPm5hbWVfZm9yX2Vycm9ybXNnID0gcGF0aDsKKwlmb3JfZWFjaF9yZWZsb2dfZW50KHBhdGgsIGhhbmRsZV9vbmVfcmVmbG9nX2VudCwgY2JfZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9yZWZsb2coc3RydWN0IHJldl9pbmZvICpyZXZzLCB1bnNpZ25lZCBmbGFncykKK3sKKwlzdHJ1Y3QgYWxsX3JlZnNfY2IgY2I7CisJY2IuYWxsX3JldnMgPSByZXZzOworCWNiLmFsbF9mbGFncyA9IGZsYWdzOworCWZvcl9lYWNoX3JlZmxvZyhoYW5kbGVfb25lX3JlZmxvZywgJmNiKTsKK30KKworc3RhdGljIGludCBhZGRfcGFyZW50c19vbmx5KHN0cnVjdCByZXZfaW5mbyAqcmV2cywgY29uc3QgY2hhciAqYXJnLCBpbnQgZmxhZ3MpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3Qgb2JqZWN0ICppdDsKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCisJaWYgKCphcmcgPT0gJ14nKSB7CisJCWZsYWdzIF49IFVOSU5URVJFU1RJTkc7CisJCWFyZysrOworCX0KKwlpZiAoZ2V0X3NoYTEoYXJnLCBzaGExKSkKKwkJcmV0dXJuIDA7CisJd2hpbGUgKDEpIHsKKwkJaXQgPSBnZXRfcmVmZXJlbmNlKHJldnMsIGFyZywgc2hhMSwgMCk7CisJCWlmIChpdC0+dHlwZSAhPSBPQkpfVEFHKQorCQkJYnJlYWs7CisJCWlmICghKChzdHJ1Y3QgdGFnKilpdCktPnRhZ2dlZCkKKwkJCXJldHVybiAwOworCQloYXNoY3B5KHNoYTEsICgoc3RydWN0IHRhZyopaXQpLT50YWdnZWQtPnNoYTEpOworCX0KKwlpZiAoaXQtPnR5cGUgIT0gT0JKX0NPTU1JVCkKKwkJcmV0dXJuIDA7CisJY29tbWl0ID0gKHN0cnVjdCBjb21taXQgKilpdDsKKwlmb3IgKHBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7IHBhcmVudHM7IHBhcmVudHMgPSBwYXJlbnRzLT5uZXh0KSB7CisJCWl0ID0gJnBhcmVudHMtPml0ZW0tPm9iamVjdDsKKwkJaXQtPmZsYWdzIHw9IGZsYWdzOworCQlhZGRfcGVuZGluZ19vYmplY3QocmV2cywgaXQsIGFyZyk7CisJfQorCXJldHVybiAxOworfQorCit2b2lkIGluaXRfcmV2aXNpb25zKHN0cnVjdCByZXZfaW5mbyAqcmV2cywgY29uc3QgY2hhciAqcHJlZml4KQoreworCW1lbXNldChyZXZzLCAwLCBzaXplb2YoKnJldnMpKTsKKworCXJldnMtPmFiYnJldiA9IERFRkFVTFRfQUJCUkVWOworCXJldnMtPmlnbm9yZV9tZXJnZXMgPSAxOworCXJldnMtPnNpbXBsaWZ5X2hpc3RvcnkgPSAxOworCURJRkZfT1BUX1NFVCgmcmV2cy0+cHJ1bmluZywgUkVDVVJTSVZFKTsKKwlESUZGX09QVF9TRVQoJnJldnMtPnBydW5pbmcsIFFVSUVUKTsKKwlyZXZzLT5wcnVuaW5nLmFkZF9yZW1vdmUgPSBmaWxlX2FkZF9yZW1vdmU7CisJcmV2cy0+cHJ1bmluZy5jaGFuZ2UgPSBmaWxlX2NoYW5nZTsKKwlyZXZzLT5saWZvID0gMTsKKwlyZXZzLT5kZW5zZSA9IDE7CisJcmV2cy0+cHJlZml4ID0gcHJlZml4OworCXJldnMtPm1heF9hZ2UgPSAtMTsKKwlyZXZzLT5taW5fYWdlID0gLTE7CisJcmV2cy0+c2tpcF9jb3VudCA9IC0xOworCXJldnMtPm1heF9jb3VudCA9IC0xOworCisJcmV2cy0+Y29tbWl0X2Zvcm1hdCA9IENNSVRfRk1UX0RFRkFVTFQ7CisKKwlkaWZmX3NldHVwKCZyZXZzLT5kaWZmb3B0KTsKKwlpZiAocHJlZml4ICYmICFyZXZzLT5kaWZmb3B0LnByZWZpeCkgeworCQlyZXZzLT5kaWZmb3B0LnByZWZpeCA9IHByZWZpeDsKKwkJcmV2cy0+ZGlmZm9wdC5wcmVmaXhfbGVuZ3RoID0gc3RybGVuKHByZWZpeCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhZGRfcGVuZGluZ19jb21taXRfbGlzdChzdHJ1Y3QgcmV2X2luZm8gKnJldnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tbWl0X2xpc3QgKmNvbW1pdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXdoaWxlIChjb21taXRfbGlzdCkgeworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmplY3QgPSAmY29tbWl0X2xpc3QtPml0ZW0tPm9iamVjdDsKKwkJb2JqZWN0LT5mbGFncyB8PSBmbGFnczsKKwkJYWRkX3BlbmRpbmdfb2JqZWN0KHJldnMsIG9iamVjdCwgc2hhMV90b19oZXgob2JqZWN0LT5zaGExKSk7CisJCWNvbW1pdF9saXN0ID0gY29tbWl0X2xpc3QtPm5leHQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcmVwYXJlX3Nob3dfbWVyZ2Uoc3RydWN0IHJldl9pbmZvICpyZXZzKQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqYmFzZXM7CisJc3RydWN0IGNvbW1pdCAqaGVhZCwgKm90aGVyOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY29uc3QgY2hhciAqKnBydW5lID0gTlVMTDsKKwlpbnQgaSwgcHJ1bmVfbnVtID0gMTsgLyogY291bnRpbmcgdGVybWluYXRpbmcgTlVMTCAqLworCisJaWYgKGdldF9zaGExKCJIRUFEIiwgc2hhMSkgfHwgIShoZWFkID0gbG9va3VwX2NvbW1pdChzaGExKSkpCisJCWRpZSgiLS1tZXJnZSB3aXRob3V0IEhFQUQ/Iik7CisJaWYgKGdldF9zaGExKCJNRVJHRV9IRUFEIiwgc2hhMSkgfHwgIShvdGhlciA9IGxvb2t1cF9jb21taXQoc2hhMSkpKQorCQlkaWUoIi0tbWVyZ2Ugd2l0aG91dCBNRVJHRV9IRUFEPyIpOworCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCAmaGVhZC0+b2JqZWN0LCAiSEVBRCIpOworCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCAmb3RoZXItPm9iamVjdCwgIk1FUkdFX0hFQUQiKTsKKwliYXNlcyA9IGdldF9tZXJnZV9iYXNlcyhoZWFkLCBvdGhlciwgMSk7CisJYWRkX3BlbmRpbmdfY29tbWl0X2xpc3QocmV2cywgYmFzZXMsIFVOSU5URVJFU1RJTkcpOworCWZyZWVfY29tbWl0X2xpc3QoYmFzZXMpOworCWhlYWQtPm9iamVjdC5mbGFncyB8PSBTWU1NRVRSSUNfTEVGVDsKKworCWlmICghYWN0aXZlX25yKQorCQlyZWFkX2NhY2hlKCk7CisJZm9yIChpID0gMDsgaSA8IGFjdGl2ZV9ucjsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCWlmICghY2Vfc3RhZ2UoY2UpKQorCQkJY29udGludWU7CisJCWlmIChjZV9wYXRoX21hdGNoKGNlLCByZXZzLT5wcnVuZV9kYXRhKSkgeworCQkJcHJ1bmVfbnVtKys7CisJCQlwcnVuZSA9IHhyZWFsbG9jKHBydW5lLCBzaXplb2YoKnBydW5lKSAqIHBydW5lX251bSk7CisJCQlwcnVuZVtwcnVuZV9udW0tMl0gPSBjZS0+bmFtZTsKKwkJCXBydW5lW3BydW5lX251bS0xXSA9IE5VTEw7CisJCX0KKwkJd2hpbGUgKChpKzEgPCBhY3RpdmVfbnIpICYmCisJCSAgICAgICBjZV9zYW1lX25hbWUoY2UsIGFjdGl2ZV9jYWNoZVtpKzFdKSkKKwkJCWkrKzsKKwl9CisJcmV2cy0+cHJ1bmVfZGF0YSA9IHBydW5lOworCXJldnMtPmxpbWl0ZWQgPSAxOworfQorCitpbnQgaGFuZGxlX3JldmlzaW9uX2FyZyhjb25zdCBjaGFyICphcmcsIHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJCWludCBmbGFncywKKwkJCWludCBjYW50X2JlX2ZpbGVuYW1lKQoreworCXVuc2lnbmVkIG1vZGU7CisJY2hhciAqZG90ZG90OworCXN0cnVjdCBvYmplY3QgKm9iamVjdDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWludCBsb2NhbF9mbGFnczsKKworCWRvdGRvdCA9IHN0cnN0cihhcmcsICIuLiIpOworCWlmIChkb3Rkb3QpIHsKKwkJdW5zaWduZWQgY2hhciBmcm9tX3NoYTFbMjBdOworCQljb25zdCBjaGFyICpuZXh0ID0gZG90ZG90ICsgMjsKKwkJY29uc3QgY2hhciAqdGhpcyA9IGFyZzsKKwkJaW50IHN5bW1ldHJpYyA9ICpuZXh0ID09ICcuJzsKKwkJdW5zaWduZWQgaW50IGZsYWdzX2V4Y2x1ZGUgPSBmbGFncyBeIFVOSU5URVJFU1RJTkc7CisKKwkJKmRvdGRvdCA9IDA7CisJCW5leHQgKz0gc3ltbWV0cmljOworCisJCWlmICghKm5leHQpCisJCQluZXh0ID0gIkhFQUQiOworCQlpZiAoZG90ZG90ID09IGFyZykKKwkJCXRoaXMgPSAiSEVBRCI7CisJCWlmICghZ2V0X3NoYTEodGhpcywgZnJvbV9zaGExKSAmJgorCQkgICAgIWdldF9zaGExKG5leHQsIHNoYTEpKSB7CisJCQlzdHJ1Y3QgY29tbWl0ICphLCAqYjsKKwkJCXN0cnVjdCBjb21taXRfbGlzdCAqZXhjbHVkZTsKKworCQkJYSA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKGZyb21fc2hhMSk7CisJCQliID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2Uoc2hhMSk7CisJCQlpZiAoIWEgfHwgIWIpIHsKKwkJCQlkaWUoc3ltbWV0cmljID8KKwkJCQkgICAgIkludmFsaWQgc3ltbWV0cmljIGRpZmZlcmVuY2UgZXhwcmVzc2lvbiAlcy4uLiVzIiA6CisJCQkJICAgICJJbnZhbGlkIHJldmlzaW9uIHJhbmdlICVzLi4lcyIsCisJCQkJICAgIGFyZywgbmV4dCk7CisJCQl9CisKKwkJCWlmICghY2FudF9iZV9maWxlbmFtZSkgeworCQkJCSpkb3Rkb3QgPSAnLic7CisJCQkJdmVyaWZ5X25vbl9maWxlbmFtZShyZXZzLT5wcmVmaXgsIGFyZyk7CisJCQl9CisKKwkJCWlmIChzeW1tZXRyaWMpIHsKKwkJCQlleGNsdWRlID0gZ2V0X21lcmdlX2Jhc2VzKGEsIGIsIDEpOworCQkJCWFkZF9wZW5kaW5nX2NvbW1pdF9saXN0KHJldnMsIGV4Y2x1ZGUsCisJCQkJCQkJZmxhZ3NfZXhjbHVkZSk7CisJCQkJZnJlZV9jb21taXRfbGlzdChleGNsdWRlKTsKKwkJCQlhLT5vYmplY3QuZmxhZ3MgfD0gZmxhZ3MgfCBTWU1NRVRSSUNfTEVGVDsKKwkJCX0gZWxzZQorCQkJCWEtPm9iamVjdC5mbGFncyB8PSBmbGFnc19leGNsdWRlOworCQkJYi0+b2JqZWN0LmZsYWdzIHw9IGZsYWdzOworCQkJYWRkX3BlbmRpbmdfb2JqZWN0KHJldnMsICZhLT5vYmplY3QsIHRoaXMpOworCQkJYWRkX3BlbmRpbmdfb2JqZWN0KHJldnMsICZiLT5vYmplY3QsIG5leHQpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJKmRvdGRvdCA9ICcuJzsKKwl9CisJZG90ZG90ID0gc3Ryc3RyKGFyZywgIl5AIik7CisJaWYgKGRvdGRvdCAmJiAhZG90ZG90WzJdKSB7CisJCSpkb3Rkb3QgPSAwOworCQlpZiAoYWRkX3BhcmVudHNfb25seShyZXZzLCBhcmcsIGZsYWdzKSkKKwkJCXJldHVybiAwOworCQkqZG90ZG90ID0gJ14nOworCX0KKwlkb3Rkb3QgPSBzdHJzdHIoYXJnLCAiXiEiKTsKKwlpZiAoZG90ZG90ICYmICFkb3Rkb3RbMl0pIHsKKwkJKmRvdGRvdCA9IDA7CisJCWlmICghYWRkX3BhcmVudHNfb25seShyZXZzLCBhcmcsIGZsYWdzIF4gVU5JTlRFUkVTVElORykpCisJCQkqZG90ZG90ID0gJ14nOworCX0KKworCWxvY2FsX2ZsYWdzID0gMDsKKwlpZiAoKmFyZyA9PSAnXicpIHsKKwkJbG9jYWxfZmxhZ3MgPSBVTklOVEVSRVNUSU5HOworCQlhcmcrKzsKKwl9CisJaWYgKGdldF9zaGExX3dpdGhfbW9kZShhcmcsIHNoYTEsICZtb2RlKSkKKwkJcmV0dXJuIC0xOworCWlmICghY2FudF9iZV9maWxlbmFtZSkKKwkJdmVyaWZ5X25vbl9maWxlbmFtZShyZXZzLT5wcmVmaXgsIGFyZyk7CisJb2JqZWN0ID0gZ2V0X3JlZmVyZW5jZShyZXZzLCBhcmcsIHNoYTEsIGZsYWdzIF4gbG9jYWxfZmxhZ3MpOworCWFkZF9wZW5kaW5nX29iamVjdF93aXRoX21vZGUocmV2cywgb2JqZWN0LCBhcmcsIG1vZGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhZGRfZ3JlcChzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIGNvbnN0IGNoYXIgKnB0biwgZW51bSBncmVwX3BhdF90b2tlbiB3aGF0KQoreworCWlmICghcmV2cy0+Z3JlcF9maWx0ZXIpIHsKKwkJc3RydWN0IGdyZXBfb3B0ICpvcHQgPSB4Y2FsbG9jKDEsIHNpemVvZigqb3B0KSk7CisJCW9wdC0+c3RhdHVzX29ubHkgPSAxOworCQlvcHQtPnBhdHRlcm5fdGFpbCA9ICYob3B0LT5wYXR0ZXJuX2xpc3QpOworCQlvcHQtPnJlZ2ZsYWdzID0gUkVHX05FV0xJTkU7CisJCXJldnMtPmdyZXBfZmlsdGVyID0gb3B0OworCX0KKwlhcHBlbmRfZ3JlcF9wYXR0ZXJuKHJldnMtPmdyZXBfZmlsdGVyLCBwdG4sCisJCQkgICAgImNvbW1hbmQgbGluZSIsIDAsIHdoYXQpOworfQorCitzdGF0aWMgdm9pZCBhZGRfaGVhZGVyX2dyZXAoc3RydWN0IHJldl9pbmZvICpyZXZzLCBjb25zdCBjaGFyICpmaWVsZCwgY29uc3QgY2hhciAqcGF0dGVybikKK3sKKwljaGFyICpwYXQ7CisJY29uc3QgY2hhciAqcHJlZml4OworCWludCBwYXRsZW4sIGZsZGxlbjsKKworCWZsZGxlbiA9IHN0cmxlbihmaWVsZCk7CisJcGF0bGVuID0gc3RybGVuKHBhdHRlcm4pOworCXBhdCA9IHhtYWxsb2MocGF0bGVuICsgZmxkbGVuICsgMTApOworCXByZWZpeCA9ICIuKiI7CisJaWYgKCpwYXR0ZXJuID09ICdeJykgeworCQlwcmVmaXggPSAiIjsKKwkJcGF0dGVybisrOworCX0KKwlzcHJpbnRmKHBhdCwgIl4lcyAlcyVzIiwgZmllbGQsIHByZWZpeCwgcGF0dGVybik7CisJYWRkX2dyZXAocmV2cywgcGF0LCBHUkVQX1BBVFRFUk5fSEVBRCk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9tZXNzYWdlX2dyZXAoc3RydWN0IHJldl9pbmZvICpyZXZzLCBjb25zdCBjaGFyICpwYXR0ZXJuKQoreworCWFkZF9ncmVwKHJldnMsIHBhdHRlcm4sIEdSRVBfUEFUVEVSTl9CT0RZKTsKK30KKworc3RhdGljIHZvaWQgYWRkX2lnbm9yZV9wYWNrZWQoc3RydWN0IHJldl9pbmZvICpyZXZzLCBjb25zdCBjaGFyICpuYW1lKQoreworCWludCBudW0gPSArK3JldnMtPm51bV9pZ25vcmVfcGFja2VkOworCisJcmV2cy0+aWdub3JlX3BhY2tlZCA9IHhyZWFsbG9jKHJldnMtPmlnbm9yZV9wYWNrZWQsCisJCQkJICAgICAgIHNpemVvZihjb25zdCBjaGFyICoqKSAqIChudW0gKyAxKSk7CisJcmV2cy0+aWdub3JlX3BhY2tlZFtudW0tMV0gPSBuYW1lOworCXJldnMtPmlnbm9yZV9wYWNrZWRbbnVtXSA9IE5VTEw7Cit9CisKKy8qCisgKiBQYXJzZSByZXZpc2lvbiBpbmZvcm1hdGlvbiwgZmlsbGluZyBpbiB0aGUgInJldl9pbmZvIiBzdHJ1Y3R1cmUsCisgKiBhbmQgcmVtb3ZpbmcgdGhlIHVzZWQgYXJndW1lbnRzIGZyb20gdGhlIGFyZ3VtZW50IGxpc3QuCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBsZWZ0IHRoYXQgd2VyZW4ndCByZWNvZ25pemVkCisgKiAod2hpY2ggYXJlIGFsc28gbW92ZWQgdG8gdGhlIGhlYWQgb2YgdGhlIGFyZ3VtZW50IGxpc3QpCisgKi8KK2ludCBzZXR1cF9yZXZpc2lvbnMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIGNvbnN0IGNoYXIgKmRlZikKK3sKKwlpbnQgaSwgZmxhZ3MsIHNlZW5fZGFzaGRhc2gsIHNob3dfbWVyZ2U7CisJY29uc3QgY2hhciAqKnVucmVjb2duaXplZCA9IGFyZ3YgKyAxOworCWludCBsZWZ0ID0gMTsKKwlpbnQgYWxsX21hdGNoID0gMDsKKwlpbnQgcmVnZmxhZ3MgPSAwOworCWludCBmaXhlZCA9IDA7CisKKwkvKiBGaXJzdCwgc2VhcmNoIGZvciAiLS0iICovCisJc2Vlbl9kYXNoZGFzaCA9IDA7CisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCQlpZiAoc3RyY21wKGFyZywgIi0tIikpCisJCQljb250aW51ZTsKKwkJYXJndltpXSA9IE5VTEw7CisJCWFyZ2MgPSBpOworCQlpZiAoYXJndltpICsgMV0pCisJCQlyZXZzLT5wcnVuZV9kYXRhID0gZ2V0X3BhdGhzcGVjKHJldnMtPnByZWZpeCwgYXJndiArIGkgKyAxKTsKKwkJc2Vlbl9kYXNoZGFzaCA9IDE7CisJCWJyZWFrOworCX0KKworCWZsYWdzID0gc2hvd19tZXJnZSA9IDA7CisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCQlpZiAoKmFyZyA9PSAnLScpIHsKKwkJCWludCBvcHRzOworCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1tYXgtY291bnQ9IikpIHsKKwkJCQlyZXZzLT5tYXhfY291bnQgPSBhdG9pKGFyZyArIDEyKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcHJlZml4Y21wKGFyZywgIi0tc2tpcD0iKSkgeworCQkJCXJldnMtPnNraXBfY291bnQgPSBhdG9pKGFyZyArIDcpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogYWNjZXB0IC08ZGlnaXQ+LCBsaWtlIHRyYWRpdGlvbmFsICJoZWFkIiAqLworCQkJaWYgKCgqYXJnID09ICctJykgJiYgaXNkaWdpdChhcmdbMV0pKSB7CisJCQkJcmV2cy0+bWF4X2NvdW50ID0gYXRvaShhcmcgKyAxKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi1uIikpIHsKKwkJCQlpZiAoYXJnYyA8PSBpICsgMSkKKwkJCQkJZGllKCItbiByZXF1aXJlcyBhbiBhcmd1bWVudCIpOworCQkJCXJldnMtPm1heF9jb3VudCA9IGF0b2koYXJndlsrK2ldKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcHJlZml4Y21wKGFyZywgIi1uIikpIHsKKwkJCQlyZXZzLT5tYXhfY291bnQgPSBhdG9pKGFyZyArIDIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1tYXgtYWdlPSIpKSB7CisJCQkJcmV2cy0+bWF4X2FnZSA9IGF0b2koYXJnICsgMTApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1zaW5jZT0iKSkgeworCQkJCXJldnMtPm1heF9hZ2UgPSBhcHByb3hpZGF0ZShhcmcgKyA4KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcHJlZml4Y21wKGFyZywgIi0tYWZ0ZXI9IikpIHsKKwkJCQlyZXZzLT5tYXhfYWdlID0gYXBwcm94aWRhdGUoYXJnICsgOCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXByZWZpeGNtcChhcmcsICItLW1pbi1hZ2U9IikpIHsKKwkJCQlyZXZzLT5taW5fYWdlID0gYXRvaShhcmcgKyAxMCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXByZWZpeGNtcChhcmcsICItLWJlZm9yZT0iKSkgeworCQkJCXJldnMtPm1pbl9hZ2UgPSBhcHByb3hpZGF0ZShhcmcgKyA5KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcHJlZml4Y21wKGFyZywgIi0tdW50aWw9IikpIHsKKwkJCQlyZXZzLT5taW5fYWdlID0gYXBwcm94aWRhdGUoYXJnICsgOCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWFsbCIpKSB7CisJCQkJaGFuZGxlX3JlZnMocmV2cywgZmxhZ3MsIGZvcl9lYWNoX3JlZik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWJyYW5jaGVzIikpIHsKKwkJCQloYW5kbGVfcmVmcyhyZXZzLCBmbGFncywgZm9yX2VhY2hfYnJhbmNoX3JlZik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXRhZ3MiKSkgeworCQkJCWhhbmRsZV9yZWZzKHJldnMsIGZsYWdzLCBmb3JfZWFjaF90YWdfcmVmKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tcmVtb3RlcyIpKSB7CisJCQkJaGFuZGxlX3JlZnMocmV2cywgZmxhZ3MsIGZvcl9lYWNoX3JlbW90ZV9yZWYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1maXJzdC1wYXJlbnQiKSkgeworCQkJCXJldnMtPmZpcnN0X3BhcmVudF9vbmx5ID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tcmVmbG9nIikpIHsKKwkJCQloYW5kbGVfcmVmbG9nKHJldnMsIGZsYWdzKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi1nIikgfHwKKwkJCQkJIXN0cmNtcChhcmcsICItLXdhbGstcmVmbG9ncyIpKSB7CisJCQkJaW5pdF9yZWZsb2dfd2FsaygmcmV2cy0+cmVmbG9nX2luZm8pOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1ub3QiKSkgeworCQkJCWZsYWdzIF49IFVOSU5URVJFU1RJTkc7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWRlZmF1bHQiKSkgeworCQkJCWlmICgrK2kgPj0gYXJnYykKKwkJCQkJZGllKCJiYWQgLS1kZWZhdWx0IGFyZ3VtZW50Iik7CisJCQkJZGVmID0gYXJndltpXTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tbWVyZ2UiKSkgeworCQkJCXNob3dfbWVyZ2UgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS10b3BvLW9yZGVyIikpIHsKKwkJCQlyZXZzLT50b3BvX29yZGVyID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tZGF0ZS1vcmRlciIpKSB7CisJCQkJcmV2cy0+bGlmbyA9IDA7CisJCQkJcmV2cy0+dG9wb19vcmRlciA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXByZWZpeGNtcChhcmcsICItLWVhcmx5LW91dHB1dCIpKSB7CisJCQkJaW50IGNvdW50ID0gMTAwOworCQkJCXN3aXRjaCAoYXJnWzE0XSkgeworCQkJCWNhc2UgJz0nOgorCQkJCQljb3VudCA9IGF0b2koYXJnKzE1KTsKKwkJCQkJLyogRmFsbHRocm91Z2ggKi8KKwkJCQljYXNlIDA6CisJCQkJCXJldnMtPnRvcG9fb3JkZXIgPSAxOworCQkJCQlyZXZzLT5lYXJseV9vdXRwdXQgPSBjb3VudDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1wYXJlbnRzIikpIHsKKwkJCQlyZXZzLT5wYXJlbnRzID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tZGVuc2UiKSkgeworCQkJCXJldnMtPmRlbnNlID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tc3BhcnNlIikpIHsKKwkJCQlyZXZzLT5kZW5zZSA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXNob3ctYWxsIikpIHsKKwkJCQlyZXZzLT5zaG93X2FsbCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXJlbW92ZS1lbXB0eSIpKSB7CisJCQkJcmV2cy0+cmVtb3ZlX2VtcHR5X3RyZWVzID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tbm8tbWVyZ2VzIikpIHsKKwkJCQlyZXZzLT5ub19tZXJnZXMgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1ib3VuZGFyeSIpKSB7CisJCQkJcmV2cy0+Ym91bmRhcnkgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1sZWZ0LXJpZ2h0IikpIHsKKwkJCQlyZXZzLT5sZWZ0X3JpZ2h0ID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tY2hlcnJ5LXBpY2siKSkgeworCQkJCXJldnMtPmNoZXJyeV9waWNrID0gMTsKKwkJCQlyZXZzLT5saW1pdGVkID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tb2JqZWN0cyIpKSB7CisJCQkJcmV2cy0+dGFnX29iamVjdHMgPSAxOworCQkJCXJldnMtPnRyZWVfb2JqZWN0cyA9IDE7CisJCQkJcmV2cy0+YmxvYl9vYmplY3RzID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tb2JqZWN0cy1lZGdlIikpIHsKKwkJCQlyZXZzLT50YWdfb2JqZWN0cyA9IDE7CisJCQkJcmV2cy0+dHJlZV9vYmplY3RzID0gMTsKKwkJCQlyZXZzLT5ibG9iX29iamVjdHMgPSAxOworCQkJCXJldnMtPmVkZ2VfaGludCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXVucGFja2VkIikpIHsKKwkJCQlyZXZzLT51bnBhY2tlZCA9IDE7CisJCQkJZnJlZShyZXZzLT5pZ25vcmVfcGFja2VkKTsKKwkJCQlyZXZzLT5pZ25vcmVfcGFja2VkID0gTlVMTDsKKwkJCQlyZXZzLT5udW1faWdub3JlX3BhY2tlZCA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXByZWZpeGNtcChhcmcsICItLXVucGFja2VkPSIpKSB7CisJCQkJcmV2cy0+dW5wYWNrZWQgPSAxOworCQkJCWFkZF9pZ25vcmVfcGFja2VkKHJldnMsIGFyZysxMSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItciIpKSB7CisJCQkJcmV2cy0+ZGlmZiA9IDE7CisJCQkJRElGRl9PUFRfU0VUKCZyZXZzLT5kaWZmb3B0LCBSRUNVUlNJVkUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLXQiKSkgeworCQkJCXJldnMtPmRpZmYgPSAxOworCQkJCURJRkZfT1BUX1NFVCgmcmV2cy0+ZGlmZm9wdCwgUkVDVVJTSVZFKTsKKwkJCQlESUZGX09QVF9TRVQoJnJldnMtPmRpZmZvcHQsIFRSRUVfSU5fUkVDVVJTSVZFKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi1tIikpIHsKKwkJCQlyZXZzLT5pZ25vcmVfbWVyZ2VzID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi1jIikpIHsKKwkJCQlyZXZzLT5kaWZmID0gMTsKKwkJCQlyZXZzLT5kZW5zZV9jb21iaW5lZF9tZXJnZXMgPSAwOworCQkJCXJldnMtPmNvbWJpbmVfbWVyZ2VzID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tY2MiKSkgeworCQkJCXJldnMtPmRpZmYgPSAxOworCQkJCXJldnMtPmRlbnNlX2NvbWJpbmVkX21lcmdlcyA9IDE7CisJCQkJcmV2cy0+Y29tYmluZV9tZXJnZXMgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLXYiKSkgeworCQkJCXJldnMtPnZlcmJvc2VfaGVhZGVyID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcHJlZml4Y21wKGFyZywgIi0tcHJldHR5IikpIHsKKwkJCQlyZXZzLT52ZXJib3NlX2hlYWRlciA9IDE7CisJCQkJcmV2cy0+Y29tbWl0X2Zvcm1hdCA9IGdldF9jb21taXRfZm9ybWF0KGFyZys4KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tcm9vdCIpKSB7CisJCQkJcmV2cy0+c2hvd19yb290X2RpZmYgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1uby1jb21taXQtaWQiKSkgeworCQkJCXJldnMtPm5vX2NvbW1pdF9pZCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWFsd2F5cyIpKSB7CisJCQkJcmV2cy0+YWx3YXlzX3Nob3dfaGVhZGVyID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tbm8tYWJicmV2IikpIHsKKwkJCQlyZXZzLT5hYmJyZXYgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1hYmJyZXYiKSkgeworCQkJCXJldnMtPmFiYnJldiA9IERFRkFVTFRfQUJCUkVWOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1hYmJyZXY9IikpIHsKKwkJCQlyZXZzLT5hYmJyZXYgPSBzdHJ0b3VsKGFyZyArIDksIE5VTEwsIDEwKTsKKwkJCQlpZiAocmV2cy0+YWJicmV2IDwgTUlOSU1VTV9BQkJSRVYpCisJCQkJCXJldnMtPmFiYnJldiA9IE1JTklNVU1fQUJCUkVWOworCQkJCWVsc2UgaWYgKHJldnMtPmFiYnJldiA+IDQwKQorCQkJCQlyZXZzLT5hYmJyZXYgPSA0MDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tYWJicmV2LWNvbW1pdCIpKSB7CisJCQkJcmV2cy0+YWJicmV2X2NvbW1pdCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWZ1bGwtZGlmZiIpKSB7CisJCQkJcmV2cy0+ZGlmZiA9IDE7CisJCQkJcmV2cy0+ZnVsbF9kaWZmID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tZnVsbC1oaXN0b3J5IikpIHsKKwkJCQlyZXZzLT5zaW1wbGlmeV9oaXN0b3J5ID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tcmVsYXRpdmUtZGF0ZSIpKSB7CisJCQkJcmV2cy0+ZGF0ZV9tb2RlID0gREFURV9SRUxBVElWRTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RybmNtcChhcmcsICItLWRhdGU9IiwgNykpIHsKKwkJCQlyZXZzLT5kYXRlX21vZGUgPSBwYXJzZV9kYXRlX2Zvcm1hdChhcmcgKyA3KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tbG9nLXNpemUiKSkgeworCQkJCXJldnMtPnNob3dfbG9nX3NpemUgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogR3JlcHBpbmcgdGhlIGNvbW1pdCBsb2cKKwkJCSAqLworCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1hdXRob3I9IikpIHsKKwkJCQlhZGRfaGVhZGVyX2dyZXAocmV2cywgImF1dGhvciIsIGFyZys5KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcHJlZml4Y21wKGFyZywgIi0tY29tbWl0dGVyPSIpKSB7CisJCQkJYWRkX2hlYWRlcl9ncmVwKHJldnMsICJjb21taXR0ZXIiLCBhcmcrMTIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS1ncmVwPSIpKSB7CisJCQkJYWRkX21lc3NhZ2VfZ3JlcChyZXZzLCBhcmcrNyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWV4dGVuZGVkLXJlZ2V4cCIpIHx8CisJCQkgICAgIXN0cmNtcChhcmcsICItRSIpKSB7CisJCQkJcmVnZmxhZ3MgfD0gUkVHX0VYVEVOREVEOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1yZWdleHAtaWdub3JlLWNhc2UiKSB8fAorCQkJICAgICFzdHJjbXAoYXJnLCAiLWkiKSkgeworCQkJCXJlZ2ZsYWdzIHw9IFJFR19JQ0FTRTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tZml4ZWQtc3RyaW5ncyIpIHx8CisJCQkgICAgIXN0cmNtcChhcmcsICItRiIpKSB7CisJCQkJZml4ZWQgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1hbGwtbWF0Y2giKSkgeworCQkJCWFsbF9tYXRjaCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXByZWZpeGNtcChhcmcsICItLWVuY29kaW5nPSIpKSB7CisJCQkJYXJnICs9IDExOworCQkJCWlmIChzdHJjbXAoYXJnLCAibm9uZSIpKQorCQkJCQlnaXRfbG9nX291dHB1dF9lbmNvZGluZyA9IHhzdHJkdXAoYXJnKTsKKwkJCQllbHNlCisJCQkJCWdpdF9sb2dfb3V0cHV0X2VuY29kaW5nID0gIiI7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXJldmVyc2UiKSkgeworCQkJCXJldnMtPnJldmVyc2UgXj0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tbm8td2FsayIpKSB7CisJCQkJcmV2cy0+bm9fd2FsayA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWRvLXdhbGsiKSkgeworCQkJCXJldnMtPm5vX3dhbGsgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlvcHRzID0gZGlmZl9vcHRfcGFyc2UoJnJldnMtPmRpZmZvcHQsIGFyZ3YraSwgYXJnYy1pKTsKKwkJCWlmIChvcHRzID4gMCkgeworCQkJCWkgKz0gb3B0cyAtIDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQkqdW5yZWNvZ25pemVkKysgPSBhcmc7CisJCQlsZWZ0Kys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChoYW5kbGVfcmV2aXNpb25fYXJnKGFyZywgcmV2cywgZmxhZ3MsIHNlZW5fZGFzaGRhc2gpKSB7CisJCQlpbnQgajsKKwkJCWlmIChzZWVuX2Rhc2hkYXNoIHx8ICphcmcgPT0gJ14nKQorCQkJCWRpZSgiYmFkIHJldmlzaW9uICclcyciLCBhcmcpOworCisJCQkvKiBJZiB3ZSBkaWRuJ3QgaGF2ZSBhICItLSI6CisJCQkgKiAoMSkgYWxsIGZpbGVuYW1lcyBtdXN0IGV4aXN0OworCQkJICogKDIpIGFsbCByZXYtYXJncyBtdXN0IG5vdCBiZSBpbnRlcnByZXRhYmxlCisJCQkgKiAgICAgYXMgYSB2YWxpZCBmaWxlbmFtZS4KKwkJCSAqIGJ1dCB0aGUgbGF0dGVyIHdlIGhhdmUgY2hlY2tlZCBpbiB0aGUgbWFpbiBsb29wLgorCQkJICovCisJCQlmb3IgKGogPSBpOyBqIDwgYXJnYzsgaisrKQorCQkJCXZlcmlmeV9maWxlbmFtZShyZXZzLT5wcmVmaXgsIGFyZ3Zbal0pOworCisJCQlyZXZzLT5wcnVuZV9kYXRhID0gZ2V0X3BhdGhzcGVjKHJldnMtPnByZWZpeCwKKwkJCQkJCQlhcmd2ICsgaSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChyZXZzLT5ncmVwX2ZpbHRlcikgeworCQlyZXZzLT5ncmVwX2ZpbHRlci0+cmVnZmxhZ3MgfD0gcmVnZmxhZ3M7CisJCXJldnMtPmdyZXBfZmlsdGVyLT5maXhlZCA9IGZpeGVkOworCX0KKworCWlmIChzaG93X21lcmdlKQorCQlwcmVwYXJlX3Nob3dfbWVyZ2UocmV2cyk7CisJaWYgKGRlZiAmJiAhcmV2cy0+cGVuZGluZy5ucikgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmplY3Q7CisJCXVuc2lnbmVkIG1vZGU7CisJCWlmIChnZXRfc2hhMV93aXRoX21vZGUoZGVmLCBzaGExLCAmbW9kZSkpCisJCQlkaWUoImJhZCBkZWZhdWx0IHJldmlzaW9uICclcyciLCBkZWYpOworCQlvYmplY3QgPSBnZXRfcmVmZXJlbmNlKHJldnMsIGRlZiwgc2hhMSwgMCk7CisJCWFkZF9wZW5kaW5nX29iamVjdF93aXRoX21vZGUocmV2cywgb2JqZWN0LCBkZWYsIG1vZGUpOworCX0KKworCS8qIERpZCB0aGUgdXNlciBhc2sgZm9yIGFueSBkaWZmIG91dHB1dD8gUnVuIHRoZSBkaWZmISAqLworCWlmIChyZXZzLT5kaWZmb3B0Lm91dHB1dF9mb3JtYXQgJiB+RElGRl9GT1JNQVRfTk9fT1VUUFVUKQorCQlyZXZzLT5kaWZmID0gMTsKKworCS8qIFBpY2theGUsIGRpZmYtZmlsdGVyIGFuZCByZW5hbWUgZm9sbG93aW5nIG5lZWQgZGlmZnMgKi8KKwlpZiAocmV2cy0+ZGlmZm9wdC5waWNrYXhlIHx8CisJICAgIHJldnMtPmRpZmZvcHQuZmlsdGVyIHx8CisJICAgIERJRkZfT1BUX1RTVCgmcmV2cy0+ZGlmZm9wdCwgRk9MTE9XX1JFTkFNRVMpKQorCQlyZXZzLT5kaWZmID0gMTsKKworCWlmIChyZXZzLT50b3BvX29yZGVyKQorCQlyZXZzLT5saW1pdGVkID0gMTsKKworCWlmIChyZXZzLT5wcnVuZV9kYXRhKSB7CisJCWRpZmZfdHJlZV9zZXR1cF9wYXRocyhyZXZzLT5wcnVuZV9kYXRhLCAmcmV2cy0+cHJ1bmluZyk7CisJCS8qIENhbid0IHBydW5lIGNvbW1pdHMgd2l0aCByZW5hbWUgZm9sbG93aW5nOiB0aGUgcGF0aHMgY2hhbmdlLi4gKi8KKwkJaWYgKCFESUZGX09QVF9UU1QoJnJldnMtPmRpZmZvcHQsIEZPTExPV19SRU5BTUVTKSkKKwkJCXJldnMtPnBydW5lID0gMTsKKwkJaWYgKCFyZXZzLT5mdWxsX2RpZmYpCisJCQlkaWZmX3RyZWVfc2V0dXBfcGF0aHMocmV2cy0+cHJ1bmVfZGF0YSwgJnJldnMtPmRpZmZvcHQpOworCX0KKwlpZiAocmV2cy0+Y29tYmluZV9tZXJnZXMpIHsKKwkJcmV2cy0+aWdub3JlX21lcmdlcyA9IDA7CisJCWlmIChyZXZzLT5kZW5zZV9jb21iaW5lZF9tZXJnZXMgJiYgIXJldnMtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCkKKwkJCXJldnMtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX1BBVENIOworCX0KKwlyZXZzLT5kaWZmb3B0LmFiYnJldiA9IHJldnMtPmFiYnJldjsKKwlpZiAoZGlmZl9zZXR1cF9kb25lKCZyZXZzLT5kaWZmb3B0KSA8IDApCisJCWRpZSgiZGlmZl9zZXR1cF9kb25lIGZhaWxlZCIpOworCisJaWYgKHJldnMtPmdyZXBfZmlsdGVyKSB7CisJCXJldnMtPmdyZXBfZmlsdGVyLT5hbGxfbWF0Y2ggPSBhbGxfbWF0Y2g7CisJCWNvbXBpbGVfZ3JlcF9wYXR0ZXJucyhyZXZzLT5ncmVwX2ZpbHRlcik7CisJfQorCisJaWYgKHJldnMtPnJldmVyc2UgJiYgcmV2cy0+cmVmbG9nX2luZm8pCisJCWRpZSgiY2Fubm90IGNvbWJpbmUgLS1yZXZlcnNlIHdpdGggLS13YWxrLXJlZmxvZ3MiKTsKKworCXJldHVybiBsZWZ0OworfQorCitpbnQgcHJlcGFyZV9yZXZpc2lvbl93YWxrKHN0cnVjdCByZXZfaW5mbyAqcmV2cykKK3sKKwlpbnQgbnIgPSByZXZzLT5wZW5kaW5nLm5yOworCXN0cnVjdCBvYmplY3RfYXJyYXlfZW50cnkgKmUsICpsaXN0OworCisJZSA9IGxpc3QgPSByZXZzLT5wZW5kaW5nLm9iamVjdHM7CisJcmV2cy0+cGVuZGluZy5uciA9IDA7CisJcmV2cy0+cGVuZGluZy5hbGxvYyA9IDA7CisJcmV2cy0+cGVuZGluZy5vYmplY3RzID0gTlVMTDsKKwl3aGlsZSAoLS1uciA+PSAwKSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGhhbmRsZV9jb21taXQocmV2cywgZS0+aXRlbSwgZS0+bmFtZSk7CisJCWlmIChjb21taXQpIHsKKwkJCWlmICghKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgU0VFTikpIHsKKwkJCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBTRUVOOworCQkJCWluc2VydF9ieV9kYXRlKGNvbW1pdCwgJnJldnMtPmNvbW1pdHMpOworCQkJfQorCQl9CisJCWUrKzsKKwl9CisJZnJlZShsaXN0KTsKKworCWlmIChyZXZzLT5ub193YWxrKQorCQlyZXR1cm4gMDsKKwlpZiAocmV2cy0+bGltaXRlZCkKKwkJaWYgKGxpbWl0X2xpc3QocmV2cykgPCAwKQorCQkJcmV0dXJuIC0xOworCWlmIChyZXZzLT50b3BvX29yZGVyKQorCQlzb3J0X2luX3RvcG9sb2dpY2FsX29yZGVyKCZyZXZzLT5jb21taXRzLCByZXZzLT5saWZvKTsKKwlyZXR1cm4gMDsKK30KKworZW51bSByZXdyaXRlX3Jlc3VsdCB7CisJcmV3cml0ZV9vbmVfb2ssCisJcmV3cml0ZV9vbmVfbm9wYXJlbnRzLAorCXJld3JpdGVfb25lX2Vycm9yLAorfTsKKworc3RhdGljIGVudW0gcmV3cml0ZV9yZXN1bHQgcmV3cml0ZV9vbmUoc3RydWN0IHJldl9pbmZvICpyZXZzLCBzdHJ1Y3QgY29tbWl0ICoqcHApCit7CisJZm9yICg7OykgeworCQlzdHJ1Y3QgY29tbWl0ICpwID0gKnBwOworCQlpZiAoIXJldnMtPmxpbWl0ZWQpCisJCQlpZiAoYWRkX3BhcmVudHNfdG9fbGlzdChyZXZzLCBwLCAmcmV2cy0+Y29tbWl0cykgPCAwKQorCQkJCXJldHVybiByZXdyaXRlX29uZV9lcnJvcjsKKwkJaWYgKHAtPnBhcmVudHMgJiYgcC0+cGFyZW50cy0+bmV4dCkKKwkJCXJldHVybiByZXdyaXRlX29uZV9vazsKKwkJaWYgKHAtPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpCisJCQlyZXR1cm4gcmV3cml0ZV9vbmVfb2s7CisJCWlmICghKHAtPm9iamVjdC5mbGFncyAmIFRSRUVTQU1FKSkKKwkJCXJldHVybiByZXdyaXRlX29uZV9vazsKKwkJaWYgKCFwLT5wYXJlbnRzKQorCQkJcmV0dXJuIHJld3JpdGVfb25lX25vcGFyZW50czsKKwkJKnBwID0gcC0+cGFyZW50cy0+aXRlbTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9kdXBsaWNhdGVfcGFyZW50cyhzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICoqcHAsICpwOworCisJLyogRXhhbWluZSBleGlzdGluZyBwYXJlbnRzIHdoaWxlIG1hcmtpbmcgb25lcyB3ZSBoYXZlIHNlZW4uLi4gKi8KKwlwcCA9ICZjb21taXQtPnBhcmVudHM7CisJd2hpbGUgKChwID0gKnBwKSAhPSBOVUxMKSB7CisJCXN0cnVjdCBjb21taXQgKnBhcmVudCA9IHAtPml0ZW07CisJCWlmIChwYXJlbnQtPm9iamVjdC5mbGFncyAmIFRNUF9NQVJLKSB7CisJCQkqcHAgPSBwLT5uZXh0OworCQkJY29udGludWU7CisJCX0KKwkJcGFyZW50LT5vYmplY3QuZmxhZ3MgfD0gVE1QX01BUks7CisJCXBwID0gJnAtPm5leHQ7CisJfQorCS8qIC4uLiBhbmQgY2xlYXIgdGhlIHRlbXBvcmFyeSBtYXJrICovCisJZm9yIChwID0gY29tbWl0LT5wYXJlbnRzOyBwOyBwID0gcC0+bmV4dCkKKwkJcC0+aXRlbS0+b2JqZWN0LmZsYWdzICY9IH5UTVBfTUFSSzsKK30KKworc3RhdGljIGludCByZXdyaXRlX3BhcmVudHMoc3RydWN0IHJldl9pbmZvICpyZXZzLCBzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICoqcHAgPSAmY29tbWl0LT5wYXJlbnRzOworCXdoaWxlICgqcHApIHsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnQgPSAqcHA7CisJCXN3aXRjaCAocmV3cml0ZV9vbmUocmV2cywgJnBhcmVudC0+aXRlbSkpIHsKKwkJY2FzZSByZXdyaXRlX29uZV9vazoKKwkJCWJyZWFrOworCQljYXNlIHJld3JpdGVfb25lX25vcGFyZW50czoKKwkJCSpwcCA9IHBhcmVudC0+bmV4dDsKKwkJCWNvbnRpbnVlOworCQljYXNlIHJld3JpdGVfb25lX2Vycm9yOgorCQkJcmV0dXJuIC0xOworCQl9CisJCXBwID0gJnBhcmVudC0+bmV4dDsKKwl9CisJcmVtb3ZlX2R1cGxpY2F0ZV9wYXJlbnRzKGNvbW1pdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29tbWl0X21hdGNoKHN0cnVjdCBjb21taXQgKmNvbW1pdCwgc3RydWN0IHJldl9pbmZvICpvcHQpCit7CisJaWYgKCFvcHQtPmdyZXBfZmlsdGVyKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gZ3JlcF9idWZmZXIob3B0LT5ncmVwX2ZpbHRlciwKKwkJCSAgIE5VTEwsIC8qIHdlIHNheSBub3RoaW5nLCBub3QgZXZlbiBmaWxlbmFtZSAqLworCQkJICAgY29tbWl0LT5idWZmZXIsIHN0cmxlbihjb21taXQtPmJ1ZmZlcikpOworfQorCitlbnVtIGNvbW1pdF9hY3Rpb24gc2ltcGxpZnlfY29tbWl0KHN0cnVjdCByZXZfaW5mbyAqcmV2cywgc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIFNIT1dOKQorCQlyZXR1cm4gY29tbWl0X2lnbm9yZTsKKwlpZiAocmV2cy0+dW5wYWNrZWQgJiYgaGFzX3NoYTFfcGFjayhjb21taXQtPm9iamVjdC5zaGExLCByZXZzLT5pZ25vcmVfcGFja2VkKSkKKwkJcmV0dXJuIGNvbW1pdF9pZ25vcmU7CisJaWYgKHJldnMtPnNob3dfYWxsKQorCQlyZXR1cm4gY29tbWl0X3Nob3c7CisJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykKKwkJcmV0dXJuIGNvbW1pdF9pZ25vcmU7CisJaWYgKHJldnMtPm1pbl9hZ2UgIT0gLTEgJiYgKGNvbW1pdC0+ZGF0ZSA+IHJldnMtPm1pbl9hZ2UpKQorCQlyZXR1cm4gY29tbWl0X2lnbm9yZTsKKwlpZiAocmV2cy0+bm9fbWVyZ2VzICYmIGNvbW1pdC0+cGFyZW50cyAmJiBjb21taXQtPnBhcmVudHMtPm5leHQpCisJCXJldHVybiBjb21taXRfaWdub3JlOworCWlmICghY29tbWl0X21hdGNoKGNvbW1pdCwgcmV2cykpCisJCXJldHVybiBjb21taXRfaWdub3JlOworCWlmIChyZXZzLT5wcnVuZSAmJiByZXZzLT5kZW5zZSkgeworCQkvKiBDb21taXQgd2l0aG91dCBjaGFuZ2VzPyAqLworCQlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBUUkVFU0FNRSkgeworCQkJLyogZHJvcCBtZXJnZXMgdW5sZXNzIHdlIHdhbnQgcGFyZW50aG9vZCAqLworCQkJaWYgKCFyZXZzLT5wYXJlbnRzKQorCQkJCXJldHVybiBjb21taXRfaWdub3JlOworCQkJLyogbm9uLW1lcmdlIC0gYWx3YXlzIGlnbm9yZSBpdCAqLworCQkJaWYgKCFjb21taXQtPnBhcmVudHMgfHwgIWNvbW1pdC0+cGFyZW50cy0+bmV4dCkKKwkJCQlyZXR1cm4gY29tbWl0X2lnbm9yZTsKKwkJfQorCQlpZiAocmV2cy0+cGFyZW50cyAmJiByZXdyaXRlX3BhcmVudHMocmV2cywgY29tbWl0KSA8IDApCisJCQlyZXR1cm4gY29tbWl0X2Vycm9yOworCX0KKwlyZXR1cm4gY29tbWl0X3Nob3c7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0ICpnZXRfcmV2aXNpb25fMShzdHJ1Y3QgcmV2X2luZm8gKnJldnMpCit7CisJaWYgKCFyZXZzLT5jb21taXRzKQorCQlyZXR1cm4gTlVMTDsKKworCWRvIHsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICplbnRyeSA9IHJldnMtPmNvbW1pdHM7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGVudHJ5LT5pdGVtOworCisJCXJldnMtPmNvbW1pdHMgPSBlbnRyeS0+bmV4dDsKKwkJZnJlZShlbnRyeSk7CisKKwkJaWYgKHJldnMtPnJlZmxvZ19pbmZvKQorCQkJZmFrZV9yZWZsb2dfcGFyZW50KHJldnMtPnJlZmxvZ19pbmZvLCBjb21taXQpOworCisJCS8qCisJCSAqIElmIHdlIGhhdmVuJ3QgZG9uZSB0aGUgbGlzdCBsaW1pdGluZywgd2UgbmVlZCB0byBsb29rIGF0CisJCSAqIHRoZSBwYXJlbnRzIGhlcmUuIFdlIGFsc28gbmVlZCB0byBkbyB0aGUgZGF0ZS1iYXNlZCBsaW1pdGluZworCQkgKiB0aGF0IHdlJ2Qgb3RoZXJ3aXNlIGhhdmUgZG9uZSBpbiBsaW1pdF9saXN0KCkuCisJCSAqLworCQlpZiAoIXJldnMtPmxpbWl0ZWQpIHsKKwkJCWlmIChyZXZzLT5tYXhfYWdlICE9IC0xICYmCisJCQkgICAgKGNvbW1pdC0+ZGF0ZSA8IHJldnMtPm1heF9hZ2UpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGFkZF9wYXJlbnRzX3RvX2xpc3QocmV2cywgY29tbWl0LCAmcmV2cy0+Y29tbWl0cykgPCAwKQorCQkJCXJldHVybiBOVUxMOworCQl9CisKKwkJc3dpdGNoIChzaW1wbGlmeV9jb21taXQocmV2cywgY29tbWl0KSkgeworCQljYXNlIGNvbW1pdF9pZ25vcmU6CisJCQljb250aW51ZTsKKwkJY2FzZSBjb21taXRfZXJyb3I6CisJCQlyZXR1cm4gTlVMTDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBjb21taXQ7CisJCX0KKwl9IHdoaWxlIChyZXZzLT5jb21taXRzKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZ2NfYm91bmRhcnkoc3RydWN0IG9iamVjdF9hcnJheSAqYXJyYXkpCit7CisJdW5zaWduZWQgbnIgPSBhcnJheS0+bnI7CisJdW5zaWduZWQgYWxsb2MgPSBhcnJheS0+YWxsb2M7CisJc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSAqb2JqZWN0cyA9IGFycmF5LT5vYmplY3RzOworCisJaWYgKGFsbG9jIDw9IG5yKSB7CisJCXVuc2lnbmVkIGksIGo7CisJCWZvciAoaSA9IGogPSAwOyBpIDwgbnI7IGkrKykgeworCQkJaWYgKG9iamVjdHNbaV0uaXRlbS0+ZmxhZ3MgJiBTSE9XTikKKwkJCQljb250aW51ZTsKKwkJCWlmIChpICE9IGopCisJCQkJb2JqZWN0c1tqXSA9IG9iamVjdHNbaV07CisJCQlqKys7CisJCX0KKwkJZm9yIChpID0gajsgaSA8IG5yOyBpKyspCisJCQlvYmplY3RzW2ldLml0ZW0gPSBOVUxMOworCQlhcnJheS0+bnIgPSBqOworCX0KK30KKworc3RydWN0IGNvbW1pdCAqZ2V0X3JldmlzaW9uKHN0cnVjdCByZXZfaW5mbyAqcmV2cykKK3sKKwlzdHJ1Y3QgY29tbWl0ICpjID0gTlVMTDsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKmw7CisKKwlpZiAocmV2cy0+Ym91bmRhcnkgPT0gMikgeworCQl1bnNpZ25lZCBpOworCQlzdHJ1Y3Qgb2JqZWN0X2FycmF5ICphcnJheSA9ICZyZXZzLT5ib3VuZGFyeV9jb21taXRzOworCQlzdHJ1Y3Qgb2JqZWN0X2FycmF5X2VudHJ5ICpvYmplY3RzID0gYXJyYXktPm9iamVjdHM7CisJCWZvciAoaSA9IDA7IGkgPCBhcnJheS0+bnI7IGkrKykgeworCQkJYyA9IChzdHJ1Y3QgY29tbWl0ICopKG9iamVjdHNbaV0uaXRlbSk7CisJCQlpZiAoIWMpCisJCQkJY29udGludWU7CisJCQlpZiAoIShjLT5vYmplY3QuZmxhZ3MgJiBDSElMRF9TSE9XTikpCisJCQkJY29udGludWU7CisJCQlpZiAoIShjLT5vYmplY3QuZmxhZ3MgJiBTSE9XTikpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGFycmF5LT5uciA8PSBpKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJYy0+b2JqZWN0LmZsYWdzIHw9IFNIT1dOIHwgQk9VTkRBUlk7CisJCXJldHVybiBjOworCX0KKworCWlmIChyZXZzLT5yZXZlcnNlKSB7CisJCWludCBsaW1pdCA9IC0xOworCisJCWlmICgwIDw9IHJldnMtPm1heF9jb3VudCkgeworCQkJbGltaXQgPSByZXZzLT5tYXhfY291bnQ7CisJCQlpZiAoMCA8IHJldnMtPnNraXBfY291bnQpCisJCQkJbGltaXQgKz0gcmV2cy0+c2tpcF9jb3VudDsKKwkJfQorCQlsID0gTlVMTDsKKwkJd2hpbGUgKChjID0gZ2V0X3JldmlzaW9uXzEocmV2cykpKSB7CisJCQljb21taXRfbGlzdF9pbnNlcnQoYywgJmwpOworCQkJaWYgKCgwIDwgbGltaXQpICYmICEtLWxpbWl0KQorCQkJCWJyZWFrOworCQl9CisJCXJldnMtPmNvbW1pdHMgPSBsOworCQlyZXZzLT5yZXZlcnNlID0gMDsKKwkJcmV2cy0+bWF4X2NvdW50ID0gLTE7CisJCWMgPSBOVUxMOworCX0KKworCS8qCisJICogTm93IHBpY2sgdXAgd2hhdCB0aGV5IHdhbnQgdG8gZ2l2ZSB1cworCSAqLworCWMgPSBnZXRfcmV2aXNpb25fMShyZXZzKTsKKwlpZiAoYykgeworCQl3aGlsZSAoMCA8IHJldnMtPnNraXBfY291bnQpIHsKKwkJCXJldnMtPnNraXBfY291bnQtLTsKKwkJCWMgPSBnZXRfcmV2aXNpb25fMShyZXZzKTsKKwkJCWlmICghYykKKwkJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogQ2hlY2sgdGhlIG1heF9jb3VudC4KKwkgKi8KKwlzd2l0Y2ggKHJldnMtPm1heF9jb3VudCkgeworCWNhc2UgLTE6CisJCWJyZWFrOworCWNhc2UgMDoKKwkJYyA9IE5VTEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldnMtPm1heF9jb3VudC0tOworCX0KKworCWlmIChjKQorCQljLT5vYmplY3QuZmxhZ3MgfD0gU0hPV047CisKKwlpZiAoIXJldnMtPmJvdW5kYXJ5KSB7CisJCXJldHVybiBjOworCX0KKworCWlmICghYykgeworCQkvKgorCQkgKiBnZXRfcmV2aXNpb25fMSgpIHJ1bnMgb3V0IHRoZSBjb21taXRzLCBhbmQKKwkJICogd2UgYXJlIGRvbmUgY29tcHV0aW5nIHRoZSBib3VuZGFyaWVzLgorCQkgKiBzd2l0Y2ggdG8gYm91bmRhcnkgY29tbWl0cyBvdXRwdXQgbW9kZS4KKwkJICovCisJCXJldnMtPmJvdW5kYXJ5ID0gMjsKKwkJcmV0dXJuIGdldF9yZXZpc2lvbihyZXZzKTsKKwl9CisKKwkvKgorCSAqIGJvdW5kYXJ5IGNvbW1pdHMgYXJlIHRoZSBjb21taXRzIHRoYXQgYXJlIHBhcmVudHMgb2YgdGhlCisJICogb25lcyB3ZSBnb3QgZnJvbSBnZXRfcmV2aXNpb25fMSgpIGJ1dCB0aGV5IHRoZW1zZWx2ZXMgYXJlCisJICogbm90IHJldHVybmVkIGZyb20gZ2V0X3JldmlzaW9uXzEoKS4gIEJlZm9yZSByZXR1cm5pbmcKKwkgKiAnYycsIHdlIG5lZWQgdG8gbWFyayBpdHMgcGFyZW50cyB0aGF0IHRoZXkgY291bGQgYmUgYm91bmRhcmllcy4KKwkgKi8KKworCWZvciAobCA9IGMtPnBhcmVudHM7IGw7IGwgPSBsLT5uZXh0KSB7CisJCXN0cnVjdCBvYmplY3QgKnA7CisJCXAgPSAmKGwtPml0ZW0tPm9iamVjdCk7CisJCWlmIChwLT5mbGFncyAmIChDSElMRF9TSE9XTiB8IFNIT1dOKSkKKwkJCWNvbnRpbnVlOworCQlwLT5mbGFncyB8PSBDSElMRF9TSE9XTjsKKwkJZ2NfYm91bmRhcnkoJnJldnMtPmJvdW5kYXJ5X2NvbW1pdHMpOworCQlhZGRfb2JqZWN0X2FycmF5KHAsIE5VTEwsICZyZXZzLT5ib3VuZGFyeV9jb21taXRzKTsKKwl9CisKKwlyZXR1cm4gYzsKK30KZGlmZiAtLWdpdCBhL3JldmlzaW9uLmggYi9yZXZpc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YjNiOTQKLS0tIC9kZXYvbnVsbAorKysgYi9yZXZpc2lvbi5oCkBAIC0wLDAgKzEsMTQ0IEBACisjaWZuZGVmIFJFVklTSU9OX0gKKyNkZWZpbmUgUkVWSVNJT05fSAorCisjZGVmaW5lIFNFRU4JCSgxdTw8MCkKKyNkZWZpbmUgVU5JTlRFUkVTVElORyAgICgxdTw8MSkKKyNkZWZpbmUgVFJFRVNBTUUJKDF1PDwyKQorI2RlZmluZSBTSE9XTgkJKDF1PDwzKQorI2RlZmluZSBUTVBfTUFSSwkoMXU8PDQpIC8qIGZvciBpc29sYXRlZCBjYXNlczsgY2xlYW4gYWZ0ZXIgdXNlICovCisjZGVmaW5lIEJPVU5EQVJZCSgxdTw8NSkKKyNkZWZpbmUgQ0hJTERfU0hPV04JKDF1PDw2KQorI2RlZmluZSBBRERFRAkJKDF1PDw3KQkvKiBQYXJlbnRzIGFscmVhZHkgcGFyc2VkIGFuZCBhZGRlZD8gKi8KKyNkZWZpbmUgU1lNTUVUUklDX0xFRlQJKDF1PDw4KQorI2RlZmluZSBUT1BPU09SVAkoMXU8PDkpCS8qIEluIHRoZSBhY3RpdmUgdG9wb3NvcnQgbGlzdC4uICovCisKK3N0cnVjdCByZXZfaW5mbzsKK3N0cnVjdCBsb2dfaW5mbzsKKworc3RydWN0IHJldl9pbmZvIHsKKwkvKiBTdGFydGluZyBsaXN0ICovCisJc3RydWN0IGNvbW1pdF9saXN0ICpjb21taXRzOworCXN0cnVjdCBvYmplY3RfYXJyYXkgcGVuZGluZzsKKworCS8qIFBhcmVudHMgb2Ygc2hvd24gY29tbWl0cyAqLworCXN0cnVjdCBvYmplY3RfYXJyYXkgYm91bmRhcnlfY29tbWl0czsKKworCS8qIEJhc2ljIGluZm9ybWF0aW9uICovCisJY29uc3QgY2hhciAqcHJlZml4OworCXZvaWQgKnBydW5lX2RhdGE7CisJdW5zaWduZWQgaW50IGVhcmx5X291dHB1dDsKKworCS8qIFRyYXZlcnNhbCBmbGFncyAqLworCXVuc2lnbmVkIGludAlkZW5zZToxLAorCQkJcHJ1bmU6MSwKKwkJCW5vX21lcmdlczoxLAorCQkJbm9fd2FsazoxLAorCQkJc2hvd19hbGw6MSwKKwkJCXJlbW92ZV9lbXB0eV90cmVlczoxLAorCQkJc2ltcGxpZnlfaGlzdG9yeToxLAorCQkJbGlmbzoxLAorCQkJdG9wb19vcmRlcjoxLAorCQkJdGFnX29iamVjdHM6MSwKKwkJCXRyZWVfb2JqZWN0czoxLAorCQkJYmxvYl9vYmplY3RzOjEsCisJCQllZGdlX2hpbnQ6MSwKKwkJCWxpbWl0ZWQ6MSwKKwkJCXVucGFja2VkOjEsIC8qIHNlZSBhbHNvIGlnbm9yZV9wYWNrZWQgYmVsb3cgKi8KKwkJCWJvdW5kYXJ5OjIsCisJCQlsZWZ0X3JpZ2h0OjEsCisJCQlwYXJlbnRzOjEsCisJCQlyZXZlcnNlOjEsCisJCQljaGVycnlfcGljazoxLAorCQkJZmlyc3RfcGFyZW50X29ubHk6MTsKKworCS8qIERpZmYgZmxhZ3MgKi8KKwl1bnNpZ25lZCBpbnQJZGlmZjoxLAorCQkJZnVsbF9kaWZmOjEsCisJCQlzaG93X3Jvb3RfZGlmZjoxLAorCQkJbm9fY29tbWl0X2lkOjEsCisJCQl2ZXJib3NlX2hlYWRlcjoxLAorCQkJaWdub3JlX21lcmdlczoxLAorCQkJY29tYmluZV9tZXJnZXM6MSwKKwkJCWRlbnNlX2NvbWJpbmVkX21lcmdlczoxLAorCQkJYWx3YXlzX3Nob3dfaGVhZGVyOjE7CisKKwkvKiBGb3JtYXQgaW5mbyAqLworCXVuc2lnbmVkIGludAlzaG93bl9vbmU6MSwKKwkJCWFiYnJldl9jb21taXQ6MTsKKwllbnVtIGRhdGVfbW9kZSBkYXRlX21vZGU7CisKKwljb25zdCBjaGFyICoqaWdub3JlX3BhY2tlZDsgLyogcHJldGVuZCBvYmplY3RzIGluIHRoZXNlIGFyZSB1bnBhY2tlZCAqLworCWludCBudW1faWdub3JlX3BhY2tlZDsKKworCXVuc2lnbmVkIGludAlhYmJyZXY7CisJZW51bSBjbWl0X2ZtdAljb21taXRfZm9ybWF0OworCXN0cnVjdCBsb2dfaW5mbyAqbG9naW5mbzsKKwlpbnQJCW5yLCB0b3RhbDsKKwljb25zdCBjaGFyCSptaW1lX2JvdW5kYXJ5OworCWNoYXIJCSptZXNzYWdlX2lkOworCWNvbnN0IGNoYXIJKnJlZl9tZXNzYWdlX2lkOworCWNvbnN0IGNoYXIJKmFkZF9zaWdub2ZmOworCWNvbnN0IGNoYXIJKmV4dHJhX2hlYWRlcnM7CisJY29uc3QgY2hhcgkqbG9nX3JlZW5jb2RlOworCWNvbnN0IGNoYXIJKnN1YmplY3RfcHJlZml4OworCWludAkJbm9faW5saW5lOworCWludAkJc2hvd19sb2dfc2l6ZTsKKworCS8qIEZpbHRlciBieSBjb21taXQgbG9nIG1lc3NhZ2UgKi8KKwlzdHJ1Y3QgZ3JlcF9vcHQJKmdyZXBfZmlsdGVyOworCisJLyogc3BlY2lhbCBsaW1pdHMgKi8KKwlpbnQgc2tpcF9jb3VudDsKKwlpbnQgbWF4X2NvdW50OworCXVuc2lnbmVkIGxvbmcgbWF4X2FnZTsKKwl1bnNpZ25lZCBsb25nIG1pbl9hZ2U7CisKKwkvKiBkaWZmIGluZm8gZm9yIHBhdGNoZXMgYW5kIGZvciBwYXRocyBsaW1pdGluZyAqLworCXN0cnVjdCBkaWZmX29wdGlvbnMgZGlmZm9wdDsKKwlzdHJ1Y3QgZGlmZl9vcHRpb25zIHBydW5pbmc7CisKKwlzdHJ1Y3QgcmVmbG9nX3dhbGtfaW5mbyAqcmVmbG9nX2luZm87Cit9OworCisjZGVmaW5lIFJFVl9UUkVFX1NBTUUJCTAKKyNkZWZpbmUgUkVWX1RSRUVfTkVXCQkxCisjZGVmaW5lIFJFVl9UUkVFX0RJRkZFUkVOVAkyCisKKy8qIHJldmlzaW9uLmMgKi8KK3R5cGVkZWYgdm9pZCAoKnNob3dfZWFybHlfb3V0cHV0X2ZuX3QpKHN0cnVjdCByZXZfaW5mbyAqLCBzdHJ1Y3QgY29tbWl0X2xpc3QgKik7Cit2b2xhdGlsZSBzaG93X2Vhcmx5X291dHB1dF9mbl90IHNob3dfZWFybHlfb3V0cHV0OworCitleHRlcm4gdm9pZCBpbml0X3JldmlzaW9ucyhzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IHNldHVwX3JldmlzaW9ucyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIHN0cnVjdCByZXZfaW5mbyAqcmV2cywgY29uc3QgY2hhciAqZGVmKTsKK2V4dGVybiBpbnQgaGFuZGxlX3JldmlzaW9uX2FyZyhjb25zdCBjaGFyICphcmcsIHN0cnVjdCByZXZfaW5mbyAqcmV2cyxpbnQgZmxhZ3MsaW50IGNhbnRfYmVfZmlsZW5hbWUpOworCitleHRlcm4gaW50IHByZXBhcmVfcmV2aXNpb25fd2FsayhzdHJ1Y3QgcmV2X2luZm8gKnJldnMpOworZXh0ZXJuIHN0cnVjdCBjb21taXQgKmdldF9yZXZpc2lvbihzdHJ1Y3QgcmV2X2luZm8gKnJldnMpOworCitleHRlcm4gdm9pZCBtYXJrX3BhcmVudHNfdW5pbnRlcmVzdGluZyhzdHJ1Y3QgY29tbWl0ICpjb21taXQpOworZXh0ZXJuIHZvaWQgbWFya190cmVlX3VuaW50ZXJlc3Rpbmcoc3RydWN0IHRyZWUgKnRyZWUpOworCitzdHJ1Y3QgbmFtZV9wYXRoIHsKKwlzdHJ1Y3QgbmFtZV9wYXRoICp1cDsKKwlpbnQgZWxlbV9sZW47CisJY29uc3QgY2hhciAqZWxlbTsKK307CisKK2V4dGVybiB2b2lkIGFkZF9vYmplY3Qoc3RydWN0IG9iamVjdCAqb2JqLAorCQkgICAgICAgc3RydWN0IG9iamVjdF9hcnJheSAqcCwKKwkJICAgICAgIHN0cnVjdCBuYW1lX3BhdGggKnBhdGgsCisJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKKworZXh0ZXJuIHZvaWQgYWRkX3BlbmRpbmdfb2JqZWN0KHN0cnVjdCByZXZfaW5mbyAqcmV2cywgc3RydWN0IG9iamVjdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lKTsKKworZXh0ZXJuIHZvaWQgYWRkX2hlYWRfdG9fcGVuZGluZyhzdHJ1Y3QgcmV2X2luZm8gKik7CisKK2VudW0gY29tbWl0X2FjdGlvbiB7CisJY29tbWl0X2lnbm9yZSwKKwljb21taXRfc2hvdywKKwljb21taXRfZXJyb3IKK307CisKK2V4dGVybiBlbnVtIGNvbW1pdF9hY3Rpb24gc2ltcGxpZnlfY29tbWl0KHN0cnVjdCByZXZfaW5mbyAqcmV2cywgc3RydWN0IGNvbW1pdCAqY29tbWl0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9ydW4tY29tbWFuZC5jIGIvcnVuLWNvbW1hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDEwMGE3Ci0tLSAvZGV2L251bGwKKysrIGIvcnVuLWNvbW1hbmQuYwpAQCAtMCwwICsxLDI1MSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicnVuLWNvbW1hbmQuaCIKKyNpbmNsdWRlICJleGVjX2NtZC5oIgorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xvc2VfcGFpcihpbnQgZmRbMl0pCit7CisJY2xvc2UoZmRbMF0pOworCWNsb3NlKGZkWzFdKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1cF9kZXZudWxsKGludCB0bykKK3sKKwlpbnQgZmQgPSBvcGVuKCIvZGV2L251bGwiLCBPX1JEV1IpOworCWR1cDIoZmQsIHRvKTsKKwljbG9zZShmZCk7Cit9CisKK2ludCBzdGFydF9jb21tYW5kKHN0cnVjdCBjaGlsZF9wcm9jZXNzICpjbWQpCit7CisJaW50IG5lZWRfaW4sIG5lZWRfb3V0LCBuZWVkX2VycjsKKwlpbnQgZmRpblsyXSwgZmRvdXRbMl0sIGZkZXJyWzJdOworCisJLyoKKwkgKiBJbiBjYXNlIG9mIGVycm9ycyB3ZSBtdXN0IGtlZXAgdGhlIHByb21pc2UgdG8gY2xvc2UgRkRzCisJICogdGhhdCBoYXZlIGJlZW4gcGFzc2VkIGluIHZpYSAtPmluIGFuZCAtPm91dC4KKwkgKi8KKworCW5lZWRfaW4gPSAhY21kLT5ub19zdGRpbiAmJiBjbWQtPmluIDwgMDsKKwlpZiAobmVlZF9pbikgeworCQlpZiAocGlwZShmZGluKSA8IDApIHsKKwkJCWlmIChjbWQtPm91dCA+IDApCisJCQkJY2xvc2UoY21kLT5vdXQpOworCQkJcmV0dXJuIC1FUlJfUlVOX0NPTU1BTkRfUElQRTsKKwkJfQorCQljbWQtPmluID0gZmRpblsxXTsKKwl9CisKKwluZWVkX291dCA9ICFjbWQtPm5vX3N0ZG91dAorCQkmJiAhY21kLT5zdGRvdXRfdG9fc3RkZXJyCisJCSYmIGNtZC0+b3V0IDwgMDsKKwlpZiAobmVlZF9vdXQpIHsKKwkJaWYgKHBpcGUoZmRvdXQpIDwgMCkgeworCQkJaWYgKG5lZWRfaW4pCisJCQkJY2xvc2VfcGFpcihmZGluKTsKKwkJCWVsc2UgaWYgKGNtZC0+aW4pCisJCQkJY2xvc2UoY21kLT5pbik7CisJCQlyZXR1cm4gLUVSUl9SVU5fQ09NTUFORF9QSVBFOworCQl9CisJCWNtZC0+b3V0ID0gZmRvdXRbMF07CisJfQorCisJbmVlZF9lcnIgPSAhY21kLT5ub19zdGRlcnIgJiYgY21kLT5lcnIgPCAwOworCWlmIChuZWVkX2VycikgeworCQlpZiAocGlwZShmZGVycikgPCAwKSB7CisJCQlpZiAobmVlZF9pbikKKwkJCQljbG9zZV9wYWlyKGZkaW4pOworCQkJZWxzZSBpZiAoY21kLT5pbikKKwkJCQljbG9zZShjbWQtPmluKTsKKwkJCWlmIChuZWVkX291dCkKKwkJCQljbG9zZV9wYWlyKGZkb3V0KTsKKwkJCWVsc2UgaWYgKGNtZC0+b3V0KQorCQkJCWNsb3NlKGNtZC0+b3V0KTsKKwkJCXJldHVybiAtRVJSX1JVTl9DT01NQU5EX1BJUEU7CisJCX0KKwkJY21kLT5lcnIgPSBmZGVyclswXTsKKwl9CisKKwljbWQtPnBpZCA9IGZvcmsoKTsKKwlpZiAoY21kLT5waWQgPCAwKSB7CisJCWlmIChuZWVkX2luKQorCQkJY2xvc2VfcGFpcihmZGluKTsKKwkJZWxzZSBpZiAoY21kLT5pbikKKwkJCWNsb3NlKGNtZC0+aW4pOworCQlpZiAobmVlZF9vdXQpCisJCQljbG9zZV9wYWlyKGZkb3V0KTsKKwkJZWxzZSBpZiAoY21kLT5vdXQpCisJCQljbG9zZShjbWQtPm91dCk7CisJCWlmIChuZWVkX2VycikKKwkJCWNsb3NlX3BhaXIoZmRlcnIpOworCQlyZXR1cm4gLUVSUl9SVU5fQ09NTUFORF9GT1JLOworCX0KKworCWlmICghY21kLT5waWQpIHsKKwkJaWYgKGNtZC0+bm9fc3RkaW4pCisJCQlkdXBfZGV2bnVsbCgwKTsKKwkJZWxzZSBpZiAobmVlZF9pbikgeworCQkJZHVwMihmZGluWzBdLCAwKTsKKwkJCWNsb3NlX3BhaXIoZmRpbik7CisJCX0gZWxzZSBpZiAoY21kLT5pbikgeworCQkJZHVwMihjbWQtPmluLCAwKTsKKwkJCWNsb3NlKGNtZC0+aW4pOworCQl9CisKKwkJaWYgKGNtZC0+bm9fc3RkZXJyKQorCQkJZHVwX2Rldm51bGwoMik7CisJCWVsc2UgaWYgKG5lZWRfZXJyKSB7CisJCQlkdXAyKGZkZXJyWzFdLCAyKTsKKwkJCWNsb3NlX3BhaXIoZmRlcnIpOworCQl9CisKKwkJaWYgKGNtZC0+bm9fc3Rkb3V0KQorCQkJZHVwX2Rldm51bGwoMSk7CisJCWVsc2UgaWYgKGNtZC0+c3Rkb3V0X3RvX3N0ZGVycikKKwkJCWR1cDIoMiwgMSk7CisJCWVsc2UgaWYgKG5lZWRfb3V0KSB7CisJCQlkdXAyKGZkb3V0WzFdLCAxKTsKKwkJCWNsb3NlX3BhaXIoZmRvdXQpOworCQl9IGVsc2UgaWYgKGNtZC0+b3V0ID4gMSkgeworCQkJZHVwMihjbWQtPm91dCwgMSk7CisJCQljbG9zZShjbWQtPm91dCk7CisJCX0KKworCQlpZiAoY21kLT5kaXIgJiYgY2hkaXIoY21kLT5kaXIpKQorCQkJZGllKCJleGVjICVzOiBjZCB0byAlcyBmYWlsZWQgKCVzKSIsIGNtZC0+YXJndlswXSwKKwkJCSAgICBjbWQtPmRpciwgc3RyZXJyb3IoZXJybm8pKTsKKwkJaWYgKGNtZC0+ZW52KSB7CisJCQlmb3IgKDsgKmNtZC0+ZW52OyBjbWQtPmVudisrKSB7CisJCQkJaWYgKHN0cmNocigqY21kLT5lbnYsICc9JykpCisJCQkJCXB1dGVudigoY2hhciopKmNtZC0+ZW52KTsKKwkJCQllbHNlCisJCQkJCXVuc2V0ZW52KCpjbWQtPmVudik7CisJCQl9CisJCX0KKwkJaWYgKGNtZC0+Z2l0X2NtZCkgeworCQkJZXhlY3ZfZ2l0X2NtZChjbWQtPmFyZ3YpOworCQl9IGVsc2UgeworCQkJZXhlY3ZwKGNtZC0+YXJndlswXSwgKGNoYXIgKmNvbnN0KikgY21kLT5hcmd2KTsKKwkJfQorCQlkaWUoImV4ZWMgJXMgZmFpbGVkLiIsIGNtZC0+YXJndlswXSk7CisJfQorCisJaWYgKG5lZWRfaW4pCisJCWNsb3NlKGZkaW5bMF0pOworCWVsc2UgaWYgKGNtZC0+aW4pCisJCWNsb3NlKGNtZC0+aW4pOworCisJaWYgKG5lZWRfb3V0KQorCQljbG9zZShmZG91dFsxXSk7CisJZWxzZSBpZiAoY21kLT5vdXQpCisJCWNsb3NlKGNtZC0+b3V0KTsKKworCWlmIChuZWVkX2VycikKKwkJY2xvc2UoZmRlcnJbMV0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2FpdF9vcl93aGluZShwaWRfdCBwaWQpCit7CisJZm9yICg7OykgeworCQlpbnQgc3RhdHVzLCBjb2RlOworCQlwaWRfdCB3YWl0aW5nID0gd2FpdHBpZChwaWQsICZzdGF0dXMsIDApOworCisJCWlmICh3YWl0aW5nIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJCWNvbnRpbnVlOworCQkJZXJyb3IoIndhaXRwaWQgZmFpbGVkICglcykiLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIC1FUlJfUlVOX0NPTU1BTkRfV0FJVFBJRDsKKwkJfQorCQlpZiAod2FpdGluZyAhPSBwaWQpCisJCQlyZXR1cm4gLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1dST05HX1BJRDsKKwkJaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpCisJCQlyZXR1cm4gLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1NJR05BTDsKKworCQlpZiAoIVdJRkVYSVRFRChzdGF0dXMpKQorCQkJcmV0dXJuIC1FUlJfUlVOX0NPTU1BTkRfV0FJVFBJRF9OT0VYSVQ7CisJCWNvZGUgPSBXRVhJVFNUQVRVUyhzdGF0dXMpOworCQlpZiAoY29kZSkKKwkJCXJldHVybiAtY29kZTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitpbnQgZmluaXNoX2NvbW1hbmQoc3RydWN0IGNoaWxkX3Byb2Nlc3MgKmNtZCkKK3sKKwlyZXR1cm4gd2FpdF9vcl93aGluZShjbWQtPnBpZCk7Cit9CisKK2ludCBydW5fY29tbWFuZChzdHJ1Y3QgY2hpbGRfcHJvY2VzcyAqY21kKQoreworCWludCBjb2RlID0gc3RhcnRfY29tbWFuZChjbWQpOworCWlmIChjb2RlKQorCQlyZXR1cm4gY29kZTsKKwlyZXR1cm4gZmluaXNoX2NvbW1hbmQoY21kKTsKK30KKworc3RhdGljIHZvaWQgcHJlcGFyZV9ydW5fY29tbWFuZF92X29wdChzdHJ1Y3QgY2hpbGRfcHJvY2VzcyAqY21kLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKiphcmd2LAorCQkJCSAgICAgIGludCBvcHQpCit7CisJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKCpjbWQpKTsKKwljbWQtPmFyZ3YgPSBhcmd2OworCWNtZC0+bm9fc3RkaW4gPSBvcHQgJiBSVU5fQ09NTUFORF9OT19TVERJTiA/IDEgOiAwOworCWNtZC0+Z2l0X2NtZCA9IG9wdCAmIFJVTl9HSVRfQ01EID8gMSA6IDA7CisJY21kLT5zdGRvdXRfdG9fc3RkZXJyID0gb3B0ICYgUlVOX0NPTU1BTkRfU1RET1VUX1RPX1NUREVSUiA/IDEgOiAwOworfQorCitpbnQgcnVuX2NvbW1hbmRfdl9vcHQoY29uc3QgY2hhciAqKmFyZ3YsIGludCBvcHQpCit7CisJc3RydWN0IGNoaWxkX3Byb2Nlc3MgY21kOworCXByZXBhcmVfcnVuX2NvbW1hbmRfdl9vcHQoJmNtZCwgYXJndiwgb3B0KTsKKwlyZXR1cm4gcnVuX2NvbW1hbmQoJmNtZCk7Cit9CisKK2ludCBydW5fY29tbWFuZF92X29wdF9jZChjb25zdCBjaGFyICoqYXJndiwgaW50IG9wdCwgY29uc3QgY2hhciAqZGlyKQoreworCXN0cnVjdCBjaGlsZF9wcm9jZXNzIGNtZDsKKwlwcmVwYXJlX3J1bl9jb21tYW5kX3Zfb3B0KCZjbWQsIGFyZ3YsIG9wdCk7CisJY21kLmRpciA9IGRpcjsKKwlyZXR1cm4gcnVuX2NvbW1hbmQoJmNtZCk7Cit9CisKK2ludCBydW5fY29tbWFuZF92X29wdF9jZF9lbnYoY29uc3QgY2hhciAqKmFyZ3YsIGludCBvcHQsIGNvbnN0IGNoYXIgKmRpciwgY29uc3QgY2hhciAqY29uc3QgKmVudikKK3sKKwlzdHJ1Y3QgY2hpbGRfcHJvY2VzcyBjbWQ7CisJcHJlcGFyZV9ydW5fY29tbWFuZF92X29wdCgmY21kLCBhcmd2LCBvcHQpOworCWNtZC5kaXIgPSBkaXI7CisJY21kLmVudiA9IGVudjsKKwlyZXR1cm4gcnVuX2NvbW1hbmQoJmNtZCk7Cit9CisKK2ludCBzdGFydF9hc3luYyhzdHJ1Y3QgYXN5bmMgKmFzeW5jKQoreworCWludCBwaXBlX291dFsyXTsKKworCWlmIChwaXBlKHBpcGVfb3V0KSA8IDApCisJCXJldHVybiBlcnJvcigiY2Fubm90IGNyZWF0ZSBwaXBlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisKKwlhc3luYy0+cGlkID0gZm9yaygpOworCWlmIChhc3luYy0+cGlkIDwgMCkgeworCQllcnJvcigiZm9yayAoYXN5bmMpIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQljbG9zZV9wYWlyKHBpcGVfb3V0KTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIWFzeW5jLT5waWQpIHsKKwkJY2xvc2UocGlwZV9vdXRbMF0pOworCQlleGl0KCEhYXN5bmMtPnByb2MocGlwZV9vdXRbMV0sIGFzeW5jLT5kYXRhKSk7CisJfQorCWFzeW5jLT5vdXQgPSBwaXBlX291dFswXTsKKwljbG9zZShwaXBlX291dFsxXSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBmaW5pc2hfYXN5bmMoc3RydWN0IGFzeW5jICphc3luYykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICh3YWl0X29yX3doaW5lKGFzeW5jLT5waWQpKQorCQlyZXQgPSBlcnJvcigid2FpdHBpZCAoYXN5bmMpIGZhaWxlZCIpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9ydW4tY29tbWFuZC5oIGIvcnVuLWNvbW1hbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWJlMzA3Ci0tLSAvZGV2L251bGwKKysrIGIvcnVuLWNvbW1hbmQuaApAQCAtMCwwICsxLDg1IEBACisjaWZuZGVmIFJVTl9DT01NQU5EX0gKKyNkZWZpbmUgUlVOX0NPTU1BTkRfSAorCitlbnVtIHsKKwlFUlJfUlVOX0NPTU1BTkRfRk9SSyA9IDEwMDAwLAorCUVSUl9SVU5fQ09NTUFORF9FWEVDLAorCUVSUl9SVU5fQ09NTUFORF9QSVBFLAorCUVSUl9SVU5fQ09NTUFORF9XQUlUUElELAorCUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1dST05HX1BJRCwKKwlFUlJfUlVOX0NPTU1BTkRfV0FJVFBJRF9TSUdOQUwsCisJRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfTk9FWElULAorfTsKKworc3RydWN0IGNoaWxkX3Byb2Nlc3MgeworCWNvbnN0IGNoYXIgKiphcmd2OworCXBpZF90IHBpZDsKKwkvKgorCSAqIFVzaW5nIC5pbiwgLm91dCwgLmVycjoKKwkgKiAtIFNwZWNpZnkgMCBmb3Igbm8gcmVkaXJlY3Rpb25zIChjaGlsZCBpbmhlcml0cyBzdGRpbiwgc3Rkb3V0LAorCSAqICAgc3RkZXJyIGZyb20gcGFyZW50KS4KKwkgKiAtIFNwZWNpZnkgLTEgdG8gaGF2ZSBhIHBpcGUgYWxsb2NhdGVkIGFzIGZvbGxvd3M6CisJICogICAgIC5pbjogcmV0dXJucyB0aGUgd3JpdGFibGUgcGlwZSBlbmQ7IHBhcmVudCB3cml0ZXMgdG8gaXQsCisJICogICAgICAgICAgdGhlIHJlYWRhYmxlIHBpcGUgZW5kIGJlY29tZXMgY2hpbGQncyBzdGRpbgorCSAqICAgICAub3V0LCAuZXJyOiByZXR1cm5zIHRoZSByZWFkYWJsZSBwaXBlIGVuZDsgcGFyZW50IHJlYWRzIGZyb20KKwkgKiAgICAgICAgICBpdCwgdGhlIHdyaXRhYmxlIHBpcGUgZW5kIGJlY29tZXMgY2hpbGQncyBzdGRvdXQvc3RkZXJyCisJICogICBUaGUgY2FsbGVyIG9mIHN0YXJ0X2NvbW1hbmQoKSBtdXN0IGNsb3NlIHRoZSByZXR1cm5lZCBGRHMKKwkgKiAgIGFmdGVyIGl0IGhhcyBjb21wbGV0ZWQgcmVhZGluZyBmcm9tL3dyaXRpbmcgdG8gaXQhCisJICogLSBTcGVjaWZ5ID4gMCB0byBzZXQgYSBjaGFubmVsIHRvIGEgcGFydGljdWxhciBGRCBhcyBmb2xsb3dzOgorCSAqICAgICAuaW46IGEgcmVhZGFibGUgRkQsIGJlY29tZXMgY2hpbGQncyBzdGRpbgorCSAqICAgICAub3V0OiBhIHdyaXRhYmxlIEZELCBiZWNvbWVzIGNoaWxkJ3Mgc3Rkb3V0L3N0ZGVycgorCSAqICAgICAuZXJyID4gMCBub3Qgc3VwcG9ydGVkCisJICogICBUaGUgc3BlY2lmaWVkIEZEIGlzIGNsb3NlZCBieSBzdGFydF9jb21tYW5kKCksIGV2ZW4gaW4gY2FzZQorCSAqICAgb2YgZXJyb3JzIQorCSAqLworCWludCBpbjsKKwlpbnQgb3V0OworCWludCBlcnI7CisJY29uc3QgY2hhciAqZGlyOworCWNvbnN0IGNoYXIgKmNvbnN0ICplbnY7CisJdW5zaWduZWQgbm9fc3RkaW46MTsKKwl1bnNpZ25lZCBub19zdGRvdXQ6MTsKKwl1bnNpZ25lZCBub19zdGRlcnI6MTsKKwl1bnNpZ25lZCBnaXRfY21kOjE7IC8qIGlmIHRoaXMgaXMgdG8gYmUgZ2l0IHN1Yi1jb21tYW5kICovCisJdW5zaWduZWQgc3Rkb3V0X3RvX3N0ZGVycjoxOworfTsKKworaW50IHN0YXJ0X2NvbW1hbmQoc3RydWN0IGNoaWxkX3Byb2Nlc3MgKik7CitpbnQgZmluaXNoX2NvbW1hbmQoc3RydWN0IGNoaWxkX3Byb2Nlc3MgKik7CitpbnQgcnVuX2NvbW1hbmQoc3RydWN0IGNoaWxkX3Byb2Nlc3MgKik7CisKKyNkZWZpbmUgUlVOX0NPTU1BTkRfTk9fU1RESU4gMQorI2RlZmluZSBSVU5fR0lUX0NNRAkgICAgIDIJLypJZiB0aGlzIGlzIHRvIGJlIGdpdCBzdWItY29tbWFuZCAqLworI2RlZmluZSBSVU5fQ09NTUFORF9TVERPVVRfVE9fU1RERVJSIDQKK2ludCBydW5fY29tbWFuZF92X29wdChjb25zdCBjaGFyICoqYXJndiwgaW50IG9wdCk7CitpbnQgcnVuX2NvbW1hbmRfdl9vcHRfY2QoY29uc3QgY2hhciAqKmFyZ3YsIGludCBvcHQsIGNvbnN0IGNoYXIgKmRpcik7CisKKy8qCisgKiBlbnYgKHRoZSBlbnZpcm9ubWVudCkgaXMgdG8gYmUgZm9ybWF0dGVkIGxpa2UgZW52aXJvbjogIlZBUj1WQUxVRSIuCisgKiBUbyB1bnNldCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB1c2UganVzdCAiVkFSIi4KKyAqLworaW50IHJ1bl9jb21tYW5kX3Zfb3B0X2NkX2Vudihjb25zdCBjaGFyICoqYXJndiwgaW50IG9wdCwgY29uc3QgY2hhciAqZGlyLCBjb25zdCBjaGFyICpjb25zdCAqZW52KTsKKworLyoKKyAqIFRoZSBwdXJwb3NlIG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGlzIHRvIGZlZWQgYSBwaXBlIGJ5IHJ1bm5pbmcKKyAqIGEgZnVuY3Rpb24gYXN5bmNocm9ub3VzbHkgYW5kIHByb3ZpZGluZyBvdXRwdXQgdGhhdCB0aGUgY2FsbGVyIHJlYWRzLgorICoKKyAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgbm8gc3luY2hyb25pemF0aW9uIGFuZCBtdXR1YWwgZXhjbHVzaW9uIGJldHdlZW4KKyAqIHRoZSBjYWxsZXIgYW5kIHRoZSBmZWVkIGZ1bmN0aW9uIGlzIG5lY2Vzc2FyeSBzbyB0aGF0IHRoZSBmdW5jdGlvbgorICogY2FuIHJ1biBpbiBhIHRocmVhZCB3aXRob3V0IGludGVyZmVyaW5nIHdpdGggdGhlIGNhbGxlci4KKyAqLworc3RydWN0IGFzeW5jIHsKKwkvKgorCSAqIHByb2Mgd3JpdGVzIHRvIGZkIGFuZCBjbG9zZXMgaXQ7CisJICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGZhaWx1cmUKKwkgKi8KKwlpbnQgKCpwcm9jKShpbnQgZmQsIHZvaWQgKmRhdGEpOworCXZvaWQgKmRhdGE7CisJaW50IG91dDsJLyogY2FsbGVyIHJlYWRzIGZyb20gaGVyZSBhbmQgY2xvc2VzIGl0ICovCisJcGlkX3QgcGlkOworfTsKKworaW50IHN0YXJ0X2FzeW5jKHN0cnVjdCBhc3luYyAqYXN5bmMpOworaW50IGZpbmlzaF9hc3luYyhzdHJ1Y3QgYXN5bmMgKmFzeW5jKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZW5kLXBhY2suaCBiL3NlbmQtcGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZjFkYzMKLS0tIC9kZXYvbnVsbAorKysgYi9zZW5kLXBhY2suaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIFNFTkRfUEFDS19ICisjZGVmaW5lIFNFTkRfUEFDS19ICisKK3N0cnVjdCBzZW5kX3BhY2tfYXJncyB7CisJY29uc3QgY2hhciAqcmVjZWl2ZXBhY2s7CisJdW5zaWduZWQgdmVyYm9zZToxLAorCQlzZW5kX2FsbDoxLAorCQlzZW5kX21pcnJvcjoxLAorCQlmb3JjZV91cGRhdGU6MSwKKwkJdXNlX3RoaW5fcGFjazoxLAorCQlkcnlfcnVuOjE7Cit9OworCitpbnQgc2VuZF9wYWNrKHN0cnVjdCBzZW5kX3BhY2tfYXJncyAqYXJncywKKwkgICAgICBjb25zdCBjaGFyICpkZXN0LCBzdHJ1Y3QgcmVtb3RlICpyZW1vdGUsCisJICAgICAgaW50IG5yX2hlYWRzLCBjb25zdCBjaGFyICoqaGVhZHMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZlci1pbmZvLmMgYi9zZXJ2ZXItaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYzA3M2IKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2ZXItaW5mby5jCkBAIC0wLDAgKzEsMjUyIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidGFnLmgiCisKKy8qIHJlZnMgKi8KK3N0YXRpYyBGSUxFICppbmZvX3JlZl9mcDsKKworc3RhdGljIGludCBhZGRfaW5mb19yZWYoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZsYWcsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IG9iamVjdCAqbyA9IHBhcnNlX29iamVjdChzaGExKTsKKwlpZiAoIW8pCisJCXJldHVybiAtMTsKKworCWZwcmludGYoaW5mb19yZWZfZnAsICIlcwklc1xuIiwgc2hhMV90b19oZXgoc2hhMSksIHBhdGgpOworCWlmIChvLT50eXBlID09IE9CSl9UQUcpIHsKKwkJbyA9IGRlcmVmX3RhZyhvLCBwYXRoLCAwKTsKKwkJaWYgKG8pCisJCQlmcHJpbnRmKGluZm9fcmVmX2ZwLCAiJXMJJXNee31cbiIsCisJCQkJc2hhMV90b19oZXgoby0+c2hhMSksIHBhdGgpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1cGRhdGVfaW5mb19yZWZzKGludCBmb3JjZSkKK3sKKwljaGFyICpwYXRoMCA9IHhzdHJkdXAoZ2l0X3BhdGgoImluZm8vcmVmcyIpKTsKKwlpbnQgbGVuID0gc3RybGVuKHBhdGgwKTsKKwljaGFyICpwYXRoMSA9IHhtYWxsb2MobGVuICsgMik7CisKKwlzdHJjcHkocGF0aDEsIHBhdGgwKTsKKwlzdHJjcHkocGF0aDEgKyBsZW4sICIrIik7CisKKwlzYWZlX2NyZWF0ZV9sZWFkaW5nX2RpcmVjdG9yaWVzKHBhdGgwKTsKKwlpbmZvX3JlZl9mcCA9IGZvcGVuKHBhdGgxLCAidyIpOworCWlmICghaW5mb19yZWZfZnApCisJCXJldHVybiBlcnJvcigidW5hYmxlIHRvIHVwZGF0ZSAlcyIsIHBhdGgxKTsKKwlmb3JfZWFjaF9yZWYoYWRkX2luZm9fcmVmLCBOVUxMKTsKKwlmY2xvc2UoaW5mb19yZWZfZnApOworCWFkanVzdF9zaGFyZWRfcGVybShwYXRoMSk7CisJcmVuYW1lKHBhdGgxLCBwYXRoMCk7CisJZnJlZShwYXRoMCk7CisJZnJlZShwYXRoMSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHBhY2tzICovCitzdGF0aWMgc3RydWN0IHBhY2tfaW5mbyB7CisJc3RydWN0IHBhY2tlZF9naXQgKnA7CisJaW50IG9sZF9udW07CisJaW50IG5ld19udW07CisJaW50IG5yX2FsbG9jOworCWludCBucl9oZWFkczsKKwl1bnNpZ25lZCBjaGFyICgqaGVhZClbMjBdOworfSAqKmluZm87CitzdGF0aWMgaW50IG51bV9wYWNrOworc3RhdGljIGNvbnN0IGNoYXIgKm9iamRpcjsKK3N0YXRpYyBpbnQgb2JqZGlybGVuOworCitzdGF0aWMgc3RydWN0IHBhY2tfaW5mbyAqZmluZF9wYWNrX2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhY2s7IGkrKykgeworCQlzdHJ1Y3QgcGFja2VkX2dpdCAqcCA9IGluZm9baV0tPnA7CisJCS8qIHNraXAgIi9wYWNrLyIgYWZ0ZXIgIi5naXQvb2JqZWN0cyIgKi8KKwkJaWYgKCFzdHJjbXAocC0+cGFja19uYW1lICsgb2JqZGlybGVuICsgNiwgbmFtZSkpCisJCQlyZXR1cm4gaW5mb1tpXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFJldHVybnMgbm9uLXplcm8gd2hlbiB3ZSBkZXRlY3QgdGhhdCB0aGUgaW5mbyBpbiB0aGUKKyAqIG9sZCBmaWxlIGlzIHVzZWxlc3MuCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfcGFja19kZWYoY29uc3QgY2hhciAqbGluZSwgaW50IG9sZF9jbnQpCit7CisJc3RydWN0IHBhY2tfaW5mbyAqaSA9IGZpbmRfcGFja19ieV9uYW1lKGxpbmUgKyAyKTsKKwlpZiAoaSkgeworCQlpLT5vbGRfbnVtID0gb2xkX2NudDsKKwkJcmV0dXJuIDA7CisJfQorCWVsc2UgeworCQkvKiBUaGUgZmlsZSBkZXNjcmliZXMgYSBwYWNrIHRoYXQgaXMgbm8gbG9uZ2VyIGhlcmUgKi8KKwkJcmV0dXJuIDE7CisJfQorfQorCisvKiBSZXR1cm5zIG5vbi16ZXJvIHdoZW4gd2UgZGV0ZWN0IHRoYXQgdGhlIGluZm8gaW4gdGhlCisgKiBvbGQgZmlsZSBpcyB1c2VsZXNzLgorICovCitzdGF0aWMgaW50IHJlYWRfcGFja19pbmZvX2ZpbGUoY29uc3QgY2hhciAqaW5mb2ZpbGUpCit7CisJRklMRSAqZnA7CisJY2hhciBsaW5lWzEwMDBdOworCWludCBvbGRfY250ID0gMDsKKworCWZwID0gZm9wZW4oaW5mb2ZpbGUsICJyIik7CisJaWYgKCFmcCkKKwkJcmV0dXJuIDE7IC8qIG5vbmV4aXN0ZW50IGlzIG5vdCBhbiBlcnJvci4gKi8KKworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgeworCQlpbnQgbGVuID0gc3RybGVuKGxpbmUpOworCQlpZiAobGVuICYmIGxpbmVbbGVuLTFdID09ICdcbicpCisJCQlsaW5lWy0tbGVuXSA9IDA7CisKKwkJaWYgKCFsZW4pCisJCQljb250aW51ZTsKKworCQlzd2l0Y2ggKGxpbmVbMF0pIHsKKwkJY2FzZSAnUCc6IC8qIFAgbmFtZSAqLworCQkJaWYgKHBhcnNlX3BhY2tfZGVmKGxpbmUsIG9sZF9jbnQrKykpCisJCQkJZ290byBvdXRfc3RhbGU7CisJCQlicmVhazsKKwkJY2FzZSAnRCc6IC8qIHdlIHVzZWQgdG8gZW1pdCBEIGJ1dCB0aGF0IHdhcyBtaXNndWlkZWQuICovCisJCQlnb3RvIG91dF9zdGFsZTsKKwkJCWJyZWFrOworCQljYXNlICdUJzogLyogd2UgdXNlZCB0byBlbWl0IFQgYnV0IG5vYm9keSB1c2VzIGl0LiAqLworCQkJZ290byBvdXRfc3RhbGU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVycm9yKCJ1bnJlY29nbml6ZWQ6ICVzIiwgbGluZSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlmY2xvc2UoZnApOworCXJldHVybiAwOworIG91dF9zdGFsZToKKwlmY2xvc2UoZnApOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNvbXBhcmVfaW5mbyhjb25zdCB2b2lkICphXywgY29uc3Qgdm9pZCAqYl8pCit7CisJc3RydWN0IHBhY2tfaW5mbyAqIGNvbnN0KiBhID0gYV87CisJc3RydWN0IHBhY2tfaW5mbyAqIGNvbnN0KiBiID0gYl87CisKKwlpZiAoMCA8PSAoKmEpLT5vbGRfbnVtICYmIDAgPD0gKCpiKS0+b2xkX251bSkKKwkJLyogS2VlcCB0aGUgb3JkZXIgaW4gdGhlIG9yaWdpbmFsICovCisJCXJldHVybiAoKmEpLT5vbGRfbnVtIC0gKCpiKS0+b2xkX251bTsKKwllbHNlIGlmICgwIDw9ICgqYSktPm9sZF9udW0pCisJCS8qIE9ubHkgQSBleGlzdGVkIGluIHRoZSBvcmlnaW5hbCBzbyBCIGlzIG9idmlvdXNseSBuZXdlciAqLworCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAoMCA8PSAoKmIpLT5vbGRfbnVtKQorCQkvKiBUaGUgb3RoZXIgd2F5IGFyb3VuZC4gKi8KKwkJcmV0dXJuIDE7CisKKwkvKiB0aGVuIGl0IGRvZXMgbm90IG1hdHRlciBidXQgYXQgbGVhc3Qga2VlcCB0aGUgY29tcGFyaXNvbiBzdGFibGUgKi8KKwlpZiAoKCphKS0+cCA9PSAoKmIpLT5wKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmICgoKmEpLT5wIDwgKCpiKS0+cCkKKwkJcmV0dXJuIC0xOworCWVsc2UKKwkJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfcGFja19pbmZvKGNvbnN0IGNoYXIgKmluZm9maWxlLCBpbnQgZm9yY2UpCit7CisJc3RydWN0IHBhY2tlZF9naXQgKnA7CisJaW50IHN0YWxlOworCWludCBpID0gMDsKKworCW9iamRpciA9IGdldF9vYmplY3RfZGlyZWN0b3J5KCk7CisJb2JqZGlybGVuID0gc3RybGVuKG9iamRpcik7CisKKwlwcmVwYXJlX3BhY2tlZF9naXQoKTsKKwlmb3IgKHAgPSBwYWNrZWRfZ2l0OyBwOyBwID0gcC0+bmV4dCkgeworCQkvKiB3ZSBpZ25vcmUgdGhpbmdzIG9uIGFsdGVybmF0ZSBwYXRoIHNpbmNlIHRoZXkgYXJlCisJCSAqIG5vdCBhdmFpbGFibGUgdG8gdGhlIHB1bGxlcnMgaW4gZ2VuZXJhbC4KKwkJICovCisJCWlmICghcC0+cGFja19sb2NhbCkKKwkJCWNvbnRpbnVlOworCQlpKys7CisJfQorCW51bV9wYWNrID0gaTsKKwlpbmZvID0geGNhbGxvYyhudW1fcGFjaywgc2l6ZW9mKHN0cnVjdCBwYWNrX2luZm8gKikpOworCWZvciAoaSA9IDAsIHAgPSBwYWNrZWRfZ2l0OyBwOyBwID0gcC0+bmV4dCkgeworCQlpZiAoIXAtPnBhY2tfbG9jYWwpCisJCQljb250aW51ZTsKKwkJaW5mb1tpXSA9IHhjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwYWNrX2luZm8pKTsKKwkJaW5mb1tpXS0+cCA9IHA7CisJCWluZm9baV0tPm9sZF9udW0gPSAtMTsKKwkJaSsrOworCX0KKworCWlmIChpbmZvZmlsZSAmJiAhZm9yY2UpCisJCXN0YWxlID0gcmVhZF9wYWNrX2luZm9fZmlsZShpbmZvZmlsZSk7CisJZWxzZQorCQlzdGFsZSA9IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhY2s7IGkrKykgeworCQlpZiAoc3RhbGUpIHsKKwkJCWluZm9baV0tPm9sZF9udW0gPSAtMTsKKwkJCWluZm9baV0tPm5yX2hlYWRzID0gMDsKKwkJfQorCX0KKworCS8qIHJlbnVtYmVyIHRoZW0gKi8KKwlxc29ydChpbmZvLCBudW1fcGFjaywgc2l6ZW9mKGluZm9bMF0pLCBjb21wYXJlX2luZm8pOworCWZvciAoaSA9IDA7IGkgPCBudW1fcGFjazsgaSsrKQorCQlpbmZvW2ldLT5uZXdfbnVtID0gaTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfcGFja19pbmZvX2ZpbGUoRklMRSAqZnApCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG51bV9wYWNrOyBpKyspCisJCWZwcmludGYoZnAsICJQICVzXG4iLCBpbmZvW2ldLT5wLT5wYWNrX25hbWUgKyBvYmpkaXJsZW4gKyA2KTsKKwlmcHV0YygnXG4nLCBmcCk7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX2luZm9fcGFja3MoaW50IGZvcmNlKQoreworCWNoYXIgaW5mb2ZpbGVbUEFUSF9NQVhdOworCWNoYXIgbmFtZVtQQVRIX01BWF07CisJaW50IG5hbWVsZW47CisJRklMRSAqZnA7CisKKwluYW1lbGVuID0gc3ByaW50ZihpbmZvZmlsZSwgIiVzL2luZm8vcGFja3MiLCBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpKTsKKwlzdHJjcHkobmFtZSwgaW5mb2ZpbGUpOworCXN0cmNweShuYW1lICsgbmFtZWxlbiwgIisiKTsKKworCWluaXRfcGFja19pbmZvKGluZm9maWxlLCBmb3JjZSk7CisKKwlzYWZlX2NyZWF0ZV9sZWFkaW5nX2RpcmVjdG9yaWVzKG5hbWUpOworCWZwID0gZm9wZW4obmFtZSwgInciKTsKKwlpZiAoIWZwKQorCQlyZXR1cm4gZXJyb3IoImNhbm5vdCBvcGVuICVzIiwgbmFtZSk7CisJd3JpdGVfcGFja19pbmZvX2ZpbGUoZnApOworCWZjbG9zZShmcCk7CisJYWRqdXN0X3NoYXJlZF9wZXJtKG5hbWUpOworCXJlbmFtZShuYW1lLCBpbmZvZmlsZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHB1YmxpYyAqLworaW50IHVwZGF0ZV9zZXJ2ZXJfaW5mbyhpbnQgZm9yY2UpCit7CisJLyogV2Ugd291bGQgYWRkIG1vcmUgZHVtYi1zZXJ2ZXIgc3VwcG9ydCBmaWxlcyBsYXRlciwKKwkgKiBpbmNsdWRpbmcgaW5kZXggb2YgYXZhaWxhYmxlIHBhY2sgZmlsZXMgYW5kIHRoZWlyCisJICogaW50ZW5kZWQgYXVkaWVuY2VzLgorCSAqLworCWludCBlcnJzID0gMDsKKworCWVycnMgPSBlcnJzIHwgdXBkYXRlX2luZm9fcmVmcyhmb3JjZSk7CisJZXJycyA9IGVycnMgfCB1cGRhdGVfaW5mb19wYWNrcyhmb3JjZSk7CisKKwkvKiByZW1vdmUgbGVmdG92ZXIgcmV2LWNhY2hlIGZpbGUgaWYgdGhlcmUgaXMgYW55ICovCisJdW5saW5rKGdpdF9wYXRoKCJpbmZvL3Jldi1jYWNoZSIpKTsKKworCXJldHVybiBlcnJzOworfQpkaWZmIC0tZ2l0IGEvc2V0dXAuYyBiL3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QyZDk1OAotLS0gL2Rldi9udWxsCisrKyBiL3NldHVwLmMKQEAgLTAsMCArMSw0ODggQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImRpci5oIgorCitzdGF0aWMgaW50IGluc2lkZV9naXRfZGlyID0gLTE7CitzdGF0aWMgaW50IGluc2lkZV93b3JrX3RyZWUgPSAtMTsKKworc3RhdGljIGludCBzYW5pdGFyeV9wYXRoX2NvcHkoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMpCit7CisJY2hhciAqZHN0MCA9IGRzdDsKKworCWlmICgqc3JjID09ICcvJykgeworCQkqZHN0KysgPSAnLyc7CisJCXdoaWxlICgqc3JjID09ICcvJykKKwkJCXNyYysrOworCX0KKworCWZvciAoOzspIHsKKwkJY2hhciBjID0gKnNyYzsKKworCQkvKgorCQkgKiBBIHBhdGggY29tcG9uZW50IHRoYXQgYmVnaW5zIHdpdGggLiBjb3VsZCBiZQorCQkgKiBzcGVjaWFsOgorCQkgKiAoMSkgIi4iIGFuZCBlbmRzICAgLS0gaWdub3JlIGFuZCB0ZXJtaW5hdGUuCisJCSAqICgyKSAiLi8iICAgICAgICAgICAtLSBpZ25vcmUgdGhlbSwgZWF0IHNsYXNoIGFuZCBjb250aW51ZS4KKwkJICogKDMpICIuLiIgYW5kIGVuZHMgIC0tIHN0cmlwIG9uZSBhbmQgdGVybWluYXRlLgorCQkgKiAoNCkgIi4uLyIgICAgICAgICAgLS0gc3RyaXAgb25lLCBlYXQgc2xhc2ggYW5kIGNvbnRpbnVlLgorCQkgKi8KKwkJaWYgKGMgPT0gJy4nKSB7CisJCQlzd2l0Y2ggKHNyY1sxXSkgeworCQkJY2FzZSAnXDAnOgorCQkJCS8qICgxKSAqLworCQkJCXNyYysrOworCQkJCWJyZWFrOworCQkJY2FzZSAnLyc6CisJCQkJLyogKDIpICovCisJCQkJc3JjICs9IDI7CisJCQkJd2hpbGUgKCpzcmMgPT0gJy8nKQorCQkJCQlzcmMrKzsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgJy4nOgorCQkJCXN3aXRjaCAoc3JjWzJdKSB7CisJCQkJY2FzZSAnXDAnOgorCQkJCQkvKiAoMykgKi8KKwkJCQkJc3JjICs9IDI7CisJCQkJCWdvdG8gdXBfb25lOworCQkJCWNhc2UgJy8nOgorCQkJCQkvKiAoNCkgKi8KKwkJCQkJc3JjICs9IDM7CisJCQkJCXdoaWxlICgqc3JjID09ICcvJykKKwkJCQkJCXNyYysrOworCQkJCQlnb3RvIHVwX29uZTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBjb3B5IHVwIHRvIHRoZSBuZXh0ICcvJywgYW5kIGVhdCBhbGwgJy8nICovCisJCXdoaWxlICgoYyA9ICpzcmMrKykgIT0gJ1wwJyAmJiBjICE9ICcvJykKKwkJCSpkc3QrKyA9IGM7CisJCWlmIChjID09ICcvJykgeworCQkJKmRzdCsrID0gYzsKKwkJCXdoaWxlIChjID09ICcvJykKKwkJCQljID0gKnNyYysrOworCQkJc3JjLS07CisJCX0gZWxzZSBpZiAoIWMpCisJCQlicmVhazsKKwkJY29udGludWU7CisKKwl1cF9vbmU6CisJCS8qCisJCSAqIGRzdDAuLmRzdCBpcyBwcmVmaXggcG9ydGlvbiwgYW5kIGRzdFstMV0gaXMgJy8nOworCQkgKiBnbyB1cCBvbmUgbGV2ZWwuCisJCSAqLworCQlkc3QgLT0gMjsgLyogZ28gcGFzdCB0cmFpbGluZyAnLycgaWYgYW55ICovCisJCWlmIChkc3QgPCBkc3QwKQorCQkJcmV0dXJuIC0xOworCQl3aGlsZSAoMSkgeworCQkJaWYgKGRzdCA8PSBkc3QwKQorCQkJCWJyZWFrOworCQkJYyA9ICpkc3QtLTsKKwkJCWlmIChjID09ICcvJykgeworCQkJCWRzdCArPSAyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCSpkc3QgPSAnXDAnOworCXJldHVybiAwOworfQorCitjb25zdCBjaGFyICpwcmVmaXhfcGF0aChjb25zdCBjaGFyICpwcmVmaXgsIGludCBsZW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJY29uc3QgY2hhciAqb3JpZyA9IHBhdGg7CisJY2hhciAqc2FuaXRpemVkID0geG1hbGxvYyhsZW4gKyBzdHJsZW4ocGF0aCkgKyAxKTsKKwlpZiAoaXNfYWJzb2x1dGVfcGF0aChvcmlnKSkKKwkJc3RyY3B5KHNhbml0aXplZCwgcGF0aCk7CisJZWxzZSB7CisJCWlmIChsZW4pCisJCQltZW1jcHkoc2FuaXRpemVkLCBwcmVmaXgsIGxlbik7CisJCXN0cmNweShzYW5pdGl6ZWQgKyBsZW4sIHBhdGgpOworCX0KKwlpZiAoc2FuaXRhcnlfcGF0aF9jb3B5KHNhbml0aXplZCwgc2FuaXRpemVkKSkKKwkJZ290byBlcnJvcl9vdXQ7CisJaWYgKGlzX2Fic29sdXRlX3BhdGgob3JpZykpIHsKKwkJY29uc3QgY2hhciAqd29ya190cmVlID0gZ2V0X2dpdF93b3JrX3RyZWUoKTsKKwkJc2l6ZV90IGxlbiA9IHN0cmxlbih3b3JrX3RyZWUpOworCQlzaXplX3QgdG90YWwgPSBzdHJsZW4oc2FuaXRpemVkKSArIDE7CisJCWlmIChzdHJuY21wKHNhbml0aXplZCwgd29ya190cmVlLCBsZW4pIHx8CisJCSAgICAoc2FuaXRpemVkW2xlbl0gIT0gJ1wwJyAmJiBzYW5pdGl6ZWRbbGVuXSAhPSAnLycpKSB7CisJCWVycm9yX291dDoKKwkJCWVycm9yKCInJXMnIGlzIG91dHNpZGUgcmVwb3NpdG9yeSIsIG9yaWcpOworCQkJZnJlZShzYW5pdGl6ZWQpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKHNhbml0aXplZFtsZW5dID09ICcvJykKKwkJCWxlbisrOworCQltZW1tb3ZlKHNhbml0aXplZCwgc2FuaXRpemVkICsgbGVuLCB0b3RhbCAtIGxlbik7CisJfQorCXJldHVybiBzYW5pdGl6ZWQ7Cit9CisKKy8qCisgKiBVbmxpa2UgcHJlZml4X3BhdGgsIHRoaXMgc2hvdWxkIGJlIHVzZWQgaWYgdGhlIG5hbWVkIGZpbGUgZG9lcworICogbm90IGhhdmUgdG8gaW50ZXJhY3Qgd2l0aCBpbmRleCBlbnRyeTsgaS5lLiBuYW1lIG9mIGEgcmFuZG9tIGZpbGUKKyAqIG9uIHRoZSBmaWxlc3lzdGVtLgorICovCitjb25zdCBjaGFyICpwcmVmaXhfZmlsZW5hbWUoY29uc3QgY2hhciAqcGZ4LCBpbnQgcGZ4X2xlbiwgY29uc3QgY2hhciAqYXJnKQoreworCXN0YXRpYyBjaGFyIHBhdGhbUEFUSF9NQVhdOworCWlmICghcGZ4IHx8ICEqcGZ4IHx8IGlzX2Fic29sdXRlX3BhdGgoYXJnKSkKKwkJcmV0dXJuIGFyZzsKKwltZW1jcHkocGF0aCwgcGZ4LCBwZnhfbGVuKTsKKwlzdHJjcHkocGF0aCArIHBmeF9sZW4sIGFyZyk7CisJcmV0dXJuIHBhdGg7Cit9CisKKy8qCisgKiBWZXJpZnkgYSBmaWxlbmFtZSB0aGF0IHdlIGdvdCBhcyBhbiBhcmd1bWVudCBmb3IgYSBwYXRoc3BlYworICogZW50cnkuIE5vdGUgdGhhdCBhIGZpbGVuYW1lIHRoYXQgYmVnaW5zIHdpdGggIi0iIG5ldmVyIHZlcmlmaWVzCisgKiBhcyB0cnVlLCBiZWNhdXNlIGV2ZW4gaWYgc3VjaCBhIGZpbGVuYW1lIHdlcmUgdG8gZXhpc3QsIHdlIHdhbnQKKyAqIGl0IHRvIGJlIHByZWNlZGVkIGJ5IHRoZSAiLS0iIG1hcmtlciAob3Igd2Ugd2FudCB0aGUgdXNlciB0bworICogdXNlIGEgZm9ybWF0IGxpa2UgIi4vLWZpbGVuYW1lIikKKyAqLwordm9pZCB2ZXJpZnlfZmlsZW5hbWUoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICphcmcpCit7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmICgqYXJnID09ICctJykKKwkJZGllKCJiYWQgZmxhZyAnJXMnIHVzZWQgYWZ0ZXIgZmlsZW5hbWUiLCBhcmcpOworCW5hbWUgPSBwcmVmaXggPyBwcmVmaXhfZmlsZW5hbWUocHJlZml4LCBzdHJsZW4ocHJlZml4KSwgYXJnKSA6IGFyZzsKKwlpZiAoIWxzdGF0KG5hbWUsICZzdCkpCisJCXJldHVybjsKKwlpZiAoZXJybm8gPT0gRU5PRU5UKQorCQlkaWUoImFtYmlndW91cyBhcmd1bWVudCAnJXMnOiB1bmtub3duIHJldmlzaW9uIG9yIHBhdGggbm90IGluIHRoZSB3b3JraW5nIHRyZWUuXG4iCisJCSAgICAiVXNlICctLScgdG8gc2VwYXJhdGUgcGF0aHMgZnJvbSByZXZpc2lvbnMiLCBhcmcpOworCWRpZSgiJyVzJzogJXMiLCBhcmcsIHN0cmVycm9yKGVycm5vKSk7Cit9CisKKy8qCisgKiBPcHBvc2l0ZSBvZiB0aGUgYWJvdmU6IHRoZSBjb21tYW5kIGxpbmUgZGlkIG5vdCBoYXZlIC0tIG1hcmtlcgorICogYW5kIHdlIHBhcnNlZCB0aGUgYXJnIGFzIGEgcmVmbmFtZS4gIEl0IHNob3VsZCBub3QgYmUgaW50ZXJwcmV0YWJsZQorICogYXMgYSBmaWxlbmFtZS4KKyAqLwordm9pZCB2ZXJpZnlfbm9uX2ZpbGVuYW1lKGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqYXJnKQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAoIWlzX2luc2lkZV93b3JrX3RyZWUoKSB8fCBpc19pbnNpZGVfZ2l0X2RpcigpKQorCQlyZXR1cm47CisJaWYgKCphcmcgPT0gJy0nKQorCQlyZXR1cm47IC8qIGZsYWcgKi8KKwluYW1lID0gcHJlZml4ID8gcHJlZml4X2ZpbGVuYW1lKHByZWZpeCwgc3RybGVuKHByZWZpeCksIGFyZykgOiBhcmc7CisJaWYgKCFsc3RhdChuYW1lLCAmc3QpKQorCQlkaWUoImFtYmlndW91cyBhcmd1bWVudCAnJXMnOiBib3RoIHJldmlzaW9uIGFuZCBmaWxlbmFtZVxuIgorCQkgICAgIlVzZSAnLS0nIHRvIHNlcGFyYXRlIGZpbGVuYW1lcyBmcm9tIHJldmlzaW9ucyIsIGFyZyk7CisJaWYgKGVycm5vICE9IEVOT0VOVCAmJiBlcnJubyAhPSBFTk9URElSKQorCQlkaWUoIiclcyc6ICVzIiwgYXJnLCBzdHJlcnJvcihlcnJubykpOworfQorCitjb25zdCBjaGFyICoqZ2V0X3BhdGhzcGVjKGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqKnBhdGhzcGVjKQoreworCWNvbnN0IGNoYXIgKmVudHJ5ID0gKnBhdGhzcGVjOworCWNvbnN0IGNoYXIgKipzcmMsICoqZHN0OworCWludCBwcmVmaXhsZW47CisKKwlpZiAoIXByZWZpeCAmJiAhZW50cnkpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFlbnRyeSkgeworCQlzdGF0aWMgY29uc3QgY2hhciAqc3BlY1syXTsKKwkJc3BlY1swXSA9IHByZWZpeDsKKwkJc3BlY1sxXSA9IE5VTEw7CisJCXJldHVybiBzcGVjOworCX0KKworCS8qIE90aGVyd2lzZSB3ZSBoYXZlIHRvIHJlLXdyaXRlIHRoZSBlbnRyaWVzLi4gKi8KKwlzcmMgPSBwYXRoc3BlYzsKKwlkc3QgPSBwYXRoc3BlYzsKKwlwcmVmaXhsZW4gPSBwcmVmaXggPyBzdHJsZW4ocHJlZml4KSA6IDA7CisJd2hpbGUgKCpzcmMpIHsKKwkJY29uc3QgY2hhciAqcCA9IHByZWZpeF9wYXRoKHByZWZpeCwgcHJlZml4bGVuLCAqc3JjKTsKKwkJaWYgKHApCisJCQkqKGRzdCsrKSA9IHA7CisJCWVsc2UKKwkJCWV4aXQoMTI4KTsgLyogZXJyb3IgbWVzc2FnZSBhbHJlYWR5IGdpdmVuICovCisJCXNyYysrOworCX0KKwkqZHN0ID0gTlVMTDsKKwlpZiAoISpwYXRoc3BlYykKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHBhdGhzcGVjOworfQorCisvKgorICogVGVzdCBpZiBpdCBsb29rcyBsaWtlIHdlJ3JlIGF0IGEgZ2l0IGRpcmVjdG9yeS4KKyAqIFdlIHdhbnQgdG8gc2VlOgorICoKKyAqICAtIGVpdGhlciBhbiBvYmplY3RzLyBkaXJlY3RvcnkgX29yXyB0aGUgcHJvcGVyCisgKiAgICBHSVRfT0JKRUNUX0RJUkVDVE9SWSBlbnZpcm9ubWVudCB2YXJpYWJsZQorICogIC0gYSByZWZzLyBkaXJlY3RvcnkKKyAqICAtIGVpdGhlciBhIEhFQUQgc3ltbGluayBvciBhIEhFQUQgZmlsZSB0aGF0IGlzIGZvcm1hdHRlZCBhcworICogICAgYSBwcm9wZXIgInJlZjoiLCBvciBhIHJlZ3VsYXIgZmlsZSBIRUFEIHRoYXQgaGFzIGEgcHJvcGVybHkKKyAqICAgIGZvcm1hdHRlZCBzaGExIG9iamVjdCBuYW1lLgorICovCitzdGF0aWMgaW50IGlzX2dpdF9kaXJlY3RvcnkoY29uc3QgY2hhciAqc3VzcGVjdCkKK3sKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCXNpemVfdCBsZW4gPSBzdHJsZW4oc3VzcGVjdCk7CisKKwlzdHJjcHkocGF0aCwgc3VzcGVjdCk7CisJaWYgKGdldGVudihEQl9FTlZJUk9OTUVOVCkpIHsKKwkJaWYgKGFjY2VzcyhnZXRlbnYoREJfRU5WSVJPTk1FTlQpLCBYX09LKSkKKwkJCXJldHVybiAwOworCX0KKwllbHNlIHsKKwkJc3RyY3B5KHBhdGggKyBsZW4sICIvb2JqZWN0cyIpOworCQlpZiAoYWNjZXNzKHBhdGgsIFhfT0spKQorCQkJcmV0dXJuIDA7CisJfQorCisJc3RyY3B5KHBhdGggKyBsZW4sICIvcmVmcyIpOworCWlmIChhY2Nlc3MocGF0aCwgWF9PSykpCisJCXJldHVybiAwOworCisJc3RyY3B5KHBhdGggKyBsZW4sICIvSEVBRCIpOworCWlmICh2YWxpZGF0ZV9oZWFkcmVmKHBhdGgpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitpbnQgaXNfaW5zaWRlX2dpdF9kaXIodm9pZCkKK3sKKwlpZiAoaW5zaWRlX2dpdF9kaXIgPCAwKQorCQlpbnNpZGVfZ2l0X2RpciA9IGlzX2luc2lkZV9kaXIoZ2V0X2dpdF9kaXIoKSk7CisJcmV0dXJuIGluc2lkZV9naXRfZGlyOworfQorCitpbnQgaXNfaW5zaWRlX3dvcmtfdHJlZSh2b2lkKQoreworCWlmIChpbnNpZGVfd29ya190cmVlIDwgMCkKKwkJaW5zaWRlX3dvcmtfdHJlZSA9IGlzX2luc2lkZV9kaXIoZ2V0X2dpdF93b3JrX3RyZWUoKSk7CisJcmV0dXJuIGluc2lkZV93b3JrX3RyZWU7Cit9CisKKy8qCisgKiBzZXRfd29ya190cmVlKCkgaXMgb25seSBldmVyIGNhbGxlZCBpZiB5b3Ugc2V0IEdJVF9ESVIgZXhwbGljaXRlbHkuCisgKiBUaGUgb2xkIGJlaGF2aW91ciAod2hpY2ggd2UgcmV0YWluIGhlcmUpIGlzIHRvIHNldCB0aGUgd29yayB0cmVlIHJvb3QKKyAqIHRvIHRoZSBjd2QsIHVubGVzcyBvdmVycmlkZGVuIGJ5IHRoZSBjb25maWcsIHRoZSBjb21tYW5kIGxpbmUsIG9yCisgKiBHSVRfV09SS19UUkVFLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqc2V0X3dvcmtfdHJlZShjb25zdCBjaGFyICpkaXIpCit7CisJY2hhciBidWZmZXJbUEFUSF9NQVggKyAxXTsKKworCWlmICghZ2V0Y3dkKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpKQorCQlkaWUgKCJDb3VsZCBub3QgZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Iik7CisJZ2l0X3dvcmtfdHJlZV9jZmcgPSB4c3RyZHVwKGJ1ZmZlcik7CisJaW5zaWRlX3dvcmtfdHJlZSA9IDE7CisKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBzZXR1cF93b3JrX3RyZWUodm9pZCkKK3sKKwljb25zdCBjaGFyICp3b3JrX3RyZWUsICpnaXRfZGlyOworCXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworCisJaWYgKGluaXRpYWxpemVkKQorCQlyZXR1cm47CisJd29ya190cmVlID0gZ2V0X2dpdF93b3JrX3RyZWUoKTsKKwlnaXRfZGlyID0gZ2V0X2dpdF9kaXIoKTsKKwlpZiAoIWlzX2Fic29sdXRlX3BhdGgoZ2l0X2RpcikpCisJCXNldF9naXRfZGlyKG1ha2VfYWJzb2x1dGVfcGF0aChnaXRfZGlyKSk7CisJaWYgKCF3b3JrX3RyZWUgfHwgY2hkaXIod29ya190cmVlKSkKKwkJZGllKCJUaGlzIG9wZXJhdGlvbiBtdXN0IGJlIHJ1biBpbiBhIHdvcmsgdHJlZSIpOworCWluaXRpYWxpemVkID0gMTsKK30KKworc3RhdGljIGludCBjaGVja19yZXBvc2l0b3J5X2Zvcm1hdF9nZW50bHkoaW50ICpub25naXRfb2spCit7CisJZ2l0X2NvbmZpZyhjaGVja19yZXBvc2l0b3J5X2Zvcm1hdF92ZXJzaW9uKTsKKwlpZiAoR0lUX1JFUE9fVkVSU0lPTiA8IHJlcG9zaXRvcnlfZm9ybWF0X3ZlcnNpb24pIHsKKwkJaWYgKCFub25naXRfb2spCisJCQlkaWUgKCJFeHBlY3RlZCBnaXQgcmVwbyB2ZXJzaW9uIDw9ICVkLCBmb3VuZCAlZCIsCisJCQkgICAgIEdJVF9SRVBPX1ZFUlNJT04sIHJlcG9zaXRvcnlfZm9ybWF0X3ZlcnNpb24pOworCQl3YXJuaW5nKCJFeHBlY3RlZCBnaXQgcmVwbyB2ZXJzaW9uIDw9ICVkLCBmb3VuZCAlZCIsCisJCQlHSVRfUkVQT19WRVJTSU9OLCByZXBvc2l0b3J5X2Zvcm1hdF92ZXJzaW9uKTsKKwkJd2FybmluZygiUGxlYXNlIHVwZ3JhZGUgR2l0Iik7CisJCSpub25naXRfb2sgPSAtMTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdlIGNhbm5vdCBkZWNpZGUgaW4gdGhpcyBmdW5jdGlvbiB3aGV0aGVyIHdlIGFyZSBpbiB0aGUgd29yayB0cmVlIG9yCisgKiBub3QsIHNpbmNlIHRoZSBjb25maWcgY2FuIG9ubHkgYmUgcmVhZCBfYWZ0ZXJfIHRoaXMgZnVuY3Rpb24gd2FzIGNhbGxlZC4KKyAqLworY29uc3QgY2hhciAqc2V0dXBfZ2l0X2RpcmVjdG9yeV9nZW50bHkoaW50ICpub25naXRfb2spCit7CisJY29uc3QgY2hhciAqd29ya190cmVlX2VudiA9IGdldGVudihHSVRfV09SS19UUkVFX0VOVklST05NRU5UKTsKKwlzdGF0aWMgY2hhciBjd2RbUEFUSF9NQVgrMV07CisJY29uc3QgY2hhciAqZ2l0ZGlyZW52OworCWludCBsZW4sIG9mZnNldDsKKworCS8qCisJICogTGV0J3MgYXNzdW1lIHRoYXQgd2UgYXJlIGluIGEgZ2l0IHJlcG9zaXRvcnkuCisJICogSWYgaXQgdHVybnMgb3V0IGxhdGVyIHRoYXQgd2UgYXJlIHNvbWV3aGVyZSBlbHNlLCB0aGUgdmFsdWUgd2lsbCBiZQorCSAqIHVwZGF0ZWQgYWNjb3JkaW5nbHkuCisJICovCisJaWYgKG5vbmdpdF9vaykKKwkJKm5vbmdpdF9vayA9IDA7CisKKwkvKgorCSAqIElmIEdJVF9ESVIgaXMgc2V0IGV4cGxpY2l0bHksIHdlJ3JlIG5vdCBnb2luZworCSAqIHRvIGRvIGFueSBkaXNjb3ZlcnksIGJ1dCB3ZSBzdGlsbCBkbyByZXBvc2l0b3J5CisJICogdmFsaWRhdGlvbi4KKwkgKi8KKwlnaXRkaXJlbnYgPSBnZXRlbnYoR0lUX0RJUl9FTlZJUk9OTUVOVCk7CisJaWYgKGdpdGRpcmVudikgeworCQlpZiAoUEFUSF9NQVggLSA0MCA8IHN0cmxlbihnaXRkaXJlbnYpKQorCQkJZGllKCInJCVzJyB0b28gYmlnIiwgR0lUX0RJUl9FTlZJUk9OTUVOVCk7CisJCWlmIChpc19naXRfZGlyZWN0b3J5KGdpdGRpcmVudikpIHsKKwkJCXN0YXRpYyBjaGFyIGJ1ZmZlclsxMDI0ICsgMV07CisJCQljb25zdCBjaGFyICpyZXR2YWw7CisKKwkJCWlmICghd29ya190cmVlX2VudikgeworCQkJCXJldHZhbCA9IHNldF93b3JrX3RyZWUoZ2l0ZGlyZW52KTsKKwkJCQkvKiBjb25maWcgbWF5IG92ZXJyaWRlIHdvcmt0cmVlICovCisJCQkJaWYgKGNoZWNrX3JlcG9zaXRvcnlfZm9ybWF0X2dlbnRseShub25naXRfb2spKQorCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQorCQkJaWYgKGNoZWNrX3JlcG9zaXRvcnlfZm9ybWF0X2dlbnRseShub25naXRfb2spKQorCQkJCXJldHVybiBOVUxMOworCQkJcmV0dmFsID0gZ2V0X3JlbGF0aXZlX2N3ZChidWZmZXIsIHNpemVvZihidWZmZXIpIC0gMSwKKwkJCQkJZ2V0X2dpdF93b3JrX3RyZWUoKSk7CisJCQlpZiAoIXJldHZhbCB8fCAhKnJldHZhbCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCXNldF9naXRfZGlyKG1ha2VfYWJzb2x1dGVfcGF0aChnaXRkaXJlbnYpKTsKKwkJCWlmIChjaGRpcih3b3JrX3RyZWVfZW52KSA8IDApCisJCQkJZGllICgiQ291bGQgbm90IGNoZGlyIHRvICVzIiwgd29ya190cmVlX2Vudik7CisJCQlzdHJjYXQoYnVmZmVyLCAiLyIpOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlpZiAobm9uZ2l0X29rKSB7CisJCQkqbm9uZ2l0X29rID0gMTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWRpZSgiTm90IGEgZ2l0IHJlcG9zaXRvcnk6ICclcyciLCBnaXRkaXJlbnYpOworCX0KKworCWlmICghZ2V0Y3dkKGN3ZCwgc2l6ZW9mKGN3ZCktMSkpCisJCWRpZSgiVW5hYmxlIHRvIHJlYWQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSIpOworCisJLyoKKwkgKiBUZXN0IGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgKHJlbGF0aXZlIHRvIHRoZSBjd2QpOgorCSAqIC0gLmdpdC8KKwkgKiAtIC4vIChiYXJlKQorCSAqIC0gLi4vLmdpdC8KKwkgKiAtIC4uLyAoYmFyZSkKKwkgKiAtIC4uLy4uLy5naXQvCisJICogICBldGMuCisJICovCisJb2Zmc2V0ID0gbGVuID0gc3RybGVuKGN3ZCk7CisJZm9yICg7OykgeworCQlpZiAoaXNfZ2l0X2RpcmVjdG9yeShERUZBVUxUX0dJVF9ESVJfRU5WSVJPTk1FTlQpKQorCQkJYnJlYWs7CisJCWlmIChpc19naXRfZGlyZWN0b3J5KCIuIikpIHsKKwkJCWluc2lkZV9naXRfZGlyID0gMTsKKwkJCWlmICghd29ya190cmVlX2VudikKKwkJCQlpbnNpZGVfd29ya190cmVlID0gMDsKKwkJCXNldGVudihHSVRfRElSX0VOVklST05NRU5ULCAiLiIsIDEpOworCQkJY2hlY2tfcmVwb3NpdG9yeV9mb3JtYXRfZ2VudGx5KG5vbmdpdF9vayk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQljaGRpcigiLi4iKTsKKwkJZG8geworCQkJaWYgKCFvZmZzZXQpIHsKKwkJCQlpZiAobm9uZ2l0X29rKSB7CisJCQkJCWlmIChjaGRpcihjd2QpKQorCQkJCQkJZGllKCJDYW5ub3QgY29tZSBiYWNrIHRvIGN3ZCIpOworCQkJCQkqbm9uZ2l0X29rID0gMTsKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJfQorCQkJCWRpZSgiTm90IGEgZ2l0IHJlcG9zaXRvcnkiKTsKKwkJCX0KKwkJfSB3aGlsZSAoY3dkWy0tb2Zmc2V0XSAhPSAnLycpOworCX0KKworCWluc2lkZV9naXRfZGlyID0gMDsKKwlpZiAoIXdvcmtfdHJlZV9lbnYpCisJCWluc2lkZV93b3JrX3RyZWUgPSAxOworCWdpdF93b3JrX3RyZWVfY2ZnID0geHN0cm5kdXAoY3dkLCBvZmZzZXQpOworCWlmIChjaGVja19yZXBvc2l0b3J5X2Zvcm1hdF9nZW50bHkobm9uZ2l0X29rKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG9mZnNldCA9PSBsZW4pCisJCXJldHVybiBOVUxMOworCisJLyogTWFrZSAib2Zmc2V0IiBwb2ludCB0byBwYXN0IHRoZSAnLycsIGFuZCBhZGQgYSAnLycgYXQgdGhlIGVuZCAqLworCW9mZnNldCsrOworCWN3ZFtsZW4rK10gPSAnLyc7CisJY3dkW2xlbl0gPSAwOworCXJldHVybiBjd2QgKyBvZmZzZXQ7Cit9CisKK2ludCBnaXRfY29uZmlnX3Blcm0oY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAodmFsdWUpIHsKKwkJaW50IGk7CisJCWlmICghc3RyY21wKHZhbHVlLCAidW1hc2siKSkKKwkJCXJldHVybiBQRVJNX1VNQVNLOworCQlpZiAoIXN0cmNtcCh2YWx1ZSwgImdyb3VwIikpCisJCQlyZXR1cm4gUEVSTV9HUk9VUDsKKwkJaWYgKCFzdHJjbXAodmFsdWUsICJhbGwiKSB8fAorCQkgICAgIXN0cmNtcCh2YWx1ZSwgIndvcmxkIikgfHwKKwkJICAgICFzdHJjbXAodmFsdWUsICJldmVyeWJvZHkiKSkKKwkJCXJldHVybiBQRVJNX0VWRVJZQk9EWTsKKwkJaSA9IGF0b2kodmFsdWUpOworCQlpZiAoaSA+IDEpCisJCQlyZXR1cm4gaTsKKwl9CisJcmV0dXJuIGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKK30KKworaW50IGNoZWNrX3JlcG9zaXRvcnlfZm9ybWF0X3ZlcnNpb24oY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoc3RyY21wKHZhciwgImNvcmUucmVwb3NpdG9yeWZvcm1hdHZlcnNpb24iKSA9PSAwKQorCQlyZXBvc2l0b3J5X2Zvcm1hdF92ZXJzaW9uID0gZ2l0X2NvbmZpZ19pbnQodmFyLCB2YWx1ZSk7CisJZWxzZSBpZiAoc3RyY21wKHZhciwgImNvcmUuc2hhcmVkcmVwb3NpdG9yeSIpID09IDApCisJCXNoYXJlZF9yZXBvc2l0b3J5ID0gZ2l0X2NvbmZpZ19wZXJtKHZhciwgdmFsdWUpOworCWVsc2UgaWYgKHN0cmNtcCh2YXIsICJjb3JlLmJhcmUiKSA9PSAwKSB7CisJCWlzX2JhcmVfcmVwb3NpdG9yeV9jZmcgPSBnaXRfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSk7CisJCWlmIChpc19iYXJlX3JlcG9zaXRvcnlfY2ZnID09IDEpCisJCQlpbnNpZGVfd29ya190cmVlID0gLTE7CisJfSBlbHNlIGlmIChzdHJjbXAodmFyLCAiY29yZS53b3JrdHJlZSIpID09IDApIHsKKwkJaWYgKCF2YWx1ZSkKKwkJCXJldHVybiBjb25maWdfZXJyb3Jfbm9uYm9vbCh2YXIpOworCQlmcmVlKGdpdF93b3JrX3RyZWVfY2ZnKTsKKwkJZ2l0X3dvcmtfdHJlZV9jZmcgPSB4c3RyZHVwKHZhbHVlKTsKKwkJaW5zaWRlX3dvcmtfdHJlZSA9IC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGNoZWNrX3JlcG9zaXRvcnlfZm9ybWF0KHZvaWQpCit7CisJcmV0dXJuIGNoZWNrX3JlcG9zaXRvcnlfZm9ybWF0X2dlbnRseShOVUxMKTsKK30KKworY29uc3QgY2hhciAqc2V0dXBfZ2l0X2RpcmVjdG9yeSh2b2lkKQoreworCWNvbnN0IGNoYXIgKnJldHZhbCA9IHNldHVwX2dpdF9kaXJlY3RvcnlfZ2VudGx5KE5VTEwpOworCisJLyogSWYgdGhlIHdvcmsgdHJlZSBpcyBub3QgdGhlIGRlZmF1bHQgb25lLCByZWNvbXB1dGUgcHJlZml4ICovCisJaWYgKGluc2lkZV93b3JrX3RyZWUgPCAwKSB7CisJCXN0YXRpYyBjaGFyIGJ1ZmZlcltQQVRIX01BWCArIDFdOworCQljaGFyICpyZWw7CisJCWlmIChyZXR2YWwgJiYgY2hkaXIocmV0dmFsKSkKKwkJCWRpZSAoIkNvdWxkIG5vdCBqdW1wIGJhY2sgaW50byBvcmlnaW5hbCBjd2QiKTsKKwkJcmVsID0gZ2V0X3JlbGF0aXZlX2N3ZChidWZmZXIsIFBBVEhfTUFYLCBnZXRfZ2l0X3dvcmtfdHJlZSgpKTsKKwkJcmV0dXJuIHJlbCAmJiAqcmVsID8gc3RyY2F0KHJlbCwgIi8iKSA6IE5VTEw7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL3NoYTFfZmlsZS5jIGIvc2hhMV9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ1YTg3MQotLS0gL2Rldi9udWxsCisrKyBiL3NoYTFfZmlsZS5jCkBAIC0wLDAgKzEsMjQ1NyBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqCisgKiBUaGlzIGhhbmRsZXMgYmFzaWMgZ2l0IHNoYTEgb2JqZWN0IGZpbGVzIC0gcGFja2luZywgdW5wYWNraW5nLAorICogY3JlYXRpb24gZXRjLgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkZWx0YS5oIgorI2luY2x1ZGUgInBhY2suaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJwYWNrLXJldmluZGV4LmgiCisKKyNpZm5kZWYgT19OT0FUSU1FCisjaWYgZGVmaW5lZChfX2xpbnV4X18pICYmIChkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9fUFBDX18pKQorI2RlZmluZSBPX05PQVRJTUUgMDEwMDAwMDAKKyNlbHNlCisjZGVmaW5lIE9fTk9BVElNRSAwCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgTk9fQzk5X0ZPUk1BVAorI2RlZmluZSBTWl9GTVQgImx1Igorc3RhdGljIHVuc2lnbmVkIGxvbmcgc3pfZm10KHNpemVfdCBzKSB7IHJldHVybiAodW5zaWduZWQgbG9uZylzOyB9CisjZWxzZQorI2RlZmluZSBTWl9GTVQgInp1Igorc3RhdGljIHNpemVfdCBzel9mbXQoc2l6ZV90IHMpIHsgcmV0dXJuIHM7IH0KKyNlbmRpZgorCitjb25zdCB1bnNpZ25lZCBjaGFyIG51bGxfc2hhMVsyMF07CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2hhMV9maWxlX29wZW5fZmxhZyA9IE9fTk9BVElNRTsKKworY29uc3Qgc2lnbmVkIGNoYXIgaGV4dmFsX3RhYmxlWzI1Nl0gPSB7CisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIDAwLTA3ICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIDA4LTBmICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIDEwLTE3ICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIDE4LTFmICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIDIwLTI3ICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIDI4LTJmICovCisJICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywJCS8qIDMwLTM3ICovCisJICA4LCAgOSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIDM4LTNmICovCisJIC0xLCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAtMSwJCS8qIDQwLTQ3ICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIDQ4LTRmICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIDUwLTU3ICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIDU4LTVmICovCisJIC0xLCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAtMSwJCS8qIDYwLTY3ICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIDY4LTY3ICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIDcwLTc3ICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIDc4LTdmICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIDgwLTg3ICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIDg4LThmICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIDkwLTk3ICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIDk4LTlmICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIGEwLWE3ICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIGE4LWFmICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIGIwLWI3ICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIGI4LWJmICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIGMwLWM3ICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIGM4LWNmICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIGQwLWQ3ICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIGQ4LWRmICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIGUwLWU3ICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIGU4LWVmICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIGYwLWY3ICovCisJIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCS8qIGY4LWZmICovCit9OworCitpbnQgZ2V0X3NoYTFfaGV4KGNvbnN0IGNoYXIgKmhleCwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgdmFsID0gKGhleHZhbChoZXhbMF0pIDw8IDQpIHwgaGV4dmFsKGhleFsxXSk7CisJCWlmICh2YWwgJiB+MHhmZikKKwkJCXJldHVybiAtMTsKKwkJKnNoYTErKyA9IHZhbDsKKwkJaGV4ICs9IDI7CisJfQorCXJldHVybiAwOworfQorCitpbnQgc2FmZV9jcmVhdGVfbGVhZGluZ19kaXJlY3RvcmllcyhjaGFyICpwYXRoKQoreworCWNoYXIgKnBvcyA9IHBhdGg7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAoaXNfYWJzb2x1dGVfcGF0aChwYXRoKSkKKwkJcG9zKys7CisKKwl3aGlsZSAocG9zKSB7CisJCXBvcyA9IHN0cmNocihwb3MsICcvJyk7CisJCWlmICghcG9zKQorCQkJYnJlYWs7CisJCSpwb3MgPSAwOworCQlpZiAoIXN0YXQocGF0aCwgJnN0KSkgeworCQkJLyogcGF0aCBleGlzdHMgKi8KKwkJCWlmICghU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJCSpwb3MgPSAnLyc7CisJCQkJcmV0dXJuIC0zOworCQkJfQorCQl9CisJCWVsc2UgaWYgKG1rZGlyKHBhdGgsIDA3NzcpKSB7CisJCQkqcG9zID0gJy8nOworCQkJcmV0dXJuIC0xOworCQl9CisJCWVsc2UgaWYgKGFkanVzdF9zaGFyZWRfcGVybShwYXRoKSkgeworCQkJKnBvcyA9ICcvJzsKKwkJCXJldHVybiAtMjsKKwkJfQorCQkqcG9zKysgPSAnLyc7CisJfQorCXJldHVybiAwOworfQorCitjaGFyICogc2hhMV90b19oZXgoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdGF0aWMgaW50IGJ1Zm5vOworCXN0YXRpYyBjaGFyIGhleGJ1ZmZlcls0XVs1MF07CisJc3RhdGljIGNvbnN0IGNoYXIgaGV4W10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisJY2hhciAqYnVmZmVyID0gaGV4YnVmZmVyWzMgJiArK2J1Zm5vXSwgKmJ1ZiA9IGJ1ZmZlcjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisJCXVuc2lnbmVkIGludCB2YWwgPSAqc2hhMSsrOworCQkqYnVmKysgPSBoZXhbdmFsID4+IDRdOworCQkqYnVmKysgPSBoZXhbdmFsICYgMHhmXTsKKwl9CisJKmJ1ZiA9ICdcMCc7CisKKwlyZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgdm9pZCBmaWxsX3NoYTFfcGF0aChjaGFyICpwYXRoYnVmLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisJCXN0YXRpYyBjaGFyIGhleFtdID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCQl1bnNpZ25lZCBpbnQgdmFsID0gc2hhMVtpXTsKKwkJY2hhciAqcG9zID0gcGF0aGJ1ZiArIGkqMiArIChpID4gMCk7CisJCSpwb3MrKyA9IGhleFt2YWwgPj4gNF07CisJCSpwb3MgPSBoZXhbdmFsICYgMHhmXTsKKwl9Cit9CisKKy8qCisgKiBOT1RFISBUaGlzIHJldHVybnMgYSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBidWZmZXIsIHNvIHlvdSBoYXZlIHRvIGJlCisgKiBjYXJlZnVsIGFib3V0IHVzaW5nIGl0LiBEbyBhbiAieHN0cmR1cCgpIiBpZiB5b3UgbmVlZCB0byBzYXZlIHRoZQorICogZmlsZW5hbWUuCisgKgorICogQWxzbyBub3RlIHRoYXQgdGhpcyByZXR1cm5zIHRoZSBsb2NhdGlvbiBmb3IgY3JlYXRpbmcuICBSZWFkaW5nCisgKiBTSEExIGZpbGUgY2FuIGhhcHBlbiBmcm9tIGFueSBhbHRlcm5hdGUgZGlyZWN0b3J5IGxpc3RlZCBpbiB0aGUKKyAqIERCX0VOVklST05NRU5UIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIGl0IGlzIG5vdCBmb3VuZCBpbgorICogdGhlIHByaW1hcnkgb2JqZWN0IGRhdGFiYXNlLgorICovCitjaGFyICpzaGExX2ZpbGVfbmFtZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0YXRpYyBjaGFyICpuYW1lLCAqYmFzZTsKKworCWlmICghYmFzZSkgeworCQljb25zdCBjaGFyICpzaGExX2ZpbGVfZGlyZWN0b3J5ID0gZ2V0X29iamVjdF9kaXJlY3RvcnkoKTsKKwkJaW50IGxlbiA9IHN0cmxlbihzaGExX2ZpbGVfZGlyZWN0b3J5KTsKKwkJYmFzZSA9IHhtYWxsb2MobGVuICsgNjApOworCQltZW1jcHkoYmFzZSwgc2hhMV9maWxlX2RpcmVjdG9yeSwgbGVuKTsKKwkJbWVtc2V0KGJhc2UrbGVuLCAwLCA2MCk7CisJCWJhc2VbbGVuXSA9ICcvJzsKKwkJYmFzZVtsZW4rM10gPSAnLyc7CisJCW5hbWUgPSBiYXNlICsgbGVuICsgMTsKKwl9CisJZmlsbF9zaGExX3BhdGgobmFtZSwgc2hhMSk7CisJcmV0dXJuIGJhc2U7Cit9CisKK2NoYXIgKnNoYTFfcGFja19uYW1lKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgaGV4W10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisJc3RhdGljIGNoYXIgKm5hbWUsICpiYXNlLCAqYnVmOworCWludCBpOworCisJaWYgKCFiYXNlKSB7CisJCWNvbnN0IGNoYXIgKnNoYTFfZmlsZV9kaXJlY3RvcnkgPSBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpOworCQlpbnQgbGVuID0gc3RybGVuKHNoYTFfZmlsZV9kaXJlY3RvcnkpOworCQliYXNlID0geG1hbGxvYyhsZW4gKyA2MCk7CisJCXNwcmludGYoYmFzZSwgIiVzL3BhY2svcGFjay0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwLnBhY2siLCBzaGExX2ZpbGVfZGlyZWN0b3J5KTsKKwkJbmFtZSA9IGJhc2UgKyBsZW4gKyAxMTsKKwl9CisKKwlidWYgPSBuYW1lOworCisJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IHZhbCA9ICpzaGExKys7CisJCSpidWYrKyA9IGhleFt2YWwgPj4gNF07CisJCSpidWYrKyA9IGhleFt2YWwgJiAweGZdOworCX0KKworCXJldHVybiBiYXNlOworfQorCitjaGFyICpzaGExX3BhY2tfaW5kZXhfbmFtZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGhleFtdID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCXN0YXRpYyBjaGFyICpuYW1lLCAqYmFzZSwgKmJ1ZjsKKwlpbnQgaTsKKworCWlmICghYmFzZSkgeworCQljb25zdCBjaGFyICpzaGExX2ZpbGVfZGlyZWN0b3J5ID0gZ2V0X29iamVjdF9kaXJlY3RvcnkoKTsKKwkJaW50IGxlbiA9IHN0cmxlbihzaGExX2ZpbGVfZGlyZWN0b3J5KTsKKwkJYmFzZSA9IHhtYWxsb2MobGVuICsgNjApOworCQlzcHJpbnRmKGJhc2UsICIlcy9wYWNrL3BhY2stMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MC5pZHgiLCBzaGExX2ZpbGVfZGlyZWN0b3J5KTsKKwkJbmFtZSA9IGJhc2UgKyBsZW4gKyAxMTsKKwl9CisKKwlidWYgPSBuYW1lOworCisJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IHZhbCA9ICpzaGExKys7CisJCSpidWYrKyA9IGhleFt2YWwgPj4gNF07CisJCSpidWYrKyA9IGhleFt2YWwgJiAweGZdOworCX0KKworCXJldHVybiBiYXNlOworfQorCitzdHJ1Y3QgYWx0ZXJuYXRlX29iamVjdF9kYXRhYmFzZSAqYWx0X29kYl9saXN0Oworc3RhdGljIHN0cnVjdCBhbHRlcm5hdGVfb2JqZWN0X2RhdGFiYXNlICoqYWx0X29kYl90YWlsOworCitzdGF0aWMgdm9pZCByZWFkX2luZm9fYWx0ZXJuYXRlcyhjb25zdCBjaGFyICogYWx0ZXJuYXRlcywgaW50IGRlcHRoKTsKKworLyoKKyAqIFByZXBhcmUgYWx0ZXJuYXRlIG9iamVjdCBkYXRhYmFzZSByZWdpc3RyeS4KKyAqCisgKiBUaGUgdmFyaWFibGUgYWx0X29kYl9saXN0IHBvaW50cyBhdCB0aGUgbGlzdCBvZiBzdHJ1Y3QKKyAqIGFsdGVybmF0ZV9vYmplY3RfZGF0YWJhc2UuICBUaGUgZWxlbWVudHMgb24gdGhpcyBsaXN0IGNvbWUgZnJvbQorICogbm9uLWVtcHR5IGVsZW1lbnRzIGZyb20gY29sb24gc2VwYXJhdGVkIEFMVEVSTkFURV9EQl9FTlZJUk9OTUVOVAorICogZW52aXJvbm1lbnQgdmFyaWFibGUsIGFuZCAkR0lUX09CSkVDVF9ESVJFQ1RPUlkvaW5mby9hbHRlcm5hdGVzLAorICogd2hvc2UgY29udGVudHMgaXMgc2ltaWxhciB0byB0aGF0IGVudmlyb25tZW50IHZhcmlhYmxlIGJ1dCBjYW4gYmUKKyAqIExGIHNlcGFyYXRlZC4gIEl0cyBiYXNlIHBvaW50cyBhdCBhIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGJ1ZmZlciB0aGF0CisgKiBjb250YWlucyAiL3RoZS9kaXJlY3RvcnkvY29ycmVzcG9uZGluZy90by8uZ2l0L29iamVjdHMvLi4uIiwgd2hpbGUKKyAqIGl0cyBuYW1lIHBvaW50cyBqdXN0IGFmdGVyIHRoZSBzbGFzaCBhdCB0aGUgZW5kIG9mICIuZ2l0L29iamVjdHMvIgorICogaW4gdGhlIGV4YW1wbGUgYWJvdmUsIGFuZCBoYXMgZW5vdWdoIHNwYWNlIHRvIGhvbGQgNDAtYnl0ZSBoZXgKKyAqIFNIQTEsIGFuIGV4dHJhIHNsYXNoIGZvciB0aGUgZmlyc3QgbGV2ZWwgaW5kaXJlY3Rpb24sIGFuZCB0aGUKKyAqIHRlcm1pbmF0aW5nIE5VTC4KKyAqLworc3RhdGljIGludCBsaW5rX2FsdF9vZGJfZW50cnkoY29uc3QgY2hhciAqIGVudHJ5LCBpbnQgbGVuLCBjb25zdCBjaGFyICogcmVsYXRpdmVfYmFzZSwgaW50IGRlcHRoKQoreworCXN0cnVjdCBzdGF0IHN0OworCWNvbnN0IGNoYXIgKm9iamRpciA9IGdldF9vYmplY3RfZGlyZWN0b3J5KCk7CisJc3RydWN0IGFsdGVybmF0ZV9vYmplY3RfZGF0YWJhc2UgKmVudDsKKwlzdHJ1Y3QgYWx0ZXJuYXRlX29iamVjdF9kYXRhYmFzZSAqYWx0OworCS8qIDQzID0gNDAtYnl0ZSArIDIgJy8nICsgdGVybWluYXRpbmcgTlVMICovCisJaW50IHBmeGxlbiA9IGxlbjsKKwlpbnQgZW50bGVuID0gcGZ4bGVuICsgNDM7CisJaW50IGJhc2VfbGVuID0gLTE7CisKKwlpZiAoIWlzX2Fic29sdXRlX3BhdGgoZW50cnkpICYmIHJlbGF0aXZlX2Jhc2UpIHsKKwkJLyogUmVsYXRpdmUgYWx0LW9kYiAqLworCQlpZiAoYmFzZV9sZW4gPCAwKQorCQkJYmFzZV9sZW4gPSBzdHJsZW4ocmVsYXRpdmVfYmFzZSkgKyAxOworCQllbnRsZW4gKz0gYmFzZV9sZW47CisJCXBmeGxlbiArPSBiYXNlX2xlbjsKKwl9CisJZW50ID0geG1hbGxvYyhzaXplb2YoKmVudCkgKyBlbnRsZW4pOworCisJaWYgKCFpc19hYnNvbHV0ZV9wYXRoKGVudHJ5KSAmJiByZWxhdGl2ZV9iYXNlKSB7CisJCW1lbWNweShlbnQtPmJhc2UsIHJlbGF0aXZlX2Jhc2UsIGJhc2VfbGVuIC0gMSk7CisJCWVudC0+YmFzZVtiYXNlX2xlbiAtIDFdID0gJy8nOworCQltZW1jcHkoZW50LT5iYXNlICsgYmFzZV9sZW4sIGVudHJ5LCBsZW4pOworCX0KKwllbHNlCisJCW1lbWNweShlbnQtPmJhc2UsIGVudHJ5LCBwZnhsZW4pOworCisJZW50LT5uYW1lID0gZW50LT5iYXNlICsgcGZ4bGVuICsgMTsKKwllbnQtPmJhc2VbcGZ4bGVuICsgM10gPSAnLyc7CisJZW50LT5iYXNlW3BmeGxlbl0gPSBlbnQtPmJhc2VbZW50bGVuLTFdID0gMDsKKworCS8qIERldGVjdCBjYXNlcyB3aGVyZSBhbHRlcm5hdGUgZGlzYXBwZWFyZWQgKi8KKwlpZiAoc3RhdChlbnQtPmJhc2UsICZzdCkgfHwgIVNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKwkJZXJyb3IoIm9iamVjdCBkaXJlY3RvcnkgJXMgZG9lcyBub3QgZXhpc3Q7ICIKKwkJICAgICAgImNoZWNrIC5naXQvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXMuIiwKKwkJICAgICAgZW50LT5iYXNlKTsKKwkJZnJlZShlbnQpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogUHJldmVudCB0aGUgY29tbW9uIG1pc3Rha2Ugb2YgbGlzdGluZyB0aGUgc2FtZQorCSAqIHRoaW5nIHR3aWNlLCBvciBvYmplY3QgZGlyZWN0b3J5IGl0c2VsZi4KKwkgKi8KKwlmb3IgKGFsdCA9IGFsdF9vZGJfbGlzdDsgYWx0OyBhbHQgPSBhbHQtPm5leHQpIHsKKwkJaWYgKCFtZW1jbXAoZW50LT5iYXNlLCBhbHQtPmJhc2UsIHBmeGxlbikpIHsKKwkJCWZyZWUoZW50KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlpZiAoIW1lbWNtcChlbnQtPmJhc2UsIG9iamRpciwgcGZ4bGVuKSkgeworCQlmcmVlKGVudCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBhZGQgdGhlIGFsdGVybmF0ZSBlbnRyeSAqLworCSphbHRfb2RiX3RhaWwgPSBlbnQ7CisJYWx0X29kYl90YWlsID0gJihlbnQtPm5leHQpOworCWVudC0+bmV4dCA9IE5VTEw7CisKKwkvKiByZWN1cnNpdmVseSBhZGQgYWx0ZXJuYXRlcyAqLworCXJlYWRfaW5mb19hbHRlcm5hdGVzKGVudC0+YmFzZSwgZGVwdGggKyAxKTsKKworCWVudC0+YmFzZVtwZnhsZW5dID0gJy8nOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxpbmtfYWx0X29kYl9lbnRyaWVzKGNvbnN0IGNoYXIgKmFsdCwgY29uc3QgY2hhciAqZXAsIGludCBzZXAsCisJCQkJIGNvbnN0IGNoYXIgKnJlbGF0aXZlX2Jhc2UsIGludCBkZXB0aCkKK3sKKwljb25zdCBjaGFyICpjcCwgKmxhc3Q7CisKKwlpZiAoZGVwdGggPiA1KSB7CisJCWVycm9yKCIlczogaWdub3JpbmcgYWx0ZXJuYXRlIG9iamVjdCBzdG9yZXMsIG5lc3RpbmcgdG9vIGRlZXAuIiwKKwkJCQlyZWxhdGl2ZV9iYXNlKTsKKwkJcmV0dXJuOworCX0KKworCWxhc3QgPSBhbHQ7CisJd2hpbGUgKGxhc3QgPCBlcCkgeworCQljcCA9IGxhc3Q7CisJCWlmIChjcCA8IGVwICYmICpjcCA9PSAnIycpIHsKKwkJCXdoaWxlIChjcCA8IGVwICYmICpjcCAhPSBzZXApCisJCQkJY3ArKzsKKwkJCWxhc3QgPSBjcCArIDE7CisJCQljb250aW51ZTsKKwkJfQorCQl3aGlsZSAoY3AgPCBlcCAmJiAqY3AgIT0gc2VwKQorCQkJY3ArKzsKKwkJaWYgKGxhc3QgIT0gY3ApIHsKKwkJCWlmICghaXNfYWJzb2x1dGVfcGF0aChsYXN0KSAmJiBkZXB0aCkgeworCQkJCWVycm9yKCIlczogaWdub3JpbmcgcmVsYXRpdmUgYWx0ZXJuYXRlIG9iamVjdCBzdG9yZSAlcyIsCisJCQkJCQlyZWxhdGl2ZV9iYXNlLCBsYXN0KTsKKwkJCX0gZWxzZSB7CisJCQkJbGlua19hbHRfb2RiX2VudHJ5KGxhc3QsIGNwIC0gbGFzdCwKKwkJCQkJCXJlbGF0aXZlX2Jhc2UsIGRlcHRoKTsKKwkJCX0KKwkJfQorCQl3aGlsZSAoY3AgPCBlcCAmJiAqY3AgPT0gc2VwKQorCQkJY3ArKzsKKwkJbGFzdCA9IGNwOworCX0KK30KKworc3RhdGljIHZvaWQgcmVhZF9pbmZvX2FsdGVybmF0ZXMoY29uc3QgY2hhciAqIHJlbGF0aXZlX2Jhc2UsIGludCBkZXB0aCkKK3sKKwljaGFyICptYXA7CisJc2l6ZV90IG1hcHN6OworCXN0cnVjdCBzdGF0IHN0OworCWNvbnN0IGNoYXIgYWx0X2ZpbGVfbmFtZVtdID0gImluZm8vYWx0ZXJuYXRlcyI7CisJLyogR2l2ZW4gdGhhdCByZWxhdGl2ZV9iYXNlIGlzIG5vIGxvbmdlciB0aGFuIFBBVEhfTUFYLAorCSAgIGVuc3VyZSB0aGF0ICJwYXRoIiBoYXMgZW5vdWdoIHNwYWNlIHRvIGFwcGVuZCAiLyIsIHRoZQorCSAgIGZpbGUgbmFtZSwgImluZm8vYWx0ZXJuYXRlcyIsIGFuZCBhIHRyYWlsaW5nIE5VTC4gICovCisJY2hhciBwYXRoW1BBVEhfTUFYICsgMSArIHNpemVvZiBhbHRfZmlsZV9uYW1lXTsKKwlpbnQgZmQ7CisKKwlzcHJpbnRmKHBhdGgsICIlcy8lcyIsIHJlbGF0aXZlX2Jhc2UsIGFsdF9maWxlX25hbWUpOworCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuOworCWlmIChmc3RhdChmZCwgJnN0KSB8fCAoc3Quc3Rfc2l6ZSA9PSAwKSkgeworCQljbG9zZShmZCk7CisJCXJldHVybjsKKwl9CisJbWFwc3ogPSB4c2l6ZV90KHN0LnN0X3NpemUpOworCW1hcCA9IHhtbWFwKE5VTEwsIG1hcHN6LCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisJY2xvc2UoZmQpOworCisJbGlua19hbHRfb2RiX2VudHJpZXMobWFwLCBtYXAgKyBtYXBzeiwgJ1xuJywgcmVsYXRpdmVfYmFzZSwgZGVwdGgpOworCisJbXVubWFwKG1hcCwgbWFwc3opOworfQorCit2b2lkIHByZXBhcmVfYWx0X29kYih2b2lkKQoreworCWNvbnN0IGNoYXIgKmFsdDsKKworCWlmIChhbHRfb2RiX3RhaWwpCisJCXJldHVybjsKKworCWFsdCA9IGdldGVudihBTFRFUk5BVEVfREJfRU5WSVJPTk1FTlQpOworCWlmICghYWx0KSBhbHQgPSAiIjsKKworCWFsdF9vZGJfdGFpbCA9ICZhbHRfb2RiX2xpc3Q7CisJbGlua19hbHRfb2RiX2VudHJpZXMoYWx0LCBhbHQgKyBzdHJsZW4oYWx0KSwgJzonLCBOVUxMLCAwKTsKKworCXJlYWRfaW5mb19hbHRlcm5hdGVzKGdldF9vYmplY3RfZGlyZWN0b3J5KCksIDApOworfQorCitzdGF0aWMgY2hhciAqZmluZF9zaGExX2ZpbGUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgc3RydWN0IHN0YXQgKnN0KQoreworCWNoYXIgKm5hbWUgPSBzaGExX2ZpbGVfbmFtZShzaGExKTsKKwlzdHJ1Y3QgYWx0ZXJuYXRlX29iamVjdF9kYXRhYmFzZSAqYWx0OworCisJaWYgKCFzdGF0KG5hbWUsIHN0KSkKKwkJcmV0dXJuIG5hbWU7CisJcHJlcGFyZV9hbHRfb2RiKCk7CisJZm9yIChhbHQgPSBhbHRfb2RiX2xpc3Q7IGFsdDsgYWx0ID0gYWx0LT5uZXh0KSB7CisJCW5hbWUgPSBhbHQtPm5hbWU7CisJCWZpbGxfc2hhMV9wYXRoKG5hbWUsIHNoYTEpOworCQlpZiAoIXN0YXQoYWx0LT5iYXNlLCBzdCkpCisJCQlyZXR1cm4gYWx0LT5iYXNlOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwYWNrX3VzZWRfY3RyOworc3RhdGljIHVuc2lnbmVkIGludCBwYWNrX21tYXBfY2FsbHM7CitzdGF0aWMgdW5zaWduZWQgaW50IHBlYWtfcGFja19vcGVuX3dpbmRvd3M7CitzdGF0aWMgdW5zaWduZWQgaW50IHBhY2tfb3Blbl93aW5kb3dzOworc3RhdGljIHNpemVfdCBwZWFrX3BhY2tfbWFwcGVkOworc3RhdGljIHNpemVfdCBwYWNrX21hcHBlZDsKK3N0cnVjdCBwYWNrZWRfZ2l0ICpwYWNrZWRfZ2l0OworCit2b2lkIHBhY2tfcmVwb3J0KHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsCisJCSJwYWNrX3JlcG9ydDogZ2V0cGFnZXNpemUoKSAgICAgICAgICAgID0gJTEwIiBTWl9GTVQgIlxuIgorCQkicGFja19yZXBvcnQ6IGNvcmUucGFja2VkR2l0V2luZG93U2l6ZSA9ICUxMCIgU1pfRk1UICJcbiIKKwkJInBhY2tfcmVwb3J0OiBjb3JlLnBhY2tlZEdpdExpbWl0ICAgICAgPSAlMTAiIFNaX0ZNVCAiXG4iLAorCQlzel9mbXQoZ2V0cGFnZXNpemUoKSksCisJCXN6X2ZtdChwYWNrZWRfZ2l0X3dpbmRvd19zaXplKSwKKwkJc3pfZm10KHBhY2tlZF9naXRfbGltaXQpKTsKKwlmcHJpbnRmKHN0ZGVyciwKKwkJInBhY2tfcmVwb3J0OiBwYWNrX3VzZWRfY3RyICAgICAgICAgICAgPSAlMTB1XG4iCisJCSJwYWNrX3JlcG9ydDogcGFja19tbWFwX2NhbGxzICAgICAgICAgID0gJTEwdVxuIgorCQkicGFja19yZXBvcnQ6IHBhY2tfb3Blbl93aW5kb3dzICAgICAgICA9ICUxMHUgLyAlMTB1XG4iCisJCSJwYWNrX3JlcG9ydDogcGFja19tYXBwZWQgICAgICAgICAgICAgID0gIgorCQkJIiUxMCIgU1pfRk1UICIgLyAlMTAiIFNaX0ZNVCAiXG4iLAorCQlwYWNrX3VzZWRfY3RyLAorCQlwYWNrX21tYXBfY2FsbHMsCisJCXBhY2tfb3Blbl93aW5kb3dzLCBwZWFrX3BhY2tfb3Blbl93aW5kb3dzLAorCQlzel9mbXQocGFja19tYXBwZWQpLCBzel9mbXQocGVha19wYWNrX21hcHBlZCkpOworfQorCitzdGF0aWMgaW50IGNoZWNrX3BhY2tlZF9naXRfaWR4KGNvbnN0IGNoYXIgKnBhdGgsICBzdHJ1Y3QgcGFja2VkX2dpdCAqcCkKK3sKKwl2b2lkICppZHhfbWFwOworCXN0cnVjdCBwYWNrX2lkeF9oZWFkZXIgKmhkcjsKKwlzaXplX3QgaWR4X3NpemU7CisJdWludDMyX3QgdmVyc2lvbiwgbnIsIGksICppbmRleDsKKwlpbnQgZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChmZCA8IDApCisJCXJldHVybiAtMTsKKwlpZiAoZnN0YXQoZmQsICZzdCkpIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gLTE7CisJfQorCWlkeF9zaXplID0geHNpemVfdChzdC5zdF9zaXplKTsKKwlpZiAoaWR4X3NpemUgPCA0ICogMjU2ICsgMjAgKyAyMCkgeworCQljbG9zZShmZCk7CisJCXJldHVybiBlcnJvcigiaW5kZXggZmlsZSAlcyBpcyB0b28gc21hbGwiLCBwYXRoKTsKKwl9CisJaWR4X21hcCA9IHhtbWFwKE5VTEwsIGlkeF9zaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisJY2xvc2UoZmQpOworCisJaGRyID0gaWR4X21hcDsKKwlpZiAoaGRyLT5pZHhfc2lnbmF0dXJlID09IGh0b25sKFBBQ0tfSURYX1NJR05BVFVSRSkpIHsKKwkJdmVyc2lvbiA9IG50b2hsKGhkci0+aWR4X3ZlcnNpb24pOworCQlpZiAodmVyc2lvbiA8IDIgfHwgdmVyc2lvbiA+IDIpIHsKKwkJCW11bm1hcChpZHhfbWFwLCBpZHhfc2l6ZSk7CisJCQlyZXR1cm4gZXJyb3IoImluZGV4IGZpbGUgJXMgaXMgdmVyc2lvbiAlZCIKKwkJCQkgICAgICIgYW5kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBiaW5hcnkiCisJCQkJICAgICAiICh0cnkgdXBncmFkaW5nIEdJVCB0byBhIG5ld2VyIHZlcnNpb24pIiwKKwkJCQkgICAgIHBhdGgsIHZlcnNpb24pOworCQl9CisJfSBlbHNlCisJCXZlcnNpb24gPSAxOworCisJbnIgPSAwOworCWluZGV4ID0gaWR4X21hcDsKKwlpZiAodmVyc2lvbiA+IDEpCisJCWluZGV4ICs9IDI7ICAvKiBza2lwIGluZGV4IGhlYWRlciAqLworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQl1aW50MzJfdCBuID0gbnRvaGwoaW5kZXhbaV0pOworCQlpZiAobiA8IG5yKSB7CisJCQltdW5tYXAoaWR4X21hcCwgaWR4X3NpemUpOworCQkJcmV0dXJuIGVycm9yKCJub24tbW9ub3RvbmljIGluZGV4ICVzIiwgcGF0aCk7CisJCX0KKwkJbnIgPSBuOworCX0KKworCWlmICh2ZXJzaW9uID09IDEpIHsKKwkJLyoKKwkJICogVG90YWwgc2l6ZToKKwkJICogIC0gMjU2IGluZGV4IGVudHJpZXMgNCBieXRlcyBlYWNoCisJCSAqICAtIDI0LWJ5dGUgZW50cmllcyAqIG5yICgyMC1ieXRlIHNoYTEgKyA0LWJ5dGUgb2Zmc2V0KQorCQkgKiAgLSAyMC1ieXRlIFNIQTEgb2YgdGhlIHBhY2tmaWxlCisJCSAqICAtIDIwLWJ5dGUgU0hBMSBmaWxlIGNoZWNrc3VtCisJCSAqLworCQlpZiAoaWR4X3NpemUgIT0gNCoyNTYgKyBuciAqIDI0ICsgMjAgKyAyMCkgeworCQkJbXVubWFwKGlkeF9tYXAsIGlkeF9zaXplKTsKKwkJCXJldHVybiBlcnJvcigid3JvbmcgaW5kZXggdjEgZmlsZSBzaXplIGluICVzIiwgcGF0aCk7CisJCX0KKwl9IGVsc2UgaWYgKHZlcnNpb24gPT0gMikgeworCQkvKgorCQkgKiBNaW5pbXVtIHNpemU6CisJCSAqICAtIDggYnl0ZXMgb2YgaGVhZGVyCisJCSAqICAtIDI1NiBpbmRleCBlbnRyaWVzIDQgYnl0ZXMgZWFjaAorCQkgKiAgLSAyMC1ieXRlIHNoYTEgZW50cnkgKiBucgorCQkgKiAgLSA0LWJ5dGUgY3JjIGVudHJ5ICogbnIKKwkJICogIC0gNC1ieXRlIG9mZnNldCBlbnRyeSAqIG5yCisJCSAqICAtIDIwLWJ5dGUgU0hBMSBvZiB0aGUgcGFja2ZpbGUKKwkJICogIC0gMjAtYnl0ZSBTSEExIGZpbGUgY2hlY2tzdW0KKwkJICogQW5kIGFmdGVyIHRoZSA0LWJ5dGUgb2Zmc2V0IHRhYmxlIG1pZ2h0IGJlIGEKKwkJICogdmFyaWFibGUgc2l6ZWQgdGFibGUgY29udGFpbmluZyA4LWJ5dGUgZW50cmllcworCQkgKiBmb3Igb2Zmc2V0cyBsYXJnZXIgdGhhbiAyXjMxLgorCQkgKi8KKwkJdW5zaWduZWQgbG9uZyBtaW5fc2l6ZSA9IDggKyA0KjI1NiArIG5yKigyMCArIDQgKyA0KSArIDIwICsgMjA7CisJCXVuc2lnbmVkIGxvbmcgbWF4X3NpemUgPSBtaW5fc2l6ZTsKKwkJaWYgKG5yKQorCQkJbWF4X3NpemUgKz0gKG5yIC0gMSkqODsKKwkJaWYgKGlkeF9zaXplIDwgbWluX3NpemUgfHwgaWR4X3NpemUgPiBtYXhfc2l6ZSkgeworCQkJbXVubWFwKGlkeF9tYXAsIGlkeF9zaXplKTsKKwkJCXJldHVybiBlcnJvcigid3JvbmcgaW5kZXggdjIgZmlsZSBzaXplIGluICVzIiwgcGF0aCk7CisJCX0KKwkJaWYgKGlkeF9zaXplICE9IG1pbl9zaXplICYmCisJCSAgICAvKgorCQkgICAgICogbWFrZSBzdXJlIHdlIGNhbiBkZWFsIHdpdGggbGFyZ2UgcGFjayBvZmZzZXRzLgorCQkgICAgICogMzEtYml0IHNpZ25lZCBvZmZzZXQgd29uJ3QgYmUgZW5vdWdoLCBuZWl0aGVyCisJCSAgICAgKiAzMi1iaXQgdW5zaWduZWQgb25lIHdpbGwgYmUuCisJCSAgICAgKi8KKwkJICAgIChzaXplb2Yob2ZmX3QpIDw9IDQpKSB7CisJCQltdW5tYXAoaWR4X21hcCwgaWR4X3NpemUpOworCQkJcmV0dXJuIGVycm9yKCJwYWNrIHRvbyBsYXJnZSBmb3IgY3VycmVudCBkZWZpbml0aW9uIG9mIG9mZl90IGluICVzIiwgcGF0aCk7CisJCX0KKwl9CisKKwlwLT5pbmRleF92ZXJzaW9uID0gdmVyc2lvbjsKKwlwLT5pbmRleF9kYXRhID0gaWR4X21hcDsKKwlwLT5pbmRleF9zaXplID0gaWR4X3NpemU7CisJcC0+bnVtX29iamVjdHMgPSBucjsKKwlyZXR1cm4gMDsKK30KKworaW50IG9wZW5fcGFja19pbmRleChzdHJ1Y3QgcGFja2VkX2dpdCAqcCkKK3sKKwljaGFyICppZHhfbmFtZTsKKwlpbnQgcmV0OworCisJaWYgKHAtPmluZGV4X2RhdGEpCisJCXJldHVybiAwOworCisJaWR4X25hbWUgPSB4c3RyZHVwKHAtPnBhY2tfbmFtZSk7CisJc3RyY3B5KGlkeF9uYW1lICsgc3RybGVuKGlkeF9uYW1lKSAtIHN0cmxlbigiLnBhY2siKSwgIi5pZHgiKTsKKwlyZXQgPSBjaGVja19wYWNrZWRfZ2l0X2lkeChpZHhfbmFtZSwgcCk7CisJZnJlZShpZHhfbmFtZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc2Nhbl93aW5kb3dzKHN0cnVjdCBwYWNrZWRfZ2l0ICpwLAorCXN0cnVjdCBwYWNrZWRfZ2l0ICoqbHJ1X3AsCisJc3RydWN0IHBhY2tfd2luZG93ICoqbHJ1X3csCisJc3RydWN0IHBhY2tfd2luZG93ICoqbHJ1X2wpCit7CisJc3RydWN0IHBhY2tfd2luZG93ICp3LCAqd19sOworCisJZm9yICh3X2wgPSBOVUxMLCB3ID0gcC0+d2luZG93czsgdzsgdyA9IHctPm5leHQpIHsKKwkJaWYgKCF3LT5pbnVzZV9jbnQpIHsKKwkJCWlmICghKmxydV93IHx8IHctPmxhc3RfdXNlZCA8ICgqbHJ1X3cpLT5sYXN0X3VzZWQpIHsKKwkJCQkqbHJ1X3AgPSBwOworCQkJCSpscnVfdyA9IHc7CisJCQkJKmxydV9sID0gd19sOworCQkJfQorCQl9CisJCXdfbCA9IHc7CisJfQorfQorCitzdGF0aWMgaW50IHVudXNlX29uZV93aW5kb3coc3RydWN0IHBhY2tlZF9naXQgKmN1cnJlbnQsIGludCBrZWVwX2ZkKQoreworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwLCAqbHJ1X3AgPSBOVUxMOworCXN0cnVjdCBwYWNrX3dpbmRvdyAqbHJ1X3cgPSBOVUxMLCAqbHJ1X2wgPSBOVUxMOworCisJaWYgKGN1cnJlbnQpCisJCXNjYW5fd2luZG93cyhjdXJyZW50LCAmbHJ1X3AsICZscnVfdywgJmxydV9sKTsKKwlmb3IgKHAgPSBwYWNrZWRfZ2l0OyBwOyBwID0gcC0+bmV4dCkKKwkJc2Nhbl93aW5kb3dzKHAsICZscnVfcCwgJmxydV93LCAmbHJ1X2wpOworCWlmIChscnVfcCkgeworCQltdW5tYXAobHJ1X3ctPmJhc2UsIGxydV93LT5sZW4pOworCQlwYWNrX21hcHBlZCAtPSBscnVfdy0+bGVuOworCQlpZiAobHJ1X2wpCisJCQlscnVfbC0+bmV4dCA9IGxydV93LT5uZXh0OworCQllbHNlIHsKKwkJCWxydV9wLT53aW5kb3dzID0gbHJ1X3ctPm5leHQ7CisJCQlpZiAoIWxydV9wLT53aW5kb3dzICYmIGxydV9wLT5wYWNrX2ZkICE9IGtlZXBfZmQpIHsKKwkJCQljbG9zZShscnVfcC0+cGFja19mZCk7CisJCQkJbHJ1X3AtPnBhY2tfZmQgPSAtMTsKKwkJCX0KKwkJfQorCQlmcmVlKGxydV93KTsKKwkJcGFja19vcGVuX3dpbmRvd3MtLTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIHJlbGVhc2VfcGFja19tZW1vcnkoc2l6ZV90IG5lZWQsIGludCBmZCkKK3sKKwlzaXplX3QgY3VyID0gcGFja19tYXBwZWQ7CisJd2hpbGUgKG5lZWQgPj0gKGN1ciAtIHBhY2tfbWFwcGVkKSAmJiB1bnVzZV9vbmVfd2luZG93KE5VTEwsIGZkKSkKKwkJOyAvKiBub3RoaW5nICovCit9CisKK3ZvaWQgY2xvc2VfcGFja193aW5kb3dzKHN0cnVjdCBwYWNrZWRfZ2l0ICpwKQoreworCXdoaWxlIChwLT53aW5kb3dzKSB7CisJCXN0cnVjdCBwYWNrX3dpbmRvdyAqdyA9IHAtPndpbmRvd3M7CisKKwkJaWYgKHctPmludXNlX2NudCkKKwkJCWRpZSgicGFjayAnJXMnIHN0aWxsIGhhcyBvcGVuIHdpbmRvd3MgdG8gaXQiLAorCQkJICAgIHAtPnBhY2tfbmFtZSk7CisJCW11bm1hcCh3LT5iYXNlLCB3LT5sZW4pOworCQlwYWNrX21hcHBlZCAtPSB3LT5sZW47CisJCXBhY2tfb3Blbl93aW5kb3dzLS07CisJCXAtPndpbmRvd3MgPSB3LT5uZXh0OworCQlmcmVlKHcpOworCX0KK30KKwordm9pZCB1bnVzZV9wYWNrKHN0cnVjdCBwYWNrX3dpbmRvdyAqKndfY3Vyc29yKQoreworCXN0cnVjdCBwYWNrX3dpbmRvdyAqdyA9ICp3X2N1cnNvcjsKKwlpZiAodykgeworCQl3LT5pbnVzZV9jbnQtLTsKKwkJKndfY3Vyc29yID0gTlVMTDsKKwl9Cit9CisKKy8qCisgKiBEbyBub3QgY2FsbCB0aGlzIGRpcmVjdGx5IGFzIHRoaXMgbGVha3MgcC0+cGFja19mZCBvbiBlcnJvciByZXR1cm47CisgKiBjYWxsIG9wZW5fcGFja2VkX2dpdCgpIGluc3RlYWQuCisgKi8KK3N0YXRpYyBpbnQgb3Blbl9wYWNrZWRfZ2l0XzEoc3RydWN0IHBhY2tlZF9naXQgKnApCit7CisJc3RydWN0IHN0YXQgc3Q7CisJc3RydWN0IHBhY2tfaGVhZGVyIGhkcjsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXVuc2lnbmVkIGNoYXIgKmlkeF9zaGExOworCWxvbmcgZmRfZmxhZzsKKworCWlmICghcC0+aW5kZXhfZGF0YSAmJiBvcGVuX3BhY2tfaW5kZXgocCkpCisJCXJldHVybiBlcnJvcigicGFja2ZpbGUgJXMgaW5kZXggdW5hdmFpbGFibGUiLCBwLT5wYWNrX25hbWUpOworCisJcC0+cGFja19mZCA9IG9wZW4ocC0+cGFja19uYW1lLCBPX1JET05MWSk7CisJaWYgKHAtPnBhY2tfZmQgPCAwIHx8IGZzdGF0KHAtPnBhY2tfZmQsICZzdCkpCisJCXJldHVybiAtMTsKKworCS8qIElmIHdlIGNyZWF0ZWQgdGhlIHN0cnVjdCBiZWZvcmUgd2UgaGFkIHRoZSBwYWNrIHdlIGxhY2sgc2l6ZS4gKi8KKwlpZiAoIXAtPnBhY2tfc2l6ZSkgeworCQlpZiAoIVNfSVNSRUcoc3Quc3RfbW9kZSkpCisJCQlyZXR1cm4gZXJyb3IoInBhY2tmaWxlICVzIG5vdCBhIHJlZ3VsYXIgZmlsZSIsIHAtPnBhY2tfbmFtZSk7CisJCXAtPnBhY2tfc2l6ZSA9IHN0LnN0X3NpemU7CisJfSBlbHNlIGlmIChwLT5wYWNrX3NpemUgIT0gc3Quc3Rfc2l6ZSkKKwkJcmV0dXJuIGVycm9yKCJwYWNrZmlsZSAlcyBzaXplIGNoYW5nZWQiLCBwLT5wYWNrX25hbWUpOworCisJLyogV2UgbGVhdmUgdGhlc2UgZmlsZSBkZXNjcmlwdG9ycyBvcGVuIHdpdGggc2xpZGluZyBtbWFwOworCSAqIHRoZXJlIGlzIG5vIHBvaW50IGtlZXBpbmcgdGhlbSBvcGVuIGFjcm9zcyBleGVjKCksIHRob3VnaC4KKwkgKi8KKwlmZF9mbGFnID0gZmNudGwocC0+cGFja19mZCwgRl9HRVRGRCwgMCk7CisJaWYgKGZkX2ZsYWcgPCAwKQorCQlyZXR1cm4gZXJyb3IoImNhbm5vdCBkZXRlcm1pbmUgZmlsZSBkZXNjcmlwdG9yIGZsYWdzIik7CisJZmRfZmxhZyB8PSBGRF9DTE9FWEVDOworCWlmIChmY250bChwLT5wYWNrX2ZkLCBGX1NFVEZELCBmZF9mbGFnKSA9PSAtMSkKKwkJcmV0dXJuIGVycm9yKCJjYW5ub3Qgc2V0IEZEX0NMT0VYRUMiKTsKKworCS8qIFZlcmlmeSB3ZSByZWNvZ25pemUgdGhpcyBwYWNrIGZpbGUgZm9ybWF0LiAqLworCWlmIChyZWFkX2luX2Z1bGwocC0+cGFja19mZCwgJmhkciwgc2l6ZW9mKGhkcikpICE9IHNpemVvZihoZHIpKQorCQlyZXR1cm4gZXJyb3IoImZpbGUgJXMgaXMgZmFyIHRvbyBzaG9ydCB0byBiZSBhIHBhY2tmaWxlIiwgcC0+cGFja19uYW1lKTsKKwlpZiAoaGRyLmhkcl9zaWduYXR1cmUgIT0gaHRvbmwoUEFDS19TSUdOQVRVUkUpKQorCQlyZXR1cm4gZXJyb3IoImZpbGUgJXMgaXMgbm90IGEgR0lUIHBhY2tmaWxlIiwgcC0+cGFja19uYW1lKTsKKwlpZiAoIXBhY2tfdmVyc2lvbl9vayhoZHIuaGRyX3ZlcnNpb24pKQorCQlyZXR1cm4gZXJyb3IoInBhY2tmaWxlICVzIGlzIHZlcnNpb24gJXUgYW5kIG5vdCBzdXBwb3J0ZWQiCisJCQkiICh0cnkgdXBncmFkaW5nIEdJVCB0byBhIG5ld2VyIHZlcnNpb24pIiwKKwkJCXAtPnBhY2tfbmFtZSwgbnRvaGwoaGRyLmhkcl92ZXJzaW9uKSk7CisKKwkvKiBWZXJpZnkgdGhlIHBhY2sgbWF0Y2hlcyBpdHMgaW5kZXguICovCisJaWYgKHAtPm51bV9vYmplY3RzICE9IG50b2hsKGhkci5oZHJfZW50cmllcykpCisJCXJldHVybiBlcnJvcigicGFja2ZpbGUgJXMgY2xhaW1zIHRvIGhhdmUgJXUgb2JqZWN0cyIKKwkJCSAgICAgIiB3aGlsZSBpbmRleCBpbmRpY2F0ZXMgJXUgb2JqZWN0cyIsCisJCQkgICAgIHAtPnBhY2tfbmFtZSwgbnRvaGwoaGRyLmhkcl9lbnRyaWVzKSwKKwkJCSAgICAgcC0+bnVtX29iamVjdHMpOworCWlmIChsc2VlayhwLT5wYWNrX2ZkLCBwLT5wYWNrX3NpemUgLSBzaXplb2Yoc2hhMSksIFNFRUtfU0VUKSA9PSAtMSkKKwkJcmV0dXJuIGVycm9yKCJlbmQgb2YgcGFja2ZpbGUgJXMgaXMgdW5hdmFpbGFibGUiLCBwLT5wYWNrX25hbWUpOworCWlmIChyZWFkX2luX2Z1bGwocC0+cGFja19mZCwgc2hhMSwgc2l6ZW9mKHNoYTEpKSAhPSBzaXplb2Yoc2hhMSkpCisJCXJldHVybiBlcnJvcigicGFja2ZpbGUgJXMgc2lnbmF0dXJlIGlzIHVuYXZhaWxhYmxlIiwgcC0+cGFja19uYW1lKTsKKwlpZHhfc2hhMSA9ICgodW5zaWduZWQgY2hhciAqKXAtPmluZGV4X2RhdGEpICsgcC0+aW5kZXhfc2l6ZSAtIDQwOworCWlmIChoYXNoY21wKHNoYTEsIGlkeF9zaGExKSkKKwkJcmV0dXJuIGVycm9yKCJwYWNrZmlsZSAlcyBkb2VzIG5vdCBtYXRjaCBpbmRleCIsIHAtPnBhY2tfbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Blbl9wYWNrZWRfZ2l0KHN0cnVjdCBwYWNrZWRfZ2l0ICpwKQoreworCWlmICghb3Blbl9wYWNrZWRfZ2l0XzEocCkpCisJCXJldHVybiAwOworCWlmIChwLT5wYWNrX2ZkICE9IC0xKSB7CisJCWNsb3NlKHAtPnBhY2tfZmQpOworCQlwLT5wYWNrX2ZkID0gLTE7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBpbl93aW5kb3coc3RydWN0IHBhY2tfd2luZG93ICp3aW4sIG9mZl90IG9mZnNldCkKK3sKKwkvKiBXZSBtdXN0IHByb21pc2UgYXQgbGVhc3QgMjAgYnl0ZXMgKG9uZSBoYXNoKSBhZnRlciB0aGUKKwkgKiBvZmZzZXQgaXMgYXZhaWxhYmxlIGZyb20gdGhpcyB3aW5kb3csIG90aGVyd2lzZSB0aGUgb2Zmc2V0CisJICogaXMgbm90IGFjdHVhbGx5IGluIHRoaXMgd2luZG93IGFuZCBhIGRpZmZlcmVudCB3aW5kb3cgKHdoaWNoCisJICogaGFzIHRoYXQgb25lIGhhc2ggZXhjZXNzKSBtdXN0IGJlIHVzZWQuICBUaGlzIGlzIHRvIHN1cHBvcnQKKwkgKiB0aGUgb2JqZWN0IGhlYWRlciBhbmQgZGVsdGEgYmFzZSBwYXJzaW5nIHJvdXRpbmVzIGJlbG93LgorCSAqLworCW9mZl90IHdpbl9vZmYgPSB3aW4tPm9mZnNldDsKKwlyZXR1cm4gd2luX29mZiA8PSBvZmZzZXQKKwkJJiYgKG9mZnNldCArIDIwKSA8PSAod2luX29mZiArIHdpbi0+bGVuKTsKK30KKwordW5zaWduZWQgY2hhciogdXNlX3BhY2soc3RydWN0IHBhY2tlZF9naXQgKnAsCisJCXN0cnVjdCBwYWNrX3dpbmRvdyAqKndfY3Vyc29yLAorCQlvZmZfdCBvZmZzZXQsCisJCXVuc2lnbmVkIGludCAqbGVmdCkKK3sKKwlzdHJ1Y3QgcGFja193aW5kb3cgKndpbiA9ICp3X2N1cnNvcjsKKworCWlmIChwLT5wYWNrX2ZkID09IC0xICYmIG9wZW5fcGFja2VkX2dpdChwKSkKKwkJZGllKCJwYWNrZmlsZSAlcyBjYW5ub3QgYmUgYWNjZXNzZWQiLCBwLT5wYWNrX25hbWUpOworCisJLyogU2luY2UgcGFja2ZpbGVzIGVuZCBpbiBhIGhhc2ggb2YgdGhlaXIgY29udGVudCBhbmQgaXRzCisJICogcG9pbnRsZXNzIHRvIGFzayBmb3IgYW4gb2Zmc2V0IGludG8gdGhlIG1pZGRsZSBvZiB0aGF0CisJICogaGFzaCwgYW5kIHRoZSBpbl93aW5kb3cgZnVuY3Rpb24gYWJvdmUgd291bGRuJ3QgbWF0Y2gKKwkgKiBkb24ndCBhbGxvdyBhbiBvZmZzZXQgdG9vIGNsb3NlIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUuCisJICovCisJaWYgKG9mZnNldCA+IChwLT5wYWNrX3NpemUgLSAyMCkpCisJCWRpZSgib2Zmc2V0IGJleW9uZCBlbmQgb2YgcGFja2ZpbGUgKHRydW5jYXRlZCBwYWNrPykiKTsKKworCWlmICghd2luIHx8ICFpbl93aW5kb3cod2luLCBvZmZzZXQpKSB7CisJCWlmICh3aW4pCisJCQl3aW4tPmludXNlX2NudC0tOworCQlmb3IgKHdpbiA9IHAtPndpbmRvd3M7IHdpbjsgd2luID0gd2luLT5uZXh0KSB7CisJCQlpZiAoaW5fd2luZG93KHdpbiwgb2Zmc2V0KSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoIXdpbikgeworCQkJc2l6ZV90IHdpbmRvd19hbGlnbiA9IHBhY2tlZF9naXRfd2luZG93X3NpemUgLyAyOworCQkJb2ZmX3QgbGVuOworCQkJd2luID0geGNhbGxvYygxLCBzaXplb2YoKndpbikpOworCQkJd2luLT5vZmZzZXQgPSAob2Zmc2V0IC8gd2luZG93X2FsaWduKSAqIHdpbmRvd19hbGlnbjsKKwkJCWxlbiA9IHAtPnBhY2tfc2l6ZSAtIHdpbi0+b2Zmc2V0OworCQkJaWYgKGxlbiA+IHBhY2tlZF9naXRfd2luZG93X3NpemUpCisJCQkJbGVuID0gcGFja2VkX2dpdF93aW5kb3dfc2l6ZTsKKwkJCXdpbi0+bGVuID0gKHNpemVfdClsZW47CisJCQlwYWNrX21hcHBlZCArPSB3aW4tPmxlbjsKKwkJCXdoaWxlIChwYWNrZWRfZ2l0X2xpbWl0IDwgcGFja19tYXBwZWQKKwkJCQkmJiB1bnVzZV9vbmVfd2luZG93KHAsIHAtPnBhY2tfZmQpKQorCQkJCTsgLyogbm90aGluZyAqLworCQkJd2luLT5iYXNlID0geG1tYXAoTlVMTCwgd2luLT5sZW4sCisJCQkJUFJPVF9SRUFELCBNQVBfUFJJVkFURSwKKwkJCQlwLT5wYWNrX2ZkLCB3aW4tPm9mZnNldCk7CisJCQlpZiAod2luLT5iYXNlID09IE1BUF9GQUlMRUQpCisJCQkJZGllKCJwYWNrZmlsZSAlcyBjYW5ub3QgYmUgbWFwcGVkOiAlcyIsCisJCQkJCXAtPnBhY2tfbmFtZSwKKwkJCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJCXBhY2tfbW1hcF9jYWxscysrOworCQkJcGFja19vcGVuX3dpbmRvd3MrKzsKKwkJCWlmIChwYWNrX21hcHBlZCA+IHBlYWtfcGFja19tYXBwZWQpCisJCQkJcGVha19wYWNrX21hcHBlZCA9IHBhY2tfbWFwcGVkOworCQkJaWYgKHBhY2tfb3Blbl93aW5kb3dzID4gcGVha19wYWNrX29wZW5fd2luZG93cykKKwkJCQlwZWFrX3BhY2tfb3Blbl93aW5kb3dzID0gcGFja19vcGVuX3dpbmRvd3M7CisJCQl3aW4tPm5leHQgPSBwLT53aW5kb3dzOworCQkJcC0+d2luZG93cyA9IHdpbjsKKwkJfQorCX0KKwlpZiAod2luICE9ICp3X2N1cnNvcikgeworCQl3aW4tPmxhc3RfdXNlZCA9IHBhY2tfdXNlZF9jdHIrKzsKKwkJd2luLT5pbnVzZV9jbnQrKzsKKwkJKndfY3Vyc29yID0gd2luOworCX0KKwlvZmZzZXQgLT0gd2luLT5vZmZzZXQ7CisJaWYgKGxlZnQpCisJCSpsZWZ0ID0gd2luLT5sZW4gLSB4c2l6ZV90KG9mZnNldCk7CisJcmV0dXJuIHdpbi0+YmFzZSArIG9mZnNldDsKK30KKworc3RydWN0IHBhY2tlZF9naXQgKmFkZF9wYWNrZWRfZ2l0KGNvbnN0IGNoYXIgKnBhdGgsIGludCBwYXRoX2xlbiwgaW50IGxvY2FsKQoreworCXN0cnVjdCBzdGF0IHN0OworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwID0geG1hbGxvYyhzaXplb2YoKnApICsgcGF0aF9sZW4gKyAyKTsKKworCS8qCisJICogTWFrZSBzdXJlIGEgY29ycmVzcG9uZGluZyAucGFjayBmaWxlIGV4aXN0cyBhbmQgdGhhdAorCSAqIHRoZSBpbmRleCBsb29rcyBzYW5lLgorCSAqLworCXBhdGhfbGVuIC09IHN0cmxlbigiLmlkeCIpOworCWlmIChwYXRoX2xlbiA8IDEpCisJCXJldHVybiBOVUxMOworCW1lbWNweShwLT5wYWNrX25hbWUsIHBhdGgsIHBhdGhfbGVuKTsKKwlzdHJjcHkocC0+cGFja19uYW1lICsgcGF0aF9sZW4sICIucGFjayIpOworCWlmIChzdGF0KHAtPnBhY2tfbmFtZSwgJnN0KSB8fCAhU19JU1JFRyhzdC5zdF9tb2RlKSkgeworCQlmcmVlKHApOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBvaywgaXQgbG9va3Mgc2FuZSBhcyBmYXIgYXMgd2UgY2FuIGNoZWNrIHdpdGhvdXQKKwkgKiBhY3R1YWxseSBtYXBwaW5nIHRoZSBwYWNrIGZpbGUuCisJICovCisJcC0+aW5kZXhfdmVyc2lvbiA9IDA7CisJcC0+aW5kZXhfZGF0YSA9IE5VTEw7CisJcC0+aW5kZXhfc2l6ZSA9IDA7CisJcC0+bnVtX29iamVjdHMgPSAwOworCXAtPnBhY2tfc2l6ZSA9IHN0LnN0X3NpemU7CisJcC0+bmV4dCA9IE5VTEw7CisJcC0+d2luZG93cyA9IE5VTEw7CisJcC0+cGFja19mZCA9IC0xOworCXAtPnBhY2tfbG9jYWwgPSBsb2NhbDsKKwlwLT5tdGltZSA9IHN0LnN0X210aW1lOworCWlmIChwYXRoX2xlbiA8IDQwIHx8IGdldF9zaGExX2hleChwYXRoICsgcGF0aF9sZW4gLSA0MCwgcC0+c2hhMSkpCisJCWhhc2hjbHIocC0+c2hhMSk7CisJcmV0dXJuIHA7Cit9CisKK3N0cnVjdCBwYWNrZWRfZ2l0ICpwYXJzZV9wYWNrX2luZGV4KHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJY2hhciAqcGF0aCA9IHNoYTFfcGFja19pbmRleF9uYW1lKHNoYTEpOworCXJldHVybiBwYXJzZV9wYWNrX2luZGV4X2ZpbGUoc2hhMSwgcGF0aCk7Cit9CisKK3N0cnVjdCBwYWNrZWRfZ2l0ICpwYXJzZV9wYWNrX2luZGV4X2ZpbGUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCQkJIGNvbnN0IGNoYXIgKmlkeF9wYXRoKQoreworCWNvbnN0IGNoYXIgKnBhdGggPSBzaGExX3BhY2tfbmFtZShzaGExKTsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcCA9IHhtYWxsb2Moc2l6ZW9mKCpwKSArIHN0cmxlbihwYXRoKSArIDIpOworCisJaWYgKGNoZWNrX3BhY2tlZF9naXRfaWR4KGlkeF9wYXRoLCBwKSkgeworCQlmcmVlKHApOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzdHJjcHkocC0+cGFja19uYW1lLCBwYXRoKTsKKwlwLT5wYWNrX3NpemUgPSAwOworCXAtPm5leHQgPSBOVUxMOworCXAtPndpbmRvd3MgPSBOVUxMOworCXAtPnBhY2tfZmQgPSAtMTsKKwloYXNoY3B5KHAtPnNoYTEsIHNoYTEpOworCXJldHVybiBwOworfQorCit2b2lkIGluc3RhbGxfcGFja2VkX2dpdChzdHJ1Y3QgcGFja2VkX2dpdCAqcGFjaykKK3sKKwlwYWNrLT5uZXh0ID0gcGFja2VkX2dpdDsKKwlwYWNrZWRfZ2l0ID0gcGFjazsKK30KKworc3RhdGljIHZvaWQgcHJlcGFyZV9wYWNrZWRfZ2l0X29uZShjaGFyICpvYmpkaXIsIGludCBsb2NhbCkKK3sKKwkvKiBFbnN1cmUgdGhhdCB0aGlzIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggc28gdGhhdCB3ZSBjYW4KKwkgICBhcHBlbmQgIi9wYWNrLyIgd2l0aG91dCBjbG9iYmVyaW5nIHRoZSBzdGFjayBldmVuIGlmCisJICAgc3RybGVuKG9iamRpcikgd2VyZSBQQVRIX01BWC4gICovCisJY2hhciBwYXRoW1BBVEhfTUFYICsgMSArIDQgKyAxICsgMV07CisJaW50IGxlbjsKKwlESVIgKmRpcjsKKwlzdHJ1Y3QgZGlyZW50ICpkZTsKKworCXNwcmludGYocGF0aCwgIiVzL3BhY2siLCBvYmpkaXIpOworCWxlbiA9IHN0cmxlbihwYXRoKTsKKwlkaXIgPSBvcGVuZGlyKHBhdGgpOworCWlmICghZGlyKSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQpCisJCQllcnJvcigidW5hYmxlIHRvIG9wZW4gb2JqZWN0IHBhY2sgZGlyZWN0b3J5OiAlczogJXMiLAorCQkJICAgICAgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuOworCX0KKwlwYXRoW2xlbisrXSA9ICcvJzsKKwl3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCWludCBuYW1lbGVuID0gc3RybGVuKGRlLT5kX25hbWUpOworCQlzdHJ1Y3QgcGFja2VkX2dpdCAqcDsKKworCQlpZiAoIWhhc19leHRlbnNpb24oZGUtPmRfbmFtZSwgIi5pZHgiKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChsZW4gKyBuYW1lbGVuICsgMSA+IHNpemVvZihwYXRoKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIERvbid0IHJlb3BlbiBhIHBhY2sgd2UgYWxyZWFkeSBoYXZlLiAqLworCQlzdHJjcHkocGF0aCArIGxlbiwgZGUtPmRfbmFtZSk7CisJCWZvciAocCA9IHBhY2tlZF9naXQ7IHA7IHAgPSBwLT5uZXh0KSB7CisJCQlpZiAoIW1lbWNtcChwYXRoLCBwLT5wYWNrX25hbWUsIGxlbiArIG5hbWVsZW4gLSA0KSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAocCkKKwkJCWNvbnRpbnVlOworCQkvKiBTZWUgaWYgaXQgcmVhbGx5IGlzIGEgdmFsaWQgLmlkeCBmaWxlIHdpdGggY29ycmVzcG9uZGluZworCQkgKiAucGFjayBmaWxlIHRoYXQgd2UgY2FuIG1hcC4KKwkJICovCisJCXAgPSBhZGRfcGFja2VkX2dpdChwYXRoLCBsZW4gKyBuYW1lbGVuLCBsb2NhbCk7CisJCWlmICghcCkKKwkJCWNvbnRpbnVlOworCQlpbnN0YWxsX3BhY2tlZF9naXQocCk7CisJfQorCWNsb3NlZGlyKGRpcik7Cit9CisKK3N0YXRpYyBpbnQgc29ydF9wYWNrKGNvbnN0IHZvaWQgKmFfLCBjb25zdCB2b2lkICpiXykKK3sKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqYSA9ICooKHN0cnVjdCBwYWNrZWRfZ2l0ICoqKWFfKTsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqYiA9ICooKHN0cnVjdCBwYWNrZWRfZ2l0ICoqKWJfKTsKKwlpbnQgc3Q7CisKKwkvKgorCSAqIExvY2FsIHBhY2tzIHRlbmQgdG8gY29udGFpbiBvYmplY3RzIHNwZWNpZmljIHRvIG91cgorCSAqIHZhcmlhbnQgb2YgdGhlIHByb2plY3QgdGhhbiByZW1vdGUgb25lcy4gIEluIGFkZGl0aW9uLAorCSAqIHJlbW90ZSBvbmVzIGNvdWxkIGJlIG9uIGEgbmV0d29yayBtb3VudGVkIGZpbGVzeXN0ZW0uCisJICogRmF2b3IgbG9jYWwgb25lcyBmb3IgdGhlc2UgcmVhc29ucy4KKwkgKi8KKwlzdCA9IGEtPnBhY2tfbG9jYWwgLSBiLT5wYWNrX2xvY2FsOworCWlmIChzdCkKKwkJcmV0dXJuIC1zdDsKKworCS8qCisJICogWW91bmdlciBwYWNrcyB0ZW5kIHRvIGNvbnRhaW4gbW9yZSByZWNlbnQgb2JqZWN0cywKKwkgKiBhbmQgbW9yZSByZWNlbnQgb2JqZWN0cyB0ZW5kIHRvIGdldCBhY2Nlc3NlZCBtb3JlCisJICogb2Z0ZW4uCisJICovCisJaWYgKGEtPm10aW1lIDwgYi0+bXRpbWUpCisJCXJldHVybiAxOworCWVsc2UgaWYgKGEtPm10aW1lID09IGItPm10aW1lKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHJlYXJyYW5nZV9wYWNrZWRfZ2l0KHZvaWQpCit7CisJc3RydWN0IHBhY2tlZF9naXQgKiphcnksICpwOworCWludCBpLCBuOworCisJZm9yIChuID0gMCwgcCA9IHBhY2tlZF9naXQ7IHA7IHAgPSBwLT5uZXh0KQorCQluKys7CisJaWYgKG4gPCAyKQorCQlyZXR1cm47CisKKwkvKiBwcmVwYXJlIGFuIGFycmF5IG9mIHBhY2tlZF9naXQgZm9yIGVhc2llciBzb3J0aW5nICovCisJYXJ5ID0geGNhbGxvYyhuLCBzaXplb2Yoc3RydWN0IHBhY2tlZF9naXQgKikpOworCWZvciAobiA9IDAsIHAgPSBwYWNrZWRfZ2l0OyBwOyBwID0gcC0+bmV4dCkKKwkJYXJ5W24rK10gPSBwOworCisJcXNvcnQoYXJ5LCBuLCBzaXplb2Yoc3RydWN0IHBhY2tlZF9naXQgKiksIHNvcnRfcGFjayk7CisKKwkvKiBsaW5rIHRoZW0gYmFjayBhZ2FpbiAqLworCWZvciAoaSA9IDA7IGkgPCBuIC0gMTsgaSsrKQorCQlhcnlbaV0tPm5leHQgPSBhcnlbaSArIDFdOworCWFyeVtuIC0gMV0tPm5leHQgPSBOVUxMOworCXBhY2tlZF9naXQgPSBhcnlbMF07CisKKwlmcmVlKGFyeSk7Cit9CisKK3N0YXRpYyBpbnQgcHJlcGFyZV9wYWNrZWRfZ2l0X3J1bl9vbmNlID0gMDsKK3ZvaWQgcHJlcGFyZV9wYWNrZWRfZ2l0KHZvaWQpCit7CisJc3RydWN0IGFsdGVybmF0ZV9vYmplY3RfZGF0YWJhc2UgKmFsdDsKKworCWlmIChwcmVwYXJlX3BhY2tlZF9naXRfcnVuX29uY2UpCisJCXJldHVybjsKKwlwcmVwYXJlX3BhY2tlZF9naXRfb25lKGdldF9vYmplY3RfZGlyZWN0b3J5KCksIDEpOworCXByZXBhcmVfYWx0X29kYigpOworCWZvciAoYWx0ID0gYWx0X29kYl9saXN0OyBhbHQ7IGFsdCA9IGFsdC0+bmV4dCkgeworCQlhbHQtPm5hbWVbLTFdID0gMDsKKwkJcHJlcGFyZV9wYWNrZWRfZ2l0X29uZShhbHQtPmJhc2UsIDApOworCQlhbHQtPm5hbWVbLTFdID0gJy8nOworCX0KKwlyZWFycmFuZ2VfcGFja2VkX2dpdCgpOworCXByZXBhcmVfcGFja2VkX2dpdF9ydW5fb25jZSA9IDE7Cit9CisKK3ZvaWQgcmVwcmVwYXJlX3BhY2tlZF9naXQodm9pZCkKK3sKKwlwcmVwYXJlX3BhY2tlZF9naXRfcnVuX29uY2UgPSAwOworCXByZXBhcmVfcGFja2VkX2dpdCgpOworfQorCitpbnQgY2hlY2tfc2hhMV9zaWduYXR1cmUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgdm9pZCAqbWFwLCB1bnNpZ25lZCBsb25nIHNpemUsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJdW5zaWduZWQgY2hhciByZWFsX3NoYTFbMjBdOworCWhhc2hfc2hhMV9maWxlKG1hcCwgc2l6ZSwgdHlwZSwgcmVhbF9zaGExKTsKKwlyZXR1cm4gaGFzaGNtcChzaGExLCByZWFsX3NoYTEpID8gLTEgOiAwOworfQorCitzdGF0aWMgdm9pZCAqbWFwX3NoYTFfZmlsZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCB1bnNpZ25lZCBsb25nICpzaXplKQoreworCXN0cnVjdCBzdGF0IHN0OworCXZvaWQgKm1hcDsKKwlpbnQgZmQ7CisJY2hhciAqZmlsZW5hbWUgPSBmaW5kX3NoYTFfZmlsZShzaGExLCAmc3QpOworCisJaWYgKCFmaWxlbmFtZSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZIHwgc2hhMV9maWxlX29wZW5fZmxhZyk7CisJaWYgKGZkIDwgMCkgeworCQkvKiBTZWUgaWYgaXQgd29ya3Mgd2l0aG91dCBPX05PQVRJTUUgKi8KKwkJc3dpdGNoIChzaGExX2ZpbGVfb3Blbl9mbGFnKSB7CisJCWRlZmF1bHQ6CisJCQlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwkJCWlmIChmZCA+PSAwKQorCQkJCWJyZWFrOworCQkvKiBGYWxsdGhyb3VnaCAqLworCQljYXNlIDA6CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCS8qIElmIGl0IGZhaWxlZCBvbmNlLCBpdCB3aWxsIHByb2JhYmx5IGZhaWwgYWdhaW4uCisJCSAqIFN0b3AgdXNpbmcgT19OT0FUSU1FCisJCSAqLworCQlzaGExX2ZpbGVfb3Blbl9mbGFnID0gMDsKKwl9CisJKnNpemUgPSB4c2l6ZV90KHN0LnN0X3NpemUpOworCW1hcCA9IHhtbWFwKE5VTEwsICpzaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisJY2xvc2UoZmQpOworCXJldHVybiBtYXA7Cit9CisKK3N0YXRpYyBpbnQgbGVnYWN5X2xvb3NlX29iamVjdCh1bnNpZ25lZCBjaGFyICptYXApCit7CisJdW5zaWduZWQgaW50IHdvcmQ7CisKKwkvKgorCSAqIElzIGl0IGEgemxpYi1jb21wcmVzc2VkIGJ1ZmZlcj8gSWYgc28sIHRoZSBmaXJzdCBieXRlCisJICogbXVzdCBiZSAweDc4ICgxNS1iaXQgd2luZG93IHNpemUsIGRlZmxhdGVkKSwgYW5kIHRoZQorCSAqIGZpcnN0IDE2LWJpdCB3b3JkIGlzIGV2ZW5seSBkaXZpc2libGUgYnkgMzEKKwkgKi8KKwl3b3JkID0gKG1hcFswXSA8PCA4KSArIG1hcFsxXTsKKwlpZiAobWFwWzBdID09IDB4NzggJiYgISh3b3JkICUgMzEpKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCit1bnNpZ25lZCBsb25nIHVucGFja19vYmplY3RfaGVhZGVyX2dlbnRseShjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuLCBlbnVtIG9iamVjdF90eXBlICp0eXBlLCB1bnNpZ25lZCBsb25nICpzaXplcCkKK3sKKwl1bnNpZ25lZCBzaGlmdDsKKwl1bnNpZ25lZCBjaGFyIGM7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIGxvbmcgdXNlZCA9IDA7CisKKwljID0gYnVmW3VzZWQrK107CisJKnR5cGUgPSAoYyA+PiA0KSAmIDc7CisJc2l6ZSA9IGMgJiAxNTsKKwlzaGlmdCA9IDQ7CisJd2hpbGUgKGMgJiAweDgwKSB7CisJCWlmIChsZW4gPD0gdXNlZCkKKwkJCXJldHVybiAwOworCQlpZiAoc2l6ZW9mKGxvbmcpICogOCA8PSBzaGlmdCkKKwkJCXJldHVybiAwOworCQljID0gYnVmW3VzZWQrK107CisJCXNpemUgKz0gKGMgJiAweDdmKSA8PCBzaGlmdDsKKwkJc2hpZnQgKz0gNzsKKwl9CisJKnNpemVwID0gc2l6ZTsKKwlyZXR1cm4gdXNlZDsKK30KKworc3RhdGljIGludCB1bnBhY2tfc2hhMV9oZWFkZXIoel9zdHJlYW0gKnN0cmVhbSwgdW5zaWduZWQgY2hhciAqbWFwLCB1bnNpZ25lZCBsb25nIG1hcHNpemUsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBidWZzaXopCit7CisJdW5zaWduZWQgbG9uZyBzaXplLCB1c2VkOworCXN0YXRpYyBjb25zdCBjaGFyIHZhbGlkX2xvb3NlX29iamVjdF90eXBlWzhdID0geworCQkwLCAvKiBPQkpfRVhUICovCisJCTEsIDEsIDEsIDEsIC8qICJjb21taXQiLCAidHJlZSIsICJibG9iIiwgInRhZyIgKi8KKwkJMCwgLyogImRlbHRhIiBhbmQgb3RoZXJzIGFyZSBpbnZhbGlkIGluIGEgbG9vc2Ugb2JqZWN0ICovCisJfTsKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisKKwkvKiBHZXQgdGhlIGRhdGEgc3RyZWFtICovCisJbWVtc2V0KHN0cmVhbSwgMCwgc2l6ZW9mKCpzdHJlYW0pKTsKKwlzdHJlYW0tPm5leHRfaW4gPSBtYXA7CisJc3RyZWFtLT5hdmFpbF9pbiA9IG1hcHNpemU7CisJc3RyZWFtLT5uZXh0X291dCA9IGJ1ZmZlcjsKKwlzdHJlYW0tPmF2YWlsX291dCA9IGJ1ZnNpejsKKworCWlmIChsZWdhY3lfbG9vc2Vfb2JqZWN0KG1hcCkpIHsKKwkJaW5mbGF0ZUluaXQoc3RyZWFtKTsKKwkJcmV0dXJuIGluZmxhdGUoc3RyZWFtLCAwKTsKKwl9CisKKworCS8qCisJICogVGhlcmUgdXNlZCB0byBiZSBhIHNlY29uZCBsb29zZSBvYmplY3QgaGVhZGVyIGZvcm1hdCB3aGljaAorCSAqIHdhcyBtZWFudCB0byBtaW1pYyB0aGUgaW4tcGFjayBmb3JtYXQsIGFsbG93aW5nIGZvciBkaXJlY3QKKwkgKiBjb3B5IG9mIHRoZSBvYmplY3QgZGF0YS4gIFRoaXMgZm9ybWF0IHR1cm5lZCB1cCBub3QgdG8gYmUKKwkgKiByZWFsbHkgd29ydGggaXQgYW5kIHdlIGRvbid0IHdyaXRlIGl0IGFueSBsb25nZXIuICBCdXQgd2UKKwkgKiBjYW4gc3RpbGwgcmVhZCBpdC4KKwkgKi8KKwl1c2VkID0gdW5wYWNrX29iamVjdF9oZWFkZXJfZ2VudGx5KG1hcCwgbWFwc2l6ZSwgJnR5cGUsICZzaXplKTsKKwlpZiAoIXVzZWQgfHwgIXZhbGlkX2xvb3NlX29iamVjdF90eXBlW3R5cGVdKQorCQlyZXR1cm4gLTE7CisJbWFwICs9IHVzZWQ7CisJbWFwc2l6ZSAtPSB1c2VkOworCisJLyogU2V0IHVwIHRoZSBzdHJlYW0gZm9yIHRoZSByZXN0Li4gKi8KKwlzdHJlYW0tPm5leHRfaW4gPSBtYXA7CisJc3RyZWFtLT5hdmFpbF9pbiA9IG1hcHNpemU7CisJaW5mbGF0ZUluaXQoc3RyZWFtKTsKKworCS8qIEFuZCBnZW5lcmF0ZSB0aGUgZmFrZSB0cmFkaXRpb25hbCBoZWFkZXIgKi8KKwlzdHJlYW0tPnRvdGFsX291dCA9IDEgKyBzbnByaW50ZihidWZmZXIsIGJ1ZnNpeiwgIiVzICVsdSIsCisJCQkJCSB0eXBlbmFtZSh0eXBlKSwgc2l6ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkICp1bnBhY2tfc2hhMV9yZXN0KHpfc3RyZWFtICpzdHJlYW0sIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBieXRlcyA9IHN0cmxlbihidWZmZXIpICsgMTsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSB4bWFsbG9jKDErc2l6ZSk7CisJdW5zaWduZWQgbG9uZyBuOworCWludCBzdGF0dXMgPSBaX09LOworCisJbiA9IHN0cmVhbS0+dG90YWxfb3V0IC0gYnl0ZXM7CisJaWYgKG4gPiBzaXplKQorCQluID0gc2l6ZTsKKwltZW1jcHkoYnVmLCAoY2hhciAqKSBidWZmZXIgKyBieXRlcywgbik7CisJYnl0ZXMgPSBuOworCWlmIChieXRlcyA8PSBzaXplKSB7CisJCS8qCisJCSAqIFRoZSBhYm92ZSBjb25kaXRpb24gbXVzdCBiZSAoYnl0ZXMgPD0gc2l6ZSksIG5vdAorCQkgKiAoYnl0ZXMgPCBzaXplKS4gIEluIG90aGVyIHdvcmRzLCBldmVuIHRob3VnaCB3ZQorCQkgKiBleHBlY3Qgbm8gbW9yZSBvdXRwdXQgYW5kIHNldCBhdmFpbF9vdXQgdG8gemVyMCwKKwkJICogdGhlIGlucHV0IHpsaWIgc3RyZWFtIG1heSBoYXZlIGJ5dGVzIHRoYXQgZXhwcmVzcworCQkgKiAidGhpcyBjb25jbHVkZXMgdGhlIHN0cmVhbSIsIGFuZCB3ZSAqZG8qIHdhbnQgdG8KKwkJICogZWF0IHRoYXQgaW5wdXQuCisJCSAqCisJCSAqIE90aGVyd2lzZSB3ZSB3b3VsZCBub3QgYmUgYWJsZSB0byB0ZXN0IHRoYXQgd2UKKwkJICogY29uc3VtZWQgYWxsIHRoZSBpbnB1dCB0byByZWFjaCB0aGUgZXhwZWN0ZWQgc2l6ZTsKKwkJICogd2UgYWxzbyB3YW50IHRvIGNoZWNrIHRoYXQgemxpYiB0ZWxscyB1cyB0aGF0IGFsbAorCQkgKiB3ZW50IHdlbGwgd2l0aCBzdGF0dXMgPT0gWl9TVFJFQU1fRU5EIGF0IHRoZSBlbmQuCisJCSAqLworCQlzdHJlYW0tPm5leHRfb3V0ID0gYnVmICsgYnl0ZXM7CisJCXN0cmVhbS0+YXZhaWxfb3V0ID0gc2l6ZSAtIGJ5dGVzOworCQl3aGlsZSAoc3RhdHVzID09IFpfT0spCisJCQlzdGF0dXMgPSBpbmZsYXRlKHN0cmVhbSwgWl9GSU5JU0gpOworCX0KKwlidWZbc2l6ZV0gPSAwOworCWlmIChzdGF0dXMgPT0gWl9TVFJFQU1fRU5EICYmICFzdHJlYW0tPmF2YWlsX2luKSB7CisJCWluZmxhdGVFbmQoc3RyZWFtKTsKKwkJcmV0dXJuIGJ1ZjsKKwl9CisKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZXJyb3IoImNvcnJ1cHQgbG9vc2Ugb2JqZWN0ICclcyciLCBzaGExX3RvX2hleChzaGExKSk7CisJZWxzZSBpZiAoc3RyZWFtLT5hdmFpbF9pbikKKwkJZXJyb3IoImdhcmJhZ2UgYXQgZW5kIG9mIGxvb3NlIG9iamVjdCAnJXMnIiwKKwkJICAgICAgc2hhMV90b19oZXgoc2hhMSkpOworCWZyZWUoYnVmKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFdlIHVzZWQgdG8ganVzdCB1c2UgInNzY2FuZigpIiwgYnV0IHRoYXQncyBhY3R1YWxseSB3YXkKKyAqIHRvbyBwZXJtaXNzaXZlIGZvciB3aGF0IHdlIHdhbnQgdG8gY2hlY2suIFNvIGRvIGFuIGFuYWwKKyAqIG9iamVjdCBoZWFkZXIgcGFyc2UgYnkgaGFuZC4KKyAqLworc3RhdGljIGludCBwYXJzZV9zaGExX2hlYWRlcihjb25zdCBjaGFyICpoZHIsIHVuc2lnbmVkIGxvbmcgKnNpemVwKQoreworCWNoYXIgdHlwZVsxMF07CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJLyoKKwkgKiBUaGUgdHlwZSBjYW4gYmUgYXQgbW9zdCB0ZW4gYnl0ZXMgKGluY2x1ZGluZyB0aGUKKwkgKiB0ZXJtaW5hdGluZyAnXDAnIHRoYXQgd2UgYWRkKSwgYW5kIGlzIGZvbGxvd2VkIGJ5CisJICogYSBzcGFjZS4KKwkgKi8KKwlpID0gMDsKKwlmb3IgKDs7KSB7CisJCWNoYXIgYyA9ICpoZHIrKzsKKwkJaWYgKGMgPT0gJyAnKQorCQkJYnJlYWs7CisJCXR5cGVbaSsrXSA9IGM7CisJCWlmIChpID49IHNpemVvZih0eXBlKSkKKwkJCXJldHVybiAtMTsKKwl9CisJdHlwZVtpXSA9IDA7CisKKwkvKgorCSAqIFRoZSBsZW5ndGggbXVzdCBmb2xsb3cgaW1tZWRpYXRlbHksIGFuZCBiZSBpbiBjYW5vbmljYWwKKwkgKiBkZWNpbWFsIGZvcm1hdCAoaWUgIjAxMCIgaXMgbm90IHZhbGlkKS4KKwkgKi8KKwlzaXplID0gKmhkcisrIC0gJzAnOworCWlmIChzaXplID4gOSkKKwkJcmV0dXJuIC0xOworCWlmIChzaXplKSB7CisJCWZvciAoOzspIHsKKwkJCXVuc2lnbmVkIGxvbmcgYyA9ICpoZHIgLSAnMCc7CisJCQlpZiAoYyA+IDkpCisJCQkJYnJlYWs7CisJCQloZHIrKzsKKwkJCXNpemUgPSBzaXplICogMTAgKyBjOworCQl9CisJfQorCSpzaXplcCA9IHNpemU7CisKKwkvKgorCSAqIFRoZSBsZW5ndGggbXVzdCBiZSBmb2xsb3dlZCBieSBhIHplcm8gYnl0ZQorCSAqLworCXJldHVybiAqaGRyID8gLTEgOiB0eXBlX2Zyb21fc3RyaW5nKHR5cGUpOworfQorCitzdGF0aWMgdm9pZCAqdW5wYWNrX3NoYTFfZmlsZSh2b2lkICptYXAsIHVuc2lnbmVkIGxvbmcgbWFwc2l6ZSwgZW51bSBvYmplY3RfdHlwZSAqdHlwZSwgdW5zaWduZWQgbG9uZyAqc2l6ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpbnQgcmV0OworCXpfc3RyZWFtIHN0cmVhbTsKKwljaGFyIGhkcls4MTkyXTsKKworCXJldCA9IHVucGFja19zaGExX2hlYWRlcigmc3RyZWFtLCBtYXAsIG1hcHNpemUsIGhkciwgc2l6ZW9mKGhkcikpOworCWlmIChyZXQgPCBaX09LIHx8ICgqdHlwZSA9IHBhcnNlX3NoYTFfaGVhZGVyKGhkciwgc2l6ZSkpIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gdW5wYWNrX3NoYTFfcmVzdCgmc3RyZWFtLCBoZHIsICpzaXplLCBzaGExKTsKK30KKwordW5zaWduZWQgbG9uZyBnZXRfc2l6ZV9mcm9tX2RlbHRhKHN0cnVjdCBwYWNrZWRfZ2l0ICpwLAorCQkJCSAgc3RydWN0IHBhY2tfd2luZG93ICoqd19jdXJzLAorCQkJICAgICAgICAgIG9mZl90IGN1cnBvcykKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOworCXVuc2lnbmVkIGNoYXIgZGVsdGFfaGVhZFsyMF0sICppbjsKKwl6X3N0cmVhbSBzdHJlYW07CisJaW50IHN0OworCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlzdHJlYW0ubmV4dF9vdXQgPSBkZWx0YV9oZWFkOworCXN0cmVhbS5hdmFpbF9vdXQgPSBzaXplb2YoZGVsdGFfaGVhZCk7CisKKwlpbmZsYXRlSW5pdCgmc3RyZWFtKTsKKwlkbyB7CisJCWluID0gdXNlX3BhY2socCwgd19jdXJzLCBjdXJwb3MsICZzdHJlYW0uYXZhaWxfaW4pOworCQlzdHJlYW0ubmV4dF9pbiA9IGluOworCQlzdCA9IGluZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOworCQljdXJwb3MgKz0gc3RyZWFtLm5leHRfaW4gLSBpbjsKKwl9IHdoaWxlICgoc3QgPT0gWl9PSyB8fCBzdCA9PSBaX0JVRl9FUlJPUikgJiYKKwkJIHN0cmVhbS50b3RhbF9vdXQgPCBzaXplb2YoZGVsdGFfaGVhZCkpOworCWluZmxhdGVFbmQoJnN0cmVhbSk7CisJaWYgKChzdCAhPSBaX1NUUkVBTV9FTkQpICYmIHN0cmVhbS50b3RhbF9vdXQgIT0gc2l6ZW9mKGRlbHRhX2hlYWQpKQorCQlkaWUoImRlbHRhIGRhdGEgdW5wYWNrLWluaXRpYWwgZmFpbGVkIik7CisKKwkvKiBFeGFtaW5lIHRoZSBpbml0aWFsIHBhcnQgb2YgdGhlIGRlbHRhIHRvIGZpZ3VyZSBvdXQKKwkgKiB0aGUgcmVzdWx0IHNpemUuCisJICovCisJZGF0YSA9IGRlbHRhX2hlYWQ7CisKKwkvKiBpZ25vcmUgYmFzZSBzaXplICovCisJZ2V0X2RlbHRhX2hkcl9zaXplKCZkYXRhLCBkZWx0YV9oZWFkK3NpemVvZihkZWx0YV9oZWFkKSk7CisKKwkvKiBSZWFkIHRoZSByZXN1bHQgc2l6ZSAqLworCXJldHVybiBnZXRfZGVsdGFfaGRyX3NpemUoJmRhdGEsIGRlbHRhX2hlYWQrc2l6ZW9mKGRlbHRhX2hlYWQpKTsKK30KKworc3RhdGljIG9mZl90IGdldF9kZWx0YV9iYXNlKHN0cnVjdCBwYWNrZWRfZ2l0ICpwLAorCQkJCSAgICBzdHJ1Y3QgcGFja193aW5kb3cgKip3X2N1cnMsCisJCQkJICAgIG9mZl90ICpjdXJwb3MsCisJCQkJICAgIGVudW0gb2JqZWN0X3R5cGUgdHlwZSwKKwkJCQkgICAgb2ZmX3QgZGVsdGFfb2JqX29mZnNldCkKK3sKKwl1bnNpZ25lZCBjaGFyICpiYXNlX2luZm8gPSB1c2VfcGFjayhwLCB3X2N1cnMsICpjdXJwb3MsIE5VTEwpOworCW9mZl90IGJhc2Vfb2Zmc2V0OworCisJLyogdXNlX3BhY2soKSBhc3N1cmVkIHVzIHdlIGhhdmUgW2Jhc2VfaW5mbywgYmFzZV9pbmZvICsgMjApCisJICogYXMgYSByYW5nZSB0aGF0IHdlIGNhbiBsb29rIGF0IHdpdGhvdXQgd2Fsa2luZyBvZmYgdGhlCisJICogZW5kIG9mIHRoZSBtYXBwZWQgd2luZG93LiAgSXRzIGFjdHVhbGx5IHRoZSBoYXNoIHNpemUKKwkgKiB0aGF0IGlzIGFzc3VyZWQuICBBbiBPRlNfREVMVEEgbG9uZ2VyIHRoYW4gdGhlIGhhc2ggc2l6ZQorCSAqIGlzIHN0dXBpZCwgYXMgdGhlbiBhIFJFRl9ERUxUQSB3b3VsZCBiZSBzbWFsbGVyIHRvIHN0b3JlLgorCSAqLworCWlmICh0eXBlID09IE9CSl9PRlNfREVMVEEpIHsKKwkJdW5zaWduZWQgdXNlZCA9IDA7CisJCXVuc2lnbmVkIGNoYXIgYyA9IGJhc2VfaW5mb1t1c2VkKytdOworCQliYXNlX29mZnNldCA9IGMgJiAxMjc7CisJCXdoaWxlIChjICYgMTI4KSB7CisJCQliYXNlX29mZnNldCArPSAxOworCQkJaWYgKCFiYXNlX29mZnNldCB8fCBNU0IoYmFzZV9vZmZzZXQsIDcpKQorCQkJCWRpZSgib2Zmc2V0IHZhbHVlIG92ZXJmbG93IGZvciBkZWx0YSBiYXNlIG9iamVjdCIpOworCQkJYyA9IGJhc2VfaW5mb1t1c2VkKytdOworCQkJYmFzZV9vZmZzZXQgPSAoYmFzZV9vZmZzZXQgPDwgNykgKyAoYyAmIDEyNyk7CisJCX0KKwkJYmFzZV9vZmZzZXQgPSBkZWx0YV9vYmpfb2Zmc2V0IC0gYmFzZV9vZmZzZXQ7CisJCWlmIChiYXNlX29mZnNldCA+PSBkZWx0YV9vYmpfb2Zmc2V0KQorCQkJZGllKCJkZWx0YSBiYXNlIG9mZnNldCBvdXQgb2YgYm91bmQiKTsKKwkJKmN1cnBvcyArPSB1c2VkOworCX0gZWxzZSBpZiAodHlwZSA9PSBPQkpfUkVGX0RFTFRBKSB7CisJCS8qIFRoZSBiYXNlIGVudHJ5IF9tdXN0XyBiZSBpbiB0aGUgc2FtZSBwYWNrICovCisJCWJhc2Vfb2Zmc2V0ID0gZmluZF9wYWNrX2VudHJ5X29uZShiYXNlX2luZm8sIHApOworCQlpZiAoIWJhc2Vfb2Zmc2V0KQorCQkJZGllKCJmYWlsZWQgdG8gZmluZCBkZWx0YS1wYWNrIGJhc2Ugb2JqZWN0ICVzIiwKKwkJCQlzaGExX3RvX2hleChiYXNlX2luZm8pKTsKKwkJKmN1cnBvcyArPSAyMDsKKwl9IGVsc2UKKwkJZGllKCJJIGFtIHRvdGFsbHkgc2NyZXdlZCIpOworCXJldHVybiBiYXNlX29mZnNldDsKK30KKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbiBmb3IgYSBtdXR1YWxseSByZWN1cnNpdmUgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgcGFja2VkX29iamVjdF9pbmZvKHN0cnVjdCBwYWNrZWRfZ2l0ICpwLCBvZmZfdCBvZmZzZXQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nICpzaXplcCk7CisKK3N0YXRpYyBpbnQgcGFja2VkX2RlbHRhX2luZm8oc3RydWN0IHBhY2tlZF9naXQgKnAsCisJCQkgICAgIHN0cnVjdCBwYWNrX3dpbmRvdyAqKndfY3VycywKKwkJCSAgICAgb2ZmX3QgY3VycG9zLAorCQkJICAgICBlbnVtIG9iamVjdF90eXBlIHR5cGUsCisJCQkgICAgIG9mZl90IG9ial9vZmZzZXQsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgKnNpemVwKQoreworCW9mZl90IGJhc2Vfb2Zmc2V0OworCisJYmFzZV9vZmZzZXQgPSBnZXRfZGVsdGFfYmFzZShwLCB3X2N1cnMsICZjdXJwb3MsIHR5cGUsIG9ial9vZmZzZXQpOworCXR5cGUgPSBwYWNrZWRfb2JqZWN0X2luZm8ocCwgYmFzZV9vZmZzZXQsIE5VTEwpOworCisJLyogV2UgY2hvb3NlIHRvIG9ubHkgZ2V0IHRoZSB0eXBlIG9mIHRoZSBiYXNlIG9iamVjdCBhbmQKKwkgKiBpZ25vcmUgcG90ZW50aWFsbHkgY29ycnVwdCBwYWNrIGZpbGUgdGhhdCBleHBlY3RzIHRoZSBkZWx0YQorCSAqIGJhc2VkIG9uIGEgYmFzZSB3aXRoIGEgd3Jvbmcgc2l6ZS4gIFRoaXMgc2F2ZXMgdG9ucyBvZgorCSAqIGluZmxhdGUoKSBjYWxscy4KKwkgKi8KKwlpZiAoc2l6ZXApCisJCSpzaXplcCA9IGdldF9zaXplX2Zyb21fZGVsdGEocCwgd19jdXJzLCBjdXJwb3MpOworCisJcmV0dXJuIHR5cGU7Cit9CisKK3N0YXRpYyBpbnQgdW5wYWNrX29iamVjdF9oZWFkZXIoc3RydWN0IHBhY2tlZF9naXQgKnAsCisJCQkJc3RydWN0IHBhY2tfd2luZG93ICoqd19jdXJzLAorCQkJCW9mZl90ICpjdXJwb3MsCisJCQkJdW5zaWduZWQgbG9uZyAqc2l6ZXApCit7CisJdW5zaWduZWQgY2hhciAqYmFzZTsKKwl1bnNpZ25lZCBpbnQgbGVmdDsKKwl1bnNpZ25lZCBsb25nIHVzZWQ7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCisJLyogdXNlX3BhY2soKSBhc3N1cmVzIHVzIHdlIGhhdmUgW2Jhc2UsIGJhc2UgKyAyMCkgYXZhaWxhYmxlCisJICogYXMgYSByYW5nZSB0aGF0IHdlIGNhbiBsb29rIGF0IGF0LiAgKEl0cyBhY3R1YWxseSB0aGUgaGFzaAorCSAqIHNpemUgdGhhdCBpcyBhc3N1cmVkLikgIFdpdGggb3VyIG9iamVjdCBoZWFkZXIgZW5jb2RpbmcKKwkgKiB0aGUgbWF4aW11bSBkZWZsYXRlZCBvYmplY3Qgc2l6ZSBpcyAyXjEzNywgd2hpY2ggaXMganVzdAorCSAqIGluc2FuZSwgc28gd2Uga25vdyB3b24ndCBleGNlZWQgd2hhdCB3ZSBoYXZlIGJlZW4gZ2l2ZW4uCisJICovCisJYmFzZSA9IHVzZV9wYWNrKHAsIHdfY3VycywgKmN1cnBvcywgJmxlZnQpOworCXVzZWQgPSB1bnBhY2tfb2JqZWN0X2hlYWRlcl9nZW50bHkoYmFzZSwgbGVmdCwgJnR5cGUsIHNpemVwKTsKKwlpZiAoIXVzZWQpCisJCWRpZSgib2JqZWN0IG9mZnNldCBvdXRzaWRlIG9mIHBhY2sgZmlsZSIpOworCSpjdXJwb3MgKz0gdXNlZDsKKworCXJldHVybiB0eXBlOworfQorCitjb25zdCBjaGFyICpwYWNrZWRfb2JqZWN0X2luZm9fZGV0YWlsKHN0cnVjdCBwYWNrZWRfZ2l0ICpwLAorCQkJCSAgICAgIG9mZl90IG9ial9vZmZzZXQsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyAqc2l6ZSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nICpzdG9yZV9zaXplLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCAqZGVsdGFfY2hhaW5fbGVuZ3RoLAorCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmJhc2Vfc2hhMSkKK3sKKwlzdHJ1Y3QgcGFja193aW5kb3cgKndfY3VycyA9IE5VTEw7CisJb2ZmX3QgY3VycG9zOworCXVuc2lnbmVkIGxvbmcgZHVtbXk7CisJdW5zaWduZWQgY2hhciAqbmV4dF9zaGExOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwlzdHJ1Y3QgcmV2aW5kZXhfZW50cnkgKnJldmlkeDsKKworCSpkZWx0YV9jaGFpbl9sZW5ndGggPSAwOworCWN1cnBvcyA9IG9ial9vZmZzZXQ7CisJdHlwZSA9IHVucGFja19vYmplY3RfaGVhZGVyKHAsICZ3X2N1cnMsICZjdXJwb3MsIHNpemUpOworCisJcmV2aWR4ID0gZmluZF9wYWNrX3JldmluZGV4KHAsIG9ial9vZmZzZXQpOworCSpzdG9yZV9zaXplID0gcmV2aWR4WzFdLm9mZnNldCAtIG9ial9vZmZzZXQ7CisKKwlmb3IgKDs7KSB7CisJCXN3aXRjaCAodHlwZSkgeworCQlkZWZhdWx0OgorCQkJZGllKCJwYWNrICVzIGNvbnRhaW5zIHVua25vd24gb2JqZWN0IHR5cGUgJWQiLAorCQkJICAgIHAtPnBhY2tfbmFtZSwgdHlwZSk7CisJCWNhc2UgT0JKX0NPTU1JVDoKKwkJY2FzZSBPQkpfVFJFRToKKwkJY2FzZSBPQkpfQkxPQjoKKwkJY2FzZSBPQkpfVEFHOgorCQkJdW51c2VfcGFjaygmd19jdXJzKTsKKwkJCXJldHVybiB0eXBlbmFtZSh0eXBlKTsKKwkJY2FzZSBPQkpfT0ZTX0RFTFRBOgorCQkJb2JqX29mZnNldCA9IGdldF9kZWx0YV9iYXNlKHAsICZ3X2N1cnMsICZjdXJwb3MsIHR5cGUsIG9ial9vZmZzZXQpOworCQkJaWYgKCpkZWx0YV9jaGFpbl9sZW5ndGggPT0gMCkgeworCQkJCXJldmlkeCA9IGZpbmRfcGFja19yZXZpbmRleChwLCBvYmpfb2Zmc2V0KTsKKwkJCQloYXNoY3B5KGJhc2Vfc2hhMSwgbnRoX3BhY2tlZF9vYmplY3Rfc2hhMShwLCByZXZpZHgtPm5yKSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPQkpfUkVGX0RFTFRBOgorCQkJbmV4dF9zaGExID0gdXNlX3BhY2socCwgJndfY3VycywgY3VycG9zLCBOVUxMKTsKKwkJCWlmICgqZGVsdGFfY2hhaW5fbGVuZ3RoID09IDApCisJCQkJaGFzaGNweShiYXNlX3NoYTEsIG5leHRfc2hhMSk7CisJCQlvYmpfb2Zmc2V0ID0gZmluZF9wYWNrX2VudHJ5X29uZShuZXh0X3NoYTEsIHApOworCQkJYnJlYWs7CisJCX0KKwkJKCpkZWx0YV9jaGFpbl9sZW5ndGgpKys7CisJCWN1cnBvcyA9IG9ial9vZmZzZXQ7CisJCXR5cGUgPSB1bnBhY2tfb2JqZWN0X2hlYWRlcihwLCAmd19jdXJzLCAmY3VycG9zLCAmZHVtbXkpOworCX0KK30KKworc3RhdGljIGludCBwYWNrZWRfb2JqZWN0X2luZm8oc3RydWN0IHBhY2tlZF9naXQgKnAsIG9mZl90IG9ial9vZmZzZXQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nICpzaXplcCkKK3sKKwlzdHJ1Y3QgcGFja193aW5kb3cgKndfY3VycyA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBzaXplOworCW9mZl90IGN1cnBvcyA9IG9ial9vZmZzZXQ7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCisJdHlwZSA9IHVucGFja19vYmplY3RfaGVhZGVyKHAsICZ3X2N1cnMsICZjdXJwb3MsICZzaXplKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgT0JKX09GU19ERUxUQToKKwljYXNlIE9CSl9SRUZfREVMVEE6CisJCXR5cGUgPSBwYWNrZWRfZGVsdGFfaW5mbyhwLCAmd19jdXJzLCBjdXJwb3MsCisJCQkJCSB0eXBlLCBvYmpfb2Zmc2V0LCBzaXplcCk7CisJCWJyZWFrOworCWNhc2UgT0JKX0NPTU1JVDoKKwljYXNlIE9CSl9UUkVFOgorCWNhc2UgT0JKX0JMT0I6CisJY2FzZSBPQkpfVEFHOgorCQlpZiAoc2l6ZXApCisJCQkqc2l6ZXAgPSBzaXplOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkaWUoInBhY2sgJXMgY29udGFpbnMgdW5rbm93biBvYmplY3QgdHlwZSAlZCIsCisJCSAgICBwLT5wYWNrX25hbWUsIHR5cGUpOworCX0KKwl1bnVzZV9wYWNrKCZ3X2N1cnMpOworCXJldHVybiB0eXBlOworfQorCitzdGF0aWMgdm9pZCAqdW5wYWNrX2NvbXByZXNzZWRfZW50cnkoc3RydWN0IHBhY2tlZF9naXQgKnAsCisJCQkJICAgIHN0cnVjdCBwYWNrX3dpbmRvdyAqKndfY3VycywKKwkJCQkgICAgb2ZmX3QgY3VycG9zLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaW50IHN0OworCXpfc3RyZWFtIHN0cmVhbTsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXIsICppbjsKKworCWJ1ZmZlciA9IHhtYWxsb2Moc2l6ZSArIDEpOworCWJ1ZmZlcltzaXplXSA9IDA7CisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlzdHJlYW0ubmV4dF9vdXQgPSBidWZmZXI7CisJc3RyZWFtLmF2YWlsX291dCA9IHNpemU7CisKKwlpbmZsYXRlSW5pdCgmc3RyZWFtKTsKKwlkbyB7CisJCWluID0gdXNlX3BhY2socCwgd19jdXJzLCBjdXJwb3MsICZzdHJlYW0uYXZhaWxfaW4pOworCQlzdHJlYW0ubmV4dF9pbiA9IGluOworCQlzdCA9IGluZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOworCQljdXJwb3MgKz0gc3RyZWFtLm5leHRfaW4gLSBpbjsKKwl9IHdoaWxlIChzdCA9PSBaX09LIHx8IHN0ID09IFpfQlVGX0VSUk9SKTsKKwlpbmZsYXRlRW5kKCZzdHJlYW0pOworCWlmICgoc3QgIT0gWl9TVFJFQU1fRU5EKSB8fCBzdHJlYW0udG90YWxfb3V0ICE9IHNpemUpIHsKKwkJZnJlZShidWZmZXIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gYnVmZmVyOworfQorCisjZGVmaW5lIE1BWF9ERUxUQV9DQUNIRSAoMjU2KQorCitzdGF0aWMgc2l6ZV90IGRlbHRhX2Jhc2VfY2FjaGVkOworCitzdGF0aWMgc3RydWN0IGRlbHRhX2Jhc2VfY2FjaGVfbHJ1X2xpc3QgeworCXN0cnVjdCBkZWx0YV9iYXNlX2NhY2hlX2xydV9saXN0ICpwcmV2OworCXN0cnVjdCBkZWx0YV9iYXNlX2NhY2hlX2xydV9saXN0ICpuZXh0OworfSBkZWx0YV9iYXNlX2NhY2hlX2xydSA9IHsgJmRlbHRhX2Jhc2VfY2FjaGVfbHJ1LCAmZGVsdGFfYmFzZV9jYWNoZV9scnUgfTsKKworc3RhdGljIHN0cnVjdCBkZWx0YV9iYXNlX2NhY2hlX2VudHJ5IHsKKwlzdHJ1Y3QgZGVsdGFfYmFzZV9jYWNoZV9scnVfbGlzdCBscnU7CisJdm9pZCAqZGF0YTsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcDsKKwlvZmZfdCBiYXNlX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworfSBkZWx0YV9iYXNlX2NhY2hlW01BWF9ERUxUQV9DQUNIRV07CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhY2tfZW50cnlfaGFzaChzdHJ1Y3QgcGFja2VkX2dpdCAqcCwgb2ZmX3QgYmFzZV9vZmZzZXQpCit7CisJdW5zaWduZWQgbG9uZyBoYXNoOworCisJaGFzaCA9ICh1bnNpZ25lZCBsb25nKXAgKyAodW5zaWduZWQgbG9uZyliYXNlX29mZnNldDsKKwloYXNoICs9IChoYXNoID4+IDgpICsgKGhhc2ggPj4gMTYpOworCXJldHVybiBoYXNoICUgTUFYX0RFTFRBX0NBQ0hFOworfQorCitzdGF0aWMgdm9pZCAqY2FjaGVfb3JfdW5wYWNrX2VudHJ5KHN0cnVjdCBwYWNrZWRfZ2l0ICpwLCBvZmZfdCBiYXNlX29mZnNldCwKKwl1bnNpZ25lZCBsb25nICpiYXNlX3NpemUsIGVudW0gb2JqZWN0X3R5cGUgKnR5cGUsIGludCBrZWVwX2NhY2hlKQoreworCXZvaWQgKnJldDsKKwl1bnNpZ25lZCBsb25nIGhhc2ggPSBwYWNrX2VudHJ5X2hhc2gocCwgYmFzZV9vZmZzZXQpOworCXN0cnVjdCBkZWx0YV9iYXNlX2NhY2hlX2VudHJ5ICplbnQgPSBkZWx0YV9iYXNlX2NhY2hlICsgaGFzaDsKKworCXJldCA9IGVudC0+ZGF0YTsKKwlpZiAocmV0ICYmIGVudC0+cCA9PSBwICYmIGVudC0+YmFzZV9vZmZzZXQgPT0gYmFzZV9vZmZzZXQpCisJCWdvdG8gZm91bmRfY2FjaGVfZW50cnk7CisJcmV0dXJuIHVucGFja19lbnRyeShwLCBiYXNlX29mZnNldCwgdHlwZSwgYmFzZV9zaXplKTsKKworZm91bmRfY2FjaGVfZW50cnk6CisJaWYgKCFrZWVwX2NhY2hlKSB7CisJCWVudC0+ZGF0YSA9IE5VTEw7CisJCWVudC0+bHJ1Lm5leHQtPnByZXYgPSBlbnQtPmxydS5wcmV2OworCQllbnQtPmxydS5wcmV2LT5uZXh0ID0gZW50LT5scnUubmV4dDsKKwkJZGVsdGFfYmFzZV9jYWNoZWQgLT0gZW50LT5zaXplOworCX0gZWxzZSB7CisJCXJldCA9IHhtZW1kdXB6KGVudC0+ZGF0YSwgZW50LT5zaXplKTsKKwl9CisJKnR5cGUgPSBlbnQtPnR5cGU7CisJKmJhc2Vfc2l6ZSA9IGVudC0+c2l6ZTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVsZWFzZV9kZWx0YV9iYXNlX2NhY2hlKHN0cnVjdCBkZWx0YV9iYXNlX2NhY2hlX2VudHJ5ICplbnQpCit7CisJaWYgKGVudC0+ZGF0YSkgeworCQlmcmVlKGVudC0+ZGF0YSk7CisJCWVudC0+ZGF0YSA9IE5VTEw7CisJCWVudC0+bHJ1Lm5leHQtPnByZXYgPSBlbnQtPmxydS5wcmV2OworCQllbnQtPmxydS5wcmV2LT5uZXh0ID0gZW50LT5scnUubmV4dDsKKwkJZGVsdGFfYmFzZV9jYWNoZWQgLT0gZW50LT5zaXplOworCX0KK30KKworc3RhdGljIHZvaWQgYWRkX2RlbHRhX2Jhc2VfY2FjaGUoc3RydWN0IHBhY2tlZF9naXQgKnAsIG9mZl90IGJhc2Vfb2Zmc2V0LAorCXZvaWQgKmJhc2UsIHVuc2lnbmVkIGxvbmcgYmFzZV9zaXplLCBlbnVtIG9iamVjdF90eXBlIHR5cGUpCit7CisJdW5zaWduZWQgbG9uZyBoYXNoID0gcGFja19lbnRyeV9oYXNoKHAsIGJhc2Vfb2Zmc2V0KTsKKwlzdHJ1Y3QgZGVsdGFfYmFzZV9jYWNoZV9lbnRyeSAqZW50ID0gZGVsdGFfYmFzZV9jYWNoZSArIGhhc2g7CisJc3RydWN0IGRlbHRhX2Jhc2VfY2FjaGVfbHJ1X2xpc3QgKmxydTsKKworCXJlbGVhc2VfZGVsdGFfYmFzZV9jYWNoZShlbnQpOworCWRlbHRhX2Jhc2VfY2FjaGVkICs9IGJhc2Vfc2l6ZTsKKworCWZvciAobHJ1ID0gZGVsdGFfYmFzZV9jYWNoZV9scnUubmV4dDsKKwkgICAgIGRlbHRhX2Jhc2VfY2FjaGVkID4gZGVsdGFfYmFzZV9jYWNoZV9saW1pdAorCSAgICAgJiYgbHJ1ICE9ICZkZWx0YV9iYXNlX2NhY2hlX2xydTsKKwkgICAgIGxydSA9IGxydS0+bmV4dCkgeworCQlzdHJ1Y3QgZGVsdGFfYmFzZV9jYWNoZV9lbnRyeSAqZiA9ICh2b2lkICopbHJ1OworCQlpZiAoZi0+dHlwZSA9PSBPQkpfQkxPQikKKwkJCXJlbGVhc2VfZGVsdGFfYmFzZV9jYWNoZShmKTsKKwl9CisJZm9yIChscnUgPSBkZWx0YV9iYXNlX2NhY2hlX2xydS5uZXh0OworCSAgICAgZGVsdGFfYmFzZV9jYWNoZWQgPiBkZWx0YV9iYXNlX2NhY2hlX2xpbWl0CisJICAgICAmJiBscnUgIT0gJmRlbHRhX2Jhc2VfY2FjaGVfbHJ1OworCSAgICAgbHJ1ID0gbHJ1LT5uZXh0KSB7CisJCXN0cnVjdCBkZWx0YV9iYXNlX2NhY2hlX2VudHJ5ICpmID0gKHZvaWQgKilscnU7CisJCXJlbGVhc2VfZGVsdGFfYmFzZV9jYWNoZShmKTsKKwl9CisKKwllbnQtPnAgPSBwOworCWVudC0+YmFzZV9vZmZzZXQgPSBiYXNlX29mZnNldDsKKwllbnQtPnR5cGUgPSB0eXBlOworCWVudC0+ZGF0YSA9IGJhc2U7CisJZW50LT5zaXplID0gYmFzZV9zaXplOworCWVudC0+bHJ1Lm5leHQgPSAmZGVsdGFfYmFzZV9jYWNoZV9scnU7CisJZW50LT5scnUucHJldiA9IGRlbHRhX2Jhc2VfY2FjaGVfbHJ1LnByZXY7CisJZGVsdGFfYmFzZV9jYWNoZV9scnUucHJldi0+bmV4dCA9ICZlbnQtPmxydTsKKwlkZWx0YV9iYXNlX2NhY2hlX2xydS5wcmV2ID0gJmVudC0+bHJ1OworfQorCitzdGF0aWMgdm9pZCAqdW5wYWNrX2RlbHRhX2VudHJ5KHN0cnVjdCBwYWNrZWRfZ2l0ICpwLAorCQkJCXN0cnVjdCBwYWNrX3dpbmRvdyAqKndfY3VycywKKwkJCQlvZmZfdCBjdXJwb3MsCisJCQkJdW5zaWduZWQgbG9uZyBkZWx0YV9zaXplLAorCQkJCW9mZl90IG9ial9vZmZzZXQsCisJCQkJZW51bSBvYmplY3RfdHlwZSAqdHlwZSwKKwkJCQl1bnNpZ25lZCBsb25nICpzaXplcCkKK3sKKwl2b2lkICpkZWx0YV9kYXRhLCAqcmVzdWx0LCAqYmFzZTsKKwl1bnNpZ25lZCBsb25nIGJhc2Vfc2l6ZTsKKwlvZmZfdCBiYXNlX29mZnNldDsKKworCWJhc2Vfb2Zmc2V0ID0gZ2V0X2RlbHRhX2Jhc2UocCwgd19jdXJzLCAmY3VycG9zLCAqdHlwZSwgb2JqX29mZnNldCk7CisJYmFzZSA9IGNhY2hlX29yX3VucGFja19lbnRyeShwLCBiYXNlX29mZnNldCwgJmJhc2Vfc2l6ZSwgdHlwZSwgMCk7CisJaWYgKCFiYXNlKQorCQlkaWUoImZhaWxlZCB0byByZWFkIGRlbHRhIGJhc2Ugb2JqZWN0IgorCQkgICAgIiBhdCAlIlBSSXVNQVgiIGZyb20gJXMiLAorCQkgICAgKHVpbnRtYXhfdCliYXNlX29mZnNldCwgcC0+cGFja19uYW1lKTsKKworCWRlbHRhX2RhdGEgPSB1bnBhY2tfY29tcHJlc3NlZF9lbnRyeShwLCB3X2N1cnMsIGN1cnBvcywgZGVsdGFfc2l6ZSk7CisJaWYgKCFkZWx0YV9kYXRhKQorCQlkaWUoImZhaWxlZCB0byB1bnBhY2sgY29tcHJlc3NlZCBkZWx0YSIKKwkJICAgICIgYXQgJSJQUkl1TUFYIiBmcm9tICVzIiwKKwkJICAgICh1aW50bWF4X3QpY3VycG9zLCBwLT5wYWNrX25hbWUpOworCXJlc3VsdCA9IHBhdGNoX2RlbHRhKGJhc2UsIGJhc2Vfc2l6ZSwKKwkJCSAgICAgZGVsdGFfZGF0YSwgZGVsdGFfc2l6ZSwKKwkJCSAgICAgc2l6ZXApOworCWlmICghcmVzdWx0KQorCQlkaWUoImZhaWxlZCB0byBhcHBseSBkZWx0YSIpOworCWZyZWUoZGVsdGFfZGF0YSk7CisJYWRkX2RlbHRhX2Jhc2VfY2FjaGUocCwgYmFzZV9vZmZzZXQsIGJhc2UsIGJhc2Vfc2l6ZSwgKnR5cGUpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgKnVucGFja19lbnRyeShzdHJ1Y3QgcGFja2VkX2dpdCAqcCwgb2ZmX3Qgb2JqX29mZnNldCwKKwkJICAgZW51bSBvYmplY3RfdHlwZSAqdHlwZSwgdW5zaWduZWQgbG9uZyAqc2l6ZXApCit7CisJc3RydWN0IHBhY2tfd2luZG93ICp3X2N1cnMgPSBOVUxMOworCW9mZl90IGN1cnBvcyA9IG9ial9vZmZzZXQ7CisJdm9pZCAqZGF0YTsKKworCSp0eXBlID0gdW5wYWNrX29iamVjdF9oZWFkZXIocCwgJndfY3VycywgJmN1cnBvcywgc2l6ZXApOworCXN3aXRjaCAoKnR5cGUpIHsKKwljYXNlIE9CSl9PRlNfREVMVEE6CisJY2FzZSBPQkpfUkVGX0RFTFRBOgorCQlkYXRhID0gdW5wYWNrX2RlbHRhX2VudHJ5KHAsICZ3X2N1cnMsIGN1cnBvcywgKnNpemVwLAorCQkJCQkgIG9ial9vZmZzZXQsIHR5cGUsIHNpemVwKTsKKwkJYnJlYWs7CisJY2FzZSBPQkpfQ09NTUlUOgorCWNhc2UgT0JKX1RSRUU6CisJY2FzZSBPQkpfQkxPQjoKKwljYXNlIE9CSl9UQUc6CisJCWRhdGEgPSB1bnBhY2tfY29tcHJlc3NlZF9lbnRyeShwLCAmd19jdXJzLCBjdXJwb3MsICpzaXplcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRpZSgidW5rbm93biBvYmplY3QgdHlwZSAlaSBpbiAlcyIsICp0eXBlLCBwLT5wYWNrX25hbWUpOworCX0KKwl1bnVzZV9wYWNrKCZ3X2N1cnMpOworCXJldHVybiBkYXRhOworfQorCitjb25zdCB1bnNpZ25lZCBjaGFyICpudGhfcGFja2VkX29iamVjdF9zaGExKHN0cnVjdCBwYWNrZWRfZ2l0ICpwLAorCQkJCQkgICAgdWludDMyX3QgbikKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICppbmRleCA9IHAtPmluZGV4X2RhdGE7CisJaWYgKCFpbmRleCkgeworCQlpZiAob3Blbl9wYWNrX2luZGV4KHApKQorCQkJcmV0dXJuIE5VTEw7CisJCWluZGV4ID0gcC0+aW5kZXhfZGF0YTsKKwl9CisJaWYgKG4gPj0gcC0+bnVtX29iamVjdHMpCisJCXJldHVybiBOVUxMOworCWluZGV4ICs9IDQgKiAyNTY7CisJaWYgKHAtPmluZGV4X3ZlcnNpb24gPT0gMSkgeworCQlyZXR1cm4gaW5kZXggKyAyNCAqIG4gKyA0OworCX0gZWxzZSB7CisJCWluZGV4ICs9IDg7CisJCXJldHVybiBpbmRleCArIDIwICogbjsKKwl9Cit9CisKK3N0YXRpYyBvZmZfdCBudGhfcGFja2VkX29iamVjdF9vZmZzZXQoY29uc3Qgc3RydWN0IHBhY2tlZF9naXQgKnAsIHVpbnQzMl90IG4pCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqaW5kZXggPSBwLT5pbmRleF9kYXRhOworCWluZGV4ICs9IDQgKiAyNTY7CisJaWYgKHAtPmluZGV4X3ZlcnNpb24gPT0gMSkgeworCQlyZXR1cm4gbnRvaGwoKigodWludDMyX3QgKikoaW5kZXggKyAyNCAqIG4pKSk7CisJfSBlbHNlIHsKKwkJdWludDMyX3Qgb2ZmOworCQlpbmRleCArPSA4ICsgcC0+bnVtX29iamVjdHMgKiAoMjAgKyA0KTsKKwkJb2ZmID0gbnRvaGwoKigodWludDMyX3QgKikoaW5kZXggKyA0ICogbikpKTsKKwkJaWYgKCEob2ZmICYgMHg4MDAwMDAwMCkpCisJCQlyZXR1cm4gb2ZmOworCQlpbmRleCArPSBwLT5udW1fb2JqZWN0cyAqIDQgKyAob2ZmICYgMHg3ZmZmZmZmZikgKiA4OworCQlyZXR1cm4gKCgodWludDY0X3QpbnRvaGwoKigodWludDMyX3QgKikoaW5kZXggKyAwKSkpKSA8PCAzMikgfAorCQkJCSAgIG50b2hsKCooKHVpbnQzMl90ICopKGluZGV4ICsgNCkpKTsKKwl9Cit9CisKK29mZl90IGZpbmRfcGFja19lbnRyeV9vbmUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCQkgIHN0cnVjdCBwYWNrZWRfZ2l0ICpwKQoreworCWNvbnN0IHVpbnQzMl90ICpsZXZlbDFfb2ZzID0gcC0+aW5kZXhfZGF0YTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICppbmRleCA9IHAtPmluZGV4X2RhdGE7CisJdW5zaWduZWQgaGksIGxvOworCisJaWYgKCFpbmRleCkgeworCQlpZiAob3Blbl9wYWNrX2luZGV4KHApKQorCQkJcmV0dXJuIDA7CisJCWxldmVsMV9vZnMgPSBwLT5pbmRleF9kYXRhOworCQlpbmRleCA9IHAtPmluZGV4X2RhdGE7CisJfQorCWlmIChwLT5pbmRleF92ZXJzaW9uID4gMSkgeworCQlsZXZlbDFfb2ZzICs9IDI7CisJCWluZGV4ICs9IDg7CisJfQorCWluZGV4ICs9IDQgKiAyNTY7CisJaGkgPSBudG9obChsZXZlbDFfb2ZzWypzaGExXSk7CisJbG8gPSAoKCpzaGExID09IDB4MCkgPyAwIDogbnRvaGwobGV2ZWwxX29mc1sqc2hhMSAtIDFdKSk7CisKKwlkbyB7CisJCXVuc2lnbmVkIG1pID0gKGxvICsgaGkpIC8gMjsKKwkJdW5zaWduZWQgeCA9IChwLT5pbmRleF92ZXJzaW9uID4gMSkgPyAobWkgKiAyMCkgOiAobWkgKiAyNCArIDQpOworCQlpbnQgY21wID0gaGFzaGNtcChpbmRleCArIHgsIHNoYTEpOworCQlpZiAoIWNtcCkKKwkJCXJldHVybiBudGhfcGFja2VkX29iamVjdF9vZmZzZXQocCwgbWkpOworCQlpZiAoY21wID4gMCkKKwkJCWhpID0gbWk7CisJCWVsc2UKKwkJCWxvID0gbWkrMTsKKwl9IHdoaWxlIChsbyA8IGhpKTsKKwlyZXR1cm4gMDsKK30KKworaW50IG1hdGNoZXNfcGFja19uYW1lKHN0cnVjdCBwYWNrZWRfZ2l0ICpwLCBjb25zdCBjaGFyICpuYW1lKQoreworCWNvbnN0IGNoYXIgKmxhc3RfYywgKmM7CisKKwlpZiAoIXN0cmNtcChwLT5wYWNrX25hbWUsIG5hbWUpKQorCQlyZXR1cm4gMTsKKworCWZvciAoYyA9IHAtPnBhY2tfbmFtZSwgbGFzdF9jID0gYzsgKmM7KQorCQlpZiAoKmMgPT0gJy8nKQorCQkJbGFzdF9jID0gKytjOworCQllbHNlCisJCQkrK2M7CisJaWYgKCFzdHJjbXAobGFzdF9jLCBuYW1lKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaW5kX3BhY2tfZW50cnkoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgc3RydWN0IHBhY2tfZW50cnkgKmUsIGNvbnN0IGNoYXIgKippZ25vcmVfcGFja2VkKQoreworCXN0YXRpYyBzdHJ1Y3QgcGFja2VkX2dpdCAqbGFzdF9mb3VuZCA9ICh2b2lkICopMTsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcDsKKwlvZmZfdCBvZmZzZXQ7CisKKwlwcmVwYXJlX3BhY2tlZF9naXQoKTsKKwlpZiAoIXBhY2tlZF9naXQpCisJCXJldHVybiAwOworCXAgPSAobGFzdF9mb3VuZCA9PSAodm9pZCAqKTEpID8gcGFja2VkX2dpdCA6IGxhc3RfZm91bmQ7CisKKwlkbyB7CisJCWlmIChpZ25vcmVfcGFja2VkKSB7CisJCQljb25zdCBjaGFyICoqaWc7CisJCQlmb3IgKGlnID0gaWdub3JlX3BhY2tlZDsgKmlnOyBpZysrKQorCQkJCWlmIChtYXRjaGVzX3BhY2tfbmFtZShwLCAqaWcpKQorCQkJCQlicmVhazsKKwkJCWlmICgqaWcpCisJCQkJZ290byBuZXh0OworCQl9CisKKwkJb2Zmc2V0ID0gZmluZF9wYWNrX2VudHJ5X29uZShzaGExLCBwKTsKKwkJaWYgKG9mZnNldCkgeworCQkJLyoKKwkJCSAqIFdlIGFyZSBhYm91dCB0byB0ZWxsIHRoZSBjYWxsZXIgd2hlcmUgdGhleSBjYW4KKwkJCSAqIGxvY2F0ZSB0aGUgcmVxdWVzdGVkIG9iamVjdC4gIFdlIGJldHRlciBtYWtlCisJCQkgKiBzdXJlIHRoZSBwYWNrZmlsZSBpcyBzdGlsbCBoZXJlIGFuZCBjYW4gYmUKKwkJCSAqIGFjY2Vzc2VkIGJlZm9yZSBzdXBwbHlpbmcgdGhhdCBhbnN3ZXIsIGFzCisJCQkgKiBpdCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgc2luY2UgdGhlIGluZGV4CisJCQkgKiB3YXMgbG9hZGVkIQorCQkJICovCisJCQlpZiAocC0+cGFja19mZCA9PSAtMSAmJiBvcGVuX3BhY2tlZF9naXQocCkpIHsKKwkJCQllcnJvcigicGFja2ZpbGUgJXMgY2Fubm90IGJlIGFjY2Vzc2VkIiwgcC0+cGFja19uYW1lKTsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCQllLT5vZmZzZXQgPSBvZmZzZXQ7CisJCQllLT5wID0gcDsKKwkJCWhhc2hjcHkoZS0+c2hhMSwgc2hhMSk7CisJCQlsYXN0X2ZvdW5kID0gcDsKKwkJCXJldHVybiAxOworCQl9CisKKwkJbmV4dDoKKwkJaWYgKHAgPT0gbGFzdF9mb3VuZCkKKwkJCXAgPSBwYWNrZWRfZ2l0OworCQllbHNlCisJCQlwID0gcC0+bmV4dDsKKwkJaWYgKHAgPT0gbGFzdF9mb3VuZCkKKwkJCXAgPSBwLT5uZXh0OworCX0gd2hpbGUgKHApOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGFja2VkX2dpdCAqZmluZF9zaGExX3BhY2soY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCQkgIHN0cnVjdCBwYWNrZWRfZ2l0ICpwYWNrcykKK3sKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcDsKKworCWZvciAocCA9IHBhY2tzOyBwOyBwID0gcC0+bmV4dCkgeworCQlpZiAoZmluZF9wYWNrX2VudHJ5X29uZShzaGExLCBwKSkKKwkJCXJldHVybiBwOworCX0KKwlyZXR1cm4gTlVMTDsKKworfQorCitzdGF0aWMgaW50IHNoYTFfbG9vc2Vfb2JqZWN0X2luZm8oY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgdW5zaWduZWQgbG9uZyAqc2l6ZXApCit7CisJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIG1hcHNpemUsIHNpemU7CisJdm9pZCAqbWFwOworCXpfc3RyZWFtIHN0cmVhbTsKKwljaGFyIGhkclszMl07CisKKwltYXAgPSBtYXBfc2hhMV9maWxlKHNoYTEsICZtYXBzaXplKTsKKwlpZiAoIW1hcCkKKwkJcmV0dXJuIGVycm9yKCJ1bmFibGUgdG8gZmluZCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwlpZiAodW5wYWNrX3NoYTFfaGVhZGVyKCZzdHJlYW0sIG1hcCwgbWFwc2l6ZSwgaGRyLCBzaXplb2YoaGRyKSkgPCAwKQorCQlzdGF0dXMgPSBlcnJvcigidW5hYmxlIHRvIHVucGFjayAlcyBoZWFkZXIiLAorCQkJICAgICAgIHNoYTFfdG9faGV4KHNoYTEpKTsKKwllbHNlIGlmICgoc3RhdHVzID0gcGFyc2Vfc2hhMV9oZWFkZXIoaGRyLCAmc2l6ZSkpIDwgMCkKKwkJc3RhdHVzID0gZXJyb3IoInVuYWJsZSB0byBwYXJzZSAlcyBoZWFkZXIiLCBzaGExX3RvX2hleChzaGExKSk7CisJZWxzZSBpZiAoc2l6ZXApCisJCSpzaXplcCA9IHNpemU7CisJaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKwltdW5tYXAobWFwLCBtYXBzaXplKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgc2hhMV9vYmplY3RfaW5mbyhjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCB1bnNpZ25lZCBsb25nICpzaXplcCkKK3sKKwlzdHJ1Y3QgcGFja19lbnRyeSBlOworCisJaWYgKCFmaW5kX3BhY2tfZW50cnkoc2hhMSwgJmUsIE5VTEwpKSB7CisJCXJlcHJlcGFyZV9wYWNrZWRfZ2l0KCk7CisJCWlmICghZmluZF9wYWNrX2VudHJ5KHNoYTEsICZlLCBOVUxMKSkKKwkJCXJldHVybiBzaGExX2xvb3NlX29iamVjdF9pbmZvKHNoYTEsIHNpemVwKTsKKwl9CisJcmV0dXJuIHBhY2tlZF9vYmplY3RfaW5mbyhlLnAsIGUub2Zmc2V0LCBzaXplcCk7Cit9CisKK3N0YXRpYyB2b2lkICpyZWFkX3BhY2tlZF9zaGExKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkgICAgICBlbnVtIG9iamVjdF90eXBlICp0eXBlLCB1bnNpZ25lZCBsb25nICpzaXplKQoreworCXN0cnVjdCBwYWNrX2VudHJ5IGU7CisKKwlpZiAoIWZpbmRfcGFja19lbnRyeShzaGExLCAmZSwgTlVMTCkpCisJCXJldHVybiBOVUxMOworCWVsc2UKKwkJcmV0dXJuIGNhY2hlX29yX3VucGFja19lbnRyeShlLnAsIGUub2Zmc2V0LCBzaXplLCB0eXBlLCAxKTsKK30KKworLyoKKyAqIFRoaXMgaXMgbWVhbnQgdG8gaG9sZCBhICpzbWFsbCogbnVtYmVyIG9mIG9iamVjdHMgdGhhdCB5b3Ugd291bGQKKyAqIHdhbnQgcmVhZF9zaGExX2ZpbGUoKSB0byBiZSBhYmxlIHRvIHJldHVybiwgYnV0IHlldCB5b3UgZG8gbm90IHdhbnQKKyAqIHRvIHdyaXRlIHRoZW0gaW50byB0aGUgb2JqZWN0IHN0b3JlIChlLmcuIGEgYnJvd3NlLW9ubHkKKyAqIGFwcGxpY2F0aW9uKS4KKyAqLworc3RhdGljIHN0cnVjdCBjYWNoZWRfb2JqZWN0IHsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwl2b2lkICpidWY7CisJdW5zaWduZWQgbG9uZyBzaXplOworfSAqY2FjaGVkX29iamVjdHM7CitzdGF0aWMgaW50IGNhY2hlZF9vYmplY3RfbnIsIGNhY2hlZF9vYmplY3RfYWxsb2M7CisKK3N0YXRpYyBzdHJ1Y3QgY2FjaGVkX29iamVjdCBlbXB0eV90cmVlID0geworCS8qIGVtcHR5IHRyZWUgc2hhMTogNGI4MjVkYzY0MmNiNmViOWEwNjBlNTRiZjhkNjkyODhmYmVlNDkwNCAqLworCSJceDRiXHg4Mlx4NWRceGM2XHg0Mlx4Y2JceDZlXHhiOVx4YTBceDYwIgorCSJceGU1XHg0Ylx4ZjhceGQ2XHg5Mlx4ODhceGZiXHhlZVx4NDlceDA0IiwKKwlPQkpfVFJFRSwKKwkiIiwKKwkwCit9OworCitzdGF0aWMgc3RydWN0IGNhY2hlZF9vYmplY3QgKmZpbmRfY2FjaGVkX29iamVjdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBpOworCXN0cnVjdCBjYWNoZWRfb2JqZWN0ICpjbyA9IGNhY2hlZF9vYmplY3RzOworCisJZm9yIChpID0gMDsgaSA8IGNhY2hlZF9vYmplY3RfbnI7IGkrKywgY28rKykgeworCQlpZiAoIWhhc2hjbXAoY28tPnNoYTEsIHNoYTEpKQorCQkJcmV0dXJuIGNvOworCX0KKwlpZiAoIWhhc2hjbXAoc2hhMSwgZW1wdHlfdHJlZS5zaGExKSkKKwkJcmV0dXJuICZlbXB0eV90cmVlOworCXJldHVybiBOVUxMOworfQorCitpbnQgcHJldGVuZF9zaGExX2ZpbGUodm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGxlbiwgZW51bSBvYmplY3RfdHlwZSB0eXBlLAorCQkgICAgICB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBjYWNoZWRfb2JqZWN0ICpjbzsKKworCWhhc2hfc2hhMV9maWxlKGJ1ZiwgbGVuLCB0eXBlbmFtZSh0eXBlKSwgc2hhMSk7CisJaWYgKGhhc19zaGExX2ZpbGUoc2hhMSkgfHwgZmluZF9jYWNoZWRfb2JqZWN0KHNoYTEpKQorCQlyZXR1cm4gMDsKKwlpZiAoY2FjaGVkX29iamVjdF9hbGxvYyA8PSBjYWNoZWRfb2JqZWN0X25yKSB7CisJCWNhY2hlZF9vYmplY3RfYWxsb2MgPSBhbGxvY19ucihjYWNoZWRfb2JqZWN0X2FsbG9jKTsKKwkJY2FjaGVkX29iamVjdHMgPSB4cmVhbGxvYyhjYWNoZWRfb2JqZWN0cywKKwkJCQkJICBzaXplb2YoKmNhY2hlZF9vYmplY3RzKSAqCisJCQkJCSAgY2FjaGVkX29iamVjdF9hbGxvYyk7CisJfQorCWNvID0gJmNhY2hlZF9vYmplY3RzW2NhY2hlZF9vYmplY3RfbnIrK107CisJY28tPnNpemUgPSBsZW47CisJY28tPnR5cGUgPSB0eXBlOworCWNvLT5idWYgPSB4bWFsbG9jKGxlbik7CisJbWVtY3B5KGNvLT5idWYsIGJ1ZiwgbGVuKTsKKwloYXNoY3B5KGNvLT5zaGExLCBzaGExKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCAqcmVhZF9zaGExX2ZpbGUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgZW51bSBvYmplY3RfdHlwZSAqdHlwZSwKKwkJICAgICB1bnNpZ25lZCBsb25nICpzaXplKQoreworCXVuc2lnbmVkIGxvbmcgbWFwc2l6ZTsKKwl2b2lkICptYXAsICpidWY7CisJc3RydWN0IGNhY2hlZF9vYmplY3QgKmNvOworCisJY28gPSBmaW5kX2NhY2hlZF9vYmplY3Qoc2hhMSk7CisJaWYgKGNvKSB7CisJCSp0eXBlID0gY28tPnR5cGU7CisJCSpzaXplID0gY28tPnNpemU7CisJCXJldHVybiB4bWVtZHVweihjby0+YnVmLCBjby0+c2l6ZSk7CisJfQorCisJYnVmID0gcmVhZF9wYWNrZWRfc2hhMShzaGExLCB0eXBlLCBzaXplKTsKKwlpZiAoYnVmKQorCQlyZXR1cm4gYnVmOworCW1hcCA9IG1hcF9zaGExX2ZpbGUoc2hhMSwgJm1hcHNpemUpOworCWlmIChtYXApIHsKKwkJYnVmID0gdW5wYWNrX3NoYTFfZmlsZShtYXAsIG1hcHNpemUsIHR5cGUsIHNpemUsIHNoYTEpOworCQltdW5tYXAobWFwLCBtYXBzaXplKTsKKwkJcmV0dXJuIGJ1ZjsKKwl9CisJcmVwcmVwYXJlX3BhY2tlZF9naXQoKTsKKwlyZXR1cm4gcmVhZF9wYWNrZWRfc2hhMShzaGExLCB0eXBlLCBzaXplKTsKK30KKwordm9pZCAqcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2UoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCQkgY29uc3QgY2hhciAqcmVxdWlyZWRfdHlwZV9uYW1lLAorCQkJCSB1bnNpZ25lZCBsb25nICpzaXplLAorCQkJCSB1bnNpZ25lZCBjaGFyICphY3R1YWxfc2hhMV9yZXR1cm4pCit7CisJZW51bSBvYmplY3RfdHlwZSB0eXBlLCByZXF1aXJlZF90eXBlOworCXZvaWQgKmJ1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIGlzaXplOworCXVuc2lnbmVkIGNoYXIgYWN0dWFsX3NoYTFbMjBdOworCisJcmVxdWlyZWRfdHlwZSA9IHR5cGVfZnJvbV9zdHJpbmcocmVxdWlyZWRfdHlwZV9uYW1lKTsKKwloYXNoY3B5KGFjdHVhbF9zaGExLCBzaGExKTsKKwl3aGlsZSAoMSkgeworCQlpbnQgcmVmX2xlbmd0aCA9IC0xOworCQljb25zdCBjaGFyICpyZWZfdHlwZSA9IE5VTEw7CisKKwkJYnVmZmVyID0gcmVhZF9zaGExX2ZpbGUoYWN0dWFsX3NoYTEsICZ0eXBlLCAmaXNpemUpOworCQlpZiAoIWJ1ZmZlcikKKwkJCXJldHVybiBOVUxMOworCQlpZiAodHlwZSA9PSByZXF1aXJlZF90eXBlKSB7CisJCQkqc2l6ZSA9IGlzaXplOworCQkJaWYgKGFjdHVhbF9zaGExX3JldHVybikKKwkJCQloYXNoY3B5KGFjdHVhbF9zaGExX3JldHVybiwgYWN0dWFsX3NoYTEpOworCQkJcmV0dXJuIGJ1ZmZlcjsKKwkJfQorCQkvKiBIYW5kbGUgcmVmZXJlbmNlcyAqLworCQllbHNlIGlmICh0eXBlID09IE9CSl9DT01NSVQpCisJCQlyZWZfdHlwZSA9ICJ0cmVlICI7CisJCWVsc2UgaWYgKHR5cGUgPT0gT0JKX1RBRykKKwkJCXJlZl90eXBlID0gIm9iamVjdCAiOworCQllbHNlIHsKKwkJCWZyZWUoYnVmZmVyKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXJlZl9sZW5ndGggPSBzdHJsZW4ocmVmX3R5cGUpOworCisJCWlmIChyZWZfbGVuZ3RoICsgNDAgPiBpc2l6ZSB8fAorCQkgICAgbWVtY21wKGJ1ZmZlciwgcmVmX3R5cGUsIHJlZl9sZW5ndGgpIHx8CisJCSAgICBnZXRfc2hhMV9oZXgoKGNoYXIgKikgYnVmZmVyICsgcmVmX2xlbmd0aCwgYWN0dWFsX3NoYTEpKSB7CisJCQlmcmVlKGJ1ZmZlcik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlmcmVlKGJ1ZmZlcik7CisJCS8qIE5vdyB3ZSBoYXZlIHRoZSBJRCBvZiB0aGUgcmVmZXJyZWQtdG8gb2JqZWN0IGluCisJCSAqIGFjdHVhbF9zaGExLiAgQ2hlY2sgYWdhaW4uICovCisJfQorfQorCitzdGF0aWMgdm9pZCB3cml0ZV9zaGExX2ZpbGVfcHJlcGFyZShjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZSwgdW5zaWduZWQgY2hhciAqc2hhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmhkciwgaW50ICpoZHJsZW4pCit7CisJU0hBX0NUWCBjOworCisJLyogR2VuZXJhdGUgdGhlIGhlYWRlciAqLworCSpoZHJsZW4gPSBzcHJpbnRmKGhkciwgIiVzICVsdSIsIHR5cGUsIGxlbikrMTsKKworCS8qIFNoYTEuLiAqLworCVNIQTFfSW5pdCgmYyk7CisJU0hBMV9VcGRhdGUoJmMsIGhkciwgKmhkcmxlbik7CisJU0hBMV9VcGRhdGUoJmMsIGJ1ZiwgbGVuKTsKKwlTSEExX0ZpbmFsKHNoYTEsICZjKTsKK30KKworLyoKKyAqIExpbmsgdGhlIHRlbXBmaWxlIHRvIHRoZSBmaW5hbCBwbGFjZSwgcG9zc2libHkgY3JlYXRpbmcgdGhlCisgKiBsYXN0IGRpcmVjdG9yeSBsZXZlbCBhcyB5b3UgZG8gc28uCisgKgorICogUmV0dXJucyB0aGUgZXJybm8gb24gZmFpbHVyZSwgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IGxpbmtfdGVtcF90b19maWxlKGNvbnN0IGNoYXIgKnRtcGZpbGUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWludCByZXQ7CisJY2hhciAqZGlyOworCisJaWYgKCFsaW5rKHRtcGZpbGUsIGZpbGVuYW1lKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFRyeSB0byBta2RpciB0aGUgbGFzdCBwYXRoIGNvbXBvbmVudCBpZiB0aGF0IGZhaWxlZC4KKwkgKgorCSAqIFJlLXRyeSB0aGUgImxpbmsoKSIgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBta2RpcgorCSAqIHN1Y2NlZWRzLCBzaW5jZSBhIHJhY2UgbWlnaHQgbWVhbiB0aGF0IHNvbWVib2R5CisJICogZWxzZSBzdWNjZWVkZWQuCisJICovCisJcmV0ID0gZXJybm87CisJZGlyID0gc3RycmNocihmaWxlbmFtZSwgJy8nKTsKKwlpZiAoZGlyKSB7CisJCSpkaXIgPSAwOworCQlpZiAoIW1rZGlyKGZpbGVuYW1lLCAwNzc3KSAmJiBhZGp1c3Rfc2hhcmVkX3Blcm0oZmlsZW5hbWUpKSB7CisJCQkqZGlyID0gJy8nOworCQkJcmV0dXJuIC0yOworCQl9CisJCSpkaXIgPSAnLyc7CisJCWlmICghbGluayh0bXBmaWxlLCBmaWxlbmFtZSkpCisJCQlyZXR1cm4gMDsKKwkJcmV0ID0gZXJybm87CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBNb3ZlIHRoZSBqdXN0IHdyaXR0ZW4gb2JqZWN0IGludG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UKKyAqLworaW50IG1vdmVfdGVtcF90b19maWxlKGNvbnN0IGNoYXIgKnRtcGZpbGUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWludCByZXQgPSBsaW5rX3RlbXBfdG9fZmlsZSh0bXBmaWxlLCBmaWxlbmFtZSk7CisKKwkvKgorCSAqIENvZGEgaGFjayAtIGNvZGEgZG9lc24ndCBsaWtlIGNyb3NzLWRpcmVjdG9yeSBsaW5rcywKKwkgKiBzbyB3ZSBmYWxsIGJhY2sgdG8gYSByZW5hbWUsIHdoaWNoIHdpbGwgbWVhbiB0aGF0IGl0CisJICogd29uJ3QgYmUgYWJsZSB0byBjaGVjayBjb2xsaXNpb25zLCBidXQgdGhhdCdzIG5vdCBhCisJICogYmlnIGRlYWwuCisJICoKKwkgKiBUaGUgc2FtZSBob2xkcyBmb3IgRkFUIGZvcm1hdHRlZCBtZWRpYS4KKwkgKgorCSAqIFdoZW4gdGhpcyBzdWNjZWVkcywgd2UganVzdCByZXR1cm4gMC4gV2UgaGF2ZSBub3RoaW5nCisJICogbGVmdCB0byB1bmxpbmsuCisJICovCisJaWYgKHJldCAmJiByZXQgIT0gRUVYSVNUKSB7CisJCWlmICghcmVuYW1lKHRtcGZpbGUsIGZpbGVuYW1lKSkKKwkJCXJldHVybiAwOworCQlyZXQgPSBlcnJubzsKKwl9CisJdW5saW5rKHRtcGZpbGUpOworCWlmIChyZXQpIHsKKwkJaWYgKHJldCAhPSBFRVhJU1QpIHsKKwkJCXJldHVybiBlcnJvcigidW5hYmxlIHRvIHdyaXRlIHNoYTEgZmlsZW5hbWUgJXM6ICVzXG4iLCBmaWxlbmFtZSwgc3RyZXJyb3IocmV0KSk7CisJCX0KKwkJLyogRklYTUUhISEgQ29sbGlzaW9uIGNoZWNrIGhlcmUgPyAqLworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX2J1ZmZlcihpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpZiAod3JpdGVfaW5fZnVsbChmZCwgYnVmLCBsZW4pIDwgMCkKKwkJcmV0dXJuIGVycm9yKCJmaWxlIHdyaXRlIGVycm9yICglcykiLCBzdHJlcnJvcihlcnJubykpOworCXJldHVybiAwOworfQorCitpbnQgaGFzaF9zaGExX2ZpbGUoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGxlbiwgY29uc3QgY2hhciAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWNoYXIgaGRyWzMyXTsKKwlpbnQgaGRybGVuOworCXdyaXRlX3NoYTFfZmlsZV9wcmVwYXJlKGJ1ZiwgbGVuLCB0eXBlLCBzaGExLCBoZHIsICZoZHJsZW4pOworCXJldHVybiAwOworfQorCitpbnQgd3JpdGVfc2hhMV9maWxlKHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsZW4sIGNvbnN0IGNoYXIgKnR5cGUsIHVuc2lnbmVkIGNoYXIgKnJldHVybnNoYTEpCit7CisJaW50IHNpemUsIHJldDsKKwl1bnNpZ25lZCBjaGFyICpjb21wcmVzc2VkOworCXpfc3RyZWFtIHN0cmVhbTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWNoYXIgKmZpbGVuYW1lOworCXN0YXRpYyBjaGFyIHRtcGZpbGVbUEFUSF9NQVhdOworCWNoYXIgaGRyWzMyXTsKKwlpbnQgZmQsIGhkcmxlbjsKKworCS8qIE5vcm1hbGx5IGlmIHdlIGhhdmUgaXQgaW4gdGhlIHBhY2sgdGhlbiB3ZSBkbyBub3QgYm90aGVyIHdyaXRpbmcKKwkgKiBpdCBvdXQgaW50byAuZ2l0L29iamVjdHMvPz8vP3szOH0gZmlsZS4KKwkgKi8KKwl3cml0ZV9zaGExX2ZpbGVfcHJlcGFyZShidWYsIGxlbiwgdHlwZSwgc2hhMSwgaGRyLCAmaGRybGVuKTsKKwlmaWxlbmFtZSA9IHNoYTFfZmlsZV9uYW1lKHNoYTEpOworCWlmIChyZXR1cm5zaGExKQorCQloYXNoY3B5KHJldHVybnNoYTEsIHNoYTEpOworCWlmIChoYXNfc2hhMV9maWxlKHNoYTEpKQorCQlyZXR1cm4gMDsKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPj0gMCkgeworCQkvKgorCQkgKiBGSVhNRSEhISBXZSBtaWdodCBkbyBjb2xsaXNpb24gY2hlY2tpbmcgaGVyZSwgYnV0IHdlJ2QKKwkJICogbmVlZCB0byB1bmNvbXByZXNzIHRoZSBvbGQgZmlsZSBhbmQgY2hlY2sgaXQuIExhdGVyLgorCQkgKi8KKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisJCXJldHVybiBlcnJvcigic2hhMSBmaWxlICVzOiAlc1xuIiwgZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJfQorCisJc25wcmludGYodG1wZmlsZSwgc2l6ZW9mKHRtcGZpbGUpLCAiJXMvdG1wX29ial9YWFhYWFgiLCBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpKTsKKworCWZkID0gbWtzdGVtcCh0bXBmaWxlKTsKKwlpZiAoZmQgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFUEVSTSkKKwkJCXJldHVybiBlcnJvcigiaW5zdWZmaWNpZW50IHBlcm1pc3Npb24gZm9yIGFkZGluZyBhbiBvYmplY3QgdG8gcmVwb3NpdG9yeSBkYXRhYmFzZSAlc1xuIiwgZ2V0X29iamVjdF9kaXJlY3RvcnkoKSk7CisJCWVsc2UKKwkJCXJldHVybiBlcnJvcigidW5hYmxlIHRvIGNyZWF0ZSB0ZW1wb3Jhcnkgc2hhMSBmaWxlbmFtZSAlczogJXNcbiIsIHRtcGZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisJfQorCisJLyogU2V0IGl0IHVwICovCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlkZWZsYXRlSW5pdCgmc3RyZWFtLCB6bGliX2NvbXByZXNzaW9uX2xldmVsKTsKKwlzaXplID0gOCArIGRlZmxhdGVCb3VuZCgmc3RyZWFtLCBsZW4raGRybGVuKTsKKwljb21wcmVzc2VkID0geG1hbGxvYyhzaXplKTsKKworCS8qIENvbXByZXNzIGl0ICovCisJc3RyZWFtLm5leHRfb3V0ID0gY29tcHJlc3NlZDsKKwlzdHJlYW0uYXZhaWxfb3V0ID0gc2l6ZTsKKworCS8qIEZpcnN0IGhlYWRlci4uICovCisJc3RyZWFtLm5leHRfaW4gPSAodW5zaWduZWQgY2hhciAqKWhkcjsKKwlzdHJlYW0uYXZhaWxfaW4gPSBoZHJsZW47CisJd2hpbGUgKGRlZmxhdGUoJnN0cmVhbSwgMCkgPT0gWl9PSykKKwkJLyogbm90aGluZyAqLzsKKworCS8qIFRoZW4gdGhlIGRhdGEgaXRzZWxmLi4gKi8KKwlzdHJlYW0ubmV4dF9pbiA9IGJ1ZjsKKwlzdHJlYW0uYXZhaWxfaW4gPSBsZW47CisJcmV0ID0gZGVmbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCk7CisJaWYgKHJldCAhPSBaX1NUUkVBTV9FTkQpCisJCWRpZSgidW5hYmxlIHRvIGRlZmxhdGUgbmV3IG9iamVjdCAlcyAoJWQpIiwgc2hhMV90b19oZXgoc2hhMSksIHJldCk7CisKKwlyZXQgPSBkZWZsYXRlRW5kKCZzdHJlYW0pOworCWlmIChyZXQgIT0gWl9PSykKKwkJZGllKCJkZWZsYXRlRW5kIG9uIG9iamVjdCAlcyBmYWlsZWQgKCVkKSIsIHNoYTFfdG9faGV4KHNoYTEpLCByZXQpOworCisJc2l6ZSA9IHN0cmVhbS50b3RhbF9vdXQ7CisKKwlpZiAod3JpdGVfYnVmZmVyKGZkLCBjb21wcmVzc2VkLCBzaXplKSA8IDApCisJCWRpZSgidW5hYmxlIHRvIHdyaXRlIHNoYTEgZmlsZSIpOworCWZjaG1vZChmZCwgMDQ0NCk7CisJaWYgKGNsb3NlKGZkKSkKKwkJZGllKCJ1bmFibGUgdG8gd3JpdGUgc2hhMSBmaWxlIik7CisJZnJlZShjb21wcmVzc2VkKTsKKworCXJldHVybiBtb3ZlX3RlbXBfdG9fZmlsZSh0bXBmaWxlLCBmaWxlbmFtZSk7Cit9CisKKy8qCisgKiBXZSBuZWVkIHRvIHVucGFjayBhbmQgcmVjb21wcmVzcyB0aGUgb2JqZWN0IGZvciB3cml0aW5nCisgKiBpdCBvdXQgdG8gYSBkaWZmZXJlbnQgZmlsZS4KKyAqLworc3RhdGljIHZvaWQgKnJlcGFja19vYmplY3QoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgdW5zaWduZWQgbG9uZyAqb2Jqc2l6ZSkKK3sKKwlzaXplX3Qgc2l6ZTsKKwl6X3N0cmVhbSBzdHJlYW07CisJdW5zaWduZWQgY2hhciAqdW5wYWNrZWQ7CisJdW5zaWduZWQgbG9uZyBsZW47CisJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCWNoYXIgaGRyWzMyXTsKKwlpbnQgaGRybGVuOworCXZvaWQgKmJ1ZjsKKworCS8qIG5lZWQgdG8gdW5wYWNrIGFuZCByZWNvbXByZXNzIGl0IGJ5IGl0c2VsZiAqLworCXVucGFja2VkID0gcmVhZF9wYWNrZWRfc2hhMShzaGExLCAmdHlwZSwgJmxlbik7CisJaWYgKCF1bnBhY2tlZCkKKwkJZXJyb3IoImNhbm5vdCByZWFkIHNoYTFfZmlsZSBmb3IgJXMiLCBzaGExX3RvX2hleChzaGExKSk7CisKKwloZHJsZW4gPSBzcHJpbnRmKGhkciwgIiVzICVsdSIsIHR5cGVuYW1lKHR5cGUpLCBsZW4pICsgMTsKKworCS8qIFNldCBpdCB1cCAqLworCW1lbXNldCgmc3RyZWFtLCAwLCBzaXplb2Yoc3RyZWFtKSk7CisJZGVmbGF0ZUluaXQoJnN0cmVhbSwgemxpYl9jb21wcmVzc2lvbl9sZXZlbCk7CisJc2l6ZSA9IGRlZmxhdGVCb3VuZCgmc3RyZWFtLCBsZW4gKyBoZHJsZW4pOworCWJ1ZiA9IHhtYWxsb2Moc2l6ZSk7CisKKwkvKiBDb21wcmVzcyBpdCAqLworCXN0cmVhbS5uZXh0X291dCA9IGJ1ZjsKKwlzdHJlYW0uYXZhaWxfb3V0ID0gc2l6ZTsKKworCS8qIEZpcnN0IGhlYWRlci4uICovCisJc3RyZWFtLm5leHRfaW4gPSAodm9pZCAqKWhkcjsKKwlzdHJlYW0uYXZhaWxfaW4gPSBoZHJsZW47CisJd2hpbGUgKGRlZmxhdGUoJnN0cmVhbSwgMCkgPT0gWl9PSykKKwkJLyogbm90aGluZyAqLzsKKworCS8qIFRoZW4gdGhlIGRhdGEgaXRzZWxmLi4gKi8KKwlzdHJlYW0ubmV4dF9pbiA9IHVucGFja2VkOworCXN0cmVhbS5hdmFpbF9pbiA9IGxlbjsKKwl3aGlsZSAoZGVmbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCkgPT0gWl9PSykKKwkJLyogbm90aGluZyAqLzsKKwlkZWZsYXRlRW5kKCZzdHJlYW0pOworCWZyZWUodW5wYWNrZWQpOworCisJKm9ianNpemUgPSBzdHJlYW0udG90YWxfb3V0OworCXJldHVybiBidWY7Cit9CisKK2ludCB3cml0ZV9zaGExX3RvX2ZkKGludCBmZCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGxvbmcgb2Jqc2l6ZTsKKwl2b2lkICpidWYgPSBtYXBfc2hhMV9maWxlKHNoYTEsICZvYmpzaXplKTsKKworCWlmIChidWYpIHsKKwkJcmV0dmFsID0gd3JpdGVfYnVmZmVyKGZkLCBidWYsIG9ianNpemUpOworCQltdW5tYXAoYnVmLCBvYmpzaXplKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlidWYgPSByZXBhY2tfb2JqZWN0KHNoYTEsICZvYmpzaXplKTsKKwlyZXR2YWwgPSB3cml0ZV9idWZmZXIoZmQsIGJ1Ziwgb2Jqc2l6ZSk7CisJZnJlZShidWYpOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCB3cml0ZV9zaGExX2Zyb21fZmQoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZkLCBjaGFyICpidWZmZXIsCisJCSAgICAgICBzaXplX3QgYnVmc2l6ZSwgc2l6ZV90ICpidWZwb3NuKQoreworCWNoYXIgdG1wZmlsZVtQQVRIX01BWF07CisJaW50IGxvY2FsOworCXpfc3RyZWFtIHN0cmVhbTsKKwl1bnNpZ25lZCBjaGFyIHJlYWxfc2hhMVsyMF07CisJdW5zaWduZWQgY2hhciBkaXNjYXJkWzQwOTZdOworCWludCByZXQ7CisJU0hBX0NUWCBjOworCisJc25wcmludGYodG1wZmlsZSwgc2l6ZW9mKHRtcGZpbGUpLCAiJXMvdG1wX29ial9YWFhYWFgiLCBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpKTsKKworCWxvY2FsID0gbWtzdGVtcCh0bXBmaWxlKTsKKwlpZiAobG9jYWwgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFUEVSTSkKKwkJCXJldHVybiBlcnJvcigiaW5zdWZmaWNpZW50IHBlcm1pc3Npb24gZm9yIGFkZGluZyBhbiBvYmplY3QgdG8gcmVwb3NpdG9yeSBkYXRhYmFzZSAlc1xuIiwgZ2V0X29iamVjdF9kaXJlY3RvcnkoKSk7CisJCWVsc2UKKwkJCXJldHVybiBlcnJvcigidW5hYmxlIHRvIGNyZWF0ZSB0ZW1wb3Jhcnkgc2hhMSBmaWxlbmFtZSAlczogJXNcbiIsIHRtcGZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisJfQorCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKworCWluZmxhdGVJbml0KCZzdHJlYW0pOworCisJU0hBMV9Jbml0KCZjKTsKKworCWRvIHsKKwkJc3NpemVfdCBzaXplOworCQlpZiAoKmJ1ZnBvc24pIHsKKwkJCXN0cmVhbS5hdmFpbF9pbiA9ICpidWZwb3NuOworCQkJc3RyZWFtLm5leHRfaW4gPSAodW5zaWduZWQgY2hhciAqKSBidWZmZXI7CisJCQlkbyB7CisJCQkJc3RyZWFtLm5leHRfb3V0ID0gZGlzY2FyZDsKKwkJCQlzdHJlYW0uYXZhaWxfb3V0ID0gc2l6ZW9mKGRpc2NhcmQpOworCQkJCXJldCA9IGluZmxhdGUoJnN0cmVhbSwgWl9TWU5DX0ZMVVNIKTsKKwkJCQlTSEExX1VwZGF0ZSgmYywgZGlzY2FyZCwgc2l6ZW9mKGRpc2NhcmQpIC0KKwkJCQkJICAgIHN0cmVhbS5hdmFpbF9vdXQpOworCQkJfSB3aGlsZSAoc3RyZWFtLmF2YWlsX2luICYmIHJldCA9PSBaX09LKTsKKwkJCWlmICh3cml0ZV9idWZmZXIobG9jYWwsIGJ1ZmZlciwgKmJ1ZnBvc24gLSBzdHJlYW0uYXZhaWxfaW4pIDwgMCkKKwkJCQlkaWUoInVuYWJsZSB0byB3cml0ZSBzaGExIGZpbGUiKTsKKwkJCW1lbW1vdmUoYnVmZmVyLCBidWZmZXIgKyAqYnVmcG9zbiAtIHN0cmVhbS5hdmFpbF9pbiwKKwkJCQlzdHJlYW0uYXZhaWxfaW4pOworCQkJKmJ1ZnBvc24gPSBzdHJlYW0uYXZhaWxfaW47CisJCQlpZiAocmV0ICE9IFpfT0spCisJCQkJYnJlYWs7CisJCX0KKwkJc2l6ZSA9IHhyZWFkKGZkLCBidWZmZXIgKyAqYnVmcG9zbiwgYnVmc2l6ZSAtICpidWZwb3NuKTsKKwkJaWYgKHNpemUgPD0gMCkgeworCQkJY2xvc2UobG9jYWwpOworCQkJdW5saW5rKHRtcGZpbGUpOworCQkJaWYgKCFzaXplKQorCQkJCXJldHVybiBlcnJvcigiQ29ubmVjdGlvbiBjbG9zZWQ/Iik7CisJCQlwZXJyb3IoIlJlYWRpbmcgZnJvbSBjb25uZWN0aW9uIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJKmJ1ZnBvc24gKz0gc2l6ZTsKKwl9IHdoaWxlICgxKTsKKwlpbmZsYXRlRW5kKCZzdHJlYW0pOworCisJZmNobW9kKGxvY2FsLCAwNDQ0KTsKKwlpZiAoY2xvc2UobG9jYWwpICE9IDApCisJCWRpZSgidW5hYmxlIHRvIHdyaXRlIHNoYTEgZmlsZSIpOworCVNIQTFfRmluYWwocmVhbF9zaGExLCAmYyk7CisJaWYgKHJldCAhPSBaX1NUUkVBTV9FTkQpIHsKKwkJdW5saW5rKHRtcGZpbGUpOworCQlyZXR1cm4gZXJyb3IoIkZpbGUgJXMgY29ycnVwdGVkIiwgc2hhMV90b19oZXgoc2hhMSkpOworCX0KKwlpZiAoaGFzaGNtcChzaGExLCByZWFsX3NoYTEpKSB7CisJCXVubGluayh0bXBmaWxlKTsKKwkJcmV0dXJuIGVycm9yKCJGaWxlICVzIGhhcyBiYWQgaGFzaCIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwl9CisKKwlyZXR1cm4gbW92ZV90ZW1wX3RvX2ZpbGUodG1wZmlsZSwgc2hhMV9maWxlX25hbWUoc2hhMSkpOworfQorCitpbnQgaGFzX3BhY2tfaW5kZXgoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlpZiAoc3RhdChzaGExX3BhY2tfaW5kZXhfbmFtZShzaGExKSwgJnN0KSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK2ludCBoYXNfcGFja19maWxlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJaWYgKHN0YXQoc2hhMV9wYWNrX25hbWUoc2hhMSksICZzdCkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitpbnQgaGFzX3NoYTFfcGFjayhjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCBjaGFyICoqaWdub3JlX3BhY2tlZCkKK3sKKwlzdHJ1Y3QgcGFja19lbnRyeSBlOworCXJldHVybiBmaW5kX3BhY2tfZW50cnkoc2hhMSwgJmUsIGlnbm9yZV9wYWNrZWQpOworfQorCitpbnQgaGFzX3NoYTFfZmlsZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBzdGF0IHN0OworCXN0cnVjdCBwYWNrX2VudHJ5IGU7CisKKwlpZiAoZmluZF9wYWNrX2VudHJ5KHNoYTEsICZlLCBOVUxMKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIGZpbmRfc2hhMV9maWxlKHNoYTEsICZzdCkgPyAxIDogMDsKK30KKworaW50IGluZGV4X3BpcGUodW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZkLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgd3JpdGVfb2JqZWN0KQoreworCXN0cnVjdCBzdHJidWYgYnVmOworCWludCByZXQ7CisKKwlzdHJidWZfaW5pdCgmYnVmLCAwKTsKKwlpZiAoc3RyYnVmX3JlYWQoJmJ1ZiwgZmQsIDQwOTYpIDwgMCkgeworCQlzdHJidWZfcmVsZWFzZSgmYnVmKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICghdHlwZSkKKwkJdHlwZSA9IGJsb2JfdHlwZTsKKwlpZiAod3JpdGVfb2JqZWN0KQorCQlyZXQgPSB3cml0ZV9zaGExX2ZpbGUoYnVmLmJ1ZiwgYnVmLmxlbiwgdHlwZSwgc2hhMSk7CisJZWxzZQorCQlyZXQgPSBoYXNoX3NoYTFfZmlsZShidWYuYnVmLCBidWYubGVuLCB0eXBlLCBzaGExKTsKKwlzdHJidWZfcmVsZWFzZSgmYnVmKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBpbmRleF9mZCh1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmQsIHN0cnVjdCBzdGF0ICpzdCwgaW50IHdyaXRlX29iamVjdCwKKwkgICAgIGVudW0gb2JqZWN0X3R5cGUgdHlwZSwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzaXplX3Qgc2l6ZSA9IHhzaXplX3Qoc3QtPnN0X3NpemUpOworCXZvaWQgKmJ1ZiA9IE5VTEw7CisJaW50IHJldCwgcmVfYWxsb2NhdGVkID0gMDsKKworCWlmIChzaXplKQorCQlidWYgPSB4bW1hcChOVUxMLCBzaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisJY2xvc2UoZmQpOworCisJaWYgKCF0eXBlKQorCQl0eXBlID0gT0JKX0JMT0I7CisKKwkvKgorCSAqIENvbnZlcnQgYmxvYnMgdG8gZ2l0IGludGVybmFsIGZvcm1hdAorCSAqLworCWlmICgodHlwZSA9PSBPQkpfQkxPQikgJiYgU19JU1JFRyhzdC0+c3RfbW9kZSkpIHsKKwkJc3RydWN0IHN0cmJ1ZiBuYnVmOworCQlzdHJidWZfaW5pdCgmbmJ1ZiwgMCk7CisJCWlmIChjb252ZXJ0X3RvX2dpdChwYXRoLCBidWYsIHNpemUsICZuYnVmLAorCQkgICAgICAgICAgICAgICAgICAgd3JpdGVfb2JqZWN0ID8gc2FmZV9jcmxmIDogMCkpIHsKKwkJCW11bm1hcChidWYsIHNpemUpOworCQkJYnVmID0gc3RyYnVmX2RldGFjaCgmbmJ1ZiwgJnNpemUpOworCQkJcmVfYWxsb2NhdGVkID0gMTsKKwkJfQorCX0KKworCWlmICh3cml0ZV9vYmplY3QpCisJCXJldCA9IHdyaXRlX3NoYTFfZmlsZShidWYsIHNpemUsIHR5cGVuYW1lKHR5cGUpLCBzaGExKTsKKwllbHNlCisJCXJldCA9IGhhc2hfc2hhMV9maWxlKGJ1Ziwgc2l6ZSwgdHlwZW5hbWUodHlwZSksIHNoYTEpOworCWlmIChyZV9hbGxvY2F0ZWQpIHsKKwkJZnJlZShidWYpOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAoc2l6ZSkKKwkJbXVubWFwKGJ1Ziwgc2l6ZSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGluZGV4X3BhdGgodW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IHN0YXQgKnN0LCBpbnQgd3JpdGVfb2JqZWN0KQoreworCWludCBmZDsKKwljaGFyICp0YXJnZXQ7CisJc2l6ZV90IGxlbjsKKworCXN3aXRjaCAoc3QtPnN0X21vZGUgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZSRUc6CisJCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJCWlmIChmZCA8IDApCisJCQlyZXR1cm4gZXJyb3IoIm9wZW4oXCIlc1wiKTogJXMiLCBwYXRoLAorCQkJCSAgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJaWYgKGluZGV4X2ZkKHNoYTEsIGZkLCBzdCwgd3JpdGVfb2JqZWN0LCBPQkpfQkxPQiwgcGF0aCkgPCAwKQorCQkJcmV0dXJuIGVycm9yKCIlczogZmFpbGVkIHRvIGluc2VydCBpbnRvIGRhdGFiYXNlIiwKKwkJCQkgICAgIHBhdGgpOworCQlicmVhazsKKwljYXNlIFNfSUZMTks6CisJCWxlbiA9IHhzaXplX3Qoc3QtPnN0X3NpemUpOworCQl0YXJnZXQgPSB4bWFsbG9jKGxlbiArIDEpOworCQlpZiAocmVhZGxpbmsocGF0aCwgdGFyZ2V0LCBsZW4gKyAxKSAhPSBzdC0+c3Rfc2l6ZSkgeworCQkJY2hhciAqZXJyc3RyID0gc3RyZXJyb3IoZXJybm8pOworCQkJZnJlZSh0YXJnZXQpOworCQkJcmV0dXJuIGVycm9yKCJyZWFkbGluayhcIiVzXCIpOiAlcyIsIHBhdGgsCisJCQkgICAgICAgICAgICAgZXJyc3RyKTsKKwkJfQorCQlpZiAoIXdyaXRlX29iamVjdCkKKwkJCWhhc2hfc2hhMV9maWxlKHRhcmdldCwgbGVuLCBibG9iX3R5cGUsIHNoYTEpOworCQllbHNlIGlmICh3cml0ZV9zaGExX2ZpbGUodGFyZ2V0LCBsZW4sIGJsb2JfdHlwZSwgc2hhMSkpCisJCQlyZXR1cm4gZXJyb3IoIiVzOiBmYWlsZWQgdG8gaW5zZXJ0IGludG8gZGF0YWJhc2UiLAorCQkJCSAgICAgcGF0aCk7CisJCWZyZWUodGFyZ2V0KTsKKwkJYnJlYWs7CisJY2FzZSBTX0lGRElSOgorCQlyZXR1cm4gcmVzb2x2ZV9naXRsaW5rX3JlZihwYXRoLCAiSEVBRCIsIHNoYTEpOworCWRlZmF1bHQ6CisJCXJldHVybiBlcnJvcigiJXM6IHVuc3VwcG9ydGVkIGZpbGUgdHlwZSIsIHBhdGgpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHJlYWRfcGFja19oZWFkZXIoaW50IGZkLCBzdHJ1Y3QgcGFja19oZWFkZXIgKmhlYWRlcikKK3sKKwljaGFyICpjID0gKGNoYXIqKWhlYWRlcjsKKwlzc2l6ZV90IHJlbWFpbmluZyA9IHNpemVvZihzdHJ1Y3QgcGFja19oZWFkZXIpOworCWRvIHsKKwkJc3NpemVfdCByID0geHJlYWQoZmQsIGMsIHJlbWFpbmluZyk7CisJCWlmIChyIDw9IDApCisJCQkvKiAiZW9mIGJlZm9yZSBwYWNrIGhlYWRlciB3YXMgZnVsbHkgcmVhZCIgKi8KKwkJCXJldHVybiBQSF9FUlJPUl9FT0Y7CisJCXJlbWFpbmluZyAtPSByOworCQljICs9IHI7CisJfSB3aGlsZSAocmVtYWluaW5nID4gMCk7CisJaWYgKGhlYWRlci0+aGRyX3NpZ25hdHVyZSAhPSBodG9ubChQQUNLX1NJR05BVFVSRSkpCisJCS8qICJwcm90b2NvbCBlcnJvciAocGFjayBzaWduYXR1cmUgbWlzbWF0Y2ggZGV0ZWN0ZWQpIiAqLworCQlyZXR1cm4gUEhfRVJST1JfUEFDS19TSUdOQVRVUkU7CisJaWYgKCFwYWNrX3ZlcnNpb25fb2soaGVhZGVyLT5oZHJfdmVyc2lvbikpCisJCS8qICJwcm90b2NvbCBlcnJvciAocGFjayB2ZXJzaW9uIHVuc3VwcG9ydGVkKSIgKi8KKwkJcmV0dXJuIFBIX0VSUk9SX1BST1RPQ09MOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2hhMV9uYW1lLmMgYi9zaGExX25hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTFkMmU3Ci0tLSAvZGV2L251bGwKKysrIGIvc2hhMV9uYW1lLmMKQEAgLTAsMCArMSw3NDIgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisjaW5jbHVkZSAicmVmcy5oIgorCitzdGF0aWMgaW50IGZpbmRfc2hvcnRfb2JqZWN0X2ZpbGVuYW1lKGludCBsZW4sIGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IGFsdGVybmF0ZV9vYmplY3RfZGF0YWJhc2UgKmFsdDsKKwljaGFyIGhleFs0MF07CisJaW50IGZvdW5kID0gMDsKKwlzdGF0aWMgc3RydWN0IGFsdGVybmF0ZV9vYmplY3RfZGF0YWJhc2UgKmZha2VlbnQ7CisKKwlpZiAoIWZha2VlbnQpIHsKKwkJY29uc3QgY2hhciAqb2JqZGlyID0gZ2V0X29iamVjdF9kaXJlY3RvcnkoKTsKKwkJaW50IG9iamRpcl9sZW4gPSBzdHJsZW4ob2JqZGlyKTsKKwkJaW50IGVudGxlbiA9IG9iamRpcl9sZW4gKyA0MzsKKwkJZmFrZWVudCA9IHhtYWxsb2Moc2l6ZW9mKCpmYWtlZW50KSArIGVudGxlbik7CisJCW1lbWNweShmYWtlZW50LT5iYXNlLCBvYmpkaXIsIG9iamRpcl9sZW4pOworCQlmYWtlZW50LT5uYW1lID0gZmFrZWVudC0+YmFzZSArIG9iamRpcl9sZW4gKyAxOworCQlmYWtlZW50LT5uYW1lWy0xXSA9ICcvJzsKKwl9CisJZmFrZWVudC0+bmV4dCA9IGFsdF9vZGJfbGlzdDsKKworCXNwcmludGYoaGV4LCAiJS4ycyIsIG5hbWUpOworCWZvciAoYWx0ID0gZmFrZWVudDsgYWx0ICYmIGZvdW5kIDwgMjsgYWx0ID0gYWx0LT5uZXh0KSB7CisJCXN0cnVjdCBkaXJlbnQgKmRlOworCQlESVIgKmRpcjsKKwkJc3ByaW50ZihhbHQtPm5hbWUsICIlLjJzLyIsIG5hbWUpOworCQlkaXIgPSBvcGVuZGlyKGFsdC0+YmFzZSk7CisJCWlmICghZGlyKQorCQkJY29udGludWU7CisJCXdoaWxlICgoZGUgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJCWlmIChzdHJsZW4oZGUtPmRfbmFtZSkgIT0gMzgpCisJCQkJY29udGludWU7CisJCQlpZiAobWVtY21wKGRlLT5kX25hbWUsIG5hbWUgKyAyLCBsZW4gLSAyKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghZm91bmQpIHsKKwkJCQltZW1jcHkoaGV4ICsgMiwgZGUtPmRfbmFtZSwgMzgpOworCQkJCWZvdW5kKys7CisJCQl9CisJCQllbHNlIGlmIChtZW1jbXAoaGV4ICsgMiwgZGUtPmRfbmFtZSwgMzgpKSB7CisJCQkJZm91bmQgPSAyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWNsb3NlZGlyKGRpcik7CisJfQorCWlmIChmb3VuZCA9PSAxKQorCQlyZXR1cm4gZ2V0X3NoYTFfaGV4KGhleCwgc2hhMSkgPT0gMDsKKwlyZXR1cm4gZm91bmQ7Cit9CisKK3N0YXRpYyBpbnQgbWF0Y2hfc2hhKHVuc2lnbmVkIGxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqYikKK3sKKwlkbyB7CisJCWlmICgqYSAhPSAqYikKKwkJCXJldHVybiAwOworCQlhKys7CisJCWIrKzsKKwkJbGVuIC09IDI7CisJfSB3aGlsZSAobGVuID4gMSk7CisJaWYgKGxlbikKKwkJaWYgKCgqYSBeICpiKSAmIDB4ZjApCisJCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBmaW5kX3Nob3J0X3BhY2tlZF9vYmplY3QoaW50IGxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqbWF0Y2gsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHBhY2tlZF9naXQgKnA7CisJY29uc3QgdW5zaWduZWQgY2hhciAqZm91bmRfc2hhMSA9IE5VTEw7CisJaW50IGZvdW5kID0gMDsKKworCXByZXBhcmVfcGFja2VkX2dpdCgpOworCWZvciAocCA9IHBhY2tlZF9naXQ7IHAgJiYgZm91bmQgPCAyOyBwID0gcC0+bmV4dCkgeworCQl1aW50MzJfdCBudW0sIGxhc3Q7CisJCXVpbnQzMl90IGZpcnN0ID0gMDsKKwkJb3Blbl9wYWNrX2luZGV4KHApOworCQludW0gPSBwLT5udW1fb2JqZWN0czsKKwkJbGFzdCA9IG51bTsKKwkJd2hpbGUgKGZpcnN0IDwgbGFzdCkgeworCQkJdWludDMyX3QgbWlkID0gKGZpcnN0ICsgbGFzdCkgLyAyOworCQkJY29uc3QgdW5zaWduZWQgY2hhciAqbm93OworCQkJaW50IGNtcDsKKworCQkJbm93ID0gbnRoX3BhY2tlZF9vYmplY3Rfc2hhMShwLCBtaWQpOworCQkJY21wID0gaGFzaGNtcChtYXRjaCwgbm93KTsKKwkJCWlmICghY21wKSB7CisJCQkJZmlyc3QgPSBtaWQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoY21wID4gMCkgeworCQkJCWZpcnN0ID0gbWlkKzE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlsYXN0ID0gbWlkOworCQl9CisJCWlmIChmaXJzdCA8IG51bSkgeworCQkJY29uc3QgdW5zaWduZWQgY2hhciAqbm93LCAqbmV4dDsKKwkJICAgICAgIG5vdyA9IG50aF9wYWNrZWRfb2JqZWN0X3NoYTEocCwgZmlyc3QpOworCQkJaWYgKG1hdGNoX3NoYShsZW4sIG1hdGNoLCBub3cpKSB7CisJCQkJbmV4dCA9IG50aF9wYWNrZWRfb2JqZWN0X3NoYTEocCwgZmlyc3QrMSk7CisJCQkgICAgICAgaWYgKCFuZXh0fHwgIW1hdGNoX3NoYShsZW4sIG1hdGNoLCBuZXh0KSkgeworCQkJCQkvKiB1bmlxdWUgd2l0aGluIHRoaXMgcGFjayAqLworCQkJCQlpZiAoIWZvdW5kKSB7CisJCQkJCQlmb3VuZF9zaGExID0gbm93OworCQkJCQkJZm91bmQrKzsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChoYXNoY21wKGZvdW5kX3NoYTEsIG5vdykpIHsKKwkJCQkJCWZvdW5kID0gMjsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQkvKiBub3QgZXZlbiB1bmlxdWUgd2l0aGluIHRoaXMgcGFjayAqLworCQkJCQlmb3VuZCA9IDI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZiAoZm91bmQgPT0gMSkKKwkJaGFzaGNweShzaGExLCBmb3VuZF9zaGExKTsKKwlyZXR1cm4gZm91bmQ7Cit9CisKKyNkZWZpbmUgU0hPUlRfTkFNRV9OT1RfRk9VTkQgKC0xKQorI2RlZmluZSBTSE9SVF9OQU1FX0FNQklHVU9VUyAoLTIpCisKK3N0YXRpYyBpbnQgZmluZF91bmlxdWVfc2hvcnRfb2JqZWN0KGludCBsZW4sIGNoYXIgKmNhbm9uaWNhbCwKKwkJCQkgICAgdW5zaWduZWQgY2hhciAqcmVzLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBoYXNfdW5wYWNrZWQsIGhhc19wYWNrZWQ7CisJdW5zaWduZWQgY2hhciB1bnBhY2tlZF9zaGExWzIwXSwgcGFja2VkX3NoYTFbMjBdOworCisJcHJlcGFyZV9hbHRfb2RiKCk7CisJaGFzX3VucGFja2VkID0gZmluZF9zaG9ydF9vYmplY3RfZmlsZW5hbWUobGVuLCBjYW5vbmljYWwsIHVucGFja2VkX3NoYTEpOworCWhhc19wYWNrZWQgPSBmaW5kX3Nob3J0X3BhY2tlZF9vYmplY3QobGVuLCByZXMsIHBhY2tlZF9zaGExKTsKKwlpZiAoIWhhc191bnBhY2tlZCAmJiAhaGFzX3BhY2tlZCkKKwkJcmV0dXJuIFNIT1JUX05BTUVfTk9UX0ZPVU5EOworCWlmICgxIDwgaGFzX3VucGFja2VkIHx8IDEgPCBoYXNfcGFja2VkKQorCQlyZXR1cm4gU0hPUlRfTkFNRV9BTUJJR1VPVVM7CisJaWYgKGhhc191bnBhY2tlZCAhPSBoYXNfcGFja2VkKSB7CisJCWhhc2hjcHkoc2hhMSwgKGhhc19wYWNrZWQgPyBwYWNrZWRfc2hhMSA6IHVucGFja2VkX3NoYTEpKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIEJvdGggaGF2ZSB1bmlxdWUgb25lcyAtLSBkbyB0aGV5IG1hdGNoPyAqLworCWlmIChoYXNoY21wKHBhY2tlZF9zaGExLCB1bnBhY2tlZF9zaGExKSkKKwkJcmV0dXJuIFNIT1JUX05BTUVfQU1CSUdVT1VTOworCWhhc2hjcHkoc2hhMSwgcGFja2VkX3NoYTEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9zaG9ydF9zaGExKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sIHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkgIGludCBxdWlldGx5KQoreworCWludCBpLCBzdGF0dXM7CisJY2hhciBjYW5vbmljYWxbNDBdOworCXVuc2lnbmVkIGNoYXIgcmVzWzIwXTsKKworCWlmIChsZW4gPCBNSU5JTVVNX0FCQlJFViB8fCBsZW4gPiA0MCkKKwkJcmV0dXJuIC0xOworCWhhc2hjbHIocmVzKTsKKwltZW1zZXQoY2Fub25pY2FsLCAneCcsIDQwKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuIDtpKyspIHsKKwkJdW5zaWduZWQgY2hhciBjID0gbmFtZVtpXTsKKwkJdW5zaWduZWQgY2hhciB2YWw7CisJCWlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKKwkJCXZhbCA9IGMgLSAnMCc7CisJCWVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorCQkJdmFsID0gYyAtICdhJyArIDEwOworCQllbHNlIGlmIChjID49ICdBJyAmJiBjIDw9J0YnKSB7CisJCQl2YWwgPSBjIC0gJ0EnICsgMTA7CisJCQljIC09ICdBJyAtICdhJzsKKwkJfQorCQllbHNlCisJCQlyZXR1cm4gLTE7CisJCWNhbm9uaWNhbFtpXSA9IGM7CisJCWlmICghKGkgJiAxKSkKKwkJCXZhbCA8PD0gNDsKKwkJcmVzW2kgPj4gMV0gfD0gdmFsOworCX0KKworCXN0YXR1cyA9IGZpbmRfdW5pcXVlX3Nob3J0X29iamVjdChpLCBjYW5vbmljYWwsIHJlcywgc2hhMSk7CisJaWYgKCFxdWlldGx5ICYmIChzdGF0dXMgPT0gU0hPUlRfTkFNRV9BTUJJR1VPVVMpKQorCQlyZXR1cm4gZXJyb3IoInNob3J0IFNIQTEgJS4qcyBpcyBhbWJpZ3VvdXMuIiwgbGVuLCBjYW5vbmljYWwpOworCXJldHVybiBzdGF0dXM7Cit9CisKK2NvbnN0IGNoYXIgKmZpbmRfdW5pcXVlX2FiYnJldihjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgbGVuKQoreworCWludCBzdGF0dXMsIGV4aXN0czsKKwlzdGF0aWMgY2hhciBoZXhbNDFdOworCisJZXhpc3RzID0gaGFzX3NoYTFfZmlsZShzaGExKTsKKwltZW1jcHkoaGV4LCBzaGExX3RvX2hleChzaGExKSwgNDApOworCWlmIChsZW4gPT0gNDAgfHwgIWxlbikKKwkJcmV0dXJuIGhleDsKKwl3aGlsZSAobGVuIDwgNDApIHsKKwkJdW5zaWduZWQgY2hhciBzaGExX3JldFsyMF07CisJCXN0YXR1cyA9IGdldF9zaG9ydF9zaGExKGhleCwgbGVuLCBzaGExX3JldCwgMSk7CisJCWlmIChleGlzdHMKKwkJICAgID8gIXN0YXR1cworCQkgICAgOiBzdGF0dXMgPT0gU0hPUlRfTkFNRV9OT1RfRk9VTkQpIHsKKwkJCWhleFtsZW5dID0gMDsKKwkJCXJldHVybiBoZXg7CisJCX0KKwkJbGVuKys7CisJfQorCXJldHVybiBoZXg7Cit9CisKK3N0YXRpYyBpbnQgYW1iaWd1b3VzX3BhdGgoY29uc3QgY2hhciAqcGF0aCwgaW50IGxlbikKK3sKKwlpbnQgc2xhc2ggPSAxOworCWludCBjbnQ7CisKKwlmb3IgKGNudCA9IDA7IGNudCA8IGxlbjsgY250KyspIHsKKwkJc3dpdGNoICgqcGF0aCsrKSB7CisJCWNhc2UgJ1wwJzoKKwkJCWJyZWFrOworCQljYXNlICcvJzoKKwkJCWlmIChzbGFzaCkKKwkJCQlicmVhazsKKwkJCXNsYXNoID0gMTsKKwkJCWNvbnRpbnVlOworCQljYXNlICcuJzoKKwkJCWNvbnRpbnVlOworCQlkZWZhdWx0OgorCQkJc2xhc2ggPSAwOworCQkJY29udGludWU7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiBzbGFzaDsKK30KKworaW50IGR3aW1fcmVmKGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbiwgdW5zaWduZWQgY2hhciAqc2hhMSwgY2hhciAqKnJlZikKK3sKKwljb25zdCBjaGFyICoqcCwgKnI7CisJaW50IHJlZnNfZm91bmQgPSAwOworCisJKnJlZiA9IE5VTEw7CisJZm9yIChwID0gcmVmX3Jldl9wYXJzZV9ydWxlczsgKnA7IHArKykgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFfZnJvbV9yZWZbMjBdOworCQl1bnNpZ25lZCBjaGFyICp0aGlzX3Jlc3VsdDsKKworCQl0aGlzX3Jlc3VsdCA9IHJlZnNfZm91bmQgPyBzaGExX2Zyb21fcmVmIDogc2hhMTsKKwkJciA9IHJlc29sdmVfcmVmKG1rcGF0aCgqcCwgbGVuLCBzdHIpLCB0aGlzX3Jlc3VsdCwgMSwgTlVMTCk7CisJCWlmIChyKSB7CisJCQlpZiAoIXJlZnNfZm91bmQrKykKKwkJCQkqcmVmID0geHN0cmR1cChyKTsKKwkJCWlmICghd2Fybl9hbWJpZ3VvdXNfcmVmcykKKwkJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmVmc19mb3VuZDsKK30KKworaW50IGR3aW1fbG9nKGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbiwgdW5zaWduZWQgY2hhciAqc2hhMSwgY2hhciAqKmxvZykKK3sKKwljb25zdCBjaGFyICoqcDsKKwlpbnQgbG9nc19mb3VuZCA9IDA7CisKKwkqbG9nID0gTlVMTDsKKwlmb3IgKHAgPSByZWZfcmV2X3BhcnNlX3J1bGVzOyAqcDsgcCsrKSB7CisJCXN0cnVjdCBzdGF0IHN0OworCQl1bnNpZ25lZCBjaGFyIGhhc2hbMjBdOworCQljaGFyIHBhdGhbUEFUSF9NQVhdOworCQljb25zdCBjaGFyICpyZWYsICppdDsKKworCQlzdHJjcHkocGF0aCwgbWtwYXRoKCpwLCBsZW4sIHN0cikpOworCQlyZWYgPSByZXNvbHZlX3JlZihwYXRoLCBoYXNoLCAwLCBOVUxMKTsKKwkJaWYgKCFyZWYpCisJCQljb250aW51ZTsKKwkJaWYgKCFzdGF0KGdpdF9wYXRoKCJsb2dzLyVzIiwgcGF0aCksICZzdCkgJiYKKwkJICAgIFNfSVNSRUcoc3Quc3RfbW9kZSkpCisJCQlpdCA9IHBhdGg7CisJCWVsc2UgaWYgKHN0cmNtcChyZWYsIHBhdGgpICYmCisJCQkgIXN0YXQoZ2l0X3BhdGgoImxvZ3MvJXMiLCByZWYpLCAmc3QpICYmCisJCQkgU19JU1JFRyhzdC5zdF9tb2RlKSkKKwkJCWl0ID0gcmVmOworCQllbHNlCisJCQljb250aW51ZTsKKwkJaWYgKCFsb2dzX2ZvdW5kKyspIHsKKwkJCSpsb2cgPSB4c3RyZHVwKGl0KTsKKwkJCWhhc2hjcHkoc2hhMSwgaGFzaCk7CisJCX0KKwkJaWYgKCF3YXJuX2FtYmlndW91c19yZWZzKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBsb2dzX2ZvdW5kOworfQorCitzdGF0aWMgaW50IGdldF9zaGExX2Jhc2ljKGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbiwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqd2FybmluZyA9ICJ3YXJuaW5nOiByZWZuYW1lICclLipzJyBpcyBhbWJpZ3VvdXMuXG4iOworCWNoYXIgKnJlYWxfcmVmID0gTlVMTDsKKwlpbnQgcmVmc19mb3VuZCA9IDA7CisJaW50IGF0LCByZWZsb2dfbGVuOworCisJaWYgKGxlbiA9PSA0MCAmJiAhZ2V0X3NoYTFfaGV4KHN0ciwgc2hhMSkpCisJCXJldHVybiAwOworCisJLyogYmFzaWNAe3RpbWUgb3IgbnVtYmVyfSBmb3JtYXQgdG8gcXVlcnkgcmVmLWxvZyAqLworCXJlZmxvZ19sZW4gPSBhdCA9IDA7CisJaWYgKHN0cltsZW4tMV0gPT0gJ30nKSB7CisJCWZvciAoYXQgPSAwOyBhdCA8IGxlbiAtIDE7IGF0KyspIHsKKwkJCWlmIChzdHJbYXRdID09ICdAJyAmJiBzdHJbYXQrMV0gPT0gJ3snKSB7CisJCQkJcmVmbG9nX2xlbiA9IChsZW4tMSkgLSAoYXQrMik7CisJCQkJbGVuID0gYXQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBBY2NlcHQgb25seSB1bmFtYmlndW91cyByZWYgcGF0aHMuICovCisJaWYgKGxlbiAmJiBhbWJpZ3VvdXNfcGF0aChzdHIsIGxlbikpCisJCXJldHVybiAtMTsKKworCWlmICghbGVuICYmIHJlZmxvZ19sZW4pIHsKKwkJLyogYWxsb3cgIkB7Li4ufSIgdG8gbWVhbiB0aGUgY3VycmVudCBicmFuY2ggcmVmbG9nICovCisJCXJlZnNfZm91bmQgPSBkd2ltX3JlZigiSEVBRCIsIDQsIHNoYTEsICZyZWFsX3JlZik7CisJfSBlbHNlIGlmIChyZWZsb2dfbGVuKQorCQlyZWZzX2ZvdW5kID0gZHdpbV9sb2coc3RyLCBsZW4sIHNoYTEsICZyZWFsX3JlZik7CisJZWxzZQorCQlyZWZzX2ZvdW5kID0gZHdpbV9yZWYoc3RyLCBsZW4sIHNoYTEsICZyZWFsX3JlZik7CisKKwlpZiAoIXJlZnNfZm91bmQpCisJCXJldHVybiAtMTsKKworCWlmICh3YXJuX2FtYmlndW91c19yZWZzICYmIHJlZnNfZm91bmQgPiAxKQorCQlmcHJpbnRmKHN0ZGVyciwgd2FybmluZywgbGVuLCBzdHIpOworCisJaWYgKHJlZmxvZ19sZW4pIHsKKwkJaW50IG50aCwgaTsKKwkJdW5zaWduZWQgbG9uZyBhdF90aW1lOworCQl1bnNpZ25lZCBsb25nIGNvX3RpbWU7CisJCWludCBjb190eiwgY29fY250OworCisJCS8qIElzIGl0IGFza2luZyBmb3IgTi10aCBlbnRyeSwgb3IgYXBwcm94aWRhdGU/ICovCisJCWZvciAoaSA9IG50aCA9IDA7IDAgPD0gbnRoICYmIGkgPCByZWZsb2dfbGVuOyBpKyspIHsKKwkJCWNoYXIgY2ggPSBzdHJbYXQrMitpXTsKKwkJCWlmICgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKQorCQkJCW50aCA9IG50aCAqIDEwICsgY2ggLSAnMCc7CisJCQllbHNlCisJCQkJbnRoID0gLTE7CisJCX0KKwkJaWYgKDAgPD0gbnRoKQorCQkJYXRfdGltZSA9IDA7CisJCWVsc2UKKwkJCWF0X3RpbWUgPSBhcHByb3hpZGF0ZShzdHIgKyBhdCArIDIpOworCQlpZiAocmVhZF9yZWZfYXQocmVhbF9yZWYsIGF0X3RpbWUsIG50aCwgc2hhMSwgTlVMTCwKKwkJCQkmY29fdGltZSwgJmNvX3R6LCAmY29fY250KSkgeworCQkJaWYgKGF0X3RpbWUpCisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSJ3YXJuaW5nOiBMb2cgZm9yICclLipzJyBvbmx5IGdvZXMgIgorCQkJCQkiYmFjayB0byAlcy5cbiIsIGxlbiwgc3RyLAorCQkJCQlzaG93X2RhdGUoY29fdGltZSwgY29fdHosIERBVEVfUkZDMjgyMikpOworCQkJZWxzZQorCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkid2FybmluZzogTG9nIGZvciAnJS4qcycgb25seSBoYXMgIgorCQkJCQkiJWQgZW50cmllcy5cbiIsIGxlbiwgc3RyLCBjb19jbnQpOworCQl9CisJfQorCisJZnJlZShyZWFsX3JlZik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3NoYTFfMShjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpzaGExKTsKKworc3RhdGljIGludCBnZXRfcGFyZW50KGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgKnJlc3VsdCwgaW50IGlkeCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWludCByZXQgPSBnZXRfc2hhMV8xKG5hbWUsIGxlbiwgc2hhMSk7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCXN0cnVjdCBjb21taXRfbGlzdCAqcDsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJY29tbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2Uoc2hhMSk7CisJaWYgKCFjb21taXQpCisJCXJldHVybiAtMTsKKwlpZiAocGFyc2VfY29tbWl0KGNvbW1pdCkpCisJCXJldHVybiAtMTsKKwlpZiAoIWlkeCkgeworCQloYXNoY3B5KHJlc3VsdCwgY29tbWl0LT5vYmplY3Quc2hhMSk7CisJCXJldHVybiAwOworCX0KKwlwID0gY29tbWl0LT5wYXJlbnRzOworCXdoaWxlIChwKSB7CisJCWlmICghLS1pZHgpIHsKKwkJCWhhc2hjcHkocmVzdWx0LCBwLT5pdGVtLT5vYmplY3Quc2hhMSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwID0gcC0+bmV4dDsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGdldF9udGhfYW5jZXN0b3IoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwKKwkJCSAgICB1bnNpZ25lZCBjaGFyICpyZXN1bHQsIGludCBnZW5lcmF0aW9uKQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCWludCByZXQ7CisKKwlyZXQgPSBnZXRfc2hhMV8xKG5hbWUsIGxlbiwgc2hhMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwljb21taXQgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShzaGExKTsKKwlpZiAoIWNvbW1pdCkKKwkJcmV0dXJuIC0xOworCisJd2hpbGUgKGdlbmVyYXRpb24tLSkgeworCQlpZiAocGFyc2VfY29tbWl0KGNvbW1pdCkgfHwgIWNvbW1pdC0+cGFyZW50cykKKwkJCXJldHVybiAtMTsKKwkJY29tbWl0ID0gY29tbWl0LT5wYXJlbnRzLT5pdGVtOworCX0KKwloYXNoY3B5KHJlc3VsdCwgY29tbWl0LT5vYmplY3Quc2hhMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBvYmplY3QgKnBlZWxfdG9fdHlwZShjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkJCSAgICBzdHJ1Y3Qgb2JqZWN0ICpvLCBlbnVtIG9iamVjdF90eXBlIGV4cGVjdGVkX3R5cGUpCit7CisJaWYgKG5hbWUgJiYgIW5hbWVsZW4pCisJCW5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisJaWYgKCFvKSB7CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCWlmIChnZXRfc2hhMV8xKG5hbWUsIG5hbWVsZW4sIHNoYTEpKQorCQkJcmV0dXJuIE5VTEw7CisJCW8gPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJfQorCXdoaWxlICgxKSB7CisJCWlmICghbyB8fCAoIW8tPnBhcnNlZCAmJiAhcGFyc2Vfb2JqZWN0KG8tPnNoYTEpKSkKKwkJCXJldHVybiBOVUxMOworCQlpZiAoby0+dHlwZSA9PSBleHBlY3RlZF90eXBlKQorCQkJcmV0dXJuIG87CisJCWlmIChvLT50eXBlID09IE9CSl9UQUcpCisJCQlvID0gKChzdHJ1Y3QgdGFnKikgbyktPnRhZ2dlZDsKKwkJZWxzZSBpZiAoby0+dHlwZSA9PSBPQkpfQ09NTUlUKQorCQkJbyA9ICYoKChzdHJ1Y3QgY29tbWl0ICopIG8pLT50cmVlLT5vYmplY3QpOworCQllbHNlIHsKKwkJCWlmIChuYW1lKQorCQkJCWVycm9yKCIlLipzOiBleHBlY3RlZCAlcyB0eXBlLCBidXQgdGhlIG9iamVjdCAiCisJCQkJICAgICAgImRlcmVmZXJlbmNlcyB0byAlcyB0eXBlIiwKKwkJCQkgICAgICBuYW1lbGVuLCBuYW1lLCB0eXBlbmFtZShleHBlY3RlZF90eXBlKSwKKwkJCQkgICAgICB0eXBlbmFtZShvLT50eXBlKSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBwZWVsX29uaW9uKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJdW5zaWduZWQgY2hhciBvdXRlclsyMF07CisJY29uc3QgY2hhciAqc3A7CisJdW5zaWduZWQgaW50IGV4cGVjdGVkX3R5cGUgPSAwOworCXN0cnVjdCBvYmplY3QgKm87CisKKwkvKgorCSAqICJyZWZee3R5cGV9IiBkZXJlZmVyZW5jZXMgcmVmIHJlcGVhdGVkbHkgdW50aWwgeW91IGNhbm5vdAorCSAqIGRlcmVmZXJlbmNlIGFueW1vcmUsIG9yIHlvdSBnZXQgYW4gb2JqZWN0IG9mIGdpdmVuIHR5cGUsCisJICogd2hpY2hldmVyIGNvbWVzIGZpcnN0LiAgInJlZl57fSIgbWVhbnMganVzdCBkZXJlZmVyZW5jZQorCSAqIHRhZ3MgdW50aWwgeW91IGdldCBhIG5vbi10YWcuICAicmVmXjAiIGlzIGEgc2hvcnRoYW5kIGZvcgorCSAqICJyZWZee2NvbW1pdH0iLiAgImNvbW1pdF57dHJlZX0iIGNvdWxkIGJlIHVzZWQgdG8gZmluZCB0aGUKKwkgKiB0b3AtbGV2ZWwgdHJlZSBvZiB0aGUgZ2l2ZW4gY29tbWl0LgorCSAqLworCWlmIChsZW4gPCA0IHx8IG5hbWVbbGVuLTFdICE9ICd9JykKKwkJcmV0dXJuIC0xOworCisJZm9yIChzcCA9IG5hbWUgKyBsZW4gLSAxOyBuYW1lIDw9IHNwOyBzcC0tKSB7CisJCWludCBjaCA9ICpzcDsKKwkJaWYgKGNoID09ICd7JyAmJiBuYW1lIDwgc3AgJiYgc3BbLTFdID09ICdeJykKKwkJCWJyZWFrOworCX0KKwlpZiAoc3AgPD0gbmFtZSkKKwkJcmV0dXJuIC0xOworCisJc3ArKzsgLyogYmVnaW5uaW5nIG9mIHR5cGUgbmFtZSwgb3IgY2xvc2luZyBicmFjZSBmb3IgZW1wdHkgKi8KKwlpZiAoIXN0cm5jbXAoY29tbWl0X3R5cGUsIHNwLCA2KSAmJiBzcFs2XSA9PSAnfScpCisJCWV4cGVjdGVkX3R5cGUgPSBPQkpfQ09NTUlUOworCWVsc2UgaWYgKCFzdHJuY21wKHRyZWVfdHlwZSwgc3AsIDQpICYmIHNwWzRdID09ICd9JykKKwkJZXhwZWN0ZWRfdHlwZSA9IE9CSl9UUkVFOworCWVsc2UgaWYgKCFzdHJuY21wKGJsb2JfdHlwZSwgc3AsIDQpICYmIHNwWzRdID09ICd9JykKKwkJZXhwZWN0ZWRfdHlwZSA9IE9CSl9CTE9COworCWVsc2UgaWYgKHNwWzBdID09ICd9JykKKwkJZXhwZWN0ZWRfdHlwZSA9IE9CSl9OT05FOworCWVsc2UKKwkJcmV0dXJuIC0xOworCisJaWYgKGdldF9zaGExXzEobmFtZSwgc3AgLSBuYW1lIC0gMiwgb3V0ZXIpKQorCQlyZXR1cm4gLTE7CisKKwlvID0gcGFyc2Vfb2JqZWN0KG91dGVyKTsKKwlpZiAoIW8pCisJCXJldHVybiAtMTsKKwlpZiAoIWV4cGVjdGVkX3R5cGUpIHsKKwkJbyA9IGRlcmVmX3RhZyhvLCBuYW1lLCBzcCAtIG5hbWUgLSAyKTsKKwkJaWYgKCFvIHx8ICghby0+cGFyc2VkICYmICFwYXJzZV9vYmplY3Qoby0+c2hhMSkpKQorCQkJcmV0dXJuIC0xOworCQloYXNoY3B5KHNoYTEsIG8tPnNoYTEpOworCX0KKwllbHNlIHsKKwkJLyoKKwkJICogQXQgdGhpcyBwb2ludCwgdGhlIHN5bnRheCBsb29rIGNvcnJlY3QsIHNvCisJCSAqIGlmIHdlIGRvIG5vdCBnZXQgdGhlIG5lZWRlZCBvYmplY3QsIHdlIHNob3VsZAorCQkgKiBiYXJmLgorCQkgKi8KKwkJbyA9IHBlZWxfdG9fdHlwZShuYW1lLCBsZW4sIG8sIGV4cGVjdGVkX3R5cGUpOworCQlpZiAobykgeworCQkJaGFzaGNweShzaGExLCBvLT5zaGExKTsKKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2Rlc2NyaWJlX25hbWUoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwljb25zdCBjaGFyICpjcDsKKworCWZvciAoY3AgPSBuYW1lICsgbGVuIC0gMTsgbmFtZSArIDIgPD0gY3A7IGNwLS0pIHsKKwkJY2hhciBjaCA9ICpjcDsKKwkJaWYgKGhleHZhbChjaCkgJiB+MDM3NykgeworCQkJLyogV2UgbXVzdCBiZSBsb29raW5nIGF0IGcgaW4gIlNPTUVUSElORy1nIgorCQkJICogZm9yIGl0IHRvIGJlIGRlc2NyaWJlIG91dHB1dC4KKwkJCSAqLworCQkJaWYgKGNoID09ICdnJyAmJiBjcFstMV0gPT0gJy0nKSB7CisJCQkJY3ArKzsKKwkJCQlsZW4gLT0gY3AgLSBuYW1lOworCQkJCXJldHVybiBnZXRfc2hvcnRfc2hhMShjcCwgbGVuLCBzaGExLCAxKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3NoYTFfMShjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCByZXQsIGhhc19zdWZmaXg7CisJY29uc3QgY2hhciAqY3A7CisKKwkvKgorCSAqICJuYW1lfjMiIGlzICJuYW1lXl5eIiwgIm5hbWV+IiBpcyAibmFtZX4xIiwgYW5kICJuYW1lXiIgaXMgIm5hbWVeMSIuCisJICovCisJaGFzX3N1ZmZpeCA9IDA7CisJZm9yIChjcCA9IG5hbWUgKyBsZW4gLSAxOyBuYW1lIDw9IGNwOyBjcC0tKSB7CisJCWludCBjaCA9ICpjcDsKKwkJaWYgKCcwJyA8PSBjaCAmJiBjaCA8PSAnOScpCisJCQljb250aW51ZTsKKwkJaWYgKGNoID09ICd+JyB8fCBjaCA9PSAnXicpCisJCQloYXNfc3VmZml4ID0gY2g7CisJCWJyZWFrOworCX0KKworCWlmIChoYXNfc3VmZml4KSB7CisJCWludCBudW0gPSAwOworCQlpbnQgbGVuMSA9IGNwIC0gbmFtZTsKKwkJY3ArKzsKKwkJd2hpbGUgKGNwIDwgbmFtZSArIGxlbikKKwkJCW51bSA9IG51bSAqIDEwICsgKmNwKysgLSAnMCc7CisJCWlmICghbnVtICYmIGxlbjEgPT0gbGVuIC0gMSkKKwkJCW51bSA9IDE7CisJCWlmIChoYXNfc3VmZml4ID09ICdeJykKKwkJCXJldHVybiBnZXRfcGFyZW50KG5hbWUsIGxlbjEsIHNoYTEsIG51bSk7CisJCS8qIGVsc2UgaWYgKGhhc19zdWZmaXggPT0gJ34nKSAtLSBnb2VzIHdpdGhvdXQgc2F5aW5nICovCisJCXJldHVybiBnZXRfbnRoX2FuY2VzdG9yKG5hbWUsIGxlbjEsIHNoYTEsIG51bSk7CisJfQorCisJcmV0ID0gcGVlbF9vbmlvbihuYW1lLCBsZW4sIHNoYTEpOworCWlmICghcmV0KQorCQlyZXR1cm4gMDsKKworCXJldCA9IGdldF9zaGExX2Jhc2ljKG5hbWUsIGxlbiwgc2hhMSk7CisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCisJLyogSXQgY291bGQgYmUgZGVzY3JpYmUgb3V0cHV0IHRoYXQgaXMgIlNPTUVUSElORy1nWFhYWCIgKi8KKwlyZXQgPSBnZXRfZGVzY3JpYmVfbmFtZShuYW1lLCBsZW4sIHNoYTEpOworCWlmICghcmV0KQorCQlyZXR1cm4gMDsKKworCXJldHVybiBnZXRfc2hvcnRfc2hhMShuYW1lLCBsZW4sIHNoYTEsIDApOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9vbmVfcmVmKGNvbnN0IGNoYXIgKnBhdGgsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmbGFnLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqKmxpc3QgPSBjYl9kYXRhOworCXN0cnVjdCBvYmplY3QgKm9iamVjdCA9IHBhcnNlX29iamVjdChzaGExKTsKKwlpZiAoIW9iamVjdCkKKwkJcmV0dXJuIDA7CisJaWYgKG9iamVjdC0+dHlwZSA9PSBPQkpfVEFHKSB7CisJCW9iamVjdCA9IGRlcmVmX3RhZyhvYmplY3QsIHBhdGgsIHN0cmxlbihwYXRoKSk7CisJCWlmICghb2JqZWN0KQorCQkJcmV0dXJuIDA7CisJfQorCWlmIChvYmplY3QtPnR5cGUgIT0gT0JKX0NPTU1JVCkKKwkJcmV0dXJuIDA7CisJaW5zZXJ0X2J5X2RhdGUoKHN0cnVjdCBjb21taXQgKilvYmplY3QsIGxpc3QpOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBpbnRlcnByZXRzIG5hbWVzIGxpa2UgJzovSW5pdGlhbCByZXZpc2lvbiBvZiAiZ2l0IicgYnkgc2VhcmNoaW5nCisgKiB0aHJvdWdoIGhpc3RvcnkgYW5kIHJldHVybmluZyB0aGUgZmlyc3QgY29tbWl0IHdob3NlIG1lc3NhZ2Ugc3RhcnRzCisgKiB3aXRoIHRoZSBnaXZlbiBzdHJpbmcuCisgKgorICogRm9yIGZ1dHVyZSBleHRlbnNpb24sICc6LyEnIGlzIHJlc2VydmVkLiBJZiB5b3Ugd2FudCB0byBtYXRjaCBhIG1lc3NhZ2UKKyAqIGJlZ2lubmluZyB3aXRoIGEgJyEnLCB5b3UgaGF2ZSB0byByZXBlYXQgdGhlIGV4Y2xhbWF0aW9uIG1hcmsuCisgKi8KKworI2RlZmluZSBPTkVMSU5FX1NFRU4gKDF1PDwyMCkKK3N0YXRpYyBpbnQgZ2V0X3NoYTFfb25lbGluZShjb25zdCBjaGFyICpwcmVmaXgsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0ID0gTlVMTCwgKmJhY2t1cCA9IE5VTEwsICpsOworCWludCByZXR2YWwgPSAtMTsKKwljaGFyICp0ZW1wX2NvbW1pdF9idWZmZXIgPSBOVUxMOworCisJaWYgKHByZWZpeFswXSA9PSAnIScpIHsKKwkJaWYgKHByZWZpeFsxXSAhPSAnIScpCisJCQlkaWUgKCJJbnZhbGlkIHNlYXJjaCBwYXR0ZXJuOiAlcyIsIHByZWZpeCk7CisJCXByZWZpeCsrOworCX0KKwlmb3JfZWFjaF9yZWYoaGFuZGxlX29uZV9yZWYsICZsaXN0KTsKKwlmb3IgKGwgPSBsaXN0OyBsOyBsID0gbC0+bmV4dCkKKwkJY29tbWl0X2xpc3RfaW5zZXJ0KGwtPml0ZW0sICZiYWNrdXApOworCXdoaWxlIChsaXN0KSB7CisJCWNoYXIgKnA7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwkJZW51bSBvYmplY3RfdHlwZSB0eXBlOworCQl1bnNpZ25lZCBsb25nIHNpemU7CisKKwkJY29tbWl0ID0gcG9wX21vc3RfcmVjZW50X2NvbW1pdCgmbGlzdCwgT05FTElORV9TRUVOKTsKKwkJaWYgKCFwYXJzZV9vYmplY3QoY29tbWl0LT5vYmplY3Quc2hhMSkpCisJCQljb250aW51ZTsKKwkJZnJlZSh0ZW1wX2NvbW1pdF9idWZmZXIpOworCQlpZiAoY29tbWl0LT5idWZmZXIpCisJCQlwID0gY29tbWl0LT5idWZmZXI7CisJCWVsc2UgeworCQkJcCA9IHJlYWRfc2hhMV9maWxlKGNvbW1pdC0+b2JqZWN0LnNoYTEsICZ0eXBlLCAmc2l6ZSk7CisJCQlpZiAoIXApCisJCQkJY29udGludWU7CisJCQl0ZW1wX2NvbW1pdF9idWZmZXIgPSBwOworCQl9CisJCWlmICghKHAgPSBzdHJzdHIocCwgIlxuXG4iKSkpCisJCQljb250aW51ZTsKKwkJaWYgKCFwcmVmaXhjbXAocCArIDIsIHByZWZpeCkpIHsKKwkJCWhhc2hjcHkoc2hhMSwgY29tbWl0LT5vYmplY3Quc2hhMSk7CisJCQlyZXR2YWwgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJZnJlZSh0ZW1wX2NvbW1pdF9idWZmZXIpOworCWZyZWVfY29tbWl0X2xpc3QobGlzdCk7CisJZm9yIChsID0gYmFja3VwOyBsOyBsID0gbC0+bmV4dCkKKwkJY2xlYXJfY29tbWl0X21hcmtzKGwtPml0ZW0sIE9ORUxJTkVfU0VFTik7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFRoaXMgaXMgbGlrZSAiZ2V0X3NoYTFfYmFzaWMoKSIsIGV4Y2VwdCBpdCBhbGxvd3MgInNoYTEgZXhwcmVzc2lvbnMiLAorICogbm90YWJseSAieHl6XiIgZm9yICJwYXJlbnQgb2YgeHl6IgorICovCitpbnQgZ2V0X3NoYTEoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwl1bnNpZ25lZCB1bnVzZWQ7CisJcmV0dXJuIGdldF9zaGExX3dpdGhfbW9kZShuYW1lLCBzaGExLCAmdW51c2VkKTsKK30KKworaW50IGdldF9zaGExX3dpdGhfbW9kZShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBjaGFyICpzaGExLCB1bnNpZ25lZCAqbW9kZSkKK3sKKwlpbnQgcmV0LCBicmFja2V0X2RlcHRoOworCWludCBuYW1lbGVuID0gc3RybGVuKG5hbWUpOworCWNvbnN0IGNoYXIgKmNwOworCisJKm1vZGUgPSBTX0lGSU5WQUxJRDsKKwlyZXQgPSBnZXRfc2hhMV8xKG5hbWUsIG5hbWVsZW4sIHNoYTEpOworCWlmICghcmV0KQorCQlyZXR1cm4gcmV0OworCS8qIHNoYTE6cGF0aCAtLT4gb2JqZWN0IG5hbWUgb2YgcGF0aCBpbiBlbnQgc2hhMQorCSAqIDpwYXRoIC0+IG9iamVjdCBuYW1lIG9mIHBhdGggaW4gaW5kZXgKKwkgKiA6WzAtM106cGF0aCAtPiBvYmplY3QgbmFtZSBvZiBwYXRoIGluIGluZGV4IGF0IHN0YWdlCisJICovCisJaWYgKG5hbWVbMF0gPT0gJzonKSB7CisJCWludCBzdGFnZSA9IDA7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisJCWludCBwb3M7CisJCWlmIChuYW1lbGVuID4gMiAmJiBuYW1lWzFdID09ICcvJykKKwkJCXJldHVybiBnZXRfc2hhMV9vbmVsaW5lKG5hbWUgKyAyLCBzaGExKTsKKwkJaWYgKG5hbWVsZW4gPCAzIHx8CisJCSAgICBuYW1lWzJdICE9ICc6JyB8fAorCQkgICAgbmFtZVsxXSA8ICcwJyB8fCAnMycgPCBuYW1lWzFdKQorCQkJY3AgPSBuYW1lICsgMTsKKwkJZWxzZSB7CisJCQlzdGFnZSA9IG5hbWVbMV0gLSAnMCc7CisJCQljcCA9IG5hbWUgKyAzOworCQl9CisJCW5hbWVsZW4gPSBuYW1lbGVuIC0gKGNwIC0gbmFtZSk7CisJCWlmICghYWN0aXZlX2NhY2hlKQorCQkJcmVhZF9jYWNoZSgpOworCQlwb3MgPSBjYWNoZV9uYW1lX3BvcyhjcCwgbmFtZWxlbik7CisJCWlmIChwb3MgPCAwKQorCQkJcG9zID0gLXBvcyAtIDE7CisJCXdoaWxlIChwb3MgPCBhY3RpdmVfbnIpIHsKKwkJCWNlID0gYWN0aXZlX2NhY2hlW3Bvc107CisJCQlpZiAoY2VfbmFtZWxlbihjZSkgIT0gbmFtZWxlbiB8fAorCQkJICAgIG1lbWNtcChjZS0+bmFtZSwgY3AsIG5hbWVsZW4pKQorCQkJCWJyZWFrOworCQkJaWYgKGNlX3N0YWdlKGNlKSA9PSBzdGFnZSkgeworCQkJCWhhc2hjcHkoc2hhMSwgY2UtPnNoYTEpOworCQkJCSptb2RlID0gY2UtPmNlX21vZGU7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlwb3MrKzsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCWZvciAoY3AgPSBuYW1lLCBicmFja2V0X2RlcHRoID0gMDsgKmNwOyBjcCsrKSB7CisJCWlmICgqY3AgPT0gJ3snKQorCQkJYnJhY2tldF9kZXB0aCsrOworCQllbHNlIGlmIChicmFja2V0X2RlcHRoICYmICpjcCA9PSAnfScpCisJCQlicmFja2V0X2RlcHRoLS07CisJCWVsc2UgaWYgKCFicmFja2V0X2RlcHRoICYmICpjcCA9PSAnOicpCisJCQlicmVhazsKKwl9CisJaWYgKCpjcCA9PSAnOicpIHsKKwkJdW5zaWduZWQgY2hhciB0cmVlX3NoYTFbMjBdOworCQlpZiAoIWdldF9zaGExXzEobmFtZSwgY3AtbmFtZSwgdHJlZV9zaGExKSkKKwkJCXJldHVybiBnZXRfdHJlZV9lbnRyeSh0cmVlX3NoYTEsIGNwKzEsIHNoYTEsCisJCQkJCSAgICAgIG1vZGUpOworCX0KKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvc2hhbGxvdy5jIGIvc2hhbGxvdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOTBlZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGFsbG93LmMKQEAgLTAsMCArMSwxMDQgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRhZy5oIgorCitzdGF0aWMgaW50IGlzX3NoYWxsb3cgPSAtMTsKKworaW50IHJlZ2lzdGVyX3NoYWxsb3coY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3QgY29tbWl0X2dyYWZ0ICpncmFmdCA9CisJCXhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21taXRfZ3JhZnQpKTsKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsb29rdXBfY29tbWl0KHNoYTEpOworCisJaGFzaGNweShncmFmdC0+c2hhMSwgc2hhMSk7CisJZ3JhZnQtPm5yX3BhcmVudCA9IC0xOworCWlmIChjb21taXQgJiYgY29tbWl0LT5vYmplY3QucGFyc2VkKQorCQljb21taXQtPnBhcmVudHMgPSBOVUxMOworCXJldHVybiByZWdpc3Rlcl9jb21taXRfZ3JhZnQoZ3JhZnQsIDApOworfQorCitpbnQgaXNfcmVwb3NpdG9yeV9zaGFsbG93KHZvaWQpCit7CisJRklMRSAqZnA7CisJY2hhciBidWZbMTAyNF07CisKKwlpZiAoaXNfc2hhbGxvdyA+PSAwKQorCQlyZXR1cm4gaXNfc2hhbGxvdzsKKworCWZwID0gZm9wZW4oZ2l0X3BhdGgoInNoYWxsb3ciKSwgInIiKTsKKwlpZiAoIWZwKSB7CisJCWlzX3NoYWxsb3cgPSAwOworCQlyZXR1cm4gaXNfc2hhbGxvdzsKKwl9CisJaXNfc2hhbGxvdyA9IDE7CisKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCWlmIChnZXRfc2hhMV9oZXgoYnVmLCBzaGExKSkKKwkJCWRpZSgiYmFkIHNoYWxsb3cgbGluZTogJXMiLCBidWYpOworCQlyZWdpc3Rlcl9zaGFsbG93KHNoYTEpOworCX0KKwlmY2xvc2UoZnApOworCXJldHVybiBpc19zaGFsbG93OworfQorCitzdHJ1Y3QgY29tbWl0X2xpc3QgKmdldF9zaGFsbG93X2NvbW1pdHMoc3RydWN0IG9iamVjdF9hcnJheSAqaGVhZHMsIGludCBkZXB0aCwKKwkJaW50IHNoYWxsb3dfZmxhZywgaW50IG5vdF9zaGFsbG93X2ZsYWcpCit7CisJaW50IGkgPSAwLCBjdXJfZGVwdGggPSAwOworCXN0cnVjdCBjb21taXRfbGlzdCAqcmVzdWx0ID0gTlVMTDsKKwlzdHJ1Y3Qgb2JqZWN0X2FycmF5IHN0YWNrID0gezAsIDAsIE5VTEx9OworCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IE5VTEw7CisKKwl3aGlsZSAoY29tbWl0IHx8IGkgPCBoZWFkcy0+bnIgfHwgc3RhY2subnIpIHsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICpwOworCQlpZiAoIWNvbW1pdCkgeworCQkJaWYgKGkgPCBoZWFkcy0+bnIpIHsKKwkJCQljb21taXQgPSAoc3RydWN0IGNvbW1pdCAqKQorCQkJCQlkZXJlZl90YWcoaGVhZHMtPm9iamVjdHNbaSsrXS5pdGVtLCBOVUxMLCAwKTsKKwkJCQlpZiAoIWNvbW1pdCB8fCBjb21taXQtPm9iamVjdC50eXBlICE9IE9CSl9DT01NSVQpIHsKKwkJCQkJY29tbWl0ID0gTlVMTDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmICghY29tbWl0LT51dGlsKQorCQkJCQljb21taXQtPnV0aWwgPSB4bWFsbG9jKHNpemVvZihpbnQpKTsKKwkJCQkqKGludCAqKWNvbW1pdC0+dXRpbCA9IDA7CisJCQkJY3VyX2RlcHRoID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJY29tbWl0ID0gKHN0cnVjdCBjb21taXQgKikKKwkJCQkJc3RhY2sub2JqZWN0c1stLXN0YWNrLm5yXS5pdGVtOworCQkJCWN1cl9kZXB0aCA9ICooaW50ICopY29tbWl0LT51dGlsOworCQkJfQorCQl9CisJCWlmIChwYXJzZV9jb21taXQoY29tbWl0KSkKKwkJCWRpZSgiaW52YWxpZCBjb21taXQiKTsKKwkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gbm90X3NoYWxsb3dfZmxhZzsKKwkJY3VyX2RlcHRoKys7CisJCWZvciAocCA9IGNvbW1pdC0+cGFyZW50cywgY29tbWl0ID0gTlVMTDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJCWlmICghcC0+aXRlbS0+dXRpbCkgeworCQkJCWludCAqcG9pbnRlciA9IHhtYWxsb2Moc2l6ZW9mKGludCkpOworCQkJCXAtPml0ZW0tPnV0aWwgPSBwb2ludGVyOworCQkJCSpwb2ludGVyID0gIGN1cl9kZXB0aDsKKwkJCX0gZWxzZSB7CisJCQkJaW50ICpwb2ludGVyID0gcC0+aXRlbS0+dXRpbDsKKwkJCQlpZiAoY3VyX2RlcHRoID49ICpwb2ludGVyKQorCQkJCQljb250aW51ZTsKKwkJCQkqcG9pbnRlciA9IGN1cl9kZXB0aDsKKwkJCX0KKwkJCWlmIChjdXJfZGVwdGggPCBkZXB0aCkgeworCQkJCWlmIChwLT5uZXh0KQorCQkJCQlhZGRfb2JqZWN0X2FycmF5KCZwLT5pdGVtLT5vYmplY3QsCisJCQkJCQkJTlVMTCwgJnN0YWNrKTsKKwkJCQllbHNlIHsKKwkJCQkJY29tbWl0ID0gcC0+aXRlbTsKKwkJCQkJY3VyX2RlcHRoID0gKihpbnQgKiljb21taXQtPnV0aWw7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQljb21taXRfbGlzdF9pbnNlcnQocC0+aXRlbSwgJnJlc3VsdCk7CisJCQkJcC0+aXRlbS0+b2JqZWN0LmZsYWdzIHw9IHNoYWxsb3dfZmxhZzsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9zaGVsbC5jIGIvc2hlbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODI2MTA5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwuYwpAQCAtMCwwICsxLDgwIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisjaW5jbHVkZSAic3RyYnVmLmgiCisKK3N0YXRpYyBpbnQgZG9fZ2VuZXJpY19jbWQoY29uc3QgY2hhciAqbWUsIGNoYXIgKmFyZykKK3sKKwljb25zdCBjaGFyICpteV9hcmd2WzRdOworCisJaWYgKCFhcmcgfHwgIShhcmcgPSBzcV9kZXF1b3RlKGFyZykpKQorCQlkaWUoImJhZCBhcmd1bWVudCIpOworCWlmIChwcmVmaXhjbXAobWUsICJnaXQtIikpCisJCWRpZSgiYmFkIGNvbW1hbmQiKTsKKworCW15X2FyZ3ZbMF0gPSBtZSArIDQ7CisJbXlfYXJndlsxXSA9IGFyZzsKKwlteV9hcmd2WzJdID0gTlVMTDsKKworCXJldHVybiBleGVjdl9naXRfY21kKG15X2FyZ3YpOworfQorCitzdGF0aWMgaW50IGRvX2N2c19jbWQoY29uc3QgY2hhciAqbWUsIGNoYXIgKmFyZykKK3sKKwljb25zdCBjaGFyICpjdnNzZXJ2ZXJfYXJndlszXSA9IHsKKwkJImN2c3NlcnZlciIsICJzZXJ2ZXIiLCBOVUxMCisJfTsKKworCWlmICghYXJnIHx8IHN0cmNtcChhcmcsICJzZXJ2ZXIiKSkKKwkJZGllKCJnaXQtY3Zzc2VydmVyIG9ubHkgaGFuZGxlcyBzZXJ2ZXI6ICVzIiwgYXJnKTsKKworCXNldHVwX3BhdGgoTlVMTCk7CisKKwlyZXR1cm4gZXhlY3ZfZ2l0X2NtZChjdnNzZXJ2ZXJfYXJndik7Cit9CisKKworc3RhdGljIHN0cnVjdCBjb21tYW5kcyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCpleGVjKShjb25zdCBjaGFyICptZSwgY2hhciAqYXJnKTsKK30gY21kX2xpc3RbXSA9IHsKKwl7ICJnaXQtcmVjZWl2ZS1wYWNrIiwgZG9fZ2VuZXJpY19jbWQgfSwKKwl7ICJnaXQtdXBsb2FkLXBhY2siLCBkb19nZW5lcmljX2NtZCB9LAorCXsgImN2cyIsIGRvX2N2c19jbWQgfSwKKwl7IE5VTEwgfSwKK307CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpwcm9nOworCXN0cnVjdCBjb21tYW5kcyAqY21kOworCisJaWYgKGFyZ2MgPT0gMiAmJiAhc3RyY21wKGFyZ3ZbMV0sICJjdnMgc2VydmVyIikpCisJCWFyZ3YtLTsKKwkvKiBXZSB3YW50IHRvIHNlZSAiLWMgY21kIGFyZ3MiLCBhbmQgbm90aGluZyBlbHNlICovCisJZWxzZSBpZiAoYXJnYyAhPSAzIHx8IHN0cmNtcChhcmd2WzFdLCAiLWMiKSkKKwkJZGllKCJXaGF0IGRvIHlvdSB0aGluayBJIGFtPyBBIHNoZWxsPyIpOworCisJcHJvZyA9IGFyZ3ZbMl07CisJYXJndiArPSAyOworCWFyZ2MgLT0gMjsKKwlmb3IgKGNtZCA9IGNtZF9saXN0IDsgY21kLT5uYW1lIDsgY21kKyspIHsKKwkJaW50IGxlbiA9IHN0cmxlbihjbWQtPm5hbWUpOworCQljaGFyICphcmc7CisJCWlmIChzdHJuY21wKGNtZC0+bmFtZSwgcHJvZywgbGVuKSkKKwkJCWNvbnRpbnVlOworCQlhcmcgPSBOVUxMOworCQlzd2l0Y2ggKHByb2dbbGVuXSkgeworCQljYXNlICdcMCc6CisJCQlhcmcgPSBOVUxMOworCQkJYnJlYWs7CisJCWNhc2UgJyAnOgorCQkJYXJnID0gcHJvZyArIGxlbiArIDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQl9CisJCWV4aXQoY21kLT5leGVjKGNtZC0+bmFtZSwgYXJnKSk7CisJfQorCWRpZSgidW5yZWNvZ25pemVkIGNvbW1hbmQgJyVzJyIsIHByb2cpOworfQpkaWZmIC0tZ2l0IGEvc2hvcnRsb2cuaCBiL3Nob3J0bG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFmZjQ5MQotLS0gL2Rldi9udWxsCisrKyBiL3Nob3J0bG9nLmgKQEAgLTAsMCArMSwyNiBAQAorI2lmbmRlZiBTSE9SVExPR19ICisjZGVmaW5lIFNIT1JUTE9HX0gKKworI2luY2x1ZGUgInBhdGgtbGlzdC5oIgorCitzdHJ1Y3Qgc2hvcnRsb2cgeworCXN0cnVjdCBwYXRoX2xpc3QgbGlzdDsKKwlpbnQgc3VtbWFyeTsKKwlpbnQgd3JhcF9saW5lczsKKwlpbnQgc29ydF9ieV9udW1iZXI7CisJaW50IHdyYXA7CisJaW50IGluMTsKKwlpbnQgaW4yOworCisJY2hhciAqY29tbW9uX3JlcG9fcHJlZml4OworCWludCBlbWFpbDsKKwlzdHJ1Y3QgcGF0aF9saXN0IG1haWxtYXA7Cit9OworCit2b2lkIHNob3J0bG9nX2luaXQoc3RydWN0IHNob3J0bG9nICpsb2cpOworCit2b2lkIHNob3J0bG9nX2FkZF9jb21taXQoc3RydWN0IHNob3J0bG9nICpsb2csIHN0cnVjdCBjb21taXQgKmNvbW1pdCk7CisKK3ZvaWQgc2hvcnRsb2dfb3V0cHV0KHN0cnVjdCBzaG9ydGxvZyAqbG9nKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zaG93LWluZGV4LmMgYi9zaG93LWluZGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI1Mzk5MQotLS0gL2Rldi9udWxsCisrKyBiL3Nob3ctaW5kZXguYwpAQCAtMCwwICsxLDc4IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJwYWNrLmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBucjsKKwl1bnNpZ25lZCBpbnQgdmVyc2lvbjsKKwlzdGF0aWMgdW5zaWduZWQgaW50IHRvcF9pbmRleFsyNTZdOworCisJaWYgKGZyZWFkKHRvcF9pbmRleCwgMiAqIDQsIDEsIHN0ZGluKSAhPSAxKQorCQlkaWUoInVuYWJsZSB0byByZWFkIGhlYWRlciIpOworCWlmICh0b3BfaW5kZXhbMF0gPT0gaHRvbmwoUEFDS19JRFhfU0lHTkFUVVJFKSkgeworCQl2ZXJzaW9uID0gbnRvaGwodG9wX2luZGV4WzFdKTsKKwkJaWYgKHZlcnNpb24gPCAyIHx8IHZlcnNpb24gPiAyKQorCQkJZGllKCJ1bmtub3duIGluZGV4IHZlcnNpb24iKTsKKwkJaWYgKGZyZWFkKHRvcF9pbmRleCwgMjU2ICogNCwgMSwgc3RkaW4pICE9IDEpCisJCQlkaWUoInVuYWJsZSB0byByZWFkIGluZGV4Iik7CisJfSBlbHNlIHsKKwkJdmVyc2lvbiA9IDE7CisJCWlmIChmcmVhZCgmdG9wX2luZGV4WzJdLCAyNTQgKiA0LCAxLCBzdGRpbikgIT0gMSkKKwkJCWRpZSgidW5hYmxlIHRvIHJlYWQgaW5kZXgiKTsKKwl9CisJbnIgPSAwOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQl1bnNpZ25lZCBuID0gbnRvaGwodG9wX2luZGV4W2ldKTsKKwkJaWYgKG4gPCBucikKKwkJCWRpZSgiY29ycnVwdCBpbmRleCBmaWxlIik7CisJCW5yID0gbjsKKwl9CisJaWYgKHZlcnNpb24gPT0gMSkgeworCQlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworCQkJdW5zaWduZWQgaW50IG9mZnNldCwgZW50cnlbNl07CisKKwkJCWlmIChmcmVhZChlbnRyeSwgNCArIDIwLCAxLCBzdGRpbikgIT0gMSkKKwkJCQlkaWUoInVuYWJsZSB0byByZWFkIGVudHJ5ICV1LyV1IiwgaSwgbnIpOworCQkJb2Zmc2V0ID0gbnRvaGwoZW50cnlbMF0pOworCQkJcHJpbnRmKCIldSAlc1xuIiwgb2Zmc2V0LCBzaGExX3RvX2hleCgodm9pZCAqKShlbnRyeSsxKSkpOworCQl9CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgb2ZmNjRfbnIgPSAwOworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJCXVpbnQzMl90IGNyYzsKKwkJCXVpbnQzMl90IG9mZjsKKwkJfSAqZW50cmllcyA9IHhtYWxsb2MobnIgKiBzaXplb2YoZW50cmllc1swXSkpOworCQlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykKKwkJCWlmIChmcmVhZChlbnRyaWVzW2ldLnNoYTEsIDIwLCAxLCBzdGRpbikgIT0gMSkKKwkJCQlkaWUoInVuYWJsZSB0byByZWFkIHNoYTEgJXUvJXUiLCBpLCBucik7CisJCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKQorCQkJaWYgKGZyZWFkKCZlbnRyaWVzW2ldLmNyYywgNCwgMSwgc3RkaW4pICE9IDEpCisJCQkJZGllKCJ1bmFibGUgdG8gcmVhZCBjcmMgJXUvJXUiLCBpLCBucik7CisJCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKQorCQkJaWYgKGZyZWFkKCZlbnRyaWVzW2ldLm9mZiwgNCwgMSwgc3RkaW4pICE9IDEpCisJCQkJZGllKCJ1bmFibGUgdG8gcmVhZCAzMmIgb2Zmc2V0ICV1LyV1IiwgaSwgbnIpOworCQlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworCQkJdWludDY0X3Qgb2Zmc2V0OworCQkJdWludDMyX3Qgb2ZmID0gbnRvaGwoZW50cmllc1tpXS5vZmYpOworCQkJaWYgKCEob2ZmICYgMHg4MDAwMDAwMCkpIHsKKwkJCQlvZmZzZXQgPSBvZmY7CisJCQl9IGVsc2UgeworCQkJCXVpbnQzMl90IG9mZjY0WzJdOworCQkJCWlmICgob2ZmICYgMHg3ZmZmZmZmZikgIT0gb2ZmNjRfbnIpCisJCQkJCWRpZSgiaW5jb25zaXN0ZW50IDY0YiBvZmZzZXQgaW5kZXgiKTsKKwkJCQlpZiAoZnJlYWQob2ZmNjQsIDgsIDEsIHN0ZGluKSAhPSAxKQorCQkJCQlkaWUoInVuYWJsZSB0byByZWFkIDY0YiBvZmZzZXQgJXUiLCBvZmY2NF9ucik7CisJCQkJb2Zmc2V0ID0gKCgodWludDY0X3QpbnRvaGwob2ZmNjRbMF0pKSA8PCAzMikgfAorCQkJCQkJICAgICBudG9obChvZmY2NFsxXSk7CisJCQkJb2ZmNjRfbnIrKzsKKwkJCX0KKwkJCXByaW50ZigiJSIgUFJJdU1BWCAiICVzICglMDh4KVxuIiwgKHVpbnRtYXhfdCkgb2Zmc2V0LAorCQkJICAgICAgIHNoYTFfdG9faGV4KGVudHJpZXNbaV0uc2hhMSksCisJCQkgICAgICAgbnRvaGwoZW50cmllc1tpXS5jcmMpKTsKKwkJfQorCQlmcmVlKGVudHJpZXMpOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NpZGViYW5kLmMgYi9zaWRlYmFuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2Nzc3ODEKLS0tIC9kZXYvbnVsbAorKysgYi9zaWRlYmFuZC5jCkBAIC0wLDAgKzEsMTI5IEBACisjaW5jbHVkZSAicGt0LWxpbmUuaCIKKyNpbmNsdWRlICJzaWRlYmFuZC5oIgorCisvKgorICogUmVjZWl2ZSBtdWx0aXBsZXhlZCBvdXRwdXQgc3RyZWFtIG92ZXIgZ2l0IG5hdGl2ZSBwcm90b2NvbC4KKyAqIGluX3N0cmVhbSBpcyB0aGUgaW5wdXQgc3RyZWFtIGZyb20gdGhlIHJlbW90ZSwgd2hpY2ggY2FycmllcyBkYXRhCisgKiBpbiBwa3RfbGluZSBmb3JtYXQgd2l0aCBiYW5kIGRlc2lnbmF0b3IuICBEZW11bHRpcGxleCBpdCBpbnRvIG91dAorICogYW5kIGVyciBhbmQgcmV0dXJuIGVycm9yIGFwcHJvcHJpYXRlbHkuICBCYW5kICMxIGNhcnJpZXMgdGhlCisgKiBwcmltYXJ5IHBheWxvYWQuICBUaGluZ3MgY29taW5nIG92ZXIgYmFuZCAjMiBpcyBub3QgbmVjZXNzYXJpbHkKKyAqIGVycm9yOyB0aGV5IGFyZSB1c3VhbGx5IGluZm9ybWF0aXZlIG1lc3NhZ2Ugb24gdGhlIHN0YW5kYXJkIGVycm9yCisgKiBzdHJlYW0sIGFrYSAidmVyYm9zZSIpLiAgQSBtZXNzYWdlIG92ZXIgYmFuZCAjMyBpcyBhIHNpZ25hbCB0aGF0CisgKiB0aGUgcmVtb3RlIGRpZWQgdW5leHBlY3RlZGx5LiAgQSBmbHVzaCgpIGNvbmNsdWRlcyB0aGUgc3RyZWFtLgorICovCisKKyNkZWZpbmUgUFJFRklYICJyZW1vdGU6IgorCisjZGVmaW5lIEFOU0lfU1VGRklYICJcMDMzW0siCisjZGVmaW5lIERVTUJfU1VGRklYICIgICAgICAgICIKKworI2RlZmluZSBGSVhfU0laRSAxMCAgLyogbGFyZ2UgZW5vdWdoIGZvciBhbnkgb2YgdGhlIGFib3ZlICovCisKK2ludCByZWN2X3NpZGViYW5kKGNvbnN0IGNoYXIgKm1lLCBpbnQgaW5fc3RyZWFtLCBpbnQgb3V0LCBpbnQgZXJyKQoreworCXVuc2lnbmVkIHBmID0gc3RybGVuKFBSRUZJWCk7CisJdW5zaWduZWQgc2Y7CisJY2hhciBidWZbTEFSR0VfUEFDS0VUX01BWCArIDIqRklYX1NJWkVdOworCWNoYXIgKnN1ZmZpeCwgKnRlcm07CisKKwltZW1jcHkoYnVmLCBQUkVGSVgsIHBmKTsKKwl0ZXJtID0gZ2V0ZW52KCJURVJNIik7CisJaWYgKHRlcm0gJiYgc3RyY21wKHRlcm0sICJkdW1iIikpCisJCXN1ZmZpeCA9IEFOU0lfU1VGRklYOworCWVsc2UKKwkJc3VmZml4ID0gRFVNQl9TVUZGSVg7CisJc2YgPSBzdHJsZW4oc3VmZml4KTsKKworCXdoaWxlICgxKSB7CisJCWludCBiYW5kLCBsZW47CisJCWxlbiA9IHBhY2tldF9yZWFkX2xpbmUoaW5fc3RyZWFtLCBidWYgKyBwZiwgTEFSR0VfUEFDS0VUX01BWCk7CisJCWlmIChsZW4gPT0gMCkKKwkJCWJyZWFrOworCQlpZiAobGVuIDwgMSkgeworCQkJbGVuID0gc3ByaW50ZihidWYsICIlczogcHJvdG9jb2wgZXJyb3I6IG5vIGJhbmQgZGVzaWduYXRvclxuIiwgbWUpOworCQkJc2FmZV93cml0ZShlcnIsIGJ1ZiwgbGVuKTsKKwkJCXJldHVybiBTSURFQkFORF9QUk9UT0NPTF9FUlJPUjsKKwkJfQorCQliYW5kID0gYnVmW3BmXSAmIDB4ZmY7CisJCWxlbi0tOworCQlzd2l0Y2ggKGJhbmQpIHsKKwkJY2FzZSAzOgorCQkJYnVmW3BmXSA9ICcgJzsKKwkJCWJ1ZltwZisxK2xlbl0gPSAnXG4nOworCQkJc2FmZV93cml0ZShlcnIsIGJ1ZiwgcGYrMStsZW4rMSk7CisJCQlyZXR1cm4gU0lERUJBTkRfUkVNT1RFX0VSUk9SOworCQljYXNlIDI6CisJCQlidWZbcGZdID0gJyAnOworCQkJbGVuICs9IHBmKzE7CisJCQl3aGlsZSAoMSkgeworCQkJCWludCBicmsgPSBwZisxOworCisJCQkJLyogQnJlYWsgdGhlIGJ1ZmZlciBpbnRvIHNlcGFyYXRlIGxpbmVzLiAqLworCQkJCXdoaWxlIChicmsgPCBsZW4pIHsKKwkJCQkJYnJrKys7CisJCQkJCWlmIChidWZbYnJrLTFdID09ICdcbicgfHwKKwkJCQkJICAgIGJ1ZlticmstMV0gPT0gJ1xyJykKKwkJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qCisJCQkJICogTGV0J3MgaW5zZXJ0IGEgc3VmZml4IHRvIGNsZWFyIHRoZSBlbmQKKwkJCQkgKiBvZiB0aGUgc2NyZWVuIGxpbmUsIGJ1dCBvbmx5IGlmIGN1cnJlbnQKKwkJCQkgKiBsaW5lIGRhdGEgYWN0dWFsbHkgY29udGFpbnMgc29tZXRoaW5nLgorCQkJCSAqLworCQkJCWlmIChicmsgPiBwZisxICsgMSkgeworCQkJCQljaGFyIHNhdmVbRklYX1NJWkVdOworCQkJCQltZW1jcHkoc2F2ZSwgYnVmICsgYnJrLCBzZik7CisJCQkJCWJ1ZlticmsgKyBzZiAtIDFdID0gYnVmW2JyayAtIDFdOworCQkJCQltZW1jcHkoYnVmICsgYnJrIC0gMSwgc3VmZml4LCBzZik7CisJCQkJCXNhZmVfd3JpdGUoZXJyLCBidWYsIGJyayArIHNmKTsKKwkJCQkJbWVtY3B5KGJ1ZiArIGJyaywgc2F2ZSwgc2YpOworCQkJCX0gZWxzZQorCQkJCQlzYWZlX3dyaXRlKGVyciwgYnVmLCBicmspOworCisJCQkJaWYgKGJyayA8IGxlbikgeworCQkJCQltZW1tb3ZlKGJ1ZiArIHBmKzEsIGJ1ZiArIGJyaywgbGVuIC0gYnJrKTsKKwkJCQkJbGVuID0gbGVuIC0gYnJrICsgcGYrMTsKKwkJCQl9IGVsc2UKKwkJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJY2FzZSAxOgorCQkJc2FmZV93cml0ZShvdXQsIGJ1ZiArIHBmKzEsIGxlbik7CisJCQljb250aW51ZTsKKwkJZGVmYXVsdDoKKwkJCWxlbiA9IHNwcmludGYoYnVmLAorCQkJCSAgICAgICIlczogcHJvdG9jb2wgZXJyb3I6IGJhZCBiYW5kICMlZFxuIiwKKwkJCQkgICAgICBtZSwgYmFuZCk7CisJCQlzYWZlX3dyaXRlKGVyciwgYnVmLCBsZW4pOworCQkJcmV0dXJuIFNJREVCQU5EX1BST1RPQ09MX0VSUk9SOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKgorICogZmQgaXMgY29ubmVjdGVkIHRvIHRoZSByZW1vdGUgc2lkZTsgc2VuZCB0aGUgc2lkZWJhbmQgZGF0YQorICogb3ZlciBtdWx0aXBsZXhlZCBwYWNrZXQgc3RyZWFtLgorICovCitzc2l6ZV90IHNlbmRfc2lkZWJhbmQoaW50IGZkLCBpbnQgYmFuZCwgY29uc3QgY2hhciAqZGF0YSwgc3NpemVfdCBzeiwgaW50IHBhY2tldF9tYXgpCit7CisJc3NpemVfdCBzc3ogPSBzejsKKwljb25zdCBjaGFyICpwID0gZGF0YTsKKworCXdoaWxlIChzeikgeworCQl1bnNpZ25lZCBuOworCQljaGFyIGhkcls1XTsKKworCQluID0gc3o7CisJCWlmIChwYWNrZXRfbWF4IC0gNSA8IG4pCisJCQluID0gcGFja2V0X21heCAtIDU7CisJCXNwcmludGYoaGRyLCAiJTA0eCIsIG4gKyA1KTsKKwkJaGRyWzRdID0gYmFuZDsKKwkJc2FmZV93cml0ZShmZCwgaGRyLCA1KTsKKwkJc2FmZV93cml0ZShmZCwgcCwgbik7CisJCXAgKz0gbjsKKwkJc3ogLT0gbjsKKwl9CisJcmV0dXJuIHNzejsKK30KZGlmZiAtLWdpdCBhL3NpZGViYW5kLmggYi9zaWRlYmFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NGI2OTEKLS0tIC9kZXYvbnVsbAorKysgYi9zaWRlYmFuZC5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgU0lERUJBTkRfSAorI2RlZmluZSBTSURFQkFORF9ICisKKyNkZWZpbmUgU0lERUJBTkRfUFJPVE9DT0xfRVJST1IgLTIKKyNkZWZpbmUgU0lERUJBTkRfUkVNT1RFX0VSUk9SIC0xCisKKyNkZWZpbmUgREVGQVVMVF9QQUNLRVRfTUFYIDEwMDAKKyNkZWZpbmUgTEFSR0VfUEFDS0VUX01BWCA2NTUyMAorCitpbnQgcmVjdl9zaWRlYmFuZChjb25zdCBjaGFyICptZSwgaW50IGluX3N0cmVhbSwgaW50IG91dCwgaW50IGVycik7Citzc2l6ZV90IHNlbmRfc2lkZWJhbmQoaW50IGZkLCBpbnQgYmFuZCwgY29uc3QgY2hhciAqZGF0YSwgc3NpemVfdCBzeiwgaW50IHBhY2tldF9tYXgpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0cmJ1Zi5jIGIvc3RyYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFlZDc1MgotLS0gL2Rldi9udWxsCisrKyBiL3N0cmJ1Zi5jCkBAIC0wLDAgKzEsMjQwIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKworaW50IHByZWZpeGNtcChjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlmb3IgKDsgOyBzdHIrKywgcHJlZml4KyspCisJCWlmICghKnByZWZpeCkKKwkJCXJldHVybiAwOworCQllbHNlIGlmICgqc3RyICE9ICpwcmVmaXgpCisJCQlyZXR1cm4gKHVuc2lnbmVkIGNoYXIpKnByZWZpeCAtICh1bnNpZ25lZCBjaGFyKSpzdHI7Cit9CisKKy8qCisgKiBVc2VkIGFzIHRoZSBkZWZhdWx0IC0+YnVmIHZhbHVlLCBzbyB0aGF0IHBlb3BsZSBjYW4gYWx3YXlzIGFzc3VtZQorICogYnVmIGlzIG5vbiBOVUxMIGFuZCAtPmJ1ZiBpcyBOVUwgdGVybWluYXRlZCBldmVuIGZvciBhIGZyZXNobHkKKyAqIGluaXRpYWxpemVkIHN0cmJ1Zi4KKyAqLworY2hhciBzdHJidWZfc2xvcGJ1ZlsxXTsKKwordm9pZCBzdHJidWZfaW5pdChzdHJ1Y3Qgc3RyYnVmICpzYiwgc2l6ZV90IGhpbnQpCit7CisJc2ItPmFsbG9jID0gc2ItPmxlbiA9IDA7CisJc2ItPmJ1ZiA9IHN0cmJ1Zl9zbG9wYnVmOworCWlmIChoaW50KQorCQlzdHJidWZfZ3JvdyhzYiwgaGludCk7Cit9CisKK3ZvaWQgc3RyYnVmX3JlbGVhc2Uoc3RydWN0IHN0cmJ1ZiAqc2IpCit7CisJaWYgKHNiLT5hbGxvYykgeworCQlmcmVlKHNiLT5idWYpOworCQlzdHJidWZfaW5pdChzYiwgMCk7CisJfQorfQorCitjaGFyICpzdHJidWZfZGV0YWNoKHN0cnVjdCBzdHJidWYgKnNiLCBzaXplX3QgKnN6KQoreworCWNoYXIgKnJlcyA9IHNiLT5hbGxvYyA/IHNiLT5idWYgOiBOVUxMOworCWlmIChzeikKKwkJKnN6ID0gc2ItPmxlbjsKKwlzdHJidWZfaW5pdChzYiwgMCk7CisJcmV0dXJuIHJlczsKK30KKwordm9pZCBzdHJidWZfYXR0YWNoKHN0cnVjdCBzdHJidWYgKnNiLCB2b2lkICpidWYsIHNpemVfdCBsZW4sIHNpemVfdCBhbGxvYykKK3sKKwlzdHJidWZfcmVsZWFzZShzYik7CisJc2ItPmJ1ZiAgID0gYnVmOworCXNiLT5sZW4gICA9IGxlbjsKKwlzYi0+YWxsb2MgPSBhbGxvYzsKKwlzdHJidWZfZ3JvdyhzYiwgMCk7CisJc2ItPmJ1ZltzYi0+bGVuXSA9ICdcMCc7Cit9CisKK3ZvaWQgc3RyYnVmX2dyb3coc3RydWN0IHN0cmJ1ZiAqc2IsIHNpemVfdCBleHRyYSkKK3sKKwlpZiAoc2ItPmxlbiArIGV4dHJhICsgMSA8PSBzYi0+bGVuKQorCQlkaWUoInlvdSB3YW50IHRvIHVzZSB3YXkgdG9vIG11Y2ggbWVtb3J5Iik7CisJaWYgKCFzYi0+YWxsb2MpCisJCXNiLT5idWYgPSBOVUxMOworCUFMTE9DX0dST1coc2ItPmJ1Ziwgc2ItPmxlbiArIGV4dHJhICsgMSwgc2ItPmFsbG9jKTsKK30KKwordm9pZCBzdHJidWZfcnRyaW0oc3RydWN0IHN0cmJ1ZiAqc2IpCit7CisJd2hpbGUgKHNiLT5sZW4gPiAwICYmIGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpc2ItPmJ1ZltzYi0+bGVuIC0gMV0pKQorCQlzYi0+bGVuLS07CisJc2ItPmJ1ZltzYi0+bGVuXSA9ICdcMCc7Cit9CisKK2ludCBzdHJidWZfY21wKHN0cnVjdCBzdHJidWYgKmEsIHN0cnVjdCBzdHJidWYgKmIpCit7CisJaW50IGNtcDsKKwlpZiAoYS0+bGVuIDwgYi0+bGVuKSB7CisJCWNtcCA9IG1lbWNtcChhLT5idWYsIGItPmJ1ZiwgYS0+bGVuKTsKKwkJcmV0dXJuIGNtcCA/IGNtcCA6IC0xOworCX0gZWxzZSB7CisJCWNtcCA9IG1lbWNtcChhLT5idWYsIGItPmJ1ZiwgYi0+bGVuKTsKKwkJcmV0dXJuIGNtcCA/IGNtcCA6IGEtPmxlbiAhPSBiLT5sZW47CisJfQorfQorCit2b2lkIHN0cmJ1Zl9zcGxpY2Uoc3RydWN0IHN0cmJ1ZiAqc2IsIHNpemVfdCBwb3MsIHNpemVfdCBsZW4sCisJCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRsZW4pCit7CisJaWYgKHBvcyArIGxlbiA8IHBvcykKKwkJZGllKCJ5b3Ugd2FudCB0byB1c2Ugd2F5IHRvbyBtdWNoIG1lbW9yeSIpOworCWlmIChwb3MgPiBzYi0+bGVuKQorCQlkaWUoImBwb3MnIGlzIHRvbyBmYXIgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIik7CisJaWYgKHBvcyArIGxlbiA+IHNiLT5sZW4pCisJCWRpZSgiYHBvcyArIGxlbicgaXMgdG9vIGZhciBhZnRlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIiKTsKKworCWlmIChkbGVuID49IGxlbikKKwkJc3RyYnVmX2dyb3coc2IsIGRsZW4gLSBsZW4pOworCW1lbW1vdmUoc2ItPmJ1ZiArIHBvcyArIGRsZW4sCisJCQlzYi0+YnVmICsgcG9zICsgbGVuLAorCQkJc2ItPmxlbiAtIHBvcyAtIGxlbik7CisJbWVtY3B5KHNiLT5idWYgKyBwb3MsIGRhdGEsIGRsZW4pOworCXN0cmJ1Zl9zZXRsZW4oc2IsIHNiLT5sZW4gKyBkbGVuIC0gbGVuKTsKK30KKwordm9pZCBzdHJidWZfaW5zZXJ0KHN0cnVjdCBzdHJidWYgKnNiLCBzaXplX3QgcG9zLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQoreworCXN0cmJ1Zl9zcGxpY2Uoc2IsIHBvcywgMCwgZGF0YSwgbGVuKTsKK30KKwordm9pZCBzdHJidWZfcmVtb3ZlKHN0cnVjdCBzdHJidWYgKnNiLCBzaXplX3QgcG9zLCBzaXplX3QgbGVuKQoreworCXN0cmJ1Zl9zcGxpY2Uoc2IsIHBvcywgbGVuLCBOVUxMLCAwKTsKK30KKwordm9pZCBzdHJidWZfYWRkKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQoreworCXN0cmJ1Zl9ncm93KHNiLCBsZW4pOworCW1lbWNweShzYi0+YnVmICsgc2ItPmxlbiwgZGF0YSwgbGVuKTsKKwlzdHJidWZfc2V0bGVuKHNiLCBzYi0+bGVuICsgbGVuKTsKK30KKwordm9pZCBzdHJidWZfYWRkZHVwKHN0cnVjdCBzdHJidWYgKnNiLCBzaXplX3QgcG9zLCBzaXplX3QgbGVuKQoreworCXN0cmJ1Zl9ncm93KHNiLCBsZW4pOworCW1lbWNweShzYi0+YnVmICsgc2ItPmxlbiwgc2ItPmJ1ZiArIHBvcywgbGVuKTsKKwlzdHJidWZfc2V0bGVuKHNiLCBzYi0+bGVuICsgbGVuKTsKK30KKwordm9pZCBzdHJidWZfYWRkZihzdHJ1Y3Qgc3RyYnVmICpzYiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJaW50IGxlbjsKKwl2YV9saXN0IGFwOworCisJaWYgKCFzdHJidWZfYXZhaWwoc2IpKQorCQlzdHJidWZfZ3JvdyhzYiwgNjQpOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCWxlbiA9IHZzbnByaW50ZihzYi0+YnVmICsgc2ItPmxlbiwgc2ItPmFsbG9jIC0gc2ItPmxlbiwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlpZiAobGVuIDwgMCkKKwkJZGllKCJ5b3VyIHZzbnByaW50ZiBpcyBicm9rZW4iKTsKKwlpZiAobGVuID4gc3RyYnVmX2F2YWlsKHNiKSkgeworCQlzdHJidWZfZ3JvdyhzYiwgbGVuKTsKKwkJdmFfc3RhcnQoYXAsIGZtdCk7CisJCWxlbiA9IHZzbnByaW50ZihzYi0+YnVmICsgc2ItPmxlbiwgc2ItPmFsbG9jIC0gc2ItPmxlbiwgZm10LCBhcCk7CisJCXZhX2VuZChhcCk7CisJCWlmIChsZW4gPiBzdHJidWZfYXZhaWwoc2IpKSB7CisJCQlkaWUoInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIHlvdXIgc25wcmludGYgaXMgYnJva2VuIik7CisJCX0KKwl9CisJc3RyYnVmX3NldGxlbihzYiwgc2ItPmxlbiArIGxlbik7Cit9CisKK3ZvaWQgc3RyYnVmX2V4cGFuZChzdHJ1Y3Qgc3RyYnVmICpzYiwgY29uc3QgY2hhciAqZm9ybWF0LCBleHBhbmRfZm5fdCBmbiwKKwkJICAgdm9pZCAqY29udGV4dCkKK3sKKwlmb3IgKDs7KSB7CisJCWNvbnN0IGNoYXIgKnBlcmNlbnQ7CisJCXNpemVfdCBjb25zdW1lZDsKKworCQlwZXJjZW50ID0gc3RyY2hybnVsKGZvcm1hdCwgJyUnKTsKKwkJc3RyYnVmX2FkZChzYiwgZm9ybWF0LCBwZXJjZW50IC0gZm9ybWF0KTsKKwkJaWYgKCEqcGVyY2VudCkKKwkJCWJyZWFrOworCQlmb3JtYXQgPSBwZXJjZW50ICsgMTsKKworCQljb25zdW1lZCA9IGZuKHNiLCBmb3JtYXQsIGNvbnRleHQpOworCQlpZiAoY29uc3VtZWQpCisJCQlmb3JtYXQgKz0gY29uc3VtZWQ7CisJCWVsc2UKKwkJCXN0cmJ1Zl9hZGRjaChzYiwgJyUnKTsKKwl9Cit9CisKK3NpemVfdCBzdHJidWZfZnJlYWQoc3RydWN0IHN0cmJ1ZiAqc2IsIHNpemVfdCBzaXplLCBGSUxFICpmKQoreworCXNpemVfdCByZXM7CisKKwlzdHJidWZfZ3JvdyhzYiwgc2l6ZSk7CisJcmVzID0gZnJlYWQoc2ItPmJ1ZiArIHNiLT5sZW4sIDEsIHNpemUsIGYpOworCWlmIChyZXMgPiAwKSB7CisJCXN0cmJ1Zl9zZXRsZW4oc2IsIHNiLT5sZW4gKyByZXMpOworCX0KKwlyZXR1cm4gcmVzOworfQorCitzc2l6ZV90IHN0cmJ1Zl9yZWFkKHN0cnVjdCBzdHJidWYgKnNiLCBpbnQgZmQsIHNpemVfdCBoaW50KQoreworCXNpemVfdCBvbGRsZW4gPSBzYi0+bGVuOworCisJc3RyYnVmX2dyb3coc2IsIGhpbnQgPyBoaW50IDogODE5Mik7CisJZm9yICg7OykgeworCQlzc2l6ZV90IGNudDsKKworCQljbnQgPSB4cmVhZChmZCwgc2ItPmJ1ZiArIHNiLT5sZW4sIHNiLT5hbGxvYyAtIHNiLT5sZW4gLSAxKTsKKwkJaWYgKGNudCA8IDApIHsKKwkJCXN0cmJ1Zl9zZXRsZW4oc2IsIG9sZGxlbik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKCFjbnQpCisJCQlicmVhazsKKwkJc2ItPmxlbiArPSBjbnQ7CisJCXN0cmJ1Zl9ncm93KHNiLCA4MTkyKTsKKwl9CisKKwlzYi0+YnVmW3NiLT5sZW5dID0gJ1wwJzsKKwlyZXR1cm4gc2ItPmxlbiAtIG9sZGxlbjsKK30KKworaW50IHN0cmJ1Zl9nZXRsaW5lKHN0cnVjdCBzdHJidWYgKnNiLCBGSUxFICpmcCwgaW50IHRlcm0pCit7CisJaW50IGNoOworCisJc3RyYnVmX2dyb3coc2IsIDApOworCWlmIChmZW9mKGZwKSkKKwkJcmV0dXJuIEVPRjsKKworCXN0cmJ1Zl9yZXNldChzYik7CisJd2hpbGUgKChjaCA9IGZnZXRjKGZwKSkgIT0gRU9GKSB7CisJCWlmIChjaCA9PSB0ZXJtKQorCQkJYnJlYWs7CisJCXN0cmJ1Zl9ncm93KHNiLCAxKTsKKwkJc2ItPmJ1ZltzYi0+bGVuKytdID0gY2g7CisJfQorCWlmIChjaCA9PSBFT0YgJiYgc2ItPmxlbiA9PSAwKQorCQlyZXR1cm4gRU9GOworCisJc2ItPmJ1ZltzYi0+bGVuXSA9ICdcMCc7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzdHJidWZfcmVhZF9maWxlKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFyICpwYXRoLCBzaXplX3QgaGludCkKK3sKKwlpbnQgZmQsIGxlbjsKKworCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCWxlbiA9IHN0cmJ1Zl9yZWFkKHNiLCBmZCwgaGludCk7CisJY2xvc2UoZmQpOworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gbGVuOworfQpkaWZmIC0tZ2l0IGEvc3RyYnVmLmggYi9zdHJidWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWVjMjI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3RyYnVmLmgKQEAgLTAsMCArMSwxMjIgQEAKKyNpZm5kZWYgU1RSQlVGX0gKKyNkZWZpbmUgU1RSQlVGX0gKKworLyoKKyAqIFN0cmJ1ZidzIGNhbiBiZSB1c2UgaW4gbWFueSB3YXlzOiBhcyBhIGJ5dGUgYXJyYXksIG9yIHRvIHN0b3JlIGFyYml0cmFyeQorICogbG9uZywgb3ZlcmZsb3cgc2FmZSBzdHJpbmdzLgorICoKKyAqIFN0cmJ1ZnMgaGFzIHNvbWUgaW52YXJpYW50cyB0aGF0IGFyZSB2ZXJ5IGltcG9ydGFudCB0byBrZWVwIGluIG1pbmQ6CisgKgorICogMS4gdGhlIC0+YnVmIG1lbWJlciBpcyBhbHdheXMgbWFsbG9jLWVkLCBoZW5jZSBzdHJidWYncyBjYW4gYmUgdXNlZCB0bworICogICAgYnVpbGQgY29tcGxleCBzdHJpbmdzL2J1ZmZlcnMgd2hvc2UgZmluYWwgc2l6ZSBpc24ndCBlYXNpbHkga25vd24uCisgKgorICogICAgSXQgaXMgTk9UIGxlZ2FsIHRvIGNvcHkgdGhlIC0+YnVmIHBvaW50ZXIgYXdheS4KKyAqICAgIGBzdHJidWZfZGV0YWNoJyBpcyB0aGUgb3BlcmF0aW9uIHRoYXQgZGV0YWNocyBhIGJ1ZmZlciBmcm9tIGl0cyBzaGVsbAorICogICAgd2hpbGUga2VlcGluZyB0aGUgc2hlbGwgdmFsaWQgd3J0IGl0cyBpbnZhcmlhbnRzLgorICoKKyAqIDIuIHRoZSAtPmJ1ZiBtZW1iZXIgaXMgYSBieXRlIGFycmF5IHRoYXQgaGFzIGF0IGxlYXN0IC0+bGVuICsgMSBieXRlcworICogICAgYWxsb2NhdGVkLiBUaGUgZXh0cmEgYnl0ZSBpcyB1c2VkIHRvIHN0b3JlIGEgJ1wwJywgYWxsb3dpbmcgdGhlIC0+YnVmCisgKiAgICBtZW1iZXIgdG8gYmUgYSB2YWxpZCBDLXN0cmluZy4gRXZlcnkgc3RyYnVmIGZ1bmN0aW9uIGVuc3VyZSB0aGlzCisgKiAgICBpbnZhcmlhbnQgaXMgcHJlc2VydmVkLgorICoKKyAqICAgIE5vdGUgdGhhdCBpdCBpcyBPSyB0byAicGxheSIgd2l0aCB0aGUgYnVmZmVyIGRpcmVjdGx5IGlmIHlvdSB3b3JrIGl0CisgKiAgICB0aGF0IHdheToKKyAqCisgKiAgICBzdHJidWZfZ3JvdyhzYiwgU09NRV9TSVpFKTsKKyAqICAgICAgIC4uLiBIZXJlLCB0aGUgbWVtb3J5IGFycmF5IHN0YXJ0aW5nIGF0IHNiLT5idWYsIGFuZCBvZiBsZW5ndGgKKyAqICAgICAgIC4uLiBzdHJidWZfYXZhaWwoc2IpIGlzIGFsbCB5b3VycywgYW5kIHlvdSBhcmUgc3VyZSB0aGF0CisgKiAgICAgICAuLi4gc3RyYnVmX2F2YWlsKHNiKSBpcyBhdCBsZWFzdCBTT01FX1NJWkUuCisgKiAgICBzdHJidWZfc2V0bGVuKHNiLCBzYi0+bGVuICsgU09NRV9PVEhFUl9TSVpFKTsKKyAqCisgKiAgICBPZiBjb3Vyc2UsIFNPTUVfT1RIRVJfU0laRSBtdXN0IGJlIHNtYWxsZXIgb3IgZXF1YWwgdG8gc3RyYnVmX2F2YWlsKHNiKS4KKyAqCisgKiAgICBEb2luZyBzbyBpcyBzYWZlLCB0aG91Z2ggaWYgaXQgaGFzIHRvIGJlIGRvbmUgaW4gbWFueSBwbGFjZXMsIGFkZGluZyB0aGUKKyAqICAgIG1pc3NpbmcgQVBJIHRvIHRoZSBzdHJidWYgbW9kdWxlIGlzIHRoZSB3YXkgdG8gZ28uCisgKgorICogICAgWFhYOiBkbyBfbm90XyBhc3N1bWUgdGhhdCB0aGUgYXJlYSB0aGF0IGlzIHlvdXJzIGlzIG9mIHNpemUgLT5hbGxvYyAtIDEKKyAqICAgICAgICAgZXZlbiBpZiBpdCdzIHRydWUgaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uIEFsbG9jIGlzIHNvbWVob3cgYQorICogICAgICAgICAicHJpdmF0ZSIgbWVtYmVyIHRoYXQgc2hvdWxkIG5vdCBiZSBtZXNzZWQgd2l0aC4KKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK2V4dGVybiBjaGFyIHN0cmJ1Zl9zbG9wYnVmW107CitzdHJ1Y3Qgc3RyYnVmIHsKKwlzaXplX3QgYWxsb2M7CisJc2l6ZV90IGxlbjsKKwljaGFyICpidWY7Cit9OworCisjZGVmaW5lIFNUUkJVRl9JTklUICB7IDAsIDAsIHN0cmJ1Zl9zbG9wYnVmIH0KKworLyotLS0tLSBzdHJidWYgbGlmZSBjeWNsZSAtLS0tLSovCitleHRlcm4gdm9pZCBzdHJidWZfaW5pdChzdHJ1Y3Qgc3RyYnVmICosIHNpemVfdCk7CitleHRlcm4gdm9pZCBzdHJidWZfcmVsZWFzZShzdHJ1Y3Qgc3RyYnVmICopOworZXh0ZXJuIGNoYXIgKnN0cmJ1Zl9kZXRhY2goc3RydWN0IHN0cmJ1ZiAqLCBzaXplX3QgKik7CitleHRlcm4gdm9pZCBzdHJidWZfYXR0YWNoKHN0cnVjdCBzdHJidWYgKiwgdm9pZCAqLCBzaXplX3QsIHNpemVfdCk7CitzdGF0aWMgaW5saW5lIHZvaWQgc3RyYnVmX3N3YXAoc3RydWN0IHN0cmJ1ZiAqYSwgc3RydWN0IHN0cmJ1ZiAqYikgeworCXN0cnVjdCBzdHJidWYgdG1wID0gKmE7CisJKmEgPSAqYjsKKwkqYiA9IHRtcDsKK30KKworLyotLS0tLSBzdHJidWYgc2l6ZSByZWxhdGVkIC0tLS0tKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90IHN0cmJ1Zl9hdmFpbChzdHJ1Y3Qgc3RyYnVmICpzYikgeworCXJldHVybiBzYi0+YWxsb2MgPyBzYi0+YWxsb2MgLSBzYi0+bGVuIC0gMSA6IDA7Cit9CisKK2V4dGVybiB2b2lkIHN0cmJ1Zl9ncm93KHN0cnVjdCBzdHJidWYgKiwgc2l6ZV90KTsKKworc3RhdGljIGlubGluZSB2b2lkIHN0cmJ1Zl9zZXRsZW4oc3RydWN0IHN0cmJ1ZiAqc2IsIHNpemVfdCBsZW4pIHsKKwlpZiAoIXNiLT5hbGxvYykKKwkJc3RyYnVmX2dyb3coc2IsIDApOworCWFzc2VydChsZW4gPCBzYi0+YWxsb2MpOworCXNiLT5sZW4gPSBsZW47CisJc2ItPmJ1ZltsZW5dID0gJ1wwJzsKK30KKyNkZWZpbmUgc3RyYnVmX3Jlc2V0KHNiKSAgc3RyYnVmX3NldGxlbihzYiwgMCkKKworLyotLS0tLSBjb250ZW50IHJlbGF0ZWQgLS0tLS0qLworZXh0ZXJuIHZvaWQgc3RyYnVmX3J0cmltKHN0cnVjdCBzdHJidWYgKik7CitleHRlcm4gaW50IHN0cmJ1Zl9jbXAoc3RydWN0IHN0cmJ1ZiAqLCBzdHJ1Y3Qgc3RyYnVmICopOworCisvKi0tLS0tIGFkZCBkYXRhIGluIHlvdXIgYnVmZmVyIC0tLS0tKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzdHJidWZfYWRkY2goc3RydWN0IHN0cmJ1ZiAqc2IsIGludCBjKSB7CisJc3RyYnVmX2dyb3coc2IsIDEpOworCXNiLT5idWZbc2ItPmxlbisrXSA9IGM7CisJc2ItPmJ1ZltzYi0+bGVuXSA9ICdcMCc7Cit9CisKK2V4dGVybiB2b2lkIHN0cmJ1Zl9pbnNlcnQoc3RydWN0IHN0cmJ1ZiAqLCBzaXplX3QgcG9zLCBjb25zdCB2b2lkICosIHNpemVfdCk7CitleHRlcm4gdm9pZCBzdHJidWZfcmVtb3ZlKHN0cnVjdCBzdHJidWYgKiwgc2l6ZV90IHBvcywgc2l6ZV90IGxlbik7CisKKy8qIHNwbGljZSBwb3MuLnBvcytsZW4gd2l0aCBnaXZlbiBkYXRhICovCitleHRlcm4gdm9pZCBzdHJidWZfc3BsaWNlKHN0cnVjdCBzdHJidWYgKiwgc2l6ZV90IHBvcywgc2l6ZV90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworCitleHRlcm4gdm9pZCBzdHJidWZfYWRkKHN0cnVjdCBzdHJidWYgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworc3RhdGljIGlubGluZSB2b2lkIHN0cmJ1Zl9hZGRzdHIoc3RydWN0IHN0cmJ1ZiAqc2IsIGNvbnN0IGNoYXIgKnMpIHsKKwlzdHJidWZfYWRkKHNiLCBzLCBzdHJsZW4ocykpOworfQorc3RhdGljIGlubGluZSB2b2lkIHN0cmJ1Zl9hZGRidWYoc3RydWN0IHN0cmJ1ZiAqc2IsIHN0cnVjdCBzdHJidWYgKnNiMikgeworCXN0cmJ1Zl9hZGQoc2IsIHNiMi0+YnVmLCBzYjItPmxlbik7Cit9CitleHRlcm4gdm9pZCBzdHJidWZfYWRkZHVwKHN0cnVjdCBzdHJidWYgKnNiLCBzaXplX3QgcG9zLCBzaXplX3QgbGVuKTsKKwordHlwZWRlZiBzaXplX3QgKCpleHBhbmRfZm5fdCkgKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFyICpwbGFjZWhvbGRlciwgdm9pZCAqY29udGV4dCk7CitleHRlcm4gdm9pZCBzdHJidWZfZXhwYW5kKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFyICpmb3JtYXQsIGV4cGFuZF9mbl90IGZuLCB2b2lkICpjb250ZXh0KTsKKworX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwyLDMpKSkKK2V4dGVybiB2b2lkIHN0cmJ1Zl9hZGRmKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CisKK2V4dGVybiBzaXplX3Qgc3RyYnVmX2ZyZWFkKHN0cnVjdCBzdHJidWYgKiwgc2l6ZV90LCBGSUxFICopOworLyogWFhYOiBpZiByZWFkIGZhaWxzLCBhbnkgcGFydGlhbCByZWFkIGlzIHVuZG9uZSAqLworZXh0ZXJuIHNzaXplX3Qgc3RyYnVmX3JlYWQoc3RydWN0IHN0cmJ1ZiAqLCBpbnQgZmQsIHNpemVfdCBoaW50KTsKK2V4dGVybiBpbnQgc3RyYnVmX3JlYWRfZmlsZShzdHJ1Y3Qgc3RyYnVmICpzYiwgY29uc3QgY2hhciAqcGF0aCwgc2l6ZV90IGhpbnQpOworCitleHRlcm4gaW50IHN0cmJ1Zl9nZXRsaW5lKHN0cnVjdCBzdHJidWYgKiwgRklMRSAqLCBpbnQpOworCitleHRlcm4gdm9pZCBzdHJpcHNwYWNlKHN0cnVjdCBzdHJidWYgKmJ1ZiwgaW50IHNraXBfY29tbWVudHMpOworZXh0ZXJuIHZvaWQgbGF1bmNoX2VkaXRvcihjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3Qgc3RyYnVmICpidWZmZXIsIGNvbnN0IGNoYXIgKmNvbnN0ICplbnYpOworCisjZW5kaWYgLyogU1RSQlVGX0ggKi8KZGlmZiAtLWdpdCBhL3N5bWxpbmtzLmMgYi9zeW1saW5rcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOWFjZTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeW1saW5rcy5jCkBAIC0wLDAgKzEsNDggQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorCitpbnQgaGFzX3N5bWxpbmtfbGVhZGluZ19wYXRoKGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKmxhc3Rfc3ltbGluaykKK3sKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCWNvbnN0IGNoYXIgKnNwLCAqZXA7CisJY2hhciAqZHA7CisKKwlzcCA9IG5hbWU7CisJZHAgPSBwYXRoOworCisJaWYgKGxhc3Rfc3ltbGluayAmJiAqbGFzdF9zeW1saW5rKSB7CisJCXNpemVfdCBsYXN0X2xlbiA9IHN0cmxlbihsYXN0X3N5bWxpbmspOworCQlzaXplX3QgbGVuID0gc3RybGVuKG5hbWUpOworCQlpZiAobGFzdF9sZW4gPCBsZW4gJiYKKwkJICAgICFzdHJuY21wKG5hbWUsIGxhc3Rfc3ltbGluaywgbGFzdF9sZW4pICYmCisJCSAgICBuYW1lW2xhc3RfbGVuXSA9PSAnLycpCisJCQlyZXR1cm4gMTsKKwkJKmxhc3Rfc3ltbGluayA9ICdcMCc7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJc2l6ZV90IGxlbjsKKwkJc3RydWN0IHN0YXQgc3Q7CisKKwkJZXAgPSBzdHJjaHIoc3AsICcvJyk7CisJCWlmICghZXApCisJCQlicmVhazsKKwkJbGVuID0gZXAgLSBzcDsKKwkJaWYgKFBBVEhfTUFYIDw9IGRwICsgbGVuIC0gcGF0aCArIDIpCisJCQlyZXR1cm4gMDsgLyogbmV3IG5hbWUgaXMgbG9uZ2VyIHRoYW4gdGhhdD8/PyAqLworCQltZW1jcHkoZHAsIHNwLCBsZW4pOworCQlkcFtsZW5dID0gMDsKKworCQlpZiAobHN0YXQocGF0aCwgJnN0KSkKKwkJCXJldHVybiAwOworCQlpZiAoU19JU0xOSyhzdC5zdF9tb2RlKSkgeworCQkJaWYgKGxhc3Rfc3ltbGluaykKKwkJCQlzdHJjcHkobGFzdF9zeW1saW5rLCBwYXRoKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJZHBbbGVuKytdID0gJy8nOworCQlkcCA9IGRwICsgbGVuOworCQlzcCA9IGVwICsgMTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90Ly5naXRhdHRyaWJ1dGVzIGIvdC8uZ2l0YXR0cmlidXRlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjJiMTJlCi0tLSAvZGV2L251bGwKKysrIGIvdC8uZ2l0YXR0cmlidXRlcwpAQCAtMCwwICsxIEBACisqIC13aGl0ZXNwYWNlCmRpZmYgLS1naXQgYS90Ly5naXRpZ25vcmUgYi90Ly5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFkNjdjMAotLS0gL2Rldi9udWxsCisrKyBiL3QvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACit0cmFzaApkaWZmIC0tZ2l0IGEvdC9NYWtlZmlsZSBiL3QvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJkNzg4NAotLS0gL2Rldi9udWxsCisrKyBiL3QvTWFrZWZpbGUKQEAgLTAsMCArMSwzMSBAQAorIyBSdW4gdGVzdHMKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKKyNHSVRfVEVTVF9PUFRTPS0tdmVyYm9zZSAtLWRlYnVnCitTSEVMTF9QQVRIID89ICQoU0hFTEwpCitUQVIgPz0gJChUQVIpCitSTSA/PSBybSAtZgorCisjIFNoZWxsIHF1b3RlOworU0hFTExfUEFUSF9TUSA9ICQoc3Vic3QgJywnXCcnLCQoU0hFTExfUEFUSCkpCisKK1QgPSAkKHdpbGRjYXJkIHRbMC05XVswLTldWzAtOV1bMC05XS0qLnNoKQorVFNWTiA9ICQod2lsZGNhcmQgdDkxWzAtOV1bMC05XS0qLnNoKQorCithbGw6ICQoVCkgY2xlYW4KKworJChUKToKKwlAZWNobyAiKioqICRAICoqKiI7IEdJVF9DT05GSUc9LmdpdC9jb25maWcgJyQoU0hFTExfUEFUSF9TUSknICRAICQoR0lUX1RFU1RfT1BUUykKKworY2xlYW46CisJJChSTSkgLXIgdHJhc2gKKworIyB3ZSBjYW4gdGVzdCBOT19PUFRJTUlaRV9DT01NSVRTIGluZGVwZW5kZW50bHkgb2YgTENfQUxMCitmdWxsLXN2bi10ZXN0OgorCSQoTUFLRSkgJChUU1ZOKSBHSVRfU1ZOX05PX09QVElNSVpFX0NPTU1JVFM9MSBMQ19BTEw9QworCSQoTUFLRSkgJChUU1ZOKSBHSVRfU1ZOX05PX09QVElNSVpFX0NPTU1JVFM9MCBMQ19BTEw9ZW5fVVMuVVRGLTgKKworLlBIT05ZOiAkKFQpIGNsZWFuCisuTk9UUEFSQUxMRUw6CmRpZmYgLS1naXQgYS90L1JFQURNRSBiL3QvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZWQxMWIKLS0tIC9kZXYvbnVsbAorKysgYi90L1JFQURNRQpAQCAtMCwwICsxLDIwOSBAQAorQ29yZSBHSVQgVGVzdHMKKz09PT09PT09PT09PT09CisKK1RoaXMgZGlyZWN0b3J5IGhvbGRzIG1hbnkgdGVzdCBzY3JpcHRzIGZvciBjb3JlIEdJVCB0b29scy4gIFRoZQorZmlyc3QgcGFydCBvZiB0aGlzIHNob3J0IGRvY3VtZW50IGRlc2NyaWJlcyBob3cgdG8gcnVuIHRoZSB0ZXN0cworYW5kIHJlYWQgdGhlaXIgb3V0cHV0LgorCitXaGVuIGZpeGluZyB0aGUgdG9vbHMgb3IgYWRkaW5nIGVuaGFuY2VtZW50cywgeW91IGFyZSBzdHJvbmdseQorZW5jb3VyYWdlZCB0byBhZGQgdGVzdHMgaW4gdGhpcyBkaXJlY3RvcnkgdG8gY292ZXIgd2hhdCB5b3UgYXJlCit0cnlpbmcgdG8gZml4IG9yIGVuaGFuY2UuICBUaGUgbGF0ZXIgcGFydCBvZiB0aGlzIHNob3J0IGRvY3VtZW50CitkZXNjcmliZXMgaG93IHlvdXIgdGVzdCBzY3JpcHRzIHNob3VsZCBiZSBvcmdhbml6ZWQuCisKKworUnVubmluZyBUZXN0cworLS0tLS0tLS0tLS0tLQorCitUaGUgZWFzaWVzdCB3YXkgdG8gcnVuIHRlc3RzIGlzIHRvIHNheSAibWFrZSIuICBUaGlzIHJ1bnMgYWxsCit0aGUgdGVzdHMuCisKKyAgICAqKiogdDAwMDAtYmFzaWMuc2ggKioqCisgICAgKiAgIG9rIDE6IC5naXQvb2JqZWN0cyBzaG91bGQgYmUgZW1wdHkgYWZ0ZXIgZ2l0LWluaXQgaW4gYW4gZW1wdHkgcmVwby4KKyAgICAqICAgb2sgMjogLmdpdC9vYmplY3RzIHNob3VsZCBoYXZlIDI1NiBzdWJkaXJlY3Rvcmllcy4KKyAgICAqICAgb2sgMzogZ2l0LXVwZGF0ZS1pbmRleCB3aXRob3V0IC0tYWRkIHNob3VsZCBmYWlsIGFkZGluZy4KKyAgICAuLi4KKyAgICAqICAgb2sgMjM6IG5vIGRpZmYgYWZ0ZXIgY2hlY2tvdXQgYW5kIGdpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoLgorICAgICogcGFzc2VkIGFsbCAyMyB0ZXN0KHMpCisgICAgKioqIHQwMTAwLWVudmlyb25tZW50LW5hbWVzLnNoICoqKgorICAgICogICBvayAxOiB1c2luZyBvbGQgbmFtZXMgc2hvdWxkIGlzc3VlIHdhcm5pbmdzLgorICAgICogICBvayAyOiB1c2luZyBvbGQgbmFtZXMgYnV0IGhhdmluZyBuZXcgbmFtZXMgc2hvdWxkIG5vdCBpc3N1ZSB3YXJuaW5ncy4KKyAgICAuLi4KKworT3IgeW91IGNhbiBydW4gZWFjaCB0ZXN0IGluZGl2aWR1YWxseSBmcm9tIGNvbW1hbmQgbGluZSwgbGlrZQordGhpczoKKworICAgICQgc2ggLi90MzAwMS1scy1maWxlcy1raWxsZWQuc2gKKyAgICAqICAgb2sgMTogZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCB0byBhZGQgdmFyaW91cyBwYXRocy4KKyAgICAqICAgb2sgMjogZ2l0LWxzLWZpbGVzIC1rIHRvIHNob3cga2lsbGVkIGZpbGVzLgorICAgICogICBvayAzOiB2YWxpZGF0ZSBnaXQtbHMtZmlsZXMgLWsgb3V0cHV0LgorICAgICogcGFzc2VkIGFsbCAzIHRlc3QocykKKworWW91IGNhbiBwYXNzIC0tdmVyYm9zZSAob3IgLXYpLCAtLWRlYnVnIChvciAtZCksIGFuZCAtLWltbWVkaWF0ZQorKG9yIC1pKSBjb21tYW5kIGxpbmUgYXJndW1lbnQgdG8gdGhlIHRlc3QuCisKKy0tdmVyYm9zZTo6CisJVGhpcyBtYWtlcyB0aGUgdGVzdCBtb3JlIHZlcmJvc2UuICBTcGVjaWZpY2FsbHksIHRoZQorCWNvbW1hbmQgYmVpbmcgcnVuIGFuZCB0aGVpciBvdXRwdXQgaWYgYW55IGFyZSBhbHNvCisJb3V0cHV0LgorCistLWRlYnVnOjoKKwlUaGlzIG1heSBoZWxwIHRoZSBwZXJzb24gd2hvIGlzIGRldmVsb3BpbmcgYSBuZXcgdGVzdC4KKwlJdCBjYXVzZXMgdGhlIGNvbW1hbmQgZGVmaW5lZCB3aXRoIHRlc3RfZGVidWcgdG8gcnVuLgorCistLWltbWVkaWF0ZTo6CisJVGhpcyBjYXVzZXMgdGhlIHRlc3QgdG8gaW1tZWRpYXRlbHkgZXhpdCB1cG9uIHRoZSBmaXJzdAorCWZhaWxlZCB0ZXN0LgorCisKK05hbWluZyBUZXN0cworLS0tLS0tLS0tLS0tCisKK1RoZSB0ZXN0IGZpbGVzIGFyZSBuYW1lZCBhczoKKworCXROTk5OLWNvbW1hbmRuYW1lLWRldGFpbHMuc2gKKword2hlcmUgTiBpcyBhIGRlY2ltYWwgZGlnaXQuCisKK0ZpcnN0IGRpZ2l0IHRlbGxzIHRoZSBmYW1pbHk6CisKKwkwIC0gdGhlIGFic29sdXRlIGJhc2ljcyBhbmQgZ2xvYmFsIHN0dWZmCisJMSAtIHRoZSBiYXNpYyBjb21tYW5kcyBjb25jZXJuaW5nIGRhdGFiYXNlCisJMiAtIHRoZSBiYXNpYyBjb21tYW5kcyBjb25jZXJuaW5nIHRoZSB3b3JraW5nIHRyZWUKKwkzIC0gdGhlIG90aGVyIGJhc2ljIGNvbW1hbmRzIChlLmcuIGxzLWZpbGVzKQorCTQgLSB0aGUgZGlmZiBjb21tYW5kcworCTUgLSB0aGUgcHVsbCBhbmQgZXhwb3J0aW5nIGNvbW1hbmRzCisJNiAtIHRoZSByZXZpc2lvbiB0cmVlIGNvbW1hbmRzIChldmVuIGUuZy4gbWVyZ2UtYmFzZSkKKwk3IC0gdGhlIHBvcmNlbGFpbmlzaCBjb21tYW5kcyBjb25jZXJuaW5nIHRoZSB3b3JraW5nIHRyZWUKKwk4IC0gdGhlIHBvcmNlbGFpbmlzaCBjb21tYW5kcyBjb25jZXJuaW5nIGZvcmVuc2ljcworCTkgLSB0aGUgZ2l0IHRvb2xzCisKK1NlY29uZCBkaWdpdCB0ZWxscyB0aGUgcGFydGljdWxhciBjb21tYW5kIHdlIGFyZSB0ZXN0aW5nLgorCitUaGlyZCBkaWdpdCAob3B0aW9uYWxseSkgdGVsbHMgdGhlIHBhcnRpY3VsYXIgc3dpdGNoIG9yIGdyb3VwIG9mIHN3aXRjaGVzCit3ZSBhcmUgdGVzdGluZy4KKworSWYgeW91IGNyZWF0ZSBmaWxlcyB1bmRlciB0LyBkaXJlY3RvcnkgKGkuZS4gaGVyZSkgdGhhdCBpcyBub3QKK3RoZSB0b3AtbGV2ZWwgdGVzdCBzY3JpcHQsIG5ldmVyIG5hbWUgdGhlIGZpbGUgdG8gbWF0Y2ggdGhlIGFib3ZlCitwYXR0ZXJuLiAgVGhlIE1ha2VmaWxlIGhlcmUgY29uc2lkZXJzIGFsbCBzdWNoIGZpbGVzIGFzIHRoZQordG9wLWxldmVsIHRlc3Qgc2NyaXB0IGFuZCB0cmllcyB0byBydW4gYWxsIG9mIHRoZW0uICBBIGNhcmUgaXMKK2VzcGVjaWFsbHkgbmVlZGVkIGlmIHlvdSBhcmUgY3JlYXRpbmcgYSBjb21tb24gdGVzdCBsaWJyYXJ5CitmaWxlLCBzaW1pbGFyIHRvIHRlc3QtbGliLnNoLCBiZWNhdXNlIHN1Y2ggYSBsaWJyYXJ5IGZpbGUgbWF5Citub3QgYmUgc3VpdGFibGUgZm9yIHN0YW5kYWxvbmUgZXhlY3V0aW9uLgorCisKK1dyaXRpbmcgVGVzdHMKKy0tLS0tLS0tLS0tLS0KKworVGhlIHRlc3Qgc2NyaXB0IGlzIHdyaXR0ZW4gYXMgYSBzaGVsbCBzY3JpcHQuICBJdCBzaG91bGQgc3RhcnQKK3dpdGggdGhlIHN0YW5kYXJkICIjIS9iaW4vc2giIHdpdGggY29weXJpZ2h0IG5vdGljZXMsIGFuZCBhbgorYXNzaWdubWVudCB0byB2YXJpYWJsZSAndGVzdF9kZXNjcmlwdGlvbicsIGxpa2UgdGhpczoKKworCSMhL2Jpbi9zaAorCSMKKwkjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworCSMKKworCXRlc3RfZGVzY3JpcHRpb249J3h4eCB0ZXN0IChvcHRpb24gLS1mcm90eikKKworCVRoaXMgdGVzdCByZWdpc3RlcnMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaW4gdGhlIGNhY2hlCisJYW5kIHRyaWVzIHRvIHJ1biBnaXQtbHMtZmlsZXMgd2l0aCBvcHRpb24gLS1mcm90ei4nCisKKworU291cmNlICd0ZXN0LWxpYi5zaCcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FmdGVyIGFzc2lnbmluZyB0ZXN0X2Rlc2NyaXB0aW9uLCB0aGUgdGVzdCBzY3JpcHQgc2hvdWxkIHNvdXJjZQordGVzdC1saWIuc2ggbGlrZSB0aGlzOgorCisJLiAuL3Rlc3QtbGliLnNoCisKK1RoaXMgdGVzdCBoYXJuZXNzIGxpYnJhcnkgZG9lcyB0aGUgZm9sbG93aW5nIHRoaW5nczoKKworIC0gSWYgdGhlIHNjcmlwdCBpcyBpbnZva2VkIHdpdGggY29tbWFuZCBsaW5lIGFyZ3VtZW50IC0taGVscAorICAgKG9yIC1oKSwgaXQgc2hvd3MgdGhlIHRlc3RfZGVzY3JpcHRpb24gYW5kIGV4aXRzLgorCisgLSBDcmVhdGVzIGFuIGVtcHR5IHRlc3QgZGlyZWN0b3J5IHdpdGggYW4gZW1wdHkgLmdpdC9vYmplY3RzCisgICBkYXRhYmFzZSBhbmQgY2hkaXIoMikgaW50byBpdC4gIFRoaXMgZGlyZWN0b3J5IGlzICd0L3RyYXNoJworICAgaWYgeW91IG11c3Qga25vdywgYnV0IEkgZG8gbm90IHRoaW5rIHlvdSBjYXJlLgorCisgLSBEZWZpbmVzIHN0YW5kYXJkIHRlc3QgaGVscGVyIGZ1bmN0aW9ucyBmb3IgeW91ciBzY3JpcHRzIHRvCisgICB1c2UuICBUaGVzZSBmdW5jdGlvbnMgYXJlIGRlc2lnbmVkIHRvIG1ha2UgYWxsIHNjcmlwdHMgYmVoYXZlCisgICBjb25zaXN0ZW50bHkgd2hlbiBjb21tYW5kIGxpbmUgYXJndW1lbnRzIC0tdmVyYm9zZSAob3IgLXYpLAorICAgLS1kZWJ1ZyAob3IgLWQpLCBhbmQgLS1pbW1lZGlhdGUgKG9yIC1pKSBpcyBnaXZlbi4KKworCitFbmQgd2l0aCB0ZXN0X2RvbmUKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3VyIHNjcmlwdCB3aWxsIGJlIGEgc2VxdWVuY2Ugb2YgdGVzdHMsIHVzaW5nIGhlbHBlciBmdW5jdGlvbnMKK2Zyb20gdGhlIHRlc3QgaGFybmVzcyBsaWJyYXJ5LiAgQXQgdGhlIGVuZCBvZiB0aGUgc2NyaXB0LCBjYWxsCisndGVzdF9kb25lJy4KKworCitUZXN0IGhhcm5lc3MgbGlicmFyeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlcmUgYXJlIGEgaGFuZGZ1bCBoZWxwZXIgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIHRlc3QgaGFybmVzcworbGlicmFyeSBmb3IgeW91ciBzY3JpcHQgdG8gdXNlLgorCisgLSB0ZXN0X2V4cGVjdF9zdWNjZXNzIDxtZXNzYWdlPiA8c2NyaXB0PgorCisgICBUaGlzIHRha2VzIHR3byBzdHJpbmdzIGFzIHBhcmFtZXRlciwgYW5kIGV2YWx1YXRlcyB0aGUKKyAgIDxzY3JpcHQ+LiAgSWYgaXQgeWllbGRzIHN1Y2Nlc3MsIHRlc3QgaXMgY29uc2lkZXJlZAorICAgc3VjY2Vzc2Z1bC4gIDxtZXNzYWdlPiBzaG91bGQgc3RhdGUgd2hhdCBpdCBpcyB0ZXN0aW5nLgorCisgICBFeGFtcGxlOgorCisJdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJICAgICdnaXQtd3JpdGUtdHJlZSBzaG91bGQgYmUgYWJsZSB0byB3cml0ZSBhbiBlbXB0eSB0cmVlLicgXAorCSAgICAndHJlZT0kKGdpdC13cml0ZS10cmVlKScKKworIC0gdGVzdF9leHBlY3RfZmFpbHVyZSA8bWVzc2FnZT4gPHNjcmlwdD4KKworICAgVGhpcyBpcyBOT1QgdGhlIG9wcG9zaXRlIG9mIHRlc3RfZXhwZWN0X3N1Y2Nlc3MsIGJ1dCBpcyB1c2VkCisgICB0byBtYXJrIGEgdGVzdCB0aGF0IGRlbW9uc3RyYXRlcyBhIGtub3duIGJyZWFrYWdlLiAgVW5saWtlCisgICB0aGUgdXN1YWwgdGVzdF9leHBlY3Rfc3VjY2VzcyB0ZXN0cywgd2hpY2ggc2F5ICJvayIgb24KKyAgIHN1Y2Nlc3MgYW5kICJGQUlMIiBvbiBmYWlsdXJlLCB0aGlzIHdpbGwgc2F5ICJGSVhFRCIgb24KKyAgIHN1Y2Nlc3MgYW5kICJzdGlsbCBicm9rZW4iIG9uIGZhaWx1cmUuICBGYWlsdXJlcyBmcm9tIHRoZXNlCisgICB0ZXN0cyB3b24ndCBjYXVzZSAtaSAoaW1tZWRpYXRlKSB0byBzdG9wLgorCisgLSB0ZXN0X2RlYnVnIDxzY3JpcHQ+CisKKyAgIFRoaXMgdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQsIDxzY3JpcHQ+LCBhbmQgZXZhbHVhdGVzIGl0IG9ubHkKKyAgIHdoZW4gdGhlIHRlc3Qgc2NyaXB0IGlzIHN0YXJ0ZWQgd2l0aCAtLWRlYnVnIGNvbW1hbmQgbGluZQorICAgYXJndW1lbnQuICBUaGlzIGlzIHByaW1hcmlseSBtZWFudCBmb3IgdXNlIGR1cmluZyB0aGUKKyAgIGRldmVsb3BtZW50IG9mIGEgbmV3IHRlc3Qgc2NyaXB0LgorCisgLSB0ZXN0X2RvbmUKKworICAgWW91ciB0ZXN0IHNjcmlwdCBtdXN0IGhhdmUgdGVzdF9kb25lIGF0IHRoZSBlbmQuICBJdHMgcHVycG9zZQorICAgaXMgdG8gc3VtbWFyaXplIHN1Y2Nlc3NlcyBhbmQgZmFpbHVyZXMgaW4gdGhlIHRlc3Qgc2NyaXB0IGFuZAorICAgZXhpdCB3aXRoIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisKKworVGlwcyBmb3IgV3JpdGluZyBUZXN0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBcyB3aXRoIGFueSBwcm9ncmFtbWluZyBwcm9qZWN0cywgZXhpc3RpbmcgcHJvZ3JhbXMgYXJlIHRoZSBiZXN0Citzb3VyY2Ugb2YgdGhlIGluZm9ybWF0aW9uLiAgSG93ZXZlciwgZG8gX25vdF8gZW11bGF0ZQordDAwMDAtYmFzaWMuc2ggd2hlbiB3cml0aW5nIHlvdXIgdGVzdHMuICBUaGUgdGVzdCBpcyBzcGVjaWFsIGluCit0aGF0IGl0IHRyaWVzIHRvIHZhbGlkYXRlIHRoZSB2ZXJ5IGNvcmUgb2YgR0lULiAgRm9yIGV4YW1wbGUsIGl0Citrbm93cyB0aGF0IHRoZXJlIHdpbGwgYmUgMjU2IHN1YmRpcmVjdG9yaWVzIHVuZGVyIC5naXQvb2JqZWN0cy8sCithbmQgaXQga25vd3MgdGhhdCB0aGUgb2JqZWN0IElEIG9mIGFuIGVtcHR5IHRyZWUgaXMgYSBjZXJ0YWluCis0MC1ieXRlIHN0cmluZy4gIFRoaXMgaXMgZGVsaWJlcmF0ZWx5IGRvbmUgc28gaW4gdDAwMDAtYmFzaWMuc2gKK2JlY2F1c2UgdGhlIHRoaW5ncyB0aGUgdmVyeSBiYXNpYyBjb3JlIHRlc3QgdHJpZXMgdG8gYWNoaWV2ZSBpcwordG8gc2VydmUgYXMgYSBiYXNpcyBmb3IgcGVvcGxlIHdobyBhcmUgY2hhbmdpbmcgdGhlIEdJVCBpbnRlcm5hbAorZHJhc3RpY2FsbHkuICBGb3IgdGhlc2UgcGVvcGxlLCBhZnRlciBtYWtpbmcgY2VydGFpbiBjaGFuZ2VzLAorbm90IHNlZWluZyBmYWlsdXJlcyBmcm9tIHRoZSBiYXNpYyB0ZXN0IF9pc18gYSBmYWlsdXJlLiAgQW5kCitzdWNoIGRyYXN0aWMgY2hhbmdlcyB0byB0aGUgY29yZSBHSVQgdGhhdCBldmVuIGNoYW5nZXMgdGhlc2UKK290aGVyd2lzZSBzdXBwb3NlZGx5IHN0YWJsZSBvYmplY3QgSURzIHNob3VsZCBiZSBhY2NvbXBhbmllZCBieQorYW4gdXBkYXRlIHRvIHQwMDAwLWJhc2ljLnNoLgorCitIb3dldmVyLCBvdGhlciB0ZXN0cyB0aGF0IHNpbXBseSByZWx5IG9uIGJhc2ljIHBhcnRzIG9mIHRoZSBjb3JlCitHSVQgd29ya2luZyBwcm9wZXJseSBzaG91bGQgbm90IGhhdmUgdGhhdCBsZXZlbCBvZiBpbnRpbWF0ZQora25vd2xlZGdlIG9mIHRoZSBjb3JlIEdJVCBpbnRlcm5hbHMuICBJZiBhbGwgdGhlIHRlc3Qgc2NyaXB0cworaGFyZGNvZGVkIHRoZSBvYmplY3QgSURzIGxpa2UgdDAwMDAtYmFzaWMuc2ggZG9lcywgdGhhdCBkZWZlYXRzCit0aGUgcHVycG9zZSBvZiB0MDAwMC1iYXNpYy5zaCwgd2hpY2ggaXMgdG8gaXNvbGF0ZSB0aGF0IGxldmVsIG9mCit2YWxpZGF0aW9uIGluIG9uZSBwbGFjZS4gIFlvdXIgdGVzdCBhbHNvIGVuZHMgdXAgbmVlZGluZwordXBkYXRpbmcgd2hlbiBzdWNoIGEgY2hhbmdlIHRvIHRoZSBpbnRlcm5hbCBoYXBwZW5zLCBzbyBkbyBfbm90XworZG8gaXQgYW5kIGxlYXZlIHRoZSBsb3cgbGV2ZWwgb2YgdmFsaWRhdGlvbiB0byB0MDAwMC1iYXNpYy5zaC4KZGlmZiAtLWdpdCBhL3QvYW5ub3RhdGUtdGVzdHMuc2ggYi90L2Fubm90YXRlLXRlc3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhY2IyNzMKLS0tIC9kZXYvbnVsbAorKysgYi90L2Fubm90YXRlLXRlc3RzLnNoCkBAIC0wLDAgKzEsMTIzIEBACisjIFRoaXMgZmlsZSBpc24ndCB1c2VkIGFzIGEgdGVzdCBzY3JpcHQgZGlyZWN0bHksIGluc3RlYWQgaXQgaXMKKyMgc291cmNlZCBmcm9tIHQ4MDAxLWFubm90YXRlLnNoIGFuZCB0ODAwMS1ibGFtZS5zaC4KKworY2hlY2tfY291bnQgKCkgeworCWhlYWQ9CisJY2FzZSAiJDEiIGluIC1oKSBoZWFkPSIkMiI7IHNoaWZ0OyBzaGlmdCA7OyBlc2FjCisJZWNobyAiJFBST0cgZmlsZSAkaGVhZCIgPiY0CisJJFBST0cgZmlsZSAkaGVhZCA+LnJlc3VsdCB8fCByZXR1cm4gMQorCWNhdCAucmVzdWx0IHwgcGVybCAtZSAnCisJCW15ICVleHBlY3QgPSAoQEFSR1YpOworCQlteSAlY291bnQgPSAoKTsKKwkJd2hpbGUgKDxTVERJTj4pIHsKKwkJCWlmICgvXlswLTlhLWZdK1x0XCgoW15cdF0rKVx0LykgeworCQkJCW15ICRhdXRob3IgPSAkMTsKKwkJCQlmb3IgKCRhdXRob3IpIHsgcy9eXHMqLy87IHMvXHMqJC8vOyB9CisJCQkJaWYgKGV4aXN0cyAkZXhwZWN0eyRhdXRob3J9KSB7CisJCQkJCSRjb3VudHskYXV0aG9yfSsrOworCQkJCX0KKwkJCX0KKwkJfQorCQlteSAkYmFkID0gMDsKKwkJd2hpbGUgKG15ICgkYXV0aG9yLCAkY291bnQpID0gZWFjaCAlY291bnQpIHsKKwkJCW15ICRvazsKKwkJCWlmICgkZXhwZWN0eyRhdXRob3J9ICE9ICRjb3VudCkgeworCQkJCSRiYWQgPSAxOworCQkJCSRvayA9ICJiYWQiOworCQkJfQorCQkJZWxzZSB7CisJCQkJJG9rID0gImdvb2QiOworCQkJfQorCQkJcHJpbnQgU1RERVJSICJBdXRob3IgJGF1dGhvciAoZXhwZWN0ZWQgJGV4cGVjdHskYXV0aG9yfSwgYXR0cmlidXRlZCAkY291bnQpICRva1xuIjsKKwkJfQorCQlleGl0KCRiYWQpOworCScgIiRAIgorfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSByZWZlcmVuY2UgdHJlZScgXAorICAgICdlY2hvICIxQSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUiID5maWxlICYmCisgICAgIGVjaG8gImxhenkgZG9nIiA+PmZpbGUgJiYKKyAgICAgZ2l0IGFkZCBmaWxlCisgICAgIEdJVF9BVVRIT1JfTkFNRT0iQSIgZ2l0IGNvbW1pdCAtYSAtbSAiSW5pdGlhbC4iJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hlY2sgYWxsIGxpbmVzIGJsYW1lZCBvbiBBJyBcCisgICAgJ2NoZWNrX2NvdW50IEEgMicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1NldHVwIG5ldyBsaW5lcyBibGFtZWQgb24gQicgXAorICAgICdlY2hvICIyQSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUiID4+ZmlsZSAmJgorICAgICBlY2hvICJsYXp5IGRvZyIgPj4gZmlsZSAmJgorICAgICBHSVRfQVVUSE9SX05BTUU9IkIiIGdpdCBjb21taXQgLWEgLW0gIlNlY29uZC4iJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnVHdvIGxpbmVzIGJsYW1lZCBvbiBBLCB0d28gb24gQicgXAorICAgICdjaGVja19jb3VudCBBIDIgQiAyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbWVyZ2Utc2V0dXAgcGFydCAxJyBcCisgICAgJ2dpdCBjaGVja291dCAtYiBicmFuY2gxIG1hc3RlciAmJgorICAgICBlY2hvICIzQSBzbG93IGdyZWVuIGZveCBqdW1wcyBpbnRvIHRoZSIgPj4gZmlsZSAmJgorICAgICBlY2hvICJ3ZWxsLiIgPj4gZmlsZSAmJgorICAgICBHSVRfQVVUSE9SX05BTUU9IkIxIiBnaXQgY29tbWl0IC1hIC1tICJCcmFuY2gxLTEiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnVHdvIGxpbmVzIGJsYW1lZCBvbiBBLCB0d28gb24gQiwgdHdvIG9uIEIxJyBcCisgICAgJ2NoZWNrX2NvdW50IEEgMiBCIDIgQjEgMicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ21lcmdlLXNldHVwIHBhcnQgMicgXAorICAgICdnaXQgY2hlY2tvdXQgLWIgYnJhbmNoMiBtYXN0ZXIgJiYKKyAgICAgc2VkIC1lICJzLzJBIHF1aWNrIGJyb3duLzRBIHF1aWNrIGJyb3duIGxhenkgZG9nLyIgPCBmaWxlID4gZmlsZS5uZXcgJiYKKyAgICAgbXYgZmlsZS5uZXcgZmlsZSAmJgorICAgICBHSVRfQVVUSE9SX05BTUU9IkIyIiBnaXQgY29tbWl0IC1hIC1tICJCcmFuY2gyLTEiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnVHdvIGxpbmVzIGJsYW1lZCBvbiBBLCBvbmUgb24gQiwgb25lIG9uIEIyJyBcCisgICAgJ2NoZWNrX2NvdW50IEEgMiBCIDEgQjIgMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ21lcmdlLXNldHVwIHBhcnQgMycgXAorICAgICdnaXQgcHVsbCAuIGJyYW5jaDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdUd28gbGluZXMgYmxhbWVkIG9uIEEsIG9uZSBvbiBCLCB0d28gb24gQjEsIG9uZSBvbiBCMicgXAorICAgICdjaGVja19jb3VudCBBIDIgQiAxIEIxIDIgQjIgMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0Fubm90YXRpbmcgYW4gb2xkIHJldmlzaW9uIHdvcmtzJyBcCisgICAgJ2NoZWNrX2NvdW50IC1oIG1hc3RlciBBIDIgQiAyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnQW5ub3RhdGluZyBhbiBvbGQgcmV2aXNpb24gd29ya3MnIFwKKyAgICAnY2hlY2tfY291bnQgLWggbWFzdGVyXiBBIDInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdtZXJnZS1zZXR1cCBwYXJ0IDQnIFwKKyAgICAnZWNobyAiZXZpbCBtZXJnZS4iID4+ZmlsZSAmJgorICAgICBnaXQgY29tbWl0IC1hIC0tYW1lbmQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdUd28gbGluZXMgYmxhbWVkIG9uIEEsIG9uZSBvbiBCLCB0d28gb24gQjEsIG9uZSBvbiBCMiwgb25lIG9uIEEgVSBUaG9yJyBcCisgICAgJ2NoZWNrX2NvdW50IEEgMiBCIDEgQjEgMiBCMiAxICJBIFUgVGhvciIgMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2FuIGluY29tcGxldGUgbGluZSBhZGRlZCcgXAorICAgICdlY2hvICJpbmNvbXBsZXRlIiB8IHRyIC1kICJcXDAxMiIgPj5maWxlICYmCisgICAgR0lUX0FVVEhPUl9OQU1FPSJDIiBnaXQgY29tbWl0IC1hIC1tICJJbmNvbXBsZXRlIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1dpdGggaW5jb21wbGV0ZSBsaW5lcy4nIFwKKyAgICAnY2hlY2tfY291bnQgQSAyIEIgMSBCMSAyIEIyIDEgIkEgVSBUaG9yIiAxIEMgMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3NvbWUgZWRpdCcgXAorICAgICdtdiBmaWxlIGZpbGUub3JpZyAmJgorICAgIHNlZCAtZSAicy9eM0EvOTkvIiAtZSAiL14xQS9kIiAtZSAiL15pbmNvbXBsZXRlL2QiIDwgZmlsZS5vcmlnID4gZmlsZSAmJgorICAgIGVjaG8gImluY29tcGxldGUiIHwgdHIgLWQgIlxcMDEyIiA+PmZpbGUgJiYKKyAgICBHSVRfQVVUSE9SX05BTUU9IkQiIGdpdCBjb21taXQgLWEgLW0gImVkaXQiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc29tZSBlZGl0JyBcCisgICAgJ2NoZWNrX2NvdW50IEEgMSBCIDEgQjEgMSBCMiAxICJBIFUgVGhvciIgMSBDIDEgRCAxJwpkaWZmIC0tZ2l0IGEvdC9kaWZmLWxpYi5zaCBiL3QvZGlmZi1saWIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiOTQxYwotLS0gL2Rldi9udWxsCisrKyBiL3QvZGlmZi1saWIuc2gKQEAgLTAsMCArMSw0MSBAQAorOgorCitfeDQwPSdbMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdJworX3g0MD0iJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCIKK3Nhbml0aXplX2RpZmZfcmF3PScvXjovcy8gJyIkX3g0MCInICciJF94NDAiJyBcKFtBLVpdXClbMC05XSoJLyBYIFggXDEjCS8nCitjb21wYXJlX2RpZmZfcmF3ICgpIHsKKyAgICAjIFdoZW4gaGV1cmlzdGljcyBhcmUgaW1wcm92ZWQsIHRoZSBzY29yZSBudW1iZXJzIHdvdWxkIGNoYW5nZS4KKyAgICAjIElnbm9yZSB0aGVtIHdoaWxlIGNvbXBhcmluZy4KKyAgICAjIEFsc28gd2UgZG8gbm90IGNoZWNrIFNIQTEgaGFzaCBnZW5lcmF0aW9uIGluIHRoaXMgdGVzdCwgd2hpY2gKKyAgICAjIGlzIGEgam9iIGZvciB0MDAwMC1iYXNpYy5zaAorCisgICAgc2VkIC1lICIkc2FuaXRpemVfZGlmZl9yYXciIDwiJDEiID4udG1wLTEKKyAgICBzZWQgLWUgIiRzYW5pdGl6ZV9kaWZmX3JhdyIgPCIkMiIgPi50bXAtMgorICAgIGdpdCBkaWZmIC50bXAtMSAudG1wLTIgJiYgcm0gLWYgLnRtcC0xIC50bXAtMgorfQorCitzYW5pdGl6ZV9kaWZmX3Jhd196PScvXjovcy8gJyIkX3g0MCInICciJF94NDAiJyBcKFtBLVpdXClbMC05XSokLyBYIFggXDEjLycKK2NvbXBhcmVfZGlmZl9yYXdfeiAoKSB7CisgICAgIyBXaGVuIGhldXJpc3RpY3MgYXJlIGltcHJvdmVkLCB0aGUgc2NvcmUgbnVtYmVycyB3b3VsZCBjaGFuZ2UuCisgICAgIyBJZ25vcmUgdGhlbSB3aGlsZSBjb21wYXJpbmcuCisgICAgIyBBbHNvIHdlIGRvIG5vdCBjaGVjayBTSEExIGhhc2ggZ2VuZXJhdGlvbiBpbiB0aGlzIHRlc3QsIHdoaWNoCisgICAgIyBpcyBhIGpvYiBmb3IgdDAwMDAtYmFzaWMuc2gKKworICAgIHBlcmwgLXBlICd5L1wwMDAvXDAxMi8nIDwiJDEiIHwgc2VkIC1lICIkc2FuaXRpemVfZGlmZl9yYXdfeiIgPi50bXAtMQorICAgIHBlcmwgLXBlICd5L1wwMDAvXDAxMi8nIDwiJDIiIHwgc2VkIC1lICIkc2FuaXRpemVfZGlmZl9yYXdfeiIgPi50bXAtMgorICAgIGdpdCBkaWZmIC50bXAtMSAudG1wLTIgJiYgcm0gLWYgLnRtcC0xIC50bXAtMgorfQorCitjb21wYXJlX2RpZmZfcGF0Y2ggKCkgeworICAgICMgV2hlbiBoZXVyaXN0aWNzIGFyZSBpbXByb3ZlZCwgdGhlIHNjb3JlIG51bWJlcnMgd291bGQgY2hhbmdlLgorICAgICMgSWdub3JlIHRoZW0gd2hpbGUgY29tcGFyaW5nLgorICAgIHNlZCAtZSAnCisJL15bZGlzXSppbWlsYXJpdHkgaW5kZXggWzAtOV0qJSQvZAorCS9eaW5kZXggWzAtOWEtZl0qXC5cLlswLTlhLWZdL2QKKyAgICAnIDwiJDEiID4udG1wLTEKKyAgICBzZWQgLWUgJworCS9eW2Rpc10qaW1pbGFyaXR5IGluZGV4IFswLTldKiUkL2QKKwkvXmluZGV4IFswLTlhLWZdKlwuXC5bMC05YS1mXS9kCisgICAgJyA8IiQyIiA+LnRtcC0yCisgICAgZ2l0IGRpZmYgLnRtcC0xIC50bXAtMiAmJiBybSAtZiAudG1wLTEgLnRtcC0yCit9CmRpZmYgLS1naXQgYS90L2xpYi1naXQtc3ZuLnNoIGIvdC9saWItZ2l0LXN2bi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGVjZDJlCi0tLSAvZGV2L251bGwKKysrIGIvdC9saWItZ2l0LXN2bi5zaApAQCAtMCwwICsxLDEzMSBAQAorLiAuL3Rlc3QtbGliLnNoCisKK2lmIHRlc3QgLW4gIiROT19TVk5fVEVTVFMiCit0aGVuCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAnc2tpcHBpbmcgZ2l0LXN2biB0ZXN0cywgTk9fU1ZOX1RFU1RTIGRlZmluZWQnIDoKKwl0ZXN0X2RvbmUKKwlleGl0CitmaQorCitHSVRfRElSPSRQV0QvLmdpdAorR0lUX1NWTl9ESVI9JEdJVF9ESVIvc3ZuL2dpdC1zdm4KK1NWTl9UUkVFPSRHSVRfU1ZOX0RJUi9zdm4tdHJlZQorCitzdm4gPi9kZXYvbnVsbCAyPiYxCitpZiB0ZXN0ICQ/IC1uZSAxCit0aGVuCisgICAgdGVzdF9leHBlY3Rfc3VjY2VzcyAnc2tpcHBpbmcgZ2l0LXN2biB0ZXN0cywgc3ZuIG5vdCBmb3VuZCcgOgorICAgIHRlc3RfZG9uZQorICAgIGV4aXQKK2ZpCisKK3N2bnJlcG89JFBXRC9zdm5yZXBvCisKK3BlcmwgLXcgLWUgIgordXNlIFNWTjo6Q29yZTsKK3VzZSBTVk46OlJlcG9zOworXCRTVk46OkNvcmU6OlZFUlNJT04gZ3QgJzEuMS4wJyBvciBleGl0KDQyKTsKK3N5c3RlbShxdy9zdm5hZG1pbiBjcmVhdGUgLS1mcy10eXBlIGZzZnMvLCAnJHN2bnJlcG8nKSA9PSAwIG9yIGV4aXQoNDEpOworIiA+JjMgMj4mNAoreD0kPworaWYgdGVzdCAkeCAtbmUgMAordGhlbgorCWlmIHRlc3QgJHggLWVxIDQyOyB0aGVuCisJCWVycj0nUGVybCBTVk4gbGlicmFyaWVzIG11c3QgYmUgPj0gMS4xLjAnCisJZWxpZiB0ZXN0ICR4IC1lcSA0MTsgdGhlbgorCQllcnI9J3N2bmFkbWluIGZhaWxlZCB0byBjcmVhdGUgZnNmcyByZXBvc2l0b3J5JworCWVsc2UKKwkJZXJyPSdQZXJsIFNWTiBsaWJyYXJpZXMgbm90IGZvdW5kIG9yIHVudXNhYmxlLCBza2lwcGluZyB0ZXN0JworCWZpCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAiJGVyciIgOgorCXRlc3RfZG9uZQorCWV4aXQKK2ZpCisKK3Jhd3N2bnJlcG89IiRzdm5yZXBvIgorc3ZucmVwbz0iZmlsZTovLyRzdm5yZXBvIgorCitwb2tlKCkgeworCXRlc3QtY2htdGltZSArMSAiJDEiCit9CisKK2ZvciBkIGluIFwKKwkiJFNWTl9IVFRQRF9QQVRIIiBcCisJL3Vzci9zYmluL2FwYWNoZTIgXAorCS91c3Ivc2Jpbi9odHRwZCBcCis7IGRvCisJaWYgdGVzdCAtZiAiJGQiCisJdGhlbgorCQlTVk5fSFRUUERfUEFUSD0iJGQiCisJCWJyZWFrCisJZmkKK2RvbmUKK2ZvciBkIGluIFwKKwkiJFNWTl9IVFRQRF9NT0RVTEVfUEFUSCIgXAorCS91c3IvbGliL2FwYWNoZTIvbW9kdWxlcyBcCisJL3Vzci9saWJleGVjL2FwYWNoZTIgXAorOyBkbworCWlmIHRlc3QgLWQgIiRkIgorCXRoZW4KKwkJU1ZOX0hUVFBEX01PRFVMRV9QQVRIPSIkZCIKKwkJYnJlYWsKKwlmaQorZG9uZQorCitzdGFydF9odHRwZCAoKSB7CisJaWYgdGVzdCAteiAiJFNWTl9IVFRQRF9QT1JUIgorCXRoZW4KKwkJZWNobyA+JjIgJ1NWTl9IVFRQRF9QT1JUIGlzIG5vdCBkZWZpbmVkIScKKwkJcmV0dXJuCisJZmkKKworCW1rZGlyICIkR0lUX0RJUiIvbG9ncworCisJY2F0ID4gIiRHSVRfRElSL2h0dHBkLmNvbmYiIDw8RU9GCitTZXJ2ZXJOYW1lICJnaXQtc3ZuIHRlc3QiCitTZXJ2ZXJSb290ICIkR0lUX0RJUiIKK0RvY3VtZW50Um9vdCAiJEdJVF9ESVIiCitQaWRGaWxlICIkR0lUX0RJUi9odHRwZC5waWQiCitMb2NrRmlsZSBsb2dzL2FjY2VwdC5sb2NrCitMaXN0ZW4gMTI3LjAuMC4xOiRTVk5fSFRUUERfUE9SVAorTG9hZE1vZHVsZSBkYXZfbW9kdWxlICRTVk5fSFRUUERfTU9EVUxFX1BBVEgvbW9kX2Rhdi5zbworTG9hZE1vZHVsZSBkYXZfc3ZuX21vZHVsZSAkU1ZOX0hUVFBEX01PRFVMRV9QQVRIL21vZF9kYXZfc3ZuLnNvCis8TG9jYXRpb24gL3N2bj4KKwlEQVYgc3ZuCisJU1ZOUGF0aCAkcmF3c3ZucmVwbworPC9Mb2NhdGlvbj4KK0VPRgorCSIkU1ZOX0hUVFBEX1BBVEgiIC1mICIkR0lUX0RJUiIvaHR0cGQuY29uZiAtayBzdGFydAorCXN2bnJlcG89aHR0cDovLzEyNy4wLjAuMTokU1ZOX0hUVFBEX1BPUlQvc3ZuCit9CisKK3N0b3BfaHR0cGQgKCkgeworCXRlc3QgLXogIiRTVk5fSFRUUERfUE9SVCIgJiYgcmV0dXJuCisJIiRTVk5fSFRUUERfUEFUSCIgLWYgIiRHSVRfRElSIi9odHRwZC5jb25mIC1rIHN0b3AKK30KKworY29udmVydF90b19yZXZfZGIgKCkgeworCXBlcmwgLXcgLS0gLSAiJEAiIDw8XEVPRgordXNlIHN0cmljdDsKK0BBUkdWID09IDIgb3IgZGllICJVc2FnZTogY29udmVydF90b19yZXZfZGIgPGlucHV0PiA8b3V0cHV0PiI7CitvcGVuIG15ICR3ciwgJys+JywgJEFSR1ZbMV0gb3IgZGllICIkITogY291bGRuJ3Qgb3BlbjogJEFSR1ZbMV0iOworb3BlbiBteSAkcmQsICc8JywgJEFSR1ZbMF0gb3IgZGllICIkITogY291bGRuJ3Qgb3BlbjogJEFSR1ZbMF0iOworbXkgJHNpemUgPSAoc3RhdCgkcmQpKVs3XTsKKygkc2l6ZSAlIDI0KSA9PSAwIG9yIGRpZSAiSW5jb25zaXN0ZW50IHNpemU6ICRzaXplIjsKK3doaWxlIChzeXNyZWFkKCRyZCwgbXkgJGJ1ZiwgMjQpID09IDI0KSB7CisJbXkgKCRyLCAkYykgPSB1bnBhY2soJ05INDAnLCAkYnVmKTsKKwlteSAkb2Zmc2V0ID0gJHIgKiA0MTsKKwlzZWVrICR3ciwgMCwgMiBvciBkaWUgJCE7CisJbXkgJHBvcyA9IHRlbGwgJHdyOworCWlmICgkcG9zIDwgJG9mZnNldCkgeworCQlmb3IgKDEgLi4gKCgkb2Zmc2V0IC0gJHBvcykgLyA0MSkpIHsKKwkJCXByaW50ICR3ciAoKCcwJyB4IDQwKSwiXG4iKSBvciBkaWUgJCE7CisJCX0KKwl9CisJc2VlayAkd3IsICRvZmZzZXQsIDAgb3IgZGllICQhOworCXByaW50ICR3ciAkYywiXG4iIG9yIGRpZSAkITsKK30KK2Nsb3NlICR3ciBvciBkaWUgJCE7CitjbG9zZSAkcmQgb3IgZGllICQhOworRU9GCit9CmRpZmYgLS1naXQgYS90L2xpYi1odHRwZC5zaCBiL3QvbGliLWh0dHBkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMjA2YzUKLS0tIC9kZXYvbnVsbAorKysgYi90L2xpYi1odHRwZC5zaApAQCAtMCwwICsxLDk2IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA4IENsZW1lbnMgQnVjaGFjaGVyIDxkcml6emRAYW9uLmF0PgorIworCitpZiB0ZXN0IC16ICIkR0lUX1RFU1RfSFRUUEQiCit0aGVuCisJc2F5ICJza2lwcGluZyB0ZXN0LCBuZXR3b3JrIHRlc3RpbmcgZGlzYWJsZWQgYnkgZGVmYXVsdCIKKwlzYXkgIihkZWZpbmUgR0lUX1RFU1RfSFRUUEQgdG8gZW5hYmxlKSIKKwl0ZXN0X2RvbmUKKwlleGl0CitmaQorCitMSUJfSFRUUERfUEFUSD0ke0xJQl9IVFRQRF9QQVRILScvdXNyL3NiaW4vYXBhY2hlMid9CitMSUJfSFRUUERfUE9SVD0ke0xJQl9IVFRQRF9QT1JULSc4MTExJ30KKworVEVTVF9QQVRIPSIkUFdEIi8uLi9saWItaHR0cGQKK0hUVFBEX1JPT1RfUEFUSD0iJFBXRCIvaHR0cGQKK0hUVFBEX0RPQ1VNRU5UX1JPT1RfUEFUSD0kSFRUUERfUk9PVF9QQVRIL3d3dworCitpZiAhIHRlc3QgLXggIiRMSUJfSFRUUERfUEFUSCIKK3RoZW4KKyAgICAgICAgc2F5ICJza2lwcGluZyB0ZXN0LCBubyB3ZWIgc2VydmVyIGZvdW5kIGF0ICckTElCX0hUVFBEX1BBVEgnIgorICAgICAgICB0ZXN0X2RvbmUKKyAgICAgICAgZXhpdAorZmkKKworSFRUUERfVkVSU0lPTj1gJExJQl9IVFRQRF9QQVRIIC12IHwgXAorCXNlZCAtbiAncy9eU2VydmVyIHZlcnNpb246IEFwYWNoZVwvXChbMC05XSpcKVwuLiokL1wxL3A7IHEnYAorCitpZiB0ZXN0IC1uICIkSFRUUERfVkVSU0lPTiIKK3RoZW4KKwlpZiB0ZXN0IC16ICIkTElCX0hUVFBEX01PRFVMRV9QQVRIIgorCXRoZW4KKwkJaWYgISB0ZXN0ICRIVFRQRF9WRVJTSU9OIC1nZSAyCisJCXRoZW4KKwkJCXNheSAic2tpcHBpbmcgdGVzdCwgYXQgbGVhc3QgQXBhY2hlIHZlcnNpb24gMiBpcyByZXF1aXJlZCIKKwkJCXRlc3RfZG9uZQorCQkJZXhpdAorCQlmaQorCisJCUxJQl9IVFRQRF9NT0RVTEVfUEFUSD0nL3Vzci9saWIvYXBhY2hlMi9tb2R1bGVzJworCWZpCitlbHNlCisJZXJyb3IgIkNvdWxkIG5vdCBpZGVudGlmeSB3ZWIgc2VydmVyIGF0ICckTElCX0hUVFBEX1BBVEgnIgorZmkKKworSFRUUERfUEFSQT0iLWQgJEhUVFBEX1JPT1RfUEFUSCAtZiAkVEVTVF9QQVRIL2FwYWNoZS5jb25mIgorCitwcmVwYXJlX2h0dHBkKCkgeworCW1rZGlyIC1wICRIVFRQRF9ET0NVTUVOVF9ST09UX1BBVEgKKworCWxuIC1zICRMSUJfSFRUUERfTU9EVUxFX1BBVEggJEhUVFBEX1JPT1RfUEFUSC9tb2R1bGVzCisKKwlpZiB0ZXN0IC1uICIkTElCX0hUVFBEX1NTTCIKKwl0aGVuCisJCUhUVFBEX1VSTD1odHRwczovLzEyNy4wLjAuMTokTElCX0hUVFBEX1BPUlQKKworCQlSQU5ERklMRV9QQVRIPSIkSFRUUERfUk9PVF9QQVRIIi8ucm5kIG9wZW5zc2wgcmVxIFwKKwkJCS1jb25maWcgJFRFU1RfUEFUSC9zc2wuY25mIFwKKwkJCS1uZXcgLXg1MDkgLW5vZGVzIFwKKwkJCS1vdXQgJEhUVFBEX1JPT1RfUEFUSC9odHRwZC5wZW0gXAorCQkJLWtleW91dCAkSFRUUERfUk9PVF9QQVRIL2h0dHBkLnBlbQorCQlleHBvcnQgR0lUX1NTTF9OT19WRVJJRlk9dAorCQlIVFRQRF9QQVJBPSIkSFRUUERfUEFSQSAtRFNTTCIKKwllbHNlCisJCUhUVFBEX1VSTD1odHRwOi8vMTI3LjAuMC4xOiRMSUJfSFRUUERfUE9SVAorCWZpCisKKwlpZiB0ZXN0IC1uICIkTElCX0hUVFBEX0RBViIgLW8gLW4gIiRMSUJfSFRUUERfU1ZOIgorCXRoZW4KKwkJSFRUUERfUEFSQT0iJEhUVFBEX1BBUkEgLUREQVYiCisKKwkJaWYgdGVzdCAtbiAiJExJQl9IVFRQRF9TVk4iCisJCXRoZW4KKwkJCUhUVFBEX1BBUkE9IiRIVFRQRF9QQVJBIC1EU1ZOIgorCQkJcmF3c3ZucmVwbz0iJEhUVFBEX1JPT1RfUEFUSC9zdm5yZXBvIgorCQkJc3ZucmVwbz0iaHR0cDovLzEyNy4wLjAuMTokTElCX0hUVFBEX1BPUlQvc3ZuIgorCQlmaQorCWZpCit9CisKK3N0YXJ0X2h0dHBkKCkgeworCXByZXBhcmVfaHR0cGQKKworCXRyYXAgJ3N0b3BfaHR0cGQ7IGRpZScgZXhpdAorCisJIiRMSUJfSFRUUERfUEFUSCIgJEhUVFBEX1BBUkEgXAorCQktYyAiTGlzdGVuIDEyNy4wLjAuMTokTElCX0hUVFBEX1BPUlQiIC1rIHN0YXJ0Cit9CisKK3N0b3BfaHR0cGQoKSB7CisJdHJhcCAnZGllJyBleGl0CisKKwkiJExJQl9IVFRQRF9QQVRIIiAkSFRUUERfUEFSQSAtayBzdG9wCit9CmRpZmYgLS1naXQgYS90L2xpYi1odHRwZC9hcGFjaGUuY29uZiBiL3QvbGliLWh0dHBkL2FwYWNoZS5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NDczNDYKLS0tIC9kZXYvbnVsbAorKysgYi90L2xpYi1odHRwZC9hcGFjaGUuY29uZgpAQCAtMCwwICsxLDM0IEBACitQaWRGaWxlIGh0dHBkLnBpZAorRG9jdW1lbnRSb290IHd3dworRXJyb3JMb2cgZXJyb3IubG9nCisKKzxJZkRlZmluZSBTU0w+CitMb2FkTW9kdWxlIHNzbF9tb2R1bGUgbW9kdWxlcy9tb2Rfc3NsLnNvCisKK1NTTENlcnRpZmljYXRlRmlsZSBodHRwZC5wZW0KK1NTTENlcnRpZmljYXRlS2V5RmlsZSBodHRwZC5wZW0KK1NTTFJhbmRvbVNlZWQgc3RhcnR1cCBmaWxlOi9kZXYvdXJhbmRvbSA1MTIKK1NTTFJhbmRvbVNlZWQgY29ubmVjdCBmaWxlOi9kZXYvdXJhbmRvbSA1MTIKK1NTTFNlc3Npb25DYWNoZSBub25lCitTU0xNdXRleCBmaWxlOnNzbF9tdXRleAorU1NMRW5naW5lIE9uCis8L0lmRGVmaW5lPgorCis8SWZEZWZpbmUgREFWPgorCUxvYWRNb2R1bGUgZGF2X21vZHVsZSBtb2R1bGVzL21vZF9kYXYuc28KKwlMb2FkTW9kdWxlIGRhdl9mc19tb2R1bGUgbW9kdWxlcy9tb2RfZGF2X2ZzLnNvCisKKwlEQVZMb2NrREIgREFWTG9jaworCTxMb2NhdGlvbiAvPgorCQlEYXYgb24KKwk8L0xvY2F0aW9uPgorPC9JZkRlZmluZT4KKworPElmRGVmaW5lIFNWTj4KKwlMb2FkTW9kdWxlIGRhdl9zdm5fbW9kdWxlIG1vZHVsZXMvbW9kX2Rhdl9zdm4uc28KKworCTxMb2NhdGlvbiAvc3ZuPgorCQlEQVYgc3ZuCisJCVNWTlBhdGggc3ZucmVwbworCTwvTG9jYXRpb24+Cis8L0lmRGVmaW5lPgpkaWZmIC0tZ2l0IGEvdC9saWItaHR0cGQvc3NsLmNuZiBiL3QvbGliLWh0dHBkL3NzbC5jbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhYjI1NwotLS0gL2Rldi9udWxsCisrKyBiL3QvbGliLWh0dHBkL3NzbC5jbmYKQEAgLTAsMCArMSw4IEBACitSQU5ERklMRSAgICAgICAgICAgICAgICA9ICRFTlY6OlJBTkRGSUxFX1BBVEgKKworWyByZXEgXQorZGVmYXVsdF9iaXRzICAgICAgICAgICAgPSAxMDI0CitkaXN0aW5ndWlzaGVkX25hbWUgICAgICA9IHJlcV9kaXN0aW5ndWlzaGVkX25hbWUKK3Byb21wdCAgICAgICAgICAgICAgICAgID0gbm8KK1sgcmVxX2Rpc3Rpbmd1aXNoZWRfbmFtZSBdCitjb21tb25OYW1lICAgICAgICAgICAgICA9IDEyNy4wLjAuMQpkaWZmIC0tZ2l0IGEvdC9saWItcmVhZC10cmVlLW0tM3dheS5zaCBiL3QvbGliLXJlYWQtdHJlZS1tLTN3YXkuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY4MzI5YQotLS0gL2Rldi9udWxsCisrKyBiL3QvbGliLXJlYWQtdHJlZS1tLTN3YXkuc2gKQEAgLTAsMCArMSwxNTggQEAKKzogSW5jbHVkZWQgZnJvbSB0MTAwMC1yZWFkLXRyZWUtbS0zd2F5LnNoIGFuZCBvdGhlcnMKKyMgT3JpZ2luYWwgdHJlZS4KK21rZGlyIFoKK2ZvciBhIGluIE4gRCBNCitkbworICAgIGZvciBiIGluIE4gRCBNCisgICAgZG8KKyAgICAgICAgcD0kYSRiCisJZWNobyBUaGlzIGlzICRwIGZyb20gdGhlIG9yaWdpbmFsIHRyZWUuID4kcAorCWVjaG8gVGhpcyBpcyBaLyRwIGZyb20gdGhlIG9yaWdpbmFsIHRyZWUuID5aLyRwCisJdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJICAgICJhZGRpbmcgdGVzdCBmaWxlICRwIGFuZCBaLyRwIiBcCisJICAgICdnaXQgdXBkYXRlLWluZGV4IC0tYWRkICRwICYmCisJICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgWi8kcCcKKyAgICBkb25lCitkb25lCitlY2hvIFRoaXMgaXMgU1MgZnJvbSB0aGUgb3JpZ2luYWwgdHJlZS4gPlNTCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnYWRkaW5nIHRlc3QgZmlsZSBTUycgXAorICAgICdnaXQgdXBkYXRlLWluZGV4IC0tYWRkIFNTJworY2F0ID5UVCA8PFxFT0YKK1RoaXMgaXMgYSB0cml2aWFsIG1lcmdlIHNhbXBsZSB0ZXh0LgorQnJhbmNoIEEgaXMgZXhwZWN0ZWQgdG8gdXBjYXNlIHRoaXMgd29yZCwgaGVyZS4KK1RoZXJlIGFyZSBzb21lIGZpbGxlciBsaW5lcyB0byBhdm9pZCBkaWZmIGNvbnRleHQKK2NvbmZsaWN0cyBoZXJlLAorbGlrZSB0aGlzIG9uZSwKK2FuZCB0aGlzIG9uZSwKK2FuZCB0aGlzIG9uZSBpcyB5ZXQgYW5vdGhlciBvbmUgb2YgdGhlbS4KK0F0IHRoZSB2ZXJ5IGVuZCwgaGVyZSBjb21lcyBhbm90aGVyIGxpbmUsIHRoYXQgaXMKK3RoZSB3b3JkLCBleHBlY3RlZCB0byBiZSB1cGNhc2VkIGJ5IEJyYW5jaCBCLgorVGhpcyBjb25jbHVkZXMgdGhlIHRyaXZpYWwgbWVyZ2Ugc2FtcGxlIGZpbGUuCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdhZGRpbmcgdGVzdCBmaWxlIFRUJyBcCisgICAgJ2dpdCB1cGRhdGUtaW5kZXggLS1hZGQgVFQnCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSBpbml0aWFsIHRyZWUnIFwKKyAgICAndHJlZV9PPSQoZ2l0IHdyaXRlLXRyZWUpJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJyYW5jaCBBIGFuZCBCIG1ha2VzIHRoZSBjaGFuZ2VzIGFjY29yZGluZyB0byB0aGUgYWJvdmUgbWF0cml4LgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJyYW5jaCBBCisKK3RvX3JlbW92ZT0kKGVjaG8gRD8gWi9EPykKK3JtIC1mICR0b19yZW1vdmUKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGFuZ2UgaW4gYnJhbmNoIEEgKHJlbW92YWwpJyBcCisgICAgJ2dpdCB1cGRhdGUtaW5kZXggLS1yZW1vdmUgJHRvX3JlbW92ZScKKworZm9yIHAgaW4gTT8gWi9NPworZG8KKyAgICBlY2hvIFRoaXMgaXMgbW9kaWZpZWQgJHAgaW4gdGhlIGJyYW5jaCBBLiA+JHAKKyAgICB0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY2hhbmdlIGluIGJyYW5jaCBBIChtb2RpZmljYXRpb24pJyBcCisgICAgICAgICJnaXQgdXBkYXRlLWluZGV4ICRwIgorZG9uZQorCitmb3IgcCBpbiBBTiBBQSBaL0FOIFovQUEKK2RvCisgICAgZWNobyBUaGlzIGlzIGFkZGVkICRwIGluIHRoZSBicmFuY2ggQS4gPiRwCisgICAgdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NoYW5nZSBpbiBicmFuY2ggQSAoYWRkaXRpb24pJyBcCisJImdpdCB1cGRhdGUtaW5kZXggLS1hZGQgJHAiCitkb25lCisKK2VjaG8gVGhpcyBpcyBTUyBmcm9tIHRoZSBtb2RpZmllZCB0cmVlLiA+U1MKK2VjaG8gVGhpcyBpcyBMTCBmcm9tIHRoZSBtb2RpZmllZCB0cmVlLiA+TEwKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGFuZ2UgaW4gYnJhbmNoIEEgKGFkZGl0aW9uKScgXAorICAgICdnaXQgdXBkYXRlLWluZGV4IC0tYWRkIExMICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggU1MnCittdiBUVCBUVC0KK3NlZCAtZSAnL0JyYW5jaCBBL3Mvd29yZC9XT1JEL2cnIDxUVC0gPlRUCitybSAtZiBUVC0KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGFuZ2UgaW4gYnJhbmNoIEEgKGVkaXQpJyBcCisgICAgJ2dpdCB1cGRhdGUtaW5kZXggVFQnCisKK21rZGlyIERGCitlY2hvIEJyYW5jaCBBIG1ha2VzIGEgZmlsZSBhdCBERi9ERiwgY3JlYXRpbmcgYSBkaXJlY3RvcnkgREYuID5ERi9ERgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoYW5nZSBpbiBicmFuY2ggQSAoY2hhbmdlIGZpbGUgdG8gZGlyZWN0b3J5KScgXAorICAgICdnaXQgdXBkYXRlLWluZGV4IC0tYWRkIERGL0RGJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncmVjb3JkaW5nIGJyYW5jaCBBIHRyZWUnIFwKKyAgICAndHJlZV9BPSQoZ2l0IHdyaXRlLXRyZWUpJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJyYW5jaCBCCisjIFN0YXJ0IGZyb20gTworCitybSAtcmYgW05ETUFTTFRdW05ETUFTTFRdIFogREYKK21rZGlyIFoKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdyZWFkaW5nIG9yaWdpbmFsIHRyZWUgYW5kIGNoZWNraW5nIG91dCcgXAorICAgICdnaXQgcmVhZC10cmVlICR0cmVlX08gJiYKKyAgICAgZ2l0IGNoZWNrb3V0LWluZGV4IC1hJworCit0b19yZW1vdmU9JChlY2hvID9EIFovP0QpCitybSAtZiAkdG9fcmVtb3ZlCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hhbmdlIGluIGJyYW5jaCBCIChyZW1vdmFsKScgXAorICAgICJnaXQgdXBkYXRlLWluZGV4IC0tcmVtb3ZlICR0b19yZW1vdmUiCisKK2ZvciBwIGluID9NIFovP00KK2RvCisgICAgZWNobyBUaGlzIGlzIG1vZGlmaWVkICRwIGluIHRoZSBicmFuY2ggQi4gPiRwCisgICAgdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NoYW5nZSBpbiBicmFuY2ggQiAobW9kaWZpY2F0aW9uKScgXAorCSJnaXQgdXBkYXRlLWluZGV4ICRwIgorZG9uZQorCitmb3IgcCBpbiBOQSBBQSBaL05BIFovQUEKK2RvCisgICAgZWNobyBUaGlzIGlzIGFkZGVkICRwIGluIHRoZSBicmFuY2ggQi4gPiRwCisgICAgdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NoYW5nZSBpbiBicmFuY2ggQiAoYWRkaXRpb24pJyBcCisJImdpdCB1cGRhdGUtaW5kZXggLS1hZGQgJHAiCitkb25lCitlY2hvIFRoaXMgaXMgU1MgZnJvbSB0aGUgbW9kaWZpZWQgdHJlZS4gPlNTCitlY2hvIFRoaXMgaXMgTEwgZnJvbSB0aGUgbW9kaWZpZWQgdHJlZS4gPkxMCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hhbmdlIGluIGJyYW5jaCBCIChhZGRpdGlvbiBhbmQgbW9kaWZpY2F0aW9uKScgXAorICAgICdnaXQgdXBkYXRlLWluZGV4IC0tYWRkIExMICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggU1MnCittdiBUVCBUVC0KK3NlZCAtZSAnL0JyYW5jaCBCL3Mvd29yZC9XT1JEL2cnIDxUVC0gPlRUCitybSAtZiBUVC0KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGFuZ2UgaW4gYnJhbmNoIEIgKG1vZGlmaWNhdGlvbiknIFwKKyAgICAnZ2l0IHVwZGF0ZS1pbmRleCBUVCcKKworZWNobyBCcmFuY2ggQiBtYWtlcyBhIGZpbGUgYXQgREYuID5ERgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoYW5nZSBpbiBicmFuY2ggQiAoYWRkaXRpb24gb2YgYSBmaWxlIHRvIGNvbmZsaWN0IHdpdGggZGlyZWN0b3J5KScgXAorICAgICdnaXQgdXBkYXRlLWluZGV4IC0tYWRkIERGJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncmVjb3JkaW5nIGJyYW5jaCBCIHRyZWUnIFwKKyAgICAndHJlZV9CPSQoZ2l0IHdyaXRlLXRyZWUpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAna2VlcCBjb250ZW50cyBvZiAzIHRyZWVzIGZvciBlYXN5IGFjY2VzcycgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdCByZWFkLXRyZWUgJHRyZWVfTyAmJgorICAgICBta2RpciAub3JpZy1PICYmCisgICAgIGdpdCBjaGVja291dC1pbmRleCAtLXByZWZpeD0ub3JpZy1PLyAtZiAtcSAtYSAmJgorICAgICBybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdCByZWFkLXRyZWUgJHRyZWVfQSAmJgorICAgICBta2RpciAub3JpZy1BICYmCisgICAgIGdpdCBjaGVja291dC1pbmRleCAtLXByZWZpeD0ub3JpZy1BLyAtZiAtcSAtYSAmJgorICAgICBybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdCByZWFkLXRyZWUgJHRyZWVfQiAmJgorICAgICBta2RpciAub3JpZy1CICYmCisgICAgIGdpdCBjaGVja291dC1pbmRleCAtLXByZWZpeD0ub3JpZy1CLyAtZiAtcSAtYScKZGlmZiAtLWdpdCBhL3QvdDAwMDAtYmFzaWMuc2ggYi90L3QwMDAwLWJhc2ljLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI3YjU0Y2IKLS0tIC9kZXYvbnVsbAorKysgYi90L3QwMDAwLWJhc2ljLnNoCkBAIC0wLDAgKzEsMzM0IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgdGhlIHZlcnkgYmFzaWNzIHBhcnQgIzEuCisKK1RoZSByZXN0IG9mIHRoZSB0ZXN0IHN1aXRlIGRvZXMgbm90IGNoZWNrIHRoZSBiYXNpYyBvcGVyYXRpb24gb2YgZ2l0CitwbHVtYmluZyBjb21tYW5kcyB0byB3b3JrIHZlcnkgY2FyZWZ1bGx5LiAgVGhlaXIgam9iIGlzIHRvIGNvbmNlbnRyYXRlCitvbiB0cmlja3kgZmVhdHVyZXMgdGhhdCBjYXVzZWQgYnVncyBpbiB0aGUgcGFzdCB0byBkZXRlY3QgcmVncmVzc2lvbi4KKworVGhpcyB0ZXN0IHJ1bnMgdmVyeSBiYXNpYyBmZWF0dXJlcywgbGlrZSByZWdpc3RlcmluZyB0aGluZ3MgaW4gY2FjaGUsCit3cml0aW5nIHRyZWUsIGV0Yy4KKworTm90ZSB0aGF0IHRoaXMgdGVzdCAqZGVsaWJlcmF0ZWx5KiBoYXJkLWNvZGVzIG1hbnkgZXhwZWN0ZWQgb2JqZWN0CitJRHMuICBXaGVuIG9iamVjdCBJRCBjb21wdXRhdGlvbiBjaGFuZ2VzLCBsaWtlIGluIHRoZSBwcmV2aW91cyBjYXNlIG9mCitzd2FwcGluZyBjb21wcmVzc2lvbiBhbmQgaGFzaGluZyBvcmRlciwgdGhlIHBlcnNvbiB3aG8gaXMgbWFraW5nIHRoZQorbW9kaWZpY2F0aW9uICpzaG91bGQqIHRha2Ugbm90aWNlIGFuZCB1cGRhdGUgdGhlIHRlc3QgdmVjdG9ycyBoZXJlLgorJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEl0IGFwcGVhcnMgdGhhdCBwZW9wbGUgdHJ5IHRvIHJ1biB0ZXN0cyB3aXRob3V0IGJ1aWxkaW5nLi4uCisKKy4uL2dpdCA+L2Rldi9udWxsCitpZiB0ZXN0ICQ/ICE9IDEKK3RoZW4KKwllY2hvID4mMiAnWW91IGRvIG5vdCBzZWVtIHRvIGhhdmUgYnVpbHQgZ2l0IHlldC4nCisJZXhpdCAxCitmaQorCisuIC4vdGVzdC1saWIuc2gKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBnaXQgaW5pdCBoYXMgYmVlbiBkb25lIGluIGFuIGVtcHR5IHJlcG9zaXRvcnkuCisjIG1ha2Ugc3VyZSBpdCBpcyBlbXB0eS4KKworZmluZCAuZ2l0L29iamVjdHMgLXR5cGUgZiAtcHJpbnQgPnNob3VsZC1iZS1lbXB0eQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJy5naXQvb2JqZWN0cyBzaG91bGQgYmUgZW1wdHkgYWZ0ZXIgZ2l0IGluaXQgaW4gYW4gZW1wdHkgcmVwby4nIFwKKyAgICAnY21wIC1zIC9kZXYvbnVsbCBzaG91bGQtYmUtZW1wdHknCisKKyMgYWxzbyBpdCBzaG91bGQgaGF2ZSAyIHN1YmRpcmVjdG9yaWVzOyBubyBmYW4tb3V0IGFueW1vcmUsIHBhY2ssIGFuZCBpbmZvLgorIyAzIGlzIGNvdW50aW5nICJvYmplY3RzIiBpdHNlbGYKK2ZpbmQgLmdpdC9vYmplY3RzIC10eXBlIGQgLXByaW50ID5mdWxsLW9mLWRpcmVjdG9yaWVzCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnLmdpdC9vYmplY3RzIHNob3VsZCBoYXZlIDMgc3ViZGlyZWN0b3JpZXMuJyBcCisgICAgJ3Rlc3QgJCh3YyAtbCA8IGZ1bGwtb2YtZGlyZWN0b3JpZXMpID0gMycKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUZXN0IGhhcm5lc3MKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N1Y2Nlc3MgaXMgcmVwb3J0ZWQgbGlrZSB0aGlzJyAnCisgICAgOgorJwordGVzdF9leHBlY3RfZmFpbHVyZSAncHJldGVuZCB3ZSBoYXZlIGEga25vd24gYnJlYWthZ2UnICcKKyAgICBmYWxzZQorJwordGVzdF9leHBlY3RfZmFpbHVyZSAncHJldGVuZCB3ZSBoYXZlIGZpeGVkIGEga25vd24gYnJlYWthZ2UnICcKKyAgICA6CisnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmFzaWNzIG9mIHRoZSBiYXNpY3MKKworIyB1cGRhdGluZyBhIG5ldyBmaWxlIHdpdGhvdXQgLS1hZGQgc2hvdWxkIGZhaWwuCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgdXBkYXRlLWluZGV4IHdpdGhvdXQgLS1hZGQgc2hvdWxkIGZhaWwgYWRkaW5nLicgJworICAgICEgZ2l0IHVwZGF0ZS1pbmRleCBzaG91bGQtYmUtZW1wdHkKKycKKworIyBhbmQgd2l0aCAtLWFkZCBpdCBzaG91bGQgc3VjY2VlZCwgZXZlbiBpZiBpdCBpcyBlbXB0eSAoaXQgdXNlZCB0byBmYWlsKS4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgdXBkYXRlLWluZGV4IHdpdGggLS1hZGQgc2hvdWxkIHN1Y2NlZWQuJyBcCisgICAgJ2dpdCB1cGRhdGUtaW5kZXggLS1hZGQgc2hvdWxkLWJlLWVtcHR5JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnd3JpdGluZyB0cmVlIG91dCB3aXRoIGdpdCB3cml0ZS10cmVlJyBcCisgICAgJ3RyZWU9JChnaXQgd3JpdGUtdHJlZSknCisKKyMgd2Uga25vdyB0aGUgc2hhcGUgYW5kIGNvbnRlbnRzIG9mIHRoZSB0cmVlIGFuZCBrbm93IHRoZSBvYmplY3QgSUQgZm9yIGl0LgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG9iamVjdCBJRCBvZiBhIGtub3duIHRyZWUuJyBcCisgICAgJ3Rlc3QgIiR0cmVlIiA9IDdiYjk0MzU1OWEzMDViZGQ2YmRlZTJjZWY2ZTVkZjI0MTNjM2QzMGEnCisKKyMgUmVtb3ZpbmcgcGF0aHMuCitybSAtZiBzaG91bGQtYmUtZW1wdHkgZnVsbC1vZi1kaXJlY3RvcmllcwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IHVwZGF0ZS1pbmRleCB3aXRob3V0IC0tcmVtb3ZlIHNob3VsZCBmYWlsIHJlbW92aW5nLicgJworICAgICEgZ2l0IHVwZGF0ZS1pbmRleCBzaG91bGQtYmUtZW1wdHkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCB1cGRhdGUtaW5kZXggd2l0aCAtLXJlbW92ZSBzaG91bGQgYmUgYWJsZSB0byByZW1vdmUuJyBcCisgICAgJ2dpdCB1cGRhdGUtaW5kZXggLS1yZW1vdmUgc2hvdWxkLWJlLWVtcHR5JworCisjIEVtcHR5IHRyZWUgY2FuIGJlIHdyaXR0ZW4gd2l0aCByZWNlbnQgd3JpdGUtdHJlZS4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgd3JpdGUtdHJlZSBzaG91bGQgYmUgYWJsZSB0byB3cml0ZSBhbiBlbXB0eSB0cmVlLicgXAorICAgICd0cmVlPSQoZ2l0IHdyaXRlLXRyZWUpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgb2JqZWN0IElEIG9mIGEga25vd24gdHJlZS4nIFwKKyAgICAndGVzdCAiJHRyZWUiID0gNGI4MjVkYzY0MmNiNmViOWEwNjBlNTRiZjhkNjkyODhmYmVlNDkwNCcKKworIyBWYXJpb3VzIHR5cGVzIG9mIG9iamVjdHMKK21rZGlyIHBhdGgyIHBhdGgzIHBhdGgzL3N1YnAzCitmb3IgcCBpbiBwYXRoMCBwYXRoMi9maWxlMiBwYXRoMy9maWxlMyBwYXRoMy9zdWJwMy9maWxlMworZG8KKyAgICBlY2hvICJoZWxsbyAkcCIgPiRwCisgICAgbG4gLXMgImhlbGxvICRwIiAke3B9c3ltCitkb25lCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnYWRkaW5nIHZhcmlvdXMgdHlwZXMgb2Ygb2JqZWN0cyB3aXRoIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQuJyBcCisgICAgJ2ZpbmQgcGF0aCogISAtdHlwZSBkIC1wcmludCB8IHhhcmdzIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQnCisKKyMgU2hvdyB0aGVtIGFuZCBzZWUgdGhhdCBtYXRjaGVzIHdoYXQgd2UgZXhwZWN0LgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3Nob3dpbmcgc3RhZ2Ugd2l0aCBnaXQgbHMtZmlsZXMgLS1zdGFnZScgXAorICAgICdnaXQgbHMtZmlsZXMgLS1zdGFnZSA+Y3VycmVudCcKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzEwMDY0NCBmODcyOTBmOGViMmNiYmVhNzg1NzIxNDQ1OWEwNzM5OTI3ZWFiMTU0IDAJcGF0aDAKKzEyMDAwMCAxNWE5ODQzM2FlMzMxMTRiMDg1ZjNlYjNiYjAzYjgzMmIzMTgwYTAxIDAJcGF0aDBzeW0KKzEwMDY0NCAzZmVmZjk0OWVkMDBhNjJkOWY3YWY5N2MxNWNkOGEzMDU5NWU3YWM3IDAJcGF0aDIvZmlsZTIKKzEyMDAwMCBkOGNlMTYxYWRkYzUxNzM4NjdhM2MzYzczMDkyNDM4OGRhZWRiYzM4IDAJcGF0aDIvZmlsZTJzeW0KKzEwMDY0NCAwYWEzNGNhZTY4ZDA4Nzg1NzhhZDExOWM4NmNhMmI1ZWQ1YjI4Mzc2IDAJcGF0aDMvZmlsZTMKKzEyMDAwMCA4NTk5MTAzOTY5YjQzYWZmN2U0MzBlZmVhNzljYTQ2MzY0NjY3OTRmIDAJcGF0aDMvZmlsZTNzeW0KKzEwMDY0NCAwMGZiNTkwOGNiOTdjMjU2NGE5NzgzYzBjNjQwODczMzNiM2I0NjRmIDAJcGF0aDMvc3VicDMvZmlsZTMKKzEyMDAwMCA2NjQ5YTFlYmU5ZTlmMWM1NTNiNjZmNWE2ZTc0MTM2YTA3Y2NjNTdjIDAJcGF0aDMvc3VicDMvZmlsZTNzeW0KK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIGdpdCBscy1maWxlcyBvdXRwdXQgZm9yIGEga25vd24gdHJlZS4nIFwKKyAgICAnZGlmZiBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnd3JpdGluZyB0cmVlIG91dCB3aXRoIGdpdCB3cml0ZS10cmVlLicgXAorICAgICd0cmVlPSQoZ2l0IHdyaXRlLXRyZWUpJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG9iamVjdCBJRCBmb3IgYSBrbm93biB0cmVlLicgXAorICAgICd0ZXN0ICIkdHJlZSIgPSAwODc3MDRhOTZiYWYxYzJkMWM4NjlhOGIwODQ0ODFlMTIxYzg4YjViJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc2hvd2luZyB0cmVlIHdpdGggZ2l0IGxzLXRyZWUnIFwKKyAgICAnZ2l0IGxzLXRyZWUgJHRyZWUgPmN1cnJlbnQnCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorMTAwNjQ0IGJsb2IgZjg3MjkwZjhlYjJjYmJlYTc4NTcyMTQ0NTlhMDczOTkyN2VhYjE1NAlwYXRoMAorMTIwMDAwIGJsb2IgMTVhOTg0MzNhZTMzMTE0YjA4NWYzZWIzYmIwM2I4MzJiMzE4MGEwMQlwYXRoMHN5bQorMDQwMDAwIHRyZWUgNThhMDljMjNlMmNhMTUyMTkzZjI3ODZlMDY5ODZiN2I2NzEyYmRiZQlwYXRoMgorMDQwMDAwIHRyZWUgMjFhZTgyNjljYWNiZTU3YWUwOTEzOGRjYzNhMjg4N2Y5MDRkMDJiMwlwYXRoMworRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0IGxzLXRyZWUgb3V0cHV0IGZvciBhIGtub3duIHRyZWUuJyBcCisgICAgJ2RpZmYgY3VycmVudCBleHBlY3RlZCcKKworIyBUaGlzIGNoYW5nZWQgaW4gbHMtdHJlZSBwYXRoc3BlYyBjaGFuZ2UgLS0gcmVjdXJzaXZlIGRvZXMKKyMgbm90IHNob3cgdHJlZSBub2RlcyBhbnltb3JlLgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3Nob3dpbmcgdHJlZSB3aXRoIGdpdCBscy10cmVlIC1yJyBcCisgICAgJ2dpdCBscy10cmVlIC1yICR0cmVlID5jdXJyZW50JworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzEwMDY0NCBibG9iIGY4NzI5MGY4ZWIyY2JiZWE3ODU3MjE0NDU5YTA3Mzk5MjdlYWIxNTQJcGF0aDAKKzEyMDAwMCBibG9iIDE1YTk4NDMzYWUzMzExNGIwODVmM2ViM2JiMDNiODMyYjMxODBhMDEJcGF0aDBzeW0KKzEwMDY0NCBibG9iIDNmZWZmOTQ5ZWQwMGE2MmQ5ZjdhZjk3YzE1Y2Q4YTMwNTk1ZTdhYzcJcGF0aDIvZmlsZTIKKzEyMDAwMCBibG9iIGQ4Y2UxNjFhZGRjNTE3Mzg2N2EzYzNjNzMwOTI0Mzg4ZGFlZGJjMzgJcGF0aDIvZmlsZTJzeW0KKzEwMDY0NCBibG9iIDBhYTM0Y2FlNjhkMDg3ODU3OGFkMTE5Yzg2Y2EyYjVlZDViMjgzNzYJcGF0aDMvZmlsZTMKKzEyMDAwMCBibG9iIDg1OTkxMDM5NjliNDNhZmY3ZTQzMGVmZWE3OWNhNDYzNjQ2Njc5NGYJcGF0aDMvZmlsZTNzeW0KKzEwMDY0NCBibG9iIDAwZmI1OTA4Y2I5N2MyNTY0YTk3ODNjMGM2NDA4NzMzM2IzYjQ2NGYJcGF0aDMvc3VicDMvZmlsZTMKKzEyMDAwMCBibG9iIDY2NDlhMWViZTllOWYxYzU1M2I2NmY1YTZlNzQxMzZhMDdjY2M1N2MJcGF0aDMvc3VicDMvZmlsZTNzeW0KK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBscy10cmVlIC1yIG91dHB1dCBmb3IgYSBrbm93biB0cmVlLicgXAorICAgICdkaWZmIGN1cnJlbnQgZXhwZWN0ZWQnCisKKyMgQnV0IHdpdGggLXIgLXQgd2UgY2FuIGhhdmUgYm90aC4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzaG93aW5nIHRyZWUgd2l0aCBnaXQgbHMtdHJlZSAtciAtdCcgXAorICAgICdnaXQgbHMtdHJlZSAtciAtdCAkdHJlZSA+Y3VycmVudCcKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCisxMDA2NDQgYmxvYiBmODcyOTBmOGViMmNiYmVhNzg1NzIxNDQ1OWEwNzM5OTI3ZWFiMTU0CXBhdGgwCisxMjAwMDAgYmxvYiAxNWE5ODQzM2FlMzMxMTRiMDg1ZjNlYjNiYjAzYjgzMmIzMTgwYTAxCXBhdGgwc3ltCiswNDAwMDAgdHJlZSA1OGEwOWMyM2UyY2ExNTIxOTNmMjc4NmUwNjk4NmI3YjY3MTJiZGJlCXBhdGgyCisxMDA2NDQgYmxvYiAzZmVmZjk0OWVkMDBhNjJkOWY3YWY5N2MxNWNkOGEzMDU5NWU3YWM3CXBhdGgyL2ZpbGUyCisxMjAwMDAgYmxvYiBkOGNlMTYxYWRkYzUxNzM4NjdhM2MzYzczMDkyNDM4OGRhZWRiYzM4CXBhdGgyL2ZpbGUyc3ltCiswNDAwMDAgdHJlZSAyMWFlODI2OWNhY2JlNTdhZTA5MTM4ZGNjM2EyODg3ZjkwNGQwMmIzCXBhdGgzCisxMDA2NDQgYmxvYiAwYWEzNGNhZTY4ZDA4Nzg1NzhhZDExOWM4NmNhMmI1ZWQ1YjI4Mzc2CXBhdGgzL2ZpbGUzCisxMjAwMDAgYmxvYiA4NTk5MTAzOTY5YjQzYWZmN2U0MzBlZmVhNzljYTQ2MzY0NjY3OTRmCXBhdGgzL2ZpbGUzc3ltCiswNDAwMDAgdHJlZSAzYzVlNTM5OWYzYTMzM2VkZGVjY2U3YTliOTQ2NWI2M2Y2NWY1MWUyCXBhdGgzL3N1YnAzCisxMDA2NDQgYmxvYiAwMGZiNTkwOGNiOTdjMjU2NGE5NzgzYzBjNjQwODczMzNiM2I0NjRmCXBhdGgzL3N1YnAzL2ZpbGUzCisxMjAwMDAgYmxvYiA2NjQ5YTFlYmU5ZTlmMWM1NTNiNjZmNWE2ZTc0MTM2YTA3Y2NjNTdjCXBhdGgzL3N1YnAzL2ZpbGUzc3ltCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgbHMtdHJlZSAtciBvdXRwdXQgZm9yIGEga25vd24gdHJlZS4nIFwKKyAgICAnZGlmZiBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnd3JpdGluZyBwYXJ0aWFsIHRyZWUgb3V0IHdpdGggZ2l0IHdyaXRlLXRyZWUgLS1wcmVmaXguJyBcCisgICAgJ3B0cmVlPSQoZ2l0IHdyaXRlLXRyZWUgLS1wcmVmaXg9cGF0aDMpJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG9iamVjdCBJRCBmb3IgYSBrbm93biB0cmVlLicgXAorICAgICd0ZXN0ICIkcHRyZWUiID0gMjFhZTgyNjljYWNiZTU3YWUwOTEzOGRjYzNhMjg4N2Y5MDRkMDJiMycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3dyaXRpbmcgcGFydGlhbCB0cmVlIG91dCB3aXRoIGdpdCB3cml0ZS10cmVlIC0tcHJlZml4LicgXAorICAgICdwdHJlZT0kKGdpdCB3cml0ZS10cmVlIC0tcHJlZml4PXBhdGgzL3N1YnAzKScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBvYmplY3QgSUQgZm9yIGEga25vd24gdHJlZS4nIFwKKyAgICAndGVzdCAiJHB0cmVlIiA9IDNjNWU1Mzk5ZjNhMzMzZWRkZWNjZTdhOWI5NDY1YjYzZjY1ZjUxZTInCisKK2NhdCA+YmFkb2JqZWN0cyA8PEVPRgorMTAwNjQ0IGJsb2IgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAlkaXIvZmlsZTEKKzEwMDY0NCBibG9iIDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAJZGlyL2ZpbGUyCisxMDA2NDQgYmxvYiAzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCWRpci9maWxlMworMTAwNjQ0IGJsb2IgNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAlkaXIvZmlsZTQKKzEwMDY0NCBibG9iIDUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAJZGlyL2ZpbGU1CitFT0YKKworcm0gLmdpdC9pbmRleAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3B1dCBpbnZhbGlkIG9iamVjdHMgaW50byB0aGUgaW5kZXguJyBcCisgICAgJ2dpdCB1cGRhdGUtaW5kZXggLS1pbmRleC1pbmZvIDwgYmFkb2JqZWN0cycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnd3JpdGluZyB0aGlzIHRyZWUgd2l0aG91dCAtLW1pc3Npbmctb2suJyAnCisgICAgISBnaXQgd3JpdGUtdHJlZQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnd3JpdGluZyB0aGlzIHRyZWUgd2l0aCAtLW1pc3Npbmctb2suJyBcCisgICAgJ2dpdCB3cml0ZS10cmVlIC0tbWlzc2luZy1vaycKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitybSAuZ2l0L2luZGV4Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0IHJlYWQtdHJlZSBmb2xsb3dlZCBieSB3cml0ZS10cmVlIHNob3VsZCBiZSBpZGVtcG90ZW50LicgXAorICAgICdnaXQgcmVhZC10cmVlICR0cmVlICYmCisgICAgIHRlc3QgLWYgLmdpdC9pbmRleCAmJgorICAgICBuZXd0cmVlPSQoZ2l0IHdyaXRlLXRyZWUpICYmCisgICAgIHRlc3QgIiRuZXd0cmVlIiA9ICIkdHJlZSInCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCBmODcyOTBmOGViMmNiYmVhNzg1NzIxNDQ1OWEwNzM5OTI3ZWFiMTU0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgTQlwYXRoMAorOjEyMDAwMCAxMjAwMDAgMTVhOTg0MzNhZTMzMTE0YjA4NWYzZWIzYmIwM2I4MzJiMzE4MGEwMSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIE0JcGF0aDBzeW0KKzoxMDA2NDQgMTAwNjQ0IDNmZWZmOTQ5ZWQwMGE2MmQ5ZjdhZjk3YzE1Y2Q4YTMwNTk1ZTdhYzcgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBNCXBhdGgyL2ZpbGUyCis6MTIwMDAwIDEyMDAwMCBkOGNlMTYxYWRkYzUxNzM4NjdhM2MzYzczMDkyNDM4OGRhZWRiYzM4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgTQlwYXRoMi9maWxlMnN5bQorOjEwMDY0NCAxMDA2NDQgMGFhMzRjYWU2OGQwODc4NTc4YWQxMTljODZjYTJiNWVkNWIyODM3NiAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIE0JcGF0aDMvZmlsZTMKKzoxMjAwMDAgMTIwMDAwIDg1OTkxMDM5NjliNDNhZmY3ZTQzMGVmZWE3OWNhNDYzNjQ2Njc5NGYgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBNCXBhdGgzL2ZpbGUzc3ltCis6MTAwNjQ0IDEwMDY0NCAwMGZiNTkwOGNiOTdjMjU2NGE5NzgzYzBjNjQwODczMzNiM2I0NjRmIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgTQlwYXRoMy9zdWJwMy9maWxlMworOjEyMDAwMCAxMjAwMDAgNjY0OWExZWJlOWU5ZjFjNTUzYjY2ZjVhNmU3NDEzNmEwN2NjYzU3YyAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIE0JcGF0aDMvc3VicDMvZmlsZTNzeW0KK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIGdpdCBkaWZmLWZpbGVzIG91dHB1dCBmb3IgYSBrbm93IGNhY2hlL3dvcmsgdHJlZSBzdGF0ZS4nIFwKKyAgICAnZ2l0IGRpZmYtZmlsZXMgPmN1cnJlbnQgJiYgZGlmZiA+L2Rldi9udWxsIC1iIGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgdXBkYXRlLWluZGV4IC0tcmVmcmVzaCBzaG91bGQgc3VjY2VlZC4nIFwKKyAgICAnZ2l0IHVwZGF0ZS1pbmRleCAtLXJlZnJlc2gnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdubyBkaWZmIGFmdGVyIGNoZWNrb3V0IGFuZCBnaXQgdXBkYXRlLWluZGV4IC0tcmVmcmVzaC4nIFwKKyAgICAnZ2l0IGRpZmYtZmlsZXMgPmN1cnJlbnQgJiYgY21wIC1zIGN1cnJlbnQgL2Rldi9udWxsJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitQPTA4NzcwNGE5NmJhZjFjMmQxYzg2OWE4YjA4NDQ4MWUxMjFjODhiNWIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgY29tbWl0LXRyZWUgcmVjb3JkcyB0aGUgY29ycmVjdCB0cmVlIGluIGEgY29tbWl0LicgXAorICAgICdjb21taXQwPSQoZWNobyBOTyB8IGdpdCBjb21taXQtdHJlZSAkUCkgJiYKKyAgICAgdHJlZT0kKGdpdCBzaG93IC0tcHJldHR5PXJhdyAkY29tbWl0MCB8CisJIHNlZCAtbiAtZSAicy9edHJlZSAvL3AiIC1lICIvXmF1dGhvciAvcSIpICYmCisgICAgIHRlc3QgInokdHJlZSIgPSAieiRQIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBjb21taXQtdHJlZSByZWNvcmRzIHRoZSBjb3JyZWN0IHBhcmVudCBpbiBhIGNvbW1pdC4nIFwKKyAgICAnY29tbWl0MT0kKGVjaG8gTk8gfCBnaXQgY29tbWl0LXRyZWUgJFAgLXAgJGNvbW1pdDApICYmCisgICAgIHBhcmVudD0kKGdpdCBzaG93IC0tcHJldHR5PXJhdyAkY29tbWl0MSB8CisJIHNlZCAtbiAtZSAicy9ecGFyZW50IC8vcCIgLWUgIi9eYXV0aG9yIC9xIikgJiYKKyAgICAgdGVzdCAieiRjb21taXQwIiA9ICJ6JHBhcmVudCInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgY29tbWl0LXRyZWUgb21pdHMgZHVwbGljYXRlZCBwYXJlbnQgaW4gYSBjb21taXQuJyBcCisgICAgJ2NvbW1pdDI9JChlY2hvIE5PIHwgZ2l0IGNvbW1pdC10cmVlICRQIC1wICRjb21taXQwIC1wICRjb21taXQwKSAmJgorICAgICBwYXJlbnQ9JChnaXQgc2hvdyAtLXByZXR0eT1yYXcgJGNvbW1pdDIgfAorCSBzZWQgLW4gLWUgInMvXnBhcmVudCAvL3AiIC1lICIvXmF1dGhvciAvcSIgfAorCSBzb3J0IC11KSAmJgorICAgICB0ZXN0ICJ6JGNvbW1pdDAiID0gInokcGFyZW50IiAmJgorICAgICBudW1wYXJlbnQ9JChnaXQgc2hvdyAtLXByZXR0eT1yYXcgJGNvbW1pdDIgfAorCSBzZWQgLW4gLWUgInMvXnBhcmVudCAvL3AiIC1lICIvXmF1dGhvciAvcSIgfAorCSB3YyAtbCkgJiYKKyAgICAgdGVzdCAkbnVtcGFyZW50ID0gMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBkYXRlLWluZGV4IEQvRiBjb25mbGljdCcgJworCW12IHBhdGgwIHRtcCAmJgorCW12IHBhdGgyIHBhdGgwICYmCisJbXYgdG1wIHBhdGgyICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlcGxhY2UgcGF0aDIgcGF0aDAvZmlsZTIgJiYKKwludW1wYXRoMD0kKGdpdCBscy1maWxlcyBwYXRoMCB8IHdjIC1sKSAmJgorCXRlc3QgJG51bXBhdGgwID0gMQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhYnNvbHV0ZSBwYXRoIHdvcmtzIGFzIGV4cGVjdGVkJyAnCisJbWtkaXIgZmlyc3QgJiYKKwlsbiAtcyAuLi8uZ2l0IGZpcnN0Ly5naXQgJiYKKwlta2RpciBzZWNvbmQgJiYKKwlsbiAtcyAuLi9maXJzdCBzZWNvbmQvb3RoZXIgJiYKKwlta2RpciB0aGlyZCAmJgorCWRpcj0iJChjZCAuZ2l0OyBwd2QgLVApIiAmJgorCWRpcjI9dGhpcmQvLi4vc2Vjb25kL290aGVyLy5naXQgJiYKKwl0ZXN0ICIkZGlyIiA9ICIkKHRlc3QtYWJzb2x1dGUtcGF0aCAkZGlyMikiICYmCisJZmlsZT0iJGRpciIvaW5kZXggJiYKKwl0ZXN0ICIkZmlsZSIgPSAiJCh0ZXN0LWFic29sdXRlLXBhdGggJGRpcjIvaW5kZXgpIiAmJgorCWJhc2VuYW1lPWJsdWIgJiYKKwl0ZXN0ICIkZGlyLyRiYXNlbmFtZSIgPSAkKGNkIC5naXQgJiYgdGVzdC1hYnNvbHV0ZS1wYXRoICRiYXNlbmFtZSkgJiYKKwlsbiAtcyAuLi9maXJzdC9maWxlIC5naXQvc3ltbCAmJgorCXN5bT0iJChjZCBmaXJzdDsgcHdkIC1QKSIvZmlsZSAmJgorCXRlc3QgIiRzeW0iID0gIiQodGVzdC1hYnNvbHV0ZS1wYXRoICRkaXIyL3N5bWwpIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd2ZXJ5IGxvbmcgbmFtZSBpbiB0aGUgaW5kZXggaGFuZGxlZCBzYW5lbHknICcKKworCWE9YSAmJiAjIDEKKwlhPSRhJGEkYSRhJGEkYSRhJGEkYSRhJGEkYSRhJGEkYSRhICYmICMgMTYKKwlhPSRhJGEkYSRhJGEkYSRhJGEkYSRhJGEkYSRhJGEkYSRhICYmICMgMjU2CisJYT0kYSRhJGEkYSRhJGEkYSRhJGEkYSRhJGEkYSRhJGEkYSAmJiAjIDQwOTYKKwlhPSR7YX1xICYmCisKKwk+cGF0aDQgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIHBhdGg0ICYmCisJKAorCQlnaXQgbHMtZmlsZXMgLXMgcGF0aDQgfAorCQlzZWQgLWUgInMvCS4qLwkvIiB8CisJCXRyIC1kICJcMDEyIgorCQllY2hvICIkYSIKKwkpIHwgZ2l0IHVwZGF0ZS1pbmRleCAtLWluZGV4LWluZm8gJiYKKwlsZW49JChnaXQgbHMtZmlsZXMgImEqIiB8IHdjIC1jKSAmJgorCXRlc3QgJGxlbiA9IDQwOTgKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QwMDAxLWluaXQuc2ggYi90L3QwMDAxLWluaXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjAyODllMwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDAwMDEtaW5pdC5zaApAQCAtMCwwICsxLDEzMyBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBpbml0JworCisuIC4vdGVzdC1saWIuc2gKKworY2hlY2tfY29uZmlnICgpIHsKKwlpZiB0ZXN0IC1kICIkMSIgJiYgdGVzdCAtZiAiJDEvY29uZmlnIiAmJiB0ZXN0IC1kICIkMS9yZWZzIgorCXRoZW4KKwkJOiBoYXBweQorCWVsc2UKKwkJZWNobyAiZXhwZWN0ZWQgYSBkaXJlY3RvcnkgJDEsIGEgZmlsZSAkMS9jb25maWcgYW5kICQxL3JlZnMiCisJCXJldHVybiAxCisJZmkKKwliYXJlPSQoR0lUX0NPTkZJRz0iJDEvY29uZmlnIiBnaXQgY29uZmlnIC0tYm9vbCBjb3JlLmJhcmUpCisJd29ya3RyZWU9JChHSVRfQ09ORklHPSIkMS9jb25maWciIGdpdCBjb25maWcgY29yZS53b3JrdHJlZSkgfHwKKwl3b3JrdHJlZT11bnNldAorCisJdGVzdCAiJGJhcmUiID0gIiQyIiAmJiB0ZXN0ICIkd29ya3RyZWUiID0gIiQzIiB8fCB7CisJCWVjaG8gImV4cGVjdGVkIGJhcmU9JDIgd29ya3RyZWU9JDMiCisJCWVjaG8gIiAgICAgZ290IGJhcmU9JGJhcmUgd29ya3RyZWU9JHdvcmt0cmVlIgorCQlyZXR1cm4gMQorCX0KK30KKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncGxhaW4nICcKKwkoCisJCXVuc2V0IEdJVF9ESVIgR0lUX1dPUktfVFJFRQorCQlta2RpciBwbGFpbiAmJgorCQljZCBwbGFpbiAmJgorCQlnaXQgaW5pdAorCSkgJiYKKwljaGVja19jb25maWcgcGxhaW4vLmdpdCBmYWxzZSB1bnNldAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwbGFpbiB3aXRoIEdJVF9XT1JLX1RSRUUnICcKKwlpZiAoCisJCXVuc2V0IEdJVF9ESVIKKwkJbWtkaXIgcGxhaW4td3QgJiYKKwkJY2QgcGxhaW4td3QgJiYKKwkJR0lUX1dPUktfVFJFRT0kKHB3ZCkgZ2l0IGluaXQKKwkpCisJdGhlbgorCQllY2hvIFNob3VsZCBoYXZlIGZhaWxlZCAtLSBHSVRfV09SS19UUkVFIHNob3VsZCBub3QgYmUgdXNlZAorCQlmYWxzZQorCWZpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3BsYWluIGJhcmUnICcKKwkoCisJCXVuc2V0IEdJVF9ESVIgR0lUX1dPUktfVFJFRSBHSVRfQ09ORklHCisJCW1rZGlyIHBsYWluLWJhcmUtMSAmJgorCQljZCBwbGFpbi1iYXJlLTEgJiYKKwkJZ2l0IC0tYmFyZSBpbml0CisJKSAmJgorCWNoZWNrX2NvbmZpZyBwbGFpbi1iYXJlLTEgdHJ1ZSB1bnNldAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwbGFpbiBiYXJlIHdpdGggR0lUX1dPUktfVFJFRScgJworCWlmICgKKwkJdW5zZXQgR0lUX0RJUiBHSVRfQ09ORklHCisJCW1rZGlyIHBsYWluLWJhcmUtMiAmJgorCQljZCBwbGFpbi1iYXJlLTIgJiYKKwkJR0lUX1dPUktfVFJFRT0kKHB3ZCkgZ2l0IC0tYmFyZSBpbml0CisJKQorCXRoZW4KKwkJZWNobyBTaG91bGQgaGF2ZSBmYWlsZWQgLS0gR0lUX1dPUktfVFJFRSBzaG91bGQgbm90IGJlIHVzZWQKKwkJZmFsc2UKKwlmaQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdHSVRfRElSIGJhcmUnICcKKworCSgKKwkJdW5zZXQgR0lUX0NPTkZJRworCQlta2RpciBnaXQtZGlyLWJhcmUuZ2l0ICYmCisJCUdJVF9ESVI9Z2l0LWRpci1iYXJlLmdpdCBnaXQgaW5pdAorCSkgJiYKKwljaGVja19jb25maWcgZ2l0LWRpci1iYXJlLmdpdCB0cnVlIHVuc2V0CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ0dJVF9ESVIgbm9uLWJhcmUnICcKKworCSgKKwkJdW5zZXQgR0lUX0NPTkZJRworCQlta2RpciBub24tYmFyZSAmJgorCQljZCBub24tYmFyZSAmJgorCQlHSVRfRElSPS5naXQgZ2l0IGluaXQKKwkpICYmCisJY2hlY2tfY29uZmlnIG5vbi1iYXJlLy5naXQgZmFsc2UgdW5zZXQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnR0lUX0RJUiAmIEdJVF9XT1JLX1RSRUUgKDEpJyAnCisKKwkoCisJCXVuc2V0IEdJVF9DT05GSUcKKwkJbWtkaXIgZ2l0LWRpci13dC0xLmdpdCAmJgorCQlHSVRfV09SS19UUkVFPSQocHdkKSBHSVRfRElSPWdpdC1kaXItd3QtMS5naXQgZ2l0IGluaXQKKwkpICYmCisJY2hlY2tfY29uZmlnIGdpdC1kaXItd3QtMS5naXQgZmFsc2UgIiQocHdkKSIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnR0lUX0RJUiAmIEdJVF9XT1JLX1RSRUUgKDIpJyAnCisKKwlpZiAoCisJCXVuc2V0IEdJVF9DT05GSUcKKwkJbWtkaXIgZ2l0LWRpci13dC0yLmdpdCAmJgorCQlHSVRfV09SS19UUkVFPSQocHdkKSBHSVRfRElSPWdpdC1kaXItd3QtMi5naXQgZ2l0IC0tYmFyZSBpbml0CisJKQorCXRoZW4KKwkJZWNobyBTaG91bGQgaGF2ZSBmYWlsZWQgLS0gLS1iYXJlIHNob3VsZCBub3QgYmUgdXNlZAorCQlmYWxzZQorCWZpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlaW5pdCcgJworCisJKAorCQl1bnNldCBHSVRfQ09ORklHIEdJVF9XT1JLX1RSRUUgR0lUX0NPTkZJRworCisJCW1rZGlyIGFnYWluICYmCisJCWNkIGFnYWluICYmCisJCWdpdCBpbml0ID5vdXQxIDI+ZXJyMSAmJgorCQlnaXQgaW5pdCA+b3V0MiAyPmVycjIKKwkpICYmCisJZ3JlcCAiSW5pdGlhbGl6ZWQgZW1wdHkiIGFnYWluL291dDEgJiYKKwlncmVwICJSZWluaXRpYWxpemVkIGV4aXN0aW5nIiBhZ2Fpbi9vdXQyICYmCisJPmFnYWluL2VtcHR5ICYmCisJdGVzdF9jbXAgYWdhaW4vZW1wdHkgYWdhaW4vZXJyMSAmJgorCXRlc3RfY21wIGFnYWluL2VtcHR5IGFnYWluL2VycjIKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QwMDAzLWF0dHJpYnV0ZXMuc2ggYi90L3QwMDAzLWF0dHJpYnV0ZXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2ZhZjEzNQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDAwMDMtYXR0cmlidXRlcy5zaApAQCAtMCwwICsxLDQ5IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj1naXRhdHRyaWJ1dGVzCisKKy4gLi90ZXN0LWxpYi5zaAorCithdHRyX2NoZWNrICgpIHsKKworCXBhdGg9IiQxIgorCWV4cGVjdD0iJDIiCisKKwlnaXQgY2hlY2stYXR0ciB0ZXN0IC0tICIkcGF0aCIgPmFjdHVhbCAmJgorCWVjaG8gIiRwYXRoOiB0ZXN0OiAkMiIgPmV4cGVjdCAmJgorCXRlc3RfY21wIGV4cGVjdCBhY3R1YWwKKworfQorCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NldHVwJyAnCisKKwlta2RpciAtcCBhL2IvZCBhL2MgJiYKKwkoCisJCWVjaG8gImYJdGVzdD1mIgorCSkgPi5naXRhdHRyaWJ1dGVzICYmCisJKAorCQllY2hvICJnIHRlc3Q9YS9nIiAmJgorCQllY2hvICJiL2cgdGVzdD1hL2IvZyIKKwkpID5hLy5naXRhdHRyaWJ1dGVzICYmCisJKAorCQllY2hvICJoIHRlc3Q9YS9iL2giICYmCisJCWVjaG8gImQvKiB0ZXN0PWEvYi9kLyoiCisJKSA+YS9iLy5naXRhdHRyaWJ1dGVzCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXR0cmlidXRlIHRlc3QnICcKKworCWF0dHJfY2hlY2sgZiBmICYmCisJYXR0cl9jaGVjayBhL2YgZiAmJgorCWF0dHJfY2hlY2sgYS9jL2YgZiAmJgorCWF0dHJfY2hlY2sgYS9nIGEvZyAmJgorCWF0dHJfY2hlY2sgYS9iL2cgYS9iL2cgJiYKKwlhdHRyX2NoZWNrIGIvZyB1bnNwZWNpZmllZCAmJgorCWF0dHJfY2hlY2sgYS9iL2ggYS9iL2ggJiYKKwlhdHRyX2NoZWNrIGEvYi9kL2cgImEvYi9kLyoiCisKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QwMDEwLXJhY3ktZ2l0LnNoIGIvdC90MDAxMC1yYWN5LWdpdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNDVhOWU0Ci0tLSAvZGV2L251bGwKKysrIGIvdC90MDAxMC1yYWN5LWdpdC5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0ncmFjeSBHSVQnCisKKy4gLi90ZXN0LWxpYi5zaAorCisjIFRoaXMgdGVzdCBjYW4gZ2l2ZSBmYWxzZSBzdWNjZXNzIGlmIHlvdXIgbWFjaGluZSBpcyBzdWZmaWNpZW50bHkKKyMgc2xvdyBvciB5b3VyIHRyaWFsIGhhcHBlbmVkIHRvIGhhcHBlbiBvbiBzZWNvbmQgYm91bmRhcnkuCisKK2ZvciB0cmlhbCBpbiAwIDEgMiAzIDQKK2RvCisJcm0gLWYgLmdpdC9pbmRleAorCWVjaG8gZnJvdHogPmluZm9jb20KKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGluZm9jb20KKwllY2hvIHh5enp5ID5pbmZvY29tCisKKwlmaWxlcz1gZ2l0IGRpZmYtZmlsZXMgLXBgCisJdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJIlJhY3kgR0lUIHRyaWFsICMkdHJpYWwgcGFydCBBIiBcCisJJ3Rlc3QgIiIgIT0gIiRmaWxlcyInCisKKwlzbGVlcCAxCisJZWNobyB4eXp6eSA+Y29ybmVyc3RvbmUKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGNvcm5lcnN0b25lCisKKwlmaWxlcz1gZ2l0IGRpZmYtZmlsZXMgLXBgCisJdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJIlJhY3kgR0lUIHRyaWFsICMkdHJpYWwgcGFydCBCIiBcCisJJ3Rlc3QgIiIgIT0gIiRmaWxlcyInCisKK2RvbmUKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QwMDIwLWNybGYuc2ggYi90L3QwMDIwLWNybGYuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmJmZWFjOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDAwMjAtY3JsZi5zaApAQCAtMCwwICsxLDQzOSBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J0NSTEYgY29udmVyc2lvbicKKworLiAuL3Rlc3QtbGliLnNoCisKK3FfdG9fbnVsICgpIHsKKwlwZXJsIC1wZSAneS9RL1wwMDAvJworfQorCitxX3RvX2NyICgpIHsKKwl0ciBRICdcMDE1JworfQorCithcHBlbmRfY3IgKCkgeworCXNlZCAtZSAncy8kL1EvJyB8IHRyIFEgJ1wwMTUnCit9CisKK3JlbW92ZV9jciAoKSB7CisJdHIgJ1wwMTUnIFEgPCIkMSIgfCBncmVwIFEgPi9kZXYvbnVsbCAmJgorCXRyICdcMDE1JyBRIDwiJDEiIHwgc2VkIC1uZSAncy9RJC8vcCcKK30KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwlnaXQgY29uZmlnIGNvcmUuYXV0b2NybGYgZmFsc2UgJiYKKworCWZvciB3IGluIEhlbGxvIHdvcmxkIGhvdyBhcmUgeW91OyBkbyBlY2hvICR3OyBkb25lID5vbmUgJiYKKwlta2RpciBkaXIgJiYKKwlmb3IgdyBpbiBJIGFtIHZlcnkgdmVyeSBmaW5lIHRoYW5rIHlvdTsgZG8gZWNobyAkdzsgZG9uZSA+ZGlyL3R3byAmJgorCWZvciB3IGluIE9oIGhlcmUgaXMgTlVMUWluIHRleHQgaGVyZTsgZG8gZWNobyAkdzsgZG9uZSB8IHFfdG9fbnVsID50aHJlZSAmJgorCWdpdCBhZGQgLiAmJgorCisJZ2l0IGNvbW1pdCAtbSBpbml0aWFsICYmCisKKwlvbmU9YGdpdCByZXYtcGFyc2UgSEVBRDpvbmVgICYmCisJZGlyPWBnaXQgcmV2LXBhcnNlIEhFQUQ6ZGlyYCAmJgorCXR3bz1gZ2l0IHJldi1wYXJzZSBIRUFEOmRpci90d29gICYmCisJdGhyZWU9YGdpdCByZXYtcGFyc2UgSEVBRDp0aHJlZWAgJiYKKworCWZvciB3IGluIFNvbWUgZXh0cmEgbGluZXMgaGVyZTsgZG8gZWNobyAkdzsgZG9uZSA+Pm9uZSAmJgorCWdpdCBkaWZmID5wYXRjaC5maWxlICYmCisJcGF0Y2hlZD1gZ2l0IGhhc2gtb2JqZWN0IC0tc3RkaW4gPG9uZWAgJiYKKwlnaXQgcmVhZC10cmVlIC0tcmVzZXQgLXUgSEVBRCAmJgorCisJZWNobyBoYXBweS4KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2FmZWNybGY6IGF1dG9jcmxmPWlucHV0LCBhbGwgQ1JMRicgJworCisJZ2l0IGNvbmZpZyBjb3JlLmF1dG9jcmxmIGlucHV0ICYmCisJZ2l0IGNvbmZpZyBjb3JlLnNhZmVjcmxmIHRydWUgJiYKKworCWZvciB3IGluIEkgYW0gYWxsIENSTEY7IGRvIGVjaG8gJHc7IGRvbmUgfCBhcHBlbmRfY3IgPmFsbGNybGYgJiYKKwkhIGdpdCBhZGQgYWxsY3JsZgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzYWZlY3JsZjogYXV0b2NybGY9aW5wdXQsIG1peGVkIExGL0NSTEYnICcKKworCWdpdCBjb25maWcgY29yZS5hdXRvY3JsZiBpbnB1dCAmJgorCWdpdCBjb25maWcgY29yZS5zYWZlY3JsZiB0cnVlICYmCisKKwlmb3IgdyBpbiBPaCBoZXJlIGlzIENSTEZRIGluIHRleHQ7IGRvIGVjaG8gJHc7IGRvbmUgfCBxX3RvX2NyID5taXhlZCAmJgorCSEgZ2l0IGFkZCBtaXhlZAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzYWZlY3JsZjogYXV0b2NybGY9dHJ1ZSwgYWxsIExGJyAnCisKKwlnaXQgY29uZmlnIGNvcmUuYXV0b2NybGYgdHJ1ZSAmJgorCWdpdCBjb25maWcgY29yZS5zYWZlY3JsZiB0cnVlICYmCisKKwlmb3IgdyBpbiBJIGFtIGFsbCBMRjsgZG8gZWNobyAkdzsgZG9uZSA+YWxsbGYgJiYKKwkhIGdpdCBhZGQgYWxsbGYKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2FmZWNybGY6IGF1dG9jcmxmPXRydWUgbWl4ZWQgTEYvQ1JMRicgJworCisJZ2l0IGNvbmZpZyBjb3JlLmF1dG9jcmxmIHRydWUgJiYKKwlnaXQgY29uZmlnIGNvcmUuc2FmZWNybGYgdHJ1ZSAmJgorCisJZm9yIHcgaW4gT2ggaGVyZSBpcyBDUkxGUSBpbiB0ZXh0OyBkbyBlY2hvICR3OyBkb25lIHwgcV90b19jciA+bWl4ZWQgJiYKKwkhIGdpdCBhZGQgbWl4ZWQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2FmZWNybGY6IHByaW50IHdhcm5pbmcgb25seSBvbmNlJyAnCisKKwlnaXQgY29uZmlnIGNvcmUuYXV0b2NybGYgaW5wdXQgJiYKKwlnaXQgY29uZmlnIGNvcmUuc2FmZWNybGYgd2FybiAmJgorCisJZm9yIHcgaW4gSSBhbSBhbGwgTEY7IGRvIGVjaG8gJHc7IGRvbmUgPmRvdWJsZXdhcm4gJiYKKwlnaXQgYWRkIGRvdWJsZXdhcm4gJiYKKwlnaXQgY29tbWl0IC1tICJub3dhcm4iICYmCisJZm9yIHcgaW4gT2ggaGVyZSBpcyBDUkxGUSBpbiB0ZXh0OyBkbyBlY2hvICR3OyBkb25lIHwgcV90b19jciA+ZG91Ymxld2FybiAmJgorCXRlc3QgJChnaXQgYWRkIGRvdWJsZXdhcm4gMj4mMSB8IGdyZXAgIkNSTEYgd2lsbCBiZSByZXBsYWNlZCBieSBMRiIgfCB3YyAtbCkgPSAxCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N3aXRjaCBvZmYgYXV0b2NybGYsIHNhZmVjcmxmLCByZXNldCBIRUFEJyAnCisJZ2l0IGNvbmZpZyBjb3JlLmF1dG9jcmxmIGZhbHNlICYmCisJZ2l0IGNvbmZpZyBjb3JlLnNhZmVjcmxmIGZhbHNlICYmCisJZ2l0IHJlc2V0IC0taGFyZCBIRUFEXgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1cGRhdGUgd2l0aCBhdXRvY3JsZj1pbnB1dCcgJworCisJcm0gLWYgdG1wIG9uZSBkaXIvdHdvIHRocmVlICYmCisJZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IC11IEhFQUQgJiYKKwlnaXQgY29uZmlnIGNvcmUuYXV0b2NybGYgaW5wdXQgJiYKKworCWZvciBmIGluIG9uZSBkaXIvdHdvCisJZG8KKwkJYXBwZW5kX2NyIDwkZiA+dG1wICYmIG12IC1mIHRtcCAkZiAmJgorCQlnaXQgdXBkYXRlLWluZGV4IC0tICRmIHx8IHsKKwkJCWVjaG8gT29wcworCQkJZmFsc2UKKwkJCWJyZWFrCisJCX0KKwlkb25lICYmCisKKwlkaWZmZXJzPWBnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCBIRUFEYCAmJgorCXRlc3QgLXogIiRkaWZmZXJzIiB8fCB7CisJCWVjaG8gT29wcyAiJGRpZmZlcnMiCisJCWZhbHNlCisJfQorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VwZGF0ZSB3aXRoIGF1dG9jcmxmPXRydWUnICcKKworCXJtIC1mIHRtcCBvbmUgZGlyL3R3byB0aHJlZSAmJgorCWdpdCByZWFkLXRyZWUgLS1yZXNldCAtdSBIRUFEICYmCisJZ2l0IGNvbmZpZyBjb3JlLmF1dG9jcmxmIHRydWUgJiYKKworCWZvciBmIGluIG9uZSBkaXIvdHdvCisJZG8KKwkJYXBwZW5kX2NyIDwkZiA+dG1wICYmIG12IC1mIHRtcCAkZiAmJgorCQlnaXQgdXBkYXRlLWluZGV4IC0tICRmIHx8IHsKKwkJCWVjaG8gIk9vcHMgJGYiCisJCQlmYWxzZQorCQkJYnJlYWsKKwkJfQorCWRvbmUgJiYKKworCWRpZmZlcnM9YGdpdCBkaWZmLWluZGV4IC0tY2FjaGVkIEhFQURgICYmCisJdGVzdCAteiAiJGRpZmZlcnMiIHx8IHsKKwkJZWNobyBPb3BzICIkZGlmZmVycyIKKwkJZmFsc2UKKwl9CisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2tvdXQgd2l0aCBhdXRvY3JsZj10cnVlJyAnCisKKwlybSAtZiB0bXAgb25lIGRpci90d28gdGhyZWUgJiYKKwlnaXQgY29uZmlnIGNvcmUuYXV0b2NybGYgdHJ1ZSAmJgorCWdpdCByZWFkLXRyZWUgLS1yZXNldCAtdSBIRUFEICYmCisKKwlmb3IgZiBpbiBvbmUgZGlyL3R3bworCWRvCisJCXJlbW92ZV9jciAiJGYiID50bXAgJiYgbXYgLWYgdG1wICRmICYmCisJCWdpdCB1cGRhdGUtaW5kZXggLS0gJGYgfHwgeworCQkJZWNobyAiRWg/ICRmIgorCQkJZmFsc2UKKwkJCWJyZWFrCisJCX0KKwlkb25lICYmCisJdGVzdCAiJG9uZSIgPSBgZ2l0IGhhc2gtb2JqZWN0IC0tc3RkaW4gPG9uZWAgJiYKKwl0ZXN0ICIkdHdvIiA9IGBnaXQgaGFzaC1vYmplY3QgLS1zdGRpbiA8ZGlyL3R3b2AgJiYKKwlkaWZmZXJzPWBnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCBIRUFEYCAmJgorCXRlc3QgLXogIiRkaWZmZXJzIiB8fCB7CisJCWVjaG8gT29wcyAiJGRpZmZlcnMiCisJCWZhbHNlCisJfQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVja291dCB3aXRoIGF1dG9jcmxmPWlucHV0JyAnCisKKwlybSAtZiB0bXAgb25lIGRpci90d28gdGhyZWUgJiYKKwlnaXQgY29uZmlnIGNvcmUuYXV0b2NybGYgaW5wdXQgJiYKKwlnaXQgcmVhZC10cmVlIC0tcmVzZXQgLXUgSEVBRCAmJgorCisJZm9yIGYgaW4gb25lIGRpci90d28KKwlkbworCQlpZiByZW1vdmVfY3IgIiRmIiA+L2Rldi9udWxsCisJCXRoZW4KKwkJCWVjaG8gIkVoPyAkZiIKKwkJCWZhbHNlCisJCQlicmVhaworCQllbHNlCisJCQlnaXQgdXBkYXRlLWluZGV4IC0tICRmCisJCWZpCisJZG9uZSAmJgorCXRlc3QgIiRvbmUiID0gYGdpdCBoYXNoLW9iamVjdCAtLXN0ZGluIDxvbmVgICYmCisJdGVzdCAiJHR3byIgPSBgZ2l0IGhhc2gtb2JqZWN0IC0tc3RkaW4gPGRpci90d29gICYmCisJZGlmZmVycz1gZ2l0IGRpZmYtaW5kZXggLS1jYWNoZWQgSEVBRGAgJiYKKwl0ZXN0IC16ICIkZGlmZmVycyIgfHwgeworCQllY2hvIE9vcHMgIiRkaWZmZXJzIgorCQlmYWxzZQorCX0KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgcGF0Y2ggKGF1dG9jcmxmPWlucHV0KScgJworCisJcm0gLWYgdG1wIG9uZSBkaXIvdHdvIHRocmVlICYmCisJZ2l0IGNvbmZpZyBjb3JlLmF1dG9jcmxmIGlucHV0ICYmCisJZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IC11IEhFQUQgJiYKKworCWdpdCBhcHBseSBwYXRjaC5maWxlICYmCisJdGVzdCAiJHBhdGNoZWQiID0gImBnaXQgaGFzaC1vYmplY3QgLS1zdGRpbiA8b25lYCIgfHwgeworCQllY2hvICJFaD8gIGFwcGx5IHdpdGhvdXQgaW5kZXgiCisJCWZhbHNlCisJfQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBwYXRjaCAtLWNhY2hlZCAoYXV0b2NybGY9aW5wdXQpJyAnCisKKwlybSAtZiB0bXAgb25lIGRpci90d28gdGhyZWUgJiYKKwlnaXQgY29uZmlnIGNvcmUuYXV0b2NybGYgaW5wdXQgJiYKKwlnaXQgcmVhZC10cmVlIC0tcmVzZXQgLXUgSEVBRCAmJgorCisJZ2l0IGFwcGx5IC0tY2FjaGVkIHBhdGNoLmZpbGUgJiYKKwl0ZXN0ICIkcGF0Y2hlZCIgPSBgZ2l0IHJldi1wYXJzZSA6b25lYCB8fCB7CisJCWVjaG8gIkVoPyAgYXBwbHkgd2l0aCAtLWNhY2hlZCIKKwkJZmFsc2UKKwl9CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IHBhdGNoIC0taW5kZXggKGF1dG9jcmxmPWlucHV0KScgJworCisJcm0gLWYgdG1wIG9uZSBkaXIvdHdvIHRocmVlICYmCisJZ2l0IGNvbmZpZyBjb3JlLmF1dG9jcmxmIGlucHV0ICYmCisJZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IC11IEhFQUQgJiYKKworCWdpdCBhcHBseSAtLWluZGV4IHBhdGNoLmZpbGUgJiYKKwl0ZXN0ICIkcGF0Y2hlZCIgPSBgZ2l0IHJldi1wYXJzZSA6b25lYCAmJgorCXRlc3QgIiRwYXRjaGVkIiA9IGBnaXQgaGFzaC1vYmplY3QgLS1zdGRpbiA8b25lYCB8fCB7CisJCWVjaG8gIkVoPyAgYXBwbHkgd2l0aCAtLWluZGV4IgorCQlmYWxzZQorCX0KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgcGF0Y2ggKGF1dG9jcmxmPXRydWUpJyAnCisKKwlybSAtZiB0bXAgb25lIGRpci90d28gdGhyZWUgJiYKKwlnaXQgY29uZmlnIGNvcmUuYXV0b2NybGYgdHJ1ZSAmJgorCWdpdCByZWFkLXRyZWUgLS1yZXNldCAtdSBIRUFEICYmCisKKwlnaXQgYXBwbHkgcGF0Y2guZmlsZSAmJgorCXRlc3QgIiRwYXRjaGVkIiA9ICJgcmVtb3ZlX2NyIG9uZSB8IGdpdCBoYXNoLW9iamVjdCAtLXN0ZGluYCIgfHwgeworCQllY2hvICJFaD8gIGFwcGx5IHdpdGhvdXQgaW5kZXgiCisJCWZhbHNlCisJfQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBwYXRjaCAtLWNhY2hlZCAoYXV0b2NybGY9dHJ1ZSknICcKKworCXJtIC1mIHRtcCBvbmUgZGlyL3R3byB0aHJlZSAmJgorCWdpdCBjb25maWcgY29yZS5hdXRvY3JsZiB0cnVlICYmCisJZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IC11IEhFQUQgJiYKKworCWdpdCBhcHBseSAtLWNhY2hlZCBwYXRjaC5maWxlICYmCisJdGVzdCAiJHBhdGNoZWQiID0gYGdpdCByZXYtcGFyc2UgOm9uZWAgfHwgeworCQllY2hvICJFaD8gIGFwcGx5IHdpdGhvdXQgaW5kZXgiCisJCWZhbHNlCisJfQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBwYXRjaCAtLWluZGV4IChhdXRvY3JsZj10cnVlKScgJworCisJcm0gLWYgdG1wIG9uZSBkaXIvdHdvIHRocmVlICYmCisJZ2l0IGNvbmZpZyBjb3JlLmF1dG9jcmxmIHRydWUgJiYKKwlnaXQgcmVhZC10cmVlIC0tcmVzZXQgLXUgSEVBRCAmJgorCisJZ2l0IGFwcGx5IC0taW5kZXggcGF0Y2guZmlsZSAmJgorCXRlc3QgIiRwYXRjaGVkIiA9IGBnaXQgcmV2LXBhcnNlIDpvbmVgICYmCisJdGVzdCAiJHBhdGNoZWQiID0gImByZW1vdmVfY3Igb25lIHwgZ2l0IGhhc2gtb2JqZWN0IC0tc3RkaW5gIiB8fCB7CisJCWVjaG8gIkVoPyAgYXBwbHkgd2l0aCAtLWluZGV4IgorCQlmYWxzZQorCX0KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLmdpdGF0dHJpYnV0ZXMgc2F5cyB0d28gaXMgYmluYXJ5JyAnCisKKwlybSAtZiB0bXAgb25lIGRpci90d28gdGhyZWUgJiYKKwllY2hvICJ0d28gLWNybGYiID4uZ2l0YXR0cmlidXRlcyAmJgorCWdpdCBjb25maWcgY29yZS5hdXRvY3JsZiB0cnVlICYmCisJZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IC11IEhFQUQgJiYKKworCWlmIHJlbW92ZV9jciBkaXIvdHdvID4vZGV2L251bGwKKwl0aGVuCisJCWVjaG8gIkh1aD8iCisJCWZhbHNlCisJZWxzZQorCQk6IGhhcHB5CisJZmkgJiYKKworCWlmIHJlbW92ZV9jciBvbmUgPi9kZXYvbnVsbAorCXRoZW4KKwkJOiBoYXBweQorCWVsc2UKKwkJZWNobyAiSHVoPyIKKwkJZmFsc2UKKwlmaSAmJgorCisJaWYgcmVtb3ZlX2NyIHRocmVlID4vZGV2L251bGwKKwl0aGVuCisJCWVjaG8gIkh1aD8iCisJCWZhbHNlCisJZWxzZQorCQk6IGhhcHB5CisJZmkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLmdpdGF0dHJpYnV0ZXMgc2F5cyB0d28gaXMgaW5wdXQnICcKKworCXJtIC1mIHRtcCBvbmUgZGlyL3R3byB0aHJlZSAmJgorCWVjaG8gInR3byBjcmxmPWlucHV0IiA+LmdpdGF0dHJpYnV0ZXMgJiYKKwlnaXQgcmVhZC10cmVlIC0tcmVzZXQgLXUgSEVBRCAmJgorCisJaWYgcmVtb3ZlX2NyIGRpci90d28gPi9kZXYvbnVsbAorCXRoZW4KKwkJZWNobyAiSHVoPyIKKwkJZmFsc2UKKwllbHNlCisJCTogaGFwcHkKKwlmaQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICcuZ2l0YXR0cmlidXRlcyBzYXlzIHR3byBhbmQgdGhyZWUgYXJlIHRleHQnICcKKworCXJtIC1mIHRtcCBvbmUgZGlyL3R3byB0aHJlZSAmJgorCWVjaG8gInQqIGNybGYiID4uZ2l0YXR0cmlidXRlcyAmJgorCWdpdCByZWFkLXRyZWUgLS1yZXNldCAtdSBIRUFEICYmCisKKwlpZiByZW1vdmVfY3IgZGlyL3R3byA+L2Rldi9udWxsCisJdGhlbgorCQk6IGhhcHB5CisJZWxzZQorCQllY2hvICJIdWg/IgorCQlmYWxzZQorCWZpICYmCisKKwlpZiByZW1vdmVfY3IgdGhyZWUgPi9kZXYvbnVsbAorCXRoZW4KKwkJOiBoYXBweQorCWVsc2UKKwkJZWNobyAiSHVoPyIKKwkJZmFsc2UKKwlmaQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbi10cmVlIC5naXRhdHRyaWJ1dGVzICgxKScgJworCisJZWNobyAib25lIC1jcmxmIiA+Pi5naXRhdHRyaWJ1dGVzICYmCisJZ2l0IGFkZCAuZ2l0YXR0cmlidXRlcyAmJgorCWdpdCBjb21taXQgLW0gIkFkZCAuZ2l0YXR0cmlidXRlcyIgJiYKKworCXJtIC1yZiB0bXAgb25lIGRpciAuZ2l0YXR0cmlidXRlcyBwYXRjaC5maWxlIHRocmVlICYmCisJZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IC11IEhFQUQgJiYKKworCWlmIHJlbW92ZV9jciBvbmUgPi9kZXYvbnVsbAorCXRoZW4KKwkJZWNobyAiRWg/IG9uZSBzaG91bGQgbm90IGhhdmUgQ1JMRiIKKwkJZmFsc2UKKwllbHNlCisJCTogaGFwcHkKKwlmaSAmJgorCXJlbW92ZV9jciB0aHJlZSA+L2Rldi9udWxsIHx8IHsKKwkJZWNobyAiRWg/IHRocmVlIHNob3VsZCBzdGlsbCBoYXZlIENSTEYiCisJCWZhbHNlCisJfQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbi10cmVlIC5naXRhdHRyaWJ1dGVzICgyKScgJworCisJcm0gLXJmIHRtcCBvbmUgZGlyIC5naXRhdHRyaWJ1dGVzIHBhdGNoLmZpbGUgdGhyZWUgJiYKKwlnaXQgcmVhZC10cmVlIC0tcmVzZXQgSEVBRCAmJgorCWdpdCBjaGVja291dC1pbmRleCAtZiAtcSAtdSAtYSAmJgorCisJaWYgcmVtb3ZlX2NyIG9uZSA+L2Rldi9udWxsCisJdGhlbgorCQllY2hvICJFaD8gb25lIHNob3VsZCBub3QgaGF2ZSBDUkxGIgorCQlmYWxzZQorCWVsc2UKKwkJOiBoYXBweQorCWZpICYmCisJcmVtb3ZlX2NyIHRocmVlID4vZGV2L251bGwgfHwgeworCQllY2hvICJFaD8gdGhyZWUgc2hvdWxkIHN0aWxsIGhhdmUgQ1JMRiIKKwkJZmFsc2UKKwl9CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2luLXRyZWUgLmdpdGF0dHJpYnV0ZXMgKDMpJyAnCisKKwlybSAtcmYgdG1wIG9uZSBkaXIgLmdpdGF0dHJpYnV0ZXMgcGF0Y2guZmlsZSB0aHJlZSAmJgorCWdpdCByZWFkLXRyZWUgLS1yZXNldCBIRUFEICYmCisJZ2l0IGNoZWNrb3V0LWluZGV4IC11IC5naXRhdHRyaWJ1dGVzICYmCisJZ2l0IGNoZWNrb3V0LWluZGV4IC11IG9uZSBkaXIvdHdvIHRocmVlICYmCisKKwlpZiByZW1vdmVfY3Igb25lID4vZGV2L251bGwKKwl0aGVuCisJCWVjaG8gIkVoPyBvbmUgc2hvdWxkIG5vdCBoYXZlIENSTEYiCisJCWZhbHNlCisJZWxzZQorCQk6IGhhcHB5CisJZmkgJiYKKwlyZW1vdmVfY3IgdGhyZWUgPi9kZXYvbnVsbCB8fCB7CisJCWVjaG8gIkVoPyB0aHJlZSBzaG91bGQgc3RpbGwgaGF2ZSBDUkxGIgorCQlmYWxzZQorCX0KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW4tdHJlZSAuZ2l0YXR0cmlidXRlcyAoNCknICcKKworCXJtIC1yZiB0bXAgb25lIGRpciAuZ2l0YXR0cmlidXRlcyBwYXRjaC5maWxlIHRocmVlICYmCisJZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IEhFQUQgJiYKKwlnaXQgY2hlY2tvdXQtaW5kZXggLXUgb25lIGRpci90d28gdGhyZWUgJiYKKwlnaXQgY2hlY2tvdXQtaW5kZXggLXUgLmdpdGF0dHJpYnV0ZXMgJiYKKworCWlmIHJlbW92ZV9jciBvbmUgPi9kZXYvbnVsbAorCXRoZW4KKwkJZWNobyAiRWg/IG9uZSBzaG91bGQgbm90IGhhdmUgQ1JMRiIKKwkJZmFsc2UKKwllbHNlCisJCTogaGFwcHkKKwlmaSAmJgorCXJlbW92ZV9jciB0aHJlZSA+L2Rldi9udWxsIHx8IHsKKwkJZWNobyAiRWg/IHRocmVlIHNob3VsZCBzdGlsbCBoYXZlIENSTEYiCisJCWZhbHNlCisJfQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbnZhbGlkIC5naXRhdHRyaWJ1dGVzIChtdXN0IG5vdCBjcmFzaCknICcKKworCWVjaG8gInRocmVlICtjcmxmIiA+Pi5naXRhdHRyaWJ1dGVzICYmCisJZ2l0IGRpZmYKKworJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDAwMjEtY29udmVyc2lvbi5zaCBiL3QvdDAwMjEtY29udmVyc2lvbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZmMzOWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90MDAyMS1jb252ZXJzaW9uLnNoCkBAIC0wLDAgKzEsOTEgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdibG9iIGNvbnZlcnNpb24gdmlhIGdpdGF0dHJpYnV0ZXMnCisKKy4gLi90ZXN0LWxpYi5zaAorCitjYXQgPDxcRU9GID5yb3QxMy5zaAordHIgXAorICAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgXAorICAnbm9wcXJzdHV2d3h5emFiY2RlZmdoaWprbG1OT1BRUlNUVVZXWFlaQUJDREVGR0hJSktMTScKK0VPRgorY2htb2QgK3ggcm90MTMuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJZ2l0IGNvbmZpZyBmaWx0ZXIucm90MTMuc211ZGdlIC4vcm90MTMuc2ggJiYKKwlnaXQgY29uZmlnIGZpbHRlci5yb3QxMy5jbGVhbiAuL3JvdDEzLnNoICYmCisKKwl7CisJICAgIGVjaG8gIioudCBmaWx0ZXI9cm90MTMiCisJICAgIGVjaG8gIiouaSBpZGVudCIKKwl9ID4uZ2l0YXR0cmlidXRlcyAmJgorCisJeworCSAgICBlY2hvIGEgYiBjIGQgZSBmIGcgaCBpIGogayBsIG0KKwkgICAgZWNobyBuIG8gcCBxIHIgcyB0IHUgdiB3IHggeSB6CisJICAgIGVjaG8gJ1wnJyRJZCQnXCcnCisJfSA+dGVzdCAmJgorCWNhdCB0ZXN0ID50ZXN0LnQgJiYKKwljYXQgdGVzdCA+dGVzdC5vICYmCisJY2F0IHRlc3QgPnRlc3QuaSAmJgorCWdpdCBhZGQgdGVzdCB0ZXN0LnQgdGVzdC5pICYmCisJcm0gLWYgdGVzdCB0ZXN0LnQgdGVzdC5pICYmCisJZ2l0IGNoZWNrb3V0IC0tIHRlc3QgdGVzdC50IHRlc3QuaQorJworCitzY3JpcHQ9J3MvXlwkSWQ6IFwoWzAtOWEtZl0qXCkgXCQvXDEvcCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBjaGVjayAnCisKKwljbXAgdGVzdC5vIHRlc3QgJiYKKwljbXAgdGVzdC5vIHRlc3QudCAmJgorCisJIyBpZGVudCBzaG91bGQgYmUgc3RyaXBwZWQgaW4gdGhlIHJlcG9zaXRvcnkKKwlnaXQgZGlmZiAtLXJhdyAtLWV4aXQtY29kZSA6dGVzdCA6dGVzdC5pICYmCisJaWQ9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IDp0ZXN0KSAmJgorCWVtYmVkZGVkPSQoc2VkIC1uZSAiJHNjcmlwdCIgdGVzdC5pKSAmJgorCXRlc3QgInokaWQiID0gInokZW1iZWRkZWQiICYmCisKKwlnaXQgY2F0LWZpbGUgYmxvYiA6dGVzdC50ID4gdGVzdC5yICYmCisKKwkuL3JvdDEzLnNoIDwgdGVzdC5vID4gdGVzdC50ICYmCisJY21wIHRlc3QuciB0ZXN0LnQKKycKKworIyBJZiBhbiBleHBhbmRlZCBpZGVudCBldmVyIGdldHMgaW50byB0aGUgcmVwb3NpdG9yeSwgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdAorIyBpdCBpcyBjb2xsYXBzZWQgYmVmb3JlIGJlaW5nIGV4cGFuZGVkIGFnYWluIG9uIGNoZWNrb3V0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIGV4cGFuZGVkX2luX3JlcG8gJworCXsKKwkJZWNobyAiRmlsZSB3aXRoIGV4cGFuZGVkIGtleXdvcmRzIgorCQllY2hvICJcJElkXCQiCisJCWVjaG8gIlwkSWQ6XCQiCisJCWVjaG8gIlwkSWQ6IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgXCQiCisJCWVjaG8gIlwkSWQ6IE5vU3BhY2VBdEVuZFwkIgorCQllY2hvICJcJElkOk5vU3BhY2VBdEZyb250IFwkIgorCQllY2hvICJcJElkOk5vU3BhY2VBdEVpdGhlckVuZFwkIgorCQllY2hvICJcJElkOiBOb1Rlcm1pbmF0aW5nU3ltYm9sIgorCX0gPiBleHBhbmRlZC1rZXl3b3JkcyAmJgorCisJeworCQllY2hvICJGaWxlIHdpdGggZXhwYW5kZWQga2V5d29yZHMiCisJCWVjaG8gIlwkSWQ6IDRmMjE3MjNlN2IxNTA2NWRmN2RlOTViZDQ2YzhiYTZmYjE4MThmNGMgXCQiCisJCWVjaG8gIlwkSWQ6IDRmMjE3MjNlN2IxNTA2NWRmN2RlOTViZDQ2YzhiYTZmYjE4MThmNGMgXCQiCisJCWVjaG8gIlwkSWQ6IDRmMjE3MjNlN2IxNTA2NWRmN2RlOTViZDQ2YzhiYTZmYjE4MThmNGMgXCQiCisJCWVjaG8gIlwkSWQ6IDRmMjE3MjNlN2IxNTA2NWRmN2RlOTViZDQ2YzhiYTZmYjE4MThmNGMgXCQiCisJCWVjaG8gIlwkSWQ6IDRmMjE3MjNlN2IxNTA2NWRmN2RlOTViZDQ2YzhiYTZmYjE4MThmNGMgXCQiCisJCWVjaG8gIlwkSWQ6IDRmMjE3MjNlN2IxNTA2NWRmN2RlOTViZDQ2YzhiYTZmYjE4MThmNGMgXCQiCisJCWVjaG8gIlwkSWQ6IE5vVGVybWluYXRpbmdTeW1ib2wiCisJfSA+IGV4cGVjdGVkLW91dHB1dCAmJgorCisJZ2l0IGFkZCBleHBhbmRlZC1rZXl3b3JkcyAmJgorCWdpdCBjb21taXQgLW0gIkZpbGUgd2l0aCBrZXl3b3JkcyBleHBhbmRlZCIgJiYKKworCWVjaG8gImV4cGFuZGVkLWtleXdvcmRzIGlkZW50IiA+PiAuZ2l0YXR0cmlidXRlcyAmJgorCisJcm0gLWYgZXhwYW5kZWQta2V5d29yZHMgJiYKKwlnaXQgY2hlY2tvdXQgLS0gZXhwYW5kZWQta2V5d29yZHMgJiYKKwljYXQgZXhwYW5kZWQta2V5d29yZHMgJiYKKwljbXAgZXhwYW5kZWQta2V5d29yZHMgZXhwZWN0ZWQtb3V0cHV0CisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MDAyMi1jcmxmLXJlbmFtZS5zaCBiL3QvdDAwMjItY3JsZi1yZW5hbWUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2QxY2UyZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDAwMjItY3JsZi1yZW5hbWUuc2gKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdC90MDAyMy1jcmxmLWFtLnNoIGIvdC90MDAyMy1jcmxmLWFtLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZmOGE0MzQKLS0tIC9kZXYvbnVsbAorKysgYi90L3QwMDIzLWNybGYtYW0uc2gKQEAgLTAsMCArMSw0NCBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgYW0gd2l0aCBhdXRvLmNybGYnCisKKy4gLi90ZXN0LWxpYi5zaAorCitjYXQgPnBhdGNoZmlsZSA8PFxFT0YKK0Zyb20gMzhiZTEwMDcyZTQ1ZGQ2YjA4Y2U0MDg1MWUzZmNhNjBhMzFhMzQwYiBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IE1hcml1cyBTdG9ybS1PbHNlbiA8eEB5LmNvbT4KK0RhdGU6IFRodSwgMjMgQXVnIDIwMDcgMTM6MDA6MDAgKzAyMDAKK1N1YmplY3Q6IHRlc3QxCisKKy0tLQorIGZvbyB8ICAgIDEgKworIDEgZmlsZXMgY2hhbmdlZCwgMSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmb28KKworZGlmZiAtLWdpdCBhL2ZvbyBiL2ZvbworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjU3MTZjYTU5ODdjYmY5N2Q2YmI1NDkyMGJlYTZhZGRlMjQyZDg3ZTYKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZvbworQEAgLTAsMCArMSBAQAorK2JhcgorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NldHVwJyAnCisKKwlnaXQgY29uZmlnIGNvcmUuYXV0b2NybGYgdHJ1ZSAmJgorCWVjaG8gZm9vID5iYXIgJiYKKwlnaXQgYWRkIGJhciAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gaW5pdGlhbAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FtJyAnCisKKwlnaXQgYW0gLS1iaW5hcnkgLTMgPHBhdGNoZmlsZSAmJgorCWdpdCBkaWZmLWZpbGVzIC0tbmFtZS1zdGF0dXMgLS1leGl0LWNvZGUKKworJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDAwMzAtc3RyaXBzcGFjZS5zaCBiL3QvdDAwMzAtc3RyaXBzcGFjZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZWNkZDY2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90MDAzMC1zdHJpcHNwYWNlLnNoCkBAIC0wLDAgKzEsNDAwIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3IENhcmxvcyBSaWNhCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBzdHJpcHNwYWNlJworCisuIC4vdGVzdC1saWIuc2gKKwordDQwPSdBIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvJworczQwPScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJworc3NzPSIkczQwJHM0MCRzNDAkczQwJHM0MCRzNDAkczQwJHM0MCRzNDAkczQwIiAjIDQwMAordHR0PSIkdDQwJHQ0MCR0NDAkdDQwJHQ0MCR0NDAkdDQwJHQ0MCR0NDAkdDQwIiAjIDQwMAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbG9uZyBsaW5lcyB3aXRob3V0IHNwYWNlcyBzaG91bGQgYmUgdW5jaGFuZ2VkJyAnCisgICAgZWNobyAiJHR0dCIgPmV4cGVjdCAmJgorICAgIGdpdCBzdHJpcHNwYWNlIDxleHBlY3QgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKworICAgIGVjaG8gIiR0dHQkdHR0IiA+ZXhwZWN0ICYmCisgICAgZ2l0IHN0cmlwc3BhY2UgPGV4cGVjdCA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgZWNobyAiJHR0dCR0dHQkdHR0IiA+ZXhwZWN0ICYmCisgICAgZ2l0IHN0cmlwc3BhY2UgPGV4cGVjdCA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgZWNobyAiJHR0dCR0dHQkdHR0JHR0dCIgPmV4cGVjdCAmJgorICAgIGdpdCBzdHJpcHNwYWNlIDxleHBlY3QgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xpbmVzIHdpdGggc3BhY2VzIGF0IHRoZSBiZWdpbm5pbmcgc2hvdWxkIGJlIHVuY2hhbmdlZCcgJworICAgIGVjaG8gIiRzc3MkdHR0IiA+ZXhwZWN0ICYmCisgICAgZ2l0IHN0cmlwc3BhY2UgPGV4cGVjdCA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgZWNobyAiJHNzcyRzc3MkdHR0IiA+ZXhwZWN0ICYmCisgICAgZ2l0IHN0cmlwc3BhY2UgPGV4cGVjdCA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgZWNobyAiJHNzcyRzc3Mkc3NzJHR0dCIgPmV4cGVjdCAmJgorICAgIGdpdCBzdHJpcHNwYWNlIDxleHBlY3QgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xpbmVzIHdpdGggaW50ZXJtZWRpYXRlIHNwYWNlcyBzaG91bGQgYmUgdW5jaGFuZ2VkJyAnCisgICAgZWNobyAiJHR0dCRzc3MkdHR0IiA+ZXhwZWN0ICYmCisgICAgZ2l0IHN0cmlwc3BhY2UgPGV4cGVjdCA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgZWNobyAiJHR0dCRzc3Mkc3NzJHR0dCIgPmV4cGVjdCAmJgorICAgIGdpdCBzdHJpcHNwYWNlIDxleHBlY3QgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NvbnNlY3V0aXZlIGJsYW5rIGxpbmVzIHNob3VsZCBiZSB1bmlmaWVkJyAnCisgICAgcHJpbnRmICIkdHR0XG5cbiR0dHRcbiIgPiBleHBlY3QgJiYKKyAgICBwcmludGYgIiR0dHRcblxuXG5cblxuJHR0dFxuIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKyAgICBwcmludGYgIiR0dHQkdHR0XG5cbiR0dHRcbiIgPiBleHBlY3QgJiYKKyAgICBwcmludGYgIiR0dHQkdHR0XG5cblxuXG5cbiR0dHRcbiIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgcHJpbnRmICIkdHR0JHR0dCR0dHRcblxuJHR0dFxuIiA+IGV4cGVjdCAmJgorICAgIHByaW50ZiAiJHR0dCR0dHQkdHR0XG5cblxuXG5cbiR0dHRcbiIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgcHJpbnRmICIkdHR0XG5cbiR0dHRcbiIgPiBleHBlY3QgJiYKKyAgICBwcmludGYgIiR0dHRcblxuXG5cblxuJHR0dFxuIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKyAgICBwcmludGYgIiR0dHRcblxuJHR0dCR0dHRcbiIgPiBleHBlY3QgJiYKKyAgICBwcmludGYgIiR0dHRcblxuXG5cblxuJHR0dCR0dHRcbiIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgcHJpbnRmICIkdHR0XG5cbiR0dHQkdHR0JHR0dFxuIiA+IGV4cGVjdCAmJgorICAgIHByaW50ZiAiJHR0dFxuXG5cblxuXG4kdHR0JHR0dCR0dHRcbiIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgcHJpbnRmICIkdHR0XG5cbiR0dHRcbiIgPiBleHBlY3QgJiYKKyAgICBwcmludGYgIiR0dHRcblx0XG4gXG5cbiAgXHRcdFxuJHR0dFxuIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKyAgICBwcmludGYgIiR0dHQkdHR0XG5cbiR0dHRcbiIgPiBleHBlY3QgJiYKKyAgICBwcmludGYgIiR0dHQkdHR0XG5cdFxuIFxuXG4gIFx0XHRcbiR0dHRcbiIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgcHJpbnRmICIkdHR0JHR0dCR0dHRcblxuJHR0dFxuIiA+IGV4cGVjdCAmJgorICAgIHByaW50ZiAiJHR0dCR0dHQkdHR0XG5cdFxuIFxuXG4gIFx0XHRcbiR0dHRcbiIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgcHJpbnRmICIkdHR0XG5cbiR0dHRcbiIgPiBleHBlY3QgJiYKKyAgICBwcmludGYgIiR0dHRcblx0XG4gXG5cbiAgXHRcdFxuJHR0dFxuIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKyAgICBwcmludGYgIiR0dHRcblxuJHR0dCR0dHRcbiIgPiBleHBlY3QgJiYKKyAgICBwcmludGYgIiR0dHRcblx0XG4gXG5cbiAgXHRcdFxuJHR0dCR0dHRcbiIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgcHJpbnRmICIkdHR0XG5cbiR0dHQkdHR0JHR0dFxuIiA+IGV4cGVjdCAmJgorICAgIHByaW50ZiAiJHR0dFxuXHRcbiBcblxuICBcdFx0XG4kdHR0JHR0dCR0dHRcbiIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnb25seSBjb25zZWN1dGl2ZSBibGFuayBsaW5lcyBzaG91bGQgYmUgY29tcGxldGVseSByZW1vdmVkJyAnCisgICAgPiBleHBlY3QgJiYKKworICAgIHByaW50ZiAiXG4iIHwgZ2l0IHN0cmlwc3BhY2UgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKworICAgIHByaW50ZiAiXG5cblxuIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKyAgICBwcmludGYgIiRzc3NcbiRzc3NcbiRzc3NcbiIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgcHJpbnRmICIkc3NzJHNzc1xuJHNzc1xuXG4iIHwgZ2l0IHN0cmlwc3BhY2UgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKworICAgIHByaW50ZiAiXG4kc3NzXG4kc3NzJHNzc1xuIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKyAgICBwcmludGYgIiRzc3Mkc3NzJHNzcyRzc3NcblxuXG4iIHwgZ2l0IHN0cmlwc3BhY2UgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKworICAgIHByaW50ZiAiXG4kc3NzJHNzcyRzc3Mkc3NzXG5cbiIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgcHJpbnRmICJcblxuJHNzcyRzc3Mkc3NzJHNzc1xuIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjb25zZWN1dGl2ZSBibGFuayBsaW5lcyBhdCB0aGUgYmVnaW5uaW5nIHNob3VsZCBiZSByZW1vdmVkJyAnCisgICAgcHJpbnRmICIkdHR0XG4iID4gZXhwZWN0ICYmCisgICAgcHJpbnRmICJcbiR0dHRcbiIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgcHJpbnRmICIkdHR0XG4iID4gZXhwZWN0ICYmCisgICAgcHJpbnRmICJcblxuXG4kdHR0XG4iIHwgZ2l0IHN0cmlwc3BhY2UgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKworICAgIHByaW50ZiAiJHR0dCR0dHRcbiIgPiBleHBlY3QgJiYKKyAgICBwcmludGYgIlxuXG5cbiR0dHQkdHR0XG4iIHwgZ2l0IHN0cmlwc3BhY2UgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKworICAgIHByaW50ZiAiJHR0dCR0dHQkdHR0XG4iID4gZXhwZWN0ICYmCisgICAgcHJpbnRmICJcblxuXG4kdHR0JHR0dCR0dHRcbiIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgcHJpbnRmICIkdHR0JHR0dCR0dHQkdHR0XG4iID4gZXhwZWN0ICYmCisgICAgcHJpbnRmICJcblxuXG4kdHR0JHR0dCR0dHQkdHR0XG4iIHwgZ2l0IHN0cmlwc3BhY2UgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKworICAgIHByaW50ZiAiJHR0dFxuIiA+IGV4cGVjdCAmJgorCisgICAgcHJpbnRmICIkc3NzXG4kc3NzXG4kc3NzXG4kdHR0XG4iIHwgZ2l0IHN0cmlwc3BhY2UgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKworICAgIHByaW50ZiAiXG4kc3NzXG4kc3NzJHNzc1xuJHR0dFxuIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKyAgICBwcmludGYgIiRzc3Mkc3NzXG4kc3NzXG5cbiR0dHRcbiIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgcHJpbnRmICIkc3NzJHNzcyRzc3NcblxuXG4kdHR0XG4iIHwgZ2l0IHN0cmlwc3BhY2UgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKworICAgIHByaW50ZiAiXG4kc3NzJHNzcyRzc3NcblxuJHR0dFxuIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKyAgICBwcmludGYgIlxuXG4kc3NzJHNzcyRzc3NcbiR0dHRcbiIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY29uc2VjdXRpdmUgYmxhbmsgbGluZXMgYXQgdGhlIGVuZCBzaG91bGQgYmUgcmVtb3ZlZCcgJworICAgIHByaW50ZiAiJHR0dFxuIiA+IGV4cGVjdCAmJgorICAgIHByaW50ZiAiJHR0dFxuXG4iIHwgZ2l0IHN0cmlwc3BhY2UgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKworICAgIHByaW50ZiAiJHR0dFxuIiA+IGV4cGVjdCAmJgorICAgIHByaW50ZiAiJHR0dFxuXG5cblxuIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKyAgICBwcmludGYgIiR0dHQkdHR0XG4iID4gZXhwZWN0ICYmCisgICAgcHJpbnRmICIkdHR0JHR0dFxuXG5cblxuIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKyAgICBwcmludGYgIiR0dHQkdHR0JHR0dFxuIiA+IGV4cGVjdCAmJgorICAgIHByaW50ZiAiJHR0dCR0dHQkdHR0XG5cblxuXG4iIHwgZ2l0IHN0cmlwc3BhY2UgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKworICAgIHByaW50ZiAiJHR0dCR0dHQkdHR0JHR0dFxuIiA+IGV4cGVjdCAmJgorICAgIHByaW50ZiAiJHR0dCR0dHQkdHR0JHR0dFxuXG5cblxuIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKyAgICBwcmludGYgIiR0dHRcbiIgPiBleHBlY3QgJiYKKworICAgIHByaW50ZiAiJHR0dFxuJHNzc1xuJHNzc1xuJHNzc1xuIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKyAgICBwcmludGYgIiR0dHRcblxuJHNzc1xuJHNzcyRzc3NcbiIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgcHJpbnRmICIkdHR0XG4kc3NzJHNzc1xuJHNzc1xuXG4iIHwgZ2l0IHN0cmlwc3BhY2UgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKworICAgIHByaW50ZiAiJHR0dFxuJHNzcyRzc3Mkc3NzXG5cblxuIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKyAgICBwcmludGYgIiR0dHRcblxuJHNzcyRzc3Mkc3NzXG5cbiIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgcHJpbnRmICIkdHR0XG5cblxuJHNzcyRzc3Mkc3NzXG4iIHwgZ2l0IHN0cmlwc3BhY2UgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3RleHQgd2l0aG91dCBuZXdsaW5lIGF0IGVuZCBzaG91bGQgZW5kIHdpdGggbmV3bGluZScgJworICAgIHRlc3QgYHByaW50ZiAiJHR0dCIgfCBnaXQgc3RyaXBzcGFjZSB8IHdjIC1sYCAtZ3QgMCAmJgorICAgIHRlc3QgYHByaW50ZiAiJHR0dCR0dHQiIHwgZ2l0IHN0cmlwc3BhY2UgfCB3YyAtbGAgLWd0IDAgJiYKKyAgICB0ZXN0IGBwcmludGYgIiR0dHQkdHR0JHR0dCIgfCBnaXQgc3RyaXBzcGFjZSB8IHdjIC1sYCAtZ3QgMCAmJgorICAgIHRlc3QgYHByaW50ZiAiJHR0dCR0dHQkdHR0JHR0dCIgfCBnaXQgc3RyaXBzcGFjZSB8IHdjIC1sYCAtZ3QgMAorJworCisjIHRleHQgcGx1cyBzcGFjZXMgYXQgdGhlIGVuZDoKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3RleHQgcGx1cyBzcGFjZXMgd2l0aG91dCBuZXdsaW5lIGF0IGVuZCBzaG91bGQgZW5kIHdpdGggbmV3bGluZScgJworICAgIHRlc3QgYHByaW50ZiAiJHR0dCRzc3MiIHwgZ2l0IHN0cmlwc3BhY2UgfCB3YyAtbGAgLWd0IDAgJiYKKyAgICB0ZXN0IGBwcmludGYgIiR0dHQkdHR0JHNzcyIgfCBnaXQgc3RyaXBzcGFjZSB8IHdjIC1sYCAtZ3QgMCAmJgorICAgIHRlc3QgYHByaW50ZiAiJHR0dCR0dHQkdHR0JHNzcyIgfCBnaXQgc3RyaXBzcGFjZSB8IHdjIC1sYCAtZ3QgMCAmJgorICAgIHRlc3QgYHByaW50ZiAiJHR0dCRzc3Mkc3NzIiB8IGdpdCBzdHJpcHNwYWNlIHwgd2MgLWxgIC1ndCAwICYmCisgICAgdGVzdCBgcHJpbnRmICIkdHR0JHR0dCRzc3Mkc3NzIiB8IGdpdCBzdHJpcHNwYWNlIHwgd2MgLWxgIC1ndCAwICYmCisgICAgdGVzdCBgcHJpbnRmICIkdHR0JHNzcyRzc3Mkc3NzIiB8IGdpdCBzdHJpcHNwYWNlIHwgd2MgLWxgIC1ndCAwCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd0ZXh0IHBsdXMgc3BhY2VzIHdpdGhvdXQgbmV3bGluZSBhdCBlbmQgc2hvdWxkIG5vdCBzaG93IHNwYWNlcycgJworICAgICEgKHByaW50ZiAiJHR0dCRzc3MiIHwgZ2l0IHN0cmlwc3BhY2UgfCBncmVwICIgICIgPi9kZXYvbnVsbCkgJiYKKyAgICAhIChwcmludGYgIiR0dHQkdHR0JHNzcyIgfCBnaXQgc3RyaXBzcGFjZSB8IGdyZXAgIiAgIiA+L2Rldi9udWxsKSAmJgorICAgICEgKHByaW50ZiAiJHR0dCR0dHQkdHR0JHNzcyIgfCBnaXQgc3RyaXBzcGFjZSB8IGdyZXAgIiAgIiA+L2Rldi9udWxsKSAmJgorICAgICEgKHByaW50ZiAiJHR0dCRzc3Mkc3NzIiB8IGdpdCBzdHJpcHNwYWNlIHwgZ3JlcCAiICAiID4vZGV2L251bGwpICYmCisgICAgISAocHJpbnRmICIkdHR0JHR0dCRzc3Mkc3NzIiB8IGdpdCBzdHJpcHNwYWNlIHwgZ3JlcCAiICAiID4vZGV2L251bGwpICYmCisgICAgISAocHJpbnRmICIkdHR0JHNzcyRzc3Mkc3NzIiB8IGdpdCBzdHJpcHNwYWNlIHwgZ3JlcCAiICAiID4vZGV2L251bGwpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd0ZXh0IHBsdXMgc3BhY2VzIHdpdGhvdXQgbmV3bGluZSBzaG91bGQgc2hvdyB0aGUgY29ycmVjdCBsaW5lcycgJworICAgIHByaW50ZiAiJHR0dFxuIiA+ZXhwZWN0ICYmCisgICAgcHJpbnRmICIkdHR0JHNzcyIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgcHJpbnRmICIkdHR0XG4iID5leHBlY3QgJiYKKyAgICBwcmludGYgIiR0dHQkc3NzJHNzcyIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgcHJpbnRmICIkdHR0XG4iID5leHBlY3QgJiYKKyAgICBwcmludGYgIiR0dHQkc3NzJHNzcyRzc3MiIHwgZ2l0IHN0cmlwc3BhY2UgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKworICAgIHByaW50ZiAiJHR0dCR0dHRcbiIgPmV4cGVjdCAmJgorICAgIHByaW50ZiAiJHR0dCR0dHQkc3NzIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKyAgICBwcmludGYgIiR0dHQkdHR0XG4iID5leHBlY3QgJiYKKyAgICBwcmludGYgIiR0dHQkdHR0JHNzcyRzc3MiIHwgZ2l0IHN0cmlwc3BhY2UgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKworICAgIHByaW50ZiAiJHR0dCR0dHQkdHR0XG4iID5leHBlY3QgJiYKKyAgICBwcmludGYgIiR0dHQkdHR0JHR0dCRzc3MiIHwgZ2l0IHN0cmlwc3BhY2UgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3RleHQgcGx1cyBzcGFjZXMgYXQgZW5kIHNob3VsZCBub3Qgc2hvdyBzcGFjZXMnICcKKyAgICAhIChlY2hvICIkdHR0JHNzcyIgfCBnaXQgc3RyaXBzcGFjZSB8IGdyZXAgIiAgIiA+L2Rldi9udWxsKSAmJgorICAgICEgKGVjaG8gIiR0dHQkdHR0JHNzcyIgfCBnaXQgc3RyaXBzcGFjZSB8IGdyZXAgIiAgIiA+L2Rldi9udWxsKSAmJgorICAgICEgKGVjaG8gIiR0dHQkdHR0JHR0dCRzc3MiIHwgZ2l0IHN0cmlwc3BhY2UgfCBncmVwICIgICIgPi9kZXYvbnVsbCkgJiYKKyAgICAhIChlY2hvICIkdHR0JHNzcyRzc3MiIHwgZ2l0IHN0cmlwc3BhY2UgfCBncmVwICIgICIgPi9kZXYvbnVsbCkgJiYKKyAgICAhIChlY2hvICIkdHR0JHR0dCRzc3Mkc3NzIiB8IGdpdCBzdHJpcHNwYWNlIHwgZ3JlcCAiICAiID4vZGV2L251bGwpICYmCisgICAgISAoZWNobyAiJHR0dCRzc3Mkc3NzJHNzcyIgfCBnaXQgc3RyaXBzcGFjZSB8IGdyZXAgIiAgIiA+L2Rldi9udWxsKQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndGV4dCBwbHVzIHNwYWNlcyBhdCBlbmQgc2hvdWxkIGJlIGNsZWFuZWQgYW5kIG5ld2xpbmUgbXVzdCByZW1haW4nICcKKyAgICBlY2hvICIkdHR0IiA+ZXhwZWN0ICYmCisgICAgZWNobyAiJHR0dCRzc3MiIHwgZ2l0IHN0cmlwc3BhY2UgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKworICAgIGVjaG8gIiR0dHQiID5leHBlY3QgJiYKKyAgICBlY2hvICIkdHR0JHNzcyRzc3MiIHwgZ2l0IHN0cmlwc3BhY2UgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKworICAgIGVjaG8gIiR0dHQiID5leHBlY3QgJiYKKyAgICBlY2hvICIkdHR0JHNzcyRzc3Mkc3NzIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKyAgICBlY2hvICIkdHR0JHR0dCIgPmV4cGVjdCAmJgorICAgIGVjaG8gIiR0dHQkdHR0JHNzcyIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgZWNobyAiJHR0dCR0dHQiID5leHBlY3QgJiYKKyAgICBlY2hvICIkdHR0JHR0dCRzc3Mkc3NzIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKyAgICBlY2hvICIkdHR0JHR0dCR0dHQiID5leHBlY3QgJiYKKyAgICBlY2hvICIkdHR0JHR0dCR0dHQkc3NzIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsCisnCisKKyMgc3BhY2VzIG9ubHk6CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzcGFjZXMgd2l0aCBuZXdsaW5lIGF0IGVuZCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBlbXB0eSBzdHJpbmcnICcKKyAgICBwcmludGYgIiIgPmV4cGVjdCAmJgorCisgICAgZWNobyB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKyAgICBlY2hvICIkc3NzIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKyAgICBlY2hvICIkc3NzJHNzcyIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgZWNobyAiJHNzcyRzc3Mkc3NzIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKyAgICBlY2hvICIkc3NzJHNzcyRzc3Mkc3NzIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzcGFjZXMgd2l0aG91dCBuZXdsaW5lIGF0IGVuZCBzaG91bGQgbm90IHNob3cgc3BhY2VzJyAnCisgICAgISAocHJpbnRmICIiIHwgZ2l0IHN0cmlwc3BhY2UgfCBncmVwICIgIiA+L2Rldi9udWxsKSAmJgorICAgICEgKHByaW50ZiAiJHNzcyIgfCBnaXQgc3RyaXBzcGFjZSB8IGdyZXAgIiAiID4vZGV2L251bGwpICYmCisgICAgISAocHJpbnRmICIkc3NzJHNzcyIgfCBnaXQgc3RyaXBzcGFjZSB8IGdyZXAgIiAiID4vZGV2L251bGwpICYmCisgICAgISAocHJpbnRmICIkc3NzJHNzcyRzc3MiIHwgZ2l0IHN0cmlwc3BhY2UgfCBncmVwICIgIiA+L2Rldi9udWxsKSAmJgorICAgICEgKHByaW50ZiAiJHNzcyRzc3Mkc3NzJHNzcyIgfCBnaXQgc3RyaXBzcGFjZSB8IGdyZXAgIiAiID4vZGV2L251bGwpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzcGFjZXMgd2l0aG91dCBuZXdsaW5lIGF0IGVuZCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBlbXB0eSBzdHJpbmcnICcKKyAgICBwcmludGYgIiIgPmV4cGVjdCAmJgorCisgICAgcHJpbnRmICIiIHwgZ2l0IHN0cmlwc3BhY2UgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKworICAgIHByaW50ZiAiJHNzcyRzc3MiIHwgZ2l0IHN0cmlwc3BhY2UgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKworICAgIHByaW50ZiAiJHNzcyRzc3Mkc3NzIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKyAgICBwcmludGYgIiRzc3Mkc3NzJHNzcyRzc3MiIHwgZ2l0IHN0cmlwc3BhY2UgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NvbnNlY3V0aXZlIHRleHQgbGluZXMgc2hvdWxkIGJlIHVuY2hhbmdlZCcgJworICAgIHByaW50ZiAiJHR0dCR0dHRcbiR0dHRcbiIgPmV4cGVjdCAmJgorICAgIHByaW50ZiAiJHR0dCR0dHRcbiR0dHRcbiIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgcHJpbnRmICIkdHR0XG4kdHR0JHR0dFxuJHR0dFxuIiA+ZXhwZWN0ICYmCisgICAgcHJpbnRmICIkdHR0XG4kdHR0JHR0dFxuJHR0dFxuIiB8IGdpdCBzdHJpcHNwYWNlID5hY3R1YWwgJiYKKyAgICBnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKyAgICBwcmludGYgIiR0dHRcbiR0dHRcbiR0dHRcbiR0dHQkdHR0XG4iID5leHBlY3QgJiYKKyAgICBwcmludGYgIiR0dHRcbiR0dHRcbiR0dHRcbiR0dHQkdHR0XG4iIHwgZ2l0IHN0cmlwc3BhY2UgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKworICAgIHByaW50ZiAiJHR0dFxuJHR0dFxuXG4kdHR0JHR0dFxuJHR0dFxuIiA+ZXhwZWN0ICYmCisgICAgcHJpbnRmICIkdHR0XG4kdHR0XG5cbiR0dHQkdHR0XG4kdHR0XG4iIHwgZ2l0IHN0cmlwc3BhY2UgPmFjdHVhbCAmJgorICAgIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKworICAgIHByaW50ZiAiJHR0dCR0dHRcblxuJHR0dFxuJHR0dCR0dHRcbiIgPmV4cGVjdCAmJgorICAgIHByaW50ZiAiJHR0dCR0dHRcblxuJHR0dFxuJHR0dCR0dHRcbiIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisgICAgcHJpbnRmICIkdHR0XG4kdHR0JHR0dFxuXG4kdHR0XG4iID5leHBlY3QgJiYKKyAgICBwcmludGYgIiR0dHRcbiR0dHQkdHR0XG5cbiR0dHRcbiIgfCBnaXQgc3RyaXBzcGFjZSA+YWN0dWFsICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzdHJpcCBjb21tZW50cywgdG9vJyAnCisJdGVzdCAhIC16ICIkKGVjaG8gIiMgY29tbWVudCIgfCBnaXQgc3RyaXBzcGFjZSkiICYmCisJdGVzdCAteiAiJChlY2hvICIjIGNvbW1lbnQiIHwgZ2l0IHN0cmlwc3BhY2UgLXMpIgorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDAwNDAtcGFyc2Utb3B0aW9ucy5zaCBiL3QvdDAwNDAtcGFyc2Utb3B0aW9ucy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMjNmMGFjCi0tLSAvZGV2L251bGwKKysrIGIvdC90MDA0MC1wYXJzZS1vcHRpb25zLnNoCkBAIC0wLDAgKzEsMTMzIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3IEpvaGFubmVzIFNjaGluZGVsaW4KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nb3VyIG93biBvcHRpb24gcGFyc2VyJworCisuIC4vdGVzdC1saWIuc2gKKworY2F0ID4gZXhwZWN0LmVyciA8PCBFT0YKK3VzYWdlOiB0ZXN0LXBhcnNlLW9wdGlvbnMgPG9wdGlvbnM+CisKKyAgICAtYiwgLS1ib29sZWFuICAgICAgICAgZ2V0IGEgYm9vbGVhbgorICAgIC1pLCAtLWludGVnZXIgPG4+ICAgICBnZXQgYSBpbnRlZ2VyCisgICAgLWogPG4+ICAgICAgICAgICAgICAgIGdldCBhIGludGVnZXIsIHRvbworCitzdHJpbmcgb3B0aW9ucworICAgIC1zLCAtLXN0cmluZyA8c3RyaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQgYSBzdHJpbmcKKyAgICAtLXN0cmluZzIgPHN0cj4gICAgICAgZ2V0IGFub3RoZXIgc3RyaW5nCisgICAgLS1zdCA8c3Q+ICAgICAgICAgICAgIGdldCBhbm90aGVyIHN0cmluZyAocGVydmVydCBvcmRlcmluZykKKyAgICAtbyA8c3RyPiAgICAgICAgICAgICAgZ2V0IGFub3RoZXIgc3RyaW5nCisKK21hZ2ljIGFyZ3VtZW50cworICAgIC0tcXV1eCAgICAgICAgICAgICAgICBtZWFucyAtLXF1dXgKKworRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Rlc3QgaGVscCcgJworCSEgdGVzdC1wYXJzZS1vcHRpb25zIC1oID4gb3V0cHV0IDI+IG91dHB1dC5lcnIgJiYKKwl0ZXN0ICEgLXMgb3V0cHV0ICYmCisJZ2l0IGRpZmYgZXhwZWN0LmVyciBvdXRwdXQuZXJyCisnCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK2Jvb2xlYW46IDIKK2ludGVnZXI6IDE3MjkKK3N0cmluZzogMTIzCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2hvcnQgb3B0aW9ucycgJworCXRlc3QtcGFyc2Utb3B0aW9ucyAtczEyMyAtYiAtaSAxNzI5IC1iID4gb3V0cHV0IDI+IG91dHB1dC5lcnIgJiYKKwlnaXQgZGlmZiBleHBlY3Qgb3V0cHV0ICYmCisJdGVzdCAhIC1zIG91dHB1dC5lcnIKKycKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK2Jvb2xlYW46IDIKK2ludGVnZXI6IDE3MjkKK3N0cmluZzogMzIxCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbG9uZyBvcHRpb25zJyAnCisJdGVzdC1wYXJzZS1vcHRpb25zIC0tYm9vbGVhbiAtLWludGVnZXIgMTcyOSAtLWJvb2xlYW4gLS1zdHJpbmcyPTMyMSBcCisJCT4gb3V0cHV0IDI+IG91dHB1dC5lcnIgJiYKKwl0ZXN0ICEgLXMgb3V0cHV0LmVyciAmJgorCWdpdCBkaWZmIGV4cGVjdCBvdXRwdXQKKycKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorYm9vbGVhbjogMQoraW50ZWdlcjogMTMKK3N0cmluZzogMTIzCithcmcgMDA6IGExCithcmcgMDE6IGIxCithcmcgMDI6IC0tYm9vbGVhbgorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ludGVybWluZ2xlZCBhcmd1bWVudHMnICcKKwl0ZXN0LXBhcnNlLW9wdGlvbnMgYTEgLS1zdHJpbmcgMTIzIGIxIC0tYm9vbGVhbiAtaiAxMyAtLSAtLWJvb2xlYW4gXAorCQk+IG91dHB1dCAyPiBvdXRwdXQuZXJyICYmCisJdGVzdCAhIC1zIG91dHB1dC5lcnIgJiYKKwlnaXQgZGlmZiBleHBlY3Qgb3V0cHV0CisnCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK2Jvb2xlYW46IDAKK2ludGVnZXI6IDIKK3N0cmluZzogKG5vdCBzZXQpCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndW5hbWJpZ3VvdXNseSBhYmJyZXZpYXRlZCBvcHRpb24nICcKKwl0ZXN0LXBhcnNlLW9wdGlvbnMgLS1pbnQgMiAtLWJvb2xlYW4gLS1uby1ibyA+IG91dHB1dCAyPiBvdXRwdXQuZXJyICYmCisJdGVzdCAhIC1zIG91dHB1dC5lcnIgJiYKKwlnaXQgZGlmZiBleHBlY3Qgb3V0cHV0CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VuYW1iaWd1b3VzbHkgYWJicmV2aWF0ZWQgb3B0aW9uIHdpdGggIj0iJyAnCisJdGVzdC1wYXJzZS1vcHRpb25zIC0taW50PTIgPiBvdXRwdXQgMj4gb3V0cHV0LmVyciAmJgorCXRlc3QgISAtcyBvdXRwdXQuZXJyICYmCisJZ2l0IGRpZmYgZXhwZWN0IG91dHB1dAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhbWJpZ3VvdXNseSBhYmJyZXZpYXRlZCBvcHRpb24nICcKKwl0ZXN0LXBhcnNlLW9wdGlvbnMgLS1zdHJpbiAxMjM7CisJdGVzdCAkPyA9IDEyOQorJworCitjYXQgPiBleHBlY3QgPDwgRU9GCitib29sZWFuOiAwCitpbnRlZ2VyOiAwCitzdHJpbmc6IDEyMworRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ25vbiBhbWJpZ3VvdXMgb3B0aW9uIChhZnRlciB0d28gb3B0aW9ucyBpdCBhYmJyZXZpYXRlcyknICcKKwl0ZXN0LXBhcnNlLW9wdGlvbnMgLS1zdCAxMjMgPiBvdXRwdXQgMj4gb3V0cHV0LmVyciAmJgorCXRlc3QgISAtcyBvdXRwdXQuZXJyICYmCisJZ2l0IGRpZmYgZXhwZWN0IG91dHB1dAorJworCitjYXQgPiBleHBlY3QuZXJyIDw8IEVPRgorZXJyb3I6IGRpZCB5b3UgbWVhbiBcYC0tYm9vbGVhblxgICh3aXRoIHR3byBkYXNoZXMgPykKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdkZXRlY3QgcG9zc2libGUgdHlwb3MnICcKKwkhIHRlc3QtcGFyc2Utb3B0aW9ucyAtYm9vbGVhbiA+IG91dHB1dCAyPiBvdXRwdXQuZXJyICYmCisJdGVzdCAhIC1zIG91dHB1dCAmJgorCWdpdCBkaWZmIGV4cGVjdC5lcnIgb3V0cHV0LmVycgorJworCitjYXQgPiBleHBlY3QgPDxFT0YKK2Jvb2xlYW46IDAKK2ludGVnZXI6IDAKK3N0cmluZzogKG5vdCBzZXQpCithcmcgMDA6IC0tcXV1eAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2tlZXAgc29tZSBvcHRpb25zIGFzIGFyZ3VtZW50cycgJworCXRlc3QtcGFyc2Utb3B0aW9ucyAtLXF1dXggPiBvdXRwdXQgMj4gb3V0cHV0LmVyciAmJgorICAgICAgICB0ZXN0ICEgLXMgb3V0cHV0LmVyciAmJgorICAgICAgICBnaXQgZGlmZiBleHBlY3Qgb3V0cHV0CisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MDA1MC1maWxlc3lzdGVtLnNoIGIvdC90MDA1MC1maWxlc3lzdGVtLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNmYmFkNzcKLS0tIC9kZXYvbnVsbAorKysgYi90L3QwMDUwLWZpbGVzeXN0ZW0uc2gKQEAgLTAsMCArMSw5MyBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J1ZhcmlvdXMgZmlsZXN5c3RlbSBpc3N1ZXMnCisKKy4gLi90ZXN0LWxpYi5zaAorCithdW1sPWBwcmludGYgJ1x4YzNceGE0J2AKK2F1bWxjZGlhcj1gcHJpbnRmICdceDYxXHhjY1x4ODgnYAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZWUgaWYgd2UgZXhwZWN0ICcgJworCisJdGVzdF9jYXNlPXRlc3RfZXhwZWN0X3N1Y2Nlc3MKKwl0ZXN0X3VuaWNvZGU9dGVzdF9leHBlY3Rfc3VjY2VzcworCW1rZGlyIGp1bmsgJiYKKwllY2hvIGdvb2QgPmp1bmsvQ2FtZWxDYXNlICYmCisJZWNobyBiYWQgPmp1bmsvY2FtZWxjYXNlICYmCisJaWYgdGVzdCAiJChjYXQganVuay9DYW1lbENhc2UpIiAhPSBnb29kCisJdGhlbgorCQl0ZXN0X2Nhc2U9dGVzdF9leHBlY3RfZmFpbHVyZQorCQlzYXkgIndpbGwgdGVzdCBvbiBhIGNhc2UgaW5zZW5zaXRpdmUgZmlsZXN5c3RlbSIKKwlmaSAmJgorCXJtIC1mciBqdW5rICYmCisJbWtkaXIganVuayAmJgorCT5qdW5rLyIkYXVtbCIgJiYKKwljYXNlICIkKGNkIGp1bmsgJiYgZWNobyAqKSIgaW4KKwkiJGF1bWxjZGlhciIpCisJCXRlc3RfdW5pY29kZT10ZXN0X2V4cGVjdF9mYWlsdXJlCisJCXNheSAid2lsbCB0ZXN0IG9uIGEgdW5pY29kZSBjb3JydXB0aW5nIGZpbGVzeXN0ZW0iCisJCTs7CisJKikJOzsKKwllc2FjICYmCisJcm0gLWZyIGp1bmsKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAic2V0dXAgY2FzZSB0ZXN0cyIgJworCisJdG91Y2ggY2FtZWxjYXNlICYmCisJZ2l0IGFkZCBjYW1lbGNhc2UgJiYKKwlnaXQgY29tbWl0IC1tICJpbml0aWFsIiAmJgorCWdpdCB0YWcgaW5pdGlhbCAmJgorCWdpdCBjaGVja291dCAtYiB0b3BpYyAmJgorCWdpdCBtdiBjYW1lbGNhc2UgdG1wICYmCisJZ2l0IG12IHRtcCBDYW1lbENhc2UgJiYKKwlnaXQgY29tbWl0IC1tICJyZW5hbWUiICYmCisJZ2l0IGNoZWNrb3V0IC1mIG1hc3RlcgorCisnCisKKyR0ZXN0X2Nhc2UgJ3JlbmFtZSAoY2FzZSBjaGFuZ2UpJyAnCisKKwlnaXQgbXYgY2FtZWxjYXNlIENhbWVsQ2FzZSAmJgorCWdpdCBjb21taXQgLW0gInJlbmFtZSIKKworJworCiskdGVzdF9jYXNlICdtZXJnZSAoY2FzZSBjaGFuZ2UpJyAnCisKKwlnaXQgcmVzZXQgLS1oYXJkIGluaXRpYWwgJiYKKwlnaXQgbWVyZ2UgdG9waWMKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJzZXR1cCB1bmljb2RlIG5vcm1hbGl6YXRpb24gdGVzdHMiICcKKworICB0ZXN0X2NyZWF0ZV9yZXBvIHVuaWNvZGUgJiYKKyAgY2QgdW5pY29kZSAmJgorICB0b3VjaCAiJGF1bWxjZGlhciIgJiYKKyAgZ2l0IGFkZCAiJGF1bWxjZGlhciIgJiYKKyAgZ2l0IGNvbW1pdCAtbSBpbml0aWFsCisgIGdpdCB0YWcgaW5pdGlhbCAmJgorICBnaXQgY2hlY2tvdXQgLWIgdG9waWMgJiYKKyAgZ2l0IG12ICRhdW1sY2RpYXIgdG1wICYmCisgIGdpdCBtdiB0bXAgIiRhdW1sIiAmJgorICBnaXQgY29tbWl0IC1tIHJlbmFtZSAmJgorICBnaXQgY2hlY2tvdXQgLWYgbWFzdGVyCisKKycKKworJHRlc3RfdW5pY29kZSAncmVuYW1lIChzaWxlbnQgdW5pY29kZSBub3JtYWxpemF0aW9uKScgJworCisgZ2l0IG12ICIkYXVtbGNkaWFyIiAiJGF1bWwiICYmCisgZ2l0IGNvbW1pdCAtbSByZW5hbWUKKworJworCiskdGVzdF91bmljb2RlICdtZXJnZSAoc2lsZW50IHVuaWNvZGUgbm9ybWFsaXphdGlvbiknICcKKworIGdpdCByZXNldCAtLWhhcmQgaW5pdGlhbCAmJgorIGdpdCBtZXJnZSB0b3BpYworCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MTAwMC1yZWFkLXRyZWUtbS0zd2F5LnNoIGIvdC90MTAwMC1yZWFkLXRyZWUtbS0zd2F5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE3ZjUxOWYKLS0tIC9kZXYvbnVsbAorKysgYi90L3QxMDAwLXJlYWQtdHJlZS1tLTN3YXkuc2gKQEAgLTAsMCArMSw1MzEgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGhyZWUgd2F5IG1lcmdlIHdpdGggcmVhZC10cmVlIC1tCisKK1RoaXMgdGVzdCB0cmllcyB0aHJlZS13YXkgbWVyZ2Ugd2l0aCByZWFkLXRyZWUgLW0KKworVGhlcmUgaXMgb25lIGFuY2VzdG9yIChjYWxsZWQgTyBmb3IgT3JpZ2luYWwpIGFuZCB0d28gYnJhbmNoZXMgQQorYW5kIEIgZGVyaXZlZCBmcm9tIGl0LiAgV2Ugd2FudCB0byBkbyBhIDMtd2F5IG1lcmdlIGJldHdlZW4gQSBhbmQKK0IsIHVzaW5nIE8gYXMgdGhlIGNvbW1vbiBhbmNlc3Rvci4KKworICAgIG1lcmdlIEEgTyBCCisKK0RlY2lzaW9ucyBhcmUgbWFkZSBieSBjb21wYXJpbmcgY29udGVudHMgb2YgTywgQSBhbmQgQiBwYXRobmFtZQorYnkgcGF0aG5hbWUuICBUaGUgcmVzdWx0IGlzIGRldGVybWluZWQgYnkgdGhlIGZvbGxvd2luZyBndWlkaW5nCitwcmluY2lwbGU6CisKKyAtIElmIG9ubHkgQSBkb2VzIHNvbWV0aGluZyB0byBpdCBhbmQgQiBkb2VzIG5vdCB0b3VjaCBpdCwgdGFrZQorICAgd2hhdGV2ZXIgQSBkb2VzLgorCisgLSBJZiBvbmx5IEIgZG9lcyBzb21ldGhpbmcgdG8gaXQgYW5kIEEgZG9lcyBub3QgdG91Y2ggaXQsIHRha2UKKyAgIHdoYXRldmVyIEIgZG9lcy4KKworIC0gSWYgYm90aCBBIGFuZCBCIGRvZXMgc29tZXRoaW5nIGJ1dCBpbiB0aGUgc2FtZSB3YXksIHRha2UKKyAgIHdoYXRldmVyIHRoZXkgZG8uCisKKyAtIElmIEEgYW5kIEIgZG9lcyBzb21ldGhpbmcgYnV0IGRpZmZlcmVudCB0aGluZ3MsIHdlIG5lZWQgYQorICAgMy13YXkgbWVyZ2U6CisKKyAgIC0gV2UgY2Fubm90IGRvIGFueXRoaW5nIGFib3V0IHRoZSBmb2xsb3dpbmcgY2FzZXM6CisKKyAgICAgKiBPIGRvZXMgbm90IGhhdmUgaXQuICBBIGFuZCBCIGJvdGggbXVzdCBiZSBhZGRpbmcgdG8gdGhlCisgICAgICAgc2FtZSBwYXRoIGluZGVwZW5kZW50bHkuCisKKyAgICAgKiBBIGRlbGV0ZXMgaXQuICBCIG11c3QgYmUgbW9kaWZ5aW5nLgorCisgICAtIE90aGVyd2lzZSwgQSBhbmQgQiBhcmUgbW9kaWZ5aW5nLiAgUnVuIDMtd2F5IG1lcmdlLgorCitGaXJzdCwgdGhlIGNhc2UgbWF0cml4LgorCisgLSBWZXJ0aWNhbCBheGlzIGlzIGZvciBBJ1wnJ3MgYWN0aW9ucy4KKyAtIEhvcml6b250YWwgYXhpcyBpcyBmb3IgQidcJydzIGFjdGlvbnMuCisKKy4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCBBICAgICAgICBCIHwgTm8gQWN0aW9uICB8ICAgRGVsZXRlICAgfCAgIE1vZGlmeSAgIHwgICAgQWRkICAgICB8Cit8LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLXwKK3wgTm8gQWN0aW9uICB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfAorfCAgICAgICAgICAgIHwgc2VsZWN0IE8gICB8IGRlbGV0ZSAgICAgfCBzZWxlY3QgQiAgIHwgc2VsZWN0IEIgICB8Cit8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwKK3wtLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tfAorfCBEZWxldGUgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCAqKioqKioqKioqIHwgICAgY2FuICAgICB8Cit8ICAgICAgICAgICAgfCBkZWxldGUgICAgIHwgZGVsZXRlICAgICB8IG1lcmdlICAgICAgfCAgICBub3QgICAgIHwKK3wgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICBoYXBwZW4gICAgfAorfC0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS18Cit8IE1vZGlmeSAgICAgfCAgICAgICAgICAgIHwgKioqKioqKioqKiB8ID8/Pz8/Pz8/Pz8gfCAgICBjYW4gICAgIHwKK3wgICAgICAgICAgICB8IHNlbGVjdCBBICAgfCBtZXJnZSAgICAgIHwgc2VsZWN0IEE9QiB8ICAgIG5vdCAgICAgfAorfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCBtZXJnZSAgICAgIHwgIGhhcHBlbiAgICB8Cit8LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLXwKK3wgQWRkICAgICAgICB8ICAgICAgICAgICAgfCAgICBjYW4gICAgIHwgICAgY2FuICAgICB8ID8/Pz8/Pz8/Pz8gfAorfCAgICAgICAgICAgIHwgc2VsZWN0IEEgICB8ICAgIG5vdCAgICAgfCAgICBub3QgICAgIHwgc2VsZWN0IEE9QiB8Cit8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgIGhhcHBlbiAgICB8ICBoYXBwZW4gICAgfCBtZXJnZSAgICAgIHwKKy4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorCitJbiBhZGRpdGlvbjoKKworIFNTOiBhIHNwZWNpYWwgY2FzZSBvZiBNTSwgd2hlcmUgQSBhbmQgQiBtYWtlcyB0aGUgc2FtZSBtb2RpZmljYXRpb24uCisgTEw6IGEgc3BlY2lhbCBjYXNlIG9mIEFBLCB3aGVyZSBBIGFuZCBCIGNyZWF0ZXMgdGhlIHNhbWUgZmlsZS4KKyBUVDogYSBzcGVjaWFsIGNhc2Ugb2YgTU0sIHdoZXJlIEEgYW5kIEIgbWFrZXMgbWVyZ2VhYmxlIGNoYW5nZXMuCisgREY6IGEgc3BlY2lhbCBjYXNlLCB3aGVyZSBBIG1ha2VzIGEgZGlyZWN0b3J5IGFuZCBCIG1ha2VzIGEgZmlsZS4KKworJworLiAuL3Rlc3QtbGliLnNoCisuIC4uL2xpYi1yZWFkLXRyZWUtbS0zd2F5LnNoCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVHJpdmlhbCAibWFqb3JpdHkgd2hlbiAzIHN0YWdlcyBleGlzdCIgbWVyZ2UgcGx1cyAjMkFMVCwgIzNBTFQKKyMgYW5kICM1QUxUIHRyaXZpYWwgbWVyZ2VzLgorCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorMTAwNjQ0IFggMglBQQorMTAwNjQ0IFggMwlBQQorMTAwNjQ0IFggMAlBTgorMTAwNjQ0IFggMQlERAorMTAwNjQ0IFggMwlERgorMTAwNjQ0IFggMglERi9ERgorMTAwNjQ0IFggMQlETQorMTAwNjQ0IFggMwlETQorMTAwNjQ0IFggMQlETgorMTAwNjQ0IFggMwlETgorMTAwNjQ0IFggMAlMTAorMTAwNjQ0IFggMQlNRAorMTAwNjQ0IFggMglNRAorMTAwNjQ0IFggMQlNTQorMTAwNjQ0IFggMglNTQorMTAwNjQ0IFggMwlNTQorMTAwNjQ0IFggMAlNTgorMTAwNjQ0IFggMAlOQQorMTAwNjQ0IFggMQlORAorMTAwNjQ0IFggMglORAorMTAwNjQ0IFggMAlOTQorMTAwNjQ0IFggMAlOTgorMTAwNjQ0IFggMAlTUworMTAwNjQ0IFggMQlUVAorMTAwNjQ0IFggMglUVAorMTAwNjQ0IFggMwlUVAorMTAwNjQ0IFggMglaL0FBCisxMDA2NDQgWCAzCVovQUEKKzEwMDY0NCBYIDAJWi9BTgorMTAwNjQ0IFggMQlaL0RECisxMDA2NDQgWCAxCVovRE0KKzEwMDY0NCBYIDMJWi9ETQorMTAwNjQ0IFggMQlaL0ROCisxMDA2NDQgWCAzCVovRE4KKzEwMDY0NCBYIDEJWi9NRAorMTAwNjQ0IFggMglaL01ECisxMDA2NDQgWCAxCVovTU0KKzEwMDY0NCBYIDIJWi9NTQorMTAwNjQ0IFggMwlaL01NCisxMDA2NDQgWCAwCVovTU4KKzEwMDY0NCBYIDAJWi9OQQorMTAwNjQ0IFggMQlaL05ECisxMDA2NDQgWCAyCVovTkQKKzEwMDY0NCBYIDAJWi9OTQorMTAwNjQ0IFggMAlaL05OCitFT0YKKworX3g0MD0nWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXScKK194NDA9IiRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAiCisKK2NoZWNrX3Jlc3VsdCAoKSB7CisgICAgZ2l0IGxzLWZpbGVzIC0tc3RhZ2UgfCBzZWQgLWUgJ3MvICciJF94NDAiJyAvIFggLycgPmN1cnJlbnQgJiYKKyAgICBnaXQgZGlmZiBleHBlY3RlZCBjdXJyZW50Cit9CisKKyMgVGhpcyBpcyBkb25lIG9uIGFuIGVtcHR5IHdvcmsgZGlyZWN0b3J5LCB3aGljaCBpcyB0aGUgbm9ybWFsCisjIG1lcmdlIHBlcnNvbiBiZWhhdmlvdXIuCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMy13YXkgbWVyZ2Ugd2l0aCBnaXQgcmVhZC10cmVlIC1tLCBlbXB0eSBjYWNoZScgXAorICAgICJybSAtZnIgW05ETUFMVFNdW05ETUFMVFNGXSBaICYmCisgICAgIHJtIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKKyMgVGhpcyBzdGFydHMgb3V0IHdpdGggdGhlIGZpcnN0IGhlYWQsIHdoaWNoIGlzIHRoZSBub3JtYWwKKyMgcGF0Y2ggc3VibWl0dGVyIGJlaGF2aW91ci4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICczLXdheSBtZXJnZSB3aXRoIGdpdCByZWFkLXRyZWUgLW0sIG1hdGNoIEgnIFwKKyAgICAicm0gLWZyIFtORE1BTFRTXVtORE1BTFRTRl0gWiAmJgorICAgICBybSAuZ2l0L2luZGV4ICYmCisgICAgIGdpdCByZWFkLXRyZWUgJHRyZWVfQSAmJgorICAgICBnaXQgY2hlY2tvdXQtaW5kZXggLWYgLXUgLWEgJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKKzogPDxcRU5EX09GX0NBU0VfVEFCTEUKKworV2UgaGF2ZSBzbyBmYXIgdGVzdGVkIG9ubHkgZW1wdHkgaW5kZXggYW5kIGNsZWFuLWFuZC1tYXRjaGluZy1BIGluZGV4CitjYXNlIHdoaWNoIGFyZSB0cml2aWFsLiAgTWFrZSBzdXJlIGluZGV4IHJlcXVpcmVtZW50cyBhcmUgYWxzbworY2hlY2tlZC4KKworImdpdCByZWFkLXRyZWUgLW0gTyBBIEIiCisKKyAgICAgTyAgICAgICBBICAgICAgIEIgICAgICAgICByZXN1bHQgICAgICBpbmRleCByZXF1aXJlbWVudHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgMSAgbWlzc2luZyBtaXNzaW5nIG1pc3NpbmcgICAtICAgICAgICAgICBtdXN0IG5vdCBleGlzdC4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgMiAgbWlzc2luZyBtaXNzaW5nIGV4aXN0cyAgICB0YWtlIEIqICAgICBtdXN0IG1hdGNoIEIsIGlmIGV4aXN0cy4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgMyAgbWlzc2luZyBleGlzdHMgIG1pc3NpbmcgICB0YWtlIEEqICAgICBtdXN0IG1hdGNoIEEsIGlmIGV4aXN0cy4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgNCAgbWlzc2luZyBleGlzdHMgIEEhPUIgICAgICBubyBtZXJnZSAgICBtdXN0IG1hdGNoIEEgYW5kIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAtdG8tZGF0ZSwgaWYgZXhpc3RzLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICA1ICBtaXNzaW5nIGV4aXN0cyAgQT09QiAgICAgIHRha2UgQSAgICAgIG11c3QgbWF0Y2ggQSwgaWYgZXhpc3RzLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICA2ICBleGlzdHMgIG1pc3NpbmcgbWlzc2luZyAgIHJlbW92ZSAgICAgIG11c3Qgbm90IGV4aXN0LgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICA3ICBleGlzdHMgIG1pc3NpbmcgTyE9QiAgICAgIG5vIG1lcmdlICAgIG11c3Qgbm90IGV4aXN0LgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICA4ICBleGlzdHMgIG1pc3NpbmcgTz09QiAgICAgIHJlbW92ZSAgICAgIG11c3Qgbm90IGV4aXN0LgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICA5ICBleGlzdHMgIE8hPUEgICAgbWlzc2luZyAgIG5vIG1lcmdlICAgIG11c3QgbWF0Y2ggQSBhbmQgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cC10by1kYXRlLCBpZiBleGlzdHMuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMTAgIGV4aXN0cyAgTz09QSAgICBtaXNzaW5nICAgbm8gbWVyZ2UgICAgbXVzdCBtYXRjaCBBCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMTEgIGV4aXN0cyAgTyE9QSAgICBPIT1CICAgICAgbm8gbWVyZ2UgICAgbXVzdCBtYXRjaCBBIGFuZCBiZQorICAgICAgICAgICAgICAgICAgICAgQSE9QiAgICAgICAgICAgICAgICAgIHVwLXRvLWRhdGUsIGlmIGV4aXN0cy4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAxMiAgZXhpc3RzICBPIT1BICAgIE8hPUIgICAgICB0YWtlIEEgICAgICBtdXN0IG1hdGNoIEEsIGlmIGV4aXN0cy4KKyAgICAgICAgICAgICAgICAgICAgIEE9PUIKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAxMyAgZXhpc3RzICBPIT1BICAgIE89PUIgICAgICB0YWtlIEEgICAgICBtdXN0IG1hdGNoIEEsIGlmIGV4aXN0cy4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAxNCAgZXhpc3RzICBPPT1BICAgIE8hPUIgICAgICB0YWtlIEIgICAgICBpZiBleGlzdHMsIG11c3QgZWl0aGVyICgxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIEEgYW5kIGJlIHVwLXRvLWRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgKDIpIG1hdGNoIEIuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMTUgIGV4aXN0cyAgTz09QSAgICBPPT1CICAgICAgdGFrZSBCICAgICAgbXVzdCBtYXRjaCBBIGlmIGV4aXN0cy4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAxNiAgZXhpc3RzICBPPT1BICAgIE89PUIgICAgICBiYXJmICAgICAgICBtdXN0IG1hdGNoIEEgaWYgZXhpc3RzLgorICAgICAqbXVsdGkqIGluIG9uZSAgaW4gYW5vdGhlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3RlOiB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgaW4gY2FzZSAyIGFuZCAzLiAgVGhlIHRyZWUgQSBtYXkgY29udGFpbgorREYgKGZpbGUpIHdoZW4gdHJlZSBCIHJlcXVpcmUgREYgdG8gYmUgYSBkaXJlY3RvcnkgYnkgaGF2aW5nIERGL0RGCisoZmlsZSkuCisKK0VORF9PRl9DQVNFX1RBQkxFCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJzEgLSBtdXN0IG5vdCBoYXZlIGFuIGVudHJ5IG5vdCBpbiBBLicgIgorICAgICBybSAtZiAuZ2l0L2luZGV4IFhYICYmCisgICAgIGVjaG8gWFggPlhYICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgWFggJiYKKyAgICAgdGVzdF9tdXN0X2ZhaWwgZ2l0IHJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQgorIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMiAtIG11c3QgbWF0Y2ggQiBpbiAhTyAmJiAhQSAmJiBCIGNhc2UuJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTkEgJiYKKyAgICAgY3AgLm9yaWctQi9OQSBOQSAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIE5BICYmCisgICAgIGdpdCByZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcyIC0gbWF0Y2hpbmcgQiBhbG9uZSBpcyBPSyBpbiAhTyAmJiAhQSAmJiBCIGNhc2UuJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTkEgJiYKKyAgICAgY3AgLm9yaWctQi9OQSBOQSAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIE5BICYmCisgICAgIGVjaG8gZXh0cmEgPj5OQSAmJgorICAgICBnaXQgcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMyAtIG11c3QgbWF0Y2ggQSBpbiAhTyAmJiBBICYmICFCIGNhc2UuJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggQU4gJiYKKyAgICAgY3AgLm9yaWctQS9BTiBBTiAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIEFOICYmCisgICAgIGdpdCByZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMyAtIG1hdGNoaW5nIEEgYWxvbmUgaXMgT0sgaW4gIU8gJiYgQSAmJiAhQiBjYXNlLicgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IEFOICYmCisgICAgIGNwIC5vcmlnLUEvQU4gQU4gJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBBTiAmJgorICAgICBlY2hvIGV4dHJhID4+QU4gJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzMgKGZhaWwpIC0gbXVzdCBtYXRjaCBBIGluICFPICYmIEEgJiYgIUIgY2FzZS4nICIKKyAgICAgcm0gLWYgLmdpdC9pbmRleCBBTiAmJgorICAgICBjcCAub3JpZy1BL0FOIEFOICYmCisgICAgIGVjaG8gZXh0cmEgPj5BTiAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIEFOICYmCisgICAgIHRlc3RfbXVzdF9mYWlsIGdpdCByZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IKKyIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzQgLSBtdXN0IG1hdGNoIGFuZCBiZSB1cC10by1kYXRlIGluICFPICYmIEEgJiYgQiAmJiBBIT1CIGNhc2UuJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggQUEgJiYKKyAgICAgY3AgLm9yaWctQS9BQSBBQSAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIEFBICYmCisgICAgIGdpdCByZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnNCAoZmFpbCkgLSBtdXN0IG1hdGNoIGFuZCBiZSB1cC10by1kYXRlIGluICFPICYmIEEgJiYgQiAmJiBBIT1CIGNhc2UuJyAiCisgICAgIHJtIC1mIC5naXQvaW5kZXggQUEgJiYKKyAgICAgY3AgLm9yaWctQS9BQSBBQSAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIEFBICYmCisgICAgIGVjaG8gZXh0cmEgPj5BQSAmJgorICAgICB0ZXN0X211c3RfZmFpbCBnaXQgcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CCisiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc0IChmYWlsKSAtIG11c3QgbWF0Y2ggYW5kIGJlIHVwLXRvLWRhdGUgaW4gIU8gJiYgQSAmJiBCICYmIEEhPUIgY2FzZS4nICIKKyAgICAgcm0gLWYgLmdpdC9pbmRleCBBQSAmJgorICAgICBjcCAub3JpZy1BL0FBIEFBICYmCisgICAgIGVjaG8gZXh0cmEgPj5BQSAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIEFBICYmCisgICAgIHRlc3RfbXVzdF9mYWlsIGdpdCByZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IKKyIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzUgLSBtdXN0IG1hdGNoIGluICFPICYmIEEgJiYgQiAmJiBBPT1CIGNhc2UuJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTEwgJiYKKyAgICAgY3AgLm9yaWctQS9MTCBMTCAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIExMICYmCisgICAgIGdpdCByZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnNSAtIG11c3QgbWF0Y2ggaW4gIU8gJiYgQSAmJiBCICYmIEE9PUIgY2FzZS4nIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBMTCAmJgorICAgICBjcCAub3JpZy1BL0xMIExMICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgTEwgJiYKKyAgICAgZWNobyBleHRyYSA+PkxMICYmCisgICAgIGdpdCByZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnNSAoZmFpbCkgLSBtdXN0IG1hdGNoIEEgaW4gIU8gJiYgQSAmJiBCICYmIEE9PUIgY2FzZS4nICIKKyAgICAgcm0gLWYgLmdpdC9pbmRleCBMTCAmJgorICAgICBjcCAub3JpZy1BL0xMIExMICYmCisgICAgIGVjaG8gZXh0cmEgPj5MTCAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIExMICYmCisgICAgIHRlc3RfbXVzdF9mYWlsIGdpdCByZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IKKyIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzYgLSBtdXN0IG5vdCBleGlzdCBpbiBPICYmICFBICYmICFCIGNhc2UnICIKKyAgICAgcm0gLWYgLmdpdC9pbmRleCBERCAmJgorICAgICBlY2hvIEREID5ERAorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIEREICYmCisgICAgIHRlc3RfbXVzdF9mYWlsIGdpdCByZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IKKyIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzcgLSBtdXN0IG5vdCBleGlzdCBpbiBPICYmICFBICYmIEIgJiYgTyE9QiBjYXNlJyAiCisgICAgIHJtIC1mIC5naXQvaW5kZXggRE0gJiYKKyAgICAgY3AgLm9yaWctQi9ETSBETSAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIERNICYmCisgICAgIHRlc3RfbXVzdF9mYWlsIGdpdCByZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IKKyIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzggLSBtdXN0IG5vdCBleGlzdCBpbiBPICYmICFBICYmIEIgJiYgTz09QiBjYXNlJyAiCisgICAgIHJtIC1mIC5naXQvaW5kZXggRE4gJiYKKyAgICAgY3AgLm9yaWctQi9ETiBETiAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIEROICYmCisgICAgIHRlc3RfbXVzdF9mYWlsIGdpdCByZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IKKyIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzkgLSBtdXN0IG1hdGNoIGFuZCBiZSB1cC10by1kYXRlIGluIE8gJiYgQSAmJiAhQiAmJiBPIT1BIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBNRCAmJgorICAgICBjcCAub3JpZy1BL01EIE1EICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgTUQgJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc5IChmYWlsKSAtIG11c3QgbWF0Y2ggYW5kIGJlIHVwLXRvLWRhdGUgaW4gTyAmJiBBICYmICFCICYmIE8hPUEgY2FzZScgIgorICAgICBybSAtZiAuZ2l0L2luZGV4IE1EICYmCisgICAgIGNwIC5vcmlnLUEvTUQgTUQgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBNRCAmJgorICAgICBlY2hvIGV4dHJhID4+TUQgJiYKKyAgICAgdGVzdF9tdXN0X2ZhaWwgZ2l0IHJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQgorIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnOSAoZmFpbCkgLSBtdXN0IG1hdGNoIGFuZCBiZSB1cC10by1kYXRlIGluIE8gJiYgQSAmJiAhQiAmJiBPIT1BIGNhc2UnICIKKyAgICAgcm0gLWYgLmdpdC9pbmRleCBNRCAmJgorICAgICBjcCAub3JpZy1BL01EIE1EICYmCisgICAgIGVjaG8gZXh0cmEgPj5NRCAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIE1EICYmCisgICAgIHRlc3RfbXVzdF9mYWlsIGdpdCByZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IKKyIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzEwIC0gbXVzdCBtYXRjaCBhbmQgYmUgdXAtdG8tZGF0ZSBpbiBPICYmIEEgJiYgIUIgJiYgTz09QSBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTkQgJiYKKyAgICAgY3AgLm9yaWctQS9ORCBORCAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIE5EICYmCisgICAgIGdpdCByZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTAgKGZhaWwpIC0gbXVzdCBtYXRjaCBhbmQgYmUgdXAtdG8tZGF0ZSBpbiBPICYmIEEgJiYgIUIgJiYgTz09QSBjYXNlJyAiCisgICAgIHJtIC1mIC5naXQvaW5kZXggTkQgJiYKKyAgICAgY3AgLm9yaWctQS9ORCBORCAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIE5EICYmCisgICAgIGVjaG8gZXh0cmEgPj5ORCAmJgorICAgICB0ZXN0X211c3RfZmFpbCBnaXQgcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CCisiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxMCAoZmFpbCkgLSBtdXN0IG1hdGNoIGFuZCBiZSB1cC10by1kYXRlIGluIE8gJiYgQSAmJiAhQiAmJiBPPT1BIGNhc2UnICIKKyAgICAgcm0gLWYgLmdpdC9pbmRleCBORCAmJgorICAgICBjcCAub3JpZy1BL05EIE5EICYmCisgICAgIGVjaG8gZXh0cmEgPj5ORCAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIE5EICYmCisgICAgIHRlc3RfbXVzdF9mYWlsIGdpdCByZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IKKyIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzExIC0gbXVzdCBtYXRjaCBhbmQgYmUgdXAtdG8tZGF0ZSBpbiBPICYmIEEgJiYgQiAmJiBPIT1BICYmIE8hPUIgJiYgQSE9QiBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTU0gJiYKKyAgICAgY3AgLm9yaWctQS9NTSBNTSAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIE1NICYmCisgICAgIGdpdCByZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTEgKGZhaWwpIC0gbXVzdCBtYXRjaCBhbmQgYmUgdXAtdG8tZGF0ZSBpbiBPICYmIEEgJiYgQiAmJiBPIT1BICYmIE8hPUIgJiYgQSE9QiBjYXNlJyAiCisgICAgIHJtIC1mIC5naXQvaW5kZXggTU0gJiYKKyAgICAgY3AgLm9yaWctQS9NTSBNTSAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIE1NICYmCisgICAgIGVjaG8gZXh0cmEgPj5NTSAmJgorICAgICB0ZXN0X211c3RfZmFpbCBnaXQgcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CCisiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxMSAoZmFpbCkgLSBtdXN0IG1hdGNoIGFuZCBiZSB1cC10by1kYXRlIGluIE8gJiYgQSAmJiBCICYmIE8hPUEgJiYgTyE9QiAmJiBBIT1CIGNhc2UnICIKKyAgICAgcm0gLWYgLmdpdC9pbmRleCBNTSAmJgorICAgICBjcCAub3JpZy1BL01NIE1NICYmCisgICAgIGVjaG8gZXh0cmEgPj5NTSAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIE1NICYmCisgICAgIHRlc3RfbXVzdF9mYWlsIGdpdCByZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IKKyIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzEyIC0gbXVzdCBtYXRjaCBBIGluIE8gJiYgQSAmJiBCICYmIE8hPUEgJiYgQT09QiBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggU1MgJiYKKyAgICAgY3AgLm9yaWctQS9TUyBTUyAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIFNTICYmCisgICAgIGdpdCByZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTIgLSBtdXN0IG1hdGNoIEEgaW4gTyAmJiBBICYmIEIgJiYgTyE9QSAmJiBBPT1CIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBTUyAmJgorICAgICBjcCAub3JpZy1BL1NTIFNTICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgU1MgJiYKKyAgICAgZWNobyBleHRyYSA+PlNTICYmCisgICAgIGdpdCByZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTIgKGZhaWwpIC0gbXVzdCBtYXRjaCBBIGluIE8gJiYgQSAmJiBCICYmIE8hPUEgJiYgQT09QiBjYXNlJyAiCisgICAgIHJtIC1mIC5naXQvaW5kZXggU1MgJiYKKyAgICAgY3AgLm9yaWctQS9TUyBTUyAmJgorICAgICBlY2hvIGV4dHJhID4+U1MgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBTUyAmJgorICAgICB0ZXN0X211c3RfZmFpbCBnaXQgcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CCisiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxMyAtIG11c3QgbWF0Y2ggQSBpbiBPICYmIEEgJiYgQiAmJiBPIT1BICYmIE89PUIgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE1OICYmCisgICAgIGNwIC5vcmlnLUEvTU4gTU4gJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBNTiAmJgorICAgICBnaXQgcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CICYmCisgICAgIGNoZWNrX3Jlc3VsdCIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzEzIC0gbXVzdCBtYXRjaCBBIGluIE8gJiYgQSAmJiBCICYmIE8hPUEgJiYgTz09QiBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTU4gJiYKKyAgICAgY3AgLm9yaWctQS9NTiBNTiAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIE1OICYmCisgICAgIGVjaG8gZXh0cmEgPj5NTiAmJgorICAgICBnaXQgcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CICYmCisgICAgIGNoZWNrX3Jlc3VsdCIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE0IC0gbXVzdCBtYXRjaCBhbmQgYmUgdXAtdG8tZGF0ZSBpbiBPICYmIEEgJiYgQiAmJiBPPT1BICYmIE8hPUIgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE5NICYmCisgICAgIGNwIC5vcmlnLUEvTk0gTk0gJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBOTSAmJgorICAgICBnaXQgcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CICYmCisgICAgIGNoZWNrX3Jlc3VsdCIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE0IC0gbWF5IG1hdGNoIEIgaW4gTyAmJiBBICYmIEIgJiYgTz09QSAmJiBPIT1CIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBOTSAmJgorICAgICBjcCAub3JpZy1CL05NIE5NICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgTk0gJiYKKyAgICAgZWNobyBleHRyYSA+Pk5NICYmCisgICAgIGdpdCByZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTQgKGZhaWwpIC0gbXVzdCBtYXRjaCBhbmQgYmUgdXAtdG8tZGF0ZSBpbiBPICYmIEEgJiYgQiAmJiBPPT1BICYmIE8hPUIgY2FzZScgIgorICAgICBybSAtZiAuZ2l0L2luZGV4IE5NICYmCisgICAgIGNwIC5vcmlnLUEvTk0gTk0gJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBOTSAmJgorICAgICBlY2hvIGV4dHJhID4+Tk0gJiYKKyAgICAgdGVzdF9tdXN0X2ZhaWwgZ2l0IHJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQgorIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTQgKGZhaWwpIC0gbXVzdCBtYXRjaCBhbmQgYmUgdXAtdG8tZGF0ZSBpbiBPICYmIEEgJiYgQiAmJiBPPT1BICYmIE8hPUIgY2FzZScgIgorICAgICBybSAtZiAuZ2l0L2luZGV4IE5NICYmCisgICAgIGNwIC5vcmlnLUEvTk0gTk0gJiYKKyAgICAgZWNobyBleHRyYSA+Pk5NICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgTk0gJiYKKyAgICAgdGVzdF9tdXN0X2ZhaWwgZ2l0IHJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQgorIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTUgLSBtdXN0IG1hdGNoIEEgaW4gTyAmJiBBICYmIEIgJiYgTz09QSAmJiBPPT1CIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBOTiAmJgorICAgICBjcCAub3JpZy1BL05OIE5OICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgTk4gJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxNSAtIG11c3QgbWF0Y2ggQSBpbiBPICYmIEEgJiYgQiAmJiBPPT1BICYmIE89PUIgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE5OICYmCisgICAgIGNwIC5vcmlnLUEvTk4gTk4gJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBOTiAmJgorICAgICBlY2hvIGV4dHJhID4+Tk4gJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxNSAoZmFpbCkgLSBtdXN0IG1hdGNoIEEgaW4gTyAmJiBBICYmIEIgJiYgTz09QSAmJiBPPT1CIGNhc2UnICIKKyAgICAgcm0gLWYgLmdpdC9pbmRleCBOTiAmJgorICAgICBjcCAub3JpZy1BL05OIE5OICYmCisgICAgIGVjaG8gZXh0cmEgPj5OTiAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIE5OICYmCisgICAgIHRlc3RfbXVzdF9mYWlsIGdpdCByZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IKKyIKKworIyAjMTYKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxNiAtIEEgbWF0Y2hlcyBpbiBvbmUgYW5kIEIgbWF0Y2hlcyBpbiBhbm90aGVyLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IEYxNiAmJgorICAgIGVjaG8gRjE2ID5GMTYgJiYKKyAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIEYxNiAmJgorICAgIHRyZWUwPWBnaXQgd3JpdGUtdHJlZWAgJiYKKyAgICBlY2hvIEUxNiA+RjE2ICYmCisgICAgZ2l0IHVwZGF0ZS1pbmRleCBGMTYgJiYKKyAgICB0cmVlMT1gZ2l0IHdyaXRlLXRyZWVgICYmCisgICAgZ2l0IHJlYWQtdHJlZSAtbSAkdHJlZTAgJHRyZWUxICR0cmVlMSAkdHJlZTAgJiYKKyAgICBnaXQgbHMtZmlsZXMgLS1zdGFnZScKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QxMDAxLXJlYWQtdHJlZS1tLTJ3YXkuc2ggYi90L3QxMDAxLXJlYWQtdHJlZS1tLTJ3YXkuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjAxYjAwMwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDEwMDEtcmVhZC10cmVlLW0tMndheS5zaApAQCAtMCwwICsxLDM0NCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUd28gd2F5IG1lcmdlIHdpdGggcmVhZC10cmVlIC1tICRIICRNCisKK1RoaXMgdGVzdCB0cmllcyB0d28td2F5IG1lcmdlIChha2EgZmFzdCBmb3J3YXJkIHdpdGggY2FycnkgZm9yd2FyZCkuCisKK1RoZXJlIGlzIHRoZSBoZWFkIChjYWxsZWQgSCkgYW5kIGFub3RoZXIgY29tbWl0IChjYWxsZWQgTSksIHdoaWNoIGlzCitzaW1wbHkgYWhlYWQgb2YgSC4gIFRoZSBpbmRleCBhbmQgdGhlIHdvcmsgdHJlZSBjb250YWlucyBhIHN0YXRlIHRoYXQKK2lzIGRlcml2ZWQgZnJvbSBILCBidXQgbWF5IGFsc28gaGF2ZSBsb2NhbCBjaGFuZ2VzLiAgVGhpcyB0ZXN0IGNoZWNrcworYWxsIHRoZSBjb21iaW5hdGlvbnMgZGVzY3JpYmVkIGluIHRoZSB0d28tdHJlZSBtZXJnZSAiY2FycnkgZm9yd2FyZCIKK3J1bGVzLCBmb3VuZCBpbiA8RG9jdW1lbnRhdGlvbi9naXQgcmVhZC10cmVlLnR4dD4uCisKK0luIHRoZSB0ZXN0LCB0aGVzZSBwYXRocyBhcmUgdXNlZDoKKyAgICAgICAgYm96YmFyICAtIGluIEgsIHN0YXlzIGluIE0sIG1vZGlmaWVkIGZyb20gYm96YmFyIHRvIGdudXN0bworICAgICAgICBmcm90eiAgIC0gbm90IGluIEggYWRkZWQgaW4gTQorICAgICAgICBuaXRmb2wgIC0gaW4gSCwgc3RheXMgaW4gTSB1bm1vZGlmaWVkCisgICAgICAgIHJlenJvdiAgLSBpbiBILCBkZWxldGVkIGluIE0KKyAgICAgICAgeW9taW4gICAtIG5vdCBpbiBIIG5vciBNCisnCisuIC4vdGVzdC1saWIuc2gKKworcmVhZF90cmVlX3R3b3dheSAoKSB7CisgICAgZ2l0IHJlYWQtdHJlZSAtbSAiJDEiICIkMiIgJiYgZ2l0IGxzLWZpbGVzIC0tc3RhZ2UKK30KKworX3g0MD0nWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXScKK194NDA9IiRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAiCitjb21wYXJlX2NoYW5nZSAoKSB7CisJc2VkIC1uID5jdXJyZW50IFwKKwkgICAgLWUgJy9eLS0tIC9kOyAvXisrKyAvZDsgL15AQCAvZDsnIFwKKwkgICAgLWUgJ3MvXlwoWy0rXVswLTddWzAtN11bMC03XVswLTddWzAtN11bMC03XVwpICciJF94NDAiJyAvXDEgWCAvcCcgXAorCSAgICAiJDEiCisJZ2l0IGRpZmYgZXhwZWN0ZWQgY3VycmVudAorfQorCitjaGVja19jYWNoZV9hdCAoKSB7CisJY2xlYW5faWZfZW1wdHk9YGdpdCBkaWZmLWZpbGVzIC0tICIkMSJgCisJY2FzZSAiJGNsZWFuX2lmX2VtcHR5IiBpbgorCScnKSAgZWNobyAiJDE6IGNsZWFuIiA7OworCT8qKSAgZWNobyAiJDE6IGRpcnR5IiA7OworCWVzYWMKKwljYXNlICIkMiwkY2xlYW5faWZfZW1wdHkiIGluCisJY2xlYW4sKQkJOiAgICAgOzsKKwljbGVhbiw/KikJZmFsc2UgOzsKKwlkaXJ0eSwpCQlmYWxzZSA7OworCWRpcnR5LD8qKQk6ICAgICA7OworCWVzYWMKK30KKworY2F0ID5ib3piYXItb2xkIDw8XEVPRgorVGhpcyBpcyBhIHNhbXBsZSBmaWxlIHVzZWQgaW4gdHdvLXdheSBmYXN0IGZvcndhcmQgbWVyZ2UKK3Rlc3RzLiAgSXRzIHNlY29uZCBsaW5lIGVuZHMgd2l0aCBhIG1hZ2ljIHdvcmQgYm96YmFyCit3aGljaCB3aWxsIGJlIG1vZGlmaWVkIGJ5IHRoZSBtZXJnZWQgaGVhZCB0byBnbnVzdG8uCitJdCBoYXMgc29tZSBleHRyYSBsaW5lcyBzbyB0aGF0IGV4dGVybmFsIHRvb2xzIGNhbgorc3VjY2Vzc2Z1bGx5IG1lcmdlIGluZGVwZW5kZW50IGNoYW5nZXMgbWFkZSB0byBsYXRlcgorbGluZXMgKHN1Y2ggYXMgdGhpcyBvbmUpLCBhdm9pZGluZyBsaW5lIGNvbmZsaWN0cy4KK0VPRgorCitzZWQgLWUgJ3MvYm96YmFyL2dudXN0byAoZWFybGllciBib3piYXIpLycgYm96YmFyLW9sZCA+Ym96YmFyLW5ldworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICBzZXR1cCBcCisgICAgJ2VjaG8gZnJvdHogPmZyb3R6ICYmCisgICAgIGVjaG8gbml0Zm9sID5uaXRmb2wgJiYKKyAgICAgY2F0IGJvemJhci1vbGQgPmJvemJhciAmJgorICAgICBlY2hvIHJlenJvdiA+cmV6cm92ICYmCisgICAgIGVjaG8geW9taW4gPnlvbWluICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgbml0Zm9sIGJvemJhciByZXpyb3YgJiYKKyAgICAgdHJlZUg9YGdpdCB3cml0ZS10cmVlYCAmJgorICAgICBlY2hvIHRyZWVIICR0cmVlSCAmJgorICAgICBnaXQgbHMtdHJlZSAkdHJlZUggJiYKKworICAgICBjYXQgYm96YmFyLW5ldyA+Ym96YmFyICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgZnJvdHogYm96YmFyIC0tZm9yY2UtcmVtb3ZlIHJlenJvdiAmJgorICAgICBnaXQgbHMtZmlsZXMgLS1zdGFnZSA+TS5vdXQgJiYKKyAgICAgdHJlZU09YGdpdCB3cml0ZS10cmVlYCAmJgorICAgICBlY2hvIHRyZWVNICR0cmVlTSAmJgorICAgICBnaXQgbHMtdHJlZSAkdHJlZU0gJiYKKyAgICAgZ2l0IGRpZmYtdHJlZSAkdHJlZUggJHRyZWVNJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMSwgMiwgMyAtIG5vIGNhcnJ5IGZvcndhcmQnIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0IGxzLWZpbGVzIC0tc3RhZ2UgPjEtMy5vdXQgJiYKKyAgICAgZ2l0IGRpZmYgTS5vdXQgMS0zLm91dCAmJgorICAgICBjaGVja19jYWNoZV9hdCBib3piYXIgZGlydHkgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgZnJvdHogZGlydHkgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgbml0Zm9sIGRpcnR5JworCitlY2hvICcrMTAwNjQ0IFggMAl5b21pbicgPmV4cGVjdGVkCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc0IC0gY2FycnkgZm9yd2FyZCBsb2NhbCBhZGRpdGlvbi4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQgcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQgY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCB5b21pbiAmJgorICAgICByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0IGxzLWZpbGVzIC0tc3RhZ2UgPjQub3V0IHx8IHJldHVybiAxCisgICAgIGdpdCBkaWZmIE0ub3V0IDQub3V0ID40ZGlmZi5vdXQKKyAgICAgY29tcGFyZV9jaGFuZ2UgNGRpZmYub3V0IGV4cGVjdGVkICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IHlvbWluIGNsZWFuJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnNSAtIGNhcnJ5IGZvcndhcmQgbG9jYWwgYWRkaXRpb24uJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0IGNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGVjaG8geW9taW4gPnlvbWluICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgeW9taW4gJiYKKyAgICAgZWNobyB5b21pbiB5b21pbiA+eW9taW4gJiYKKyAgICAgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdCBscy1maWxlcyAtLXN0YWdlID41Lm91dCB8fCByZXR1cm4gMQorICAgICBnaXQgZGlmZiBNLm91dCA1Lm91dCA+NWRpZmYub3V0CisgICAgIGNvbXBhcmVfY2hhbmdlIDVkaWZmLm91dCBleHBlY3RlZCAmJgorICAgICBjaGVja19jYWNoZV9hdCB5b21pbiBkaXJ0eScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzYgLSBsb2NhbCBhZGRpdGlvbiBhbHJlYWR5IGhhcyB0aGUgc2FtZS4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQgcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQgY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBmcm90eiAmJgorICAgICByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0IGxzLWZpbGVzIC0tc3RhZ2UgPjYub3V0ICYmCisgICAgIGdpdCBkaWZmIE0ub3V0IDYub3V0ICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IGZyb3R6IGNsZWFuJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnNyAtIGxvY2FsIGFkZGl0aW9uIGFscmVhZHkgaGFzIHRoZSBzYW1lLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdCByZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdCBjaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBlY2hvIGZyb3R6ID5mcm90eiAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGZyb3R6ICYmCisgICAgIGVjaG8gZnJvdHogZnJvdHogPmZyb3R6ICYmCisgICAgIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQgbHMtZmlsZXMgLS1zdGFnZSA+Ny5vdXQgJiYKKyAgICAgZ2l0IGRpZmYgTS5vdXQgNy5vdXQgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgZnJvdHogZGlydHknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc4IC0gY29uZmxpY3RpbmcgYWRkaXRpb24uJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0IGNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGVjaG8gZnJvdHogZnJvdHogPmZyb3R6ICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgZnJvdHogJiYKKyAgICAgaWYgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnOSAtIGNvbmZsaWN0aW5nIGFkZGl0aW9uLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdCByZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdCBjaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBlY2hvIGZyb3R6IGZyb3R6ID5mcm90eiAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGZyb3R6ICYmCisgICAgIGVjaG8gZnJvdHogPmZyb3R6ICYmCisgICAgIGlmIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzEwIC0gcGF0aCByZW1vdmVkLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdCByZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdCBjaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBlY2hvIHJlenJvdiA+cmV6cm92ICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgcmV6cm92ICYmCisgICAgIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQgbHMtZmlsZXMgLS1zdGFnZSA+MTAub3V0ICYmCisgICAgIGdpdCBkaWZmIE0ub3V0IDEwLm91dCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzExIC0gZGlydHkgcGF0aCByZW1vdmVkLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdCByZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdCBjaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBlY2hvIHJlenJvdiA+cmV6cm92ICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgcmV6cm92ICYmCisgICAgIGVjaG8gcmV6cm92IHJlenJvdiA+cmV6cm92ICYmCisgICAgIGlmIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzEyIC0gdW5tYXRjaGluZyBsb2NhbCBjaGFuZ2VzIGJlaW5nIHJlbW92ZWQuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0IGNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGVjaG8gcmV6cm92IHJlenJvdiA+cmV6cm92ICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgcmV6cm92ICYmCisgICAgIGlmIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzEzIC0gdW5tYXRjaGluZyBsb2NhbCBjaGFuZ2VzIGJlaW5nIHJlbW92ZWQuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0IGNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGVjaG8gcmV6cm92IHJlenJvdiA+cmV6cm92ICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgcmV6cm92ICYmCisgICAgIGVjaG8gcmV6cm92ID5yZXpyb3YgJiYKKyAgICAgaWYgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpJworCitjYXQgPmV4cGVjdGVkIDw8RU9GCistMTAwNjQ0IFggMAluaXRmb2wKKysxMDA2NDQgWCAwCW5pdGZvbAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxNCAtIHVuY2hhbmdlZCBpbiB0d28gaGVhZHMuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0IGNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGVjaG8gbml0Zm9sIG5pdGZvbCA+bml0Zm9sICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgbml0Zm9sICYmCisgICAgIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQgbHMtZmlsZXMgLS1zdGFnZSA+MTQub3V0IHx8IHJldHVybiAxCisgICAgIGdpdCBkaWZmIE0ub3V0IDE0Lm91dCA+MTRkaWZmLm91dAorICAgICBjb21wYXJlX2NoYW5nZSAxNGRpZmYub3V0IGV4cGVjdGVkICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IG5pdGZvbCBjbGVhbicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE1IC0gdW5jaGFuZ2VkIGluIHR3byBoZWFkcy4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQgcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQgY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgZWNobyBuaXRmb2wgbml0Zm9sID5uaXRmb2wgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBuaXRmb2wgJiYKKyAgICAgZWNobyBuaXRmb2wgbml0Zm9sIG5pdGZvbCA+bml0Zm9sICYmCisgICAgIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQgbHMtZmlsZXMgLS1zdGFnZSA+MTUub3V0IHx8IHJldHVybiAxCisgICAgIGdpdCBkaWZmIE0ub3V0IDE1Lm91dCA+MTVkaWZmLm91dAorICAgICBjb21wYXJlX2NoYW5nZSAxNWRpZmYub3V0IGV4cGVjdGVkICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IG5pdGZvbCBkaXJ0eScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE2IC0gY29uZmxpY3RpbmcgbG9jYWwgY2hhbmdlLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdCByZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdCBjaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBlY2hvIGJvemJhciBib3piYXIgPmJvemJhciAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGJvemJhciAmJgorICAgICBpZiByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxNyAtIGNvbmZsaWN0aW5nIGxvY2FsIGNoYW5nZS4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQgcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQgY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgZWNobyBib3piYXIgYm96YmFyID5ib3piYXIgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBib3piYXIgJiYKKyAgICAgZWNobyBib3piYXIgYm96YmFyIGJvemJhciA+Ym96YmFyICYmCisgICAgIGlmIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE4IC0gbG9jYWwgY2hhbmdlIGFscmVhZHkgaGF2aW5nIGEgZ29vZCByZXN1bHQuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0IGNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGNhdCBib3piYXItbmV3ID5ib3piYXIgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBib3piYXIgJiYKKyAgICAgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdCBscy1maWxlcyAtLXN0YWdlID4xOC5vdXQgJiYKKyAgICAgZ2l0IGRpZmYgTS5vdXQgMTgub3V0ICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IGJvemJhciBjbGVhbicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE5IC0gbG9jYWwgY2hhbmdlIGFscmVhZHkgaGF2aW5nIGEgZ29vZCByZXN1bHQsIGZ1cnRoZXIgbW9kaWZpZWQuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0IGNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGNhdCBib3piYXItbmV3ID5ib3piYXIgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBib3piYXIgJiYKKyAgICAgZWNobyBnbnVzdG8gZ251c3RvID5ib3piYXIgJiYKKyAgICAgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdCBscy1maWxlcyAtLXN0YWdlID4xOS5vdXQgJiYKKyAgICAgZ2l0IGRpZmYgTS5vdXQgMTkub3V0ICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IGJvemJhciBkaXJ0eScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzIwIC0gbm8gbG9jYWwgY2hhbmdlLCB1c2UgbmV3IHRyZWUuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0IGNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGNhdCBib3piYXItb2xkID5ib3piYXIgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBib3piYXIgJiYKKyAgICAgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdCBscy1maWxlcyAtLXN0YWdlID4yMC5vdXQgJiYKKyAgICAgZ2l0IGRpZmYgTS5vdXQgMjAub3V0ICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IGJvemJhciBkaXJ0eScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzIxIC0gbm8gbG9jYWwgY2hhbmdlLCBkaXJ0eSBjYWNoZS4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQgcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQgY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgY2F0IGJvemJhci1vbGQgPmJvemJhciAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGJvemJhciAmJgorICAgICBlY2hvIGdudXN0byBnbnVzdG8gPmJvemJhciAmJgorICAgICBpZiByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKKyMgVGhpcyBmYWlscyB3aXRoIHN0cmFpZ2h0IHR3by13YXkgZmFzdCBmb3J3YXJkLgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzIyIC0gbG9jYWwgY2hhbmdlIGNhY2hlIHVwZGF0ZWQuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0IGNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIHNlZCAtZSAicy9zdWNoIGFzL1NVQ0ggQVMvIiBib3piYXItb2xkID5ib3piYXIgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBib3piYXIgJiYKKyAgICAgaWYgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpJworCisjIEFsc28gbWFrZSBzdXJlIHdlIGRpZCBub3QgYnJlYWsgREYgdnMgREYvREYgY2FzZS4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdERiB2cyBERi9ERiBjYXNlIHNldHVwLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGVjaG8gREYgPkRGICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgREYgJiYKKyAgICAgdHJlZURGPWBnaXQgd3JpdGUtdHJlZWAgJiYKKyAgICAgZWNobyB0cmVlREYgJHRyZWVERiAmJgorICAgICBnaXQgbHMtdHJlZSAkdHJlZURGICYmCisKKyAgICAgcm0gLWYgREYgJiYKKyAgICAgbWtkaXIgREYgJiYKKyAgICAgZWNobyBERi9ERiA+REYvREYgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBERiBERi9ERiAmJgorICAgICB0cmVlREZERj1gZ2l0IHdyaXRlLXRyZWVgICYmCisgICAgIGVjaG8gdHJlZURGREYgJHRyZWVERkRGICYmCisgICAgIGdpdCBscy10cmVlICR0cmVlREZERiAmJgorICAgICBnaXQgbHMtZmlsZXMgLS1zdGFnZSA+REZERi5vdXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdERiB2cyBERi9ERiBjYXNlIHRlc3QuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgcm0gLWZyIERGICYmCisgICAgIGVjaG8gREYgPkRGICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgREYgJiYKKyAgICAgcmVhZF90cmVlX3R3b3dheSAkdHJlZURGICR0cmVlREZERiAmJgorICAgICBnaXQgbHMtZmlsZXMgLS1zdGFnZSA+REZERmNoZWNrLm91dCAmJgorICAgICBnaXQgZGlmZiBERkRGLm91dCBERkRGY2hlY2sub3V0ICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IERGL0RGIGRpcnR5ICYmCisgICAgIDonCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MTAwMi1yZWFkLXRyZWUtbS11LTJ3YXkuc2ggYi90L3QxMDAyLXJlYWQtdHJlZS1tLXUtMndheS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MmU1Y2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvdC90MTAwMi1yZWFkLXRyZWUtbS11LTJ3YXkuc2gKQEAgLTAsMCArMSwzNDQgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVHdvIHdheSBtZXJnZSB3aXRoIHJlYWQtdHJlZSAtbSAtdSAkSCAkTQorCitUaGlzIGlzIGlkZW50aWNhbCB0byB0MTAwMSwgYnV0IHVzZXMgLXUgdG8gdXBkYXRlIHRoZSB3b3JrIHRyZWUgYXMgd2VsbC4KKworJworLiAuL3Rlc3QtbGliLnNoCisKK194NDA9J1swLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl0nCitfeDQwPSIkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwIgorY29tcGFyZV9jaGFuZ2UgKCkgeworCXNlZCA+Y3VycmVudCBcCisJICAgIC1lICcvXi0tLSAvZDsgL14rKysgL2Q7IC9eQEAgL2Q7JyBcCisJICAgIC1lICdzL15cKC5bMC03XVswLTddWzAtN11bMC03XVswLTddWzAtN11cKSAnIiRfeDQwIicgL1wxIFggLycgIiQxIgorCWdpdCBkaWZmIGV4cGVjdGVkIGN1cnJlbnQKK30KKworY2hlY2tfY2FjaGVfYXQgKCkgeworCWNsZWFuX2lmX2VtcHR5PWBnaXQgZGlmZi1maWxlcyAtLSAiJDEiYAorCWNhc2UgIiRjbGVhbl9pZl9lbXB0eSIgaW4KKwknJykgIGVjaG8gIiQxOiBjbGVhbiIgOzsKKwk/KikgIGVjaG8gIiQxOiBkaXJ0eSIgOzsKKwllc2FjCisJY2FzZSAiJDIsJGNsZWFuX2lmX2VtcHR5IiBpbgorCWNsZWFuLCkJCTogICAgIDs7CisJY2xlYW4sPyopCWZhbHNlIDs7CisJZGlydHksKQkJZmFsc2UgOzsKKwlkaXJ0eSw/KikJOiAgICAgOzsKKwllc2FjCit9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgIHNldHVwIFwKKyAgICAnZWNobyBmcm90eiA+ZnJvdHogJiYKKyAgICAgZWNobyBuaXRmb2wgPm5pdGZvbCAmJgorICAgICBlY2hvIGJvemJhciA+Ym96YmFyICYmCisgICAgIGVjaG8gcmV6cm92ID5yZXpyb3YgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBuaXRmb2wgYm96YmFyIHJlenJvdiAmJgorICAgICB0cmVlSD1gZ2l0IHdyaXRlLXRyZWVgICYmCisgICAgIGVjaG8gdHJlZUggJHRyZWVIICYmCisgICAgIGdpdCBscy10cmVlICR0cmVlSCAmJgorCisgICAgIGVjaG8gZ251c3RvID5ib3piYXIgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBmcm90eiBib3piYXIgLS1mb3JjZS1yZW1vdmUgcmV6cm92ICYmCisgICAgIGdpdCBscy1maWxlcyAtLXN0YWdlID5NLm91dCAmJgorICAgICB0cmVlTT1gZ2l0IHdyaXRlLXRyZWVgICYmCisgICAgIGVjaG8gdHJlZU0gJHRyZWVNICYmCisgICAgIGdpdCBscy10cmVlICR0cmVlTSAmJgorICAgICBzdW0gYm96YmFyIGZyb3R6IG5pdGZvbCA+TS5zdW0gJiYKKyAgICAgZ2l0IGRpZmYtdHJlZSAkdHJlZUggJHRyZWVNJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMSwgMiwgMyAtIG5vIGNhcnJ5IGZvcndhcmQnIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBuaXRmb2wgYm96YmFyIHJlenJvdiBmcm90eiAmJgorICAgICBnaXQgcmVhZC10cmVlIC0tcmVzZXQgLXUgJHRyZWVIICYmCisgICAgIGdpdCByZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQgbHMtZmlsZXMgLS1zdGFnZSA+MS0zLm91dCAmJgorICAgICBjbXAgTS5vdXQgMS0zLm91dCAmJgorICAgICBzdW0gYm96YmFyIGZyb3R6IG5pdGZvbCA+YWN0dWFsMy5zdW0gJiYKKyAgICAgY21wIE0uc3VtIGFjdHVhbDMuc3VtICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IGJvemJhciBjbGVhbiAmJgorICAgICBjaGVja19jYWNoZV9hdCBmcm90eiBjbGVhbiAmJgorICAgICBjaGVja19jYWNoZV9hdCBuaXRmb2wgY2xlYW4nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc0IC0gY2FycnkgZm9yd2FyZCBsb2NhbCBhZGRpdGlvbi4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBuaXRmb2wgYm96YmFyIHJlenJvdiBmcm90eiAmJgorICAgICBnaXQgcmVhZC10cmVlIC0tcmVzZXQgLXUgJHRyZWVIICYmCisgICAgIGVjaG8gIisxMDA2NDQgWCAwCXlvbWluIiA+ZXhwZWN0ZWQgJiYKKyAgICAgZWNobyB5b21pbiA+eW9taW4gJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCB5b21pbiAmJgorICAgICBnaXQgcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0IGxzLWZpbGVzIC0tc3RhZ2UgPjQub3V0IHx8IHJldHVybiAxCisgICAgIGRpZmYgLVUwIE0ub3V0IDQub3V0ID40ZGlmZi5vdXQKKyAgICAgY29tcGFyZV9jaGFuZ2UgNGRpZmYub3V0IGV4cGVjdGVkICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IHlvbWluIGNsZWFuICYmCisgICAgIHN1bSBib3piYXIgZnJvdHogbml0Zm9sID5hY3R1YWw0LnN1bSAmJgorICAgICBjbXAgTS5zdW0gYWN0dWFsNC5zdW0gJiYKKyAgICAgZWNobyB5b21pbiA+eW9taW4xICYmCisgICAgIGRpZmYgeW9taW4geW9taW4xICYmCisgICAgIHJtIC1mIHlvbWluMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzUgLSBjYXJyeSBmb3J3YXJkIGxvY2FsIGFkZGl0aW9uLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdCByZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAtbSAtdSAkdHJlZUggJiYKKyAgICAgZWNobyB5b21pbiA+eW9taW4gJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCB5b21pbiAmJgorICAgICBlY2hvIHlvbWluIHlvbWluID55b21pbiAmJgorICAgICBnaXQgcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0IGxzLWZpbGVzIC0tc3RhZ2UgPjUub3V0IHx8IHJldHVybiAxCisgICAgIGRpZmYgLVUwIE0ub3V0IDUub3V0ID41ZGlmZi5vdXQKKyAgICAgY29tcGFyZV9jaGFuZ2UgNWRpZmYub3V0IGV4cGVjdGVkICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IHlvbWluIGRpcnR5ICYmCisgICAgIHN1bSBib3piYXIgZnJvdHogbml0Zm9sID5hY3R1YWw1LnN1bSAmJgorICAgICBjbXAgTS5zdW0gYWN0dWFsNS5zdW0gJiYKKyAgICAgOiBkaXJ0eSBpbmRleCBzaG91bGQgaGF2ZSBwcmV2ZW50ZWQgLXUgZnJvbSBjaGVja2luZyBpdCBvdXQuICYmCisgICAgIGVjaG8geW9taW4geW9taW4gPnlvbWluMSAmJgorICAgICBkaWZmIHlvbWluIHlvbWluMSAmJgorICAgICBybSAtZiB5b21pbjEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc2IC0gbG9jYWwgYWRkaXRpb24gYWxyZWFkeSBoYXMgdGhlIHNhbWUuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIGZyb3R6ID5mcm90eiAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGZyb3R6ICYmCisgICAgIGdpdCByZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQgbHMtZmlsZXMgLS1zdGFnZSA+Ni5vdXQgJiYKKyAgICAgZGlmZiAtVTAgTS5vdXQgNi5vdXQgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgZnJvdHogY2xlYW4gJiYKKyAgICAgc3VtIGJvemJhciBmcm90eiBuaXRmb2wgPmFjdHVhbDMuc3VtICYmCisgICAgIGNtcCBNLnN1bSBhY3R1YWwzLnN1bSAmJgorICAgICBlY2hvIGZyb3R6ID5mcm90ejEgJiYKKyAgICAgZGlmZiBmcm90eiBmcm90ejEgJiYKKyAgICAgcm0gLWYgZnJvdHoxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnNyAtIGxvY2FsIGFkZGl0aW9uIGFscmVhZHkgaGFzIHRoZSBzYW1lLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdCByZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZWNobyBmcm90eiA+ZnJvdHogJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBmcm90eiAmJgorICAgICBlY2hvIGZyb3R6IGZyb3R6ID5mcm90eiAmJgorICAgICBnaXQgcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0IGxzLWZpbGVzIC0tc3RhZ2UgPjcub3V0ICYmCisgICAgIGRpZmYgLVUwIE0ub3V0IDcub3V0ICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IGZyb3R6IGRpcnR5ICYmCisgICAgIHN1bSBib3piYXIgZnJvdHogbml0Zm9sID5hY3R1YWw3LnN1bSAmJgorICAgICBpZiBjbXAgTS5zdW0gYWN0dWFsNy5zdW07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmkgJiYKKyAgICAgOiBkaXJ0eSBpbmRleCBzaG91bGQgaGF2ZSBwcmV2ZW50ZWQgLXUgZnJvbSBjaGVja2luZyBpdCBvdXQuICYmCisgICAgIGVjaG8gZnJvdHogZnJvdHogPmZyb3R6MSAmJgorICAgICBkaWZmIGZyb3R6IGZyb3R6MSAmJgorICAgICBybSAtZiBmcm90ejEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc4IC0gY29uZmxpY3RpbmcgYWRkaXRpb24uJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIGZyb3R6IGZyb3R6ID5mcm90eiAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGZyb3R6ICYmCisgICAgIGlmIGdpdCByZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzkgLSBjb25mbGljdGluZyBhZGRpdGlvbi4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBuaXRmb2wgYm96YmFyIHJlenJvdiBmcm90eiAmJgorICAgICBnaXQgcmVhZC10cmVlIC0tcmVzZXQgLXUgJHRyZWVIICYmCisgICAgIGVjaG8gZnJvdHogZnJvdHogPmZyb3R6ICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgZnJvdHogJiYKKyAgICAgZWNobyBmcm90eiA+ZnJvdHogJiYKKyAgICAgaWYgZ2l0IHJlYWQtdHJlZSAtbSAtdSAkdHJlZUggJHRyZWVNOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTAgLSBwYXRoIHJlbW92ZWQuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIHJlenJvdiA+cmV6cm92ICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgcmV6cm92ICYmCisgICAgIGdpdCByZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQgbHMtZmlsZXMgLS1zdGFnZSA+MTAub3V0ICYmCisgICAgIGNtcCBNLm91dCAxMC5vdXQgJiYKKyAgICAgc3VtIGJvemJhciBmcm90eiBuaXRmb2wgPmFjdHVhbDEwLnN1bSAmJgorICAgICBjbXAgTS5zdW0gYWN0dWFsMTAuc3VtJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTEgLSBkaXJ0eSBwYXRoIHJlbW92ZWQuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIHJlenJvdiA+cmV6cm92ICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgcmV6cm92ICYmCisgICAgIGVjaG8gcmV6cm92IHJlenJvdiA+cmV6cm92ICYmCisgICAgIGlmIGdpdCByZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzEyIC0gdW5tYXRjaGluZyBsb2NhbCBjaGFuZ2VzIGJlaW5nIHJlbW92ZWQuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIHJlenJvdiByZXpyb3YgPnJlenJvdiAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIHJlenJvdiAmJgorICAgICBpZiBnaXQgcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxMyAtIHVubWF0Y2hpbmcgbG9jYWwgY2hhbmdlcyBiZWluZyByZW1vdmVkLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdCByZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZWNobyByZXpyb3YgcmV6cm92ID5yZXpyb3YgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCByZXpyb3YgJiYKKyAgICAgZWNobyByZXpyb3YgPnJlenJvdiAmJgorICAgICBpZiBnaXQgcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKK2NhdCA+ZXhwZWN0ZWQgPDxFT0YKKy0xMDA2NDQgWCAwCW5pdGZvbAorKzEwMDY0NCBYIDAJbml0Zm9sCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE0IC0gdW5jaGFuZ2VkIGluIHR3byBoZWFkcy4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBuaXRmb2wgYm96YmFyIHJlenJvdiBmcm90eiAmJgorICAgICBnaXQgcmVhZC10cmVlIC0tcmVzZXQgLXUgJHRyZWVIICYmCisgICAgIGVjaG8gbml0Zm9sIG5pdGZvbCA+bml0Zm9sICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgbml0Zm9sICYmCisgICAgIGdpdCByZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQgbHMtZmlsZXMgLS1zdGFnZSA+MTQub3V0IHx8IHJldHVybiAxCisgICAgIGRpZmYgLVUwIE0ub3V0IDE0Lm91dCA+MTRkaWZmLm91dAorICAgICBjb21wYXJlX2NoYW5nZSAxNGRpZmYub3V0IGV4cGVjdGVkICYmCisgICAgIHN1bSBib3piYXIgZnJvdHogPmFjdHVhbDE0LnN1bSAmJgorICAgICBncmVwIC12IG5pdGZvbCBNLnN1bSA+IGV4cGVjdGVkMTQuc3VtICYmCisgICAgIGNtcCBleHBlY3RlZDE0LnN1bSBhY3R1YWwxNC5zdW0gJiYKKyAgICAgc3VtIGJvemJhciBmcm90eiBuaXRmb2wgPmFjdHVhbDE0YS5zdW0gJiYKKyAgICAgaWYgY21wIE0uc3VtIGFjdHVhbDE0YS5zdW07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmkgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgbml0Zm9sIGNsZWFuICYmCisgICAgIGVjaG8gbml0Zm9sIG5pdGZvbCA+bml0Zm9sMSAmJgorICAgICBkaWZmIG5pdGZvbCBuaXRmb2wxICYmCisgICAgIHJtIC1mIG5pdGZvbDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxNSAtIHVuY2hhbmdlZCBpbiB0d28gaGVhZHMuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIG5pdGZvbCBuaXRmb2wgPm5pdGZvbCAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIG5pdGZvbCAmJgorICAgICBlY2hvIG5pdGZvbCBuaXRmb2wgbml0Zm9sID5uaXRmb2wgJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAtbSAtdSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdCBscy1maWxlcyAtLXN0YWdlID4xNS5vdXQgfHwgcmV0dXJuIDEKKyAgICAgZGlmZiAtVTAgTS5vdXQgMTUub3V0ID4xNWRpZmYub3V0CisgICAgIGNvbXBhcmVfY2hhbmdlIDE1ZGlmZi5vdXQgZXhwZWN0ZWQgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgbml0Zm9sIGRpcnR5ICYmCisgICAgIHN1bSBib3piYXIgZnJvdHogPmFjdHVhbDE1LnN1bSAmJgorICAgICBncmVwIC12IG5pdGZvbCBNLnN1bSA+IGV4cGVjdGVkMTUuc3VtICYmCisgICAgIGNtcCBleHBlY3RlZDE1LnN1bSBhY3R1YWwxNS5zdW0gJiYKKyAgICAgc3VtIGJvemJhciBmcm90eiBuaXRmb2wgPmFjdHVhbDE1YS5zdW0gJiYKKyAgICAgaWYgY21wIE0uc3VtIGFjdHVhbDE1YS5zdW07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmkgJiYKKyAgICAgZWNobyBuaXRmb2wgbml0Zm9sIG5pdGZvbCA+bml0Zm9sMSAmJgorICAgICBkaWZmIG5pdGZvbCBuaXRmb2wxICYmCisgICAgIHJtIC1mIG5pdGZvbDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxNiAtIGNvbmZsaWN0aW5nIGxvY2FsIGNoYW5nZS4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBuaXRmb2wgYm96YmFyIHJlenJvdiBmcm90eiAmJgorICAgICBnaXQgcmVhZC10cmVlIC0tcmVzZXQgLXUgJHRyZWVIICYmCisgICAgIGVjaG8gYm96YmFyIGJvemJhciA+Ym96YmFyICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgYm96YmFyICYmCisgICAgIGlmIGdpdCByZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE3IC0gY29uZmxpY3RpbmcgbG9jYWwgY2hhbmdlLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdCByZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZWNobyBib3piYXIgYm96YmFyID5ib3piYXIgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBib3piYXIgJiYKKyAgICAgZWNobyBib3piYXIgYm96YmFyIGJvemJhciA+Ym96YmFyICYmCisgICAgIGlmIGdpdCByZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE4IC0gbG9jYWwgY2hhbmdlIGFscmVhZHkgaGF2aW5nIGEgZ29vZCByZXN1bHQuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIGdudXN0byA+Ym96YmFyICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgYm96YmFyICYmCisgICAgIGdpdCByZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQgbHMtZmlsZXMgLS1zdGFnZSA+MTgub3V0ICYmCisgICAgIGRpZmYgLVUwIE0ub3V0IDE4Lm91dCAmJgorICAgICBjaGVja19jYWNoZV9hdCBib3piYXIgY2xlYW4gJiYKKyAgICAgc3VtIGJvemJhciBmcm90eiBuaXRmb2wgPmFjdHVhbDE4LnN1bSAmJgorICAgICBjbXAgTS5zdW0gYWN0dWFsMTguc3VtJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTkgLSBsb2NhbCBjaGFuZ2UgYWxyZWFkeSBoYXZpbmcgYSBnb29kIHJlc3VsdCwgZnVydGhlciBtb2RpZmllZC4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBuaXRmb2wgYm96YmFyIHJlenJvdiBmcm90eiAmJgorICAgICBnaXQgcmVhZC10cmVlIC0tcmVzZXQgLXUgJHRyZWVIICYmCisgICAgIGVjaG8gZ251c3RvID5ib3piYXIgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBib3piYXIgJiYKKyAgICAgZWNobyBnbnVzdG8gZ251c3RvID5ib3piYXIgJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAtbSAtdSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdCBscy1maWxlcyAtLXN0YWdlID4xOS5vdXQgJiYKKyAgICAgZGlmZiAtVTAgTS5vdXQgMTkub3V0ICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IGJvemJhciBkaXJ0eSAmJgorICAgICBzdW0gZnJvdHogbml0Zm9sID5hY3R1YWwxOS5zdW0gJiYKKyAgICAgZ3JlcCAtdiBib3piYXIgIE0uc3VtID4gZXhwZWN0ZWQxOS5zdW0gJiYKKyAgICAgY21wIGV4cGVjdGVkMTkuc3VtIGFjdHVhbDE5LnN1bSAmJgorICAgICBzdW0gYm96YmFyIGZyb3R6IG5pdGZvbCA+YWN0dWFsMTlhLnN1bSAmJgorICAgICBpZiBjbXAgTS5zdW0gYWN0dWFsMTlhLnN1bTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaSAmJgorICAgICBlY2hvIGdudXN0byBnbnVzdG8gPmJvemJhcjEgJiYKKyAgICAgZGlmZiBib3piYXIgYm96YmFyMSAmJgorICAgICBybSAtZiBib3piYXIxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMjAgLSBubyBsb2NhbCBjaGFuZ2UsIHVzZSBuZXcgdHJlZS4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBuaXRmb2wgYm96YmFyIHJlenJvdiBmcm90eiAmJgorICAgICBnaXQgcmVhZC10cmVlIC0tcmVzZXQgLXUgJHRyZWVIICYmCisgICAgIGVjaG8gYm96YmFyID5ib3piYXIgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBib3piYXIgJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAtbSAtdSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdCBscy1maWxlcyAtLXN0YWdlID4yMC5vdXQgJiYKKyAgICAgZGlmZiAtVTAgTS5vdXQgMjAub3V0ICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IGJvemJhciBjbGVhbiAmJgorICAgICBzdW0gYm96YmFyIGZyb3R6IG5pdGZvbCA+YWN0dWFsMjAuc3VtICYmCisgICAgIGNtcCBNLnN1bSBhY3R1YWwyMC5zdW0nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcyMSAtIG5vIGxvY2FsIGNoYW5nZSwgZGlydHkgY2FjaGUuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIGJvemJhciA+Ym96YmFyICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgYm96YmFyICYmCisgICAgIGVjaG8gZ251c3RvIGdudXN0byA+Ym96YmFyICYmCisgICAgIGlmIGdpdCByZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKworIyBBbHNvIG1ha2Ugc3VyZSB3ZSBkaWQgbm90IGJyZWFrIERGIHZzIERGL0RGIGNhc2UuCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnREYgdnMgREYvREYgY2FzZSBzZXR1cC4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleAorICAgICBlY2hvIERGID5ERiAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIERGICYmCisgICAgIHRyZWVERj1gZ2l0IHdyaXRlLXRyZWVgICYmCisgICAgIGVjaG8gdHJlZURGICR0cmVlREYgJiYKKyAgICAgZ2l0IGxzLXRyZWUgJHRyZWVERiAmJgorCisgICAgIHJtIC1mIERGICYmCisgICAgIG1rZGlyIERGICYmCisgICAgIGVjaG8gREYvREYgPkRGL0RGICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgREYgREYvREYgJiYKKyAgICAgdHJlZURGREY9YGdpdCB3cml0ZS10cmVlYCAmJgorICAgICBlY2hvIHRyZWVERkRGICR0cmVlREZERiAmJgorICAgICBnaXQgbHMtdHJlZSAkdHJlZURGREYgJiYKKyAgICAgZ2l0IGxzLWZpbGVzIC0tc3RhZ2UgPkRGREYub3V0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnREYgdnMgREYvREYgY2FzZSB0ZXN0LicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIHJtIC1mciBERiAmJgorICAgICBlY2hvIERGID5ERiAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIERGICYmCisgICAgIGdpdCByZWFkLXRyZWUgLW0gLXUgJHRyZWVERiAkdHJlZURGREYgJiYKKyAgICAgZ2l0IGxzLWZpbGVzIC0tc3RhZ2UgPkRGREZjaGVjay5vdXQgJiYKKyAgICAgZGlmZiAtVTAgREZERi5vdXQgREZERmNoZWNrLm91dCAmJgorICAgICBjaGVja19jYWNoZV9hdCBERi9ERiBjbGVhbicKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QxMDAzLXJlYWQtdHJlZS1wcmVmaXguc2ggYi90L3QxMDAzLXJlYWQtdHJlZS1wcmVmaXguc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGM2ZDY3ZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDEwMDMtcmVhZC10cmVlLXByZWZpeC5zaApAQCAtMCwwICsxLDI3IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCByZWFkLXRyZWUgLS1wcmVmaXggdGVzdC4KKycKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCWVjaG8gaGVsbG8gPm9uZSAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgb25lICYmCisJdHJlZT1gZ2l0IHdyaXRlLXRyZWVgICYmCisJZWNobyB0cmVlIGlzICR0cmVlCisnCisKK2VjaG8gJ29uZQordHdvL29uZScgPmV4cGVjdAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZWFkLXRyZWUgLS1wcmVmaXgnICcKKwlnaXQgcmVhZC10cmVlIC0tcHJlZml4PXR3by8gJHRyZWUgJiYKKwlnaXQgbHMtZmlsZXMgPmFjdHVhbCAmJgorCWNtcCBleHBlY3QgYWN0dWFsCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MTAwNC1yZWFkLXRyZWUtbS11LXdmLnNoIGIvdC90MTAwNC1yZWFkLXRyZWUtbS11LXdmLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU3MGQzNzIKLS0tIC9kZXYvbnVsbAorKysgYi90L3QxMDA0LXJlYWQtdHJlZS1tLXUtd2Yuc2gKQEAgLTAsMCArMSwyNDEgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdyZWFkLXRyZWUgLW0gLXUgY2hlY2tzIHdvcmtpbmcgdHJlZSBmaWxlcycKKworLiAuL3Rlc3QtbGliLnNoCisKKyMgdHdvLXRyZWUgdGVzdAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0d28td2F5IHNldHVwJyAnCisKKwlta2RpciBzdWJkaXIgJiYKKwllY2hvID5maWxlMSBmaWxlIG9uZSAmJgorCWVjaG8gPmZpbGUyIGZpbGUgdHdvICYmCisJZWNobyA+c3ViZGlyL2ZpbGUxIGZpbGUgb25lIGluIHN1YmRpcmVjdG9yeSAmJgorCWVjaG8gPnN1YmRpci9maWxlMiBmaWxlIHR3byBpbiBzdWJkaXJlY3RvcnkgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGZpbGUxIGZpbGUyIHN1YmRpci9maWxlMSBzdWJkaXIvZmlsZTIgJiYKKwlnaXQgY29tbWl0IC1tIGluaXRpYWwgJiYKKworCWdpdCBicmFuY2ggc2lkZSAmJgorCWdpdCB0YWcgLWYgYnJhbmNoLXBvaW50ICYmCisKKwllY2hvIGZpbGUyIGlzIG5vdCB0cmFja2VkIG9uIHRoZSBtYXN0ZXIgYW55bW9yZSAmJgorCXJtIC1mIGZpbGUyIHN1YmRpci9maWxlMiAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1yZW1vdmUgZmlsZTIgc3ViZGlyL2ZpbGUyICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAibWFzdGVyIHJlbW92ZXMgZmlsZTIgYW5kIHN1YmRpci9maWxlMiIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndHdvLXdheSBub3QgY2xvYmJlcmluZycgJworCisJZWNobyA+ZmlsZTIgbWFzdGVyIGNyZWF0ZXMgdW50cmFja2VkIGZpbGUyICYmCisJZWNobyA+c3ViZGlyL2ZpbGUyIG1hc3RlciBjcmVhdGVzIHVudHJhY2tlZCBzdWJkaXIvZmlsZTIgJiYKKwlpZiBlcnI9YGdpdCByZWFkLXRyZWUgLW0gLXUgbWFzdGVyIHNpZGUgMj4mMWAKKwl0aGVuCisJCWVjaG8gc2hvdWxkIGhhdmUgY29tcGxhaW5lZAorCQlmYWxzZQorCWVsc2UKKwkJZWNobyAiaGFwcHkgdG8gc2VlICRlcnIiCisJZmkKKycKKworZWNobyBmaWxlMiA+LmdpdGlnbm9yZQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0d28td2F5IHdpdGggaW5jb3JyZWN0IC0tZXhjbHVkZS1wZXItZGlyZWN0b3J5ICgxKScgJworCisJaWYgZXJyPWBnaXQgcmVhZC10cmVlIC1tIC0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PS5naXRpZ25vcmUgbWFzdGVyIHNpZGUgMj4mMWAKKwl0aGVuCisJCWVjaG8gc2hvdWxkIGhhdmUgY29tcGxhaW5lZAorCQlmYWxzZQorCWVsc2UKKwkJZWNobyAiaGFwcHkgdG8gc2VlICRlcnIiCisJZmkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndHdvLXdheSB3aXRoIGluY29ycmVjdCAtLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeSAoMiknICcKKworCWlmIGVycj1gZ2l0IHJlYWQtdHJlZSAtbSAtdSAtLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeT1mb28gLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9LmdpdGlnbm9yZSBtYXN0ZXIgc2lkZSAyPiYxYAorCXRoZW4KKwkJZWNobyBzaG91bGQgaGF2ZSBjb21wbGFpbmVkCisJCWZhbHNlCisJZWxzZQorCQllY2hvICJoYXBweSB0byBzZWUgJGVyciIKKwlmaQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0d28td2F5IGNsb2JiZXJpbmcgYSBpZ25vcmVkIGZpbGUnICcKKworCWdpdCByZWFkLXRyZWUgLW0gLXUgLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9LmdpdGlnbm9yZSBtYXN0ZXIgc2lkZQorJworCitybSAtZiAuZ2l0aWdub3JlCisKKyMgdGhyZWUtdHJlZSB0ZXN0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3RocmVlLXdheSBub3QgY29tcGxhaW5pbmcgb24gYW4gdW50cmFja2VkIHBhdGggaW4gYm90aCcgJworCisJcm0gLWYgZmlsZTIgc3ViZGlyL2ZpbGUyICYmCisJZ2l0IGNoZWNrb3V0IHNpZGUgJiYKKwllY2hvID5maWxlMyBmaWxlIHRocmVlICYmCisJZWNobyA+c3ViZGlyL2ZpbGUzIGZpbGUgdGhyZWUgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGZpbGUzIHN1YmRpci9maWxlMyAmJgorCWdpdCBjb21taXQgLWEgLW0gInNpZGUgYWRkcyBmaWxlMyBhbmQgcmVtb3ZlcyBmaWxlMiIgJiYKKworCWdpdCBjaGVja291dCBtYXN0ZXIgJiYKKwllY2hvID5maWxlMiBmaWxlIHR3byBpcyB1bnRyYWNrZWQgb24gdGhlIG1hc3RlciBzaWRlICYmCisJZWNobyA+c3ViZGlyL2ZpbGUyIGZpbGUgdHdvIGlzIHVudHJhY2tlZCBvbiB0aGUgbWFzdGVyIHNpZGUgJiYKKworCWdpdCByZWFkLXRyZWUgLW0gLXUgYnJhbmNoLXBvaW50IG1hc3RlciBzaWRlCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3RocmVlLXdheSBub3QgY2xvYmJlcmluZyBhIHdvcmtpbmcgdHJlZSBmaWxlJyAnCisKKwlnaXQgcmVzZXQgLS1oYXJkICYmCisJcm0gLWYgZmlsZTIgc3ViZGlyL2ZpbGUyIGZpbGUzIHN1YmRpci9maWxlMyAmJgorCWdpdCBjaGVja291dCBtYXN0ZXIgJiYKKwllY2hvID5maWxlMyBmaWxlIHRocmVlIGNyZWF0ZWQgaW4gbWFzdGVyLCB1bnRyYWNrZWQgJiYKKwllY2hvID5zdWJkaXIvZmlsZTMgZmlsZSB0aHJlZSBjcmVhdGVkIGluIG1hc3RlciwgdW50cmFja2VkICYmCisJaWYgZXJyPWBnaXQgcmVhZC10cmVlIC1tIC11IGJyYW5jaC1wb2ludCBtYXN0ZXIgc2lkZSAyPiYxYAorCXRoZW4KKwkJZWNobyBzaG91bGQgaGF2ZSBjb21wbGFpbmVkCisJCWZhbHNlCisJZWxzZQorCQllY2hvICJoYXBweSB0byBzZWUgJGVyciIKKwlmaQorJworCitlY2hvID4uZ2l0aWdub3JlIGZpbGUzCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3RocmVlLXdheSBub3QgY29tcGxhaW5pbmcgb24gYW4gdW50cmFja2VkIGZpbGUnICcKKworCWdpdCByZXNldCAtLWhhcmQgJiYKKwlybSAtZiBmaWxlMiBzdWJkaXIvZmlsZTIgZmlsZTMgc3ViZGlyL2ZpbGUzICYmCisJZ2l0IGNoZWNrb3V0IG1hc3RlciAmJgorCWVjaG8gPmZpbGUzIGZpbGUgdGhyZWUgY3JlYXRlZCBpbiBtYXN0ZXIsIHVudHJhY2tlZCAmJgorCWVjaG8gPnN1YmRpci9maWxlMyBmaWxlIHRocmVlIGNyZWF0ZWQgaW4gbWFzdGVyLCB1bnRyYWNrZWQgJiYKKworCWdpdCByZWFkLXRyZWUgLW0gLXUgLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9LmdpdGlnbm9yZSBicmFuY2gtcG9pbnQgbWFzdGVyIHNpZGUKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnMy13YXkgbm90IG92ZXJ3cml0aW5nIGxvY2FsIGNoYW5nZXMgKHNldHVwKScgJworCisJZ2l0IHJlc2V0IC0taGFyZCAmJgorCWdpdCBjaGVja291dCAtYiBzaWRlLWEgYnJhbmNoLXBvaW50ICYmCisJZWNobyA+PmZpbGUxICJuZXcgbGluZSB0byBiZSBrZXB0IGluIHRoZSBtZXJnZSByZXN1bHQiICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAic2lkZS1hIGNoYW5nZXMgZmlsZTEiICYmCisJZ2l0IGNoZWNrb3V0IC1iIHNpZGUtYiBicmFuY2gtcG9pbnQgJiYKKwllY2hvID4+ZmlsZTIgIm5ldyBsaW5lIHRvIGJlIGtlcHQgaW4gdGhlIG1lcmdlIHJlc3VsdCIgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJzaWRlLWIgY2hhbmdlcyBmaWxlMiIgJiYKKwlnaXQgY2hlY2tvdXQgc2lkZS1hCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnMy13YXkgbm90IG92ZXJ3cml0aW5nIGxvY2FsIGNoYW5nZXMgKG91ciBzaWRlKScgJworCisJIyBBdCB0aGlzIHBvaW50LCBmaWxlMSBmcm9tIHNpZGUtYSBzaG91bGQgYmUga2VwdCBhcyBzaWRlLWIKKwkjIGRpZCBub3QgdG91Y2ggaXQuCisKKwlnaXQgcmVzZXQgLS1oYXJkICYmCisKKwllY2hvID4+ZmlsZTEgImxvY2FsIGNoYW5nZXMiICYmCisJZ2l0IHJlYWQtdHJlZSAtbSAtdSBicmFuY2gtcG9pbnQgc2lkZS1hIHNpZGUtYiAmJgorCWdyZXAgIm5ldyBsaW5lIHRvIGJlIGtlcHQiIGZpbGUxICYmCisJZ3JlcCAibG9jYWwgY2hhbmdlcyIgZmlsZTEKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICczLXdheSBub3Qgb3ZlcndyaXRpbmcgbG9jYWwgY2hhbmdlcyAodGhlaXIgc2lkZSknICcKKworCSMgQXQgdGhpcyBwb2ludCwgZmlsZTIgZnJvbSBzaWRlLWIgc2hvdWxkIGJlIHRha2VuIGFzIHNpZGUtYQorCSMgZGlkIG5vdCB0b3VjaCBpdC4KKworCWdpdCByZXNldCAtLWhhcmQgJiYKKworCWVjaG8gPj5maWxlMiAibG9jYWwgY2hhbmdlcyIgJiYKKwl0ZXN0X211c3RfZmFpbCBnaXQgcmVhZC10cmVlIC1tIC11IGJyYW5jaC1wb2ludCBzaWRlLWEgc2lkZS1iICYmCisJISBncmVwICJuZXcgbGluZSB0byBiZSBrZXB0IiBmaWxlMiAmJgorCWdyZXAgImxvY2FsIGNoYW5nZXMiIGZpbGUyCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZnVubnkgc3ltbGluayBpbiB3b3JrIHRyZWUnICcKKworCWdpdCByZXNldCAtLWhhcmQgJiYKKwlnaXQgY2hlY2tvdXQgLWIgc3ltLWIgc2lkZS1iICYmCisJbWtkaXIgLXAgYSAmJgorCT5hL2IgJiYKKwlnaXQgYWRkIGEvYiAmJgorCWdpdCBjb21taXQgLW0gInNpZGUgYWRkcyBhL2IiICYmCisKKwlybSAtZnIgYSAmJgorCWdpdCBjaGVja291dCAtYiBzeW0tYSBzaWRlLWEgJiYKKwlta2RpciAtcCBhICYmCisJbG4gLXMgLi4vYiBhL2IgJiYKKwlnaXQgYWRkIGEvYiAmJgorCWdpdCBjb21taXQgLW0gIndlIGFkZCBhL2IiICYmCisKKwlnaXQgcmVhZC10cmVlIC1tIC11IHN5bS1hIHN5bS1hIHN5bS1iCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZnVubnkgc3ltbGluayBpbiB3b3JrIHRyZWUsIHVuLXVubGluay1hYmxlJyAnCisKKwlybSAtZnIgYSBiICYmCisJZ2l0IHJlc2V0IC0taGFyZCAmJgorCisJZ2l0IGNoZWNrb3V0IHN5bS1hICYmCisJY2htb2QgYS13IGEgJiYKKwl0ZXN0X211c3RfZmFpbCBnaXQgcmVhZC10cmVlIC1tIC11IHN5bS1hIHN5bS1hIHN5bS1iCisKKycKKworIyBjbGVhbi11cCBmcm9tIHRoZSBhYm92ZSB0ZXN0CitjaG1vZCBhK3cgYQorcm0gLWZyIGEgYgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdEL0Ygc2V0dXAnICcKKworCWdpdCByZXNldCAtLWhhcmQgJiYKKworCWdpdCBjaGVja291dCBzaWRlLWEgJiYKKwlybSAtZiBzdWJkaXIvZmlsZTIgJiYKKwlta2RpciBzdWJkaXIvZmlsZTIgJiYKKwllY2hvIHFmd2ZxID5zdWJkaXIvZmlsZTIvYW5vdGhlciAmJgorCWdpdCBhZGQgc3ViZGlyL2ZpbGUyL2Fub3RoZXIgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tICJzaWRlLWEgY2hhbmdlcyBmaWxlMiB0byBkaXJlY3RvcnkiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnRC9GJyAnCisKKwlnaXQgY2hlY2tvdXQgc2lkZS1iICYmCisJZ2l0IHJlYWQtdHJlZSAtbSAtdSBicmFuY2gtcG9pbnQgc2lkZS1iIHNpZGUtYSAmJgorCWdpdCBscy1maWxlcyAtdSA+YWN0dWFsICYmCisJKAorCQlhPSQoZ2l0IHJldi1wYXJzZSBicmFuY2gtcG9pbnQ6c3ViZGlyL2ZpbGUyKQorCQliPSQoZ2l0IHJldi1wYXJzZSBzaWRlLWE6c3ViZGlyL2ZpbGUyL2Fub3RoZXIpCisJCWVjaG8gIjEwMDY0NCAkYSAxCXN1YmRpci9maWxlMiIKKwkJZWNobyAiMTAwNjQ0ICRhIDIJc3ViZGlyL2ZpbGUyIgorCQllY2hvICIxMDA2NDQgJGIgMwlzdWJkaXIvZmlsZTIvYW5vdGhlciIKKwkpID5leHBlY3QgJiYKKwl0ZXN0X2NtcCBhY3R1YWwgZXhwZWN0CisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnRC9GIHJlc29sdmUnICcKKworCWdpdCByZXNldCAtLWhhcmQgJiYKKwlnaXQgY2hlY2tvdXQgc2lkZS1iICYmCisJZ2l0IG1lcmdlLXJlc29sdmUgYnJhbmNoLXBvaW50IC0tIHNpZGUtYiBzaWRlLWEKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdEL0YgcmVjdXJzaXZlJyAnCisKKwlnaXQgcmVzZXQgLS1oYXJkICYmCisJZ2l0IGNoZWNrb3V0IHNpZGUtYiAmJgorCWdpdCBtZXJnZS1yZWN1cnNpdmUgYnJhbmNoLXBvaW50IC0tIHNpZGUtYiBzaWRlLWEKKworJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDEwMDUtcmVhZC10cmVlLXJlc2V0LnNoIGIvdC90MTAwNS1yZWFkLXRyZWUtcmVzZXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjBkMzFmNQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDEwMDUtcmVhZC10cmVlLXJlc2V0LnNoCkBAIC0wLDAgKzEsMzAgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdyZWFkLXRyZWUgLXUgLS1yZXNldCcKKworLiAuL3Rlc3QtbGliLnNoCisKKyMgdHdvLXRyZWUgdGVzdAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCcgJworICBnaXQgaW5pdCAmJgorICBta2RpciBkZiAmJgorICBlY2hvIGNvbnRlbnQgPmRmL2ZpbGUgJiYKKyAgZ2l0IGFkZCBkZi9maWxlICYmCisgIGdpdCBjb21taXQgLW0gb25lICYmCisgIGdpdCBscy1maWxlcyA+ZXhwZWN0ICYmCisgIHJtIC1yZiBkZiAmJgorICBlY2hvIGNvbnRlbnQgPmRmICYmCisgIGdpdCBhZGQgZGYgJiYKKyAgZWNobyBjb250ZW50ID5uZXcgJiYKKyAgZ2l0IGFkZCBuZXcgJiYKKyAgZ2l0IGNvbW1pdCAtbSB0d28KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVzZXQgc2hvdWxkIHdvcmsnICcKKyAgZ2l0IHJlYWQtdHJlZSAtdSAtLXJlc2V0IEhFQUReICYmCisgIGdpdCBscy1maWxlcyA+YWN0dWFsICYmCisgIHRlc3RfY21wIGV4cGVjdCBhY3R1YWwKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QxMDIwLXN1YmRpcmVjdG9yeS5zaCBiL3QvdDEwMjAtc3ViZGlyZWN0b3J5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI5Y2VmMzQKLS0tIC9kZXYvbnVsbAorKysgYi90L3QxMDIwLXN1YmRpcmVjdG9yeS5zaApAQCAtMCwwICsxLDEzOCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUcnkgdmFyaW91cyBjb3JlLWxldmVsIGNvbW1hbmRzIGluIHN1YmRpcmVjdG9yeS4KKycKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCWxvbmc9ImEgYiBjIGQgZSBmIGcgaCBpIGogayBsIG0gbiBvIHAgcSByIHMgdCB1IHYgdyB4IHkgeiIgJiYKKwlmb3IgYyBpbiAkbG9uZzsgZG8gZWNobyAkYzsgZG9uZSA+b25lICYmCisJbWtkaXIgZGlyICYmCisJZm9yIGMgaW4geCB5IHogJGxvbmcgYSBiIGM7IGRvIGVjaG8gJGM7IGRvbmUgPmRpci90d28gJiYKKwljcCBvbmUgb3JpZ2luYWwub25lICYmCisJY3AgZGlyL3R3byBvcmlnaW5hbC50d28KKycKK0hFUkU9YHB3ZGAKK0xGPScKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBkYXRlLWluZGV4IGFuZCBscy1maWxlcycgJworCWNkICRIRVJFICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBvbmUgJiYKKwljYXNlICJgZ2l0IGxzLWZpbGVzYCIgaW4KKwlvbmUpIGVjaG8gb2sgb25lIDs7CisJKikgZWNobyBiYWQgb25lOyBleGl0IDEgOzsKKwllc2FjICYmCisJY2QgZGlyICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCB0d28gJiYKKwljYXNlICJgZ2l0IGxzLWZpbGVzYCIgaW4KKwl0d28pIGVjaG8gb2sgdHdvIDs7CisJKikgZWNobyBiYWQgdHdvOyBleGl0IDEgOzsKKwllc2FjICYmCisJY2QgLi4gJiYKKwljYXNlICJgZ2l0IGxzLWZpbGVzYCIgaW4KKwlkaXIvdHdvIiRMRiJvbmUpIGVjaG8gb2sgYm90aCA7OworCSopIGVjaG8gYmFkOyBleGl0IDEgOzsKKwllc2FjCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NhdC1maWxlJyAnCisJY2QgJEhFUkUgJiYKKwl0d289YGdpdCBscy1maWxlcyAtcyBkaXIvdHdvYCAmJgorCXR3bz1gZXhwciAiJHR3byIgOiAiWzAtN10qIFxcKFswLTlhLWZdKlxcKSJgICYmCisJZWNobyAiJHR3byIgJiYKKwlnaXQgY2F0LWZpbGUgLXAgIiR0d28iID5hY3R1YWwgJiYKKwljbXAgZGlyL3R3byBhY3R1YWwgJiYKKwljZCBkaXIgJiYKKwlnaXQgY2F0LWZpbGUgLXAgIiR0d28iID5hY3R1YWwgJiYKKwljbXAgdHdvIGFjdHVhbAorJworcm0gLWYgYWN0dWFsIGRpci9hY3R1YWwKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZGlmZi1maWxlcycgJworCWNkICRIRVJFICYmCisJZWNobyBhID4+b25lICYmCisJZWNobyBkID4+ZGlyL3R3byAmJgorCWNhc2UgImBnaXQgZGlmZi1maWxlcyAtLW5hbWUtb25seWAiIGluCisJZGlyL3R3byIkTEYib25lKSBlY2hvIG9rIHRvcCA7OworCSopIGVjaG8gYmFkIHRvcDsgZXhpdCAxIDs7CisJZXNhYyAmJgorCSMgZGlmZiBzaG91bGQgbm90IG9taXQgbGVhZGluZyBwYXRocworCWNkIGRpciAmJgorCWNhc2UgImBnaXQgZGlmZi1maWxlcyAtLW5hbWUtb25seWAiIGluCisJZGlyL3R3byIkTEYib25lKSBlY2hvIG9rIHN1YmRpciA7OworCSopIGVjaG8gYmFkIHN1YmRpcjsgZXhpdCAxIDs7CisJZXNhYyAmJgorCWNhc2UgImBnaXQgZGlmZi1maWxlcyAtLW5hbWUtb25seSAuYCIgaW4KKwlkaXIvdHdvKSBlY2hvIG9rIHN1YmRpciBsaW1pdGVkIDs7CisJKikgZWNobyBiYWQgc3ViZGlyIGxpbWl0ZWQ7IGV4aXQgMSA7OworCWVzYWMKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnd3JpdGUtdHJlZScgJworCWNkICRIRVJFICYmCisJdG9wPWBnaXQgd3JpdGUtdHJlZWAgJiYKKwllY2hvICR0b3AgJiYKKwljZCBkaXIgJiYKKwlzdWI9YGdpdCB3cml0ZS10cmVlYCAmJgorCWVjaG8gJHN1YiAmJgorCXRlc3QgInokdG9wIiA9ICJ6JHN1YiIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2tvdXQtaW5kZXgnICcKKwljZCAkSEVSRSAmJgorCWdpdCBjaGVja291dC1pbmRleCAtZiAtdSBvbmUgJiYKKwljbXAgb25lIG9yaWdpbmFsLm9uZSAmJgorCWNkIGRpciAmJgorCWdpdCBjaGVja291dC1pbmRleCAtZiAtdSB0d28gJiYKKwljbXAgdHdvIC4uL29yaWdpbmFsLnR3bworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZWFkLXRyZWUnICcKKwljZCAkSEVSRSAmJgorCXJtIC1mIG9uZSBkaXIvdHdvICYmCisJdHJlZT1gZ2l0IHdyaXRlLXRyZWVgICYmCisJZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IC11ICIkdHJlZSIgJiYKKwljbXAgb25lIG9yaWdpbmFsLm9uZSAmJgorCWNtcCBkaXIvdHdvIG9yaWdpbmFsLnR3byAmJgorCWNkIGRpciAmJgorCXJtIC1mIHR3byAmJgorCWdpdCByZWFkLXRyZWUgLS1yZXNldCAtdSAiJHRyZWUiICYmCisJY21wIHR3byAuLi9vcmlnaW5hbC50d28gJiYKKwljbXAgLi4vb25lIC4uL29yaWdpbmFsLm9uZQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdubyBmaWxlL3JldiBhbWJpZ3VpdHkgY2hlY2sgaW5zaWRlIC5naXQnICcKKwljZCAkSEVSRSAmJgorCWdpdCBjb21taXQgLWEgLW0gMSAmJgorCWNkICRIRVJFLy5naXQgJiYKKwlnaXQgc2hvdyAtcyBIRUFECisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ25vIGZpbGUvcmV2IGFtYmlndWl0eSBjaGVjayBpbnNpZGUgYSBiYXJlIHJlcG8nICcKKwljZCAkSEVSRSAmJgorCWdpdCBjbG9uZSAtcyAtLWJhcmUgLmdpdCBmb28uZ2l0ICYmCisJY2QgZm9vLmdpdCAmJiBHSVRfRElSPS4gZ2l0IHNob3cgLXMgSEVBRAorJworCisjIFRoaXMgc3RpbGwgZG9lcyBub3Qgd29yayBhcyBpdCBzaG91bGQuLi4KKzogdGVzdF9leHBlY3Rfc3VjY2VzcyAnbm8gZmlsZS9yZXYgYW1iaWd1aXR5IGNoZWNrIGluc2lkZSBhIGJhcmUgcmVwbycgJworCWNkICRIRVJFICYmCisJZ2l0IGNsb25lIC1zIC0tYmFyZSAuZ2l0IGZvby5naXQgJiYKKwljZCBmb28uZ2l0ICYmIGdpdCBzaG93IC1zIEhFQUQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZGV0ZWN0aW9uIHNob3VsZCBub3QgYmUgZm9vbGVkIGJ5IGEgc3ltbGluaycgJworCWNkICRIRVJFICYmCisJcm0gLWZyIGZvby5naXQgJiYKKwlnaXQgY2xvbmUgLXMgLmdpdCBhbm90aGVyICYmCisJbG4gLXMgYW5vdGhlciB5ZXRhbm90aGVyICYmCisJY2QgeWV0YW5vdGhlci8uZ2l0ICYmCisJZ2l0IHNob3cgLXMgSEVBRAorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDExMDAtY29tbWl0LXRyZWUtb3B0aW9ucy5zaCBiL3QvdDExMDAtY29tbWl0LXRyZWUtb3B0aW9ucy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZjdmYzM2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90MTEwMC1jb21taXQtdHJlZS1vcHRpb25zLnNoCkBAIC0wLDAgKzEsNDUgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDUgUmVuZSBTY2hhcmZlCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBjb21taXQtdHJlZSBvcHRpb25zIHRlc3QKKworVGhpcyB0ZXN0IGNoZWNrcyB0aGF0IGdpdCBjb21taXQtdHJlZSBjYW4gY3JlYXRlIGEgc3BlY2lmaWMgY29tbWl0CitvYmplY3QgYnkgZGVmaW5pbmcgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IGl0IHVuZGVyc3RhbmRzLgorJworCisuIC4vdGVzdC1saWIuc2gKKworY2F0ID5leHBlY3RlZCA8PEVPRgordHJlZSA0YjgyNWRjNjQyY2I2ZWI5YTA2MGU1NGJmOGQ2OTI4OGZiZWU0OTA0CithdXRob3IgQXV0aG9yIE5hbWUgPGF1dGhvckBlbWFpbD4gMTExNzE0ODQwMCArMDAwMAorY29tbWl0dGVyIENvbW1pdHRlciBOYW1lIDxjb21taXR0ZXJAZW1haWw+IDExMTcxNTAyMDAgKzAwMDAKKworY29tbWVudCB0ZXh0CitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3Rlc3QgcHJlcGFyYXRpb246IHdyaXRlIGVtcHR5IHRyZWUnIFwKKyAgICAnZ2l0IHdyaXRlLXRyZWUgPnRyZWVpZCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NvbnN0cnVjdCBjb21taXQnIFwKKyAgICAnZWNobyBjb21tZW50IHRleHQgfAorICAgICBHSVRfQVVUSE9SX05BTUU9IkF1dGhvciBOYW1lIiBcCisgICAgIEdJVF9BVVRIT1JfRU1BSUw9ImF1dGhvckBlbWFpbCIgXAorICAgICBHSVRfQVVUSE9SX0RBVEU9IjIwMDUtMDUtMjYgMjM6MDAiIFwKKyAgICAgR0lUX0NPTU1JVFRFUl9OQU1FPSJDb21taXR0ZXIgTmFtZSIgXAorICAgICBHSVRfQ09NTUlUVEVSX0VNQUlMPSJjb21taXR0ZXJAZW1haWwiIFwKKyAgICAgR0lUX0NPTU1JVFRFUl9EQVRFPSIyMDA1LTA1LTI2IDIzOjMwIiBcCisgICAgIFRaPUdNVCBnaXQgY29tbWl0LXRyZWUgYGNhdCB0cmVlaWRgID5jb21taXRpZCAyPi9kZXYvbnVsbCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3JlYWQgY29tbWl0JyBcCisgICAgJ2dpdCBjYXQtZmlsZSBjb21taXQgYGNhdCBjb21taXRpZGAgPmNvbW1pdCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NvbXBhcmUgY29tbWl0JyBcCisgICAgJ2RpZmYgZXhwZWN0ZWQgY29tbWl0JworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDEyMDAtdHV0b3JpYWwuc2ggYi90L3QxMjAwLXR1dG9yaWFsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRjYjMxMDgKLS0tIC9kZXYvbnVsbAorKysgYi90L3QxMjAwLXR1dG9yaWFsLnNoCkBAIC0wLDAgKzEsMTYzIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEpvaGFubmVzIFNjaGluZGVsaW4KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nQSBzaW1wbGUgdHVyaWFsIGluIHRoZSBmb3JtIG9mIGEgdGVzdCBjYXNlJworCisuIC4vdGVzdC1saWIuc2gKKworZWNobyAiSGVsbG8gV29ybGQiID4gaGVsbG8KK2VjaG8gIlNpbGx5IGV4YW1wbGUiID4gZXhhbXBsZQorCitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGhlbGxvIGV4YW1wbGUKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYmxvYicgInRlc3QgYmxvYiA9IFwiJChnaXQgY2F0LWZpbGUgLXQgNTU3ZGIwMylcIiIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYmxvYiA1NTdkYjAzJyAidGVzdCBcIkhlbGxvIFdvcmxkXCIgPSBcIiQoZ2l0IGNhdC1maWxlIGJsb2IgNTU3ZGIwMylcIiIKKworZWNobyAiSXQncyBhIG5ldyBkYXkgZm9yIGdpdCIgPj5oZWxsbworY2F0ID4gZGlmZi5leHBlY3QgPDwgRU9GCitkaWZmIC0tZ2l0IGEvaGVsbG8gYi9oZWxsbworaW5kZXggNTU3ZGIwMy4uMjYzNDE0ZiAxMDA2NDQKKy0tLSBhL2hlbGxvCisrKysgYi9oZWxsbworQEAgLTEgKzEsMiBAQAorIEhlbGxvIFdvcmxkCisrSXQncyBhIG5ldyBkYXkgZm9yIGdpdAorRU9GCitnaXQgZGlmZi1maWxlcyAtcCA+IGRpZmYub3V0cHV0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZi1maWxlcyAtcCcgJ2NtcCBkaWZmLmV4cGVjdCBkaWZmLm91dHB1dCcKK2dpdCBkaWZmID4gZGlmZi5vdXRwdXQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmJyAnY21wIGRpZmYuZXhwZWN0IGRpZmYub3V0cHV0JworCit0cmVlPSQoZ2l0IHdyaXRlLXRyZWUgMj4vZGV2L251bGwpCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3RyZWUnICJ0ZXN0IDg5ODhkYTE1ZDA3N2Q0ODI5ZmM1MWQ4NTQ0YzA5N2RlZjY2NDRkYmIgPSAkdHJlZSIKKworb3V0cHV0PSIkKGVjaG8gIkluaXRpYWwgY29tbWl0IiB8IGdpdCBjb21taXQtdHJlZSAkKGdpdCB3cml0ZS10cmVlKSAyPiYxID4gLmdpdC9yZWZzL2hlYWRzL21hc3RlcikiCisKK2dpdCBkaWZmLWluZGV4IC1wIEhFQUQgPiBkaWZmLm91dHB1dAordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtaW5kZXggLXAgSEVBRCcgJ2NtcCBkaWZmLmV4cGVjdCBkaWZmLm91dHB1dCcKKworZ2l0IGRpZmYgSEVBRCA+IGRpZmYub3V0cHV0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZiBIRUFEJyAnY21wIGRpZmYuZXhwZWN0IGRpZmYub3V0cHV0JworCisjcm0gaGVsbG8KKyN0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgcmVhZC10cmVlIC0tcmVzZXQgSEVBRCcgImdpdCByZWFkLXRyZWUgLS1yZXNldCBIRUFEIDsgdGVzdCBcImhlbGxvOiBuZWVkcyB1cGRhdGVcIiA9IFwiJChnaXQgdXBkYXRlLWluZGV4IC0tcmVmcmVzaClcIiIKKworY2F0ID4gd2hhdGNoYW5nZWQuZXhwZWN0IDw8IEVPRgorY29tbWl0IFZBUklBQkxFCitBdXRob3I6IFZBUklBQkxFCitEYXRlOiAgIFZBUklBQkxFCisKKyAgICBJbml0aWFsIGNvbW1pdAorCitkaWZmIC0tZ2l0IGEvZXhhbXBsZSBiL2V4YW1wbGUKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5mMjRjNzRhCistLS0gL2Rldi9udWxsCisrKysgYi9leGFtcGxlCitAQCAtMCwwICsxIEBACisrU2lsbHkgZXhhbXBsZQorZGlmZiAtLWdpdCBhL2hlbGxvIGIvaGVsbG8KK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi41NTdkYjAzCistLS0gL2Rldi9udWxsCisrKysgYi9oZWxsbworQEAgLTAsMCArMSBAQAorK0hlbGxvIFdvcmxkCitFT0YKKworZ2l0IHdoYXRjaGFuZ2VkIC1wIC0tcm9vdCB8IFwKKwlzZWQgLWUgIjFzL15cKC5cezdcfVwpLlx7NDBcfS9cMVZBUklBQkxFLyIgXAorCQktZSAiMiwzcy9eXCguXHs4XH1cKS4qJC9cMVZBUklBQkxFLyIgXAorPiB3aGF0Y2hhbmdlZC5vdXRwdXQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCB3aGF0Y2hhbmdlZCAtcCAtLXJvb3QnICdjbXAgd2hhdGNoYW5nZWQuZXhwZWN0IHdoYXRjaGFuZ2VkLm91dHB1dCcKKworZ2l0IHRhZyBteS1maXJzdC10YWcKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCB0YWcgbXktZmlyc3QtdGFnJyAnY21wIC5naXQvcmVmcy9oZWFkcy9tYXN0ZXIgLmdpdC9yZWZzL3RhZ3MvbXktZmlyc3QtdGFnJworCisjIFRPRE86IHRlc3QgZ2l0LWNsb25lCisKK2dpdCBjaGVja291dCAtYiBteWJyYW5jaAordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGNoZWNrb3V0IC1iIG15YnJhbmNoJyAnY21wIC5naXQvcmVmcy9oZWFkcy9tYXN0ZXIgLmdpdC9yZWZzL2hlYWRzL215YnJhbmNoJworCitjYXQgPiBicmFuY2guZXhwZWN0IDw8RU9GCisgIG1hc3RlcgorKiBteWJyYW5jaAorRU9GCisKK2dpdCBicmFuY2ggPiBicmFuY2gub3V0cHV0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgYnJhbmNoJyAnY21wIGJyYW5jaC5leHBlY3QgYnJhbmNoLm91dHB1dCcKKworZ2l0IGNoZWNrb3V0IG15YnJhbmNoCitlY2hvICJXb3JrLCB3b3JrLCB3b3JrIiA+PmhlbGxvCitnaXQgY29tbWl0IC1tICdTb21lIHdvcmsuJyAtaSBoZWxsbworCitnaXQgY2hlY2tvdXQgbWFzdGVyCisKK2VjaG8gIlBsYXksIHBsYXksIHBsYXkiID4+aGVsbG8KK2VjaG8gIkxvdHMgb2YgZnVuIiA+PmV4YW1wbGUKK2dpdCBjb21taXQgLW0gJ1NvbWUgZnVuLicgLWkgaGVsbG8gZXhhbXBsZQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgcmVzb2x2ZSBub3cgZmFpbHMnICcKKwkhIGdpdCBtZXJnZSAtbSAiTWVyZ2Ugd29yayBpbiBteWJyYW5jaCIgbXlicmFuY2gKKycKKworY2F0ID4gaGVsbG8gPDwgRU9GCitIZWxsbyBXb3JsZAorSXQncyBhIG5ldyBkYXkgZm9yIGdpdAorUGxheSwgcGxheSwgcGxheQorV29yaywgd29yaywgd29yaworRU9GCisKK2dpdCBjb21taXQgLW0gJ01lcmdlZCAibXlicmFuY2giIGNoYW5nZXMuJyAtaSBoZWxsbworCit0ZXN0X2RvbmUKKworY2F0ID4gc2hvdy1icmFuY2guZXhwZWN0IDw8IEVPRgorKiBbbWFzdGVyXSBNZXJnZWQgIm15YnJhbmNoIiBjaGFuZ2VzLgorICEgW215YnJhbmNoXSBTb21lIHdvcmsuCistLQorLSAgW21hc3Rlcl0gTWVyZ2VkICJteWJyYW5jaCIgY2hhbmdlcy4KKyorIFtteWJyYW5jaF0gU29tZSB3b3JrLgorRU9GCisKK2dpdCBzaG93LWJyYW5jaCAtLXRvcG8tb3JkZXIgbWFzdGVyIG15YnJhbmNoID4gc2hvdy1icmFuY2gub3V0cHV0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgc2hvdy1icmFuY2gnICdjbXAgc2hvdy1icmFuY2guZXhwZWN0IHNob3ctYnJhbmNoLm91dHB1dCcKKworZ2l0IGNoZWNrb3V0IG15YnJhbmNoCisKK2NhdCA+IHJlc29sdmUuZXhwZWN0IDw8IEVPRgorVXBkYXRpbmcgZnJvbSBWQVJJQUJMRSB0byBWQVJJQUJMRQorIGV4YW1wbGUgfCAgICAxICsKKyBoZWxsbyAgIHwgICAgMSArCisgMiBmaWxlcyBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCitFT0YKKworZ2l0IG1lcmdlIC1zICJNZXJnZSB1cHN0cmVhbSBjaGFuZ2VzLiIgbWFzdGVyIHwgXAorCXNlZCAtZSAiMXMvWzAtOWEtZl1cezQwXH0vVkFSSUFCTEUvZyIgPnJlc29sdmUub3V0cHV0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgcmVzb2x2ZScgJ2NtcCByZXNvbHZlLmV4cGVjdCByZXNvbHZlLm91dHB1dCcKKworY2F0ID4gc2hvdy1icmFuY2gyLmV4cGVjdCA8PCBFT0YKKyEgW21hc3Rlcl0gTWVyZ2VkICJteWJyYW5jaCIgY2hhbmdlcy4KKyAqIFtteWJyYW5jaF0gTWVyZ2VkICJteWJyYW5jaCIgY2hhbmdlcy4KKy0tCistLSBbbWFzdGVyXSBNZXJnZWQgIm15YnJhbmNoIiBjaGFuZ2VzLgorRU9GCisKK2dpdCBzaG93LWJyYW5jaCAtLXRvcG8tb3JkZXIgbWFzdGVyIG15YnJhbmNoID4gc2hvdy1icmFuY2gyLm91dHB1dAordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IHNob3ctYnJhbmNoJyAnY21wIHNob3ctYnJhbmNoMi5leHBlY3Qgc2hvdy1icmFuY2gyLm91dHB1dCcKKworIyBUT0RPOiB0ZXN0IGdpdCBmZXRjaAorCisjIFRPRE86IHRlc3QgZ2l0IHB1c2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IHJlcGFjaycgJ2dpdCByZXBhY2snCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgcHJ1bmUtcGFja2VkJyAnZ2l0IHBydW5lLXBhY2tlZCcKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy0+IG9ubHkgcGFja2VkIG9iamVjdHMnICcKKwkhIGZpbmQgLXR5cGUgZiAuZ2l0L29iamVjdHMvWzAtOWEtZl1bMC05YS1mXQorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDEzMDAtcmVwby1jb25maWcuc2ggYi90L3QxMzAwLXJlcG8tY29uZmlnLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIzNmE5MDEKLS0tIC9kZXYvbnVsbAorKysgYi90L3QxMzAwLXJlcG8tY29uZmlnLnNoCkBAIC0wLDAgKzEsNjg1IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEpvaGFubmVzIFNjaGluZGVsaW4KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdCBnaXQgY29uZmlnIGluIGRpZmZlcmVudCBzZXR0aW5ncycKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3QgLWYgLmdpdC9jb25maWcgJiYgcm0gLmdpdC9jb25maWcKKworZ2l0IGNvbmZpZyBjb3JlLnBlbmd1aW4gImxpdHRsZSBibHVlIgorCitjYXQgPiBleHBlY3QgPDwgRU9GCitbY29yZV0KKwlwZW5ndWluID0gbGl0dGxlIGJsdWUKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbml0aWFsJyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKworZ2l0IGNvbmZpZyBDb3JlLk1vdmllIEJhZFBoeXNpY3MKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorW2NvcmVdCisJcGVuZ3VpbiA9IGxpdHRsZSBibHVlCisJTW92aWUgPSBCYWRQaHlzaWNzCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWl4ZWQgY2FzZScgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK2dpdCBjb25maWcgQ29yZXMuV2hhdEV2ZXIgU2Vjb25kCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK1tjb3JlXQorCXBlbmd1aW4gPSBsaXR0bGUgYmx1ZQorCU1vdmllID0gQmFkUGh5c2ljcworW0NvcmVzXQorCVdoYXRFdmVyID0gU2Vjb25kCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2ltaWxhciBzZWN0aW9uJyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKworZ2l0IGNvbmZpZyBDT1JFLlVQUEVSQ0FTRSB0cnVlCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK1tjb3JlXQorCXBlbmd1aW4gPSBsaXR0bGUgYmx1ZQorCU1vdmllID0gQmFkUGh5c2ljcworCVVQUEVSQ0FTRSA9IHRydWUKK1tDb3Jlc10KKwlXaGF0RXZlciA9IFNlY29uZAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NpbWlsYXIgc2VjdGlvbicgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlcGxhY2Ugd2l0aCBub24tbWF0Y2gnIFwKKwknZ2l0IGNvbmZpZyBjb3JlLnBlbmd1aW4ga2luZ3BpbiAhYmx1ZScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVwbGFjZSB3aXRoIG5vbi1tYXRjaCAoYWN0dWFsbHkgbWF0Y2hpbmcpJyBcCisJJ2dpdCBjb25maWcgY29yZS5wZW5ndWluICJ2ZXJ5IGJsdWUiICFraW5ncGluJworCitjYXQgPiBleHBlY3QgPDwgRU9GCitbY29yZV0KKwlwZW5ndWluID0gdmVyeSBibHVlCisJTW92aWUgPSBCYWRQaHlzaWNzCisJVVBQRVJDQVNFID0gdHJ1ZQorCXBlbmd1aW4gPSBraW5ncGluCitbQ29yZXNdCisJV2hhdEV2ZXIgPSBTZWNvbmQKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdub24tbWF0Y2ggcmVzdWx0JyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKworY2F0ID4gLmdpdC9jb25maWcgPDxcRU9GCitbYWxwaGFdCitiYXIgPSBmb28KK1tiZXRhXQorYmF6ID0gbXVsdGlwbGUgXAorbGluZXMKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1bnNldCB3aXRoIGNvbnQuIGxpbmVzJyBcCisJJ2dpdCBjb25maWcgLS11bnNldCBiZXRhLmJheicKKworY2F0ID4gZXhwZWN0IDw8XEVPRgorW2FscGhhXQorYmFyID0gZm9vCitbYmV0YV0KK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1bnNldCB3aXRoIGNvbnQuIGxpbmVzIGlzIGNvcnJlY3QnICdjbXAgLmdpdC9jb25maWcgZXhwZWN0JworCitjYXQgPiAuZ2l0L2NvbmZpZyA8PCBFT0YKK1tiZXRhXSA7IHNpbGx5IGNvbW1lbnQgIyBhbm90aGVyIGNvbW1lbnQKK25vSW5kZW50PSBzaWxseVZhbHVlIDsgJ25vdGhlciBzaWxseSBjb21tZW50CisKKyMgZW1wdHkgbGluZQorCQk7IGNvbW1lbnQKKwkJaGFoYSAgID0iYmV0YSIgIyBsYXN0IHNpbGx5IGNvbW1lbnQKK2hhaGEgPSBoZWxsbworCWhhaGEgPSBiZWxsbworW25leHRTZWN0aW9uXSBub05ld2xpbmUgPSBvdWNoCitFT0YKKworY3AgLmdpdC9jb25maWcgLmdpdC9jb25maWcyCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ211bHRpcGxlIHVuc2V0JyBcCisJJ2dpdCBjb25maWcgLS11bnNldC1hbGwgYmV0YS5oYWhhJworCitjYXQgPiBleHBlY3QgPDwgRU9GCitbYmV0YV0gOyBzaWxseSBjb21tZW50ICMgYW5vdGhlciBjb21tZW50Citub0luZGVudD0gc2lsbHlWYWx1ZSA7ICdub3RoZXIgc2lsbHkgY29tbWVudAorCisjIGVtcHR5IGxpbmUKKwkJOyBjb21tZW50CitbbmV4dFNlY3Rpb25dIG5vTmV3bGluZSA9IG91Y2gKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtdWx0aXBsZSB1bnNldCBpcyBjb3JyZWN0JyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKworbXYgLmdpdC9jb25maWcyIC5naXQvY29uZmlnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy0tcmVwbGFjZS1hbGwnIFwKKwknZ2l0IGNvbmZpZyAtLXJlcGxhY2UtYWxsIGJldGEuaGFoYSBnYW1tYScKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorW2JldGFdIDsgc2lsbHkgY29tbWVudCAjIGFub3RoZXIgY29tbWVudAorbm9JbmRlbnQ9IHNpbGx5VmFsdWUgOyAnbm90aGVyIHNpbGx5IGNvbW1lbnQKKworIyBlbXB0eSBsaW5lCisJCTsgY29tbWVudAorCWhhaGEgPSBnYW1tYQorW25leHRTZWN0aW9uXSBub05ld2xpbmUgPSBvdWNoCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYWxsIHJlcGxhY2VkJyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKworZ2l0IGNvbmZpZyBiZXRhLmhhaGEgYWxwaGEKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorW2JldGFdIDsgc2lsbHkgY29tbWVudCAjIGFub3RoZXIgY29tbWVudAorbm9JbmRlbnQ9IHNpbGx5VmFsdWUgOyAnbm90aGVyIHNpbGx5IGNvbW1lbnQKKworIyBlbXB0eSBsaW5lCisJCTsgY29tbWVudAorCWhhaGEgPSBhbHBoYQorW25leHRTZWN0aW9uXSBub05ld2xpbmUgPSBvdWNoCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVhbGx5IG1lYW4gdGVzdCcgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK2dpdCBjb25maWcgbmV4dHNlY3Rpb24ubm9uZXdsaW5lIHdvdworCitjYXQgPiBleHBlY3QgPDwgRU9GCitbYmV0YV0gOyBzaWxseSBjb21tZW50ICMgYW5vdGhlciBjb21tZW50Citub0luZGVudD0gc2lsbHlWYWx1ZSA7ICdub3RoZXIgc2lsbHkgY29tbWVudAorCisjIGVtcHR5IGxpbmUKKwkJOyBjb21tZW50CisJaGFoYSA9IGFscGhhCitbbmV4dFNlY3Rpb25dCisJbm9uZXdsaW5lID0gd293CitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVhbGx5IHJlYWxseSBtZWFuIHRlc3QnICdjbXAgLmdpdC9jb25maWcgZXhwZWN0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnZXQgdmFsdWUnICd0ZXN0IGFscGhhID0gJChnaXQgY29uZmlnIGJldGEuaGFoYSknCitnaXQgY29uZmlnIC0tdW5zZXQgYmV0YS5oYWhhCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK1tiZXRhXSA7IHNpbGx5IGNvbW1lbnQgIyBhbm90aGVyIGNvbW1lbnQKK25vSW5kZW50PSBzaWxseVZhbHVlIDsgJ25vdGhlciBzaWxseSBjb21tZW50CisKKyMgZW1wdHkgbGluZQorCQk7IGNvbW1lbnQKK1tuZXh0U2VjdGlvbl0KKwlub25ld2xpbmUgPSB3b3cKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1bnNldCcgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK2dpdCBjb25maWcgbmV4dHNlY3Rpb24uTm9OZXdMaW5lICJ3b3cyIGZvciBtZSIgImZvciBtZSQiCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK1tiZXRhXSA7IHNpbGx5IGNvbW1lbnQgIyBhbm90aGVyIGNvbW1lbnQKK25vSW5kZW50PSBzaWxseVZhbHVlIDsgJ25vdGhlciBzaWxseSBjb21tZW50CisKKyMgZW1wdHkgbGluZQorCQk7IGNvbW1lbnQKK1tuZXh0U2VjdGlvbl0KKwlub25ld2xpbmUgPSB3b3cKKwlOb05ld0xpbmUgPSB3b3cyIGZvciBtZQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ211bHRpdmFyJyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbm9uLW1hdGNoJyBcCisJJ2dpdCBjb25maWcgLS1nZXQgbmV4dHNlY3Rpb24ubm9uZXdsaW5lICFmb3InCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ25vbi1tYXRjaCB2YWx1ZScgXAorCSd0ZXN0IHdvdyA9ICQoZ2l0IGNvbmZpZyAtLWdldCBuZXh0c2VjdGlvbi5ub25ld2xpbmUgIWZvciknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FtYmlndW91cyBnZXQnICcKKwkhIGdpdCBjb25maWcgLS1nZXQgbmV4dHNlY3Rpb24ubm9uZXdsaW5lCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dldCBtdWx0aXZhcicgXAorCSdnaXQgY29uZmlnIC0tZ2V0LWFsbCBuZXh0c2VjdGlvbi5ub25ld2xpbmUnCisKK2dpdCBjb25maWcgbmV4dHNlY3Rpb24ubm9uZXdsaW5lICJ3b3czIiAid293JCIKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorW2JldGFdIDsgc2lsbHkgY29tbWVudCAjIGFub3RoZXIgY29tbWVudAorbm9JbmRlbnQ9IHNpbGx5VmFsdWUgOyAnbm90aGVyIHNpbGx5IGNvbW1lbnQKKworIyBlbXB0eSBsaW5lCisJCTsgY29tbWVudAorW25leHRTZWN0aW9uXQorCW5vbmV3bGluZSA9IHdvdzMKKwlOb05ld0xpbmUgPSB3b3cyIGZvciBtZQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ211bHRpdmFyIHJlcGxhY2UnICdjbXAgLmdpdC9jb25maWcgZXhwZWN0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhbWJpZ3VvdXMgdmFsdWUnICcKKwkhIGdpdCBjb25maWcgbmV4dHNlY3Rpb24ubm9uZXdsaW5lCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FtYmlndW91cyB1bnNldCcgJworCSEgZ2l0IGNvbmZpZyAtLXVuc2V0IG5leHRzZWN0aW9uLm5vbmV3bGluZQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbnZhbGlkIHVuc2V0JyAnCisJISBnaXQgY29uZmlnIC0tdW5zZXQgc29tZXNlY3Rpb24ubm9uZXdsaW5lCisnCisKK2dpdCBjb25maWcgLS11bnNldCBuZXh0c2VjdGlvbi5ub25ld2xpbmUgIndvdzMkIgorCitjYXQgPiBleHBlY3QgPDwgRU9GCitbYmV0YV0gOyBzaWxseSBjb21tZW50ICMgYW5vdGhlciBjb21tZW50Citub0luZGVudD0gc2lsbHlWYWx1ZSA7ICdub3RoZXIgc2lsbHkgY29tbWVudAorCisjIGVtcHR5IGxpbmUKKwkJOyBjb21tZW50CitbbmV4dFNlY3Rpb25dCisJTm9OZXdMaW5lID0gd293MiBmb3IgbWUKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtdWx0aXZhciB1bnNldCcgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ludmFsaWQga2V5JyAnISBnaXQgY29uZmlnIGludmFsLjJrZXkgYmxhYmxhJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb3JyZWN0IGtleScgJ2dpdCBjb25maWcgMTIzNDU2LmExMjMgOTg3JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdoaWVyYXJjaGljYWwgc2VjdGlvbicgXAorCSdnaXQgY29uZmlnIFZlcnNpb24uMS4yLjNlWC5BbHBoYSBiZXRhJworCitjYXQgPiBleHBlY3QgPDwgRU9GCitbYmV0YV0gOyBzaWxseSBjb21tZW50ICMgYW5vdGhlciBjb21tZW50Citub0luZGVudD0gc2lsbHlWYWx1ZSA7ICdub3RoZXIgc2lsbHkgY29tbWVudAorCisjIGVtcHR5IGxpbmUKKwkJOyBjb21tZW50CitbbmV4dFNlY3Rpb25dCisJTm9OZXdMaW5lID0gd293MiBmb3IgbWUKK1sxMjM0NTZdCisJYTEyMyA9IDk4NworW1ZlcnNpb24gIjEuMi4zZVgiXQorCUFscGhhID0gYmV0YQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2hpZXJhcmNoaWNhbCBzZWN0aW9uIHZhbHVlJyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorYmV0YS5ub2luZGVudD1zaWxseVZhbHVlCituZXh0c2VjdGlvbi5ub25ld2xpbmU9d293MiBmb3IgbWUKKzEyMzQ1Ni5hMTIzPTk4NwordmVyc2lvbi4xLjIuM2VYLmFscGhhPWJldGEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd3b3JraW5nIC0tbGlzdCcgXAorCSdnaXQgY29uZmlnIC0tbGlzdCA+IG91dHB1dCAmJiBjbXAgb3V0cHV0IGV4cGVjdCcKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorYmV0YS5ub2luZGVudCBzaWxseVZhbHVlCituZXh0c2VjdGlvbi5ub25ld2xpbmUgd293MiBmb3IgbWUKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctLWdldC1yZWdleHAnIFwKKwknZ2l0IGNvbmZpZyAtLWdldC1yZWdleHAgaW4gPiBvdXRwdXQgJiYgY21wIG91dHB1dCBleHBlY3QnCisKK2dpdCBjb25maWcgLS1hZGQgbmV4dHNlY3Rpb24ubm9uZXdsaW5lICJ3b3c0IGZvciB5b3UiCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK3dvdzIgZm9yIG1lCit3b3c0IGZvciB5b3UKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctLWFkZCcgXAorCSdnaXQgY29uZmlnIC0tZ2V0LWFsbCBuZXh0c2VjdGlvbi5ub25ld2xpbmUgPiBvdXRwdXQgJiYgY21wIG91dHB1dCBleHBlY3QnCisKK2NhdCA+IC5naXQvY29uZmlnIDw8IEVPRgorW25vdmFsdWVdCisJdmFyaWFibGUKK1tlbXB0eXZhbHVlXQorCXZhcmlhYmxlID0KK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnZXQgdmFyaWFibGUgd2l0aCBubyB2YWx1ZScgXAorCSdnaXQgY29uZmlnIC0tZ2V0IG5vdmFsdWUudmFyaWFibGUgXiQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dldCB2YXJpYWJsZSB3aXRoIGVtcHR5IHZhbHVlJyBcCisJJ2dpdCBjb25maWcgLS1nZXQgZW1wdHl2YWx1ZS52YXJpYWJsZSBeJCcKKworZWNobyBub3ZhbHVlLnZhcmlhYmxlID4gZXhwZWN0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dldC1yZWdleHAgdmFyaWFibGUgd2l0aCBubyB2YWx1ZScgXAorCSdnaXQgY29uZmlnIC0tZ2V0LXJlZ2V4cCBub3ZhbHVlID4gb3V0cHV0ICYmCisJIGNtcCBvdXRwdXQgZXhwZWN0JworCitlY2hvICdlbXB0eXZhbHVlLnZhcmlhYmxlICcgPiBleHBlY3QKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2V0LXJlZ2V4cCB2YXJpYWJsZSB3aXRoIGVtcHR5IHZhbHVlJyBcCisJJ2dpdCBjb25maWcgLS1nZXQtcmVnZXhwIGVtcHR5dmFsdWUgPiBvdXRwdXQgJiYKKwkgY21wIG91dHB1dCBleHBlY3QnCisKK2VjaG8gdHJ1ZSA+IGV4cGVjdAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnZXQgYm9vbCB2YXJpYWJsZSB3aXRoIG5vIHZhbHVlJyBcCisJJ2dpdCBjb25maWcgLS1ib29sIG5vdmFsdWUudmFyaWFibGUgPiBvdXRwdXQgJiYKKwkgY21wIG91dHB1dCBleHBlY3QnCisKK2VjaG8gZmFsc2UgPiBleHBlY3QKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2V0IGJvb2wgdmFyaWFibGUgd2l0aCBlbXB0eSB2YWx1ZScgXAorCSdnaXQgY29uZmlnIC0tYm9vbCBlbXB0eXZhbHVlLnZhcmlhYmxlID4gb3V0cHV0ICYmCisJIGNtcCBvdXRwdXQgZXhwZWN0JworCitnaXQgY29uZmlnID4gb3V0cHV0IDI+JjEKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbm8gYXJndW1lbnRzLCBidXQgbm8gY3Jhc2gnIFwKKwkidGVzdCAkPyA9IDEyOSAmJiBncmVwIHVzYWdlIG91dHB1dCIKKworY2F0ID4gLmdpdC9jb25maWcgPDwgRU9GCitbYS5iXQorCWMgPSBkCitFT0YKKworZ2l0IGNvbmZpZyBhLnggeQorCitjYXQgPiBleHBlY3QgPDwgRU9GCitbYS5iXQorCWMgPSBkCitbYV0KKwl4ID0geQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ25ldyBzZWN0aW9uIGlzIHBhcnRpYWwgbWF0Y2ggb2YgYW5vdGhlcicgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK2dpdCBjb25maWcgYi54IHkKK2dpdCBjb25maWcgYS5iIGMKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorW2EuYl0KKwljID0gZAorW2FdCisJeCA9IHkKKwliID0gYworW2JdCisJeCA9IHkKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICduZXcgdmFyaWFibGUgaW5zZXJ0cyBpbnRvIHByb3BlciBzZWN0aW9uJyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYWx0ZXJuYXRpdmUgR0lUX0NPTkZJRyAobm9uLWV4aXN0aW5nIGZpbGUgc2hvdWxkIGZhaWwpJyBcCisJJ2dpdCBjb25maWcgLS1maWxlIG5vbi1leGlzdGluZy1jb25maWcgLWw7IHRlc3QgJD8gIT0gMCcKKworY2F0ID4gb3RoZXItY29uZmlnIDw8IEVPRgorW2Vpbl0KKwliYWhuID0gc3RyYXNzZQorRU9GCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK2Vpbi5iYWhuPXN0cmFzc2UKK0VPRgorCitHSVRfQ09ORklHPW90aGVyLWNvbmZpZyBnaXQgY29uZmlnIC1sID4gb3V0cHV0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FsdGVybmF0aXZlIEdJVF9DT05GSUcnICdjbXAgb3V0cHV0IGV4cGVjdCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYWx0ZXJuYXRpdmUgR0lUX0NPTkZJRyAoLS1maWxlKScgXAorCSdnaXQgY29uZmlnIC0tZmlsZSBvdGhlci1jb25maWcgLWwgPiBvdXRwdXQgJiYgY21wIG91dHB1dCBleHBlY3QnCisKK0dJVF9DT05GSUc9b3RoZXItY29uZmlnIGdpdCBjb25maWcgYW53b2huZXIucGFyayBhdXN3ZWlzCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK1tlaW5dCisJYmFobiA9IHN0cmFzc2UKK1thbndvaG5lcl0KKwlwYXJrID0gYXVzd2VpcworRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy0tc2V0IGluIGFsdGVybmF0aXZlIEdJVF9DT05GSUcnICdjbXAgb3RoZXItY29uZmlnIGV4cGVjdCcKKworY2F0ID4gLmdpdC9jb25maWcgPDwgRU9GCisjIEhhbGxvCisJI0JlbGxvCitbYnJhbmNoICJlaW5zIl0KKwl4ID0gMQorW2JyYW5jaC5laW5zXQorCXkgPSAxCisJW2JyYW5jaCAiMSAyMzQgYmxhYmwvYSJdCit3ZWlyZAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgInJlbmFtZSBzZWN0aW9uIiBcCisJImdpdCBjb25maWcgLS1yZW5hbWUtc2VjdGlvbiBicmFuY2guZWlucyBicmFuY2guendlaSIKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorIyBIYWxsbworCSNCZWxsbworW2JyYW5jaCAiendlaSJdCisJeCA9IDEKK1ticmFuY2ggInp3ZWkiXQorCXkgPSAxCisJW2JyYW5jaCAiMSAyMzQgYmxhYmwvYSJdCit3ZWlyZAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgInJlbmFtZSBzdWNjZWVkZWQiICJnaXQgZGlmZiBleHBlY3QgLmdpdC9jb25maWciCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgInJlbmFtZSBub24tZXhpc3Rpbmcgc2VjdGlvbiIgJworCSEgZ2l0IGNvbmZpZyAtLXJlbmFtZS1zZWN0aW9uIGJyYW5jaC4id29ybGQgZG9taW5hdGlvbiIgYnJhbmNoLmRyZWkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAicmVuYW1lIHN1Y2NlZWRlZCIgImdpdCBkaWZmIGV4cGVjdCAuZ2l0L2NvbmZpZyIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAicmVuYW1lIGFub3RoZXIgc2VjdGlvbiIgXAorCSdnaXQgY29uZmlnIC0tcmVuYW1lLXNlY3Rpb24gYnJhbmNoLiIxIDIzNCBibGFibC9hIiBicmFuY2guZHJlaScKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorIyBIYWxsbworCSNCZWxsbworW2JyYW5jaCAiendlaSJdCisJeCA9IDEKK1ticmFuY2ggInp3ZWkiXQorCXkgPSAxCitbYnJhbmNoICJkcmVpIl0KK3dlaXJkCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAicmVuYW1lIHN1Y2NlZWRlZCIgImdpdCBkaWZmIGV4cGVjdCAuZ2l0L2NvbmZpZyIKKworY2F0ID4+IC5naXQvY29uZmlnIDw8IEVPRgorICBbYnJhbmNoICJ6d2VpIl0gYSA9IDEgW2JyYW5jaCAidmllciJdCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAicmVtb3ZlIHNlY3Rpb24iICJnaXQgY29uZmlnIC0tcmVtb3ZlLXNlY3Rpb24gYnJhbmNoLnp3ZWkiCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKKyMgSGFsbG8KKwkjQmVsbG8KK1ticmFuY2ggImRyZWkiXQord2VpcmQKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJzZWN0aW9uIHdhcyByZW1vdmVkIHByb3Blcmx5IiBcCisJImdpdCBkaWZmIC11IGV4cGVjdCAuZ2l0L2NvbmZpZyIKKworcm0gLmdpdC9jb25maWcKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorW2dpdGN2c10KKwllbmFibGVkID0gdHJ1ZQorCWRibmFtZSA9ICVHZ2l0Y3ZzMi4lYS4lbS5zcWxpdGUKK1tnaXRjdnMgImV4dCJdCisJZGJuYW1lID0gJUdnaXRjdnMxLiVhLiVtLnNxbGl0ZQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NlY3Rpb24gZW5kaW5nJyAnCisKKwlnaXQgY29uZmlnIGdpdGN2cy5lbmFibGVkIHRydWUgJiYKKwlnaXQgY29uZmlnIGdpdGN2cy5leHQuZGJuYW1lICVHZ2l0Y3ZzMS4lYS4lbS5zcWxpdGUgJiYKKwlnaXQgY29uZmlnIGdpdGN2cy5kYm5hbWUgJUdnaXRjdnMyLiVhLiVtLnNxbGl0ZSAmJgorCWNtcCAuZ2l0L2NvbmZpZyBleHBlY3QKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIG51bWJlcnMgJworCisJZ2l0IGNvbmZpZyBraWxvLmdyYW0gMWsgJiYKKwlnaXQgY29uZmlnIG1lZ2EudG9uIDFtICYmCisJaz0kKGdpdCBjb25maWcgLS1pbnQgLS1nZXQga2lsby5ncmFtKSAmJgorCXRlc3QgejEwMjQgPSAieiRrIiAmJgorCW09JChnaXQgY29uZmlnIC0taW50IC0tZ2V0IG1lZ2EudG9uKSAmJgorCXRlc3QgejEwNDg1NzYgPSAieiRtIgorJworCitjYXQgPiBleHBlY3QgPDxFT0YKK2ZhdGFsOiBiYWQgY29uZmlnIHZhbHVlIGZvciAnYW5pbnZhbGlkLnVuaXQnIGluIC5naXQvY29uZmlnCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW52YWxpZCB1bml0JyAnCisKKwlnaXQgY29uZmlnIGFuaW52YWxpZC51bml0ICIxYXV0byIgJiYKKwlzPSQoZ2l0IGNvbmZpZyBhbmludmFsaWQudW5pdCkgJiYKKwl0ZXN0ICJ6MWF1dG8iID0gInokcyIgJiYKKwlpZiBnaXQgY29uZmlnIC0taW50IC0tZ2V0IGFuaW52YWxpZC51bml0IDI+YWN0dWFsCisJdGhlbgorCQllY2hvIGNvbmZpZyBzaG91bGQgaGF2ZSBmYWlsZWQKKwkJZmFsc2UKKwlmaSAmJgorCWNtcCBhY3R1YWwgZXhwZWN0CisnCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK3RydWUKK2ZhbHNlCit0cnVlCitmYWxzZQordHJ1ZQorZmFsc2UKK3RydWUKK2ZhbHNlCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBib29sICcKKworCWdpdCBjb25maWcgYm9vbC50cnVlMSAwMSAmJgorCWdpdCBjb25maWcgYm9vbC50cnVlMiAtMSAmJgorCWdpdCBjb25maWcgYm9vbC50cnVlMyBZZVMgJiYKKwlnaXQgY29uZmlnIGJvb2wudHJ1ZTQgdHJ1ZSAmJgorCWdpdCBjb25maWcgYm9vbC5mYWxzZTEgMDAwICYmCisJZ2l0IGNvbmZpZyBib29sLmZhbHNlMiAiIiAmJgorCWdpdCBjb25maWcgYm9vbC5mYWxzZTMgbk8gJiYKKwlnaXQgY29uZmlnIGJvb2wuZmFsc2U0IEZBTFNFICYmCisJcm0gLWYgcmVzdWx0ICYmCisJZm9yIGkgaW4gMSAyIDMgNAorCWRvCisJICAgIGdpdCBjb25maWcgLS1ib29sIC0tZ2V0IGJvb2wudHJ1ZSRpID4+cmVzdWx0CisJICAgIGdpdCBjb25maWcgLS1ib29sIC0tZ2V0IGJvb2wuZmFsc2UkaSA+PnJlc3VsdAorICAgICAgICBkb25lICYmCisJY21wIGV4cGVjdCByZXN1bHQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ludmFsaWQgYm9vbCAoLS1nZXQpJyAnCisKKwlnaXQgY29uZmlnIGJvb2wubm9ib29sIGZvb2JhciAmJgorCSEgZ2l0IGNvbmZpZyAtLWJvb2wgLS1nZXQgYm9vbC5ub2Jvb2wnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ludmFsaWQgYm9vbCAoc2V0KScgJworCisJISBnaXQgY29uZmlnIC0tYm9vbCBib29sLm5vYm9vbCBmb29iYXInCisKK3JtIC5naXQvY29uZmlnCisKK2NhdCA+IGV4cGVjdCA8PFxFT0YKK1tib29sXQorCXRydWUxID0gdHJ1ZQorCXRydWUyID0gdHJ1ZQorCXRydWUzID0gdHJ1ZQorCXRydWU0ID0gdHJ1ZQorCWZhbHNlMSA9IGZhbHNlCisJZmFsc2UyID0gZmFsc2UKKwlmYWxzZTMgPSBmYWxzZQorCWZhbHNlNCA9IGZhbHNlCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0IC0tYm9vbCcgJworCisJZ2l0IGNvbmZpZyAtLWJvb2wgYm9vbC50cnVlMSAwMSAmJgorCWdpdCBjb25maWcgLS1ib29sIGJvb2wudHJ1ZTIgLTEgJiYKKwlnaXQgY29uZmlnIC0tYm9vbCBib29sLnRydWUzIFllUyAmJgorCWdpdCBjb25maWcgLS1ib29sIGJvb2wudHJ1ZTQgdHJ1ZSAmJgorCWdpdCBjb25maWcgLS1ib29sIGJvb2wuZmFsc2UxIDAwMCAmJgorCWdpdCBjb25maWcgLS1ib29sIGJvb2wuZmFsc2UyICIiICYmCisJZ2l0IGNvbmZpZyAtLWJvb2wgYm9vbC5mYWxzZTMgbk8gJiYKKwlnaXQgY29uZmlnIC0tYm9vbCBib29sLmZhbHNlNCBGQUxTRSAmJgorCWNtcCBleHBlY3QgLmdpdC9jb25maWcnCisKK3JtIC5naXQvY29uZmlnCisKK2NhdCA+IGV4cGVjdCA8PFxFT0YKK1tpbnRdCisJdmFsMSA9IDEKKwl2YWwyID0gLTEKKwl2YWwzID0gNTI0Mjg4MAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NldCAtLWludCcgJworCisJZ2l0IGNvbmZpZyAtLWludCBpbnQudmFsMSAwMSAmJgorCWdpdCBjb25maWcgLS1pbnQgaW50LnZhbDIgLTEgJiYKKwlnaXQgY29uZmlnIC0taW50IGludC52YWwzIDVtICYmCisJY21wIGV4cGVjdCAuZ2l0L2NvbmZpZycKKworcm0gLmdpdC9jb25maWcKKworZ2l0IGNvbmZpZyBxdW90ZS5sZWFkaW5nICIgdGVzdCIKK2dpdCBjb25maWcgcXVvdGUuZW5kaW5nICJ0ZXN0ICIKK2dpdCBjb25maWcgcXVvdGUuc2VtaWNvbG9uICJ0ZXN0O3Rlc3QiCitnaXQgY29uZmlnIHF1b3RlLmhhc2ggInRlc3QjdGVzdCIKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorW3F1b3RlXQorCWxlYWRpbmcgPSAiIHRlc3QiCisJZW5kaW5nID0gInRlc3QgIgorCXNlbWljb2xvbiA9ICJ0ZXN0O3Rlc3QiCisJaGFzaCA9ICJ0ZXN0I3Rlc3QiCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncXVvdGluZycgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2tleSB3aXRoIG5ld2xpbmUnICcKKwkhIGdpdCBjb25maWcgImtleS53aXRoCituZXdsaW5lIiAxMjMnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ZhbHVlIHdpdGggbmV3bGluZScgJ2dpdCBjb25maWcga2V5LnN1YiB2YWx1ZS53aXRoXFxcCituZXdsaW5lJworCitjYXQgPiAuZ2l0L2NvbmZpZyA8PFxFT0YKK1tzZWN0aW9uXQorCTsgY29tbWVudCBcCisJY29udGludWVkID0gY29udFwKK2ludWVkCisJbm9uY29udCAgID0gbm90IGNvbnRpbnVlZCA7IFwKKwlxdW90ZWNvbnQgPSAiY29udDtcCitpbnVlZCIKK0VPRgorCitjYXQgPiBleHBlY3QgPDxcRU9GCitzZWN0aW9uLmNvbnRpbnVlZD1jb250aW51ZWQKK3NlY3Rpb24ubm9uY29udD1ub3QgY29udGludWVkCitzZWN0aW9uLnF1b3RlY29udD1jb250O2ludWVkCitFT0YKKworZ2l0IGNvbmZpZyAtLWxpc3QgPiByZXN1bHQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndmFsdWUgY29udGludWVkIG9uIG5leHQgbGluZScgJ2NtcCByZXN1bHQgZXhwZWN0JworCitjYXQgPiAuZ2l0L2NvbmZpZyA8PFxFT0YKK1tzZWN0aW9uICJzdWI9c2VjdGlvbiJdCisJdmFsMSA9IGZvbz1iYXIKKwl2YWwyID0gZm9vXG5iYXIKKwl2YWwzID0gXG5cbgorCXZhbDQgPQorCXZhbDUKK0VPRgorCitjYXQgPiBleHBlY3QgPDxcRU9GCitzZWN0aW9uLnN1Yj1zZWN0aW9uLnZhbDEKK2Zvbz1iYXJRc2VjdGlvbi5zdWI9c2VjdGlvbi52YWwyCitmb28KK2JhclFzZWN0aW9uLnN1Yj1zZWN0aW9uLnZhbDMKKworCitRc2VjdGlvbi5zdWI9c2VjdGlvbi52YWw0CitRc2VjdGlvbi5zdWI9c2VjdGlvbi52YWw1UQorRU9GCisKK2dpdCBjb25maWcgLS1udWxsIC0tbGlzdCB8IHBlcmwgLXBlICd5L1wwMDAvUS8nID4gcmVzdWx0CitlY2hvID4+cmVzdWx0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy0tbnVsbCAtLWxpc3QnICdjbXAgcmVzdWx0IGV4cGVjdCcKKworZ2l0IGNvbmZpZyAtLW51bGwgLS1nZXQtcmVnZXhwICd2YWxbMC05XScgfCBwZXJsIC1wZSAneS9cMDAwL1EvJyA+IHJlc3VsdAorZWNobyA+PnJlc3VsdAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctLW51bGwgLS1nZXQtcmVnZXhwJyAnY21wIHJlc3VsdCBleHBlY3QnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N5bWxpbmtlZCBjb25maWd1cmF0aW9uJyAnCisKKwlsbiAtcyBub3R5ZXQgbXljb25maWcgJiYKKwlHSVRfQ09ORklHPW15Y29uZmlnIGdpdCBjb25maWcgdGVzdC5mcm90eiBuaXRmb2wgJiYKKwl0ZXN0IC1oIG15Y29uZmlnICYmCisJdGVzdCAtZiBub3R5ZXQgJiYKKwl0ZXN0ICJ6JChHSVRfQ09ORklHPW5vdHlldCBnaXQgY29uZmlnIHRlc3QuZnJvdHopIiA9IHpuaXRmb2wgJiYKKwlHSVRfQ09ORklHPW15Y29uZmlnIGdpdCBjb25maWcgdGVzdC54eXp6eSByZXpyb3YgJiYKKwl0ZXN0IC1oIG15Y29uZmlnICYmCisJdGVzdCAtZiBub3R5ZXQgJiYKKwl0ZXN0ICJ6JChHSVRfQ09ORklHPW5vdHlldCBnaXQgY29uZmlnIHRlc3QuZnJvdHopIiA9IHpuaXRmb2wgJiYKKwl0ZXN0ICJ6JChHSVRfQ09ORklHPW5vdHlldCBnaXQgY29uZmlnIHRlc3QueHl6enkpIiA9IHpyZXpyb3YKKworJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDEzMDEtc2hhcmVkLXJlcG8uc2ggYi90L3QxMzAxLXNoYXJlZC1yZXBvLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZiZmUxOWEKLS0tIC9kZXYvbnVsbAorKysgYi90L3QxMzAxLXNoYXJlZC1yZXBvLnNoCkBAIC0wLDAgKzEsMzYgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDcgSm9oYW5uZXMgU2NoaW5kZWxpbgorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IHNoYXJlZCByZXBvc2l0b3J5IGluaXRpYWxpemF0aW9uJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2hhcmVkPWFsbCcgJworCW1rZGlyIHN1YiAmJgorCWNkIHN1YiAmJgorCWdpdCBpbml0IC0tc2hhcmVkPWFsbCAmJgorCXRlc3QgMiA9ICQoZ2l0IGNvbmZpZyBjb3JlLnNoYXJlZHJlcG9zaXRvcnkpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VwZGF0ZS1zZXJ2ZXItaW5mbyBob25vcnMgY29yZS5zaGFyZWRSZXBvc2l0b3J5JyAnCisJOiA+IGExICYmCisJZ2l0IGFkZCBhMSAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gYTEgJiYKKwl1bWFzayAwMjc3ICYmCisJZ2l0IHVwZGF0ZS1zZXJ2ZXItaW5mbyAmJgorCWFjdHVhbD0iJChscyAtbCAuZ2l0L2luZm8vcmVmcykiICYmCisJY2FzZSAiJGFjdHVhbCIgaW4KKwktci0tci0tci0tKikKKwkJOiBoYXBweQorCQk7OworCSopCisJCWVjaG8gT29wcywgLmdpdC9pbmZvL3JlZnMgaXMgbm90IDA0NDQKKwkJZmFsc2UKKwkJOzsKKwllc2FjCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MTMwMi1yZXBvLXZlcnNpb24uc2ggYi90L3QxMzAyLXJlcG8tdmVyc2lvbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YmUwNzcwCi0tLSAvZGV2L251bGwKKysrIGIvdC90MTMwMi1yZXBvLXZlcnNpb24uc2gKQEAgLTAsMCArMSw0NyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBOZ3V54buFbiBUaMOhaSBOZ+G7jWMgRHV5CisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgcmVwb3NpdG9yeSB2ZXJzaW9uIGNoZWNrJworCisuIC4vdGVzdC1saWIuc2gKKworY2F0ID50ZXN0LnBhdGNoIDw8RU9GCitkaWZmIC0tZ2l0IGEvdGVzdC50eHQgYi90ZXN0LnR4dAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKKy0tLSAvZGV2L251bGwKKysrKyBiL3Rlc3QudHh0CitAQCAtMCwwICsxIEBACisrMTIzCitFT0YKKwordGVzdF9jcmVhdGVfcmVwbyAidGVzdCIKK3Rlc3RfY3JlYXRlX3JlcG8gInRlc3QyIgorCitHSVRfQ09ORklHPXRlc3QyLy5naXQvY29uZmlnIGdpdCBjb25maWcgY29yZS5yZXBvc2l0b3J5Zm9ybWF0dmVyc2lvbiA5OSB8fCBleGl0IDEKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0ZGlyIHNlbGVjdGlvbiBvbiBub3JtYWwgcmVwb3MnICcKKwkodGVzdCAiJChnaXQgY29uZmlnIGNvcmUucmVwb3NpdG9yeWZvcm1hdHZlcnNpb24pIiA9IDAgJiYKKwljZCB0ZXN0ICYmCisJdGVzdCAiJChnaXQgY29uZmlnIGNvcmUucmVwb3NpdG9yeWZvcm1hdHZlcnNpb24pIiA9IDApJworCisjIE1ha2Ugc3VyZSBpdCB3b3VsZCBzdG9wIGF0IHRlc3QyLCBub3QgdHJhc2gKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdGRpciBzZWxlY3Rpb24gb24gdW5zdXBwb3J0ZWQgcmVwbycgJworCShjZCB0ZXN0MiAmJgorCXRlc3QgIiQoZ2l0IGNvbmZpZyBjb3JlLnJlcG9zaXRvcnlmb3JtYXR2ZXJzaW9uKSIgPSA5OSknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdGRpciBub3QgcmVxdWlyZWQgbW9kZScgJworCShnaXQgYXBwbHkgLS1zdGF0IHRlc3QucGF0Y2ggJiYKKwljZCB0ZXN0ICYmIGdpdCBhcHBseSAtLXN0YXQgLi4vdGVzdC5wYXRjaCAmJgorCWNkIC4uL3Rlc3QyICYmIGdpdCBhcHBseSAtLXN0YXQgLi4vdGVzdC5wYXRjaCknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdGRpciByZXF1aXJlZCBtb2RlIG9uIG5vcm1hbCByZXBvcycgJworCShnaXQgYXBwbHkgLS1jaGVjayAtLWluZGV4IHRlc3QucGF0Y2ggJiYKKwljZCB0ZXN0ICYmIGdpdCBhcHBseSAtLWNoZWNrIC0taW5kZXggLi4vdGVzdC5wYXRjaCknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdGRpciByZXF1aXJlZCBtb2RlIG9uIHVuc3VwcG9ydGVkIHJlcG8nICcKKwkoY2QgdGVzdDIgJiYgISBnaXQgYXBwbHkgLS1jaGVjayAtLWluZGV4IC4uL3Rlc3QucGF0Y2gpCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MTMwMy13YWNreS1jb25maWcuc2ggYi90L3QxMzAzLXdhY2t5LWNvbmZpZy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45OTk4NWRjCi0tLSAvZGV2L251bGwKKysrIGIvdC90MTMwMy13YWNreS1jb25maWcuc2gKQEAgLTAsMCArMSwzNyBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3Qgd2Fja3kgaW5wdXQgdG8gZ2l0IGNvbmZpZycKKy4gLi90ZXN0LWxpYi5zaAorCitzZXR1cCgpIHsKKwkocHJpbnRmICJbc2VjdGlvbl1cbiIgJiYKKwlwcmludGYgIiAga2V5ID0gZm9vIikgPi5naXQvY29uZmlnCit9CisKK2NoZWNrKCkgeworCWVjaG8gIiQyIiA+ZXhwZWN0ZWQKKwlnaXQgY29uZmlnIC0tZ2V0ICIkMSIgPmFjdHVhbAorCWdpdCBkaWZmIGFjdHVhbCBleHBlY3RlZAorfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtb2RpZnkgc2FtZSBrZXknICcKKwlzZXR1cCAmJgorCWdpdCBjb25maWcgc2VjdGlvbi5rZXkgYmFyICYmCisJY2hlY2sgc2VjdGlvbi5rZXkgYmFyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FkZCBrZXkgaW4gc2FtZSBzZWN0aW9uJyAnCisJc2V0dXAgJiYKKwlnaXQgY29uZmlnIHNlY3Rpb24ub3RoZXIgYmFyICYmCisJY2hlY2sgc2VjdGlvbi5rZXkgZm9vICYmCisJY2hlY2sgc2VjdGlvbi5vdGhlciBiYXIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYWRkIGtleSBpbiBkaWZmZXJlbnQgc2VjdGlvbicgJworCXNldHVwICYmCisJZ2l0IGNvbmZpZyBzZWN0aW9uMi5rZXkgYmFyICYmCisJY2hlY2sgc2VjdGlvbi5rZXkgZm9vICYmCisJY2hlY2sgc2VjdGlvbjIua2V5IGJhcgorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDE0MDAtdXBkYXRlLXJlZi5zaCBiL3QvdDE0MDAtdXBkYXRlLXJlZi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43OGNkNDEyCi0tLSAvZGV2L251bGwKKysrIGIvdC90MTQwMC11cGRhdGUtcmVmLnNoCkBAIC0wLDAgKzEsMjM5IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IFNoYXduIFBlYXJjZQorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IGdpdCB1cGRhdGUtcmVmIGFuZCBiYXNpYyByZWYgbG9nZ2luZycKKy4gLi90ZXN0LWxpYi5zaAorCitaPTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwlmb3IgbmFtZSBpbiBBIEIgQyBEIEUgRgorCWRvCisJCXRlc3RfdGljayAmJgorCQlUPSQoZ2l0IHdyaXRlLXRyZWUpICYmCisJCXNoYTE9JChlY2hvICRuYW1lIHwgZ2l0IGNvbW1pdC10cmVlICRUKSAmJgorCQlldmFsICRuYW1lPSRzaGExCisJZG9uZQorCisnCisKK209cmVmcy9oZWFkcy9tYXN0ZXIKK25fZGlyPXJlZnMvaGVhZHMvZ3UKK249JG5fZGlyL2ZpeGVzCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJjcmVhdGUgJG0iIFwKKwkiZ2l0IHVwZGF0ZS1yZWYgJG0gJEEgJiYKKwkgdGVzdCAkQSInID0gJChjYXQgLmdpdC8nIiRtIicpJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJImNyZWF0ZSAkbSIgXAorCSJnaXQgdXBkYXRlLXJlZiAkbSAkQiAkQSAmJgorCSB0ZXN0ICRCIicgPSAkKGNhdCAuZ2l0LyciJG0iJyknCitybSAtZiAuZ2l0LyRtCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJmYWlsIHRvIGNyZWF0ZSAkbiIgXAorCSJ0b3VjaCAuZ2l0LyRuX2RpcgorCSBnaXQgdXBkYXRlLXJlZiAkbiAkQSA+b3V0IDI+ZXJyIicKKwkgdGVzdCAkPyAhPSAwJworcm0gLWYgLmdpdC8kbl9kaXIgb3V0IGVycgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkiY3JlYXRlICRtIChieSBIRUFEKSIgXAorCSJnaXQgdXBkYXRlLXJlZiBIRUFEICRBICYmCisJIHRlc3QgJEEiJyA9ICQoY2F0IC5naXQvJyIkbSInKScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJjcmVhdGUgJG0gKGJ5IEhFQUQpIiBcCisJImdpdCB1cGRhdGUtcmVmIEhFQUQgJEIgJEEgJiYKKwkgdGVzdCAkQiInID0gJChjYXQgLmdpdC8nIiRtIicpJworcm0gLWYgLmdpdC8kbQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICcobm90KSBjcmVhdGUgSEVBRCB3aXRoIG9sZCBzaGExJyAiCisJISBnaXQgdXBkYXRlLXJlZiBIRUFEICRBICRCCisiCit0ZXN0X2V4cGVjdF9zdWNjZXNzICIobm90KSBwcmlvciBjcmVhdGVkIC5naXQvJG0iICIKKwkhIHRlc3QgLWYgLmdpdC8kbQorIgorcm0gLWYgLmdpdC8kbQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkiY3JlYXRlIEhFQUQiIFwKKwkiZ2l0IHVwZGF0ZS1yZWYgSEVBRCAkQSIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJyhub3QpIGNoYW5nZSBIRUFEIHdpdGggd3JvbmcgU0hBMScgIgorCSEgZ2l0IHVwZGF0ZS1yZWYgSEVBRCAkQiAkWgorIgordGVzdF9leHBlY3Rfc3VjY2VzcyAiKG5vdCkgY2hhbmdlZCAuZ2l0LyRtIiAiCisJISB0ZXN0ICRCIicgPSAkKGNhdCAuZ2l0LyciJG0iJykKKycKK3JtIC1mIC5naXQvJG0KKworOiBhIHJlcG9zaXRvcnkgd2l0aCB3b3JraW5nIHRyZWUgYWx3YXlzIGhhcyByZWZsb2cgdGhlc2UgZGF5cy4uLgorOiA+LmdpdC9sb2dzL3JlZnMvaGVhZHMvbWFzdGVyCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkiY3JlYXRlICRtIChsb2dnZWQgYnkgdG91Y2gpIiBcCisJJ0dJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzozMCIgXAorCSBnaXQgdXBkYXRlLXJlZiBIRUFEICciJEEiJyAtbSAiSW5pdGlhbCBDcmVhdGlvbiIgJiYKKwkgdGVzdCAnIiRBIicgPSAkKGNhdCAuZ2l0LyciJG0iJyknCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkidXBkYXRlICRtIChsb2dnZWQgYnkgdG91Y2gpIiBcCisJJ0dJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzozMSIgXAorCSBnaXQgdXBkYXRlLXJlZiBIRUFEJyIgJEIgJEEgIictbSAiU3dpdGNoIiAmJgorCSB0ZXN0ICciJEIiJyA9ICQoY2F0IC5naXQvJyIkbSInKScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJzZXQgJG0gKGxvZ2dlZCBieSB0b3VjaCkiIFwKKwknR0lUX0NPTU1JVFRFUl9EQVRFPSIyMDA1LTA1LTI2IDIzOjQxIiBcCisJIGdpdCB1cGRhdGUtcmVmIEhFQUQnIiAkQSAmJgorCSB0ZXN0ICRBIicgPSAkKGNhdCAuZ2l0LyciJG0iJyknCisKK2NhdCA+ZXhwZWN0IDw8RU9GCiskWiAkQSAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gMTExNzE1MDIwMCArMDAwMAlJbml0aWFsIENyZWF0aW9uCiskQSAkQiAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gMTExNzE1MDI2MCArMDAwMAlTd2l0Y2gKKyRCICRBICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUwODYwICswMDAwCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJ2ZXJpZnlpbmcgJG0ncyBsb2ciIFwKKwkiZGlmZiBleHBlY3QgLmdpdC9sb2dzLyRtIgorcm0gLXJmIC5naXQvJG0gLmdpdC9sb2dzIGV4cGVjdAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknZW5hYmxlIGNvcmUubG9nQWxsUmVmVXBkYXRlcycgXAorCSdnaXQgY29uZmlnIGNvcmUubG9nQWxsUmVmVXBkYXRlcyB0cnVlICYmCisJIHRlc3QgdHJ1ZSA9ICQoZ2l0IGNvbmZpZyAtLWJvb2wgLS1nZXQgY29yZS5sb2dBbGxSZWZVcGRhdGVzKScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJImNyZWF0ZSAkbSAobG9nZ2VkIGJ5IGNvbmZpZykiIFwKKwknR0lUX0NPTU1JVFRFUl9EQVRFPSIyMDA1LTA1LTI2IDIzOjMyIiBcCisJIGdpdCB1cGRhdGUtcmVmIEhFQUQnIiAkQSAiJy1tICJJbml0aWFsIENyZWF0aW9uIiAmJgorCSB0ZXN0ICciJEEiJyA9ICQoY2F0IC5naXQvJyIkbSInKScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJ1cGRhdGUgJG0gKGxvZ2dlZCBieSBjb25maWcpIiBcCisJJ0dJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzozMyIgXAorCSBnaXQgdXBkYXRlLXJlZiBIRUFEJyIgJEIgJEEgIictbSAiU3dpdGNoIiAmJgorCSB0ZXN0ICciJEIiJyA9ICQoY2F0IC5naXQvJyIkbSInKScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJzZXQgJG0gKGxvZ2dlZCBieSBjb25maWcpIiBcCisJJ0dJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzo0MyIgXAorCSBnaXQgdXBkYXRlLXJlZiBIRUFEICciJEEgJiYKKwkgdGVzdCAkQSInID0gJChjYXQgLmdpdC8nIiRtIicpJworCitjYXQgPmV4cGVjdCA8PEVPRgorJFogJEEgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+IDExMTcxNTAzMjAgKzAwMDAJSW5pdGlhbCBDcmVhdGlvbgorJEEgJEIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+IDExMTcxNTAzODAgKzAwMDAJU3dpdGNoCiskQiAkQSAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gMTExNzE1MDk4MCArMDAwMAorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkidmVyaWZ5aW5nICRtJ3MgbG9nIiBcCisJJ2RpZmYgZXhwZWN0IC5naXQvbG9ncy8kbScKK3JtIC1mIC5naXQvJG0gLmdpdC9sb2dzLyRtIGV4cGVjdAorCitnaXQgdXBkYXRlLXJlZiAkbSAkRAorY2F0ID4uZ2l0L2xvZ3MvJG0gPDxFT0YKKyRDICRBICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUwMzIwIC0wNTAwCiskQSAkQiAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gMTExNzE1MDM4MCAtMDUwMAorJEYgJFogJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+IDExMTcxNTA2ODAgLTA1MDAKKyRaICRFICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUwOTgwIC0wNTAwCitFT0YKKworZWQ9IlRodSwgMjYgTWF5IDIwMDUgMTg6MzI6MDAgLTA1MDAiCitnZD0iVGh1LCAyNiBNYXkgMjAwNSAxODozMzowMCAtMDUwMCIKK2xkPSJUaHUsIDI2IE1heSAyMDA1IDE4OjQzOjAwIC0wNTAwIgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ1F1ZXJ5ICJtYXN0ZXJAe01heSAyNSAyMDA1fSIgKGJlZm9yZSBoaXN0b3J5KScgXAorCSdybSAtZiBvIGUKKwkgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAibWFzdGVyQHtNYXkgMjUgMjAwNX0iID5vIDI+ZSAmJgorCSB0ZXN0ICciJEMiJyA9ICQoY2F0IG8pICYmCisJIHRlc3QgIndhcm5pbmc6IExvZyBmb3IgJ1wnbWFzdGVyXCcnIG9ubHkgZ29lcyBiYWNrIHRvICRlZC4iID0gIiQoY2F0IGUpIicKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJRdWVyeSBtYXN0ZXJAezIwMDUtMDUtMjV9IChiZWZvcmUgaGlzdG9yeSkiIFwKKwkncm0gLWYgbyBlCisJIGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgbWFzdGVyQHsyMDA1LTA1LTI1fSA+byAyPmUgJiYKKwkgdGVzdCAnIiRDIicgPSAkKGNhdCBvKSAmJgorCSBlY2hvIHRlc3QgIndhcm5pbmc6IExvZyBmb3IgJ1wnbWFzdGVyXCcnIG9ubHkgZ29lcyBiYWNrIHRvICRlZC4iID0gIiQoY2F0IGUpIicKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdRdWVyeSAibWFzdGVyQHtNYXkgMjYgMjAwNSAyMzozMTo1OX0iICgxIHNlY29uZCBiZWZvcmUgaGlzdG9yeSknIFwKKwkncm0gLWYgbyBlCisJIGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgIm1hc3RlckB7TWF5IDI2IDIwMDUgMjM6MzE6NTl9IiA+byAyPmUgJiYKKwkgdGVzdCAnIiRDIicgPSAkKGNhdCBvKSAmJgorCSB0ZXN0ICJ3YXJuaW5nOiBMb2cgZm9yICdcJydtYXN0ZXInXCcnIG9ubHkgZ29lcyBiYWNrIHRvICRlZC4iID0gIiQoY2F0IGUpIicKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdRdWVyeSAibWFzdGVyQHtNYXkgMjYgMjAwNSAyMzozMjowMH0iIChleGFjdGx5IGhpc3Rvcnkgc3RhcnQpJyBcCisJJ3JtIC1mIG8gZQorCSBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5ICJtYXN0ZXJAe01heSAyNiAyMDA1IDIzOjMyOjAwfSIgPm8gMj5lICYmCisJIHRlc3QgJyIkQSInID0gJChjYXQgbykgJiYKKwkgdGVzdCAiIiA9ICIkKGNhdCBlKSInCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknUXVlcnkgIm1hc3RlckB7MjAwNS0wNS0yNiAyMzozMzowMX0iIChtaWRkbGUgb2YgaGlzdG9yeSB3aXRoIGdhcCknIFwKKwkncm0gLWYgbyBlCisJIGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgIm1hc3RlckB7MjAwNS0wNS0yNiAyMzozMzowMX0iID5vIDI+ZSAmJgorCSB0ZXN0ICciJEIiJyA9ICQoY2F0IG8pICYmCisJIHRlc3QgIndhcm5pbmc6IExvZyAuZ2l0L2xvZ3MvJyIkbSBoYXMgZ2FwIGFmdGVyICRnZCInLiIgPSAiJChjYXQgZSkiJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ1F1ZXJ5ICJtYXN0ZXJAezIwMDUtMDUtMjYgMjM6Mzg6MDB9IiAobWlkZGxlIG9mIGhpc3RvcnkpJyBcCisJJ3JtIC1mIG8gZQorCSBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5ICJtYXN0ZXJAezIwMDUtMDUtMjYgMjM6Mzg6MDB9IiA+byAyPmUgJiYKKwkgdGVzdCAnIiRaIicgPSAkKGNhdCBvKSAmJgorCSB0ZXN0ICIiID0gIiQoY2F0IGUpIicKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdRdWVyeSAibWFzdGVyQHsyMDA1LTA1LTI2IDIzOjQzOjAwfSIgKGV4YWN0IGVuZCBvZiBoaXN0b3J5KScgXAorCSdybSAtZiBvIGUKKwkgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAibWFzdGVyQHsyMDA1LTA1LTI2IDIzOjQzOjAwfSIgPm8gMj5lICYmCisJIHRlc3QgJyIkRSInID0gJChjYXQgbykgJiYKKwkgdGVzdCAiIiA9ICIkKGNhdCBlKSInCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknUXVlcnkgIm1hc3RlckB7MjAwNS0wNS0yOH0iIChwYXN0IGVuZCBvZiBoaXN0b3J5KScgXAorCSdybSAtZiBvIGUKKwkgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAibWFzdGVyQHsyMDA1LTA1LTI4fSIgPm8gMj5lICYmCisJIHRlc3QgJyIkRCInID0gJChjYXQgbykgJiYKKwkgdGVzdCAid2FybmluZzogTG9nIC5naXQvbG9ncy8nIiRtIHVuZXhwZWN0ZWRseSBlbmRlZCBvbiAkbGQiJy4iID0gIiQoY2F0IGUpIicKKworCitybSAtZiAuZ2l0LyRtIC5naXQvbG9ncy8kbSBleHBlY3QKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NyZWF0aW5nIGluaXRpYWwgZmlsZXMnIFwKKyAgICAnZWNobyBURVNUID5GICYmCisgICAgIGdpdCBhZGQgRiAmJgorCSBHSVRfQVVUSE9SX0RBVEU9IjIwMDUtMDUtMjYgMjM6MzAiIFwKKwkgR0lUX0NPTU1JVFRFUl9EQVRFPSIyMDA1LTA1LTI2IDIzOjMwIiBnaXQtY29tbWl0IC1tIGFkZCAtYSAmJgorCSBoX1RFU1Q9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpCisJIGVjaG8gVGhlIG90aGVyIGRheSB0aGlzIGRpZCBub3Qgd29yay4gPk0gJiYKKwkgZWNobyBBbmQgdGhlbiBCb2IgdG9sZCBtZSBob3cgdG8gZml4IGl0LiA+Pk0gJiYKKwkgZWNobyBPVEhFUiA+RiAmJgorCSBHSVRfQVVUSE9SX0RBVEU9IjIwMDUtMDUtMjYgMjM6NDEiIFwKKwkgR0lUX0NPTU1JVFRFUl9EQVRFPSIyMDA1LTA1LTI2IDIzOjQxIiBnaXQtY29tbWl0IC1GIE0gLWEgJiYKKwkgaF9PVEhFUj0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkgJiYKKwkgR0lUX0FVVEhPUl9EQVRFPSIyMDA1LTA1LTI2IDIzOjQ0IiBcCisJIEdJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzo0NCIgZ2l0LWNvbW1pdCAtLWFtZW5kICYmCisJIGhfRklYRUQ9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisJIGVjaG8gTWVyZ2VkIGluaXRpYWwgY29tbWl0IGFuZCBhIGxhdGVyIGNvbW1pdC4gPk0gJiYKKwkgZWNobyAkaF9URVNUID4uZ2l0L01FUkdFX0hFQUQgJiYKKwkgR0lUX0FVVEhPUl9EQVRFPSIyMDA1LTA1LTI2IDIzOjQ1IiBcCisJIEdJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzo0NSIgZ2l0LWNvbW1pdCAtRiBNICYmCisJIGhfTUVSR0VEPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSAmJgorCSBybSAtZiBNJworCitjYXQgPmV4cGVjdCA8PEVPRgorJFogJGhfVEVTVCAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gMTExNzE1MDIwMCArMDAwMAljb21taXQgKGluaXRpYWwpOiBhZGQKKyRoX1RFU1QgJGhfT1RIRVIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+IDExMTcxNTA4NjAgKzAwMDAJY29tbWl0OiBUaGUgb3RoZXIgZGF5IHRoaXMgZGlkIG5vdCB3b3JrLgorJGhfT1RIRVIgJGhfRklYRUQgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+IDExMTcxNTEwNDAgKzAwMDAJY29tbWl0IChhbWVuZCk6IFRoZSBvdGhlciBkYXkgdGhpcyBkaWQgbm90IHdvcmsuCiskaF9GSVhFRCAkaF9NRVJHRUQgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+IDExMTcxNTExMDAgKzAwMDAJY29tbWl0IChtZXJnZSk6IE1lcmdlZCBpbml0aWFsIGNvbW1pdCBhbmQgYSBsYXRlciBjb21taXQuCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdnaXQtY29tbWl0IGxvZ2dlZCB1cGRhdGVzJyBcCisJImRpZmYgZXhwZWN0IC5naXQvbG9ncy8kbSIKK3Vuc2V0IGhfVEVTVCBoX09USEVSIGhfRklYRUQgaF9NRVJHRUQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2dpdCBjYXQtZmlsZSBibG9iIG1hc3RlcjpGIChleHBlY3QgT1RIRVIpJyBcCisJJ3Rlc3QgT1RIRVIgPSAkKGdpdCBjYXQtZmlsZSBibG9iIG1hc3RlcjpGKScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdnaXQgY2F0LWZpbGUgYmxvYiBtYXN0ZXJAezIwMDUtMDUtMjYgMjM6MzB9OkYgKGV4cGVjdCBURVNUKScgXAorCSd0ZXN0IFRFU1QgPSAkKGdpdCBjYXQtZmlsZSBibG9iICJtYXN0ZXJAezIwMDUtMDUtMjYgMjM6MzB9OkYiKScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdnaXQgY2F0LWZpbGUgYmxvYiBtYXN0ZXJAezIwMDUtMDUtMjYgMjM6NDJ9OkYgKGV4cGVjdCBPVEhFUiknIFwKKwkndGVzdCBPVEhFUiA9ICQoZ2l0IGNhdC1maWxlIGJsb2IgIm1hc3RlckB7MjAwNS0wNS0yNiAyMzo0Mn06RiIpJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDE0MTAtcmVmbG9nLnNoIGIvdC90MTQxMC1yZWZsb2cuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzNmODMwZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDE0MTAtcmVmbG9nLnNoCkBAIC0wLDAgKzEsMjA1IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgcHJ1bmUgYW5kIHJlZmxvZyBleHBpcmF0aW9uJworLiAuL3Rlc3QtbGliLnNoCisKK2NoZWNrX2hhdmUgKCkgeworCWdhYWg9ICYmCisJZm9yIE4gaW4gIiRAIgorCWRvCisJCWV2YWwgIm89XCQkTiIgJiYgZ2l0IGNhdC1maWxlIC10ICRvIHx8IHsKKwkJCWVjaG8gR2FhaCAkTgorCQkJZ2FhaD0kTgorCQkJYnJlYWsKKwkJfQorCWRvbmUgJiYKKwl0ZXN0IC16ICIkZ2FhaCIKK30KKworY2hlY2tfZnNjayAoKSB7CisJb3V0cHV0PSQoZ2l0IGZzY2sgLS1mdWxsKQorCWNhc2UgIiQxIiBpbgorCScnKQorCQl0ZXN0IC16ICIkb3V0cHV0IiA7OworCSopCisJCWVjaG8gIiRvdXRwdXQiIHwgZ3JlcCAiJDEiIDs7CisJZXNhYworfQorCitjb3JydXB0ICgpIHsKKwlhYT0kezElPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz99IHp6PSR7MSM/P30KKwltdiAuZ2l0L29iamVjdHMvJGFhLyR6eiAuZ2l0LyRhYSR6egorfQorCityZWNvdmVyICgpIHsKKwlhYT0kezElPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz99IHp6PSR7MSM/P30KKwlta2RpciAtcCAuZ2l0L29iamVjdHMvJGFhCisJbXYgLmdpdC8kYWEkenogLmdpdC9vYmplY3RzLyRhYS8kenoKK30KKworY2hlY2tfZG9udF9oYXZlICgpIHsKKwlnYWFoPSAmJgorCWZvciBOIGluICIkQCIKKwlkbworCQlldmFsICJvPVwkJE4iCisJCWdpdCBjYXQtZmlsZSAtdCAkbyAmJiB7CisJCQllY2hvIEdhYWggJE4KKwkJCWdhYWg9JE4KKwkJCWJyZWFrCisJCX0KKwlkb25lCisJdGVzdCAteiAiJGdhYWgiCit9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCW1rZGlyIC1wIEEvQiAmJgorCWVjaG8gcmF0ID5DICYmCisJZWNobyBveCA+QS9EICYmCisJZWNobyB0aWdlciA+QS9CL0UgJiYKKwlnaXQgYWRkIC4gJiYKKworCXRlc3RfdGljayAmJiBnaXQgY29tbWl0IC1tIHJhYmJpdCAmJgorCUg9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRGAgJiYKKwlBPWBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQ6QWAgJiYKKwlCPWBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQ6QS9CYCAmJgorCUM9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRDpDYCAmJgorCUQ9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRDpBL0RgICYmCisJRT1gZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEOkEvQi9FYCAmJgorCWNoZWNrX2ZzY2sgJiYKKworCWNobW9kICt4IEMgJiYKKwkoIHRlc3QgImBnaXQgY29uZmlnIC0tYm9vbCBjb3JlLmZpbGVtb2RlYCIgIT0gZmFsc2UgfHwKKwkgIGVjaG8gZXhlY3V0YWJsZSA+PkMgKSAmJgorCWdpdCBhZGQgQyAmJgorCXRlc3RfdGljayAmJiBnaXQgY29tbWl0IC1tIGRyYWdvbiAmJgorCUw9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRGAgJiYKKwljaGVja19mc2NrICYmCisKKwlybSAtZiBDIEEvQi9FICYmCisJZWNobyBzbmFrZSA+RiAmJgorCWVjaG8gaG9yc2UgPkEvRyAmJgorCWdpdCBhZGQgRiBBL0cgJiYKKwl0ZXN0X3RpY2sgJiYgZ2l0IGNvbW1pdCAtYSAtbSBzaGVlcCAmJgorCUY9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRDpGYCAmJgorCUc9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRDpBL0dgICYmCisJST1gZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEOkFgICYmCisJSj1gZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEYCAmJgorCWNoZWNrX2ZzY2sgJiYKKworCXJtIC1mIEEvRyAmJgorCXRlc3RfdGljayAmJiBnaXQgY29tbWl0IC1hIC1tIG1vbmtleSAmJgorCUs9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRGAgJiYKKwljaGVja19mc2NrICYmCisKKwljaGVja19oYXZlIEEgQiBDIEQgRSBGIEcgSCBJIEogSyBMICYmCisKKwlnaXQgcHJ1bmUgJiYKKworCWNoZWNrX2hhdmUgQSBCIEMgRCBFIEYgRyBIIEkgSiBLIEwgJiYKKworCWNoZWNrX2ZzY2sgJiYKKworCWxvZ2xlbj0kKHdjIC1sIDwuZ2l0L2xvZ3MvcmVmcy9oZWFkcy9tYXN0ZXIpICYmCisJdGVzdCAkbG9nbGVuID0gNAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHJld2luZCAnCisJdGVzdF90aWNrICYmIGdpdCByZXNldCAtLWhhcmQgSEVBRH4yICYmCisJdGVzdCAtZiBDICYmCisJdGVzdCAtZiBBL0IvRSAmJgorCSEgdGVzdCAtZiBGICYmCisJISB0ZXN0IC1mIEEvRyAmJgorCisJY2hlY2tfaGF2ZSBBIEIgQyBEIEUgRiBHIEggSSBKIEsgTCAmJgorCisJZ2l0IHBydW5lICYmCisKKwljaGVja19oYXZlIEEgQiBDIEQgRSBGIEcgSCBJIEogSyBMICYmCisKKwlsb2dsZW49JCh3YyAtbCA8LmdpdC9sb2dzL3JlZnMvaGVhZHMvbWFzdGVyKSAmJgorCXRlc3QgJGxvZ2xlbiA9IDUKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY29ycnVwdCBhbmQgY2hlY2snICcKKworCWNvcnJ1cHQgJEYgJiYKKwljaGVja19mc2NrICJtaXNzaW5nIGJsb2IgJEYiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVmbG9nIGV4cGlyZSAtLWRyeS1ydW4gc2hvdWxkIG5vdCB0b3VjaCByZWZsb2cnICcKKworCWdpdCByZWZsb2cgZXhwaXJlIC0tZHJ5LXJ1biBcCisJCS0tZXhwaXJlPSQoKCR0ZXN0X3RpY2sgLSAxMDAwMCkpIFwKKwkJLS1leHBpcmUtdW5yZWFjaGFibGU9JCgoJHRlc3RfdGljayAtIDEwMDAwKSkgXAorCQktLXN0YWxlLWZpeCBcCisJCS0tYWxsICYmCisKKwlsb2dsZW49JCh3YyAtbCA8LmdpdC9sb2dzL3JlZnMvaGVhZHMvbWFzdGVyKSAmJgorCXRlc3QgJGxvZ2xlbiA9IDUgJiYKKworCWNoZWNrX2ZzY2sgIm1pc3NpbmcgYmxvYiAkRiIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVmbG9nIGV4cGlyZScgJworCisJZ2l0IHJlZmxvZyBleHBpcmUgLS12ZXJib3NlIFwKKwkJLS1leHBpcmU9JCgoJHRlc3RfdGljayAtIDEwMDAwKSkgXAorCQktLWV4cGlyZS11bnJlYWNoYWJsZT0kKCgkdGVzdF90aWNrIC0gMTAwMDApKSBcCisJCS0tc3RhbGUtZml4IFwKKwkJLS1hbGwgJiYKKworCWxvZ2xlbj0kKHdjIC1sIDwuZ2l0L2xvZ3MvcmVmcy9oZWFkcy9tYXN0ZXIpICYmCisJdGVzdCAkbG9nbGVuID0gMiAmJgorCisJY2hlY2tfZnNjayAiZGFuZ2xpbmcgY29tbWl0ICRLIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwcnVuZSBhbmQgZnNjaycgJworCisJZ2l0IHBydW5lICYmCisJY2hlY2tfZnNjayAmJgorCisJY2hlY2tfaGF2ZSBBIEIgQyBEIEUgSCBMICYmCisJY2hlY2tfZG9udF9oYXZlIEYgRyBJIEogSworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlY292ZXIgYW5kIGNoZWNrJyAnCisKKwlyZWNvdmVyICRGICYmCisJY2hlY2tfZnNjayAiZGFuZ2xpbmcgYmxvYiAkRiIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdkZWxldGUnICcKKwllY2hvIDEgPiBDICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSByYXQgQyAmJgorCisJZWNobyAyID4gQyAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gb3ggQyAmJgorCisJZWNobyAzID4gQyAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gdGlnZXIgQyAmJgorCisJdGVzdCA1ID0gJChnaXQgcmVmbG9nIHwgd2MgLWwpICYmCisKKwlnaXQgcmVmbG9nIGRlbGV0ZSBtYXN0ZXJAezF9ICYmCisJZ2l0IHJlZmxvZyBzaG93IG1hc3RlciA+IG91dHB1dCAmJgorCXRlc3QgNCA9ICQod2MgLWwgPCBvdXRwdXQpICYmCisJISBncmVwIG94IDwgb3V0cHV0ICYmCisKKwlnaXQgcmVmbG9nIGRlbGV0ZSBtYXN0ZXJAezA3LjA0LjIwMDUuMTU6MTU6MDAuLTA3MDB9ICYmCisJZ2l0IHJlZmxvZyBzaG93IG1hc3RlciA+IG91dHB1dCAmJgorCXRlc3QgMyA9ICQod2MgLWwgPCBvdXRwdXQpICYmCisJISBncmVwIGRyYWdvbiA8IG91dHB1dAorCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MTQyMC1sb3N0LWZvdW5kLnNoIGIvdC90MTQyMC1sb3N0LWZvdW5kLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRjOWU0MDIKLS0tIC9kZXYvbnVsbAorKysgYi90L3QxNDIwLWxvc3QtZm91bmQuc2gKQEAgLTAsMCArMSwzNSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBKb2hhbm5lcyBFLiBTY2hpbmRlbGluCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgZnNjayAtLWxvc3QtZm91bmQnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJZ2l0IGNvbmZpZyBjb3JlLmxvZ0FsbFJlZlVwZGF0ZXMgMCAmJgorCTogPiBmaWxlMSAmJgorCWdpdCBhZGQgZmlsZTEgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIGluaXRpYWwgJiYKKwllY2hvIDEgPiBmaWxlMSAmJgorCWVjaG8gMiA+IGZpbGUyICYmCisJZ2l0IGFkZCBmaWxlMSBmaWxlMiAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gc2Vjb25kICYmCisJZWNobyAzID4gZmlsZTMgJiYKKwlnaXQgYWRkIGZpbGUzCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2xvc3QgYW5kIGZvdW5kIHNvbWV0aGluZycgJworCWdpdCByZXYtcGFyc2UgSEVBRCA+IGxvc3QtY29tbWl0ICYmCisJZ2l0IHJldi1wYXJzZSA6ZmlsZTMgPiBsb3N0LW90aGVyICYmCisJdGVzdF90aWNrICYmCisJZ2l0IHJlc2V0IC0taGFyZCBIRUFEXiAmJgorCWdpdCBmc2NrIC0tbG9zdC1mb3VuZCAmJgorCXRlc3QgMiA9ICQobHMgLmdpdC9sb3N0LWZvdW5kLyovKiB8IHdjIC1sKSAmJgorCXRlc3QgLWYgLmdpdC9sb3N0LWZvdW5kL2NvbW1pdC8kKGNhdCBsb3N0LWNvbW1pdCkgJiYKKwl0ZXN0IC1mIC5naXQvbG9zdC1mb3VuZC9vdGhlci8kKGNhdCBsb3N0LW90aGVyKQorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDE1MDAtcmV2LXBhcnNlLnNoIGIvdC90MTUwMC1yZXYtcGFyc2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzhhMmJmMAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDE1MDAtcmV2LXBhcnNlLnNoCkBAIC0wLDAgKzEsNzkgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSd0ZXN0IGdpdCByZXYtcGFyc2UnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9yZXZfcGFyc2UoKSB7CisJbmFtZT0kMQorCXNoaWZ0CisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICIkbmFtZTogaXMtYmFyZS1yZXBvc2l0b3J5IiBcCisJInRlc3QgJyQxJyA9IFwiXCQoZ2l0IHJldi1wYXJzZSAtLWlzLWJhcmUtcmVwb3NpdG9yeSlcIiIKKwlzaGlmdAorCVsgJCMgLWVxIDAgXSAmJiByZXR1cm4KKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgIiRuYW1lOiBpcy1pbnNpZGUtZ2l0LWRpciIgXAorCSJ0ZXN0ICckMScgPSBcIlwkKGdpdCByZXYtcGFyc2UgLS1pcy1pbnNpZGUtZ2l0LWRpcilcIiIKKwlzaGlmdAorCVsgJCMgLWVxIDAgXSAmJiByZXR1cm4KKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgIiRuYW1lOiBpcy1pbnNpZGUtd29yay10cmVlIiBcCisJInRlc3QgJyQxJyA9IFwiXCQoZ2l0IHJldi1wYXJzZSAtLWlzLWluc2lkZS13b3JrLXRyZWUpXCIiCisJc2hpZnQKKwlbICQjIC1lcSAwIF0gJiYgcmV0dXJuCisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICIkbmFtZTogcHJlZml4IiBcCisJInRlc3QgJyQxJyA9IFwiXCQoZ2l0IHJldi1wYXJzZSAtLXNob3ctcHJlZml4KVwiIgorCXNoaWZ0CisJWyAkIyAtZXEgMCBdICYmIHJldHVybgorfQorCisjIGxhYmVsIGlzLWJhcmUgaXMtaW5zaWRlLWdpdCBpcy1pbnNpZGUtd29yayBwcmVmaXgKKwordGVzdF9yZXZfcGFyc2UgdG9wbGV2ZWwgZmFsc2UgZmFsc2UgdHJ1ZSAnJworCitjZCAuZ2l0IHx8IGV4aXQgMQordGVzdF9yZXZfcGFyc2UgLmdpdC8gZmFsc2UgdHJ1ZSBmYWxzZSAnJworY2Qgb2JqZWN0cyB8fCBleGl0IDEKK3Rlc3RfcmV2X3BhcnNlIC5naXQvb2JqZWN0cy8gZmFsc2UgdHJ1ZSBmYWxzZSAnJworY2QgLi4vLi4gfHwgZXhpdCAxCisKK21rZGlyIC1wIHN1Yi9kaXIgfHwgZXhpdCAxCitjZCBzdWIvZGlyIHx8IGV4aXQgMQordGVzdF9yZXZfcGFyc2Ugc3ViZGlyZWN0b3J5IGZhbHNlIGZhbHNlIHRydWUgc3ViL2Rpci8KK2NkIC4uLy4uIHx8IGV4aXQgMQorCitnaXQgY29uZmlnIGNvcmUuYmFyZSB0cnVlCit0ZXN0X3Jldl9wYXJzZSAnY29yZS5iYXJlID0gdHJ1ZScgdHJ1ZSBmYWxzZSBmYWxzZQorCitnaXQgY29uZmlnIC0tdW5zZXQgY29yZS5iYXJlCit0ZXN0X3Jldl9wYXJzZSAnY29yZS5iYXJlIHVuZGVmaW5lZCcgZmFsc2UgZmFsc2UgdHJ1ZQorCitta2RpciB3b3JrIHx8IGV4aXQgMQorY2Qgd29yayB8fCBleGl0IDEKK2V4cG9ydCBHSVRfRElSPS4uLy5naXQKK2V4cG9ydCBHSVRfQ09ORklHPSIkKHB3ZCkiLy4uLy5naXQvY29uZmlnCisKK2dpdCBjb25maWcgY29yZS5iYXJlIGZhbHNlCit0ZXN0X3Jldl9wYXJzZSAnR0lUX0RJUj0uLi8uZ2l0LCBjb3JlLmJhcmUgPSBmYWxzZScgZmFsc2UgZmFsc2UgdHJ1ZSAnJworCitnaXQgY29uZmlnIGNvcmUuYmFyZSB0cnVlCit0ZXN0X3Jldl9wYXJzZSAnR0lUX0RJUj0uLi8uZ2l0LCBjb3JlLmJhcmUgPSB0cnVlJyB0cnVlIGZhbHNlIGZhbHNlICcnCisKK2dpdCBjb25maWcgLS11bnNldCBjb3JlLmJhcmUKK3Rlc3RfcmV2X3BhcnNlICdHSVRfRElSPS4uLy5naXQsIGNvcmUuYmFyZSB1bmRlZmluZWQnIGZhbHNlIGZhbHNlIHRydWUgJycKKworbXYgLi4vLmdpdCAuLi9yZXBvLmdpdCB8fCBleGl0IDEKK2V4cG9ydCBHSVRfRElSPS4uL3JlcG8uZ2l0CitleHBvcnQgR0lUX0NPTkZJRz0iJChwd2QpIi8uLi9yZXBvLmdpdC9jb25maWcKKworZ2l0IGNvbmZpZyBjb3JlLmJhcmUgZmFsc2UKK3Rlc3RfcmV2X3BhcnNlICdHSVRfRElSPS4uL3JlcG8uZ2l0LCBjb3JlLmJhcmUgPSBmYWxzZScgZmFsc2UgZmFsc2UgdHJ1ZSAnJworCitnaXQgY29uZmlnIGNvcmUuYmFyZSB0cnVlCit0ZXN0X3Jldl9wYXJzZSAnR0lUX0RJUj0uLi9yZXBvLmdpdCwgY29yZS5iYXJlID0gdHJ1ZScgdHJ1ZSBmYWxzZSBmYWxzZSAnJworCitnaXQgY29uZmlnIC0tdW5zZXQgY29yZS5iYXJlCit0ZXN0X3Jldl9wYXJzZSAnR0lUX0RJUj0uLi9yZXBvLmdpdCwgY29yZS5iYXJlIHVuZGVmaW5lZCcgZmFsc2UgZmFsc2UgdHJ1ZSAnJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDE1MDEtd29ya3RyZWUuc2ggYi90L3QxNTAxLXdvcmt0cmVlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdlZTM4MjAKLS0tIC9kZXYvbnVsbAorKysgYi90L3QxNTAxLXdvcmt0cmVlLnNoCkBAIC0wLDAgKzEsMTE1IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0ndGVzdCBzZXBhcmF0ZSB3b3JrIHRyZWUnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9yZXZfcGFyc2UoKSB7CisJbmFtZT0kMQorCXNoaWZ0CisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICIkbmFtZTogaXMtYmFyZS1yZXBvc2l0b3J5IiBcCisJInRlc3QgJyQxJyA9IFwiXCQoZ2l0IHJldi1wYXJzZSAtLWlzLWJhcmUtcmVwb3NpdG9yeSlcIiIKKwlzaGlmdAorCVsgJCMgLWVxIDAgXSAmJiByZXR1cm4KKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgIiRuYW1lOiBpcy1pbnNpZGUtZ2l0LWRpciIgXAorCSJ0ZXN0ICckMScgPSBcIlwkKGdpdCByZXYtcGFyc2UgLS1pcy1pbnNpZGUtZ2l0LWRpcilcIiIKKwlzaGlmdAorCVsgJCMgLWVxIDAgXSAmJiByZXR1cm4KKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgIiRuYW1lOiBpcy1pbnNpZGUtd29yay10cmVlIiBcCisJInRlc3QgJyQxJyA9IFwiXCQoZ2l0IHJldi1wYXJzZSAtLWlzLWluc2lkZS13b3JrLXRyZWUpXCIiCisJc2hpZnQKKwlbICQjIC1lcSAwIF0gJiYgcmV0dXJuCisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICIkbmFtZTogcHJlZml4IiBcCisJInRlc3QgJyQxJyA9IFwiXCQoZ2l0IHJldi1wYXJzZSAtLXNob3ctcHJlZml4KVwiIgorCXNoaWZ0CisJWyAkIyAtZXEgMCBdICYmIHJldHVybgorfQorCitta2RpciAtcCB3b3JrL3N1Yi9kaXIgfHwgZXhpdCAxCittdiAuZ2l0IHJlcG8uZ2l0IHx8IGV4aXQgMQorCitzYXkgImNvcmUud29ya3RyZWUgPSByZWxhdGl2ZSBwYXRoIgorZXhwb3J0IEdJVF9ESVI9cmVwby5naXQKK2V4cG9ydCBHSVRfQ09ORklHPSIkKHB3ZCkiLyRHSVRfRElSL2NvbmZpZwordW5zZXQgR0lUX1dPUktfVFJFRQorZ2l0IGNvbmZpZyBjb3JlLndvcmt0cmVlIC4uL3dvcmsKK3Rlc3RfcmV2X3BhcnNlICdvdXRzaWRlJyAgICAgIGZhbHNlIGZhbHNlIGZhbHNlCitjZCB3b3JrIHx8IGV4aXQgMQorZXhwb3J0IEdJVF9ESVI9Li4vcmVwby5naXQKK2V4cG9ydCBHSVRfQ09ORklHPSIkKHB3ZCkiLyRHSVRfRElSL2NvbmZpZwordGVzdF9yZXZfcGFyc2UgJ2luc2lkZScgICAgICAgZmFsc2UgZmFsc2UgdHJ1ZSAnJworY2Qgc3ViL2RpciB8fCBleGl0IDEKK2V4cG9ydCBHSVRfRElSPS4uLy4uLy4uL3JlcG8uZ2l0CitleHBvcnQgR0lUX0NPTkZJRz0iJChwd2QpIi8kR0lUX0RJUi9jb25maWcKK3Rlc3RfcmV2X3BhcnNlICdzdWJkaXJlY3RvcnknIGZhbHNlIGZhbHNlIHRydWUgc3ViL2Rpci8KK2NkIC4uLy4uLy4uIHx8IGV4aXQgMQorCitzYXkgImNvcmUud29ya3RyZWUgPSBhYnNvbHV0ZSBwYXRoIgorZXhwb3J0IEdJVF9ESVI9JChwd2QpL3JlcG8uZ2l0CitleHBvcnQgR0lUX0NPTkZJRz0kR0lUX0RJUi9jb25maWcKK2dpdCBjb25maWcgY29yZS53b3JrdHJlZSAiJChwd2QpL3dvcmsiCit0ZXN0X3Jldl9wYXJzZSAnb3V0c2lkZScgICAgICBmYWxzZSBmYWxzZSBmYWxzZQorY2Qgd29yayB8fCBleGl0IDEKK3Rlc3RfcmV2X3BhcnNlICdpbnNpZGUnICAgICAgIGZhbHNlIGZhbHNlIHRydWUgJycKK2NkIHN1Yi9kaXIgfHwgZXhpdCAxCit0ZXN0X3Jldl9wYXJzZSAnc3ViZGlyZWN0b3J5JyBmYWxzZSBmYWxzZSB0cnVlIHN1Yi9kaXIvCitjZCAuLi8uLi8uLiB8fCBleGl0IDEKKworc2F5ICJHSVRfV09SS19UUkVFPXJlbGF0aXZlIHBhdGggKG92ZXJyaWRlIGNvcmUud29ya3RyZWUpIgorZXhwb3J0IEdJVF9ESVI9JChwd2QpL3JlcG8uZ2l0CitleHBvcnQgR0lUX0NPTkZJRz0kR0lUX0RJUi9jb25maWcKK2dpdCBjb25maWcgY29yZS53b3JrdHJlZSBub24tZXhpc3RlbnQKK2V4cG9ydCBHSVRfV09SS19UUkVFPXdvcmsKK3Rlc3RfcmV2X3BhcnNlICdvdXRzaWRlJyAgICAgIGZhbHNlIGZhbHNlIGZhbHNlCitjZCB3b3JrIHx8IGV4aXQgMQorZXhwb3J0IEdJVF9XT1JLX1RSRUU9LgordGVzdF9yZXZfcGFyc2UgJ2luc2lkZScgICAgICAgZmFsc2UgZmFsc2UgdHJ1ZSAnJworY2Qgc3ViL2RpciB8fCBleGl0IDEKK2V4cG9ydCBHSVRfV09SS19UUkVFPS4uLy4uCit0ZXN0X3Jldl9wYXJzZSAnc3ViZGlyZWN0b3J5JyBmYWxzZSBmYWxzZSB0cnVlIHN1Yi9kaXIvCitjZCAuLi8uLi8uLiB8fCBleGl0IDEKKworbXYgd29yayByZXBvLmdpdC93b3JrCisKK3NheSAiR0lUX1dPUktfVFJFRT1hYnNvbHV0ZSBwYXRoLCB3b3JrIHRyZWUgYmVsb3cgZ2l0IGRpciIKK2V4cG9ydCBHSVRfRElSPSQocHdkKS9yZXBvLmdpdAorZXhwb3J0IEdJVF9DT05GSUc9JEdJVF9ESVIvY29uZmlnCitleHBvcnQgR0lUX1dPUktfVFJFRT0kKHB3ZCkvcmVwby5naXQvd29yawordGVzdF9yZXZfcGFyc2UgJ291dHNpZGUnICAgICAgICAgICAgICBmYWxzZSBmYWxzZSBmYWxzZQorY2QgcmVwby5naXQgfHwgZXhpdCAxCit0ZXN0X3Jldl9wYXJzZSAnaW4gcmVwby5naXQnICAgICAgICAgICAgICBmYWxzZSB0cnVlICBmYWxzZQorY2Qgb2JqZWN0cyB8fCBleGl0IDEKK3Rlc3RfcmV2X3BhcnNlICdpbiByZXBvLmdpdC9vYmplY3RzJyAgICAgIGZhbHNlIHRydWUgIGZhbHNlCitjZCAuLi93b3JrIHx8IGV4aXQgMQordGVzdF9yZXZfcGFyc2UgJ2luIHJlcG8uZ2l0L3dvcmsnICAgICAgICAgZmFsc2UgdHJ1ZSB0cnVlICcnCitjZCBzdWIvZGlyIHx8IGV4aXQgMQordGVzdF9yZXZfcGFyc2UgJ2luIHJlcG8uZ2l0L3N1Yi9kaXInIGZhbHNlIHRydWUgdHJ1ZSBzdWIvZGlyLworY2QgLi4vLi4vLi4vLi4gfHwgZXhpdCAxCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlcG8gZmluZHMgaXRzIHdvcmsgdHJlZScgJworCShjZCByZXBvLmdpdCAmJgorCSA6ID4gd29yay9zdWIvZGlyL3VudHJhY2tlZCAmJgorCSB0ZXN0IHN1Yi9kaXIvdW50cmFja2VkID0gIiQoZ2l0IGxzLWZpbGVzIC0tb3RoZXJzKSIpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlcG8gZmluZHMgaXRzIHdvcmsgdHJlZSBmcm9tIHdvcmsgdHJlZSwgdG9vJyAnCisJKGNkIHJlcG8uZ2l0L3dvcmsvc3ViL2RpciAmJgorCSA6ID4gdHJhY2tlZCAmJgorCSBnaXQgLS1naXQtZGlyPS4uLy4uLy4uIGFkZCB0cmFja2VkICYmCisJIGNkIC4uLy4uLy4uICYmCisJIHRlc3Qgc3ViL2Rpci90cmFja2VkID0gIiQoZ2l0IGxzLWZpbGVzKSIpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ19nZW50bHkoKSBncm9rcyByZWxhdGl2ZSBHSVRfRElSICYgR0lUX1dPUktfVFJFRScgJworCWNkIHJlcG8uZ2l0L3dvcmsvc3ViL2RpciAmJgorCUdJVF9ESVI9Li4vLi4vLi4gR0lUX1dPUktfVFJFRT0uLi8uLiBHSVRfUEFHRVI9IFwKKwkJZ2l0IGRpZmYgLS1leGl0LWNvZGUgdHJhY2tlZCAmJgorCWVjaG8gY2hhbmdlZCA+IHRyYWNrZWQgJiYKKwkhIEdJVF9ESVI9Li4vLi4vLi4gR0lUX1dPUktfVFJFRT0uLi8uLiBHSVRfUEFHRVI9IFwKKwkJZ2l0IGRpZmYgLS1leGl0LWNvZGUgdHJhY2tlZAorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDE1MDItcmV2LXBhcnNlLXBhcnNlb3B0LnNoIGIvdC90MTUwMi1yZXYtcGFyc2UtcGFyc2VvcHQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzYyYWY1ZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDE1MDItcmV2LXBhcnNlLXBhcnNlb3B0LnNoCkBAIC0wLDAgKzEsNDMgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSd0ZXN0IGdpdCByZXYtcGFyc2UgLS1wYXJzZW9wdCcKKy4gLi90ZXN0LWxpYi5zaAorCitjYXQgPiBleHBlY3QuZXJyIDw8RU9GCit1c2FnZTogc29tZS1jb21tYW5kIFtvcHRpb25zXSA8YXJncz4uLi4KKyAgICAKKyAgICBzb21lLWNvbW1hbmQgZG9lcyBmb28gYW5kIGJhciEKKworICAgIC1oLCAtLWhlbHAgICAgICAgICAgICBzaG93IHRoZSBoZWxwCisgICAgLS1mb28gICAgICAgICAgICAgICAgIHNvbWUgbmlmdHkgb3B0aW9uIC0tZm9vCisgICAgLS1iYXIgLi4uICAgICAgICAgICAgIHNvbWUgY29vbCBvcHRpb24gLS1iYXIgd2l0aCBhbiBhcmd1bWVudAorCitBbiBvcHRpb24gZ3JvdXAgSGVhZGVyCisgICAgLUMgWy4uLl0gICAgICAgICAgICAgIG9wdGlvbiBDIHdpdGggYW4gb3B0aW9uYWwgYXJndW1lbnQKKworRXh0cmFzCisgICAgLS1leHRyYTEgICAgICAgICAgICAgIGxpbmUgYWJvdmUgdXNlZCB0byBjYXVzZSBhIHNlZ2ZhdWx0IGJ1dCBubyBsb25nZXIgZG9lcworCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGVzdCAtLXBhcnNlb3B0IGhlbHAgb3V0cHV0JyAnCisJZ2l0IHJldi1wYXJzZSAtLXBhcnNlb3B0IC0tIC1oIDI+IG91dHB1dC5lcnIgPDxFT0YKK3NvbWUtY29tbWFuZCBbb3B0aW9uc10gPGFyZ3M+Li4uCisKK3NvbWUtY29tbWFuZCBkb2VzIGZvbyBhbmQgYmFyIQorLS0KK2gsaGVscCAgICBzaG93IHRoZSBoZWxwCisKK2ZvbyAgICAgICBzb21lIG5pZnR5IG9wdGlvbiAtLWZvbworYmFyPSAgICAgIHNvbWUgY29vbCBvcHRpb24gLS1iYXIgd2l0aCBhbiBhcmd1bWVudAorCisgQW4gb3B0aW9uIGdyb3VwIEhlYWRlcgorQz8gICAgICAgIG9wdGlvbiBDIHdpdGggYW4gb3B0aW9uYWwgYXJndW1lbnQKKworRXh0cmFzCitleHRyYTEgICAgbGluZSBhYm92ZSB1c2VkIHRvIGNhdXNlIGEgc2VnZmF1bHQgYnV0IG5vIGxvbmdlciBkb2VzCitFT0YKKwlnaXQgZGlmZiBleHBlY3QuZXJyIG91dHB1dC5lcnIKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QyMDAwLWNoZWNrb3V0LWNhY2hlLWNsYXNoLnNoIGIvdC90MjAwMC1jaGVja291dC1jYWNoZS1jbGFzaC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MTQxZmFiCi0tLSAvZGV2L251bGwKKysrIGIvdC90MjAwMC1jaGVja291dC1jYWNoZS1jbGFzaC5zaApAQCAtMCwwICsxLDUxIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBjaGVja291dC1pbmRleCB0ZXN0LgorCitUaGlzIHRlc3QgcmVnaXN0ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXN5c3RlbSBzdHJ1Y3R1cmUgaW4gdGhlCitjYWNoZToKKworICAgIHBhdGgwICAgICAgIC0gYSBmaWxlCisgICAgcGF0aDEvZmlsZTEgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKworQW5kIHRoZW4gdHJpZXMgdG8gY2hlY2tvdXQgaW4gYSB3b3JrIHRyZWUgdGhhdCBoYXMgdGhlIGZvbGxvd2luZzoKKworICAgIHBhdGgwL2ZpbGUwIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDEgICAgICAgLSBhIGZpbGUKKworVGhlIGdpdCBjaGVja291dC1pbmRleCBjb21tYW5kIHNob3VsZCBmYWlsIHdoZW4gYXR0ZW1wdGluZyB0byBjaGVja291dAorcGF0aDAsIGZpbmRpbmcgaXQgaXMgb2NjdXBpZWQgYnkgYSBkaXJlY3RvcnksIGFuZCBwYXRoMS9maWxlMSwgZmluZGluZworcGF0aDEgaXMgb2NjdXBpZWQgYnkgYSBub24tZGlyZWN0b3J5LiAgV2l0aCAiLWYiIGZsYWcsIGl0IHNob3VsZCByZW1vdmUKK3RoZSBjb25mbGljdGluZyBwYXRocyBhbmQgc3VjY2VlZC4KKycKKy4gLi90ZXN0LWxpYi5zaAorCitkYXRlID5wYXRoMAorbWtkaXIgcGF0aDEKK2RhdGUgPnBhdGgxL2ZpbGUxCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgdXBkYXRlLWluZGV4IC0tYWRkIHZhcmlvdXMgcGF0aHMuJyBcCisgICAgJ2dpdCB1cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAgcGF0aDEvZmlsZTEnCisKK3JtIC1mciBwYXRoMCBwYXRoMQorbWtkaXIgcGF0aDAKK2RhdGUgPnBhdGgwL2ZpbGUwCitkYXRlID5wYXRoMQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0IGNoZWNrb3V0LWluZGV4IHdpdGhvdXQgLWYgc2hvdWxkIGZhaWwgb24gY29uZmxpY3Rpbmcgd29yayB0cmVlLicgXAorICAgICchIGdpdCBjaGVja291dC1pbmRleCAtYScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBjaGVja291dC1pbmRleCB3aXRoIC1mIHNob3VsZCBzdWNjZWVkLicgXAorICAgICdnaXQgY2hlY2tvdXQtaW5kZXggLWYgLWEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgY2hlY2tvdXQtaW5kZXggY29uZmxpY3RpbmcgcGF0aHMuJyBcCisgICAgJ3Rlc3QgLWYgcGF0aDAgJiYgdGVzdCAtZCBwYXRoMSAmJiB0ZXN0IC1mIHBhdGgxL2ZpbGUxJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDIwMDEtY2hlY2tvdXQtY2FjaGUtY2xhc2guc2ggYi90L3QyMDAxLWNoZWNrb3V0LWNhY2hlLWNsYXNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVmMDA3NTMKLS0tIC9kZXYvbnVsbAorKysgYi90L3QyMDAxLWNoZWNrb3V0LWNhY2hlLWNsYXNoLnNoCkBAIC0wLDAgKzEsODYgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IGNoZWNrb3V0LWluZGV4IHRlc3QuCisKK1RoaXMgdGVzdCByZWdpc3RlcnMgdGhlIGZvbGxvd2luZyBmaWxlc3lzdGVtIHN0cnVjdHVyZSBpbiB0aGUgY2FjaGU6CisKKyAgICBwYXRoMC9maWxlMAktIGEgZmlsZSBpbiBhIGRpcmVjdG9yeQorICAgIHBhdGgxL2ZpbGUxIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisKK2FuZCBhdHRlbXB0cyB0byBjaGVjayBpdCBvdXQgd2hlbiB0aGUgd29yayB0cmVlIGhhczoKKworICAgIHBhdGgwL2ZpbGUwIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDEgICAgICAgLSBhIHN5bWxpbmsgcG9pbnRpbmcgYXQgInBhdGgwIgorCitDaGVja291dCBjYWNoZSBzaG91bGQgZmFpbCB0byBleHRyYWN0IHBhdGgxL2ZpbGUxIGJlY2F1c2UgdGhlIGxlYWRpbmcKK3BhdGggcGF0aDEgaXMgb2NjdXBpZWQgYnkgYSBub24tZGlyZWN0b3J5LiAgV2l0aCAiLWYiIGl0IHNob3VsZCByZW1vdmUKK3RoZSBzeW1saW5rIHBhdGgxIGFuZCBjcmVhdGUgZGlyZWN0b3J5IHBhdGgxIGFuZCBmaWxlIHBhdGgxL2ZpbGUxLgorJworLiAuL3Rlc3QtbGliLnNoCisKK3Nob3dfZmlsZXMoKSB7CisJIyBzaG93IGZpbGVzeXN0ZW0gZmlsZXMsIGp1c3QgWy1kbF0gZm9yIHR5cGUgYW5kIG5hbWUKKwlmaW5kIHBhdGg/IC1scyB8CisJc2VkIC1lICdzL15bMC05XSogKiBbMC05XSogKiBcKFstYmNkbF1cKVteIF0qICpbMC05XSogKlteIF0qICpbXiBdKiAqWzAtOV0qIFtBLVpdW2Etel1bYS16XSBbMC05XVswLTldIFteIF0qIC9mczogXDEgLycKKwkjIHdoYXQncyBpbiB0aGUgY2FjaGUsIGp1c3QgbW9kZSBhbmQgbmFtZQorCWdpdCBscy1maWxlcyAtLXN0YWdlIHwKKwlzZWQgLWUgJ3MvXlwoWzAtOV0qXCkgWzAtOWEtZl0qIFswLTNdIC9jYTogXDEgLycKKwkjIHdoYXQncyBpbiB0aGUgdHJlZSwganVzdCBtb2RlIGFuZCBuYW1lLgorCWdpdCBscy10cmVlIC1yICIkMSIgfAorCXNlZCAtZSAncy9eXChbMC05XSpcKQlbXiBdKglbMC05YS1mXSoJL3RyOiBcMSAvJworfQorCitta2RpciBwYXRoMAorZGF0ZSA+cGF0aDAvZmlsZTAKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgdXBkYXRlLWluZGV4IC0tYWRkIHBhdGgwL2ZpbGUwJyBcCisgICAgJ2dpdCB1cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAvZmlsZTAnCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnd3JpdGluZyB0cmVlIG91dCB3aXRoIGdpdCB3cml0ZS10cmVlJyBcCisgICAgJ3RyZWUxPSQoZ2l0IHdyaXRlLXRyZWUpJwordGVzdF9kZWJ1ZyAnc2hvd19maWxlcyAkdHJlZTEnCisKK21rZGlyIHBhdGgxCitkYXRlID5wYXRoMS9maWxlMQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCB1cGRhdGUtaW5kZXggLS1hZGQgcGF0aDEvZmlsZTEnIFwKKyAgICAnZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMS9maWxlMScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd3cml0aW5nIHRyZWUgb3V0IHdpdGggZ2l0IHdyaXRlLXRyZWUnIFwKKyAgICAndHJlZTI9JChnaXQgd3JpdGUtdHJlZSknCit0ZXN0X2RlYnVnICdzaG93X2ZpbGVzICR0cmVlMicKKworcm0gLWZyIHBhdGgxCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncmVhZCBwcmV2aW91c2x5IHdyaXR0ZW4gdHJlZSBhbmQgY2hlY2tvdXQuJyBcCisgICAgJ2dpdCByZWFkLXRyZWUgLW0gJHRyZWUxICYmIGdpdCBjaGVja291dC1pbmRleCAtZiAtYScKK3Rlc3RfZGVidWcgJ3Nob3dfZmlsZXMgJHRyZWUxJworCitsbiAtcyBwYXRoMCBwYXRoMQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCB1cGRhdGUtaW5kZXggLS1hZGQgYSBzeW1saW5rLicgXAorICAgICdnaXQgdXBkYXRlLWluZGV4IC0tYWRkIHBhdGgxJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3dyaXRpbmcgdHJlZSBvdXQgd2l0aCBnaXQgd3JpdGUtdHJlZScgXAorICAgICd0cmVlMz0kKGdpdCB3cml0ZS10cmVlKScKK3Rlc3RfZGVidWcgJ3Nob3dfZmlsZXMgJHRyZWUzJworCisjIE1vcnRlbiBzYXlzICJHb3QgdGhhdD8iIGhlcmUuCisjIFRlc3QgYmVnaW5zLgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncmVhZCBwcmV2aW91c2x5IHdyaXR0ZW4gdHJlZSBhbmQgY2hlY2tvdXQuJyBcCisgICAgJ2dpdCByZWFkLXRyZWUgJHRyZWUyICYmIGdpdCBjaGVja291dC1pbmRleCAtZiAtYScKK3Rlc3RfZGVidWcgJ3Nob3dfZmlsZXMgJHRyZWUyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hlY2tpbmcgb3V0IGNvbmZsaWN0aW5nIHBhdGggd2l0aCAtZicgXAorICAgICd0ZXN0ICEgLWggcGF0aDAgJiYgdGVzdCAtZCBwYXRoMCAmJgorICAgICB0ZXN0ICEgLWggcGF0aDEgJiYgdGVzdCAtZCBwYXRoMSAmJgorICAgICB0ZXN0ICEgLWggcGF0aDAvZmlsZTAgJiYgdGVzdCAtZiBwYXRoMC9maWxlMCAmJgorICAgICB0ZXN0ICEgLWggcGF0aDEvZmlsZTEgJiYgdGVzdCAtZiBwYXRoMS9maWxlMScKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QyMDAyLWNoZWNrb3V0LWNhY2hlLXUuc2ggYi90L3QyMDAyLWNoZWNrb3V0LWNhY2hlLXUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGY0NDFiYwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDIwMDItY2hlY2tvdXQtY2FjaGUtdS5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBjaGVja291dC1pbmRleCAtdSB0ZXN0LgorCitXaXRoIC11IGZsYWcsIGdpdCBjaGVja291dC1pbmRleCBpbnRlcm5hbGx5IHJ1bnMgdGhlIGVxdWl2YWxlbnQgb2YKK2dpdCB1cGRhdGUtaW5kZXggLS1yZWZyZXNoIG9uIHRoZSBjaGVja2VkIG91dCBlbnRyeS4nCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKydwcmVwYXJhdGlvbicgJworZWNobyBmcm90eiA+cGF0aDAgJiYKK2dpdCB1cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAgJiYKK3Q9JChnaXQgd3JpdGUtdHJlZSknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ3dpdGhvdXQgLXUsIGdpdCBjaGVja291dC1pbmRleCBzbXVkZ2VzIHN0YXQgaW5mb3JtYXRpb24uJyAnCitybSAtZiBwYXRoMCAmJgorZ2l0IHJlYWQtdHJlZSAkdCAmJgorZ2l0IGNoZWNrb3V0LWluZGV4IC1mIC1hICYmCishIGdpdCBkaWZmLWZpbGVzIHwgZGlmZiAtIC9kZXYvbnVsbCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnd2l0aCAtdSwgZ2l0IGNoZWNrb3V0LWluZGV4IHBpY2tzIHVwIHN0YXQgaW5mb3JtYXRpb24gZnJvbSBuZXcgZmlsZXMuJyAnCitybSAtZiBwYXRoMCAmJgorZ2l0IHJlYWQtdHJlZSAkdCAmJgorZ2l0IGNoZWNrb3V0LWluZGV4IC11IC1mIC1hICYmCitnaXQgZGlmZi1maWxlcyB8IGRpZmYgLSAvZGV2L251bGwnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MjAwMy1jaGVja291dC1jYWNoZS1ta2Rpci5zaCBiL3QvdDIwMDMtY2hlY2tvdXQtY2FjaGUtbWtkaXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzE4OTRiMwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDIwMDMtY2hlY2tvdXQtY2FjaGUtbWtkaXIuc2gKQEAgLTAsMCArMSw5NiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgY2hlY2tvdXQtaW5kZXggLS1wcmVmaXggdGVzdC4KKworVGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhhdCAtLXByZWZpeCBvcHRpb24gd29ya3MgYXMgYWR2ZXJ0aXNlZCwgYW5kCithbHNvIHZlcmlmaWVzIHRoYXQgc3VjaCBsZWFkaW5nIHBhdGggbWF5IGNvbnRhaW4gc3ltbGlua3MsIHVubGlrZQordGhlIEdJVCBjb250cm9sbGVkIHBhdGhzLgorJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3NldHVwJyBcCisgICAgJ21rZGlyIHBhdGgxICYmCisgICAgZWNobyBmcm90eiA+cGF0aDAgJiYKKyAgICBlY2hvIHJlenJvdiA+cGF0aDEvZmlsZTEgJiYKKyAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIHBhdGgwIHBhdGgxL2ZpbGUxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnaGF2ZSBzeW1saW5rIGluIHBsYWNlIHdoZXJlIGRpciBpcyBleHBlY3RlZC4nIFwKKyAgICAncm0gLWZyIHBhdGgwIHBhdGgxICYmCisgICAgIG1rZGlyIHBhdGgyICYmCisgICAgIGxuIC1zIHBhdGgyIHBhdGgxICYmCisgICAgIGdpdCBjaGVja291dC1pbmRleCAtZiAtYSAmJgorICAgICB0ZXN0ICEgLWggcGF0aDEgJiYgdGVzdCAtZCBwYXRoMSAmJgorICAgICB0ZXN0IC1mIHBhdGgxL2ZpbGUxICYmIHRlc3QgISAtZiBwYXRoMi9maWxlMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VzZSAtLXByZWZpeD1wYXRoMi8nIFwKKyAgICAncm0gLWZyIHBhdGgwIHBhdGgxIHBhdGgyICYmCisgICAgIG1rZGlyIHBhdGgyICYmCisgICAgIGdpdCBjaGVja291dC1pbmRleCAtLXByZWZpeD1wYXRoMi8gLWYgLWEgJiYKKyAgICAgdGVzdCAtZiBwYXRoMi9wYXRoMCAmJgorICAgICB0ZXN0IC1mIHBhdGgyL3BhdGgxL2ZpbGUxICYmCisgICAgIHRlc3QgISAtZiBwYXRoMCAmJgorICAgICB0ZXN0ICEgLWYgcGF0aDEvZmlsZTEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd1c2UgLS1wcmVmaXg9dG1wLScgXAorICAgICdybSAtZnIgcGF0aDAgcGF0aDEgcGF0aDIgdG1wKiAmJgorICAgICBnaXQgY2hlY2tvdXQtaW5kZXggLS1wcmVmaXg9dG1wLSAtZiAtYSAmJgorICAgICB0ZXN0IC1mIHRtcC1wYXRoMCAmJgorICAgICB0ZXN0IC1mIHRtcC1wYXRoMS9maWxlMSAmJgorICAgICB0ZXN0ICEgLWYgcGF0aDAgJiYKKyAgICAgdGVzdCAhIC1mIHBhdGgxL2ZpbGUxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndXNlIC0tcHJlZml4PXRtcC0gYnV0IHdpdGggYSBjb25mbGljdGluZyBmaWxlIGFuZCBkaXInIFwKKyAgICAncm0gLWZyIHBhdGgwIHBhdGgxIHBhdGgyIHRtcCogJiYKKyAgICAgZWNobyBuaXRmb2wgPnRtcC1wYXRoMSAmJgorICAgICBta2RpciB0bXAtcGF0aDAgJiYKKyAgICAgZ2l0IGNoZWNrb3V0LWluZGV4IC0tcHJlZml4PXRtcC0gLWYgLWEgJiYKKyAgICAgdGVzdCAtZiB0bXAtcGF0aDAgJiYKKyAgICAgdGVzdCAtZiB0bXAtcGF0aDEvZmlsZTEgJiYKKyAgICAgdGVzdCAhIC1mIHBhdGgwICYmCisgICAgIHRlc3QgISAtZiBwYXRoMS9maWxlMScKKworIyBMaW51cyBmaXggIzEKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd1c2UgLS1wcmVmaXg9dG1wL29yYXJ5LyB3aGVyZSB0bXAgaXMgYSBzeW1saW5rJyBcCisgICAgJ3JtIC1mciBwYXRoMCBwYXRoMSBwYXRoMiB0bXAqICYmCisgICAgIG1rZGlyIHRtcDEgdG1wMS9vcmFyeSAmJgorICAgICBsbiAtcyB0bXAxIHRtcCAmJgorICAgICBnaXQgY2hlY2tvdXQtaW5kZXggLS1wcmVmaXg9dG1wL29yYXJ5LyAtZiAtYSAmJgorICAgICB0ZXN0IC1kIHRtcDEvb3JhcnkgJiYKKyAgICAgdGVzdCAtZiB0bXAxL29yYXJ5L3BhdGgwICYmCisgICAgIHRlc3QgLWYgdG1wMS9vcmFyeS9wYXRoMS9maWxlMSAmJgorICAgICB0ZXN0IC1oIHRtcCcKKworIyBMaW51cyBmaXggIzIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd1c2UgLS1wcmVmaXg9dG1wL29yYXJ5LSB3aGVyZSB0bXAgaXMgYSBzeW1saW5rJyBcCisgICAgJ3JtIC1mciBwYXRoMCBwYXRoMSBwYXRoMiB0bXAqICYmCisgICAgIG1rZGlyIHRtcDEgJiYKKyAgICAgbG4gLXMgdG1wMSB0bXAgJiYKKyAgICAgZ2l0IGNoZWNrb3V0LWluZGV4IC0tcHJlZml4PXRtcC9vcmFyeS0gLWYgLWEgJiYKKyAgICAgdGVzdCAtZiB0bXAxL29yYXJ5LXBhdGgwICYmCisgICAgIHRlc3QgLWYgdG1wMS9vcmFyeS1wYXRoMS9maWxlMSAmJgorICAgICB0ZXN0IC1oIHRtcCcKKworIyBMaW51cyBmaXggIzMKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd1c2UgLS1wcmVmaXg9dG1wLSB3aGVyZSB0bXAtcGF0aDEgaXMgYSBzeW1saW5rJyBcCisgICAgJ3JtIC1mciBwYXRoMCBwYXRoMSBwYXRoMiB0bXAqICYmCisgICAgIG1rZGlyIHRtcDEgJiYKKyAgICAgbG4gLXMgdG1wMSB0bXAtcGF0aDEgJiYKKyAgICAgZ2l0IGNoZWNrb3V0LWluZGV4IC0tcHJlZml4PXRtcC0gLWYgLWEgJiYKKyAgICAgdGVzdCAtZiB0bXAtcGF0aDAgJiYKKyAgICAgdGVzdCAhIC1oIHRtcC1wYXRoMSAmJgorICAgICB0ZXN0IC1kIHRtcC1wYXRoMSAmJgorICAgICB0ZXN0IC1mIHRtcC1wYXRoMS9maWxlMScKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QyMDA0LWNoZWNrb3V0LWNhY2hlLXRlbXAuc2ggYi90L3QyMDA0LWNoZWNrb3V0LWNhY2hlLXRlbXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzkxMzNiOAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDIwMDQtY2hlY2tvdXQtY2FjaGUtdGVtcC5zaApAQCAtMCwwICsxLDIxMiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBTaGF3biBQZWFyY2UKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IGNoZWNrb3V0LWluZGV4IC0tdGVtcCB0ZXN0LgorCitXaXRoIC0tdGVtcCBmbGFnLCBnaXQgY2hlY2tvdXQtaW5kZXggd3JpdGVzIHRvIHRlbXBvcmFyeSBtZXJnZSBmaWxlcworcmF0aGVyIHRoYW4gdGhlIHRyYWNrZWQgcGF0aC4nCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKydwcmVwYXJhdGlvbicgJworbWtkaXIgYXN1YmRpciAmJgorZWNobyB0cmVlMXBhdGgwID5wYXRoMCAmJgorZWNobyB0cmVlMXBhdGgxID5wYXRoMSAmJgorZWNobyB0cmVlMXBhdGgzID5wYXRoMyAmJgorZWNobyB0cmVlMXBhdGg0ID5wYXRoNCAmJgorZWNobyB0cmVlMWFzdWJkaXIvcGF0aDUgPmFzdWJkaXIvcGF0aDUgJiYKK2dpdCB1cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAgcGF0aDEgcGF0aDMgcGF0aDQgYXN1YmRpci9wYXRoNSAmJgordDE9JChnaXQgd3JpdGUtdHJlZSkgJiYKK3JtIC1mIHBhdGgqIC5tZXJnZV8qIG91dCAuZ2l0L2luZGV4ICYmCitlY2hvIHRyZWUycGF0aDAgPnBhdGgwICYmCitlY2hvIHRyZWUycGF0aDEgPnBhdGgxICYmCitlY2hvIHRyZWUycGF0aDIgPnBhdGgyICYmCitlY2hvIHRyZWUycGF0aDQgPnBhdGg0ICYmCitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIHBhdGgwIHBhdGgxIHBhdGgyIHBhdGg0ICYmCit0Mj0kKGdpdCB3cml0ZS10cmVlKSAmJgorcm0gLWYgcGF0aCogLm1lcmdlXyogb3V0IC5naXQvaW5kZXggJiYKK2VjaG8gdHJlZTJwYXRoMCA+cGF0aDAgJiYKK2VjaG8gdHJlZTNwYXRoMSA+cGF0aDEgJiYKK2VjaG8gdHJlZTNwYXRoMiA+cGF0aDIgJiYKK2VjaG8gdHJlZTNwYXRoMyA+cGF0aDMgJiYKK2dpdCB1cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAgcGF0aDEgcGF0aDIgcGF0aDMgJiYKK3QzPSQoZ2l0IHdyaXRlLXRyZWUpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKydjaGVja291dCBvbmUgc3RhZ2UgMCB0byB0ZW1wb3JhcnkgZmlsZScgJworcm0gLWYgcGF0aCogLm1lcmdlXyogb3V0IC5naXQvaW5kZXggJiYKK2dpdCByZWFkLXRyZWUgJHQxICYmCitnaXQgY2hlY2tvdXQtaW5kZXggLS10ZW1wIC0tIHBhdGgxID5vdXQgJiYKK3Rlc3QgJCh3YyAtbCA8b3V0KSA9IDEgJiYKK3Rlc3QgJChjdXQgIi1kCSIgLWYyIG91dCkgPSBwYXRoMSAmJgorcD0kKGN1dCAiLWQJIiAtZjEgb3V0KSAmJgordGVzdCAtZiAkcCAmJgordGVzdCAkKGNhdCAkcCkgPSB0cmVlMXBhdGgxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKydjaGVja291dCBhbGwgc3RhZ2UgMCB0byB0ZW1wb3JhcnkgZmlsZXMnICcKK3JtIC1mIHBhdGgqIC5tZXJnZV8qIG91dCAuZ2l0L2luZGV4ICYmCitnaXQgcmVhZC10cmVlICR0MSAmJgorZ2l0IGNoZWNrb3V0LWluZGV4IC1hIC0tdGVtcCA+b3V0ICYmCit0ZXN0ICQod2MgLWwgPG91dCkgPSA1ICYmCitmb3IgZiBpbiBwYXRoMCBwYXRoMSBwYXRoMyBwYXRoNCBhc3ViZGlyL3BhdGg1CitkbworCXRlc3QgJChncmVwICRmIG91dCB8IGN1dCAiLWQJIiAtZjIpID0gJGYgJiYKKwlwPSQoZ3JlcCAkZiBvdXQgfCBjdXQgIi1kCSIgLWYxKSAmJgorCXRlc3QgLWYgJHAgJiYKKwl0ZXN0ICQoY2F0ICRwKSA9IHRyZWUxJGYKK2RvbmUnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ3ByZXBhcmUgMy13YXkgbWVyZ2UnICcKK3JtIC1mIHBhdGgqIC5tZXJnZV8qIG91dCAuZ2l0L2luZGV4ICYmCitnaXQgcmVhZC10cmVlIC1tICR0MSAkdDIgJHQzJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKydjaGVja291dCBvbmUgc3RhZ2UgMiB0byB0ZW1wb3JhcnkgZmlsZScgJworcm0gLWYgcGF0aCogLm1lcmdlXyogb3V0ICYmCitnaXQgY2hlY2tvdXQtaW5kZXggLS1zdGFnZT0yIC0tdGVtcCAtLSBwYXRoMSA+b3V0ICYmCit0ZXN0ICQod2MgLWwgPG91dCkgPSAxICYmCit0ZXN0ICQoY3V0ICItZAkiIC1mMiBvdXQpID0gcGF0aDEgJiYKK3A9JChjdXQgIi1kCSIgLWYxIG91dCkgJiYKK3Rlc3QgLWYgJHAgJiYKK3Rlc3QgJChjYXQgJHApID0gdHJlZTJwYXRoMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnY2hlY2tvdXQgYWxsIHN0YWdlIDIgdG8gdGVtcG9yYXJ5IGZpbGVzJyAnCitybSAtZiBwYXRoKiAubWVyZ2VfKiBvdXQgJiYKK2dpdCBjaGVja291dC1pbmRleCAtLWFsbCAtLXN0YWdlPTIgLS10ZW1wID5vdXQgJiYKK3Rlc3QgJCh3YyAtbCA8b3V0KSA9IDMgJiYKK2ZvciBmIGluIHBhdGgxIHBhdGgyIHBhdGg0CitkbworCXRlc3QgJChncmVwICRmIG91dCB8IGN1dCAiLWQJIiAtZjIpID0gJGYgJiYKKwlwPSQoZ3JlcCAkZiBvdXQgfCBjdXQgIi1kCSIgLWYxKSAmJgorCXRlc3QgLWYgJHAgJiYKKwl0ZXN0ICQoY2F0ICRwKSA9IHRyZWUyJGYKK2RvbmUnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ2NoZWNrb3V0IGFsbCBzdGFnZXMvb25lIGZpbGUgdG8gbm90aGluZycgJworcm0gLWYgcGF0aCogLm1lcmdlXyogb3V0ICYmCitnaXQgY2hlY2tvdXQtaW5kZXggLS1zdGFnZT1hbGwgLS10ZW1wIC0tIHBhdGgwID5vdXQgJiYKK3Rlc3QgJCh3YyAtbCA8b3V0KSA9IDAnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ2NoZWNrb3V0IGFsbCBzdGFnZXMvb25lIGZpbGUgdG8gdGVtcG9yYXJ5IGZpbGVzJyAnCitybSAtZiBwYXRoKiAubWVyZ2VfKiBvdXQgJiYKK2dpdCBjaGVja291dC1pbmRleCAtLXN0YWdlPWFsbCAtLXRlbXAgLS0gcGF0aDEgPm91dCAmJgordGVzdCAkKHdjIC1sIDxvdXQpID0gMSAmJgordGVzdCAkKGN1dCAiLWQJIiAtZjIgb3V0KSA9IHBhdGgxICYmCitjdXQgIi1kCSIgLWYxIG91dCB8IChyZWFkIHMxIHMyIHMzICYmCit0ZXN0IC1mICRzMSAmJgordGVzdCAtZiAkczIgJiYKK3Rlc3QgLWYgJHMzICYmCit0ZXN0ICQoY2F0ICRzMSkgPSB0cmVlMXBhdGgxICYmCit0ZXN0ICQoY2F0ICRzMikgPSB0cmVlMnBhdGgxICYmCit0ZXN0ICQoY2F0ICRzMykgPSB0cmVlM3BhdGgxKScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnY2hlY2tvdXQgc29tZSBzdGFnZXMvb25lIGZpbGUgdG8gdGVtcG9yYXJ5IGZpbGVzJyAnCitybSAtZiBwYXRoKiAubWVyZ2VfKiBvdXQgJiYKK2dpdCBjaGVja291dC1pbmRleCAtLXN0YWdlPWFsbCAtLXRlbXAgLS0gcGF0aDIgPm91dCAmJgordGVzdCAkKHdjIC1sIDxvdXQpID0gMSAmJgordGVzdCAkKGN1dCAiLWQJIiAtZjIgb3V0KSA9IHBhdGgyICYmCitjdXQgIi1kCSIgLWYxIG91dCB8IChyZWFkIHMxIHMyIHMzICYmCit0ZXN0ICRzMSA9IC4gJiYKK3Rlc3QgLWYgJHMyICYmCit0ZXN0IC1mICRzMyAmJgordGVzdCAkKGNhdCAkczIpID0gdHJlZTJwYXRoMiAmJgordGVzdCAkKGNhdCAkczMpID0gdHJlZTNwYXRoMiknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ2NoZWNrb3V0IGFsbCBzdGFnZXMvYWxsIGZpbGVzIHRvIHRlbXBvcmFyeSBmaWxlcycgJworcm0gLWYgcGF0aCogLm1lcmdlXyogb3V0ICYmCitnaXQgY2hlY2tvdXQtaW5kZXggLWEgLS1zdGFnZT1hbGwgLS10ZW1wID5vdXQgJiYKK3Rlc3QgJCh3YyAtbCA8b3V0KSA9IDUnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJy0tIHBhdGgwOiBubyBlbnRyeScgJwordGVzdCB4JChncmVwIHBhdGgwIG91dCB8IGN1dCAiLWQJIiAtZjIpID0geCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnLS0gcGF0aDE6IGFsbCAzIHN0YWdlcycgJwordGVzdCAkKGdyZXAgcGF0aDEgb3V0IHwgY3V0ICItZAkiIC1mMikgPSBwYXRoMSAmJgorZ3JlcCBwYXRoMSBvdXQgfCBjdXQgIi1kCSIgLWYxIHwgKHJlYWQgczEgczIgczMgJiYKK3Rlc3QgLWYgJHMxICYmCit0ZXN0IC1mICRzMiAmJgordGVzdCAtZiAkczMgJiYKK3Rlc3QgJChjYXQgJHMxKSA9IHRyZWUxcGF0aDEgJiYKK3Rlc3QgJChjYXQgJHMyKSA9IHRyZWUycGF0aDEgJiYKK3Rlc3QgJChjYXQgJHMzKSA9IHRyZWUzcGF0aDEpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyctLSBwYXRoMjogbm8gc3RhZ2UgMSwgaGF2ZSBzdGFnZSAyIGFuZCAzJyAnCit0ZXN0ICQoZ3JlcCBwYXRoMiBvdXQgfCBjdXQgIi1kCSIgLWYyKSA9IHBhdGgyICYmCitncmVwIHBhdGgyIG91dCB8IGN1dCAiLWQJIiAtZjEgfCAocmVhZCBzMSBzMiBzMyAmJgordGVzdCAkczEgPSAuICYmCit0ZXN0IC1mICRzMiAmJgordGVzdCAtZiAkczMgJiYKK3Rlc3QgJChjYXQgJHMyKSA9IHRyZWUycGF0aDIgJiYKK3Rlc3QgJChjYXQgJHMzKSA9IHRyZWUzcGF0aDIpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyctLSBwYXRoMzogbm8gc3RhZ2UgMiwgaGF2ZSBzdGFnZSAxIGFuZCAzJyAnCit0ZXN0ICQoZ3JlcCBwYXRoMyBvdXQgfCBjdXQgIi1kCSIgLWYyKSA9IHBhdGgzICYmCitncmVwIHBhdGgzIG91dCB8IGN1dCAiLWQJIiAtZjEgfCAocmVhZCBzMSBzMiBzMyAmJgordGVzdCAtZiAkczEgJiYKK3Rlc3QgJHMyID0gLiAmJgordGVzdCAtZiAkczMgJiYKK3Rlc3QgJChjYXQgJHMxKSA9IHRyZWUxcGF0aDMgJiYKK3Rlc3QgJChjYXQgJHMzKSA9IHRyZWUzcGF0aDMpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyctLSBwYXRoNDogbm8gc3RhZ2UgMywgaGF2ZSBzdGFnZSAxIGFuZCAzJyAnCit0ZXN0ICQoZ3JlcCBwYXRoNCBvdXQgfCBjdXQgIi1kCSIgLWYyKSA9IHBhdGg0ICYmCitncmVwIHBhdGg0IG91dCB8IGN1dCAiLWQJIiAtZjEgfCAocmVhZCBzMSBzMiBzMyAmJgordGVzdCAtZiAkczEgJiYKK3Rlc3QgLWYgJHMyICYmCit0ZXN0ICRzMyA9IC4gJiYKK3Rlc3QgJChjYXQgJHMxKSA9IHRyZWUxcGF0aDQgJiYKK3Rlc3QgJChjYXQgJHMyKSA9IHRyZWUycGF0aDQpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyctLSBhc3ViZGlyL3BhdGg1OiBubyBzdGFnZSAyIGFuZCAzIGhhdmUgc3RhZ2UgMScgJwordGVzdCAkKGdyZXAgYXN1YmRpci9wYXRoNSBvdXQgfCBjdXQgIi1kCSIgLWYyKSA9IGFzdWJkaXIvcGF0aDUgJiYKK2dyZXAgYXN1YmRpci9wYXRoNSBvdXQgfCBjdXQgIi1kCSIgLWYxIHwgKHJlYWQgczEgczIgczMgJiYKK3Rlc3QgLWYgJHMxICYmCit0ZXN0ICRzMiA9IC4gJiYKK3Rlc3QgJHMzID0gLiAmJgordGVzdCAkKGNhdCAkczEpID0gdHJlZTFhc3ViZGlyL3BhdGg1KScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnY2hlY2tvdXQgLS10ZW1wIHdpdGhpbiBzdWJkaXInICcKKyhjZCBhc3ViZGlyICYmCisgZ2l0IGNoZWNrb3V0LWluZGV4IC1hIC0tc3RhZ2U9YWxsID5vdXQgJiYKKyB0ZXN0ICQod2MgLWwgPG91dCkgPSAxICYmCisgdGVzdCAkKGdyZXAgcGF0aDUgb3V0IHwgY3V0ICItZAkiIC1mMikgPSBwYXRoNSAmJgorIGdyZXAgcGF0aDUgb3V0IHwgY3V0ICItZAkiIC1mMSB8IChyZWFkIHMxIHMyIHMzICYmCisgdGVzdCAtZiAuLi8kczEgJiYKKyB0ZXN0ICRzMiA9IC4gJiYKKyB0ZXN0ICRzMyA9IC4gJiYKKyB0ZXN0ICQoY2F0IC4uLyRzMSkgPSB0cmVlMWFzdWJkaXIvcGF0aDUpCispJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKydjaGVja291dCAtLXRlbXAgc3ltbGluaycgJworcm0gLWYgcGF0aCogLm1lcmdlXyogb3V0IC5naXQvaW5kZXggJiYKK2xuIC1zIGIgYSAmJgorZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBhICYmCit0ND0kKGdpdCB3cml0ZS10cmVlKSAmJgorcm0gLWYgLmdpdC9pbmRleCAmJgorZ2l0IHJlYWQtdHJlZSAkdDQgJiYKK2dpdCBjaGVja291dC1pbmRleCAtLXRlbXAgLWEgPm91dCAmJgordGVzdCAkKHdjIC1sIDxvdXQpID0gMSAmJgordGVzdCAkKGN1dCAiLWQJIiAtZjIgb3V0KSA9IGEgJiYKK3A9JChjdXQgIi1kCSIgLWYxIG91dCkgJiYKK3Rlc3QgLWYgJHAgJiYKK3Rlc3QgJChjYXQgJHApID0gYicKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QyMDA1LWNoZWNrb3V0LWluZGV4LXN5bWxpbmtzLnNoIGIvdC90MjAwNS1jaGVja291dC1pbmRleC1zeW1saW5rcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hODRjNWE2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90MjAwNS1jaGVja291dC1pbmRleC1zeW1saW5rcy5zaApAQCAtMCwwICsxLDI4IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3IEpvaGFubmVzIFNpeHQKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IGNoZWNrb3V0LWluZGV4IG9uIGZpbGVzeXN0ZW0gdy9vIHN5bWxpbmtzIHRlc3QuCisKK1RoaXMgdGVzdHMgdGhhdCBnaXQgY2hlY2tvdXQtaW5kZXggY3JlYXRlcyBhIHN5bWJvbGljIGxpbmsgYXMgYSBwbGFpbgorZmlsZSBpZiBjb3JlLnN5bWxpbmtzIGlzIGZhbHNlLicKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ3ByZXBhcmF0aW9uJyAnCitnaXQgY29uZmlnIGNvcmUuc3ltbGlua3MgZmFsc2UgJiYKK2w9JChlY2hvIC1uIGZpbGUgfCBnaXQtaGFzaC1vYmplY3QgLXQgYmxvYiAtdyAtLXN0ZGluKSAmJgorZWNobyAiMTIwMDAwICRsCXN5bWxpbmsiIHwgZ2l0IHVwZGF0ZS1pbmRleCAtLWluZGV4LWluZm8nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ3RoZSBjaGVja2VkLW91dCBzeW1saW5rIG11c3QgYmUgYSBmaWxlJyAnCitnaXQgY2hlY2tvdXQtaW5kZXggc3ltbGluayAmJgordGVzdCAtZiBzeW1saW5rJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyd0aGUgZmlsZSBtdXN0IGJlIHRoZSBibG9iIHdlIGFkZGVkIGR1cmluZyB0aGUgc2V0dXAnICcKK3Rlc3QgIiQoZ2l0LWhhc2gtb2JqZWN0IC10IGJsb2Igc3ltbGluaykiID0gJGwnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MjAwNy1jaGVja291dC1zeW1saW5rLnNoIGIvdC90MjAwNy1jaGVja291dC1zeW1saW5rLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA1MjZmY2UKLS0tIC9kZXYvbnVsbAorKysgYi90L3QyMDA3LWNoZWNrb3V0LXN5bWxpbmsuc2gKQEAgLTAsMCArMSw1MCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBKdW5pbyBDIEhhbWFubworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgY2hlY2tvdXQgdG8gc3dpdGNoIGJldHdlZW4gYnJhbmNoZXMgd2l0aCBzeW1saW5rPC0+ZGlyJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwlta2RpciBmcm90eiAmJgorCWVjaG8gaGVsbG8gPmZyb3R6L2ZpbGZyZSAmJgorCWdpdCBhZGQgZnJvdHovZmlsZnJlICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSAibWFzdGVyIGhhcyBmaWxlIGZyb3R6L2ZpbGZyZSIgJiYKKworCWdpdCBicmFuY2ggc2lkZSAmJgorCisJZWNobyBnb29kYnllID5uaXRmb2wgJiYKKwlnaXQgYWRkIG5pdGZvbAorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gIm1hc3RlciBhZGRzIGZpbGUgbml0Zm9sIiAmJgorCisJZ2l0IGNoZWNrb3V0IHNpZGUgJiYKKworCWdpdCBybSAtLWNhY2hlZCBmcm90ei9maWxmcmUgJiYKKwltdiBmcm90eiB4eXp6eSAmJgorCWxuIC1zIHh5enp5IGZyb3R6ICYmCisJZ2l0IGFkZCB4eXp6eS9maWxmcmUgZnJvdHogJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tICJzaWRlIG1vdmVzIGZyb3R6LyB0byB4eXp6eS8gYW5kIGFkZHMgZnJvdHotPnh5enp5LyIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzd2l0Y2ggZnJvbSBzeW1saW5rIHRvIGRpcicgJworCisJZ2l0IGNoZWNrb3V0IG1hc3RlcgorCisnCisKK3JtIC1mciBmcm90eiB4eXp6eSBuaXRmb2wgJiYKK2dpdCBjaGVja291dCAtZiBtYXN0ZXIgfHwgZXhpdAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzd2l0Y2ggZnJvbSBkaXIgdG8gc3ltbGluaycgJworCisJZ2l0IGNoZWNrb3V0IHNpZGUKKworJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDIwMDgtY2hlY2tvdXQtc3ViZGlyLnNoIGIvdC90MjAwOC1jaGVja291dC1zdWJkaXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2UwOThhYgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDIwMDgtY2hlY2tvdXQtc3ViZGlyLnNoCkBAIC0wLDAgKzEsODIgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDcgRGF2aWQgU3ltb25kcworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgY2hlY2tvdXQgZnJvbSBzdWJkaXJlY3RvcmllcycKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJZWNobyAiYmFzZSIgPiBmaWxlMCAmJgorCWdpdCBhZGQgZmlsZTAgJiYKKwlta2RpciBkaXIxICYmCisJZWNobyAiaGVsbG8iID4gZGlyMS9maWxlMSAmJgorCWdpdCBhZGQgZGlyMS9maWxlMSAmJgorCW1rZGlyIGRpcjIgJiYKKwllY2hvICJib25qb3VyIiA+IGRpcjIvZmlsZTIgJiYKKwlnaXQgYWRkIGRpcjIvZmlsZTIgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tICJwb3B1bGF0ZSB0cmVlIgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlbW92ZSBhbmQgcmVzdG9yZSB3aXRoIHJlbGF0aXZlIHBhdGgnICcKKworCSgKKwkJY2QgZGlyMSAmJgorCQlybSAuLi9maWxlMCAmJgorCQlnaXQgY2hlY2tvdXQgSEVBRCAtLSAuLi9maWxlMCAmJgorCQl0ZXN0ICJiYXNlIiA9ICIkKGNhdCAuLi9maWxlMCkiICYmCisJCXJtIC4uL2RpcjIvZmlsZTIgJiYKKwkJZ2l0IGNoZWNrb3V0IEhFQUQgLS0gLi4vZGlyMi9maWxlMiAmJgorCQl0ZXN0ICJib25qb3VyIiA9ICIkKGNhdCAuLi9kaXIyL2ZpbGUyKSIgJiYKKwkJcm0gLi4vZmlsZTAgLi9maWxlMSAmJgorCQlnaXQgY2hlY2tvdXQgSEVBRCAtLSAuLiAmJgorCQl0ZXN0ICJiYXNlIiA9ICIkKGNhdCAuLi9maWxlMCkiICYmCisJCXRlc3QgImhlbGxvIiA9ICIkKGNhdCBmaWxlMSkiCisJKQorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrb3V0IHdpdGggZW1wdHkgcHJlZml4JyAnCisKKwlybSBmaWxlMCAmJgorCWdpdCBjaGVja291dCBIRUFEIC0tIGZpbGUwICYmCisJdGVzdCAiYmFzZSIgPSAiJChjYXQgZmlsZTApIgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrb3V0IHdpdGggc2ltcGxlIHByZWZpeCcgJworCisJcm0gZGlyMS9maWxlMSAmJgorCWdpdCBjaGVja291dCBIRUFEIC0tIGRpcjEgJiYKKwl0ZXN0ICJoZWxsbyIgPSAiJChjYXQgZGlyMS9maWxlMSkiICYmCisJcm0gZGlyMS9maWxlMSAmJgorCWdpdCBjaGVja291dCBIRUFEIC0tIGRpcjEvZmlsZTEgJiYKKwl0ZXN0ICJoZWxsbyIgPSAiJChjYXQgZGlyMS9maWxlMSkiCisKKycKKworIyBUaGlzIGlzIG5vdCBleHBlY3RlZCB0byB3b3JrIGFzIGxzLWZpbGVzIHdhcyBub3QgZGVzaWduZWQKKyMgdG8gZGVhbCB3aXRoIHN1Y2guICBFbmFibGUgaXQgd2hlbiBscy1maWxlcyBpcyB1cGRhdGVkLgorOiB0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVja291dCB3aXRoIGNvbXBsZXggcmVsYXRpdmUgcGF0aCcgJworCisJcm0gZmlsZTEgJiYKKwlnaXQgY2hlY2tvdXQgSEVBRCAtLSAuLi9kaXIxLy4uL2RpcjEvZmlsZTEgJiYgdGVzdCAtZiAuL2ZpbGUxCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVsYXRpdmUgcGF0aCBvdXRzaWRlIHRyZWUgc2hvdWxkIGZhaWwnIFwKKwkndGVzdF9tdXN0X2ZhaWwgZ2l0IGNoZWNrb3V0IEhFQUQgLS0gLi4vLi4vTWFrZWZpbGUnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2luY29ycmVjdCByZWxhdGl2ZSBwYXRoIHRvIGZpbGUgc2hvdWxkIGZhaWwgKDEpJyBcCisJJ3Rlc3RfbXVzdF9mYWlsIGdpdCBjaGVja291dCBIRUFEIC0tIC4uL2ZpbGUwJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbmNvcnJlY3QgcmVsYXRpdmUgcGF0aCBzaG91bGQgZmFpbCAoMiknIFwKKwknKCBjZCBkaXIxICYmIHRlc3RfbXVzdF9mYWlsIGdpdCBjaGVja291dCBIRUFEIC0tIC4vZmlsZTAgKScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5jb3JyZWN0IHJlbGF0aXZlIHBhdGggc2hvdWxkIGZhaWwgKDMpJyBcCisJJyggY2QgZGlyMSAmJiB0ZXN0X211c3RfZmFpbCBnaXQgY2hlY2tvdXQgSEVBRCAtLSAuLi8uLi9maWxlMCApJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDIwMDktY2hlY2tvdXQtc3RhdGluZm8uc2ggYi90L3QyMDA5LWNoZWNrb3V0LXN0YXRpbmZvLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYzYzIxNTIKLS0tIC9kZXYvbnVsbAorKysgYi90L3QyMDA5LWNoZWNrb3V0LXN0YXRpbmZvLnNoCkBAIC0wLDAgKzEsNTIgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdjaGVja291dCBzaG91bGQgbGVhdmUgY2xlYW4gc3RhdCBpbmZvJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAnICcKKworCWVjaG8gaGVsbG8gPndvcmxkICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCB3b3JsZCAmJgorCWdpdCBjb21taXQgLW0gaW5pdGlhbCAmJgorCWdpdCBicmFuY2ggc2lkZSAmJgorCWVjaG8gZ29vZGJ5ZSA+d29ybGQgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIHdvcmxkICYmCisJZ2l0IGNvbW1pdCAtbSBzZWNvbmQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdicmFuY2ggc3dpdGNoaW5nJyAnCisKKwlnaXQgcmVzZXQgLS1oYXJkICYmCisJdGVzdCAiJChnaXQgZGlmZi1maWxlcyAtLXJhdykiID0gIiIgJiYKKworCWdpdCBjaGVja291dCBtYXN0ZXIgJiYKKwl0ZXN0ICIkKGdpdCBkaWZmLWZpbGVzIC0tcmF3KSIgPSAiIiAmJgorCisJZ2l0IGNoZWNrb3V0IHNpZGUgJiYKKwl0ZXN0ICIkKGdpdCBkaWZmLWZpbGVzIC0tcmF3KSIgPSAiIiAmJgorCisJZ2l0IGNoZWNrb3V0IG1hc3RlciAmJgorCXRlc3QgIiQoZ2l0IGRpZmYtZmlsZXMgLS1yYXcpIiA9ICIiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncGF0aCBjaGVja291dCcgJworCisJZ2l0IHJlc2V0IC0taGFyZCAmJgorCXRlc3QgIiQoZ2l0IGRpZmYtZmlsZXMgLS1yYXcpIiA9ICIiICYmCisKKwlnaXQgY2hlY2tvdXQgbWFzdGVyIHdvcmxkICYmCisJdGVzdCAiJChnaXQgZGlmZi1maWxlcyAtLXJhdykiID0gIiIgJiYKKworCWdpdCBjaGVja291dCBzaWRlIHdvcmxkICYmCisJdGVzdCAiJChnaXQgZGlmZi1maWxlcyAtLXJhdykiID0gIiIgJiYKKworCWdpdCBjaGVja291dCBtYXN0ZXIgd29ybGQgJiYKKwl0ZXN0ICIkKGdpdCBkaWZmLWZpbGVzIC0tcmF3KSIgPSAiIgorCisnCisKK3Rlc3RfZG9uZQorCmRpZmYgLS1naXQgYS90L3QyMDUwLWdpdC1kaXItcmVsYXRpdmUuc2ggYi90L3QyMDUwLWdpdC1kaXItcmVsYXRpdmUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODhmMjY4YgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDIwNTAtZ2l0LWRpci1yZWxhdGl2ZS5zaApAQCAtMCwwICsxLDU1IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nY2hlY2sgcHJvYmxlbXMgd2l0aCByZWxhdGl2ZSBHSVRfRElSCisKK1RoaXMgdGVzdCBjcmVhdGVzIGEgd29ya2luZyB0cmVlIHN0YXRlIHdpdGggYSBmaWxlIGFuZCBzdWJkaXI6CisKKyAgdG9wIChjb21taXR0ZWQgc2V2ZXJhbCB0aW1lcykKKyAgc3ViZGlyIChhIHN1YmRpcmVjdG9yeSkKKworSXQgY3JlYXRlcyBhIGNvbW1pdC1ob29rIGFuZCB0ZXN0cyBpdCwgdGhlbiBtb3ZlcyAuZ2l0CitpbnRvIHRoZSBzdWJkaXIgd2hpbGUga2VlcGluZyB0aGUgd29ya3RyZWUgbG9jYXRpb24sCithbmQgdHJpZXMgY29tbWl0cyBmcm9tIHRoZSB0b3AgYW5kIHRoZSBzdWJkaXIsIGNoZWNraW5nCit0aGF0IHRoZSBjb21taXQtaG9vayBzdGlsbCBnZXRzIGNhbGxlZC4nCisKKy4gLi90ZXN0LWxpYi5zaAorCitDT01NSVRfRklMRT0iJChwd2QpL291dHB1dCIKK2V4cG9ydCBDT01NSVRfRklMRQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdTZXR0aW5nIHVwIHBvc3QtY29tbWl0IGhvb2snICcKK21rZGlyIC1wIC5naXQvaG9va3MgJiYKK2VjaG8gPi5naXQvaG9va3MvcG9zdC1jb21taXQgIiMhL2Jpbi9zaAordG91Y2ggXCJcJHtDT01NSVRfRklMRX1cIgorZWNobyBQb3N0IGNvbW1pdCBob29rIHdhcyBjYWxsZWQuIiAmJgorY2htb2QgK3ggLmdpdC9ob29rcy9wb3N0LWNvbW1pdCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncG9zdC1jb21taXQgaG9vayB1c2VkIG9yZGluYXJpbHknICcKK2VjaG8gaW5pdGlhbCA+dG9wICYmCitnaXQtYWRkIHRvcAorZ2l0LWNvbW1pdCAtbSBpbml0aWFsICYmCit0ZXN0IC1yICIke0NPTU1JVF9GSUxFfSIKKycKKworcm0gLXJmICIke0NPTU1JVF9GSUxFfSIKK21rZGlyIHN1YmRpcgorbXYgLmdpdCBzdWJkaXIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncG9zdC1jb21taXQtaG9vayBjcmVhdGVkIGFuZCB1c2VkIGZyb20gdG9wIGRpcicgJworZWNobyBjaGFuZ2VkID50b3AgJiYKK2dpdCAtLWdpdC1kaXIgc3ViZGlyLy5naXQgYWRkIHRvcCAmJgorZ2l0IC0tZ2l0LWRpciBzdWJkaXIvLmdpdCBjb21taXQgLW0gdG9wY29tbWl0ICYmCit0ZXN0IC1yICIke0NPTU1JVF9GSUxFfSIKKycKKworcm0gLXJmICIke0NPTU1JVF9GSUxFfSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncG9zdC1jb21taXQtaG9vayBmcm9tIHN1YiBkaXInICcKK2VjaG8gY2hhbmdlZCBhZ2FpbiA+dG9wCitjZCBzdWJkaXIgJiYKK2dpdCAtLWdpdC1kaXIgLmdpdCAtLXdvcmstdHJlZSAuLiBhZGQgLi4vdG9wICYmCitnaXQgLS1naXQtZGlyIC5naXQgLS13b3JrLXRyZWUgLi4gY29tbWl0IC1tIHN1YmNvbW1pdCAmJgordGVzdCAtciAiJHtDT01NSVRfRklMRX0iCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MjEwMC11cGRhdGUtY2FjaGUtYmFkcGF0aC5zaCBiL3QvdDIxMDAtdXBkYXRlLWNhY2hlLWJhZHBhdGguc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWJlYWVjZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDIxMDAtdXBkYXRlLWNhY2hlLWJhZHBhdGguc2gKQEAgLTAsMCArMSw1MSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgdXBkYXRlLWluZGV4IG5vbnNlbnNlLXBhdGggdGVzdC4KKworVGhpcyB0ZXN0IGNyZWF0ZXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaW4gdGhlIGNhY2hlOgorCisgICAgcGF0aDAgICAgICAgLSBhIGZpbGUKKyAgICBwYXRoMSAgICAgICAtIGEgc3ltbGluaworICAgIHBhdGgyL2ZpbGUyIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDMvZmlsZTMgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKworYW5kIHRyaWVzIHRvIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgdGhlIGZvbGxvd2luZzoKKworICAgIHBhdGgwL2ZpbGUwIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDEvZmlsZTEgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKyAgICBwYXRoMiAgICAgICAtIGEgZmlsZQorICAgIHBhdGgzICAgICAgIC0gYSBzeW1saW5rCisKK0FsbCBvZiB0aGUgYXR0ZW1wdHMgc2hvdWxkIGZhaWwuCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCitta2RpciBwYXRoMiBwYXRoMworZGF0ZSA+cGF0aDAKK2xuIC1zIHh5enp5IHBhdGgxCitkYXRlID5wYXRoMi9maWxlMgorZGF0ZSA+cGF0aDMvZmlsZTMKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCB1cGRhdGUtaW5kZXggLS1hZGQgdG8gYWRkIHZhcmlvdXMgcGF0aHMuJyBcCisgICAgJ2dpdCB1cGRhdGUtaW5kZXggLS1hZGQgLS0gcGF0aDAgcGF0aDEgcGF0aDIvZmlsZTIgcGF0aDMvZmlsZTMnCisKK3JtIC1mciBwYXRoPworCitta2RpciBwYXRoMCBwYXRoMQorZGF0ZSA+cGF0aDIKK2xuIC1zIGZyb3R6IHBhdGgzCitkYXRlID5wYXRoMC9maWxlMAorZGF0ZSA+cGF0aDEvZmlsZTEKKworZm9yIHAgaW4gcGF0aDAvZmlsZTAgcGF0aDEvZmlsZTEgcGF0aDIgcGF0aDMKK2RvCisJdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJICAgICJnaXQgdXBkYXRlLWluZGV4IHRvIGFkZCBjb25mbGljdGluZyBwYXRoICRwIHNob3VsZCBmYWlsLiIgXAorCSAgICAiISBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tICRwIgorZG9uZQordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QyMTAxLXVwZGF0ZS1pbmRleC1yZXVwZGF0ZS5zaCBiL3QvdDIxMDEtdXBkYXRlLWluZGV4LXJldXBkYXRlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU5YjU2MGIKLS0tIC9kZXYvbnVsbAorKysgYi90L3QyMTAxLXVwZGF0ZS1pbmRleC1yZXVwZGF0ZS5zaApAQCAtMCwwICsxLDg0IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCB1cGRhdGUtaW5kZXggLS1hZ2FpbiB0ZXN0LgorJworCisuIC4vdGVzdC1saWIuc2gKKworY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCisxMDA2NDQgM2IxOGU1MTJkYmE3OWU0YzgzMDBkZDA4YWViMzdmOGU3MjhiOGRhZCAwCWZpbGUxCisxMDA2NDQgOWRiODg5Mzg1NmE4YTAyZWFhNzM0NzAwNTRiN2MxYzVhN2M4MmU0NyAwCWZpbGUyCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VwZGF0ZS1pbmRleCAtLWFkZCcgXAorCSdlY2hvIGhlbGxvIHdvcmxkID5maWxlMSAmJgorCSBlY2hvIGdvb2RieWUgcGVvcGxlID5maWxlMiAmJgorCSBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGZpbGUxIGZpbGUyICYmCisJIGdpdCBscy1maWxlcyAtcyA+Y3VycmVudCAmJgorCSBjbXAgY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBkYXRlLWluZGV4IC0tYWdhaW4nIFwKKwkncm0gLWYgZmlsZTEgJiYKKwllY2hvIGhlbGxvIGV2ZXJ5Ym9keSA+ZmlsZTIgJiYKKwlpZiBnaXQgdXBkYXRlLWluZGV4IC0tYWdhaW4KKwl0aGVuCisJCWVjaG8gc2hvdWxkIGhhdmUgcmVmdXNlZCB0byByZW1vdmUgZmlsZTEKKwkJZXhpdCAxCisJZWxzZQorCQllY2hvIGhhcHB5IC0gZmFpbGVkIGFzIGV4cGVjdGVkCisJZmkgJiYKKwkgZ2l0IGxzLWZpbGVzIC1zID5jdXJyZW50ICYmCisJIGNtcCBjdXJyZW50IGV4cGVjdGVkJworCitjYXQgPiBleHBlY3RlZCA8PFxFT0YKKzEwMDY0NCAwZjFhZTE0MjJjMmJmNDNmMTE3ZDNkYmQ3MTVjOTg4YTllZDIxMDNmIDAJZmlsZTIKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBkYXRlLWluZGV4IC0tcmVtb3ZlIC0tYWdhaW4nIFwKKwknZ2l0IHVwZGF0ZS1pbmRleCAtLXJlbW92ZSAtLWFnYWluICYmCisJIGdpdCBscy1maWxlcyAtcyA+Y3VycmVudCAmJgorCSBjbXAgY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmlyc3QgY29tbWl0JyAnZ2l0LWNvbW1pdCAtbSBpbml0aWFsJworCitjYXQgPiBleHBlY3RlZCA8PFxFT0YKKzEwMDY0NCA1M2FiNDQ2YzNmNGU0MmNlOWJiNzI4YTBjY2IyODNhMTAxYmU0OTc5IDAJZGlyMS9maWxlMworMTAwNjQ0IDBmMWFlMTQyMmMyYmY0M2YxMTdkM2RiZDcxNWM5ODhhOWVkMjEwM2YgMAlmaWxlMgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1cGRhdGUtaW5kZXggYWdhaW4nIFwKKwknbWtkaXIgLXAgZGlyMSAmJgorCWVjaG8gaGVsbG8gd29ybGQgPmRpcjEvZmlsZTMgJiYKKwllY2hvIGdvb2RieWUgcGVvcGxlID5maWxlMiAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgZmlsZTIgZGlyMS9maWxlMyAmJgorCWVjaG8gaGVsbG8gZXZlcnlib2R5ID5maWxlMgorCWVjaG8gaGFwcHkgPmRpcjEvZmlsZTMgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWdhaW4gJiYKKwlnaXQgbHMtZmlsZXMgLXMgPmN1cnJlbnQgJiYKKwljbXAgY3VycmVudCBleHBlY3RlZCcKKworY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCisxMDA2NDQgZDdmYjNmNjk1ZjA2Yzc1OWRiZjNhYjAwMDQ2ZTdjYzJkYTIyZDEwZiAwCWRpcjEvZmlsZTMKKzEwMDY0NCAwZjFhZTE0MjJjMmJmNDNmMTE3ZDNkYmQ3MTVjOTg4YTllZDIxMDNmIDAJZmlsZTIKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBkYXRlLWluZGV4IC0tdXBkYXRlIGZyb20gc3ViZGlyJyBcCisJJ2VjaG8gbm90IHNvIGhhcHB5ID5maWxlMiAmJgorCWNkIGRpcjEgJiYKKwljYXQgLi4vZmlsZTIgPmZpbGUzICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFnYWluICYmCisJY2QgLi4gJiYKKwlnaXQgbHMtZmlsZXMgLXMgPmN1cnJlbnQgJiYKKwljbXAgY3VycmVudCBleHBlY3RlZCcKKworY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCisxMDA2NDQgNTk0ZmI1YmIxNzU5ZDkwOTk4ZTJiZjJhMzgyNjFhZThlMjQzYzc2MCAwCWRpcjEvZmlsZTMKKzEwMDY0NCAwZjFhZTE0MjJjMmJmNDNmMTE3ZDNkYmQ3MTVjOTg4YTllZDIxMDNmIDAJZmlsZTIKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBkYXRlLWluZGV4IC0tdXBkYXRlIHdpdGggcGF0aHNwZWMnIFwKKwknZWNobyB2ZXJ5IGhhcHB5ID5maWxlMiAmJgorCWNhdCBmaWxlMiA+ZGlyMS9maWxlMyAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZ2FpbiBkaXIxLyAmJgorCWdpdCBscy1maWxlcyAtcyA+Y3VycmVudCAmJgorCWNtcCBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDIxMDItdXBkYXRlLWluZGV4LXN5bWxpbmtzLnNoIGIvdC90MjEwMi11cGRhdGUtaW5kZXgtc3ltbGlua3Muc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTlkMDg5NAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDIxMDItdXBkYXRlLWluZGV4LXN5bWxpbmtzLnNoCkBAIC0wLDAgKzEsMzEgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDcgSm9oYW5uZXMgU2l4dAorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgdXBkYXRlLWluZGV4IG9uIGZpbGVzeXN0ZW0gdy9vIHN5bWxpbmtzIHRlc3QuCisKK1RoaXMgdGVzdHMgdGhhdCBnaXQgdXBkYXRlLWluZGV4IGtlZXBzIHRoZSBzeW1ib2xpYyBsaW5rIHByb3BlcnR5CitldmVuIGlmIGEgcGxhaW4gZmlsZSBpcyBpbiB0aGUgd29ya2luZyB0cmVlIGlmIGNvcmUuc3ltbGlua3MgaXMgZmFsc2UuJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisncHJlcGFyYXRpb24nICcKK2dpdCBjb25maWcgY29yZS5zeW1saW5rcyBmYWxzZSAmJgorbD0kKGVjaG8gLW4gZmlsZSB8IGdpdC1oYXNoLW9iamVjdCAtdCBibG9iIC13IC0tc3RkaW4pICYmCitlY2hvICIxMjAwMDAgJGwJc3ltbGluayIgfCBnaXQgdXBkYXRlLWluZGV4IC0taW5kZXgtaW5mbycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnbW9kaWZ5IHRoZSBzeW1ib2xpYyBsaW5rJyAnCitlY2hvIC1uIG5ldy1maWxlID4gc3ltbGluayAmJgorZ2l0IHVwZGF0ZS1pbmRleCBzeW1saW5rJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyd0aGUgaW5kZXggZW50cnkgbXVzdCBzdGlsbCBiZSBhIHN5bWJvbGljIGxpbmsnICcKK2Nhc2UgImBnaXQgbHMtZmlsZXMgLS1zdGFnZSAtLWNhY2hlZCBzeW1saW5rYCIgaW4KKzEyMDAwMCIgIipzeW1saW5rKSBlY2hvIG9rOzsKKyopIGVjaG8gZmFpbDsgZ2l0IGxzLWZpbGVzIC0tc3RhZ2UgLS1jYWNoZWQgc3ltbGluazsgKGV4aXQgMSk7OworZXNhYycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QyMjAwLWFkZC11cGRhdGUuc2ggYi90L3QyMjAwLWFkZC11cGRhdGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjY2NDM0MQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDIyMDAtYWRkLXVwZGF0ZS5zaApAQCAtMCwwICsxLDExNCBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBhZGQgLXUKKworVGhpcyB0ZXN0IGNyZWF0ZXMgYSB3b3JraW5nIHRyZWUgc3RhdGUgd2l0aCB0aHJlZSBmaWxlczoKKworICB0b3AgKHByZXZpb3VzbHkgY29tbWl0dGVkLCBtb2RpZmllZCkKKyAgZGlyL3N1YiAocHJldmlvdXNseSBjb21taXR0ZWQsIG1vZGlmaWVkKQorICBkaXIvb3RoZXIgKHVudHJhY2tlZCkKKworYW5kIGlzc3VlcyBhIGdpdCBhZGQgLXUgd2l0aCBwYXRoIGxpbWl0aW5nIG9uICJkaXIiIHRvIGFkZAorb25seSB0aGUgdXBkYXRlcyB0byBkaXIvc3ViLgorCitBbHNvIHRlc3RlZCBhcmUgImdpdCBhZGQgLXUiIHdpdGhvdXQgbGltaXRpbmcsIGFuZCAiZ2l0IGFkZCAtdSIKK3dpdGhvdXQgY29udGVudHMgY2hhbmdlcy4nCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKwllY2hvIGluaXRpYWwgPmNoZWNrICYmCisJZWNobyBpbml0aWFsID50b3AgJiYKKwllY2hvIGluaXRpYWwgPmZvbyAmJgorCW1rZGlyIGRpcjEgZGlyMiAmJgorCWVjaG8gaW5pdGlhbCA+ZGlyMS9zdWIxICYmCisJZWNobyBpbml0aWFsID5kaXIxL3N1YjIgJiYKKwllY2hvIGluaXRpYWwgPmRpcjIvc3ViMyAmJgorCWdpdCBhZGQgY2hlY2sgZGlyMSBkaXIyIHRvcCBmb28gJiYKKwl0ZXN0X3RpY2sKKwlnaXQtY29tbWl0IC1tIGluaXRpYWwgJiYKKworCWVjaG8gY2hhbmdlZCA+Y2hlY2sgJiYKKwllY2hvIGNoYW5nZWQgPnRvcCAmJgorCWVjaG8gY2hhbmdlZCA+ZGlyMi9zdWIzICYmCisJcm0gLWYgZGlyMS9zdWIxICYmCisJZWNobyBvdGhlciA+ZGlyMi9vdGhlcgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHVwZGF0ZSAnCisJZ2l0IGFkZCAtdSBkaXIxIGRpcjIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBkYXRlIG5vdGljZWQgYSByZW1vdmFsJyAnCisJdGVzdCAiJChnaXQtbHMtZmlsZXMgZGlyMS9zdWIxKSIgPSAiIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1cGRhdGUgdG91Y2hlZCBjb3JyZWN0IHBhdGgnICcKKwl0ZXN0ICIkKGdpdC1kaWZmLWZpbGVzIC0tbmFtZS1zdGF0dXMgZGlyMi9zdWIzKSIgPSAiIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1cGRhdGUgZGlkIG5vdCB0b3VjaCBvdGhlciB0cmFja2VkIGZpbGVzJyAnCisJdGVzdCAiJChnaXQtZGlmZi1maWxlcyAtLW5hbWUtc3RhdHVzIGNoZWNrKSIgPSAiTQljaGVjayIgJiYKKwl0ZXN0ICIkKGdpdC1kaWZmLWZpbGVzIC0tbmFtZS1zdGF0dXMgdG9wKSIgPSAiTQl0b3AiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VwZGF0ZSBkaWQgbm90IHRvdWNoIHVudHJhY2tlZCBmaWxlcycgJworCXRlc3QgIiQoZ2l0LWxzLWZpbGVzIGRpcjIvb3RoZXIpIiA9ICIiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NhY2hlIHRyZWUgaGFzIG5vdCBiZWVuIGNvcnJ1cHRlZCcgJworCisJZ2l0IGxzLWZpbGVzIC1zIHwKKwlzZWQgLWUgInMvIDAJLwkvIiA+ZXhwZWN0ICYmCisJZ2l0IGxzLXRyZWUgLXIgJChnaXQgd3JpdGUtdHJlZSkgfAorCXNlZCAtZSAicy8gYmxvYiAvIC8iID5jdXJyZW50ICYmCisJdGVzdF9jbXAgZXhwZWN0IGN1cnJlbnQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1cGRhdGUgZnJvbSBhIHN1YmRpcmVjdG9yeScgJworCSgKKwkJY2QgZGlyMSAmJgorCQllY2hvIG1vcmUgPnN1YjIgJiYKKwkJZ2l0IGFkZCAtdSBzdWIyCisJKQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGFuZ2UgZ2V0cyBub3RpY2VkJyAnCisKKwl0ZXN0ICIkKGdpdCBkaWZmLWZpbGVzIC0tbmFtZS1zdGF0dXMgZGlyMSkiID0gIiIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZXBsYWNlIGEgZmlsZSB3aXRoIGEgc3ltbGluaycgJworCisJcm0gZm9vICYmCisJbG4gLXMgdG9wIGZvbyAmJgorCWdpdCBhZGQgLXUgLS0gZm9vCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYWRkIGV2ZXJ5dGhpbmcgY2hhbmdlZCcgJworCisJZ2l0IGFkZCAtdSAmJgorCXRlc3QgLXogIiQoZ2l0IGRpZmYtZmlsZXMpIgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3RvdWNoIGFuZCB0aGVuIGFkZCAtdScgJworCisJdG91Y2ggY2hlY2sgJiYKKwlnaXQgYWRkIC11ICYmCisJdGVzdCAteiAiJChnaXQgZGlmZi1maWxlcykiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndG91Y2ggYW5kIHRoZW4gYWRkIGV4cGxpY2l0bHknICcKKworCXRvdWNoIGNoZWNrICYmCisJZ2l0IGFkZCBjaGVjayAmJgorCXRlc3QgLXogIiQoZ2l0IGRpZmYtZmlsZXMpIgorCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MjIwMS1hZGQtdXBkYXRlLXR5cGVjaGFuZ2Uuc2ggYi90L3QyMjAxLWFkZC11cGRhdGUtdHlwZWNoYW5nZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMTVlM2ViCi0tLSAvZGV2L251bGwKKysrIGIvdC90MjIwMS1hZGQtdXBkYXRlLXR5cGVjaGFuZ2Uuc2gKQEAgLTAsMCArMSwxNDAgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdtb3JlIGdpdCBhZGQgLXUnCisKKy4gLi90ZXN0LWxpYi5zaAorCitfejQwPTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJPnh5enp5ICYmCisJX2VtcHR5PSQoZ2l0IGhhc2gtb2JqZWN0IC0tc3RkaW4gPHh5enp5KSAmJgorCT55b21pbiAmJgorCT5jYXNrbHkgJiYKKwlsbiAtcyBmcm90eiBuaXRmb2wgJiYKKwlta2RpciByZXpyb3YgJiYKKwk+cmV6cm92L2JvemJhciAmJgorCWdpdCBhZGQgY2Fza2x5IHh5enp5IHlvbWluIG5pdGZvbCByZXpyb3YvYm96YmFyICYmCisKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIGluaXRpYWwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIG1vZGlmeSAnCisJcm0gLWYgeHl6enkgeW9taW4gbml0Zm9sIGNhc2tseSAmJgorCSMgY2Fza2x5IGRpc2FwcGVhcnMgKG5vdCBhIHN1Ym1vZHVsZSkKKwlta2RpciBjYXNrbHkgJiYKKwkjIG5pdGZvbCBjaGFuZ2VzIGZyb20gc3ltbGluayB0byByZWd1bGFyCisJPm5pdGZvbCAmJgorCSMgcmV6cm92L2JvemJhciBkaXNhcHBlYXJzCisJcm0gLWZyIHJlenJvdiAmJgorCWxuIC1zIHh5enp5IHJlenJvdiAmJgorCSMgeHl6enkgZGlzYXBwZWFycyAobm90IGEgc3VibW9kdWxlKQorCW1rZGlyIHh5enp5ICYmCisJZWNobyBnbnVzdG8gPnh5enp5L2JvemJhciAmJgorCSMgeW9taW4gZ2V0cyByZXBsYWNlZCB3aXRoIGEgc3VibW9kdWxlCisJbWtkaXIgeW9taW4gJiYKKwk+eW9taW4veW9taW4gJiYKKwkoCisJCWNkIHlvbWluICYmCisJCWdpdCBpbml0ICYmCisJCWdpdCBhZGQgeW9taW4gJiYKKwkJZ2l0IGNvbW1pdCAtbSAic3ViIGluaXRpYWwiCisJKSAmJgorCXlvbWluPSQoR0lUX0RJUj15b21pbi8uZ2l0IGdpdCByZXYtcGFyc2UgSEVBRCkgJiYKKwkjIHlvbmsgaXMgYWRkZWQgYW5kIHRoZW4gdHVybmVkIGludG8gYSBzdWJtb2R1bGUKKwkjIHRoaXMgc2hvdWxkIGFwcGVhciBhcyBUIGluIGRpZmYtZmlsZXMgYW5kIGFzIEEgaW4gZGlmZi1pbmRleAorCT55b25rICYmCisJZ2l0IGFkZCB5b25rICYmCisJcm0gLWYgeW9uayAmJgorCW1rZGlyIHlvbmsgJiYKKwk+eW9uay95b25rICYmCisJKAorCQljZCB5b25rICYmCisJCWdpdCBpbml0ICYmCisJCWdpdCBhZGQgeW9uayAmJgorCQlnaXQgY29tbWl0IC1tICJzdWIgaW5pdGlhbCIKKwkpICYmCisJeW9uaz0kKEdJVF9ESVI9eW9uay8uZ2l0IGdpdCByZXYtcGFyc2UgSEVBRCkgJiYKKwkjIHppZm1pYSBpcyBhZGRlZCBhbmQgdGhlbiByZW1vdmVkCisJIyB0aGlzIHNob3VsZCBhcHBlYXIgaW4gZGlmZi1maWxlcyBidXQgbm90IGluIGRpZmYtaW5kZXguCisJPnppZm1pYSAmJgorCWdpdCBhZGQgemlmbWlhICYmCisJcm0gLWYgemlmbWlhICYmCisJbWtkaXIgemlmbWlhICYmCisJeworCQlnaXQgbHMtdHJlZSAtciBIRUFEIHwKKwkJc2VkIC1lICJzL14vOi8iIC1lICIKKwkJCS8JY2Fza2x5L3sKKwkJCQlzLwljYXNrbHkvICRfejQwIEQmLworCQkJCXMvYmxvYi8wMDAwMDAvCisJCQl9CisJCQkvCW5pdGZvbC97CisJCQkJcy8Jbml0Zm9sLyAkX3o0MCBUJi8KKwkJCQlzL2Jsb2IvMTAwNjQ0LworCQkJfQorCQkJLwlyZXpyb3YuYm96YmFyL3sKKwkJCQlzLwlyZXpyb3YuYm96YmFyLyAkX3o0MCBEJi8KKwkJCQlzL2Jsb2IvMDAwMDAwLworCQkJfQorCQkJLwl4eXp6eS97CisJCQkJcy8JeHl6enkvICRfejQwIEQmLworCQkJCXMvYmxvYi8wMDAwMDAvCisJCQl9CisJCQkvCXlvbWluL3sKKwkJCSAgICBzLwl5b21pbi8gJF96NDAgVCYvCisJCQkJcy9ibG9iLzE2MDAwMC8KKwkJCX0KKwkJIgorCX0gPmV4cGVjdCAmJgorCXsKKwkJY2F0IGV4cGVjdAorCQllY2hvICI6MTAwNjQ0IDE2MDAwMCAkX2VtcHR5ICRfejQwIFQJeW9uayIKKwkJZWNobyAiOjEwMDY0NCAwMDAwMDAgJF9lbXB0eSAkX3o0MCBECXppZm1pYSIKKwl9ID5leHBlY3QtZmlsZXMgJiYKKwl7CisJCWNhdCBleHBlY3QKKwkJZWNobyAiOjAwMDAwMCAxNjAwMDAgJF96NDAgJF96NDAgQQl5b25rIgorCX0gPmV4cGVjdC1pbmRleCAmJgorCXsKKwkJZWNobyAiMTAwNjQ0ICRfZW1wdHkgMAluaXRmb2wiCisJCWVjaG8gIjE2MDAwMCAkeW9taW4gMAl5b21pbiIKKwkJZWNobyAiMTYwMDAwICR5b25rIDAJeW9uayIKKwl9ID5leHBlY3QtZmluYWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBkaWZmLWZpbGVzICcKKwlnaXQgZGlmZi1maWxlcyAtLXJhdyA+YWN0dWFsICYmCisJZGlmZiAtdSBleHBlY3QtZmlsZXMgYWN0dWFsCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgZGlmZi1pbmRleCAnCisJZ2l0IGRpZmYtaW5kZXggLS1yYXcgSEVBRCAtLSA+YWN0dWFsICYmCisJZGlmZiAtdSBleHBlY3QtaW5kZXggYWN0dWFsCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FkZCAtdScgJworCXJtIC1mICIuZ2l0L3NhdmVkLWluZGV4IiAmJgorCWNwIC1wICIuZ2l0L2luZGV4IiAiLmdpdC9zYXZlZC1pbmRleCIgJiYKKwlnaXQgYWRkIC11ICYmCisJZ2l0IGxzLWZpbGVzIC1zID5hY3R1YWwgJiYKKwlkaWZmIC11IGV4cGVjdC1maW5hbCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY29tbWl0IC1hJyAnCisJaWYgdGVzdCAtZiAiLmdpdC9zYXZlZC1pbmRleCIKKwl0aGVuCisJCXJtIC1mICIuZ2l0L2luZGV4IiAmJgorCQltdiAiLmdpdC9zYXZlZC1pbmRleCIgIi5naXQvaW5kZXgiCisJZmkgJiYKKwlnaXQgY29tbWl0IC1tICJzZWNvbmQiIC1hICYmCisJZ2l0IGxzLWZpbGVzIC1zID5hY3R1YWwgJiYKKwlkaWZmIC11IGV4cGVjdC1maW5hbCBhY3R1YWwgJiYKKwlybSAtZiAuZ2l0L2luZGV4ICYmCisJZ2l0IHJlYWQtdHJlZSBIRUFEICYmCisJZ2l0IGxzLWZpbGVzIC1zID5hY3R1YWwgJiYKKwlkaWZmIC11IGV4cGVjdC1maW5hbCBhY3R1YWwKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzMDAwLWxzLWZpbGVzLW90aGVycy5zaCBiL3QvdDMwMDAtbHMtZmlsZXMtb3RoZXJzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJjMGEzNTEKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzMDAwLWxzLWZpbGVzLW90aGVycy5zaApAQCAtMCwwICsxLDU2IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBscy1maWxlcyB0ZXN0ICgtLW90aGVycyBzaG91bGQgcGljayB1cCBzeW1saW5rcykuCisKK1RoaXMgdGVzdCBydW5zIGdpdCBscy1maWxlcyAtLW90aGVycyB3aXRoIHRoZSBmb2xsb3dpbmcgb24gdGhlCitmaWxlc3lzdGVtLgorCisgICAgcGF0aDAgICAgICAgLSBhIGZpbGUKKyAgICBwYXRoMQktIGEgc3ltbGluaworICAgIHBhdGgyL2ZpbGUyIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDMtanVuayAgLSBhIGZpbGUgdG8gY29uZnVzZSB0aGluZ3MKKyAgICBwYXRoMy9maWxlMyAtIGEgZmlsZSBpbiBhIGRpcmVjdG9yeQorJworLiAuL3Rlc3QtbGliLnNoCisKK2RhdGUgPnBhdGgwCitsbiAtcyB4eXp6eSBwYXRoMQorbWtkaXIgcGF0aDIgcGF0aDMKK2RhdGUgPnBhdGgyL2ZpbGUyCitkYXRlID5wYXRoMi1qdW5rCitkYXRlID5wYXRoMy9maWxlMworZGF0ZSA+cGF0aDMtanVuaworZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMy1qdW5rIHBhdGgzL2ZpbGUzCisKK2NhdCA+ZXhwZWN0ZWQxIDw8RU9GCitleHBlY3RlZDEKK2V4cGVjdGVkMgorb3V0cHV0CitwYXRoMAorcGF0aDEKK3BhdGgyLWp1bmsKK3BhdGgyL2ZpbGUyCitFT0YKK3NlZCAtZSAnc3xwYXRoMi9maWxlMnxwYXRoMi98JyA8ZXhwZWN0ZWQxID5leHBlY3RlZDIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBscy1maWxlcyAtLW90aGVycyB0byBzaG93IG91dHB1dC4nIFwKKyAgICAnZ2l0IGxzLWZpbGVzIC0tb3RoZXJzID5vdXRwdXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgbHMtZmlsZXMgLS1vdGhlcnMgc2hvdWxkIHBpY2sgdXAgc3ltbGlua3MuJyBcCisgICAgJ2RpZmYgb3V0cHV0IGV4cGVjdGVkMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBscy1maWxlcyAtLW90aGVycyAtLWRpcmVjdG9yeSB0byBzaG93IG91dHB1dC4nIFwKKyAgICAnZ2l0IGxzLWZpbGVzIC0tb3RoZXJzIC0tZGlyZWN0b3J5ID5vdXRwdXQnCisKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBscy1maWxlcyAtLW90aGVycyAtLWRpcmVjdG9yeSBzaG91bGQgbm90IGdldCBjb25mdXNlZC4nIFwKKyAgICAnZGlmZiBvdXRwdXQgZXhwZWN0ZWQyJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDMwMDEtbHMtZmlsZXMtb3RoZXJzLWV4Y2x1ZGUuc2ggYi90L3QzMDAxLWxzLWZpbGVzLW90aGVycy1leGNsdWRlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU1ZjA1N2MKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzMDAxLWxzLWZpbGVzLW90aGVycy1leGNsdWRlLnNoCkBAIC0wLDAgKzEsMTQzIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBscy1maWxlcyAtLW90aGVycyAtLWV4Y2x1ZGUKKworVGhpcyB0ZXN0IHJ1bnMgZ2l0IGxzLWZpbGVzIC0tb3RoZXJzIGFuZCB0ZXN0cyAtLWV4Y2x1ZGUgcGF0dGVybnMuCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCitybSAtZnIgb25lIHRocmVlCitmb3IgZGlyIGluIC4gb25lIG9uZS90d28gdGhyZWUKK2RvCisgIG1rZGlyIC1wICRkaXIgJiYKKyAgZm9yIGkgaW4gMSAyIDMgNCA1IDYgNyA4CisgIGRvCisgICAgPiRkaXIvYS4kaQorICBkb25lCitkb25lCisKK2NhdCA+ZXhwZWN0IDw8RU9GCithLjIKK2EuNAorYS41CithLjgKK29uZS9hLjMKK29uZS9hLjQKK29uZS9hLjUKK29uZS9hLjcKK29uZS90d28vYS4yCitvbmUvdHdvL2EuMworb25lL3R3by9hLjUKK29uZS90d28vYS43CitvbmUvdHdvL2EuOAordGhyZWUvYS4yCit0aHJlZS9hLjMKK3RocmVlL2EuNAordGhyZWUvYS41Cit0aHJlZS9hLjgKK0VPRgorCitlY2hvICcuZ2l0aWdub3JlCitvdXRwdXQKK2V4cGVjdAorLmdpdGlnbm9yZQorKi43CishKi44JyA+LmdpdC9pZ25vcmUKKworZWNobyAnKi4xCisvKi4zCishKi42JyA+LmdpdGlnbm9yZQorZWNobyAnKi4yCit0d28vKi40CishKi43CisqLjgnID5vbmUvLmdpdGlnbm9yZQorZWNobyAnISouMgorISouOCcgPm9uZS90d28vLmdpdGlnbm9yZQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0IGxzLWZpbGVzIC0tb3RoZXJzIHdpdGggdmFyaW91cyBleGNsdWRlIG9wdGlvbnMuJyBcCisgICAgJ2dpdCBscy1maWxlcyAtLW90aGVycyBcCisgICAgICAgLS1leGNsdWRlPVwqLjYgXAorICAgICAgIC0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PS5naXRpZ25vcmUgXAorICAgICAgIC0tZXhjbHVkZS1mcm9tPS5naXQvaWdub3JlIFwKKyAgICAgICA+b3V0cHV0ICYmCisgICAgIGdpdCBkaWZmIGV4cGVjdCBvdXRwdXQnCisKKyMgVGVzdCBcclxuIChNU0RPUy1saWtlIHN5c3RlbXMpCitwcmludGYgJyouMVxyXG4vKi4zXHJcbiEqLjZcclxuJyA+LmdpdGlnbm9yZQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0IGxzLWZpbGVzIC0tb3RoZXJzIHdpdGggXHJcbiBsaW5lIGVuZGluZ3MuJyBcCisgICAgJ2dpdCBscy1maWxlcyAtLW90aGVycyBcCisgICAgICAgLS1leGNsdWRlPVwqLjYgXAorICAgICAgIC0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PS5naXRpZ25vcmUgXAorICAgICAgIC0tZXhjbHVkZS1mcm9tPS5naXQvaWdub3JlIFwKKyAgICAgICA+b3V0cHV0ICYmCisgICAgIGdpdCBkaWZmIGV4cGVjdCBvdXRwdXQnCisKK2NhdCA+IGV4Y2x1ZGVzLWZpbGUgPDwgRU9GCisqLlsxLThdCitlKgorRU9GCisKK2dpdCBjb25maWcgY29yZS5leGNsdWRlc0ZpbGUgZXhjbHVkZXMtZmlsZQorCitnaXQgc3RhdHVzIHwgZ3JlcCAiXiMJIiA+IG91dHB1dAorCitjYXQgPiBleHBlY3QgPDwgRU9GCisjCS5naXRpZ25vcmUKKyMJYS42CisjCW9uZS8KKyMJb3V0cHV0CisjCXRocmVlLworRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1zdGF0dXMgaG9ub3VycyBjb3JlLmV4Y2x1ZGVzZmlsZScgXAorCSd0ZXN0X2NtcCBleHBlY3Qgb3V0cHV0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0cmFpbGluZyBzbGFzaCBpbiBleGNsdWRlIGFsbG93cyBkaXJlY3RvcnkgbWF0Y2goMSknICcKKworCWdpdCBscy1maWxlcyAtLW90aGVycyAtLWV4Y2x1ZGU9b25lLyA+b3V0cHV0ICYmCisJaWYgZ3JlcCAiXm9uZS8iIG91dHB1dAorCXRoZW4KKwkJZWNobyBPb29wcworCQlmYWxzZQorCWVsc2UKKwkJOiBoYXBweQorCWZpCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndHJhaWxpbmcgc2xhc2ggaW4gZXhjbHVkZSBhbGxvd3MgZGlyZWN0b3J5IG1hdGNoICgyKScgJworCisJZ2l0IGxzLWZpbGVzIC0tb3RoZXJzIC0tZXhjbHVkZT1vbmUvdHdvLyA+b3V0cHV0ICYmCisJaWYgZ3JlcCAiXm9uZS90d28vIiBvdXRwdXQKKwl0aGVuCisJCWVjaG8gT29vcHMKKwkJZmFsc2UKKwllbHNlCisJCTogaGFwcHkKKwlmaQorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3RyYWlsaW5nIHNsYXNoIGluIGV4Y2x1ZGUgZm9yY2VzIGRpcmVjdG9yeSBtYXRjaCAoMSknICcKKworCT50d28KKwlnaXQgbHMtZmlsZXMgLS1vdGhlcnMgLS1leGNsdWRlPXR3by8gPm91dHB1dCAmJgorCWdyZXAgIl50d28iIG91dHB1dAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3RyYWlsaW5nIHNsYXNoIGluIGV4Y2x1ZGUgZm9yY2VzIGRpcmVjdG9yeSBtYXRjaCAoMiknICcKKworCWdpdCBscy1maWxlcyAtLW90aGVycyAtLWV4Y2x1ZGU9b25lL2EuMS8gPm91dHB1dCAmJgorCWdyZXAgIl5vbmUvYS4xIiBvdXRwdXQKKworJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDMwMDItbHMtZmlsZXMtZGFzaHBhdGguc2ggYi90L3QzMDAyLWxzLWZpbGVzLWRhc2hwYXRoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg2ODdhMDEKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzMDAyLWxzLWZpbGVzLWRhc2hwYXRoLnNoCkBAIC0wLDAgKzEsNjkgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IGxzLWZpbGVzIHRlc3QgKC0tIHRvIHRlcm1pbmF0ZSB0aGUgcGF0aCBsaXN0KS4KKworVGhpcyB0ZXN0IHJ1bnMgZ2l0IGxzLWZpbGVzIC0tb3RoZXJzIHdpdGggdGhlIGZvbGxvd2luZyBvbiB0aGUKK2ZpbGVzeXN0ZW0uCisKKyAgICBwYXRoMCAgICAgICAtIGEgZmlsZQorICAgIC1mb28JLSBhIGZpbGUgd2l0aCBhIGZ1bm55IG5hbWUuCisgICAgLS0JCS0gYW5vdGhlciBmaWxlIHdpdGggYSBmdW5ueSBuYW1lLgorJworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCXNldHVwIFwKKwknZWNobyBmcm90eiA+cGF0aDAgJiYKKwllY2hvIGZyb3R6ID4uLy1mb28gJiYKKwllY2hvIGZyb3R6ID4uLy0tJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0IGxzLWZpbGVzIHdpdGhvdXQgcGF0aCByZXN0cmljdGlvbi4nIFwKKyAgICAnZ2l0IGxzLWZpbGVzIC0tb3RoZXJzID5vdXRwdXQgJiYKKyAgICAgZ2l0IGRpZmYgb3V0cHV0IC0gPDxFT0YKKy0tCistZm9vCitvdXRwdXQKK3BhdGgwCitFT0YKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBscy1maWxlcyB3aXRoIHBhdGggcmVzdHJpY3Rpb24uJyBcCisgICAgJ2dpdCBscy1maWxlcyAtLW90aGVycyBwYXRoMCA+b3V0cHV0ICYmCisJZ2l0IGRpZmYgb3V0cHV0IC0gPDxFT0YKK3BhdGgwCitFT0YKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBscy1maWxlcyB3aXRoIHBhdGggcmVzdHJpY3Rpb24gd2l0aCAtLS4nIFwKKyAgICAnZ2l0IGxzLWZpbGVzIC0tb3RoZXJzIC0tIHBhdGgwID5vdXRwdXQgJiYKKwlnaXQgZGlmZiBvdXRwdXQgLSA8PEVPRgorcGF0aDAKK0VPRgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0IGxzLWZpbGVzIHdpdGggcGF0aCByZXN0cmljdGlvbiB3aXRoIC0tIC0tLicgXAorICAgICdnaXQgbHMtZmlsZXMgLS1vdGhlcnMgLS0gLS0gPm91dHB1dCAmJgorCWdpdCBkaWZmIG91dHB1dCAtIDw8RU9GCistLQorRU9GCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgbHMtZmlsZXMgd2l0aCBubyBwYXRoIHJlc3RyaWN0aW9uLicgXAorICAgICdnaXQgbHMtZmlsZXMgLS1vdGhlcnMgLS0gPm91dHB1dCAmJgorCWdpdCBkaWZmIG91dHB1dCAtIDw8RU9GCistLQorLWZvbworb3V0cHV0CitwYXRoMAorRU9GCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzAxMC1scy1maWxlcy1raWxsZWQtbW9kaWZpZWQuc2ggYi90L3QzMDEwLWxzLWZpbGVzLWtpbGxlZC1tb2RpZmllZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYzE0MDQwCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzAxMC1scy1maWxlcy1raWxsZWQtbW9kaWZpZWQuc2gKQEAgLTAsMCArMSw5NiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgbHMtZmlsZXMgLWsgYW5kIC1tIGZsYWdzIHRlc3QuCisKK1RoaXMgdGVzdCBwcmVwYXJlcyB0aGUgZm9sbG93aW5nIGluIHRoZSBjYWNoZToKKworICAgIHBhdGgwICAgICAgIC0gYSBmaWxlCisgICAgcGF0aDEgICAgICAgLSBhIHN5bWxpbmsKKyAgICBwYXRoMi9maWxlMiAtIGEgZmlsZSBpbiBhIGRpcmVjdG9yeQorICAgIHBhdGgzL2ZpbGUzIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisKK2FuZCB0aGUgZm9sbG93aW5nIG9uIHRoZSBmaWxlc3lzdGVtOgorCisgICAgcGF0aDAvZmlsZTAgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKyAgICBwYXRoMS9maWxlMSAtIGEgZmlsZSBpbiBhIGRpcmVjdG9yeQorICAgIHBhdGgyICAgICAgIC0gYSBmaWxlCisgICAgcGF0aDMgICAgICAgLSBhIHN5bWxpbmsKKyAgICBwYXRoNAktIGEgZmlsZQorICAgIHBhdGg1CS0gYSBzeW1saW5rCisgICAgcGF0aDYvZmlsZTYgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKworZ2l0IGxzLWZpbGVzIC1rIHNob3VsZCByZXBvcnQgdGhhdCBleGlzdGluZyBmaWxlc3lzdGVtCitvYmplY3RzIGV4Y2VwdCBwYXRoNCwgcGF0aDUgYW5kIHBhdGg2L2ZpbGU2IHRvIGJlIGtpbGxlZC4KKworQWxzbyBmb3IgbW9kaWZpY2F0aW9uIHRlc3QsIHRoZSBjYWNoZSBhbmQgd29ya2luZyB0cmVlIGhhdmU6CisKKyAgICBwYXRoNyAgICAgICAtIGFuIGVtcHR5IGZpbGUsIG1vZGlmaWVkIHRvIGEgbm9uLWVtcHR5IGZpbGUuCisgICAgcGF0aDggICAgICAgLSBhIG5vbi1lbXB0eSBmaWxlLCBtb2RpZmllZCB0byBhbiBlbXB0eSBmaWxlLgorICAgIHBhdGg5CS0gYW4gZW1wdHkgZmlsZSwgY2FjaGUgZGlydGllZC4KKyAgICBwYXRoMTAJLSBhIG5vbi1lbXB0eSBmaWxlLCBjYWNoZSBkaXJ0aWVkLgorCitXZSBzaG91bGQgcmVwb3J0IHBhdGgwLCBwYXRoMSwgcGF0aDIvZmlsZTIsIHBhdGgzL2ZpbGUzLCBwYXRoNyBhbmQgcGF0aDgKK21vZGlmaWVkIHdpdGhvdXQgcmVwb3J0aW5nIHBhdGg5IGFuZCBwYXRoMTAuCisnCisuIC4vdGVzdC1saWIuc2gKKworZGF0ZSA+cGF0aDAKK2xuIC1zIHh5enp5IHBhdGgxCitta2RpciBwYXRoMiBwYXRoMworZGF0ZSA+cGF0aDIvZmlsZTIKK2RhdGUgPnBhdGgzL2ZpbGUzCis6ID5wYXRoNworZGF0ZSA+cGF0aDgKKzogPnBhdGg5CitkYXRlID5wYXRoMTAKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgdXBkYXRlLWluZGV4IC0tYWRkIHRvIGFkZCB2YXJpb3VzIHBhdGhzLicgXAorICAgICJnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tIHBhdGgwIHBhdGgxIHBhdGg/L2ZpbGU/IHBhdGg3IHBhdGg4IHBhdGg5IHBhdGgxMCIKKworcm0gLWZyIHBhdGg/IDsjIGxlYXZlIHBhdGgxMCBhbG9uZQorZGF0ZSA+cGF0aDIKK2xuIC1zIGZyb3R6IHBhdGgzCitsbiAtcyBuaXRmb2wgcGF0aDUKK21rZGlyIHBhdGgwIHBhdGgxIHBhdGg2CitkYXRlID5wYXRoMC9maWxlMAorZGF0ZSA+cGF0aDEvZmlsZTEKK2RhdGUgPnBhdGg2L2ZpbGU2CitkYXRlID5wYXRoNworOiA+cGF0aDgKKzogPnBhdGg5Cit0b3VjaCBwYXRoMTAKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBscy1maWxlcyAtayB0byBzaG93IGtpbGxlZCBmaWxlcy4nIFwKKyAgICAnZ2l0IGxzLWZpbGVzIC1rID4ub3V0cHV0JworY2F0ID4uZXhwZWN0ZWQgPDxFT0YKK3BhdGgwL2ZpbGUwCitwYXRoMS9maWxlMQorcGF0aDIKK3BhdGgzCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIGdpdCBscy1maWxlcyAtayBvdXRwdXQuJyBcCisgICAgJ2RpZmYgLm91dHB1dCAuZXhwZWN0ZWQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgbHMtZmlsZXMgLW0gdG8gc2hvdyBtb2RpZmllZCBmaWxlcy4nIFwKKyAgICAnZ2l0IGxzLWZpbGVzIC1tID4ub3V0cHV0JworY2F0ID4uZXhwZWN0ZWQgPDxFT0YKK3BhdGgwCitwYXRoMQorcGF0aDIvZmlsZTIKK3BhdGgzL2ZpbGUzCitwYXRoNworcGF0aDgKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgZ2l0IGxzLWZpbGVzIC1tIG91dHB1dC4nIFwKKyAgICAnZGlmZiAub3V0cHV0IC5leHBlY3RlZCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzMDIwLWxzLWZpbGVzLWVycm9yLXVubWF0Y2guc2ggYi90L3QzMDIwLWxzLWZpbGVzLWVycm9yLXVubWF0Y2guc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjRkYTg2OQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDMwMjAtbHMtZmlsZXMtZXJyb3ItdW5tYXRjaC5zaApAQCAtMCwwICsxLDI3IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IENhcmwgRC4gV29ydGgKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IGxzLWZpbGVzIHRlc3QgZm9yIC0tZXJyb3ItdW5tYXRjaCBvcHRpb24KKworVGhpcyB0ZXN0IHJ1bnMgZ2l0IGxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCB0byBlbnN1cmUgaXQgY29ycmVjdGx5CityZXR1cm5zIGFuIGVycm9yIHdoZW4gYSBub24tZXhpc3RlbnQgcGF0aCBpcyBwcm92aWRlZCBvbiB0aGUgY29tbWFuZAorbGluZS4KKycKKy4gLi90ZXN0LWxpYi5zaAorCit0b3VjaCBmb28gYmFyCitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGZvbyBiYXIKK2dpdC1jb21taXQgLW0gImFkZCBmb28gYmFyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0IGxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCBzaG91bGQgZmFpbCB3aXRoIHVubWF0Y2hlZCBwYXRoLicgXAorICAgICchIGdpdCBscy1maWxlcyAtLWVycm9yLXVubWF0Y2ggZm9vIGJhci1kb2VzLW5vdC1tYXRjaCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBscy1maWxlcyAtLWVycm9yLXVubWF0Y2ggc2hvdWxkIHN1Y2NlZWQgZWl0aCBtYXRjaGVkIHBhdGhzLicgXAorICAgICdnaXQgbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIGZvbyBiYXInCisKK3Rlc3RfZG9uZQorMQpkaWZmIC0tZ2l0IGEvdC90MzAzMC1tZXJnZS1yZWN1cnNpdmUuc2ggYi90L3QzMDMwLW1lcmdlLXJlY3Vyc2l2ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MDdmNTdmCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzAzMC1tZXJnZS1yZWN1cnNpdmUuc2gKQEAgLTAsMCArMSw1MjcgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdtZXJnZS1yZWN1cnNpdmUgYmFja2VuZCB0ZXN0JworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgMScgJworCisJZWNobyBoZWxsbyA+YSAmJgorCW8wPSQoZ2l0IGhhc2gtb2JqZWN0IGEpICYmCisJY3AgYSBiICYmCisJY3AgYSBjICYmCisJbWtkaXIgZCAmJgorCWNwIGEgZC9lICYmCisKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgYWRkIGEgYiBjIGQvZSAmJgorCWdpdCBjb21taXQgLW0gaW5pdGlhbCAmJgorCWMwPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSAmJgorCWdpdCBicmFuY2ggc2lkZSAmJgorCWdpdCBicmFuY2ggZGYtMSAmJgorCWdpdCBicmFuY2ggZGYtMiAmJgorCWdpdCBicmFuY2ggZGYtMyAmJgorCWdpdCBicmFuY2ggcmVtb3ZlICYmCisKKwllY2hvIGhlbGxvID4+YSAmJgorCWNwIGEgZC9lICYmCisJbzE9JChnaXQgaGFzaC1vYmplY3QgYSkgJiYKKworCWdpdCBhZGQgYSBkL2UgJiYKKworCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gIm1hc3RlciBtb2RpZmllcyBhIGFuZCBkL2UiICYmCisJYzE9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisJKCBnaXQgbHMtdHJlZSAtciBIRUFEIDsgZ2l0IGxzLWZpbGVzIC1zICkgPmFjdHVhbCAmJgorCSgKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8xCWEiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMAliIgorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJYyIKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8xCWQvZSIKKwkJZWNobyAiMTAwNjQ0ICRvMSAwCWEiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAliIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYyIKKwkJZWNobyAiMTAwNjQ0ICRvMSAwCWQvZSIKKwkpID5leHBlY3RlZCAmJgorCWdpdCBkaWZmIC11IGV4cGVjdGVkIGFjdHVhbAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCAyJyAnCisKKwlybSAtcmYgW2FiY2RdICYmCisJZ2l0IGNoZWNrb3V0IHNpZGUgJiYKKwkoIGdpdCBscy10cmVlIC1yIEhFQUQgOyBnaXQgbHMtZmlsZXMgLXMgKSA+YWN0dWFsICYmCisJKAorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJYSIKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8wCWIiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMAljIgorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJZC9lIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYSIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWIiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAljIgorCQllY2hvICIxMDA2NDQgJG8wIDAJZC9lIgorCSkgPmV4cGVjdGVkICYmCisJZ2l0IGRpZmYgLXUgZXhwZWN0ZWQgYWN0dWFsICYmCisKKwllY2hvIGdvb2RieWUgPj5hICYmCisJbzI9JChnaXQgaGFzaC1vYmplY3QgYSkgJiYKKworCWdpdCBhZGQgYSAmJgorCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSAic2lkZSBtb2RpZmllcyBhIiAmJgorCWMyPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSAmJgorCSggZ2l0IGxzLXRyZWUgLXIgSEVBRCA7IGdpdCBscy1maWxlcyAtcyApID5hY3R1YWwgJiYKKwkoCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMglhIgorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJYiIKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8wCWMiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMAlkL2UiCisJCWVjaG8gIjEwMDY0NCAkbzIgMAlhIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYiIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWMiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAlkL2UiCisJKSA+ZXhwZWN0ZWQgJiYKKwlnaXQgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgMycgJworCisJcm0gLXJmIFthYmNkXSAmJgorCWdpdCBjaGVja291dCBkZi0xICYmCisJKCBnaXQgbHMtdHJlZSAtciBIRUFEIDsgZ2l0IGxzLWZpbGVzIC1zICkgPmFjdHVhbCAmJgorCSgKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8wCWEiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMAliIgorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJYyIKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8wCWQvZSIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWEiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAliIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYyIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWQvZSIKKwkpID5leHBlY3RlZCAmJgorCWdpdCBkaWZmIC11IGV4cGVjdGVkIGFjdHVhbCAmJgorCisJcm0gLWYgYiAmJiBta2RpciBiICYmIGVjaG8gZGYtMSA+Yi9jICYmIGdpdCBhZGQgYi9jICYmCisJbzM9JChnaXQgaGFzaC1vYmplY3QgYi9jKSAmJgorCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSAiZGYtMSBtYWtlcyBiL2MiICYmCisJYzM9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisJKCBnaXQgbHMtdHJlZSAtciBIRUFEIDsgZ2l0IGxzLWZpbGVzIC1zICkgPmFjdHVhbCAmJgorCSgKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8wCWEiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMwliL2MiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMAljIgorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJZC9lIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYSIKKwkJZWNobyAiMTAwNjQ0ICRvMyAwCWIvYyIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWMiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAlkL2UiCisJKSA+ZXhwZWN0ZWQgJiYKKwlnaXQgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgNCcgJworCisJcm0gLXJmIFthYmNkXSAmJgorCWdpdCBjaGVja291dCBkZi0yICYmCisJKCBnaXQgbHMtdHJlZSAtciBIRUFEIDsgZ2l0IGxzLWZpbGVzIC1zICkgPmFjdHVhbCAmJgorCSgKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8wCWEiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMAliIgorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJYyIKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8wCWQvZSIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWEiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAliIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYyIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWQvZSIKKwkpID5leHBlY3RlZCAmJgorCWdpdCBkaWZmIC11IGV4cGVjdGVkIGFjdHVhbCAmJgorCisJcm0gLWYgYSAmJiBta2RpciBhICYmIGVjaG8gZGYtMiA+YS9jICYmIGdpdCBhZGQgYS9jICYmCisJbzQ9JChnaXQgaGFzaC1vYmplY3QgYS9jKSAmJgorCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSAiZGYtMiBtYWtlcyBhL2MiICYmCisJYzQ9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisJKCBnaXQgbHMtdHJlZSAtciBIRUFEIDsgZ2l0IGxzLWZpbGVzIC1zICkgPmFjdHVhbCAmJgorCSgKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG80CWEvYyIKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8wCWIiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMAljIgorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJZC9lIgorCQllY2hvICIxMDA2NDQgJG80IDAJYS9jIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYiIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWMiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAlkL2UiCisJKSA+ZXhwZWN0ZWQgJiYKKwlnaXQgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgNScgJworCisJcm0gLXJmIFthYmNkXSAmJgorCWdpdCBjaGVja291dCByZW1vdmUgJiYKKwkoIGdpdCBscy10cmVlIC1yIEhFQUQgOyBnaXQgbHMtZmlsZXMgLXMgKSA+YWN0dWFsICYmCisJKAorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJYSIKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8wCWIiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMAljIgorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJZC9lIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYSIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWIiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAljIgorCQllY2hvICIxMDA2NDQgJG8wIDAJZC9lIgorCSkgPmV4cGVjdGVkICYmCisJZ2l0IGRpZmYgLXUgZXhwZWN0ZWQgYWN0dWFsICYmCisKKwlybSAtZiBiICYmCisJZWNobyByZW1vdmUtY29uZmxpY3QgPmEgJiYKKworCWdpdCBhZGQgYSAmJgorCWdpdCBybSBiICYmCisJbzU9JChnaXQgaGFzaC1vYmplY3QgYSkgJiYKKworCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gInJlbW92ZSByZW1vdmVzIGIgYW5kIG1vZGlmaWVzIGEiICYmCisJYzU9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisJKCBnaXQgbHMtdHJlZSAtciBIRUFEIDsgZ2l0IGxzLWZpbGVzIC1zICkgPmFjdHVhbCAmJgorCSgKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG81CWEiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMAljIgorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJZC9lIgorCQllY2hvICIxMDA2NDQgJG81IDAJYSIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWMiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAlkL2UiCisJKSA+ZXhwZWN0ZWQgJiYKKwlnaXQgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCA2JyAnCisKKwlybSAtcmYgW2FiY2RdICYmCisJZ2l0IGNoZWNrb3V0IGRmLTMgJiYKKwkoIGdpdCBscy10cmVlIC1yIEhFQUQgOyBnaXQgbHMtZmlsZXMgLXMgKSA+YWN0dWFsICYmCisJKAorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJYSIKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8wCWIiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMAljIgorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJZC9lIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYSIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWIiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAljIgorCQllY2hvICIxMDA2NDQgJG8wIDAJZC9lIgorCSkgPmV4cGVjdGVkICYmCisJZ2l0IGRpZmYgLXUgZXhwZWN0ZWQgYWN0dWFsICYmCisKKwlybSAtZnIgZCAmJiBlY2hvIGRmLTMgPmQgJiYgZ2l0IGFkZCBkICYmCisJbzY9JChnaXQgaGFzaC1vYmplY3QgZCkgJiYKKworCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gImRmLTMgbWFrZXMgZCIgJiYKKwljNj0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkgJiYKKwkoIGdpdCBscy10cmVlIC1yIEhFQUQgOyBnaXQgbHMtZmlsZXMgLXMgKSA+YWN0dWFsICYmCisJKAorCQllY2hvICIxMDA2NDQgYmxvYiAkbzAJYSIKKwkJZWNobyAiMTAwNjQ0IGJsb2IgJG8wCWIiCisJCWVjaG8gIjEwMDY0NCBibG9iICRvMAljIgorCQllY2hvICIxMDA2NDQgYmxvYiAkbzYJZCIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWEiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAliIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYyIKKwkJZWNobyAiMTAwNjQ0ICRvNiAwCWQiCisJKSA+ZXhwZWN0ZWQgJiYKKwlnaXQgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UtcmVjdXJzaXZlIHNpbXBsZScgJworCisJcm0gLWZyIFthYmNkXSAmJgorCWdpdCBjaGVja291dCAtZiAiJGMyIiAmJgorCisJZ2l0LW1lcmdlLXJlY3Vyc2l2ZSAiJGMwIiAtLSAiJGMyIiAiJGMxIgorCXN0YXR1cz0kPworCWNhc2UgIiRzdGF0dXMiIGluCisJMSkKKwkJOiBoYXBweQorCQk7OworCSopCisJCWVjaG8gPiYyICJ3aHkgc3RhdHVzICRzdGF0dXMhISEiCisJCWZhbHNlCisJCTs7CisJZXNhYworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1yZWN1cnNpdmUgcmVzdWx0JyAnCisKKwlnaXQgbHMtZmlsZXMgLXMgPmFjdHVhbCAmJgorCSgKKwkJZWNobyAiMTAwNjQ0ICRvMCAxCWEiCisJCWVjaG8gIjEwMDY0NCAkbzIgMglhIgorCQllY2hvICIxMDA2NDQgJG8xIDMJYSIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWIiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAljIgorCQllY2hvICIxMDA2NDQgJG8xIDAJZC9lIgorCSkgPmV4cGVjdGVkICYmCisJZ2l0IGRpZmYgLXUgZXhwZWN0ZWQgYWN0dWFsCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UtcmVjdXJzaXZlIHJlbW92ZSBjb25mbGljdCcgJworCisJcm0gLWZyIFthYmNkXSAmJgorCWdpdCBjaGVja291dCAtZiAiJGMxIiAmJgorCisJZ2l0LW1lcmdlLXJlY3Vyc2l2ZSAiJGMwIiAtLSAiJGMxIiAiJGM1IgorCXN0YXR1cz0kPworCWNhc2UgIiRzdGF0dXMiIGluCisJMSkKKwkJOiBoYXBweQorCQk7OworCSopCisJCWVjaG8gPiYyICJ3aHkgc3RhdHVzICRzdGF0dXMhISEiCisJCWZhbHNlCisJCTs7CisJZXNhYworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1yZWN1cnNpdmUgcmVtb3ZlIGNvbmZsaWN0JyAnCisKKwlnaXQgbHMtZmlsZXMgLXMgPmFjdHVhbCAmJgorCSgKKwkJZWNobyAiMTAwNjQ0ICRvMCAxCWEiCisJCWVjaG8gIjEwMDY0NCAkbzEgMglhIgorCQllY2hvICIxMDA2NDQgJG81IDMJYSIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWMiCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlkL2UiCisJKSA+ZXhwZWN0ZWQgJiYKKwlnaXQgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1yZWN1cnNpdmUgZC9mIHNpbXBsZScgJworCXJtIC1mciBbYWJjZF0gJiYKKwlnaXQgcmVzZXQgLS1oYXJkICYmCisJZ2l0IGNoZWNrb3V0IC1mICIkYzEiICYmCisKKwlnaXQtbWVyZ2UtcmVjdXJzaXZlICIkYzAiIC0tICIkYzEiICIkYzMiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21lcmdlLXJlY3Vyc2l2ZSByZXN1bHQnICcKKworCWdpdCBscy1maWxlcyAtcyA+YWN0dWFsICYmCisJKAorCQllY2hvICIxMDA2NDQgJG8xIDAJYSIKKwkJZWNobyAiMTAwNjQ0ICRvMyAwCWIvYyIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWMiCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlkL2UiCisJKSA+ZXhwZWN0ZWQgJiYKKwlnaXQgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1yZWN1cnNpdmUgZC9mIGNvbmZsaWN0JyAnCisKKwlybSAtZnIgW2FiY2RdICYmCisJZ2l0IHJlc2V0IC0taGFyZCAmJgorCWdpdCBjaGVja291dCAtZiAiJGMxIiAmJgorCisJZ2l0LW1lcmdlLXJlY3Vyc2l2ZSAiJGMwIiAtLSAiJGMxIiAiJGM0IgorCXN0YXR1cz0kPworCWNhc2UgIiRzdGF0dXMiIGluCisJMSkKKwkJOiBoYXBweQorCQk7OworCSopCisJCWVjaG8gPiYyICJ3aHkgc3RhdHVzICRzdGF0dXMhISEiCisJCWZhbHNlCisJCTs7CisJZXNhYworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1yZWN1cnNpdmUgZC9mIGNvbmZsaWN0IHJlc3VsdCcgJworCisJZ2l0IGxzLWZpbGVzIC1zID5hY3R1YWwgJiYKKwkoCisJCWVjaG8gIjEwMDY0NCAkbzAgMQlhIgorCQllY2hvICIxMDA2NDQgJG8xIDIJYSIKKwkJZWNobyAiMTAwNjQ0ICRvNCAwCWEvYyIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWIiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAljIgorCQllY2hvICIxMDA2NDQgJG8xIDAJZC9lIgorCSkgPmV4cGVjdGVkICYmCisJZ2l0IGRpZmYgLXUgZXhwZWN0ZWQgYWN0dWFsCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UtcmVjdXJzaXZlIGQvZiBjb25mbGljdCB0aGUgb3RoZXIgd2F5JyAnCisKKwlybSAtZnIgW2FiY2RdICYmCisJZ2l0IHJlc2V0IC0taGFyZCAmJgorCWdpdCBjaGVja291dCAtZiAiJGM0IiAmJgorCisJZ2l0LW1lcmdlLXJlY3Vyc2l2ZSAiJGMwIiAtLSAiJGM0IiAiJGMxIgorCXN0YXR1cz0kPworCWNhc2UgIiRzdGF0dXMiIGluCisJMSkKKwkJOiBoYXBweQorCQk7OworCSopCisJCWVjaG8gPiYyICJ3aHkgc3RhdHVzICRzdGF0dXMhISEiCisJCWZhbHNlCisJCTs7CisJZXNhYworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1yZWN1cnNpdmUgZC9mIGNvbmZsaWN0IHJlc3VsdCB0aGUgb3RoZXIgd2F5JyAnCisKKwlnaXQgbHMtZmlsZXMgLXMgPmFjdHVhbCAmJgorCSgKKwkJZWNobyAiMTAwNjQ0ICRvMCAxCWEiCisJCWVjaG8gIjEwMDY0NCAkbzEgMwlhIgorCQllY2hvICIxMDA2NDQgJG80IDAJYS9jIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYiIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWMiCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlkL2UiCisJKSA+ZXhwZWN0ZWQgJiYKKwlnaXQgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1yZWN1cnNpdmUgZC9mIGNvbmZsaWN0JyAnCisKKwlybSAtZnIgW2FiY2RdICYmCisJZ2l0IHJlc2V0IC0taGFyZCAmJgorCWdpdCBjaGVja291dCAtZiAiJGMxIiAmJgorCisJZ2l0LW1lcmdlLXJlY3Vyc2l2ZSAiJGMwIiAtLSAiJGMxIiAiJGM2IgorCXN0YXR1cz0kPworCWNhc2UgIiRzdGF0dXMiIGluCisJMSkKKwkJOiBoYXBweQorCQk7OworCSopCisJCWVjaG8gPiYyICJ3aHkgc3RhdHVzICRzdGF0dXMhISEiCisJCWZhbHNlCisJCTs7CisJZXNhYworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1yZWN1cnNpdmUgZC9mIGNvbmZsaWN0IHJlc3VsdCcgJworCisJZ2l0IGxzLWZpbGVzIC1zID5hY3R1YWwgJiYKKwkoCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlhIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYiIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWMiCisJCWVjaG8gIjEwMDY0NCAkbzYgMwlkIgorCQllY2hvICIxMDA2NDQgJG8wIDEJZC9lIgorCQllY2hvICIxMDA2NDQgJG8xIDIJZC9lIgorCSkgPmV4cGVjdGVkICYmCisJZ2l0IGRpZmYgLXUgZXhwZWN0ZWQgYWN0dWFsCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UtcmVjdXJzaXZlIGQvZiBjb25mbGljdCcgJworCisJcm0gLWZyIFthYmNkXSAmJgorCWdpdCByZXNldCAtLWhhcmQgJiYKKwlnaXQgY2hlY2tvdXQgLWYgIiRjNiIgJiYKKworCWdpdC1tZXJnZS1yZWN1cnNpdmUgIiRjMCIgLS0gIiRjNiIgIiRjMSIKKwlzdGF0dXM9JD8KKwljYXNlICIkc3RhdHVzIiBpbgorCTEpCisJCTogaGFwcHkKKwkJOzsKKwkqKQorCQllY2hvID4mMiAid2h5IHN0YXR1cyAkc3RhdHVzISEhIgorCQlmYWxzZQorCQk7OworCWVzYWMKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UtcmVjdXJzaXZlIGQvZiBjb25mbGljdCByZXN1bHQnICcKKworCWdpdCBscy1maWxlcyAtcyA+YWN0dWFsICYmCisJKAorCQllY2hvICIxMDA2NDQgJG8xIDAJYSIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWIiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAljIgorCQllY2hvICIxMDA2NDQgJG82IDIJZCIKKwkJZWNobyAiMTAwNjQ0ICRvMCAxCWQvZSIKKwkJZWNobyAiMTAwNjQ0ICRvMSAzCWQvZSIKKwkpID5leHBlY3RlZCAmJgorCWdpdCBkaWZmIC11IGV4cGVjdGVkIGFjdHVhbAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Jlc2V0IGFuZCAzLXdheSBtZXJnZScgJworCisJZ2l0IHJlc2V0IC0taGFyZCAiJGMyIiAmJgorCWdpdCByZWFkLXRyZWUgLW0gIiRjMCIgIiRjMiIgIiRjMSIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZXNldCBhbmQgYmluZCBtZXJnZScgJworCisJZ2l0IHJlc2V0IC0taGFyZCBtYXN0ZXIgJiYKKwlnaXQgcmVhZC10cmVlIC0tcHJlZml4PU0vIG1hc3RlciAmJgorCWdpdCBscy1maWxlcyAtcyA+YWN0dWFsICYmCisJKAorCQllY2hvICIxMDA2NDQgJG8xIDAJTS9hIgorCQllY2hvICIxMDA2NDQgJG8wIDAJTS9iIgorCQllY2hvICIxMDA2NDQgJG8wIDAJTS9jIgorCQllY2hvICIxMDA2NDQgJG8xIDAJTS9kL2UiCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlhIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYiIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWMiCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlkL2UiCisJKSA+ZXhwZWN0ZWQgJiYKKwlnaXQgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwgJiYKKworCWdpdCByZWFkLXRyZWUgLS1wcmVmaXg9YTEvIG1hc3RlciAmJgorCWdpdCBscy1maWxlcyAtcyA+YWN0dWFsICYmCisJKAorCQllY2hvICIxMDA2NDQgJG8xIDAJTS9hIgorCQllY2hvICIxMDA2NDQgJG8wIDAJTS9iIgorCQllY2hvICIxMDA2NDQgJG8wIDAJTS9jIgorCQllY2hvICIxMDA2NDQgJG8xIDAJTS9kL2UiCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlhIgorCQllY2hvICIxMDA2NDQgJG8xIDAJYTEvYSIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWExL2IiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAlhMS9jIgorCQllY2hvICIxMDA2NDQgJG8xIDAJYTEvZC9lIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYiIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWMiCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlkL2UiCisJKSA+ZXhwZWN0ZWQgJiYKKwlnaXQgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwKKworCWdpdCByZWFkLXRyZWUgLS1wcmVmaXg9ei8gbWFzdGVyICYmCisJZ2l0IGxzLWZpbGVzIC1zID5hY3R1YWwgJiYKKwkoCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlNL2EiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAlNL2IiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAlNL2MiCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlNL2QvZSIKKwkJZWNobyAiMTAwNjQ0ICRvMSAwCWEiCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlhMS9hIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYTEvYiIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCWExL2MiCisJCWVjaG8gIjEwMDY0NCAkbzEgMAlhMS9kL2UiCisJCWVjaG8gIjEwMDY0NCAkbzAgMAliIgorCQllY2hvICIxMDA2NDQgJG8wIDAJYyIKKwkJZWNobyAiMTAwNjQ0ICRvMSAwCWQvZSIKKwkJZWNobyAiMTAwNjQ0ICRvMSAwCXovYSIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCXovYiIKKwkJZWNobyAiMTAwNjQ0ICRvMCAwCXovYyIKKwkJZWNobyAiMTAwNjQ0ICRvMSAwCXovZC9lIgorCSkgPmV4cGVjdGVkICYmCisJZ2l0IGRpZmYgLXUgZXhwZWN0ZWQgYWN0dWFsCisKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzMDQwLXN1YnByb2plY3RzLWJhc2ljLnNoIGIvdC90MzA0MC1zdWJwcm9qZWN0cy1iYXNpYy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43OWI5ZjIzCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzA0MC1zdWJwcm9qZWN0cy1iYXNpYy5zaApAQCAtMCwwICsxLDg1IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nQmFzaWMgc3VicHJvamVjdCBmdW5jdGlvbmFsaXR5JworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ1N1cGVyIHByb2plY3QgY3JlYXRpb24nIFwKKyAgICAnOiA+TWFrZWZpbGUgJiYKKyAgICBnaXQgYWRkIE1ha2VmaWxlICYmCisgICAgZ2l0IGNvbW1pdCAtbSAiU3VwZXJwcm9qZWN0IGNyZWF0ZWQiJworCisKK2NhdCA+ZXhwZWN0ZWQgPDxFT0YKKzowMDAwMDAgMTYwMDAwIDAwMDAwLi4uIEEJc3ViMQorOjAwMDAwMCAxNjAwMDAgMDAwMDAuLi4gQQlzdWIyCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NyZWF0ZSBzdWJwcm9qZWN0cycgXAorICAgICdta2RpciBzdWIxICYmCisgICAgKCBjZCBzdWIxICYmIGdpdCBpbml0ICYmIDogPk1ha2VmaWxlICYmIGdpdCBhZGQgKiAmJgorICAgIGdpdCBjb21taXQgLXEgLW0gInN1YnByb2plY3QgMSIgKSAmJgorICAgIG1rZGlyIHN1YjIgJiYKKyAgICAoIGNkIHN1YjIgJiYgZ2l0IGluaXQgJiYgOiA+TWFrZWZpbGUgJiYgZ2l0IGFkZCAqICYmCisgICAgZ2l0IGNvbW1pdCAtcSAtbSAic3VicHJvamVjdCAyIiApICYmCisgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBzdWIxICYmCisgICAgZ2l0IGFkZCBzdWIyICYmCisgICAgZ2l0IGNvbW1pdCAtcSAtbSAic3VicHJvamVjdHMgYWRkZWQiICYmCisgICAgZ2l0IGRpZmYtdHJlZSAtLWFiYnJldj01IEhFQUReIEhFQUQgfGN1dCAtZCIgIiAtZi0zLDUtID5jdXJyZW50ICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0ZWQgY3VycmVudCcKKworZ2l0IGJyYW5jaCBzYXZlIEhFQUQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgaWYgZnNjayBpZ25vcmVzIHRoZSBzdWJwcm9qZWN0cycgXAorICAgICdnaXQgZnNjayAtLWZ1bGwnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIGlmIGNvbW1pdCBpbiBhIHN1YnByb2plY3QgZGV0ZWN0ZWQnIFwKKyAgICAnKCBjZCBzdWIxICYmCisgICAgZWNobyAiYWxsOiIgPj5NYWtlZmlsZSAmJgorICAgIGVjaG8gIgl0cnVlIiA+Pk1ha2VmaWxlICYmCisgICAgZ2l0IGNvbW1pdCAtcSAtYSAtbSAibWFrZSBhbGwiICkgJiYgeworICAgICAgICBnaXQgZGlmZi1maWxlcyAtLWV4aXQtY29kZQorCXRlc3QgJD8gPSAxCisgICAgfScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgaWYgYSBjaGFuZ2VkIHN1YnByb2plY3QgSEVBRCBjYW4gYmUgY29tbWl0dGVkJyBcCisgICAgJ2dpdCBjb21taXQgLXEgLWEgLW0gInN1YjEgY2hhbmdlZCIgJiYgeworCWdpdCBkaWZmLXRyZWUgLS1leGl0LWNvZGUgSEVBRF4gSEVBRAorCXRlc3QgJD8gPSAxCisgICAgfScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgaWYgZGlmZi1pbmRleCB3b3JrcyBmb3Igc3VicHJvamVjdCBlbGVtZW50cycgXAorICAgICdnaXQgZGlmZi1pbmRleCAtLWV4aXQtY29kZSAtLWNhY2hlZCBzYXZlIC0tIHN1YjEKKyAgICB0ZXN0ICQ/ID0gMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgaWYgZGlmZi10cmVlIHdvcmtzIGZvciBzdWJwcm9qZWN0IGVsZW1lbnRzJyBcCisgICAgJ2dpdCBkaWZmLXRyZWUgLS1leGl0LWNvZGUgSEVBRF4gSEVBRCAtLSBzdWIxCisgICAgdGVzdCAkPyA9IDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIGlmIGdpdCBkaWZmIHdvcmtzIGZvciBzdWJwcm9qZWN0IGVsZW1lbnRzJyBcCisgICAgJ2dpdCBkaWZmIC0tZXhpdC1jb2RlIEhFQUReIEhFQUQKKyAgICB0ZXN0ICQ/ID0gMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgaWYgY2xvbmUgd29ya3MnIFwKKyAgICAnZ2l0IGxzLWZpbGVzIC1zID5leHBlY3RlZCAmJgorICAgIGdpdCBjbG9uZSAtbCAtcyAuIGNsb25lZCAmJgorICAgICggY2QgY2xvbmVkICYmIGdpdCBscy1maWxlcyAtcyApID5jdXJyZW50ICYmCisgICAgZ2l0IGRpZmYgZXhwZWN0ZWQgY3VycmVudCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVtb3ZpbmcgYW5kIGFkZGluZyBzdWJwcm9qZWN0JyBcCisgICAgJ2dpdCB1cGRhdGUtaW5kZXggLS1mb3JjZS1yZW1vdmUgLS0gc3ViMiAmJgorICAgIG12IHN1YjIgc3ViMyAmJgorICAgIGdpdCBhZGQgc3ViMyAmJgorICAgIGdpdCBjb21taXQgLXEgLW0gInJlbmFtaW5nIGEgc3VicHJvamVjdCIgJiYgeworCWdpdCBkaWZmIC1NIC0tbmFtZS1zdGF0dXMgLS1leGl0LWNvZGUgSEVBRF4gSEVBRAorCXRlc3QgJD8gPSAxCisgICAgfScKKworIyB0aGUgaW5kZXggbXVzdCBjb250YWluIHRoZSBvYmplY3QgbmFtZSB0aGUgSEVBRCBvZiB0aGUKKyMgc3VicHJvamVjdCBzdWIxIHdhcyBhdCB0aGUgcG9pbnQgInNhdmUiCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVja291dCBpbiBzdXBlcnByb2plY3QnIFwKKyAgICAnZ2l0IGNoZWNrb3V0IHNhdmUgJiYKKyAgICBnaXQgZGlmZi1pbmRleCAtLWV4aXQtY29kZSAtLXJhdyAtLWNhY2hlZCBzYXZlIC0tIHN1YjEnCisKKyMganVzdCBpbnRlcmVzdGluZyB3aGF0IGhhcHBlbmVkLi4uCisjIGdpdCBkaWZmIC0tbmFtZS1zdGF0dXMgLU0gc2F2ZSBtYXN0ZXIKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzMDUwLXN1YnByb2plY3RzLWZldGNoLnNoIGIvdC90MzA1MC1zdWJwcm9qZWN0cy1mZXRjaC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYjIxYjEwCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzA1MC1zdWJwcm9qZWN0cy1mZXRjaC5zaApAQCAtMCwwICsxLDUyIEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nZmV0Y2hpbmcgYW5kIHB1c2hpbmcgcHJvamVjdCB3aXRoIHN1YnByb2plY3QnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKwl0ZXN0X3RpY2sgJiYKKwlta2RpciAtcCBzdWIgJiYgKAorCQljZCBzdWIgJiYKKwkJZ2l0IGluaXQgJiYKKwkJPnN1YmZpbGUgJiYKKwkJZ2l0IGFkZCBzdWJmaWxlCisJCWdpdCBjb21taXQgLW0gInN1YnByb2plY3QgY29tbWl0ICMxIgorCSkgJiYKKwk+bWFpbmZpbGUKKwlnaXQgYWRkIHN1YiBtYWluZmlsZSAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gInN1cGVycHJvamVjdCBjb21taXQgIzEiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgY2xvbmUgJworCWdpdCBjbG9uZSBmaWxlOi8vYHB3ZGAvLmdpdCBjbG9uZWQgJiYKKwkoZ2l0IHJldi1wYXJzZSBIRUFEOyBnaXQgbHMtZmlsZXMgLXMpID5leHBlY3RlZCAmJgorCSgKKwkJY2QgY2xvbmVkICYmCisJCShnaXQgcmV2LXBhcnNlIEhFQUQ7IGdpdCBscy1maWxlcyAtcykgPi4uL2FjdHVhbAorCSkgJiYKKwl0ZXN0X2NtcCBleHBlY3RlZCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBhZHZhbmNlICcKKwllY2hvIG1vcmUgPm1haW5maWxlICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWZvcmNlLXJlbW92ZSBzdWIgJiYKKwltdiBzdWIvLmdpdCBzdWIvLmdpdC1kaXNhYmxlZCAmJgorCWdpdCBhZGQgc3ViL3N1YmZpbGUgbWFpbmZpbGUgJiYKKwltdiBzdWIvLmdpdC1kaXNhYmxlZCBzdWIvLmdpdCAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gInN1cGVycHJvamVjdCBjb21taXQgIzIiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgZmV0Y2ggJworCShnaXQgcmV2LXBhcnNlIEhFQUQ7IGdpdCBscy1maWxlcyAtcykgPmV4cGVjdGVkICYmCisJKAorCQljZCBjbG9uZWQgJiYKKwkJZ2l0IHB1bGwgJiYKKwkJKGdpdCByZXYtcGFyc2UgSEVBRDsgZ2l0IGxzLWZpbGVzIC1zKSA+Li4vYWN0dWFsCisJKSAmJgorCXRlc3RfY21wIGV4cGVjdGVkIGFjdHVhbAorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDMwNjAtbHMtZmlsZXMtd2l0aC10cmVlLnNoIGIvdC90MzA2MC1scy1maWxlcy13aXRoLXRyZWUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2NlNTAxYgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDMwNjAtbHMtZmlsZXMtd2l0aC10cmVlLnNoCkBAIC0wLDAgKzEsNzEgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDcgQ2FybCBELiBXb3J0aAorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgbHMtZmlsZXMgdGVzdCAoLS13aXRoLXRyZWUpLgorCitUaGlzIHRlc3QgcnVucyBnaXQgbHMtZmlsZXMgLS13aXRoLXRyZWUgYW5kIGluIHBhcnRpY3VsYXIgaW4KK2Egc2NlbmFyaW8ga25vd24gdG8gdHJpZ2dlciBhIGNyYXNoIHdpdGggc29tZSB2ZXJzaW9ucyBvZiBnaXQuCisnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwkjIFRoZSBidWcgd2UgYXJlIGV4ZXJjaXNpbmcgcmVxdWlyZXMgYSBmYWlyIG51bWJlciBvZiBlbnRyaWVzCisJIyBpbiBhIHN1Yi1kaXJlY3Rvcnkgc28gdGhhdCBhZGRfaW5kZXhfZW50cnkgd2lsbCB0cmlnZ2VyIGEKKwkjIHJlYWxsb2MuCisKKwllY2hvIGZpbGUgPmV4cGVjdGVkICYmCisJbWtkaXIgc3ViICYmCisJYmFkPSAmJgorCWZvciBuIGluIDAgMSAyIDMgNCA1CisJZG8KKwkJZm9yIG0gaW4gMCAxIDIgMyA0IDUgNiA3IDggOQorCQlkbworCQkJbnVtPTAwJG4kbSAmJgorCQkJPnN1Yi9maWxlLSRudW0gJiYKKwkJCWVjaG8gZmlsZS0kbnVtID4+ZXhwZWN0ZWQgfHwgeworCQkJCWJhZD10CisJCQkJYnJlYWsKKwkJCX0KKwkJZG9uZSAmJiB0ZXN0IC16ICIkYmFkIiB8fCB7CisJCQliYWQ9dAorCQkJYnJlYWsKKwkJfQorCWRvbmUgJiYgdGVzdCAteiAiJGJhZCIgJiYKKwlnaXQgYWRkIC4gJiYKKwlnaXQgY29tbWl0IC1tICJhZGQgYSBidW5jaCBvZiBmaWxlcyIgJiYKKworCSMgV2UgcmVtb3ZlIHRoZW0gYWxsIHNvIHRoYXQgd2Ugd2lsbCBoYXZlIHNvbWV0aGluZyB0byBhZGQKKwkjIGJhY2sgd2l0aCAtLXdpdGgtdHJlZSBhbmQgc28gdGhhdCB3ZSB3aWxsIGRlZmluaXRlbHkgYmUKKwkjIHVuZGVyIHRoZSByZWFsbG9jIHNpemUgdG8gdHJpZ2dlciB0aGUgYnVnLgorCXJtIC1yZiBzdWIgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJyZW1vdmUgdGhlbSBhbGwiICYmCisKKwkjIFRoZSBidWcgYWxzbyByZXF1aXJlcyBzb21lIGVudHJ5IGJlZm9yZSBvdXIgZGlyZWN0b3J5IHNvIHRoYXQKKwkjIHBydW5lX3BhdGggd2lsbCBtb2RpZnkgdGhlX2luZGV4LmNhY2hlCisKKwlta2RpciBhX2RpcmVjdG9yeV90aGF0X3NvcnRzX2JlZm9yZV9zdWIgJiYKKwk+YV9kaXJlY3RvcnlfdGhhdF9zb3J0c19iZWZvcmVfc3ViL2ZpbGUgJiYKKwlta2RpciBzdWIgJiYKKwk+c3ViL2ZpbGUgJiYKKwlnaXQgYWRkIC4KKycKKworIyBXZSBoYXZlIHRvIHJ1biBmcm9tIGEgc3ViLWRpcmVjdG9yeSB0byB0cmlnZ2VyIHBydW5lX3BhdGgKKyMgVGhlbiB3ZSBmaW5hbGx5IGdldCB0byBydW4gb3VyIC0td2l0aC10cmVlIHRlc3QKK2NkIHN1YgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgLWxzLWZpbGVzIC0td2l0aC10cmVlIHNob3VsZCBzdWNjZWVkIGZyb20gc3ViZGlyJyAnCisKKwlnaXQgbHMtZmlsZXMgLS13aXRoLXRyZWU9SEVBRH4xID4uLi9vdXRwdXQKKworJworCitjZCAuLgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCAtbHMtZmlsZXMgLS13aXRoLXRyZWUgc2hvdWxkIGFkZCBlbnRyaWVzIGZyb20gbmFtZWQgdHJlZS4nIFwKKyAgICAndGVzdF9jbXAgZXhwZWN0ZWQgb3V0cHV0JworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDMxMDAtbHMtdHJlZS1yZXN0cmljdC5zaCBiL3QvdDMxMDAtbHMtdHJlZS1yZXN0cmljdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NjQyN2UzCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzEwMC1scy10cmVlLXJlc3RyaWN0LnNoCkBAIC0wLDAgKzEsMTU4IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBscy10cmVlIHRlc3QuCisKK1RoaXMgdGVzdCBydW5zIGdpdCBscy10cmVlIHdpdGggdGhlIGZvbGxvd2luZyBpbiBhIHRyZWUuCisKKyAgICBwYXRoMCAgICAgICAtIGEgZmlsZQorICAgIHBhdGgxCS0gYSBzeW1saW5rCisgICAgcGF0aDIvZm9vICAgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKyAgICBwYXRoMi9iYXpibyAtIGEgc3ltbGluayBpbiBhIGRpcmVjdG9yeQorICAgIHBhdGgyL2Jhei9iIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5CisKK1RoZSBuZXcgcGF0aCByZXN0cmljdGlvbiBjb2RlIHNob3VsZCBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIHBhdGgyIGFuZAorcGF0aDIvYmF6LiAgQWxzbyBwYXRoMC8gc2hvdWxkIHNub3cgbm90aGluZy4KKycKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc2V0dXAnIFwKKyAgICAnbWtkaXIgcGF0aDIgcGF0aDIvYmF6ICYmCisgICAgIGVjaG8gSGkgPnBhdGgwICYmCisgICAgIGxuIC1zIHBhdGgwIHBhdGgxICYmCisgICAgIGVjaG8gTG8gPnBhdGgyL2ZvbyAmJgorICAgICBsbiAtcyAuLi9wYXRoMSBwYXRoMi9iYXpibyAmJgorICAgICBlY2hvIE1pID5wYXRoMi9iYXovYiAmJgorICAgICBmaW5kIHBhdGg/IFwoIC10eXBlIGYgLW8gLXR5cGUgbCBcKSAtcHJpbnQgfAorICAgICB4YXJncyBnaXQgdXBkYXRlLWluZGV4IC0tYWRkICYmCisgICAgIHRyZWU9YGdpdCB3cml0ZS10cmVlYCAmJgorICAgICBlY2hvICR0cmVlJworCitfeDQwPSdbMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdJworX3g0MD0iJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCIKK3Rlc3Rfb3V0cHV0ICgpIHsKKyAgICBzZWQgLWUgInMvICRfeDQwCS8gWAkvIiA8Y3VycmVudCA+Y2hlY2sKKyAgICBnaXQgZGlmZiBleHBlY3RlZCBjaGVjaworfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBwbGFpbicgXAorICAgICdnaXQgbHMtdHJlZSAkdHJlZSA+Y3VycmVudCAmJgorICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorMTAwNjQ0IGJsb2IgWAlwYXRoMAorMTIwMDAwIGJsb2IgWAlwYXRoMQorMDQwMDAwIHRyZWUgWAlwYXRoMgorRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSByZWN1cnNpdmUnIFwKKyAgICAnZ2l0IGxzLXRyZWUgLXIgJHRyZWUgPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzEwMDY0NCBibG9iIFgJcGF0aDAKKzEyMDAwMCBibG9iIFgJcGF0aDEKKzEwMDY0NCBibG9iIFgJcGF0aDIvYmF6L2IKKzEyMDAwMCBibG9iIFgJcGF0aDIvYmF6Ym8KKzEwMDY0NCBibG9iIFgJcGF0aDIvZm9vCitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIHJlY3Vyc2l2ZSB3aXRoIC10JyBcCisgICAgJ2dpdCBscy10cmVlIC1yIC10ICR0cmVlID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCisxMDA2NDQgYmxvYiBYCXBhdGgwCisxMjAwMDAgYmxvYiBYCXBhdGgxCiswNDAwMDAgdHJlZSBYCXBhdGgyCiswNDAwMDAgdHJlZSBYCXBhdGgyL2JhegorMTAwNjQ0IGJsb2IgWAlwYXRoMi9iYXovYgorMTIwMDAwIGJsb2IgWAlwYXRoMi9iYXpibworMTAwNjQ0IGJsb2IgWAlwYXRoMi9mb28KK0VPRgorICAgICB0ZXN0X291dHB1dCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgcmVjdXJzaXZlIHdpdGggLWQnIFwKKyAgICAnZ2l0IGxzLXRyZWUgLXIgLWQgJHRyZWUgPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzA0MDAwMCB0cmVlIFgJcGF0aDIKKzA0MDAwMCB0cmVlIFgJcGF0aDIvYmF6CitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIGZpbHRlcmVkIHdpdGggcGF0aCcgXAorICAgICdnaXQgbHMtdHJlZSAkdHJlZSBwYXRoID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKKworIyBpdCB1c2VkIHRvIGJlIHBhdGgxIGFuZCB0aGVuIHBhdGgwLCBidXQgd2l0aCBwYXRoc3BlYyBzZW1hbnRpY3MKKyMgdGhleSBhcmUgc2hvd24gaW4gY2Fub25pY2FsIG9yZGVyLgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgZmlsdGVyZWQgd2l0aCBwYXRoMSBwYXRoMCcgXAorICAgICdnaXQgbHMtdHJlZSAkdHJlZSBwYXRoMSBwYXRoMCA+Y3VycmVudCAmJgorICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorMTAwNjQ0IGJsb2IgWAlwYXRoMAorMTIwMDAwIGJsb2IgWAlwYXRoMQorRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBmaWx0ZXJlZCB3aXRoIHBhdGgwLycgXAorICAgICdnaXQgbHMtdHJlZSAkdHJlZSBwYXRoMC8gPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKK0VPRgorICAgICB0ZXN0X291dHB1dCcKKworIyBJdCB1c2VkIHRvIHNob3cgcGF0aDIgYW5kIGl0cyBpbW1lZGlhdGUgY2hpbGRyZW4gYnV0CisjIHdpdGggcGF0aHNwZWMgc2VtYW50aWNzIGl0IHNob3dzIG9ubHkgcGF0aDIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIGZpbHRlcmVkIHdpdGggcGF0aDInIFwKKyAgICAnZ2l0IGxzLXRyZWUgJHRyZWUgcGF0aDIgPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzA0MDAwMCB0cmVlIFgJcGF0aDIKK0VPRgorICAgICB0ZXN0X291dHB1dCcKKworIyAuLi4gYW5kIHBhdGgyLyBzaG93cyB0aGUgY2hpbGRyZW4uCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBmaWx0ZXJlZCB3aXRoIHBhdGgyLycgXAorICAgICdnaXQgbHMtdHJlZSAkdHJlZSBwYXRoMi8gPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzA0MDAwMCB0cmVlIFgJcGF0aDIvYmF6CisxMjAwMDAgYmxvYiBYCXBhdGgyL2JhemJvCisxMDA2NDQgYmxvYiBYCXBhdGgyL2ZvbworRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCisjIFRoZSBzYW1lIGNoYW5nZSAtLSBleGFjdCBtYXRjaCBkb2VzIG5vdCBzaG93IGNoaWxkcmVuIG9mCisjIHBhdGgyL2JhegordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgZmlsdGVyZWQgd2l0aCBwYXRoMi9iYXonIFwKKyAgICAnZ2l0IGxzLXRyZWUgJHRyZWUgcGF0aDIvYmF6ID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCiswNDAwMDAgdHJlZSBYCXBhdGgyL2JhegorRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBmaWx0ZXJlZCB3aXRoIHBhdGgyL2JhaycgXAorICAgICdnaXQgbHMtdHJlZSAkdHJlZSBwYXRoMi9iYWsgPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKK0VPRgorICAgICB0ZXN0X291dHB1dCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgLXQgZmlsdGVyZWQgd2l0aCBwYXRoMi9iYWsnIFwKKyAgICAnZ2l0IGxzLXRyZWUgLXQgJHRyZWUgcGF0aDIvYmFrID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCiswNDAwMDAgdHJlZSBYCXBhdGgyCitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzEwMS1scy10cmVlLWRpcm5hbWUuc2ggYi90L3QzMTAxLWxzLXRyZWUtZGlybmFtZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MGY5Y2U5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90MzEwMS1scy10cmVlLWRpcm5hbWUuc2gKQEAgLTAsMCArMSwxMzggQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMgQ29weXJpZ2h0IChjKSAyMDA1IFJvYmVydCBGaXR6c2ltb25zCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBscy10cmVlIGRpcmVjdG9yeSBhbmQgZmlsZW5hbWVzIGhhbmRsaW5nLgorCitUaGlzIHRlc3QgcnVucyBnaXQgbHMtdHJlZSB3aXRoIHRoZSBmb2xsb3dpbmcgaW4gYSB0cmVlLgorCisgICAgMS50eHQgICAgICAgICAgICAgIC0gYSBmaWxlCisgICAgMi50eHQgICAgICAgICAgICAgIC0gYSBmaWxlCisgICAgcGF0aDAvYS9iL2MvMS50eHQgIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDEvYi9jLzEudHh0ICAgIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDIvMS50eHQgICAgICAgIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDMvMS50eHQgICAgICAgIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDMvMi50eHQgICAgICAgIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisKK1Rlc3QgdGhlIGhhbmRsaW5nIG9mIG11bGl0cGxlIGRpcmVjdG9yaWVzIHdoaWNoIGhhdmUgbWF0Y2hpbmcgZmlsZQorZW50cmllcy4gIEFsc28gdGVzdCBvZGQgZmlsZW5hbWUgYW5kIG1pc3NpbmcgZW50cmllcyBoYW5kbGluZy4KKycKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc2V0dXAnIFwKKyAgICAnZWNobyAxMTEgPjEudHh0ICYmCisgICAgIGVjaG8gMjIyID4yLnR4dCAmJgorICAgICBta2RpciBwYXRoMCBwYXRoMC9hIHBhdGgwL2EvYiBwYXRoMC9hL2IvYyAmJgorICAgICBlY2hvIDExMSA+cGF0aDAvYS9iL2MvMS50eHQgJiYKKyAgICAgbWtkaXIgcGF0aDEgcGF0aDEvYiBwYXRoMS9iL2MgJiYKKyAgICAgZWNobyAxMTEgPnBhdGgxL2IvYy8xLnR4dCAmJgorICAgICBta2RpciBwYXRoMiAmJgorICAgICBlY2hvIDExMSA+cGF0aDIvMS50eHQgJiYKKyAgICAgbWtkaXIgcGF0aDMgJiYKKyAgICAgZWNobyAxMTEgPnBhdGgzLzEudHh0ICYmCisgICAgIGVjaG8gMjIyID5wYXRoMy8yLnR4dCAmJgorICAgICBmaW5kICoudHh0IHBhdGgqIFwoIC10eXBlIGYgLW8gLXR5cGUgbCBcKSAtcHJpbnQgfAorICAgICB4YXJncyBnaXQgdXBkYXRlLWluZGV4IC0tYWRkICYmCisgICAgIHRyZWU9YGdpdCB3cml0ZS10cmVlYCAmJgorICAgICBlY2hvICR0cmVlJworCitfeDQwPSdbMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdJworX3g0MD0iJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCIKK3Rlc3Rfb3V0cHV0ICgpIHsKKyAgICBzZWQgLWUgInMvICRfeDQwCS8gWAkvIiA8Y3VycmVudCA+Y2hlY2sKKyAgICBnaXQgZGlmZiBleHBlY3RlZCBjaGVjaworfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBwbGFpbicgXAorICAgICdnaXQgbHMtdHJlZSAkdHJlZSA+Y3VycmVudCAmJgorICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorMTAwNjQ0IGJsb2IgWAkxLnR4dAorMTAwNjQ0IGJsb2IgWAkyLnR4dAorMDQwMDAwIHRyZWUgWAlwYXRoMAorMDQwMDAwIHRyZWUgWAlwYXRoMQorMDQwMDAwIHRyZWUgWAlwYXRoMgorMDQwMDAwIHRyZWUgWAlwYXRoMworRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCisjIFJlY3Vyc2l2ZSBkb2VzIG5vdCBzaG93IHRyZWUgbm9kZXMgYW55bW9yZS4uLgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgcmVjdXJzaXZlJyBcCisgICAgJ2dpdCBscy10cmVlIC1yICR0cmVlID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCisxMDA2NDQgYmxvYiBYCTEudHh0CisxMDA2NDQgYmxvYiBYCTIudHh0CisxMDA2NDQgYmxvYiBYCXBhdGgwL2EvYi9jLzEudHh0CisxMDA2NDQgYmxvYiBYCXBhdGgxL2IvYy8xLnR4dAorMTAwNjQ0IGJsb2IgWAlwYXRoMi8xLnR4dAorMTAwNjQ0IGJsb2IgWAlwYXRoMy8xLnR4dAorMTAwNjQ0IGJsb2IgWAlwYXRoMy8yLnR4dAorRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBmaWx0ZXIgMS50eHQnIFwKKyAgICAnZ2l0IGxzLXRyZWUgJHRyZWUgMS50eHQgPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzEwMDY0NCBibG9iIFgJMS50eHQKK0VPRgorICAgICB0ZXN0X291dHB1dCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgZmlsdGVyIHBhdGgxL2IvYy8xLnR4dCcgXAorICAgICdnaXQgbHMtdHJlZSAkdHJlZSBwYXRoMS9iL2MvMS50eHQgPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzEwMDY0NCBibG9iIFgJcGF0aDEvYi9jLzEudHh0CitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIGZpbHRlciBhbGwgMS50eHQgZmlsZXMnIFwKKyAgICAnZ2l0IGxzLXRyZWUgJHRyZWUgMS50eHQgcGF0aDAvYS9iL2MvMS50eHQgcGF0aDEvYi9jLzEudHh0IHBhdGgyLzEudHh0IHBhdGgzLzEudHh0ID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCisxMDA2NDQgYmxvYiBYCTEudHh0CisxMDA2NDQgYmxvYiBYCXBhdGgwL2EvYi9jLzEudHh0CisxMDA2NDQgYmxvYiBYCXBhdGgxL2IvYy8xLnR4dAorMTAwNjQ0IGJsb2IgWAlwYXRoMi8xLnR4dAorMTAwNjQ0IGJsb2IgWAlwYXRoMy8xLnR4dAorRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCisjIEkgYW0gbm90IHNvIHN1cmUgYWJvdXQgdGhpcyBvbmUgYWZ0ZXIgbHMtdHJlZSBkb2luZyBwYXRoc3BlYyBtYXRjaC4KKyMgSGF2aW5nIGJvdGggcGF0aDAvYSBhbmQgcGF0aDAvYS9iL2MgbWFrZXMgcGF0aDAvYSByZWR1bmRhbnQsIGFuZAorIyBpdCBiZWhhdmVzIGFzIGlmIHBhdGgwL2EvYi9jLCBwYXRoMS9iL2MsIHBhdGgyIGFuZCBwYXRoMyBhcmUgc3BlY2lmaWVkLgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgZmlsdGVyIGRpcmVjdG9yaWVzJyBcCisgICAgJ2dpdCBscy10cmVlICR0cmVlIHBhdGgzIHBhdGgyIHBhdGgwL2EvYi9jIHBhdGgxL2IvYyBwYXRoMC9hID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCiswNDAwMDAgdHJlZSBYCXBhdGgwL2EvYi9jCiswNDAwMDAgdHJlZSBYCXBhdGgxL2IvYworMDQwMDAwIHRyZWUgWAlwYXRoMgorMDQwMDAwIHRyZWUgWAlwYXRoMworRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCisjIEFnYWluLCBkdXBsaWNhdGVzIGFyZSBmaWx0ZXJlZCBhd2F5IHNvIHRoaXMgaXMgZXF1aXZhbGVudCB0bworIyBoYXZpbmcgMS50eHQgYW5kIHBhdGgzCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBmaWx0ZXIgb2RkIG5hbWVzJyBcCisgICAgJ2dpdCBscy10cmVlICR0cmVlIDEudHh0IC4vMS50eHQgLi8vMS50eHQgcGF0aDMvMS50eHQgcGF0aDMvLi8xLnR4dCBwYXRoMyBwYXRoMy8vID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCisxMDA2NDQgYmxvYiBYCTEudHh0CisxMDA2NDQgYmxvYiBYCXBhdGgzLzEudHh0CisxMDA2NDQgYmxvYiBYCXBhdGgzLzIudHh0CitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIGZpbHRlciBtaXNzaW5nIGZpbGVzIGFuZCBleHRyYSBzbGFzaGVzJyBcCisgICAgJ2dpdCBscy10cmVlICR0cmVlIDEudHh0LyBhYmMudHh0IHBhdGgzLy8yMy50eHQgcGF0aDMvMi50eHQvLy8gPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKK0VPRgorICAgICB0ZXN0X291dHB1dCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzMjAwLWJyYW5jaC5zaCBiL3QvdDMyMDAtYnJhbmNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNiNWY3YTQKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzMjAwLWJyYW5jaC5zaApAQCAtMCwwICsxLDIyNyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBBbW9zIFdhdGVybGFuZAorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgYnJhbmNoIC0tZm9vIHNob3VsZCBub3QgY3JlYXRlIGJvZ3VzIGJyYW5jaAorCitUaGlzIHRlc3QgcnVucyBnaXQgYnJhbmNoIC0taGVscCBhbmQgY2hlY2tzIHRoYXQgdGhlIGFyZ3VtZW50IGlzIHByb3Blcmx5CitoYW5kbGVkLiAgU3BlY2lmaWNhbGx5LCB0aGF0IGEgYm9ndXMgYnJhbmNoIGlzIG5vdCBjcmVhdGVkLgorJworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIGEgdHJpdmlhbCByZXBvc2l0b3J5JyBcCisgICAgJ2VjaG8gSGVsbG8gPiBBICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgQSAmJgorICAgICBnaXQtY29tbWl0IC1tICJJbml0aWFsIGNvbW1pdC4iICYmCisgICAgIGVjaG8gV29ybGQgPj4gQSAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIEEgJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSAiU2Vjb25kIGNvbW1pdC4iICYmCisgICAgIEhFQUQ9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0IGJyYW5jaCAtLWhlbHAgc2hvdWxkIG5vdCBoYXZlIGNyZWF0ZWQgYSBib2d1cyBicmFuY2gnICcKKyAgICAgZ2l0IGJyYW5jaCAtLWhlbHAgPC9kZXYvbnVsbCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOworICAgICAhIHRlc3QgLWYgLmdpdC9yZWZzL2hlYWRzLy0taGVscAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0IGJyYW5jaCBhYmMgc2hvdWxkIGNyZWF0ZSBhIGJyYW5jaCcgXAorICAgICdnaXQgYnJhbmNoIGFiYyAmJiB0ZXN0IC1mIC5naXQvcmVmcy9oZWFkcy9hYmMnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgYnJhbmNoIGEvYi9jIHNob3VsZCBjcmVhdGUgYSBicmFuY2gnIFwKKyAgICAnZ2l0IGJyYW5jaCBhL2IvYyAmJiB0ZXN0IC1mIC5naXQvcmVmcy9oZWFkcy9hL2IvYycKKworY2F0ID5leHBlY3QgPDxFT0YKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgJEhFQUQgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+IDExMTcxNTAyMDAgKzAwMDAJYnJhbmNoOiBDcmVhdGVkIGZyb20gbWFzdGVyCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgYnJhbmNoIC1sIGQvZS9mIHNob3VsZCBjcmVhdGUgYSBicmFuY2ggYW5kIGEgbG9nJyBcCisJJ0dJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzozMCIgXAorICAgICBnaXQgYnJhbmNoIC1sIGQvZS9mICYmCisJIHRlc3QgLWYgLmdpdC9yZWZzL2hlYWRzL2QvZS9mICYmCisJIHRlc3QgLWYgLmdpdC9sb2dzL3JlZnMvaGVhZHMvZC9lL2YgJiYKKwkgZGlmZiBleHBlY3QgLmdpdC9sb2dzL3JlZnMvaGVhZHMvZC9lL2YnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgYnJhbmNoIC1kIGQvZS9mIHNob3VsZCBkZWxldGUgYSBicmFuY2ggYW5kIGEgbG9nJyBcCisJJ2dpdCBicmFuY2ggLWQgZC9lL2YgJiYKKwkgdGVzdCAhIC1mIC5naXQvcmVmcy9oZWFkcy9kL2UvZiAmJgorCSB0ZXN0ICEgLWYgLmdpdC9sb2dzL3JlZnMvaGVhZHMvZC9lL2YnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgYnJhbmNoIGovayBzaG91bGQgd29yayBhZnRlciBicmFuY2ggaiBoYXMgYmVlbiBkZWxldGVkJyBcCisgICAgICAgJ2dpdCBicmFuY2ggaiAmJgorICAgICAgICBnaXQgYnJhbmNoIC1kIGogJiYKKyAgICAgICAgZ2l0IGJyYW5jaCBqL2snCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgYnJhbmNoIGwgc2hvdWxkIHdvcmsgYWZ0ZXIgYnJhbmNoIGwvbSBoYXMgYmVlbiBkZWxldGVkJyBcCisgICAgICAgJ2dpdCBicmFuY2ggbC9tICYmCisgICAgICAgIGdpdCBicmFuY2ggLWQgbC9tICYmCisgICAgICAgIGdpdCBicmFuY2ggbCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBicmFuY2ggLW0gbSBtL20gc2hvdWxkIHdvcmsnIFwKKyAgICAgICAnZ2l0IGJyYW5jaCAtbCBtICYmCisgICAgICAgIGdpdCBicmFuY2ggLW0gbSBtL20gJiYKKyAgICAgICAgdGVzdCAtZiAuZ2l0L2xvZ3MvcmVmcy9oZWFkcy9tL20nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgYnJhbmNoIC1tIG4vbiBuIHNob3VsZCB3b3JrJyBcCisgICAgICAgJ2dpdCBicmFuY2ggLWwgbi9uICYmCisgICAgICAgIGdpdCBicmFuY2ggLW0gbi9uIG4KKyAgICAgICAgdGVzdCAtZiAuZ2l0L2xvZ3MvcmVmcy9oZWFkcy9uJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgYnJhbmNoIC1tIG8vbyBvIHNob3VsZCBmYWlsIHdoZW4gby9wIGV4aXN0cycgJworCWdpdCBicmFuY2ggby9vICYmCisgICAgICAgIGdpdCBicmFuY2ggby9wICYmCisJISBnaXQgYnJhbmNoIC1tIG8vbyBvCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBicmFuY2ggLW0gcSByL3Egc2hvdWxkIGZhaWwgd2hlbiByIGV4aXN0cycgJworCWdpdCBicmFuY2ggcSAmJgorCWdpdCBicmFuY2ggciAmJgorCSEgZ2l0IGJyYW5jaCAtbSBxIHIvcQorJworCittdiAuZ2l0L2NvbmZpZyAuZ2l0L2NvbmZpZy1zYXZlZAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgYnJhbmNoIC1tIHEgcTIgd2l0aG91dCBjb25maWcgc2hvdWxkIHN1Y2NlZWQnICcKKwlnaXQgYnJhbmNoIC1tIHEgcTIgJiYKKwlnaXQgYnJhbmNoIC1tIHEyIHEKKycKKworbXYgLmdpdC9jb25maWctc2F2ZWQgLmdpdC9jb25maWcKKworZ2l0IGNvbmZpZyBicmFuY2gucy9zLmR1bW15IEhlbGxvCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgYnJhbmNoIC1tIHMvcyBzIHNob3VsZCB3b3JrIHdoZW4gcy90IGlzIGRlbGV0ZWQnIFwKKyAgICAgICAnZ2l0IGJyYW5jaCAtbCBzL3MgJiYKKyAgICAgICAgdGVzdCAtZiAuZ2l0L2xvZ3MvcmVmcy9oZWFkcy9zL3MgJiYKKyAgICAgICAgZ2l0IGJyYW5jaCAtbCBzL3QgJiYKKyAgICAgICAgdGVzdCAtZiAuZ2l0L2xvZ3MvcmVmcy9oZWFkcy9zL3QgJiYKKyAgICAgICAgZ2l0IGJyYW5jaCAtZCBzL3QgJiYKKyAgICAgICAgZ2l0IGJyYW5jaCAtbSBzL3MgcyAmJgorICAgICAgICB0ZXN0IC1mIC5naXQvbG9ncy9yZWZzL2hlYWRzL3MnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvbmZpZyBpbmZvcm1hdGlvbiB3YXMgcmVuYW1lZCwgdG9vJyBcCisJInRlc3QgJChnaXQgY29uZmlnIGJyYW5jaC5zLmR1bW15KSA9IEhlbGxvICYmCisJICEgZ2l0IGNvbmZpZyBicmFuY2gucy9zL2R1bW15IgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0IGJyYW5jaCAtbSB1IHYgc2hvdWxkIGZhaWwgd2hlbiB0aGUgcmVmbG9nIGZvciB1IGlzIGEgc3ltbGluaycgJworICAgICBnaXQgYnJhbmNoIC1sIHUgJiYKKyAgICAgbXYgLmdpdC9sb2dzL3JlZnMvaGVhZHMvdSByZWFsLXUgJiYKKyAgICAgbG4gLXMgcmVhbC11IC5naXQvbG9ncy9yZWZzL2hlYWRzL3UgJiYKKyAgICAgISBnaXQgYnJhbmNoIC1tIHUgdgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0ZXN0IHRyYWNraW5nIHNldHVwIHZpYSAtLXRyYWNrJyBcCisgICAgJ2dpdCBjb25maWcgcmVtb3RlLmxvY2FsLnVybCAuICYmCisgICAgIGdpdCBjb25maWcgcmVtb3RlLmxvY2FsLmZldGNoIHJlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvbG9jYWwvKiAmJgorICAgICAoZ2l0IHNob3ctcmVmIC1xIHJlZnMvcmVtb3Rlcy9sb2NhbC9tYXN0ZXIgfHwgZ2l0LWZldGNoIGxvY2FsKSAmJgorICAgICBnaXQgYnJhbmNoIC0tdHJhY2sgbXkxIGxvY2FsL21hc3RlciAmJgorICAgICB0ZXN0ICQoZ2l0IGNvbmZpZyBicmFuY2gubXkxLnJlbW90ZSkgPSBsb2NhbCAmJgorICAgICB0ZXN0ICQoZ2l0IGNvbmZpZyBicmFuY2gubXkxLm1lcmdlKSA9IHJlZnMvaGVhZHMvbWFzdGVyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0ZXN0IHRyYWNraW5nIHNldHVwIChub24td2lsZGNhcmQsIG1hdGNoaW5nKScgXAorICAgICdnaXQgY29uZmlnIHJlbW90ZS5sb2NhbC51cmwgLiAmJgorICAgICBnaXQgY29uZmlnIHJlbW90ZS5sb2NhbC5mZXRjaCByZWZzL2hlYWRzL21hc3RlcjpyZWZzL3JlbW90ZXMvbG9jYWwvbWFzdGVyICYmCisgICAgIChnaXQgc2hvdy1yZWYgLXEgcmVmcy9yZW1vdGVzL2xvY2FsL21hc3RlciB8fCBnaXQtZmV0Y2ggbG9jYWwpICYmCisgICAgIGdpdCBicmFuY2ggLS10cmFjayBteTQgbG9jYWwvbWFzdGVyICYmCisgICAgIHRlc3QgJChnaXQgY29uZmlnIGJyYW5jaC5teTQucmVtb3RlKSA9IGxvY2FsICYmCisgICAgIHRlc3QgJChnaXQgY29uZmlnIGJyYW5jaC5teTQubWVyZ2UpID0gcmVmcy9oZWFkcy9tYXN0ZXInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Rlc3QgdHJhY2tpbmcgc2V0dXAgKG5vbi13aWxkY2FyZCwgbm90IG1hdGNoaW5nKScgXAorICAgICdnaXQgY29uZmlnIHJlbW90ZS5sb2NhbC51cmwgLiAmJgorICAgICBnaXQgY29uZmlnIHJlbW90ZS5sb2NhbC5mZXRjaCByZWZzL2hlYWRzL3M6cmVmcy9yZW1vdGVzL2xvY2FsL3MgJiYKKyAgICAgKGdpdCBzaG93LXJlZiAtcSByZWZzL3JlbW90ZXMvbG9jYWwvbWFzdGVyIHx8IGdpdC1mZXRjaCBsb2NhbCkgJiYKKyAgICAgZ2l0IGJyYW5jaCAtLXRyYWNrIG15NSBsb2NhbC9tYXN0ZXIgJiYKKyAgICAgISB0ZXN0ICIkKGdpdCBjb25maWcgYnJhbmNoLm15NS5yZW1vdGUpIiA9IGxvY2FsICYmCisgICAgICEgdGVzdCAiJChnaXQgY29uZmlnIGJyYW5jaC5teTUubWVyZ2UpIiA9IHJlZnMvaGVhZHMvbWFzdGVyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0ZXN0IHRyYWNraW5nIHNldHVwIHZpYSBjb25maWcnIFwKKyAgICAnZ2l0IGNvbmZpZyBicmFuY2guYXV0b3NldHVwbWVyZ2UgdHJ1ZSAmJgorICAgICBnaXQgY29uZmlnIHJlbW90ZS5sb2NhbC51cmwgLiAmJgorICAgICBnaXQgY29uZmlnIHJlbW90ZS5sb2NhbC5mZXRjaCByZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL2xvY2FsLyogJiYKKyAgICAgKGdpdCBzaG93LXJlZiAtcSByZWZzL3JlbW90ZXMvbG9jYWwvbWFzdGVyIHx8IGdpdC1mZXRjaCBsb2NhbCkgJiYKKyAgICAgZ2l0IGJyYW5jaCBteTMgbG9jYWwvbWFzdGVyICYmCisgICAgIHRlc3QgJChnaXQgY29uZmlnIGJyYW5jaC5teTMucmVtb3RlKSA9IGxvY2FsICYmCisgICAgIHRlc3QgJChnaXQgY29uZmlnIGJyYW5jaC5teTMubWVyZ2UpID0gcmVmcy9oZWFkcy9tYXN0ZXInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Rlc3Qgb3ZlcnJpZGluZyB0cmFja2luZyBzZXR1cCB2aWEgLS1uby10cmFjaycgXAorICAgICdnaXQgY29uZmlnIGJyYW5jaC5hdXRvc2V0dXBtZXJnZSB0cnVlICYmCisgICAgIGdpdCBjb25maWcgcmVtb3RlLmxvY2FsLnVybCAuICYmCisgICAgIGdpdCBjb25maWcgcmVtb3RlLmxvY2FsLmZldGNoIHJlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvbG9jYWwvKiAmJgorICAgICAoZ2l0IHNob3ctcmVmIC1xIHJlZnMvcmVtb3Rlcy9sb2NhbC9tYXN0ZXIgfHwgZ2l0LWZldGNoIGxvY2FsKSAmJgorICAgICBnaXQgYnJhbmNoIC0tbm8tdHJhY2sgbXkyIGxvY2FsL21hc3RlciAmJgorICAgICBnaXQgY29uZmlnIGJyYW5jaC5hdXRvc2V0dXBtZXJnZSBmYWxzZSAmJgorICAgICAhIHRlc3QgIiQoZ2l0IGNvbmZpZyBicmFuY2gubXkyLnJlbW90ZSkiID0gbG9jYWwgJiYKKyAgICAgISB0ZXN0ICIkKGdpdCBjb25maWcgYnJhbmNoLm15Mi5tZXJnZSkiID0gcmVmcy9oZWFkcy9tYXN0ZXInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ25vIHRyYWNraW5nIHdpdGhvdXQgLmZldGNoIGVudHJpZXMnIFwKKyAgICAnZ2l0IGNvbmZpZyBicmFuY2guYXV0b3NldHVwbWVyZ2UgdHJ1ZSAmJgorICAgICBnaXQgYnJhbmNoIG15NiBzICYmCisgICAgIGdpdCBjb25maWcgYnJhbmNoLmF1dG9tc2V0dXBtZXJnZSBmYWxzZSAmJgorICAgICB0ZXN0IC16ICIkKGdpdCBjb25maWcgYnJhbmNoLm15Ni5yZW1vdGUpIiAmJgorICAgICB0ZXN0IC16ICIkKGdpdCBjb25maWcgYnJhbmNoLm15Ni5tZXJnZSkiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0ZXN0IHRyYWNraW5nIHNldHVwIHZpYSAtLXRyYWNrIGJ1dCBkZWVwZXInIFwKKyAgICAnZ2l0IGNvbmZpZyByZW1vdGUubG9jYWwudXJsIC4gJiYKKyAgICAgZ2l0IGNvbmZpZyByZW1vdGUubG9jYWwuZmV0Y2ggcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9sb2NhbC8qICYmCisgICAgIChnaXQgc2hvdy1yZWYgLXEgcmVmcy9yZW1vdGVzL2xvY2FsL28vbyB8fCBnaXQtZmV0Y2ggbG9jYWwpICYmCisgICAgIGdpdCBicmFuY2ggLS10cmFjayBteTcgbG9jYWwvby9vICYmCisgICAgIHRlc3QgIiQoZ2l0IGNvbmZpZyBicmFuY2gubXk3LnJlbW90ZSkiID0gbG9jYWwgJiYKKyAgICAgdGVzdCAiJChnaXQgY29uZmlnIGJyYW5jaC5teTcubWVyZ2UpIiA9IHJlZnMvaGVhZHMvby9vJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0ZXN0IGRlbGV0aW5nIGJyYW5jaCBkZWxldGVzIGJyYW5jaCBjb25maWcnIFwKKyAgICAnZ2l0IGJyYW5jaCAtZCBteTcgJiYKKyAgICAgdGVzdCAteiAiJChnaXQgY29uZmlnIGJyYW5jaC5teTcucmVtb3RlKSIgJiYKKyAgICAgdGVzdCAteiAiJChnaXQgY29uZmlnIGJyYW5jaC5teTcubWVyZ2UpIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGVzdCBkZWxldGluZyBicmFuY2ggd2l0aG91dCBjb25maWcnIFwKKyAgICAnZ2l0IGJyYW5jaCBteTcgcyAmJgorICAgICB0ZXN0ICIkKGdpdCBicmFuY2ggLWQgbXk3IDI+JjEpIiA9ICJEZWxldGVkIGJyYW5jaCBteTcuIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGVzdCAtLXRyYWNrIHdpdGhvdXQgLmZldGNoIGVudHJpZXMnIFwKKyAgICAnZ2l0IGJyYW5jaCAtLXRyYWNrIG15OCAmJgorICAgICB0ZXN0ICIkKGdpdCBjb25maWcgYnJhbmNoLm15OC5yZW1vdGUpIiAmJgorICAgICB0ZXN0ICIkKGdpdCBjb25maWcgYnJhbmNoLm15OC5tZXJnZSkiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnYnJhbmNoIGZyb20gbm9uLWJyYW5jaCBIRUFEIHcvYXV0b3NldHVwbWVyZ2U9YWx3YXlzJyBcCisgICAgJ2dpdCBjb25maWcgYnJhbmNoLmF1dG9zZXR1cG1lcmdlIGFsd2F5cyAmJgorICAgICBnaXQgYnJhbmNoIG15OSBIRUFEXiAmJgorICAgICBnaXQgY29uZmlnIGJyYW5jaC5hdXRvc2V0dXBtZXJnZSBmYWxzZScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2JyYW5jaCBmcm9tIG5vbi1icmFuY2ggSEVBRCB3Ly0tdHJhY2sgY2F1c2VzIGZhaWx1cmUnIFwKKyAgICAnIShnaXQgYnJhbmNoIC0tdHJhY2sgbXkxMCBIRUFEXiknCisKKyMgS2VlcCB0aGlzIHRlc3QgbGFzdCwgYXMgaXQgY2hhbmdlcyB0aGUgY3VycmVudCBicmFuY2gKK2NhdCA+ZXhwZWN0IDw8RU9GCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICRIRUFEICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUwMjAwICswMDAwCWJyYW5jaDogQ3JlYXRlZCBmcm9tIG1hc3RlcgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0IGNoZWNrb3V0IC1iIGcvaC9pIC1sIHNob3VsZCBjcmVhdGUgYSBicmFuY2ggYW5kIGEgbG9nJyBcCisJJ0dJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzozMCIgXAorICAgICBnaXQtY2hlY2tvdXQgLWIgZy9oL2kgLWwgbWFzdGVyICYmCisJIHRlc3QgLWYgLmdpdC9yZWZzL2hlYWRzL2cvaC9pICYmCisJIHRlc3QgLWYgLmdpdC9sb2dzL3JlZnMvaGVhZHMvZy9oL2kgJiYKKwkgZGlmZiBleHBlY3QgLmdpdC9sb2dzL3JlZnMvaGVhZHMvZy9oL2knCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2F2b2lkIGFtYmlndW91cyB0cmFjaycgJworCWdpdCBjb25maWcgYnJhbmNoLmF1dG9zZXR1cG1lcmdlIHRydWUgJiYKKwlnaXQgY29uZmlnIHJlbW90ZS5hbWJpMS51cmwgbGFsYWxhICYmCisJZ2l0IGNvbmZpZyByZW1vdGUuYW1iaTEuZmV0Y2ggcmVmcy9oZWFkcy9sYWxhbGE6cmVmcy9oZWFkcy9tYXN0ZXIgJiYKKwlnaXQgY29uZmlnIHJlbW90ZS5hbWJpMi51cmwgbGlsaWxpICYmCisJZ2l0IGNvbmZpZyByZW1vdGUuYW1iaTIuZmV0Y2ggcmVmcy9oZWFkcy9saWxpbGk6cmVmcy9oZWFkcy9tYXN0ZXIgJiYKKwlnaXQgYnJhbmNoIGFsbDEgbWFzdGVyICYmCisJdGVzdCAteiAiJChnaXQgY29uZmlnIGJyYW5jaC5hbGwxLm1lcmdlKSIKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzMjAxLWJyYW5jaC1jb250YWlucy5zaCBiL3QvdDMyMDEtYnJhbmNoLWNvbnRhaW5zLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI0Y2Y2MjgKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzMjAxLWJyYW5jaC1jb250YWlucy5zaApAQCAtMCwwICsxLDU4IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nYnJhbmNoIC0tY29udGFpbnMgPGNvbW1pdD4nCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKworCT5maWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSBpbml0aWFsICYmCisJZ2l0IGJyYW5jaCBzaWRlICYmCisKKwllY2hvIDEgPmZpbGUgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJzZWNvbmQgb24gbWFzdGVyIiAmJgorCisJZ2l0IGNoZWNrb3V0IHNpZGUgJiYKKwllY2hvIDEgPmZpbGUgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJzZWNvbmQgb24gc2lkZSIgJiYKKworCWdpdCBtZXJnZSBtYXN0ZXIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdicmFuY2ggLS1jb250YWlucz1tYXN0ZXInICcKKworCWdpdCBicmFuY2ggLS1jb250YWlucz1tYXN0ZXIgPmFjdHVhbCAmJgorCXsKKwkJZWNobyAiICBtYXN0ZXIiICYmIGVjaG8gIiogc2lkZSIKKwl9ID5leHBlY3QgJiYKKwl0ZXN0X2NtcCBleHBlY3QgYWN0dWFsCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYnJhbmNoIC0tY29udGFpbnMgbWFzdGVyJyAnCisKKwlnaXQgYnJhbmNoIC0tY29udGFpbnMgbWFzdGVyID5hY3R1YWwgJiYKKwl7CisJCWVjaG8gIiAgbWFzdGVyIiAmJiBlY2hvICIqIHNpZGUiCisJfSA+ZXhwZWN0ICYmCisJdGVzdF9jbXAgZXhwZWN0IGFjdHVhbAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2JyYW5jaCAtLWNvbnRhaW5zPXNpZGUnICcKKworCWdpdCBicmFuY2ggLS1jb250YWlucz1zaWRlID5hY3R1YWwgJiYKKwl7CisJCWVjaG8gIiogc2lkZSIKKwl9ID5leHBlY3QgJiYKKwl0ZXN0X2NtcCBleHBlY3QgYWN0dWFsCisKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzMjEwLXBhY2stcmVmcy5zaCBiL3QvdDMyMTAtcGFjay1yZWZzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI2NGNjZmIKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzMjEwLXBhY2stcmVmcy5zaApAQCAtMCwwICsxLDEwOCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBBbW9zIFdhdGVybGFuZAorIyBDb3B5cmlnaHQgKGMpIDIwMDYgQ2hyaXN0aWFuIENvdWRlcgorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgcGFjay1yZWZzIHNob3VsZCBub3QgY2hhbmdlIHRoZSBicmFuY2ggc2VtYW50aWMKKworVGhpcyB0ZXN0IHJ1bnMgZ2l0IHBhY2stcmVmcyBhbmQgZ2l0IHNob3ctcmVmIGFuZCBjaGVja3MgdGhhdCB0aGUgYnJhbmNoCitzZW1hbnRpYyBpcyBzdGlsbCB0aGUgc2FtZS4KKycKKy4gLi90ZXN0LWxpYi5zaAorCitlY2hvICdbY29yZV0gbG9nYWxscmVmdXBkYXRlcyA9IHRydWUnID4+LmdpdC9jb25maWcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgYSB0cml2aWFsIHJlcG9zaXRvcnknIFwKKyAgICAnZWNobyBIZWxsbyA+IEEgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBBICYmCisgICAgIGdpdC1jb21taXQgLW0gIkluaXRpYWwgY29tbWl0LiIgJiYKKyAgICAgSEVBRD0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCknCisKK1NIQTE9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzZWUgaWYgZ2l0IHNob3ctcmVmIHdvcmtzIGFzIGV4cGVjdGVkJyBcCisgICAgJ2dpdCBicmFuY2ggYSAmJgorICAgICBTSEExPWBjYXQgLmdpdC9yZWZzL2hlYWRzL2FgICYmCisgICAgIGVjaG8gIiRTSEExIHJlZnMvaGVhZHMvYSIgPmV4cGVjdCAmJgorICAgICBnaXQgc2hvdy1yZWYgYSA+cmVzdWx0ICYmCisgICAgIGRpZmYgZXhwZWN0IHJlc3VsdCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3NlZSBpZiBhIGJyYW5jaCBzdGlsbCBleGlzdHMgd2hlbiBwYWNrZWQnIFwKKyAgICAnZ2l0IGJyYW5jaCBiICYmCisgICAgIGdpdCBwYWNrLXJlZnMgLS1hbGwgJiYKKyAgICAgcm0gLWYgLmdpdC9yZWZzL2hlYWRzL2IgJiYKKyAgICAgZWNobyAiJFNIQTEgcmVmcy9oZWFkcy9iIiA+ZXhwZWN0ICYmCisgICAgIGdpdCBzaG93LXJlZiBiID5yZXN1bHQgJiYKKyAgICAgZGlmZiBleHBlY3QgcmVzdWx0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgYnJhbmNoIGMvZCBzaG91bGQgYmFyZiBpZiBicmFuY2ggYyBleGlzdHMnICcKKyAgICAgZ2l0IGJyYW5jaCBjICYmCisgICAgIGdpdCBwYWNrLXJlZnMgLS1hbGwgJiYKKyAgICAgcm0gLWYgLmdpdC9yZWZzL2hlYWRzL2MgJiYKKyAgICAgISBnaXQgYnJhbmNoIGMvZAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc2VlIGlmIGEgYnJhbmNoIHN0aWxsIGV4aXN0cyBhZnRlciBnaXQgcGFjay1yZWZzIC0tcHJ1bmUnIFwKKyAgICAnZ2l0IGJyYW5jaCBlICYmCisgICAgIGdpdCBwYWNrLXJlZnMgLS1hbGwgLS1wcnVuZSAmJgorICAgICBlY2hvICIkU0hBMSByZWZzL2hlYWRzL2UiID5leHBlY3QgJiYKKyAgICAgZ2l0IHNob3ctcmVmIGUgPnJlc3VsdCAmJgorICAgICBkaWZmIGV4cGVjdCByZXN1bHQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NlZSBpZiBnaXQgcGFjay1yZWZzIC0tcHJ1bmUgcmVtb3ZlIHJlZiBmaWxlcycgJworICAgICBnaXQgYnJhbmNoIGYgJiYKKyAgICAgZ2l0IHBhY2stcmVmcyAtLWFsbCAtLXBydW5lICYmCisgICAgICEgdGVzdCAtZiAuZ2l0L3JlZnMvaGVhZHMvZgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0IGJyYW5jaCBnIHNob3VsZCB3b3JrIHdoZW4gZ2l0IGJyYW5jaCBnL2ggaGFzIGJlZW4gZGVsZXRlZCcgXAorICAgICdnaXQgYnJhbmNoIGcvaCAmJgorICAgICBnaXQgcGFjay1yZWZzIC0tYWxsIC0tcHJ1bmUgJiYKKyAgICAgZ2l0IGJyYW5jaCAtZCBnL2ggJiYKKyAgICAgZ2l0IGJyYW5jaCBnICYmCisgICAgIGdpdCBwYWNrLXJlZnMgLS1hbGwgJiYKKyAgICAgZ2l0IGJyYW5jaCAtZCBnJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgYnJhbmNoIGkvai9rIHNob3VsZCBiYXJmIGlmIGJyYW5jaCBpIGV4aXN0cycgJworICAgICBnaXQgYnJhbmNoIGkgJiYKKyAgICAgZ2l0IHBhY2stcmVmcyAtLWFsbCAtLXBydW5lICYmCisgICAgICEgZ2l0IGJyYW5jaCBpL2ovaworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndGVzdCBnaXQgYnJhbmNoIGsgYWZ0ZXIgYnJhbmNoIGsvbC9tIGFuZCBrL2xtIGhhdmUgYmVlbiBkZWxldGVkJyBcCisgICAgJ2dpdCBicmFuY2ggay9sICYmCisgICAgIGdpdCBicmFuY2ggay9sbSAmJgorICAgICBnaXQgYnJhbmNoIC1kIGsvbCAmJgorICAgICBnaXQgYnJhbmNoIGsvbC9tICYmCisgICAgIGdpdCBicmFuY2ggLWQgay9sL20gJiYKKyAgICAgZ2l0IGJyYW5jaCAtZCBrL2xtICYmCisgICAgIGdpdCBicmFuY2ggaycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3Rlc3QgZ2l0IGJyYW5jaCBuIGFmdGVyIHNvbWUgYnJhbmNoIGRlbGV0aW9uIGFuZCBwcnVuaW5nJyBcCisgICAgJ2dpdCBicmFuY2ggbi9vICYmCisgICAgIGdpdCBicmFuY2ggbi9vcCAmJgorICAgICBnaXQgYnJhbmNoIC1kIG4vbyAmJgorICAgICBnaXQgYnJhbmNoIG4vby9wICYmCisgICAgIGdpdCBicmFuY2ggLWQgbi9vcCAmJgorICAgICBnaXQgcGFjay1yZWZzIC0tYWxsIC0tcHJ1bmUgJiYKKyAgICAgZ2l0IGJyYW5jaCAtZCBuL28vcCAmJgorICAgICBnaXQgYnJhbmNoIG4nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3BhY2ssIHBydW5lIGFuZCByZXBhY2snICcKKwlnaXQtdGFnIGZvbyAmJgorCWdpdCBwYWNrLXJlZnMgLS1hbGwgLS1wcnVuZSAmJgorCWdpdCBzaG93LXJlZiA+YWxsLW9mLXRoZW0gJiYKKwlnaXQgcGFjay1yZWZzICYmCisJZ2l0IHNob3ctcmVmID5hZ2FpbiAmJgorCWRpZmYgYWxsLW9mLXRoZW0gYWdhaW4KKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzMzAwLWZ1bm55LW5hbWVzLnNoIGIvdC90MzMwMC1mdW5ueS1uYW1lcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNGEwMGE5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90MzMwMC1mdW5ueS1uYW1lcy5zaApAQCAtMCwwICsxLDE2MCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdQYXRobmFtZXMgd2l0aCBmdW5ueSBjaGFyYWN0ZXJzLgorCitUaGlzIHRlc3QgdHJpZXMgcGF0aG5hbWVzIHdpdGggZnVubnkgY2hhcmFjdGVycyBpbiB0aGUgd29ya2luZwordHJlZSwgaW5kZXgsIGFuZCB0cmVlIG9iamVjdHMuCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCitwMD0nbm8tZnVubnknCitwMT0ndGFicwksIiAoZHEpIGFuZCBzcGFjZXMnCitwMj0nanVzdCBzcGFjZScKKworY2F0ID4iJHAwIiA8PFxFT0YKKzEuIEEgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgY2F0LCBvb3BzIGRvZy4KKzIuIEEgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgY2F0LCBvb3BzIGRvZy4KKzMuIEEgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgY2F0LCBvb3BzIGRvZy4KK0VPRgorCitjYXQgPiIkcDEiICIkcDAiCitlY2hvICdGb28gQmFyIEJheicgPiIkcDIiCisKK3Rlc3QgLWYgIiRwMSIgJiYgY21wICIkcDAiICIkcDEiIHx8IHsKKwkjIHNpbmNlIEZBVC9OVEZTIGRvZXMgbm90IGFsbG93IHRhYnMgaW4gZmlsZW5hbWVzLCBza2lwIHRoaXMgdGVzdAorCXNheSAnWW91ciBmaWxlc3lzdGVtIGRvZXMgbm90IGFsbG93IHRhYnMgaW4gZmlsZW5hbWVzLCB0ZXN0IHNraXBwZWQuJworCXRlc3RfZG9uZQorfQorCitlY2hvICdqdXN0IHNwYWNlCituby1mdW5ueScgPmV4cGVjdGVkCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgbHMtZmlsZXMgbm8tZnVubnknIFwKKwknZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAiJHAwIiAiJHAyIiAmJgorCWdpdCBscy1maWxlcyA+Y3VycmVudCAmJgorCWdpdCBkaWZmIGV4cGVjdGVkIGN1cnJlbnQnCisKK3QwPWBnaXQgd3JpdGUtdHJlZWAKK2VjaG8gIiR0MCIgPnQwCisKK2NhdCA+IGV4cGVjdGVkIDw8XEVPRgoranVzdCBzcGFjZQorbm8tZnVubnkKKyJ0YWJzXHQsXCIgKGRxKSBhbmQgc3BhY2VzIgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgbHMtZmlsZXMgd2l0aC1mdW5ueScgXAorCSdnaXQgdXBkYXRlLWluZGV4IC0tYWRkICIkcDEiICYmCisJZ2l0IGxzLWZpbGVzID5jdXJyZW50ICYmCisJZ2l0IGRpZmYgZXhwZWN0ZWQgY3VycmVudCcKKworZWNobyAnanVzdCBzcGFjZQorbm8tZnVubnkKK3RhYnMJLCIgKGRxKSBhbmQgc3BhY2VzJyA+ZXhwZWN0ZWQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBscy1maWxlcyAteiB3aXRoLWZ1bm55JyBcCisJJ2dpdCBscy1maWxlcyAteiB8IHBlcmwgLXBlIHkvXFwwMDAvXFwwMTIvID5jdXJyZW50ICYmCisJZ2l0IGRpZmYgZXhwZWN0ZWQgY3VycmVudCcKKwordDE9YGdpdCB3cml0ZS10cmVlYAorZWNobyAiJHQxIiA+dDEKKworY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCitqdXN0IHNwYWNlCituby1mdW5ueQorInRhYnNcdCxcIiAoZHEpIGFuZCBzcGFjZXMiCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBscy10cmVlIHdpdGggZnVubnknIFwKKwknZ2l0IGxzLXRyZWUgLXIgJHQxIHwgc2VkIC1lICJzL15bXgldKgkvLyIgPmN1cnJlbnQgJiYKKwkgZ2l0IGRpZmYgZXhwZWN0ZWQgY3VycmVudCcKKworY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCitBCSJ0YWJzXHQsXCIgKGRxKSBhbmQgc3BhY2VzIgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZi1pbmRleCB3aXRoLWZ1bm55JyBcCisJJ2dpdCBkaWZmLWluZGV4IC0tbmFtZS1zdGF0dXMgJHQwID5jdXJyZW50ICYmCisJZ2l0IGRpZmYgZXhwZWN0ZWQgY3VycmVudCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtdHJlZSB3aXRoLWZ1bm55JyBcCisJJ2dpdCBkaWZmLXRyZWUgLS1uYW1lLXN0YXR1cyAkdDAgJHQxID5jdXJyZW50ICYmCisJZ2l0IGRpZmYgZXhwZWN0ZWQgY3VycmVudCcKKworZWNobyAnQQordGFicwksIiAoZHEpIGFuZCBzcGFjZXMnID5leHBlY3RlZAordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtaW5kZXggLXogd2l0aC1mdW5ueScgXAorCSdnaXQgZGlmZi1pbmRleCAteiAtLW5hbWUtc3RhdHVzICR0MCB8IHBlcmwgLXBlIHkvXFwwMDAvXFwwMTIvID5jdXJyZW50ICYmCisJZ2l0IGRpZmYgZXhwZWN0ZWQgY3VycmVudCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtdHJlZSAteiB3aXRoLWZ1bm55JyBcCisJJ2dpdCBkaWZmLXRyZWUgLXogLS1uYW1lLXN0YXR1cyAkdDAgJHQxIHwgcGVybCAtcGUgeS9cXDAwMC9cXDAxMi8gPmN1cnJlbnQgJiYKKwlnaXQgZGlmZiBleHBlY3RlZCBjdXJyZW50JworCitjYXQgPiBleHBlY3RlZCA8PFxFT0YKK0NOVU0Jbm8tZnVubnkJInRhYnNcdCxcIiAoZHEpIGFuZCBzcGFjZXMiCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmLXRyZWUgLUMgd2l0aC1mdW5ueScgXAorCSdnaXQgZGlmZi10cmVlIC1DIC0tZmluZC1jb3BpZXMtaGFyZGVyIC0tbmFtZS1zdGF0dXMgXAorCQkkdDAgJHQxIHwgc2VkIC1lICdzL15DWzAtOV0qL0NOVU0vJyA+Y3VycmVudCAmJgorCWdpdCBkaWZmIGV4cGVjdGVkIGN1cnJlbnQnCisKK2NhdCA+IGV4cGVjdGVkIDw8XEVPRgorUk5VTQluby1mdW5ueQkidGFic1x0LFwiIChkcSkgYW5kIHNwYWNlcyIKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtdHJlZSBkZWxldGUgd2l0aC1mdW5ueScgXAorCSdnaXQgdXBkYXRlLWluZGV4IC0tZm9yY2UtcmVtb3ZlICIkcDAiICYmCisJZ2l0IGRpZmYtaW5kZXggLU0gLS1uYW1lLXN0YXR1cyBcCisJCSR0MCB8IHNlZCAtZSAncy9eUlswLTldKi9STlVNLycgPmN1cnJlbnQgJiYKKwlnaXQgZGlmZiBleHBlY3RlZCBjdXJyZW50JworCitjYXQgPiBleHBlY3RlZCA8PFxFT0YKK2RpZmYgLS1naXQgYS9uby1mdW5ueSAiYi90YWJzXHQsXCIgKGRxKSBhbmQgc3BhY2VzIgorc2ltaWxhcml0eSBpbmRleCBOVU0lCityZW5hbWUgZnJvbSBuby1mdW5ueQorcmVuYW1lIHRvICJ0YWJzXHQsXCIgKGRxKSBhbmQgc3BhY2VzIgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZi10cmVlIGRlbGV0ZSB3aXRoLWZ1bm55JyBcCisJJ2dpdCBkaWZmLWluZGV4IC1NIC1wICR0MCB8CisJIHNlZCAtZSAicy9pbmRleCBbMC05XSolL2luZGV4IE5VTSUvIiA+Y3VycmVudCAmJgorCSBnaXQgZGlmZiBleHBlY3RlZCBjdXJyZW50JworCitjaG1vZCAreCAiJHAxIgorY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCitkaWZmIC0tZ2l0IGEvbm8tZnVubnkgImIvdGFic1x0LFwiIChkcSkgYW5kIHNwYWNlcyIKK29sZCBtb2RlIDEwMDY0NAorbmV3IG1vZGUgMTAwNzU1CitzaW1pbGFyaXR5IGluZGV4IE5VTSUKK3JlbmFtZSBmcm9tIG5vLWZ1bm55CityZW5hbWUgdG8gInRhYnNcdCxcIiAoZHEpIGFuZCBzcGFjZXMiCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmLXRyZWUgZGVsZXRlIHdpdGgtZnVubnknIFwKKwknZ2l0IGRpZmYtaW5kZXggLU0gLXAgJHQwIHwKKwkgc2VkIC1lICJzL2luZGV4IFswLTldKiUvaW5kZXggTlVNJS8iID5jdXJyZW50ICYmCisJIGdpdCBkaWZmIGV4cGVjdGVkIGN1cnJlbnQnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCisgInRhYnNcdCxcIiAoZHEpIGFuZCBzcGFjZXMiCisgMSBmaWxlcyBjaGFuZ2VkLCAwIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmLXRyZWUgcmVuYW1lIHdpdGgtZnVubnkgYXBwbGllZCcgXAorCSdnaXQgZGlmZi1pbmRleCAtTSAtcCAkdDAgfAorCSBnaXQgYXBwbHkgLS1zdGF0IHwgc2VkIC1lICJzL3wuKi8vIiAtZSAicy8gKlwkLy8iID5jdXJyZW50ICYmCisJIGdpdCBkaWZmIGV4cGVjdGVkIGN1cnJlbnQnCisKK2NhdCA+IGV4cGVjdGVkIDw8XEVPRgorIG5vLWZ1bm55CisgInRhYnNcdCxcIiAoZHEpIGFuZCBzcGFjZXMiCisgMiBmaWxlcyBjaGFuZ2VkLCAzIGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmLXRyZWUgZGVsZXRlIHdpdGgtZnVubnkgYXBwbGllZCcgXAorCSdnaXQgZGlmZi1pbmRleCAtcCAkdDAgfAorCSBnaXQgYXBwbHkgLS1zdGF0IHwgc2VkIC1lICJzL3wuKi8vIiAtZSAicy8gKlwkLy8iID5jdXJyZW50ICYmCisJIGdpdCBkaWZmIGV4cGVjdGVkIGN1cnJlbnQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBhcHBseSBub24tZ2l0IGRpZmYnIFwKKwknZ2l0IGRpZmYtaW5kZXggLXAgJHQwIHwKKwkgc2VkIC1uZSAiL15bLStAXS9wIiB8CisJIGdpdCBhcHBseSAtLXN0YXQgfCBzZWQgLWUgInMvfC4qLy8iIC1lICJzLyAqXCQvLyIgPmN1cnJlbnQgJiYKKwkgZ2l0IGRpZmYgZXhwZWN0ZWQgY3VycmVudCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzNDAwLXJlYmFzZS5zaCBiL3QvdDM0MDAtcmViYXNlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ5NmY0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzNDAwLXJlYmFzZS5zaApAQCAtMCwwICsxLDg2IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEFtb3MgV2F0ZXJsYW5kCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCByZWJhc2Ugc2hvdWxkIG5vdCBkZXN0cm95IGF1dGhvciBpbmZvcm1hdGlvbgorCitUaGlzIHRlc3QgcnVucyBnaXQgcmViYXNlIGFuZCBjaGVja3MgdGhhdCB0aGUgYXV0aG9yIGluZm9ybWF0aW9uIGlzIG5vdCBsb3N0LgorJworLiAuL3Rlc3QtbGliLnNoCisKK2V4cG9ydCBHSVRfQVVUSE9SX0VNQUlMPWJvZ3VzX2VtYWlsX2FkZHJlc3MKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgcmVwb3NpdG9yeSB3aXRoIHRvcGljIGJyYW5jaGVzJyBcCisgICAgJ2VjaG8gRmlyc3QgPiBBICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgQSAmJgorICAgICBnaXQtY29tbWl0IC1tICJBZGQgQS4iICYmCisgICAgIGdpdCBjaGVja291dCAtYiBteS10b3BpYy1icmFuY2ggJiYKKyAgICAgZWNobyBTZWNvbmQgPiBCICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgQiAmJgorICAgICBnaXQtY29tbWl0IC1tICJBZGQgQi4iICYmCisgICAgIGdpdCBjaGVja291dCAtZiBtYXN0ZXIgJiYKKyAgICAgZWNobyBUaGlyZCA+PiBBICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggQSAmJgorICAgICBnaXQtY29tbWl0IC1tICJNb2RpZnkgQS4iICYmCisgICAgIGdpdCBjaGVja291dCAtYiBzaWRlIG15LXRvcGljLWJyYW5jaCAmJgorICAgICBlY2hvIFNpZGUgPj4gQyAmJgorICAgICBnaXQgYWRkIEMgJiYKKyAgICAgZ2l0IGNvbW1pdCAtbSAiQWRkIEMiICYmCisgICAgIGdpdCBjaGVja291dCAtYiBub25saW5lYXIgbXktdG9waWMtYnJhbmNoICYmCisgICAgIGVjaG8gRWRpdCA+PiBCICYmCisgICAgIGdpdCBhZGQgQiAmJgorICAgICBnaXQgY29tbWl0IC1tICJNb2RpZnkgQiIgJiYKKyAgICAgZ2l0IG1lcmdlIHNpZGUgJiYKKyAgICAgZ2l0IGNoZWNrb3V0IC1iIHVwc3RyZWFtLW1lcmdlZC1ub25saW5lYXIgJiYKKyAgICAgZ2l0IG1lcmdlIG1hc3RlciAmJgorICAgICBnaXQgY2hlY2tvdXQgLWYgbXktdG9waWMtYnJhbmNoICYmCisgICAgIGdpdCB0YWcgdG9waWMKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmViYXNlIGFnYWluc3QgbWFzdGVyJyAnCisgICAgIGdpdCByZWJhc2UgbWFzdGVyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndGhlIHJlYmFzZSBvcGVyYXRpb24gc2hvdWxkIG5vdCBoYXZlIGRlc3Ryb3llZCBhdXRob3IgaW5mb3JtYXRpb24nIFwKKyAgICAnISBnaXQgbG9nIHwgZ3JlcCAiQXV0aG9yOiIgfCBncmVwICI8PiInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlYmFzZSBhZnRlciBtZXJnZSBtYXN0ZXInICcKKyAgICAgZ2l0IHJlc2V0IC0taGFyZCB0b3BpYyAmJgorICAgICBnaXQgbWVyZ2UgbWFzdGVyICYmCisgICAgIGdpdCByZWJhc2UgbWFzdGVyICYmCisgICAgICEgZ2l0IHNob3cgfCBncmVwICJeTWVyZ2U6IgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZWJhc2Ugb2YgaGlzdG9yeSB3aXRoIG1lcmdlcyBpcyBsaW5lYXJpemVkJyAnCisgICAgIGdpdCBjaGVja291dCBub25saW5lYXIgJiYKKyAgICAgdGVzdCA0ID0gJChnaXQgcmV2LWxpc3QgbWFzdGVyLi4gfCB3YyAtbCkgJiYKKyAgICAgZ2l0IHJlYmFzZSBtYXN0ZXIgJiYKKyAgICAgdGVzdCAzID0gJChnaXQgcmV2LWxpc3QgbWFzdGVyLi4gfCB3YyAtbCkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3JlYmFzZSBvZiBoaXN0b3J5IHdpdGggbWVyZ2VzIGFmdGVyIHVwc3RyZWFtIG1lcmdlIGlzIGxpbmVhcml6ZWQnICcKKyAgICAgZ2l0IGNoZWNrb3V0IHVwc3RyZWFtLW1lcmdlZC1ub25saW5lYXIgJiYKKyAgICAgdGVzdCA1ID0gJChnaXQgcmV2LWxpc3QgbWFzdGVyLi4gfCB3YyAtbCkgJiYKKyAgICAgZ2l0IHJlYmFzZSBtYXN0ZXIgJiYKKyAgICAgdGVzdCAzID0gJChnaXQgcmV2LWxpc3QgbWFzdGVyLi4gfCB3YyAtbCkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmViYXNlIGEgc2luZ2xlIG1vZGUgY2hhbmdlJyAnCisgICAgIGdpdCBjaGVja291dCBtYXN0ZXIgJiYKKyAgICAgZWNobyAxID4gWCAmJgorICAgICBnaXQgYWRkIFggJiYKKyAgICAgdGVzdF90aWNrICYmCisgICAgIGdpdCBjb21taXQgLW0gcHJlcGFyZSAmJgorICAgICBnaXQgY2hlY2tvdXQgLWIgbW9kZWNoYW5nZSBIRUFEXiAmJgorICAgICBlY2hvIDEgPiBYICYmCisgICAgIGdpdCBhZGQgWCAmJgorICAgICBjaG1vZCBhK3ggQSAmJgorICAgICB0ZXN0X3RpY2sgJiYKKyAgICAgZ2l0IGNvbW1pdCAtbSBtb2RlY2hhbmdlIEEgWCAmJgorICAgICBHSVRfVFJBQ0U9MSBnaXQgcmViYXNlIG1hc3RlcgorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDM0MDEtcmViYXNlLXBhcnRpYWwuc2ggYi90L3QzNDAxLXJlYmFzZS1wYXJ0aWFsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ5MzRhNGUKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzNDAxLXJlYmFzZS1wYXJ0aWFsLnNoCkBAIC0wLDAgKzEsNjEgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgWWFubiBEaXJzb24sIGJhc2VkIG9uIHQzNDAwIGJ5IEFtb3MgV2F0ZXJsYW5kCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCByZWJhc2Ugc2hvdWxkIGRldGVjdCBwYXRjaGVzIGludGVncmF0ZWQgdXBzdHJlYW0KKworVGhpcyB0ZXN0IGNoZXJyeS1waWNrcyBvbmUgbG9jYWwgY2hhbmdlIG9mIHR3byBpbnRvIG1hc3RlciBicmFuY2gsIGFuZAorY2hlY2tzIHRoYXQgZ2l0IHJlYmFzZSBzdWNjZWVkcyB3aXRoIG9ubHkgdGhlIHNlY29uZCBwYXRjaCBpbiB0aGUKK2xvY2FsIGJyYW5jaC4KKycKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSByZXBvc2l0b3J5IHdpdGggdG9waWMgYnJhbmNoJyBcCisgICAgJ2VjaG8gRmlyc3QgPiBBICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgQSAmJgorICAgICBnaXQtY29tbWl0IC1tICJBZGQgQS4iICYmCisKKyAgICAgZ2l0LWNoZWNrb3V0IC1iIG15LXRvcGljLWJyYW5jaCAmJgorCisgICAgIGVjaG8gU2Vjb25kID4gQiAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIEIgJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSAiQWRkIEIuIiAmJgorCisgICAgIGVjaG8gQW5vdGhlclNlY29uZCA+IEMgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBDICYmCisgICAgIGdpdC1jb21taXQgLW0gIkFkZCBDLiIgJiYKKworICAgICBnaXQtY2hlY2tvdXQgLWYgbWFzdGVyICYmCisKKyAgICAgZWNobyBUaGlyZCA+PiBBICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggQSAmJgorICAgICBnaXQtY29tbWl0IC1tICJNb2RpZnkgQS4iCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwaWNrIHRvcCBwYXRjaCBmcm9tIHRvcGljIGJyYW5jaCBpbnRvIG1hc3RlcicgXAorICAgICdnaXQgY2hlcnJ5LXBpY2sgbXktdG9waWMtYnJhbmNoXjAgJiYKKyAgICAgZ2l0LWNoZWNrb3V0IC1mIG15LXRvcGljLWJyYW5jaCAmJgorICAgICBnaXQgYnJhbmNoIG1hc3Rlci1tZXJnZSBtYXN0ZXIgJiYKKyAgICAgZ2l0IGJyYW5jaCBteS10b3BpYy1icmFuY2gtbWVyZ2UgbXktdG9waWMtYnJhbmNoCisnCisKK3Rlc3RfZGVidWcgXAorICAgICdnaXQgY2hlcnJ5IG1hc3RlciAmJgorICAgICBnaXQgZm9ybWF0LXBhdGNoIC1rIC0tc3Rkb3V0IC0tZnVsbC1pbmRleCBtYXN0ZXIgPi9kZXYvbnVsbCAmJgorICAgICBnaXRrIC0tYWxsICYgc2xlZXAgMQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncmViYXNlIHRvcGljIGJyYW5jaCBhZ2FpbnN0IG5ldyBtYXN0ZXIgYW5kIGNoZWNrIGdpdC1hbSBkaWQgbm90IGdldCBoYWx0ZWQnIFwKKyAgICAnZ2l0LXJlYmFzZSBtYXN0ZXIgJiYgdGVzdCAhIC1kIC5kb3Rlc3QnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdyZWJhc2UgLS1tZXJnZSB0b3BpYyBicmFuY2ggdGhhdCB3YXMgcGFydGlhbGx5IG1lcmdlZCB1cHN0cmVhbScgXAorCSdnaXQtY2hlY2tvdXQgLWYgbXktdG9waWMtYnJhbmNoLW1lcmdlICYmCisJIGdpdC1yZWJhc2UgLS1tZXJnZSBtYXN0ZXItbWVyZ2UgJiYKKwkgdGVzdCAhIC1kIC5naXQvLmRvdGVzdC1tZXJnZScKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzNDAyLXJlYmFzZS1tZXJnZS5zaCBiL3QvdDM0MDItcmViYXNlLW1lcmdlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdiN2QwNzIKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzNDAyLXJlYmFzZS1tZXJnZS5zaApAQCAtMCwwICsxLDExMSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgcmViYXNlIC0tbWVyZ2UgdGVzdCcKKworLiAuL3Rlc3QtbGliLnNoCisKK1Q9IkEgcXVpY2sgYnJvd24gZm94CitqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4iCitmb3IgaSBpbiAxIDIgMyA0IDUgNiA3IDggOSAxMAorZG8KKwllY2hvICIkaSAkVCIKK2RvbmUgPm9yaWdpbmFsCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCWdpdCBhZGQgb3JpZ2luYWwgJiYKKwlnaXQgY29tbWl0IC1tImluaXRpYWwiICYmCisJZ2l0IGJyYW5jaCBzaWRlICYmCisJZWNobyAiMTEgJFQiID4+b3JpZ2luYWwgJiYKKwlnaXQgY29tbWl0IC1hIC1tIm1hc3RlciB1cGRhdGVzIGEgYml0LiIgJiYKKworCWVjaG8gIjEyICRUIiA+Pm9yaWdpbmFsICYmCisJZ2l0IGNvbW1pdCAtYSAtbSJtYXN0ZXIgdXBkYXRlcyBhIGJpdCBtb3JlLiIgJiYKKworCWdpdCBjaGVja291dCBzaWRlICYmCisJKGVjaG8gIjAgJFQiIDsgY2F0IG9yaWdpbmFsKSA+cmVuYW1lZCAmJgorCWdpdCBhZGQgcmVuYW1lZCAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1mb3JjZS1yZW1vdmUgb3JpZ2luYWwgJiYKKwlnaXQgY29tbWl0IC1hIC1tInNpZGUgcmVuYW1lcyBhbmQgZWRpdHMuIiAmJgorCisJdHIgIlthLXpdIiAiW0EtWl0iIDxvcmlnaW5hbCA+bmV3ZmlsZSAmJgorCWdpdCBhZGQgbmV3ZmlsZSAmJgorCWdpdCBjb21taXQgLWEgLW0ic2lkZSBlZGl0cyBmdXJ0aGVyLiIgJiYKKworCXRyICJbYS1tXSIgIltBLU1dIiA8b3JpZ2luYWwgPm5ld2ZpbGUgJiYKKwlybSAtZiBvcmlnaW5hbCAmJgorCWdpdCBjb21taXQgLWEgLW0ic2lkZSBlZGl0cyBvbmNlIGFnYWluLiIgJiYKKworCWdpdCBicmFuY2ggdGVzdC1yZWJhc2Ugc2lkZSAmJgorCWdpdCBicmFuY2ggdGVzdC1yZWJhc2UtcGljayBzaWRlICYmCisJZ2l0IGJyYW5jaCB0ZXN0LXJlZmVyZW5jZS1waWNrIHNpZGUgJiYKKwlnaXQgY2hlY2tvdXQgLWIgdGVzdC1tZXJnZSBzaWRlCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlZmVyZW5jZSBtZXJnZScgJworCWdpdCBtZXJnZSAtcyByZWN1cnNpdmUgInJlZmVyZW5jZSBtZXJnZSIgSEVBRCBtYXN0ZXIKKycKKworUFJFX1JFQkFTRT0kKGdpdCByZXYtcGFyc2UgdGVzdC1yZWJhc2UpCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHJlYmFzZSAnCisJZ2l0IGNoZWNrb3V0IHRlc3QtcmViYXNlICYmCisJR0lUX1RSQUNFPTEgZ2l0IHJlYmFzZSAtLW1lcmdlIG1hc3RlcgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0ZXN0LXJlYmFzZUB7MX0gaXMgcHJlIHJlYmFzZScgJworCXRlc3QgJFBSRV9SRUJBU0UgPSAkKGdpdCByZXYtcGFyc2UgdGVzdC1yZWJhc2VAezF9KQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZSBhbmQgcmViYXNlIHNob3VsZCBtYXRjaCcgJworCWdpdCBkaWZmLXRyZWUgLXIgdGVzdC1yZWJhc2UgdGVzdC1tZXJnZSA+ZGlmZmVyZW5jZSAmJgorCWlmIHRlc3QgLXMgZGlmZmVyZW5jZQorCXRoZW4KKwkJY2F0IGRpZmZlcmVuY2UKKwkJKGV4aXQgMSkKKwllbHNlCisJCWVjaG8gaGFwcHkKKwlmaQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZWJhc2UgdGhlIG90aGVyIHdheScgJworCWdpdCByZXNldCAtLWhhcmQgbWFzdGVyICYmCisJZ2l0IHJlYmFzZSAtLW1lcmdlIHNpZGUKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UgYW5kIHJlYmFzZSBzaG91bGQgbWF0Y2gnICcKKwlnaXQgZGlmZi10cmVlIC1yIHRlc3QtcmViYXNlIHRlc3QtbWVyZ2UgPmRpZmZlcmVuY2UgJiYKKwlpZiB0ZXN0IC1zIGRpZmZlcmVuY2UKKwl0aGVuCisJCWNhdCBkaWZmZXJlbmNlCisJCShleGl0IDEpCisJZWxzZQorCQllY2hvIGhhcHB5CisJZmkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncGlja2luZyByZWJhc2UnICcKKwlnaXQgcmVzZXQgLS1oYXJkIHNpZGUgJiYKKwlnaXQgcmViYXNlIC0tbWVyZ2UgLS1vbnRvIG1hc3RlciBzaWRlXl4gJiYKKwltYj0kKGdpdCBtZXJnZS1iYXNlIG1hc3RlciBIRUFEKSAmJgorCWlmIHRlc3QgIiRtYiIgPSAiJChnaXQgcmV2LXBhcnNlIG1hc3RlcikiCisJdGhlbgorCQllY2hvIGhhcHB5CisJZWxzZQorCQlnaXQgc2hvdy1icmFuY2gKKwkJKGV4aXQgMSkKKwlmaSAmJgorCWY9JChnaXQgZGlmZi10cmVlIC0tbmFtZS1vbmx5IEhFQUReIEhFQUQpICYmCisJZz0kKGdpdCBkaWZmLXRyZWUgLS1uYW1lLW9ubHkgSEVBRF5eIEhFQUReKSAmJgorCWNhc2UgIiRmLCRnIiBpbgorCW5ld2ZpbGUsbmV3ZmlsZSkKKwkJZWNobyBoYXBweSA7OworCSopCisJCWVjaG8gIiRmIgorCQllY2hvICIkZyIKKwkJKGV4aXQgMSkKKwllc2FjCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzQwMy1yZWJhc2Utc2tpcC5zaCBiL3QvdDM0MDMtcmViYXNlLXNraXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGEyNjA5OQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM0MDMtcmViYXNlLXNraXAuc2gKQEAgLTAsMCArMSw3MSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBFcmljIFdvbmcKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IHJlYmFzZSAtLW1lcmdlIC0tc2tpcCB0ZXN0cycKKworLiAuL3Rlc3QtbGliLnNoCisKKyMgd2UgYXNzdW1lIHRoZSBkZWZhdWx0IGdpdC1hbSAtMyAtLXNraXAgc3RyYXRlZ3kgaXMgdGVzdGVkIGluZGVwZW5kZW50bHkKKyMgYW5kIGFsd2F5cyB3b3JrcyA6KQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKwllY2hvIGhlbGxvID4gaGVsbG8gJiYKKwlnaXQgYWRkIGhlbGxvICYmCisJZ2l0IGNvbW1pdCAtbSAiaGVsbG8iICYmCisJZ2l0IGJyYW5jaCBza2lwLXJlZmVyZW5jZSAmJgorCisJZWNobyB3b3JsZCA+PiBoZWxsbyAmJgorCWdpdCBjb21taXQgLWEgLW0gImhlbGxvIHdvcmxkIiAmJgorCWVjaG8gZ29vZGJ5ZSA+PiBoZWxsbyAmJgorCWdpdCBjb21taXQgLWEgLW0gImdvb2RieWUiICYmCisKKwlnaXQgY2hlY2tvdXQgLWYgc2tpcC1yZWZlcmVuY2UgJiYKKwllY2hvIG1vbyA+IGhlbGxvICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAid2Ugc2hvdWxkIHNraXAgdGhpcyIgJiYKKwllY2hvIG1vbyA+IGNvdyAmJgorCWdpdCBhZGQgY293ICYmCisJZ2l0IGNvbW1pdCAtbSAidGhpcyBzaG91bGQgbm90IGJlIHNraXBwZWQiICYmCisJZ2l0IGJyYW5jaCBwcmUtcmViYXNlIHNraXAtcmVmZXJlbmNlICYmCisJZ2l0IGJyYW5jaCBza2lwLW1lcmdlIHNraXAtcmVmZXJlbmNlCisJJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZWJhc2Ugd2l0aCBnaXQgYW0gLTMgKGRlZmF1bHQpJyAnCisJISBnaXQgcmViYXNlIG1hc3RlcgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZWJhc2UgLS1za2lwIHdpdGggYW0gLTMnICcKKwlnaXQgcmViYXNlIC0tc2tpcAorCScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmViYXNlIG1vdmVzIGJhY2sgdG8gc2tpcC1yZWZlcmVuY2UnICcKKwl0ZXN0IHJlZnMvaGVhZHMvc2tpcC1yZWZlcmVuY2UgPSAkKGdpdCBzeW1ib2xpYy1yZWYgSEVBRCkgJiYKKwlnaXQgYnJhbmNoIHBvc3QtcmViYXNlICYmCisJZ2l0IHJlc2V0IC0taGFyZCBwcmUtcmViYXNlICYmCisJISBnaXQgcmViYXNlIG1hc3RlciAmJgorCWVjaG8gImhlbGxvIiA+IGhlbGxvICYmCisJZ2l0IGFkZCBoZWxsbyAmJgorCWdpdCByZWJhc2UgLS1jb250aW51ZSAmJgorCXRlc3QgcmVmcy9oZWFkcy9za2lwLXJlZmVyZW5jZSA9ICQoZ2l0IHN5bWJvbGljLXJlZiBIRUFEKSAmJgorCWdpdCByZXNldCAtLWhhcmQgcG9zdC1yZWJhc2UKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2tvdXQgc2tpcC1tZXJnZScgJ2dpdCBjaGVja291dCAtZiBza2lwLW1lcmdlJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZWJhc2Ugd2l0aCAtLW1lcmdlJyAnISBnaXQgcmViYXNlIC0tbWVyZ2UgbWFzdGVyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZWJhc2UgLS1za2lwIHdpdGggLS1tZXJnZScgJworCWdpdCByZWJhc2UgLS1za2lwCisJJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZSBhbmQgcmVmZXJlbmNlIHRyZWVzIGVxdWFsJyBcCisJJ3Rlc3QgLXogImBnaXQgZGlmZi10cmVlIHNraXAtbWVyZ2Ugc2tpcC1yZWZlcmVuY2VgIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbW92ZWQgYmFjayB0byBicmFuY2ggY29ycmVjdGx5JyAnCisJdGVzdCByZWZzL2hlYWRzL3NraXAtbWVyZ2UgPSAkKGdpdCBzeW1ib2xpYy1yZWYgSEVBRCkKKycKKwordGVzdF9kZWJ1ZyAnZ2l0ayAtLWFsbCAmIHNsZWVwIDEnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzQwNC1yZWJhc2UtaW50ZXJhY3RpdmUuc2ggYi90L3QzNDA0LXJlYmFzZS1pbnRlcmFjdGl2ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45Y2Y4NzNmCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzQwNC1yZWJhc2UtaW50ZXJhY3RpdmUuc2gKQEAgLTAsMCArMSwzNjQgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDcgSm9oYW5uZXMgRS4gU2NoaW5kZWxpbgorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgcmViYXNlIGludGVyYWN0aXZlCisKK1RoaXMgdGVzdCBydW5zIGdpdCByZWJhc2UgImludGVyYWN0aXZlbHkiLCBieSBmYWtpbmcgYW4gZWRpdCwgYW5kIHZlcmlmaWVzCit0aGF0IHRoZSByZXN1bHQgc3RpbGwgbWFrZXMgc2Vuc2UuCisnCisuIC4vdGVzdC1saWIuc2gKKworIyBzZXQgdXAgdHdvIGJyYW5jaGVzIGxpa2UgdGhpczoKKyMKKyMgQSAtIEIgLSBDIC0gRCAtIEUKKyMgICBcCisjICAgICBGIC0gRyAtIEgKKyMgICAgICAgXAorIyAgICAgICAgIEkKKyMKKyMgd2hlcmUgQiwgRCBhbmQgRyB0b3VjaCB0aGUgc2FtZSBmaWxlLgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCcgJworCTogPiBmaWxlMSAmJgorCWdpdCBhZGQgZmlsZTEgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIEEgJiYKKwlnaXQgdGFnIEEgJiYKKwllY2hvIDEgPiBmaWxlMSAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gQiBmaWxlMSAmJgorCTogPiBmaWxlMiAmJgorCWdpdCBhZGQgZmlsZTIgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIEMgJiYKKwllY2hvIDIgPiBmaWxlMSAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gRCBmaWxlMSAmJgorCTogPiBmaWxlMyAmJgorCWdpdCBhZGQgZmlsZTMgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIEUgJiYKKwlnaXQgY2hlY2tvdXQgLWIgYnJhbmNoMSBBICYmCisJOiA+IGZpbGU0ICYmCisJZ2l0IGFkZCBmaWxlNCAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gRiAmJgorCWdpdCB0YWcgRiAmJgorCWVjaG8gMyA+IGZpbGUxICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSBHIGZpbGUxICYmCisJOiA+IGZpbGU1ICYmCisJZ2l0IGFkZCBmaWxlNSAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gSCAmJgorCWdpdCBjaGVja291dCAtYiBicmFuY2gyIEYgJiYKKwk6ID4gZmlsZTYgJiYKKwlnaXQgYWRkIGZpbGU2ICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSBJICYmCisJZ2l0IHRhZyBJCisnCisKK2VjaG8gIiMhJFNIRUxMX1BBVEgiID5mYWtlLWVkaXRvci5zaAorY2F0ID4+IGZha2UtZWRpdG9yLnNoIDw8XEVPRgorY2FzZSAiJDEiIGluCisqL0NPTU1JVF9FRElUTVNHKQorCXRlc3QgLXogIiRGQUtFX0NPTU1JVF9NRVNTQUdFIiB8fCBlY2hvICIkRkFLRV9DT01NSVRfTUVTU0FHRSIgPiAiJDEiCisJdGVzdCAteiAiJEZBS0VfQ09NTUlUX0FNRU5EIiB8fCBlY2hvICIkRkFLRV9DT01NSVRfQU1FTkQiID4+ICIkMSIKKwlleGl0CisJOzsKK2VzYWMKK3Rlc3QgLXogIiRFWFBFQ1RfQ09VTlQiIHx8CisJdGVzdCAiJEVYUEVDVF9DT1VOVCIgPSAkKHNlZCAtZSAnL14jL2QnIC1lICcvXiQvZCcgPCAiJDEiIHwgd2MgLWwpIHx8CisJZXhpdAordGVzdCAteiAiJEZBS0VfTElORVMiICYmIGV4aXQKK2dyZXAgLXYgJ14jJyA8ICIkMSIgPiAiJDEiLnRtcAorcm0gLWYgIiQxIgorY2F0ICIkMSIudG1wCithY3Rpb249cGljaworZm9yIGxpbmUgaW4gJEZBS0VfTElORVM7IGRvCisJY2FzZSAkbGluZSBpbgorCXNxdWFzaHxlZGl0KQorCQlhY3Rpb249IiRsaW5lIjs7CisJKikKKwkJZWNobyBzZWQgLW4gIiR7bGluZX1zL15waWNrLyRhY3Rpb24vcCIKKwkJc2VkIC1uICIke2xpbmV9cCIgPCAiJDEiLnRtcAorCQlzZWQgLW4gIiR7bGluZX1zL15waWNrLyRhY3Rpb24vcCIgPCAiJDEiLnRtcCA+PiAiJDEiCisJCWFjdGlvbj1waWNrOzsKKwllc2FjCitkb25lCitFT0YKKworY2htb2QgYSt4IGZha2UtZWRpdG9yLnNoCitWSVNVQUw9IiQocHdkKS9mYWtlLWVkaXRvci5zaCIKK2V4cG9ydCBWSVNVQUwKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbm8gY2hhbmdlcyBhcmUgYSBub3AnICcKKwlnaXQgcmViYXNlIC1pIEYgJiYKKwl0ZXN0ICQoZ2l0IHJldi1wYXJzZSBJKSA9ICQoZ2l0IHJldi1wYXJzZSBIRUFEKQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0ZXN0IHRoZSBbYnJhbmNoXSBvcHRpb24nICcKKwlnaXQgY2hlY2tvdXQgLWIgZGVhZC1lbmQgJiYKKwlnaXQgcm0gZmlsZTYgJiYKKwlnaXQgY29tbWl0IC1tICJzdG9wIGhlcmUiICYmCisJZ2l0IHJlYmFzZSAtaSBGIGJyYW5jaDIgJiYKKwl0ZXN0ICQoZ2l0IHJldi1wYXJzZSBJKSA9ICQoZ2l0IHJldi1wYXJzZSBIRUFEKQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZWJhc2Ugb24gdG9wIG9mIGEgbm9uLWNvbmZsaWN0aW5nIGNvbW1pdCcgJworCWdpdCBjaGVja291dCBicmFuY2gxICYmCisJZ2l0IHRhZyBvcmlnaW5hbC1icmFuY2gxICYmCisJZ2l0IHJlYmFzZSAtaSBicmFuY2gyICYmCisJdGVzdCBmaWxlNiA9ICQoZ2l0IGRpZmYgLS1uYW1lLW9ubHkgb3JpZ2luYWwtYnJhbmNoMSkgJiYKKwl0ZXN0ICQoZ2l0IHJldi1wYXJzZSBJKSA9ICQoZ2l0IHJldi1wYXJzZSBIRUFEfjIpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlZmxvZyBmb3IgdGhlIGJyYW5jaCBzaG93cyBzdGF0ZSBiZWZvcmUgcmViYXNlJyAnCisJdGVzdCAkKGdpdCByZXYtcGFyc2UgYnJhbmNoMUB7MX0pID0gJChnaXQgcmV2LXBhcnNlIG9yaWdpbmFsLWJyYW5jaDEpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2V4Y2hhbmdlIHR3byBjb21taXRzJyAnCisJRkFLRV9MSU5FUz0iMiAxIiBnaXQgcmViYXNlIC1pIEhFQUR+MiAmJgorCXRlc3QgSCA9ICQoZ2l0IGNhdC1maWxlIGNvbW1pdCBIRUFEXiB8IHNlZCAtbmUgXCRwKSAmJgorCXRlc3QgRyA9ICQoZ2l0IGNhdC1maWxlIGNvbW1pdCBIRUFEIHwgc2VkIC1uZSBcJHApCisnCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCitpbmRleCBlNjlkZTI5Li4wMDc1MGVkIDEwMDY0NAorLS0tIGEvZmlsZTEKKysrKyBiL2ZpbGUxCitAQCAtMCwwICsxIEBACisrMworRU9GCisKK2NhdCA+IGV4cGVjdDIgPDwgRU9GCis8PDw8PDw8IEhFQUQ6ZmlsZTEKKzIKKz09PT09PT0KKzMKKz4+Pj4+Pj4gYjdjYTk3Ni4uLiBHOmZpbGUxCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc3RvcCBvbiBjb25mbGljdGluZyBwaWNrJyAnCisJZ2l0IHRhZyBuZXctYnJhbmNoMSAmJgorCSEgZ2l0IHJlYmFzZSAtaSBtYXN0ZXIgJiYKKwl0ZXN0X2NtcCBleHBlY3QgLmdpdC8uZG90ZXN0LW1lcmdlL3BhdGNoICYmCisJdGVzdF9jbXAgZXhwZWN0MiBmaWxlMSAmJgorCXRlc3QgNCA9ICQoZ3JlcCAtdiAiXiMiIDwgLmdpdC8uZG90ZXN0LW1lcmdlL2RvbmUgfCB3YyAtbCkgJiYKKwl0ZXN0IDAgPSAkKGdyZXAgLWMgIl5bXiNdIiA8IC5naXQvLmRvdGVzdC1tZXJnZS9naXQtcmViYXNlLXRvZG8pCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Fib3J0JyAnCisJZ2l0IHJlYmFzZSAtLWFib3J0ICYmCisJdGVzdCAkKGdpdCByZXYtcGFyc2UgbmV3LWJyYW5jaDEpID0gJChnaXQgcmV2LXBhcnNlIEhFQUQpICYmCisJISB0ZXN0IC1kIC5naXQvLmRvdGVzdC1tZXJnZQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZXRhaW4gYXV0aG9yc2hpcCcgJworCWVjaG8gQSA+IGZpbGU3ICYmCisJZ2l0IGFkZCBmaWxlNyAmJgorCXRlc3RfdGljayAmJgorCUdJVF9BVVRIT1JfTkFNRT0iVHdlcnAgU25vZyIgZ2l0IGNvbW1pdCAtbSAiZGlmZmVyZW50IGF1dGhvciIgJiYKKwlnaXQgdGFnIHR3ZXJwICYmCisJZ2l0IHJlYmFzZSAtaSAtLW9udG8gbWFzdGVyIEhFQUReICYmCisJZ2l0IHNob3cgSEVBRCB8IGdyZXAgIl5BdXRob3I6IFR3ZXJwIFNub2ciCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NxdWFzaCcgJworCWdpdCByZXNldCAtLWhhcmQgdHdlcnAgJiYKKwllY2hvIEIgPiBmaWxlNyAmJgorCXRlc3RfdGljayAmJgorCUdJVF9BVVRIT1JfTkFNRT0iTml0Zm9sIiBnaXQgY29tbWl0IC1tICJuaXRmb2wiIGZpbGU3ICYmCisJZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIiAmJgorCUZBS0VfTElORVM9IjEgc3F1YXNoIDIiIGdpdCByZWJhc2UgLWkgLS1vbnRvIG1hc3RlciBIRUFEfjIgJiYKKwl0ZXN0IEIgPSAkKGNhdCBmaWxlNykgJiYKKwl0ZXN0ICQoZ2l0IHJldi1wYXJzZSBIRUFEXikgPSAkKGdpdCByZXYtcGFyc2UgbWFzdGVyKQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZXRhaW4gYXV0aG9yc2hpcCB3aGVuIHNxdWFzaGluZycgJworCWdpdCBzaG93IEhFQUQgfCBncmVwICJeQXV0aG9yOiBUd2VycCBTbm9nIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctcCBoYW5kbGVzICJubyBjaGFuZ2VzIiBncmFjZWZ1bGx5JyAnCisJSEVBRD0kKGdpdCByZXYtcGFyc2UgSEVBRCkgJiYKKwlnaXQgcmViYXNlIC1pIC1wIEhFQUReICYmCisJdGVzdCAkSEVBRCA9ICQoZ2l0IHJldi1wYXJzZSBIRUFEKQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwcmVzZXJ2ZSBtZXJnZXMgd2l0aCAtcCcgJworCWdpdCBjaGVja291dCAtYiB0by1iZS1wcmVzZXJ2ZWQgbWFzdGVyXiAmJgorCTogPiB1bnJlbGF0ZWQtZmlsZSAmJgorCWdpdCBhZGQgdW5yZWxhdGVkLWZpbGUgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tICJ1bnJlbGF0ZWQiICYmCisJZ2l0IGNoZWNrb3V0IC1iIHRvLWJlLXJlYmFzZWQgbWFzdGVyICYmCisJZWNobyBCID4gZmlsZTEgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIEogZmlsZTEgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgbWVyZ2UgdG8tYmUtcHJlc2VydmVkICYmCisJZWNobyBDID4gZmlsZTEgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIEsgZmlsZTEgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgcmViYXNlIC1pIC1wIC0tb250byBicmFuY2gxIG1hc3RlciAmJgorCXRlc3QgJChnaXQgcmV2LXBhcnNlIEhFQUReXjIpID0gJChnaXQgcmV2LXBhcnNlIHRvLWJlLXByZXNlcnZlZCkgJiYKKwl0ZXN0ICQoZ2l0IHJldi1wYXJzZSBIRUFEfjMpID0gJChnaXQgcmV2LXBhcnNlIGJyYW5jaDEpICYmCisJdGVzdCAkKGdpdCBzaG93IEhFQUQ6ZmlsZTEpID0gQyAmJgorCXRlc3QgJChnaXQgc2hvdyBIRUFEfjI6ZmlsZTEpID0gQgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctLWNvbnRpbnVlIHRyaWVzIHRvIGNvbW1pdCcgJworCXRlc3RfdGljayAmJgorCSEgZ2l0IHJlYmFzZSAtaSAtLW9udG8gbmV3LWJyYW5jaDEgSEVBRF4gJiYKKwllY2hvIHJlc29sdmVkID4gZmlsZTEgJiYKKwlnaXQgYWRkIGZpbGUxICYmCisJRkFLRV9DT01NSVRfTUVTU0FHRT0iY2hvdWV0dGUhIiBnaXQgcmViYXNlIC0tY29udGludWUgJiYKKwl0ZXN0ICQoZ2l0IHJldi1wYXJzZSBIRUFEXikgPSAkKGdpdCByZXYtcGFyc2UgbmV3LWJyYW5jaDEpICYmCisJZ2l0IHNob3cgSEVBRCB8IGdyZXAgY2hvdWV0dGUKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndmVyYm9zZSBmbGFnIGlzIGhlZWRlZCwgZXZlbiBhZnRlciAtLWNvbnRpbnVlJyAnCisJZ2l0IHJlc2V0IC0taGFyZCBIRUFEQHsxfSAmJgorCXRlc3RfdGljayAmJgorCSEgZ2l0IHJlYmFzZSAtdiAtaSAtLW9udG8gbmV3LWJyYW5jaDEgSEVBRF4gJiYKKwllY2hvIHJlc29sdmVkID4gZmlsZTEgJiYKKwlnaXQgYWRkIGZpbGUxICYmCisJZ2l0IHJlYmFzZSAtLWNvbnRpbnVlID4gb3V0cHV0ICYmCisJZ3JlcCAiXiBmaWxlMSB8ICAgIDIgKy0kIiBvdXRwdXQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbXVsdGktc3F1YXNoIG9ubHkgZmlyZXMgdXAgZWRpdG9yIG9uY2UnICcKKwliYXNlPSQoZ2l0IHJldi1wYXJzZSBIRUFEfjQpICYmCisJRkFLRV9DT01NSVRfQU1FTkQ9Ik9OQ0UiIEZBS0VfTElORVM9IjEgc3F1YXNoIDIgc3F1YXNoIDMgc3F1YXNoIDQiIFwKKwkJZ2l0IHJlYmFzZSAtaSAkYmFzZSAmJgorCXRlc3QgJGJhc2UgPSAkKGdpdCByZXYtcGFyc2UgSEVBRF4pICYmCisJdGVzdCAxID0gJChnaXQgc2hvdyB8IGdyZXAgT05DRSB8IHdjIC1sKQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzcXVhc2ggd29ya3MgYXMgZXhwZWN0ZWQnICcKKwlmb3IgbiBpbiBvbmUgdHdvIHRocmVlIGZvdXIKKwlkbworCQllY2hvICRuID4+IGZpbGUkbiAmJgorCQlnaXQgYWRkIGZpbGUkbiAmJgorCQlnaXQgY29tbWl0IC1tICRuCisJZG9uZSAmJgorCW9uZT0kKGdpdCByZXYtcGFyc2UgSEVBRH4zKSAmJgorCUZBS0VfTElORVM9IjEgc3F1YXNoIDMgMiIgZ2l0IHJlYmFzZSAtaSBIRUFEfjMgJiYKKwl0ZXN0ICRvbmUgPSAkKGdpdCByZXYtcGFyc2UgSEVBRH4yKQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbnRlcnJ1cHRlZCBzcXVhc2ggd29ya3MgYXMgZXhwZWN0ZWQnICcKKwlmb3IgbiBpbiBvbmUgdHdvIHRocmVlIGZvdXIKKwlkbworCQllY2hvICRuID4+IGNvbmZsaWN0ICYmCisJCWdpdCBhZGQgY29uZmxpY3QgJiYKKwkJZ2l0IGNvbW1pdCAtbSAkbgorCWRvbmUgJiYKKwlvbmU9JChnaXQgcmV2LXBhcnNlIEhFQUR+MykgJiYKKwkhIEZBS0VfTElORVM9IjEgc3F1YXNoIDMgMiIgZ2l0IHJlYmFzZSAtaSBIRUFEfjMgJiYKKwkoZWNobyBvbmU7IGVjaG8gdHdvOyBlY2hvIGZvdXIpID4gY29uZmxpY3QgJiYKKwlnaXQgYWRkIGNvbmZsaWN0ICYmCisJISBnaXQgcmViYXNlIC0tY29udGludWUgJiYKKwllY2hvIHJlc29sdmVkID4gY29uZmxpY3QgJiYKKwlnaXQgYWRkIGNvbmZsaWN0ICYmCisJZ2l0IHJlYmFzZSAtLWNvbnRpbnVlICYmCisJdGVzdCAkb25lID0gJChnaXQgcmV2LXBhcnNlIEhFQUR+MikKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW50ZXJydXB0ZWQgc3F1YXNoIHdvcmtzIGFzIGV4cGVjdGVkIChjYXNlIDIpJyAnCisJZm9yIG4gaW4gb25lIHR3byB0aHJlZSBmb3VyCisJZG8KKwkJZWNobyAkbiA+PiBjb25mbGljdCAmJgorCQlnaXQgYWRkIGNvbmZsaWN0ICYmCisJCWdpdCBjb21taXQgLW0gJG4KKwlkb25lICYmCisJb25lPSQoZ2l0IHJldi1wYXJzZSBIRUFEfjMpICYmCisJISBGQUtFX0xJTkVTPSIzIHNxdWFzaCAxIDIiIGdpdCByZWJhc2UgLWkgSEVBRH4zICYmCisJKGVjaG8gb25lOyBlY2hvIGZvdXIpID4gY29uZmxpY3QgJiYKKwlnaXQgYWRkIGNvbmZsaWN0ICYmCisJISBnaXQgcmViYXNlIC0tY29udGludWUgJiYKKwkoZWNobyBvbmU7IGVjaG8gdHdvOyBlY2hvIGZvdXIpID4gY29uZmxpY3QgJiYKKwlnaXQgYWRkIGNvbmZsaWN0ICYmCisJISBnaXQgcmViYXNlIC0tY29udGludWUgJiYKKwllY2hvIHJlc29sdmVkID4gY29uZmxpY3QgJiYKKwlnaXQgYWRkIGNvbmZsaWN0ICYmCisJZ2l0IHJlYmFzZSAtLWNvbnRpbnVlICYmCisJdGVzdCAkb25lID0gJChnaXQgcmV2LXBhcnNlIEhFQUR+MikKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaWdub3JlIHBhdGNoIGlmIGluIHVwc3RyZWFtJyAnCisJSEVBRD0kKGdpdCByZXYtcGFyc2UgSEVBRCkgJiYKKwlnaXQgY2hlY2tvdXQgLWIgaGFzLWNoZXJyeS1waWNrZWQgSEVBRF4gJiYKKwllY2hvIHVucmVsYXRlZCA+IGZpbGU3ICYmCisJZ2l0IGFkZCBmaWxlNyAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gInVucmVsYXRlZCBjaGFuZ2UiICYmCisJZ2l0IGNoZXJyeS1waWNrICRIRUFEICYmCisJRVhQRUNUX0NPVU5UPTEgZ2l0IHJlYmFzZSAtaSAkSEVBRCAmJgorCXRlc3QgJEhFQUQgPSAkKGdpdCByZXYtcGFyc2UgSEVBRF4pCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy0tY29udGludWUgdHJpZXMgdG8gY29tbWl0LCBldmVuIGZvciAiZWRpdCInICcKKwlwYXJlbnQ9JChnaXQgcmV2LXBhcnNlIEhFQUReKSAmJgorCXRlc3RfdGljayAmJgorCUZBS0VfTElORVM9ImVkaXQgMSIgZ2l0IHJlYmFzZSAtaSBIRUFEXiAmJgorCWVjaG8gZWRpdGVkID4gZmlsZTcgJiYKKwlnaXQgYWRkIGZpbGU3ICYmCisJRkFLRV9DT01NSVRfTUVTU0FHRT0iY2hvdWV0dGUhIiBnaXQgcmViYXNlIC0tY29udGludWUgJiYKKwl0ZXN0IGVkaXRlZCA9ICQoZ2l0IHNob3cgSEVBRDpmaWxlNykgJiYKKwlnaXQgc2hvdyBIRUFEIHwgZ3JlcCBjaG91ZXR0ZSAmJgorCXRlc3QgJHBhcmVudCA9ICQoZ2l0IHJldi1wYXJzZSBIRUFEXikKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmViYXNlIGEgZGV0YWNoZWQgSEVBRCcgJworCWdyYW5kcGFyZW50PSQoZ2l0IHJldi1wYXJzZSBIRUFEfjIpICYmCisJZ2l0IGNoZWNrb3V0ICQoZ2l0IHJldi1wYXJzZSBIRUFEKSAmJgorCXRlc3RfdGljayAmJgorCUZBS0VfTElORVM9IjIgMSIgZ2l0IHJlYmFzZSAtaSBIRUFEfjIgJiYKKwl0ZXN0ICRncmFuZHBhcmVudCA9ICQoZ2l0IHJldi1wYXJzZSBIRUFEfjIpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlYmFzZSBhIGNvbW1pdCB2aW9sYXRpbmcgcHJlLWNvbW1pdCcgJworCisJbWtkaXIgLXAgLmdpdC9ob29rcyAmJgorCVBSRV9DT01NSVQ9LmdpdC9ob29rcy9wcmUtY29tbWl0ICYmCisJZWNobyAiIyEvYmluL3NoIiA+ICRQUkVfQ09NTUlUICYmCisJZWNobyAidGVzdCAteiBcIlwkKGdpdCBkaWZmIC0tY2FjaGVkIC0tY2hlY2spXCIiID4+ICRQUkVfQ09NTUlUICYmCisJY2htb2QgYSt4ICRQUkVfQ09NTUlUICYmCisJZWNobyAibW9uZGUhICIgPj4gZmlsZTEgJiYKKwl0ZXN0X3RpY2sgJiYKKwkhIGdpdCBjb21taXQgLW0gZG9lc250LXZlcmlmeSBmaWxlMSAmJgorCWdpdCBjb21taXQgLW0gZG9lc250LXZlcmlmeSAtLW5vLXZlcmlmeSBmaWxlMSAmJgorCXRlc3RfdGljayAmJgorCUZBS0VfTElORVM9MiBnaXQgcmViYXNlIC1pIEhFQUR+MgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlYmFzZSB3aXRoIGEgZmlsZSBuYW1lZCBIRUFEIGluIHdvcmt0cmVlJyAnCisKKwlybSAtZnIgLmdpdC9ob29rcyAmJgorCWdpdCByZXNldCAtLWhhcmQgJiYKKwlnaXQgY2hlY2tvdXQgLWIgYnJhbmNoMyBBICYmCisKKwkoCisJCUdJVF9BVVRIT1JfTkFNRT0iU3F1YXNoZWQgQXdheSIgJiYKKwkJZXhwb3J0IEdJVF9BVVRIT1JfTkFNRSAmJgorCQk+SEVBRCAmJgorCQlnaXQgYWRkIEhFQUQgJiYKKwkJZ2l0IGNvbW1pdCAtbSAiQWRkIGhlYWQiICYmCisJCT5CT0RZICYmCisJCWdpdCBhZGQgQk9EWSAmJgorCQlnaXQgY29tbWl0IC1tICJBZGQgYm9keSIKKwkpICYmCisKKwlGQUtFX0xJTkVTPSIxIHNxdWFzaCAyIiBnaXQgcmViYXNlIC1pIHRvLWJlLXJlYmFzZWQgJiYKKwl0ZXN0ICIkKGdpdCBzaG93IC1zIC0tcHJldHR5PWZvcm1hdDolYW4pIiA9ICJTcXVhc2hlZCBBd2F5IgorCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzQwNS1yZWJhc2UtbWFsZm9ybWVkLnNoIGIvdC90MzQwNS1yZWJhc2UtbWFsZm9ybWVkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU1YWQ2N2MKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzNDA1LXJlYmFzZS1tYWxmb3JtZWQuc2gKQEAgLTAsMCArMSw0OCBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J3JlYmFzZSBzaG91bGQgbm90IGluc2lzdCBvbiBnaXQgbWVzc2FnZSBjb252ZW50aW9uJworCisuIC4vdGVzdC1saWIuc2gKKworY2F0ID5GIDw8XEVPRgorVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgY29tbWl0IGxvZyBtZXNzYWdlCit0aGF0IGRvZXMgbm90ICBjb25mb3JtIHRvIGdpdCBjb21taXQgY29udmVudGlvbi4KKworSXQgaGFzIHR3byBwYXJhZ3JhcGhzLCBidXQgaXRzIGZpcnN0IHBhcmFncmFwaCBpcyBub3QgZnJpZW5kbHkKK3RvIG9uZWxpbmUgc3VtbWFyeSBmb3JtYXQuCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwk+ZmlsZTEgJiYKKwk+ZmlsZTIgJiYKKwlnaXQgYWRkIGZpbGUxIGZpbGUyICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSAiSW5pdGlhbCBjb21taXQiICYmCisKKwlnaXQgY2hlY2tvdXQgLWIgc2lkZSAmJgorCWNhdCBGID5maWxlMiAmJgorCWdpdCBhZGQgZmlsZTIgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1GIEYgJiYKKworCWdpdCBjYXQtZmlsZSBjb21taXQgSEVBRCB8IHNlZCAtZSAiMSwvXlwkL2QiID5GMCAmJgorCisJZ2l0IGNoZWNrb3V0IG1hc3RlciAmJgorCisJZWNobyBPbmUgPmZpbGUxICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGFkZCBmaWxlMSAmJgorCWdpdCBjb21taXQgLW0gIlNlY29uZCBjb21taXQiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgcmViYXNlICcKKworCWdpdCByZWJhc2UgbWFzdGVyIHNpZGUgJiYKKwlnaXQgY2F0LWZpbGUgY29tbWl0IEhFQUQgfCBzZWQgLWUgIjEsL15cJC9kIiA+RjEgJiYKKworCXRlc3RfY21wIEYwIEYxICYmCisJdGVzdF9jbXAgRiBGMAorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDM0MDYtcmViYXNlLW1lc3NhZ2Uuc2ggYi90L3QzNDA2LXJlYmFzZS1tZXNzYWdlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUzOTEwODAKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzNDA2LXJlYmFzZS1tZXNzYWdlLnNoCkBAIC0wLDAgKzEsNDQgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdtZXNzYWdlcyBmcm9tIHJlYmFzZSBvcGVyYXRpb24nCisKKy4gLi90ZXN0LWxpYi5zaAorCitxdWlja19vbmUgKCkgeworCWVjaG8gIiQxIiA+ImZpbGUkMSIgJiYKKwlnaXQgYWRkICJmaWxlJDEiICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSAiJDEiCit9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCXF1aWNrX29uZSBPICYmCisJZ2l0IGJyYW5jaCB0b3BpYyAmJgorCXF1aWNrX29uZSBYICYmCisJcXVpY2tfb25lIEEgJiYKKwlxdWlja19vbmUgQiAmJgorCXF1aWNrX29uZSBZICYmCisKKwlnaXQgY2hlY2tvdXQgdG9waWMgJiYKKwlxdWlja19vbmUgQSAmJgorCXF1aWNrX29uZSBCICYmCisJcXVpY2tfb25lIFoKKworJworCitjYXQgPmV4cGVjdCA8PFxFT0YKK0FscmVhZHkgYXBwbGllZDogMDAwMSBBCitBbHJlYWR5IGFwcGxpZWQ6IDAwMDIgQgorQ29tbWl0dGVkOiAwMDAzIFoKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZWJhc2UgLW0nICcKKworCWdpdCByZWJhc2UgLW0gbWFzdGVyID5yZXBvcnQgJiYKKwlzZWQgLW4gLWUgIi9eQWxyZWFkeSBhcHBsaWVkOiAvcCIgXAorCQktZSAiL15Db21taXR0ZWQ6IC9wIiByZXBvcnQgPmFjdHVhbCAmJgorCXRlc3RfY21wIGV4cGVjdCBhY3R1YWwKKworJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDM0MDctcmViYXNlLWFib3J0LnNoIGIvdC90MzQwNy1yZWJhc2UtYWJvcnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzc5NDRjMwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM0MDctcmViYXNlLWFib3J0LnNoCkBAIC0wLDAgKzEsNzEgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgcmViYXNlIC0tYWJvcnQgdGVzdHMnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKwllY2hvIGEgPiBhICYmCisJZ2l0IGFkZCBhICYmCisJZ2l0IGNvbW1pdCAtbSBhICYmCisJZ2l0IGJyYW5jaCB0by1yZWJhc2UgJiYKKworCWVjaG8gYiA+IGEgJiYKKwlnaXQgY29tbWl0IC1hIC1tIGIgJiYKKwllY2hvIGMgPiBhICYmCisJZ2l0IGNvbW1pdCAtYSAtbSBjICYmCisKKwlnaXQgY2hlY2tvdXQgdG8tcmViYXNlICYmCisJZWNobyBkID4gYSAmJgorCWdpdCBjb21taXQgLWEgLW0gIm1lcmdlIHNob3VsZCBmYWlsIG9uIHRoaXMiICYmCisJZWNobyBlID4gYSAmJgorCWdpdCBjb21taXQgLWEgLW0gIm1lcmdlIHNob3VsZCBmYWlsIG9uIHRoaXMsIHRvbyIgJiYKKwlnaXQgYnJhbmNoIHByZS1yZWJhc2UKKycKKwordGVzdHJlYmFzZSgpIHsKKwl0eXBlPSQxCisJZG90ZXN0PSQyCisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICJyZWJhc2UkdHlwZSAtLWFib3J0IiAnCisJCSMgQ2xlYW4gdXAgdGhlIHN0YXRlIGZyb20gdGhlIHByZXZpb3VzIG9uZQorCQlnaXQgcmVzZXQgLS1oYXJkIHByZS1yZWJhc2UKKwkJdGVzdF9tdXN0X2ZhaWwgZ2l0IHJlYmFzZSciJHR5cGUiJyBtYXN0ZXIgJiYKKwkJdGVzdCAtZCAnJGRvdGVzdCcgJiYKKwkJZ2l0IHJlYmFzZSAtLWFib3J0ICYmCisJCXRlc3QgJChnaXQgcmV2LXBhcnNlIHRvLXJlYmFzZSkgPSAkKGdpdCByZXYtcGFyc2UgcHJlLXJlYmFzZSkgJiYKKwkJdGVzdCAhIC1kICckZG90ZXN0JworCScKKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgInJlYmFzZSR0eXBlIC0tYWJvcnQgYWZ0ZXIgLS1za2lwIiAnCisJCSMgQ2xlYW4gdXAgdGhlIHN0YXRlIGZyb20gdGhlIHByZXZpb3VzIG9uZQorCQlnaXQgcmVzZXQgLS1oYXJkIHByZS1yZWJhc2UKKwkJdGVzdF9tdXN0X2ZhaWwgZ2l0IHJlYmFzZSciJHR5cGUiJyBtYXN0ZXIgJiYKKwkJdGVzdCAtZCAnJGRvdGVzdCcgJiYKKwkJdGVzdF9tdXN0X2ZhaWwgZ2l0IHJlYmFzZSAtLXNraXAgJiYKKwkJdGVzdCAkKGdpdCByZXYtcGFyc2UgSEVBRCkgPSAkKGdpdCByZXYtcGFyc2UgbWFzdGVyKSAmJgorCQlnaXQtcmViYXNlIC0tYWJvcnQgJiYKKwkJdGVzdCAkKGdpdCByZXYtcGFyc2UgdG8tcmViYXNlKSA9ICQoZ2l0IHJldi1wYXJzZSBwcmUtcmViYXNlKSAmJgorCQl0ZXN0ICEgLWQgJyRkb3Rlc3QnCisJJworCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAicmViYXNlJHR5cGUgLS1hYm9ydCBhZnRlciAtLWNvbnRpbnVlIiAnCisJCSMgQ2xlYW4gdXAgdGhlIHN0YXRlIGZyb20gdGhlIHByZXZpb3VzIG9uZQorCQlnaXQgcmVzZXQgLS1oYXJkIHByZS1yZWJhc2UKKwkJdGVzdF9tdXN0X2ZhaWwgZ2l0IHJlYmFzZSciJHR5cGUiJyBtYXN0ZXIgJiYKKwkJdGVzdCAtZCAnJGRvdGVzdCcgJiYKKwkJZWNobyBjID4gYSAmJgorCQllY2hvIGQgPj4gYSAmJgorCQlnaXQgYWRkIGEgJiYKKwkJdGVzdF9tdXN0X2ZhaWwgZ2l0IHJlYmFzZSAtLWNvbnRpbnVlICYmCisJCXRlc3QgJChnaXQgcmV2LXBhcnNlIEhFQUQpICE9ICQoZ2l0IHJldi1wYXJzZSBtYXN0ZXIpICYmCisJCWdpdCByZWJhc2UgLS1hYm9ydCAmJgorCQl0ZXN0ICQoZ2l0IHJldi1wYXJzZSB0by1yZWJhc2UpID0gJChnaXQgcmV2LXBhcnNlIHByZS1yZWJhc2UpICYmCisJCXRlc3QgISAtZCAnJGRvdGVzdCcKKwknCit9CisKK3Rlc3RyZWJhc2UgIiIgLmRvdGVzdAordGVzdHJlYmFzZSAiIC0tbWVyZ2UiIC5naXQvLmRvdGVzdC1tZXJnZQorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDM1MDAtY2hlcnJ5LnNoIGIvdC90MzUwMC1jaGVycnkuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDBhNDQwZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM1MDAtY2hlcnJ5LnNoCkBAIC0wLDAgKzEsNTQgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgWWFubiBEaXJzb24sIGJhc2VkIG9uIHQzNDAwIGJ5IEFtb3MgV2F0ZXJsYW5kCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBjaGVycnkgc2hvdWxkIGRldGVjdCBwYXRjaGVzIGludGVncmF0ZWQgdXBzdHJlYW0KKworVGhpcyB0ZXN0IGNoZXJyeS1waWNrcyBvbmUgbG9jYWwgY2hhbmdlIG9mIHR3byBpbnRvIG1hc3RlciBicmFuY2gsIGFuZAorY2hlY2tzIHRoYXQgZ2l0IGNoZXJyeSBvbmx5IHJldHVybnMgdGhlIHNlY29uZCBwYXRjaCBpbiB0aGUgbG9jYWwgYnJhbmNoCisnCisuIC4vdGVzdC1saWIuc2gKKworZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUw9Ym9ndXNfZW1haWxfYWRkcmVzcworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSByZXBvc2l0b3J5IHdpdGggdG9waWMgYnJhbmNoLCBhbmQgY2hlY2sgY2hlcnJ5IGZpbmRzIHRoZSAyIHBhdGNoZXMgZnJvbSB0aGVyZScgXAorICAgICdlY2hvIEZpcnN0ID4gQSAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIEEgJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSAiQWRkIEEuIiAmJgorCisgICAgIGdpdC1jaGVja291dCAtYiBteS10b3BpYy1icmFuY2ggJiYKKworICAgICBlY2hvIFNlY29uZCA+IEIgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBCICYmCisgICAgIGdpdC1jb21taXQgLW0gIkFkZCBCLiIgJiYKKworICAgICBzbGVlcCAyICYmCisgICAgIGVjaG8gQW5vdGhlclNlY29uZCA+IEMgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBDICYmCisgICAgIGdpdC1jb21taXQgLW0gIkFkZCBDLiIgJiYKKworICAgICBnaXQtY2hlY2tvdXQgLWYgbWFzdGVyICYmCisgICAgIHJtIC1mIEIgQyAmJgorCisgICAgIGVjaG8gVGhpcmQgPj4gQSAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IEEgJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSAiTW9kaWZ5IEEuIiAmJgorCisgICAgIGV4cHIgIiQoZWNobyAkKGdpdCBjaGVycnkgbWFzdGVyIG15LXRvcGljLWJyYW5jaCkgKSIgOiAiKyBbXiBdKiArIC4qIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hlY2sgdGhhdCBjaGVycnkgd2l0aCBsaW1pdCByZXR1cm5zIG9ubHkgdGhlIHRvcCBwYXRjaCdcCisgICAgJ2V4cHIgIiQoZWNobyAkKGdpdCBjaGVycnkgbWFzdGVyIG15LXRvcGljLWJyYW5jaCBteS10b3BpYy1icmFuY2heMSkgKSIgOiAiKyBbXiBdKiIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoZXJyeS1waWNrIG9uZSBvZiB0aGUgMiBwYXRjaGVzLCBhbmQgY2hlY2sgY2hlcnJ5IHJlY29nbml6ZWQgb25lIGFuZCBvbmx5IG9uZSBhcyBuZXcnIFwKKyAgICAnZ2l0IGNoZXJyeS1waWNrIG15LXRvcGljLWJyYW5jaF4wICYmCisgICAgIGVjaG8gJChnaXQgY2hlcnJ5IG1hc3RlciBteS10b3BpYy1icmFuY2gpICYmCisgICAgIGV4cHIgIiQoZWNobyAkKGdpdCBjaGVycnkgbWFzdGVyIG15LXRvcGljLWJyYW5jaCkgKSIgOiAiKyBbXiBdKiAtIC4qIgorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDM1MDEtcmV2ZXJ0LWNoZXJyeS1waWNrLnNoIGIvdC90MzUwMS1yZXZlcnQtY2hlcnJ5LXBpY2suc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmRhMjEyOAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM1MDEtcmV2ZXJ0LWNoZXJyeS1waWNrLnNoCkBAIC0wLDAgKzEsNzEgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSd0ZXN0IGNoZXJyeS1waWNrIGFuZCByZXZlcnQgd2l0aCByZW5hbWVzCisKKyAgLS0KKyAgICsgcmVuYW1lMjogcmVuYW1lcyBvb3BzIHRvIG9wb3MKKyAgKyAgcmVuYW1lMTogcmVuYW1lcyBvb3BzIHRvIHNwb28KKyAgKyAgYWRkZWQ6ICAgYWRkcyBleHRyYSBsaW5lIHRvIG9vcHMKKyAgKysgaW5pdGlhbDogaGFzIGxpbmVzIGluIG9vcHMKKworJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwlmb3IgbCBpbiBhIGIgYyBkIGUgZiBnIGggaSBqIGsgbCBtIG4gbworCWRvCisJCWVjaG8gJGwkbCRsJGwkbCRsJGwkbCRsCisJZG9uZSA+b29wcyAmJgorCisJdGVzdF90aWNrICYmCisJZ2l0IGFkZCBvb3BzICYmCisJZ2l0IGNvbW1pdCAtbSBpbml0aWFsICYmCisJZ2l0IHRhZyBpbml0aWFsICYmCisKKwl0ZXN0X3RpY2sgJiYKKwllY2hvICJBZGQgZXh0cmEgbGluZSBhdCB0aGUgZW5kIiA+Pm9vcHMgJiYKKwlnaXQgY29tbWl0IC1hIC1tIGFkZGVkICYmCisJZ2l0IHRhZyBhZGRlZCAmJgorCisJdGVzdF90aWNrICYmCisJZ2l0IG12IG9vcHMgc3BvbyAmJgorCWdpdCBjb21taXQgLW0gcmVuYW1lMSAmJgorCWdpdCB0YWcgcmVuYW1lMSAmJgorCisJdGVzdF90aWNrICYmCisJZ2l0IGNoZWNrb3V0IC1iIHNpZGUgaW5pdGlhbCAmJgorCWdpdCBtdiBvb3BzIG9wb3MgJiYKKwlnaXQgY29tbWl0IC1tIHJlbmFtZTIgJiYKKwlnaXQgdGFnIHJlbmFtZTIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlcnJ5LXBpY2sgYWZ0ZXIgcmVuYW1pbmcgYnJhbmNoJyAnCisKKwlnaXQgY2hlY2tvdXQgcmVuYW1lMiAmJgorCWdpdCBjaGVycnktcGljayBhZGRlZCAmJgorCXRlc3QgLWYgb3BvcyAmJgorCWdyZXAgIkFkZCBleHRyYSBsaW5lIGF0IHRoZSBlbmQiIG9wb3MKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZXZlcnQgYWZ0ZXIgcmVuYW1pbmcgYnJhbmNoJyAnCisKKwlnaXQgY2hlY2tvdXQgcmVuYW1lMSAmJgorCWdpdCByZXZlcnQgYWRkZWQgJiYKKwl0ZXN0IC1mIHNwb28gJiYKKwkhIGdyZXAgIkFkZCBleHRyYSBsaW5lIGF0IHRoZSBlbmQiIHNwb28KKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZXZlcnQgZm9yYmlkZGVuIG9uIGRpcnR5IHdvcmtpbmcgdHJlZScgJworCisJZWNobyBjb250ZW50ID5leHRyYV9maWxlICYmCisJZ2l0IGFkZCBleHRyYV9maWxlICYmCisJdGVzdF9tdXN0X2ZhaWwgZ2l0IHJldmVydCBIRUFEIDI+ZXJyb3JzICYmCisJZ3JlcCAiRGlydHkgaW5kZXgiIGVycm9ycworCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzUwMi1jaGVycnktcGljay1tZXJnZS5zaCBiL3QvdDM1MDItY2hlcnJ5LXBpY2stbWVyZ2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2M5MmUyNgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM1MDItY2hlcnJ5LXBpY2stbWVyZ2Uuc2gKQEAgLTAsMCArMSwxMjMgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdjaGVycnkgcGlja2luZyBhbmQgcmV2ZXJ0aW5nIGEgbWVyZ2UKKworCQliLS0tYworCSAgICAgICAvICAgLworCWluaXRpYWwtLS1hCisKKycKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJPkEgJiYKKwk+QiAmJgorCWdpdCBhZGQgQSBCICYmCisJZ2l0IGNvbW1pdCAtbSAiSW5pdGlhbCIgJiYKKwlnaXQgdGFnIGluaXRpYWwgJiYKKwlnaXQgYnJhbmNoIHNpZGUgJiYKKwllY2hvIG5ldyBsaW5lID5BICYmCisJZ2l0IGNvbW1pdCAtbSAiYWRkIGxpbmUgdG8gQSIgQSAmJgorCWdpdCB0YWcgYSAmJgorCWdpdCBjaGVja291dCBzaWRlICYmCisJZWNobyBuZXcgbGluZSA+QiAmJgorCWdpdCBjb21taXQgLW0gImFkZCBsaW5lIHRvIEIiIEIgJiYKKwlnaXQgdGFnIGIgJiYKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisJZ2l0IG1lcmdlIHNpZGUgJiYKKwlnaXQgdGFnIGMKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVycnktcGljayBhIG5vbi1tZXJnZSB3aXRoIC1tIHNob3VsZCBmYWlsJyAnCisKKwlnaXQgcmVzZXQgLS1oYXJkICYmCisJZ2l0IGNoZWNrb3V0IGFeMCAmJgorCSEgZ2l0IGNoZXJyeS1waWNrIC1tIDEgYiAmJgorCWdpdCBkaWZmIC0tZXhpdC1jb2RlIGEgLS0KKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVycnkgcGljayBhIG1lcmdlIHdpdGhvdXQgLW0gc2hvdWxkIGZhaWwnICcKKworCWdpdCByZXNldCAtLWhhcmQgJiYKKwlnaXQgY2hlY2tvdXQgYV4wICYmCisJISBnaXQgY2hlcnJ5LXBpY2sgYyAmJgorCWdpdCBkaWZmIC0tZXhpdC1jb2RlIGEgLS0KKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVycnkgcGljayBhIG1lcmdlICgxKScgJworCisJZ2l0IHJlc2V0IC0taGFyZCAmJgorCWdpdCBjaGVja291dCBhXjAgJiYKKwlnaXQgY2hlcnJ5LXBpY2sgLW0gMSBjICYmCisJZ2l0IGRpZmYgLS1leGl0LWNvZGUgYworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZXJyeSBwaWNrIGEgbWVyZ2UgKDIpJyAnCisKKwlnaXQgcmVzZXQgLS1oYXJkICYmCisJZ2l0IGNoZWNrb3V0IGJeMCAmJgorCWdpdCBjaGVycnktcGljayAtbSAyIGMgJiYKKwlnaXQgZGlmZiAtLWV4aXQtY29kZSBjCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlcnJ5IHBpY2sgYSBtZXJnZSByZWxhdGl2ZSB0byBub25leGlzdGVudCBwYXJlbnQgc2hvdWxkIGZhaWwnICcKKworCWdpdCByZXNldCAtLWhhcmQgJiYKKwlnaXQgY2hlY2tvdXQgYl4wICYmCisJISBnaXQgY2hlcnJ5LXBpY2sgLW0gMyBjCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmV2ZXJ0IGEgbm9uLW1lcmdlIHdpdGggLW0gc2hvdWxkIGZhaWwnICcKKworCWdpdCByZXNldCAtLWhhcmQgJiYKKwlnaXQgY2hlY2tvdXQgY14wICYmCisJISBnaXQgcmV2ZXJ0IC1tIDEgYiAmJgorCWdpdCBkaWZmIC0tZXhpdC1jb2RlIGMKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZXZlcnQgYSBtZXJnZSB3aXRob3V0IC1tIHNob3VsZCBmYWlsJyAnCisKKwlnaXQgcmVzZXQgLS1oYXJkICYmCisJZ2l0IGNoZWNrb3V0IGNeMCAmJgorCSEgZ2l0IHJldmVydCBjICYmCisJZ2l0IGRpZmYgLS1leGl0LWNvZGUgYworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JldmVydCBhIG1lcmdlICgxKScgJworCisJZ2l0IHJlc2V0IC0taGFyZCAmJgorCWdpdCBjaGVja291dCBjXjAgJiYKKwlnaXQgcmV2ZXJ0IC1tIDEgYyAmJgorCWdpdCBkaWZmIC0tZXhpdC1jb2RlIGEgLS0KKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZXZlcnQgYSBtZXJnZSAoMiknICcKKworCWdpdCByZXNldCAtLWhhcmQgJiYKKwlnaXQgY2hlY2tvdXQgY14wICYmCisJZ2l0IHJldmVydCAtbSAyIGMgJiYKKwlnaXQgZGlmZiAtLWV4aXQtY29kZSBiIC0tCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmV2ZXJ0IGEgbWVyZ2UgcmVsYXRpdmUgdG8gbm9uZXhpc3RlbnQgcGFyZW50IHNob3VsZCBmYWlsJyAnCisKKwlnaXQgcmVzZXQgLS1oYXJkICYmCisJZ2l0IGNoZWNrb3V0IGNeMCAmJgorCSEgZ2l0IHJldmVydCAtbSAzIGMgJiYKKwlnaXQgZGlmZiAtLWV4aXQtY29kZSBjCisKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzNjAwLXJtLnNoIGIvdC90MzYwMC1ybS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNTQyZjBhCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzYwMC1ybS5zaApAQCAtMCwwICsxLDIyMCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBDYXJsIEQuIFdvcnRoCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3Qgb2YgdGhlIHZhcmlvdXMgb3B0aW9ucyB0byBnaXQgcm0uJworCisuIC4vdGVzdC1saWIuc2gKKworIyBTZXR1cCBzb21lIGZpbGVzIHRvIGJlIHJlbW92ZWQsIHNvbWUgd2l0aCBmdW5ueSBjaGFyYWN0ZXJzCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnSW5pdGlhbGl6ZSB0ZXN0IGRpcmVjdG9yeScgXAorICAgICJ0b3VjaCAtLSBmb28gYmFyIGJheiAnc3BhY2UgZW1iZWRkZWQnIC1xICYmCisgICAgIGdpdCBhZGQgLS0gZm9vIGJhciBiYXogJ3NwYWNlIGVtYmVkZGVkJyAtcSAmJgorICAgICBnaXQtY29tbWl0IC1tICdhZGQgbm9ybWFsIGZpbGVzJyAmJgorICAgICB0ZXN0X3RhYnM9eSAmJgorICAgICBpZiB0b3VjaCAtLSAndGFiCWVtYmVkZGVkJyAnbmV3bGluZQorZW1iZWRkZWQnCisgICAgIHRoZW4KKyAgICAgZ2l0IGFkZCAtLSAndGFiCWVtYmVkZGVkJyAnbmV3bGluZQorZW1iZWRkZWQnICYmCisgICAgIGdpdC1jb21taXQgLW0gJ2FkZCBmaWxlcyB3aXRoIHRhYnMgYW5kIG5ld2xpbmVzJworICAgICBlbHNlCisgICAgICAgICBzYXkgJ1lvdXIgZmlsZXN5c3RlbSBkb2VzIG5vdCBhbGxvdyB0YWJzIGluIGZpbGVuYW1lcy4nCisgICAgICAgICB0ZXN0X3RhYnM9bgorICAgICBmaSIKKworIyBMYXRlciB3ZSB3aWxsIHRyeSByZW1vdmluZyBhbiB1bnJlbW92YWJsZSBwYXRoIHRvIG1ha2Ugc3VyZQorIyBnaXQgcm0gYmFyZnMsIGJ1dCBpZiB0aGUgdGVzdCBpcyBydW4gYXMgcm9vdCB0aGF0IGNhbm5vdCBiZQorIyBhcnJhbmdlZC4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdEZXRlcm1pbmUgcm0gYmVoYXZpb3InIFwKKyAgICAnOiA+dGVzdC1maWxlCisgICAgIGNobW9kIGEtdyAuCisgICAgIHJtIC1mIHRlc3QtZmlsZQorICAgICB0ZXN0IC1mIHRlc3QtZmlsZSAmJiB0ZXN0X2ZhaWxlZF9yZW1vdmU9eQorICAgICBjaG1vZCA3NzUgLgorICAgICBybSAtZiB0ZXN0LWZpbGUnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdQcmUtY2hlY2sgdGhhdCBmb28gZXhpc3RzIGFuZCBpcyBpbiBpbmRleCBiZWZvcmUgZ2l0IHJtIGZvbycgXAorICAgICdbIC1mIGZvbyBdICYmIGdpdCBscy1maWxlcyAtLWVycm9yLXVubWF0Y2ggZm9vJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnVGVzdCB0aGF0IGdpdCBybSBmb28gc3VjY2VlZHMnIFwKKyAgICAnZ2l0IHJtIC0tY2FjaGVkIGZvbycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1Rlc3QgdGhhdCBnaXQgcm0gLS1jYWNoZWQgZm9vIHN1Y2NlZWRzIGlmIHRoZSBpbmRleCBtYXRjaGVzIHRoZSBmaWxlJyBcCisgICAgJ2VjaG8gY29udGVudCA+IGZvbworICAgICBnaXQgYWRkIGZvbworICAgICBnaXQgcm0gLS1jYWNoZWQgZm9vJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnVGVzdCB0aGF0IGdpdCBybSAtLWNhY2hlZCBmb28gc3VjY2VlZHMgaWYgdGhlIGluZGV4IG1hdGNoZXMgdGhlIGZpbGUnIFwKKyAgICAnZWNobyBjb250ZW50ID4gZm9vCisgICAgIGdpdCBhZGQgZm9vCisgICAgIGdpdCBjb21taXQgLW0gZm9vCisgICAgIGVjaG8gIm90aGVyIGNvbnRlbnQiID4gZm9vCisgICAgIGdpdCBybSAtLWNhY2hlZCBmb28nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdUZXN0IHRoYXQgZ2l0IHJtIC0tY2FjaGVkIGZvbyBmYWlscyBpZiB0aGUgaW5kZXggbWF0Y2hlcyBuZWl0aGVyIHRoZSBmaWxlIG5vciBIRUFEJyAnCisgICAgIGVjaG8gY29udGVudCA+IGZvbworICAgICBnaXQgYWRkIGZvbworICAgICBnaXQgY29tbWl0IC1tIGZvbworICAgICBlY2hvICJvdGhlciBjb250ZW50IiA+IGZvbworICAgICBnaXQgYWRkIGZvbworICAgICBlY2hvICJ5ZXQgYW5vdGhlciBjb250ZW50IiA+IGZvbworICAgICAhIGdpdCBybSAtLWNhY2hlZCBmb28KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1Rlc3QgdGhhdCBnaXQgcm0gLS1jYWNoZWQgLWYgZm9vIHdvcmtzIGluIGNhc2Ugd2hlcmUgLS1jYWNoZWQgb25seSBkaWQgbm90JyBcCisgICAgJ2VjaG8gY29udGVudCA+IGZvbworICAgICBnaXQgYWRkIGZvbworICAgICBnaXQgY29tbWl0IC1tIGZvbworICAgICBlY2hvICJvdGhlciBjb250ZW50IiA+IGZvbworICAgICBnaXQgYWRkIGZvbworICAgICBlY2hvICJ5ZXQgYW5vdGhlciBjb250ZW50IiA+IGZvbworICAgICBnaXQgcm0gLS1jYWNoZWQgLWYgZm9vJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnUG9zdC1jaGVjayB0aGF0IGZvbyBleGlzdHMgYnV0IGlzIG5vdCBpbiBpbmRleCBhZnRlciBnaXQgcm0gZm9vJyBcCisgICAgJ1sgLWYgZm9vIF0gJiYgISBnaXQgbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIGZvbycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1ByZS1jaGVjayB0aGF0IGJhciBleGlzdHMgYW5kIGlzIGluIGluZGV4IGJlZm9yZSAiZ2l0IHJtIGJhciInIFwKKyAgICAnWyAtZiBiYXIgXSAmJiBnaXQgbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIGJhcicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1Rlc3QgdGhhdCAiZ2l0IHJtIGJhciIgc3VjY2VlZHMnIFwKKyAgICAnZ2l0IHJtIGJhcicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1Bvc3QtY2hlY2sgdGhhdCBiYXIgZG9lcyBub3QgZXhpc3QgYW5kIGlzIG5vdCBpbiBpbmRleCBhZnRlciAiZ2l0IHJtIC1mIGJhciInIFwKKyAgICAnISBbIC1mIGJhciBdICYmICEgZ2l0IGxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCBiYXInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdUZXN0IHRoYXQgImdpdCBybSAtLSAtcSIgc3VjY2VlZHMgKHJlbW92ZSBhIGZpbGUgdGhhdCBsb29rcyBsaWtlIGFuIG9wdGlvbiknIFwKKyAgICAnZ2l0IHJtIC0tIC1xJworCit0ZXN0ICIkdGVzdF90YWJzIiA9IHkgJiYgdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgIlRlc3QgdGhhdCBcImdpdCBybSAtZlwiIHN1Y2NlZWRzIHdpdGggZW1iZWRkZWQgc3BhY2UsIHRhYiwgb3IgbmV3bGluZSBjaGFyYWN0ZXJzLiIgXAorICAgICJnaXQgcm0gLWYgJ3NwYWNlIGVtYmVkZGVkJyAndGFiCWVtYmVkZGVkJyAnbmV3bGluZQorZW1iZWRkZWQnIgorCitpZiB0ZXN0ICIkdGVzdF9mYWlsZWRfcmVtb3ZlIiA9IHk7IHRoZW4KK2NobW9kIGEtdyAuCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnVGVzdCB0aGF0ICJnaXQgcm0gLWYiIGZhaWxzIGlmIGl0cyBybSBmYWlscycgXAorICAgICchIGdpdCBybSAtZiBiYXonCitjaG1vZCA3NzUgLgorZWxzZQorICAgIHRlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NraXBwaW5nIHJlbW92YWwgZmFpbHVyZSAocGVyaGFwcyBydW5uaW5nIGFzIHJvb3Q/KScgOgorZmkKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1doZW4gdGhlIHJtIGluICJnaXQgcm0gLWYiIGZhaWxzLCBpdCBzaG91bGQgbm90IHJlbW92ZSB0aGUgZmlsZSBmcm9tIHRoZSBpbmRleCcgXAorICAgICdnaXQgbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIGJheicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnUmVtb3ZlIG5vbmV4aXN0ZW50IGZpbGUgd2l0aCAtLWlnbm9yZS11bm1hdGNoJyAnCisJZ2l0IHJtIC0taWdub3JlLXVubWF0Y2ggbm9uZXhpc3RlbnQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnInJtIiBjb21tYW5kIHByaW50ZWQnICcKKwllY2hvIGZyb3R6ID4gdGVzdC1maWxlICYmCisJZ2l0IGFkZCB0ZXN0LWZpbGUgJiYKKwlnaXQgY29tbWl0IC1tICJhZGQgZmlsZSBmb3Igcm0gdGVzdCIgJiYKKwlnaXQgcm0gdGVzdC1maWxlID4gcm0tb3V0cHV0ICYmCisJdGVzdCBgZ3JlcCAiXnJtICIgcm0tb3V0cHV0IHwgd2MgLWxgID0gMSAmJgorCXJtIC1mIHRlc3QtZmlsZSBybS1vdXRwdXQgJiYKKwlnaXQgY29tbWl0IC1tICJyZW1vdmUgZmlsZSBmcm9tIHJtIHRlc3QiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJyJybSIgY29tbWFuZCBzdXBwcmVzc2VkIHdpdGggLS1xdWlldCcgJworCWVjaG8gZnJvdHogPiB0ZXN0LWZpbGUgJiYKKwlnaXQgYWRkIHRlc3QtZmlsZSAmJgorCWdpdCBjb21taXQgLW0gImFkZCBmaWxlIGZvciBybSAtLXF1aWV0IHRlc3QiICYmCisJZ2l0IHJtIC0tcXVpZXQgdGVzdC1maWxlID4gcm0tb3V0cHV0ICYmCisJdGVzdCBgd2MgLWwgPCBybS1vdXRwdXRgID0gMCAmJgorCXJtIC1mIHRlc3QtZmlsZSBybS1vdXRwdXQgJiYKKwlnaXQgY29tbWl0IC1tICJyZW1vdmUgZmlsZSBmcm9tIHJtIC0tcXVpZXQgdGVzdCIKKycKKworIyBOb3csIGZhaWx1cmUgY2FzZXMuCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdSZS1hZGQgZm9vIGFuZCBiYXonICcKKwlnaXQgYWRkIGZvbyBiYXogJiYKKwlnaXQgbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIGZvbyBiYXoKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnTW9kaWZ5IGZvbyAtLSBybSBzaG91bGQgcmVmdXNlJyAnCisJZWNobyA+PmZvbyAmJgorCSEgZ2l0IHJtIGZvbyBiYXogJiYKKwl0ZXN0IC1mIGZvbyAmJgorCXRlc3QgLWYgYmF6ICYmCisJZ2l0IGxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCBmb28gYmF6CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ01vZGlmaWVkIGZvbyAtLSBybSAtZiBzaG91bGQgd29yaycgJworCWdpdCBybSAtZiBmb28gYmF6ICYmCisJdGVzdCAhIC1mIGZvbyAmJgorCXRlc3QgISAtZiBiYXogJiYKKwkhIGdpdCBscy1maWxlcyAtLWVycm9yLXVubWF0Y2ggZm9vICYmCisJISBnaXQgbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIGJhcgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdSZS1hZGQgZm9vIGFuZCBiYXogZm9yIEhFQUQgdGVzdHMnICcKKwllY2hvIGZyb3R6ID5mb28gJiYKKwlnaXQgY2hlY2tvdXQgSEVBRCAtLSBiYXogJiYKKwlnaXQgYWRkIGZvbyBiYXogJiYKKwlnaXQgbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIGZvbyBiYXoKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZm9vIGlzIGRpZmZlcmVudCBpbiBpbmRleCBmcm9tIEhFQUQgLS0gcm0gc2hvdWxkIHJlZnVzZScgJworCSEgZ2l0IHJtIGZvbyBiYXogJiYKKwl0ZXN0IC1mIGZvbyAmJgorCXRlc3QgLWYgYmF6ICYmCisJZ2l0IGxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCBmb28gYmF6CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2J1dCB3aXRoIC1mIGl0IHNob3VsZCB3b3JrLicgJworCWdpdCBybSAtZiBmb28gYmF6ICYmCisJdGVzdCAhIC1mIGZvbyAmJgorCXRlc3QgISAtZiBiYXogJiYKKwkhIGdpdCBscy1maWxlcyAtLWVycm9yLXVubWF0Y2ggZm9vCisJISBnaXQgbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIGJhegorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdSZWN1cnNpdmUgdGVzdCBzZXR1cCcgJworCW1rZGlyIC1wIGZyb3R6ICYmCisJZWNobyBxZndmcSA+ZnJvdHovbml0Zm9sICYmCisJZ2l0IGFkZCBmcm90eiAmJgorCWdpdCBjb21taXQgLW0gInN1YmRpciB0ZXN0IgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdSZWN1cnNpdmUgd2l0aG91dCAtciBmYWlscycgJworCSEgZ2l0IHJtIGZyb3R6ICYmCisJdGVzdCAtZCBmcm90eiAmJgorCXRlc3QgLWYgZnJvdHovbml0Zm9sCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ1JlY3Vyc2l2ZSB3aXRoIC1yIGJ1dCBkaXJ0eScgJworCWVjaG8gcWZ3ZnEgPj5mcm90ei9uaXRmb2wKKwkhIGdpdCBybSAtciBmcm90eiAmJgorCXRlc3QgLWQgZnJvdHogJiYKKwl0ZXN0IC1mIGZyb3R6L25pdGZvbAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdSZWN1cnNpdmUgd2l0aCAtciAtZicgJworCWdpdCBybSAtZiAtciBmcm90eiAmJgorCSEgdGVzdCAtZiBmcm90ei9uaXRmb2wgJiYKKwkhIHRlc3QgLWQgZnJvdHoKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnUmVtb3ZlIG5vbmV4aXN0ZW50IGZpbGUgcmV0dXJucyBub256ZXJvIGV4aXQgc3RhdHVzJyAnCisJISBnaXQgcm0gbm9uZXhpc3RlbnQKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzNzAwLWFkZC5zaCBiL3QvdDM3MDAtYWRkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI4N2UwNTgKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzNzAwLWFkZC5zaApAQCAtMCwwICsxLDE4MiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBDYXJsIEQuIFdvcnRoCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3Qgb2YgZ2l0IGFkZCwgaW5jbHVkaW5nIHRoZSAtLSBvcHRpb24uJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1Rlc3Qgb2YgZ2l0IGFkZCcgXAorICAgICd0b3VjaCBmb28gJiYgZ2l0IGFkZCBmb28nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdQb3N0LWNoZWNrIHRoYXQgZm9vIGlzIGluIHRoZSBpbmRleCcgXAorICAgICdnaXQgbHMtZmlsZXMgZm9vIHwgZ3JlcCBmb28nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdUZXN0IHRoYXQgImdpdCBhZGQgLS0gLXEiIHdvcmtzJyBcCisgICAgJ3RvdWNoIC0tIC1xICYmIGdpdCBhZGQgLS0gLXEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdnaXQgYWRkOiBUZXN0IHRoYXQgZXhlY3V0YWJsZSBiaXQgaXMgbm90IHVzZWQgaWYgY29yZS5maWxlbW9kZT0wJyBcCisJJ2dpdCBjb25maWcgY29yZS5maWxlbW9kZSAwICYmCisJIGVjaG8gZm9vID54Zm9vMSAmJgorCSBjaG1vZCA3NTUgeGZvbzEgJiYKKwkgZ2l0IGFkZCB4Zm9vMSAmJgorCSBjYXNlICJgZ2l0IGxzLWZpbGVzIC0tc3RhZ2UgeGZvbzFgIiBpbgorCSAxMDA2NDQiICIqeGZvbzEpIGVjaG8gb2s7OworCSAqKSBlY2hvIGZhaWw7IGdpdCBscy1maWxlcyAtLXN0YWdlIHhmb28xOyAoZXhpdCAxKTs7CisJIGVzYWMnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBhZGQ6IGZpbGVtb2RlPTAgc2hvdWxkIG5vdCBnZXQgY29uZnVzZWQgYnkgc3ltbGluaycgJworCXJtIC1mIHhmb28xICYmCisJbG4gLXMgZm9vIHhmb28xICYmCisJZ2l0IGFkZCB4Zm9vMSAmJgorCWNhc2UgImBnaXQgbHMtZmlsZXMgLS1zdGFnZSB4Zm9vMWAiIGluCisJMTIwMDAwIiAiKnhmb28xKSBlY2hvIG9rOzsKKwkqKSBlY2hvIGZhaWw7IGdpdCBscy1maWxlcyAtLXN0YWdlIHhmb28xOyAoZXhpdCAxKTs7CisJZXNhYworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZDogVGVzdCB0aGF0IGV4ZWN1dGFibGUgYml0IGlzIG5vdCB1c2VkLi4uJyBcCisJJ2dpdCBjb25maWcgY29yZS5maWxlbW9kZSAwICYmCisJIGVjaG8gZm9vID54Zm9vMiAmJgorCSBjaG1vZCA3NTUgeGZvbzIgJiYKKwkgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCB4Zm9vMiAmJgorCSBjYXNlICJgZ2l0IGxzLWZpbGVzIC0tc3RhZ2UgeGZvbzJgIiBpbgorCSAxMDA2NDQiICIqeGZvbzIpIGVjaG8gb2s7OworCSAqKSBlY2hvIGZhaWw7IGdpdCBscy1maWxlcyAtLXN0YWdlIHhmb28yOyAoZXhpdCAxKTs7CisJIGVzYWMnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBhZGQ6IGZpbGVtb2RlPTAgc2hvdWxkIG5vdCBnZXQgY29uZnVzZWQgYnkgc3ltbGluaycgJworCXJtIC1mIHhmb28yICYmCisJbG4gLXMgZm9vIHhmb28yICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCB4Zm9vMiAmJgorCWNhc2UgImBnaXQgbHMtZmlsZXMgLS1zdGFnZSB4Zm9vMmAiIGluCisJMTIwMDAwIiAiKnhmb28yKSBlY2hvIG9rOzsKKwkqKSBlY2hvIGZhaWw7IGdpdCBscy1maWxlcyAtLXN0YWdlIHhmb28yOyAoZXhpdCAxKTs7CisJZXNhYworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZDogVGVzdCB0aGF0IGV4ZWN1dGFibGUgYml0IGlzIG5vdCB1c2VkLi4uJyBcCisJJ2dpdCBjb25maWcgY29yZS5maWxlbW9kZSAwICYmCisJIGxuIC1zIHhmb28yIHhmb28zICYmCisJIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgeGZvbzMgJiYKKwkgY2FzZSAiYGdpdCBscy1maWxlcyAtLXN0YWdlIHhmb28zYCIgaW4KKwkgMTIwMDAwIiAiKnhmb28zKSBlY2hvIG9rOzsKKwkgKikgZWNobyBmYWlsOyBnaXQgbHMtZmlsZXMgLS1zdGFnZSB4Zm9vMzsgKGV4aXQgMSk7OworCSBlc2FjJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICcuZ2l0aWdub3JlIHRlc3Qgc2V0dXAnICcKKwllY2hvICIqLmlnIiA+LmdpdGlnbm9yZSAmJgorCW1rZGlyIGMuaWYgZC5pZyAmJgorCT5hLmlnICYmID5iLmlmICYmCisJPmMuaWYvYy5pZiAmJiA+Yy5pZi9jLmlnICYmCisJPmQuaWcvZC5pZiAmJiA+ZC5pZy9kLmlnCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy5naXRpZ25vcmUgaXMgaG9ub3JlZCcgJworCWdpdCBhZGQgLiAmJgorCSEgZ2l0IGxzLWZpbGVzIHwgZ3JlcCAiXFwuaWciCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Vycm9yIG91dCB3aGVuIGF0dGVtcHRpbmcgdG8gYWRkIGlnbm9yZWQgb25lcyB3aXRob3V0IC1mJyAnCisJISBnaXQgYWRkIGEuPz8gJiYKKwkhIGdpdCBscy1maWxlcyB8IGdyZXAgIlxcLmlnIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdlcnJvciBvdXQgd2hlbiBhdHRlbXB0aW5nIHRvIGFkZCBpZ25vcmVkIG9uZXMgd2l0aG91dCAtZicgJworCSEgZ2l0IGFkZCBkLj8/ICYmCisJISBnaXQgbHMtZmlsZXMgfCBncmVwICJcXC5pZyIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYWRkIGlnbm9yZWQgb25lcyB3aXRoIC1mJyAnCisJZ2l0IGFkZCAtZiBhLj8/ICYmCisJZ2l0IGxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCBhLmlnCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FkZCBpZ25vcmVkIG9uZXMgd2l0aCAtZicgJworCWdpdCBhZGQgLWYgZC4/Py8qICYmCisJZ2l0IGxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCBkLmlnL2QuaWYgZC5pZy9kLmlnCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FkZCBpZ25vcmVkIG9uZXMgd2l0aCAtZicgJworCXJtIC1mIC5naXQvaW5kZXggJiYKKwlnaXQgYWRkIC1mIGQuPz8gJiYKKwlnaXQgbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIGQuaWcvZC5pZiBkLmlnL2QuaWcKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLmdpdGlnbm9yZSB3aXRoIHN1YmRpcmVjdG9yeScgJworCisJcm0gLWYgLmdpdC9pbmRleCAmJgorCW1rZGlyIC1wIHN1Yi9kaXIgJiYKKwllY2hvICIhZGlyL2EuKiIgPnN1Yi8uZ2l0aWdub3JlICYmCisJPnN1Yi9hLmlnICYmCisJPnN1Yi9kaXIvYS5pZyAmJgorCWdpdCBhZGQgc3ViL2RpciAmJgorCWdpdCBscy1maWxlcyAtLWVycm9yLXVubWF0Y2ggc3ViL2Rpci9hLmlnICYmCisJcm0gLWYgLmdpdC9pbmRleCAmJgorCSgKKwkJY2Qgc3ViL2RpciAmJgorCQlnaXQgYWRkIC4KKwkpICYmCisJZ2l0IGxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCBzdWIvZGlyL2EuaWcKKycKKworbWtkaXIgMSAxLzIgMS8zCit0b3VjaCAxLzIvYSAxLzMvYiAxLzIvYwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgY29ycmVjdCBwcmVmaXggZGV0ZWN0aW9uJyAnCisJcm0gLWYgLmdpdC9pbmRleCAmJgorCWdpdCBhZGQgMS8yL2EgMS8zL2IgMS8yL2MKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGFkZCB3aXRoIGZpbGVtb2RlPTAsIHN5bWxpbmtzPTAsIGFuZCB1bm1lcmdlZCBlbnRyaWVzJyAnCisJZm9yIHMgaW4gMSAyIDMKKwlkbworCQllY2hvICRzID4gc3RhZ2UkcworCQllY2hvICIxMDA3NTUgJChnaXQgaGFzaC1vYmplY3QgLXcgc3RhZ2UkcykgJHMJZmlsZSIKKwkJZWNobyAiMTIwMDAwICQocHJpbnRmICRzIHwgZ2l0IGhhc2gtb2JqZWN0IC13IC10IGJsb2IgLS1zdGRpbikgJHMJc3ltbGluayIKKwlkb25lIHwgZ2l0IHVwZGF0ZS1pbmRleCAtLWluZGV4LWluZm8gJiYKKwlnaXQgY29uZmlnIGNvcmUuZmlsZW1vZGUgMCAmJgorCWdpdCBjb25maWcgY29yZS5zeW1saW5rcyAwICYmCisJZWNobyBuZXcgPiBmaWxlICYmCisJZWNobyBuZXcgPiBzeW1saW5rICYmCisJZ2l0IGFkZCBmaWxlIHN5bWxpbmsgJiYKKwlnaXQgbHMtZmlsZXMgLS1zdGFnZSB8IGdyZXAgIl4xMDA3NTUgLiogMAlmaWxlJCIgJiYKKwlnaXQgbHMtZmlsZXMgLS1zdGFnZSB8IGdyZXAgIl4xMjAwMDAgLiogMAlzeW1saW5rJCIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGFkZCB3aXRoIGZpbGVtb2RlPTAsIHN5bWxpbmtzPTAgcHJlZmVycyBzdGFnZSAyIG92ZXIgc3RhZ2UgMScgJworCWdpdCBybSAtLWNhY2hlZCAtZiBmaWxlIHN5bWxpbmsgJiYKKwkoCisJCWVjaG8gIjEwMDY0NCAkKGdpdCBoYXNoLW9iamVjdCAtdyBzdGFnZTEpIDEJZmlsZSIKKwkJZWNobyAiMTAwNzU1ICQoZ2l0IGhhc2gtb2JqZWN0IC13IHN0YWdlMikgMglmaWxlIgorCQllY2hvICIxMDA2NDQgJChwcmludGYgMSB8IGdpdCBoYXNoLW9iamVjdCAtdyAtdCBibG9iIC0tc3RkaW4pIDEJc3ltbGluayIKKwkJZWNobyAiMTIwMDAwICQocHJpbnRmIDIgfCBnaXQgaGFzaC1vYmplY3QgLXcgLXQgYmxvYiAtLXN0ZGluKSAyCXN5bWxpbmsiCisJKSB8IGdpdCB1cGRhdGUtaW5kZXggLS1pbmRleC1pbmZvICYmCisJZ2l0IGNvbmZpZyBjb3JlLmZpbGVtb2RlIDAgJiYKKwlnaXQgY29uZmlnIGNvcmUuc3ltbGlua3MgMCAmJgorCWVjaG8gbmV3ID4gZmlsZSAmJgorCWVjaG8gbmV3ID4gc3ltbGluayAmJgorCWdpdCBhZGQgZmlsZSBzeW1saW5rICYmCisJZ2l0IGxzLWZpbGVzIC0tc3RhZ2UgfCBncmVwICJeMTAwNzU1IC4qIDAJZmlsZSQiICYmCisJZ2l0IGxzLWZpbGVzIC0tc3RhZ2UgfCBncmVwICJeMTIwMDAwIC4qIDAJc3ltbGluayQiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBhZGQgLS1yZWZyZXNoJyAnCisJPmZvbyAmJiBnaXQgYWRkIGZvbyAmJiBnaXQgY29tbWl0IC1hIC1tICJjb21taXQgYWxsIiAmJgorCXRlc3QgLXogImBnaXQgZGlmZi1pbmRleCBIRUFEIC0tIGZvb2AiICYmCisJZ2l0IHJlYWQtdHJlZSBIRUFEICYmCisJY2FzZSAiYGdpdCBkaWZmLWluZGV4IEhFQUQgLS0gZm9vYCIgaW4KKwk6MTAwNjQ0IiAiKiJNCWZvbyIpIGVjaG8gb2s7OworCSopIGVjaG8gZmFpbDsgKGV4aXQgMSk7OworCWVzYWMgJiYKKwlnaXQgYWRkIC0tcmVmcmVzaCAtLSBmb28gJiYKKwl0ZXN0IC16ICJgZ2l0IGRpZmYtaW5kZXggSEVBRCAtLSBmb29gIgorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDM3MDEtYWRkLWludGVyYWN0aXZlLnNoIGIvdC90MzcwMS1hZGQtaW50ZXJhY3RpdmUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzdjOTBmNgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM3MDEtYWRkLWludGVyYWN0aXZlLnNoCkBAIC0wLDAgKzEsNjkgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdhZGQgLWkgYmFzaWMgdGVzdHMnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgKGluaXRpYWwpJyAnCisJZWNobyBjb250ZW50ID5maWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJZWNobyBtb3JlID4+ZmlsZSAmJgorCWVjaG8gbGluZXMgPj5maWxlCisnCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzdGF0dXMgd29ya3MgKGluaXRpYWwpJyAnCisJZ2l0IGFkZCAtaSA8L2Rldi9udWxsID5vdXRwdXQgJiYKKwlncmVwICIrMS8tMCAqKzIvLTAgZmlsZSIgb3V0cHV0CisnCitjYXQgPmV4cGVjdGVkIDw8RU9GCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uZDk1ZjNhZAorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZQorQEAgLTAsMCArMSBAQAorK2NvbnRlbnQKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZGlmZiB3b3JrcyAoaW5pdGlhbCknICcKKwkoZWNobyBkOyBlY2hvIDEpIHwgZ2l0IGFkZCAtaSA+b3V0cHV0ICYmCisJc2VkIC1uZSAiL25ldyBmaWxlLywvY29udGVudC9wIiA8b3V0cHV0ID5kaWZmICYmCisJdGVzdF9jbXAgZXhwZWN0ZWQgZGlmZgorJwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmV2ZXJ0IHdvcmtzIChpbml0aWFsKScgJworCWdpdCBhZGQgZmlsZSAmJgorCShlY2hvIHI7IGVjaG8gMSkgfCBnaXQgYWRkIC1pICYmCisJZ2l0IGxzLWZpbGVzID5vdXRwdXQgJiYKKwkhIGdyZXAgLiBvdXRwdXQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgKGNvbW1pdCknICcKKwllY2hvIGJhc2VsaW5lID5maWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJZ2l0IGNvbW1pdCAtbSBjb21taXQgJiYKKwllY2hvIGNvbnRlbnQgPj5maWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJZWNobyBtb3JlID4+ZmlsZSAmJgorCWVjaG8gbGluZXMgPj5maWxlCisnCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzdGF0dXMgd29ya3MgKGNvbW1pdCknICcKKwlnaXQgYWRkIC1pIDwvZGV2L251bGwgPm91dHB1dCAmJgorCWdyZXAgIisxLy0wICorMi8tMCBmaWxlIiBvdXRwdXQKKycKK2NhdCA+ZXhwZWN0ZWQgPDxFT0YKK2luZGV4IDE4MGI0N2MuLmI2ZjJjMDggMTAwNjQ0CistLS0gYS9maWxlCisrKysgYi9maWxlCitAQCAtMSArMSwyIEBACisgYmFzZWxpbmUKKytjb250ZW50CitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2RpZmYgd29ya3MgKGNvbW1pdCknICcKKwkoZWNobyBkOyBlY2hvIDEpIHwgZ2l0IGFkZCAtaSA+b3V0cHV0ICYmCisJc2VkIC1uZSAiL15pbmRleC8sL2NvbnRlbnQvcCIgPG91dHB1dCA+ZGlmZiAmJgorCXRlc3RfY21wIGV4cGVjdGVkIGRpZmYKKycKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JldmVydCB3b3JrcyAoY29tbWl0KScgJworCWdpdCBhZGQgZmlsZSAmJgorCShlY2hvIHI7IGVjaG8gMSkgfCBnaXQgYWRkIC1pICYmCisJZ2l0IGFkZCAtaSA8L2Rldi9udWxsID5vdXRwdXQgJiYKKwlncmVwICJ1bmNoYW5nZWQgKiszLy0wIGZpbGUiIG91dHB1dAorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDM4MDAtbWt0YWcuc2ggYi90L3QzODAwLW1rdGFnLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRmMWZkNmYKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzODAwLW1rdGFnLnNoCkBAIC0wLDAgKzEsMzYzIEBACisjIS9iaW4vc2gKKyMKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LW1rdGFnOiB0YWcgb2JqZWN0IHZlcmlmeSB0ZXN0JworCisuIC4vdGVzdC1saWIuc2gKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgY2hlY2sgdGhlIHRhZy5zaWcgZmlsZSwgZXhwZWN0aW5nIHZlcmlmeV90YWcoKSB0byBmYWlsLAorIyBhbmQgY2hlY2tpbmcgdGhhdCB0aGUgZXJyb3IgbWVzc2FnZSBtYXRjaGVzIHRoZSBwYXR0ZXJuCisjIGdpdmVuIGluIHRoZSBleHBlY3QucGF0IGZpbGUuCisKK2NoZWNrX3ZlcmlmeV9mYWlsdXJlICgpIHsKKwlleHBlY3Q9IiQyIgorCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgIiQxIiAnCisJCSggdGVzdF9tdXN0X2ZhaWwgZ2l0LW1rdGFnIDx0YWcuc2lnIDI+bWVzc2FnZSApICYmCisJCWdyZXAgIiRleHBlY3QiIG1lc3NhZ2UKKwknCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGZpcnN0IGNyZWF0ZSBhIGNvbW1pdCwgc28gd2UgaGF2ZSBhIHZhbGlkIG9iamVjdC90eXBlCisjIGZvciB0aGUgdGFnLgorZWNobyBIZWxsbyA+QQorZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBBCitnaXQtY29tbWl0IC1tICJJbml0aWFsIGNvbW1pdCIKK2hlYWQ9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgMS4gbGVuZ3RoIGNoZWNrCisKK2NhdCA+dGFnLnNpZyA8PEVPRgordG9vIHNob3J0IGZvciBhIHRhZworRU9GCisKK2NoZWNrX3ZlcmlmeV9mYWlsdXJlICdUYWcgb2JqZWN0IGxlbmd0aCBjaGVjaycgXAorCSdeZXJyb3I6IC4qc2l6ZSB3cm9uZy4qJCcKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAyLiBvYmplY3QgbGluZSBsYWJlbCBjaGVjaworCitjYXQgPnRhZy5zaWcgPDxFT0YKK3h4eHh4eCAxMzllOWIzMzk4NmIxYzI2NzBmZmY1MmM1MDY3NjAzMTE3YjNlODk1Cit0eXBlIHRhZwordGFnIG15dGFnCit0YWdnZXIgLiA8PiAwICswMDAwCisKK0VPRgorCitjaGVja192ZXJpZnlfZmFpbHVyZSAnIm9iamVjdCIgbGluZSBsYWJlbCBjaGVjaycgJ15lcnJvcjogY2hhcjA6IC4qIm9iamVjdCAiJCcKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAzLiBvYmplY3QgbGluZSBTSEExIGNoZWNrCisKK2NhdCA+dGFnLnNpZyA8PEVPRgorb2JqZWN0IHp6OWU5YjMzOTg2YjFjMjY3MGZmZjUyYzUwNjc2MDMxMTdiM2U4OTUKK3R5cGUgdGFnCit0YWcgbXl0YWcKK3RhZ2dlciAuIDw+IDAgKzAwMDAKKworRU9GCisKK2NoZWNrX3ZlcmlmeV9mYWlsdXJlICcib2JqZWN0IiBsaW5lIFNIQTEgY2hlY2snICdeZXJyb3I6IGNoYXI3OiAuKlNIQTEgaGFzaCQnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgNC4gdHlwZSBsaW5lIGxhYmVsIGNoZWNrCisKK2NhdCA+dGFnLnNpZyA8PEVPRgorb2JqZWN0IDc3OWU5YjMzOTg2YjFjMjY3MGZmZjUyYzUwNjc2MDMxMTdiM2U4OTUKK3h4eHggdGFnCit0YWcgbXl0YWcKK3RhZ2dlciAuIDw+IDAgKzAwMDAKKworRU9GCisKK2NoZWNrX3ZlcmlmeV9mYWlsdXJlICcidHlwZSIgbGluZSBsYWJlbCBjaGVjaycgJ15lcnJvcjogY2hhcjQ3OiAuKiJcXG50eXBlICIkJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIDUuIHR5cGUgbGluZSBlb2wgY2hlY2sKKworZWNobyAib2JqZWN0IDc3OWU5YjMzOTg2YjFjMjY3MGZmZjUyYzUwNjc2MDMxMTdiM2U4OTUiID50YWcuc2lnCitwcmludGYgInR5cGUgdGFnc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcyIgPj50YWcuc2lnCisKK2NoZWNrX3ZlcmlmeV9mYWlsdXJlICcidHlwZSIgbGluZSBlb2wgY2hlY2snICdeZXJyb3I6IGNoYXI0ODogLioiXFxuIiQnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgNi4gdGFnIGxpbmUgbGFiZWwgY2hlY2sgIzEKKworY2F0ID50YWcuc2lnIDw8RU9GCitvYmplY3QgNzc5ZTliMzM5ODZiMWMyNjcwZmZmNTJjNTA2NzYwMzExN2IzZTg5NQordHlwZSB0YWcKK3h4eCBteXRhZwordGFnZ2VyIC4gPD4gMCArMDAwMAorCitFT0YKKworY2hlY2tfdmVyaWZ5X2ZhaWx1cmUgJyJ0YWciIGxpbmUgbGFiZWwgY2hlY2sgIzEnIFwKKwknXmVycm9yOiBjaGFyNTc6IG5vICJ0YWcgIiBmb3VuZCQnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgNy4gdGFnIGxpbmUgbGFiZWwgY2hlY2sgIzIKKworY2F0ID50YWcuc2lnIDw8RU9GCitvYmplY3QgNzc5ZTliMzM5ODZiMWMyNjcwZmZmNTJjNTA2NzYwMzExN2IzZTg5NQordHlwZSB0YWdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cKK3RhZworRU9GCisKK2NoZWNrX3ZlcmlmeV9mYWlsdXJlICcidGFnIiBsaW5lIGxhYmVsIGNoZWNrICMyJyBcCisJJ15lcnJvcjogY2hhcjg3OiBubyAidGFnICIgZm91bmQkJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIDguIHR5cGUgbGluZSB0eXBlLW5hbWUgbGVuZ3RoIGNoZWNrCisKK2NhdCA+dGFnLnNpZyA8PEVPRgorb2JqZWN0IDc3OWU5YjMzOTg2YjFjMjY3MGZmZjUyYzUwNjc2MDMxMTdiM2U4OTUKK3R5cGUgdGFnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnCit0YWcgbXl0YWcKK0VPRgorCitjaGVja192ZXJpZnlfZmFpbHVyZSAnInR5cGUiIGxpbmUgdHlwZS1uYW1lIGxlbmd0aCBjaGVjaycgXAorCSdeZXJyb3I6IGNoYXI1MzogdHlwZSB0b28gbG9uZyQnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgOS4gdmVyaWZ5IG9iamVjdCAoU0hBMS90eXBlKSBjaGVjaworCitjYXQgPnRhZy5zaWcgPDxFT0YKK29iamVjdCA3NzllOWIzMzk4NmIxYzI2NzBmZmY1MmM1MDY3NjAzMTE3YjNlODk1Cit0eXBlIHRhZ2dnZwordGFnIG15dGFnCit0YWdnZXIgLiA8PiAwICswMDAwCisKK0VPRgorCitjaGVja192ZXJpZnlfZmFpbHVyZSAndmVyaWZ5IG9iamVjdCAoU0hBMS90eXBlKSBjaGVjaycgXAorCSdeZXJyb3I6IGNoYXI3OiBjb3VsZCBub3QgdmVyaWZ5IG9iamVjdC4qJCcKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIDEwLiB2ZXJpZnkgdGFnLW5hbWUgY2hlY2sKKworY2F0ID50YWcuc2lnIDw8RU9GCitvYmplY3QgJGhlYWQKK3R5cGUgY29tbWl0Cit0YWcgbXkJdGFnCit0YWdnZXIgLiA8PiAwICswMDAwCisKK0VPRgorCitjaGVja192ZXJpZnlfZmFpbHVyZSAndmVyaWZ5IHRhZy1uYW1lIGNoZWNrJyBcCisJJ15lcnJvcjogY2hhcjY3OiBjb3VsZCBub3QgdmVyaWZ5IHRhZyBuYW1lJCcKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIDExLiB0YWdnZXIgbGluZSBsYWJlbCBjaGVjayAjMQorCitjYXQgPnRhZy5zaWcgPDxFT0YKK29iamVjdCAkaGVhZAordHlwZSBjb21taXQKK3RhZyBteXRhZworCitUaGlzIGlzIGZpbGxlcgorRU9GCisKK2NoZWNrX3ZlcmlmeV9mYWlsdXJlICcidGFnZ2VyIiBsaW5lIGxhYmVsIGNoZWNrICMxJyBcCisJJ15lcnJvcjogY2hhcjcwOiBjb3VsZCBub3QgZmluZCAidGFnZ2VyICIkJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgMTIuIHRhZ2dlciBsaW5lIGxhYmVsIGNoZWNrICMyCisKK2NhdCA+dGFnLnNpZyA8PEVPRgorb2JqZWN0ICRoZWFkCit0eXBlIGNvbW1pdAordGFnIG15dGFnCit0YWdnZXIKKworVGhpcyBpcyBmaWxsZXIKK0VPRgorCitjaGVja192ZXJpZnlfZmFpbHVyZSAnInRhZ2dlciIgbGluZSBsYWJlbCBjaGVjayAjMicgXAorCSdeZXJyb3I6IGNoYXI3MDogY291bGQgbm90IGZpbmQgInRhZ2dlciAiJCcKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIDEzLiBkaXNhbGxvdyBtaXNzaW5nIHRhZyBhdXRob3IgbmFtZQorCitjYXQgPnRhZy5zaWcgPDxFT0YKK29iamVjdCAkaGVhZAordHlwZSBjb21taXQKK3RhZyBteXRhZwordGFnZ2VyICA8PiAwICswMDAwCisKK1RoaXMgaXMgZmlsbGVyCitFT0YKKworY2hlY2tfdmVyaWZ5X2ZhaWx1cmUgJ2Rpc2FsbG93IG1pc3NpbmcgdGFnIGF1dGhvciBuYW1lJyBcCisJJ15lcnJvcjogY2hhcjc3OiBtaXNzaW5nIHRhZ2dlciBuYW1lJCcKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIDE0LiBkaXNhbGxvdyBtaXNzaW5nIHRhZyBhdXRob3IgbmFtZQorCitjYXQgPnRhZy5zaWcgPDxFT0YKK29iamVjdCAkaGVhZAordHlwZSBjb21taXQKK3RhZyBteXRhZwordGFnZ2VyIFQgQSBHZ2VyIDwKKyA+IDAgKzAwMDAKKworRU9GCisKK2NoZWNrX3ZlcmlmeV9mYWlsdXJlICdkaXNhbGxvdyBtYWxmb3JtZWQgdGFnZ2VyJyBcCisJJ15lcnJvcjogY2hhcjc3OiBtYWxmb3JtZWQgdGFnZ2VyIGZpZWxkJCcKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIDE1LiBhbGxvdyBlbXB0eSB0YWcgZW1haWwKKworY2F0ID50YWcuc2lnIDw8RU9GCitvYmplY3QgJGhlYWQKK3R5cGUgY29tbWl0Cit0YWcgbXl0YWcKK3RhZ2dlciBUIEEgR2dlciA8PiAwICswMDAwCisKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnYWxsb3cgZW1wdHkgdGFnIGVtYWlsJyBcCisgICAgJ2dpdC1ta3RhZyA8dGFnLnNpZyA+LmdpdC9yZWZzL3RhZ3MvbXl0YWcgMj5tZXNzYWdlJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgMTYuIGRpc2FsbG93IHNwYWNlcyBpbiB0YWcgZW1haWwKKworY2F0ID50YWcuc2lnIDw8RU9GCitvYmplY3QgJGhlYWQKK3R5cGUgY29tbWl0Cit0YWcgbXl0YWcKK3RhZ2dlciBUIEEgR2dlciA8dGFnIGdlckBleGFtcGxlLmNvbT4gMCArMDAwMAorCitFT0YKKworY2hlY2tfdmVyaWZ5X2ZhaWx1cmUgJ2Rpc2FsbG93IHNwYWNlcyBpbiB0YWcgZW1haWwnIFwKKwknXmVycm9yOiBjaGFyNzc6IG1hbGZvcm1lZCB0YWdnZXIgZmllbGQkJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgMTcuIGRpc2FsbG93IG1pc3NpbmcgdGFnIHRpbWVzdGFtcAorCitjYXQgPnRhZy5zaWcgPDxFT0YKK29iamVjdCAkaGVhZAordHlwZSBjb21taXQKK3RhZyBteXRhZwordGFnZ2VyIFQgQSBHZ2VyIDx0YWdnZXJAZXhhbXBsZS5jb20+ICAKKworRU9GCisKK2NoZWNrX3ZlcmlmeV9mYWlsdXJlICdkaXNhbGxvdyBtaXNzaW5nIHRhZyB0aW1lc3RhbXAnIFwKKwknXmVycm9yOiBjaGFyMTA3OiBtaXNzaW5nIHRhZyB0aW1lc3RhbXAkJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgMTguIGRldGVjdCBpbnZhbGlkIHRhZyB0aW1lc3RhbXAxCisKK2NhdCA+dGFnLnNpZyA8PEVPRgorb2JqZWN0ICRoZWFkCit0eXBlIGNvbW1pdAordGFnIG15dGFnCit0YWdnZXIgVCBBIEdnZXIgPHRhZ2dlckBleGFtcGxlLmNvbT4gVHVlIE1hciAyNSAxNTo0Nzo0NCAyMDA4CisKK0VPRgorCitjaGVja192ZXJpZnlfZmFpbHVyZSAnZGV0ZWN0IGludmFsaWQgdGFnIHRpbWVzdGFtcDEnIFwKKwknXmVycm9yOiBjaGFyMTA3OiBtaXNzaW5nIHRhZyB0aW1lc3RhbXAkJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgMTkuIGRldGVjdCBpbnZhbGlkIHRhZyB0aW1lc3RhbXAyCisKK2NhdCA+dGFnLnNpZyA8PEVPRgorb2JqZWN0ICRoZWFkCit0eXBlIGNvbW1pdAordGFnIG15dGFnCit0YWdnZXIgVCBBIEdnZXIgPHRhZ2dlckBleGFtcGxlLmNvbT4gMjAwOC0wMy0zMVQxMjoyMDoxNS0wNTAwCisKK0VPRgorCitjaGVja192ZXJpZnlfZmFpbHVyZSAnZGV0ZWN0IGludmFsaWQgdGFnIHRpbWVzdGFtcDInIFwKKwknXmVycm9yOiBjaGFyMTExOiBtYWxmb3JtZWQgdGFnIHRpbWVzdGFtcCQnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAyMC4gZGV0ZWN0IGludmFsaWQgdGFnIHRpbWV6b25lMQorCitjYXQgPnRhZy5zaWcgPDxFT0YKK29iamVjdCAkaGVhZAordHlwZSBjb21taXQKK3RhZyBteXRhZwordGFnZ2VyIFQgQSBHZ2VyIDx0YWdnZXJAZXhhbXBsZS5jb20+IDEyMDY0NzgyMzMgR01UCisKK0VPRgorCitjaGVja192ZXJpZnlfZmFpbHVyZSAnZGV0ZWN0IGludmFsaWQgdGFnIHRpbWV6b25lMScgXAorCSdeZXJyb3I6IGNoYXIxMTg6IG1hbGZvcm1lZCB0YWcgdGltZXpvbmUkJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgMjEuIGRldGVjdCBpbnZhbGlkIHRhZyB0aW1lem9uZTIKKworY2F0ID50YWcuc2lnIDw8RU9GCitvYmplY3QgJGhlYWQKK3R5cGUgY29tbWl0Cit0YWcgbXl0YWcKK3RhZ2dlciBUIEEgR2dlciA8dGFnZ2VyQGV4YW1wbGUuY29tPiAxMjA2NDc4MjMzICsgIDMwCisKK0VPRgorCitjaGVja192ZXJpZnlfZmFpbHVyZSAnZGV0ZWN0IGludmFsaWQgdGFnIHRpbWV6b25lMicgXAorCSdeZXJyb3I6IGNoYXIxMTg6IG1hbGZvcm1lZCB0YWcgdGltZXpvbmUkJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgMjIuIGRldGVjdCBpbnZhbGlkIHRhZyB0aW1lem9uZTMKKworY2F0ID50YWcuc2lnIDw8RU9GCitvYmplY3QgJGhlYWQKK3R5cGUgY29tbWl0Cit0YWcgbXl0YWcKK3RhZ2dlciBUIEEgR2dlciA8dGFnZ2VyQGV4YW1wbGUuY29tPiAxMjA2NDc4MjMzIC0xNDMwCisKK0VPRgorCitjaGVja192ZXJpZnlfZmFpbHVyZSAnZGV0ZWN0IGludmFsaWQgdGFnIHRpbWV6b25lMycgXAorCSdeZXJyb3I6IGNoYXIxMTg6IG1hbGZvcm1lZCB0YWcgdGltZXpvbmUkJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgMjMuIGRldGVjdCBpbnZhbGlkIGhlYWRlciBlbnRyeQorCitjYXQgPnRhZy5zaWcgPDxFT0YKK29iamVjdCAkaGVhZAordHlwZSBjb21taXQKK3RhZyBteXRhZwordGFnZ2VyIFQgQSBHZ2VyIDx0YWdnZXJAZXhhbXBsZS5jb20+IDEyMDY0NzgyMzMgLTA1MDAKK3RoaXMgbGluZSBzaG91bGQgbm90IGJlIGhlcmUKKworRU9GCisKK2NoZWNrX3ZlcmlmeV9mYWlsdXJlICdkZXRlY3QgaW52YWxpZCBoZWFkZXIgZW50cnknIFwKKwknXmVycm9yOiBjaGFyMTI0OiB0cmFpbGluZyBnYXJiYWdlIGluIHRhZyBoZWFkZXIkJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgMjQuIGNyZWF0ZSB2YWxpZCB0YWcKKworY2F0ID50YWcuc2lnIDw8RU9GCitvYmplY3QgJGhlYWQKK3R5cGUgY29tbWl0Cit0YWcgbXl0YWcKK3RhZ2dlciBUIEEgR2dlciA8dGFnZ2VyQGV4YW1wbGUuY29tPiAxMjA2NDc4MjMzIC0wNTAwCisKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY3JlYXRlIHZhbGlkIHRhZycgXAorICAgICdnaXQtbWt0YWcgPHRhZy5zaWcgPi5naXQvcmVmcy90YWdzL215dGFnIDI+bWVzc2FnZScKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIDI1LiBjaGVjayBteXRhZworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hlY2sgbXl0YWcnIFwKKyAgICAnZ2l0LXRhZyAtbCB8IGdyZXAgbXl0YWcnCisKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzOTAwLWkxOG4tY29tbWl0LnNoIGIvdC90MzkwMC1pMThuLWNvbW1pdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NGIxYzI0Ci0tLSAvZGV2L251bGwKKysrIGIvdC90MzkwMC1pMThuLWNvbW1pdC5zaApAQCAtMCwwICsxLDEyMiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdjb21taXQgYW5kIGxvZyBvdXRwdXQgZW5jb2RpbmdzJworCisuIC4vdGVzdC1saWIuc2gKKworY29tcGFyZV93aXRoICgpIHsKKwlnaXQgc2hvdyAtcyAkMSB8IHNlZCAtZSAnMSwvXiQvZCcgLWUgJ3MvXiAgICAvLycgPmN1cnJlbnQgJiYKKwlnaXQgZGlmZiBjdXJyZW50ICIkMiIKK30KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJOiA+RiAmJgorCWdpdCBhZGQgRiAmJgorCVQ9JChnaXQgd3JpdGUtdHJlZSkgJiYKKwlDPSQoZ2l0IGNvbW1pdC10cmVlICRUIDwuLi90MzkwMC8xLVVURi04LnR4dCkgJiYKKwlnaXQgdXBkYXRlLXJlZiBIRUFEICRDICYmCisJZ2l0LXRhZyBDMAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdubyBlbmNvZGluZyBoZWFkZXIgZm9yIGJhc2UgY2FzZScgJworCUU9JChnaXQgY2F0LWZpbGUgY29tbWl0IEMwIHwgc2VkIC1uZSAicy9eZW5jb2RpbmcgLy9wIikgJiYKKwl0ZXN0IHogPSAieiRFIgorJworCitmb3IgSCBpbiBJU08tODg1OS0xIEVVQ0pQIElTTy0yMDIyLUpQCitkbworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgIiRIIHNldHVwIiAnCisJCWdpdCBjb25maWcgaTE4bi5jb21taXRlbmNvZGluZyAkSCAmJgorCQlnaXQtY2hlY2tvdXQgLWIgJEggQzAgJiYKKwkJZWNobyAkSCA+RiAmJgorCQlnaXQtY29tbWl0IC1hIC1GIC4uL3QzOTAwLyRILnR4dAorCScKK2RvbmUKKworZm9yIEggaW4gSVNPLTg4NTktMSBFVUNKUCBJU08tMjAyMi1KUAorZG8KKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICJjaGVjayBlbmNvZGluZyBoZWFkZXIgZm9yICRIIiAnCisJCUU9JChnaXQgY2F0LWZpbGUgY29tbWl0ICckSCcgfCBzZWQgLW5lICJzL15lbmNvZGluZyAvL3AiKSAmJgorCQl0ZXN0ICJ6JEUiID0gInonJEgnIgorCScKK2RvbmUKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY29uZmlnIHRvIHJlbW92ZSBjdXN0b21pemF0aW9uJyAnCisJZ2l0IGNvbmZpZyAtLXVuc2V0LWFsbCBpMThuLmNvbW1pdGVuY29kaW5nICYmCisJaWYgWj0kKGdpdCBjb25maWcgLS1nZXQtYWxsIGkxOG4uY29tbWl0ZW5jb2RpbmcpCisJdGhlbgorCQllY2hvIE9vcHMsIHNob3VsZCBoYXZlIGZhaWxlZC4KKwkJZmFsc2UKKwllbHNlCisJCXRlc3QgeiA9ICJ6JFoiCisJZmkgJiYKKwlnaXQgY29uZmlnIGkxOG4uY29tbWl0ZW5jb2RpbmcgdXRmLTgKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnSVNPLTg4NTktMSBzaG91bGQgYmUgc2hvd24gaW4gVVRGLTggbm93JyAnCisJY29tcGFyZV93aXRoIElTTy04ODU5LTEgLi4vdDM5MDAvMS1VVEYtOC50eHQKKycKKworZm9yIEggaW4gRVVDSlAgSVNPLTIwMjItSlAKK2RvCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAiJEggc2hvdWxkIGJlIHNob3duIGluIFVURi04IG5vdyIgJworCQljb21wYXJlX3dpdGggJyRIJyAuLi90MzkwMC8yLVVURi04LnR4dAorCScKK2RvbmUKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY29uZmlnIHRvIGFkZCBjdXN0b21pemF0aW9uJyAnCisJZ2l0IGNvbmZpZyAtLXVuc2V0LWFsbCBpMThuLmNvbW1pdGVuY29kaW5nICYmCisJaWYgWj0kKGdpdCBjb25maWcgLS1nZXQtYWxsIGkxOG4uY29tbWl0ZW5jb2RpbmcpCisJdGhlbgorCQllY2hvIE9vcHMsIHNob3VsZCBoYXZlIGZhaWxlZC4KKwkJZmFsc2UKKwllbHNlCisJCXRlc3QgeiA9ICJ6JFoiCisJZmkKKycKKworZm9yIEggaW4gSVNPLTg4NTktMSBFVUNKUCBJU08tMjAyMi1KUAorZG8KKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICIkSCBzaG91bGQgYmUgc2hvd24gaW4gaXRzZWxmIG5vdyIgJworCQlnaXQgY29uZmlnIGkxOG4uY29tbWl0ZW5jb2RpbmcgJyRIJyAmJgorCQljb21wYXJlX3dpdGggJyRIJyAuLi90MzkwMC8nJEgnLnR4dAorCScKK2RvbmUKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY29uZmlnIHRvIHR3ZWFrIGN1c3RvbWl6YXRpb24nICcKKwlnaXQgY29uZmlnIGkxOG4ubG9nb3V0cHV0ZW5jb2RpbmcgdXRmLTgKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnSVNPLTg4NTktMSBzaG91bGQgYmUgc2hvd24gaW4gVVRGLTggbm93JyAnCisJY29tcGFyZV93aXRoIElTTy04ODU5LTEgLi4vdDM5MDAvMS1VVEYtOC50eHQKKycKKworZm9yIEggaW4gRVVDSlAgSVNPLTIwMjItSlAKK2RvCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAiJEggc2hvdWxkIGJlIHNob3duIGluIFVURi04IG5vdyIgJworCQljb21wYXJlX3dpdGggJyRIJyAuLi90MzkwMC8yLVVURi04LnR4dAorCScKK2RvbmUKKworZm9yIEogaW4gRVVDSlAgSVNPLTIwMjItSlAKK2RvCisJZ2l0IGNvbmZpZyBpMThuLmxvZ291dHB1dGVuY29kaW5nICRKCisJZm9yIEggaW4gRVVDSlAgSVNPLTIwMjItSlAKKwlkbworCQl0ZXN0X2V4cGVjdF9zdWNjZXNzICIkSCBzaG91bGQgYmUgc2hvd24gaW4gJEogbm93IiAnCisJCQljb21wYXJlX3dpdGggJyRIJyAuLi90MzkwMC8nJEonLnR4dAorCQknCisJZG9uZQorZG9uZQorCitmb3IgSCBpbiBJU08tODg1OS0xIEVVQ0pQIElTTy0yMDIyLUpQCitkbworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgIk5vIGNvbnZlcnNpb24gd2l0aCAkSCIgJworCQljb21wYXJlX3dpdGggIi0tZW5jb2Rpbmc9bm9uZSAnJEgnIiAuLi90MzkwMC8nJEgnLnR4dAorCScKK2RvbmUKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzOTAwLzEtVVRGLTgudHh0IGIvdC90MzkwMC8xLVVURi04LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTMxZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90MzkwMC8xLVVURi04LnR4dApAQCAtMCwwICsxLDMgQEAKK8OEw4vDkcOPw5YKKworw4Fiw6dkw6hmZwpkaWZmIC0tZ2l0IGEvdC90MzkwMC8yLVVURi04LnR4dCBiL3QvdDM5MDAvMi1VVEYtOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmNGY4ZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM5MDAvMi1VVEYtOC50eHQKQEAgLTAsMCArMSw0IEBACivjga/jgozjgbLjgbvjgbUKKwor44GX44Gm44GE44KL44Gu44GM44CB44GE44KL44Gu44Gn44CCCivmv7HmtZzjgbvjgozjgbfjgorjgb3jgozjgb7jgbPjgZDjgorjgo3jgbjjgIIKZGlmZiAtLWdpdCBhL3QvdDM5MDAvRVVDSlAudHh0IGIvdC90MzkwMC9FVUNKUC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ2ZjJhYQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM5MDAvRVVDSlAudHh0CkBAIC0wLDAgKzEsNCBAQAorpM+k7KTSpNuk1QorCiukt6TGpKSk66TOpKyhoqSkpOukzqTHoaMKK9/Ayc2k26TspNek6qTdpOyk3qTTpLCk6qTtpNihowpkaWZmIC0tZ2l0IGEvdC90MzkwMC9JU08tMjAyMi1KUC50eHQgYi90L3QzOTAwL0lTTy0yMDIyLUpQLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGI1MzMwCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzkwMC9JU08tMjAyMi1KUC50eHQKQEAgLTAsMCArMSw0IEBACisbJEIkTyRsJFIkWyRVGyhCCisKKxskQiQ3JEYkJCRrJE4kLCEiJCQkayROJEchIxsoQgorGyRCX0BJTSRbJGwkVyRqJF0kbCReJFMkMCRqJG0kWCEjGyhCCmRpZmYgLS1naXQgYS90L3QzOTAwL0lTTy04ODU5LTEudHh0IGIvdC90MzkwMC9JU08tODg1OS0xLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2JlZjBlCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzkwMC9JU08tODg1OS0xLnR4dApAQCAtMCwwICsxLDMgQEAKK8TL0c/WCisKK8Fi52ToZmcKZGlmZiAtLWdpdCBhL3QvdDM5MDEtODg1OS0xLnR4dCBiL3QvdDM5MDEtODg1OS0xLnR4dApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zOGMyMWE2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90MzkwMS04ODU5LTEudHh0CkBAIC0wLDAgKzEsNCBAQAorOiB0byBiZSBzb3VyY2VkIGluIHQzOTAxIC0tIHRoaXMgaXMgbGF0aW4tMQorR0lUX0FVVEhPUl9OQU1FPSLB6e0g8/oiICYmCitHSVRfQ09NTUlUVEVSX05BTUU9JEdJVF9BVVRIT1JfTkFNRSAmJgorZXhwb3J0IEdJVF9BVVRIT1JfTkFNRSBHSVRfQ09NTUlUVEVSX05BTUUKZGlmZiAtLWdpdCBhL3QvdDM5MDEtaTE4bi1wYXRjaC5zaCBiL3QvdDM5MDEtaTE4bi1wYXRjaC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMzVmMzcyCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzkwMS1pMThuLXBhdGNoLnNoCkBAIC0wLDAgKzEsMjU1IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2kxOG4gc2V0dGluZ3MgYW5kIGZvcm1hdC1wYXRjaCB8IGFtIHBpcGUnCisKKy4gLi90ZXN0LWxpYi5zaAorCitjaGVja19lbmNvZGluZyAoKSB7CisJIyBNYWtlIHN1cmUgY2hhcmFjdGVycyBhcmUgbm90IGNvcnJ1cHRlZAorCWNudD0iJDEiIGhlYWRlcj0iJDIiIGk9MSBqPTAgYmFkPTAKKwl3aGlsZSB0ZXN0ICIkaSIgLWxlICRjbnQKKwlkbworCQlnaXQgZm9ybWF0LXBhdGNoIC0tZW5jb2Rpbmc9VVRGLTggLS1zdGRvdXQgSEVBRH4kaS4uSEVBRH4kaiB8CisJCWdyZXAgIl5Gcm9tOiA9P1VURi04P3E/PUMzPTgxPUMzPUE5PUMzPUFEPTIwPUMzPUIzPUMzPUJBPz0iICYmCisJCWdpdCBjYXQtZmlsZSBjb21taXQgSEVBRH4kaiB8CisJCWNhc2UgIiRoZWFkZXIiIGluCisJCTg4NTkpCisJCQlncmVwICJeZW5jb2RpbmcgSVNPLTg4NTktMSIgOzsKKwkJKikKKwkJCSEgZ3JlcCAiXmVuY29kaW5nIElTTy04ODU5LTEiIDs7CisJCWVzYWMgfHwgeworCQkJYmFkPTEKKwkJCWJyZWFrCisJCX0KKwkJaj0kaQorCQlpPSQoKCRpKzEpKQorCWRvbmUKKwkoZXhpdCAkYmFkKQorfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKwlnaXQgY29uZmlnIGkxOG4uY29tbWl0ZW5jb2RpbmcgVVRGLTggJiYKKworCSMgdXNlIFVURi04IGluIGF1dGhvciBhbmQgY29tbWl0dGVyIG5hbWUgdG8gbWF0Y2ggdGhlCisJIyBpMThuLmNvbW1pdGVuY29kaW5nIHNldHRpbmdzCisJLiAuLi90MzkwMS11dGY4LnR4dCAmJgorCisJdGVzdF90aWNrICYmCisJZWNobyAiJEdJVF9BVVRIT1JfTkFNRSIgPm1pbmUgJiYKKwlnaXQgYWRkIG1pbmUgJiYKKwlnaXQgY29tbWl0IC1zIC1tICJJbml0aWFsIGNvbW1pdCIgJiYKKworCXRlc3RfdGljayAmJgorCWVjaG8gSGVsbG8gd29ybGQgPm1pbmUgJiYKKwlnaXQgYWRkIG1pbmUgJiYKKwlnaXQgY29tbWl0IC1zIC1tICJTZWNvbmQgb24gbWFpbiIgJiYKKworCSMgdGhlIGZpcnN0IGNvbW1pdCBvbiB0aGUgc2lkZSBicmFuY2ggaXMgVVRGLTgKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY2hlY2tvdXQgLWIgc2lkZSBtYXN0ZXJeICYmCisJZWNobyBBbm90aGVyIGZpbGUgPnlvdXJzICYmCisJZ2l0IGFkZCB5b3VycyAmJgorCWdpdCBjb21taXQgLXMgLW0gIlNlY29uZCBvbiBzaWRlIiAmJgorCisJIyB0aGUgc2Vjb25kIG9uZSBvbiB0aGUgc2lkZSBicmFuY2ggaXMgSVNPLTg4NTktMQorCWdpdCBjb25maWcgaTE4bi5jb21taXRlbmNvZGluZyBJU08tODg1OS0xICYmCisJIyB1c2UgYXV0aG9yIGFuZCBjb21taXR0ZXIgbmFtZSBpbiBJU08tODg1OS0xIHRvIG1hdGNoIGl0LgorCS4gLi4vdDM5MDEtODg1OS0xLnR4dCAmJgorCXRlc3RfdGljayAmJgorCWVjaG8gWWV0IGFub3RoZXIgPnRoZWlycyAmJgorCWdpdCBhZGQgdGhlaXJzICYmCisJZ2l0IGNvbW1pdCAtcyAtbSAiVGhpcmQgb24gc2lkZSIgJiYKKworCSMgQmFjayB0byBkZWZhdWx0CisJZ2l0IGNvbmZpZyBpMThuLmNvbW1pdGVuY29kaW5nIFVURi04CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Zvcm1hdC1wYXRjaCBvdXRwdXQgKElTTy04ODU5LTEpJyAnCisJZ2l0IGNvbmZpZyBpMThuLmxvZ291dHB1dGVuY29kaW5nIElTTy04ODU5LTEgJiYKKworCWdpdCBmb3JtYXQtcGF0Y2ggLS1zdGRvdXQgbWFzdGVyLi5IRUFEXiA+b3V0LWwxICYmCisJZ2l0IGZvcm1hdC1wYXRjaCAtLXN0ZG91dCBIRUFEXiA+b3V0LWwyICYmCisJZ3JlcCAiXkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xIiBvdXQtbDEgJiYKKwlncmVwICJeRnJvbTogPT9JU08tODg1OS0xP3E/PUMxPUU5PUVEPTIwPUYzPUZBPz0iIG91dC1sMSAmJgorCWdyZXAgIl5Db250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9SVNPLTg4NTktMSIgb3V0LWwyICYmCisJZ3JlcCAiXkZyb206ID0/SVNPLTg4NTktMT9xPz1DMT1FOT1FRD0yMD1GMz1GQT89IiBvdXQtbDIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZm9ybWF0LXBhdGNoIG91dHB1dCAoVVRGLTgpJyAnCisJZ2l0IGNvbmZpZyBpMThuLmxvZ291dHB1dGVuY29kaW5nIFVURi04ICYmCisKKwlnaXQgZm9ybWF0LXBhdGNoIC0tc3Rkb3V0IG1hc3Rlci4uSEVBRF4gPm91dC11MSAmJgorCWdpdCBmb3JtYXQtcGF0Y2ggLS1zdGRvdXQgSEVBRF4gPm91dC11MiAmJgorCWdyZXAgIl5Db250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTgiIG91dC11MSAmJgorCWdyZXAgIl5Gcm9tOiA9P1VURi04P3E/PUMzPTgxPUMzPUE5PUMzPUFEPTIwPUMzPUIzPUMzPUJBPz0iIG91dC11MSAmJgorCWdyZXAgIl5Db250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTgiIG91dC11MiAmJgorCWdyZXAgIl5Gcm9tOiA9P1VURi04P3E/PUMzPTgxPUMzPUE5PUMzPUFEPTIwPUMzPUIzPUMzPUJBPz0iIG91dC11MgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZWJhc2UgKFUvVSknICcKKwkjIFdlIHdhbnQgdGhlIHJlc3VsdCBvZiByZWJhc2UgaW4gVVRGLTgKKwlnaXQgY29uZmlnIGkxOG4uY29tbWl0ZW5jb2RpbmcgVVRGLTggJiYKKworCSMgVGhlIHRlc3QgaXMgYWJvdXQgbG9nb3V0cHV0ZW5jb2Rpbmcgbm90IGFmZmVjdGluZyB0aGUKKwkjIGZpbmFsIG91dGNvbWUgLS0gaXQgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIGdlbmVyYXRlIHRoZQorCSMgcGF0Y2ggYW5kIHRoZSBsb2cuCisKKwlnaXQgY29uZmlnIGkxOG4ubG9nb3V0cHV0ZW5jb2RpbmcgVVRGLTggJiYKKworCSMgVGhlIHJlc3VsdCB3aWxsIGJlIGNvbW1pdHRlZCBieSBHSVRfQ09NTUlUVEVSX05BTUUgLS0KKwkjIHdlIHdhbnQgVVRGLTggZW5jb2RlZCBuYW1lLgorCS4gLi4vdDM5MDEtdXRmOC50eHQgJiYKKwlnaXQgY2hlY2tvdXQgLWIgdGVzdCAmJgorCWdpdC1yZWJhc2UgbWFzdGVyICYmCisKKwljaGVja19lbmNvZGluZyAyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlYmFzZSAoVS9MKScgJworCWdpdCBjb25maWcgaTE4bi5jb21taXRlbmNvZGluZyBVVEYtOCAmJgorCWdpdCBjb25maWcgaTE4bi5sb2dvdXRwdXRlbmNvZGluZyBJU08tODg1OS0xICYmCisJLiAuLi90MzkwMS11dGY4LnR4dCAmJgorCisJZ2l0IHJlc2V0IC0taGFyZCBzaWRlICYmCisJZ2l0LXJlYmFzZSBtYXN0ZXIgJiYKKworCWNoZWNrX2VuY29kaW5nIDIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmViYXNlIChML0wpJyAnCisJIyBJbiB0aGlzIHRlc3Qgd2Ugd2FudCBJU08tODg1OS0xIGVuY29kZWQgY29tbWl0cyBhcyB0aGUgcmVzdWx0CisJZ2l0IGNvbmZpZyBpMThuLmNvbW1pdGVuY29kaW5nIElTTy04ODU5LTEgJiYKKwlnaXQgY29uZmlnIGkxOG4ubG9nb3V0cHV0ZW5jb2RpbmcgSVNPLTg4NTktMSAmJgorCS4gLi4vdDM5MDEtODg1OS0xLnR4dCAmJgorCisJZ2l0IHJlc2V0IC0taGFyZCBzaWRlICYmCisJZ2l0LXJlYmFzZSBtYXN0ZXIgJiYKKworCWNoZWNrX2VuY29kaW5nIDIgODg1OQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZWJhc2UgKEwvVSknICcKKwkjIFRoaXMgaXMgcGF0aG9sb2dpY2FsIC0tIHVzZSBVVEYtOCBhcyBpbnRlcm1lZGlhdGUgZm9ybQorCSMgdG8gZ2V0IElTTy04ODU5LTEgcmVzdWx0cy4KKwlnaXQgY29uZmlnIGkxOG4uY29tbWl0ZW5jb2RpbmcgSVNPLTg4NTktMSAmJgorCWdpdCBjb25maWcgaTE4bi5sb2dvdXRwdXRlbmNvZGluZyBVVEYtOCAmJgorCS4gLi4vdDM5MDEtODg1OS0xLnR4dCAmJgorCisJZ2l0IHJlc2V0IC0taGFyZCBzaWRlICYmCisJZ2l0LXJlYmFzZSBtYXN0ZXIgJiYKKworCWNoZWNrX2VuY29kaW5nIDIgODg1OQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVycnktcGljayhVL1UpJyAnCisJIyBCb3RoIHRoZSBjb21taXRlbmNvZGluZyBhbmQgbG9nb3V0cHV0ZW5jb2RpbmcgaXMgc2V0IHRvIFVURi04LgorCisJZ2l0IGNvbmZpZyBpMThuLmNvbW1pdGVuY29kaW5nIFVURi04ICYmCisJZ2l0IGNvbmZpZyBpMThuLmxvZ291dHB1dGVuY29kaW5nIFVURi04ICYmCisJLiAuLi90MzkwMS11dGY4LnR4dCAmJgorCisJZ2l0IHJlc2V0IC0taGFyZCBtYXN0ZXIgJiYKKwlnaXQgY2hlcnJ5LXBpY2sgc2lkZV4gJiYKKwlnaXQgY2hlcnJ5LXBpY2sgc2lkZSAmJgorCWdpdCByZXZlcnQgSEVBRCAmJgorCisJY2hlY2tfZW5jb2RpbmcgMworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVycnktcGljayhML0wpJyAnCisJIyBCb3RoIHRoZSBjb21taXRlbmNvZGluZyBhbmQgbG9nb3V0cHV0ZW5jb2RpbmcgaXMgc2V0IHRvIElTTy04ODU5LTEKKworCWdpdCBjb25maWcgaTE4bi5jb21taXRlbmNvZGluZyBJU08tODg1OS0xICYmCisJZ2l0IGNvbmZpZyBpMThuLmxvZ291dHB1dGVuY29kaW5nIElTTy04ODU5LTEgJiYKKwkuIC4uL3QzOTAxLTg4NTktMS50eHQgJiYKKworCWdpdCByZXNldCAtLWhhcmQgbWFzdGVyICYmCisJZ2l0IGNoZXJyeS1waWNrIHNpZGVeICYmCisJZ2l0IGNoZXJyeS1waWNrIHNpZGUgJiYKKwlnaXQgcmV2ZXJ0IEhFQUQgJiYKKworCWNoZWNrX2VuY29kaW5nIDMgODg1OQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVycnktcGljayhVL0wpJyAnCisJIyBDb21taXRlbmNvZGluZyBpcyBzZXQgdG8gVVRGLTggYnV0IGxvZ291dHB1dGVuY29kaW5nIGlzIElTTy04ODU5LTEKKworCWdpdCBjb25maWcgaTE4bi5jb21taXRlbmNvZGluZyBVVEYtOCAmJgorCWdpdCBjb25maWcgaTE4bi5sb2dvdXRwdXRlbmNvZGluZyBJU08tODg1OS0xICYmCisJLiAuLi90MzkwMS11dGY4LnR4dCAmJgorCisJZ2l0IHJlc2V0IC0taGFyZCBtYXN0ZXIgJiYKKwlnaXQgY2hlcnJ5LXBpY2sgc2lkZV4gJiYKKwlnaXQgY2hlcnJ5LXBpY2sgc2lkZSAmJgorCWdpdCByZXZlcnQgSEVBRCAmJgorCisJY2hlY2tfZW5jb2RpbmcgMworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVycnktcGljayhML1UpJyAnCisJIyBBZ2FpbiwgdGhlIGNvbW1pdGVuY29kaW5nIGlzIHNldCB0byBJU08tODg1OS0xIGJ1dAorCSMgbG9nb3V0cHV0ZW5jb2RpbmcgaXMgc2V0IHRvIFVURi04LgorCisJZ2l0IGNvbmZpZyBpMThuLmNvbW1pdGVuY29kaW5nIElTTy04ODU5LTEgJiYKKwlnaXQgY29uZmlnIGkxOG4ubG9nb3V0cHV0ZW5jb2RpbmcgVVRGLTggJiYKKwkuIC4uL3QzOTAxLTg4NTktMS50eHQgJiYKKworCWdpdCByZXNldCAtLWhhcmQgbWFzdGVyICYmCisJZ2l0IGNoZXJyeS1waWNrIHNpZGVeICYmCisJZ2l0IGNoZXJyeS1waWNrIHNpZGUgJiYKKwlnaXQgcmV2ZXJ0IEhFQUQgJiYKKworCWNoZWNrX2VuY29kaW5nIDMgODg1OQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZWJhc2UgLS1tZXJnZSAoVS9VKScgJworCWdpdCBjb25maWcgaTE4bi5jb21taXRlbmNvZGluZyBVVEYtOCAmJgorCWdpdCBjb25maWcgaTE4bi5sb2dvdXRwdXRlbmNvZGluZyBVVEYtOCAmJgorCS4gLi4vdDM5MDEtdXRmOC50eHQgJiYKKworCWdpdCByZXNldCAtLWhhcmQgc2lkZSAmJgorCWdpdC1yZWJhc2UgLS1tZXJnZSBtYXN0ZXIgJiYKKworCWNoZWNrX2VuY29kaW5nIDIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmViYXNlIC0tbWVyZ2UgKFUvTCknICcKKwlnaXQgY29uZmlnIGkxOG4uY29tbWl0ZW5jb2RpbmcgVVRGLTggJiYKKwlnaXQgY29uZmlnIGkxOG4ubG9nb3V0cHV0ZW5jb2RpbmcgSVNPLTg4NTktMSAmJgorCS4gLi4vdDM5MDEtdXRmOC50eHQgJiYKKworCWdpdCByZXNldCAtLWhhcmQgc2lkZSAmJgorCWdpdC1yZWJhc2UgLS1tZXJnZSBtYXN0ZXIgJiYKKworCWNoZWNrX2VuY29kaW5nIDIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmViYXNlIC0tbWVyZ2UgKEwvTCknICcKKwkjIEluIHRoaXMgdGVzdCB3ZSB3YW50IElTTy04ODU5LTEgZW5jb2RlZCBjb21taXRzIGFzIHRoZSByZXN1bHQKKwlnaXQgY29uZmlnIGkxOG4uY29tbWl0ZW5jb2RpbmcgSVNPLTg4NTktMSAmJgorCWdpdCBjb25maWcgaTE4bi5sb2dvdXRwdXRlbmNvZGluZyBJU08tODg1OS0xICYmCisJLiAuLi90MzkwMS04ODU5LTEudHh0ICYmCisKKwlnaXQgcmVzZXQgLS1oYXJkIHNpZGUgJiYKKwlnaXQtcmViYXNlIC0tbWVyZ2UgbWFzdGVyICYmCisKKwljaGVja19lbmNvZGluZyAyIDg4NTkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmViYXNlIC0tbWVyZ2UgKEwvVSknICcKKwkjIFRoaXMgaXMgcGF0aG9sb2dpY2FsIC0tIHVzZSBVVEYtOCBhcyBpbnRlcm1lZGlhdGUgZm9ybQorCSMgdG8gZ2V0IElTTy04ODU5LTEgcmVzdWx0cy4KKwlnaXQgY29uZmlnIGkxOG4uY29tbWl0ZW5jb2RpbmcgSVNPLTg4NTktMSAmJgorCWdpdCBjb25maWcgaTE4bi5sb2dvdXRwdXRlbmNvZGluZyBVVEYtOCAmJgorCS4gLi4vdDM5MDEtODg1OS0xLnR4dCAmJgorCisJZ2l0IHJlc2V0IC0taGFyZCBzaWRlICYmCisJZ2l0LXJlYmFzZSAtLW1lcmdlIG1hc3RlciAmJgorCisJY2hlY2tfZW5jb2RpbmcgMiA4ODU5CisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzkwMS11dGY4LnR4dCBiL3QvdDM5MDEtdXRmOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWY1MjA1YwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM5MDEtdXRmOC50eHQKQEAgLTAsMCArMSw0IEBACis6IHRvIGJlIHNvdXJjZWQgaW4gdDM5MDEgLS0gdGhpcyBpcyB1dGY4CitHSVRfQVVUSE9SX05BTUU9IsOBw6nDrSDDs8O6IiAmJgorR0lUX0NPTU1JVFRFUl9OQU1FPSRHSVRfQVVUSE9SX05BTUUgJiYKK2V4cG9ydCBHSVRfQVVUSE9SX05BTUUgR0lUX0NPTU1JVFRFUl9OQU1FCmRpZmYgLS1naXQgYS90L3QzOTAyLXF1b3RlZC5zaCBiL3QvdDM5MDItcXVvdGVkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZlNGZiNTEKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzOTAyLXF1b3RlZC5zaApAQCAtMCwwICsxLDEzOSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdxdW90ZWQgb3V0cHV0JworCisuIC4vdGVzdC1saWIuc2gKKworUDE9J3BhdGhuYW1lCXdpdGggSFQnCis6ID4iJFAxIiAyPiYxICYmIHRlc3QgLWYgIiRQMSIgJiYgcm0gLWYgIiRQMSIgfHwgeworCWVjaG8gPiYyICdGaWxlc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgSFQgaW4gbmFtZXMnCisJdGVzdF9kb25lCit9CisKK0ZOPSfmv7Hph44nCitHTj0n57SUJworSFQ9JwknCitMRj0nCisnCitEUT0nIicKKworZWNobyBmb28gPiAiTmFtZSBhbmQgYW4ke0hUfUhUIgordGVzdCAtZiAiTmFtZSBhbmQgYW4ke0hUfUhUIiB8fCB7CisJIyBzaW5jZSBGQVQvTlRGUyBkb2VzIG5vdCBhbGxvdyB0YWJzIGluIGZpbGVuYW1lcywgc2tpcCB0aGlzIHRlc3QKKwlzYXkgJ1lvdXIgZmlsZXN5c3RlbSBkb2VzIG5vdCBhbGxvdyB0YWJzIGluIGZpbGVuYW1lcywgdGVzdCBza2lwcGVkLicKKwl0ZXN0X2RvbmUKK30KKworZm9yX2VhY2hfbmFtZSAoKSB7CisJZm9yIG5hbWUgaW4gXAorCSAgICBOYW1lICJOYW1lIGFuZCBhJHtMRn1MRiIgIk5hbWUgYW5kIGFuJHtIVH1IVCIgIk5hbWUke0RRfSIgXAorCSAgICAiJEZOJEhUJEdOIiAiJEZOJExGJEdOIiAiJEZOICRHTiIgIiRGTiRHTiIgIiRGTiREUSRHTiIgXAorCSAgICAiV2l0aCBTUCBpbiBpdCIKKwlkbworCQlldmFsICIkMSIKKwlkb25lCit9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJZm9yX2VhY2hfbmFtZSAiZWNobyBpbml0aWFsID5cIlwkbmFtZVwiIgorCWdpdCBhZGQgLiAmJgorCWdpdCBjb21taXQgLXEgLW0gSW5pdGlhbCAmJgorCisJZm9yX2VhY2hfbmFtZSAiZWNobyBzZWNvbmQgPlwiXCRuYW1lXCIiICYmCisJZ2l0IGNvbW1pdCAtYSAtbSBTZWNvbmQKKworCWZvcl9lYWNoX25hbWUgImVjaG8gbW9kaWZpZWQgPlwiXCRuYW1lXCIiCisKKycKKworY2F0ID5leHBlY3QucXVvdGVkIDw8XEVPRgorTmFtZQorIk5hbWUgYW5kIGFcbkxGIgorIk5hbWUgYW5kIGFuXHRIVCIKKyJOYW1lXCIiCitXaXRoIFNQIGluIGl0CisiXDM0NlwyNzdcMjYxXDM1MVwyMDdcMjE2XHRcMzQ3XDI2NFwyMjQiCisiXDM0NlwyNzdcMjYxXDM1MVwyMDdcMjE2XG5cMzQ3XDI2NFwyMjQiCisiXDM0NlwyNzdcMjYxXDM1MVwyMDdcMjE2IFwzNDdcMjY0XDIyNCIKKyJcMzQ2XDI3N1wyNjFcMzUxXDIwN1wyMTZcIlwzNDdcMjY0XDIyNCIKKyJcMzQ2XDI3N1wyNjFcMzUxXDIwN1wyMTZcMzQ3XDI2NFwyMjQiCitFT0YKKworY2F0ID5leHBlY3QucmF3IDw8XEVPRgorTmFtZQorIk5hbWUgYW5kIGFcbkxGIgorIk5hbWUgYW5kIGFuXHRIVCIKKyJOYW1lXCIiCitXaXRoIFNQIGluIGl0Cisi5r+x6YeOXHTntJQiCisi5r+x6YeOXG7ntJQiCivmv7Hph44g57SUCisi5r+x6YeOXCLntJQiCivmv7Hph47ntJQKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBmdWxseSBxdW90ZWQgb3V0cHV0IGZyb20gbHMtZmlsZXMnICcKKworCWdpdCBscy1maWxlcyA+Y3VycmVudCAmJiB0ZXN0X2NtcCBleHBlY3QucXVvdGVkIGN1cnJlbnQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBmdWxseSBxdW90ZWQgb3V0cHV0IGZyb20gZGlmZi1maWxlcycgJworCisJZ2l0IGRpZmYgLS1uYW1lLW9ubHkgPmN1cnJlbnQgJiYKKwl0ZXN0X2NtcCBleHBlY3QucXVvdGVkIGN1cnJlbnQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBmdWxseSBxdW90ZWQgb3V0cHV0IGZyb20gZGlmZi1pbmRleCcgJworCisJZ2l0IGRpZmYgLS1uYW1lLW9ubHkgSEVBRCA+Y3VycmVudCAmJgorCXRlc3RfY21wIGV4cGVjdC5xdW90ZWQgY3VycmVudAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIGZ1bGx5IHF1b3RlZCBvdXRwdXQgZnJvbSBkaWZmLXRyZWUnICcKKworCWdpdCBkaWZmIC0tbmFtZS1vbmx5IEhFQUReIEhFQUQgPmN1cnJlbnQgJiYKKwl0ZXN0X2NtcCBleHBlY3QucXVvdGVkIGN1cnJlbnQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR0aW5nIGNvcmUucXVvdGVwYXRoJyAnCisKKwlnaXQgY29uZmlnIC0tYm9vbCBjb3JlLnF1b3RlcGF0aCBmYWxzZQorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIGZ1bGx5IHF1b3RlZCBvdXRwdXQgZnJvbSBscy1maWxlcycgJworCisJZ2l0IGxzLWZpbGVzID5jdXJyZW50ICYmIHRlc3RfY21wIGV4cGVjdC5yYXcgY3VycmVudAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIGZ1bGx5IHF1b3RlZCBvdXRwdXQgZnJvbSBkaWZmLWZpbGVzJyAnCisKKwlnaXQgZGlmZiAtLW5hbWUtb25seSA+Y3VycmVudCAmJgorCXRlc3RfY21wIGV4cGVjdC5yYXcgY3VycmVudAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIGZ1bGx5IHF1b3RlZCBvdXRwdXQgZnJvbSBkaWZmLWluZGV4JyAnCisKKwlnaXQgZGlmZiAtLW5hbWUtb25seSBIRUFEID5jdXJyZW50ICYmCisJdGVzdF9jbXAgZXhwZWN0LnJhdyBjdXJyZW50CisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgZnVsbHkgcXVvdGVkIG91dHB1dCBmcm9tIGRpZmYtdHJlZScgJworCisJZ2l0IGRpZmYgLS1uYW1lLW9ubHkgSEVBRF4gSEVBRCA+Y3VycmVudCAmJgorCXRlc3RfY21wIGV4cGVjdC5yYXcgY3VycmVudAorCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzkwMy1zdGFzaC5zaCBiL3QvdDM5MDMtc3Rhc2guc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmQzZWUzYgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM5MDMtc3Rhc2guc2gKQEAgLTAsMCArMSwxMjAgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDcgSm9oYW5uZXMgRSBTY2hpbmRlbGluCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgZ2l0LXN0YXNoJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc3Rhc2ggc29tZSBkaXJ0eSB3b3JraW5nIGRpcmVjdG9yeScgJworCWVjaG8gMSA+IGZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIGluaXRpYWwgJiYKKwllY2hvIDIgPiBmaWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJZWNobyAzID4gZmlsZSAmJgorCXRlc3RfdGljayAmJgorCWdpdCBzdGFzaCAmJgorCWdpdCBkaWZmLWZpbGVzIC0tcXVpZXQgJiYKKwlnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCAtLXF1aWV0IEhFQUQKKycKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorZGlmZiAtLWdpdCBhL2ZpbGUgYi9maWxlCitpbmRleCAwY2ZiZjA4Li4wMDc1MGVkIDEwMDY0NAorLS0tIGEvZmlsZQorKysrIGIvZmlsZQorQEAgLTEgKzEgQEAKKy0yCisrMworRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3BhcmVudHMgb2Ygc3Rhc2gnICcKKwl0ZXN0ICQoZ2l0IHJldi1wYXJzZSBzdGFzaF4pID0gJChnaXQgcmV2LXBhcnNlIEhFQUQpICYmCisJZ2l0IGRpZmYgc3Rhc2heMi4uc3Rhc2ggPiBvdXRwdXQgJiYKKwl0ZXN0X2NtcCBvdXRwdXQgZXhwZWN0CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IG5lZWRzIGNsZWFuIHdvcmtpbmcgZGlyZWN0b3J5JyAnCisJZWNobyA0ID4gb3RoZXItZmlsZSAmJgorCWdpdCBhZGQgb3RoZXItZmlsZSAmJgorCWVjaG8gNSA+IG90aGVyLWZpbGUgJiYKKyAJdGVzdF9tdXN0X2ZhaWwgZ2l0IHN0YXNoIGFwcGx5CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IHN0YXNoZWQgY2hhbmdlcycgJworCWdpdCBhZGQgb3RoZXItZmlsZSAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gb3RoZXItZmlsZSAmJgorCWdpdCBzdGFzaCBhcHBseSAmJgorCXRlc3QgMyA9ICQoY2F0IGZpbGUpICYmCisJdGVzdCAxID0gJChnaXQgc2hvdyA6ZmlsZSkgJiYKKwl0ZXN0IDEgPSAkKGdpdCBzaG93IEhFQUQ6ZmlsZSkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgc3Rhc2hlZCBjaGFuZ2VzIChpbmNsdWRpbmcgaW5kZXgpJyAnCisJZ2l0IHJlc2V0IC0taGFyZCBIRUFEXiAmJgorCWVjaG8gNiA+IG90aGVyLWZpbGUgJiYKKwlnaXQgYWRkIG90aGVyLWZpbGUgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIG90aGVyLWZpbGUgJiYKKwlnaXQgc3Rhc2ggYXBwbHkgLS1pbmRleCAmJgorCXRlc3QgMyA9ICQoY2F0IGZpbGUpICYmCisJdGVzdCAyID0gJChnaXQgc2hvdyA6ZmlsZSkgJiYKKwl0ZXN0IDEgPSAkKGdpdCBzaG93IEhFQUQ6ZmlsZSkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndW5zdGFzaGluZyBpbiBhIHN1YmRpcmVjdG9yeScgJworCWdpdCByZXNldCAtLWhhcmQgSEVBRCAmJgorCW1rZGlyIHN1YmRpciAmJgorCWNkIHN1YmRpciAmJgorCWdpdCBzdGFzaCBhcHBseSAmJgorCWNkIC4uCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Ryb3AgdG9wIHN0YXNoJyAnCisJZ2l0IHJlc2V0IC0taGFyZCAmJgorCWdpdCBzdGFzaCBsaXN0ID4gc3Rhc2hsaXN0MSAmJgorCWVjaG8gNyA+IGZpbGUgJiYKKwlnaXQgc3Rhc2ggJiYKKwlnaXQgc3Rhc2ggZHJvcCAmJgorCWdpdCBzdGFzaCBsaXN0ID4gc3Rhc2hsaXN0MiAmJgorCWRpZmYgc3Rhc2hsaXN0MSBzdGFzaGxpc3QyICYmCisJZ2l0IHN0YXNoIGFwcGx5ICYmCisJdGVzdCAzID0gJChjYXQgZmlsZSkgJiYKKwl0ZXN0IDEgPSAkKGdpdCBzaG93IDpmaWxlKSAmJgorCXRlc3QgMSA9ICQoZ2l0IHNob3cgSEVBRDpmaWxlKQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdkcm9wIG1pZGRsZSBzdGFzaCcgJworCWdpdCByZXNldCAtLWhhcmQgJiYKKwllY2hvIDggPiBmaWxlICYmCisJZ2l0IHN0YXNoICYmCisJZWNobyA5ID4gZmlsZSAmJgorCWdpdCBzdGFzaCAmJgorCWdpdCBzdGFzaCBkcm9wIHN0YXNoQHsxfSAmJgorCXRlc3QgMiA9ICQoZ2l0IHN0YXNoIGxpc3QgfCB3YyAtbCkgJiYKKwlnaXQgc3Rhc2ggYXBwbHkgJiYKKwl0ZXN0IDkgPSAkKGNhdCBmaWxlKSAmJgorCXRlc3QgMSA9ICQoZ2l0IHNob3cgOmZpbGUpICYmCisJdGVzdCAxID0gJChnaXQgc2hvdyBIRUFEOmZpbGUpICYmCisJZ2l0IHJlc2V0IC0taGFyZCAmJgorCWdpdCBzdGFzaCBkcm9wICYmCisJZ2l0IHN0YXNoIGFwcGx5ICYmCisJdGVzdCAzID0gJChjYXQgZmlsZSkgJiYKKwl0ZXN0IDEgPSAkKGdpdCBzaG93IDpmaWxlKSAmJgorCXRlc3QgMSA9ICQoZ2l0IHNob3cgSEVBRDpmaWxlKQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzdGFzaCBwb3AnICcKKwlnaXQgcmVzZXQgLS1oYXJkICYmCisJZ2l0IHN0YXNoIHBvcCAmJgorCXRlc3QgMyA9ICQoY2F0IGZpbGUpICYmCisJdGVzdCAxID0gJChnaXQgc2hvdyA6ZmlsZSkgJiYKKwl0ZXN0IDEgPSAkKGdpdCBzaG93IEhFQUQ6ZmlsZSkgJiYKKwl0ZXN0IDAgPSAkKGdpdCBzdGFzaCBsaXN0IHwgd2MgLWwpCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAwMC1kaWZmLWZvcm1hdC5zaCBiL3QvdDQwMDAtZGlmZi1mb3JtYXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzQ0YjI3YQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMDAtZGlmZi1mb3JtYXQuc2gKQEAgLTAsMCArMSw2MiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IGJ1aWx0LWluIGRpZmYgb3V0cHV0IGVuZ2luZS4KKworJworLiAuL3Rlc3QtbGliLnNoCisuIC4uL2RpZmYtbGliLnNoCisKK2VjaG8gPnBhdGgwICdMaW5lIDEKK0xpbmUgMgorbGluZSAzJworY2F0IHBhdGgwID5wYXRoMQorY2htb2QgK3ggcGF0aDEKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VwZGF0ZS1pbmRleCAtLWFkZCB0d28gZmlsZXMgd2l0aCBhbmQgd2l0aG91dCAreC4nIFwKKyAgICAnZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMCBwYXRoMScKKworbXYgcGF0aDAgcGF0aDAtCitzZWQgLWUgJ3MvbGluZS9MaW5lLycgPHBhdGgwLSA+cGF0aDAKK2NobW9kICt4IHBhdGgwCitybSAtZiBwYXRoMQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBkaWZmLWZpbGVzIC1wIGFmdGVyIGVkaXRpbmcgd29yayB0cmVlLicgXAorICAgICdnaXQgZGlmZi1maWxlcyAtcCA+Y3VycmVudCcKKworIyB0aGF0J3MgYXMgZmFyIGFzIGl0IGNvbWVzCitpZiBbICIkKGdpdCBjb25maWcgLS1nZXQgY29yZS5maWxlbW9kZSkiID0gZmFsc2UgXQordGhlbgorCXNheSAnZmlsZW1vZGUgZGlzYWJsZWQgb24gdGhlIGZpbGVzeXN0ZW0nCisJdGVzdF9kb25lCitmaQorCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorZGlmZiAtLWdpdCBhL3BhdGgwIGIvcGF0aDAKK29sZCBtb2RlIDEwMDY0NAorbmV3IG1vZGUgMTAwNzU1CistLS0gYS9wYXRoMAorKysrIGIvcGF0aDAKK0BAIC0xLDMgKzEsMyBAQAorIExpbmUgMQorIExpbmUgMgorLWxpbmUgMworK0xpbmUgMworZGlmZiAtLWdpdCBhL3BhdGgxIGIvcGF0aDEKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQorLS0tIGEvcGF0aDEKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLUxpbmUgMQorLUxpbmUgMgorLWxpbmUgMworRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBnaXQgZGlmZi1maWxlcyAtcCBvdXRwdXQuJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9wYXRjaCBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMDEtZGlmZi1yZW5hbWUuc2ggYi90L3Q0MDAxLWRpZmYtcmVuYW1lLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEzMjY5MjQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDAxLWRpZmYtcmVuYW1lLnNoCkBAIC0wLDAgKzEsODAgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdCByZW5hbWUgZGV0ZWN0aW9uIGluIGRpZmYgZW5naW5lLgorCisnCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vZGlmZi1saWIuc2gKKworZWNobyA+cGF0aDAgJ0xpbmUgMQorTGluZSAyCitMaW5lIDMKK0xpbmUgNAorTGluZSA1CitMaW5lIDYKK0xpbmUgNworTGluZSA4CitMaW5lIDkKK0xpbmUgMTAKK2xpbmUgMTEKK0xpbmUgMTIKK0xpbmUgMTMKK0xpbmUgMTQKK0xpbmUgMTUKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VwZGF0ZS1pbmRleCAtLWFkZCBhIGZpbGUuJyBcCisgICAgJ2dpdCB1cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd3cml0ZSB0aGF0IHRyZWUuJyBcCisgICAgJ3RyZWU9JChnaXQgd3JpdGUtdHJlZSkgJiYgZWNobyAkdHJlZScKKworc2VkIC1lICdzL2xpbmUvTGluZS8nIDxwYXRoMCA+cGF0aDEKK3JtIC1mIHBhdGgwCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncmVuYW1lZCBhbmQgZWRpdGVkIHRoZSBmaWxlLicgXAorICAgICdnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIHBhdGgwIHBhdGgxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0IGRpZmYtaW5kZXggLXAgLU0gYWZ0ZXIgcmVuYW1lIGFuZCBlZGl0aW5nLicgXAorICAgICdnaXQgZGlmZi1pbmRleCAtcCAtTSAkdHJlZSA+Y3VycmVudCcKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCitkaWZmIC0tZ2l0IGEvcGF0aDAgYi9wYXRoMQorcmVuYW1lIGZyb20gcGF0aDAKK3JlbmFtZSB0byBwYXRoMQorLS0tIGEvcGF0aDAKKysrKyBiL3BhdGgxCitAQCAtOCw3ICs4LDcgQEAgTGluZSA3CisgTGluZSA4CisgTGluZSA5CisgTGluZSAxMAorLWxpbmUgMTEKKytMaW5lIDExCisgTGluZSAxMgorIExpbmUgMTMKKyBMaW5lIDE0CitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIHRoZSBvdXRwdXQuJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9wYXRjaCBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmYXZvdXIgc2FtZSBiYXNlbmFtZXMgb3ZlciBkaWZmZXJlbnQgb25lcycgJworCWNwIHBhdGgxIGFub3RoZXItcGF0aCAmJgorCWdpdCBhZGQgYW5vdGhlci1wYXRoICYmCisJZ2l0IGNvbW1pdCAtbSAxICYmCisJZ2l0IHJtIHBhdGgxICYmCisJbWtkaXIgc3ViZGlyICYmCisJZ2l0IG12IGFub3RoZXItcGF0aCBzdWJkaXIvcGF0aDEgJiYKKwlnaXQgc3RhdHVzIHwgZ3JlcCAicmVuYW1lZDogLipwYXRoMSAtPiBzdWJkaXIvcGF0aDEiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICAnZmF2b3VyIHNhbWUgYmFzZW5hbWVzIGV2ZW4gd2l0aCBtaW5vciBkaWZmZXJlbmNlcycgJworCWdpdCBzaG93IEhFQUQ6cGF0aDEgfCBzZWQgInMvMTUvMTYvIiA+IHN1YmRpci9wYXRoMSAmJgorCWdpdCBzdGF0dXMgfCBncmVwICJyZW5hbWVkOiAuKnBhdGgxIC0+IHN1YmRpci9wYXRoMSInCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAwMi1kaWZmLWJhc2ljLnNoIGIvdC90NDAwMi1kaWZmLWJhc2ljLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE0Y2ZkZTYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDAyLWRpZmYtYmFzaWMuc2gKQEAgLTAsMCArMSwyNDcgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdCBkaWZmIHJhdy1vdXRwdXQuCisKKycKKy4gLi90ZXN0LWxpYi5zaAorLiAuLi9saWItcmVhZC10cmVlLW0tM3dheS5zaAorCitjYXQgPi50ZXN0LXBsYWluLU9BIDw8XEVPRgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBjY2JhNzJhZDM4ODhhMzUyMGIzOWVmY2Y3ODBiOWVlNjQxNjc1MzVkIEEJQUEKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgN2U0MjZmYjA3OTQ3OWZkNjdmNmQ4MWY5ODRlNGVjNjQ5YTQ0YmMyNSBBCUFOCis6MTAwNjQ0IDAwMDAwMCBiY2M2OGVmOTk3MDE3NDY2ZDVjOTA5NGJjZjc2OTIyOTVmNTg4YzlhIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlERAorOjAwMDAwMCAwNDAwMDAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA2ZDUwZjY1ZDNiZGFiOTFjNjM0NDQyOTRkMzhmMDhhZWZmMzI4ZTQyIEEJREYKKzoxMDA2NDQgMDAwMDAwIDE0MWMxZjE2NDIzMjhlNGJjNDZhN2Q4MDFhNzFkYTM5MmU2Njc5MWUgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECURNCis6MTAwNjQ0IDAwMDAwMCAzNWFiZGUxNTA2ZGRmODA2NTcyZmY0ZDQwN2JkMDY4ODVkMGY4ZWU5IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlETgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAxZDQxMTIyZWJkZDdhNjQwZjI5ZDNjOWNjNGY5ZDcwMDk0Mzc0NzYyIEEJTEwKKzoxMDA2NDQgMTAwNjQ0IDAzZjI0YzhjNDcwMGJhYmNjZmQyOGI2NTRlN2U4ZWFjNDAyYWQ2Y2QgMTAzZDlmODliNTBiOWFhZDAzMDU0YjU3OWJlNWU3YWE2NjVmMmQ1NyBNCU1ECis6MTAwNjQ0IDEwMDY0NCBiMjU4NTA4YWZiN2NlYjQ0OTk4MWJkOWQ2M2QyZDNlOTcxYmY4ZDM0IGI0MzFiMjcyZDgyOWZmM2FhNGQxYTUwODVmNDM5NGFiNGQzMzA1YjYgTQlNTQorOjEwMDY0NCAxMDA2NDQgYmQwODRiMGMyN2M3YjZjYzM0ZjExZDZkMDUwOWEyOWJlM2NhZjk3MCBhNzE2ZDU4ZGU0YTU3MGUwMDM4ZjVjMzA3YmQ4ZGIzNGRhZWEwMjFmIE0JTU4KKzoxMDA2NDQgMTAwNjQ0IDQwYzk1OWY5ODRjOGI4OWEyYjAyNTIwZDE3ZjAwZDcxN2YwMjQzOTcgMmFjNTQ3YWU5NjE0YTAwZDFiMjgyNzVkZTYwODEzMWY3YTBlMjU5ZiBNCVNTCis6MTAwNjQ0IDEwMDY0NCA0YWMxMzQ1ODg5OWFiOTA4ZWYzYjExMjhmYTM3OGRhZWZjODhkMzU2IDRjODZmOWE4NWZiYzVlNjgwNGVlMmUxN2E3OTc1MzhmYmU3ODViY2EgTQlUVAorOjA0MDAwMCAwNDAwMDAgN2Q2NzBmZGNkYjk5MjlmNmM3ZGFjMTk2ZmY3ODY4OWNkMWM1NjZhMSA1ZTVmMjIwNzJiYjM5ZjZlMTJjZjY2M2E1N2NiNjM0Yzc2ZWVmYjQ5IE0JWgorRU9GCisKK2NhdCA+LnRlc3QtcmVjdXJzaXZlLU9BIDw8XEVPRgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBjY2JhNzJhZDM4ODhhMzUyMGIzOWVmY2Y3ODBiOWVlNjQxNjc1MzVkIEEJQUEKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgN2U0MjZmYjA3OTQ3OWZkNjdmNmQ4MWY5ODRlNGVjNjQ5YTQ0YmMyNSBBCUFOCis6MTAwNjQ0IDAwMDAwMCBiY2M2OGVmOTk3MDE3NDY2ZDVjOTA5NGJjZjc2OTIyOTVmNTg4YzlhIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlERAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA2OGE2ZDhiOTFkYTExMDQ1Y2Y0YWEzYTVhYjlmMmE3ODFjNzAxMjQ5IEEJREYvREYKKzoxMDA2NDQgMDAwMDAwIDE0MWMxZjE2NDIzMjhlNGJjNDZhN2Q4MDFhNzFkYTM5MmU2Njc5MWUgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECURNCis6MTAwNjQ0IDAwMDAwMCAzNWFiZGUxNTA2ZGRmODA2NTcyZmY0ZDQwN2JkMDY4ODVkMGY4ZWU5IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlETgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAxZDQxMTIyZWJkZDdhNjQwZjI5ZDNjOWNjNGY5ZDcwMDk0Mzc0NzYyIEEJTEwKKzoxMDA2NDQgMTAwNjQ0IDAzZjI0YzhjNDcwMGJhYmNjZmQyOGI2NTRlN2U4ZWFjNDAyYWQ2Y2QgMTAzZDlmODliNTBiOWFhZDAzMDU0YjU3OWJlNWU3YWE2NjVmMmQ1NyBNCU1ECis6MTAwNjQ0IDEwMDY0NCBiMjU4NTA4YWZiN2NlYjQ0OTk4MWJkOWQ2M2QyZDNlOTcxYmY4ZDM0IGI0MzFiMjcyZDgyOWZmM2FhNGQxYTUwODVmNDM5NGFiNGQzMzA1YjYgTQlNTQorOjEwMDY0NCAxMDA2NDQgYmQwODRiMGMyN2M3YjZjYzM0ZjExZDZkMDUwOWEyOWJlM2NhZjk3MCBhNzE2ZDU4ZGU0YTU3MGUwMDM4ZjVjMzA3YmQ4ZGIzNGRhZWEwMjFmIE0JTU4KKzoxMDA2NDQgMTAwNjQ0IDQwYzk1OWY5ODRjOGI4OWEyYjAyNTIwZDE3ZjAwZDcxN2YwMjQzOTcgMmFjNTQ3YWU5NjE0YTAwZDFiMjgyNzVkZTYwODEzMWY3YTBlMjU5ZiBNCVNTCis6MTAwNjQ0IDEwMDY0NCA0YWMxMzQ1ODg5OWFiOTA4ZWYzYjExMjhmYTM3OGRhZWZjODhkMzU2IDRjODZmOWE4NWZiYzVlNjgwNGVlMmUxN2E3OTc1MzhmYmU3ODViY2EgTQlUVAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA4YWNiOGU5NzUwZTNmNjQ0YmYzMjNmY2YzZDMzODg0OWRiMTA2Yzc3IEEJWi9BQQorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwODc0OTQyNjIwODRjZWZlZTdlZDQ4NGQyMGM4ZGMwNTgwNzkxMjcyIEEJWi9BTgorOjEwMDY0NCAwMDAwMDAgODc5MDA3ZWZhZTYyNGQyYjEzMDcyMTRiMjRhOTU2ZjBhOGQ2ODZhOCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJWi9ERAorOjEwMDY0NCAwMDAwMDAgOWI1NDFiMjI3NWMwNmUzYTdiMTNmMjhiYWRmNTI5NGUyYWU2M2RmNCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJWi9ETQorOjEwMDY0NCAwMDAwMDAgYmViNWQzOGM1NTI4M2QyODA2ODVlYTIxYTBlNTBjZmNjMGNhMDY0YSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJWi9ETgorOjEwMDY0NCAxMDA2NDQgZDQxZmRhNDFiN2VjNGRlNDZiNDNjYjdlYTQyYTQ1MDAxYWUzOTNkNSBhNzlhYzNiZTkzNzc2MzllMWM3ZDFlZGYxYWUxYjNhNWYwY2NkOGE5IE0JWi9NRAorOjEwMDY0NCAxMDA2NDQgNGNhMjJiYWUyNTI3ZDNkOWUxNjc2NDk4YTBmYmEzYjM1NWJkMTI3OCA2MTQyMmJhOWMyYzg3MzQxNjA2MWE4OGNkNDBhNTlhMzViNTc2NDc0IE0JWi9NTQorOjEwMDY0NCAxMDA2NDQgYjE2ZDdiMjViODY5ZjJiZWIxMjRlZmE1MzQ2N2Q4YTE1NTBhZDY5NCBhNWM1NDRjMjFjZmNiMDdlYjgwYTRkODlhNWI3ZDE1NzAwMDJlZGZkIE0JWi9NTgorRU9GCitjYXQgPi50ZXN0LXBsYWluLU9CIDw8XEVPRgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA2YWEyYjUzMzViMTY0MzFhMGVmNzFlNWMwYTI4YmU2OTE4M2NmNmEyIEEJQUEKKzoxMDA2NDQgMDAwMDAwIGJjYzY4ZWY5OTcwMTc0NjZkNWM5MDk0YmNmNzY5MjI5NWY1ODhjOWEgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECURECis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDcxNDIwYWI4MWUyNTQxNDVkMjZkNmZjMGNkZGVlNjRjMWFjZDQ3ODcgQQlERgorOjEwMDY0NCAxMDA2NDQgMTQxYzFmMTY0MjMyOGU0YmM0NmE3ZDgwMWE3MWRhMzkyZTY2NzkxZSAzYzRkOGRlNWZiYWQwODU3MmJhYjhlMTBlZWY4ZGJiMjY0Y2YwMjMxIE0JRE0KKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMWQ0MTEyMmViZGQ3YTY0MGYyOWQzYzljYzRmOWQ3MDA5NDM3NDc2MiBBCUxMCis6MTAwNjQ0IDAwMDAwMCAwM2YyNGM4YzQ3MDBiYWJjY2ZkMjhiNjU0ZTdlOGVhYzQwMmFkNmNkIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlNRAorOjEwMDY0NCAxMDA2NDQgYjI1ODUwOGFmYjdjZWI0NDk5ODFiZDlkNjNkMmQzZTk3MWJmOGQzNCAxOTk4OWQ0NTU5YWFlNDE3ZmVkZWUyNDBjY2YyYmEzMTVlYTRkYzJiIE0JTU0KKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMTU4ODU4ODFlYTY5MTE1MzUxYzA5YjM4MzcxZjAzNDhhM2ZiOGM2NyBBCU5BCis6MTAwNjQ0IDAwMDAwMCBhNGUxNzllNDI5MWU1NTM2YTVlMWM4MmUwOTEwNTI3NzJkMmM1YTkzIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlORAorOjEwMDY0NCAxMDA2NDQgYzhmMjU3ODFlOGYxNzkyZTNlNDBiNzQyMjVlMjA1NTMwNDFiNTIyNiBjZGI5YThjM2RhNTcxNTAyYWMzMDIyNWU5YzE3YmVjY2I4Mzg3OTgzIE0JTk0KKzoxMDA2NDQgMTAwNjQ0IDQwYzk1OWY5ODRjOGI4OWEyYjAyNTIwZDE3ZjAwZDcxN2YwMjQzOTcgMmFjNTQ3YWU5NjE0YTAwZDFiMjgyNzVkZTYwODEzMWY3YTBlMjU5ZiBNCVNTCis6MTAwNjQ0IDEwMDY0NCA0YWMxMzQ1ODg5OWFiOTA4ZWYzYjExMjhmYTM3OGRhZWZjODhkMzU2IGM0ZTRhMTIyMzFiOWZhNzlhMDA1M2NiNjA3N2ZjYjIxYmI1YjEzNWEgTQlUVAorOjA0MDAwMCAwNDAwMDAgN2Q2NzBmZGNkYjk5MjlmNmM3ZGFjMTk2ZmY3ODY4OWNkMWM1NjZhMSAxYmE1MjM5NTVkNTE2MDY4MWFmNjVjYjc3NjQxMWY1NzRjMWU4MTU1IE0JWgorRU9GCitjYXQgPi50ZXN0LXJlY3Vyc2l2ZS1PQiA8PFxFT0YKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgNmFhMmI1MzM1YjE2NDMxYTBlZjcxZTVjMGEyOGJlNjkxODNjZjZhMiBBCUFBCis6MTAwNjQ0IDAwMDAwMCBiY2M2OGVmOTk3MDE3NDY2ZDVjOTA5NGJjZjc2OTIyOTVmNTg4YzlhIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlERAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA3MTQyMGFiODFlMjU0MTQ1ZDI2ZDZmYzBjZGRlZTY0YzFhY2Q0Nzg3IEEJREYKKzoxMDA2NDQgMTAwNjQ0IDE0MWMxZjE2NDIzMjhlNGJjNDZhN2Q4MDFhNzFkYTM5MmU2Njc5MWUgM2M0ZDhkZTVmYmFkMDg1NzJiYWI4ZTEwZWVmOGRiYjI2NGNmMDIzMSBNCURNCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDFkNDExMjJlYmRkN2E2NDBmMjlkM2M5Y2M0ZjlkNzAwOTQzNzQ3NjIgQQlMTAorOjEwMDY0NCAwMDAwMDAgMDNmMjRjOGM0NzAwYmFiY2NmZDI4YjY1NGU3ZThlYWM0MDJhZDZjZCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJTUQKKzoxMDA2NDQgMTAwNjQ0IGIyNTg1MDhhZmI3Y2ViNDQ5OTgxYmQ5ZDYzZDJkM2U5NzFiZjhkMzQgMTk5ODlkNDU1OWFhZTQxN2ZlZGVlMjQwY2NmMmJhMzE1ZWE0ZGMyYiBNCU1NCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDE1ODg1ODgxZWE2OTExNTM1MWMwOWIzODM3MWYwMzQ4YTNmYjhjNjcgQQlOQQorOjEwMDY0NCAwMDAwMDAgYTRlMTc5ZTQyOTFlNTUzNmE1ZTFjODJlMDkxMDUyNzcyZDJjNWE5MyAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJTkQKKzoxMDA2NDQgMTAwNjQ0IGM4ZjI1NzgxZThmMTc5MmUzZTQwYjc0MjI1ZTIwNTUzMDQxYjUyMjYgY2RiOWE4YzNkYTU3MTUwMmFjMzAyMjVlOWMxN2JlY2NiODM4Nzk4MyBNCU5NCis6MTAwNjQ0IDEwMDY0NCA0MGM5NTlmOTg0YzhiODlhMmIwMjUyMGQxN2YwMGQ3MTdmMDI0Mzk3IDJhYzU0N2FlOTYxNGEwMGQxYjI4Mjc1ZGU2MDgxMzFmN2EwZTI1OWYgTQlTUworOjEwMDY0NCAxMDA2NDQgNGFjMTM0NTg4OTlhYjkwOGVmM2IxMTI4ZmEzNzhkYWVmYzg4ZDM1NiBjNGU0YTEyMjMxYjlmYTc5YTAwNTNjYjYwNzdmY2IyMWJiNWIxMzVhIE0JVFQKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgNmMwYjk5Mjg2ZDBiY2U1NTFhYzRhN2IzZGZmOGI3MDZlZGZmMzcxNSBBCVovQUEKKzoxMDA2NDQgMDAwMDAwIDg3OTAwN2VmYWU2MjRkMmIxMzA3MjE0YjI0YTk1NmYwYThkNjg2YTggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECVovREQKKzoxMDA2NDQgMTAwNjQ0IDliNTQxYjIyNzVjMDZlM2E3YjEzZjI4YmFkZjUyOTRlMmFlNjNkZjQgZDc3MzcxZDE1ODE3ZmNhYTU3ZWVlYzI3Zjc3MGM1MDViYTk3NGVjMSBNCVovRE0KKzoxMDA2NDQgMDAwMDAwIGQ0MWZkYTQxYjdlYzRkZTQ2YjQzY2I3ZWE0MmE0NTAwMWFlMzkzZDUgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECVovTUQKKzoxMDA2NDQgMTAwNjQ0IDRjYTIyYmFlMjUyN2QzZDllMTY3NjQ5OGEwZmJhM2IzNTViZDEyNzggNjk3YWFkNzcxNWExZTczMDZjYTc2MjkwYTNkZDQyMDhmYmFlZGRmYSBNCVovTU0KKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgZDEyOTc5YzIyZmZmNjljNTljYTk0MDllN2E4ZmUzZWUyNWVhZWU4MCBBCVovTkEKKzoxMDA2NDQgMDAwMDAwIGExODM5M2M2MzZiOThlOWJkNzI5NmI4YjQzN2VhNDk5MmI3MjQ0MGMgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECVovTkQKKzoxMDA2NDQgMTAwNjQ0IDNmZGJlMTdmZDAxMzMwM2EyZTk4MWUxY2ExYzZjZDZlNzI3ODkwODcgN2UwOWQ2YTNhMTRiZDYzMDkxM2U4Yzc1NjkzY2VhMzIxNTdiNjA2ZCBNCVovTk0KK0VPRgorY2F0ID4udGVzdC1wbGFpbi1BQiA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IGNjYmE3MmFkMzg4OGEzNTIwYjM5ZWZjZjc4MGI5ZWU2NDE2NzUzNWQgNmFhMmI1MzM1YjE2NDMxYTBlZjcxZTVjMGEyOGJlNjkxODNjZjZhMiBNCUFBCis6MTAwNjQ0IDAwMDAwMCA3ZTQyNmZiMDc5NDc5ZmQ2N2Y2ZDgxZjk4NGU0ZWM2NDlhNDRiYzI1IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlBTgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA3MTQyMGFiODFlMjU0MTQ1ZDI2ZDZmYzBjZGRlZTY0YzFhY2Q0Nzg3IEEJREYKKzowNDAwMDAgMDAwMDAwIDZkNTBmNjVkM2JkYWI5MWM2MzQ0NDI5NGQzOGYwOGFlZmYzMjhlNDIgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECURGCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDNjNGQ4ZGU1ZmJhZDA4NTcyYmFiOGUxMGVlZjhkYmIyNjRjZjAyMzEgQQlETQorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAzNWFiZGUxNTA2ZGRmODA2NTcyZmY0ZDQwN2JkMDY4ODVkMGY4ZWU5IEEJRE4KKzoxMDA2NDQgMDAwMDAwIDEwM2Q5Zjg5YjUwYjlhYWQwMzA1NGI1NzliZTVlN2FhNjY1ZjJkNTcgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECU1ECis6MTAwNjQ0IDEwMDY0NCBiNDMxYjI3MmQ4MjlmZjNhYTRkMWE1MDg1ZjQzOTRhYjRkMzMwNWI2IDE5OTg5ZDQ1NTlhYWU0MTdmZWRlZTI0MGNjZjJiYTMxNWVhNGRjMmIgTQlNTQorOjEwMDY0NCAxMDA2NDQgYTcxNmQ1OGRlNGE1NzBlMDAzOGY1YzMwN2JkOGRiMzRkYWVhMDIxZiBiZDA4NGIwYzI3YzdiNmNjMzRmMTFkNmQwNTA5YTI5YmUzY2FmOTcwIE0JTU4KKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMTU4ODU4ODFlYTY5MTE1MzUxYzA5YjM4MzcxZjAzNDhhM2ZiOGM2NyBBCU5BCis6MTAwNjQ0IDAwMDAwMCBhNGUxNzllNDI5MWU1NTM2YTVlMWM4MmUwOTEwNTI3NzJkMmM1YTkzIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlORAorOjEwMDY0NCAxMDA2NDQgYzhmMjU3ODFlOGYxNzkyZTNlNDBiNzQyMjVlMjA1NTMwNDFiNTIyNiBjZGI5YThjM2RhNTcxNTAyYWMzMDIyNWU5YzE3YmVjY2I4Mzg3OTgzIE0JTk0KKzoxMDA2NDQgMTAwNjQ0IDRjODZmOWE4NWZiYzVlNjgwNGVlMmUxN2E3OTc1MzhmYmU3ODViY2EgYzRlNGExMjIzMWI5ZmE3OWEwMDUzY2I2MDc3ZmNiMjFiYjViMTM1YSBNCVRUCis6MDQwMDAwIDA0MDAwMCA1ZTVmMjIwNzJiYjM5ZjZlMTJjZjY2M2E1N2NiNjM0Yzc2ZWVmYjQ5IDFiYTUyMzk1NWQ1MTYwNjgxYWY2NWNiNzc2NDExZjU3NGMxZTgxNTUgTQlaCitFT0YKK2NhdCA+LnRlc3QtcmVjdXJzaXZlLUFCIDw8XEVPRgorOjEwMDY0NCAxMDA2NDQgY2NiYTcyYWQzODg4YTM1MjBiMzllZmNmNzgwYjllZTY0MTY3NTM1ZCA2YWEyYjUzMzViMTY0MzFhMGVmNzFlNWMwYTI4YmU2OTE4M2NmNmEyIE0JQUEKKzoxMDA2NDQgMDAwMDAwIDdlNDI2ZmIwNzk0NzlmZDY3ZjZkODFmOTg0ZTRlYzY0OWE0NGJjMjUgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECUFOCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDcxNDIwYWI4MWUyNTQxNDVkMjZkNmZjMGNkZGVlNjRjMWFjZDQ3ODcgQQlERgorOjEwMDY0NCAwMDAwMDAgNjhhNmQ4YjkxZGExMTA0NWNmNGFhM2E1YWI5ZjJhNzgxYzcwMTI0OSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJREYvREYKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgM2M0ZDhkZTVmYmFkMDg1NzJiYWI4ZTEwZWVmOGRiYjI2NGNmMDIzMSBBCURNCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDM1YWJkZTE1MDZkZGY4MDY1NzJmZjRkNDA3YmQwNjg4NWQwZjhlZTkgQQlETgorOjEwMDY0NCAwMDAwMDAgMTAzZDlmODliNTBiOWFhZDAzMDU0YjU3OWJlNWU3YWE2NjVmMmQ1NyAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJTUQKKzoxMDA2NDQgMTAwNjQ0IGI0MzFiMjcyZDgyOWZmM2FhNGQxYTUwODVmNDM5NGFiNGQzMzA1YjYgMTk5ODlkNDU1OWFhZTQxN2ZlZGVlMjQwY2NmMmJhMzE1ZWE0ZGMyYiBNCU1NCis6MTAwNjQ0IDEwMDY0NCBhNzE2ZDU4ZGU0YTU3MGUwMDM4ZjVjMzA3YmQ4ZGIzNGRhZWEwMjFmIGJkMDg0YjBjMjdjN2I2Y2MzNGYxMWQ2ZDA1MDlhMjliZTNjYWY5NzAgTQlNTgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAxNTg4NTg4MWVhNjkxMTUzNTFjMDliMzgzNzFmMDM0OGEzZmI4YzY3IEEJTkEKKzoxMDA2NDQgMDAwMDAwIGE0ZTE3OWU0MjkxZTU1MzZhNWUxYzgyZTA5MTA1Mjc3MmQyYzVhOTMgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECU5ECis6MTAwNjQ0IDEwMDY0NCBjOGYyNTc4MWU4ZjE3OTJlM2U0MGI3NDIyNWUyMDU1MzA0MWI1MjI2IGNkYjlhOGMzZGE1NzE1MDJhYzMwMjI1ZTljMTdiZWNjYjgzODc5ODMgTQlOTQorOjEwMDY0NCAxMDA2NDQgNGM4NmY5YTg1ZmJjNWU2ODA0ZWUyZTE3YTc5NzUzOGZiZTc4NWJjYSBjNGU0YTEyMjMxYjlmYTc5YTAwNTNjYjYwNzdmY2IyMWJiNWIxMzVhIE0JVFQKKzoxMDA2NDQgMTAwNjQ0IDhhY2I4ZTk3NTBlM2Y2NDRiZjMyM2ZjZjNkMzM4ODQ5ZGIxMDZjNzcgNmMwYjk5Mjg2ZDBiY2U1NTFhYzRhN2IzZGZmOGI3MDZlZGZmMzcxNSBNCVovQUEKKzoxMDA2NDQgMDAwMDAwIDA4NzQ5NDI2MjA4NGNlZmVlN2VkNDg0ZDIwYzhkYzA1ODA3OTEyNzIgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECVovQU4KKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgZDc3MzcxZDE1ODE3ZmNhYTU3ZWVlYzI3Zjc3MGM1MDViYTk3NGVjMSBBCVovRE0KKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgYmViNWQzOGM1NTI4M2QyODA2ODVlYTIxYTBlNTBjZmNjMGNhMDY0YSBBCVovRE4KKzoxMDA2NDQgMDAwMDAwIGE3OWFjM2JlOTM3NzYzOWUxYzdkMWVkZjFhZTFiM2E1ZjBjY2Q4YTkgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECVovTUQKKzoxMDA2NDQgMTAwNjQ0IDYxNDIyYmE5YzJjODczNDE2MDYxYTg4Y2Q0MGE1OWEzNWI1NzY0NzQgNjk3YWFkNzcxNWExZTczMDZjYTc2MjkwYTNkZDQyMDhmYmFlZGRmYSBNCVovTU0KKzoxMDA2NDQgMTAwNjQ0IGE1YzU0NGMyMWNmY2IwN2ViODBhNGQ4OWE1YjdkMTU3MDAwMmVkZmQgYjE2ZDdiMjViODY5ZjJiZWIxMjRlZmE1MzQ2N2Q4YTE1NTBhZDY5NCBNCVovTU4KKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgZDEyOTc5YzIyZmZmNjljNTljYTk0MDllN2E4ZmUzZWUyNWVhZWU4MCBBCVovTkEKKzoxMDA2NDQgMDAwMDAwIGExODM5M2M2MzZiOThlOWJkNzI5NmI4YjQzN2VhNDk5MmI3MjQ0MGMgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECVovTkQKKzoxMDA2NDQgMTAwNjQ0IDNmZGJlMTdmZDAxMzMwM2EyZTk4MWUxY2ExYzZjZDZlNzI3ODkwODcgN2UwOWQ2YTNhMTRiZDYzMDkxM2U4Yzc1NjkzY2VhMzIxNTdiNjA2ZCBNCVovTk0KK0VPRgorCit4NDA9J1swLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl0nCit4NDA9IiR4NDAkeDQwJHg0MCR4NDAkeDQwJHg0MCR4NDAkeDQwIgorejQwPScwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJworY21wX2RpZmZfZmlsZXNfb3V0cHV0ICgpIHsKKyAgICAjIGRpZmYtZmlsZXMgbmV2ZXIgcmVwb3J0cyBhZGRpdGlvbnMuICBBbHNvIGl0IGRvZXMgbm90IGZpbGwgaW4gdGhlCisgICAgIyBvYmplY3QgSUQgZm9yIHRoZSBjaGFuZ2VkIGZpbGVzIGJlY2F1c2UgaXQgd2FudHMgeW91IHRvIGxvb2sgYXQgdGhlCisgICAgIyBmaWxlc3lzdGVtLgorICAgIHNlZCA8IiQyIiA+LnRlc3QtdG1wIFwKKwktZSAnL146MDAwMDAwIC9kO3MvJyR4NDAnXCggW01DUk5EVV1bMC05XSpcKQkvJyR6NDAnXDEJLycgJiYKKyAgICBkaWZmICIkMSIgLnRlc3QtdG1wCit9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmLXRyZWUgb2Yga25vd24gdHJlZXMuJyBcCisgICAgJ2dpdCBkaWZmLXRyZWUgJHRyZWVfTyAkdHJlZV9BID4udGVzdC1hICYmCisgICAgIGNtcCAtcyAudGVzdC1hIC50ZXN0LXBsYWluLU9BJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi10cmVlIG9mIGtub3duIHRyZWVzLicgXAorICAgICdnaXQgZGlmZi10cmVlIC1yICR0cmVlX08gJHRyZWVfQSA+LnRlc3QtYSAmJgorICAgICBjbXAgLXMgLnRlc3QtYSAudGVzdC1yZWN1cnNpdmUtT0EnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmLXRyZWUgb2Yga25vd24gdHJlZXMuJyBcCisgICAgJ2dpdCBkaWZmLXRyZWUgJHRyZWVfTyAkdHJlZV9CID4udGVzdC1hICYmCisgICAgIGNtcCAtcyAudGVzdC1hIC50ZXN0LXBsYWluLU9CJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi10cmVlIG9mIGtub3duIHRyZWVzLicgXAorICAgICdnaXQgZGlmZi10cmVlIC1yICR0cmVlX08gJHRyZWVfQiA+LnRlc3QtYSAmJgorICAgICBjbXAgLXMgLnRlc3QtYSAudGVzdC1yZWN1cnNpdmUtT0InCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmLXRyZWUgb2Yga25vd24gdHJlZXMuJyBcCisgICAgJ2dpdCBkaWZmLXRyZWUgJHRyZWVfQSAkdHJlZV9CID4udGVzdC1hICYmCisgICAgIGNtcCAtcyAudGVzdC1hIC50ZXN0LXBsYWluLUFCJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi10cmVlIG9mIGtub3duIHRyZWVzLicgXAorICAgICdnaXQgZGlmZi10cmVlIC1yICR0cmVlX0EgJHRyZWVfQiA+LnRlc3QtYSAmJgorICAgICBjbXAgLXMgLnRlc3QtYSAudGVzdC1yZWN1cnNpdmUtQUInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmLWNhY2hlIE8gd2l0aCBBIGluIGNhY2hlJyBcCisgICAgJ2dpdCByZWFkLXRyZWUgJHRyZWVfQSAmJgorICAgICBnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCAkdHJlZV9PID4udGVzdC1hICYmCisgICAgIGNtcCAtcyAudGVzdC1hIC50ZXN0LXJlY3Vyc2l2ZS1PQScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYtY2FjaGUgTyB3aXRoIEIgaW4gY2FjaGUnIFwKKyAgICAnZ2l0IHJlYWQtdHJlZSAkdHJlZV9CICYmCisgICAgIGdpdCBkaWZmLWluZGV4IC0tY2FjaGVkICR0cmVlX08gPi50ZXN0LWEgJiYKKyAgICAgY21wIC1zIC50ZXN0LWEgLnRlc3QtcmVjdXJzaXZlLU9CJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi1jYWNoZSBBIHdpdGggQiBpbiBjYWNoZScgXAorICAgICdnaXQgcmVhZC10cmVlICR0cmVlX0IgJiYKKyAgICAgZ2l0IGRpZmYtaW5kZXggLS1jYWNoZWQgJHRyZWVfQSA+LnRlc3QtYSAmJgorICAgICBjbXAgLXMgLnRlc3QtYSAudGVzdC1yZWN1cnNpdmUtQUInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmLWZpbGVzIHdpdGggTyBpbiBjYWNoZSBhbmQgQSBjaGVja2VkIG91dCcgXAorICAgICdybSAtZnIgWiBbQS1aXVtBLVpdICYmCisgICAgIGdpdCByZWFkLXRyZWUgJHRyZWVfQSAmJgorICAgICBnaXQgY2hlY2tvdXQtaW5kZXggLWYgLWEgJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAtLXJlc2V0ICR0cmVlX08gfHwgcmV0dXJuIDEKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLXJlZnJlc2ggPi9kZXYvbnVsbCA7IyB0aGlzIGNhbiBleGl0IG5vbi16ZXJvCisgICAgIGdpdCBkaWZmLWZpbGVzID4udGVzdC1hICYmCisgICAgIGNtcF9kaWZmX2ZpbGVzX291dHB1dCAudGVzdC1hIC50ZXN0LXJlY3Vyc2l2ZS1PQScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYtZmlsZXMgd2l0aCBPIGluIGNhY2hlIGFuZCBCIGNoZWNrZWQgb3V0JyBcCisgICAgJ3JtIC1mciBaIFtBLVpdW0EtWl0gJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAkdHJlZV9CICYmCisgICAgIGdpdCBjaGVja291dC1pbmRleCAtZiAtYSAmJgorICAgICBnaXQgcmVhZC10cmVlIC0tcmVzZXQgJHRyZWVfTyB8fCByZXR1cm4gMQorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tcmVmcmVzaCA+L2Rldi9udWxsIDsjIHRoaXMgY2FuIGV4aXQgbm9uLXplcm8KKyAgICAgZ2l0IGRpZmYtZmlsZXMgPi50ZXN0LWEgJiYKKyAgICAgY21wX2RpZmZfZmlsZXNfb3V0cHV0IC50ZXN0LWEgLnRlc3QtcmVjdXJzaXZlLU9CJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi1maWxlcyB3aXRoIEEgaW4gY2FjaGUgYW5kIEIgY2hlY2tlZCBvdXQnIFwKKyAgICAncm0gLWZyIFogW0EtWl1bQS1aXSAmJgorICAgICBnaXQgcmVhZC10cmVlICR0cmVlX0IgJiYKKyAgICAgZ2l0IGNoZWNrb3V0LWluZGV4IC1mIC1hICYmCisgICAgIGdpdCByZWFkLXRyZWUgLS1yZXNldCAkdHJlZV9BIHx8IHJldHVybiAxCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1yZWZyZXNoID4vZGV2L251bGwgOyMgdGhpcyBjYW4gZXhpdCBub24temVybworICAgICBnaXQgZGlmZi1maWxlcyA+LnRlc3QtYSAmJgorICAgICBjbXBfZGlmZl9maWxlc19vdXRwdXQgLnRlc3QtYSAudGVzdC1yZWN1cnNpdmUtQUInCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTm93IHdlIGhhdmUgZXN0YWJsaXNoZWQgdGhlIGJhc2VsaW5lLCB3ZSBkbyBub3QgaGF2ZSB0bworIyByZWx5IG9uIGluZGl2aWR1YWwgb2JqZWN0IElEIHZhbHVlcyB0aGF0IG11Y2guCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmLXRyZWUgTyBBID09IGRpZmYtdHJlZSAtUiBBIE8nIFwKKyAgICAnZ2l0IGRpZmYtdHJlZSAkdHJlZV9PICR0cmVlX0EgPi50ZXN0LWEgJiYKKyAgICBnaXQgZGlmZi10cmVlIC1SICR0cmVlX0EgJHRyZWVfTyA+LnRlc3QtYiAmJgorICAgIGNtcCAtcyAudGVzdC1hIC50ZXN0LWInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmLXRyZWUgLXIgTyBBID09IGRpZmYtdHJlZSAtciAtUiBBIE8nIFwKKyAgICAnZ2l0IGRpZmYtdHJlZSAtciAkdHJlZV9PICR0cmVlX0EgPi50ZXN0LWEgJiYKKyAgICBnaXQgZGlmZi10cmVlIC1yIC1SICR0cmVlX0EgJHRyZWVfTyA+LnRlc3QtYiAmJgorICAgIGNtcCAtcyAudGVzdC1hIC50ZXN0LWInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmLXRyZWUgQiBBID09IGRpZmYtdHJlZSAtUiBBIEInIFwKKyAgICAnZ2l0IGRpZmYtdHJlZSAkdHJlZV9CICR0cmVlX0EgPi50ZXN0LWEgJiYKKyAgICBnaXQgZGlmZi10cmVlIC1SICR0cmVlX0EgJHRyZWVfQiA+LnRlc3QtYiAmJgorICAgIGNtcCAtcyAudGVzdC1hIC50ZXN0LWInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmLXRyZWUgLXIgQiBBID09IGRpZmYtdHJlZSAtciAtUiBBIEInIFwKKyAgICAnZ2l0IGRpZmYtdHJlZSAtciAkdHJlZV9CICR0cmVlX0EgPi50ZXN0LWEgJiYKKyAgICBnaXQgZGlmZi10cmVlIC1yIC1SICR0cmVlX0EgJHRyZWVfQiA+LnRlc3QtYiAmJgorICAgIGNtcCAtcyAudGVzdC1hIC50ZXN0LWInCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAwMy1kaWZmLXJlbmFtZS0xLnNoIGIvdC90NDAwMy1kaWZmLXJlbmFtZS0xLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhiMWY4NzUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDAzLWRpZmYtcmVuYW1lLTEuc2gKQEAgLTAsMCArMSwxMjggQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nTW9yZSByZW5hbWUgZGV0ZWN0aW9uCisKKycKKy4gLi90ZXN0LWxpYi5zaAorLiAuLi9kaWZmLWxpYi5zaCA7IyB0ZXN0LWxpYiBjaGRpcidzIGludG8gdHJhc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgcmVmZXJlbmNlIHRyZWUnIFwKKyAgICAnY2F0IC4uLy4uL0NPUFlJTkcgPkNPUFlJTkcgJiYKKyAgICAgZWNobyBmcm90eiA+cmV6cm92ICYmCisgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBDT1BZSU5HIHJlenJvdiAmJgorICAgIHRyZWU9JChnaXQgd3JpdGUtdHJlZSkgJiYKKyAgICBlY2hvICR0cmVlJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSB3b3JrIHRyZWUnIFwKKyAgICAnc2VkIC1lICdzL0hPV0VWRVIvSG93ZXZlci8nIDxDT1BZSU5HID5DT1BZSU5HLjEgJiYKKyAgICBzZWQgLWUgJ3MvR1BML0cuUC5ML2cnIDxDT1BZSU5HID5DT1BZSU5HLjIgJiYKKyAgICBybSAtZiBDT1BZSU5HICYmCisgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBDT1BZSU5HIENPUFlJTkcuPycKKworIyB0cmVlIGhhcyBDT1BZSU5HIGFuZCByZXpyb3YuICB3b3JrIHRyZWUgaGFzIENPUFlJTkcuMSBhbmQgQ09QWUlORy4yLAorIyBib3RoIGFyZSBzbGlnaHRseSBlZGl0ZWQsIGFuZCB1bmNoYW5nZWQgcmV6cm92LiAgU28gd2Ugc2F5IHlvdQorIyBjb3B5LWFuZC1lZGl0IG9uZSwgYW5kIHJlbmFtZS1hbmQtZWRpdCB0aGUgb3RoZXIuICBXZSBkbyBub3Qgc2F5CisjIGFueXRoaW5nIGFib3V0IHJlenJvdi4KKworR0lUX0RJRkZfT1BUUz0tLXVuaWZpZWQ9MCBnaXQgZGlmZi1pbmRleCAtTSAtcCAkdHJlZSA+Y3VycmVudAorY2F0ID5leHBlY3RlZCA8PFxFT0YKK2RpZmYgLS1naXQgYS9DT1BZSU5HIGIvQ09QWUlORy4xCitjb3B5IGZyb20gQ09QWUlORworY29weSB0byBDT1BZSU5HLjEKKy0tLSBhL0NPUFlJTkcKKysrKyBiL0NPUFlJTkcuMQorQEAgLTYgKzYgQEAKKy0gSE9XRVZFUiwgaW4gb3JkZXIgdG8gYWxsb3cgYSBtaWdyYXRpb24gdG8gR1BMdjMgaWYgdGhhdCBzZWVtcyBsaWtlCisrIEhvd2V2ZXIsIGluIG9yZGVyIHRvIGFsbG93IGEgbWlncmF0aW9uIHRvIEdQTHYzIGlmIHRoYXQgc2VlbXMgbGlrZQorZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9DT1BZSU5HLjIKK3JlbmFtZSBmcm9tIENPUFlJTkcKK3JlbmFtZSB0byBDT1BZSU5HLjIKKy0tLSBhL0NPUFlJTkcKKysrKyBiL0NPUFlJTkcuMgorQEAgLTIgKzIgQEAKKy0gTm90ZSB0aGF0IHRoZSBvbmx5IHZhbGlkIHZlcnNpb24gb2YgdGhlIEdQTCBhcyBmYXIgYXMgdGhpcyBwcm9qZWN0CisrIE5vdGUgdGhhdCB0aGUgb25seSB2YWxpZCB2ZXJzaW9uIG9mIHRoZSBHLlAuTCBhcyBmYXIgYXMgdGhpcyBwcm9qZWN0CitAQCAtNiArNiBAQAorLSBIT1dFVkVSLCBpbiBvcmRlciB0byBhbGxvdyBhIG1pZ3JhdGlvbiB0byBHUEx2MyBpZiB0aGF0IHNlZW1zIGxpa2UKKysgSE9XRVZFUiwgaW4gb3JkZXIgdG8gYWxsb3cgYSBtaWdyYXRpb24gdG8gRy5QLkx2MyBpZiB0aGF0IHNlZW1zIGxpa2UKK0BAIC0xMiArMTIgQEAKKy0JVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwgdjIsIG9yIGEgbGF0ZXIgdmVyc2lvbgorKwlUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEcuUC5MIHYyLCBvciBhIGxhdGVyIHZlcnNpb24KK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgb3V0cHV0IGZyb20gcmVuYW1lL2NvcHkgZGV0ZWN0aW9uICgjMSknIFwKKyAgICAnY29tcGFyZV9kaWZmX3BhdGNoIGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHdvcmsgdHJlZSBhZ2FpbicgXAorICAgICdtdiBDT1BZSU5HLjIgQ09QWUlORyAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIENPUFlJTkcgQ09QWUlORy4xIENPUFlJTkcuMicKKworIyB0cmVlIGhhcyBDT1BZSU5HIGFuZCByZXpyb3YuICB3b3JrIHRyZWUgaGFzIENPUFlJTkcgYW5kIENPUFlJTkcuMSwKKyMgYm90aCBhcmUgc2xpZ2h0bHkgZWRpdGVkLCBhbmQgdW5jaGFuZ2VkIHJlenJvdi4gIFNvIHdlIHNheSB5b3UKKyMgZWRpdGVkIG9uZSwgYW5kIGNvcHktYW5kLWVkaXQgdGhlIG90aGVyLiAgV2UgZG8gbm90IHNheQorIyBhbnl0aGluZyBhYm91dCByZXpyb3YuCisKK0dJVF9ESUZGX09QVFM9LS11bmlmaWVkPTAgZ2l0IGRpZmYtaW5kZXggLUMgLXAgJHRyZWUgPmN1cnJlbnQKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCitkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL0NPUFlJTkcKKy0tLSBhL0NPUFlJTkcKKysrKyBiL0NPUFlJTkcKK0BAIC0yICsyIEBACistIE5vdGUgdGhhdCB0aGUgb25seSB2YWxpZCB2ZXJzaW9uIG9mIHRoZSBHUEwgYXMgZmFyIGFzIHRoaXMgcHJvamVjdAorKyBOb3RlIHRoYXQgdGhlIG9ubHkgdmFsaWQgdmVyc2lvbiBvZiB0aGUgRy5QLkwgYXMgZmFyIGFzIHRoaXMgcHJvamVjdAorQEAgLTYgKzYgQEAKKy0gSE9XRVZFUiwgaW4gb3JkZXIgdG8gYWxsb3cgYSBtaWdyYXRpb24gdG8gR1BMdjMgaWYgdGhhdCBzZWVtcyBsaWtlCisrIEhPV0VWRVIsIGluIG9yZGVyIHRvIGFsbG93IGEgbWlncmF0aW9uIHRvIEcuUC5MdjMgaWYgdGhhdCBzZWVtcyBsaWtlCitAQCAtMTIgKzEyIEBACistCVRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMIHYyLCBvciBhIGxhdGVyIHZlcnNpb24KKysJVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHLlAuTCB2Miwgb3IgYSBsYXRlciB2ZXJzaW9uCitkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL0NPUFlJTkcuMQorY29weSBmcm9tIENPUFlJTkcKK2NvcHkgdG8gQ09QWUlORy4xCistLS0gYS9DT1BZSU5HCisrKysgYi9DT1BZSU5HLjEKK0BAIC02ICs2IEBACistIEhPV0VWRVIsIGluIG9yZGVyIHRvIGFsbG93IGEgbWlncmF0aW9uIHRvIEdQTHYzIGlmIHRoYXQgc2VlbXMgbGlrZQorKyBIb3dldmVyLCBpbiBvcmRlciB0byBhbGxvdyBhIG1pZ3JhdGlvbiB0byBHUEx2MyBpZiB0aGF0IHNlZW1zIGxpa2UKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgb3V0cHV0IGZyb20gcmVuYW1lL2NvcHkgZGV0ZWN0aW9uICgjMiknIFwKKyAgICAnY29tcGFyZV9kaWZmX3BhdGNoIGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHdvcmsgdHJlZSBvbmNlIGFnYWluJyBcCisgICAgJ2NhdCAuLi8uLi9DT1BZSU5HID5DT1BZSU5HICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgQ09QWUlORyBDT1BZSU5HLjEnCisKKyMgdHJlZSBoYXMgQ09QWUlORyBhbmQgcmV6cm92LiAgd29yayB0cmVlIGhhcyBDT1BZSU5HIGFuZCBDT1BZSU5HLjEsCisjIGJ1dCBDT1BZSU5HIGlzIG5vdCBlZGl0ZWQuICBXZSBzYXkgeW91IGNvcHktYW5kLWVkaXQgQ09QWUlORy4xOyB0aGlzCisjIGlzIG9ubHkgcG9zc2libGUgYmVjYXVzZSAtQyBtb2RlIG5vdyByZXBvcnRzIHRoZSB1bm1vZGlmaWVkIGZpbGUgdG8KKyMgdGhlIGRpZmYtY29yZS4gIFVuY2hhbmdlZCByZXpyb3YsIGFsdGhvdWdoIGJlaW5nIGZlZCB0bworIyBnaXQgZGlmZi1pbmRleCBhcyB3ZWxsLCBzaG91bGQgbm90IGJlIG1lbnRpb25lZC4KKworR0lUX0RJRkZfT1BUUz0tLXVuaWZpZWQ9MCBcCisgICAgZ2l0IGRpZmYtaW5kZXggLUMgLS1maW5kLWNvcGllcy1oYXJkZXIgLXAgJHRyZWUgPmN1cnJlbnQKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCitkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL0NPUFlJTkcuMQorY29weSBmcm9tIENPUFlJTkcKK2NvcHkgdG8gQ09QWUlORy4xCistLS0gYS9DT1BZSU5HCisrKysgYi9DT1BZSU5HLjEKK0BAIC02ICs2IEBACistIEhPV0VWRVIsIGluIG9yZGVyIHRvIGFsbG93IGEgbWlncmF0aW9uIHRvIEdQTHYzIGlmIHRoYXQgc2VlbXMgbGlrZQorKyBIb3dldmVyLCBpbiBvcmRlciB0byBhbGxvdyBhIG1pZ3JhdGlvbiB0byBHUEx2MyBpZiB0aGF0IHNlZW1zIGxpa2UKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgb3V0cHV0IGZyb20gcmVuYW1lL2NvcHkgZGV0ZWN0aW9uICgjMyknIFwKKyAgICAnY29tcGFyZV9kaWZmX3BhdGNoIGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAwNC1kaWZmLXJlbmFtZS1zeW1saW5rLnNoIGIvdC90NDAwNC1kaWZmLXJlbmFtZS1zeW1saW5rLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNkMjViZTcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDA0LWRpZmYtcmVuYW1lLXN5bWxpbmsuc2gKQEAgLTAsMCArMSw2NyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdNb3JlIHJlbmFtZSBkZXRlY3Rpb24gdGVzdHMuCisKK1RoZSByZW5hbWUgZGV0ZWN0aW9uIGxvZ2ljIHNob3VsZCBiZSBhYmxlIHRvIGRldGVjdCBwdXJlIHJlbmFtZSBvcgorY29weSBvZiBzeW1ib2xpYyBsaW5rcywgYnV0IHNob3VsZCBub3QgcHJvZHVjZSByZW5hbWUvY29weSBmb2xsb3dlZAorYnkgYW4gZWRpdCBmb3IgdGhlbS4KKycKKy4gLi90ZXN0LWxpYi5zaAorLiAuLi9kaWZmLWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSByZWZlcmVuY2UgdHJlZScgXAorICAgICdlY2hvIHh5enp5IHwgdHIgLWQgJ1xcXFwnMDEyID55b21pbiAmJgorICAgICBsbiAtcyB4eXp6eSBmcm90eiAmJgorICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgZnJvdHogeW9taW4gJiYKKyAgICB0cmVlPSQoZ2l0IHdyaXRlLXRyZWUpICYmCisgICAgZWNobyAkdHJlZScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgd29yayB0cmVlJyBcCisgICAgJ212IGZyb3R6IHJlenJvdiAmJgorICAgICBybSAtZiB5b21pbiAmJgorICAgICBsbiAtcyB4eXp6eSBuaXRmb2wgJiYKKyAgICAgbG4gLXMgeHp6enkgYm96YmFyICYmCisgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBmcm90eiByZXpyb3Ygbml0Zm9sIGJvemJhciB5b21pbicKKworIyB0cmVlIGhhcyBmcm90eiBwb2ludGluZyBhdCB4eXp6eSwgYW5kIHlvbWluIHRoYXQgY29udGFpbnMgeHl6enkgdG8KKyMgY29uZnVzZSB0aGluZ3MuICB3b3JrIHRyZWUgaGFzIHJlenJvdiAoeHl6enkpIG5pdGZvbCAoeHl6enkpIGFuZAorIyBib3piYXIgKHh6enp5KS4KKyMgcmV6cm92IGFuZCBuaXRmb2wgYXJlIHJlbmFtZS9jb3B5IG9mIGZyb3R6IGFuZCBib3piYXIgc2hvdWxkIGJlCisjIGEgbmV3IGNyZWF0aW9uLgorCitHSVRfRElGRl9PUFRTPS0tdW5pZmllZD0wIGdpdCBkaWZmLWluZGV4IC1NIC1wICR0cmVlID5jdXJyZW50CitjYXQgPmV4cGVjdGVkIDw8XEVPRgorZGlmZiAtLWdpdCBhL2JvemJhciBiL2JvemJhcgorbmV3IGZpbGUgbW9kZSAxMjAwMDAKKy0tLSAvZGV2L251bGwKKysrKyBiL2JvemJhcgorQEAgLTAsMCArMSBAQAorK3h6enp5CitcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2RpZmYgLS1naXQgYS9mcm90eiBiL25pdGZvbAorc2ltaWxhcml0eSBpbmRleCAxMDAlCitjb3B5IGZyb20gZnJvdHoKK2NvcHkgdG8gbml0Zm9sCitkaWZmIC0tZ2l0IGEvZnJvdHogYi9yZXpyb3YKK3NpbWlsYXJpdHkgaW5kZXggMTAwJQorcmVuYW1lIGZyb20gZnJvdHoKK3JlbmFtZSB0byByZXpyb3YKK2RpZmYgLS1naXQgYS95b21pbiBiL3lvbWluCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKKy0tLSBhL3lvbWluCisrKysgL2Rldi9udWxsCitAQCAtMSArMCwwIEBACisteHl6enkKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBkaWZmIG91dHB1dCcgXAorICAgICdjb21wYXJlX2RpZmZfcGF0Y2ggY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MDA1LWRpZmYtcmVuYW1lLTIuc2ggYi90L3Q0MDA1LWRpZmYtcmVuYW1lLTIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjYzMDAxNwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMDUtZGlmZi1yZW5hbWUtMi5zaApAQCAtMCwwICsxLDg2IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1NhbWUgcmVuYW1lIGRldGVjdGlvbiBhcyB0NDAwMyBidXQgdGVzdGluZyBkaWZmLXJhdy4KKworJworLiAuL3Rlc3QtbGliLnNoCisuIC4uL2RpZmYtbGliLnNoIDsjIHRlc3QtbGliIGNoZGlyJ3MgaW50byB0cmFzaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSByZWZlcmVuY2UgdHJlZScgXAorICAgICdjYXQgLi4vLi4vQ09QWUlORyA+Q09QWUlORyAmJgorICAgICBlY2hvIGZyb3R6ID5yZXpyb3YgJiYKKyAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIENPUFlJTkcgcmV6cm92ICYmCisgICAgdHJlZT0kKGdpdCB3cml0ZS10cmVlKSAmJgorICAgIGVjaG8gJHRyZWUnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHdvcmsgdHJlZScgXAorICAgICdzZWQgLWUgJ3MvSE9XRVZFUi9Ib3dldmVyLycgPENPUFlJTkcgPkNPUFlJTkcuMSAmJgorICAgIHNlZCAtZSAncy9HUEwvRy5QLkwvZycgPENPUFlJTkcgPkNPUFlJTkcuMiAmJgorICAgIHJtIC1mIENPUFlJTkcgJiYKKyAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIENPUFlJTkcgQ09QWUlORy4/JworCisjIHRyZWUgaGFzIENPUFlJTkcgYW5kIHJlenJvdi4gIHdvcmsgdHJlZSBoYXMgQ09QWUlORy4xIGFuZCBDT1BZSU5HLjIsCisjIGJvdGggYXJlIHNsaWdodGx5IGVkaXRlZCwgYW5kIHVuY2hhbmdlZCByZXpyb3YuICBXZSBzYXkgQ09QWUlORy4xCisjIGFuZCBDT1BZSU5HLjIgYXJlIGJhc2VkIG9uIENPUFlJTkcsIGFuZCBkbyBub3Qgc2F5IGFueXRoaW5nIGFib3V0CisjIHJlenJvdi4KKworZ2l0IGRpZmYtaW5kZXggLU0gJHRyZWUgPmN1cnJlbnQKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgMDYwM2IzMjM4YTA3NmRjNmM4MDIyYWVkYzY2NDhmYTUyM2ExNzE3OCBDMTIzNAlDT1BZSU5HCUNPUFlJTkcuMQorOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyAwNmM2Nzk2MWJiYWVkMzRhMTI3Zjc2ZDI2MWY0YzBiZjczZWRhNDcxIFIxMjM0CUNPUFlJTkcJQ09QWUlORy4yCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG91dHB1dCBmcm9tIHJlbmFtZS9jb3B5IGRldGVjdGlvbiAoIzEpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXcgY3VycmVudCBleHBlY3RlZCcKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSB3b3JrIHRyZWUgYWdhaW4nIFwKKyAgICAnbXYgQ09QWUlORy4yIENPUFlJTkcgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBDT1BZSU5HIENPUFlJTkcuMSBDT1BZSU5HLjInCisKKyMgdHJlZSBoYXMgQ09QWUlORyBhbmQgcmV6cm92LiAgd29yayB0cmVlIGhhcyBDT1BZSU5HIGFuZCBDT1BZSU5HLjEsCisjIGJvdGggYXJlIHNsaWdodGx5IGVkaXRlZCwgYW5kIHVuY2hhbmdlZCByZXpyb3YuICBXZSBzYXkgQ09QWUlORy4xCisjIGlzIGJhc2VkIG9uIENPUFlJTkcgYW5kIENPUFlJTkcgaXMgc3RpbGwgdGhlcmUsIGFuZCBkbyBub3Qgc2F5IGFueXRoaW5nCisjIGFib3V0IHJlenJvdi4KKworZ2l0IGRpZmYtaW5kZXggLUMgJHRyZWUgPmN1cnJlbnQKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIDA2YzY3OTYxYmJhZWQzNGExMjdmNzZkMjYxZjRjMGJmNzNlZGE0NzEgTQlDT1BZSU5HCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIDA2MDNiMzIzOGEwNzZkYzZjODAyMmFlZGM2NjQ4ZmE1MjNhMTcxNzggQzEyMzQJQ09QWUlORwlDT1BZSU5HLjEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgb3V0cHV0IGZyb20gcmVuYW1lL2NvcHkgZGV0ZWN0aW9uICgjMiknIFwKKyAgICAnY29tcGFyZV9kaWZmX3JhdyBjdXJyZW50IGV4cGVjdGVkJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgdHJlZSBoYXMgQ09QWUlORyBhbmQgcmV6cm92LiAgd29yayB0cmVlIGhhcyB0aGUgc2FtZSBDT1BZSU5HIGFuZAorIyBjb3B5LWVkaXRlZCBDT1BZSU5HLjEsIGFuZCB1bmNoYW5nZWQgcmV6cm92LiAgV2Ugc2hvdWxkIG5vdCBzYXkKKyMgYW55dGhpbmcgYWJvdXQgcmV6cm92IG5vciBDT1BZSU5HLCBzaW5jZSB0aGUgcmV2aXNlZCBhZ2FpbiBkaWZmLXJhdworIyBub3dzIGhvdyB0byBzYXkgQ29weS4KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgd29yayB0cmVlIG9uY2UgYWdhaW4nIFwKKyAgICAnY2F0IC4uLy4uL0NPUFlJTkcgPkNPUFlJTkcgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBDT1BZSU5HIENPUFlJTkcuMScKKworZ2l0IGRpZmYtaW5kZXggLUMgLS1maW5kLWNvcGllcy1oYXJkZXIgJHRyZWUgPmN1cnJlbnQKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIDA2MDNiMzIzOGEwNzZkYzZjODAyMmFlZGM2NjQ4ZmE1MjNhMTcxNzggQzEyMzQJQ09QWUlORwlDT1BZSU5HLjEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgb3V0cHV0IGZyb20gcmVuYW1lL2NvcHkgZGV0ZWN0aW9uICgjMyknIFwKKyAgICAnY29tcGFyZV9kaWZmX3JhdyBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMDYtZGlmZi1tb2RlLnNoIGIvdC90NDAwNi1kaWZmLW1vZGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWI1NDA2ZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMDYtZGlmZi1tb2RlLnNoCkBAIC0wLDAgKzEsNDMgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdCBtb2RlIGNoYW5nZSBkaWZmcy4KKworJworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzZXR1cCcgXAorICAgICdlY2hvIGZyb3R6ID5yZXpyb3YgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCByZXpyb3YgJiYKKyAgICAgdHJlZT1gZ2l0IHdyaXRlLXRyZWVgICYmCisgICAgIGVjaG8gJHRyZWUnCisKK2lmIFsgIiQoZ2l0IGNvbmZpZyAtLWdldCBjb3JlLmZpbGVtb2RlKSIgPSBmYWxzZSBdCit0aGVuCisJc2F5ICdmaWxlbW9kZSBkaXNhYmxlZCBvbiB0aGUgZmlsZXN5c3RlbSwgdXNpbmcgdXBkYXRlLWluZGV4IC0tY2htb2Q9K3gnCisJdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJICAgICdnaXQgdXBkYXRlLWluZGV4IC0tY2htb2Q9K3gnIFwKKwkgICAgJ2dpdCB1cGRhdGUtaW5kZXggcmV6cm92ICYmCisJICAgICBnaXQgdXBkYXRlLWluZGV4IC0tY2htb2Q9K3ggcmV6cm92ICYmCisJICAgICBnaXQgZGlmZi1pbmRleCAkdHJlZSA+Y3VycmVudCcKK2Vsc2UKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkgICAgJ2NobW9kJyBcCisJICAgICdjaG1vZCAreCByZXpyb3YgJiYKKwkgICAgIGdpdCB1cGRhdGUtaW5kZXggcmV6cm92ICYmCisJICAgICBnaXQgZGlmZi1pbmRleCAkdHJlZSA+Y3VycmVudCcKK2ZpCisKK194NDA9J1swLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl0nCitfeDQwPSIkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwIgorc2VkIC1lICdzL1woOjEwMDY0NCAxMDA3NTVcKSBcKCciJF94NDAiJ1wpIFwyIC9cMSBYIFggLycgPGN1cnJlbnQgPmNoZWNrCitlY2hvICI6MTAwNjQ0IDEwMDc1NSBYIFggTQlyZXpyb3YiID5leHBlY3RlZAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmVyaWZ5JyBcCisgICAgJ2dpdCBkaWZmIGV4cGVjdGVkIGNoZWNrJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMDctcmVuYW1lLTMuc2ggYi90L3Q0MDA3LXJlbmFtZS0zLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEwNGE0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDA3LXJlbmFtZS0zLnNoCkBAIC0wLDAgKzEsOTAgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nUmVuYW1lIGludGVyYWN0aW9uIHdpdGggcGF0aHNwZWMuCisKKycKKy4gLi90ZXN0LWxpYi5zaAorLiAuLi9kaWZmLWxpYi5zaCA7IyB0ZXN0LWxpYiBjaGRpcidzIGludG8gdHJhc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgcmVmZXJlbmNlIHRyZWUnIFwKKyAgICAnbWtkaXIgcGF0aDAgcGF0aDEgJiYKKyAgICAgY3AgLi4vLi4vQ09QWUlORyBwYXRoMC9DT1BZSU5HICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAvQ09QWUlORyAmJgorICAgIHRyZWU9JChnaXQgd3JpdGUtdHJlZSkgJiYKKyAgICBlY2hvICR0cmVlJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSB3b3JrIHRyZWUnIFwKKyAgICAnY3AgcGF0aDAvQ09QWUlORyBwYXRoMS9DT1BZSU5HICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgcGF0aDAvQ09QWUlORyBwYXRoMS9DT1BZSU5HJworCisjIEluIHRoZSB0cmVlLCB0aGVyZSBpcyBvbmx5IHBhdGgwL0NPUFlJTkcuICBJbiB0aGUgY2FjaGUsIHBhdGgwIGFuZAorIyBwYXRoMSBib3RoIGhhdmUgQ09QWUlORyBhbmQgdGhlIGxhdHRlciBpcyBhIGNvcHkgb2YgcGF0aDAvQ09QWUlORy4KKyMgQ29tcGFyaW5nIHRoZSBmdWxsIHRyZWUgd2l0aCBjYWNoZSBzaG91bGQgdGVsbCB1cyBzby4KKworZ2l0IGRpZmYtaW5kZXggLUMgLS1maW5kLWNvcGllcy1oYXJkZXIgJHRyZWUgPmN1cnJlbnQKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyBDMTAwCXBhdGgwL0NPUFlJTkcJcGF0aDEvQ09QWUlORworRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSB0aGUgcmVzdWx0ICgjMSknIFwKKyAgICAnY29tcGFyZV9kaWZmX3JhdyBjdXJyZW50IGV4cGVjdGVkJworCisjIEluIHRoZSB0cmVlLCB0aGVyZSBpcyBvbmx5IHBhdGgwL0NPUFlJTkcuICBJbiB0aGUgY2FjaGUsIHBhdGgwIGFuZAorIyBwYXRoMSBib3RoIGhhdmUgQ09QWUlORyBhbmQgdGhlIGxhdHRlciBpcyBhIGNvcHkgb2YgcGF0aDAvQ09QWUlORy4KKyMgSG93ZXZlciB3aGVuIHdlIHNheSB3ZSBjYXJlIG9ubHkgYWJvdXQgcGF0aDEsIHdlIHNob3VsZCBqdXN0IHNlZQorIyBwYXRoMS9DT1BZSU5HIHN1ZGRlbmx5IGFwcGVhcmluZyBmcm9tIG5vd2hlcmUsIG5vdCBkZXRlY3RlZCBhcworIyBhIGNvcHkgZnJvbSBwYXRoMC9DT1BZSU5HLgorCitnaXQgZGlmZi1pbmRleCAtQyAkdHJlZSBwYXRoMSA+Y3VycmVudAorCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIEEJcGF0aDEvQ09QWUlORworRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSB0aGUgcmVzdWx0ICgjMiknIFwKKyAgICAnY29tcGFyZV9kaWZmX3JhdyBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndHdlYWsgd29yayB0cmVlJyBcCisgICAgJ3JtIC1mIHBhdGgwL0NPUFlJTkcgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLXJlbW92ZSBwYXRoMC9DT1BZSU5HJworCisjIEluIHRoZSB0cmVlLCB0aGVyZSBpcyBvbmx5IHBhdGgwL0NPUFlJTkcuICBJbiB0aGUgY2FjaGUsIHBhdGgwIGRvZXMKKyMgbm90IGhhdmUgQ09QWUlORyBhbnltb3JlIGFuZCBwYXRoMSBoYXMgQ09QWUlORyB3aGljaCBpcyBhIGNvcHkgb2YKKyMgcGF0aDAvQ09QWUlORy4gIFNob3dpbmcgdGhlIGZ1bGwgdHJlZSB3aXRoIGNhY2hlIHNob3VsZCB0ZWxsIHVzIGFib3V0CisjIHRoZSByZW5hbWUuCisKK2dpdCBkaWZmLWluZGV4IC1DICR0cmVlID5jdXJyZW50CisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgUjEwMAlwYXRoMC9DT1BZSU5HCXBhdGgxL0NPUFlJTkcKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgdGhlIHJlc3VsdCAoIzMpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXcgY3VycmVudCBleHBlY3RlZCcKKworIyBJbiB0aGUgdHJlZSwgdGhlcmUgaXMgb25seSBwYXRoMC9DT1BZSU5HLiAgSW4gdGhlIGNhY2hlLCBwYXRoMCBkb2VzCisjIG5vdCBoYXZlIENPUFlJTkcgYW55bW9yZSBhbmQgcGF0aDEgaGFzIENPUFlJTkcgd2hpY2ggaXMgYSBjb3B5IG9mCisjIHBhdGgwL0NPUFlJTkcuICBXaGVuIHdlIHNheSB3ZSBjYXJlIG9ubHkgYWJvdXQgcGF0aDEsIHdlIHNob3VsZCBqdXN0CisjIHNlZSBwYXRoMS9DT1BZSU5HIGFwcGVhcmluZyBmcm9tIG5vd2hlcmUuCisKK2dpdCBkaWZmLWluZGV4IC1DICR0cmVlIHBhdGgxID5jdXJyZW50CisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgQQlwYXRoMS9DT1BZSU5HCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIHRoZSByZXN1bHQgKCM0KScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3IGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAwOC1kaWZmLWJyZWFrLXJld3JpdGUuc2ggYi90L3Q0MDA4LWRpZmYtYnJlYWstcmV3cml0ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNmMyZTRhCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAwOC1kaWZmLWJyZWFrLXJld3JpdGUuc2gKQEAgLTAsMCArMSwxODggQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nQnJlYWsgYW5kIHRoZW4gcmVuYW1lCisKK1dlIGhhdmUgdHdvIHZlcnkgZGlmZmVyZW50IGZpbGVzLCBmaWxlMCBhbmQgZmlsZTEsIHJlZ2lzdGVyZWQgaW4gYSB0cmVlLgorCitXZSB1cGRhdGUgZmlsZTEgc28gZHJhc3RpY2FsbHkgdGhhdCBpdCBpcyBtb3JlIHNpbWlsYXIgdG8gZmlsZTAsIGFuZAordGhlbiByZW1vdmUgZmlsZTAuICBXaXRoIC1CLCBjaGFuZ2VzIHRvIGZpbGUxIHNob3VsZCBiZSBicm9rZW4gaW50bworc2VwYXJhdGUgZGVsZXRlIGFuZCBjcmVhdGUsIHJlc3VsdGluZyBpbiByZW1vdmFsIG9mIGZpbGUwLCByZW1vdmFsIG9mCitvcmlnaW5hbCBmaWxlMSBhbmQgY3JlYXRpb24gb2YgY29tcGxldGVseSByZXdyaXR0ZW4gZmlsZTEuCisKK0Z1cnRoZXIsIHdpdGggLUIgYW5kIC1NIHRvZ2V0aGVyLCB0aGVzZSB0aHJlZSBtb2RpZmljYXRpb25zIHNob3VsZAordHVybiBpbnRvIHJlbmFtZS1lZGl0IG9mIGZpbGUwIGludG8gZmlsZTEuCisKK1N0YXJ0aW5nIGZyb20gdGhlIHNhbWUgdHdvIGZpbGVzIGluIHRoZSB0cmVlLCB3ZSBzd2FwIGZpbGUwIGFuZCBmaWxlMS4KK1dpdGggLUIsIHRoaXMgc2hvdWxkIGJlIGRldGVjdGVkIGFzIHR3byBjb21wbGV0ZSByZXdyaXRlcywgcmVzdWx0aW5nIGluCitmb3VyIGNoYW5nZXMgaW4gdG90YWwuCisKK0Z1cnRoZXIsIHdpdGggLUIgYW5kIC1NIHRvZ2V0aGVyLCB0aGVzZSBzaG91bGQgdHVybiBpbnRvIHR3byByZW5hbWVzLgorJworLiAuL3Rlc3QtbGliLnNoCisuIC4uL2RpZmYtbGliLnNoIDsjIHRlc3QtbGliIGNoZGlyJ3MgaW50byB0cmFzaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICBzZXR1cCBcCisgICAgJ2NhdCAuLi8uLi9SRUFETUUgPmZpbGUwICYmCisgICAgIGNhdCAuLi8uLi9DT1BZSU5HID5maWxlMSAmJgorICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgZmlsZTAgZmlsZTEgJiYKKyAgICB0cmVlPSQoZ2l0IHdyaXRlLXRyZWUpICYmCisgICAgZWNobyAiJHRyZWUiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hhbmdlIGZpbGUxIHdpdGggY29weS1lZGl0IG9mIGZpbGUwIGFuZCByZW1vdmUgZmlsZTAnIFwKKyAgICAnc2VkIC1lICJzL2dpdC9HSVQvIiBmaWxlMCA+ZmlsZTEgJiYKKyAgICAgcm0gLWYgZmlsZTAgJiYKKyAgICBnaXQgdXBkYXRlLWluZGV4IC0tcmVtb3ZlIGZpbGUwIGZpbGUxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncnVuIGRpZmYgd2l0aCAtQicgXAorICAgICdnaXQgZGlmZi1pbmRleCAtQiAtLWNhY2hlZCAiJHRyZWUiID5jdXJyZW50JworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAwMDAwMDAgZjVkZWFjN2JlNTllN2VlYWI4NjU3ZmQ5YWU3MDZmZDZhNTdkYWVkMiAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJZmlsZTAKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgMTFlMzMxNDY1YTg5YzM5NGRjMjVjNzgwZGUyMzAwNDM3NTBjMWVjOCBNMTAwCWZpbGUxCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIHJlc3VsdCBvZiAtQiAoIzEpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXcgZXhwZWN0ZWQgY3VycmVudCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3J1biBkaWZmIHdpdGggLUIgYW5kIC1NJyBcCisgICAgJ2dpdCBkaWZmLWluZGV4IC1CIC1NICIkdHJlZSIgPmN1cnJlbnQnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIDA4YmIyZmI2NzFkZWZmNGMwM2E0ZDRhMGExMzE1ZGZmOThkNTczMmMgUjEwMAlmaWxlMAlmaWxlMQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSByZXN1bHQgb2YgLUIgLU0gKCMyKScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3IGV4cGVjdGVkIGN1cnJlbnQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzd2FwIGZpbGUwIGFuZCBmaWxlMScgXAorICAgICdybSAtZiBmaWxlMCBmaWxlMSAmJgorICAgICBnaXQgcmVhZC10cmVlIC1tICR0cmVlICYmCisgICAgIGdpdCBjaGVja291dC1pbmRleCAtZiAtdSAtYSAmJgorICAgICBtdiBmaWxlMCB0bXAgJiYKKyAgICAgbXYgZmlsZTEgZmlsZTAgJiYKKyAgICAgbXYgdG1wIGZpbGUxICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggZmlsZTAgZmlsZTEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdydW4gZGlmZiB3aXRoIC1CJyBcCisgICAgJ2dpdCBkaWZmLWluZGV4IC1CICIkdHJlZSIgPmN1cnJlbnQnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgTTEwMAlmaWxlMAorOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIE0xMDAJZmlsZTEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgcmVzdWx0IG9mIC1CICgjMyknIFwKKyAgICAnY29tcGFyZV9kaWZmX3JhdyBleHBlY3RlZCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncnVuIGRpZmYgd2l0aCAtQiBhbmQgLU0nIFwKKyAgICAnZ2l0IGRpZmYtaW5kZXggLUIgLU0gIiR0cmVlIiA+Y3VycmVudCcKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyBSMTAwCWZpbGUxCWZpbGUwCis6MTAwNjQ0IDEwMDY0NCBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIGY1ZGVhYzdiZTU5ZTdlZWFiODY1N2ZkOWFlNzA2ZmQ2YTU3ZGFlZDIgUjEwMAlmaWxlMAlmaWxlMQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSByZXN1bHQgb2YgLUIgLU0gKCM0KScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3IGV4cGVjdGVkIGN1cnJlbnQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdtYWtlIGZpbGUwIGludG8gc29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50JyBcCisgICAgJ3JtIC1mIGZpbGUwICYmCisgICAgIGxuIC1zIGZyb3R6IGZpbGUwICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggZmlsZTAgZmlsZTEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdydW4gZGlmZiB3aXRoIC1CJyBcCisgICAgJ2dpdCBkaWZmLWluZGV4IC1CICIkdHJlZSIgPmN1cnJlbnQnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEyMDAwMCBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIDY3YmU0MjFmODg4MjQ1Nzg4NTc2MjRmN2IzZGM3NWU5OWE4YTE0ODEgVAlmaWxlMAorOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIE0xMDAJZmlsZTEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgcmVzdWx0IG9mIC1CICgjNSknIFwKKyAgICAnY29tcGFyZV9kaWZmX3JhdyBleHBlY3RlZCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncnVuIGRpZmYgd2l0aCAtQiAtTScgXAorICAgICdnaXQgZGlmZi1pbmRleCAtQiAtTSAiJHRyZWUiID5jdXJyZW50JworCisjIGZpbGUwIGNoYW5nZWQgZnJvbSByZWd1bGFyIHRvIHN5bWxpbmsuICBmaWxlMSBpcyB2ZXJ5IGNsb3NlIHRvIHRoZSBwcmVpbWFnZSBvZiBmaWxlMC4KKyMgYmVjYXVzZSB3ZSBicmVhayBmaWxlMCwgZmlsZTEgY2FuIGJlY29tZSBhIHJlbmFtZSBvZiBpdC4KK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEyMDAwMCBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIDY3YmU0MjFmODg4MjQ1Nzg4NTc2MjRmN2IzZGM3NWU5OWE4YTE0ODEgVAlmaWxlMAorOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIFIJZmlsZTAJZmlsZTEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgcmVzdWx0IG9mIC1CIC1NICgjNiknIFwKKyAgICAnY29tcGFyZV9kaWZmX3JhdyBleHBlY3RlZCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncnVuIGRpZmYgd2l0aCAtTScgXAorICAgICdnaXQgZGlmZi1pbmRleCAtTSAiJHRyZWUiID5jdXJyZW50JworCisjIFRoaXMgc2hvdWxkIG5vdCBtaXN0YWtlIGZpbGUwIGFzIHRoZSBjb3B5IHNvdXJjZSBvZiBuZXcgZmlsZTEKKyMgZHVlIHRvIHR5cGUgZGlmZmVyZW5jZXMuCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMjAwMDAgZjVkZWFjN2JlNTllN2VlYWI4NjU3ZmQ5YWU3MDZmZDZhNTdkYWVkMiA2N2JlNDIxZjg4ODI0NTc4ODU3NjI0ZjdiM2RjNzVlOTlhOGExNDgxIFQJZmlsZTAKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgZjVkZWFjN2JlNTllN2VlYWI4NjU3ZmQ5YWU3MDZmZDZhNTdkYWVkMiBNCWZpbGUxCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIHJlc3VsdCBvZiAtTSAoIzcpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXcgZXhwZWN0ZWQgY3VycmVudCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2ZpbGUxIGVkaXRlZCB0byBsb29rIGxpa2UgZmlsZTAgYW5kIGZpbGUwIHJlbmFtZS1lZGl0ZWQgdG8gZmlsZTInIFwKKyAgICAncm0gLWYgZmlsZTAgZmlsZTEgJiYKKyAgICAgZ2l0IHJlYWQtdHJlZSAtbSAkdHJlZSAmJgorICAgICBnaXQgY2hlY2tvdXQtaW5kZXggLWYgLXUgLWEgJiYKKyAgICAgc2VkIC1lICJzL2dpdC9HSVQvIiBmaWxlMCA+ZmlsZTEgJiYKKyAgICAgc2VkIC1lICJzL2dpdC9HRVQvIiBmaWxlMCA+ZmlsZTIgJiYKKyAgICAgcm0gLWYgZmlsZTAKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBmaWxlMCBmaWxlMSBmaWxlMicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3J1biBkaWZmIHdpdGggLUInIFwKKyAgICAnZ2l0IGRpZmYtaW5kZXggLUIgIiR0cmVlIiA+Y3VycmVudCcKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMDAwMDAwIGY1ZGVhYzdiZTU5ZTdlZWFiODY1N2ZkOWFlNzA2ZmQ2YTU3ZGFlZDIgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECWZpbGUwCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIDA4YmIyZmI2NzFkZWZmNGMwM2E0ZDRhMGExMzE1ZGZmOThkNTczMmMgTTEwMAlmaWxlMQorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIEEJZmlsZTIKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgcmVzdWx0IG9mIC1CICgjOCknIFwKKyAgICAnY29tcGFyZV9kaWZmX3JhdyBleHBlY3RlZCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncnVuIGRpZmYgd2l0aCAtQiAtTScgXAorICAgICdnaXQgZGlmZi1pbmRleCAtQiAtTSAiJHRyZWUiID5jdXJyZW50JworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMDA2NDQgZjVkZWFjN2JlNTllN2VlYWI4NjU3ZmQ5YWU3MDZmZDZhNTdkYWVkMiAwOGJiMmZiNjcxZGVmZjRjMDNhNGQ0YTBhMTMxNWRmZjk4ZDU3MzJjIEMwOTUJZmlsZTAJZmlsZTEKKzoxMDA2NDQgMTAwNjQ0IGY1ZGVhYzdiZTU5ZTdlZWFiODY1N2ZkOWFlNzA2ZmQ2YTU3ZGFlZDIgNTlmODMyZTVjOGIzZjdlNDg2YmUxNWFkMGNkM2U5NWJhOWFmODk5OCBSMDk1CWZpbGUwCWZpbGUyCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIHJlc3VsdCBvZiAtQiAtTSAoIzkpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXcgZXhwZWN0ZWQgY3VycmVudCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MDA5LWRpZmYtcmVuYW1lLTQuc2ggYi90L3Q0MDA5LWRpZmYtcmVuYW1lLTQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDJiNDVlNwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMDktZGlmZi1yZW5hbWUtNC5zaApAQCAtMCwwICsxLDk1IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1NhbWUgcmVuYW1lIGRldGVjdGlvbiBhcyB0NDAwMyBidXQgdGVzdGluZyBkaWZmLXJhdyAtei4KKworJworLiAuL3Rlc3QtbGliLnNoCisuIC4uL2RpZmYtbGliLnNoIDsjIHRlc3QtbGliIGNoZGlyJ3MgaW50byB0cmFzaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSByZWZlcmVuY2UgdHJlZScgXAorICAgICdjYXQgLi4vLi4vQ09QWUlORyA+Q09QWUlORyAmJgorICAgICBlY2hvIGZyb3R6ID5yZXpyb3YgJiYKKyAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIENPUFlJTkcgcmV6cm92ICYmCisgICAgdHJlZT0kKGdpdCB3cml0ZS10cmVlKSAmJgorICAgIGVjaG8gJHRyZWUnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHdvcmsgdHJlZScgXAorICAgICdzZWQgLWUgJ3MvSE9XRVZFUi9Ib3dldmVyLycgPENPUFlJTkcgPkNPUFlJTkcuMSAmJgorICAgIHNlZCAtZSAncy9HUEwvRy5QLkwvZycgPENPUFlJTkcgPkNPUFlJTkcuMiAmJgorICAgIHJtIC1mIENPUFlJTkcgJiYKKyAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIENPUFlJTkcgQ09QWUlORy4/JworCisjIHRyZWUgaGFzIENPUFlJTkcgYW5kIHJlenJvdi4gIHdvcmsgdHJlZSBoYXMgQ09QWUlORy4xIGFuZCBDT1BZSU5HLjIsCisjIGJvdGggYXJlIHNsaWdodGx5IGVkaXRlZCwgYW5kIHVuY2hhbmdlZCByZXpyb3YuICBXZSBzYXkgQ09QWUlORy4xCisjIGFuZCBDT1BZSU5HLjIgYXJlIGJhc2VkIG9uIENPUFlJTkcsIGFuZCBkbyBub3Qgc2F5IGFueXRoaW5nIGFib3V0CisjIHJlenJvdi4KKworZ2l0IGRpZmYtaW5kZXggLXogLU0gJHRyZWUgPmN1cnJlbnQKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgMDYwM2IzMjM4YTA3NmRjNmM4MDIyYWVkYzY2NDhmYTUyM2ExNzE3OCBDMTIzNAorQ09QWUlORworQ09QWUlORy4xCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIDA2YzY3OTYxYmJhZWQzNGExMjdmNzZkMjYxZjRjMGJmNzNlZGE0NzEgUjEyMzQKK0NPUFlJTkcKK0NPUFlJTkcuMgorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBvdXRwdXQgZnJvbSByZW5hbWUvY29weSBkZXRlY3Rpb24gKCMxKScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3X3ogY3VycmVudCBleHBlY3RlZCcKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSB3b3JrIHRyZWUgYWdhaW4nIFwKKyAgICAnbXYgQ09QWUlORy4yIENPUFlJTkcgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBDT1BZSU5HIENPUFlJTkcuMSBDT1BZSU5HLjInCisKKyMgdHJlZSBoYXMgQ09QWUlORyBhbmQgcmV6cm92LiAgd29yayB0cmVlIGhhcyBDT1BZSU5HIGFuZCBDT1BZSU5HLjEsCisjIGJvdGggYXJlIHNsaWdodGx5IGVkaXRlZCwgYW5kIHVuY2hhbmdlZCByZXpyb3YuICBXZSBzYXkgQ09QWUlORy4xCisjIGlzIGJhc2VkIG9uIENPUFlJTkcgYW5kIENPUFlJTkcgaXMgc3RpbGwgdGhlcmUsIGFuZCBkbyBub3Qgc2F5IGFueXRoaW5nCisjIGFib3V0IHJlenJvdi4KKworZ2l0IGRpZmYtaW5kZXggLXogLUMgJHRyZWUgPmN1cnJlbnQKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIDA2YzY3OTYxYmJhZWQzNGExMjdmNzZkMjYxZjRjMGJmNzNlZGE0NzEgTQorQ09QWUlORworOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyAwNjAzYjMyMzhhMDc2ZGM2YzgwMjJhZWRjNjY0OGZhNTIzYTE3MTc4IEMxMjM0CitDT1BZSU5HCitDT1BZSU5HLjEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgb3V0cHV0IGZyb20gcmVuYW1lL2NvcHkgZGV0ZWN0aW9uICgjMiknIFwKKyAgICAnY29tcGFyZV9kaWZmX3Jhd196IGN1cnJlbnQgZXhwZWN0ZWQnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyB0cmVlIGhhcyBDT1BZSU5HIGFuZCByZXpyb3YuICB3b3JrIHRyZWUgaGFzIHRoZSBzYW1lIENPUFlJTkcgYW5kCisjIGNvcHktZWRpdGVkIENPUFlJTkcuMSwgYW5kIHVuY2hhbmdlZCByZXpyb3YuICBXZSBzaG91bGQgbm90IHNheQorIyBhbnl0aGluZyBhYm91dCByZXpyb3Ygbm9yIENPUFlJTkcsIHNpbmNlIHRoZSByZXZpc2VkIGFnYWluIGRpZmYtcmF3CisjIG5vd3MgaG93IHRvIHNheSBDb3B5LgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSB3b3JrIHRyZWUgb25jZSBhZ2FpbicgXAorICAgICdjYXQgLi4vLi4vQ09QWUlORyA+Q09QWUlORyAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIENPUFlJTkcgQ09QWUlORy4xJworCitnaXQgZGlmZi1pbmRleCAteiAtQyAtLWZpbmQtY29waWVzLWhhcmRlciAkdHJlZSA+Y3VycmVudAorY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgMDYwM2IzMjM4YTA3NmRjNmM4MDIyYWVkYzY2NDhmYTUyM2ExNzE3OCBDMTIzNAorQ09QWUlORworQ09QWUlORy4xCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG91dHB1dCBmcm9tIHJlbmFtZS9jb3B5IGRldGVjdGlvbiAoIzMpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXdfeiBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMTAtZGlmZi1wYXRoc3BlYy5zaCBiL3QvdDQwMTAtZGlmZi1wYXRoc3BlYy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZDNkOWU0Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMC1kaWZmLXBhdGhzcGVjLnNoCkBAIC0wLDAgKzEsNjUgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nUGF0aHNwZWMgcmVzdHJpY3Rpb25zCisKK1ByZXBhcmU6CisgICAgICAgIGZpbGUwCisgICAgICAgIHBhdGgxL2ZpbGUxCisnCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vZGlmZi1saWIuc2ggOyMgdGVzdC1saWIgY2hkaXIncyBpbnRvIHRyYXNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgIHNldHVwIFwKKyAgICAnZWNobyBmcm90eiA+ZmlsZTAgJiYKKyAgICAgbWtkaXIgcGF0aDEgJiYKKyAgICAgZWNobyByZXpyb3YgPnBhdGgxL2ZpbGUxICYmCisgICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgZmlsZTAgcGF0aDEvZmlsZTEgJiYKKyAgICAgdHJlZT1gZ2l0IHdyaXRlLXRyZWVgICYmCisgICAgIGVjaG8gIiR0cmVlIiAmJgorICAgICBlY2hvIG5pdGZvbCA+ZmlsZTAgJiYKKyAgICAgZWNobyB5b21pbiA+cGF0aDEvZmlsZTEgJiYKKyAgICAgZ2l0IHVwZGF0ZS1pbmRleCBmaWxlMCBwYXRoMS9maWxlMScKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xpbWl0IHRvIHBhdGggc2hvdWxkIHNob3cgbm90aGluZycgXAorICAgICdnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCAkdHJlZSAtLSBwYXRoID5jdXJyZW50ICYmCisgICAgIGNvbXBhcmVfZGlmZl9yYXcgY3VycmVudCBleHBlY3RlZCcKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IDc2NjQ5OGQ5M2E0YjA2MDU3YThlNDlkMjNmNDA2OGYxMTcwZmYzOGYgMGE0MWUxMTVhYjYxYmUwMzI4YTE5YjI5ZjE4Y2RjYjQ5MzM4ZDUxNiBNCXBhdGgxL2ZpbGUxCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdsaW1pdCB0byBwYXRoMSBzaG91bGQgc2hvdyBwYXRoMS9maWxlMScgXAorICAgICdnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCAkdHJlZSAtLSBwYXRoMSA+Y3VycmVudCAmJgorICAgICBjb21wYXJlX2RpZmZfcmF3IGN1cnJlbnQgZXhwZWN0ZWQnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCA3NjY0OThkOTNhNGIwNjA1N2E4ZTQ5ZDIzZjQwNjhmMTE3MGZmMzhmIDBhNDFlMTE1YWI2MWJlMDMyOGExOWIyOWYxOGNkY2I0OTMzOGQ1MTYgTQlwYXRoMS9maWxlMQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbGltaXQgdG8gcGF0aDEvIHNob3VsZCBzaG93IHBhdGgxL2ZpbGUxJyBcCisgICAgJ2dpdCBkaWZmLWluZGV4IC0tY2FjaGVkICR0cmVlIC0tIHBhdGgxLyA+Y3VycmVudCAmJgorICAgICBjb21wYXJlX2RpZmZfcmF3IGN1cnJlbnQgZXhwZWN0ZWQnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCA3NjY0OThkOTNhNGIwNjA1N2E4ZTQ5ZDIzZjQwNjhmMTE3MGZmMzhmIDBhNDFlMTE1YWI2MWJlMDMyOGExOWIyOWYxOGNkY2I0OTMzOGQ1MTYgTQlmaWxlMAorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbGltaXQgdG8gZmlsZTAgc2hvdWxkIHNob3cgZmlsZTAnIFwKKyAgICAnZ2l0IGRpZmYtaW5kZXggLS1jYWNoZWQgJHRyZWUgLS0gZmlsZTAgPmN1cnJlbnQgJiYKKyAgICAgY29tcGFyZV9kaWZmX3JhdyBjdXJyZW50IGV4cGVjdGVkJworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbGltaXQgdG8gZmlsZTAvIHNob3VsZCBlbWl0IG5vdGhpbmcuJyBcCisgICAgJ2dpdCBkaWZmLWluZGV4IC0tY2FjaGVkICR0cmVlIC0tIGZpbGUwLyA+Y3VycmVudCAmJgorICAgICBjb21wYXJlX2RpZmZfcmF3IGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAxMS1kaWZmLXN5bWxpbmsuc2ggYi90L3Q0MDExLWRpZmYtc3ltbGluay5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNmQxMzY5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMS1kaWZmLXN5bWxpbmsuc2gKQEAgLTAsMCArMSw4NSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKb2hhbm5lcyBTY2hpbmRlbGluCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgZGlmZiBvZiBzeW1saW5rcy4KKworJworLiAuL3Rlc3QtbGliLnNoCisuIC4uL2RpZmYtbGliLnNoCisKK2NhdCA+IGV4cGVjdGVkIDw8IEVPRgorZGlmZiAtLWdpdCBhL2Zyb3R6IGIvZnJvdHoKK25ldyBmaWxlIG1vZGUgMTIwMDAwCitpbmRleCAwMDAwMDAwLi43YzQ2NWFmCistLS0gL2Rldi9udWxsCisrKysgYi9mcm90egorQEAgLTAsMCArMSBAQAorK3h5enp5CitcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZiBuZXcgc3ltbGluaycgXAorICAgICdsbiAtcyB4eXp6eSBmcm90eiAmJgorICAgIGdpdCB1cGRhdGUtaW5kZXggJiYKKyAgICB0cmVlPSQoZ2l0IHdyaXRlLXRyZWUpICYmCisgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBmcm90eiAmJgorICAgIEdJVF9ESUZGX09QVFM9LS11bmlmaWVkPTAgZ2l0IGRpZmYtaW5kZXggLU0gLXAgJHRyZWUgPiBjdXJyZW50ICYmCisgICAgY29tcGFyZV9kaWZmX3BhdGNoIGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmIHVuY2hhbmdlZCBzeW1saW5rJyBcCisgICAgJ3RyZWU9JChnaXQgd3JpdGUtdHJlZSkgJiYKKyAgICBnaXQgdXBkYXRlLWluZGV4IGZyb3R6ICYmCisgICAgdGVzdCAteiAiJChnaXQgZGlmZi1pbmRleCAtLW5hbWUtb25seSAkdHJlZSkiJworCitjYXQgPiBleHBlY3RlZCA8PCBFT0YKK2RpZmYgLS1naXQgYS9mcm90eiBiL2Zyb3R6CitkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKK2luZGV4IDdjNDY1YWYuLjAwMDAwMDAKKy0tLSBhL2Zyb3R6CisrKysgL2Rldi9udWxsCitAQCAtMSArMCwwIEBACisteHl6enkKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmIHJlbW92ZWQgc3ltbGluaycgXAorICAgICdybSBmcm90eiAmJgorICAgIGdpdCBkaWZmLWluZGV4IC1NIC1wICR0cmVlID4gY3VycmVudCAmJgorICAgIGNvbXBhcmVfZGlmZl9wYXRjaCBjdXJyZW50IGV4cGVjdGVkJworCitjYXQgPiBleHBlY3RlZCA8PCBFT0YKK2RpZmYgLS1naXQgYS9mcm90eiBiL2Zyb3R6CitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYgaWRlbnRpY2FsLCBidXQgbmV3bHkgY3JlYXRlZCBzeW1saW5rJyBcCisgICAgJ3NsZWVwIDMgJiYKKyAgICBsbiAtcyB4eXp6eSBmcm90eiAmJgorICAgIGdpdCBkaWZmLWluZGV4IC1NIC1wICR0cmVlID4gY3VycmVudCAmJgorICAgIGNvbXBhcmVfZGlmZl9wYXRjaCBjdXJyZW50IGV4cGVjdGVkJworCitjYXQgPiBleHBlY3RlZCA8PCBFT0YKK2RpZmYgLS1naXQgYS9mcm90eiBiL2Zyb3R6CitpbmRleCA3YzQ2NWFmLi5kZjFkYjU0IDEyMDAwMAorLS0tIGEvZnJvdHoKKysrKyBiL2Zyb3R6CitAQCAtMSArMSBAQAorLXh5enp5CitcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyt5eHl5egorXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYgZGlmZmVyZW50IHN5bWxpbmsnIFwKKyAgICAncm0gZnJvdHogJiYKKyAgICBsbiAtcyB5eHl5eiBmcm90eiAmJgorICAgIGdpdCBkaWZmLWluZGV4IC1NIC1wICR0cmVlID4gY3VycmVudCAmJgorICAgIGNvbXBhcmVfZGlmZl9wYXRjaCBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMTItZGlmZi1iaW5hcnkuc2ggYi90L3Q0MDEyLWRpZmYtYmluYXJ5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVjZWQxZjMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEyLWRpZmYtYmluYXJ5LnNoCkBAIC0wLDAgKzEsODAgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nQmluYXJ5IGRpZmYgYW5kIGFwcGx5CisnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwcmVwYXJlIHJlcG9zaXRvcnknIFwKKwknZWNobyBBSVQgPmEgJiYgZWNobyBCSVQgPmIgJiYgZWNobyBDSVQgPmMgJiYgZWNobyBESVQgPmQgJiYKKwkgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBhIGIgYyBkICYmCisJIGVjaG8gZ2l0ID5hICYmCisJIGNhdCAuLi90ZXN0NDAxMi5wbmcgPmIgJiYKKwkgZWNobyBnaXQgPmMgJiYKKwkgY2F0IGIgYiA+ZCcKKworY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCisgYSB8ICAgIDIgKy0KKyBiIHwgIEJpbgorIGMgfCAgICAyICstCisgZCB8ICBCaW4KKyA0IGZpbGVzIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZGlmZiB3aXRob3V0IC0tYmluYXJ5JyBcCisJJ2dpdCBkaWZmIHwgZ2l0IGFwcGx5IC0tc3RhdCAtLXN1bW1hcnkgPmN1cnJlbnQgJiYKKwkgY21wIGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2RpZmYgd2l0aCAtLWJpbmFyeScgXAorCSdnaXQgZGlmZiAtLWJpbmFyeSB8IGdpdCBhcHBseSAtLXN0YXQgLS1zdW1tYXJ5ID5jdXJyZW50ICYmCisJIGNtcCBjdXJyZW50IGV4cGVjdGVkJworCisjIGFwcGx5IG5lZWRzIHRvIGJlIGFibGUgdG8gc2tpcCB0aGUgYmluYXJ5IG1hdGVyaWFsIGNvcnJlY3RseQorIyBpbiBvcmRlciB0byByZXBvcnQgdGhlIGxpbmUgbnVtYmVyIG9mIGEgY29ycnVwdCBwYXRjaC4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IGRldGVjdGluZyBjb3JydXB0IHBhdGNoIGNvcnJlY3RseScgXAorCSdnaXQgZGlmZiB8IHNlZCAtZSAncy8tQ0lUL3hDSVQvJyA+YnJva2VuICYmCisJIGlmIGdpdCBhcHBseSAtLXN0YXQgLS1zdW1tYXJ5IGJyb2tlbiAyPmRldGVjdGVkCisJIHRoZW4KKwkJZWNobyB1bmhhcHB5IC0gc2hvdWxkIGhhdmUgZGV0ZWN0ZWQgYW4gZXJyb3IKKwkJKGV4aXQgMSkKKwkgZWxzZQorCQllY2hvIGhhcHB5CisJIGZpICYmCisJIGRldGVjdGVkPWBjYXQgZGV0ZWN0ZWRgICYmCisJIGRldGVjdGVkPWBleHByICIkZGV0ZWN0ZWQiIDogImZhdGFsLiphdCBsaW5lIFxcKFswLTldKlxcKVwkImAgJiYKKwkgZGV0ZWN0ZWQ9YHNlZCAtbmUgIiR7ZGV0ZWN0ZWR9cCIgYnJva2VuYCAmJgorCSB0ZXN0ICIkZGV0ZWN0ZWQiID0geENJVCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgZGV0ZWN0aW5nIGNvcnJ1cHQgcGF0Y2ggY29ycmVjdGx5JyBcCisJJ2dpdCBkaWZmIC0tYmluYXJ5IHwgc2VkIC1lICdzLy1DSVQveENJVC8nID5icm9rZW4gJiYKKwkgaWYgZ2l0IGFwcGx5IC0tc3RhdCAtLXN1bW1hcnkgYnJva2VuIDI+ZGV0ZWN0ZWQKKwkgdGhlbgorCQllY2hvIHVuaGFwcHkgLSBzaG91bGQgaGF2ZSBkZXRlY3RlZCBhbiBlcnJvcgorCQkoZXhpdCAxKQorCSBlbHNlCisJCWVjaG8gaGFwcHkKKwkgZmkgJiYKKwkgZGV0ZWN0ZWQ9YGNhdCBkZXRlY3RlZGAgJiYKKwkgZGV0ZWN0ZWQ9YGV4cHIgIiRkZXRlY3RlZCIgOiAiZmF0YWwuKmF0IGxpbmUgXFwoWzAtOV0qXFwpXCQiYCAmJgorCSBkZXRlY3RlZD1gc2VkIC1uZSAiJHtkZXRlY3RlZH1wIiBicm9rZW5gICYmCisJIHRlc3QgIiRkZXRlY3RlZCIgPSB4Q0lUJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbml0aWFsIGNvbW1pdCcgJ2dpdC1jb21taXQgLWEgLW0gaW5pdGlhbCcKKworIyBUcnkgcmVtb3ZhbCAoYiksIG1vZGlmaWNhdGlvbiAoZCksIGFuZCBjcmVhdGlvbiAoZSkuCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdkaWZmLWluZGV4IHdpdGggLS1iaW5hcnknIFwKKwknZWNobyBBSVQgPmEgJiYgbXYgYiBlICYmIGVjaG8gQ0lUID5jICYmIGNhdCBlID5kICYmCisJIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgYSBiIGMgZCBlICYmCisJIHRyZWUwPWBnaXQgd3JpdGUtdHJlZWAgJiYKKwkgZ2l0IGRpZmYgLS1jYWNoZWQgLS1iaW5hcnkgPmN1cnJlbnQgJiYKKwkgZ2l0IGFwcGx5IC0tc3RhdCAtLXN1bW1hcnkgY3VycmVudCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgYmluYXJ5IHBhdGNoJyBcCisJJ2dpdC1yZXNldCAtLWhhcmQgJiYKKwkgZ2l0IGFwcGx5IC0tYmluYXJ5IC0taW5kZXggPGN1cnJlbnQgJiYKKwkgdHJlZTE9YGdpdCB3cml0ZS10cmVlYCAmJgorCSB0ZXN0ICIkdHJlZTEiID0gIiR0cmVlMCInCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAxMy1kaWZmLXZhcmlvdXMuc2ggYi90L3Q0MDEzLWRpZmYtdmFyaW91cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YjRkMWM1Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy1kaWZmLXZhcmlvdXMuc2gKQEAgLTAsMCArMSwyNjIgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVmFyaW91cyBkaWZmIGZvcm1hdHRpbmcgb3B0aW9ucycKKworLiAuL3Rlc3QtbGliLnNoCisKK0xGPScKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwlHSVRfQVVUSE9SX0RBVEU9IjIwMDYtMDYtMjYgMDA6MDA6MDAgKzAwMDAiICYmCisJR0lUX0NPTU1JVFRFUl9EQVRFPSIyMDA2LTA2LTI2IDAwOjAwOjAwICswMDAwIiAmJgorCWV4cG9ydCBHSVRfQVVUSE9SX0RBVEUgR0lUX0NPTU1JVFRFUl9EQVRFICYmCisKKwlta2RpciBkaXIgJiYKKwlta2RpciBkaXIyICYmCisJZm9yIGkgaW4gMSAyIDM7IGRvIGVjaG8gJGk7IGRvbmUgPmZpbGUwICYmCisJZm9yIGkgaW4gQSBCOyBkbyBlY2hvICRpOyBkb25lID5kaXIvc3ViICYmCisJY2F0IGZpbGUwID5maWxlMiAmJgorCWdpdCBhZGQgZmlsZTAgZmlsZTIgZGlyL3N1YiAmJgorCWdpdCBjb21taXQgLW0gSW5pdGlhbCAmJgorCisJZ2l0IGJyYW5jaCBpbml0aWFsICYmCisJZ2l0IGJyYW5jaCBzaWRlICYmCisKKwlHSVRfQVVUSE9SX0RBVEU9IjIwMDYtMDYtMjYgMDA6MDE6MDAgKzAwMDAiICYmCisJR0lUX0NPTU1JVFRFUl9EQVRFPSIyMDA2LTA2LTI2IDAwOjAxOjAwICswMDAwIiAmJgorCWV4cG9ydCBHSVRfQVVUSE9SX0RBVEUgR0lUX0NPTU1JVFRFUl9EQVRFICYmCisKKwlmb3IgaSBpbiA0IDUgNjsgZG8gZWNobyAkaTsgZG9uZSA+PmZpbGUwICYmCisJZm9yIGkgaW4gQyBEOyBkbyBlY2hvICRpOyBkb25lID4+ZGlyL3N1YiAmJgorCXJtIC1mIGZpbGUyICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLXJlbW92ZSBmaWxlMCBmaWxlMiBkaXIvc3ViICYmCisJZ2l0IGNvbW1pdCAtbSAiU2Vjb25kJHtMRn0ke0xGfVRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuIiAmJgorCisJR0lUX0FVVEhPUl9EQVRFPSIyMDA2LTA2LTI2IDAwOjAyOjAwICswMDAwIiAmJgorCUdJVF9DT01NSVRURVJfREFURT0iMjAwNi0wNi0yNiAwMDowMjowMCArMDAwMCIgJiYKKwlleHBvcnQgR0lUX0FVVEhPUl9EQVRFIEdJVF9DT01NSVRURVJfREFURSAmJgorCisJZm9yIGkgaW4gQSBCIEM7IGRvIGVjaG8gJGk7IGRvbmUgPmZpbGUxICYmCisJZ2l0IGFkZCBmaWxlMSAmJgorCWZvciBpIGluIEUgRjsgZG8gZWNobyAkaTsgZG9uZSA+PmRpci9zdWIgJiYKKwlnaXQgdXBkYXRlLWluZGV4IGRpci9zdWIgJiYKKwlnaXQgY29tbWl0IC1tIFRoaXJkICYmCisKKwlHSVRfQVVUSE9SX0RBVEU9IjIwMDYtMDYtMjYgMDA6MDM6MDAgKzAwMDAiICYmCisJR0lUX0NPTU1JVFRFUl9EQVRFPSIyMDA2LTA2LTI2IDAwOjAzOjAwICswMDAwIiAmJgorCWV4cG9ydCBHSVRfQVVUSE9SX0RBVEUgR0lUX0NPTU1JVFRFUl9EQVRFICYmCisKKwlnaXQgY2hlY2tvdXQgc2lkZSAmJgorCWZvciBpIGluIEEgQiBDOyBkbyBlY2hvICRpOyBkb25lID4+ZmlsZTAgJiYKKwlmb3IgaSBpbiAxIDI7IGRvIGVjaG8gJGk7IGRvbmUgPj5kaXIvc3ViICYmCisJY2F0IGRpci9zdWIgPmZpbGUzICYmCisJZ2l0IGFkZCBmaWxlMyAmJgorCWdpdCB1cGRhdGUtaW5kZXggZmlsZTAgZGlyL3N1YiAmJgorCWdpdCBjb21taXQgLW0gU2lkZSAmJgorCisJR0lUX0FVVEhPUl9EQVRFPSIyMDA2LTA2LTI2IDAwOjA0OjAwICswMDAwIiAmJgorCUdJVF9DT01NSVRURVJfREFURT0iMjAwNi0wNi0yNiAwMDowNDowMCArMDAwMCIgJiYKKwlleHBvcnQgR0lUX0FVVEhPUl9EQVRFIEdJVF9DT01NSVRURVJfREFURSAmJgorCisJZ2l0IGNoZWNrb3V0IG1hc3RlciAmJgorCWdpdCBwdWxsIC1zIG91cnMgLiBzaWRlICYmCisKKwlHSVRfQVVUSE9SX0RBVEU9IjIwMDYtMDYtMjYgMDA6MDU6MDAgKzAwMDAiICYmCisJR0lUX0NPTU1JVFRFUl9EQVRFPSIyMDA2LTA2LTI2IDAwOjA1OjAwICswMDAwIiAmJgorCWV4cG9ydCBHSVRfQVVUSE9SX0RBVEUgR0lUX0NPTU1JVFRFUl9EQVRFICYmCisKKwlmb3IgaSBpbiBBIEIgQzsgZG8gZWNobyAkaTsgZG9uZSA+PmZpbGUwICYmCisJZm9yIGkgaW4gMSAyOyBkbyBlY2hvICRpOyBkb25lID4+ZGlyL3N1YiAmJgorCWdpdCB1cGRhdGUtaW5kZXggZmlsZTAgZGlyL3N1YiAmJgorCisJZ2l0IGNvbmZpZyBsb2cuc2hvd3Jvb3QgZmFsc2UgJiYKKwlnaXQgY29tbWl0IC0tYW1lbmQgJiYKKwlnaXQgc2hvdy1icmFuY2gKKycKKworOiA8PFxFT0YKKyEgW2luaXRpYWxdIEluaXRpYWwKKyAqIFttYXN0ZXJdIE1lcmdlIGJyYW5jaCAnc2lkZScKKyAgISBbc2lkZV0gU2lkZQorLS0tCisgLSAgW21hc3Rlcl0gTWVyZ2UgYnJhbmNoICdzaWRlJworICorIFtzaWRlXSBTaWRlCisgKiAgW21hc3Rlcl5dIFNlY29uZAorKyorIFtpbml0aWFsXSBJbml0aWFsCitFT0YKKworVj1gZ2l0IHZlcnNpb24gfCBzZWQgLWUgJ3MvXmdpdCB2ZXJzaW9uIC8vJyAtZSAncy9cLi9cXC4vZydgCit3aGlsZSByZWFkIGNtZAorZG8KKwljYXNlICIkY21kIiBpbgorCScnIHwgJyMnKikgY29udGludWUgOzsKKwllc2FjCisJdGVzdD1gZWNobyAiJGNtZCIgfCBzZWQgLWUgJ3N8Wy8gXVsvIF0qfF98ZydgCisJY250PWBleHByICR0ZXN0X2NvdW50ICsgMWAKKwlwZng9YHByaW50ZiAiJTA0ZCIgJGNudGAKKwlleHBlY3Q9Ii4uL3Q0MDEzL2RpZmYuJHRlc3QiCisJYWN0dWFsPSIkcGZ4LWRpZmYuJHRlc3QiCisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICJnaXQgJGNtZCIgJworCQl7CisJCQllY2hvICJcJCBnaXQgJGNtZCIKKwkJCWdpdCAkY21kIHwKKwkJCXNlZCAtZSAicy9eXFwoLSpcXCkkVlxcKC0qXFwpXCQvXFwxZy1pLXQtLXYtZS1yLXMtaS1vLW5cMi8iIFwKKwkJCSAgICAtZSAicy9eXFwoLiptaXhlZDsgYm91bmRhcnk9XCItKlxcKSRWXFwoLSpcXClcIlwkL1xcMWctaS10LS12LWUtci1zLWktby1uXDJcIi8iCisJCQllY2hvICJcJCIKKwkJfSA+IiRhY3R1YWwiICYmCisJCWlmIHRlc3QgLWYgIiRleHBlY3QiCisJCXRoZW4KKwkJCWdpdCBkaWZmICIkZXhwZWN0IiAiJGFjdHVhbCIgJiYKKwkJCXJtIC1mICIkYWN0dWFsIgorCQllbHNlCisJCQkjIHRoaXMgaXMgdG8gaGVscCBkZXZlbG9waW5nIG5ldyB0ZXN0cy4KKwkJCWNwICIkYWN0dWFsIiAiJGV4cGVjdCIKKwkJCWZhbHNlCisJCWZpCisJJworZG9uZSA8PFxFT0YKK2RpZmYtdHJlZSBpbml0aWFsCitkaWZmLXRyZWUgLXIgaW5pdGlhbAorZGlmZi10cmVlIC1yIC0tYWJicmV2IGluaXRpYWwKK2RpZmYtdHJlZSAtciAtLWFiYnJldj00IGluaXRpYWwKK2RpZmYtdHJlZSAtLXJvb3QgaW5pdGlhbAorZGlmZi10cmVlIC0tcm9vdCAtLWFiYnJldiBpbml0aWFsCitkaWZmLXRyZWUgLS1yb290IC1yIGluaXRpYWwKK2RpZmYtdHJlZSAtLXJvb3QgLXIgLS1hYmJyZXYgaW5pdGlhbAorZGlmZi10cmVlIC0tcm9vdCAtciAtLWFiYnJldj00IGluaXRpYWwKK2RpZmYtdHJlZSAtcCBpbml0aWFsCitkaWZmLXRyZWUgLS1yb290IC1wIGluaXRpYWwKK2RpZmYtdHJlZSAtLXBhdGNoLXdpdGgtc3RhdCBpbml0aWFsCitkaWZmLXRyZWUgLS1yb290IC0tcGF0Y2gtd2l0aC1zdGF0IGluaXRpYWwKK2RpZmYtdHJlZSAtLXBhdGNoLXdpdGgtcmF3IGluaXRpYWwKK2RpZmYtdHJlZSAtLXJvb3QgLS1wYXRjaC13aXRoLXJhdyBpbml0aWFsCisKK2RpZmYtdHJlZSAtLXByZXR0eSBpbml0aWFsCitkaWZmLXRyZWUgLS1wcmV0dHkgLS1yb290IGluaXRpYWwKK2RpZmYtdHJlZSAtLXByZXR0eSAtcCBpbml0aWFsCitkaWZmLXRyZWUgLS1wcmV0dHkgLS1zdGF0IGluaXRpYWwKK2RpZmYtdHJlZSAtLXByZXR0eSAtLXN1bW1hcnkgaW5pdGlhbAorZGlmZi10cmVlIC0tcHJldHR5IC0tc3RhdCAtLXN1bW1hcnkgaW5pdGlhbAorZGlmZi10cmVlIC0tcHJldHR5IC0tcm9vdCAtcCBpbml0aWFsCitkaWZmLXRyZWUgLS1wcmV0dHkgLS1yb290IC0tc3RhdCBpbml0aWFsCisjIGltcHJvdmVkIGJ5IFRpbW8ncyBwYXRjaAorZGlmZi10cmVlIC0tcHJldHR5IC0tcm9vdCAtLXN1bW1hcnkgaW5pdGlhbAorIyBpbXByb3ZlZCBieSBUaW1vJ3MgcGF0Y2gKK2RpZmYtdHJlZSAtLXByZXR0eSAtLXJvb3QgLS1zdW1tYXJ5IC1yIGluaXRpYWwKK2RpZmYtdHJlZSAtLXByZXR0eSAtLXJvb3QgLS1zdGF0IC0tc3VtbWFyeSBpbml0aWFsCitkaWZmLXRyZWUgLS1wcmV0dHkgLS1wYXRjaC13aXRoLXN0YXQgaW5pdGlhbAorZGlmZi10cmVlIC0tcHJldHR5IC0tcm9vdCAtLXBhdGNoLXdpdGgtc3RhdCBpbml0aWFsCitkaWZmLXRyZWUgLS1wcmV0dHkgLS1wYXRjaC13aXRoLXJhdyBpbml0aWFsCitkaWZmLXRyZWUgLS1wcmV0dHkgLS1yb290IC0tcGF0Y2gtd2l0aC1yYXcgaW5pdGlhbAorCitkaWZmLXRyZWUgLS1wcmV0dHk9b25lbGluZSBpbml0aWFsCitkaWZmLXRyZWUgLS1wcmV0dHk9b25lbGluZSAtLXJvb3QgaW5pdGlhbAorZGlmZi10cmVlIC0tcHJldHR5PW9uZWxpbmUgLXAgaW5pdGlhbAorZGlmZi10cmVlIC0tcHJldHR5PW9uZWxpbmUgLS1yb290IC1wIGluaXRpYWwKK2RpZmYtdHJlZSAtLXByZXR0eT1vbmVsaW5lIC0tcGF0Y2gtd2l0aC1zdGF0IGluaXRpYWwKKyMgaW1wcm92ZWQgYnkgVGltbydzIHBhdGNoCitkaWZmLXRyZWUgLS1wcmV0dHk9b25lbGluZSAtLXJvb3QgLS1wYXRjaC13aXRoLXN0YXQgaW5pdGlhbAorZGlmZi10cmVlIC0tcHJldHR5PW9uZWxpbmUgLS1wYXRjaC13aXRoLXJhdyBpbml0aWFsCitkaWZmLXRyZWUgLS1wcmV0dHk9b25lbGluZSAtLXJvb3QgLS1wYXRjaC13aXRoLXJhdyBpbml0aWFsCisKK2RpZmYtdHJlZSAtLXByZXR0eSBzaWRlCitkaWZmLXRyZWUgLS1wcmV0dHkgLXAgc2lkZQorZGlmZi10cmVlIC0tcHJldHR5IC0tcGF0Y2gtd2l0aC1zdGF0IHNpZGUKKworZGlmZi10cmVlIG1hc3RlcgorZGlmZi10cmVlIC1wIG1hc3RlcgorZGlmZi10cmVlIC1wIC1tIG1hc3RlcgorZGlmZi10cmVlIC1jIG1hc3RlcgorZGlmZi10cmVlIC1jIC0tYWJicmV2IG1hc3RlcgorZGlmZi10cmVlIC0tY2MgbWFzdGVyCisjIHN0YXQgb25seSBzaG91bGQgc2hvdyB0aGUgZGlmZnN0YXQgd2l0aCB0aGUgZmlyc3QgcGFyZW50CitkaWZmLXRyZWUgLWMgLS1zdGF0IG1hc3RlcgorZGlmZi10cmVlIC0tY2MgLS1zdGF0IG1hc3RlcgorZGlmZi10cmVlIC1jIC0tc3RhdCAtLXN1bW1hcnkgbWFzdGVyCitkaWZmLXRyZWUgLS1jYyAtLXN0YXQgLS1zdW1tYXJ5IG1hc3RlcgorIyBzdGF0IHN1bW1hcnkgc2hvdWxkIHNob3cgdGhlIGRpZmZzdGF0IGFuZCBzdW1tYXJ5IHdpdGggdGhlIGZpcnN0IHBhcmVudAorZGlmZi10cmVlIC1jIC0tc3RhdCAtLXN1bW1hcnkgc2lkZQorZGlmZi10cmVlIC0tY2MgLS1zdGF0IC0tc3VtbWFyeSBzaWRlCisjIGltcHJvdmVkIGJ5IFRpbW8ncyBwYXRjaAorZGlmZi10cmVlIC0tY2MgLS1wYXRjaC13aXRoLXN0YXQgbWFzdGVyCisjIGltcHJvdmVkIGJ5IFRpbW8ncyBwYXRjaAorZGlmZi10cmVlIC0tY2MgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IG1hc3RlcgorIyB0aGlzIGlzIGNvcnJlY3QKK2RpZmYtdHJlZSAtLWNjIC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBzaWRlCisKK2xvZyBtYXN0ZXIKK2xvZyAtcCBtYXN0ZXIKK2xvZyAtLXJvb3QgbWFzdGVyCitsb2cgLS1yb290IC1wIG1hc3RlcgorbG9nIC0tcGF0Y2gtd2l0aC1zdGF0IG1hc3RlcgorbG9nIC0tcm9vdCAtLXBhdGNoLXdpdGgtc3RhdCBtYXN0ZXIKK2xvZyAtLXJvb3QgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IG1hc3RlcgorIyBpbXByb3ZlZCBieSBUaW1vJ3MgcGF0Y2gKK2xvZyAtLXJvb3QgLWMgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IG1hc3RlcgorIyBpbXByb3ZlZCBieSBUaW1vJ3MgcGF0Y2gKK2xvZyAtLXJvb3QgLS1jYyAtLXBhdGNoLXdpdGgtc3RhdCAtLXN1bW1hcnkgbWFzdGVyCitsb2cgLVNGIG1hc3RlcgorbG9nIC1TRiAtcCBtYXN0ZXIKKword2hhdGNoYW5nZWQgbWFzdGVyCit3aGF0Y2hhbmdlZCAtcCBtYXN0ZXIKK3doYXRjaGFuZ2VkIC0tcm9vdCBtYXN0ZXIKK3doYXRjaGFuZ2VkIC0tcm9vdCAtcCBtYXN0ZXIKK3doYXRjaGFuZ2VkIC0tcGF0Y2gtd2l0aC1zdGF0IG1hc3Rlcgord2hhdGNoYW5nZWQgLS1yb290IC0tcGF0Y2gtd2l0aC1zdGF0IG1hc3Rlcgord2hhdGNoYW5nZWQgLS1yb290IC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIKKyMgaW1wcm92ZWQgYnkgVGltbydzIHBhdGNoCit3aGF0Y2hhbmdlZCAtLXJvb3QgLWMgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IG1hc3RlcgorIyBpbXByb3ZlZCBieSBUaW1vJ3MgcGF0Y2gKK3doYXRjaGFuZ2VkIC0tcm9vdCAtLWNjIC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIKK3doYXRjaGFuZ2VkIC1TRiBtYXN0ZXIKK3doYXRjaGFuZ2VkIC1TRiAtcCBtYXN0ZXIKKworbG9nIC0tcGF0Y2gtd2l0aC1zdGF0IG1hc3RlciAtLSBkaXIvCit3aGF0Y2hhbmdlZCAtLXBhdGNoLXdpdGgtc3RhdCBtYXN0ZXIgLS0gZGlyLworbG9nIC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIgLS0gZGlyLword2hhdGNoYW5nZWQgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IG1hc3RlciAtLSBkaXIvCisKK3Nob3cgaW5pdGlhbAorc2hvdyAtLXJvb3QgaW5pdGlhbAorc2hvdyBzaWRlCitzaG93IG1hc3Rlcgorc2hvdyAtLXN0YXQgc2lkZQorc2hvdyAtLXN0YXQgLS1zdW1tYXJ5IHNpZGUKK3Nob3cgLS1wYXRjaC13aXRoLXN0YXQgc2lkZQorc2hvdyAtLXBhdGNoLXdpdGgtcmF3IHNpZGUKK3Nob3cgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IHNpZGUKKworZm9ybWF0LXBhdGNoIC0tc3Rkb3V0IGluaXRpYWwuLnNpZGUKK2Zvcm1hdC1wYXRjaCAtLXN0ZG91dCBpbml0aWFsLi5tYXN0ZXJeCitmb3JtYXQtcGF0Y2ggLS1zdGRvdXQgaW5pdGlhbC4ubWFzdGVyCitmb3JtYXQtcGF0Y2ggLS1hdHRhY2ggLS1zdGRvdXQgaW5pdGlhbC4uc2lkZQorZm9ybWF0LXBhdGNoIC0tYXR0YWNoIC0tc3Rkb3V0IGluaXRpYWwuLm1hc3Rlcl4KK2Zvcm1hdC1wYXRjaCAtLWF0dGFjaCAtLXN0ZG91dCBpbml0aWFsLi5tYXN0ZXIKK2Zvcm1hdC1wYXRjaCAtLWlubGluZSAtLXN0ZG91dCBpbml0aWFsLi5zaWRlCitmb3JtYXQtcGF0Y2ggLS1pbmxpbmUgLS1zdGRvdXQgaW5pdGlhbC4ubWFzdGVyXgorZm9ybWF0LXBhdGNoIC0taW5saW5lIC0tc3Rkb3V0IGluaXRpYWwuLm1hc3RlcgorZm9ybWF0LXBhdGNoIC0taW5saW5lIC0tc3Rkb3V0IC0tc3ViamVjdC1wcmVmaXg9VEVTVENBU0UgaW5pdGlhbC4ubWFzdGVyCitjb25maWcgZm9ybWF0LnN1YmplY3RwcmVmaXggRElGRkVSRU5UX1BSRUZJWAorZm9ybWF0LXBhdGNoIC0taW5saW5lIC0tc3Rkb3V0IGluaXRpYWwuLm1hc3Rlcl5eCitmb3JtYXQtcGF0Y2ggLS1zdGRvdXQgLS1jb3Zlci1sZXR0ZXIgLW4gaW5pdGlhbC4ubWFzdGVyXgorCitkaWZmIC0tYWJicmV2IGluaXRpYWwuLnNpZGUKK2RpZmYgLXIgaW5pdGlhbC4uc2lkZQorZGlmZiAtLXN0YXQgaW5pdGlhbC4uc2lkZQorZGlmZiAtciAtLXN0YXQgaW5pdGlhbC4uc2lkZQorZGlmZiBpbml0aWFsLi5zaWRlCitkaWZmIC0tcGF0Y2gtd2l0aC1zdGF0IGluaXRpYWwuLnNpZGUKK2RpZmYgLS1wYXRjaC13aXRoLXJhdyBpbml0aWFsLi5zaWRlCitkaWZmIC0tcGF0Y2gtd2l0aC1zdGF0IC1yIGluaXRpYWwuLnNpZGUKK2RpZmYgLS1wYXRjaC13aXRoLXJhdyAtciBpbml0aWFsLi5zaWRlCitkaWZmIC0tbmFtZS1zdGF0dXMgZGlyMiBkaXIKK0VPRgorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5jb25maWdfZm9ybWF0LnN1YmplY3RwcmVmaXhfRElGRkVSRU5UX1BSRUZJWCBiL3QvdDQwMTMvZGlmZi5jb25maWdfZm9ybWF0LnN1YmplY3RwcmVmaXhfRElGRkVSRU5UX1BSRUZJWApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGY4OTcwCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmNvbmZpZ19mb3JtYXQuc3ViamVjdHByZWZpeF9ESUZGRVJFTlRfUFJFRklYCkBAIC0wLDAgKzEsMiBAQAorJCBnaXQgY29uZmlnIGZvcm1hdC5zdWJqZWN0cHJlZml4IERJRkZFUkVOVF9QUkVGSVgKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1jY18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5Zjc4YQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1jY18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyCkBAIC0wLDAgKzEsMzQgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLWNjIC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIKKzU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tY2MgZGlyL3N1YgoraW5kZXggY2VhZDMyZSw3Mjg5ZTM1Li45OTI5MTNjCistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQEAgLTEsNiAtMSw0ICsxLDggQEBACisgIEEKKyAgQgorICtDCisgK0QKKyArRQorICtGCisrIDEKKysgMgorZGlmZiAtLWNjIGZpbGUwCitpbmRleCBiNDE0MTA4LGY0NjE1ZGEuLjEwYThhOWYKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEBAIC0xLDYgLTEsNiArMSw5IEBAQAorICAxCisgIDIKKyAgMworICs0CisgKzUKKyArNgorKyBBCisrIEIKKysgQworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9zaWRlIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MWFkOGMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tY2NfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X3NpZGUKQEAgLTAsMCArMSwzOSBAQAorJCBnaXQgZGlmZi10cmVlIC0tY2MgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IHNpZGUKK2M3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTMKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tcGF0Y2gtd2l0aC1zdGF0X21hc3RlciBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1jY18tLXBhdGNoLXdpdGgtc3RhdF9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmMjNiOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1jY18tLXBhdGNoLXdpdGgtc3RhdF9tYXN0ZXIKQEAgLTAsMCArMSwzNCBAQAorJCBnaXQgZGlmZi10cmVlIC0tY2MgLS1wYXRjaC13aXRoLXN0YXQgbWFzdGVyCis1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWNjIGRpci9zdWIKK2luZGV4IGNlYWQzMmUsNzI4OWUzNS4uOTkyOTEzYworLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEBAIC0xLDYgLTEsNCArMSw4IEBAQAorICBBCisgIEIKKyArQworICtECisgK0UKKyArRgorKyAxCisrIDIKK2RpZmYgLS1jYyBmaWxlMAoraW5kZXggYjQxNDEwOCxmNDYxNWRhLi4xMGE4YTlmCistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAQCAtMSw2IC0xLDYgKzEsOSBAQEAKKyAgMQorICAyCisgIDMKKyArNAorICs1CisgKzYKKysgQQorKyBCCisrIEMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1jY18tLXN0YXRfLS1zdW1tYXJ5X21hc3RlciBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1jY18tLXN0YXRfLS1zdW1tYXJ5X21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzZlYjNiCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tc3RhdF8tLXN1bW1hcnlfbWFzdGVyCkBAIC0wLDAgKzEsNiBAQAorJCBnaXQgZGlmZi10cmVlIC0tY2MgLS1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIKKzU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tc3RhdF8tLXN1bW1hcnlfc2lkZSBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1jY18tLXN0YXRfLS1zdW1tYXJ5X3NpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAzNjJiZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1jY18tLXN0YXRfLS1zdW1tYXJ5X3NpZGUKQEAgLTAsMCArMSw4IEBACiskIGdpdCBkaWZmLXRyZWUgLS1jYyAtLXN0YXQgLS1zdW1tYXJ5IHNpZGUKK2M3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1jY18tLXN0YXRfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tc3RhdF9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlN2YzMwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1jY18tLXN0YXRfbWFzdGVyCkBAIC0wLDAgKzEsNiBAQAorJCBnaXQgZGlmZi10cmVlIC0tY2MgLS1zdGF0IG1hc3RlcgorNTlkMzE0YWQ2ZjM1NmRkMDg2MDFhNGNkNWU1MzAzODFkYTNlM2M2NAorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tY2NfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjX21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWNiNGUxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjX21hc3RlcgpAQCAtMCwwICsxLDMwIEBACiskIGdpdCBkaWZmLXRyZWUgLS1jYyBtYXN0ZXIKKzU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKK2RpZmYgLS1jYyBkaXIvc3ViCitpbmRleCBjZWFkMzJlLDcyODllMzUuLjk5MjkxM2MKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAQCAtMSw2IC0xLDQgKzEsOCBAQEAKKyAgQQorICBCCisgK0MKKyArRAorICtFCisgK0YKKysgMQorKyAyCitkaWZmIC0tY2MgZmlsZTAKK2luZGV4IGI0MTQxMDgsZjQ2MTVkYS4uMTBhOGE5ZgorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQEAgLTEsNiAtMSw2ICsxLDkgQEBACisgIDEKKyAgMgorICAzCisgKzQKKyArNQorICs2CisrIEEKKysgQgorKyBDCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcGF0Y2gtd2l0aC1yYXdfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wYXRjaC13aXRoLXJhd19pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMTc3YWIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcGF0Y2gtd2l0aC1yYXdfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXBhdGNoLXdpdGgtcmF3IGluaXRpYWwKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDkwNWIxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXBhdGNoLXdpdGgtc3RhdF9pbml0aWFsCkBAIC0wLDAgKzEsMiBAQAorJCBnaXQgZGlmZi10cmVlIC0tcGF0Y2gtd2l0aC1zdGF0IGluaXRpYWwKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLS1wYXRjaC13aXRoLXJhd19pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYjhiNDUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLS1wYXRjaC13aXRoLXJhd19pbml0aWFsCkBAIC0wLDAgKzEsMiBAQAorJCBnaXQgZGlmZi10cmVlIC0tcHJldHR5PW9uZWxpbmUgLS1wYXRjaC13aXRoLXJhdyBpbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV8tLXBhdGNoLXdpdGgtc3RhdF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZGRlNGYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eT1vbmVsaW5lIC0tcGF0Y2gtd2l0aC1zdGF0IGluaXRpYWwKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV8tLXJvb3RfLS1wYXRjaC13aXRoLXJhd19pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eT1vbmVsaW5lXy0tcm9vdF8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q3OWYxYQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV8tLXJvb3RfLS1wYXRjaC13aXRoLXJhd19pbml0aWFsCkBAIC0wLDAgKzEsMzMgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eT1vbmVsaW5lIC0tcm9vdCAtLXBhdGNoLXdpdGgtcmF3IGluaXRpYWwKKzQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EgSW5pdGlhbAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAzNWQyNDJiYTc5YWU4OWFjNjk1ZTI2YjNkNGMyN2E4ZTZmMDI4ZjllIEEJZGlyL3N1YgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMWU3OWMzMmE4Yzk5YzU1N2YwNzU3ZGE3Y2I2ZDY1YjM0MTQ0NjZkIEEJZmlsZTAKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDFlNzljMzJhOGM5OWM1NTdmMDc1N2RhN2NiNmQ2NWIzNDE0NDY2ZCBBCWZpbGUyCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjM1ZDI0MmIKKy0tLSAvZGV2L251bGwKKysrKyBiL2Rpci9zdWIKK0BAIC0wLDAgKzEsMiBAQAorK0EKKytCCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUwCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTIKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eT1vbmVsaW5lXy0tcm9vdF8tLXBhdGNoLXdpdGgtc3RhdF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eT1vbmVsaW5lXy0tcm9vdF8tLXBhdGNoLXdpdGgtc3RhdF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YzMzM2EKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLS1yb290Xy0tcGF0Y2gtd2l0aC1zdGF0X2luaXRpYWwKQEAgLTAsMCArMSwzNCBAQAorJCBnaXQgZGlmZi10cmVlIC0tcHJldHR5PW9uZWxpbmUgLS1yb290IC0tcGF0Y2gtd2l0aC1zdGF0IGluaXRpYWwKKzQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EgSW5pdGlhbAorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA4IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjM1ZDI0MmIKKy0tLSAvZGV2L251bGwKKysrKyBiL2Rpci9zdWIKK0BAIC0wLDAgKzEsMiBAQAorK0EKKytCCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUwCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTIKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eT1vbmVsaW5lXy0tcm9vdF8tcF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eT1vbmVsaW5lXy0tcm9vdF8tcF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNTA5MmMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLS1yb290Xy1wX2luaXRpYWwKQEAgLTAsMCArMSwyOSBAQAorJCBnaXQgZGlmZi10cmVlIC0tcHJldHR5PW9uZWxpbmUgLS1yb290IC1wIGluaXRpYWwKKzQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EgSW5pdGlhbAorZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLS1yb290X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLS1yb290X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg5MjBhYwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV8tLXJvb3RfaW5pdGlhbApAQCAtMCwwICsxLDYgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eT1vbmVsaW5lIC0tcm9vdCBpbml0aWFsCis0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhIEluaXRpYWwKKzowMDAwMDAgMDQwMDAwIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgZGE3YTMzZmE3N2Q4MDY2ZDY2OTg2NDM5NDBjZTU4NjBmZTJkN2ZiMyBBCWRpcgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMWU3OWMzMmE4Yzk5YzU1N2YwNzU3ZGE3Y2I2ZDY1YjM0MTQ0NjZkIEEJZmlsZTAKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDFlNzljMzJhOGM5OWM1NTdmMDc1N2RhN2NiNmQ2NWIzNDE0NDY2ZCBBCWZpbGUyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLXBfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV8tcF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0Yjc2YmYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLXBfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eT1vbmVsaW5lIC1wIGluaXRpYWwKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eT1vbmVsaW5lX2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUwOTcwZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV9pbml0aWFsCkBAIC0wLDAgKzEsMiBAQAorJCBnaXQgZGlmZi10cmVlIC0tcHJldHR5PW9uZWxpbmUgaW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcGF0Y2gtd2l0aC1yYXdfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTg1MzE2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwKQEAgLTAsMCArMSwyIEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLS1wYXRjaC13aXRoLXJhdyBpbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcGF0Y2gtd2l0aC1zdGF0X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcGF0Y2gtd2l0aC1zdGF0X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUwODIzOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eSAtLXBhdGNoLXdpdGgtc3RhdCBpbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcGF0Y2gtd2l0aC1zdGF0X3NpZGUgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcGF0Y2gtd2l0aC1zdGF0X3NpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzMGU3ZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1wYXRjaC13aXRoLXN0YXRfc2lkZQpAQCAtMCwwICsxLDQzIEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLS1wYXRjaC13aXRoLXN0YXQgc2lkZQorY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXJvb3RfLS1wYXRjaC13aXRoLXJhd19pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXJvb3RfLS1wYXRjaC13aXRoLXJhd19pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMjAzYmQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwKQEAgLTAsMCArMSwzOCBAQAorJCBnaXQgZGlmZi10cmVlIC0tcHJldHR5IC0tcm9vdCAtLXBhdGNoLXdpdGgtcmF3IGluaXRpYWwKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDM1ZDI0MmJhNzlhZTg5YWM2OTVlMjZiM2Q0YzI3YThlNmYwMjhmOWUgQQlkaXIvc3ViCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAxZTc5YzMyYThjOTljNTU3ZjA3NTdkYTdjYjZkNjViMzQxNDQ2NmQgQQlmaWxlMAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMWU3OWMzMmE4Yzk5YzU1N2YwNzU3ZGE3Y2I2ZDY1YjM0MTQ0NjZkIEEJZmlsZTIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXBhdGNoLXdpdGgtc3RhdF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXJvb3RfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGZhNmFmCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXJvb3RfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbApAQCAtMCwwICsxLDM5IEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLS1yb290IC0tcGF0Y2gtd2l0aC1zdGF0IGluaXRpYWwKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyArKysKKyAzIGZpbGVzIGNoYW5nZWQsIDggaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXN0YXRfLS1zdW1tYXJ5X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXN0YXRfLS1zdW1tYXJ5X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNiZmNlMgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1yb290Xy0tc3RhdF8tLXN1bW1hcnlfaW5pdGlhbApAQCAtMCwwICsxLDE1IEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLS1yb290IC0tc3RhdCAtLXN1bW1hcnkgaW5pdGlhbAorY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCisKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzICsrKworIDMgZmlsZXMgY2hhbmdlZCwgOCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBkaXIvc3ViCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUwCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXN0YXRfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1yb290Xy0tc3RhdF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNTRhYTQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXN0YXRfaW5pdGlhbApAQCAtMCwwICsxLDEyIEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLS1yb290IC0tc3RhdCBpbml0aWFsCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKworIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA4IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXN1bW1hcnlfLXJfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1yb290Xy0tc3VtbWFyeV8tcl9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZGFhZmIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXN1bW1hcnlfLXJfaW5pdGlhbApAQCAtMCwwICsxLDExIEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLS1yb290IC0tc3VtbWFyeSAtciBpbml0aWFsCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKworIGNyZWF0ZSBtb2RlIDEwMDY0NCBkaXIvc3ViCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUwCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXN1bW1hcnlfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1yb290Xy0tc3VtbWFyeV9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZTVmNzQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXN1bW1hcnlfaW5pdGlhbApAQCAtMCwwICsxLDExIEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLS1yb290IC0tc3VtbWFyeSBpbml0aWFsCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKworIGNyZWF0ZSBtb2RlIDEwMDY0NCBkaXIvc3ViCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUwCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tcF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXJvb3RfLXBfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDQxMWY2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXJvb3RfLXBfaW5pdGlhbApAQCAtMCwwICsxLDM0IEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLS1yb290IC1wIGluaXRpYWwKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4zNWQyNDJiCistLS0gL2Rldi9udWxsCisrKysgYi9kaXIvc3ViCitAQCAtMCwwICsxLDIgQEAKKytBCisrQgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMAorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUyCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1yb290X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZTMyZWEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF9pbml0aWFsCkBAIC0wLDAgKzEsMTEgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eSAtLXJvb3QgaW5pdGlhbAorY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCisKKzowMDAwMDAgMDQwMDAwIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgZGE3YTMzZmE3N2Q4MDY2ZDY2OTg2NDM5NDBjZTU4NjBmZTJkN2ZiMyBBCWRpcgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMWU3OWMzMmE4Yzk5YzU1N2YwNzU3ZGE3Y2I2ZDY1YjM0MTQ0NjZkIEEJZmlsZTAKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDFlNzljMzJhOGM5OWM1NTdmMDc1N2RhN2NiNmQ2NWIzNDE0NDY2ZCBBCWZpbGUyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tc3RhdF8tLXN1bW1hcnlfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1zdGF0Xy0tc3VtbWFyeV9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMjk4M2EKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tc3RhdF8tLXN1bW1hcnlfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eSAtLXN0YXQgLS1zdW1tYXJ5IGluaXRpYWwKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1zdGF0X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tc3RhdF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZGNmYjQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tc3RhdF9pbml0aWFsCkBAIC0wLDAgKzEsMiBAQAorJCBnaXQgZGlmZi10cmVlIC0tcHJldHR5IC0tc3RhdCBpbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tc3VtbWFyeV9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXN1bW1hcnlfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmMyYzRmCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXN1bW1hcnlfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eSAtLXN1bW1hcnkgaW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tcF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tcF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOTk0MmYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy1wX2luaXRpYWwKQEAgLTAsMCArMSwyIEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLXAgaW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tcF9zaWRlIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tcF9zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5OTNhYTcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy1wX3NpZGUKQEAgLTAsMCArMSwzOCBAQAorJCBnaXQgZGlmZi10cmVlIC0tcHJldHR5IC1wIHNpZGUKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3MTViZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eSBpbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5X3NpZGUgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5X3NpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTliNmUxYwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfc2lkZQpAQCAtMCwwICsxLDExIEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgc2lkZQorY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCisKKzowNDAwMDAgMDQwMDAwIGRhN2EzM2ZhNzdkODA2NmQ2Njk4NjQzOTQwY2U1ODYwZmUyZDdmYjMgZjk3N2VkNDZhZTY4NzNjMWMzMGFiODc4ZTE1YTRhY2NlZGMzNjE4YiBNCWRpcgorOjEwMDY0NCAxMDA2NDQgMDFlNzljMzJhOGM5OWM1NTdmMDc1N2RhN2NiNmQ2NWIzNDE0NDY2ZCBmNDYxNWRhNjc0YzA5ZGYzMjJkNmJhOGQ2YjIxZWNmYjFiMWJhNTEwIE0JZmlsZTAKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgNzI4OWUzNWJmZjMyNzI3YzA4ZGRhMjA3NTExYmVjMTM4ZmRiOWVhNSBBCWZpbGUzCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tLWFiYnJldl9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXJvb3RfLS1hYmJyZXZfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWE4NGIyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXJvb3RfLS1hYmJyZXZfaW5pdGlhbApAQCAtMCwwICsxLDYgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXJvb3QgLS1hYmJyZXYgaW5pdGlhbAorNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorOjAwMDAwMCAwNDAwMDAgMDAwMDAwMC4uLiBkYTdhMzNmLi4uIEEJZGlyCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIDAxZTc5YzMuLi4gQQlmaWxlMAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiAwMWU3OWMzLi4uIEEJZmlsZTIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1yb290Xy0tcGF0Y2gtd2l0aC1yYXdfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1yb290Xy0tcGF0Y2gtd2l0aC1yYXdfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjk1ZTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXJvb3RfLS1wYXRjaC13aXRoLXJhd19pbml0aWFsCkBAIC0wLDAgKzEsMzMgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXJvb3QgLS1wYXRjaC13aXRoLXJhdyBpbml0aWFsCis0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDM1ZDI0MmJhNzlhZTg5YWM2OTVlMjZiM2Q0YzI3YThlNmYwMjhmOWUgQQlkaXIvc3ViCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAxZTc5YzMyYThjOTljNTU3ZjA3NTdkYTdjYjZkNjViMzQxNDQ2NmQgQQlmaWxlMAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMWU3OWMzMmE4Yzk5YzU1N2YwNzU3ZGE3Y2I2ZDY1YjM0MTQ0NjZkIEEJZmlsZTIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tLXBhdGNoLXdpdGgtc3RhdF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXJvb3RfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTYyYjYyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXJvb3RfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbApAQCAtMCwwICsxLDM0IEBACiskIGdpdCBkaWZmLXRyZWUgLS1yb290IC0tcGF0Y2gtd2l0aC1zdGF0IGluaXRpYWwKKzQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzICsrKworIDMgZmlsZXMgY2hhbmdlZCwgOCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4zNWQyNDJiCistLS0gL2Rldi9udWxsCisrKysgYi9kaXIvc3ViCitAQCAtMCwwICsxLDIgQEAKKytBCisrQgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMAorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUyCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1yb290Xy1wX2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tcF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMTljNzIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tcF9pbml0aWFsCkBAIC0wLDAgKzEsMjkgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXJvb3QgLXAgaW5pdGlhbAorNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tcl8tLWFiYnJldj00X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tcl8tLWFiYnJldj00X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1MzYxNgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1yb290Xy1yXy0tYWJicmV2PTRfaW5pdGlhbApAQCAtMCwwICsxLDYgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXJvb3QgLXIgLS1hYmJyZXY9NCBpbml0aWFsCis0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCis6MDAwMDAwIDEwMDY0NCAwMDAwLi4uIDM1ZDIuLi4gQQlkaXIvc3ViCis6MDAwMDAwIDEwMDY0NCAwMDAwLi4uIDAxZTcuLi4gQQlmaWxlMAorOjAwMDAwMCAxMDA2NDQgMDAwMC4uLiAwMWU3Li4uIEEJZmlsZTIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1yb290Xy1yXy0tYWJicmV2X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tcl8tLWFiYnJldl9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YjQ2MGYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tcl8tLWFiYnJldl9pbml0aWFsCkBAIC0wLDAgKzEsNiBAQAorJCBnaXQgZGlmZi10cmVlIC0tcm9vdCAtciAtLWFiYnJldiBpbml0aWFsCis0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIDM1ZDI0MmIuLi4gQQlkaXIvc3ViCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIDAxZTc5YzMuLi4gQQlmaWxlMAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiAwMWU3OWMzLi4uIEEJZmlsZTIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1yb290Xy1yX2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tcl9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZDQzNWUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tcl9pbml0aWFsCkBAIC0wLDAgKzEsNiBAQAorJCBnaXQgZGlmZi10cmVlIC0tcm9vdCAtciBpbml0aWFsCis0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDM1ZDI0MmJhNzlhZTg5YWM2OTVlMjZiM2Q0YzI3YThlNmYwMjhmOWUgQQlkaXIvc3ViCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAxZTc5YzMyYThjOTljNTU3ZjA3NTdkYTdjYjZkNjViMzQxNDQ2NmQgQQlmaWxlMAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMWU3OWMzMmE4Yzk5YzU1N2YwNzU3ZGE3Y2I2ZDY1YjM0MTQ0NjZkIEEJZmlsZTIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1yb290X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZjZiMDYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF9pbml0aWFsCkBAIC0wLDAgKzEsNiBAQAorJCBnaXQgZGlmZi10cmVlIC0tcm9vdCBpbml0aWFsCis0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCis6MDAwMDAwIDA0MDAwMCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIGRhN2EzM2ZhNzdkODA2NmQ2Njk4NjQzOTQwY2U1ODYwZmUyZDdmYjMgQQlkaXIKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDFlNzljMzJhOGM5OWM1NTdmMDc1N2RhN2NiNmQ2NWIzNDE0NDY2ZCBBCWZpbGUwCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAxZTc5YzMyYThjOTljNTU3ZjA3NTdkYTdjYjZkNjViMzQxNDQ2NmQgQQlmaWxlMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tY18tLWFiYnJldl9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1jXy0tYWJicmV2X21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGU0YWEyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tY18tLWFiYnJldl9tYXN0ZXIKQEAgLTAsMCArMSw1IEBACiskIGdpdCBkaWZmLXRyZWUgLWMgLS1hYmJyZXYgbWFzdGVyCis1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0Cis6OjEwMDY0NCAxMDA2NDQgMTAwNjQ0IGNlYWQzMmUuLi4gNzI4OWUzNS4uLiA5OTI5MTNjLi4uIE1NCWRpci9zdWIKKzo6MTAwNjQ0IDEwMDY0NCAxMDA2NDQgYjQxNDEwOC4uLiBmNDYxNWRhLi4uIDEwYThhOWYuLi4gTU0JZmlsZTAKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLWNfLS1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1jXy0tc3RhdF8tLXN1bW1hcnlfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOWY2NDEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1jXy0tc3RhdF8tLXN1bW1hcnlfbWFzdGVyCkBAIC0wLDAgKzEsNiBAQAorJCBnaXQgZGlmZi10cmVlIC1jIC0tc3RhdCAtLXN1bW1hcnkgbWFzdGVyCis1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLWNfLS1zdGF0Xy0tc3VtbWFyeV9zaWRlIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tY18tLXN0YXRfLS1zdW1tYXJ5X3NpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFmY2NhMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLWNfLS1zdGF0Xy0tc3VtbWFyeV9zaWRlCkBAIC0wLDAgKzEsOCBAQAorJCBnaXQgZGlmZi10cmVlIC1jIC0tc3RhdCAtLXN1bW1hcnkgc2lkZQorYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tY18tLXN0YXRfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tY18tLXN0YXRfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZmU2YTkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1jXy0tc3RhdF9tYXN0ZXIKQEAgLTAsMCArMSw2IEBACiskIGdpdCBkaWZmLXRyZWUgLWMgLS1zdGF0IG1hc3RlcgorNTlkMzE0YWQ2ZjM1NmRkMDg2MDFhNGNkNWU1MzAzODFkYTNlM2M2NAorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1jX21hc3RlciBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLWNfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZDJiYjIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1jX21hc3RlcgpAQCAtMCwwICsxLDUgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtYyBtYXN0ZXIKKzU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKKzo6MTAwNjQ0IDEwMDY0NCAxMDA2NDQgY2VhZDMyZTkyNWIxNDIwYzg0YzE0Y2JmN2NmNzU1ZTdlNDVhZjhhZCA3Mjg5ZTM1YmZmMzI3MjdjMDhkZGEyMDc1MTFiZWMxMzhmZGI5ZWE1IDk5MjkxM2M1YWEwYTU0NzZkMTBjNDllZDBmMjFmYzBjNmQxYWVkZjMgTU0JZGlyL3N1YgorOjoxMDA2NDQgMTAwNjQ0IDEwMDY0NCBiNDE0MTA4ZTgxZTUwOTFmZTA5NzRhMTg1OGI0ZDBkMjJiMTA3ZjcwIGY0NjE1ZGE2NzRjMDlkZjMyMmQ2YmE4ZDZiMjFlY2ZiMWIxYmE1MTAgMTBhOGE5ZjM2NTdmOTFhMTU2YjlmMDE4NGVkNzlhMjBhZGVmOWY3ZiBNTQlmaWxlMAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tcF8tbV9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1wXy1tX21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjBiZWEwCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tcF8tbV9tYXN0ZXIKQEAgLTAsMCArMSw4MCBAQAorJCBnaXQgZGlmZi10cmVlIC1wIC1tIG1hc3RlcgorNTlkMzE0YWQ2ZjM1NmRkMDg2MDFhNGNkNWU1MzAzODFkYTNlM2M2NAorZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCBjZWFkMzJlLi45OTI5MTNjIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTQsMyArNCw1IEBAIEMKKyBECisgRQorIEYKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IGI0MTQxMDguLjEwYThhOWYgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC00LDMgKzQsNiBAQAorIDQKKyA1CisgNgorK0EKKytCCisrQworNTlkMzE0YWQ2ZjM1NmRkMDg2MDFhNGNkNWU1MzAzODFkYTNlM2M2NAorZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA3Mjg5ZTM1Li45OTI5MTNjIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsNCArMSw4IEBACisgQQorIEIKKytDCisrRAorK0UKKytGCisgMQorIDIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCBmNDYxNWRhLi4xMGE4YTlmIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSw2ICsxLDkgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKKyBBCisgQgorIEMKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjFlNjcyMgorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTEKK0BAIC0wLDAgKzEsMyBAQAorK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDFlNzljMy4uMDAwMDAwMAorLS0tIGEvZmlsZTIKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLTEKKy0yCistMworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggNzI4OWUzNS4uMDAwMDAwMAorLS0tIGEvZmlsZTMKKysrKyAvZGV2L251bGwKK0BAIC0xLDQgKzAsMCBAQAorLUEKKy1CCistMQorLTIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLXBfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLXBfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjBjZTg4Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tcF9pbml0aWFsCkBAIC0wLDAgKzEsMiBAQAorJCBnaXQgZGlmZi10cmVlIC1wIGluaXRpYWwKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLXBfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tcF9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE4Mjg3NQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLXBfbWFzdGVyCkBAIC0wLDAgKzEsMiBAQAorJCBnaXQgZGlmZi10cmVlIC1wIG1hc3RlcgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tcl8tLWFiYnJldj00X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1yXy0tYWJicmV2PTRfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWEzYWE1Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tcl8tLWFiYnJldj00X2luaXRpYWwKQEAgLTAsMCArMSwyIEBACiskIGdpdCBkaWZmLXRyZWUgLXIgLS1hYmJyZXY9NCBpbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1yXy0tYWJicmV2X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1yXy0tYWJicmV2X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI2ODliNwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLXJfLS1hYmJyZXZfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtciAtLWFiYnJldiBpbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1yX2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1yX2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2NWQ4MwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLXJfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtciBpbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlX2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlX2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ5ZmM1MwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSBpbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlX21hc3RlciBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOTIyNmYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlX21hc3RlcgpAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSBtYXN0ZXIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmXy0tYWJicmV2X2luaXRpYWwuLnNpZGUgYi90L3Q0MDEzL2RpZmYuZGlmZl8tLWFiYnJldl9pbml0aWFsLi5zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4OGU2NmYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZl8tLWFiYnJldl9pbml0aWFsLi5zaWRlCkBAIC0wLDAgKzEsMzIgQEAKKyQgZ2l0IGRpZmYgLS1hYmJyZXYgaW5pdGlhbC4uc2lkZQorZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmZfLS1uYW1lLXN0YXR1c19kaXIyX2RpciBiL3QvdDQwMTMvZGlmZi5kaWZmXy0tbmFtZS1zdGF0dXNfZGlyMl9kaXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY3ZmRiNwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmXy0tbmFtZS1zdGF0dXNfZGlyMl9kaXIKQEAgLTAsMCArMSwzIEBACiskIGdpdCBkaWZmIC0tbmFtZS1zdGF0dXMgZGlyMiBkaXIKK0EJZGlyL3N1YgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmZfLS1wYXRjaC13aXRoLXJhd18tcl9pbml0aWFsLi5zaWRlIGIvdC90NDAxMy9kaWZmLmRpZmZfLS1wYXRjaC13aXRoLXJhd18tcl9pbml0aWFsLi5zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OTBkYzcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZl8tLXBhdGNoLXdpdGgtcmF3Xy1yX2luaXRpYWwuLnNpZGUKQEAgLTAsMCArMSwzNiBAQAorJCBnaXQgZGlmZiAtLXBhdGNoLXdpdGgtcmF3IC1yIGluaXRpYWwuLnNpZGUKKzoxMDA2NDQgMTAwNjQ0IDM1ZDI0MmIuLi4gNzI4OWUzNS4uLiBNCWRpci9zdWIKKzoxMDA2NDQgMTAwNjQ0IDAxZTc5YzMuLi4gZjQ2MTVkYS4uLiBNCWZpbGUwCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIDcyODllMzUuLi4gQQlmaWxlMworCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZl8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwuLnNpZGUgYi90L3Q0MDEzL2RpZmYuZGlmZl8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwuLnNpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIxZDVkYwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmXy0tcGF0Y2gtd2l0aC1yYXdfaW5pdGlhbC4uc2lkZQpAQCAtMCwwICsxLDM2IEBACiskIGdpdCBkaWZmIC0tcGF0Y2gtd2l0aC1yYXcgaW5pdGlhbC4uc2lkZQorOjEwMDY0NCAxMDA2NDQgMzVkMjQyYi4uLiA3Mjg5ZTM1Li4uIE0JZGlyL3N1YgorOjEwMDY0NCAxMDA2NDQgMDFlNzljMy4uLiBmNDYxNWRhLi4uIE0JZmlsZTAKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAuLi4gNzI4OWUzNS4uLiBBCWZpbGUzCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmXy0tcGF0Y2gtd2l0aC1zdGF0Xy1yX2luaXRpYWwuLnNpZGUgYi90L3Q0MDEzL2RpZmYuZGlmZl8tLXBhdGNoLXdpdGgtc3RhdF8tcl9pbml0aWFsLi5zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZDMxN2EKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZl8tLXBhdGNoLXdpdGgtc3RhdF8tcl9pbml0aWFsLi5zaWRlCkBAIC0wLDAgKzEsMzcgQEAKKyQgZ2l0IGRpZmYgLS1wYXRjaC13aXRoLXN0YXQgLXIgaW5pdGlhbC4uc2lkZQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZl8tLXBhdGNoLXdpdGgtc3RhdF9pbml0aWFsLi5zaWRlIGIvdC90NDAxMy9kaWZmLmRpZmZfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbC4uc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjUwNjI5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmZfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbC4uc2lkZQpAQCAtMCwwICsxLDM3IEBACiskIGdpdCBkaWZmIC0tcGF0Y2gtd2l0aC1zdGF0IGluaXRpYWwuLnNpZGUKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmZfLS1zdGF0X2luaXRpYWwuLnNpZGUgYi90L3Q0MDEzL2RpZmYuZGlmZl8tLXN0YXRfaW5pdGlhbC4uc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTE3YjVkCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmZfLS1zdGF0X2luaXRpYWwuLnNpZGUKQEAgLTAsMCArMSw2IEBACiskIGdpdCBkaWZmIC0tc3RhdCBpbml0aWFsLi5zaWRlCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZl8tcl8tLXN0YXRfaW5pdGlhbC4uc2lkZSBiL3QvdDQwMTMvZGlmZi5kaWZmXy1yXy0tc3RhdF9pbml0aWFsLi5zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NTIyMGQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZl8tcl8tLXN0YXRfaW5pdGlhbC4uc2lkZQpAQCAtMCwwICsxLDYgQEAKKyQgZ2l0IGRpZmYgLXIgLS1zdGF0IGluaXRpYWwuLnNpZGUKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmXy1yX2luaXRpYWwuLnNpZGUgYi90L3Q0MDEzL2RpZmYuZGlmZl8tcl9pbml0aWFsLi5zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYjJmZTIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZl8tcl9pbml0aWFsLi5zaWRlCkBAIC0wLDAgKzEsMzIgQEAKKyQgZ2l0IGRpZmYgLXIgaW5pdGlhbC4uc2lkZQorZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmZfaW5pdGlhbC4uc2lkZSBiL3QvdDQwMTMvZGlmZi5kaWZmX2luaXRpYWwuLnNpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhZGFmNQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmX2luaXRpYWwuLnNpZGUKQEAgLTAsMCArMSwzMiBAQAorJCBnaXQgZGlmZiBpbml0aWFsLi5zaWRlCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZm9ybWF0LXBhdGNoXy0tYXR0YWNoXy0tc3Rkb3V0X2luaXRpYWwuLm1hc3RlciBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1hdHRhY2hfLS1zdGRvdXRfaW5pdGlhbC4ubWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjg5MWYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZm9ybWF0LXBhdGNoXy0tYXR0YWNoXy0tc3Rkb3V0X2luaXRpYWwuLm1hc3RlcgpAQCAtMCwwICsxLDE2NCBAQAorJCBnaXQgZm9ybWF0LXBhdGNoIC0tYXR0YWNoIC0tc3Rkb3V0IGluaXRpYWwuLm1hc3RlcgorRnJvbSAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDE6MDAgKzAwMDAKK1N1YmplY3Q6IFtQQVRDSF0gU2Vjb25kCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSItLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbiIKKworVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtODsgZm9ybWF0PWZpeGVkCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CisKKworVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCisgZGVsZXRlIG1vZGUgMTAwNjQ0IGZpbGUyCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQveC1wYXRjaDsgbmFtZT0iMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NC5kaWZmIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9IjFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQuZGlmZiIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmI0MTQxMDggMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworKzQKKys1CisrNgorZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDFlNzljMy4uMDAwMDAwMAorLS0tIGEvZmlsZTIKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLTEKKy0yCistMworCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uLS0KKworCisKK0Zyb20gOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiBNb24sIDI2IEp1biAyMDA2IDAwOjAyOjAwICswMDAwCitTdWJqZWN0OiBbUEFUQ0hdIFRoaXJkCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSItLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbiIKKworVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtODsgZm9ybWF0PWZpeGVkCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CisKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTEgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUxCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQveC1wYXRjaDsgbmFtZT0iOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMC5kaWZmIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9IjlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAuZGlmZiIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCisKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4tLQorCisKKworRnJvbSBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDM6MDAgKzAwMDAKK1N1YmplY3Q6IFtQQVRDSF0gU2lkZQorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4iCisKK1RoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTg7IGZvcm1hdD1maXhlZAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTMKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC94LXBhdGNoOyBuYW1lPSJjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhLmRpZmYiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CitDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0iYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YS5kaWZmIgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCisKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4tLQorCisKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1hdHRhY2hfLS1zdGRvdXRfaW5pdGlhbC4ubWFzdGVyXiBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1hdHRhY2hfLS1zdGRvdXRfaW5pdGlhbC4ubWFzdGVyXgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTAyNTg3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLWF0dGFjaF8tLXN0ZG91dF9pbml0aWFsLi5tYXN0ZXJeCkBAIC0wLDAgKzEsMTA2IEBACiskIGdpdCBmb3JtYXQtcGF0Y2ggLS1hdHRhY2ggLS1zdGRvdXQgaW5pdGlhbC4ubWFzdGVyXgorRnJvbSAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDE6MDAgKzAwMDAKK1N1YmplY3Q6IFtQQVRDSF0gU2Vjb25kCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSItLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbiIKKworVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtODsgZm9ybWF0PWZpeGVkCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CisKKworVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCisgZGVsZXRlIG1vZGUgMTAwNjQ0IGZpbGUyCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQveC1wYXRjaDsgbmFtZT0iMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NC5kaWZmIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9IjFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQuZGlmZiIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmI0MTQxMDggMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworKzQKKys1CisrNgorZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDFlNzljMy4uMDAwMDAwMAorLS0tIGEvZmlsZTIKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLTEKKy0yCistMworCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uLS0KKworCisKK0Zyb20gOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiBNb24sIDI2IEp1biAyMDA2IDAwOjAyOjAwICswMDAwCitTdWJqZWN0OiBbUEFUQ0hdIFRoaXJkCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSItLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbiIKKworVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtODsgZm9ybWF0PWZpeGVkCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CisKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTEgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUxCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQveC1wYXRjaDsgbmFtZT0iOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMC5kaWZmIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9IjlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAuZGlmZiIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCisKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4tLQorCisKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1hdHRhY2hfLS1zdGRvdXRfaW5pdGlhbC4uc2lkZSBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1hdHRhY2hfLS1zdGRvdXRfaW5pdGlhbC4uc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmY4MjhlCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLWF0dGFjaF8tLXN0ZG91dF9pbml0aWFsLi5zaWRlCkBAIC0wLDAgKzEsNTkgQEAKKyQgZ2l0IGZvcm1hdC1wYXRjaCAtLWF0dGFjaCAtLXN0ZG91dCBpbml0aWFsLi5zaWRlCitGcm9tIGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogTW9uLCAyNiBKdW4gMjAwNiAwMDowMzowMCArMDAwMAorU3ViamVjdDogW1BBVENIXSBTaWRlCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSItLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbiIKKworVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtODsgZm9ybWF0PWZpeGVkCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CisKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMworLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbgorQ29udGVudC1UeXBlOiB0ZXh0L3gtcGF0Y2g7IG5hbWU9ImM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEuZGlmZiIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPSJjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhLmRpZmYiCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKworLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbi0tCisKKworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLWlubGluZV8tLXN0ZG91dF8tLXN1YmplY3QtcHJlZml4PVRFU1RDQVNFX2luaXRpYWwuLm1hc3RlciBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1pbmxpbmVfLS1zdGRvdXRfLS1zdWJqZWN0LXByZWZpeD1URVNUQ0FTRV9pbml0aWFsLi5tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwOTNiZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1pbmxpbmVfLS1zdGRvdXRfLS1zdWJqZWN0LXByZWZpeD1URVNUQ0FTRV9pbml0aWFsLi5tYXN0ZXIKQEAgLTAsMCArMSwxNjQgQEAKKyQgZ2l0IGZvcm1hdC1wYXRjaCAtLWlubGluZSAtLXN0ZG91dCAtLXN1YmplY3QtcHJlZml4PVRFU1RDQVNFIGluaXRpYWwuLm1hc3RlcgorRnJvbSAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDE6MDAgKzAwMDAKK1N1YmplY3Q6IFtURVNUQ0FTRV0gU2Vjb25kCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSItLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbiIKKworVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtODsgZm9ybWF0PWZpeGVkCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CisKKworVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCisgZGVsZXRlIG1vZGUgMTAwNjQ0IGZpbGUyCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQveC1wYXRjaDsgbmFtZT0iMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NC5kaWZmIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyBmaWxlbmFtZT0iMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NC5kaWZmIgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uYjQxNDEwOCAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrNAorKzUKKys2CitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMWU3OWMzLi4wMDAwMDAwCistLS0gYS9maWxlMgorKysrIC9kZXYvbnVsbAorQEAgLTEsMyArMCwwIEBACistMQorLTIKKy0zCisKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4tLQorCisKKworRnJvbSA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDI6MDAgKzAwMDAKK1N1YmplY3Q6IFtURVNUQ0FTRV0gVGhpcmQKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uIgorCitUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LgorLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbgorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04OyBmb3JtYXQ9Zml4ZWQKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKKworLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMSAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTEKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC94LXBhdGNoOyBuYW1lPSI5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwLmRpZmYiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSI5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwLmRpZmYiCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjFlNjcyMgorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTEKK0BAIC0wLDAgKzEsMyBAQAorK0EKKytCCisrQworCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uLS0KKworCisKK0Zyb20gYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiBNb24sIDI2IEp1biAyMDA2IDAwOjAzOjAwICswMDAwCitTdWJqZWN0OiBbVEVTVENBU0VdIFNpZGUKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uIgorCitUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LgorLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbgorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04OyBmb3JtYXQ9Zml4ZWQKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKKworLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUzCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQveC1wYXRjaDsgbmFtZT0iYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YS5kaWZmIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyBmaWxlbmFtZT0iYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YS5kaWZmIgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCisKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4tLQorCisKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1pbmxpbmVfLS1zdGRvdXRfaW5pdGlhbC4ubWFzdGVyIGIvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLWlubGluZV8tLXN0ZG91dF9pbml0aWFsLi5tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExMTBjMAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1pbmxpbmVfLS1zdGRvdXRfaW5pdGlhbC4ubWFzdGVyCkBAIC0wLDAgKzEsMTY0IEBACiskIGdpdCBmb3JtYXQtcGF0Y2ggLS1pbmxpbmUgLS1zdGRvdXQgaW5pdGlhbC4ubWFzdGVyCitGcm9tIDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogTW9uLCAyNiBKdW4gMjAwNiAwMDowMTowMCArMDAwMAorU3ViamVjdDogW1BBVENIXSBTZWNvbmQKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uIgorCitUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LgorLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbgorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04OyBmb3JtYXQ9Zml4ZWQKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKKworCitUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyAtLS0KKyAzIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKKyBkZWxldGUgbW9kZSAxMDA2NDQgZmlsZTIKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC94LXBhdGNoOyBuYW1lPSIxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0LmRpZmYiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSIxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0LmRpZmYiCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5iNDE0MTA4IDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKKworLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbi0tCisKKworCitGcm9tIDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogTW9uLCAyNiBKdW4gMjAwNiAwMDowMjowMCArMDAwMAorU3ViamVjdDogW1BBVENIXSBUaGlyZAorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4iCisKK1RoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTg7IGZvcm1hdD1maXhlZAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUxICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMQorLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbgorQ29udGVudC1UeXBlOiB0ZXh0L3gtcGF0Y2g7IG5hbWU9IjlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAuZGlmZiIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWU9IjlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAuZGlmZiIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCisKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4tLQorCisKKworRnJvbSBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDM6MDAgKzAwMDAKK1N1YmplY3Q6IFtQQVRDSF0gU2lkZQorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4iCisKK1RoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTg7IGZvcm1hdD1maXhlZAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTMKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC94LXBhdGNoOyBuYW1lPSJjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhLmRpZmYiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSJjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhLmRpZmYiCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKworLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbi0tCisKKworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLWlubGluZV8tLXN0ZG91dF9pbml0aWFsLi5tYXN0ZXJeIGIvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLWlubGluZV8tLXN0ZG91dF9pbml0aWFsLi5tYXN0ZXJeCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZTllYTQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZm9ybWF0LXBhdGNoXy0taW5saW5lXy0tc3Rkb3V0X2luaXRpYWwuLm1hc3Rlcl4KQEAgLTAsMCArMSwxMDYgQEAKKyQgZ2l0IGZvcm1hdC1wYXRjaCAtLWlubGluZSAtLXN0ZG91dCBpbml0aWFsLi5tYXN0ZXJeCitGcm9tIDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogTW9uLCAyNiBKdW4gMjAwNiAwMDowMTowMCArMDAwMAorU3ViamVjdDogW1BBVENIXSBTZWNvbmQKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uIgorCitUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LgorLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbgorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04OyBmb3JtYXQ9Zml4ZWQKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKKworCitUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyAtLS0KKyAzIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKKyBkZWxldGUgbW9kZSAxMDA2NDQgZmlsZTIKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC94LXBhdGNoOyBuYW1lPSIxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0LmRpZmYiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSIxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0LmRpZmYiCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5iNDE0MTA4IDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKKworLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbi0tCisKKworCitGcm9tIDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogTW9uLCAyNiBKdW4gMjAwNiAwMDowMjowMCArMDAwMAorU3ViamVjdDogW1BBVENIXSBUaGlyZAorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4iCisKK1RoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTg7IGZvcm1hdD1maXhlZAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUxICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMQorLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbgorQ29udGVudC1UeXBlOiB0ZXh0L3gtcGF0Y2g7IG5hbWU9IjlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAuZGlmZiIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWU9IjlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAuZGlmZiIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCisKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4tLQorCisKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1pbmxpbmVfLS1zdGRvdXRfaW5pdGlhbC4ubWFzdGVyXl4gYi90L3Q0MDEzL2RpZmYuZm9ybWF0LXBhdGNoXy0taW5saW5lXy0tc3Rkb3V0X2luaXRpYWwuLm1hc3Rlcl5eCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZTgxZTEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZm9ybWF0LXBhdGNoXy0taW5saW5lXy0tc3Rkb3V0X2luaXRpYWwuLm1hc3Rlcl5eCkBAIC0wLDAgKzEsNjAgQEAKKyQgZ2l0IGZvcm1hdC1wYXRjaCAtLWlubGluZSAtLXN0ZG91dCBpbml0aWFsLi5tYXN0ZXJeXgorRnJvbSAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDE6MDAgKzAwMDAKK1N1YmplY3Q6IFtESUZGRVJFTlRfUFJFRklYXSBTZWNvbmQKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uIgorCitUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LgorLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbgorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04OyBmb3JtYXQ9Zml4ZWQKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKKworCitUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyAtLS0KKyAzIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKKyBkZWxldGUgbW9kZSAxMDA2NDQgZmlsZTIKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC94LXBhdGNoOyBuYW1lPSIxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0LmRpZmYiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSIxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0LmRpZmYiCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5iNDE0MTA4IDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKKworLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbi0tCisKKworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLWlubGluZV8tLXN0ZG91dF9pbml0aWFsLi5zaWRlIGIvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLWlubGluZV8tLXN0ZG91dF9pbml0aWFsLi5zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YWU5MjMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZm9ybWF0LXBhdGNoXy0taW5saW5lXy0tc3Rkb3V0X2luaXRpYWwuLnNpZGUKQEAgLTAsMCArMSw1OSBAQAorJCBnaXQgZm9ybWF0LXBhdGNoIC0taW5saW5lIC0tc3Rkb3V0IGluaXRpYWwuLnNpZGUKK0Zyb20gYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiBNb24sIDI2IEp1biAyMDA2IDAwOjAzOjAwICswMDAwCitTdWJqZWN0OiBbUEFUQ0hdIFNpZGUKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uIgorCitUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LgorLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbgorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04OyBmb3JtYXQ9Zml4ZWQKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKKworLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUzCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQveC1wYXRjaDsgbmFtZT0iYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YS5kaWZmIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyBmaWxlbmFtZT0iYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YS5kaWZmIgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCisKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4tLQorCisKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1zdGRvdXRfLS1jb3Zlci1sZXR0ZXJfLW5faW5pdGlhbC4ubWFzdGVyXiBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1zdGRvdXRfLS1jb3Zlci1sZXR0ZXJfLW5faW5pdGlhbC4ubWFzdGVyXgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGFiNGJmCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLXN0ZG91dF8tLWNvdmVyLWxldHRlcl8tbl9pbml0aWFsLi5tYXN0ZXJeCkBAIC0wLDAgKzEsMTAwIEBACiskIGdpdCBmb3JtYXQtcGF0Y2ggLS1zdGRvdXQgLS1jb3Zlci1sZXR0ZXIgLW4gaW5pdGlhbC4ubWFzdGVyXgorRnJvbSA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQyBPIE1pdHRlciA8Y29tbWl0dGVyQGV4YW1wbGUuY29tPgorRGF0ZTogTW9uLCAyNiBKdW4gMjAwNiAwMDowNTowMCArMDAwMAorU3ViamVjdDogW0RJRkZFUkVOVF9QUkVGSVggMC8yXSAqKiogU1VCSkVDVCBIRVJFICoqKgorCisqKiogQkxVUkIgSEVSRSAqKioKKworQSBVIFRob3IgKDIpOgorICBTZWNvbmQKKyAgVGhpcmQKKworIGRpci9zdWIgfCAgICA0ICsrKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMSAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyAtLS0KKyA0IGZpbGVzIGNoYW5nZWQsIDEwIGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUxCisgZGVsZXRlIG1vZGUgMTAwNjQ0IGZpbGUyCisKK0Zyb20gMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiBNb24sIDI2IEp1biAyMDA2IDAwOjAxOjAwICswMDAwCitTdWJqZWN0OiBbRElGRkVSRU5UX1BSRUZJWCAxLzJdIFNlY29uZAorCitUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyAtLS0KKyAzIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKKyBkZWxldGUgbW9kZSAxMDA2NDQgZmlsZTIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmI0MTQxMDggMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworKzQKKys1CisrNgorZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDFlNzljMy4uMDAwMDAwMAorLS0tIGEvZmlsZTIKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLTEKKy0yCistMworLS0gCitnLWktdC0tdi1lLXItcy1pLW8tbgorCisKK0Zyb20gOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiBNb24sIDI2IEp1biAyMDA2IDAwOjAyOjAwICswMDAwCitTdWJqZWN0OiBbRElGRkVSRU5UX1BSRUZJWCAyLzJdIFRoaXJkCisKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTEgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUxCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjFlNjcyMgorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTEKK0BAIC0wLDAgKzEsMyBAQAorK0EKKytCCisrQworLS0gCitnLWktdC0tdi1lLXItcy1pLW8tbgorCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZm9ybWF0LXBhdGNoXy0tc3Rkb3V0X2luaXRpYWwuLm1hc3RlciBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1zdGRvdXRfaW5pdGlhbC4ubWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiODhjYTQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZm9ybWF0LXBhdGNoXy0tc3Rkb3V0X2luaXRpYWwuLm1hc3RlcgpAQCAtMCwwICsxLDEyNyBAQAorJCBnaXQgZm9ybWF0LXBhdGNoIC0tc3Rkb3V0IGluaXRpYWwuLm1hc3RlcgorRnJvbSAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDE6MDAgKzAwMDAKK1N1YmplY3Q6IFtQQVRDSF0gU2Vjb25kCisKK1RoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzIC0tLQorIDMgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQorIGRlbGV0ZSBtb2RlIDEwMDY0NCBmaWxlMgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uYjQxNDEwOCAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrNAorKzUKKys2CitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMWU3OWMzLi4wMDAwMDAwCistLS0gYS9maWxlMgorKysrIC9kZXYvbnVsbAorQEAgLTEsMyArMCwwIEBACistMQorLTIKKy0zCistLSAKK2ctaS10LS12LWUtci1zLWktby1uCisKKworRnJvbSA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDI6MDAgKzAwMDAKK1N1YmplY3Q6IFtQQVRDSF0gVGhpcmQKKworLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMSAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTEKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCistLSAKK2ctaS10LS12LWUtci1zLWktby1uCisKKworRnJvbSBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDM6MDAgKzAwMDAKK1N1YmplY3Q6IFtQQVRDSF0gU2lkZQorCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTMKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorLS0gCitnLWktdC0tdi1lLXItcy1pLW8tbgorCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZm9ybWF0LXBhdGNoXy0tc3Rkb3V0X2luaXRpYWwuLm1hc3Rlcl4gYi90L3Q0MDEzL2RpZmYuZm9ybWF0LXBhdGNoXy0tc3Rkb3V0X2luaXRpYWwuLm1hc3Rlcl4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhNGI4OAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1zdGRvdXRfaW5pdGlhbC4ubWFzdGVyXgpAQCAtMCwwICsxLDgxIEBACiskIGdpdCBmb3JtYXQtcGF0Y2ggLS1zdGRvdXQgaW5pdGlhbC4ubWFzdGVyXgorRnJvbSAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDE6MDAgKzAwMDAKK1N1YmplY3Q6IFtQQVRDSF0gU2Vjb25kCisKK1RoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzIC0tLQorIDMgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQorIGRlbGV0ZSBtb2RlIDEwMDY0NCBmaWxlMgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uYjQxNDEwOCAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrNAorKzUKKys2CitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMWU3OWMzLi4wMDAwMDAwCistLS0gYS9maWxlMgorKysrIC9kZXYvbnVsbAorQEAgLTEsMyArMCwwIEBACistMQorLTIKKy0zCistLSAKK2ctaS10LS12LWUtci1zLWktby1uCisKKworRnJvbSA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IE1vbiwgMjYgSnVuIDIwMDYgMDA6MDI6MDAgKzAwMDAKK1N1YmplY3Q6IFtQQVRDSF0gVGhpcmQKKworLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMSAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTEKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCistLSAKK2ctaS10LS12LWUtci1zLWktby1uCisKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1zdGRvdXRfaW5pdGlhbC4uc2lkZSBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1zdGRvdXRfaW5pdGlhbC4uc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzY1MDg4Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLXN0ZG91dF9pbml0aWFsLi5zaWRlCkBAIC0wLDAgKzEsNDcgQEAKKyQgZ2l0IGZvcm1hdC1wYXRjaCAtLXN0ZG91dCBpbml0aWFsLi5zaWRlCitGcm9tIGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogTW9uLCAyNiBKdW4gMjAwNiAwMDowMzowMCArMDAwMAorU3ViamVjdDogW1BBVENIXSBTaWRlCisKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMworCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCistLSAKK2ctaS10LS12LWUtci1zLWktby1uCisKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5sb2dfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3Rlcl8tLV9kaXJfIGIvdC90NDAxMy9kaWZmLmxvZ18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyXy0tX2Rpcl8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NlYjhlNwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5sb2dfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3Rlcl8tLV9kaXJfCkBAIC0wLDAgKzEsNzQgQEAKKyQgZ2l0IGxvZyAtLXBhdGNoLXdpdGgtc3RhdCAtLXN1bW1hcnkgbWFzdGVyIC0tIGRpci8KK2NvbW1pdCA1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CitNZXJnZTogOWE2ZDQ5NC4uLiBjN2EyYWI5Li4uCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDQ6MDAgMjAwNiArMDAwMAorCisgICAgTWVyZ2UgYnJhbmNoICdzaWRlJworCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgMSBmaWxlcyBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyAxIGZpbGVzIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIDEgZmlsZXMgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECisKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmxvZ18tLXBhdGNoLXdpdGgtc3RhdF9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYubG9nXy0tcGF0Y2gtd2l0aC1zdGF0X21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2Q3Nzc2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmxvZ18tLXBhdGNoLXdpdGgtc3RhdF9tYXN0ZXIKQEAgLTAsMCArMSwxMjkgQEAKKyQgZ2l0IGxvZyAtLXBhdGNoLXdpdGgtc3RhdCBtYXN0ZXIKK2NvbW1pdCA1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CitNZXJnZTogOWE2ZDQ5NC4uLiBjN2EyYWI5Li4uCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDQ6MDAgMjAwNiArMDAwMAorCisgICAgTWVyZ2UgYnJhbmNoICdzaWRlJworCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTEgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjFlNjcyMgorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTEKK0BAIC0wLDAgKzEsMyBAQAorK0EKKytCCisrQworCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzIC0tLQorIDMgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uYjQxNDEwOCAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrNAorKzUKKys2CitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMWU3OWMzLi4wMDAwMDAwCistLS0gYS9maWxlMgorKysrIC9kZXYvbnVsbAorQEAgLTEsMyArMCwwIEBACistMQorLTIKKy0zCisKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmxvZ18tLXBhdGNoLXdpdGgtc3RhdF9tYXN0ZXJfLS1fZGlyXyBiL3QvdDQwMTMvZGlmZi5sb2dfLS1wYXRjaC13aXRoLXN0YXRfbWFzdGVyXy0tX2Rpcl8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4N2EyNgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5sb2dfLS1wYXRjaC13aXRoLXN0YXRfbWFzdGVyXy0tX2Rpcl8KQEAgLTAsMCArMSw3NCBAQAorJCBnaXQgbG9nIC0tcGF0Y2gtd2l0aC1zdGF0IG1hc3RlciAtLSBkaXIvCitjb21taXQgNTlkMzE0YWQ2ZjM1NmRkMDg2MDFhNGNkNWU1MzAzODFkYTNlM2M2NAorTWVyZ2U6IDlhNmQ0OTQuLi4gYzdhMmFiOS4uLgorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjA0OjAwIDIwMDYgKzAwMDAKKworICAgIE1lcmdlIGJyYW5jaCAnc2lkZScKKworY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIDEgZmlsZXMgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgMSBmaWxlcyBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKKworY29tbWl0IDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMTowMCAyMDA2ICswMDAwCisKKyAgICBTZWNvbmQKKyAgICAKKyAgICBUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyAxIGZpbGVzIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5sb2dfLS1yb290Xy0tY2NfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3RlciBiL3QvdDQwMTMvZGlmZi5sb2dfLS1yb290Xy0tY2NfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTY0MDk3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmxvZ18tLXJvb3RfLS1jY18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyCkBAIC0wLDAgKzEsMTk5IEBACiskIGdpdCBsb2cgLS1yb290IC0tY2MgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IG1hc3RlcgorY29tbWl0IDU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKK01lcmdlOiA5YTZkNDk0Li4uIGM3YTJhYjkuLi4KK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowNDowMCAyMDA2ICswMDAwCisKKyAgICBNZXJnZSBicmFuY2ggJ3NpZGUnCisKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tY2MgZGlyL3N1YgoraW5kZXggY2VhZDMyZSw3Mjg5ZTM1Li45OTI5MTNjCistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQEAgLTEsNiAtMSw0ICsxLDggQEBACisgIEEKKyAgQgorICtDCisgK0QKKyArRQorICtGCisrIDEKKysgMgorZGlmZiAtLWNjIGZpbGUwCitpbmRleCBiNDE0MTA4LGY0NjE1ZGEuLjEwYThhOWYKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEBAIC0xLDYgLTEsNiArMSw5IEBAQAorICAxCisgIDIKKyAgMworICs0CisgKzUKKyArNgorKyBBCisrIEIKKysgQworCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMworCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTEgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUxCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjFlNjcyMgorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTEKK0BAIC0wLDAgKzEsMyBAQAorK0EKKytCCisrQworCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzIC0tLQorIDMgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQorIGRlbGV0ZSBtb2RlIDEwMDY0NCBmaWxlMgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uYjQxNDEwOCAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrNAorKzUKKys2CitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMWU3OWMzLi4wMDAwMDAwCistLS0gYS9maWxlMgorKysrIC9kZXYvbnVsbAorQEAgLTEsMyArMCwwIEBACistMQorLTIKKy0zCisKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyArKysKKyAzIGZpbGVzIGNoYW5nZWQsIDggaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZGlyL3N1YgorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMAorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4zNWQyNDJiCistLS0gL2Rldi9udWxsCisrKysgYi9kaXIvc3ViCitAQCAtMCwwICsxLDIgQEAKKytBCisrQgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMAorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUyCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5sb2dfLS1yb290Xy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYubG9nXy0tcm9vdF8tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMDUwYWYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYubG9nXy0tcm9vdF8tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyCkBAIC0wLDAgKzEsMTY3IEBACiskIGdpdCBsb2cgLS1yb290IC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIKK2NvbW1pdCA1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CitNZXJnZTogOWE2ZDQ5NC4uLiBjN2EyYWI5Li4uCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDQ6MDAgMjAwNiArMDAwMAorCisgICAgTWVyZ2UgYnJhbmNoICdzaWRlJworCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMworCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTEgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUxCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjFlNjcyMgorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTEKK0BAIC0wLDAgKzEsMyBAQAorK0EKKytCCisrQworCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzIC0tLQorIDMgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQorIGRlbGV0ZSBtb2RlIDEwMDY0NCBmaWxlMgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uYjQxNDEwOCAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrNAorKzUKKys2CitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMWU3OWMzLi4wMDAwMDAwCistLS0gYS9maWxlMgorKysrIC9kZXYvbnVsbAorQEAgLTEsMyArMCwwIEBACistMQorLTIKKy0zCisKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyArKysKKyAzIGZpbGVzIGNoYW5nZWQsIDggaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZGlyL3N1YgorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMAorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4zNWQyNDJiCistLS0gL2Rldi9udWxsCisrKysgYi9kaXIvc3ViCitAQCAtMCwwICsxLDIgQEAKKytBCisrQgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMAorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUyCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5sb2dfLS1yb290Xy0tcGF0Y2gtd2l0aC1zdGF0X21hc3RlciBiL3QvdDQwMTMvZGlmZi5sb2dfLS1yb290Xy0tcGF0Y2gtd2l0aC1zdGF0X21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjhjNmMwCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmxvZ18tLXJvb3RfLS1wYXRjaC13aXRoLXN0YXRfbWFzdGVyCkBAIC0wLDAgKzEsMTYxIEBACiskIGdpdCBsb2cgLS1yb290IC0tcGF0Y2gtd2l0aC1zdGF0IG1hc3RlcgorY29tbWl0IDU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKK01lcmdlOiA5YTZkNDk0Li4uIGM3YTJhYjkuLi4KK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowNDowMCAyMDA2ICswMDAwCisKKyAgICBNZXJnZSBicmFuY2ggJ3NpZGUnCisKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMSAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCisKK2NvbW1pdCAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0CitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDE6MDAgMjAwNiArMDAwMAorCisgICAgU2Vjb25kCisgICAgCisgICAgVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5iNDE0MTA4IDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKKworY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzICsrKworIDMgZmlsZXMgY2hhbmdlZCwgOCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4zNWQyNDJiCistLS0gL2Rldi9udWxsCisrKysgYi9kaXIvc3ViCitAQCAtMCwwICsxLDIgQEAKKytBCisrQgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMAorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUyCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5sb2dfLS1yb290Xy1jXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYubG9nXy0tcm9vdF8tY18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNGUwZjEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYubG9nXy0tcm9vdF8tY18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyCkBAIC0wLDAgKzEsMTk5IEBACiskIGdpdCBsb2cgLS1yb290IC1jIC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIKK2NvbW1pdCA1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CitNZXJnZTogOWE2ZDQ5NC4uLiBjN2EyYWI5Li4uCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDQ6MDAgMjAwNiArMDAwMAorCisgICAgTWVyZ2UgYnJhbmNoICdzaWRlJworCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWNvbWJpbmVkIGRpci9zdWIKK2luZGV4IGNlYWQzMmUsNzI4OWUzNS4uOTkyOTEzYworLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEBAIC0xLDYgLTEsNCArMSw4IEBAQAorICBBCisgIEIKKyArQworICtECisgK0UKKyArRgorKyAxCisrIDIKK2RpZmYgLS1jb21iaW5lZCBmaWxlMAoraW5kZXggYjQxNDEwOCxmNDYxNWRhLi4xMGE4YTlmCistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAQCAtMSw2IC0xLDYgKzEsOSBAQEAKKyAgMQorICAyCisgIDMKKyArNAorICs1CisgKzYKKysgQQorKyBCCisrIEMKKworY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTMKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUxICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDg0MjJkNDAuLmNlYWQzMmUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMiwzICsyLDUgQEAgQQorIEIKKyBDCisgRAorK0UKKytGCitkaWZmIC0tZ2l0IGEvZmlsZTEgYi9maWxlMQorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLmIxZTY3MjIKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUxCitAQCAtMCwwICsxLDMgQEAKKytBCisrQgorK0MKKworY29tbWl0IDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMTowMCAyMDA2ICswMDAwCisKKyAgICBTZWNvbmQKKyAgICAKKyAgICBUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyAtLS0KKyAzIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKKyBkZWxldGUgbW9kZSAxMDA2NDQgZmlsZTIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmI0MTQxMDggMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworKzQKKys1CisrNgorZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDFlNzljMy4uMDAwMDAwMAorLS0tIGEvZmlsZTIKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLTEKKy0yCistMworCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA4IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGRpci9zdWIKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTAKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYubG9nXy0tcm9vdF8tcF9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYubG9nXy0tcm9vdF8tcF9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3YTJlYgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5sb2dfLS1yb290Xy1wX21hc3RlcgpAQCAtMCwwICsxLDE0MiBAQAorJCBnaXQgbG9nIC0tcm9vdCAtcCBtYXN0ZXIKK2NvbW1pdCA1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CitNZXJnZTogOWE2ZDQ5NC4uLiBjN2EyYWI5Li4uCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDQ6MDAgMjAwNiArMDAwMAorCisgICAgTWVyZ2UgYnJhbmNoICdzaWRlJworCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjFlNjcyMgorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTEKK0BAIC0wLDAgKzEsMyBAQAorK0EKKytCCisrQworCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5iNDE0MTA4IDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKKworY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjM1ZDI0MmIKKy0tLSAvZGV2L251bGwKKysrKyBiL2Rpci9zdWIKK0BAIC0wLDAgKzEsMiBAQAorK0EKKytCCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUwCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTIKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmxvZ18tLXJvb3RfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmxvZ18tLXJvb3RfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxN2NjZmMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYubG9nXy0tcm9vdF9tYXN0ZXIKQEAgLTAsMCArMSwzNCBAQAorJCBnaXQgbG9nIC0tcm9vdCBtYXN0ZXIKK2NvbW1pdCA1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CitNZXJnZTogOWE2ZDQ5NC4uLiBjN2EyYWI5Li4uCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDQ6MDAgMjAwNiArMDAwMAorCisgICAgTWVyZ2UgYnJhbmNoICdzaWRlJworCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCisKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmxvZ18tU0ZfLXBfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmxvZ18tU0ZfLXBfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMzI0MzgKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYubG9nXy1TRl8tcF9tYXN0ZXIKQEAgLTAsMCArMSwxOCBAQAorJCBnaXQgbG9nIC1TRiAtcCBtYXN0ZXIKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmxvZ18tU0ZfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmxvZ18tU0ZfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNTk5ZjIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYubG9nXy1TRl9tYXN0ZXIKQEAgLTAsMCArMSw3IEBACiskIGdpdCBsb2cgLVNGIG1hc3RlcgorY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmxvZ18tcF9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYubG9nXy1wX21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGZlZmVmCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmxvZ18tcF9tYXN0ZXIKQEAgLTAsMCArMSwxMTUgQEAKKyQgZ2l0IGxvZyAtcCBtYXN0ZXIKK2NvbW1pdCA1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CitNZXJnZTogOWE2ZDQ5NC4uLiBjN2EyYWI5Li4uCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDQ6MDAgMjAwNiArMDAwMAorCisgICAgTWVyZ2UgYnJhbmNoICdzaWRlJworCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjFlNjcyMgorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTEKK0BAIC0wLDAgKzEsMyBAQAorK0EKKytCCisrQworCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5iNDE0MTA4IDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKKworY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYubG9nX21hc3RlciBiL3QvdDQwMTMvZGlmZi5sb2dfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZDllN2IKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYubG9nX21hc3RlcgpAQCAtMCwwICsxLDM0IEBACiskIGdpdCBsb2cgbWFzdGVyCitjb21taXQgNTlkMzE0YWQ2ZjM1NmRkMDg2MDFhNGNkNWU1MzAzODFkYTNlM2M2NAorTWVyZ2U6IDlhNmQ0OTQuLi4gYzdhMmFiOS4uLgorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjA0OjAwIDIwMDYgKzAwMDAKKworICAgIE1lcmdlIGJyYW5jaCAnc2lkZScKKworY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKworY29tbWl0IDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMTowMCAyMDA2ICswMDAwCisKKyAgICBTZWNvbmQKKyAgICAKKyAgICBUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5zaG93Xy0tcGF0Y2gtd2l0aC1yYXdfc2lkZSBiL3QvdDQwMTMvZGlmZi5zaG93Xy0tcGF0Y2gtd2l0aC1yYXdfc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjFiNDZhCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLnNob3dfLS1wYXRjaC13aXRoLXJhd19zaWRlCkBAIC0wLDAgKzEsNDIgQEAKKyQgZ2l0IHNob3cgLS1wYXRjaC13aXRoLXJhdyBzaWRlCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKworOjEwMDY0NCAxMDA2NDQgMzVkMjQyYi4uLiA3Mjg5ZTM1Li4uIE0JZGlyL3N1YgorOjEwMDY0NCAxMDA2NDQgMDFlNzljMy4uLiBmNDYxNWRhLi4uIE0JZmlsZTAKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAuLi4gNzI4OWUzNS4uLiBBCWZpbGUzCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5zaG93Xy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9zaWRlIGIvdC90NDAxMy9kaWZmLnNob3dfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X3NpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3ZjJiNwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5zaG93Xy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9zaWRlCkBAIC0wLDAgKzEsNDQgQEAKKyQgZ2l0IHNob3cgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IHNpZGUKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUzCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5zaG93Xy0tcGF0Y2gtd2l0aC1zdGF0X3NpZGUgYi90L3Q0MDEzL2RpZmYuc2hvd18tLXBhdGNoLXdpdGgtc3RhdF9zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMTRjNTMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuc2hvd18tLXBhdGNoLXdpdGgtc3RhdF9zaWRlCkBAIC0wLDAgKzEsNDMgQEAKKyQgZ2l0IHNob3cgLS1wYXRjaC13aXRoLXN0YXQgc2lkZQorY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLnNob3dfLS1yb290X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuc2hvd18tLXJvb3RfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yzg5MTM2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLnNob3dfLS1yb290X2luaXRpYWwKQEAgLTAsMCArMSwzNCBAQAorJCBnaXQgc2hvdyAtLXJvb3QgaW5pdGlhbAorY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjM1ZDI0MmIKKy0tLSAvZGV2L251bGwKKysrKyBiL2Rpci9zdWIKK0BAIC0wLDAgKzEsMiBAQAorK0EKKytCCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUwCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTIKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLnNob3dfLS1zdGF0Xy0tc3VtbWFyeV9zaWRlIGIvdC90NDAxMy9kaWZmLnNob3dfLS1zdGF0Xy0tc3VtbWFyeV9zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZDU5NzcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuc2hvd18tLXN0YXRfLS1zdW1tYXJ5X3NpZGUKQEAgLTAsMCArMSwxMyBAQAorJCBnaXQgc2hvdyAtLXN0YXQgLS1zdW1tYXJ5IHNpZGUKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUzCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuc2hvd18tLXN0YXRfc2lkZSBiL3QvdDQwMTMvZGlmZi5zaG93Xy0tc3RhdF9zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMjIzMjcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuc2hvd18tLXN0YXRfc2lkZQpAQCAtMCwwICsxLDEyIEBACiskIGdpdCBzaG93IC0tc3RhdCBzaWRlCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKworIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLnNob3dfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5zaG93X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM0MDY2YQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5zaG93X2luaXRpYWwKQEAgLTAsMCArMSw3IEBACiskIGdpdCBzaG93IGluaXRpYWwKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLnNob3dfbWFzdGVyIGIvdC90NDAxMy9kaWZmLnNob3dfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNmUxZjIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuc2hvd19tYXN0ZXIKQEAgLTAsMCArMSwzNiBAQAorJCBnaXQgc2hvdyBtYXN0ZXIKK2NvbW1pdCA1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CitNZXJnZTogOWE2ZDQ5NC4uLiBjN2EyYWI5Li4uCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDQ6MDAgMjAwNiArMDAwMAorCisgICAgTWVyZ2UgYnJhbmNoICdzaWRlJworCitkaWZmIC0tY2MgZGlyL3N1YgoraW5kZXggY2VhZDMyZSw3Mjg5ZTM1Li45OTI5MTNjCistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQEAgLTEsNiAtMSw0ICsxLDggQEBACisgIEEKKyAgQgorICtDCisgK0QKKyArRQorICtGCisrIDEKKysgMgorZGlmZiAtLWNjIGZpbGUwCitpbmRleCBiNDE0MTA4LGY0NjE1ZGEuLjEwYThhOWYKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEBAIC0xLDYgLTEsNiArMSw5IEBAQAorICAxCisgIDIKKyAgMworICs0CisgKzUKKyArNgorKyBBCisrIEIKKysgQworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLnNob3dfc2lkZSBiL3QvdDQwMTMvZGlmZi5zaG93X3NpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMwYTA3MwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5zaG93X3NpZGUKQEAgLTAsMCArMSwzOCBAQAorJCBnaXQgc2hvdyBzaWRlCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXJfLS1fZGlyXyBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyXy0tX2Rpcl8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE0NjdjYwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyXy0tX2Rpcl8KQEAgLTAsMCArMSw2MSBAQAorJCBnaXQgd2hhdGNoYW5nZWQgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IG1hc3RlciAtLSBkaXIvCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgMSBmaWxlcyBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyAxIGZpbGVzIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIDEgZmlsZXMgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1wYXRjaC13aXRoLXN0YXRfbWFzdGVyIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcGF0Y2gtd2l0aC1zdGF0X21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTFiYmUxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcGF0Y2gtd2l0aC1zdGF0X21hc3RlcgpAQCAtMCwwICsxLDExNiBAQAorJCBnaXQgd2hhdGNoYW5nZWQgLS1wYXRjaC13aXRoLXN0YXQgbWFzdGVyCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTEgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjFlNjcyMgorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTEKK0BAIC0wLDAgKzEsMyBAQAorK0EKKytCCisrQworCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzIC0tLQorIDMgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uYjQxNDEwOCAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrNAorKzUKKys2CitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMWU3OWMzLi4wMDAwMDAwCistLS0gYS9maWxlMgorKysrIC9kZXYvbnVsbAorQEAgLTEsMyArMCwwIEBACistMQorLTIKKy0zCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1wYXRjaC13aXRoLXN0YXRfbWFzdGVyXy0tX2Rpcl8gYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1wYXRjaC13aXRoLXN0YXRfbWFzdGVyXy0tX2Rpcl8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM3ODlmMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXBhdGNoLXdpdGgtc3RhdF9tYXN0ZXJfLS1fZGlyXwpAQCAtMCwwICsxLDYxIEBACiskIGdpdCB3aGF0Y2hhbmdlZCAtLXBhdGNoLXdpdGgtc3RhdCBtYXN0ZXIgLS0gZGlyLworY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIDEgZmlsZXMgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgMSBmaWxlcyBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKKworY29tbWl0IDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMTowMCAyMDA2ICswMDAwCisKKyAgICBTZWNvbmQKKyAgICAKKyAgICBUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyAxIGZpbGVzIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcm9vdF8tLWNjXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1yb290Xy0tY2NfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmFjZjI1Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcm9vdF8tLWNjXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIKQEAgLTAsMCArMSwxOTkgQEAKKyQgZ2l0IHdoYXRjaGFuZ2VkIC0tcm9vdCAtLWNjIC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIKK2NvbW1pdCA1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CitNZXJnZTogOWE2ZDQ5NC4uLiBjN2EyYWI5Li4uCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDQ6MDAgMjAwNiArMDAwMAorCisgICAgTWVyZ2UgYnJhbmNoICdzaWRlJworCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWNjIGRpci9zdWIKK2luZGV4IGNlYWQzMmUsNzI4OWUzNS4uOTkyOTEzYworLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEBAIC0xLDYgLTEsNCArMSw4IEBAQAorICBBCisgIEIKKyArQworICtECisgK0UKKyArRgorKyAxCisrIDIKK2RpZmYgLS1jYyBmaWxlMAoraW5kZXggYjQxNDEwOCxmNDYxNWRhLi4xMGE4YTlmCistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAQCAtMSw2IC0xLDYgKzEsOSBAQEAKKyAgMQorICAyCisgIDMKKyArNAorICs1CisgKzYKKysgQQorKyBCCisrIEMKKworY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTMKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUxICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDg0MjJkNDAuLmNlYWQzMmUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMiwzICsyLDUgQEAgQQorIEIKKyBDCisgRAorK0UKKytGCitkaWZmIC0tZ2l0IGEvZmlsZTEgYi9maWxlMQorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLmIxZTY3MjIKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUxCitAQCAtMCwwICsxLDMgQEAKKytBCisrQgorK0MKKworY29tbWl0IDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMTowMCAyMDA2ICswMDAwCisKKyAgICBTZWNvbmQKKyAgICAKKyAgICBUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyAtLS0KKyAzIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKKyBkZWxldGUgbW9kZSAxMDA2NDQgZmlsZTIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmI0MTQxMDggMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworKzQKKys1CisrNgorZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDFlNzljMy4uMDAwMDAwMAorLS0tIGEvZmlsZTIKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLTEKKy0yCistMworCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA4IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGRpci9zdWIKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTAKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1yb290Xy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1yb290Xy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI5MTE1MwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXJvb3RfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3RlcgpAQCAtMCwwICsxLDE2MCBAQAorJCBnaXQgd2hhdGNoYW5nZWQgLS1yb290IC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUzCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMSAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTEKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCisKK2NvbW1pdCAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0CitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDE6MDAgMjAwNiArMDAwMAorCisgICAgU2Vjb25kCisgICAgCisgICAgVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCisgZGVsZXRlIG1vZGUgMTAwNjQ0IGZpbGUyCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5iNDE0MTA4IDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKKworY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzICsrKworIDMgZmlsZXMgY2hhbmdlZCwgOCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBkaXIvc3ViCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUwCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUyCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjM1ZDI0MmIKKy0tLSAvZGV2L251bGwKKysrKyBiL2Rpci9zdWIKK0BAIC0wLDAgKzEsMiBAQAorK0EKKytCCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUwCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTIKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcm9vdF8tLXBhdGNoLXdpdGgtc3RhdF9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1yb290Xy0tcGF0Y2gtd2l0aC1zdGF0X21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjAzNDljCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcm9vdF8tLXBhdGNoLXdpdGgtc3RhdF9tYXN0ZXIKQEAgLTAsMCArMSwxNTQgQEAKKyQgZ2l0IHdoYXRjaGFuZ2VkIC0tcm9vdCAtLXBhdGNoLXdpdGgtc3RhdCBtYXN0ZXIKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMSAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCisKK2NvbW1pdCAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0CitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDE6MDAgMjAwNiArMDAwMAorCisgICAgU2Vjb25kCisgICAgCisgICAgVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5iNDE0MTA4IDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKKworY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzICsrKworIDMgZmlsZXMgY2hhbmdlZCwgOCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4zNWQyNDJiCistLS0gL2Rldi9udWxsCisrKysgYi9kaXIvc3ViCitAQCAtMCwwICsxLDIgQEAKKytBCisrQgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMAorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUyCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXJvb3RfLWNfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3RlciBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXJvb3RfLWNfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGY2NzY3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcm9vdF8tY18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyCkBAIC0wLDAgKzEsMTk5IEBACiskIGdpdCB3aGF0Y2hhbmdlZCAtLXJvb3QgLWMgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IG1hc3RlcgorY29tbWl0IDU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKK01lcmdlOiA5YTZkNDk0Li4uIGM3YTJhYjkuLi4KK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowNDowMCAyMDA2ICswMDAwCisKKyAgICBNZXJnZSBicmFuY2ggJ3NpZGUnCisKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tY29tYmluZWQgZGlyL3N1YgoraW5kZXggY2VhZDMyZSw3Mjg5ZTM1Li45OTI5MTNjCistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQEAgLTEsNiAtMSw0ICsxLDggQEBACisgIEEKKyAgQgorICtDCisgK0QKKyArRQorICtGCisrIDEKKysgMgorZGlmZiAtLWNvbWJpbmVkIGZpbGUwCitpbmRleCBiNDE0MTA4LGY0NjE1ZGEuLjEwYThhOWYKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEBAIC0xLDYgLTEsNiArMSw5IEBAQAorICAxCisgIDIKKyAgMworICs0CisgKzUKKyArNgorKyBBCisrIEIKKysgQworCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMworCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTEgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUxCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjFlNjcyMgorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTEKK0BAIC0wLDAgKzEsMyBAQAorK0EKKytCCisrQworCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzIC0tLQorIDMgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQorIGRlbGV0ZSBtb2RlIDEwMDY0NCBmaWxlMgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uYjQxNDEwOCAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrNAorKzUKKys2CitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMWU3OWMzLi4wMDAwMDAwCistLS0gYS9maWxlMgorKysrIC9kZXYvbnVsbAorQEAgLTEsMyArMCwwIEBACistMQorLTIKKy0zCisKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyArKysKKyAzIGZpbGVzIGNoYW5nZWQsIDggaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZGlyL3N1YgorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMAorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4zNWQyNDJiCistLS0gL2Rldi9udWxsCisrKysgYi9kaXIvc3ViCitAQCAtMCwwICsxLDIgQEAKKytBCisrQgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMAorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUyCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXJvb3RfLXBfbWFzdGVyIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcm9vdF8tcF9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJmMWYwNgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXJvb3RfLXBfbWFzdGVyCkBAIC0wLDAgKzEsMTM1IEBACiskIGdpdCB3aGF0Y2hhbmdlZCAtLXJvb3QgLXAgbWFzdGVyCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjFlNjcyMgorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTEKK0BAIC0wLDAgKzEsMyBAQAorK0EKKytCCisrQworCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5iNDE0MTA4IDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKKworY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjM1ZDI0MmIKKy0tLSAvZGV2L251bGwKKysrKyBiL2Rpci9zdWIKK0BAIC0wLDAgKzEsMiBAQAorK0EKKytCCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUwCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTIKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcm9vdF9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1yb290X21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDA1Y2I2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcm9vdF9tYXN0ZXIKQEAgLTAsMCArMSw0MiBAQAorJCBnaXQgd2hhdGNoYW5nZWQgLS1yb290IG1hc3RlcgorY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCisKKzoxMDA2NDQgMTAwNjQ0IDM1ZDI0MmIuLi4gNzI4OWUzNS4uLiBNCWRpci9zdWIKKzoxMDA2NDQgMTAwNjQ0IDAxZTc5YzMuLi4gZjQ2MTVkYS4uLiBNCWZpbGUwCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIDcyODllMzUuLi4gQQlmaWxlMworCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCisKKzoxMDA2NDQgMTAwNjQ0IDg0MjJkNDAuLi4gY2VhZDMyZS4uLiBNCWRpci9zdWIKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAuLi4gYjFlNjcyMi4uLiBBCWZpbGUxCisKK2NvbW1pdCAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0CitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDE6MDAgMjAwNiArMDAwMAorCisgICAgU2Vjb25kCisgICAgCisgICAgVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKworOjEwMDY0NCAxMDA2NDQgMzVkMjQyYi4uLiA4NDIyZDQwLi4uIE0JZGlyL3N1YgorOjEwMDY0NCAxMDA2NDQgMDFlNzljMy4uLiBiNDE0MTA4Li4uIE0JZmlsZTAKKzoxMDA2NDQgMDAwMDAwIDAxZTc5YzMuLi4gMDAwMDAwMC4uLiBECWZpbGUyCisKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIDM1ZDI0MmIuLi4gQQlkaXIvc3ViCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIDAxZTc5YzMuLi4gQQlmaWxlMAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiAwMWU3OWMzLi4uIEEJZmlsZTIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tU0ZfLXBfbWFzdGVyIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy1TRl8tcF9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5ZGE4NAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tU0ZfLXBfbWFzdGVyCkBAIC0wLDAgKzEsMTggQEAKKyQgZ2l0IHdoYXRjaGFuZ2VkIC1TRiAtcCBtYXN0ZXIKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy1TRl9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLVNGX21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDk5MzIxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy1TRl9tYXN0ZXIKQEAgLTAsMCArMSw5IEBACiskIGdpdCB3aGF0Y2hhbmdlZCAtU0YgbWFzdGVyCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCisKKzoxMDA2NDQgMTAwNjQ0IDg0MjJkNDAuLi4gY2VhZDMyZS4uLiBNCWRpci9zdWIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tcF9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLXBfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOGQ0MzIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLXBfbWFzdGVyCkBAIC0wLDAgKzEsMTAyIEBACiskIGdpdCB3aGF0Y2hhbmdlZCAtcCBtYXN0ZXIKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCisKK2NvbW1pdCAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0CitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDE6MDAgMjAwNiArMDAwMAorCisgICAgU2Vjb25kCisgICAgCisgICAgVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmI0MTQxMDggMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworKzQKKys1CisrNgorZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDFlNzljMy4uMDAwMDAwMAorLS0tIGEvZmlsZTIKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLTEKKy0yCistMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkX21hc3RlciBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzYmNjMgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF9tYXN0ZXIKQEAgLTAsMCArMSwzMiBAQAorJCBnaXQgd2hhdGNoYW5nZWQgbWFzdGVyCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKworOjEwMDY0NCAxMDA2NDQgMzVkMjQyYi4uLiA3Mjg5ZTM1Li4uIE0JZGlyL3N1YgorOjEwMDY0NCAxMDA2NDQgMDFlNzljMy4uLiBmNDYxNWRhLi4uIE0JZmlsZTAKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAuLi4gNzI4OWUzNS4uLiBBCWZpbGUzCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKworOjEwMDY0NCAxMDA2NDQgODQyMmQ0MC4uLiBjZWFkMzJlLi4uIE0JZGlyL3N1YgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiBiMWU2NzIyLi4uIEEJZmlsZTEKKworY29tbWl0IDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMTowMCAyMDA2ICswMDAwCisKKyAgICBTZWNvbmQKKyAgICAKKyAgICBUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorCis6MTAwNjQ0IDEwMDY0NCAzNWQyNDJiLi4uIDg0MjJkNDAuLi4gTQlkaXIvc3ViCis6MTAwNjQ0IDEwMDY0NCAwMWU3OWMzLi4uIGI0MTQxMDguLi4gTQlmaWxlMAorOjEwMDY0NCAwMDAwMDAgMDFlNzljMy4uLiAwMDAwMDAwLi4uIEQJZmlsZTIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTQtZm9ybWF0LXBhdGNoLnNoIGIvdC90NDAxNC1mb3JtYXQtcGF0Y2guc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjJiN2E4ZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTQtZm9ybWF0LXBhdGNoLnNoCkBAIC0wLDAgKzEsMjMzIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J0Zvcm1hdC1wYXRjaCBza2lwcGluZyBhbHJlYWR5IGluY29ycG9yYXRlZCBwYXRjaGVzJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwlmb3IgaSBpbiAxIDIgMyA0IDUgNiA3IDggOSAxMDsgZG8gZWNobyAiJGkiOyBkb25lID5maWxlICYmCisJY2F0IGZpbGUgPmVsaWYgJiYKKwlnaXQgYWRkIGZpbGUgZWxpZiAmJgorCWdpdCBjb21taXQgLW0gSW5pdGlhbCAmJgorCWdpdCBjaGVja291dCAtYiBzaWRlICYmCisKKwlmb3IgaSBpbiAxIDIgNSA2IEEgQiBDIDcgOCA5IDEwOyBkbyBlY2hvICIkaSI7IGRvbmUgPmZpbGUgJiYKKwljaG1vZCAreCBlbGlmICYmCisJZ2l0IHVwZGF0ZS1pbmRleCBmaWxlIGVsaWYgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tY2htb2Q9K3ggZWxpZiAmJgorCWdpdCBjb21taXQgLW0gIlNpZGUgY2hhbmdlcyAjMSIgJiYKKworCWZvciBpIGluIEQgRSBGOyBkbyBlY2hvICIkaSI7IGRvbmUgPj5maWxlICYmCisJZ2l0IHVwZGF0ZS1pbmRleCBmaWxlICYmCisJZ2l0IGNvbW1pdCAtbSAiU2lkZSBjaGFuZ2VzICMyIiAmJgorCWdpdCB0YWcgQzIgJiYKKworCWZvciBpIGluIDUgNiAxIDIgMyBBIDQgQiBDIDcgOCA5IDEwIEQgRSBGOyBkbyBlY2hvICIkaSI7IGRvbmUgPmZpbGUgJiYKKwlnaXQgdXBkYXRlLWluZGV4IGZpbGUgJiYKKwlnaXQgY29tbWl0IC1tICJTaWRlIGNoYW5nZXMgIzMgd2l0aCBcXG4gYmFja3NsYXNoLW4gaW4gaXQuIiAmJgorCisJZ2l0IGNoZWNrb3V0IG1hc3RlciAmJgorCWdpdCBkaWZmLXRyZWUgLXAgQzIgfCBnaXQgYXBwbHkgLS1pbmRleCAmJgorCWdpdCBjb21taXQgLW0gIk1hc3RlciBhY2NlcHRzIG1vcmFsIGVxdWl2YWxlbnQgb2YgIzIiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiZm9ybWF0LXBhdGNoIC0taWdub3JlLWlmLWluLXVwc3RyZWFtIiAnCisKKwlnaXQgZm9ybWF0LXBhdGNoIC0tc3Rkb3V0IG1hc3Rlci4uc2lkZSA+cGF0Y2gwICYmCisJY250PWBncmVwICJeRnJvbSAiIHBhdGNoMCB8IHdjIC1sYCAmJgorCXRlc3QgJGNudCA9IDMKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJmb3JtYXQtcGF0Y2ggLS1pZ25vcmUtaWYtaW4tdXBzdHJlYW0iICcKKworCWdpdCBmb3JtYXQtcGF0Y2ggLS1zdGRvdXQgXAorCQktLWlnbm9yZS1pZi1pbi11cHN0cmVhbSBtYXN0ZXIuLnNpZGUgPnBhdGNoMSAmJgorCWNudD1gZ3JlcCAiXkZyb20gIiBwYXRjaDEgfCB3YyAtbGAgJiYKKwl0ZXN0ICRjbnQgPSAyCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiZm9ybWF0LXBhdGNoIHJlc3VsdCBhcHBsaWVzIiAnCisKKwlnaXQgY2hlY2tvdXQgLWIgcmVidWlsZC0wIG1hc3RlciAmJgorCWdpdCBhbSAtMyBwYXRjaDAgJiYKKwljbnQ9YGdpdCByZXYtbGlzdCBtYXN0ZXIuLiB8IHdjIC1sYCAmJgorCXRlc3QgJGNudCA9IDIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiZm9ybWF0LXBhdGNoIC0taWdub3JlLWlmLWluLXVwc3RyZWFtIHJlc3VsdCBhcHBsaWVzIiAnCisKKwlnaXQgY2hlY2tvdXQgLWIgcmVidWlsZC0xIG1hc3RlciAmJgorCWdpdCBhbSAtMyBwYXRjaDEgJiYKKwljbnQ9YGdpdCByZXYtbGlzdCBtYXN0ZXIuLiB8IHdjIC1sYCAmJgorCXRlc3QgJGNudCA9IDIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY29tbWl0IGRpZCBub3Qgc2NyZXcgdXAgdGhlIGxvZyBtZXNzYWdlJyAnCisKKwlnaXQgY2F0LWZpbGUgY29tbWl0IHNpZGUgfCBncmVwICJeU2lkZSAuKiB3aXRoIC4qIGJhY2tzbGFzaC1uIgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Zvcm1hdC1wYXRjaCBkaWQgbm90IHNjcmV3IHVwIHRoZSBsb2cgbWVzc2FnZScgJworCisJZ3JlcCAiXlN1YmplY3Q6IC4qU2lkZSBjaGFuZ2VzICMzIHdpdGggLiogYmFja3NsYXNoLW4iIHBhdGNoMCAmJgorCWdyZXAgIl5TdWJqZWN0OiAuKlNpZGUgY2hhbmdlcyAjMyB3aXRoIC4qIGJhY2tzbGFzaC1uIiBwYXRjaDEKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZXBsYXkgZGlkIG5vdCBzY3JldyB1cCB0aGUgbG9nIG1lc3NhZ2UnICcKKworCWdpdCBjYXQtZmlsZSBjb21taXQgcmVidWlsZC0xIHwgZ3JlcCAiXlNpZGUgLiogd2l0aCAuKiBiYWNrc2xhc2gtbiIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdleHRyYSBoZWFkZXJzJyAnCisKKwlnaXQgY29uZmlnIGZvcm1hdC5oZWFkZXJzICJUbzogUi4gRS4gQ2lwaWVudCA8cmNpcGllbnRAZXhhbXBsZS5jb20+CisiICYmCisJZ2l0IGNvbmZpZyAtLWFkZCBmb3JtYXQuaGVhZGVycyAiQ2M6IFMuIEUuIENpcGllbnQgPHNjaXBpZW50QGV4YW1wbGUuY29tPgorIiAmJgorCWdpdCBmb3JtYXQtcGF0Y2ggLS1zdGRvdXQgbWFzdGVyLi5zaWRlID4gcGF0Y2gyICYmCisJc2VkIC1lICIvXiQvcSIgcGF0Y2gyID4gaGRyczIgJiYKKwlncmVwICJeVG86IFIuIEUuIENpcGllbnQgPHJjaXBpZW50QGV4YW1wbGUuY29tPiQiIGhkcnMyICYmCisJZ3JlcCAiXkNjOiBTLiBFLiBDaXBpZW50IDxzY2lwaWVudEBleGFtcGxlLmNvbT4kIiBoZHJzMgorCQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdleHRyYSBoZWFkZXJzIHdpdGhvdXQgbmV3bGluZXMnICcKKworCWdpdCBjb25maWcgLS1yZXBsYWNlLWFsbCBmb3JtYXQuaGVhZGVycyAiVG86IFIuIEUuIENpcGllbnQgPHJjaXBpZW50QGV4YW1wbGUuY29tPiIgJiYKKwlnaXQgY29uZmlnIC0tYWRkIGZvcm1hdC5oZWFkZXJzICJDYzogUy4gRS4gQ2lwaWVudCA8c2NpcGllbnRAZXhhbXBsZS5jb20+IiAmJgorCWdpdCBmb3JtYXQtcGF0Y2ggLS1zdGRvdXQgbWFzdGVyLi5zaWRlID5wYXRjaDMgJiYKKwlzZWQgLWUgIi9eJC9xIiBwYXRjaDMgPiBoZHJzMyAmJgorCWdyZXAgIl5UbzogUi4gRS4gQ2lwaWVudCA8cmNpcGllbnRAZXhhbXBsZS5jb20+JCIgaGRyczMgJiYKKwlncmVwICJeQ2M6IFMuIEUuIENpcGllbnQgPHNjaXBpZW50QGV4YW1wbGUuY29tPiQiIGhkcnMzCisJCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2V4dHJhIGhlYWRlcnMgd2l0aCBtdWx0aXBsZSBUbzpzJyAnCisKKwlnaXQgY29uZmlnIC0tcmVwbGFjZS1hbGwgZm9ybWF0LmhlYWRlcnMgIlRvOiBSLiBFLiBDaXBpZW50IDxyY2lwaWVudEBleGFtcGxlLmNvbT4iICYmCisJZ2l0IGNvbmZpZyAtLWFkZCBmb3JtYXQuaGVhZGVycyAiVG86IFMuIEUuIENpcGllbnQgPHNjaXBpZW50QGV4YW1wbGUuY29tPiIgJiYKKwlnaXQgZm9ybWF0LXBhdGNoIC0tc3Rkb3V0IG1hc3Rlci4uc2lkZSA+IHBhdGNoNCAmJgorCXNlZCAtZSAiL14kL3EiIHBhdGNoNCA+IGhkcnM0ICYmCisJZ3JlcCAiXlRvOiBSLiBFLiBDaXBpZW50IDxyY2lwaWVudEBleGFtcGxlLmNvbT4sJCIgaGRyczQgJiYKKwlncmVwICJeICpTLiBFLiBDaXBpZW50IDxzY2lwaWVudEBleGFtcGxlLmNvbT4kIiBoZHJzNAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhZGRpdGlvbmFsIGNvbW1hbmQgbGluZSBjYycgJworCisJZ2l0IGNvbmZpZyAtLXJlcGxhY2UtYWxsIGZvcm1hdC5oZWFkZXJzICJDYzogUi4gRS4gQ2lwaWVudCA8cmNpcGllbnRAZXhhbXBsZS5jb20+IiAmJgorCWdpdCBmb3JtYXQtcGF0Y2ggLS1jYz0iUy4gRS4gQ2lwaWVudCA8c2NpcGllbnRAZXhhbXBsZS5jb20+IiAtLXN0ZG91dCBtYXN0ZXIuLnNpZGUgfCBzZWQgLWUgIi9eJC9xIiA+cGF0Y2g1ICYmCisJZ3JlcCAiXkNjOiBSLiBFLiBDaXBpZW50IDxyY2lwaWVudEBleGFtcGxlLmNvbT4sJCIgcGF0Y2g1ICYmCisJZ3JlcCAiXiAqUy4gRS4gQ2lwaWVudCA8c2NpcGllbnRAZXhhbXBsZS5jb20+JCIgcGF0Y2g1CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ211bHRpcGxlIGZpbGVzJyAnCisKKwlybSAtcmYgcGF0Y2hlcy8gJiYKKwlnaXQgY2hlY2tvdXQgc2lkZSAmJgorCWdpdCBmb3JtYXQtcGF0Y2ggLW8gcGF0Y2hlcy8gbWFzdGVyICYmCisJbHMgcGF0Y2hlcy8wMDAxLVNpZGUtY2hhbmdlcy0xLnBhdGNoIHBhdGNoZXMvMDAwMi1TaWRlLWNoYW5nZXMtMi5wYXRjaCBwYXRjaGVzLzAwMDMtU2lkZS1jaGFuZ2VzLTMtd2l0aC1uLWJhY2tzbGFzaC1uLWluLWl0LnBhdGNoCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3RocmVhZCcgJworCisJcm0gLXJmIHBhdGNoZXMvICYmCisJZ2l0IGNoZWNrb3V0IHNpZGUgJiYKKwlnaXQgZm9ybWF0LXBhdGNoIC0tdGhyZWFkIC1vIHBhdGNoZXMvIG1hc3RlciAmJgorCUZJUlNUX01JRD0kKGdyZXAgIk1lc3NhZ2UtSWQ6IiBwYXRjaGVzLzAwMDEtKiB8IHNlZCAicy9eW148XSpcKDxbXj5dKj5cKS4qJC9cMS8iKSAmJgorCWZvciBpIGluIHBhdGNoZXMvMDAwMi0qIHBhdGNoZXMvMDAwMy0qCisJZG8KKwkgIGdyZXAgIlJlZmVyZW5jZXM6ICRGSVJTVF9NSUQiICRpICYmCisJICBncmVwICJJbi1SZXBseS1UbzogJEZJUlNUX01JRCIgJGkgfHwgYnJlYWsKKwlkb25lCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3RocmVhZCBpbi1yZXBseS10bycgJworCisJcm0gLXJmIHBhdGNoZXMvICYmCisJZ2l0IGNoZWNrb3V0IHNpZGUgJiYKKwlnaXQgZm9ybWF0LXBhdGNoIC0taW4tcmVwbHktdG89Ijx0ZXN0Lm1lc3NhZ2U+IiAtLXRocmVhZCAtbyBwYXRjaGVzLyBtYXN0ZXIgJiYKKwlGSVJTVF9NSUQ9Ijx0ZXN0Lm1lc3NhZ2U+IiAmJgorCWZvciBpIGluIHBhdGNoZXMvKgorCWRvCisJICBncmVwICJSZWZlcmVuY2VzOiAkRklSU1RfTUlEIiAkaSAmJgorCSAgZ3JlcCAiSW4tUmVwbHktVG86ICRGSVJTVF9NSUQiICRpIHx8IGJyZWFrCisJZG9uZQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0aHJlYWQgY292ZXItbGV0dGVyJyAnCisKKwlybSAtcmYgcGF0Y2hlcy8gJiYKKwlnaXQgY2hlY2tvdXQgc2lkZSAmJgorCWdpdCBmb3JtYXQtcGF0Y2ggLS1jb3Zlci1sZXR0ZXIgLS10aHJlYWQgLW8gcGF0Y2hlcy8gbWFzdGVyICYmCisJRklSU1RfTUlEPSQoZ3JlcCAiTWVzc2FnZS1JZDoiIHBhdGNoZXMvMDAwMC0qIHwgc2VkICJzL15bXjxdKlwoPFtePl0qPlwpLiokL1wxLyIpICYmCisJZm9yIGkgaW4gcGF0Y2hlcy8wMDAxLSogcGF0Y2hlcy8wMDAyLSogcGF0Y2hlcy8wMDAzLSogCisJZG8KKwkgIGdyZXAgIlJlZmVyZW5jZXM6ICRGSVJTVF9NSUQiICRpICYmCisJICBncmVwICJJbi1SZXBseS1UbzogJEZJUlNUX01JRCIgJGkgfHwgYnJlYWsKKwlkb25lCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3RocmVhZCBjb3Zlci1sZXR0ZXIgaW4tcmVwbHktdG8nICcKKworCXJtIC1yZiBwYXRjaGVzLyAmJgorCWdpdCBjaGVja291dCBzaWRlICYmCisJZ2l0IGZvcm1hdC1wYXRjaCAtLWNvdmVyLWxldHRlciAtLWluLXJlcGx5LXRvPSI8dGVzdC5tZXNzYWdlPiIgLS10aHJlYWQgLW8gcGF0Y2hlcy8gbWFzdGVyICYmCisJRklSU1RfTUlEPSI8dGVzdC5tZXNzYWdlPiIgJiYKKwlmb3IgaSBpbiBwYXRjaGVzLyoKKwlkbworCSAgZ3JlcCAiUmVmZXJlbmNlczogJEZJUlNUX01JRCIgJGkgJiYKKwkgIGdyZXAgIkluLVJlcGx5LVRvOiAkRklSU1RfTUlEIiAkaSB8fCBicmVhaworCWRvbmUKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZXhjZXNzaXZlIHN1YmplY3QnICcKKworCXJtIC1yZiBwYXRjaGVzLyAmJgorCWdpdCBjaGVja291dCBzaWRlICYmCisJZm9yIGkgaW4gNSA2IDEgMiAzIEEgNCBCIEMgNyA4IDkgMTAgRCBFIEY7IGRvIGVjaG8gIiRpIjsgZG9uZSA+PmZpbGUgJiYKKwlnaXQgdXBkYXRlLWluZGV4IGZpbGUgJiYKKwlnaXQgY29tbWl0IC1tICJUaGlzIGlzIGFuIGV4Y2Vzc2l2ZWx5IGxvbmcgc3ViamVjdCBsaW5lIGZvciBhIG1lc3NhZ2UgZHVlIHRvIHRoZSBoYWJpdCBzb21lIHByb2plY3RzIGhhdmUgb2Ygbm90IGhhdmluZyBhIHNob3J0LCBvbmUtbGluZSBzdWJqZWN0IGF0IHRoZSBzdGFydCBvZiB0aGUgY29tbWl0IG1lc3NhZ2UsIGJ1dCByYXRoZXIgc3RpY2tpbmcgYSB3aG9sZSBwYXJhZ3JhcGggcmlnaHQgYXQgdGhlIHN0YXJ0IGFzIHRoZSBvbmx5IHRoaW5nIGluIHRoZSBjb21taXQgbWVzc2FnZS4gSXQgaGFkIGJldHRlciBub3QgYmVjb21lIHRoZSBmaWxlbmFtZSBmb3IgdGhlIHBhdGNoLiIgJiYKKwlnaXQgZm9ybWF0LXBhdGNoIC1vIHBhdGNoZXMvIG1hc3Rlci4uc2lkZSAmJgorCWxzIHBhdGNoZXMvMDAwNC1UaGlzLWlzLWFuLWV4Y2Vzc2l2ZWx5LWxvbmctc3ViamVjdC1saW5lLWZvci1hLW1lc3NhLnBhdGNoCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvdmVyLWxldHRlciBpbmhlcml0cyBkaWZmIG9wdGlvbnMnICcKKworCWdpdCBtdiBmaWxlIGZvbyAmJgorCWdpdCBjb21taXQgLW0gZm9vICYmCisJZ2l0IGZvcm1hdC1wYXRjaCAtLWNvdmVyLWxldHRlciAtMSAmJgorCSEgZ3JlcCAiZmlsZSA9PiBmb28gLiogMCAqJCIgMDAwMC1jb3Zlci1sZXR0ZXIucGF0Y2ggJiYKKwlnaXQgZm9ybWF0LXBhdGNoIC0tY292ZXItbGV0dGVyIC0xIC1NICYmCisJZ3JlcCAiZmlsZSA9PiBmb28gLiogMCAqJCIgMDAwMC1jb3Zlci1sZXR0ZXIucGF0Y2gKKworJworCitjYXQgPiBleHBlY3QgPDwgRU9GCisgIFRoaXMgaXMgYW4gZXhjZXNzaXZlbHkgbG9uZyBzdWJqZWN0IGxpbmUgZm9yIGEgbWVzc2FnZSBkdWUgdG8gdGhlCisgICAgaGFiaXQgc29tZSBwcm9qZWN0cyBoYXZlIG9mIG5vdCBoYXZpbmcgYSBzaG9ydCwgb25lLWxpbmUgc3ViamVjdCBhdAorICAgIHRoZSBzdGFydCBvZiB0aGUgY29tbWl0IG1lc3NhZ2UsIGJ1dCByYXRoZXIgc3RpY2tpbmcgYSB3aG9sZQorICAgIHBhcmFncmFwaCByaWdodCBhdCB0aGUgc3RhcnQgYXMgdGhlIG9ubHkgdGhpbmcgaW4gdGhlIGNvbW1pdAorICAgIG1lc3NhZ2UuIEl0IGhhZCBiZXR0ZXIgbm90IGJlY29tZSB0aGUgZmlsZW5hbWUgZm9yIHRoZSBwYXRjaC4KKyAgZm9vCisKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzaG9ydGxvZyBvZiBjb3Zlci1sZXR0ZXIgd3JhcHMgb3Zlcmx5LWxvbmcgb25lbGluZXMnICcKKworCWdpdCBmb3JtYXQtcGF0Y2ggLS1jb3Zlci1sZXR0ZXIgLTIgJiYKKwlzZWQgLWUgIjEsL0EgVSBUaG9yL2QiIC1lICIvXiQvcSIgPCAwMDAwLWNvdmVyLWxldHRlci5wYXRjaCA+IG91dHB1dCAmJgorCWdpdCBkaWZmIGV4cGVjdCBvdXRwdXQKKworJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMTUtZGlmZi13aGl0ZXNwYWNlLnNoIGIvdC90NDAxNS1kaWZmLXdoaXRlc3BhY2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODNjNTRiNwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTUtZGlmZi13aGl0ZXNwYWNlLnNoCkBAIC0wLDAgKzEsMzM4IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEpvaGFubmVzIEUuIFNjaGluZGVsaW4KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdCBzcGVjaWFsIHdoaXRlc3BhY2UgaW4gZGlmZiBlbmdpbmUuCisKKycKKy4gLi90ZXN0LWxpYi5zaAorLiAuLi9kaWZmLWxpYi5zaAorCisjIFJheSBMZWh0aW5pZW1pJ3MgZXhhbXBsZQorCitjYXQgPDwgRU9GID4geAorZG8geworICAgbm90aGluZzsKK30gd2hpbGUgKDApOworRU9GCisKK2dpdCB1cGRhdGUtaW5kZXggLS1hZGQgeAorCitjYXQgPDwgRU9GID4geAorZG8KK3sKKyAgIG5vdGhpbmc7Cit9Cit3aGlsZSAoMCk7CitFT0YKKworY2F0IDw8IEVPRiA+IGV4cGVjdAorZGlmZiAtLWdpdCBhL3ggYi94CitpbmRleCBhZGYzOTM3Li42ZWRjMTcyIDEwMDY0NAorLS0tIGEveAorKysrIGIveAorQEAgLTEsMyArMSw1IEBACistZG8geworK2RvCisreworICAgIG5vdGhpbmc7CistfSB3aGlsZSAoMCk7CisrfQorK3doaWxlICgwKTsKK0VPRgorCitnaXQgZGlmZiA+IG91dAordGVzdF9leHBlY3Rfc3VjY2VzcyAiUmF5J3MgZXhhbXBsZSB3aXRob3V0IG9wdGlvbnMiICdnaXQgZGlmZiBleHBlY3Qgb3V0JworCitnaXQgZGlmZiAtdyA+IG91dAordGVzdF9leHBlY3Rfc3VjY2VzcyAiUmF5J3MgZXhhbXBsZSB3aXRoIC13IiAnZ2l0IGRpZmYgZXhwZWN0IG91dCcKKworZ2l0IGRpZmYgLWIgPiBvdXQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIlJheSdzIGV4YW1wbGUgd2l0aCAtYiIgJ2dpdCBkaWZmIGV4cGVjdCBvdXQnCisKK3RyICdRJyAnXDAxNScgPDwgRU9GID4geAord2hpdGVzcGFjZSBhdCBiZWdpbm5pbmcKK3doaXRlc3BhY2UgY2hhbmdlCit3aGl0ZXNwYWNlIGluIHRoZSBtaWRkbGUKK3doaXRlc3BhY2UgYXQgZW5kCit1bmNoYW5nZWQgbGluZQorQ1IgYXQgZW5kUQorRU9GCisKK2dpdCB1cGRhdGUtaW5kZXggeAorCitjYXQgPDwgRU9GID4geAorCXdoaXRlc3BhY2UgYXQgYmVnaW5uaW5nCit3aGl0ZXNwYWNlIAkgY2hhbmdlCit3aGl0ZSBzcGFjZSBpbiB0aGUgbWlkZGxlCit3aGl0ZXNwYWNlIGF0IGVuZCAgCit1bmNoYW5nZWQgbGluZQorQ1IgYXQgZW5kCitFT0YKKwordHIgJ1EnICdcMDE1JyA8PCBFT0YgPiBleHBlY3QKK2RpZmYgLS1naXQgYS94IGIveAoraW5kZXggZDk5YWYyMy4uOGIzMmZiNSAxMDA2NDQKKy0tLSBhL3gKKysrKyBiL3gKK0BAIC0xLDYgKzEsNiBAQAorLXdoaXRlc3BhY2UgYXQgYmVnaW5uaW5nCistd2hpdGVzcGFjZSBjaGFuZ2UKKy13aGl0ZXNwYWNlIGluIHRoZSBtaWRkbGUKKy13aGl0ZXNwYWNlIGF0IGVuZAorKwl3aGl0ZXNwYWNlIGF0IGJlZ2lubmluZworK3doaXRlc3BhY2UgCSBjaGFuZ2UKKyt3aGl0ZSBzcGFjZSBpbiB0aGUgbWlkZGxlCisrd2hpdGVzcGFjZSBhdCBlbmQgIAorIHVuY2hhbmdlZCBsaW5lCistQ1IgYXQgZW5kUQorK0NSIGF0IGVuZAorRU9GCitnaXQgZGlmZiA+IG91dAordGVzdF9leHBlY3Rfc3VjY2VzcyAnYW5vdGhlciB0ZXN0LCB3aXRob3V0IG9wdGlvbnMnICdnaXQgZGlmZiBleHBlY3Qgb3V0JworCitjYXQgPDwgRU9GID4gZXhwZWN0CitkaWZmIC0tZ2l0IGEveCBiL3gKK2luZGV4IGQ5OWFmMjMuLjhiMzJmYjUgMTAwNjQ0CitFT0YKK2dpdCBkaWZmIC13ID4gb3V0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhbm90aGVyIHRlc3QsIHdpdGggLXcnICdnaXQgZGlmZiBleHBlY3Qgb3V0JworCit0ciAnUScgJ1wwMTUnIDw8IEVPRiA+IGV4cGVjdAorZGlmZiAtLWdpdCBhL3ggYi94CitpbmRleCBkOTlhZjIzLi44YjMyZmI1IDEwMDY0NAorLS0tIGEveAorKysrIGIveAorQEAgLTEsNiArMSw2IEBACistd2hpdGVzcGFjZSBhdCBiZWdpbm5pbmcKKysJd2hpdGVzcGFjZSBhdCBiZWdpbm5pbmcKKyB3aGl0ZXNwYWNlIGNoYW5nZQorLXdoaXRlc3BhY2UgaW4gdGhlIG1pZGRsZQorK3doaXRlIHNwYWNlIGluIHRoZSBtaWRkbGUKKyB3aGl0ZXNwYWNlIGF0IGVuZAorIHVuY2hhbmdlZCBsaW5lCisgQ1IgYXQgZW5kUQorRU9GCitnaXQgZGlmZiAtYiA+IG91dAordGVzdF9leHBlY3Rfc3VjY2VzcyAnYW5vdGhlciB0ZXN0LCB3aXRoIC1iJyAnZ2l0IGRpZmYgZXhwZWN0IG91dCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgbWl4ZWQgc3BhY2VzIGFuZCB0YWJzIGluIGluZGVudCcgJworCisJIyBUaGlzIGlzIGluZGVudGVkIHdpdGggU1AgSFQgU1AuCisJZWNobyAiIAkgZm9vKCk7IiA+IHggJiYKKwlnaXQgZGlmZiAtLWNoZWNrIHwgZ3JlcCAic3BhY2UgYmVmb3JlIHRhYiBpbiBpbmRlbnQiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgbWl4ZWQgdGFicyBhbmQgc3BhY2VzIGluIGluZGVudCcgJworCisJIyBUaGlzIGlzIGluZGVudGVkIHdpdGggSFQgU1AgSFQuCisJZWNobyAiCSAJZm9vKCk7IiA+IHggJiYKKwlnaXQgZGlmZiAtLWNoZWNrIHwgZ3JlcCAic3BhY2UgYmVmb3JlIHRhYiBpbiBpbmRlbnQiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgd2l0aCBubyB3aGl0ZXNwYWNlIGVycm9ycycgJworCisJZ2l0IGNvbW1pdCAtbSAic25hcHNob3QiICYmCisJZWNobyAiZm9vKCk7IiA+IHggJiYKKwlnaXQgZGlmZiAtLWNoZWNrCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgd2l0aCB0cmFpbGluZyB3aGl0ZXNwYWNlJyAnCisKKwllY2hvICJmb28oKTsgIiA+IHggJiYKKwkhIGdpdCBkaWZmIC0tY2hlY2sKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayB3aXRoIHNwYWNlIGJlZm9yZSB0YWIgaW4gaW5kZW50JyAnCisKKwkjIGluZGVudCBoYXMgc3BhY2UgZm9sbG93ZWQgYnkgaGFyZCB0YWIKKwllY2hvICIgCWZvbygpOyIgPiB4ICYmCisJISBnaXQgZGlmZiAtLWNoZWNrCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLS1jaGVjayBhbmQgLS1leGl0LWNvZGUgYXJlIG5vdCBleGNsdXNpdmUnICcKKworCWdpdCBjaGVja291dCB4ICYmCisJZ2l0IGRpZmYgLS1jaGVjayAtLWV4aXQtY29kZQorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy0tY2hlY2sgYW5kIC0tcXVpZXQgYXJlIG5vdCBleGNsdXNpdmUnICcKKworCWdpdCBkaWZmIC0tY2hlY2sgLS1xdWlldAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIHN0YWdlZCB3aXRoIG5vIHdoaXRlc3BhY2UgZXJyb3JzJyAnCisKKwllY2hvICJmb28oKTsiID4geCAmJgorCWdpdCBhZGQgeCAmJgorCWdpdCBkaWZmIC0tY2FjaGVkIC0tY2hlY2sKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBzdGFnZWQgd2l0aCB0cmFpbGluZyB3aGl0ZXNwYWNlJyAnCisKKwllY2hvICJmb28oKTsgIiA+IHggJiYKKwlnaXQgYWRkIHggJiYKKwkhIGdpdCBkaWZmIC0tY2FjaGVkIC0tY2hlY2sKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBzdGFnZWQgd2l0aCBzcGFjZSBiZWZvcmUgdGFiIGluIGluZGVudCcgJworCisJIyBpbmRlbnQgaGFzIHNwYWNlIGZvbGxvd2VkIGJ5IGhhcmQgdGFiCisJZWNobyAiIAlmb28oKTsiID4geCAmJgorCWdpdCBhZGQgeCAmJgorCSEgZ2l0IGRpZmYgLS1jYWNoZWQgLS1jaGVjaworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIHdpdGggbm8gd2hpdGVzcGFjZSBlcnJvcnMgKGRpZmYtaW5kZXgpJyAnCisKKwllY2hvICJmb28oKTsiID4geCAmJgorCWdpdCBhZGQgeCAmJgorCWdpdCBkaWZmLWluZGV4IC0tY2hlY2sgSEVBRAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIHdpdGggdHJhaWxpbmcgd2hpdGVzcGFjZSAoZGlmZi1pbmRleCknICcKKworCWVjaG8gImZvbygpOyAiID4geCAmJgorCWdpdCBhZGQgeCAmJgorCSEgZ2l0IGRpZmYtaW5kZXggLS1jaGVjayBIRUFECisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgd2l0aCBzcGFjZSBiZWZvcmUgdGFiIGluIGluZGVudCAoZGlmZi1pbmRleCknICcKKworCSMgaW5kZW50IGhhcyBzcGFjZSBmb2xsb3dlZCBieSBoYXJkIHRhYgorCWVjaG8gIiAJZm9vKCk7IiA+IHggJiYKKwlnaXQgYWRkIHggJiYKKwkhIGdpdCBkaWZmLWluZGV4IC0tY2hlY2sgSEVBRAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIHN0YWdlZCB3aXRoIG5vIHdoaXRlc3BhY2UgZXJyb3JzIChkaWZmLWluZGV4KScgJworCisJZWNobyAiZm9vKCk7IiA+IHggJiYKKwlnaXQgYWRkIHggJiYKKwlnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCAtLWNoZWNrIEhFQUQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBzdGFnZWQgd2l0aCB0cmFpbGluZyB3aGl0ZXNwYWNlIChkaWZmLWluZGV4KScgJworCisJZWNobyAiZm9vKCk7ICIgPiB4ICYmCisJZ2l0IGFkZCB4ICYmCisJISBnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCAtLWNoZWNrIEhFQUQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBzdGFnZWQgd2l0aCBzcGFjZSBiZWZvcmUgdGFiIGluIGluZGVudCAoZGlmZi1pbmRleCknICcKKworCSMgaW5kZW50IGhhcyBzcGFjZSBmb2xsb3dlZCBieSBoYXJkIHRhYgorCWVjaG8gIiAJZm9vKCk7IiA+IHggJiYKKwlnaXQgYWRkIHggJiYKKwkhIGdpdCBkaWZmLWluZGV4IC0tY2FjaGVkIC0tY2hlY2sgSEVBRAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIHdpdGggbm8gd2hpdGVzcGFjZSBlcnJvcnMgKGRpZmYtdHJlZSknICcKKworCWVjaG8gImZvbygpOyIgPiB4ICYmCisJZ2l0IGNvbW1pdCAtbSAibmV3IGNvbW1pdCIgeCAmJgorCWdpdCBkaWZmLXRyZWUgLS1jaGVjayBIRUFEXiBIRUFECisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgd2l0aCB0cmFpbGluZyB3aGl0ZXNwYWNlIChkaWZmLXRyZWUpJyAnCisKKwllY2hvICJmb28oKTsgIiA+IHggJiYKKwlnaXQgY29tbWl0IC1tICJhbm90aGVyIGNvbW1pdCIgeCAmJgorCSEgZ2l0IGRpZmYtdHJlZSAtLWNoZWNrIEhFQUReIEhFQUQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayB3aXRoIHNwYWNlIGJlZm9yZSB0YWIgaW4gaW5kZW50IChkaWZmLXRyZWUpJyAnCisKKwkjIGluZGVudCBoYXMgc3BhY2UgZm9sbG93ZWQgYnkgaGFyZCB0YWIKKwllY2hvICIgCWZvbygpOyIgPiB4ICYmCisJZ2l0IGNvbW1pdCAtbSAieWV0IGFub3RoZXIiIHggJiYKKwkhIGdpdCBkaWZmLXRyZWUgLS1jaGVjayBIRUFEXiBIRUFECisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgdHJhaWxpbmcgd2hpdGVzcGFjZSAodHJhaWxpbmctc3BhY2U6IG9mZiknICcKKworCWdpdCBjb25maWcgY29yZS53aGl0ZXNwYWNlICItdHJhaWxpbmctc3BhY2UiICYmCisJZWNobyAiZm9vICgpOyAgICIgPiB4ICYmCisJZ2l0IGRpZmYgLS1jaGVjaworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIHRyYWlsaW5nIHdoaXRlc3BhY2UgKHRyYWlsaW5nLXNwYWNlOiBvbiknICcKKworCWdpdCBjb25maWcgY29yZS53aGl0ZXNwYWNlICJ0cmFpbGluZy1zcGFjZSIgJiYKKwllY2hvICJmb28gKCk7ICAgIiA+IHggJiYKKwkhIGdpdCBkaWZmIC0tY2hlY2sKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBzcGFjZSBiZWZvcmUgdGFiIGluIGluZGVudCAoc3BhY2UtYmVmb3JlLXRhYjogb2ZmKScgJworCisJIyBpbmRlbnQgY29udGFpbnMgc3BhY2UgZm9sbG93ZWQgYnkgSFQKKwlnaXQgY29uZmlnIGNvcmUud2hpdGVzcGFjZSAiLXNwYWNlLWJlZm9yZS10YWIiICYmCisJZWNobyAiIAlmb28gKCk7IiA+IHggJiYKKwlnaXQgZGlmZiAtLWNoZWNrCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgc3BhY2UgYmVmb3JlIHRhYiBpbiBpbmRlbnQgKHNwYWNlLWJlZm9yZS10YWI6IG9uKScgJworCisJIyBpbmRlbnQgY29udGFpbnMgc3BhY2UgZm9sbG93ZWQgYnkgSFQKKwlnaXQgY29uZmlnIGNvcmUud2hpdGVzcGFjZSAic3BhY2UtYmVmb3JlLXRhYiIgJiYKKwllY2hvICIgCWZvbyAoKTsgICAiID4geCAmJgorCSEgZ2l0IGRpZmYgLS1jaGVjaworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIHNwYWNlcyBhcyBpbmRlbnRhdGlvbiAoaW5kZW50LXdpdGgtbm9uLXRhYjogb2ZmKScgJworCisJZ2l0IGNvbmZpZyBjb3JlLndoaXRlc3BhY2UgIi1pbmRlbnQtd2l0aC1ub24tdGFiIgorCWVjaG8gIiAgICAgICAgZm9vICgpOyIgPiB4ICYmCisJZ2l0IGRpZmYgLS1jaGVjaworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIHNwYWNlcyBhcyBpbmRlbnRhdGlvbiAoaW5kZW50LXdpdGgtbm9uLXRhYjogb24pJyAnCisKKwlnaXQgY29uZmlnIGNvcmUud2hpdGVzcGFjZSAiaW5kZW50LXdpdGgtbm9uLXRhYiIgJiYKKwllY2hvICIgICAgICAgIGZvbyAoKTsiID4geCAmJgorCSEgZ2l0IGRpZmYgLS1jaGVjaworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIHRhYnMgYW5kIHNwYWNlcyBhcyBpbmRlbnRhdGlvbiAoaW5kZW50LXdpdGgtbm9uLXRhYjogb24pJyAnCisKKwlnaXQgY29uZmlnIGNvcmUud2hpdGVzcGFjZSAiaW5kZW50LXdpdGgtbm9uLXRhYiIgJiYKKwllY2hvICIJICAgICAgICAgICAgICAgIGZvbyAoKTsiID4geCAmJgorCSEgZ2l0IGRpZmYgLS1jaGVjaworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2xpbmUgbnVtYmVycyBpbiAtLWNoZWNrIG91dHB1dCBhcmUgY29ycmVjdCcgJworCisJZWNobyAiIiA+IHggJiYKKwllY2hvICJmb28oKTsgIiA+PiB4ICYmCisJZ2l0IGRpZmYgLS1jaGVjayB8IGdyZXAgIng6MjoiCisKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MDE2LWRpZmYtcXVvdGUuc2ggYi90L3Q0MDE2LWRpZmYtcXVvdGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWRiZGMwYwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTYtZGlmZi1xdW90ZS5zaApAQCAtMCwwICsxLDcwIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1F1b3RpbmcgcGF0aHMgaW4gZGlmZiBvdXRwdXQuCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCitQMD0ncGF0aG5hbWUnCitQMT0ncGF0aG5hbWUJd2l0aCBIVCcKK1AyPSdwYXRobmFtZSB3aXRoIFNQJworUDM9J3BhdGhuYW1lCit3aXRoIExGJworOiA+IiRQMSIgMj4mMSAmJiB0ZXN0IC1mICIkUDEiICYmIHJtIC1mICIkUDEiIHx8IHsKKwllY2hvID4mMiAnRmlsZXN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IHRhYnMgaW4gbmFtZXMnCisJdGVzdF9kb25lCit9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCWVjaG8gUDAuMCA+IiRQMC4wIiAmJgorCWVjaG8gUDAuMSA+IiRQMC4xIiAmJgorCWVjaG8gUDAuMiA+IiRQMC4yIiAmJgorCWVjaG8gUDAuMyA+IiRQMC4zIiAmJgorCWVjaG8gUDEuMCA+IiRQMS4wIiAmJgorCWVjaG8gUDEuMiA+IiRQMS4yIiAmJgorCWVjaG8gUDEuMyA+IiRQMS4zIiAmJgorCWdpdCBhZGQgLiAmJgorCWdpdCBjb21taXQgLW0gaW5pdGlhbCAmJgorCWdpdCBtdiAiJFAwLjAiICJSJFAwLjAiICYmCisJZ2l0IG12ICIkUDAuMSIgIlIkUDEuMCIgJiYKKwlnaXQgbXYgIiRQMC4yIiAiUiRQMi4wIiAmJgorCWdpdCBtdiAiJFAwLjMiICJSJFAzLjAiICYmCisJZ2l0IG12ICIkUDEuMCIgIlIkUDAuMSIgJiYKKwlnaXQgbXYgIiRQMS4yIiAiUiRQMi4xIiAmJgorCWdpdCBtdiAiJFAxLjMiICJSJFAzLjEiICYmCisJOgorJworCitjYXQgPmV4cGVjdCA8PFxFT0YKKyByZW5hbWUgcGF0aG5hbWUuMSA9PiAiUnBhdGhuYW1lXHR3aXRoIEhULjAiICgxMDAlKQorIHJlbmFtZSBwYXRobmFtZS4zID0+ICJScGF0aG5hbWVcbndpdGggTEYuMCIgKDEwMCUpCisgcmVuYW1lICJwYXRobmFtZVx0d2l0aCBIVC4zIiA9PiAiUnBhdGhuYW1lXG53aXRoIExGLjEiICgxMDAlKQorIHJlbmFtZSBwYXRobmFtZS4yID0+IFJwYXRobmFtZSB3aXRoIFNQLjAgKDEwMCUpCisgcmVuYW1lICJwYXRobmFtZVx0d2l0aCBIVC4yIiA9PiBScGF0aG5hbWUgd2l0aCBTUC4xICgxMDAlKQorIHJlbmFtZSBwYXRobmFtZS4wID0+IFJwYXRobmFtZS4wICgxMDAlKQorIHJlbmFtZSAicGF0aG5hbWVcdHdpdGggSFQuMCIgPT4gUnBhdGhuYW1lLjEgKDEwMCUpCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmIC0tc3VtbWFyeSAtTSBIRUFEJyAnCisJZ2l0IGRpZmYgLS1zdW1tYXJ5IC1NIEhFQUQgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwKKycKKworY2F0ID5leHBlY3QgPDxcRU9GCisgcGF0aG5hbWUuMSA9PiAiUnBhdGhuYW1lXHR3aXRoIEhULjAiICAgICAgICAgICAgfCAgICAwIAorIHBhdGhuYW1lLjMgPT4gIlJwYXRobmFtZVxud2l0aCBMRi4wIiAgICAgICAgICAgIHwgICAgMCAKKyAicGF0aG5hbWVcdHdpdGggSFQuMyIgPT4gIlJwYXRobmFtZVxud2l0aCBMRi4xIiB8ICAgIDAgCisgcGF0aG5hbWUuMiA9PiBScGF0aG5hbWUgd2l0aCBTUC4wICAgICAgICAgICAgICAgfCAgICAwIAorICJwYXRobmFtZVx0d2l0aCBIVC4yIiA9PiBScGF0aG5hbWUgd2l0aCBTUC4xICAgIHwgICAgMCAKKyBwYXRobmFtZS4wID0+IFJwYXRobmFtZS4wICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDAgCisgInBhdGhuYW1lXHR3aXRoIEhULjAiID0+IFJwYXRobmFtZS4xICAgICAgICAgICAgfCAgICAwIAorIDcgZmlsZXMgY2hhbmdlZCwgMCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZiAtLXN0YXQgLU0gSEVBRCcgJworCWdpdCBkaWZmIC0tc3RhdCAtTSBIRUFEID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAxNy1kaWZmLXJldHZhbC5zaCBiL3QvdDQwMTctZGlmZi1yZXR2YWwuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGMwYjcxMgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTctZGlmZi1yZXR2YWwuc2gKQEAgLTAsMCArMSwxMDggQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdSZXR1cm4gdmFsdWUgb2YgZGlmZnMnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCcgJworCWVjaG8gMSA+YSAmJgorCWdpdCBhZGQgLiAmJgorCWdpdCBjb21taXQgLW0gZmlyc3QgJiYKKwllY2hvIDIgPmIgJiYKKwlnaXQgYWRkIC4gJiYKKwlnaXQgY29tbWl0IC1hIC1tIHNlY29uZAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZi10cmVlIEhFQUReIEhFQUQnICcKKwlnaXQgZGlmZi10cmVlIC0tZXhpdC1jb2RlIEhFQUReIEhFQUQKKwl0ZXN0ICQ/ID0gMQorJwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtdHJlZSBIRUFEXiBIRUFEIC0tIGEnICcKKwlnaXQgZGlmZi10cmVlIC0tZXhpdC1jb2RlIEhFQUReIEhFQUQgLS0gYQorCXRlc3QgJD8gPSAwCisnCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZi10cmVlIEhFQUReIEhFQUQgLS0gYicgJworCWdpdCBkaWZmLXRyZWUgLS1leGl0LWNvZGUgSEVBRF4gSEVBRCAtLSBiCisJdGVzdCAkPyA9IDEKKycKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2VjaG8gSEVBRCB8IGdpdCBkaWZmLXRyZWUgLS1zdGRpbicgJworCWVjaG8gJChnaXQgcmV2LXBhcnNlIEhFQUQpIHwgZ2l0IGRpZmYtdHJlZSAtLWV4aXQtY29kZSAtLXN0ZGluCisJdGVzdCAkPyA9IDEKKycKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmLXRyZWUgSEVBRCBIRUFEJyAnCisJZ2l0IGRpZmYtdHJlZSAtLWV4aXQtY29kZSBIRUFEIEhFQUQKKwl0ZXN0ICQ/ID0gMAorJwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtZmlsZXMnICcKKwlnaXQgZGlmZi1maWxlcyAtLWV4aXQtY29kZQorCXRlc3QgJD8gPSAwCisnCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCBIRUFEJyAnCisJZ2l0IGRpZmYtaW5kZXggLS1leGl0LWNvZGUgLS1jYWNoZWQgSEVBRAorCXRlc3QgJD8gPSAwCisnCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCBIRUFEXicgJworCWdpdCBkaWZmLWluZGV4IC0tZXhpdC1jb2RlIC0tY2FjaGVkIEhFQUReCisJdGVzdCAkPyA9IDEKKycKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmLWluZGV4IC0tY2FjaGVkIEhFQUReJyAnCisJZWNobyB0ZXh0ID4+YiAmJgorCWVjaG8gMyA+YyAmJgorCWdpdCBhZGQgLiAmJiB7CisJCWdpdCBkaWZmLWluZGV4IC0tZXhpdC1jb2RlIC0tY2FjaGVkIEhFQUReCisJCXRlc3QgJD8gPSAxCisJfQorJwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtdHJlZSAtU3RleHQgSEVBRF4gSEVBRCAtLSBiJyAnCisJZ2l0IGNvbW1pdCAtbSAidGV4dCBpbiBiIiAmJiB7CisJCWdpdCBkaWZmLXRyZWUgLXAgLS1leGl0LWNvZGUgLVN0ZXh0IEhFQUReIEhFQUQgLS0gYgorCQl0ZXN0ICQ/ID0gMQorCX0KKycKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmLXRyZWUgLVNub3QtZm91bmQgSEVBRF4gSEVBRCAtLSBiJyAnCisJZ2l0IGRpZmYtdHJlZSAtcCAtLWV4aXQtY29kZSAtU25vdC1mb3VuZCBIRUFEXiBIRUFEIC0tIGIKKwl0ZXN0ICQ/ID0gMAorJwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtZmlsZXMnICcKKwllY2hvIDMgPj5jICYmIHsKKwkJZ2l0IGRpZmYtZmlsZXMgLS1leGl0LWNvZGUKKwkJdGVzdCAkPyA9IDEKKwl9CisnCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCBIRUFEJyAnCisJZ2l0IHVwZGF0ZS1pbmRleCBjICYmIHsKKwkJZ2l0IGRpZmYtaW5kZXggLS1leGl0LWNvZGUgLS1jYWNoZWQgSEVBRAorCQl0ZXN0ICQ/ID0gMQorCX0KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLS1jaGVjayAtLWV4aXQtY29kZSByZXR1cm5zIDAgZm9yIG5vIGRpZmZlcmVuY2UnICcKKworCWdpdCBkaWZmIC0tY2hlY2sgLS1leGl0LWNvZGUKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctLWNoZWNrIC0tZXhpdC1jb2RlIHJldHVybnMgMSBmb3IgYSBjbGVhbiBkaWZmZXJlbmNlJyAnCisKKwllY2hvICJnb29kIiA+IGEgJiYKKwlnaXQgZGlmZiAtLWNoZWNrIC0tZXhpdC1jb2RlCisJdGVzdCAkPyA9IDEKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctLWNoZWNrIC0tZXhpdC1jb2RlIHJldHVybnMgMyBmb3IgYSBkaXJ0eSBkaWZmZXJlbmNlJyAnCisKKwllY2hvICJiYWQgICAiID4+IGEgJiYKKwlnaXQgZGlmZiAtLWNoZWNrIC0tZXhpdC1jb2RlCisJdGVzdCAkPyA9IDMKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctLWNoZWNrIHdpdGggLS1uby1wYWdlciByZXR1cm5zIDIgZm9yIGRpcnR5IGRpZmZlcmVuY2UnICcKKworCWdpdCAtLW5vLXBhZ2VyIGRpZmYgLS1jaGVjaworCXRlc3QgJD8gPSAyCisKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MDE3LXF1aWV0LnNoIGIvdC90NDAxNy1xdWlldC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNzQ3ZTg0Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxNy1xdWlldC5zaApAQCAtMCwwICsxLDgwIEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nUmV0dXJuIHZhbHVlIG9mIGRpZmZzJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAnICcKKwllY2hvIDEgPmEgJiYKKwlnaXQgYWRkIC4gJiYKKwlnaXQgY29tbWl0IC1tIGZpcnN0ICYmCisJZWNobyAyID5iICYmCisJZ2l0IGFkZCAuICYmCisJZ2l0IGNvbW1pdCAtYSAtbSBzZWNvbmQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtdHJlZSBIRUFEXiBIRUFEJyAnCisJZ2l0IGRpZmYtdHJlZSAtLXF1aWV0IEhFQUReIEhFQUQgPmNudAorCXRlc3QgJD8gPSAxICYmIHRlc3QgJCh3YyAtbCA8Y250KSA9IDAKKycKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmLXRyZWUgSEVBRF4gSEVBRCAtLSBhJyAnCisJZ2l0IGRpZmYtdHJlZSAtLXF1aWV0IEhFQUReIEhFQUQgLS0gYSA+Y250CisJdGVzdCAkPyA9IDAgJiYgdGVzdCAkKHdjIC1sIDxjbnQpID0gMAorJwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtdHJlZSBIRUFEXiBIRUFEIC0tIGInICcKKwlnaXQgZGlmZi10cmVlIC0tcXVpZXQgSEVBRF4gSEVBRCAtLSBiID5jbnQKKwl0ZXN0ICQ/ID0gMSAmJiB0ZXN0ICQod2MgLWwgPGNudCkgPSAwCisnCisjIHRoaXMgZGlmZiBvdXRwdXRzIG9uZSBsaW5lOiBzaGExIG9mIHRoZSBnaXZlbiBoZWFkCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdlY2hvIEhFQUQgfCBnaXQgZGlmZi10cmVlIC0tc3RkaW4nICcKKwllY2hvICQoZ2l0IHJldi1wYXJzZSBIRUFEKSB8IGdpdCBkaWZmLXRyZWUgLS1xdWlldCAtLXN0ZGluID5jbnQKKwl0ZXN0ICQ/ID0gMSAmJiB0ZXN0ICQod2MgLWwgPGNudCkgPSAxCisnCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZi10cmVlIEhFQUQgSEVBRCcgJworCWdpdCBkaWZmLXRyZWUgLS1xdWlldCBIRUFEIEhFQUQgPmNudAorCXRlc3QgJD8gPSAwICYmIHRlc3QgJCh3YyAtbCA8Y250KSA9IDAKKycKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmLWZpbGVzJyAnCisJZ2l0IGRpZmYtZmlsZXMgLS1xdWlldCA+Y250CisJdGVzdCAkPyA9IDAgJiYgdGVzdCAkKHdjIC1sIDxjbnQpID0gMAorJwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtaW5kZXggLS1jYWNoZWQgSEVBRCcgJworCWdpdCBkaWZmLWluZGV4IC0tcXVpZXQgLS1jYWNoZWQgSEVBRCA+Y250CisJdGVzdCAkPyA9IDAgJiYgdGVzdCAkKHdjIC1sIDxjbnQpID0gMAorJwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtaW5kZXggLS1jYWNoZWQgSEVBRF4nICcKKwlnaXQgZGlmZi1pbmRleCAtLXF1aWV0IC0tY2FjaGVkIEhFQUReID5jbnQKKwl0ZXN0ICQ/ID0gMSAmJiB0ZXN0ICQod2MgLWwgPGNudCkgPSAwCisnCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCBIRUFEXicgJworCWVjaG8gdGV4dCA+PmIgJiYKKwllY2hvIDMgPmMgJiYKKwlnaXQgYWRkIC4gJiYgeworCQlnaXQgZGlmZi1pbmRleCAtLXF1aWV0IC0tY2FjaGVkIEhFQUReID5jbnQKKwkJdGVzdCAkPyA9IDEgJiYgdGVzdCAkKHdjIC1sIDxjbnQpID0gMAorCX0KKycKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmLXRyZWUgLVN0ZXh0IEhFQUReIEhFQUQgLS0gYicgJworCWdpdCBjb21taXQgLW0gInRleHQgaW4gYiIgJiYgeworCQlnaXQgZGlmZi10cmVlIC0tcXVpZXQgLVN0ZXh0IEhFQUReIEhFQUQgLS0gYiA+Y250CisJCXRlc3QgJD8gPSAxICYmIHRlc3QgJCh3YyAtbCA8Y250KSA9IDAKKwl9CisnCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgZGlmZi10cmVlIC1Tbm90LWZvdW5kIEhFQUReIEhFQUQgLS0gYicgJworCWdpdCBkaWZmLXRyZWUgLS1xdWlldCAtU25vdC1mb3VuZCBIRUFEXiBIRUFEIC0tIGIgPmNudAorCXRlc3QgJD8gPSAwICYmIHRlc3QgJCh3YyAtbCA8Y250KSA9IDAKKycKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmLWZpbGVzJyAnCisJZWNobyAzID4+YyAmJiB7CisJCWdpdCBkaWZmLWZpbGVzIC0tcXVpZXQgPmNudAorCQl0ZXN0ICQ/ID0gMSAmJiB0ZXN0ICQod2MgLWwgPGNudCkgPSAwCisJfQorJwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYtaW5kZXggLS1jYWNoZWQgSEVBRCcgJworCWdpdCB1cGRhdGUtaW5kZXggYyAmJiB7CisJCWdpdCBkaWZmLWluZGV4IC0tcXVpZXQgLS1jYWNoZWQgSEVBRCA+Y250CisJCXRlc3QgJD8gPSAxICYmIHRlc3QgJCh3YyAtbCA8Y250KSA9IDAKKwl9CisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAxOC1kaWZmLWZ1bmNuYW1lLnNoIGIvdC90NDAxOC1kaWZmLWZ1bmNuYW1lLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY5ZGI4MWQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDE4LWRpZmYtZnVuY25hbWUuc2gKQEAgLTAsMCArMSw2MCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBKb2hhbm5lcyBFLiBTY2hpbmRlbGluCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgY3VzdG9tIGRpZmYgZnVuY3Rpb24gbmFtZSBwYXR0ZXJucycKKworLiAuL3Rlc3QtbGliLnNoCisKK0xGPScKKycKKworY2F0ID4gQmVlci5qYXZhIDw8IEVPRgorcHVibGljIGNsYXNzIEJlZXIKK3sKKwlpbnQgc3BlY2lhbDsKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKQorCXsKKwkJU3RyaW5nIHM9IiAiOworCQlmb3IoaW50IHggPSA5OTsgeCA+IDA7IHgtLSkKKwkJeworCQkJU3lzdGVtLm91dC5wcmludCh4ICsgIiBib3R0bGVzIG9mIGJlZXIgb24gdGhlIHdhbGwgIgorCQkJCSsgeCArICIgYm90dGxlcyBvZiBiZWVyXG4iCisJCQkJKyAiVGFrZSBvbmUgZG93biwgcGFzcyBpdCBhcm91bmQsICIgKyAoeCAtIDEpCisJCQkJKyAiIGJvdHRsZXMgb2YgYmVlciBvbiB0aGUgd2FsbC5cbiIpOworCQl9CisJCVN5c3RlbS5vdXQucHJpbnQoIkdvIHRvIHRoZSBzdG9yZSwgYnV5IHNvbWUgbW9yZSxcbiIKKwkJCSsgIjk5IGJvdHRsZXMgb2YgYmVlciBvbiB0aGUgd2FsbC5cbiIpOworCX0KK30KK0VPRgorCitzZWQgJ3MvYmVlclxcL2JlZXIsXFwvJyA8IEJlZXIuamF2YSA+IEJlZXItY29ycmVjdC5qYXZhCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2RlZmF1bHQgYmVoYXZpb3VyJyAnCisJZ2l0IGRpZmYgQmVlci5qYXZhIEJlZXItY29ycmVjdC5qYXZhIHwKKwlncmVwICJeQEAuKkBAIHB1YmxpYyBjbGFzcyBCZWVyIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwcmVzZXQgamF2YSBwYXR0ZXJuJyAnCisJZWNobyAiKi5qYXZhIGRpZmY9amF2YSIgPi5naXRhdHRyaWJ1dGVzICYmCisJZ2l0IGRpZmYgQmVlci5qYXZhIEJlZXItY29ycmVjdC5qYXZhIHwKKwlncmVwICJeQEAuKkBAIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCIKKycKKworZ2l0IGNvbmZpZyBkaWZmLmphdmEuZnVuY25hbWUgJyFzdGF0aWMKKyFTdHJpbmcKK1teIAldLipzLionCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2N1c3RvbSBwYXR0ZXJuJyAnCisJZ2l0IGRpZmYgQmVlci5qYXZhIEJlZXItY29ycmVjdC5qYXZhIHwKKwlncmVwICJeQEAuKkBAIGludCBzcGVjaWFsOyQiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2xhc3QgcmVnZXhwIG11c3Qgbm90IGJlIG5lZ2F0ZWQnICcKKwlnaXQgY29uZmlnIGRpZmYuamF2YS5mdW5jbmFtZSAiIXN0YXRpYyIgJiYKKwkhIGdpdCBkaWZmIEJlZXIuamF2YSBCZWVyLWNvcnJlY3QuamF2YQorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMTktZGlmZi13c2Vycm9yLnNoIGIvdC90NDAxOS1kaWZmLXdzZXJyb3Iuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGQ5Y2JiNgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTktZGlmZi13c2Vycm9yLnNoCkBAIC0wLDAgKzEsMTYzIEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nZGlmZiB3aGl0ZXNwYWNlIGVycm9yIGRldGVjdGlvbicKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJZ2l0IGNvbmZpZyBkaWZmLmNvbG9yLndoaXRlc3BhY2UgImJsdWUgcmV2ZXJzZSIgJiYKKwk+RiAmJgorCWdpdCBhZGQgRiAmJgorCWVjaG8gIiAgICAgICAgIEVpZ2h0IFNQIGluZGVudCIgPj5GICYmCisJZWNobyAiIAlIVCBhbmQgU1AgaW5kZW50IiA+PkYgJiYKKwllY2hvICJXaXRoIHRyYWlsaW5nIFNQICIgPj5GICYmCisJZWNobyAiQ2FycmlhZ2UgUmV0dXJuUSIgfCB0ciBRICJcMDE1IiA+PkYgJiYKKwllY2hvICJObyBwcm9ibGVtIiA+PkYKKworJworCitibHVlX2dyZXA9Jzc7MzRtJyA7IyBFU0MgWyA3IDsgMyA0IG0KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBkZWZhdWx0ICcKKworCWdpdCBkaWZmIC0tY29sb3IgPm91dHB1dAorCWdyZXAgIiRibHVlX2dyZXAiIG91dHB1dCA+ZXJyb3IKKwlncmVwIC12ICIkYmx1ZV9ncmVwIiBvdXRwdXQgPm5vcm1hbAorCisJZ3JlcCBFaWdodCBub3JtYWwgPi9kZXYvbnVsbCAmJgorCWdyZXAgSFQgZXJyb3IgPi9kZXYvbnVsbCAmJgorCWdyZXAgV2l0aCBlcnJvciA+L2Rldi9udWxsICYmCisJZ3JlcCBSZXR1cm4gZXJyb3IgPi9kZXYvbnVsbCAmJgorCWdyZXAgTm8gbm9ybWFsID4vZGV2L251bGwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd3aXRob3V0IC10cmFpbCcgJworCisJZ2l0IGNvbmZpZyBjb3JlLndoaXRlc3BhY2UgLXRyYWlsCisJZ2l0IGRpZmYgLS1jb2xvciA+b3V0cHV0CisJZ3JlcCAiJGJsdWVfZ3JlcCIgb3V0cHV0ID5lcnJvcgorCWdyZXAgLXYgIiRibHVlX2dyZXAiIG91dHB1dCA+bm9ybWFsCisKKwlncmVwIEVpZ2h0IG5vcm1hbCA+L2Rldi9udWxsICYmCisJZ3JlcCBIVCBlcnJvciA+L2Rldi9udWxsICYmCisJZ3JlcCBXaXRoIG5vcm1hbCA+L2Rldi9udWxsICYmCisJZ3JlcCBSZXR1cm4gbm9ybWFsID4vZGV2L251bGwgJiYKKwlncmVwIE5vIG5vcm1hbCA+L2Rldi9udWxsCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnd2l0aG91dCAtdHJhaWwgKGF0dHJpYnV0ZSknICcKKworCWdpdCBjb25maWcgLS11bnNldCBjb3JlLndoaXRlc3BhY2UKKwllY2hvICJGIHdoaXRlc3BhY2U9LXRyYWlsIiA+LmdpdGF0dHJpYnV0ZXMKKwlnaXQgZGlmZiAtLWNvbG9yID5vdXRwdXQKKwlncmVwICIkYmx1ZV9ncmVwIiBvdXRwdXQgPmVycm9yCisJZ3JlcCAtdiAiJGJsdWVfZ3JlcCIgb3V0cHV0ID5ub3JtYWwKKworCWdyZXAgRWlnaHQgbm9ybWFsID4vZGV2L251bGwgJiYKKwlncmVwIEhUIGVycm9yID4vZGV2L251bGwgJiYKKwlncmVwIFdpdGggbm9ybWFsID4vZGV2L251bGwgJiYKKwlncmVwIFJldHVybiBub3JtYWwgPi9kZXYvbnVsbCAmJgorCWdyZXAgTm8gbm9ybWFsID4vZGV2L251bGwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd3aXRob3V0IC1zcGFjZScgJworCisJcm0gLWYgLmdpdGF0dHJpYnV0ZXMKKwlnaXQgY29uZmlnIGNvcmUud2hpdGVzcGFjZSAtc3BhY2UKKwlnaXQgZGlmZiAtLWNvbG9yID5vdXRwdXQKKwlncmVwICIkYmx1ZV9ncmVwIiBvdXRwdXQgPmVycm9yCisJZ3JlcCAtdiAiJGJsdWVfZ3JlcCIgb3V0cHV0ID5ub3JtYWwKKworCWdyZXAgRWlnaHQgbm9ybWFsID4vZGV2L251bGwgJiYKKwlncmVwIEhUIG5vcm1hbCA+L2Rldi9udWxsICYmCisJZ3JlcCBXaXRoIGVycm9yID4vZGV2L251bGwgJiYKKwlncmVwIFJldHVybiBlcnJvciA+L2Rldi9udWxsICYmCisJZ3JlcCBObyBub3JtYWwgPi9kZXYvbnVsbAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3dpdGhvdXQgLXNwYWNlIChhdHRyaWJ1dGUpJyAnCisKKwlnaXQgY29uZmlnIC0tdW5zZXQgY29yZS53aGl0ZXNwYWNlCisJZWNobyAiRiB3aGl0ZXNwYWNlPS1zcGFjZSIgPi5naXRhdHRyaWJ1dGVzCisJZ2l0IGRpZmYgLS1jb2xvciA+b3V0cHV0CisJZ3JlcCAiJGJsdWVfZ3JlcCIgb3V0cHV0ID5lcnJvcgorCWdyZXAgLXYgIiRibHVlX2dyZXAiIG91dHB1dCA+bm9ybWFsCisKKwlncmVwIEVpZ2h0IG5vcm1hbCA+L2Rldi9udWxsICYmCisJZ3JlcCBIVCBub3JtYWwgPi9kZXYvbnVsbCAmJgorCWdyZXAgV2l0aCBlcnJvciA+L2Rldi9udWxsICYmCisJZ3JlcCBSZXR1cm4gZXJyb3IgPi9kZXYvbnVsbCAmJgorCWdyZXAgTm8gbm9ybWFsID4vZGV2L251bGwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd3aXRoIGluZGVudC1ub24tdGFiIG9ubHknICcKKworCXJtIC1mIC5naXRhdHRyaWJ1dGVzCisJZ2l0IGNvbmZpZyBjb3JlLndoaXRlc3BhY2UgaW5kZW50LC10cmFpbGluZywtc3BhY2UKKwlnaXQgZGlmZiAtLWNvbG9yID5vdXRwdXQKKwlncmVwICIkYmx1ZV9ncmVwIiBvdXRwdXQgPmVycm9yCisJZ3JlcCAtdiAiJGJsdWVfZ3JlcCIgb3V0cHV0ID5ub3JtYWwKKworCWdyZXAgRWlnaHQgZXJyb3IgPi9kZXYvbnVsbCAmJgorCWdyZXAgSFQgbm9ybWFsID4vZGV2L251bGwgJiYKKwlncmVwIFdpdGggbm9ybWFsID4vZGV2L251bGwgJiYKKwlncmVwIFJldHVybiBub3JtYWwgPi9kZXYvbnVsbCAmJgorCWdyZXAgTm8gbm9ybWFsID4vZGV2L251bGwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd3aXRoIGluZGVudC1ub24tdGFiIG9ubHkgKGF0dHJpYnV0ZSknICcKKworCWdpdCBjb25maWcgLS11bnNldCBjb3JlLndoaXRlc3BhY2UKKwllY2hvICJGIHdoaXRlc3BhY2U9aW5kZW50LC10cmFpbGluZywtc3BhY2UiID4uZ2l0YXR0cmlidXRlcworCWdpdCBkaWZmIC0tY29sb3IgPm91dHB1dAorCWdyZXAgIiRibHVlX2dyZXAiIG91dHB1dCA+ZXJyb3IKKwlncmVwIC12ICIkYmx1ZV9ncmVwIiBvdXRwdXQgPm5vcm1hbAorCisJZ3JlcCBFaWdodCBlcnJvciA+L2Rldi9udWxsICYmCisJZ3JlcCBIVCBub3JtYWwgPi9kZXYvbnVsbCAmJgorCWdyZXAgV2l0aCBub3JtYWwgPi9kZXYvbnVsbCAmJgorCWdyZXAgUmV0dXJuIG5vcm1hbCA+L2Rldi9udWxsICYmCisJZ3JlcCBObyBub3JtYWwgPi9kZXYvbnVsbAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3dpdGggY3ItYXQtZW9sJyAnCisKKwlybSAtZiAuZ2l0YXR0cmlidXRlcworCWdpdCBjb25maWcgY29yZS53aGl0ZXNwYWNlIGNyLWF0LWVvbAorCWdpdCBkaWZmIC0tY29sb3IgPm91dHB1dAorCWdyZXAgIiRibHVlX2dyZXAiIG91dHB1dCA+ZXJyb3IKKwlncmVwIC12ICIkYmx1ZV9ncmVwIiBvdXRwdXQgPm5vcm1hbAorCisJZ3JlcCBFaWdodCBub3JtYWwgPi9kZXYvbnVsbCAmJgorCWdyZXAgSFQgZXJyb3IgPi9kZXYvbnVsbCAmJgorCWdyZXAgV2l0aCBlcnJvciA+L2Rldi9udWxsICYmCisJZ3JlcCBSZXR1cm4gbm9ybWFsID4vZGV2L251bGwgJiYKKwlncmVwIE5vIG5vcm1hbCA+L2Rldi9udWxsCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnd2l0aCBjci1hdC1lb2wgKGF0dHJpYnV0ZSknICcKKworCWdpdCBjb25maWcgLS11bnNldCBjb3JlLndoaXRlc3BhY2UKKwllY2hvICJGIHdoaXRlc3BhY2U9dHJhaWxpbmcsY3ItYXQtZW9sIiA+LmdpdGF0dHJpYnV0ZXMKKwlnaXQgZGlmZiAtLWNvbG9yID5vdXRwdXQKKwlncmVwICIkYmx1ZV9ncmVwIiBvdXRwdXQgPmVycm9yCisJZ3JlcCAtdiAiJGJsdWVfZ3JlcCIgb3V0cHV0ID5ub3JtYWwKKworCWdyZXAgRWlnaHQgbm9ybWFsID4vZGV2L251bGwgJiYKKwlncmVwIEhUIGVycm9yID4vZGV2L251bGwgJiYKKwlncmVwIFdpdGggZXJyb3IgPi9kZXYvbnVsbCAmJgorCWdyZXAgUmV0dXJuIG5vcm1hbCA+L2Rldi9udWxsICYmCisJZ3JlcCBObyBub3JtYWwgPi9kZXYvbnVsbAorCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAyMC1kaWZmLWV4dGVybmFsLnNoIGIvdC90NDAyMC1kaWZmLWV4dGVybmFsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzN2I0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDIwLWRpZmYtZXh0ZXJuYWwuc2gKQEAgLTAsMCArMSwxMTAgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdleHRlcm5hbCBkaWZmIGludGVyZmFjZSB0ZXN0JworCisuIC4vdGVzdC1saWIuc2gKKworX3o0MD0wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJdGVzdF90aWNrICYmCisJZWNobyBpbml0aWFsID5maWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJZ2l0IGNvbW1pdCAtbSBpbml0aWFsICYmCisKKwl0ZXN0X3RpY2sgJiYKKwllY2hvIHNlY29uZCA+ZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCWdpdCBjb21taXQgLW0gc2Vjb25kICYmCisKKwl0ZXN0X3RpY2sgJiYKKwllY2hvIHRoaXJkID5maWxlCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ0dJVF9FWFRFUk5BTF9ESUZGIGVudmlyb25tZW50JyAnCisKKwlHSVRfRVhURVJOQUxfRElGRj1lY2hvIGdpdCBkaWZmIHwgeworCQlyZWFkIHBhdGggb2xkZmlsZSBvbGRoZXggb2xkbW9kZSBuZXdmaWxlIG5ld2hleCBuZXdtb2RlICYmCisJCXRlc3QgInokcGF0aCIgPSB6ZmlsZSAmJgorCQl0ZXN0ICJ6JG9sZG1vZGUiID0gejEwMDY0NCAmJgorCQl0ZXN0ICJ6JG5ld2hleCIgPSAieiRfejQwIiAmJgorCQl0ZXN0ICJ6JG5ld21vZGUiID0gejEwMDY0NCAmJgorCQlvaD0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRDpmaWxlKSAmJgorCQl0ZXN0ICJ6JG9oIiA9ICJ6JG9sZGhleCIKKwl9CisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnR0lUX0VYVEVSTkFMX0RJRkYgZW52aXJvbm1lbnQgc2hvdWxkIGFwcGx5IG9ubHkgdG8gZGlmZicgJworCisJR0lUX0VYVEVSTkFMX0RJRkY9ZWNobyBnaXQgbG9nIC1wIC0xIEhFQUQgfAorCWdyZXAgIl5kaWZmIC0tZ2l0IGEvZmlsZSBiL2ZpbGUiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZGlmZiBhdHRyaWJ1dGUnICcKKworCWdpdCBjb25maWcgZGlmZi5wYXJyb3QuY29tbWFuZCBlY2hvICYmCisKKwllY2hvID4uZ2l0YXR0cmlidXRlcyAiZmlsZSBkaWZmPXBhcnJvdCIgJiYKKworCWdpdCBkaWZmIHwgeworCQlyZWFkIHBhdGggb2xkZmlsZSBvbGRoZXggb2xkbW9kZSBuZXdmaWxlIG5ld2hleCBuZXdtb2RlICYmCisJCXRlc3QgInokcGF0aCIgPSB6ZmlsZSAmJgorCQl0ZXN0ICJ6JG9sZG1vZGUiID0gejEwMDY0NCAmJgorCQl0ZXN0ICJ6JG5ld2hleCIgPSAieiRfejQwIiAmJgorCQl0ZXN0ICJ6JG5ld21vZGUiID0gejEwMDY0NCAmJgorCQlvaD0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRDpmaWxlKSAmJgorCQl0ZXN0ICJ6JG9oIiA9ICJ6JG9sZGhleCIKKwl9CisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZGlmZiBhdHRyaWJ1dGUgc2hvdWxkIGFwcGx5IG9ubHkgdG8gZGlmZicgJworCisJZ2l0IGxvZyAtcCAtMSBIRUFEIHwKKwlncmVwICJeZGlmZiAtLWdpdCBhL2ZpbGUgYi9maWxlIgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2RpZmYgYXR0cmlidXRlJyAnCisKKwlnaXQgY29uZmlnIC0tdW5zZXQgZGlmZi5wYXJyb3QuY29tbWFuZCAmJgorCWdpdCBjb25maWcgZGlmZi5jb2xvci5jb21tYW5kIGVjaG8gJiYKKworCWVjaG8gPi5naXRhdHRyaWJ1dGVzICJmaWxlIGRpZmY9Y29sb3IiICYmCisKKwlnaXQgZGlmZiB8IHsKKwkJcmVhZCBwYXRoIG9sZGZpbGUgb2xkaGV4IG9sZG1vZGUgbmV3ZmlsZSBuZXdoZXggbmV3bW9kZSAmJgorCQl0ZXN0ICJ6JHBhdGgiID0gemZpbGUgJiYKKwkJdGVzdCAieiRvbGRtb2RlIiA9IHoxMDA2NDQgJiYKKwkJdGVzdCAieiRuZXdoZXgiID0gInokX3o0MCIgJiYKKwkJdGVzdCAieiRuZXdtb2RlIiA9IHoxMDA2NDQgJiYKKwkJb2g9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQ6ZmlsZSkgJiYKKwkJdGVzdCAieiRvaCIgPSAieiRvbGRoZXgiCisJfQorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2RpZmYgYXR0cmlidXRlIHNob3VsZCBhcHBseSBvbmx5IHRvIGRpZmYnICcKKworCWdpdCBsb2cgLXAgLTEgSEVBRCB8CisJZ3JlcCAiXmRpZmYgLS1naXQgYS9maWxlIGIvZmlsZSIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdubyBkaWZmIHdpdGggLWRpZmYnICcKKwllY2hvID4uZ2l0YXR0cmlidXRlcyAiZmlsZSAtZGlmZiIgJiYKKwlnaXQgZGlmZiB8IGdyZXAgQmluYXJ5CisnCisKK2VjaG8gTlVMWmJldHdlZW5ad29yZHMgfCBwZXJsIC1wZSAneS9aL1wwMDAvJyA+IGZpbGUKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZm9yY2UgZGlmZiB3aXRoICJkaWZmIicgJworCWVjaG8gPi5naXRhdHRyaWJ1dGVzICJmaWxlIGRpZmYiICYmCisJZ2l0IGRpZmYgPmFjdHVhbCAmJgorCXRlc3RfY21wIC4uL3Q0MDIwL2RpZmYuTlVMIGFjdHVhbAorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMjAvZGlmZi5OVUwgYi90L3Q0MDIwL2RpZmYuTlVMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMmY4OTAKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDIwL2RpZmYuTlVMCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3QvdDQwMjEtZm9ybWF0LXBhdGNoLW51bWJlcmVkLnNoIGIvdC90NDAyMS1mb3JtYXQtcGF0Y2gtbnVtYmVyZWQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDNkNjRiYgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMjEtZm9ybWF0LXBhdGNoLW51bWJlcmVkLnNoCkBAIC0wLDAgKzEsMTA2IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEJyaWFuIEMgR2VybmhhcmR0CisjCisKK3Rlc3RfZGVzY3JpcHRpb249J0Zvcm1hdC1wYXRjaCBudW1iZXJpbmcgb3B0aW9ucycKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJZWNobyBBID4gZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCWdpdCBjb21taXQgLW0gRmlyc3QgJiYKKworCWVjaG8gQiA+PiBmaWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSBTZWNvbmQgJiYKKworCWVjaG8gQyA+PiBmaWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSBUaGlyZAorCisnCisKKyMgRWFjaCBvZiB0aGVzZSBnZXRzIHVzZWQgbXVsdGlwbGUgdGltZXMuCisKK3Rlc3RfbnVtX25vX251bWJlcmVkKCkgeworCWNudD0kKGdyZXAgIl5TdWJqZWN0OiBcW1BBVENIXF0iICQxIHwgd2MgLWwpICYmCisJdGVzdCAkY250ID0gJDIKK30KKwordGVzdF9zaW5nbGVfbm9fbnVtYmVyZWQoKSB7CisJdGVzdF9udW1fbm9fbnVtYmVyZWQgJDEgMQorfQorCit0ZXN0X25vX251bWJlcmVkKCkgeworCXRlc3RfbnVtX25vX251bWJlcmVkICQxIDIKK30KKwordGVzdF9zaW5nbGVfbnVtYmVyZWQoKSB7CisJZ3JlcCAiXlN1YmplY3Q6IFxbUEFUQ0ggMS8xXF0iICQxCit9CisKK3Rlc3RfbnVtYmVyZWQoKSB7CisJZ3JlcCAiXlN1YmplY3Q6IFxbUEFUQ0ggMS8yXF0iICQxICYmCisJZ3JlcCAiXlN1YmplY3Q6IFxbUEFUQ0ggMi8yXF0iICQxCit9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ0RlZmF1bHQ6IG5vIG51bWJlcmVkJyAnCisKKwlnaXQgZm9ybWF0LXBhdGNoIC0tc3Rkb3V0IEhFQUR+MiA+cGF0Y2gwICYmCisJdGVzdF9ub19udW1iZXJlZCBwYXRjaDAKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdVc2UgLS1udW1iZXJlZCcgJworCisJZ2l0IGZvcm1hdC1wYXRjaCAtLW51bWJlcmVkIC0tc3Rkb3V0IEhFQUR+MiA+cGF0Y2gxICYmCisJdGVzdF9udW1iZXJlZCBwYXRjaDEKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmb3JtYXQubnVtYmVyZWQgPSB0cnVlJyAnCisKKwlnaXQgY29uZmlnIGZvcm1hdC5udW1iZXJlZCB0cnVlICYmCisJZ2l0IGZvcm1hdC1wYXRjaCAtLXN0ZG91dCBIRUFEfjIgPnBhdGNoMiAmJgorCXRlc3RfbnVtYmVyZWQgcGF0Y2gyCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZm9ybWF0Lm51bWJlcmVkICYmIHNpbmdsZSBwYXRjaCcgJworCisJZ2l0IGZvcm1hdC1wYXRjaCAtLXN0ZG91dCBIRUFEXiA+IHBhdGNoMyAmJgorCXRlc3Rfc2luZ2xlX251bWJlcmVkIHBhdGNoMworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Zvcm1hdC5udW1iZXJlZCAmJiAtLW5vLW51bWJlcmVkJyAnCisKKwlnaXQgZm9ybWF0LXBhdGNoIC0tbm8tbnVtYmVyZWQgLS1zdGRvdXQgSEVBRH4yID5wYXRjaDQgJiYKKwl0ZXN0X25vX251bWJlcmVkIHBhdGNoNAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Zvcm1hdC5udW1iZXJlZCA9IGF1dG8nICcKKworCWdpdCBjb25maWcgZm9ybWF0Lm51bWJlcmVkIGF1dG8KKwlnaXQgZm9ybWF0LXBhdGNoIC0tc3Rkb3V0IEhFQUR+MiA+IHBhdGNoNSAmJgorCXRlc3RfbnVtYmVyZWQgcGF0Y2g1CisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZm9ybWF0Lm51bWJlcmVkID0gYXV0byAmJiBzaW5nbGUgcGF0Y2gnICcKKworCWdpdCBmb3JtYXQtcGF0Y2ggLS1zdGRvdXQgSEVBRF4gPiBwYXRjaDYgJiYKKwl0ZXN0X3NpbmdsZV9ub19udW1iZXJlZCBwYXRjaDYKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmb3JtYXQubnVtYmVyZWQgPSBhdXRvICYmIC0tbm8tbnVtYmVyZWQnICcKKworCWdpdCBmb3JtYXQtcGF0Y2ggLS1uby1udW1iZXJlZCAtLXN0ZG91dCBIRUFEfjIgPiBwYXRjaDcgJiYKKwl0ZXN0X25vX251bWJlcmVkIHBhdGNoNworCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAyMS1mb3JtYXQtcGF0Y2gtc2lnbmVyLW1pbWUuc2ggYi90L3Q0MDIxLWZvcm1hdC1wYXRjaC1zaWduZXItbWltZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYTQzZjE4Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAyMS1mb3JtYXQtcGF0Y2gtc2lnbmVyLW1pbWUuc2gKQEAgLTAsMCArMSw1MCBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J2Zvcm1hdC1wYXRjaCAtcyBzaG91bGQgZm9yY2UgTUlNRSBlbmNvZGluZyBhcyBuZWVkZWQnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKworCT5GICYmCisJZ2l0IGFkZCBGICYmCisJZ2l0IGNvbW1pdCAtbSBpbml0aWFsICYmCisJZWNobyBuZXcgbGluZSA+RiAmJgorCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSAiVGhpcyBhZGRzIHNvbWUgbGluZXMgdG8gRiIgRgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Zvcm1hdCBub3JtYWxseScgJworCisJZ2l0IGZvcm1hdC1wYXRjaCAtLXN0ZG91dCAtMSA+b3V0cHV0ICYmCisJISBncmVwIENvbnRlbnQtVHlwZSBvdXRwdXQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmb3JtYXQgd2l0aCBzaWdub2ZmIHdpdGhvdXQgZnVubnkgc2lnbmVyIG5hbWUnICcKKworCWdpdCBmb3JtYXQtcGF0Y2ggLXMgLS1zdGRvdXQgLTEgPm91dHB1dCAmJgorCSEgZ3JlcCBDb250ZW50LVR5cGUgb3V0cHV0CisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZm9ybWF0IHdpdGggbm9uIEFTQ0lJIHNpZ25lciBuYW1lJyAnCisKKwlHSVRfQ09NTUlUVEVSX05BTUU9IuOBr+OBvuOBriDjgbXjgavjgYrjgYYiIFwKKwlnaXQgZm9ybWF0LXBhdGNoIC1zIC0tc3Rkb3V0IC0xID5vdXRwdXQgJiYKKwlncmVwIENvbnRlbnQtVHlwZSBvdXRwdXQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhdHRhY2ggYW5kIHNpZ25vZmYgZG8gbm90IGR1cGxpY2F0ZSBtaW1lIGhlYWRlcnMnICcKKworCUdJVF9DT01NSVRURVJfTkFNRT0i44Gv44G+44GuIOOBteOBq+OBiuOBhiIgXAorCWdpdCBmb3JtYXQtcGF0Y2ggLXMgLS1zdGRvdXQgLTEgLS1hdHRhY2ggPm91dHB1dCAmJgorCXRlc3QgYGdyZXAgLWNpIF5NSU1FLVZlcnNpb246IG91dHB1dGAgPSAxCisKKycKKwordGVzdF9kb25lCisKZGlmZiAtLWdpdCBhL3QvdDQwMjItZGlmZi1yZXdyaXRlLnNoIGIvdC90NDAyMi1kaWZmLXJld3JpdGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmY5OTZmYwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMjItZGlmZi1yZXdyaXRlLnNoCkBAIC0wLDAgKzEsMjkgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdyZXdyaXRlIGRpZmYnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKworCWNhdCAuLi8uLi9DT1BZSU5HID50ZXN0ICYmCisJZ2l0IGFkZCB0ZXN0ICYmCisJdHIgXAorCSAgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiIFwKKwkgICJub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbU5PUFFSU1RVVldYWVpBQkNERUZHSElKS0xNIiBcCisJICA8Li4vLi4vQ09QWUlORyA+dGVzdAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2RldGVjdCByZXdyaXRlJyAnCisKKwlhY3R1YWw9JChnaXQgZGlmZi1maWxlcyAtQiAtLXN1bW1hcnkgdGVzdCkgJiYKKwlleHByICIkYWN0dWFsIiA6ICIgcmV3cml0ZSB0ZXN0IChbMC05XSolKSQiIHx8IHsKKwkJZWNobyAiRWg/IDw8JGFjdHVhbD4+IgorCQlmYWxzZQorCX0KKworJworCit0ZXN0X2RvbmUKKwpkaWZmIC0tZ2l0IGEvdC90NDAyMy1kaWZmLXJlbmFtZS10eXBlY2hhbmdlLnNoIGIvdC90NDAyMy1kaWZmLXJlbmFtZS10eXBlY2hhbmdlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRkYmZjNmUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDIzLWRpZmYtcmVuYW1lLXR5cGVjaGFuZ2Uuc2gKQEAgLTAsMCArMSw4NiBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J3R5cGVjaGFuZ2UgcmVuYW1lIGRldGVjdGlvbicKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJcm0gLWYgZm9vIGJhciAmJgorCWNhdCAuLi8uLi9DT1BZSU5HID5mb28gJiYKKwlsbiAtcyBsaW5rbGluayBiYXIgJiYKKwlnaXQgYWRkIGZvbyBiYXIgJiYKKwlnaXQgY29tbWl0IC1hIC1tIEluaXRpYWwgJiYKKwlnaXQgdGFnIG9uZSAmJgorCisJcm0gLWYgZm9vIGJhciAmJgorCWNhdCAuLi8uLi9DT1BZSU5HID5iYXIgJiYKKwlsbiAtcyBsaW5rbGluayBmb28gJiYKKwlnaXQgYWRkIGZvbyBiYXIgJiYKKwlnaXQgY29tbWl0IC1hIC1tIFNlY29uZCAmJgorCWdpdCB0YWcgdHdvICYmCisKKwlybSAtZiBmb28gYmFyICYmCisJY2F0IC4uLy4uL0NPUFlJTkcgPmZvbyAmJgorCWdpdCBhZGQgZm9vICYmCisJZ2l0IGNvbW1pdCAtYSAtbSBUaGlyZCAmJgorCWdpdCB0YWcgdGhyZWUgJiYKKworCW12IGZvbyBiYXIgJiYKKwlsbiAtcyBsaW5rbGluayBmb28gJiYKKwlnaXQgYWRkIGZvbyBiYXIgJiYKKwlnaXQgY29tbWl0IC1hIC1tIEZvdXJ0aCAmJgorCWdpdCB0YWcgZm91ciAmJgorCisJIyBUaGlzIGlzIHB1cmVseSBmb3Igc2FuaXR5IGNoZWNrCisKKwlybSAtZiBmb28gYmFyICYmCisJY2F0IC4uLy4uL0NPUFlJTkcgPmZvbyAmJgorCWNhdCAuLi8uLi9NYWtlZmlsZSA+YmFyICYmCisJZ2l0IGFkZCBmb28gYmFyICYmCisJZ2l0IGNvbW1pdCAtYSAtbSBGaWZ0aCAmJgorCWdpdCB0YWcgZml2ZSAmJgorCisJcm0gLWYgZm9vIGJhciAmJgorCWNhdCAuLi8uLi9NYWtlZmlsZSA+Zm9vICYmCisJY2F0IC4uLy4uL0NPUFlJTkcgPmJhciAmJgorCWdpdCBhZGQgZm9vIGJhciAmJgorCWdpdCBjb21taXQgLWEgLW0gU2l4dGggJiYKKwlnaXQgdGFnIHNpeAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Nyb3NzIHJlbmFtZXMgdG8gYmUgZGV0ZWN0ZWQgZm9yIHJlZ3VsYXIgZmlsZXMnICcKKworCWdpdCBkaWZmLXRyZWUgZml2ZSBzaXggLXIgLS1uYW1lLXN0YXR1cyAtQiAtTSB8IHNvcnQgPmFjdHVhbCAmJgorCXsKKwkJZWNobyAiUjEwMAlmb28JYmFyIgorCQllY2hvICJSMTAwCWJhcglmb28iCisJfSB8IHNvcnQgPmV4cGVjdCAmJgorCXRlc3RfY21wIGV4cGVjdCBhY3R1YWwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjcm9zcyByZW5hbWVzIHRvIGJlIGRldGVjdGVkIGZvciB0eXBlY2hhbmdlJyAnCisKKwlnaXQgZGlmZi10cmVlIG9uZSB0d28gLXIgLS1uYW1lLXN0YXR1cyAtQiAtTSB8IHNvcnQgPmFjdHVhbCAmJgorCXsKKwkJZWNobyAiUjEwMAlmb28JYmFyIgorCQllY2hvICJSMTAwCWJhcglmb28iCisJfSB8IHNvcnQgPmV4cGVjdCAmJgorCXRlc3RfY21wIGV4cGVjdCBhY3R1YWwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtb3ZlcyBhbmQgcmVuYW1lcycgJworCisJZ2l0IGRpZmYtdHJlZSB0aHJlZSBmb3VyIC1yIC0tbmFtZS1zdGF0dXMgLUIgLU0gfCBzb3J0ID5hY3R1YWwgJiYKKwl7CisJCWVjaG8gIlIxMDAJZm9vCWJhciIKKwkJZWNobyAiVDEwMAlmb28iCisJfSB8IHNvcnQgPmV4cGVjdCAmJgorCXRlc3RfY21wIGV4cGVjdCBhY3R1YWwKKworJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMjQtZGlmZi1vcHRpbWl6ZS1jb21tb24uc2ggYi90L3Q0MDI0LWRpZmYtb3B0aW1pemUtY29tbW9uLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM0ZDczM2YKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDI0LWRpZmYtb3B0aW1pemUtY29tbW9uLnNoCkBAIC0wLDAgKzEsMTU3IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nY29tbW9uIHRhaWwgb3B0aW1pemF0aW9uJworCisuIC4vdGVzdC1saWIuc2gKKworej16enp6enp6eiA7IyA4Cit6PSIkeiR6JHokeiR6JHokeiR6IiA7IyA2NAorej0iJHokeiR6JHokeiR6JHokeiIgOyMgNTEyCit6PSIkeiR6JHokeiIgOyMgMjA0OAorejIwNDc9JChleHByICIkeiIgOiAnLlwoLipcKScpIDsgIzIwNDcKKworeD16enp6enp6enp6CQkJOyMgMTAKK3k9IiR4JHgkeCR4JHgkeCR4JHgkeCR4Igk7IyAxMDAKK3o9IiR5JHkkeSR5JHkkeSR5JHkkeSR5Igk7IyAxMDAwCit6MTAwMD0kegorejEwMD0keQorejEwPSR4CisKK3pzKCkgeworCWNvdW50PSIkMSIKKwl3aGlsZSB0ZXN0ICIkY291bnQiIC1nZSAxMDAwCisJZG8KKwkJY291bnQ9JCgoJGNvdW50IC0gMTAwMCkpCisJCXByaW50ZiAiJXMiICR6MTAwMAorCWRvbmUKKwl3aGlsZSB0ZXN0ICIkY291bnQiIC1nZSAxMDAKKwlkbworCQljb3VudD0kKCgkY291bnQgLSAxMDApKQorCQlwcmludGYgIiVzIiAkejEwMAorCWRvbmUKKwl3aGlsZSB0ZXN0ICIkY291bnQiIC1nZSAxMAorCWRvCisJCWNvdW50PSQoKCRjb3VudCAtIDEwKSkKKwkJcHJpbnRmICIlcyIgJHoxMAorCWRvbmUKKwl3aGlsZSB0ZXN0ICIkY291bnQiIC1nZSAxCisJZG8KKwkJY291bnQ9JCgoJGNvdW50IC0gMSkpCisJCXByaW50ZiAieiIKKwlkb25lCit9CisKK3pjICgpIHsKKwlzZWQgLWUgIi9eaW5kZXgvZCIgXAorCQktZSAicy8kejEwMDAvUS9nIiBcCisJCS1lICJzL1FRUVFRUVFRUS9aOTAwMC9nIiBcCisJCS1lICJzL1FRUVFRUVFRL1o4MDAwL2ciIFwKKwkJLWUgInMvUVFRUVFRUS9aNzAwMC9nIiBcCisJCS1lICJzL1FRUVFRUS9aNjAwMC9nIiBcCisJCS1lICJzL1FRUVFRL1o1MDAwL2ciIFwKKwkJLWUgInMvUVFRUS9aNDAwMC9nIiBcCisJCS1lICJzL1FRUS9aMzAwMC9nIiBcCisJCS1lICJzL1FRL1oyMDAwL2ciIFwKKwkJLWUgInMvUS9aMTAwMC9nIiBcCisJCS1lICJzLyR6MTAwL1EvZyIgXAorCQktZSAicy9RUVFRUVFRUVEvWjkwMC9nIiBcCisJCS1lICJzL1FRUVFRUVFRL1o4MDAvZyIgXAorCQktZSAicy9RUVFRUVFRL1o3MDAvZyIgXAorCQktZSAicy9RUVFRUVEvWjYwMC9nIiBcCisJCS1lICJzL1FRUVFRL1o1MDAvZyIgXAorCQktZSAicy9RUVFRL1o0MDAvZyIgXAorCQktZSAicy9RUVEvWjMwMC9nIiBcCisJCS1lICJzL1FRL1oyMDAvZyIgXAorCQktZSAicy9RL1oxMDAvZyIgXAorCQktZSAicy8wMDBaLy9nIiBcCisJCS1lICJzLyR6MTAvUS9nIiBcCisJCS1lICJzL1FRUVFRUVFRUS9aOTAvZyIgXAorCQktZSAicy9RUVFRUVFRUS9aODAvZyIgXAorCQktZSAicy9RUVFRUVFRL1o3MC9nIiBcCisJCS1lICJzL1FRUVFRUS9aNjAvZyIgXAorCQktZSAicy9RUVFRUS9aNTAvZyIgXAorCQktZSAicy9RUVFRL1o0MC9nIiBcCisJCS1lICJzL1FRUS9aMzAvZyIgXAorCQktZSAicy9RUS9aMjAvZyIgXAorCQktZSAicy9RL1oxMC9nIiBcCisJCS1lICJzLzAwWi8vZyIgXAorCQktZSAicy96L1EvZyIgXAorCQktZSAicy9RUVFRUVFRUVEvWjkvZyIgXAorCQktZSAicy9RUVFRUVFRUS9aOC9nIiBcCisJCS1lICJzL1FRUVFRUVEvWjcvZyIgXAorCQktZSAicy9RUVFRUVEvWjYvZyIgXAorCQktZSAicy9RUVFRUS9aNS9nIiBcCisJCS1lICJzL1FRUVEvWjQvZyIgXAorCQktZSAicy9RUVEvWjMvZyIgXAorCQktZSAicy9RUS9aMi9nIiBcCisJCS1lICJzL1EvWjEvZyIgXAorCQktZSAicy8wWi8vZyIgXAorCTsKK30KKworZXhwZWN0X3BhdHRlcm4gKCkgeworCWNudD0iJDEiCisJY2F0IDw8RU9GCitkaWZmIC0tZ2l0IGEvZmlsZS1hJGNudCBiL2ZpbGUtYSRjbnQKKy0tLSBhL2ZpbGUtYSRjbnQKKysrKyBiL2ZpbGUtYSRjbnQKK0BAIC0xICsxIEBACistWiR7Y250fWEKKytaJHtjbnR9QQorZGlmZiAtLWdpdCBhL2ZpbGUtYiRjbnQgYi9maWxlLWIkY250CistLS0gYS9maWxlLWIkY250CisrKysgYi9maWxlLWIkY250CitAQCAtMSArMSBAQAorLWIKKytCCitkaWZmIC0tZ2l0IGEvZmlsZS1jJGNudCBiL2ZpbGUtYyRjbnQKKy0tLSBhL2ZpbGUtYyRjbnQKKysrKyBiL2ZpbGUtYyRjbnQKK0BAIC0xICsxIEBACistY1okY250CitcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKytDWiRjbnQKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZGlmZiAtLWdpdCBhL2ZpbGUtZCRjbnQgYi9maWxlLWQkY250CistLS0gYS9maWxlLWQkY250CisrKysgYi9maWxlLWQkY250CitAQCAtMSArMSBAQAorLWQKKytECitFT0YKK30KKworc2FtcGxlPScxMDIzIDEwMjQgMTAyNSAyMDQ3IDQwOTUnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJZm9yIG4gaW4gJHNhbXBsZQorCWRvCisJCSggenMgJG4gOyBlY2hvIGEgKSA+ZmlsZS1hJG4gJiYKKwkJKCBlY2hvIGI7IHpzICRuOyBlY2hvICkgPmZpbGUtYiRuICYmCisJCSggcHJpbnRmIGM7IHpzICRuICkgPmZpbGUtYyRuICYmCisJCSggZWNobyBkOyB6cyAkbiApID5maWxlLWQkbiAmJgorCisJCWdpdCBhZGQgZmlsZS1hJG4gZmlsZS1iJG4gZmlsZS1jJG4gZmlsZS1kJG4gJiYKKworCQkoIHpzICRuIDsgZWNobyBBICkgPmZpbGUtYSRuICYmCisJCSggZWNobyBCOyB6cyAkbjsgZWNobyApID5maWxlLWIkbiAmJgorCQkoIHByaW50ZiBDOyB6cyAkbiApID5maWxlLWMkbiAmJgorCQkoIGVjaG8gRDsgenMgJG4gKSA+ZmlsZS1kJG4gJiYKKworCQlleHBlY3RfcGF0dGVybiAkbiB8fCBicmVhaworCisJZG9uZSA+ZXhwZWN0CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2RpZmYgLVUwJyAnCisKKwlmb3IgbiBpbiAkc2FtcGxlCisJZG8KKwkJZ2l0IGRpZmYgLVUwIGZpbGUtPyRuCisJZG9uZSB8IHpjID5hY3R1YWwgJiYKKwl0ZXN0X2NtcCBleHBlY3QgYWN0dWFsCisKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MDI1LWh1bmstaGVhZGVyLnNoIGIvdC90NDAyNS1odW5rLWhlYWRlci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YTNkYmMxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAyNS1odW5rLWhlYWRlci5zaApAQCAtMCwwICsxLDQ0IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nZGlmZiBodW5rIGhlYWRlciB0cnVuY2F0aW9uJworCisuIC4vdGVzdC1saWIuc2gKKworTj0n5pel5pys6KqeJworTjE9J+aXpScKK04yPSfml6XmnKwnCitOUz0iJE4kTiROJE4kTiROJE4kTiROJE4kTiROJE4iCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJKAorCQllY2hvICJBICROUyIKKwkJZm9yIGMgaW4gQiBDIEQgRSBGIEcgSCBJIEogSworCQlkbworCQkJZWNobyAiICAkYyIKKwkJZG9uZQorCQllY2hvICJMICAkTlMiCisJCWZvciBjIGluIE0gTiBPIFAgUSBSIFMgVCBVIFYKKwkJZG8KKwkJCWVjaG8gIiAgJGMiCisJCWRvbmUKKwkpID5maWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisKKwlzZWQgLWUgIi9eICBbRVBdL3MvJC8gbW9kaWZpZWQvIiA8ZmlsZSA+ZmlsZSsgJiYKKwltdiBmaWxlKyBmaWxlCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaHVuayBoZWFkZXIgdHJ1bmNhdGlvbiB3aXRoIGFuIG92ZXJseSBsb25nIGxpbmUnICcKKworCWdpdCBkaWZmIHwgc2VkIC1uIC1lICJzL14uKkBALy9wIiA+YWN0dWFsICYmCisJKAorCQllY2hvICIgQSAkTiROJE4kTiROJE4kTiROJE4yIgorCQllY2hvICIgTCAgJE4kTiROJE4kTiROJE4kTiROMSIKKwkpID5leHBlY3RlZCAmJgorCXRlc3RfY21wIGFjdHVhbCBleHBlY3RlZAorCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAyNi1jb2xvci5zaCBiL3QvdDQwMjYtY29sb3Iuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjYxZTUxNgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMjYtY29sb3Iuc2gKQEAgLTAsMCArMSw2OSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwOCBUaW1vIEhpcnZvbmVuCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgZGlmZi9zdGF0dXMgY29sb3IgZXNjYXBlIGNvZGVzJworLiAuL3Rlc3QtbGliLnNoCisKK2NvbG9yKCkKK3sKKwlnaXQgY29uZmlnIGRpZmYuY29sb3IubmV3ICIkMSIgJiYKKwl0ZXN0ICJgZ2l0IGNvbmZpZyAtLWdldC1jb2xvciBkaWZmLmNvbG9yLm5ld2AiID0gIhskMiIKK30KKworaW52YWxpZF9jb2xvcigpCit7CisJZ2l0IGNvbmZpZyBkaWZmLmNvbG9yLm5ldyAiJDEiICYmCisJdGVzdCAteiAiYGdpdCBjb25maWcgLS1nZXQtY29sb3IgZGlmZi5jb2xvci5uZXcgMj4vZGV2L251bGxgIgorfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZXNldCcgJworCWNvbG9yICJyZXNldCIgIlttIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhdHRyaWJ1dGUgYmVmb3JlIGNvbG9yIG5hbWUnICcKKwljb2xvciAiYm9sZCByZWQiICJbMTszMW0iCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvbG9yIG5hbWUgYmVmb3JlIGF0dHJpYnV0ZScgJworCWNvbG9yICJyZWQgYm9sZCIgIlsxOzMxbSIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXR0ciBmZyBiZycgJworCWNvbG9yICJ1bCBibHVlIHJlZCIgIls0OzM0OzQxbSIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmcgYXR0ciBiZycgJworCWNvbG9yICJibHVlIHVsIHJlZCIgIls0OzM0OzQxbSIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmcgYmcgYXR0cicgJworCWNvbG9yICJibHVlIHJlZCB1bCIgIls0OzM0OzQxbSIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnMjU2IGNvbG9ycycgJworCWNvbG9yICIyNTQgYm9sZCAyNTUiICJbMTszODs1OzI1NDs0ODs1OzI1NW0iCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvbG9yIHRvbyBzbWFsbCcgJworCWludmFsaWRfY29sb3IgIi0yIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb2xvciB0b28gYmlnJyAnCisJaW52YWxpZF9jb2xvciAiMjU2IgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdleHRyYSBjaGFyYWN0ZXIgYWZ0ZXIgY29sb3IgbnVtYmVyJyAnCisJaW52YWxpZF9jb2xvciAiM1giCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2V4dHJhIGNoYXJhY3RlciBhZnRlciBjb2xvciBuYW1lJyAnCisJaW52YWxpZF9jb2xvciAicmVkWCIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZXh0cmEgY2hhcmFjdGVyIGFmdGVyIGF0dHJpYnV0ZScgJworCWludmFsaWRfY29sb3IgImRpbVgiCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAyNy1kaWZmLXN1Ym1vZHVsZS5zaCBiL3QvdDQwMjctZGlmZi1zdWJtb2R1bGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWZkM2ZiNwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMjctZGlmZi1zdWJtb2R1bGUuc2gKQEAgLTAsMCArMSw1MyBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J2RpZmZlcmVuY2UgaW4gc3VibW9kdWxlcycKKworLiAuL3Rlc3QtbGliLnNoCisuIC4uL2RpZmYtbGliLnNoCisKK196NDA9MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJdGVzdF90aWNrICYmCisJdGVzdF9jcmVhdGVfcmVwbyBzdWIgJiYKKwkoCisJCWNkIHN1YiAmJgorCQllY2hvIGhlbGxvID53b3JsZCAmJgorCQlnaXQgYWRkIHdvcmxkICYmCisJCWdpdCBjb21taXQgLW0gc3VibW9kdWxlCisJKSAmJgorCisJdGVzdF90aWNrICYmCisJZWNobyBmcm90eiA+bml0Zm9sICYmCisJZ2l0IGFkZCBuaXRmb2wgc3ViICYmCisJZ2l0IGNvbW1pdCAtbSBzdXBlcnByb2plY3QgJiYKKworCSgKKwkJY2Qgc3ViICYmCisJCWVjaG8gZ29vZGJ5ZSA+d29ybGQgJiYKKwkJZ2l0IGFkZCB3b3JsZCAmJgorCQlnaXQgY29tbWl0IC1tICJzdWJtb2R1bGUgIzIiCisJKSAmJgorCisJc2V0IHggJCgKKwkJY2Qgc3ViICYmCisJCWdpdCByZXYtbGlzdCBIRUFECisJKSAmJgorCWVjaG8gIjoxNjAwMDAgMTYwMDAwICQzICRfejQwIE0Jc3ViIiA+ZXhwZWN0CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmIC0tcmF3IEhFQUQnICcKKwlnaXQgZGlmZiAtLXJhdyAtLWFiYnJldj00MCBIRUFEID5hY3R1YWwgJiYKKwl0ZXN0X2NtcCBleHBlY3QgYWN0dWFsCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmLWluZGV4IC0tcmF3IEhFQUQnICcKKwlnaXQgZGlmZi1pbmRleCAtLXJhdyBIRUFEID5hY3R1YWwuaW5kZXggJiYKKwl0ZXN0X2NtcCBleHBlY3QgYWN0dWFsLmluZGV4CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmLWZpbGVzIC0tcmF3JyAnCisJZ2l0IGRpZmYtZmlsZXMgLS1yYXcgPmFjdHVhbC5maWxlcyAmJgorCXRlc3RfY21wIGV4cGVjdCBhY3R1YWwuZmlsZXMKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MDI4LWZvcm1hdC1wYXRjaC1taW1lLWhlYWRlcnMuc2ggYi90L3Q0MDI4LWZvcm1hdC1wYXRjaC1taW1lLWhlYWRlcnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjA0YmE2NwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMjgtZm9ybWF0LXBhdGNoLW1pbWUtaGVhZGVycy5zaApAQCAtMCwwICsxLDMwIEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nZm9ybWF0LXBhdGNoIG1pbWUgaGVhZGVycyBhbmQgZXh0cmEgaGVhZGVycyBkbyBub3QgY29uZmxpY3QnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY3JlYXRlIGNvbW1pdCB3aXRoIHV0Zi04IGJvZHknICcKKwllY2hvIGNvbnRlbnQgPmZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwlnaXQgY29tbWl0IC1tIG9uZSAmJgorCWVjaG8gbW9yZSA+PmZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJ0d28KKworCXV0Zi04IGJvZHk6IMOxIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwYXRjaCBoYXMgbWltZSBoZWFkZXJzJyAnCisJcm0gLWYgMDAwMS10d28ucGF0Y2ggJiYKKwlnaXQgZm9ybWF0LXBhdGNoIEhFQUReICYmCisJZ3JlcCAtaSAiY29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiAwMDAxLXR3by5wYXRjaAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwYXRjaCBoYXMgbWltZSBhbmQgZXh0cmEgaGVhZGVycycgJworCXJtIC1mIDAwMDEtdHdvLnBhdGNoICYmCisJZ2l0IGNvbmZpZyBmb3JtYXQuaGVhZGVycyAieC1mb286IGJhciIgJiYKKwlnaXQgZm9ybWF0LXBhdGNoIEhFQUReICYmCisJZ3JlcCAtaSAieC1mb286IGJhciIgMDAwMS10d28ucGF0Y2ggJiYKKwlncmVwIC1pICJjb250ZW50LXR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiIDAwMDEtdHdvLnBhdGNoCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDEwMC1hcHBseS1zdGF0LnNoIGIvdC90NDEwMC1hcHBseS1zdGF0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQzNWY2NWIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAwLWFwcGx5LXN0YXQuc2gKQEAgLTAsMCArMSw0NiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSB0ZXN0LgorCisnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3JlbmFtZScgXAorICAgICdnaXQgYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSA8Li4vdDQxMDAvdC1hcHBseS0xLnBhdGNoID5jdXJyZW50ICYmCisgICAgZ2l0IGRpZmYgLi4vdDQxMDAvdC1hcHBseS0xLmV4cGVjdCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY29weScgXAorICAgICdnaXQgYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSA8Li4vdDQxMDAvdC1hcHBseS0yLnBhdGNoID5jdXJyZW50ICYmCisgICAgZ2l0IGRpZmYgLi4vdDQxMDAvdC1hcHBseS0yLmV4cGVjdCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncmV3cml0ZScgXAorICAgICdnaXQgYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSA8Li4vdDQxMDAvdC1hcHBseS0zLnBhdGNoID5jdXJyZW50ICYmCisgICAgZ2l0IGRpZmYgLi4vdDQxMDAvdC1hcHBseS0zLmV4cGVjdCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbW9kZScgXAorICAgICdnaXQgYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSA8Li4vdDQxMDAvdC1hcHBseS00LnBhdGNoID5jdXJyZW50ICYmCisgICAgZ2l0IGRpZmYgLi4vdDQxMDAvdC1hcHBseS00LmV4cGVjdCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbm9uIGdpdCcgXAorICAgICdnaXQgYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSA8Li4vdDQxMDAvdC1hcHBseS01LnBhdGNoID5jdXJyZW50ICYmCisgICAgZ2l0IGRpZmYgLi4vdDQxMDAvdC1hcHBseS01LmV4cGVjdCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbm9uIGdpdCcgXAorICAgICdnaXQgYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSA8Li4vdDQxMDAvdC1hcHBseS02LnBhdGNoID5jdXJyZW50ICYmCisgICAgZ2l0IGRpZmYgLi4vdDQxMDAvdC1hcHBseS02LmV4cGVjdCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbm9uIGdpdCcgXAorICAgICdnaXQgYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSA8Li4vdDQxMDAvdC1hcHBseS03LnBhdGNoID5jdXJyZW50ICYmCisgICAgZ2l0IGRpZmYgLi4vdDQxMDAvdC1hcHBseS03LmV4cGVjdCBjdXJyZW50JworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQxMDAvdC1hcHBseS0xLmV4cGVjdCBiL3QvdDQxMDAvdC1hcHBseS0xLmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDBlNjRkCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTEuZXhwZWN0CkBAIC0wLDAgKzEsMTEgQEAKKyBEb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVsbC50eHQgfCAgIDEyICsrKysrKy0tLS0tLQorIERvY3VtZW50YXRpb24vZ2l0LXNzaC1wdXNoLnR4dCB8ICAgMTAgKysrKystLS0tLQorIERvY3VtZW50YXRpb24vZ2l0LnR4dCAgICAgICAgICB8ICAgIDYgKysrLS0tCisgTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNiArKystLS0KKyBzc2gtcHVsbC5jICAgICAgICAgICAgICAgICAgICAgfCAgICA0ICsrLS0KKyBzc2gtcHVzaC5jICAgICAgICAgICAgICAgICAgICAgfCAgIDE0ICsrKysrKystLS0tLS0tCisgNiBmaWxlcyBjaGFuZ2VkLCAyNiBpbnNlcnRpb25zKCspLCAyNiBkZWxldGlvbnMoLSkKKyByZW5hbWUgRG9jdW1lbnRhdGlvbi97Z2l0LXJwdWxsLnR4dCA9PiBnaXQtc3NoLXB1bGwudHh0fSAoOTAlKQorIHJlbmFtZSBEb2N1bWVudGF0aW9uL3tnaXQtcnB1c2gudHh0ID0+IGdpdC1zc2gtcHVzaC50eHR9ICg3MSUpCisgcmVuYW1lIHJwdWxsLmMgPT4gc3NoLXB1bGwuYyAoOTclKQorIHJlbmFtZSBycHVzaC5jID0+IHNzaC1wdXNoLmMgKDkzJSkKZGlmZiAtLWdpdCBhL3QvdDQxMDAvdC1hcHBseS0xLnBhdGNoIGIvdC90NDEwMC90LWFwcGx5LTEucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBhYjU0ZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDAvdC1hcHBseS0xLnBhdGNoCkBAIC0wLDAgKzEsMTk0IEBACis0MThhYWY4NDdhOGIzZmZmZmI0Zjc3N2EyZGQ1MjYyY2E1Y2UwZWY3IChmcm9tIGRjOTM4NDE3MTVkZmE5YTljZGRhNmYyYzRhMjVlZWM4MzFlYTdhYTApCitkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcnB1bGwudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1bGwudHh0CitzaW1pbGFyaXR5IGluZGV4IDkwJQorcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9naXQtcnB1bGwudHh0CityZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1bGwudHh0CistLS0gYS9Eb2N1bWVudGF0aW9uL2dpdC1ycHVsbC50eHQKKysrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXNzaC1wdWxsLnR4dAorQEAgLTEsMjEgKzEsMjEgQEAKKy1naXQtcnB1bGwoMSkKKy09PT09PT09PT09PT0KKytnaXQtc3NoLXB1bGwoMSkKKys9PT09PT09PT09PT09PT0KKyB2MC4xLCBNYXkgMjAwNQorIAorIE5BTUUKKyAtLS0tCistZ2l0LXJwdWxsIC0gUHVsbHMgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IG92ZXIgc3NoIGNvbm5lY3Rpb24KKytnaXQtc3NoLXB1bGwgLSBQdWxscyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgb3ZlciBzc2ggY29ubmVjdGlvbgorIAorIAorIAorIFNZTk9QU0lTCisgLS0tLS0tLS0KKy0nZ2l0LXJwdWxsJyBbLWNdIFstdF0gWy1hXSBbLWRdIFstdl0gWy0tcmVjb3Zlcl0gY29tbWl0LWlkIHVybAorKydnaXQtc3NoLXB1bGwnIFstY10gWy10XSBbLWFdIFstZF0gWy12XSBbLS1yZWNvdmVyXSBjb21taXQtaWQgdXJsCisgCisgREVTQ1JJUFRJT04KKyAtLS0tLS0tLS0tLQorLVB1bGxzIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeSBvdmVyIHNzaCBjb25uZWN0aW9uLCBpbnZva2luZyBnaXQtcnB1c2ggb24KKy10aGUgb3RoZXIgZW5kLgorK1B1bGxzIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeSBvdmVyIHNzaCBjb25uZWN0aW9uLCBpbnZva2luZyBnaXQtc3NoLXB1c2gKKytvbiB0aGUgb3RoZXIgZW5kLgorIAorIE9QVElPTlMKKyAtLS0tLS0tCitkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcnB1c2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1c2gudHh0CitzaW1pbGFyaXR5IGluZGV4IDcxJQorcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9naXQtcnB1c2gudHh0CityZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1c2gudHh0CistLS0gYS9Eb2N1bWVudGF0aW9uL2dpdC1ycHVzaC50eHQKKysrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXNzaC1wdXNoLnR4dAorQEAgLTEsMTkgKzEsMTkgQEAKKy1naXQtcnB1c2goMSkKKy09PT09PT09PT09PT0KKytnaXQtc3NoLXB1c2goMSkKKys9PT09PT09PT09PT09PT0KKyB2MC4xLCBNYXkgMjAwNQorIAorIE5BTUUKKyAtLS0tCistZ2l0LXJwdXNoIC0gSGVscGVyICJzZXJ2ZXItc2lkZSIgcHJvZ3JhbSB1c2VkIGJ5IGdpdC1ycHVsbAorK2dpdC1zc2gtcHVzaCAtIEhlbHBlciAic2VydmVyLXNpZGUiIHByb2dyYW0gdXNlZCBieSBnaXQtc3NoLXB1bGwKKyAKKyAKKyBTWU5PUFNJUworIC0tLS0tLS0tCistJ2dpdC1ycHVzaCcKKysnZ2l0LXNzaC1wdXNoJworIAorIERFU0NSSVBUSU9OCisgLS0tLS0tLS0tLS0KKy1IZWxwZXIgInNlcnZlci1zaWRlIiBwcm9ncmFtIHVzZWQgYnkgZ2l0LXJwdWxsLgorK0hlbHBlciAic2VydmVyLXNpZGUiIHByb2dyYW0gdXNlZCBieSBnaXQtc3NoLXB1bGwuCisgCisgCisgQXV0aG9yCitkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQudHh0CistLS0gYS9Eb2N1bWVudGF0aW9uL2dpdC50eHQKKysrKyBiL0RvY3VtZW50YXRpb24vZ2l0LnR4dAorQEAgLTE0OCw3ICsxNDgsNyBAQCBsaW5rOmdpdC1yZXNvbHZlLXNjcmlwdC5odG1sW2dpdC1yZXNvbHZlCisgbGluazpnaXQtdGFnLXNjcmlwdC5odG1sW2dpdC10YWctc2NyaXB0XTo6CisgCUFuIGV4YW1wbGUgc2NyaXB0IHRvIGNyZWF0ZSBhIHRhZyBvYmplY3Qgc2lnbmVkIHdpdGggR1BHCisgCistbGluazpnaXQtcnB1bGwuaHRtbFtnaXQtcnB1bGxdOjoKKytsaW5rOmdpdC1zc2gtcHVsbC5odG1sW2dpdC1zc2gtcHVsbF06OgorIAlQdWxscyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgb3ZlciBzc2ggY29ubmVjdGlvbgorIAorIEludGVyb2dhdG9yczoKK0BAIC0xNTYsOCArMTU2LDggQEAgSW50ZXJvZ2F0b3JzOgorIGxpbms6Z2l0LWRpZmYtaGVscGVyLmh0bWxbZ2l0LWRpZmYtaGVscGVyXTo6CisgCUdlbmVyYXRlcyBwYXRjaCBmb3JtYXQgb3V0cHV0IGZvciBnaXQtZGlmZi0qCisgCistbGluazpnaXQtcnB1c2guaHRtbFtnaXQtcnB1c2hdOjoKKy0JSGVscGVyICJzZXJ2ZXItc2lkZSIgcHJvZ3JhbSB1c2VkIGJ5IGdpdC1ycHVsbAorK2xpbms6Z2l0LXNzaC1wdXNoLmh0bWxbZ2l0LXNzaC1wdXNoXTo6CisrCUhlbHBlciAic2VydmVyLXNpZGUiIHByb2dyYW0gdXNlZCBieSBnaXQtc3NoLXB1bGwKKyAKKyAKKyAKK2RpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCistLS0gYS9NYWtlZmlsZQorKysrIGIvTWFrZWZpbGUKK0BAIC0zMCw3ICszMCw3IEBAIFBST0c9ICAgZ2l0LXVwZGF0ZS1pbmRleCBnaXQtZGlmZi1maWxlcworIAlnaXQtY2hlY2tvdXQtY2FjaGUgZ2l0LWRpZmYtdHJlZSBnaXQtcmV2LXRyZWUgZ2l0LWxzLWZpbGVzIFwKKyAJZ2l0LWNoZWNrLWZpbGVzIGdpdC1scy10cmVlIGdpdC1tZXJnZS1iYXNlIGdpdC1tZXJnZS1jYWNoZSBcCisgCWdpdC11bnBhY2stZmlsZSBnaXQtZXhwb3J0IGdpdC1kaWZmLWNhY2hlIGdpdC1jb252ZXJ0LWNhY2hlIFwKKy0JZ2l0LWh0dHAtcHVsbCBnaXQtcnB1c2ggZ2l0LXJwdWxsIGdpdC1yZXYtbGlzdCBnaXQtbWt0YWcgXAorKwlnaXQtaHR0cC1wdWxsIGdpdC1zc2gtcHVzaCBnaXQtc3NoLXB1bGwgZ2l0LXJldi1saXN0IGdpdC1ta3RhZyBcCisgCWdpdC1kaWZmLWhlbHBlciBnaXQtdGFyLXRyZWUgZ2l0LWxvY2FsLXB1bGwgZ2l0LXdyaXRlLWJsb2IgXAorIAlnaXQtZ2V0LXRhci1jb21taXQtaWQgZ2l0LW1rZGVsdGEgZ2l0LWFwcGx5IGdpdC1zdHJpcHNwYWNlCisgCitAQCAtMTA1LDggKzEwNSw4IEBAIGdpdC1kaWZmLWNhY2hlOiBkaWZmLWNhY2hlLmMKKyBnaXQtY29udmVydC1jYWNoZTogY29udmVydC1jYWNoZS5jCisgZ2l0LWh0dHAtcHVsbDogaHR0cC1wdWxsLmMgcHVsbC5jCisgZ2l0LWxvY2FsLXB1bGw6IGxvY2FsLXB1bGwuYyBwdWxsLmMKKy1naXQtcnB1c2g6IHJzaC5jCistZ2l0LXJwdWxsOiByc2guYyBwdWxsLmMKKytnaXQtc3NoLXB1c2g6IHJzaC5jCisrZ2l0LXNzaC1wdWxsOiByc2guYyBwdWxsLmMKKyBnaXQtcmV2LWxpc3Q6IHJldi1saXN0LmMKKyBnaXQtbWt0YWc6IG1rdGFnLmMKKyBnaXQtZGlmZi1oZWxwZXI6IGRpZmYtaGVscGVyLmMKK2RpZmYgLS1naXQgYS9ycHVsbC5jIGIvc3NoLXB1bGwuYworc2ltaWxhcml0eSBpbmRleCA5NyUKK3JlbmFtZSBmcm9tIHJwdWxsLmMKK3JlbmFtZSB0byBzc2gtcHVsbC5jCistLS0gYS9ycHVsbC5jCisrKysgYi9zc2gtcHVsbC5jCitAQCAtNjQsMTMgKzY0LDEzIEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyAJCWFyZysrOworIAl9CisgCWlmIChhcmdjIDwgYXJnICsgMikgeworLQkJdXNhZ2UoImdpdC1ycHVsbCBbLWNdIFstdF0gWy1hXSBbLXZdIFstZF0gWy0tcmVjb3Zlcl0gY29tbWl0LWlkIHVybCIpOworKwkJdXNhZ2UoImdpdC1zc2gtcHVsbCBbLWNdIFstdF0gWy1hXSBbLXZdIFstZF0gWy0tcmVjb3Zlcl0gY29tbWl0LWlkIHVybCIpOworIAkJcmV0dXJuIDE7CisgCX0KKyAJY29tbWl0X2lkID0gYXJndlthcmddOworIAl1cmwgPSBhcmd2W2FyZyArIDFdOworIAorLQlpZiAoc2V0dXBfY29ubmVjdGlvbigmZmRfaW4sICZmZF9vdXQsICJnaXQtcnB1c2giLCB1cmwsIGFyZywgYXJndiArIDEpKQorKwlpZiAoc2V0dXBfY29ubmVjdGlvbigmZmRfaW4sICZmZF9vdXQsICJnaXQtc3NoLXB1c2giLCB1cmwsIGFyZywgYXJndiArIDEpKQorIAkJcmV0dXJuIDE7CisgCisgCWlmIChnZXRfdmVyc2lvbigpKQorZGlmZiAtLWdpdCBhL3JwdXNoLmMgYi9zc2gtcHVzaC5jCitzaW1pbGFyaXR5IGluZGV4IDkzJQorcmVuYW1lIGZyb20gcnB1c2guYworcmVuYW1lIHRvIHNzaC1wdXNoLmMKKy0tLSBhL3JwdXNoLmMKKysrKyBiL3NzaC1wdXNoLmMKK0BAIC0xNiw3ICsxNiw3IEBAIGludCBzZXJ2ZV9vYmplY3QoaW50IGZkX2luLCBpbnQgZmRfb3V0KSAKKyAJZG8geworIAkJc2l6ZSA9IHJlYWQoZmRfaW4sIHNoYTEgKyBwb3NuLCAyMCAtIHBvc24pOworIAkJaWYgKHNpemUgPCAwKSB7CistCQkJcGVycm9yKCJnaXQtcnB1c2g6IHJlYWQgIik7CisrCQkJcGVycm9yKCJnaXQtc3NoLXB1c2g6IHJlYWQgIik7CisgCQkJcmV0dXJuIC0xOworIAkJfQorIAkJaWYgKCFzaXplKQorQEAgLTMwLDcgKzMwLDcgQEAgaW50IHNlcnZlX29iamVjdChpbnQgZmRfaW4sIGludCBmZF9vdXQpIAorIAlidWYgPSBtYXBfc2hhMV9maWxlKHNoYTEsICZvYmpzaXplKTsKKyAJCisgCWlmICghYnVmKSB7CistCQlmcHJpbnRmKHN0ZGVyciwgImdpdC1ycHVzaDogY291bGQgbm90IGZpbmQgJXNcbiIsIAorKwkJZnByaW50ZihzdGRlcnIsICJnaXQtc3NoLXB1c2g6IGNvdWxkIG5vdCBmaW5kICVzXG4iLCAKKyAJCQlzaGExX3RvX2hleChzaGExKSk7CisgCQlyZW1vdGUgPSAtMTsKKyAJfQorQEAgLTQ1LDkgKzQ1LDkgQEAgaW50IHNlcnZlX29iamVjdChpbnQgZmRfaW4sIGludCBmZF9vdXQpIAorIAkJc2l6ZSA9IHdyaXRlKGZkX291dCwgYnVmICsgcG9zbiwgb2Jqc2l6ZSAtIHBvc24pOworIAkJaWYgKHNpemUgPD0gMCkgeworIAkJCWlmICghc2l6ZSkgeworLQkJCQlmcHJpbnRmKHN0ZGVyciwgImdpdC1ycHVzaDogd3JpdGUgY2xvc2VkIik7CisrCQkJCWZwcmludGYoc3RkZXJyLCAiZ2l0LXNzaC1wdXNoOiB3cml0ZSBjbG9zZWQiKTsKKyAJCQl9IGVsc2UgeworLQkJCQlwZXJyb3IoImdpdC1ycHVzaDogd3JpdGUgIik7CisrCQkJCXBlcnJvcigiZ2l0LXNzaC1wdXNoOiB3cml0ZSAiKTsKKyAJCQl9CisgCQkJcmV0dXJuIC0xOworIAkJfQorQEAgLTcxLDcgKzcxLDcgQEAgdm9pZCBzZXJ2aWNlKGludCBmZF9pbiwgaW50IGZkX291dCkgeworIAkJcmV0dmFsID0gcmVhZChmZF9pbiwgJnR5cGUsIDEpOworIAkJaWYgKHJldHZhbCA8IDEpIHsKKyAJCQlpZiAocmV0dmFsIDwgMCkKKy0JCQkJcGVycm9yKCJycHVzaDogcmVhZCAiKTsKKysJCQkJcGVycm9yKCJnaXQtc3NoLXB1c2g6IHJlYWQgIik7CisgCQkJcmV0dXJuOworIAkJfQorIAkJaWYgKHR5cGUgPT0gJ3YnICYmIHNlcnZlX3ZlcnNpb24oZmRfaW4sIGZkX291dCkpCitAQCAtOTEsMTIgKzkxLDEyIEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyAgICAgICAgICAgICAgICAgYXJnKys7CisgICAgICAgICB9CisgICAgICAgICBpZiAoYXJnYyA8IGFyZyArIDIpIHsKKy0JCXVzYWdlKCJnaXQtcnB1c2ggWy1jXSBbLXRdIFstYV0gY29tbWl0LWlkIHVybCIpOworKwkJdXNhZ2UoImdpdC1zc2gtcHVzaCBbLWNdIFstdF0gWy1hXSBjb21taXQtaWQgdXJsIik7CisgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgfQorIAljb21taXRfaWQgPSBhcmd2W2FyZ107CisgCXVybCA9IGFyZ3ZbYXJnICsgMV07CistCWlmIChzZXR1cF9jb25uZWN0aW9uKCZmZF9pbiwgJmZkX291dCwgImdpdC1ycHVsbCIsIHVybCwgYXJnLCBhcmd2ICsgMSkpCisrCWlmIChzZXR1cF9jb25uZWN0aW9uKCZmZF9pbiwgJmZkX291dCwgImdpdC1zc2gtcHVsbCIsIHVybCwgYXJnLCBhcmd2ICsgMSkpCisgCQlyZXR1cm4gMTsKKyAKKyAJc2VydmljZShmZF9pbiwgZmRfb3V0KTsKZGlmZiAtLWdpdCBhL3QvdDQxMDAvdC1hcHBseS0yLmV4cGVjdCBiL3QvdDQxMDAvdC1hcHBseS0yLmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWU2NDU5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTIuZXhwZWN0CkBAIC0wLDAgKzEsNSBAQAorIE1ha2VmaWxlICAgICAgICAgfCAgICAyICstCisgZ2l0LWZldGNoLXNjcmlwdCB8ICAgIDUgLS0tLS0KKyBnaXQtcHVsbC1zY3JpcHQgIHwgICAzNCArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKyksIDM5IGRlbGV0aW9ucygtKQorIGNvcHkgZ2l0LXB1bGwtc2NyaXB0ID0+IGdpdC1mZXRjaC1zY3JpcHQgKDg3JSkKZGlmZiAtLWdpdCBhL3QvdDQxMDAvdC1hcHBseS0yLnBhdGNoIGIvdC90NDEwMC90LWFwcGx5LTIucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjN2Q2MAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDAvdC1hcHBseS0yLnBhdGNoCkBAIC0wLDAgKzEsNzIgQEAKKzdlZjc2OTI1ZDljMTllZjc0ODc0ZTE3MzVlMjQzNmU1NmQwYzQ4OTcgKGZyb20gNmIxNGQ3ZmFmMGJhZDAyNmE4MWEyN2JhYzA3YjQ3NjkxZjYyMWI4ZikKK2RpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCistLS0gYS9NYWtlZmlsZQorKysrIGIvTWFrZWZpbGUKK0BAIC0yMCw3ICsyMCw3IEBAIElOU1RBTEw9aW5zdGFsbAorIAorIFNDUklQVFM9Z2l0LWFwcGx5LXBhdGNoLXNjcmlwdCBnaXQtbWVyZ2Utb25lLWZpbGUtc2NyaXB0IGdpdC1wcnVuZS1zY3JpcHQgXAorIAlnaXQtcHVsbC1zY3JpcHQgZ2l0LXRhZy1zY3JpcHQgZ2l0LXJlc29sdmUtc2NyaXB0IGdpdC13aGF0Y2hhbmdlZCBcCistCWdpdC1kZWx0YWZ5LXNjcmlwdAorKwlnaXQtZGVsdGFmeS1zY3JpcHQgZ2l0LWZldGNoLXNjcmlwdAorIAorIFBST0c9ICAgZ2l0LXVwZGF0ZS1pbmRleCBnaXQtZGlmZi1maWxlcyBnaXQtaW5pdC1kYiBnaXQtd3JpdGUtdHJlZSBcCisgCWdpdC1yZWFkLXRyZWUgZ2l0LWNvbW1pdC10cmVlIGdpdC1jYXQtZmlsZSBnaXQtZnNjay1jYWNoZSBcCitkaWZmIC0tZ2l0IGEvZ2l0LXB1bGwtc2NyaXB0IGIvZ2l0LWZldGNoLXNjcmlwdAorc2ltaWxhcml0eSBpbmRleCA4NyUKK2NvcHkgZnJvbSBnaXQtcHVsbC1zY3JpcHQKK2NvcHkgdG8gZ2l0LWZldGNoLXNjcmlwdAorLS0tIGEvZ2l0LXB1bGwtc2NyaXB0CisrKysgYi9naXQtZmV0Y2gtc2NyaXB0CitAQCAtMzksOCArMzksMyBAQCBkb3dubG9hZF9vbmUgIiRtZXJnZV9yZXBvLyRtZXJnZV9uYW1lIiAiCisgCisgZWNobyAiR2V0dGluZyBvYmplY3QgZGF0YWJhc2UiCisgZG93bmxvYWRfb2JqZWN0cyAiJG1lcmdlX3JlcG8iICIkKGNhdCAiJEdJVF9ESVIiL01FUkdFX0hFQUQpIgorLQorLWdpdC1yZXNvbHZlLXNjcmlwdCBcCistCSIkKGNhdCAiJEdJVF9ESVIiL0hFQUQpIiBcCistCSIkKGNhdCAiJEdJVF9ESVIiL01FUkdFX0hFQUQpIiBcCistCSIkbWVyZ2VfcmVwbyIKK2RpZmYgLS1naXQgYS9naXQtcHVsbC1zY3JpcHQgYi9naXQtcHVsbC1zY3JpcHQKKy0tLSBhL2dpdC1wdWxsLXNjcmlwdAorKysrIGIvZ2l0LXB1bGwtc2NyaXB0CitAQCAtNiwzOSArNiw3IEBAIG1lcmdlX25hbWU9JHsyOi1IRUFEfQorIDogJHtHSVRfRElSPS5naXR9CisgOiAke0dJVF9PQkpFQ1RfRElSRUNUT1JZPSIke1NIQTFfRklMRV9ESVJFQ1RPUlktIiRHSVRfRElSL29iamVjdHMifSJ9CisgCistZG93bmxvYWRfb25lICgpIHsKKy0JIyByZW1vdGVfcGF0aD0iJDEiIGxvY2FsX2ZpbGU9IiQyIgorLQljYXNlICIkMSIgaW4KKy0JaHR0cDovLyopCistCQl3Z2V0IC1xIC1PICIkMiIgIiQxIiA7OworLQkvKikKKy0JCXRlc3QgLWYgIiQxIiAmJiBjYXQgPiIkMiIgIiQxIiA7OworLQkqKQorLQkJcnN5bmMgLUwgIiQxIiAiJDIiIDs7CistCWVzYWMKKy19CistCistZG93bmxvYWRfb2JqZWN0cyAoKSB7CistCSMgcmVtb3RlX3JlcG89IiQxIiBoZWFkX3NoYTE9IiQyIgorLQljYXNlICIkMSIgaW4KKy0JaHR0cDovLyopCistCQlnaXQtaHR0cC1wdWxsIC1hICIkMiIgIiQxLyIKKy0JCTs7CistCS8qKQorLQkJZ2l0LWxvY2FsLXB1bGwgLWwgLWEgIiQyIiAiJDEvIgorLQkJOzsKKy0JKikKKy0JCXJzeW5jIC1hdnogLS1pZ25vcmUtZXhpc3RpbmcgXAorLQkJCSIkMS9vYmplY3RzLy4iICIkR0lUX09CSkVDVF9ESVJFQ1RPUlkiLy4KKy0JCTs7CistCWVzYWMKKy19CistCistZWNobyAiR2V0dGluZyByZW1vdGUgJG1lcmdlX25hbWUiCistZG93bmxvYWRfb25lICIkbWVyZ2VfcmVwby8kbWVyZ2VfbmFtZSIgIiRHSVRfRElSIi9NRVJHRV9IRUFECistCistZWNobyAiR2V0dGluZyBvYmplY3QgZGF0YWJhc2UiCistZG93bmxvYWRfb2JqZWN0cyAiJG1lcmdlX3JlcG8iICIkKGNhdCAiJEdJVF9ESVIiL01FUkdFX0hFQUQpIgorK2dpdC1mZXRjaC1zY3JpcHQgIiRtZXJnZV9yZXBvIiAiJG1lcmdlX25hbWUiCisgCisgZ2l0LXJlc29sdmUtc2NyaXB0IFwKKyAJIiQoY2F0ICIkR0lUX0RJUiIvSEVBRCkiIFwKZGlmZiAtLWdpdCBhL3QvdDQxMDAvdC1hcHBseS0zLmV4cGVjdCBiL3QvdDQxMDAvdC1hcHBseS0zLmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTJhNTUyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTMuZXhwZWN0CkBAIC0wLDAgKzEsNyBAQAorIERvY3VtZW50YXRpb24vZ2l0LWxzLXRyZWUudHh0IHwgICAyMCArLQorIGxzLXRyZWUuYyAgICAgICAgICAgICAgICAgICAgIHwgIDQ1OSArKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQvdDMxMDAtbHMtdHJlZS1yZXN0cmljdC5zaCAgIHwgICAgMyAKKyB0cmVlLmMgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDIgCisgdHJlZS5oICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxIAorIDUgZmlsZXMgY2hhbmdlZCwgMjYyIGluc2VydGlvbnMoKyksIDIyMyBkZWxldGlvbnMoLSkKKyByZXdyaXRlIGxzLXRyZWUuYyAoODIlKQpkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTMucGF0Y2ggYi90L3Q0MTAwL3QtYXBwbHktMy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGNkYmFhCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTMucGF0Y2gKQEAgLTAsMCArMSw1NjcgQEAKKzZhZjFmMDE5MmZmODc0MGZlNzdkYjdjZjAyYzczOWNjZmJkZjExOWMgKGZyb20gMmJjMjU2NDE0NTgzNTk5NjczNGQ2ZWQ1ZDE4ODBmODViMTcyMzNkNikKK2RpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1scy10cmVlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWxzLXRyZWUudHh0CistLS0gYS9Eb2N1bWVudGF0aW9uL2dpdC1scy10cmVlLnR4dAorKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbHMtdHJlZS50eHQKK0BAIC00LDIzICs0LDI2IEBAIHYwLjEsIE1heSAyMDA1CisgCisgTkFNRQorIC0tLS0KKy1naXQtbHMtdHJlZSAtIERpc3BsYXlzIGEgdHJlZSBvYmplY3QgaW4gaHVtYW4gcmVhZGFibGUgZm9ybQorK2dpdC1scy10cmVlIC0gTGlzdHMgdGhlIGNvbnRlbnRzIG9mIGEgdHJlZSBvYmplY3QuCisgCisgCisgU1lOT1BTSVMKKyAtLS0tLS0tLQorLSdnaXQtbHMtdHJlZScgWy1yXSBbLXpdIDx0cmVlLWlzaD4gW3BhdGhzLi4uXQorKydnaXQtbHMtdHJlZScgWy1kXSBbLXJdIFstel0gPHRyZWUtaXNoPiBbcGF0aHMuLi5dCisgCisgREVTQ1JJUFRJT04KKyAtLS0tLS0tLS0tLQorLUNvbnZlcnRzIHRoZSB0cmVlIG9iamVjdCB0byBhIGh1bWFuIHJlYWRhYmxlIChhbmQgc2NyaXB0IHByb2Nlc3NhYmxlKQorLWZvcm0uCisrTGlzdHMgdGhlIGNvbnRlbnRzIG9mIGEgdHJlZSBvYmplY3QsIGxpa2Ugd2hhdCAiL2Jpbi9scyAtYSIgZG9lcworK2luIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorIAorIE9QVElPTlMKKyAtLS0tLS0tCisgPHRyZWUtaXNoPjo6CisgCUlkIG9mIGEgdHJlZS4KKyAKKystZDo6CisrCXNob3cgb25seSB0aGUgbmFtZWQgdHJlZSBlbnRyeSBpdHNlbGYsIG5vdCBpdHMgY2hpbGRyZW4KKysKKyAtcjo6CisgCXJlY3Vyc2UgaW50byBzdWItdHJlZXMKKyAKK0BAIC0yOCwxOCArMzEsMTkgQEAgT1BUSU9OUworIAlcMCBsaW5lIHRlcm1pbmF0aW9uIG9uIG91dHB1dAorIAorIHBhdGhzOjoKKy0JT3B0aW9uYWxseSwgcmVzdHJpY3QgdGhlIG91dHB1dCBvZiBnaXQtbHMtdHJlZSB0byBzcGVjaWZpYworLQlwYXRocy4gRGlyZWN0b3JpZXMgd2lsbCBvbmx5IGxpc3QgdGhlaXIgdHJlZSBibG9iIGlkcy4KKy0JSW1wbGllcyAtci4KKysJV2hlbiBwYXRocyBhcmUgZ2l2ZW4sIHNob3dzIHRoZW0uICBPdGhlcndpc2UgaW1wbGljaXRseQorKwl1c2VzIHRoZSByb290IGxldmVsIG9mIHRoZSB0cmVlIGFzIHRoZSBzb2xlIHBhdGggYXJndW1lbnQuCisrCisgCisgT3V0cHV0IEZvcm1hdAorIC0tLS0tLS0tLS0tLS0KKy0gICAgICAgIDxtb2RlPlx0CTx0eXBlPlx0CTxvYmplY3Q+XHQJPGZpbGU+CisrICAgICAgICA8bW9kZT4gU1AgPHR5cGU+IFNQIDxvYmplY3Q+IFRBQiA8ZmlsZT4KKyAKKyAKKyBBdXRob3IKKyAtLS0tLS0KKyBXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKytDb21wbGV0ZWx5IHJld3JpdHRlbiBmcm9tIHNjcmF0Y2ggYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorIAorIERvY3VtZW50YXRpb24KKyAtLS0tLS0tLS0tLS0tLQorZGlmZiAtLWdpdCBhL2xzLXRyZWUuYyBiL2xzLXRyZWUuYworZGlzc2ltaWxhcml0eSBpbmRleCA4MiUKKy0tLSBscy10cmVlLmMKKysrKyBscy10cmVlLmMKK0BAIC0xLDIxMiArMSwyNDcgQEAKKy0vKgorLSAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorLSAqCistICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorLSAqLworLSNpbmNsdWRlICJjYWNoZS5oIgorLQorLXN0YXRpYyBpbnQgbGluZV90ZXJtaW5hdGlvbiA9ICdcbic7Cistc3RhdGljIGludCByZWN1cnNpdmUgPSAwOworLQorLXN0cnVjdCBwYXRoX3ByZWZpeCB7CistCXN0cnVjdCBwYXRoX3ByZWZpeCAqcHJldjsKKy0JY29uc3QgY2hhciAqbmFtZTsKKy19OworLQorLSNkZWZpbmUgREVCVUcoZm10LCAuLi4pCQorLQorLXN0YXRpYyBpbnQgc3RyaW5nX3BhdGhfcHJlZml4KGNoYXIgKmJ1ZmYsIHNpemVfdCBibGVuLCBzdHJ1Y3QgcGF0aF9wcmVmaXggKnByZWZpeCkKKy17CistCWludCBsZW4gPSAwOworLQlpZiAocHJlZml4KSB7CistCQlpZiAocHJlZml4LT5wcmV2KSB7CistCQkJbGVuID0gc3RyaW5nX3BhdGhfcHJlZml4KGJ1ZmYsYmxlbixwcmVmaXgtPnByZXYpOworLQkJCWJ1ZmYgKz0gbGVuOworLQkJCWJsZW4gLT0gbGVuOworLQkJCWlmIChibGVuID4gMCkgeworLQkJCQkqYnVmZiA9ICcvJzsKKy0JCQkJbGVuKys7CistCQkJCWJ1ZmYrKzsKKy0JCQkJYmxlbi0tOworLQkJCX0KKy0JCX0KKy0JCXN0cm5jcHkoYnVmZixwcmVmaXgtPm5hbWUsYmxlbik7CistCQlyZXR1cm4gbGVuICsgc3RybGVuKHByZWZpeC0+bmFtZSk7CistCX0KKy0KKy0JcmV0dXJuIDA7CistfQorLQorLXN0YXRpYyB2b2lkIHByaW50X3BhdGhfcHJlZml4KHN0cnVjdCBwYXRoX3ByZWZpeCAqcHJlZml4KQorLXsKKy0JaWYgKHByZWZpeCkgeworLQkJaWYgKHByZWZpeC0+cHJldikgeworLQkJCXByaW50X3BhdGhfcHJlZml4KHByZWZpeC0+cHJldik7CistCQkJcHV0Y2hhcignLycpOworLQkJfQorLQkJZnB1dHMocHJlZml4LT5uYW1lLCBzdGRvdXQpOworLQl9CistfQorLQorLS8qCistICogcmV0dXJuOgorLSAqIAktMSBpZiBwcmVmaXggaXMgKm5vdCogYSBzdWJzZXQgb2YgcGF0aAorLSAqIAkgMCBpZiBwcmVmaXggPT0gcGF0aAorLSAqIAkgMSBpZiBwcmVmaXggaXMgYSBzdWJzZXQgb2YgcGF0aAorLSAqLworLXN0YXRpYyBpbnQgcGF0aGNtcChjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgcGF0aF9wcmVmaXggKnByZWZpeCkKKy17CistCWNoYXIgYnVmZltQQVRIX01BWF07CistCWludCBsZW4sc2xlbjsKKy0KKy0JaWYgKHByZWZpeCA9PSBOVUxMKQorLQkJcmV0dXJuIDE7CistCistCWxlbiA9IHN0cmluZ19wYXRoX3ByZWZpeChidWZmLCBzaXplb2YgYnVmZiwgcHJlZml4KTsKKy0Jc2xlbiA9IHN0cmxlbihwYXRoKTsKKy0KKy0JaWYgKHNsZW4gPCBsZW4pCistCQlyZXR1cm4gLTE7CistCistCWlmIChzdHJuY21wKHBhdGgsYnVmZixsZW4pID09IDApIHsKKy0JCWlmIChzbGVuID09IGxlbikKKy0JCQlyZXR1cm4gMDsKKy0JCWVsc2UKKy0JCQlyZXR1cm4gMTsKKy0JfQorLQorLQlyZXR1cm4gLTE7CistfQkKKy0KKy0vKgorLSAqIG1hdGNoIG1heSBiZSBOVUxMLCBvciBhICpzb3J0ZWQqIGxpc3Qgb2YgcGF0aHMKKy0gKi8KKy1zdGF0aWMgdm9pZCBsaXN0X3JlY3Vyc2l2ZSh2b2lkICpidWZmZXIsCistCQkJICAgY29uc3QgY2hhciAqdHlwZSwKKy0JCQkgICB1bnNpZ25lZCBsb25nIHNpemUsCistCQkJICAgc3RydWN0IHBhdGhfcHJlZml4ICpwcmVmaXgsCistCQkJICAgY2hhciAqKm1hdGNoLCBpbnQgbWF0Y2hlcykKKy17CistCXN0cnVjdCBwYXRoX3ByZWZpeCB0aGlzX3ByZWZpeDsKKy0JdGhpc19wcmVmaXgucHJldiA9IHByZWZpeDsKKy0KKy0JaWYgKHN0cmNtcCh0eXBlLCAidHJlZSIpKQorLQkJZGllKCJleHBlY3RlZCBhICd0cmVlJyBub2RlIik7CistCistCWlmIChtYXRjaGVzKQorLQkJcmVjdXJzaXZlID0gMTsKKy0KKy0Jd2hpbGUgKHNpemUpIHsKKy0JCWludCBuYW1lbGVuID0gc3RybGVuKGJ1ZmZlcikrMTsKKy0JCXZvaWQgKmVsdGJ1ZiA9IE5VTEw7CistCQljaGFyIGVsdHR5cGVbMjBdOworLQkJdW5zaWduZWQgbG9uZyBlbHRzaXplOworLQkJdW5zaWduZWQgY2hhciAqc2hhMSA9IGJ1ZmZlciArIG5hbWVsZW47CistCQljaGFyICpwYXRoID0gc3RyY2hyKGJ1ZmZlciwgJyAnKSArIDE7CistCQl1bnNpZ25lZCBpbnQgbW9kZTsKKy0JCWNvbnN0IGNoYXIgKm1hdGNoZWQgPSBOVUxMOworLQkJaW50IG10eXBlID0gLTE7CistCQlpbnQgbWluZGV4OworLQorLQkJaWYgKHNpemUgPCBuYW1lbGVuICsgMjAgfHwgc3NjYW5mKGJ1ZmZlciwgIiVvIiwgJm1vZGUpICE9IDEpCistCQkJZGllKCJjb3JydXB0ICd0cmVlJyBmaWxlIik7CistCQlidWZmZXIgPSBzaGExICsgMjA7CistCQlzaXplIC09IG5hbWVsZW4gKyAyMDsKKy0KKy0JCXRoaXNfcHJlZml4Lm5hbWUgPSBwYXRoOworLQkJZm9yICggbWluZGV4ID0gMDsgbWluZGV4IDwgbWF0Y2hlczsgbWluZGV4KyspIHsKKy0JCQltdHlwZSA9IHBhdGhjbXAobWF0Y2hbbWluZGV4XSwmdGhpc19wcmVmaXgpOworLQkJCWlmIChtdHlwZSA+PSAwKSB7CistCQkJCW1hdGNoZWQgPSBtYXRjaFttaW5kZXhdOworLQkJCQlicmVhazsKKy0JCQl9CistCQl9CistCistCQkvKgorLQkJICogSWYgd2UncmUgbm90IG1hdGNoaW5nLCBvciBpZiB0aGlzIGlzIGFuIGV4YWN0IG1hdGNoLAorLQkJICogcHJpbnQgb3V0IHRoZSBpbmZvCistCQkgKi8KKy0JCWlmICghbWF0Y2hlcyB8fCAobWF0Y2hlZCAhPSBOVUxMICYmIG10eXBlID09IDApKSB7CistCQkJcHJpbnRmKCIlMDZvICVzICVzXHQiLCBtb2RlLAorLQkJCSAgICAgICBTX0lTRElSKG1vZGUpID8gInRyZWUiIDogImJsb2IiLAorLQkJCSAgICAgICBzaGExX3RvX2hleChzaGExKSk7CistCQkJcHJpbnRfcGF0aF9wcmVmaXgoJnRoaXNfcHJlZml4KTsKKy0JCQlwdXRjaGFyKGxpbmVfdGVybWluYXRpb24pOworLQkJfQorLQorLQkJaWYgKCEgcmVjdXJzaXZlIHx8ICEgU19JU0RJUihtb2RlKSkKKy0JCQljb250aW51ZTsKKy0KKy0JCWlmIChtYXRjaGVzICYmICEgbWF0Y2hlZCkKKy0JCQljb250aW51ZTsKKy0KKy0JCWlmICghIChlbHRidWYgPSByZWFkX3NoYTFfZmlsZShzaGExLCBlbHR0eXBlLCAmZWx0c2l6ZSkpICkgeworLQkJCWVycm9yKCJjYW5ub3QgcmVhZCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKy0JCQljb250aW51ZTsKKy0JCX0KKy0KKy0JCS8qIElmIHRoaXMgaXMgYW4gZXhhY3QgZGlyZWN0b3J5IG1hdGNoLCB3ZSBtYXkgaGF2ZQorLQkJICogZGlyZWN0b3J5IGZpbGVzIGZvbGxvd2luZyB0aGlzIHBhdGguIE1hdGNoIG9uIHRoZW0uCistCQkgKiBPdGhlcndpc2UsIHdlJ3JlIGF0IGEgcGFjaCBzdWJjb21wb25lbnQsIGFuZCB3ZSBuZWVkCistCQkgKiB0byB0cnkgdG8gbWF0Y2ggYWdhaW4uCistCQkgKi8KKy0JCWlmIChtdHlwZSA9PSAwKQorLQkJCW1pbmRleCsrOworLQorLQkJbGlzdF9yZWN1cnNpdmUoZWx0YnVmLCBlbHR0eXBlLCBlbHRzaXplLCAmdGhpc19wcmVmaXgsICZtYXRjaFttaW5kZXhdLCBtYXRjaGVzLW1pbmRleCk7CistCQlmcmVlKGVsdGJ1Zik7CistCX0KKy19CistCistc3RhdGljIGludCBxY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCisteworLQlyZXR1cm4gc3RyY21wKCooY2hhciAqKilhLCAqKGNoYXIgKiopYik7CistfQorLQorLXN0YXRpYyBpbnQgbGlzdCh1bnNpZ25lZCBjaGFyICpzaGExLGNoYXIgKipwYXRoKQorLXsKKy0Jdm9pZCAqYnVmZmVyOworLQl1bnNpZ25lZCBsb25nIHNpemU7CistCWludCBucGF0aHM7CistCistCWZvciAobnBhdGhzID0gMDsgcGF0aFtucGF0aHNdICE9IE5VTEw7IG5wYXRocysrKQorLQkJOworLQorLQlxc29ydChwYXRoLG5wYXRocyxzaXplb2YoY2hhciAqKSxxY21wKTsKKy0KKy0JYnVmZmVyID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2Uoc2hhMSwgInRyZWUiLCAmc2l6ZSwgTlVMTCk7CistCWlmICghYnVmZmVyKQorLQkJZGllKCJ1bmFibGUgdG8gcmVhZCBzaGExIGZpbGUiKTsKKy0JbGlzdF9yZWN1cnNpdmUoYnVmZmVyLCAidHJlZSIsIHNpemUsIE5VTEwsIHBhdGgsIG5wYXRocyk7CistCWZyZWUoYnVmZmVyKTsKKy0JcmV0dXJuIDA7CistfQorLQorLXN0YXRpYyBjb25zdCBjaGFyICpsc190cmVlX3VzYWdlID0gImdpdC1scy10cmVlIFstcl0gWy16XSA8a2V5PiBbcGF0aHMuLi5dIjsKKy0KKy1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisteworLQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworLQorLQl3aGlsZSAoMSA8IGFyZ2MgJiYgYXJndlsxXVswXSA9PSAnLScpIHsKKy0JCXN3aXRjaCAoYXJndlsxXVsxXSkgeworLQkJY2FzZSAneic6CistCQkJbGluZV90ZXJtaW5hdGlvbiA9IDA7CistCQkJYnJlYWs7CistCQljYXNlICdyJzoKKy0JCQlyZWN1cnNpdmUgPSAxOworLQkJCWJyZWFrOworLQkJZGVmYXVsdDoKKy0JCQl1c2FnZShsc190cmVlX3VzYWdlKTsKKy0JCX0KKy0JCWFyZ2MtLTsgYXJndisrOworLQl9CistCistCWlmIChhcmdjIDwgMikKKy0JCXVzYWdlKGxzX3RyZWVfdXNhZ2UpOworLQlpZiAoZ2V0X3NoYTEoYXJndlsxXSwgc2hhMSkgPCAwKQorLQkJdXNhZ2UobHNfdHJlZV91c2FnZSk7CistCWlmIChsaXN0KHNoYTEsICZhcmd2WzJdKSA8IDApCistCQlkaWUoImxpc3QgZmFpbGVkIik7CistCXJldHVybiAwOworLX0KKysvKgorKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorKyAqCisrICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorKyAqLworKyNpbmNsdWRlICJjYWNoZS5oIgorKyNpbmNsdWRlICJibG9iLmgiCisrI2luY2x1ZGUgInRyZWUuaCIKKysKKytzdGF0aWMgaW50IGxpbmVfdGVybWluYXRpb24gPSAnXG4nOworKyNkZWZpbmUgTFNfUkVDVVJTSVZFIDEKKysjZGVmaW5lIExTX1RSRUVfT05MWSAyCisrc3RhdGljIGludCBsc19vcHRpb25zID0gMDsKKysKKytzdGF0aWMgc3RydWN0IHRyZWVfZW50cnlfbGlzdCByb290X2VudHJ5OworKworK3N0YXRpYyB2b2lkIHByZXBhcmVfcm9vdCh1bnNpZ25lZCBjaGFyICpzaGExKQorK3sKKysJdW5zaWduZWQgY2hhciByc2hhWzIwXTsKKysJdW5zaWduZWQgbG9uZyBzaXplOworKwl2b2lkICpidWY7CisrCXN0cnVjdCB0cmVlICpyb290X3RyZWU7CisrCisrCWJ1ZiA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKHNoYTEsICJ0cmVlIiwgJnNpemUsIHJzaGEpOworKwlmcmVlKGJ1Zik7CisrCWlmICghYnVmKQorKwkJZGllKCJDb3VsZCBub3QgcmVhZCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKysKKysJcm9vdF90cmVlID0gbG9va3VwX3RyZWUocnNoYSk7CisrCWlmICghcm9vdF90cmVlKQorKwkJZGllKCJDb3VsZCBub3QgcmVhZCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKysKKysJLyogUHJlcGFyZSBhIGZha2UgZW50cnkgKi8KKysJcm9vdF9lbnRyeS5kaXJlY3RvcnkgPSAxOworKwlyb290X2VudHJ5LmV4ZWN1dGFibGUgPSByb290X2VudHJ5LnN5bWxpbmsgPSAwOworKwlyb290X2VudHJ5Lm1vZGUgPSBTX0lGRElSOworKwlyb290X2VudHJ5Lm5hbWUgPSAiIjsKKysJcm9vdF9lbnRyeS5pdGVtLnRyZWUgPSByb290X3RyZWU7CisrCXJvb3RfZW50cnkucGFyZW50ID0gTlVMTDsKKyt9CisrCisrc3RhdGljIGludCBwcmVwYXJlX2NoaWxkcmVuKHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmVsZW0pCisreworKwlpZiAoIWVsZW0tPmRpcmVjdG9yeSkKKysJCXJldHVybiAtMTsKKysJaWYgKCFlbGVtLT5pdGVtLnRyZWUtPm9iamVjdC5wYXJzZWQpIHsKKysJCXN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmU7CisrCQlpZiAocGFyc2VfdHJlZShlbGVtLT5pdGVtLnRyZWUpKQorKwkJCXJldHVybiAtMTsKKysJCS8qIFNldCB1cCB0aGUgcGFyZW50IGxpbmsgKi8KKysJCWZvciAoZSA9IGVsZW0tPml0ZW0udHJlZS0+ZW50cmllczsgZTsgZSA9IGUtPm5leHQpCisrCQkJZS0+cGFyZW50ID0gZWxlbTsKKysJfQorKwlyZXR1cm4gMDsKKyt9CisrCisrc3RhdGljIHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmZpbmRfZW50cnlfMChzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICplbGVtLAorKwkJCQkJICAgIGNvbnN0IGNoYXIgKnBhdGgsCisrCQkJCQkgICAgY29uc3QgY2hhciAqcGF0aF9lbmQpCisreworKwljb25zdCBjaGFyICplcDsKKysJaW50IGxlbjsKKysKKysJd2hpbGUgKHBhdGggPCBwYXRoX2VuZCkgeworKwkJaWYgKHByZXBhcmVfY2hpbGRyZW4oZWxlbSkpCisrCQkJcmV0dXJuIE5VTEw7CisrCisrCQkvKiBJbiBlbGVtLT50cmVlLT5lbnRyaWVzLCBmaW5kIHRoZSBvbmUgdGhhdCBoYXMgbmFtZQorKwkJICogdGhhdCBtYXRjaGVzIHdoYXQgaXMgYmV0d2VlbiBwYXRoIGFuZCBlcC4KKysJCSAqLworKwkJZWxlbSA9IGVsZW0tPml0ZW0udHJlZS0+ZW50cmllczsKKysKKysJCWVwID0gc3RyY2hyKHBhdGgsICcvJyk7CisrCQlpZiAoIWVwIHx8IHBhdGhfZW5kIDw9IGVwKQorKwkJCWVwID0gcGF0aF9lbmQ7CisrCQlsZW4gPSBlcCAtIHBhdGg7CisrCisrCQl3aGlsZSAoZWxlbSkgeworKwkJCWlmICgoc3RybGVuKGVsZW0tPm5hbWUpID09IGxlbikgJiYKKysJCQkgICAgIXN0cm5jbXAoZWxlbS0+bmFtZSwgcGF0aCwgbGVuKSkKKysJCQkJYnJlYWs7CisrCQkJZWxlbSA9IGVsZW0tPm5leHQ7CisrCQl9CisrCQlpZiAocGF0aF9lbmQgPD0gZXAgfHwgIWVsZW0pCisrCQkJcmV0dXJuIGVsZW07CisrCQl3aGlsZSAoKmVwID09ICcvJyAmJiBlcCA8IHBhdGhfZW5kKQorKwkJCWVwKys7CisrCQlwYXRoID0gZXA7CisrCX0KKysJcmV0dXJuIE5VTEw7CisrfQorKworK3N0YXRpYyBzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICpmaW5kX2VudHJ5KGNvbnN0IGNoYXIgKnBhdGgsCisrCQkJCQkgIGNvbnN0IGNoYXIgKnBhdGhfZW5kKQorK3sKKysJLyogRmluZCB0cmVlIGVsZW1lbnQsIGRlc2NlbmRpbmcgZnJvbSByb290LCB0aGF0CisrCSAqIGNvcnJlc3BvbmRzIHRvIHRoZSBuYW1lZCBwYXRoLCBsYXppbHkgZXhwYW5kaW5nCisrCSAqIHRoZSB0cmVlIGlmIHBvc3NpYmxlLgorKwkgKi8KKysJaWYgKHBhdGggPT0gcGF0aF9lbmQpIHsKKysJCS8qIFNwZWNpYWwuICBUaGlzIGlzIHRoZSByb290IGxldmVsICovCisrCQlyZXR1cm4gJnJvb3RfZW50cnk7CisrCX0KKysJcmV0dXJuIGZpbmRfZW50cnlfMCgmcm9vdF9lbnRyeSwgcGF0aCwgcGF0aF9lbmQpOworK30KKysKKytzdGF0aWMgdm9pZCBzaG93X2VudHJ5X25hbWUoc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZSkKKyt7CisrCS8qIFRoaXMgaXMgeXVja3kuICBUaGUgcm9vdCBsZXZlbCBpcyB0aGVyZSBmb3IKKysJICogb3VyIGNvbnZlbmllbmNlIGJ1dCB3ZSByZWFsbHkgd2FudCB0byBkbyBhCisrCSAqIGZvcmVzdC4KKysJICovCisrCWlmIChlLT5wYXJlbnQgJiYgZS0+cGFyZW50ICE9ICZyb290X2VudHJ5KSB7CisrCQlzaG93X2VudHJ5X25hbWUoZS0+cGFyZW50KTsKKysJCXB1dGNoYXIoJy8nKTsKKysJfQorKwlwcmludGYoIiVzIiwgZS0+bmFtZSk7CisrfQorKworK3N0YXRpYyBjb25zdCBjaGFyICplbnRyeV90eXBlKHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmUpCisreworKwlyZXR1cm4gKGUtPmRpcmVjdG9yeSA/ICJ0cmVlIiA6ICJibG9iIik7CisrfQorKworK3N0YXRpYyBjb25zdCBjaGFyICplbnRyeV9oZXgoc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZSkKKyt7CisrCXJldHVybiBzaGExX3RvX2hleChlLT5kaXJlY3RvcnkKKysJCQkgICA/IGUtPml0ZW0udHJlZS0+b2JqZWN0LnNoYTEKKysJCQkgICA6IGUtPml0ZW0uYmxvYi0+b2JqZWN0LnNoYTEpOworK30KKysKKysvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIGZvciBtdXR1YWxseSByZWN1cnNpdmUgcm91dGluZXMgKi8KKytzdGF0aWMgaW50IHNob3dfZW50cnkoc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqLCBpbnQpOworKworK3N0YXRpYyBpbnQgc2hvd19jaGlsZHJlbihzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICplLCBpbnQgbGV2ZWwpCisreworKwlpZiAocHJlcGFyZV9jaGlsZHJlbihlKSkKKysJCWRpZSgiaW50ZXJuYWwgZXJyb3I6IGxzLXRyZWUgc2hvd19jaGlsZHJlbiBjYWxsZWQgd2l0aCBub24gdHJlZSIpOworKwllID0gZS0+aXRlbS50cmVlLT5lbnRyaWVzOworKwl3aGlsZSAoZSkgeworKwkJc2hvd19lbnRyeShlLCBsZXZlbCk7CisrCQllID0gZS0+bmV4dDsKKysJfQorKwlyZXR1cm4gMDsKKyt9CisrCisrc3RhdGljIGludCBzaG93X2VudHJ5KHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmUsIGludCBsZXZlbCkKKyt7CisrCWludCBlcnIgPSAwOyAKKysKKysJaWYgKGUgIT0gJnJvb3RfZW50cnkpIHsKKysJCXByaW50ZigiJTA2byAlcyAlcwkiLCBlLT5tb2RlLCBlbnRyeV90eXBlKGUpLAorKwkJICAgICAgIGVudHJ5X2hleChlKSk7CisrCQlzaG93X2VudHJ5X25hbWUoZSk7CisrCQlwdXRjaGFyKGxpbmVfdGVybWluYXRpb24pOworKwl9CisrCisrCWlmIChlLT5kaXJlY3RvcnkpIHsKKysJCS8qIElmIHRoaXMgaXMgYSBkaXJlY3RvcnksIHdlIGhhdmUgdGhlIGZvbGxvd2luZyBjYXNlczoKKysJCSAqICgxKSBUaGlzIGlzIHRoZSB0b3AtbGV2ZWwgcmVxdWVzdCAoZXhwbGljaXQgcGF0aCBmcm9tIHRoZQorKwkJICogICAgIGNvbW1hbmQgbGluZSwgb3IgInJvb3QiIGlmIHRoZXJlIGlzIG5vIGNvbW1hbmQgbGluZSkuCisrCQkgKiAgYS4gV2l0aG91dCBhbnkgZmxhZy4gIFdlIHNob3cgZGlyZWN0IGNoaWxkcmVuLiAgV2UgZG8gbm90IAorKwkJICogICAgIHJlY3Vyc2UgaW50byB0aGVtLgorKwkJICogIGIuIFdpdGggLXIuICBXZSBkbyByZWN1cnNlIGludG8gY2hpbGRyZW4uCisrCQkgKiAgYy4gV2l0aCAtZC4gIFdlIGRvIG5vdCByZWN1cnNlIGludG8gY2hpbGRyZW4uCisrCQkgKiAoMikgV2UgY2FtZSBoZXJlIGJlY2F1c2Ugb3VyIGNhbGxlciBpcyBlaXRoZXIgKDEtYSkgb3IKKysJCSAqICAgICAoMS1iKS4KKysJCSAqICBhLiBXaXRob3V0IGFueSBmbGFnLiAgV2UgZG8gbm90IHNob3cgb3VyIGNoaWxkcmVuICh3aGljaAorKwkJICogICAgIGFyZSBncmFuZGNoaWxkcmVuIGZvciB0aGUgb3JpZ2luYWwgcmVxdWVzdCkuCisrCQkgKiAgYi4gV2l0aCAtci4gIFdlIGNvbnRpbnVlIHRvIHJlY3Vyc2UgaW50byBvdXIgY2hpbGRyZW4uCisrCQkgKiAgYy4gV2l0aCAtZC4gIFdlIHNob3VsZCBub3QgaGF2ZSBjb21lIGhlcmUgdG8gYmVnaW4gd2l0aC4KKysJCSAqLworKwkJaWYgKGxldmVsID09IDAgJiYgIShsc19vcHRpb25zICYgTFNfVFJFRV9PTkxZKSkKKysJCQkvKiBjYXNlICgxKS1hIGFuZCAoMSktYiAqLworKwkJCWVyciA9IGVyciB8IHNob3dfY2hpbGRyZW4oZSwgbGV2ZWwrMSk7CisrCQllbHNlIGlmIChsZXZlbCAmJiBsc19vcHRpb25zICYgTFNfUkVDVVJTSVZFKQorKwkJCS8qIGNhc2UgKDIpLWIgKi8KKysJCQllcnIgPSBlcnIgfCBzaG93X2NoaWxkcmVuKGUsIGxldmVsKzEpOworKwl9CisrCXJldHVybiBlcnI7CisrfQorKworK3N0YXRpYyBpbnQgbGlzdF9vbmUoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqcGF0aF9lbmQpCisreworKwlpbnQgZXJyID0gMDsKKysJc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZSA9IGZpbmRfZW50cnkocGF0aCwgcGF0aF9lbmQpOworKwlpZiAoIWUpIHsKKysJCS8qIHRyYWRpdGlvbmFsbHkgbHMtdHJlZSBkb2VzIG5vdCBjb21wbGFpbiBhYm91dAorKwkJICogbWlzc2luZyBwYXRoLiAgV2UgbWF5IGNoYW5nZSB0aGlzIGxhdGVyIHRvIG1hdGNoCisrCQkgKiB3aGF0ICIvYmluL2xzIC1hIiBkb2VzLCB3aGljaCBpcyB0byBjb21wbGFpbi4KKysJCSAqLworKwkJcmV0dXJuIGVycjsKKysJfQorKwllcnIgPSBlcnIgfCBzaG93X2VudHJ5KGUsIDApOworKwlyZXR1cm4gZXJyOworK30KKysKKytzdGF0aWMgaW50IGxpc3QoY2hhciAqKnBhdGgpCisreworKwlpbnQgaTsKKysJaW50IGVyciA9IDA7CisrCWZvciAoaSA9IDA7IHBhdGhbaV07IGkrKykgeworKwkJaW50IGxlbiA9IHN0cmxlbihwYXRoW2ldKTsKKysJCXdoaWxlICgwIDw9IGxlbiAmJiBwYXRoW2ldW2xlbl0gPT0gJy8nKQorKwkJCWxlbi0tOworKwkJZXJyID0gZXJyIHwgbGlzdF9vbmUocGF0aFtpXSwgcGF0aFtpXSArIGxlbik7CisrCX0KKysJcmV0dXJuIGVycjsKKyt9CisrCisrc3RhdGljIGNvbnN0IGNoYXIgKmxzX3RyZWVfdXNhZ2UgPQorKwkiZ2l0LWxzLXRyZWUgWy1kXSBbLXJdIFstel0gPHRyZWUtaXNoPiBbcGF0aC4uLl0iOworKworK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyt7CisrCXN0YXRpYyBjaGFyICpwYXRoMFtdID0geyAiIiwgTlVMTCB9OworKwljaGFyICoqcGF0aDsKKysJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKysKKysJd2hpbGUgKDEgPCBhcmdjICYmIGFyZ3ZbMV1bMF0gPT0gJy0nKSB7CisrCQlzd2l0Y2ggKGFyZ3ZbMV1bMV0pIHsKKysJCWNhc2UgJ3onOgorKwkJCWxpbmVfdGVybWluYXRpb24gPSAwOworKwkJCWJyZWFrOworKwkJY2FzZSAncic6CisrCQkJbHNfb3B0aW9ucyB8PSBMU19SRUNVUlNJVkU7CisrCQkJYnJlYWs7CisrCQljYXNlICdkJzoKKysJCQlsc19vcHRpb25zIHw9IExTX1RSRUVfT05MWTsKKysJCQlicmVhazsKKysJCWRlZmF1bHQ6CisrCQkJdXNhZ2UobHNfdHJlZV91c2FnZSk7CisrCQl9CisrCQlhcmdjLS07IGFyZ3YrKzsKKysJfQorKworKwlpZiAoYXJnYyA8IDIpCisrCQl1c2FnZShsc190cmVlX3VzYWdlKTsKKysJaWYgKGdldF9zaGExKGFyZ3ZbMV0sIHNoYTEpIDwgMCkKKysJCXVzYWdlKGxzX3RyZWVfdXNhZ2UpOworKworKwlwYXRoID0gKGFyZ2MgPT0gMikgPyBwYXRoMCA6IChhcmd2ICsgMik7CisrCXByZXBhcmVfcm9vdChzaGExKTsKKysJaWYgKGxpc3QocGF0aCkgPCAwKQorKwkJZGllKCJsaXN0IGZhaWxlZCIpOworKwlyZXR1cm4gMDsKKyt9CitkaWZmIC0tZ2l0IGEvdC90MzEwMC1scy10cmVlLXJlc3RyaWN0LnNoIGIvdC90MzEwMC1scy10cmVlLXJlc3RyaWN0LnNoCistLS0gYS90L3QzMTAwLWxzLXRyZWUtcmVzdHJpY3Quc2gKKysrKyBiL3QvdDMxMDAtbHMtdHJlZS1yZXN0cmljdC5zaAorQEAgLTc0LDggKzc0LDggQEAgdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgICdscy10cmVlIGZpbHRlcmVkJyBcCisgICAgICdnaXQtbHMtdHJlZSAkdHJlZSBwYXRoMSBwYXRoMCA+Y3VycmVudCAmJgorICAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKy0xMDA2NDQgYmxvYiBYCXBhdGgwCisgMTIwMDAwIGJsb2IgWAlwYXRoMQorKzEwMDY0NCBibG9iIFgJcGF0aDAKKyBFT0YKKyAgICAgIHRlc3Rfb3V0cHV0JworIAorQEAgLTg1LDcgKzg1LDYgQEAgdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorIDA0MDAwMCB0cmVlIFgJcGF0aDIKKyAwNDAwMDAgdHJlZSBYCXBhdGgyL2JhegorLTEwMDY0NCBibG9iIFgJcGF0aDIvYmF6L2IKKyAxMjAwMDAgYmxvYiBYCXBhdGgyL2JhemJvCisgMTAwNjQ0IGJsb2IgWAlwYXRoMi9mb28KKyBFT0YKK2RpZmYgLS1naXQgYS90cmVlLmMgYi90cmVlLmMKKy0tLSBhL3RyZWUuYworKysrIGIvdHJlZS5jCitAQCAtMTMzLDcgKzEzMyw3IEBAIGludCBwYXJzZV90cmVlX2J1ZmZlcihzdHJ1Y3QgdHJlZSAqaXRlbSwKKyAJCX0KKyAJCWlmIChvYmopCisgCQkJYWRkX3JlZigmaXRlbS0+b2JqZWN0LCBvYmopOworLQorKwkJZW50cnktPnBhcmVudCA9IE5VTEw7IC8qIG5lZWRzIHRvIGJlIGZpbGxlZCBieSB0aGUgdXNlciAqLworIAkJKmxpc3RfcCA9IGVudHJ5OworIAkJbGlzdF9wID0gJmVudHJ5LT5uZXh0OworIAl9CitkaWZmIC0tZ2l0IGEvdHJlZS5oIGIvdHJlZS5oCistLS0gYS90cmVlLmgKKysrKyBiL3RyZWUuaAorQEAgLTE2LDYgKzE2LDcgQEAgc3RydWN0IHRyZWVfZW50cnlfbGlzdCB7CisgCQlzdHJ1Y3QgdHJlZSAqdHJlZTsKKyAJCXN0cnVjdCBibG9iICpibG9iOworIAl9IGl0ZW07CisrCXN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKnBhcmVudDsKKyB9OworIAorIHN0cnVjdCB0cmVlIHsKZGlmZiAtLWdpdCBhL3QvdDQxMDAvdC1hcHBseS00LmV4cGVjdCBiL3QvdDQxMDAvdC1hcHBseS00LmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWMwMjhiCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTQuZXhwZWN0CkBAIC0wLDAgKzEsNSBAQAorIHQvdDAwMDAtYmFzaWMuc2ggfCAgICAwIAorIHQvdGVzdC1saWIuc2ggICAgfCAgICAwIAorIDIgZmlsZXMgY2hhbmdlZCwgMCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIG1vZGUgY2hhbmdlIDEwMDY0NCA9PiAxMDA3NTUgdC90MDAwMC1iYXNpYy5zaAorIG1vZGUgY2hhbmdlIDEwMDY0NCA9PiAxMDA3NTUgdC90ZXN0LWxpYi5zaApkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTQucGF0Y2ggYi90L3Q0MTAwL3QtYXBwbHktNC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTU2YWI1Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTQucGF0Y2gKQEAgLTAsMCArMSw3IEBACitjZWVkZTU5ZWE5MGNlYmFkNTJiYTljODI2M2ZlZjNmYjZlZjE3NTkzIChmcm9tIDM2OGY5OWQ1N2U4ZWQxNzI0M2YyZTE2NDQzMTQ0OWQ0OGJmY2EyZmIpCitkaWZmIC0tZ2l0IGEvdC90MDAwMC1iYXNpYy5zaCBiL3QvdDAwMDAtYmFzaWMuc2gKK29sZCBtb2RlIDEwMDY0NAorbmV3IG1vZGUgMTAwNzU1CitkaWZmIC0tZ2l0IGEvdC90ZXN0LWxpYi5zaCBiL3QvdGVzdC1saWIuc2gKK29sZCBtb2RlIDEwMDY0NAorbmV3IG1vZGUgMTAwNzU1CmRpZmYgLS1naXQgYS90L3Q0MTAwL3QtYXBwbHktNS5leHBlY3QgYi90L3Q0MTAwL3QtYXBwbHktNS5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4N2RmMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDAvdC1hcHBseS01LmV4cGVjdApAQCAtMCwwICsxLDE5IEBACisgRG9jdW1lbnRhdGlvbi9naXQtcnB1bGwudHh0ICAgIHwgICA1MCAtLS0tLS0tLS0tLS0tLS0tLS0tCisgRG9jdW1lbnRhdGlvbi9naXQtcnB1c2gudHh0ICAgIHwgICAzMCAtLS0tLS0tLS0tLS0KKyBEb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVsbC50eHQgfCAgIDUwICsrKysrKysrKysrKysrKysrKysKKyBEb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVzaC50eHQgfCAgIDMwICsrKysrKysrKysrKworIERvY3VtZW50YXRpb24vZ2l0LnR4dCAgICAgICAgICB8ICAgIDYgKy0KKyBNYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgfCAgICA2ICstCisgcnB1bGwuYyAgICAgICAgICAgICAgICAgICAgICAgIHwgICA4MyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHJwdXNoLmMgICAgICAgICAgICAgICAgICAgICAgICB8ICAxMDQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHNzaC1wdWxsLmMgICAgICAgICAgICAgICAgICAgICB8ICAgODMgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyBzc2gtcHVzaC5jICAgICAgICAgICAgICAgICAgICAgfCAgMTA0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyAxMCBmaWxlcyBjaGFuZ2VkLCAyNzMgaW5zZXJ0aW9ucygrKSwgMjczIGRlbGV0aW9ucygtKQorIGRlbGV0ZSBEb2N1bWVudGF0aW9uL2dpdC1ycHVsbC50eHQKKyBkZWxldGUgRG9jdW1lbnRhdGlvbi9naXQtcnB1c2gudHh0CisgY3JlYXRlIERvY3VtZW50YXRpb24vZ2l0LXNzaC1wdWxsLnR4dAorIGNyZWF0ZSBEb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVzaC50eHQKKyBkZWxldGUgcnB1bGwuYworIGRlbGV0ZSBycHVzaC5jCisgY3JlYXRlIHNzaC1wdWxsLmMKKyBjcmVhdGUgc3NoLXB1c2guYwpkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTUucGF0Y2ggYi90L3Q0MTAwL3QtYXBwbHktNS5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjZkZGMxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTUucGF0Y2gKQEAgLTAsMCArMSw2MTIgQEAKK2RpZmYgYS9Eb2N1bWVudGF0aW9uL2dpdC1ycHVsbC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1ycHVsbC50eHQKKy0tLSBhL0RvY3VtZW50YXRpb24vZ2l0LXJwdWxsLnR4dAorKysrIC9kZXYvbnVsbAorQEAgLTEsNTAgKzAsMCBAQAorLWdpdC1ycHVsbCgxKQorLT09PT09PT09PT09PQorLXYwLjEsIE1heSAyMDA1CistCistTkFNRQorLS0tLS0KKy1naXQtcnB1bGwgLSBQdWxscyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgb3ZlciBzc2ggY29ubmVjdGlvbgorLQorLQorLQorLVNZTk9QU0lTCistLS0tLS0tLS0KKy0nZ2l0LXJwdWxsJyBbLWNdIFstdF0gWy1hXSBbLWRdIFstdl0gWy0tcmVjb3Zlcl0gY29tbWl0LWlkIHVybAorLQorLURFU0NSSVBUSU9OCistLS0tLS0tLS0tLS0KKy1QdWxscyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgb3ZlciBzc2ggY29ubmVjdGlvbiwgaW52b2tpbmcgZ2l0LXJwdXNoIG9uCistdGhlIG90aGVyIGVuZC4KKy0KKy1PUFRJT05TCistLS0tLS0tLQorLS1jOjoKKy0JR2V0IHRoZSBjb21taXQgb2JqZWN0cy4KKy0tdDo6CistCUdldCB0cmVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbW1pdCBvYmplY3RzLgorLS1hOjoKKy0JR2V0IGFsbCB0aGUgb2JqZWN0cy4KKy0tZDo6CistCURvIG5vdCBjaGVjayBmb3IgZGVsdGEgYmFzZSBvYmplY3RzICh1c2UgdGhpcyBvcHRpb24KKy0Jb25seSB3aGVuIHlvdSBrbm93IHRoZSByZW1vdGUgcmVwb3NpdG9yeSBpcyBub3QKKy0JZGVsdGlmaWVkKS4KKy0tLXJlY292ZXI6OgorLQlDaGVjayBkZXBlbmRlbmN5IG9mIGRlbHRpZmllZCBvYmplY3QgbW9yZSBjYXJlZnVsbHkgdGhhbgorLQl1c3VhbCwgdG8gcmVjb3ZlciBhZnRlciBlYXJsaWVyIHB1bGwgdGhhdCB3YXMgaW50ZXJydXB0ZWQuCistLXY6OgorLQlSZXBvcnQgd2hhdCBpcyBkb3dubG9hZGVkLgorLQorLQorLUF1dGhvcgorLS0tLS0tLQorLVdyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorLQorLURvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tLQorLURvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCistCistR0lUCistLS0tCistUGFydCBvZiB0aGUgbGluazpnaXQuaHRtbFtnaXRdIHN1aXRlCistCitkaWZmIGEvRG9jdW1lbnRhdGlvbi9naXQtcnB1c2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcnB1c2gudHh0CistLS0gYS9Eb2N1bWVudGF0aW9uL2dpdC1ycHVzaC50eHQKKysrKyAvZGV2L251bGwKK0BAIC0xLDMwICswLDAgQEAKKy1naXQtcnB1c2goMSkKKy09PT09PT09PT09PT0KKy12MC4xLCBNYXkgMjAwNQorLQorLU5BTUUKKy0tLS0tCistZ2l0LXJwdXNoIC0gSGVscGVyICJzZXJ2ZXItc2lkZSIgcHJvZ3JhbSB1c2VkIGJ5IGdpdC1ycHVsbAorLQorLQorLVNZTk9QU0lTCistLS0tLS0tLS0KKy0nZ2l0LXJwdXNoJworLQorLURFU0NSSVBUSU9OCistLS0tLS0tLS0tLS0KKy1IZWxwZXIgInNlcnZlci1zaWRlIiBwcm9ncmFtIHVzZWQgYnkgZ2l0LXJwdWxsLgorLQorLQorLUF1dGhvcgorLS0tLS0tLQorLVdyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorLQorLURvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tLQorLURvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCistCistR0lUCistLS0tCistUGFydCBvZiB0aGUgbGluazpnaXQuaHRtbFtnaXRdIHN1aXRlCistCitkaWZmIGEvRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1bGwudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1bGwudHh0CistLS0gL2Rldi9udWxsCisrKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVsbC50eHQKK0BAIC0wLDAgKzEsNTAgQEAKKytnaXQtc3NoLXB1bGwoMSkKKys9PT09PT09PT09PT09PT0KKyt2MC4xLCBNYXkgMjAwNQorKworK05BTUUKKystLS0tCisrZ2l0LXNzaC1wdWxsIC0gUHVsbHMgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IG92ZXIgc3NoIGNvbm5lY3Rpb24KKysKKysKKysKKytTWU5PUFNJUworKy0tLS0tLS0tCisrJ2dpdC1zc2gtcHVsbCcgWy1jXSBbLXRdIFstYV0gWy1kXSBbLXZdIFstLXJlY292ZXJdIGNvbW1pdC1pZCB1cmwKKysKKytERVNDUklQVElPTgorKy0tLS0tLS0tLS0tCisrUHVsbHMgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IG92ZXIgc3NoIGNvbm5lY3Rpb24sIGludm9raW5nIGdpdC1zc2gtcHVzaAorK29uIHRoZSBvdGhlciBlbmQuCisrCisrT1BUSU9OUworKy0tLS0tLS0KKystYzo6CisrCUdldCB0aGUgY29tbWl0IG9iamVjdHMuCisrLXQ6OgorKwlHZXQgdHJlZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21taXQgb2JqZWN0cy4KKystYTo6CisrCUdldCBhbGwgdGhlIG9iamVjdHMuCisrLWQ6OgorKwlEbyBub3QgY2hlY2sgZm9yIGRlbHRhIGJhc2Ugb2JqZWN0cyAodXNlIHRoaXMgb3B0aW9uCisrCW9ubHkgd2hlbiB5b3Uga25vdyB0aGUgcmVtb3RlIHJlcG9zaXRvcnkgaXMgbm90CisrCWRlbHRpZmllZCkuCisrLS1yZWNvdmVyOjoKKysJQ2hlY2sgZGVwZW5kZW5jeSBvZiBkZWx0aWZpZWQgb2JqZWN0IG1vcmUgY2FyZWZ1bGx5IHRoYW4KKysJdXN1YWwsIHRvIHJlY292ZXIgYWZ0ZXIgZWFybGllciBwdWxsIHRoYXQgd2FzIGludGVycnVwdGVkLgorKy12OjoKKysJUmVwb3J0IHdoYXQgaXMgZG93bmxvYWRlZC4KKysKKysKKytBdXRob3IKKystLS0tLS0KKytXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKysKKytEb2N1bWVudGF0aW9uCisrLS0tLS0tLS0tLS0tLS0KKytEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorKworK0dJVAorKy0tLQorK1BhcnQgb2YgdGhlIGxpbms6Z2l0Lmh0bWxbZ2l0XSBzdWl0ZQorKworZGlmZiBhL0RvY3VtZW50YXRpb24vZ2l0LXNzaC1wdXNoLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXNzaC1wdXNoLnR4dAorLS0tIC9kZXYvbnVsbAorKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1c2gudHh0CitAQCAtMCwwICsxLDMwIEBACisrZ2l0LXNzaC1wdXNoKDEpCisrPT09PT09PT09PT09PT09CisrdjAuMSwgTWF5IDIwMDUKKysKKytOQU1FCisrLS0tLQorK2dpdC1zc2gtcHVzaCAtIEhlbHBlciAic2VydmVyLXNpZGUiIHByb2dyYW0gdXNlZCBieSBnaXQtc3NoLXB1bGwKKysKKysKKytTWU5PUFNJUworKy0tLS0tLS0tCisrJ2dpdC1zc2gtcHVzaCcKKysKKytERVNDUklQVElPTgorKy0tLS0tLS0tLS0tCisrSGVscGVyICJzZXJ2ZXItc2lkZSIgcHJvZ3JhbSB1c2VkIGJ5IGdpdC1zc2gtcHVsbC4KKysKKysKKytBdXRob3IKKystLS0tLS0KKytXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKysKKytEb2N1bWVudGF0aW9uCisrLS0tLS0tLS0tLS0tLS0KKytEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorKworK0dJVAorKy0tLQorK1BhcnQgb2YgdGhlIGxpbms6Z2l0Lmh0bWxbZ2l0XSBzdWl0ZQorKworZGlmZiBhL0RvY3VtZW50YXRpb24vZ2l0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LnR4dAorLS0tIGEvRG9jdW1lbnRhdGlvbi9naXQudHh0CisrKysgYi9Eb2N1bWVudGF0aW9uL2dpdC50eHQKK0BAIC0xNDgsNyArMTQ4LDcgQEAgbGluazpnaXQtcmVzb2x2ZS1zY3JpcHQuaHRtbFtnaXQtcmVzb2x2ZQorIGxpbms6Z2l0LXRhZy1zY3JpcHQuaHRtbFtnaXQtdGFnLXNjcmlwdF06OgorIAlBbiBleGFtcGxlIHNjcmlwdCB0byBjcmVhdGUgYSB0YWcgb2JqZWN0IHNpZ25lZCB3aXRoIEdQRworIAorLWxpbms6Z2l0LXJwdWxsLmh0bWxbZ2l0LXJwdWxsXTo6CisrbGluazpnaXQtc3NoLXB1bGwuaHRtbFtnaXQtc3NoLXB1bGxdOjoKKyAJUHVsbHMgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IG92ZXIgc3NoIGNvbm5lY3Rpb24KKyAKKyBJbnRlcm9nYXRvcnM6CitAQCAtMTU2LDggKzE1Niw4IEBAIEludGVyb2dhdG9yczoKKyBsaW5rOmdpdC1kaWZmLWhlbHBlci5odG1sW2dpdC1kaWZmLWhlbHBlcl06OgorIAlHZW5lcmF0ZXMgcGF0Y2ggZm9ybWF0IG91dHB1dCBmb3IgZ2l0LWRpZmYtKgorIAorLWxpbms6Z2l0LXJwdXNoLmh0bWxbZ2l0LXJwdXNoXTo6CistCUhlbHBlciAic2VydmVyLXNpZGUiIHByb2dyYW0gdXNlZCBieSBnaXQtcnB1bGwKKytsaW5rOmdpdC1zc2gtcHVzaC5odG1sW2dpdC1zc2gtcHVzaF06OgorKwlIZWxwZXIgInNlcnZlci1zaWRlIiBwcm9ncmFtIHVzZWQgYnkgZ2l0LXNzaC1wdWxsCisgCisgCisgCitkaWZmIGEvTWFrZWZpbGUgYi9NYWtlZmlsZQorLS0tIGEvTWFrZWZpbGUKKysrKyBiL01ha2VmaWxlCitAQCAtMzAsNyArMzAsNyBAQCBQUk9HPSAgIGdpdC11cGRhdGUtaW5kZXggZ2l0LWRpZmYtZmlsZXMKKyAJZ2l0LWNoZWNrb3V0LWNhY2hlIGdpdC1kaWZmLXRyZWUgZ2l0LXJldi10cmVlIGdpdC1scy1maWxlcyBcCisgCWdpdC1jaGVjay1maWxlcyBnaXQtbHMtdHJlZSBnaXQtbWVyZ2UtYmFzZSBnaXQtbWVyZ2UtY2FjaGUgXAorIAlnaXQtdW5wYWNrLWZpbGUgZ2l0LWV4cG9ydCBnaXQtZGlmZi1jYWNoZSBnaXQtY29udmVydC1jYWNoZSBcCistCWdpdC1odHRwLXB1bGwgZ2l0LXJwdXNoIGdpdC1ycHVsbCBnaXQtcmV2LWxpc3QgZ2l0LW1rdGFnIFwKKysJZ2l0LWh0dHAtcHVsbCBnaXQtc3NoLXB1c2ggZ2l0LXNzaC1wdWxsIGdpdC1yZXYtbGlzdCBnaXQtbWt0YWcgXAorIAlnaXQtZGlmZi1oZWxwZXIgZ2l0LXRhci10cmVlIGdpdC1sb2NhbC1wdWxsIGdpdC13cml0ZS1ibG9iIFwKKyAJZ2l0LWdldC10YXItY29tbWl0LWlkIGdpdC1ta2RlbHRhIGdpdC1hcHBseSBnaXQtc3RyaXBzcGFjZQorIAorQEAgLTEwNSw4ICsxMDUsOCBAQCBnaXQtZGlmZi1jYWNoZTogZGlmZi1jYWNoZS5jCisgZ2l0LWNvbnZlcnQtY2FjaGU6IGNvbnZlcnQtY2FjaGUuYworIGdpdC1odHRwLXB1bGw6IGh0dHAtcHVsbC5jIHB1bGwuYworIGdpdC1sb2NhbC1wdWxsOiBsb2NhbC1wdWxsLmMgcHVsbC5jCistZ2l0LXJwdXNoOiByc2guYworLWdpdC1ycHVsbDogcnNoLmMgcHVsbC5jCisrZ2l0LXNzaC1wdXNoOiByc2guYworK2dpdC1zc2gtcHVsbDogcnNoLmMgcHVsbC5jCisgZ2l0LXJldi1saXN0OiByZXYtbGlzdC5jCisgZ2l0LW1rdGFnOiBta3RhZy5jCisgZ2l0LWRpZmYtaGVscGVyOiBkaWZmLWhlbHBlci5jCitkaWZmIGEvcnB1bGwuYyBiL3JwdWxsLmMKKy0tLSBhL3JwdWxsLmMKKysrKyAvZGV2L251bGwKK0BAIC0xLDgzICswLDAgQEAKKy0jaW5jbHVkZSAiY2FjaGUuaCIKKy0jaW5jbHVkZSAiY29tbWl0LmgiCistI2luY2x1ZGUgInJzaC5oIgorLSNpbmNsdWRlICJwdWxsLmgiCistCistc3RhdGljIGludCBmZF9pbjsKKy1zdGF0aWMgaW50IGZkX291dDsKKy0KKy1zdGF0aWMgdW5zaWduZWQgY2hhciByZW1vdGVfdmVyc2lvbiA9IDA7Cistc3RhdGljIHVuc2lnbmVkIGNoYXIgbG9jYWxfdmVyc2lvbiA9IDE7CistCistaW50IGZldGNoKHVuc2lnbmVkIGNoYXIgKnNoYTEpCisteworLQlpbnQgcmV0OworLQlzaWduZWQgY2hhciByZW1vdGU7CistCWNoYXIgdHlwZSA9ICdvJzsKKy0JaWYgKGhhc19zaGExX2ZpbGUoc2hhMSkpCistCQlyZXR1cm4gMDsKKy0Jd3JpdGUoZmRfb3V0LCAmdHlwZSwgMSk7CistCXdyaXRlKGZkX291dCwgc2hhMSwgMjApOworLQlpZiAocmVhZChmZF9pbiwgJnJlbW90ZSwgMSkgPCAxKQorLQkJcmV0dXJuIC0xOworLQlpZiAocmVtb3RlIDwgMCkKKy0JCXJldHVybiByZW1vdGU7CistCXJldCA9IHdyaXRlX3NoYTFfZnJvbV9mZChzaGExLCBmZF9pbik7CistCWlmICghcmV0KQorLQkJcHVsbF9zYXkoImdvdCAlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOworLQlyZXR1cm4gcmV0OworLX0KKy0KKy1pbnQgZ2V0X3ZlcnNpb24odm9pZCkKKy17CistCWNoYXIgdHlwZSA9ICd2JzsKKy0Jd3JpdGUoZmRfb3V0LCAmdHlwZSwgMSk7CistCXdyaXRlKGZkX291dCwgJmxvY2FsX3ZlcnNpb24sIDEpOworLQlpZiAocmVhZChmZF9pbiwgJnJlbW90ZV92ZXJzaW9uLCAxKSA8IDEpIHsKKy0JCXJldHVybiBlcnJvcigiQ291bGRuJ3QgcmVhZCB2ZXJzaW9uIGZyb20gcmVtb3RlIGVuZCIpOworLQl9CistCXJldHVybiAwOworLX0KKy0KKy1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisteworLQljaGFyICpjb21taXRfaWQ7CistCWNoYXIgKnVybDsKKy0JaW50IGFyZyA9IDE7CistCistCXdoaWxlIChhcmcgPCBhcmdjICYmIGFyZ3ZbYXJnXVswXSA9PSAnLScpIHsKKy0JCWlmIChhcmd2W2FyZ11bMV0gPT0gJ3QnKSB7CistCQkJZ2V0X3RyZWUgPSAxOworLQkJfSBlbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ2MnKSB7CistCQkJZ2V0X2hpc3RvcnkgPSAxOworLQkJfSBlbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ2QnKSB7CistCQkJZ2V0X2RlbHRhID0gMDsKKy0JCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2FyZ10sICItLXJlY292ZXIiKSkgeworLQkJCWdldF9kZWx0YSA9IDI7CistCQl9IGVsc2UgaWYgKGFyZ3ZbYXJnXVsxXSA9PSAnYScpIHsKKy0JCQlnZXRfYWxsID0gMTsKKy0JCQlnZXRfdHJlZSA9IDE7CistCQkJZ2V0X2hpc3RvcnkgPSAxOworLQkJfSBlbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ3YnKSB7CistCQkJZ2V0X3ZlcmJvc2VseSA9IDE7CistCQl9CistCQlhcmcrKzsKKy0JfQorLQlpZiAoYXJnYyA8IGFyZyArIDIpIHsKKy0JCXVzYWdlKCJnaXQtcnB1bGwgWy1jXSBbLXRdIFstYV0gWy12XSBbLWRdIFstLXJlY292ZXJdIGNvbW1pdC1pZCB1cmwiKTsKKy0JCXJldHVybiAxOworLQl9CistCWNvbW1pdF9pZCA9IGFyZ3ZbYXJnXTsKKy0JdXJsID0gYXJndlthcmcgKyAxXTsKKy0KKy0JaWYgKHNldHVwX2Nvbm5lY3Rpb24oJmZkX2luLCAmZmRfb3V0LCAiZ2l0LXJwdXNoIiwgdXJsLCBhcmcsIGFyZ3YgKyAxKSkKKy0JCXJldHVybiAxOworLQorLQlpZiAoZ2V0X3ZlcnNpb24oKSkKKy0JCXJldHVybiAxOworLQorLQlpZiAocHVsbChjb21taXRfaWQpKQorLQkJcmV0dXJuIDE7CistCistCXJldHVybiAwOworLX0KK2RpZmYgYS9ycHVzaC5jIGIvcnB1c2guYworLS0tIGEvcnB1c2guYworKysrIC9kZXYvbnVsbAorQEAgLTEsMTA0ICswLDAgQEAKKy0jaW5jbHVkZSAiY2FjaGUuaCIKKy0jaW5jbHVkZSAicnNoLmgiCistI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKy0jaW5jbHVkZSA8ZXJybm8uaD4KKy0KKy11bnNpZ25lZCBjaGFyIGxvY2FsX3ZlcnNpb24gPSAxOworLXVuc2lnbmVkIGNoYXIgcmVtb3RlX3ZlcnNpb24gPSAwOworLQorLWludCBzZXJ2ZV9vYmplY3QoaW50IGZkX2luLCBpbnQgZmRfb3V0KSB7CistCXNzaXplX3Qgc2l6ZTsKKy0JaW50IHBvc24gPSAwOworLQljaGFyIHNoYTFbMjBdOworLQl1bnNpZ25lZCBsb25nIG9ianNpemU7CistCXZvaWQgKmJ1ZjsKKy0Jc2lnbmVkIGNoYXIgcmVtb3RlOworLQlkbyB7CistCQlzaXplID0gcmVhZChmZF9pbiwgc2hhMSArIHBvc24sIDIwIC0gcG9zbik7CistCQlpZiAoc2l6ZSA8IDApIHsKKy0JCQlwZXJyb3IoImdpdC1ycHVzaDogcmVhZCAiKTsKKy0JCQlyZXR1cm4gLTE7CistCQl9CistCQlpZiAoIXNpemUpCistCQkJcmV0dXJuIC0xOworLQkJcG9zbiArPSBzaXplOworLQl9IHdoaWxlIChwb3NuIDwgMjApOworLQkKKy0JLyogZnByaW50ZihzdGRlcnIsICJTZXJ2aW5nICVzXG4iLCBzaGExX3RvX2hleChzaGExKSk7ICovCistCXJlbW90ZSA9IDA7CistCQorLQlidWYgPSBtYXBfc2hhMV9maWxlKHNoYTEsICZvYmpzaXplKTsKKy0JCistCWlmICghYnVmKSB7CistCQlmcHJpbnRmKHN0ZGVyciwgImdpdC1ycHVzaDogY291bGQgbm90IGZpbmQgJXNcbiIsIAorLQkJCXNoYTFfdG9faGV4KHNoYTEpKTsKKy0JCXJlbW90ZSA9IC0xOworLQl9CistCQorLQl3cml0ZShmZF9vdXQsICZyZW1vdGUsIDEpOworLQkKKy0JaWYgKHJlbW90ZSA8IDApCistCQlyZXR1cm4gMDsKKy0JCistCXBvc24gPSAwOworLQlkbyB7CistCQlzaXplID0gd3JpdGUoZmRfb3V0LCBidWYgKyBwb3NuLCBvYmpzaXplIC0gcG9zbik7CistCQlpZiAoc2l6ZSA8PSAwKSB7CistCQkJaWYgKCFzaXplKSB7CistCQkJCWZwcmludGYoc3RkZXJyLCAiZ2l0LXJwdXNoOiB3cml0ZSBjbG9zZWQiKTsKKy0JCQl9IGVsc2UgeworLQkJCQlwZXJyb3IoImdpdC1ycHVzaDogd3JpdGUgIik7CistCQkJfQorLQkJCXJldHVybiAtMTsKKy0JCX0KKy0JCXBvc24gKz0gc2l6ZTsKKy0JfSB3aGlsZSAocG9zbiA8IG9ianNpemUpOworLQlyZXR1cm4gMDsKKy19CistCistaW50IHNlcnZlX3ZlcnNpb24oaW50IGZkX2luLCBpbnQgZmRfb3V0KQorLXsKKy0JaWYgKHJlYWQoZmRfaW4sICZyZW1vdGVfdmVyc2lvbiwgMSkgPCAxKQorLQkJcmV0dXJuIC0xOworLQl3cml0ZShmZF9vdXQsICZsb2NhbF92ZXJzaW9uLCAxKTsKKy0JcmV0dXJuIDA7CistfQorLQorLXZvaWQgc2VydmljZShpbnQgZmRfaW4sIGludCBmZF9vdXQpIHsKKy0JY2hhciB0eXBlOworLQlpbnQgcmV0dmFsOworLQlkbyB7CistCQlyZXR2YWwgPSByZWFkKGZkX2luLCAmdHlwZSwgMSk7CistCQlpZiAocmV0dmFsIDwgMSkgeworLQkJCWlmIChyZXR2YWwgPCAwKQorLQkJCQlwZXJyb3IoInJwdXNoOiByZWFkICIpOworLQkJCXJldHVybjsKKy0JCX0KKy0JCWlmICh0eXBlID09ICd2JyAmJiBzZXJ2ZV92ZXJzaW9uKGZkX2luLCBmZF9vdXQpKQorLQkJCXJldHVybjsKKy0JCWlmICh0eXBlID09ICdvJyAmJiBzZXJ2ZV9vYmplY3QoZmRfaW4sIGZkX291dCkpCistCQkJcmV0dXJuOworLQl9IHdoaWxlICgxKTsKKy19CistCistaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorLXsKKy0JaW50IGFyZyA9IDE7CistICAgICAgICBjaGFyICpjb21taXRfaWQ7CistICAgICAgICBjaGFyICp1cmw7CistCWludCBmZF9pbiwgZmRfb3V0OworLQl3aGlsZSAoYXJnIDwgYXJnYyAmJiBhcmd2W2FyZ11bMF0gPT0gJy0nKSB7CistICAgICAgICAgICAgICAgIGFyZysrOworLSAgICAgICAgfQorLSAgICAgICAgaWYgKGFyZ2MgPCBhcmcgKyAyKSB7CistCQl1c2FnZSgiZ2l0LXJwdXNoIFstY10gWy10XSBbLWFdIGNvbW1pdC1pZCB1cmwiKTsKKy0gICAgICAgICAgICAgICAgcmV0dXJuIDE7CistICAgICAgICB9CistCWNvbW1pdF9pZCA9IGFyZ3ZbYXJnXTsKKy0JdXJsID0gYXJndlthcmcgKyAxXTsKKy0JaWYgKHNldHVwX2Nvbm5lY3Rpb24oJmZkX2luLCAmZmRfb3V0LCAiZ2l0LXJwdWxsIiwgdXJsLCBhcmcsIGFyZ3YgKyAxKSkKKy0JCXJldHVybiAxOworLQorLQlzZXJ2aWNlKGZkX2luLCBmZF9vdXQpOworLQlyZXR1cm4gMDsKKy19CitkaWZmIGEvc3NoLXB1bGwuYyBiL3NzaC1wdWxsLmMKKy0tLSAvZGV2L251bGwKKysrKyBiL3NzaC1wdWxsLmMKK0BAIC0wLDAgKzEsODMgQEAKKysjaW5jbHVkZSAiY2FjaGUuaCIKKysjaW5jbHVkZSAiY29tbWl0LmgiCisrI2luY2x1ZGUgInJzaC5oIgorKyNpbmNsdWRlICJwdWxsLmgiCisrCisrc3RhdGljIGludCBmZF9pbjsKKytzdGF0aWMgaW50IGZkX291dDsKKysKKytzdGF0aWMgdW5zaWduZWQgY2hhciByZW1vdGVfdmVyc2lvbiA9IDA7Cisrc3RhdGljIHVuc2lnbmVkIGNoYXIgbG9jYWxfdmVyc2lvbiA9IDE7CisrCisraW50IGZldGNoKHVuc2lnbmVkIGNoYXIgKnNoYTEpCisreworKwlpbnQgcmV0OworKwlzaWduZWQgY2hhciByZW1vdGU7CisrCWNoYXIgdHlwZSA9ICdvJzsKKysJaWYgKGhhc19zaGExX2ZpbGUoc2hhMSkpCisrCQlyZXR1cm4gMDsKKysJd3JpdGUoZmRfb3V0LCAmdHlwZSwgMSk7CisrCXdyaXRlKGZkX291dCwgc2hhMSwgMjApOworKwlpZiAocmVhZChmZF9pbiwgJnJlbW90ZSwgMSkgPCAxKQorKwkJcmV0dXJuIC0xOworKwlpZiAocmVtb3RlIDwgMCkKKysJCXJldHVybiByZW1vdGU7CisrCXJldCA9IHdyaXRlX3NoYTFfZnJvbV9mZChzaGExLCBmZF9pbik7CisrCWlmICghcmV0KQorKwkJcHVsbF9zYXkoImdvdCAlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOworKwlyZXR1cm4gcmV0OworK30KKysKKytpbnQgZ2V0X3ZlcnNpb24odm9pZCkKKyt7CisrCWNoYXIgdHlwZSA9ICd2JzsKKysJd3JpdGUoZmRfb3V0LCAmdHlwZSwgMSk7CisrCXdyaXRlKGZkX291dCwgJmxvY2FsX3ZlcnNpb24sIDEpOworKwlpZiAocmVhZChmZF9pbiwgJnJlbW90ZV92ZXJzaW9uLCAxKSA8IDEpIHsKKysJCXJldHVybiBlcnJvcigiQ291bGRuJ3QgcmVhZCB2ZXJzaW9uIGZyb20gcmVtb3RlIGVuZCIpOworKwl9CisrCXJldHVybiAwOworK30KKysKKytpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisreworKwljaGFyICpjb21taXRfaWQ7CisrCWNoYXIgKnVybDsKKysJaW50IGFyZyA9IDE7CisrCisrCXdoaWxlIChhcmcgPCBhcmdjICYmIGFyZ3ZbYXJnXVswXSA9PSAnLScpIHsKKysJCWlmIChhcmd2W2FyZ11bMV0gPT0gJ3QnKSB7CisrCQkJZ2V0X3RyZWUgPSAxOworKwkJfSBlbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ2MnKSB7CisrCQkJZ2V0X2hpc3RvcnkgPSAxOworKwkJfSBlbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ2QnKSB7CisrCQkJZ2V0X2RlbHRhID0gMDsKKysJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2FyZ10sICItLXJlY292ZXIiKSkgeworKwkJCWdldF9kZWx0YSA9IDI7CisrCQl9IGVsc2UgaWYgKGFyZ3ZbYXJnXVsxXSA9PSAnYScpIHsKKysJCQlnZXRfYWxsID0gMTsKKysJCQlnZXRfdHJlZSA9IDE7CisrCQkJZ2V0X2hpc3RvcnkgPSAxOworKwkJfSBlbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ3YnKSB7CisrCQkJZ2V0X3ZlcmJvc2VseSA9IDE7CisrCQl9CisrCQlhcmcrKzsKKysJfQorKwlpZiAoYXJnYyA8IGFyZyArIDIpIHsKKysJCXVzYWdlKCJnaXQtc3NoLXB1bGwgWy1jXSBbLXRdIFstYV0gWy12XSBbLWRdIFstLXJlY292ZXJdIGNvbW1pdC1pZCB1cmwiKTsKKysJCXJldHVybiAxOworKwl9CisrCWNvbW1pdF9pZCA9IGFyZ3ZbYXJnXTsKKysJdXJsID0gYXJndlthcmcgKyAxXTsKKysKKysJaWYgKHNldHVwX2Nvbm5lY3Rpb24oJmZkX2luLCAmZmRfb3V0LCAiZ2l0LXNzaC1wdXNoIiwgdXJsLCBhcmcsIGFyZ3YgKyAxKSkKKysJCXJldHVybiAxOworKworKwlpZiAoZ2V0X3ZlcnNpb24oKSkKKysJCXJldHVybiAxOworKworKwlpZiAocHVsbChjb21taXRfaWQpKQorKwkJcmV0dXJuIDE7CisrCisrCXJldHVybiAwOworK30KK2RpZmYgYS9zc2gtcHVzaC5jIGIvc3NoLXB1c2guYworLS0tIC9kZXYvbnVsbAorKysrIGIvc3NoLXB1c2guYworQEAgLTAsMCArMSwxMDQgQEAKKysjaW5jbHVkZSAiY2FjaGUuaCIKKysjaW5jbHVkZSAicnNoLmgiCisrI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKysjaW5jbHVkZSA8ZXJybm8uaD4KKysKKyt1bnNpZ25lZCBjaGFyIGxvY2FsX3ZlcnNpb24gPSAxOworK3Vuc2lnbmVkIGNoYXIgcmVtb3RlX3ZlcnNpb24gPSAwOworKworK2ludCBzZXJ2ZV9vYmplY3QoaW50IGZkX2luLCBpbnQgZmRfb3V0KSB7CisrCXNzaXplX3Qgc2l6ZTsKKysJaW50IHBvc24gPSAwOworKwljaGFyIHNoYTFbMjBdOworKwl1bnNpZ25lZCBsb25nIG9ianNpemU7CisrCXZvaWQgKmJ1ZjsKKysJc2lnbmVkIGNoYXIgcmVtb3RlOworKwlkbyB7CisrCQlzaXplID0gcmVhZChmZF9pbiwgc2hhMSArIHBvc24sIDIwIC0gcG9zbik7CisrCQlpZiAoc2l6ZSA8IDApIHsKKysJCQlwZXJyb3IoImdpdC1zc2gtcHVzaDogcmVhZCAiKTsKKysJCQlyZXR1cm4gLTE7CisrCQl9CisrCQlpZiAoIXNpemUpCisrCQkJcmV0dXJuIC0xOworKwkJcG9zbiArPSBzaXplOworKwl9IHdoaWxlIChwb3NuIDwgMjApOworKwkKKysJLyogZnByaW50ZihzdGRlcnIsICJTZXJ2aW5nICVzXG4iLCBzaGExX3RvX2hleChzaGExKSk7ICovCisrCXJlbW90ZSA9IDA7CisrCQorKwlidWYgPSBtYXBfc2hhMV9maWxlKHNoYTEsICZvYmpzaXplKTsKKysJCisrCWlmICghYnVmKSB7CisrCQlmcHJpbnRmKHN0ZGVyciwgImdpdC1zc2gtcHVzaDogY291bGQgbm90IGZpbmQgJXNcbiIsIAorKwkJCXNoYTFfdG9faGV4KHNoYTEpKTsKKysJCXJlbW90ZSA9IC0xOworKwl9CisrCQorKwl3cml0ZShmZF9vdXQsICZyZW1vdGUsIDEpOworKwkKKysJaWYgKHJlbW90ZSA8IDApCisrCQlyZXR1cm4gMDsKKysJCisrCXBvc24gPSAwOworKwlkbyB7CisrCQlzaXplID0gd3JpdGUoZmRfb3V0LCBidWYgKyBwb3NuLCBvYmpzaXplIC0gcG9zbik7CisrCQlpZiAoc2l6ZSA8PSAwKSB7CisrCQkJaWYgKCFzaXplKSB7CisrCQkJCWZwcmludGYoc3RkZXJyLCAiZ2l0LXNzaC1wdXNoOiB3cml0ZSBjbG9zZWQiKTsKKysJCQl9IGVsc2UgeworKwkJCQlwZXJyb3IoImdpdC1zc2gtcHVzaDogd3JpdGUgIik7CisrCQkJfQorKwkJCXJldHVybiAtMTsKKysJCX0KKysJCXBvc24gKz0gc2l6ZTsKKysJfSB3aGlsZSAocG9zbiA8IG9ianNpemUpOworKwlyZXR1cm4gMDsKKyt9CisrCisraW50IHNlcnZlX3ZlcnNpb24oaW50IGZkX2luLCBpbnQgZmRfb3V0KQorK3sKKysJaWYgKHJlYWQoZmRfaW4sICZyZW1vdGVfdmVyc2lvbiwgMSkgPCAxKQorKwkJcmV0dXJuIC0xOworKwl3cml0ZShmZF9vdXQsICZsb2NhbF92ZXJzaW9uLCAxKTsKKysJcmV0dXJuIDA7CisrfQorKworK3ZvaWQgc2VydmljZShpbnQgZmRfaW4sIGludCBmZF9vdXQpIHsKKysJY2hhciB0eXBlOworKwlpbnQgcmV0dmFsOworKwlkbyB7CisrCQlyZXR2YWwgPSByZWFkKGZkX2luLCAmdHlwZSwgMSk7CisrCQlpZiAocmV0dmFsIDwgMSkgeworKwkJCWlmIChyZXR2YWwgPCAwKQorKwkJCQlwZXJyb3IoImdpdC1zc2gtcHVzaDogcmVhZCAiKTsKKysJCQlyZXR1cm47CisrCQl9CisrCQlpZiAodHlwZSA9PSAndicgJiYgc2VydmVfdmVyc2lvbihmZF9pbiwgZmRfb3V0KSkKKysJCQlyZXR1cm47CisrCQlpZiAodHlwZSA9PSAnbycgJiYgc2VydmVfb2JqZWN0KGZkX2luLCBmZF9vdXQpKQorKwkJCXJldHVybjsKKysJfSB3aGlsZSAoMSk7CisrfQorKworK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyt7CisrCWludCBhcmcgPSAxOworKyAgICAgICAgY2hhciAqY29tbWl0X2lkOworKyAgICAgICAgY2hhciAqdXJsOworKwlpbnQgZmRfaW4sIGZkX291dDsKKysJd2hpbGUgKGFyZyA8IGFyZ2MgJiYgYXJndlthcmddWzBdID09ICctJykgeworKyAgICAgICAgICAgICAgICBhcmcrKzsKKysgICAgICAgIH0KKysgICAgICAgIGlmIChhcmdjIDwgYXJnICsgMikgeworKwkJdXNhZ2UoImdpdC1zc2gtcHVzaCBbLWNdIFstdF0gWy1hXSBjb21taXQtaWQgdXJsIik7CisrICAgICAgICAgICAgICAgIHJldHVybiAxOworKyAgICAgICAgfQorKwljb21taXRfaWQgPSBhcmd2W2FyZ107CisrCXVybCA9IGFyZ3ZbYXJnICsgMV07CisrCWlmIChzZXR1cF9jb25uZWN0aW9uKCZmZF9pbiwgJmZkX291dCwgImdpdC1zc2gtcHVsbCIsIHVybCwgYXJnLCBhcmd2ICsgMSkpCisrCQlyZXR1cm4gMTsKKysKKysJc2VydmljZShmZF9pbiwgZmRfb3V0KTsKKysJcmV0dXJuIDA7CisrfQpkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTYuZXhwZWN0IGIvdC90NDEwMC90LWFwcGx5LTYuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMzQzZDQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAwL3QtYXBwbHktNi5leHBlY3QKQEAgLTAsMCArMSw1IEBACisgTWFrZWZpbGUgICAgICAgICB8ICAgIDIgKy0KKyBnaXQtZmV0Y2gtc2NyaXB0IHwgICA0MSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworIGdpdC1wdWxsLXNjcmlwdCAgfCAgIDM0ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAzIGZpbGVzIGNoYW5nZWQsIDQzIGluc2VydGlvbnMoKyksIDM0IGRlbGV0aW9ucygtKQorIGNyZWF0ZSBnaXQtZmV0Y2gtc2NyaXB0CmRpZmYgLS1naXQgYS90L3Q0MTAwL3QtYXBwbHktNi5wYXRjaCBiL3QvdDQxMDAvdC1hcHBseS02LnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MjcyOWEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAwL3QtYXBwbHktNi5wYXRjaApAQCAtMCwwICsxLDEwMSBAQAorZGlmZiBhL01ha2VmaWxlIGIvTWFrZWZpbGUKKy0tLSBhL01ha2VmaWxlCisrKysgYi9NYWtlZmlsZQorQEAgLTIwLDcgKzIwLDcgQEAgSU5TVEFMTD1pbnN0YWxsCisgCisgU0NSSVBUUz1naXQtYXBwbHktcGF0Y2gtc2NyaXB0IGdpdC1tZXJnZS1vbmUtZmlsZS1zY3JpcHQgZ2l0LXBydW5lLXNjcmlwdCBcCisgCWdpdC1wdWxsLXNjcmlwdCBnaXQtdGFnLXNjcmlwdCBnaXQtcmVzb2x2ZS1zY3JpcHQgZ2l0LXdoYXRjaGFuZ2VkIFwKKy0JZ2l0LWRlbHRhZnktc2NyaXB0CisrCWdpdC1kZWx0YWZ5LXNjcmlwdCBnaXQtZmV0Y2gtc2NyaXB0CisgCisgUFJPRz0gICBnaXQtdXBkYXRlLWluZGV4IGdpdC1kaWZmLWZpbGVzIGdpdC1pbml0LWRiIGdpdC13cml0ZS10cmVlIFwKKyAJZ2l0LXJlYWQtdHJlZSBnaXQtY29tbWl0LXRyZWUgZ2l0LWNhdC1maWxlIGdpdC1mc2NrLWNhY2hlIFwKK2RpZmYgYS9naXQtZmV0Y2gtc2NyaXB0IGIvZ2l0LWZldGNoLXNjcmlwdAorLS0tIC9kZXYvbnVsbAorKysrIGIvZ2l0LWZldGNoLXNjcmlwdAorQEAgLTAsMCArMSw0MSBAQAorKyMhL2Jpbi9zaAorKyMKKyttZXJnZV9yZXBvPSQxCisrbWVyZ2VfbmFtZT0kezI6LUhFQUR9CisrCisrOiAke0dJVF9ESVI9LmdpdH0KKys6ICR7R0lUX09CSkVDVF9ESVJFQ1RPUlk9IiR7U0hBMV9GSUxFX0RJUkVDVE9SWS0iJEdJVF9ESVIvb2JqZWN0cyJ9In0KKysKKytkb3dubG9hZF9vbmUgKCkgeworKwkjIHJlbW90ZV9wYXRoPSIkMSIgbG9jYWxfZmlsZT0iJDIiCisrCWNhc2UgIiQxIiBpbgorKwlodHRwOi8vKikKKysJCXdnZXQgLXEgLU8gIiQyIiAiJDEiIDs7CisrCS8qKQorKwkJdGVzdCAtZiAiJDEiICYmIGNhdCA+IiQyIiAiJDEiIDs7CisrCSopCisrCQlyc3luYyAtTCAiJDEiICIkMiIgOzsKKysJZXNhYworK30KKysKKytkb3dubG9hZF9vYmplY3RzICgpIHsKKysJIyByZW1vdGVfcmVwbz0iJDEiIGhlYWRfc2hhMT0iJDIiCisrCWNhc2UgIiQxIiBpbgorKwlodHRwOi8vKikKKysJCWdpdC1odHRwLXB1bGwgLWEgIiQyIiAiJDEvIgorKwkJOzsKKysJLyopCisrCQlnaXQtbG9jYWwtcHVsbCAtbCAtYSAiJDIiICIkMS8iCisrCQk7OworKwkqKQorKwkJcnN5bmMgLWF2eiAtLWlnbm9yZS1leGlzdGluZyBcCisrCQkJIiQxL29iamVjdHMvLiIgIiRHSVRfT0JKRUNUX0RJUkVDVE9SWSIvLgorKwkJOzsKKysJZXNhYworK30KKysKKytlY2hvICJHZXR0aW5nIHJlbW90ZSAkbWVyZ2VfbmFtZSIKKytkb3dubG9hZF9vbmUgIiRtZXJnZV9yZXBvLyRtZXJnZV9uYW1lIiAiJEdJVF9ESVIiL01FUkdFX0hFQUQKKysKKytlY2hvICJHZXR0aW5nIG9iamVjdCBkYXRhYmFzZSIKKytkb3dubG9hZF9vYmplY3RzICIkbWVyZ2VfcmVwbyIgIiQoY2F0ICIkR0lUX0RJUiIvTUVSR0VfSEVBRCkiCitkaWZmIGEvZ2l0LXB1bGwtc2NyaXB0IGIvZ2l0LXB1bGwtc2NyaXB0CistLS0gYS9naXQtcHVsbC1zY3JpcHQKKysrKyBiL2dpdC1wdWxsLXNjcmlwdAorQEAgLTYsMzkgKzYsNyBAQCBtZXJnZV9uYW1lPSR7MjotSEVBRH0KKyA6ICR7R0lUX0RJUj0uZ2l0fQorIDogJHtHSVRfT0JKRUNUX0RJUkVDVE9SWT0iJHtTSEExX0ZJTEVfRElSRUNUT1JZLSIkR0lUX0RJUi9vYmplY3RzIn0ifQorIAorLWRvd25sb2FkX29uZSAoKSB7CistCSMgcmVtb3RlX3BhdGg9IiQxIiBsb2NhbF9maWxlPSIkMiIKKy0JY2FzZSAiJDEiIGluCistCWh0dHA6Ly8qKQorLQkJd2dldCAtcSAtTyAiJDIiICIkMSIgOzsKKy0JLyopCistCQl0ZXN0IC1mICIkMSIgJiYgY2F0ID4iJDIiICIkMSIgOzsKKy0JKikKKy0JCXJzeW5jIC1MICIkMSIgIiQyIiA7OworLQllc2FjCistfQorLQorLWRvd25sb2FkX29iamVjdHMgKCkgeworLQkjIHJlbW90ZV9yZXBvPSIkMSIgaGVhZF9zaGExPSIkMiIKKy0JY2FzZSAiJDEiIGluCistCWh0dHA6Ly8qKQorLQkJZ2l0LWh0dHAtcHVsbCAtYSAiJDIiICIkMS8iCistCQk7OworLQkvKikKKy0JCWdpdC1sb2NhbC1wdWxsIC1sIC1hICIkMiIgIiQxLyIKKy0JCTs7CistCSopCistCQlyc3luYyAtYXZ6IC0taWdub3JlLWV4aXN0aW5nIFwKKy0JCQkiJDEvb2JqZWN0cy8uIiAiJEdJVF9PQkpFQ1RfRElSRUNUT1JZIi8uCistCQk7OworLQllc2FjCistfQorLQorLWVjaG8gIkdldHRpbmcgcmVtb3RlICRtZXJnZV9uYW1lIgorLWRvd25sb2FkX29uZSAiJG1lcmdlX3JlcG8vJG1lcmdlX25hbWUiICIkR0lUX0RJUiIvTUVSR0VfSEVBRAorLQorLWVjaG8gIkdldHRpbmcgb2JqZWN0IGRhdGFiYXNlIgorLWRvd25sb2FkX29iamVjdHMgIiRtZXJnZV9yZXBvIiAiJChjYXQgIiRHSVRfRElSIi9NRVJHRV9IRUFEKSIKKytnaXQtZmV0Y2gtc2NyaXB0ICIkbWVyZ2VfcmVwbyIgIiRtZXJnZV9uYW1lIgorIAorIGdpdC1yZXNvbHZlLXNjcmlwdCBcCisgCSIkKGNhdCAiJEdJVF9ESVIiL0hFQUQpIiBcCmRpZmYgLS1naXQgYS90L3Q0MTAwL3QtYXBwbHktNy5leHBlY3QgYi90L3Q0MTAwL3QtYXBwbHktNy5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4MzE2NAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDAvdC1hcHBseS03LmV4cGVjdApAQCAtMCwwICsxLDYgQEAKKyBEb2N1bWVudGF0aW9uL2dpdC1scy10cmVlLnR4dCB8ICAgMjAgKy0KKyBscy10cmVlLmMgICAgICAgICAgICAgICAgICAgICB8ICAzMzMgKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0KKyB0L3QzMTAwLWxzLXRyZWUtcmVzdHJpY3Quc2ggICB8ICAgIDMgCisgdHJlZS5jICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyIAorIHRyZWUuaCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMSAKKyA1IGZpbGVzIGNoYW5nZWQsIDE5OSBpbnNlcnRpb25zKCspLCAxNjAgZGVsZXRpb25zKC0pCmRpZmYgLS1naXQgYS90L3Q0MTAwL3QtYXBwbHktNy5wYXRjaCBiL3QvdDQxMDAvdC1hcHBseS03LnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YzY1ODkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAwL3QtYXBwbHktNy5wYXRjaApAQCAtMCwwICsxLDQ5NCBAQAorZGlmZiBhL0RvY3VtZW50YXRpb24vZ2l0LWxzLXRyZWUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbHMtdHJlZS50eHQKKy0tLSBhL0RvY3VtZW50YXRpb24vZ2l0LWxzLXRyZWUudHh0CisrKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1scy10cmVlLnR4dAorQEAgLTQsMjMgKzQsMjYgQEAgdjAuMSwgTWF5IDIwMDUKKyAKKyBOQU1FCisgLS0tLQorLWdpdC1scy10cmVlIC0gRGlzcGxheXMgYSB0cmVlIG9iamVjdCBpbiBodW1hbiByZWFkYWJsZSBmb3JtCisrZ2l0LWxzLXRyZWUgLSBMaXN0cyB0aGUgY29udGVudHMgb2YgYSB0cmVlIG9iamVjdC4KKyAKKyAKKyBTWU5PUFNJUworIC0tLS0tLS0tCistJ2dpdC1scy10cmVlJyBbLXJdIFstel0gPHRyZWUtaXNoPiBbcGF0aHMuLi5dCisrJ2dpdC1scy10cmVlJyBbLWRdIFstcl0gWy16XSA8dHJlZS1pc2g+IFtwYXRocy4uLl0KKyAKKyBERVNDUklQVElPTgorIC0tLS0tLS0tLS0tCistQ29udmVydHMgdGhlIHRyZWUgb2JqZWN0IHRvIGEgaHVtYW4gcmVhZGFibGUgKGFuZCBzY3JpcHQgcHJvY2Vzc2FibGUpCistZm9ybS4KKytMaXN0cyB0aGUgY29udGVudHMgb2YgYSB0cmVlIG9iamVjdCwgbGlrZSB3aGF0ICIvYmluL2xzIC1hIiBkb2VzCisraW4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCisgCisgT1BUSU9OUworIC0tLS0tLS0KKyA8dHJlZS1pc2g+OjoKKyAJSWQgb2YgYSB0cmVlLgorIAorKy1kOjoKKysJc2hvdyBvbmx5IHRoZSBuYW1lZCB0cmVlIGVudHJ5IGl0c2VsZiwgbm90IGl0cyBjaGlsZHJlbgorKworIC1yOjoKKyAJcmVjdXJzZSBpbnRvIHN1Yi10cmVlcworIAorQEAgLTI4LDE4ICszMSwxOSBAQCBPUFRJT05TCisgCVwwIGxpbmUgdGVybWluYXRpb24gb24gb3V0cHV0CisgCisgcGF0aHM6OgorLQlPcHRpb25hbGx5LCByZXN0cmljdCB0aGUgb3V0cHV0IG9mIGdpdC1scy10cmVlIHRvIHNwZWNpZmljCistCXBhdGhzLiBEaXJlY3RvcmllcyB3aWxsIG9ubHkgbGlzdCB0aGVpciB0cmVlIGJsb2IgaWRzLgorLQlJbXBsaWVzIC1yLgorKwlXaGVuIHBhdGhzIGFyZSBnaXZlbiwgc2hvd3MgdGhlbS4gIE90aGVyd2lzZSBpbXBsaWNpdGx5CisrCXVzZXMgdGhlIHJvb3QgbGV2ZWwgb2YgdGhlIHRyZWUgYXMgdGhlIHNvbGUgcGF0aCBhcmd1bWVudC4KKysKKyAKKyBPdXRwdXQgRm9ybWF0CisgLS0tLS0tLS0tLS0tLQorLSAgICAgICAgPG1vZGU+XHQJPHR5cGU+XHQJPG9iamVjdD5cdAk8ZmlsZT4KKysgICAgICAgIDxtb2RlPiBTUCA8dHlwZT4gU1AgPG9iamVjdD4gVEFCIDxmaWxlPgorIAorIAorIEF1dGhvcgorIC0tLS0tLQorIFdyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorK0NvbXBsZXRlbHkgcmV3cml0dGVuIGZyb20gc2NyYXRjaCBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisgCisgRG9jdW1lbnRhdGlvbgorIC0tLS0tLS0tLS0tLS0tCitkaWZmIGEvbHMtdHJlZS5jIGIvbHMtdHJlZS5jCistLS0gYS9scy10cmVlLmMKKysrKyBiL2xzLXRyZWUuYworQEAgLTQsMTg4ICs0LDIxNyBAQAorICAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAgKi8KKyAjaW5jbHVkZSAiY2FjaGUuaCIKKysjaW5jbHVkZSAiYmxvYi5oIgorKyNpbmNsdWRlICJ0cmVlLmgiCisgCisgc3RhdGljIGludCBsaW5lX3Rlcm1pbmF0aW9uID0gJ1xuJzsKKy1zdGF0aWMgaW50IHJlY3Vyc2l2ZSA9IDA7CisrI2RlZmluZSBMU19SRUNVUlNJVkUgMQorKyNkZWZpbmUgTFNfVFJFRV9PTkxZIDIKKytzdGF0aWMgaW50IGxzX29wdGlvbnMgPSAwOworIAorLXN0cnVjdCBwYXRoX3ByZWZpeCB7CistCXN0cnVjdCBwYXRoX3ByZWZpeCAqcHJldjsKKy0JY29uc3QgY2hhciAqbmFtZTsKKy19OworLQorLSNkZWZpbmUgREVCVUcoZm10LCAuLi4pCQorLQorLXN0YXRpYyBpbnQgc3RyaW5nX3BhdGhfcHJlZml4KGNoYXIgKmJ1ZmYsIHNpemVfdCBibGVuLCBzdHJ1Y3QgcGF0aF9wcmVmaXggKnByZWZpeCkKKy17CistCWludCBsZW4gPSAwOworLQlpZiAocHJlZml4KSB7CistCQlpZiAocHJlZml4LT5wcmV2KSB7CistCQkJbGVuID0gc3RyaW5nX3BhdGhfcHJlZml4KGJ1ZmYsYmxlbixwcmVmaXgtPnByZXYpOworLQkJCWJ1ZmYgKz0gbGVuOworLQkJCWJsZW4gLT0gbGVuOworLQkJCWlmIChibGVuID4gMCkgeworLQkJCQkqYnVmZiA9ICcvJzsKKy0JCQkJbGVuKys7CistCQkJCWJ1ZmYrKzsKKy0JCQkJYmxlbi0tOworLQkJCX0KKy0JCX0KKy0JCXN0cm5jcHkoYnVmZixwcmVmaXgtPm5hbWUsYmxlbik7CistCQlyZXR1cm4gbGVuICsgc3RybGVuKHByZWZpeC0+bmFtZSk7CistCX0KKytzdGF0aWMgc3RydWN0IHRyZWVfZW50cnlfbGlzdCByb290X2VudHJ5OworIAorLQlyZXR1cm4gMDsKKytzdGF0aWMgdm9pZCBwcmVwYXJlX3Jvb3QodW5zaWduZWQgY2hhciAqc2hhMSkKKyt7CisrCXVuc2lnbmVkIGNoYXIgcnNoYVsyMF07CisrCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKysJdm9pZCAqYnVmOworKwlzdHJ1Y3QgdHJlZSAqcm9vdF90cmVlOworKworKwlidWYgPSByZWFkX29iamVjdF93aXRoX3JlZmVyZW5jZShzaGExLCAidHJlZSIsICZzaXplLCByc2hhKTsKKysJZnJlZShidWYpOworKwlpZiAoIWJ1ZikKKysJCWRpZSgiQ291bGQgbm90IHJlYWQgJXMiLCBzaGExX3RvX2hleChzaGExKSk7CisrCisrCXJvb3RfdHJlZSA9IGxvb2t1cF90cmVlKHJzaGEpOworKwlpZiAoIXJvb3RfdHJlZSkKKysJCWRpZSgiQ291bGQgbm90IHJlYWQgJXMiLCBzaGExX3RvX2hleChzaGExKSk7CisrCisrCS8qIFByZXBhcmUgYSBmYWtlIGVudHJ5ICovCisrCXJvb3RfZW50cnkuZGlyZWN0b3J5ID0gMTsKKysJcm9vdF9lbnRyeS5leGVjdXRhYmxlID0gcm9vdF9lbnRyeS5zeW1saW5rID0gMDsKKysJcm9vdF9lbnRyeS5tb2RlID0gU19JRkRJUjsKKysJcm9vdF9lbnRyeS5uYW1lID0gIiI7CisrCXJvb3RfZW50cnkuaXRlbS50cmVlID0gcm9vdF90cmVlOworKwlyb290X2VudHJ5LnBhcmVudCA9IE5VTEw7CisgfQorIAorLXN0YXRpYyB2b2lkIHByaW50X3BhdGhfcHJlZml4KHN0cnVjdCBwYXRoX3ByZWZpeCAqcHJlZml4KQorK3N0YXRpYyBpbnQgcHJlcGFyZV9jaGlsZHJlbihzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICplbGVtKQorIHsKKy0JaWYgKHByZWZpeCkgeworLQkJaWYgKHByZWZpeC0+cHJldikgeworLQkJCXByaW50X3BhdGhfcHJlZml4KHByZWZpeC0+cHJldik7CistCQkJcHV0Y2hhcignLycpOworLQkJfQorLQkJZnB1dHMocHJlZml4LT5uYW1lLCBzdGRvdXQpOworKwlpZiAoIWVsZW0tPmRpcmVjdG9yeSkKKysJCXJldHVybiAtMTsKKysJaWYgKCFlbGVtLT5pdGVtLnRyZWUtPm9iamVjdC5wYXJzZWQpIHsKKysJCXN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmU7CisrCQlpZiAocGFyc2VfdHJlZShlbGVtLT5pdGVtLnRyZWUpKQorKwkJCXJldHVybiAtMTsKKysJCS8qIFNldCB1cCB0aGUgcGFyZW50IGxpbmsgKi8KKysJCWZvciAoZSA9IGVsZW0tPml0ZW0udHJlZS0+ZW50cmllczsgZTsgZSA9IGUtPm5leHQpCisrCQkJZS0+cGFyZW50ID0gZWxlbTsKKyAJfQorKwlyZXR1cm4gMDsKKyB9CisgCistLyoKKy0gKiByZXR1cm46CistICogCS0xIGlmIHByZWZpeCBpcyAqbm90KiBhIHN1YnNldCBvZiBwYXRoCistICogCSAwIGlmIHByZWZpeCA9PSBwYXRoCistICogCSAxIGlmIHByZWZpeCBpcyBhIHN1YnNldCBvZiBwYXRoCistICovCistc3RhdGljIGludCBwYXRoY21wKGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBwYXRoX3ByZWZpeCAqcHJlZml4KQorLXsKKy0JY2hhciBidWZmW1BBVEhfTUFYXTsKKy0JaW50IGxlbixzbGVuOworK3N0YXRpYyBzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICpmaW5kX2VudHJ5XzAoc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZWxlbSwKKysJCQkJCSAgICBjb25zdCBjaGFyICpwYXRoLAorKwkJCQkJICAgIGNvbnN0IGNoYXIgKnBhdGhfZW5kKQorK3sKKysJY29uc3QgY2hhciAqZXA7CisrCWludCBsZW47CisrCisrCXdoaWxlIChwYXRoIDwgcGF0aF9lbmQpIHsKKysJCWlmIChwcmVwYXJlX2NoaWxkcmVuKGVsZW0pKQorKwkJCXJldHVybiBOVUxMOworIAorLQlpZiAocHJlZml4ID09IE5VTEwpCistCQlyZXR1cm4gMTsKKysJCS8qIEluIGVsZW0tPnRyZWUtPmVudHJpZXMsIGZpbmQgdGhlIG9uZSB0aGF0IGhhcyBuYW1lCisrCQkgKiB0aGF0IG1hdGNoZXMgd2hhdCBpcyBiZXR3ZWVuIHBhdGggYW5kIGVwLgorKwkJICovCisrCQllbGVtID0gZWxlbS0+aXRlbS50cmVlLT5lbnRyaWVzOworIAorLQlsZW4gPSBzdHJpbmdfcGF0aF9wcmVmaXgoYnVmZiwgc2l6ZW9mIGJ1ZmYsIHByZWZpeCk7CistCXNsZW4gPSBzdHJsZW4ocGF0aCk7CisrCQllcCA9IHN0cmNocihwYXRoLCAnLycpOworKwkJaWYgKCFlcCB8fCBwYXRoX2VuZCA8PSBlcCkKKysJCQllcCA9IHBhdGhfZW5kOworKwkJbGVuID0gZXAgLSBwYXRoOworKworKwkJd2hpbGUgKGVsZW0pIHsKKysJCQlpZiAoKHN0cmxlbihlbGVtLT5uYW1lKSA9PSBsZW4pICYmCisrCQkJICAgICFzdHJuY21wKGVsZW0tPm5hbWUsIHBhdGgsIGxlbikpCisrCQkJCWJyZWFrOworKwkJCWVsZW0gPSBlbGVtLT5uZXh0OworKwkJfQorKwkJaWYgKHBhdGhfZW5kIDw9IGVwIHx8ICFlbGVtKQorKwkJCXJldHVybiBlbGVtOworKwkJd2hpbGUgKCplcCA9PSAnLycgJiYgZXAgPCBwYXRoX2VuZCkKKysJCQllcCsrOworKwkJcGF0aCA9IGVwOworKwl9CisrCXJldHVybiBOVUxMOworK30KKyAKKy0JaWYgKHNsZW4gPCBsZW4pCistCQlyZXR1cm4gLTE7Cisrc3RhdGljIHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmZpbmRfZW50cnkoY29uc3QgY2hhciAqcGF0aCwKKysJCQkJCSAgY29uc3QgY2hhciAqcGF0aF9lbmQpCisreworKwkvKiBGaW5kIHRyZWUgZWxlbWVudCwgZGVzY2VuZGluZyBmcm9tIHJvb3QsIHRoYXQKKysJICogY29ycmVzcG9uZHMgdG8gdGhlIG5hbWVkIHBhdGgsIGxhemlseSBleHBhbmRpbmcKKysJICogdGhlIHRyZWUgaWYgcG9zc2libGUuCisrCSAqLworKwlpZiAocGF0aCA9PSBwYXRoX2VuZCkgeworKwkJLyogU3BlY2lhbC4gIFRoaXMgaXMgdGhlIHJvb3QgbGV2ZWwgKi8KKysJCXJldHVybiAmcm9vdF9lbnRyeTsKKysJfQorKwlyZXR1cm4gZmluZF9lbnRyeV8wKCZyb290X2VudHJ5LCBwYXRoLCBwYXRoX2VuZCk7CisrfQorIAorLQlpZiAoc3RybmNtcChwYXRoLGJ1ZmYsbGVuKSA9PSAwKSB7CistCQlpZiAoc2xlbiA9PSBsZW4pCistCQkJcmV0dXJuIDA7CistCQllbHNlCistCQkJcmV0dXJuIDE7Cisrc3RhdGljIHZvaWQgc2hvd19lbnRyeV9uYW1lKHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmUpCisreworKwkvKiBUaGlzIGlzIHl1Y2t5LiAgVGhlIHJvb3QgbGV2ZWwgaXMgdGhlcmUgZm9yCisrCSAqIG91ciBjb252ZW5pZW5jZSBidXQgd2UgcmVhbGx5IHdhbnQgdG8gZG8gYQorKwkgKiBmb3Jlc3QuCisrCSAqLworKwlpZiAoZS0+cGFyZW50ICYmIGUtPnBhcmVudCAhPSAmcm9vdF9lbnRyeSkgeworKwkJc2hvd19lbnRyeV9uYW1lKGUtPnBhcmVudCk7CisrCQlwdXRjaGFyKCcvJyk7CisgCX0KKysJcHJpbnRmKCIlcyIsIGUtPm5hbWUpOworK30KKyAKKy0JcmV0dXJuIC0xOworLX0JCisrc3RhdGljIGNvbnN0IGNoYXIgKmVudHJ5X3R5cGUoc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZSkKKyt7CisrCXJldHVybiAoZS0+ZGlyZWN0b3J5ID8gInRyZWUiIDogImJsb2IiKTsKKyt9CisgCistLyoKKy0gKiBtYXRjaCBtYXkgYmUgTlVMTCwgb3IgYSAqc29ydGVkKiBsaXN0IG9mIHBhdGhzCistICovCistc3RhdGljIHZvaWQgbGlzdF9yZWN1cnNpdmUodm9pZCAqYnVmZmVyLAorLQkJCSAgIGNvbnN0IGNoYXIgKnR5cGUsCistCQkJICAgdW5zaWduZWQgbG9uZyBzaXplLAorLQkJCSAgIHN0cnVjdCBwYXRoX3ByZWZpeCAqcHJlZml4LAorLQkJCSAgIGNoYXIgKiptYXRjaCwgaW50IG1hdGNoZXMpCisteworLQlzdHJ1Y3QgcGF0aF9wcmVmaXggdGhpc19wcmVmaXg7CistCXRoaXNfcHJlZml4LnByZXYgPSBwcmVmaXg7CistCistCWlmIChzdHJjbXAodHlwZSwgInRyZWUiKSkKKy0JCWRpZSgiZXhwZWN0ZWQgYSAndHJlZScgbm9kZSIpOworLQorLQlpZiAobWF0Y2hlcykKKy0JCXJlY3Vyc2l2ZSA9IDE7CistCistCXdoaWxlIChzaXplKSB7CistCQlpbnQgbmFtZWxlbiA9IHN0cmxlbihidWZmZXIpKzE7CistCQl2b2lkICplbHRidWYgPSBOVUxMOworLQkJY2hhciBlbHR0eXBlWzIwXTsKKy0JCXVuc2lnbmVkIGxvbmcgZWx0c2l6ZTsKKy0JCXVuc2lnbmVkIGNoYXIgKnNoYTEgPSBidWZmZXIgKyBuYW1lbGVuOworLQkJY2hhciAqcGF0aCA9IHN0cmNocihidWZmZXIsICcgJykgKyAxOworLQkJdW5zaWduZWQgaW50IG1vZGU7CistCQljb25zdCBjaGFyICptYXRjaGVkID0gTlVMTDsKKy0JCWludCBtdHlwZSA9IC0xOworLQkJaW50IG1pbmRleDsKKy0KKy0JCWlmIChzaXplIDwgbmFtZWxlbiArIDIwIHx8IHNzY2FuZihidWZmZXIsICIlbyIsICZtb2RlKSAhPSAxKQorLQkJCWRpZSgiY29ycnVwdCAndHJlZScgZmlsZSIpOworLQkJYnVmZmVyID0gc2hhMSArIDIwOworLQkJc2l6ZSAtPSBuYW1lbGVuICsgMjA7CistCistCQl0aGlzX3ByZWZpeC5uYW1lID0gcGF0aDsKKy0JCWZvciAoIG1pbmRleCA9IDA7IG1pbmRleCA8IG1hdGNoZXM7IG1pbmRleCsrKSB7CistCQkJbXR5cGUgPSBwYXRoY21wKG1hdGNoW21pbmRleF0sJnRoaXNfcHJlZml4KTsKKy0JCQlpZiAobXR5cGUgPj0gMCkgeworLQkJCQltYXRjaGVkID0gbWF0Y2hbbWluZGV4XTsKKy0JCQkJYnJlYWs7CistCQkJfQorLQkJfQorK3N0YXRpYyBjb25zdCBjaGFyICplbnRyeV9oZXgoc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZSkKKyt7CisrCXJldHVybiBzaGExX3RvX2hleChlLT5kaXJlY3RvcnkKKysJCQkgICA/IGUtPml0ZW0udHJlZS0+b2JqZWN0LnNoYTEKKysJCQkgICA6IGUtPml0ZW0uYmxvYi0+b2JqZWN0LnNoYTEpOworK30KKyAKKy0JCS8qCistCQkgKiBJZiB3ZSdyZSBub3QgbWF0Y2hpbmcsIG9yIGlmIHRoaXMgaXMgYW4gZXhhY3QgbWF0Y2gsCistCQkgKiBwcmludCBvdXQgdGhlIGluZm8KKy0JCSAqLworLQkJaWYgKCFtYXRjaGVzIHx8IChtYXRjaGVkICE9IE5VTEwgJiYgbXR5cGUgPT0gMCkpIHsKKy0JCQlwcmludGYoIiUwNm8gJXMgJXNcdCIsIG1vZGUsCistCQkJICAgICAgIFNfSVNESVIobW9kZSkgPyAidHJlZSIgOiAiYmxvYiIsCistCQkJICAgICAgIHNoYTFfdG9faGV4KHNoYTEpKTsKKy0JCQlwcmludF9wYXRoX3ByZWZpeCgmdGhpc19wcmVmaXgpOworLQkJCXB1dGNoYXIobGluZV90ZXJtaW5hdGlvbik7CistCQl9CisrLyogZm9yd2FyZCBkZWNsYXJhdGlvbiBmb3IgbXV0dWFsbHkgcmVjdXJzaXZlIHJvdXRpbmVzICovCisrc3RhdGljIGludCBzaG93X2VudHJ5KHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKiwgaW50KTsKKyAKKy0JCWlmICghIHJlY3Vyc2l2ZSB8fCAhIFNfSVNESVIobW9kZSkpCistCQkJY29udGludWU7Cisrc3RhdGljIGludCBzaG93X2NoaWxkcmVuKHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmUsIGludCBsZXZlbCkKKyt7CisrCWlmIChwcmVwYXJlX2NoaWxkcmVuKGUpKQorKwkJZGllKCJpbnRlcm5hbCBlcnJvcjogbHMtdHJlZSBzaG93X2NoaWxkcmVuIGNhbGxlZCB3aXRoIG5vbiB0cmVlIik7CisrCWUgPSBlLT5pdGVtLnRyZWUtPmVudHJpZXM7CisrCXdoaWxlIChlKSB7CisrCQlzaG93X2VudHJ5KGUsIGxldmVsKTsKKysJCWUgPSBlLT5uZXh0OworKwl9CisrCXJldHVybiAwOworK30KKyAKKy0JCWlmIChtYXRjaGVzICYmICEgbWF0Y2hlZCkKKy0JCQljb250aW51ZTsKKytzdGF0aWMgaW50IHNob3dfZW50cnkoc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZSwgaW50IGxldmVsKQorK3sKKysJaW50IGVyciA9IDA7IAorIAorLQkJaWYgKCEgKGVsdGJ1ZiA9IHJlYWRfc2hhMV9maWxlKHNoYTEsIGVsdHR5cGUsICZlbHRzaXplKSkgKSB7CistCQkJZXJyb3IoImNhbm5vdCByZWFkICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworLQkJCWNvbnRpbnVlOworLQkJfQorKwlpZiAoZSAhPSAmcm9vdF9lbnRyeSkgeworKwkJcHJpbnRmKCIlMDZvICVzICVzCSIsIGUtPm1vZGUsIGVudHJ5X3R5cGUoZSksCisrCQkgICAgICAgZW50cnlfaGV4KGUpKTsKKysJCXNob3dfZW50cnlfbmFtZShlKTsKKysJCXB1dGNoYXIobGluZV90ZXJtaW5hdGlvbik7CisrCX0KKyAKKy0JCS8qIElmIHRoaXMgaXMgYW4gZXhhY3QgZGlyZWN0b3J5IG1hdGNoLCB3ZSBtYXkgaGF2ZQorLQkJICogZGlyZWN0b3J5IGZpbGVzIGZvbGxvd2luZyB0aGlzIHBhdGguIE1hdGNoIG9uIHRoZW0uCistCQkgKiBPdGhlcndpc2UsIHdlJ3JlIGF0IGEgcGFjaCBzdWJjb21wb25lbnQsIGFuZCB3ZSBuZWVkCistCQkgKiB0byB0cnkgdG8gbWF0Y2ggYWdhaW4uCisrCWlmIChlLT5kaXJlY3RvcnkpIHsKKysJCS8qIElmIHRoaXMgaXMgYSBkaXJlY3RvcnksIHdlIGhhdmUgdGhlIGZvbGxvd2luZyBjYXNlczoKKysJCSAqICgxKSBUaGlzIGlzIHRoZSB0b3AtbGV2ZWwgcmVxdWVzdCAoZXhwbGljaXQgcGF0aCBmcm9tIHRoZQorKwkJICogICAgIGNvbW1hbmQgbGluZSwgb3IgInJvb3QiIGlmIHRoZXJlIGlzIG5vIGNvbW1hbmQgbGluZSkuCisrCQkgKiAgYS4gV2l0aG91dCBhbnkgZmxhZy4gIFdlIHNob3cgZGlyZWN0IGNoaWxkcmVuLiAgV2UgZG8gbm90IAorKwkJICogICAgIHJlY3Vyc2UgaW50byB0aGVtLgorKwkJICogIGIuIFdpdGggLXIuICBXZSBkbyByZWN1cnNlIGludG8gY2hpbGRyZW4uCisrCQkgKiAgYy4gV2l0aCAtZC4gIFdlIGRvIG5vdCByZWN1cnNlIGludG8gY2hpbGRyZW4uCisrCQkgKiAoMikgV2UgY2FtZSBoZXJlIGJlY2F1c2Ugb3VyIGNhbGxlciBpcyBlaXRoZXIgKDEtYSkgb3IKKysJCSAqICAgICAoMS1iKS4KKysJCSAqICBhLiBXaXRob3V0IGFueSBmbGFnLiAgV2UgZG8gbm90IHNob3cgb3VyIGNoaWxkcmVuICh3aGljaAorKwkJICogICAgIGFyZSBncmFuZGNoaWxkcmVuIGZvciB0aGUgb3JpZ2luYWwgcmVxdWVzdCkuCisrCQkgKiAgYi4gV2l0aCAtci4gIFdlIGNvbnRpbnVlIHRvIHJlY3Vyc2UgaW50byBvdXIgY2hpbGRyZW4uCisrCQkgKiAgYy4gV2l0aCAtZC4gIFdlIHNob3VsZCBub3QgaGF2ZSBjb21lIGhlcmUgdG8gYmVnaW4gd2l0aC4KKyAJCSAqLworLQkJaWYgKG10eXBlID09IDApCistCQkJbWluZGV4Kys7CistCistCQlsaXN0X3JlY3Vyc2l2ZShlbHRidWYsIGVsdHR5cGUsIGVsdHNpemUsICZ0aGlzX3ByZWZpeCwgJm1hdGNoW21pbmRleF0sIG1hdGNoZXMtbWluZGV4KTsKKy0JCWZyZWUoZWx0YnVmKTsKKysJCWlmIChsZXZlbCA9PSAwICYmICEobHNfb3B0aW9ucyAmIExTX1RSRUVfT05MWSkpCisrCQkJLyogY2FzZSAoMSktYSBhbmQgKDEpLWIgKi8KKysJCQllcnIgPSBlcnIgfCBzaG93X2NoaWxkcmVuKGUsIGxldmVsKzEpOworKwkJZWxzZSBpZiAobGV2ZWwgJiYgbHNfb3B0aW9ucyAmIExTX1JFQ1VSU0lWRSkKKysJCQkvKiBjYXNlICgyKS1iICovCisrCQkJZXJyID0gZXJyIHwgc2hvd19jaGlsZHJlbihlLCBsZXZlbCsxKTsKKyAJfQorKwlyZXR1cm4gZXJyOworIH0KKyAKKy1zdGF0aWMgaW50IHFjbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKKytzdGF0aWMgaW50IGxpc3Rfb25lKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKnBhdGhfZW5kKQorIHsKKy0JcmV0dXJuIHN0cmNtcCgqKGNoYXIgKiopYSwgKihjaGFyICoqKWIpOworKwlpbnQgZXJyID0gMDsKKysJc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZSA9IGZpbmRfZW50cnkocGF0aCwgcGF0aF9lbmQpOworKwlpZiAoIWUpIHsKKysJCS8qIHRyYWRpdGlvbmFsbHkgbHMtdHJlZSBkb2VzIG5vdCBjb21wbGFpbiBhYm91dAorKwkJICogbWlzc2luZyBwYXRoLiAgV2UgbWF5IGNoYW5nZSB0aGlzIGxhdGVyIHRvIG1hdGNoCisrCQkgKiB3aGF0ICIvYmluL2xzIC1hIiBkb2VzLCB3aGljaCBpcyB0byBjb21wbGFpbi4KKysJCSAqLworKwkJcmV0dXJuIGVycjsKKysJfQorKwllcnIgPSBlcnIgfCBzaG93X2VudHJ5KGUsIDApOworKwlyZXR1cm4gZXJyOworIH0KKyAKKy1zdGF0aWMgaW50IGxpc3QodW5zaWduZWQgY2hhciAqc2hhMSxjaGFyICoqcGF0aCkKKytzdGF0aWMgaW50IGxpc3QoY2hhciAqKnBhdGgpCisgeworLQl2b2lkICpidWZmZXI7CistCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKy0JaW50IG5wYXRoczsKKy0KKy0JZm9yIChucGF0aHMgPSAwOyBwYXRoW25wYXRoc10gIT0gTlVMTDsgbnBhdGhzKyspCistCQk7CistCistCXFzb3J0KHBhdGgsbnBhdGhzLHNpemVvZihjaGFyICopLHFjbXApOworLQorLQlidWZmZXIgPSByZWFkX29iamVjdF93aXRoX3JlZmVyZW5jZShzaGExLCAidHJlZSIsICZzaXplLCBOVUxMKTsKKy0JaWYgKCFidWZmZXIpCistCQlkaWUoInVuYWJsZSB0byByZWFkIHNoYTEgZmlsZSIpOworLQlsaXN0X3JlY3Vyc2l2ZShidWZmZXIsICJ0cmVlIiwgc2l6ZSwgTlVMTCwgcGF0aCwgbnBhdGhzKTsKKy0JZnJlZShidWZmZXIpOworLQlyZXR1cm4gMDsKKysJaW50IGk7CisrCWludCBlcnIgPSAwOworKwlmb3IgKGkgPSAwOyBwYXRoW2ldOyBpKyspIHsKKysJCWludCBsZW4gPSBzdHJsZW4ocGF0aFtpXSk7CisrCQl3aGlsZSAoMCA8PSBsZW4gJiYgcGF0aFtpXVtsZW5dID09ICcvJykKKysJCQlsZW4tLTsKKysJCWVyciA9IGVyciB8IGxpc3Rfb25lKHBhdGhbaV0sIHBhdGhbaV0gKyBsZW4pOworKwl9CisrCXJldHVybiBlcnI7CisgfQorIAorLXN0YXRpYyBjb25zdCBjaGFyICpsc190cmVlX3VzYWdlID0gImdpdC1scy10cmVlIFstcl0gWy16XSA8a2V5PiBbcGF0aHMuLi5dIjsKKytzdGF0aWMgY29uc3QgY2hhciAqbHNfdHJlZV91c2FnZSA9CisrCSJnaXQtbHMtdHJlZSBbLWRdIFstcl0gWy16XSA8dHJlZS1pc2g+IFtwYXRoLi4uXSI7CisgCisgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorIHsKKysJc3RhdGljIGNoYXIgKnBhdGgwW10gPSB7ICIiLCBOVUxMIH07CisrCWNoYXIgKipwYXRoOworIAl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworIAorIAl3aGlsZSAoMSA8IGFyZ2MgJiYgYXJndlsxXVswXSA9PSAnLScpIHsKK0BAIC0xOTQsNyArMjIzLDEwIEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyAJCQlsaW5lX3Rlcm1pbmF0aW9uID0gMDsKKyAJCQlicmVhazsKKyAJCWNhc2UgJ3InOgorLQkJCXJlY3Vyc2l2ZSA9IDE7CisrCQkJbHNfb3B0aW9ucyB8PSBMU19SRUNVUlNJVkU7CisrCQkJYnJlYWs7CisrCQljYXNlICdkJzoKKysJCQlsc19vcHRpb25zIHw9IExTX1RSRUVfT05MWTsKKyAJCQlicmVhazsKKyAJCWRlZmF1bHQ6CisgCQkJdXNhZ2UobHNfdHJlZV91c2FnZSk7CitAQCAtMjA2LDcgKzIzOCwxMCBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisgCQl1c2FnZShsc190cmVlX3VzYWdlKTsKKyAJaWYgKGdldF9zaGExKGFyZ3ZbMV0sIHNoYTEpIDwgMCkKKyAJCXVzYWdlKGxzX3RyZWVfdXNhZ2UpOworLQlpZiAobGlzdChzaGExLCAmYXJndlsyXSkgPCAwKQorKworKwlwYXRoID0gKGFyZ2MgPT0gMikgPyBwYXRoMCA6IChhcmd2ICsgMik7CisrCXByZXBhcmVfcm9vdChzaGExKTsKKysJaWYgKGxpc3QocGF0aCkgPCAwKQorIAkJZGllKCJsaXN0IGZhaWxlZCIpOworIAlyZXR1cm4gMDsKKyB9CitkaWZmIGEvdC90MzEwMC1scy10cmVlLXJlc3RyaWN0LnNoIGIvdC90MzEwMC1scy10cmVlLXJlc3RyaWN0LnNoCistLS0gYS90L3QzMTAwLWxzLXRyZWUtcmVzdHJpY3Quc2gKKysrKyBiL3QvdDMxMDAtbHMtdHJlZS1yZXN0cmljdC5zaAorQEAgLTc0LDggKzc0LDggQEAgdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgICdscy10cmVlIGZpbHRlcmVkJyBcCisgICAgICdnaXQtbHMtdHJlZSAkdHJlZSBwYXRoMSBwYXRoMCA+Y3VycmVudCAmJgorICAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKy0xMDA2NDQgYmxvYiBYCXBhdGgwCisgMTIwMDAwIGJsb2IgWAlwYXRoMQorKzEwMDY0NCBibG9iIFgJcGF0aDAKKyBFT0YKKyAgICAgIHRlc3Rfb3V0cHV0JworIAorQEAgLTg1LDcgKzg1LDYgQEAgdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorIDA0MDAwMCB0cmVlIFgJcGF0aDIKKyAwNDAwMDAgdHJlZSBYCXBhdGgyL2JhegorLTEwMDY0NCBibG9iIFgJcGF0aDIvYmF6L2IKKyAxMjAwMDAgYmxvYiBYCXBhdGgyL2JhemJvCisgMTAwNjQ0IGJsb2IgWAlwYXRoMi9mb28KKyBFT0YKK2RpZmYgYS90cmVlLmMgYi90cmVlLmMKKy0tLSBhL3RyZWUuYworKysrIGIvdHJlZS5jCitAQCAtMTMzLDcgKzEzMyw3IEBAIGludCBwYXJzZV90cmVlX2J1ZmZlcihzdHJ1Y3QgdHJlZSAqaXRlbSwKKyAJCX0KKyAJCWlmIChvYmopCisgCQkJYWRkX3JlZigmaXRlbS0+b2JqZWN0LCBvYmopOworLQorKwkJZW50cnktPnBhcmVudCA9IE5VTEw7IC8qIG5lZWRzIHRvIGJlIGZpbGxlZCBieSB0aGUgdXNlciAqLworIAkJKmxpc3RfcCA9IGVudHJ5OworIAkJbGlzdF9wID0gJmVudHJ5LT5uZXh0OworIAl9CitkaWZmIGEvdHJlZS5oIGIvdHJlZS5oCistLS0gYS90cmVlLmgKKysrKyBiL3RyZWUuaAorQEAgLTE2LDYgKzE2LDcgQEAgc3RydWN0IHRyZWVfZW50cnlfbGlzdCB7CisgCQlzdHJ1Y3QgdHJlZSAqdHJlZTsKKyAJCXN0cnVjdCBibG9iICpibG9iOworIAl9IGl0ZW07CisrCXN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKnBhcmVudDsKKyB9OworIAorIHN0cnVjdCB0cmVlIHsKZGlmZiAtLWdpdCBhL3QvdDQxMDEtYXBwbHktbm9ubC5zaCBiL3QvdDQxMDEtYXBwbHktbm9ubC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYThhYmNmCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMS1hcHBseS1ub25sLnNoCkBAIC0wLDAgKzEsMzAgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IGFwcGx5IHNob3VsZCBoYW5kbGUgZmlsZXMgd2l0aCBpbmNvbXBsZXRlIGxpbmVzLgorCisnCisuIC4vdGVzdC1saWIuc2gKKworIyBzZXR1cAorCisoZWNobyBhOyBlY2hvIGIpID5mcm90ei4wCisoZWNobyBhOyBlY2hvIGI7IGVjaG8gYykgPmZyb3R6LjEKKyhlY2hvIGE7IGVjaG8gYiB8IHRyIC1kICdcMDEyJykgPmZyb3R6LjIKKyhlY2hvIGE7IGVjaG8gYzsgZWNobyBiIHwgdHIgLWQgJ1wwMTInKSA+ZnJvdHouMworCitmb3IgaSBpbiAwIDEgMiAzCitkbworICBmb3IgaiBpbiAwIDEgMiAzCisgIGRvCisgICAgdGVzdCAkaSAtZXEgJGogJiYgY29udGludWUKKyAgICBjYXQgZnJvdHouJGkgPmZyb3R6CisgICAgdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgICAgICJhcHBseSBkaWZmIGJldHdlZW4gJGkgYW5kICRqIiBcCisJImdpdCBhcHBseSA8Li4vdDQxMDEvZGlmZi4kaS0kaiAmJiBkaWZmIGZyb3R6LiRqIGZyb3R6IgorICBkb25lCitkb25lCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDEwMS9kaWZmLjAtMSBiL3QvdDQxMDEvZGlmZi4wLTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxMGE4OAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDEvZGlmZi4wLTEKQEAgLTAsMCArMSw2IEBACistLS0gYS9mcm90egorKysrIGIvZnJvdHoKK0BAIC0xLDIgKzEsMyBAQAorIGEKKyBiCisrYwpkaWZmIC0tZ2l0IGEvdC90NDEwMS9kaWZmLjAtMiBiL3QvdDQxMDEvZGlmZi4wLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY0NjBhMgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDEvZGlmZi4wLTIKQEAgLTAsMCArMSw3IEBACistLS0gYS9mcm90egorKysrIGIvZnJvdHoKK0BAIC0xLDIgKzEsMiBAQAorIGEKKy1iCisrYgorXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90L3Q0MTAxL2RpZmYuMC0zIGIvdC90NDEwMS9kaWZmLjAtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjgxYzQzCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMS9kaWZmLjAtMwpAQCAtMCwwICsxLDggQEAKKy0tLSBhL2Zyb3R6CisrKysgYi9mcm90egorQEAgLTEsMiArMSwzIEBACisgYQorLWIKKytjCisrYgorXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90L3Q0MTAxL2RpZmYuMS0wIGIvdC90NDEwMS9kaWZmLjEtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGEyZTkyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMS9kaWZmLjEtMApAQCAtMCwwICsxLDYgQEAKKy0tLSBhL2Zyb3R6CisrKysgYi9mcm90egorQEAgLTEsMyArMSwyIEBACisgYQorIGIKKy1jCmRpZmYgLS1naXQgYS90L3Q0MTAxL2RpZmYuMS0yIGIvdC90NDEwMS9kaWZmLjEtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTQ0MGE1Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMS9kaWZmLjEtMgpAQCAtMCwwICsxLDggQEAKKy0tLSBhL2Zyb3R6CisrKysgYi9mcm90egorQEAgLTEsMyArMSwyIEBACisgYQorLWIKKy1jCisrYgorXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90L3Q0MTAxL2RpZmYuMS0zIGIvdC90NDEwMS9kaWZmLjEtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWFmZjk3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMS9kaWZmLjEtMwpAQCAtMCwwICsxLDggQEAKKy0tLSBhL2Zyb3R6CisrKysgYi9mcm90egorQEAgLTEsMyArMSwzIEBACisgYQorLWIKKyBjCisrYgorXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90L3Q0MTAxL2RpZmYuMi0wIGIvdC90NDEwMS9kaWZmLjItMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmU3MWVlCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMS9kaWZmLjItMApAQCAtMCwwICsxLDcgQEAKKy0tLSBhL2Zyb3R6CisrKysgYi9mcm90egorQEAgLTEsMiArMSwyIEBACisgYQorLWIKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorK2IKZGlmZiAtLWdpdCBhL3QvdDQxMDEvZGlmZi4yLTEgYi90L3Q0MTAxL2RpZmYuMi0xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NmQ5ZmQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAxL2RpZmYuMi0xCkBAIC0wLDAgKzEsOCBAQAorLS0tIGEvZnJvdHoKKysrKyBiL2Zyb3R6CitAQCAtMSwyICsxLDMgQEAKKyBhCistYgorXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisrYgorK2MKZGlmZiAtLWdpdCBhL3QvdDQxMDEvZGlmZi4yLTMgYi90L3Q0MTAxL2RpZmYuMi0zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MzNjODMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAxL2RpZmYuMi0zCkBAIC0wLDAgKzEsNyBAQAorLS0tIGEvZnJvdHoKKysrKyBiL2Zyb3R6CitAQCAtMSwyICsxLDMgQEAKKyBhCisrYworIGIKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdC90NDEwMS9kaWZmLjMtMCBiL3QvdDQxMDEvZGlmZi4zLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBiMWE0MQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDEvZGlmZi4zLTAKQEAgLTAsMCArMSw4IEBACistLS0gYS9mcm90egorKysrIGIvZnJvdHoKK0BAIC0xLDMgKzEsMiBAQAorIGEKKy1jCistYgorXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisrYgpkaWZmIC0tZ2l0IGEvdC90NDEwMS9kaWZmLjMtMSBiL3QvdDQxMDEvZGlmZi4zLTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc5OWM2MAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDEvZGlmZi4zLTEKQEAgLTAsMCArMSw4IEBACistLS0gYS9mcm90egorKysrIGIvZnJvdHoKK0BAIC0xLDMgKzEsMyBAQAorIGEKKytiCisgYworLWIKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdC90NDEwMS9kaWZmLjMtMiBiL3QvdDQxMDEvZGlmZi4zLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhkMWJhNgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDEvZGlmZi4zLTIKQEAgLTAsMCArMSw3IEBACistLS0gYS9mcm90egorKysrIGIvZnJvdHoKK0BAIC0xLDMgKzEsMiBAQAorIGEKKy1jCisgYgorXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90L3Q0MTAyLWFwcGx5LXJlbmFtZS5zaCBiL3QvdDQxMDItYXBwbHktcmVuYW1lLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ0MmFiZmYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAyLWFwcGx5LXJlbmFtZS5zaApAQCAtMCwwICsxLDYyIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBhcHBseSBoYW5kbGluZyBjb3B5L3JlbmFtZSBwYXRjaC4KKworJworLiAuL3Rlc3QtbGliLnNoCisKKyMgc2V0dXAKKworY2F0ID50ZXN0LXBhdGNoIDw8XEVPRgorZGlmZiAtLWdpdCBhL2ZvbyBiL2Jhcgorc2ltaWxhcml0eSBpbmRleCA0NyUKK3JlbmFtZSBmcm9tIGZvbworcmVuYW1lIHRvIGJhcgorLS0tIGEvZm9vCisrKysgYi9iYXIKK0BAIC0xICsxIEBACistVGhpcyBpcyBmb28KKytUaGlzIGlzIGJhcgorRU9GCisKK2VjaG8gJ1RoaXMgaXMgZm9vJyA+Zm9vCitjaG1vZCAreCBmb28KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCBcCisgICAgJ2dpdCB1cGRhdGUtaW5kZXggLS1hZGQgZm9vJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIGFwcGx5IFwKKyAgICAnZ2l0IGFwcGx5IC0taW5kZXggLS1zdGF0IC0tc3VtbWFyeSAtLWFwcGx5IHRlc3QtcGF0Y2gnCisKK2lmIFsgIiQoZ2l0IGNvbmZpZyAtLWdldCBjb3JlLmZpbGVtb2RlKSIgPSBmYWxzZSBdCit0aGVuCisJc2F5ICdmaWxlbW9kZSBkaXNhYmxlZCBvbiB0aGUgZmlsZXN5c3RlbScKK2Vsc2UKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzIHZhbGlkYXRlIFwKKwkgICAgJ3Rlc3QgLWYgYmFyICYmIGxzIC1sIGJhciB8IGdyZXAgIl4tLi54Li4uLi4uIicKK2ZpCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IHJldmVyc2UnIFwKKyAgICAnZ2l0IGFwcGx5IC1SIC0taW5kZXggLS1zdGF0IC0tc3VtbWFyeSAtLWFwcGx5IHRlc3QtcGF0Y2ggJiYKKyAgICAgdGVzdCAiJChjYXQgZm9vKSIgPSAiVGhpcyBpcyBmb28iJworCitjYXQgPnRlc3QtcGF0Y2ggPDxcRU9GCitkaWZmIC0tZ2l0IGEvZm9vIGIvYmFyCitzaW1pbGFyaXR5IGluZGV4IDQ3JQorY29weSBmcm9tIGZvbworY29weSB0byBiYXIKKy0tLSBhL2ZvbworKysrIGIvYmFyCitAQCAtMSArMSBAQAorLVRoaXMgaXMgZm9vCisrVGhpcyBpcyBiYXIKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBjb3B5JyBcCisgICAgJ2dpdCBhcHBseSAtLWluZGV4IC0tc3RhdCAtLXN1bW1hcnkgLS1hcHBseSB0ZXN0LXBhdGNoICYmCisgICAgIHRlc3QgIiQoY2F0IGJhcikiID0gIlRoaXMgaXMgYmFyIiAtYSAiJChjYXQgZm9vKSIgPSAiVGhpcyBpcyBmb28iJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQxMDMtYXBwbHktYmluYXJ5LnNoIGIvdC90NDEwMy1hcHBseS1iaW5hcnkuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWI1ODIzMwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDMtYXBwbHktYmluYXJ5LnNoCkBAIC0wLDAgKzEsMTE5IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBhcHBseSBoYW5kbGluZyBiaW5hcnkgcGF0Y2hlcworCisnCisuIC4vdGVzdC1saWIuc2gKKworIyBzZXR1cAorCitjYXQgPmZpbGUxIDw8RU9GCitBIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4KK0EgdGlueSBsaXR0bGUgcGVuZ3VpbiBydW5zIGFyb3VuZCBpbiBjaXJjbGVzLgorVGhlcmUgaXMgYSBmbGFnIHdpdGggTGludXggd3JpdHRlbiBvbiBpdC4KK0Egc2xvdyBibGFjay1hbmQtd2hpdGUgcGFuZGEganVzdCBzaXRzIHRoZXJlLAorbXVuY2hpbmcgb24gaGlzIGJhbWJvby4KK0VPRgorY2F0IGZpbGUxID5maWxlMgorY2F0IGZpbGUxID5maWxlNAorCitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIGZpbGUxIGZpbGUyIGZpbGU0CitnaXQtY29tbWl0IC1tICdJbml0aWFsIFZlcnNpb24nIDI+L2Rldi9udWxsCisKK2dpdC1jaGVja291dCAtYiBiaW5hcnkKK3BlcmwgLXBlICd5L3gvXDAwMC8nIDxmaWxlMSA+ZmlsZTMKK2NhdCBmaWxlMyA+ZmlsZTQKK2dpdCBhZGQgZmlsZTIKK3BlcmwgLXBlICd5L1wwMDAvdi8nIDxmaWxlMyA+ZmlsZTEKK3JtIC1mIGZpbGUyCitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIGZpbGUxIGZpbGUyIGZpbGUzIGZpbGU0CitnaXQtY29tbWl0IC1tICdTZWNvbmQgVmVyc2lvbicKKworZ2l0IGRpZmYtdHJlZSAtcCBtYXN0ZXIgYmluYXJ5ID5CLmRpZmYKK2dpdCBkaWZmLXRyZWUgLXAgLUMgbWFzdGVyIGJpbmFyeSA+Qy5kaWZmCisKK2dpdCBkaWZmLXRyZWUgLXAgLS1iaW5hcnkgbWFzdGVyIGJpbmFyeSA+QkYuZGlmZgorZ2l0IGRpZmYtdHJlZSAtcCAtLWJpbmFyeSAtQyBtYXN0ZXIgYmluYXJ5ID5DRi5kaWZmCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N0YXQgYmluYXJ5IGRpZmYgLS0gc2hvdWxkIG5vdCBmYWlsLicgXAorCSdnaXQtY2hlY2tvdXQgbWFzdGVyCisJIGdpdCBhcHBseSAtLXN0YXQgLS1zdW1tYXJ5IEIuZGlmZicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc3RhdCBiaW5hcnkgZGlmZiAoY29weSkgLS0gc2hvdWxkIG5vdCBmYWlsLicgXAorCSdnaXQtY2hlY2tvdXQgbWFzdGVyCisJIGdpdCBhcHBseSAtLXN0YXQgLS1zdW1tYXJ5IEMuZGlmZicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgYmluYXJ5IGRpZmYgLS0gc2hvdWxkIGZhaWwuJyBcCisJJ2dpdC1jaGVja291dCBtYXN0ZXIgJiYKKwkgISBnaXQgYXBwbHkgLS1jaGVjayBCLmRpZmYnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIGJpbmFyeSBkaWZmIChjb3B5KSAtLSBzaG91bGQgZmFpbC4nIFwKKwknZ2l0LWNoZWNrb3V0IG1hc3RlciAmJgorCSAhIGdpdCBhcHBseSAtLWNoZWNrIEMuZGlmZicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NoZWNrIGluY29tcGxldGUgYmluYXJ5IGRpZmYgd2l0aCByZXBsYWNlbWVudCAtLSBzaG91bGQgZmFpbC4nICcKKwlnaXQtY2hlY2tvdXQgbWFzdGVyICYmCisJISBnaXQgYXBwbHkgLS1jaGVjayAtLWFsbG93LWJpbmFyeS1yZXBsYWNlbWVudCBCLmRpZmYKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoZWNrIGluY29tcGxldGUgYmluYXJ5IGRpZmYgd2l0aCByZXBsYWNlbWVudCAoY29weSkgLS0gc2hvdWxkIGZhaWwuJyAnCisJIGdpdC1jaGVja291dCBtYXN0ZXIgJiYKKwkgISBnaXQgYXBwbHkgLS1jaGVjayAtLWFsbG93LWJpbmFyeS1yZXBsYWNlbWVudCBDLmRpZmYKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgYmluYXJ5IGRpZmYgd2l0aCByZXBsYWNlbWVudC4nIFwKKwknZ2l0LWNoZWNrb3V0IG1hc3RlcgorCSBnaXQgYXBwbHkgLS1jaGVjayAtLWFsbG93LWJpbmFyeS1yZXBsYWNlbWVudCBCRi5kaWZmJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBiaW5hcnkgZGlmZiB3aXRoIHJlcGxhY2VtZW50IChjb3B5KS4nIFwKKwknZ2l0LWNoZWNrb3V0IG1hc3RlcgorCSBnaXQgYXBwbHkgLS1jaGVjayAtLWFsbG93LWJpbmFyeS1yZXBsYWNlbWVudCBDRi5kaWZmJworCisjIE5vdyB3ZSBzdGFydCBhcHBseWluZyB0aGVtLgorCitkb19yZXNldCAoKSB7CisJcm0gLWYgZmlsZT8gJiYKKwlnaXQtcmVzZXQgLS1oYXJkICYmCisJZ2l0LWNoZWNrb3V0IC1mIG1hc3RlcgorfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBiaW5hcnkgZGlmZiAtLSBzaG91bGQgZmFpbC4nIFwKKwknZG9fcmVzZXQgJiYKKwkgISBnaXQgYXBwbHkgQi5kaWZmJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBiaW5hcnkgZGlmZiAtLSBzaG91bGQgZmFpbC4nIFwKKwknZG9fcmVzZXQgJiYKKwkgISBnaXQgYXBwbHkgLS1pbmRleCBCLmRpZmYnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IGJpbmFyeSBkaWZmIChjb3B5KSAtLSBzaG91bGQgZmFpbC4nIFwKKwknZG9fcmVzZXQgJiYKKwkgISBnaXQgYXBwbHkgQy5kaWZmJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBiaW5hcnkgZGlmZiAoY29weSkgLS0gc2hvdWxkIGZhaWwuJyBcCisJJ2RvX3Jlc2V0ICYmCisJICEgZ2l0IGFwcGx5IC0taW5kZXggQy5kaWZmJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBiaW5hcnkgZGlmZiB3aXRob3V0IHJlcGxhY2VtZW50LicgXAorCSdkb19yZXNldCAmJgorCSBnaXQgYXBwbHkgQkYuZGlmZicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgYmluYXJ5IGRpZmYgd2l0aG91dCByZXBsYWNlbWVudCAoY29weSkuJyBcCisJJ2RvX3Jlc2V0ICYmCisJIGdpdCBhcHBseSBDRi5kaWZmJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBiaW5hcnkgZGlmZi4nIFwKKwknZG9fcmVzZXQgJiYKKwkgZ2l0IGFwcGx5IC0tYWxsb3ctYmluYXJ5LXJlcGxhY2VtZW50IC0taW5kZXggQkYuZGlmZiAmJgorCSB0ZXN0IC16ICIkKGdpdCBkaWZmIC0tbmFtZS1zdGF0dXMgYmluYXJ5KSInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IGJpbmFyeSBkaWZmIChjb3B5KS4nIFwKKwknZG9fcmVzZXQgJiYKKwkgZ2l0IGFwcGx5IC0tYWxsb3ctYmluYXJ5LXJlcGxhY2VtZW50IC0taW5kZXggQ0YuZGlmZiAmJgorCSB0ZXN0IC16ICIkKGdpdCBkaWZmIC0tbmFtZS1zdGF0dXMgYmluYXJ5KSInCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDEwNC1hcHBseS1ib3VuZGFyeS5zaCBiL3QvdDQxMDQtYXBwbHktYm91bmRhcnkuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDM5NDNhYgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDQtYXBwbHktYm91bmRhcnkuc2gKQEAgLTAsMCArMSwxMjggQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IGFwcGx5IGJvdW5kYXJ5IHRlc3RzCisKKycKKy4gLi90ZXN0LWxpYi5zaAorCitMPSJjIGQgZSBmIGcgaCBpIGogayBsIG0gbiBvIHAgcSByIHMgdCB1IHYgdyB4IgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKwlmb3IgaSBpbiBiICciJEwiJyB5CisJZG8KKwkJZWNobyAkaQorCWRvbmUgPnZpY3RpbSAmJgorCWNhdCB2aWN0aW0gPm9yaWdpbmFsICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCB2aWN0aW0gJiYKKworCTogYWRkIHRvIHRoZSBoZWFkCisJZm9yIGkgaW4gYSBiICciJEwiJyB5CisJZG8KKwkJZWNobyAkaQorCWRvbmUgPnZpY3RpbSAmJgorCWNhdCB2aWN0aW0gPmFkZC1hLWV4cGVjdCAmJgorCWdpdCBkaWZmIHZpY3RpbSA+YWRkLWEtcGF0Y2gud2l0aCAmJgorCWdpdCBkaWZmIC0tdW5pZmllZD0wID5hZGQtYS1wYXRjaC53aXRob3V0ICYmCisKKwk6IG1vZGlmeSBhdCB0aGUgaGVhZAorCWZvciBpIGluIGEgJyIkTCInIHkKKwlkbworCQllY2hvICRpCisJZG9uZSA+dmljdGltICYmCisJY2F0IHZpY3RpbSA+bW9kLWEtZXhwZWN0ICYmCisJZ2l0IGRpZmYgdmljdGltID5tb2QtYS1wYXRjaC53aXRoICYmCisJZ2l0IGRpZmYgLS11bmlmaWVkPTAgPm1vZC1hLXBhdGNoLndpdGhvdXQgJiYKKworCTogcmVtb3ZlIGZyb20gdGhlIGhlYWQKKwlmb3IgaSBpbiAnIiRMIicgeQorCWRvCisJCWVjaG8gJGkKKwlkb25lID52aWN0aW0gJiYKKwljYXQgdmljdGltID5kZWwtYS1leHBlY3QgJiYKKwlnaXQgZGlmZiB2aWN0aW0gPmRlbC1hLXBhdGNoLndpdGgKKwlnaXQgZGlmZiAtLXVuaWZpZWQ9MCA+ZGVsLWEtcGF0Y2gud2l0aG91dCAmJgorCisJOiBhZGQgdG8gdGhlIHRhaWwKKwlmb3IgaSBpbiBiICciJEwiJyB5IHoKKwlkbworCQllY2hvICRpCisJZG9uZSA+dmljdGltICYmCisJY2F0IHZpY3RpbSA+YWRkLXotZXhwZWN0ICYmCisJZ2l0IGRpZmYgdmljdGltID5hZGQtei1wYXRjaC53aXRoICYmCisJZ2l0IGRpZmYgLS11bmlmaWVkPTAgPmFkZC16LXBhdGNoLndpdGhvdXQgJiYKKworCTogbW9kaWZ5IGF0IHRoZSB0YWlsCisJZm9yIGkgaW4gYSAnIiRMIicgeQorCWRvCisJCWVjaG8gJGkKKwlkb25lID52aWN0aW0gJiYKKwljYXQgdmljdGltID5tb2Qtei1leHBlY3QgJiYKKwlnaXQgZGlmZiB2aWN0aW0gPm1vZC16LXBhdGNoLndpdGggJiYKKwlnaXQgZGlmZiAtLXVuaWZpZWQ9MCA+bW9kLXotcGF0Y2gud2l0aG91dCAmJgorCisJOiByZW1vdmUgZnJvbSB0aGUgdGFpbAorCWZvciBpIGluIGIgJyIkTCInCisJZG8KKwkJZWNobyAkaQorCWRvbmUgPnZpY3RpbSAmJgorCWNhdCB2aWN0aW0gPmRlbC16LWV4cGVjdCAmJgorCWdpdCBkaWZmIHZpY3RpbSA+ZGVsLXotcGF0Y2gud2l0aAorCWdpdCBkaWZmIC0tdW5pZmllZD0wID5kZWwtei1wYXRjaC53aXRob3V0ICYmCisKKwk6IGRvbmUKKycKKworZm9yIHdpdGggaW4gd2l0aCB3aXRob3V0CitkbworCWNhc2UgIiR3aXRoIiBpbgorCXdpdGgpIHU9IDs7CisJd2l0aG91dCkgdT0nLS11bmlkaWZmLXplcm8gJyA7OworCWVzYWMKKwlmb3Iga2luZCBpbiBhZGQtYSBhZGQteiBtb2QtYSBtb2QteiBkZWwtYSBkZWwtegorCWRvCisJCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgImFwcGx5ICRraW5kLXBhdGNoICR3aXRoIGNvbnRleHQiICcKKwkJCWNhdCBvcmlnaW5hbCA+dmljdGltICYmCisJCQlnaXQgdXBkYXRlLWluZGV4IHZpY3RpbSAmJgorCQkJZ2l0IGFwcGx5IC0taW5kZXggJyIkdSRraW5kLXBhdGNoLiR3aXRoIicgfHwgeworCQkJCWNhdCAnIiRraW5kLXBhdGNoLiR3aXRoIicKKwkJCQkoZXhpdCAxKQorCQkJfSAmJgorCQkJZ2l0IGRpZmYgJyIka2luZCInLWV4cGVjdCB2aWN0aW0KKwkJJworCWRvbmUKK2RvbmUKKworZm9yIGtpbmQgaW4gYWRkLWEgYWRkLXogbW9kLWEgbW9kLXogZGVsLWEgZGVsLXoKK2RvCisJcm0gLWYgJGtpbmQtbmcud2l0aG91dAorCXNlZAktZSAicy9eZGlmZiAtLWdpdCAvZGlmZiAvIiBcCisJCS1lICcvXmluZGV4IC9kJyBcCisJCTwka2luZC1wYXRjaC53aXRob3V0ID4ka2luZC1uZy53aXRob3V0CisJdGVzdF9leHBlY3Rfc3VjY2VzcyAiYXBwbHkgbm9uLWdpdCAka2luZC1wYXRjaCB3aXRob3V0IGNvbnRleHQiICcKKwkJY2F0IG9yaWdpbmFsID52aWN0aW0gJiYKKwkJZ2l0IHVwZGF0ZS1pbmRleCB2aWN0aW0gJiYKKwkJZ2l0IGFwcGx5IC0tdW5pZGlmZi16ZXJvIC0taW5kZXggJyIka2luZC1uZy53aXRob3V0IicgfHwgeworCQkJY2F0ICciJGtpbmQtbmcud2l0aG91dCInCisJCQkoZXhpdCAxKQorCQl9ICYmCisJCWdpdCBkaWZmICciJGtpbmQiJy1leHBlY3QgdmljdGltCisJJworZG9uZQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0d28gbGluZXMnICcKKworCT5maWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJZWNobyBhYWEgPmZpbGUgJiYKKwlnaXQgZGlmZiA+cGF0Y2ggJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwllY2hvIGJiYiA+ZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCXRlc3RfbXVzdF9mYWlsIGdpdCBhcHBseSAtLWNoZWNrIHBhdGNoCisKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MTA1LWFwcGx5LWZ1enouc2ggYi90L3Q0MTA1LWFwcGx5LWZ1enouc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzI2NmUzOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDUtYXBwbHktZnV6ei5zaApAQCAtMCwwICsxLDU3IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nYXBwbHkgd2l0aCBmdXp6IGFuZCBvZmZzZXQnCisKKy4gLi90ZXN0LWxpYi5zaAorCitkb3Rlc3QgKCkgeworCW5hbWU9IiQxIiAmJiBzaGlmdCAmJgorCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgIiRuYW1lIiAiCisJCWdpdCBjaGVja291dC1pbmRleCAtZiAtcSAtdSBmaWxlICYmCisJCWdpdCBhcHBseSAkKiAmJgorCQl0ZXN0X2NtcCBleHBlY3QgZmlsZQorCSIKK30KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwlmb3IgaSBpbiAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMgorCWRvCisJCWVjaG8gJGkKKwlkb25lID5maWxlICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBmaWxlICYmCisJZm9yIGkgaW4gMSAyIDMgNCA1IDYgNyBhIGIgYyBkIGUgOCA5IDEwIDExIDEyCisJZG8KKwkJZWNobyAkaQorCWRvbmUgPmZpbGUgJiYKKwljYXQgZmlsZSA+ZXhwZWN0ICYmCisJZ2l0IGRpZmYgPk8wLmRpZmYgJiYKKworCXNlZCAtZSAicy9AQCAtNSw2ICs1LDExIEBAL0BAIC0yLDYgKzIsMTEgQEAvIiA+TzEuZGlmZiBPMC5kaWZmICYmCisJc2VkIC1lICJzL0BAIC01LDYgKzUsMTEgQEAvQEAgLTcsNiArNywxMSBAQC8iID5PMi5kaWZmIE8wLmRpZmYgJiYKKwlzZWQgLWUgInMvQEAgLTUsNiArNSwxMSBAQC9AQCAtMTksNiArMTksMTEgQEAvIiA+TzMuZGlmZiBPMC5kaWZmICYmCisKKwlzZWQgLWUgInMvXiA1LyBTLyIgPkYwLmRpZmYgTzAuZGlmZiAmJgorCXNlZCAtZSAicy9eIDUvIFMvIiA+RjEuZGlmZiBPMS5kaWZmICYmCisJc2VkIC1lICJzL14gNS8gUy8iID5GMi5kaWZmIE8yLmRpZmYgJiYKKwlzZWQgLWUgInMvXiA1LyBTLyIgPkYzLmRpZmYgTzMuZGlmZgorCisnCisKK2RvdGVzdCAndW5tb2RpZmllZCBwYXRjaCcgTzAuZGlmZgorCitkb3Rlc3QgJ21pbnVzIG9mZnNldCcgTzEuZGlmZgorCitkb3Rlc3QgJ3BsdXMgb2Zmc2V0JyBPMi5kaWZmCisKK2RvdGVzdCAnYmlnIG9mZnNldCcgTzMuZGlmZgorCitkb3Rlc3QgJ2Z1enogd2l0aCBubyBvZmZzZXQnIC1DMiBGMC5kaWZmCisKK2RvdGVzdCAnZnV6eiB3aXRoIG1pbnVzIG9mZnNldCcgLUMyIEYxLmRpZmYKKworZG90ZXN0ICdmdXp6IHdpdGggcGx1cyBvZmZzZXQnIC1DMiBGMi5kaWZmCisKK2RvdGVzdCAnZnV6eiB3aXRoIGJpZyBvZmZzZXQnIC1DMiBGMy5kaWZmCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDEwOS1hcHBseS1tdWx0aWZyYWcuc2ggYi90L3Q0MTA5LWFwcGx5LW11bHRpZnJhZy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZDQwYTIxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwOS1hcHBseS1tdWx0aWZyYWcuc2gKQEAgLTAsMCArMSwxNzYgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMgQ29weXJpZ2h0IChjKSAyMDA1IFJvYmVydCBGaXR6c2ltb25zCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBhcHBseSB0ZXN0IHBhdGNoZXMgd2l0aCBtdWx0aXBsZSBmcmFnbWVudHMuCisKKycKKy4gLi90ZXN0LWxpYi5zaAorCisjIHNldHVwCisKK2NhdCA+IHBhdGNoMS5wYXRjaCA8PFxFT0YKK2RpZmYgLS1naXQgYS9tYWluLmMgYi9tYWluLmMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CistLS0gL2Rldi9udWxsCisrKysgYi9tYWluLmMKK0BAIC0wLDAgKzEsMjMgQEAKKysjaW5jbHVkZSA8c3RkaW8uaD4KKysKKytpbnQgZnVuYyhpbnQgbnVtKTsKKyt2b2lkIHByaW50X2ludChpbnQgbnVtKTsKKysKKytpbnQgbWFpbigpIHsKKysJaW50IGk7CisrCisrCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisrCQlwcmludF9pbnQoZnVuYyhpKSk7CisrCX0KKysKKysJcmV0dXJuIDA7CisrfQorKworK2ludCBmdW5jKGludCBudW0pIHsKKysJcmV0dXJuIG51bSAqIG51bTsKKyt9CisrCisrdm9pZCBwcmludF9pbnQoaW50IG51bSkgeworKwlwcmludGYoIiVkIiwgbnVtKTsKKyt9CisrCitFT0YKK2NhdCA+IHBhdGNoMi5wYXRjaCA8PFxFT0YKK2RpZmYgLS1naXQgYS9tYWluLmMgYi9tYWluLmMKKy0tLSBhL21haW4uYworKysrIGIvbWFpbi5jCitAQCAtMSw3ICsxLDkgQEAKKysjaW5jbHVkZSA8c3RkbGliLmg+CisgI2luY2x1ZGUgPHN0ZGlvLmg+CisgCisgaW50IGZ1bmMoaW50IG51bSk7Cisgdm9pZCBwcmludF9pbnQoaW50IG51bSk7Cisrdm9pZCBwcmludF9sbigpOworIAorIGludCBtYWluKCkgeworIAlpbnQgaTsKK0BAIC0xMCw2ICsxMiw4IEBACisgCQlwcmludF9pbnQoZnVuYyhpKSk7CisgCX0KKyAKKysJcHJpbnRfbG4oKTsKKysKKyAJcmV0dXJuIDA7CisgfQorIAorQEAgLTIxLDMgKzI1LDcgQEAKKyAJcHJpbnRmKCIlZCIsIG51bSk7CisgfQorIAorK3ZvaWQgcHJpbnRfbG4oKSB7CisrCXByaW50ZigiXG4iKTsKKyt9CisrCitFT0YKK2NhdCA+IHBhdGNoMy5wYXRjaCA8PFxFT0YKK2RpZmYgLS1naXQgYS9tYWluLmMgYi9tYWluLmMKKy0tLSBhL21haW4uYworKysrIGIvbWFpbi5jCitAQCAtMSw5ICsxLDcgQEAKKy0jaW5jbHVkZSA8c3RkbGliLmg+CisgI2luY2x1ZGUgPHN0ZGlvLmg+CisgCisgaW50IGZ1bmMoaW50IG51bSk7Cisgdm9pZCBwcmludF9pbnQoaW50IG51bSk7Cistdm9pZCBwcmludF9sbigpOworIAorIGludCBtYWluKCkgeworIAlpbnQgaTsKK0BAIC0xMiw4ICsxMCw2IEBACisgCQlwcmludF9pbnQoZnVuYyhpKSk7CisgCX0KKyAKKy0JcHJpbnRfbG4oKTsKKy0KKyAJcmV0dXJuIDA7CisgfQorIAorQEAgLTI1LDcgKzIxLDMgQEAKKyAJcHJpbnRmKCIlZCIsIG51bSk7CisgfQorIAorLXZvaWQgcHJpbnRfbG4oKSB7CistCXByaW50ZigiXG4iKTsKKy19CistCitFT0YKK2NhdCA+IHBhdGNoNC5wYXRjaCA8PFxFT0YKK2RpZmYgLS1naXQgYS9tYWluLmMgYi9tYWluLmMKKy0tLSBhL21haW4uYworKysrIGIvbWFpbi5jCitAQCAtMSwxMyArMSwxNCBAQAorICNpbmNsdWRlIDxzdGRpby5oPgorIAorIGludCBmdW5jKGludCBudW0pOworLXZvaWQgcHJpbnRfaW50KGludCBudW0pOworK2ludCBmdW5jMihpbnQgbnVtKTsKKyAKKyBpbnQgbWFpbigpIHsKKyAJaW50IGk7CisgCisgCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CistCQlwcmludF9pbnQoZnVuYyhpKSk7CisrCQlwcmludGYoIiVkIiwgZnVuYyhpKSk7CisrCQlwcmludGYoIiVkIiwgZnVuYzMoaSkpOworIAl9CisgCisgCXJldHVybiAwOworQEAgLTE3LDcgKzE4LDcgQEAKKyAJcmV0dXJuIG51bSAqIG51bTsKKyB9CisgCistdm9pZCBwcmludF9pbnQoaW50IG51bSkgeworLQlwcmludGYoIiVkIiwgbnVtKTsKKytpbnQgZnVuYzIoaW50IG51bSkgeworKwlyZXR1cm4gbnVtICogbnVtICogbnVtOworIH0KKyAKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJTID0gZ2l0IGFwcGx5ICgxKSIgXAorICAgICdnaXQgYXBwbHkgcGF0Y2gxLnBhdGNoIHBhdGNoMi5wYXRjaCcKK212IG1haW4uYyBtYWluLmMuZ2l0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIlMgPSBwYXRjaCAoMSkiIFwKKyAgICAnY2F0IHBhdGNoMS5wYXRjaCBwYXRjaDIucGF0Y2ggfCBwYXRjaCAtcDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIlMgPSBjbXAgKDEpIiBcCisgICAgJ2NtcCBtYWluLmMuZ2l0IG1haW4uYycKKworcm0gLWYgbWFpbi5jIG1haW4uYy5naXQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiUyA9IGdpdCBhcHBseSAoMikiIFwKKyAgICAnZ2l0IGFwcGx5IHBhdGNoMS5wYXRjaCBwYXRjaDIucGF0Y2ggcGF0Y2gzLnBhdGNoJworbXYgbWFpbi5jIG1haW4uYy5naXQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiUyA9IHBhdGNoICgyKSIgXAorICAgICdjYXQgcGF0Y2gxLnBhdGNoIHBhdGNoMi5wYXRjaCBwYXRjaDMucGF0Y2ggfCBwYXRjaCAtcDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIlMgPSBjbXAgKDIpIiBcCisgICAgJ2NtcCBtYWluLmMuZ2l0IG1haW4uYycKKworcm0gLWYgbWFpbi5jIG1haW4uYy5naXQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiUyA9IGdpdCBhcHBseSAoMykiIFwKKyAgICAnZ2l0IGFwcGx5IHBhdGNoMS5wYXRjaCBwYXRjaDQucGF0Y2gnCittdiBtYWluLmMgbWFpbi5jLmdpdAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJTID0gcGF0Y2ggKDMpIiBcCisgICAgJ2NhdCBwYXRjaDEucGF0Y2ggcGF0Y2g0LnBhdGNoIHwgcGF0Y2ggLXAxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJTID0gY21wICgzKSIgXAorICAgICdjbXAgbWFpbi5jLmdpdCBtYWluLmMnCisKK3Rlc3RfZG9uZQorCmRpZmYgLS1naXQgYS90L3Q0MTEwLWFwcGx5LXNjYW4uc2ggYi90L3Q0MTEwLWFwcGx5LXNjYW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGI2MDY1MgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMTAtYXBwbHktc2Nhbi5zaApAQCAtMCwwICsxLDEwMCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIyBDb3B5cmlnaHQgKGMpIDIwMDUgUm9iZXJ0IEZpdHpzaW1vbnMKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IGFwcGx5IHRlc3QgZm9yIHBhdGNoZXMgd2hpY2ggcmVxdWlyZSBzY2FubmluZyBmb3J3YXJkcyBhbmQgYmFja3dhcmRzLgorCisnCisuIC4vdGVzdC1saWIuc2gKKworIyBzZXR1cAorCitjYXQgPiBwYXRjaDEucGF0Y2ggPDxcRU9GCitkaWZmIC0tZ2l0IGEvbmV3LnR4dCBiL25ldy50eHQKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CistLS0gL2Rldi9udWxsCisrKysgYi9uZXcudHh0CitAQCAtMCwwICsxLDEyIEBACisrYTEKKythMTEKKythMTExCisrYTExMTEKKytiMQorK2IxMQorK2IxMTEKKytiMTExMQorK2MxCisrYzExCisrYzExMQorK2MxMTExCitFT0YKK2NhdCA+IHBhdGNoMi5wYXRjaCA8PFxFT0YKK2RpZmYgLS1naXQgYS9uZXcudHh0IGIvbmV3LnR4dAorLS0tIGEvbmV3LnR4dAorKysrIGIvbmV3LnR4dAorQEAgLTEsNyArMSwzIEBACistYTEKKy1hMTEKKy1hMTExCistYTExMTEKKyBiMQorIGIxMQorIGIxMTEKK0VPRgorY2F0ID4gcGF0Y2gzLnBhdGNoIDw8XEVPRgorZGlmZiAtLWdpdCBhL25ldy50eHQgYi9uZXcudHh0CistLS0gYS9uZXcudHh0CisrKysgYi9uZXcudHh0CitAQCAtNiw2ICs2LDEwIEBACisgYjExCisgYjExMQorIGIxMTExCisrYjIKKytiMjIKKytiMjIyCisrYjIyMjIKKyBjMQorIGMxMQorIGMxMTEKK0VPRgorY2F0ID4gcGF0Y2g0LnBhdGNoIDw8XEVPRgorZGlmZiAtLWdpdCBhL25ldy50eHQgYi9uZXcudHh0CistLS0gYS9uZXcudHh0CisrKysgYi9uZXcudHh0CitAQCAtMSwzICsxLDcgQEAKKythMQorK2ExMQorK2ExMTEKKythMTExMQorIGIxCisgYjExCisgYjExMQorRU9GCitjYXQgPiBwYXRjaDUucGF0Y2ggPDxcRU9GCitkaWZmIC0tZ2l0IGEvbmV3LnR4dCBiL25ldy50eHQKKy0tLSBhL25ldy50eHQKKysrKyBiL25ldy50eHQKK0BAIC0xMCwzICsxMCw3IEBACisgYzExCisgYzExMQorIGMxMTExCisrYzIKKytjMjIKKytjMjIyCisrYzIyMjIKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJTID0gZ2l0IGFwcGx5IHNjYW4iIFwKKyAgICAnZ2l0IGFwcGx5IHBhdGNoMS5wYXRjaCBwYXRjaDIucGF0Y2ggcGF0Y2gzLnBhdGNoIHBhdGNoNC5wYXRjaCBwYXRjaDUucGF0Y2gnCittdiBuZXcudHh0IGFwcGx5LnR4dAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJTID0gcGF0Y2ggc2NhbiIgXAorICAgICdjYXQgcGF0Y2gxLnBhdGNoIHBhdGNoMi5wYXRjaCBwYXRjaDMucGF0Y2ggcGF0Y2g0LnBhdGNoIHBhdGNoNS5wYXRjaCB8IHBhdGNoJworbXYgbmV3LnR4dCBwYXRjaC50eHQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiUyA9IGNtcCIgXAorICAgICdjbXAgYXBwbHkudHh0IHBhdGNoLnR4dCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MTEyLWFwcGx5LXJlbmFtZXMuc2ggYi90L3Q0MTEyLWFwcGx5LXJlbmFtZXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzBhMTg1OQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMTItYXBwbHktcmVuYW1lcy5zaApAQCAtMCwwICsxLDEyNCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgYXBwbHkgc2hvdWxkIG5vdCBnZXQgY29uZnVzZWQgd2l0aCByZW5hbWUvY29weS4KKworJworCisuIC4vdGVzdC1saWIuc2gKKworIyBzZXR1cAorCitta2RpciAtcCBrbGliYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2tsaWJjCisKK2NhdCA+a2xpYmMvYXJjaC94ODZfNjQvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmggPDxcRU9GCisvKgorICogYXJjaC94ODZfNjQvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0VUSk1QX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTRVRKTVBfSAorCitzdHJ1Y3QgX19qbXBfYnVmIHsKKyAgdW5zaWduZWQgbG9uZyBfX3JieDsKKyAgdW5zaWduZWQgbG9uZyBfX3JzcDsKKyAgdW5zaWduZWQgbG9uZyBfX3JicDsKKyAgdW5zaWduZWQgbG9uZyBfX3IxMjsKKyAgdW5zaWduZWQgbG9uZyBfX3IxMzsKKyAgdW5zaWduZWQgbG9uZyBfX3IxNDsKKyAgdW5zaWduZWQgbG9uZyBfX3IxNTsKKyAgdW5zaWduZWQgbG9uZyBfX3JpcDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9fam1wX2J1ZiBqbXBfYnVmWzFdOworCisjZW5kaWYgLyogX1NFVEpNUF9IICovCitFT0YKKworY2F0ID5wYXRjaCA8PFxFT0YKK2RpZmYgLS1naXQgYS9rbGliYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaCBiL2luY2x1ZGUvYXJjaC9jcmlzL2tsaWJjL2FyY2hzZXRqbXAuaAorc2ltaWxhcml0eSBpbmRleCA3NiUKK2NvcHkgZnJvbSBrbGliYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaAorY29weSB0byBpbmNsdWRlL2FyY2gvY3Jpcy9rbGliYy9hcmNoc2V0am1wLmgKKy0tLSBhL2tsaWJjL2FyY2gveDg2XzY0L2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCisrKysgYi9pbmNsdWRlL2FyY2gvY3Jpcy9rbGliYy9hcmNoc2V0am1wLmgKK0BAIC0xLDIxICsxLDI0IEBACisgLyoKKy0gKiBhcmNoL3g4Nl82NC9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaAorKyAqIGFyY2gvY3Jpcy9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaAorICAqLworCisgI2lmbmRlZiBfS0xJQkNfQVJDSFNFVEpNUF9ICisgI2RlZmluZSBfS0xJQkNfQVJDSFNFVEpNUF9ICisKKyBzdHJ1Y3QgX19qbXBfYnVmIHsKKy0gIHVuc2lnbmVkIGxvbmcgX19yYng7CistICB1bnNpZ25lZCBsb25nIF9fcnNwOworLSAgdW5zaWduZWQgbG9uZyBfX3JicDsKKy0gIHVuc2lnbmVkIGxvbmcgX19yMTI7CistICB1bnNpZ25lZCBsb25nIF9fcjEzOworLSAgdW5zaWduZWQgbG9uZyBfX3IxNDsKKy0gIHVuc2lnbmVkIGxvbmcgX19yMTU7CistICB1bnNpZ25lZCBsb25nIF9fcmlwOworKyAgdW5zaWduZWQgbG9uZyBfX3IwOworKyAgdW5zaWduZWQgbG9uZyBfX3IxOworKyAgdW5zaWduZWQgbG9uZyBfX3IyOworKyAgdW5zaWduZWQgbG9uZyBfX3IzOworKyAgdW5zaWduZWQgbG9uZyBfX3I0OworKyAgdW5zaWduZWQgbG9uZyBfX3I1OworKyAgdW5zaWduZWQgbG9uZyBfX3I2OworKyAgdW5zaWduZWQgbG9uZyBfX3I3OworKyAgdW5zaWduZWQgbG9uZyBfX3I4OworKyAgdW5zaWduZWQgbG9uZyBfX3NwOworKyAgdW5zaWduZWQgbG9uZyBfX3NycDsKKyB9OworCisgdHlwZWRlZiBzdHJ1Y3QgX19qbXBfYnVmIGptcF9idWZbMV07CisKKy0jZW5kaWYgLyogX1NFVEpNUF9IICovCisrI2VuZGlmIC8qIF9LTElCQ19BUkNIU0VUSk1QX0ggKi8KK2RpZmYgLS1naXQgYS9rbGliYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaCBiL2luY2x1ZGUvYXJjaC9tMzJyL2tsaWJjL2FyY2hzZXRqbXAuaAorc2ltaWxhcml0eSBpbmRleCA2NiUKK3JlbmFtZSBmcm9tIGtsaWJjL2FyY2gveDg2XzY0L2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCityZW5hbWUgdG8gaW5jbHVkZS9hcmNoL20zMnIva2xpYmMvYXJjaHNldGptcC5oCistLS0gYS9rbGliYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaAorKysrIGIvaW5jbHVkZS9hcmNoL20zMnIva2xpYmMvYXJjaHNldGptcC5oCitAQCAtMSwyMSArMSwyMSBAQAorIC8qCistICogYXJjaC94ODZfNjQvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKysgKiBhcmNoL20zMnIvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKyAgKi8KKworICNpZm5kZWYgX0tMSUJDX0FSQ0hTRVRKTVBfSAorICNkZWZpbmUgX0tMSUJDX0FSQ0hTRVRKTVBfSAorCisgc3RydWN0IF9fam1wX2J1ZiB7CistICB1bnNpZ25lZCBsb25nIF9fcmJ4OworLSAgdW5zaWduZWQgbG9uZyBfX3JzcDsKKy0gIHVuc2lnbmVkIGxvbmcgX19yYnA7CisrICB1bnNpZ25lZCBsb25nIF9fcjg7CisrICB1bnNpZ25lZCBsb25nIF9fcjk7CisrICB1bnNpZ25lZCBsb25nIF9fcjEwOworKyAgdW5zaWduZWQgbG9uZyBfX3IxMTsKKyAgIHVuc2lnbmVkIGxvbmcgX19yMTI7CisgICB1bnNpZ25lZCBsb25nIF9fcjEzOworICAgdW5zaWduZWQgbG9uZyBfX3IxNDsKKyAgIHVuc2lnbmVkIGxvbmcgX19yMTU7CistICB1bnNpZ25lZCBsb25nIF9fcmlwOworIH07CisKKyB0eXBlZGVmIHN0cnVjdCBfX2ptcF9idWYgam1wX2J1ZlsxXTsKKworLSNlbmRpZiAvKiBfU0VUSk1QX0ggKi8KKysjZW5kaWYgLyogX0tMSUJDX0FSQ0hTRVRKTVBfSCAqLworRU9GCisKK2ZpbmQga2xpYmMgLXR5cGUgZiAtcHJpbnQgfCB4YXJncyBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIHJlbmFtZS9jb3B5IHBhdGNoJyAnZ2l0IGFwcGx5IC0tY2hlY2sgcGF0Y2gnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IHJlbmFtZS9jb3B5IHBhdGNoJyAnZ2l0IGFwcGx5IC0taW5kZXggcGF0Y2gnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDExMy1hcHBseS1lbmRpbmcuc2ggYi90L3Q0MTEzLWFwcGx5LWVuZGluZy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNzQxMDM5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDExMy1hcHBseS1lbmRpbmcuc2gKQEAgLTAsMCArMSw1MyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBDYXRhbGluIE1hcmluYXMKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IGFwcGx5IHRyeWluZyB0byBhZGQgYW4gZW5kaW5nIGxpbmUuCisKKycKKy4gLi90ZXN0LWxpYi5zaAorCisjIHNldHVwCisKK2NhdCA+dGVzdC1wYXRjaCA8PFxFT0YKK2RpZmYgLS1naXQgYS9maWxlIGIvZmlsZQorLS0tIGEvZmlsZQorKysrIGIvZmlsZQorQEAgLTEsMiArMSwzIEBACisgYQorIGIKKytjCitFT0YKKworZWNobyAnYScgPmZpbGUKK2VjaG8gJ2InID4+ZmlsZQorZWNobyAnYycgPj5maWxlCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgXAorICAgICdnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGZpbGUnCisKKyMgdGVzdAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBhdCB0aGUgZW5kJyBcCisgICAgJyEgZ2l0IGFwcGx5IC0taW5kZXggdGVzdC1wYXRjaCcKKworY2F0ID50ZXN0LXBhdGNoIDw8XEVPRgorZGlmZiBhL2ZpbGUgYi9maWxlCistLS0gYS9maWxlCisrKysgYi9maWxlCitAQCAtMSwyICsxLDMgQEAKKythCisgYgorIGMKK0VPRgorCitlY2hvID5maWxlICdhCitiCitjJworZ2l0IHVwZGF0ZS1pbmRleCBmaWxlCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IGF0IHRoZSBiZWdpbm5pbmcnIFwKKwknISBnaXQgYXBwbHkgLS1pbmRleCB0ZXN0LXBhdGNoJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQxMTQtYXBwbHktdHlwZWNoYW5nZS5zaCBiL3QvdDQxMTQtYXBwbHktdHlwZWNoYW5nZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NTMzNDkyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDExNC1hcHBseS10eXBlY2hhbmdlLnNoCkBAIC0wLDAgKzEsMTA1IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEVyaWMgV29uZworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgYXBwbHkgc2hvdWxkIG5vdCBnZXQgY29uZnVzZWQgd2l0aCB0eXBlIGNoYW5nZXMuCisKKycKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NldHVwIHJlcG9zaXRvcnkgYW5kIGNvbW1pdHMnICcKKwllY2hvICJoZWxsbyB3b3JsZCIgPiBmb28gJiYKKwllY2hvICJoaSBwbGFuZXQiID4gYmFyICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBmb28gYmFyICYmCisJZ2l0IGNvbW1pdCAtbSBpbml0aWFsICYmCisJZ2l0IGJyYW5jaCBpbml0aWFsICYmCisJcm0gLWYgZm9vICYmCisJbG4gLXMgYmFyIGZvbyAmJgorCWdpdCB1cGRhdGUtaW5kZXggZm9vICYmCisJZ2l0IGNvbW1pdCAtbSAiZm9vIHN5bWxpbmtlZCB0byBiYXIiICYmCisJZ2l0IGJyYW5jaCBmb28tc3ltbGlua2VkLXRvLWJhciAmJgorCXJtIC1mIGZvbyAmJgorCWVjaG8gImhvdyBmYXIgaXMgdGhlIHN1bj8iID4gZm9vICYmCisJZ2l0IHVwZGF0ZS1pbmRleCBmb28gJiYKKwlnaXQgY29tbWl0IC1tICJmb28gYmFjayB0byBmaWxlIiAmJgorCWdpdCBicmFuY2ggZm9vLWJhY2stdG8tZmlsZSAmJgorCXJtIC1mIGZvbyAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1yZW1vdmUgZm9vICYmCisJbWtkaXIgZm9vICYmCisJZWNobyAiaWYgb25seSBJIGtuZXciID4gZm9vL2JheiAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgZm9vL2JheiAmJgorCWdpdCBjb21taXQgLW0gImZvbyBiZWNvbWVzIGEgZGlyZWN0b3J5IiAmJgorCWdpdCBicmFuY2ggImZvby1iZWNvbWVzLWEtZGlyZWN0b3J5IiAmJgorCWVjaG8gImhlbGxvIHdvcmxkIiA+IGZvby9iYXogJiYKKwlnaXQgdXBkYXRlLWluZGV4IGZvby9iYXogJiYKKwlnaXQgY29tbWl0IC1tICJmb28vYmF6IGlzIHRoZSBvcmlnaW5hbCBmb28iICYmCisJZ2l0IGJyYW5jaCBmb28tYmF6LXJlbmFtZWQtZnJvbS1mb28KKwknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZpbGUgcmVuYW1lZCBmcm9tIGZvbyB0byBmb28vYmF6JyAnCisJZ2l0IGNoZWNrb3V0IC1mIGluaXRpYWwgJiYKKwlnaXQgZGlmZi10cmVlIC1NIC1wIEhFQUQgZm9vLWJhei1yZW5hbWVkLWZyb20tZm9vID4gcGF0Y2ggJiYKKwlnaXQgYXBwbHkgLS1pbmRleCA8IHBhdGNoCisJJwordGVzdF9kZWJ1ZyAnY2F0IHBhdGNoJworCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZpbGUgcmVuYW1lZCBmcm9tIGZvby9iYXogdG8gZm9vJyAnCisJZ2l0IGNoZWNrb3V0IC1mIGZvby1iYXotcmVuYW1lZC1mcm9tLWZvbyAmJgorCWdpdCBkaWZmLXRyZWUgLU0gLXAgSEVBRCBpbml0aWFsID4gcGF0Y2ggJiYKKwlnaXQgYXBwbHkgLS1pbmRleCA8IHBhdGNoCisJJwordGVzdF9kZWJ1ZyAnY2F0IHBhdGNoJworCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2RpcmVjdG9yeSBiZWNvbWVzIGZpbGUnICcKKwlnaXQgY2hlY2tvdXQgLWYgZm9vLWJlY29tZXMtYS1kaXJlY3RvcnkgJiYKKwlnaXQgZGlmZi10cmVlIC1wIEhFQUQgaW5pdGlhbCA+IHBhdGNoICYmCisJZ2l0IGFwcGx5IC0taW5kZXggPCBwYXRjaAorCScKK3Rlc3RfZGVidWcgJ2NhdCBwYXRjaCcKKworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmaWxlIGJlY29tZXMgZGlyZWN0b3J5JyAnCisJZ2l0IGNoZWNrb3V0IC1mIGluaXRpYWwgJiYKKwlnaXQgZGlmZi10cmVlIC1wIEhFQUQgZm9vLWJlY29tZXMtYS1kaXJlY3RvcnkgPiBwYXRjaCAmJgorCWdpdCBhcHBseSAtLWluZGV4IDwgcGF0Y2gKKwknCit0ZXN0X2RlYnVnICdjYXQgcGF0Y2gnCisKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmlsZSBiZWNvbWVzIHN5bWxpbmsnICcKKwlnaXQgY2hlY2tvdXQgLWYgaW5pdGlhbCAmJgorCWdpdCBkaWZmLXRyZWUgLXAgSEVBRCBmb28tc3ltbGlua2VkLXRvLWJhciA+IHBhdGNoICYmCisJZ2l0IGFwcGx5IC0taW5kZXggPCBwYXRjaAorCScKK3Rlc3RfZGVidWcgJ2NhdCBwYXRjaCcKKworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzeW1saW5rIGJlY29tZXMgZmlsZScgJworCWdpdCBjaGVja291dCAtZiBmb28tc3ltbGlua2VkLXRvLWJhciAmJgorCWdpdCBkaWZmLXRyZWUgLXAgSEVBRCBmb28tYmFjay10by1maWxlID4gcGF0Y2ggJiYKKwlnaXQgYXBwbHkgLS1pbmRleCA8IHBhdGNoCisJJwordGVzdF9kZWJ1ZyAnY2F0IHBhdGNoJworCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N5bWxpbmsgYmVjb21lcyBkaXJlY3RvcnknICcKKwlnaXQgY2hlY2tvdXQgLWYgZm9vLXN5bWxpbmtlZC10by1iYXIgJiYKKwlnaXQgZGlmZi10cmVlIC1wIEhFQUQgZm9vLWJlY29tZXMtYS1kaXJlY3RvcnkgPiBwYXRjaCAmJgorCWdpdCBhcHBseSAtLWluZGV4IDwgcGF0Y2gKKwknCit0ZXN0X2RlYnVnICdjYXQgcGF0Y2gnCisKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZGlyZWN0b3J5IGJlY29tZXMgc3ltbGluaycgJworCWdpdCBjaGVja291dCAtZiBmb28tYmVjb21lcy1hLWRpcmVjdG9yeSAmJgorCWdpdCBkaWZmLXRyZWUgLXAgSEVBRCBmb28tc3ltbGlua2VkLXRvLWJhciA+IHBhdGNoICYmCisJZ2l0IGFwcGx5IC0taW5kZXggPCBwYXRjaAorCScKK3Rlc3RfZGVidWcgJ2NhdCBwYXRjaCcKKworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQxMTUtYXBwbHktc3ltbGluay5zaCBiL3QvdDQxMTUtYXBwbHktc3ltbGluay5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMDdmZjQyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDExNS1hcHBseS1zeW1saW5rLnNoCkBAIC0wLDAgKzEsNDkgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IGFwcGx5IHN5bWxpbmtzIGFuZCBwYXJ0aWFsIGZpbGVzCisKKycKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJbG4gLXMgcGF0aDEvcGF0aDIvcGF0aDMvcGF0aDQvcGF0aDUgbGluazEgJiYKKwlnaXQgYWRkIGxpbms/ICYmCisJZ2l0IGNvbW1pdCAtbSBpbml0aWFsICYmCisKKwlnaXQgYnJhbmNoIHNpZGUgJiYKKworCXJtIC1mIGxpbms/ICYmCisKKwlsbiAtcyBodGFwNiBsaW5rMSAmJgorCWdpdCB1cGRhdGUtaW5kZXggbGluaz8gJiYKKwlnaXQgY29tbWl0IC1tIHNlY29uZCAmJgorCisJZ2l0IGRpZmYtdHJlZSAtcCBIRUFEXiBIRUFEID5wYXRjaCAgJiYKKwlnaXQgYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSBwYXRjaAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IHN5bWxpbmsgcGF0Y2gnICcKKworCWdpdCBjaGVja291dCBzaWRlICYmCisJZ2l0IGFwcGx5IHBhdGNoICYmCisJZ2l0IGRpZmYtZmlsZXMgLXAgPnBhdGNoZWQgJiYKKwlnaXQgZGlmZiBwYXRjaCBwYXRjaGVkCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgLS1pbmRleCBzeW1saW5rIHBhdGNoJyAnCisKKwlnaXQgY2hlY2tvdXQgLWYgc2lkZSAmJgorCWdpdCBhcHBseSAtLWluZGV4IHBhdGNoICYmCisJZ2l0IGRpZmYtaW5kZXggLS1jYWNoZWQgLXAgSEVBRCA+cGF0Y2hlZCAmJgorCWdpdCBkaWZmIHBhdGNoIHBhdGNoZWQKKworJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQxMTYtYXBwbHktcmV2ZXJzZS5zaCBiL3QvdDQxMTYtYXBwbHktcmV2ZXJzZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jM2Y0NTc5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDExNi1hcHBseS1yZXZlcnNlLnNoCkBAIC0wLDAgKzEsOTEgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IGFwcGx5IGluIHJldmVyc2UKKworJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwlmb3IgaSBpbiBhIGIgYyBkIGUgZiBnIGggaSBqIGsgbCBtIG47IGRvIGVjaG8gJGk7IGRvbmUgPmZpbGUxICYmCisJcGVybCAtcGUgInkvaWprL1xcMDAwXFwwMDFcXDAwMi8iIDxmaWxlMSA+ZmlsZTIgJiYKKworCWdpdCBhZGQgZmlsZTEgZmlsZTIgJiYKKwlnaXQgY29tbWl0IC1tIGluaXRpYWwgJiYKKwlnaXQgdGFnIGluaXRpYWwgJiYKKworCWZvciBpIGluIGEgYiBjIGcgaCBpIEogSyBMIG0gbyBuIHAgcTsgZG8gZWNobyAkaTsgZG9uZSA+ZmlsZTEgJiYKKwlwZXJsIC1wZSAieS9tb24vXFwwMDBcXDAwMVxcMDAyLyIgPGZpbGUxID5maWxlMiAmJgorCisJZ2l0IGNvbW1pdCAtYSAtbSBzZWNvbmQgJiYKKwlnaXQgdGFnIHNlY29uZCAmJgorCisJZ2l0IGRpZmYgLS1iaW5hcnkgaW5pdGlhbCBzZWNvbmQgPnBhdGNoCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgaW4gZm9yd2FyZCcgJworCisJVDA9YGdpdCByZXYtcGFyc2UgInNlY29uZF57dHJlZX0iYCAmJgorCWdpdCByZXNldCAtLWhhcmQgaW5pdGlhbCAmJgorCWdpdCBhcHBseSAtLWluZGV4IC0tYmluYXJ5IHBhdGNoICYmCisJVDE9YGdpdCB3cml0ZS10cmVlYCAmJgorCXRlc3QgIiRUMCIgPSAiJFQxIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBpbiByZXZlcnNlJyAnCisKKwlnaXQgcmVzZXQgLS1oYXJkIHNlY29uZCAmJgorCWdpdCBhcHBseSAtLXJldmVyc2UgLS1iaW5hcnkgLS1pbmRleCBwYXRjaCAmJgorCWdpdCBkaWZmID5kaWZmICYmCisJZ2l0IGRpZmYgL2Rldi9udWxsIGRpZmYKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCBzZXBhcmF0ZSByZXBvc2l0b3J5IGxhY2tpbmcgcG9zdGltYWdlJyAnCisKKwlnaXQgdGFyLXRyZWUgaW5pdGlhbCBpbml0aWFsIHwgdGFyIHhmIC0gJiYKKwkoCisJCWNkIGluaXRpYWwgJiYgZ2l0IGluaXQgJiYgZ2l0IGFkZCAuCisJKSAmJgorCisJZ2l0IHRhci10cmVlIHNlY29uZCBzZWNvbmQgfCB0YXIgeGYgLSAmJgorCSgKKwkJY2Qgc2Vjb25kICYmIGdpdCBpbml0ICYmIGdpdCBhZGQgLgorCSkKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBpbiBmb3J3YXJkIHdpdGhvdXQgcG9zdGltYWdlJyAnCisKKwlUMD1gZ2l0IHJldi1wYXJzZSAic2Vjb25kXnt0cmVlfSJgICYmCisJKAorCQljZCBpbml0aWFsICYmCisJCWdpdCBhcHBseSAtLWluZGV4IC0tYmluYXJ5IC4uL3BhdGNoICYmCisJCVQxPWBnaXQgd3JpdGUtdHJlZWAgJiYKKwkJdGVzdCAiJFQwIiA9ICIkVDEiCisJKQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBpbiByZXZlcnNlIHdpdGhvdXQgcG9zdGltYWdlJyAnCisKKwlUMD1gZ2l0IHJldi1wYXJzZSAiaW5pdGlhbF57dHJlZX0iYCAmJgorCSgKKwkJY2Qgc2Vjb25kICYmCisJCWdpdCBhcHBseSAtLWluZGV4IC0tYmluYXJ5IC0tcmV2ZXJzZSAuLi9wYXRjaCAmJgorCQlUMT1gZ2l0IHdyaXRlLXRyZWVgICYmCisJCXRlc3QgIiRUMCIgPSAiJFQxIgorCSkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmV2ZXJzaW5nIGEgd2hpdGVzcGFjZSBpbnRyb2R1Y3Rpb24nICcKKwlzZWQgInMvYS9hIC8iIDwgZmlsZTEgPiBmaWxlMS5uZXcgJiYKKwltdiBmaWxlMS5uZXcgZmlsZTEgJiYKKwlnaXQgZGlmZiB8IGdpdCBhcHBseSAtLXJldmVyc2UgLS13aGl0ZXNwYWNlPWVycm9yCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDExNy1hcHBseS1yZWplY3Quc2ggYi90L3Q0MTE3LWFwcGx5LXJlamVjdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NTllMTdjCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDExNy1hcHBseS1yZWplY3Quc2gKQEAgLTAsMCArMSwxNTcgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IGFwcGx5IHdpdGggcmVqZWN0cworCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKwlmb3IgaSBpbiAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAxOCAxOSAyMCAyMQorCWRvCisJCWVjaG8gJGkKKwlkb25lID5maWxlMSAmJgorCWNhdCBmaWxlMSA+c2F2ZWQuZmlsZTEgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGZpbGUxICYmCisJZ2l0IGNvbW1pdCAtbSBpbml0aWFsICYmCisKKwlmb3IgaSBpbiAxIDIgQSBCIDQgNSA2IDcgOCA5IDEwIDExIDEyIEMgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgRCAyMQorCWRvCisJCWVjaG8gJGkKKwlkb25lID5maWxlMSAmJgorCWdpdCBkaWZmID5wYXRjaC4xICYmCisJY2F0IGZpbGUxID5jbGVhbiAmJgorCisJZm9yIGkgaW4gMSBFIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiBDIDEzIDE0IDE1IDE2IDE3IDE4IDE5IDIwIEYgMjEKKwlkbworCQllY2hvICRpCisJZG9uZSA+ZXhwZWN0ZWQgJiYKKworCW12IGZpbGUxIGZpbGUyICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBmaWxlMSBmaWxlMiAmJgorCWdpdCBkaWZmIC1NIEhFQUQgPnBhdGNoLjIgJiYKKworCXJtIC1mIGZpbGUxIGZpbGUyICYmCisJbXYgc2F2ZWQuZmlsZTEgZmlsZTEgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIGZpbGUxIGZpbGUyICYmCisKKwlmb3IgaSBpbiAxIEUgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDE0IDE1IDE2IDE3IDE4IDE5IDIwIEYgMjEKKwlkbworCQllY2hvICRpCisJZG9uZSA+ZmlsZTEgJiYKKworCWNhdCBmaWxlMSA+c2F2ZWQuZmlsZTEKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgd2l0aG91dCAtLXJlamVjdCBzaG91bGQgZmFpbCcgJworCisJaWYgZ2l0IGFwcGx5IHBhdGNoLjEKKwl0aGVuCisJCWVjaG8gIkVoPyBXaHk/IgorCQlleGl0IDEKKwlmaQorCisJZ2l0IGRpZmYgZmlsZTEgc2F2ZWQuZmlsZTEKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgd2l0aG91dCAtLXJlamVjdCBzaG91bGQgZmFpbCcgJworCisJaWYgZ2l0IGFwcGx5IC0tdmVyYm9zZSBwYXRjaC4xCisJdGhlbgorCQllY2hvICJFaD8gV2h5PyIKKwkJZXhpdCAxCisJZmkKKworCWdpdCBkaWZmIGZpbGUxIHNhdmVkLmZpbGUxCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IHdpdGggLS1yZWplY3Qgc2hvdWxkIGZhaWwgYnV0IHVwZGF0ZSB0aGUgZmlsZScgJworCisJY2F0IHNhdmVkLmZpbGUxID5maWxlMSAmJgorCXJtIC1mIGZpbGUxLnJlaiBmaWxlMi5yZWogJiYKKworCWlmIGdpdCBhcHBseSAtLXJlamVjdCBwYXRjaC4xCisJdGhlbgorCQllY2hvICJzdWNjZWVkcyB3aXRoIC0tcmVqZWN0PyIKKwkJZXhpdCAxCisJZmkKKworCWdpdCBkaWZmIGZpbGUxIGV4cGVjdGVkICYmCisKKwljYXQgZmlsZTEucmVqICYmCisKKwlpZiB0ZXN0IC1mIGZpbGUyLnJlagorCXRoZW4KKwkJZWNobyAiZmlsZTIgc2hvdWxkIG5vdCBoYXZlIGJlZW4gdG91Y2hlZCIKKwkJZXhpdCAxCisJZmkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgd2l0aCAtLXJlamVjdCBzaG91bGQgZmFpbCBidXQgdXBkYXRlIHRoZSBmaWxlJyAnCisKKwljYXQgc2F2ZWQuZmlsZTEgPmZpbGUxICYmCisJcm0gLWYgZmlsZTEucmVqIGZpbGUyLnJlaiBmaWxlMiAmJgorCisJaWYgZ2l0IGFwcGx5IC0tcmVqZWN0IHBhdGNoLjIgPnJlamVjdHMKKwl0aGVuCisJCWVjaG8gInN1Y2NlZWRzIHdpdGggLS1yZWplY3Q/IgorCQlleGl0IDEKKwlmaQorCisJdGVzdCAtZiBmaWxlMSAmJiB7CisJCWVjaG8gImZpbGUxIHN0aWxsIGV4aXN0cz8iCisJCWV4aXQgMQorCX0KKwlnaXQgZGlmZiBmaWxlMiBleHBlY3RlZCAmJgorCisJY2F0IGZpbGUyLnJlaiAmJgorCisJaWYgdGVzdCAtZiBmaWxlMS5yZWoKKwl0aGVuCisJCWVjaG8gImZpbGUyIHNob3VsZCBub3QgaGF2ZSBiZWVuIHRvdWNoZWQiCisJCWV4aXQgMQorCWZpCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGhlIHNhbWUgdGVzdCB3aXRoIC0tdmVyYm9zZScgJworCisJY2F0IHNhdmVkLmZpbGUxID5maWxlMSAmJgorCXJtIC1mIGZpbGUxLnJlaiBmaWxlMi5yZWogZmlsZTIgJiYKKworCWlmIGdpdCBhcHBseSAtLXJlamVjdCAtLXZlcmJvc2UgcGF0Y2guMiA+cmVqZWN0cworCXRoZW4KKwkJZWNobyAic3VjY2VlZHMgd2l0aCAtLXJlamVjdD8iCisJCWV4aXQgMQorCWZpCisKKwl0ZXN0IC1mIGZpbGUxICYmIHsKKwkJZWNobyAiZmlsZTEgc3RpbGwgZXhpc3RzPyIKKwkJZXhpdCAxCisJfQorCWdpdCBkaWZmIGZpbGUyIGV4cGVjdGVkICYmCisKKwljYXQgZmlsZTIucmVqICYmCisKKwlpZiB0ZXN0IC1mIGZpbGUxLnJlagorCXRoZW4KKwkJZWNobyAiZmlsZTIgc2hvdWxkIG5vdCBoYXZlIGJlZW4gdG91Y2hlZCIKKwkJZXhpdCAxCisJZmkKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBjbGVhbmx5IHdpdGggLS12ZXJib3NlJyAnCisKKwlnaXQgY2F0LWZpbGUgLXAgSEVBRDpmaWxlMSA+ZmlsZTEgJiYKKwlybSAtZiBmaWxlPy5yZWogZmlsZTIgJiYKKworCWdpdCBhcHBseSAtLXZlcmJvc2UgcGF0Y2guMSAmJgorCisJZ2l0IGRpZmYgZmlsZTEgY2xlYW4KKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MTE4LWFwcGx5LWVtcHR5LWNvbnRleHQuc2ggYi90L3Q0MTE4LWFwcGx5LWVtcHR5LWNvbnRleHQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWQ1MzFjYQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMTgtYXBwbHktZW1wdHktY29udGV4dC5zaApAQCAtMCwwICsxLDU1IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBhcHBseSB3aXRoIG5ldyBzdHlsZSBHTlUgZGlmZiB3aXRoIGVtcHR5IGNvbnRleHQKKworJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJeworCQllY2hvOyBlY2hvOworCQllY2hvIEE7IGVjaG8gQjsgZWNobyBDOworCQllY2hvOworCX0gPmZpbGUxICYmCisJY2F0IGZpbGUxID5maWxlMS5vcmlnICYmCisJeworCQljYXQgZmlsZTEgJiYKKwkJZWNobyBRIHwgdHIgLWQgIlxcMDEyIgorCX0gPmZpbGUyICYmCisJY2F0IGZpbGUyID5maWxlMi5vcmlnCisJZ2l0IGFkZCBmaWxlMSBmaWxlMiAmJgorCXNlZCAtZSAiL15CL2QiIDxmaWxlMS5vcmlnID5maWxlMSAmJgorCXNlZCAtZSAiL15bQlFdL2QiIDxmaWxlMi5vcmlnID5maWxlMiAmJgorCWVjaG8gUSB8IHRyIC1kICJcXDAxMiIgPj5maWxlMiAmJgorCWNhdCBmaWxlMSA+ZmlsZTEubW9kcyAmJgorCWNhdCBmaWxlMiA+ZmlsZTIubW9kcyAmJgorCWdpdCBkaWZmIHwKKwlzZWQgLWUgInMvXiBcJC8vIiA+ZGlmZi5vdXRwdXQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgLS1udW1zdGF0JyAnCisKKwlnaXQgYXBwbHkgLS1udW1zdGF0IGRpZmYub3V0cHV0ID5hY3R1YWwgJiYKKwl7CisJCWVjaG8gIjAJMQlmaWxlMSIgJiYKKwkJZWNobyAiMAkxCWZpbGUyIgorCX0gPmV4cGVjdCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSAtLWFwcGx5JyAnCisKKwljYXQgZmlsZTEub3JpZyA+ZmlsZTEgJiYKKwljYXQgZmlsZTIub3JpZyA+ZmlsZTIgJiYKKwlnaXQgdXBkYXRlLWluZGV4IGZpbGUxIGZpbGUyICYmCisJZ2l0IGFwcGx5IC0taW5kZXggZGlmZi5vdXRwdXQgJiYKKwlnaXQgZGlmZiBmaWxlMS5tb2RzIGZpbGUxICYmCisJZ2l0IGRpZmYgZmlsZTIubW9kcyBmaWxlMgorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQxMTktYXBwbHktY29uZmlnLnNoIGIvdC90NDExOS1hcHBseS1jb25maWcuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjU0MGY3MgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMTktYXBwbHktY29uZmlnLnNoCkBAIC0wLDAgKzEsMTYyIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBhcHBseSAtLXdoaXRlc3BhY2U9c3RyaXAgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZS4KKworJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJbWtkaXIgc3ViICYmCisJZWNobyBBID5zdWIvZmlsZTEgJiYKKwljcCBzdWIvZmlsZTEgc2F2ZWQgJiYKKwlnaXQgYWRkIHN1Yi9maWxlMSAmJgorCWVjaG8gIkIgIiA+c3ViL2ZpbGUxICYmCisJZ2l0IGRpZmYgPnBhdGNoLmZpbGUKKycKKworIyBBbHNvIGhhbmRjcmFmdCBHTlUgZGlmZiBvdXRwdXQ7IG5vdGUgdGhpcyBoYXMgdHJhaWxpbmcgd2hpdGVzcGFjZS4KK2NhdCA+Z3BhdGNoLmZpbGUgPDxcRU9GICYmCistLS0gZmlsZTEJMjAwNy0wMi0yMSAwMTowNDoyNC4wMDAwMDAwMDAgLTA4MDAKKysrKyBmaWxlMSsJMjAwNy0wMi0yMSAwMTowNzo0NC4wMDAwMDAwMDAgLTA4MDAKK0BAIC0xICsxIEBACistQQorK0IgCitFT0YKKworc2VkIC1lICdzfGZpbGUxfHN1Yi8mfCcgZ3BhdGNoLmZpbGUgPmdwYXRjaC1zdWIuZmlsZSAmJgorc2VkIC1lICcKKwkvXi0tLSAvc3xmaWxlMXxhL3N1Yi8mfAorCS9eKysrIC9zfGZpbGUxfGIvc3ViLyZ8CisnIGdwYXRjaC5maWxlID5ncGF0Y2gtYWItc3ViLmZpbGUgJiYKKworY2hlY2tfcmVzdWx0ICgpIHsKKwlpZiBncmVwICIgIiAiJDEiCisJdGhlbgorCQllY2hvICJFaD8iCisJCWZhbHNlCisJZWxpZiBncmVwIEIgIiQxIgorCXRoZW4KKwkJZWNobyBIYXBweQorCWVsc2UKKwkJZWNobyAiSHVoPyIKKwkJZmFsc2UKKwlmaQorfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSAtLXdoaXRlc3BhY2U9c3RyaXAnICcKKworCXJtIC1mIHN1Yi9maWxlMSAmJgorCWNwIHNhdmVkIHN1Yi9maWxlMSAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1yZWZyZXNoICYmCisKKwlnaXQgYXBwbHkgLS13aGl0ZXNwYWNlPXN0cmlwIHBhdGNoLmZpbGUgJiYKKwljaGVja19yZXN1bHQgc3ViL2ZpbGUxCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IC0td2hpdGVzcGFjZT1zdHJpcCBmcm9tIGNvbmZpZycgJworCisJcm0gLWYgc3ViL2ZpbGUxICYmCisJY3Agc2F2ZWQgc3ViL2ZpbGUxICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLXJlZnJlc2ggJiYKKworCWdpdCBjb25maWcgYXBwbHkud2hpdGVzcGFjZSBzdHJpcCAmJgorCWdpdCBhcHBseSBwYXRjaC5maWxlICYmCisJY2hlY2tfcmVzdWx0IHN1Yi9maWxlMQorJworCitEPWBwd2RgCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IC0td2hpdGVzcGFjZT1zdHJpcCBpbiBzdWJkaXInICcKKworCWNkICIkRCIgJiYKKwlnaXQgY29uZmlnIC0tdW5zZXQtYWxsIGFwcGx5LndoaXRlc3BhY2UKKwlybSAtZiBzdWIvZmlsZTEgJiYKKwljcCBzYXZlZCBzdWIvZmlsZTEgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tcmVmcmVzaCAmJgorCisJY2Qgc3ViICYmCisJZ2l0IGFwcGx5IC0td2hpdGVzcGFjZT1zdHJpcCAuLi9wYXRjaC5maWxlICYmCisJY2hlY2tfcmVzdWx0IGZpbGUxCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IC0td2hpdGVzcGFjZT1zdHJpcCBmcm9tIGNvbmZpZyBpbiBzdWJkaXInICcKKworCWNkICIkRCIgJiYKKwlnaXQgY29uZmlnIGFwcGx5LndoaXRlc3BhY2Ugc3RyaXAgJiYKKwlybSAtZiBzdWIvZmlsZTEgJiYKKwljcCBzYXZlZCBzdWIvZmlsZTEgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tcmVmcmVzaCAmJgorCisJY2Qgc3ViICYmCisJZ2l0IGFwcGx5IC4uL3BhdGNoLmZpbGUgJiYKKwljaGVja19yZXN1bHQgZmlsZTEKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2FtZSBpbiBzdWJkaXIgYnV0IHdpdGggdHJhZGl0aW9uYWwgcGF0Y2ggaW5wdXQnICcKKworCWNkICIkRCIgJiYKKwlnaXQgY29uZmlnIGFwcGx5LndoaXRlc3BhY2Ugc3RyaXAgJiYKKwlybSAtZiBzdWIvZmlsZTEgJiYKKwljcCBzYXZlZCBzdWIvZmlsZTEgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tcmVmcmVzaCAmJgorCisJY2Qgc3ViICYmCisJZ2l0IGFwcGx5IC4uL2dwYXRjaC5maWxlICYmCisJY2hlY2tfcmVzdWx0IGZpbGUxCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NhbWUgYnV0IHdpdGggdHJhZGl0aW9uYWwgcGF0Y2ggaW5wdXQgb2YgZGVwdGggMScgJworCisJY2QgIiREIiAmJgorCWdpdCBjb25maWcgYXBwbHkud2hpdGVzcGFjZSBzdHJpcCAmJgorCXJtIC1mIHN1Yi9maWxlMSAmJgorCWNwIHNhdmVkIHN1Yi9maWxlMSAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1yZWZyZXNoICYmCisKKwljZCBzdWIgJiYKKwlnaXQgYXBwbHkgLi4vZ3BhdGNoLXN1Yi5maWxlICYmCisJY2hlY2tfcmVzdWx0IGZpbGUxCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NhbWUgYnV0IHdpdGggdHJhZGl0aW9uYWwgcGF0Y2ggaW5wdXQgb2YgZGVwdGggMicgJworCisJY2QgIiREIiAmJgorCWdpdCBjb25maWcgYXBwbHkud2hpdGVzcGFjZSBzdHJpcCAmJgorCXJtIC1mIHN1Yi9maWxlMSAmJgorCWNwIHNhdmVkIHN1Yi9maWxlMSAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1yZWZyZXNoICYmCisKKwljZCBzdWIgJiYKKwlnaXQgYXBwbHkgLi4vZ3BhdGNoLWFiLXN1Yi5maWxlICYmCisJY2hlY2tfcmVzdWx0IGZpbGUxCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NhbWUgYnV0IHdpdGggdHJhZGl0aW9uYWwgcGF0Y2ggaW5wdXQgb2YgZGVwdGggMScgJworCisJY2QgIiREIiAmJgorCWdpdCBjb25maWcgYXBwbHkud2hpdGVzcGFjZSBzdHJpcCAmJgorCXJtIC1mIHN1Yi9maWxlMSAmJgorCWNwIHNhdmVkIHN1Yi9maWxlMSAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1yZWZyZXNoICYmCisKKwlnaXQgYXBwbHkgLXAwIGdwYXRjaC1zdWIuZmlsZSAmJgorCWNoZWNrX3Jlc3VsdCBzdWIvZmlsZTEKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2FtZSBidXQgd2l0aCB0cmFkaXRpb25hbCBwYXRjaCBpbnB1dCBvZiBkZXB0aCAyJyAnCisKKwljZCAiJEQiICYmCisJZ2l0IGNvbmZpZyBhcHBseS53aGl0ZXNwYWNlIHN0cmlwICYmCisJcm0gLWYgc3ViL2ZpbGUxICYmCisJY3Agc2F2ZWQgc3ViL2ZpbGUxICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLXJlZnJlc2ggJiYKKworCWdpdCBhcHBseSBncGF0Y2gtYWItc3ViLmZpbGUgJiYKKwljaGVja19yZXN1bHQgc3ViL2ZpbGUxCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDEyMC1hcHBseS1wb3B0LnNoIGIvdC90NDEyMC1hcHBseS1wb3B0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgzZDRiYTYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTIwLWFwcGx5LXBvcHQuc2gKQEAgLTAsMCArMSwyNSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBTaGF3biBPLiBQZWFyY2UKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IGFwcGx5IC1wIGhhbmRsaW5nLicKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCW1rZGlyIHN1YiAmJgorCWVjaG8gQSA+c3ViL2ZpbGUxICYmCisJY3Agc3ViL2ZpbGUxIGZpbGUxICYmCisJZ2l0IGFkZCBzdWIvZmlsZTEgJiYKKwllY2hvIEIgPnN1Yi9maWxlMSAmJgorCWdpdCBkaWZmID5wYXRjaC5maWxlICYmCisJcm0gc3ViL2ZpbGUxICYmCisJcm1kaXIgc3ViCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IGdpdCBkaWZmIHdpdGggLXAyJyAnCisJZ2l0IGFwcGx5IC1wMiBwYXRjaC5maWxlCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDEyMS1hcHBseS1kaWZmcy5zaCBiL3QvdDQxMjEtYXBwbHktZGlmZnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWZmNTUxYQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMjEtYXBwbHktZGlmZnMuc2gKQEAgLTAsMCArMSwzMiBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBhcHBseSBmb3IgY29udGV4dHVhbGx5IGluZGVwZW5kZW50IGRpZmZzJworLiAuL3Rlc3QtbGliLnNoCisKK2VjaG8gJzEKKzIKKzMKKzQKKzUKKzYKKzcKKzgnID5maWxlCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NldHVwJyBcCisJJ2dpdCBhZGQgZmlsZSAmJgorCWdpdCBjb21taXQgLXEgLW0gMSAmJgorCWdpdCBjaGVja291dCAtYiB0ZXN0ICYmCisJbXYgZmlsZSBmaWxlLnRtcCAmJgorCWVjaG8gMCA+ZmlsZSAmJgorCWNhdCBmaWxlLnRtcCA+PmZpbGUgJiYKKwlybSBmaWxlLnRtcCAmJgorCWdpdCBjb21taXQgLWEgLXEgLW0gMiAmJgorCWVjaG8gOSA+PmZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1xIC1tIDMgJiYKKwlnaXQgY2hlY2tvdXQgbWFzdGVyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY2hlY2sgaWYgY29udGV4dHVhbGx5IGluZGVwZW5kZW50IGRpZmZzIGZvciB0aGUgc2FtZSBmaWxlIGFwcGx5JyBcCisJJyggZ2l0IGRpZmYgdGVzdH4yIHRlc3R+MTsgZ2l0IGRpZmYgdGVzdH4xIHRlc3R+MCApfCBnaXQgYXBwbHknCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDEyMi1hcHBseS1zeW1saW5rLWluc2lkZS5zaCBiL3QvdDQxMjItYXBwbHktc3ltbGluay1pbnNpZGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODQxNzczZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMjItYXBwbHktc3ltbGluay1pbnNpZGUuc2gKQEAgLTAsMCArMSw1NSBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J2FwcGx5IHRvIGRlZXBlciBkaXJlY3Rvcnkgd2l0aG91dCBnZXR0aW5nIGZvb2xlZCB3aXRoIHN5bWxpbmsnCisuIC4vdGVzdC1saWIuc2gKKworbGVjaG8gKCkgeworCWZvciBsXworCWRvCisJCWVjaG8gIiRsXyIKKwlkb25lCit9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJbWtkaXIgLXAgYXJjaC9pMzg2L2Jvb3QgYXJjaC94ODZfNjQgJiYKKwlsZWNobyAxIDIgMyA0IDUgPmFyY2gvaTM4Ni9ib290L01ha2VmaWxlICYmCisJbG4gLXMgLi4vaTM4Ni9ib290IGFyY2gveDg2XzY0L2Jvb3QgJiYKKwlnaXQgYWRkIC4gJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIGluaXRpYWwgJiYKKwlnaXQgYnJhbmNoIHRlc3QgJiYKKworCXJtIGFyY2gveDg2XzY0L2Jvb3QgJiYKKwlta2RpciBhcmNoL3g4Nl82NC9ib290ICYmCisJbGVjaG8gMiAzIDQgNSA2ID5hcmNoL3g4Nl82NC9ib290L01ha2VmaWxlICYmCisJZ2l0IGFkZCAuICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtYSAtbSBzZWNvbmQgJiYKKworCWdpdCBmb3JtYXQtcGF0Y2ggLS1iaW5hcnkgLTEgLS1zdGRvdXQgPnRlc3QucGF0Y2gKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIGFwcGx5ICcKKworCWdpdCBjaGVja291dCB0ZXN0ICYmCisJZ2l0IGRpZmYgLS1leGl0LWNvZGUgdGVzdCAmJgorCWdpdCBkaWZmIC0tZXhpdC1jb2RlIC0tY2FjaGVkIHRlc3QgJiYKKwlnaXQgYXBwbHkgLS1pbmRleCB0ZXN0LnBhdGNoCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgcmVzdWx0JyAnCisKKwlnaXQgZGlmZiAtLWV4aXQtY29kZSBtYXN0ZXIgJiYKKwlnaXQgZGlmZiAtLWV4aXQtY29kZSAtLWNhY2hlZCBtYXN0ZXIgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIHJlcGxheSAmJgorCVQxPSQoZ2l0IHJldi1wYXJzZSAibWFzdGVyXnt0cmVlfSIpICYmCisJVDI9JChnaXQgcmV2LXBhcnNlICJIRUFEXnt0cmVlfSIpICYmCisJdGVzdCAieiRUMSIgPSAieiRUMiIKKworJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQxMjMtYXBwbHktc2hyaW5rLnNoIGIvdC90NDEyMy1hcHBseS1zaHJpbmsuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTg0MTU3ZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMjMtYXBwbHktc2hyaW5rLnNoCkBAIC0wLDAgKzEsNTggQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdhcHBseSBhIHBhdGNoIHRoYXQgaXMgbGFyZ2VyIHRoYW4gdGhlIHByZWltYWdlJworCisuIC4vdGVzdC1saWIuc2gKKworY2F0ID5GICA8PFxFT0YKKzEKKzIKKzMKKzQKKzUKKzYKKzcKKzgKKzk5OTk5OQorQQorQgorQworRAorRQorRgorRworSAorSQorSgorCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwlnaXQgYWRkIEYgJiYKKwltdiBGIEcgJiYKKwlzZWQgLWUgInMvMS8xMS8iIC1lICJzLzk5OTk5OS85LyIgLWUgInMvSC9ISC8iIDxHID5GICYmCisJZ2l0IGRpZmYgPnBhdGNoICYmCisJc2VkIC1lICIvXlwkL2QiIDxHID5GICYmCisJZ2l0IGFkZCBGCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgc2hvdWxkIGZhaWwgZ3JhY2VmdWxseScgJworCisJaWYgZ2l0IGFwcGx5IC0taW5kZXggcGF0Y2gKKwl0aGVuCisJCWVjaG8gT29wcywgc2hvdWxkIG5vdCBoYXZlIHN1Y2NlZWRlZAorCQlmYWxzZQorCWVsc2UKKwkJc3RhdHVzPSQ/CisJCWVjaG8gIlN0YXR1cyB3YXMgJHN0YXR1cyIKKwkJaWYgdGVzdCAtZiAuZ2l0L2luZGV4LmxvY2sKKwkJdGhlbgorCQkJZWNobyBPb3BzLCBzaG91bGQgbm90IGhhdmUgY3Jhc2hlZAorCQkJZmFsc2UKKwkJZmkKKwlmaQorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQxMjQtYXBwbHktd3MtcnVsZS5zaCBiL3QvdDQxMjQtYXBwbHktd3MtcnVsZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NWYzZGEyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEyNC1hcHBseS13cy1ydWxlLnNoCkBAIC0wLDAgKzEsMTUxIEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nY29yZS53aGl0ZXNwYWNlIHJ1bGVzIGFuZCBnaXQtYXBwbHknCisKKy4gLi90ZXN0LWxpYi5zaAorCitwcmVwYXJlX3Rlc3RfZmlsZSAoKSB7CisKKwkjIEEgbGluZSB0aGF0IGhhcyBjaGFyYWN0ZXIgWCBpcyB0b3VjaGVkIGlmZiBSVUxFIGlzIGluIGVmZmVjdDoKKwkjICAgICAgIFggIFJVTEUKKwkjICAgCSEgIHRyYWlsaW5nLXNwYWNlCisJIyAgIAlAICBzcGFjZS1iZWZvcmUtdGFiCisJIyAgIAkjICBpbmRlbnQtd2l0aC1ub24tdGFiCisJc2VkIC1lICJzL18vIC9nIiAtZSAicy8+LwkvIiA8PC1cRU9GCisJCUFuX1NQIGluIGFuIG9yZGluYXJ5IGxpbmU+YW5kIGEgSFQuCisJCT5BIEhULgorCQlfPkEgU1AgYW5kIGEgSFQgKEApLgorCQlfPl9BIFNQLCBhIEhUIGFuZCBhIFNQIChAKS4KKwkJX19fX19fX1NldmVuIFNQLgorCQlfX19fX19fX0VpZ2h0IFNQICgjKS4KKwkJX19fX19fXz5TZXZlbiBTUCBhbmQgYSBIVCAoQCkuCisJCV9fX19fX19fPkVpZ2h0IFNQIGFuZCBhIEhUIChAIykuCisJCV9fX19fX18+X1NldmVuIFNQLCBhIEhUIGFuZCBhIFNQIChAKS4KKwkJX19fX19fX18+X0VpZ2h0IFNQLCBhIEhUIGFuZCBhIFNQIChAIykuCisJCV9fX19fX19fX19fX19fX0ZpZnRlZW4gU1AgKCMpLgorCQlfX19fX19fX19fX19fX18+RmlmdGVlbiBTUCBhbmQgYSBIVCAoQCMpLgorCQlfX19fX19fX19fX19fX19fU2l4dGVlbiBTUCAoIykuCisJCV9fX19fX19fX19fX19fX18+U2l4dGVlbiBTUCBhbmQgYSBIVCAoQCMpLgorCQlfX19fX2FfX0ZpdmUgU1AsIGEgbm9uIFdTLCB0d28gU1AuCisJCUEgbGluZSB3aXRoIGEgKCEpIHRyYWlsaW5nIFNQXworCQlBIGxpbmUgd2l0aCBhICghKSB0cmFpbGluZyBIVD4KKwlFT0YKK30KKworYXBwbHlfcGF0Y2ggKCkgeworCT50YXJnZXQgJiYKKwlzZWQgLWUgInN8XChbYWJdXCkvZmlsZXxcMS90YXJnZXR8IiA8cGF0Y2ggfAorCWdpdCBhcHBseSAiJEAiCit9CisKK3Rlc3RfZml4ICgpIHsKKworCSMgZml4IHNob3VsZCBub3QgYmFyZgorCWFwcGx5X3BhdGNoIC0td2hpdGVzcGFjZT1maXggfHwgcmV0dXJuIDEKKworCSMgZmluZCB0b3VjaGVkIGxpbmVzCisJZGlmZiBmaWxlIHRhcmdldCB8IHNlZCAtbiAtZSAicy9ePiAvL3AiID5maXhlZAorCisJIyB0aGUgY2hhbmdlZCBsaW5lcyBhcmUgYWxsIGV4cGVjZWQgdG8gY2hhbmdlCisJZml4ZWRfY250PSQod2MgLWwgPGZpeGVkKQorCWNhc2UgIiQxIiBpbgorCScnKSBleHBlY3RfY250PSRmaXhlZF9jbnQgOzsKKwk/KikgZXhwZWN0X2NudD0kKGdyZXAgIlskMV0iIDxmaXhlZCB8IHdjIC1sKSA7OworCWVzYWMKKwl0ZXN0ICRmaXhlZF9jbnQgLWVxICRleHBlY3RfY250IHx8IHJldHVybiAxCisKKwkjIGFuZCB3ZSBhcmUgbm90IG1pc3NpbmcgYW55dGhpbmcKKwljYXNlICIkMSIgaW4KKwknJykgZXhwZWN0X2NudD0wIDs7CisJPyopIGV4cGVjdF9jbnQ9JChncmVwICJbJDFdIiA8ZmlsZSB8IHdjIC1sKSA7OworCWVzYWMKKwl0ZXN0ICRmaXhlZF9jbnQgLWVxICRleHBlY3RfY250IHx8IHJldHVybiAxCisKKwkjIEdldCB0aGUgcGF0Y2ggYWN0dWFsbHkgYXBwbGllZAorCWdpdCBkaWZmLWZpbGVzIC1wIHRhcmdldCA+Zml4ZWQtcGF0Y2gKKwl0ZXN0IC1zIGZpeGVkLXBhdGNoICYmIHJldHVybiAwCisKKwkjIE1ha2Ugc3VyZSBpdCBpcyBjb21wbGFpbnQtZnJlZQorCT50YXJnZXQKKwlnaXQgYXBwbHkgLS13aGl0ZXNwYWNlPWVycm9yLWFsbCA8Zml4ZWQtcGF0Y2gKKworfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKworCT5maWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJcHJlcGFyZV90ZXN0X2ZpbGUgPmZpbGUgJiYKKwlnaXQgZGlmZi1maWxlcyAtcCA+cGF0Y2ggJiYKKwk+dGFyZ2V0ICYmCisJZ2l0IGFkZCB0YXJnZXQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd3aGl0ZXNwYWNlPW5vd2FybiwgZGVmYXVsdCBydWxlJyAnCisKKwlhcHBseV9wYXRjaCAtLXdoaXRlc3BhY2U9bm93YXJuICYmCisJZGlmZiBmaWxlIHRhcmdldAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3doaXRlc3BhY2U9d2FybiwgZGVmYXVsdCBydWxlJyAnCisKKwlhcHBseV9wYXRjaCAtLXdoaXRlc3BhY2U9d2FybiAmJgorCWRpZmYgZmlsZSB0YXJnZXQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd3aGl0ZXNwYWNlPWVycm9yLWFsbCwgZGVmYXVsdCBydWxlJyAnCisKKwlhcHBseV9wYXRjaCAtLXdoaXRlc3BhY2U9ZXJyb3ItYWxsICYmIHJldHVybiAxCisJdGVzdCAtcyB0YXJnZXQgJiYgcmV0dXJuIDEKKwk6IGhhcHB5CisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnd2hpdGVzcGFjZT1lcnJvci1hbGwsIG5vIHJ1bGUnICcKKworCWdpdCBjb25maWcgY29yZS53aGl0ZXNwYWNlIC10cmFpbGluZywtc3BhY2UtYmVmb3JlLC1pbmRlbnQgJiYKKwlhcHBseV9wYXRjaCAtLXdoaXRlc3BhY2U9ZXJyb3ItYWxsICYmCisJZGlmZiBmaWxlIHRhcmdldAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3doaXRlc3BhY2U9ZXJyb3ItYWxsLCBubyBydWxlIChhdHRyaWJ1dGUpJyAnCisKKwlnaXQgY29uZmlnIC0tdW5zZXQgY29yZS53aGl0ZXNwYWNlICYmCisJZWNobyAidGFyZ2V0IC13aGl0ZXNwYWNlIiA+LmdpdGF0dHJpYnV0ZXMgJiYKKwlhcHBseV9wYXRjaCAtLXdoaXRlc3BhY2U9ZXJyb3ItYWxsICYmCisJZGlmZiBmaWxlIHRhcmdldAorCisnCisKK2ZvciB0IGluIC0gJycKK2RvCisJY2FzZSAiJHQiIGluICcnKSB0dD0nIScgOzsgKikgdHQ9IDs7IGVzYWMKKwlmb3IgcyBpbiAtICcnCisJZG8KKwkJY2FzZSAiJHMiIGluICcnKSB0cz0nQCcgOzsgKikgdHM9IDs7IGVzYWMKKwkJZm9yIGkgaW4gLSAnJworCQlkbworCQkJY2FzZSAiJGkiIGluICcnKSB0aT0nIycgOzsgKikgdGk9IDs7IGVzYWMKKwkJCXJ1bGU9JHt0fXRyYWlsaW5nLCR7c31zcGFjZSwke2l9aW5kZW50CisKKwkJCXJtIC1mIC5naXRhdHRyaWJ1dGVzCisJCQl0ZXN0X2V4cGVjdF9zdWNjZXNzICJydWxlPSRydWxlIiAnCisJCQkJZ2l0IGNvbmZpZyBjb3JlLndoaXRlc3BhY2UgIiRydWxlIiAmJgorCQkJCXRlc3RfZml4ICIkdHQkdHMkdGkiCisJCQknCisKKwkJCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgInJ1bGU9JHJ1bGUgKGF0dHJpYnV0ZXMpIiAnCisJCQkJZ2l0IGNvbmZpZyAtLXVuc2V0IGNvcmUud2hpdGVzcGFjZSAmJgorCQkJCWVjaG8gInRhcmdldCB3aGl0ZXNwYWNlPSRydWxlIiA+LmdpdGF0dHJpYnV0ZXMgJiYKKwkJCQl0ZXN0X2ZpeCAiJHR0JHRzJHRpIgorCQkJJworCisJCWRvbmUKKwlkb25lCitkb25lCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDEyNS1hcHBseS13cy1mdXp6LnNoIGIvdC90NDEyNS1hcHBseS13cy1mdXp6LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNiNDcxYjYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTI1LWFwcGx5LXdzLWZ1enouc2gKQEAgLTAsMCArMSwxMDMgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdhcHBseWluZyBwYXRjaCB0aGF0IGhhcyBicm9rZW4gd2hpdGVzcGFjZXMgaW4gY29udGV4dCcKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJPmZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKworCSMgZmlsZS0wIGlzIGZ1bGwgb2Ygd2hpdGVzcGFjZSBicmVha2FnZXMKKwlmb3IgbCBpbiBhIGJiIGMgZCBlZWVlIGYgZ2dnIGgKKwlkbworCQllY2hvICIkbCAiCisJZG9uZSA+ZmlsZS0wICYmCisKKwkjIHBhdGNoLTAgY3JlYXRlcyBhIHdoaXRlc3BhY2UgYnJva2VuIGZpbGUKKwljYXQgZmlsZS0wID5maWxlICYmCisJZ2l0IGRpZmYgPnBhdGNoLTAgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKworCSMgZmlsZS0xIGlzIHN0aWxsIGZ1bGwgb2Ygd2hpdGVzcGFjZSBicmVha2FnZXMsCisJIyBidXQgaGFzIG9uZSBsaW5lIHVwZGF0ZWQsIHdpdGhvdXQgZml4aW5nIGFueQorCSMgd2hpdGVzcGFjZXMuCisJIyBwYXRjaC0xIHJlY29yZHMgdGhhdCBjaGFuZ2UuCisJc2VkIC1lICJzL2QvRC8iIGZpbGUtMCA+ZmlsZS0xICYmCisJY2F0IGZpbGUtMSA+ZmlsZSAmJgorCWdpdCBkaWZmID5wYXRjaC0xICYmCisKKwkjIHBhdGNoLWFsbCBpcyB0aGUgZWZmZWN0IG9mIGJvdGggcGF0Y2gtMCBhbmQgcGF0Y2gtMQorCT5maWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJY2F0IGZpbGUtMSA+ZmlsZSAmJgorCWdpdCBkaWZmID5wYXRjaC1hbGwgJiYKKworCSMgcGF0Y2gtMiBpcyB0aGUgc2FtZSBhcyBwYXRjaC0xIGJ1dCBpcyBiYXNlZAorCSMgb24gYSB2ZXJzaW9uIHRoYXQgYWxyZWFkeSBoYXMgd2hpdGVzcGFjZSBmaXhlZCwKKwkjIGFuZCBkb2VzIG5vdCBpbnRyb2R1Y2Ugd2hpdGVzcGFjZSBicmVha2FnZXMuCisJc2VkIC1lICJzLyAkLy8iIHBhdGNoLTEgPnBhdGNoLTIgJiYKKworCSMgSWYgYWxsIHdoaXRlc3BhY2UgYnJlYWthZ2VzIGFyZSBmaXhlZCB0aGUgY29udGVudHMKKwkjIHNob3VsZCBsb29rIGxpa2UgZmlsZS1maXhlZAorCXNlZCAtZSAicy8gJC8vIiBmaWxlLTEgPmZpbGUtZml4ZWQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIG5vZml4ICcKKworCT5maWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisKKwkjIEJhc2VsaW5lLiAgQXBwbHlpbmcgd2l0aG91dCBmaXhpbmcgYW55IHdoaXRlc3BhY2UKKwkjIGJyZWFrYWdlcy4KKwlnaXQgYXBwbHkgLS13aGl0ZXNwYWNlPW5vd2FybiBwYXRjaC0wICYmCisJZ2l0IGFwcGx5IC0td2hpdGVzcGFjZT1ub3dhcm4gcGF0Y2gtMSAmJgorCisJIyBUaGUgcmVzdWx0IHNob3VsZCBvYnZpb3VzbHkgbWF0Y2guCisJdGVzdF9jbXAgZmlsZS0xIGZpbGUKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnd2l0aGZpeCAoZm9yd2FyZCknICcKKworCT5maWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisKKwkjIFRoZSBmaXJzdCBhcHBsaWNhdGlvbiB3aWxsIG11bmdlIHRoZSBjb250ZXh0IGxpbmVzCisJIyB0aGUgc2Vjb25kIHBhdGNoIGRlcGVuZHMgb24uICBXZSBzaG91bGQgYmUgYWJsZSB0bworCSMgYWRqdXN0IGFuZCBzdGlsbCBhcHBseS4KKwlnaXQgYXBwbHkgLS13aGl0ZXNwYWNlPWZpeCBwYXRjaC0wICYmCisJZ2l0IGFwcGx5IC0td2hpdGVzcGFjZT1maXggcGF0Y2gtMSAmJgorCisJdGVzdF9jbXAgZmlsZS1maXhlZCBmaWxlCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3dpdGhmaXggKGJhY2t3YXJkKScgJworCisJPmZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKworCSMgTm93IHdlIGhhdmUgYSB3aGl0ZXNwYWNlIGJyZWFrYWdlcyBvbiBvdXIgc2lkZS4KKwlnaXQgYXBwbHkgLS13aGl0ZXNwYWNlPW5vd2FybiBwYXRjaC0wICYmCisKKwkjIEFuZCBzb21lYm9keSBzZW5kcyBpbiBhIHBhdGNoIGJhc2VkIG9uIGltYWdlCisJIyB3aXRoIHdoaXRlc3BhY2UgYWxyZWFkeSBmaXhlZC4KKwlnaXQgYXBwbHkgLS13aGl0ZXNwYWNlPWZpeCBwYXRjaC0yICYmCisKKwkjIFRoZSByZXN1bHQgc2hvdWxkIGFjY2VwdCB0aGUgd2hpdGVzcGFjZSBmaXhlZAorCSMgcG9zdGltYWdlLiAgQnV0IHRoZSBsaW5lIHdpdGggImgiIGlzIGJleW9uZCBjb250ZXh0CisJIyBob3Jpem9uIGFuZCBsZWZ0IHVuZml4ZWQuCisKKwlzZWQgLWUgL2gvZCBmaWxlLWZpeGVkID5maXhlZC1oZWFkICYmCisJc2VkIC1lIC9oL2QgZmlsZSA+ZmlsZS1oZWFkICYmCisJdGVzdF9jbXAgZml4ZWQtaGVhZCBmaWxlLWhlYWQgJiYKKworCXNlZCAtbiAtZSAvaC9wIGZpbGUtZml4ZWQgPmZpeGVkLXRhaWwgJiYKKwlzZWQgLW4gLWUgL2gvcCBmaWxlID5maWxlLXRhaWwgJiYKKworCSEgdGVzdF9jbXAgZml4ZWQtdGFpbCBmaWxlLXRhaWwKKworJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQxNTAtYW0tc3ViZGlyLnNoIGIvdC90NDE1MC1hbS1zdWJkaXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTIwNjliNAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxNTAtYW0tc3ViZGlyLnNoCkBAIC0wLDAgKzEsNzIgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgYW0gcnVubmluZyBmcm9tIGEgc3ViZGlyZWN0b3J5JworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJZWNobyBoZWxsbyA+d29ybGQgJiYKKwlnaXQgYWRkIHdvcmxkICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSBpbml0aWFsICYmCisJZ2l0IHRhZyBpbml0aWFsICYmCisJZWNobyBnb29kYnllID53b3JsZCAmJgorCWdpdCBhZGQgd29ybGQgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIHNlY29uZCAmJgorCWdpdCBmb3JtYXQtcGF0Y2ggLS1zdGRvdXQgSEVBRF4gPnBhdGNoZmlsZSAmJgorCTogPmV4cGVjdAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhbSByZWd1bGFybHkgZnJvbSBzdGRpbicgJworCWdpdCBjaGVja291dCBpbml0aWFsICYmCisJZ2l0IGFtIDxwYXRjaGZpbGUgJiYKKwlnaXQgZGlmZiBtYXN0ZXIgPmFjdHVhbCAmJgorCXRlc3RfY21wIGV4cGVjdCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYW0gcmVndWxhcmx5IGZyb20gZmlsZScgJworCWdpdCBjaGVja291dCBpbml0aWFsICYmCisJZ2l0IGFtIHBhdGNoZmlsZSAmJgorCWdpdCBkaWZmIG1hc3RlciA+YWN0dWFsICYmCisJdGVzdF9jbXAgZXhwZWN0IGFjdHVhbAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhbSByZWd1bGFybHkgZnJvbSBzdGRpbiBpbiBzdWJkaXJlY3RvcnknICcKKwlybSAtZnIgc3ViZGlyICYmCisJZ2l0IGNoZWNrb3V0IGluaXRpYWwgJiYKKwkoCisJCW1rZGlyIC1wIHN1YmRpciAmJgorCQljZCBzdWJkaXIgJiYKKwkJZ2l0IGFtIDwuLi9wYXRjaGZpbGUKKwkpICYmCisJZ2l0IGRpZmYgbWFzdGVyPmFjdHVhbCAmJgorCXRlc3RfY21wIGV4cGVjdCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYW0gcmVndWxhcmx5IGZyb20gZmlsZSBpbiBzdWJkaXJlY3RvcnknICcKKwlybSAtZnIgc3ViZGlyICYmCisJZ2l0IGNoZWNrb3V0IGluaXRpYWwgJiYKKwkoCisJCW1rZGlyIC1wIHN1YmRpciAmJgorCQljZCBzdWJkaXIgJiYKKwkJZ2l0IGFtIC4uL3BhdGNoZmlsZQorCSkgJiYKKwlnaXQgZGlmZiBtYXN0ZXIgPmFjdHVhbCAmJgorCXRlc3RfY21wIGV4cGVjdCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYW0gcmVndWxhcmx5IGZyb20gZmlsZSBpbiBzdWJkaXJlY3Rvcnkgd2l0aCBmdWxsIHBhdGgnICcKKwlybSAtZnIgc3ViZGlyICYmCisJZ2l0IGNoZWNrb3V0IGluaXRpYWwgJiYKKwlQPSQocHdkKSAmJgorCSgKKwkJbWtkaXIgLXAgc3ViZGlyICYmCisJCWNkIHN1YmRpciAmJgorCQlnaXQgYW0gIiRQL3BhdGNoZmlsZSIKKwkpICYmCisJZ2l0IGRpZmYgbWFzdGVyID5hY3R1YWwgJiYKKwl0ZXN0X2NtcCBleHBlY3QgYWN0dWFsCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDIwMC1yZXJlcmUuc2ggYi90L3Q0MjAwLXJlcmVyZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zY2JmZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDIwMC1yZXJlcmUuc2gKQEAgLTAsMCArMSwyMDEgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgSm9oYW5uZXMgRS4gU2NoaW5kZWxpbgorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgcmVyZXJlCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCitjYXQgPiBhMSA8PCBFT0YKK1doZXRoZXIgJ3RpcyBub2JsZXIgaW4gdGhlIG1pbmQgdG8gc3VmZmVyCitUaGUgc2xpbmdzIGFuZCBhcnJvd3Mgb2Ygb3V0cmFnZW91cyBmb3J0dW5lLAorT3IgdG8gdGFrZSBhcm1zIGFnYWluc3QgYSBzZWEgb2YgdHJvdWJsZXMsCitBbmQgYnkgb3Bwb3NpbmcgZW5kIHRoZW0/IFRvIGRpZTogdG8gc2xlZXA7CitObyBtb3JlOyBhbmQgYnkgYSBzbGVlcCB0byBzYXkgd2UgZW5kCitUaGUgaGVhcnQtYWNoZSBhbmQgdGhlIHRob3VzYW5kIG5hdHVyYWwgc2hvY2tzCitUaGF0IGZsZXNoIGlzIGhlaXIgdG8sICd0aXMgYSBjb25zdW1tYXRpb24KK0Rldm91dGx5IHRvIGJlIHdpc2gnZC4KK0VPRgorCitnaXQgYWRkIGExCitnaXQgY29tbWl0IC1xIC1hIC1tIGluaXRpYWwKKworZ2l0IGNoZWNrb3V0IC1iIGZpcnN0CitjYXQgPj4gYTEgPDwgRU9GCitUbyBkaWUsIHRvIHNsZWVwOworVG8gc2xlZXA6IHBlcmNoYW5jZSB0byBkcmVhbTogYXksIHRoZXJlJ3MgdGhlIHJ1YjsKK0ZvciBpbiB0aGF0IHNsZWVwIG9mIGRlYXRoIHdoYXQgZHJlYW1zIG1heSBjb21lCitXaGVuIHdlIGhhdmUgc2h1ZmZsZWQgb2ZmIHRoaXMgbW9ydGFsIGNvaWwsCitNdXN0IGdpdmUgdXMgcGF1c2U6IHRoZXJlJ3MgdGhlIHJlc3BlY3QKK1RoYXQgbWFrZXMgY2FsYW1pdHkgb2Ygc28gbG9uZyBsaWZlOworRU9GCitnaXQgY29tbWl0IC1xIC1hIC1tIGZpcnN0CisKK2dpdCBjaGVja291dCAtYiBzZWNvbmQgbWFzdGVyCitnaXQgc2hvdyBmaXJzdDphMSB8CitzZWQgLWUgJ3MvVG8gZGllLCB0L1RvIGRpZSEgVC8nID4gYTEKK2VjaG8gIiogRU5EICoiID4+YTEKK2dpdCBjb21taXQgLXEgLWEgLW0gc2Vjb25kCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ25vdGhpbmcgcmVjb3JkZWQgd2l0aG91dCByZXJlcmUnICcKKwkocm0gLXJmIC5naXQvcnItY2FjaGU7IGdpdCBjb25maWcgcmVyZXJlLmVuYWJsZWQgZmFsc2UpICYmCisJISBnaXQgbWVyZ2UgZmlyc3QgJiYKKwkhIHRlc3QgLWQgLmdpdC9yci1jYWNoZQorJworCisjIGFjdGl2YXRlIHJlcmVyZSwgb2xkIHN0eWxlCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb25mbGljdGluZyBtZXJnZScgJworCWdpdCByZXNldCAtLWhhcmQgJiYKKwlta2RpciAuZ2l0L3JyLWNhY2hlICYmCisJZ2l0IGNvbmZpZyAtLXVuc2V0IHJlcmVyZS5lbmFibGVkICYmCisJISBnaXQgbWVyZ2UgZmlyc3QKKycKKworc2hhMT0kKHNlZCAtZSAncy8JLiovLycgLmdpdC9yci1jYWNoZS9NRVJHRV9SUikKK3JyPS5naXQvcnItY2FjaGUvJHNoYTEKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlY29yZGVkIHByZWltYWdlJyAiZ3JlcCA9PT09PT09ICRyci9wcmVpbWFnZSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVyZXJlLmVuYWJsZWQgd29ya3MsIHRvbycgJworCXJtIC1yZiAuZ2l0L3JyLWNhY2hlICYmCisJZ2l0IGNvbmZpZyByZXJlcmUuZW5hYmxlZCB0cnVlICYmCisJZ2l0IHJlc2V0IC0taGFyZCAmJgorCSEgZ2l0IG1lcmdlIGZpcnN0ICYmCisJZ3JlcCA9PT09PT09ICRyci9wcmVpbWFnZQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdubyBwb3N0aW1hZ2Ugb3IgdGhpc2ltYWdlIHlldCcgXAorCSJ0ZXN0ICEgLWYgJHJyL3Bvc3RpbWFnZSAtYSAhIC1mICRyci90aGlzaW1hZ2UiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ByZWltYWdlIGhhcyByaWdodCBudW1iZXIgb2YgbGluZXMnICcKKworCWNudD0kKHNlZCAtbmUgIi9ePDw8PDw8PC8sL14+Pj4+Pj4+L3AiICRyci9wcmVpbWFnZSB8IHdjIC1sKSAmJgorCXRlc3QgJGNudCA9IDkKKworJworCitnaXQgc2hvdyBmaXJzdDphMSA+IGExCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKKy0tLSBhL2ExCisrKysgYi9hMQorQEAgLTYsMTcgKzYsOSBAQAorIFRoZSBoZWFydC1hY2hlIGFuZCB0aGUgdGhvdXNhbmQgbmF0dXJhbCBzaG9ja3MKKyBUaGF0IGZsZXNoIGlzIGhlaXIgdG8sICd0aXMgYSBjb25zdW1tYXRpb24KKyBEZXZvdXRseSB0byBiZSB3aXNoJ2QuCistPDw8PDw8PAorLVRvIGRpZSEgVG8gc2xlZXA7CistPT09PT09PQorIFRvIGRpZSwgdG8gc2xlZXA7CistPj4+Pj4+PgorIFRvIHNsZWVwOiBwZXJjaGFuY2UgdG8gZHJlYW06IGF5LCB0aGVyZSdzIHRoZSBydWI7CisgRm9yIGluIHRoYXQgc2xlZXAgb2YgZGVhdGggd2hhdCBkcmVhbXMgbWF5IGNvbWUKKyBXaGVuIHdlIGhhdmUgc2h1ZmZsZWQgb2ZmIHRoaXMgbW9ydGFsIGNvaWwsCisgTXVzdCBnaXZlIHVzIHBhdXNlOiB0aGVyZSdzIHRoZSByZXNwZWN0CisgVGhhdCBtYWtlcyBjYWxhbWl0eSBvZiBzbyBsb25nIGxpZmU7CistPDw8PDw8PAorLT09PT09PT0KKy0qIEVORCAqCistPj4+Pj4+PgorRU9GCitnaXQgcmVyZXJlIGRpZmYgPiBvdXQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVyZXJlIGRpZmYnICdnaXQgZGlmZiBleHBlY3Qgb3V0JworCitjYXQgPiBleHBlY3QgPDwgRU9GCithMQorRU9GCisKK2dpdCByZXJlcmUgc3RhdHVzID4gb3V0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlcmVyZSBzdGF0dXMnICdnaXQgZGlmZiBleHBlY3Qgb3V0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb21taXQgc3VjY2VlZHMnIFwKKwkiZ2l0IGNvbW1pdCAtcSAtYSAtbSAncHJlZmVyIGZpcnN0IG92ZXIgc2Vjb25kJyIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVjb3JkZWQgcG9zdGltYWdlJyAidGVzdCAtZiAkcnIvcG9zdGltYWdlIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhbm90aGVyIGNvbmZsaWN0aW5nIG1lcmdlJyAnCisJZ2l0IGNoZWNrb3V0IC1iIHRoaXJkIG1hc3RlciAmJgorCWdpdCBzaG93IHNlY29uZF46YTEgfCBzZWQgInMvVG8gZGllOiB0L1RvIGRpZSEgVC8iID4gYTEgJiYKKwlnaXQgY29tbWl0IC1xIC1hIC1tIHRoaXJkICYmCisJISBnaXQgcHVsbCAuIGZpcnN0CisnCisKK2dpdCBzaG93IGZpcnN0OmExIHwgc2VkICdzL1RvIGRpZTogdC9UbyBkaWUhIFQvJyA+IGV4cGVjdAordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVyZXJlIGtpY2tlZCBpbicgIiEgZ3JlcCA9PT09PT09IGExIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZXJlcmUgcHJlZmVycyBmaXJzdCBjaGFuZ2UnICdnaXQgZGlmZiBhMSBleHBlY3QnCisKK3JtICRyci9wb3N0aW1hZ2UKK2VjaG8gIiRzaGExCWExIiB8IHBlcmwgLXBlICd5L1wwMTIvXDAwMC8nID4gLmdpdC9yci1jYWNoZS9NRVJHRV9SUgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZXJlcmUgY2xlYXInICdnaXQgcmVyZXJlIGNsZWFyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjbGVhciByZW1vdmVkIHRoZSBkaXJlY3RvcnknICJ0ZXN0ICEgLWQgJHJyIgorCitta2RpciAkcnIKK2VjaG8gSGVsbG8gPiAkcnIvcHJlaW1hZ2UKK2VjaG8gV29ybGQgPiAkcnIvcG9zdGltYWdlCisKK3NoYTI9NDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorcnIyPS5naXQvcnItY2FjaGUvJHNoYTIKK21rZGlyICRycjIKK2VjaG8gSGVsbG8gPiAkcnIyL3ByZWltYWdlCisKK2FsbW9zdF8xNV9kYXlzX2Fnbz0kKCg2MC0xNSo4NjQwMCkpCitqdXN0X292ZXJfMTVfZGF5c19hZ289JCgoLTEtMTUqODY0MDApKQorYWxtb3N0XzYwX2RheXNfYWdvPSQoKDYwLTYwKjg2NDAwKSkKK2p1c3Rfb3Zlcl82MF9kYXlzX2Fnbz0kKCgtMS02MCo4NjQwMCkpCisKK3Rlc3QtY2htdGltZSA9JGFsbW9zdF82MF9kYXlzX2FnbyAkcnIvcHJlaW1hZ2UKK3Rlc3QtY2htdGltZSA9JGFsbW9zdF8xNV9kYXlzX2FnbyAkcnIyL3ByZWltYWdlCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dhcmJhZ2UgY29sbGVjdGlvbiAocGFydDEpJyAnZ2l0IHJlcmVyZSBnYycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAneW91bmcgcmVjb3JkcyBzdGlsbCBsaXZlJyBcCisJInRlc3QgLWYgJHJyL3ByZWltYWdlICYmIHRlc3QgLWYgJHJyMi9wcmVpbWFnZSIKKwordGVzdC1jaG10aW1lID0kanVzdF9vdmVyXzYwX2RheXNfYWdvICRyci9wcmVpbWFnZQordGVzdC1jaG10aW1lID0kanVzdF9vdmVyXzE1X2RheXNfYWdvICRycjIvcHJlaW1hZ2UKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2FyYmFnZSBjb2xsZWN0aW9uIChwYXJ0MiknICdnaXQgcmVyZXJlIGdjJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdvbGQgcmVjb3JkcyByZXN0IGluIHBlYWNlJyBcCisJInRlc3QgISAtZiAkcnIvcHJlaW1hZ2UgJiYgdGVzdCAhIC1mICRycjIvcHJlaW1hZ2UiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZpbGUyIGFkZGVkIGRpZmZlcmVudGx5IGluIHR3byBicmFuY2hlcycgJworCWdpdCByZXNldCAtLWhhcmQgJiYKKwlnaXQgY2hlY2tvdXQgLWIgZm91cnRoICYmCisJZWNobyBIYWxsbyA+IGZpbGUyICYmCisJZ2l0IGFkZCBmaWxlMiAmJgorCWdpdCBjb21taXQgLW0gdmVyc2lvbjEgJiYKKwlnaXQgY2hlY2tvdXQgdGhpcmQgJiYKKwllY2hvIEJlbGxvID4gZmlsZTIgJiYKKwlnaXQgYWRkIGZpbGUyICYmCisJZ2l0IGNvbW1pdCAtbSB2ZXJzaW9uMiAmJgorCSEgZ2l0IG1lcmdlIGZvdXJ0aCAmJgorCXNoYTE9JChzZWQgLWUgInMvCS4qLy8iIC5naXQvcnItY2FjaGUvTUVSR0VfUlIpICYmCisJcnI9LmdpdC9yci1jYWNoZS8kc2hhMSAmJgorCWVjaG8gQ2VsbG8gPiBmaWxlMiAmJgorCWdpdCBhZGQgZmlsZTIgJiYKKwlnaXQgY29tbWl0IC1tIHJlc29sdXRpb24KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVzb2x1dGlvbiB3YXMgcmVjb3JkZWQgcHJvcGVybHknICcKKwlnaXQgcmVzZXQgLS1oYXJkIEhFQUR+MiAmJgorCWdpdCBjaGVja291dCAtYiBmaWZ0aCAmJgorCWVjaG8gSGFsbG8gPiBmaWxlMyAmJgorCWdpdCBhZGQgZmlsZTMgJiYKKwlnaXQgY29tbWl0IC1tIHZlcnNpb24xICYmCisJZ2l0IGNoZWNrb3V0IHRoaXJkICYmCisJZWNobyBCZWxsbyA+IGZpbGUzICYmCisJZ2l0IGFkZCBmaWxlMyAmJgorCWdpdCBjb21taXQgLW0gdmVyc2lvbjIgJiYKKwkhIGdpdCBtZXJnZSBmaWZ0aCAmJgorCWdpdCBkaWZmLWZpbGVzIC1xICYmCisJdGVzdCBDZWxsbyA9ICIkKGNhdCBmaWxlMykiCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDIwMS1zaG9ydGxvZy5zaCBiL3QvdDQyMDEtc2hvcnRsb2cuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDA1Yjk3MQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQyMDEtc2hvcnRsb2cuc2gKQEAgLTAsMCArMSw1NSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBKb2hhbm5lcyBFLiBTY2hpbmRlbGluCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBzaG9ydGxvZworJworCisuIC4vdGVzdC1saWIuc2gKKworZWNobyAxID4gYTEKK2dpdCBhZGQgYTEKK3RyZWU9JChnaXQgd3JpdGUtdHJlZSkKK2NvbW1pdD0kKCAoZWNobyAiVGVzdCI7IGVjaG8pIHwgZ2l0IGNvbW1pdC10cmVlICR0cmVlICkKK2dpdCB1cGRhdGUtcmVmIEhFQUQgJGNvbW1pdAorCitlY2hvIDIgPiBhMQorZ2l0IGNvbW1pdCAtLXF1aWV0IC1tICJUaGlzIGlzIGEgdmVyeSwgdmVyeSBsb25nIGZpcnN0IGxpbmUgZm9yIHRoZSBjb21taXQgbWVzc2FnZSB0byBzZWUgaWYgaXQgaXMgd3JhcHBlZCBjb3JyZWN0bHkiIGExCisKKyMgdGVzdCBpZiB0aGUgd3JhcHBpbmcgaXMgc3RpbGwgdmFsaWQgd2hlbiByZXBsYWNpbmcgYWxsIGkncyBieSB0cmVibGUgY2xlZnMuCitlY2hvIDMgPiBhMQorZ2l0IGNvbW1pdCAtLXF1aWV0IC1tICIkKGVjaG8gIlRoaXMgaXMgYSB2ZXJ5LCB2ZXJ5IGxvbmcgZmlyc3QgbGluZSBmb3IgdGhlIGNvbW1pdCBtZXNzYWdlIHRvIHNlZSBpZiBpdCBpcyB3cmFwcGVkIGNvcnJlY3RseSIgfCBzZWQgInMvaS8xMjM0L2ciIHwgdHIgMTIzNCAnXDM2MFwyMzVcMjA0XDIzNicpIiBhMQorCisjIG5vdyBmc2NrIHVwIHRoZSB1dGY4CitnaXQgY29uZmlnIGkxOG4uY29tbWl0ZW5jb2Rpbmcgbm9uLXV0Zi04CitlY2hvIDQgPiBhMQorZ2l0IGNvbW1pdCAtLXF1aWV0IC1tICIkKGVjaG8gIlRoaXMgaXMgYSB2ZXJ5LCB2ZXJ5IGxvbmcgZmlyc3QgbGluZSBmb3IgdGhlIGNvbW1pdCBtZXNzYWdlIHRvIHNlZSBpZiBpdCBpcyB3cmFwcGVkIGNvcnJlY3RseSIgfCBzZWQgInMvaS8xMjM0L2ciIHwgdHIgMTIzNCAnXDM3MFwyMzVcMjA0XDIzNicpIiBhMQorCitlY2hvIDUgPiBhMQorZ2l0IGNvbW1pdCAtLXF1aWV0IC1tICJhCQkJCQkJCQkxMgkzNAk1Ngk3OCIgYTEKKworZ2l0IHNob3J0bG9nIC13IEhFQUQgPiBvdXQKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorQSBVIFRob3IgKDUpOgorICAgICAgVGVzdAorICAgICAgVGhpcyBpcyBhIHZlcnksIHZlcnkgbG9uZyBmaXJzdCBsaW5lIGZvciB0aGUgY29tbWl0IG1lc3NhZ2UgdG8gc2VlIGlmCisgICAgICAgICBpdCBpcyB3cmFwcGVkIGNvcnJlY3RseQorICAgICAgVGjwnYSecyDwnYSecyBhIHZlcnksIHZlcnkgbG9uZyBm8J2EnnJzdCBs8J2Enm5lIGZvciB0aGUgY29tbfCdhJ50IG1lc3NhZ2UgdG8gc2VlIPCdhJ5mCisgICAgICAgICDwnYSedCDwnYSecyB3cmFwcGVkIGNvcnJlY3RseQorICAgICAgVGj4nYSecyD4nYSecyBhIHZlcnksIHZlcnkgbG9uZyBm+J2EnnJzdCBs+J2Enm5lIGZvciB0aGUgY29tbfidhJ50CisgICAgICAgICBtZXNzYWdlIHRvIHNlZSD4nYSeZiD4nYSedCD4nYSecyB3cmFwcGVkIGNvcnJlY3RseQorICAgICAgYQkJCQkJCQkJMTIJMzQKKyAgICAgICAgIDU2CTc4CisKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzaG9ydGxvZyB3cmFwcGluZycgJ3Rlc3RfY21wIGV4cGVjdCBvdXQnCisKK2dpdCBsb2cgSEVBRCA+IGxvZworR0lUX0RJUj1ub24tZXhpc3RpbmcgZ2l0IHNob3J0bG9nIC13IDwgbG9nID4gb3V0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Nob3J0bG9nIGZyb20gbm9uLWdpdCBkaXJlY3RvcnknICd0ZXN0X2NtcCBleHBlY3Qgb3V0JworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQyMDItbG9nLnNoIGIvdC90NDIwMi1sb2cuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjUzNjQ1NAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQyMDItbG9nLnNoCkBAIC0wLDAgKzEsNzQgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgbG9nJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwllY2hvIG9uZSA+b25lICYmCisJZ2l0IGFkZCBvbmUgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIGluaXRpYWwgJiYKKworCWVjaG8gaWNoaSA+b25lICYmCisJZ2l0IGFkZCBvbmUgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIHNlY29uZCAmJgorCisJbWtkaXIgYSAmJgorCWVjaG8gbmkgPmEvdHdvICYmCisJZ2l0IGFkZCBhL3R3byAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gdGhpcmQgJiYKKworCWVjaG8gc2FuID5hL3RocmVlICYmCisJZ2l0IGFkZCBhL3RocmVlICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSBmb3VydGggJiYKKworCWdpdCBybSBhL3RocmVlICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSBmaWZ0aAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2RpZmYtZmlsdGVyPUEnICcKKworCWFjdHVhbD0kKGdpdCBsb2cgLS1wcmV0dHk9ImZvcm1hdDolcyIgLS1kaWZmLWZpbHRlcj1BIEhFQUQpICYmCisJZXhwZWN0PSQoZWNobyBmb3VydGggOyBlY2hvIHRoaXJkIDsgZWNobyBpbml0aWFsKSAmJgorCXRlc3QgIiRhY3R1YWwiID0gIiRleHBlY3QiIHx8IHsKKwkJZWNobyBPb3BzCisJCWVjaG8gIkFjdHVhbDogJGFjdHVhbCIKKwkJZmFsc2UKKwl9CisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZGlmZi1maWx0ZXI9TScgJworCisJYWN0dWFsPSQoZ2l0IGxvZyAtLXByZXR0eT0iZm9ybWF0OiVzIiAtLWRpZmYtZmlsdGVyPU0gSEVBRCkgJiYKKwlleHBlY3Q9JChlY2hvIHNlY29uZCkgJiYKKwl0ZXN0ICIkYWN0dWFsIiA9ICIkZXhwZWN0IiB8fCB7CisJCWVjaG8gT29wcworCQllY2hvICJBY3R1YWw6ICRhY3R1YWwiCisJCWZhbHNlCisJfQorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2RpZmYtZmlsdGVyPUQnICcKKworCWFjdHVhbD0kKGdpdCBsb2cgLS1wcmV0dHk9ImZvcm1hdDolcyIgLS1kaWZmLWZpbHRlcj1EIEhFQUQpICYmCisJZXhwZWN0PSQoZWNobyBmaWZ0aCkgJiYKKwl0ZXN0ICIkYWN0dWFsIiA9ICIkZXhwZWN0IiB8fCB7CisJCWVjaG8gT29wcworCQllY2hvICJBY3R1YWw6ICRhY3R1YWwiCisJCWZhbHNlCisJfQorCisnCisKKworCit0ZXN0X2RvbmUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90L3Q1MDAwLXRhci10cmVlLnNoIGIvdC90NTAwMC10YXItdHJlZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kY2EyMDY3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTAwMC10YXItdHJlZS5zaApAQCAtMCwwICsxLDE3NCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoQykgMjAwNSBSZW5lIFNjaGFyZmUKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IHRhci10cmVlIGFuZCBnaXQgZ2V0LXRhci1jb21taXQtaWQgdGVzdAorCitUaGlzIHRlc3QgY292ZXJzIHRoZSB0b3BpY3Mgb2YgZmlsZSBjb250ZW50cywgY29tbWl0IGRhdGUgaGFuZGxpbmcgYW5kCitjb21taXQgaWQgZW1iZWRkaW5nOgorCisgIFRoZSBjb250ZW50cyBvZiB0aGUgcmVwb3NpdG9yeSBpcyBjb21wYXJlZCB0byB0aGUgZXh0cmFjdGVkIHRhcgorICBhcmNoaXZlLiAgVGhlIHJlcG9zaXRvcnkgY29udGFpbnMgc2ltcGxlIHRleHQgZmlsZXMsIHN5bWxpbmtzIGFuZCBhCisgIGJpbmFyeSBmaWxlICgvYmluL3NoKS4gIE9ubHkgcGF0aHMgc2hvcnRlciB0aGFuIDk5IGNoYXJhY3RlcnMgYXJlCisgIHVzZWQuCisKKyAgZ2l0IHRhci10cmVlIGFwcGxpZXMgdGhlIGNvbW1pdCBkYXRlIHRvIGV2ZXJ5IGZpbGUgaW4gdGhlIGFyY2hpdmUgaXQKKyAgY3JlYXRlcy4gIFRoZSB0ZXN0IHNldHMgdGhlIGNvbW1pdCBkYXRlIHRvIGEgc3BlY2lmaWMgdmFsdWUgYW5kIGNoZWNrcworICBpZiB0aGUgdGFyIGFyY2hpdmUgY29udGFpbnMgdGhhdCB2YWx1ZS4KKworICBXaGVuIGdpdmluZyBnaXQgdGFyLXRyZWUgYSBjb21taXQgaWQgKGluIGNvbnRyYXN0IHRvIGEgdHJlZSBpZCkgaXQKKyAgZW1iZWRzIHRoaXMgY29tbWl0IGlkIGludG8gdGhlIHRhciBhcmNoaXZlIGFzIGEgY29tbWVudC4gIFRoZSB0ZXN0CisgIGNoZWNrcyB0aGUgYWJpbGl0eSBvZiBnaXQgZ2V0LXRhci1jb21taXQtaWQgdG8gZmlndXJlIGl0IG91dCBmcm9tIHRoZQorICB0YXIgZmlsZS4KKworJworCisuIC4vdGVzdC1saWIuc2gKK1RBUj0ke1RBUjotdGFyfQorVU5aSVA9JHtVTlpJUDotdW56aXB9CisKK1NVQlNURk9STUFUPSVIJW4KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3BvcHVsYXRlIHdvcmtkaXInIFwKKyAgICAnbWtkaXIgYSBiIGMgJiYKKyAgICAgZWNobyBzaW1wbGUgdGV4dGZpbGUgPmEvYSAmJgorICAgICBta2RpciBhL2JpbiAmJgorICAgICBjcCAvYmluL3NoIGEvYmluICYmCisgICAgIHByaW50ZiAiQVwkRm9ybWF0OiVzXCRPIiAiJFNVQlNURk9STUFUIiA+YS9zdWJzdGZpbGUxICYmCisgICAgIHByaW50ZiAiQSBub3Qgc3Vic3RpdHV0ZWQgTyIgPmEvc3Vic3RmaWxlMiAmJgorICAgICBsbiAtcyBhIGEvbDEgJiYKKyAgICAgKHA9bG9uZ19wYXRoX3RvX2FfZmlsZSAmJiBjZCBhICYmCisgICAgICBmb3IgZGVwdGggaW4gMSAyIDMgNCA1OyBkbyBta2RpciAkcCAmJiBjZCAkcDsgZG9uZSAmJgorICAgICAgZWNobyB0ZXh0ID5maWxlX3dpdGhfbG9uZ19wYXRoKSAmJgorICAgICAoY2QgYSAmJiBmaW5kIC4pIHwgc29ydCA+YS5sc3QnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdhZGQgZmlsZXMgdG8gcmVwb3NpdG9yeScgXAorICAgICdmaW5kIGEgLXR5cGUgZiB8IHhhcmdzIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgJiYKKyAgICAgZmluZCBhIC10eXBlIGwgfCB4YXJncyBnaXQgdXBkYXRlLWluZGV4IC0tYWRkICYmCisgICAgIHRyZWVpZD1gZ2l0IHdyaXRlLXRyZWVgICYmCisgICAgIGVjaG8gJHRyZWVpZCA+dHJlZWlkICYmCisgICAgIGdpdCB1cGRhdGUtcmVmIEhFQUQgJChUWj1HTVQgR0lUX0NPTU1JVFRFUl9EQVRFPSIyMDA1LTA1LTI3IDIyOjAwOjAwIiBcCisgICAgIGdpdCBjb21taXQtdHJlZSAkdHJlZWlkIDwvZGV2L251bGwpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0IGFyY2hpdmUnIFwKKyAgICAnZ2l0IGFyY2hpdmUgSEVBRCA+Yi50YXInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgdGFyLXRyZWUnIFwKKyAgICAnZ2l0IHRhci10cmVlIEhFQUQgPmIyLnRhcicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBhcmNoaXZlIHZzLiBnaXQgdGFyLXRyZWUnIFwKKyAgICAnZGlmZiBiLnRhciBiMi50YXInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lJyBcCisgICAgJ1RaPUdNVCAkVEFSIHR2ZiBiLnRhciBhL2EgfAorICAgICBhd2sgXHtwcmludFwgXCQ0LFwgXChsZW5ndGhcKFwkNVwpXDw3XClcID9cIFwkNVwiOjAwXCJcIDpcIFwkNVx9IFwKKyAgICAgPmIubXRpbWUgJiYKKyAgICAgZWNobyAiMjAwNS0wNS0yNyAyMjowMDowMCIgPmV4cGVjdGVkLm10aW1lICYmCisgICAgIGRpZmYgZXhwZWN0ZWQubXRpbWUgYi5tdGltZScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBnZXQtdGFyLWNvbW1pdC1pZCcgXAorICAgICdnaXQgZ2V0LXRhci1jb21taXQtaWQgPGIudGFyID5iLmNvbW1pdGlkICYmCisgICAgIGRpZmYgLmdpdC8kKGdpdCBzeW1ib2xpYy1yZWYgSEVBRCkgYi5jb21taXRpZCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2V4dHJhY3QgdGFyIGFyY2hpdmUnIFwKKyAgICAnKGNkIGIgJiYgJFRBUiB4ZiAtKSA8Yi50YXInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBmaWxlbmFtZXMnIFwKKyAgICAnKGNkIGIvYSAmJiBmaW5kIC4pIHwgc29ydCA+Yi5sc3QgJiYKKyAgICAgZGlmZiBhLmxzdCBiLmxzdCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIGZpbGUgY29udGVudHMnIFwKKyAgICAnZGlmZiAtciBhIGIvYScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCB0YXItdHJlZSB3aXRoIHByZWZpeCcgXAorICAgICdnaXQgdGFyLXRyZWUgSEVBRCBwcmVmaXggPmMudGFyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZXh0cmFjdCB0YXIgYXJjaGl2ZSB3aXRoIHByZWZpeCcgXAorICAgICcoY2QgYyAmJiAkVEFSIHhmIC0pIDxjLnRhcicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIGZpbGVuYW1lcyB3aXRoIHByZWZpeCcgXAorICAgICcoY2QgYy9wcmVmaXgvYSAmJiBmaW5kIC4pIHwgc29ydCA+Yy5sc3QgJiYKKyAgICAgZGlmZiBhLmxzdCBjLmxzdCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIGZpbGUgY29udGVudHMgd2l0aCBwcmVmaXgnIFwKKyAgICAnZGlmZiAtciBhIGMvcHJlZml4L2EnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjcmVhdGUgYW4gYXJjaGl2ZSB3aXRoIGEgc3Vic3RmaWxlcycgXAorICAgICdlY2hvICJzdWJzdGZpbGU/IiBleHBvcnQtc3Vic3QgPmEvLmdpdGF0dHJpYnV0ZXMgJiYKKyAgICAgZ2l0IGFyY2hpdmUgSEVBRCA+Zi50YXIgJiYKKyAgICAgcm0gYS8uZ2l0YXR0cmlidXRlcycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2V4dHJhY3Qgc3Vic3RmaWxlcycgXAorICAgICcobWtkaXIgZiAmJiBjZCBmICYmICRUQVIgeGYgLSkgPGYudGFyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAgJ3ZhbGlkYXRlIHN1YnN0ZmlsZSBjb250ZW50cycgXAorICAgICAnZ2l0IGxvZyAtLW1heC1jb3VudD0xICItLXByZXR0eT1mb3JtYXQ6QSR7U1VCU1RGT1JNQVR9TyIgSEVBRCBcCisgICAgICA+Zi9hL3N1YnN0ZmlsZTEuZXhwZWN0ZWQgJiYKKyAgICAgIGRpZmYgZi9hL3N1YnN0ZmlsZTEuZXhwZWN0ZWQgZi9hL3N1YnN0ZmlsZTEgJiYKKyAgICAgIGRpZmYgYS9zdWJzdGZpbGUyIGYvYS9zdWJzdGZpbGUyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgYXJjaGl2ZSAtLWZvcm1hdD16aXAnIFwKKyAgICAnZ2l0IGFyY2hpdmUgLS1mb3JtYXQ9emlwIEhFQUQgPmQuemlwJworCiskVU5aSVAgLXYgPi9kZXYvbnVsbCAyPiYxCitpZiBbICQ/IC1lcSAxMjcgXTsgdGhlbgorCWVjaG8gIlNraXBwaW5nIFpJUCB0ZXN0cywgYmVjYXVzZSB1bnppcCB3YXMgbm90IGZvdW5kIgorCXRlc3RfZG9uZQorCWV4aXQKK2ZpCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdleHRyYWN0IFpJUCBhcmNoaXZlJyBcCisgICAgJyhta2RpciBkICYmIGNkIGQgJiYgJFVOWklQIC4uL2QuemlwKScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIGZpbGVuYW1lcycgXAorICAgICcoY2QgZC9hICYmIGZpbmQgLikgfCBzb3J0ID5kLmxzdCAmJgorICAgICBkaWZmIGEubHN0IGQubHN0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgZmlsZSBjb250ZW50cycgXAorICAgICdkaWZmIC1yIGEgZC9hJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0IGFyY2hpdmUgLS1mb3JtYXQ9emlwIHdpdGggcHJlZml4JyBcCisgICAgJ2dpdCBhcmNoaXZlIC0tZm9ybWF0PXppcCAtLXByZWZpeD1wcmVmaXgvIEhFQUQgPmUuemlwJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZXh0cmFjdCBaSVAgYXJjaGl2ZSB3aXRoIHByZWZpeCcgXAorICAgICcobWtkaXIgZSAmJiBjZCBlICYmICRVTlpJUCAuLi9lLnppcCknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBmaWxlbmFtZXMgd2l0aCBwcmVmaXgnIFwKKyAgICAnKGNkIGUvcHJlZml4L2EgJiYgZmluZCAuKSB8IHNvcnQgPmUubHN0ICYmCisgICAgIGRpZmYgYS5sc3QgZS5sc3QnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBmaWxlIGNvbnRlbnRzIHdpdGggcHJlZml4JyBcCisgICAgJ2RpZmYgLXIgYSBlL3ByZWZpeC9hJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0IGFyY2hpdmUgLS1saXN0IG91dHNpZGUgb2YgYSBnaXQgcmVwbycgXAorICAgICdHSVRfRElSPXNvbWUvbm9uLWV4aXN0aW5nL2RpcmVjdG9yeSBnaXQgYXJjaGl2ZSAtLWxpc3QnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NTEwMC1tYWlsaW5mby5zaCBiL3QvdDUxMDAtbWFpbGluZm8uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDZjNTVjMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAtbWFpbGluZm8uc2gKQEAgLTAsMCArMSwyOCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgbWFpbGluZm8gYW5kIGdpdCBtYWlsc3BsaXQgdGVzdCcKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NwbGl0IHNhbXBsZSBib3gnIFwKKwknZ2l0IG1haWxzcGxpdCAtby4gLi4vdDUxMDAvc2FtcGxlLm1ib3ggPmxhc3QgJiYKKwlsYXN0PWBjYXQgbGFzdGAgJiYKKwllY2hvIHRvdGFsIGlzICRsYXN0ICYmCisJdGVzdCBgY2F0IGxhc3RgID0gOScKKworZm9yIG1haWwgaW4gYGVjaG8gMDAqYAorZG8KKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICJtYWlsaW5mbyAkbWFpbCIgXAorCQkiZ2l0IG1haWxpbmZvIC11IG1zZyRtYWlsIHBhdGNoJG1haWwgPCRtYWlsID5pbmZvJG1haWwgJiYKKwkJZWNobyBtc2cgJiYKKwkJZGlmZiAuLi90NTEwMC9tc2ckbWFpbCBtc2ckbWFpbCAmJgorCQllY2hvIHBhdGNoICYmCisJCWRpZmYgLi4vdDUxMDAvcGF0Y2gkbWFpbCBwYXRjaCRtYWlsICYmCisJCWVjaG8gaW5mbyAmJgorCQlkaWZmIC4uL3Q1MTAwL2luZm8kbWFpbCBpbmZvJG1haWwiCitkb25lCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NTEwMC9pbmZvMDAwMSBiL3QvdDUxMDAvaW5mbzAwMDEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwNTI3NwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvaW5mbzAwMDEKQEAgLTAsMCArMSw1IEBACitBdXRob3I6IEEgVSBUaG9yCitFbWFpbDogYS51LnRob3JAZXhhbXBsZS5jb20KK1N1YmplY3Q6IGEgY29tbWl0LgorRGF0ZTogRnJpLCA5IEp1biAyMDA2IDAwOjQ0OjE2IC0wNzAwCisKZGlmZiAtLWdpdCBhL3QvdDUxMDAvaW5mbzAwMDIgYi90L3Q1MTAwL2luZm8wMDAyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YmIwZmUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MTAwL2luZm8wMDAyCkBAIC0wLDAgKzEsNSBAQAorQXV0aG9yOiBBIFUgVGhvcgorRW1haWw6IGEudS50aG9yQGV4YW1wbGUuY29tCitTdWJqZWN0OiBhbm90aGVyIHBhdGNoCitEYXRlOiBGcmksIDkgSnVuIDIwMDYgMDA6NDQ6MTYgLTA3MDAKKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9pbmZvMDAwMyBiL3QvdDUxMDAvaW5mbzAwMDMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQwZDEyMgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvaW5mbzAwMDMKQEAgLTAsMCArMSw1IEBACitBdXRob3I6IEEgVSBUaG9yCitFbWFpbDogYS51LnRob3JAZXhhbXBsZS5jb20KK1N1YmplY3Q6IHRoaXJkIHBhdGNoCitEYXRlOiBGcmksIDkgSnVuIDIwMDYgMDA6NDQ6MTYgLTA3MDAKKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9pbmZvMDAwNCBiL3QvdDUxMDAvaW5mbzAwMDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE2YzMwOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvaW5mbzAwMDQKQEAgLTAsMCArMSw1IEBACitBdXRob3I6IFlPU0hJRlVKSSBIaWRlYWtpIC8g5ZCJ6Jek6Iux5piOCitFbWFpbDogeW9zaGZ1amlAbGludXgtaXB2Ni5vcmcKK1N1YmplY3Q6IEdJVDogVHJ5IGFsbCBhZGRyZXNzZXMgZm9yIGdpdmVuIHJlbW90ZSBuYW1lCitEYXRlOiBUaHUsIDIxIEp1bCAyMDA1IDA5OjEwOjM2IC0wNDAwIChFRFQpCisKZGlmZiAtLWdpdCBhL3QvdDUxMDAvaW5mbzAwMDUgYi90L3Q1MTAwL2luZm8wMDA1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YTQ2ZmMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MTAwL2luZm8wMDA1CkBAIC0wLDAgKzEsNSBAQAorQXV0aG9yOiBEYXZpZCBLw6VnZWRhbAorRW1haWw6IGRhdmlka0BseXNhdG9yLmxpdS5zZQorU3ViamVjdDogRml4ZWQgdHdvIGJ1Z3MgaW4gZ2l0LWN2c2ltcG9ydC1zY3JpcHQuCitEYXRlOiBNb24sIDE1IEF1ZyAyMDA1IDIwOjE4OjI1ICswMjAwCisKZGlmZiAtLWdpdCBhL3QvdDUxMDAvaW5mbzAwMDYgYi90L3Q1MTAwL2luZm8wMDA2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMDUyNzcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MTAwL2luZm8wMDA2CkBAIC0wLDAgKzEsNSBAQAorQXV0aG9yOiBBIFUgVGhvcgorRW1haWw6IGEudS50aG9yQGV4YW1wbGUuY29tCitTdWJqZWN0OiBhIGNvbW1pdC4KK0RhdGU6IEZyaSwgOSBKdW4gMjAwNiAwMDo0NDoxNiAtMDcwMAorCmRpZmYgLS1naXQgYS90L3Q1MTAwL2luZm8wMDA3IGIvdC90NTEwMC9pbmZvMDAwNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWJiMGZlCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9pbmZvMDAwNwpAQCAtMCwwICsxLDUgQEAKK0F1dGhvcjogQSBVIFRob3IKK0VtYWlsOiBhLnUudGhvckBleGFtcGxlLmNvbQorU3ViamVjdDogYW5vdGhlciBwYXRjaAorRGF0ZTogRnJpLCA5IEp1biAyMDA2IDAwOjQ0OjE2IC0wNzAwCisKZGlmZiAtLWdpdCBhL3QvdDUxMDAvaW5mbzAwMDggYi90L3Q1MTAwL2luZm8wMDA4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YTI5NTEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MTAwL2luZm8wMDA4CkBAIC0wLDAgKzEsNSBAQAorQXV0aG9yOiBKdW5pbyBDIEhhbWFubworRW1haWw6IGp1bmlvQGtlcm5lbC5vcmcKK1N1YmplY3Q6IGFub3RoZXIgcGF0Y2gKK0RhdGU6IEZyaSwgOSBKdW4gMjAwNiAwMDo0NDoxNiAtMDcwMAorCmRpZmYgLS1naXQgYS90L3Q1MTAwL2luZm8wMDA5IGIvdC90NTEwMC9pbmZvMDAwOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTY2MzIxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9pbmZvMDAwOQpAQCAtMCwwICsxLDUgQEAKK0F1dGhvcjogRiBVIEJhcgorRW1haWw6IGYudS5iYXJAZXhhbXBsZS5jb20KK1N1YmplY3Q6IHVwZGF0ZXMKK0RhdGU6IE1vbiwgMTcgU2VwIDIwMDEgMDA6MDA6MDAgKzA5MDAKKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9tc2cwMDAxIGIvdC90NTEwMC9tc2cwMDAxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNzVhOWEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MTAwL21zZzAwMDEKQEAgLTAsMCArMSwyIEBACitIZXJlIGlzIGEgcGF0Y2ggZnJvbSBBIFUgVGhvci4KKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9tc2cwMDAyIGIvdC90NTEwMC9tc2cwMDAyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNTQ2ZWMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MTAwL21zZzAwMDIKQEAgLTAsMCArMSwyMSBAQAorSGVyZSBpcyBhIHBhdGNoIGZyb20gQSBVIFRob3IuICBUaGlzIGFkZHJlc3NlcyB0aGUgaXNzdWUgcmFpc2VkIGluIHRoZQorbWVzc2FnZToKKworRnJvbTogTml0IFBpY2tlciA8bml0LnBpY2tlckBleGFtcGxlLm5ldD4KK1N1YmplY3Q6IGZvbyBpcyB0b28gb2xkCitNZXNzYWdlLUlkOiA8bml0cGlja2VyLjEyMTIxMjEyQGV4YW1wbGUubmV0PgorCitIb3BlZnVsbHkgdGhpcyB3b3VsZCBmaXggdGhlIHByb2JsZW0gc3RhdGVkIHRoZXJlLgorCisKK0kgaGF2ZSBpbmNsdWRlZCBhbiBleHRyYSBibGFuayBsaW5lIGFib3ZlLCBidXQgaXQgZG9lcyBub3QgaGF2ZSB0byBiZQorc3RyaXBwZWQgYXdheSBoZXJlLCBhbG9uZyB3aXRoIHRoZSAgICAgICAgICAgICAgIAkJICAgCit3aGl0ZXNwYWNlcyBhdCB0aGUgZW5kIG9mIHRoZSBhYm92ZSBsaW5lLiAgVGhleSBhcmUgZXhwZWN0ZWQgdG8gYmUgc3F1YXNoZWQKK3doZW4gdGhlIG1lc3NhZ2UgaXMgbWFkZSBpbnRvIGEgY29tbWl0IGxvZyBieSBzdHJpcHNwYWNlLAorQWxzbywgdGhlcmUgYXJlIHRocmVlIGJsYW5rIGxpbmVzIGFmdGVyIHRoaXMgcGFyYWdyYXBoLAordHdvIHRydWx5IGJsYW5rIGFuZCBhbm90aGVyIGZ1bGwgb2Ygc3BhY2VzIGluIGJldHdlZW4uCisKKyAgICAgICAgICAgIAorCitIb3BlIHRoaXMgaGVscHMuCisKZGlmZiAtLWdpdCBhL3QvdDUxMDAvbXNnMDAwMyBiL3QvdDUxMDAvbXNnMDAwMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWM2ODEwCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9tc2cwMDAzCkBAIC0wLDAgKzEsOSBAQAorSGVyZSBpcyBhIHBhdGNoIGZyb20gQSBVIFRob3IuICBUaGlzIGFkZHJlc3NlcyB0aGUgaXNzdWUgcmFpc2VkIGluIHRoZQorbWVzc2FnZToKKworRnJvbTogTml0IFBpY2tlciA8bml0LnBpY2tlckBleGFtcGxlLm5ldD4KK1N1YmplY3Q6IGZvbyBpcyB0b28gb2xkCitNZXNzYWdlLUlkOiA8bml0cGlja2VyLjEyMTIxMjEyQGV4YW1wbGUubmV0PgorCitIb3BlZnVsbHkgdGhpcyB3b3VsZCBmaXggdGhlIHByb2JsZW0gc3RhdGVkIHRoZXJlLgorCmRpZmYgLS1naXQgYS90L3Q1MTAwL21zZzAwMDQgYi90L3Q1MTAwL21zZzAwMDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4YmEzYgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvbXNnMDAwNApAQCAtMCwwICsxLDcgQEAKK0hlbGxvLgorCitUcnkgYWxsIGFkZHJlc3NlcyBmb3IgZ2l2ZW4gcmVtb3RlIG5hbWUgdW50aWwgaXQgc3VjY2VlZHMuCitBbHNvIHN1cHBvcnRzIElQdjYuCisKK1NpZ25lZC1vZi1ieTogSGlkZWFraSBZT1NISUZVSkkgPHlvc2hmdWppQGxpbnV4LWlwdjYub3JnPgorCmRpZmYgLS1naXQgYS90L3Q1MTAwL21zZzAwMDUgYi90L3Q1MTAwL21zZzAwMDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ5NGNkNwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvbXNnMDAwNQpAQCAtMCwwICsxLDEzIEBACitUaGUgZ2l0LWN2c2ltcG9ydC1zY3JpcHQgaGFkIGEgY29wdWxlIG9mIHNtYWxsIGJ1Z3MgdGhhdCBwcmV2ZW50ZWQgbWUKK2Zyb20gaW1wb3J0aW5nIGEgYmlnIENWUyByZXBvc2l0b3J5LgorCitUaGUgZmlyc3Qgd2FzIHRoYXQgaXQgZGlkbid0IGhhbmRsZSByZW1vdmVkIGZpbGVzIHdpdGggYSBtdWx0aS1kaWdpdAorcHJpbWFyeSByZXZpc2lvbiBudW1iZXIuCisKK1RoZSBzZWNvbmQgd2FzIHRoYXQgaXQgd2FzIGFza2luZyB0aGUgQ1ZTIHNlcnZlciBmb3IgIkYiIG1lc3NhZ2VzLAorYWx0aG91Z2ggdGhleSB3ZXJlIG5vdCBoYW5kbGVkLgorCitJIGFsc28gdXBkYXRlZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhhdCBzY3JpcHQgdG8gY29ycmVzcG9uZCB0bworYWN0dWFsIGZsYWdzLgorCitTaWduZWQtb2ZmLWJ5OiBEYXZpZCBLw6VnZWRhbCA8ZGF2aWRrQGx5c2F0b3IubGl1LnNlPgpkaWZmIC0tZ2l0IGEvdC90NTEwMC9tc2cwMDA2IGIvdC90NTEwMC9tc2cwMDA2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNzVhOWEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MTAwL21zZzAwMDYKQEAgLTAsMCArMSwyIEBACitIZXJlIGlzIGEgcGF0Y2ggZnJvbSBBIFUgVGhvci4KKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9tc2cwMDA3IGIvdC90NTEwMC9tc2cwMDA3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYjIzYzAKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MTAwL21zZzAwMDcKQEAgLTAsMCArMSwyIEBACitIZXJlIGlzIGFuIGVtcHR5IHBhdGNoIGZyb20gQSBVIFRob3IuCisKZGlmZiAtLWdpdCBhL3QvdDUxMDAvbXNnMDAwOCBiL3QvdDUxMDAvbXNnMDAwOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODBlY2I5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9tc2cwMDA4CkBAIC0wLDAgKzEsNCBAQAorPkhlcmUgaXMgYW4gZW1wdHkgcGF0Y2ggZnJvbSBBIFUgVGhvci4KKworSGV5IHlvdSBmb3Jnb3QgdGhlIHBhdGNoIQorCmRpZmYgLS1naXQgYS90L3Q1MTAwL21zZzAwMDkgYi90L3Q1MTAwL21zZzAwMDkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZmZTEzMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvbXNnMDAwOQpAQCAtMCwwICsxLDIgQEAKK1RoaXMgaXMgdG8gZml4IGRpZmYtZm9ybWF0IGRvY3VtZW50YXRpb24uCisKZGlmZiAtLWdpdCBhL3QvdDUxMDAvcGF0Y2gwMDAxIGIvdC90NTEwMC9wYXRjaDAwMDEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlMTU1MQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvcGF0Y2gwMDAxCkBAIC0wLDAgKzEsMTQgQEAKKy0tLQorIGZvbyB8ICAgIDIgKy0KKyAxIGZpbGVzIGNoYW5nZWQsIDEgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2ZvbyBiL2ZvbworaW5kZXggOTEyM2NkYy4uOTE4ZGNmOCAxMDA2NDQKKy0tLSBhL2ZvbworKysrIGIvZm9vCitAQCAtMSArMSBAQAorLUZyaSBKdW4gIDkgMDA6NDQ6MDQgUERUIDIwMDYKKytGcmkgSnVuICA5IDAwOjQ0OjEzIFBEVCAyMDA2CistLSAKKzEuNC4wLmc2ZjJiCisKZGlmZiAtLWdpdCBhL3QvdDUxMDAvcGF0Y2gwMDAyIGIvdC90NTEwMC9wYXRjaDAwMDIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlMTU1MQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvcGF0Y2gwMDAyCkBAIC0wLDAgKzEsMTQgQEAKKy0tLQorIGZvbyB8ICAgIDIgKy0KKyAxIGZpbGVzIGNoYW5nZWQsIDEgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2ZvbyBiL2ZvbworaW5kZXggOTEyM2NkYy4uOTE4ZGNmOCAxMDA2NDQKKy0tLSBhL2ZvbworKysrIGIvZm9vCitAQCAtMSArMSBAQAorLUZyaSBKdW4gIDkgMDA6NDQ6MDQgUERUIDIwMDYKKytGcmkgSnVuICA5IDAwOjQ0OjEzIFBEVCAyMDA2CistLSAKKzEuNC4wLmc2ZjJiCisKZGlmZiAtLWdpdCBhL3QvdDUxMDAvcGF0Y2gwMDAzIGIvdC90NTEwMC9wYXRjaDAwMDMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlMTU1MQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvcGF0Y2gwMDAzCkBAIC0wLDAgKzEsMTQgQEAKKy0tLQorIGZvbyB8ICAgIDIgKy0KKyAxIGZpbGVzIGNoYW5nZWQsIDEgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2ZvbyBiL2ZvbworaW5kZXggOTEyM2NkYy4uOTE4ZGNmOCAxMDA2NDQKKy0tLSBhL2ZvbworKysrIGIvZm9vCitAQCAtMSArMSBAQAorLUZyaSBKdW4gIDkgMDA6NDQ6MDQgUERUIDIwMDYKKytGcmkgSnVuICA5IDAwOjQ0OjEzIFBEVCAyMDA2CistLSAKKzEuNC4wLmc2ZjJiCisKZGlmZiAtLWdpdCBhL3QvdDUxMDAvcGF0Y2gwMDA0IGIvdC90NTEwMC9wYXRjaDAwMDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk2NDU4ZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvcGF0Y2gwMDA0CkBAIC0wLDAgKzEsOTMgQEAKK2RpZmYgLS1naXQgYS9jb25uZWN0LmMgYi9jb25uZWN0LmMKKy0tLSBhL2Nvbm5lY3QuYworKysrIGIvY29ubmVjdC5jCitAQCAtOTYsNDIgKzk2LDU3IEBAIHN0YXRpYyBlbnVtIHByb3RvY29sIGdldF9wcm90b2NvbChjb25zdCAKKyAJZGllKCJJIGRvbid0IGhhbmRsZSBwcm90b2NvbCAnJXMnIiwgbmFtZSk7CisgfQorIAorLXN0YXRpYyB2b2lkIGxvb2t1cF9ob3N0KGNvbnN0IGNoYXIgKmhvc3QsIHN0cnVjdCBzb2NrYWRkciAqaW4pCisteworLQlzdHJ1Y3QgYWRkcmluZm8gKnJlczsKKy0JaW50IHJldDsKKy0KKy0JcmV0ID0gZ2V0YWRkcmluZm8oaG9zdCwgTlVMTCwgTlVMTCwgJnJlcyk7CistCWlmIChyZXQpCistCQlkaWUoIlVuYWJsZSB0byBsb29rIHVwICVzICglcykiLCBob3N0LCBnYWlfc3RyZXJyb3IocmV0KSk7CistCSppbiA9ICpyZXMtPmFpX2FkZHI7CistCWZyZWVhZGRyaW5mbyhyZXMpOworLX0KKysjZGVmaW5lIFNUUl8ocykJIyBzCisrI2RlZmluZSBTVFIocykJU1RSXyhzKQorIAorIHN0YXRpYyBpbnQgZ2l0X3RjcF9jb25uZWN0KGludCBmZFsyXSwgY29uc3QgY2hhciAqcHJvZywgY2hhciAqaG9zdCwgY2hhciAqcGF0aCkKKyB7CistCXN0cnVjdCBzb2NrYWRkciBhZGRyOworLQlpbnQgcG9ydCA9IERFRkFVTFRfR0lUX1BPUlQsIHNvY2tmZDsKKy0JY2hhciAqY29sb247CistCistCWNvbG9uID0gc3RyY2hyKGhvc3QsICc6Jyk7CistCWlmIChjb2xvbikgeworLQkJY2hhciAqZW5kOworLQkJdW5zaWduZWQgbG9uZyBuID0gc3RydG91bChjb2xvbisxLCAmZW5kLCAwKTsKKy0JCWlmIChjb2xvblsxXSAmJiAhKmVuZCkgeworLQkJCSpjb2xvbiA9IDA7CistCQkJcG9ydCA9IG47CisrCWludCBzb2NrZmQgPSAtMTsKKysJY2hhciAqY29sb24sICplbmQ7CisrCWNoYXIgKnBvcnQgPSBTVFIoREVGQVVMVF9HSVRfUE9SVCk7CisrCXN0cnVjdCBhZGRyaW5mbyBoaW50cywgKmFpMCwgKmFpOworKwlpbnQgZ2FpOworKworKwlpZiAoaG9zdFswXSA9PSAnWycpIHsKKysJCWVuZCA9IHN0cmNocihob3N0ICsgMSwgJ10nKTsKKysJCWlmIChlbmQpIHsKKysJCQkqZW5kID0gMDsKKysJCQllbmQrKzsKKysJCQlob3N0Kys7CisrCQl9IGVsc2UKKysJCQllbmQgPSBob3N0OworKwl9IGVsc2UKKysJCWVuZCA9IGhvc3Q7CisrCWNvbG9uID0gc3RyY2hyKGVuZCwgJzonKTsKKysKKysJaWYgKGNvbG9uKQorKwkJcG9ydCA9IGNvbG9uICsgMTsKKysKKysJbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisrCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisrCWhpbnRzLmFpX3Byb3RvY29sID0gSVBQUk9UT19UQ1A7CisrCisrCWdhaSA9IGdldGFkZHJpbmZvKGhvc3QsIHBvcnQsICZoaW50cywgJmFpKTsKKysJaWYgKGdhaSkKKysJCWRpZSgiVW5hYmxlIHRvIGxvb2sgdXAgJXMgKCVzKSIsIGhvc3QsIGdhaV9zdHJlcnJvcihnYWkpKTsKKysKKysJZm9yIChhaTAgPSBhaTsgYWk7IGFpID0gYWktPmFpX25leHQpIHsKKysJCXNvY2tmZCA9IHNvY2tldChhaS0+YWlfZmFtaWx5LCBhaS0+YWlfc29ja3R5cGUsIGFpLT5haV9wcm90b2NvbCk7CisrCQlpZiAoc29ja2ZkIDwgMCkKKysJCQljb250aW51ZTsKKysJCWlmIChjb25uZWN0KHNvY2tmZCwgYWktPmFpX2FkZHIsIGFpLT5haV9hZGRybGVuKSA8IDApIHsKKysJCQljbG9zZShzb2NrZmQpOworKwkJCXNvY2tmZCA9IC0xOworKwkJCWNvbnRpbnVlOworIAkJfQorKwkJYnJlYWs7CisgCX0KKyAKKy0JbG9va3VwX2hvc3QoaG9zdCwgJmFkZHIpOworLQkoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZhZGRyKS0+c2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKysJZnJlZWFkZHJpbmZvKGFpMCk7CisgCistCXNvY2tmZCA9IHNvY2tldChQRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19JUCk7CisgCWlmIChzb2NrZmQgPCAwKQorIAkJZGllKCJ1bmFibGUgdG8gY3JlYXRlIHNvY2tldCAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKKy0JaWYgKGNvbm5lY3Qoc29ja2ZkLCAodm9pZCAqKSZhZGRyLCBzaXplb2YoYWRkcikpIDwgMCkKKy0JCWRpZSgidW5hYmxlIHRvIGNvbm5lY3QgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CisrCisgCWZkWzBdID0gc29ja2ZkOworIAlmZFsxXSA9IHNvY2tmZDsKKyAJcGFja2V0X3dyaXRlKHNvY2tmZCwgIiVzICVzXG4iLCBwcm9nLCBwYXRoKTsKKworLS0gCitZT1NISUZVSkkgSGlkZWFraSBAIFVTQUdJIFByb2plY3QgIDx5b3NoZnVqaUBsaW51eC1pcHY2Lm9yZz4KK0dQRy1GUCAgOiA5MDIyIDY1RUIgMUVDRiAzQUQxIDBCREYgIDgwRDggNDgwNyBGODk0IEUwNjIgMEVFQQorCmRpZmYgLS1naXQgYS90L3Q1MTAwL3BhdGNoMDAwNSBiL3QvdDUxMDAvcGF0Y2gwMDA1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMjRiMjQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MTAwL3BhdGNoMDAwNQpAQCAtMCwwICsxLDY5IEBACistLS0KKworIERvY3VtZW50YXRpb24vZ2l0LWN2c2ltcG9ydC1zY3JpcHQudHh0IHwgICAgOSArKysrKysrKy0KKyBnaXQtY3ZzaW1wb3J0LXNjcmlwdCAgICAgICAgICAgICAgICAgICB8ICAgIDQgKystLQorIDIgZmlsZXMgY2hhbmdlZCwgMTAgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKKworNTA0NTJmOWMwYzJkZjFmMDRkODNhMjYyNjZiYTcwNGIxMzg2MTYzMgorZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWN2c2ltcG9ydC1zY3JpcHQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtY3ZzaW1wb3J0LXNjcmlwdC50eHQKKy0tLSBhL0RvY3VtZW50YXRpb24vZ2l0LWN2c2ltcG9ydC1zY3JpcHQudHh0CisrKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1jdnNpbXBvcnQtc2NyaXB0LnR4dAorQEAgLTI5LDYgKzI5LDEwIEBAIE9QVElPTlMKKyAJY3VycmVudGx5LCBvbmx5IHRoZSA6bG9jYWw6LCA6ZXh0OiBhbmQgOnBzZXJ2ZXI6IGFjY2VzcyBtZXRob2RzIAorIAlhcmUgc3VwcG9ydGVkLgorIAorKy1DIDx0YXJnZXQtZGlyPjo6CisrICAgICAgICBUaGUgR0lUIHJlcG9zaXRvcnkgdG8gaW1wb3J0IHRvLiAgSWYgdGhlIGRpcmVjdG9yeSBkb2Vzbid0CisrICAgICAgICBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkLiAgRGVmYXVsdCBpcyB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisrCisgLWk6OgorIAlJbXBvcnQtb25seTogZG9uJ3QgcGVyZm9ybSBhIGNoZWNrb3V0IGFmdGVyIGltcG9ydGluZy4gIFRoaXMgb3B0aW9uCisgCWVuc3VyZXMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBjYWNoZSByZW1haW4gdW50b3VjaGVkIGFuZCB3aWxsCitAQCAtNDQsNyArNDgsNyBAQCBPUFRJT05TCisgCisgLXAgPG9wdGlvbnMtZm9yLWN2c3BzPjo6CisgCUFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgY3ZzcHMuCistCVRoZSBvcHRpb25zICcteCcgYW5kICctQScgYXJlIGltcGxpY2l0IGFuZCBzaG91bGQgbm90IGJlIHVzZWQgaGVyZS4KKysJVGhlIG9wdGlvbnMgJy11JyBhbmQgJy1BJyBhcmUgaW1wbGljaXQgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBoZXJlLgorIAorIAlJZiB5b3UgbmVlZCB0byBwYXNzIG11bHRpcGxlIG9wdGlvbnMsIHNlcGFyYXRlIHRoZW0gd2l0aCBhIGNvbW1hLgorIAorQEAgLTU3LDYgKzYxLDkgQEAgT1BUSU9OUworIC1oOjoKKyAJUHJpbnQgYSBzaG9ydCB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LgorIAorKy16IDxmdXp6Pjo6CisrICAgICAgICBQYXNzIHRoZSB0aW1lc3RhbXAgZnV6eiBmYWN0b3IgdG8gY3ZzcHMuCisrCisgT1VUUFVUCisgLS0tLS0tCisgSWYgJy12JyBpcyBzcGVjaWZpZWQsIHRoZSBzY3JpcHQgcmVwb3J0cyB3aGF0IGl0IGlzIGRvaW5nLgorZGlmZiAtLWdpdCBhL2dpdC1jdnNpbXBvcnQtc2NyaXB0IGIvZ2l0LWN2c2ltcG9ydC1zY3JpcHQKKy0tLSBhL2dpdC1jdnNpbXBvcnQtc2NyaXB0CisrKysgYi9naXQtY3ZzaW1wb3J0LXNjcmlwdAorQEAgLTE5MCw3ICsxOTAsNyBAQCBzdWIgY29ubiB7CisgCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIlJvb3QgJHJlcG9cbiIpOworIAorIAkjIFRyaWFsIGFuZCBlcnJvciBzYXlzIHRoYXQgdGhpcyBwcm9iYWJseSBpcyB0aGUgbWluaW11bSBzZXQKKy0JJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiVmFsaWQtcmVzcG9uc2VzIG9rIGVycm9yIFZhbGlkLXJlcXVlc3RzIE1vZGUgTSBNYmluYXJ5IEUgRiBDaGVja2VkLWluIENyZWF0ZWQgVXBkYXRlZCBNZXJnZWQgUmVtb3ZlZFxuIik7CisrCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIlZhbGlkLXJlc3BvbnNlcyBvayBlcnJvciBWYWxpZC1yZXF1ZXN0cyBNb2RlIE0gTWJpbmFyeSBFIENoZWNrZWQtaW4gQ3JlYXRlZCBVcGRhdGVkIE1lcmdlZCBSZW1vdmVkXG4iKTsKKyAKKyAJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgidmFsaWQtcmVxdWVzdHNcbiIpOworIAkkc2VsZi0+eydzb2NrZXRvJ30tPmZsdXNoKCk7CitAQCAtNjkxLDcgKzY5MSw3IEBAIHdoaWxlKDxDVlM+KSB7CisgCQl1bmxpbmsoJHRtcG5hbWUpOworIAkJbXkgJG1vZGUgPSBwbW9kZSgkY3ZzLT57J21vZGUnfSk7CisgCQlwdXNoKEBuZXcsWyRtb2RlLCAkc2hhLCAkZm5dKTsgIyBtYXkgYmUgcmVzdXJyZWN0ZWQhCistCX0gZWxzaWYoJHN0YXRlID09IDkgYW5kIC9eXHMrKFxTKyk6XGQoPzpcLlxkKykrLT4oXGQoPzpcLlxkKykrKVwoREVBRFwpXHMqJC8pIHsKKysJfSBlbHNpZigkc3RhdGUgPT0gOSBhbmQgL15ccysoXFMrKTpcZCsoPzpcLlxkKykrLT4oXGQrKD86XC5cZCspKylcKERFQURcKVxzKiQvKSB7CisgCQlteSAkZm4gPSAkMTsKKyAJCSRmbiA9fiBzI14vKyMjOworIAkJcHVzaChAb2xkLCRmbik7CisKKy0tIAorRGF2aWQgS+VnZWRhbAorLQorVG8gdW5zdWJzY3JpYmUgZnJvbSB0aGlzIGxpc3Q6IHNlbmQgdGhlIGxpbmUgInVuc3Vic2NyaWJlIGdpdCIgaW4KK3RoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnCitNb3JlIG1ham9yZG9tbyBpbmZvIGF0ICBodHRwOi8vdmdlci5rZXJuZWwub3JnL21ham9yZG9tby1pbmZvLmh0bWwKKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9wYXRjaDAwMDYgYi90L3Q1MTAwL3BhdGNoMDAwNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2UxNTUxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9wYXRjaDAwMDYKQEAgLTAsMCArMSwxNCBAQAorLS0tCisgZm9vIHwgICAgMiArLQorIDEgZmlsZXMgY2hhbmdlZCwgMSBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZm9vIGIvZm9vCitpbmRleCA5MTIzY2RjLi45MThkY2Y4IDEwMDY0NAorLS0tIGEvZm9vCisrKysgYi9mb28KK0BAIC0xICsxIEBACistRnJpIEp1biAgOSAwMDo0NDowNCBQRFQgMjAwNgorK0ZyaSBKdW4gIDkgMDA6NDQ6MTMgUERUIDIwMDYKKy0tIAorMS40LjAuZzZmMmIKKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9wYXRjaDAwMDcgYi90L3Q1MTAwL3BhdGNoMDAwNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9wYXRjaDAwMDcKZGlmZiAtLWdpdCBhL3QvdDUxMDAvcGF0Y2gwMDA4IGIvdC90NTEwMC9wYXRjaDAwMDgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvcGF0Y2gwMDA4CmRpZmYgLS1naXQgYS90L3Q1MTAwL3BhdGNoMDAwOSBiL3QvdDUxMDAvcGF0Y2gwMDA5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NjE1YzMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MTAwL3BhdGNoMDAwOQpAQCAtMCwwICsxLDEzIEBACitkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kaWZmLWZvcm1hdC50eHQgYi9Eb2N1bWVudGF0aW9uL2RpZmYtZm9ybWF0LnR4dAoraW5kZXggYjQyNmExNC4uOTc3NTZlYyAxMDA2NDQKKy0tLSBhL0RvY3VtZW50YXRpb24vZGlmZi1mb3JtYXQudHh0CisrKysgYi9Eb2N1bWVudGF0aW9uL2RpZmYtZm9ybWF0LnR4dAorQEAgLTgxLDcgKzgxLDcgQEAgVGhlICJkaWZmIiBmb3JtYXR0aW5nIG9wdGlvbnMgY2FuIGJlIGN1c3RvbWl6ZWQgdmlhIHRoZQorIGVudmlyb25tZW50IHZhcmlhYmxlICdHSVRfRElGRl9PUFRTJy4gIEZvciBleGFtcGxlLCBpZiB5b3UKKyBwcmVmZXIgY29udGV4dCBkaWZmOgorIAorLSAgICAgIEdJVF9ESUZGX09QVFM9LWMgZ2l0LWRpZmYtaW5kZXggLXAgJChjYXQgLmdpdC9IRUFEKQorKyAgICAgIEdJVF9ESUZGX09QVFM9LWMgZ2l0LWRpZmYtaW5kZXggLXAgSEVBRAorIAorIAorIDIuIFdoZW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlICdHSVRfRVhURVJOQUxfRElGRicgaXMgc2V0LCB0aGUKZGlmZiAtLWdpdCBhL3QvdDUxMDAvc2FtcGxlLm1ib3ggYi90L3Q1MTAwL3NhbXBsZS5tYm94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NzZiOTYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MTAwL3NhbXBsZS5tYm94CkBAIC0wLDAgKzEsNDMyIEBACisgICAgCisJCisgICAgCitGcm9tIG5vYm9keSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEEgVSBUaG9yIDxhLnUudGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IEZyaSwgOSBKdW4gMjAwNiAwMDo0NDoxNiAtMDcwMAorU3ViamVjdDogW1BBVENIXSBhIGNvbW1pdC4KKworSGVyZSBpcyBhIHBhdGNoIGZyb20gQSBVIFRob3IuCisKKy0tLQorIGZvbyB8ICAgIDIgKy0KKyAxIGZpbGVzIGNoYW5nZWQsIDEgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2ZvbyBiL2ZvbworaW5kZXggOTEyM2NkYy4uOTE4ZGNmOCAxMDA2NDQKKy0tLSBhL2ZvbworKysrIGIvZm9vCitAQCAtMSArMSBAQAorLUZyaSBKdW4gIDkgMDA6NDQ6MDQgUERUIDIwMDYKKytGcmkgSnVuICA5IDAwOjQ0OjEzIFBEVCAyMDA2CistLSAKKzEuNC4wLmc2ZjJiCisKK0Zyb20gbm9ib2R5IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGEudS50aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogRnJpLCA5IEp1biAyMDA2IDAwOjQ0OjE2IC0wNzAwCitTdWJqZWN0OiBbUEFUQ0hdIGFub3RoZXIgcGF0Y2gKKworSGVyZSBpcyBhIHBhdGNoIGZyb20gQSBVIFRob3IuICBUaGlzIGFkZHJlc3NlcyB0aGUgaXNzdWUgcmFpc2VkIGluIHRoZQorbWVzc2FnZToKKworRnJvbTogTml0IFBpY2tlciA8bml0LnBpY2tlckBleGFtcGxlLm5ldD4KK1N1YmplY3Q6IGZvbyBpcyB0b28gb2xkCitNZXNzYWdlLUlkOiA8bml0cGlja2VyLjEyMTIxMjEyQGV4YW1wbGUubmV0PgorCitIb3BlZnVsbHkgdGhpcyB3b3VsZCBmaXggdGhlIHByb2JsZW0gc3RhdGVkIHRoZXJlLgorCisKK0kgaGF2ZSBpbmNsdWRlZCBhbiBleHRyYSBibGFuayBsaW5lIGFib3ZlLCBidXQgaXQgZG9lcyBub3QgaGF2ZSB0byBiZQorc3RyaXBwZWQgYXdheSBoZXJlLCBhbG9uZyB3aXRoIHRoZSAgICAgICAgICAgICAgIAkJICAgCit3aGl0ZXNwYWNlcyBhdCB0aGUgZW5kIG9mIHRoZSBhYm92ZSBsaW5lLiAgVGhleSBhcmUgZXhwZWN0ZWQgdG8gYmUgc3F1YXNoZWQKK3doZW4gdGhlIG1lc3NhZ2UgaXMgbWFkZSBpbnRvIGEgY29tbWl0IGxvZyBieSBzdHJpcHNwYWNlLAorQWxzbywgdGhlcmUgYXJlIHRocmVlIGJsYW5rIGxpbmVzIGFmdGVyIHRoaXMgcGFyYWdyYXBoLAordHdvIHRydWx5IGJsYW5rIGFuZCBhbm90aGVyIGZ1bGwgb2Ygc3BhY2VzIGluIGJldHdlZW4uCisKKyAgICAgICAgICAgIAorCitIb3BlIHRoaXMgaGVscHMuCisKKy0tLQorIGZvbyB8ICAgIDIgKy0KKyAxIGZpbGVzIGNoYW5nZWQsIDEgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2ZvbyBiL2ZvbworaW5kZXggOTEyM2NkYy4uOTE4ZGNmOCAxMDA2NDQKKy0tLSBhL2ZvbworKysrIGIvZm9vCitAQCAtMSArMSBAQAorLUZyaSBKdW4gIDkgMDA6NDQ6MDQgUERUIDIwMDYKKytGcmkgSnVuICA5IDAwOjQ0OjEzIFBEVCAyMDA2CistLSAKKzEuNC4wLmc2ZjJiCisKK0Zyb20gbm9ib2R5IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogSnVuaW8gQyBIYW1hbm8gPGp1bmlvQGtlcm5lbC5vcmc+CitEYXRlOiBGcmksIDkgSnVuIDIwMDYgMDA6NDQ6MTYgLTA3MDAKK1N1YmplY3Q6IHJlOiBbUEFUQ0hdIGFub3RoZXIgcGF0Y2gKKworRnJvbTogQSBVIFRob3IgPGEudS50aG9yQGV4YW1wbGUuY29tPgorU3ViamVjdDogW1BBVENIXSB0aGlyZCBwYXRjaAorCitIZXJlIGlzIGEgcGF0Y2ggZnJvbSBBIFUgVGhvci4gIFRoaXMgYWRkcmVzc2VzIHRoZSBpc3N1ZSByYWlzZWQgaW4gdGhlCittZXNzYWdlOgorCitGcm9tOiBOaXQgUGlja2VyIDxuaXQucGlja2VyQGV4YW1wbGUubmV0PgorU3ViamVjdDogZm9vIGlzIHRvbyBvbGQKK01lc3NhZ2UtSWQ6IDxuaXRwaWNrZXIuMTIxMjEyMTJAZXhhbXBsZS5uZXQ+CisKK0hvcGVmdWxseSB0aGlzIHdvdWxkIGZpeCB0aGUgcHJvYmxlbSBzdGF0ZWQgdGhlcmUuCisKKy0tLQorIGZvbyB8ICAgIDIgKy0KKyAxIGZpbGVzIGNoYW5nZWQsIDEgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2ZvbyBiL2ZvbworaW5kZXggOTEyM2NkYy4uOTE4ZGNmOCAxMDA2NDQKKy0tLSBhL2ZvbworKysrIGIvZm9vCitAQCAtMSArMSBAQAorLUZyaSBKdW4gIDkgMDA6NDQ6MDQgUERUIDIwMDYKKytGcmkgSnVuICA5IDAwOjQ0OjEzIFBEVCAyMDA2CistLSAKKzEuNC4wLmc2ZjJiCisKK0Zyb20gbm9ib2R5IFNhdCBBdWcgMjcgMjM6MDc6NDkgMjAwNQorUGF0aDogbmV3cy5nbWFuZS5vcmchbm90LWZvci1tYWlsCitNZXNzYWdlLUlEOiA8MjAwNTA3MjEuMDkxMDM2LjAxMTE5NTE2Lnlvc2hmdWppQGxpbnV4LWlwdjYub3JnPgorRnJvbTogWU9TSElGVUpJIEhpZGVha2kgLyA9P2lzby0yMDIyLWpwP0I/R3lSQ05VaEdJekZSVEVBYktFST0/PSAKKwk8eW9zaGZ1amlAbGludXgtaXB2Ni5vcmc+CitOZXdzZ3JvdXBzOiBnbWFuZS5jb21wLnZlcnNpb24tY29udHJvbC5naXQKK1N1YmplY3Q6IFtQQVRDSCAxLzJdIEdJVDogVHJ5IGFsbCBhZGRyZXNzZXMgZm9yIGdpdmVuIHJlbW90ZSBuYW1lCitEYXRlOiBUaHUsIDIxIEp1bCAyMDA1IDA5OjEwOjM2IC0wNDAwIChFRFQpCitMaW5lczogOTkKK09yZ2FuaXphdGlvbjogVVNBR0kvV0lERSBQcm9qZWN0CitBcHByb3ZlZDogbmV3c0BnbWFuZS5vcmcKK05OVFAtUG9zdGluZy1Ib3N0OiBtYWluLmdtYW5lLm9yZworTWltZS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogVGV4dC9QbGFpbjsgY2hhcnNldD11cy1hc2NpaQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorWC1UcmFjZTogc2VhLmdtYW5lLm9yZyAxMTIxOTUxNDM0IDI5MzUwIDgwLjkxLjIyOS4yICgyMSBKdWwgMjAwNSAxMzoxMDozNCBHTVQpCitYLUNvbXBsYWludHMtVG86IHVzZW5ldEBzZWEuZ21hbmUub3JnCitOTlRQLVBvc3RpbmctRGF0ZTogVGh1LCAyMSBKdWwgMjAwNSAxMzoxMDozNCArMDAwMCAoVVRDKQorCitIZWxsby4KKworVHJ5IGFsbCBhZGRyZXNzZXMgZm9yIGdpdmVuIHJlbW90ZSBuYW1lIHVudGlsIGl0IHN1Y2NlZWRzLgorQWxzbyBzdXBwb3J0cyBJUHY2LgorCitTaWduZWQtb2YtYnk6IEhpZGVha2kgWU9TSElGVUpJIDx5b3NoZnVqaUBsaW51eC1pcHY2Lm9yZz4KKworZGlmZiAtLWdpdCBhL2Nvbm5lY3QuYyBiL2Nvbm5lY3QuYworLS0tIGEvY29ubmVjdC5jCisrKysgYi9jb25uZWN0LmMKK0BAIC05Niw0MiArOTYsNTcgQEAgc3RhdGljIGVudW0gcHJvdG9jb2wgZ2V0X3Byb3RvY29sKGNvbnN0IAorIAlkaWUoIkkgZG9uJ3QgaGFuZGxlIHByb3RvY29sICclcyciLCBuYW1lKTsKKyB9CisgCistc3RhdGljIHZvaWQgbG9va3VwX2hvc3QoY29uc3QgY2hhciAqaG9zdCwgc3RydWN0IHNvY2thZGRyICppbikKKy17CistCXN0cnVjdCBhZGRyaW5mbyAqcmVzOworLQlpbnQgcmV0OworLQorLQlyZXQgPSBnZXRhZGRyaW5mbyhob3N0LCBOVUxMLCBOVUxMLCAmcmVzKTsKKy0JaWYgKHJldCkKKy0JCWRpZSgiVW5hYmxlIHRvIGxvb2sgdXAgJXMgKCVzKSIsIGhvc3QsIGdhaV9zdHJlcnJvcihyZXQpKTsKKy0JKmluID0gKnJlcy0+YWlfYWRkcjsKKy0JZnJlZWFkZHJpbmZvKHJlcyk7CistfQorKyNkZWZpbmUgU1RSXyhzKQkjIHMKKysjZGVmaW5lIFNUUihzKQlTVFJfKHMpCisgCisgc3RhdGljIGludCBnaXRfdGNwX2Nvbm5lY3QoaW50IGZkWzJdLCBjb25zdCBjaGFyICpwcm9nLCBjaGFyICpob3N0LCBjaGFyICpwYXRoKQorIHsKKy0Jc3RydWN0IHNvY2thZGRyIGFkZHI7CistCWludCBwb3J0ID0gREVGQVVMVF9HSVRfUE9SVCwgc29ja2ZkOworLQljaGFyICpjb2xvbjsKKy0KKy0JY29sb24gPSBzdHJjaHIoaG9zdCwgJzonKTsKKy0JaWYgKGNvbG9uKSB7CistCQljaGFyICplbmQ7CistCQl1bnNpZ25lZCBsb25nIG4gPSBzdHJ0b3VsKGNvbG9uKzEsICZlbmQsIDApOworLQkJaWYgKGNvbG9uWzFdICYmICEqZW5kKSB7CistCQkJKmNvbG9uID0gMDsKKy0JCQlwb3J0ID0gbjsKKysJaW50IHNvY2tmZCA9IC0xOworKwljaGFyICpjb2xvbiwgKmVuZDsKKysJY2hhciAqcG9ydCA9IFNUUihERUZBVUxUX0dJVF9QT1JUKTsKKysJc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWkwLCAqYWk7CisrCWludCBnYWk7CisrCisrCWlmIChob3N0WzBdID09ICdbJykgeworKwkJZW5kID0gc3RyY2hyKGhvc3QgKyAxLCAnXScpOworKwkJaWYgKGVuZCkgeworKwkJCSplbmQgPSAwOworKwkJCWVuZCsrOworKwkJCWhvc3QrKzsKKysJCX0gZWxzZQorKwkJCWVuZCA9IGhvc3Q7CisrCX0gZWxzZQorKwkJZW5kID0gaG9zdDsKKysJY29sb24gPSBzdHJjaHIoZW5kLCAnOicpOworKworKwlpZiAoY29sb24pCisrCQlwb3J0ID0gY29sb24gKyAxOworKworKwltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKysJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKysJaGludHMuYWlfcHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKysKKysJZ2FpID0gZ2V0YWRkcmluZm8oaG9zdCwgcG9ydCwgJmhpbnRzLCAmYWkpOworKwlpZiAoZ2FpKQorKwkJZGllKCJVbmFibGUgdG8gbG9vayB1cCAlcyAoJXMpIiwgaG9zdCwgZ2FpX3N0cmVycm9yKGdhaSkpOworKworKwlmb3IgKGFpMCA9IGFpOyBhaTsgYWkgPSBhaS0+YWlfbmV4dCkgeworKwkJc29ja2ZkID0gc29ja2V0KGFpLT5haV9mYW1pbHksIGFpLT5haV9zb2NrdHlwZSwgYWktPmFpX3Byb3RvY29sKTsKKysJCWlmIChzb2NrZmQgPCAwKQorKwkJCWNvbnRpbnVlOworKwkJaWYgKGNvbm5lY3Qoc29ja2ZkLCBhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4pIDwgMCkgeworKwkJCWNsb3NlKHNvY2tmZCk7CisrCQkJc29ja2ZkID0gLTE7CisrCQkJY29udGludWU7CisgCQl9CisrCQlicmVhazsKKyAJfQorIAorLQlsb29rdXBfaG9zdChob3N0LCAmYWRkcik7CistCSgoc3RydWN0IHNvY2thZGRyX2luICopJmFkZHIpLT5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworKwlmcmVlYWRkcmluZm8oYWkwKTsKKyAKKy0Jc29ja2ZkID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX0lQKTsKKyAJaWYgKHNvY2tmZCA8IDApCisgCQlkaWUoInVuYWJsZSB0byBjcmVhdGUgc29ja2V0ICglcykiLCBzdHJlcnJvcihlcnJubykpOworLQlpZiAoY29ubmVjdChzb2NrZmQsICh2b2lkICopJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKQorLQkJZGllKCJ1bmFibGUgdG8gY29ubmVjdCAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKKysKKyAJZmRbMF0gPSBzb2NrZmQ7CisgCWZkWzFdID0gc29ja2ZkOworIAlwYWNrZXRfd3JpdGUoc29ja2ZkLCAiJXMgJXNcbiIsIHByb2csIHBhdGgpOworCistLSAKK1lPU0hJRlVKSSBIaWRlYWtpIEAgVVNBR0kgUHJvamVjdCAgPHlvc2hmdWppQGxpbnV4LWlwdjYub3JnPgorR1BHLUZQICA6IDkwMjIgNjVFQiAxRUNGIDNBRDEgMEJERiAgODBEOCA0ODA3IEY4OTQgRTA2MiAwRUVBCisKK0Zyb20gbm9ib2R5IFNhdCBBdWcgMjcgMjM6MDc6NDkgMjAwNQorUGF0aDogbmV3cy5nbWFuZS5vcmchbm90LWZvci1tYWlsCitNZXNzYWdlLUlEOiA8dTV0YWNqamRweHEuZnNmQGx5c2F0b3IubGl1LnNlPgorRnJvbTogPT9pc28tODg1OS0xP1E/RGF2aWRfSz1FNWdlZGFsPz0gPGRhdmlka0BseXNhdG9yLmxpdS5zZT4KK05ld3Nncm91cHM6IGdtYW5lLmNvbXAudmVyc2lvbi1jb250cm9sLmdpdAorU3ViamVjdDogW1BBVENIXSBGaXhlZCB0d28gYnVncyBpbiBnaXQtY3ZzaW1wb3J0LXNjcmlwdC4KK0RhdGU6IE1vbiwgMTUgQXVnIDIwMDUgMjA6MTg6MjUgKzAyMDAKK0xpbmVzOiA4MworQXBwcm92ZWQ6IG5ld3NAZ21hbmUub3JnCitOTlRQLVBvc3RpbmctSG9zdDogbWFpbi5nbWFuZS5vcmcKK01pbWUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9aXNvLTg4NTktMQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogUVVPVEVELVBSSU5UQUJMRQorWC1UcmFjZTogc2VhLmdtYW5lLm9yZyAxMTI0MTMwMjQ3IDMxODM5IDgwLjkxLjIyOS4yICgxNSBBdWcgMjAwNSAxODoyNDowNyBHTVQpCitYLUNvbXBsYWludHMtVG86IHVzZW5ldEBzZWEuZ21hbmUub3JnCitOTlRQLVBvc3RpbmctRGF0ZTogTW9uLCAxNSBBdWcgMjAwNSAxODoyNDowNyArMDAwMCAoVVRDKQorQ2M6ICJKdW5pbyBDLiBIYW1hbm8iIDxqdW5raW9AY294Lm5ldD4KK09yaWdpbmFsLVgtRnJvbTogZ2l0LW93bmVyQHZnZXIua2VybmVsLm9yZyBNb24gQXVnIDE1IDIwOjI0OjA1IDIwMDUKKworVGhlIGdpdC1jdnNpbXBvcnQtc2NyaXB0IGhhZCBhIGNvcHVsZSBvZiBzbWFsbCBidWdzIHRoYXQgcHJldmVudGVkIG1lCitmcm9tIGltcG9ydGluZyBhIGJpZyBDVlMgcmVwb3NpdG9yeS4KKworVGhlIGZpcnN0IHdhcyB0aGF0IGl0IGRpZG4ndCBoYW5kbGUgcmVtb3ZlZCBmaWxlcyB3aXRoIGEgbXVsdGktZGlnaXQKK3ByaW1hcnkgcmV2aXNpb24gbnVtYmVyLgorCitUaGUgc2Vjb25kIHdhcyB0aGF0IGl0IHdhcyBhc2tpbmcgdGhlIENWUyBzZXJ2ZXIgZm9yICJGIiBtZXNzYWdlcywKK2FsdGhvdWdoIHRoZXkgd2VyZSBub3QgaGFuZGxlZC4KKworSSBhbHNvIHVwZGF0ZWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoYXQgc2NyaXB0IHRvIGNvcnJlc3BvbmQgdG8KK2FjdHVhbCBmbGFncy4KKworU2lnbmVkLW9mZi1ieTogRGF2aWQgSz1FNWdlZGFsIDxkYXZpZGtAbHlzYXRvci5saXUuc2U+CistLS0KKworIERvY3VtZW50YXRpb24vZ2l0LWN2c2ltcG9ydC1zY3JpcHQudHh0IHwgICAgOSArKysrKysrKy0KKyBnaXQtY3ZzaW1wb3J0LXNjcmlwdCAgICAgICAgICAgICAgICAgICB8ICAgIDQgKystLQorIDIgZmlsZXMgY2hhbmdlZCwgMTAgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKKworNTA0NTJmOWMwYzJkZjFmMDRkODNhMjYyNjZiYTcwNGIxMzg2MTYzMgorZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWN2c2ltcG9ydC1zY3JpcHQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQ9CistY3ZzaW1wb3J0LXNjcmlwdC50eHQKKy0tLSBhL0RvY3VtZW50YXRpb24vZ2l0LWN2c2ltcG9ydC1zY3JpcHQudHh0CisrKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1jdnNpbXBvcnQtc2NyaXB0LnR4dAorQEAgLTI5LDYgKzI5LDEwIEBAIE9QVElPTlMKKyAJY3VycmVudGx5LCBvbmx5IHRoZSA6bG9jYWw6LCA6ZXh0OiBhbmQgOnBzZXJ2ZXI6IGFjY2VzcyBtZXRob2RzPTIwCisgCWFyZSBzdXBwb3J0ZWQuCis9MjAKKystQyA8dGFyZ2V0LWRpcj46OgorKyAgICAgICAgVGhlIEdJVCByZXBvc2l0b3J5IHRvIGltcG9ydCB0by4gIElmIHRoZSBkaXJlY3RvcnkgZG9lc24ndAorKyAgICAgICAgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC4gIERlZmF1bHQgaXMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorKworIC1pOjoKKyAJSW1wb3J0LW9ubHk6IGRvbid0IHBlcmZvcm0gYSBjaGVja291dCBhZnRlciBpbXBvcnRpbmcuICBUaGlzIG9wdGlvbgorIAllbnN1cmVzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgY2FjaGUgcmVtYWluIHVudG91Y2hlZCBhbmQgd2lsbAorQEAgLTQ0LDcgKzQ4LDcgQEAgT1BUSU9OUworPTIwCisgLXAgPG9wdGlvbnMtZm9yLWN2c3BzPjo6CisgCUFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgY3ZzcHMuCistCVRoZSBvcHRpb25zICcteCcgYW5kICctQScgYXJlIGltcGxpY2l0IGFuZCBzaG91bGQgbm90IGJlIHVzZWQgaGVyZS4KKysJVGhlIG9wdGlvbnMgJy11JyBhbmQgJy1BJyBhcmUgaW1wbGljaXQgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBoZXJlLgorPTIwCisgCUlmIHlvdSBuZWVkIHRvIHBhc3MgbXVsdGlwbGUgb3B0aW9ucywgc2VwYXJhdGUgdGhlbSB3aXRoIGEgY29tbWEuCis9MjAKK0BAIC01Nyw2ICs2MSw5IEBAIE9QVElPTlMKKyAtaDo6CisgCVByaW50IGEgc2hvcnQgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KKz0yMAorKy16IDxmdXp6Pjo6CisrICAgICAgICBQYXNzIHRoZSB0aW1lc3RhbXAgZnV6eiBmYWN0b3IgdG8gY3ZzcHMuCisrCisgT1VUUFVUCisgLS0tLS0tCisgSWYgJy12JyBpcyBzcGVjaWZpZWQsIHRoZSBzY3JpcHQgcmVwb3J0cyB3aGF0IGl0IGlzIGRvaW5nLgorZGlmZiAtLWdpdCBhL2dpdC1jdnNpbXBvcnQtc2NyaXB0IGIvZ2l0LWN2c2ltcG9ydC1zY3JpcHQKKy0tLSBhL2dpdC1jdnNpbXBvcnQtc2NyaXB0CisrKysgYi9naXQtY3ZzaW1wb3J0LXNjcmlwdAorQEAgLTE5MCw3ICsxOTAsNyBAQCBzdWIgY29ubiB7CisgCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIlJvb3QgJHJlcG9cbiIpOworPTIwCisgCSMgVHJpYWwgYW5kIGVycm9yIHNheXMgdGhhdCB0aGlzIHByb2JhYmx5IGlzIHRoZSBtaW5pbXVtIHNldAorLQkkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCJWYWxpZC1yZXNwb25zZXMgb2sgZXJyb3IgVmFsaWQtcmVxdWVzdHMgTW89CitkZSBNIE1iaW5hcnkgRSBGIENoZWNrZWQtaW4gQ3JlYXRlZCBVcGRhdGVkIE1lcmdlZCBSZW1vdmVkXG4iKTsKKysJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiVmFsaWQtcmVzcG9uc2VzIG9rIGVycm9yIFZhbGlkLXJlcXVlc3RzIE1vPQorZGUgTSBNYmluYXJ5IEUgQ2hlY2tlZC1pbiBDcmVhdGVkIFVwZGF0ZWQgTWVyZ2VkIFJlbW92ZWRcbiIpOworPTIwCisgCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoInZhbGlkLXJlcXVlc3RzXG4iKTsKKyAJJHNlbGYtPnsnc29ja2V0byd9LT5mbHVzaCgpOworQEAgLTY5MSw3ICs2OTEsNyBAQCB3aGlsZSg8Q1ZTPikgeworIAkJdW5saW5rKCR0bXBuYW1lKTsKKyAJCW15ICRtb2RlID0zRCBwbW9kZSgkY3ZzLT57J21vZGUnfSk7CisgCQlwdXNoKEBuZXcsWyRtb2RlLCAkc2hhLCAkZm5dKTsgIyBtYXkgYmUgcmVzdXJyZWN0ZWQhCistCX0gZWxzaWYoJHN0YXRlID0zRD0zRCA5IGFuZCAvXlxzKyhcUyspOlxkKD86XC5cZCspKy0+KFxkKD86XC5cZCspKylcKD0KK0RFQURcKVxzKiQvKSB7CisrCX0gZWxzaWYoJHN0YXRlID0zRD0zRCA5IGFuZCAvXlxzKyhcUyspOlxkKyg/OlwuXGQrKSstPihcZCsoPzpcLlxkKykrKT0KK1woREVBRFwpXHMqJC8pIHsKKyAJCW15ICRmbiA9M0QgJDE7CisgCQkkZm4gPTNEfiBzI14vKyMjOworIAkJcHVzaChAb2xkLCRmbik7CisKKy0tPTIwCitEYXZpZCBLPUU1Z2VkYWwKKy0KK1RvIHVuc3Vic2NyaWJlIGZyb20gdGhpcyBsaXN0OiBzZW5kIHRoZSBsaW5lICJ1bnN1YnNjcmliZSBnaXQiIGluCit0aGUgYm9keSBvZiBhIG1lc3NhZ2UgdG8gbWFqb3Jkb21vQHZnZXIua2VybmVsLm9yZworTW9yZSBtYWpvcmRvbW8gaW5mbyBhdCAgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9tYWpvcmRvbW8taW5mby5odG1sCisKK0Zyb20gbm9ib2R5IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQSBVIFRob3IgPGEudS50aG9yQGV4YW1wbGUuY29tPgorUmVmZXJlbmNlczogPFBpbmUuTE5YLjQuNjQwLjAwMDFAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMDJAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMDNAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMDRAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMDVAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMDZAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMDdAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMDhAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMDlAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMTBAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMTFAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMTJAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMTNAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMTRAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMTVAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMTZAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMTdAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMThAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMTlAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMjBAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMjFAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMjJAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMjNAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMjRAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMjVAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMjZAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMjdAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMjhAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMjlAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMzBAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMzFAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMzJAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMzNAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMzRAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMzVAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMzZAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMzdAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMzhAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwMzlAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwNDBAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwNDFAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwNDJAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwNDNAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwNDRAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwNDVAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwNDZAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwNDdAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwNDhAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwNDlAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CisgPFBpbmUuTE5YLjQuNjQwLjAwNTBAd29vZHkubGludXgtZm91bmRhdGlvbi5vcmc+CitEYXRlOiBGcmksIDkgSnVuIDIwMDYgMDA6NDQ6MTYgLTA3MDAKK1N1YmplY3Q6IFtQQVRDSF0gYSBjb21taXQuCisKK0hlcmUgaXMgYSBwYXRjaCBmcm9tIEEgVSBUaG9yLgorCistLS0KKyBmb28gfCAgICAyICstCisgMSBmaWxlcyBjaGFuZ2VkLCAxIGluc2VydGlvbnMoKyksIDEgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9mb28gYi9mb28KK2luZGV4IDkxMjNjZGMuLjkxOGRjZjggMTAwNjQ0CistLS0gYS9mb28KKysrKyBiL2ZvbworQEAgLTEgKzEgQEAKKy1GcmkgSnVuICA5IDAwOjQ0OjA0IFBEVCAyMDA2CisrRnJpIEp1biAgOSAwMDo0NDoxMyBQRFQgMjAwNgorLS0gCisxLjQuMC5nNmYyYgorCitGcm9tIG5vYm9keSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEEgVSBUaG9yIDxhLnUudGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IEZyaSwgOSBKdW4gMjAwNiAwMDo0NDoxNiAtMDcwMAorU3ViamVjdDogW1BBVENIXSBhbm90aGVyIHBhdGNoCisKK0hlcmUgaXMgYW4gZW1wdHkgcGF0Y2ggZnJvbSBBIFUgVGhvci4KKworRnJvbSBub2JvZHkgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBKdW5pbyBDIEhhbWFubyA8anVuaW9Aa2VybmVsLm9yZz4KK0RhdGU6IEZyaSwgOSBKdW4gMjAwNiAwMDo0NDoxNiAtMDcwMAorU3ViamVjdDogcmU6IFtQQVRDSF0gYW5vdGhlciBwYXRjaAorCitGcm9tOiBBIFUgVGhvciA8YS51LnRob3JAZXhhbXBsZS5jb20+CitTdWJqZWN0OiBbUEFUQ0hdIGFub3RoZXIgcGF0Y2gKKz5IZXJlIGlzIGFuIGVtcHR5IHBhdGNoIGZyb20gQSBVIFRob3IuCisKK0hleSB5b3UgZm9yZ290IHRoZSBwYXRjaCEKKworRnJvbSBub2JvZHkgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBIFUgVGhvciA8YS51LnRob3JAZXhhbXBsZS5jb20+CitEYXRlOiBNb24sIDE3IFNlcCAyMDAxIDAwOjAwOjAwICswOTAwCitNaW1lLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBUZXh0L1BsYWluOyBjaGFyc2V0PXVzLWFzY2lpCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBRdW90ZWQtUHJpbnRhYmxlCisKKz0wQT0wQUZyb206IEYgVSBCYXIgPGYudS5iYXJAZXhhbXBsZS5jb20+CitTdWJqZWN0OiBbUEFUQ0hdIHVwZGF0ZXM9MEE9MEFUaGlzIGlzIHRvIGZpeCBkaWZmLWZvcm1hdCBkb2N1bWVudGF0aW9uLgorCitkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kaWZmLWZvcm1hdC50eHQgYi9Eb2N1bWVudGF0aW9uL2RpZmYtZm9ybWF0LnR4dAoraW5kZXggYjQyNmExNC4uOTc3NTZlYyAxMDA2NDQKKy0tLSBhL0RvY3VtZW50YXRpb24vZGlmZi1mb3JtYXQudHh0CisrKysgYi9Eb2N1bWVudGF0aW9uL2RpZmYtZm9ybWF0LnR4dAorQEAgLTgxLDcgKzgxLDcgQEAgVGhlICJkaWZmIiBmb3JtYXR0aW5nIG9wdGlvbnMgY2FuIGJlIGN1c3RvbWl6ZWQgdmlhIHRoZQorIGVudmlyb25tZW50IHZhcmlhYmxlICdHSVRfRElGRl9PUFRTJy4gIEZvciBleGFtcGxlLCBpZiB5b3UKKyBwcmVmZXIgY29udGV4dCBkaWZmOgorPTIwCistICAgICAgR0lUX0RJRkZfT1BUUz0zRC1jIGdpdC1kaWZmLWluZGV4IC1wICQoY2F0IC5naXQvSEVBRCkKKysgICAgICBHSVRfRElGRl9PUFRTPTNELWMgZ2l0LWRpZmYtaW5kZXggLXAgSEVBRAorPTIwCis9MjAKKyAyLiBXaGVuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAnR0lUX0VYVEVSTkFMX0RJRkYnIGlzIHNldCwgdGhlCmRpZmYgLS1naXQgYS90L3Q1MzAwLXBhY2stb2JqZWN0LnNoIGIvdC90NTMwMC1wYWNrLW9iamVjdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOTU1ZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTMwMC1wYWNrLW9iamVjdC5zaApAQCAtMCwwICsxLDI3NyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtcGFjay1vYmplY3QKKworJworLiAuL3Rlc3QtbGliLnNoCisKK1RSQVNIPWBwd2RgCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzZXR1cCcgXAorICAgICdybSAtZiAuZ2l0L2luZGV4KgorICAgICBmb3IgaSBpbiBhIGIgYworICAgICBkbworCSAgICAgZGQgaWY9L2Rldi96ZXJvIGJzPTRrIGNvdW50PTEgfCBwZXJsIC1wZSAieS9cXDAwMC8kaS8iID4kaSAmJgorCSAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAkaSB8fCByZXR1cm4gMQorICAgICBkb25lICYmCisgICAgIGNhdCBjID5kICYmIGVjaG8gZm9vID4+ZCAmJiBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGQgJiYKKyAgICAgdHJlZT1gZ2l0IHdyaXRlLXRyZWVgICYmCisgICAgIGNvbW1pdD1gZ2l0IGNvbW1pdC10cmVlICR0cmVlIDwvZGV2L251bGxgICYmIHsKKwkgZWNobyAkdHJlZSAmJgorCSBlY2hvICRjb21taXQgJiYKKwkgZ2l0IGxzLXRyZWUgJHRyZWUgfCBzZWQgLWUgInMvLiogXFwoWzAtOWEtZl0qXFwpCS4qL1xcMS8iCisgICAgIH0gPm9iai1saXN0ICYmIHsKKwkgZ2l0IGRpZmYtdHJlZSAtLXJvb3QgLXAgJGNvbW1pdCAmJgorCSB3aGlsZSByZWFkIG9iamVjdAorCSBkbworCSAgICB0PWBnaXQgY2F0LWZpbGUgLXQgJG9iamVjdGAgJiYKKwkgICAgZ2l0IGNhdC1maWxlICR0ICRvYmplY3QgfHwgcmV0dXJuIDEKKwkgZG9uZSA8b2JqLWxpc3QKKyAgICAgfSA+ZXhwZWN0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncGFjayB3aXRob3V0IGRlbHRhJyBcCisgICAgJ3BhY2tuYW1lXzE9JChnaXQgcGFjay1vYmplY3RzIC0td2luZG93PTAgdGVzdC0xIDxvYmotbGlzdCknCisKK3JtIC1mciAuZ2l0MgorbWtkaXIgLmdpdDIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VucGFjayB3aXRob3V0IGRlbHRhJyBcCisgICAgIkdJVF9PQkpFQ1RfRElSRUNUT1JZPS5naXQyL29iamVjdHMgJiYKKyAgICAgZXhwb3J0IEdJVF9PQkpFQ1RfRElSRUNUT1JZICYmCisgICAgIGdpdCBpbml0ICYmCisgICAgIGdpdCB1bnBhY2stb2JqZWN0cyAtbiA8dGVzdC0xLSR7cGFja25hbWVfMX0ucGFjayAmJgorICAgICBnaXQgdW5wYWNrLW9iamVjdHMgPHRlc3QtMS0ke3BhY2tuYW1lXzF9LnBhY2siCisKK3Vuc2V0IEdJVF9PQkpFQ1RfRElSRUNUT1JZCitjZCAiJFRSQVNILy5naXQyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hlY2sgdW5wYWNrIHdpdGhvdXQgZGVsdGEnIFwKKyAgICAnKGNkIC4uLy5naXQgJiYgZmluZCBvYmplY3RzIC10eXBlIGYgLXByaW50KSB8CisgICAgIHdoaWxlIHJlYWQgcGF0aAorICAgICBkbworICAgICAgICAgY21wICRwYXRoIC4uLy5naXQvJHBhdGggfHwgeworCSAgICAgZWNobyAkcGF0aCBkaWZmZXJzLgorCSAgICAgcmV0dXJuIDEKKwkgfQorICAgICBkb25lJworY2QgIiRUUkFTSCIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3BhY2sgd2l0aCBSRUZfREVMVEEnIFwKKyAgICAncHdkICYmCisgICAgIHBhY2tuYW1lXzI9JChnaXQgcGFjay1vYmplY3RzIHRlc3QtMiA8b2JqLWxpc3QpJworCitybSAtZnIgLmdpdDIKK21rZGlyIC5naXQyCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd1bnBhY2sgd2l0aCBSRUZfREVMVEEnIFwKKyAgICAnR0lUX09CSkVDVF9ESVJFQ1RPUlk9LmdpdDIvb2JqZWN0cyAmJgorICAgICBleHBvcnQgR0lUX09CSkVDVF9ESVJFQ1RPUlkgJiYKKyAgICAgZ2l0IGluaXQgJiYKKyAgICAgZ2l0IHVucGFjay1vYmplY3RzIC1uIDx0ZXN0LTItJHtwYWNrbmFtZV8yfS5wYWNrICYmCisgICAgIGdpdCB1bnBhY2stb2JqZWN0cyA8dGVzdC0yLSR7cGFja25hbWVfMn0ucGFjaycKKwordW5zZXQgR0lUX09CSkVDVF9ESVJFQ1RPUlkKK2NkICIkVFJBU0gvLmdpdDIiCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hlY2sgdW5wYWNrIHdpdGggUkVGX0RFTFRBJyBcCisgICAgJyhjZCAuLi8uZ2l0ICYmIGZpbmQgb2JqZWN0cyAtdHlwZSBmIC1wcmludCkgfAorICAgICB3aGlsZSByZWFkIHBhdGgKKyAgICAgZG8KKyAgICAgICAgIGNtcCAkcGF0aCAuLi8uZ2l0LyRwYXRoIHx8IHsKKwkgICAgIGVjaG8gJHBhdGggZGlmZmVycy4KKwkgICAgIHJldHVybiAxCisJIH0KKyAgICAgZG9uZScKK2NkICIkVFJBU0giCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwYWNrIHdpdGggT0ZTX0RFTFRBJyBcCisgICAgJ3B3ZCAmJgorICAgICBwYWNrbmFtZV8zPSQoZ2l0IHBhY2stb2JqZWN0cyAtLWRlbHRhLWJhc2Utb2Zmc2V0IHRlc3QtMyA8b2JqLWxpc3QpJworCitybSAtZnIgLmdpdDIKK21rZGlyIC5naXQyCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd1bnBhY2sgd2l0aCBPRlNfREVMVEEnIFwKKyAgICAnR0lUX09CSkVDVF9ESVJFQ1RPUlk9LmdpdDIvb2JqZWN0cyAmJgorICAgICBleHBvcnQgR0lUX09CSkVDVF9ESVJFQ1RPUlkgJiYKKyAgICAgZ2l0IGluaXQgJiYKKyAgICAgZ2l0IHVucGFjay1vYmplY3RzIC1uIDx0ZXN0LTMtJHtwYWNrbmFtZV8zfS5wYWNrICYmCisgICAgIGdpdCB1bnBhY2stb2JqZWN0cyA8dGVzdC0zLSR7cGFja25hbWVfM30ucGFjaycKKwordW5zZXQgR0lUX09CSkVDVF9ESVJFQ1RPUlkKK2NkICIkVFJBU0gvLmdpdDIiCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hlY2sgdW5wYWNrIHdpdGggT0ZTX0RFTFRBJyBcCisgICAgJyhjZCAuLi8uZ2l0ICYmIGZpbmQgb2JqZWN0cyAtdHlwZSBmIC1wcmludCkgfAorICAgICB3aGlsZSByZWFkIHBhdGgKKyAgICAgZG8KKyAgICAgICAgIGNtcCAkcGF0aCAuLi8uZ2l0LyRwYXRoIHx8IHsKKwkgICAgIGVjaG8gJHBhdGggZGlmZmVycy4KKwkgICAgIHJldHVybiAxCisJIH0KKyAgICAgZG9uZScKK2NkICIkVFJBU0giCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvbXBhcmUgZGVsdGEgZmxhdm9ycycgJworCXBlcmwgLWUgJ1wnJworCQlkZWZpbmVkKCRfID0gLXMgJF8pIG9yIGRpZSBmb3IgQEFSR1Y7CisJCWV4aXQgMSBpZiAkQVJHVlswXSA8PSAkQVJHVlsxXTsKKwknXCcnIHRlc3QtMi0kcGFja25hbWVfMi5wYWNrIHRlc3QtMy0kcGFja25hbWVfMy5wYWNrCisnCisKK3JtIC1mciAuZ2l0MgorbWtkaXIgLmdpdDIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VzZSBwYWNrZWQgb2JqZWN0cycgXAorICAgICdHSVRfT0JKRUNUX0RJUkVDVE9SWT0uZ2l0Mi9vYmplY3RzICYmCisgICAgIGV4cG9ydCBHSVRfT0JKRUNUX0RJUkVDVE9SWSAmJgorICAgICBnaXQgaW5pdCAmJgorICAgICBjcCB0ZXN0LTEtJHtwYWNrbmFtZV8xfS5wYWNrIHRlc3QtMS0ke3BhY2tuYW1lXzF9LmlkeCAuZ2l0Mi9vYmplY3RzL3BhY2sgJiYgeworCSBnaXQgZGlmZi10cmVlIC0tcm9vdCAtcCAkY29tbWl0ICYmCisJIHdoaWxlIHJlYWQgb2JqZWN0CisJIGRvCisJICAgIHQ9YGdpdCBjYXQtZmlsZSAtdCAkb2JqZWN0YCAmJgorCSAgICBnaXQgY2F0LWZpbGUgJHQgJG9iamVjdCB8fCByZXR1cm4gMQorCSBkb25lIDxvYmotbGlzdAorICAgIH0gPmN1cnJlbnQgJiYKKyAgICBkaWZmIGV4cGVjdCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndXNlIHBhY2tlZCBkZWx0aWZpZWQgKFJFRl9ERUxUQSkgb2JqZWN0cycgXAorICAgICdHSVRfT0JKRUNUX0RJUkVDVE9SWT0uZ2l0Mi9vYmplY3RzICYmCisgICAgIGV4cG9ydCBHSVRfT0JKRUNUX0RJUkVDVE9SWSAmJgorICAgICBybSAtZiAuZ2l0Mi9vYmplY3RzL3BhY2svdGVzdC0qICYmCisgICAgIGNwIHRlc3QtMi0ke3BhY2tuYW1lXzJ9LnBhY2sgdGVzdC0yLSR7cGFja25hbWVfMn0uaWR4IC5naXQyL29iamVjdHMvcGFjayAmJiB7CisJIGdpdCBkaWZmLXRyZWUgLS1yb290IC1wICRjb21taXQgJiYKKwkgd2hpbGUgcmVhZCBvYmplY3QKKwkgZG8KKwkgICAgdD1gZ2l0IGNhdC1maWxlIC10ICRvYmplY3RgICYmCisJICAgIGdpdCBjYXQtZmlsZSAkdCAkb2JqZWN0IHx8IHJldHVybiAxCisJIGRvbmUgPG9iai1saXN0CisgICAgfSA+Y3VycmVudCAmJgorICAgIGRpZmYgZXhwZWN0IGN1cnJlbnQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd1c2UgcGFja2VkIGRlbHRpZmllZCAoT0ZTX0RFTFRBKSBvYmplY3RzJyBcCisgICAgJ0dJVF9PQkpFQ1RfRElSRUNUT1JZPS5naXQyL29iamVjdHMgJiYKKyAgICAgZXhwb3J0IEdJVF9PQkpFQ1RfRElSRUNUT1JZICYmCisgICAgIHJtIC1mIC5naXQyL29iamVjdHMvcGFjay90ZXN0LSogJiYKKyAgICAgY3AgdGVzdC0zLSR7cGFja25hbWVfM30ucGFjayB0ZXN0LTMtJHtwYWNrbmFtZV8zfS5pZHggLmdpdDIvb2JqZWN0cy9wYWNrICYmIHsKKwkgZ2l0IGRpZmYtdHJlZSAtLXJvb3QgLXAgJGNvbW1pdCAmJgorCSB3aGlsZSByZWFkIG9iamVjdAorCSBkbworCSAgICB0PWBnaXQgY2F0LWZpbGUgLXQgJG9iamVjdGAgJiYKKwkgICAgZ2l0IGNhdC1maWxlICR0ICRvYmplY3QgfHwgcmV0dXJuIDEKKwkgZG9uZSA8b2JqLWxpc3QKKyAgICB9ID5jdXJyZW50ICYmCisgICAgZGlmZiBleHBlY3QgY3VycmVudCcKKwordW5zZXQgR0lUX09CSkVDVF9ESVJFQ1RPUlkKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZlcmlmeSBwYWNrJyBcCisgICAgJ2dpdCB2ZXJpZnktcGFjawl0ZXN0LTEtJHtwYWNrbmFtZV8xfS5pZHggXAorCQkJdGVzdC0yLSR7cGFja25hbWVfMn0uaWR4IFwKKwkJCXRlc3QtMy0ke3BhY2tuYW1lXzN9LmlkeCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZlcmlmeS1wYWNrIGNhdGNoZXMgbWlzbWF0Y2hlZCAuaWR4IGFuZCAucGFjayBmaWxlcycgXAorICAgICdjYXQgdGVzdC0xLSR7cGFja25hbWVfMX0uaWR4ID50ZXN0LTMuaWR4ICYmCisgICAgIGNhdCB0ZXN0LTItJHtwYWNrbmFtZV8yfS5wYWNrID50ZXN0LTMucGFjayAmJgorICAgICBpZiBnaXQgdmVyaWZ5LXBhY2sgdGVzdC0zLmlkeAorICAgICB0aGVuIGZhbHNlCisgICAgIGVsc2UgOjsKKyAgICAgZmknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2ZXJpZnktcGFjayBjYXRjaGVzIGEgY29ycnVwdGVkIHBhY2sgc2lnbmF0dXJlJyBcCisgICAgJ2NhdCB0ZXN0LTEtJHtwYWNrbmFtZV8xfS5wYWNrID50ZXN0LTMucGFjayAmJgorICAgICBkZCBpZj0vZGV2L3plcm8gb2Y9dGVzdC0zLnBhY2sgY291bnQ9MSBicz0xIGNvbnY9bm90cnVuYyBzZWVrPTIgJiYKKyAgICAgaWYgZ2l0IHZlcmlmeS1wYWNrIHRlc3QtMy5pZHgKKyAgICAgdGhlbiBmYWxzZQorICAgICBlbHNlIDo7CisgICAgIGZpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmVyaWZ5LXBhY2sgY2F0Y2hlcyBhIGNvcnJ1cHRlZCBwYWNrIHZlcnNpb24nIFwKKyAgICAnY2F0IHRlc3QtMS0ke3BhY2tuYW1lXzF9LnBhY2sgPnRlc3QtMy5wYWNrICYmCisgICAgIGRkIGlmPS9kZXYvemVybyBvZj10ZXN0LTMucGFjayBjb3VudD0xIGJzPTEgY29udj1ub3RydW5jIHNlZWs9NyAmJgorICAgICBpZiBnaXQgdmVyaWZ5LXBhY2sgdGVzdC0zLmlkeAorICAgICB0aGVuIGZhbHNlCisgICAgIGVsc2UgOjsKKyAgICAgZmknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2ZXJpZnktcGFjayBjYXRjaGVzIGEgY29ycnVwdGVkIHR5cGUvc2l6ZSBvZiB0aGUgMXN0IHBhY2tlZCBvYmplY3QgZGF0YScgXAorICAgICdjYXQgdGVzdC0xLSR7cGFja25hbWVfMX0ucGFjayA+dGVzdC0zLnBhY2sgJiYKKyAgICAgZGQgaWY9L2Rldi96ZXJvIG9mPXRlc3QtMy5wYWNrIGNvdW50PTEgYnM9MSBjb252PW5vdHJ1bmMgc2Vlaz0xMiAmJgorICAgICBpZiBnaXQgdmVyaWZ5LXBhY2sgdGVzdC0zLmlkeAorICAgICB0aGVuIGZhbHNlCisgICAgIGVsc2UgOjsKKyAgICAgZmknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2ZXJpZnktcGFjayBjYXRjaGVzIGEgY29ycnVwdGVkIHN1bSBvZiB0aGUgaW5kZXggZmlsZSBpdHNlbGYnIFwKKyAgICAnbD1gd2MgLWMgPHRlc3QtMy5pZHhgICYmCisgICAgIGw9YGV4cHIgJGwgLSAyMGAgJiYKKyAgICAgY2F0IHRlc3QtMS0ke3BhY2tuYW1lXzF9LnBhY2sgPnRlc3QtMy5wYWNrICYmCisgICAgIGRkIGlmPS9kZXYvemVybyBvZj10ZXN0LTMuaWR4IGNvdW50PTIwIGJzPTEgY29udj1ub3RydW5jIHNlZWs9JGwgJiYKKyAgICAgaWYgZ2l0IHZlcmlmeS1wYWNrIHRlc3QtMy5wYWNrCisgICAgIHRoZW4gZmFsc2UKKyAgICAgZWxzZSA6OworICAgICBmaScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2J1aWxkIHBhY2sgaW5kZXggZm9yIGFuIGV4aXN0aW5nIHBhY2snIFwKKyAgICAnY2F0IHRlc3QtMS0ke3BhY2tuYW1lXzF9LnBhY2sgPnRlc3QtMy5wYWNrICYmCisgICAgIGdpdC1pbmRleC1wYWNrIC1vIHRtcC5pZHggdGVzdC0zLnBhY2sgJiYKKyAgICAgY21wIHRtcC5pZHggdGVzdC0xLSR7cGFja25hbWVfMX0uaWR4ICYmCisKKyAgICAgZ2l0LWluZGV4LXBhY2sgdGVzdC0zLnBhY2sgJiYKKyAgICAgY21wIHRlc3QtMy5pZHggdGVzdC0xLSR7cGFja25hbWVfMX0uaWR4ICYmCisKKyAgICAgY2F0IHRlc3QtMi0ke3BhY2tuYW1lXzJ9LnBhY2sgPnRlc3QtMy5wYWNrICYmCisgICAgIGdpdC1pbmRleC1wYWNrIC1vIHRtcC5pZHggdGVzdC0yLSR7cGFja25hbWVfMn0ucGFjayAmJgorICAgICBjbXAgdG1wLmlkeCB0ZXN0LTItJHtwYWNrbmFtZV8yfS5pZHggJiYKKworICAgICBnaXQtaW5kZXgtcGFjayB0ZXN0LTMucGFjayAmJgorICAgICBjbXAgdGVzdC0zLmlkeCB0ZXN0LTItJHtwYWNrbmFtZV8yfS5pZHggJiYKKworICAgICBjYXQgdGVzdC0zLSR7cGFja25hbWVfM30ucGFjayA+dGVzdC0zLnBhY2sgJiYKKyAgICAgZ2l0LWluZGV4LXBhY2sgLW8gdG1wLmlkeCB0ZXN0LTMtJHtwYWNrbmFtZV8zfS5wYWNrICYmCisgICAgIGNtcCB0bXAuaWR4IHRlc3QtMy0ke3BhY2tuYW1lXzN9LmlkeCAmJgorCisgICAgIGdpdC1pbmRleC1wYWNrIHRlc3QtMy5wYWNrICYmCisgICAgIGNtcCB0ZXN0LTMuaWR4IHRlc3QtMy0ke3BhY2tuYW1lXzN9LmlkeCAmJgorCisgICAgIDonCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdmYWtlIGEgU0hBMSBoYXNoIGNvbGxpc2lvbicgXAorICAgICd0ZXN0IC1mCS5naXQvb2JqZWN0cy9jOC8yZGUxOTMxMmI2YzM2OTVjMGMxOGY3MDcwOWE2YzUzNTY4MmE2NyAmJgorICAgICBjcCAtZgkuZ2l0L29iamVjdHMvOWQvMjM1ZWQwN2NkMTk4MTFhNmNlYjM0MmRlODJmMTkwZTQ5YzlmNjggXAorCQkuZ2l0L29iamVjdHMvYzgvMmRlMTkzMTJiNmMzNjk1YzBjMThmNzA3MDlhNmM1MzU2ODJhNjcnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdtYWtlIHN1cmUgaW5kZXgtcGFjayBkZXRlY3RzIHRoZSBTSEExIGNvbGxpc2lvbicgXAorICAgICchIGdpdC1pbmRleC1wYWNrIC1vIGJhZC5pZHggdGVzdC0zLnBhY2snCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdob25vciBwYWNrLnBhY2tTaXplTGltaXQnIFwKKyAgICAnZ2l0IGNvbmZpZyBwYWNrLnBhY2tTaXplTGltaXQgMjAwICYmCisgICAgIHBhY2tuYW1lXzQ9JChnaXQgcGFjay1vYmplY3RzIHRlc3QtNCA8b2JqLWxpc3QpICYmCisgICAgIHRlc3QgMyA9ICQobHMgdGVzdC00LSoucGFjayB8IHdjIC1sKScKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1MzAxLXNsaWRpbmctd2luZG93LnNoIGIvdC90NTMwMS1zbGlkaW5nLXdpbmRvdy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNzNhYzBjCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTMwMS1zbGlkaW5nLXdpbmRvdy5zaApAQCAtMCwwICsxLDYwIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IFNoYXduIFBlYXJjZQorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdtbWFwIHNsaWRpbmcgd2luZG93IHRlc3RzJworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzZXR1cCcgXAorICAgICdybSAtZiAuZ2l0L2luZGV4KgorICAgICBmb3IgaSBpbiBhIGIgYworICAgICBkbworICAgICAgICAgZWNobyAkaSA+JGkgJiYKKyAgICAgICAgIHRlc3QtZ2VucmFuZG9tICIkaSIgMzI3NjggPj4kaSAmJgorICAgICAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAkaSB8fCByZXR1cm4gMQorICAgICBkb25lICYmCisgICAgIGVjaG8gZCA+ZCAmJiBjYXQgYyA+PmQgJiYgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBkICYmCisgICAgIHRyZWU9YGdpdCB3cml0ZS10cmVlYCAmJgorICAgICBjb21taXQxPWBnaXQgY29tbWl0LXRyZWUgJHRyZWUgPC9kZXYvbnVsbGAgJiYKKyAgICAgZ2l0IHVwZGF0ZS1yZWYgSEVBRCAkY29tbWl0MSAmJgorICAgICBnaXQtcmVwYWNrIC1hIC1kICYmCisgICAgIHRlc3QgImBnaXQgY291bnQtb2JqZWN0c2AiID0gIjAgb2JqZWN0cywgMCBraWxvYnl0ZXMiICYmCisgICAgIHBhY2sxPWBscyAuZ2l0L29iamVjdHMvcGFjay8qLnBhY2tgICYmCisgICAgIHRlc3QgLWYgIiRwYWNrMSInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2ZXJpZnktcGFjayAtdiwgZGVmYXVsdHMnIFwKKyAgICAnZ2l0IHZlcmlmeS1wYWNrIC12ICIkcGFjazEiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmVyaWZ5LXBhY2sgLXYsIHBhY2tlZEdpdFdpbmRvd1NpemUgPT0gMSBwYWdlJyBcCisgICAgJ2dpdCBjb25maWcgY29yZS5wYWNrZWRHaXRXaW5kb3dTaXplIDUxMiAmJgorICAgICBnaXQgdmVyaWZ5LXBhY2sgLXYgIiRwYWNrMSInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2ZXJpZnktcGFjayAtdiwgcGFja2VkR2l0e1dpbmRvd1NpemUsTGltaXR9ID09IDEgcGFnZScgXAorICAgICdnaXQgY29uZmlnIGNvcmUucGFja2VkR2l0V2luZG93U2l6ZSA1MTIgJiYKKyAgICAgZ2l0IGNvbmZpZyBjb3JlLnBhY2tlZEdpdExpbWl0IDUxMiAmJgorICAgICBnaXQgdmVyaWZ5LXBhY2sgLXYgIiRwYWNrMSInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdyZXBhY2sgLWEgLWQsIHBhY2tlZEdpdHtXaW5kb3dTaXplLExpbWl0fSA9PSAxIHBhZ2UnIFwKKyAgICAnZ2l0IGNvbmZpZyBjb3JlLnBhY2tlZEdpdFdpbmRvd1NpemUgNTEyICYmCisgICAgIGdpdCBjb25maWcgY29yZS5wYWNrZWRHaXRMaW1pdCA1MTIgJiYKKyAgICAgY29tbWl0Mj1gZ2l0IGNvbW1pdC10cmVlICR0cmVlIC1wICRjb21taXQxIDwvZGV2L251bGxgICYmCisgICAgIGdpdCB1cGRhdGUtcmVmIEhFQUQgJGNvbW1pdDIgJiYKKyAgICAgZ2l0LXJlcGFjayAtYSAtZCAmJgorICAgICB0ZXN0ICJgZ2l0IGNvdW50LW9iamVjdHNgIiA9ICIwIG9iamVjdHMsIDAga2lsb2J5dGVzIiAmJgorICAgICBwYWNrMj1gbHMgLmdpdC9vYmplY3RzL3BhY2svKi5wYWNrYCAmJgorICAgICB0ZXN0IC1mICIkcGFjazIiCisgICAgIHRlc3QgIiRwYWNrMSIgXCE9ICIkcGFjazIiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmVyaWZ5LXBhY2sgLXYsIGRlZmF1bHRzJyBcCisgICAgJ2dpdCBjb25maWcgLS11bnNldCBjb3JlLnBhY2tlZEdpdFdpbmRvd1NpemUgJiYKKyAgICAgZ2l0IGNvbmZpZyAtLXVuc2V0IGNvcmUucGFja2VkR2l0TGltaXQgJiYKKyAgICAgZ2l0IHZlcmlmeS1wYWNrIC12ICIkcGFjazIiJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDUzMDItcGFjay1pbmRleC5zaCBiL3QvdDUzMDItcGFjay1pbmRleC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iODhiNWJiCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTMwMi1wYWNrLWluZGV4LnNoCkBAIC0wLDAgKzEsMTY1IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3IE5pY29sYXMgUGl0cmUKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0ncGFjayBpbmRleCB3aXRoIDY0LWJpdCBvZmZzZXRzIGFuZCBvYmplY3QgQ1JDJworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzZXR1cCcgXAorICAgICdybSAtcmYgLmdpdAorICAgICBnaXQgaW5pdCAmJgorICAgICBpPTEgJiYKKwkgd2hpbGUgdGVzdCAkaSAtbGUgMTAwCisgICAgIGRvCisJCSBpPWBwcmludGYgJyUwM2knICRpYAorICAgICAgICAgZWNobyAkaSA+ZmlsZV8kaSAmJgorICAgICAgICAgdGVzdC1nZW5yYW5kb20gIiRpIiA4MTkyID4+ZmlsZV8kaSAmJgorICAgICAgICAgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBmaWxlXyRpICYmCisJCSBpPWBleHByICRpICsgMWAgfHwgcmV0dXJuIDEKKyAgICAgZG9uZSAmJgorICAgICB7IGVjaG8gMTAxICYmIHRlc3QtZ2VucmFuZG9tIDEwMCA4MTkyOyB9ID5maWxlXzEwMSAmJgorICAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGZpbGVfMTAxICYmCisgICAgIHRyZWU9YGdpdCB3cml0ZS10cmVlYCAmJgorICAgICBjb21taXQ9YGdpdCBjb21taXQtdHJlZSAkdHJlZSA8L2Rldi9udWxsYCAmJiB7CisJIGVjaG8gJHRyZWUgJiYKKwkgZ2l0IGxzLXRyZWUgJHRyZWUgfCBzZWQgLWUgInMvLiogXFwoWzAtOWEtZl0qXFwpCS4qL1xcMS8iCisgICAgIH0gPm9iai1saXN0ICYmCisgICAgIGdpdCB1cGRhdGUtcmVmIEhFQUQgJGNvbW1pdCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3BhY2stb2JqZWN0cyB3aXRoIGluZGV4IHZlcnNpb24gMScgXAorICAgICdwYWNrMT0kKGdpdCBwYWNrLW9iamVjdHMgLS1pbmRleC12ZXJzaW9uPTEgdGVzdC0xIDxvYmotbGlzdCkgJiYKKyAgICAgZ2l0IHZlcmlmeS1wYWNrIC12ICJ0ZXN0LTEtJHtwYWNrMX0ucGFjayInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwYWNrLW9iamVjdHMgd2l0aCBpbmRleCB2ZXJzaW9uIDInIFwKKyAgICAncGFjazI9JChnaXQgcGFjay1vYmplY3RzIC0taW5kZXgtdmVyc2lvbj0yIHRlc3QtMiA8b2JqLWxpc3QpICYmCisgICAgIGdpdCB2ZXJpZnktcGFjayAtdiAidGVzdC0yLSR7cGFjazJ9LnBhY2siJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnYm90aCBwYWNrcyBzaG91bGQgYmUgaWRlbnRpY2FsJyBcCisgICAgJ2NtcCAidGVzdC0xLSR7cGFjazF9LnBhY2siICJ0ZXN0LTItJHtwYWNrMn0ucGFjayInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdpbmRleCB2MSBhbmQgaW5kZXggdjIgc2hvdWxkIGJlIGRpZmZlcmVudCcgXAorICAgICchIGNtcCAidGVzdC0xLSR7cGFjazF9LmlkeCIgInRlc3QtMi0ke3BhY2syfS5pZHgiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnaW5kZXgtcGFjayB3aXRoIGluZGV4IHZlcnNpb24gMScgXAorICAgICdnaXQtaW5kZXgtcGFjayAtLWluZGV4LXZlcnNpb249MSAtbyAxLmlkeCAidGVzdC0xLSR7cGFjazF9LnBhY2siJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnaW5kZXgtcGFjayB3aXRoIGluZGV4IHZlcnNpb24gMicgXAorICAgICdnaXQtaW5kZXgtcGFjayAtLWluZGV4LXZlcnNpb249MiAtbyAyLmlkeCAidGVzdC0xLSR7cGFjazF9LnBhY2siJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnaW5kZXgtcGFjayByZXN1bHRzIHNob3VsZCBtYXRjaCBwYWNrLW9iamVjdHMgb25lcycgXAorICAgICdjbXAgInRlc3QtMS0ke3BhY2sxfS5pZHgiICIxLmlkeCIgJiYKKyAgICAgY21wICJ0ZXN0LTItJHtwYWNrMn0uaWR4IiAiMi5pZHgiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnaW5kZXggdjI6IGZvcmNlIHNvbWUgNjQtYml0IG9mZnNldHMgd2l0aCBwYWNrLW9iamVjdHMnIFwKKyAgICAncGFjazM9JChnaXQgcGFjay1vYmplY3RzIC0taW5kZXgtdmVyc2lvbj0yLDB4NDAwMDAgdGVzdC0zIDxvYmotbGlzdCknCisKK2hhdmVfNjRiaXRzPQoraWYgbXNnPSQoZ2l0IHZlcmlmeS1wYWNrIC12ICJ0ZXN0LTMtJHtwYWNrM30ucGFjayIgMj4mMSkgfHwKKwkhIGVjaG8gIiRtc2ciIHwgZ3JlcCAicGFjayB0b28gbGFyZ2UgLiogb2ZmX3QiCit0aGVuCisJaGF2ZV82NGJpdHM9dAorZWxzZQorCXNheSAic2tpcHBpbmcgdGVzdHMgY29uY2VybmluZyA2NC1iaXQgb2Zmc2V0cyIKK2ZpCisKK3Rlc3QgIiRoYXZlXzY0Yml0cyIgJiYKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdpbmRleCB2MjogdmVyaWZ5IGEgcGFjayB3aXRoIHNvbWUgNjQtYml0IG9mZnNldHMnIFwKKyAgICAnZ2l0IHZlcmlmeS1wYWNrIC12ICJ0ZXN0LTMtJHtwYWNrM30ucGFjayInCisKK3Rlc3QgIiRoYXZlXzY0Yml0cyIgJiYKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc2NC1iaXQgb2Zmc2V0czogc2hvdWxkIGJlIGRpZmZlcmVudCBmcm9tIHByZXZpb3VzIGluZGV4IHYyIHJlc3VsdHMnIFwKKyAgICAnISBjbXAgInRlc3QtMi0ke3BhY2syfS5pZHgiICJ0ZXN0LTMtJHtwYWNrM30uaWR4IicKKwordGVzdCAiJGhhdmVfNjRiaXRzIiAmJgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2luZGV4IHYyOiBmb3JjZSBzb21lIDY0LWJpdCBvZmZzZXRzIHdpdGggaW5kZXgtcGFjaycgXAorICAgICdnaXQtaW5kZXgtcGFjayAtLWluZGV4LXZlcnNpb249MiwweDQwMDAwIC1vIDMuaWR4ICJ0ZXN0LTEtJHtwYWNrMX0ucGFjayInCisKK3Rlc3QgIiRoYXZlXzY0Yml0cyIgJiYKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc2NC1iaXQgb2Zmc2V0czogaW5kZXgtcGFjayByZXN1bHQgc2hvdWxkIG1hdGNoIHBhY2stb2JqZWN0cyBvbmUnIFwKKyAgICAnY21wICJ0ZXN0LTMtJHtwYWNrM30uaWR4IiAiMy5pZHgiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnW2luZGV4IHYxXSAxKSBzdHJlYW0gcGFjayB0byByZXBvc2l0b3J5JyBcCisgICAgJ2dpdC1pbmRleC1wYWNrIC0taW5kZXgtdmVyc2lvbj0xIC0tc3RkaW4gPCAidGVzdC0xLSR7cGFjazF9LnBhY2siICYmCisgICAgIGdpdCBwcnVuZS1wYWNrZWQgJiYKKyAgICAgZ2l0IGNvdW50LW9iamVjdHMgfCAoIHJlYWQgbnIgcmVzdCAmJiB0ZXN0ICIkbnIiIC1lcSAxICkgJiYKKyAgICAgY21wICJ0ZXN0LTEtJHtwYWNrMX0ucGFjayIgIi5naXQvb2JqZWN0cy9wYWNrL3BhY2stJHtwYWNrMX0ucGFjayIgJiYKKyAgICAgY21wICJ0ZXN0LTEtJHtwYWNrMX0uaWR4IiAgIi5naXQvb2JqZWN0cy9wYWNrL3BhY2stJHtwYWNrMX0uaWR4IicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1tpbmRleCB2MV0gMikgY3JlYXRlIGEgc3RlYWx0aCBjb3JydXB0aW9uIGluIGEgZGVsdGEgYmFzZSByZWZlcmVuY2UnIFwKKyAgICAnIyB0aGlzIHRlc3QgYXNzdW1lcyBhIGRlbHRhIHNtYWxsZXIgdGhhbiAxNiBieXRlcyBhdCB0aGUgZW5kIG9mIHRoZSBwYWNrCisgICAgIGdpdCBzaG93LWluZGV4IDwxLmlkeCB8IHNvcnQgLW4gfCBzZWQgLW5lIFwkcCB8ICgKKyAgICAgICByZWFkIGRlbHRhX29mZnMgZGVsdGFfc2hhMSAmJgorICAgICAgIGdpdCBjYXQtZmlsZSBibG9iICIkZGVsdGFfc2hhMSIgPiBibG9iXzEgJiYKKyAgICAgICBjaG1vZCArdyAiLmdpdC9vYmplY3RzL3BhY2svcGFjay0ke3BhY2sxfS5wYWNrIiAmJgorICAgICAgIGRkIG9mPSIuZ2l0L29iamVjdHMvcGFjay9wYWNrLSR7cGFjazF9LnBhY2siIHNlZWs9JCgoJGRlbHRhX29mZnMgKyAxKSkgXAorCSAgaWY9Ii5naXQvb2JqZWN0cy9wYWNrL3BhY2stJHtwYWNrMX0uaWR4IiBza2lwPSQoKDI1NiAqIDQgKyA0KSkgXAorCSAgYnM9MSBjb3VudD0yMCBjb252PW5vdHJ1bmMgJiYKKyAgICAgICBnaXQgY2F0LWZpbGUgYmxvYiAiJGRlbHRhX3NoYTEiID4gYmxvYl8yICknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdbaW5kZXggdjFdIDMpIGNvcnJ1cHRlZCBkZWx0YSBoYXBwaWx5IHJldHVybmVkIHdyb25nIGRhdGEnIFwKKyAgICAnISBjbXAgYmxvYl8xIGJsb2JfMicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1tpbmRleCB2MV0gNCkgY29uZmlybSB0aGF0IHRoZSBwYWNrIGlzIGFjdHVhbGx5IGNvcnJ1cHRlZCcgXAorICAgICchIGdpdCBmc2NrIC0tZnVsbCAkY29tbWl0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnW2luZGV4IHYxXSA1KSBwYWNrLW9iamVjdHMgaGFwcGlseSByZXVzZXMgY29ycnVwdGVkIGRhdGEnIFwKKyAgICAncGFjazQ9JChnaXQgcGFjay1vYmplY3RzIHRlc3QtNCA8b2JqLWxpc3QpICYmCisgICAgIHRlc3QgLWYgInRlc3QtNC0ke3BhY2sxfS5wYWNrIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1tpbmRleCB2MV0gNikgbmV3bHkgY3JlYXRlZCBwYWNrIGlzIEJBRCAhJyBcCisgICAgJyEgZ2l0IHZlcmlmeS1wYWNrIC12ICJ0ZXN0LTQtJHtwYWNrMX0ucGFjayInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdbaW5kZXggdjJdIDEpIHN0cmVhbSBwYWNrIHRvIHJlcG9zaXRvcnknIFwKKyAgICAncm0gLWYgLmdpdC9vYmplY3RzL3BhY2svKiAmJgorICAgICBnaXQtaW5kZXgtcGFjayAtLWluZGV4LXZlcnNpb249MiAtLXN0ZGluIDwgInRlc3QtMS0ke3BhY2sxfS5wYWNrIiAmJgorICAgICBnaXQgcHJ1bmUtcGFja2VkICYmCisgICAgIGdpdCBjb3VudC1vYmplY3RzIHwgKCByZWFkIG5yIHJlc3QgJiYgdGVzdCAiJG5yIiAtZXEgMSApICYmCisgICAgIGNtcCAidGVzdC0xLSR7cGFjazF9LnBhY2siICIuZ2l0L29iamVjdHMvcGFjay9wYWNrLSR7cGFjazF9LnBhY2siICYmCisgICAgIGNtcCAidGVzdC0yLSR7cGFjazF9LmlkeCIgICIuZ2l0L29iamVjdHMvcGFjay9wYWNrLSR7cGFjazF9LmlkeCInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdbaW5kZXggdjJdIDIpIGNyZWF0ZSBhIHN0ZWFsdGggY29ycnVwdGlvbiBpbiBhIGRlbHRhIGJhc2UgcmVmZXJlbmNlJyBcCisgICAgJyMgdGhpcyB0ZXN0IGFzc3VtZXMgYSBkZWx0YSBzbWFsbGVyIHRoYW4gMTYgYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGUgcGFjaworICAgICBnaXQgc2hvdy1pbmRleCA8MS5pZHggfCBzb3J0IC1uIHwgc2VkIC1uZSBcJHAgfCAoCisgICAgICAgcmVhZCBkZWx0YV9vZmZzIGRlbHRhX3NoYTEgZGVsdGFfY3JjICYmCisgICAgICAgZ2l0IGNhdC1maWxlIGJsb2IgIiRkZWx0YV9zaGExIiA+IGJsb2JfMyAmJgorICAgICAgIGNobW9kICt3ICIuZ2l0L29iamVjdHMvcGFjay9wYWNrLSR7cGFjazF9LnBhY2siICYmCisgICAgICAgZGQgb2Y9Ii5naXQvb2JqZWN0cy9wYWNrL3BhY2stJHtwYWNrMX0ucGFjayIgc2Vlaz0kKCgkZGVsdGFfb2ZmcyArIDEpKSBcCisJICBpZj0iLmdpdC9vYmplY3RzL3BhY2svcGFjay0ke3BhY2sxfS5pZHgiIHNraXA9JCgoOCArIDI1NiAqIDQpKSBcCisJICBicz0xIGNvdW50PTIwIGNvbnY9bm90cnVuYyAmJgorICAgICAgIGdpdCBjYXQtZmlsZSBibG9iICIkZGVsdGFfc2hhMSIgPiBibG9iXzQgKScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1tpbmRleCB2Ml0gMykgY29ycnVwdGVkIGRlbHRhIGhhcHBpbHkgcmV0dXJuZWQgd3JvbmcgZGF0YScgXAorICAgICchIGNtcCBibG9iXzMgYmxvYl80JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnW2luZGV4IHYyXSA0KSBjb25maXJtIHRoYXQgdGhlIHBhY2sgaXMgYWN0dWFsbHkgY29ycnVwdGVkJyBcCisgICAgJyEgZ2l0IGZzY2sgLS1mdWxsICRjb21taXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdbaW5kZXggdjJdIDUpIHBhY2stb2JqZWN0cyByZWZ1c2VzIHRvIHJldXNlIGNvcnJ1cHRlZCBkYXRhJyBcCisgICAgJyEgZ2l0IHBhY2stb2JqZWN0cyB0ZXN0LTUgPG9iai1saXN0JworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDUzMDMtaGFzaC1vYmplY3Quc2ggYi90L3Q1MzAzLWhhc2gtb2JqZWN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU0M2MwNzgKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MzAzLWhhc2gtb2JqZWN0LnNoCkBAIC0wLDAgKzEsMzUgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPWdpdC1oYXNoLW9iamVjdAorCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBoYXNoLW9iamVjdCAtdyAtLXN0ZGluIHNhdmVzIHRoZSBvYmplY3QnIFwKKyAgICAnb2JuYW1lPSQoZWNobyBmb28gfCBnaXQgaGFzaC1vYmplY3QgLXcgLS1zdGRpbikgJiYKKyAgICBvYnBhdGg9JChlY2hvICRvYm5hbWUgfCBzZWQgLWUgInMvXCguLlwpL1wxXC8vIikgJiYKKyAgICB0ZXN0IC1yIC5naXQvb2JqZWN0cy8iJG9icGF0aCIgJiYKKyAgICBybSAtZiAuZ2l0L29iamVjdHMvIiRvYnBhdGgiJworICAgIAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBoYXNoLW9iamVjdCAtLXN0ZGluIC13IHNhdmVzIHRoZSBvYmplY3QnIFwKKyAgICAnb2JuYW1lPSQoZWNobyBmb28gfCBnaXQgaGFzaC1vYmplY3QgLS1zdGRpbiAtdykgJiYKKyAgICBvYnBhdGg9JChlY2hvICRvYm5hbWUgfCBzZWQgLWUgInMvXCguLlwpL1wxXC8vIikgJiYKKyAgICB0ZXN0IC1yIC5naXQvb2JqZWN0cy8iJG9icGF0aCIgJiYKKyAgICBybSAtZiAuZ2l0L29iamVjdHMvIiRvYnBhdGgiJyAgICAKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBoYXNoLW9iamVjdCAtLXN0ZGluIGZpbGUxIDxmaWxlMCBmaXJzdCBvcGVyYXRlcyBvbiBmaWxlMCwgdGhlbiBmaWxlMScgXAorICAgICdlY2hvIGZvbyA+IGZpbGUxICYmCisgICAgb2JuYW1lMD0kKGVjaG8gYmFyIHwgZ2l0IGhhc2gtb2JqZWN0IC0tc3RkaW4pICYmCisgICAgb2JuYW1lMT0kKGdpdCBoYXNoLW9iamVjdCBmaWxlMSkgJiYKKyAgICBvYm5hbWUwbmV3PSQoZWNobyBiYXIgfCBnaXQgaGFzaC1vYmplY3QgLS1zdGRpbiBmaWxlMSB8IHNlZCAtbiAtZSAxcCkgJiYKKyAgICBvYm5hbWUxbmV3PSQoZWNobyBiYXIgfCBnaXQgaGFzaC1vYmplY3QgLS1zdGRpbiBmaWxlMSB8IHNlZCAtbiAtZSAycCkgJiYKKyAgICB0ZXN0ICIkb2JuYW1lMCIgPSAiJG9ibmFtZTBuZXciICYmCisgICAgdGVzdCAiJG9ibmFtZTEiID0gIiRvYm5hbWUxbmV3IicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBoYXNoLW9iamVjdCByZWZ1c2VzIG11bHRpcGxlIC0tc3RkaW4gYXJndW1lbnRzJyBcCisgICAgJyEgZ2l0IGhhc2gtb2JqZWN0IC0tc3RkaW4gLS1zdGRpbiA8IGZpbGUxJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDUzMDQtcHJ1bmUuc2ggYi90L3Q1MzA0LXBydW5lLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZDlkMDcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MzA0LXBydW5lLnNoCkBAIC0wLDAgKzEsMTE1IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA4IEpvaGFubmVzIEUuIFNjaGluZGVsaW4KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0ncHJ1bmUnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwk6ID4gZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gaW5pdGlhbCAmJgorCWdpdCBnYworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3BydW5lIHN0YWxlIHBhY2tzJyAnCisKKwlvcmlnX3BhY2s9JChlY2hvIC5naXQvb2JqZWN0cy9wYWNrLyoucGFjaykgJiYKKwk6ID4gLmdpdC9vYmplY3RzL3RtcF8xLnBhY2sgJiYKKwk6ID4gLmdpdC9vYmplY3RzL3RtcF8yLnBhY2sgJiYKKwl0ZXN0LWNobXRpbWUgLTg2NTAxIC5naXQvb2JqZWN0cy90bXBfMS5wYWNrICYmCisJZ2l0IHBydW5lIC0tZXhwaXJlIDEuZGF5ICYmCisJdGVzdCAtZiAkb3JpZ19wYWNrICYmCisJdGVzdCAtZiAuZ2l0L29iamVjdHMvdG1wXzIucGFjayAmJgorCSEgdGVzdCAtZiAuZ2l0L29iamVjdHMvdG1wXzEucGFjaworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3BydW5lIC0tZXhwaXJlJyAnCisKKwliZWZvcmU9JChnaXQgY291bnQtb2JqZWN0cyB8IHNlZCAicy8gLiovLyIpICYmCisJQkxPQj0kKGVjaG8gYWxlcGggfCBnaXQgaGFzaC1vYmplY3QgLXcgLS1zdGRpbikgJiYKKwlCTE9CX0ZJTEU9LmdpdC9vYmplY3RzLyQoZWNobyAkQkxPQiB8IHNlZCAicy9eLi4vJlwvLyIpICYmCisJdGVzdCAkKCgxICsgJGJlZm9yZSkpID0gJChnaXQgY291bnQtb2JqZWN0cyB8IHNlZCAicy8gLiovLyIpICYmCisJdGVzdCAtZiAkQkxPQl9GSUxFICYmCisJZ2l0IHBydW5lIC0tZXhwaXJlPTEuaG91ci5hZ28gJiYKKwl0ZXN0ICQoKDEgKyAkYmVmb3JlKSkgPSAkKGdpdCBjb3VudC1vYmplY3RzIHwgc2VkICJzLyAuKi8vIikgJiYKKwl0ZXN0IC1mICRCTE9CX0ZJTEUgJiYKKwl0ZXN0LWNobXRpbWUgLTg2NTAwICRCTE9CX0ZJTEUgJiYKKwlnaXQgcHJ1bmUgLS1leHBpcmUgMS5kYXkgJiYKKwl0ZXN0ICRiZWZvcmUgPSAkKGdpdCBjb3VudC1vYmplY3RzIHwgc2VkICJzLyAuKi8vIikgJiYKKwkhIHRlc3QgLWYgJEJMT0JfRklMRQorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2djOiBpbXBsaWNpdCBwcnVuZSAtLWV4cGlyZScgJworCisJYmVmb3JlPSQoZ2l0IGNvdW50LW9iamVjdHMgfCBzZWQgInMvIC4qLy8iKSAmJgorCUJMT0I9JChlY2hvIGFsZXBoXzAgfCBnaXQgaGFzaC1vYmplY3QgLXcgLS1zdGRpbikgJiYKKwlCTE9CX0ZJTEU9LmdpdC9vYmplY3RzLyQoZWNobyAkQkxPQiB8IHNlZCAicy9eLi4vJlwvLyIpICYmCisJdGVzdCAkKCgxICsgJGJlZm9yZSkpID0gJChnaXQgY291bnQtb2JqZWN0cyB8IHNlZCAicy8gLiovLyIpICYmCisJdGVzdCAtZiAkQkxPQl9GSUxFICYmCisJdGVzdC1jaG10aW1lIC0kKCg4NjQwMCoxNC0zMCkpICRCTE9CX0ZJTEUgJiYKKwlnaXQgZ2MgJiYKKwl0ZXN0ICQoKDEgKyAkYmVmb3JlKSkgPSAkKGdpdCBjb3VudC1vYmplY3RzIHwgc2VkICJzLyAuKi8vIikgJiYKKwl0ZXN0IC1mICRCTE9CX0ZJTEUgJiYKKwl0ZXN0LWNobXRpbWUgLSQoKDg2NDAwKjE0KzEpKSAkQkxPQl9GSUxFICYmCisJZ2l0IGdjICYmCisJdGVzdCAkYmVmb3JlID0gJChnaXQgY291bnQtb2JqZWN0cyB8IHNlZCAicy8gLiovLyIpICYmCisJISB0ZXN0IC1mICRCTE9CX0ZJTEUKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnYzogcmVmdXNlIHRvIHN0YXJ0IHdpdGggaW52YWxpZCBnYy5wcnVuZUV4cGlyZScgJworCisJZ2l0IGNvbmZpZyBnYy5wcnVuZUV4cGlyZSBpbnZhbGlkICYmCisJdGVzdF9tdXN0X2ZhaWwgZ2l0IGdjCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2M6IHN0YXJ0IHdpdGggb2sgZ2MucHJ1bmVFeHBpcmUnICcKKworCWdpdCBjb25maWcgZ2MucHJ1bmVFeHBpcmUgMi5kYXlzLmFnbyAmJgorCWdpdCBnYworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3BydW5lOiBwcnVuZSBub25zZW5zZSBwYXJhbWV0ZXJzJyAnCisKKwl0ZXN0X211c3RfZmFpbCBnaXQgcHJ1bmUgZ2FyYmFnZSAmJgorCXRlc3RfbXVzdF9mYWlsIGdpdCBwcnVuZSAtLS0gJiYKKwl0ZXN0X211c3RfZmFpbCBnaXQgcHJ1bmUgLS1uby1zdWNoLW9wdGlvbgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3BydW5lOiBwcnVuZSB1bnJlYWNoYWJsZSBoZWFkcycgJworCisJZ2l0IGNvbmZpZyBjb3JlLmxvZ0FsbFJlZlVwZGF0ZXMgZmFsc2UgJiYKKwltdiAuZ2l0L2xvZ3MgLmdpdC9sb2dzLm9sZCAmJgorCTogPiBmaWxlMiAmJgorCWdpdCBhZGQgZmlsZTIgJiYKKwlnaXQgY29tbWl0IC1tIHRlbXBvcmFyeSAmJgorCXRtcF9oZWFkPSQoZ2l0IHJldi1saXN0IC0xIEhFQUQpICYmCisJZ2l0IHJlc2V0IEhFQUReICYmCisJZ2l0IHBydW5lICYmCisJdGVzdF9tdXN0X2ZhaWwgZ2l0IHJlc2V0ICR0bXBfaGVhZCAtLQorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3BydW5lOiBkbyBub3QgcHJ1bmUgaGVhZHMgbGlzdGVkIGFzIGFuIGFyZ3VtZW50JyAnCisKKwk6ID4gZmlsZTIgJiYKKwlnaXQgYWRkIGZpbGUyICYmCisJZ2l0IGNvbW1pdCAtbSB0ZW1wb3JhcnkgJiYKKwl0bXBfaGVhZD0kKGdpdCByZXYtbGlzdCAtMSBIRUFEKSAmJgorCWdpdCByZXNldCBIRUFEXiAmJgorCWdpdCBwcnVuZSAtLSAkdG1wX2hlYWQgJiYKKwlnaXQgcmVzZXQgJHRtcF9oZWFkIC0tCisKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1MzA1LWluY2x1ZGUtdGFnLnNoIGIvdC90NTMwNS1pbmNsdWRlLXRhZy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZGIyNzU0Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTMwNS1pbmNsdWRlLXRhZy5zaApAQCAtMCwwICsxLDg0IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LXBhY2stb2JqZWN0IC0taW5jbHVkZS10YWcnCisuIC4vdGVzdC1saWIuc2gKKworVFJBU0g9YHB3ZGAKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJZWNobyBjID5kICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBkICYmCisJdHJlZT1gZ2l0IHdyaXRlLXRyZWVgICYmCisJY29tbWl0PWBnaXQgY29tbWl0LXRyZWUgJHRyZWUgPC9kZXYvbnVsbGAgJiYKKwllY2hvICJvYmplY3QgJGNvbW1pdCIgPnNpZyAmJgorCWVjaG8gInR5cGUgY29tbWl0IiA+PnNpZyAmJgorCWVjaG8gInRhZyBteXRhZyIgPj5zaWcgJiYKKwllY2hvICJ0YWdnZXIgJChnaXQgdmFyIEdJVF9DT01NSVRURVJfSURFTlQpIiA+PnNpZyAmJgorCWVjaG8gPj5zaWcgJiYKKwllY2hvICJvdXIgdGVzdCB0YWciID4+c2lnICYmCisJdGFnPWBnaXQgbWt0YWcgPHNpZ2AgJiYKKwlybSBkIHNpZyAmJgorCWdpdCB1cGRhdGUtcmVmIHJlZnMvdGFncy9teXRhZyAkdGFnICYmIHsKKwkJZWNobyAkdHJlZSAmJgorCQllY2hvICRjb21taXQgJiYKKwkJZ2l0IGxzLXRyZWUgJHRyZWUgfCBzZWQgLWUgInMvLiogXFwoWzAtOWEtZl0qXFwpCS4qL1xcMS8iCisJfSA+b2JqLWxpc3QKKycKKworcm0gLXJmIGNsb25lLmdpdAordGVzdF9leHBlY3Rfc3VjY2VzcyAncGFjayB3aXRob3V0IC0taW5jbHVkZS10YWcnICcKKwlwYWNrbmFtZV8xPSQoZ2l0IHBhY2stb2JqZWN0cyBcCisJCS0td2luZG93PTAgXAorCQl0ZXN0LTEgPG9iai1saXN0KQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1bnBhY2sgb2JqZWN0cycgJworCSgKKwkJR0lUX0RJUj1jbG9uZS5naXQgJiYKKwkJZXhwb3J0IEdJVF9ESVIgJiYKKwkJZ2l0IGluaXQgJiYKKwkJZ2l0IHVucGFjay1vYmplY3RzIC1uIDx0ZXN0LTEtJHtwYWNrbmFtZV8xfS5wYWNrICYmCisJCWdpdCB1bnBhY2stb2JqZWN0cyA8dGVzdC0xLSR7cGFja25hbWVfMX0ucGFjaworCSkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgdW5wYWNrZWQgcmVzdWx0IChoYXZlIGNvbW1pdCwgbm8gdGFnKScgJworCWdpdCByZXYtbGlzdCAtLW9iamVjdHMgJGNvbW1pdCA+bGlzdC5leHBlY3QgJiYKKwkoCisJCUdJVF9ESVI9Y2xvbmUuZ2l0ICYmCisJCWV4cG9ydCBHSVRfRElSICYmCisJCXRlc3RfbXVzdF9mYWlsIGdpdCBjYXQtZmlsZSAtZSAkdGFnICYmCisJCWdpdCByZXYtbGlzdCAtLW9iamVjdHMgJGNvbW1pdAorCSkgPmxpc3QuYWN0dWFsICYmCisJZ2l0IGRpZmYgbGlzdC5leHBlY3QgbGlzdC5hY3R1YWwKKycKKworcm0gLXJmIGNsb25lLmdpdAordGVzdF9leHBlY3Rfc3VjY2VzcyAncGFjayB3aXRoIC0taW5jbHVkZS10YWcnICcKKwlwYWNrbmFtZV8xPSQoZ2l0IHBhY2stb2JqZWN0cyBcCisJCS0td2luZG93PTAgXAorCQktLWluY2x1ZGUtdGFnIFwKKwkJdGVzdC0yIDxvYmotbGlzdCkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndW5wYWNrIG9iamVjdHMnICcKKwkoCisJCUdJVF9ESVI9Y2xvbmUuZ2l0ICYmCisJCWV4cG9ydCBHSVRfRElSICYmCisJCWdpdCBpbml0ICYmCisJCWdpdCB1bnBhY2stb2JqZWN0cyAtbiA8dGVzdC0yLSR7cGFja25hbWVfMX0ucGFjayAmJgorCQlnaXQgdW5wYWNrLW9iamVjdHMgPHRlc3QtMi0ke3BhY2tuYW1lXzF9LnBhY2sKKwkpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrIHVucGFja2VkIHJlc3VsdCAoaGF2ZSBjb21taXQsIGhhdmUgdGFnKScgJworCWdpdCByZXYtbGlzdCAtLW9iamVjdHMgbXl0YWcgPmxpc3QuZXhwZWN0ICYmCisJKAorCQlHSVRfRElSPWNsb25lLmdpdCAmJgorCQlleHBvcnQgR0lUX0RJUiAmJgorCQlnaXQgcmV2LWxpc3QgLS1vYmplY3RzICR0YWcKKwkpID5saXN0LmFjdHVhbCAmJgorCWdpdCBkaWZmIGxpc3QuZXhwZWN0IGxpc3QuYWN0dWFsCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NTQwMC1zZW5kLXBhY2suc2ggYi90L3Q1NDAwLXNlbmQtcGFjay5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYjZiNmUzCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTQwMC1zZW5kLXBhY2suc2gKQEAgLTAsMCArMSwxNzQgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nU2VlIHdoeSByZXdpbmRpbmcgaGVhZCBicmVha3Mgc2VuZC1wYWNrCisKKycKKy4gLi90ZXN0LWxpYi5zaAorCitjbnQ9NjQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCXRlc3RfdGljayAmJgorCW1rZGlyIG1vemFydCBtb3phcnQvaXMgJiYKKwllY2hvICJDb21taXQgIzAiID5tb3phcnQvaXMvcGluayAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgbW96YXJ0L2lzL3BpbmsgJiYKKwl0cmVlPSQoZ2l0IHdyaXRlLXRyZWUpICYmCisJY29tbWl0PSQoZWNobyAiQ29tbWl0ICMwIiB8IGdpdCBjb21taXQtdHJlZSAkdHJlZSkgJiYKKwl6ZXJvPSRjb21taXQgJiYKKwlwYXJlbnQ9JHplcm8gJiYKKwlpPTAgJiYKKwl3aGlsZSB0ZXN0ICRpIC1sZSAkY250CisJZG8KKwkgICAgaT0kKCgkaSsxKSkgJiYKKwkgICAgdGVzdF90aWNrICYmCisJICAgIGVjaG8gIkNvbW1pdCAjJGkiID5tb3phcnQvaXMvcGluayAmJgorCSAgICBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIG1vemFydC9pcy9waW5rICYmCisJICAgIHRyZWU9JChnaXQgd3JpdGUtdHJlZSkgJiYKKwkgICAgY29tbWl0PSQoZWNobyAiQ29tbWl0ICMkaSIgfCBnaXQgY29tbWl0LXRyZWUgJHRyZWUgLXAgJHBhcmVudCkgJiYKKwkgICAgZ2l0IHVwZGF0ZS1yZWYgcmVmcy90YWdzL2NvbW1pdCRpICRjb21taXQgJiYKKwkgICAgcGFyZW50PSRjb21taXQgfHwgcmV0dXJuIDEKKwlkb25lICYmCisJZ2l0IHVwZGF0ZS1yZWYgSEVBRCAiJGNvbW1pdCIgJiYKKwlnaXQtY2xvbmUgLi8uIHZpY3RpbSAmJgorCWNkIHZpY3RpbSAmJgorCWdpdCBsb2cgJiYKKwljZCAuLiAmJgorCWdpdCB1cGRhdGUtcmVmIEhFQUQgIiR6ZXJvIiAmJgorCXBhcmVudD0kemVybyAmJgorCWk9MCAmJgorCXdoaWxlIHRlc3QgJGkgLWxlICRjbnQKKwlkbworCSAgICBpPSQoKCRpKzEpKSAmJgorCSAgICB0ZXN0X3RpY2sgJiYKKwkgICAgZWNobyAiUmViYXNlICMkaSIgPm1vemFydC9pcy9waW5rICYmCisJICAgIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgbW96YXJ0L2lzL3BpbmsgJiYKKwkgICAgdHJlZT0kKGdpdCB3cml0ZS10cmVlKSAmJgorCSAgICBjb21taXQ9JChlY2hvICJSZWJhc2UgIyRpIiB8IGdpdCBjb21taXQtdHJlZSAkdHJlZSAtcCAkcGFyZW50KSAmJgorCSAgICBnaXQgdXBkYXRlLXJlZiByZWZzL3RhZ3MvcmViYXNlJGkgJGNvbW1pdCAmJgorCSAgICBwYXJlbnQ9JGNvbW1pdCB8fCByZXR1cm4gMQorCWRvbmUgJiYKKwlnaXQgdXBkYXRlLXJlZiBIRUFEICIkY29tbWl0IiAmJgorCWVjaG8gUmViYXNlICYmCisJZ2l0IGxvZycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncGFjayB0aGUgc291cmNlIHJlcG9zaXRvcnknICcKKwlnaXQgcmVwYWNrIC1hIC1kICYmCisJZ2l0IHBydW5lCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3BhY2sgdGhlIGRlc3RpbmF0aW9uIHJlcG9zaXRvcnknICcKKwljZCB2aWN0aW0gJiYKKwlnaXQgcmVwYWNrIC1hIC1kICYmCisJZ2l0IHBydW5lICYmCisJY2QgLi4KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgICAgICdwdXNoaW5nIHJld291bmQgaGVhZCBzaG91bGQgbm90IGJhcmYgYnV0IHJlcXVpcmUgLS1mb3JjZScgJworCSMgc2hvdWxkIG5vdCBmYWlsIGJ1dCByZWZ1c2UgdG8gdXBkYXRlLgorCWlmIGdpdC1zZW5kLXBhY2sgLi92aWN0aW0vLmdpdC8gbWFzdGVyCisJdGhlbgorCQkjIG5vdyBpdCBzaG91bGQgZmFpbCB3aXRoIFBhc2t5IHBhdGNoCisJCWVjaG8gPiYyIEdhYWgsIGl0IHNob3VsZCBoYXZlIGZhaWxlZC4KKwkJZmFsc2UKKwllbHNlCisJCWVjaG8gPiYyIFRoYW5rcywgaXQgY29ycmVjdGx5IGZhaWxlZC4KKwkJdHJ1ZQorCWZpICYmCisJaWYgY21wIHZpY3RpbS8uZ2l0L3JlZnMvaGVhZHMvbWFzdGVyIC5naXQvcmVmcy9oZWFkcy9tYXN0ZXIKKwl0aGVuCisJCSMgc2hvdWxkIGhhdmUgYmVlbiBsZWZ0IGFzIGl0IHdhcyEKKwkJZmFsc2UKKwllbHNlCisJCXRydWUKKwlmaSAmJgorCSMgdGhpcyBzaG91bGQgdXBkYXRlCisJZ2l0LXNlbmQtcGFjayAtLWZvcmNlIC4vdmljdGltLy5naXQvIG1hc3RlciAmJgorCWNtcCB2aWN0aW0vLmdpdC9yZWZzL2hlYWRzL21hc3RlciAuZ2l0L3JlZnMvaGVhZHMvbWFzdGVyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICAgICAncHVzaCBjYW4gYmUgdXNlZCB0byBkZWxldGUgYSByZWYnICcKKwljZCB2aWN0aW0gJiYKKwlnaXQgYnJhbmNoIGV4dHJhIG1hc3RlciAmJgorCWNkIC4uICYmCisJdGVzdCAtZiB2aWN0aW0vLmdpdC9yZWZzL2hlYWRzL2V4dHJhICYmCisJZ2l0LXNlbmQtcGFjayAuL3ZpY3RpbS8uZ2l0LyA6ZXh0cmEgbWFzdGVyICYmCisJISB0ZXN0IC1mIHZpY3RpbS8uZ2l0L3JlZnMvaGVhZHMvZXh0cmEKKycKKwordW5zZXQgR0lUX0NPTkZJRyBHSVRfQ09ORklHX0xPQ0FMCitIT01FPWBwd2RgL25vLXN1Y2gtZGlyZWN0b3J5CitleHBvcnQgSE9NRSA7IyB0aGlzIHdheSB3ZSBmb3JjZSB0aGUgdmljdGltLy5naXQvY29uZmlnIHRvIGJlIHVzZWQuCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICAgICAncHVzaGluZyB3aXRoIC0tZm9yY2Ugc2hvdWxkIGJlIGRlbmllZCB3aXRoIGRlbnlOb25GYXN0Zm9yd2FyZHMnICcKKwljZCB2aWN0aW0gJiYKKwlnaXQgY29uZmlnIHJlY2VpdmUuZGVueU5vbkZhc3Rmb3J3YXJkcyB0cnVlICYmCisJY2QgLi4gJiYKKwlnaXQgdXBkYXRlLXJlZiByZWZzL2hlYWRzL21hc3RlciBtYXN0ZXJeIHx8IHJldHVybiAxCisJZ2l0LXNlbmQtcGFjayAtLWZvcmNlIC4vdmljdGltLy5naXQvIG1hc3RlciAmJiByZXR1cm4gMQorCSEgZ2l0IGRpZmYgLmdpdC9yZWZzL2hlYWRzL21hc3RlciB2aWN0aW0vLmdpdC9yZWZzL2hlYWRzL21hc3RlcgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkncHVzaGluZyBkb2VzIG5vdCBpbmNsdWRlIG5vbi1oZWFkIHJlZnMnICcKKwlta2RpciBwYXJlbnQgJiYgY2QgcGFyZW50ICYmCisJZ2l0LWluaXQgJiYgdG91Y2ggZmlsZSAmJiBnaXQtYWRkIGZpbGUgJiYgZ2l0LWNvbW1pdCAtbSBhZGQgJiYKKwljZCAuLiAmJgorCWdpdC1jbG9uZSBwYXJlbnQgY2hpbGQgJiYgY2QgY2hpbGQgJiYgZ2l0LXB1c2ggLS1hbGwgJiYKKwljZCAuLi9wYXJlbnQgJiYKKwlnaXQtYnJhbmNoIC1hID5icmFuY2hlcyAmJiAhIGdyZXAgb3JpZ2luL21hc3RlciBicmFuY2hlcworJworCityZXdvdW5kX3B1c2hfc2V0dXAoKSB7CisJcm0gLXJmIHBhcmVudCBjaGlsZCAmJgorCW1rZGlyIHBhcmVudCAmJiBjZCBwYXJlbnQgJiYKKwlnaXQtaW5pdCAmJiBlY2hvIG9uZSA+ZmlsZSAmJiBnaXQtYWRkIGZpbGUgJiYgZ2l0LWNvbW1pdCAtbSBvbmUgJiYKKwllY2hvIHR3byA+ZmlsZSAmJiBnaXQtY29tbWl0IC1hIC1tIHR3byAmJgorCWNkIC4uICYmCisJZ2l0LWNsb25lIHBhcmVudCBjaGlsZCAmJiBjZCBjaGlsZCAmJiBnaXQtcmVzZXQgLS1oYXJkIEhFQUReCit9CisKK3Jld291bmRfcHVzaF9zdWNjZWVkZWQoKSB7CisJY21wIC4uL3BhcmVudC8uZ2l0L3JlZnMvaGVhZHMvbWFzdGVyIC5naXQvcmVmcy9oZWFkcy9tYXN0ZXIKK30KKworcmV3b3VuZF9wdXNoX2ZhaWxlZCgpIHsKKwlpZiByZXdvdW5kX3B1c2hfc3VjY2VlZGVkCisJdGhlbgorCQlmYWxzZQorCWVsc2UKKwkJdHJ1ZQorCWZpCit9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdwdXNoaW5nIGV4cGxpY2l0IHJlZnNwZWNzIHJlc3BlY3RzIGZvcmNpbmcnICcKKwlyZXdvdW5kX3B1c2hfc2V0dXAgJiYKKwlpZiBnaXQtc2VuZC1wYWNrIC4uL3BhcmVudC8uZ2l0IHJlZnMvaGVhZHMvbWFzdGVyOnJlZnMvaGVhZHMvbWFzdGVyCisJdGhlbgorCQlmYWxzZQorCWVsc2UKKwkJdHJ1ZQorCWZpICYmIHJld291bmRfcHVzaF9mYWlsZWQgJiYKKwlnaXQtc2VuZC1wYWNrIC4uL3BhcmVudC8uZ2l0ICtyZWZzL2hlYWRzL21hc3RlcjpyZWZzL2hlYWRzL21hc3RlciAmJgorCXJld291bmRfcHVzaF9zdWNjZWVkZWQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ3B1c2hpbmcgd2lsZGNhcmQgcmVmc3BlY3MgcmVzcGVjdHMgZm9yY2luZycgJworCXJld291bmRfcHVzaF9zZXR1cCAmJgorCWlmIGdpdC1zZW5kLXBhY2sgLi4vcGFyZW50Ly5naXQgcmVmcy9oZWFkcy8qOnJlZnMvaGVhZHMvKgorCXRoZW4KKwkJZmFsc2UKKwllbHNlCisJCXRydWUKKwlmaSAmJiByZXdvdW5kX3B1c2hfZmFpbGVkICYmCisJZ2l0LXNlbmQtcGFjayAuLi9wYXJlbnQvLmdpdCArcmVmcy9oZWFkcy8qOnJlZnMvaGVhZHMvKiAmJgorCXJld291bmRfcHVzaF9zdWNjZWVkZWQKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1NDAxLXVwZGF0ZS1ob29rcy5zaCBiL3QvdDU0MDEtdXBkYXRlLWhvb2tzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlhMTIwMjQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NDAxLXVwZGF0ZS1ob29rcy5zaApAQCAtMCwwICsxLDEzNiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBTaGF3biBPLiBQZWFyY2UKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdCB0aGUgdXBkYXRlIGhvb2sgaW5mcmFzdHJ1Y3R1cmUuJworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCWVjaG8gVGhpcyBpcyBhIHRlc3QuID5hICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBhICYmCisJdHJlZTA9JChnaXQgd3JpdGUtdHJlZSkgJiYKKwljb21taXQwPSQoZWNobyBzZXR1cCB8IGdpdCBjb21taXQtdHJlZSAkdHJlZTApICYmCisJZWNobyBXZSBob3BlIGl0IHdvcmtzLiA+YSAmJgorCWdpdCB1cGRhdGUtaW5kZXggYSAmJgorCXRyZWUxPSQoZ2l0IHdyaXRlLXRyZWUpICYmCisJY29tbWl0MT0kKGVjaG8gbW9kaWZ5IHwgZ2l0IGNvbW1pdC10cmVlICR0cmVlMSAtcCAkY29tbWl0MCkgJiYKKwlnaXQgdXBkYXRlLXJlZiByZWZzL2hlYWRzL21hc3RlciAkY29tbWl0MCAmJgorCWdpdCB1cGRhdGUtcmVmIHJlZnMvaGVhZHMvdG9mYWlsICRjb21taXQxICYmCisJZ2l0LWNsb25lIC4vLiB2aWN0aW0gJiYKKwlHSVRfRElSPXZpY3RpbS8uZ2l0IGdpdCB1cGRhdGUtcmVmIHJlZnMvaGVhZHMvdG9mYWlsICRjb21taXQxICYmCisJZ2l0IHVwZGF0ZS1yZWYgcmVmcy9oZWFkcy9tYXN0ZXIgJGNvbW1pdDEgJiYKKwlnaXQgdXBkYXRlLXJlZiByZWZzL2hlYWRzL3RvZmFpbCAkY29tbWl0MAorJworCitjYXQgPnZpY3RpbS8uZ2l0L2hvb2tzL3ByZS1yZWNlaXZlIDw8J0VPRicKKyMhL2Jpbi9zaAorcHJpbnRmICVzICIkQCIgPj4kR0lUX0RJUi9wcmUtcmVjZWl2ZS5hcmdzCitjYXQgLSA+JEdJVF9ESVIvcHJlLXJlY2VpdmUuc3RkaW4KK2VjaG8gU1RET1VUIHByZS1yZWNlaXZlCitlY2hvIFNUREVSUiBwcmUtcmVjZWl2ZSA+JjIKK0VPRgorY2htb2QgdSt4IHZpY3RpbS8uZ2l0L2hvb2tzL3ByZS1yZWNlaXZlCisKK2NhdCA+dmljdGltLy5naXQvaG9va3MvdXBkYXRlIDw8J0VPRicKKyMhL2Jpbi9zaAorZWNobyAiJEAiID4+JEdJVF9ESVIvdXBkYXRlLmFyZ3MKK3JlYWQgeDsgcHJpbnRmICVzICIkeCIgPiRHSVRfRElSL3VwZGF0ZS5zdGRpbgorZWNobyBTVERPVVQgdXBkYXRlICQxCitlY2hvIFNUREVSUiB1cGRhdGUgJDEgPiYyCit0ZXN0ICIkMSIgPSByZWZzL2hlYWRzL21hc3RlciB8fCBleGl0CitFT0YKK2NobW9kIHUreCB2aWN0aW0vLmdpdC9ob29rcy91cGRhdGUKKworY2F0ID52aWN0aW0vLmdpdC9ob29rcy9wb3N0LXJlY2VpdmUgPDwnRU9GJworIyEvYmluL3NoCitwcmludGYgJXMgIiRAIiA+PiRHSVRfRElSL3Bvc3QtcmVjZWl2ZS5hcmdzCitjYXQgLSA+JEdJVF9ESVIvcG9zdC1yZWNlaXZlLnN0ZGluCitlY2hvIFNURE9VVCBwb3N0LXJlY2VpdmUKK2VjaG8gU1RERVJSIHBvc3QtcmVjZWl2ZSA+JjIKK0VPRgorY2htb2QgdSt4IHZpY3RpbS8uZ2l0L2hvb2tzL3Bvc3QtcmVjZWl2ZQorCitjYXQgPnZpY3RpbS8uZ2l0L2hvb2tzL3Bvc3QtdXBkYXRlIDw8J0VPRicKKyMhL2Jpbi9zaAorZWNobyAiJEAiID4+JEdJVF9ESVIvcG9zdC11cGRhdGUuYXJncworcmVhZCB4OyBwcmludGYgJXMgIiR4IiA+JEdJVF9ESVIvcG9zdC11cGRhdGUuc3RkaW4KK2VjaG8gU1RET1VUIHBvc3QtdXBkYXRlCitlY2hvIFNUREVSUiBwb3N0LXVwZGF0ZSA+JjIKK0VPRgorY2htb2QgdSt4IHZpY3RpbS8uZ2l0L2hvb2tzL3Bvc3QtdXBkYXRlCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgcHVzaCAnCisgICAgISBnaXQtc2VuZC1wYWNrIC0tZm9yY2UgLi92aWN0aW0vLmdpdCBtYXN0ZXIgdG9mYWlsID5zZW5kLm91dCAyPnNlbmQuZXJyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VwZGF0ZWQgYXMgZXhwZWN0ZWQnICcKKwl0ZXN0ICQoR0lUX0RJUj12aWN0aW0vLmdpdCBnaXQgcmV2LXBhcnNlIG1hc3RlcikgPSAkY29tbWl0MSAmJgorCXRlc3QgJChHSVRfRElSPXZpY3RpbS8uZ2l0IGdpdCByZXYtcGFyc2UgdG9mYWlsKSA9ICRjb21taXQxCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2hvb2tzIHJhbicgJworCXRlc3QgLWYgdmljdGltLy5naXQvcHJlLXJlY2VpdmUuYXJncyAmJgorCXRlc3QgLWYgdmljdGltLy5naXQvcHJlLXJlY2VpdmUuc3RkaW4gJiYKKwl0ZXN0IC1mIHZpY3RpbS8uZ2l0L3VwZGF0ZS5hcmdzICYmCisJdGVzdCAtZiB2aWN0aW0vLmdpdC91cGRhdGUuc3RkaW4gJiYKKwl0ZXN0IC1mIHZpY3RpbS8uZ2l0L3Bvc3QtcmVjZWl2ZS5hcmdzICYmCisJdGVzdCAtZiB2aWN0aW0vLmdpdC9wb3N0LXJlY2VpdmUuc3RkaW4gJiYKKwl0ZXN0IC1mIHZpY3RpbS8uZ2l0L3Bvc3QtdXBkYXRlLmFyZ3MgJiYKKwl0ZXN0IC1mIHZpY3RpbS8uZ2l0L3Bvc3QtdXBkYXRlLnN0ZGluCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ByZS1yZWNlaXZlIGhvb2sgaW5wdXQnICcKKwkoZWNobyAkY29tbWl0MCAkY29tbWl0MSByZWZzL2hlYWRzL21hc3RlcjsKKwkgZWNobyAkY29tbWl0MSAkY29tbWl0MCByZWZzL2hlYWRzL3RvZmFpbAorCSkgfCBnaXQgZGlmZiAtIHZpY3RpbS8uZ2l0L3ByZS1yZWNlaXZlLnN0ZGluCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VwZGF0ZSBob29rIGFyZ3VtZW50cycgJworCShlY2hvIHJlZnMvaGVhZHMvbWFzdGVyICRjb21taXQwICRjb21taXQxOworCSBlY2hvIHJlZnMvaGVhZHMvdG9mYWlsICRjb21taXQxICRjb21taXQwCisJKSB8IGdpdCBkaWZmIC0gdmljdGltLy5naXQvdXBkYXRlLmFyZ3MKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncG9zdC1yZWNlaXZlIGhvb2sgaW5wdXQnICcKKwllY2hvICRjb21taXQwICRjb21taXQxIHJlZnMvaGVhZHMvbWFzdGVyIHwKKwlnaXQgZGlmZiAtIHZpY3RpbS8uZ2l0L3Bvc3QtcmVjZWl2ZS5zdGRpbgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwb3N0LXVwZGF0ZSBob29rIGFyZ3VtZW50cycgJworCWVjaG8gcmVmcy9oZWFkcy9tYXN0ZXIgfAorCWdpdCBkaWZmIC0gdmljdGltLy5naXQvcG9zdC11cGRhdGUuYXJncworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhbGwgaG9vayBzdGRpbiBpcyAvZGV2L251bGwnICcKKwkhIHRlc3QgLXMgdmljdGltLy5naXQvdXBkYXRlLnN0ZGluICYmCisJISB0ZXN0IC1zIHZpY3RpbS8uZ2l0L3Bvc3QtdXBkYXRlLnN0ZGluCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FsbCAqLXJlY2VpdmUgaG9vayBhcmdzIGFyZSBlbXB0eScgJworCSEgdGVzdCAtcyB2aWN0aW0vLmdpdC9wcmUtcmVjZWl2ZS5hcmdzICYmCisJISB0ZXN0IC1zIHZpY3RpbS8uZ2l0L3Bvc3QtcmVjZWl2ZS5hcmdzCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NlbmQtcGFjayBwcm9kdWNlZCBubyBvdXRwdXQnICcKKwkhIHRlc3QgLXMgc2VuZC5vdXQKKycKKworY2F0IDw8RU9GID5leHBlY3QKK1NURE9VVCBwcmUtcmVjZWl2ZQorU1RERVJSIHByZS1yZWNlaXZlCitTVERPVVQgdXBkYXRlIHJlZnMvaGVhZHMvbWFzdGVyCitTVERFUlIgdXBkYXRlIHJlZnMvaGVhZHMvbWFzdGVyCitTVERPVVQgdXBkYXRlIHJlZnMvaGVhZHMvdG9mYWlsCitTVERFUlIgdXBkYXRlIHJlZnMvaGVhZHMvdG9mYWlsCitTVERPVVQgcG9zdC1yZWNlaXZlCitTVERFUlIgcG9zdC1yZWNlaXZlCitTVERPVVQgcG9zdC11cGRhdGUKK1NUREVSUiBwb3N0LXVwZGF0ZQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZW5kLXBhY2sgc3RkZXJyIGNvbnRhaW5zIGhvb2sgbWVzc2FnZXMnICcKKwlncmVwIF5TVEQgc2VuZC5lcnIgPmFjdHVhbCAmJgorCWdpdCBkaWZmIC0gYWN0dWFsIDxleHBlY3QKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1NDAyLXBvc3QtbWVyZ2UtaG9vay5zaCBiL3QvdDU0MDItcG9zdC1tZXJnZS1ob29rLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEzOTQwNDcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NDAyLXBvc3QtbWVyZ2UtaG9vay5zaApAQCAtMCwwICsxLDU2IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEpvc2ggRW5nbGFuZAorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IHRoZSBwb3N0LW1lcmdlIGhvb2suJworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCWVjaG8gRGF0YSBmb3IgY29tbWl0MC4gPmEgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGEgJiYKKwl0cmVlMD0kKGdpdCB3cml0ZS10cmVlKSAmJgorCWNvbW1pdDA9JChlY2hvIHNldHVwIHwgZ2l0IGNvbW1pdC10cmVlICR0cmVlMCkgJiYKKwllY2hvIENoYW5nZWQgZGF0YSBmb3IgY29tbWl0MS4gPmEgJiYKKwlnaXQgdXBkYXRlLWluZGV4IGEgJiYKKwl0cmVlMT0kKGdpdCB3cml0ZS10cmVlKSAmJgorCWNvbW1pdDE9JChlY2hvIG1vZGlmeSB8IGdpdCBjb21taXQtdHJlZSAkdHJlZTEgLXAgJGNvbW1pdDApICYmCisgICAgICAgIGdpdCB1cGRhdGUtcmVmIHJlZnMvaGVhZHMvbWFzdGVyICRjb21taXQwICYmCisJZ2l0LWNsb25lIC4vLiBjbG9uZTEgJiYKKwlHSVRfRElSPWNsb25lMS8uZ2l0IGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgYSAmJgorCWdpdC1jbG9uZSAuLy4gY2xvbmUyICYmCisJR0lUX0RJUj1jbG9uZTIvLmdpdCBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGEKKycKKworZm9yIGNsb25lIGluIDEgMjsgZG8KKyAgICBjYXQgPmNsb25lJHtjbG9uZX0vLmdpdC9ob29rcy9wb3N0LW1lcmdlIDw8J0VPRicKKyMhL2Jpbi9zaAorZWNobyAkQCA+PiAkR0lUX0RJUi9wb3N0LW1lcmdlLmFyZ3MKK0VPRgorICAgIGNobW9kIHUreCBjbG9uZSR7Y2xvbmV9Ly5naXQvaG9va3MvcG9zdC1tZXJnZQorZG9uZQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwb3N0LW1lcmdlIGRvZXMgbm90IHJ1biBmb3IgdXAtdG8tZGF0ZSAnICcKKyAgICAgICAgR0lUX0RJUj1jbG9uZTEvLmdpdCBnaXQgbWVyZ2UgJGNvbW1pdDAgJiYKKwkhIHRlc3QgLWYgY2xvbmUxLy5naXQvcG9zdC1tZXJnZS5hcmdzCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Bvc3QtbWVyZ2UgcnVucyBhcyBleHBlY3RlZCAnICcKKyAgICAgICAgR0lUX0RJUj1jbG9uZTEvLmdpdCBnaXQgbWVyZ2UgJGNvbW1pdDEgJiYKKwl0ZXN0IC1lIGNsb25lMS8uZ2l0L3Bvc3QtbWVyZ2UuYXJncworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwb3N0LW1lcmdlIGZyb20gbm9ybWFsIG1lcmdlIHJlY2VpdmVzIHRoZSByaWdodCBhcmd1bWVudCAnICcKKyAgICAgICAgZ3JlcCAwIGNsb25lMS8uZ2l0L3Bvc3QtbWVyZ2UuYXJncworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwb3N0LW1lcmdlIGZyb20gc3F1YXNoIG1lcmdlIHJ1bnMgYXMgZXhwZWN0ZWQgJyAnCisgICAgICAgIEdJVF9ESVI9Y2xvbmUyLy5naXQgZ2l0IG1lcmdlIC0tc3F1YXNoICRjb21taXQxICYmCisJdGVzdCAtZSBjbG9uZTIvLmdpdC9wb3N0LW1lcmdlLmFyZ3MKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncG9zdC1tZXJnZSBmcm9tIHNxdWFzaCBtZXJnZSByZWNlaXZlcyB0aGUgcmlnaHQgYXJndW1lbnQgJyAnCisgICAgICAgIGdyZXAgMSBjbG9uZTIvLmdpdC9wb3N0LW1lcmdlLmFyZ3MKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1NDAzLXBvc3QtY2hlY2tvdXQtaG9vay5zaCBiL3QvdDU0MDMtcG9zdC1jaGVja291dC1ob29rLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgyMzIzOWEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NDAzLXBvc3QtY2hlY2tvdXQtaG9vay5zaApAQCAtMCwwICsxLDc0IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEpvc2ggRW5nbGFuZAorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IHRoZSBwb3N0LWNoZWNrb3V0IGhvb2suJworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCSBlY2hvIERhdGEgZm9yIGNvbW1pdDAuID5hICYmCisJIGVjaG8gRGF0YSBmb3IgY29tbWl0MC4gPmIgJiYKKwkgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBhICYmCisJIGdpdCB1cGRhdGUtaW5kZXggLS1hZGQgYiAmJgorCSB0cmVlMD0kKGdpdCB3cml0ZS10cmVlKSAmJgorCSBjb21taXQwPSQoZWNobyBzZXR1cCB8IGdpdCBjb21taXQtdHJlZSAkdHJlZTApICYmCisgICAgICAgIGdpdCB1cGRhdGUtcmVmIHJlZnMvaGVhZHMvbWFzdGVyICRjb21taXQwICYmCisJIGdpdC1jbG9uZSAuLy4gY2xvbmUxICYmCisJIGdpdC1jbG9uZSAuLy4gY2xvbmUyICYmCisgICAgICAgIEdJVF9ESVI9Y2xvbmUyLy5naXQgZ2l0IGJyYW5jaCAtYSBuZXcyICYmCisgICAgICAgIGVjaG8gRGF0YSBmb3IgY29tbWl0MS4gPmNsb25lMi9iICYmCisJIEdJVF9ESVI9Y2xvbmUyLy5naXQgZ2l0IGFkZCBjbG9uZTIvYiAmJgorCSBHSVRfRElSPWNsb25lMi8uZ2l0IGdpdCBjb21taXQgLW0gbmV3MgorJworCitmb3IgY2xvbmUgaW4gMSAyOyBkbworICAgIGNhdCA+Y2xvbmUke2Nsb25lfS8uZ2l0L2hvb2tzL3Bvc3QtY2hlY2tvdXQgPDwnRU9GJworIyEvYmluL3NoCitlY2hvICRAID4gJEdJVF9ESVIvcG9zdC1jaGVja291dC5hcmdzCitFT0YKKyAgICBjaG1vZCB1K3ggY2xvbmUke2Nsb25lfS8uZ2l0L2hvb2tzL3Bvc3QtY2hlY2tvdXQKK2RvbmUKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncG9zdC1jaGVja291dCBydW5zIGFzIGV4cGVjdGVkICcgJworICAgICAgICBHSVRfRElSPWNsb25lMS8uZ2l0IGdpdCBjaGVja291dCBtYXN0ZXIgJiYKKyAgICAgICAgdGVzdCAtZSBjbG9uZTEvLmdpdC9wb3N0LWNoZWNrb3V0LmFyZ3MKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncG9zdC1jaGVja291dCByZWNlaXZlcyB0aGUgcmlnaHQgYXJndW1lbnRzIHdpdGggSEVBRCB1bmNoYW5nZWQgJyAnCisgICAgICAgIG9sZD0kKGF3ayAie3ByaW50IFwkMX0iIGNsb25lMS8uZ2l0L3Bvc3QtY2hlY2tvdXQuYXJncykgJiYKKyAgICAgICAgbmV3PSQoYXdrICJ7cHJpbnQgXCQyfSIgY2xvbmUxLy5naXQvcG9zdC1jaGVja291dC5hcmdzKSAmJgorICAgICAgICBmbGFnPSQoYXdrICJ7cHJpbnQgXCQzfSIgY2xvbmUxLy5naXQvcG9zdC1jaGVja291dC5hcmdzKSAmJgorICAgICAgICB0ZXN0ICRvbGQgPSAkbmV3IC1hICRmbGFnID0gMQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwb3N0LWNoZWNrb3V0IHJ1bnMgYXMgZXhwZWN0ZWQgJyAnCisgICAgICAgIEdJVF9ESVI9Y2xvbmUxLy5naXQgZ2l0IGNoZWNrb3V0IG1hc3RlciAmJgorICAgICAgICB0ZXN0IC1lIGNsb25lMS8uZ2l0L3Bvc3QtY2hlY2tvdXQuYXJncworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwb3N0LWNoZWNrb3V0IGFyZ3MgYXJlIGNvcnJlY3Qgd2l0aCBnaXQgY2hlY2tvdXQgLWIgJyAnCisgICAgICAgIEdJVF9ESVI9Y2xvbmUxLy5naXQgZ2l0IGNoZWNrb3V0IC1iIG5ldzEgJiYKKyAgICAgICAgb2xkPSQoYXdrICJ7cHJpbnQgXCQxfSIgY2xvbmUxLy5naXQvcG9zdC1jaGVja291dC5hcmdzKSAmJgorICAgICAgICBuZXc9JChhd2sgIntwcmludCBcJDJ9IiBjbG9uZTEvLmdpdC9wb3N0LWNoZWNrb3V0LmFyZ3MpICYmCisgICAgICAgIGZsYWc9JChhd2sgIntwcmludCBcJDN9IiBjbG9uZTEvLmdpdC9wb3N0LWNoZWNrb3V0LmFyZ3MpICYmCisgICAgICAgIHRlc3QgJG9sZCA9ICRuZXcgLWEgJGZsYWcgPSAxCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Bvc3QtY2hlY2tvdXQgcmVjZWl2ZXMgdGhlIHJpZ2h0IGFyZ3Mgd2l0aCBIRUFEIGNoYW5nZWQgJyAnCisgICAgICAgIEdJVF9ESVI9Y2xvbmUyLy5naXQgZ2l0IGNoZWNrb3V0IG5ldzIgJiYKKyAgICAgICAgb2xkPSQoYXdrICJ7cHJpbnQgXCQxfSIgY2xvbmUyLy5naXQvcG9zdC1jaGVja291dC5hcmdzKSAmJgorICAgICAgICBuZXc9JChhd2sgIntwcmludCBcJDJ9IiBjbG9uZTIvLmdpdC9wb3N0LWNoZWNrb3V0LmFyZ3MpICYmCisgICAgICAgIGZsYWc9JChhd2sgIntwcmludCBcJDN9IiBjbG9uZTIvLmdpdC9wb3N0LWNoZWNrb3V0LmFyZ3MpICYmCisgICAgICAgIHRlc3QgJG9sZCAhPSAkbmV3IC1hICRmbGFnID0gMQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwb3N0LWNoZWNrb3V0IHJlY2VpdmVzIHRoZSByaWdodCBhcmdzIHdoZW4gbm90IHN3aXRjaGluZyBicmFuY2hlcyAnICcKKyAgICAgICAgR0lUX0RJUj1jbG9uZTIvLmdpdCBnaXQgY2hlY2tvdXQgbWFzdGVyIGIgJiYKKyAgICAgICAgb2xkPSQoYXdrICJ7cHJpbnQgXCQxfSIgY2xvbmUyLy5naXQvcG9zdC1jaGVja291dC5hcmdzKSAmJgorICAgICAgICBuZXc9JChhd2sgIntwcmludCBcJDJ9IiBjbG9uZTIvLmdpdC9wb3N0LWNoZWNrb3V0LmFyZ3MpICYmCisgICAgICAgIGZsYWc9JChhd2sgIntwcmludCBcJDN9IiBjbG9uZTIvLmdpdC9wb3N0LWNoZWNrb3V0LmFyZ3MpICYmCisgICAgICAgIHRlc3QgJG9sZCA9ICRuZXcgLWEgJGZsYWcgPSAwCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NTQwNC10cmFja2luZy1icmFuY2hlcy5zaCBiL3QvdDU0MDQtdHJhY2tpbmctYnJhbmNoZXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTQ5M2E5MgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU0MDQtdHJhY2tpbmctYnJhbmNoZXMuc2gKQEAgLTAsMCArMSw1MyBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J3RyYWNraW5nIGJyYW5jaCB1cGRhdGUgY2hlY2tzIGZvciBnaXQgcHVzaCcKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NldHVwJyAnCisJZWNobyAxID5maWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJZ2l0IGNvbW1pdCAtbSAxICYmCisJZ2l0IGJyYW5jaCBiMSAmJgorCWdpdCBicmFuY2ggYjIgJiYKKwlnaXQgY2xvbmUgLiBhYSAmJgorCWdpdCBjaGVja291dCBiMSAmJgorCWVjaG8gYjEgPj5maWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSBiMSAmJgorCWdpdCBjaGVja291dCBiMiAmJgorCWVjaG8gYjIgPj5maWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSBiMgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwcmVwYXJlIHB1c2hhYmxlIGJyYW5jaGVzJyAnCisJY2QgYWEgJiYKKwliMT0kKGdpdCByZXYtcGFyc2Ugb3JpZ2luL2IxKSAmJgorCWIyPSQoZ2l0IHJldi1wYXJzZSBvcmlnaW4vYjIpICYmCisJZ2l0IGNoZWNrb3V0IC1iIGIxIG9yaWdpbi9iMSAmJgorCWVjaG8gYWEtYjEgPj5maWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSBhYS1iMSAmJgorCWdpdCBjaGVja291dCAtYiBiMiBvcmlnaW4vYjIgJiYKKwllY2hvIGFhLWIyID4+ZmlsZSAmJgorCWdpdCBjb21taXQgLWEgLW0gYWEtYjIgJiYKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisJZWNobyBhYS1tYXN0ZXIgPj5maWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSBhYS1tYXN0ZXIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWl4ZWQtc3VjY2VzcyBwdXNoIHJldHVybnMgZXJyb3InICchIGdpdCBwdXNoJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayB0cmFja2luZyBicmFuY2hlcyB1cGRhdGVkIGNvcnJlY3RseSBhZnRlciBwdXNoJyAnCisJdGVzdCAiJChnaXQgcmV2LXBhcnNlIG9yaWdpbi9tYXN0ZXIpIiA9ICIkKGdpdCByZXYtcGFyc2UgbWFzdGVyKSIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgdHJhY2tpbmcgYnJhbmNoZXMgbm90IHVwZGF0ZWQgZm9yIGZhaWxlZCByZWZzJyAnCisJdGVzdCAiJChnaXQgcmV2LXBhcnNlIG9yaWdpbi9iMSkiID0gIiRiMSIgJiYKKwl0ZXN0ICIkKGdpdCByZXYtcGFyc2Ugb3JpZ2luL2IyKSIgPSAiJGIyIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdkZWxldGVkIGJyYW5jaGVzIGhhdmUgdGhlaXIgdHJhY2tpbmcgYnJhbmNoZXMgcmVtb3ZlZCcgJworCWdpdCBwdXNoIG9yaWdpbiA6YjEgJiYKKwl0ZXN0ICIkKGdpdCByZXYtcGFyc2Ugb3JpZ2luL2IxKSIgPSAib3JpZ2luL2IxIgorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDU0MDUtc2VuZC1wYWNrLXJld2luZC5zaCBiL3QvdDU0MDUtc2VuZC1wYWNrLXJld2luZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NmFiYzYyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTQwNS1zZW5kLXBhY2stcmV3aW5kLnNoCkBAIC0wLDAgKzEsNDIgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdmb3JjZWQgcHVzaCB0byByZXBsYWNlIGNvbW1pdCB3ZSBkbyBub3QgaGF2ZScKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJPmZpbGUxICYmIGdpdCBhZGQgZmlsZTEgJiYgdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSBJbml0aWFsICYmCisKKwlta2RpciBhbm90aGVyICYmICgKKwkJY2QgYW5vdGhlciAmJgorCQlnaXQgaW5pdCAmJgorCQlnaXQgZmV0Y2ggLi4gbWFzdGVyOm1hc3RlcgorCSkgJiYKKworCT5maWxlMiAmJiBnaXQgYWRkIGZpbGUyICYmIHRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gU2Vjb25kCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbm9uIGZvcmNlZCBwdXNoIHNob3VsZCBkaWUgbm90IHNlZ2ZhdWx0JyAnCisKKwkoCisJCWNkIGFub3RoZXIgJiYKKwkJZ2l0IHB1c2ggLi4gbWFzdGVyOm1hc3RlcgorCQl0ZXN0ICQ/ID0gMQorCSkKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmb3JjZWQgcHVzaCBzaG91bGQgc3VjY2VlZCcgJworCisJKAorCQljZCBhbm90aGVyICYmCisJCWdpdCBwdXNoIC4uICttYXN0ZXI6bWFzdGVyCisJKQorCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NTQwNi1yZW1vdGUtcmVqZWN0cy5zaCBiL3QvdDU0MDYtcmVtb3RlLXJlamVjdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDZiMmNiNAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU0MDYtcmVtb3RlLXJlamVjdHMuc2gKQEAgLTAsMCArMSwyNCBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J3JlbW90ZSBwdXNoIHJlamVjdHMgYXJlIHJlcG9ydGVkIGJ5IGNsaWVudCcKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NldHVwJyAnCisJbWtkaXIgLmdpdC9ob29rcyAmJgorCShlY2hvICIjIS9iaW4vc2giIDsgZWNobyAiZXhpdCAxIikgPi5naXQvaG9va3MvdXBkYXRlICYmCisJY2htb2QgK3ggLmdpdC9ob29rcy91cGRhdGUgJiYKKwllY2hvIDEgPmZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwlnaXQgY29tbWl0IC1tIDEgJiYKKwlnaXQgY2xvbmUgLiBjaGlsZCAmJgorCWNkIGNoaWxkICYmCisJZWNobyAyID5maWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3B1c2ggcmVwb3J0cyBlcnJvcicgJyEgZ2l0IHB1c2ggMj5zdGRlcnInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2luZGl2aWR1YWwgcmVmIHJlcG9ydHMgZXJyb3InICdncmVwIHJlamVjdGVkIHN0ZGVycicKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1NTAwLWZldGNoLXBhY2suc2ggYi90L3Q1NTAwLWZldGNoLXBhY2suc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzg4YjRhNQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MDAtZmV0Y2gtcGFjay5zaApAQCAtMCwwICsxLDE4MiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKb2hhbm5lcyBTY2hpbmRlbGluCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3RpbmcgbXVsdGlfYWNrIHBhY2sgZmV0Y2hpbmcKKworJworLiAuL3Rlc3QtbGliLnNoCisKKyMgVGVzdCBmZXRjaC1wYWNrL3VwbG9hZC1wYWNrIHBhaXIuCisKKyMgU29tZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMKKworYWRkICgpIHsKKwluYW1lPSQxCisJdGV4dD0iJEAiCisJYnJhbmNoPWBlY2hvICRuYW1lIHwgc2VkIC1lICdzL15cKC5cKS4qJC9cMS8nYAorCXBhcmVudHM9IiIKKworCXNoaWZ0CisJd2hpbGUgdGVzdCAkMTsgZG8KKwkJcGFyZW50cz0iJHBhcmVudHMgLXAgJDEiCisJCXNoaWZ0CisJZG9uZQorCisJZWNobyAiJHRleHQiID4gdGVzdC50eHQKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIHRlc3QudHh0CisJdHJlZT0kKGdpdCB3cml0ZS10cmVlKQorCSMgbWFrZSBzdXJlIHRpbWVzdGFtcHMgYXJlIGluIGNvcnJlY3Qgb3JkZXIKKwlzZWM9JCgoJHNlYysxKSkKKwljb21taXQ9JChlY2hvICIkdGV4dCIgfCBHSVRfQVVUSE9SX0RBVEU9JHNlYyBcCisJCWdpdCBjb21taXQtdHJlZSAkdHJlZSAkcGFyZW50cyAyPj5sb2cyLnR4dCkKKwlleHBvcnQgJG5hbWU9JGNvbW1pdAorCWVjaG8gJGNvbW1pdCA+IC5naXQvcmVmcy9oZWFkcy8kYnJhbmNoCisJZXZhbCAke2JyYW5jaH1USVA9JGNvbW1pdAorfQorCitjb3VudF9vYmplY3RzICgpIHsKKwlscyAuZ2l0L29iamVjdHMvPz8vKiAyPj5sb2cyLnR4dCB8IHdjIC1sIHwgdHIgLWQgIiAiCit9CisKK3Rlc3RfZXhwZWN0X29iamVjdF9jb3VudCAoKSB7CisJbWVzc2FnZT0kMQorCWNvdW50PSQyCisKKwlvdXRwdXQ9IiQoY291bnRfb2JqZWN0cykiCisJdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJCSJuZXcgb2JqZWN0IGNvdW50ICRtZXNzYWdlIiBcCisJCSJ0ZXN0ICRjb3VudCA9ICRvdXRwdXQiCit9CisKK3B1bGxfdG9fY2xpZW50ICgpIHsKKwludW1iZXI9JDEKKwloZWFkcz0kMgorCWNvdW50PSQzCisJbm9fc3RyaWN0X2NvdW50X2NoZWNrPSQ0CisKKwljZCBjbGllbnQKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICIkbnVtYmVyIHB1bGwiIFwKKwkJImdpdC1mZXRjaC1wYWNrIC1rIC12IC4uICRoZWFkcyIKKwljYXNlICIkaGVhZHMiIGluICpBKikgZWNobyAkQVRJUCA+IC5naXQvcmVmcy9oZWFkcy9BOzsgZXNhYworCWNhc2UgIiRoZWFkcyIgaW4gKkIqKSBlY2hvICRCVElQID4gLmdpdC9yZWZzL2hlYWRzL0I7OyBlc2FjCisJZ2l0IHN5bWJvbGljLXJlZiBIRUFEIHJlZnMvaGVhZHMvYGVjaG8gJGhlYWRzIHwgc2VkIC1lICdzL15cKC5cKS4qJC9cMS8nYAorCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAiZnNjayIgJ2dpdCBmc2NrIC0tZnVsbCA+IGZzY2sudHh0IDI+JjEnCisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBkb3dubG9hZGVkIHJlc3VsdHMnIFwKKwknbXYgLmdpdC9vYmplY3RzL3BhY2svcGFjay0qIC4gJiYKKwkgcD1gbHMgLTEgcGFjay0qLnBhY2tgICYmCisJIGdpdCB1bnBhY2stb2JqZWN0cyA8JHAgJiYKKwkgZ2l0IGZzY2sgLS1mdWxsJworCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAibmV3IG9iamVjdCBjb3VudCBhZnRlciAkbnVtYmVyIHB1bGwiIFwKKwknaWR4PWBlY2hvIHBhY2stKi5pZHhgICYmCisJIHBhY2tfY291bnQ9YGdpdCBzaG93LWluZGV4IDwkaWR4IHwgd2MgLWxgICYmCisJIHRlc3QgJHBhY2tfY291bnQgPSAkY291bnQnCisJdGVzdCAteiAiJHBhY2tfY291bnQiICYmIHBhY2tfY291bnQ9MAorCWlmIFsgLXogIiRub19zdHJpY3RfY291bnRfY2hlY2siIF07IHRoZW4KKwkJdGVzdF9leHBlY3Rfc3VjY2VzcyAibWluaW1hbCBjb3VudCIgInRlc3QgJGNvdW50ID0gJHBhY2tfY291bnQiCisJZWxzZQorCQl0ZXN0ICRjb3VudCAhPSAkcGFja19jb3VudCAmJiBcCisJCQllY2hvICJXQVJOSU5HOiAkcGFja19jb3VudCBvYmplY3RzIHRyYW5zbWl0dGVkLCBvbmx5ICRjb3VudCBvZiB3aGljaCB3ZXJlIG5lZWRlZCIKKwlmaQorCXJtIC1mIHBhY2stKgorCWNkIC4uCit9CisKKyMgSGVyZSBiZWdpbnMgdGhlIGFjdHVhbCB0ZXN0aW5nCisKKyMgQTEgLSAuLi4gLSBBMjAgLSBBMjEKKyMgICAgXAorIyAgICAgIEIxICAtICAgQjIgLSAuLiAtIEI3MAorCisjIGNsaWVudCBwdWxscyBBMjAsIEIxLiBUaGVuIHRyYWNrcyBvbmx5IEIuIFRoZW4gcHVsbHMgQS4KKworKAorCW1rZGlyIGNsaWVudCAmJgorCWNkIGNsaWVudCAmJgorCWdpdCBpbml0IDI+PiBsb2cyLnR4dCAmJgorCWdpdCBjb25maWcgdHJhbnNmZXIudW5wYWNrbGltaXQgMAorKQorCithZGQgQTEKKworcHJldj0xOyBjdXI9Mjsgd2hpbGUgWyAkY3VyIC1sZSAxMCBdOyBkbworCWFkZCBBJGN1ciAkKGV2YWwgZWNobyBcJEEkcHJldikKKwlwcmV2PSRjdXIKKwljdXI9JCgoJGN1cisxKSkKK2RvbmUKKworYWRkIEIxICRBMQorCitlY2hvICRBVElQID4gLmdpdC9yZWZzL2hlYWRzL0EKK2VjaG8gJEJUSVAgPiAuZ2l0L3JlZnMvaGVhZHMvQgorZ2l0IHN5bWJvbGljLXJlZiBIRUFEIHJlZnMvaGVhZHMvQgorCitwdWxsX3RvX2NsaWVudCAxc3QgIkIgQSIgJCgoMTEqMykpCisKK2FkZCBBMTEgJEExMAorCitwcmV2PTE7IGN1cj0yOyB3aGlsZSBbICRjdXIgLWxlIDY1IF07IGRvCisJYWRkIEIkY3VyICQoZXZhbCBlY2hvIFwkQiRwcmV2KQorCXByZXY9JGN1cgorCWN1cj0kKCgkY3VyKzEpKQorZG9uZQorCitwdWxsX3RvX2NsaWVudCAybmQgIkIiICQoKDY0KjMpKQorCitwdWxsX3RvX2NsaWVudCAzcmQgIkEiICQoKDEqMykpICMgb2xkIGZhaWxzCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgImNsb25lIHNoYWxsb3ciICJnaXQtY2xvbmUgLS1kZXB0aCAyIGZpbGU6Ly9gcHdkYC8uIHNoYWxsb3ciCisKKyhjZCBzaGFsbG93OyBnaXQgY291bnQtb2JqZWN0cyAtdikgPiBjb3VudC5zaGFsbG93CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgImNsb25lIHNoYWxsb3cgb2JqZWN0IGNvdW50IiBcCisJInRlc3QgXCJpbi1wYWNrOiAxOFwiID0gXCIkKGdyZXAgaW4tcGFjayBjb3VudC5zaGFsbG93KVwiIgorCitjb3VudF9vdXRwdXQgKCkgeworCXNlZCAtZSAnL15pbi1wYWNrOi9kJyAtZSAnL15wYWNrczovZCcgLWUgJy86IDAkL2QnICIkMSIKK30KKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiY2xvbmUgc2hhbGxvdyBvYmplY3QgY291bnQgKHBhcnQgMikiICcKKwl0ZXN0IC16ICIkKGNvdW50X291dHB1dCBjb3VudC5zaGFsbG93KSIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiZnNjayBpbiBzaGFsbG93IHJlcG8iIFwKKwkiKGNkIHNoYWxsb3c7IGdpdCBmc2NrIC0tZnVsbCkiCisKKyN0ZXN0X2RvbmU7IGV4aXQKKworYWRkIEI2NiAkQjY1CithZGQgQjY3ICRCNjYKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAicHVsbCBpbiBzaGFsbG93IHJlcG8iIFwKKwkiKGNkIHNoYWxsb3c7IGdpdCBwdWxsIC4uIEIpIgorCisoY2Qgc2hhbGxvdzsgZ2l0IGNvdW50LW9iamVjdHMgLXYpID4gY291bnQuc2hhbGxvdwordGVzdF9leHBlY3Rfc3VjY2VzcyAiY2xvbmUgc2hhbGxvdyBvYmplY3QgY291bnQiIFwKKwkidGVzdCBcImNvdW50OiA2XCIgPSBcIiQoZ3JlcCBjb3VudCBjb3VudC5zaGFsbG93KVwiIgorCithZGQgQjY4ICRCNjcKK2FkZCBCNjkgJEI2OAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJkZWVwZW5pbmcgcHVsbCBpbiBzaGFsbG93IHJlcG8iIFwKKwkiKGNkIHNoYWxsb3c7IGdpdCBwdWxsIC0tZGVwdGggNCAuLiBCKSIKKworKGNkIHNoYWxsb3c7IGdpdCBjb3VudC1vYmplY3RzIC12KSA+IGNvdW50LnNoYWxsb3cKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgImNsb25lIHNoYWxsb3cgb2JqZWN0IGNvdW50IiBcCisJInRlc3QgXCJjb3VudDogMTJcIiA9IFwiJChncmVwIGNvdW50IGNvdW50LnNoYWxsb3cpXCIiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgImRlZXBlbmluZyBmZXRjaCBpbiBzaGFsbG93IHJlcG8iIFwKKwkiKGNkIHNoYWxsb3c7IGdpdCBmZXRjaCAtLWRlcHRoIDQgLi4gQTpBKSIKKworKGNkIHNoYWxsb3c7IGdpdCBjb3VudC1vYmplY3RzIC12KSA+IGNvdW50LnNoYWxsb3cKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgImNsb25lIHNoYWxsb3cgb2JqZWN0IGNvdW50IiBcCisJInRlc3QgXCJjb3VudDogMThcIiA9IFwiJChncmVwIGNvdW50IGNvdW50LnNoYWxsb3cpXCIiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgInB1bGwgaW4gc2hhbGxvdyByZXBvIHdpdGggbWlzc2luZyBtZXJnZSBiYXNlIiBcCisJIihjZCBzaGFsbG93ICYmICEgZ2l0IHB1bGwgLS1kZXB0aCA0IC4uIEEpIgorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDU1MDItcXVpY2tmZXRjaC5zaCBiL3QvdDU1MDItcXVpY2tmZXRjaC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNmVhZGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUwMi1xdWlja2ZldGNoLnNoCkBAIC0wLDAgKzEsMTIyIEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0ndGVzdCBxdWlja2ZldGNoIGZyb20gbG9jYWwnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKworCXRlc3RfdGljayAmJgorCWVjaG8gaWNoaSA+ZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCWdpdCBjb21taXQgLW0gaW5pdGlhbCAmJgorCisJY250PSQoICgKKwkJZ2l0IGNvdW50LW9iamVjdHMgfCBzZWQgLWUgInMvICpvYmplY3RzLC4qLy8iCisJKSApICYmCisJdGVzdCAkY250IC1lcSAzCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Nsb25lIHdpdGhvdXQgYWx0ZXJuYXRlJyAnCisKKwkoCisJCW1rZGlyIGNsb25lZCAmJgorCQljZCBjbG9uZWQgJiYKKwkJZ2l0IGluaXQtZGIgJiYKKwkJZ2l0IHJlbW90ZSBhZGQgLWYgb3JpZ2luIC4uCisJKSAmJgorCWNudD0kKCAoCisJCWNkIGNsb25lZCAmJgorCQlnaXQgY291bnQtb2JqZWN0cyB8IHNlZCAtZSAicy8gKm9iamVjdHMsLiovLyIKKwkpICkgJiYKKwl0ZXN0ICRjbnQgLWVxIDMKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZnVydGhlciBjb21taXRzIGluIHRoZSBvcmlnaW5hbCcgJworCisJdGVzdF90aWNrICYmCisJZWNobyBuaSA+ZmlsZSAmJgorCWdpdCBjb21taXQgLWEgLW0gc2Vjb25kICYmCisKKwljbnQ9JCggKAorCQlnaXQgY291bnQtb2JqZWN0cyB8IHNlZCAtZSAicy8gKm9iamVjdHMsLiovLyIKKwkpICkgJiYKKwl0ZXN0ICRjbnQgLWVxIDYKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY29weSBjb21taXQgYW5kIHRyZWUgYnV0IG5vdCBibG9iIGJ5IGhhbmQnICcKKworCWdpdCByZXYtbGlzdCAtLW9iamVjdHMgSEVBRCB8CisJZ2l0IHBhY2stb2JqZWN0cyAtLXN0ZG91dCB8CisJKAorCQljZCBjbG9uZWQgJiYKKwkJZ2l0IHVucGFjay1vYmplY3RzCisJKSAmJgorCisJY250PSQoICgKKwkJY2QgY2xvbmVkICYmCisJCWdpdCBjb3VudC1vYmplY3RzIHwgc2VkIC1lICJzLyAqb2JqZWN0cywuKi8vIgorCSkgKSAmJgorCXRlc3QgJGNudCAtZXEgNgorCisJYmxvYj0kKGdpdCByZXYtcGFyc2UgSEVBRDpmaWxlIHwgc2VkIC1lICJzfC4ufCYvfCIpICYmCisJdGVzdCAtZiAiY2xvbmVkLy5naXQvb2JqZWN0cy8kYmxvYiIgJiYKKwlybSAtZiAiY2xvbmVkLy5naXQvb2JqZWN0cy8kYmxvYiIgJiYKKworCWNudD0kKCAoCisJCWNkIGNsb25lZCAmJgorCQlnaXQgY291bnQtb2JqZWN0cyB8IHNlZCAtZSAicy8gKm9iamVjdHMsLiovLyIKKwkpICkgJiYKKwl0ZXN0ICRjbnQgLWVxIDUKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdxdWlja2ZldGNoIHNob3VsZCBub3QgbGVhdmUgYSBjb3JydXB0ZWQgcmVwb3NpdG9yeScgJworCisJKAorCQljZCBjbG9uZWQgJiYKKwkJZ2l0IGZldGNoCisJKSAmJgorCisJY250PSQoICgKKwkJY2QgY2xvbmVkICYmCisJCWdpdCBjb3VudC1vYmplY3RzIHwgc2VkIC1lICJzLyAqb2JqZWN0cywuKi8vIgorCSkgKSAmJgorCXRlc3QgJGNudCAtZXEgNgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3F1aWNrZmV0Y2ggc2hvdWxkIG5vdCBjb3B5IGZyb20gYWx0ZXJuYXRlJyAnCisKKwkoCisJCW1rZGlyIHF1aWNrY2xvbmUgJiYKKwkJY2QgcXVpY2tjbG9uZSAmJgorCQlnaXQgaW5pdC1kYiAmJgorCQkoY2QgLi4vLmdpdC9vYmplY3RzICYmIHB3ZCkgPi5naXQvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXMgJiYKKwkJZ2l0IHJlbW90ZSBhZGQgb3JpZ2luIC4uICYmCisJCWdpdCBmZXRjaCAtayAtaworCSkgJiYKKwlvYmpfY250PSQoICgKKwkJY2QgcXVpY2tjbG9uZSAmJgorCQlnaXQgY291bnQtb2JqZWN0cyB8IHNlZCAtZSAicy8gKm9iamVjdHMsLiovLyIKKwkpICkgJiYKKwlwY2tfY250PSQoICgKKwkJY2QgcXVpY2tjbG9uZSAmJgorCQlnaXQgY291bnQtb2JqZWN0cyAtdiB8IHNlZCAtbiAtZSAiL3BhY2tzOi97CisJCQkJcy9wYWNrczovLworCQkJCXAKKwkJCQlxCisJCQl9IgorCSkgKSAmJgorCW9yaWdpbl9tYXN0ZXI9JCggKAorCQljZCBxdWlja2Nsb25lICYmCisJCWdpdCByZXYtcGFyc2Ugb3JpZ2luL21hc3RlcgorCSkgKSAmJgorCWVjaG8gImxvb3NlIG9iamVjdHM6ICRvYmpfY250LCBwYWNrZmlsZXM6ICRwY2tfY250IiAmJgorCXRlc3QgJG9ial9jbnQgLWVxIDAgJiYKKwl0ZXN0ICRwY2tfY250IC1lcSAwICYmCisJdGVzdCB6JG9yaWdpbl9tYXN0ZXIgPSB6JChnaXQgcmV2LXBhcnNlIG1hc3RlcikKKworJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDU1MDMtdGFnZm9sbG93LnNoIGIvdC90NTUwMy10YWdmb2xsb3cuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODZlNWI5YgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MDMtdGFnZm9sbG93LnNoCkBAIC0wLDAgKzEsMTUwIEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0ndGVzdCBhdXRvbWF0aWMgdGFnIGZvbGxvd2luZycKKworLiAuL3Rlc3QtbGliLnNoCisKKyMgRW5kIHN0YXRlIG9mIHRoZSByZXBvc2l0b3J5OgorIworIyAgICAgICAgIFQgLSB0YWcxICAgICAgICAgIFMgLSB0YWcyCisjICAgICAgICAvICAgICAgICAgICAgICAgICAvCisjICAgTCAtIEEgLS0tLS0tIE8gLS0tLS0tIEIKKyMgICAgXCAgIFwgICAgICAgICAgICAgICAgIFwKKyMgICAgIFwgICBDIC0gb3JpZ2luL2NhdCAgICBcCisjICAgICAgb3JpZ2luL21hc3RlciAgICAgICAgIG1hc3RlcgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKwl0ZXN0X3RpY2sgJiYKKwllY2hvIGljaGkgPmZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwlnaXQgY29tbWl0IC1tIEwgJiYKKwlMPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSAmJgorCisJKAorCQlta2RpciBjbG9uZWQgJiYKKwkJY2QgY2xvbmVkICYmCisJCWdpdCBpbml0LWRiICYmCisJCWdpdCByZW1vdGUgYWRkIC1mIG9yaWdpbiAuLgorCSkgJiYKKworCXRlc3RfdGljayAmJgorCWVjaG8gQSA+ZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCWdpdCBjb21taXQgLW0gQSAmJgorCUE9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpCisnCisKK1U9VVBMT0FEX0xPRworCitjYXQgLSA8PEVPRiA+ZXhwZWN0CisjUword2FudCAkQQorI0UKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmV0Y2ggQSAobmV3IGNvbW1pdCA6IDEgY29ubmVjdGlvbiknICcKKwlybSAtZiAkVQorCSgKKwkJY2QgY2xvbmVkICYmCisJCUdJVF9ERUJVR19TRU5EX1BBQ0s9MyBnaXQgZmV0Y2ggMz4uLi8kVSAmJgorCQl0ZXN0ICRBID0gJChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IG9yaWdpbi9tYXN0ZXIpCisJKSAmJgorCXRlc3QgLXMgJFUgJiYKKwljdXQgLWQiICIgLWYxLDIgJFUgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiY3JlYXRlIHRhZyBUIG9uIEEsIGNyZWF0ZSBDIG9uIGJyYW5jaCBjYXQiICcKKwlnaXQgdGFnIC1hIC1tIHRhZzEgdGFnMSAkQSAmJgorCVQ9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IHRhZzEpICYmCisKKwlnaXQgY2hlY2tvdXQgLWIgY2F0ICYmCisJZWNobyBDID5maWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJZ2l0IGNvbW1pdCAtbSBDICYmCisJQz0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkgJiYKKwlnaXQgY2hlY2tvdXQgbWFzdGVyCisnCisKK2NhdCAtIDw8RU9GID5leHBlY3QKKyNTCit3YW50ICRDCit3YW50ICRUCisjRQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmZXRjaCBDLCBUIChuZXcgYnJhbmNoLCB0YWcgOiAxIGNvbm5lY3Rpb24pJyAnCisJcm0gLWYgJFUKKwkoCisJCWNkIGNsb25lZCAmJgorCQlHSVRfREVCVUdfU0VORF9QQUNLPTMgZ2l0IGZldGNoIDM+Li4vJFUgJiYKKwkJdGVzdCAkQyA9ICQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBvcmlnaW4vY2F0KSAmJgorCQl0ZXN0ICRUID0gJChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IHRhZzEpICYmCisJCXRlc3QgJEEgPSAkKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgdGFnMV4wKQorCSkgJiYKKwl0ZXN0IC1zICRVICYmCisJY3V0IC1kIiAiIC1mMSwyICRVID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgImNyZWF0ZSBjb21taXRzIE8sIEIsIHRhZyBTIG9uIEIiICcKKwl0ZXN0X3RpY2sgJiYKKwllY2hvIE8gPmZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwlnaXQgY29tbWl0IC1tIE8gJiYKKworCXRlc3RfdGljayAmJgorCWVjaG8gQiA+ZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCWdpdCBjb21taXQgLW0gQiAmJgorCUI9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisKKwlnaXQgdGFnIC1hIC1tIHRhZzIgdGFnMiAkQiAmJgorCVM9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IHRhZzIpCisnCisKK2NhdCAtIDw8RU9GID5leHBlY3QKKyNTCit3YW50ICRCCit3YW50ICRTCisjRQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmZXRjaCBCLCBTIChjb21taXQgYW5kIHRhZyA6IDEgY29ubmVjdGlvbiknICcKKwlybSAtZiAkVQorCSgKKwkJY2QgY2xvbmVkICYmCisJCUdJVF9ERUJVR19TRU5EX1BBQ0s9MyBnaXQgZmV0Y2ggMz4uLi8kVSAmJgorCQl0ZXN0ICRCID0gJChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IG9yaWdpbi9tYXN0ZXIpICYmCisJCXRlc3QgJEIgPSAkKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgdGFnMl4wKSAmJgorCQl0ZXN0ICRTID0gJChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IHRhZzIpCisJKSAmJgorCXRlc3QgLXMgJFUgJiYKKwljdXQgLWQiICIgLWYxLDIgJFUgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwKKycKKworY2F0IC0gPDxFT0YgPmV4cGVjdAorI1MKK3dhbnQgJEIKK3dhbnQgJFMKKyNFCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ25ldyBjbG9uZSBmZXRjaCBtYXN0ZXIgYW5kIHRhZ3MnICcKKwlnaXQgYnJhbmNoIC1EIGNhdAorCXJtIC1mICRVCisJKAorCQlta2RpciBjbG9uZTIgJiYKKwkJY2QgY2xvbmUyICYmCisJCWdpdCBpbml0ICYmCisJCWdpdCByZW1vdGUgYWRkIG9yaWdpbiAuLiAmJgorCQlHSVRfREVCVUdfU0VORF9QQUNLPTMgZ2l0IGZldGNoIDM+Li4vJFUgJiYKKwkJdGVzdCAkQiA9ICQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBvcmlnaW4vbWFzdGVyKSAmJgorCQl0ZXN0ICRTID0gJChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IHRhZzIpICYmCisJCXRlc3QgJEIgPSAkKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgdGFnMl4wKSAmJgorCQl0ZXN0ICRUID0gJChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IHRhZzEpICYmCisJCXRlc3QgJEEgPSAkKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgdGFnMV4wKQorCSkgJiYKKwl0ZXN0IC1zICRVICYmCisJY3V0IC1kIiAiIC1mMSwyICRVID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NTUwNS1yZW1vdGUuc2ggYi90L3Q1NTA1LXJlbW90ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYTdmZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUwNS1yZW1vdGUuc2gKQEAgLTAsMCArMSwyNTYgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgcmVtb3RlIHBvcmNlbGFpbi1pc2gnCisKKy4gLi90ZXN0LWxpYi5zaAorCitzZXR1cF9yZXBvc2l0b3J5ICgpIHsKKwlta2RpciAiJDEiICYmICgKKwljZCAiJDEiICYmCisJZ2l0IGluaXQgJiYKKwk+ZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gIkluaXRpYWwiICYmCisJZ2l0IGNoZWNrb3V0IC1iIHNpZGUgJiYKKwk+ZWxpZiAmJgorCWdpdCBhZGQgZWxpZiAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gIlNlY29uZCIgJiYKKwlnaXQgY2hlY2tvdXQgbWFzdGVyCisJKQorfQorCit0b2tlbnNfbWF0Y2ggKCkgeworCWVjaG8gIiQxIiB8IHRyICcgJyAnXDAxMicgfCBzb3J0IHwgc2VkIC1lICcvXiQvZCcgPmV4cGVjdCAmJgorCWVjaG8gIiQyIiB8IHRyICcgJyAnXDAxMicgfCBzb3J0IHwgc2VkIC1lICcvXiQvZCcgPmFjdHVhbCAmJgorCXRlc3RfY21wIGV4cGVjdCBhY3R1YWwKK30KKworY2hlY2tfcmVtb3RlX3RyYWNrICgpIHsKKwlhY3R1YWw9JChnaXQgcmVtb3RlIHNob3cgIiQxIiB8IHNlZCAtbiAtZSAnJHAnKSAmJgorCXNoaWZ0ICYmCisJdG9rZW5zX21hdGNoICIkKiIgIiRhY3R1YWwiCit9CisKK2NoZWNrX3RyYWNraW5nX2JyYW5jaCAoKSB7CisJZj0iIiAmJgorCXI9JChnaXQgZm9yLWVhY2gtcmVmICItLWZvcm1hdD0lKHJlZm5hbWUpIiB8CisJCXNlZCAtbmUgInN8XnJlZnMvcmVtb3Rlcy8kMS98fHAiKSAmJgorCXNoaWZ0ICYmCisJdG9rZW5zX21hdGNoICIkKiIgIiRyIgorfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKworCXNldHVwX3JlcG9zaXRvcnkgb25lICYmCisJc2V0dXBfcmVwb3NpdG9yeSB0d28gJiYKKwkoCisJCWNkIHR3byAmJiBnaXQgYnJhbmNoIGFub3RoZXIKKwkpICYmCisJZ2l0IGNsb25lIG9uZSB0ZXN0CisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVtb3RlIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luJyAnCisoCisJY2QgdGVzdCAmJgorCXRva2Vuc19tYXRjaCBvcmlnaW4gIiQoZ2l0IHJlbW90ZSkiICYmCisJY2hlY2tfcmVtb3RlX3RyYWNrIG9yaWdpbiBtYXN0ZXIgc2lkZSAmJgorCWNoZWNrX3RyYWNraW5nX2JyYW5jaCBvcmlnaW4gSEVBRCBtYXN0ZXIgc2lkZQorKQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhZGQgYW5vdGhlciByZW1vdGUnICcKKygKKwljZCB0ZXN0ICYmCisJZ2l0IHJlbW90ZSBhZGQgLWYgc2Vjb25kIC4uL3R3byAmJgorCXRva2Vuc19tYXRjaCAib3JpZ2luIHNlY29uZCIgIiQoZ2l0IHJlbW90ZSkiICYmCisJY2hlY2tfcmVtb3RlX3RyYWNrIG9yaWdpbiBtYXN0ZXIgc2lkZSAmJgorCWNoZWNrX3JlbW90ZV90cmFjayBzZWNvbmQgbWFzdGVyIHNpZGUgYW5vdGhlciAmJgorCWNoZWNrX3RyYWNraW5nX2JyYW5jaCBzZWNvbmQgbWFzdGVyIHNpZGUgYW5vdGhlciAmJgorCWdpdCBmb3ItZWFjaC1yZWYgIi0tZm9ybWF0PSUocmVmbmFtZSkiIHJlZnMvcmVtb3RlcyB8CisJc2VkIC1lICIvXnJlZnNcL3JlbW90ZXNcL29yaWdpblwvL2QiIFwKKwkgICAgLWUgIi9ecmVmc1wvcmVtb3Rlc1wvc2Vjb25kXC8vZCIgPmFjdHVhbCAmJgorCT5leHBlY3QgJiYKKwl0ZXN0X2NtcCBleHBlY3QgYWN0dWFsCispCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlbW92ZSByZW1vdGUnICcKKygKKwljZCB0ZXN0ICYmCisJZ2l0IHN5bWJvbGljLXJlZiByZWZzL3JlbW90ZXMvc2Vjb25kL0hFQUQgcmVmcy9yZW1vdGVzL3NlY29uZC9tYXN0ZXIgJiYKKwlnaXQgcmVtb3RlIHJtIHNlY29uZAorKQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZW1vdmUgcmVtb3RlJyAnCisoCisJY2QgdGVzdCAmJgorCXRva2Vuc19tYXRjaCBvcmlnaW4gIiQoZ2l0IHJlbW90ZSkiICYmCisJY2hlY2tfcmVtb3RlX3RyYWNrIG9yaWdpbiBtYXN0ZXIgc2lkZSAmJgorCWdpdCBmb3ItZWFjaC1yZWYgIi0tZm9ybWF0PSUocmVmbmFtZSkiIHJlZnMvcmVtb3RlcyB8CisJc2VkIC1lICIvXnJlZnNcL3JlbW90ZXNcL29yaWdpblwvL2QiID5hY3R1YWwgJiYKKwk+ZXhwZWN0ICYmCisJdGVzdF9jbXAgZXhwZWN0IGFjdHVhbAorKQorJworCitjYXQgPiB0ZXN0L2V4cGVjdCA8PCBFT0YKKyogcmVtb3RlIG9yaWdpbgorICBVUkw6ICQocHdkKS9vbmUvLmdpdAorICBSZW1vdGUgYnJhbmNoIG1lcmdlZCB3aXRoICdnaXQgcHVsbCcgd2hpbGUgb24gYnJhbmNoIG1hc3RlcgorICAgIG1hc3RlcgorICBOZXcgcmVtb3RlIGJyYW5jaCAobmV4dCBmZXRjaCB3aWxsIHN0b3JlIGluIHJlbW90ZXMvb3JpZ2luKQorICAgIG1hc3RlcgorICBUcmFja2VkIHJlbW90ZSBicmFuY2hlcworICAgIHNpZGUgbWFzdGVyCisgIExvY2FsIGJyYW5jaGVzIHB1c2hlZCB3aXRoICdnaXQgcHVzaCcKKyAgICBtYXN0ZXI6dXBzdHJlYW0gK3JlZnMvdGFncy9sYXN0YmFja3VwCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2hvdycgJworCShjZCB0ZXN0ICYmCisJIGdpdCBjb25maWcgLS1hZGQgcmVtb3RlLm9yaWdpbi5mZXRjaCBcCisJCXJlZnMvaGVhZHMvbWFzdGVyOnJlZnMvaGVhZHMvdXBzdHJlYW0gJiYKKwkgZ2l0IGZldGNoICYmCisJIGdpdCBicmFuY2ggLWQgLXIgb3JpZ2luL21hc3RlciAmJgorCSAoY2QgLi4vb25lICYmCisJICBlY2hvIDEgPiBmaWxlICYmCisJICB0ZXN0X3RpY2sgJiYKKwkgIGdpdCBjb21taXQgLW0gdXBkYXRlIGZpbGUpICYmCisJIGdpdCBjb25maWcgcmVtb3RlLm9yaWdpbi5wdXNoIFwKKwkJcmVmcy9oZWFkcy9tYXN0ZXI6cmVmcy9oZWFkcy91cHN0cmVhbSAmJgorCSBnaXQgY29uZmlnIC0tYWRkIHJlbW90ZS5vcmlnaW4ucHVzaCBcCisJCStyZWZzL3RhZ3MvbGFzdGJhY2t1cCAmJgorCSBnaXQgcmVtb3RlIHNob3cgb3JpZ2luID4gb3V0cHV0ICYmCisJIGdpdCBkaWZmIGV4cGVjdCBvdXRwdXQpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3BydW5lJyAnCisJKGNkIG9uZSAmJgorCSBnaXQgYnJhbmNoIC1tIHNpZGUgc2lkZTIpICYmCisJKGNkIHRlc3QgJiYKKwkgZ2l0IGZldGNoIG9yaWdpbiAmJgorCSBnaXQgcmVtb3RlIHBydW5lIG9yaWdpbiAmJgorCSBnaXQgcmV2LXBhcnNlIHJlZnMvcmVtb3Rlcy9vcmlnaW4vc2lkZTIgJiYKKwkgISBnaXQgcmV2LXBhcnNlIHJlZnMvcmVtb3Rlcy9vcmlnaW4vc2lkZSkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYWRkIC0tbWlycm9yICYmIHBydW5lJyAnCisJKG1rZGlyIG1pcnJvciAmJgorCSBjZCBtaXJyb3IgJiYKKwkgZ2l0IGluaXQgJiYKKwkgZ2l0IHJlbW90ZSBhZGQgLS1taXJyb3IgLWYgb3JpZ2luIC4uL29uZSkgJiYKKwkoY2Qgb25lICYmCisJIGdpdCBicmFuY2ggLW0gc2lkZTIgc2lkZSkgJiYKKwkoY2QgbWlycm9yICYmCisJIGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgcmVmcy9oZWFkcy9zaWRlMiAmJgorCSAhIGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgcmVmcy9oZWFkcy9zaWRlICYmCisJIGdpdCBmZXRjaCBvcmlnaW4gJiYKKwkgZ2l0IHJlbW90ZSBwcnVuZSBvcmlnaW4gJiYKKwkgISBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IHJlZnMvaGVhZHMvc2lkZTIgJiYKKwkgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSByZWZzL2hlYWRzL3NpZGUpCisnCisKK2NhdCA+IG9uZS9leHBlY3QgPDwgRU9GCisgIGFwaXMvbWFzdGVyCisgIGFwaXMvc2lkZQorICBkcm9zb3BoaWxhL2Fub3RoZXIKKyAgZHJvc29waGlsYS9tYXN0ZXIKKyAgZHJvc29waGlsYS9zaWRlCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBkYXRlJyAnCisKKwkoY2Qgb25lICYmCisJIGdpdCByZW1vdGUgYWRkIGRyb3NvcGhpbGEgLi4vdHdvICYmCisJIGdpdCByZW1vdGUgYWRkIGFwaXMgLi4vbWlycm9yICYmCisJIGdpdCByZW1vdGUgdXBkYXRlICYmCisJIGdpdCBicmFuY2ggLXIgPiBvdXRwdXQgJiYKKwkgZ2l0IGRpZmYgZXhwZWN0IG91dHB1dCkKKworJworCitjYXQgPiBvbmUvZXhwZWN0IDw8IEVPRgorICBkcm9zb3BoaWxhL2Fub3RoZXIKKyAgZHJvc29waGlsYS9tYXN0ZXIKKyAgZHJvc29waGlsYS9zaWRlCisgIG1hbmR1Y2EvbWFzdGVyCisgIG1hbmR1Y2Evc2lkZQorICBtZWdhbG9wcmVwdXMvbWFzdGVyCisgIG1lZ2Fsb3ByZXB1cy9zaWRlCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBkYXRlIHdpdGggYXJndW1lbnRzJyAnCisKKwkoY2Qgb25lICYmCisJIGZvciBiIGluICQoZ2l0IGJyYW5jaCAtcikKKwkgZG8KKwkJZ2l0IGJyYW5jaCAtciAtZCAkYiB8fCBicmVhaworCSBkb25lICYmCisJIGdpdCByZW1vdGUgYWRkIG1hbmR1Y2EgLi4vbWlycm9yICYmCisJIGdpdCByZW1vdGUgYWRkIG1lZ2Fsb3ByZXB1cyAuLi9taXJyb3IgJiYKKwkgZ2l0IGNvbmZpZyByZW1vdGVzLnBob2JhZXRpY3VzICJkcm9zb3BoaWxhIG1lZ2Fsb3ByZXB1cyIgJiYKKwkgZ2l0IGNvbmZpZyByZW1vdGVzLnRpdGFudXMgbWFuZHVjYSAmJgorCSBnaXQgcmVtb3RlIHVwZGF0ZSBwaG9iYWV0aWN1cyB0aXRhbnVzICYmCisJIGdpdCBicmFuY2ggLXIgPiBvdXRwdXQgJiYKKwkgZ2l0IGRpZmYgZXhwZWN0IG91dHB1dCkKKworJworCitjYXQgPiBvbmUvZXhwZWN0IDw8IEVPRgorICBhcGlzL21hc3RlcgorICBhcGlzL3NpZGUKKyAgbWFuZHVjYS9tYXN0ZXIKKyAgbWFuZHVjYS9zaWRlCisgIG1lZ2Fsb3ByZXB1cy9tYXN0ZXIKKyAgbWVnYWxvcHJlcHVzL3NpZGUKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1cGRhdGUgZGVmYXVsdCcgJworCisJKGNkIG9uZSAmJgorCSBmb3IgYiBpbiAkKGdpdCBicmFuY2ggLXIpCisJIGRvCisJCWdpdCBicmFuY2ggLXIgLWQgJGIgfHwgYnJlYWsKKwkgZG9uZSAmJgorCSBnaXQgY29uZmlnIHJlbW90ZS5kcm9zb3BoaWxhLnNraXBEZWZhdWx0VXBkYXRlIHRydWUgJiYKKwkgZ2l0IHJlbW90ZSB1cGRhdGUgZGVmYXVsdCAmJgorCSBnaXQgYnJhbmNoIC1yID4gb3V0cHV0ICYmCisJIGdpdCBkaWZmIGV4cGVjdCBvdXRwdXQpCisKKycKKworY2F0ID4gb25lL2V4cGVjdCA8PCBFT0YKKyAgZHJvc29waGlsYS9hbm90aGVyCisgIGRyb3NvcGhpbGEvbWFzdGVyCisgIGRyb3NvcGhpbGEvc2lkZQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VwZGF0ZSBkZWZhdWx0IChvdmVycmlkZGVuLCB3aXRoIGZ1bm55IHdoaXRlc3BhY2UpJyAnCisKKwkoY2Qgb25lICYmCisJIGZvciBiIGluICQoZ2l0IGJyYW5jaCAtcikKKwkgZG8KKwkJZ2l0IGJyYW5jaCAtciAtZCAkYiB8fCBicmVhaworCSBkb25lICYmCisJIGdpdCBjb25maWcgcmVtb3Rlcy5kZWZhdWx0ICIkKHByaW50ZiAiXHQgZHJvc29waGlsYSAgXG4iKSIgJiYKKwkgZ2l0IHJlbW90ZSB1cGRhdGUgZGVmYXVsdCAmJgorCSBnaXQgYnJhbmNoIC1yID4gb3V0cHV0ICYmCisJIGdpdCBkaWZmIGV4cGVjdCBvdXRwdXQpCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnInJlbW90ZSBzaG93IiBkb2VzIG5vdCBzaG93IHN5bWJvbGljIHJlZnMnICcKKworCWdpdCBjbG9uZSBvbmUgdGhyZWUgJiYKKwkoY2QgdGhyZWUgJiYKKwkgZ2l0IHJlbW90ZSBzaG93IG9yaWdpbiA+IG91dHB1dCAmJgorCSAhIGdyZXAgSEVBRCA8IG91dHB1dCAmJgorCSAhIGdyZXAgLWkgc3RhbGUgPCBvdXRwdXQpCisKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1NTEwLWZldGNoLnNoIGIvdC90NTUxMC1mZXRjaC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OTQ2NTU3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxMC1mZXRjaC5zaApAQCAtMCwwICsxLDI5OCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoYykgMjAwNiwgSnVuaW8gQyBIYW1hbm8uCisKK3Rlc3RfZGVzY3JpcHRpb249J1BlciBicmFuY2ggY29uZmlnIHZhcmlhYmxlcyBhZmZlY3RzICJnaXQgZmV0Y2giLgorCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCitEPWBwd2RgCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCWVjaG8gPmZpbGUgb3JpZ2luYWwgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tIG9yaWdpbmFsJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJjbG9uZSBhbmQgc2V0dXAgY2hpbGQgcmVwb3MiICcKKwlnaXQgY2xvbmUgLiBvbmUgJiYKKwljZCBvbmUgJiYKKwllY2hvID5maWxlIHVwZGF0ZWQgYnkgb25lICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAidXBkYXRlZCBieSBvbmUiICYmCisJY2QgLi4gJiYKKwlnaXQgY2xvbmUgLiB0d28gJiYKKwljZCB0d28gJiYKKwlnaXQgY29uZmlnIGJyYW5jaC5tYXN0ZXIucmVtb3RlIG9uZSAmJgorCWdpdCBjb25maWcgcmVtb3RlLm9uZS51cmwgLi4vb25lLy5naXQvICYmCisJZ2l0IGNvbmZpZyByZW1vdGUub25lLmZldGNoIHJlZnMvaGVhZHMvbWFzdGVyOnJlZnMvaGVhZHMvb25lICYmCisJY2QgLi4gJiYKKwlnaXQgY2xvbmUgLiB0aHJlZSAmJgorCWNkIHRocmVlICYmCisJZ2l0IGNvbmZpZyBicmFuY2gubWFzdGVyLnJlbW90ZSB0d28gJiYKKwlnaXQgY29uZmlnIGJyYW5jaC5tYXN0ZXIubWVyZ2UgcmVmcy9oZWFkcy9vbmUgJiYKKwlta2RpciAtcCAuZ2l0L3JlbW90ZXMgJiYKKwl7CisJCWVjaG8gIlVSTDogLi4vdHdvLy5naXQvIgorCQllY2hvICJQdWxsOiByZWZzL2hlYWRzL21hc3RlcjpyZWZzL2hlYWRzL3R3byIKKwkJZWNobyAiUHVsbDogcmVmcy9oZWFkcy9vbmU6cmVmcy9oZWFkcy9vbmUiCisJfSA+LmdpdC9yZW1vdGVzL3R3byAmJgorCWNkIC4uICYmCisJZ2l0IGNsb25lIC4gYnVuZGxlCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgImZldGNoIHRlc3QiICcKKwljZCAiJEQiICYmCisJZWNobyA+ZmlsZSB1cGRhdGVkIGJ5IG9yaWdpbiAmJgorCWdpdCBjb21taXQgLWEgLW0gInVwZGF0ZWQgYnkgb3JpZ2luIiAmJgorCWNkIHR3byAmJgorCWdpdCBmZXRjaCAmJgorCXRlc3QgLWYgLmdpdC9yZWZzL2hlYWRzL29uZSAmJgorCW1pbmU9YGdpdCByZXYtcGFyc2UgcmVmcy9oZWFkcy9vbmVgICYmCisJaGlzPWBjZCAuLi9vbmUgJiYgZ2l0IHJldi1wYXJzZSByZWZzL2hlYWRzL21hc3RlcmAgJiYKKwl0ZXN0ICJ6JG1pbmUiID0gInokaGlzIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJmZXRjaCB0ZXN0IGZvci1tZXJnZSIgJworCWNkICIkRCIgJiYKKwljZCB0aHJlZSAmJgorCWdpdCBmZXRjaCAmJgorCXRlc3QgLWYgLmdpdC9yZWZzL2hlYWRzL3R3byAmJgorCXRlc3QgLWYgLmdpdC9yZWZzL2hlYWRzL29uZSAmJgorCW1hc3Rlcl9pbl90d289YGNkIC4uL3R3byAmJiBnaXQgcmV2LXBhcnNlIG1hc3RlcmAgJiYKKwlvbmVfaW5fdHdvPWBjZCAuLi90d28gJiYgZ2l0IHJldi1wYXJzZSBvbmVgICYmCisJeworCQllY2hvICIkbWFzdGVyX2luX3R3bwlub3QtZm9yLW1lcmdlIgorCQllY2hvICIkb25lX2luX3R3bwkiCisJfSA+ZXhwZWN0ZWQgJiYKKwljdXQgLWYgLTIgLmdpdC9GRVRDSF9IRUFEID5hY3R1YWwgJiYKKwlkaWZmIGV4cGVjdGVkIGFjdHVhbCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmV0Y2ggdGFncyB3aGVuIHRoZXJlIGlzIG5vIHRhZ3MnICcKKworICAgIGNkICIkRCIgJiYKKworICAgIG1rZGlyIG5vdGFncyAmJgorICAgIGNkIG5vdGFncyAmJgorICAgIGdpdCBpbml0ICYmCisKKyAgICBnaXQgZmV0Y2ggLXQgLi4KKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmZXRjaCBmb2xsb3dpbmcgdGFncycgJworCisJY2QgIiREIiAmJgorCWdpdCB0YWcgLWEgLW0gJ2Fubm90YXRlZCcgYW5ubyBIRUFEICYmCisJZ2l0IHRhZyBsaWdodCBIRUFEICYmCisKKwlta2RpciBmb3VyICYmCisJY2QgZm91ciAmJgorCWdpdCBpbml0ICYmCisKKwlnaXQgZmV0Y2ggLi4gOnRyYWNrICYmCisJZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IHJlZnMvdGFncy9hbm5vICYmCisJZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IHJlZnMvdGFncy9saWdodAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZldGNoIG11c3Qgbm90IHJlc29sdmUgc2hvcnQgdGFnIG5hbWUnICcKKworCWNkICIkRCIgJiYKKworCW1rZGlyIGZpdmUgJiYKKwljZCBmaXZlICYmCisJZ2l0IGluaXQgJiYKKworCSEgZ2l0IGZldGNoIC4uIGFubm86Zml2ZQorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZldGNoIG11c3Qgbm90IHJlc29sdmUgc2hvcnQgcmVtb3RlIG5hbWUnICcKKworCWNkICIkRCIgJiYKKwlnaXQtdXBkYXRlLXJlZiByZWZzL3JlbW90ZXMvc2l4L0hFQUQgSEVBRAorCisJbWtkaXIgc2l4ICYmCisJY2Qgc2l4ICYmCisJZ2l0IGluaXQgJiYKKworCSEgZ2l0IGZldGNoIC4uIHNpeDpzaXgKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjcmVhdGUgYnVuZGxlIDEnICcKKwljZCAiJEQiICYmCisJZWNobyA+ZmlsZSB1cGRhdGVkIGFnYWluIGJ5IG9yaWdpbiAmJgorCWdpdCBjb21taXQgLWEgLW0gInRpcCIgJiYKKwlnaXQgYnVuZGxlIGNyZWF0ZSBidW5kbGUxIG1hc3Rlcl4uLm1hc3RlcgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdoZWFkZXIgb2YgYnVuZGxlIGxvb2tzIHJpZ2h0JyAnCisJaGVhZCAtbiAxICIkRCIvYnVuZGxlMSB8IGdyZXAgIl4jIiAmJgorCWhlYWQgLW4gMiAiJEQiL2J1bmRsZTEgfCBncmVwICJeLVswLTlhLWZdXHs0MFx9ICIgJiYKKwloZWFkIC1uIDMgIiREIi9idW5kbGUxIHwgZ3JlcCAiXlswLTlhLWZdXHs0MFx9ICIgJiYKKwloZWFkIC1uIDQgIiREIi9idW5kbGUxIHwgZ3JlcCAiXiQiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NyZWF0ZSBidW5kbGUgMicgJworCWNkICIkRCIgJiYKKwlnaXQgYnVuZGxlIGNyZWF0ZSBidW5kbGUyIG1hc3Rlcn4yLi5tYXN0ZXIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndW5idW5kbGUgMScgJworCWNkICIkRC9idW5kbGUiICYmCisJZ2l0IGNoZWNrb3V0IC1iIHNvbWUtYnJhbmNoICYmCisJISBnaXQgZmV0Y2ggIiREL2J1bmRsZTEiIG1hc3RlcjptYXN0ZXIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYnVuZGxlIDEgaGFzIG9ubHkgMyBmaWxlcyAnICcKKwljZCAiJEQiICYmCisJKAorCQl3aGlsZSByZWFkIHggJiYgdGVzdCAtbiAiJHgiCisJCWRvCisJCQk6OworCQlkb25lCisJCWNhdAorCSkgPGJ1bmRsZTEgPmJ1bmRsZS5wYWNrICYmCisJZ2l0IGluZGV4LXBhY2sgYnVuZGxlLnBhY2sgJiYKKwl2ZXJpZnk9JChnaXQgdmVyaWZ5LXBhY2sgLXYgYnVuZGxlLnBhY2spICYmCisJdGVzdCA0ID0gJChlY2hvICIkdmVyaWZ5IiB8IHdjIC1sKQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1bmJ1bmRsZSAyJyAnCisJY2QgIiREL2J1bmRsZSIgJiYKKwlnaXQgZmV0Y2ggLi4vYnVuZGxlMiBtYXN0ZXI6bWFzdGVyICYmCisJdGVzdCAidGlwIiA9ICIkKGdpdCBsb2cgLTEgLS1wcmV0dHk9b25lbGluZSBtYXN0ZXIgfCBjdXQgLWI0Mi0pIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdidW5kbGUgZG9lcyBub3QgcHJlcmVxdWlzaXRlIG9iamVjdHMnICcKKwljZCAiJEQiICYmCisJdG91Y2ggZmlsZTIgJiYKKwlnaXQgYWRkIGZpbGUyICYmCisJZ2l0IGNvbW1pdCAtbSBhZGQuZmlsZTIgZmlsZTIgJiYKKwlnaXQgYnVuZGxlIGNyZWF0ZSBidW5kbGUzIC0xIEhFQUQgJiYKKwkoCisJCXdoaWxlIHJlYWQgeCAmJiB0ZXN0IC1uICIkeCIKKwkJZG8KKwkJCTo7CisJCWRvbmUKKwkJY2F0CisJKSA8YnVuZGxlMyA+YnVuZGxlLnBhY2sgJiYKKwlnaXQgaW5kZXgtcGFjayBidW5kbGUucGFjayAmJgorCXRlc3QgNCA9ICQoZ2l0IHZlcmlmeS1wYWNrIC12IGJ1bmRsZS5wYWNrIHwgd2MgLWwpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2J1bmRsZSBzaG91bGQgYmUgYWJsZSB0byBjcmVhdGUgYSBmdWxsIGhpc3RvcnknICcKKworCWNkICIkRCIgJiYKKwlnaXQgdGFnIC1hIC1tICcxLjAnIHYxLjAgbWFzdGVyICYmCisJZ2l0IGJ1bmRsZSBjcmVhdGUgYnVuZGxlNCB2MS4wCisKKycKKwordGVzdCAiJFRFU1RfUlNZTkMiICYmIHsKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZldGNoIHZpYSByc3luYycgJworCWdpdCBwYWNrLXJlZnMgJiYKKwlta2RpciByc3luY2VkICYmCisJY2QgcnN5bmNlZCAmJgorCWdpdCBpbml0ICYmCisJZ2l0IGZldGNoIHJzeW5jOi8vMTI3LjAuMC4xJChwd2QpLy4uLy5naXQgbWFzdGVyOnJlZnMvaGVhZHMvbWFzdGVyICYmCisJZ2l0IGdjIC0tcHJ1bmUgJiYKKwl0ZXN0ICQoZ2l0IHJldi1wYXJzZSBtYXN0ZXIpID0gJChjZCAuLiAmJiBnaXQgcmV2LXBhcnNlIG1hc3RlcikgJiYKKwlnaXQgZnNjayAtLWZ1bGwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHVzaCB2aWEgcnN5bmMnICcKKwlta2RpciAuLi9yc3luY2VkMiAmJgorCShjZCAuLi9yc3luY2VkMiAmJgorCSBnaXQgaW5pdCkgJiYKKwlnaXQgcHVzaCByc3luYzovLzEyNy4wLjAuMSQocHdkKS8uLi9yc3luY2VkMi8uZ2l0IG1hc3RlciAmJgorCWNkIC4uL3JzeW5jZWQyICYmCisJZ2l0IGdjIC0tcHJ1bmUgJiYKKwl0ZXN0ICQoZ2l0IHJldi1wYXJzZSBtYXN0ZXIpID0gJChjZCAuLiAmJiBnaXQgcmV2LXBhcnNlIG1hc3RlcikgJiYKKwlnaXQgZnNjayAtLWZ1bGwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHVzaCB2aWEgcnN5bmMnICcKKwljZCAuLiAmJgorCW1rZGlyIHJzeW5jZWQzICYmCisJKGNkIHJzeW5jZWQzICYmCisJIGdpdCBpbml0KSAmJgorCWdpdCBwdXNoIC0tYWxsIHJzeW5jOi8vMTI3LjAuMC4xJChwd2QpL3JzeW5jZWQzLy5naXQgJiYKKwljZCByc3luY2VkMyAmJgorCXRlc3QgJChnaXQgcmV2LXBhcnNlIG1hc3RlcikgPSAkKGNkIC4uICYmIGdpdCByZXYtcGFyc2UgbWFzdGVyKSAmJgorCWdpdCBmc2NrIC0tZnVsbAorJworfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmZXRjaCB3aXRoIGEgbm9uLWFwcGx5aW5nIGJyYW5jaC48bmFtZT4ubWVyZ2UnICcKKwlnaXQgY29uZmlnIGJyYW5jaC5tYXN0ZXIucmVtb3RlIHlldGkgJiYKKwlnaXQgY29uZmlnIGJyYW5jaC5tYXN0ZXIubWVyZ2UgcmVmcy9oZWFkcy9iaWdmb290ICYmCisJZ2l0IGNvbmZpZyByZW1vdGUuYmx1Yi51cmwgb25lICYmCisJZ2l0IGNvbmZpZyByZW1vdGUuYmx1Yi5mZXRjaCAicmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vbmUvKiIgJiYKKwlnaXQgZmV0Y2ggYmx1YgorJworCisjIHRoZSBzdHJhbmdlIG5hbWUgaXM6IGFcISdiCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdxdW90aW5nIG9mIGEgc3RyYW5nZWx5IG5hbWVkIHJlcG8nICcKKwkhIGdpdCBmZXRjaCAiYVxcISdcJydiIiA+IHJlc3VsdCAyPiYxICYmCisJY2F0IHJlc3VsdCAmJgorCWdyZXAgImZhdGFsOiAnXCcnYVxcXFwhJ1wnJ2InXCcnIiByZXN1bHQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYnVuZGxlIHNob3VsZCByZWNvcmQgSEVBRCBjb3JyZWN0bHknICcKKworCWNkICIkRCIgJiYKKwlnaXQgYnVuZGxlIGNyZWF0ZSBidW5kbGU1IEhFQUQgbWFzdGVyICYmCisJZ2l0IGJ1bmRsZSBsaXN0LWhlYWRzIGJ1bmRsZTUgPmFjdHVhbCAmJgorCWZvciBoIGluIEhFQUQgcmVmcy9oZWFkcy9tYXN0ZXIKKwlkbworCQllY2hvICIkKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgJGgpICRoIgorCWRvbmUgPmV4cGVjdCAmJgorCXRlc3RfY21wIGV4cGVjdCBhY3R1YWwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdleHBsaWNpdCBmZXRjaCBzaG91bGQgbm90IHVwZGF0ZSB0cmFja2luZycgJworCisJY2QgIiREIiAmJgorCWdpdCBicmFuY2ggLWYgc2lkZSAmJgorCSgKKwkJY2QgdGhyZWUgJiYKKwkJbz0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIpICYmCisJCWdpdCBmZXRjaCBvcmlnaW4gbWFzdGVyICYmCisJCW49JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyKSAmJgorCQl0ZXN0ICIkbyIgPSAiJG4iICYmCisJCSEgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSByZWZzL3JlbW90ZXMvb3JpZ2luL3NpZGUKKwkpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2V4cGxpY2l0IHB1bGwgc2hvdWxkIG5vdCB1cGRhdGUgdHJhY2tpbmcnICcKKworCWNkICIkRCIgJiYKKwlnaXQgYnJhbmNoIC1mIHNpZGUgJiYKKwkoCisJCWNkIHRocmVlICYmCisJCW89JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyKSAmJgorCQlnaXQgcHVsbCBvcmlnaW4gbWFzdGVyICYmCisJCW49JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyKSAmJgorCQl0ZXN0ICIkbyIgPSAiJG4iICYmCisJCSEgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSByZWZzL3JlbW90ZXMvb3JpZ2luL3NpZGUKKwkpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvbmZpZ3VyZWQgZmV0Y2ggdXBkYXRlcyB0cmFja2luZycgJworCisJY2QgIiREIiAmJgorCWdpdCBicmFuY2ggLWYgc2lkZSAmJgorCSgKKwkJY2QgdGhyZWUgJiYKKwkJbz0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIpICYmCisJCWdpdCBmZXRjaCBvcmlnaW4gJiYKKwkJbj0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIpICYmCisJCXRlc3QgIiRvIiAhPSAiJG4iICYmCisJCWdpdCByZXYtcGFyc2UgLS12ZXJpZnkgcmVmcy9yZW1vdGVzL29yaWdpbi9zaWRlCisJKQorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDU1MTEtcmVmc3BlYy5zaCBiL3QvdDU1MTEtcmVmc3BlYy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NzBhOGYxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxMS1yZWZzcGVjLnNoCkBAIC0wLDAgKzEsNzIgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdyZWZzcGVjIHBhcnNpbmcnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X3JlZnNwZWMgKCkgeworCisJa2luZD0kMSByZWZzcGVjPSQyIGV4cGVjdD0kMworCWdpdCBjb25maWcgcmVtb3RlLmZyb3R6LnVybCAiLiIgJiYKKwlnaXQgY29uZmlnIC0tcmVtb3ZlLXNlY3Rpb24gcmVtb3RlLmZyb3R6ICYmCisJZ2l0IGNvbmZpZyByZW1vdGUuZnJvdHoudXJsICIuIiAmJgorCWdpdCBjb25maWcgInJlbW90ZS5mcm90ei4ka2luZCIgIiRyZWZzcGVjIiAmJgorCWlmIHRlc3QgIiRleHBlY3QiICE9IGludmFsaWQKKwl0aGVuCisJCXRpdGxlPSIka2luZCAkcmVmc3BlYyIKKwkJdGVzdD0nZ2l0IGxzLXJlbW90ZSBmcm90eicKKwllbHNlCisJCXRpdGxlPSIka2luZCAkcmVmc3BlYyAoaW52YWxpZCkiCisJCXRlc3Q9J3Rlc3RfbXVzdF9mYWlsIGdpdCBscy1yZW1vdGUgZnJvdHonCisJZmkKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICIkdGl0bGUiICIkdGVzdCIKK30KKwordGVzdF9yZWZzcGVjIHB1c2ggJycJCQkJCQlpbnZhbGlkCit0ZXN0X3JlZnNwZWMgcHVzaCAnOicJCQkJCQlpbnZhbGlkCisKK3Rlc3RfcmVmc3BlYyBmZXRjaCAnJwordGVzdF9yZWZzcGVjIGZldGNoICc6JworCit0ZXN0X3JlZnNwZWMgcHVzaCAncmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9mcm90ei8qJwordGVzdF9yZWZzcGVjIHB1c2ggJ3JlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvZnJvdHonCQlpbnZhbGlkCit0ZXN0X3JlZnNwZWMgcHVzaCAncmVmcy9oZWFkczpyZWZzL3JlbW90ZXMvZnJvdHovKicJCWludmFsaWQKK3Rlc3RfcmVmc3BlYyBwdXNoICdyZWZzL2hlYWRzL21hc3RlcjpyZWZzL3JlbW90ZXMvZnJvdHoveHl6enknCisKKworIyBUaGVzZSBoYXZlIGludmFsaWQgTEhTLCBidXQgd2UgZG8gbm90IGhhdmUgYSBmb3JtYWwgInZhbGlkIHNoYS0xCisjIGV4cHJlc3Npb24gc3ludGF4IGNoZWNrZXIiIHNvIHRoZXkgYXJlIG5vdCBjaGVja2VkIHdpdGggdGhlIGN1cnJlbnQKKyMgY29kZS4gIFRoZXkgd2lsbCBiZSBjYXVnaHQgZG93bnN0cmVhbSBhbnl3YXksIGJ1dCB3ZSBtYXkgd2FudCB0bworIyBoYXZlIHRpZ2h0ZXIgY2hlY2sgbGF0ZXIuLi4KKworOiB0ZXN0X3JlZnNwZWMgcHVzaCAncmVmcy9oZWFkcy9tYXN0ZXI6OnJlZnMvcmVtb3Rlcy9mcm90ei94eXp6eScJaW52YWxpZAorOiB0ZXN0X3JlZnNwZWMgcHVzaCAncmVmcy9oZWFkcy9tYXN0ZSA6cmVmcy9yZW1vdGVzL2Zyb3R6L3h5enp5JwlpbnZhbGlkCisKK3Rlc3RfcmVmc3BlYyBmZXRjaCAncmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9mcm90ei8qJwordGVzdF9yZWZzcGVjIGZldGNoICdyZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL2Zyb3R6JwkJaW52YWxpZAordGVzdF9yZWZzcGVjIGZldGNoICdyZWZzL2hlYWRzOnJlZnMvcmVtb3Rlcy9mcm90ei8qJwkJaW52YWxpZAordGVzdF9yZWZzcGVjIGZldGNoICdyZWZzL2hlYWRzL21hc3RlcjpyZWZzL3JlbW90ZXMvZnJvdHoveHl6enknCit0ZXN0X3JlZnNwZWMgZmV0Y2ggJ3JlZnMvaGVhZHMvbWFzdGVyOjpyZWZzL3JlbW90ZXMvZnJvdHoveHl6enknCWludmFsaWQKK3Rlc3RfcmVmc3BlYyBmZXRjaCAncmVmcy9oZWFkcy9tYXN0ZSA6cmVmcy9yZW1vdGVzL2Zyb3R6L3h5enp5JwlpbnZhbGlkCisKK3Rlc3RfcmVmc3BlYyBwdXNoICdtYXN0ZXJ+MTpyZWZzL3JlbW90ZXMvZnJvdHovYmFja3VwJwordGVzdF9yZWZzcGVjIGZldGNoICdtYXN0ZXJ+MTpyZWZzL3JlbW90ZXMvZnJvdHovYmFja3VwJwkJaW52YWxpZAordGVzdF9yZWZzcGVjIHB1c2ggJ0hFQUR+NDpyZWZzL3JlbW90ZXMvZnJvdHovbmV3JwordGVzdF9yZWZzcGVjIGZldGNoICdIRUFEfjQ6cmVmcy9yZW1vdGVzL2Zyb3R6L25ldycJCWludmFsaWQKKwordGVzdF9yZWZzcGVjIHB1c2ggJ0hFQUQnCit0ZXN0X3JlZnNwZWMgZmV0Y2ggJ0hFQUQnCit0ZXN0X3JlZnNwZWMgcHVzaCAncmVmcy9oZWFkcy8gbml0Zm9sJwkJCQlpbnZhbGlkCit0ZXN0X3JlZnNwZWMgZmV0Y2ggJ3JlZnMvaGVhZHMvIG5pdGZvbCcJCQkJaW52YWxpZAorCit0ZXN0X3JlZnNwZWMgcHVzaCAnSEVBRDonCQkJCQlpbnZhbGlkCit0ZXN0X3JlZnNwZWMgZmV0Y2ggJ0hFQUQ6JwordGVzdF9yZWZzcGVjIHB1c2ggJ3JlZnMvaGVhZHMvIG5pdGZvbDonCQkJCWludmFsaWQKK3Rlc3RfcmVmc3BlYyBmZXRjaCAncmVmcy9oZWFkcy8gbml0Zm9sOicJCQlpbnZhbGlkCisKK3Rlc3RfcmVmc3BlYyBwdXNoICc6cmVmcy9yZW1vdGVzL2Zyb3R6L2RlbGV0ZW1lJwordGVzdF9yZWZzcGVjIGZldGNoICc6cmVmcy9yZW1vdGVzL2Zyb3R6L0hFQUQtdG8tbWUnCit0ZXN0X3JlZnNwZWMgcHVzaCAnOnJlZnMvcmVtb3Rlcy9mcm90ei9kZWxldGUgbWUnCQlpbnZhbGlkCit0ZXN0X3JlZnNwZWMgZmV0Y2ggJzpyZWZzL3JlbW90ZXMvZnJvdHovSEVBRCB0byBtZScJCWludmFsaWQKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1NTEyLWxzLXJlbW90ZS5zaCBiL3QvdDU1MTItbHMtcmVtb3RlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMwZGM5NDkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTEyLWxzLXJlbW90ZS5zaApAQCAtMCwwICsxLDUyIEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IGxzLXJlbW90ZScKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJPmZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIGluaXRpYWwgJiYKKwlnaXQgdGFnIG1hcmsgJiYKKwlnaXQgc2hvdy1yZWYgLS10YWdzIC1kIHwgc2VkIC1lICJzLyAvCS8iID5leHBlY3RlZC50YWcgJiYKKwkoCisJCWVjaG8gIiQoZ2l0IHJldi1wYXJzZSBIRUFEKQlIRUFEIgorCQlnaXQgc2hvdy1yZWYgLWQJfCBzZWQgLWUgInMvIC8JLyIKKwkpID5leHBlY3RlZC5hbGwgJiYKKworCWdpdCByZW1vdGUgYWRkIHNlbGYgJChwd2QpLy5naXQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdscy1yZW1vdGUgLS10YWdzIC5naXQnICcKKworCWdpdCBscy1yZW1vdGUgLS10YWdzIC5naXQgPmFjdHVhbCAmJgorCXRlc3RfY21wIGV4cGVjdGVkLnRhZyBhY3R1YWwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdscy1yZW1vdGUgLmdpdCcgJworCisJZ2l0IGxzLXJlbW90ZSAuZ2l0ID5hY3R1YWwgJiYKKwl0ZXN0X2NtcCBleHBlY3RlZC5hbGwgYWN0dWFsCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbHMtcmVtb3RlIC0tdGFncyBzZWxmJyAnCisKKwlnaXQgbHMtcmVtb3RlIC0tdGFncyBzZWxmID5hY3R1YWwgJiYKKwl0ZXN0X2NtcCBleHBlY3RlZC50YWcgYWN0dWFsCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbHMtcmVtb3RlIHNlbGYnICcKKworCWdpdCBscy1yZW1vdGUgc2VsZiA+YWN0dWFsICYmCisJdGVzdF9jbXAgZXhwZWN0ZWQuYWxsIGFjdHVhbAorCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NTUxNS1mZXRjaC1tZXJnZS1sb2dpYy5zaCBiL3QvdDU1MTUtZmV0Y2gtbWVyZ2UtbG9naWMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjVjMzc3NAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUtZmV0Y2gtbWVyZ2UtbG9naWMuc2gKQEAgLTAsMCArMSwxNzMgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDcgU2FudGkgQsOpamFyLCBiYXNlZCBvbiB0NDAxMyBieSBKdW5pbyBDIEhhbWFubworIworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdNZXJnZSBsb2dpYyBpbiBmZXRjaCcKKworLiAuL3Rlc3QtbGliLnNoCisKK0xGPScKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJR0lUX0FVVEhPUl9EQVRFPSIyMDA2LTA2LTI2IDAwOjAwOjAwICswMDAwIiAmJgorCUdJVF9DT01NSVRURVJfREFURT0iMjAwNi0wNi0yNiAwMDowMDowMCArMDAwMCIgJiYKKwlleHBvcnQgR0lUX0FVVEhPUl9EQVRFIEdJVF9DT01NSVRURVJfREFURSAmJgorCisJZWNobyA+ZmlsZSBvcmlnaW5hbCAmJgorCWdpdCBhZGQgZmlsZSAmJgorCWdpdCBjb21taXQgLWEgLW0gT25lICYmCisJZ2l0IHRhZyB0YWctb25lICYmCisJZ2l0IHRhZyB0YWctb25lLXRyZWUgSEVBRF57dHJlZX0gJiYKKwlnaXQgYnJhbmNoIG9uZSAmJgorCisJZWNobyB0d28gPj4gZmlsZSAmJgorCWdpdCBjb21taXQgLWEgLW0gVHdvICYmCisJZ2l0IHRhZyAtYSAtbSAiVGFnIFR3byIgdGFnLXR3byAmJgorCWdpdCBicmFuY2ggdHdvICYmCisKKwllY2hvIHRocmVlID4+IGZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tIFRocmVlICYmCisJZ2l0IHRhZyAtYSAtbSAiVGFnIFRocmVlIiB0YWctdGhyZWUgJiYKKwlnaXQgdGFnIC1hIC1tICJUYWcgVGhyZWUgZmlsZSIgdGFnLXRocmVlLWZpbGUgSEVBRF57dHJlZX06ZmlsZSAmJgorCWdpdCBicmFuY2ggdGhyZWUgJiYKKworCWVjaG8gbWFzdGVyID4+IGZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tIE1hc3RlciAmJgorCWdpdCB0YWcgLWEgLW0gIlRhZyBNYXN0ZXIiIHRhZy1tYXN0ZXIgJiYKKworCWdpdCBjaGVja291dCB0aHJlZSAmJgorCisJZ2l0IGNsb25lIC4gY2xvbmVkICYmCisJY2QgY2xvbmVkICYmCisJZ2l0IGNvbmZpZyByZW1vdGUub3JpZ2luLnVybCAuLi8uZ2l0LyAmJgorCisJZ2l0IGNvbmZpZyByZW1vdGUuY29uZmlnLWV4cGxpY2l0LnVybCAuLi8uZ2l0LyAmJgorCWdpdCBjb25maWcgcmVtb3RlLmNvbmZpZy1leHBsaWNpdC5mZXRjaCByZWZzL2hlYWRzL21hc3RlcjpyZW1vdGVzL3JlbS9tYXN0ZXIgJiYKKwlnaXQgY29uZmlnIC0tYWRkIHJlbW90ZS5jb25maWctZXhwbGljaXQuZmV0Y2ggcmVmcy9oZWFkcy9vbmU6cmVtb3Rlcy9yZW0vb25lICYmCisJZ2l0IGNvbmZpZyAtLWFkZCByZW1vdGUuY29uZmlnLWV4cGxpY2l0LmZldGNoIHR3bzpyZW1vdGVzL3JlbS90d28gJiYKKwlnaXQgY29uZmlnIC0tYWRkIHJlbW90ZS5jb25maWctZXhwbGljaXQuZmV0Y2ggcmVmcy9oZWFkcy90aHJlZTpyZW1vdGVzL3JlbS90aHJlZSAmJgorCXJlbW90ZXM9ImNvbmZpZy1leHBsaWNpdCIgJiYKKworCWdpdCBjb25maWcgcmVtb3RlLmNvbmZpZy1nbG9iLnVybCAuLi8uZ2l0LyAmJgorCWdpdCBjb25maWcgcmVtb3RlLmNvbmZpZy1nbG9iLmZldGNoIHJlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvcmVtLyogJiYKKwlyZW1vdGVzPSIkcmVtb3RlcyBjb25maWctZ2xvYiIgJiYKKworCW1rZGlyIC1wIC5naXQvcmVtb3RlcyAmJgorCXsKKwkJZWNobyAiVVJMOiAuLi8uZ2l0LyIKKwkJZWNobyAiUHVsbDogcmVmcy9oZWFkcy9tYXN0ZXI6cmVtb3Rlcy9yZW0vbWFzdGVyIgorCQllY2hvICJQdWxsOiByZWZzL2hlYWRzL29uZTpyZW1vdGVzL3JlbS9vbmUiCisJCWVjaG8gIlB1bGw6IHR3bzpyZW1vdGVzL3JlbS90d28iCisJCWVjaG8gIlB1bGw6IHJlZnMvaGVhZHMvdGhyZWU6cmVtb3Rlcy9yZW0vdGhyZWUiCisJfSA+LmdpdC9yZW1vdGVzL3JlbW90ZS1leHBsaWNpdCAmJgorCXJlbW90ZXM9IiRyZW1vdGVzIHJlbW90ZS1leHBsaWNpdCIgJiYKKworCXsKKwkJZWNobyAiVVJMOiAuLi8uZ2l0LyIKKwkJZWNobyAiUHVsbDogcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9yZW0vKiIKKwl9ID4uZ2l0L3JlbW90ZXMvcmVtb3RlLWdsb2IgJiYKKwlyZW1vdGVzPSIkcmVtb3RlcyByZW1vdGUtZ2xvYiIgJiYKKworCW1rZGlyIC1wIC5naXQvYnJhbmNoZXMgJiYKKwllY2hvICIuLi8uZ2l0IiA+IC5naXQvYnJhbmNoZXMvYnJhbmNoZXMtZGVmYXVsdCAmJgorCXJlbW90ZXM9IiRyZW1vdGVzIGJyYW5jaGVzLWRlZmF1bHQiICYmCisKKwllY2hvICIuLi8uZ2l0I29uZSIgPiAuZ2l0L2JyYW5jaGVzL2JyYW5jaGVzLW9uZSAmJgorCXJlbW90ZXM9IiRyZW1vdGVzIGJyYW5jaGVzLW9uZSIgJiYKKworCWZvciByZW1vdGUgaW4gJHJlbW90ZXMgOyBkbworCQlnaXQgY29uZmlnIGJyYW5jaC5ici0kcmVtb3RlLnJlbW90ZSAkcmVtb3RlICYmCisJCWdpdCBjb25maWcgYnJhbmNoLmJyLSRyZW1vdGUtbWVyZ2UucmVtb3RlICRyZW1vdGUgJiYKKwkJZ2l0IGNvbmZpZyBicmFuY2guYnItJHJlbW90ZS1tZXJnZS5tZXJnZSByZWZzL2hlYWRzL3RocmVlICYmCisJCWdpdCBjb25maWcgYnJhbmNoLmJyLSRyZW1vdGUtb2N0b3B1cy5yZW1vdGUgJHJlbW90ZSAmJgorCQlnaXQgY29uZmlnIGJyYW5jaC5ici0kcmVtb3RlLW9jdG9wdXMubWVyZ2UgcmVmcy9oZWFkcy9vbmUgJiYKKwkJZ2l0IGNvbmZpZyAtLWFkZCBicmFuY2guYnItJHJlbW90ZS1vY3RvcHVzLm1lcmdlIHR3bworCWRvbmUKKycKKworIyBNZXJnZSBsb2dpYyBkZXBlbmRzIG9uIGJyYW5jaCBwcm9wZXJ0aWVzIGFuZCBQdWxsOiBvciAuZmV0Y2ggbGluZXMKK2ZvciByZW1vdGUgaW4gJHJlbW90ZXMgOyBkbworICAgIGZvciBicmFuY2ggaW4gIiIgIi1tZXJnZSIgIi1vY3RvcHVzIiA7IGRvCitjYXQgPDxFT0YKK2JyLSRyZW1vdGUkYnJhbmNoCitici0kcmVtb3RlJGJyYW5jaCAkcmVtb3RlCitFT0YKKyAgICBkb25lCitkb25lID4gdGVzdHMKKworIyBNZXJnZSBsb2dpYyBkb2VzIG5vdCBkZXBlbmQgb24gYnJhbmNoIHByb3BlcnRpZXMsCisjIGJ1dCBkb2VzIGRlcGVuZCBvbiBQdWxsOiBvciBmZXRjaCBsaW5lcy4KKyMgVXNlIHR3byBicmFuY2hlcyBjb21wbGV0ZWx5IHVucmVsYXRlZCBmcm9tIHRoZSBhcmd1bWVudHMsCisjIHRoZSBjbG9uZSBkZWZhdWx0IGFuZCBvbmUgd2l0aG91dCBicmFuY2ggcHJvcGVydGllcworZm9yIGJyYW5jaCBpbiBtYXN0ZXIgYnItdW5jb25maWcgOyBkbworICAgIGVjaG8gJGJyYW5jaAorICAgIGZvciByZW1vdGUgaW4gJHJlbW90ZXMgOyBkbworCWVjaG8gJGJyYW5jaCAkcmVtb3RlCisgICAgZG9uZQorZG9uZSA+PiB0ZXN0cworCisjIE1lcmdlIGxvZ2ljIGRvZXMgbm90IGRlcGVuZCBvbiBicmFuY2ggcHJvcGVydGllcworIyBuZWl0aGVyIGluIHRoZSBQdWxsOiBvciAuZmV0Y2ggY29uZmlnCitmb3IgYnJhbmNoIGluIG1hc3RlciBici11bmNvbmZpZyA7IGRvCisgICAgY2F0IDw8RU9GCiskYnJhbmNoIC4uLy5naXQKKyRicmFuY2ggLi4vLmdpdCBvbmUKKyRicmFuY2ggLi4vLmdpdCBvbmUgdHdvCiskYnJhbmNoIC0tdGFncyAuLi8uZ2l0CiskYnJhbmNoIC4uLy5naXQgdGFnIHRhZy1vbmUgdGFnIHRhZy10aHJlZQorJGJyYW5jaCAuLi8uZ2l0IHRhZyB0YWctb25lLXRyZWUgdGFnIHRhZy10aHJlZS1maWxlCiskYnJhbmNoIC4uLy5naXQgb25lIHRhZyB0YWctb25lIHRhZyB0YWctdGhyZWUtZmlsZQorRU9GCitkb25lID4+IHRlc3RzCisKK3doaWxlIHJlYWQgY21kCitkbworCWNhc2UgIiRjbWQiIGluCisJJycgfCAnIycqKSBjb250aW51ZSA7OworCWVzYWMKKwl0ZXN0PWBlY2hvICIkY21kIiB8IHNlZCAtZSAnc3xbLyBdWy8gXSp8X3xnJ2AKKwljbnQ9YGV4cHIgJHRlc3RfY291bnQgKyAxYAorCXBmeD1gcHJpbnRmICIlMDRkIiAkY250YAorCWV4cGVjdF9mPSIuLi8uLi90NTUxNS9mZXRjaC4kdGVzdCIKKwlhY3R1YWxfZj0iJHBmeC1mZXRjaC4kdGVzdCIKKwlleHBlY3Rfcj0iLi4vLi4vdDU1MTUvcmVmcy4kdGVzdCIKKwlhY3R1YWxfcj0iJHBmeC1yZWZzLiR0ZXN0IgorCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAiJGNtZCIgJworCQl7CisJCQllY2hvICIjICRjbWQiCisJCQlzZXQgeCAkY21kOyBzaGlmdAorCQkJZ2l0IHN5bWJvbGljLXJlZiBIRUFEIHJlZnMvaGVhZHMvJDEgOyBzaGlmdAorCQkJcm0gLWYgLmdpdC9GRVRDSF9IRUFECisJCQlybSAtZiAuZ2l0L3JlZnMvaGVhZHMvKgorCQkJcm0gLWYgLmdpdC9yZWZzL3JlbW90ZXMvcmVtLyoKKwkJCXJtIC1mIC5naXQvcmVmcy90YWdzLyoKKwkJCWdpdCBmZXRjaCAiJEAiID4vZGV2L251bGwKKwkJCWNhdCAuZ2l0L0ZFVENIX0hFQUQKKwkJfSA+IiRhY3R1YWxfZiIgJiYKKwkJZ2l0IHNob3ctcmVmID4iJGFjdHVhbF9yIiAmJgorCQlpZiB0ZXN0IC1mICIkZXhwZWN0X2YiCisJCXRoZW4KKwkJCWdpdCBkaWZmIC11ICIkZXhwZWN0X2YiICIkYWN0dWFsX2YiICYmCisJCQlybSAtZiAiJGFjdHVhbF9mIgorCQllbHNlCisJCQkjIHRoaXMgaXMgdG8gaGVscCBkZXZlbG9waW5nIG5ldyB0ZXN0cy4KKwkJCWNwICIkYWN0dWFsX2YiICIkZXhwZWN0X2YiCisJCQlmYWxzZQorCQlmaSAmJgorCQlpZiB0ZXN0IC1mICIkZXhwZWN0X3IiCisJCXRoZW4KKwkJCWdpdCBkaWZmIC11ICIkZXhwZWN0X3IiICIkYWN0dWFsX3IiICYmCisJCQlybSAtZiAiJGFjdHVhbF9yIgorCQllbHNlCisJCQkjIHRoaXMgaXMgdG8gaGVscCBkZXZlbG9waW5nIG5ldyB0ZXN0cy4KKwkJCWNwICIkYWN0dWFsX3IiICIkZXhwZWN0X3IiCisJCQlmYWxzZQorCQlmaQorCScKK2RvbmUgPCB0ZXN0cworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtZGVmYXVsdCBiL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtZGVmYXVsdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTA0MTRmCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1icmFuY2hlcy1kZWZhdWx0CkBAIC0wLDAgKzEsOCBAQAorIyBici1icmFuY2hlcy1kZWZhdWx0Cis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtZGVmYXVsdC1tZXJnZSBiL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtZGVmYXVsdC1tZXJnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTJjYzFkCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1icmFuY2hlcy1kZWZhdWx0LW1lcmdlCkBAIC0wLDAgKzEsOSBAQAorIyBici1icmFuY2hlcy1kZWZhdWx0LW1lcmdlCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YgkJYnJhbmNoICd0aHJlZScgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtZGVmYXVsdC1tZXJnZV9icmFuY2hlcy1kZWZhdWx0IGIvdC90NTUxNS9mZXRjaC5ici1icmFuY2hlcy1kZWZhdWx0LW1lcmdlX2JyYW5jaGVzLWRlZmF1bHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q5NDdjZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtZGVmYXVsdC1tZXJnZV9icmFuY2hlcy1kZWZhdWx0CkBAIC0wLDAgKzEsOSBAQAorIyBici1icmFuY2hlcy1kZWZhdWx0LW1lcmdlIGJyYW5jaGVzLWRlZmF1bHQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici1icmFuY2hlcy1kZWZhdWx0LW9jdG9wdXMgYi90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLWRlZmF1bHQtb2N0b3B1cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzM5YzU0Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1icmFuY2hlcy1kZWZhdWx0LW9jdG9wdXMKQEAgLTAsMCArMSwxMCBAQAorIyBici1icmFuY2hlcy1kZWZhdWx0LW9jdG9wdXMKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CQlicmFuY2ggJ29uZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CQlicmFuY2ggJ3R3bycgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtZGVmYXVsdC1vY3RvcHVzX2JyYW5jaGVzLWRlZmF1bHQgYi90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLWRlZmF1bHQtb2N0b3B1c19icmFuY2hlcy1kZWZhdWx0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZjQyZTIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLWRlZmF1bHQtb2N0b3B1c19icmFuY2hlcy1kZWZhdWx0CkBAIC0wLDAgKzEsMTAgQEAKKyMgYnItYnJhbmNoZXMtZGVmYXVsdC1vY3RvcHVzIGJyYW5jaGVzLWRlZmF1bHQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CQlicmFuY2ggJ29uZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CQlicmFuY2ggJ3R3bycgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtZGVmYXVsdF9icmFuY2hlcy1kZWZhdWx0IGIvdC90NTUxNS9mZXRjaC5ici1icmFuY2hlcy1kZWZhdWx0X2JyYW5jaGVzLWRlZmF1bHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEyYmYzYwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtZGVmYXVsdF9icmFuY2hlcy1kZWZhdWx0CkBAIC0wLDAgKzEsOCBAQAorIyBici1icmFuY2hlcy1kZWZhdWx0IGJyYW5jaGVzLWRlZmF1bHQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici1icmFuY2hlcy1vbmUgYi90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLW9uZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmFjOGQyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1icmFuY2hlcy1vbmUKQEAgLTAsMCArMSw4IEBACisjIGJyLWJyYW5jaGVzLW9uZQorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQkJYnJhbmNoICdvbmUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLW9uZS1tZXJnZSBiL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtb25lLW1lcmdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YjNiMzUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLW9uZS1tZXJnZQpAQCAtMCwwICsxLDkgQEAKKyMgYnItYnJhbmNoZXMtb25lLW1lcmdlCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YgkJYnJhbmNoICd0aHJlZScgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtb25lLW1lcmdlX2JyYW5jaGVzLW9uZSBiL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtb25lLW1lcmdlX2JyYW5jaGVzLW9uZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWNlZjM4Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1icmFuY2hlcy1vbmUtbWVyZ2VfYnJhbmNoZXMtb25lCkBAIC0wLDAgKzEsOSBAQAorIyBici1icmFuY2hlcy1vbmUtbWVyZ2UgYnJhbmNoZXMtb25lCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YgkJYnJhbmNoICd0aHJlZScgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtb25lLW9jdG9wdXMgYi90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLW9uZS1vY3RvcHVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZTMwMjkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLW9uZS1vY3RvcHVzCkBAIC0wLDAgKzEsOSBAQAorIyBici1icmFuY2hlcy1vbmUtb2N0b3B1cworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQkJYnJhbmNoICdvbmUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAkJYnJhbmNoICd0d28nIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLW9uZS1vY3RvcHVzX2JyYW5jaGVzLW9uZSBiL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtb25lLW9jdG9wdXNfYnJhbmNoZXMtb25lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZTBiYWQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLWJyYW5jaGVzLW9uZS1vY3RvcHVzX2JyYW5jaGVzLW9uZQpAQCAtMCwwICsxLDkgQEAKKyMgYnItYnJhbmNoZXMtb25lLW9jdG9wdXMgYnJhbmNoZXMtb25lCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CQlicmFuY2ggJ29uZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CQlicmFuY2ggJ3R3bycgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtb25lX2JyYW5jaGVzLW9uZSBiL3QvdDU1MTUvZmV0Y2guYnItYnJhbmNoZXMtb25lX2JyYW5jaGVzLW9uZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODFmYTA5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1icmFuY2hlcy1vbmVfYnJhbmNoZXMtb25lCkBAIC0wLDAgKzEsOCBAQAorIyBici1icmFuY2hlcy1vbmUgYnJhbmNoZXMtb25lCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CQlicmFuY2ggJ29uZScgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWV4cGxpY2l0IGIvdC90NTUxNS9mZXRjaC5ici1jb25maWctZXhwbGljaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJmYTljOAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWV4cGxpY2l0CkBAIC0wLDAgKzEsMTEgQEAKKyMgYnItY29uZmlnLWV4cGxpY2l0Cis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici1jb25maWctZXhwbGljaXQtbWVyZ2UgYi90L3Q1NTE1L2ZldGNoLmJyLWNvbmZpZy1leHBsaWNpdC1tZXJnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzFhNzIzCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1jb25maWctZXhwbGljaXQtbWVyZ2UKQEAgLTAsMCArMSwxMSBAQAorIyBici1jb25maWctZXhwbGljaXQtbWVyZ2UKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLWNvbmZpZy1leHBsaWNpdC1tZXJnZV9jb25maWctZXhwbGljaXQgYi90L3Q1NTE1L2ZldGNoLmJyLWNvbmZpZy1leHBsaWNpdC1tZXJnZV9jb25maWctZXhwbGljaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRmNjg5MQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWV4cGxpY2l0LW1lcmdlX2NvbmZpZy1leHBsaWNpdApAQCAtMCwwICsxLDExIEBACisjIGJyLWNvbmZpZy1leHBsaWNpdC1tZXJnZSBjb25maWctZXhwbGljaXQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLWNvbmZpZy1leHBsaWNpdC1vY3RvcHVzIGIvdC90NTUxNS9mZXRjaC5ici1jb25maWctZXhwbGljaXQtb2N0b3B1cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDExZGZjCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1jb25maWctZXhwbGljaXQtb2N0b3B1cwpAQCAtMCwwICsxLDExIEBACisjIGJyLWNvbmZpZy1leHBsaWNpdC1vY3RvcHVzCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQkJYnJhbmNoICdvbmUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAkJYnJhbmNoICd0d28nIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLWNvbmZpZy1leHBsaWNpdC1vY3RvcHVzX2NvbmZpZy1leHBsaWNpdCBiL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWV4cGxpY2l0LW9jdG9wdXNfY29uZmlnLWV4cGxpY2l0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYWQ1MWYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLWNvbmZpZy1leHBsaWNpdC1vY3RvcHVzX2NvbmZpZy1leHBsaWNpdApAQCAtMCwwICsxLDExIEBACisjIGJyLWNvbmZpZy1leHBsaWNpdC1vY3RvcHVzIGNvbmZpZy1leHBsaWNpdAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJCWJyYW5jaCAnb25lJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJCWJyYW5jaCAndHdvJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici1jb25maWctZXhwbGljaXRfY29uZmlnLWV4cGxpY2l0IGIvdC90NTUxNS9mZXRjaC5ici1jb25maWctZXhwbGljaXRfY29uZmlnLWV4cGxpY2l0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMjM3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLWNvbmZpZy1leHBsaWNpdF9jb25maWctZXhwbGljaXQKQEAgLTAsMCArMSwxMSBAQAorIyBici1jb25maWctZXhwbGljaXQgY29uZmlnLWV4cGxpY2l0Cis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici1jb25maWctZ2xvYiBiL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWdsb2IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc1ZWMyZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWdsb2IKQEAgLTAsMCArMSwxMSBAQAorIyBici1jb25maWctZ2xvYgorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQlicmFuY2ggJ29uZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0aHJlZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0d28nIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLWNvbmZpZy1nbG9iLW1lcmdlIGIvdC90NTUxNS9mZXRjaC5ici1jb25maWctZ2xvYi1tZXJnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZThmNzM5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1jb25maWctZ2xvYi1tZXJnZQpAQCAtMCwwICsxLDExIEBACisjIGJyLWNvbmZpZy1nbG9iLW1lcmdlCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCWJyYW5jaCAnb25lJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici1jb25maWctZ2xvYi1tZXJnZV9jb25maWctZ2xvYiBiL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWdsb2ItbWVyZ2VfY29uZmlnLWdsb2IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxN2JlZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWdsb2ItbWVyZ2VfY29uZmlnLWdsb2IKQEAgLTAsMCArMSwxMSBAQAorIyBici1jb25maWctZ2xvYi1tZXJnZSBjb25maWctZ2xvYgorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQlicmFuY2ggJ29uZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQlicmFuY2ggJ3R3bycgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWdsb2Itb2N0b3B1cyBiL3QvdDU1MTUvZmV0Y2guYnItY29uZmlnLWdsb2Itb2N0b3B1cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzhlNTMyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1jb25maWctZ2xvYi1vY3RvcHVzCkBAIC0wLDAgKzEsMTEgQEAKKyMgYnItY29uZmlnLWdsb2Itb2N0b3B1cworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJCWJyYW5jaCAnb25lJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJCWJyYW5jaCAndHdvJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici1jb25maWctZ2xvYi1vY3RvcHVzX2NvbmZpZy1nbG9iIGIvdC90NTUxNS9mZXRjaC5ici1jb25maWctZ2xvYi1vY3RvcHVzX2NvbmZpZy1nbG9iCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MjI1YmYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLWNvbmZpZy1nbG9iLW9jdG9wdXNfY29uZmlnLWdsb2IKQEAgLTAsMCArMSwxMSBAQAorIyBici1jb25maWctZ2xvYi1vY3RvcHVzIGNvbmZpZy1nbG9iCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQkJYnJhbmNoICdvbmUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAkJYnJhbmNoICd0d28nIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLWNvbmZpZy1nbG9iX2NvbmZpZy1nbG9iIGIvdC90NTUxNS9mZXRjaC5ici1jb25maWctZ2xvYl9jb25maWctZ2xvYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmMyMGY5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1jb25maWctZ2xvYl9jb25maWctZ2xvYgpAQCAtMCwwICsxLDExIEBACisjIGJyLWNvbmZpZy1nbG9iIGNvbmZpZy1nbG9iCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCWJyYW5jaCAnb25lJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQlicmFuY2ggJ3R3bycgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItcmVtb3RlLWV4cGxpY2l0IGIvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZXhwbGljaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM1MzRkMgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItcmVtb3RlLWV4cGxpY2l0CkBAIC0wLDAgKzEsMTEgQEAKKyMgYnItcmVtb3RlLWV4cGxpY2l0Cis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZXhwbGljaXQtbWVyZ2UgYi90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1leHBsaWNpdC1tZXJnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTA2NGRkCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZXhwbGljaXQtbWVyZ2UKQEAgLTAsMCArMSwxMSBAQAorIyBici1yZW1vdGUtZXhwbGljaXQtbWVyZ2UKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1leHBsaWNpdC1tZXJnZV9yZW1vdGUtZXhwbGljaXQgYi90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1leHBsaWNpdC1tZXJnZV9yZW1vdGUtZXhwbGljaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMyYTM3ZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItcmVtb3RlLWV4cGxpY2l0LW1lcmdlX3JlbW90ZS1leHBsaWNpdApAQCAtMCwwICsxLDExIEBACisjIGJyLXJlbW90ZS1leHBsaWNpdC1tZXJnZSByZW1vdGUtZXhwbGljaXQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1leHBsaWNpdC1vY3RvcHVzIGIvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZXhwbGljaXQtb2N0b3B1cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2YwMjBkCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZXhwbGljaXQtb2N0b3B1cwpAQCAtMCwwICsxLDExIEBACisjIGJyLXJlbW90ZS1leHBsaWNpdC1vY3RvcHVzCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQkJYnJhbmNoICdvbmUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAkJYnJhbmNoICd0d28nIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1leHBsaWNpdC1vY3RvcHVzX3JlbW90ZS1leHBsaWNpdCBiL3QvdDU1MTUvZmV0Y2guYnItcmVtb3RlLWV4cGxpY2l0LW9jdG9wdXNfcmVtb3RlLWV4cGxpY2l0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNzc1MzEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1leHBsaWNpdC1vY3RvcHVzX3JlbW90ZS1leHBsaWNpdApAQCAtMCwwICsxLDExIEBACisjIGJyLXJlbW90ZS1leHBsaWNpdC1vY3RvcHVzIHJlbW90ZS1leHBsaWNpdAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJCWJyYW5jaCAnb25lJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJCWJyYW5jaCAndHdvJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZXhwbGljaXRfcmVtb3RlLWV4cGxpY2l0IGIvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZXhwbGljaXRfcmVtb3RlLWV4cGxpY2l0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZmFlNTYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1leHBsaWNpdF9yZW1vdGUtZXhwbGljaXQKQEAgLTAsMCArMSwxMSBAQAorIyBici1yZW1vdGUtZXhwbGljaXQgcmVtb3RlLWV4cGxpY2l0Cis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZ2xvYiBiL3QvdDU1MTUvZmV0Y2guYnItcmVtb3RlLWdsb2IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRlNmFkMwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItcmVtb3RlLWdsb2IKQEAgLTAsMCArMSwxMSBAQAorIyBici1yZW1vdGUtZ2xvYgorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQlicmFuY2ggJ29uZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0aHJlZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0d28nIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1nbG9iLW1lcmdlIGIvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZ2xvYi1tZXJnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTM2MmUyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZ2xvYi1tZXJnZQpAQCAtMCwwICsxLDExIEBACisjIGJyLXJlbW90ZS1nbG9iLW1lcmdlCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCWJyYW5jaCAnb25lJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZ2xvYi1tZXJnZV9yZW1vdGUtZ2xvYiBiL3QvdDU1MTUvZmV0Y2guYnItcmVtb3RlLWdsb2ItbWVyZ2VfcmVtb3RlLWdsb2IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJlYWJlYwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItcmVtb3RlLWdsb2ItbWVyZ2VfcmVtb3RlLWdsb2IKQEAgLTAsMCArMSwxMSBAQAorIyBici1yZW1vdGUtZ2xvYi1tZXJnZSByZW1vdGUtZ2xvYgorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQlicmFuY2ggJ29uZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQlicmFuY2ggJ3R3bycgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItcmVtb3RlLWdsb2Itb2N0b3B1cyBiL3QvdDU1MTUvZmV0Y2guYnItcmVtb3RlLWdsb2Itb2N0b3B1cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDhlMDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZ2xvYi1vY3RvcHVzCkBAIC0wLDAgKzEsMTEgQEAKKyMgYnItcmVtb3RlLWdsb2Itb2N0b3B1cworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJCWJyYW5jaCAnb25lJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJCWJyYW5jaCAndHdvJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZ2xvYi1vY3RvcHVzX3JlbW90ZS1nbG9iIGIvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZ2xvYi1vY3RvcHVzX3JlbW90ZS1nbG9iCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZDU0N2MKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1nbG9iLW9jdG9wdXNfcmVtb3RlLWdsb2IKQEAgLTAsMCArMSwxMSBAQAorIyBici1yZW1vdGUtZ2xvYi1vY3RvcHVzIHJlbW90ZS1nbG9iCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQkJYnJhbmNoICdvbmUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAkJYnJhbmNoICd0d28nIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLXJlbW90ZS1nbG9iX3JlbW90ZS1nbG9iIGIvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZ2xvYl9yZW1vdGUtZ2xvYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDZkYmM4Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici1yZW1vdGUtZ2xvYl9yZW1vdGUtZ2xvYgpAQCAtMCwwICsxLDExIEBACisjIGJyLXJlbW90ZS1nbG9iIHJlbW90ZS1nbG9iCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCWJyYW5jaCAnb25lJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQlicmFuY2ggJ3R3bycgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWcgYi90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1Y2U2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnCkBAIC0wLDAgKzEsMTEgQEAKKyMgYnItdW5jb25maWcKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici11bmNvbmZpZ18tLXRhZ3NfLi5fLmdpdCBiL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfLS10YWdzXy4uXy5naXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI1OGM4MAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfLS10YWdzXy4uXy5naXQKQEAgLTAsMCArMSw3IEBACisjIGJyLXVuY29uZmlnIC0tdGFncyAuLi8uZ2l0Cis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfLi5fLmdpdCBiL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfLi5fLmdpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODRiYjFmCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici11bmNvbmZpZ18uLl8uZ2l0CkBAIC0wLDAgKzEsMiBAQAorIyBici11bmNvbmZpZyAuLi8uZ2l0CiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCQkuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfLi5fLmdpdF9vbmUgYi90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnXy4uXy5naXRfb25lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZWI1YTYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnXy4uXy5naXRfb25lCkBAIC0wLDAgKzEsMiBAQAorIyBici11bmNvbmZpZyAuLi8uZ2l0IG9uZQorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQkJYnJhbmNoICdvbmUnIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici11bmNvbmZpZ18uLl8uZ2l0X29uZV90YWdfdGFnLW9uZV90YWdfdGFnLXRocmVlLWZpbGUgYi90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnXy4uXy5naXRfb25lX3RhZ190YWctb25lX3RhZ190YWctdGhyZWUtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDJiYWIyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici11bmNvbmZpZ18uLl8uZ2l0X29uZV90YWdfdGFnLW9uZV90YWdfdGFnLXRocmVlLWZpbGUKQEAgLTAsMCArMSw4IEBACisjIGJyLXVuY29uZmlnIC4uLy5naXQgb25lIHRhZyB0YWctb25lIHRhZyB0YWctdGhyZWUtZmlsZQorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQkJYnJhbmNoICdvbmUnIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQkJdGFnICd0YWctb25lJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfLi5fLmdpdF9vbmVfdHdvIGIvdC90NTUxNS9mZXRjaC5ici11bmNvbmZpZ18uLl8uZ2l0X29uZV90d28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YxYmUyMgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfLi5fLmdpdF9vbmVfdHdvCkBAIC0wLDAgKzEsMyBAQAorIyBici11bmNvbmZpZyAuLi8uZ2l0IG9uZSB0d28KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJCWJyYW5jaCAnb25lJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJCWJyYW5jaCAndHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfLi5fLmdpdF90YWdfdGFnLW9uZS10cmVlX3RhZ190YWctdGhyZWUtZmlsZSBiL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfLi5fLmdpdF90YWdfdGFnLW9uZS10cmVlX3RhZ190YWctdGhyZWUtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWRlNDExCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici11bmNvbmZpZ18uLl8uZ2l0X3RhZ190YWctb25lLXRyZWVfdGFnX3RhZy10aHJlZS1maWxlCkBAIC0wLDAgKzEsNyBAQAorIyBici11bmNvbmZpZyAuLi8uZ2l0IHRhZyB0YWctb25lLXRyZWUgdGFnIHRhZy10aHJlZS1maWxlCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfLi5fLmdpdF90YWdfdGFnLW9uZV90YWdfdGFnLXRocmVlIGIvdC90NTUxNS9mZXRjaC5ici11bmNvbmZpZ18uLl8uZ2l0X3RhZ190YWctb25lX3RhZ190YWctdGhyZWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRhMjMzNwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfLi5fLmdpdF90YWdfdGFnLW9uZV90YWdfdGFnLXRocmVlCkBAIC0wLDAgKzEsNyBAQAorIyBici11bmNvbmZpZyAuLi8uZ2l0IHRhZyB0YWctb25lIHRhZyB0YWctdGhyZWUKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJCXRhZyAndGFnLW9uZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfYnJhbmNoZXMtZGVmYXVsdCBiL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfYnJhbmNoZXMtZGVmYXVsdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzcwNDFlCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici11bmNvbmZpZ19icmFuY2hlcy1kZWZhdWx0CkBAIC0wLDAgKzEsOCBAQAorIyBici11bmNvbmZpZyBicmFuY2hlcy1kZWZhdWx0Cis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfYnJhbmNoZXMtb25lIGIvdC90NTUxNS9mZXRjaC5ici11bmNvbmZpZ19icmFuY2hlcy1vbmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk0Y2RlNwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfYnJhbmNoZXMtb25lCkBAIC0wLDAgKzEsOCBAQAorIyBici11bmNvbmZpZyBicmFuY2hlcy1vbmUKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJCWJyYW5jaCAnb25lJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici11bmNvbmZpZ19jb25maWctZXhwbGljaXQgYi90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnX2NvbmZpZy1leHBsaWNpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWEyODNlCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici11bmNvbmZpZ19jb25maWctZXhwbGljaXQKQEAgLTAsMCArMSwxMSBAQAorIyBici11bmNvbmZpZyBjb25maWctZXhwbGljaXQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQlicmFuY2ggJ29uZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0d28nIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLmJyLXVuY29uZmlnX2NvbmZpZy1nbG9iIGIvdC90NTUxNS9mZXRjaC5ici11bmNvbmZpZ19jb25maWctZ2xvYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTU1NmM1Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5ici11bmNvbmZpZ19jb25maWctZ2xvYgpAQCAtMCwwICsxLDExIEBACisjIGJyLXVuY29uZmlnIGNvbmZpZy1nbG9iCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCWJyYW5jaCAnb25lJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQlicmFuY2ggJ3R3bycgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfcmVtb3RlLWV4cGxpY2l0IGIvdC90NTUxNS9mZXRjaC5ici11bmNvbmZpZ19yZW1vdGUtZXhwbGljaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyMTZkZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfcmVtb3RlLWV4cGxpY2l0CkBAIC0wLDAgKzEsMTEgQEAKKyMgYnItdW5jb25maWcgcmVtb3RlLWV4cGxpY2l0Cis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCQlicmFuY2ggJ21hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICdvbmUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCWJyYW5jaCAndHdvJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQlicmFuY2ggJ3RocmVlJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZScgb2YgLi4vCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lLXRyZWUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5ici11bmNvbmZpZ19yZW1vdGUtZ2xvYiBiL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfcmVtb3RlLWdsb2IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlNjVjMgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2guYnItdW5jb25maWdfcmVtb3RlLWdsb2IKQEAgLTAsMCArMSwxMSBAQAorIyBici11bmNvbmZpZyByZW1vdGUtZ2xvYgorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQlicmFuY2ggJ29uZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0aHJlZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0d28nIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLm1hc3RlciBiL3QvdDU1MTUvZmV0Y2gubWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MGZkMDcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLm1hc3RlcgpAQCAtMCwwICsxLDExIEBACisjIG1hc3RlcgorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQlicmFuY2ggJ29uZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0aHJlZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0d28nIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLm1hc3Rlcl8tLXRhZ3NfLi5fLmdpdCBiL3QvdDU1MTUvZmV0Y2gubWFzdGVyXy0tdGFnc18uLl8uZ2l0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNTk5NTAKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLm1hc3Rlcl8tLXRhZ3NfLi5fLmdpdApAQCAtMCwwICsxLDcgQEAKKyMgbWFzdGVyIC0tdGFncyAuLi8uZ2l0Cis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2gubWFzdGVyXy4uXy5naXQgYi90L3Q1NTE1L2ZldGNoLm1hc3Rlcl8uLl8uZ2l0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZDFhYWQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLm1hc3Rlcl8uLl8uZ2l0CkBAIC0wLDAgKzEsMiBAQAorIyBtYXN0ZXIgLi4vLmdpdAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YgkJLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLm1hc3Rlcl8uLl8uZ2l0X29uZSBiL3QvdDU1MTUvZmV0Y2gubWFzdGVyXy4uXy5naXRfb25lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZGVkZGIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLm1hc3Rlcl8uLl8uZ2l0X29uZQpAQCAtMCwwICsxLDIgQEAKKyMgbWFzdGVyIC4uLy5naXQgb25lCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CQlicmFuY2ggJ29uZScgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLm1hc3Rlcl8uLl8uZ2l0X29uZV90YWdfdGFnLW9uZV90YWdfdGFnLXRocmVlLWZpbGUgYi90L3Q1NTE1L2ZldGNoLm1hc3Rlcl8uLl8uZ2l0X29uZV90YWdfdGFnLW9uZV90YWdfdGFnLXRocmVlLWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI4Njg1MgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2gubWFzdGVyXy4uXy5naXRfb25lX3RhZ190YWctb25lX3RhZ190YWctdGhyZWUtZmlsZQpAQCAtMCwwICsxLDggQEAKKyMgbWFzdGVyIC4uLy5naXQgb25lIHRhZyB0YWctb25lIHRhZyB0YWctdGhyZWUtZmlsZQorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQkJYnJhbmNoICdvbmUnIG9mIC4uLworOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQkJdGFnICd0YWctb25lJyBvZiAuLi8KKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZS1maWxlJyBvZiAuLi8KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1tYXN0ZXInIG9mIC4uLworMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYQlub3QtZm9yLW1lcmdlCXRhZyAndGFnLW9uZS10cmVlJyBvZiAuLi8KKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2gubWFzdGVyXy4uXy5naXRfb25lX3R3byBiL3QvdDU1MTUvZmV0Y2gubWFzdGVyXy4uXy5naXRfb25lX3R3bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWVjNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5tYXN0ZXJfLi5fLmdpdF9vbmVfdHdvCkBAIC0wLDAgKzEsMyBAQAorIyBtYXN0ZXIgLi4vLmdpdCBvbmUgdHdvCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CQlicmFuY2ggJ29uZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CQlicmFuY2ggJ3R3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLm1hc3Rlcl8uLl8uZ2l0X3RhZ190YWctb25lLXRyZWVfdGFnX3RhZy10aHJlZS1maWxlIGIvdC90NTUxNS9mZXRjaC5tYXN0ZXJfLi5fLmdpdF90YWdfdGFnLW9uZS10cmVlX3RhZ190YWctdGhyZWUtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTEzM2VmCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9mZXRjaC5tYXN0ZXJfLi5fLmdpdF90YWdfdGFnLW9uZS10cmVlX3RhZ190YWctdGhyZWUtZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMgbWFzdGVyIC4uLy5naXQgdGFnIHRhZy1vbmUtdHJlZSB0YWcgdGFnLXRocmVlLWZpbGUKKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUnIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlJyBvZiAuLi8KKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTgJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy10d28nIG9mIC4uLwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9mZXRjaC5tYXN0ZXJfLi5fLmdpdF90YWdfdGFnLW9uZV90YWdfdGFnLXRocmVlIGIvdC90NTUxNS9mZXRjaC5tYXN0ZXJfLi5fLmdpdF90YWdfdGFnLW9uZV90YWdfdGFnLXRocmVlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYjE4YjQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLm1hc3Rlcl8uLl8uZ2l0X3RhZ190YWctb25lX3RhZ190YWctdGhyZWUKQEAgLTAsMCArMSw3IEBACisjIG1hc3RlciAuLi8uZ2l0IHRhZyB0YWctb25lIHRhZyB0YWctdGhyZWUKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJCXRhZyAndGFnLW9uZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCQl0YWcgJ3RhZy10aHJlZScgb2YgLi4vCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctbWFzdGVyJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUtZmlsZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdHdvJyBvZiAuLi8KZGlmZiAtLWdpdCBhL3QvdDU1MTUvZmV0Y2gubWFzdGVyX2JyYW5jaGVzLWRlZmF1bHQgYi90L3Q1NTE1L2ZldGNoLm1hc3Rlcl9icmFuY2hlcy1kZWZhdWx0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwM2Q2ZDIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLm1hc3Rlcl9icmFuY2hlcy1kZWZhdWx0CkBAIC0wLDAgKzEsOCBAQAorIyBtYXN0ZXIgYnJhbmNoZXMtZGVmYXVsdAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZgkJYnJhbmNoICdtYXN0ZXInIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLm1hc3Rlcl9icmFuY2hlcy1vbmUgYi90L3Q1NTE1L2ZldGNoLm1hc3Rlcl9icmFuY2hlcy1vbmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU5YmIwYgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2gubWFzdGVyX2JyYW5jaGVzLW9uZQpAQCAtMCwwICsxLDggQEAKKyMgbWFzdGVyIGJyYW5jaGVzLW9uZQorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OQkJYnJhbmNoICdvbmUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLm1hc3Rlcl9jb25maWctZXhwbGljaXQgYi90L3Q1NTE1L2ZldGNoLm1hc3Rlcl9jb25maWctZXhwbGljaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlOTdjNwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2gubWFzdGVyX2NvbmZpZy1leHBsaWNpdApAQCAtMCwwICsxLDExIEBACisjIG1hc3RlciBjb25maWctZXhwbGljaXQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQlicmFuY2ggJ29uZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0d28nIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLm1hc3Rlcl9jb25maWctZ2xvYiBiL3QvdDU1MTUvZmV0Y2gubWFzdGVyX2NvbmZpZy1nbG9iCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMDcyNmYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLm1hc3Rlcl9jb25maWctZ2xvYgpAQCAtMCwwICsxLDExIEBACisjIG1hc3RlciBjb25maWctZ2xvYgorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQlicmFuY2ggJ29uZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0aHJlZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0d28nIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLm1hc3Rlcl9yZW1vdGUtZXhwbGljaXQgYi90L3Q1NTE1L2ZldGNoLm1hc3Rlcl9yZW1vdGUtZXhwbGljaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRhMWNhOAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvZmV0Y2gubWFzdGVyX3JlbW90ZS1leHBsaWNpdApAQCAtMCwwICsxLDExIEBACisjIG1hc3RlciByZW1vdGUtZXhwbGljaXQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYJCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQlicmFuY2ggJ29uZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0d28nIG9mIC4uLworMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2Yglub3QtZm9yLW1lcmdlCWJyYW5jaCAndGhyZWUnIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L2ZldGNoLm1hc3Rlcl9yZW1vdGUtZ2xvYiBiL3QvdDU1MTUvZmV0Y2gubWFzdGVyX3JlbW90ZS1nbG9iCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNGU4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L2ZldGNoLm1hc3Rlcl9yZW1vdGUtZ2xvYgpAQCAtMCwwICsxLDExIEBACisjIG1hc3RlciByZW1vdGUtZ2xvYgorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCWJyYW5jaCAnbWFzdGVyJyBvZiAuLi8KKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkJbm90LWZvci1tZXJnZQlicmFuY2ggJ29uZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0aHJlZScgb2YgLi4vCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4CW5vdC1mb3ItbWVyZ2UJYnJhbmNoICd0d28nIG9mIC4uLworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4Zglub3QtZm9yLW1lcmdlCXRhZyAndGFnLW1hc3Rlcicgb2YgLi4vCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5CW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctb25lJyBvZiAuLi8KKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEJbm90LWZvci1tZXJnZQl0YWcgJ3RhZy1vbmUtdHJlZScgb2YgLi4vCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiCW5vdC1mb3ItbWVyZ2UJdGFnICd0YWctdGhyZWUnIG9mIC4uLworMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5Ywlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXRocmVlLWZpbGUnIG9mIC4uLworNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOAlub3QtZm9yLW1lcmdlCXRhZyAndGFnLXR3bycgb2YgLi4vCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMuYnItYnJhbmNoZXMtZGVmYXVsdCBiL3QvdDU1MTUvcmVmcy5ici1icmFuY2hlcy1kZWZhdWx0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOTE3YzEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L3JlZnMuYnItYnJhbmNoZXMtZGVmYXVsdApAQCAtMCwwICsxLDEyIEBACis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvaGVhZHMvYnJhbmNoZXMtZGVmYXVsdAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bworNmM5ZGVjMmI5MjMyMjhjOWZmOTk0YzZjZmU0YWUxNmMxMjQwOGRjNSByZWZzL3RhZ3MvdGFnLW1hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3RhZ3MvdGFnLW9uZQorMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYSByZWZzL3RhZ3MvdGFnLW9uZS10cmVlCitjNjFhODJiNjA5NjcxODA1NDRlM2MxOWY4MTlkZGJkMGM5Zjg5ODk5IHJlZnMvdGFncy90YWctdGhyZWUKKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMgcmVmcy90YWdzL3RhZy10aHJlZS1maWxlCis1MjViN2ZiMDY4ZDU5OTUwZDE4NWE4Nzc5ZGM5NTdjNzdlZWQ3M2JhIHJlZnMvdGFncy90YWctdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMuYnItYnJhbmNoZXMtZGVmYXVsdC1tZXJnZSBiL3QvdDU1MTUvcmVmcy5ici1icmFuY2hlcy1kZWZhdWx0LW1lcmdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOTE3YzEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L3JlZnMuYnItYnJhbmNoZXMtZGVmYXVsdC1tZXJnZQpAQCAtMCwwICsxLDEyIEBACis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvaGVhZHMvYnJhbmNoZXMtZGVmYXVsdAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bworNmM5ZGVjMmI5MjMyMjhjOWZmOTk0YzZjZmU0YWUxNmMxMjQwOGRjNSByZWZzL3RhZ3MvdGFnLW1hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3RhZ3MvdGFnLW9uZQorMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYSByZWZzL3RhZ3MvdGFnLW9uZS10cmVlCitjNjFhODJiNjA5NjcxODA1NDRlM2MxOWY4MTlkZGJkMGM5Zjg5ODk5IHJlZnMvdGFncy90YWctdGhyZWUKKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMgcmVmcy90YWdzL3RhZy10aHJlZS1maWxlCis1MjViN2ZiMDY4ZDU5OTUwZDE4NWE4Nzc5ZGM5NTdjNzdlZWQ3M2JhIHJlZnMvdGFncy90YWctdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMuYnItYnJhbmNoZXMtZGVmYXVsdC1tZXJnZV9icmFuY2hlcy1kZWZhdWx0IGIvdC90NTUxNS9yZWZzLmJyLWJyYW5jaGVzLWRlZmF1bHQtbWVyZ2VfYnJhbmNoZXMtZGVmYXVsdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTkxN2MxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9yZWZzLmJyLWJyYW5jaGVzLWRlZmF1bHQtbWVyZ2VfYnJhbmNoZXMtZGVmYXVsdApAQCAtMCwwICsxLDEyIEBACis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvaGVhZHMvYnJhbmNoZXMtZGVmYXVsdAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bworNmM5ZGVjMmI5MjMyMjhjOWZmOTk0YzZjZmU0YWUxNmMxMjQwOGRjNSByZWZzL3RhZ3MvdGFnLW1hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3RhZ3MvdGFnLW9uZQorMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYSByZWZzL3RhZ3MvdGFnLW9uZS10cmVlCitjNjFhODJiNjA5NjcxODA1NDRlM2MxOWY4MTlkZGJkMGM5Zjg5ODk5IHJlZnMvdGFncy90YWctdGhyZWUKKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMgcmVmcy90YWdzL3RhZy10aHJlZS1maWxlCis1MjViN2ZiMDY4ZDU5OTUwZDE4NWE4Nzc5ZGM5NTdjNzdlZWQ3M2JhIHJlZnMvdGFncy90YWctdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMuYnItYnJhbmNoZXMtZGVmYXVsdC1vY3RvcHVzIGIvdC90NTUxNS9yZWZzLmJyLWJyYW5jaGVzLWRlZmF1bHQtb2N0b3B1cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTkxN2MxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9yZWZzLmJyLWJyYW5jaGVzLWRlZmF1bHQtb2N0b3B1cwpAQCAtMCwwICsxLDEyIEBACis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvaGVhZHMvYnJhbmNoZXMtZGVmYXVsdAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bworNmM5ZGVjMmI5MjMyMjhjOWZmOTk0YzZjZmU0YWUxNmMxMjQwOGRjNSByZWZzL3RhZ3MvdGFnLW1hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3RhZ3MvdGFnLW9uZQorMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYSByZWZzL3RhZ3MvdGFnLW9uZS10cmVlCitjNjFhODJiNjA5NjcxODA1NDRlM2MxOWY4MTlkZGJkMGM5Zjg5ODk5IHJlZnMvdGFncy90YWctdGhyZWUKKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMgcmVmcy90YWdzL3RhZy10aHJlZS1maWxlCis1MjViN2ZiMDY4ZDU5OTUwZDE4NWE4Nzc5ZGM5NTdjNzdlZWQ3M2JhIHJlZnMvdGFncy90YWctdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMuYnItYnJhbmNoZXMtZGVmYXVsdC1vY3RvcHVzX2JyYW5jaGVzLWRlZmF1bHQgYi90L3Q1NTE1L3JlZnMuYnItYnJhbmNoZXMtZGVmYXVsdC1vY3RvcHVzX2JyYW5jaGVzLWRlZmF1bHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE5MTdjMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5ici1icmFuY2hlcy1kZWZhdWx0LW9jdG9wdXNfYnJhbmNoZXMtZGVmYXVsdApAQCAtMCwwICsxLDEyIEBACis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvaGVhZHMvYnJhbmNoZXMtZGVmYXVsdAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bworNmM5ZGVjMmI5MjMyMjhjOWZmOTk0YzZjZmU0YWUxNmMxMjQwOGRjNSByZWZzL3RhZ3MvdGFnLW1hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3RhZ3MvdGFnLW9uZQorMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYSByZWZzL3RhZ3MvdGFnLW9uZS10cmVlCitjNjFhODJiNjA5NjcxODA1NDRlM2MxOWY4MTlkZGJkMGM5Zjg5ODk5IHJlZnMvdGFncy90YWctdGhyZWUKKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMgcmVmcy90YWdzL3RhZy10aHJlZS1maWxlCis1MjViN2ZiMDY4ZDU5OTUwZDE4NWE4Nzc5ZGM5NTdjNzdlZWQ3M2JhIHJlZnMvdGFncy90YWctdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMuYnItYnJhbmNoZXMtZGVmYXVsdF9icmFuY2hlcy1kZWZhdWx0IGIvdC90NTUxNS9yZWZzLmJyLWJyYW5jaGVzLWRlZmF1bHRfYnJhbmNoZXMtZGVmYXVsdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTkxN2MxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9yZWZzLmJyLWJyYW5jaGVzLWRlZmF1bHRfYnJhbmNoZXMtZGVmYXVsdApAQCAtMCwwICsxLDEyIEBACis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvaGVhZHMvYnJhbmNoZXMtZGVmYXVsdAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bworNmM5ZGVjMmI5MjMyMjhjOWZmOTk0YzZjZmU0YWUxNmMxMjQwOGRjNSByZWZzL3RhZ3MvdGFnLW1hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3RhZ3MvdGFnLW9uZQorMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYSByZWZzL3RhZ3MvdGFnLW9uZS10cmVlCitjNjFhODJiNjA5NjcxODA1NDRlM2MxOWY4MTlkZGJkMGM5Zjg5ODk5IHJlZnMvdGFncy90YWctdGhyZWUKKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMgcmVmcy90YWdzL3RhZy10aHJlZS1maWxlCis1MjViN2ZiMDY4ZDU5OTUwZDE4NWE4Nzc5ZGM5NTdjNzdlZWQ3M2JhIHJlZnMvdGFncy90YWctdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMuYnItYnJhbmNoZXMtb25lIGIvdC90NTUxNS9yZWZzLmJyLWJyYW5jaGVzLW9uZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTcwNWE1Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9yZWZzLmJyLWJyYW5jaGVzLW9uZQpAQCAtMCwwICsxLDEyIEBACis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvaGVhZHMvYnJhbmNoZXMtb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvb3JpZ2luL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9vcmlnaW4vdHdvCis2YzlkZWMyYjkyMzIyOGM5ZmY5OTRjNmNmZTRhZTE2YzEyNDA4ZGM1IHJlZnMvdGFncy90YWctbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvdGFncy90YWctb25lCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhIHJlZnMvdGFncy90YWctb25lLXRyZWUKK2M2MWE4MmI2MDk2NzE4MDU0NGUzYzE5ZjgxOWRkYmQwYzlmODk4OTkgcmVmcy90YWdzL3RhZy10aHJlZQorMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5YyByZWZzL3RhZ3MvdGFnLXRocmVlLWZpbGUKKzUyNWI3ZmIwNjhkNTk5NTBkMTg1YTg3NzlkYzk1N2M3N2VlZDczYmEgcmVmcy90YWdzL3RhZy10d28KZGlmZiAtLWdpdCBhL3QvdDU1MTUvcmVmcy5ici1icmFuY2hlcy1vbmUtbWVyZ2UgYi90L3Q1NTE1L3JlZnMuYnItYnJhbmNoZXMtb25lLW1lcmdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNzA1YTUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L3JlZnMuYnItYnJhbmNoZXMtb25lLW1lcmdlCkBAIC0wLDAgKzEsMTIgQEAKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9oZWFkcy9icmFuY2hlcy1vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi9IRUFECis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL29yaWdpbi90d28KKzZjOWRlYzJiOTIzMjI4YzlmZjk5NGM2Y2ZlNGFlMTZjMTI0MDhkYzUgcmVmcy90YWdzL3RhZy1tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy90YWdzL3RhZy1vbmUKKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEgcmVmcy90YWdzL3RhZy1vbmUtdHJlZQorYzYxYTgyYjYwOTY3MTgwNTQ0ZTNjMTlmODE5ZGRiZDBjOWY4OTg5OSByZWZzL3RhZ3MvdGFnLXRocmVlCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljIHJlZnMvdGFncy90YWctdGhyZWUtZmlsZQorNTI1YjdmYjA2OGQ1OTk1MGQxODVhODc3OWRjOTU3Yzc3ZWVkNzNiYSByZWZzL3RhZ3MvdGFnLXR3bwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9yZWZzLmJyLWJyYW5jaGVzLW9uZS1tZXJnZV9icmFuY2hlcy1vbmUgYi90L3Q1NTE1L3JlZnMuYnItYnJhbmNoZXMtb25lLW1lcmdlX2JyYW5jaGVzLW9uZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTcwNWE1Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9yZWZzLmJyLWJyYW5jaGVzLW9uZS1tZXJnZV9icmFuY2hlcy1vbmUKQEAgLTAsMCArMSwxMiBAQAorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL2hlYWRzL2JyYW5jaGVzLW9uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bworNmM5ZGVjMmI5MjMyMjhjOWZmOTk0YzZjZmU0YWUxNmMxMjQwOGRjNSByZWZzL3RhZ3MvdGFnLW1hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3RhZ3MvdGFnLW9uZQorMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYSByZWZzL3RhZ3MvdGFnLW9uZS10cmVlCitjNjFhODJiNjA5NjcxODA1NDRlM2MxOWY4MTlkZGJkMGM5Zjg5ODk5IHJlZnMvdGFncy90YWctdGhyZWUKKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMgcmVmcy90YWdzL3RhZy10aHJlZS1maWxlCis1MjViN2ZiMDY4ZDU5OTUwZDE4NWE4Nzc5ZGM5NTdjNzdlZWQ3M2JhIHJlZnMvdGFncy90YWctdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMuYnItYnJhbmNoZXMtb25lLW9jdG9wdXMgYi90L3Q1NTE1L3JlZnMuYnItYnJhbmNoZXMtb25lLW9jdG9wdXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE3MDVhNQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5ici1icmFuY2hlcy1vbmUtb2N0b3B1cwpAQCAtMCwwICsxLDEyIEBACis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvaGVhZHMvYnJhbmNoZXMtb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvb3JpZ2luL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9vcmlnaW4vdHdvCis2YzlkZWMyYjkyMzIyOGM5ZmY5OTRjNmNmZTRhZTE2YzEyNDA4ZGM1IHJlZnMvdGFncy90YWctbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvdGFncy90YWctb25lCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhIHJlZnMvdGFncy90YWctb25lLXRyZWUKK2M2MWE4MmI2MDk2NzE4MDU0NGUzYzE5ZjgxOWRkYmQwYzlmODk4OTkgcmVmcy90YWdzL3RhZy10aHJlZQorMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5YyByZWZzL3RhZ3MvdGFnLXRocmVlLWZpbGUKKzUyNWI3ZmIwNjhkNTk5NTBkMTg1YTg3NzlkYzk1N2M3N2VlZDczYmEgcmVmcy90YWdzL3RhZy10d28KZGlmZiAtLWdpdCBhL3QvdDU1MTUvcmVmcy5ici1icmFuY2hlcy1vbmUtb2N0b3B1c19icmFuY2hlcy1vbmUgYi90L3Q1NTE1L3JlZnMuYnItYnJhbmNoZXMtb25lLW9jdG9wdXNfYnJhbmNoZXMtb25lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNzA1YTUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L3JlZnMuYnItYnJhbmNoZXMtb25lLW9jdG9wdXNfYnJhbmNoZXMtb25lCkBAIC0wLDAgKzEsMTIgQEAKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9oZWFkcy9icmFuY2hlcy1vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi9IRUFECis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL29yaWdpbi90d28KKzZjOWRlYzJiOTIzMjI4YzlmZjk5NGM2Y2ZlNGFlMTZjMTI0MDhkYzUgcmVmcy90YWdzL3RhZy1tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy90YWdzL3RhZy1vbmUKKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEgcmVmcy90YWdzL3RhZy1vbmUtdHJlZQorYzYxYTgyYjYwOTY3MTgwNTQ0ZTNjMTlmODE5ZGRiZDBjOWY4OTg5OSByZWZzL3RhZ3MvdGFnLXRocmVlCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljIHJlZnMvdGFncy90YWctdGhyZWUtZmlsZQorNTI1YjdmYjA2OGQ1OTk1MGQxODVhODc3OWRjOTU3Yzc3ZWVkNzNiYSByZWZzL3RhZ3MvdGFnLXR3bwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9yZWZzLmJyLWJyYW5jaGVzLW9uZV9icmFuY2hlcy1vbmUgYi90L3Q1NTE1L3JlZnMuYnItYnJhbmNoZXMtb25lX2JyYW5jaGVzLW9uZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTcwNWE1Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9yZWZzLmJyLWJyYW5jaGVzLW9uZV9icmFuY2hlcy1vbmUKQEAgLTAsMCArMSwxMiBAQAorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL2hlYWRzL2JyYW5jaGVzLW9uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bworNmM5ZGVjMmI5MjMyMjhjOWZmOTk0YzZjZmU0YWUxNmMxMjQwOGRjNSByZWZzL3RhZ3MvdGFnLW1hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3RhZ3MvdGFnLW9uZQorMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYSByZWZzL3RhZ3MvdGFnLW9uZS10cmVlCitjNjFhODJiNjA5NjcxODA1NDRlM2MxOWY4MTlkZGJkMGM5Zjg5ODk5IHJlZnMvdGFncy90YWctdGhyZWUKKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMgcmVmcy90YWdzL3RhZy10aHJlZS1maWxlCis1MjViN2ZiMDY4ZDU5OTUwZDE4NWE4Nzc5ZGM5NTdjNzdlZWQ3M2JhIHJlZnMvdGFncy90YWctdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMuYnItY29uZmlnLWV4cGxpY2l0IGIvdC90NTUxNS9yZWZzLmJyLWNvbmZpZy1leHBsaWNpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmJiZmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9yZWZzLmJyLWNvbmZpZy1leHBsaWNpdApAQCAtMCwwICsxLDE1IEBACiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvb3JpZ2luL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9vcmlnaW4vdHdvCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9yZW0vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9yZW0vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9yZW0vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL3JlbS90d28KKzZjOWRlYzJiOTIzMjI4YzlmZjk5NGM2Y2ZlNGFlMTZjMTI0MDhkYzUgcmVmcy90YWdzL3RhZy1tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy90YWdzL3RhZy1vbmUKKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEgcmVmcy90YWdzL3RhZy1vbmUtdHJlZQorYzYxYTgyYjYwOTY3MTgwNTQ0ZTNjMTlmODE5ZGRiZDBjOWY4OTg5OSByZWZzL3RhZ3MvdGFnLXRocmVlCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljIHJlZnMvdGFncy90YWctdGhyZWUtZmlsZQorNTI1YjdmYjA2OGQ1OTk1MGQxODVhODc3OWRjOTU3Yzc3ZWVkNzNiYSByZWZzL3RhZ3MvdGFnLXR3bwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9yZWZzLmJyLWNvbmZpZy1leHBsaWNpdC1tZXJnZSBiL3QvdDU1MTUvcmVmcy5ici1jb25maWctZXhwbGljaXQtbWVyZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiYmZkOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5ici1jb25maWctZXhwbGljaXQtbWVyZ2UKQEAgLTAsMCArMSwxNSBAQAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvcmVtL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvcmVtL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvcmVtL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9yZW0vdHdvCis2YzlkZWMyYjkyMzIyOGM5ZmY5OTRjNmNmZTRhZTE2YzEyNDA4ZGM1IHJlZnMvdGFncy90YWctbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvdGFncy90YWctb25lCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhIHJlZnMvdGFncy90YWctb25lLXRyZWUKK2M2MWE4MmI2MDk2NzE4MDU0NGUzYzE5ZjgxOWRkYmQwYzlmODk4OTkgcmVmcy90YWdzL3RhZy10aHJlZQorMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5YyByZWZzL3RhZ3MvdGFnLXRocmVlLWZpbGUKKzUyNWI3ZmIwNjhkNTk5NTBkMTg1YTg3NzlkYzk1N2M3N2VlZDczYmEgcmVmcy90YWdzL3RhZy10d28KZGlmZiAtLWdpdCBhL3QvdDU1MTUvcmVmcy5ici1jb25maWctZXhwbGljaXQtbWVyZ2VfY29uZmlnLWV4cGxpY2l0IGIvdC90NTUxNS9yZWZzLmJyLWNvbmZpZy1leHBsaWNpdC1tZXJnZV9jb25maWctZXhwbGljaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiYmZkOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5ici1jb25maWctZXhwbGljaXQtbWVyZ2VfY29uZmlnLWV4cGxpY2l0CkBAIC0wLDAgKzEsMTUgQEAKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi9IRUFECis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL29yaWdpbi90d28KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL3JlbS9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL3JlbS9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL3JlbS90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvcmVtL3R3bworNmM5ZGVjMmI5MjMyMjhjOWZmOTk0YzZjZmU0YWUxNmMxMjQwOGRjNSByZWZzL3RhZ3MvdGFnLW1hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3RhZ3MvdGFnLW9uZQorMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYSByZWZzL3RhZ3MvdGFnLW9uZS10cmVlCitjNjFhODJiNjA5NjcxODA1NDRlM2MxOWY4MTlkZGJkMGM5Zjg5ODk5IHJlZnMvdGFncy90YWctdGhyZWUKKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMgcmVmcy90YWdzL3RhZy10aHJlZS1maWxlCis1MjViN2ZiMDY4ZDU5OTUwZDE4NWE4Nzc5ZGM5NTdjNzdlZWQ3M2JhIHJlZnMvdGFncy90YWctdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMuYnItY29uZmlnLWV4cGxpY2l0LW9jdG9wdXMgYi90L3Q1NTE1L3JlZnMuYnItY29uZmlnLWV4cGxpY2l0LW9jdG9wdXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiYmZkOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5ici1jb25maWctZXhwbGljaXQtb2N0b3B1cwpAQCAtMCwwICsxLDE1IEBACiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvb3JpZ2luL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9vcmlnaW4vdHdvCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9yZW0vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9yZW0vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9yZW0vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL3JlbS90d28KKzZjOWRlYzJiOTIzMjI4YzlmZjk5NGM2Y2ZlNGFlMTZjMTI0MDhkYzUgcmVmcy90YWdzL3RhZy1tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy90YWdzL3RhZy1vbmUKKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEgcmVmcy90YWdzL3RhZy1vbmUtdHJlZQorYzYxYTgyYjYwOTY3MTgwNTQ0ZTNjMTlmODE5ZGRiZDBjOWY4OTg5OSByZWZzL3RhZ3MvdGFnLXRocmVlCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljIHJlZnMvdGFncy90YWctdGhyZWUtZmlsZQorNTI1YjdmYjA2OGQ1OTk1MGQxODVhODc3OWRjOTU3Yzc3ZWVkNzNiYSByZWZzL3RhZ3MvdGFnLXR3bwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9yZWZzLmJyLWNvbmZpZy1leHBsaWNpdC1vY3RvcHVzX2NvbmZpZy1leHBsaWNpdCBiL3QvdDU1MTUvcmVmcy5ici1jb25maWctZXhwbGljaXQtb2N0b3B1c19jb25maWctZXhwbGljaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiYmZkOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5ici1jb25maWctZXhwbGljaXQtb2N0b3B1c19jb25maWctZXhwbGljaXQKQEAgLTAsMCArMSwxNSBAQAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvcmVtL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvcmVtL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvcmVtL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9yZW0vdHdvCis2YzlkZWMyYjkyMzIyOGM5ZmY5OTRjNmNmZTRhZTE2YzEyNDA4ZGM1IHJlZnMvdGFncy90YWctbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvdGFncy90YWctb25lCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhIHJlZnMvdGFncy90YWctb25lLXRyZWUKK2M2MWE4MmI2MDk2NzE4MDU0NGUzYzE5ZjgxOWRkYmQwYzlmODk4OTkgcmVmcy90YWdzL3RhZy10aHJlZQorMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5YyByZWZzL3RhZ3MvdGFnLXRocmVlLWZpbGUKKzUyNWI3ZmIwNjhkNTk5NTBkMTg1YTg3NzlkYzk1N2M3N2VlZDczYmEgcmVmcy90YWdzL3RhZy10d28KZGlmZiAtLWdpdCBhL3QvdDU1MTUvcmVmcy5ici1jb25maWctZXhwbGljaXRfY29uZmlnLWV4cGxpY2l0IGIvdC90NTUxNS9yZWZzLmJyLWNvbmZpZy1leHBsaWNpdF9jb25maWctZXhwbGljaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiYmZkOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5ici1jb25maWctZXhwbGljaXRfY29uZmlnLWV4cGxpY2l0CkBAIC0wLDAgKzEsMTUgQEAKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi9IRUFECis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL29yaWdpbi90d28KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL3JlbS9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL3JlbS9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL3JlbS90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvcmVtL3R3bworNmM5ZGVjMmI5MjMyMjhjOWZmOTk0YzZjZmU0YWUxNmMxMjQwOGRjNSByZWZzL3RhZ3MvdGFnLW1hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3RhZ3MvdGFnLW9uZQorMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYSByZWZzL3RhZ3MvdGFnLW9uZS10cmVlCitjNjFhODJiNjA5NjcxODA1NDRlM2MxOWY4MTlkZGJkMGM5Zjg5ODk5IHJlZnMvdGFncy90YWctdGhyZWUKKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMgcmVmcy90YWdzL3RhZy10aHJlZS1maWxlCis1MjViN2ZiMDY4ZDU5OTUwZDE4NWE4Nzc5ZGM5NTdjNzdlZWQ3M2JhIHJlZnMvdGFncy90YWctdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMuYnItY29uZmlnLWdsb2IgYi90L3Q1NTE1L3JlZnMuYnItY29uZmlnLWdsb2IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiYmZkOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5ici1jb25maWctZ2xvYgpAQCAtMCwwICsxLDE1IEBACiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvb3JpZ2luL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9vcmlnaW4vdHdvCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9yZW0vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9yZW0vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9yZW0vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL3JlbS90d28KKzZjOWRlYzJiOTIzMjI4YzlmZjk5NGM2Y2ZlNGFlMTZjMTI0MDhkYzUgcmVmcy90YWdzL3RhZy1tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy90YWdzL3RhZy1vbmUKKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEgcmVmcy90YWdzL3RhZy1vbmUtdHJlZQorYzYxYTgyYjYwOTY3MTgwNTQ0ZTNjMTlmODE5ZGRiZDBjOWY4OTg5OSByZWZzL3RhZ3MvdGFnLXRocmVlCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljIHJlZnMvdGFncy90YWctdGhyZWUtZmlsZQorNTI1YjdmYjA2OGQ1OTk1MGQxODVhODc3OWRjOTU3Yzc3ZWVkNzNiYSByZWZzL3RhZ3MvdGFnLXR3bwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9yZWZzLmJyLWNvbmZpZy1nbG9iLW1lcmdlIGIvdC90NTUxNS9yZWZzLmJyLWNvbmZpZy1nbG9iLW1lcmdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYmJmZDkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L3JlZnMuYnItY29uZmlnLWdsb2ItbWVyZ2UKQEAgLTAsMCArMSwxNSBAQAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvcmVtL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvcmVtL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvcmVtL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9yZW0vdHdvCis2YzlkZWMyYjkyMzIyOGM5ZmY5OTRjNmNmZTRhZTE2YzEyNDA4ZGM1IHJlZnMvdGFncy90YWctbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvdGFncy90YWctb25lCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhIHJlZnMvdGFncy90YWctb25lLXRyZWUKK2M2MWE4MmI2MDk2NzE4MDU0NGUzYzE5ZjgxOWRkYmQwYzlmODk4OTkgcmVmcy90YWdzL3RhZy10aHJlZQorMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5YyByZWZzL3RhZ3MvdGFnLXRocmVlLWZpbGUKKzUyNWI3ZmIwNjhkNTk5NTBkMTg1YTg3NzlkYzk1N2M3N2VlZDczYmEgcmVmcy90YWdzL3RhZy10d28KZGlmZiAtLWdpdCBhL3QvdDU1MTUvcmVmcy5ici1jb25maWctZ2xvYi1tZXJnZV9jb25maWctZ2xvYiBiL3QvdDU1MTUvcmVmcy5ici1jb25maWctZ2xvYi1tZXJnZV9jb25maWctZ2xvYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmJiZmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9yZWZzLmJyLWNvbmZpZy1nbG9iLW1lcmdlX2NvbmZpZy1nbG9iCkBAIC0wLDAgKzEsMTUgQEAKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi9IRUFECis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL29yaWdpbi90d28KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL3JlbS9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL3JlbS9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL3JlbS90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvcmVtL3R3bworNmM5ZGVjMmI5MjMyMjhjOWZmOTk0YzZjZmU0YWUxNmMxMjQwOGRjNSByZWZzL3RhZ3MvdGFnLW1hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3RhZ3MvdGFnLW9uZQorMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYSByZWZzL3RhZ3MvdGFnLW9uZS10cmVlCitjNjFhODJiNjA5NjcxODA1NDRlM2MxOWY4MTlkZGJkMGM5Zjg5ODk5IHJlZnMvdGFncy90YWctdGhyZWUKKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMgcmVmcy90YWdzL3RhZy10aHJlZS1maWxlCis1MjViN2ZiMDY4ZDU5OTUwZDE4NWE4Nzc5ZGM5NTdjNzdlZWQ3M2JhIHJlZnMvdGFncy90YWctdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMuYnItY29uZmlnLWdsb2Itb2N0b3B1cyBiL3QvdDU1MTUvcmVmcy5ici1jb25maWctZ2xvYi1vY3RvcHVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYmJmZDkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L3JlZnMuYnItY29uZmlnLWdsb2Itb2N0b3B1cwpAQCAtMCwwICsxLDE1IEBACiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvb3JpZ2luL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9vcmlnaW4vdHdvCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9yZW0vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9yZW0vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9yZW0vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL3JlbS90d28KKzZjOWRlYzJiOTIzMjI4YzlmZjk5NGM2Y2ZlNGFlMTZjMTI0MDhkYzUgcmVmcy90YWdzL3RhZy1tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy90YWdzL3RhZy1vbmUKKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEgcmVmcy90YWdzL3RhZy1vbmUtdHJlZQorYzYxYTgyYjYwOTY3MTgwNTQ0ZTNjMTlmODE5ZGRiZDBjOWY4OTg5OSByZWZzL3RhZ3MvdGFnLXRocmVlCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljIHJlZnMvdGFncy90YWctdGhyZWUtZmlsZQorNTI1YjdmYjA2OGQ1OTk1MGQxODVhODc3OWRjOTU3Yzc3ZWVkNzNiYSByZWZzL3RhZ3MvdGFnLXR3bwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9yZWZzLmJyLWNvbmZpZy1nbG9iLW9jdG9wdXNfY29uZmlnLWdsb2IgYi90L3Q1NTE1L3JlZnMuYnItY29uZmlnLWdsb2Itb2N0b3B1c19jb25maWctZ2xvYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmJiZmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9yZWZzLmJyLWNvbmZpZy1nbG9iLW9jdG9wdXNfY29uZmlnLWdsb2IKQEAgLTAsMCArMSwxNSBAQAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvcmVtL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvcmVtL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvcmVtL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9yZW0vdHdvCis2YzlkZWMyYjkyMzIyOGM5ZmY5OTRjNmNmZTRhZTE2YzEyNDA4ZGM1IHJlZnMvdGFncy90YWctbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvdGFncy90YWctb25lCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhIHJlZnMvdGFncy90YWctb25lLXRyZWUKK2M2MWE4MmI2MDk2NzE4MDU0NGUzYzE5ZjgxOWRkYmQwYzlmODk4OTkgcmVmcy90YWdzL3RhZy10aHJlZQorMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5YyByZWZzL3RhZ3MvdGFnLXRocmVlLWZpbGUKKzUyNWI3ZmIwNjhkNTk5NTBkMTg1YTg3NzlkYzk1N2M3N2VlZDczYmEgcmVmcy90YWdzL3RhZy10d28KZGlmZiAtLWdpdCBhL3QvdDU1MTUvcmVmcy5ici1jb25maWctZ2xvYl9jb25maWctZ2xvYiBiL3QvdDU1MTUvcmVmcy5ici1jb25maWctZ2xvYl9jb25maWctZ2xvYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmJiZmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9yZWZzLmJyLWNvbmZpZy1nbG9iX2NvbmZpZy1nbG9iCkBAIC0wLDAgKzEsMTUgQEAKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi9IRUFECis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL29yaWdpbi90d28KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL3JlbS9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL3JlbS9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL3JlbS90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvcmVtL3R3bworNmM5ZGVjMmI5MjMyMjhjOWZmOTk0YzZjZmU0YWUxNmMxMjQwOGRjNSByZWZzL3RhZ3MvdGFnLW1hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3RhZ3MvdGFnLW9uZQorMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYSByZWZzL3RhZ3MvdGFnLW9uZS10cmVlCitjNjFhODJiNjA5NjcxODA1NDRlM2MxOWY4MTlkZGJkMGM5Zjg5ODk5IHJlZnMvdGFncy90YWctdGhyZWUKKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMgcmVmcy90YWdzL3RhZy10aHJlZS1maWxlCis1MjViN2ZiMDY4ZDU5OTUwZDE4NWE4Nzc5ZGM5NTdjNzdlZWQ3M2JhIHJlZnMvdGFncy90YWctdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMuYnItcmVtb3RlLWV4cGxpY2l0IGIvdC90NTUxNS9yZWZzLmJyLXJlbW90ZS1leHBsaWNpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmJiZmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9yZWZzLmJyLXJlbW90ZS1leHBsaWNpdApAQCAtMCwwICsxLDE1IEBACiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvb3JpZ2luL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9vcmlnaW4vdHdvCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9yZW0vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9yZW0vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9yZW0vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL3JlbS90d28KKzZjOWRlYzJiOTIzMjI4YzlmZjk5NGM2Y2ZlNGFlMTZjMTI0MDhkYzUgcmVmcy90YWdzL3RhZy1tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy90YWdzL3RhZy1vbmUKKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEgcmVmcy90YWdzL3RhZy1vbmUtdHJlZQorYzYxYTgyYjYwOTY3MTgwNTQ0ZTNjMTlmODE5ZGRiZDBjOWY4OTg5OSByZWZzL3RhZ3MvdGFnLXRocmVlCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljIHJlZnMvdGFncy90YWctdGhyZWUtZmlsZQorNTI1YjdmYjA2OGQ1OTk1MGQxODVhODc3OWRjOTU3Yzc3ZWVkNzNiYSByZWZzL3RhZ3MvdGFnLXR3bwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9yZWZzLmJyLXJlbW90ZS1leHBsaWNpdC1tZXJnZSBiL3QvdDU1MTUvcmVmcy5ici1yZW1vdGUtZXhwbGljaXQtbWVyZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiYmZkOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5ici1yZW1vdGUtZXhwbGljaXQtbWVyZ2UKQEAgLTAsMCArMSwxNSBAQAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvcmVtL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvcmVtL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvcmVtL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9yZW0vdHdvCis2YzlkZWMyYjkyMzIyOGM5ZmY5OTRjNmNmZTRhZTE2YzEyNDA4ZGM1IHJlZnMvdGFncy90YWctbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvdGFncy90YWctb25lCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhIHJlZnMvdGFncy90YWctb25lLXRyZWUKK2M2MWE4MmI2MDk2NzE4MDU0NGUzYzE5ZjgxOWRkYmQwYzlmODk4OTkgcmVmcy90YWdzL3RhZy10aHJlZQorMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5YyByZWZzL3RhZ3MvdGFnLXRocmVlLWZpbGUKKzUyNWI3ZmIwNjhkNTk5NTBkMTg1YTg3NzlkYzk1N2M3N2VlZDczYmEgcmVmcy90YWdzL3RhZy10d28KZGlmZiAtLWdpdCBhL3QvdDU1MTUvcmVmcy5ici1yZW1vdGUtZXhwbGljaXQtbWVyZ2VfcmVtb3RlLWV4cGxpY2l0IGIvdC90NTUxNS9yZWZzLmJyLXJlbW90ZS1leHBsaWNpdC1tZXJnZV9yZW1vdGUtZXhwbGljaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiYmZkOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5ici1yZW1vdGUtZXhwbGljaXQtbWVyZ2VfcmVtb3RlLWV4cGxpY2l0CkBAIC0wLDAgKzEsMTUgQEAKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi9IRUFECis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL29yaWdpbi90d28KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL3JlbS9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL3JlbS9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL3JlbS90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvcmVtL3R3bworNmM5ZGVjMmI5MjMyMjhjOWZmOTk0YzZjZmU0YWUxNmMxMjQwOGRjNSByZWZzL3RhZ3MvdGFnLW1hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3RhZ3MvdGFnLW9uZQorMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYSByZWZzL3RhZ3MvdGFnLW9uZS10cmVlCitjNjFhODJiNjA5NjcxODA1NDRlM2MxOWY4MTlkZGJkMGM5Zjg5ODk5IHJlZnMvdGFncy90YWctdGhyZWUKKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMgcmVmcy90YWdzL3RhZy10aHJlZS1maWxlCis1MjViN2ZiMDY4ZDU5OTUwZDE4NWE4Nzc5ZGM5NTdjNzdlZWQ3M2JhIHJlZnMvdGFncy90YWctdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMuYnItcmVtb3RlLWV4cGxpY2l0LW9jdG9wdXMgYi90L3Q1NTE1L3JlZnMuYnItcmVtb3RlLWV4cGxpY2l0LW9jdG9wdXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiYmZkOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5ici1yZW1vdGUtZXhwbGljaXQtb2N0b3B1cwpAQCAtMCwwICsxLDE1IEBACiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvb3JpZ2luL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9vcmlnaW4vdHdvCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9yZW0vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9yZW0vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9yZW0vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL3JlbS90d28KKzZjOWRlYzJiOTIzMjI4YzlmZjk5NGM2Y2ZlNGFlMTZjMTI0MDhkYzUgcmVmcy90YWdzL3RhZy1tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy90YWdzL3RhZy1vbmUKKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEgcmVmcy90YWdzL3RhZy1vbmUtdHJlZQorYzYxYTgyYjYwOTY3MTgwNTQ0ZTNjMTlmODE5ZGRiZDBjOWY4OTg5OSByZWZzL3RhZ3MvdGFnLXRocmVlCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljIHJlZnMvdGFncy90YWctdGhyZWUtZmlsZQorNTI1YjdmYjA2OGQ1OTk1MGQxODVhODc3OWRjOTU3Yzc3ZWVkNzNiYSByZWZzL3RhZ3MvdGFnLXR3bwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9yZWZzLmJyLXJlbW90ZS1leHBsaWNpdC1vY3RvcHVzX3JlbW90ZS1leHBsaWNpdCBiL3QvdDU1MTUvcmVmcy5ici1yZW1vdGUtZXhwbGljaXQtb2N0b3B1c19yZW1vdGUtZXhwbGljaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiYmZkOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5ici1yZW1vdGUtZXhwbGljaXQtb2N0b3B1c19yZW1vdGUtZXhwbGljaXQKQEAgLTAsMCArMSwxNSBAQAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvcmVtL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvcmVtL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvcmVtL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9yZW0vdHdvCis2YzlkZWMyYjkyMzIyOGM5ZmY5OTRjNmNmZTRhZTE2YzEyNDA4ZGM1IHJlZnMvdGFncy90YWctbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvdGFncy90YWctb25lCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhIHJlZnMvdGFncy90YWctb25lLXRyZWUKK2M2MWE4MmI2MDk2NzE4MDU0NGUzYzE5ZjgxOWRkYmQwYzlmODk4OTkgcmVmcy90YWdzL3RhZy10aHJlZQorMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5YyByZWZzL3RhZ3MvdGFnLXRocmVlLWZpbGUKKzUyNWI3ZmIwNjhkNTk5NTBkMTg1YTg3NzlkYzk1N2M3N2VlZDczYmEgcmVmcy90YWdzL3RhZy10d28KZGlmZiAtLWdpdCBhL3QvdDU1MTUvcmVmcy5ici1yZW1vdGUtZXhwbGljaXRfcmVtb3RlLWV4cGxpY2l0IGIvdC90NTUxNS9yZWZzLmJyLXJlbW90ZS1leHBsaWNpdF9yZW1vdGUtZXhwbGljaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiYmZkOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5ici1yZW1vdGUtZXhwbGljaXRfcmVtb3RlLWV4cGxpY2l0CkBAIC0wLDAgKzEsMTUgQEAKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi9IRUFECis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL29yaWdpbi90d28KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL3JlbS9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL3JlbS9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL3JlbS90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvcmVtL3R3bworNmM5ZGVjMmI5MjMyMjhjOWZmOTk0YzZjZmU0YWUxNmMxMjQwOGRjNSByZWZzL3RhZ3MvdGFnLW1hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3RhZ3MvdGFnLW9uZQorMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYSByZWZzL3RhZ3MvdGFnLW9uZS10cmVlCitjNjFhODJiNjA5NjcxODA1NDRlM2MxOWY4MTlkZGJkMGM5Zjg5ODk5IHJlZnMvdGFncy90YWctdGhyZWUKKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMgcmVmcy90YWdzL3RhZy10aHJlZS1maWxlCis1MjViN2ZiMDY4ZDU5OTUwZDE4NWE4Nzc5ZGM5NTdjNzdlZWQ3M2JhIHJlZnMvdGFncy90YWctdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMuYnItcmVtb3RlLWdsb2IgYi90L3Q1NTE1L3JlZnMuYnItcmVtb3RlLWdsb2IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiYmZkOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5ici1yZW1vdGUtZ2xvYgpAQCAtMCwwICsxLDE1IEBACiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvb3JpZ2luL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9vcmlnaW4vdHdvCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9yZW0vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9yZW0vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9yZW0vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL3JlbS90d28KKzZjOWRlYzJiOTIzMjI4YzlmZjk5NGM2Y2ZlNGFlMTZjMTI0MDhkYzUgcmVmcy90YWdzL3RhZy1tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy90YWdzL3RhZy1vbmUKKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEgcmVmcy90YWdzL3RhZy1vbmUtdHJlZQorYzYxYTgyYjYwOTY3MTgwNTQ0ZTNjMTlmODE5ZGRiZDBjOWY4OTg5OSByZWZzL3RhZ3MvdGFnLXRocmVlCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljIHJlZnMvdGFncy90YWctdGhyZWUtZmlsZQorNTI1YjdmYjA2OGQ1OTk1MGQxODVhODc3OWRjOTU3Yzc3ZWVkNzNiYSByZWZzL3RhZ3MvdGFnLXR3bwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9yZWZzLmJyLXJlbW90ZS1nbG9iLW1lcmdlIGIvdC90NTUxNS9yZWZzLmJyLXJlbW90ZS1nbG9iLW1lcmdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYmJmZDkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L3JlZnMuYnItcmVtb3RlLWdsb2ItbWVyZ2UKQEAgLTAsMCArMSwxNSBAQAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvcmVtL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvcmVtL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvcmVtL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9yZW0vdHdvCis2YzlkZWMyYjkyMzIyOGM5ZmY5OTRjNmNmZTRhZTE2YzEyNDA4ZGM1IHJlZnMvdGFncy90YWctbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvdGFncy90YWctb25lCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhIHJlZnMvdGFncy90YWctb25lLXRyZWUKK2M2MWE4MmI2MDk2NzE4MDU0NGUzYzE5ZjgxOWRkYmQwYzlmODk4OTkgcmVmcy90YWdzL3RhZy10aHJlZQorMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5YyByZWZzL3RhZ3MvdGFnLXRocmVlLWZpbGUKKzUyNWI3ZmIwNjhkNTk5NTBkMTg1YTg3NzlkYzk1N2M3N2VlZDczYmEgcmVmcy90YWdzL3RhZy10d28KZGlmZiAtLWdpdCBhL3QvdDU1MTUvcmVmcy5ici1yZW1vdGUtZ2xvYi1tZXJnZV9yZW1vdGUtZ2xvYiBiL3QvdDU1MTUvcmVmcy5ici1yZW1vdGUtZ2xvYi1tZXJnZV9yZW1vdGUtZ2xvYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmJiZmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9yZWZzLmJyLXJlbW90ZS1nbG9iLW1lcmdlX3JlbW90ZS1nbG9iCkBAIC0wLDAgKzEsMTUgQEAKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi9IRUFECis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL29yaWdpbi90d28KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL3JlbS9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL3JlbS9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL3JlbS90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvcmVtL3R3bworNmM5ZGVjMmI5MjMyMjhjOWZmOTk0YzZjZmU0YWUxNmMxMjQwOGRjNSByZWZzL3RhZ3MvdGFnLW1hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3RhZ3MvdGFnLW9uZQorMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYSByZWZzL3RhZ3MvdGFnLW9uZS10cmVlCitjNjFhODJiNjA5NjcxODA1NDRlM2MxOWY4MTlkZGJkMGM5Zjg5ODk5IHJlZnMvdGFncy90YWctdGhyZWUKKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMgcmVmcy90YWdzL3RhZy10aHJlZS1maWxlCis1MjViN2ZiMDY4ZDU5OTUwZDE4NWE4Nzc5ZGM5NTdjNzdlZWQ3M2JhIHJlZnMvdGFncy90YWctdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMuYnItcmVtb3RlLWdsb2Itb2N0b3B1cyBiL3QvdDU1MTUvcmVmcy5ici1yZW1vdGUtZ2xvYi1vY3RvcHVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYmJmZDkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L3JlZnMuYnItcmVtb3RlLWdsb2Itb2N0b3B1cwpAQCAtMCwwICsxLDE1IEBACiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvb3JpZ2luL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9vcmlnaW4vdHdvCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9yZW0vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9yZW0vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9yZW0vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL3JlbS90d28KKzZjOWRlYzJiOTIzMjI4YzlmZjk5NGM2Y2ZlNGFlMTZjMTI0MDhkYzUgcmVmcy90YWdzL3RhZy1tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy90YWdzL3RhZy1vbmUKKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEgcmVmcy90YWdzL3RhZy1vbmUtdHJlZQorYzYxYTgyYjYwOTY3MTgwNTQ0ZTNjMTlmODE5ZGRiZDBjOWY4OTg5OSByZWZzL3RhZ3MvdGFnLXRocmVlCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljIHJlZnMvdGFncy90YWctdGhyZWUtZmlsZQorNTI1YjdmYjA2OGQ1OTk1MGQxODVhODc3OWRjOTU3Yzc3ZWVkNzNiYSByZWZzL3RhZ3MvdGFnLXR3bwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9yZWZzLmJyLXJlbW90ZS1nbG9iLW9jdG9wdXNfcmVtb3RlLWdsb2IgYi90L3Q1NTE1L3JlZnMuYnItcmVtb3RlLWdsb2Itb2N0b3B1c19yZW1vdGUtZ2xvYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmJiZmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9yZWZzLmJyLXJlbW90ZS1nbG9iLW9jdG9wdXNfcmVtb3RlLWdsb2IKQEAgLTAsMCArMSwxNSBAQAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvcmVtL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvcmVtL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvcmVtL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9yZW0vdHdvCis2YzlkZWMyYjkyMzIyOGM5ZmY5OTRjNmNmZTRhZTE2YzEyNDA4ZGM1IHJlZnMvdGFncy90YWctbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvdGFncy90YWctb25lCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhIHJlZnMvdGFncy90YWctb25lLXRyZWUKK2M2MWE4MmI2MDk2NzE4MDU0NGUzYzE5ZjgxOWRkYmQwYzlmODk4OTkgcmVmcy90YWdzL3RhZy10aHJlZQorMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5YyByZWZzL3RhZ3MvdGFnLXRocmVlLWZpbGUKKzUyNWI3ZmIwNjhkNTk5NTBkMTg1YTg3NzlkYzk1N2M3N2VlZDczYmEgcmVmcy90YWdzL3RhZy10d28KZGlmZiAtLWdpdCBhL3QvdDU1MTUvcmVmcy5ici1yZW1vdGUtZ2xvYl9yZW1vdGUtZ2xvYiBiL3QvdDU1MTUvcmVmcy5ici1yZW1vdGUtZ2xvYl9yZW1vdGUtZ2xvYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmJiZmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9yZWZzLmJyLXJlbW90ZS1nbG9iX3JlbW90ZS1nbG9iCkBAIC0wLDAgKzEsMTUgQEAKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi9IRUFECis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL29yaWdpbi90d28KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL3JlbS9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL3JlbS9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL3JlbS90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvcmVtL3R3bworNmM5ZGVjMmI5MjMyMjhjOWZmOTk0YzZjZmU0YWUxNmMxMjQwOGRjNSByZWZzL3RhZ3MvdGFnLW1hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3RhZ3MvdGFnLW9uZQorMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYSByZWZzL3RhZ3MvdGFnLW9uZS10cmVlCitjNjFhODJiNjA5NjcxODA1NDRlM2MxOWY4MTlkZGJkMGM5Zjg5ODk5IHJlZnMvdGFncy90YWctdGhyZWUKKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMgcmVmcy90YWdzL3RhZy10aHJlZS1maWxlCis1MjViN2ZiMDY4ZDU5OTUwZDE4NWE4Nzc5ZGM5NTdjNzdlZWQ3M2JhIHJlZnMvdGFncy90YWctdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMuYnItdW5jb25maWcgYi90L3Q1NTE1L3JlZnMuYnItdW5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlNGFkMgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5ici11bmNvbmZpZwpAQCAtMCwwICsxLDExIEBACiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvb3JpZ2luL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9vcmlnaW4vdHdvCis2YzlkZWMyYjkyMzIyOGM5ZmY5OTRjNmNmZTRhZTE2YzEyNDA4ZGM1IHJlZnMvdGFncy90YWctbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvdGFncy90YWctb25lCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhIHJlZnMvdGFncy90YWctb25lLXRyZWUKK2M2MWE4MmI2MDk2NzE4MDU0NGUzYzE5ZjgxOWRkYmQwYzlmODk4OTkgcmVmcy90YWdzL3RhZy10aHJlZQorMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5YyByZWZzL3RhZ3MvdGFnLXRocmVlLWZpbGUKKzUyNWI3ZmIwNjhkNTk5NTBkMTg1YTg3NzlkYzk1N2M3N2VlZDczYmEgcmVmcy90YWdzL3RhZy10d28KZGlmZiAtLWdpdCBhL3QvdDU1MTUvcmVmcy5ici11bmNvbmZpZ18tLXRhZ3NfLi5fLmdpdCBiL3QvdDU1MTUvcmVmcy5ici11bmNvbmZpZ18tLXRhZ3NfLi5fLmdpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2U0YWQyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9yZWZzLmJyLXVuY29uZmlnXy0tdGFnc18uLl8uZ2l0CkBAIC0wLDAgKzEsMTEgQEAKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi9IRUFECis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL29yaWdpbi90d28KKzZjOWRlYzJiOTIzMjI4YzlmZjk5NGM2Y2ZlNGFlMTZjMTI0MDhkYzUgcmVmcy90YWdzL3RhZy1tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy90YWdzL3RhZy1vbmUKKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEgcmVmcy90YWdzL3RhZy1vbmUtdHJlZQorYzYxYTgyYjYwOTY3MTgwNTQ0ZTNjMTlmODE5ZGRiZDBjOWY4OTg5OSByZWZzL3RhZ3MvdGFnLXRocmVlCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljIHJlZnMvdGFncy90YWctdGhyZWUtZmlsZQorNTI1YjdmYjA2OGQ1OTk1MGQxODVhODc3OWRjOTU3Yzc3ZWVkNzNiYSByZWZzL3RhZ3MvdGFnLXR3bwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9yZWZzLmJyLXVuY29uZmlnXy4uXy5naXQgYi90L3Q1NTE1L3JlZnMuYnItdW5jb25maWdfLi5fLmdpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDk2MmVhCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9yZWZzLmJyLXVuY29uZmlnXy4uXy5naXQKQEAgLTAsMCArMSw1IEBACiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvb3JpZ2luL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9vcmlnaW4vdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMuYnItdW5jb25maWdfLi5fLmdpdF9vbmUgYi90L3Q1NTE1L3JlZnMuYnItdW5jb25maWdfLi5fLmdpdF9vbmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5NjJlYQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5ici11bmNvbmZpZ18uLl8uZ2l0X29uZQpAQCAtMCwwICsxLDUgQEAKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi9IRUFECis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL29yaWdpbi90d28KZGlmZiAtLWdpdCBhL3QvdDU1MTUvcmVmcy5ici11bmNvbmZpZ18uLl8uZ2l0X29uZV90YWdfdGFnLW9uZV90YWdfdGFnLXRocmVlLWZpbGUgYi90L3Q1NTE1L3JlZnMuYnItdW5jb25maWdfLi5fLmdpdF9vbmVfdGFnX3RhZy1vbmVfdGFnX3RhZy10aHJlZS1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZTRhZDIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L3JlZnMuYnItdW5jb25maWdfLi5fLmdpdF9vbmVfdGFnX3RhZy1vbmVfdGFnX3RhZy10aHJlZS1maWxlCkBAIC0wLDAgKzEsMTEgQEAKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi9IRUFECis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL29yaWdpbi90d28KKzZjOWRlYzJiOTIzMjI4YzlmZjk5NGM2Y2ZlNGFlMTZjMTI0MDhkYzUgcmVmcy90YWdzL3RhZy1tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy90YWdzL3RhZy1vbmUKKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEgcmVmcy90YWdzL3RhZy1vbmUtdHJlZQorYzYxYTgyYjYwOTY3MTgwNTQ0ZTNjMTlmODE5ZGRiZDBjOWY4OTg5OSByZWZzL3RhZ3MvdGFnLXRocmVlCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljIHJlZnMvdGFncy90YWctdGhyZWUtZmlsZQorNTI1YjdmYjA2OGQ1OTk1MGQxODVhODc3OWRjOTU3Yzc3ZWVkNzNiYSByZWZzL3RhZ3MvdGFnLXR3bwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9yZWZzLmJyLXVuY29uZmlnXy4uXy5naXRfb25lX3R3byBiL3QvdDU1MTUvcmVmcy5ici11bmNvbmZpZ18uLl8uZ2l0X29uZV90d28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5NjJlYQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5ici11bmNvbmZpZ18uLl8uZ2l0X29uZV90d28KQEAgLTAsMCArMSw1IEBACiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvb3JpZ2luL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9vcmlnaW4vdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMuYnItdW5jb25maWdfLi5fLmdpdF90YWdfdGFnLW9uZS10cmVlX3RhZ190YWctdGhyZWUtZmlsZSBiL3QvdDU1MTUvcmVmcy5ici11bmNvbmZpZ18uLl8uZ2l0X3RhZ190YWctb25lLXRyZWVfdGFnX3RhZy10aHJlZS1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZTRhZDIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L3JlZnMuYnItdW5jb25maWdfLi5fLmdpdF90YWdfdGFnLW9uZS10cmVlX3RhZ190YWctdGhyZWUtZmlsZQpAQCAtMCwwICsxLDExIEBACiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvb3JpZ2luL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9vcmlnaW4vdHdvCis2YzlkZWMyYjkyMzIyOGM5ZmY5OTRjNmNmZTRhZTE2YzEyNDA4ZGM1IHJlZnMvdGFncy90YWctbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvdGFncy90YWctb25lCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhIHJlZnMvdGFncy90YWctb25lLXRyZWUKK2M2MWE4MmI2MDk2NzE4MDU0NGUzYzE5ZjgxOWRkYmQwYzlmODk4OTkgcmVmcy90YWdzL3RhZy10aHJlZQorMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5YyByZWZzL3RhZ3MvdGFnLXRocmVlLWZpbGUKKzUyNWI3ZmIwNjhkNTk5NTBkMTg1YTg3NzlkYzk1N2M3N2VlZDczYmEgcmVmcy90YWdzL3RhZy10d28KZGlmZiAtLWdpdCBhL3QvdDU1MTUvcmVmcy5ici11bmNvbmZpZ18uLl8uZ2l0X3RhZ190YWctb25lX3RhZ190YWctdGhyZWUgYi90L3Q1NTE1L3JlZnMuYnItdW5jb25maWdfLi5fLmdpdF90YWdfdGFnLW9uZV90YWdfdGFnLXRocmVlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZTRhZDIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L3JlZnMuYnItdW5jb25maWdfLi5fLmdpdF90YWdfdGFnLW9uZV90YWdfdGFnLXRocmVlCkBAIC0wLDAgKzEsMTEgQEAKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi9IRUFECis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL29yaWdpbi90d28KKzZjOWRlYzJiOTIzMjI4YzlmZjk5NGM2Y2ZlNGFlMTZjMTI0MDhkYzUgcmVmcy90YWdzL3RhZy1tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy90YWdzL3RhZy1vbmUKKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEgcmVmcy90YWdzL3RhZy1vbmUtdHJlZQorYzYxYTgyYjYwOTY3MTgwNTQ0ZTNjMTlmODE5ZGRiZDBjOWY4OTg5OSByZWZzL3RhZ3MvdGFnLXRocmVlCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljIHJlZnMvdGFncy90YWctdGhyZWUtZmlsZQorNTI1YjdmYjA2OGQ1OTk1MGQxODVhODc3OWRjOTU3Yzc3ZWVkNzNiYSByZWZzL3RhZ3MvdGFnLXR3bwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9yZWZzLmJyLXVuY29uZmlnX2JyYW5jaGVzLWRlZmF1bHQgYi90L3Q1NTE1L3JlZnMuYnItdW5jb25maWdfYnJhbmNoZXMtZGVmYXVsdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTkxN2MxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9yZWZzLmJyLXVuY29uZmlnX2JyYW5jaGVzLWRlZmF1bHQKQEAgLTAsMCArMSwxMiBAQAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL2hlYWRzL2JyYW5jaGVzLWRlZmF1bHQKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi9IRUFECis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL29yaWdpbi90d28KKzZjOWRlYzJiOTIzMjI4YzlmZjk5NGM2Y2ZlNGFlMTZjMTI0MDhkYzUgcmVmcy90YWdzL3RhZy1tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy90YWdzL3RhZy1vbmUKKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEgcmVmcy90YWdzL3RhZy1vbmUtdHJlZQorYzYxYTgyYjYwOTY3MTgwNTQ0ZTNjMTlmODE5ZGRiZDBjOWY4OTg5OSByZWZzL3RhZ3MvdGFnLXRocmVlCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljIHJlZnMvdGFncy90YWctdGhyZWUtZmlsZQorNTI1YjdmYjA2OGQ1OTk1MGQxODVhODc3OWRjOTU3Yzc3ZWVkNzNiYSByZWZzL3RhZ3MvdGFnLXR3bwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9yZWZzLmJyLXVuY29uZmlnX2JyYW5jaGVzLW9uZSBiL3QvdDU1MTUvcmVmcy5ici11bmNvbmZpZ19icmFuY2hlcy1vbmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE3MDVhNQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5ici11bmNvbmZpZ19icmFuY2hlcy1vbmUKQEAgLTAsMCArMSwxMiBAQAorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL2hlYWRzL2JyYW5jaGVzLW9uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bworNmM5ZGVjMmI5MjMyMjhjOWZmOTk0YzZjZmU0YWUxNmMxMjQwOGRjNSByZWZzL3RhZ3MvdGFnLW1hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3RhZ3MvdGFnLW9uZQorMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYSByZWZzL3RhZ3MvdGFnLW9uZS10cmVlCitjNjFhODJiNjA5NjcxODA1NDRlM2MxOWY4MTlkZGJkMGM5Zjg5ODk5IHJlZnMvdGFncy90YWctdGhyZWUKKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMgcmVmcy90YWdzL3RhZy10aHJlZS1maWxlCis1MjViN2ZiMDY4ZDU5OTUwZDE4NWE4Nzc5ZGM5NTdjNzdlZWQ3M2JhIHJlZnMvdGFncy90YWctdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMuYnItdW5jb25maWdfY29uZmlnLWV4cGxpY2l0IGIvdC90NTUxNS9yZWZzLmJyLXVuY29uZmlnX2NvbmZpZy1leHBsaWNpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmJiZmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9yZWZzLmJyLXVuY29uZmlnX2NvbmZpZy1leHBsaWNpdApAQCAtMCwwICsxLDE1IEBACiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvb3JpZ2luL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9vcmlnaW4vdHdvCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9yZW0vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9yZW0vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9yZW0vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL3JlbS90d28KKzZjOWRlYzJiOTIzMjI4YzlmZjk5NGM2Y2ZlNGFlMTZjMTI0MDhkYzUgcmVmcy90YWdzL3RhZy1tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy90YWdzL3RhZy1vbmUKKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEgcmVmcy90YWdzL3RhZy1vbmUtdHJlZQorYzYxYTgyYjYwOTY3MTgwNTQ0ZTNjMTlmODE5ZGRiZDBjOWY4OTg5OSByZWZzL3RhZ3MvdGFnLXRocmVlCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljIHJlZnMvdGFncy90YWctdGhyZWUtZmlsZQorNTI1YjdmYjA2OGQ1OTk1MGQxODVhODc3OWRjOTU3Yzc3ZWVkNzNiYSByZWZzL3RhZ3MvdGFnLXR3bwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9yZWZzLmJyLXVuY29uZmlnX2NvbmZpZy1nbG9iIGIvdC90NTUxNS9yZWZzLmJyLXVuY29uZmlnX2NvbmZpZy1nbG9iCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYmJmZDkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L3JlZnMuYnItdW5jb25maWdfY29uZmlnLWdsb2IKQEAgLTAsMCArMSwxNSBAQAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvcmVtL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvcmVtL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvcmVtL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9yZW0vdHdvCis2YzlkZWMyYjkyMzIyOGM5ZmY5OTRjNmNmZTRhZTE2YzEyNDA4ZGM1IHJlZnMvdGFncy90YWctbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvdGFncy90YWctb25lCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhIHJlZnMvdGFncy90YWctb25lLXRyZWUKK2M2MWE4MmI2MDk2NzE4MDU0NGUzYzE5ZjgxOWRkYmQwYzlmODk4OTkgcmVmcy90YWdzL3RhZy10aHJlZQorMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5YyByZWZzL3RhZ3MvdGFnLXRocmVlLWZpbGUKKzUyNWI3ZmIwNjhkNTk5NTBkMTg1YTg3NzlkYzk1N2M3N2VlZDczYmEgcmVmcy90YWdzL3RhZy10d28KZGlmZiAtLWdpdCBhL3QvdDU1MTUvcmVmcy5ici11bmNvbmZpZ19yZW1vdGUtZXhwbGljaXQgYi90L3Q1NTE1L3JlZnMuYnItdW5jb25maWdfcmVtb3RlLWV4cGxpY2l0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYmJmZDkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L3JlZnMuYnItdW5jb25maWdfcmVtb3RlLWV4cGxpY2l0CkBAIC0wLDAgKzEsMTUgQEAKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi9IRUFECis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL29yaWdpbi90d28KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL3JlbS9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL3JlbS9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL3JlbS90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvcmVtL3R3bworNmM5ZGVjMmI5MjMyMjhjOWZmOTk0YzZjZmU0YWUxNmMxMjQwOGRjNSByZWZzL3RhZ3MvdGFnLW1hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3RhZ3MvdGFnLW9uZQorMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYSByZWZzL3RhZ3MvdGFnLW9uZS10cmVlCitjNjFhODJiNjA5NjcxODA1NDRlM2MxOWY4MTlkZGJkMGM5Zjg5ODk5IHJlZnMvdGFncy90YWctdGhyZWUKKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMgcmVmcy90YWdzL3RhZy10aHJlZS1maWxlCis1MjViN2ZiMDY4ZDU5OTUwZDE4NWE4Nzc5ZGM5NTdjNzdlZWQ3M2JhIHJlZnMvdGFncy90YWctdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMuYnItdW5jb25maWdfcmVtb3RlLWdsb2IgYi90L3Q1NTE1L3JlZnMuYnItdW5jb25maWdfcmVtb3RlLWdsb2IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiYmZkOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5ici11bmNvbmZpZ19yZW1vdGUtZ2xvYgpAQCAtMCwwICsxLDE1IEBACiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvb3JpZ2luL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9vcmlnaW4vdHdvCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9yZW0vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9yZW0vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9yZW0vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL3JlbS90d28KKzZjOWRlYzJiOTIzMjI4YzlmZjk5NGM2Y2ZlNGFlMTZjMTI0MDhkYzUgcmVmcy90YWdzL3RhZy1tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy90YWdzL3RhZy1vbmUKKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEgcmVmcy90YWdzL3RhZy1vbmUtdHJlZQorYzYxYTgyYjYwOTY3MTgwNTQ0ZTNjMTlmODE5ZGRiZDBjOWY4OTg5OSByZWZzL3RhZ3MvdGFnLXRocmVlCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljIHJlZnMvdGFncy90YWctdGhyZWUtZmlsZQorNTI1YjdmYjA2OGQ1OTk1MGQxODVhODc3OWRjOTU3Yzc3ZWVkNzNiYSByZWZzL3RhZ3MvdGFnLXR3bwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9yZWZzLm1hc3RlciBiL3QvdDU1MTUvcmVmcy5tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlNGFkMgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5tYXN0ZXIKQEAgLTAsMCArMSwxMSBAQAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bworNmM5ZGVjMmI5MjMyMjhjOWZmOTk0YzZjZmU0YWUxNmMxMjQwOGRjNSByZWZzL3RhZ3MvdGFnLW1hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3RhZ3MvdGFnLW9uZQorMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYSByZWZzL3RhZ3MvdGFnLW9uZS10cmVlCitjNjFhODJiNjA5NjcxODA1NDRlM2MxOWY4MTlkZGJkMGM5Zjg5ODk5IHJlZnMvdGFncy90YWctdGhyZWUKKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMgcmVmcy90YWdzL3RhZy10aHJlZS1maWxlCis1MjViN2ZiMDY4ZDU5OTUwZDE4NWE4Nzc5ZGM5NTdjNzdlZWQ3M2JhIHJlZnMvdGFncy90YWctdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMubWFzdGVyXy0tdGFnc18uLl8uZ2l0IGIvdC90NTUxNS9yZWZzLm1hc3Rlcl8tLXRhZ3NfLi5fLmdpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2U0YWQyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9yZWZzLm1hc3Rlcl8tLXRhZ3NfLi5fLmdpdApAQCAtMCwwICsxLDExIEBACiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvb3JpZ2luL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9vcmlnaW4vdHdvCis2YzlkZWMyYjkyMzIyOGM5ZmY5OTRjNmNmZTRhZTE2YzEyNDA4ZGM1IHJlZnMvdGFncy90YWctbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvdGFncy90YWctb25lCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhIHJlZnMvdGFncy90YWctb25lLXRyZWUKK2M2MWE4MmI2MDk2NzE4MDU0NGUzYzE5ZjgxOWRkYmQwYzlmODk4OTkgcmVmcy90YWdzL3RhZy10aHJlZQorMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5YyByZWZzL3RhZ3MvdGFnLXRocmVlLWZpbGUKKzUyNWI3ZmIwNjhkNTk5NTBkMTg1YTg3NzlkYzk1N2M3N2VlZDczYmEgcmVmcy90YWdzL3RhZy10d28KZGlmZiAtLWdpdCBhL3QvdDU1MTUvcmVmcy5tYXN0ZXJfLi5fLmdpdCBiL3QvdDU1MTUvcmVmcy5tYXN0ZXJfLi5fLmdpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDk2MmVhCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9yZWZzLm1hc3Rlcl8uLl8uZ2l0CkBAIC0wLDAgKzEsNSBAQAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9yZWZzLm1hc3Rlcl8uLl8uZ2l0X29uZSBiL3QvdDU1MTUvcmVmcy5tYXN0ZXJfLi5fLmdpdF9vbmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5NjJlYQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5tYXN0ZXJfLi5fLmdpdF9vbmUKQEAgLTAsMCArMSw1IEBACiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvb3JpZ2luL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9vcmlnaW4vdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMubWFzdGVyXy4uXy5naXRfb25lX3RhZ190YWctb25lX3RhZ190YWctdGhyZWUtZmlsZSBiL3QvdDU1MTUvcmVmcy5tYXN0ZXJfLi5fLmdpdF9vbmVfdGFnX3RhZy1vbmVfdGFnX3RhZy10aHJlZS1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZTRhZDIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L3JlZnMubWFzdGVyXy4uXy5naXRfb25lX3RhZ190YWctb25lX3RhZ190YWctdGhyZWUtZmlsZQpAQCAtMCwwICsxLDExIEBACiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvb3JpZ2luL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9vcmlnaW4vdHdvCis2YzlkZWMyYjkyMzIyOGM5ZmY5OTRjNmNmZTRhZTE2YzEyNDA4ZGM1IHJlZnMvdGFncy90YWctbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvdGFncy90YWctb25lCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhIHJlZnMvdGFncy90YWctb25lLXRyZWUKK2M2MWE4MmI2MDk2NzE4MDU0NGUzYzE5ZjgxOWRkYmQwYzlmODk4OTkgcmVmcy90YWdzL3RhZy10aHJlZQorMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5YyByZWZzL3RhZ3MvdGFnLXRocmVlLWZpbGUKKzUyNWI3ZmIwNjhkNTk5NTBkMTg1YTg3NzlkYzk1N2M3N2VlZDczYmEgcmVmcy90YWdzL3RhZy10d28KZGlmZiAtLWdpdCBhL3QvdDU1MTUvcmVmcy5tYXN0ZXJfLi5fLmdpdF9vbmVfdHdvIGIvdC90NTUxNS9yZWZzLm1hc3Rlcl8uLl8uZ2l0X29uZV90d28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5NjJlYQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5tYXN0ZXJfLi5fLmdpdF9vbmVfdHdvCkBAIC0wLDAgKzEsNSBAQAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9yZWZzLm1hc3Rlcl8uLl8uZ2l0X3RhZ190YWctb25lLXRyZWVfdGFnX3RhZy10aHJlZS1maWxlIGIvdC90NTUxNS9yZWZzLm1hc3Rlcl8uLl8uZ2l0X3RhZ190YWctb25lLXRyZWVfdGFnX3RhZy10aHJlZS1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZTRhZDIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L3JlZnMubWFzdGVyXy4uXy5naXRfdGFnX3RhZy1vbmUtdHJlZV90YWdfdGFnLXRocmVlLWZpbGUKQEAgLTAsMCArMSwxMSBAQAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bworNmM5ZGVjMmI5MjMyMjhjOWZmOTk0YzZjZmU0YWUxNmMxMjQwOGRjNSByZWZzL3RhZ3MvdGFnLW1hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3RhZ3MvdGFnLW9uZQorMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYSByZWZzL3RhZ3MvdGFnLW9uZS10cmVlCitjNjFhODJiNjA5NjcxODA1NDRlM2MxOWY4MTlkZGJkMGM5Zjg5ODk5IHJlZnMvdGFncy90YWctdGhyZWUKKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMgcmVmcy90YWdzL3RhZy10aHJlZS1maWxlCis1MjViN2ZiMDY4ZDU5OTUwZDE4NWE4Nzc5ZGM5NTdjNzdlZWQ3M2JhIHJlZnMvdGFncy90YWctdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMubWFzdGVyXy4uXy5naXRfdGFnX3RhZy1vbmVfdGFnX3RhZy10aHJlZSBiL3QvdDU1MTUvcmVmcy5tYXN0ZXJfLi5fLmdpdF90YWdfdGFnLW9uZV90YWdfdGFnLXRocmVlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZTRhZDIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L3JlZnMubWFzdGVyXy4uXy5naXRfdGFnX3RhZy1vbmVfdGFnX3RhZy10aHJlZQpAQCAtMCwwICsxLDExIEBACiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvb3JpZ2luL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9vcmlnaW4vdHdvCis2YzlkZWMyYjkyMzIyOGM5ZmY5OTRjNmNmZTRhZTE2YzEyNDA4ZGM1IHJlZnMvdGFncy90YWctbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvdGFncy90YWctb25lCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhIHJlZnMvdGFncy90YWctb25lLXRyZWUKK2M2MWE4MmI2MDk2NzE4MDU0NGUzYzE5ZjgxOWRkYmQwYzlmODk4OTkgcmVmcy90YWdzL3RhZy10aHJlZQorMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5YyByZWZzL3RhZ3MvdGFnLXRocmVlLWZpbGUKKzUyNWI3ZmIwNjhkNTk5NTBkMTg1YTg3NzlkYzk1N2M3N2VlZDczYmEgcmVmcy90YWdzL3RhZy10d28KZGlmZiAtLWdpdCBhL3QvdDU1MTUvcmVmcy5tYXN0ZXJfYnJhbmNoZXMtZGVmYXVsdCBiL3QvdDU1MTUvcmVmcy5tYXN0ZXJfYnJhbmNoZXMtZGVmYXVsdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTkxN2MxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9yZWZzLm1hc3Rlcl9icmFuY2hlcy1kZWZhdWx0CkBAIC0wLDAgKzEsMTIgQEAKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9oZWFkcy9icmFuY2hlcy1kZWZhdWx0CiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvb3JpZ2luL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9vcmlnaW4vdHdvCis2YzlkZWMyYjkyMzIyOGM5ZmY5OTRjNmNmZTRhZTE2YzEyNDA4ZGM1IHJlZnMvdGFncy90YWctbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvdGFncy90YWctb25lCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhIHJlZnMvdGFncy90YWctb25lLXRyZWUKK2M2MWE4MmI2MDk2NzE4MDU0NGUzYzE5ZjgxOWRkYmQwYzlmODk4OTkgcmVmcy90YWdzL3RhZy10aHJlZQorMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5YyByZWZzL3RhZ3MvdGFnLXRocmVlLWZpbGUKKzUyNWI3ZmIwNjhkNTk5NTBkMTg1YTg3NzlkYzk1N2M3N2VlZDczYmEgcmVmcy90YWdzL3RhZy10d28KZGlmZiAtLWdpdCBhL3QvdDU1MTUvcmVmcy5tYXN0ZXJfYnJhbmNoZXMtb25lIGIvdC90NTUxNS9yZWZzLm1hc3Rlcl9icmFuY2hlcy1vbmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE3MDVhNQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5tYXN0ZXJfYnJhbmNoZXMtb25lCkBAIC0wLDAgKzEsMTIgQEAKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9oZWFkcy9icmFuY2hlcy1vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi9IRUFECis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL29yaWdpbi90d28KKzZjOWRlYzJiOTIzMjI4YzlmZjk5NGM2Y2ZlNGFlMTZjMTI0MDhkYzUgcmVmcy90YWdzL3RhZy1tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy90YWdzL3RhZy1vbmUKKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEgcmVmcy90YWdzL3RhZy1vbmUtdHJlZQorYzYxYTgyYjYwOTY3MTgwNTQ0ZTNjMTlmODE5ZGRiZDBjOWY4OTg5OSByZWZzL3RhZ3MvdGFnLXRocmVlCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljIHJlZnMvdGFncy90YWctdGhyZWUtZmlsZQorNTI1YjdmYjA2OGQ1OTk1MGQxODVhODc3OWRjOTU3Yzc3ZWVkNzNiYSByZWZzL3RhZ3MvdGFnLXR3bwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9yZWZzLm1hc3Rlcl9jb25maWctZXhwbGljaXQgYi90L3Q1NTE1L3JlZnMubWFzdGVyX2NvbmZpZy1leHBsaWNpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmJiZmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNS9yZWZzLm1hc3Rlcl9jb25maWctZXhwbGljaXQKQEAgLTAsMCArMSwxNSBAQAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvcmVtL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvcmVtL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvcmVtL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9yZW0vdHdvCis2YzlkZWMyYjkyMzIyOGM5ZmY5OTRjNmNmZTRhZTE2YzEyNDA4ZGM1IHJlZnMvdGFncy90YWctbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvdGFncy90YWctb25lCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhIHJlZnMvdGFncy90YWctb25lLXRyZWUKK2M2MWE4MmI2MDk2NzE4MDU0NGUzYzE5ZjgxOWRkYmQwYzlmODk4OTkgcmVmcy90YWdzL3RhZy10aHJlZQorMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5YyByZWZzL3RhZ3MvdGFnLXRocmVlLWZpbGUKKzUyNWI3ZmIwNjhkNTk5NTBkMTg1YTg3NzlkYzk1N2M3N2VlZDczYmEgcmVmcy90YWdzL3RhZy10d28KZGlmZiAtLWdpdCBhL3QvdDU1MTUvcmVmcy5tYXN0ZXJfY29uZmlnLWdsb2IgYi90L3Q1NTE1L3JlZnMubWFzdGVyX2NvbmZpZy1nbG9iCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYmJmZDkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L3JlZnMubWFzdGVyX2NvbmZpZy1nbG9iCkBAIC0wLDAgKzEsMTUgQEAKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi9IRUFECis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL29yaWdpbi90d28KKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL3JlbS9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL3JlbS9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL3JlbS90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvcmVtL3R3bworNmM5ZGVjMmI5MjMyMjhjOWZmOTk0YzZjZmU0YWUxNmMxMjQwOGRjNSByZWZzL3RhZ3MvdGFnLW1hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3RhZ3MvdGFnLW9uZQorMjJmZWVhNDQ4YjAyM2EyZDg2NGVmOTRiMDEzNzM1YWYzNGQyMzhiYSByZWZzL3RhZ3MvdGFnLW9uZS10cmVlCitjNjFhODJiNjA5NjcxODA1NDRlM2MxOWY4MTlkZGJkMGM5Zjg5ODk5IHJlZnMvdGFncy90YWctdGhyZWUKKzBlM2IxNDA0N2QzZWUzNjVmNGYyYTFiNjczZGIwNTljMzk3MjU4OWMgcmVmcy90YWdzL3RhZy10aHJlZS1maWxlCis1MjViN2ZiMDY4ZDU5OTUwZDE4NWE4Nzc5ZGM5NTdjNzdlZWQ3M2JhIHJlZnMvdGFncy90YWctdHdvCmRpZmYgLS1naXQgYS90L3Q1NTE1L3JlZnMubWFzdGVyX3JlbW90ZS1leHBsaWNpdCBiL3QvdDU1MTUvcmVmcy5tYXN0ZXJfcmVtb3RlLWV4cGxpY2l0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYmJmZDkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTE1L3JlZnMubWFzdGVyX3JlbW90ZS1leHBsaWNpdApAQCAtMCwwICsxLDE1IEBACiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRAorNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvb3JpZ2luL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9vcmlnaW4vdHdvCis3NTRiNzU0NDA3YmYwMzJlOWEyZjlkNWE5YWQwNWNhNzlhNmIyMjhmIHJlZnMvcmVtb3Rlcy9yZW0vbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvcmVtb3Rlcy9yZW0vb25lCiswNTY3ZGE0ZDVlZGQyZmY0YmIyOTJhNDY1YmE5ZTY0ZGNhZDk1MzZiIHJlZnMvcmVtb3Rlcy9yZW0vdGhyZWUKKzYxMzRlZThmODU3NjkzYjk2ZmYxY2M5OGQzZTJmZDYyYjE5OWU1YTggcmVmcy9yZW1vdGVzL3JlbS90d28KKzZjOWRlYzJiOTIzMjI4YzlmZjk5NGM2Y2ZlNGFlMTZjMTI0MDhkYzUgcmVmcy90YWdzL3RhZy1tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy90YWdzL3RhZy1vbmUKKzIyZmVlYTQ0OGIwMjNhMmQ4NjRlZjk0YjAxMzczNWFmMzRkMjM4YmEgcmVmcy90YWdzL3RhZy1vbmUtdHJlZQorYzYxYTgyYjYwOTY3MTgwNTQ0ZTNjMTlmODE5ZGRiZDBjOWY4OTg5OSByZWZzL3RhZ3MvdGFnLXRocmVlCiswZTNiMTQwNDdkM2VlMzY1ZjRmMmExYjY3M2RiMDU5YzM5NzI1ODljIHJlZnMvdGFncy90YWctdGhyZWUtZmlsZQorNTI1YjdmYjA2OGQ1OTk1MGQxODVhODc3OWRjOTU3Yzc3ZWVkNzNiYSByZWZzL3RhZ3MvdGFnLXR3bwpkaWZmIC0tZ2l0IGEvdC90NTUxNS9yZWZzLm1hc3Rlcl9yZW1vdGUtZ2xvYiBiL3QvdDU1MTUvcmVmcy5tYXN0ZXJfcmVtb3RlLWdsb2IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiYmZkOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1MTUvcmVmcy5tYXN0ZXJfcmVtb3RlLWdsb2IKQEAgLTAsMCArMSwxNSBAQAorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQKKzc1NGI3NTQ0MDdiZjAzMmU5YTJmOWQ1YTlhZDA1Y2E3OWE2YjIyOGYgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIKKzhlMzJhNmQ5MDEzMjdhMjNlZjgzMTUxMWJhZGNlN2JmM2JmNDY2ODkgcmVmcy9yZW1vdGVzL29yaWdpbi9vbmUKKzA1NjdkYTRkNWVkZDJmZjRiYjI5MmE0NjViYTllNjRkY2FkOTUzNmIgcmVmcy9yZW1vdGVzL29yaWdpbi90aHJlZQorNjEzNGVlOGY4NTc2OTNiOTZmZjFjYzk4ZDNlMmZkNjJiMTk5ZTVhOCByZWZzL3JlbW90ZXMvb3JpZ2luL3R3bworNzU0Yjc1NDQwN2JmMDMyZTlhMmY5ZDVhOWFkMDVjYTc5YTZiMjI4ZiByZWZzL3JlbW90ZXMvcmVtL21hc3RlcgorOGUzMmE2ZDkwMTMyN2EyM2VmODMxNTExYmFkY2U3YmYzYmY0NjY4OSByZWZzL3JlbW90ZXMvcmVtL29uZQorMDU2N2RhNGQ1ZWRkMmZmNGJiMjkyYTQ2NWJhOWU2NGRjYWQ5NTM2YiByZWZzL3JlbW90ZXMvcmVtL3RocmVlCis2MTM0ZWU4Zjg1NzY5M2I5NmZmMWNjOThkM2UyZmQ2MmIxOTllNWE4IHJlZnMvcmVtb3Rlcy9yZW0vdHdvCis2YzlkZWMyYjkyMzIyOGM5ZmY5OTRjNmNmZTRhZTE2YzEyNDA4ZGM1IHJlZnMvdGFncy90YWctbWFzdGVyCis4ZTMyYTZkOTAxMzI3YTIzZWY4MzE1MTFiYWRjZTdiZjNiZjQ2Njg5IHJlZnMvdGFncy90YWctb25lCisyMmZlZWE0NDhiMDIzYTJkODY0ZWY5NGIwMTM3MzVhZjM0ZDIzOGJhIHJlZnMvdGFncy90YWctb25lLXRyZWUKK2M2MWE4MmI2MDk2NzE4MDU0NGUzYzE5ZjgxOWRkYmQwYzlmODk4OTkgcmVmcy90YWdzL3RhZy10aHJlZQorMGUzYjE0MDQ3ZDNlZTM2NWY0ZjJhMWI2NzNkYjA1OWMzOTcyNTg5YyByZWZzL3RhZ3MvdGFnLXRocmVlLWZpbGUKKzUyNWI3ZmIwNjhkNTk5NTBkMTg1YTg3NzlkYzk1N2M3N2VlZDczYmEgcmVmcy90YWdzL3RhZy10d28KZGlmZiAtLWdpdCBhL3QvdDU1MTYtZmV0Y2gtcHVzaC5zaCBiL3QvdDU1MTYtZmV0Y2gtcHVzaC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43OTNmZmM2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNi1mZXRjaC1wdXNoLnNoCkBAIC0wLDAgKzEsMzk3IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nZmV0Y2hpbmcgYW5kIHB1c2hpbmcsIHdpdGggb3Igd2l0aG91dCB3aWxkY2FyZCcKKworLiAuL3Rlc3QtbGliLnNoCisKK0Q9YHB3ZGAKKworbWtfZW1wdHkgKCkgeworCXJtIC1mciB0ZXN0cmVwbyAmJgorCW1rZGlyIHRlc3RyZXBvICYmCisJKAorCQljZCB0ZXN0cmVwbyAmJgorCQlnaXQgaW5pdCAmJgorCQltdiAuZ2l0L2hvb2tzIC5naXQvaG9va3MtZGlzYWJsZWQKKwkpCit9CisKK21rX3Rlc3QgKCkgeworCW1rX2VtcHR5ICYmCisJKAorCQlmb3IgcmVmIGluICIkQCIKKwkJZG8KKwkJCWdpdCBwdXNoIHRlc3RyZXBvICR0aGVfZmlyc3RfY29tbWl0OnJlZnMvJHJlZiB8fCB7CisJCQkJZWNobyAiT29wcywgcHVzaCByZWZzLyRyZWYgZmFpbHVyZSIKKwkJCQlleGl0IDEKKwkJCX0KKwkJZG9uZSAmJgorCQljZCB0ZXN0cmVwbyAmJgorCQlmb3IgcmVmIGluICIkQCIKKwkJZG8KKwkJCXI9JChnaXQgc2hvdy1yZWYgLXMgLS12ZXJpZnkgcmVmcy8kcmVmKSAmJgorCQkJdGVzdCAieiRyIiA9ICJ6JHRoZV9maXJzdF9jb21taXQiIHx8IHsKKwkJCQllY2hvICJPb3BzLCByZWZzLyRyZWYgaXMgd3JvbmciCisJCQkJZXhpdCAxCisJCQl9CisJCWRvbmUgJiYKKwkJZ2l0IGZzY2sgLS1mdWxsCisJKQorfQorCitjaGVja19wdXNoX3Jlc3VsdCAoKSB7CisJKAorCQljZCB0ZXN0cmVwbyAmJgorCQlpdD0iJDEiICYmCisJCXNoaWZ0CisJCWZvciByZWYgaW4gIiRAIgorCQlkbworCQkJcj0kKGdpdCBzaG93LXJlZiAtcyAtLXZlcmlmeSByZWZzLyRyZWYpICYmCisJCQl0ZXN0ICJ6JHIiID0gInokaXQiIHx8IHsKKwkJCQllY2hvICJPb3BzLCByZWZzLyRyZWYgaXMgd3JvbmciCisJCQkJZXhpdCAxCisJCQl9CisJCWRvbmUgJiYKKwkJZ2l0IGZzY2sgLS1mdWxsCisJKQorfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKworCTogPnBhdGgxICYmCisJZ2l0IGFkZCBwYXRoMSAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLWEgLW0gcmVwbyAmJgorCXRoZV9maXJzdF9jb21taXQ9JChnaXQgc2hvdy1yZWYgLXMgLS12ZXJpZnkgcmVmcy9oZWFkcy9tYXN0ZXIpICYmCisKKwk6ID5wYXRoMiAmJgorCWdpdCBhZGQgcGF0aDIgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1hIC1tIHNlY29uZCAmJgorCXRoZV9jb21taXQ9JChnaXQgc2hvdy1yZWYgLXMgLS12ZXJpZnkgcmVmcy9oZWFkcy9tYXN0ZXIpCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmV0Y2ggd2l0aG91dCB3aWxkY2FyZCcgJworCW1rX2VtcHR5ICYmCisJKAorCQljZCB0ZXN0cmVwbyAmJgorCQlnaXQgZmV0Y2ggLi4gcmVmcy9oZWFkcy9tYXN0ZXI6cmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIgJiYKKworCQlyPSQoZ2l0IHNob3ctcmVmIC1zIC0tdmVyaWZ5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyKSAmJgorCQl0ZXN0ICJ6JHIiID0gInokdGhlX2NvbW1pdCIgJiYKKworCQl0ZXN0IDEgPSAkKGdpdCBmb3ItZWFjaC1yZWYgcmVmcy9yZW1vdGVzL29yaWdpbiB8IHdjIC1sKQorCSkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmV0Y2ggd2l0aCB3aWxkY2FyZCcgJworCW1rX2VtcHR5ICYmCisJKAorCQljZCB0ZXN0cmVwbyAmJgorCQlnaXQgY29uZmlnIHJlbW90ZS51cC51cmwgLi4gJiYKKwkJZ2l0IGNvbmZpZyByZW1vdGUudXAuZmV0Y2ggInJlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoiICYmCisJCWdpdCBmZXRjaCB1cCAmJgorCisJCXI9JChnaXQgc2hvdy1yZWYgLXMgLS12ZXJpZnkgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIpICYmCisJCXRlc3QgInokciIgPSAieiR0aGVfY29tbWl0IiAmJgorCisJCXRlc3QgMSA9ICQoZ2l0IGZvci1lYWNoLXJlZiByZWZzL3JlbW90ZXMvb3JpZ2luIHwgd2MgLWwpCisJKQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmZXRjaCB3aXRoIGluc3RlYWRPZicgJworCW1rX2VtcHR5ICYmCisJKAorCQlUUkFTSD0kKHB3ZCkgJiYKKwkJY2QgdGVzdHJlcG8gJiYKKwkJZ2l0IGNvbmZpZyB1cmwuLyRUUkFTSC8uaW5zdGVhZE9mIHRyYXNoLworCQlnaXQgY29uZmlnIHJlbW90ZS51cC51cmwgdHJhc2gvLiAmJgorCQlnaXQgY29uZmlnIHJlbW90ZS51cC5mZXRjaCAicmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIgJiYKKwkJZ2l0IGZldGNoIHVwICYmCisKKwkJcj0kKGdpdCBzaG93LXJlZiAtcyAtLXZlcmlmeSByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcikgJiYKKwkJdGVzdCAieiRyIiA9ICJ6JHRoZV9jb21taXQiICYmCisKKwkJdGVzdCAxID0gJChnaXQgZm9yLWVhY2gtcmVmIHJlZnMvcmVtb3Rlcy9vcmlnaW4gfCB3YyAtbCkKKwkpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3B1c2ggd2l0aG91dCB3aWxkY2FyZCcgJworCW1rX2VtcHR5ICYmCisKKwlnaXQgcHVzaCB0ZXN0cmVwbyByZWZzL2hlYWRzL21hc3RlcjpyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlciAmJgorCSgKKwkJY2QgdGVzdHJlcG8gJiYKKwkJcj0kKGdpdCBzaG93LXJlZiAtcyAtLXZlcmlmeSByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcikgJiYKKwkJdGVzdCAieiRyIiA9ICJ6JHRoZV9jb21taXQiICYmCisKKwkJdGVzdCAxID0gJChnaXQgZm9yLWVhY2gtcmVmIHJlZnMvcmVtb3Rlcy9vcmlnaW4gfCB3YyAtbCkKKwkpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3B1c2ggd2l0aCB3aWxkY2FyZCcgJworCW1rX2VtcHR5ICYmCisKKwlnaXQgcHVzaCB0ZXN0cmVwbyAicmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIgJiYKKwkoCisJCWNkIHRlc3RyZXBvICYmCisJCXI9JChnaXQgc2hvdy1yZWYgLXMgLS12ZXJpZnkgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIpICYmCisJCXRlc3QgInokciIgPSAieiR0aGVfY29tbWl0IiAmJgorCisJCXRlc3QgMSA9ICQoZ2l0IGZvci1lYWNoLXJlZiByZWZzL3JlbW90ZXMvb3JpZ2luIHwgd2MgLWwpCisJKQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdXNoIHdpdGggaW5zdGVhZE9mJyAnCisJbWtfZW1wdHkgJiYKKwlUUkFTSD0kKHB3ZCkgJiYKKwlnaXQgY29uZmlnIHVybC4vJFRSQVNILy5pbnN0ZWFkT2YgdHJhc2gvICYmCisJZ2l0IHB1c2ggdHJhc2gvdGVzdHJlcG8gcmVmcy9oZWFkcy9tYXN0ZXI6cmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIgJiYKKwkoCisJCWNkIHRlc3RyZXBvICYmCisJCXI9JChnaXQgc2hvdy1yZWYgLXMgLS12ZXJpZnkgcmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIpICYmCisJCXRlc3QgInokciIgPSAieiR0aGVfY29tbWl0IiAmJgorCisJCXRlc3QgMSA9ICQoZ2l0IGZvci1lYWNoLXJlZiByZWZzL3JlbW90ZXMvb3JpZ2luIHwgd2MgLWwpCisJKQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdXNoIHdpdGggbWF0Y2hpbmcgaGVhZHMnICcKKworCW1rX3Rlc3QgaGVhZHMvbWFzdGVyICYmCisJZ2l0IHB1c2ggdGVzdHJlcG8gJiYKKwljaGVja19wdXNoX3Jlc3VsdCAkdGhlX2NvbW1pdCBoZWFkcy9tYXN0ZXIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdXNoIHdpdGggbm8gYW1iaWd1aXR5ICgxKScgJworCisJbWtfdGVzdCBoZWFkcy9tYXN0ZXIgJiYKKwlnaXQgcHVzaCB0ZXN0cmVwbyBtYXN0ZXI6bWFzdGVyICYmCisJY2hlY2tfcHVzaF9yZXN1bHQgJHRoZV9jb21taXQgaGVhZHMvbWFzdGVyCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHVzaCB3aXRoIG5vIGFtYmlndWl0eSAoMiknICcKKworCW1rX3Rlc3QgcmVtb3Rlcy9vcmlnaW4vbWFzdGVyICYmCisJZ2l0IHB1c2ggdGVzdHJlcG8gbWFzdGVyOm9yaWdpbi9tYXN0ZXIgJiYKKwljaGVja19wdXNoX3Jlc3VsdCAkdGhlX2NvbW1pdCByZW1vdGVzL29yaWdpbi9tYXN0ZXIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdXNoIHdpdGggY29sb24tbGVzcyByZWZzcGVjLCBubyBhbWJpZ3VpdHknICcKKworCW1rX3Rlc3QgaGVhZHMvbWFzdGVyIGhlYWRzL3QvbWFzdGVyICYmCisJZ2l0IGJyYW5jaCAtZiB0L21hc3RlciBtYXN0ZXIgJiYKKwlnaXQgcHVzaCB0ZXN0cmVwbyBtYXN0ZXIgJiYKKwljaGVja19wdXNoX3Jlc3VsdCAkdGhlX2NvbW1pdCBoZWFkcy9tYXN0ZXIgJiYKKwljaGVja19wdXNoX3Jlc3VsdCAkdGhlX2ZpcnN0X2NvbW1pdCBoZWFkcy90L21hc3RlcgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3B1c2ggd2l0aCB3ZWFrIGFtYmlndWl0eSAoMSknICcKKworCW1rX3Rlc3QgaGVhZHMvbWFzdGVyIHJlbW90ZXMvb3JpZ2luL21hc3RlciAmJgorCWdpdCBwdXNoIHRlc3RyZXBvIG1hc3RlcjptYXN0ZXIgJiYKKwljaGVja19wdXNoX3Jlc3VsdCAkdGhlX2NvbW1pdCBoZWFkcy9tYXN0ZXIgJiYKKwljaGVja19wdXNoX3Jlc3VsdCAkdGhlX2ZpcnN0X2NvbW1pdCByZW1vdGVzL29yaWdpbi9tYXN0ZXIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdXNoIHdpdGggd2VhayBhbWJpZ3VpdHkgKDIpJyAnCisKKwlta190ZXN0IGhlYWRzL21hc3RlciByZW1vdGVzL29yaWdpbi9tYXN0ZXIgcmVtb3Rlcy9hbm90aGVyL21hc3RlciAmJgorCWdpdCBwdXNoIHRlc3RyZXBvIG1hc3RlcjptYXN0ZXIgJiYKKwljaGVja19wdXNoX3Jlc3VsdCAkdGhlX2NvbW1pdCBoZWFkcy9tYXN0ZXIgJiYKKwljaGVja19wdXNoX3Jlc3VsdCAkdGhlX2ZpcnN0X2NvbW1pdCByZW1vdGVzL29yaWdpbi9tYXN0ZXIgcmVtb3Rlcy9hbm90aGVyL21hc3RlcgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3B1c2ggd2l0aCBhbWJpZ3VpdHkgKDEpJyAnCisKKwlta190ZXN0IHJlbW90ZXMvb3JpZ2luL21hc3RlciByZW1vdGVzL2Zyb3R6L21hc3RlciAmJgorCWlmIGdpdCBwdXNoIHRlc3RyZXBvIG1hc3RlcjptYXN0ZXIKKwl0aGVuCisJCWVjaG8gIk9vcHMsIHNob3VsZCBoYXZlIGZhaWxlZCIKKwkJZmFsc2UKKwllbHNlCisJCWNoZWNrX3B1c2hfcmVzdWx0ICR0aGVfZmlyc3RfY29tbWl0IHJlbW90ZXMvb3JpZ2luL21hc3RlciByZW1vdGVzL2Zyb3R6L21hc3RlcgorCWZpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3B1c2ggd2l0aCBhbWJpZ3VpdHkgKDIpJyAnCisKKwlta190ZXN0IGhlYWRzL2Zyb3R6IHRhZ3MvZnJvdHogJiYKKwlpZiBnaXQgcHVzaCB0ZXN0cmVwbyBtYXN0ZXI6ZnJvdHoKKwl0aGVuCisJCWVjaG8gIk9vcHMsIHNob3VsZCBoYXZlIGZhaWxlZCIKKwkJZmFsc2UKKwllbHNlCisJCWNoZWNrX3B1c2hfcmVzdWx0ICR0aGVfZmlyc3RfY29tbWl0IGhlYWRzL2Zyb3R6IHRhZ3MvZnJvdHoKKwlmaQorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3B1c2ggd2l0aCBjb2xvbi1sZXNzIHJlZnNwZWMgKDEpJyAnCisKKwlta190ZXN0IGhlYWRzL2Zyb3R6IHRhZ3MvZnJvdHogJiYKKwlnaXQgYnJhbmNoIC1mIGZyb3R6IG1hc3RlciAmJgorCWdpdCBwdXNoIHRlc3RyZXBvIGZyb3R6ICYmCisJY2hlY2tfcHVzaF9yZXN1bHQgJHRoZV9jb21taXQgaGVhZHMvZnJvdHogJiYKKwljaGVja19wdXNoX3Jlc3VsdCAkdGhlX2ZpcnN0X2NvbW1pdCB0YWdzL2Zyb3R6CisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHVzaCB3aXRoIGNvbG9uLWxlc3MgcmVmc3BlYyAoMiknICcKKworCW1rX3Rlc3QgaGVhZHMvZnJvdHogdGFncy9mcm90eiAmJgorCWlmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtcSByZWZzL2hlYWRzL2Zyb3R6CisJdGhlbgorCQlnaXQgYnJhbmNoIC1EIGZyb3R6CisJZmkgJiYKKwlnaXQgdGFnIC1mIGZyb3R6ICYmCisJZ2l0IHB1c2ggdGVzdHJlcG8gZnJvdHogJiYKKwljaGVja19wdXNoX3Jlc3VsdCAkdGhlX2NvbW1pdCB0YWdzL2Zyb3R6ICYmCisJY2hlY2tfcHVzaF9yZXN1bHQgJHRoZV9maXJzdF9jb21taXQgaGVhZHMvZnJvdHoKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdXNoIHdpdGggY29sb24tbGVzcyByZWZzcGVjICgzKScgJworCisJbWtfdGVzdCAmJgorCWlmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtcSByZWZzL3RhZ3MvZnJvdHoKKwl0aGVuCisJCWdpdCB0YWcgLWQgZnJvdHoKKwlmaSAmJgorCWdpdCBicmFuY2ggLWYgZnJvdHogbWFzdGVyICYmCisJZ2l0IHB1c2ggdGVzdHJlcG8gZnJvdHogJiYKKwljaGVja19wdXNoX3Jlc3VsdCAkdGhlX2NvbW1pdCBoZWFkcy9mcm90eiAmJgorCXRlc3QgMSA9ICQoIGNkIHRlc3RyZXBvICYmIGdpdCBzaG93LXJlZiB8IHdjIC1sICkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHVzaCB3aXRoIGNvbG9uLWxlc3MgcmVmc3BlYyAoNCknICcKKworCW1rX3Rlc3QgJiYKKwlpZiBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLXEgcmVmcy9oZWFkcy9mcm90egorCXRoZW4KKwkJZ2l0IGJyYW5jaCAtRCBmcm90egorCWZpICYmCisJZ2l0IHRhZyAtZiBmcm90eiAmJgorCWdpdCBwdXNoIHRlc3RyZXBvIGZyb3R6ICYmCisJY2hlY2tfcHVzaF9yZXN1bHQgJHRoZV9jb21taXQgdGFncy9mcm90eiAmJgorCXRlc3QgMSA9ICQoIGNkIHRlc3RyZXBvICYmIGdpdCBzaG93LXJlZiB8IHdjIC1sICkKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdXNoIHdpdGggSEVBRCcgJworCisJbWtfdGVzdCBoZWFkcy9tYXN0ZXIgJiYKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisJZ2l0IHB1c2ggdGVzdHJlcG8gSEVBRCAmJgorCWNoZWNrX3B1c2hfcmVzdWx0ICR0aGVfY29tbWl0IGhlYWRzL21hc3RlcgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3B1c2ggd2l0aCBIRUFEIG5vbmV4aXN0aW5nIGF0IHJlbW90ZScgJworCisJbWtfdGVzdCBoZWFkcy9tYXN0ZXIgJiYKKwlnaXQgY2hlY2tvdXQgLWIgbG9jYWwgbWFzdGVyICYmCisJZ2l0IHB1c2ggdGVzdHJlcG8gSEVBRCAmJgorCWNoZWNrX3B1c2hfcmVzdWx0ICR0aGVfY29tbWl0IGhlYWRzL2xvY2FsCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3B1c2ggd2l0aCArSEVBRCcgJworCisJbWtfdGVzdCBoZWFkcy9tYXN0ZXIgJiYKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisJZ2l0IGJyYW5jaCAtRCBsb2NhbCAmJgorCWdpdCBjaGVja291dCAtYiBsb2NhbCAmJgorCWdpdCBwdXNoIHRlc3RyZXBvIG1hc3RlciBsb2NhbCAmJgorCWNoZWNrX3B1c2hfcmVzdWx0ICR0aGVfY29tbWl0IGhlYWRzL21hc3RlciAmJgorCWNoZWNrX3B1c2hfcmVzdWx0ICR0aGVfY29tbWl0IGhlYWRzL2xvY2FsICYmCisKKwkjIFdpdGhvdXQgZm9yY2UgcmV3aW5kaW5nIHNob3VsZCBmYWlsCisJZ2l0IHJlc2V0IC0taGFyZCBIRUFEXiAmJgorCSEgZ2l0IHB1c2ggdGVzdHJlcG8gSEVBRCAmJgorCWNoZWNrX3B1c2hfcmVzdWx0ICR0aGVfY29tbWl0IGhlYWRzL2xvY2FsICYmCisKKwkjIFdpdGggZm9yY2UgcmV3aW5kaW5nIHNob3VsZCBzdWNjZWVkCisJZ2l0IHB1c2ggdGVzdHJlcG8gK0hFQUQgJiYKKwljaGVja19wdXNoX3Jlc3VsdCAkdGhlX2ZpcnN0X2NvbW1pdCBoZWFkcy9sb2NhbAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3B1c2ggd2l0aCBjb25maWcgcmVtb3RlLioucHVzaCA9IEhFQUQnICcKKworCW1rX3Rlc3QgaGVhZHMvbG9jYWwgJiYKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisJZ2l0IGJyYW5jaCAtZiBsb2NhbCAkdGhlX2NvbW1pdCAmJgorCSgKKwkJY2QgdGVzdHJlcG8gJiYKKwkJZ2l0IGNoZWNrb3V0IGxvY2FsICYmCisJCWdpdCByZXNldCAtLWhhcmQgJHRoZV9maXJzdF9jb21taXQKKwkpICYmCisJZ2l0IGNvbmZpZyByZW1vdGUudGhlcmUudXJsIHRlc3RyZXBvICYmCisJZ2l0IGNvbmZpZyByZW1vdGUudGhlcmUucHVzaCBIRUFEICYmCisJZ2l0IGNvbmZpZyBicmFuY2gubWFzdGVyLnJlbW90ZSB0aGVyZSAmJgorCWdpdCBwdXNoICYmCisJY2hlY2tfcHVzaF9yZXN1bHQgJHRoZV9jb21taXQgaGVhZHMvbWFzdGVyICYmCisJY2hlY2tfcHVzaF9yZXN1bHQgJHRoZV9maXJzdF9jb21taXQgaGVhZHMvbG9jYWwKKycKKworIyBjbGVhbiB1cCB0aGUgY3J1ZnQgbGVmdCB3aXRoIHRoZSBwcmV2aW91cyBvbmUKK2dpdCBjb25maWcgLS1yZW1vdmUtc2VjdGlvbiByZW1vdGUudGhlcmUKK2dpdCBjb25maWcgLS1yZW1vdmUtc2VjdGlvbiBicmFuY2gubWFzdGVyCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3B1c2ggd2l0aCBkcnktcnVuJyAnCisKKwlta190ZXN0IGhlYWRzL21hc3RlciAmJgorCShjZCB0ZXN0cmVwbyAmJgorCSBvbGRfY29tbWl0PSQoZ2l0IHNob3ctcmVmIC1zIC0tdmVyaWZ5IHJlZnMvaGVhZHMvbWFzdGVyKSkgJiYKKwlnaXQgcHVzaCAtLWRyeS1ydW4gdGVzdHJlcG8gJiYKKwljaGVja19wdXNoX3Jlc3VsdCAkb2xkX2NvbW1pdCBoZWFkcy9tYXN0ZXIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHVzaCB1cGRhdGVzIGxvY2FsIHJlZnMnICcKKworCXJtIC1yZiBwYXJlbnQgY2hpbGQgJiYKKwlta2RpciBwYXJlbnQgJiYKKwkoY2QgcGFyZW50ICYmIGdpdCBpbml0ICYmCisJCWVjaG8gb25lID5mb28gJiYgZ2l0IGFkZCBmb28gJiYgZ2l0IGNvbW1pdCAtbSBvbmUpICYmCisJZ2l0IGNsb25lIHBhcmVudCBjaGlsZCAmJgorCShjZCBjaGlsZCAmJgorCQllY2hvIHR3byA+Zm9vICYmIGdpdCBjb21taXQgLWEgLW0gdHdvICYmCisJCWdpdCBwdXNoICYmCisJdGVzdCAkKGdpdCByZXYtcGFyc2UgbWFzdGVyKSA9ICQoZ2l0IHJldi1wYXJzZSByZW1vdGVzL29yaWdpbi9tYXN0ZXIpKQorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3B1c2ggZG9lcyBub3QgdXBkYXRlIGxvY2FsIHJlZnMgb24gZmFpbHVyZScgJworCisJcm0gLXJmIHBhcmVudCBjaGlsZCAmJgorCW1rZGlyIHBhcmVudCAmJgorCShjZCBwYXJlbnQgJiYgZ2l0IGluaXQgJiYKKwkJZWNobyBvbmUgPmZvbyAmJiBnaXQgYWRkIGZvbyAmJiBnaXQgY29tbWl0IC1tIG9uZSAmJgorCQllY2hvIGV4aXQgMSA+LmdpdC9ob29rcy9wcmUtcmVjZWl2ZSAmJgorCQljaG1vZCAreCAuZ2l0L2hvb2tzL3ByZS1yZWNlaXZlKSAmJgorCWdpdCBjbG9uZSBwYXJlbnQgY2hpbGQgJiYKKwkoY2QgY2hpbGQgJiYKKwkJZWNobyB0d28gPmZvbyAmJiBnaXQgY29tbWl0IC1hIC1tIHR3byAmJgorCQkhIGdpdCBwdXNoICYmCisJCXRlc3QgJChnaXQgcmV2LXBhcnNlIG1hc3RlcikgIT0gXAorCQkJJChnaXQgcmV2LXBhcnNlIHJlbW90ZXMvb3JpZ2luL21hc3RlcikpCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYWxsb3cgZGVsZXRpbmcgYW4gaW52YWxpZCByZW1vdGUgcmVmJyAnCisKKwlwd2QgJiYKKwlybSAtZiB0ZXN0cmVwby8uZ2l0L29iamVjdHMvPz8vKiAmJgorCWdpdCBwdXNoIHRlc3RyZXBvIDpyZWZzL2hlYWRzL21hc3RlciAmJgorCShjZCB0ZXN0cmVwbyAmJiAhIGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgcmVmcy9oZWFkcy9tYXN0ZXIpCisKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1NTE3LXB1c2gtbWlycm9yLnNoIGIvdC90NTUxNy1wdXNoLW1pcnJvci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZDNmZWMxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTUxNy1wdXNoLW1pcnJvci5zaApAQCAtMCwwICsxLDIyOCBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J3B1c2hpbmcgdG8gYSBtaXJyb3IgcmVwb3NpdG9yeScKKworLiAuL3Rlc3QtbGliLnNoCisKK0Q9YHB3ZGAKKworaW52ZXJ0ICgpIHsKKwlpZiAiJEAiOyB0aGVuCisJCXJldHVybiAxCisJZWxzZQorCQlyZXR1cm4gMAorCWZpCit9CisKK21rX3JlcG9fcGFpciAoKSB7CisJcm0gLXJmIG1hc3RlciBtaXJyb3IgJiYKKwlta2RpciBtaXJyb3IgJiYKKwkoCisJCWNkIG1pcnJvciAmJgorCQlnaXQgaW5pdAorCSkgJiYKKwlta2RpciBtYXN0ZXIgJiYKKwkoCisJCWNkIG1hc3RlciAmJgorCQlnaXQgaW5pdCAmJgorCQlnaXQgY29uZmlnIHJlbW90ZS51cC51cmwgLi4vbWlycm9yCisJKQorfQorCisKKyMgQlJBTkNIIHRlc3RzCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdXNoIG1pcnJvciBjcmVhdGVzIG5ldyBicmFuY2hlcycgJworCisJbWtfcmVwb19wYWlyICYmCisJKAorCQljZCBtYXN0ZXIgJiYKKwkJZWNobyBvbmUgPmZvbyAmJiBnaXQgYWRkIGZvbyAmJiBnaXQgY29tbWl0IC1tIG9uZSAmJgorCQlnaXQgcHVzaCAtLW1pcnJvciB1cAorCSkgJiYKKwltYXN0ZXJfbWFzdGVyPSQoY2QgbWFzdGVyICYmIGdpdCBzaG93LXJlZiAtcyAtLXZlcmlmeSByZWZzL2hlYWRzL21hc3RlcikgJiYKKwltaXJyb3JfbWFzdGVyPSQoY2QgbWlycm9yICYmIGdpdCBzaG93LXJlZiAtcyAtLXZlcmlmeSByZWZzL2hlYWRzL21hc3RlcikgJiYKKwl0ZXN0ICIkbWFzdGVyX21hc3RlciIgPSAiJG1pcnJvcl9tYXN0ZXIiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHVzaCBtaXJyb3IgdXBkYXRlcyBleGlzdGluZyBicmFuY2hlcycgJworCisJbWtfcmVwb19wYWlyICYmCisJKAorCQljZCBtYXN0ZXIgJiYKKwkJZWNobyBvbmUgPmZvbyAmJiBnaXQgYWRkIGZvbyAmJiBnaXQgY29tbWl0IC1tIG9uZSAmJgorCQlnaXQgcHVzaCAtLW1pcnJvciB1cCAmJgorCQllY2hvIHR3byA+Zm9vICYmIGdpdCBhZGQgZm9vICYmIGdpdCBjb21taXQgLW0gdHdvICYmCisJCWdpdCBwdXNoIC0tbWlycm9yIHVwCisJKSAmJgorCW1hc3Rlcl9tYXN0ZXI9JChjZCBtYXN0ZXIgJiYgZ2l0IHNob3ctcmVmIC1zIC0tdmVyaWZ5IHJlZnMvaGVhZHMvbWFzdGVyKSAmJgorCW1pcnJvcl9tYXN0ZXI9JChjZCBtaXJyb3IgJiYgZ2l0IHNob3ctcmVmIC1zIC0tdmVyaWZ5IHJlZnMvaGVhZHMvbWFzdGVyKSAmJgorCXRlc3QgIiRtYXN0ZXJfbWFzdGVyIiA9ICIkbWlycm9yX21hc3RlciIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdXNoIG1pcnJvciBmb3JjZSB1cGRhdGVzIGV4aXN0aW5nIGJyYW5jaGVzJyAnCisKKwlta19yZXBvX3BhaXIgJiYKKwkoCisJCWNkIG1hc3RlciAmJgorCQllY2hvIG9uZSA+Zm9vICYmIGdpdCBhZGQgZm9vICYmIGdpdCBjb21taXQgLW0gb25lICYmCisJCWdpdCBwdXNoIC0tbWlycm9yIHVwICYmCisJCWVjaG8gdHdvID5mb28gJiYgZ2l0IGFkZCBmb28gJiYgZ2l0IGNvbW1pdCAtbSB0d28gJiYKKwkJZ2l0IHB1c2ggLS1taXJyb3IgdXAgJiYKKwkJZ2l0IHJlc2V0IC0taGFyZCBIRUFEXgorCQlnaXQgcHVzaCAtLW1pcnJvciB1cAorCSkgJiYKKwltYXN0ZXJfbWFzdGVyPSQoY2QgbWFzdGVyICYmIGdpdCBzaG93LXJlZiAtcyAtLXZlcmlmeSByZWZzL2hlYWRzL21hc3RlcikgJiYKKwltaXJyb3JfbWFzdGVyPSQoY2QgbWlycm9yICYmIGdpdCBzaG93LXJlZiAtcyAtLXZlcmlmeSByZWZzL2hlYWRzL21hc3RlcikgJiYKKwl0ZXN0ICIkbWFzdGVyX21hc3RlciIgPSAiJG1pcnJvcl9tYXN0ZXIiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHVzaCBtaXJyb3IgcmVtb3ZlcyBicmFuY2hlcycgJworCisJbWtfcmVwb19wYWlyICYmCisJKAorCQljZCBtYXN0ZXIgJiYKKwkJZWNobyBvbmUgPmZvbyAmJiBnaXQgYWRkIGZvbyAmJiBnaXQgY29tbWl0IC1tIG9uZSAmJgorCQlnaXQgYnJhbmNoIHJlbW92ZSBtYXN0ZXIgJiYKKwkJZ2l0IHB1c2ggLS1taXJyb3IgdXAgJiYKKwkJZ2l0IGJyYW5jaCAtRCByZW1vdmUKKwkJZ2l0IHB1c2ggLS1taXJyb3IgdXAKKwkpICYmCisJKAorCQljZCBtaXJyb3IgJiYKKwkJaW52ZXJ0IGdpdCBzaG93LXJlZiAtcyAtLXZlcmlmeSByZWZzL2hlYWRzL3JlbW92ZQorCSkKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdXNoIG1pcnJvciBhZGRzLCB1cGRhdGVzIGFuZCByZW1vdmVzIGJyYW5jaGVzIHRvZ2V0aGVyJyAnCisKKwlta19yZXBvX3BhaXIgJiYKKwkoCisJCWNkIG1hc3RlciAmJgorCQllY2hvIG9uZSA+Zm9vICYmIGdpdCBhZGQgZm9vICYmIGdpdCBjb21taXQgLW0gb25lICYmCisJCWdpdCBicmFuY2ggcmVtb3ZlIG1hc3RlciAmJgorCQlnaXQgcHVzaCAtLW1pcnJvciB1cCAmJgorCQlnaXQgYnJhbmNoIC1EIHJlbW92ZSAmJgorCQlnaXQgYnJhbmNoIGFkZCBtYXN0ZXIgJiYKKwkJZWNobyB0d28gPmZvbyAmJiBnaXQgYWRkIGZvbyAmJiBnaXQgY29tbWl0IC1tIHR3byAmJgorCQlnaXQgcHVzaCAtLW1pcnJvciB1cAorCSkgJiYKKwltYXN0ZXJfbWFzdGVyPSQoY2QgbWFzdGVyICYmIGdpdCBzaG93LXJlZiAtcyAtLXZlcmlmeSByZWZzL2hlYWRzL21hc3RlcikgJiYKKwltYXN0ZXJfYWRkPSQoY2QgbWFzdGVyICYmIGdpdCBzaG93LXJlZiAtcyAtLXZlcmlmeSByZWZzL2hlYWRzL2FkZCkgJiYKKwltaXJyb3JfbWFzdGVyPSQoY2QgbWlycm9yICYmIGdpdCBzaG93LXJlZiAtcyAtLXZlcmlmeSByZWZzL2hlYWRzL21hc3RlcikgJiYKKwltaXJyb3JfYWRkPSQoY2QgbWlycm9yICYmIGdpdCBzaG93LXJlZiAtcyAtLXZlcmlmeSByZWZzL2hlYWRzL2FkZCkgJiYKKwl0ZXN0ICIkbWFzdGVyX21hc3RlciIgPSAiJG1pcnJvcl9tYXN0ZXIiICYmCisJdGVzdCAiJG1hc3Rlcl9hZGQiID0gIiRtaXJyb3JfYWRkIiAmJgorCSgKKwkJY2QgbWlycm9yICYmCisJCWludmVydCBnaXQgc2hvdy1yZWYgLXMgLS12ZXJpZnkgcmVmcy9oZWFkcy9yZW1vdmUKKwkpCisKKycKKworCisjIFRBRyB0ZXN0cwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHVzaCBtaXJyb3IgY3JlYXRlcyBuZXcgdGFncycgJworCisJbWtfcmVwb19wYWlyICYmCisJKAorCQljZCBtYXN0ZXIgJiYKKwkJZWNobyBvbmUgPmZvbyAmJiBnaXQgYWRkIGZvbyAmJiBnaXQgY29tbWl0IC1tIG9uZSAmJgorCQlnaXQgdGFnIC1mIHRtYXN0ZXIgbWFzdGVyICYmCisJCWdpdCBwdXNoIC0tbWlycm9yIHVwCisJKSAmJgorCW1hc3Rlcl9tYXN0ZXI9JChjZCBtYXN0ZXIgJiYgZ2l0IHNob3ctcmVmIC1zIC0tdmVyaWZ5IHJlZnMvdGFncy90bWFzdGVyKSAmJgorCW1pcnJvcl9tYXN0ZXI9JChjZCBtaXJyb3IgJiYgZ2l0IHNob3ctcmVmIC1zIC0tdmVyaWZ5IHJlZnMvdGFncy90bWFzdGVyKSAmJgorCXRlc3QgIiRtYXN0ZXJfbWFzdGVyIiA9ICIkbWlycm9yX21hc3RlciIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdXNoIG1pcnJvciB1cGRhdGVzIGV4aXN0aW5nIHRhZ3MnICcKKworCW1rX3JlcG9fcGFpciAmJgorCSgKKwkJY2QgbWFzdGVyICYmCisJCWVjaG8gb25lID5mb28gJiYgZ2l0IGFkZCBmb28gJiYgZ2l0IGNvbW1pdCAtbSBvbmUgJiYKKwkJZ2l0IHRhZyAtZiB0bWFzdGVyIG1hc3RlciAmJgorCQlnaXQgcHVzaCAtLW1pcnJvciB1cCAmJgorCQllY2hvIHR3byA+Zm9vICYmIGdpdCBhZGQgZm9vICYmIGdpdCBjb21taXQgLW0gdHdvICYmCisJCWdpdCB0YWcgLWYgdG1hc3RlciBtYXN0ZXIgJiYKKwkJZ2l0IHB1c2ggLS1taXJyb3IgdXAKKwkpICYmCisJbWFzdGVyX21hc3Rlcj0kKGNkIG1hc3RlciAmJiBnaXQgc2hvdy1yZWYgLXMgLS12ZXJpZnkgcmVmcy90YWdzL3RtYXN0ZXIpICYmCisJbWlycm9yX21hc3Rlcj0kKGNkIG1pcnJvciAmJiBnaXQgc2hvdy1yZWYgLXMgLS12ZXJpZnkgcmVmcy90YWdzL3RtYXN0ZXIpICYmCisJdGVzdCAiJG1hc3Rlcl9tYXN0ZXIiID0gIiRtaXJyb3JfbWFzdGVyIgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3B1c2ggbWlycm9yIGZvcmNlIHVwZGF0ZXMgZXhpc3RpbmcgdGFncycgJworCisJbWtfcmVwb19wYWlyICYmCisJKAorCQljZCBtYXN0ZXIgJiYKKwkJZWNobyBvbmUgPmZvbyAmJiBnaXQgYWRkIGZvbyAmJiBnaXQgY29tbWl0IC1tIG9uZSAmJgorCQlnaXQgdGFnIC1mIHRtYXN0ZXIgbWFzdGVyICYmCisJCWdpdCBwdXNoIC0tbWlycm9yIHVwICYmCisJCWVjaG8gdHdvID5mb28gJiYgZ2l0IGFkZCBmb28gJiYgZ2l0IGNvbW1pdCAtbSB0d28gJiYKKwkJZ2l0IHRhZyAtZiB0bWFzdGVyIG1hc3RlciAmJgorCQlnaXQgcHVzaCAtLW1pcnJvciB1cCAmJgorCQlnaXQgcmVzZXQgLS1oYXJkIEhFQUReCisJCWdpdCB0YWcgLWYgdG1hc3RlciBtYXN0ZXIgJiYKKwkJZ2l0IHB1c2ggLS1taXJyb3IgdXAKKwkpICYmCisJbWFzdGVyX21hc3Rlcj0kKGNkIG1hc3RlciAmJiBnaXQgc2hvdy1yZWYgLXMgLS12ZXJpZnkgcmVmcy90YWdzL3RtYXN0ZXIpICYmCisJbWlycm9yX21hc3Rlcj0kKGNkIG1pcnJvciAmJiBnaXQgc2hvdy1yZWYgLXMgLS12ZXJpZnkgcmVmcy90YWdzL3RtYXN0ZXIpICYmCisJdGVzdCAiJG1hc3Rlcl9tYXN0ZXIiID0gIiRtaXJyb3JfbWFzdGVyIgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3B1c2ggbWlycm9yIHJlbW92ZXMgdGFncycgJworCisJbWtfcmVwb19wYWlyICYmCisJKAorCQljZCBtYXN0ZXIgJiYKKwkJZWNobyBvbmUgPmZvbyAmJiBnaXQgYWRkIGZvbyAmJiBnaXQgY29tbWl0IC1tIG9uZSAmJgorCQlnaXQgdGFnIC1mIHRyZW1vdmUgbWFzdGVyICYmCisJCWdpdCBwdXNoIC0tbWlycm9yIHVwICYmCisJCWdpdCB0YWcgLWQgdHJlbW92ZQorCQlnaXQgcHVzaCAtLW1pcnJvciB1cAorCSkgJiYKKwkoCisJCWNkIG1pcnJvciAmJgorCQlpbnZlcnQgZ2l0IHNob3ctcmVmIC1zIC0tdmVyaWZ5IHJlZnMvdGFncy90cmVtb3ZlCisJKQorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3B1c2ggbWlycm9yIGFkZHMsIHVwZGF0ZXMgYW5kIHJlbW92ZXMgdGFncyB0b2dldGhlcicgJworCisJbWtfcmVwb19wYWlyICYmCisJKAorCQljZCBtYXN0ZXIgJiYKKwkJZWNobyBvbmUgPmZvbyAmJiBnaXQgYWRkIGZvbyAmJiBnaXQgY29tbWl0IC1tIG9uZSAmJgorCQlnaXQgdGFnIC1mIHRtYXN0ZXIgbWFzdGVyICYmCisJCWdpdCB0YWcgLWYgdHJlbW92ZSBtYXN0ZXIgJiYKKwkJZ2l0IHB1c2ggLS1taXJyb3IgdXAgJiYKKwkJZ2l0IHRhZyAtZCB0cmVtb3ZlICYmCisJCWdpdCB0YWcgdGFkZCBtYXN0ZXIgJiYKKwkJZWNobyB0d28gPmZvbyAmJiBnaXQgYWRkIGZvbyAmJiBnaXQgY29tbWl0IC1tIHR3byAmJgorCQlnaXQgdGFnIC1mIHRtYXN0ZXIgbWFzdGVyICYmCisJCWdpdCBwdXNoIC0tbWlycm9yIHVwCisJKSAmJgorCW1hc3Rlcl9tYXN0ZXI9JChjZCBtYXN0ZXIgJiYgZ2l0IHNob3ctcmVmIC1zIC0tdmVyaWZ5IHJlZnMvdGFncy90bWFzdGVyKSAmJgorCW1hc3Rlcl9hZGQ9JChjZCBtYXN0ZXIgJiYgZ2l0IHNob3ctcmVmIC1zIC0tdmVyaWZ5IHJlZnMvdGFncy90YWRkKSAmJgorCW1pcnJvcl9tYXN0ZXI9JChjZCBtaXJyb3IgJiYgZ2l0IHNob3ctcmVmIC1zIC0tdmVyaWZ5IHJlZnMvdGFncy90bWFzdGVyKSAmJgorCW1pcnJvcl9hZGQ9JChjZCBtaXJyb3IgJiYgZ2l0IHNob3ctcmVmIC1zIC0tdmVyaWZ5IHJlZnMvdGFncy90YWRkKSAmJgorCXRlc3QgIiRtYXN0ZXJfbWFzdGVyIiA9ICIkbWlycm9yX21hc3RlciIgJiYKKwl0ZXN0ICIkbWFzdGVyX2FkZCIgPSAiJG1pcnJvcl9hZGQiICYmCisJKAorCQljZCBtaXJyb3IgJiYKKwkJaW52ZXJ0IGdpdCBzaG93LXJlZiAtcyAtLXZlcmlmeSByZWZzL3RhZ3MvdHJlbW92ZQorCSkKKworJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDU1MjAtcHVsbC5zaCBiL3QvdDU1MjAtcHVsbC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NDg0MTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTUyMC1wdWxsLnNoCkBAIC0wLDAgKzEsOTUgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdwdWxsaW5nIGludG8gdm9pZCcKKworLiAuL3Rlc3QtbGliLnNoCisKK0Q9YHB3ZGAKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwllY2hvIGZpbGUgPmZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tIG9yaWdpbmFsCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHVsbGluZyBpbnRvIHZvaWQnICcKKwlta2RpciBjbG9uZWQgJiYKKwljZCBjbG9uZWQgJiYKKwlnaXQgaW5pdCAmJgorCWdpdCBwdWxsIC4uCisnCisKK2NkICIkRCIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2tpbmcgdGhlIHJlc3VsdHMnICcKKwl0ZXN0IC1mIGZpbGUgJiYKKwl0ZXN0IC1mIGNsb25lZC9maWxlICYmCisJZGlmZiBmaWxlIGNsb25lZC9maWxlCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Rlc3QgLiBhcyBhIHJlbW90ZScgJworCisJZ2l0IGJyYW5jaCBjb3B5IG1hc3RlciAmJgorCWdpdCBjb25maWcgYnJhbmNoLmNvcHkucmVtb3RlIC4gJiYKKwlnaXQgY29uZmlnIGJyYW5jaC5jb3B5Lm1lcmdlIHJlZnMvaGVhZHMvbWFzdGVyICYmCisJZWNobyB1cGRhdGVkID5maWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSB1cGRhdGVkICYmCisJZ2l0IGNoZWNrb3V0IGNvcHkgJiYKKwl0ZXN0IGBjYXQgZmlsZWAgPSBmaWxlICYmCisJZ2l0IHB1bGwgJiYKKwl0ZXN0IGBjYXQgZmlsZWAgPSB1cGRhdGVkCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3RoZSBkZWZhdWx0IHJlbW90ZSAuIHNob3VsZCBub3QgYnJlYWsgZXhwbGljaXQgcHVsbCcgJworCWdpdCBjaGVja291dCAtYiBzZWNvbmQgbWFzdGVyXiAmJgorCWVjaG8gbW9kaWZpZWQgPmZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tIG1vZGlmaWVkICYmCisJZ2l0IGNoZWNrb3V0IGNvcHkgJiYKKwlnaXQgcmVzZXQgLS1oYXJkIEhFQUReICYmCisJdGVzdCBgY2F0IGZpbGVgID0gZmlsZSAmJgorCWdpdCBwdWxsIC4gc2Vjb25kICYmCisJdGVzdCBgY2F0IGZpbGVgID0gbW9kaWZpZWQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLS1yZWJhc2UnICcKKwlnaXQgYnJhbmNoIHRvLXJlYmFzZSAmJgorCWVjaG8gbW9kaWZpZWQgYWdhaW4gPiBmaWxlICYmCisJZ2l0IGNvbW1pdCAtbSBmaWxlIGZpbGUgJiYKKwlnaXQgY2hlY2tvdXQgdG8tcmViYXNlICYmCisJZWNobyBuZXcgPiBmaWxlMiAmJgorCWdpdCBhZGQgZmlsZTIgJiYKKwlnaXQgY29tbWl0IC1tICJuZXcgZmlsZSIgJiYKKwlnaXQgdGFnIGJlZm9yZS1yZWJhc2UgJiYKKwlnaXQgcHVsbCAtLXJlYmFzZSAuIGNvcHkgJiYKKwl0ZXN0ICQoZ2l0IHJldi1wYXJzZSBIRUFEXikgPSAkKGdpdCByZXYtcGFyc2UgY29weSkgJiYKKwl0ZXN0IG5ldyA9ICQoZ2l0IHNob3cgSEVBRDpmaWxlMikKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYnJhbmNoLnRvLXJlYmFzZS5yZWJhc2UnICcKKwlnaXQgcmVzZXQgLS1oYXJkIGJlZm9yZS1yZWJhc2UgJiYKKwlnaXQgY29uZmlnIGJyYW5jaC50by1yZWJhc2UucmViYXNlIDEgJiYKKwlnaXQgcHVsbCAuIGNvcHkgJiYKKwlnaXQgY29uZmlnIGJyYW5jaC50by1yZWJhc2UucmViYXNlIDAgJiYKKwl0ZXN0ICQoZ2l0IHJldi1wYXJzZSBIRUFEXikgPSAkKGdpdCByZXYtcGFyc2UgY29weSkgJiYKKwl0ZXN0IG5ldyA9ICQoZ2l0IHNob3cgSEVBRDpmaWxlMikKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLS1yZWJhc2Ugd2l0aCByZWJhc2VkIHVwc3RyZWFtJyAnCisKKwlnaXQgcmVtb3RlIGFkZCAtZiBtZSAuICYmCisJZ2l0IGNoZWNrb3V0IGNvcHkgJiYKKwlnaXQgcmVzZXQgLS1oYXJkIEhFQUReICYmCisJZWNobyBjb25mbGljdGluZyBtb2RpZmljYXRpb24gPiBmaWxlICYmCisJZ2l0IGNvbW1pdCAtbSBjb25mbGljdCBmaWxlICYmCisJZ2l0IGNoZWNrb3V0IHRvLXJlYmFzZSAmJgorCWVjaG8gZmlsZSA+IGZpbGUyICYmCisJZ2l0IGNvbW1pdCAtbSB0by1yZWJhc2UgZmlsZTIgJiYKKwlnaXQgcHVsbCAtLXJlYmFzZSBtZSBjb3B5ICYmCisJdGVzdCAiY29uZmxpY3RpbmcgbW9kaWZpY2F0aW9uIiA9ICIkKGNhdCBmaWxlKSIgJiYKKwl0ZXN0IGZpbGUgPSAkKGNhdCBmaWxlMikKKworJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDU1MzAtdXBsb2FkLXBhY2stZXJyb3Iuc2ggYi90L3Q1NTMwLXVwbG9hZC1wYWNrLWVycm9yLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhiMDUwOTEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTMwLXVwbG9hZC1wYWNrLWVycm9yLnNoCkBAIC0wLDAgKzEsNzMgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdlcnJvcnMgaW4gdXBsb2FkLXBhY2snCisKKy4gLi90ZXN0LWxpYi5zaAorCitEPWBwd2RgCisKK2NvcnJ1cHRfcmVwbyAoKSB7CisJb2JqZWN0X3NoYTE9JChnaXQgcmV2LXBhcnNlICIkMSIpICYmCisJb2I9JChleHByICIkb2JqZWN0X3NoYTEiIDogIlwoLi5cKSIpICYmCisJamVjdD0kKGV4cHIgIiRvYmplY3Rfc2hhMSIgOiAiLi5cKC4uKlwpIikgJiYKKwlybSAtZiAiLmdpdC9vYmplY3RzLyRvYi8kamVjdCIKK30KKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgYW5kIGNvcnJ1cHQgcmVwb3NpdG9yeScgJworCisJZWNobyBmaWxlID5maWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJZ2l0IHJldi1wYXJzZSA6ZmlsZSAmJgorCWdpdCBjb21taXQgLWEgLW0gb3JpZ2luYWwgJiYKKwl0ZXN0X3RpY2sgJiYKKwllY2hvIGNoYW5nZWQgPmZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tIGNoYW5nZWQgJiYKKwljb3JydXB0X3JlcG8gSEVBRDpmaWxlCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZnNjayBmYWlscycgJworCSEgZ2l0IGZzY2sKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBsb2FkLXBhY2sgZmFpbHMgZHVlIHRvIGVycm9yIGluIHBhY2stb2JqZWN0cycgJworCisJISBlY2hvICIwMDMyd2FudCAkKGdpdCByZXYtcGFyc2UgSEVBRCkKKzAwMDAwMDA5ZG9uZQorMDAwMCIgfCBnaXQtdXBsb2FkLXBhY2sgLiA+IC9kZXYvbnVsbCAyPiBvdXRwdXQuZXJyICYmCisJZ3JlcCAicGFjay1vYmplY3RzIGRpZWQiIG91dHB1dC5lcnIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY29ycnVwdCByZXBvIGRpZmZlcmVudGx5JyAnCisKKwlnaXQgaGFzaC1vYmplY3QgLXcgZmlsZSAmJgorCWNvcnJ1cHRfcmVwbyBIRUFEXl57dHJlZX0KKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmc2NrIGZhaWxzJyAnCisJISBnaXQgZnNjaworJwordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBsb2FkLXBhY2sgZmFpbHMgZHVlIHRvIGVycm9yIGluIHJldi1saXN0JyAnCisKKwkhIGVjaG8gIjAwMzJ3YW50ICQoZ2l0IHJldi1wYXJzZSBIRUFEKQorMDAwMDAwMDlkb25lCiswMDAwIiB8IGdpdC11cGxvYWQtcGFjayAuID4gL2Rldi9udWxsIDI+IG91dHB1dC5lcnIgJiYKKwlncmVwICJ3YWl0cGlkIChhc3luYykgZmFpbGVkIiBvdXRwdXQuZXJyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NyZWF0ZSBlbXB0eSByZXBvc2l0b3J5JyAnCisKKwlta2RpciBmb28gJiYKKwljZCBmb28gJiYKKwlnaXQgaW5pdAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZldGNoIGZhaWxzJyAnCisKKwkhIGdpdCBmZXRjaCAuLiBtYXN0ZXIKKworJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDU1NDAtaHR0cC1wdXNoLnNoIGIvdC90NTU0MC1odHRwLXB1c2guc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzM3MjQzOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU1NDAtaHR0cC1wdXNoLnNoCkBAIC0wLDAgKzEsNzMgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDggQ2xlbWVucyBCdWNoYWNoZXIgPGRyaXp6ZEBhb24uYXQ+CisjCisKK3Rlc3RfZGVzY3JpcHRpb249J3Rlc3QgaHR0cC1wdXNoCisKK1RoaXMgdGVzdCBydW5zIHZhcmlvdXMgc2FuaXR5IGNoZWNrcyBvbiBodHRwLXB1c2guJworCisuIC4vdGVzdC1saWIuc2gKKworUk9PVF9QQVRIPSIkUFdEIgorTElCX0hUVFBEX0RBVj10CisKKy4gLi4vbGliLWh0dHBkLnNoCisKK2lmICEgc3RhcnRfaHR0cGQgPiYzIDI+JjQKK3RoZW4KKwlzYXkgInNraXBwaW5nIHRlc3QsIHdlYiBzZXJ2ZXIgc2V0dXAgZmFpbGVkIgorCXRlc3RfZG9uZQorCWV4aXQKK2ZpCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NldHVwIHJlbW90ZSByZXBvc2l0b3J5JyAnCisJY2QgIiRST09UX1BBVEgiICYmCisJbWtkaXIgdGVzdF9yZXBvICYmCisJY2QgdGVzdF9yZXBvICYmCisJZ2l0IGluaXQgJiYKKwk6ID5wYXRoMSAmJgorCWdpdCBhZGQgcGF0aDEgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIGluaXRpYWwgJiYKKwljZCAtICYmCisJZ2l0IGNsb25lIC0tYmFyZSB0ZXN0X3JlcG8gdGVzdF9yZXBvLmdpdCAmJgorCWNkIHRlc3RfcmVwby5naXQgJiYKKwlnaXQgLS1iYXJlIHVwZGF0ZS1zZXJ2ZXItaW5mbyAmJgorCWNobW9kICt4IGhvb2tzL3Bvc3QtdXBkYXRlICYmCisJY2QgLSAmJgorCW12IHRlc3RfcmVwby5naXQgJEhUVFBEX0RPQ1VNRU5UX1JPT1RfUEFUSAorJworCQordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2xvbmUgcmVtb3RlIHJlcG9zaXRvcnknICcKKwljZCAiJFJPT1RfUEFUSCIgJiYKKwlnaXQgY2xvbmUgJEhUVFBEX1VSTC90ZXN0X3JlcG8uZ2l0IHRlc3RfcmVwb19jbG9uZQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdXNoIHRvIHJlbW90ZSByZXBvc2l0b3J5JyAnCisJY2QgIiRST09UX1BBVEgiL3Rlc3RfcmVwb19jbG9uZSAmJgorCTogPnBhdGgyICYmCisJZ2l0IGFkZCBwYXRoMiAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gcGF0aDIgJiYKKwlnaXQgcHVzaAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjcmVhdGUgYW5kIGRlbGV0ZSByZW1vdGUgYnJhbmNoJyAnCisJY2QgIiRST09UX1BBVEgiL3Rlc3RfcmVwb19jbG9uZSAmJgorCWdpdCBjaGVja291dCAtYiBkZXYgJiYKKwk6ID5wYXRoMyAmJgorCWdpdCBhZGQgcGF0aDMgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIGRldiAmJgorCWdpdCBwdXNoIG9yaWdpbiBkZXYgJiYKKwlnaXQgZmV0Y2ggJiYKKwlnaXQgcHVzaCBvcmlnaW4gOmRldiAmJgorCWdpdCBicmFuY2ggLWQgLXIgb3JpZ2luL2RldiAmJgorCWdpdCBmZXRjaCAmJgorCSEgZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IHJlZnMvcmVtb3Rlcy9vcmlnaW4vZGV2CisnCisKK3N0b3BfaHR0cGQKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1NjAwLWNsb25lLWZhaWwtY2xlYW51cC5zaCBiL3QvdDU2MDAtY2xvbmUtZmFpbC1jbGVhbnVwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFjZjM0Y2UKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NjAwLWNsb25lLWZhaWwtY2xlYW51cC5zaApAQCAtMCwwICsxLDQyIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA2IENhcmwgRC4gV29ydGggPGN3b3J0aEBjd29ydGgub3JnPgorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSd0ZXN0IGdpdC1jbG9uZSB0byBjbGVhbnVwIGFmdGVyIGZhaWx1cmUKKworVGhpcyB0ZXN0IGNvdmVycyB0aGUgZmFjdCB0aGF0IGlmIGdpdC1jbG9uZSBmYWlscywgaXQgc2hvdWxkIHJlbW92ZQordGhlIGRpcmVjdG9yeSBpdCBjcmVhdGVkLCB0byBhdm9pZCB0aGUgdXNlciBoYXZpbmcgdG8gbWFudWFsbHkKK3JlbW92ZSB0aGUgZGlyZWN0b3J5IGJlZm9yZSBhdHRlbXB0aW5nIGEgY2xvbmUgYWdhaW4uJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2Nsb25lIG9mIG5vbi1leGlzdGVudCBzb3VyY2Ugc2hvdWxkIGZhaWwnIFwKKyAgICAnISBnaXQtY2xvbmUgZm9vIGJhcicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2ZhaWxlZCBjbG9uZSBzaG91bGQgbm90IGxlYXZlIGEgZGlyZWN0b3J5JyBcCisgICAgJyEgdGVzdCAtZCBiYXInCisKKyMgTmVlZCBhIHJlcG8gdG8gY2xvbmUKK3Rlc3RfY3JlYXRlX3JlcG8gZm9vCisKKyMgY2xvbmUgZG9lc24ndCBsaWtlIGl0IGlmIHRoZXJlIGlzIG5vIEhFQUQuIElzIHRoYXQgYSBidWc/CisoY2QgZm9vICYmIHRvdWNoIGZpbGUgJiYgZ2l0IGFkZCBmaWxlICYmIGdpdCBjb21taXQgLW0gJ2FkZCBmaWxlJyA+L2Rldi9udWxsIDI+JjEpCisKKyMgc291cmNlIHJlcG9zaXRvcnkgZ2l2ZW4gdG8gZ2l0LWNsb25lIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUKKyMgY3VycmVudCBwYXRoIG5vdCB0byB0aGUgdGFyZ2V0IGRpcgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2Nsb25lIG9mIG5vbi1leGlzdGVudCAocmVsYXRpdmUgdG8gJFBXRCkgc291cmNlIHNob3VsZCBmYWlsJyBcCisgICAgJyEgZ2l0LWNsb25lIC4uL2ZvbyBiYXonCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjbG9uZSBzaG91bGQgd29yayBub3cgdGhhdCBzb3VyY2UgZXhpc3RzJyBcCisgICAgJ2dpdC1jbG9uZSBmb28gYmFyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc3VjY2Vzc2Z1bCBjbG9uZSBtdXN0IGxlYXZlIHRoZSBkaXJlY3RvcnknIFwKKyAgICAnY2QgYmFyJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDU3MDAtY2xvbmUtcmVmZXJlbmNlLnNoIGIvdC90NTcwMC1jbG9uZS1yZWZlcmVuY2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjZhNTQ4NgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU3MDAtY2xvbmUtcmVmZXJlbmNlLnNoCkBAIC0wLDAgKzEsMTE2IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA2IE1hcnRpbiBXYWl0eiA8dGFsaUBhZG1pbmdpbGRlLm9yZz4KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0ndGVzdCBjbG9uZSAtLXJlZmVyZW5jZScKKy4gLi90ZXN0LWxpYi5zaAorCitiYXNlX2Rpcj1gcHdkYAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwcmVwYXJpbmcgZmlyc3QgcmVwb3NpdG9yeScgXAorJ3Rlc3RfY3JlYXRlX3JlcG8gQSAmJiBjZCBBICYmCitlY2hvIGZpcnN0ID4gZmlsZTEgJiYKK2dpdCBhZGQgZmlsZTEgJiYKK2dpdCBjb21taXQgLW0gaW5pdGlhbCcKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHJlcGFyaW5nIHNlY29uZCByZXBvc2l0b3J5JyBcCisnZ2l0IGNsb25lIEEgQiAmJiBjZCBCICYmCitlY2hvIHNlY29uZCA+IGZpbGUyICYmCitnaXQgYWRkIGZpbGUyICYmCitnaXQgY29tbWl0IC1tIGFkZGl0aW9uICYmCitnaXQgcmVwYWNrIC1hIC1kICYmCitnaXQgcHJ1bmUnCisKK2NkICIkYmFzZV9kaXIiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Nsb25pbmcgd2l0aCByZWZlcmVuY2UgKC1sIC1zKScgXAorJ2dpdCBjbG9uZSAtbCAtcyAtLXJlZmVyZW5jZSBCIEEgQycKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZXhpc3RlbmNlIG9mIGluZm8vYWx0ZXJuYXRlcycgXAorJ3Rlc3QgYHdjIC1sIDxDLy5naXQvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXNgID0gMicKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHVsbGluZyBmcm9tIHJlZmVyZW5jZScgXAorJ2NkIEMgJiYKK2dpdCBwdWxsIC4uL0IgbWFzdGVyJworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0aGF0IHJlZmVyZW5jZSBnZXRzIHVzZWQnIFwKKydjZCBDICYmCitlY2hvICIwIG9iamVjdHMsIDAga2lsb2J5dGVzIiA+IGV4cGVjdGVkICYmCitnaXQgY291bnQtb2JqZWN0cyA+IGN1cnJlbnQgJiYKK2RpZmYgZXhwZWN0ZWQgY3VycmVudCcKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2xvbmluZyB3aXRoIHJlZmVyZW5jZSAobm8gLWwgLXMpJyBcCisnZ2l0IGNsb25lIC0tcmVmZXJlbmNlIEIgZmlsZTovL2Bwd2RgL0EgRCcKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZXhpc3RlbmNlIG9mIGluZm8vYWx0ZXJuYXRlcycgXAorJ3Rlc3QgYHdjIC1sIDxELy5naXQvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXNgID0gMScKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHVsbGluZyBmcm9tIHJlZmVyZW5jZScgXAorJ2NkIEQgJiYgZ2l0IHB1bGwgLi4vQiBtYXN0ZXInCisKK2NkICIkYmFzZV9kaXIiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3RoYXQgcmVmZXJlbmNlIGdldHMgdXNlZCcgXAorJ2NkIEQgJiYgZWNobyAiMCBvYmplY3RzLCAwIGtpbG9ieXRlcyIgPiBleHBlY3RlZCAmJgorZ2l0IGNvdW50LW9iamVjdHMgPiBjdXJyZW50ICYmCitkaWZmIGV4cGVjdGVkIGN1cnJlbnQnCisKK2NkICIkYmFzZV9kaXIiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VwZGF0aW5nIG9yaWdpbicgXAorJ2NkIEEgJiYKK2VjaG8gdGhpcmQgPiBmaWxlMyAmJgorZ2l0IGFkZCBmaWxlMyAmJgorZ2l0IGNvbW1pdCAtbSB1cGRhdGUgJiYKK2dpdCByZXBhY2sgLWEgLWQgJiYKK2dpdCBwcnVuZScKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHVsbGluZyBjaGFuZ2VzIGZyb20gb3JpZ2luJyBcCisnY2QgQyAmJgorZ2l0IHB1bGwgb3JpZ2luJworCitjZCAiJGJhc2VfZGlyIgorCisjIHRoZSAyIGxvY2FsIG9iamVjdHMgYXJlIGNvbW1pdCBhbmQgdHJlZSBmcm9tIHRoZSBtZXJnZQordGVzdF9leHBlY3Rfc3VjY2VzcyAndGhhdCBhbHRlcm5hdGUgdG8gb3JpZ2luIGdldHMgdXNlZCcgXAorJ2NkIEMgJiYKK2VjaG8gIjIgb2JqZWN0cyIgPiBleHBlY3RlZCAmJgorZ2l0IGNvdW50LW9iamVjdHMgfCBjdXQgLWQsIC1mMSA+IGN1cnJlbnQgJiYKK2RpZmYgZXhwZWN0ZWQgY3VycmVudCcKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHVsbGluZyBjaGFuZ2VzIGZyb20gb3JpZ2luJyBcCisnY2QgRCAmJgorZ2l0IHB1bGwgb3JpZ2luJworCitjZCAiJGJhc2VfZGlyIgorCisjIHRoZSA1IGxvY2FsIG9iamVjdHMgYXJlIGV4cGVjdGVkOyBmaWxlMyBibG9iLCBjb21taXQgaW4gQSB0byBhZGQgaXQKKyMgYW5kIGl0cyB0cmVlLCBhbmQgMiBhcmUgb3VyIHRyZWUgYW5kIHRoZSBtZXJnZSBjb21taXQuCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBvYmplY3RzIGV4cGVjdGVkIHRvIGV4aXN0IGxvY2FsbHknIFwKKydjZCBEICYmCitlY2hvICI1IG9iamVjdHMiID4gZXhwZWN0ZWQgJiYKK2dpdCBjb3VudC1vYmplY3RzIHwgY3V0IC1kLCAtZjEgPiBjdXJyZW50ICYmCitkaWZmIGV4cGVjdGVkIGN1cnJlbnQnCisKK2NkICIkYmFzZV9kaXIiCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NTcwMS1jbG9uZS1sb2NhbC5zaCBiL3QvdDU3MDEtY2xvbmUtbG9jYWwuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGRmYWFhNAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU3MDEtY2xvbmUtbG9jYWwuc2gKQEAgLTAsMCArMSwxMTkgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSd0ZXN0IGxvY2FsIGNsb25lJworLiAuL3Rlc3QtbGliLnNoCisKK0Q9YHB3ZGAKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHJlcGFyaW5nIG9yaWdpbiByZXBvc2l0b3J5JyAnCisJOiA+ZmlsZSAmJiBnaXQgYWRkIC4gJiYgZ2l0IGNvbW1pdCAtbTEgJiYKKwlnaXQgY2xvbmUgLS1iYXJlIC4gYS5naXQgJiYKKwlnaXQgY2xvbmUgLS1iYXJlIC4geCAmJgorCXRlc3QgIiQoR0lUX0NPTkZJRz1hLmdpdC9jb25maWcgZ2l0IGNvbmZpZyAtLWJvb2wgY29yZS5iYXJlKSIgPSB0cnVlICYmCisJdGVzdCAiJChHSVRfQ09ORklHPXgvY29uZmlnIGdpdCBjb25maWcgLS1ib29sIGNvcmUuYmFyZSkiID0gdHJ1ZQorCWdpdCBidW5kbGUgY3JlYXRlIGIxLmJ1bmRsZSAtLWFsbCBIRUFEICYmCisJZ2l0IGJ1bmRsZSBjcmVhdGUgYjIuYnVuZGxlIC0tYWxsICYmCisJbWtkaXIgZGlyICYmCisJY3AgYjEuYnVuZGxlIGRpci9iMworCWNwIGIxLmJ1bmRsZSBiNAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdsb2NhbCBjbG9uZSB3aXRob3V0IC5naXQgc3VmZml4JyAnCisJY2QgIiREIiAmJgorCWdpdCBjbG9uZSAtbCAtcyBhIGIgJiYKKwljZCBiICYmCisJdGVzdCAiJChHSVRfQ09ORklHPS5naXQvY29uZmlnIGdpdCBjb25maWcgLS1ib29sIGNvcmUuYmFyZSkiID0gZmFsc2UgJiYKKwlnaXQgZmV0Y2gKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbG9jYWwgY2xvbmUgd2l0aCAuZ2l0IHN1ZmZpeCcgJworCWNkICIkRCIgJiYKKwlnaXQgY2xvbmUgLWwgLXMgYS5naXQgYyAmJgorCWNkIGMgJiYKKwlnaXQgZmV0Y2gKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbG9jYWwgY2xvbmUgZnJvbSB4JyAnCisJY2QgIiREIiAmJgorCWdpdCBjbG9uZSAtbCAtcyB4IHkgJiYKKwljZCB5ICYmCisJZ2l0IGZldGNoCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2xvY2FsIGNsb25lIGZyb20geC5naXQgdGhhdCBkb2VzIG5vdCBleGlzdCcgJworCWNkICIkRCIgJiYKKwlpZiBnaXQgY2xvbmUgLWwgLXMgeC5naXQgegorCXRoZW4KKwkJZWNobyAiT29wcywgc2hvdWxkIGhhdmUgZmFpbGVkIgorCQlmYWxzZQorCWVsc2UKKwkJZWNobyBoYXBweQorCWZpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ1dpdGggLW5vLWhhcmRsaW5rcywgbG9jYWwgd2lsbCBtYWtlIGEgY29weScgJworCWNkICIkRCIgJiYKKwlnaXQgY2xvbmUgLS1iYXJlIC0tbm8taGFyZGxpbmtzIHggdyAmJgorCWNkIHcgJiYKKwlsaW5rZWQ9JChmaW5kIG9iamVjdHMgLXR5cGUgZiAhIC1saW5rcyAxIHwgd2MgLWwpICYmCisJdGVzdCAwID0gJGxpbmtlZAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdFdmVuIHdpdGhvdXQgLWwsIGxvY2FsIHdpbGwgbWFrZSBhIGhhcmRsaW5rJyAnCisJY2QgIiREIiAmJgorCXJtIC1mciB3ICYmCisJZ2l0IGNsb25lIC1sIC0tYmFyZSB4IHcgJiYKKwljZCB3ICYmCisJY29waWVkPSQoZmluZCBvYmplY3RzIC10eXBlIGYgLWxpbmtzIDEgfCB3YyAtbCkgJiYKKwl0ZXN0IDAgPSAkY29waWVkCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2xvY2FsIGNsb25lIG9mIHJlcG8gd2l0aCBub25leGlzdGVudCByZWYgaW4gSEVBRCcgJworCWNkICIkRCIgJiYKKwllY2hvICJyZWY6IHJlZnMvaGVhZHMvbm9uZXhpc3RlbnQiID4gYS5naXQvSEVBRCAmJgorCWdpdCBjbG9uZSBhIGQgJiYKKwljZCBkICYmCisJZ2l0IGZldGNoICYmCisJdGVzdCAhIC1lIC5naXQvcmVmcy9yZW1vdGVzL29yaWdpbi9IRUFEJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdidW5kbGUgY2xvbmUgd2l0aG91dCAuYnVuZGxlIHN1ZmZpeCcgJworCWNkICIkRCIgJiYKKwlnaXQgY2xvbmUgZGlyL2IzICYmCisJY2QgYjMgJiYKKwlnaXQgZmV0Y2gKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYnVuZGxlIGNsb25lIHdpdGggLmJ1bmRsZSBzdWZmaXgnICcKKwljZCAiJEQiICYmCisJZ2l0IGNsb25lIGIxLmJ1bmRsZSAmJgorCWNkIGIxICYmCisJZ2l0IGZldGNoCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2J1bmRsZSBjbG9uZSBmcm9tIGI0JyAnCisJY2QgIiREIiAmJgorCWdpdCBjbG9uZSBiNCBiZGwgJiYKKwljZCBiZGwgJiYKKwlnaXQgZmV0Y2gKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYnVuZGxlIGNsb25lIGZyb20gYjQuYnVuZGxlIHRoYXQgZG9lcyBub3QgZXhpc3QnICcKKwljZCAiJEQiICYmCisJaWYgZ2l0IGNsb25lIGI0LmJ1bmRsZSBiYgorCXRoZW4KKwkJZWNobyAiT29wcywgc2hvdWxkIGhhdmUgZmFpbGVkIgorCQlmYWxzZQorCWVsc2UKKwkJZWNobyBoYXBweQorCWZpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2J1bmRsZSBjbG9uZSB3aXRoIG5vbmV4aXN0ZW50IEhFQUQnICcKKwljZCAiJEQiICYmCisJZ2l0IGNsb25lIGIyLmJ1bmRsZSBiMiAmJgorCWNkIGIyICYmCisJZ2l0IGZldGNoCisJdGVzdCAhIC1lIC5naXQvcmVmcy9oZWFkcy9tYXN0ZXIKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1NzAyLWNsb25lLW9wdGlvbnMuc2ggYi90L3Q1NzAyLWNsb25lLW9wdGlvbnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzI4ZTRkOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU3MDItY2xvbmUtb3B0aW9ucy5zaApAQCAtMCwwICsxLDIyIEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nYmFzaWMgY2xvbmUgb3B0aW9ucycKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCcgJworCisJbWtkaXIgcGFyZW50ICYmCisJKGNkIHBhcmVudCAmJiBnaXQgaW5pdCAmJgorCSBlY2hvIG9uZSA+ZmlsZSAmJiBnaXQgYWRkIGZpbGUgJiYKKwkgZ2l0IGNvbW1pdCAtbSBvbmUpCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2xvbmUgLW8nICcKKworCWdpdCBjbG9uZSAtbyBmb28gcGFyZW50IGNsb25lLW8gJiYKKwkoY2QgY2xvbmUtbyAmJiBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IHJlZnMvcmVtb3Rlcy9mb28vbWFzdGVyKQorCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NTcxMC1pbmZvLWFsdGVybmF0ZS5zaCBiL3QvdDU3MTAtaW5mby1hbHRlcm5hdGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTEwY2NiNAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU3MTAtaW5mby1hbHRlcm5hdGUuc2gKQEAgLTAsMCArMSwxMTIgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDYgTWFydGluIFdhaXR6IDx0YWxpQGFkbWluZ2lsZGUub3JnPgorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSd0ZXN0IHRyYW5zaXRpdmUgaW5mby9hbHRlcm5hdGUgZW50cmllcycKKy4gLi90ZXN0LWxpYi5zaAorCisjIHRlc3QgdGhhdCBhIGZpbGUgaXMgbm90IHJlYWNoYWJsZSBpbiB0aGUgY3VycmVudCByZXBvc2l0b3J5CisjIGJ1dCB0aGF0IGl0IGlzIGFmdGVyIGNyZWF0aW5nIGEgaW5mby9hbHRlcm5hdGUgZW50cnkKK3JlYWNoYWJsZV92aWEoKSB7CisJYWx0ZXJuYXRlPSIkMSIKKwlmaWxlPSIkMiIKKwlpZiBnaXQgY2F0LWZpbGUgLWUgIkhFQUQ6JGZpbGUiOyB0aGVuIHJldHVybiAxOyBmaQorCWVjaG8gIiRhbHRlcm5hdGUiID4+IC5naXQvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZQorCWdpdCBjYXQtZmlsZSAtZSAiSEVBRDokZmlsZSIKK30KKwordGVzdF92YWxpZF9yZXBvKCkgeworCWdpdCBmc2NrIC0tZnVsbCA+IGZzY2subG9nICYmCisJdGVzdCBgd2MgLWwgPCBmc2NrLmxvZ2AgPSAwCit9CisKK2Jhc2VfZGlyPWBwd2RgCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ByZXBhcmluZyBmaXJzdCByZXBvc2l0b3J5JyBcCisndGVzdF9jcmVhdGVfcmVwbyBBICYmIGNkIEEgJiYKK2VjaG8gIkhlbGxvIFdvcmxkIiA+IGZpbGUxICYmCitnaXQgYWRkIGZpbGUxICYmCitnaXQgY29tbWl0IC1tICJJbml0aWFsIGNvbW1pdCIgZmlsZTEgJiYKK2dpdCByZXBhY2sgLWEgLWQgJiYKK2dpdCBwcnVuZScKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHJlcGFyaW5nIHNlY29uZCByZXBvc2l0b3J5JyBcCisnZ2l0IGNsb25lIC1sIC1zIEEgQiAmJiBjZCBCICYmCitlY2hvICJmb28gYmFyIiA+IGZpbGUyICYmCitnaXQgYWRkIGZpbGUyICYmCitnaXQgY29tbWl0IC1tICJuZXh0IGNvbW1pdCIgZmlsZTIgJiYKK2dpdCByZXBhY2sgLWEgLWQgLWwgJiYKK2dpdCBwcnVuZScKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHJlcGFyaW5nIHRoaXJkIHJlcG9zaXRvcnknIFwKKydnaXQgY2xvbmUgLWwgLXMgQiBDICYmIGNkIEMgJiYKK2VjaG8gIkdvb2RieWUsIGNydWVsIHdvcmxkIiA+IGZpbGUzICYmCitnaXQgYWRkIGZpbGUzICYmCitnaXQgY29tbWl0IC1tICJvbmUgbW9yZSIgZmlsZTMgJiYKK2dpdCByZXBhY2sgLWEgLWQgLWwgJiYKK2dpdCBwcnVuZScKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY3JlYXRpbmcgdG9vIGRlZXAgbmVzdGluZycgXAorJ2dpdCBjbG9uZSAtbCAtcyBDIEQgJiYKK2dpdCBjbG9uZSAtbCAtcyBEIEUgJiYKK2dpdCBjbG9uZSAtbCAtcyBFIEYgJiYKK2dpdCBjbG9uZSAtbCAtcyBGIEcgJiYKK2dpdCBjbG9uZSAtbCAtcyBHIEgnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ludmFsaWRpdHkgb2YgZGVlcGVzdCByZXBvc2l0b3J5JyBcCisnY2QgSCAmJiB7CisJdGVzdF92YWxpZF9yZXBvCisJdGVzdCAkPyAtbmUgMAorfScKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndmFsaWRpdHkgb2YgdGhpcmQgcmVwb3NpdG9yeScgXAorJ2NkIEMgJiYKK3Rlc3RfdmFsaWRfcmVwbycKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndmFsaWRpdHkgb2YgZm91cnRoIHJlcG9zaXRvcnknIFwKKydjZCBEICYmCit0ZXN0X3ZhbGlkX3JlcG8nCisKK2NkICIkYmFzZV9kaXIiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2JyZWFraW5nIG9mIGxvb3BzJyBcCisiZWNobyAnJGJhc2VfZGlyL0IvLmdpdC9vYmplY3RzJyA+PiAnJGJhc2VfZGlyJy9BLy5naXQvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXMmJgorY2QgQyAmJgordGVzdF92YWxpZF9yZXBvIgorCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0aGF0IGluZm8vYWx0ZXJuYXRlcyBpcyBuZWNlc3NhcnknIFwKKydjZCBDICYmCitybSAtZiAuZ2l0L29iamVjdHMvaW5mby9hbHRlcm5hdGVzICYmCishICh0ZXN0X3ZhbGlkX3JlcG8pJworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0aGF0IHJlbGF0aXZlIGFsdGVybmF0ZSBpcyBwb3NzaWJsZSBmb3IgY3VycmVudCBkaXInIFwKKydjZCBDICYmCitlY2hvICIuLi8uLi8uLi9CLy5naXQvb2JqZWN0cyIgPiAuZ2l0L29iamVjdHMvaW5mby9hbHRlcm5hdGVzICYmCit0ZXN0X3ZhbGlkX3JlcG8nCisKK2NkICIkYmFzZV9kaXIiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd0aGF0IHJlbGF0aXZlIGFsdGVybmF0ZSBpcyBvbmx5IHBvc3NpYmxlIGZvciBjdXJyZW50IGRpcicgJworICAgIGNkIEQgJiYKKyAgICAhICh0ZXN0X3ZhbGlkX3JlcG8pCisnCisKK2NkICIkYmFzZV9kaXIiCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NjAwMGxpYi5zaCBiL3QvdDYwMDBsaWIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzBiYWFhNQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMDBsaWIuc2gKQEAgLTAsMCArMSwxMjIgQEAKK1sgLWQgLmdpdC9yZWZzL3RhZ3MgXSB8fCBta2RpciAtcCAuZ2l0L3JlZnMvdGFncworCis6PiBzZWQuc2NyaXB0CisKKyMgQW5zd2VyIHRoZSBzaGExIGhhcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhZy4gVGhlIHRhZyBtdXN0IGV4aXN0IGluIC5naXQgb3IgLmdpdC9yZWZzL3RhZ3MKK3RhZygpCit7CisJX3RhZz0kMQorCVsgLWYgLmdpdC9yZWZzL3RhZ3MvJF90YWcgXSB8fCBlcnJvciAidGFnOiBcIiRfdGFnXCIgZG9lcyBub3QgZXhpc3QiCisJY2F0IC5naXQvcmVmcy90YWdzLyRfdGFnCit9CisKKyMgR2VuZXJhdGUgYSBjb21taXQgdXNpbmcgdGhlIHRleHQgc3BlY2lmaWVkIHRvIG1ha2UgaXQgdW5pcXVlIGFuZCB0aGUgdHJlZQorIyBuYW1lZCBieSB0aGUgdGFnIHNwZWNpZmllZC4KK3VuaXF1ZV9jb21taXQoKQoreworCV90ZXh0PSQxCisgICAgICAgIF90cmVlPSQyCisJc2hpZnQgMgorCWVjaG8gJF90ZXh0IHwgZ2l0IGNvbW1pdC10cmVlICQodGFnICRfdHJlZSkgIiRAIgorfQorCisjIFNhdmUgdGhlIG91dHB1dCBvZiBhIGNvbW1hbmQgaW50byB0aGUgdGFnIHNwZWNpZmllZC4gUHJlcGVuZAorIyBhIHN1YnN0aXR1dGlvbiBzY3JpcHQgZm9yIHRoZSB0YWcgb250byB0aGUgZnJvbnQgb2Ygc2VkLnNjcmlwdAorc2F2ZV90YWcoKQoreworCV90YWc9JDEKKwlbIC1uICIkX3RhZyIgXSB8fCBlcnJvciAidXNhZ2U6IHNhdmVfdGFnIHRhZyBjb21taXQtYXJncyAuLi4iCisJc2hpZnQgMQorCSIkQCIgPi5naXQvcmVmcy90YWdzLyRfdGFnCisKKyAgICAgICAgZWNobyAicy8kKHRhZyAkX3RhZykvJF90YWcvZyIgPiBzZWQuc2NyaXB0LnRtcAorCWNhdCBzZWQuc2NyaXB0ID4+IHNlZC5zY3JpcHQudG1wCisJcm0gc2VkLnNjcmlwdAorCW12IHNlZC5zY3JpcHQudG1wIHNlZC5zY3JpcHQKK30KKworIyBSZXBsYWNlIHVuaGVscGZ1bCBzaGExIGhhc2hzZXMgd2l0aCB0aGVpciBzeW1ib2xpYyBlcXVpdmFsZW50cworZW50YWcoKQoreworCXNlZCAtZiBzZWQuc2NyaXB0Cit9CisKKyMgRXhlY3V0ZSBhIGNvbW1hbmQgYWZ0ZXIgZmlyc3Qgc2F2aW5nLCB0aGVuIHNldHRpbmcgdGhlIEdJVF9BVVRIT1JfRU1BSUwKKyMgdGFnIHRvIGEgc3BlY2lmaWVkIHZhbHVlLiBSZXN0b3JlIHRoZSBvcmlnaW5hbCB2YWx1ZSBvbiByZXR1cm4uCithc19hdXRob3IoKQoreworCV9hdXRob3I9JDEKKwlzaGlmdCAxCisgICAgICAgIF9zYXZlPSRHSVRfQVVUSE9SX0VNQUlMCisKKwlleHBvcnQgR0lUX0FVVEhPUl9FTUFJTD0iJF9hdXRob3IiCisJIiRAIgorCWlmIHRlc3QgLXogIiRfc2F2ZSIKKwl0aGVuCisJCXVuc2V0IEdJVF9BVVRIT1JfRU1BSUwKKwllbHNlCisJCWV4cG9ydCBHSVRfQVVUSE9SX0VNQUlMPSIkX3NhdmUiCisJZmkKK30KKworY29tbWl0X2RhdGUoKQoreworICAgICAgICBfY29tbWl0PSQxCisJZ2l0IGNhdC1maWxlIGNvbW1pdCAkX2NvbW1pdCB8IHNlZCAtbiAicy9eY29tbWl0dGVyIC4qPiBcKFswLTldKlwpIC4qL1wxL3AiCit9CisKK29uX2NvbW1pdHRlcl9kYXRlKCkKK3sKKyAgICBfZGF0ZT0kMQorICAgIHNoaWZ0IDEKKyAgICBleHBvcnQgR0lUX0NPTU1JVFRFUl9EQVRFPSIkX2RhdGUiCisgICAgIiRAIgorICAgIHVuc2V0IEdJVF9DT01NSVRURVJfREFURQorfQorCisjIEV4ZWN1dGUgYSBjb21tYW5kIGFuZCBzdXBwcmVzcyBhbnkgZXJyb3Igb3V0cHV0LgoraGlkZV9lcnJvcigpCit7CisJIiRAIiAyPi9kZXYvbnVsbAorfQorCitjaGVja19vdXRwdXQoKQoreworCV9uYW1lPSQxCisJc2hpZnQgMQorCWlmIGV2YWwgIiQqIiB8IGVudGFnID4gJF9uYW1lLmFjdHVhbAorCXRoZW4KKwkJZGlmZiAkX25hbWUuZXhwZWN0ZWQgJF9uYW1lLmFjdHVhbAorCWVsc2UKKwkJcmV0dXJuIDE7CisJZmkKK30KKworIyBUdXJuIGEgcmVhc29uYWJsZSB0ZXN0IGRlc2NyaXB0aW9uIGludG8gYSByZWFzb25hYmxlIHRlc3QgbmFtZS4KKyMgQWxsIGFscGhhbnVtcyB0cmFuc2xhdGVkIGludG8gLSdzIHdoaWNoIGFyZSB0aGVuIGNvbXByZXNzZWQgYW5kIHN0cmlwcGVkCisjIGZyb20gZnJvbnQgYW5kIGJhY2suCituYW1lX2Zyb21fZGVzY3JpcHRpb24oKQoreworCXBlcmwgLXBlICcKKwkJcy9bXkEtWmEtejAtOS5dLy0vZzsKKwkJcy8tKy8tL2c7CisJCXMvLSQvLzsKKwkJcy9eLS8vOworCQl5L0EtWi9hLXovOworCScKK30KKworCisjIEV4ZWN1dGUgdGhlIHRlc3QgZGVzY3JpYmVkIGJ5IHRoZSBmaXJzdCBhcmd1bWVudCwgYnkgZXZhbCdpbmcKKyMgY29tbWFuZCBsaW5lIHNwZWNpZmllZCBpbiB0aGUgMm5kIGFyZ3VtZW50LiBDaGVjayB0aGUgc3RhdHVzIGNvZGUKKyMgaXMgemVybyBhbmQgdGhhdCB0aGUgb3V0cHV0IG1hdGNoZXMgdGhlIHN0cmVhbSByZWFkIGZyb20KKyMgc3RkaW4uCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcygpCit7CisJX2Rlc2NyaXB0aW9uPSQxCisgICAgICAgIF90ZXN0PSQyCisgICAgICAgIFsgJCMgLWVxIDIgXSB8fCBlcnJvciAidXNhZ2U6IHRlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzIGRlc2NyaXB0aW9uIHRlc3QgPDxFT0YgLi4uIEVPRiIKKyAgICAgICAgX25hbWU9JChlY2hvICRfZGVzY3JpcHRpb24gfCBuYW1lX2Zyb21fZGVzY3JpcHRpb24pCisJY2F0ID4gJF9uYW1lLmV4cGVjdGVkCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAiJF9kZXNjcmlwdGlvbiIgImNoZWNrX291dHB1dCAkX25hbWUgXCIkX3Rlc3RcIiIKK30KZGlmZiAtLWdpdCBhL3QvdDYwMDEtcmV2LWxpc3QtZ3JhZnQuc2ggYi90L3Q2MDAxLXJldi1saXN0LWdyYWZ0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIyMTMxY2QKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MDAxLXJldi1saXN0LWdyYWZ0LnNoCkBAIC0wLDAgKzEsMTEzIEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nUmV2aXNpb24gdHJhdmVyc2FsIHZzIGdyYWZ0cyBhbmQgcGF0aCBsaW1pdGVyJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJbWtkaXIgc3ViZGlyICYmCisJZWNobyA+ZmlsZUEgZmlsZUEgJiYKKwllY2hvID5zdWJkaXIvZmlsZUIgZmlsZUIgJiYKKwlnaXQgYWRkIGZpbGVBIHN1YmRpci9maWxlQiAmJgorCWdpdCBjb21taXQgLWEgLW0gIkluaXRpYWwgaW4gb25lIGhpc3RvcnkuIiAmJgorCUEwPWBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQURgICYmCisKKwllY2hvID5maWxlQSBmaWxlQSBtb2RpZmllZCAmJgorCWdpdCBjb21taXQgLWEgLW0gIlNlY29uZCBpbiBvbmUgaGlzdG9yeS4iICYmCisJQTE9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRGAgJiYKKworCWVjaG8gPnN1YmRpci9maWxlQiBmaWxlQiBtb2RpZmllZCAmJgorCWdpdCBjb21taXQgLWEgLW0gIlRoaXJkIGluIG9uZSBoaXN0b3J5LiIgJiYKKwlBMj1gZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEYCAmJgorCisJcm0gLWYgLmdpdC9yZWZzL2hlYWRzL21hc3RlciAuZ2l0L2luZGV4ICYmCisKKwllY2hvID5maWxlQSBmaWxlQSBhZ2FpbiAmJgorCWVjaG8gPnN1YmRpci9maWxlQiBmaWxlQiBhZ2FpbiAmJgorCWdpdCBhZGQgZmlsZUEgc3ViZGlyL2ZpbGVCICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAiSW5pdGlhbCBpbiBhbHRlcm5hdGUgaGlzdG9yeS4iICYmCisJQjA9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRGAgJiYKKworCWVjaG8gPmZpbGVBIGZpbGVBIG1vZGlmaWVkIGluIGFsdGVybmF0ZSBoaXN0b3J5ICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAiU2Vjb25kIGluIGFsdGVybmF0ZSBoaXN0b3J5LiIgJiYKKwlCMT1gZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEYCAmJgorCisJZWNobyA+c3ViZGlyL2ZpbGVCIGZpbGVCIG1vZGlmaWVkIGluIGFsdGVybmF0ZSBoaXN0b3J5ICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAiVGhpcmQgaW4gYWx0ZXJuYXRlIGhpc3RvcnkuIiAmJgorCUIyPWBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQURgICYmCisJOiBkb25lCisnCisKK2NoZWNrICgpIHsKKwl0eXBlPSQxCisJc2hpZnQKKworCWFyZz0KKwl3aGljaD1hcmcKKwlybSAtZiB0ZXN0LmV4cGVjdAorCWZvciBhCisJZG8KKwkJaWYgdGVzdCAieiRhIiA9IHotLQorCQl0aGVuCisJCQl3aGljaD1leHBlY3QKKwkJCWNoaWxkPQorCQkJY29udGludWUKKwkJZmkKKwkJaWYgdGVzdCAiJHdoaWNoIiA9IGFyZworCQl0aGVuCisJCQlhcmc9IiRhcmckYSAiCisJCQljb250aW51ZQorCQlmaQorCQlpZiB0ZXN0ICIkdHlwZSIgPSBiYXNpYworCQl0aGVuCisJCQllY2hvICIkYSIKKwkJZWxzZQorCQkJaWYgdGVzdCAieiRjaGlsZCIgIT0gegorCQkJdGhlbgorCQkJCWVjaG8gIiRjaGlsZCAkYSIKKwkJCWZpCisJCQljaGlsZD0iJGEiCisJCWZpCisJZG9uZSA+dGVzdC5leHBlY3QKKwlpZiB0ZXN0ICIkdHlwZSIgIT0gYmFzaWMgJiYgdGVzdCAieiRjaGlsZCIgIT0gegorCXRoZW4KKwkJZWNobyA+PnRlc3QuZXhwZWN0ICRjaGlsZAorCWZpCisJaWYgdGVzdCAkdHlwZSA9IGJhc2ljCisJdGhlbgorCQlnaXQgcmV2LWxpc3QgJGFyZyA+dGVzdC5hY3R1YWwKKwllbGlmIHRlc3QgJHR5cGUgPSBwYXJlbnRzCisJdGhlbgorCQlnaXQgcmV2LWxpc3QgLS1wYXJlbnRzICRhcmcgPnRlc3QuYWN0dWFsCisJZWxpZiB0ZXN0ICR0eXBlID0gcGFyZW50cy1yYXcKKwl0aGVuCisJCWdpdCByZXYtbGlzdCAtLXBhcmVudHMgLS1wcmV0dHk9cmF3ICRhcmcgfAorCQlzZWQgLW4gLWUgJ3MvXmNvbW1pdCAvL3AnID50ZXN0LmFjdHVhbAorCWZpCisJZGlmZiB0ZXN0LmV4cGVjdCB0ZXN0LmFjdHVhbAorfQorCitmb3IgdHlwZSBpbiBiYXNpYyBwYXJlbnRzIHBhcmVudHMtcmF3CitkbworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3dpdGhvdXQgZ3JhZnRzJyAiCisJCXJtIC1mIC5naXQvaW5mby9ncmFmdHMKKwkJY2hlY2sgJHR5cGUgJEIyIC0tICRCMiAkQjEgJEIwCisJIgorCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAnd2l0aCBncmFmdHMnICIKKwkJZWNobyAnJEIwICRBMicgPi5naXQvaW5mby9ncmFmdHMKKwkJY2hlY2sgJHR5cGUgJEIyIC0tICRCMiAkQjEgJEIwICRBMiAkQTEgJEEwCisJIgorCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAnd2l0aG91dCBncmFmdHMsIHdpdGggcGF0aGxpbWl0JyAiCisJCXJtIC1mIC5naXQvaW5mby9ncmFmdHMKKwkJY2hlY2sgJHR5cGUgJEIyIHN1YmRpciAtLSAkQjIgJEIwCisJIgorCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAnd2l0aCBncmFmdHMsIHdpdGggcGF0aGxpbWl0JyAiCisJCWVjaG8gJyRCMCAkQTInID4uZ2l0L2luZm8vZ3JhZnRzCisJCWNoZWNrICR0eXBlICRCMiBzdWJkaXIgLS0gJEIyICRCMCAkQTIgJEEwCisJIgorCitkb25lCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDYwMDItcmV2LWxpc3QtYmlzZWN0LnNoIGIvdC90NjAwMi1yZXYtbGlzdC1iaXNlY3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGY1ZGUwOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMDItcmV2LWxpc3QtYmlzZWN0LnNoCkBAIC0wLDAgKzEsMjM4IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEpvbiBTZXltb3VyCisjCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0cyBnaXQgcmV2LWxpc3QgLS1iaXNlY3QgZnVuY3Rpb25hbGl0eScKKworLiAuL3Rlc3QtbGliLnNoCisuIC4uL3Q2MDAwbGliLnNoICMgdDZ4eHggc3BlY2lmaWMgZnVuY3Rpb25zCisKKyMgdXNhZ2U6IHRlc3RfYmlzZWN0aW9uIG1heC1kaWZmIGJpc2VjdC1vcHRpb24gaGVhZCBecHJ1bmUuLi4KKyMKKyMgZS5nLiB0ZXN0X2Jpc2VjdGlvbiAxIC0tYmlzZWN0IGwxIF5sMAorIwordGVzdF9iaXNlY3Rpb25fZGlmZigpCit7CisJX21heF9kaWZmPSQxCisJX2Jpc2VjdF9vcHRpb249JDIKKwlzaGlmdCAyCisJX2Jpc2VjdGlvbj0kKGdpdCByZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gIiRAIikKKwlfbGlzdF9zaXplPSQoZ2l0IHJldi1saXN0ICIkQCIgfCB3YyAtbCkKKyAgICAgICAgX2hlYWQ9JDEKKwlzaGlmdCAxCisJX2Jpc2VjdGlvbl9zaXplPSQoZ2l0IHJldi1saXN0ICRfYmlzZWN0aW9uICIkQCIgfCB3YyAtbCkKKwlbIC1uICIkX2xpc3Rfc2l6ZSIgLWEgLW4gIiRfYmlzZWN0aW9uX3NpemUiIF0gfHwKKwllcnJvciAidGVzdF9iaXNlY3Rpb25fZGlmZiBmYWlsZWQiCisKKwkjIFRlc3QgaWYgYmlzZWN0aW9uIHNpemUgaXMgY2xvc2UgdG8gaGFsZiBvZiBsaXN0IHNpemUgd2l0aGluCisJIyB0b2xlcmFuY2UuCisJIworCV9iaXNlY3RfZXJyPWBleHByICRfbGlzdF9zaXplIC0gJF9iaXNlY3Rpb25fc2l6ZSBcKiAyYAorCXRlc3QgIiRfYmlzZWN0X2VyciIgLWx0IDAgJiYgX2Jpc2VjdF9lcnI9YGV4cHIgMCAtICRfYmlzZWN0X2VycmAKKwlfYmlzZWN0X2Vycj1gZXhwciAkX2Jpc2VjdF9lcnIgLyAyYCA7ICMgZmxvb3IKKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJiaXNlY3Rpb24gZGlmZiAkX2Jpc2VjdF9vcHRpb24gJF9oZWFkICQqIDw9ICRfbWF4X2RpZmYiIFwKKwkndGVzdCAkX2Jpc2VjdF9lcnIgLWxlICRfbWF4X2RpZmYnCit9CisKK2RhdGUgPnBhdGgwCitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIHBhdGgwCitzYXZlX3RhZyB0cmVlIGdpdCB3cml0ZS10cmVlCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMCIgaGlkZV9lcnJvciBzYXZlX3RhZyByb290IHVuaXF1ZV9jb21taXQgcm9vdCB0cmVlCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMSIgc2F2ZV90YWcgbDAgdW5pcXVlX2NvbW1pdCBsMCB0cmVlIC1wIHJvb3QKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjAyIiBzYXZlX3RhZyBsMSB1bmlxdWVfY29tbWl0IGwxIHRyZWUgLXAgbDAKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjAzIiBzYXZlX3RhZyBsMiB1bmlxdWVfY29tbWl0IGwyIHRyZWUgLXAgbDEKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA0IiBzYXZlX3RhZyBhMCB1bmlxdWVfY29tbWl0IGEwIHRyZWUgLXAgbDIKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA1IiBzYXZlX3RhZyBhMSB1bmlxdWVfY29tbWl0IGExIHRyZWUgLXAgYTAKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA2IiBzYXZlX3RhZyBiMSB1bmlxdWVfY29tbWl0IGIxIHRyZWUgLXAgYTAKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA3IiBzYXZlX3RhZyBjMSB1bmlxdWVfY29tbWl0IGMxIHRyZWUgLXAgYjEKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA4IiBzYXZlX3RhZyBiMiB1bmlxdWVfY29tbWl0IGIyIHRyZWUgLXAgYjEKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA5IiBzYXZlX3RhZyBiMyB1bmlxdWVfY29tbWl0IGIyIHRyZWUgLXAgYjIKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjEwIiBzYXZlX3RhZyBjMiB1bmlxdWVfY29tbWl0IGMyIHRyZWUgLXAgYzEgLXAgYjIKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjExIiBzYXZlX3RhZyBjMyB1bmlxdWVfY29tbWl0IGMzIHRyZWUgLXAgYzIKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjEyIiBzYXZlX3RhZyBhMiB1bmlxdWVfY29tbWl0IGEyIHRyZWUgLXAgYTEKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjEzIiBzYXZlX3RhZyBhMyB1bmlxdWVfY29tbWl0IGEzIHRyZWUgLXAgYTIKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjE0IiBzYXZlX3RhZyBiNCB1bmlxdWVfY29tbWl0IGI0IHRyZWUgLXAgYjMgLXAgYTMKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjE1IiBzYXZlX3RhZyBhNCB1bmlxdWVfY29tbWl0IGE0IHRyZWUgLXAgYTMgLXAgYjQgLXAgYzMKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjE2IiBzYXZlX3RhZyBsMyB1bmlxdWVfY29tbWl0IGwzIHRyZWUgLXAgYTQKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjE3IiBzYXZlX3RhZyBsNCB1bmlxdWVfY29tbWl0IGw0IHRyZWUgLXAgbDMKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjE4IiBzYXZlX3RhZyBsNSB1bmlxdWVfY29tbWl0IGw1IHRyZWUgLXAgbDQKK2dpdCB1cGRhdGUtcmVmIEhFQUQgJCh0YWcgbDUpCisKKworIyAgICAgRQorIyAgICAvIFwKKyMgICBlMSAgfAorIyAgIHwgICB8CisjICAgZTIgIHwKKyMgICB8ICAgfAorIyAgIGUzICB8CisjICAgfCAgIHwKKyMgICBlNCAgfAorIyAgIHwgICB8CisjICAgfCAgIGYxCisjICAgfCAgIHwKKyMgICB8ICAgZjIKKyMgICB8ICAgfAorIyAgIHwgICBmMworIyAgIHwgICB8CisjICAgfCAgIGY0CisjICAgfCAgIHwKKyMgICBlNSAgfAorIyAgIHwgICB8CisjICAgZTYgIHwKKyMgICB8ICAgfAorIyAgIGU3ICB8CisjICAgfCAgIHwKKyMgICBlOCAgfAorIyAgICBcIC8KKyMgICAgIEYKKworCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMCIgaGlkZV9lcnJvciBzYXZlX3RhZyBGIHVuaXF1ZV9jb21taXQgRiB0cmVlCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMSIgc2F2ZV90YWcgZTggdW5pcXVlX2NvbW1pdCBlOCB0cmVlIC1wIEYKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjAyIiBzYXZlX3RhZyBlNyB1bmlxdWVfY29tbWl0IGU3IHRyZWUgLXAgZTgKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjAzIiBzYXZlX3RhZyBlNiB1bmlxdWVfY29tbWl0IGU2IHRyZWUgLXAgZTcKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA0IiBzYXZlX3RhZyBlNSB1bmlxdWVfY29tbWl0IGU1IHRyZWUgLXAgZTYKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA1IiBzYXZlX3RhZyBmNCB1bmlxdWVfY29tbWl0IGY0IHRyZWUgLXAgRgorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDYiIHNhdmVfdGFnIGYzIHVuaXF1ZV9jb21taXQgZjMgdHJlZSAtcCBmNAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDciIHNhdmVfdGFnIGYyIHVuaXF1ZV9jb21taXQgZjIgdHJlZSAtcCBmMworb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDgiIHNhdmVfdGFnIGYxIHVuaXF1ZV9jb21taXQgZjEgdHJlZSAtcCBmMgorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDkiIHNhdmVfdGFnIGU0IHVuaXF1ZV9jb21taXQgZTQgdHJlZSAtcCBlNQorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MTAiIHNhdmVfdGFnIGUzIHVuaXF1ZV9jb21taXQgZTMgdHJlZSAtcCBlNAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MTEiIHNhdmVfdGFnIGUyIHVuaXF1ZV9jb21taXQgZTIgdHJlZSAtcCBlMworb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MTIiIHNhdmVfdGFnIGUxIHVuaXF1ZV9jb21taXQgZTEgdHJlZSAtcCBlMgorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MTMiIHNhdmVfdGFnIEUgdW5pcXVlX2NvbW1pdCBFIHRyZWUgLXAgZTEgLXAgZjEKKworb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDAiIGhpZGVfZXJyb3Igc2F2ZV90YWcgVSB1bmlxdWVfY29tbWl0IFUgdHJlZQorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDEiIHNhdmVfdGFnIHUwIHVuaXF1ZV9jb21taXQgdTAgdHJlZSAtcCBVCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMSIgc2F2ZV90YWcgdTEgdW5pcXVlX2NvbW1pdCB1MSB0cmVlIC1wIHUwCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMiIgc2F2ZV90YWcgdTIgdW5pcXVlX2NvbW1pdCB1MiB0cmVlIC1wIHUwCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMyIgc2F2ZV90YWcgdTMgdW5pcXVlX2NvbW1pdCB1MyB0cmVlIC1wIHUwCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowNCIgc2F2ZV90YWcgdTQgdW5pcXVlX2NvbW1pdCB1NCB0cmVlIC1wIHUwCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowNSIgc2F2ZV90YWcgdTUgdW5pcXVlX2NvbW1pdCB1NSB0cmVlIC1wIHUwCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowNiIgc2F2ZV90YWcgViB1bmlxdWVfY29tbWl0IFYgdHJlZSAtcCB1MSAtcCB1MiAtcCB1MyAtcCB1NCAtcCB1NQorCit0ZXN0X3NlcXVlbmNlKCkKK3sKKwlfYmlzZWN0X29wdGlvbj0kMQorCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBsMCBecm9vdAorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gbDEgXnJvb3QKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGwyIF5yb290CisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBhMCBecm9vdAorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gYTEgXnJvb3QKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGEyIF5yb290CisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBhMyBecm9vdAorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gYjEgXnJvb3QKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGIyIF5yb290CisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBiMyBecm9vdAorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gYzEgXnJvb3QKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGMyIF5yb290CisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBjMyBecm9vdAorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gRSBeRgorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gZTEgXkYKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGUyIF5GCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBlMyBeRgorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gZTQgXkYKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGU1IF5GCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBlNiBeRgorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gZTcgXkYKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGYxIF5GCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBmMiBeRgorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gZjMgXkYKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGY0IF5GCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBFIF5GCisKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDEgJF9iaXNlY3Rfb3B0aW9uIFYgXlUKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIFYgXlUgXnUxIF51MiBedTMKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIHUxIF5VCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiB1MiBeVQorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gdTMgXlUKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIHU0IF5VCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiB1NSBeVQorCisjCisjIHRoZSBmb2xsb3dpbmcgaWxsdXN0cmF0ZXMgTGludXMnIGJpbmFyeSBidWcgYmxhdHQgaWRlYS4KKyMKKyMgYXNzdW1lIHRoZSBidWcgaXMgYWN0dWFsbHkgYXQgbDMsIGJ1dCB5b3UgZG9uJ3Qga25vdyB0aGF0IC0gYWxsIHlvdSBrbm93IGlzIHRoYXQgbDMgaXMgYnJva2VuCisjIGFuZCBpdCB3YXNuJ3QgYnJva2VuIGJlZm9yZQorIworIyBrZWVwIGJpc2VjdGluZyB0aGUgbGlzdCwgYWR2YW5jaW5nIHRoZSAiYmFkIiBoZWFkIGFuZCBhY2N1bXVsYXRpbmcgImdvb2QiIGhlYWRzIHVudGlsCisjIHRoZSBiaXNlY3Rpb24gcG9pbnQgaXMgdGhlIGhlYWQgLSB0aGlzIGlzIHRoZSBiYWQgcG9pbnQuCisjCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICIkX2Jpc2VjdF9vcHRpb24gbDUgXnJvb3QiICdnaXQgcmV2LWxpc3QgJF9iaXNlY3Rfb3B0aW9uIGw1IF5yb290JyA8PEVPRgorYzMKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAiJF9iaXNlY3Rfb3B0aW9uIGw1IF5yb290IF5jMyIgJ2dpdCByZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gbDUgXnJvb3QgXmMzJyA8PEVPRgorYjQKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAiJF9iaXNlY3Rfb3B0aW9uIGw1IF5yb290IF5jMyBeYjQiICdnaXQgcmV2LWxpc3QgJF9iaXNlY3Rfb3B0aW9uIGw1IF5jMyBeYjQnIDw8RU9GCitsMworRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICIkX2Jpc2VjdF9vcHRpb24gbDMgXnJvb3QgXmMzIF5iNCIgJ2dpdCByZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gbDMgXnJvb3QgXmMzIF5iNCcgPDxFT0YKK2E0CitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgIiRfYmlzZWN0X29wdGlvbiBsNSBeYjMgXmEzIF5iNCBeYTQiICdnaXQgcmV2LWxpc3QgJF9iaXNlY3Rfb3B0aW9uIGwzIF5iMyBeYTMgXmE0JyA8PEVPRgorbDMKK0VPRgorCisjCisjIGlmIGwzIGlzIGJhZCwgdGhlbiBsNCBpcyBiYWQgdG9vIC0gc28gYWR2YW5jZSB0aGUgYmFkIHBvaW50ZXIgYnkgbWFraW5nIGI0IHRoZSBrbm93biBiYWQgaGVhZAorIworCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAiJF9iaXNlY3Rfb3B0aW9uIGw0IF5hMiBeYTMgXmIgXmE0IiAnZ2l0IHJldi1saXN0ICRfYmlzZWN0X29wdGlvbiBsNCBeYTIgXmEzIF5hNCcgPDxFT0YKK2wzCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgIiRfYmlzZWN0X29wdGlvbiBsMyBeYTIgXmEzIF5iIF5hNCIgJ2dpdCByZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gbDMgXmEyIF5hMyBeYTQnIDw8RU9GCitsMworRU9GCisKKyMgZm91bmQhCisKKyMKKyMgYXMgYW5vdGhlciBleGFtcGxlLCBsZXQncyBjb25zaWRlciBhNCB0byBiZSB0aGUgYmFkIGhlYWQsIGluIHdoaWNoIGNhc2UKKyMKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgIiRfYmlzZWN0X29wdGlvbiBhNCBeYTIgXmEzIF5iNCIgJ2dpdCByZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gYTQgXmEyIF5hMyBeYjQnIDw8RU9GCitjMgorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICIkX2Jpc2VjdF9vcHRpb24gYTQgXmEyIF5hMyBeYjQgXmMyIiAnZ2l0IHJldi1saXN0ICRfYmlzZWN0X29wdGlvbiBhNCBeYTIgXmEzIF5iNCBeYzInIDw8RU9GCitjMworRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICIkX2Jpc2VjdF9vcHRpb24gYTQgXmEyIF5hMyBeYjQgXmMyIF5jMyIgJ2dpdCByZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gYTQgXmEyIF5hMyBeYjQgXmMyIF5jMycgPDxFT0YKK2E0CitFT0YKKworIyBmb3VuZCEKKworIworIyBvciBjb25zaWRlciBjMyB0byBiZSB0aGUgYmFkIGhlYWQKKyMKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgIiRfYmlzZWN0X29wdGlvbiBhNCBeYTIgXmEzIF5iNCIgJ2dpdCByZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gYTQgXmEyIF5hMyBeYjQnIDw8RU9GCitjMgorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICIkX2Jpc2VjdF9vcHRpb24gYzMgXmEyIF5hMyBeYjQgXmMyIiAnZ2l0IHJldi1saXN0ICRfYmlzZWN0X29wdGlvbiBjMyBeYTIgXmEzIF5iNCBeYzInIDw8RU9GCitjMworRU9GCisKKyMgZm91bmQhCisKK30KKwordGVzdF9zZXF1ZW5jZSAiLS1iaXNlY3QiCisKKyMKKyMKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NjAwMy1yZXYtbGlzdC10b3BvLW9yZGVyLnNoIGIvdC90NjAwMy1yZXYtbGlzdC10b3BvLW9yZGVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVkYWEwYmUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MDAzLXJldi1saXN0LXRvcG8tb3JkZXIuc2gKQEAgLTAsMCArMSw0MDggQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSm9uIFNleW1vdXIKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdHMgZ2l0IHJldi1saXN0IC0tdG9wby1vcmRlciBmdW5jdGlvbmFsaXR5JworCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vdDYwMDBsaWIuc2ggIyB0Nnh4eCBzcGVjaWZpYyBmdW5jdGlvbnMKKworbGlzdF9kdXBsaWNhdGVzKCkKK3sKKyAgICAiJEAiIHwgc29ydCB8IHVuaXEgLWQKK30KKworZGF0ZSA+cGF0aDAKK2dpdCB1cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAKK3NhdmVfdGFnIHRyZWUgZ2l0IHdyaXRlLXRyZWUKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjAwIiBoaWRlX2Vycm9yIHNhdmVfdGFnIHJvb3QgdW5pcXVlX2NvbW1pdCByb290IHRyZWUKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjAxIiBzYXZlX3RhZyBsMCB1bmlxdWVfY29tbWl0IGwwIHRyZWUgLXAgcm9vdAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDIiIHNhdmVfdGFnIGwxIHVuaXF1ZV9jb21taXQgbDEgdHJlZSAtcCBsMAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDMiIHNhdmVfdGFnIGwyIHVuaXF1ZV9jb21taXQgbDIgdHJlZSAtcCBsMQorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDQiIHNhdmVfdGFnIGEwIHVuaXF1ZV9jb21taXQgYTAgdHJlZSAtcCBsMgorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDUiIHNhdmVfdGFnIGExIHVuaXF1ZV9jb21taXQgYTEgdHJlZSAtcCBhMAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDYiIHNhdmVfdGFnIGIxIHVuaXF1ZV9jb21taXQgYjEgdHJlZSAtcCBhMAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDciIHNhdmVfdGFnIGMxIHVuaXF1ZV9jb21taXQgYzEgdHJlZSAtcCBiMQorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDgiIGFzX2F1dGhvciBmb29iYXJAZXhhbXBsZS5jb20gc2F2ZV90YWcgYjIgdW5pcXVlX2NvbW1pdCBiMiB0cmVlIC1wIGIxCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowOSIgc2F2ZV90YWcgYjMgdW5pcXVlX2NvbW1pdCBiMyB0cmVlIC1wIGIyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxMCIgc2F2ZV90YWcgYzIgdW5pcXVlX2NvbW1pdCBjMiB0cmVlIC1wIGMxIC1wIGIyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxMSIgc2F2ZV90YWcgYzMgdW5pcXVlX2NvbW1pdCBjMyB0cmVlIC1wIGMyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxMiIgc2F2ZV90YWcgYTIgdW5pcXVlX2NvbW1pdCBhMiB0cmVlIC1wIGExCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxMyIgc2F2ZV90YWcgYTMgdW5pcXVlX2NvbW1pdCBhMyB0cmVlIC1wIGEyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxNCIgc2F2ZV90YWcgYjQgdW5pcXVlX2NvbW1pdCBiNCB0cmVlIC1wIGIzIC1wIGEzCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxNSIgc2F2ZV90YWcgYTQgdW5pcXVlX2NvbW1pdCBhNCB0cmVlIC1wIGEzIC1wIGI0IC1wIGMzCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxNiIgc2F2ZV90YWcgbDMgdW5pcXVlX2NvbW1pdCBsMyB0cmVlIC1wIGE0Citvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxNyIgc2F2ZV90YWcgbDQgdW5pcXVlX2NvbW1pdCBsNCB0cmVlIC1wIGwzCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxOCIgc2F2ZV90YWcgbDUgdW5pcXVlX2NvbW1pdCBsNSB0cmVlIC1wIGw0Citvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxOSIgc2F2ZV90YWcgbTEgdW5pcXVlX2NvbW1pdCBtMSB0cmVlIC1wIGE0IC1wIGMzCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoyMCIgc2F2ZV90YWcgbTIgdW5pcXVlX2NvbW1pdCBtMiB0cmVlIC1wIGMzIC1wIGE0Citvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoyMSIgaGlkZV9lcnJvciBzYXZlX3RhZyBhbHRfcm9vdCB1bmlxdWVfY29tbWl0IGFsdF9yb290IHRyZWUKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjIyIiBzYXZlX3RhZyByMCB1bmlxdWVfY29tbWl0IHIwIHRyZWUgLXAgYWx0X3Jvb3QKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjIzIiBzYXZlX3RhZyByMSB1bmlxdWVfY29tbWl0IHIxIHRyZWUgLXAgcjAKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjI0IiBzYXZlX3RhZyBsNXIxIHVuaXF1ZV9jb21taXQgbDVyMSB0cmVlIC1wIGw1IC1wIHIxCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoyNSIgc2F2ZV90YWcgcjFsNSB1bmlxdWVfY29tbWl0IHIxbDUgdHJlZSAtcCByMSAtcCBsNQorCisKKyMKKyMgbm90ZTogYXMgb2YgMjAvNiwgaXQgaXNuJ3QgcG9zc2libGUgdG8gY3JlYXRlIGR1cGxpY2F0ZSBwYXJlbnRzLCBzbyB0aGlzCisjIGNhbid0IGJlIHRlc3RlZC4KKyMKKyNvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoyMCIgc2F2ZV90YWcgbTMgdW5pcXVlX2NvbW1pdCBtMyB0cmVlIC1wIGMzIC1wIGE0IC1wIGMzCitoaWRlX2Vycm9yIHNhdmVfdGFnIGUxIGFzX2F1dGhvciBlQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZTEgdHJlZQorc2F2ZV90YWcgZTIgYXNfYXV0aG9yIGVAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBlMiB0cmVlIC1wIGUxCitzYXZlX3RhZyBmMSBhc19hdXRob3IgZkBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGYxIHRyZWUgLXAgZTEKK3NhdmVfdGFnIGUzIGFzX2F1dGhvciBlQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZTMgdHJlZSAtcCBlMgorc2F2ZV90YWcgZjIgYXNfYXV0aG9yIGZAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBmMiB0cmVlIC1wIGYxCitzYXZlX3RhZyBlNCBhc19hdXRob3IgZUBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGU0IHRyZWUgLXAgZTMgLXAgZjIKK3NhdmVfdGFnIGU1IGFzX2F1dGhvciBlQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZTUgdHJlZSAtcCBlNAorc2F2ZV90YWcgZjMgYXNfYXV0aG9yIGZAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBmMyB0cmVlIC1wIGYyCitzYXZlX3RhZyBmNCBhc19hdXRob3IgZkBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGY0IHRyZWUgLXAgZjMKK3NhdmVfdGFnIGU2IGFzX2F1dGhvciBlQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZTYgdHJlZSAtcCBlNSAtcCBmNAorc2F2ZV90YWcgZjUgYXNfYXV0aG9yIGZAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBmNSB0cmVlIC1wIGY0CitzYXZlX3RhZyBmNiBhc19hdXRob3IgZkBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGY2IHRyZWUgLXAgZjUgLXAgZTYKK3NhdmVfdGFnIGU3IGFzX2F1dGhvciBlQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZTcgdHJlZSAtcCBlNgorc2F2ZV90YWcgZTggYXNfYXV0aG9yIGVAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBlOCB0cmVlIC1wIGU3CitzYXZlX3RhZyBlOSBhc19hdXRob3IgZUBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGU5IHRyZWUgLXAgZTgKK3NhdmVfdGFnIGY3IGFzX2F1dGhvciBmQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZjcgdHJlZSAtcCBmNgorc2F2ZV90YWcgZjggYXNfYXV0aG9yIGZAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBmOCB0cmVlIC1wIGY3CitzYXZlX3RhZyBmOSBhc19hdXRob3IgZkBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGY5IHRyZWUgLXAgZjgKK3NhdmVfdGFnIGUxMCBhc19hdXRob3IgZUBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGUxIHRyZWUgLXAgZTkgLXAgZjgKKworaGlkZV9lcnJvciBzYXZlX3RhZyBnMCB1bmlxdWVfY29tbWl0IGcwIHRyZWUKK3NhdmVfdGFnIGcxIHVuaXF1ZV9jb21taXQgZzEgdHJlZSAtcCBnMAorc2F2ZV90YWcgaDEgdW5pcXVlX2NvbW1pdCBnMiB0cmVlIC1wIGcwCitzYXZlX3RhZyBnMiB1bmlxdWVfY29tbWl0IGczIHRyZWUgLXAgZzEgLXAgaDEKK3NhdmVfdGFnIGgyIHVuaXF1ZV9jb21taXQgZzQgdHJlZSAtcCBnMgorc2F2ZV90YWcgZzMgdW5pcXVlX2NvbW1pdCBnNSB0cmVlIC1wIGcyCitzYXZlX3RhZyBnNCB1bmlxdWVfY29tbWl0IGc2IHRyZWUgLXAgZzMgLXAgaDIKKworZ2l0IHVwZGF0ZS1yZWYgSEVBRCAkKHRhZyBsNSkKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ3Jldi1saXN0IGhhcyBjb3JyZWN0IG51bWJlciBvZiBlbnRyaWVzJyAnZ2l0IHJldi1saXN0IEhFQUQgfCB3YyAtbCB8IHRyIC1kIFwiIFwiJyA8PEVPRgorMTkKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAnc2ltcGxlIHRvcG8gb3JkZXInICdnaXQgcmV2LWxpc3QgLS10b3BvLW9yZGVyICBIRUFEJyA8PEVPRgorbDUKK2w0CitsMworYTQKK2MzCitjMgorYzEKK2I0CithMworYTIKK2ExCitiMworYjIKK2IxCithMAorbDIKK2wxCitsMAorcm9vdAorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICd0d28gZGlhbW9uZHMgdG9wbyBvcmRlciAoZzYpJyAnZ2l0IHJldi1saXN0IC0tdG9wby1vcmRlciAgZzQnIDw8RU9GCitnNAoraDIKK2czCitnMgoraDEKK2cxCitnMAorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdtdWx0aXBsZSBoZWFkcycgJ2dpdCByZXYtbGlzdCAtLXRvcG8tb3JkZXIgYTMgYjMgYzMnIDw8RU9GCithMworYTIKK2ExCitjMworYzIKK2MxCitiMworYjIKK2IxCithMAorbDIKK2wxCitsMAorcm9vdAorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdtdWx0aXBsZSBoZWFkcywgcHJ1bmUgYXQgYTEnICdnaXQgcmV2LWxpc3QgLS10b3BvLW9yZGVyIGEzIGIzIGMzIF5hMScgPDxFT0YKK2EzCithMgorYzMKK2MyCitjMQorYjMKK2IyCitiMQorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdtdWx0aXBsZSBoZWFkcywgcHJ1bmUgYXQgbDEnICdnaXQgcmV2LWxpc3QgLS10b3BvLW9yZGVyIGEzIGIzIGMzIF5sMScgPDxFT0YKK2EzCithMgorYTEKK2MzCitjMgorYzEKK2IzCitiMgorYjEKK2EwCitsMgorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdjcm9zcy1lcG9jaCwgaGVhZCBhdCBsNSwgcHJ1bmUgYXQgbDEnICdnaXQgcmV2LWxpc3QgLS10b3BvLW9yZGVyIGw1IF5sMScgPDxFT0YKK2w1CitsNAorbDMKK2E0CitjMworYzIKK2MxCitiNAorYTMKK2EyCithMQorYjMKK2IyCitiMQorYTAKK2wyCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ2R1cGxpY2F0ZWQgaGVhZCBhcmd1bWVudHMnICdnaXQgcmV2LWxpc3QgLS10b3BvLW9yZGVyIGw1IGw1IF5sMScgPDxFT0YKK2w1CitsNAorbDMKK2E0CitjMworYzIKK2MxCitiNAorYTMKK2EyCithMQorYjMKK2IyCitiMQorYTAKK2wyCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ3BydW5lIG5lYXIgdG9wbycgJ2dpdCByZXYtbGlzdCAtLXRvcG8tb3JkZXIgYTQgXmMzJyA8PEVPRgorYTQKK2I0CithMworYTIKK2ExCitiMworRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICJoZWFkIGhhcyBubyBwYXJlbnQiICdnaXQgcmV2LWxpc3QgLS10b3BvLW9yZGVyICByb290JyA8PEVPRgorcm9vdAorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICJ0d28gbm9kZXMgLSBvbmUgaGVhZCwgb25lIGJhc2UiICdnaXQgcmV2LWxpc3QgLS10b3BvLW9yZGVyICBsMCcgPDxFT0YKK2wwCityb290CitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgInRocmVlIG5vZGVzIG9uZSBoZWFkLCBvbmUgaW50ZXJuYWwsIG9uZSBiYXNlIiAnZ2l0IHJldi1saXN0IC0tdG9wby1vcmRlciAgbDEnIDw8RU9GCitsMQorbDAKK3Jvb3QKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAibGluZWFyIHBydW5lIGwyIF5yb290IiAnZ2l0IHJldi1saXN0IC0tdG9wby1vcmRlciAgbDIgXnJvb3QnIDw8RU9GCitsMgorbDEKK2wwCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgImxpbmVhciBwcnVuZSBsMiBebDAiICdnaXQgcmV2LWxpc3QgLS10b3BvLW9yZGVyICBsMiBebDAnIDw8RU9GCitsMgorbDEKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAibGluZWFyIHBydW5lIGwyIF5sMSIgJ2dpdCByZXYtbGlzdCAtLXRvcG8tb3JkZXIgIGwyIF5sMScgPDxFT0YKK2wyCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgImxpbmVhciBwcnVuZSBsNSBeYTQiICdnaXQgcmV2LWxpc3QgLS10b3BvLW9yZGVyICBsNSBeYTQnIDw8RU9GCitsNQorbDQKK2wzCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgImxpbmVhciBwcnVuZSBsNSBebDMiICdnaXQgcmV2LWxpc3QgLS10b3BvLW9yZGVyICBsNSBebDMnIDw8RU9GCitsNQorbDQKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAibGluZWFyIHBydW5lIGw1IF5sNCIgJ2dpdCByZXYtbGlzdCAtLXRvcG8tb3JkZXIgIGw1IF5sNCcgPDxFT0YKK2w1CitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgIm1heC1jb3VudCAxMCAtIHRvcG8gb3JkZXIiICdnaXQgcmV2LWxpc3QgLS10b3BvLW9yZGVyICAtLW1heC1jb3VudD0xMCBsNScgPDxFT0YKK2w1CitsNAorbDMKK2E0CitjMworYzIKK2MxCitiNAorYTMKK2EyCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgIm1heC1jb3VudCAxMCAtIG5vbiB0b3BvIG9yZGVyIiAnZ2l0IHJldi1saXN0IC0tbWF4LWNvdW50PTEwIGw1JyA8PEVPRgorbDUKK2w0CitsMworYTQKK2I0CithMworYTIKK2MzCitjMgorYjMKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAnLS1tYXgtYWdlPWMzLCBubyAtLXRvcG8tb3JkZXInICJnaXQgcmV2LWxpc3QgLS1tYXgtYWdlPSQoY29tbWl0X2RhdGUgYzMpIGw1IiA8PEVPRgorbDUKK2w0CitsMworYTQKK2I0CithMworYTIKK2MzCitFT0YKKworIworIyB0aGlzIHRlc3QgZmFpbHMgb24gLS10b3BvLW9yZGVyIC0gYSBmaXggaXMgcmVxdWlyZWQKKyMKKyN0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAnLS1tYXgtYWdlPWMzLCAtLXRvcG8tb3JkZXInICJnaXQgcmV2LWxpc3QgLS10b3BvLW9yZGVyIC0tbWF4LWFnZT0kKGNvbW1pdF9kYXRlIGMzKSBsNSIgPDxFT0YKKyNsNQorI2w0CisjbDMKKyNhNAorI2MzCisjYjQKKyNhMworI2EyCisjRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdvbmUgc3BlY2lmaWVkIGhlYWQgcmVhY2hhYmxlIGZyb20gYW5vdGhlciBhNCwgYzMsIC0tdG9wby1vcmRlcicgImxpc3RfZHVwbGljYXRlcyBnaXQgcmV2LWxpc3QgLS10b3BvLW9yZGVyIGE0IGMzIiA8PEVPRgorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdvbmUgc3BlY2lmaWVkIGhlYWQgcmVhY2hhYmxlIGZyb20gYW5vdGhlciBjMywgYTQsIC0tdG9wby1vcmRlcicgImxpc3RfZHVwbGljYXRlcyBnaXQgcmV2LWxpc3QgLS10b3BvLW9yZGVyIGMzIGE0IiA8PEVPRgorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdvbmUgc3BlY2lmaWVkIGhlYWQgcmVhY2hhYmxlIGZyb20gYW5vdGhlciBhNCwgYzMsIG5vIC0tdG9wby1vcmRlcicgImxpc3RfZHVwbGljYXRlcyBnaXQgcmV2LWxpc3QgYTQgYzMiIDw8RU9GCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ29uZSBzcGVjaWZpZWQgaGVhZCByZWFjaGFibGUgZnJvbSBhbm90aGVyIGMzLCBhNCwgbm8gLS10b3BvLW9yZGVyJyAibGlzdF9kdXBsaWNhdGVzIGdpdCByZXYtbGlzdCBjMyBhNCIgPDxFT0YKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAnZ3JhcGggd2l0aCBjMyBhbmQgYTQgcGFyZW50cyBvZiBoZWFkJyAibGlzdF9kdXBsaWNhdGVzIGdpdCByZXYtbGlzdCBtMSIgPDxFT0YKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAnZ3JhcGggd2l0aCBhNCBhbmQgYzMgcGFyZW50cyBvZiBoZWFkJyAibGlzdF9kdXBsaWNhdGVzIGdpdCByZXYtbGlzdCBtMiIgPDxFT0YKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJoZWFkIF5oZWFkIC0tdG9wby1vcmRlciIgJ2dpdCByZXYtbGlzdCAtLXRvcG8tb3JkZXIgIGEzIF5hMycgPDxFT0YKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJoZWFkIF5oZWFkIG5vIC0tdG9wby1vcmRlciIgJ2dpdCByZXYtbGlzdCBhMyBeYTMnIDw8RU9GCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ3NpbXBsZSB0b3BvIG9yZGVyIChsNXIxKScgJ2dpdCByZXYtbGlzdCAtLXRvcG8tb3JkZXIgIGw1cjEnIDw8RU9GCitsNXIxCityMQorcjAKK2FsdF9yb290CitsNQorbDQKK2wzCithNAorYzMKK2MyCitjMQorYjQKK2EzCithMgorYTEKK2IzCitiMgorYjEKK2EwCitsMgorbDEKK2wwCityb290CitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ3NpbXBsZSB0b3BvIG9yZGVyIChyMWw1KScgJ2dpdCByZXYtbGlzdCAtLXRvcG8tb3JkZXIgIHIxbDUnIDw8RU9GCityMWw1CitsNQorbDQKK2wzCithNAorYzMKK2MyCitjMQorYjQKK2EzCithMgorYTEKK2IzCitiMgorYjEKK2EwCitsMgorbDEKK2wwCityb290CityMQorcjAKK2FsdF9yb290CitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgImRvbid0IHByaW50IHRoaW5ncyB1bnJlYWNoYWJsZSBmcm9tIG9uZSBicmFuY2giICJnaXQgcmV2LWxpc3QgYTMgXmIzIC0tdG9wby1vcmRlciIgPDxFT0YKK2EzCithMgorYTEKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAiLS10b3BvLW9yZGVyIGE0IGwzIiAiZ2l0IHJldi1saXN0IC0tdG9wby1vcmRlciBhNCBsMyIgPDxFT0YKK2wzCithNAorYzMKK2MyCitjMQorYjQKK2EzCithMgorYTEKK2IzCitiMgorYjEKK2EwCitsMgorbDEKK2wwCityb290CitFT0YKKworIworIworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDYwMDQtcmV2LWxpc3QtcGF0aC1vcHRpbS5zaCBiL3QvdDYwMDQtcmV2LWxpc3QtcGF0aC1vcHRpbS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZGFiZjFjCi0tLSAvZGV2L251bGwKKysrIGIvdC90NjAwNC1yZXYtbGlzdC1wYXRoLW9wdGltLnNoCkBAIC0wLDAgKzEsNTEgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgcmV2LWxpc3QgdHJpdmlhbCBwYXRoIG9wdGltaXphdGlvbiB0ZXN0JworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCitlY2hvIEhlbGxvID4gYSAmJgorZ2l0IGFkZCBhICYmCitnaXQgY29tbWl0IC1tICJJbml0aWFsIGNvbW1pdCIgYSAmJgoraW5pdGlhbD0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBwYXRoLW9wdGltaXphdGlvbiAnCisgICAgY29tbWl0PSQoZWNobyAiVW5jaGFuZ2VkIHRyZWUiIHwgZ2l0IGNvbW1pdC10cmVlICJIRUFEXnt0cmVlfSIgLXAgSEVBRCkgJiYKKyAgICB0ZXN0ICQoZ2l0IHJldi1saXN0ICRjb21taXQgfCB3YyAtbCkgPSAyICYmCisgICAgdGVzdCAkKGdpdCByZXYtbGlzdCAkY29tbWl0IC0tIC4gfCB3YyAtbCkgPSAxCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Z1cnRoZXIgc2V0dXAnICcKKwlnaXQgY2hlY2tvdXQgLWIgc2lkZSAmJgorCWVjaG8gSXJyZWxldmFudCA+YyAmJgorCWdpdCBhZGQgYyAmJgorCWdpdCBjb21taXQgLW0gIlNpZGUgbWFrZXMgYW4gaXJyZWxldmFudCBjb21taXQiICYmCisJZWNobyAiTW9yZSBJcnJlbGV2YW5jeSIgPmMgJiYKKwlnaXQgYWRkIGMgJiYKKwlnaXQgY29tbWl0IC1tICJTaWRlIG1ha2VzIGFub3RoZXIgaXJyZWxldmFudCBjb21taXQiICYmCisJZWNobyBCeWUgPmEgJiYKKwlnaXQgYWRkIGEgJiYKKwlnaXQgY29tbWl0IC1tICJTaWRlIHRvdWNoZXMgYSIgJiYKKwlzaWRlPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSAmJgorCWVjaG8gIllldCBtb3JlIElycmVsZXZhbmN5IiA+YyAmJgorCWdpdCBhZGQgYyAmJgorCWdpdCBjb21taXQgLW0gIlNpZGUgbWFrZXMgeWV0IGFub3RoZXIgaXJyZWxldmFudCBjb21taXQiICYmCisJZ2l0IGNoZWNrb3V0IG1hc3RlciAmJgorCWVjaG8gQW5vdGhlciA+YiAmJgorCWdpdCBhZGQgYiAmJgorCWdpdCBjb21taXQgLW0gIk1hc3RlciB0b3VjaGVzIGIiICYmCisJZ2l0IG1lcmdlIHNpZGUgJiYKKwllY2hvIFRvdWNoZWQgPmIgJiYKKwlnaXQgYWRkIGIgJiYKKwlnaXQgY29tbWl0IC1tICJNYXN0ZXIgdG91Y2hlcyBiIGFnYWluIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwYXRoIG9wdGltaXphdGlvbiAyJyAnCisJKCBlY2hvICIkc2lkZSI7IGVjaG8gIiRpbml0aWFsIiApID5leHBlY3RlZCAmJgorCWdpdCByZXYtbGlzdCBIRUFEIC0tIGEgPmFjdHVhbCAmJgorCXRlc3RfY21wIGV4cGVjdGVkIGFjdHVhbAorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDYwMDUtcmV2LWxpc3QtY291bnQuc2ggYi90L3Q2MDA1LXJldi1saXN0LWNvdW50LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBiNjQ4MjIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MDA1LXJldi1saXN0LWNvdW50LnNoCkBAIC0wLDAgKzEsNTEgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgcmV2LWxpc3QgLS1tYXgtY291bnQgYW5kIC0tc2tpcCB0ZXN0JworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAnICcKKyAgICBmb3IgbiBpbiAxIDIgMyA0IDUgOyBkbyBcCisgICAgICAgIGVjaG8gJG4gPiBhIDsgXAorICAgICAgICBnaXQgYWRkIGEgOyBcCisgICAgICAgIGdpdCBjb21taXQgLW0gIiRuIiA7IFwKKyAgICBkb25lCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ25vIG9wdGlvbnMnICcKKyAgICB0ZXN0ICQoZ2l0IHJldi1saXN0IEhFQUQgfCB3YyAtbCkgPSA1CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy0tbWF4LWNvdW50JyAnCisgICAgdGVzdCAkKGdpdCByZXYtbGlzdCBIRUFEIC0tbWF4LWNvdW50PTAgfCB3YyAtbCkgPSAwICYmCisgICAgdGVzdCAkKGdpdCByZXYtbGlzdCBIRUFEIC0tbWF4LWNvdW50PTMgfCB3YyAtbCkgPSAzICYmCisgICAgdGVzdCAkKGdpdCByZXYtbGlzdCBIRUFEIC0tbWF4LWNvdW50PTUgfCB3YyAtbCkgPSA1ICYmCisgICAgdGVzdCAkKGdpdCByZXYtbGlzdCBIRUFEIC0tbWF4LWNvdW50PTEwIHwgd2MgLWwpID0gNQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctLW1heC1jb3VudCBhbGwgZm9ybXMnICcKKyAgICB0ZXN0ICQoZ2l0IHJldi1saXN0IEhFQUQgLS1tYXgtY291bnQ9MSB8IHdjIC1sKSA9IDEgJiYKKyAgICB0ZXN0ICQoZ2l0IHJldi1saXN0IEhFQUQgLTEgfCB3YyAtbCkgPSAxICYmCisgICAgdGVzdCAkKGdpdCByZXYtbGlzdCBIRUFEIC1uMSB8IHdjIC1sKSA9IDEgJiYKKyAgICB0ZXN0ICQoZ2l0IHJldi1saXN0IEhFQUQgLW4gMSB8IHdjIC1sKSA9IDEKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLS1za2lwJyAnCisgICAgdGVzdCAkKGdpdCByZXYtbGlzdCBIRUFEIC0tc2tpcD0wIHwgd2MgLWwpID0gNSAmJgorICAgIHRlc3QgJChnaXQgcmV2LWxpc3QgSEVBRCAtLXNraXA9MyB8IHdjIC1sKSA9IDIgJiYKKyAgICB0ZXN0ICQoZ2l0IHJldi1saXN0IEhFQUQgLS1za2lwPTUgfCB3YyAtbCkgPSAwICYmCisgICAgdGVzdCAkKGdpdCByZXYtbGlzdCBIRUFEIC0tc2tpcD0xMCB8IHdjIC1sKSA9IDAKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLS1za2lwIC0tbWF4LWNvdW50JyAnCisgICAgdGVzdCAkKGdpdCByZXYtbGlzdCBIRUFEIC0tc2tpcD0wIC0tbWF4LWNvdW50PTAgfCB3YyAtbCkgPSAwICYmCisgICAgdGVzdCAkKGdpdCByZXYtbGlzdCBIRUFEIC0tc2tpcD0wIC0tbWF4LWNvdW50PTEwIHwgd2MgLWwpID0gNSAmJgorICAgIHRlc3QgJChnaXQgcmV2LWxpc3QgSEVBRCAtLXNraXA9MyAtLW1heC1jb3VudD0wIHwgd2MgLWwpID0gMCAmJgorICAgIHRlc3QgJChnaXQgcmV2LWxpc3QgSEVBRCAtLXNraXA9MyAtLW1heC1jb3VudD0xIHwgd2MgLWwpID0gMSAmJgorICAgIHRlc3QgJChnaXQgcmV2LWxpc3QgSEVBRCAtLXNraXA9MyAtLW1heC1jb3VudD0yIHwgd2MgLWwpID0gMiAmJgorICAgIHRlc3QgJChnaXQgcmV2LWxpc3QgSEVBRCAtLXNraXA9MyAtLW1heC1jb3VudD0xMCB8IHdjIC1sKSA9IDIgJiYKKyAgICB0ZXN0ICQoZ2l0IHJldi1saXN0IEhFQUQgLS1za2lwPTUgLS1tYXgtY291bnQ9MTAgfCB3YyAtbCkgPSAwICYmCisgICAgdGVzdCAkKGdpdCByZXYtbGlzdCBIRUFEIC0tc2tpcD0xMCAtLW1heC1jb3VudD0xMCB8IHdjIC1sKSA9IDAKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q2MDA2LXJldi1saXN0LWZvcm1hdC5zaCBiL3QvdDYwMDYtcmV2LWxpc3QtZm9ybWF0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBkYzkxNWUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MDA2LXJldi1saXN0LWZvcm1hdC5zaApAQCAtMCwwICsxLDE1MiBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCByZXYtbGlzdCAtLXByZXR0eT1mb3JtYXQgdGVzdCcKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfdGljawordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAnICcKK3RvdWNoIGZvbyAmJiBnaXQgYWRkIGZvbyAmJiBnaXQtY29tbWl0IC1tICJhZGRlZCBmb28iICYmCisgIGVjaG8gY2hhbmdlZCA+Zm9vICYmIGdpdC1jb21taXQgLWEgLW0gImNoYW5nZWQgZm9vIgorJworCisjIHVzYWdlOiB0ZXN0X2Zvcm1hdCBuYW1lIGZvcm1hdF9zdHJpbmcgPGV4cGVjdGVkX291dHB1dAordGVzdF9mb3JtYXQoKSB7CisJY2F0ID5leHBlY3QuJDEKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICJmb3JtYXQgJDEiICIKK2dpdCByZXYtbGlzdCAtLXByZXR0eT1mb3JtYXQ6JDIgbWFzdGVyID5vdXRwdXQuJDEgJiYKK2dpdCBkaWZmIGV4cGVjdC4kMSBvdXRwdXQuJDEKKyIKK30KKwordGVzdF9mb3JtYXQgaGFzaCAlSCVuJWggPDwnRU9GJworY29tbWl0IDEzMWEzMTBlYjkxM2QxMDdkZDNjMDlhNjVkMTY1MTE3NTg5ODczNWQKKzEzMWEzMTBlYjkxM2QxMDdkZDNjMDlhNjVkMTY1MTE3NTg5ODczNWQKKzEzMWEzMTAKK2NvbW1pdCA4NmM3NWNmZDcwOGEwZTU4NjhkYzg3NmVkNWI4YmI2NmM4MGI0ODczCis4NmM3NWNmZDcwOGEwZTU4NjhkYzg3NmVkNWI4YmI2NmM4MGI0ODczCis4NmM3NWNmCitFT0YKKwordGVzdF9mb3JtYXQgdHJlZSAlVCVuJXQgPDwnRU9GJworY29tbWl0IDEzMWEzMTBlYjkxM2QxMDdkZDNjMDlhNjVkMTY1MTE3NTg5ODczNWQKK2ZlNzIyNjEyZjI2ZGE1MDY0YzMyY2EzODQzYWExNTRiZGIwYjA4YTAKK2ZlNzIyNjEKK2NvbW1pdCA4NmM3NWNmZDcwOGEwZTU4NjhkYzg3NmVkNWI4YmI2NmM4MGI0ODczCis0ZDVmY2FkYzI5M2EzNDhlODhmNzc3ZGMwOTIwZjExZTdkNzE0NDFjCis0ZDVmY2FkCitFT0YKKwordGVzdF9mb3JtYXQgcGFyZW50cyAlUCVuJXAgPDwnRU9GJworY29tbWl0IDEzMWEzMTBlYjkxM2QxMDdkZDNjMDlhNjVkMTY1MTE3NTg5ODczNWQKKzg2Yzc1Y2ZkNzA4YTBlNTg2OGRjODc2ZWQ1YjhiYjY2YzgwYjQ4NzMKKzg2Yzc1Y2YKK2NvbW1pdCA4NmM3NWNmZDcwOGEwZTU4NjhkYzg3NmVkNWI4YmI2NmM4MGI0ODczCisKKworRU9GCisKKyMgd2UgZG9uJ3QgdGVzdCByZWxhdGl2ZSBoZXJlCit0ZXN0X2Zvcm1hdCBhdXRob3IgJWFuJW4lYWUlbiVhZCVuJWFEJW4lYXQgPDwnRU9GJworY29tbWl0IDEzMWEzMTBlYjkxM2QxMDdkZDNjMDlhNjVkMTY1MTE3NTg5ODczNWQKK0EgVSBUaG9yCithdXRob3JAZXhhbXBsZS5jb20KK1RodSBBcHIgNyAxNToxMzoxMyAyMDA1IC0wNzAwCitUaHUsIDcgQXByIDIwMDUgMTU6MTM6MTMgLTA3MDAKKzExMTI5MTE5OTMKK2NvbW1pdCA4NmM3NWNmZDcwOGEwZTU4NjhkYzg3NmVkNWI4YmI2NmM4MGI0ODczCitBIFUgVGhvcgorYXV0aG9yQGV4YW1wbGUuY29tCitUaHUgQXByIDcgMTU6MTM6MTMgMjAwNSAtMDcwMAorVGh1LCA3IEFwciAyMDA1IDE1OjEzOjEzIC0wNzAwCisxMTEyOTExOTkzCitFT0YKKwordGVzdF9mb3JtYXQgY29tbWl0dGVyICVjbiVuJWNlJW4lY2QlbiVjRCVuJWN0IDw8J0VPRicKK2NvbW1pdCAxMzFhMzEwZWI5MTNkMTA3ZGQzYzA5YTY1ZDE2NTExNzU4OTg3MzVkCitDIE8gTWl0dGVyCitjb21taXR0ZXJAZXhhbXBsZS5jb20KK1RodSBBcHIgNyAxNToxMzoxMyAyMDA1IC0wNzAwCitUaHUsIDcgQXByIDIwMDUgMTU6MTM6MTMgLTA3MDAKKzExMTI5MTE5OTMKK2NvbW1pdCA4NmM3NWNmZDcwOGEwZTU4NjhkYzg3NmVkNWI4YmI2NmM4MGI0ODczCitDIE8gTWl0dGVyCitjb21taXR0ZXJAZXhhbXBsZS5jb20KK1RodSBBcHIgNyAxNToxMzoxMyAyMDA1IC0wNzAwCitUaHUsIDcgQXByIDIwMDUgMTU6MTM6MTMgLTA3MDAKKzExMTI5MTE5OTMKK0VPRgorCit0ZXN0X2Zvcm1hdCBlbmNvZGluZyAlZSA8PCdFT0YnCitjb21taXQgMTMxYTMxMGViOTEzZDEwN2RkM2MwOWE2NWQxNjUxMTc1ODk4NzM1ZAorY29tbWl0IDg2Yzc1Y2ZkNzA4YTBlNTg2OGRjODc2ZWQ1YjhiYjY2YzgwYjQ4NzMKK0VPRgorCit0ZXN0X2Zvcm1hdCBzdWJqZWN0ICVzIDw8J0VPRicKK2NvbW1pdCAxMzFhMzEwZWI5MTNkMTA3ZGQzYzA5YTY1ZDE2NTExNzU4OTg3MzVkCitjaGFuZ2VkIGZvbworY29tbWl0IDg2Yzc1Y2ZkNzA4YTBlNTg2OGRjODc2ZWQ1YjhiYjY2YzgwYjQ4NzMKK2FkZGVkIGZvbworRU9GCisKK3Rlc3RfZm9ybWF0IGJvZHkgJWIgPDwnRU9GJworY29tbWl0IDEzMWEzMTBlYjkxM2QxMDdkZDNjMDlhNjVkMTY1MTE3NTg5ODczNWQKK2NvbW1pdCA4NmM3NWNmZDcwOGEwZTU4NjhkYzg3NmVkNWI4YmI2NmM4MGI0ODczCitFT0YKKwordGVzdF9mb3JtYXQgY29sb3JzICVDcmVkZm9vJUNncmVlbmJhciVDYmx1ZWJheiVDcmVzZXR4eXp6eSA8PCdFT0YnCitjb21taXQgMTMxYTMxMGViOTEzZDEwN2RkM2MwOWE2NWQxNjUxMTc1ODk4NzM1ZAorG1szMW1mb28bWzMybWJhchtbMzRtYmF6G1tteHl6enkKK2NvbW1pdCA4NmM3NWNmZDcwOGEwZTU4NjhkYzg3NmVkNWI4YmI2NmM4MGI0ODczCisbWzMxbWZvbxtbMzJtYmFyG1szNG1iYXobW214eXp6eQorRU9GCisKK2NhdCA+Y29tbWl0LW1zZyA8PCdFT0YnCitUZXN0IHByaW50aW5nIG9mIGNvbXBsZXggYm9kaWVzCisKK1RoaXMgY29tbWl0IG1lc3NhZ2UgaXMgbXVjaCBsb25nZXIgdGhhbiB0aGUgb3RoZXJzLAorYW5kIGl0IHdpbGwgYmUgZW5jb2RlZCBpbiBpc284ODU5LTEuIFdlIHNob3VsZCB0aGVyZWZvcmUKK2luY2x1ZGUgYW4gaXNvODg1OSBjaGFyYWN0ZXI6IMKhYnVlbm8hCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NldHVwIGNvbXBsZXggYm9keScgJworZ2l0IGNvbmZpZyBpMThuLmNvbW1pdGVuY29kaW5nIGlzbzg4NTktMSAmJgorICBlY2hvIGNoYW5nZTIgPmZvbyAmJiBnaXQtY29tbWl0IC1hIC1GIGNvbW1pdC1tc2cKKycKKwordGVzdF9mb3JtYXQgY29tcGxleC1lbmNvZGluZyAlZSA8PCdFT0YnCitjb21taXQgZjU4ZGI3MGIwNTVjNTcxODYzMWU1YzYxNTI4YjI4YjEyMDkwY2RlYQoraXNvODg1OS0xCitjb21taXQgMTMxYTMxMGViOTEzZDEwN2RkM2MwOWE2NWQxNjUxMTc1ODk4NzM1ZAorY29tbWl0IDg2Yzc1Y2ZkNzA4YTBlNTg2OGRjODc2ZWQ1YjhiYjY2YzgwYjQ4NzMKK0VPRgorCit0ZXN0X2Zvcm1hdCBjb21wbGV4LXN1YmplY3QgJXMgPDwnRU9GJworY29tbWl0IGY1OGRiNzBiMDU1YzU3MTg2MzFlNWM2MTUyOGIyOGIxMjA5MGNkZWEKK1Rlc3QgcHJpbnRpbmcgb2YgY29tcGxleCBib2RpZXMKK2NvbW1pdCAxMzFhMzEwZWI5MTNkMTA3ZGQzYzA5YTY1ZDE2NTExNzU4OTg3MzVkCitjaGFuZ2VkIGZvbworY29tbWl0IDg2Yzc1Y2ZkNzA4YTBlNTg2OGRjODc2ZWQ1YjhiYjY2YzgwYjQ4NzMKK2FkZGVkIGZvbworRU9GCisKK3Rlc3RfZm9ybWF0IGNvbXBsZXgtYm9keSAlYiA8PCdFT0YnCitjb21taXQgZjU4ZGI3MGIwNTVjNTcxODYzMWU1YzYxNTI4YjI4YjEyMDkwY2RlYQorVGhpcyBjb21taXQgbWVzc2FnZSBpcyBtdWNoIGxvbmdlciB0aGFuIHRoZSBvdGhlcnMsCithbmQgaXQgd2lsbCBiZSBlbmNvZGVkIGluIGlzbzg4NTktMS4gV2Ugc2hvdWxkIHRoZXJlZm9yZQoraW5jbHVkZSBhbiBpc284ODU5IGNoYXJhY3RlcjogwqFidWVubyEKKworY29tbWl0IDEzMWEzMTBlYjkxM2QxMDdkZDNjMDlhNjVkMTY1MTE3NTg5ODczNWQKK2NvbW1pdCA4NmM3NWNmZDcwOGEwZTU4NjhkYzg3NmVkNWI4YmI2NmM4MGI0ODczCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZW1wdHkgZW1haWwnICcKKwl0ZXN0X3RpY2sgJiYKKwlDPSQoR0lUX0FVVEhPUl9FTUFJTD0gZ2l0IGNvbW1pdC10cmVlIEhFQURee3RyZWV9IDwvZGV2L251bGwpICYmCisJQT0kKGdpdCBzaG93IC0tcHJldHR5PWZvcm1hdDolYW4sJWFlLCVhZCVuIC1zICRDKSAmJgorCXRlc3QgIiRBIiA9ICJBIFUgVGhvciwsVGh1IEFwciA3IDE1OjE0OjEzIDIwMDUgLTA3MDAiIHx8IHsKKwkJZWNobyAiRWg/ICRBIiA+ZmFpbHVyZQorCQlmYWxzZQorCX0KKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q2MDA3LXJldi1saXN0LWNoZXJyeS1waWNrLWZpbGUuc2ggYi90L3Q2MDA3LXJldi1saXN0LWNoZXJyeS1waWNrLWZpbGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGI4NjExYwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMDctcmV2LWxpc3QtY2hlcnJ5LXBpY2stZmlsZS5zaApAQCAtMCwwICsxLDU3IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0ndGVzdCBnaXQgcmV2LWxpc3QgLS1jaGVycnktcGljayAtLSBmaWxlJworCisuIC4vdGVzdC1saWIuc2gKKworIyBBLS0tQgorIyAgXAorIyAgIFwKKyMgICAgQworIworIyBCIGNoYW5nZXMgYSBmaWxlIGZvby5jLCBhZGRpbmcgYSBsaW5lIG9mIHRleHQuICBDIGNoYW5nZXMgZm9vLmMgYXMKKyMgd2VsbCBhcyBiYXIuYywgYnV0IHRoZSBjaGFuZ2UgaW4gZm9vLmMgd2FzIGlkZW50aWNhbCB0byBjaGFuZ2UgQi4KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJZWNobyBIYWxsbyA+IGZvbyAmJgorCWdpdCBhZGQgZm9vICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSAiQSIgJiYKKwlnaXQgdGFnIEEgJiYKKwlnaXQgY2hlY2tvdXQgLWIgYnJhbmNoICYmCisJZWNobyBCZWxsbyA+IGZvbyAmJgorCWVjaG8gQ2VsbG8gPiBiYXIgJiYKKwlnaXQgYWRkIGZvbyBiYXIgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tICJDIiAmJgorCWdpdCB0YWcgQyAmJgorCWdpdCBjaGVja291dCBtYXN0ZXIgJiYKKwlnaXQgY2hlY2tvdXQgYnJhbmNoIGZvbyAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gIkIiICYmCisJZ2l0IHRhZyBCCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy0tY2hlcnJ5LXBpY2sgZm9vIGNvbWVzIHVwIGVtcHR5JyAnCisJdGVzdCAteiAiJChnaXQgcmV2LWxpc3QgLS1sZWZ0LXJpZ2h0IC0tY2hlcnJ5LXBpY2sgQi4uLkMgLS0gZm9vKSIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLS1jaGVycnktcGljayBiYXIgZG9lcyBub3QgY29tZSB1cCBlbXB0eScgJworCSEgdGVzdCAteiAiJChnaXQgcmV2LWxpc3QgLS1sZWZ0LXJpZ2h0IC0tY2hlcnJ5LXBpY2sgQi4uLkMgLS0gYmFyKSIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLS1jaGVycnktcGljayB3aXRoIGluZGVwZW5kZW50LCBidXQgaWRlbnRpY2FsIGJyYW5jaGVzJyAnCisJZ2l0IHN5bWJvbGljLXJlZiBIRUFEIHJlZnMvaGVhZHMvaW5kZXBlbmRlbnQgJiYKKwlybSAuZ2l0L2luZGV4ICYmCisJZWNobyBIYWxsbyA+IGZvbyAmJgorCWdpdCBhZGQgZm9vICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSAiaW5kZXBlbmRlbnQiICYmCisJZWNobyBCZWxsbyA+IGZvbyAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gImluZGVwZW5kZW50LCB0b28iIGZvbyAmJgorCXRlc3QgLXogIiQoZ2l0IHJldi1saXN0IC0tbGVmdC1yaWdodCAtLWNoZXJyeS1waWNrIFwKKwkJSEVBRC4uLm1hc3RlciAtLSBmb28pIgorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDYwMDgtcmV2LWxpc3Qtc3VibW9kdWxlLnNoIGIvdC90NjAwOC1yZXYtbGlzdC1zdWJtb2R1bGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODhlOTZmYgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMDgtcmV2LWxpc3Qtc3VibW9kdWxlLnNoCkBAIC0wLDAgKzEsNDIgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDcgSm9oYW5uZXMgRS4gU2NoaW5kZWxpbgorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgcmV2LWxpc3QgaW52b2x2aW5nIHN1Ym1vZHVsZXMgdGhhdCB0aGlzIHJlcG8gaGFzJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAnICcKKwk6ID4gZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gaW5pdGlhbCAmJgorCWVjaG8gMSA+IGZpbGUgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIHNlY29uZCBmaWxlICYmCisJZWNobyAyID4gZmlsZSAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gdGhpcmQgZmlsZSAmJgorCisJcm0gLmdpdC9pbmRleCAmJgorCisJOiA+IHN1cGVyLWZpbGUgJiYKKwlnaXQgYWRkIHN1cGVyLWZpbGUgJiYKKwlnaXQgc3VibW9kdWxlIGFkZCAuIHN1YiAmJgorCWdpdCBzeW1ib2xpYy1yZWYgSEVBRCByZWZzL2hlYWRzL3N1cGVyICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSBzdXBlci1pbml0aWFsICYmCisJZWNobyAxID4gc3VwZXItZmlsZSAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gc3VwZXItZmlyc3Qgc3VwZXItZmlsZSAmJgorCWVjaG8gMiA+IHN1cGVyLWZpbGUgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIHN1cGVyLXNlY29uZCBzdXBlci1maWxlCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIklsYXJpJ3MgdGVzdCIgJworCWdpdCByZXYtbGlzdCAtLW9iamVjdHMgc3VwZXIgbWFzdGVyIF5zdXBlcl4KKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q2MDA5LXJldi1saXN0LXBhcmVudC5zaCBiL3QvdDYwMDktcmV2LWxpc3QtcGFyZW50LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM4YTk2YTkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MDA5LXJldi1saXN0LXBhcmVudC5zaApAQCAtMCwwICsxLDM4IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0ncHJvcGVybHkgY3VsbCBhbGwgYW5jZXN0b3JzJworCisuIC4vdGVzdC1saWIuc2gKKworY29tbWl0ICgpIHsKKwl0ZXN0X3RpY2sgJiYKKwllY2hvICQxID5maWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAkMSAmJgorCWdpdCB0YWcgJDEKK30KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwl0b3VjaCBmaWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisKKwljb21taXQgb25lICYmCisKKwl0ZXN0X3RpY2s9JCgoJHRlc3RfdGljayAtIDI0MDApKQorCisJY29tbWl0IHR3byAmJgorCWNvbW1pdCB0aHJlZSAmJgorCWNvbW1pdCBmb3VyICYmCisKKwlnaXQgbG9nIC0tcHJldHR5PW9uZWxpbmUgLS1hYmJyZXYtY29tbWl0CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ29uZSBpcyBhbmNlc3RvciBvZiBvdGhlcnMgYW5kIHNob3VsZCBub3QgYmUgc2hvd24nICcKKworCWdpdCByZXYtbGlzdCBvbmUgLS1ub3QgZm91ciA+cmVzdWx0ICYmCisJPmV4cGVjdCAmJgorCXRlc3RfY21wIGV4cGVjdCByZXN1bHQKKworJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDYwMTAtbWVyZ2UtYmFzZS5zaCBiL3QvdDYwMTAtbWVyZ2UtYmFzZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NmYzZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NjAxMC1tZXJnZS1iYXNlLnNoCkBAIC0wLDAgKzEsMTEwIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J01lcmdlIGJhc2UgY29tcHV0YXRpb24uCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCitUPSQoZ2l0IHdyaXRlLXRyZWUpCisKK009MTEzMDAwMDAwMAorWj0rMDAwMAorCitleHBvcnQgR0lUX0NPTU1JVFRFUl9FTUFJTD1naXRAY29tbS5pdGVyLnh6CitleHBvcnQgR0lUX0NPTU1JVFRFUl9OQU1FPSdDIE8gTW1pdGVyJworZXhwb3J0IEdJVF9BVVRIT1JfTkFNRT0nQSBVIFRob3InCitleHBvcnQgR0lUX0FVVEhPUl9FTUFJTD1naXRAYXUudGhvci54egorCitkb2l0KCkgeworCU9GRlNFVD0kMTsgc2hpZnQKKwlOQU1FPSQxOyBzaGlmdAorCVBBUkVOVFM9CisJZm9yIFAKKwlkbworCQlQQVJFTlRTPSIke1BBUkVOVFN9LXAgJFAgIgorCWRvbmUKKwlHSVRfQ09NTUlUVEVSX0RBVEU9IiQoKCRNICsgJE9GRlNFVCkpICRaIgorCUdJVF9BVVRIT1JfREFURT0kR0lUX0NPTU1JVFRFUl9EQVRFCisJZXhwb3J0IEdJVF9DT01NSVRURVJfREFURSBHSVRfQVVUSE9SX0RBVEUKKwljb21taXQ9JChlY2hvICROQU1FIHwgZ2l0IGNvbW1pdC10cmVlICRUICRQQVJFTlRTKQorCWVjaG8gJGNvbW1pdCA+LmdpdC9yZWZzL3RhZ3MvJE5BTUUKKwllY2hvICRjb21taXQKK30KKworIyAgRS0tLUQtLS1DLS0tQi0tLUEKKyMgIFwnLV8gICAgICAgICBcICAgXAorIyAgIFwgIGAtLS0tLS0tLS1HICAgXAorIyAgICBcICAgICAgICAgICAgICAgIFwKKyMgICAgIEYtLS0tLS0tLS0tLS0tLS0tSAorCisjIFNldHVwLi4uCitFPSQoZG9pdCA1IEUpCitEPSQoZG9pdCA0IEQgJEUpCitGPSQoZG9pdCA2IEYgJEUpCitDPSQoZG9pdCAzIEMgJEQpCitCPSQoZG9pdCAyIEIgJEMpCitBPSQoZG9pdCAxIEEgJEIpCitHPSQoZG9pdCA3IEcgJEIgJEUpCitIPSQoZG9pdCA4IEggJEEgJEYpCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvbXB1dGUgbWVyZ2UtYmFzZSAoc2luZ2xlKScgXAorICAgICdNQj0kKGdpdCBtZXJnZS1iYXNlIEcgSCkgJiYKKyAgICAgZXhwciAiJChnaXQgbmFtZS1yZXYgIiRNQiIpIiA6ICJbMC05YS1mXSogdGFncy9CIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY29tcHV0ZSBtZXJnZS1iYXNlIChhbGwpJyBcCisgICAgJ01CPSQoZ2l0IG1lcmdlLWJhc2UgLS1hbGwgRyBIKSAmJgorICAgICBleHByICIkKGdpdCBuYW1lLXJldiAiJE1CIikiIDogIlswLTlhLWZdKiB0YWdzL0IiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb21wdXRlIG1lcmdlLWJhc2Ugd2l0aCBzaG93LWJyYW5jaCcgXAorICAgICdNQj0kKGdpdCBzaG93LWJyYW5jaCAtLW1lcmdlLWJhc2UgRyBIKSAmJgorICAgICBleHByICIkKGdpdCBuYW1lLXJldiAiJE1CIikiIDogIlswLTlhLWZdKiB0YWdzL0IiJworCisjIFNldHVwIGZvciBzZWNvbmQgdGVzdCB0byBkZW1vbnN0cmF0ZSB0aGF0IHJlbHlpbmcgb24gdGltZXN0YW1wcyBpbiBhCisjIGRpc3RyaWJ1dGVkIFNDTSB0byBwcm92aWRlIGEgX2NvbnNpc3RlbnRfIHBhcnRpYWwgb3JkZXJpbmcgb2YgY29tbWl0cworIyBsZWFkcyB0byBpbnNhbml0eS4KKyMKKyMgICAgICAgICAgICAgICBSZWxhdGl2ZQorIyBTdHJ1Y3R1cmUgICAgIHRpbWVzdGFtcHMKKyMKKyMgICBQTCAgUFIgICAgICAgICs0ICArNAorIyAgLyAgXC8gIFwgICAgICAvICBcLyAgXAorIyBMMiAgQzIgIFIyICAgICszICAtMSAgKzMKKyMgfCAgIHwgICB8ICAgICB8ICAgfCAgIHwKKyMgTDEgIEMxICBSMSAgICArMiAgLTIgICsyCisjIHwgICB8ICAgfCAgICAgfCAgIHwgICB8CisjIEwwICBDMCAgUjAgICAgKzEgIC0zICArMQorIyAgIFwgfCAgLyAgICAgICAgXCB8ICAvCisjICAgICBTICAgICAgICAgICAgIDAKKyMKKyMgVGhlIGxlZnQgYW5kIHJpZ2h0IGNoYWlucyBvZiBjb21taXRzIGNhbiBiZSBvZiBhbnkgbGVuZ3RoIGFuZCBjb21wbGV4aXR5IGFzCisjIGxvbmcgYXMgYWxsIG9mIHRoZSB0aW1lc3RhbXBzIGFyZSBncmVhdGVyIHRoYW4gdGhhdCBvZiBTLgorCitTPSQoZG9pdCAgMCBTKQorCitDMD0kKGRvaXQgLTMgQzAgJFMpCitDMT0kKGRvaXQgLTIgQzEgJEMwKQorQzI9JChkb2l0IC0xIEMyICRDMSkKKworTDA9JChkb2l0ICAxIEwwICRTKQorTDE9JChkb2l0ICAyIEwxICRMMCkKK0wyPSQoZG9pdCAgMyBMMiAkTDEpCisKK1IwPSQoZG9pdCAgMSBSMCAkUykKK1IxPSQoZG9pdCAgMiBSMSAkUjApCitSMj0kKGRvaXQgIDMgUjIgJFIxKQorCitQTD0kKGRvaXQgIDQgUEwgJEwyICRDMikKK1BSPSQoZG9pdCAgNCBQUiAkQzIgJFIyKQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb21wdXRlIG1lcmdlLWJhc2UgKHNpbmdsZSknIFwKKyAgICAnTUI9JChnaXQgbWVyZ2UtYmFzZSBQTCBQUikgJiYKKyAgICAgZXhwciAiJChnaXQgbmFtZS1yZXYgIiRNQiIpIiA6ICJbMC05YS1mXSogdGFncy9DMiInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvbXB1dGUgbWVyZ2UtYmFzZSAoYWxsKScgXAorICAgICdNQj0kKGdpdCBtZXJnZS1iYXNlIC0tYWxsIFBMIFBSKSAmJgorICAgICBleHByICIkKGdpdCBuYW1lLXJldiAiJE1CIikiIDogIlswLTlhLWZdKiB0YWdzL0MyIicKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q2MDIwLW1lcmdlLWRmLnNoIGIvdC90NjAyMC1tZXJnZS1kZi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMTlkNDlkCi0tLSAvZGV2L251bGwKKysrIGIvdC90NjAyMC1tZXJnZS1kZi5zaApAQCAtMCwwICsxLDI1IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEZyZWRyaWsgS3VpdmluZW4KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdCBtZXJnZSB3aXRoIGRpcmVjdG9yeS9maWxlIGNvbmZsaWN0cycKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwcmVwYXJlIHJlcG9zaXRvcnknIFwKKydlY2hvICJIZWxsbyIgPiBpbml0ICYmCitnaXQgYWRkIGluaXQgJiYKK2dpdCBjb21taXQgLW0gIkluaXRpYWwgY29tbWl0IiAmJgorZ2l0IGJyYW5jaCBCICYmCitta2RpciBkaXIgJiYKK2VjaG8gImZvbyIgPiBkaXIvZm9vICYmCitnaXQgYWRkIGRpci9mb28gJiYKK2dpdCBjb21taXQgLW0gIkZpbGU6IGRpci9mb28iICYmCitnaXQgY2hlY2tvdXQgQiAmJgorZWNobyAiZmlsZSBkaXIiID4gZGlyICYmCitnaXQgYWRkIGRpciAmJgorZ2l0IGNvbW1pdCAtbSAiRmlsZTogZGlyIicKKwordGVzdF9leHBlY3RfY29kZSAxICdNZXJnZSB3aXRoIGQvZiBjb25mbGljdHMnICdnaXQgbWVyZ2UgIm1lcmdlIG1zZyIgQiBtYXN0ZXInCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NjAyMS1tZXJnZS1jcmlzcy1jcm9zcy5zaCBiL3QvdDYwMjEtbWVyZ2UtY3Jpc3MtY3Jvc3Muc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGFiMTRhNgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMjEtbWVyZ2UtY3Jpc3MtY3Jvc3Muc2gKQEAgLTAsMCArMSw5MiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBGcmVkcmlrIEt1aXZpbmVuCisjCisKKyMgU2VlIGh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9Z2l0Jm09MTExNDYzMzU4NTAwMzYyJnc9MiBmb3IgYQorIyBuaWNlIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhpcyBpcyBhYm91dC4KKworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IGNyaXNzLWNyb3NzIG1lcmdlJworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ByZXBhcmUgcmVwb3NpdG9yeScgXAorJ2VjaG8gIjEKKzIKKzMKKzQKKzUKKzYKKzcKKzgKKzkiID4gZmlsZSAmJgorZ2l0IGFkZCBmaWxlICYmCitnaXQgY29tbWl0IC1tICJJbml0aWFsIGNvbW1pdCIgZmlsZSAmJgorZ2l0IGJyYW5jaCBBICYmCitnaXQgYnJhbmNoIEIgJiYKK2dpdCBjaGVja291dCBBICYmCitlY2hvICIxCisyCiszCis0Cis1Cis2Cis3Cis4IGNoYW5nZWQgaW4gQjgsIGJyYW5jaCBBCis5IiA+IGZpbGUgJiYKK2dpdCBjb21taXQgLW0gIkI4IiBmaWxlICYmCitnaXQgY2hlY2tvdXQgQiAmJgorZWNobyAiMQorMgorMyBjaGFuZ2VkIGluIEMzLCBicmFuY2ggQgorNAorNQorNgorNworOAorOQorIiA+IGZpbGUgJiYKK2dpdCBjb21taXQgLW0gIkMzIiBmaWxlICYmCitnaXQgYnJhbmNoIEMzICYmCitnaXQgbWVyZ2UgInByZSBFMyBtZXJnZSIgQiBBICYmCitlY2hvICIxCisyCiszIGNoYW5nZWQgaW4gRTMsIGJyYW5jaCBCLiBOZXcgZmlsZSBzaXplCis0Cis1Cis2Cis3Cis4IGNoYW5nZWQgaW4gQjgsIGJyYW5jaCBBCis5CisiID4gZmlsZSAmJgorZ2l0IGNvbW1pdCAtbSAiRTMiIGZpbGUgJiYKK2dpdCBjaGVja291dCBBICYmCitnaXQgbWVyZ2UgInByZSBEOCBtZXJnZSIgQSBDMyAmJgorZWNobyAiMQorMgorMyBjaGFuZ2VkIGluIEMzLCBicmFuY2ggQgorNAorNQorNgorNworOCBjaGFuZ2VkIGluIEQ4LCBicmFuY2ggQS4gTmV3IGZpbGUgc2l6ZSAyCis5IiA+IGZpbGUgJiYKK2dpdCBjb21taXQgLW0gRDggZmlsZScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnQ3Jpc3MtY3Jvc3MgbWVyZ2UnICdnaXQgbWVyZ2UgImZpbmFsIG1lcmdlIiBBIEInCisKK2NhdCA+IGZpbGUtZXhwZWN0IDw8RU9GCisxCisyCiszIGNoYW5nZWQgaW4gRTMsIGJyYW5jaCBCLiBOZXcgZmlsZSBzaXplCis0Cis1Cis2Cis3Cis4IGNoYW5nZWQgaW4gRDgsIGJyYW5jaCBBLiBOZXcgZmlsZSBzaXplIDIKKzkKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdDcmlzcy1jcm9zcyBtZXJnZSByZXN1bHQnICdjbXAgZmlsZSBmaWxlLWV4cGVjdCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q2MDIyLW1lcmdlLXJlbmFtZS5zaCBiL3QvdDYwMjItbWVyZ2UtcmVuYW1lLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUzZjdhZTgKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MDIyLW1lcmdlLXJlbmFtZS5zaApAQCAtMCwwICsxLDM0NCBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J01lcmdlLXJlY3Vyc2l2ZSBtZXJnaW5nIHJlbmFtZXMnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCBcCisnCitjYXQgPkEgPDxcRU9GICYmCithIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYQorYiBiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIKK2MgY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjCitkIGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZAorZSBlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWUKK2YgZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmCitnIGdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZworaCBoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGgKK2kgaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpCitqIGpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqagorayBra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2sKK2wgbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsCittIG1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbQorbiBubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm4KK28gb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vCitFT0YKKworY2F0ID5NIDw8XEVPRiAmJgorQSBBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKK0IgQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCCitDIENDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQworRCBEREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREQKK0UgRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFCitGIEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgorRyBHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0cKK0ggSEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhICitJIElJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSQorSiBKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkoKK0sgS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLCitMIExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAorTSBNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU0KK04gTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OCitPIE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTworRU9GCisKK2dpdCBhZGQgQSBNICYmCitnaXQgY29tbWl0IC1tICJpbml0aWFsIGhhcyBBIGFuZCBNIiAmJgorZ2l0IGJyYW5jaCB3aGl0ZSAmJgorZ2l0IGJyYW5jaCByZWQgJiYKK2dpdCBicmFuY2ggYmx1ZSAmJgorZ2l0IGJyYW5jaCB5ZWxsb3cgJiYKK2dpdCBicmFuY2ggY2hhbmdlICYmCitnaXQgYnJhbmNoIGNoYW5nZStyZW5hbWUgJiYKKworc2VkIC1lICIvXmcgL3MvLiovZyA6IG1hc3RlciBjaGFuZ2VzIGEgbGluZS8iIDxBID5BKyAmJgorbXYgQSsgQSAmJgorZ2l0IGNvbW1pdCAtYSAtbSAibWFzdGVyIHVwZGF0ZXMgQSIgJiYKKworZ2l0IGNoZWNrb3V0IHllbGxvdyAmJgorcm0gLWYgTSAmJgorZ2l0IGNvbW1pdCAtYSAtbSAieWVsbG93IHJlbW92ZXMgTSIgJiYKKworZ2l0IGNoZWNrb3V0IHdoaXRlICYmCitzZWQgLWUgIi9eZyAvcy8uKi9nIDogd2hpdGUgY2hhbmdlcyBhIGxpbmUvIiA8QSA+QiAmJgorc2VkIC1lICIvXkcgL3MvLiovRyA6IGNvbG9yZWQgYnJhbmNoIGNoYW5nZXMgYSBsaW5lLyIgPE0gPk4gJiYKK3JtIC1mIEEgTSAmJgorZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBBIEIgTSBOICYmCitnaXQgY29tbWl0IC1tICJ3aGl0ZSByZW5hbWVzIEEtPkIsIE0tPk4iICYmCisKK2dpdCBjaGVja291dCByZWQgJiYKK3NlZCAtZSAiL15nIC9zLy4qL2cgOiByZWQgY2hhbmdlcyBhIGxpbmUvIiA8QSA+QiAmJgorc2VkIC1lICIvXkcgL3MvLiovRyA6IGNvbG9yZWQgYnJhbmNoIGNoYW5nZXMgYSBsaW5lLyIgPE0gPk4gJiYKK3JtIC1mIEEgTSAmJgorZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBBIEIgTSBOICYmCitnaXQgY29tbWl0IC1tICJyZWQgcmVuYW1lcyBBLT5CLCBNLT5OIiAmJgorCitnaXQgY2hlY2tvdXQgYmx1ZSAmJgorc2VkIC1lICIvXmcgL3MvLiovZyA6IGJsdWUgY2hhbmdlcyBhIGxpbmUvIiA8QSA+QyAmJgorc2VkIC1lICIvXkcgL3MvLiovRyA6IGNvbG9yZWQgYnJhbmNoIGNoYW5nZXMgYSBsaW5lLyIgPE0gPk4gJiYKK3JtIC1mIEEgTSAmJgorZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBBIEMgTSBOICYmCitnaXQgY29tbWl0IC1tICJibHVlIHJlbmFtZXMgQS0+QywgTS0+TiIgJiYKKworZ2l0IGNoZWNrb3V0IGNoYW5nZSAmJgorc2VkIC1lICIvXmcgL3MvLiovZyA6IGNoYW5nZWQgbGluZS8iIDxBID5BKyAmJgorbXYgQSsgQSAmJgorZ2l0IGNvbW1pdCAtcSAtYSAtbSAiY2hhbmdlZCIgJiYKKworZ2l0IGNoZWNrb3V0IGNoYW5nZStyZW5hbWUgJiYKK3NlZCAtZSAiL15nIC9zLy4qL2cgOiBjaGFuZ2VkIGxpbmUvIiA8QSA+QiAmJgorcm0gQSAmJgorZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBCICYmCitnaXQgY29tbWl0IC1xIC1hIC1tICJjaGFuZ2VkIGFuZCByZW5hbWVkIiAmJgorCitnaXQgY2hlY2tvdXQgbWFzdGVyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdWxsIHJlbmFtaW5nIGJyYW5jaCBpbnRvIHVucmVuYW1pbmcgb25lJyBcCisnCisJZ2l0IHNob3ctYnJhbmNoCisJZ2l0IHB1bGwgLiB3aGl0ZSAmJiB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgY29uZmxpY3RlZCIKKwkJcmV0dXJuIDEKKwl9CisJZ2l0IGxzLWZpbGVzIC1zCisJdGVzdCAiJChnaXQgbHMtZmlsZXMgLXUgQiB8IHdjIC1sKSIgLWVxIDMgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGxlZnQgc3RhZ2VzIGZvciBCIgorCQlyZXR1cm4gMQorCX0KKwl0ZXN0ICIkKGdpdCBscy1maWxlcyAtcyBOIHwgd2MgLWwpIiAtZXEgMSB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbWVyZ2VkIE4iCisJCXJldHVybiAxCisJfQorCXNlZCAtbmUgIi9eZy97CisJcAorCXEKKwl9IiBCIHwgZ3JlcCBtYXN0ZXIgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGxpc3RlZCBvdXIgY2hhbmdlIGZpcnN0IgorCQlyZXR1cm4gMQorCX0KKwl0ZXN0ICIkKGdpdCBkaWZmIHdoaXRlIE4gfCB3YyAtbCkiIC1lcSAwIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSB0YWtlbiBjb2xvcmVkIGJyYW5jaCIKKwkJcmV0dXJuIDEKKwl9CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3B1bGwgcmVuYW1pbmcgYnJhbmNoIGludG8gYW5vdGhlciByZW5hbWluZyBvbmUnIFwKKycKKwlybSAtZiBCCisJZ2l0IHJlc2V0IC0taGFyZAorCWdpdCBjaGVja291dCByZWQKKwlnaXQgcHVsbCAuIHdoaXRlICYmIHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBjb25mbGljdGVkIgorCQlyZXR1cm4gMQorCX0KKwl0ZXN0ICIkKGdpdCBscy1maWxlcyAtdSBCIHwgd2MgLWwpIiAtZXEgMyB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbGVmdCBzdGFnZXMiCisJCXJldHVybiAxCisJfQorCXRlc3QgIiQoZ2l0IGxzLWZpbGVzIC1zIE4gfCB3YyAtbCkiIC1lcSAxIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBtZXJnZWQgTiIKKwkJcmV0dXJuIDEKKwl9CisJc2VkIC1uZSAiL15nL3sKKwlwCisJcQorCX0iIEIgfCBncmVwIHJlZCB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbGlzdGVkIG91ciBjaGFuZ2UgZmlyc3QiCisJCXJldHVybiAxCisJfQorCXRlc3QgIiQoZ2l0IGRpZmYgd2hpdGUgTiB8IHdjIC1sKSIgLWVxIDAgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIHRha2VuIGNvbG9yZWQgYnJhbmNoIgorCQlyZXR1cm4gMQorCX0KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHVsbCB1bnJlbmFtaW5nIGJyYW5jaCBpbnRvIHJlbmFtaW5nIG9uZScgXAorJworCWdpdCByZXNldCAtLWhhcmQKKwlnaXQgc2hvdy1icmFuY2gKKwlnaXQgcHVsbCAuIG1hc3RlciAmJiB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgY29uZmxpY3RlZCIKKwkJcmV0dXJuIDEKKwl9CisJdGVzdCAiJChnaXQgbHMtZmlsZXMgLXUgQiB8IHdjIC1sKSIgLWVxIDMgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGxlZnQgc3RhZ2VzIgorCQlyZXR1cm4gMQorCX0KKwl0ZXN0ICIkKGdpdCBscy1maWxlcyAtcyBOIHwgd2MgLWwpIiAtZXEgMSB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbWVyZ2VkIE4iCisJCXJldHVybiAxCisJfQorCXNlZCAtbmUgIi9eZy97CisJcAorCXEKKwl9IiBCIHwgZ3JlcCByZWQgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGxpc3RlZCBvdXIgY2hhbmdlIGZpcnN0IgorCQlyZXR1cm4gMQorCX0KKwl0ZXN0ICIkKGdpdCBkaWZmIHdoaXRlIE4gfCB3YyAtbCkiIC1lcSAwIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSB0YWtlbiBjb2xvcmVkIGJyYW5jaCIKKwkJcmV0dXJuIDEKKwl9CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3B1bGwgY29uZmxpY3RpbmcgcmVuYW1lcycgXAorJworCWdpdCByZXNldCAtLWhhcmQKKwlnaXQgc2hvdy1icmFuY2gKKwlnaXQgcHVsbCAuIGJsdWUgJiYgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGNvbmZsaWN0ZWQiCisJCXJldHVybiAxCisJfQorCXRlc3QgIiQoZ2l0IGxzLWZpbGVzIC11IEEgfCB3YyAtbCkiIC1lcSAxIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBsZWZ0IGEgc3RhZ2UiCisJCXJldHVybiAxCisJfQorCXRlc3QgIiQoZ2l0IGxzLWZpbGVzIC11IEIgfCB3YyAtbCkiIC1lcSAxIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBsZWZ0IGEgc3RhZ2UiCisJCXJldHVybiAxCisJfQorCXRlc3QgIiQoZ2l0IGxzLWZpbGVzIC11IEMgfCB3YyAtbCkiIC1lcSAxIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBsZWZ0IGEgc3RhZ2UiCisJCXJldHVybiAxCisJfQorCXRlc3QgIiQoZ2l0IGxzLWZpbGVzIC1zIE4gfCB3YyAtbCkiIC1lcSAxIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBtZXJnZWQgTiIKKwkJcmV0dXJuIDEKKwl9CisJc2VkIC1uZSAiL15nL3sKKwlwCisJcQorCX0iIEIgfCBncmVwIHJlZCB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbGlzdGVkIG91ciBjaGFuZ2UgZmlyc3QiCisJCXJldHVybiAxCisJfQorCXRlc3QgIiQoZ2l0IGRpZmYgd2hpdGUgTiB8IHdjIC1sKSIgLWVxIDAgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIHRha2VuIGNvbG9yZWQgYnJhbmNoIgorCQlyZXR1cm4gMQorCX0KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW50ZXJmZXJlbmNlIHdpdGggdW50cmFja2VkIHdvcmtpbmcgdHJlZSBmaWxlJyAnCisKKwlnaXQgcmVzZXQgLS1oYXJkCisJZ2l0IHNob3ctYnJhbmNoCisJZWNobyA+QSB0aGlzIGZpbGUgc2hvdWxkIG5vdCBtYXR0ZXIKKwlnaXQgcHVsbCAuIHdoaXRlICYmIHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBjb25mbGljdGVkIgorCQlyZXR1cm4gMQorCX0KKwl0ZXN0IC1mIEEgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGxlZnQgQSBpbnRhY3QiCisJCXJldHVybiAxCisJfQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbnRlcmZlcmVuY2Ugd2l0aCB1bnRyYWNrZWQgd29ya2luZyB0cmVlIGZpbGUnICcKKworCWdpdCByZXNldCAtLWhhcmQKKwlnaXQgY2hlY2tvdXQgd2hpdGUKKwlnaXQgc2hvdy1icmFuY2gKKwlybSAtZiBBCisJZWNobyA+QSB0aGlzIGZpbGUgc2hvdWxkIG5vdCBtYXR0ZXIKKwlnaXQgcHVsbCAuIHJlZCAmJiB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgY29uZmxpY3RlZCIKKwkJcmV0dXJuIDEKKwl9CisJdGVzdCAtZiBBIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBsZWZ0IEEgaW50YWN0IgorCQlyZXR1cm4gMQorCX0KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW50ZXJmZXJlbmNlIHdpdGggdW50cmFja2VkIHdvcmtpbmcgdHJlZSBmaWxlJyAnCisKKwlnaXQgcmVzZXQgLS1oYXJkCisJcm0gLWYgQSBNCisJZ2l0IGNoZWNrb3V0IC1mIG1hc3RlcgorCWdpdCB0YWcgLWYgYW5jaG9yCisJZ2l0IHNob3ctYnJhbmNoCisJZ2l0IHB1bGwgLiB5ZWxsb3cgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGNsZWFubHkgbWVyZ2VkIgorCQlyZXR1cm4gMQorCX0KKwl0ZXN0IC1mIE0gJiYgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIHJlbW92ZWQgTSIKKwkJcmV0dXJuIDEKKwl9CisJZ2l0IHJlc2V0IC0taGFyZCBhbmNob3IKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBkYXRlZCB3b3JraW5nIHRyZWUgZmlsZSBzaG91bGQgcHJldmVudCB0aGUgbWVyZ2UnICcKKworCWdpdCByZXNldCAtLWhhcmQKKwlybSAtZiBBIE0KKwlnaXQgY2hlY2tvdXQgLWYgbWFzdGVyCisJZ2l0IHRhZyAtZiBhbmNob3IKKwlnaXQgc2hvdy1icmFuY2gKKwllY2hvID4+TSBvbmUgbGluZSBhZGRpdGlvbgorCWNhdCBNID5NLnNhdmVkCisJZ2l0IHB1bGwgLiB5ZWxsb3cgJiYgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGNvbXBsYWluZWQiCisJCXJldHVybiAxCisJfQorCWRpZmYgTSBNLnNhdmVkIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBsZWZ0IE0gaW50YWN0IgorCQlyZXR1cm4gMQorCX0KKwlybSAtZiBNLnNhdmVkCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VwZGF0ZWQgd29ya2luZyB0cmVlIGZpbGUgc2hvdWxkIHByZXZlbnQgdGhlIG1lcmdlJyAnCisKKwlnaXQgcmVzZXQgLS1oYXJkCisJcm0gLWYgQSBNCisJZ2l0IGNoZWNrb3V0IC1mIG1hc3RlcgorCWdpdCB0YWcgLWYgYW5jaG9yCisJZ2l0IHNob3ctYnJhbmNoCisJZWNobyA+Pk0gb25lIGxpbmUgYWRkaXRpb24KKwljYXQgTSA+TS5zYXZlZAorCWdpdCB1cGRhdGUtaW5kZXggTQorCWdpdCBwdWxsIC4geWVsbG93ICYmIHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBjb21wbGFpbmVkIgorCQlyZXR1cm4gMQorCX0KKwlkaWZmIE0gTS5zYXZlZCB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbGVmdCBNIGludGFjdCIKKwkJcmV0dXJuIDEKKwl9CisJcm0gLWYgTS5zYXZlZAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbnRlcmZlcmVuY2Ugd2l0aCB1bnRyYWNrZWQgd29ya2luZyB0cmVlIGZpbGUnICcKKworCWdpdCByZXNldCAtLWhhcmQKKwlybSAtZiBBIE0KKwlnaXQgY2hlY2tvdXQgLWYgeWVsbG93CisJZ2l0IHRhZyAtZiBhbmNob3IKKwlnaXQgc2hvdy1icmFuY2gKKwllY2hvID5NIHRoaXMgZmlsZSBzaG91bGQgbm90IG1hdHRlcgorCWdpdCBwdWxsIC4gbWFzdGVyIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBjbGVhbmx5IG1lcmdlZCIKKwkJcmV0dXJuIDEKKwl9CisJdGVzdCAtZiBNIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBsZWZ0IE0gaW50YWN0IgorCQlyZXR1cm4gMQorCX0KKwlnaXQgbHMtZmlsZXMgLXMgfCBncmVwIE0gJiYgeworCQllY2hvICJCQUQ6IE0gbXVzdCBiZSB1bnRyYWNrZWQgaW4gdGhlIHJlc3VsdCIKKwkJcmV0dXJuIDEKKwl9CisJZ2l0IHJlc2V0IC0taGFyZCBhbmNob3IKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2Ugb2YgaWRlbnRpY2FsIGNoYW5nZXMgaW4gYSByZW5hbWVkIGZpbGUnICcKKwlybSAtZiBBIE0gTgorCWdpdCByZXNldCAtLWhhcmQgJiYKKwlnaXQgY2hlY2tvdXQgY2hhbmdlK3JlbmFtZSAmJgorCUdJVF9NRVJHRV9WRVJCT1NJVFk9MyBnaXQgbWVyZ2UgY2hhbmdlIHwgZ3JlcCAiXlNraXBwZWQgQiIgJiYKKwlnaXQgcmVzZXQgLS1oYXJkIEhFQUReICYmCisJZ2l0IGNoZWNrb3V0IGNoYW5nZSAmJgorCUdJVF9NRVJHRV9WRVJCT1NJVFk9MyBnaXQgbWVyZ2UgY2hhbmdlK3JlbmFtZSB8IGdyZXAgIl5Ta2lwcGVkIEIiCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NjAyMy1tZXJnZS1maWxlLnNoIGIvdC90NjAyMy1tZXJnZS1maWxlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc5ZGM1OGIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MDIzLW1lcmdlLWZpbGUuc2gKQEAgLTAsMCArMSwxNjIgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdSQ1MgbWVyZ2UgcmVwbGFjZW1lbnQ6IG1lcmdlLWZpbGUnCisuIC4vdGVzdC1saWIuc2gKKworY2F0ID4gb3JpZy50eHQgPDwgRU9GCitEb21pbnVzIHJlZ2l0IG1lLAorZXQgbmloaWwgbWloaSBkZWVyaXQuCitJbiBsb2NvIHBhc2N1YWUgaWJpIG1lIGNvbGxvY2F2aXQsCitzdXBlciBhcXVhbSByZWZlY3Rpb25pcyBlZHVjYXZpdCBtZTsKK2FuaW1hbSBtZWFtIGNvbnZlcnRpdCwKK2RlZHV4aXQgbWUgc3VwZXIgc2VtaXRhcyBqdXNpdGlhZSwKK3Byb3B0ZXIgbm9tZW4gc3V1bS4KK0VPRgorCitjYXQgPiBuZXcxLnR4dCA8PCBFT0YKK0RvbWludXMgcmVnaXQgbWUsCitldCBuaWhpbCBtaWhpIGRlZXJpdC4KK0luIGxvY28gcGFzY3VhZSBpYmkgbWUgY29sbG9jYXZpdCwKK3N1cGVyIGFxdWFtIHJlZmVjdGlvbmlzIGVkdWNhdml0IG1lOworYW5pbWFtIG1lYW0gY29udmVydGl0LAorZGVkdXhpdCBtZSBzdXBlciBzZW1pdGFzIGp1c2l0aWFlLAorcHJvcHRlciBub21lbiBzdXVtLgorTmFtIGV0IHNpIGFtYnVsYXZlcm8gaW4gbWVkaW8gdW1icmFlIG1vcnRpcywKK25vbiB0aW1lYm8gbWFsYSwgcXVvbmlhbSB0dSBtZWN1bSBlczoKK3ZpcmdhIHR1YSBldCBiYWN1bHVzIHR1dXMgaXBzYSBtZSBjb25zb2xhdGEgc3VudC4KK0VPRgorCitjYXQgPiBuZXcyLnR4dCA8PCBFT0YKK0RvbWludXMgcmVnaXQgbWUsIGV0IG5paGlsIG1paGkgZGVlcml0LgorSW4gbG9jbyBwYXNjdWFlIGliaSBtZSBjb2xsb2Nhdml0LAorc3VwZXIgYXF1YW0gcmVmZWN0aW9uaXMgZWR1Y2F2aXQgbWU7CithbmltYW0gbWVhbSBjb252ZXJ0aXQsCitkZWR1eGl0IG1lIHN1cGVyIHNlbWl0YXMganVzaXRpYWUsCitwcm9wdGVyIG5vbWVuIHN1dW0uCitFT0YKKworY2F0ID4gbmV3My50eHQgPDwgRU9GCitET01JTlVTIHJlZ2l0IG1lLAorZXQgbmloaWwgbWloaSBkZWVyaXQuCitJbiBsb2NvIHBhc2N1YWUgaWJpIG1lIGNvbGxvY2F2aXQsCitzdXBlciBhcXVhbSByZWZlY3Rpb25pcyBlZHVjYXZpdCBtZTsKK2FuaW1hbSBtZWFtIGNvbnZlcnRpdCwKK2RlZHV4aXQgbWUgc3VwZXIgc2VtaXRhcyBqdXNpdGlhZSwKK3Byb3B0ZXIgbm9tZW4gc3V1bS4KK0VPRgorCitjYXQgPiBuZXc0LnR4dCA8PCBFT0YKK0RvbWludXMgcmVnaXQgbWUsIGV0IG5paGlsIG1paGkgZGVlcml0LgorSW4gbG9jbyBwYXNjdWFlIGliaSBtZSBjb2xsb2Nhdml0LAorc3VwZXIgYXF1YW0gcmVmZWN0aW9uaXMgZWR1Y2F2aXQgbWU7CithbmltYW0gbWVhbSBjb252ZXJ0aXQsCitkZWR1eGl0IG1lIHN1cGVyIHNlbWl0YXMganVzaXRpYWUsCitFT0YKK3ByaW50ZiAicHJvcHRlciBub21lbiBzdXVtLiIgPj4gbmV3NC50eHQKKworY3AgbmV3MS50eHQgdGVzdC50eHQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIm1lcmdlIHdpdGhvdXQgY29uZmxpY3QiIFwKKwkiZ2l0IG1lcmdlLWZpbGUgdGVzdC50eHQgb3JpZy50eHQgbmV3Mi50eHQiCisKK2NwIG5ldzEudHh0IHRlc3QyLnR4dAordGVzdF9leHBlY3Rfc3VjY2VzcyAibWVyZ2Ugd2l0aG91dCBjb25mbGljdCAobWlzc2luZyBMRiBhdCBFT0YpIiBcCisJImdpdCBtZXJnZS1maWxlIHRlc3QyLnR4dCBvcmlnLnR4dCBuZXcyLnR4dCIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAibWVyZ2UgcmVzdWx0IGFkZGVkIG1pc3NpbmcgTEYiIFwKKwkiZ2l0IGRpZmYgdGVzdC50eHQgdGVzdDIudHh0IgorCitjcCB0ZXN0LnR4dCBiYWNrdXAudHh0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICJtZXJnZSB3aXRoIGNvbmZsaWN0cyIgXAorCSIhIGdpdCBtZXJnZS1maWxlIHRlc3QudHh0IG9yaWcudHh0IG5ldzMudHh0IgorCitjYXQgPiBleHBlY3QudHh0IDw8IEVPRgorPDw8PDw8PCB0ZXN0LnR4dAorRG9taW51cyByZWdpdCBtZSwgZXQgbmloaWwgbWloaSBkZWVyaXQuCis9PT09PT09CitET01JTlVTIHJlZ2l0IG1lLAorZXQgbmloaWwgbWloaSBkZWVyaXQuCis+Pj4+Pj4+IG5ldzMudHh0CitJbiBsb2NvIHBhc2N1YWUgaWJpIG1lIGNvbGxvY2F2aXQsCitzdXBlciBhcXVhbSByZWZlY3Rpb25pcyBlZHVjYXZpdCBtZTsKK2FuaW1hbSBtZWFtIGNvbnZlcnRpdCwKK2RlZHV4aXQgbWUgc3VwZXIgc2VtaXRhcyBqdXNpdGlhZSwKK3Byb3B0ZXIgbm9tZW4gc3V1bS4KK05hbSBldCBzaSBhbWJ1bGF2ZXJvIGluIG1lZGlvIHVtYnJhZSBtb3J0aXMsCitub24gdGltZWJvIG1hbGEsIHF1b25pYW0gdHUgbWVjdW0gZXM6Cit2aXJnYSB0dWEgZXQgYmFjdWx1cyB0dXVzIGlwc2EgbWUgY29uc29sYXRhIHN1bnQuCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiZXhwZWN0ZWQgY29uZmxpY3QgbWFya2VycyIgImdpdCBkaWZmIHRlc3QudHh0IGV4cGVjdC50eHQiCisKK2NwIGJhY2t1cC50eHQgdGVzdC50eHQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIm1lcmdlIHdpdGggY29uZmxpY3RzLCB1c2luZyAtTCIgXAorCSIhIGdpdCBtZXJnZS1maWxlIC1MIDEgLUwgMiB0ZXN0LnR4dCBvcmlnLnR4dCBuZXczLnR4dCIKKworY2F0ID4gZXhwZWN0LnR4dCA8PCBFT0YKKzw8PDw8PDwgMQorRG9taW51cyByZWdpdCBtZSwgZXQgbmloaWwgbWloaSBkZWVyaXQuCis9PT09PT09CitET01JTlVTIHJlZ2l0IG1lLAorZXQgbmloaWwgbWloaSBkZWVyaXQuCis+Pj4+Pj4+IG5ldzMudHh0CitJbiBsb2NvIHBhc2N1YWUgaWJpIG1lIGNvbGxvY2F2aXQsCitzdXBlciBhcXVhbSByZWZlY3Rpb25pcyBlZHVjYXZpdCBtZTsKK2FuaW1hbSBtZWFtIGNvbnZlcnRpdCwKK2RlZHV4aXQgbWUgc3VwZXIgc2VtaXRhcyBqdXNpdGlhZSwKK3Byb3B0ZXIgbm9tZW4gc3V1bS4KK05hbSBldCBzaSBhbWJ1bGF2ZXJvIGluIG1lZGlvIHVtYnJhZSBtb3J0aXMsCitub24gdGltZWJvIG1hbGEsIHF1b25pYW0gdHUgbWVjdW0gZXM6Cit2aXJnYSB0dWEgZXQgYmFjdWx1cyB0dXVzIGlwc2EgbWUgY29uc29sYXRhIHN1bnQuCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiZXhwZWN0ZWQgY29uZmxpY3QgbWFya2Vycywgd2l0aCAtTCIgXAorCSJnaXQgZGlmZiB0ZXN0LnR4dCBleHBlY3QudHh0IgorCitzZWQgInMvIHR1IC8gVFUgLyIgPCBuZXcxLnR4dCA+IG5ldzUudHh0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICJjb25mbGljdCBpbiByZW1vdmVkIHRhaWwiIFwKKwkiISBnaXQgbWVyZ2UtZmlsZSAtcCBvcmlnLnR4dCBuZXcxLnR4dCBuZXc1LnR4dCA+IG91dCIKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorRG9taW51cyByZWdpdCBtZSwKK2V0IG5paGlsIG1paGkgZGVlcml0LgorSW4gbG9jbyBwYXNjdWFlIGliaSBtZSBjb2xsb2Nhdml0LAorc3VwZXIgYXF1YW0gcmVmZWN0aW9uaXMgZWR1Y2F2aXQgbWU7CithbmltYW0gbWVhbSBjb252ZXJ0aXQsCitkZWR1eGl0IG1lIHN1cGVyIHNlbWl0YXMganVzaXRpYWUsCitwcm9wdGVyIG5vbWVuIHN1dW0uCis8PDw8PDw8IG9yaWcudHh0Cis9PT09PT09CitOYW0gZXQgc2kgYW1idWxhdmVybyBpbiBtZWRpbyB1bWJyYWUgbW9ydGlzLAorbm9uIHRpbWVibyBtYWxhLCBxdW9uaWFtIFRVIG1lY3VtIGVzOgordmlyZ2EgdHVhIGV0IGJhY3VsdXMgdHV1cyBpcHNhIG1lIGNvbnNvbGF0YSBzdW50LgorPj4+Pj4+PiBuZXc1LnR4dAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgImV4cGVjdGVkIGNvbmZsaWN0IG1hcmtlcnMiICJnaXQgZGlmZiBleHBlY3Qgb3V0IgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdiaW5hcnkgZmlsZXMgY2Fubm90IGJlIG1lcmdlZCcgJworCSEgZ2l0IG1lcmdlLWZpbGUgLXAgb3JpZy50eHQgLi4vdGVzdDQwMTIucG5nIG5ldzEudHh0IDI+IG1lcmdlLmVyciAmJgorCWdyZXAgIkNhbm5vdCBtZXJnZSBiaW5hcnkgZmlsZXMiIG1lcmdlLmVycgorJworCitzZWQgLWUgInMvZGVlcml0LiQvZGVlcml0Oy8iIC1lICJzL21lOyQvbWUuLyIgPCBuZXc1LnR4dCA+IG5ldzYudHh0CitzZWQgLWUgInMvZGVlcml0LiQvZGVlcml0LC8iIC1lICJzL21lOyQvbWUsLyIgPCBuZXc1LnR4dCA+IG5ldzcudHh0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ01FUkdFX1pFQUxPVVMgc2ltcGxpZmllcyBub24tY29uZmxpY3RzJyAnCisKKwkhIGdpdCBtZXJnZS1maWxlIC1wIG5ldzYudHh0IG5ldzUudHh0IG5ldzcudHh0ID4gb3V0cHV0ICYmCisJdGVzdCAxID0gJChncmVwID09PT09PT0gPCBvdXRwdXQgfCB3YyAtbCkKKworJworCitzZWQgLWUgJ3MvZGVlcml0Li8mXG5cblxuXG4vJyAtZSAicy9sb2Nhdml0LC9sb2Nhdml0Oy8iIDwgbmV3Ni50eHQgPiBuZXc4LnR4dAorc2VkIC1lICdzL2RlZXJpdC4vJlxuXG5cblxuLycgLWUgInMvbG9jYXZpdCwvbG9jYXZpdCAtLS8iIDwgbmV3Ny50eHQgPiBuZXc5LnR4dAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdaRUFMT1VTX0FMTlVNJyAnCisKKwkhIGdpdCBtZXJnZS1maWxlIC1wIG5ldzgudHh0IG5ldzUudHh0IG5ldzkudHh0ID4gbWVyZ2Uub3V0ICYmCisJdGVzdCAxID0gJChncmVwID09PT09PT0gPCBtZXJnZS5vdXQgfCB3YyAtbCkKKworJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDYwMjMtbWVyZ2UtcmVuYW1lLW5vY3J1ZnQuc2ggYi90L3Q2MDIzLW1lcmdlLXJlbmFtZS1ub2NydWZ0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY1YmU5NWYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MDIzLW1lcmdlLXJlbmFtZS1ub2NydWZ0LnNoCkBAIC0wLDAgKzEsMTM5IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nTWVyZ2UtcmVjdXJzaXZlIG1lcmdpbmcgcmVuYW1lcycKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwIFwKKycKK2NhdCA+QSA8PFxFT0YgJiYKK2EgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhCitiIGJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYgorYyBjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MKK2QgZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkCitlIGVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZQorZiBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKK2cgZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnCitoIGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaAoraSBpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkKK2ogampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqCitrIGtra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2traworbCBsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGwKK20gbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tCituIG5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubgorbyBvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb28KK0VPRgorCitjYXQgPk0gPDxcRU9GICYmCitBIEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQQorQiBCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkIKK0MgQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDCitEIERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERAorRSBFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUUKK0YgRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGCitHIEdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRworSCBISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEgKK0kgSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJCitKIEpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSgorSyBLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0sKK0wgTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMCitNIE1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTQorTiBOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4KK08gT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PCitFT0YKKworZ2l0IGFkZCBBIE0gJiYKK2dpdCBjb21taXQgLW0gImluaXRpYWwgaGFzIEEgYW5kIE0iICYmCitnaXQgYnJhbmNoIHdoaXRlICYmCitnaXQgYnJhbmNoIHJlZCAmJgorZ2l0IGJyYW5jaCBibHVlICYmCisKK2dpdCBjaGVja291dCB3aGl0ZSAmJgorc2VkIC1lICIvXmcgL3MvLiovZyA6IHdoaXRlIGNoYW5nZXMgYSBsaW5lLyIgPEEgPkIgJiYKK3NlZCAtZSAiL15HIC9zLy4qL0cgOiBjb2xvcmVkIGJyYW5jaCBjaGFuZ2VzIGEgbGluZS8iIDxNID5OICYmCitybSAtZiBBIE0gJiYKK2dpdCB1cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgQSBCIE0gTiAmJgorZ2l0IGNvbW1pdCAtbSAid2hpdGUgcmVuYW1lcyBBLT5CLCBNLT5OIiAmJgorCitnaXQgY2hlY2tvdXQgcmVkICYmCitlY2hvIGNyZWF0ZWQgYnkgcmVkID5SICYmCitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIFIgJiYKK2dpdCBjb21taXQgLW0gInJlZCBjcmVhdGVzIFIiICYmCisKK2dpdCBjaGVja291dCBibHVlICYmCitzZWQgLWUgIi9ebyAvcy8uKi9nIDogYmx1ZSBjaGFuZ2VzIGEgbGluZS8iIDxBID5CICYmCitybSAtZiBBICYmCittdiBCIEEgJiYKK2dpdCB1cGRhdGUtaW5kZXggQSAmJgorZ2l0IGNvbW1pdCAtbSAiYmx1ZSBtb2RpZnkgQSIgJiYKKworZ2l0IGNoZWNrb3V0IG1hc3RlcicKKworIyBUaGlzIHRlc3QgYnJva2UgaW4gNjVhYzZlOWMzZjQ3ODA3Y2I2MDNhZjA3YTZhOWUxYTQzYmMxMTlhZQordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2Ugd2hpdGUgaW50byByZWQgKEEtPkIsTS0+TiknIFwKKycKKwlnaXQgY2hlY2tvdXQgLWIgcmVkLXdoaXRlIHJlZCAmJgorCWdpdCBtZXJnZSB3aGl0ZSAmJgorCWdpdCB3cml0ZS10cmVlID4vZGV2L251bGwgfHwgeworCQllY2hvICJCQUQ6IG1lcmdlIGRpZCBub3QgY29tcGxldGUiCisJCXJldHVybiAxCisJfQorCisJdGVzdCAtZiBCIHx8IHsKKwkJZWNobyAiQkFEOiBCIGRvZXMgbm90IGV4aXN0IGluIHdvcmtpbmcgZGlyZWN0b3J5IgorCQlyZXR1cm4gMQorCX0KKwl0ZXN0IC1mIE4gfHwgeworCQllY2hvICJCQUQ6IE4gZG9lcyBub3QgZXhpc3QgaW4gd29ya2luZyBkaXJlY3RvcnkiCisJCXJldHVybiAxCisJfQorCXRlc3QgLWYgUiB8fCB7CisJCWVjaG8gIkJBRDogUiBkb2VzIG5vdCBleGlzdCBpbiB3b3JraW5nIGRpcmVjdG9yeSIKKwkJcmV0dXJuIDEKKwl9CisKKwl0ZXN0IC1mIEEgJiYgeworCQllY2hvICJCQUQ6IEEgc3RpbGwgZXhpc3RzIGluIHdvcmtpbmcgZGlyZWN0b3J5IgorCQlyZXR1cm4gMQorCX0KKwl0ZXN0IC1mIE0gJiYgeworCQllY2hvICJCQUQ6IE0gc3RpbGwgZXhpc3RzIGluIHdvcmtpbmcgZGlyZWN0b3J5IgorCQlyZXR1cm4gMQorCX0KKwlyZXR1cm4gMAorJworCisjIFRoaXMgdGVzdCBicm9rZSBpbiA4MzcxMjM0ZWNhYWY2ZTE0ZmUzZjIwODJhODU1ZWZmMWJiZDc5YWU5Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZSBibHVlIGludG8gd2hpdGUgKEEtPkIsIG1vZCBBLCBBIHVudHJhY2tlZCknIFwKKycKKwlnaXQgY2hlY2tvdXQgLWIgd2hpdGUtYmx1ZSB3aGl0ZSAmJgorCWVjaG8gZGlydHkgPkEgJiYKKwlnaXQgbWVyZ2UgYmx1ZSAmJgorCWdpdCB3cml0ZS10cmVlID4vZGV2L251bGwgfHwgeworCQllY2hvICJCQUQ6IG1lcmdlIGRpZCBub3QgY29tcGxldGUiCisJCXJldHVybiAxCisJfQorCisJdGVzdCAtZiBBIHx8IHsKKwkJZWNobyAiQkFEOiBBIGRvZXMgbm90IGV4aXN0IGluIHdvcmtpbmcgZGlyZWN0b3J5IgorCQlyZXR1cm4gMQorCX0KKwl0ZXN0IGBjYXQgQWAgPSBkaXJ0eSB8fCB7CisJCWVjaG8gIkJBRDogQSBjb250ZW50IGlzIHdyb25nIgorCQlyZXR1cm4gMQorCX0KKwl0ZXN0IC1mIEIgfHwgeworCQllY2hvICJCQUQ6IEIgZG9lcyBub3QgZXhpc3QgaW4gd29ya2luZyBkaXJlY3RvcnkiCisJCXJldHVybiAxCisJfQorCXRlc3QgLWYgTiB8fCB7CisJCWVjaG8gIkJBRDogTiBkb2VzIG5vdCBleGlzdCBpbiB3b3JraW5nIGRpcmVjdG9yeSIKKwkJcmV0dXJuIDEKKwl9CisJdGVzdCAtZiBNICYmIHsKKwkJZWNobyAiQkFEOiBNIHN0aWxsIGV4aXN0cyBpbiB3b3JraW5nIGRpcmVjdG9yeSIKKwkJcmV0dXJuIDEKKwl9CisJcmV0dXJuIDAKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q2MDI0LXJlY3Vyc2l2ZS1tZXJnZS5zaCBiL3QvdDYwMjQtcmVjdXJzaXZlLW1lcmdlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIzZDI0ZDMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MDI0LXJlY3Vyc2l2ZS1tZXJnZS5zaApAQCAtMCwwICsxLDk4IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdCBtZXJnZSB3aXRob3V0IGNvbW1vbiBhbmNlc3RvcnMnCisuIC4vdGVzdC1saWIuc2gKKworIyBUaGlzIHNjZW5hcmlvIGlzIGJhc2VkIG9uIGEgcmVhbC13b3JsZCByZXBvc2l0b3J5IG9mIFNoYXduIFBlYXJjZS4KKworIyAxIC0gQSAtIEQgLSBGCisjICAgXCAgIFggICAvCisjICAgICBCICAgWAorIyAgICAgICBYICAgXAorIyAyIC0gQyAtIEUgLSBHCisKK0dJVF9DT01NSVRURVJfREFURT0iMjAwNi0xMi0xMiAyMzoyODowMCArMDEwMCIKK2V4cG9ydCBHSVRfQ09NTUlUVEVSX0RBVEUKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAic2V0dXAgdGVzdHMiICcKK2VjaG8gMSA+IGExICYmCitnaXQgYWRkIGExICYmCitHSVRfQVVUSE9SX0RBVEU9IjIwMDYtMTItMTIgMjM6MDA6MDAiIGdpdCBjb21taXQgLW0gMSBhMSAmJgorCitnaXQgY2hlY2tvdXQgLWIgQSBtYXN0ZXIgJiYKK2VjaG8gQSA+IGExICYmCitHSVRfQVVUSE9SX0RBVEU9IjIwMDYtMTItMTIgMjM6MDA6MDEiIGdpdCBjb21taXQgLW0gQSBhMSAmJgorCitnaXQgY2hlY2tvdXQgLWIgQiBtYXN0ZXIgJiYKK2VjaG8gQiA+IGExICYmCitHSVRfQVVUSE9SX0RBVEU9IjIwMDYtMTItMTIgMjM6MDA6MDIiIGdpdCBjb21taXQgLW0gQiBhMSAmJgorCitnaXQgY2hlY2tvdXQgLWIgRCBBICYmCitnaXQgcmV2LXBhcnNlIEIgPiAuZ2l0L01FUkdFX0hFQUQgJiYKK2VjaG8gRCA+IGExICYmCitnaXQgdXBkYXRlLWluZGV4IGExICYmCitHSVRfQVVUSE9SX0RBVEU9IjIwMDYtMTItMTIgMjM6MDA6MDMiIGdpdCBjb21taXQgLW0gRCAmJgorCitnaXQgc3ltYm9saWMtcmVmIEhFQUQgcmVmcy9oZWFkcy9vdGhlciAmJgorZWNobyAyID4gYTEgJiYKK0dJVF9BVVRIT1JfREFURT0iMjAwNi0xMi0xMiAyMzowMDowNCIgZ2l0IGNvbW1pdCAtbSAyIGExICYmCisKK2dpdCBjaGVja291dCAtYiBDICYmCitlY2hvIEMgPiBhMSAmJgorR0lUX0FVVEhPUl9EQVRFPSIyMDA2LTEyLTEyIDIzOjAwOjA1IiBnaXQgY29tbWl0IC1tIEMgYTEgJiYKKworZ2l0IGNoZWNrb3V0IC1iIEUgQyAmJgorZ2l0IHJldi1wYXJzZSBCID4gLmdpdC9NRVJHRV9IRUFEICYmCitlY2hvIEUgPiBhMSAmJgorZ2l0IHVwZGF0ZS1pbmRleCBhMSAmJgorR0lUX0FVVEhPUl9EQVRFPSIyMDA2LTEyLTEyIDIzOjAwOjA2IiBnaXQgY29tbWl0IC1tIEUgJiYKKworZ2l0IGNoZWNrb3V0IC1iIEcgRSAmJgorZ2l0IHJldi1wYXJzZSBBID4gLmdpdC9NRVJHRV9IRUFEICYmCitlY2hvIEcgPiBhMSAmJgorZ2l0IHVwZGF0ZS1pbmRleCBhMSAmJgorR0lUX0FVVEhPUl9EQVRFPSIyMDA2LTEyLTEyIDIzOjAwOjA3IiBnaXQgY29tbWl0IC1tIEcgJiYKKworZ2l0IGNoZWNrb3V0IC1iIEYgRCAmJgorZ2l0IHJldi1wYXJzZSBDID4gLmdpdC9NRVJHRV9IRUFEICYmCitlY2hvIEYgPiBhMSAmJgorZ2l0IHVwZGF0ZS1pbmRleCBhMSAmJgorR0lUX0FVVEhPUl9EQVRFPSIyMDA2LTEyLTEyIDIzOjAwOjA4IiBnaXQgY29tbWl0IC1tIEYKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiY29tYmluZWQgbWVyZ2UgY29uZmxpY3RzIiAiISBnaXQgbWVyZ2UgLW0gZmluYWwgRyIKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorPDw8PDw8PCBIRUFEOmExCitGCis9PT09PT09CitHCis+Pj4+Pj4+IEc6YTEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJyZXN1bHQgY29udGFpbnMgYSBjb25mbGljdCIgImdpdCBkaWZmIGV4cGVjdCBhMSIKKworZ2l0IGxzLWZpbGVzIC0tc3RhZ2UgPiBvdXQKK2NhdCA+IGV4cGVjdCA8PCBFT0YKKzEwMDY0NCBkYTA1NmNlMTRhMjI0MTUwOTg5N2ZhNjhiYjJiM2I2ZTYxOTRlZjllIDEJYTEKKzEwMDY0NCBjZjg0NDQzZTQ5ZTFiMzY2ZmFjOTM4NzExZGRmNGJlMmQ0ZDFkOWU5IDIJYTEKKzEwMDY0NCBmZDc5MjM1Mjk4NTVkMGIyNzQ3OTVhZTMzNDljNWUwNDM4MzMzOTc5IDMJYTEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJ2aXJ0dWFsIHRyZWVzIHdlcmUgcHJvY2Vzc2VkIiAiZ2l0IGRpZmYgZXhwZWN0IG91dCIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVmdXNlIHRvIG1lcmdlIGJpbmFyeSBmaWxlcycgJworCWdpdCByZXNldCAtLWhhcmQgJiYKKwlwcmludGYgIlwwIiA+IGJpbmFyeS1maWxlICYmCisJZ2l0IGFkZCBiaW5hcnktZmlsZSAmJgorCWdpdCBjb21taXQgLW0gYmluYXJ5ICYmCisJZ2l0IGNoZWNrb3V0IEcgJiYKKwlwcmludGYgIlwwXDAiID4gYmluYXJ5LWZpbGUgJiYKKwlnaXQgYWRkIGJpbmFyeS1maWxlICYmCisJZ2l0IGNvbW1pdCAtbSBiaW5hcnkyICYmCisJISBnaXQgbWVyZ2UgRiA+IG1lcmdlLm91dCAyPiBtZXJnZS5lcnIgJiYKKwlncmVwICJDYW5ub3QgbWVyZ2UgYmluYXJ5IGZpbGVzOiBIRUFEOmJpbmFyeS1maWxlIHZzLiBGOmJpbmFyeS1maWxlIiBcCisJCW1lcmdlLmVycgorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDYwMjUtbWVyZ2Utc3ltbGlua3Muc2ggYi90L3Q2MDI1LW1lcmdlLXN5bWxpbmtzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYwMDRkZWIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MDI1LW1lcmdlLXN5bWxpbmtzLnNoCkBAIC0wLDAgKzEsNjEgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDcgSm9oYW5uZXMgU2l4dAorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdtZXJnaW5nIHN5bWxpbmtzIG9uIGZpbGVzeXN0ZW0gdy9vIHN5bWxpbmsgc3VwcG9ydC4KKworVGhpcyB0ZXN0cyB0aGF0IGdpdC1tZXJnZS1yZWN1cnNpdmUgd3JpdGVzIG1lcmdlIHJlc3VsdHMgYXMgcGxhaW4gZmlsZXMKK2lmIGNvcmUuc3ltbGlua3MgaXMgZmFsc2UuJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnc2V0dXAnICcKK2dpdCBjb25maWcgY29yZS5zeW1saW5rcyBmYWxzZSAmJgorPiBmaWxlICYmCitnaXQgYWRkIGZpbGUgJiYKK2dpdC1jb21taXQgLW0gaW5pdGlhbCAmJgorZ2l0IGJyYW5jaCBiLXN5bWxpbmsgJiYKK2dpdCBicmFuY2ggYi1maWxlICYmCitsPSQoZWNobyAtbiBmaWxlIHwgZ2l0LWhhc2gtb2JqZWN0IC10IGJsb2IgLXcgLS1zdGRpbikgJiYKK2VjaG8gIjEyMDAwMCAkbAlzeW1saW5rIiB8IGdpdCB1cGRhdGUtaW5kZXggLS1pbmRleC1pbmZvICYmCitnaXQtY29tbWl0IC1tIG1hc3RlciAmJgorZ2l0LWNoZWNrb3V0IGItc3ltbGluayAmJgorbD0kKGVjaG8gLW4gZmlsZS1kaWZmZXJlbnQgfCBnaXQtaGFzaC1vYmplY3QgLXQgYmxvYiAtdyAtLXN0ZGluKSAmJgorZWNobyAiMTIwMDAwICRsCXN5bWxpbmsiIHwgZ2l0IHVwZGF0ZS1pbmRleCAtLWluZGV4LWluZm8gJiYKK2dpdC1jb21taXQgLW0gYi1zeW1saW5rICYmCitnaXQtY2hlY2tvdXQgYi1maWxlICYmCitlY2hvIHBsYWluLWZpbGUgPiBzeW1saW5rICYmCitnaXQgYWRkIHN5bWxpbmsgJiYKK2dpdC1jb21taXQgLW0gYi1maWxlJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKydtZXJnZSBtYXN0ZXIgaW50byBiLXN5bWxpbmssIHdoaWNoIGhhcyBhIGRpZmZlcmVudCBzeW1ib2xpYyBsaW5rJyAnCitnaXQtY2hlY2tvdXQgYi1zeW1saW5rICYmCishIGdpdC1tZXJnZSBtYXN0ZXInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ3RoZSBtZXJnZSByZXN1bHQgbXVzdCBiZSBhIGZpbGUnICcKK3Rlc3QgLWYgc3ltbGluaycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnbWVyZ2UgbWFzdGVyIGludG8gYi1maWxlLCB3aGljaCBoYXMgYSBmaWxlIGluc3RlYWQgb2YgYSBzeW1ib2xpYyBsaW5rJyAnCitnaXQtcmVzZXQgLS1oYXJkICYmIGdpdC1jaGVja291dCBiLWZpbGUgJiYKKyEgZ2l0LW1lcmdlIG1hc3RlcicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisndGhlIG1lcmdlIHJlc3VsdCBtdXN0IGJlIGEgZmlsZScgJwordGVzdCAtZiBzeW1saW5rJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKydtZXJnZSBiLWZpbGUsIHdoaWNoIGhhcyBhIGZpbGUgaW5zdGVhZCBvZiBhIHN5bWJvbGljIGxpbmssIGludG8gbWFzdGVyJyAnCitnaXQtcmVzZXQgLS1oYXJkICYmCitnaXQtY2hlY2tvdXQgbWFzdGVyICYmCishIGdpdC1tZXJnZSBiLWZpbGUnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ3RoZSBtZXJnZSByZXN1bHQgbXVzdCBiZSBhIGZpbGUnICcKK3Rlc3QgLWYgc3ltbGluaycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q2MDI2LW1lcmdlLWF0dHIuc2ggYi90L3Q2MDI2LW1lcmdlLWF0dHIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTZmYzM0MQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMjYtbWVyZ2UtYXR0ci5zaApAQCAtMCwwICsxLDE0NSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdwZXIgcGF0aCBtZXJnZSBjb250cm9sbGVkIGJ5IG1lcmdlIGF0dHJpYnV0ZScKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJZm9yIGYgaW4gdGV4dCBiaW5hcnkgdW5pb24KKwlkbworCQllY2hvIEluaXRpYWwgPiRmICYmIGdpdCBhZGQgJGYgfHwgYnJlYWsKKwlkb25lICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSBJbml0aWFsICYmCisKKwlnaXQgYnJhbmNoIHNpZGUgJiYKKwlmb3IgZiBpbiB0ZXh0IGJpbmFyeSB1bmlvbgorCWRvCisJCWVjaG8gTWFzdGVyID4+JGYgJiYgZ2l0IGFkZCAkZiB8fCBicmVhaworCWRvbmUgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIE1hc3RlciAmJgorCisJZ2l0IGNoZWNrb3V0IHNpZGUgJiYKKwlmb3IgZiBpbiB0ZXh0IGJpbmFyeSB1bmlvbgorCWRvCisJCWVjaG8gU2lkZSA+PiRmICYmIGdpdCBhZGQgJGYgfHwgYnJlYWsKKwlkb25lICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSBTaWRlICYmCisKKwlnaXQgdGFnIGFuY2hvcgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIG1lcmdlICcKKworCXsKKwkJZWNobyAiYmluYXJ5IC1tZXJnZSIKKwkJZWNobyAidW5pb24gbWVyZ2U9dW5pb24iCisJfSA+LmdpdGF0dHJpYnV0ZXMgJiYKKworCWlmIGdpdCBtZXJnZSBtYXN0ZXIKKwl0aGVuCisJCWVjaG8gR2FhaCwgc2hvdWxkIGhhdmUgY29uZmxpY3RlZAorCQlmYWxzZQorCWVsc2UKKwkJZWNobyBPaywgY29uZmxpY3RlZC4KKwlmaQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBtZXJnZSByZXN1bHQgaW4gaW5kZXgnICcKKworCWdpdCBscy1maWxlcyAtdSB8IGdyZXAgYmluYXJ5ICYmCisJZ2l0IGxzLWZpbGVzIC11IHwgZ3JlcCB0ZXh0ICYmCisJISAoZ2l0IGxzLWZpbGVzIC11IHwgZ3JlcCB1bmlvbikKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBtZXJnZSByZXN1bHQgaW4gd29ya2luZyB0cmVlJyAnCisKKwlnaXQgY2F0LWZpbGUgLXAgSEVBRDpiaW5hcnkgPmJpbmFyeS1vcmlnICYmCisJZ3JlcCAiPDw8PDw8PCIgdGV4dCAmJgorCWNtcCBiaW5hcnktb3JpZyBiaW5hcnkgJiYKKwkhIGdyZXAgIjw8PDw8PDwiIHVuaW9uICYmCisJZ3JlcCBNYXN0ZXIgdW5pb24gJiYKKwlncmVwIFNpZGUgdW5pb24KKworJworCitjYXQgPi4vY3VzdG9tLW1lcmdlIDw8XEVPRgorIyEvYmluL3NoCisKK29yaWc9IiQxIiBvdXJzPSIkMiIgdGhlaXJzPSIkMyIgZXhpdD0iJDQiCisoCisJZWNobyAib3JpZyBpcyAkb3JpZyIKKwllY2hvICJvdXJzIGlzICRvdXJzIgorCWVjaG8gInRoZWlycyBpcyAkdGhlaXJzIgorCWVjaG8gIj09PSBvcmlnID09PSIKKwljYXQgIiRvcmlnIgorCWVjaG8gIj09PSBvdXJzID09PSIKKwljYXQgIiRvdXJzIgorCWVjaG8gIj09PSB0aGVpcnMgPT09IgorCWNhdCAiJHRoZWlycyIKKykgPiIkb3VycysiCitjYXQgIiRvdXJzKyIgPiIkb3VycyIKK3JtIC1mICIkb3VycysiCitleGl0ICIkZXhpdCIKK0VPRgorY2htb2QgK3ggLi9jdXN0b20tbWVyZ2UKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY3VzdG9tIG1lcmdlIGJhY2tlbmQnICcKKworCWVjaG8gIiogbWVyZ2U9dW5pb24iID4uZ2l0YXR0cmlidXRlcyAmJgorCWVjaG8gInRleHQgbWVyZ2U9Y3VzdG9tIiA+Pi5naXRhdHRyaWJ1dGVzICYmCisKKwlnaXQgcmVzZXQgLS1oYXJkIGFuY2hvciAmJgorCWdpdCBjb25maWcgLS1yZXBsYWNlLWFsbCBcCisJbWVyZ2UuY3VzdG9tLmRyaXZlciAiLi9jdXN0b20tbWVyZ2UgJU8gJUEgJUIgMCIgJiYKKwlnaXQgY29uZmlnIC0tcmVwbGFjZS1hbGwgXAorCW1lcmdlLmN1c3RvbS5uYW1lICJjdXN0b20gbWVyZ2UgZHJpdmVyIGZvciB0ZXN0aW5nIiAmJgorCisJZ2l0IG1lcmdlIG1hc3RlciAmJgorCisJY21wIGJpbmFyeSB1bmlvbiAmJgorCXNlZCAtZSAxLDNkIHRleHQgPmNoZWNrLTEgJiYKKwlvPSQoZ2l0LXVucGFjay1maWxlIG1hc3Rlcl46dGV4dCkgJiYKKwlhPSQoZ2l0LXVucGFjay1maWxlIHNpZGVeOnRleHQpICYmCisJYj0kKGdpdC11bnBhY2stZmlsZSBtYXN0ZXI6dGV4dCkgJiYKKwlzaCAtYyAiLi9jdXN0b20tbWVyZ2UgJG8gJGEgJGIgMCIgJiYKKwlzZWQgLWUgMSwzZCAkYSA+Y2hlY2stMiAmJgorCWNtcCBjaGVjay0xIGNoZWNrLTIgJiYKKwlybSAtZiAkbyAkYSAkYgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjdXN0b20gbWVyZ2UgYmFja2VuZCcgJworCisJZ2l0IHJlc2V0IC0taGFyZCBhbmNob3IgJiYKKwlnaXQgY29uZmlnIC0tcmVwbGFjZS1hbGwgXAorCW1lcmdlLmN1c3RvbS5kcml2ZXIgIi4vY3VzdG9tLW1lcmdlICVPICVBICVCIDEiICYmCisJZ2l0IGNvbmZpZyAtLXJlcGxhY2UtYWxsIFwKKwltZXJnZS5jdXN0b20ubmFtZSAiY3VzdG9tIG1lcmdlIGRyaXZlciBmb3IgdGVzdGluZyIgJiYKKworCWlmIGdpdCBtZXJnZSBtYXN0ZXIKKwl0aGVuCisJCWVjaG8gIkVoPyBzaG91bGQgaGF2ZSBjb25mbGljdGVkIgorCQlmYWxzZQorCWVsc2UKKwkJZWNobyAiT2ssIGNvbmZsaWN0ZWQiCisJZmkgJiYKKworCWNtcCBiaW5hcnkgdW5pb24gJiYKKwlzZWQgLWUgMSwzZCB0ZXh0ID5jaGVjay0xICYmCisJbz0kKGdpdC11bnBhY2stZmlsZSBtYXN0ZXJeOnRleHQpICYmCisJYT0kKGdpdC11bnBhY2stZmlsZSBhbmNob3I6dGV4dCkgJiYKKwliPSQoZ2l0LXVucGFjay1maWxlIG1hc3Rlcjp0ZXh0KSAmJgorCXNoIC1jICIuL2N1c3RvbS1tZXJnZSAkbyAkYSAkYiAwIiAmJgorCXNlZCAtZSAxLDNkICRhID5jaGVjay0yICYmCisJY21wIGNoZWNrLTEgY2hlY2stMiAmJgorCXJtIC1mICRvICRhICRiCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NjAyNy1tZXJnZS1iaW5hcnkuc2ggYi90L3Q2MDI3LW1lcmdlLWJpbmFyeS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MmNhMWYwCi0tLSAvZGV2L251bGwKKysrIGIvdC90NjAyNy1tZXJnZS1iaW5hcnkuc2gKQEAgLTAsMCArMSw2NyBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J2FzayBtZXJnZS1yZWN1cnNpdmUgdG8gbWVyZ2UgYmluYXJ5IGZpbGVzJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwljYXQgLi4vdGVzdDQwMTIucG5nID5tICYmCisJZ2l0IGFkZCBtICYmCisJZ2l0IGxzLWZpbGVzIC1zIHwgc2VkIC1lICJzLyAwCS8gMQkvIiA+RTEgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tICJpbml0aWFsIiAmJgorCisJZ2l0IGJyYW5jaCBzaWRlICYmCisJZWNobyBmcm90eiA+YSAmJgorCWdpdCBhZGQgYSAmJgorCWVjaG8gbml0Zm9sID4+bSAmJgorCWdpdCBhZGQgYSBtICYmCisJZ2l0IGxzLWZpbGVzIC1zIGEgPkUwICYmCisJZ2l0IGxzLWZpbGVzIC1zIG0gfCBzZWQgLWUgInMvIDAJLyAzCS8iID5FMyAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gIm1hc3RlciBhZGRzIHNvbWUiICYmCisKKwlnaXQgY2hlY2tvdXQgc2lkZSAmJgorCWVjaG8gcmV6cm92ID4+bSAmJgorCWdpdCBhZGQgbSAmJgorCWdpdCBscy1maWxlcyAtcyBtIHwgc2VkIC1lICJzLyAwCS8gMgkvIiA+RTIgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tICJzaWRlIG1vZGlmaWVzIiAmJgorCisJZ2l0IHRhZyBhbmNob3IgJiYKKworCWNhdCBFMCBFMSBFMiBFMyA+ZXhwZWN0CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgcmVzb2x2ZSAnCisKKwlybSAtZiBhKiBtKiAmJgorCWdpdCByZXNldCAtLWhhcmQgYW5jaG9yICYmCisKKwlpZiBnaXQgbWVyZ2UgLXMgcmVzb2x2ZSBtYXN0ZXIKKwl0aGVuCisJCWVjaG8gT29wcywgc2hvdWxkIG5vdCBoYXZlIHN1Y2NlZWRlZAorCQlmYWxzZQorCWVsc2UKKwkJZ2l0IGxzLWZpbGVzIC1zID5jdXJyZW50CisJCXRlc3RfY21wIGN1cnJlbnQgZXhwZWN0CisJZmkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyByZWN1cnNpdmUgJworCisJcm0gLWYgYSogbSogJiYKKwlnaXQgcmVzZXQgLS1oYXJkIGFuY2hvciAmJgorCisJaWYgZ2l0IG1lcmdlIC1zIHJlY3Vyc2l2ZSBtYXN0ZXIKKwl0aGVuCisJCWVjaG8gT29wcywgc2hvdWxkIG5vdCBoYXZlIHN1Y2NlZWRlZAorCQlmYWxzZQorCWVsc2UKKwkJZ2l0IGxzLWZpbGVzIC1zID5jdXJyZW50CisJCXRlc3RfY21wIGN1cnJlbnQgZXhwZWN0CisJZmkKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q2MDI4LW1lcmdlLXVwLXRvLWRhdGUuc2ggYi90L3Q2MDI4LW1lcmdlLXVwLXRvLWRhdGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjhmM2UzZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMjgtbWVyZ2UtdXAtdG8tZGF0ZS5zaApAQCAtMCwwICsxLDc3IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nbWVyZ2UgZmFzdCBmb3J3YXJkIGFuZCB1cCB0byBkYXRlJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJPmZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIGluaXRpYWwgJiYKKwlnaXQgdGFnIGMwICYmCisKKwllY2hvIHNlY29uZCA+ZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gc2Vjb25kICYmCisJZ2l0IHRhZyBjMSAmJgorCWdpdCBicmFuY2ggdGVzdAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZSAtcyByZWN1cnNpdmUgdXAtdG8tZGF0ZScgJworCisJZ2l0IHJlc2V0IC0taGFyZCBjMSAmJgorCXRlc3RfdGljayAmJgorCWdpdCBtZXJnZSAtcyByZWN1cnNpdmUgYzAgJiYKKwlleHBlY3Q9JChnaXQgcmV2LXBhcnNlIGMxKSAmJgorCWN1cnJlbnQ9JChnaXQgcmV2LXBhcnNlIEhFQUQpICYmCisJdGVzdCAiJGV4cGVjdCIgPSAiJGN1cnJlbnQiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UgLXMgcmVjdXJzaXZlIGZhc3QtZm9yd2FyZCcgJworCisJZ2l0IHJlc2V0IC0taGFyZCBjMCAmJgorCXRlc3RfdGljayAmJgorCWdpdCBtZXJnZSAtcyByZWN1cnNpdmUgYzEgJiYKKwlleHBlY3Q9JChnaXQgcmV2LXBhcnNlIGMxKSAmJgorCWN1cnJlbnQ9JChnaXQgcmV2LXBhcnNlIEhFQUQpICYmCisJdGVzdCAiJGV4cGVjdCIgPSAiJGN1cnJlbnQiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UgLXMgb3VycyB1cC10by1kYXRlJyAnCisKKwlnaXQgcmVzZXQgLS1oYXJkIGMxICYmCisJdGVzdF90aWNrICYmCisJZ2l0IG1lcmdlIC1zIG91cnMgYzAgJiYKKwlleHBlY3Q9JChnaXQgcmV2LXBhcnNlIGMxKSAmJgorCWN1cnJlbnQ9JChnaXQgcmV2LXBhcnNlIEhFQUQpICYmCisJdGVzdCAiJGV4cGVjdCIgPSAiJGN1cnJlbnQiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UgLXMgb3VycyBmYXN0LWZvcndhcmQnICcKKworCWdpdCByZXNldCAtLWhhcmQgYzAgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgbWVyZ2UgLXMgb3VycyBjMSAmJgorCWV4cGVjdD0kKGdpdCByZXYtcGFyc2UgYzBee3RyZWV9KSAmJgorCWN1cnJlbnQ9JChnaXQgcmV2LXBhcnNlIEhFQURee3RyZWV9KSAmJgorCXRlc3QgIiRleHBlY3QiID0gIiRjdXJyZW50IgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21lcmdlIC1zIHN1YnRyZWUgdXAtdG8tZGF0ZScgJworCisJZ2l0IHJlc2V0IC0taGFyZCBjMSAmJgorCXRlc3RfdGljayAmJgorCWdpdCBtZXJnZSAtcyBzdWJ0cmVlIGMwICYmCisJZXhwZWN0PSQoZ2l0IHJldi1wYXJzZSBjMSkgJiYKKwljdXJyZW50PSQoZ2l0IHJldi1wYXJzZSBIRUFEKSAmJgorCXRlc3QgIiRleHBlY3QiID0gIiRjdXJyZW50IgorCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NjAyOS1tZXJnZS1zdWJ0cmVlLnNoIGIvdC90NjAyOS1tZXJnZS1zdWJ0cmVlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQzZjU0NTkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MDI5LW1lcmdlLXN1YnRyZWUuc2gKQEAgLTAsMCArMSw3OSBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J3N1YnRyZWUgbWVyZ2Ugc3RyYXRlZ3knCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKworCXM9IjEgMiAzIDQgNSA2IDcgOCIKKwlmb3IgaSBpbiAkczsgZG8gZWNobyAkaTsgZG9uZSA+aGVsbG8gJiYKKwlnaXQgYWRkIGhlbGxvICYmCisJZ2l0IGNvbW1pdCAtbSBpbml0aWFsICYmCisJZ2l0IGNoZWNrb3V0IC1iIHNpZGUgJiYKKwllY2hvID4+aGVsbG8gd29ybGQgJiYKKwlnaXQgYWRkIGhlbGxvICYmCisJZ2l0IGNvbW1pdCAtbSBzZWNvbmQgJiYKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisJZm9yIGkgaW4gbXVuZG8gJHM7IGRvIGVjaG8gJGk7IGRvbmUgPmhlbGxvICYmCisJZ2l0IGFkZCBoZWxsbyAmJgorCWdpdCBjb21taXQgLW0gbWFzdGVyCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc3VidHJlZSBhdmFpbGFibGUgYW5kIHdvcmtzIGxpa2UgcmVjdXJzaXZlJyAnCisKKwlnaXQgbWVyZ2UgLXMgc3VidHJlZSBzaWRlICYmCisJZm9yIGkgaW4gbXVuZG8gJHMgd29ybGQ7IGRvIGVjaG8gJGk7IGRvbmUgPmV4cGVjdCAmJgorCXRlc3RfY21wIGV4cGVjdCBoZWxsbworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NldHVwJyAnCisJbWtkaXIgZ2l0LWd1aSAmJgorCWNkIGdpdC1ndWkgJiYKKwlnaXQgaW5pdCAmJgorCWVjaG8gZ2l0LWd1aSA+IGdpdC1ndWkuc2ggJiYKKwlvMT0kKGdpdCBoYXNoLW9iamVjdCBnaXQtZ3VpLnNoKSAmJgorCWdpdCBhZGQgZ2l0LWd1aS5zaCAmJgorCWdpdCBjb21taXQgLW0gImluaXRpYWwgZ2l0LWd1aSIgJiYKKwljZCAuLiAmJgorCW1rZGlyIGdpdCAmJgorCWNkIGdpdCAmJgorCWdpdCBpbml0ICYmCisJZWNobyBnaXQgPmdpdC5jICYmCisJbzI9JChnaXQgaGFzaC1vYmplY3QgZ2l0LmMpICYmCisJZ2l0IGFkZCBnaXQuYyAmJgorCWdpdCBjb21taXQgLW0gImluaXRpYWwgZ2l0IgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbml0aWFsIG1lcmdlJyAnCisJZ2l0IHJlbW90ZSBhZGQgLWYgZ3VpIC4uL2dpdC1ndWkgJiYKKwlnaXQgbWVyZ2UgLXMgb3VycyAtLW5vLWNvbW1pdCBndWkvbWFzdGVyICYmCisJZ2l0IHJlYWQtdHJlZSAtLXByZWZpeD1naXQtZ3VpLyAtdSBndWkvbWFzdGVyICYmCisJZ2l0IGNvbW1pdCAtbSAiTWVyZ2UgZ2l0LWd1aSBhcyBvdXIgc3ViZGlyZWN0b3J5IiAmJgorCWdpdCBscy1maWxlcyAtcyA+YWN0dWFsICYmCisJKAorCQllY2hvICIxMDA2NDQgJG8xIDAJZ2l0LWd1aS9naXQtZ3VpLnNoIgorCQllY2hvICIxMDA2NDQgJG8yIDAJZ2l0LmMiCisJKSA+ZXhwZWN0ZWQgJiYKKwlnaXQgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UgdXBkYXRlJyAnCisJY2QgLi4vZ2l0LWd1aSAmJgorCWVjaG8gZ2l0LWd1aTIgPiBnaXQtZ3VpLnNoICYmCisJbzM9JChnaXQgaGFzaC1vYmplY3QgZ2l0LWd1aS5zaCkgJiYKKwlnaXQgYWRkIGdpdC1ndWkuc2ggJiYKKwlnaXQgY29tbWl0IC1tICJ1cGRhdGUgZ2l0LWd1aSIgJiYKKwljZCAuLi9naXQgJiYKKwlnaXQgcHVsbCAtcyBzdWJ0cmVlIGd1aSBtYXN0ZXIgJiYKKwlnaXQgbHMtZmlsZXMgLXMgPmFjdHVhbCAmJgorCSgKKwkJZWNobyAiMTAwNjQ0ICRvMyAwCWdpdC1ndWkvZ2l0LWd1aS5zaCIKKwkJZWNobyAiMTAwNjQ0ICRvMiAwCWdpdC5jIgorCSkgPmV4cGVjdGVkICYmCisJZ2l0IGRpZmYgLXUgZXhwZWN0ZWQgYWN0dWFsCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NjAzMC1iaXNlY3QtcG9yY2VsYWluLnNoIGIvdC90NjAzMC1iaXNlY3QtcG9yY2VsYWluLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY0NzFjMTUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MDMwLWJpc2VjdC1wb3JjZWxhaW4uc2gKQEAgLTAsMCArMSwyNzEgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hyaXN0aWFuIENvdWRlcgorIwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdHMgZ2l0LWJpc2VjdCBmdW5jdGlvbmFsaXR5JworCitleGVjIDwvZGV2L251bGwKKworLiAuL3Rlc3QtbGliLnNoCisKK2FkZF9saW5lX2ludG9fZmlsZSgpCit7CisgICAgX2xpbmU9JDEKKyAgICBfZmlsZT0kMgorCisgICAgaWYgWyAtZiAiJF9maWxlIiBdOyB0aGVuCisgICAgICAgIGVjaG8gIiRfbGluZSIgPj4gJF9maWxlIHx8IHJldHVybiAkPworICAgICAgICBNU0c9IkFkZCA8JF9saW5lPiBpbnRvIDwkX2ZpbGU+LiIKKyAgICBlbHNlCisgICAgICAgIGVjaG8gIiRfbGluZSIgPiAkX2ZpbGUgfHwgcmV0dXJuICQ/CisgICAgICAgIGdpdCBhZGQgJF9maWxlIHx8IHJldHVybiAkPworICAgICAgICBNU0c9IkNyZWF0ZSBmaWxlIDwkX2ZpbGU+IHdpdGggPCRfbGluZT4gaW5zaWRlLiIKKyAgICBmaQorCisgICAgdGVzdF90aWNrCisgICAgZ2l0LWNvbW1pdCAtLXF1aWV0IC1tICIkTVNHIiAkX2ZpbGUKK30KKworSEFTSDE9CitIQVNIMj0KK0hBU0gzPQorSEFTSDQ9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NldCB1cCBiYXNpYyByZXBvIHdpdGggMSBmaWxlIChoZWxsbykgYW5kIDQgY29tbWl0cycgJworICAgICBhZGRfbGluZV9pbnRvX2ZpbGUgIjE6IEhlbGxvIFdvcmxkIiBoZWxsbyAmJgorICAgICBIQVNIMT0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkgJiYKKyAgICAgYWRkX2xpbmVfaW50b19maWxlICIyOiBBIG5ldyBkYXkgZm9yIGdpdCIgaGVsbG8gJiYKKyAgICAgSEFTSDI9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisgICAgIGFkZF9saW5lX2ludG9fZmlsZSAiMzogQW5vdGhlciBuZXcgZGF5IGZvciBnaXQiIGhlbGxvICYmCisgICAgIEhBU0gzPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSAmJgorICAgICBhZGRfbGluZV9pbnRvX2ZpbGUgIjQ6IENpYW8gZm9yIG5vdyIgaGVsbG8gJiYKKyAgICAgSEFTSDQ9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Jpc2VjdCBzdGFydHMgd2l0aCBvbmx5IG9uZSBiYWQnICcKKwlnaXQgYmlzZWN0IHJlc2V0ICYmCisJZ2l0IGJpc2VjdCBzdGFydCAmJgorCWdpdCBiaXNlY3QgYmFkICRIQVNINCAmJgorCWdpdCBiaXNlY3QgbmV4dAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdiaXNlY3QgZG9lcyBub3Qgc3RhcnQgd2l0aCBvbmx5IG9uZSBnb29kJyAnCisJZ2l0IGJpc2VjdCByZXNldCAmJgorCWdpdCBiaXNlY3Qgc3RhcnQgJiYKKwlnaXQgYmlzZWN0IGdvb2QgJEhBU0gxIHx8IHJldHVybiAxCisKKwlpZiBnaXQgYmlzZWN0IG5leHQKKwl0aGVuCisJCWVjaG8gT29wcywgc2hvdWxkIGhhdmUgZmFpbGVkLgorCQlmYWxzZQorCWVsc2UKKwkJOgorCWZpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Jpc2VjdCBzdGFydCB3aXRoIG9uZSBiYWQgYW5kIGdvb2QnICcKKwlnaXQgYmlzZWN0IHJlc2V0ICYmCisJZ2l0IGJpc2VjdCBzdGFydCAmJgorCWdpdCBiaXNlY3QgZ29vZCAkSEFTSDEgJiYKKwlnaXQgYmlzZWN0IGJhZCAkSEFTSDQgJiYKKwlnaXQgYmlzZWN0IG5leHQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYmlzZWN0IHJlc2V0OiBiYWNrIGluIHRoZSBtYXN0ZXIgYnJhbmNoJyAnCisJZ2l0IGJpc2VjdCByZXNldCAmJgorCWVjaG8gIiogbWFzdGVyIiA+IGJyYW5jaC5leHBlY3QgJiYKKwlnaXQgYnJhbmNoID4gYnJhbmNoLm91dHB1dCAmJgorCWNtcCBicmFuY2guZXhwZWN0IGJyYW5jaC5vdXRwdXQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYmlzZWN0IHJlc2V0OiBiYWNrIGluIGFub3RoZXIgYnJhbmNoJyAnCisJZ2l0IGNoZWNrb3V0IC1iIG90aGVyICYmCisJZ2l0IGJpc2VjdCBzdGFydCAmJgorCWdpdCBiaXNlY3QgZ29vZCAkSEFTSDEgJiYKKwlnaXQgYmlzZWN0IGJhZCAkSEFTSDMgJiYKKwlnaXQgYmlzZWN0IHJlc2V0ICYmCisJZWNobyAiICBtYXN0ZXIiID4gYnJhbmNoLmV4cGVjdCAmJgorCWVjaG8gIiogb3RoZXIiID4+IGJyYW5jaC5leHBlY3QgJiYKKwlnaXQgYnJhbmNoID4gYnJhbmNoLm91dHB1dCAmJgorCWNtcCBicmFuY2guZXhwZWN0IGJyYW5jaC5vdXRwdXQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYmlzZWN0IHJlc2V0IHdoZW4gbm90IGJpc2VjdGluZycgJworCWdpdCBiaXNlY3QgcmVzZXQgJiYKKwlnaXQgYnJhbmNoID4gYnJhbmNoLm91dHB1dCAmJgorCWNtcCBicmFuY2guZXhwZWN0IGJyYW5jaC5vdXRwdXQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYmlzZWN0IHJlc2V0IHJlbW92ZXMgcGFja2VkIHJlZnMnICcKKwlnaXQgYmlzZWN0IHJlc2V0ICYmCisJZ2l0IGJpc2VjdCBzdGFydCAmJgorCWdpdCBiaXNlY3QgZ29vZCAkSEFTSDEgJiYKKwlnaXQgYmlzZWN0IGJhZCAkSEFTSDMgJiYKKwlnaXQgcGFjay1yZWZzIC0tYWxsIC0tcHJ1bmUgJiYKKwlnaXQgYmlzZWN0IG5leHQgJiYKKwlnaXQgYmlzZWN0IHJlc2V0ICYmCisJdGVzdCAteiAiJChnaXQgZm9yLWVhY2gtcmVmICJyZWZzL2Jpc2VjdC8qIikiICYmCisJdGVzdCAteiAiJChnaXQgZm9yLWVhY2gtcmVmICJyZWZzL2hlYWRzL2Jpc2VjdCIpIgorJworCisjICRIQVNIMSBpcyBnb29kLCAkSEFTSDQgaXMgYmFkLCB3ZSBza2lwICRIQVNIMworIyBidXQgJEhBU0gyIGlzIGJhZCwKKyMgc28gd2Ugc2hvdWxkIGZpbmQgJEhBU0gyIGFzIHRoZSBmaXJzdCBiYWQgY29tbWl0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdiaXNlY3Qgc2tpcDogc3VjY2Vzc2Z1bGwgcmVzdWx0JyAnCisJZ2l0IGJpc2VjdCByZXNldCAmJgorCWdpdCBiaXNlY3Qgc3RhcnQgJEhBU0g0ICRIQVNIMSAmJgorCWdpdCBiaXNlY3Qgc2tpcCAmJgorCWdpdCBiaXNlY3QgYmFkID4gbXlfYmlzZWN0X2xvZy50eHQgJiYKKwlncmVwICIkSEFTSDIgaXMgZmlyc3QgYmFkIGNvbW1pdCIgbXlfYmlzZWN0X2xvZy50eHQgJiYKKwlnaXQgYmlzZWN0IHJlc2V0CisnCisKKyMgJEhBU0gxIGlzIGdvb2QsICRIQVNINCBpcyBiYWQsIHdlIHNraXAgJEhBU0gzIGFuZCAkSEFTSDIKKyMgc28gd2Ugc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHRlbGwgdGhlIGZpcnN0IGJhZCBjb21taXQKKyMgYW1vbmcgJEhBU0gyLCAkSEFTSDMgYW5kICRIQVNINAordGVzdF9leHBlY3Rfc3VjY2VzcyAnYmlzZWN0IHNraXA6IGNhbm5vdCB0ZWxsIGJldHdlZW4gMyBjb21taXRzJyAnCisJZ2l0IGJpc2VjdCBzdGFydCAkSEFTSDQgJEhBU0gxICYmCisJZ2l0IGJpc2VjdCBza2lwIHx8IHJldHVybiAxCisKKwlpZiBnaXQgYmlzZWN0IHNraXAgPiBteV9iaXNlY3RfbG9nLnR4dAorCXRoZW4KKwkJZWNobyBPb3BzLCBzaG91bGQgaGF2ZSBmYWlsZWQuCisJCWZhbHNlCisJZWxzZQorCQl0ZXN0ICQ/IC1lcSAyICYmCisJCWdyZXAgImZpcnN0IGJhZCBjb21taXQgY291bGQgYmUgYW55IG9mIiBteV9iaXNlY3RfbG9nLnR4dCAmJgorCQkhIGdyZXAgJEhBU0gxIG15X2Jpc2VjdF9sb2cudHh0ICYmCisJCWdyZXAgJEhBU0gyIG15X2Jpc2VjdF9sb2cudHh0ICYmCisJCWdyZXAgJEhBU0gzIG15X2Jpc2VjdF9sb2cudHh0ICYmCisJCWdyZXAgJEhBU0g0IG15X2Jpc2VjdF9sb2cudHh0ICYmCisJCWdpdCBiaXNlY3QgcmVzZXQKKwlmaQorJworCisjICRIQVNIMSBpcyBnb29kLCAkSEFTSDQgaXMgYmFkLCB3ZSBza2lwICRIQVNIMworIyBidXQgJEhBU0gyIGlzIGdvb2QsCisjIHNvIHdlIHNob3VsZCBub3QgYmUgYWJsZSB0byB0ZWxsIHRoZSBmaXJzdCBiYWQgY29tbWl0CisjIGFtb25nICRIQVNIMyBhbmQgJEhBU0g0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdiaXNlY3Qgc2tpcDogY2Fubm90IHRlbGwgYmV0d2VlbiAyIGNvbW1pdHMnICcKKwlnaXQgYmlzZWN0IHN0YXJ0ICRIQVNINCAkSEFTSDEgJiYKKwlnaXQgYmlzZWN0IHNraXAgfHwgcmV0dXJuIDEKKworCWlmIGdpdCBiaXNlY3QgZ29vZCA+IG15X2Jpc2VjdF9sb2cudHh0CisJdGhlbgorCQllY2hvIE9vcHMsIHNob3VsZCBoYXZlIGZhaWxlZC4KKwkJZmFsc2UKKwllbHNlCisJCXRlc3QgJD8gLWVxIDIgJiYKKwkJZ3JlcCAiZmlyc3QgYmFkIGNvbW1pdCBjb3VsZCBiZSBhbnkgb2YiIG15X2Jpc2VjdF9sb2cudHh0ICYmCisJCSEgZ3JlcCAkSEFTSDEgbXlfYmlzZWN0X2xvZy50eHQgJiYKKwkJISBncmVwICRIQVNIMiBteV9iaXNlY3RfbG9nLnR4dCAmJgorCQlncmVwICRIQVNIMyBteV9iaXNlY3RfbG9nLnR4dCAmJgorCQlncmVwICRIQVNINCBteV9iaXNlY3RfbG9nLnR4dCAmJgorCQlnaXQgYmlzZWN0IHJlc2V0CisJZmkKKycKKworIyBXZSB3YW50IHRvIGF1dG9tYXRpY2FsbHkgZmluZCB0aGUgY29tbWl0IHRoYXQKKyMgaW50cm9kdWNlZCAiQW5vdGhlciIgaW50byBoZWxsby4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICciZ2l0IGJpc2VjdCBydW4iIHNpbXBsZSBjYXNlJyBcCisgICAgJ2VjaG8gIiMiXCEiL2Jpbi9zaCIgPiB0ZXN0X3NjcmlwdC5zaCAmJgorICAgICBlY2hvICJncmVwIEFub3RoZXIgaGVsbG8gPiAvZGV2L251bGwiID4+IHRlc3Rfc2NyaXB0LnNoICYmCisgICAgIGVjaG8gInRlc3QgXCQ/IC1uZSAwIiA+PiB0ZXN0X3NjcmlwdC5zaCAmJgorICAgICBjaG1vZCAreCB0ZXN0X3NjcmlwdC5zaCAmJgorICAgICBnaXQgYmlzZWN0IHN0YXJ0ICYmCisgICAgIGdpdCBiaXNlY3QgZ29vZCAkSEFTSDEgJiYKKyAgICAgZ2l0IGJpc2VjdCBiYWQgJEhBU0g0ICYmCisgICAgIGdpdCBiaXNlY3QgcnVuIC4vdGVzdF9zY3JpcHQuc2ggPiBteV9iaXNlY3RfbG9nLnR4dCAmJgorICAgICBncmVwICIkSEFTSDMgaXMgZmlyc3QgYmFkIGNvbW1pdCIgbXlfYmlzZWN0X2xvZy50eHQgJiYKKyAgICAgZ2l0IGJpc2VjdCByZXNldCcKKworIyBXZSB3YW50IHRvIGF1dG9tYXRpY2FsbHkgZmluZCB0aGUgY29tbWl0IHRoYXQKKyMgaW50cm9kdWNlZCAiQ2lhbyIgaW50byBoZWxsby4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICciZ2l0IGJpc2VjdCBydW4iIHdpdGggbW9yZSBjb21wbGV4ICJnaXQgYmlzZWN0IHN0YXJ0IicgXAorICAgICdlY2hvICIjIlwhIi9iaW4vc2giID4gdGVzdF9zY3JpcHQuc2ggJiYKKyAgICAgZWNobyAiZ3JlcCBDaWFvIGhlbGxvID4gL2Rldi9udWxsIiA+PiB0ZXN0X3NjcmlwdC5zaCAmJgorICAgICBlY2hvICJ0ZXN0IFwkPyAtbmUgMCIgPj4gdGVzdF9zY3JpcHQuc2ggJiYKKyAgICAgY2htb2QgK3ggdGVzdF9zY3JpcHQuc2ggJiYKKyAgICAgZ2l0IGJpc2VjdCBzdGFydCAkSEFTSDQgJEhBU0gxICYmCisgICAgIGdpdCBiaXNlY3QgcnVuIC4vdGVzdF9zY3JpcHQuc2ggPiBteV9iaXNlY3RfbG9nLnR4dCAmJgorICAgICBncmVwICIkSEFTSDQgaXMgZmlyc3QgYmFkIGNvbW1pdCIgbXlfYmlzZWN0X2xvZy50eHQgJiYKKyAgICAgZ2l0IGJpc2VjdCByZXNldCcKKworIyAkSEFTSDEgaXMgZ29vZCwgJEhBU0g1IGlzIGJhZCwgd2Ugc2tpcCAkSEFTSDMKKyMgYnV0ICRIQVNINCBpcyBnb29kLAorIyBzbyB3ZSBzaG91bGQgZmluZCAkSEFTSDUgYXMgdGhlIGZpcnN0IGJhZCBjb21taXQKK0hBU0g1PQordGVzdF9leHBlY3Rfc3VjY2VzcyAnYmlzZWN0IHNraXA6IGFkZCBsaW5lIGFuZCB0aGVuIGEgbmV3IHRlc3QnICcKKwlhZGRfbGluZV9pbnRvX2ZpbGUgIjU6IEFub3RoZXIgbmV3IGxpbmUuIiBoZWxsbyAmJgorCUhBU0g1PSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSAmJgorCWdpdCBiaXNlY3Qgc3RhcnQgJEhBU0g1ICRIQVNIMSAmJgorCWdpdCBiaXNlY3Qgc2tpcCAmJgorCWdpdCBiaXNlY3QgZ29vZCA+IG15X2Jpc2VjdF9sb2cudHh0ICYmCisJZ3JlcCAiJEhBU0g1IGlzIGZpcnN0IGJhZCBjb21taXQiIG15X2Jpc2VjdF9sb2cudHh0ICYmCisJZ2l0IGJpc2VjdCBsb2cgPiBsb2dfdG9fcmVwbGF5LnR4dCAmJgorCWdpdCBiaXNlY3QgcmVzZXQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYmlzZWN0IHNraXAgYW5kIGJpc2VjdCByZXBsYXknICcKKwlnaXQgYmlzZWN0IHJlcGxheSBsb2dfdG9fcmVwbGF5LnR4dCA+IG15X2Jpc2VjdF9sb2cudHh0ICYmCisJZ3JlcCAiJEhBU0g1IGlzIGZpcnN0IGJhZCBjb21taXQiIG15X2Jpc2VjdF9sb2cudHh0ICYmCisJZ2l0IGJpc2VjdCByZXNldAorJworCitIQVNINj0KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Jpc2VjdCBydW4gJiBza2lwOiBjYW5ub3QgdGVsbCBiZXR3ZWVuIDInICcKKwlhZGRfbGluZV9pbnRvX2ZpbGUgIjY6IFlldCBhIGxpbmUuIiBoZWxsbyAmJgorCUhBU0g2PSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSAmJgorCWVjaG8gIiMiXCEiL2Jpbi9zaCIgPiB0ZXN0X3NjcmlwdC5zaCAmJgorCWVjaG8gInNlZCAtbmUgXFxcJHAgaGVsbG8gfCBncmVwIENpYW8gPiAvZGV2L251bGwgJiYgZXhpdCAxMjUiID4+IHRlc3Rfc2NyaXB0LnNoICYmCisJZWNobyAiZ3JlcCBsaW5lIGhlbGxvID4gL2Rldi9udWxsIiA+PiB0ZXN0X3NjcmlwdC5zaCAmJgorCWVjaG8gInRlc3QgXCQ/IC1uZSAwIiA+PiB0ZXN0X3NjcmlwdC5zaCAmJgorCWNobW9kICt4IHRlc3Rfc2NyaXB0LnNoICYmCisJZ2l0IGJpc2VjdCBzdGFydCAkSEFTSDYgJEhBU0gxICYmCisJaWYgZ2l0IGJpc2VjdCBydW4gLi90ZXN0X3NjcmlwdC5zaCA+IG15X2Jpc2VjdF9sb2cudHh0CisJdGhlbgorCQllY2hvIE9vcHMsIHNob3VsZCBoYXZlIGZhaWxlZC4KKwkJZmFsc2UKKwllbHNlCisJCXRlc3QgJD8gLWVxIDIgJiYKKwkJZ3JlcCAiZmlyc3QgYmFkIGNvbW1pdCBjb3VsZCBiZSBhbnkgb2YiIG15X2Jpc2VjdF9sb2cudHh0ICYmCisJCSEgZ3JlcCAkSEFTSDMgbXlfYmlzZWN0X2xvZy50eHQgJiYKKwkJISBncmVwICRIQVNINiBteV9iaXNlY3RfbG9nLnR4dCAmJgorCQlncmVwICRIQVNINCBteV9iaXNlY3RfbG9nLnR4dCAmJgorCQlncmVwICRIQVNINSBteV9iaXNlY3RfbG9nLnR4dAorCWZpCisnCisKK0hBU0g3PQordGVzdF9leHBlY3Rfc3VjY2VzcyAnYmlzZWN0IHJ1biAmIHNraXA6IGZpbmQgZmlyc3QgYmFkJyAnCisJZ2l0IGJpc2VjdCByZXNldCAmJgorCWFkZF9saW5lX2ludG9fZmlsZSAiNzogU2hvdWxkIGJlIHRoZSBsYXN0IGxpbmUuIiBoZWxsbyAmJgorCUhBU0g3PSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSAmJgorCWVjaG8gIiMiXCEiL2Jpbi9zaCIgPiB0ZXN0X3NjcmlwdC5zaCAmJgorCWVjaG8gInNlZCAtbmUgXFxcJHAgaGVsbG8gfCBncmVwIENpYW8gPiAvZGV2L251bGwgJiYgZXhpdCAxMjUiID4+IHRlc3Rfc2NyaXB0LnNoICYmCisJZWNobyAic2VkIC1uZSBcXFwkcCBoZWxsbyB8IGdyZXAgZGF5ID4gL2Rldi9udWxsICYmIGV4aXQgMTI1IiA+PiB0ZXN0X3NjcmlwdC5zaCAmJgorCWVjaG8gImdyZXAgWWV0IGhlbGxvID4gL2Rldi9udWxsIiA+PiB0ZXN0X3NjcmlwdC5zaCAmJgorCWVjaG8gInRlc3QgXCQ/IC1uZSAwIiA+PiB0ZXN0X3NjcmlwdC5zaCAmJgorCWNobW9kICt4IHRlc3Rfc2NyaXB0LnNoICYmCisJZ2l0IGJpc2VjdCBzdGFydCAkSEFTSDcgJEhBU0gxICYmCisJZ2l0IGJpc2VjdCBydW4gLi90ZXN0X3NjcmlwdC5zaCA+IG15X2Jpc2VjdF9sb2cudHh0ICYmCisJZ3JlcCAiJEhBU0g2IGlzIGZpcnN0IGJhZCBjb21taXQiIG15X2Jpc2VjdF9sb2cudHh0CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Jpc2VjdCBzdGFydGluZyB3aXRoIGEgZGV0YWNoZWQgSEVBRCcgJworCisJZ2l0IGJpc2VjdCByZXNldCAmJgorCWdpdCBjaGVja291dCBtYXN0ZXJeICYmCisJSEVBRD0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkgJiYKKwlnaXQgYmlzZWN0IHN0YXJ0ICYmCisJdGVzdCAkSEVBRCA9ICQoY2F0IC5naXQvQklTRUNUX1NUQVJUKSAmJgorCWdpdCBiaXNlY3QgcmVzZXQgJiYKKwl0ZXN0ICRIRUFEID0gJChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpCisKKycKKworIworIwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q2MDMxLW1lcmdlLXJlY3Vyc2l2ZS5zaCBiL3QvdDYwMzEtbWVyZ2UtcmVjdXJzaXZlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM4MzEwYWUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MDMxLW1lcmdlLXJlY3Vyc2l2ZS5zaApAQCAtMCwwICsxLDQ5IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nbWVyZ2UtcmVjdXJzaXZlOiBoYW5kbGUgZmlsZSBtb2RlJworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21vZGUgY2hhbmdlIGluIG9uZSBicmFuY2g6IGtlZXAgY2hhbmdlZCB2ZXJzaW9uJyAnCisJOiA+ZmlsZTEgJiYKKwlnaXQgYWRkIGZpbGUxICYmCisJZ2l0IGNvbW1pdCAtbSBpbml0aWFsICYmCisJZ2l0IGNoZWNrb3V0IC1iIGExIG1hc3RlciAmJgorCTogPmR1bW15ICYmCisJZ2l0IGFkZCBkdW1teSAmJgorCWdpdCBjb21taXQgLW0gYSAmJgorCWdpdCBjaGVja291dCAtYiBiMSBtYXN0ZXIgJiYKKwljaG1vZCAreCBmaWxlMSAmJgorCWdpdCBhZGQgZmlsZTEgJiYKKwlnaXQgY29tbWl0IC1tIGIxICYmCisJZ2l0IGNoZWNrb3V0IGExICYmCisJZ2l0IG1lcmdlLXJlY3Vyc2l2ZSBtYXN0ZXIgLS0gYTEgYjEgJiYKKwl0ZXN0IC14IGZpbGUxCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21vZGUgY2hhbmdlIGluIGJvdGggYnJhbmNoZXM6IGV4cGVjdCBjb25mbGljdCcgJworCWdpdCByZXNldCAtLWhhcmQgSEVBRCAmJgorCWdpdCBjaGVja291dCAtYiBhMiBtYXN0ZXIgJiYKKwk6ID5maWxlMiAmJgorCUg9JChnaXQgaGFzaC1vYmplY3QgZmlsZTIpICYmCisJY2htb2QgK3ggZmlsZTIgJiYKKwlnaXQgYWRkIGZpbGUyICYmCisJZ2l0IGNvbW1pdCAtbSBhMiAmJgorCWdpdCBjaGVja291dCAtYiBiMiBtYXN0ZXIgJiYKKwk6ID5maWxlMiAmJgorCWdpdCBhZGQgZmlsZTIgJiYKKwlnaXQgY29tbWl0IC1tIGIyICYmCisJZ2l0IGNoZWNrb3V0IGEyICYmCisJKAorCQlnaXQgbWVyZ2UtcmVjdXJzaXZlIG1hc3RlciAtLSBhMiBiMgorCQl0ZXN0ICQ/ID0gMQorCSkgJiYKKwlnaXQgbHMtZmlsZXMgLXUgPmFjdHVhbCAmJgorCSgKKwkJZWNobyAiMTAwNzU1ICRIIDIJZmlsZTIiCisJCWVjaG8gIjEwMDY0NCAkSCAzCWZpbGUyIgorCSkgPmV4cGVjdCAmJgorCXRlc3RfY21wIGFjdHVhbCBleHBlY3QgJiYKKwl0ZXN0IC14IGZpbGUyCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NjEwMS1yZXYtcGFyc2UtcGFyZW50cy5zaCBiL3QvdDYxMDEtcmV2LXBhcnNlLXBhcmVudHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjMyOGI2OQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYxMDEtcmV2LXBhcnNlLXBhcmVudHMuc2gKQEAgLTAsMCArMSw0MiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKb2hhbm5lcyBTY2hpbmRlbGluCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgZ2l0IHJldi1wYXJzZSB3aXRoIGRpZmZlcmVudCBwYXJlbnQgb3B0aW9ucycKKworLiAuL3Rlc3QtbGliLnNoCisuIC4uL3Q2MDAwbGliLnNoICMgdDZ4eHggc3BlY2lmaWMgZnVuY3Rpb25zCisKK2RhdGUgPnBhdGgwCitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIHBhdGgwCitzYXZlX3RhZyB0cmVlIGdpdCB3cml0ZS10cmVlCitoaWRlX2Vycm9yIHNhdmVfdGFnIHN0YXJ0IHVuaXF1ZV9jb21taXQgInN0YXJ0IiB0cmVlCitzYXZlX3RhZyBzZWNvbmQgdW5pcXVlX2NvbW1pdCAic2Vjb25kIiB0cmVlIC1wIHN0YXJ0CitoaWRlX2Vycm9yIHNhdmVfdGFnIHN0YXJ0MiB1bmlxdWVfY29tbWl0ICJzdGFydDIiIHRyZWUKK3NhdmVfdGFnIHR3b19wYXJlbnRzIHVuaXF1ZV9jb21taXQgIm5leHQiIHRyZWUgLXAgc2Vjb25kIC1wIHN0YXJ0Mgorc2F2ZV90YWcgZmluYWwgdW5pcXVlX2NvbW1pdCAiZmluYWwiIHRyZWUgLXAgdHdvX3BhcmVudHMKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc3RhcnQgaXMgdmFsaWQnICdnaXQgcmV2LXBhcnNlIHN0YXJ0IHwgZ3JlcCAiXlswLTlhLWZdXHs0MFx9JCInCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzdGFydF4wJyAidGVzdCAkKGNhdCAuZ2l0L3JlZnMvdGFncy9zdGFydCkgPSAkKGdpdCByZXYtcGFyc2Ugc3RhcnReMCkiCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzdGFydF4xIG5vdCB2YWxpZCcgImlmIGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgc3RhcnReMTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaSIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NlY29uZF4xID0gc2Vjb25kXicgInRlc3QgJChnaXQgcmV2LXBhcnNlIHNlY29uZF4xKSA9ICQoZ2l0IHJldi1wYXJzZSBzZWNvbmReKSIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZpbmFsXjFeMV4xJyAidGVzdCAkKGdpdCByZXYtcGFyc2Ugc3RhcnQpID0gJChnaXQgcmV2LXBhcnNlIGZpbmFsXjFeMV4xKSIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZpbmFsXjFeMV4xID0gZmluYWxeXl4nICJ0ZXN0ICQoZ2l0IHJldi1wYXJzZSBmaW5hbF4xXjFeMSkgPSAkKGdpdCByZXYtcGFyc2UgZmluYWxeXl4pIgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmluYWxeMV4yJyAidGVzdCAkKGdpdCByZXYtcGFyc2Ugc3RhcnQyKSA9ICQoZ2l0IHJldi1wYXJzZSBmaW5hbF4xXjIpIgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmluYWxeMV4yICE9IGZpbmFsXjFeMScgInRlc3QgJChnaXQgcmV2LXBhcnNlIGZpbmFsXjFeMikgIT0gJChnaXQgcmV2LXBhcnNlIGZpbmFsXjFeMSkiCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmaW5hbF4xXjMgbm90IHZhbGlkJyAiaWYgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBmaW5hbF4xXjM7IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmkiCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctLXZlcmlmeSBzdGFydDJeMScgJyEgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBzdGFydDJeMScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy0tdmVyaWZ5IHN0YXJ0Ml4wJyAnZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBzdGFydDJeMCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVwYWNrIGZvciBuZXh0IHRlc3QnICdnaXQgcmVwYWNrIC1hIC1kJwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2hvcnQgU0hBLTEgd29ya3MnICcKKwlzdGFydD1gZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBzdGFydGAgJiYKKwllY2hvICRzdGFydCAmJgorCWFiYnJ2PWBlY2hvICRzdGFydCB8IHNlZCBzLy5cJC8vYCAmJgorCWVjaG8gJGFiYnJ2ICYmCisJYWJicnY9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgJGFiYnJ2YCAmJgorCWVjaG8gJGFiYnJ2ICYmCisJdGVzdCAkc3RhcnQgPSAkYWJicnYnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NjEyMC1kZXNjcmliZS5zaCBiL3QvdDYxMjAtZGVzY3JpYmUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTZiYmQ4NQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYxMjAtZGVzY3JpYmUuc2gKQEAgLTAsMCArMSwxMjAgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSd0ZXN0IGRlc2NyaWJlCisKKyAgICAgICAgICAgICAgICAgICAgICAgQgorICAgICAgICAuLS0tLS0tLS0tLS0tLS1vLS0tLW8tLS0tby0tLS14CisgICAgICAgLyAgICAgICAgICAgICAgICAgICAvICAgIC8KKyBvLS0tLW8tLS0tby0tLS1vLS0tLW8tLS0tLiAgICAvCisgICAgICAgXCAgICAgICAgQSAgICBjICAgICAgICAvCisgICAgICAgIC4tLS0tLS0tLS0tLS1vLS0tby0tLW8KKyAgICAgICAgICAgICAgICAgICAgIEQgICBlCisnCisuIC4vdGVzdC1saWIuc2gKKworY2hlY2tfZGVzY3JpYmUgKCkgeworCWV4cGVjdD0iJDEiCisJc2hpZnQKKwlSPSQoZ2l0IGRlc2NyaWJlICIkQCIgMj5lcnIuYWN0dWFsKQorCVM9JD8KKwljYXQgZXJyLmFjdHVhbCA+JjMKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICJkZXNjcmliZSAkKiIgJworCXRlc3QgJFMgPSAwICYmCisJY2FzZSAiJFIiIGluCisJJGV4cGVjdCkJZWNobyBoYXBweSA7OworCSopCWVjaG8gIk9vcHMgLSAkUiBpcyBub3QgJGV4cGVjdCI7CisJCWZhbHNlIDs7CisJZXNhYworCScKK30KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwl0ZXN0X3RpY2sgJiYKKwllY2hvIG9uZSA+ZmlsZSAmJiBnaXQgYWRkIGZpbGUgJiYgZ2l0LWNvbW1pdCAtbSBpbml0aWFsICYmCisJb25lPSQoZ2l0IHJldi1wYXJzZSBIRUFEKSAmJgorCisJdGVzdF90aWNrICYmCisJZWNobyB0d28gPmZpbGUgJiYgZ2l0IGFkZCBmaWxlICYmIGdpdC1jb21taXQgLW0gc2Vjb25kICYmCisJdHdvPSQoZ2l0IHJldi1wYXJzZSBIRUFEKSAmJgorCisJdGVzdF90aWNrICYmCisJZWNobyB0aHJlZSA+ZmlsZSAmJiBnaXQgYWRkIGZpbGUgJiYgZ2l0LWNvbW1pdCAtbSB0aGlyZCAmJgorCisJdGVzdF90aWNrICYmCisJZWNobyBBID5maWxlICYmIGdpdCBhZGQgZmlsZSAmJiBnaXQtY29tbWl0IC1tIEEgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQtdGFnIC1hIC1tIEEgQSAmJgorCisJdGVzdF90aWNrICYmCisJZWNobyBjID5maWxlICYmIGdpdCBhZGQgZmlsZSAmJiBnaXQtY29tbWl0IC1tIGMgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQtdGFnIGMgJiYKKworCWdpdCByZXNldCAtLWhhcmQgJHR3byAmJgorCXRlc3RfdGljayAmJgorCWVjaG8gQiA+c2lkZSAmJiBnaXQgYWRkIHNpZGUgJiYgZ2l0LWNvbW1pdCAtbSBCICYmCisJdGVzdF90aWNrICYmCisJZ2l0LXRhZyAtYSAtbSBCIEIgJiYKKworCXRlc3RfdGljayAmJgorCWdpdC1tZXJnZSAtbSBNZXJnZWQgYyAmJgorCW1lcmdlZD0kKGdpdCByZXYtcGFyc2UgSEVBRCkgJiYKKworCWdpdCByZXNldCAtLWhhcmQgJHR3byAmJgorCXRlc3RfdGljayAmJgorCWVjaG8gRCA+YW5vdGhlciAmJiBnaXQgYWRkIGFub3RoZXIgJiYgZ2l0LWNvbW1pdCAtbSBEICYmCisJdGVzdF90aWNrICYmCisJZ2l0LXRhZyAtYSAtbSBEIEQgJiYKKworCXRlc3RfdGljayAmJgorCWVjaG8gREQgPmFub3RoZXIgJiYgZ2l0IGNvbW1pdCAtYSAtbSBhbm90aGVyICYmCisKKwl0ZXN0X3RpY2sgJiYKKwlnaXQtdGFnIGUgJiYKKworCXRlc3RfdGljayAmJgorCWVjaG8gREREID5hbm90aGVyICYmIGdpdCBjb21taXQgLWEgLW0gInlldCBhbm90aGVyIiAmJgorCisJdGVzdF90aWNrICYmCisJZ2l0LW1lcmdlIC1tIE1lcmdlZCAkbWVyZ2VkICYmCisKKwl0ZXN0X3RpY2sgJiYKKwllY2hvIFggPmZpbGUgJiYgZWNobyBYID5zaWRlICYmIGdpdCBhZGQgZmlsZSBzaWRlICYmCisJZ2l0LWNvbW1pdCAtbSB4CisKKycKKworY2hlY2tfZGVzY3JpYmUgQS0qIEhFQUQKK2NoZWNrX2Rlc2NyaWJlIEEtKiBIRUFEXgorY2hlY2tfZGVzY3JpYmUgRC0qIEhFQUReXgorY2hlY2tfZGVzY3JpYmUgQS0qIEhFQUReXjIKK2NoZWNrX2Rlc2NyaWJlIEIgSEVBRF5eMl4KKworY2hlY2tfZGVzY3JpYmUgQS0qIC0tdGFncyBIRUFECitjaGVja19kZXNjcmliZSBBLSogLS10YWdzIEhFQUReCitjaGVja19kZXNjcmliZSBELSogLS10YWdzIEhFQUReXgorY2hlY2tfZGVzY3JpYmUgQS0qIC0tdGFncyBIRUFEXl4yCitjaGVja19kZXNjcmliZSBCIC0tdGFncyBIRUFEXl4yXgorCitjaGVja19kZXNjcmliZSBCLTAtKiAtLWxvbmcgSEVBRF5eMl4KK2NoZWNrX2Rlc2NyaWJlIEEtMy0qIC0tbG9uZyBIRUFEXl4yCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlbmFtZSB0YWcgQSB0byBRIGxvY2FsbHknICcKKwltdiAuZ2l0L3JlZnMvdGFncy9BIC5naXQvcmVmcy90YWdzL1EKKycKK2NhdCAtID5lcnIuZXhwZWN0IDw8RU9GCit3YXJuaW5nOiB0YWcgJ0EnIGlzIHJlYWxseSAnUScgaGVyZQorRU9GCitjaGVja19kZXNjcmliZSBBLSogSEVBRAordGVzdF9leHBlY3Rfc3VjY2VzcyAnd2FybmluZyB3YXMgZGlzcGxheWVkIGZvciBRJyAnCisJZ2l0IGRpZmYgZXJyLmV4cGVjdCBlcnIuYWN0dWFsCisnCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZW5hbWUgdGFnIFEgYmFjayB0byBBJyAnCisJbXYgLmdpdC9yZWZzL3RhZ3MvUSAuZ2l0L3JlZnMvdGFncy9BCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3BhY2sgdGFnIHJlZnMnICdnaXQgcGFjay1yZWZzJworY2hlY2tfZGVzY3JpYmUgQS0qIEhFQUQKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q2MjAwLWZtdC1tZXJnZS1tc2cuc2ggYi90L3Q2MjAwLWZtdC1tZXJnZS1tc2cuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTI2ZDdkMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYyMDAtZm10LW1lcmdlLW1zZy5zaApAQCAtMCwwICsxLDE2MyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiwgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZm10LW1lcmdlLW1zZyB0ZXN0JworCisuIC4vdGVzdC1saWIuc2gKKworZGF0ZXN0YW1wPTExNTE5Mzk5MjMKK3NldGRhdGUgKCkgeworCUdJVF9DT01NSVRURVJfREFURT0iJGRhdGVzdGFtcCArMDIwMCIKKwlHSVRfQVVUSE9SX0RBVEU9IiRkYXRlc3RhbXAgKzAyMDAiCisJZGF0ZXN0YW1wPWBleHByICIkZGF0ZXN0YW1wIiArIDFgCisJZXhwb3J0IEdJVF9DT01NSVRURVJfREFURSBHSVRfQVVUSE9SX0RBVEUKK30KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJZWNobyBvbmUgPm9uZSAmJgorCWdpdCBhZGQgb25lICYmCisJc2V0ZGF0ZSAmJgorCWdpdCBjb21taXQgLW0gIkluaXRpYWwiICYmCisKKwllY2hvIHVubyA+b25lICYmCisJZWNobyBkb3MgPnR3byAmJgorCWdpdCBhZGQgdHdvICYmCisJc2V0ZGF0ZSAmJgorCWdpdCBjb21taXQgLWEgLW0gIlNlY29uZCIgJiYKKworCWdpdCBjaGVja291dCAtYiBsZWZ0ICYmCisKKwllY2hvICRkYXRlc3RhbXAgPm9uZSAmJgorCXNldGRhdGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJDb21tb24gIzEiICYmCisKKwllY2hvICRkYXRlc3RhbXAgPm9uZSAmJgorCXNldGRhdGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJDb21tb24gIzIiICYmCisKKwlnaXQgYnJhbmNoIHJpZ2h0ICYmCisKKwllY2hvICRkYXRlc3RhbXAgPnR3byAmJgorCXNldGRhdGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJMZWZ0ICMzIiAmJgorCisJZWNobyAkZGF0ZXN0YW1wID50d28gJiYKKwlzZXRkYXRlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAiTGVmdCAjNCIgJiYKKworCWVjaG8gJGRhdGVzdGFtcCA+dHdvICYmCisJc2V0ZGF0ZSAmJgorCWdpdCBjb21taXQgLWEgLW0gIkxlZnQgIzUiICYmCisKKwlnaXQgY2hlY2tvdXQgcmlnaHQgJiYKKworCWVjaG8gJGRhdGVzdGFtcCA+dGhyZWUgJiYKKwlnaXQgYWRkIHRocmVlICYmCisJc2V0ZGF0ZSAmJgorCWdpdCBjb21taXQgLWEgLW0gIlJpZ2h0ICMzIiAmJgorCisJZWNobyAkZGF0ZXN0YW1wID50aHJlZSAmJgorCXNldGRhdGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJSaWdodCAjNCIgJiYKKworCWVjaG8gJGRhdGVzdGFtcCA+dGhyZWUgJiYKKwlzZXRkYXRlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAiUmlnaHQgIzUiICYmCisKKwlnaXQgc2hvdy1icmFuY2gKKycKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKK01lcmdlIGJyYW5jaCAnbGVmdCcKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1tc2cgdGVzdCAjMScgJworCisJZ2l0IGNoZWNrb3V0IG1hc3RlciAmJgorCWdpdCBmZXRjaCAuIGxlZnQgJiYKKworCWdpdCBmbXQtbWVyZ2UtbXNnIDwuZ2l0L0ZFVENIX0hFQUQgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGFjdHVhbCBleHBlY3RlZAorJworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorTWVyZ2UgYnJhbmNoICdsZWZ0JyBvZiAuLi90cmFzaAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21lcmdlLW1zZyB0ZXN0ICMyJyAnCisKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisJZ2l0IGZldGNoIC4uL3RyYXNoIGxlZnQgJiYKKworCWdpdCBmbXQtbWVyZ2UtbXNnIDwuZ2l0L0ZFVENIX0hFQUQgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGFjdHVhbCBleHBlY3RlZAorJworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorTWVyZ2UgYnJhbmNoICdsZWZ0JworCisqIGxlZnQ6CisgIExlZnQgIzUKKyAgTGVmdCAjNAorICBMZWZ0ICMzCisgIENvbW1vbiAjMgorICBDb21tb24gIzEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1tc2cgdGVzdCAjMycgJworCisJZ2l0IGNvbmZpZyBtZXJnZS5zdW1tYXJ5IHRydWUgJiYKKworCWdpdCBjaGVja291dCBtYXN0ZXIgJiYKKwlzZXRkYXRlICYmCisJZ2l0IGZldGNoIC4gbGVmdCAmJgorCisJZ2l0IGZtdC1tZXJnZS1tc2cgPC5naXQvRkVUQ0hfSEVBRCA+YWN0dWFsICYmCisJZ2l0IGRpZmYgYWN0dWFsIGV4cGVjdGVkCisnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCitNZXJnZSBicmFuY2hlcyAnbGVmdCcgYW5kICdyaWdodCcKKworKiBsZWZ0OgorICBMZWZ0ICM1CisgIExlZnQgIzQKKyAgTGVmdCAjMworICBDb21tb24gIzIKKyAgQ29tbW9uICMxCisKKyogcmlnaHQ6CisgIFJpZ2h0ICM1CisgIFJpZ2h0ICM0CisgIFJpZ2h0ICMzCisgIENvbW1vbiAjMgorICBDb21tb24gIzEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1tc2cgdGVzdCAjNCcgJworCisJZ2l0IGNvbmZpZyBtZXJnZS5zdW1tYXJ5IHRydWUgJiYKKworCWdpdCBjaGVja291dCBtYXN0ZXIgJiYKKwlzZXRkYXRlICYmCisJZ2l0IGZldGNoIC4gbGVmdCByaWdodCAmJgorCisJZ2l0IGZtdC1tZXJnZS1tc2cgPC5naXQvRkVUQ0hfSEVBRCA+YWN0dWFsICYmCisJZ2l0IGRpZmYgYWN0dWFsIGV4cGVjdGVkCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21lcmdlLW1zZyB0ZXN0ICM1JyAnCisKKwlnaXQgY29uZmlnIG1lcmdlLnN1bW1hcnkgeWVzICYmCisKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisJc2V0ZGF0ZSAmJgorCWdpdCBmZXRjaCAuIGxlZnQgcmlnaHQgJiYKKworCWdpdCBmbXQtbWVyZ2UtbXNnIDwuZ2l0L0ZFVENIX0hFQUQgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGFjdHVhbCBleHBlY3RlZAorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDYzMDAtZm9yLWVhY2gtcmVmLnNoIGIvdC90NjMwMC1mb3ItZWFjaC1yZWYuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjQ2ZWM5MwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYzMDAtZm9yLWVhY2gtcmVmLnNoCkBAIC0wLDAgKzEsMjEyIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3IEFuZHkgUGFya2lucworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdmb3ItZWFjaC1yZWYgdGVzdCcKKworLiAuL3Rlc3QtbGliLnNoCisKKyMgTW9uIEp1bCAzIDE1OjE4OjQzIDIwMDYgKzAwMDAKK2RhdGVzdGFtcD0xMTUxOTM5OTIzCitzZXRkYXRlX2FuZF9pbmNyZW1lbnQgKCkgeworICAgIEdJVF9DT01NSVRURVJfREFURT0iJGRhdGVzdGFtcCArMDIwMCIKKyAgICBkYXRlc3RhbXA9JChleHByICIkZGF0ZXN0YW1wIiArIDEpCisgICAgR0lUX0FVVEhPUl9EQVRFPSIkZGF0ZXN0YW1wICswMjAwIgorICAgIGRhdGVzdGFtcD0kKGV4cHIgIiRkYXRlc3RhbXAiICsgMSkKKyAgICBleHBvcnQgR0lUX0NPTU1JVFRFUl9EQVRFIEdJVF9BVVRIT1JfREFURQorfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdDcmVhdGUgc2FtcGxlIGNvbW1pdCB3aXRoIGtub3duIHRpbWVzdGFtcCcgJworCXNldGRhdGVfYW5kX2luY3JlbWVudCAmJgorCWVjaG8gIlVzaW5nICRkYXRlc3RhbXAiID4gb25lICYmCisJZ2l0IGFkZCBvbmUgJiYKKwlnaXQgY29tbWl0IC1tICJJbml0aWFsIiAmJgorCXNldGRhdGVfYW5kX2luY3JlbWVudCAmJgorCWdpdCB0YWcgLWEgLW0gIlRhZ2dpbmcgYXQgJGRhdGVzdGFtcCIgdGVzdHRhZworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdDaGVjayBhdG9tIG5hbWVzIGFyZSB2YWxpZCcgJworCWJhZD0KKwlmb3IgdG9rZW4gaW4gXAorCQlyZWZuYW1lIG9iamVjdHR5cGUgb2JqZWN0c2l6ZSBvYmplY3RuYW1lIHRyZWUgcGFyZW50IFwKKwkJbnVtcGFyZW50IG9iamVjdCB0eXBlIGF1dGhvciBhdXRob3JuYW1lIGF1dGhvcmVtYWlsIFwKKwkJYXV0aG9yZGF0ZSBjb21taXR0ZXIgY29tbWl0dGVybmFtZSBjb21taXR0ZXJlbWFpbCBcCisJCWNvbW1pdHRlcmRhdGUgdGFnIHRhZ2dlciB0YWdnZXJuYW1lIHRhZ2dlcmVtYWlsIFwKKwkJdGFnZ2VyZGF0ZSBjcmVhdG9yIGNyZWF0b3JkYXRlIHN1YmplY3QgYm9keSBjb250ZW50cworCWRvCisJCWdpdCBmb3ItZWFjaC1yZWYgLS1mb3JtYXQ9IiR0b2tlbj0lKCR0b2tlbikiIHJlZnMvaGVhZHMgfHwgeworCQkJYmFkPSR0b2tlbgorCQkJYnJlYWsKKwkJfQorCWRvbmUKKwl0ZXN0IC16ICIkYmFkIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdDaGVjayBpbnZhbGlkIGF0b21zIG5hbWVzIGFyZSBlcnJvcnMnICcKKwkhIGdpdC1mb3ItZWFjaC1yZWYgLS1mb3JtYXQ9IiUoSU5WQUxJRCkiIHJlZnMvaGVhZHMKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnQ2hlY2sgZm9ybWF0IHNwZWNpZmllcnMgYXJlIGlnbm9yZWQgaW4gbmFtaW5nIGRhdGUgYXRvbXMnICcKKwlnaXQtZm9yLWVhY2gtcmVmIC0tZm9ybWF0PSIlKGF1dGhvcmRhdGUpIiByZWZzL2hlYWRzICYmCisJZ2l0LWZvci1lYWNoLXJlZiAtLWZvcm1hdD0iJShhdXRob3JkYXRlOmRlZmF1bHQpICUoYXV0aG9yZGF0ZSkiIHJlZnMvaGVhZHMgJiYKKwlnaXQtZm9yLWVhY2gtcmVmIC0tZm9ybWF0PSIlKGF1dGhvcmRhdGUpICUoYXV0aG9yZGF0ZTpkZWZhdWx0KSIgcmVmcy9oZWFkcyAmJgorCWdpdC1mb3ItZWFjaC1yZWYgLS1mb3JtYXQ9IiUoYXV0aG9yZGF0ZTpkZWZhdWx0KSAlKGF1dGhvcmRhdGU6ZGVmYXVsdCkiIHJlZnMvaGVhZHMKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnQ2hlY2sgdmFsaWQgZm9ybWF0IHNwZWNpZmllcnMgZm9yIGRhdGUgZmllbGRzJyAnCisJZ2l0LWZvci1lYWNoLXJlZiAtLWZvcm1hdD0iJShhdXRob3JkYXRlOmRlZmF1bHQpIiByZWZzL2hlYWRzICYmCisJZ2l0LWZvci1lYWNoLXJlZiAtLWZvcm1hdD0iJShhdXRob3JkYXRlOnJlbGF0aXZlKSIgcmVmcy9oZWFkcyAmJgorCWdpdC1mb3ItZWFjaC1yZWYgLS1mb3JtYXQ9IiUoYXV0aG9yZGF0ZTpzaG9ydCkiIHJlZnMvaGVhZHMgJiYKKwlnaXQtZm9yLWVhY2gtcmVmIC0tZm9ybWF0PSIlKGF1dGhvcmRhdGU6bG9jYWwpIiByZWZzL2hlYWRzICYmCisJZ2l0LWZvci1lYWNoLXJlZiAtLWZvcm1hdD0iJShhdXRob3JkYXRlOmlzbzg2MDEpIiByZWZzL2hlYWRzICYmCisJZ2l0LWZvci1lYWNoLXJlZiAtLWZvcm1hdD0iJShhdXRob3JkYXRlOnJmYzI4MjIpIiByZWZzL2hlYWRzCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ0NoZWNrIGludmFsaWQgZm9ybWF0IHNwZWNpZmllcnMgYXJlIGVycm9ycycgJworCSEgZ2l0LWZvci1lYWNoLXJlZiAtLWZvcm1hdD0iJShhdXRob3JkYXRlOklOVkFMSUQpIiByZWZzL2hlYWRzCisnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCisncmVmcy9oZWFkcy9tYXN0ZXInICdNb24gSnVsIDMgMTc6MTg6NDMgMjAwNiArMDIwMCcgJ01vbiBKdWwgMyAxNzoxODo0NCAyMDA2ICswMjAwJworJ3JlZnMvdGFncy90ZXN0dGFnJyAnTW9uIEp1bCAzIDE3OjE4OjQ1IDIwMDYgKzAyMDAnCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnQ2hlY2sgdW5mb3JtYXR0ZWQgZGF0ZSBmaWVsZHMgb3V0cHV0JyAnCisJKGdpdCBmb3ItZWFjaC1yZWYgLS1zaGVsbCAtLWZvcm1hdD0iJShyZWZuYW1lKSAlKGNvbW1pdHRlcmRhdGUpICUoYXV0aG9yZGF0ZSkiIHJlZnMvaGVhZHMgJiYKKwlnaXQgZm9yLWVhY2gtcmVmIC0tc2hlbGwgLS1mb3JtYXQ9IiUocmVmbmFtZSkgJSh0YWdnZXJkYXRlKSIgcmVmcy90YWdzKSA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0ZWQgYWN0dWFsCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ0NoZWNrIGZvcm1hdCAiZGVmYXVsdCIgZm9ybWF0dGVkIGRhdGUgZmllbGRzIG91dHB1dCcgJworCWY9ZGVmYXVsdCAmJgorCShnaXQgZm9yLWVhY2gtcmVmIC0tc2hlbGwgLS1mb3JtYXQ9IiUocmVmbmFtZSkgJShjb21taXR0ZXJkYXRlOiRmKSAlKGF1dGhvcmRhdGU6JGYpIiByZWZzL2hlYWRzICYmCisJZ2l0IGZvci1lYWNoLXJlZiAtLXNoZWxsIC0tZm9ybWF0PSIlKHJlZm5hbWUpICUodGFnZ2VyZGF0ZTokZikiIHJlZnMvdGFncykgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdGVkIGFjdHVhbAorJworCisjIERvbid0IGtub3cgaG93IHRvIGRvIHJlbGF0aXZlIGNoZWNrIGJlY2F1c2UgSSBjYW4ndCBrbm93IHdoZW4gdGhpcyBzY3JpcHQKKyMgaXMgZ29pbmcgdG8gYmUgcnVuIGFuZCBjYW4ndCBmYWtlIHRoZSBjdXJyZW50IHRpbWUgdG8gZ2l0LCBhbmQgaGVuY2UgY2FuJ3QKKyMgcHJvdmlkZSBleHBlY3RlZCBvdXRwdXQuICBJbnN0ZWFkLCBJJ2xsIGp1c3QgbWFrZSBzdXJlIHRoYXQgInJlbGF0aXZlIgorIyBkb2Vzbid0IGV4aXQgaW4gZXJyb3IKKyMKKyNjYXQgPmV4cGVjdGVkIDw8XEVPRgorIworI0VPRgorIwordGVzdF9leHBlY3Rfc3VjY2VzcyAnQ2hlY2sgZm9ybWF0ICJyZWxhdGl2ZSIgZGF0ZSBmaWVsZHMgb3V0cHV0JyAnCisJZj1yZWxhdGl2ZSAmJgorCShnaXQgZm9yLWVhY2gtcmVmIC0tc2hlbGwgLS1mb3JtYXQ9IiUocmVmbmFtZSkgJShjb21taXR0ZXJkYXRlOiRmKSAlKGF1dGhvcmRhdGU6JGYpIiByZWZzL2hlYWRzICYmCisJZ2l0IGZvci1lYWNoLXJlZiAtLXNoZWxsIC0tZm9ybWF0PSIlKHJlZm5hbWUpICUodGFnZ2VyZGF0ZTokZikiIHJlZnMvdGFncykgPmFjdHVhbAorJworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorJ3JlZnMvaGVhZHMvbWFzdGVyJyAnMjAwNi0wNy0wMycgJzIwMDYtMDctMDMnCisncmVmcy90YWdzL3Rlc3R0YWcnICcyMDA2LTA3LTAzJworRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ0NoZWNrIGZvcm1hdCAic2hvcnQiIGRhdGUgZmllbGRzIG91dHB1dCcgJworCWY9c2hvcnQgJiYKKwkoZ2l0IGZvci1lYWNoLXJlZiAtLXNoZWxsIC0tZm9ybWF0PSIlKHJlZm5hbWUpICUoY29tbWl0dGVyZGF0ZTokZikgJShhdXRob3JkYXRlOiRmKSIgcmVmcy9oZWFkcyAmJgorCWdpdCBmb3ItZWFjaC1yZWYgLS1zaGVsbCAtLWZvcm1hdD0iJShyZWZuYW1lKSAlKHRhZ2dlcmRhdGU6JGYpIiByZWZzL3RhZ3MpID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3RlZCBhY3R1YWwKKycKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKydyZWZzL2hlYWRzL21hc3RlcicgJ01vbiBKdWwgMyAxNToxODo0MyAyMDA2JyAnTW9uIEp1bCAzIDE1OjE4OjQ0IDIwMDYnCisncmVmcy90YWdzL3Rlc3R0YWcnICdNb24gSnVsIDMgMTU6MTg6NDUgMjAwNicKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdDaGVjayBmb3JtYXQgImxvY2FsIiBkYXRlIGZpZWxkcyBvdXRwdXQnICcKKwlmPWxvY2FsICYmCisJKGdpdCBmb3ItZWFjaC1yZWYgLS1zaGVsbCAtLWZvcm1hdD0iJShyZWZuYW1lKSAlKGNvbW1pdHRlcmRhdGU6JGYpICUoYXV0aG9yZGF0ZTokZikiIHJlZnMvaGVhZHMgJiYKKwlnaXQgZm9yLWVhY2gtcmVmIC0tc2hlbGwgLS1mb3JtYXQ9IiUocmVmbmFtZSkgJSh0YWdnZXJkYXRlOiRmKSIgcmVmcy90YWdzKSA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0ZWQgYWN0dWFsCisnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCisncmVmcy9oZWFkcy9tYXN0ZXInICcyMDA2LTA3LTAzIDE3OjE4OjQzICswMjAwJyAnMjAwNi0wNy0wMyAxNzoxODo0NCArMDIwMCcKKydyZWZzL3RhZ3MvdGVzdHRhZycgJzIwMDYtMDctMDMgMTc6MTg6NDUgKzAyMDAnCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnQ2hlY2sgZm9ybWF0ICJpc284NjAxIiBkYXRlIGZpZWxkcyBvdXRwdXQnICcKKwlmPWlzbzg2MDEgJiYKKwkoZ2l0IGZvci1lYWNoLXJlZiAtLXNoZWxsIC0tZm9ybWF0PSIlKHJlZm5hbWUpICUoY29tbWl0dGVyZGF0ZTokZikgJShhdXRob3JkYXRlOiRmKSIgcmVmcy9oZWFkcyAmJgorCWdpdCBmb3ItZWFjaC1yZWYgLS1zaGVsbCAtLWZvcm1hdD0iJShyZWZuYW1lKSAlKHRhZ2dlcmRhdGU6JGYpIiByZWZzL3RhZ3MpID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3RlZCBhY3R1YWwKKycKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKydyZWZzL2hlYWRzL21hc3RlcicgJ01vbiwgMyBKdWwgMjAwNiAxNzoxODo0MyArMDIwMCcgJ01vbiwgMyBKdWwgMjAwNiAxNzoxODo0NCArMDIwMCcKKydyZWZzL3RhZ3MvdGVzdHRhZycgJ01vbiwgMyBKdWwgMjAwNiAxNzoxODo0NSArMDIwMCcKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdDaGVjayBmb3JtYXQgInJmYzI4MjIiIGRhdGUgZmllbGRzIG91dHB1dCcgJworCWY9cmZjMjgyMiAmJgorCShnaXQgZm9yLWVhY2gtcmVmIC0tc2hlbGwgLS1mb3JtYXQ9IiUocmVmbmFtZSkgJShjb21taXR0ZXJkYXRlOiRmKSAlKGF1dGhvcmRhdGU6JGYpIiByZWZzL2hlYWRzICYmCisJZ2l0IGZvci1lYWNoLXJlZiAtLXNoZWxsIC0tZm9ybWF0PSIlKHJlZm5hbWUpICUodGFnZ2VyZGF0ZTokZikiIHJlZnMvdGFncykgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdGVkIGFjdHVhbAorJworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorcmVmcy9oZWFkcy9tYXN0ZXIKK3JlZnMvdGFncy90ZXN0dGFnCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnVmVyaWZ5IGFzY2VuZGluZyBzb3J0JyAnCisJZ2l0LWZvci1lYWNoLXJlZiAtLWZvcm1hdD0iJShyZWZuYW1lKSIgLS1zb3J0PXJlZm5hbWUgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdGVkIGFjdHVhbAorJworCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCityZWZzL3RhZ3MvdGVzdHRhZworcmVmcy9oZWFkcy9tYXN0ZXIKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdWZXJpZnkgZGVzY2VuZGluZyBzb3J0JyAnCisJZ2l0LWZvci1lYWNoLXJlZiAtLWZvcm1hdD0iJShyZWZuYW1lKSIgLS1zb3J0PS1yZWZuYW1lID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3RlZCBhY3R1YWwKKycKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKydyZWZzL2hlYWRzL21hc3RlcicKKydyZWZzL3RhZ3MvdGVzdHRhZycKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdRdW90aW5nIHN0eWxlOiBzaGVsbCcgJworCWdpdCBmb3ItZWFjaC1yZWYgLS1zaGVsbCAtLWZvcm1hdD0iJShyZWZuYW1lKSIgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdGVkIGFjdHVhbAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdRdW90aW5nIHN0eWxlOiBwZXJsJyAnCisJZ2l0IGZvci1lYWNoLXJlZiAtLXBlcmwgLS1mb3JtYXQ9IiUocmVmbmFtZSkiID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3RlZCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnUXVvdGluZyBzdHlsZTogcHl0aG9uJyAnCisJZ2l0IGZvci1lYWNoLXJlZiAtLXB5dGhvbiAtLWZvcm1hdD0iJShyZWZuYW1lKSIgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdGVkIGFjdHVhbAorJworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorInJlZnMvaGVhZHMvbWFzdGVyIgorInJlZnMvdGFncy90ZXN0dGFnIgorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ1F1b3Rpbmcgc3R5bGU6IHRjbCcgJworCWdpdCBmb3ItZWFjaC1yZWYgLS10Y2wgLS1mb3JtYXQ9IiUocmVmbmFtZSkiID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3RlZCBhY3R1YWwKKycKKworZm9yIGkgaW4gIi0tcGVybCAtLXNoZWxsIiAiLXMgLS1weXRob24iICItLXB5dGhvbiAtLXRjbCIgIi0tdGNsIC0tcGVybCI7IGRvCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAibW9yZSB0aGFuIG9uZSBxdW90aW5nIHN0eWxlOiAkaSIgIgorCQlnaXQgZm9yLWVhY2gtcmVmICRpIDI+JjEgfCAocmVhZCBsaW5lICYmCisJCWNhc2UgXCRsaW5lIGluCisJCVwiZXJyb3I6IG1vcmUgdGhhbiBvbmUgcXVvdGluZyBzdHlsZVwiKikgOiBoYXBweTs7CisJCSopIGZhbHNlCisJCWVzYWMpCisJIgorZG9uZQorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDcwMDEtbXYuc2ggYi90L3Q3MDAxLW12LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZhMzgyYzUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3MDAxLW12LnNoCkBAIC0wLDAgKzEsMTU5IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IG12IGluIHN1YmRpcnMnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgcmVmZXJlbmNlIHRyZWUnIFwKKyAgICAnbWtkaXIgcGF0aDAgcGF0aDEgJiYKKyAgICAgY3AgLi4vLi4vQ09QWUlORyBwYXRoMC9DT1BZSU5HICYmCisgICAgIGdpdCBhZGQgcGF0aDAvQ09QWUlORyAmJgorICAgICBnaXQtY29tbWl0IC1tIGFkZCAtYScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ21vdmluZyB0aGUgZmlsZSBvdXQgb2Ygc3ViZGlyZWN0b3J5JyBcCisgICAgJ2NkIHBhdGgwICYmIGdpdCBtdiBDT1BZSU5HIC4uL3BhdGgxL0NPUFlJTkcnCisKKyMgaW4gcGF0aDAgY3VycmVudGx5Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY29tbWl0aW5nIHRoZSBjaGFuZ2UnIFwKKyAgICAnY2QgLi4gJiYgZ2l0LWNvbW1pdCAtbSBtb3ZlLW91dCAtYScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoZWNraW5nIHRoZSBjb21taXQnIFwKKyAgICAnZ2l0IGRpZmYtdHJlZSAtciAtTSAtLW5hbWUtc3RhdHVzICBIRUFEXiBIRUFEIHwgXAorICAgIGdyZXAgIl5SMTAwLi4qcGF0aDAvQ09QWUlORy4uKnBhdGgxL0NPUFlJTkciJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbW92aW5nIHRoZSBmaWxlIGJhY2sgaW50byBzdWJkaXJlY3RvcnknIFwKKyAgICAnY2QgcGF0aDAgJiYgZ2l0IG12IC4uL3BhdGgxL0NPUFlJTkcgQ09QWUlORycKKworIyBpbiBwYXRoMCBjdXJyZW50bHkKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjb21taXRpbmcgdGhlIGNoYW5nZScgXAorICAgICdjZCAuLiAmJiBnaXQtY29tbWl0IC1tIG1vdmUtaW4gLWEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGVja2luZyB0aGUgY29tbWl0JyBcCisgICAgJ2dpdCBkaWZmLXRyZWUgLXIgLU0gLS1uYW1lLXN0YXR1cyAgSEVBRF4gSEVBRCB8IFwKKyAgICBncmVwICJeUjEwMC4uKnBhdGgxL0NPUFlJTkcuLipwYXRoMC9DT1BZSU5HIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2FkZGluZyBhbm90aGVyIGZpbGUnIFwKKyAgICAnY3AgLi4vLi4vUkVBRE1FIHBhdGgwL1JFQURNRSAmJgorICAgICBnaXQgYWRkIHBhdGgwL1JFQURNRSAmJgorICAgICBnaXQtY29tbWl0IC1tIGFkZDIgLWEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdtb3Zpbmcgd2hvbGUgc3ViZGlyZWN0b3J5JyBcCisgICAgJ2dpdCBtdiBwYXRoMCBwYXRoMicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NvbW1pdGluZyB0aGUgY2hhbmdlJyBcCisgICAgJ2dpdC1jb21taXQgLW0gZGlyLW1vdmUgLWEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGVja2luZyB0aGUgY29tbWl0JyBcCisgICAgJ2dpdCBkaWZmLXRyZWUgLXIgLU0gLS1uYW1lLXN0YXR1cyAgSEVBRF4gSEVBRCB8IFwKKyAgICAgZ3JlcCAiXlIxMDAuLipwYXRoMC9DT1BZSU5HLi4qcGF0aDIvQ09QWUlORyIgJiYKKyAgICAgZ2l0IGRpZmYtdHJlZSAtciAtTSAtLW5hbWUtc3RhdHVzICBIRUFEXiBIRUFEIHwgXAorICAgICBncmVwICJeUjEwMC4uKnBhdGgwL1JFQURNRS4uKnBhdGgyL1JFQURNRSInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzdWNjZWVkIHdoZW4gc291cmNlIGlzIGEgcHJlZml4IG9mIGRlc3RpbmF0aW9uJyBcCisgICAgJ2dpdCBtdiBwYXRoMi9DT1BZSU5HIHBhdGgyL0NPUFlJTkctcmVuYW1lZCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ21vdmluZyB3aG9sZSBzdWJkaXJlY3RvcnkgaW50byBzdWJkaXJlY3RvcnknIFwKKyAgICAnZ2l0IG12IHBhdGgyIHBhdGgxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY29tbWl0aW5nIHRoZSBjaGFuZ2UnIFwKKyAgICAnZ2l0LWNvbW1pdCAtbSBkaXItbW92ZSAtYScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoZWNraW5nIHRoZSBjb21taXQnIFwKKyAgICAnZ2l0IGRpZmYtdHJlZSAtciAtTSAtLW5hbWUtc3RhdHVzICBIRUFEXiBIRUFEIHwgXAorICAgICBncmVwICJeUjEwMC4uKnBhdGgyL0NPUFlJTkcuLipwYXRoMS9wYXRoMi9DT1BZSU5HIiAmJgorICAgICBnaXQgZGlmZi10cmVlIC1yIC1NIC0tbmFtZS1zdGF0dXMgIEhFQUReIEhFQUQgfCBcCisgICAgIGdyZXAgIl5SMTAwLi4qcGF0aDIvUkVBRE1FLi4qcGF0aDEvcGF0aDIvUkVBRE1FIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RvIG5vdCBtb3ZlIGRpcmVjdG9yeSBvdmVyIGV4aXN0aW5nIGRpcmVjdG9yeScgXAorICAgICdta2RpciBwYXRoMCAmJiBta2RpciBwYXRoMC9wYXRoMiAmJiAhIGdpdCBtdiBwYXRoMiBwYXRoMCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ21vdmUgaW50byAiLiInIFwKKyAgICAnZ2l0IG12IHBhdGgxL3BhdGgyLyAuJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJNaWNoYWVsIENhc3NhcidzIHRlc3QgY2FzZSIgJworCXJtIC1mciAuZ2l0IHBhcGVycyBwYXJ0QSAmJgorCWdpdCBpbml0ICYmCisJbWtkaXIgLXAgcGFwZXJzL3Vuc29ydGVkIHBhcGVycy9hbGwtcGFwZXJzIHBhcnRBICYmCisJZWNobyBhID4gcGFwZXJzL3Vuc29ydGVkL1RoZXNpcy5wZGYgJiYKKwllY2hvIGIgPiBwYXJ0QS9vdXRsaW5lLnR4dCAmJgorCWVjaG8gYyA+IHBhcGVycy91bnNvcnRlZC9fYW5vdGhlciAmJgorCWdpdCBhZGQgcGFwZXJzIHBhcnRBICYmCisJVDE9YGdpdCB3cml0ZS10cmVlYCAmJgorCisJZ2l0IG12IHBhcGVycy91bnNvcnRlZC9UaGVzaXMucGRmIHBhcGVycy9hbGwtcGFwZXJzL21vby1ibGFoLnBkZiAmJgorCisJVD1gZ2l0IHdyaXRlLXRyZWVgICYmCisJZ2l0IGxzLXRyZWUgLXIgJFQgfCBncmVwIHBhcnRBL291dGxpbmUudHh0IHx8IHsKKwkJZ2l0IGxzLXRyZWUgLXIgJFQKKwkJKGV4aXQgMSkKKwl9CisnCisKK3JtIC1mciBwYXBlcnMgcGFydEEgcGF0aD8KKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiU2VyZ2V5IFZsYXNvdidzIHRlc3QgY2FzZSIgJworCXJtIC1mciAuZ2l0ICYmCisJZ2l0IGluaXQgJiYKKwlta2RpciBhYiAmJgorCWRhdGUgPmFiLmMgJiYKKwlkYXRlID5hYi9kICYmCisJZ2l0IGFkZCBhYi5jIGFiICYmCisJZ2l0IGNvbW1pdCAtbSAnaW5pdGlhbCcgJiYKKwlnaXQgbXYgYWIgYQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhYnNvbHV0ZSBwYXRobmFtZScgJygKKworCXJtIC1mciBtaW5lICYmCisJbWtkaXIgbWluZSAmJgorCWNkIG1pbmUgJiYKKwl0ZXN0X2NyZWF0ZV9yZXBvIG9uZSAmJgorCWNkIG9uZSAmJgorCW1rZGlyIHN1YiAmJgorCT5zdWIvZmlsZSAmJgorCWdpdCBhZGQgc3ViL2ZpbGUgJiYKKworCWdpdCBtdiBzdWIgIiQocHdkKS9pbiIgJiYKKwkhIHRlc3QgLWQgc3ViICYmCisJdGVzdCAtZCBpbiAmJgorCWdpdCBscy1maWxlcyAtLWVycm9yLXVubWF0Y2ggaW4vZmlsZQorCisKKyknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Fic29sdXRlIHBhdGhuYW1lIG91dHNpZGUgc2hvdWxkIGZhaWwnICcoCisKKwlybSAtZnIgbWluZSAmJgorCW1rZGlyIG1pbmUgJiYKKwljZCBtaW5lICYmCisJb3V0PSQocHdkKSAmJgorCXRlc3RfY3JlYXRlX3JlcG8gb25lICYmCisJY2Qgb25lICYmCisJbWtkaXIgc3ViICYmCisJPnN1Yi9maWxlICYmCisJZ2l0IGFkZCBzdWIvZmlsZSAmJgorCisJISBnaXQgbXYgc3ViICIkb3V0L291dCIgJiYKKwl0ZXN0IC1kIHN1YiAmJgorCSEgdGVzdCAtZCAuLi9pbiAmJgorCWdpdCBscy1maWxlcyAtLWVycm9yLXVubWF0Y2ggc3ViL2ZpbGUKKworKScKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q3MDAyLWdyZXAuc2ggYi90L3Q3MDAyLWdyZXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzhiNGY2NQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDcwMDItZ3JlcC5zaApAQCAtMCwwICsxLDExNiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgZ3JlcCB2YXJpb3VzLgorJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJeworCQllY2hvIGZvbyBtbWFwIGJhcgorCQllY2hvIGZvb19tbWFwIGJhcgorCQllY2hvIGZvb19tbWFwIGJhciBtbWFwCisJCWVjaG8gZm9vIG1tYXAgYmFyX21tYXAKKwkJZWNobyBmb29fbW1hcCBiYXIgbW1hcCBiYXoKKwl9ID5maWxlICYmCisJZWNobyB4IHggeHggeCA+eCAmJgorCWVjaG8geSB5eSA+eSAmJgorCWVjaG8genp6ID4geiAmJgorCW1rZGlyIHQgJiYKKwllY2hvIHRlc3QgPnQvdCAmJgorCWdpdCBhZGQgZmlsZSB4IHkgeiB0L3QgJiYKKwlnaXQgY29tbWl0IC1tIGluaXRpYWwKKycKKworZm9yIEggaW4gSEVBRCAnJworZG8KKwljYXNlICIkSCIgaW4KKwlIRUFEKQlIQz0nSEVBRDonIEw9J0hFQUQnIDs7CisJJycpCUhDPSBMPSdpbiB3b3JraW5nIHRyZWUnIDs7CisJZXNhYworCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAiZ3JlcCAtdyAkTCIgJworCQl7CisJCQllY2hvICR7SEN9ZmlsZToxOmZvbyBtbWFwIGJhcgorCQkJZWNobyAke0hDfWZpbGU6Mzpmb29fbW1hcCBiYXIgbW1hcAorCQkJZWNobyAke0hDfWZpbGU6NDpmb28gbW1hcCBiYXJfbW1hcAorCQkJZWNobyAke0hDfWZpbGU6NTpmb29fbW1hcCBiYXIgbW1hcCBiYXoKKwkJfSA+ZXhwZWN0ZWQgJiYKKwkJZ2l0IGdyZXAgLW4gLXcgLWUgbW1hcCAkSCA+YWN0dWFsICYmCisJCWRpZmYgZXhwZWN0ZWQgYWN0dWFsCisJJworCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAiZ3JlcCAtdyAkTCAoeCkiICcKKwkJeworCQkJZWNobyAke0hDfXg6MTp4IHggeHggeAorCQl9ID5leHBlY3RlZCAmJgorCQlnaXQgZ3JlcCAtbiAtdyAtZSAieCB4eCogeCIgJEggPmFjdHVhbCAmJgorCQlkaWZmIGV4cGVjdGVkIGFjdHVhbAorCScKKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgImdyZXAgLXcgJEwgKHktMSkiICcKKwkJeworCQkJZWNobyAke0hDfXk6MTp5IHl5CisJCX0gPmV4cGVjdGVkICYmCisJCWdpdCBncmVwIC1uIC13IC1lICJeeSIgJEggPmFjdHVhbCAmJgorCQlkaWZmIGV4cGVjdGVkIGFjdHVhbAorCScKKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgImdyZXAgLXcgJEwgKHktMikiICcKKwkJOiA+ZXhwZWN0ZWQgJiYKKwkJaWYgZ2l0IGdyZXAgLW4gLXcgLWUgIl55IHkiICRIID5hY3R1YWwKKwkJdGhlbgorCQkJZWNobyBzaG91bGQgbm90IGhhdmUgbWF0Y2hlZAorCQkJY2F0IGFjdHVhbAorCQkJZmFsc2UKKwkJZWxzZQorCQkJZGlmZiBleHBlY3RlZCBhY3R1YWwKKwkJZmkKKwknCisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICJncmVwIC13ICRMICh6KSIgJworCQk6ID5leHBlY3RlZCAmJgorCQlpZiBnaXQgZ3JlcCAtbiAtdyAtZSAiXnoiICRIID5hY3R1YWwKKwkJdGhlbgorCQkJZWNobyBzaG91bGQgbm90IGhhdmUgbWF0Y2hlZAorCQkJY2F0IGFjdHVhbAorCQkJZmFsc2UKKwkJZWxzZQorCQkJZGlmZiBleHBlY3RlZCBhY3R1YWwKKwkJZmkKKwknCisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICJncmVwICRMICh0LTEpIiAnCisJCWVjaG8gIiR7SEN9dC90OjE6dGVzdCIgPmV4cGVjdGVkICYmCisJCWdpdCBncmVwIC1uIC1lIHRlc3QgJEggPmFjdHVhbCAmJgorCQlkaWZmIGV4cGVjdGVkIGFjdHVhbAorCScKKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgImdyZXAgJEwgKHQtMikiICcKKwkJZWNobyAiJHtIQ310OjE6dGVzdCIgPmV4cGVjdGVkICYmCisJCSgKKwkJCWNkIHQgJiYKKwkJCWdpdCBncmVwIC1uIC1lIHRlc3QgJEgKKwkJKSA+YWN0dWFsICYmCisJCWRpZmYgZXhwZWN0ZWQgYWN0dWFsCisJJworCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAiZ3JlcCAkTCAodC0zKSIgJworCQllY2hvICIke0hDfXQvdDoxOnRlc3QiID5leHBlY3RlZCAmJgorCQkoCisJCQljZCB0ICYmCisJCQlnaXQgZ3JlcCAtLWZ1bGwtbmFtZSAtbiAtZSB0ZXN0ICRICisJCSkgPmFjdHVhbCAmJgorCQlkaWZmIGV4cGVjdGVkIGFjdHVhbAorCScKKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgImdyZXAgLWMgJEwgKG5vIC9kZXYvbnVsbCkiICcKKwkJISBnaXQgZ3JlcCAtYyB0ZXN0ICRIIHwgZ3JlcCAtcSAvZGV2L251bGwKKyAgICAgICAgJworCitkb25lCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NzAwMy1maWx0ZXItYnJhbmNoLnNoIGIvdC90NzAwMy1maWx0ZXItYnJhbmNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVmZDY1OGEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3MDAzLWZpbHRlci1icmFuY2guc2gKQEAgLTAsMCArMSwyMjIgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtZmlsdGVyLWJyYW5jaCcKKy4gLi90ZXN0LWxpYi5zaAorCittYWtlX2NvbW1pdCAoKSB7CisJbG93ZXI9JChlY2hvICQxIHwgdHIgJ1tBLVpdJyAnW2Etel0nKQorCWVjaG8gJGxvd2VyID4gJGxvd2VyCisJZ2l0IGFkZCAkbG93ZXIKKwl0ZXN0X3RpY2sKKwlnaXQgY29tbWl0IC1tICQxCisJZ2l0IHRhZyAkMQorfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCcgJworCW1ha2VfY29tbWl0IEEKKwltYWtlX2NvbW1pdCBCCisJZ2l0IGNoZWNrb3V0IC1iIGJyYW5jaCBCCisJbWFrZV9jb21taXQgRAorCW1rZGlyIGRpcgorCW1ha2VfY29tbWl0IGRpci9ECisJbWFrZV9jb21taXQgRQorCWdpdCBjaGVja291dCBtYXN0ZXIKKwltYWtlX2NvbW1pdCBDCisJZ2l0IGNoZWNrb3V0IGJyYW5jaAorCWdpdCBtZXJnZSBDCisJZ2l0IHRhZyBGCisJbWFrZV9jb21taXQgRworCW1ha2VfY29tbWl0IEgKKycKKworSD0kKGdpdCByZXYtcGFyc2UgSCkKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmV3cml0ZSBpZGVudGljYWxseScgJworCWdpdC1maWx0ZXItYnJhbmNoIGJyYW5jaAorJwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVzdWx0IGlzIHJlYWxseSBpZGVudGljYWwnICcKKwl0ZXN0ICRIID0gJChnaXQgcmV2LXBhcnNlIEhFQUQpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Jld3JpdGUsIHJlbmFtaW5nIGEgc3BlY2lmaWMgZmlsZScgJworCWdpdC1maWx0ZXItYnJhbmNoIC1mIC0tdHJlZS1maWx0ZXIgIm12IGQgZG9oIHx8IDoiIEhFQUQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGVzdCB0aGF0IHRoZSBmaWxlIHdhcyByZW5hbWVkJyAnCisJdGVzdCBkID0gIiQoZ2l0IHNob3cgSEVBRDpkb2ggLS0pIiAmJgorCSEgdGVzdCAtZiBkICYmCisJdGVzdCAtZiBkb2ggJiYKKwl0ZXN0IGQgPSAiJChjYXQgZG9oKSIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmV3cml0ZSwgcmVuYW1pbmcgYSBzcGVjaWZpYyBkaXJlY3RvcnknICcKKwlnaXQtZmlsdGVyLWJyYW5jaCAtZiAtLXRyZWUtZmlsdGVyICJtdiBkaXIgZGlyb2ggfHwgOiIgSEVBRAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0ZXN0IHRoYXQgdGhlIGRpcmVjdG9yeSB3YXMgcmVuYW1lZCcgJworCXRlc3QgZGlyL2QgPSAiJChnaXQgc2hvdyBIRUFEOmRpcm9oL2QgLS0pIiAmJgorCSEgdGVzdCAtZCBkaXIgJiYKKwl0ZXN0IC1kIGRpcm9oICYmCisJISB0ZXN0IC1kIGRpcm9oL2RpciAmJgorCXRlc3QgLWYgZGlyb2gvZCAmJgorCXRlc3QgZGlyL2QgPSAiJChjYXQgZGlyb2gvZCkiCisnCisKK2dpdCB0YWcgb2xkRCBIRUFEfjQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Jld3JpdGUgb25lIGJyYW5jaCwga2VlcGluZyBhIHNpZGUgYnJhbmNoJyAnCisJZ2l0IGJyYW5jaCBtb2REIG9sZEQgJiYKKwlnaXQtZmlsdGVyLWJyYW5jaCAtZiAtLXRyZWUtZmlsdGVyICJtdiBiIGJvaCB8fCA6IiBELi5tb2RECisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvbW1vbiBhbmNlc3RvciBpcyBzdGlsbCBjb21tb24gKHVuY2hhbmdlZCknICcKKwl0ZXN0ICIkKGdpdCBtZXJnZS1iYXNlIG1vZEQgRCkiID0gIiQoZ2l0IHJldi1wYXJzZSBCKSIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmlsdGVyIHN1YmRpcmVjdG9yeSBvbmx5JyAnCisJbWtkaXIgc3ViZGlyICYmCisJdG91Y2ggc3ViZGlyL25ldyAmJgorCWdpdCBhZGQgc3ViZGlyL25ldyAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gInN1YmRpciIgJiYKKwllY2hvIEggPiBhICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSAibm90IHN1YmRpciIgYSAmJgorCWVjaG8gQSA+IHN1YmRpci9uZXcgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tICJhZ2FpbiBzdWJkaXIiIHN1YmRpci9uZXcgJiYKKwlnaXQgcm0gYSAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gImFnYWluIG5vdCBzdWJkaXIiICYmCisJZ2l0IGJyYW5jaCBzdWIgJiYKKwlnaXQtZmlsdGVyLWJyYW5jaCAtZiAtLXN1YmRpcmVjdG9yeS1maWx0ZXIgc3ViZGlyIHJlZnMvaGVhZHMvc3ViCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N1YmRpcmVjdG9yeSBmaWx0ZXIgcmVzdWx0IGxvb2tzIG9rYXknICcKKwl0ZXN0IDIgPSAkKGdpdCByZXYtbGlzdCBzdWIgfCB3YyAtbCkgJiYKKwlnaXQgc2hvdyBzdWI6bmV3ICYmCisJdGVzdF9tdXN0X2ZhaWwgZ2l0IHNob3cgc3ViOnN1YmRpcgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCBhbmQgZmlsdGVyIGhpc3RvcnkgdGhhdCByZXF1aXJlcyAtLWZ1bGwtaGlzdG9yeScgJworCWdpdCBjaGVja291dCBtYXN0ZXIgJiYKKwlta2RpciBzdWJkaXIgJiYKKwllY2hvIEEgPiBzdWJkaXIvbmV3ICYmCisJZ2l0IGFkZCBzdWJkaXIvbmV3ICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSAic3ViZGlyIG9uIG1hc3RlciIgc3ViZGlyL25ldyAmJgorCWdpdCBybSBhICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSAiYWdhaW4gc3ViZGlyIG9uIG1hc3RlciIgJiYKKwlnaXQgbWVyZ2UgYnJhbmNoICYmCisJZ2l0IGJyYW5jaCBzdWItbWFzdGVyICYmCisJZ2l0LWZpbHRlci1icmFuY2ggLWYgLS1zdWJkaXJlY3RvcnktZmlsdGVyIHN1YmRpciBzdWItbWFzdGVyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N1YmRpcmVjdG9yeSBmaWx0ZXIgcmVzdWx0IGxvb2tzIG9rYXknICcKKwl0ZXN0IDMgPSAkKGdpdCByZXYtbGlzdCAtMSAtLXBhcmVudHMgc3ViLW1hc3RlciB8IHdjIC13KSAmJgorCWdpdCBzaG93IHN1Yi1tYXN0ZXJeOm5ldyAmJgorCWdpdCBzaG93IHN1Yi1tYXN0ZXJeMjpuZXcgJiYKKwl0ZXN0X211c3RfZmFpbCBnaXQgc2hvdyBzdWI6c3ViZGlyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VzZSBpbmRleC1maWx0ZXIgdG8gbW92ZSBpbnRvIGEgc3ViZGlyZWN0b3J5JyAnCisJZ2l0IGJyYW5jaCBkaXJlY3Rvcnltb3ZlZCAmJgorCWdpdC1maWx0ZXItYnJhbmNoIC1mIC0taW5kZXgtZmlsdGVyIFwKKwkJICJnaXQgbHMtZmlsZXMgLXMgfCBzZWQgXCJzLVxcdC0mbmV3c3ViZGlyLy1cIiB8CisJICAgICAgICAgIEdJVF9JTkRFWF9GSUxFPVwkR0lUX0lOREVYX0ZJTEUubmV3IFwKKwkJCWdpdCB1cGRhdGUtaW5kZXggLS1pbmRleC1pbmZvICYmCisJCSAgbXYgXCRHSVRfSU5ERVhfRklMRS5uZXcgXCRHSVRfSU5ERVhfRklMRSIgZGlyZWN0b3J5bW92ZWQgJiYKKwl0ZXN0IC16ICIkKGdpdCBkaWZmIEhFQUQgZGlyZWN0b3J5bW92ZWQ6bmV3c3ViZGlyKSInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N0b3BzIHdoZW4gbXNnIGZpbHRlciBmYWlscycgJworCW9sZD0kKGdpdCByZXYtcGFyc2UgSEVBRCkgJiYKKwl0ZXN0X211c3RfZmFpbCBnaXQtZmlsdGVyLWJyYW5jaCAtZiAtLW1zZy1maWx0ZXIgZmFsc2UgSEVBRCAmJgorCXRlc3QgJG9sZCA9ICQoZ2l0IHJldi1wYXJzZSBIRUFEKSAmJgorCXJtIC1yZiAuZ2l0LXJld3JpdGUKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXV0aG9yIGluZm9ybWF0aW9uIGlzIHByZXNlcnZlZCcgJworCTogPiBpICYmCisJZ2l0IGFkZCBpICYmCisJdGVzdF90aWNrICYmCisJR0lUX0FVVEhPUl9OQU1FPSJCIFYgVWlwcyIgZ2l0IGNvbW1pdCAtbSBidnVpcHMgJiYKKwlnaXQgYnJhbmNoIHByZXNlcnZlZC1hdXRob3IgJiYKKwlnaXQtZmlsdGVyLWJyYW5jaCAtZiAtLW1zZy1maWx0ZXIgImNhdDsgXAorCQkJdGVzdCBcJEdJVF9DT01NSVQgIT0gJChnaXQgcmV2LXBhcnNlIG1hc3RlcikgfHwgXAorCQkJZWNobyBIYWxsbyIgXAorCQlwcmVzZXJ2ZWQtYXV0aG9yICYmCisJdGVzdCAxID0gJChnaXQgcmV2LWxpc3QgLS1hdXRob3I9IkIgViBVaXBzIiBwcmVzZXJ2ZWQtYXV0aG9yIHwgd2MgLWwpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgInJlbW92ZSBhIGNlcnRhaW4gYXV0aG9yJ3MgY29tbWl0cyIgJworCWVjaG8gaSA+IGkgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIGkgaSAmJgorCWdpdCBicmFuY2ggcmVtb3ZlZC1hdXRob3IgJiYKKwlnaXQtZmlsdGVyLWJyYW5jaCAtZiAtLWNvbW1pdC1maWx0ZXIgIlwKKwkJaWYgWyBcIlwkR0lUX0FVVEhPUl9OQU1FXCIgPSBcIkIgViBVaXBzXCIgXTtcCisJCXRoZW5cCisJCQlza2lwX2NvbW1pdCBcIlwkQFwiOworCQllbHNlXAorCQkJZ2l0IGNvbW1pdC10cmVlIFwiXCRAXCI7XAorCQlmaSIgcmVtb3ZlZC1hdXRob3IgJiYKKwljbnQxPSQoZ2l0IHJldi1saXN0IG1hc3RlciB8IHdjIC1sKSAmJgorCWNudDI9JChnaXQgcmV2LWxpc3QgcmVtb3ZlZC1hdXRob3IgfCB3YyAtbCkgJiYKKwl0ZXN0ICRjbnQxIC1lcSAkKCgkY250MiArIDEpKSAmJgorCXRlc3QgMCA9ICQoZ2l0IHJldi1saXN0IC0tYXV0aG9yPSJCIFYgVWlwcyIgcmVtb3ZlZC1hdXRob3IgfCB3YyAtbCkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYmFyZiBvbiBpbnZhbGlkIG5hbWUnICcKKwl0ZXN0X211c3RfZmFpbCBnaXQgZmlsdGVyLWJyYW5jaCAtZiBtYXN0ZXIgeHktcHJvYmxlbSAmJgorCXRlc3RfbXVzdF9mYWlsIGdpdCBmaWx0ZXItYnJhbmNoIC1mIEhFQUReCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJyJtYXAiIHdvcmtzIGluIGNvbW1pdCBmaWx0ZXInICcKKwlnaXQgZmlsdGVyLWJyYW5jaCAtZiAtLWNvbW1pdC1maWx0ZXIgIlwKKwkJcGFyZW50PVwkKGdpdCByZXYtcGFyc2UgXCRHSVRfQ09NTUlUXikgJiYKKwkJbWFwcGVkPVwkKG1hcCBcJHBhcmVudCkgJiYKKwkJYWN0dWFsPVwkKGVjaG8gXCJcJEBcIiB8IHNlZCBcInMvXi4qLXAgLy9cIikgJiYKKwkJdGVzdCBcJG1hcHBlZCA9IFwkYWN0dWFsICYmCisJCWdpdCBjb21taXQtdHJlZSBcIlwkQFwiOyIgbWFzdGVyfjIuLm1hc3RlciAmJgorCWdpdCByZXYtcGFyc2UgLS12ZXJpZnkgbWFzdGVyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ05hbWUgbmVlZGluZyBxdW90ZXMnICcKKworCWdpdCBjaGVja291dCAtYiByZXJlcmUgQSAmJgorCW1rZGlyIGZvbyAmJgorCW5hbWU9IuOCjOOCjOOCjCIgJiYKKwk+Zm9vLyRuYW1lICYmCisJZ2l0IGFkZCBmb28gJiYKKwlnaXQgY29tbWl0IC1tICJBZGRpbmcgYSBmaWxlIiAmJgorCWdpdCBmaWx0ZXItYnJhbmNoIC0tdHJlZS1maWx0ZXIgInJtIC1mciBmb28iICYmCisJdGVzdF9tdXN0X2ZhaWwgZ2l0IGxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCAiZm9vLyRuYW1lIiAmJgorCXRlc3QgJChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IHJlcmVyZSkgIT0gJChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEEpCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnU3ViZGlyZWN0b3J5IGZpbHRlciB3aXRoIGRpc2FwcGVhcmluZyB0cmVlcycgJworCWdpdCByZXNldCAtLWhhcmQgJiYKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisKKwlta2RpciBmb28gJiYKKwl0b3VjaCBmb28vYmFyICYmCisJZ2l0IGFkZCBmb28gJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tICJBZGRpbmcgZm9vIiAmJgorCisJZ2l0IHJtIC1yIGZvbyAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gIlJlbW92aW5nIGZvbyIgJiYKKworCW1rZGlyIGZvbyAmJgorCXRvdWNoIGZvby9iYXIgJiYKKwlnaXQgYWRkIGZvbyAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gIlJlLWFkZGluZyBmb28iICYmCisKKwlnaXQgZmlsdGVyLWJyYW5jaCAtZiAtLXN1YmRpcmVjdG9yeS1maWx0ZXIgZm9vICYmCisJdGVzdCAkKGdpdCByZXYtbGlzdCBtYXN0ZXIgfCB3YyAtbCkgPSAzCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NzAwNC10YWcuc2ggYi90L3Q3MDA0LXRhZy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYTcxNDFlCi0tLSAvZGV2L251bGwKKysrIGIvdC90NzAwNC10YWcuc2gKQEAgLTAsMCArMSwxMDY5IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3IENhcmxvcyBSaWNhCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC10YWcKKworVGVzdHMgZm9yIG9wZXJhdGlvbnMgd2l0aCB0YWdzLicKKworLiAuL3Rlc3QtbGliLnNoCisKKyMgY3JlYXRpbmcgYW5kIGxpc3RpbmcgbGlnaHR3ZWlnaHQgdGFnczoKKwordGFnX2V4aXN0cyAoKSB7CisJZ2l0IHNob3ctcmVmIC0tcXVpZXQgLS12ZXJpZnkgcmVmcy90YWdzLyIkMSIKK30KKworIyB0b2RvOiBnaXQgdGFnIC1sIG5vdyByZXR1cm5zIGFsd2F5cyB6ZXJvLCB3aGVuIGZpeGVkLCBjaGFuZ2UgdGhpcyB0ZXN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdsaXN0aW5nIGFsbCB0YWdzIGluIGFuIGVtcHR5IHRyZWUgc2hvdWxkIHN1Y2NlZWQnICcKKwlnaXQgdGFnIC1sICYmCisJZ2l0IHRhZworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdsaXN0aW5nIGFsbCB0YWdzIGluIGFuIGVtcHR5IHRyZWUgc2hvdWxkIG91dHB1dCBub3RoaW5nJyAnCisJdGVzdCBgZ2l0LXRhZyAtbCB8IHdjIC1sYCAtZXEgMCAmJgorCXRlc3QgYGdpdC10YWcgfCB3YyAtbGAgLWVxIDAKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbG9va2luZyBmb3IgYSB0YWcgaW4gYW4gZW1wdHkgdHJlZSBzaG91bGQgZmFpbCcgXAorCSchICh0YWdfZXhpc3RzIG15dGFnKScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY3JlYXRpbmcgYSB0YWcgaW4gYW4gZW1wdHkgdHJlZSBzaG91bGQgZmFpbCcgJworCSEgZ2l0LXRhZyBteW5vdGFnICYmCisJISB0YWdfZXhpc3RzIG15bm90YWcKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY3JlYXRpbmcgYSB0YWcgZm9yIEhFQUQgaW4gYW4gZW1wdHkgdHJlZSBzaG91bGQgZmFpbCcgJworCSEgZ2l0LXRhZyBteXRhZ2hlYWQgSEVBRCAmJgorCSEgdGFnX2V4aXN0cyBteXRhZ2hlYWQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY3JlYXRpbmcgYSB0YWcgZm9yIGFuIHVua25vd24gcmV2aXNpb24gc2hvdWxkIGZhaWwnICcKKwkhIGdpdC10YWcgbXl0YWdub3JldiBhYWFhYWFhYWFhYSAmJgorCSEgdGFnX2V4aXN0cyBteXRhZ25vcmV2CisnCisKKyMgY29tbWl0IHVzZWQgaW4gdGhlIHRlc3RzLCB0ZXN0X3RpY2sgaXMgYWxzbyBjYWxsZWQgaGVyZSB0byBmcmVlemUgdGhlIGRhdGU6Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjcmVhdGluZyBhIHRhZyB1c2luZyBkZWZhdWx0IEhFQUQgc2hvdWxkIHN1Y2NlZWQnICcKKwl0ZXN0X3RpY2sgJiYKKwllY2hvIGZvbyA+Zm9vICYmCisJZ2l0IGFkZCBmb28gJiYKKwlnaXQgY29tbWl0IC1tIEZvbyAmJgorCWdpdCB0YWcgbXl0YWcKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbGlzdGluZyBhbGwgdGFncyBpZiBvbmUgZXhpc3RzIHNob3VsZCBzdWNjZWVkJyAnCisJZ2l0LXRhZyAtbCAmJgorCWdpdC10YWcKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbGlzdGluZyBhbGwgdGFncyBpZiBvbmUgZXhpc3RzIHNob3VsZCBvdXRwdXQgdGhhdCB0YWcnICcKKwl0ZXN0IGBnaXQtdGFnIC1sYCA9IG15dGFnICYmCisJdGVzdCBgZ2l0LXRhZ2AgPSBteXRhZworJworCisjIHBhdHRlcm4gbWF0Y2hpbmc6CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2xpc3RpbmcgYSB0YWcgdXNpbmcgYSBtYXRjaGluZyBwYXR0ZXJuIHNob3VsZCBzdWNjZWVkJyBcCisJJ2dpdC10YWcgLWwgbXl0YWcnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdsaXN0aW5nIGEgdGFnIHVzaW5nIGEgbWF0Y2hpbmcgcGF0dGVybiBzaG91bGQgb3V0cHV0IHRoYXQgdGFnJyBcCisJJ3Rlc3QgYGdpdC10YWcgLWwgbXl0YWdgID0gbXl0YWcnCisKKyMgdG9kbzogZ2l0IHRhZyAtbCBub3cgcmV0dXJucyBhbHdheXMgemVybywgd2hlbiBmaXhlZCwgY2hhbmdlIHRoaXMgdGVzdAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2xpc3RpbmcgdGFncyB1c2luZyBhIG5vbi1tYXRjaGluZyBwYXR0ZXJuIHNob3VsZCBzdWNlZWQnIFwKKwknZ2l0LXRhZyAtbCB4eHgnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdsaXN0aW5nIHRhZ3MgdXNpbmcgYSBub24tbWF0Y2hpbmcgcGF0dGVybiBzaG91bGQgb3V0cHV0IG5vdGhpbmcnIFwKKwkndGVzdCBgZ2l0LXRhZyAtbCB4eHggfCB3YyAtbGAgLWVxIDAnCisKKyMgc3BlY2lhbCBjYXNlcyBmb3IgY3JlYXRpbmcgdGFnczoKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ3RyeWluZyB0byBjcmVhdGUgYSB0YWcgd2l0aCB0aGUgbmFtZSBvZiBvbmUgZXhpc3Rpbmcgc2hvdWxkIGZhaWwnIFwKKwknISBnaXQgdGFnIG15dGFnJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkndHJ5aW5nIHRvIGNyZWF0ZSBhIHRhZyB3aXRoIGEgbm9uLXZhbGlkIG5hbWUgc2hvdWxkIGZhaWwnICcKKwl0ZXN0IGBnaXQtdGFnIC1sIHwgd2MgLWxgIC1lcSAxICYmCisJISBnaXQgdGFnICIiICYmCisJISBnaXQgdGFnIC5vdGhlcnRhZyAmJgorCSEgZ2l0IHRhZyAib3RoZXIgdGFnIiAmJgorCSEgZ2l0IHRhZyAib3RoZXJ0YWdeIiAmJgorCSEgZ2l0IHRhZyAib3RoZXJ+dGFnIiAmJgorCXRlc3QgYGdpdC10YWcgLWwgfCB3YyAtbGAgLWVxIDEKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY3JlYXRpbmcgYSB0YWcgdXNpbmcgSEVBRCBkaXJlY3RseSBzaG91bGQgc3VjY2VlZCcgJworCWdpdCB0YWcgbXloZWFkIEhFQUQgJiYKKwl0YWdfZXhpc3RzIG15aGVhZAorJworCisjIGRlbGV0aW5nIHRhZ3M6CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3RyeWluZyB0byBkZWxldGUgYW4gdW5rbm93biB0YWcgc2hvdWxkIGZhaWwnICcKKwkhIHRhZ19leGlzdHMgdW5rbm93bi10YWcgJiYKKwkhIGdpdC10YWcgLWQgdW5rbm93bi10YWcKKycKKworY2F0ID5leHBlY3QgPDxFT0YKK215aGVhZAorbXl0YWcKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ3RyeWluZyB0byBkZWxldGUgdGFncyB3aXRob3V0IHBhcmFtcyBzaG91bGQgc3VjY2VlZCBhbmQgZG8gbm90aGluZycgJworCWdpdCB0YWcgLWwgPiBhY3R1YWwgJiYgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCWdpdC10YWcgLWQgJiYKKwlnaXQgdGFnIC1sID4gYWN0dWFsICYmIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2RlbGV0aW5nIHR3byBleGlzdGluZyB0YWdzIGluIG9uZSBjb21tYW5kIHNob3VsZCBzdWNjZWVkJyAnCisJdGFnX2V4aXN0cyBteXRhZyAmJgorCXRhZ19leGlzdHMgbXloZWFkICYmCisJZ2l0LXRhZyAtZCBteXRhZyBteWhlYWQgJiYKKwkhIHRhZ19leGlzdHMgbXl0YWcgJiYKKwkhIHRhZ19leGlzdHMgbXloZWFkCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdjcmVhdGluZyBhIHRhZyB3aXRoIHRoZSBuYW1lIG9mIGFub3RoZXIgZGVsZXRlZCBvbmUgc2hvdWxkIHN1Y2NlZWQnICcKKwkhIHRhZ19leGlzdHMgbXl0YWcgJiYKKwlnaXQtdGFnIG15dGFnICYmCisJdGFnX2V4aXN0cyBteXRhZworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkndHJ5aW5nIHRvIGRlbGV0ZSB0d28gdGFncywgZXhpc3RpbmcgYW5kIG5vdCwgc2hvdWxkIGZhaWwgaW4gdGhlIDJuZCcgJworCXRhZ19leGlzdHMgbXl0YWcgJiYKKwkhIHRhZ19leGlzdHMgbXloZWFkICYmCisJISBnaXQtdGFnIC1kIG15dGFnIGFub3RoZXJ0YWcgJiYKKwkhIHRhZ19leGlzdHMgbXl0YWcgJiYKKwkhIHRhZ19leGlzdHMgbXloZWFkCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3RyeWluZyB0byBkZWxldGUgYW4gYWxyZWFkeSBkZWxldGVkIHRhZyBzaG91bGQgZmFpbCcgXAorCSchIGdpdC10YWcgLWQgbXl0YWcnCisKKyMgbGlzdGluZyB2YXJpb3VzIHRhZ3Mgd2l0aCBwYXR0ZXJuIG1hdGNoaW5nOgorCitjYXQgPmV4cGVjdCA8PEVPRgorYTEKK2FhMQorY2JhCit0MjEwCit0MjExCit2MC4yLjEKK3YxLjAKK3YxLjAuMQordjEuMS4zCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2xpc3RpbmcgYWxsIHRhZ3Mgc2hvdWxkIHByaW50IHRoZW0gb3JkZXJlZCcgJworCWdpdCB0YWcgdjEuMC4xICYmCisJZ2l0IHRhZyB0MjExICYmCisJZ2l0IHRhZyBhYTEgJiYKKwlnaXQgdGFnIHYwLjIuMSAmJgorCWdpdCB0YWcgdjEuMS4zICYmCisJZ2l0IHRhZyBjYmEgJiYKKwlnaXQgdGFnIGExICYmCisJZ2l0IHRhZyB2MS4wICYmCisJZ2l0IHRhZyB0MjEwICYmCisJZ2l0IHRhZyAtbCA+IGFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKwlnaXQgdGFnID4gYWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorJworCitjYXQgPmV4cGVjdCA8PEVPRgorYTEKK2FhMQorY2JhCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdsaXN0aW5nIHRhZ3Mgd2l0aCBzdWJzdHJpbmcgYXMgcGF0dGVybiBtdXN0IHByaW50IHRob3NlIG1hdGNoaW5nJyAnCisJZ2l0LXRhZyAtbCAiKmEqIiA+IGFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwKKycKKworY2F0ID5leHBlY3QgPDxFT0YKK3YwLjIuMQordjEuMC4xCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdsaXN0aW5nIHRhZ3Mgd2l0aCBhIHN1ZmZpeCBhcyBwYXR0ZXJuIG11c3QgcHJpbnQgdGhvc2UgbWF0Y2hpbmcnICcKKwlnaXQtdGFnIC1sICIqLjEiID4gYWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorJworCitjYXQgPmV4cGVjdCA8PEVPRgordDIxMAordDIxMQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknbGlzdGluZyB0YWdzIHdpdGggYSBwcmVmaXggYXMgcGF0dGVybiBtdXN0IHByaW50IHRob3NlIG1hdGNoaW5nJyAnCisJZ2l0LXRhZyAtbCAidDIxKiIgPiBhY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsCisnCisKK2NhdCA+ZXhwZWN0IDw8RU9GCithMQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknbGlzdGluZyB0YWdzIHVzaW5nIGEgbmFtZSBhcyBwYXR0ZXJuIG11c3QgcHJpbnQgdGhhdCBvbmUgbWF0Y2hpbmcnICcKKwlnaXQtdGFnIC1sIGExID4gYWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorJworCitjYXQgPmV4cGVjdCA8PEVPRgordjEuMAorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknbGlzdGluZyB0YWdzIHVzaW5nIGEgbmFtZSBhcyBwYXR0ZXJuIG11c3QgcHJpbnQgdGhhdCBvbmUgbWF0Y2hpbmcnICcKKwlnaXQtdGFnIC1sIHYxLjAgPiBhY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsCisnCisKK2NhdCA+ZXhwZWN0IDw8RU9GCit2MS4wLjEKK3YxLjEuMworRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknbGlzdGluZyB0YWdzIHdpdGggPyBpbiB0aGUgcGF0dGVybiBzaG91bGQgcHJpbnQgdGhvc2UgbWF0Y2hpbmcnICcKKwlnaXQtdGFnIC1sICJ2MS4/Lj8iID4gYWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorJworCis+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknbGlzdGluZyB0YWdzIHVzaW5nIHYuKiBzaG91bGQgcHJpbnQgbm90aGluZyBiZWNhdXNlIG5vbmUgaGF2ZSB2LicgJworCWdpdC10YWcgLWwgInYuKiIgPiBhY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsCisnCisKK2NhdCA+ZXhwZWN0IDw8RU9GCit2MC4yLjEKK3YxLjAKK3YxLjAuMQordjEuMS4zCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdsaXN0aW5nIHRhZ3MgdXNpbmcgdiogc2hvdWxkIHByaW50IG9ubHkgdGhvc2UgaGF2aW5nIHYnICcKKwlnaXQtdGFnIC1sICJ2KiIgPiBhY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsCisnCisKKyMgY3JlYXRpbmcgYW5kIHZlcmlmeWluZyBsaWdodHdlaWdodCB0YWdzOgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknYSBub24tYW5ub3RhdGVkIHRhZyBjcmVhdGVkIHdpdGhvdXQgcGFyYW1ldGVycyBzaG91bGQgcG9pbnQgdG8gSEVBRCcgJworCWdpdC10YWcgbm9uLWFubm90YXRlZC10YWcgJiYKKwl0ZXN0ICQoZ2l0IGNhdC1maWxlIC10IG5vbi1hbm5vdGF0ZWQtdGFnKSA9IGNvbW1pdCAmJgorCXRlc3QgJChnaXQgcmV2LXBhcnNlIG5vbi1hbm5vdGF0ZWQtdGFnKSA9ICQoZ2l0IHJldi1wYXJzZSBIRUFEKQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0cnlpbmcgdG8gdmVyaWZ5IGFuIHVua25vd24gdGFnIHNob3VsZCBmYWlsJyBcCisJJyEgZ2l0LXRhZyAtdiB1bmtub3duLXRhZycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ3RyeWluZyB0byB2ZXJpZnkgYSBub24tYW5ub3RhdGVkIGFuZCBub24tc2lnbmVkIHRhZyBzaG91bGQgZmFpbCcgXAorCSchIGdpdC10YWcgLXYgbm9uLWFubm90YXRlZC10YWcnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSd0cnlpbmcgdG8gdmVyaWZ5IG1hbnkgbm9uLWFubm90YXRlZCBvciB1bmtub3duIHRhZ3MsIHNob3VsZCBmYWlsJyBcCisJJyEgZ2l0LXRhZyAtdiB1bmtub3duLXRhZzEgbm9uLWFubm90YXRlZC10YWcgdW5rbm93bi10YWcyJworCisjIGNyZWF0aW5nIGFubm90YXRlZCB0YWdzOgorCitnZXRfdGFnX21zZyAoKSB7CisJZ2l0IGNhdC1maWxlIHRhZyAiJDEiIHwgc2VkIC1lICIvQkVHSU4gUEdQL3EiCit9CisKKyMgcnVuIHRlc3RfdGljayBiZWZvcmUgY29tbWl0dGluZyBhbHdheXMgZ2l2ZXMgdGhlIHRpbWUgaW4gdGhhdCB0aW1lem9uZQorZ2V0X3RhZ19oZWFkZXIgKCkgeworY2F0IDw8RU9GCitvYmplY3QgJDIKK3R5cGUgJDMKK3RhZyAkMQordGFnZ2VyIEMgTyBNaXR0ZXIgPGNvbW1pdHRlckBleGFtcGxlLmNvbT4gJDQgLTA3MDAKKworRU9GCit9CisKK2NvbW1pdD0kKGdpdCByZXYtcGFyc2UgSEVBRCkKK3RpbWU9JHRlc3RfdGljaworCitnZXRfdGFnX2hlYWRlciBhbm5vdGF0ZWQtdGFnICRjb21taXQgY29tbWl0ICR0aW1lID5leHBlY3QKK2VjaG8gIkEgbWVzc2FnZSIgPj5leHBlY3QKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdjcmVhdGluZyBhbiBhbm5vdGF0ZWQgdGFnIHdpdGggLW0gbWVzc2FnZSBzaG91bGQgc3VjY2VlZCcgJworCWdpdC10YWcgLW0gIkEgbWVzc2FnZSIgYW5ub3RhdGVkLXRhZyAmJgorCWdldF90YWdfbXNnIGFubm90YXRlZC10YWcgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwKKycKKworY2F0ID5tc2dmaWxlIDw8RU9GCitBbm90aGVyIG1lc3NhZ2UKK2luIGEgZmlsZS4KK0VPRgorZ2V0X3RhZ19oZWFkZXIgZmlsZS1hbm5vdGF0ZWQtdGFnICRjb21taXQgY29tbWl0ICR0aW1lID5leHBlY3QKK2NhdCBtc2dmaWxlID4+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY3JlYXRpbmcgYW4gYW5ub3RhdGVkIHRhZyB3aXRoIC1GIG1lc3NhZ2VmaWxlIHNob3VsZCBzdWNjZWVkJyAnCisJZ2l0LXRhZyAtRiBtc2dmaWxlIGZpbGUtYW5ub3RhdGVkLXRhZyAmJgorCWdldF90YWdfbXNnIGZpbGUtYW5ub3RhdGVkLXRhZyA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorJworCitjYXQgPmlucHV0bXNnIDw8RU9GCitBIG1lc3NhZ2UgZnJvbSB0aGUKK3N0YW5kYXJkIGlucHV0CitFT0YKK2dldF90YWdfaGVhZGVyIHN0ZGluLWFubm90YXRlZC10YWcgJGNvbW1pdCBjb21taXQgJHRpbWUgPmV4cGVjdAorY2F0IGlucHV0bXNnID4+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjcmVhdGluZyBhbiBhbm5vdGF0ZWQgdGFnIHdpdGggLUYgLSBzaG91bGQgc3VjY2VlZCcgJworCWdpdC10YWcgLUYgLSBzdGRpbi1hbm5vdGF0ZWQtdGFnIDxpbnB1dG1zZyAmJgorCWdldF90YWdfbXNnIHN0ZGluLWFubm90YXRlZC10YWcgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ3RyeWluZyB0byBjcmVhdGUgYSB0YWcgd2l0aCBhIG5vbi1leGlzdGluZyAtRiBmaWxlIHNob3VsZCBmYWlsJyAnCisJISB0ZXN0IC1mIG5vbmV4aXN0aW5nZmlsZSAmJgorCSEgdGFnX2V4aXN0cyBub3RhZyAmJgorCSEgZ2l0LXRhZyAtRiBub25leGlzdGluZ2ZpbGUgbm90YWcgJiYKKwkhIHRhZ19leGlzdHMgbm90YWcKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ3RyeWluZyB0byBjcmVhdGUgdGFncyBnaXZpbmcgYm90aCAtbSBvciAtRiBvcHRpb25zIHNob3VsZCBmYWlsJyAnCisJZWNobyAibWVzc2FnZSBmaWxlIDEiID5tc2dmaWxlMSAmJgorCWVjaG8gIm1lc3NhZ2UgZmlsZSAyIiA+bXNnZmlsZTIgJiYKKwkhIHRhZ19leGlzdHMgbXNndGFnICYmCisJISBnaXQtdGFnIC1tICJtZXNzYWdlIDEiIC1GIG1zZ2ZpbGUxIG1zZ3RhZyAmJgorCSEgdGFnX2V4aXN0cyBtc2d0YWcgJiYKKwkhIGdpdC10YWcgLUYgbXNnZmlsZTEgLW0gIm1lc3NhZ2UgMSIgbXNndGFnICYmCisJISB0YWdfZXhpc3RzIG1zZ3RhZyAmJgorCSEgZ2l0LXRhZyAtbSAibWVzc2FnZSAxIiAtRiBtc2dmaWxlMSAtbSAibWVzc2FnZSAyIiBtc2d0YWcgJiYKKwkhIHRhZ19leGlzdHMgbXNndGFnCisnCisKKyMgYmxhbmsgYW5kIGVtcHR5IG1lc3NhZ2VzOgorCitnZXRfdGFnX2hlYWRlciBlbXB0eS1hbm5vdGF0ZWQtdGFnICRjb21taXQgY29tbWl0ICR0aW1lID5leHBlY3QKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdjcmVhdGluZyBhIHRhZyB3aXRoIGFuIGVtcHR5IC1tIG1lc3NhZ2Ugc2hvdWxkIHN1Y2NlZWQnICcKKwlnaXQtdGFnIC1tICIiIGVtcHR5LWFubm90YXRlZC10YWcgJiYKKwlnZXRfdGFnX21zZyBlbXB0eS1hbm5vdGF0ZWQtdGFnID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsCisnCisKKz5lbXB0eWZpbGUKK2dldF90YWdfaGVhZGVyIGVtcHR5ZmlsZS1hbm5vdGF0ZWQtdGFnICRjb21taXQgY29tbWl0ICR0aW1lID5leHBlY3QKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdjcmVhdGluZyBhIHRhZyB3aXRoIGFuIGVtcHR5IC1GIG1lc3NhZ2VmaWxlIHNob3VsZCBzdWNjZWVkJyAnCisJZ2l0LXRhZyAtRiBlbXB0eWZpbGUgZW1wdHlmaWxlLWFubm90YXRlZC10YWcgJiYKKwlnZXRfdGFnX21zZyBlbXB0eWZpbGUtYW5ub3RhdGVkLXRhZyA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorJworCitwcmludGYgJ1xuXG4gIFxuXHRcbkxlYWRpbmcgYmxhbmsgbGluZXNcbicgPmJsYW5rc2ZpbGUKK3ByaW50ZiAnXG5cdCBcdCAgXG5SZXBlYXRlZCBibGFuayBsaW5lc1xuJyA+PmJsYW5rc2ZpbGUKK3ByaW50ZiAnXG5cblxuVHJhaWxpbmcgc3BhY2VzICAgICAgXHQgIFxuJyA+PmJsYW5rc2ZpbGUKK3ByaW50ZiAnXG5UcmFpbGluZyBibGFuayBsaW5lc1xuXG5cdCBcblxuJyA+PmJsYW5rc2ZpbGUKK2dldF90YWdfaGVhZGVyIGJsYW5rcy1hbm5vdGF0ZWQtdGFnICRjb21taXQgY29tbWl0ICR0aW1lID5leHBlY3QKK2NhdCA+PmV4cGVjdCA8PEVPRgorTGVhZGluZyBibGFuayBsaW5lcworCitSZXBlYXRlZCBibGFuayBsaW5lcworCitUcmFpbGluZyBzcGFjZXMKKworVHJhaWxpbmcgYmxhbmsgbGluZXMKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2V4dHJhIGJsYW5rcyBpbiB0aGUgbWVzc2FnZSBmb3IgYW4gYW5ub3RhdGVkIHRhZyBzaG91bGQgYmUgcmVtb3ZlZCcgJworCWdpdC10YWcgLUYgYmxhbmtzZmlsZSBibGFua3MtYW5ub3RhdGVkLXRhZyAmJgorCWdldF90YWdfbXNnIGJsYW5rcy1hbm5vdGF0ZWQtdGFnID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsCisnCisKK2dldF90YWdfaGVhZGVyIGJsYW5rLWFubm90YXRlZC10YWcgJGNvbW1pdCBjb21taXQgJHRpbWUgPmV4cGVjdAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NyZWF0aW5nIGEgdGFnIHdpdGggYmxhbmsgLW0gbWVzc2FnZSB3aXRoIHNwYWNlcyBzaG91bGQgc3VjY2VlZCcgJworCWdpdC10YWcgLW0gIiAgICAgIiBibGFuay1hbm5vdGF0ZWQtdGFnICYmCisJZ2V0X3RhZ19tc2cgYmxhbmstYW5ub3RhdGVkLXRhZyA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorJworCitlY2hvICcgICAgICcgPmJsYW5rZmlsZQorZWNobyAnJyAgICAgID4+YmxhbmtmaWxlCitlY2hvICcgICcgICAgPj5ibGFua2ZpbGUKK2dldF90YWdfaGVhZGVyIGJsYW5rZmlsZS1hbm5vdGF0ZWQtdGFnICRjb21taXQgY29tbWl0ICR0aW1lID5leHBlY3QKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdjcmVhdGluZyBhIHRhZyB3aXRoIGJsYW5rIC1GIG1lc3NhZ2VmaWxlIHdpdGggc3BhY2VzIHNob3VsZCBzdWNjZWVkJyAnCisJZ2l0LXRhZyAtRiBibGFua2ZpbGUgYmxhbmtmaWxlLWFubm90YXRlZC10YWcgJiYKKwlnZXRfdGFnX21zZyBibGFua2ZpbGUtYW5ub3RhdGVkLXRhZyA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorJworCitwcmludGYgJyAgICAgICcgPmJsYW5rbm9ubGZpbGUKK2dldF90YWdfaGVhZGVyIGJsYW5rbm9ubGZpbGUtYW5ub3RhdGVkLXRhZyAkY29tbWl0IGNvbW1pdCAkdGltZSA+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY3JlYXRpbmcgYSB0YWcgd2l0aCAtRiBmaWxlIG9mIHNwYWNlcyBhbmQgbm8gbmV3bGluZSBzaG91bGQgc3VjY2VlZCcgJworCWdpdC10YWcgLUYgYmxhbmtub25sZmlsZSBibGFua25vbmxmaWxlLWFubm90YXRlZC10YWcgJiYKKwlnZXRfdGFnX21zZyBibGFua25vbmxmaWxlLWFubm90YXRlZC10YWcgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwKKycKKworIyBtZXNzYWdlcyB3aXRoIGNvbW1lbnRlZCBsaW5lczoKKworY2F0ID5jb21tZW50c2ZpbGUgPDxFT0YKKyMgQSBjb21tZW50CisKKyMjIyMjIyMjIyMjIworVGhlIG1lc3NhZ2UuCisjIyMjIyMjIyMjIyMKK09uZSBsaW5lLgorCisKKyMgY29tbWVudGVkIGxpbmVzCisjIGNvbW1lbnRlZCBsaW5lcworCitBbm90aGVyIGxpbmUuCisjIGNvbW1lbnRzCisKK0xhc3QgbGluZS4KK0VPRgorZ2V0X3RhZ19oZWFkZXIgY29tbWVudHMtYW5ub3RhdGVkLXRhZyAkY29tbWl0IGNvbW1pdCAkdGltZSA+ZXhwZWN0CitjYXQgPj5leHBlY3QgPDxFT0YKK1RoZSBtZXNzYWdlLgorT25lIGxpbmUuCisKK0Fub3RoZXIgbGluZS4KKworTGFzdCBsaW5lLgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY3JlYXRpbmcgYSB0YWcgdXNpbmcgYSAtRiBtZXNzYWdlZmlsZSB3aXRoICNjb21tZW50cyBzaG91bGQgc3VjY2VlZCcgJworCWdpdC10YWcgLUYgY29tbWVudHNmaWxlIGNvbW1lbnRzLWFubm90YXRlZC10YWcgJiYKKwlnZXRfdGFnX21zZyBjb21tZW50cy1hbm5vdGF0ZWQtdGFnID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsCisnCisKK2dldF90YWdfaGVhZGVyIGNvbW1lbnQtYW5ub3RhdGVkLXRhZyAkY29tbWl0IGNvbW1pdCAkdGltZSA+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY3JlYXRpbmcgYSB0YWcgd2l0aCBhICNjb21tZW50IGluIHRoZSAtbSBtZXNzYWdlIHNob3VsZCBzdWNjZWVkJyAnCisJZ2l0LXRhZyAtbSAiI2NvbW1lbnQiIGNvbW1lbnQtYW5ub3RhdGVkLXRhZyAmJgorCWdldF90YWdfbXNnIGNvbW1lbnQtYW5ub3RhdGVkLXRhZyA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorJworCitlY2hvICcjY29tbWVudCcgPmNvbW1lbnRmaWxlCitlY2hvICcnICAgICAgICAgPj5jb21tZW50ZmlsZQorZWNobyAnIyMjIycgICAgID4+Y29tbWVudGZpbGUKK2dldF90YWdfaGVhZGVyIGNvbW1lbnRmaWxlLWFubm90YXRlZC10YWcgJGNvbW1pdCBjb21taXQgJHRpbWUgPmV4cGVjdAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NyZWF0aW5nIGEgdGFnIHdpdGggI2NvbW1lbnRzIGluIHRoZSAtRiBtZXNzYWdlZmlsZSBzaG91bGQgc3VjY2VlZCcgJworCWdpdC10YWcgLUYgY29tbWVudGZpbGUgY29tbWVudGZpbGUtYW5ub3RhdGVkLXRhZyAmJgorCWdldF90YWdfbXNnIGNvbW1lbnRmaWxlLWFubm90YXRlZC10YWcgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwKKycKKworcHJpbnRmICcjY29tbWVudCcgPmNvbW1lbnRub25sZmlsZQorZ2V0X3RhZ19oZWFkZXIgY29tbWVudG5vbmxmaWxlLWFubm90YXRlZC10YWcgJGNvbW1pdCBjb21taXQgJHRpbWUgPmV4cGVjdAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NyZWF0aW5nIGEgdGFnIHdpdGggYSBmaWxlIG9mICNjb21tZW50IGFuZCBubyBuZXdsaW5lIHNob3VsZCBzdWNjZWVkJyAnCisJZ2l0LXRhZyAtRiBjb21tZW50bm9ubGZpbGUgY29tbWVudG5vbmxmaWxlLWFubm90YXRlZC10YWcgJiYKKwlnZXRfdGFnX21zZyBjb21tZW50bm9ubGZpbGUtYW5ub3RhdGVkLXRhZyA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorJworCisjIGxpc3RpbmcgbWVzc2FnZXMgZm9yIGFubm90YXRlZCBub24tc2lnbmVkIHRhZ3M6CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdsaXN0aW5nIHRoZSBvbmUtbGluZSBtZXNzYWdlIG9mIGEgbm9uLXNpZ25lZCB0YWcgc2hvdWxkIHN1Y2NlZWQnICcKKwlnaXQtdGFnIC1tICJBIG1zZyIgdGFnLW9uZS1saW5lICYmCisKKwllY2hvICJ0YWctb25lLWxpbmUiID5leHBlY3QgJiYKKwlnaXQtdGFnIC1sIHwgZ3JlcCAiXnRhZy1vbmUtbGluZSIgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKwlnaXQtdGFnIC1uMCAtbCB8IGdyZXAgIl50YWctb25lLWxpbmUiID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisJZ2l0LXRhZyAtbjAgLWwgdGFnLW9uZS1saW5lID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKwllY2hvICJ0YWctb25lLWxpbmUgICAgQSBtc2ciID5leHBlY3QgJiYKKwlnaXQtdGFnIC1uMSAtbCB8IGdyZXAgIl50YWctb25lLWxpbmUiID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisJZ2l0LXRhZyAtbiAtbCB8IGdyZXAgIl50YWctb25lLWxpbmUiID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisJZ2l0LXRhZyAtbjEgLWwgdGFnLW9uZS1saW5lID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisJZ2l0LXRhZyAtbjIgLWwgdGFnLW9uZS1saW5lID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisJZ2l0LXRhZyAtbjk5OSAtbCB0YWctb25lLWxpbmUgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2xpc3RpbmcgdGhlIHplcm8tbGluZXMgbWVzc2FnZSBvZiBhIG5vbi1zaWduZWQgdGFnIHNob3VsZCBzdWNjZWVkJyAnCisJZ2l0LXRhZyAtbSAiIiB0YWctemVyby1saW5lcyAmJgorCisJZWNobyAidGFnLXplcm8tbGluZXMiID5leHBlY3QgJiYKKwlnaXQtdGFnIC1sIHwgZ3JlcCAiXnRhZy16ZXJvLWxpbmVzIiA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCWdpdC10YWcgLW4wIC1sIHwgZ3JlcCAiXnRhZy16ZXJvLWxpbmVzIiA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCWdpdC10YWcgLW4wIC1sIHRhZy16ZXJvLWxpbmVzID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKwllY2hvICJ0YWctemVyby1saW5lcyAgIiA+ZXhwZWN0ICYmCisJZ2l0LXRhZyAtbjEgLWwgfCBncmVwICJedGFnLXplcm8tbGluZXMiID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisJZ2l0LXRhZyAtbiAtbCB8IGdyZXAgIl50YWctemVyby1saW5lcyIgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKwlnaXQtdGFnIC1uMSAtbCB0YWctemVyby1saW5lcyA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCWdpdC10YWcgLW4yIC1sIHRhZy16ZXJvLWxpbmVzID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisJZ2l0LXRhZyAtbjk5OSAtbCB0YWctemVyby1saW5lcyA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorJworCitlY2hvICd0YWcgbGluZSBvbmUnID5hbm5vdGFnbXNnCitlY2hvICd0YWcgbGluZSB0d28nID4+YW5ub3RhZ21zZworZWNobyAndGFnIGxpbmUgdGhyZWUnID4+YW5ub3RhZ21zZwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2xpc3RpbmcgbWFueSBtZXNzYWdlIGxpbmVzIG9mIGEgbm9uLXNpZ25lZCB0YWcgc2hvdWxkIHN1Y2NlZWQnICcKKwlnaXQtdGFnIC1GIGFubm90YWdtc2cgdGFnLWxpbmVzICYmCisKKwllY2hvICJ0YWctbGluZXMiID5leHBlY3QgJiYKKwlnaXQtdGFnIC1sIHwgZ3JlcCAiXnRhZy1saW5lcyIgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKwlnaXQtdGFnIC1uMCAtbCB8IGdyZXAgIl50YWctbGluZXMiID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisJZ2l0LXRhZyAtbjAgLWwgdGFnLWxpbmVzID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKwllY2hvICJ0YWctbGluZXMgICAgICAgdGFnIGxpbmUgb25lIiA+ZXhwZWN0ICYmCisJZ2l0LXRhZyAtbjEgLWwgfCBncmVwICJedGFnLWxpbmVzIiA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCWdpdC10YWcgLW4gLWwgfCBncmVwICJedGFnLWxpbmVzIiA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCWdpdC10YWcgLW4xIC1sIHRhZy1saW5lcyA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisJZWNobyAiICAgIHRhZyBsaW5lIHR3byIgPj5leHBlY3QgJiYKKwlnaXQtdGFnIC1uMiAtbCB8IGdyZXAgIl4gKnRhZy5saW5lIiA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCWdpdC10YWcgLW4yIC1sIHRhZy1saW5lcyA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisJZWNobyAiICAgIHRhZyBsaW5lIHRocmVlIiA+PmV4cGVjdCAmJgorCWdpdC10YWcgLW4zIC1sIHwgZ3JlcCAiXiAqdGFnLmxpbmUiID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisJZ2l0LXRhZyAtbjMgLWwgdGFnLWxpbmVzID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisJZ2l0LXRhZyAtbjQgLWwgfCBncmVwICJeICp0YWcubGluZSIgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKwlnaXQtdGFnIC1uNCAtbCB0YWctbGluZXMgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKwlnaXQtdGFnIC1uOTkgLWwgfCBncmVwICJeICp0YWcubGluZSIgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKwlnaXQtdGFnIC1uOTkgLWwgdGFnLWxpbmVzID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsCisnCisKKyMgc3Vic2VxdWVudCB0ZXN0cyByZXF1aXJlIGdwZzsgY2hlY2sgaWYgaXQgaXMgYXZhaWxhYmxlCitncGcgLS12ZXJzaW9uID4vZGV2L251bGwKK2lmIFsgJD8gLWVxIDEyNyBdOyB0aGVuCisJZWNobyAiZ3BnIG5vdCBmb3VuZCAtIHNraXBwaW5nIHRhZyBzaWduaW5nIGFuZCB2ZXJpZmljYXRpb24gdGVzdHMiCisJdGVzdF9kb25lCisJZXhpdAorZmkKKworIyB0cnlpbmcgdG8gdmVyaWZ5IGFubm90YXRlZCBub24tc2lnbmVkIHRhZ3M6CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSd0cnlpbmcgdG8gdmVyaWZ5IGFuIGFubm90YXRlZCBub24tc2lnbmVkIHRhZyBzaG91bGQgZmFpbCcgJworCXRhZ19leGlzdHMgYW5ub3RhdGVkLXRhZyAmJgorCSEgZ2l0LXRhZyAtdiBhbm5vdGF0ZWQtdGFnCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSd0cnlpbmcgdG8gdmVyaWZ5IGEgZmlsZS1hbm5vdGF0ZWQgbm9uLXNpZ25lZCB0YWcgc2hvdWxkIGZhaWwnICcKKwl0YWdfZXhpc3RzIGZpbGUtYW5ub3RhdGVkLXRhZyAmJgorCSEgZ2l0LXRhZyAtdiBmaWxlLWFubm90YXRlZC10YWcKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ3RyeWluZyB0byB2ZXJpZnkgdHdvIGFubm90YXRlZCBub24tc2lnbmVkIHRhZ3Mgc2hvdWxkIGZhaWwnICcKKwl0YWdfZXhpc3RzIGFubm90YXRlZC10YWcgZmlsZS1hbm5vdGF0ZWQtdGFnICYmCisJISBnaXQtdGFnIC12IGFubm90YXRlZC10YWcgZmlsZS1hbm5vdGF0ZWQtdGFnCisnCisKKyMgY3JlYXRpbmcgYW5kIHZlcmlmeWluZyBzaWduZWQgdGFnczoKKworIyBBcyBzYWlkIGhlcmU6IGh0dHA6Ly93d3cuZ251cGcub3JnL2RvY3VtZW50YXRpb24vZmFxcy5odG1sI3E2LjE5CisjIHRoZSBncGcgdmVyc2lvbiAxLjAuNiBkaWRuJ3QgcGFyc2UgdHJ1c3QgcGFja2V0cyBjb3JyZWN0bHksIHNvIGZvcgorIyB0aGF0IHZlcnNpb24sIGNyZWF0aW9uIG9mIHNpZ25lZCB0YWdzIHVzaW5nIHRoZSBnZW5lcmF0ZWQga2V5IGZhaWxzLgorY2FzZSAiJChncGcgLS12ZXJzaW9uKSIgaW4KKydncGcgKEdudVBHKSAxLjAuNicqKQorCWVjaG8gIlNraXBwaW5nIHNpZ25lZCB0YWcgdGVzdHMsIGJlY2F1c2UgYSBidWcgaW4gMS4wLjYgdmVyc2lvbiIKKwl0ZXN0X2RvbmUKKwlleGl0CisJOzsKK2VzYWMKKworIyBrZXkgZ2VuZXJhdGlvbiBpbmZvOiBncGcgLS1ob21lZGlyIHQvdDcwMDQgLS1nZW4ta2V5CisjIFR5cGUgRFNBIGFuZCBFbGdhbWFsLCBzaXplIDIwNDggYml0cywgbm8gZXhwaXJhdGlvbiBkYXRlLgorIyBOYW1lIGFuZCBlbWFpbDogQyBPIE1pdHRlciA8Y29tbWl0dGVyQGV4YW1wbGUuY29tPgorIyBObyBwYXNzd29yZCBnaXZlbiwgdG8gZW5hYmxlIG5vbi1pbnRlcmFjdGl2ZSBvcGVyYXRpb24uCisKK2NwIC1SIC4uL3Q3MDA0IC4vZ3BnaG9tZQorY2htb2QgMDcwMCBncGdob21lCitleHBvcnQgR05VUEdIT01FPSIkKHB3ZCkvZ3BnaG9tZSIKKworZ2V0X3RhZ19oZWFkZXIgc2lnbmVkLXRhZyAkY29tbWl0IGNvbW1pdCAkdGltZSA+ZXhwZWN0CitlY2hvICdBIHNpZ25lZCB0YWcgbWVzc2FnZScgPj5leHBlY3QKK2VjaG8gJy0tLS0tQkVHSU4gUEdQIFNJR05BVFVSRS0tLS0tJyA+PmV4cGVjdAordGVzdF9leHBlY3Rfc3VjY2VzcyAnY3JlYXRpbmcgYSBzaWduZWQgdGFnIHdpdGggLW0gbWVzc2FnZSBzaG91bGQgc3VjY2VlZCcgJworCWdpdC10YWcgLXMgLW0gIkEgc2lnbmVkIHRhZyBtZXNzYWdlIiBzaWduZWQtdGFnICYmCisJZ2V0X3RhZ19tc2cgc2lnbmVkLXRhZyA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorJworCitnZXRfdGFnX2hlYWRlciB1LXNpZ25lZC10YWcgJGNvbW1pdCBjb21taXQgJHRpbWUgPmV4cGVjdAorZWNobyAnQW5vdGhlciBtZXNzYWdlJyA+PmV4cGVjdAorZWNobyAnLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0nID4+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzaWduIHdpdGggYSBnaXZlbiBrZXkgaWQnICcKKworCWdpdCB0YWcgLXUgY29tbWl0dGVyQGV4YW1wbGUuY29tIC1tICJBbm90aGVyIG1lc3NhZ2UiIHUtc2lnbmVkLXRhZyAmJgorCWdldF90YWdfbXNnIHUtc2lnbmVkLXRhZyA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NpZ24gd2l0aCBhbiB1bmtub3duIGlkICgxKScgJworCisJISBnaXQgdGFnIC11IGF1dGhvckBleGFtcGxlLmNvbSAtbSAiQW5vdGhlciBtZXNzYWdlIiBvLXNpZ25lZC10YWcKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzaWduIHdpdGggYW4gdW5rbm93biBpZCAoMiknICcKKworCSEgZ2l0IHRhZyAtdSBERUFEQkVFRiAtbSAiQW5vdGhlciBtZXNzYWdlIiBvLXNpZ25lZC10YWcKKworJworCitjYXQgPmZha2VlZGl0b3IgPDwnRU9GJworIyEvYmluL3NoCit0ZXN0IC1uICIkMSIgJiYgZXhlYyA+IiQxIgorZWNobyBBIHNpZ25lZCB0YWcgbWVzc2FnZQorZWNobyBmcm9tIGEgZmFrZSBlZGl0b3IuCitFT0YKK2NobW9kICt4IGZha2VlZGl0b3IKKworZ2V0X3RhZ19oZWFkZXIgaW1wbGllZC1zaWduICRjb21taXQgY29tbWl0ICR0aW1lID5leHBlY3QKKy4vZmFrZWVkaXRvciA+PmV4cGVjdAorZWNobyAnLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0nID4+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICctdSBpbXBsaWVzIHNpZ25lZCB0YWcnICcKKwlHSVRfRURJVE9SPS4vZmFrZWVkaXRvciBnaXQtdGFnIC11IENEREU0MzBEIGltcGxpZWQtc2lnbiAmJgorCWdldF90YWdfbXNnIGltcGxpZWQtc2lnbiA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorJworCitjYXQgPnNpZ21zZ2ZpbGUgPDxFT0YKK0Fub3RoZXIgc2lnbmVkIHRhZworbWVzc2FnZSBpbiBhIGZpbGUuCitFT0YKK2dldF90YWdfaGVhZGVyIGZpbGUtc2lnbmVkLXRhZyAkY29tbWl0IGNvbW1pdCAkdGltZSA+ZXhwZWN0CitjYXQgc2lnbXNnZmlsZSA+PmV4cGVjdAorZWNobyAnLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0nID4+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY3JlYXRpbmcgYSBzaWduZWQgdGFnIHdpdGggLUYgbWVzc2FnZWZpbGUgc2hvdWxkIHN1Y2NlZWQnICcKKwlnaXQtdGFnIC1zIC1GIHNpZ21zZ2ZpbGUgZmlsZS1zaWduZWQtdGFnICYmCisJZ2V0X3RhZ19tc2cgZmlsZS1zaWduZWQtdGFnID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsCisnCisKK2NhdCA+c2lnaW5wdXRtc2cgPDxFT0YKK0Egc2lnbmVkIHRhZyBtZXNzYWdlIGZyb20KK3RoZSBzdGFuZGFyZCBpbnB1dAorRU9GCitnZXRfdGFnX2hlYWRlciBzdGRpbi1zaWduZWQtdGFnICRjb21taXQgY29tbWl0ICR0aW1lID5leHBlY3QKK2NhdCBzaWdpbnB1dG1zZyA+PmV4cGVjdAorZWNobyAnLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0nID4+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjcmVhdGluZyBhIHNpZ25lZCB0YWcgd2l0aCAtRiAtIHNob3VsZCBzdWNjZWVkJyAnCisJZ2l0LXRhZyAtcyAtRiAtIHN0ZGluLXNpZ25lZC10YWcgPHNpZ2lucHV0bXNnICYmCisJZ2V0X3RhZ19tc2cgc3RkaW4tc2lnbmVkLXRhZyA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorJworCitnZXRfdGFnX2hlYWRlciBpbXBsaWVkLWFubm90YXRlICRjb21taXQgY29tbWl0ICR0aW1lID5leHBlY3QKKy4vZmFrZWVkaXRvciA+PmV4cGVjdAorZWNobyAnLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0nID4+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICctcyBpbXBsaWVzIGFubm90YXRlZCB0YWcnICcKKwlHSVRfRURJVE9SPS4vZmFrZWVkaXRvciBnaXQtdGFnIC1zIGltcGxpZWQtYW5ub3RhdGUgJiYKKwlnZXRfdGFnX21zZyBpbXBsaWVkLWFubm90YXRlID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSd0cnlpbmcgdG8gY3JlYXRlIGEgc2lnbmVkIHRhZyB3aXRoIG5vbi1leGlzdGluZyAtRiBmaWxlIHNob3VsZCBmYWlsJyAnCisJISB0ZXN0IC1mIG5vbmV4aXN0aW5nZmlsZSAmJgorCSEgdGFnX2V4aXN0cyBub3NpZ3RhZyAmJgorCSEgZ2l0LXRhZyAtcyAtRiBub25leGlzdGluZ2ZpbGUgbm9zaWd0YWcgJiYKKwkhIHRhZ19leGlzdHMgbm9zaWd0YWcKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndmVyaWZ5aW5nIGEgc2lnbmVkIHRhZyBzaG91bGQgc3VjY2VlZCcgXAorCSdnaXQtdGFnIC12IHNpZ25lZC10YWcnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ZlcmlmeWluZyB0d28gc2lnbmVkIHRhZ3MgaW4gb25lIGNvbW1hbmQgc2hvdWxkIHN1Y2NlZWQnIFwKKwknZ2l0LXRhZyAtdiBzaWduZWQtdGFnIGZpbGUtc2lnbmVkLXRhZycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ3ZlcmlmeWluZyBtYW55IHNpZ25lZCBhbmQgbm9uLXNpZ25lZCB0YWdzIHNob3VsZCBmYWlsJyAnCisJISBnaXQtdGFnIC12IHNpZ25lZC10YWcgYW5ub3RhdGVkLXRhZyAmJgorCSEgZ2l0LXRhZyAtdiBmaWxlLWFubm90YXRlZC10YWcgZmlsZS1zaWduZWQtdGFnICYmCisJISBnaXQtdGFnIC12IGFubm90YXRlZC10YWcgZmlsZS1zaWduZWQtdGFnIGZpbGUtYW5ub3RhdGVkLXRhZyAmJgorCSEgZ2l0LXRhZyAtdiBzaWduZWQtdGFnIGFubm90YXRlZC10YWcgZmlsZS1zaWduZWQtdGFnCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ZlcmlmeWluZyBhIGZvcmdlZCB0YWcgc2hvdWxkIGZhaWwnICcKKwlmb3JnZWQ9JChnaXQgY2F0LWZpbGUgdGFnIHNpZ25lZC10YWcgfAorCQlzZWQgLWUgInMvc2lnbmVkLXRhZy9mb3JnZWQtdGFnLyIgfAorCQlnaXQgbWt0YWcpICYmCisJZ2l0IHRhZyBmb3JnZWQtdGFnICRmb3JnZWQgJiYKKwkhIGdpdC10YWcgLXYgZm9yZ2VkLXRhZworJworCisjIGJsYW5rIGFuZCBlbXB0eSBtZXNzYWdlcyBmb3Igc2lnbmVkIHRhZ3M6CisKK2dldF90YWdfaGVhZGVyIGVtcHR5LXNpZ25lZC10YWcgJGNvbW1pdCBjb21taXQgJHRpbWUgPmV4cGVjdAorZWNobyAnLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0nID4+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY3JlYXRpbmcgYSBzaWduZWQgdGFnIHdpdGggYW4gZW1wdHkgLW0gbWVzc2FnZSBzaG91bGQgc3VjY2VlZCcgJworCWdpdC10YWcgLXMgLW0gIiIgZW1wdHktc2lnbmVkLXRhZyAmJgorCWdldF90YWdfbXNnIGVtcHR5LXNpZ25lZC10YWcgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKwlnaXQtdGFnIC12IGVtcHR5LXNpZ25lZC10YWcKKycKKworPnNpZ2VtcHR5ZmlsZQorZ2V0X3RhZ19oZWFkZXIgZW1wdHlmaWxlLXNpZ25lZC10YWcgJGNvbW1pdCBjb21taXQgJHRpbWUgPmV4cGVjdAorZWNobyAnLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0nID4+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY3JlYXRpbmcgYSBzaWduZWQgdGFnIHdpdGggYW4gZW1wdHkgLUYgbWVzc2FnZWZpbGUgc2hvdWxkIHN1Y2NlZWQnICcKKwlnaXQtdGFnIC1zIC1GIHNpZ2VtcHR5ZmlsZSBlbXB0eWZpbGUtc2lnbmVkLXRhZyAmJgorCWdldF90YWdfbXNnIGVtcHR5ZmlsZS1zaWduZWQtdGFnID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisJZ2l0LXRhZyAtdiBlbXB0eWZpbGUtc2lnbmVkLXRhZworJworCitwcmludGYgJ1xuXG4gIFxuXHRcbkxlYWRpbmcgYmxhbmsgbGluZXNcbicgPiBzaWdibGFua3NmaWxlCitwcmludGYgJ1xuXHQgXHQgIFxuUmVwZWF0ZWQgYmxhbmsgbGluZXNcbicgPj5zaWdibGFua3NmaWxlCitwcmludGYgJ1xuXG5cblRyYWlsaW5nIHNwYWNlcyAgICAgIFx0ICBcbicgPj5zaWdibGFua3NmaWxlCitwcmludGYgJ1xuVHJhaWxpbmcgYmxhbmsgbGluZXNcblxuXHQgXG5cbicgPj5zaWdibGFua3NmaWxlCitnZXRfdGFnX2hlYWRlciBibGFua3Mtc2lnbmVkLXRhZyAkY29tbWl0IGNvbW1pdCAkdGltZSA+ZXhwZWN0CitjYXQgPj5leHBlY3QgPDxFT0YKK0xlYWRpbmcgYmxhbmsgbGluZXMKKworUmVwZWF0ZWQgYmxhbmsgbGluZXMKKworVHJhaWxpbmcgc3BhY2VzCisKK1RyYWlsaW5nIGJsYW5rIGxpbmVzCitFT0YKK2VjaG8gJy0tLS0tQkVHSU4gUEdQIFNJR05BVFVSRS0tLS0tJyA+PmV4cGVjdAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2V4dHJhIGJsYW5rcyBpbiB0aGUgbWVzc2FnZSBmb3IgYSBzaWduZWQgdGFnIHNob3VsZCBiZSByZW1vdmVkJyAnCisJZ2l0LXRhZyAtcyAtRiBzaWdibGFua3NmaWxlIGJsYW5rcy1zaWduZWQtdGFnICYmCisJZ2V0X3RhZ19tc2cgYmxhbmtzLXNpZ25lZC10YWcgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKwlnaXQtdGFnIC12IGJsYW5rcy1zaWduZWQtdGFnCisnCisKK2dldF90YWdfaGVhZGVyIGJsYW5rLXNpZ25lZC10YWcgJGNvbW1pdCBjb21taXQgJHRpbWUgPmV4cGVjdAorZWNobyAnLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0nID4+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY3JlYXRpbmcgYSBzaWduZWQgdGFnIHdpdGggYSBibGFuayAtbSBtZXNzYWdlIHNob3VsZCBzdWNjZWVkJyAnCisJZ2l0LXRhZyAtcyAtbSAiICAgICAiIGJsYW5rLXNpZ25lZC10YWcgJiYKKwlnZXRfdGFnX21zZyBibGFuay1zaWduZWQtdGFnID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisJZ2l0LXRhZyAtdiBibGFuay1zaWduZWQtdGFnCisnCisKK2VjaG8gJyAgICAgJyA+c2lnYmxhbmtmaWxlCitlY2hvICcnICAgICAgPj5zaWdibGFua2ZpbGUKK2VjaG8gJyAgJyAgICA+PnNpZ2JsYW5rZmlsZQorZ2V0X3RhZ19oZWFkZXIgYmxhbmtmaWxlLXNpZ25lZC10YWcgJGNvbW1pdCBjb21taXQgJHRpbWUgPmV4cGVjdAorZWNobyAnLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0nID4+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY3JlYXRpbmcgYSBzaWduZWQgdGFnIHdpdGggYmxhbmsgLUYgZmlsZSB3aXRoIHNwYWNlcyBzaG91bGQgc3VjY2VlZCcgJworCWdpdC10YWcgLXMgLUYgc2lnYmxhbmtmaWxlIGJsYW5rZmlsZS1zaWduZWQtdGFnICYmCisJZ2V0X3RhZ19tc2cgYmxhbmtmaWxlLXNpZ25lZC10YWcgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKwlnaXQtdGFnIC12IGJsYW5rZmlsZS1zaWduZWQtdGFnCisnCisKK3ByaW50ZiAnICAgICAgJyA+c2lnYmxhbmtub25sZmlsZQorZ2V0X3RhZ19oZWFkZXIgYmxhbmtub25sZmlsZS1zaWduZWQtdGFnICRjb21taXQgY29tbWl0ICR0aW1lID5leHBlY3QKK2VjaG8gJy0tLS0tQkVHSU4gUEdQIFNJR05BVFVSRS0tLS0tJyA+PmV4cGVjdAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NyZWF0aW5nIGEgc2lnbmVkIHRhZyB3aXRoIHNwYWNlcyBhbmQgbm8gbmV3bGluZSBzaG91bGQgc3VjY2VlZCcgJworCWdpdC10YWcgLXMgLUYgc2lnYmxhbmtub25sZmlsZSBibGFua25vbmxmaWxlLXNpZ25lZC10YWcgJiYKKwlnZXRfdGFnX21zZyBibGFua25vbmxmaWxlLXNpZ25lZC10YWcgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKwlnaXQtdGFnIC12IHNpZ25lZC10YWcKKycKKworIyBtZXNzYWdlcyB3aXRoIGNvbW1lbnRlZCBsaW5lcyBmb3Igc2lnbmVkIHRhZ3M6CisKK2NhdCA+c2lnY29tbWVudHNmaWxlIDw8RU9GCisjIEEgY29tbWVudAorCisjIyMjIyMjIyMjIyMKK1RoZSBtZXNzYWdlLgorIyMjIyMjIyMjIyMjCitPbmUgbGluZS4KKworCisjIGNvbW1lbnRlZCBsaW5lcworIyBjb21tZW50ZWQgbGluZXMKKworQW5vdGhlciBsaW5lLgorIyBjb21tZW50cworCitMYXN0IGxpbmUuCitFT0YKK2dldF90YWdfaGVhZGVyIGNvbW1lbnRzLXNpZ25lZC10YWcgJGNvbW1pdCBjb21taXQgJHRpbWUgPmV4cGVjdAorY2F0ID4+ZXhwZWN0IDw8RU9GCitUaGUgbWVzc2FnZS4KK09uZSBsaW5lLgorCitBbm90aGVyIGxpbmUuCisKK0xhc3QgbGluZS4KK0VPRgorZWNobyAnLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0nID4+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY3JlYXRpbmcgYSBzaWduZWQgdGFnIHdpdGggYSAtRiBmaWxlIHdpdGggI2NvbW1lbnRzIHNob3VsZCBzdWNjZWVkJyAnCisJZ2l0LXRhZyAtcyAtRiBzaWdjb21tZW50c2ZpbGUgY29tbWVudHMtc2lnbmVkLXRhZyAmJgorCWdldF90YWdfbXNnIGNvbW1lbnRzLXNpZ25lZC10YWcgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKwlnaXQtdGFnIC12IGNvbW1lbnRzLXNpZ25lZC10YWcKKycKKworZ2V0X3RhZ19oZWFkZXIgY29tbWVudC1zaWduZWQtdGFnICRjb21taXQgY29tbWl0ICR0aW1lID5leHBlY3QKK2VjaG8gJy0tLS0tQkVHSU4gUEdQIFNJR05BVFVSRS0tLS0tJyA+PmV4cGVjdAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NyZWF0aW5nIGEgc2lnbmVkIHRhZyB3aXRoICNjb21tZW50ZWQgLW0gbWVzc2FnZSBzaG91bGQgc3VjY2VlZCcgJworCWdpdC10YWcgLXMgLW0gIiNjb21tZW50IiBjb21tZW50LXNpZ25lZC10YWcgJiYKKwlnZXRfdGFnX21zZyBjb21tZW50LXNpZ25lZC10YWcgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKwlnaXQtdGFnIC12IGNvbW1lbnQtc2lnbmVkLXRhZworJworCitlY2hvICcjY29tbWVudCcgPnNpZ2NvbW1lbnRmaWxlCitlY2hvICcnICAgICAgICAgPj5zaWdjb21tZW50ZmlsZQorZWNobyAnIyMjIycgICAgID4+c2lnY29tbWVudGZpbGUKK2dldF90YWdfaGVhZGVyIGNvbW1lbnRmaWxlLXNpZ25lZC10YWcgJGNvbW1pdCBjb21taXQgJHRpbWUgPmV4cGVjdAorZWNobyAnLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0nID4+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY3JlYXRpbmcgYSBzaWduZWQgdGFnIHdpdGggI2NvbW1lbnRlZCAtRiBtZXNzYWdlZmlsZSBzaG91bGQgc3VjY2VlZCcgJworCWdpdC10YWcgLXMgLUYgc2lnY29tbWVudGZpbGUgY29tbWVudGZpbGUtc2lnbmVkLXRhZyAmJgorCWdldF90YWdfbXNnIGNvbW1lbnRmaWxlLXNpZ25lZC10YWcgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKwlnaXQtdGFnIC12IGNvbW1lbnRmaWxlLXNpZ25lZC10YWcKKycKKworcHJpbnRmICcjY29tbWVudCcgPnNpZ2NvbW1lbnRub25sZmlsZQorZ2V0X3RhZ19oZWFkZXIgY29tbWVudG5vbmxmaWxlLXNpZ25lZC10YWcgJGNvbW1pdCBjb21taXQgJHRpbWUgPmV4cGVjdAorZWNobyAnLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0nID4+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY3JlYXRpbmcgYSBzaWduZWQgdGFnIHdpdGggYSAjY29tbWVudCBhbmQgbm8gbmV3bGluZSBzaG91bGQgc3VjY2VlZCcgJworCWdpdC10YWcgLXMgLUYgc2lnY29tbWVudG5vbmxmaWxlIGNvbW1lbnRub25sZmlsZS1zaWduZWQtdGFnICYmCisJZ2V0X3RhZ19tc2cgY29tbWVudG5vbmxmaWxlLXNpZ25lZC10YWcgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKwlnaXQtdGFnIC12IGNvbW1lbnRub25sZmlsZS1zaWduZWQtdGFnCisnCisKKyMgbGlzdGluZyBtZXNzYWdlcyBmb3Igc2lnbmVkIHRhZ3M6CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdsaXN0aW5nIHRoZSBvbmUtbGluZSBtZXNzYWdlIG9mIGEgc2lnbmVkIHRhZyBzaG91bGQgc3VjY2VlZCcgJworCWdpdC10YWcgLXMgLW0gIkEgbWVzc2FnZSBsaW5lIHNpZ25lZCIgc3RhZy1vbmUtbGluZSAmJgorCisJZWNobyAic3RhZy1vbmUtbGluZSIgPmV4cGVjdCAmJgorCWdpdC10YWcgLWwgfCBncmVwICJec3RhZy1vbmUtbGluZSIgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKwlnaXQtdGFnIC1uMCAtbCB8IGdyZXAgIl5zdGFnLW9uZS1saW5lIiA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCWdpdC10YWcgLW4wIC1sIHN0YWctb25lLWxpbmUgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKworCWVjaG8gInN0YWctb25lLWxpbmUgICBBIG1lc3NhZ2UgbGluZSBzaWduZWQiID5leHBlY3QgJiYKKwlnaXQtdGFnIC1uMSAtbCB8IGdyZXAgIl5zdGFnLW9uZS1saW5lIiA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCWdpdC10YWcgLW4gLWwgfCBncmVwICJec3RhZy1vbmUtbGluZSIgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKwlnaXQtdGFnIC1uMSAtbCBzdGFnLW9uZS1saW5lID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisJZ2l0LXRhZyAtbjIgLWwgc3RhZy1vbmUtbGluZSA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCWdpdC10YWcgLW45OTkgLWwgc3RhZy1vbmUtbGluZSA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknbGlzdGluZyB0aGUgemVyby1saW5lcyBtZXNzYWdlIG9mIGEgc2lnbmVkIHRhZyBzaG91bGQgc3VjY2VlZCcgJworCWdpdC10YWcgLXMgLW0gIiIgc3RhZy16ZXJvLWxpbmVzICYmCisKKwllY2hvICJzdGFnLXplcm8tbGluZXMiID5leHBlY3QgJiYKKwlnaXQtdGFnIC1sIHwgZ3JlcCAiXnN0YWctemVyby1saW5lcyIgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKwlnaXQtdGFnIC1uMCAtbCB8IGdyZXAgIl5zdGFnLXplcm8tbGluZXMiID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisJZ2l0LXRhZyAtbjAgLWwgc3RhZy16ZXJvLWxpbmVzID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisKKwllY2hvICJzdGFnLXplcm8tbGluZXMgIiA+ZXhwZWN0ICYmCisJZ2l0LXRhZyAtbjEgLWwgfCBncmVwICJec3RhZy16ZXJvLWxpbmVzIiA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCWdpdC10YWcgLW4gLWwgfCBncmVwICJec3RhZy16ZXJvLWxpbmVzIiA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCWdpdC10YWcgLW4xIC1sIHN0YWctemVyby1saW5lcyA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCWdpdC10YWcgLW4yIC1sIHN0YWctemVyby1saW5lcyA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCWdpdC10YWcgLW45OTkgLWwgc3RhZy16ZXJvLWxpbmVzID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsCisnCisKK2VjaG8gJ3N0YWcgbGluZSBvbmUnID5zaWd0YWdtc2cKK2VjaG8gJ3N0YWcgbGluZSB0d28nID4+c2lndGFnbXNnCitlY2hvICdzdGFnIGxpbmUgdGhyZWUnID4+c2lndGFnbXNnCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknbGlzdGluZyBtYW55IG1lc3NhZ2UgbGluZXMgb2YgYSBzaWduZWQgdGFnIHNob3VsZCBzdWNjZWVkJyAnCisJZ2l0LXRhZyAtcyAtRiBzaWd0YWdtc2cgc3RhZy1saW5lcyAmJgorCisJZWNobyAic3RhZy1saW5lcyIgPmV4cGVjdCAmJgorCWdpdC10YWcgLWwgfCBncmVwICJec3RhZy1saW5lcyIgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKwlnaXQtdGFnIC1uMCAtbCB8IGdyZXAgIl5zdGFnLWxpbmVzIiA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCWdpdC10YWcgLW4wIC1sIHN0YWctbGluZXMgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKworCWVjaG8gInN0YWctbGluZXMgICAgICBzdGFnIGxpbmUgb25lIiA+ZXhwZWN0ICYmCisJZ2l0LXRhZyAtbjEgLWwgfCBncmVwICJec3RhZy1saW5lcyIgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKwlnaXQtdGFnIC1uIC1sIHwgZ3JlcCAiXnN0YWctbGluZXMiID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisJZ2l0LXRhZyAtbjEgLWwgc3RhZy1saW5lcyA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisJZWNobyAiICAgIHN0YWcgbGluZSB0d28iID4+ZXhwZWN0ICYmCisJZ2l0LXRhZyAtbjIgLWwgfCBncmVwICJeICpzdGFnLmxpbmUiID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisJZ2l0LXRhZyAtbjIgLWwgc3RhZy1saW5lcyA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCisJZWNobyAiICAgIHN0YWcgbGluZSB0aHJlZSIgPj5leHBlY3QgJiYKKwlnaXQtdGFnIC1uMyAtbCB8IGdyZXAgIl4gKnN0YWcubGluZSIgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKwlnaXQtdGFnIC1uMyAtbCBzdGFnLWxpbmVzID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisJZ2l0LXRhZyAtbjQgLWwgfCBncmVwICJeICpzdGFnLmxpbmUiID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsICYmCisJZ2l0LXRhZyAtbjQgLWwgc3RhZy1saW5lcyA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCAmJgorCWdpdC10YWcgLW45OSAtbCB8IGdyZXAgIl4gKnN0YWcubGluZSIgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwgJiYKKwlnaXQtdGFnIC1uOTkgLWwgc3RhZy1saW5lcyA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorJworCisjIHRhZ3MgcG9pbnRpbmcgdG8gb2JqZWN0cyBkaWZmZXJlbnQgZnJvbSBjb21taXRzOgorCit0cmVlPSQoZ2l0IHJldi1wYXJzZSBIRUFEXnt0cmVlfSkKK2Jsb2I9JChnaXQgcmV2LXBhcnNlIEhFQUQ6Zm9vKQordGFnPSQoZ2l0IHJldi1wYXJzZSBzaWduZWQtdGFnKQorCitnZXRfdGFnX2hlYWRlciB0cmVlLXNpZ25lZC10YWcgJHRyZWUgdHJlZSAkdGltZSA+ZXhwZWN0CitlY2hvICJBIG1lc3NhZ2UgZm9yIGEgdHJlZSIgPj5leHBlY3QKK2VjaG8gJy0tLS0tQkVHSU4gUEdQIFNJR05BVFVSRS0tLS0tJyA+PmV4cGVjdAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NyZWF0aW5nIGEgc2lnbmVkIHRhZyBwb2ludGluZyB0byBhIHRyZWUgc2hvdWxkIHN1Y2NlZWQnICcKKwlnaXQtdGFnIC1zIC1tICJBIG1lc3NhZ2UgZm9yIGEgdHJlZSIgdHJlZS1zaWduZWQtdGFnIEhFQURee3RyZWV9ICYmCisJZ2V0X3RhZ19tc2cgdHJlZS1zaWduZWQtdGFnID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsCisnCisKK2dldF90YWdfaGVhZGVyIGJsb2Itc2lnbmVkLXRhZyAkYmxvYiBibG9iICR0aW1lID5leHBlY3QKK2VjaG8gIkEgbWVzc2FnZSBmb3IgYSBibG9iIiA+PmV4cGVjdAorZWNobyAnLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0nID4+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY3JlYXRpbmcgYSBzaWduZWQgdGFnIHBvaW50aW5nIHRvIGEgYmxvYiBzaG91bGQgc3VjY2VlZCcgJworCWdpdC10YWcgLXMgLW0gIkEgbWVzc2FnZSBmb3IgYSBibG9iIiBibG9iLXNpZ25lZC10YWcgSEVBRDpmb28gJiYKKwlnZXRfdGFnX21zZyBibG9iLXNpZ25lZC10YWcgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwKKycKKworZ2V0X3RhZ19oZWFkZXIgdGFnLXNpZ25lZC10YWcgJHRhZyB0YWcgJHRpbWUgPmV4cGVjdAorZWNobyAiQSBtZXNzYWdlIGZvciBhbm90aGVyIHRhZyIgPj5leHBlY3QKK2VjaG8gJy0tLS0tQkVHSU4gUEdQIFNJR05BVFVSRS0tLS0tJyA+PmV4cGVjdAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NyZWF0aW5nIGEgc2lnbmVkIHRhZyBwb2ludGluZyB0byBhbm90aGVyIHRhZyBzaG91bGQgc3VjY2VlZCcgJworCWdpdC10YWcgLXMgLW0gIkEgbWVzc2FnZSBmb3IgYW5vdGhlciB0YWciIHRhZy1zaWduZWQtdGFnIHNpZ25lZC10YWcgJiYKKwlnZXRfdGFnX21zZyB0YWctc2lnbmVkLXRhZyA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorJworCisjIHRyeSB0byBzaWduIHdpdGggYmFkIHVzZXIuc2lnbmluZ2tleQorZ2l0IGNvbmZpZyB1c2VyLnNpZ25pbmdrZXkgQm9iVGhlTW91c2UKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdnaXQtdGFnIC1zIGZhaWxzIGlmIGdwZyBpcyBtaXNjb25maWd1cmVkJyBcCisJJyEgZ2l0IHRhZyAtcyAtbSB0YWlsIHRhZy1ncGctZmFpbHVyZScKK2dpdCBjb25maWcgLS11bnNldCB1c2VyLnNpZ25pbmdrZXkKKworIyB0cnkgdG8gdmVyaWZ5IHdpdGhvdXQgZ3BnOgorCitybSAtcmYgZ3BnaG9tZQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ3ZlcmlmeSBzaWduZWQgdGFnIGZhaWxzIHdoZW4gcHVibGljIGtleSBpcyBub3QgcHJlc2VudCcgXAorCSchIGdpdC10YWcgLXYgc2lnbmVkLXRhZycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2dpdC10YWcgLWEgZmFpbHMgaWYgdGFnIGFubm90YXRpb24gaXMgZW1wdHknICcKKwkhIChHSVRfRURJVE9SPWNhdCBnaXQgdGFnIC1hIGluaXRpYWwtY29tbWVudCkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ21lc3NhZ2UgaW4gZWRpdG9yIGhhcyBpbml0aWFsIGNvbW1lbnQnICcKKwlHSVRfRURJVE9SPWNhdCBnaXQgdGFnIC1hIGluaXRpYWwtY29tbWVudCA+IGFjdHVhbAorCSMgY2hlY2sgdGhlIGZpcnN0IGxpbmUgLS0tIHNob3VsZCBiZSBlbXB0eQorCWZpcnN0PSQoc2VkIC1lIDFxIDxhY3R1YWwpICYmCisJdGVzdCAteiAiJGZpcnN0IiAmJgorCSMgcmVtb3ZlIGNvbW1lbnRlZCBsaW5lcyBmcm9tIHRoZSByZW1haW5kZXIgLS0gc2hvdWxkIGJlIGVtcHR5CisJcmVzdD0kKHNlZCAtZSAxZCAtZSAnL14jL2QnIDxhY3R1YWwpICYmCisJdGVzdCAteiAiJHJlc3QiCisnCisKK2dldF90YWdfaGVhZGVyIHJldXNlICRjb21taXQgY29tbWl0ICR0aW1lID5leHBlY3QKK2VjaG8gIkFuIGFubm90YXRpb24gdG8gYmUgcmV1c2VkIiA+PiBleHBlY3QKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdvdmVyd3JpdGluZyBhbiBhbm5vdGVkIHRhZyBzaG91bGQgdXNlIGl0cyBwcmV2aW91cyBib2R5JyAnCisJZ2l0IHRhZyAtYSAtbSAiQW4gYW5ub3RhdGlvbiB0byBiZSByZXVzZWQiIHJldXNlICYmCisJR0lUX0VESVRPUj10cnVlIGdpdCB0YWcgLWYgLWEgcmV1c2UgJiYKKwlnZXRfdGFnX21zZyByZXVzZSA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbAorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDcwMDQvcHVicmluZy5ncGcgYi90L3Q3MDA0L3B1YnJpbmcuZ3BnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzODU1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3MDA0L3B1YnJpbmcuZ3BnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3QvdDcwMDQvcmFuZG9tX3NlZWQgYi90L3Q3MDA0L3JhbmRvbV9zZWVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZWQxMzMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3MDA0L3JhbmRvbV9zZWVkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3QvdDcwMDQvc2VjcmluZy5ncGcgYi90L3Q3MDA0L3NlY3JpbmcuZ3BnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MzFjZDkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3MDA0L3NlY3JpbmcuZ3BnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3QvdDcwMDQvdHJ1c3RkYi5ncGcgYi90L3Q3MDA0L3RydXN0ZGIuZ3BnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYWNlOTYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3MDA0L3RydXN0ZGIuZ3BnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3QvdDcwMDUtZWRpdG9yLnNoIGIvdC90NzAwNS1lZGl0b3Iuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmQ5MTlkNgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDcwMDUtZWRpdG9yLnNoCkBAIC0wLDAgKzEsMTE3IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nR0lUX0VESVRPUiwgY29yZS5lZGl0b3IsIGFuZCBzdHVmZicKKworLiAuL3Rlc3QtbGliLnNoCisKK2ZvciBpIGluIEdJVF9FRElUT1IgY29yZV9lZGl0b3IgRURJVE9SIFZJU1VBTCB2aQorZG8KKwljYXQgPmUtJGkuc2ggPDwtRU9GCisJZWNobyAiRWRpdGVkIGJ5ICRpIiA+IlwkMSIKKwlFT0YKKwljaG1vZCAreCBlLSRpLnNoCitkb25lCit1bnNldCB2aQorbXYgZS12aS5zaCB2aQordW5zZXQgRURJVE9SIFZJU1VBTCBHSVRfRURJVE9SCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJbXNnPSJIYW5kIGVkaXRlZCIgJiYKKwllY2hvICIkbXNnIiA+ZXhwZWN0ICYmCisJZ2l0IGFkZCB2aSAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gIiRtc2ciICYmCisJZ2l0IHNob3cgLXMgLS1wcmV0dHk9b25lbGluZSB8CisJc2VkIC1lICJzL15bMC05YS1mXSogLy8iID5hY3R1YWwgJiYKKwlkaWZmIGFjdHVhbCBleHBlY3QKKworJworCitURVJNPWR1bWIKK2V4cG9ydCBURVJNCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdkdW1iIHNob3VsZCBlcnJvciBvdXQgd2hlbiBmYWxsaW5nIGJhY2sgb24gdmknICcKKworCWlmIGdpdCBjb21taXQgLS1hbWVuZAorCXRoZW4KKwkJZWNobyAiT29wcz8iCisJCWZhbHNlCisJZWxzZQorCQk6IGhhcHB5CisJZmkKKycKKworVEVSTT12dDEwMAorZXhwb3J0IFRFUk0KK2ZvciBpIGluIHZpIEVESVRPUiBWSVNVQUwgY29yZV9lZGl0b3IgR0lUX0VESVRPUgorZG8KKwllY2hvICJFZGl0ZWQgYnkgJGkiID5leHBlY3QKKwl1bnNldCBFRElUT1IgVklTVUFMIEdJVF9FRElUT1IKKwlnaXQgY29uZmlnIC0tdW5zZXQtYWxsIGNvcmUuZWRpdG9yCisJY2FzZSAiJGkiIGluCisJY29yZV9lZGl0b3IpCisJCWdpdCBjb25maWcgY29yZS5lZGl0b3IgLi9lLWNvcmVfZWRpdG9yLnNoCisJCTs7CisJW0EtWl0qKQorCQlldmFsICIkaT0uL2UtJGkuc2giCisJCWV4cG9ydCAkaQorCQk7OworCWVzYWMKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICJVc2luZyAkaSIgJworCQlnaXQgLS1leGVjLXBhdGg9LiBjb21taXQgLS1hbWVuZCAmJgorCQlnaXQgc2hvdyAtcyAtLXByZXR0eT1vbmVsaW5lIHwKKwkJc2VkIC1lICJzL15bMC05YS1mXSogLy8iID5hY3R1YWwgJiYKKwkJZGlmZiBhY3R1YWwgZXhwZWN0CisJJworZG9uZQorCit1bnNldCBFRElUT1IgVklTVUFMIEdJVF9FRElUT1IKK2dpdCBjb25maWcgLS11bnNldC1hbGwgY29yZS5lZGl0b3IKK2ZvciBpIGluIHZpIEVESVRPUiBWSVNVQUwgY29yZV9lZGl0b3IgR0lUX0VESVRPUgorZG8KKwllY2hvICJFZGl0ZWQgYnkgJGkiID5leHBlY3QKKwljYXNlICIkaSIgaW4KKwljb3JlX2VkaXRvcikKKwkJZ2l0IGNvbmZpZyBjb3JlLmVkaXRvciAuL2UtY29yZV9lZGl0b3Iuc2gKKwkJOzsKKwlbQS1aXSopCisJCWV2YWwgIiRpPS4vZS0kaS5zaCIKKwkJZXhwb3J0ICRpCisJCTs7CisJZXNhYworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgIlVzaW5nICRpIChvdmVycmlkZSkiICcKKwkJZ2l0IC0tZXhlYy1wYXRoPS4gY29tbWl0IC0tYW1lbmQgJiYKKwkJZ2l0IHNob3cgLXMgLS1wcmV0dHk9b25lbGluZSB8CisJCXNlZCAtZSAicy9eWzAtOWEtZl0qIC8vIiA+YWN0dWFsICYmCisJCWRpZmYgYWN0dWFsIGV4cGVjdAorCScKK2RvbmUKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZWRpdG9yIHdpdGggYSBzcGFjZScgJworCisJaWYgZWNobyAiZWNobyBzcGFjZSA+IFwiXCQxXCIiID4gImUgc3BhY2Uuc2giCisJdGhlbgorCQljaG1vZCBhK3ggImUgc3BhY2Uuc2giICYmCisJCUdJVF9FRElUT1I9Ii4vZVwgc3BhY2Uuc2giIGdpdCBjb21taXQgLS1hbWVuZCAmJgorCQl0ZXN0IHNwYWNlID0gIiQoZ2l0IHNob3cgLXMgLS1wcmV0dHk9Zm9ybWF0OiVzKSIKKwllbHNlCisJCXNheSAiU2tpcHBpbmc7IEZTIGRvZXMgbm90IHN1cHBvcnQgc3BhY2VzIGluIGZpbGVuYW1lcyIKKwlmaQorCisnCisKK3Vuc2V0IEdJVF9FRElUT1IKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvcmUuZWRpdG9yIHdpdGggYSBzcGFjZScgJworCisJaWYgdGVzdCAtZiAiZSBzcGFjZS5zaCIKKwl0aGVuCisJCWdpdCBjb25maWcgY29yZS5lZGl0b3IgXCIuL2VcIHNwYWNlLnNoXCIgJiYKKwkJZ2l0IGNvbW1pdCAtLWFtZW5kICYmCisJCXRlc3Qgc3BhY2UgPSAiJChnaXQgc2hvdyAtcyAtLXByZXR0eT1mb3JtYXQ6JXMpIgorCWVsc2UKKwkJc2F5ICJTa2lwcGluZzsgRlMgZG9lcyBub3Qgc3VwcG9ydCBzcGFjZXMgaW4gZmlsZW5hbWVzIgorCWZpCisKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q3MDEwLXNldHVwLnNoIGIvdC90NzAxMC1zZXR1cC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMmNmN2M1Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NzAxMC1zZXR1cC5zaApAQCAtMCwwICsxLDE2NSBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J3NldHVwIHRha2luZyBhbmQgc2FuaXRpemluZyBmdW5ueSBwYXRocycKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJbWtkaXIgLXAgYS9iL2MgYS9lICYmCisJRD0kKHB3ZCkgJiYKKwk+YS9iL2MvZCAmJgorCT5hL2UvZgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBhZGQgKGFic29sdXRlKScgJworCisJZ2l0IGFkZCAiJEQvYS9iL2MvZCIgJiYKKwlnaXQgbHMtZmlsZXMgPmN1cnJlbnQgJiYKKwllY2hvIGEvYi9jL2QgPmV4cGVjdCAmJgorCXRlc3RfY21wIGV4cGVjdCBjdXJyZW50CisKKycKKworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgYWRkIChmdW5ueSByZWxhdGl2ZSknICcKKworCXJtIC1mIC5naXQvaW5kZXggJiYKKwkoCisJCWNkIGEvYiAmJgorCQlnaXQgYWRkICIuLi9lLy4vZiIKKwkpICYmCisJZ2l0IGxzLWZpbGVzID5jdXJyZW50ICYmCisJZWNobyBhL2UvZiA+ZXhwZWN0ICYmCisJdGVzdF9jbXAgZXhwZWN0IGN1cnJlbnQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgcm0gKGFic29sdXRlKScgJworCisJcm0gLWYgLmdpdC9pbmRleCAmJgorCWdpdCBhZGQgYSAmJgorCWdpdCBybSAtZiAtLWNhY2hlZCAiJEQvYS9iL2MvZCIgJiYKKwlnaXQgbHMtZmlsZXMgPmN1cnJlbnQgJiYKKwllY2hvIGEvZS9mID5leHBlY3QgJiYKKwl0ZXN0X2NtcCBleHBlY3QgY3VycmVudAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBybSAoZnVubnkgcmVsYXRpdmUpJyAnCisKKwlybSAtZiAuZ2l0L2luZGV4ICYmCisJZ2l0IGFkZCBhICYmCisJKAorCQljZCBhL2IgJiYKKwkJZ2l0IHJtIC1mIC0tY2FjaGVkICIuLi9lLy4vZiIKKwkpICYmCisJZ2l0IGxzLWZpbGVzID5jdXJyZW50ICYmCisJZWNobyBhL2IvYy9kID5leHBlY3QgJiYKKwl0ZXN0X2NtcCBleHBlY3QgY3VycmVudAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBscy1maWxlcyAoYWJzb2x1dGUpJyAnCisKKwlybSAtZiAuZ2l0L2luZGV4ICYmCisJZ2l0IGFkZCBhICYmCisJZ2l0IGxzLWZpbGVzICIkRC9hL2UvLi4vYiIgPmN1cnJlbnQgJiYKKwllY2hvIGEvYi9jL2QgPmV4cGVjdCAmJgorCXRlc3RfY21wIGV4cGVjdCBjdXJyZW50CisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGxzLWZpbGVzIChyZWxhdGl2ZSAjMSknICcKKworCXJtIC1mIC5naXQvaW5kZXggJiYKKwlnaXQgYWRkIGEgJiYKKwkoCisJCWNkIGEvYiAmJgorCQlnaXQgbHMtZmlsZXMgIi4uL2IvYyIKKwkpICA+Y3VycmVudCAmJgorCWVjaG8gYy9kID5leHBlY3QgJiYKKwl0ZXN0X2NtcCBleHBlY3QgY3VycmVudAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBscy1maWxlcyAocmVsYXRpdmUgIzIpJyAnCisKKwlybSAtZiAuZ2l0L2luZGV4ICYmCisJZ2l0IGFkZCBhICYmCisJKAorCQljZCBhL2IgJiYKKwkJZ2l0IGxzLWZpbGVzIC0tZnVsbC1uYW1lICIuLi9lL2YiCisJKSAgPmN1cnJlbnQgJiYKKwllY2hvIGEvZS9mID5leHBlY3QgJiYKKwl0ZXN0X2NtcCBleHBlY3QgY3VycmVudAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBscy1maWxlcyAocmVsYXRpdmUgIzMpJyAnCisKKwlybSAtZiAuZ2l0L2luZGV4ICYmCisJZ2l0IGFkZCBhICYmCisJKAorCQljZCBhL2IgJiYKKwkJaWYgZ2l0IGxzLWZpbGVzICIuLi9lL2YiCisJCXRoZW4KKwkJCWVjaG8gR2FhaCwgc2hvdWxkIGhhdmUgZmFpbGVkCisJCQlleGl0IDEKKwkJZWxzZQorCQkJOiBoYXBweQorCQlmaQorCSkKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb21taXQgdXNpbmcgYWJzb2x1dGUgcGF0aCBuYW1lcycgJworCWdpdCBjb21taXQgLW0gImZvbyIgJiYKKwllY2hvIGFhID4+YS9iL2MvZCAmJgorCWdpdCBjb21taXQgLW0gImFhIiAiJChwd2QpL2EvYi9jL2QiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2xvZyB1c2luZyBhYnNvbHV0ZSBwYXRoIG5hbWVzJyAnCisJZWNobyBiYiA+PmEvYi9jL2QgJiYKKwlnaXQgY29tbWl0IC1tICJiYiIgJChwd2QpL2EvYi9jL2QgJiYKKworCWdpdCBsb2cgYS9iL2MvZCA+ZjEudHh0ICYmCisJZ2l0IGxvZyAiJChwd2QpL2EvYi9jL2QiID5mMi50eHQgJiYKKwl0ZXN0X2NtcCBmMS50eHQgZjIudHh0CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2JsYW1lIHVzaW5nIGFic29sdXRlIHBhdGggbmFtZXMnICcKKwlnaXQgYmxhbWUgYS9iL2MvZCA+ZjEudHh0ICYmCisJZ2l0IGJsYW1lICIkKHB3ZCkvYS9iL2MvZCIgPmYyLnR4dCAmJgorCXRlc3RfY21wIGYxLnR4dCBmMi50eHQKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgZGVlcGVyIHdvcmsgdHJlZScgJworCXRlc3RfY3JlYXRlX3JlcG8gdGVzdGVyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FkZCBhIGRpcmVjdG9yeSBvdXRzaWRlIHRoZSB3b3JrIHRyZWUnICcoCisJY2QgdGVzdGVyICYmCisJZDE9IiQoY2QgLi4gOyBwd2QpIiAmJgorCXRlc3RfbXVzdF9mYWlsIGdpdCBhZGQgIiRkMSIKKyknCisKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYWRkIGEgZmlsZSBvdXRzaWRlIHRoZSB3b3JrIHRyZWUsIG5hc3R5IGNhc2UgMScgJygKKwljZCB0ZXN0ZXIgJiYKKwlmPSIkKHB3ZCl4IiAmJgorCWVjaG8gIiRmIiAmJgorCXRvdWNoICIkZiIgJiYKKwl0ZXN0X211c3RfZmFpbCBnaXQgYWRkICIkZiIKKyknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FkZCBhIGZpbGUgb3V0c2lkZSB0aGUgd29yayB0cmVlLCBuYXN0eSBjYXNlIDInICcoCisJY2QgdGVzdGVyICYmCisJZj0iJChwd2QgfCBzZWQgInMvLiQvLyIpeCIgJiYKKwllY2hvICIkZiIgJiYKKwl0b3VjaCAiJGYiICYmCisJdGVzdF9tdXN0X2ZhaWwgZ2l0IGFkZCAiJGYiCispJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDcxMDEtcmVzZXQuc2ggYi90L3Q3MTAxLXJlc2V0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBkOTg3NGIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3MTAxLXJlc2V0LnNoCkBAIC0wLDAgKzEsNjMgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgU2hhd24gUGVhcmNlCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1yZXNldCBzaG91bGQgY3VsbCBlbXB0eSBzdWJkaXJzJworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjcmVhdGluZyBpbml0aWFsIGZpbGVzJyBcCisgICAgJ21rZGlyIHBhdGgwICYmCisgICAgIGNwIC4uLy4uL0NPUFlJTkcgcGF0aDAvQ09QWUlORyAmJgorICAgICBnaXQgYWRkIHBhdGgwL0NPUFlJTkcgJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSBhZGQgLWEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjcmVhdGluZyBzZWNvbmQgZmlsZXMnIFwKKyAgICAnbWtkaXIgcGF0aDEgJiYKKyAgICAgbWtkaXIgcGF0aDEvcGF0aDIgJiYKKyAgICAgY3AgLi4vLi4vQ09QWUlORyBwYXRoMS9wYXRoMi9DT1BZSU5HICYmCisgICAgIGNwIC4uLy4uL0NPUFlJTkcgcGF0aDEvQ09QWUlORyAmJgorICAgICBjcCAuLi8uLi9DT1BZSU5HIENPUFlJTkcgJiYKKyAgICAgY3AgLi4vLi4vQ09QWUlORyBwYXRoMC9DT1BZSU5HLVRPTyAmJgorICAgICBnaXQgYWRkIHBhdGgxL3BhdGgyL0NPUFlJTkcgJiYKKyAgICAgZ2l0IGFkZCBwYXRoMS9DT1BZSU5HICYmCisgICAgIGdpdCBhZGQgQ09QWUlORyAmJgorICAgICBnaXQgYWRkIHBhdGgwL0NPUFlJTkctVE9PICYmCisgICAgIGdpdC1jb21taXQgLW0gY2hhbmdlIC1hJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncmVzZXR0aW5nIHRyZWUgSEVBRF4nIFwKKyAgICAnZ2l0LXJlc2V0IC0taGFyZCBIRUFEXicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoZWNraW5nIGluaXRpYWwgZmlsZXMgZXhpc3QgYWZ0ZXIgcmV3aW5kJyBcCisgICAgJ3Rlc3QgLWQgcGF0aDAgJiYKKyAgICAgdGVzdCAtZiBwYXRoMC9DT1BZSU5HJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hlY2tpbmcgbGFjayBvZiBwYXRoMS9wYXRoMi9DT1BZSU5HJyBcCisgICAgJyEgdGVzdCAtZiBwYXRoMS9wYXRoMi9DT1BZSU5HJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hlY2tpbmcgbGFjayBvZiBwYXRoMS9DT1BZSU5HJyBcCisgICAgJyEgdGVzdCAtZiBwYXRoMS9DT1BZSU5HJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hlY2tpbmcgbGFjayBvZiBDT1BZSU5HJyBcCisgICAgJyEgdGVzdCAtZiBDT1BZSU5HJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hlY2tpbmcgY2hlY2tpbmcgbGFjayBvZiBwYXRoMS9DT1BZSU5HLVRPTycgXAorICAgICchIHRlc3QgLWYgcGF0aDAvQ09QWUlORy1UT08nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGVja2luZyBsYWNrIG9mIHBhdGgxL3BhdGgyJyBcCisgICAgJyEgdGVzdCAtZCBwYXRoMS9wYXRoMicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoZWNraW5nIGxhY2sgb2YgcGF0aDEnIFwKKyAgICAnISB0ZXN0IC1kIHBhdGgxJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDcxMDItcmVzZXQuc2ggYi90L3Q3MTAyLXJlc2V0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU1YzlmMzAKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3MTAyLXJlc2V0LnNoCkBAIC0wLDAgKzEsNDMxIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3IENhcmxvcyBSaWNhCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1yZXNldAorCitEb2N1bWVudGVkIHRlc3RzIGZvciBnaXQtcmVzZXQnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjcmVhdGluZyBpbml0aWFsIGZpbGVzIGFuZCBjb21taXRzJyAnCisJdGVzdF90aWNrICYmCisJZWNobyAiMXN0IGZpbGUiID5maXJzdCAmJgorCWdpdCBhZGQgZmlyc3QgJiYKKwlnaXQgY29tbWl0IC1tICJjcmVhdGUgMXN0IGZpbGUiICYmCisKKwllY2hvICIybmQgZmlsZSIgPnNlY29uZCAmJgorCWdpdCBhZGQgc2Vjb25kICYmCisJZ2l0IGNvbW1pdCAtbSAiY3JlYXRlIDJuZCBmaWxlIiAmJgorCisJZWNobyAiMm5kIGxpbmUgMXN0IGZpbGUiID4+Zmlyc3QgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJtb2RpZnkgMXN0IGZpbGUiICYmCisKKwlnaXQgcm0gZmlyc3QgJiYKKwlnaXQgbXYgc2Vjb25kIHNlY29uZGZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJyZW1vdmUgMXN0IGFuZCByZW5hbWUgMm5kIiAmJgorCisJZWNobyAiMXN0IGxpbmUgMm5kIGZpbGUiID5zZWNvbmRmaWxlICYmCisJZWNobyAiMm5kIGxpbmUgMm5kIGZpbGUiID4+c2Vjb25kZmlsZSAmJgorCWdpdCBjb21taXQgLWEgLW0gIm1vZGlmeSAybmQgZmlsZSIKKycKKyMgZ2l0IGxvZyAtLXByZXR0eT1vbmVsaW5lICMgdG8gc2VlIHRob3NlIFNIQTEgaW52b2x2ZWQKKworY2hlY2tfY2hhbmdlcyAoKSB7CisJdGVzdCAiJChnaXQgcmV2LXBhcnNlIEhFQUQpIiA9ICIkMSIgJiYKKwlnaXQgZGlmZiB8IGdpdCBkaWZmIC5kaWZmX2V4cGVjdCAtICYmCisJZ2l0IGRpZmYgLS1jYWNoZWQgfCBnaXQgZGlmZiAuY2FjaGVkX2V4cGVjdCAtICYmCisJZm9yIEZJTEUgaW4gKgorCWRvCisJCWVjaG8gJEZJTEUnOicKKwkJY2F0ICRGSUxFIHx8IHJldHVybgorCWRvbmUgfCBnaXQgZGlmZiAuY2F0X2V4cGVjdCAtCit9CisKKz4uZGlmZl9leHBlY3QKKz4uY2FjaGVkX2V4cGVjdAorY2F0ID4uY2F0X2V4cGVjdCA8PEVPRgorc2Vjb25kZmlsZToKKzFzdCBsaW5lIDJuZCBmaWxlCisybmQgbGluZSAybmQgZmlsZQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdmluZyBhIG5vbiBleGlzdGluZyByZXZpc2lvbiBzaG91bGQgZmFpbCcgJworCSEgZ2l0IHJlc2V0IGFhYWFhYSAmJgorCSEgZ2l0IHJlc2V0IC0tbWl4ZWQgYWFhYWFhICYmCisJISBnaXQgcmVzZXQgLS1zb2Z0IGFhYWFhYSAmJgorCSEgZ2l0IHJlc2V0IC0taGFyZCBhYWFhYWEgJiYKKwljaGVja19jaGFuZ2VzIDNlYzM5NjUxZTdmNDRlYTUzMWE1ZGUxOGE5ZmE3OTFjMGZkMzcwZmMKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVzZXQgLS1zb2Z0IHdpdGggdW5tZXJnZWQgaW5kZXggc2hvdWxkIGZhaWwnICcKKwl0b3VjaCAuZ2l0L01FUkdFX0hFQUQgJiYKKwllY2hvICIxMDA2NDQgNDRjNWI1ODg0NTUwYzE3NzU4NzM3ZWRjY2VkNDYzNDQ3YjkxZDQyYiAxCXVuIiB8CisJCWdpdCB1cGRhdGUtaW5kZXggLS1pbmRleC1pbmZvICYmCisJISBnaXQgcmVzZXQgLS1zb2Z0IEhFQUQgJiYKKwlybSAuZ2l0L01FUkdFX0hFQUQgJiYKKwlnaXQgcm0gLS1jYWNoZWQgLS0gdW4KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2dpdmluZyBwYXRocyB3aXRoIG9wdGlvbnMgZGlmZmVyZW50IHRoYW4gLS1taXhlZCBzaG91bGQgZmFpbCcgJworCSEgZ2l0IHJlc2V0IC0tc29mdCAtLSBmaXJzdCAmJgorCSEgZ2l0IHJlc2V0IC0taGFyZCAtLSBmaXJzdCAmJgorCSEgZ2l0IHJlc2V0IC0tc29mdCBIRUFEXiAtLSBmaXJzdCAmJgorCSEgZ2l0IHJlc2V0IC0taGFyZCBIRUFEXiAtLSBmaXJzdCAmJgorCWNoZWNrX2NoYW5nZXMgM2VjMzk2NTFlN2Y0NGVhNTMxYTVkZTE4YTlmYTc5MWMwZmQzNzBmYworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXZpbmcgdW5yZWNvZ25pemVkIG9wdGlvbnMgc2hvdWxkIGZhaWwnICcKKwkhIGdpdCByZXNldCAtLW90aGVyICYmCisJISBnaXQgcmVzZXQgLW8gJiYKKwkhIGdpdCByZXNldCAtLW1peGVkIC0tb3RoZXIgJiYKKwkhIGdpdCByZXNldCAtLW1peGVkIC1vICYmCisJISBnaXQgcmVzZXQgLS1zb2Z0IC0tb3RoZXIgJiYKKwkhIGdpdCByZXNldCAtLXNvZnQgLW8gJiYKKwkhIGdpdCByZXNldCAtLWhhcmQgLS1vdGhlciAmJgorCSEgZ2l0IHJlc2V0IC0taGFyZCAtbyAmJgorCWNoZWNrX2NoYW5nZXMgM2VjMzk2NTFlN2Y0NGVhNTMxYTVkZTE4YTlmYTc5MWMwZmQzNzBmYworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkndHJ5aW5nIHRvIGRvIHJlc2V0IC0tc29mdCB3aXRoIHBlbmRpbmcgbWVyZ2Ugc2hvdWxkIGZhaWwnICcKKwlnaXQgYnJhbmNoIGJyYW5jaDEgJiYKKwlnaXQgYnJhbmNoIGJyYW5jaDIgJiYKKworCWdpdCBjaGVja291dCBicmFuY2gxICYmCisJZWNobyAiM3JkIGxpbmUgaW4gYnJhbmNoMSIgPj5zZWNvbmRmaWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAiY2hhbmdlIGluIGJyYW5jaDEiICYmCisKKwlnaXQgY2hlY2tvdXQgYnJhbmNoMiAmJgorCWVjaG8gIjNyZCBsaW5lIGluIGJyYW5jaDIiID4+c2Vjb25kZmlsZSAmJgorCWdpdCBjb21taXQgLWEgLW0gImNoYW5nZSBpbiBicmFuY2gyIiAmJgorCisJISBnaXQgbWVyZ2UgYnJhbmNoMSAmJgorCSEgZ2l0IHJlc2V0IC0tc29mdCAmJgorCisJcHJpbnRmICIxc3QgbGluZSAybmQgZmlsZVxuMm5kIGxpbmUgMm5kIGZpbGVcbjNyZCBsaW5lIiA+c2Vjb25kZmlsZSAmJgorCWdpdCBjb21taXQgLWEgLW0gInRoZSBjaGFuZ2UgaW4gYnJhbmNoMiIgJiYKKworCWdpdCBjaGVja291dCBtYXN0ZXIgJiYKKwlnaXQgYnJhbmNoIC1EIGJyYW5jaDEgYnJhbmNoMiAmJgorCWNoZWNrX2NoYW5nZXMgM2VjMzk2NTFlN2Y0NGVhNTMxYTVkZTE4YTlmYTc5MWMwZmQzNzBmYworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkndHJ5aW5nIHRvIGRvIHJlc2V0IC0tc29mdCB3aXRoIHBlbmRpbmcgY2hlY2tvdXQgbWVyZ2Ugc2hvdWxkIGZhaWwnICcKKwlnaXQgYnJhbmNoIGJyYW5jaDMgJiYKKwlnaXQgYnJhbmNoIGJyYW5jaDQgJiYKKworCWdpdCBjaGVja291dCBicmFuY2gzICYmCisJZWNobyAiM3JkIGxpbmUgaW4gYnJhbmNoMyIgPj5zZWNvbmRmaWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAibGluZSBpbiBicmFuY2gzIiAmJgorCisJZ2l0IGNoZWNrb3V0IGJyYW5jaDQgJiYKKwllY2hvICIzcmQgbGluZSBpbiBicmFuY2g0IiA+PnNlY29uZGZpbGUgJiYKKworCWdpdCBjaGVja291dCAtbSBicmFuY2gzICYmCisJISBnaXQgcmVzZXQgLS1zb2Z0ICYmCisKKwlwcmludGYgIjFzdCBsaW5lIDJuZCBmaWxlXG4ybmQgbGluZSAybmQgZmlsZVxuM3JkIGxpbmUiID5zZWNvbmRmaWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAidGhlIGxpbmUgaW4gYnJhbmNoMyIgJiYKKworCWdpdCBjaGVja291dCBtYXN0ZXIgJiYKKwlnaXQgYnJhbmNoIC1EIGJyYW5jaDMgYnJhbmNoNCAmJgorCWNoZWNrX2NoYW5nZXMgM2VjMzk2NTFlN2Y0NGVhNTMxYTVkZTE4YTlmYTc5MWMwZmQzNzBmYworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkncmVzZXR0aW5nIHRvIEhFQUQgd2l0aCBubyBjaGFuZ2VzIHNob3VsZCBzdWNjZWVkIGFuZCBkbyBub3RoaW5nJyAnCisJZ2l0IHJlc2V0IC0taGFyZCAmJgorCQljaGVja19jaGFuZ2VzIDNlYzM5NjUxZTdmNDRlYTUzMWE1ZGUxOGE5ZmE3OTFjMGZkMzcwZmMKKwlnaXQgcmVzZXQgLS1oYXJkIEhFQUQgJiYKKwkJY2hlY2tfY2hhbmdlcyAzZWMzOTY1MWU3ZjQ0ZWE1MzFhNWRlMThhOWZhNzkxYzBmZDM3MGZjCisJZ2l0IHJlc2V0IC0tc29mdCAmJgorCQljaGVja19jaGFuZ2VzIDNlYzM5NjUxZTdmNDRlYTUzMWE1ZGUxOGE5ZmE3OTFjMGZkMzcwZmMKKwlnaXQgcmVzZXQgLS1zb2Z0IEhFQUQgJiYKKwkJY2hlY2tfY2hhbmdlcyAzZWMzOTY1MWU3ZjQ0ZWE1MzFhNWRlMThhOWZhNzkxYzBmZDM3MGZjCisJZ2l0IHJlc2V0IC0tbWl4ZWQgJiYKKwkJY2hlY2tfY2hhbmdlcyAzZWMzOTY1MWU3ZjQ0ZWE1MzFhNWRlMThhOWZhNzkxYzBmZDM3MGZjCisJZ2l0IHJlc2V0IC0tbWl4ZWQgSEVBRCAmJgorCQljaGVja19jaGFuZ2VzIDNlYzM5NjUxZTdmNDRlYTUzMWE1ZGUxOGE5ZmE3OTFjMGZkMzcwZmMKKwlnaXQgcmVzZXQgJiYKKwkJY2hlY2tfY2hhbmdlcyAzZWMzOTY1MWU3ZjQ0ZWE1MzFhNWRlMThhOWZhNzkxYzBmZDM3MGZjCisJZ2l0IHJlc2V0IEhFQUQgJiYKKwkJY2hlY2tfY2hhbmdlcyAzZWMzOTY1MWU3ZjQ0ZWE1MzFhNWRlMThhOWZhNzkxYzBmZDM3MGZjCisnCisKKz4uZGlmZl9leHBlY3QKK2NhdCA+LmNhY2hlZF9leHBlY3QgPDxFT0YKK2RpZmYgLS1naXQgYS9zZWNvbmRmaWxlIGIvc2Vjb25kZmlsZQoraW5kZXggMWJiYmE3OS4uNDRjNWI1OCAxMDA2NDQKKy0tLSBhL3NlY29uZGZpbGUKKysrKyBiL3NlY29uZGZpbGUKK0BAIC0xICsxLDIgQEAKKy0ybmQgZmlsZQorKzFzdCBsaW5lIDJuZCBmaWxlCisrMm5kIGxpbmUgMm5kIGZpbGUKK0VPRgorY2F0ID4uY2F0X2V4cGVjdCA8PEVPRgorc2Vjb25kZmlsZToKKzFzdCBsaW5lIDJuZCBmaWxlCisybmQgbGluZSAybmQgZmlsZQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctLXNvZnQgcmVzZXQgb25seSBzaG91bGQgc2hvdyBjaGFuZ2VzIGluIGRpZmYgLS1jYWNoZWQnICcKKwlnaXQgcmVzZXQgLS1zb2Z0IEhFQUReICYmCisJY2hlY2tfY2hhbmdlcyBkMWE0YmMzYWJjZTQ4Mjk2MjhhZTJkY2IwZDYwZWYzZDFhNzhiMWM0ICYmCisJdGVzdCAiJChnaXQgcmV2LXBhcnNlIE9SSUdfSEVBRCkiID0gXAorCQkJM2VjMzk2NTFlN2Y0NGVhNTMxYTVkZTE4YTlmYTc5MWMwZmQzNzBmYworJworCis+LmRpZmZfZXhwZWN0Cis+LmNhY2hlZF9leHBlY3QKK2NhdCA+LmNhdF9leHBlY3QgPDxFT0YKK3NlY29uZGZpbGU6Cisxc3QgbGluZSAybmQgZmlsZQorMm5kIGxpbmUgMm5kIGZpbGUKKzNyZCBsaW5lIDJuZCBmaWxlCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdjaGFuZ2luZyBmaWxlcyBhbmQgcmVkbyB0aGUgbGFzdCBjb21taXQgc2hvdWxkIHN1Y2NlZWQnICcKKwllY2hvICIzcmQgbGluZSAybmQgZmlsZSIgPj5zZWNvbmRmaWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtQyBPUklHX0hFQUQgJiYKKwljaGVja19jaGFuZ2VzIDNkM2I3YmUwMTFhNThjYTBjMTc5YWU0NWQ5NGU2YzgzYzBiMGNkMGQgJiYKKwl0ZXN0ICIkKGdpdCByZXYtcGFyc2UgT1JJR19IRUFEKSIgPSBcCisJCQkzZWMzOTY1MWU3ZjQ0ZWE1MzFhNWRlMThhOWZhNzkxYzBmZDM3MGZjCisnCisKKz4uZGlmZl9leHBlY3QKKz4uY2FjaGVkX2V4cGVjdAorY2F0ID4uY2F0X2V4cGVjdCA8PEVPRgorZmlyc3Q6Cisxc3QgZmlsZQorMm5kIGxpbmUgMXN0IGZpbGUKK3NlY29uZDoKKzJuZCBmaWxlCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSctLWhhcmQgcmVzZXQgc2hvdWxkIGNoYW5nZSB0aGUgZmlsZXMgYW5kIHVuZG8gY29tbWl0cyBwZXJtYW5lbnRseScgJworCWdpdCByZXNldCAtLWhhcmQgSEVBRH4yICYmCisJY2hlY2tfY2hhbmdlcyBkZGFlZmUwMGYxZGExNjg2NDU5MWM2MWZkYzdhZGI1ZDdjZDZiNzRlICYmCisJdGVzdCAiJChnaXQgcmV2LXBhcnNlIE9SSUdfSEVBRCkiID0gXAorCQkJM2QzYjdiZTAxMWE1OGNhMGMxNzlhZTQ1ZDk0ZTZjODNjMGIwY2QwZAorJworCis+LmRpZmZfZXhwZWN0CitjYXQgPi5jYWNoZWRfZXhwZWN0IDw8RU9GCitkaWZmIC0tZ2l0IGEvZmlyc3QgYi9maXJzdAorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCA4MjA2YzIyLi4wMDAwMDAwCistLS0gYS9maXJzdAorKysrIC9kZXYvbnVsbAorQEAgLTEsMiArMCwwIEBACistMXN0IGZpbGUKKy0ybmQgbGluZSAxc3QgZmlsZQorZGlmZiAtLWdpdCBhL3NlY29uZCBiL3NlY29uZAorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAxYmJiYTc5Li4wMDAwMDAwCistLS0gYS9zZWNvbmQKKysrKyAvZGV2L251bGwKK0BAIC0xICswLDAgQEAKKy0ybmQgZmlsZQorZGlmZiAtLWdpdCBhL3NlY29uZGZpbGUgYi9zZWNvbmRmaWxlCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNDRjNWI1OAorLS0tIC9kZXYvbnVsbAorKysrIGIvc2Vjb25kZmlsZQorQEAgLTAsMCArMSwyIEBACisrMXN0IGxpbmUgMm5kIGZpbGUKKysybmQgbGluZSAybmQgZmlsZQorRU9GCitjYXQgPi5jYXRfZXhwZWN0IDw8RU9GCitzZWNvbmRmaWxlOgorMXN0IGxpbmUgMm5kIGZpbGUKKzJuZCBsaW5lIDJuZCBmaWxlCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdyZWRvaW5nIGNoYW5nZXMgYWRkaW5nIHRoZW0gd2l0aG91dCBjb21taXQgdGhlbSBzaG91bGQgc3VjY2VlZCcgJworCWdpdCBybSBmaXJzdCAmJgorCWdpdCBtdiBzZWNvbmQgc2Vjb25kZmlsZSAmJgorCisJZWNobyAiMXN0IGxpbmUgMm5kIGZpbGUiID5zZWNvbmRmaWxlICYmCisJZWNobyAiMm5kIGxpbmUgMm5kIGZpbGUiID4+c2Vjb25kZmlsZSAmJgorCWdpdCBhZGQgc2Vjb25kZmlsZSAmJgorCWNoZWNrX2NoYW5nZXMgZGRhZWZlMDBmMWRhMTY4NjQ1OTFjNjFmZGM3YWRiNWQ3Y2Q2Yjc0ZQorJworCitjYXQgPi5kaWZmX2V4cGVjdCA8PEVPRgorZGlmZiAtLWdpdCBhL2ZpcnN0IGIvZmlyc3QKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggODIwNmMyMi4uMDAwMDAwMAorLS0tIGEvZmlyc3QKKysrKyAvZGV2L251bGwKK0BAIC0xLDIgKzAsMCBAQAorLTFzdCBmaWxlCistMm5kIGxpbmUgMXN0IGZpbGUKK2RpZmYgLS1naXQgYS9zZWNvbmQgYi9zZWNvbmQKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMWJiYmE3OS4uMDAwMDAwMAorLS0tIGEvc2Vjb25kCisrKysgL2Rldi9udWxsCitAQCAtMSArMCwwIEBACistMm5kIGZpbGUKK0VPRgorPi5jYWNoZWRfZXhwZWN0CitjYXQgPi5jYXRfZXhwZWN0IDw8RU9GCitzZWNvbmRmaWxlOgorMXN0IGxpbmUgMm5kIGZpbGUKKzJuZCBsaW5lIDJuZCBmaWxlCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy0tbWl4ZWQgcmVzZXQgdG8gSEVBRCBzaG91bGQgdW5hZGQgdGhlIGZpbGVzJyAnCisJZ2l0IHJlc2V0ICYmCisJY2hlY2tfY2hhbmdlcyBkZGFlZmUwMGYxZGExNjg2NDU5MWM2MWZkYzdhZGI1ZDdjZDZiNzRlICYmCisJdGVzdCAiJChnaXQgcmV2LXBhcnNlIE9SSUdfSEVBRCkiID0gXAorCQkJZGRhZWZlMDBmMWRhMTY4NjQ1OTFjNjFmZGM3YWRiNWQ3Y2Q2Yjc0ZQorJworCis+LmRpZmZfZXhwZWN0Cis+LmNhY2hlZF9leHBlY3QKK2NhdCA+LmNhdF9leHBlY3QgPDxFT0YKK3NlY29uZGZpbGU6Cisxc3QgbGluZSAybmQgZmlsZQorMm5kIGxpbmUgMm5kIGZpbGUKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVkb2luZyB0aGUgbGFzdCB0d28gY29tbWl0cyBzaG91bGQgc3VjY2VlZCcgJworCWdpdCBhZGQgc2Vjb25kZmlsZSAmJgorCWdpdCByZXNldCAtLWhhcmQgZGRhZWZlMDBmMWRhMTY4NjQ1OTFjNjFmZGM3YWRiNWQ3Y2Q2Yjc0ZSAmJgorCisJZ2l0IHJtIGZpcnN0ICYmCisJZ2l0IG12IHNlY29uZCBzZWNvbmRmaWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAicmVtb3ZlIDFzdCBhbmQgcmVuYW1lIDJuZCIgJiYKKworCWVjaG8gIjFzdCBsaW5lIDJuZCBmaWxlIiA+c2Vjb25kZmlsZSAmJgorCWVjaG8gIjJuZCBsaW5lIDJuZCBmaWxlIiA+PnNlY29uZGZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJtb2RpZnkgMm5kIGZpbGUiICYmCisJY2hlY2tfY2hhbmdlcyAzZWMzOTY1MWU3ZjQ0ZWE1MzFhNWRlMThhOWZhNzkxYzBmZDM3MGZjCisnCisKKz4uZGlmZl9leHBlY3QKKz4uY2FjaGVkX2V4cGVjdAorY2F0ID4uY2F0X2V4cGVjdCA8PEVPRgorc2Vjb25kZmlsZToKKzFzdCBsaW5lIDJuZCBmaWxlCisybmQgbGluZSAybmQgZmlsZQorM3JkIGxpbmUgaW4gYnJhbmNoMgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctLWhhcmQgcmVzZXQgdG8gSEVBRCBzaG91bGQgY2xlYXIgYSBmYWlsZWQgbWVyZ2UnICcKKwlnaXQgYnJhbmNoIGJyYW5jaDEgJiYKKwlnaXQgYnJhbmNoIGJyYW5jaDIgJiYKKworCWdpdCBjaGVja291dCBicmFuY2gxICYmCisJZWNobyAiM3JkIGxpbmUgaW4gYnJhbmNoMSIgPj5zZWNvbmRmaWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAiY2hhbmdlIGluIGJyYW5jaDEiICYmCisKKwlnaXQgY2hlY2tvdXQgYnJhbmNoMiAmJgorCWVjaG8gIjNyZCBsaW5lIGluIGJyYW5jaDIiID4+c2Vjb25kZmlsZSAmJgorCWdpdCBjb21taXQgLWEgLW0gImNoYW5nZSBpbiBicmFuY2gyIiAmJgorCisJISBnaXQgcHVsbCAuIGJyYW5jaDEgJiYKKwlnaXQgcmVzZXQgLS1oYXJkICYmCisJY2hlY2tfY2hhbmdlcyA3N2FiYjMzNzA3M2ZiNDM2OWE3YWQ2OWZmNmY1ZWMwZTRkNmI1NGJiCisnCisKKz4uZGlmZl9leHBlY3QKKz4uY2FjaGVkX2V4cGVjdAorY2F0ID4uY2F0X2V4cGVjdCA8PEVPRgorc2Vjb25kZmlsZToKKzFzdCBsaW5lIDJuZCBmaWxlCisybmQgbGluZSAybmQgZmlsZQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknLS1oYXJkIHJlc2V0IHRvIE9SSUdfSEVBRCBzaG91bGQgY2xlYXIgYSBmYXN0LWZvcndhcmQgbWVyZ2UnICcKKwlnaXQgcmVzZXQgLS1oYXJkIEhFQUReICYmCisJY2hlY2tfY2hhbmdlcyAzZWMzOTY1MWU3ZjQ0ZWE1MzFhNWRlMThhOWZhNzkxYzBmZDM3MGZjICYmCisKKwlnaXQgcHVsbCAuIGJyYW5jaDEgJiYKKwlnaXQgcmVzZXQgLS1oYXJkIE9SSUdfSEVBRCAmJgorCWNoZWNrX2NoYW5nZXMgM2VjMzk2NTFlN2Y0NGVhNTMxYTVkZTE4YTlmYTc5MWMwZmQzNzBmYyAmJgorCisJZ2l0IGNoZWNrb3V0IG1hc3RlciAmJgorCWdpdCBicmFuY2ggLUQgYnJhbmNoMSBicmFuY2gyICYmCisJY2hlY2tfY2hhbmdlcyAzZWMzOTY1MWU3ZjQ0ZWE1MzFhNWRlMThhOWZhNzkxYzBmZDM3MGZjCisnCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCitpbmRleCBkMDA0OTFmLi43ZWQ2ZmY4IDEwMDY0NAorLS0tIGEvZmlsZTEKKysrKyBiL2ZpbGUxCitAQCAtMSArMSBAQAorLTEKKys1CitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwY2ZiZjA4Li4wMDAwMDAwCistLS0gYS9maWxlMgorKysrIC9kZXYvbnVsbAorQEAgLTEgKzAsMCBAQAorLTIKK0VPRgorY2F0ID4gY2FjaGVkX2V4cGVjdCA8PCBFT0YKK2RpZmYgLS1naXQgYS9maWxlNCBiL2ZpbGU0CituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjg2MjZjNAorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTQKK0BAIC0wLDAgKzEgQEAKKys0CitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Rlc3QgLS1taXhlZCA8cGF0aHM+JyAnCisJZWNobyAxID4gZmlsZTEgJiYKKwllY2hvIDIgPiBmaWxlMiAmJgorCWdpdCBhZGQgZmlsZTEgZmlsZTIgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIGZpbGVzICYmCisJZ2l0IHJtIGZpbGUyICYmCisJZWNobyAzID4gZmlsZTMgJiYKKwllY2hvIDQgPiBmaWxlNCAmJgorCWVjaG8gNSA+IGZpbGUxICYmCisJZ2l0IGFkZCBmaWxlMSBmaWxlMyBmaWxlNCAmJgorCSEgZ2l0IHJlc2V0IEhFQUQgLS0gZmlsZTEgZmlsZTIgZmlsZTMgJiYKKwlnaXQgZGlmZiA+IG91dHB1dCAmJgorCWdpdCBkaWZmIG91dHB1dCBleHBlY3QgJiYKKwlnaXQgZGlmZiAtLWNhY2hlZCA+IG91dHB1dCAmJgorCWdpdCBkaWZmIG91dHB1dCBjYWNoZWRfZXhwZWN0CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Rlc3QgcmVzZXR0aW5nIHRoZSBpbmRleCBhdCBnaXZlIHBhdGhzJyAnCisKKwlta2RpciBzdWIgJiYKKwk+c3ViL2ZpbGUxICYmCisJPnN1Yi9maWxlMiAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgc3ViL2ZpbGUxIHN1Yi9maWxlMiAmJgorCVQ9JChnaXQgd3JpdGUtdHJlZSkgJiYKKwkhIGdpdCByZXNldCBIRUFEIHN1Yi9maWxlMiAmJgorCVU9JChnaXQgd3JpdGUtdHJlZSkgJiYKKwllY2hvICIkVCIgJiYKKwllY2hvICIkVSIgJiYKKwkhIGdpdCBkaWZmLWluZGV4IC0tY2FjaGVkIC0tZXhpdC1jb2RlICIkVCIgJiYKKwl0ZXN0ICIkVCIgIT0gIiRVIgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Jlc2V0dGluZyBhbiB1bm1vZGlmaWVkIHBhdGggaXMgYSBuby1vcCcgJworCWdpdCByZXNldCAtLWhhcmQgJiYKKwlnaXQgcmVzZXQgLS0gZmlsZTEgJiYKKwlnaXQgZGlmZi1maWxlcyAtLWV4aXQtY29kZSAmJgorCWdpdCBkaWZmLWluZGV4IC0tY2FjaGVkIC0tZXhpdC1jb2RlIEhFQUQKKycKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorZmlsZTI6IG5lZWRzIHVwZGF0ZQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy0tbWl4ZWQgcmVmcmVzaGVzIHRoZSBpbmRleCcgJworCWVjaG8gMTIzID4+IGZpbGUyICYmCisJZ2l0IHJlc2V0IC0tbWl4ZWQgSEVBRCA+IG91dHB1dCAmJgorCWdpdCBkaWZmIC0tZXhpdC1jb2RlIGV4cGVjdCBvdXRwdXQKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q3MTAzLXJlc2V0LWJhcmUuc2ggYi90L3Q3MTAzLXJlc2V0LWJhcmUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjI1YTc3ZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDcxMDMtcmVzZXQtYmFyZS5zaApAQCAtMCwwICsxLDI4IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LXJlc2V0IGluIGEgYmFyZSByZXBvc2l0b3J5JworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NldHVwIG5vbi1iYXJlJyAnCisJZWNobyBvbmUgPmZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwlnaXQgY29tbWl0IC1tIG9uZSAmJgorCWVjaG8gdHdvID5maWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSB0d28KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgYmFyZScgJworCWdpdCBjbG9uZSAtLWJhcmUgLiBiYXJlLmdpdCAmJgorCWNkIGJhcmUuZ2l0CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2hhcmQgcmVzZXQgaXMgbm90IGFsbG93ZWQnICcKKwkhIGdpdCByZXNldCAtLWhhcmQgSEVBRF4KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc29mdCByZXNldCBpcyBhbGxvd2VkJyAnCisJZ2l0IHJlc2V0IC0tc29mdCBIRUFEXiAmJgorCXRlc3QgImBnaXQgc2hvdyAtLXByZXR0eT1mb3JtYXQ6JXMgfCBoZWFkIC1uIDFgIiA9ICJvbmUiCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NzEwNC1yZXNldC5zaCBiL3QvdDcxMDQtcmVzZXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjEzNmVlNwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDcxMDQtcmVzZXQuc2gKQEAgLTAsMCArMSw0NiBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J3Jlc2V0IC0taGFyZCB1bm1lcmdlZCcKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCisJbWtkaXIgYmVmb3JlIGxhdGVyICYmCisJPmJlZm9yZS8xICYmCisJPmJlZm9yZS8yICYmCisJPmhlbGxvICYmCisJPmxhdGVyLzMgJiYKKwlnaXQgYWRkIGJlZm9yZSBoZWxsbyBsYXRlciAmJgorCWdpdCBjb21taXQgLW0gd29ybGQgJiYKKworCUg9JChnaXQgcmV2LXBhcnNlIDpoZWxsbykgJiYKKwlnaXQgcm0gLS1jYWNoZWQgaGVsbG8gJiYKKwllY2hvICIxMDA2NDQgJEggMgloZWxsbyIgfCBnaXQgdXBkYXRlLWluZGV4IC0taW5kZXgtaW5mbyAmJgorCisJcm0gLWYgaGVsbG8gJiYKKwlta2RpciAtcCBoZWxsbyAmJgorCT5oZWxsby93b3JsZCAmJgorCXRlc3QgIiQoZ2l0IGxzLWZpbGVzIC1vKSIgPSBoZWxsby93b3JsZAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Jlc2V0IC0taGFyZCBzaG91bGQgcmVzdG9yZSB1bm1lcmdlZCBvbmVzJyAnCisKKwlnaXQgcmVzZXQgLS1oYXJkICYmCisJZ2l0IGxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCBiZWZvcmUvMSBiZWZvcmUvMiBoZWxsbyBsYXRlci8zICYmCisJdGVzdCAtZiBoZWxsbworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Jlc2V0IC0taGFyZCBkaWQgbm90IGNvcnJ1cHQgaW5kZXggbm9yIGNhY2hlZC10cmVlJyAnCisKKwlUPSQoZ2l0IHdyaXRlLXRyZWUpICYmCisJcm0gLWYgLmdpdC9pbmRleCAmJgorCWdpdCBhZGQgYmVmb3JlIGhlbGxvIGxhdGVyICYmCisJVT0kKGdpdCB3cml0ZS10cmVlKSAmJgorCXRlc3QgIiRUIiA9ICIkVSIKKworJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDcyMDEtY28uc2ggYi90L3Q3MjAxLWNvLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMxMTFiYWEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3MjAxLWNvLnNoCkBAIC0wLDAgKzEsMzQwIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1jaGVja291dCB0ZXN0cy4KKworQ3JlYXRlcyBtYXN0ZXIsIGZvcmtzIHJlbmFtZXIgYW5kIHNpZGUgYnJhbmNoZXMgZnJvbSBpdC4KK1Rlc3Qgc3dpdGNoaW5nIGFjcm9zcyB0aGVtLgorCisgICEgW21hc3Rlcl0gSW5pdGlhbCBBIG9uZSwgQSB0d28KKyAgICogW3JlbmFtZXJdIFJlbmFtZXIgUiBvbmUtPnVubywgTSB0d28KKyAgICAhIFtzaWRlXSBTaWRlIE0gb25lLCBEIHR3bywgQSB0aHJlZQorICAtLS0KKyAgICArIFtzaWRlXSBTaWRlIE0gb25lLCBEIHR3bywgQSB0aHJlZQorICAgKiAgW3JlbmFtZXJdIFJlbmFtZXIgUiBvbmUtPnVubywgTSB0d28KKyAgKyorIFttYXN0ZXJdIEluaXRpYWwgQSBvbmUsIEEgdHdvCisKKycKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfdGljaworCitmaWxsICgpIHsKKwlmb3IgaQorCWRvCisJCWVjaG8gIiRpIgorCWRvbmUKK30KKworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKworCWZpbGwgeCB5IHogPiBzYW1lICYmCisJZmlsbCAxIDIgMyA0IDUgNiA3IDggPm9uZSAmJgorCWZpbGwgYSBiIGMgZCBlID50d28gJiYKKwlnaXQgYWRkIHNhbWUgb25lIHR3byAmJgorCWdpdCBjb21taXQgLW0gIkluaXRpYWwgQSBvbmUsIEEgdHdvIiAmJgorCisJZ2l0IGNoZWNrb3V0IC1iIHJlbmFtZXIgJiYKKwlybSAtZiBvbmUgJiYKKwlmaWxsIDEgMyA0IDUgNiA3IDggPnVubyAmJgorCWdpdCBhZGQgdW5vICYmCisJZmlsbCBhIGIgYyBkIGUgZiA+dHdvICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAiUmVuYW1lciBSIG9uZS0+dW5vLCBNIHR3byIgJiYKKworCWdpdCBjaGVja291dCAtYiBzaWRlIG1hc3RlciAmJgorCWZpbGwgMSAyIDMgNCA1IDYgNyA+b25lICYmCisJZmlsbCBBIEIgQyBEIEUgPnRocmVlICYmCisJcm0gLWYgdHdvICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBvbmUgdHdvIHRocmVlICYmCisJZ2l0IGNvbW1pdCAtbSAiU2lkZSBNIG9uZSwgRCB0d28sIEEgdGhyZWUiICYmCisKKwlnaXQgY2hlY2tvdXQgbWFzdGVyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgImNoZWNrb3V0IGZyb20gbm9uLWV4aXN0aW5nIGJyYW5jaCIgJworCisJZ2l0IGNoZWNrb3V0IC1iIGRlbGV0ZS1tZSBtYXN0ZXIgJiYKKwlybSAuZ2l0L3JlZnMvaGVhZHMvZGVsZXRlLW1lICYmCisJdGVzdCByZWZzL2hlYWRzL2RlbGV0ZS1tZSA9ICIkKGdpdCBzeW1ib2xpYy1yZWYgSEVBRCkiICYmCisJZ2l0IGNoZWNrb3V0IG1hc3RlciAmJgorCXRlc3QgcmVmcy9oZWFkcy9tYXN0ZXIgPSAiJChnaXQgc3ltYm9saWMtcmVmIEhFQUQpIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJjaGVja291dCB3aXRoIGRpcnR5IHRyZWUgd2l0aG91dCAtbSIgJworCisJZmlsbCAwIDEgMiAzIDQgNSA2IDcgOCA+b25lICYmCisJaWYgZ2l0IGNoZWNrb3V0IHNpZGUKKwl0aGVuCisJCWVjaG8gTm90IGhhcHB5CisJCWZhbHNlCisJZWxzZQorCQllY2hvICJoYXBweSAtIGZhaWxlZCBjb3JyZWN0bHkiCisJZmkKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJjaGVja291dCB3aXRoIHVucmVsYXRlZCBkaXJ0eSB0cmVlIHdpdGhvdXQgLW0iICcKKworCWdpdCBjaGVja291dCAtZiBtYXN0ZXIgJiYKKwlmaWxsIDAgMSAyIDMgNCA1IDYgNyA4ID5zYW1lICYmCisJY3Agc2FtZSBrZXB0CisJZ2l0IGNoZWNrb3V0IHNpZGUgPm1lc3NhZ2VzICYmCisJdGVzdF9jbXAgc2FtZSBrZXB0CisJKGNhdCA+IG1lc3NhZ2VzLmV4cGVjdCA8PEVPRgorTQlzYW1lCitFT0YKKykgJiYKKwl0b3VjaCBtZXNzYWdlcy5leHBlY3QgJiYKKwl0ZXN0X2NtcCBtZXNzYWdlcy5leHBlY3QgbWVzc2FnZXMKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiY2hlY2tvdXQgLW0gd2l0aCBkaXJ0eSB0cmVlIiAnCisKKwlnaXQgY2hlY2tvdXQgLWYgbWFzdGVyICYmCisJZ2l0IGNsZWFuIC1mICYmCisKKwlmaWxsIDAgMSAyIDMgNCA1IDYgNyA4ID5vbmUgJiYKKwlnaXQgY2hlY2tvdXQgLW0gc2lkZSA+IG1lc3NhZ2VzICYmCisKKwl0ZXN0ICIkKGdpdCBzeW1ib2xpYy1yZWYgSEVBRCkiID0gInJlZnMvaGVhZHMvc2lkZSIgJiYKKworCShjYXQgPmV4cGVjdC5tZXNzYWdlcyA8PEVPRgorTQlvbmUKK0VPRgorKSAmJgorCXRlc3RfY21wIGV4cGVjdC5tZXNzYWdlcyBtZXNzYWdlcyAmJgorCisJZmlsbCAiTQlvbmUiICJBCXRocmVlIiAiRAl0d28iID5leHBlY3QubWFzdGVyICYmCisJZ2l0IGRpZmYgLS1uYW1lLXN0YXR1cyBtYXN0ZXIgPmN1cnJlbnQubWFzdGVyICYmCisJdGVzdF9jbXAgZXhwZWN0Lm1hc3RlciBjdXJyZW50Lm1hc3RlciAmJgorCisJZmlsbCAiTQlvbmUiID5leHBlY3Quc2lkZSAmJgorCWdpdCBkaWZmIC0tbmFtZS1zdGF0dXMgc2lkZSA+Y3VycmVudC5zaWRlICYmCisJdGVzdF9jbXAgZXhwZWN0LnNpZGUgY3VycmVudC5zaWRlICYmCisKKwk6ID5leHBlY3QuaW5kZXggJiYKKwlnaXQgZGlmZiAtLWNhY2hlZCA+Y3VycmVudC5pbmRleCAmJgorCXRlc3RfY21wIGV4cGVjdC5pbmRleCBjdXJyZW50LmluZGV4CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgImNoZWNrb3V0IC1tIHdpdGggZGlydHkgdHJlZSwgcmVuYW1lZCIgJworCisJZ2l0IGNoZWNrb3V0IC1mIG1hc3RlciAmJiBnaXQgY2xlYW4gLWYgJiYKKworCWZpbGwgMSAyIDMgNCA1IDcgOCA+b25lICYmCisJaWYgZ2l0IGNoZWNrb3V0IHJlbmFtZXIKKwl0aGVuCisJCWVjaG8gTm90IGhhcHB5CisJCWZhbHNlCisJZWxzZQorCQllY2hvICJoYXBweSAtIGZhaWxlZCBjb3JyZWN0bHkiCisJZmkgJiYKKworCWdpdCBjaGVja291dCAtbSByZW5hbWVyICYmCisJZmlsbCAxIDMgNCA1IDcgOCA+ZXhwZWN0ICYmCisJdGVzdF9jbXAgZXhwZWN0IHVubyAmJgorCSEgdGVzdCAtZiBvbmUgJiYKKwlnaXQgZGlmZiAtLWNhY2hlZCA+Y3VycmVudCAmJgorCSEgdGVzdCAtcyBjdXJyZW50CisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2tvdXQgLW0gd2l0aCBtZXJnZSBjb25mbGljdCcgJworCisJZ2l0IGNoZWNrb3V0IC1mIG1hc3RlciAmJiBnaXQgY2xlYW4gLWYgJiYKKworCWZpbGwgMSBUIDMgNCA1IDYgUyA4ID5vbmUgJiYKKwlpZiBnaXQgY2hlY2tvdXQgcmVuYW1lcgorCXRoZW4KKwkJZWNobyBOb3QgaGFwcHkKKwkJZmFsc2UKKwllbHNlCisJCWVjaG8gImhhcHB5IC0gZmFpbGVkIGNvcnJlY3RseSIKKwlmaSAmJgorCisJZ2l0IGNoZWNrb3V0IC1tIHJlbmFtZXIgJiYKKworCWdpdCBkaWZmIG1hc3RlcjpvbmUgOjM6dW5vIHwKKwlzZWQgLWUgIjEsL15AQC9kIiAtZSAiL14gL2QiIC1lICJzL14tL2QvIiAtZSAicy9eKy9hLyIgPmN1cnJlbnQgJiYKKwlmaWxsIGQyIGFUIGQ3IGFTID5leHBlY3QgJiYKKwl0ZXN0X2NtcCBjdXJyZW50IGV4cGVjdCAmJgorCWdpdCBkaWZmIC0tY2FjaGVkIHR3byA+Y3VycmVudCAmJgorCSEgdGVzdCAtcyBjdXJyZW50CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrb3V0IHRvIGRldGFjaCBIRUFEJyAnCisKKwlnaXQgY2hlY2tvdXQgLWYgcmVuYW1lciAmJiBnaXQgY2xlYW4gLWYgJiYKKwlnaXQgY2hlY2tvdXQgcmVuYW1lcl4gMj5tZXNzYWdlcyAmJgorCShjYXQgPm1lc3NhZ2VzLmV4cGVjdCA8PEVPRgorTm90ZTogbW92aW5nIHRvICJyZW5hbWVyXiIgd2hpY2ggaXNuJyInIid0IGEgbG9jYWwgYnJhbmNoCitJZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgYnJhbmNoIGZyb20gdGhpcyBjaGVja291dCwgeW91IG1heSBkbyBzbworKG5vdyBvciBsYXRlcikgYnkgdXNpbmcgLWIgd2l0aCB0aGUgY2hlY2tvdXQgY29tbWFuZCBhZ2Fpbi4gRXhhbXBsZToKKyAgZ2l0IGNoZWNrb3V0IC1iIDxuZXdfYnJhbmNoX25hbWU+CitIRUFEIGlzIG5vdyBhdCA3MzI5Mzg4Li4uIEluaXRpYWwgQSBvbmUsIEEgdHdvCitFT0YKKykgJiYKKwl0ZXN0X2NtcCBtZXNzYWdlcy5leHBlY3QgbWVzc2FnZXMgJiYKKwlIPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSAmJgorCU09JChnaXQgc2hvdy1yZWYgLXMgLS12ZXJpZnkgcmVmcy9oZWFkcy9tYXN0ZXIpICYmCisJdGVzdCAieiRIIiA9ICJ6JE0iICYmCisJaWYgZ2l0IHN5bWJvbGljLXJlZiBIRUFEID4vZGV2L251bGwgMj4mMQorCXRoZW4KKwkJZWNobyAiT09QUywgSEVBRCBpcyBzdGlsbCBzeW1ib2xpYz8/PyIKKwkJZmFsc2UKKwllbHNlCisJCTogaGFwcHkKKwlmaQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVja291dCB0byBkZXRhY2ggSEVBRCB3aXRoIGJyYW5jaG5hbWVeJyAnCisKKwlnaXQgY2hlY2tvdXQgLWYgbWFzdGVyICYmIGdpdCBjbGVhbiAtZiAmJgorCWdpdCBjaGVja291dCByZW5hbWVyXiAmJgorCUg9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisJTT0kKGdpdCBzaG93LXJlZiAtcyAtLXZlcmlmeSByZWZzL2hlYWRzL21hc3RlcikgJiYKKwl0ZXN0ICJ6JEgiID0gInokTSIgJiYKKwlpZiBnaXQgc3ltYm9saWMtcmVmIEhFQUQgPi9kZXYvbnVsbCAyPiYxCisJdGhlbgorCQllY2hvICJPT1BTLCBIRUFEIGlzIHN0aWxsIHN5bWJvbGljPz8/IgorCQlmYWxzZQorCWVsc2UKKwkJOiBoYXBweQorCWZpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrb3V0IHRvIGRldGFjaCBIRUFEIHdpdGggOi9tZXNzYWdlJyAnCisKKwlnaXQgY2hlY2tvdXQgLWYgbWFzdGVyICYmIGdpdCBjbGVhbiAtZiAmJgorCWdpdCBjaGVja291dCAiOi9Jbml0aWFsIiAmJgorCUg9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisJTT0kKGdpdCBzaG93LXJlZiAtcyAtLXZlcmlmeSByZWZzL2hlYWRzL21hc3RlcikgJiYKKwl0ZXN0ICJ6JEgiID0gInokTSIgJiYKKwlpZiBnaXQgc3ltYm9saWMtcmVmIEhFQUQgPi9kZXYvbnVsbCAyPiYxCisJdGhlbgorCQllY2hvICJPT1BTLCBIRUFEIGlzIHN0aWxsIHN5bWJvbGljPz8/IgorCQlmYWxzZQorCWVsc2UKKwkJOiBoYXBweQorCWZpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrb3V0IHRvIGRldGFjaCBIRUFEIHdpdGggSEVBRF4wJyAnCisKKwlnaXQgY2hlY2tvdXQgLWYgbWFzdGVyICYmIGdpdCBjbGVhbiAtZiAmJgorCWdpdCBjaGVja291dCBIRUFEXjAgJiYKKwlIPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSAmJgorCU09JChnaXQgc2hvdy1yZWYgLXMgLS12ZXJpZnkgcmVmcy9oZWFkcy9tYXN0ZXIpICYmCisJdGVzdCAieiRIIiA9ICJ6JE0iICYmCisJaWYgZ2l0IHN5bWJvbGljLXJlZiBIRUFEID4vZGV2L251bGwgMj4mMQorCXRoZW4KKwkJZWNobyAiT09QUywgSEVBRCBpcyBzdGlsbCBzeW1ib2xpYz8/PyIKKwkJZmFsc2UKKwllbHNlCisJCTogaGFwcHkKKwlmaQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVja291dCB3aXRoIGFtYmlndW91cyB0YWcvYnJhbmNoIG5hbWVzJyAnCisKKwlnaXQgdGFnIGJvdGggc2lkZSAmJgorCWdpdCBicmFuY2ggYm90aCBtYXN0ZXIgJiYKKwlnaXQgcmVzZXQgLS1oYXJkICYmCisJZ2l0IGNoZWNrb3V0IG1hc3RlciAmJgorCisJZ2l0IGNoZWNrb3V0IGJvdGggJiYKKwlIPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSAmJgorCU09JChnaXQgc2hvdy1yZWYgLXMgLS12ZXJpZnkgcmVmcy9oZWFkcy9tYXN0ZXIpICYmCisJdGVzdCAieiRIIiA9ICJ6JE0iICYmCisJbmFtZT0kKGdpdCBzeW1ib2xpYy1yZWYgSEVBRCAyPi9kZXYvbnVsbCkgJiYKKwl0ZXN0ICJ6JG5hbWUiID0genJlZnMvaGVhZHMvYm90aAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrb3V0IHdpdGggYW1iaWd1b3VzIHRhZy9icmFuY2ggbmFtZXMnICcKKworCWdpdCByZXNldCAtLWhhcmQgJiYKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisKKwlnaXQgdGFnIGZyb3R6IHNpZGUgJiYKKwlnaXQgYnJhbmNoIGZyb3R6IG1hc3RlciAmJgorCWdpdCByZXNldCAtLWhhcmQgJiYKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisKKwlnaXQgY2hlY2tvdXQgdGFncy9mcm90eiAmJgorCUg9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisJUz0kKGdpdCBzaG93LXJlZiAtcyAtLXZlcmlmeSByZWZzL2hlYWRzL3NpZGUpICYmCisJdGVzdCAieiRIIiA9ICJ6JFMiICYmCisJaWYgbmFtZT0kKGdpdCBzeW1ib2xpYy1yZWYgSEVBRCAyPi9kZXYvbnVsbCkKKwl0aGVuCisJCWVjaG8gIkJhZCAtLSBzaG91bGQgaGF2ZSBkZXRhY2hlZCIKKwkJZmFsc2UKKwllbHNlCisJCTogaGFwcHkKKwlmaQorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N3aXRjaCBicmFuY2hlcyB3aGlsZSBpbiBzdWJkaXJlY3RvcnknICcKKworCWdpdCByZXNldCAtLWhhcmQgJiYKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisKKwlta2RpciBzdWJzICYmCisJKAorCQljZCBzdWJzICYmCisJCWdpdCBjaGVja291dCBzaWRlCisJKSAmJgorCSEgdGVzdCAtZiBzdWJzL29uZSAmJgorCXJtIC1mciBzdWJzCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2tvdXQgc3BlY2lmaWMgcGF0aCB3aGlsZSBpbiBzdWJkaXJlY3RvcnknICcKKworCWdpdCByZXNldCAtLWhhcmQgJiYKKwlnaXQgY2hlY2tvdXQgc2lkZSAmJgorCW1rZGlyIHN1YnMgJiYKKwk+c3Vicy9iZXJvICYmCisJZ2l0IGFkZCBzdWJzL2Jlcm8gJiYKKwlnaXQgY29tbWl0IC1tICJhZGQgc3Vicy9iZXJvIiAmJgorCisJZ2l0IGNoZWNrb3V0IG1hc3RlciAmJgorCW1rZGlyIC1wIHN1YnMgJiYKKwkoCisJCWNkIHN1YnMgJiYKKwkJZ2l0IGNoZWNrb3V0IHNpZGUgLS0gYmVybworCSkgJiYKKwl0ZXN0IC1mIHN1YnMvYmVybworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGVja291dCB3Ly0tdHJhY2sgc2V0cyB1cCB0cmFja2luZycgJworICAgIGdpdCBjb25maWcgYnJhbmNoLmF1dG9zZXR1cG1lcmdlIGZhbHNlICYmCisgICAgZ2l0IGNoZWNrb3V0IG1hc3RlciAmJgorICAgIGdpdCBjaGVja291dCAtLXRyYWNrIC1iIHRyYWNrMSAmJgorICAgIHRlc3QgIiQoZ2l0IGNvbmZpZyBicmFuY2gudHJhY2sxLnJlbW90ZSkiICYmCisgICAgdGVzdCAiJChnaXQgY29uZmlnIGJyYW5jaC50cmFjazEubWVyZ2UpIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoZWNrb3V0IHcvYXV0b3NldHVwbWVyZ2U9YWx3YXlzIHNldHMgdXAgdHJhY2tpbmcnICcKKyAgICBnaXQgY29uZmlnIGJyYW5jaC5hdXRvc2V0dXBtZXJnZSBhbHdheXMgJiYKKyAgICBnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisgICAgZ2l0IGNoZWNrb3V0IC1iIHRyYWNrMiAmJgorICAgIHRlc3QgIiQoZ2l0IGNvbmZpZyBicmFuY2gudHJhY2syLnJlbW90ZSkiICYmCisgICAgdGVzdCAiJChnaXQgY29uZmlnIGJyYW5jaC50cmFjazIubWVyZ2UpIgorICAgIGdpdCBjb25maWcgYnJhbmNoLmF1dG9zZXR1cG1lcmdlIGZhbHNlJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hlY2tvdXQgdy8tLXRyYWNrIGZyb20gbm9uLWJyYW5jaCBIRUFEIGZhaWxzJyAnCisgICAgZ2l0IGNoZWNrb3V0IC1iIGRlbGV0ZS1tZSBtYXN0ZXIgJiYKKyAgICBybSAuZ2l0L3JlZnMvaGVhZHMvZGVsZXRlLW1lICYmCisgICAgdGVzdCByZWZzL2hlYWRzL2RlbGV0ZS1tZSA9ICIkKGdpdCBzeW1ib2xpYy1yZWYgSEVBRCkiICYmCisgICAgIShnaXQgY2hlY2tvdXQgLS10cmFjayAtYiB0cmFjayknCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NzMwMC1jbGVhbi5zaCBiL3QvdDczMDAtY2xlYW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWZjY2ZjOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDczMDAtY2xlYW4uc2gKQEAgLTAsMCArMSwzODIgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDcgTWljaGFlbCBTcGFuZworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtY2xlYW4gYmFzaWMgdGVzdHMnCisKKy4gLi90ZXN0LWxpYi5zaAorCitnaXQgY29uZmlnIGNsZWFuLnJlcXVpcmVGb3JjZSBubworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCcgJworCisJbWtkaXIgLXAgc3JjICYmCisJdG91Y2ggc3JjL3BhcnQxLmMgTWFrZWZpbGUgJiYKKwllY2hvIGJ1aWxkID4uZ2l0aWdub3JlICYmCisJZWNobyBcKi5vID4+LmdpdGlnbm9yZSAmJgorCWdpdCBhZGQgLiAmJgorCWdpdC1jb21taXQgLW0gc2V0dXAgJiYKKwl0b3VjaCBzcmMvcGFydDIuYyBSRUFETUUgJiYKKwlnaXQgYWRkIC4KKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtY2xlYW4nICcKKworCW1rZGlyIC1wIGJ1aWxkIGRvY3MgJiYKKwl0b3VjaCBhLm91dCBzcmMvcGFydDMuYyBkb2NzL21hbnVhbC50eHQgb2JqLm8gYnVpbGQvbGliLnNvICYmCisJZ2l0LWNsZWFuICYmCisJdGVzdCAtZiBNYWtlZmlsZSAmJgorCXRlc3QgLWYgUkVBRE1FICYmCisJdGVzdCAtZiBzcmMvcGFydDEuYyAmJgorCXRlc3QgLWYgc3JjL3BhcnQyLmMgJiYKKwl0ZXN0ICEgLWYgYS5vdXQgJiYKKwl0ZXN0ICEgLWYgc3JjL3BhcnQzLmMgJiYKKwl0ZXN0IC1mIGRvY3MvbWFudWFsLnR4dCAmJgorCXRlc3QgLWYgb2JqLm8gJiYKKwl0ZXN0IC1mIGJ1aWxkL2xpYi5zbworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1jbGVhbiBzcmMvJyAnCisKKwlta2RpciAtcCBidWlsZCBkb2NzICYmCisJdG91Y2ggYS5vdXQgc3JjL3BhcnQzLmMgZG9jcy9tYW51YWwudHh0IG9iai5vIGJ1aWxkL2xpYi5zbyAmJgorCWdpdC1jbGVhbiBzcmMvICYmCisJdGVzdCAtZiBNYWtlZmlsZSAmJgorCXRlc3QgLWYgUkVBRE1FICYmCisJdGVzdCAtZiBzcmMvcGFydDEuYyAmJgorCXRlc3QgLWYgc3JjL3BhcnQyLmMgJiYKKwl0ZXN0IC1mIGEub3V0ICYmCisJdGVzdCAhIC1mIHNyYy9wYXJ0My5jICYmCisJdGVzdCAtZiBkb2NzL21hbnVhbC50eHQgJiYKKwl0ZXN0IC1mIG9iai5vICYmCisJdGVzdCAtZiBidWlsZC9saWIuc28KKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtY2xlYW4gc3JjLyBzcmMvJyAnCisKKwlta2RpciAtcCBidWlsZCBkb2NzICYmCisJdG91Y2ggYS5vdXQgc3JjL3BhcnQzLmMgZG9jcy9tYW51YWwudHh0IG9iai5vIGJ1aWxkL2xpYi5zbyAmJgorCWdpdC1jbGVhbiBzcmMvIHNyYy8gJiYKKwl0ZXN0IC1mIE1ha2VmaWxlICYmCisJdGVzdCAtZiBSRUFETUUgJiYKKwl0ZXN0IC1mIHNyYy9wYXJ0MS5jICYmCisJdGVzdCAtZiBzcmMvcGFydDIuYyAmJgorCXRlc3QgLWYgYS5vdXQgJiYKKwl0ZXN0ICEgLWYgc3JjL3BhcnQzLmMgJiYKKwl0ZXN0IC1mIGRvY3MvbWFudWFsLnR4dCAmJgorCXRlc3QgLWYgb2JqLm8gJiYKKwl0ZXN0IC1mIGJ1aWxkL2xpYi5zbworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1jbGVhbiB3aXRoIHByZWZpeCcgJworCisJbWtkaXIgLXAgYnVpbGQgZG9jcyAmJgorCXRvdWNoIGEub3V0IHNyYy9wYXJ0My5jIGRvY3MvbWFudWFsLnR4dCBvYmoubyBidWlsZC9saWIuc28gJiYKKwkoY2Qgc3JjLyAmJiBnaXQtY2xlYW4pICYmCisJdGVzdCAtZiBNYWtlZmlsZSAmJgorCXRlc3QgLWYgUkVBRE1FICYmCisJdGVzdCAtZiBzcmMvcGFydDEuYyAmJgorCXRlc3QgLWYgc3JjL3BhcnQyLmMgJiYKKwl0ZXN0IC1mIGEub3V0ICYmCisJdGVzdCAhIC1mIHNyYy9wYXJ0My5jICYmCisJdGVzdCAtZiBkb2NzL21hbnVhbC50eHQgJiYKKwl0ZXN0IC1mIG9iai5vICYmCisJdGVzdCAtZiBidWlsZC9saWIuc28KKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtY2xlYW4gd2l0aCByZWxhdGl2ZSBwcmVmaXgnICcKKworCW1rZGlyIC1wIGJ1aWxkIGRvY3MgJiYKKwl0b3VjaCBhLm91dCBzcmMvcGFydDMuYyBkb2NzL21hbnVhbC50eHQgb2JqLm8gYnVpbGQvbGliLnNvICYmCisJd291bGRfY2xlYW49JCgKKwkJY2QgZG9jcyAmJgorCQlnaXQgY2xlYW4gLW4gLi4vc3JjIHwKKwkJc2VkIC1uIC1lICJzfF5Xb3VsZCByZW1vdmUgfHxwIgorCSkgJiYKKwl0ZXN0ICIkd291bGRfY2xlYW4iID0gLi4vc3JjL3BhcnQzLmMgfHwgeworCQllY2hvICJPT3BzIDwkd291bGRfY2xlYW4+IgorCQlmYWxzZQorCX0KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LWNsZWFuIHdpdGggYWJzb2x1dGUgcGF0aCcgJworCisJbWtkaXIgLXAgYnVpbGQgZG9jcyAmJgorCXRvdWNoIGEub3V0IHNyYy9wYXJ0My5jIGRvY3MvbWFudWFsLnR4dCBvYmoubyBidWlsZC9saWIuc28gJiYKKwl3b3VsZF9jbGVhbj0kKAorCQljZCBkb2NzICYmCisJCWdpdCBjbGVhbiAtbiAkKHB3ZCkvLi4vc3JjIHwKKwkJc2VkIC1uIC1lICJzfF5Xb3VsZCByZW1vdmUgfHxwIgorCSkgJiYKKwl0ZXN0ICIkd291bGRfY2xlYW4iID0gLi4vc3JjL3BhcnQzLmMgfHwgeworCQllY2hvICJPT3BzIDwkd291bGRfY2xlYW4+IgorCQlmYWxzZQorCX0KKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LWNsZWFuIHdpdGggb3V0IG9mIHdvcmsgdHJlZSByZWxhdGl2ZSBwYXRoJyAnCisKKwlta2RpciAtcCBidWlsZCBkb2NzICYmCisJdG91Y2ggYS5vdXQgc3JjL3BhcnQzLmMgZG9jcy9tYW51YWwudHh0IG9iai5vIGJ1aWxkL2xpYi5zbyAmJgorCSgKKwkJY2QgZG9jcyAmJgorCQl0ZXN0X211c3RfZmFpbCBnaXQgY2xlYW4gLW4gLi4vLi4KKwkpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1jbGVhbiB3aXRoIG91dCBvZiB3b3JrIHRyZWUgYWJzb2x1dGUgcGF0aCcgJworCisJbWtkaXIgLXAgYnVpbGQgZG9jcyAmJgorCXRvdWNoIGEub3V0IHNyYy9wYXJ0My5jIGRvY3MvbWFudWFsLnR4dCBvYmoubyBidWlsZC9saWIuc28gJiYKKwlkZD0kKGNkIC4uICYmIHB3ZCkgJiYKKwkoCisJCWNkIGRvY3MgJiYKKwkJdGVzdF9tdXN0X2ZhaWwgZ2l0IGNsZWFuIC1uICRkZAorCSkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LWNsZWFuIC1kIHdpdGggcHJlZml4IGFuZCBwYXRoJyAnCisKKwlta2RpciAtcCBidWlsZCBkb2NzIHNyYy9mZWF0dXJlICYmCisJdG91Y2ggYS5vdXQgc3JjL3BhcnQzLmMgc3JjL2ZlYXR1cmUvZmlsZS5jIGRvY3MvbWFudWFsLnR4dCBvYmoubyBidWlsZC9saWIuc28gJiYKKwkoY2Qgc3JjLyAmJiBnaXQtY2xlYW4gLWQgZmVhdHVyZS8pICYmCisJdGVzdCAtZiBNYWtlZmlsZSAmJgorCXRlc3QgLWYgUkVBRE1FICYmCisJdGVzdCAtZiBzcmMvcGFydDEuYyAmJgorCXRlc3QgLWYgc3JjL3BhcnQyLmMgJiYKKwl0ZXN0IC1mIGEub3V0ICYmCisJdGVzdCAtZiBzcmMvcGFydDMuYyAmJgorCXRlc3QgISAtZiBzcmMvZmVhdHVyZS9maWxlLmMgJiYKKwl0ZXN0IC1mIGRvY3MvbWFudWFsLnR4dCAmJgorCXRlc3QgLWYgb2JqLm8gJiYKKwl0ZXN0IC1mIGJ1aWxkL2xpYi5zbworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1jbGVhbiBzeW1ib2xpYyBsaW5rJyAnCisKKwlta2RpciAtcCBidWlsZCBkb2NzICYmCisJdG91Y2ggYS5vdXQgc3JjL3BhcnQzLmMgZG9jcy9tYW51YWwudHh0IG9iai5vIGJ1aWxkL2xpYi5zbyAmJgorCWxuIC1zIGRvY3MvbWFudWFsLnR4dCBzcmMvcGFydDQuYworCWdpdC1jbGVhbiAmJgorCXRlc3QgLWYgTWFrZWZpbGUgJiYKKwl0ZXN0IC1mIFJFQURNRSAmJgorCXRlc3QgLWYgc3JjL3BhcnQxLmMgJiYKKwl0ZXN0IC1mIHNyYy9wYXJ0Mi5jICYmCisJdGVzdCAhIC1mIGEub3V0ICYmCisJdGVzdCAhIC1mIHNyYy9wYXJ0My5jICYmCisJdGVzdCAhIC1mIHNyYy9wYXJ0NC5jICYmCisJdGVzdCAtZiBkb2NzL21hbnVhbC50eHQgJiYKKwl0ZXN0IC1mIG9iai5vICYmCisJdGVzdCAtZiBidWlsZC9saWIuc28KKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtY2xlYW4gd2l0aCB3aWxkY2FyZCcgJworCisJdG91Y2ggYS5jbGVhbiBiLmNsZWFuIG90aGVyLmMgJiYKKwlnaXQtY2xlYW4gIiouY2xlYW4iICYmCisJdGVzdCAtZiBNYWtlZmlsZSAmJgorCXRlc3QgLWYgUkVBRE1FICYmCisJdGVzdCAtZiBzcmMvcGFydDEuYyAmJgorCXRlc3QgLWYgc3JjL3BhcnQyLmMgJiYKKwl0ZXN0ICEgLWYgYS5jbGVhbiAmJgorCXRlc3QgISAtZiBiLmNsZWFuICYmCisJdGVzdCAtZiBvdGhlci5jCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LWNsZWFuIC1uJyAnCisKKwlta2RpciAtcCBidWlsZCBkb2NzICYmCisJdG91Y2ggYS5vdXQgc3JjL3BhcnQzLmMgZG9jcy9tYW51YWwudHh0IG9iai5vIGJ1aWxkL2xpYi5zbyAmJgorCWdpdC1jbGVhbiAtbiAmJgorCXRlc3QgLWYgTWFrZWZpbGUgJiYKKwl0ZXN0IC1mIFJFQURNRSAmJgorCXRlc3QgLWYgc3JjL3BhcnQxLmMgJiYKKwl0ZXN0IC1mIHNyYy9wYXJ0Mi5jICYmCisJdGVzdCAtZiBhLm91dCAmJgorCXRlc3QgLWYgc3JjL3BhcnQzLmMgJiYKKwl0ZXN0IC1mIGRvY3MvbWFudWFsLnR4dCAmJgorCXRlc3QgLWYgb2JqLm8gJiYKKwl0ZXN0IC1mIGJ1aWxkL2xpYi5zbworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1jbGVhbiAtZCcgJworCisJbWtkaXIgLXAgYnVpbGQgZG9jcyAmJgorCXRvdWNoIGEub3V0IHNyYy9wYXJ0My5jIGRvY3MvbWFudWFsLnR4dCBvYmoubyBidWlsZC9saWIuc28gJiYKKwlnaXQtY2xlYW4gLWQgJiYKKwl0ZXN0IC1mIE1ha2VmaWxlICYmCisJdGVzdCAtZiBSRUFETUUgJiYKKwl0ZXN0IC1mIHNyYy9wYXJ0MS5jICYmCisJdGVzdCAtZiBzcmMvcGFydDIuYyAmJgorCXRlc3QgISAtZiBhLm91dCAmJgorCXRlc3QgISAtZiBzcmMvcGFydDMuYyAmJgorCXRlc3QgISAtZCBkb2NzICYmCisJdGVzdCAtZiBvYmoubyAmJgorCXRlc3QgLWYgYnVpbGQvbGliLnNvCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LWNsZWFuIC1kIHNyYy8gZXhhbXBsZXMvJyAnCisKKwlta2RpciAtcCBidWlsZCBkb2NzIGV4YW1wbGVzICYmCisJdG91Y2ggYS5vdXQgc3JjL3BhcnQzLmMgZG9jcy9tYW51YWwudHh0IG9iai5vIGJ1aWxkL2xpYi5zbyBleGFtcGxlcy8xLmMgJiYKKwlnaXQtY2xlYW4gLWQgc3JjLyBleGFtcGxlcy8gJiYKKwl0ZXN0IC1mIE1ha2VmaWxlICYmCisJdGVzdCAtZiBSRUFETUUgJiYKKwl0ZXN0IC1mIHNyYy9wYXJ0MS5jICYmCisJdGVzdCAtZiBzcmMvcGFydDIuYyAmJgorCXRlc3QgLWYgYS5vdXQgJiYKKwl0ZXN0ICEgLWYgc3JjL3BhcnQzLmMgJiYKKwl0ZXN0ICEgLWYgZXhhbXBsZXMvMS5jICYmCisJdGVzdCAtZiBkb2NzL21hbnVhbC50eHQgJiYKKwl0ZXN0IC1mIG9iai5vICYmCisJdGVzdCAtZiBidWlsZC9saWIuc28KKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtY2xlYW4gLXgnICcKKworCW1rZGlyIC1wIGJ1aWxkIGRvY3MgJiYKKwl0b3VjaCBhLm91dCBzcmMvcGFydDMuYyBkb2NzL21hbnVhbC50eHQgb2JqLm8gYnVpbGQvbGliLnNvICYmCisJZ2l0LWNsZWFuIC14ICYmCisJdGVzdCAtZiBNYWtlZmlsZSAmJgorCXRlc3QgLWYgUkVBRE1FICYmCisJdGVzdCAtZiBzcmMvcGFydDEuYyAmJgorCXRlc3QgLWYgc3JjL3BhcnQyLmMgJiYKKwl0ZXN0ICEgLWYgYS5vdXQgJiYKKwl0ZXN0ICEgLWYgc3JjL3BhcnQzLmMgJiYKKwl0ZXN0IC1mIGRvY3MvbWFudWFsLnR4dCAmJgorCXRlc3QgISAtZiBvYmoubyAmJgorCXRlc3QgLWYgYnVpbGQvbGliLnNvCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LWNsZWFuIC1kIC14JyAnCisKKwlta2RpciAtcCBidWlsZCBkb2NzICYmCisJdG91Y2ggYS5vdXQgc3JjL3BhcnQzLmMgZG9jcy9tYW51YWwudHh0IG9iai5vIGJ1aWxkL2xpYi5zbyAmJgorCWdpdC1jbGVhbiAtZCAteCAmJgorCXRlc3QgLWYgTWFrZWZpbGUgJiYKKwl0ZXN0IC1mIFJFQURNRSAmJgorCXRlc3QgLWYgc3JjL3BhcnQxLmMgJiYKKwl0ZXN0IC1mIHNyYy9wYXJ0Mi5jICYmCisJdGVzdCAhIC1mIGEub3V0ICYmCisJdGVzdCAhIC1mIHNyYy9wYXJ0My5jICYmCisJdGVzdCAhIC1kIGRvY3MgJiYKKwl0ZXN0ICEgLWYgb2JqLm8gJiYKKwl0ZXN0ICEgLWQgYnVpbGQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtY2xlYW4gLVgnICcKKworCW1rZGlyIC1wIGJ1aWxkIGRvY3MgJiYKKwl0b3VjaCBhLm91dCBzcmMvcGFydDMuYyBkb2NzL21hbnVhbC50eHQgb2JqLm8gYnVpbGQvbGliLnNvICYmCisJZ2l0LWNsZWFuIC1YICYmCisJdGVzdCAtZiBNYWtlZmlsZSAmJgorCXRlc3QgLWYgUkVBRE1FICYmCisJdGVzdCAtZiBzcmMvcGFydDEuYyAmJgorCXRlc3QgLWYgc3JjL3BhcnQyLmMgJiYKKwl0ZXN0IC1mIGEub3V0ICYmCisJdGVzdCAtZiBzcmMvcGFydDMuYyAmJgorCXRlc3QgLWYgZG9jcy9tYW51YWwudHh0ICYmCisJdGVzdCAhIC1mIG9iai5vICYmCisJdGVzdCAtZiBidWlsZC9saWIuc28KKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtY2xlYW4gLWQgLVgnICcKKworCW1rZGlyIC1wIGJ1aWxkIGRvY3MgJiYKKwl0b3VjaCBhLm91dCBzcmMvcGFydDMuYyBkb2NzL21hbnVhbC50eHQgb2JqLm8gYnVpbGQvbGliLnNvICYmCisJZ2l0LWNsZWFuIC1kIC1YICYmCisJdGVzdCAtZiBNYWtlZmlsZSAmJgorCXRlc3QgLWYgUkVBRE1FICYmCisJdGVzdCAtZiBzcmMvcGFydDEuYyAmJgorCXRlc3QgLWYgc3JjL3BhcnQyLmMgJiYKKwl0ZXN0IC1mIGEub3V0ICYmCisJdGVzdCAtZiBzcmMvcGFydDMuYyAmJgorCXRlc3QgLWYgZG9jcy9tYW51YWwudHh0ICYmCisJdGVzdCAhIC1mIG9iai5vICYmCisJdGVzdCAhIC1kIGJ1aWxkCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2xlYW4ucmVxdWlyZUZvcmNlIGRlZmF1bHRzIHRvIHRydWUnICcKKworCWdpdCBjb25maWcgLS11bnNldCBjbGVhbi5yZXF1aXJlRm9yY2UgJiYKKwkhIGdpdC1jbGVhbgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NsZWFuLnJlcXVpcmVGb3JjZScgJworCisJZ2l0IGNvbmZpZyBjbGVhbi5yZXF1aXJlRm9yY2UgdHJ1ZSAmJgorCSEgZ2l0LWNsZWFuCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2xlYW4ucmVxdWlyZUZvcmNlIGFuZCAtbicgJworCisJbWtkaXIgLXAgYnVpbGQgZG9jcyAmJgorCXRvdWNoIGEub3V0IHNyYy9wYXJ0My5jIGRvY3MvbWFudWFsLnR4dCBvYmoubyBidWlsZC9saWIuc28gJiYKKwlnaXQtY2xlYW4gLW4gJiYKKwl0ZXN0IC1mIE1ha2VmaWxlICYmCisJdGVzdCAtZiBSRUFETUUgJiYKKwl0ZXN0IC1mIHNyYy9wYXJ0MS5jICYmCisJdGVzdCAtZiBzcmMvcGFydDIuYyAmJgorCXRlc3QgLWYgYS5vdXQgJiYKKwl0ZXN0IC1mIHNyYy9wYXJ0My5jICYmCisJdGVzdCAtZiBkb2NzL21hbnVhbC50eHQgJiYKKwl0ZXN0IC1mIG9iai5vICYmCisJdGVzdCAtZiBidWlsZC9saWIuc28KKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjbGVhbi5yZXF1aXJlRm9yY2UgYW5kIC1mJyAnCisKKwlnaXQtY2xlYW4gLWYgJiYKKwl0ZXN0IC1mIFJFQURNRSAmJgorCXRlc3QgLWYgc3JjL3BhcnQxLmMgJiYKKwl0ZXN0IC1mIHNyYy9wYXJ0Mi5jICYmCisJdGVzdCAhIC1mIGEub3V0ICYmCisJdGVzdCAhIC1mIHNyYy9wYXJ0My5jICYmCisJdGVzdCAtZiBkb2NzL21hbnVhbC50eHQgJiYKKwl0ZXN0IC1mIG9iai5vICYmCisJdGVzdCAtZiBidWlsZC9saWIuc28KKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb3JlLmV4Y2x1ZGVzZmlsZScgJworCisJZWNobyBleGNsdWRlcyA+ZXhjbHVkZXMgJiYKKwllY2hvIGluY2x1ZGVkID5pbmNsdWRlZCAmJgorCWdpdCBjb25maWcgY29yZS5leGNsdWRlc2ZpbGUgZXhjbHVkZXMgJiYKKwlvdXRwdXQ9JChnaXQgY2xlYW4gLW4gZXhjbHVkZXMgaW5jbHVkZWQgMj4mMSkgJiYKKwlleHByICIkb3V0cHV0IiA6ICIuKmluY2x1ZGVkIiA+L2Rldi9udWxsICYmCisJISBleHByICIkb3V0cHV0IiA6ICIuKmV4Y2x1ZGVzIiA+L2Rldi9udWxsCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVtb3ZhbCBmYWlsdXJlJyAnCisKKwlta2RpciBmb28gJiYKKwl0b3VjaCBmb28vYmFyICYmCisJZXhlYyA8Zm9vL2JhciAmJgorCWNobW9kIDAgZm9vICYmCisJdGVzdF9tdXN0X2ZhaWwgZ2l0IGNsZWFuIC1mIC1kCisKKycKK2NobW9kIDc1NSBmb28KKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q3NDAwLXN1Ym1vZHVsZS1iYXNpYy5zaCBiL3QvdDc0MDAtc3VibW9kdWxlLWJhc2ljLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJlZjg1YTgKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3NDAwLXN1Ym1vZHVsZS1iYXNpYy5zaApAQCAtMCwwICsxLDE5OSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBMYXJzIEhqZW1saQorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdCYXNpYyBwb3JjZWxhaW4gc3VwcG9ydCBmb3Igc3VibW9kdWxlcworCitUaGlzIHRlc3QgdHJpZXMgdG8gdmVyaWZ5IGJhc2ljIHNhbml0eSBvZiB0aGUgaW5pdCwgdXBkYXRlIGFuZCBzdGF0dXMKK3N1YmNvbW1hbmRzIG9mIGdpdC1zdWJtb2R1bGUuCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCisjCisjIFRlc3Qgc2V0dXA6CisjICAtY3JlYXRlIGEgcmVwb3NpdG9yeSBpbiBkaXJlY3RvcnkgaW5pdAorIyAgLWFkZCBhIGNvdXBsZSBvZiBmaWxlcworIyAgLWFkZCBkaXJlY3RvcnkgaW5pdCB0byAnc3VwZXJwcm9qZWN0JywgdGhpcyBjcmVhdGVzIGEgRElSTElOSyBlbnRyeQorIyAgLWFkZCBhIGNvdXBsZSBvZiByZWd1bGFyIGZpbGVzIHRvIGVuYWJsZSB0ZXN0aW5nIG9mIHN1Ym1vZHVsZSBmaWx0ZXJpbmcKKyMgIC1tdiBpbml0IHN1YnJlcG8KKyMgIC1hZGQgYW4gZW50cnkgdG8gLmdpdG1vZHVsZXMgZm9yIHN1Ym1vZHVsZSAnZXhhbXBsZScKKyMKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ1ByZXBhcmUgc3VibW9kdWxlIHRlc3RpbmcnICcKKwk6ID4gdCAmJgorCWdpdC1hZGQgdCAmJgorCWdpdC1jb21taXQgLW0gImluaXRpYWwgY29tbWl0IiAmJgorCWdpdCBicmFuY2ggaW5pdGlhbCBIRUFEICYmCisJbWtkaXIgaW5pdCAmJgorCWNkIGluaXQgJiYKKwlnaXQgaW5pdCAmJgorCWVjaG8gYSA+YSAmJgorCWdpdCBhZGQgYSAmJgorCWdpdC1jb21taXQgLW0gInN1Ym1vZHVsZSBjb21taXQgMSIgJiYKKwlnaXQtdGFnIC1hIC1tICJyZXYtMSIgcmV2LTEgJiYKKwlyZXYxPSQoZ2l0IHJldi1wYXJzZSBIRUFEKSAmJgorCWlmIHRlc3QgLXogIiRyZXYxIgorCXRoZW4KKwkJZWNobyAiW09PUFNdIHN1Ym1vZHVsZSBnaXQgcmV2LXBhcnNlIHJldHVybmVkIG5vdGhpbmciCisJCWZhbHNlCisJZmkgJiYKKwljZCAuLiAmJgorCWVjaG8gYSA+YSAmJgorCWVjaG8geiA+eiAmJgorCWdpdCBhZGQgYSBpbml0IHogJiYKKwlnaXQtY29tbWl0IC1tICJzdXBlciBjb21taXQgMSIgJiYKKwltdiBpbml0IC5zdWJyZXBvICYmCisJR0lUX0NPTkZJRz0uZ2l0bW9kdWxlcyBnaXQgY29uZmlnIHN1Ym1vZHVsZS5leGFtcGxlLnVybCBnaXQ6Ly9leGFtcGxlLmNvbS9pbml0LmdpdAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzdGF0dXMgc2hvdWxkIGZhaWwgZm9yIHVubWFwcGVkIHBhdGhzJyAnCisJaWYgZ2l0LXN1Ym1vZHVsZSBzdGF0dXMKKwl0aGVuCisJCWVjaG8gIltPT1BTXSBzdWJtb2R1bGUgc3RhdHVzIHN1Y2NlZWRlZCIKKwkJZmFsc2UKKwllbGlmICEgR0lUX0NPTkZJRz0uZ2l0bW9kdWxlcyBnaXQgY29uZmlnIHN1Ym1vZHVsZS5leGFtcGxlLnBhdGggaW5pdAorCXRoZW4KKwkJZWNobyAiW09PUFNdIGdpdCBjb25maWcgZmFpbGVkIHRvIHVwZGF0ZSAuZ2l0bW9kdWxlcyIKKwkJZmFsc2UKKwlmaQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzdGF0dXMgc2hvdWxkIG9ubHkgcHJpbnQgb25lIGxpbmUnICcKKwlsaW5lcz0kKGdpdC1zdWJtb2R1bGUgc3RhdHVzIHwgd2MgLWwpICYmCisJdGVzdCAkbGluZXMgPSAxCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N0YXR1cyBzaG91bGQgaW5pdGlhbGx5IGJlICJtaXNzaW5nIicgJworCWdpdC1zdWJtb2R1bGUgc3RhdHVzIHwgZ3JlcCAiXi0kcmV2MSIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5pdCBzaG91bGQgcmVnaXN0ZXIgc3VibW9kdWxlIHVybCBpbiAuZ2l0L2NvbmZpZycgJworCWdpdC1zdWJtb2R1bGUgaW5pdCAmJgorCXVybD0kKGdpdCBjb25maWcgc3VibW9kdWxlLmV4YW1wbGUudXJsKSAmJgorCWlmIHRlc3QgIiR1cmwiICE9ICJnaXQ6Ly9leGFtcGxlLmNvbS9pbml0LmdpdCIKKwl0aGVuCisJCWVjaG8gIltPT1BTXSBpbml0IHN1Y2NlZWRlZCBidXQgc3VibW9kdWxlIHVybCBpcyB3cm9uZyIKKwkJZmFsc2UKKwllbGlmICEgZ2l0IGNvbmZpZyBzdWJtb2R1bGUuZXhhbXBsZS51cmwgLi8uc3VicmVwbworCXRoZW4KKwkJZWNobyAiW09PUFNdIGluaXQgc3VjY2VlZGVkIGJ1dCB1cGRhdGUgb2YgdXJsIGZhaWxlZCIKKwkJZmFsc2UKKwlmaQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1cGRhdGUgc2hvdWxkIGZhaWwgd2hlbiBwYXRoIGlzIHVzZWQgYnkgYSBmaWxlJyAnCisJZWNobyAiaGVsbG8iID5pbml0ICYmCisJaWYgZ2l0LXN1Ym1vZHVsZSB1cGRhdGUKKwl0aGVuCisJCWVjaG8gIltPT1BTXSB1cGRhdGUgc2hvdWxkIGhhdmUgZmFpbGVkIgorCQlmYWxzZQorCWVsaWYgdGVzdCAiJChjYXQgaW5pdCkiICE9ICJoZWxsbyIKKwl0aGVuCisJCWVjaG8gIltPT1BTXSB1cGRhdGUgZmFpbGVkIGJ1dCBpbml0IGZpbGUgd2FzIG1vbGVzdGVkIgorCQlmYWxzZQorCWVsc2UKKwkJcm0gaW5pdAorCWZpCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VwZGF0ZSBzaG91bGQgZmFpbCB3aGVuIHBhdGggaXMgdXNlZCBieSBhIG5vbmVtcHR5IGRpcmVjdG9yeScgJworCW1rZGlyIGluaXQgJiYKKwllY2hvICJoZWxsbyIgPmluaXQvYSAmJgorCWlmIGdpdC1zdWJtb2R1bGUgdXBkYXRlCisJdGhlbgorCQllY2hvICJbT09QU10gdXBkYXRlIHNob3VsZCBoYXZlIGZhaWxlZCIKKwkJZmFsc2UKKwllbGlmIHRlc3QgIiQoY2F0IGluaXQvYSkiICE9ICJoZWxsbyIKKwl0aGVuCisJCWVjaG8gIltPT1BTXSB1cGRhdGUgZmFpbGVkIGJ1dCBpbml0L2Egd2FzIG1vbGVzdGVkIgorCQlmYWxzZQorCWVsc2UKKwkJcm0gaW5pdC9hCisJZmkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBkYXRlIHNob3VsZCB3b3JrIHdoZW4gcGF0aCBpcyBhbiBlbXB0eSBkaXInICcKKwlybSAtcmYgaW5pdCAmJgorCW1rZGlyIGluaXQgJiYKKwlnaXQtc3VibW9kdWxlIHVwZGF0ZSAmJgorCWhlYWQ9JChjZCBpbml0ICYmIGdpdCByZXYtcGFyc2UgSEVBRCkgJiYKKwlpZiB0ZXN0IC16ICIkaGVhZCIKKwl0aGVuCisJCWVjaG8gIltPT1BTXSBGYWlsZWQgdG8gb2J0YWluIHN1Ym1vZHVsZSBoZWFkIgorCQlmYWxzZQorCWVsaWYgdGVzdCAiJGhlYWQiICE9ICIkcmV2MSIKKwl0aGVuCisJCWVjaG8gIltPT1BTXSBTdWJtb2R1bGUgaGVhZCBpcyAkaGVhZCBidXQgc2hvdWxkIGhhdmUgYmVlbiAkcmV2MSIKKwkJZmFsc2UKKwlmaQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzdGF0dXMgc2hvdWxkIGJlICJ1cC10by1kYXRlIiBhZnRlciB1cGRhdGUnICcKKwlnaXQtc3VibW9kdWxlIHN0YXR1cyB8IGdyZXAgIl4gJHJldjEiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N0YXR1cyBzaG91bGQgYmUgIm1vZGlmaWVkIiBhZnRlciBzdWJtb2R1bGUgY29tbWl0JyAnCisJY2QgaW5pdCAmJgorCWVjaG8gYiA+YiAmJgorCWdpdCBhZGQgYiAmJgorCWdpdC1jb21taXQgLW0gInN1Ym1vZHVsZSBjb21taXQgMiIgJiYKKwlyZXYyPSQoZ2l0IHJldi1wYXJzZSBIRUFEKSAmJgorCWNkIC4uICYmCisJaWYgdGVzdCAteiAiJHJldjIiCisJdGhlbgorCQllY2hvICJbT09QU10gc3VibW9kdWxlIGdpdCByZXYtcGFyc2UgcmV0dXJuZWQgbm90aGluZyIKKwkJZmFsc2UKKwlmaSAmJgorCWdpdC1zdWJtb2R1bGUgc3RhdHVzIHwgZ3JlcCAiXiskcmV2MiIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGhlIC0tY2FjaGVkIHNoYTEgc2hvdWxkIGJlIHJldjEnICcKKwlnaXQtc3VibW9kdWxlIC0tY2FjaGVkIHN0YXR1cyB8IGdyZXAgIl4rJHJldjEiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmIHNob3VsZCByZXBvcnQgdGhlIFNIQTEgb2YgdGhlIG5ldyBzdWJtb2R1bGUgY29tbWl0JyAnCisJZ2l0LWRpZmYgfCBncmVwICJeK1N1YnByb2plY3QgY29tbWl0ICRyZXYyIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1cGRhdGUgc2hvdWxkIGNoZWNrb3V0IHJldjEnICcKKwlnaXQtc3VibW9kdWxlIHVwZGF0ZSBpbml0ICYmCisJaGVhZD0kKGNkIGluaXQgJiYgZ2l0IHJldi1wYXJzZSBIRUFEKSAmJgorCWlmIHRlc3QgLXogIiRoZWFkIgorCXRoZW4KKwkJZWNobyAiW09PUFNdIHN1Ym1vZHVsZSBnaXQgcmV2LXBhcnNlIHJldHVybmVkIG5vdGhpbmciCisJCWZhbHNlCisJZWxpZiB0ZXN0ICIkaGVhZCIgIT0gIiRyZXYxIgorCXRoZW4KKwkJZWNobyAiW09PUFNdIGluaXQgZGlkIG5vdCBjaGVja291dCBjb3JyZWN0IGhlYWQiCisJCWZhbHNlCisJZmkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc3RhdHVzIHNob3VsZCBiZSAidXAtdG8tZGF0ZSIgYWZ0ZXIgdXBkYXRlJyAnCisJZ2l0LXN1Ym1vZHVsZSBzdGF0dXMgfCBncmVwICJeICRyZXYxIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVja291dCBzdXBlcnByb2plY3Qgd2l0aCBzdWJwcm9qZWN0IGFscmVhZHkgcHJlc2VudCcgJworCWdpdC1jaGVja291dCBpbml0aWFsICYmCisJZ2l0LWNoZWNrb3V0IG1hc3RlcgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBzdWJtb2R1bGUgZGlmZicgJworCWdpdCBicmFuY2ggc2Vjb25kICYmCisJKAorCQljZCBpbml0ICYmCisJCWVjaG8gcyA+cyAmJgorCQlnaXQgYWRkIHMgJiYKKwkJZ2l0IGNvbW1pdCAtbSAiY2hhbmdlIHN1YnByb2plY3QiCisJKSAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgaW5pdCAmJgorCWdpdC1jb21taXQgLW0gImNoYW5nZSBpbml0IiAmJgorCWdpdC1mb3JtYXQtcGF0Y2ggLTEgLS1zdGRvdXQgPlAuZGlmZiAmJgorCWdpdCBjaGVja291dCBzZWNvbmQgJiYKKwlnaXQgYXBwbHkgLS1pbmRleCBQLmRpZmYgJiYKKwlEPSQoZ2l0IGRpZmYgLS1jYWNoZWQgbWFzdGVyKSAmJgorCXRlc3QgLXogIiREIgorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDc0MDEtc3VibW9kdWxlLXN1bW1hcnkuc2ggYi90L3Q3NDAxLXN1Ym1vZHVsZS1zdW1tYXJ5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBmM2M0MmEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3NDAxLXN1Ym1vZHVsZS1zdW1tYXJ5LnNoCkBAIC0wLDAgKzEsMTk1IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA4IFBpbmcgWWluCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1N1bW1hcnkgc3VwcG9ydCBmb3Igc3VibW9kdWxlcworCitUaGlzIHRlc3QgdHJpZXMgdG8gdmVyaWZ5IHRoZSBzYW5pdHkgb2Ygc3VtbWFyeSBzdWJjb21tYW5kIG9mIGdpdC1zdWJtb2R1bGUuCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCithZGRfZmlsZSAoKSB7CisJc209JDEKKwlzaGlmdAorCW93ZD0kKHB3ZCkKKwljZCAiJHNtIgorCWZvciBuYW1lOyBkbworCQllY2hvICIkbmFtZSIgPiAiJG5hbWUiICYmCisJCWdpdCBhZGQgIiRuYW1lIiAmJgorCQl0ZXN0X3RpY2sgJiYKKwkJZ2l0IGNvbW1pdCAtbSAiQWRkICRuYW1lIgorCWRvbmUgPi9kZXYvbnVsbAorCWdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCB8IGN1dCAtYzEtNworCWNkICIkb3dkIgorfQorY29tbWl0X2ZpbGUgKCkgeworCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgIiRAIiAtbSAiQ29tbWl0ICQqIiA+L2Rldi9udWxsCit9CisKK3Rlc3RfY3JlYXRlX3JlcG8gc20xICYmCithZGRfZmlsZSAuIGZvbworCitoZWFkMT0kKGFkZF9maWxlIHNtMSBmb28xIGZvbzIpCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FkZGVkIHN1Ym1vZHVsZScgIgorCWdpdCBhZGQgc20xICYmCisJZ2l0IHN1Ym1vZHVsZSBzdW1tYXJ5ID5hY3R1YWwgJiYKKwlkaWZmIGFjdHVhbCAtIDw8LUVPRgorKiBzbTEgMDAwMDAwMC4uLiRoZWFkMSAoMik6CisgID4gQWRkIGZvbzIKKworRU9GCisiCisKK2NvbW1pdF9maWxlIHNtMSAmJgoraGVhZDI9JChhZGRfZmlsZSBzbTEgZm9vMykKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbW9kaWZpZWQgc3VibW9kdWxlKGZvcndhcmQpJyAiCisJZ2l0IHN1Ym1vZHVsZSBzdW1tYXJ5ID5hY3R1YWwgJiYKKwlkaWZmIGFjdHVhbCAtIDw8LUVPRgorKiBzbTEgJGhlYWQxLi4uJGhlYWQyICgxKToKKyAgPiBBZGQgZm9vMworCitFT0YKKyIKKworY29tbWl0X2ZpbGUgc20xICYmCitjZCBzbTEgJiYKK2dpdCByZXNldCAtLWhhcmQgSEVBRH4yID4vZGV2L251bGwgJiYKK2hlYWQzPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEIHwgY3V0IC1jMS03KSAmJgorY2QgLi4KKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbW9kaWZpZWQgc3VibW9kdWxlKGJhY2t3YXJkKScgIgorICAgIGdpdCBzdWJtb2R1bGUgc3VtbWFyeSA+YWN0dWFsICYmCisgICAgZGlmZiBhY3R1YWwgLSA8PC1FT0YKKyogc20xICRoZWFkMi4uLiRoZWFkMyAoMik6CisgIDwgQWRkIGZvbzMKKyAgPCBBZGQgZm9vMgorCitFT0YKKyIKKworaGVhZDQ9JChhZGRfZmlsZSBzbTEgZm9vNCBmb281KSAmJgoraGVhZDRfZnVsbD0kKEdJVF9ESVI9c20xLy5naXQgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKQordGVzdF9leHBlY3Rfc3VjY2VzcyAnbW9kaWZpZWQgc3VibW9kdWxlKGJhY2t3YXJkIGFuZCBmb3J3YXJkKScgIgorICAgIGdpdCBzdWJtb2R1bGUgc3VtbWFyeSA+YWN0dWFsICYmCisgICAgZGlmZiBhY3R1YWwgLSA8PC1FT0YKKyogc20xICRoZWFkMi4uLiRoZWFkNCAoNCk6CisgID4gQWRkIGZvbzUKKyAgPiBBZGQgZm9vNAorICA8IEFkZCBmb28zCisgIDwgQWRkIGZvbzIKKworRU9GCisiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy0tc3VtbWFyeS1saW1pdCcgIgorICAgIGdpdCBzdWJtb2R1bGUgc3VtbWFyeSAtbiAzID5hY3R1YWwgJiYKKyAgICBkaWZmIGFjdHVhbCAtIDw8LUVPRgorKiBzbTEgJGhlYWQyLi4uJGhlYWQ0ICg0KToKKyAgPiBBZGQgZm9vNQorICA+IEFkZCBmb280CisgIDwgQWRkIGZvbzMKKworRU9GCisiCisKK2NvbW1pdF9maWxlIHNtMSAmJgorbXYgc20xIHNtMS1iYWsgJiYKK2VjaG8gc20xID5zbTEgJiYKK2hlYWQ1PSQoZ2l0IGhhc2gtb2JqZWN0IHNtMSB8IGN1dCAtYzEtNykgJiYKK2dpdCBhZGQgc20xICYmCitybSAtZiBzbTEgJiYKK212IHNtMS1iYWsgc20xCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3R5cGVjaGFuZ2VkIHN1Ym1vZHVsZShzdWJtb2R1bGUtPmJsb2IpLCAtLWNhY2hlZCcgIgorICAgIGdpdCBzdWJtb2R1bGUgc3VtbWFyeSAtLWNhY2hlZCA+YWN0dWFsICYmCisgICAgZGlmZiBhY3R1YWwgLSA8PC1FT0YKKyogc20xICRoZWFkNChzdWJtb2R1bGUpLT4kaGVhZDUoYmxvYikgKDMpOgorICA8IEFkZCBmb281CisKK0VPRgorIgorCitybSAtcmYgc20xICYmCitnaXQgY2hlY2tvdXQtaW5kZXggc20xCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0eXBlY2hhbmdlZCBzdWJtb2R1bGUoc3VibW9kdWxlLT5ibG9iKScgIgorICAgIGdpdCBzdWJtb2R1bGUgc3VtbWFyeSA+YWN0dWFsICYmCisgICAgZGlmZiBhY3R1YWwgLSA8PC1FT0YKKyogc20xICRoZWFkNChzdWJtb2R1bGUpLT4kaGVhZDUoYmxvYik6CisKK0VPRgorIgorCitybSAtZiBzbTEgJiYKK3Rlc3RfY3JlYXRlX3JlcG8gc20xICYmCitoZWFkNj0kKGFkZF9maWxlIHNtMSBmb282IGZvbzcpCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdub25leGlzdGVudCBjb21taXQnICIKKyAgICBnaXQgc3VibW9kdWxlIHN1bW1hcnkgPmFjdHVhbCAmJgorICAgIGRpZmYgYWN0dWFsIC0gPDwtRU9GCisqIHNtMSAkaGVhZDQuLi4kaGVhZDY6CisgIFdhcm46IHNtMSBkb2Vzbid0IGNvbnRhaW4gY29tbWl0ICRoZWFkNF9mdWxsCisKK0VPRgorIgorCitjb21taXRfZmlsZQordGVzdF9leHBlY3Rfc3VjY2VzcyAndHlwZWNoYW5nZWQgc3VibW9kdWxlKGJsb2ItPnN1Ym1vZHVsZSknICIKKyAgICBnaXQgc3VibW9kdWxlIHN1bW1hcnkgPmFjdHVhbCAmJgorICAgIGRpZmYgYWN0dWFsIC0gPDwtRU9GCisqIHNtMSAkaGVhZDUoYmxvYiktPiRoZWFkNihzdWJtb2R1bGUpICgyKToKKyAgPiBBZGQgZm9vNworCitFT0YKKyIKKworY29tbWl0X2ZpbGUgc20xICYmCitybSAtcmYgc20xCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdkZWxldGVkIHN1Ym1vZHVsZScgIgorICAgIGdpdCBzdWJtb2R1bGUgc3VtbWFyeSA+YWN0dWFsICYmCisgICAgZGlmZiBhY3R1YWwgLSA8PC1FT0YKKyogc20xICRoZWFkNi4uLjAwMDAwMDA6CisKK0VPRgorIgorCit0ZXN0X2NyZWF0ZV9yZXBvIHNtMiAmJgoraGVhZDc9JChhZGRfZmlsZSBzbTIgZm9vOCBmb285KSAmJgorZ2l0IGFkZCBzbTIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbXVsdGlwbGUgc3VibW9kdWxlcycgIgorICAgIGdpdCBzdWJtb2R1bGUgc3VtbWFyeSA+YWN0dWFsICYmCisgICAgZGlmZiBhY3R1YWwgLSA8PC1FT0YKKyogc20xICRoZWFkNi4uLjAwMDAwMDA6CisKKyogc20yIDAwMDAwMDAuLi4kaGVhZDcgKDIpOgorICA+IEFkZCBmb285CisKK0VPRgorIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwYXRoIGZpbHRlcicgIgorICAgIGdpdCBzdWJtb2R1bGUgc3VtbWFyeSBzbTIgPmFjdHVhbCAmJgorICAgIGRpZmYgYWN0dWFsIC0gPDwtRU9GCisqIHNtMiAwMDAwMDAwLi4uJGhlYWQ3ICgyKToKKyAgPiBBZGQgZm9vOQorCitFT0YKKyIKKworY29tbWl0X2ZpbGUgc20yCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXZlbiBjb21taXQnICIKKyAgICBnaXQgc3VibW9kdWxlIHN1bW1hcnkgSEVBRF4gPmFjdHVhbCAmJgorICAgIGRpZmYgYWN0dWFsIC0gPDwtRU9GCisqIHNtMSAkaGVhZDYuLi4wMDAwMDAwOgorCisqIHNtMiAwMDAwMDAwLi4uJGhlYWQ3ICgyKToKKyAgPiBBZGQgZm9vOQorCitFT0YKKyIKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q3NTAwLWNvbW1pdC5zaCBiL3QvdDc1MDAtY29tbWl0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJhZWQ2Y2UKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3NTAwLWNvbW1pdC5zaApAQCAtMCwwICsxLDE0MSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBTdGV2ZW4gR3JpbW0KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWNvbW1pdAorCitUZXN0cyBmb3Igc2VsZWN0ZWQgY29tbWl0IG9wdGlvbnMuJworCisuIC4vdGVzdC1saWIuc2gKKworY29tbWl0X21zZ19pcyAoKSB7CisJdGVzdCAiYGdpdCBsb2cgLS1wcmV0dHk9Zm9ybWF0OiVzJWIgLTFgIiA9ICIkMSIKK30KKworIyBBIHNhbml0eSBjaGVjayB0byBzZWUgaWYgY29tbWl0IGlzIHdvcmtpbmcgYXQgYWxsLgordGVzdF9leHBlY3Rfc3VjY2VzcyAnYSBiYXNpYyBjb21taXQgaW4gYW4gZW1wdHkgdHJlZSBzaG91bGQgc3VjY2VlZCcgJworCWVjaG8gY29udGVudCA+IGZvbyAmJgorCWdpdCBhZGQgZm9vICYmCisJZ2l0IGNvbW1pdCAtbSAiaW5pdGlhbCBjb21taXQiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ25vbmV4aXN0ZW50IHRlbXBsYXRlIGZpbGUgc2hvdWxkIHJldHVybiBlcnJvcicgJworCWVjaG8gY2hhbmdlcyA+PiBmb28gJiYKKwlnaXQgYWRkIGZvbyAmJgorCSEgZ2l0IGNvbW1pdCAtLXRlbXBsYXRlICIkUFdEIi9ub3RleGlzdAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdub25leGlzdGVudCB0ZW1wbGF0ZSBmaWxlIGluIGNvbmZpZyBzaG91bGQgcmV0dXJuIGVycm9yJyAnCisJZ2l0IGNvbmZpZyBjb21taXQudGVtcGxhdGUgIiRQV0QiL25vdGV4aXN0ICYmCisJISBnaXQgY29tbWl0ICYmCisJZ2l0IGNvbmZpZyAtLXVuc2V0IGNvbW1pdC50ZW1wbGF0ZQorJworCisjIEZyb20gbm93IG9uIHdlJ2xsIHVzZSBhIHRlbXBsYXRlIGZpbGUgdGhhdCBleGlzdHMuCitURU1QTEFURT0iJFBXRCIvdGVtcGxhdGUKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndW5lZGl0ZWQgdGVtcGxhdGUgc2hvdWxkIG5vdCBjb21taXQnICcKKwllY2hvICJ0ZW1wbGF0ZSBsaW5lIiA+ICIkVEVNUExBVEUiICYmCisJISBnaXQgY29tbWl0IC0tdGVtcGxhdGUgIiRURU1QTEFURSIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndW5lZGl0ZWQgdGVtcGxhdGUgd2l0aCBjb21tZW50cyBzaG91bGQgbm90IGNvbW1pdCcgJworCWVjaG8gIiMgY29tbWVudCBpbiB0ZW1wbGF0ZSIgPj4gIiRURU1QTEFURSIgJiYKKwkhIGdpdCBjb21taXQgLS10ZW1wbGF0ZSAiJFRFTVBMQVRFIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhIFNpZ25lZC1vZmYtYnkgbGluZSBieSBpdHNlbGYgc2hvdWxkIG5vdCBjb21taXQnICcKKwkhIEdJVF9FRElUT1I9Li4vdDc1MDAvYWRkLXNpZ25lZC1vZmYgZ2l0IGNvbW1pdCAtLXRlbXBsYXRlICIkVEVNUExBVEUiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FkZGluZyBjb21tZW50cyB0byBhIHRlbXBsYXRlIHNob3VsZCBub3QgY29tbWl0JyAnCisJISBHSVRfRURJVE9SPS4uL3Q3NTAwL2FkZC1jb21tZW50cyBnaXQgY29tbWl0IC0tdGVtcGxhdGUgIiRURU1QTEFURSIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYWRkaW5nIHJlYWwgY29udGVudCB0byBhIHRlbXBsYXRlIHNob3VsZCBjb21taXQnICcKKwlHSVRfRURJVE9SPS4uL3Q3NTAwL2FkZC1jb250ZW50IGdpdCBjb21taXQgLS10ZW1wbGF0ZSAiJFRFTVBMQVRFIiAmJgorCWNvbW1pdF9tc2dfaXMgInRlbXBsYXRlIGxpbmVjb21taXQgbWVzc2FnZSIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLXQgb3B0aW9uIHNob3VsZCBiZSBzaG9ydCBmb3IgLS10ZW1wbGF0ZScgJworCWVjaG8gInNob3J0IHRlbXBsYXRlIiA+ICIkVEVNUExBVEUiICYmCisJZWNobyAibmV3IGNvbnRlbnQiID4+IGZvbyAmJgorCWdpdCBhZGQgZm9vICYmCisJR0lUX0VESVRPUj0uLi90NzUwMC9hZGQtY29udGVudCBnaXQgY29tbWl0IC10ICIkVEVNUExBVEUiICYmCisJY29tbWl0X21zZ19pcyAic2hvcnQgdGVtcGxhdGVjb21taXQgbWVzc2FnZSIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY29uZmlnLXNwZWNpZmllZCB0ZW1wbGF0ZSBzaG91bGQgY29tbWl0JyAnCisJZWNobyAibmV3IHRlbXBsYXRlIiA+ICIkVEVNUExBVEUiICYmCisJZ2l0IGNvbmZpZyBjb21taXQudGVtcGxhdGUgIiRURU1QTEFURSIgJiYKKwllY2hvICJtb3JlIGNvbnRlbnQiID4+IGZvbyAmJgorCWdpdCBhZGQgZm9vICYmCisJR0lUX0VESVRPUj0uLi90NzUwMC9hZGQtY29udGVudCBnaXQgY29tbWl0ICYmCisJZ2l0IGNvbmZpZyAtLXVuc2V0IGNvbW1pdC50ZW1wbGF0ZSAmJgorCWNvbW1pdF9tc2dfaXMgIm5ldyB0ZW1wbGF0ZWNvbW1pdCBtZXNzYWdlIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdleHBsaWNpdCBjb21taXQgbWVzc2FnZSBzaG91bGQgb3ZlcnJpZGUgdGVtcGxhdGUnICcKKwllY2hvICJzdGlsbCBtb3JlIGNvbnRlbnQiID4+IGZvbyAmJgorCWdpdCBhZGQgZm9vICYmCisJR0lUX0VESVRPUj0uLi90NzUwMC9hZGQtY29udGVudCBnaXQgY29tbWl0IC0tdGVtcGxhdGUgIiRURU1QTEFURSIgXAorCQktbSAiY29tbWFuZCBsaW5lIG1zZyIgJiYKKwljb21taXRfbXNnX2lzICJjb21tYW5kIGxpbmUgbXNnIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb21taXQgbWVzc2FnZSBmcm9tIGZpbGUgc2hvdWxkIG92ZXJyaWRlIHRlbXBsYXRlJyAnCisJZWNobyAiY29udGVudCBnYWxvcmUiID4+IGZvbyAmJgorCWdpdCBhZGQgZm9vICYmCisJZWNobyAic3RhbmRhcmQgaW5wdXQgbXNnIiB8CisJCUdJVF9FRElUT1I9Li4vdDc1MDAvYWRkLWNvbnRlbnQgZ2l0IGNvbW1pdCBcCisJCQktLXRlbXBsYXRlICIkVEVNUExBVEUiIC0tZmlsZSAtICYmCisJY29tbWl0X21zZ19pcyAic3RhbmRhcmQgaW5wdXQgbXNnIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1c2luZyBhbHRlcm5hdGUgR0lUX0lOREVYX0ZJTEUgKDEpJyAnCisKKwljcCAuZ2l0L2luZGV4IHNhdmVkLWluZGV4ICYmCisJKAorCQllY2hvIHNvbWUgbmV3IGNvbnRlbnQgPmZpbGUgJiYKKwkgICAgICAgIEdJVF9JTkRFWF9GSUxFPS5naXQvYW5vdGhlcl9pbmRleCAmJgorCQlleHBvcnQgR0lUX0lOREVYX0ZJTEUgJiYKKwkJZ2l0IGFkZCBmaWxlICYmCisJCWdpdCBjb21taXQgLW0gImNvbW1pdCB1c2luZyBhbm90aGVyIGluZGV4IiAmJgorCQlnaXQgZGlmZi1pbmRleCAtLWV4aXQtY29kZSBIRUFEICYmCisJCWdpdCBkaWZmLWZpbGVzIC0tZXhpdC1jb2RlCisJKSAmJgorCWNtcCAuZ2l0L2luZGV4IHNhdmVkLWluZGV4ID4vZGV2L251bGwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1c2luZyBhbHRlcm5hdGUgR0lUX0lOREVYX0ZJTEUgKDIpJyAnCisKKwljcCAuZ2l0L2luZGV4IHNhdmVkLWluZGV4ICYmCisJKAorCQlybSAtZiAuZ2l0L25vLXN1Y2gtaW5kZXggJiYKKwkJR0lUX0lOREVYX0ZJTEU9LmdpdC9uby1zdWNoLWluZGV4ICYmCisJCWV4cG9ydCBHSVRfSU5ERVhfRklMRSAmJgorCQlnaXQgY29tbWl0IC1tICJjb21taXQgdXNpbmcgbm9uZXhpc3RlbnQgaW5kZXgiICYmCisJCXRlc3QgLXogIiQoZ2l0IGxzLWZpbGVzKSIgJiYKKwkJdGVzdCAteiAiJChnaXQgbHMtdHJlZSBIRUFEKSIKKworCSkgJiYKKwljbXAgLmdpdC9pbmRleCBzYXZlZC1pbmRleCA+L2Rldi9udWxsCisnCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK3pvcnQKKworU2lnbmVkLW9mZi1ieTogQyBPIE1pdHRlciA8Y29tbWl0dGVyQGV4YW1wbGUuY29tPgorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy0tc2lnbm9mZicgJworCWVjaG8gInlldCBhbm90aGVyIGNvbnRlbnQgKm5hcmYqIiA+PiBmb28gJiYKKwllY2hvICJ6b3J0IiB8CisJCUdJVF9FRElUT1I9Li4vdDc1MDAvYWRkLWNvbnRlbnQgZ2l0IGNvbW1pdCAtcyAtRiAtIGZvbyAmJgorCWdpdCBjYXQtZmlsZSBjb21taXQgSEVBRCB8IHNlZCAiMSwvXiQvZCIgPiBvdXRwdXQgJiYKKwlkaWZmIGV4cGVjdCBvdXRwdXQKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q3NTAwL2FkZC1jb21tZW50cyBiL3QvdDc1MDAvYWRkLWNvbW1lbnRzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE3MmU2NWMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3NTAwL2FkZC1jb21tZW50cwpAQCAtMCwwICsxLDQgQEAKKyMhL2Jpbi9zaAorZWNobyAiIyB0aGlzIGlzIGEgbmV3IGNvbW1lbnQiID4+ICIkMSIKK2VjaG8gIiMgYW5kIHNvIGlzIHRoaXMiID4+ICIkMSIKK2V4aXQgMApkaWZmIC0tZ2l0IGEvdC90NzUwMC9hZGQtY29udGVudCBiL3QvdDc1MDAvYWRkLWNvbnRlbnQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmZhM2Q4NgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDc1MDAvYWRkLWNvbnRlbnQKQEAgLTAsMCArMSwzIEBACisjIS9iaW4vc2gKK2VjaG8gImNvbW1pdCBtZXNzYWdlIiA+PiAiJDEiCitleGl0IDAKZGlmZiAtLWdpdCBhL3QvdDc1MDAvYWRkLXNpZ25lZC1vZmYgYi90L3Q3NTAwL2FkZC1zaWduZWQtb2ZmCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUxZDg1NmEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3NTAwL2FkZC1zaWduZWQtb2ZmCkBAIC0wLDAgKzEsMyBAQAorIyEvYmluL3NoCitlY2hvICJTaWduZWQtb2ZmLWJ5OiBmb28gPGJhckBmcm90ej4iID4+ICIkMSIKK2V4aXQgMApkaWZmIC0tZ2l0IGEvdC90NzUwMS1jb21taXQuc2ggYi90L3Q3NTAxLWNvbW1pdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMDI4OGYzCi0tLSAvZGV2L251bGwKKysrIGIvdC90NzUwMS1jb21taXQuc2gKQEAgLTAsMCArMSwzNDggQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDcgS3Jpc3RpYW4gSMO4Z3NiZXJnIDxrcmhAcmVkaGF0LmNvbT4KKyMKKworIyBGSVhNRTogVGVzdCB0aGUgdmFyaW91cyBpbmRleCB1c2FnZXMsIC1pIGFuZCAtbywgdGVzdCByZWZsb2csCisjIHNpZ25vZmYKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWNvbW1pdCcKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X3RpY2sKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJImluaXRpYWwgc3RhdHVzIiBcCisJImVjaG8gJ2JvbmdvIGJvbmdvJyA+ZmlsZSAmJgorCSBnaXQtYWRkIGZpbGUgJiYgXAorCSBnaXQtc3RhdHVzIHwgZ3JlcCAnSW5pdGlhbCBjb21taXQnIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkiZmFpbCBpbml0aWFsIGFtZW5kIiBcCisJIiEgZ2l0LWNvbW1pdCAtLWFtZW5kIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkiaW5pdGlhbCBjb21taXQiIFwKKwkiZ2l0LWNvbW1pdCAtbSBpbml0aWFsIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkiaW52YWxpZCBvcHRpb25zIDEiIFwKKwkiISBnaXQtY29tbWl0IC1tIGZvbyAtbSBiYXIgLUYgZmlsZSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJImludmFsaWQgb3B0aW9ucyAyIiBcCisJIiEgZ2l0LWNvbW1pdCAtQyBIRUFEIC1tIGlsbGVnYWwiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJ1c2luZyBwYXRocyB3aXRoIC1hIiBcCisJImVjaG8gS2luZyBvZiB0aGUgYm9uZ28gPmZpbGUgJiYKKwkhIGdpdC1jb21taXQgLW0gZm9vIC1hIGZpbGUiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJ1c2luZyBwYXRocyB3aXRoIC0taW50ZXJhY3RpdmUiIFwKKwkiZWNobyBib25nLW8tYm9uZyA+ZmlsZSAmJgorCSEgZWNobyA3IHwgZ2l0LWNvbW1pdCAtbSBmb28gLS1pbnRlcmFjdGl2ZSBmaWxlIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkidXNpbmcgaW52YWxpZCBjb21taXQgd2l0aCAtQyIgXAorCSIhIGdpdC1jb21taXQgLUMgYm9ndXMiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJ0ZXN0aW5nIG5vdGhpbmcgdG8gY29tbWl0IiBcCisJIiEgZ2l0LWNvbW1pdCAtbSBpbml0aWFsIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkibmV4dCBjb21taXQiIFwKKwkiZWNobyAnYm9uZ28gYm9uZ28gYm9uZ28nID5maWxlIFwKKwkgZ2l0LWNvbW1pdCAtbSBuZXh0IC1hIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkiY29tbWl0IG1lc3NhZ2UgZnJvbSBub24tZXhpc3RpbmcgZmlsZSIgXAorCSJlY2hvICdtb3JlIGJvbmdvOiBib25nbyBib25nbyBib25nbyBib25nbycgPmZpbGUgJiYgXAorCSAhIGdpdC1jb21taXQgLUYgZ2FoIC1hIgorCisjIEVtcHR5IGV4Y2VwdCBzdHJheSB0YWJzIGFuZCBzcGFjZXMgb24gYSBmZXcgbGluZXMuCitzZWQgLWUgJ3MvQCQvLycgPm1zZyA8PEVPRgorCQlACisKKyAgQAorU2lnbmVkLW9mZi1ieTogaHVsYQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkiZW1wdHkgY29tbWl0IG1lc3NhZ2UiIFwKKwkiISBnaXQtY29tbWl0IC1GIG1zZyAtYSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJImNvbW1pdCBtZXNzYWdlIGZyb20gZmlsZSIgXAorCSJlY2hvICd0aGlzIGlzIHRoZSBjb21taXQgbWVzc2FnZSwgY29taW5nIGZyb20gYSBmaWxlJyA+bXNnICYmIFwKKwkgZ2l0LWNvbW1pdCAtRiBtc2cgLWEiCisKK2NhdCA+ZWRpdG9yIDw8XEVPRgorIyEvYmluL3NoCitzZWQgLWUgInMvYSBmaWxlL2FuIGFtZW5kIGNvbW1pdC9nIiA8ICQxID4gJDEtCittdiAkMS0gJDEKK0VPRgorY2htb2QgNzU1IGVkaXRvcgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkiYW1lbmQgY29tbWl0IiBcCisJIlZJU1VBTD0uL2VkaXRvciBnaXQtY29tbWl0IC0tYW1lbmQiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJwYXNzaW5nIC1tIGFuZCAtRiIgXAorCSJlY2hvICdlbm91Z2ggd2l0aCB0aGUgYm9uZ29zJyA+ZmlsZSAmJiBcCisJICEgZ2l0LWNvbW1pdCAtRiBtc2cgLW0gYW1lbmRpbmcgLiIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJInVzaW5nIG1lc3NhZ2UgZnJvbSBvdGhlciBjb21taXQiIFwKKwkiZ2l0LWNvbW1pdCAtQyBIRUFEXiAuIgorCitjYXQgPmVkaXRvciA8PFxFT0YKKyMhL2Jpbi9zaAorc2VkIC1lICJzL2FtZW5kL29sZGVyL2ciICA8ICQxID4gJDEtCittdiAkMS0gJDEKK0VPRgorY2htb2QgNzU1IGVkaXRvcgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkiZWRpdGluZyBtZXNzYWdlIGZyb20gb3RoZXIgY29tbWl0IiBcCisJImVjaG8gJ2h1bGEgaHVsYScgPmZpbGUgJiYgXAorCSBWSVNVQUw9Li9lZGl0b3IgZ2l0LWNvbW1pdCAtYyBIRUFEXiAtYSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJIm1lc3NhZ2UgZnJvbSBzdGRpbiIgXAorCSJlY2hvICdzaWxseSBuZXcgY29udGVudHMnID5maWxlICYmIFwKKwkgZWNobyBjb21taXQgbWVzc2FnZSBmcm9tIHN0ZGluIHwgZ2l0LWNvbW1pdCAtRiAtIC1hIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkib3ZlcnJpZGluZyBhdXRob3IgZnJvbSBjb21tYW5kIGxpbmUiIFwKKwkiZWNobyAnZ2FrJyA+ZmlsZSAmJiBcCisJIGdpdC1jb21taXQgLW0gJ2F1dGhvcicgLS1hdXRob3IgJ1J1YmJlciBEdWNrIDxyZHVja0Bjb252b3kub3JnPicgLWEiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJpbnRlcmFjdGl2ZSBhZGQiIFwKKwkiZWNobyA3IHwgZ2l0LWNvbW1pdCAtLWludGVyYWN0aXZlIHwgZ3JlcCAnV2hhdCBub3cnIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkic2hvd2luZyBjb21taXR0ZWQgcmV2aXNpb25zIiBcCisJImdpdC1yZXYtbGlzdCBIRUFEID5jdXJyZW50IgorCisjIFdlIGNvdWxkIGp1c3QgY2hlY2sgdGhlIGhlYWQgc2hhMSwgYnV0IGNoZWNraW5nIGVhY2ggY29tbWl0IG1ha2VzIGl0CisjIGVhc2llciB0byBpc29sYXRlIGJ1Z3MuCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis3MmMwZGM5ODU1YjBjOWRhZGNiZmQ1YTMxY2FiMDcyZTBjYjc3NGNhCis5Yjg4ZmMxNGNlNmIzMmUzZDllZTAyMTUzMWE1NGYxOGE1Y2YzOGEyCiszNTM2YmJiMzUyYzNhMWVmOWE0MjBmNWI0MjQyZDQ4NTc4YjkyYWE3CitkMzgxYWM0MzE4MDZlNTNmM2RkN2FjMmYxYWUwNTM0ZjM2ZDczOGI5Cis0ZmQ0NDA5NWFkNjMzNGYzZWY3MmU0YzVlYzhkZGYxMDgxNzRiNTRhCis0MDI3MDJiNDkxMzZlNzU4N2RhYTkyODBlOTFlNGJiN2NiMjE3OWY3CitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIGdpdC1yZXYtbGlzdCBvdXRwdXQuJyBcCisgICAgJ2RpZmYgY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncGFydGlhbCBjb21taXQgdGhhdCBpbnZvbHZlcyByZW1vdmFsICgxKScgJworCisJZ2l0IHJtIC0tY2FjaGVkIGZpbGUgJiYKKwltdiBmaWxlIGVsaWYgJiYKKwlnaXQgYWRkIGVsaWYgJiYKKwlnaXQgY29tbWl0IC1tICJQYXJ0aWFsOiBhZGQgZWxpZiIgZWxpZiAmJgorCWdpdCBkaWZmLXRyZWUgLS1uYW1lLXN0YXR1cyBIRUFEXiBIRUFEID5jdXJyZW50ICYmCisJZWNobyAiQQllbGlmIiA+ZXhwZWN0ZWQgJiYKKwlkaWZmIGV4cGVjdGVkIGN1cnJlbnQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwYXJ0aWFsIGNvbW1pdCB0aGF0IGludm9sdmVzIHJlbW92YWwgKDIpJyAnCisKKwlnaXQgY29tbWl0IC1tICJQYXJ0aWFsOiByZW1vdmUgZmlsZSIgZmlsZSAmJgorCWdpdCBkaWZmLXRyZWUgLS1uYW1lLXN0YXR1cyBIRUFEXiBIRUFEID5jdXJyZW50ICYmCisJZWNobyAiRAlmaWxlIiA+ZXhwZWN0ZWQgJiYKKwlkaWZmIGV4cGVjdGVkIGN1cnJlbnQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwYXJ0aWFsIGNvbW1pdCB0aGF0IGludm9sdmVzIHJlbW92YWwgKDMpJyAnCisKKwlnaXQgcm0gLS1jYWNoZWQgZWxpZiAmJgorCWVjaG8gZWxpZiA+ZWxpZiAmJgorCWdpdCBjb21taXQgLW0gIlBhcnRpYWw6IG1vZGlmeSBlbGlmIiBlbGlmICYmCisJZ2l0IGRpZmYtdHJlZSAtLW5hbWUtc3RhdHVzIEhFQUReIEhFQUQgPmN1cnJlbnQgJiYKKwllY2hvICJNCWVsaWYiID5leHBlY3RlZCAmJgorCWRpZmYgZXhwZWN0ZWQgY3VycmVudAorCisnCisKK2F1dGhvcj0iVGhlIFJlYWwgQXV0aG9yIDxzb21lZ3V5QGhpcy5lbWFpbC5vcmc+IgordGVzdF9leHBlY3Rfc3VjY2VzcyAnYW1lbmQgY29tbWl0IHRvIGZpeCBhdXRob3InICcKKworCW9sZHRpY2s9JEdJVF9BVVRIT1JfREFURSAmJgorCXRlc3RfdGljayAmJgorCWdpdCByZXNldCAtLWhhcmQgJiYKKwlnaXQgY2F0LWZpbGUgLXAgSEVBRCB8CisJc2VkIC1lICJzL2F1dGhvci4qL2F1dGhvciAkYXV0aG9yICRvbGR0aWNrLyIgXAorCQktZSAicy9eXChjb21taXR0ZXIuKj4gXCkuKiQvXDEkR0lUX0NPTU1JVFRFUl9EQVRFLyIgPiBcCisJCWV4cGVjdGVkICYmCisJZ2l0IGNvbW1pdCAtLWFtZW5kIC0tYXV0aG9yPSIkYXV0aG9yIiAmJgorCWdpdCBjYXQtZmlsZSAtcCBIRUFEID4gY3VycmVudCAmJgorCWRpZmYgZXhwZWN0ZWQgY3VycmVudAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NpZ24gb2ZmICgxKScgJworCisJZWNobyAxID5wb3NpdGl2ZSAmJgorCWdpdCBhZGQgcG9zaXRpdmUgJiYKKwlnaXQgY29tbWl0IC1zIC1tICJ0aGFuayB5b3UiICYmCisJZ2l0IGNhdC1maWxlIGNvbW1pdCBIRUFEIHwgc2VkIC1lICIxLC9eXCQvZCIgPmFjdHVhbCAmJgorCSgKKwkJZWNobyB0aGFuayB5b3UKKwkJZWNobworCQlnaXQgdmFyIEdJVF9DT01NSVRURVJfSURFTlQgfAorCQlzZWQgLWUgInMvPi4qLz4vIiAtZSAicy9eL1NpZ25lZC1vZmYtYnk6IC8iCisJKSA+ZXhwZWN0ZWQgJiYKKwl0ZXN0X2NtcCBleHBlY3RlZCBhY3R1YWwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzaWduIG9mZiAoMiknICcKKworCWVjaG8gMiA+cG9zaXRpdmUgJiYKKwlnaXQgYWRkIHBvc2l0aXZlICYmCisJZXhpc3Rpbmc9IlNpZ25lZC1vZmYtYnk6IFdhdGNoIFRoaXMgPHdhdGNodGhpc0BleGFtcGxlLmNvbT4iICYmCisJZ2l0IGNvbW1pdCAtcyAtbSAidGhhbmsgeW91CisKKyRleGlzdGluZyIgJiYKKwlnaXQgY2F0LWZpbGUgY29tbWl0IEhFQUQgfCBzZWQgLWUgIjEsL15cJC9kIiA+YWN0dWFsICYmCisJKAorCQllY2hvIHRoYW5rIHlvdQorCQllY2hvCisJCWVjaG8gJGV4aXN0aW5nCisJCWdpdCB2YXIgR0lUX0NPTU1JVFRFUl9JREVOVCB8CisJCXNlZCAtZSAicy8+LiovPi8iIC1lICJzL14vU2lnbmVkLW9mZi1ieTogLyIKKwkpID5leHBlY3RlZCAmJgorCXRlc3RfY21wIGV4cGVjdGVkIGFjdHVhbAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ211bHRpcGxlIC1tJyAnCisKKwk+bmVnYXRpdmUgJiYKKwlnaXQgYWRkIG5lZ2F0aXZlICYmCisJZ2l0IGNvbW1pdCAtbSAib25lIiAtbSAidHdvIiAtbSAidGhyZWUiICYmCisJZ2l0IGNhdC1maWxlIGNvbW1pdCBIRUFEIHwgc2VkIC1lICIxLC9eXCQvZCIgPmFjdHVhbCAmJgorCSgKKwkJZWNobyBvbmUKKwkJZWNobworCQllY2hvIHR3bworCQllY2hvCisJCWVjaG8gdGhyZWUKKwkpID5leHBlY3RlZCAmJgorCXRlc3RfY21wIGV4cGVjdGVkIGFjdHVhbAorCisnCisKK2F1dGhvcj0iVGhlIFJlYWwgQXV0aG9yIDxzb21lZ3V5QGhpcy5lbWFpbC5vcmc+IgordGVzdF9leHBlY3Rfc3VjY2VzcyAnYW1lbmQgY29tbWl0IHRvIGZpeCBhdXRob3InICcKKworCW9sZHRpY2s9JEdJVF9BVVRIT1JfREFURSAmJgorCXRlc3RfdGljayAmJgorCWdpdCByZXNldCAtLWhhcmQgJiYKKwlnaXQgY2F0LWZpbGUgLXAgSEVBRCB8CisJc2VkIC1lICJzL2F1dGhvci4qL2F1dGhvciAkYXV0aG9yICRvbGR0aWNrLyIgXAorCQktZSAicy9eXChjb21taXR0ZXIuKj4gXCkuKiQvXDEkR0lUX0NPTU1JVFRFUl9EQVRFLyIgPiBcCisJCWV4cGVjdGVkICYmCisJZ2l0IGNvbW1pdCAtLWFtZW5kIC0tYXV0aG9yPSIkYXV0aG9yIiAmJgorCWdpdCBjYXQtZmlsZSAtcCBIRUFEID4gY3VycmVudCAmJgorCWRpZmYgZXhwZWN0ZWQgY3VycmVudAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBjb21taXQgPGZpbGU+IHdpdGggZGlydHkgaW5kZXgnICcKKwllY2hvIHRhY29jYXQgPiBlbGlmICYmCisJZWNobyB0ZWhsdWx6ID4gY2h6ICYmCisJZ2l0IGFkZCBjaHogJiYKKwlnaXQgY29tbWl0IGVsaWYgLW0gInRhY29jYXQgaXMgYSBwYWxpbmRyb21lIiAmJgorCWdpdCBzaG93IC0tc3RhdCB8IGdyZXAgZWxpZiAmJgorCWdpdCBkaWZmIC0tY2FjaGVkIHwgZ3JlcCBjaHoKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2FtZSB0cmVlIChzaW5nbGUgcGFyZW50KScgJworCisJZ2l0IHJlc2V0IC0taGFyZAorCisJaWYgZ2l0IGNvbW1pdCAtbSBlbXB0eQorCXRoZW4KKwkJZWNobyBvb3BzIC0tIHNob3VsZCBoYXZlIGNvbXBsYWluZWQKKwkJZmFsc2UKKwllbHNlCisJCTogaGFwcHkKKwlmaQorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NhbWUgdHJlZSAoc2luZ2xlIHBhcmVudCkgLS1hbGxvdy1lbXB0eScgJworCisJZ2l0IGNvbW1pdCAtLWFsbG93LWVtcHR5IC1tICJmb3JjZWQgZW1wdHkiICYmCisJZ2l0IGNhdC1maWxlIGNvbW1pdCBIRUFEIHwgZ3JlcCBmb3JjZWQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzYW1lIHRyZWUgKG1lcmdlIGFuZCBhbWVuZCBtZXJnZSknICcKKworCWdpdCBjaGVja291dCAtYiBzaWRlIEhFQUReICYmCisJZWNobyB6ZXJvID56ZXJvICYmCisJZ2l0IGFkZCB6ZXJvICYmCisJZ2l0IGNvbW1pdCAtbSAiYWRkIHplcm8iICYmCisJZ2l0IGNoZWNrb3V0IG1hc3RlciAmJgorCisJZ2l0IG1lcmdlIC1zIG91cnMgc2lkZSAtbSAiZW1wdHkgb2siICYmCisJZ2l0IGRpZmYgSEVBRF4gSEVBRCA+YWN0dWFsICYmCisJOiA+ZXhwZWN0ZWQgJiYKKwl0ZXN0X2NtcCBleHBlY3RlZCBhY3R1YWwgJiYKKworCWdpdCBjb21taXQgLS1hbWVuZCAtbSAiZW1wdHkgcmVhbGx5IG9rIiAmJgorCWdpdCBkaWZmIEhFQUReIEhFQUQgPmFjdHVhbCAmJgorCTogPmV4cGVjdGVkICYmCisJdGVzdF9jbXAgZXhwZWN0ZWQgYWN0dWFsCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYW1lbmQgdXNpbmcgdGhlIG1lc3NhZ2UgZnJvbSBhbm90aGVyIGNvbW1pdCcgJworCisJZ2l0IHJlc2V0IC0taGFyZCAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLS1hbGxvdy1lbXB0eSAtbSAib2xkIGNvbW1pdCIgJiYKKwlvbGQ9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtLWFsbG93LWVtcHR5IC1tICJuZXcgY29tbWl0IiAmJgorCW5ldz0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC0tYWxsb3ctZW1wdHkgLS1hbWVuZCAtQyAiJG9sZCIgJiYKKwlnaXQgc2hvdyAtLXByZXR0eT0iZm9ybWF0OiVhZCAlcyIgIiRvbGQiID5leHBlY3RlZCAmJgorCWdpdCBzaG93IC0tcHJldHR5PSJmb3JtYXQ6JWFkICVzIiBIRUFEID5hY3R1YWwgJiYKKwl0ZXN0X2NtcCBleHBlY3RlZCBhY3R1YWwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhbWVuZCB1c2luZyB0aGUgbWVzc2FnZSBmcm9tIGEgY29tbWl0IG5hbWVkIHdpdGggdGFnJyAnCisKKwlnaXQgcmVzZXQgLS1oYXJkICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtLWFsbG93LWVtcHR5IC1tICJvbGQgY29tbWl0IiAmJgorCW9sZD0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkgJiYKKwlnaXQgdGFnIC1hIC1tICJ0YWcgb24gb2xkIiB0YWdnZWQtb2xkIEhFQUQgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC0tYWxsb3ctZW1wdHkgLW0gIm5ldyBjb21taXQiICYmCisJbmV3PSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKSAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLS1hbGxvdy1lbXB0eSAtLWFtZW5kIC1DIHRhZ2dlZC1vbGQgJiYKKwlnaXQgc2hvdyAtLXByZXR0eT0iZm9ybWF0OiVhZCAlcyIgIiRvbGQiID5leHBlY3RlZCAmJgorCWdpdCBzaG93IC0tcHJldHR5PSJmb3JtYXQ6JWFkICVzIiBIRUFEID5hY3R1YWwgJiYKKwl0ZXN0X2NtcCBleHBlY3RlZCBhY3R1YWwKKworJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDc1MDItY29tbWl0LnNoIGIvdC90NzUwMi1jb21taXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjg0Yzk0MQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDc1MDItY29tbWl0LnNoCkBAIC0wLDAgKzEsMTg2IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IGNvbW1pdCBwb3JjZWxhaW4taXNoJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGhlIGJhc2ljcycgJworCisJZWNobyBkb2luZyBwYXJ0aWFsID4iY29tbWl0IGlzIiAmJgorCW1rZGlyIG5vdCAmJgorCWVjaG8gdmVyeSBtdWNoIGVuY291cmFnZWQgYnV0IHdlIHNob3VsZCA+bm90L2ZvcmJpZCAmJgorCWdpdCBhZGQgImNvbW1pdCBpcyIgbm90ICYmCisJZWNobyB1cGRhdGUgYWRkZWQgImNvbW1pdCBpcyIgZmlsZSA+ImNvbW1pdCBpcyIgJiYKKwllY2hvIGFsc28gdXBkYXRlIGFub3RoZXIgPm5vdC9mb3JiaWQgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJpbml0aWFsIHdpdGggLWEiICYmCisKKwlnaXQgY2F0LWZpbGUgYmxvYiBIRUFEOiJjb21taXQgaXMiID5jdXJyZW50LjEgJiYKKwlnaXQgY2F0LWZpbGUgYmxvYiBIRUFEOm5vdC9mb3JiaWQgPmN1cnJlbnQuMiAmJgorCisJY21wIGN1cnJlbnQuMSAiY29tbWl0IGlzIiAmJgorCWNtcCBjdXJyZW50LjIgbm90L2ZvcmJpZAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3BhcnRpYWwnICcKKworCWVjaG8gYW5vdGhlciA+ImNvbW1pdCBpcyIgJiYKKwllY2hvIGFub3RoZXIgPm5vdC9mb3JiaWQgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tICJwYXJ0aWFsIGNvbW1pdCB0byBoYW5kbGUgYSBmaWxlIiAiY29tbWl0IGlzIiAmJgorCisJY2hhbmdlZD0kKGdpdCBkaWZmLXRyZWUgLS1uYW1lLW9ubHkgSEVBRF4gSEVBRCkgJiYKKwl0ZXN0ICIkY2hhbmdlZCIgPSAiY29tbWl0IGlzIgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3BhcnRpYWwgbW9kaWZpY2F0aW9uIGluIGEgc3ViZGlyZWNvdHJ5JyAnCisKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tICJwYXJ0aWFsIGNvbW1pdCB0byBzdWJkaXJlY3RvcnkiIG5vdCAmJgorCisJY2hhbmdlZD0kKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgSEVBRF4gSEVBRCkgJiYKKwl0ZXN0ICIkY2hhbmdlZCIgPSAibm90L2ZvcmJpZCIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwYXJ0aWFsIHJlbW92YWwnICcKKworCWdpdCBybSBub3QvZm9yYmlkICYmCisJZ2l0IGNvbW1pdCAtbSAicGFydGlhbCBjb21taXQgdG8gcmVtb3ZlIG5vdC9mb3JiaWQiIG5vdCAmJgorCisJY2hhbmdlZD0kKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgSEVBRF4gSEVBRCkgJiYKKwl0ZXN0ICIkY2hhbmdlZCIgPSAibm90L2ZvcmJpZCIgJiYKKwlyZW1haW49JChnaXQgbHMtdHJlZSAtciAtLW5hbWUtb25seSBIRUFEKSAmJgorCXRlc3QgIiRyZW1haW4iID0gImNvbW1pdCBpcyIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzaWduIG9mZicgJworCisJPnBvc2l0aXZlICYmCisJZ2l0IGFkZCBwb3NpdGl2ZSAmJgorCWdpdCBjb21taXQgLXMgLW0gInRoYW5rIHlvdSIgJiYKKwlhY3R1YWw9JChnaXQgY2F0LWZpbGUgY29tbWl0IEhFQUQgfCBzZWQgLW5lICJzL1NpZ25lZC1vZmYtYnk6IC8vcCIpICYmCisJZXhwZWN0ZWQ9JChnaXQgdmFyIEdJVF9DT01NSVRURVJfSURFTlQgfCBzZWQgLWUgInMvPi4qLz4vIikgJiYKKwl0ZXN0ICJ6JGFjdHVhbCIgPSAieiRleHBlY3RlZCIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtdWx0aXBsZSAtbScgJworCisJPm5lZ2F0aXZlICYmCisJZ2l0IGFkZCBuZWdhdGl2ZSAmJgorCWdpdCBjb21taXQgLW0gIm9uZSIgLW0gInR3byIgLW0gInRocmVlIiAmJgorCWFjdHVhbD0kKGdpdCBjYXQtZmlsZSBjb21taXQgSEVBRCB8IHNlZCAtZSAiMSwvXlwkL2QiKSAmJgorCWV4cGVjdGVkPSQoZWNobyBvbmU7IGVjaG87IGVjaG8gdHdvOyBlY2hvOyBlY2hvIHRocmVlKSAmJgorCXRlc3QgInokYWN0dWFsIiA9ICJ6JGV4cGVjdGVkIgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ZlcmJvc2UnICcKKworCWVjaG8gbWludXMgPm5lZ2F0aXZlICYmCisJZ2l0IGFkZCBuZWdhdGl2ZSAmJgorCWdpdCBzdGF0dXMgLXYgfCBzZWQgLW5lICIvXmRpZmYgLS1naXQgL3AiID5hY3R1YWwgJiYKKwllY2hvICJkaWZmIC0tZ2l0IGEvbmVnYXRpdmUgYi9uZWdhdGl2ZSIgPmV4cGVjdCAmJgorCXRlc3RfY21wIGV4cGVjdCBhY3R1YWwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjbGVhbnVwIGNvbW1pdCBtZXNzYWdlcyAodmVyYmF0aW0sLXQpJyAnCisKKwllY2hvID4+bmVnYXRpdmUgJiYKKwl7IGVjaG87ZWNobyAiIyB0ZXh0IjtlY2hvOyB9ID5leHBlY3QgJiYKKwlnaXQgY29tbWl0IC0tY2xlYW51cD12ZXJiYXRpbSAtdCBleHBlY3QgLWEgJiYKKwlnaXQgY2F0LWZpbGUgLXAgSEVBRCB8c2VkIC1lICIxLC9eXCQvZCIgfGhlYWQgLW4gMyA+YWN0dWFsICYmCisJdGVzdF9jbXAgZXhwZWN0IGFjdHVhbAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NsZWFudXAgY29tbWl0IG1lc3NhZ2VzICh2ZXJiYXRpbSwtRiknICcKKworCWVjaG8gPj5uZWdhdGl2ZSAmJgorCWdpdCBjb21taXQgLS1jbGVhbnVwPXZlcmJhdGltIC1GIGV4cGVjdCAtYSAmJgorCWdpdCBjYXQtZmlsZSAtcCBIRUFEIHxzZWQgLWUgIjEsL15cJC9kIj5hY3R1YWwgJiYKKwl0ZXN0X2NtcCBleHBlY3QgYWN0dWFsCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2xlYW51cCBjb21taXQgbWVzc2FnZXMgKHZlcmJhdGltLC1tKScgJworCisJZWNobyA+Pm5lZ2F0aXZlICYmCisJZ2l0IGNvbW1pdCAtLWNsZWFudXA9dmVyYmF0aW0gLW0gIiQoY2F0IGV4cGVjdCkiIC1hICYmCisJZ2l0IGNhdC1maWxlIC1wIEhFQUQgfHNlZCAtZSAiMSwvXlwkL2QiPmFjdHVhbCAmJgorCXRlc3RfY21wIGV4cGVjdCBhY3R1YWwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjbGVhbnVwIGNvbW1pdCBtZXNzYWdlcyAod2hpdGVzcGFjZSwtRiknICcKKworCWVjaG8gPj5uZWdhdGl2ZSAmJgorCXsgZWNobztlY2hvICIjIHRleHQiO2VjaG87IH0gPnRleHQgJiYKKwllY2hvICIjIHRleHQiID5leHBlY3QgJiYKKwlnaXQgY29tbWl0IC0tY2xlYW51cD13aGl0ZXNwYWNlIC1GIHRleHQgLWEgJiYKKwlnaXQgY2F0LWZpbGUgLXAgSEVBRCB8c2VkIC1lICIxLC9eXCQvZCI+YWN0dWFsICYmCisJdGVzdF9jbXAgZXhwZWN0IGFjdHVhbAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NsZWFudXAgY29tbWl0IG1lc3NhZ2VzIChzdHJpcCwtRiknICcKKworCWVjaG8gPj5uZWdhdGl2ZSAmJgorCXsgZWNobztlY2hvICIjIHRleHQiO2VjaG8gc2FtcGxlO2VjaG87IH0gPnRleHQgJiYKKwllY2hvIHNhbXBsZSA+ZXhwZWN0ICYmCisJZ2l0IGNvbW1pdCAtLWNsZWFudXA9c3RyaXAgLUYgdGV4dCAtYSAmJgorCWdpdCBjYXQtZmlsZSAtcCBIRUFEIHxzZWQgLWUgIjEsL15cJC9kIj5hY3R1YWwgJiYKKwl0ZXN0X2NtcCBleHBlY3QgYWN0dWFsCisKKycKKworZWNobyAic2FtcGxlCisKKyMgUGxlYXNlIGVudGVyIHRoZSBjb21taXQgbWVzc2FnZSBmb3IgeW91ciBjaGFuZ2VzLgorIyAoQ29tbWVudCBsaW5lcyBzdGFydGluZyB3aXRoICcjJyB3aWxsIG5vdCBiZSBpbmNsdWRlZCkiID5leHBlY3QKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2xlYW51cCBjb21taXQgbWVzc2FnZXMgKHN0cmlwLC1GLC1lKScgJworCisJZWNobyA+Pm5lZ2F0aXZlICYmCisJeyBlY2hvO2VjaG8gc2FtcGxlO2VjaG87IH0gPnRleHQgJiYKKwlnaXQgY29tbWl0IC1lIC1GIHRleHQgLWEgJiYKKwloZWFkIC1uIDQgLmdpdC9DT01NSVRfRURJVE1TRyA+YWN0dWFsICYmCisJdGVzdF9jbXAgZXhwZWN0IGFjdHVhbAorCisnCisKK3B3ZD1gcHdkYAorY2F0ID4+IC5naXQvRkFLRV9FRElUT1IgPDwgRU9GCisjISAvYmluL3NoCitlY2hvIGVkaXRvciBzdGFydGVkID4gIiRwd2QvLmdpdC9yZXN1bHQiCitleGl0IDAKK0VPRgorY2htb2QgK3ggLmdpdC9GQUtFX0VESVRPUgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdkbyBub3QgZmlyZSBlZGl0b3IgaW4gdGhlIHByZXNlbmNlIG9mIGNvbmZsaWN0cycgJworCisJZ2l0IGNsZWFuCisJZWNobyBmPmcKKwlnaXQgYWRkIGcKKwlnaXQgY29tbWl0IC1teWVzCisJZ2l0IGJyYW5jaCBzZWNvbmQKKwllY2hvIG1hc3Rlcj5nCisJZWNobyBnPmgKKwlnaXQgYWRkIGcgaAorCWdpdCBjb21taXQgLW1tYXN0ZXIKKwlnaXQgY2hlY2tvdXQgc2Vjb25kCisJZWNobyBzZWNvbmQ+ZworCWdpdCBhZGQgZworCWdpdCBjb21taXQgLW1zZWNvbmQKKwlnaXQgY2hlcnJ5LXBpY2sgLW4gbWFzdGVyCisJZWNobyAiZWRpdG9yIG5vdCBzdGFydGVkIiA+IC5naXQvcmVzdWx0CisJR0lUX0VESVRPUj1gcHdkYC8uZ2l0L0ZBS0VfRURJVE9SIGdpdCBjb21taXQgJiYgZXhpdCAxICAjIHNob3VsZCBmYWlsCisJdGVzdCAiYGNhdCAuZ2l0L3Jlc3VsdGAiID0gImVkaXRvciBub3Qgc3RhcnRlZCIKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q3NTAyLXN0YXR1cy5zaCBiL3QvdDc1MDItc3RhdHVzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNkMDg1MTYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3NTAyLXN0YXR1cy5zaApAQCAtMCwwICsxLDE1MiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBKb2hhbm5lcyBFLiBTY2hpbmRlbGluCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1zdGF0dXMnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCcgJworCTogPiB0cmFja2VkICYmCisJOiA+IG1vZGlmaWVkICYmCisJbWtkaXIgZGlyMSAmJgorCTogPiBkaXIxL3RyYWNrZWQgJiYKKwk6ID4gZGlyMS9tb2RpZmllZCAmJgorCW1rZGlyIGRpcjIgJiYKKwk6ID4gZGlyMS90cmFja2VkICYmCisJOiA+IGRpcjEvbW9kaWZpZWQgJiYKKwlnaXQgYWRkIC4gJiYKKworCWdpdCBzdGF0dXMgPm91dHB1dCAmJgorCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSBpbml0aWFsICYmCisJOiA+IHVudHJhY2tlZCAmJgorCTogPiBkaXIxL3VudHJhY2tlZCAmJgorCTogPiBkaXIyL3VudHJhY2tlZCAmJgorCWVjaG8gMSA+IGRpcjEvbW9kaWZpZWQgJiYKKwllY2hvIDIgPiBkaXIyL21vZGlmaWVkICYmCisJZWNobyAzID4gZGlyMi9hZGRlZCAmJgorCWdpdCBhZGQgZGlyMi9hZGRlZAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzdGF0dXMgKDEpJyAnCisKKwlncmVwICJ1c2UgXCJnaXQgcm0gLS1jYWNoZWQgPGZpbGU+XC5cLlwuXCIgdG8gdW5zdGFnZSIgb3V0cHV0CisKKycKKworY2F0ID4gZXhwZWN0IDw8IFxFT0YKKyMgT24gYnJhbmNoIG1hc3RlcgorIyBDaGFuZ2VzIHRvIGJlIGNvbW1pdHRlZDoKKyMgICAodXNlICJnaXQgcmVzZXQgSEVBRCA8ZmlsZT4uLi4iIHRvIHVuc3RhZ2UpCisjCisjCW5ldyBmaWxlOiAgIGRpcjIvYWRkZWQKKyMKKyMgQ2hhbmdlZCBidXQgbm90IHVwZGF0ZWQ6CisjICAgKHVzZSAiZ2l0IGFkZCA8ZmlsZT4uLi4iIHRvIHVwZGF0ZSB3aGF0IHdpbGwgYmUgY29tbWl0dGVkKQorIworIwltb2RpZmllZDogICBkaXIxL21vZGlmaWVkCisjCisjIFVudHJhY2tlZCBmaWxlczoKKyMgICAodXNlICJnaXQgYWRkIDxmaWxlPi4uLiIgdG8gaW5jbHVkZSBpbiB3aGF0IHdpbGwgYmUgY29tbWl0dGVkKQorIworIwlkaXIxL3VudHJhY2tlZAorIwlkaXIyL21vZGlmaWVkCisjCWRpcjIvdW50cmFja2VkCisjCWV4cGVjdAorIwlvdXRwdXQKKyMJdW50cmFja2VkCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc3RhdHVzICgyKScgJworCisJZ2l0IHN0YXR1cyA+IG91dHB1dCAmJgorCWdpdCBkaWZmIGV4cGVjdCBvdXRwdXQKKworJworCitjYXQgPiBleHBlY3QgPDwgXEVPRgorIyBPbiBicmFuY2ggbWFzdGVyCisjIENoYW5nZXMgdG8gYmUgY29tbWl0dGVkOgorIyAgICh1c2UgImdpdCByZXNldCBIRUFEIDxmaWxlPi4uLiIgdG8gdW5zdGFnZSkKKyMKKyMJbmV3IGZpbGU6ICAgLi4vZGlyMi9hZGRlZAorIworIyBDaGFuZ2VkIGJ1dCBub3QgdXBkYXRlZDoKKyMgICAodXNlICJnaXQgYWRkIDxmaWxlPi4uLiIgdG8gdXBkYXRlIHdoYXQgd2lsbCBiZSBjb21taXR0ZWQpCisjCisjCW1vZGlmaWVkOiAgIG1vZGlmaWVkCisjCisjIFVudHJhY2tlZCBmaWxlczoKKyMgICAodXNlICJnaXQgYWRkIDxmaWxlPi4uLiIgdG8gaW5jbHVkZSBpbiB3aGF0IHdpbGwgYmUgY29tbWl0dGVkKQorIworIwl1bnRyYWNrZWQKKyMJLi4vZGlyMi9tb2RpZmllZAorIwkuLi9kaXIyL3VudHJhY2tlZAorIwkuLi9leHBlY3QKKyMJLi4vb3V0cHV0CisjCS4uL3VudHJhY2tlZAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N0YXR1cyB3aXRoIHJlbGF0aXZlIHBhdGhzJyAnCisKKwkoY2QgZGlyMSAmJiBnaXQgc3RhdHVzKSA+IG91dHB1dCAmJgorCWdpdCBkaWZmIGV4cGVjdCBvdXRwdXQKKworJworCitjYXQgPiBleHBlY3QgPDwgXEVPRgorIyBPbiBicmFuY2ggbWFzdGVyCisjIENoYW5nZXMgdG8gYmUgY29tbWl0dGVkOgorIyAgICh1c2UgImdpdCByZXNldCBIRUFEIDxmaWxlPi4uLiIgdG8gdW5zdGFnZSkKKyMKKyMJbmV3IGZpbGU6ICAgZGlyMi9hZGRlZAorIworIyBDaGFuZ2VkIGJ1dCBub3QgdXBkYXRlZDoKKyMgICAodXNlICJnaXQgYWRkIDxmaWxlPi4uLiIgdG8gdXBkYXRlIHdoYXQgd2lsbCBiZSBjb21taXR0ZWQpCisjCisjCW1vZGlmaWVkOiAgIGRpcjEvbW9kaWZpZWQKKyMKKyMgVW50cmFja2VkIGZpbGVzOgorIyAgICh1c2UgImdpdCBhZGQgPGZpbGU+Li4uIiB0byBpbmNsdWRlIGluIHdoYXQgd2lsbCBiZSBjb21taXR0ZWQpCisjCisjCWRpcjEvdW50cmFja2VkCisjCWRpcjIvbW9kaWZpZWQKKyMJZGlyMi91bnRyYWNrZWQKKyMJZXhwZWN0CisjCW91dHB1dAorIwl1bnRyYWNrZWQKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzdGF0dXMgd2l0aG91dCByZWxhdGl2ZSBwYXRocycgJworCisJZ2l0IGNvbmZpZyBzdGF0dXMucmVsYXRpdmVQYXRocyBmYWxzZQorCShjZCBkaXIxICYmIGdpdCBzdGF0dXMpID4gb3V0cHV0ICYmCisJZ2l0IGRpZmYgZXhwZWN0IG91dHB1dAorCisnCisKK2NhdCA8PEVPRiA+ZXhwZWN0CisjIE9uIGJyYW5jaCBtYXN0ZXIKKyMgQ2hhbmdlcyB0byBiZSBjb21taXR0ZWQ6CisjICAgKHVzZSAiZ2l0IHJlc2V0IEhFQUQgPGZpbGU+Li4uIiB0byB1bnN0YWdlKQorIworIwltb2RpZmllZDogICBkaXIxL21vZGlmaWVkCisjCisjIFVudHJhY2tlZCBmaWxlczoKKyMgICAodXNlICJnaXQgYWRkIDxmaWxlPi4uLiIgdG8gaW5jbHVkZSBpbiB3aGF0IHdpbGwgYmUgY29tbWl0dGVkKQorIworIwlkaXIxL3VudHJhY2tlZAorIwlkaXIyLworIwlleHBlY3QKKyMJb3V0cHV0CisjCXVudHJhY2tlZAorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzdGF0dXMgb2YgcGFydGlhbCBjb21taXQgZXhjbHVkaW5nIG5ldyBmaWxlIGluIGluZGV4JyAnCisJZ2l0IHN0YXR1cyBkaXIxL21vZGlmaWVkID5vdXRwdXQgJiYKKwl0ZXN0X2NtcCBleHBlY3Qgb3V0cHV0CisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NzUwMy1wcmUtY29tbWl0LWhvb2suc2ggYi90L3Q3NTAzLXByZS1jb21taXQtaG9vay5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZGQ1YTVlCi0tLSAvZGV2L251bGwKKysrIGIvdC90NzUwMy1wcmUtY29tbWl0LWhvb2suc2gKQEAgLTAsMCArMSw4OCBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J3ByZS1jb21taXQgaG9vaycKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3dpdGggbm8gaG9vaycgJworCisJZWNobyAiZm9vIiA+IGZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwlnaXQgY29tbWl0IC1tICJmaXJzdCIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctLW5vLXZlcmlmeSB3aXRoIG5vIGhvb2snICcKKworCWVjaG8gImJhciIgPiBmaWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJZ2l0IGNvbW1pdCAtLW5vLXZlcmlmeSAtbSAiYmFyIgorCisnCisKKyMgbm93IGluc3RhbGwgaG9vayB0aGF0IGFsd2F5cyBzdWNjZWVkcworSE9PS0RJUj0iJChnaXQgcmV2LXBhcnNlIC0tZ2l0LWRpcikvaG9va3MiCitIT09LPSIkSE9PS0RJUi9wcmUtY29tbWl0IgorbWtkaXIgLXAgIiRIT09LRElSIgorY2F0ID4gIiRIT09LIiA8PEVPRgorIyEvYmluL3NoCitleGl0IDAKK0VPRgorY2htb2QgK3ggIiRIT09LIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd3aXRoIHN1Y2NlZWRpbmcgaG9vaycgJworCisJZWNobyAibW9yZSIgPj4gZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCWdpdCBjb21taXQgLW0gIm1vcmUiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLS1uby12ZXJpZnkgd2l0aCBzdWNjZWVkaW5nIGhvb2snICcKKworCWVjaG8gImV2ZW4gbW9yZSIgPj4gZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCWdpdCBjb21taXQgLS1uby12ZXJpZnkgLW0gImV2ZW4gbW9yZSIKKworJworCisjIG5vdyBhIGhvb2sgdGhhdCBmYWlscworY2F0ID4gIiRIT09LIiA8PEVPRgorIyEvYmluL3NoCitleGl0IDEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd3aXRoIGZhaWxpbmcgaG9vaycgJworCisJZWNobyAiYW5vdGhlciIgPj4gZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCSEgZ2l0IGNvbW1pdCAtbSAiYW5vdGhlciIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctLW5vLXZlcmlmeSB3aXRoIGZhaWxpbmcgaG9vaycgJworCisJZWNobyAic3R1ZmYiID4+IGZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwlnaXQgY29tbWl0IC0tbm8tdmVyaWZ5IC1tICJzdHVmZiIKKworJworCitjaG1vZCAteCAiJEhPT0siCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd3aXRoIG5vbi1leGVjdXRhYmxlIGhvb2snICcKKworCWVjaG8gImNvbnRlbnQiID4+IGZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwlnaXQgY29tbWl0IC1tICJjb250ZW50IgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy0tbm8tdmVyaWZ5IHdpdGggbm9uLWV4ZWN1dGFibGUgaG9vaycgJworCisJZWNobyAibW9yZSBjb250ZW50IiA+PiBmaWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJZ2l0IGNvbW1pdCAtLW5vLXZlcmlmeSAtbSAibW9yZSBjb250ZW50IgorCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NzUwNC1jb21taXQtbXNnLWhvb2suc2ggYi90L3Q3NTA0LWNvbW1pdC1tc2ctaG9vay5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZmYzNmFhCi0tLSAvZGV2L251bGwKKysrIGIvdC90NzUwNC1jb21taXQtbXNnLWhvb2suc2gKQEAgLTAsMCArMSwyMjAgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdjb21taXQtbXNnIGhvb2snCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd3aXRoIG5vIGhvb2snICcKKworCWVjaG8gImZvbyIgPiBmaWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJZ2l0IGNvbW1pdCAtbSAiZmlyc3QiCisKKycKKworIyBzZXQgdXAgZmFrZSBlZGl0b3IgZm9yIGludGVyYWN0aXZlIGVkaXRpbmcKK2NhdCA+IGZha2UtZWRpdG9yIDw8J0VPRicKKyMhL2Jpbi9zaAorY3AgRkFLRV9NU0cgIiQxIgorZXhpdCAwCitFT0YKK2NobW9kICt4IGZha2UtZWRpdG9yCitGQUtFX0VESVRPUj0iJChwd2QpL2Zha2UtZWRpdG9yIgorZXhwb3J0IEZBS0VfRURJVE9SCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3dpdGggbm8gaG9vayAoZWRpdG9yKScgJworCisJZWNobyAibW9yZSBmb28iID4+IGZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwllY2hvICJtb3JlIGZvbyIgPiBGQUtFX01TRyAmJgorCUdJVF9FRElUT1I9IiRGQUtFX0VESVRPUiIgZ2l0IGNvbW1pdAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy0tbm8tdmVyaWZ5IHdpdGggbm8gaG9vaycgJworCisJZWNobyAiYmFyIiA+IGZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwlnaXQgY29tbWl0IC0tbm8tdmVyaWZ5IC1tICJiYXIiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLS1uby12ZXJpZnkgd2l0aCBubyBob29rIChlZGl0b3IpJyAnCisKKwllY2hvICJtb3JlIGJhciIgPiBmaWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJZWNobyAibW9yZSBiYXIiID4gRkFLRV9NU0cgJiYKKwlHSVRfRURJVE9SPSIkRkFLRV9FRElUT1IiIGdpdCBjb21taXQgLS1uby12ZXJpZnkKKworJworCisjIG5vdyBpbnN0YWxsIGhvb2sgdGhhdCBhbHdheXMgc3VjY2VlZHMKK0hPT0tESVI9IiQoZ2l0IHJldi1wYXJzZSAtLWdpdC1kaXIpL2hvb2tzIgorSE9PSz0iJEhPT0tESVIvY29tbWl0LW1zZyIKK21rZGlyIC1wICIkSE9PS0RJUiIKK2NhdCA+ICIkSE9PSyIgPDxFT0YKKyMhL2Jpbi9zaAorZXhpdCAwCitFT0YKK2NobW9kICt4ICIkSE9PSyIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnd2l0aCBzdWNjZWVkaW5nIGhvb2snICcKKworCWVjaG8gIm1vcmUiID4+IGZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwlnaXQgY29tbWl0IC1tICJtb3JlIgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3dpdGggc3VjY2VlZGluZyBob29rIChlZGl0b3IpJyAnCisKKwllY2hvICJtb3JlIG1vcmUiID4+IGZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwllY2hvICJtb3JlIG1vcmUiID4gRkFLRV9NU0cgJiYKKwlHSVRfRURJVE9SPSIkRkFLRV9FRElUT1IiIGdpdCBjb21taXQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctLW5vLXZlcmlmeSB3aXRoIHN1Y2NlZWRpbmcgaG9vaycgJworCisJZWNobyAiZXZlbiBtb3JlIiA+PiBmaWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJZ2l0IGNvbW1pdCAtLW5vLXZlcmlmeSAtbSAiZXZlbiBtb3JlIgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy0tbm8tdmVyaWZ5IHdpdGggc3VjY2VlZGluZyBob29rIChlZGl0b3IpJyAnCisKKwllY2hvICJldmVuIG1vcmUgbW9yZSIgPj4gZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCWVjaG8gImV2ZW4gbW9yZSBtb3JlIiA+IEZBS0VfTVNHICYmCisJR0lUX0VESVRPUj0iJEZBS0VfRURJVE9SIiBnaXQgY29tbWl0IC0tbm8tdmVyaWZ5CisKKycKKworIyBub3cgYSBob29rIHRoYXQgZmFpbHMKK2NhdCA+ICIkSE9PSyIgPDxFT0YKKyMhL2Jpbi9zaAorZXhpdCAxCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnd2l0aCBmYWlsaW5nIGhvb2snICcKKworCWVjaG8gImFub3RoZXIiID4+IGZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwkhIGdpdCBjb21taXQgLW0gImFub3RoZXIiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnd2l0aCBmYWlsaW5nIGhvb2sgKGVkaXRvciknICcKKworCWVjaG8gIm1vcmUgYW5vdGhlciIgPj4gZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCWVjaG8gIm1vcmUgYW5vdGhlciIgPiBGQUtFX01TRyAmJgorCSEgKEdJVF9FRElUT1I9IiRGQUtFX0VESVRPUiIgZ2l0IGNvbW1pdCkKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctLW5vLXZlcmlmeSB3aXRoIGZhaWxpbmcgaG9vaycgJworCisJZWNobyAic3R1ZmYiID4+IGZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwlnaXQgY29tbWl0IC0tbm8tdmVyaWZ5IC1tICJzdHVmZiIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctLW5vLXZlcmlmeSB3aXRoIGZhaWxpbmcgaG9vayAoZWRpdG9yKScgJworCisJZWNobyAibW9yZSBzdHVmZiIgPj4gZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCWVjaG8gIm1vcmUgc3R1ZmYiID4gRkFLRV9NU0cgJiYKKwlHSVRfRURJVE9SPSIkRkFLRV9FRElUT1IiIGdpdCBjb21taXQgLS1uby12ZXJpZnkKKworJworCitjaG1vZCAteCAiJEhPT0siCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd3aXRoIG5vbi1leGVjdXRhYmxlIGhvb2snICcKKworCWVjaG8gImNvbnRlbnQiID4+IGZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwlnaXQgY29tbWl0IC1tICJjb250ZW50IgorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3dpdGggbm9uLWV4ZWN1dGFibGUgaG9vayAoZWRpdG9yKScgJworCisJZWNobyAiY29udGVudCBhZ2FpbiIgPj4gZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCWVjaG8gImNvbnRlbnQgYWdhaW4iID4gRkFLRV9NU0cgJiYKKwlHSVRfRURJVE9SPSIkRkFLRV9FRElUT1IiIGdpdCBjb21taXQgLW0gImNvbnRlbnQgYWdhaW4iCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLS1uby12ZXJpZnkgd2l0aCBub24tZXhlY3V0YWJsZSBob29rJyAnCisKKwllY2hvICJtb3JlIGNvbnRlbnQiID4+IGZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwlnaXQgY29tbWl0IC0tbm8tdmVyaWZ5IC1tICJtb3JlIGNvbnRlbnQiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLS1uby12ZXJpZnkgd2l0aCBub24tZXhlY3V0YWJsZSBob29rIChlZGl0b3IpJyAnCisKKwllY2hvICJldmVuIG1vcmUgY29udGVudCIgPj4gZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCWVjaG8gImV2ZW4gbW9yZSBjb250ZW50IiA+IEZBS0VfTVNHICYmCisJR0lUX0VESVRPUj0iJEZBS0VfRURJVE9SIiBnaXQgY29tbWl0IC0tbm8tdmVyaWZ5CisKKycKKworIyBub3cgYSBob29rIHRoYXQgZWRpdHMgdGhlIGNvbW1pdCBtZXNzYWdlCitjYXQgPiAiJEhPT0siIDw8J0VPRicKKyMhL2Jpbi9zaAorZWNobyAibmV3IG1lc3NhZ2UiID4gIiQxIgorZXhpdCAwCitFT0YKK2NobW9kICt4ICIkSE9PSyIKKworY29tbWl0X21zZ19pcyAoKSB7CisJdGVzdCAiYGdpdCBsb2cgLS1wcmV0dHk9Zm9ybWF0OiVzJWIgLTFgIiA9ICIkMSIKK30KKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaG9vayBlZGl0cyBjb21taXQgbWVzc2FnZScgJworCisJZWNobyAiYWRkaXRpb25hbCIgPj4gZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCWdpdCBjb21taXQgLW0gImFkZGl0aW9uYWwiICYmCisJY29tbWl0X21zZ19pcyAibmV3IG1lc3NhZ2UiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaG9vayBlZGl0cyBjb21taXQgbWVzc2FnZSAoZWRpdG9yKScgJworCisJZWNobyAiYWRkaXRpb25hbCBjb250ZW50IiA+PiBmaWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJZWNobyAiYWRkaXRpb25hbCBjb250ZW50IiA+IEZBS0VfTVNHICYmCisJR0lUX0VESVRPUj0iJEZBS0VfRURJVE9SIiBnaXQgY29tbWl0ICYmCisJY29tbWl0X21zZ19pcyAibmV3IG1lc3NhZ2UiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiaG9vayBkb2Vzbid0IGVkaXQgY29tbWl0IG1lc3NhZ2UiICcKKworCWVjaG8gInBsdXMiID4+IGZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwlnaXQgY29tbWl0IC0tbm8tdmVyaWZ5IC1tICJwbHVzIiAmJgorCWNvbW1pdF9tc2dfaXMgInBsdXMiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiaG9vayBkb2Vzbid0IGVkaXQgY29tbWl0IG1lc3NhZ2UgKGVkaXRvcikiICcKKworCWVjaG8gIm1vcmUgcGx1cyIgPj4gZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCWVjaG8gIm1vcmUgcGx1cyIgPiBGQUtFX01TRyAmJgorCUdJVF9FRElUT1I9IiRGQUtFX0VESVRPUiIgZ2l0IGNvbW1pdCAtLW5vLXZlcmlmeSAmJgorCWNvbW1pdF9tc2dfaXMgIm1vcmUgcGx1cyIKKworJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDc1MDUtcHJlcGFyZS1jb21taXQtbXNnLWhvb2suc2ggYi90L3Q3NTA1LXByZXBhcmUtY29tbWl0LW1zZy1ob29rLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgwMmFhNjIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3NTA1LXByZXBhcmUtY29tbWl0LW1zZy1ob29rLnNoCkBAIC0wLDAgKzEsMTU2IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0ncHJlcGFyZS1jb21taXQtbXNnIGhvb2snCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd3aXRoIG5vIGhvb2snICcKKworCWVjaG8gImZvbyIgPiBmaWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJZ2l0IGNvbW1pdCAtbSAiZmlyc3QiCisKKycKKworIyBzZXQgdXAgZmFrZSBlZGl0b3IgZm9yIGludGVyYWN0aXZlIGVkaXRpbmcKK2NhdCA+IGZha2UtZWRpdG9yIDw8J0VPRicKKyMhL2Jpbi9zaAorZXhpdCAwCitFT0YKK2NobW9kICt4IGZha2UtZWRpdG9yCitGQUtFX0VESVRPUj0iJChwd2QpL2Zha2UtZWRpdG9yIgorZXhwb3J0IEZBS0VfRURJVE9SCisKKyMgbm93IGluc3RhbGwgaG9vayB0aGF0IGFsd2F5cyBzdWNjZWVkcyBhbmQgYWRkcyBhIG1lc3NhZ2UKK0hPT0tESVI9IiQoZ2l0IHJldi1wYXJzZSAtLWdpdC1kaXIpL2hvb2tzIgorSE9PSz0iJEhPT0tESVIvcHJlcGFyZS1jb21taXQtbXNnIgorbWtkaXIgLXAgIiRIT09LRElSIgorZWNobyAiIyEkU0hFTExfUEFUSCIgPiAiJEhPT0siCitjYXQgPj4gIiRIT09LIiA8PCdFT0YnCisKK2lmIHRlc3QgIiQyIiA9IGNvbW1pdDsgdGhlbgorICBzb3VyY2U9JChnaXQtcmV2LXBhcnNlICIkMyIpCitlbHNlCisgIHNvdXJjZT0kezItZGVmYXVsdH0KK2ZpCitpZiB0ZXN0ICIkR0lUX0VESVRPUiIgPSA6OyB0aGVuCisgIHNlZCAtZSAiMXMvLiovJHNvdXJjZSAobm8gZWRpdG9yKS8iICIkMSIgPiBtc2cudG1wCitlbHNlCisgIHNlZCAtZSAiMXMvLiovJHNvdXJjZS8iICIkMSIgPiBtc2cudG1wCitmaQorbXYgbXNnLnRtcCAiJDEiCitleGl0IDAKK0VPRgorY2htb2QgK3ggIiRIT09LIgorCitlY2hvIGR1bW15IHRlbXBsYXRlID4gIiQoZ2l0IHJldi1wYXJzZSAtLWdpdC1kaXIpL3RlbXBsYXRlIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd3aXRoIGhvb2sgKC1tKScgJworCisJZWNobyAibW9yZSIgPj4gZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCWdpdCBjb21taXQgLW0gIm1vcmUiICYmCisJdGVzdCAiYGdpdCBsb2cgLTEgLS1wcmV0dHk9Zm9ybWF0OiVzYCIgPSAibWVzc2FnZSAobm8gZWRpdG9yKSIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd3aXRoIGhvb2sgKC1tIGVkaXRvciknICcKKworCWVjaG8gIm1vcmUiID4+IGZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwlHSVRfRURJVE9SPSIkRkFLRV9FRElUT1IiIGdpdCBjb21taXQgLWUgLW0gIm1vcmUgbW9yZSIgJiYKKwl0ZXN0ICJgZ2l0IGxvZyAtMSAtLXByZXR0eT1mb3JtYXQ6JXNgIiA9IG1lc3NhZ2UKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd3aXRoIGhvb2sgKC10KScgJworCisJZWNobyAibW9yZSIgPj4gZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCWdpdCBjb21taXQgLXQgIiQoZ2l0IHJldi1wYXJzZSAtLWdpdC1kaXIpL3RlbXBsYXRlIiAmJgorCXRlc3QgImBnaXQgbG9nIC0xIC0tcHJldHR5PWZvcm1hdDolc2AiID0gdGVtcGxhdGUKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd3aXRoIGhvb2sgKC1GKScgJworCisJZWNobyAibW9yZSIgPj4gZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCShlY2hvIG1vcmUgfCBnaXQgY29tbWl0IC1GIC0pICYmCisJdGVzdCAiYGdpdCBsb2cgLTEgLS1wcmV0dHk9Zm9ybWF0OiVzYCIgPSAibWVzc2FnZSAobm8gZWRpdG9yKSIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd3aXRoIGhvb2sgKC1GIGVkaXRvciknICcKKworCWVjaG8gIm1vcmUiID4+IGZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwkoZWNobyBtb3JlIG1vcmUgfCBHSVRfRURJVE9SPSIkRkFLRV9FRElUT1IiIGdpdCBjb21taXQgLWUgLUYgLSkgJiYKKwl0ZXN0ICJgZ2l0IGxvZyAtMSAtLXByZXR0eT1mb3JtYXQ6JXNgIiA9IG1lc3NhZ2UKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd3aXRoIGhvb2sgKC1DKScgJworCisJaGVhZD1gZ2l0IHJldi1wYXJzZSBIRUFEYCAmJgorCWVjaG8gIm1vcmUiID4+IGZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwlnaXQgY29tbWl0IC1DICRoZWFkICYmCisJdGVzdCAiYGdpdCBsb2cgLTEgLS1wcmV0dHk9Zm9ybWF0OiVzYCIgPSAiJGhlYWQgKG5vIGVkaXRvcikiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnd2l0aCBob29rIChlZGl0b3IpJyAnCisKKwllY2hvICJtb3JlIG1vcmUiID4+IGZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwlHSVRfRURJVE9SPSIkRkFLRV9FRElUT1IiIGdpdCBjb21taXQgJiYKKwl0ZXN0ICJgZ2l0IGxvZyAtMSAtLXByZXR0eT1mb3JtYXQ6JXNgIiA9IGRlZmF1bHQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd3aXRoIGhvb2sgKC0tYW1lbmQpJyAnCisKKwloZWFkPWBnaXQgcmV2LXBhcnNlIEhFQURgICYmCisJZWNobyAibW9yZSIgPj4gZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCUdJVF9FRElUT1I9IiRGQUtFX0VESVRPUiIgZ2l0IGNvbW1pdCAtLWFtZW5kICYmCisJdGVzdCAiYGdpdCBsb2cgLTEgLS1wcmV0dHk9Zm9ybWF0OiVzYCIgPSAiJGhlYWQiCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnd2l0aCBob29rICgtYyknICcKKworCWhlYWQ9YGdpdCByZXYtcGFyc2UgSEVBRGAgJiYKKwllY2hvICJtb3JlIiA+PiBmaWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJR0lUX0VESVRPUj0iJEZBS0VfRURJVE9SIiBnaXQgY29tbWl0IC1jICRoZWFkICYmCisJdGVzdCAiYGdpdCBsb2cgLTEgLS1wcmV0dHk9Zm9ybWF0OiVzYCIgPSAiJGhlYWQiCisKKycKKworY2F0ID4gIiRIT09LIiA8PCdFT0YnCisjIS9iaW4vc2gKK2V4aXQgMQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3dpdGggZmFpbGluZyBob29rJyAnCisKKwloZWFkPWBnaXQgcmV2LXBhcnNlIEhFQURgICYmCisJZWNobyAibW9yZSIgPj4gZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCSEgR0lUX0VESVRPUj0iJEZBS0VfRURJVE9SIiBnaXQgY29tbWl0IC1jICRoZWFkCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnd2l0aCBmYWlsaW5nIGhvb2sgKC0tbm8tdmVyaWZ5KScgJworCisJaGVhZD1gZ2l0IHJldi1wYXJzZSBIRUFEYCAmJgorCWVjaG8gIm1vcmUiID4+IGZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwkhIEdJVF9FRElUT1I9IiRGQUtFX0VESVRPUiIgZ2l0IGNvbW1pdCAtLW5vLXZlcmlmeSAtYyAkaGVhZAorCisnCisKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q3NjAwLW1lcmdlLnNoIGIvdC90NzYwMC1tZXJnZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41Njg2OWFjCi0tLSAvZGV2L251bGwKKysrIGIvdC90NzYwMC1tZXJnZS5zaApAQCAtMCwwICsxLDQ0NiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBMYXJzIEhqZW1saQorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtbWVyZ2UKKworVGVzdGluZyBiYXNpYyBtZXJnZSBvcGVyYXRpb25zL29wdGlvbiBwYXJzaW5nLicKKworLiAuL3Rlc3QtbGliLnNoCisKK2NhdCA+ZmlsZSA8PEVPRgorMQorMgorMworNAorNQorNgorNworOAorOQorRU9GCisKK2NhdCA+ZmlsZS4xIDw8RU9GCisxIFgKKzIKKzMKKzQKKzUKKzYKKzcKKzgKKzkKK0VPRgorCitjYXQgPmZpbGUuNSA8PEVPRgorMQorMgorMworNAorNSBYCis2Cis3Cis4Cis5CitFT0YKKworY2F0ID5maWxlLjkgPDxFT0YKKzEKKzIKKzMKKzQKKzUKKzYKKzcKKzgKKzkgWAorRU9GCisKK2NhdCAgPnJlc3VsdC4xIDw8RU9GCisxIFgKKzIKKzMKKzQKKzUKKzYKKzcKKzgKKzkKK0VPRgorCitjYXQgPnJlc3VsdC4xLTUgPDxFT0YKKzEgWAorMgorMworNAorNSBYCis2Cis3Cis4Cis5CitFT0YKKworY2F0ID5yZXN1bHQuMS01LTkgPDxFT0YKKzEgWAorMgorMworNAorNSBYCis2Cis3Cis4Cis5IFgKK0VPRgorCitjcmVhdGVfbWVyZ2VfbXNncygpIHsKKwllY2hvICJNZXJnZSBjb21taXQgJ2MyJyIgPm1zZy4xLTUgJiYKKwllY2hvICJNZXJnZSBjb21taXQgJ2MyJzsgY29tbWl0ICdjMyciID5tc2cuMS01LTkgJiYKKwllY2hvICJTcXVhc2hlZCBjb21taXQgb2YgdGhlIGZvbGxvd2luZzoiID5zcXVhc2guMSAmJgorCWVjaG8gPj5zcXVhc2guMSAmJgorCWdpdCBsb2cgLS1uby1tZXJnZXMgXkhFQUQgYzEgPj5zcXVhc2guMSAmJgorCWVjaG8gIlNxdWFzaGVkIGNvbW1pdCBvZiB0aGUgZm9sbG93aW5nOiIgPnNxdWFzaC4xLTUgJiYKKwllY2hvID4+c3F1YXNoLjEtNSAmJgorCWdpdCBsb2cgLS1uby1tZXJnZXMgXkhFQUQgYzIgPj5zcXVhc2guMS01ICYmCisJZWNobyAiU3F1YXNoZWQgY29tbWl0IG9mIHRoZSBmb2xsb3dpbmc6IiA+c3F1YXNoLjEtNS05ICYmCisJZWNobyA+PnNxdWFzaC4xLTUtOSAmJgorCWdpdCBsb2cgLS1uby1tZXJnZXMgXkhFQUQgYzIgYzMgPj5zcXVhc2guMS01LTkKK30KKwordmVyaWZ5X2RpZmYoKSB7CisJaWYgISB0ZXN0X2NtcCAiJDEiICIkMiIKKwl0aGVuCisJCWVjaG8gIiQzIgorCQlmYWxzZQorCWZpCit9CisKK3ZlcmlmeV9tZXJnZSgpIHsKKwl2ZXJpZnlfZGlmZiAiJDIiICIkMSIgIltPT1BTXSBiYWQgbWVyZ2UgcmVzdWx0IiAmJgorCWlmIHRlc3QgJChnaXQgbHMtZmlsZXMgLXUgfCB3YyAtbCkgLWd0IDAKKwl0aGVuCisJCWVjaG8gIltPT1BTXSB1bm1lcmdlZCBmaWxlcyIKKwkJZmFsc2UKKwlmaSAmJgorCWlmICEgZ2l0IGRpZmYgLS1leGl0LWNvZGUKKwl0aGVuCisJCWVjaG8gIltPT1BTXSB3b3JraW5nIHRyZWUgIT0gaW5kZXgiCisJCWZhbHNlCisJZmkgJiYKKwlpZiB0ZXN0IC1uICIkMyIKKwl0aGVuCisJCWdpdCBzaG93IC1zIC0tcHJldHR5PWZvcm1hdDolcyBIRUFEID5tc2cuYWN0ICYmCisJCXZlcmlmeV9kaWZmICIkMyIgbXNnLmFjdCAiW09PUFNdIGJhZCBtZXJnZSBtZXNzYWdlIgorCWZpCit9CisKK3ZlcmlmeV9oZWFkKCkgeworCWlmIHRlc3QgIiQxIiAhPSAiJChnaXQgcmV2LXBhcnNlIEhFQUQpIgorCXRoZW4KKwkJZWNobyAiW09PUFNdIEhFQUQgIT0gJDEiCisJCWZhbHNlCisJZmkKK30KKwordmVyaWZ5X3BhcmVudHMoKSB7CisJaT0xCisJd2hpbGUgdGVzdCAkIyAtZ3QgMAorCWRvCisJCWlmIHRlc3QgIiQxIiAhPSAiJChnaXQgcmV2LXBhcnNlIEhFQUReJGkpIgorCQl0aGVuCisJCQllY2hvICJbT09QU10gSEVBRF4kaSAhPSAkMSIKKwkJCXJldHVybiAxCisJCWZpCisJCWk9JChleHByICRpICsgMSkKKwkJc2hpZnQKKwlkb25lCit9CisKK3ZlcmlmeV9tZXJnZWhlYWRzKCkgeworCWk9MQorCWlmICEgdGVzdCAtZiAuZ2l0L01FUkdFX0hFQUQKKwl0aGVuCisJCWVjaG8gIltPT1BTXSBNRVJHRV9IRUFEIGlzIG1pc3NpbmciCisJCWZhbHNlCisJZmkgJiYKKwl3aGlsZSB0ZXN0ICQjIC1ndCAwCisJZG8KKwkJaGVhZD0kKGhlYWQgLW4gJGkgLmdpdC9NRVJHRV9IRUFEIHwgc2VkIC1uZSBcJHApCisJCWlmIHRlc3QgIiQxIiAhPSAiJGhlYWQiCisJCXRoZW4KKwkJCWVjaG8gIltPT1BTXSBNRVJHRV9IRUFEICRpICE9ICQxIgorCQkJcmV0dXJuIDEKKwkJZmkKKwkJaT0kKGV4cHIgJGkgKyAxKQorCQlzaGlmdAorCWRvbmUKK30KKwordmVyaWZ5X25vX21lcmdlaGVhZCgpIHsKKwlpZiB0ZXN0IC1mIC5naXQvTUVSR0VfSEVBRAorCXRoZW4KKwkJZWNobyAiW09PUFNdIE1FUkdFX0hFQUQgZXhpc3RzIgorCQlmYWxzZQorCWZpCit9CisKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAnICcKKwlnaXQgYWRkIGZpbGUgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tICJjb21taXQgMCIgJiYKKwlnaXQgdGFnIGMwICYmCisJYzA9JChnaXQgcmV2LXBhcnNlIEhFQUQpICYmCisJY3AgZmlsZS4xIGZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tICJjb21taXQgMSIgJiYKKwlnaXQgdGFnIGMxICYmCisJYzE9JChnaXQgcmV2LXBhcnNlIEhFQUQpICYmCisJZ2l0IHJlc2V0IC0taGFyZCAiJGMwIiAmJgorCWNwIGZpbGUuNSBmaWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSAiY29tbWl0IDIiICYmCisJZ2l0IHRhZyBjMiAmJgorCWMyPSQoZ2l0IHJldi1wYXJzZSBIRUFEKSAmJgorCWdpdCByZXNldCAtLWhhcmQgIiRjMCIgJiYKKwljcCBmaWxlLjkgZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gImNvbW1pdCAzIiAmJgorCWdpdCB0YWcgYzMgJiYKKwljMz0kKGdpdCByZXYtcGFyc2UgSEVBRCkKKwlnaXQgcmVzZXQgLS1oYXJkICIkYzAiICYmCisJY3JlYXRlX21lcmdlX21zZ3MKKycKKwordGVzdF9kZWJ1ZyAnZ2l0ayAtLWFsbCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGVzdCBvcHRpb24gcGFyc2luZycgJworCWlmIGdpdCBtZXJnZSAtJCBjMQorCXRoZW4KKwkJZWNobyAiW09PUFNdIC0kIGFjY2VwdGVkIgorCQlmYWxzZQorCWZpICYmCisJaWYgZ2l0IG1lcmdlIC0tbm8tc3VjaCBjMQorCXRoZW4KKwkJZWNobyAiW09PUFNdIC0tbm8tc3VjaCBhY2NlcHRlZCIKKwkJZmFsc2UKKwlmaSAmJgorCWlmIGdpdCBtZXJnZSAtcyBmb29iYXIgYzEKKwl0aGVuCisJCWVjaG8gIltPT1BTXSAtcyBmb29iYXIgYWNjZXB0ZWQiCisJCWZhbHNlCisJZmkgJiYKKwlpZiBnaXQgbWVyZ2UgLXM9Zm9vYmFyIGMxCisJdGhlbgorCQllY2hvICJbT09QU10gLXM9Zm9vYmFyIGFjY2VwdGVkIgorCQlmYWxzZQorCWZpICYmCisJaWYgZ2l0IG1lcmdlIC1tCisJdGhlbgorCQllY2hvICJbT09QU10gbWlzc2luZyBjb21taXQgbXNnIGFjY2VwdGVkIgorCQlmYWxzZQorCWZpICYmCisJaWYgZ2l0IG1lcmdlCisJdGhlbgorCQllY2hvICJbT09QU10gbWlzc2luZyBjb21taXQgcmVmZXJlbmNlcyBhY2NlcHRlZCIKKwkJZmFsc2UKKwlmaQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZSBjMCB3aXRoIGMxJyAnCisJZ2l0IHJlc2V0IC0taGFyZCBjMCAmJgorCWdpdCBtZXJnZSBjMSAmJgorCXZlcmlmeV9tZXJnZSBmaWxlIHJlc3VsdC4xICYmCisJdmVyaWZ5X2hlYWQgIiRjMSIKKycKKwordGVzdF9kZWJ1ZyAnZ2l0ayAtLWFsbCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UgYzEgd2l0aCBjMicgJworCWdpdCByZXNldCAtLWhhcmQgYzEgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgbWVyZ2UgYzIgJiYKKwl2ZXJpZnlfbWVyZ2UgZmlsZSByZXN1bHQuMS01IG1zZy4xLTUgJiYKKwl2ZXJpZnlfcGFyZW50cyAkYzEgJGMyCisnCisKK3Rlc3RfZGVidWcgJ2dpdGsgLS1hbGwnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21lcmdlIGMxIHdpdGggYzIgYW5kIGMzJyAnCisJZ2l0IHJlc2V0IC0taGFyZCBjMSAmJgorCXRlc3RfdGljayAmJgorCWdpdCBtZXJnZSBjMiBjMyAmJgorCXZlcmlmeV9tZXJnZSBmaWxlIHJlc3VsdC4xLTUtOSBtc2cuMS01LTkgJiYKKwl2ZXJpZnlfcGFyZW50cyAkYzEgJGMyICRjMworJworCit0ZXN0X2RlYnVnICdnaXRrIC0tYWxsJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZSBjMCB3aXRoIGMxIChuby1jb21taXQpJyAnCisJZ2l0IHJlc2V0IC0taGFyZCBjMCAmJgorCWdpdCBtZXJnZSAtLW5vLWNvbW1pdCBjMSAmJgorCXZlcmlmeV9tZXJnZSBmaWxlIHJlc3VsdC4xICYmCisJdmVyaWZ5X2hlYWQgJGMxCisnCisKK3Rlc3RfZGVidWcgJ2dpdGsgLS1hbGwnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21lcmdlIGMxIHdpdGggYzIgKG5vLWNvbW1pdCknICcKKwlnaXQgcmVzZXQgLS1oYXJkIGMxICYmCisJZ2l0IG1lcmdlIC0tbm8tY29tbWl0IGMyICYmCisJdmVyaWZ5X21lcmdlIGZpbGUgcmVzdWx0LjEtNSAmJgorCXZlcmlmeV9oZWFkICRjMSAmJgorCXZlcmlmeV9tZXJnZWhlYWRzICRjMgorJworCit0ZXN0X2RlYnVnICdnaXRrIC0tYWxsJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZSBjMSB3aXRoIGMyIGFuZCBjMyAobm8tY29tbWl0KScgJworCWdpdCByZXNldCAtLWhhcmQgYzEgJiYKKwlnaXQgbWVyZ2UgLS1uby1jb21taXQgYzIgYzMgJiYKKwl2ZXJpZnlfbWVyZ2UgZmlsZSByZXN1bHQuMS01LTkgJiYKKwl2ZXJpZnlfaGVhZCAkYzEgJiYKKwl2ZXJpZnlfbWVyZ2VoZWFkcyAkYzIgJGMzCisnCisKK3Rlc3RfZGVidWcgJ2dpdGsgLS1hbGwnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21lcmdlIGMwIHdpdGggYzEgKHNxdWFzaCknICcKKwlnaXQgcmVzZXQgLS1oYXJkIGMwICYmCisJZ2l0IG1lcmdlIC0tc3F1YXNoIGMxICYmCisJdmVyaWZ5X21lcmdlIGZpbGUgcmVzdWx0LjEgJiYKKwl2ZXJpZnlfaGVhZCAkYzAgJiYKKwl2ZXJpZnlfbm9fbWVyZ2VoZWFkICYmCisJdmVyaWZ5X2RpZmYgc3F1YXNoLjEgLmdpdC9TUVVBU0hfTVNHICJbT09QU10gYmFkIHNxdWFzaCBtZXNzYWdlIgorJworCit0ZXN0X2RlYnVnICdnaXRrIC0tYWxsJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZSBjMSB3aXRoIGMyIChzcXVhc2gpJyAnCisJZ2l0IHJlc2V0IC0taGFyZCBjMSAmJgorCWdpdCBtZXJnZSAtLXNxdWFzaCBjMiAmJgorCXZlcmlmeV9tZXJnZSBmaWxlIHJlc3VsdC4xLTUgJiYKKwl2ZXJpZnlfaGVhZCAkYzEgJiYKKwl2ZXJpZnlfbm9fbWVyZ2VoZWFkICYmCisJdmVyaWZ5X2RpZmYgc3F1YXNoLjEtNSAuZ2l0L1NRVUFTSF9NU0cgIltPT1BTXSBiYWQgc3F1YXNoIG1lc3NhZ2UiCisnCisKK3Rlc3RfZGVidWcgJ2dpdGsgLS1hbGwnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21lcmdlIGMxIHdpdGggYzIgYW5kIGMzIChzcXVhc2gpJyAnCisJZ2l0IHJlc2V0IC0taGFyZCBjMSAmJgorCWdpdCBtZXJnZSAtLXNxdWFzaCBjMiBjMyAmJgorCXZlcmlmeV9tZXJnZSBmaWxlIHJlc3VsdC4xLTUtOSAmJgorCXZlcmlmeV9oZWFkICRjMSAmJgorCXZlcmlmeV9ub19tZXJnZWhlYWQgJiYKKwl2ZXJpZnlfZGlmZiBzcXVhc2guMS01LTkgLmdpdC9TUVVBU0hfTVNHICJbT09QU10gYmFkIHNxdWFzaCBtZXNzYWdlIgorJworCit0ZXN0X2RlYnVnICdnaXRrIC0tYWxsJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZSBjMSB3aXRoIGMyIChuby1jb21taXQgaW4gY29uZmlnKScgJworCWdpdCByZXNldCAtLWhhcmQgYzEgJiYKKwlnaXQgY29uZmlnIGJyYW5jaC5tYXN0ZXIubWVyZ2VvcHRpb25zICItLW5vLWNvbW1pdCIgJiYKKwlnaXQgbWVyZ2UgYzIgJiYKKwl2ZXJpZnlfbWVyZ2UgZmlsZSByZXN1bHQuMS01ICYmCisJdmVyaWZ5X2hlYWQgJGMxICYmCisJdmVyaWZ5X21lcmdlaGVhZHMgJGMyCisnCisKK3Rlc3RfZGVidWcgJ2dpdGsgLS1hbGwnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21lcmdlIGMxIHdpdGggYzIgKHNxdWFzaCBpbiBjb25maWcpJyAnCisJZ2l0IHJlc2V0IC0taGFyZCBjMSAmJgorCWdpdCBjb25maWcgYnJhbmNoLm1hc3Rlci5tZXJnZW9wdGlvbnMgIi0tc3F1YXNoIiAmJgorCWdpdCBtZXJnZSBjMiAmJgorCXZlcmlmeV9tZXJnZSBmaWxlIHJlc3VsdC4xLTUgJiYKKwl2ZXJpZnlfaGVhZCAkYzEgJiYKKwl2ZXJpZnlfbm9fbWVyZ2VoZWFkICYmCisJdmVyaWZ5X2RpZmYgc3F1YXNoLjEtNSAuZ2l0L1NRVUFTSF9NU0cgIltPT1BTXSBiYWQgc3F1YXNoIG1lc3NhZ2UiCisnCisKK3Rlc3RfZGVidWcgJ2dpdGsgLS1hbGwnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ292ZXJyaWRlIGNvbmZpZyBvcHRpb24gLW4nICcKKwlnaXQgcmVzZXQgLS1oYXJkIGMxICYmCisJZ2l0IGNvbmZpZyBicmFuY2gubWFzdGVyLm1lcmdlb3B0aW9ucyAiLW4iICYmCisJdGVzdF90aWNrICYmCisJZ2l0IG1lcmdlIC0tc3VtbWFyeSBjMiA+ZGlmZnN0YXQudHh0ICYmCisJdmVyaWZ5X21lcmdlIGZpbGUgcmVzdWx0LjEtNSBtc2cuMS01ICYmCisJdmVyaWZ5X3BhcmVudHMgJGMxICRjMiAmJgorCWlmICEgZ3JlcCAiXiBmaWxlIHwgICoyICstJCIgZGlmZnN0YXQudHh0CisJdGhlbgorCQllY2hvICJbT09QU10gZGlmZnN0YXQgd2FzIG5vdCBnZW5lcmF0ZWQiCisJZmkKKycKKwordGVzdF9kZWJ1ZyAnZ2l0ayAtLWFsbCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnb3ZlcnJpZGUgY29uZmlnIG9wdGlvbiAtLXN1bW1hcnknICcKKwlnaXQgcmVzZXQgLS1oYXJkIGMxICYmCisJZ2l0IGNvbmZpZyBicmFuY2gubWFzdGVyLm1lcmdlb3B0aW9ucyAiLS1zdW1tYXJ5IiAmJgorCXRlc3RfdGljayAmJgorCWdpdCBtZXJnZSAtbiBjMiA+ZGlmZnN0YXQudHh0ICYmCisJdmVyaWZ5X21lcmdlIGZpbGUgcmVzdWx0LjEtNSBtc2cuMS01ICYmCisJdmVyaWZ5X3BhcmVudHMgJGMxICRjMiAmJgorCWlmIGdyZXAgIl4gZmlsZSB8ICAqMiArLSQiIGRpZmZzdGF0LnR4dAorCXRoZW4KKwkJZWNobyAiW09PUFNdIGRpZmZzdGF0IHdhcyBnZW5lcmF0ZWQiCisJCWZhbHNlCisJZmkKKycKKwordGVzdF9kZWJ1ZyAnZ2l0ayAtLWFsbCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UgYzEgd2l0aCBjMiAob3ZlcnJpZGUgLS1uby1jb21taXQpJyAnCisJZ2l0IHJlc2V0IC0taGFyZCBjMSAmJgorCWdpdCBjb25maWcgYnJhbmNoLm1hc3Rlci5tZXJnZW9wdGlvbnMgIi0tbm8tY29tbWl0IiAmJgorCXRlc3RfdGljayAmJgorCWdpdCBtZXJnZSAtLWNvbW1pdCBjMiAmJgorCXZlcmlmeV9tZXJnZSBmaWxlIHJlc3VsdC4xLTUgbXNnLjEtNSAmJgorCXZlcmlmeV9wYXJlbnRzICRjMSAkYzIKKycKKwordGVzdF9kZWJ1ZyAnZ2l0ayAtLWFsbCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UgYzEgd2l0aCBjMiAob3ZlcnJpZGUgLS1zcXVhc2gpJyAnCisJZ2l0IHJlc2V0IC0taGFyZCBjMSAmJgorCWdpdCBjb25maWcgYnJhbmNoLm1hc3Rlci5tZXJnZW9wdGlvbnMgIi0tc3F1YXNoIiAmJgorCXRlc3RfdGljayAmJgorCWdpdCBtZXJnZSAtLW5vLXNxdWFzaCBjMiAmJgorCXZlcmlmeV9tZXJnZSBmaWxlIHJlc3VsdC4xLTUgbXNnLjEtNSAmJgorCXZlcmlmeV9wYXJlbnRzICRjMSAkYzIKKycKKwordGVzdF9kZWJ1ZyAnZ2l0ayAtLWFsbCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UgYzAgd2l0aCBjMSAobm8tZmYpJyAnCisJZ2l0IHJlc2V0IC0taGFyZCBjMCAmJgorCWdpdCBjb25maWcgYnJhbmNoLm1hc3Rlci5tZXJnZW9wdGlvbnMgIiIgJiYKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgbWVyZ2UgLS1uby1mZiBjMSAmJgorCXZlcmlmeV9tZXJnZSBmaWxlIHJlc3VsdC4xICYmCisJdmVyaWZ5X3BhcmVudHMgJGMwICRjMQorJworCit0ZXN0X2RlYnVnICdnaXRrIC0tYWxsJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb21iaW5pbmcgLS1zcXVhc2ggYW5kIC0tbm8tZmYgaXMgcmVmdXNlZCcgJworCXRlc3RfbXVzdF9mYWlsIGdpdCBtZXJnZSAtLXNxdWFzaCAtLW5vLWZmIGMxICYmCisJdGVzdF9tdXN0X2ZhaWwgZ2l0IG1lcmdlIC0tbm8tZmYgLS1zcXVhc2ggYzEKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UgYzAgd2l0aCBjMSAoZmYgb3ZlcnJpZGVzIG5vLWZmKScgJworCWdpdCByZXNldCAtLWhhcmQgYzAgJiYKKwlnaXQgY29uZmlnIGJyYW5jaC5tYXN0ZXIubWVyZ2VvcHRpb25zICItLW5vLWZmIiAmJgorCWdpdCBtZXJnZSAtLWZmIGMxICYmCisJdmVyaWZ5X21lcmdlIGZpbGUgcmVzdWx0LjEgJiYKKwl2ZXJpZnlfaGVhZCAkYzEKKycKKwordGVzdF9kZWJ1ZyAnZ2l0ayAtLWFsbCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q3NjEwLW1lcmdldG9vbC5zaCBiL3QvdDc2MTAtbWVyZ2V0b29sLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMDQ4M2YKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3NjEwLW1lcmdldG9vbC5zaApAQCAtMCwwICsxLDQ2IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA4IENoYXJsZXMgQmFpbGV5CisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1tZXJnZXRvb2wKKworVGVzdGluZyBiYXNpYyBtZXJnZSB0b29sIGludm9jYXRpb24nCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCcgJworICAgIGVjaG8gbWFzdGVyID5maWxlMSAmJgorICAgIGdpdCBhZGQgZmlsZTEgJiYKKyAgICBnaXQgY29tbWl0IC1tICJhZGRlZCBmaWxlMSIgJiYKKyAgICBnaXQgY2hlY2tvdXQgLWIgYnJhbmNoMSBtYXN0ZXIgJiYKKyAgICBlY2hvIGJyYW5jaDEgY2hhbmdlID5maWxlMSAmJgorICAgIGVjaG8gYnJhbmNoMSBuZXdmaWxlID5maWxlMiAmJgorICAgIGdpdCBhZGQgZmlsZTEgZmlsZTIgJiYKKyAgICBnaXQgY29tbWl0IC1tICJicmFuY2gxIGNoYW5nZXMiICYmCisgICAgZ2l0IGNoZWNrb3V0IC1iIGJyYW5jaDIgbWFzdGVyICYmCisgICAgZWNobyBicmFuY2gyIGNoYW5nZSA+ZmlsZTEgJiYKKyAgICBlY2hvIGJyYW5jaDIgbmV3ZmlsZSA+ZmlsZTIgJiYKKyAgICBnaXQgYWRkIGZpbGUxIGZpbGUyICYmCisgICAgZ2l0IGNvbW1pdCAtbSAiYnJhbmNoMiBjaGFuZ2VzIiAmJgorICAgIGdpdCBjaGVja291dCBtYXN0ZXIgJiYKKyAgICBlY2hvIG1hc3RlciB1cGRhdGVkID5maWxlMSAmJgorICAgIGVjaG8gbWFzdGVyIG5ldyA+ZmlsZTIgJiYKKyAgICBnaXQgYWRkIGZpbGUxIGZpbGUyICYmCisgICAgZ2l0IGNvbW1pdCAtbSAibWFzdGVyIHVwZGF0ZXMiCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2N1c3RvbSBtZXJnZXRvb2wnICcKKyAgICBnaXQgY29uZmlnIG1lcmdlLnRvb2wgbXl0b29sICYmCisgICAgZ2l0IGNvbmZpZyBtZXJnZXRvb2wubXl0b29sLmNtZCAiY2F0IFwiXCRSRU1PVEVcIiA+XCJcJE1FUkdFRFwiIiAmJgorICAgIGdpdCBjb25maWcgbWVyZ2V0b29sLm15dG9vbC50cnVzdEV4aXRDb2RlIHRydWUgJiYKKwlnaXQgY2hlY2tvdXQgYnJhbmNoMSAmJgorICAgICEgZ2l0IG1lcmdlIG1hc3RlciA+L2Rldi9udWxsIDI+JjEgJiYKKyAgICAoIHllcyAiIiB8IGdpdCBtZXJnZXRvb2wgZmlsZTE+L2Rldi9udWxsIDI+JjEgKSAmJgorICAgICggeWVzICIiIHwgZ2l0IG1lcmdldG9vbCBmaWxlMj4vZGV2L251bGwgMj4mMSApICYmCisgICAgdGVzdCAiJChjYXQgZmlsZTEpIiA9ICJtYXN0ZXIgdXBkYXRlZCIgJiYKKyAgICB0ZXN0ICIkKGNhdCBmaWxlMikiID0gIm1hc3RlciBuZXciICYmCisJZ2l0IGNvbW1pdCAtbSAiYnJhbmNoMSByZXNvbHZlZCB3aXRoIG1lcmdldG9vbCIKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q4MDAxLWFubm90YXRlLnNoIGIvdC90ODAwMS1hbm5vdGF0ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYWJlYzJlCi0tLSAvZGV2L251bGwKKysrIGIvdC90ODAwMS1hbm5vdGF0ZS5zaApAQCAtMCwwICsxLDE1IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IGFubm90YXRlJworLiAuL3Rlc3QtbGliLnNoCisKK1BST0c9J2dpdCBhbm5vdGF0ZScKKy4gLi4vYW5ub3RhdGUtdGVzdHMuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0Fubm90YXRpbmcgYW4gb2xkIHJldmlzaW9uIHdvcmtzJyBcCisgICAgJ1sgJChnaXQgYW5ub3RhdGUgZmlsZSBtYXN0ZXIgfCBhd2sgIntwcmludCBcJDN9IiB8IGdyZXAgLWMgIl5BJCIpIC1lcSAyIF0gJiYgXAorICAgICBbICQoZ2l0IGFubm90YXRlIGZpbGUgbWFzdGVyIHwgYXdrICJ7cHJpbnQgXCQzfSIgfCBncmVwIC1jICJeQiQiKSAtZXEgMiBdJworCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90ODAwMi1ibGFtZS5zaCBiL3QvdDgwMDItYmxhbWUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTJlY2UzMAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDgwMDItYmxhbWUuc2gKQEAgLTAsMCArMSw5IEBACisjIS9iaW4vc2gKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IGJsYW1lJworLiAuL3Rlc3QtbGliLnNoCisKK1BST0c9J2dpdCBibGFtZSAtYycKKy4gLi4vYW5ub3RhdGUtdGVzdHMuc2gKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q4MDAzLWJsYW1lLnNoIGIvdC90ODAwMy1ibGFtZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NjZiYjBhCi0tLSAvZGV2L251bGwKKysrIGIvdC90ODAwMy1ibGFtZS5zaApAQCAtMCwwICsxLDEzMiBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBibGFtZSBjb3JuZXIgY2FzZXMnCisuIC4vdGVzdC1saWIuc2gKKworcGlja19mYz0ncy9eWzAtOWEtZl5dKiAqXChbXiBdKlwpICooXChbXiBdKlwpIC4qL1wxLVwyLycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwllY2hvIEEgQSBBIEEgQSA+b25lICYmCisJZWNobyBCIEIgQiBCIEIgPnR3byAmJgorCWVjaG8gQyBDIEMgQyBDID50cmVzICYmCisJZWNobyBBQkMgPm1vdXNlICYmCisJZ2l0IGFkZCBvbmUgdHdvIHRyZXMgbW91c2UgJiYKKwl0ZXN0X3RpY2sgJiYKKwlHSVRfQVVUSE9SX05BTUU9SW5pdGlhbCBnaXQgY29tbWl0IC1tIEluaXRpYWwgJiYKKworCWNhdCBvbmUgPnVubyAmJgorCW12IHR3byBkb3MgJiYKKwljYXQgb25lID4+dHJlcyAmJgorCWVjaG8gREVGID4+bW91c2UKKwlnaXQgYWRkIHVubyBkb3MgdHJlcyBtb3VzZSAmJgorCXRlc3RfdGljayAmJgorCUdJVF9BVVRIT1JfTkFNRT1TZWNvbmQgZ2l0IGNvbW1pdCAtYSAtbSBTZWNvbmQgJiYKKworCWVjaG8gR0hJSksgPj5tb3VzZSAmJgorCWdpdCBhZGQgbW91c2UgJiYKKwl0ZXN0X3RpY2sgJiYKKwlHSVRfQVVUSE9SX05BTUU9VGhpcmQgZ2l0IGNvbW1pdCAtbSBUaGlyZCAmJgorCisJY2F0IG1vdXNlID5jb3cgJiYKKwlnaXQgYWRkIGNvdyAmJgorCXRlc3RfdGljayAmJgorCUdJVF9BVVRIT1JfTkFNRT1Gb3VydGggZ2l0IGNvbW1pdCAtbSBGb3VydGggJiYKKworCXsKKwkJZWNobyBBQkMKKwkJZWNobyBERUYKKwkJZWNobyBYWFhYCisJCWVjaG8gR0hJSksKKwl9ID5jb3cgJiYKKwlnaXQgYWRkIGNvdyAmJgorCXRlc3RfdGljayAmJgorCUdJVF9BVVRIT1JfTkFNRT1GaWZ0aCBnaXQgY29tbWl0IC1tIEZpZnRoCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N0cmFpZ2h0IGNvcHkgd2l0aG91dCAtQycgJworCisJZ2l0IGJsYW1lIHVubyB8IGdyZXAgU2Vjb25kCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc3RyYWlnaHQgbW92ZSB3aXRob3V0IC1DJyAnCisKKwlnaXQgYmxhbWUgZG9zIHwgZ3JlcCBJbml0aWFsCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc3RyYWlnaHQgY29weSB3aXRoIC1DJyAnCisKKwlnaXQgYmxhbWUgLUMxIHVubyB8IGdyZXAgU2Vjb25kCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc3RyYWlnaHQgbW92ZSB3aXRoIC1DJyAnCisKKwlnaXQgYmxhbWUgLUMxIGRvcyB8IGdyZXAgSW5pdGlhbAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N0cmFpZ2h0IGNvcHkgd2l0aCAtQyAtQycgJworCisJZ2l0IGJsYW1lIC1DIC1DMSB1bm8gfCBncmVwIEluaXRpYWwKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzdHJhaWdodCBtb3ZlIHdpdGggLUMgLUMnICcKKworCWdpdCBibGFtZSAtQyAtQzEgZG9zIHwgZ3JlcCBJbml0aWFsCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwZW5kIHdpdGhvdXQgLUMnICcKKworCWdpdCBibGFtZSAtTDIgdHJlcyB8IGdyZXAgU2Vjb25kCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwZW5kIHdpdGggLUMnICcKKworCWdpdCBibGFtZSAtTDIgLUMxIHRyZXMgfCBncmVwIFNlY29uZAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGVuZCB3aXRoIC1DIC1DJyAnCisKKwlnaXQgYmxhbWUgLUwyIC1DIC1DMSB0cmVzIHwgZ3JlcCBTZWNvbmQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBlbmQgd2l0aCAtQyAtQyAtQycgJworCisJZ2l0IGJsYW1lIC1MMiAtQyAtQyAtQzEgdHJlcyB8IGdyZXAgSW5pdGlhbAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2JsYW1lIHdob2xlc2FsZSBjb3B5JyAnCisKKwlnaXQgYmxhbWUgLWYgLUMgLUMxIEhFQUReIC0tIGNvdyB8IHNlZCAtZSAiJHBpY2tfZmMiID5jdXJyZW50ICYmCisJeworCQllY2hvIG1vdXNlLUluaXRpYWwKKwkJZWNobyBtb3VzZS1TZWNvbmQKKwkJZWNobyBtb3VzZS1UaGlyZAorCX0gPmV4cGVjdGVkICYmCisJdGVzdF9jbXAgZXhwZWN0ZWQgY3VycmVudAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2JsYW1lIHdob2xlc2FsZSBjb3B5IGFuZCBtb3JlJyAnCisKKwlnaXQgYmxhbWUgLWYgLUMgLUMxIEhFQUQgLS0gY293IHwgc2VkIC1lICIkcGlja19mYyIgPmN1cnJlbnQgJiYKKwl7CisJCWVjaG8gbW91c2UtSW5pdGlhbAorCQllY2hvIG1vdXNlLVNlY29uZAorCQllY2hvIGNvdy1GaWZ0aAorCQllY2hvIG1vdXNlLVRoaXJkCisJfSA+ZXhwZWN0ZWQgJiYKKwl0ZXN0X2NtcCBleHBlY3RlZCBjdXJyZW50CisKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q4MDA0LWJsYW1lLnNoIGIvdC90ODAwNC1ibGFtZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYTE5YWMxCi0tLSAvZGV2L251bGwKKysrIGIvdC90ODAwNC1ibGFtZS5zaApAQCAtMCwwICsxLDczIEBACisjIS9iaW4vc2gKKworIyBCYXNlZCBvbiBhIHRlc3QgY2FzZSBzdWJtaXR0ZWQgYnkgQmrDtnJuIFN0ZWluYnJpbmsuCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBibGFtZSBvbiBjb25mbGljdGVkIGZpbGVzJworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NldHVwIGZpcnN0IGNhc2UnICcKKwkjIENyZWF0ZSB0aGUgb2xkIGZpbGUKKwllY2hvICJPbGQgbGluZSIgPiBmaWxlMSAmJgorCWdpdCBhZGQgZmlsZTEgJiYKKwlnaXQgY29tbWl0IC0tYXV0aG9yICJPbGQgTGluZSA8b2xAbG9jYWxob3N0PiIgLW0gZmlsZTEuYSAmJgorCisJIyBCcmFuY2gKKwlnaXQgY2hlY2tvdXQgLWIgZm9vICYmCisKKwkjIERvIGFuIHVnbHkgbW92ZSBhbmQgY2hhbmdlCisJZ2l0IHJtIGZpbGUxICYmCisJZWNobyAiTmV3IGxpbmUgLi4uIiAgPiBmaWxlMiAmJgorCWVjaG8gIi4uLiBhbmQgbW9yZSIgPj4gZmlsZTIgJiYKKwlnaXQgYWRkIGZpbGUyICYmCisJZ2l0IGNvbW1pdCAtLWF1dGhvciAiVSBHbHkgPHVnQGxvY2FsaG9zdD4iIC1tIHVnbHkgJiYKKworCSMgQmFjayB0byBtYXN0ZXIgYW5kIGNoYW5nZSBzb21ldGhpbmcKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisJZWNobyAiCisKK2JsYSIgPj4gZmlsZTEgJiYKKwlnaXQgY29tbWl0IC0tYXV0aG9yICJPbGQgTGluZSA8b2xAbG9jYWxob3N0PiIgLWEgLW0gZmlsZTEuYiAmJgorCisJIyBCYWNrIHRvIGZvbyBhbmQgbWVyZ2UgbWFzdGVyCisJZ2l0IGNoZWNrb3V0IGZvbyAmJgorCWlmIGdpdCBtZXJnZSBtYXN0ZXI7IHRoZW4KKwkJZWNobyBuZWVkZWQgY29uZmxpY3QgaGVyZQorCQlleGl0IDEKKwllbHNlCisJCWVjaG8gbWVyZ2UgZmFpbGVkIC0gcmVzb2x2aW5nIGF1dG9tYXRpY2FsbHkKKwlmaSAmJgorCWVjaG8gIk5ldyBsaW5lIC4uLgorLi4uIGFuZCBtb3JlCisKK2JsYQorRXZlbiBtb3JlIiA+IGZpbGUyICYmCisJZ2l0IHJtIGZpbGUxICYmCisJZ2l0IGNvbW1pdCAtLWF1dGhvciAiTSBSZXN1bHQgPG1yQGxvY2FsaG9zdD4iIC1hIC1tIG1lcmdlZCAmJgorCisJIyBCYWNrIHRvIG1hc3RlciBhbmQgY2hhbmdlIGZpbGUxIGFnYWluCisJZ2l0IGNoZWNrb3V0IG1hc3RlciAmJgorCXNlZCBzL2JsYS9mb28vIDxmaWxlMSA+WCAmJgorCXJtIGZpbGUxICYmCisJbXYgWCBmaWxlMSAmJgorCWdpdCBjb21taXQgLS1hdXRob3IgIk5vIEJsYSA8bmJAbG9jYWxob3N0PiIgLWEgLW0gcmVwbGFjZSAmJgorCisJIyBUcnkgdG8gbWVyZ2UgaW50byBmb28gYWdhaW4KKwlnaXQgY2hlY2tvdXQgZm9vICYmCisJaWYgZ2l0IG1lcmdlIG1hc3RlcjsgdGhlbgorCQllY2hvIG5lZWRlZCBjb25mbGljdCBoZXJlCisJCWV4aXQgMQorCWVsc2UKKwkJZWNobyBtZXJnZSBmYWlsZWQgLSB0ZXN0IGlzIHNldHVwCisJZmkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2JsYW1lIHJ1bnMgb24gdW5jb25mbGljdGVkIGZpbGUgd2hpbGUgb3RoZXIgZmlsZSBoYXMgY29uZmxpY3RzJyAnCisJZ2l0IGJsYW1lIGZpbGUyCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2JsYW1lIHJ1bnMgb24gY29uZmxpY3RlZCBmaWxlIGluIHN0YWdlcyAxLDMnICcKKwlnaXQgYmxhbWUgZmlsZTEKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q5MDAxLXNlbmQtZW1haWwuc2ggYi90L3Q5MDAxLXNlbmQtZW1haWwuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzA5NzNiNAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDkwMDEtc2VuZC1lbWFpbC5zaApAQCAtMCwwICsxLDE2OSBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1zZW5kLWVtYWlsJworLiAuL3Rlc3QtbGliLnNoCisKK1BST0c9J2dpdCBzZW5kLWVtYWlsJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgcmVmZXJlbmNlIHRyZWUnIFwKKyAgICAnZWNobyAiMUEgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIiA+ZmlsZSAmJgorICAgICBlY2hvICJsYXp5IGRvZyIgPj5maWxlICYmCisgICAgIGdpdCBhZGQgZmlsZSAmJgorICAgICBHSVRfQVVUSE9SX05BTUU9IkEiIGdpdCBjb21taXQgLWEgLW0gIkluaXRpYWwuIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1NldHVwIGhlbHBlciB0b29sJyBcCisgICAgJyhlY2hvICIjIS9iaW4vc2giCisgICAgICBlY2hvIHNoaWZ0CisgICAgICBlY2hvIG91dHB1dD0xCisgICAgICBlY2hvICJ3aGlsZSB0ZXN0IC1mIGNvbW1hbmRsaW5lXCRvdXRwdXQ7IGRvIG91dHB1dD1cJCgoXCRvdXRwdXQrMSkpOyBkb25lIgorICAgICAgZWNobyBmb3IgYQorICAgICAgZWNobyBkbworICAgICAgZWNobyAiICBlY2hvIFwiIVwkYSFcIiIKKyAgICAgIGVjaG8gImRvbmUgPmNvbW1hbmRsaW5lXCRvdXRwdXQiCisgICAgICBlY2hvICJjYXQgPiBtc2d0eHRcJG91dHB1dCIKKyAgICAgICkgPmZha2Uuc2VuZG1haWwgJiYKKyAgICAgY2htb2QgK3ggLi9mYWtlLnNlbmRtYWlsICYmCisgICAgIGdpdCBhZGQgZmFrZS5zZW5kbWFpbCAmJgorICAgICBHSVRfQVVUSE9SX05BTUU9IkEiIGdpdCBjb21taXQgLWEgLW0gIlNlY29uZC4iJworCitjbGVhbl9mYWtlX3NlbmRtYWlsKCkgeworCXJtIC1mIGNvbW1hbmRsaW5lKiBtc2d0eHQqCit9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ0V4dHJhY3QgcGF0Y2hlcycgJworICAgIHBhdGNoZXM9YGdpdCBmb3JtYXQtcGF0Y2ggLW4gSEVBRF4xYAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdTZW5kIHBhdGNoZXMnICcKKyAgICAgZ2l0IHNlbmQtZW1haWwgLS1mcm9tPSJFeGFtcGxlIDxub2JvZHlAZXhhbXBsZS5jb20+IiAtLXRvPW5vYm9keUBleGFtcGxlLmNvbSAtLXNtdHAtc2VydmVyPSIkKHB3ZCkvZmFrZS5zZW5kbWFpbCIgJHBhdGNoZXMgMj5lcnJvcnMKKycKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKyFub2JvZHlAZXhhbXBsZS5jb20hCishYXV0aG9yQGV4YW1wbGUuY29tIQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnVmVyaWZ5IGNvbW1hbmRsaW5lJyBcCisgICAgJ2RpZmYgY29tbWFuZGxpbmUxIGV4cGVjdGVkJworCitjYXQgPmV4cGVjdGVkLXNob3ctYWxsLWhlYWRlcnMgPDxcRU9GCiswMDAxLVNlY29uZC5wYXRjaAorKG1ib3gpIEFkZGluZyBjYzogQSA8YXV0aG9yQGV4YW1wbGUuY29tPiBmcm9tIGxpbmUgJ0Zyb206IEEgPGF1dGhvckBleGFtcGxlLmNvbT4nCitEcnktT0suIExvZyBzYXlzOgorU2VydmVyOiByZWxheS5leGFtcGxlLmNvbQorTUFJTCBGUk9NOjxmcm9tQGV4YW1wbGUuY29tPgorUkNQVCBUTzo8dG9AZXhhbXBsZS5jb20+LDxjY0BleGFtcGxlLmNvbT4sPGF1dGhvckBleGFtcGxlLmNvbT4sPGJjY0BleGFtcGxlLmNvbT4KK0Zyb206IEV4YW1wbGUgPGZyb21AZXhhbXBsZS5jb20+CitUbzogdG9AZXhhbXBsZS5jb20KK0NjOiBjY0BleGFtcGxlLmNvbSwgQSA8YXV0aG9yQGV4YW1wbGUuY29tPgorU3ViamVjdDogW1BBVENIIDEvMV0gU2Vjb25kLgorRGF0ZTogREFURS1TVFJJTkcKK01lc3NhZ2UtSWQ6IE1FU1NBR0UtSUQtU1RSSU5HCitYLU1haWxlcjogWC1NQUlMRVItU1RSSU5HCitJbi1SZXBseS1UbzogPHVuaXF1ZS1tZXNzYWdlLWlkQGV4YW1wbGUuY29tPgorUmVmZXJlbmNlczogPHVuaXF1ZS1tZXNzYWdlLWlkQGV4YW1wbGUuY29tPgorCitSZXN1bHQ6IE9LCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnU2hvdyBhbGwgaGVhZGVycycgJworCWdpdCBzZW5kLWVtYWlsIFwKKwkJLS1kcnktcnVuIFwKKwkJLS1mcm9tPSJFeGFtcGxlIDxmcm9tQGV4YW1wbGUuY29tPiIgXAorCQktLXRvPXRvQGV4YW1wbGUuY29tIFwKKwkJLS1jYz1jY0BleGFtcGxlLmNvbSBcCisJCS0tYmNjPWJjY0BleGFtcGxlLmNvbSBcCisJCS0taW4tcmVwbHktdG89Ijx1bmlxdWUtbWVzc2FnZS1pZEBleGFtcGxlLmNvbT4iIFwKKwkJLS1zbXRwLXNlcnZlciByZWxheS5leGFtcGxlLmNvbSBcCisJCSRwYXRjaGVzIHwKKwlzZWQJLWUgInMvXlwoRGF0ZTpcKS4qL1wxIERBVEUtU1RSSU5HLyIgXAorCQktZSAicy9eXChNZXNzYWdlLUlkOlwpLiovXDEgTUVTU0FHRS1JRC1TVFJJTkcvIiBcCisJCS1lICJzL15cKFgtTWFpbGVyOlwpLiovXDEgWC1NQUlMRVItU1RSSU5HLyIgXAorCQk+YWN0dWFsLXNob3ctYWxsLWhlYWRlcnMgJiYKKwl0ZXN0X2NtcCBleHBlY3RlZC1zaG93LWFsbC1oZWFkZXJzIGFjdHVhbC1zaG93LWFsbC1oZWFkZXJzCisnCisKK3o4PXp6enp6enp6Cit6NjQ9JHo4JHo4JHo4JHo4JHo4JHo4JHo4JHo4Cit6NTEyPSR6NjQkejY0JHo2NCR6NjQkejY0JHo2NCR6NjQkejY0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZWplY3QgbG9uZyBsaW5lcycgJworCWNsZWFuX2Zha2Vfc2VuZG1haWwgJiYKKwljcCAkcGF0Y2hlcyBsb25nbGluZS5wYXRjaCAmJgorCWVjaG8gJHo1MTIkejUxMiA+PmxvbmdsaW5lLnBhdGNoICYmCisJISBnaXQgc2VuZC1lbWFpbCBcCisJCS0tZnJvbT0iRXhhbXBsZSA8bm9ib2R5QGV4YW1wbGUuY29tPiIgXAorCQktLXRvPW5vYm9keUBleGFtcGxlLmNvbSBcCisJCS0tc210cC1zZXJ2ZXI9IiQocHdkKS9mYWtlLnNlbmRtYWlsIiBcCisJCSRwYXRjaGVzIGxvbmdsaW5lLnBhdGNoIFwKKwkJMj5lcnJvcnMgJiYKKwlncmVwIGxvbmdsaW5lLnBhdGNoIGVycm9ycworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdubyBwYXRjaCB3YXMgc2VudCcgJworCSEgdGVzdCAtZSBjb21tYW5kbGluZTEKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYWxsb3cgbG9uZyBsaW5lcyB3aXRoIC0tbm8tdmFsaWRhdGUnICcKKwlnaXQgc2VuZC1lbWFpbCBcCisJCS0tZnJvbT0iRXhhbXBsZSA8bm9ib2R5QGV4YW1wbGUuY29tPiIgXAorCQktLXRvPW5vYm9keUBleGFtcGxlLmNvbSBcCisJCS0tc210cC1zZXJ2ZXI9IiQocHdkKS9mYWtlLnNlbmRtYWlsIiBcCisJCS0tbm8tdmFsaWRhdGUgXAorCQkkcGF0Y2hlcyBsb25nbGluZS5wYXRjaCBcCisJCTI+ZXJyb3JzCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ0ludmFsaWQgSW4tUmVwbHktVG8nICcKKwljbGVhbl9mYWtlX3NlbmRtYWlsICYmCisJZ2l0IHNlbmQtZW1haWwgXAorCQktLWZyb209IkV4YW1wbGUgPG5vYm9keUBleGFtcGxlLmNvbT4iIFwKKwkJLS10bz1ub2JvZHlAZXhhbXBsZS5jb20gXAorCQktLWluLXJlcGx5LXRvPSIgIiBcCisJCS0tc210cC1zZXJ2ZXI9IiQocHdkKS9mYWtlLnNlbmRtYWlsIiBcCisJCSRwYXRjaGVzCisJCTI+ZXJyb3JzCisJISBncmVwICJeSW4tUmVwbHktVG86IDwgKj4iIG1zZ3R4dDEKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnVmFsaWQgSW4tUmVwbHktVG8gd2hlbiBwcm9tcHRpbmcnICcKKwljbGVhbl9mYWtlX3NlbmRtYWlsICYmCisJKGVjaG8gIkZyb20gRXhhbXBsZSA8ZnJvbUBleGFtcGxlLmNvbT4iCisJIGVjaG8gIlRvIEV4YW1wbGUgPHRvQGV4YW1wbGUuY29tPiIKKwkgZWNobyAiIgorCSkgfCBlbnYgR0lUX1NFTkRfRU1BSUxfTk9UVFk9MSBnaXQgc2VuZC1lbWFpbCBcCisJCS0tc210cC1zZXJ2ZXI9IiQocHdkKS9mYWtlLnNlbmRtYWlsIiBcCisJCSRwYXRjaGVzIDI+ZXJyb3JzICYmCisJISBncmVwICJeSW4tUmVwbHktVG86IDwgKj4iIG1zZ3R4dDEKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgZmFrZSBlZGl0b3InICcKKwkoZWNobyAiIyEvYmluL3NoIiAmJgorCSBlY2hvICJlY2hvIGZha2UgZWRpdCA+PlwkMSIKKwkpID5mYWtlLWVkaXRvciAmJgorCWNobW9kICt4IGZha2UtZWRpdG9yCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy0tY29tcG9zZSB3b3JrcycgJworCWNsZWFuX2Zha2Vfc2VuZG1haWwgJiYKKwllY2hvIHkgfCBcCisJCUdJVF9FRElUT1I9JChwd2QpL2Zha2UtZWRpdG9yIFwKKwkJR0lUX1NFTkRfRU1BSUxfTk9UVFk9MSBcCisJCWdpdCBzZW5kLWVtYWlsIFwKKwkJLS1jb21wb3NlIC0tc3ViamVjdCBmb28gXAorCQktLWZyb209IkV4YW1wbGUgPG5vYm9keUBleGFtcGxlLmNvbT4iIFwKKwkJLS10bz1ub2JvZHlAZXhhbXBsZS5jb20gXAorCQktLXNtdHAtc2VydmVyPSIkKHB3ZCkvZmFrZS5zZW5kbWFpbCIgXAorCQkkcGF0Y2hlcyBcCisJCTI+ZXJyb3JzCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZpcnN0IG1lc3NhZ2UgaXMgY29tcG9zZSB0ZXh0JyAnCisJZ3JlcCAiXmZha2UgZWRpdCIgbXNndHh0MQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZWNvbmQgbWVzc2FnZSBpcyBwYXRjaCcgJworCWdyZXAgIlN1YmplY3Q6LipTZWNvbmQiIG1zZ3R4dDIKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q5MTAwLWdpdC1zdm4tYmFzaWMuc2ggYi90L3Q5MTAwLWdpdC1zdm4tYmFzaWMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGUyNGFiMwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDkxMDAtZ2l0LXN2bi1iYXNpYy5zaApAQCAtMCwwICsxLDI2OCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBFcmljIFdvbmcKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LXN2biBiYXNpYyB0ZXN0cycKK0dJVF9TVk5fTENfQUxMPSRMQ19BTEwKKworY2FzZSAiJExDX0FMTCIgaW4KKyouVVRGLTgpCisJaGF2ZV91dGY4PXQKKwk7OworKikKKwloYXZlX3V0Zjg9CisJOzsKK2VzYWMKKworLiAuL2xpYi1naXQtc3ZuLnNoCisKK2VjaG8gJ2RlZmluZSBOT19TVk5fVEVTVFMgdG8gc2tpcCBnaXQtc3ZuIHRlc3RzJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnaW5pdGlhbGl6ZSBnaXQtc3ZuJyAiCisJbWtkaXIgaW1wb3J0ICYmCisJY2QgaW1wb3J0ICYmCisJZWNobyBmb28gPiBmb28gJiYKKwlsbiAtcyBmb28gZm9vLmxpbmsKKwlta2RpciAtcCBkaXIvYS9iL2MvZC9lICYmCisJZWNobyAnZGVlcCBkaXInID4gZGlyL2EvYi9jL2QvZS9maWxlICYmCisJbWtkaXIgYmFyICYmCisJZWNobyAnenp6JyA+IGJhci96enogJiYKKwllY2hvICcjIS9iaW4vc2gnID4gZXhlYy5zaCAmJgorCWNobW9kICt4IGV4ZWMuc2ggJiYKKwlzdm4gaW1wb3J0IC1tICdpbXBvcnQgZm9yIGdpdC1zdm4nIC4gJHN2bnJlcG8gPi9kZXYvbnVsbCAmJgorCWNkIC4uICYmCisJcm0gLXJmIGltcG9ydCAmJgorCWdpdC1zdm4gaW5pdCAkc3ZucmVwbyIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2ltcG9ydCBhbiBTVk4gcmV2aXNpb24gaW50byBnaXQnIFwKKyAgICAnZ2l0LXN2biBmZXRjaCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiY2hlY2tvdXQgZnJvbSBzdm4iICJzdm4gY28gJHN2bnJlcG8gJyRTVk5fVFJFRSciCisKK25hbWU9J3RyeSBhIGRlZXAgLS1ybWRpciB3aXRoIGEgY29tbWl0JwordGVzdF9leHBlY3Rfc3VjY2VzcyAiJG5hbWUiICIKKwlnaXQgY2hlY2tvdXQgLWYgLWIgbXlicmFuY2ggcmVtb3Rlcy9naXQtc3ZuICYmCisJbXYgZGlyL2EvYi9jL2QvZS9maWxlIGRpci9maWxlICYmCisJY3AgZGlyL2ZpbGUgZmlsZSAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgZGlyL2EvYi9jL2QvZS9maWxlIGRpci9maWxlIGZpbGUgJiYKKwlnaXQgY29tbWl0IC1tICckbmFtZScgJiYKKwlnaXQtc3ZuIHNldC10cmVlIC0tZmluZC1jb3BpZXMtaGFyZGVyIC0tcm1kaXIgXAorCQlyZW1vdGVzL2dpdC1zdm4uLm15YnJhbmNoICYmCisJc3ZuIHVwICckU1ZOX1RSRUUnICYmCisJdGVzdCAtZCAnJFNWTl9UUkVFJy9kaXIgJiYgdGVzdCAhIC1kICckU1ZOX1RSRUUnL2Rpci9hIgorCisKK25hbWU9J2RldGVjdCBub2RlIGNoYW5nZSBmcm9tIGZpbGUgdG8gZGlyZWN0b3J5ICMxJwordGVzdF9leHBlY3Rfc3VjY2VzcyAiJG5hbWUiICIKKwlta2RpciBkaXIvbmV3X2ZpbGUgJiYKKwltdiBkaXIvZmlsZSBkaXIvbmV3X2ZpbGUvZmlsZSAmJgorCW12IGRpci9uZXdfZmlsZSBkaXIvZmlsZSAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1yZW1vdmUgZGlyL2ZpbGUgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGRpci9maWxlL2ZpbGUgJiYKKwlnaXQgY29tbWl0IC1tICckbmFtZScgJiYKKwkhIGdpdC1zdm4gc2V0LXRyZWUgLS1maW5kLWNvcGllcy1oYXJkZXIgLS1ybWRpciBcCisJCXJlbW90ZXMvZ2l0LXN2bi4ubXlicmFuY2giIHx8IHRydWUKKworCituYW1lPSdkZXRlY3Qgbm9kZSBjaGFuZ2UgZnJvbSBkaXJlY3RvcnkgdG8gZmlsZSAjMScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIiRuYW1lIiAiCisJcm0gLXJmIGRpciAnJEdJVF9ESVInL2luZGV4ICYmCisJZ2l0IGNoZWNrb3V0IC1mIC1iIG15YnJhbmNoMiByZW1vdGVzL2dpdC1zdm4gJiYKKwltdiBiYXIvenp6IHp6eiAmJgorCXJtIC1yZiBiYXIgJiYKKwltdiB6enogYmFyICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLXJlbW92ZSAtLSBiYXIvenp6ICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLSBiYXIgJiYKKwlnaXQgY29tbWl0IC1tICckbmFtZScgJiYKKwkhIGdpdC1zdm4gc2V0LXRyZWUgLS1maW5kLWNvcGllcy1oYXJkZXIgLS1ybWRpciBcCisJCXJlbW90ZXMvZ2l0LXN2bi4ubXlicmFuY2gyIiB8fCB0cnVlCisKKworbmFtZT0nZGV0ZWN0IG5vZGUgY2hhbmdlIGZyb20gZmlsZSB0byBkaXJlY3RvcnkgIzInCit0ZXN0X2V4cGVjdF9zdWNjZXNzICIkbmFtZSIgIgorCXJtIC1mICckR0lUX0RJUicvaW5kZXggJiYKKwlnaXQgY2hlY2tvdXQgLWYgLWIgbXlicmFuY2gzIHJlbW90ZXMvZ2l0LXN2biAmJgorCXJtIGJhci96enogJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tcmVtb3ZlIGJhci96enogJiYKKwlta2RpciBiYXIvenp6ICYmCisJZWNobyB5eXkgPiBiYXIvenp6L3l5eSAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgYmFyL3p6ei95eXkgJiYKKwlnaXQgY29tbWl0IC1tICckbmFtZScgJiYKKwkhIGdpdC1zdm4gc2V0LXRyZWUgLS1maW5kLWNvcGllcy1oYXJkZXIgLS1ybWRpciBcCisJCXJlbW90ZXMvZ2l0LXN2bi4ubXlicmFuY2gzIiB8fCB0cnVlCisKKworbmFtZT0nZGV0ZWN0IG5vZGUgY2hhbmdlIGZyb20gZGlyZWN0b3J5IHRvIGZpbGUgIzInCit0ZXN0X2V4cGVjdF9zdWNjZXNzICIkbmFtZSIgIgorCXJtIC1mICckR0lUX0RJUicvaW5kZXggJiYKKwlnaXQgY2hlY2tvdXQgLWYgLWIgbXlicmFuY2g0IHJlbW90ZXMvZ2l0LXN2biAmJgorCXJtIC1yZiBkaXIgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tcmVtb3ZlIC0tIGRpci9maWxlICYmCisJdG91Y2ggZGlyICYmCisJZWNobyBhc2RmID4gZGlyICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLSBkaXIgJiYKKwlnaXQgY29tbWl0IC1tICckbmFtZScgJiYKKwkhIGdpdC1zdm4gc2V0LXRyZWUgLS1maW5kLWNvcGllcy1oYXJkZXIgLS1ybWRpciBcCisJCXJlbW90ZXMvZ2l0LXN2bi4ubXlicmFuY2g0IiB8fCB0cnVlCisKKworbmFtZT0ncmVtb3ZlIGV4ZWN1dGFibGUgYml0IGZyb20gYSBmaWxlJwordGVzdF9leHBlY3Rfc3VjY2VzcyAiJG5hbWUiICIKKwlybSAtZiAnJEdJVF9ESVInL2luZGV4ICYmCisJZ2l0IGNoZWNrb3V0IC1mIC1iIG15YnJhbmNoNSByZW1vdGVzL2dpdC1zdm4gJiYKKwljaG1vZCAteCBleGVjLnNoICYmCisJZ2l0IHVwZGF0ZS1pbmRleCBleGVjLnNoICYmCisJZ2l0IGNvbW1pdCAtbSAnJG5hbWUnICYmCisJZ2l0LXN2biBzZXQtdHJlZSAtLWZpbmQtY29waWVzLWhhcmRlciAtLXJtZGlyIFwKKwkJcmVtb3Rlcy9naXQtc3ZuLi5teWJyYW5jaDUgJiYKKwlzdm4gdXAgJyRTVk5fVFJFRScgJiYKKwl0ZXN0ICEgLXggJyRTVk5fVFJFRScvZXhlYy5zaCIKKworCituYW1lPSdhZGQgZXhlY3V0YWJsZSBiaXQgYmFjayBmaWxlJwordGVzdF9leHBlY3Rfc3VjY2VzcyAiJG5hbWUiICIKKwljaG1vZCAreCBleGVjLnNoICYmCisJZ2l0IHVwZGF0ZS1pbmRleCBleGVjLnNoICYmCisJZ2l0IGNvbW1pdCAtbSAnJG5hbWUnICYmCisJZ2l0LXN2biBzZXQtdHJlZSAtLWZpbmQtY29waWVzLWhhcmRlciAtLXJtZGlyIFwKKwkJcmVtb3Rlcy9naXQtc3ZuLi5teWJyYW5jaDUgJiYKKwlzdm4gdXAgJyRTVk5fVFJFRScgJiYKKwl0ZXN0IC14ICckU1ZOX1RSRUUnL2V4ZWMuc2giCisKKworbmFtZT0nZXhlY3V0YWJsZSBmaWxlIGJlY29tZXMgYSBzeW1saW5rIHRvIGJhci96enogKGZpbGUpJwordGVzdF9leHBlY3Rfc3VjY2VzcyAiJG5hbWUiICIKKwlybSBleGVjLnNoICYmCisJbG4gLXMgYmFyL3p6eiBleGVjLnNoICYmCisJZ2l0IHVwZGF0ZS1pbmRleCBleGVjLnNoICYmCisJZ2l0IGNvbW1pdCAtbSAnJG5hbWUnICYmCisJZ2l0LXN2biBzZXQtdHJlZSAtLWZpbmQtY29waWVzLWhhcmRlciAtLXJtZGlyIFwKKwkJcmVtb3Rlcy9naXQtc3ZuLi5teWJyYW5jaDUgJiYKKwlzdm4gdXAgJyRTVk5fVFJFRScgJiYKKwl0ZXN0IC1MICckU1ZOX1RSRUUnL2V4ZWMuc2giCisKK25hbWU9J25ldyBzeW1saW5rIGlzIGFkZGVkIHRvIGEgZmlsZSB0aGF0IHdhcyBhbHNvIGp1c3QgbWFkZSBleGVjdXRhYmxlJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICIkbmFtZSIgIgorCWNobW9kICt4IGJhci96enogJiYKKwlsbiAtcyBiYXIvenp6IGV4ZWMtMi5zaCAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgYmFyL3p6eiBleGVjLTIuc2ggJiYKKwlnaXQgY29tbWl0IC1tICckbmFtZScgJiYKKwlnaXQtc3ZuIHNldC10cmVlIC0tZmluZC1jb3BpZXMtaGFyZGVyIC0tcm1kaXIgXAorCQlyZW1vdGVzL2dpdC1zdm4uLm15YnJhbmNoNSAmJgorCXN2biB1cCAnJFNWTl9UUkVFJyAmJgorCXRlc3QgLXggJyRTVk5fVFJFRScvYmFyL3p6eiAmJgorCXRlc3QgLUwgJyRTVk5fVFJFRScvZXhlYy0yLnNoIgorCituYW1lPSdtb2RpZnkgYSBzeW1saW5rIHRvIGJlY29tZSBhIGZpbGUnCit0ZXN0X2V4cGVjdF9zdWNjZXNzICIkbmFtZSIgIgorCWVjaG8gZ2l0IGhlbHAgPiBoZWxwIHx8IHRydWUgJiYKKwlybSBleGVjLTIuc2ggJiYKKwljcCBoZWxwIGV4ZWMtMi5zaCAmJgorCWdpdCB1cGRhdGUtaW5kZXggZXhlYy0yLnNoICYmCisJZ2l0IGNvbW1pdCAtbSAnJG5hbWUnICYmCisJZ2l0LXN2biBzZXQtdHJlZSAtLWZpbmQtY29waWVzLWhhcmRlciAtLXJtZGlyIFwKKwkJcmVtb3Rlcy9naXQtc3ZuLi5teWJyYW5jaDUgJiYKKwlzdm4gdXAgJyRTVk5fVFJFRScgJiYKKwl0ZXN0IC1mICckU1ZOX1RSRUUnL2V4ZWMtMi5zaCAmJgorCXRlc3QgISAtTCAnJFNWTl9UUkVFJy9leGVjLTIuc2ggJiYKKwlnaXQgZGlmZiBoZWxwICRTVk5fVFJFRS9leGVjLTIuc2giCisKK2lmIHRlc3QgIiRoYXZlX3V0ZjgiID0gdAordGhlbgorCW5hbWU9ImNvbW1pdCB3aXRoIFVURi04IG1lc3NhZ2U6IGxvY2FsZTogJEdJVF9TVk5fTENfQUxMIgorCUxDX0FMTD0iJEdJVF9TVk5fTENfQUxMIgorCWV4cG9ydCBMQ19BTEwKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICIkbmFtZSIgIgorCQllY2hvICcjIGhlbGxvJyA+PiBleGVjLTIuc2ggJiYKKwkJZ2l0IHVwZGF0ZS1pbmRleCBleGVjLTIuc2ggJiYKKwkJZ2l0IGNvbW1pdCAtbSAnw6nDr+KIjycgJiYKKwkJZ2l0LXN2biBzZXQtdHJlZSBIRUFEIgorCXVuc2V0IExDX0FMTAorZWxzZQorCWVjaG8gIlVURi04IGxvY2FsZSBub3Qgc2V0LCB0ZXN0IHNraXBwZWQgKCRHSVRfU1ZOX0xDX0FMTCkiCitmaQorCituYW1lPSd0ZXN0IGZldGNoIGZ1bmN0aW9uYWxpdHkgKHN2biA9PiBnaXQpIHdpdGggYWx0ZXJuYXRlIEdJVF9TVk5fSUQnCitHSVRfU1ZOX0lEPWFsdAorZXhwb3J0IEdJVF9TVk5fSUQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIiRuYW1lIiBcCisgICAgImdpdC1zdm4gaW5pdCAkc3ZucmVwbyAmJiBnaXQtc3ZuIGZldGNoICYmCisgICAgIGdpdCByZXYtbGlzdCAtLXByZXR0eT1yYXcgcmVtb3Rlcy9naXQtc3ZuIHwgZ3JlcCBedHJlZSB8IHVuaXEgPiBhICYmCisgICAgIGdpdCByZXYtbGlzdCAtLXByZXR0eT1yYXcgcmVtb3Rlcy9hbHQgfCBncmVwIF50cmVlIHwgdW5pcSA+IGIgJiYKKyAgICAgZ2l0IGRpZmYgYSBiIgorCituYW1lPSdjaGVjayBpbXBvcnRlZCB0cmVlIGNoZWNrc3VtcyBleHBlY3RlZCB0cmVlIGNoZWNrc3VtcycKK3JtIC1mIGV4cGVjdGVkCitpZiB0ZXN0ICIkaGF2ZV91dGY4IiA9IHQKK3RoZW4KKwllY2hvIHRyZWUgYmY1MjIzNTM1ODZiMWI4ODM0ODhmMmJjNzNkYWIwZDlmNzc0YjlhOSA+IGV4cGVjdGVkCitmaQorY2F0ID4+IGV4cGVjdGVkIDw8XEVPRgordHJlZSA4MzY1NGJiMzZmMDE5YWU0ZmU3N2EwMTcxZjgxMDc1OTcyMDg3NjI0Cit0cmVlIDAzMWI4ZDU1N2FmYzZmZWE1Mjg5NGVhZWJiNDViZWM1MmYxYmE2ZDEKK3RyZWUgMGIwOTRjYmZmMTcxNjhmMjRjMzAyZTI5N2Y1NWJmYWM2NWViOGJkMwordHJlZSBkNjY3MjcwYTFmN2IxMDlmNWViM2FhZWEyMWVkZTE0YjU2YmZkZDZlCit0cmVlIDU2YTMwYjk2NjYxOWI4NjM2NzRmNTk3ODY5NmY0YTM1OTRmMmZjYTkKK3RyZWUgZDY2NzI3MGExZjdiMTA5ZjVlYjNhYWVhMjFlZGUxNGI1NmJmZGQ2ZQordHJlZSA4ZjUxZjc0Y2YwMTYzYWZjOWFkNjhhNGIxNTM3Mjg4YzQ1NThiNWE0CitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiJG5hbWUiICJnaXQgZGlmZiBhIGV4cGVjdGVkIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdleGl0IGlmIHJlbW90ZSByZWZzIGFyZSBhbWJpZ2lvdXMnICIKKyAgICAgICAgZ2l0IGNvbmZpZyAtLWFkZCBzdm4tcmVtb3RlLnN2bi5mZXRjaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXI6cmVmcy9yZW1vdGVzL2dpdC1zdm4gJiYKKwkhIGdpdC1zdm4gbWlncmF0ZQorIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdleGl0IGlmIGluaXQtaW5nIGEgd291bGQgY2xvYmJlciBhIFVSTCcgIgorICAgICAgICBzdm5hZG1pbiBjcmVhdGUgJHtQV0R9L3N2bnJlcG8yICYmCisgICAgICAgIHN2biBta2RpciAtbSAnbWtkaXIgYmFyJyAke3N2bnJlcG99Mi9iYXIgJiYKKyAgICAgICAgZ2l0IGNvbmZpZyAtLXVuc2V0IHN2bi1yZW1vdGUuc3ZuLmZldGNoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ15iYXI6cmVmcy9yZW1vdGVzL2dpdC1zdm4kJyAmJgorCSEgZ2l0LXN2biBpbml0ICR7c3ZucmVwb30yL2JhcgorICAgICAgICAiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAnaW5pdCBhbGxvd3MgdXMgdG8gY29ubmVjdCB0byBhbm90aGVyIGRpcmVjdG9yeSBpbiB0aGUgc2FtZSByZXBvJyAiCisgICAgICAgIGdpdC1zdm4gaW5pdCAtLW1pbmltaXplLXVybCAtaSBiYXIgJHN2bnJlcG8vYmFyICYmCisgICAgICAgIGdpdCBjb25maWcgLS1nZXQgc3ZuLXJlbW90ZS5zdm4uZmV0Y2ggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ15iYXI6cmVmcy9yZW1vdGVzL2JhciQnICYmCisgICAgICAgIGdpdCBjb25maWcgLS1nZXQgc3ZuLXJlbW90ZS5zdm4uZmV0Y2ggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ146cmVmcy9yZW1vdGVzL2dpdC1zdm4kJworICAgICAgICAiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FibGUgdG8gZGNvbW1pdCB0byBhIHN1YmRpcmVjdG9yeScgIgorCWdpdC1zdm4gZmV0Y2ggLWkgYmFyICYmCisJZ2l0IGNoZWNrb3V0IC1iIG15LWJhciByZWZzL3JlbW90ZXMvYmFyICYmCisJZWNobyBhYmMgPiBkICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBkICYmCisJZ2l0IGNvbW1pdCAtbSAnL2Jhci9kIHNob3VsZCBiZSBpbiB0aGUgbG9nJyAmJgorCWdpdC1zdm4gZGNvbW1pdCAtaSBiYXIgJiYKKwl0ZXN0IC16IFwiXGBnaXQgZGlmZiByZWZzL2hlYWRzL215LWJhciByZWZzL3JlbW90ZXMvYmFyXGBcIiAmJgorCW1rZGlyIG5ld2RpciAmJgorCWVjaG8gbmV3ID4gbmV3ZGlyL2RpciAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgbmV3ZGlyL2RpciAmJgorCWdpdCBjb21taXQgLW0gJ2FkZCBhIG5ldyBkaXJlY3RvcnknICYmCisJZ2l0LXN2biBkY29tbWl0IC1pIGJhciAmJgorCXRlc3QgLXogXCJcYGdpdCBkaWZmIHJlZnMvaGVhZHMvbXktYmFyIHJlZnMvcmVtb3Rlcy9iYXJcYFwiICYmCisJZWNobyBmb28gPj4gbmV3ZGlyL2RpciAmJgorCWdpdCB1cGRhdGUtaW5kZXggbmV3ZGlyL2RpciAmJgorCWdpdCBjb21taXQgLW0gJ21vZGlmeSBhIGZpbGUgaW4gbmV3IGRpcmVjdG9yeScgJiYKKwlnaXQtc3ZuIGRjb21taXQgLWkgYmFyICYmCisJdGVzdCAteiBcIlxgZ2l0IGRpZmYgcmVmcy9oZWFkcy9teS1iYXIgcmVmcy9yZW1vdGVzL2JhclxgXCIKKwkiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FibGUgdG8gc2V0LXRyZWUgdG8gYSBzdWJkaXJlY3RvcnknICIKKwllY2hvIGNiYSA+IGQgJiYKKwlnaXQgdXBkYXRlLWluZGV4IGQgJiYKKwlnaXQgY29tbWl0IC1tICd1cGRhdGUgL2Jhci9kJyAmJgorCWdpdC1zdm4gc2V0LXRyZWUgLWkgYmFyIEhFQUQgJiYKKwl0ZXN0IC16IFwiXGBnaXQgZGlmZiByZWZzL2hlYWRzL215LWJhciByZWZzL3JlbW90ZXMvYmFyXGBcIgorCSIKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q5MTAxLWdpdC1zdm4tcHJvcHMuc2ggYi90L3Q5MTAxLWdpdC1zdm4tcHJvcHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDdhNzA0NwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDkxMDEtZ2l0LXN2bi1wcm9wcy5zaApAQCAtMCwwICsxLDIxNyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBFcmljIFdvbmcKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LXN2biBwcm9wZXJ0eSB0ZXN0cycKKy4gLi9saWItZ2l0LXN2bi5zaAorCitta2RpciBpbXBvcnQKKworYV9jcmxmPQorYV9sZj0KK2FfY3I9CithX25lX2NybGY9CithX25lX2xmPQorYV9uZV9jcj0KK2FfZW1wdHk9CithX2VtcHR5X2xmPQorYV9lbXB0eV9jcj0KK2FfZW1wdHlfY3JsZj0KKworY2QgaW1wb3J0CisJY2F0ID4+IGt3LmMgPDxcRU9GCisvKiBTb21lYm9keSBwcmVtYXR1cmVseSBwdXQgYSBrZXl3b3JkIGludG8gdGhpcyBmaWxlICovCisvKiAkSWQkICovCitFT0YKKworCXByaW50ZiAiSGVsbG9cclxuV29ybGRcclxuIiA+IGNybGYKKwlhX2NybGY9YGdpdC1oYXNoLW9iamVjdCAtdyBjcmxmYAorCXByaW50ZiAiSGVsbG9ccldvcmxkXHIiID4gY3IKKwlhX2NyPWBnaXQtaGFzaC1vYmplY3QgLXcgY3JgCisJcHJpbnRmICJIZWxsb1xuV29ybGRcbiIgPiBsZgorCWFfbGY9YGdpdC1oYXNoLW9iamVjdCAtdyBsZmAKKworCXByaW50ZiAiSGVsbG9cclxuV29ybGQiID4gbmVfY3JsZgorCWFfbmVfY3JsZj1gZ2l0LWhhc2gtb2JqZWN0IC13IG5lX2NybGZgCisJcHJpbnRmICJIZWxsb1xuV29ybGQiID4gbmVfbGYKKwlhX25lX2xmPWBnaXQtaGFzaC1vYmplY3QgLXcgbmVfbGZgCisJcHJpbnRmICJIZWxsb1xyV29ybGQiID4gbmVfY3IKKwlhX25lX2NyPWBnaXQtaGFzaC1vYmplY3QgLXcgbmVfY3JgCisKKwl0b3VjaCBlbXB0eQorCWFfZW1wdHk9YGdpdC1oYXNoLW9iamVjdCAtdyBlbXB0eWAKKwlwcmludGYgIlxuIiA+IGVtcHR5X2xmCisJYV9lbXB0eV9sZj1gZ2l0LWhhc2gtb2JqZWN0IC13IGVtcHR5X2xmYAorCXByaW50ZiAiXHIiID4gZW1wdHlfY3IKKwlhX2VtcHR5X2NyPWBnaXQtaGFzaC1vYmplY3QgLXcgZW1wdHlfY3JgCisJcHJpbnRmICJcclxuIiA+IGVtcHR5X2NybGYKKwlhX2VtcHR5X2NybGY9YGdpdC1oYXNoLW9iamVjdCAtdyBlbXB0eV9jcmxmYAorCisJc3ZuIGltcG9ydCAtLW5vLWF1dG8tcHJvcHMgLW0gJ2ltcG9ydCBmb3IgZ2l0LXN2bicgLiAiJHN2bnJlcG8iID4vZGV2L251bGwKK2NkIC4uCisKK3JtIC1yZiBpbXBvcnQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrb3V0IHdvcmtpbmcgY29weSBmcm9tIHN2bicgInN2biBjbyAkc3ZucmVwbyB0ZXN0X3djIgordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgc29tZSBjb21taXRzIHRvIHN2bicgXAorCSdjZCB0ZXN0X3djICYmCisJCWVjaG8gR3JlZXRpbmdzID4+IGt3LmMgJiYKKwkJcG9rZSBrdy5jICYmCisJCXN2biBjb21taXQgLW0gIk5vdCB5ZXQgYW4gSWQiICYmCisJCWVjaG8gSGVsbG8gd29ybGQgPj4ga3cuYyAmJgorCQlwb2tlIGt3LmMgJiYKKwkJc3ZuIGNvbW1pdCAtbSAiTW9kaWZpZWQgZmlsZSwgYnV0IHN0aWxsIG5vdCB5ZXQgYW4gSWQiICYmCisJCXN2biBwcm9wc2V0IHN2bjprZXl3b3JkcyBJZCBrdy5jICYmCisJCXBva2Uga3cuYyAmJgorCQlzdm4gY29tbWl0IC1tICJQcm9wc2V0IElkIiAmJgorCWNkIC4uJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbml0aWFsaXplIGdpdC1zdm4nICJnaXQtc3ZuIGluaXQgJHN2bnJlcG8iCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmZXRjaCByZXZpc2lvbnMgZnJvbSBzdm4nICdnaXQtc3ZuIGZldGNoJworCituYW1lPSd0ZXN0IHN2bjprZXl3b3JkcyBpZ25vcmluZycKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIiRuYW1lIiBcCisJJ2dpdCBjaGVja291dCAtYiBteWJyYW5jaCByZW1vdGVzL2dpdC1zdm4gJiYKKwllY2hvIEhpIGFnYWluID4+IGt3LmMgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJ0ZXN0IGtleXdvcmRzIGlnbm9yaW5nIiAmJgorCWdpdC1zdm4gc2V0LXRyZWUgcmVtb3Rlcy9naXQtc3ZuLi5teWJyYW5jaCAmJgorCWdpdCBwdWxsIC4gcmVtb3Rlcy9naXQtc3ZuJworCitleHBlY3Q9Jy8qICRJZCQgKi8nCitnb3Q9ImBzZWQgLW5lIDJwIGt3LmNgIgordGVzdF9leHBlY3Rfc3VjY2VzcyAncmF3ICRJZCQgZm91bmQgaW4ga3cuYycgInRlc3QgJyRleHBlY3QnID0gJyRnb3QnIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJwcm9wc2V0IENSIG9uIGNybGYgZmlsZXMiIFwKKwknY2QgdGVzdF93YyAmJgorCQlzdm4gcHJvcHNldCBzdm46ZW9sLXN0eWxlIENSIGVtcHR5ICYmCisJCXN2biBwcm9wc2V0IHN2bjplb2wtc3R5bGUgQ1IgY3JsZiAmJgorCQlzdm4gcHJvcHNldCBzdm46ZW9sLXN0eWxlIENSIG5lX2NybGYgJiYKKwkJc3ZuIGNvbW1pdCAtbSAicHJvcHNldCBDUiBvbiBjcmxmIGZpbGVzIiAmJgorCSBjZCAuLicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmV0Y2ggYW5kIHB1bGwgbGF0ZXN0IGZyb20gc3ZuIGFuZCBjaGVja291dCBhIG5ldyB3YycgXAorCSJnaXQtc3ZuIGZldGNoICYmCisJIGdpdCBwdWxsIC4gcmVtb3Rlcy9naXQtc3ZuICYmCisJIHN2biBjbyAkc3ZucmVwbyBuZXdfd2MiCisKK2ZvciBpIGluIGNybGYgbmVfY3JsZiBsZiBuZV9sZiBjciBuZV9jciBlbXB0eV9jciBlbXB0eV9sZiBlbXB0eSBlbXB0eV9jcmxmCitkbworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgIkNvbXBhcmluZyAkaSIgImNtcCAkaSBuZXdfd2MvJGkiCitkb25lCisKKworY2QgdGVzdF93YworCXByaW50ZiAnJElkJFxySGVsbG9ccldvcmxkXHInID4gY3IKKwlwcmludGYgJyRJZCRcckhlbGxvXHJXb3JsZCcgPiBuZV9jcgorCWFfY3I9YHByaW50ZiAnJElkJFxyXG5IZWxsb1xyXG5Xb3JsZFxyXG4nIHwgZ2l0LWhhc2gtb2JqZWN0IC0tc3RkaW5gCisJYV9uZV9jcj1gcHJpbnRmICckSWQkXHJcbkhlbGxvXHJcbldvcmxkJyB8IGdpdC1oYXNoLW9iamVjdCAtLXN0ZGluYAorCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgJ1NldCBDUkxGIG9uIGNyIGZpbGVzJyBcCisJJ3N2biBwcm9wc2V0IHN2bjplb2wtc3R5bGUgQ1JMRiBjciAmJgorCSBzdm4gcHJvcHNldCBzdm46ZW9sLXN0eWxlIENSTEYgbmVfY3IgJiYKKwkgc3ZuIHByb3BzZXQgc3ZuOmtleXdvcmRzIElkIGNyICYmCisJIHN2biBwcm9wc2V0IHN2bjprZXl3b3JkcyBJZCBuZV9jciAmJgorCSBzdm4gY29tbWl0IC1tICJwcm9wc2V0IENSTEYgb24gY3IgZmlsZXMiJworY2QgLi4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZldGNoIGFuZCBwdWxsIGxhdGVzdCBmcm9tIHN2bicgXAorCSdnaXQtc3ZuIGZldGNoICYmIGdpdCBwdWxsIC4gcmVtb3Rlcy9naXQtc3ZuJworCitiX2NyPSJgZ2l0LWhhc2gtb2JqZWN0IGNyYCIKK2JfbmVfY3I9ImBnaXQtaGFzaC1vYmplY3QgbmVfY3JgIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdDUkxGICsgJElkJCcgInRlc3QgJyRhX2NyJyA9ICckYl9jciciCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdDUkxGICsgJElkJCAobm8gbmV3bGluZSknICJ0ZXN0ICckYV9uZV9jcicgPSAnJGJfbmVfY3InIgorCitjYXQgPiBzaG93LWlnbm9yZS5leHBlY3QgPDxcRU9GCisKKyMgLworL25vLXN1Y2gtZmlsZSoKKworIyAvZGVlcGx5LworL2RlZXBseS9uby1zdWNoLWZpbGUqCisKKyMgL2RlZXBseS9uZXN0ZWQvCisvZGVlcGx5L25lc3RlZC9uby1zdWNoLWZpbGUqCisKKyMgL2RlZXBseS9uZXN0ZWQvZGlyZWN0b3J5LworL2RlZXBseS9uZXN0ZWQvZGlyZWN0b3J5L25vLXN1Y2gtZmlsZSoKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0ZXN0IHNob3ctaWdub3JlJyAiCisJY2QgdGVzdF93YyAmJgorCW1rZGlyIC1wIGRlZXBseS9uZXN0ZWQvZGlyZWN0b3J5ICYmCisJdG91Y2ggZGVlcGx5L25lc3RlZC9kaXJlY3RvcnkvLmtlZXAgJiYKKwlzdm4gYWRkIGRlZXBseSAmJgorCXN2biB1cCAmJgorCXN2biBwcm9wc2V0IC1SIHN2bjppZ25vcmUgJ25vLXN1Y2gtZmlsZSonIC4KKwlzdm4gY29tbWl0IC1tICdwcm9wc2V0IHN2bjppZ25vcmUnCisJY2QgLi4gJiYKKwlnaXQtc3ZuIHNob3ctaWdub3JlID4gc2hvdy1pZ25vcmUuZ290ICYmCisJY21wIHNob3ctaWdub3JlLmV4cGVjdCBzaG93LWlnbm9yZS5nb3QKKwkiCisKK2NhdCA+Y3JlYXRlLWlnbm9yZS5leHBlY3QgPDxcRU9GCisvbm8tc3VjaC1maWxlKgorRU9GCisKK2NhdCA+Y3JlYXRlLWlnbm9yZS1pbmRleC5leHBlY3QgPDxcRU9GCisxMDA2NDQgOGM1MmU1ZGZjZDBhOGI2YjZiY2ZlNmI0MWI4OWJjYmY0OTM3MThhNSAwCS5naXRpZ25vcmUKKzEwMDY0NCA4YzUyZTVkZmNkMGE4YjZiNmJjZmU2YjQxYjg5YmNiZjQ5MzcxOGE1IDAJZGVlcGx5Ly5naXRpZ25vcmUKKzEwMDY0NCA4YzUyZTVkZmNkMGE4YjZiNmJjZmU2YjQxYjg5YmNiZjQ5MzcxOGE1IDAJZGVlcGx5L25lc3RlZC8uZ2l0aWdub3JlCisxMDA2NDQgOGM1MmU1ZGZjZDBhOGI2YjZiY2ZlNmI0MWI4OWJjYmY0OTM3MThhNSAwCWRlZXBseS9uZXN0ZWQvZGlyZWN0b3J5Ly5naXRpZ25vcmUKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0ZXN0IGNyZWF0ZS1pZ25vcmUnICIKKwlnaXQtc3ZuIGZldGNoICYmIGdpdCBwdWxsIC4gcmVtb3Rlcy9naXQtc3ZuICYmCisJZ2l0LXN2biBjcmVhdGUtaWdub3JlICYmCisJY21wIC4vLmdpdGlnbm9yZSBjcmVhdGUtaWdub3JlLmV4cGVjdCAmJgorCWNtcCAuL2RlZXBseS8uZ2l0aWdub3JlIGNyZWF0ZS1pZ25vcmUuZXhwZWN0ICYmCisJY21wIC4vZGVlcGx5L25lc3RlZC8uZ2l0aWdub3JlIGNyZWF0ZS1pZ25vcmUuZXhwZWN0ICYmCisJY21wIC4vZGVlcGx5L25lc3RlZC9kaXJlY3RvcnkvLmdpdGlnbm9yZSBjcmVhdGUtaWdub3JlLmV4cGVjdCAmJgorCWdpdCBscy1maWxlcyAtcyB8IGdyZXAgZ2l0aWdub3JlIHwgY21wIC0gY3JlYXRlLWlnbm9yZS1pbmRleC5leHBlY3QKKwkiCisKK2NhdCA+cHJvcC5leHBlY3QgPDxcRU9GCituby1zdWNoLWZpbGUqCisKK0VPRgorY2F0ID5wcm9wMi5leHBlY3QgPDxcRU9GCis4CitFT0YKKworIyBUaGlzIHRlc3QgY2FuIGJlIGltcHJvdmVkOiBzaW5jZSBhbGwgdGhlIHN2bjppZ25vcmUgY29udGFpbiB0aGUgc2FtZQorIyBwYXR0ZXJuLCBpdCBjYW4gcGFzcyBldmVuIHRob3VnaCB0aGUgcHJvcGdldCBkaWQgbm90IGV4ZWN1dGUgb24gdGhlCisjIHJpZ2h0IGRpcmVjdG9yeS4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Rlc3QgcHJvcGdldCcgIgorCWdpdC1zdm4gcHJvcGdldCBzdm46aWdub3JlIC4gfCBjbXAgLSBwcm9wLmV4cGVjdCAmJgorCWNkIGRlZXBseSAmJgorCWdpdC1zdm4gcHJvcGdldCBzdm46aWdub3JlIC4gfCBjbXAgLSAuLi9wcm9wLmV4cGVjdCAmJgorCWdpdC1zdm4gcHJvcGdldCBzdm46ZW50cnk6Y29tbWl0dGVkLXJldiBuZXN0ZWQvZGlyZWN0b3J5Ly5rZWVwIFwKKwkgIHwgY21wIC0gLi4vcHJvcDIuZXhwZWN0ICYmCisJZ2l0LXN2biBwcm9wZ2V0IHN2bjppZ25vcmUgLi4gfCBjbXAgLSAuLi9wcm9wLmV4cGVjdCAmJgorCWdpdC1zdm4gcHJvcGdldCBzdm46aWdub3JlIG5lc3RlZC8gfCBjbXAgLSAuLi9wcm9wLmV4cGVjdCAmJgorCWdpdC1zdm4gcHJvcGdldCBzdm46aWdub3JlIC4vbmVzdGVkIHwgY21wIC0gLi4vcHJvcC5leHBlY3QgJiYKKwlnaXQtc3ZuIHByb3BnZXQgc3ZuOmlnbm9yZSAuLi8uL2RlZXBseS9uZXN0ZWQgfCBjbXAgLSAuLi9wcm9wLmV4cGVjdAorCSIKKworY2F0ID5wcm9wLmV4cGVjdCA8PFxFT0YKK1Byb3BlcnRpZXMgb24gJy4nOgorICBzdm46ZW50cnk6Y29tbWl0dGVkLWRhdGUKKyAgc3ZuOmVudHJ5OmNvbW1pdHRlZC1yZXYKKyAgc3ZuOmVudHJ5Omxhc3QtYXV0aG9yCisgIHN2bjplbnRyeTp1dWlkCisgIHN2bjppZ25vcmUKK0VPRgorY2F0ID5wcm9wMi5leHBlY3QgPDxcRU9GCitQcm9wZXJ0aWVzIG9uICduZXN0ZWQvZGlyZWN0b3J5Ly5rZWVwJzoKKyAgc3ZuOmVudHJ5OmNvbW1pdHRlZC1kYXRlCisgIHN2bjplbnRyeTpjb21taXR0ZWQtcmV2CisgIHN2bjplbnRyeTpsYXN0LWF1dGhvcgorICBzdm46ZW50cnk6dXVpZAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Rlc3QgcHJvcGxpc3QnICIKKwlnaXQtc3ZuIHByb3BsaXN0IC4gfCBjbXAgLSBwcm9wLmV4cGVjdCAmJgorCWdpdC1zdm4gcHJvcGxpc3QgbmVzdGVkL2RpcmVjdG9yeS8ua2VlcCB8IGNtcCAtIHByb3AyLmV4cGVjdAorCSIKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q5MTAyLWdpdC1zdm4tZGVlcC1ybWRpci5zaCBiL3QvdDkxMDItZ2l0LXN2bi1kZWVwLXJtZGlyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRlMDgwODMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q5MTAyLWdpdC1zdm4tZGVlcC1ybWRpci5zaApAQCAtMCwwICsxLDMwIEBACisjIS9iaW4vc2gKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1zdm4gcm1kaXInCisuIC4vbGliLWdpdC1zdm4uc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5pdGlhbGl6ZSByZXBvJyAiCisJbWtkaXIgaW1wb3J0ICYmCisJY2QgaW1wb3J0ICYmCisJbWtkaXIgLXAgZGVlcGx5L25lc3RlZC9kaXJlY3RvcnkvbnVtYmVyLzEgJiYKKwlta2RpciAtcCBkZWVwbHkvbmVzdGVkL2RpcmVjdG9yeS9udW1iZXIvMiAmJgorCWVjaG8gZm9vID4gZGVlcGx5L25lc3RlZC9kaXJlY3RvcnkvbnVtYmVyLzEvZmlsZSAmJgorCWVjaG8gZm9vID4gZGVlcGx5L25lc3RlZC9kaXJlY3RvcnkvbnVtYmVyLzIvYW5vdGhlciAmJgorCXN2biBpbXBvcnQgLW0gJ2ltcG9ydCBmb3IgZ2l0LXN2bicgLiAkc3ZucmVwbyAmJgorCWNkIC4uCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtaXJyb3IgdmlhIGdpdC1zdm4nICIKKwlnaXQtc3ZuIGluaXQgJHN2bnJlcG8gJiYKKwlnaXQtc3ZuIGZldGNoICYmCisJZ2l0IGNoZWNrb3V0IC1mIC1iIHRlc3Qtcm1kaXIgcmVtb3Rlcy9naXQtc3ZuCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdUcnkgYSBjb21taXQgb24gcm1kaXInICIKKwlnaXQgcm0gLWYgZGVlcGx5L25lc3RlZC9kaXJlY3RvcnkvbnVtYmVyLzIvYW5vdGhlciAmJgorCWdpdCBjb21taXQgLWEgLW0gJ3JlbW92ZSBhbm90aGVyJyAmJgorCWdpdC1zdm4gc2V0LXRyZWUgLS1ybWRpciBIRUFEICYmCisJc3ZuIGxzIC1SICRzdm5yZXBvIHwgZ3JlcCBeZGVlcGx5L25lc3RlZC9kaXJlY3RvcnkvbnVtYmVyLzEKKwkiCisKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q5MTAzLWdpdC1zdm4tdHJhY2tlZC1kaXJlY3RvcnktcmVtb3ZlZC5zaCBiL3QvdDkxMDMtZ2l0LXN2bi10cmFja2VkLWRpcmVjdG9yeS1yZW1vdmVkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBmMGIwZmQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q5MTAzLWdpdC1zdm4tdHJhY2tlZC1kaXJlY3RvcnktcmVtb3ZlZC5zaApAQCAtMCwwICsxLDM5IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3IEVyaWMgV29uZworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtc3ZuIHRyYWNraW5nIHJlbW92ZWQgdG9wLWxldmVsIHBhdGgnCisuIC4vbGliLWdpdC1zdm4uc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWFrZSBoaXN0b3J5IGZvciB0cmFja2luZycgJworCW1rZGlyIGltcG9ydCAmJgorCW1rZGlyIGltcG9ydC90cnVuayAmJgorCWVjaG8gaGVsbG8gPj4gaW1wb3J0L3RydW5rL1JFQURNRSAmJgorCXN2biBpbXBvcnQgLW0gaW5pdGlhbCBpbXBvcnQgJHN2bnJlcG8gJiYKKwlybSAtcmYgaW1wb3J0ICYmCisJc3ZuIGNvICRzdm5yZXBvL3RydW5rIHRydW5rICYmCisJZWNobyBieWUgYnllID4+IHRydW5rL1JFQURNRSAmJgorCXN2biBybSAtbSAiZ29uZSIgJHN2bnJlcG8vdHJ1bmsgJiYKKwlybSAtcmYgdHJ1bmsgJiYKKwlta2RpciB0cnVuayAmJgorCWVjaG8gIm5ldyIgPiB0cnVuay9GT0xMT1dNRSAmJgorCXN2biBpbXBvcnQgLW0gIm5ldyB0cnVuayIgdHJ1bmsgJHN2bnJlcG8vdHJ1bmsKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2xvbmUgcmVwbyB3aXRoIGdpdCcgJworCWdpdCBzdm4gY2xvbmUgLXMgJHN2bnJlcG8geCAmJgorCXRlc3QgLWYgeC9GT0xMT1dNRSAmJgorCXRlc3QgISAtZiB4L1JFQURNRQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtYWtlIHN1cmUgcjIgc3RpbGwgaGFzIG9sZCBmaWxlJyAnCisJY2QgeCAmJgorCQl0ZXN0IC1uICIkKGdpdCBzdm4gZmluZC1yZXYgcjEpIiAmJgorCQlnaXQgcmVzZXQgLS1oYXJkICQoZ2l0IHN2biBmaW5kLXJldiByMSkgJiYKKwkJdGVzdCAtZiBSRUFETUUgJiYKKwkJdGVzdCAhIC1mIEZPTExPV01FICYmCisJCXRlc3QgeCQoZ2l0IHN2biBmaW5kLXJldiByMikgPSB4CisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90OTEwNC1naXQtc3ZuLWZvbGxvdy1wYXJlbnQuc2ggYi90L3Q5MTA0LWdpdC1zdm4tZm9sbG93LXBhcmVudC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YmE3NjMwCi0tLSAvZGV2L251bGwKKysrIGIvdC90OTEwNC1naXQtc3ZuLWZvbGxvdy1wYXJlbnQuc2gKQEAgLTAsMCArMSwxNzEgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgRXJpYyBXb25nCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1zdm4gZmV0Y2hpbmcnCisuIC4vbGliLWdpdC1zdm4uc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5pdGlhbGl6ZSByZXBvJyAiCisJbWtkaXIgaW1wb3J0ICYmCisJY2QgaW1wb3J0ICYmCisJbWtkaXIgLXAgdHJ1bmsgJiYKKwllY2hvIGhlbGxvID4gdHJ1bmsvcmVhZG1lICYmCisJc3ZuIGltcG9ydCAtbSAnaW5pdGlhbCcgLiAkc3ZucmVwbyAmJgorCWNkIC4uICYmCisJc3ZuIGNvICRzdm5yZXBvIHdjICYmCisJY2Qgd2MgJiYKKwllY2hvIHdvcmxkID4+IHRydW5rL3JlYWRtZSAmJgorCXBva2UgdHJ1bmsvcmVhZG1lICYmCisJc3ZuIGNvbW1pdCAtbSAnYW5vdGhlciBjb21taXQnICYmCisJc3ZuIHVwICYmCisJc3ZuIG12IHRydW5rIHRodW5rICYmCisJZWNobyBnb29kYnllID4+IHRodW5rL3JlYWRtZSAmJgorCXBva2UgdGh1bmsvcmVhZG1lICYmCisJc3ZuIGNvbW1pdCAtbSAnYnllIG5vdycgJiYKKwljZCAuLgorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5pdCBhbmQgZmV0Y2ggYSBtb3ZlZCBkaXJlY3RvcnknICIKKwlnaXQtc3ZuIGluaXQgLS1taW5pbWl6ZS11cmwgLWkgdGh1bmsgJHN2bnJlcG8vdGh1bmsgJiYKKwlnaXQtc3ZuIGZldGNoIC1pIHRodW5rICYmCisJdGVzdCBcIlxgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSByZWZzL3JlbW90ZXMvdGh1bmtAMlxgXCIgXAorICAgICAgICAgICA9IFwiXGBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IHJlZnMvcmVtb3Rlcy90aHVua34xXGBcIiAmJgorICAgICAgICB0ZXN0IFwiXGBnaXQgY2F0LWZpbGUgYmxvYiByZWZzL3JlbW90ZXMvdGh1bms6cmVhZG1lIHxcCisgICAgICAgICAgICAgICAgIHNlZCAtbiAtZSAnM3AnXGBcIiA9IGdvb2RieWUgJiYKKwl0ZXN0IC16IFwiXGBnaXQgY29uZmlnIC0tZ2V0IHN2bi1yZW1vdGUuc3ZuLmZldGNoIFwKKwkgICAgICAgICAnXnRydW5rOnJlZnMvcmVtb3Rlcy90aHVua0AyJCdcYFwiCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbml0IGFuZCBmZXRjaCBmcm9tIG9uZSBzdm4tcmVtb3RlJyAiCisgICAgICAgIGdpdCBjb25maWcgc3ZuLXJlbW90ZS5zdm4udXJsICRzdm5yZXBvICYmCisgICAgICAgIGdpdCBjb25maWcgLS1hZGQgc3ZuLXJlbW90ZS5zdm4uZmV0Y2ggXAorICAgICAgICAgIHRydW5rOnJlZnMvcmVtb3Rlcy9zdm4vdHJ1bmsgJiYKKyAgICAgICAgZ2l0IGNvbmZpZyAtLWFkZCBzdm4tcmVtb3RlLnN2bi5mZXRjaCBcCisgICAgICAgICAgdGh1bms6cmVmcy9yZW1vdGVzL3N2bi90aHVuayAmJgorICAgICAgICBnaXQtc3ZuIGZldGNoIC1pIHN2bi90aHVuayAmJgorCXRlc3QgXCJcYGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgcmVmcy9yZW1vdGVzL3N2bi90cnVua1xgXCIgXAorICAgICAgICAgICA9IFwiXGBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IHJlZnMvcmVtb3Rlcy9zdm4vdGh1bmt+MVxgXCIgJiYKKyAgICAgICAgdGVzdCBcIlxgZ2l0IGNhdC1maWxlIGJsb2IgcmVmcy9yZW1vdGVzL3N2bi90aHVuazpyZWFkbWUgfFwKKyAgICAgICAgICAgICAgICAgc2VkIC1uIC1lICczcCdcYFwiID0gZ29vZGJ5ZQorICAgICAgICAiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZvbGxvdyBkZWxldGVkIHBhcmVudCcgIgorICAgICAgICAoc3ZuIGNwIC1tICdyZXN1cnJlY3RpbmcgdHJ1bmsgYXMganVuaycgXAorICAgICAgICAgICAgICAgJHN2bnJlcG8vdHJ1bmtAMiAkc3ZucmVwby9qdW5rIHx8CisgICAgICAgICBzdm4gY3AgLW0gJ3Jlc3VycmVjdGluZyB0cnVuayBhcyBqdW5rJyBcCisgICAgICAgICAgICAgICAtcjIgJHN2bnJlcG8vdHJ1bmsgJHN2bnJlcG8vanVuaykgJiYKKyAgICAgICAgZ2l0IGNvbmZpZyAtLWFkZCBzdm4tcmVtb3RlLnN2bi5mZXRjaCBcCisgICAgICAgICAganVuazpyZWZzL3JlbW90ZXMvc3ZuL2p1bmsgJiYKKyAgICAgICAgZ2l0LXN2biBmZXRjaCAtaSBzdm4vdGh1bmsgJiYKKyAgICAgICAgZ2l0LXN2biBmZXRjaCAtaSBzdm4vanVuayAmJgorICAgICAgICB0ZXN0IC16IFwiXGBnaXQgZGlmZiBzdm4vanVuayBzdm4vdHJ1bmtcYFwiICYmCisgICAgICAgIHRlc3QgXCJcYGdpdCBtZXJnZS1iYXNlIHN2bi9qdW5rIHN2bi90cnVua1xgXCIgXAorICAgICAgICAgICA9IFwiXGBnaXQgcmV2LXBhcnNlIHN2bi90cnVua1xgXCIKKyAgICAgICAgIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmb2xsb3cgbGFyZ2VyIHBhcmVudCcgIgorICAgICAgICBta2RpciAtcCBpbXBvcnQvdHJ1bmsvdGh1bmsvYnVtcC90aHVkICYmCisgICAgICAgIGVjaG8gaGkgPiBpbXBvcnQvdHJ1bmsvdGh1bmsvYnVtcC90aHVkL2ZpbGUgJiYKKyAgICAgICAgc3ZuIGltcG9ydCAtbSAnaW1wb3J0IGEgbGFyZ2VyIHBhcmVudCcgaW1wb3J0ICRzdm5yZXBvL2xhcmdlci1wYXJlbnQgJiYKKyAgICAgICAgc3ZuIGNwIC1tICdoaScgJHN2bnJlcG8vbGFyZ2VyLXBhcmVudCAkc3ZucmVwby9hbm90aGVyLWxhcmdlciAmJgorICAgICAgICBnaXQtc3ZuIGluaXQgLS1taW5pbWl6ZS11cmwgLWkgbGFyZ2VyIFwKKyAgICAgICAgICAkc3ZucmVwby9hbm90aGVyLWxhcmdlci90cnVuay90aHVuay9idW1wL3RodWQgJiYKKyAgICAgICAgZ2l0LXN2biBmZXRjaCAtaSBsYXJnZXIgJiYKKyAgICAgICAgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSByZWZzL3JlbW90ZXMvbGFyZ2VyICYmCisgICAgICAgIGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgXAorICAgICAgICAgICByZWZzL3JlbW90ZXMvbGFyZ2VyLXBhcmVudC90cnVuay90aHVuay9idW1wL3RodWQgJiYKKyAgICAgICAgdGVzdCBcIlxgZ2l0IG1lcmdlLWJhc2UgXAorICAgICAgICAgICAgICAgICByZWZzL3JlbW90ZXMvbGFyZ2VyLXBhcmVudC90cnVuay90aHVuay9idW1wL3RodWQgXAorICAgICAgICAgICAgICAgICByZWZzL3JlbW90ZXMvbGFyZ2VyXGBcIiA9IFwKKyAgICAgICAgICAgICBcIlxgZ2l0IHJldi1wYXJzZSByZWZzL3JlbW90ZXMvbGFyZ2VyXGBcIgorICAgICAgICB0cnVlCisgICAgICAgICIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZm9sbG93IGhpZ2hlci1sZXZlbCBwYXJlbnQnICIKKyAgICAgICAgc3ZuIG1rZGlyIC1tICdmb2xsb3cgaGlnaGVyLWxldmVsIHBhcmVudCcgJHN2bnJlcG8vYmxvYiAmJgorICAgICAgICBzdm4gY28gJHN2bnJlcG8vYmxvYiBibG9iICYmCisgICAgICAgIGNkIGJsb2IgJiYKKyAgICAgICAgICAgICAgICBlY2hvIGhpID4gaGkgJiYKKyAgICAgICAgICAgICAgICBzdm4gYWRkIGhpICYmCisgICAgICAgICAgICAgICAgc3ZuIGNvbW1pdCAtbSAnaGloaScgJiYKKyAgICAgICAgICAgICAgICBjZCAuLgorICAgICAgICBzdm4gbWtkaXIgLW0gJ25ldyBnbG9iIGF0IHRvcCBsZXZlbCcgJHN2bnJlcG8vZ2xvYiAmJgorICAgICAgICBzdm4gbXYgLW0gJ21vdmUgYmxvYiBkb3duIGEgbGV2ZWwnICRzdm5yZXBvL2Jsb2IgJHN2bnJlcG8vZ2xvYi9ibG9iICYmCisgICAgICAgIGdpdC1zdm4gaW5pdCAtLW1pbmltaXplLXVybCAtaSBibG9iICRzdm5yZXBvL2dsb2IvYmxvYiAmJgorICAgICAgICBnaXQtc3ZuIGZldGNoIC1pIGJsb2IKKyAgICAgICAgIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmb2xsb3cgZGVsZXRlZCBkaXJlY3RvcnknICIKKwlzdm4gbXYgLW0gJ2J5ZSEnICRzdm5yZXBvL2dsb2IvYmxvYi9oaSAkc3ZucmVwby9nbG9iL2Jsb2IvYnllICYmCisJc3ZuIHJtIC1tICdyZW1vdmUgZ2xvYicgJHN2bnJlcG8vZ2xvYiAmJgorCWdpdC1zdm4gaW5pdCAtLW1pbmltaXplLXVybCAtaSBnbG9iICRzdm5yZXBvL2dsb2IgJiYKKwlnaXQtc3ZuIGZldGNoIC1pIGdsb2IgJiYKKwl0ZXN0IFwiXGBnaXQgY2F0LWZpbGUgYmxvYiByZWZzL3JlbW90ZXMvZ2xvYjpibG9iL2J5ZVxgXCIgPSBoaSAmJgorCXRlc3QgXCJcYGdpdCBscy10cmVlIHJlZnMvcmVtb3Rlcy9nbG9iIHwgd2MgLWwgXGBcIiAtZXEgMQorCSIKKworIyByZWY6IHI5MjcwIG9mIHRoZSBTdWJ2ZXJzaW9uIHJlcG9zaXRvcnk6IChodHRwOi8vc3ZuLmNvbGxhYi5uZXQvcmVwb3Mvc3ZuKQorIyBpbiB0cnVuay9zdWJ2ZXJzaW9uL2JpbmRpbmdzL3N3aWcvcGVybAordGVzdF9leHBlY3Rfc3VjY2VzcyAnZm9sbG93LXBhcmVudCBhdm9pZHMgZGVsZXRpbmcgcmVsZXZhbnQgaW5mbycgIgorCW1rZGlyIC1wIGltcG9ydC90cnVuay9zdWJ2ZXJzaW9uL2JpbmRpbmdzL3N3aWcvcGVybC90ICYmCisJZm9yIGkgaW4gYSBiIGMgOyBkbyBcCisJICBlY2hvIFwkaSA+IGltcG9ydC90cnVuay9zdWJ2ZXJzaW9uL2JpbmRpbmdzL3N3aWcvcGVybC9cJGkucG0gJiYKKwkgIGVjaG8gX1wkaSA+IGltcG9ydC90cnVuay9zdWJ2ZXJzaW9uL2JpbmRpbmdzL3N3aWcvcGVybC90L1wkaS50OyBcCisJZG9uZSAmJgorCSAgZWNobyAnYmFkIGRlbGV0ZSB0ZXN0JyA+IFwKKwkgICBpbXBvcnQvdHJ1bmsvc3VidmVyc2lvbi9iaW5kaW5ncy9zd2lnL3BlcmwvdC9sYXJnZXItcGFyZW50ICYmCisJICBlY2hvICdiYWQgZGVsZXRlIHRlc3QgMicgPiBcCisJICAgaW1wb3J0L3RydW5rL3N1YnZlcnNpb24vYmluZGluZ3Mvc3dpZy9wZXJsL2Fub3RoZXItbGFyZ2VyICYmCisJY2QgaW1wb3J0ICYmCisJICBzdm4gaW1wb3J0IC1tICdyOTI3MCB0ZXN0JyAuICRzdm5yZXBvL3I5MjcwICYmCisJY2QgLi4gJiYKKwlzdm4gY28gJHN2bnJlcG8vcjkyNzAvdHJ1bmsvc3VidmVyc2lvbi9iaW5kaW5ncy9zd2lnL3BlcmwgcjkyNzAgJiYKKwljZCByOTI3MCAmJgorCSAgc3ZuIG1rZGlyIG5hdGl2ZSAmJgorCSAgc3ZuIG12IHQgbmF0aXZlL3QgJiYKKwkgIGZvciBpIGluIGEgYiBjOyBkbyBzdm4gbXYgXCRpLnBtIG5hdGl2ZS9cJGkucG07IGRvbmUgJiYKKwkgIGVjaG8geiA+PiBuYXRpdmUvdC9jLnQgJiYKKwkgIHBva2UgbmF0aXZlL3QvYy50ICYmCisJICBzdm4gY29tbWl0IC1tICdyZW9yZyB0ZXN0JyAmJgorCWNkIC4uICYmCisJZ2l0LXN2biBpbml0IC0tbWluaW1pemUtdXJsIC1pIHI5MjcwLXQgXAorCSAgJHN2bnJlcG8vcjkyNzAvdHJ1bmsvc3VidmVyc2lvbi9iaW5kaW5ncy9zd2lnL3BlcmwvbmF0aXZlL3QgJiYKKwlnaXQtc3ZuIGZldGNoIC1pIHI5MjcwLXQgJiYKKwl0ZXN0IFxgZ2l0IHJldi1saXN0IHI5MjcwLXQgfCB3YyAtbFxgIC1lcSAyICYmCisJdGVzdCBcIlxgZ2l0IGxzLXRyZWUgLS1uYW1lLW9ubHkgcjkyNzAtdH4xXGBcIiA9IFwKKwkgICAgIFwiXGBnaXQgbHMtdHJlZSAtLW5hbWUtb25seSByOTI3MC10XGBcIgorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAidHJhY2sgaW5pdGlhbCBjaGFuZ2UgaWYgaXQgd2FzIG9ubHkgbWFkZSB0byBwYXJlbnQiICIKKwlzdm4gY3AgLW0gJ3doZWVlIScgJHN2bnJlcG8vcjkyNzAvdHJ1bmsgJHN2bnJlcG8vcjkyNzAvZHJ1bmsgJiYKKwlnaXQtc3ZuIGluaXQgLS1taW5pbWl6ZS11cmwgLWkgcjkyNzAtZCBcCisJICAkc3ZucmVwby9yOTI3MC9kcnVuay9zdWJ2ZXJzaW9uL2JpbmRpbmdzL3N3aWcvcGVybC9uYXRpdmUvdCAmJgorCWdpdC1zdm4gZmV0Y2ggLWkgcjkyNzAtZCAmJgorCXRlc3QgXGBnaXQgcmV2LWxpc3QgcjkyNzAtZCB8IHdjIC1sXGAgLWVxIDMgJiYKKwl0ZXN0IFwiXGBnaXQgbHMtdHJlZSAtLW5hbWUtb25seSByOTI3MC10XGBcIiA9IFwKKwkgICAgIFwiXGBnaXQgbHMtdHJlZSAtLW5hbWUtb25seSByOTI3MC1kXGBcIiAmJgorCXRlc3QgXCJcYGdpdCByZXYtcGFyc2UgcjkyNzAtdFxgXCIgPSBcCisJICAgICBcIlxgZ2l0IHJldi1wYXJzZSByOTI3MC1kfjFcYFwiCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJ0cmFjayBtdWx0aS1wYXJlbnQgcGF0aHMiICIKKwlzdm4gY3AgLW0gJ3Jlc3VycmVjdCAvZ2xvYicgJHN2bnJlcG8vcjkyNzAgJHN2bnJlcG8vZ2xvYiAmJgorCWdpdC1zdm4gbXVsdGktZmV0Y2ggJiYKKwl0ZXN0IFxgZ2l0IGNhdC1maWxlIGNvbW1pdCByZWZzL3JlbW90ZXMvZ2xvYiB8IFwKKwkgICAgICAgZ3JlcCAnXnBhcmVudCAnIHwgd2MgLWxcYCAtZXEgMgorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAibXVsdGktZmV0Y2ggY29udGludWVzIHRvIHdvcmsiICIKKwlnaXQtc3ZuIG11bHRpLWZldGNoCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJtdWx0aS1mZXRjaCB3b3JrcyBvZmYgYSAnY2xlYW4nIHJlcG9zaXRvcnkiICIKKwlybSAtciAkR0lUX0RJUi9zdm4gJEdJVF9ESVIvcmVmcy9yZW1vdGVzICRHSVRfRElSL2xvZ3MgJiYKKwlta2RpciAkR0lUX0RJUi9zdm4gJiYKKwlnaXQtc3ZuIG11bHRpLWZldGNoCisJIgorCit0ZXN0X2RlYnVnICdnaXRrIC0tYWxsICYnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90OTEwNS1naXQtc3ZuLWNvbW1pdC1kaWZmLnNoIGIvdC90OTEwNS1naXQtc3ZuLWNvbW1pdC1kaWZmLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMxOGUxNzIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q5MTA1LWdpdC1zdm4tY29tbWl0LWRpZmYuc2gKQEAgLTAsMCArMSw0MyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBFcmljIFdvbmcKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1zdm4gY29tbWl0LWRpZmYnCisuIC4vbGliLWdpdC1zdm4uc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5pdGlhbGl6ZSByZXBvJyAiCisJbWtkaXIgaW1wb3J0ICYmCisJY2QgaW1wb3J0ICYmCisJZWNobyBoZWxsbyA+IHJlYWRtZSAmJgorCXN2biBpbXBvcnQgLW0gJ2luaXRpYWwnIC4gJHN2bnJlcG8gJiYKKwljZCAuLiAmJgorCWVjaG8gaGVsbG8gPiByZWFkbWUgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIHJlYWRtZSAmJgorCWdpdCBjb21taXQgLWEgLW0gJ2luaXRpYWwnICYmCisJZWNobyB3b3JsZCA+PiByZWFkbWUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICdhbm90aGVyJworCSIKKworaGVhZD1gZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEXjBgCitwcmV2PWBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUReMWAKKworIyB0aGUgaW50ZXJuYWxzIG9mIHRoZSBjb21taXQtZGlmZiBjb21tYW5kIGFyZSB0aGUgc2FtZSBhcyB0aGUgcmVndWxhcgorIyBjb21taXQsIHNvIG9ubHkgYSBiYXNpYyB0ZXN0IG9mIGZ1bmN0aW9uYWxpdHkgaXMgbmVlZGVkIHNpbmNlIHdlJ3ZlCisjIGFscmVhZHkgdGVzdGVkIGNvbW1pdCBleHRlbnNpdmVseSBlbHNld2hlcmUKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGVzdCB0aGUgY29tbWl0LWRpZmYgY29tbWFuZCcgIgorCXRlc3QgLW4gJyRwcmV2JyAmJiB0ZXN0IC1uICckaGVhZCcgJiYKKwlnaXQtc3ZuIGNvbW1pdC1kaWZmIC1yMSAnJHByZXYnICckaGVhZCcgJyRzdm5yZXBvJyAmJgorCXN2biBjbyAkc3ZucmVwbyB3YyAmJgorCWNtcCByZWFkbWUgd2MvcmVhZG1lCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb21taXQtZGlmZiB0byBhIHN1Yi1kaXJlY3RvcnkgKHdpdGggZ2l0LXN2biBjb25maWcpJyAiCisJc3ZuIGltcG9ydCAtbSAnc3ViLWRpcmVjdG9yeScgaW1wb3J0ICRzdm5yZXBvL3N1YmRpciAmJgorCWdpdC1zdm4gaW5pdCAtLW1pbmltaXplLXVybCAkc3ZucmVwby9zdWJkaXIgJiYKKwlnaXQtc3ZuIGZldGNoICYmCisJZ2l0LXN2biBjb21taXQtZGlmZiAtcjMgJyRwcmV2JyAnJGhlYWQnICYmCisJc3ZuIGNhdCAkc3ZucmVwby9zdWJkaXIvcmVhZG1lID4gcmVhZG1lLjIgJiYKKwljbXAgcmVhZG1lIHJlYWRtZS4yCisJIgorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDkxMDYtZ2l0LXN2bi1jb21taXQtZGlmZi1jbG9iYmVyLnNoIGIvdC90OTEwNi1naXQtc3ZuLWNvbW1pdC1kaWZmLWNsb2JiZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjc0YWIxMgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDkxMDYtZ2l0LXN2bi1jb21taXQtZGlmZi1jbG9iYmVyLnNoCkBAIC0wLDAgKzEsOTkgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgRXJpYyBXb25nCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtc3ZuIGNvbW1pdC1kaWZmIGNsb2JiZXInCisuIC4vbGliLWdpdC1zdm4uc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5pdGlhbGl6ZSByZXBvJyAiCisJbWtkaXIgaW1wb3J0ICYmCisJY2QgaW1wb3J0ICYmCisJZWNobyBpbml0aWFsID4gZmlsZSAmJgorCXN2biBpbXBvcnQgLW0gJ2luaXRpYWwnIC4gJHN2bnJlcG8gJiYKKwljZCAuLiAmJgorCWVjaG8gaW5pdGlhbCA+IGZpbGUgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICdpbml0aWFsJworCSIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvbW1pdCBjaGFuZ2UgZnJvbSBzdm4gc2lkZScgIgorCXN2biBjbyAkc3ZucmVwbyB0LnN2biAmJgorCWNkIHQuc3ZuICYmCisJZWNobyBzZWNvbmQgbGluZSBmcm9tIHN2biA+PiBmaWxlICYmCisJcG9rZSBmaWxlICYmCisJc3ZuIGNvbW1pdCAtbSAnc2Vjb25kIGxpbmUgZnJvbSBzdm4nICYmCisJY2QgLi4gJiYKKwlybSAtcmYgdC5zdm4KKwkiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvbW1pdCBjb25mbGljdGluZyBjaGFuZ2UgZnJvbSBnaXQnICIKKwllY2hvIHNlY29uZCBsaW5lIGZyb20gZ2l0ID4+IGZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICdzZWNvbmQgbGluZSBmcm9tIGdpdCcgJiYKKwkhIGdpdC1zdm4gY29tbWl0LWRpZmYgLXIxIEhFQUR+MSBIRUFEICRzdm5yZXBvCisiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvbW1pdCBjb21wbGVtZW50aW5nIGNoYW5nZSBmcm9tIGdpdCcgIgorCWdpdCByZXNldCAtLWhhcmQgSEVBRH4xICYmCisJZWNobyBzZWNvbmQgbGluZSBmcm9tIHN2biA+PiBmaWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAnc2Vjb25kIGxpbmUgZnJvbSBzdm4nICYmCisJZWNobyB0aGlyZCBsaW5lIGZyb20gZ2l0ID4+IGZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICd0aGlyZCBsaW5lIGZyb20gZ2l0JyAmJgorCWdpdC1zdm4gY29tbWl0LWRpZmYgLXIyIEhFQUR+MSBIRUFEICRzdm5yZXBvCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdkY29tbWl0IGZhaWxzIHRvIGNvbW1pdCBiZWNhdXNlIG9mIGNvbmZsaWN0JyAiCisJZ2l0LXN2biBpbml0ICRzdm5yZXBvICYmCisJZ2l0LXN2biBmZXRjaCAmJgorCWdpdCByZXNldCAtLWhhcmQgcmVmcy9yZW1vdGVzL2dpdC1zdm4gJiYKKwlzdm4gY28gJHN2bnJlcG8gdC5zdm4gJiYKKwljZCB0LnN2biAmJgorCWVjaG8gZm91cnRoIGxpbmUgZnJvbSBzdm4gPj4gZmlsZSAmJgorCXBva2UgZmlsZSAmJgorCXN2biBjb21taXQgLW0gJ2ZvdXJ0aCBsaW5lIGZyb20gc3ZuJyAmJgorCWNkIC4uICYmCisJcm0gLXJmIHQuc3ZuICYmCisJZWNobyAnZm91cnRoIGxpbmUgZnJvbSBnaXQnID4+IGZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICdmb3VydGggbGluZSBmcm9tIGdpdCcgJiYKKwkhIGdpdC1zdm4gZGNvbW1pdAorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZGNvbW1pdCBkb2VzIHRoZSBzdm4gZXF1aXZhbGVudCBvZiBhbiBpbmRleCBtZXJnZScgIgorCWdpdCByZXNldCAtLWhhcmQgcmVmcy9yZW1vdGVzL2dpdC1zdm4gJiYKKwllY2hvICdpbmRleCBtZXJnZScgPiBmaWxlMiAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgZmlsZTIgJiYKKwlnaXQgY29tbWl0IC1hIC1tICdpbmRleCBtZXJnZScgJiYKKwllY2hvICdtb3JlIGNoYW5nZXMnID4+IGZpbGUyICYmCisJZ2l0IHVwZGF0ZS1pbmRleCBmaWxlMiAmJgorCWdpdCBjb21taXQgLWEgLW0gJ21vcmUgY2hhbmdlcycgJiYKKwlnaXQtc3ZuIGRjb21taXQKKwkiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvbW1pdCBhbm90aGVyIGNoYW5nZSBmcm9tIHN2biBzaWRlJyAiCisJc3ZuIGNvICRzdm5yZXBvIHQuc3ZuICYmCisJY2QgdC5zdm4gJiYKKwkJZWNobyB0aGlyZCBsaW5lIGZyb20gc3ZuID4+IGZpbGUgJiYKKwkJcG9rZSBmaWxlICYmCisJCXN2biBjb21taXQgLW0gJ3RoaXJkIGxpbmUgZnJvbSBzdm4nICYmCisJY2QgLi4gJiYKKwlybSAtcmYgdC5zdm4KKwkiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ211bHRpcGxlIGRjb21taXQgZnJvbSBnaXQtc3ZuIHdpbGwgbm90IGNsb2JiZXIgc3ZuJyAiCisJZ2l0IHJlc2V0IC0taGFyZCByZWZzL3JlbW90ZXMvZ2l0LXN2biAmJgorCWVjaG8gbmV3IGZpbGUgPj4gbmV3LWZpbGUgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIG5ldy1maWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAnbmV3IGZpbGUnICYmCisJZWNobyBjbG9iYmVyID4gZmlsZSAmJgorCWdpdCBjb21taXQgLWEgLW0gJ2Nsb2JiZXInICYmCisJISBnaXQgc3ZuIGRjb21taXQKKwkiCisKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgdGhhdCByZWJhc2UgcmVhbGx5IGZhaWxlZCcgJ3Rlc3QgLWQgLmRvdGVzdCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVzb2x2ZSwgY29udGludWUgdGhlIHJlYmFzZSBhbmQgZGNvbW1pdCcgIgorCWVjaG8gY2xvYmJlciBhbmQgSSByZWFsbHkgbWVhbiBpdCA+IGZpbGUgJiYKKwlnaXQgdXBkYXRlLWluZGV4IGZpbGUgJiYKKwlnaXQgcmViYXNlIC0tY29udGludWUgJiYKKwlnaXQgc3ZuIGRjb21taXQKKwkiCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90OTEwNi1naXQtc3ZuLWRjb21taXQtY2xvYmJlci1zZXJpZXMuc2ggYi90L3Q5MTA2LWdpdC1zdm4tZGNvbW1pdC1jbG9iYmVyLXNlcmllcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYThhMDBlCi0tLSAvZGV2L251bGwKKysrIGIvdC90OTEwNi1naXQtc3ZuLWRjb21taXQtY2xvYmJlci1zZXJpZXMuc2gKQEAgLTAsMCArMSw2MyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBFcmljIFdvbmcKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1zdm4gZGNvbW1pdCBjbG9iYmVyIHNlcmllcycKKy4gLi9saWItZ2l0LXN2bi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbml0aWFsaXplIHJlcG8nICIKKwlta2RpciBpbXBvcnQgJiYKKwljZCBpbXBvcnQgJiYKKwlhd2sgJ0JFR0lOIHsgZm9yIChpID0gMTsgaSA8IDY0OyBpKyspIHsgcHJpbnQgaSB9IH0nID4gZmlsZQorCXN2biBpbXBvcnQgLW0gJ2luaXRpYWwnIC4gJHN2bnJlcG8gJiYKKwljZCAuLiAmJgorCWdpdCBzdm4gaW5pdCAkc3ZucmVwbyAmJgorCWdpdCBzdm4gZmV0Y2ggJiYKKwl0ZXN0IC1lIGZpbGUKKwkiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJyhzdXBwb3NlZGx5KSBub24tY29uZmxpY3RpbmcgY2hhbmdlIGZyb20gU1ZOJyAiCisJdGVzdCB4XCJcYHNlZCAtbiAtZSA1OHAgPCBmaWxlXGBcIiA9IHg1OCAmJgorCXRlc3QgeFwiXGBzZWQgLW4gLWUgNjFwIDwgZmlsZVxgXCIgPSB4NjEgJiYKKwlzdm4gY28gJHN2bnJlcG8gdG1wICYmCisJY2QgdG1wICYmCisJCXBlcmwgLWkgLXAgLWUgJ3MvXjU4XCQvNTU4OC8nIGZpbGUgJiYKKwkJcGVybCAtaSAtcCAtZSAncy9eNjFcJC82NjExLycgZmlsZSAmJgorCQlwb2tlIGZpbGUgJiYKKwkJdGVzdCB4XCJcYHNlZCAtbiAtZSA1OHAgPCBmaWxlXGBcIiA9IHg1NTg4ICYmCisJCXRlc3QgeFwiXGBzZWQgLW4gLWUgNjFwIDwgZmlsZVxgXCIgPSB4NjYxMSAmJgorCQlzdm4gY29tbWl0IC1tICc1OCA9PiA1NTg4LCA2MSA9PiA2NjExJyAmJgorCQljZCAuLgorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc29tZSB1bnJlbGF0ZWQgY2hhbmdlcyB0byBnaXQnICIKKwllY2hvIGhpID4gbGlmZSAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgbGlmZSAmJgorCWdpdCBjb21taXQgLW0gaGktbGlmZSAmJgorCWVjaG8gYnllID4+IGxpZmUgJiYKKwlnaXQgY29tbWl0IC1tIGJ5ZS1saWZlIGxpZmUKKwkiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoYW5nZSBmaWxlIGJ1dCBpbiB1bnJlbGF0ZWQgYXJlYScgIgorCXRlc3QgeFwiXGBzZWQgLW4gLWUgNHAgPCBmaWxlXGBcIiA9IHg0ICYmCisJdGVzdCB4XCJcYHNlZCAtbiAtZSA3cCA8IGZpbGVcYFwiID0geDcgJiYKKwlwZXJsIC1pIC1wIC1lICdzL140XCQvNDQ0NC8nIGZpbGUgJiYKKwlwZXJsIC1pIC1wIC1lICdzL143XCQvNzc3Ny8nIGZpbGUgJiYKKwl0ZXN0IHhcIlxgc2VkIC1uIC1lIDRwIDwgZmlsZVxgXCIgPSB4NDQ0NCAmJgorCXRlc3QgeFwiXGBzZWQgLW4gLWUgN3AgPCBmaWxlXGBcIiA9IHg3Nzc3ICYmCisJZ2l0IGNvbW1pdCAtbSAnNCA9PiA0NDQ0LCA3ID0+IDc3NzcnIGZpbGUgJiYKKwlnaXQgc3ZuIGRjb21taXQgJiYKKwlzdm4gdXAgdG1wICYmCisJY2QgdG1wICYmCisJCXRlc3QgeFwiXGBzZWQgLW4gLWUgNHAgPCBmaWxlXGBcIiA9IHg0NDQ0ICYmCisJCXRlc3QgeFwiXGBzZWQgLW4gLWUgN3AgPCBmaWxlXGBcIiA9IHg3Nzc3ICYmCisJCXRlc3QgeFwiXGBzZWQgLW4gLWUgNThwIDwgZmlsZVxgXCIgPSB4NTU4OCAmJgorCQl0ZXN0IHhcIlxgc2VkIC1uIC1lIDYxcCA8IGZpbGVcYFwiID0geDY2MTEKKwkiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2F0dGVtcHQgdG8gZGNvbW1pdCB3aXRoIGEgZGlydHkgaW5kZXgnICcKKwllY2hvIGZvbyA+PmZpbGUgJiYKKwlnaXQgYWRkIGZpbGUgJiYKKwkhIGdpdCBzdm4gZGNvbW1pdAorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDkxMDctZ2l0LXN2bi1taWdyYXRlLnNoIGIvdC90OTEwNy1naXQtc3ZuLW1pZ3JhdGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGE0MWQ1MgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDkxMDctZ2l0LXN2bi1taWdyYXRlLnNoCkBAIC0wLDAgKzEsMTE1IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEVyaWMgV29uZwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LXN2biBtZXRhZGF0YSBtaWdyYXRpb25zIGZyb20gcHJldmlvdXMgdmVyc2lvbnMnCisuIC4vbGliLWdpdC1zdm4uc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgb2xkLWxvb2tpbmcgbWV0YWRhdGEnICIKKwljcCAkR0lUX0RJUi9jb25maWcgJEdJVF9ESVIvY29uZmlnLW9sZC1naXQtc3ZuICYmCisJbWtkaXIgaW1wb3J0ICYmCisJY2QgaW1wb3J0ICYmCisJCWZvciBpIGluIHRydW5rIGJyYW5jaGVzL2EgYnJhbmNoZXMvYiBcCisJCSAgICAgICAgIHRhZ3MvMC4xIHRhZ3MvMC4yIHRhZ3MvMC4zOyBkbworCQkJbWtkaXIgLXAgXCRpICYmIFwKKwkJCWVjaG8gaGVsbG8gPj4gXCRpL1JFQURNRSB8fCBleGl0IDEKKwkJZG9uZSAmJiBcCisJCXN2biBpbXBvcnQgLW0gdGVzdCAuICRzdm5yZXBvCisJCWNkIC4uICYmCisJZ2l0LXN2biBpbml0ICRzdm5yZXBvICYmCisJZ2l0LXN2biBmZXRjaCAmJgorCW12ICRHSVRfRElSL3N2bi8qICRHSVRfRElSLyAmJgorCW12ICRHSVRfRElSL3N2bi8ubWV0YWRhdGEgJEdJVF9ESVIvICYmCisJcm1kaXIgJEdJVF9ESVIvc3ZuICYmCisJZ2l0IHVwZGF0ZS1yZWYgcmVmcy9oZWFkcy9naXQtc3ZuLUhFQUQgcmVmcy9yZW1vdGVzL2dpdC1zdm4gJiYKKwlnaXQgdXBkYXRlLXJlZiByZWZzL2hlYWRzL3N2bi1IRUFEIHJlZnMvcmVtb3Rlcy9naXQtc3ZuICYmCisJZ2l0IHVwZGF0ZS1yZWYgLWQgcmVmcy9yZW1vdGVzL2dpdC1zdm4gcmVmcy9yZW1vdGVzL2dpdC1zdm4KKwkiCisKK2hlYWQ9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgcmVmcy9oZWFkcy9naXQtc3ZuLUhFQUReMGAKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1zdm4tSEVBRCBpcyBhIHJlYWwgSEVBRCcgInRlc3QgLW4gJyRoZWFkJyIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5pdGlhbGl6ZSBvbGQtc3R5bGUgKHYwKSBnaXQtc3ZuIGxheW91dCcgIgorCW1rZGlyIC1wICRHSVRfRElSL2dpdC1zdm4vaW5mbyAkR0lUX0RJUi9zdm4vaW5mbyAmJgorCWVjaG8gJHN2bnJlcG8gPiAkR0lUX0RJUi9naXQtc3ZuL2luZm8vdXJsICYmCisJZWNobyAkc3ZucmVwbyA+ICRHSVRfRElSL3N2bi9pbmZvL3VybCAmJgorCWdpdC1zdm4gbWlncmF0ZSAmJgorCSEgdGVzdCAtZCAkR0lUX0RJUi9naXQtc3ZuICYmCisJZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSByZWZzL3JlbW90ZXMvZ2l0LXN2bl4wICYmCisJZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSByZWZzL3JlbW90ZXMvc3ZuXjAgJiYKKwl0ZXN0IFxgZ2l0IGNvbmZpZyAtLWdldCBzdm4tcmVtb3RlLnN2bi51cmxcYCA9ICckc3ZucmVwbycgJiYKKwl0ZXN0IFxgZ2l0IGNvbmZpZyAtLWdldCBzdm4tcmVtb3RlLnN2bi5mZXRjaFxgID0gXAorICAgICAgICAgICAgICc6cmVmcy9yZW1vdGVzL2dpdC1zdm4nCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbml0aWFsaXplIGEgbXVsdGktcmVwb3NpdG9yeSByZXBvJyAiCisJZ2l0LXN2biBpbml0ICRzdm5yZXBvIC1UIHRydW5rIC10IHRhZ3MgLWIgYnJhbmNoZXMgJiYKKwlnaXQgY29uZmlnIC0tZ2V0LWFsbCBzdm4tcmVtb3RlLnN2bi5mZXRjaCA+IGZldGNoLm91dCAmJgorCWdyZXAgJ150cnVuazpyZWZzL3JlbW90ZXMvdHJ1bmskJyBmZXRjaC5vdXQgJiYKKwl0ZXN0IC1uIFwiXGBnaXQgY29uZmlnIC0tZ2V0IHN2bi1yZW1vdGUuc3ZuLmJyYW5jaGVzIFwKKwkgICAgICAgICAgICAnXmJyYW5jaGVzL1wqOnJlZnMvcmVtb3Rlcy9cKiQnXGBcIiAmJgorCXRlc3QgLW4gXCJcYGdpdCBjb25maWcgLS1nZXQgc3ZuLXJlbW90ZS5zdm4udGFncyBcCisJICAgICAgICAgICAgJ150YWdzL1wqOnJlZnMvcmVtb3Rlcy90YWdzL1wqJCdcYFwiICYmCisJZ2l0IGNvbmZpZyAtLXVuc2V0IHN2bi1yZW1vdGUuc3ZuLmJyYW5jaGVzIFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAnXmJyYW5jaGVzL1wqOnJlZnMvcmVtb3Rlcy9cKiQnICYmCisJZ2l0IGNvbmZpZyAtLXVuc2V0IHN2bi1yZW1vdGUuc3ZuLnRhZ3MgXAorCSAgICAgICAgICAgICAgICAgICAgICAgICdedGFncy9cKjpyZWZzL3JlbW90ZXMvdGFncy9cKiQnICYmCisJZ2l0IGNvbmZpZyAtLWFkZCBzdm4tcmVtb3RlLnN2bi5mZXRjaCAnYnJhbmNoZXMvYTpyZWZzL3JlbW90ZXMvYScgJiYKKwlnaXQgY29uZmlnIC0tYWRkIHN2bi1yZW1vdGUuc3ZuLmZldGNoICdicmFuY2hlcy9iOnJlZnMvcmVtb3Rlcy9iJyAmJgorCWZvciBpIGluIHRhZ3MvMC4xIHRhZ3MvMC4yIHRhZ3MvMC4zOyBkbworCQlnaXQgY29uZmlnIC0tYWRkIHN2bi1yZW1vdGUuc3ZuLmZldGNoIFwKKwkJICAgICAgICAgICAgICAgICBcJGk6cmVmcy9yZW1vdGVzL1wkaSB8fCBleGl0IDE7IGRvbmUKKwkiCisKKyMgcmVmcyBzaG91bGQgYWxsIGJlIGRpZmZlcmVudCwgYnV0IHRoZSB0cmVlcyBzaG91bGQgYWxsIGJlIHRoZSBzYW1lOgordGVzdF9leHBlY3Rfc3VjY2VzcyAnbXVsdGktZmV0Y2ggd29ya3Mgb24gcGFydGlhbCB1cmxzICsgcGF0aHMnICIKKwlnaXQtc3ZuIG11bHRpLWZldGNoICYmCisJZm9yIGkgaW4gdHJ1bmsgYSBiIHRhZ3MvMC4xIHRhZ3MvMC4yIHRhZ3MvMC4zOyBkbworCQlnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IHJlZnMvcmVtb3Rlcy9cJGleMCA+PiByZWZzLm91dCB8fCBleGl0IDE7CisJICAgIGRvbmUgJiYKKwl0ZXN0IC16IFwiXGBzb3J0IDwgcmVmcy5vdXQgfCB1bmlxIC1kXGBcIiAmJgorCWZvciBpIGluIHRydW5rIGEgYiB0YWdzLzAuMSB0YWdzLzAuMiB0YWdzLzAuMzsgZG8KKwkgIGZvciBqIGluIHRydW5rIGEgYiB0YWdzLzAuMSB0YWdzLzAuMiB0YWdzLzAuMzsgZG8KKwkJaWYgdGVzdCBcJGogIT0gXCRpOyB0aGVuIGNvbnRpbnVlOyBmaQorCSAgICB0ZXN0IC16IFwiXGBnaXQgZGlmZiByZWZzL3JlbW90ZXMvXCRpIFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcy9yZW1vdGVzL1wkalxgXCIgfHxleGl0IDE7IGRvbmU7IGRvbmUKKwkiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21pZ3JhdGUgLS1taW5pbWl6ZSBvbiBvbGQgaW5pdGVkIGxheW91dCcgIgorCWdpdCBjb25maWcgLS11bnNldC1hbGwgc3ZuLXJlbW90ZS5zdm4uZmV0Y2ggJiYKKwlnaXQgY29uZmlnIC0tdW5zZXQtYWxsIHN2bi1yZW1vdGUuc3ZuLnVybCAmJgorCXJtIC1yZiAkR0lUX0RJUi9zdm4gJiYKKwlmb3IgaSBpbiBcYGNhdCBmZXRjaC5vdXRcYDsgZG8KKwkJcGF0aD1cYGV4cHIgXCRpIDogJ1xcKFteOl0qXFwpOi4qJCdcYAorCQlyZWY9XGBleHByIFwkaSA6ICdbXjpdKjpyZWZzL3JlbW90ZXMvXFwoLipcXCkkJ1xgCisJCWlmIHRlc3QgLXogXCJcJHJlZlwiOyB0aGVuIGNvbnRpbnVlOyBmaQorCQlpZiB0ZXN0IC1uIFwiXCRwYXRoXCI7IHRoZW4gcGF0aD1cIi9cJHBhdGhcIjsgZmkKKwkJKCBta2RpciAtcCAkR0lUX0RJUi9zdm4vXCRyZWYvaW5mby8gJiYKKwkJZWNobyAkc3ZucmVwb1wkcGF0aCA+ICRHSVRfRElSL3N2bi9cJHJlZi9pbmZvL3VybCApIHx8IGV4aXQgMTsKKwlkb25lICYmCisJZ2l0LXN2biBtaWdyYXRlIC0tbWluaW1pemUgJiYKKwl0ZXN0IC16IFwiXGBnaXQgY29uZmlnIC1sIHxncmVwIC12ICdec3ZuLXJlbW90ZVwuZ2l0LXN2blwuJ1xgXCIgJiYKKwlnaXQgY29uZmlnIC0tZ2V0LWFsbCBzdm4tcmVtb3RlLnN2bi5mZXRjaCA+IGZldGNoLm91dCAmJgorCWdyZXAgJ150cnVuazpyZWZzL3JlbW90ZXMvdHJ1bmskJyBmZXRjaC5vdXQgJiYKKwlncmVwICdeYnJhbmNoZXMvYTpyZWZzL3JlbW90ZXMvYSQnIGZldGNoLm91dCAmJgorCWdyZXAgJ15icmFuY2hlcy9iOnJlZnMvcmVtb3Rlcy9iJCcgZmV0Y2gub3V0ICYmCisJZ3JlcCAnXnRhZ3MvMFwuMTpyZWZzL3JlbW90ZXMvdGFncy8wXC4xJCcgZmV0Y2gub3V0ICYmCisJZ3JlcCAnXnRhZ3MvMFwuMjpyZWZzL3JlbW90ZXMvdGFncy8wXC4yJCcgZmV0Y2gub3V0ICYmCisJZ3JlcCAnXnRhZ3MvMFwuMzpyZWZzL3JlbW90ZXMvdGFncy8wXC4zJCcgZmV0Y2gub3V0CisJZ3JlcCAnXjpyZWZzL3JlbW90ZXMvZ2l0LXN2bicgZmV0Y2gub3V0CisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICAiLnJldl9kYiBhdXRvLWNvbnZlcnRlZCB0byAucmV2X21hcC5VVUlEIiAiCisJZ2l0LXN2biBmZXRjaCAtaSB0cnVuayAmJgorCXRlc3QgLXogXCJcJChscyAkR0lUX0RJUi9zdm4vdHJ1bmsvLnJldl9kYi4qIDI+L2Rldi9udWxsKVwiICYmCisJZXhwZWN0PVwiXCQobHMgJEdJVF9ESVIvc3ZuL3RydW5rLy5yZXZfbWFwLiopXCIgJiYKKwl0ZXN0IC1uIFwiXCRleHBlY3RcIiAmJgorCXJldl9kYj1cJChlY2hvIFwkZXhwZWN0IHwgc2VkIC1lICdzLF9tYXAsX2RiLCcpICYmCisJY29udmVydF90b19yZXZfZGIgXCRleHBlY3QgXCRyZXZfZGIgJiYKKwlybSAtZiBcJGV4cGVjdCAmJgorCXRlc3QgLWYgXCRyZXZfZGIgJiYKKwlnaXQtc3ZuIGZldGNoIC1pIHRydW5rICYmCisJdGVzdCAteiBcIlwkKGxzICRHSVRfRElSL3N2bi90cnVuay8ucmV2X2RiLiogMj4vZGV2L251bGwpXCIgJiYKKwl0ZXN0ICEgLWUgJEdJVF9ESVIvc3ZuL3RydW5rLy5yZXZfZGIgJiYKKwl0ZXN0IC1mIFwkZXhwZWN0CisJIgorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDkxMDgtZ2l0LXN2bi1nbG9iLnNoIGIvdC90OTEwOC1naXQtc3ZuLWdsb2Iuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGI0MzQ0YwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDkxMDgtZ2l0LXN2bi1nbG9iLnNoCkBAIC0wLDAgKzEsODYgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgKGMpIDIwMDcgRXJpYyBXb25nCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtc3ZuIGdsb2JiaW5nIHJlZnNwZWNzJworLiAuL2xpYi1naXQtc3ZuLnNoCisKK2NhdCA+IGV4cGVjdC5lbmQgPDxFT0YKK3RoZSBlbmQKK2hpCitzdGFydCBhIG5ldyBicmFuY2gKK2luaXRpYWwKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0ZXN0IHJlZnNwZWMgZ2xvYmJpbmcnICIKKwlta2RpciAtcCB0cnVuay9zcmMvYSB0cnVuay9zcmMvYiB0cnVuay9kb2MgJiYKKwllY2hvICdoZWxsbyB3b3JsZCcgPiB0cnVuay9zcmMvYS9yZWFkbWUgJiYKKwllY2hvICdnb29kYnllIHdvcmxkJyA+IHRydW5rL3NyYy9iL3JlYWRtZSAmJgorCXN2biBpbXBvcnQgLW0gJ2luaXRpYWwnIHRydW5rICRzdm5yZXBvL3RydW5rICYmCisJc3ZuIGNvICRzdm5yZXBvIHRtcCAmJgorCWNkIHRtcCAmJgorCQlta2RpciBicmFuY2hlcyB0YWdzICYmCisJCXN2biBhZGQgYnJhbmNoZXMgdGFncyAmJgorCQlzdm4gY3AgdHJ1bmsgYnJhbmNoZXMvc3RhcnQgJiYKKwkJc3ZuIGNvbW1pdCAtbSAnc3RhcnQgYSBuZXcgYnJhbmNoJyAmJgorCQlzdm4gdXAgJiYKKwkJZWNobyAnaGknID4+IGJyYW5jaGVzL3N0YXJ0L3NyYy9iL3JlYWRtZSAmJgorCQlwb2tlIGJyYW5jaGVzL3N0YXJ0L3NyYy9iL3JlYWRtZSAmJgorCQllY2hvICdoZXknID4+IGJyYW5jaGVzL3N0YXJ0L3NyYy9hL3JlYWRtZSAmJgorCQlwb2tlIGJyYW5jaGVzL3N0YXJ0L3NyYy9hL3JlYWRtZSAmJgorCQlzdm4gY29tbWl0IC1tICdoaScgJiYKKwkJc3ZuIHVwICYmCisJCXN2biBjcCBicmFuY2hlcy9zdGFydCB0YWdzL2VuZCAmJgorCQllY2hvICdieWUnID4+IHRhZ3MvZW5kL3NyYy9iL3JlYWRtZSAmJgorCQlwb2tlIHRhZ3MvZW5kL3NyYy9iL3JlYWRtZSAmJgorCQllY2hvICdheWUnID4+IHRhZ3MvZW5kL3NyYy9hL3JlYWRtZSAmJgorCQlwb2tlIHRhZ3MvZW5kL3NyYy9hL3JlYWRtZSAmJgorCQlzdm4gY29tbWl0IC1tICd0aGUgZW5kJyAmJgorCQllY2hvICdieWVieWUnID4+IHRhZ3MvZW5kL3NyYy9iL3JlYWRtZSAmJgorCQlwb2tlIHRhZ3MvZW5kL3NyYy9iL3JlYWRtZSAmJgorCQlzdm4gY29tbWl0IC1tICdub3RoaW5nIHRvIHNlZSBoZXJlJworCQljZCAuLiAmJgorCWdpdCBjb25maWcgLS1hZGQgc3ZuLXJlbW90ZS5zdm4udXJsICRzdm5yZXBvICYmCisJZ2l0IGNvbmZpZyAtLWFkZCBzdm4tcmVtb3RlLnN2bi5mZXRjaCBcCisJICAgICAgICAgICAgICAgICAndHJ1bmsvc3JjL2E6cmVmcy9yZW1vdGVzL3RydW5rJyAmJgorCWdpdCBjb25maWcgLS1hZGQgc3ZuLXJlbW90ZS5zdm4uYnJhbmNoZXMgXAorCSAgICAgICAgICAgICAgICAgJ2JyYW5jaGVzLyovc3JjL2E6cmVmcy9yZW1vdGVzL2JyYW5jaGVzLyonICYmCisJZ2l0IGNvbmZpZyAtLWFkZCBzdm4tcmVtb3RlLnN2bi50YWdzXAorCSAgICAgICAgICAgICAgICAgJ3RhZ3MvKi9zcmMvYTpyZWZzL3JlbW90ZXMvdGFncy8qJyAmJgorCWdpdC1zdm4gbXVsdGktZmV0Y2ggJiYKKwlnaXQgbG9nIC0tcHJldHR5PW9uZWxpbmUgcmVmcy9yZW1vdGVzL3RhZ3MvZW5kIHwgXAorCSAgICBzZWQgLWUgJ3MvXi5cezQxXH0vLycgPiBvdXRwdXQuZW5kICYmCisJY21wIGV4cGVjdC5lbmQgb3V0cHV0LmVuZCAmJgorCXRlc3QgXCJcYGdpdCByZXYtcGFyc2UgcmVmcy9yZW1vdGVzL3RhZ3MvZW5kfjFcYFwiID0gXAorCQlcIlxgZ2l0IHJldi1wYXJzZSByZWZzL3JlbW90ZXMvYnJhbmNoZXMvc3RhcnRcYFwiICYmCisJdGVzdCBcIlxgZ2l0IHJldi1wYXJzZSByZWZzL3JlbW90ZXMvYnJhbmNoZXMvc3RhcnR+MlxgXCIgPSBcCisJCVwiXGBnaXQgcmV2LXBhcnNlIHJlZnMvcmVtb3Rlcy90cnVua1xgXCIKKwkiCisKK2VjaG8gdHJ5IHRvIHRyeSA+IGV4cGVjdC50d28KK2VjaG8gbm90aGluZyB0byBzZWUgaGVyZSA+PiBleHBlY3QudHdvCitjYXQgZXhwZWN0LmVuZCA+PiBleHBlY3QudHdvCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Rlc3QgbGVmdC1oYW5kLXNpZGUgb25seSBnbG9iYmluZycgIgorCWdpdCBjb25maWcgLS1hZGQgc3ZuLXJlbW90ZS50d28udXJsICRzdm5yZXBvICYmCisJZ2l0IGNvbmZpZyAtLWFkZCBzdm4tcmVtb3RlLnR3by5mZXRjaCB0cnVuazpyZWZzL3JlbW90ZXMvdHdvL3RydW5rICYmCisJZ2l0IGNvbmZpZyAtLWFkZCBzdm4tcmVtb3RlLnR3by5icmFuY2hlcyBcCisJICAgICAgICAgICAgICAgICAnYnJhbmNoZXMvKjpyZWZzL3JlbW90ZXMvdHdvL2JyYW5jaGVzLyonICYmCisJZ2l0IGNvbmZpZyAtLWFkZCBzdm4tcmVtb3RlLnR3by50YWdzIFwKKwkgICAgICAgICAgICAgICAgICd0YWdzLyo6cmVmcy9yZW1vdGVzL3R3by90YWdzLyonICYmCisJY2QgdG1wICYmCisJCWVjaG8gJ3RyeSB0cnknID4+IHRhZ3MvZW5kL3NyYy9iL3JlYWRtZSAmJgorCQlwb2tlIHRhZ3MvZW5kL3NyYy9iL3JlYWRtZSAmJgorCQlzdm4gY29tbWl0IC1tICd0cnkgdG8gdHJ5JworCQljZCAuLiAmJgorCWdpdC1zdm4gZmV0Y2ggdHdvICYmCisJdGVzdCBcYGdpdCByZXYtbGlzdCByZWZzL3JlbW90ZXMvdHdvL3RhZ3MvZW5kIHwgd2MgLWxcYCAtZXEgNiAmJgorCXRlc3QgXGBnaXQgcmV2LWxpc3QgcmVmcy9yZW1vdGVzL3R3by9icmFuY2hlcy9zdGFydCB8IHdjIC1sXGAgLWVxIDMgJiYKKwl0ZXN0IFxgZ2l0IHJldi1wYXJzZSByZWZzL3JlbW90ZXMvdHdvL2JyYW5jaGVzL3N0YXJ0fjJcYCA9IFwKKwkgICAgIFxgZ2l0IHJldi1wYXJzZSByZWZzL3JlbW90ZXMvdHdvL3RydW5rXGAgJiYKKwl0ZXN0IFxgZ2l0IHJldi1wYXJzZSByZWZzL3JlbW90ZXMvdHdvL3RhZ3MvZW5kfjNcYCA9IFwKKwkgICAgIFxgZ2l0IHJldi1wYXJzZSByZWZzL3JlbW90ZXMvdHdvL2JyYW5jaGVzL3N0YXJ0XGAgJiYKKwlnaXQgbG9nIC0tcHJldHR5PW9uZWxpbmUgcmVmcy9yZW1vdGVzL3R3by90YWdzL2VuZCB8IFwKKwkgICAgc2VkIC1lICdzL14uXHs0MVx9Ly8nID4gb3V0cHV0LnR3byAmJgorCWNtcCBleHBlY3QudHdvIG91dHB1dC50d28KKwkiCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90OTExMC1naXQtc3ZuLXVzZS1zdm0tcHJvcHMuc2ggYi90L3Q5MTEwLWdpdC1zdm4tdXNlLXN2bS1wcm9wcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MjM1YWY0Ci0tLSAvZGV2L251bGwKKysrIGIvdC90OTExMC1naXQtc3ZuLXVzZS1zdm0tcHJvcHMuc2gKQEAgLTAsMCArMSw1MiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBFcmljIFdvbmcKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LXN2biB1c2VTdm1Qcm9wcyB0ZXN0JworCisuIC4vbGliLWdpdC1zdm4uc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbG9hZCBzdm0gcmVwbycgIgorCXN2bmFkbWluIGxvYWQgLXEgJHJhd3N2bnJlcG8gPCAuLi90OTExMC9zdm0uZHVtcCAmJgorCWdpdC1zdm4gaW5pdCAtLW1pbmltaXplLXVybCAtUiBhcnIgLWkgYmFyICRzdm5yZXBvL21pcnJvci9hcnIgJiYKKwlnaXQtc3ZuIGluaXQgLS1taW5pbWl6ZS11cmwgLVIgYXJnaCAtaSBkaXIgJHN2bnJlcG8vbWlycm9yL2FyZ2ggJiYKKwlnaXQtc3ZuIGluaXQgLS1taW5pbWl6ZS11cmwgLVIgYXJnaCAtaSBlIFwKKwkgICRzdm5yZXBvL21pcnJvci9hcmdoL2EvYi9jL2QvZSAmJgorCWdpdCBjb25maWcgc3ZuLnVzZVN2bVByb3BzIHRydWUgJiYKKwlnaXQtc3ZuIGZldGNoIC0tYWxsCisJIgorCit1dWlkPTE2MWNlNDI5LWE5ZGQtNDgyOC1hZjRhLTUyMDIzZjk2OGM4OQorCitiYXJfdXJsPWh0dHA6Ly9tYXlvbmFpc2Uvc3ZucmVwby9iYXIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ZlcmlmeSBtZXRhZGF0YSBmb3IgL2JhcicgIgorCWdpdCBjYXQtZmlsZSBjb21taXQgcmVmcy9yZW1vdGVzL2JhciB8IFwKKwkgICBncmVwICdeZ2l0LXN2bi1pZDogJGJhcl91cmxAMTIgJHV1aWQkJyAmJgorCWdpdCBjYXQtZmlsZSBjb21taXQgcmVmcy9yZW1vdGVzL2Jhcn4xIHwgXAorCSAgIGdyZXAgJ15naXQtc3ZuLWlkOiAkYmFyX3VybEAxMSAkdXVpZCQnICYmCisJZ2l0IGNhdC1maWxlIGNvbW1pdCByZWZzL3JlbW90ZXMvYmFyfjIgfCBcCisJICAgZ3JlcCAnXmdpdC1zdm4taWQ6ICRiYXJfdXJsQDEwICR1dWlkJCcgJiYKKwlnaXQgY2F0LWZpbGUgY29tbWl0IHJlZnMvcmVtb3Rlcy9iYXJ+MyB8IFwKKwkgICBncmVwICdeZ2l0LXN2bi1pZDogJGJhcl91cmxAOSAkdXVpZCQnICYmCisJZ2l0IGNhdC1maWxlIGNvbW1pdCByZWZzL3JlbW90ZXMvYmFyfjQgfCBcCisJICAgZ3JlcCAnXmdpdC1zdm4taWQ6ICRiYXJfdXJsQDYgJHV1aWQkJyAmJgorCWdpdCBjYXQtZmlsZSBjb21taXQgcmVmcy9yZW1vdGVzL2Jhcn41IHwgXAorCSAgIGdyZXAgJ15naXQtc3ZuLWlkOiAkYmFyX3VybEAxICR1dWlkJCcKKwkiCisKK2VfdXJsPWh0dHA6Ly9tYXlvbmFpc2Uvc3ZucmVwby9kaXIvYS9iL2MvZC9lCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd2ZXJpZnkgbWV0YWRhdGEgZm9yIC9kaXIvYS9iL2MvZC9lJyAiCisJZ2l0IGNhdC1maWxlIGNvbW1pdCByZWZzL3JlbW90ZXMvZSB8IFwKKwkgICBncmVwICdeZ2l0LXN2bi1pZDogJGVfdXJsQDEgJHV1aWQkJworCSIKKworZGlyX3VybD1odHRwOi8vbWF5b25haXNlL3N2bnJlcG8vZGlyCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd2ZXJpZnkgbWV0YWRhdGEgZm9yIC9kaXInICIKKwlnaXQgY2F0LWZpbGUgY29tbWl0IHJlZnMvcmVtb3Rlcy9kaXIgfCBcCisJICAgZ3JlcCAnXmdpdC1zdm4taWQ6ICRkaXJfdXJsQDIgJHV1aWQkJyAmJgorCWdpdCBjYXQtZmlsZSBjb21taXQgcmVmcy9yZW1vdGVzL2Rpcn4xIHwgXAorCSAgIGdyZXAgJ15naXQtc3ZuLWlkOiAkZGlyX3VybEAxICR1dWlkJCcKKwkiCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90OTExMC9zdm0uZHVtcCBiL3QvdDkxMTAvc3ZtLmR1bXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M3OTljMgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDkxMTAvc3ZtLmR1bXAKQEAgLTAsMCArMSw1MTEgQEAKK1NWTi1mcy1kdW1wLWZvcm1hdC12ZXJzaW9uOiAyCisKK1VVSUQ6IGRlNTk3M2M2LTU0NWQtNDFkYS1hZGVkLWMyNjVmOTAzOWU3NAorCitSZXZpc2lvbi1udW1iZXI6IDAKK1Byb3AtY29udGVudC1sZW5ndGg6IDU2CitDb250ZW50LWxlbmd0aDogNTYKKworSyA4Citzdm46ZGF0ZQorViAyNworMjAwNy0wMi0xN1QwNjo1NDo1OS43OTMxMDRaCitQUk9QUy1FTkQKKworUmV2aXNpb24tbnVtYmVyOiAxCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAyMDAKK0NvbnRlbnQtbGVuZ3RoOiAyMDAKKworSyA3Citzdm46bG9nCitWIDQwCitTVk06IGluaXRpYWxpemluZyBtaXJyb3IgZm9yIC9taXJyb3IvYXJyCitLIDEwCitzdm46YXV0aG9yCitWIDMKK3N2bQorSyAxMQorc3ZtOmhlYWRyZXYKK1YgMzkKKzE2MWNlNDI5LWE5ZGQtNDgyOC1hZjRhLTUyMDIzZjk2OGM4OTowCisKK0sgOAorc3ZuOmRhdGUKK1YgMjcKKzIwMDctMDItMTdUMDY6NTU6MDAuMTIxNjQ3WgorUFJPUFMtRU5ECisKK05vZGUtcGF0aDogCitOb2RlLWtpbmQ6IGRpcgorTm9kZS1hY3Rpb246IGNoYW5nZQorUHJvcC1jb250ZW50LWxlbmd0aDogNDQKK0NvbnRlbnQtbGVuZ3RoOiA0NAorCitLIDEwCitzdm06bWlycm9yCitWIDEyCisvbWlycm9yL2FycgorCitQUk9QUy1FTkQKKworCitOb2RlLXBhdGg6IG1pcnJvcgorTm9kZS1raW5kOiBkaXIKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitDb250ZW50LWxlbmd0aDogMTAKKworUFJPUFMtRU5ECisKKworTm9kZS1wYXRoOiBtaXJyb3IvYXJyCitOb2RlLWtpbmQ6IGRpcgorTm9kZS1hY3Rpb246IGFkZAorUHJvcC1jb250ZW50LWxlbmd0aDogMTE2CitDb250ZW50LWxlbmd0aDogMTE2CisKK0sgMTAKK3N2bTpzb3VyY2UKK1YgMjkKK2h0dHA6Ly9tYXlvbmFpc2Uvc3ZucmVwbyEvYmFyCitLIDgKK3N2bTp1dWlkCitWIDM2CisxNjFjZTQyOS1hOWRkLTQ4MjgtYWY0YS01MjAyM2Y5NjhjODkKK1BST1BTLUVORAorCisKK1JldmlzaW9uLW51bWJlcjogMgorUHJvcC1jb250ZW50LWxlbmd0aDogMTgyCitDb250ZW50LWxlbmd0aDogMTgyCisKK0sgNworc3ZuOmxvZworViAxOAoraW1wb3J0IGZvciBnaXQtc3ZuCitLIDEwCitzdm46YXV0aG9yCitWIDcKK3N2bnN5bmMKK0sgMTEKK3N2bTpoZWFkcmV2CitWIDM5CisxNjFjZTQyOS1hOWRkLTQ4MjgtYWY0YS01MjAyM2Y5NjhjODk6MQorCitLIDgKK3N2bjpkYXRlCitWIDI3CisyMDA3LTAyLTE3VDA1OjEwOjUyLjEwODg0N1oKK1BST1BTLUVORAorCitOb2RlLXBhdGg6IG1pcnJvci9hcnIKK05vZGUta2luZDogZGlyCitOb2RlLWFjdGlvbjogY2hhbmdlCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMTYKK0NvbnRlbnQtbGVuZ3RoOiAxMTYKKworSyAxMAorc3ZtOnNvdXJjZQorViAyOQoraHR0cDovL21heW9uYWlzZS9zdm5yZXBvIS9iYXIKK0sgOAorc3ZtOnV1aWQKK1YgMzYKKzE2MWNlNDI5LWE5ZGQtNDgyOC1hZjRhLTUyMDIzZjk2OGM4OQorUFJPUFMtRU5ECisKKworTm9kZS1wYXRoOiBtaXJyb3IvYXJyL3p6egorTm9kZS1raW5kOiBmaWxlCitOb2RlLWFjdGlvbjogYWRkCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMAorVGV4dC1jb250ZW50LWxlbmd0aDogNAorVGV4dC1jb250ZW50LW1kNTogMzNiMDJiYzE1Y2U5NTU3ZDJkZDg0ODRkNThmOTVhYzQKK0NvbnRlbnQtbGVuZ3RoOiAxNAorCitQUk9QUy1FTkQKK3p6egorCisKK1JldmlzaW9uLW51bWJlcjogMworUHJvcC1jb250ZW50LWxlbmd0aDogMjMwCitDb250ZW50LWxlbmd0aDogMjMwCisKK0sgNworc3ZuOmxvZworViA2NgorbmV3IHN5bWxpbmsgaXMgYWRkZWQgdG8gYSBmaWxlIHRoYXQgd2FzIGFsc28ganVzdCBtYWRlIGV4ZWN1dGFibGUKKworSyAxMAorc3ZuOmF1dGhvcgorViA3Citzdm5zeW5jCitLIDExCitzdm06aGVhZHJldgorViAzOQorMTYxY2U0MjktYTlkZC00ODI4LWFmNGEtNTIwMjNmOTY4Yzg5OjYKKworSyA4Citzdm46ZGF0ZQorViAyNworMjAwNy0wMi0xN1QwNToxMTowMS42ODY4OTFaCitQUk9QUy1FTkQKKworTm9kZS1wYXRoOiBtaXJyb3IvYXJyL3p6egorTm9kZS1raW5kOiBmaWxlCitOb2RlLWFjdGlvbjogY2hhbmdlCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAzNgorVGV4dC1jb250ZW50LWxlbmd0aDogNAorVGV4dC1jb250ZW50LW1kNTogMzNiMDJiYzE1Y2U5NTU3ZDJkZDg0ODRkNThmOTVhYzQKK0NvbnRlbnQtbGVuZ3RoOiA0MAorCitLIDE0Citzdm46ZXhlY3V0YWJsZQorViAxCisqCitQUk9QUy1FTkQKK3p6egorCisKK1JldmlzaW9uLW51bWJlcjogNAorUHJvcC1jb250ZW50LWxlbmd0aDogMTkyCitDb250ZW50LWxlbmd0aDogMTkyCisKK0sgNworc3ZuOmxvZworViAyOAorL2Jhci9kIHNob3VsZCBiZSBpbiB0aGUgbG9nCisKK0sgMTAKK3N2bjphdXRob3IKK1YgNworc3Zuc3luYworSyAxMQorc3ZtOmhlYWRyZXYKK1YgMzkKKzE2MWNlNDI5LWE5ZGQtNDgyOC1hZjRhLTUyMDIzZjk2OGM4OTo5CisKK0sgOAorc3ZuOmRhdGUKK1YgMjcKKzIwMDctMDItMTdUMDU6MTE6MDcuNjg2NTUyWgorUFJPUFMtRU5ECisKK05vZGUtcGF0aDogbWlycm9yL2Fyci9kCitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitUZXh0LWNvbnRlbnQtbGVuZ3RoOiA0CitUZXh0LWNvbnRlbnQtbWQ1OiAwYmVlODliMDdhMjQ4ZTI3YzgzZmMzZDU5NTEyMTNjMQorQ29udGVudC1sZW5ndGg6IDE0CisKK1BST1BTLUVORAorYWJjCisKKworUmV2aXNpb24tbnVtYmVyOiA1CitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxODUKK0NvbnRlbnQtbGVuZ3RoOiAxODUKKworSyA3Citzdm46bG9nCitWIDIwCithZGQgYSBuZXcgZGlyZWN0b3J5CisKK0sgMTAKK3N2bjphdXRob3IKK1YgNworc3Zuc3luYworSyAxMQorc3ZtOmhlYWRyZXYKK1YgNDAKKzE2MWNlNDI5LWE5ZGQtNDgyOC1hZjRhLTUyMDIzZjk2OGM4OToxMAorCitLIDgKK3N2bjpkYXRlCitWIDI3CisyMDA3LTAyLTE3VDA1OjExOjA4LjQwNTk1M1oKK1BST1BTLUVORAorCitOb2RlLXBhdGg6IG1pcnJvci9hcnIvbmV3ZGlyCitOb2RlLWtpbmQ6IGRpcgorTm9kZS1hY3Rpb246IGFkZAorUHJvcC1jb250ZW50LWxlbmd0aDogMTAKK0NvbnRlbnQtbGVuZ3RoOiAxMAorCitQUk9QUy1FTkQKKworCitOb2RlLXBhdGg6IG1pcnJvci9hcnIvbmV3ZGlyL2RpcgorTm9kZS1raW5kOiBmaWxlCitOb2RlLWFjdGlvbjogYWRkCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMAorVGV4dC1jb250ZW50LWxlbmd0aDogNAorVGV4dC1jb250ZW50LW1kNTogOWNkNTk5YTM1MjM4OThlNmExMmUxM2VjNzg3ZGE1MGEKK0NvbnRlbnQtbGVuZ3RoOiAxNAorCitQUk9QUy1FTkQKK25ldworCisKK1JldmlzaW9uLW51bWJlcjogNgorUHJvcC1jb250ZW50LWxlbmd0aDogMTk2CitDb250ZW50LWxlbmd0aDogMTk2CisKK0sgNworc3ZuOmxvZworViAzMQorbW9kaWZ5IGEgZmlsZSBpbiBuZXcgZGlyZWN0b3J5CisKK0sgMTAKK3N2bjphdXRob3IKK1YgNworc3Zuc3luYworSyAxMQorc3ZtOmhlYWRyZXYKK1YgNDAKKzE2MWNlNDI5LWE5ZGQtNDgyOC1hZjRhLTUyMDIzZjk2OGM4OToxMQorCitLIDgKK3N2bjpkYXRlCitWIDI3CisyMDA3LTAyLTE3VDA1OjExOjA5LjEyNjY0NVoKK1BST1BTLUVORAorCitOb2RlLXBhdGg6IG1pcnJvci9hcnIvbmV3ZGlyL2RpcgorTm9kZS1raW5kOiBmaWxlCitOb2RlLWFjdGlvbjogY2hhbmdlCitUZXh0LWNvbnRlbnQtbGVuZ3RoOiA4CitUZXh0LWNvbnRlbnQtbWQ1OiBhOTUwZTIwMzMyMzU4ZTUyM2E1ZTlkNTcxZTQ3ZmE2NAorQ29udGVudC1sZW5ndGg6IDgKKworbmV3Citmb28KKworCitSZXZpc2lvbi1udW1iZXI6IDcKK1Byb3AtY29udGVudC1sZW5ndGg6IDE3OQorQ29udGVudC1sZW5ndGg6IDE3OQorCitLIDcKK3N2bjpsb2cKK1YgMTQKK3VwZGF0ZSAvYmFyL2QKKworSyAxMAorc3ZuOmF1dGhvcgorViA3Citzdm5zeW5jCitLIDExCitzdm06aGVhZHJldgorViA0MAorMTYxY2U0MjktYTlkZC00ODI4LWFmNGEtNTIwMjNmOTY4Yzg5OjEyCisKK0sgOAorc3ZuOmRhdGUKK1YgMjcKKzIwMDctMDItMTdUMDU6MTE6MDkuODQ2MjIxWgorUFJPUFMtRU5ECisKK05vZGUtcGF0aDogbWlycm9yL2Fyci9kCitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBjaGFuZ2UKK1RleHQtY29udGVudC1sZW5ndGg6IDQKK1RleHQtY29udGVudC1tZDU6IDdhYmI3OGRlN2YyNzU2Y2E4YjUxMWNiYzg3OWZkNWU3CitDb250ZW50LWxlbmd0aDogNAorCitjYmEKKworCitSZXZpc2lvbi1udW1iZXI6IDgKK1Byb3AtY29udGVudC1sZW5ndGg6IDIwMQorQ29udGVudC1sZW5ndGg6IDIwMQorCitLIDcKK3N2bjpsb2cKK1YgNDEKK1NWTTogaW5pdGlhbGl6aW5nIG1pcnJvciBmb3IgL21pcnJvci9hcmdoCitLIDEwCitzdm46YXV0aG9yCitWIDMKK3N2bQorSyAxMQorc3ZtOmhlYWRyZXYKK1YgMzkKKzE2MWNlNDI5LWE5ZGQtNDgyOC1hZjRhLTUyMDIzZjk2OGM4OTowCisKK0sgOAorc3ZuOmRhdGUKK1YgMjcKKzIwMDctMDItMTdUMDY6NTY6MDMuNzAzNjc3WgorUFJPUFMtRU5ECisKK05vZGUtcGF0aDogCitOb2RlLWtpbmQ6IGRpcgorTm9kZS1hY3Rpb246IGNoYW5nZQorUHJvcC1jb250ZW50LWxlbmd0aDogNTcKK0NvbnRlbnQtbGVuZ3RoOiA1NworCitLIDEwCitzdm06bWlycm9yCitWIDI1CisvbWlycm9yL2FyZ2gKKy9taXJyb3IvYXJyCisKK1BST1BTLUVORAorCisKK05vZGUtcGF0aDogbWlycm9yL2FyZ2gKK05vZGUta2luZDogZGlyCitOb2RlLWFjdGlvbjogYWRkCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMTYKK0NvbnRlbnQtbGVuZ3RoOiAxMTYKKworSyAxMAorc3ZtOnNvdXJjZQorViAyOQoraHR0cDovL21heW9uYWlzZS9zdm5yZXBvIS9kaXIKK0sgOAorc3ZtOnV1aWQKK1YgMzYKKzE2MWNlNDI5LWE5ZGQtNDgyOC1hZjRhLTUyMDIzZjk2OGM4OQorUFJPUFMtRU5ECisKKworUmV2aXNpb24tbnVtYmVyOiA5CitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxODIKK0NvbnRlbnQtbGVuZ3RoOiAxODIKKworSyA3Citzdm46bG9nCitWIDE4CitpbXBvcnQgZm9yIGdpdC1zdm4KK0sgMTAKK3N2bjphdXRob3IKK1YgNworc3Zuc3luYworSyAxMQorc3ZtOmhlYWRyZXYKK1YgMzkKKzE2MWNlNDI5LWE5ZGQtNDgyOC1hZjRhLTUyMDIzZjk2OGM4OToxCisKK0sgOAorc3ZuOmRhdGUKK1YgMjcKKzIwMDctMDItMTdUMDU6MTA6NTIuMTA4ODQ3WgorUFJPUFMtRU5ECisKK05vZGUtcGF0aDogbWlycm9yL2FyZ2gKK05vZGUta2luZDogZGlyCitOb2RlLWFjdGlvbjogY2hhbmdlCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMTYKK0NvbnRlbnQtbGVuZ3RoOiAxMTYKKworSyAxMAorc3ZtOnNvdXJjZQorViAyOQoraHR0cDovL21heW9uYWlzZS9zdm5yZXBvIS9kaXIKK0sgOAorc3ZtOnV1aWQKK1YgMzYKKzE2MWNlNDI5LWE5ZGQtNDgyOC1hZjRhLTUyMDIzZjk2OGM4OQorUFJPUFMtRU5ECisKKworTm9kZS1wYXRoOiBtaXJyb3IvYXJnaC9hCitOb2RlLWtpbmQ6IGRpcgorTm9kZS1hY3Rpb246IGFkZAorUHJvcC1jb250ZW50LWxlbmd0aDogMTAKK0NvbnRlbnQtbGVuZ3RoOiAxMAorCitQUk9QUy1FTkQKKworCitOb2RlLXBhdGg6IG1pcnJvci9hcmdoL2EvYgorTm9kZS1raW5kOiBkaXIKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitDb250ZW50LWxlbmd0aDogMTAKKworUFJPUFMtRU5ECisKKworTm9kZS1wYXRoOiBtaXJyb3IvYXJnaC9hL2IvYworTm9kZS1raW5kOiBkaXIKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitDb250ZW50LWxlbmd0aDogMTAKKworUFJPUFMtRU5ECisKKworTm9kZS1wYXRoOiBtaXJyb3IvYXJnaC9hL2IvYy9kCitOb2RlLWtpbmQ6IGRpcgorTm9kZS1hY3Rpb246IGFkZAorUHJvcC1jb250ZW50LWxlbmd0aDogMTAKK0NvbnRlbnQtbGVuZ3RoOiAxMAorCitQUk9QUy1FTkQKKworCitOb2RlLXBhdGg6IG1pcnJvci9hcmdoL2EvYi9jL2QvZQorTm9kZS1raW5kOiBkaXIKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitDb250ZW50LWxlbmd0aDogMTAKKworUFJPUFMtRU5ECisKKworTm9kZS1wYXRoOiBtaXJyb3IvYXJnaC9hL2IvYy9kL2UvZmlsZQorTm9kZS1raW5kOiBmaWxlCitOb2RlLWFjdGlvbjogYWRkCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMAorVGV4dC1jb250ZW50LWxlbmd0aDogOQorVGV4dC1jb250ZW50LW1kNTogM2ZkNDZmZTQ2ZmNkY2YwNjJjODAyY2E2MGRjODI2ZDUKK0NvbnRlbnQtbGVuZ3RoOiAxOQorCitQUk9QUy1FTkQKK2RlZXAgZGlyCisKKworUmV2aXNpb24tbnVtYmVyOiAxMAorUHJvcC1jb250ZW50LWxlbmd0aDogMTk3CitDb250ZW50LWxlbmd0aDogMTk3CisKK0sgNworc3ZuOmxvZworViAzMwordHJ5IGEgZGVlcCAtLXJtZGlyIHdpdGggYSBjb21taXQKKworSyAxMAorc3ZuOmF1dGhvcgorViA3Citzdm5zeW5jCitLIDExCitzdm06aGVhZHJldgorViAzOQorMTYxY2U0MjktYTlkZC00ODI4LWFmNGEtNTIwMjNmOTY4Yzg5OjIKKworSyA4Citzdm46ZGF0ZQorViAyNworMjAwNy0wMi0xN1QwNToxMDo1NC44NDcwMTVaCitQUk9QUy1FTkQKKworTm9kZS1wYXRoOiBtaXJyb3IvYXJnaC9maWxlCitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBhZGQKK05vZGUtY29weWZyb20tcmV2OiA5CitOb2RlLWNvcHlmcm9tLXBhdGg6IG1pcnJvci9hcmdoL2EvYi9jL2QvZS9maWxlCitUZXh0LWNvbnRlbnQtbGVuZ3RoOiA5CitUZXh0LWNvbnRlbnQtbWQ1OiAzZmQ0NmZlNDZmY2RjZjA2MmM4MDJjYTYwZGM4MjZkNQorQ29udGVudC1sZW5ndGg6IDkKKworZGVlcCBkaXIKKworCitOb2RlLXBhdGg6IG1pcnJvci9hcmdoL2EKK05vZGUtYWN0aW9uOiBkZWxldGUKKworCmRpZmYgLS1naXQgYS90L3Q5MTExLWdpdC1zdm4tdXNlLXN2bnN5bmMtcHJvcHMuc2ggYi90L3Q5MTExLWdpdC1zdm4tdXNlLXN2bnN5bmMtcHJvcHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWM3ZGVkZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDkxMTEtZ2l0LXN2bi11c2Utc3Zuc3luYy1wcm9wcy5zaApAQCAtMCwwICsxLDUxIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3IEVyaWMgV29uZworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtc3ZuIHVzZVN2bnN5bmNQcm9wcyB0ZXN0JworCisuIC4vbGliLWdpdC1zdm4uc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbG9hZCBzdm5zeW5jIHJlcG8nICIKKwlzdm5hZG1pbiBsb2FkIC1xICRyYXdzdm5yZXBvIDwgLi4vdDkxMTEvc3Zuc3luYy5kdW1wICYmCisJZ2l0LXN2biBpbml0IC0tbWluaW1pemUtdXJsIC1SIGFyciAtaSBiYXIgJHN2bnJlcG8vYmFyICYmCisJZ2l0LXN2biBpbml0IC0tbWluaW1pemUtdXJsIC1SIGFyZ2ggLWkgZGlyICRzdm5yZXBvL2RpciAmJgorCWdpdC1zdm4gaW5pdCAtLW1pbmltaXplLXVybCAtUiBhcmdoIC1pIGUgJHN2bnJlcG8vZGlyL2EvYi9jL2QvZSAmJgorCWdpdCBjb25maWcgc3ZuLnVzZVN2bnN5bmNQcm9wcyB0cnVlICYmCisJZ2l0LXN2biBmZXRjaCAtLWFsbAorCSIKKwordXVpZD0xNjFjZTQyOS1hOWRkLTQ4MjgtYWY0YS01MjAyM2Y5NjhjODkKKworYmFyX3VybD1odHRwOi8vbWF5b25haXNlL3N2bnJlcG8vYmFyCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd2ZXJpZnkgbWV0YWRhdGEgZm9yIC9iYXInICIKKwlnaXQgY2F0LWZpbGUgY29tbWl0IHJlZnMvcmVtb3Rlcy9iYXIgfCBcCisJICAgZ3JlcCAnXmdpdC1zdm4taWQ6ICRiYXJfdXJsQDEyICR1dWlkJCcgJiYKKwlnaXQgY2F0LWZpbGUgY29tbWl0IHJlZnMvcmVtb3Rlcy9iYXJ+MSB8IFwKKwkgICBncmVwICdeZ2l0LXN2bi1pZDogJGJhcl91cmxAMTEgJHV1aWQkJyAmJgorCWdpdCBjYXQtZmlsZSBjb21taXQgcmVmcy9yZW1vdGVzL2Jhcn4yIHwgXAorCSAgIGdyZXAgJ15naXQtc3ZuLWlkOiAkYmFyX3VybEAxMCAkdXVpZCQnICYmCisJZ2l0IGNhdC1maWxlIGNvbW1pdCByZWZzL3JlbW90ZXMvYmFyfjMgfCBcCisJICAgZ3JlcCAnXmdpdC1zdm4taWQ6ICRiYXJfdXJsQDkgJHV1aWQkJyAmJgorCWdpdCBjYXQtZmlsZSBjb21taXQgcmVmcy9yZW1vdGVzL2Jhcn40IHwgXAorCSAgIGdyZXAgJ15naXQtc3ZuLWlkOiAkYmFyX3VybEA2ICR1dWlkJCcgJiYKKwlnaXQgY2F0LWZpbGUgY29tbWl0IHJlZnMvcmVtb3Rlcy9iYXJ+NSB8IFwKKwkgICBncmVwICdeZ2l0LXN2bi1pZDogJGJhcl91cmxAMSAkdXVpZCQnCisJIgorCitlX3VybD1odHRwOi8vbWF5b25haXNlL3N2bnJlcG8vZGlyL2EvYi9jL2QvZQordGVzdF9leHBlY3Rfc3VjY2VzcyAndmVyaWZ5IG1ldGFkYXRhIGZvciAvZGlyL2EvYi9jL2QvZScgIgorCWdpdCBjYXQtZmlsZSBjb21taXQgcmVmcy9yZW1vdGVzL2UgfCBcCisJICAgZ3JlcCAnXmdpdC1zdm4taWQ6ICRlX3VybEAxICR1dWlkJCcKKwkiCisKK2Rpcl91cmw9aHR0cDovL21heW9uYWlzZS9zdm5yZXBvL2RpcgordGVzdF9leHBlY3Rfc3VjY2VzcyAndmVyaWZ5IG1ldGFkYXRhIGZvciAvZGlyJyAiCisJZ2l0IGNhdC1maWxlIGNvbW1pdCByZWZzL3JlbW90ZXMvZGlyIHwgXAorCSAgIGdyZXAgJ15naXQtc3ZuLWlkOiAkZGlyX3VybEAyICR1dWlkJCcgJiYKKwlnaXQgY2F0LWZpbGUgY29tbWl0IHJlZnMvcmVtb3Rlcy9kaXJ+MSB8IFwKKwkgICBncmVwICdeZ2l0LXN2bi1pZDogJGRpcl91cmxAMSAkdXVpZCQnCisJIgorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDkxMTEvc3Zuc3luYy5kdW1wIGIvdC90OTExMS9zdm5zeW5jLmR1bXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk5ZmE5NQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDkxMTEvc3Zuc3luYy5kdW1wCkBAIC0wLDAgKzEsNTYwIEBACitTVk4tZnMtZHVtcC1mb3JtYXQtdmVyc2lvbjogMgorCitVVUlEOiBiNGJmZTM1ZS1mMjU2LTQwOTYtODc0Yy0wOGM1NjM5ZWNhZDcKKworUmV2aXNpb24tbnVtYmVyOiAwCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAyNDAKK0NvbnRlbnQtbGVuZ3RoOiAyNDAKKworSyAxOAorc3ZuOnN5bmMtZnJvbS11dWlkCitWIDM2CisxNjFjZTQyOS1hOWRkLTQ4MjgtYWY0YS01MjAyM2Y5NjhjODkKK0sgMTAKK3N2bjphdXRob3IKK1YgNworc3Zuc3luYworSyAyNAorc3ZuOnN5bmMtbGFzdC1tZXJnZWQtcmV2CitWIDIKKzEyCitLIDgKK3N2bjpkYXRlCitWIDI3CisyMDA3LTAyLTE3VDA1OjEwOjUyLjAxNzU1MloKK0sgMTcKK3N2bjpzeW5jLWZyb20tdXJsCitWIDI0CitodHRwOi8vbWF5b25haXNlL3N2bnJlcG8KK1BST1BTLUVORAorCitSZXZpc2lvbi1udW1iZXI6IDEKK1Byb3AtY29udGVudC1sZW5ndGg6IDEyMAorQ29udGVudC1sZW5ndGg6IDEyMAorCitLIDcKK3N2bjpsb2cKK1YgMTgKK2ltcG9ydCBmb3IgZ2l0LXN2bgorSyAxMAorc3ZuOmF1dGhvcgorViA3Citzdm5zeW5jCitLIDgKK3N2bjpkYXRlCitWIDI3CisyMDA3LTAyLTE3VDA1OjEwOjUyLjEwODg0N1oKK1BST1BTLUVORAorCitOb2RlLXBhdGg6IGJhcgorTm9kZS1raW5kOiBkaXIKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitDb250ZW50LWxlbmd0aDogMTAKKworUFJPUFMtRU5ECisKKworTm9kZS1wYXRoOiBiYXIvenp6CitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitUZXh0LWNvbnRlbnQtbGVuZ3RoOiA0CitUZXh0LWNvbnRlbnQtbWQ1OiAzM2IwMmJjMTVjZTk1NTdkMmRkODQ4NGQ1OGY5NWFjNAorQ29udGVudC1sZW5ndGg6IDE0CisKK1BST1BTLUVORAorenp6CisKKworTm9kZS1wYXRoOiBkaXIKK05vZGUta2luZDogZGlyCitOb2RlLWFjdGlvbjogYWRkCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMAorQ29udGVudC1sZW5ndGg6IDEwCisKK1BST1BTLUVORAorCisKK05vZGUtcGF0aDogZGlyL2EKK05vZGUta2luZDogZGlyCitOb2RlLWFjdGlvbjogYWRkCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMAorQ29udGVudC1sZW5ndGg6IDEwCisKK1BST1BTLUVORAorCisKK05vZGUtcGF0aDogZGlyL2EvYgorTm9kZS1raW5kOiBkaXIKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitDb250ZW50LWxlbmd0aDogMTAKKworUFJPUFMtRU5ECisKKworTm9kZS1wYXRoOiBkaXIvYS9iL2MKK05vZGUta2luZDogZGlyCitOb2RlLWFjdGlvbjogYWRkCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMAorQ29udGVudC1sZW5ndGg6IDEwCisKK1BST1BTLUVORAorCisKK05vZGUtcGF0aDogZGlyL2EvYi9jL2QKK05vZGUta2luZDogZGlyCitOb2RlLWFjdGlvbjogYWRkCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMAorQ29udGVudC1sZW5ndGg6IDEwCisKK1BST1BTLUVORAorCisKK05vZGUtcGF0aDogZGlyL2EvYi9jL2QvZQorTm9kZS1raW5kOiBkaXIKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitDb250ZW50LWxlbmd0aDogMTAKKworUFJPUFMtRU5ECisKKworTm9kZS1wYXRoOiBkaXIvYS9iL2MvZC9lL2ZpbGUKK05vZGUta2luZDogZmlsZQorTm9kZS1hY3Rpb246IGFkZAorUHJvcC1jb250ZW50LWxlbmd0aDogMTAKK1RleHQtY29udGVudC1sZW5ndGg6IDkKK1RleHQtY29udGVudC1tZDU6IDNmZDQ2ZmU0NmZjZGNmMDYyYzgwMmNhNjBkYzgyNmQ1CitDb250ZW50LWxlbmd0aDogMTkKKworUFJPUFMtRU5ECitkZWVwIGRpcgorCisKK05vZGUtcGF0aDogZXhlYy5zaAorTm9kZS1raW5kOiBmaWxlCitOb2RlLWFjdGlvbjogYWRkCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAzNQorVGV4dC1jb250ZW50LWxlbmd0aDogMTAKK1RleHQtY29udGVudC1tZDU6IDNlMmIzMWM3MjE4MWI4NzE0OWZmOTk1ZTcyMDJjMGUzCitDb250ZW50LWxlbmd0aDogNDUKKworSyAxNAorc3ZuOmV4ZWN1dGFibGUKK1YgMAorCitQUk9QUy1FTkQKKyMhL2Jpbi9zaAorCisKK05vZGUtcGF0aDogZm9vCitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitUZXh0LWNvbnRlbnQtbGVuZ3RoOiA0CitUZXh0LWNvbnRlbnQtbWQ1OiBkM2IwNzM4NGQxMTNlZGVjNDllYWE2MjM4YWQ1ZmYwMAorQ29udGVudC1sZW5ndGg6IDE0CisKK1BST1BTLUVORAorZm9vCisKKworTm9kZS1wYXRoOiBmb28ubGluaworTm9kZS1raW5kOiBmaWxlCitOb2RlLWFjdGlvbjogYWRkCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAzMworVGV4dC1jb250ZW50LWxlbmd0aDogOAorVGV4dC1jb250ZW50LW1kNTogMTA0MzE0NmU0OWVmMDJjYWIxMmVlZjg2NWNiMzRmZjMKK0NvbnRlbnQtbGVuZ3RoOiA0MQorCitLIDExCitzdm46c3BlY2lhbAorViAxCisqCitQUk9QUy1FTkQKK2xpbmsgZm9vCisKK1JldmlzaW9uLW51bWJlcjogMgorUHJvcC1jb250ZW50LWxlbmd0aDogMTM1CitDb250ZW50LWxlbmd0aDogMTM1CisKK0sgNworc3ZuOmxvZworViAzMwordHJ5IGEgZGVlcCAtLXJtZGlyIHdpdGggYSBjb21taXQKKworSyAxMAorc3ZuOmF1dGhvcgorViA3Citzdm5zeW5jCitLIDgKK3N2bjpkYXRlCitWIDI3CisyMDA3LTAyLTE3VDA1OjEwOjU0Ljg0NzAxNVoKK1BST1BTLUVORAorCitOb2RlLXBhdGg6IGRpci9maWxlCitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBhZGQKK05vZGUtY29weWZyb20tcmV2OiAxCitOb2RlLWNvcHlmcm9tLXBhdGg6IGRpci9hL2IvYy9kL2UvZmlsZQorVGV4dC1jb250ZW50LWxlbmd0aDogOQorVGV4dC1jb250ZW50LW1kNTogM2ZkNDZmZTQ2ZmNkY2YwNjJjODAyY2E2MGRjODI2ZDUKK0NvbnRlbnQtbGVuZ3RoOiA5CisKK2RlZXAgZGlyCisKKworTm9kZS1wYXRoOiBkaXIvYQorTm9kZS1hY3Rpb246IGRlbGV0ZQorCisKK05vZGUtcGF0aDogZmlsZQorTm9kZS1raW5kOiBmaWxlCitOb2RlLWFjdGlvbjogYWRkCitOb2RlLWNvcHlmcm9tLXJldjogMQorTm9kZS1jb3B5ZnJvbS1wYXRoOiBkaXIvYS9iL2MvZC9lL2ZpbGUKK1RleHQtY29udGVudC1sZW5ndGg6IDkKK1RleHQtY29udGVudC1tZDU6IDNmZDQ2ZmU0NmZjZGNmMDYyYzgwMmNhNjBkYzgyNmQ1CitDb250ZW50LWxlbmd0aDogOQorCitkZWVwIGRpcgorCisKK1JldmlzaW9uLW51bWJlcjogMworUHJvcC1jb250ZW50LWxlbmd0aDogMTM2CitDb250ZW50LWxlbmd0aDogMTM2CisKK0sgNworc3ZuOmxvZworViAzNAorcmVtb3ZlIGV4ZWN1dGFibGUgYml0IGZyb20gYSBmaWxlCisKK0sgMTAKK3N2bjphdXRob3IKK1YgNworc3Zuc3luYworSyA4Citzdm46ZGF0ZQorViAyNworMjAwNy0wMi0xN1QwNToxMDo1OC4yMzI2OTFaCitQUk9QUy1FTkQKKworTm9kZS1wYXRoOiBleGVjLnNoCitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBjaGFuZ2UKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitUZXh0LWNvbnRlbnQtbGVuZ3RoOiAxMAorVGV4dC1jb250ZW50LW1kNTogM2UyYjMxYzcyMTgxYjg3MTQ5ZmY5OTVlNzIwMmMwZTMKK0NvbnRlbnQtbGVuZ3RoOiAyMAorCitQUk9QUy1FTkQKKyMhL2Jpbi9zaAorCisKK1JldmlzaW9uLW51bWJlcjogNAorUHJvcC1jb250ZW50LWxlbmd0aDogMTMxCitDb250ZW50LWxlbmd0aDogMTMxCisKK0sgNworc3ZuOmxvZworViAyOQorYWRkIGV4ZWN1dGFibGUgYml0IGJhY2sgZmlsZQorCitLIDEwCitzdm46YXV0aG9yCitWIDcKK3N2bnN5bmMKK0sgOAorc3ZuOmRhdGUKK1YgMjcKKzIwMDctMDItMTdUMDU6MTA6NTkuNjY2NTYwWgorUFJPUFMtRU5ECisKK05vZGUtcGF0aDogZXhlYy5zaAorTm9kZS1raW5kOiBmaWxlCitOb2RlLWFjdGlvbjogY2hhbmdlCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAzNgorVGV4dC1jb250ZW50LWxlbmd0aDogMTAKK1RleHQtY29udGVudC1tZDU6IDNlMmIzMWM3MjE4MWI4NzE0OWZmOTk1ZTcyMDJjMGUzCitDb250ZW50LWxlbmd0aDogNDYKKworSyAxNAorc3ZuOmV4ZWN1dGFibGUKK1YgMQorKgorUFJPUFMtRU5ECisjIS9iaW4vc2gKKworCitSZXZpc2lvbi1udW1iZXI6IDUKK1Byb3AtY29udGVudC1sZW5ndGg6IDE1NAorQ29udGVudC1sZW5ndGg6IDE1NAorCitLIDcKK3N2bjpsb2cKK1YgNTIKK2V4ZWN1dGFibGUgZmlsZSBiZWNvbWVzIGEgc3ltbGluayB0byBiYXIvenp6IChmaWxlKQorCitLIDEwCitzdm46YXV0aG9yCitWIDcKK3N2bnN5bmMKK0sgOAorc3ZuOmRhdGUKK1YgMjcKKzIwMDctMDItMTdUMDU6MTE6MDAuNjc2NDk1WgorUFJPUFMtRU5ECisKK05vZGUtcGF0aDogZXhlYy5zaAorTm9kZS1raW5kOiBmaWxlCitOb2RlLWFjdGlvbjogY2hhbmdlCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAzMworVGV4dC1jb250ZW50LWxlbmd0aDogMTIKK1RleHQtY29udGVudC1tZDU6IGYxMzg2OTMzNzE2NjVjYzExNzc0MjUwODc2MWQ2ODRkCitDb250ZW50LWxlbmd0aDogNDUKKworSyAxMQorc3ZuOnNwZWNpYWwKK1YgMQorKgorUFJPUFMtRU5ECitsaW5rIGJhci96enoKKworUmV2aXNpb24tbnVtYmVyOiA2CitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxNjgKK0NvbnRlbnQtbGVuZ3RoOiAxNjgKKworSyA3Citzdm46bG9nCitWIDY2CituZXcgc3ltbGluayBpcyBhZGRlZCB0byBhIGZpbGUgdGhhdCB3YXMgYWxzbyBqdXN0IG1hZGUgZXhlY3V0YWJsZQorCitLIDEwCitzdm46YXV0aG9yCitWIDcKK3N2bnN5bmMKK0sgOAorc3ZuOmRhdGUKK1YgMjcKKzIwMDctMDItMTdUMDU6MTE6MDEuNjg2ODkxWgorUFJPUFMtRU5ECisKK05vZGUtcGF0aDogYmFyL3p6egorTm9kZS1raW5kOiBmaWxlCitOb2RlLWFjdGlvbjogY2hhbmdlCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAzNgorVGV4dC1jb250ZW50LWxlbmd0aDogNAorVGV4dC1jb250ZW50LW1kNTogMzNiMDJiYzE1Y2U5NTU3ZDJkZDg0ODRkNThmOTVhYzQKK0NvbnRlbnQtbGVuZ3RoOiA0MAorCitLIDE0Citzdm46ZXhlY3V0YWJsZQorViAxCisqCitQUk9QUy1FTkQKK3p6egorCisKK05vZGUtcGF0aDogZXhlYy0yLnNoCitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBhZGQKK05vZGUtY29weWZyb20tcmV2OiA1CitOb2RlLWNvcHlmcm9tLXBhdGg6IGV4ZWMuc2gKK1RleHQtY29udGVudC1sZW5ndGg6IDEyCitUZXh0LWNvbnRlbnQtbWQ1OiBmMTM4NjkzMzcxNjY1Y2MxMTc3NDI1MDg3NjFkNjg0ZAorQ29udGVudC1sZW5ndGg6IDEyCisKK2xpbmsgYmFyL3p6egorCitSZXZpc2lvbi1udW1iZXI6IDcKK1Byb3AtY29udGVudC1sZW5ndGg6IDEzNgorQ29udGVudC1sZW5ndGg6IDEzNgorCitLIDcKK3N2bjpsb2cKK1YgMzQKK21vZGlmeSBhIHN5bWxpbmsgdG8gYmVjb21lIGEgZmlsZQorCitLIDEwCitzdm46YXV0aG9yCitWIDcKK3N2bnN5bmMKK0sgOAorc3ZuOmRhdGUKK1YgMjcKKzIwMDctMDItMTdUMDU6MTE6MDIuNjc3MDM1WgorUFJPUFMtRU5ECisKK05vZGUtcGF0aDogZXhlYy0yLnNoCitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBjaGFuZ2UKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitUZXh0LWNvbnRlbnQtbGVuZ3RoOiA5CitUZXh0LWNvbnRlbnQtbWQ1OiA4ZTkyZWZmOWU5MTE4ODZjZWRlMjdkNDIwZjg5YzczNQorQ29udGVudC1sZW5ndGg6IDE5CisKK1BST1BTLUVORAorZ2l0IGhlbHAKKworCitSZXZpc2lvbi1udW1iZXI6IDgKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwOQorQ29udGVudC1sZW5ndGg6IDEwOQorCitLIDcKK3N2bjpsb2cKK1YgOAorw6nDr+KIjworCitLIDEwCitzdm46YXV0aG9yCitWIDcKK3N2bnN5bmMKK0sgOAorc3ZuOmRhdGUKK1YgMjcKKzIwMDctMDItMTdUMDU6MTE6MDMuNjc2ODYyWgorUFJPUFMtRU5ECisKK05vZGUtcGF0aDogZXhlYy0yLnNoCitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBjaGFuZ2UKK1RleHQtY29udGVudC1sZW5ndGg6IDE3CitUZXh0LWNvbnRlbnQtbWQ1OiA0OTg4MTk1NDA2M2NmMjZjYTQ4YzIxMjM5NmE5NTdjYQorQ29udGVudC1sZW5ndGg6IDE3CisKK2dpdCBoZWxwCisjIGhlbGxvCisKKworUmV2aXNpb24tbnVtYmVyOiA5CitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMzAKK0NvbnRlbnQtbGVuZ3RoOiAxMzAKKworSyA3Citzdm46bG9nCitWIDI4CisvYmFyL2Qgc2hvdWxkIGJlIGluIHRoZSBsb2cKKworSyAxMAorc3ZuOmF1dGhvcgorViA3Citzdm5zeW5jCitLIDgKK3N2bjpkYXRlCitWIDI3CisyMDA3LTAyLTE3VDA1OjExOjA3LjY4NjU1MloKK1BST1BTLUVORAorCitOb2RlLXBhdGg6IGJhci9kCitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitUZXh0LWNvbnRlbnQtbGVuZ3RoOiA0CitUZXh0LWNvbnRlbnQtbWQ1OiAwYmVlODliMDdhMjQ4ZTI3YzgzZmMzZDU5NTEyMTNjMQorQ29udGVudC1sZW5ndGg6IDE0CisKK1BST1BTLUVORAorYWJjCisKKworUmV2aXNpb24tbnVtYmVyOiAxMAorUHJvcC1jb250ZW50LWxlbmd0aDogMTIyCitDb250ZW50LWxlbmd0aDogMTIyCisKK0sgNworc3ZuOmxvZworViAyMAorYWRkIGEgbmV3IGRpcmVjdG9yeQorCitLIDEwCitzdm46YXV0aG9yCitWIDcKK3N2bnN5bmMKK0sgOAorc3ZuOmRhdGUKK1YgMjcKKzIwMDctMDItMTdUMDU6MTE6MDguNDA1OTUzWgorUFJPUFMtRU5ECisKK05vZGUtcGF0aDogYmFyL25ld2RpcgorTm9kZS1raW5kOiBkaXIKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitDb250ZW50LWxlbmd0aDogMTAKKworUFJPUFMtRU5ECisKKworTm9kZS1wYXRoOiBiYXIvbmV3ZGlyL2RpcgorTm9kZS1raW5kOiBmaWxlCitOb2RlLWFjdGlvbjogYWRkCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMAorVGV4dC1jb250ZW50LWxlbmd0aDogNAorVGV4dC1jb250ZW50LW1kNTogOWNkNTk5YTM1MjM4OThlNmExMmUxM2VjNzg3ZGE1MGEKK0NvbnRlbnQtbGVuZ3RoOiAxNAorCitQUk9QUy1FTkQKK25ldworCisKK1JldmlzaW9uLW51bWJlcjogMTEKK1Byb3AtY29udGVudC1sZW5ndGg6IDEzMworQ29udGVudC1sZW5ndGg6IDEzMworCitLIDcKK3N2bjpsb2cKK1YgMzEKK21vZGlmeSBhIGZpbGUgaW4gbmV3IGRpcmVjdG9yeQorCitLIDEwCitzdm46YXV0aG9yCitWIDcKK3N2bnN5bmMKK0sgOAorc3ZuOmRhdGUKK1YgMjcKKzIwMDctMDItMTdUMDU6MTE6MDkuMTI2NjQ1WgorUFJPUFMtRU5ECisKK05vZGUtcGF0aDogYmFyL25ld2Rpci9kaXIKK05vZGUta2luZDogZmlsZQorTm9kZS1hY3Rpb246IGNoYW5nZQorVGV4dC1jb250ZW50LWxlbmd0aDogOAorVGV4dC1jb250ZW50LW1kNTogYTk1MGUyMDMzMjM1OGU1MjNhNWU5ZDU3MWU0N2ZhNjQKK0NvbnRlbnQtbGVuZ3RoOiA4CisKK25ldworZm9vCisKKworUmV2aXNpb24tbnVtYmVyOiAxMgorUHJvcC1jb250ZW50LWxlbmd0aDogMTE2CitDb250ZW50LWxlbmd0aDogMTE2CisKK0sgNworc3ZuOmxvZworViAxNAordXBkYXRlIC9iYXIvZAorCitLIDEwCitzdm46YXV0aG9yCitWIDcKK3N2bnN5bmMKK0sgOAorc3ZuOmRhdGUKK1YgMjcKKzIwMDctMDItMTdUMDU6MTE6MDkuODQ2MjIxWgorUFJPUFMtRU5ECisKK05vZGUtcGF0aDogYmFyL2QKK05vZGUta2luZDogZmlsZQorTm9kZS1hY3Rpb246IGNoYW5nZQorVGV4dC1jb250ZW50LWxlbmd0aDogNAorVGV4dC1jb250ZW50LW1kNTogN2FiYjc4ZGU3ZjI3NTZjYThiNTExY2JjODc5ZmQ1ZTcKK0NvbnRlbnQtbGVuZ3RoOiA0CisKK2NiYQpkaWZmIC0tZ2l0IGEvdC90OTExMi1naXQtc3ZuLW1kNWxlc3MtZmlsZS5zaCBiL3QvdDkxMTItZ2l0LXN2bi1tZDVsZXNzLWZpbGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjQ2YTVmMAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDkxMTItZ2l0LXN2bi1tZDVsZXNzLWZpbGUuc2gKQEAgLTAsMCArMSw0NyBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J3Rlc3QgdGhhdCBnaXQgaGFuZGxlcyBhbiBzdm4gcmVwb3NpdG9yeSB3aXRoIG1pc3NpbmcgbWQ1c3VtcycKKworLiAuL2xpYi1naXQtc3ZuLnNoCisKKyMgTG9hZGluZyBhIG5vZGUgZnJvbSBhIHN2biBkdW1wZmlsZSB3aXRob3V0IGEgVGV4dC1Db250ZW50LUxlbmd0aAorIyBmaWVsZCBjYXVzZXMgc3ZuIHRvIG5lZ2xlY3QgdG8gc3RvcmUgb3IgcmVwb3J0IGFuIG1kNXN1bS4gIChpdCB3aWxsCisjIGNhbGN1bGF0ZSBvbmUgaWYgeW91IGhhZCBwdXQgVGV4dC1Db250ZW50LUxlbmd0aDogMCkuICBUaGlzIHNob3dlZAorIyB1cCBpbiBhIHJlcG9zaXRvcnkgY3JldGVkIHdpdGggY3ZzMnN2bi4KKworY2F0ID4gZHVtcGZpbGUuc3ZuIDw8RU9GCitTVk4tZnMtZHVtcC1mb3JtYXQtdmVyc2lvbjogMQorCitSZXZpc2lvbi1udW1iZXI6IDEKK1Byb3AtY29udGVudC1sZW5ndGg6IDk4CitDb250ZW50LWxlbmd0aDogOTgKKworSyA3Citzdm46bG9nCitWIDAKKworSyAxMAorc3ZuOmF1dGhvcgorViA0Cit0ZXN0CitLIDgKK3N2bjpkYXRlCitWIDI3CisyMDA3LTA1LTA2VDEyOjM3OjAxLjE1MzMzOVoKK1BST1BTLUVORAorCitOb2RlLXBhdGg6IG1kNWxlc3MtZmlsZQorTm9kZS1raW5kOiBmaWxlCitOb2RlLWFjdGlvbjogYWRkCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMAorQ29udGVudC1sZW5ndGg6IDEwCisKK1BST1BTLUVORAorCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbG9hZCBzdm4gZHVtcGZpbGUnICJzdm5hZG1pbiBsb2FkICRyYXdzdm5yZXBvIDwgZHVtcGZpbGUuc3ZuIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbml0aWFsaXplIGdpdC1zdm4nICJnaXQtc3ZuIGluaXQgJHN2bnJlcG8iCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmZXRjaCByZXZpc2lvbnMgZnJvbSBzdm4nICdnaXQtc3ZuIGZldGNoJwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q5MTEzLWdpdC1zdm4tZGNvbW1pdC1uZXctZmlsZS5zaCBiL3QvdDkxMTMtZ2l0LXN2bi1kY29tbWl0LW5ldy1maWxlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjllZjBkYjkKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q5MTEzLWdpdC1zdm4tZGNvbW1pdC1uZXctZmlsZS5zaApAQCAtMCwwICsxLDQwIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3IEVyaWMgV29uZworIworCisjIERvbid0IHJ1biB0aGlzIHRlc3QgYnkgZGVmYXVsdCB1bmxlc3MgdGhlIHVzZXIgcmVhbGx5IHdhbnRzIGl0CisjIEkgZG9uJ3QgbGlrZSB0aGUgaWRlYSBvZiB0YWtpbmcgYSBwb3J0IGFuZCBwb3NzaWJseSBsZWF2aW5nIGEKKyMgZGFlbW9uIHJ1bm5pbmcgb24gYSB1c2VycyBzeXN0ZW0gaWYgdGhlIHRlc3QgZmFpbHMuCisjIE5vdCBhbGwgZ2l0IHVzZXJzIHdpbGwgbmVlZCB0byBpbnRlcmFjdCB3aXRoIFNWTi4KK3Rlc3QgLXogIiRTVk5TRVJWRV9QT1JUIiAmJiBleGl0IDAKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LXN2biBkY29tbWl0IG5ldyBmaWxlcyBvdmVyIHN2bjovLyB0ZXN0JworCisuIC4vbGliLWdpdC1zdm4uc2gKKworc3RhcnRfc3Zuc2VydmUgKCkgeworCXN2bnNlcnZlIC0tbGlzdGVuLXBvcnQgJFNWTlNFUlZFX1BPUlQgXAorCSAgICAgICAgIC0tcm9vdCAkcmF3c3ZucmVwbyBcCisJICAgICAgICAgLS1saXN0ZW4tb25jZSBcCisJICAgICAgICAgLS1saXN0ZW4taG9zdCAxMjcuMC4wLjEgJgorfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzdGFydCB0cmFja2luZyBhbiBlbXB0eSByZXBvJyAiCisJc3ZuIG1rZGlyIC1tICdlbXB0eSBkaXInICRzdm5yZXBvL2VtcHR5LWRpciAmJgorCWVjaG8gYW5vbi1hY2Nlc3MgPSB3cml0ZSA+PiAkcmF3c3ZucmVwby9jb25mL3N2bnNlcnZlLmNvbmYgJiYKKwlzdGFydF9zdm5zZXJ2ZSAmJgorCWdpdCBzdm4gaW5pdCBzdm46Ly8xMjcuMC4wLjE6JFNWTlNFUlZFX1BPUlQgJiYKKwlnaXQgc3ZuIGZldGNoCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjcmVhdGUgZmlsZXMgaW4gbmV3IGRpcmVjdG9yeSB3aXRoIGRjb21taXQnICIKKwlta2RpciBnaXQtbmV3LWRpciAmJgorCWVjaG8gaGVsbG8gPiBnaXQtbmV3LWRpci93b3JsZCAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgZ2l0LW5ldy1kaXIvd29ybGQgJiYKKwlnaXQgY29tbWl0IC1tIGhlbGxvICYmCisJc3RhcnRfc3Zuc2VydmUgJiYKKwlnaXQgc3ZuIGRjb21taXQKKwkiCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90OTExNC1naXQtc3ZuLWRjb21taXQtbWVyZ2Uuc2ggYi90L3Q5MTE0LWdpdC1zdm4tZGNvbW1pdC1tZXJnZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMjUwNjBiCi0tLSAvZGV2L251bGwKKysrIGIvdC90OTExNC1naXQtc3ZuLWRjb21taXQtbWVyZ2Uuc2gKQEAgLTAsMCArMSw5NCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBFcmljIFdvbmcKKyMgQmFzZWQgb24gYSBzY3JpcHQgYnkgSm9ha2ltIFRqZXJubHVuZCA8am9ha2ltLnRqZXJubHVuZEB0cmFuc21vZGUuc2U+CisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1zdm4gZGNvbW1pdCBoYW5kbGVzIG1lcmdlcycKKworLiAuL2xpYi1naXQtc3ZuLnNoCisKK2JpZ190ZXh0X2Jsb2NrICgpIHsKK2NhdCA8PCBFT0YKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwIC0gMjAwNQorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCitFT0YKK30KKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgc3ZuIHJlcG9zaXRvcnknICIKKwlzdm4gY28gJHN2bnJlcG8gbXlzdm53b3JrICYmCisJbWtkaXIgLXAgbXlzdm53b3JrL3RydW5rICYmCisJY2QgbXlzdm53b3JrICYmCisJCWJpZ190ZXh0X2Jsb2NrID4+IHRydW5rL1JFQURNRSAmJgorCQlzdm4gYWRkIHRydW5rICYmCisJCXN2biBjaSAtbSAnZmlyc3QgY29tbWl0JyB0cnVuayAmJgorCQljZCAuLgorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgZ2l0IG1pcnJvciBhbmQgbWVyZ2UnICIKKwlnaXQgc3ZuIGluaXQgJHN2bnJlcG8gLXQgdGFncyAtVCB0cnVuayAtYiBicmFuY2hlcyAmJgorCWdpdCBzdm4gZmV0Y2ggJiYKKwlnaXQgY2hlY2tvdXQgLS10cmFjayAtYiBzdm4gcmVtb3Rlcy90cnVuayAmJgorCWdpdCBjaGVja291dCAtYiBtZXJnZSAmJgorCWVjaG8gbmV3IGZpbGUgPiBuZXdfZmlsZSAmJgorCWdpdCBhZGQgbmV3X2ZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICdOZXcgZmlsZScgJiYKKwllY2hvIGhlbGxvID4+IFJFQURNRSAmJgorCWdpdCBjb21taXQgLWEgLW0gJ2hlbGxvJyAmJgorCWVjaG8gYWRkIHNvbWUgc3R1ZmYgPj4gbmV3X2ZpbGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICdhZGQgc29tZSBzdHVmZicgJiYKKwlnaXQgY2hlY2tvdXQgc3ZuICYmCisJbXYgLWYgUkVBRE1FIHRtcCAmJgorCWVjaG8gZnJpZW5kID4gUkVBRE1FICYmCisJY2F0IHRtcCA+PiBSRUFETUUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICdmcmllbmQnICYmCisJZ2l0IHB1bGwgLiBtZXJnZQorCSIKKwordGVzdF9kZWJ1ZyAnZ2l0ayAtLWFsbCAmIHNsZWVwIDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ZlcmlmeSBwcmUtbWVyZ2UgYW5jZXN0cnknICIKKwl0ZXN0IHhcYGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgcmVmcy9oZWFkcy9zdm5eMlxgID0gXAorCSAgICAgeFxgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSByZWZzL2hlYWRzL21lcmdlXGAgJiYKKwlnaXQgY2F0LWZpbGUgY29tbWl0IHJlZnMvaGVhZHMvc3ZuXiB8IGdyZXAgJ15mcmllbmQkJworCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IHN2biBkY29tbWl0IG1lcmdlcycgIgorCWdpdCBzdm4gZGNvbW1pdAorCSIKKwordGVzdF9kZWJ1ZyAnZ2l0ayAtLWFsbCAmIHNsZWVwIDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ZlcmlmeSBwb3N0LW1lcmdlIGFuY2VzdHJ5JyAiCisJdGVzdCB4XGBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IHJlZnMvaGVhZHMvc3ZuXGAgPSBcCisJICAgICB4XGBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IHJlZnMvcmVtb3Rlcy90cnVuayBcYCAmJgorCXRlc3QgeFxgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSByZWZzL2hlYWRzL3N2bl4yXGAgPSBcCisJICAgICB4XGBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IHJlZnMvaGVhZHMvbWVyZ2VcYCAmJgorCWdpdCBjYXQtZmlsZSBjb21taXQgcmVmcy9oZWFkcy9zdm5eIHwgZ3JlcCAnXmZyaWVuZCQnCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd2ZXJpZnkgbWVyZ2UgY29tbWl0IG1lc3NhZ2UnICIKKwlnaXQgcmV2LWxpc3QgLS1wcmV0dHk9cmF3IC0xIHJlZnMvaGVhZHMvc3ZuIHwgXAorCSAgZ3JlcCBcIiAgICBNZXJnZSBicmFuY2ggJ21lcmdlJyBpbnRvIHN2blwiCisJIgorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDkxMTUtZ2l0LXN2bi1kY29tbWl0LWZ1bmt5LXJlbmFtZXMuc2ggYi90L3Q5MTE1LWdpdC1zdm4tZGNvbW1pdC1mdW5reS1yZW5hbWVzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE4MjI5OWMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q5MTE1LWdpdC1zdm4tZGNvbW1pdC1mdW5reS1yZW5hbWVzLnNoCkBAIC0wLDAgKzEsNTQgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDcgRXJpYyBXb25nCisKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LXN2biBkY29tbWl0IGNhbiBjb21taXQgcmVuYW1lcyBvZiBmaWxlcyB3aXRoIHVnbHkgbmFtZXMnCisKKy4gLi9saWItZ2l0LXN2bi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdsb2FkIHJlcG9zaXRvcnkgd2l0aCBzdHJhbmdlIG5hbWVzJyAiCisJc3ZuYWRtaW4gbG9hZCAtcSAkcmF3c3ZucmVwbyA8IC4uL3Q5MTE1L2Z1bmt5LW5hbWVzLmR1bXAgJiYKKwlzdGFydF9odHRwZAorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5pdCBhbmQgZmV0Y2ggcmVwb3NpdG9yeScgIgorCWdpdCBzdm4gaW5pdCAkc3ZucmVwbyAmJgorCWdpdCBzdm4gZmV0Y2ggJiYKKwlnaXQgcmVzZXQgLS1oYXJkIGdpdC1zdm4KKwkiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NyZWF0ZSBmaWxlIGluIGV4aXN0aW5nIHVnbHkgYW5kIGVtcHR5IGRpcicgJworCW1rZGlyICIje2JhZF9kaXJlY3RvcnlfbmFtZX0iICYmCisJZWNobyBoaSA+ICIje2JhZF9kaXJlY3RvcnlfbmFtZX0vIGZvbyIgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkICIje2JhZF9kaXJlY3RvcnlfbmFtZX0vIGZvbyIgJiYKKwlnaXQgY29tbWl0IC1tICJuZXcgZmlsZSBpbiB1Z2x5IHBhcmVudCIgJiYKKwlnaXQgc3ZuIGRjb21taXQKKwknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlbmFtZSB1Z2x5IGZpbGUnICcKKwlnaXQgbXYgIiN7YmFkX2RpcmVjdG9yeV9uYW1lfS8gZm9vIiAiZmlsZSBuYW1lIHdpdGggZmVjZXMiICYmCisJZ2l0IGNvbW1pdCAtbSAicmVuYW1lIHVnbHkgZmlsZSIgJiYKKwlnaXQgc3ZuIGRjb21taXQKKwknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlbmFtZSBwcmV0dHkgZmlsZScgJworCWVjaG8gOnggPiBwcmV0dHkgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIHByZXR0eSAmJgorCWdpdCBjb21taXQgLW0gInByZXR0eSA6eCIgJiYKKwlnaXQgc3ZuIGRjb21taXQgJiYKKwlta2RpciByZWd1bGFyX2Rpcl9uYW1lICYmCisJZ2l0IG12IHByZXR0eSByZWd1bGFyX2Rpcl9uYW1lL3ByZXR0eSAmJgorCWdpdCBjb21taXQgLW0gIm1vdmVkIHByZXR0eSBmaWxlIiAmJgorCWdpdCBzdm4gZGNvbW1pdAorCScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVuYW1lIHByZXR0eSBmaWxlIGludG8gdWdseSBvbmUnICcKKwlnaXQgbXYgcmVndWxhcl9kaXJfbmFtZS9wcmV0dHkgIiN7YmFkX2RpcmVjdG9yeV9uYW1lfS8gYm9vYm9vIiAmJgorCWdpdCBjb21taXQgLW0gYm9vYm9vICYmCisJZ2l0IHN2biBkY29tbWl0CisJJworCitzdG9wX2h0dHBkCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90OTExNS9mdW5reS1uYW1lcy5kdW1wIGIvdC90OTExNS9mdW5reS1uYW1lcy5kdW1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNDIyZjcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q5MTE1L2Z1bmt5LW5hbWVzLmR1bXAKQEAgLTAsMCArMSwxMDMgQEAKK1NWTi1mcy1kdW1wLWZvcm1hdC12ZXJzaW9uOiAyCisKK1VVSUQ6IDgxOWM0NGZlLTJiY2MtNDA2Ni04OGU0LTk4NWUyYmMwYjQxOAorCitSZXZpc2lvbi1udW1iZXI6IDAKK1Byb3AtY29udGVudC1sZW5ndGg6IDU2CitDb250ZW50LWxlbmd0aDogNTYKKworSyA4Citzdm46ZGF0ZQorViAyNworMjAwNy0wNy0xMlQwNzo1NDoyNi4wNjI5MTRaCitQUk9QUy1FTkQKKworUmV2aXNpb24tbnVtYmVyOiAxCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxNTIKK0NvbnRlbnQtbGVuZ3RoOiAxNTIKKworSyA3Citzdm46bG9nCitWIDQ0Cit3aGF0IHdpbGwgdGhvc2Ugd2Fja3kgcGVvcGxlIHRoaW5rIG9mIG5leHQ/CisKK0sgMTAKK3N2bjphdXRob3IKK1YgMTIKK25vcm1hbHBlcnNvbgorSyA4Citzdm46ZGF0ZQorViAyNworMjAwNy0wNy0xMlQwODowMDowNS4wMTE1NzNaCitQUk9QUy1FTkQKKworTm9kZS1wYXRoOiAgbGVhZGluZyBzcGFjZQorTm9kZS1raW5kOiBkaXIKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitDb250ZW50LWxlbmd0aDogMTAKKworUFJPUFMtRU5ECisKKworTm9kZS1wYXRoOiAgbGVhZGluZyBzcGFjZSBmaWxlCitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitUZXh0LWNvbnRlbnQtbGVuZ3RoOiA1CitUZXh0LWNvbnRlbnQtbWQ1OiBlNGZhMjBjNjc1NDJjZGMyMTI3MWUwOGQzMjkzOTdhYgorQ29udGVudC1sZW5ndGg6IDE1CisKK1BST1BTLUVORAordWdseQorCisKK05vZGUtcGF0aDogI3tiYWRfZGlyZWN0b3J5X25hbWV9CitOb2RlLWtpbmQ6IGRpcgorTm9kZS1hY3Rpb246IGFkZAorUHJvcC1jb250ZW50LWxlbmd0aDogMTAKK0NvbnRlbnQtbGVuZ3RoOiAxMAorCitQUk9QUy1FTkQKKworCitOb2RlLXBhdGg6ICN7Y29vbF9uYW1lfQorTm9kZS1raW5kOiBmaWxlCitOb2RlLWFjdGlvbjogYWRkCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMAorVGV4dC1jb250ZW50LWxlbmd0aDogMTgKK1RleHQtY29udGVudC1tZDU6IDg3ZGFjNDBjYTMzN2RmYTNkY2M4OTExMzg4YzNkZGRhCitDb250ZW50LWxlbmd0aDogMjgKKworUFJPUFMtRU5ECitzdHJhbmdlIG5hbWUgaGVyZQorCisKK05vZGUtcGF0aDogZGlyIG5hbWUgd2l0aCBzcGFjZXMKK05vZGUta2luZDogZGlyCitOb2RlLWFjdGlvbjogYWRkCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMAorQ29udGVudC1sZW5ndGg6IDEwCisKK1BST1BTLUVORAorCisKK05vZGUtcGF0aDogZmlsZSBuYW1lIHdpdGggc3BhY2VzCitOb2RlLWtpbmQ6IGZpbGUKK05vZGUtYWN0aW9uOiBhZGQKK1Byb3AtY29udGVudC1sZW5ndGg6IDEwCitUZXh0LWNvbnRlbnQtbGVuZ3RoOiA3CitUZXh0LWNvbnRlbnQtbWQ1OiBjMWYxMGNmZDY0MDYxODQ4NGEyYTQ3NWMxMTQxMGZkMworQ29udGVudC1sZW5ndGg6IDE3CisKK1BST1BTLUVORAorc3BhY2VzCisKKworTm9kZS1wYXRoOiByZWd1bGFyX2Rpcl9uYW1lCitOb2RlLWtpbmQ6IGRpcgorTm9kZS1hY3Rpb246IGFkZAorUHJvcC1jb250ZW50LWxlbmd0aDogMTAKK0NvbnRlbnQtbGVuZ3RoOiAxMAorCitQUk9QUy1FTkQKZGlmZiAtLWdpdCBhL3QvdDkxMTYtZ2l0LXN2bi1sb2cuc2ggYi90L3Q5MTE2LWdpdC1zdm4tbG9nLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUxZThiZGYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q5MTE2LWdpdC1zdm4tbG9nLnNoCkBAIC0wLDAgKzEsMTI4IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3IEVyaWMgV29uZworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtc3ZuIGxvZyB0ZXN0cycKKy4gLi9saWItZ2l0LXN2bi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCByZXBvc2l0b3J5IGFuZCBpbXBvcnQnICIKKwlta2RpciBpbXBvcnQgJiYKKwljZCBpbXBvcnQgJiYKKwkJZm9yIGkgaW4gdHJ1bmsgYnJhbmNoZXMvYSBicmFuY2hlcy9iIFwKKwkJICAgICAgICAgdGFncy8wLjEgdGFncy8wLjIgdGFncy8wLjM7IGRvCisJCQlta2RpciAtcCBcJGkgJiYgXAorCQkJZWNobyBoZWxsbyA+PiBcJGkvUkVBRE1FIHx8IGV4aXQgMQorCQlkb25lICYmIFwKKwkJc3ZuIGltcG9ydCAtbSB0ZXN0IC4gJHN2bnJlcG8KKwkJY2QgLi4gJiYKKwlnaXQtc3ZuIGluaXQgJHN2bnJlcG8gLVQgdHJ1bmsgLWIgYnJhbmNoZXMgLXQgdGFncyAmJgorCWdpdC1zdm4gZmV0Y2ggJiYKKwlnaXQgcmVzZXQgLS1oYXJkIHRydW5rICYmCisJZWNobyBieWUgPj4gUkVBRE1FICYmCisJZ2l0IGNvbW1pdCAtYSAtbSBieWUgJiYKKwlnaXQgc3ZuIGRjb21taXQgJiYKKwlnaXQgcmVzZXQgLS1oYXJkIGEgJiYKKwllY2hvIHdoeSA+PiBGRUVETUUgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIEZFRURNRSAmJgorCWdpdCBjb21taXQgLW0gZmVlZG1lICYmCisJZ2l0IHN2biBkY29tbWl0ICYmCisJZ2l0IHJlc2V0IC0taGFyZCB0cnVuayAmJgorCWVjaG8gYXllID4+IFJFQURNRSAmJgorCWdpdCBjb21taXQgLWEgLW0gYXllICYmCisJZ2l0IHN2biBkY29tbWl0ICYmCisJZ2l0IHJlc2V0IC0taGFyZCBiICYmCisJZWNobyBzcHkgPj4gUkVBRE1FICYmCisJZ2l0IGNvbW1pdCAtYSAtbSBzcHkgJiYKKwllY2hvIHRyeSA+PiBSRUFETUUgJiYKKwlnaXQgY29tbWl0IC1hIC1tIHRyeSAmJgorCWdpdCBzdm4gZGNvbW1pdAorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncnVuIGxvZycgIgorCWdpdCByZXNldCAtLWhhcmQgYSAmJgorCWdpdCBzdm4gbG9nIC1yMiB0cnVuayB8IGdyZXAgXnIyICYmCisJZ2l0IHN2biBsb2cgLXI0IHRydW5rIHwgZ3JlcCBecjQgJiYKKwlnaXQgc3ZuIGxvZyAtcjMgfCBncmVwIF5yMworCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncnVuIGxvZyBhZ2FpbnN0IGEgZnJvbSB0cnVuaycgIgorCWdpdCByZXNldCAtLWhhcmQgdHJ1bmsgJiYKKwlnaXQgc3ZuIGxvZyAtcjMgYSB8IGdyZXAgXnIzCisJIgorCitwcmludGYgJ3IxIFxucjIgXG5yNCBcbicgPiBleHBlY3RlZC1yYW5nZS1yMS1yMi1yNAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0ZXN0IGFzY2VuZGluZyByZXZpc2lvbiByYW5nZScgIgorCWdpdCByZXNldCAtLWhhcmQgdHJ1bmsgJiYKKwlnaXQgc3ZuIGxvZyAtciAxOjQgfCBncmVwICdeclswLTldJyB8IGN1dCAtZCd8JyAtZjEgfCB0ZXN0X2NtcCBleHBlY3RlZC1yYW5nZS1yMS1yMi1yNCAtCisJIgorCitwcmludGYgJ3I0IFxucjIgXG5yMSBcbicgPiBleHBlY3RlZC1yYW5nZS1yNC1yMi1yMQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0ZXN0IGRlc2NlbmRpbmcgcmV2aXNpb24gcmFuZ2UnICIKKwlnaXQgcmVzZXQgLS1oYXJkIHRydW5rICYmCisJZ2l0IHN2biBsb2cgLXIgNDoxIHwgZ3JlcCAnXnJbMC05XScgfCBjdXQgLWQnfCcgLWYxIHwgdGVzdF9jbXAgZXhwZWN0ZWQtcmFuZ2UtcjQtcjItcjEgLQorCSIKKworcHJpbnRmICdyMSBcbnIyIFxuJyA+IGV4cGVjdGVkLXJhbmdlLXIxLXIyCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Rlc3QgYXNjZW5kaW5nIHJldmlzaW9uIHJhbmdlIHdpdGggdW5yZWFjaGFibGUgcmV2aXNpb24nICIKKwlnaXQgcmVzZXQgLS1oYXJkIHRydW5rICYmCisJZ2l0IHN2biBsb2cgLXIgMTozIHwgZ3JlcCAnXnJbMC05XScgfCBjdXQgLWQnfCcgLWYxIHwgdGVzdF9jbXAgZXhwZWN0ZWQtcmFuZ2UtcjEtcjIgLQorCSIKKworcHJpbnRmICdyMiBcbnIxIFxuJyA+IGV4cGVjdGVkLXJhbmdlLXIyLXIxCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Rlc3QgZGVzY2VuZGluZyByZXZpc2lvbiByYW5nZSB3aXRoIHVucmVhY2hhYmxlIHJldmlzaW9uJyAiCisJZ2l0IHJlc2V0IC0taGFyZCB0cnVuayAmJgorCWdpdCBzdm4gbG9nIC1yIDM6MSB8IGdyZXAgJ15yWzAtOV0nIHwgY3V0IC1kJ3wnIC1mMSB8IHRlc3RfY21wIGV4cGVjdGVkLXJhbmdlLXIyLXIxIC0KKwkiCisKK3ByaW50ZiAncjIgXG4nID4gZXhwZWN0ZWQtcmFuZ2UtcjIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGVzdCBhc2NlbmRpbmcgcmV2aXNpb24gcmFuZ2Ugd2l0aCB1bnJlYWNoYWJsZSB1cHBlciBib3VuZGFyeSByZXZpc2lvbiBhbmQgMSBjb21taXQnICIKKwlnaXQgcmVzZXQgLS1oYXJkIHRydW5rICYmCisJZ2l0IHN2biBsb2cgLXIgMjozIHwgZ3JlcCAnXnJbMC05XScgfCBjdXQgLWQnfCcgLWYxIHwgdGVzdF9jbXAgZXhwZWN0ZWQtcmFuZ2UtcjIgLQorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGVzdCBkZXNjZW5kaW5nIHJldmlzaW9uIHJhbmdlIHdpdGggdW5yZWFjaGFibGUgdXBwZXIgYm91bmRhcnkgcmV2aXNpb24gYW5kIDEgY29tbWl0JyAiCisJZ2l0IHJlc2V0IC0taGFyZCB0cnVuayAmJgorCWdpdCBzdm4gbG9nIC1yIDM6MiB8IGdyZXAgJ15yWzAtOV0nIHwgY3V0IC1kJ3wnIC1mMSB8IHRlc3RfY21wIGV4cGVjdGVkLXJhbmdlLXIyIC0KKwkiCisKK3ByaW50ZiAncjQgXG4nID4gZXhwZWN0ZWQtcmFuZ2UtcjQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGVzdCBhc2NlbmRpbmcgcmV2aXNpb24gcmFuZ2Ugd2l0aCB1bnJlYWNoYWJsZSBsb3dlciBib3VuZGFyeSByZXZpc2lvbiBhbmQgMSBjb21taXQnICIKKwlnaXQgcmVzZXQgLS1oYXJkIHRydW5rICYmCisJZ2l0IHN2biBsb2cgLXIgMzo0IHwgZ3JlcCAnXnJbMC05XScgfCBjdXQgLWQnfCcgLWYxIHwgdGVzdF9jbXAgZXhwZWN0ZWQtcmFuZ2UtcjQgLQorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGVzdCBkZXNjZW5kaW5nIHJldmlzaW9uIHJhbmdlIHdpdGggdW5yZWFjaGFibGUgbG93ZXIgYm91bmRhcnkgcmV2aXNpb24gYW5kIDEgY29tbWl0JyAiCisJZ2l0IHJlc2V0IC0taGFyZCB0cnVuayAmJgorCWdpdCBzdm4gbG9nIC1yIDQ6MyB8IGdyZXAgJ15yWzAtOV0nIHwgY3V0IC1kJ3wnIC1mMSB8IHRlc3RfY21wIGV4cGVjdGVkLXJhbmdlLXI0IC0KKwkiCisKK3ByaW50ZiAtLSAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4nID4gZXhwZWN0ZWQtc2VwYXJhdG9yCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Rlc3QgYXNjZW5kaW5nIHJldmlzaW9uIHJhbmdlIHdpdGggdW5yZWFjaGFibGUgYm91bmRhcnkgcmV2aXNpb25zIGFuZCBubyBjb21taXRzJyAiCisJZ2l0IHJlc2V0IC0taGFyZCB0cnVuayAmJgorCWdpdCBzdm4gbG9nIC1yIDU6NiB8IHRlc3RfY21wIGV4cGVjdGVkLXNlcGFyYXRvciAtCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0ZXN0IGRlc2NlbmRpbmcgcmV2aXNpb24gcmFuZ2Ugd2l0aCB1bnJlYWNoYWJsZSBib3VuZGFyeSByZXZpc2lvbnMgYW5kIG5vIGNvbW1pdHMnICIKKwlnaXQgcmVzZXQgLS1oYXJkIHRydW5rICYmCisJZ2l0IHN2biBsb2cgLXIgNjo1IHwgdGVzdF9jbXAgZXhwZWN0ZWQtc2VwYXJhdG9yIC0KKwkiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Rlc3QgYXNjZW5kaW5nIHJldmlzaW9uIHJhbmdlIHdpdGggdW5yZWFjaGFibGUgYm91bmRhcnkgcmV2aXNpb25zIGFuZCAxIGNvbW1pdCcgIgorCWdpdCByZXNldCAtLWhhcmQgdHJ1bmsgJiYKKwlnaXQgc3ZuIGxvZyAtciAzOjUgfCBncmVwICdeclswLTldJyB8IGN1dCAtZCd8JyAtZjEgfCB0ZXN0X2NtcCBleHBlY3RlZC1yYW5nZS1yNCAtCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0ZXN0IGRlc2NlbmRpbmcgcmV2aXNpb24gcmFuZ2Ugd2l0aCB1bnJlYWNoYWJsZSBib3VuZGFyeSByZXZpc2lvbnMgYW5kIDEgY29tbWl0JyAiCisJZ2l0IHJlc2V0IC0taGFyZCB0cnVuayAmJgorCWdpdCBzdm4gbG9nIC1yIDU6MyB8IGdyZXAgJ15yWzAtOV0nIHwgY3V0IC1kJ3wnIC1mMSB8IHRlc3RfY21wIGV4cGVjdGVkLXJhbmdlLXI0IC0KKwkiCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90OTExNy1naXQtc3ZuLWluaXQtY2xvbmUuc2ggYi90L3Q5MTE3LWdpdC1zdm4taW5pdC1jbG9uZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNDgyYjQwCi0tLSAvZGV2L251bGwKKysrIGIvdC90OTExNy1naXQtc3ZuLWluaXQtY2xvbmUuc2gKQEAgLTAsMCArMSw1NSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBFcmljIFdvbmcKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LXN2biBpbml0L2Nsb25lIHRlc3RzJworCisuIC4vbGliLWdpdC1zdm4uc2gKKworIyBzZXR1cCwgcnVuIGluc2lkZSB0bXAgc28gd2UgZG9uJ3QgaGF2ZSBhbnkgY29uZmxpY3RzIHdpdGggJHN2bnJlcG8KK3NldCAtZQorcm0gLXIgLmdpdAorbWtkaXIgdG1wCitjZCB0bXAKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgc3ZucmVwbycgIgorCW1rZGlyIHByb2plY3QgcHJvamVjdC90cnVuayBwcm9qZWN0L2JyYW5jaGVzIHByb2plY3QvdGFncyAmJgorCWVjaG8gZm9vID4gcHJvamVjdC90cnVuay9mb28gJiYKKwlzdm4gaW1wb3J0IC1tICckdGVzdF9kZXNjcmlwdGlvbicgcHJvamVjdCAkc3ZucmVwby9wcm9qZWN0ICYmCisJcm0gLXJmIHByb2plY3QKKwkiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Jhc2ljIGNsb25lJyAiCisJdGVzdCAhIC1kIHRydW5rICYmCisJZ2l0IHN2biBjbG9uZSAkc3ZucmVwby9wcm9qZWN0L3RydW5rICYmCisJdGVzdCAtZCB0cnVuay8uZ2l0L3N2biAmJgorCXRlc3QgLWUgdHJ1bmsvZm9vICYmCisJcm0gLXJmIHRydW5rCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjbG9uZSB0byB0YXJnZXQgZGlyZWN0b3J5JyAiCisJdGVzdCAhIC1kIHRhcmdldCAmJgorCWdpdCBzdm4gY2xvbmUgJHN2bnJlcG8vcHJvamVjdC90cnVuayB0YXJnZXQgJiYKKwl0ZXN0IC1kIHRhcmdldC8uZ2l0L3N2biAmJgorCXRlc3QgLWUgdGFyZ2V0L2ZvbyAmJgorCXJtIC1yZiB0YXJnZXQKKwkiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Nsb25lIHdpdGggLS1zdGRsYXlvdXQnICIKKwl0ZXN0ICEgLWQgcHJvamVjdCAmJgorCWdpdCBzdm4gY2xvbmUgLXMgJHN2bnJlcG8vcHJvamVjdCAmJgorCXRlc3QgLWQgcHJvamVjdC8uZ2l0L3N2biAmJgorCXRlc3QgLWUgcHJvamVjdC9mb28gJiYKKwlybSAtcmYgcHJvamVjdAorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2xvbmUgdG8gdGFyZ2V0IGRpcmVjdG9yeSB3aXRoIC0tc3RkbGF5b3V0JyAiCisJdGVzdCAhIC1kIHRhcmdldCAmJgorCWdpdCBzdm4gY2xvbmUgLXMgJHN2bnJlcG8vcHJvamVjdCB0YXJnZXQgJiYKKwl0ZXN0IC1kIHRhcmdldC8uZ2l0L3N2biAmJgorCXRlc3QgLWUgdGFyZ2V0L2ZvbyAmJgorCXJtIC1yZiB0YXJnZXQKKwkiCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90OTExOC1naXQtc3ZuLWZ1bmt5LWJyYW5jaC1uYW1lcy5zaCBiL3QvdDkxMTgtZ2l0LXN2bi1mdW5reS1icmFuY2gtbmFtZXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjQwYmIwNgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDkxMTgtZ2l0LXN2bi1mdW5reS1icmFuY2gtbmFtZXMuc2gKQEAgLTAsMCArMSw0MCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBFcmljIFdvbmcKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LXN2biBmdW5reSBicmFuY2ggbmFtZXMnCisuIC4vbGliLWdpdC1zdm4uc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgc3ZucmVwbycgIgorCW1rZGlyIHByb2plY3QgcHJvamVjdC90cnVuayBwcm9qZWN0L2JyYW5jaGVzIHByb2plY3QvdGFncyAmJgorCWVjaG8gZm9vID4gcHJvamVjdC90cnVuay9mb28gJiYKKwlzdm4gaW1wb3J0IC1tICckdGVzdF9kZXNjcmlwdGlvbicgcHJvamVjdCBcIiRzdm5yZXBvL3ByIGplY3RcIiAmJgorCXJtIC1yZiBwcm9qZWN0ICYmCisJc3ZuIGNwIC1tICdmdW4nIFwiJHN2bnJlcG8vcHIgamVjdC90cnVua1wiIFwKKwkgICAgICAgICAgICAgICAgXCIkc3ZucmVwby9wciBqZWN0L2JyYW5jaGVzL2Z1biBwbHVnaW5cIiAmJgorCXN2biBjcCAtbSAnbW9yZSBmdW4hJyBcIiRzdm5yZXBvL3ByIGplY3QvYnJhbmNoZXMvZnVuIHBsdWdpblwiIFwKKwkgICAgICAgICAgICAgICAgICAgICAgXCIkc3ZucmVwby9wciBqZWN0L2JyYW5jaGVzL21vcmUgZnVuIHBsdWdpbiFcIiAmJgorCXN0YXJ0X2h0dHBkCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0ZXN0IGNsb25lIHdpdGggZnVua3kgYnJhbmNoIG5hbWVzJyAiCisJZ2l0IHN2biBjbG9uZSAtcyBcIiRzdm5yZXBvL3ByIGplY3RcIiBwcm9qZWN0ICYmCisJY2QgcHJvamVjdCAmJgorCQlnaXQgcmV2LXBhcnNlICdyZWZzL3JlbW90ZXMvZnVuJTIwcGx1Z2luJyAmJgorCQlnaXQgcmV2LXBhcnNlICdyZWZzL3JlbW90ZXMvbW9yZSUyMGZ1biUyMHBsdWdpbiEnICYmCisJY2QgLi4KKwkiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Rlc3QgZGNvbW1pdCB0byBmdW5reSBicmFuY2gnICIKKwljZCBwcm9qZWN0ICYmCisJZ2l0IHJlc2V0IC0taGFyZCAncmVmcy9yZW1vdGVzL21vcmUlMjBmdW4lMjBwbHVnaW4hJyAmJgorCWVjaG8gaGVsbG8gPj4gZm9vICYmCisJZ2l0IGNvbW1pdCAtbSAnaGVsbG8nIC0tIGZvbyAmJgorCWdpdCBzdm4gZGNvbW1pdCAmJgorCWNkIC4uCisJIgorCitzdG9wX2h0dHBkCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90OTExOS1naXQtc3ZuLWluZm8uc2ggYi90L3Q5MTE5LWdpdC1zdm4taW5mby5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYzYxOTExCi0tLSAvZGV2L251bGwKKysrIGIvdC90OTExOS1naXQtc3ZuLWluZm8uc2gKQEAgLTAsMCArMSwzNzAgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDcgRGF2aWQgRC4gS2lsemVyCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1zdm4gaW5mbycKKworLiAuL2xpYi1naXQtc3ZuLnNoCitzYXkgJ3NraXBwaW5nIHN2bi1pbmZvIHRlc3QgKGhhcyBhIHJhY2UgdW5kaWFnbm9zZWQgeWV0KScKK3Rlc3RfZG9uZQorCitwdG91Y2goKSB7CisJcGVybCAtdyAtZSAnCisJCXVzZSBzdHJpY3Q7CisJCWRpZSAicHRvdWNoIHJlcXVpcmVzIGV4YWN0bHkgMiBhcmd1bWVudHMiIGlmIEBBUkdWICE9IDI7CisJCWRpZSAiJEFSR1ZbMF0gZG9lcyBub3QgZXhpc3QiIGlmICEgLWUgJEFSR1ZbMF07CisJCW15IEBzID0gc3RhdCAkQVJHVlswXTsKKwkJdXRpbWUgJHNbOF0sICRzWzldLCAkQVJHVlsxXTsKKwknICIkMSIgIiQyIgorfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCByZXBvc2l0b3J5IGFuZCBpbXBvcnQnICIKKwlta2RpciBpbmZvICYmCisJY2QgaW5mbyAmJgorCQllY2hvIEZJUlNUID4gQSAmJgorCQllY2hvIG9uZSA+IGZpbGUgJiYKKwkJbG4gLXMgZmlsZSBzeW1saW5rLWZpbGUgJiYKKwkJbWtkaXIgZGlyZWN0b3J5ICYmCisJCXRvdWNoIGRpcmVjdG9yeS8ucGxhY2Vob2xkZXIgJiYKKwkJbG4gLXMgZGlyZWN0b3J5IHN5bWxpbmstZGlyZWN0b3J5ICYmCisJCXN2biBpbXBvcnQgLW0gJ2luaXRpYWwnIC4gJHN2bnJlcG8gJiYKKwljZCAuLiAmJgorCW1rZGlyIGdpdHdjICYmCisJY2QgZ2l0d2MgJiYKKwkJZ2l0LXN2biBpbml0ICRzdm5yZXBvICYmCisJCWdpdC1zdm4gZmV0Y2ggJiYKKwljZCAuLiAmJgorCXN2biBjbyAkc3ZucmVwbyBzdm53YyAmJgorCXB0b3VjaCBzdm53Yy9maWxlIGdpdHdjL2ZpbGUgJiYKKwlwdG91Y2ggc3Zud2MvZGlyZWN0b3J5IGdpdHdjL2RpcmVjdG9yeSAmJgorCXB0b3VjaCBzdm53Yy9zeW1saW5rLWZpbGUgZ2l0d2Mvc3ltbGluay1maWxlICYmCisJcHRvdWNoIHN2bndjL3N5bWxpbmstZGlyZWN0b3J5IGdpdHdjL3N5bWxpbmstZGlyZWN0b3J5CisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbmZvJyAiCisJKGNkIHN2bndjOyBzdm4gaW5mbykgPiBleHBlY3RlZC5pbmZvICYmCisJKGNkIGdpdHdjOyBnaXQtc3ZuIGluZm8pID4gYWN0dWFsLmluZm8gJiYKKwlnaXQtZGlmZiBleHBlY3RlZC5pbmZvIGFjdHVhbC5pbmZvCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbmZvIC0tdXJsJyAnCisJdGVzdCAkKGNkIGdpdHdjOyBnaXQtc3ZuIGluZm8gLS11cmwpID0gJHN2bnJlcG8KKwknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2luZm8gLicgIgorCShjZCBzdm53Yzsgc3ZuIGluZm8gLikgPiBleHBlY3RlZC5pbmZvLWRvdCAmJgorCShjZCBnaXR3YzsgZ2l0LXN2biBpbmZvIC4pID4gYWN0dWFsLmluZm8tZG90ICYmCisJZ2l0LWRpZmYgZXhwZWN0ZWQuaW5mby1kb3QgYWN0dWFsLmluZm8tZG90CisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbmZvIC0tdXJsIC4nICcKKwl0ZXN0ICQoY2QgZ2l0d2M7IGdpdC1zdm4gaW5mbyAtLXVybCAuKSA9ICRzdm5yZXBvCisJJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbmZvIGZpbGUnICIKKwkoY2Qgc3Zud2M7IHN2biBpbmZvIGZpbGUpID4gZXhwZWN0ZWQuaW5mby1maWxlICYmCisJKGNkIGdpdHdjOyBnaXQtc3ZuIGluZm8gZmlsZSkgPiBhY3R1YWwuaW5mby1maWxlICYmCisJZ2l0LWRpZmYgZXhwZWN0ZWQuaW5mby1maWxlIGFjdHVhbC5pbmZvLWZpbGUKKwkiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2luZm8gLS11cmwgZmlsZScgJworCXRlc3QgJChjZCBnaXR3YzsgZ2l0LXN2biBpbmZvIC0tdXJsIGZpbGUpID0gIiRzdm5yZXBvL2ZpbGUiCisJJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbmZvIGRpcmVjdG9yeScgIgorCShjZCBzdm53Yzsgc3ZuIGluZm8gZGlyZWN0b3J5KSA+IGV4cGVjdGVkLmluZm8tZGlyZWN0b3J5ICYmCisJKGNkIGdpdHdjOyBnaXQtc3ZuIGluZm8gZGlyZWN0b3J5KSA+IGFjdHVhbC5pbmZvLWRpcmVjdG9yeSAmJgorCWdpdC1kaWZmIGV4cGVjdGVkLmluZm8tZGlyZWN0b3J5IGFjdHVhbC5pbmZvLWRpcmVjdG9yeQorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5mbyAtLXVybCBkaXJlY3RvcnknICcKKwl0ZXN0ICQoY2QgZ2l0d2M7IGdpdC1zdm4gaW5mbyAtLXVybCBkaXJlY3RvcnkpID0gIiRzdm5yZXBvL2RpcmVjdG9yeSIKKwknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2luZm8gc3ltbGluay1maWxlJyAiCisJKGNkIHN2bndjOyBzdm4gaW5mbyBzeW1saW5rLWZpbGUpID4gZXhwZWN0ZWQuaW5mby1zeW1saW5rLWZpbGUgJiYKKwkoY2QgZ2l0d2M7IGdpdC1zdm4gaW5mbyBzeW1saW5rLWZpbGUpID4gYWN0dWFsLmluZm8tc3ltbGluay1maWxlICYmCisJZ2l0LWRpZmYgZXhwZWN0ZWQuaW5mby1zeW1saW5rLWZpbGUgYWN0dWFsLmluZm8tc3ltbGluay1maWxlCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbmZvIC0tdXJsIHN5bWxpbmstZmlsZScgJworCXRlc3QgJChjZCBnaXR3YzsgZ2l0LXN2biBpbmZvIC0tdXJsIHN5bWxpbmstZmlsZSkgXAorCSAgICAgPSAiJHN2bnJlcG8vc3ltbGluay1maWxlIgorCScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5mbyBzeW1saW5rLWRpcmVjdG9yeScgIgorCShjZCBzdm53Yzsgc3ZuIGluZm8gc3ltbGluay1kaXJlY3RvcnkpIFwKKwkJPiBleHBlY3RlZC5pbmZvLXN5bWxpbmstZGlyZWN0b3J5ICYmCisJKGNkIGdpdHdjOyBnaXQtc3ZuIGluZm8gc3ltbGluay1kaXJlY3RvcnkpIFwKKwkJPiBhY3R1YWwuaW5mby1zeW1saW5rLWRpcmVjdG9yeSAmJgorCWdpdC1kaWZmIGV4cGVjdGVkLmluZm8tc3ltbGluay1kaXJlY3RvcnkgYWN0dWFsLmluZm8tc3ltbGluay1kaXJlY3RvcnkKKwkiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2luZm8gLS11cmwgc3ltbGluay1kaXJlY3RvcnknICcKKwl0ZXN0ICQoY2QgZ2l0d2M7IGdpdC1zdm4gaW5mbyAtLXVybCBzeW1saW5rLWRpcmVjdG9yeSkgXAorCSAgICAgPSAiJHN2bnJlcG8vc3ltbGluay1kaXJlY3RvcnkiCisJJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbmZvIGFkZGVkLWZpbGUnICIKKwllY2hvIHR3byA+IGdpdHdjL2FkZGVkLWZpbGUgJiYKKwljZCBnaXR3YyAmJgorCQlnaXQgYWRkIGFkZGVkLWZpbGUgJiYKKwljZCAuLiAmJgorCWNwIGdpdHdjL2FkZGVkLWZpbGUgc3Zud2MvYWRkZWQtZmlsZSAmJgorCXB0b3VjaCBnaXR3Yy9hZGRlZC1maWxlIHN2bndjL2FkZGVkLWZpbGUgJiYKKwljZCBzdm53YyAmJgorCQlzdm4gYWRkIGFkZGVkLWZpbGUgPiAvZGV2L251bGwgJiYKKwljZCAuLiAmJgorCShjZCBzdm53Yzsgc3ZuIGluZm8gYWRkZWQtZmlsZSkgPiBleHBlY3RlZC5pbmZvLWFkZGVkLWZpbGUgJiYKKwkoY2QgZ2l0d2M7IGdpdC1zdm4gaW5mbyBhZGRlZC1maWxlKSA+IGFjdHVhbC5pbmZvLWFkZGVkLWZpbGUgJiYKKwlnaXQtZGlmZiBleHBlY3RlZC5pbmZvLWFkZGVkLWZpbGUgYWN0dWFsLmluZm8tYWRkZWQtZmlsZQorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5mbyAtLXVybCBhZGRlZC1maWxlJyAnCisJdGVzdCAkKGNkIGdpdHdjOyBnaXQtc3ZuIGluZm8gLS11cmwgYWRkZWQtZmlsZSkgXAorCSAgICAgPSAiJHN2bnJlcG8vYWRkZWQtZmlsZSIKKwknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2luZm8gYWRkZWQtZGlyZWN0b3J5JyAiCisJbWtkaXIgZ2l0d2MvYWRkZWQtZGlyZWN0b3J5IHN2bndjL2FkZGVkLWRpcmVjdG9yeSAmJgorCXB0b3VjaCBnaXR3Yy9hZGRlZC1kaXJlY3Rvcnkgc3Zud2MvYWRkZWQtZGlyZWN0b3J5ICYmCisJdG91Y2ggZ2l0d2MvYWRkZWQtZGlyZWN0b3J5Ly5wbGFjZWhvbGRlciAmJgorCWNkIHN2bndjICYmCisJCXN2biBhZGQgYWRkZWQtZGlyZWN0b3J5ID4gL2Rldi9udWxsICYmCisJY2QgLi4gJiYKKwljZCBnaXR3YyAmJgorCQlnaXQgYWRkIGFkZGVkLWRpcmVjdG9yeSAmJgorCWNkIC4uICYmCisJKGNkIHN2bndjOyBzdm4gaW5mbyBhZGRlZC1kaXJlY3RvcnkpIFwKKwkJPiBleHBlY3RlZC5pbmZvLWFkZGVkLWRpcmVjdG9yeSAmJgorCShjZCBnaXR3YzsgZ2l0LXN2biBpbmZvIGFkZGVkLWRpcmVjdG9yeSkgXAorCQk+IGFjdHVhbC5pbmZvLWFkZGVkLWRpcmVjdG9yeSAmJgorCWdpdC1kaWZmIGV4cGVjdGVkLmluZm8tYWRkZWQtZGlyZWN0b3J5IGFjdHVhbC5pbmZvLWFkZGVkLWRpcmVjdG9yeQorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5mbyAtLXVybCBhZGRlZC1kaXJlY3RvcnknICcKKwl0ZXN0ICQoY2QgZ2l0d2M7IGdpdC1zdm4gaW5mbyAtLXVybCBhZGRlZC1kaXJlY3RvcnkpIFwKKwkgICAgID0gIiRzdm5yZXBvL2FkZGVkLWRpcmVjdG9yeSIKKwknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2luZm8gYWRkZWQtc3ltbGluay1maWxlJyAiCisJY2QgZ2l0d2MgJiYKKwkJbG4gLXMgYWRkZWQtZmlsZSBhZGRlZC1zeW1saW5rLWZpbGUgJiYKKwkJZ2l0IGFkZCBhZGRlZC1zeW1saW5rLWZpbGUgJiYKKwljZCAuLiAmJgorCWNkIHN2bndjICYmCisJCWxuIC1zIGFkZGVkLWZpbGUgYWRkZWQtc3ltbGluay1maWxlICYmCisJCXN2biBhZGQgYWRkZWQtc3ltbGluay1maWxlID4gL2Rldi9udWxsICYmCisJY2QgLi4gJiYKKwlwdG91Y2ggZ2l0d2MvYWRkZWQtc3ltbGluay1maWxlIHN2bndjL2FkZGVkLXN5bWxpbmstZmlsZSAmJgorCShjZCBzdm53Yzsgc3ZuIGluZm8gYWRkZWQtc3ltbGluay1maWxlKSBcCisJCT4gZXhwZWN0ZWQuaW5mby1hZGRlZC1zeW1saW5rLWZpbGUgJiYKKwkoY2QgZ2l0d2M7IGdpdC1zdm4gaW5mbyBhZGRlZC1zeW1saW5rLWZpbGUpIFwKKwkJPiBhY3R1YWwuaW5mby1hZGRlZC1zeW1saW5rLWZpbGUgJiYKKwlnaXQtZGlmZiBleHBlY3RlZC5pbmZvLWFkZGVkLXN5bWxpbmstZmlsZSBcCisJCSBhY3R1YWwuaW5mby1hZGRlZC1zeW1saW5rLWZpbGUKKwkiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2luZm8gLS11cmwgYWRkZWQtc3ltbGluay1maWxlJyAnCisJdGVzdCAkKGNkIGdpdHdjOyBnaXQtc3ZuIGluZm8gLS11cmwgYWRkZWQtc3ltbGluay1maWxlKSBcCisJICAgICA9ICIkc3ZucmVwby9hZGRlZC1zeW1saW5rLWZpbGUiCisJJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbmZvIGFkZGVkLXN5bWxpbmstZGlyZWN0b3J5JyAiCisJY2QgZ2l0d2MgJiYKKwkJbG4gLXMgYWRkZWQtZGlyZWN0b3J5IGFkZGVkLXN5bWxpbmstZGlyZWN0b3J5ICYmCisJCWdpdCBhZGQgYWRkZWQtc3ltbGluay1kaXJlY3RvcnkgJiYKKwljZCAuLiAmJgorCWNkIHN2bndjICYmCisJCWxuIC1zIGFkZGVkLWRpcmVjdG9yeSBhZGRlZC1zeW1saW5rLWRpcmVjdG9yeSAmJgorCQlzdm4gYWRkIGFkZGVkLXN5bWxpbmstZGlyZWN0b3J5ID4gL2Rldi9udWxsICYmCisJY2QgLi4gJiYKKwlwdG91Y2ggZ2l0d2MvYWRkZWQtc3ltbGluay1kaXJlY3Rvcnkgc3Zud2MvYWRkZWQtc3ltbGluay1kaXJlY3RvcnkgJiYKKwkoY2Qgc3Zud2M7IHN2biBpbmZvIGFkZGVkLXN5bWxpbmstZGlyZWN0b3J5KSBcCisJCT4gZXhwZWN0ZWQuaW5mby1hZGRlZC1zeW1saW5rLWRpcmVjdG9yeSAmJgorCShjZCBnaXR3YzsgZ2l0LXN2biBpbmZvIGFkZGVkLXN5bWxpbmstZGlyZWN0b3J5KSBcCisJCT4gYWN0dWFsLmluZm8tYWRkZWQtc3ltbGluay1kaXJlY3RvcnkgJiYKKwlnaXQtZGlmZiBleHBlY3RlZC5pbmZvLWFkZGVkLXN5bWxpbmstZGlyZWN0b3J5IFwKKwkJIGFjdHVhbC5pbmZvLWFkZGVkLXN5bWxpbmstZGlyZWN0b3J5CisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbmZvIC0tdXJsIGFkZGVkLXN5bWxpbmstZGlyZWN0b3J5JyAnCisJdGVzdCAkKGNkIGdpdHdjOyBnaXQtc3ZuIGluZm8gLS11cmwgYWRkZWQtc3ltbGluay1kaXJlY3RvcnkpIFwKKwkgICAgID0gIiRzdm5yZXBvL2FkZGVkLXN5bWxpbmstZGlyZWN0b3J5IgorCScKKworIyBUaGUgbmV4dCBmZXcgdGVzdHMgcmVwbGFjZSB0aGUgIlRleHQgTGFzdCBVcGRhdGVkIiB2YWx1ZSB3aXRoIGEKKyMgcGxhY2Vob2xkZXIgc2luY2UgZ2l0IGRvZXNuJ3QgaGF2ZSBhIHdheSB0byBrbm93IHRoZSBkYXRlIHRoYXQgYQorIyBub3ctZGVsZXRlZCBmaWxlIHdhcyBsYXN0IGNoZWNrZWQgb3V0IGxvY2FsbHkuICBJbnRlcm5hbGx5IGl0CisjIHNpbXBseSByZXVzZXMgdGhlIExhc3QgQ2hhbmdlZCBEYXRlLgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbmZvIGRlbGV0ZWQtZmlsZScgIgorCWNkIGdpdHdjICYmCisJCWdpdCBybSAtZiBmaWxlID4gL2Rldi9udWxsICYmCisJY2QgLi4gJiYKKwljZCBzdm53YyAmJgorCQlzdm4gcm0gLS1mb3JjZSBmaWxlID4gL2Rldi9udWxsICYmCisJY2QgLi4gJiYKKwkoY2Qgc3Zud2M7IHN2biBpbmZvIGZpbGUpIHwKKwlzZWQgLWUgJ3MvXlwoVGV4dCBMYXN0IFVwZGF0ZWQ6XCkuKi9cMSBURVhULUxBU1QtVVBEQVRFRC1TVFJJTkcvJyBcCisJCT4gZXhwZWN0ZWQuaW5mby1kZWxldGVkLWZpbGUgJiYKKwkoY2QgZ2l0d2M7IGdpdC1zdm4gaW5mbyBmaWxlKSB8CisJc2VkIC1lICdzL15cKFRleHQgTGFzdCBVcGRhdGVkOlwpLiovXDEgVEVYVC1MQVNULVVQREFURUQtU1RSSU5HLycgXAorCQk+IGFjdHVhbC5pbmZvLWRlbGV0ZWQtZmlsZSAmJgorCWdpdC1kaWZmIGV4cGVjdGVkLmluZm8tZGVsZXRlZC1maWxlIGFjdHVhbC5pbmZvLWRlbGV0ZWQtZmlsZQorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5mbyAtLXVybCBmaWxlIChkZWxldGVkKScgJworCXRlc3QgJChjZCBnaXR3YzsgZ2l0LXN2biBpbmZvIC0tdXJsIGZpbGUpIFwKKwkgICAgID0gIiRzdm5yZXBvL2ZpbGUiCisJJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbmZvIGRlbGV0ZWQtZGlyZWN0b3J5JyAiCisJY2QgZ2l0d2MgJiYKKwkJZ2l0IHJtIC1yIC1mIGRpcmVjdG9yeSA+IC9kZXYvbnVsbCAmJgorCWNkIC4uICYmCisJY2Qgc3Zud2MgJiYKKwkJc3ZuIHJtIC0tZm9yY2UgZGlyZWN0b3J5ID4gL2Rldi9udWxsICYmCisJY2QgLi4gJiYKKwkoY2Qgc3Zud2M7IHN2biBpbmZvIGRpcmVjdG9yeSkgfAorCXNlZCAtZSAncy9eXChUZXh0IExhc3QgVXBkYXRlZDpcKS4qL1wxIFRFWFQtTEFTVC1VUERBVEVELVNUUklORy8nIFwKKwkJPiBleHBlY3RlZC5pbmZvLWRlbGV0ZWQtZGlyZWN0b3J5ICYmCisJKGNkIGdpdHdjOyBnaXQtc3ZuIGluZm8gZGlyZWN0b3J5KSB8CisJc2VkIC1lICdzL15cKFRleHQgTGFzdCBVcGRhdGVkOlwpLiovXDEgVEVYVC1MQVNULVVQREFURUQtU1RSSU5HLycgXAorCQk+IGFjdHVhbC5pbmZvLWRlbGV0ZWQtZGlyZWN0b3J5ICYmCisJZ2l0LWRpZmYgZXhwZWN0ZWQuaW5mby1kZWxldGVkLWRpcmVjdG9yeSBhY3R1YWwuaW5mby1kZWxldGVkLWRpcmVjdG9yeQorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5mbyAtLXVybCBkaXJlY3RvcnkgKGRlbGV0ZWQpJyAnCisJdGVzdCAkKGNkIGdpdHdjOyBnaXQtc3ZuIGluZm8gLS11cmwgZGlyZWN0b3J5KSBcCisJICAgICA9ICIkc3ZucmVwby9kaXJlY3RvcnkiCisJJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbmZvIGRlbGV0ZWQtc3ltbGluay1maWxlJyAiCisJY2QgZ2l0d2MgJiYKKwkJZ2l0IHJtIC1mIHN5bWxpbmstZmlsZSA+IC9kZXYvbnVsbCAmJgorCWNkIC4uICYmCisJY2Qgc3Zud2MgJiYKKwkJc3ZuIHJtIC0tZm9yY2Ugc3ltbGluay1maWxlID4gL2Rldi9udWxsICYmCisJY2QgLi4gJiYKKwkoY2Qgc3Zud2M7IHN2biBpbmZvIHN5bWxpbmstZmlsZSkgfAorCXNlZCAtZSAncy9eXChUZXh0IExhc3QgVXBkYXRlZDpcKS4qL1wxIFRFWFQtTEFTVC1VUERBVEVELVNUUklORy8nIFwKKwkJPiBleHBlY3RlZC5pbmZvLWRlbGV0ZWQtc3ltbGluay1maWxlICYmCisJKGNkIGdpdHdjOyBnaXQtc3ZuIGluZm8gc3ltbGluay1maWxlKSB8CisJc2VkIC1lICdzL15cKFRleHQgTGFzdCBVcGRhdGVkOlwpLiovXDEgVEVYVC1MQVNULVVQREFURUQtU1RSSU5HLycgXAorCQk+IGFjdHVhbC5pbmZvLWRlbGV0ZWQtc3ltbGluay1maWxlICYmCisJZ2l0LWRpZmYgZXhwZWN0ZWQuaW5mby1kZWxldGVkLXN5bWxpbmstZmlsZSBcCisJCSBhY3R1YWwuaW5mby1kZWxldGVkLXN5bWxpbmstZmlsZQorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5mbyAtLXVybCBzeW1saW5rLWZpbGUgKGRlbGV0ZWQpJyAnCisJdGVzdCAkKGNkIGdpdHdjOyBnaXQtc3ZuIGluZm8gLS11cmwgc3ltbGluay1maWxlKSBcCisJICAgICA9ICIkc3ZucmVwby9zeW1saW5rLWZpbGUiCisJJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbmZvIGRlbGV0ZWQtc3ltbGluay1kaXJlY3RvcnknICIKKwljZCBnaXR3YyAmJgorCQlnaXQgcm0gLWYgc3ltbGluay1kaXJlY3RvcnkgPiAvZGV2L251bGwgJiYKKwljZCAuLiAmJgorCWNkIHN2bndjICYmCisJCXN2biBybSAtLWZvcmNlIHN5bWxpbmstZGlyZWN0b3J5ID4gL2Rldi9udWxsICYmCisJY2QgLi4gJiYKKwkoY2Qgc3Zud2M7IHN2biBpbmZvIHN5bWxpbmstZGlyZWN0b3J5KSB8CisJc2VkIC1lICdzL15cKFRleHQgTGFzdCBVcGRhdGVkOlwpLiovXDEgVEVYVC1MQVNULVVQREFURUQtU1RSSU5HLycgXAorCQkgPiBleHBlY3RlZC5pbmZvLWRlbGV0ZWQtc3ltbGluay1kaXJlY3RvcnkgJiYKKwkoY2QgZ2l0d2M7IGdpdC1zdm4gaW5mbyBzeW1saW5rLWRpcmVjdG9yeSkgfAorCXNlZCAtZSAncy9eXChUZXh0IExhc3QgVXBkYXRlZDpcKS4qL1wxIFRFWFQtTEFTVC1VUERBVEVELVNUUklORy8nIFwKKwkJID4gYWN0dWFsLmluZm8tZGVsZXRlZC1zeW1saW5rLWRpcmVjdG9yeSAmJgorCWdpdC1kaWZmIGV4cGVjdGVkLmluZm8tZGVsZXRlZC1zeW1saW5rLWRpcmVjdG9yeSBcCisJCSBhY3R1YWwuaW5mby1kZWxldGVkLXN5bWxpbmstZGlyZWN0b3J5CisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbmZvIC0tdXJsIHN5bWxpbmstZGlyZWN0b3J5IChkZWxldGVkKScgJworCXRlc3QgJChjZCBnaXR3YzsgZ2l0LXN2biBpbmZvIC0tdXJsIHN5bWxpbmstZGlyZWN0b3J5KSBcCisJICAgICA9ICIkc3ZucmVwby9zeW1saW5rLWRpcmVjdG9yeSIKKwknCisKKyMgTk9URTogZ2l0IGRvZXMgbm90IGhhdmUgdGhlIGNvbmNlcHQgb2YgcmVwbGFjZWQgb2JqZWN0cywKKyMgc28gd2UgY2FuJ3QgdGVzdCBmb3IgZmlsZXMgaW4gdGhhdCBzdGF0ZS4KKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5mbyB1bmtub3duLWZpbGUnICIKKwllY2hvIHR3byA+IGdpdHdjL3Vua25vd24tZmlsZSAmJgorCWNwIGdpdHdjL3Vua25vd24tZmlsZSBzdm53Yy91bmtub3duLWZpbGUgJiYKKwlwdG91Y2ggZ2l0d2MvdW5rbm93bi1maWxlIHN2bndjL3Vua25vd24tZmlsZSAmJgorCShjZCBzdm53Yzsgc3ZuIGluZm8gdW5rbm93bi1maWxlKSAyPiBleHBlY3RlZC5pbmZvLXVua25vd24tZmlsZSAmJgorCShjZCBnaXR3YzsgZ2l0LXN2biBpbmZvIHVua25vd24tZmlsZSkgMj4gYWN0dWFsLmluZm8tdW5rbm93bi1maWxlICYmCisJZ2l0LWRpZmYgZXhwZWN0ZWQuaW5mby11bmtub3duLWZpbGUgYWN0dWFsLmluZm8tdW5rbm93bi1maWxlCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbmZvIC0tdXJsIHVua25vd24tZmlsZScgJworCXRlc3QgLXogJChjZCBnaXR3YzsgZ2l0LXN2biBpbmZvIC0tdXJsIHVua25vd24tZmlsZSBcCisJCQkyPiAuLi9hY3R1YWwuaW5mby0tdXJsLXVua25vd24tZmlsZSkgJiYKKwlnaXQtZGlmZiBleHBlY3RlZC5pbmZvLXVua25vd24tZmlsZSBhY3R1YWwuaW5mby0tdXJsLXVua25vd24tZmlsZQorCScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5mbyB1bmtub3duLWRpcmVjdG9yeScgIgorCW1rZGlyIGdpdHdjL3Vua25vd24tZGlyZWN0b3J5IHN2bndjL3Vua25vd24tZGlyZWN0b3J5ICYmCisJcHRvdWNoIGdpdHdjL3Vua25vd24tZGlyZWN0b3J5IHN2bndjL3Vua25vd24tZGlyZWN0b3J5ICYmCisJdG91Y2ggZ2l0d2MvdW5rbm93bi1kaXJlY3RvcnkvLnBsYWNlaG9sZGVyICYmCisJKGNkIHN2bndjOyBzdm4gaW5mbyB1bmtub3duLWRpcmVjdG9yeSkgXAorCQkyPiBleHBlY3RlZC5pbmZvLXVua25vd24tZGlyZWN0b3J5ICYmCisJKGNkIGdpdHdjOyBnaXQtc3ZuIGluZm8gdW5rbm93bi1kaXJlY3RvcnkpIFwKKwkJMj4gYWN0dWFsLmluZm8tdW5rbm93bi1kaXJlY3RvcnkgJiYKKwlnaXQtZGlmZiBleHBlY3RlZC5pbmZvLXVua25vd24tZGlyZWN0b3J5IGFjdHVhbC5pbmZvLXVua25vd24tZGlyZWN0b3J5CisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbmZvIC0tdXJsIHVua25vd24tZGlyZWN0b3J5JyAnCisJdGVzdCAteiAkKGNkIGdpdHdjOyBnaXQtc3ZuIGluZm8gLS11cmwgdW5rbm93bi1kaXJlY3RvcnkgXAorCQkJMj4gLi4vYWN0dWFsLmluZm8tLXVybC11bmtub3duLWRpcmVjdG9yeSkgJiYKKwlnaXQtZGlmZiBleHBlY3RlZC5pbmZvLXVua25vd24tZGlyZWN0b3J5IFwKKwkJIGFjdHVhbC5pbmZvLS11cmwtdW5rbm93bi1kaXJlY3RvcnkKKwknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2luZm8gdW5rbm93bi1zeW1saW5rLWZpbGUnICIKKwljZCBnaXR3YyAmJgorCQlsbiAtcyB1bmtub3duLWZpbGUgdW5rbm93bi1zeW1saW5rLWZpbGUgJiYKKwljZCAuLiAmJgorCWNkIHN2bndjICYmCisJCWxuIC1zIHVua25vd24tZmlsZSB1bmtub3duLXN5bWxpbmstZmlsZSAmJgorCWNkIC4uICYmCisJcHRvdWNoIGdpdHdjL3Vua25vd24tc3ltbGluay1maWxlIHN2bndjL3Vua25vd24tc3ltbGluay1maWxlICYmCisJKGNkIHN2bndjOyBzdm4gaW5mbyB1bmtub3duLXN5bWxpbmstZmlsZSkgXAorCQkyPiBleHBlY3RlZC5pbmZvLXVua25vd24tc3ltbGluay1maWxlICYmCisJKGNkIGdpdHdjOyBnaXQtc3ZuIGluZm8gdW5rbm93bi1zeW1saW5rLWZpbGUpIFwKKwkJMj4gYWN0dWFsLmluZm8tdW5rbm93bi1zeW1saW5rLWZpbGUgJiYKKwlnaXQtZGlmZiBleHBlY3RlZC5pbmZvLXVua25vd24tc3ltbGluay1maWxlIFwKKwkJIGFjdHVhbC5pbmZvLXVua25vd24tc3ltbGluay1maWxlCisJIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbmZvIC0tdXJsIHVua25vd24tc3ltbGluay1maWxlJyAnCisJdGVzdCAteiAkKGNkIGdpdHdjOyBnaXQtc3ZuIGluZm8gLS11cmwgdW5rbm93bi1zeW1saW5rLWZpbGUgXAorCQkJMj4gLi4vYWN0dWFsLmluZm8tLXVybC11bmtub3duLXN5bWxpbmstZmlsZSkgJiYKKwlnaXQtZGlmZiBleHBlY3RlZC5pbmZvLXVua25vd24tc3ltbGluay1maWxlIFwKKwkJIGFjdHVhbC5pbmZvLS11cmwtdW5rbm93bi1zeW1saW5rLWZpbGUKKwknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2luZm8gdW5rbm93bi1zeW1saW5rLWRpcmVjdG9yeScgIgorCWNkIGdpdHdjICYmCisJCWxuIC1zIHVua25vd24tZGlyZWN0b3J5IHVua25vd24tc3ltbGluay1kaXJlY3RvcnkgJiYKKwljZCAuLiAmJgorCWNkIHN2bndjICYmCisJCWxuIC1zIHVua25vd24tZGlyZWN0b3J5IHVua25vd24tc3ltbGluay1kaXJlY3RvcnkgJiYKKwljZCAuLiAmJgorCXB0b3VjaCBnaXR3Yy91bmtub3duLXN5bWxpbmstZGlyZWN0b3J5IFwKKwkgICAgICAgc3Zud2MvdW5rbm93bi1zeW1saW5rLWRpcmVjdG9yeSAmJgorCShjZCBzdm53Yzsgc3ZuIGluZm8gdW5rbm93bi1zeW1saW5rLWRpcmVjdG9yeSkgXAorCQkyPiBleHBlY3RlZC5pbmZvLXVua25vd24tc3ltbGluay1kaXJlY3RvcnkgJiYKKwkoY2QgZ2l0d2M7IGdpdC1zdm4gaW5mbyB1bmtub3duLXN5bWxpbmstZGlyZWN0b3J5KSBcCisJCTI+IGFjdHVhbC5pbmZvLXVua25vd24tc3ltbGluay1kaXJlY3RvcnkgJiYKKwlnaXQtZGlmZiBleHBlY3RlZC5pbmZvLXVua25vd24tc3ltbGluay1kaXJlY3RvcnkgXAorCQkgYWN0dWFsLmluZm8tdW5rbm93bi1zeW1saW5rLWRpcmVjdG9yeQorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5mbyAtLXVybCB1bmtub3duLXN5bWxpbmstZGlyZWN0b3J5JyAnCisJdGVzdCAteiAkKGNkIGdpdHdjOyBnaXQtc3ZuIGluZm8gLS11cmwgdW5rbm93bi1zeW1saW5rLWRpcmVjdG9yeSBcCisJCQkyPiAuLi9hY3R1YWwuaW5mby0tdXJsLXVua25vd24tc3ltbGluay1kaXJlY3RvcnkpICYmCisJZ2l0LWRpZmYgZXhwZWN0ZWQuaW5mby11bmtub3duLXN5bWxpbmstZGlyZWN0b3J5IFwKKwkJIGFjdHVhbC5pbmZvLS11cmwtdW5rbm93bi1zeW1saW5rLWRpcmVjdG9yeQorCScKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q5MTIwLWdpdC1zdm4tY2xvbmUtd2l0aC1wZXJjZW50LWVzY2FwZXMuc2ggYi90L3Q5MTIwLWdpdC1zdm4tY2xvbmUtd2l0aC1wZXJjZW50LWVzY2FwZXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWE0ZWFiZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDkxMjAtZ2l0LXN2bi1jbG9uZS13aXRoLXBlcmNlbnQtZXNjYXBlcy5zaApAQCAtMCwwICsxLDMxIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA4IEtldmluIEJhbGxhcmQKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LXN2biBjbG9uZSB3aXRoIHBlcmNlbnQgZXNjYXBlcycKKy4gLi9saWItZ2l0LXN2bi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCBzdm5yZXBvJyAiCisJbWtkaXIgcHJvamVjdCBwcm9qZWN0L3RydW5rIHByb2plY3QvYnJhbmNoZXMgcHJvamVjdC90YWdzICYmCisJZWNobyBmb28gPiBwcm9qZWN0L3RydW5rL2ZvbyAmJgorCXN2biBpbXBvcnQgLW0gJyR0ZXN0X2Rlc2NyaXB0aW9uJyBwcm9qZWN0ICckc3ZucmVwby9wciBqZWN0JyAmJgorCXJtIC1yZiBwcm9qZWN0ICYmCisJc3RhcnRfaHR0cGQKKyIKKworaWYgdGVzdCAiJFNWTl9IVFRQRF9QT1JUIiA9ICIiCit0aGVuCisJdGVzdF9leHBlY3RfZmFpbHVyZSAndGVzdCBjbG9uZSB3aXRoIHBlcmNlbnQgZXNjYXBlcyAtIG5lZWRzIFNWTl9IVFRQRF9QT1JUIHNldCcgJ2ZhbHNlJworZWxzZQorCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Rlc3QgY2xvbmUgd2l0aCBwZXJjZW50IGVzY2FwZXMnICcKKwkJZ2l0IHN2biBjbG9uZSAiJHN2bnJlcG8vcHIlMjBqZWN0IiBjbG9uZSAmJgorCQljZCBjbG9uZSAmJgorCQkJZ2l0IHJldi1wYXJzZSByZWZzL3JlbW90ZXMvZ2l0LXN2biAmJgorCQljZCAuLgorCScKK2ZpCisKK3N0b3BfaHR0cGQKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q5MTIxLWdpdC1zdm4tZmV0Y2gtcmVuYW1lZC1kaXIuc2ggYi90L3Q5MTIxLWdpdC1zdm4tZmV0Y2gtcmVuYW1lZC1kaXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTE0M2VkNgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDkxMjEtZ2l0LXN2bi1mZXRjaC1yZW5hbWVkLWRpci5zaApAQCAtMCwwICsxLDIwIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA4IFNhbnRob3NoIEt1bWFyIE1hbmkKKworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtc3ZuIGNhbiBmZXRjaCByZW5hbWVkIGRpcmVjdG9yaWVzJworCisuIC4vbGliLWdpdC1zdm4uc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbG9hZCByZXBvc2l0b3J5IHdpdGggcmVuYW1lZCBkaXJlY3RvcnknICIKKwlzdm5hZG1pbiBsb2FkIC1xICRyYXdzdm5yZXBvIDwgLi4vdDkxMjEvcmVuYW1lZC1kaXIuZHVtcAorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5pdCBhbmQgZmV0Y2ggcmVwb3NpdG9yeScgIgorCWdpdCBzdm4gaW5pdCAkc3ZucmVwby9uZXduYW1lICYmCisJZ2l0IHN2biBmZXRjaAorCSIKKwordGVzdF9kb25lCisKZGlmZiAtLWdpdCBhL3QvdDkxMjEvcmVuYW1lZC1kaXIuZHVtcCBiL3QvdDkxMjEvcmVuYW1lZC1kaXIuZHVtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjkxMjdiCi0tLSAvZGV2L251bGwKKysrIGIvdC90OTEyMS9yZW5hbWVkLWRpci5kdW1wCkBAIC0wLDAgKzEsOTAgQEAKK1NWTi1mcy1kdW1wLWZvcm1hdC12ZXJzaW9uOiAyCisKK1VVSUQ6IDA2YjliM2FkLWY1NDYtNGZiZS04MzI4LWZjYjRlNmVmNWMzZgorCitSZXZpc2lvbi1udW1iZXI6IDAKK1Byb3AtY29udGVudC1sZW5ndGg6IDU2CitDb250ZW50LWxlbmd0aDogNTYKKworSyA4Citzdm46ZGF0ZQorViAyNworMjAwOC0wNC0wMlQwOToxMTo1OS43Nzg1NTdaCitQUk9QUy1FTkQKKworUmV2aXNpb24tbnVtYmVyOiAxCitQcm9wLWNvbnRlbnQtbGVuZ3RoOiAxMTcKK0NvbnRlbnQtbGVuZ3RoOiAxMTcKKworSyA3Citzdm46bG9nCitWIDE0Citpbml0aWFsIGltcG9ydAorSyAxMAorc3ZuOmF1dGhvcgorViA4CitzYW50aG9zaAorSyA4Citzdm46ZGF0ZQorViAyNworMjAwOC0wNC0wMlQwOToxMzowMy4xNzA4NjNaCitQUk9QUy1FTkQKKworTm9kZS1wYXRoOiBuYW1lCitOb2RlLWtpbmQ6IGRpcgorTm9kZS1hY3Rpb246IGFkZAorUHJvcC1jb250ZW50LWxlbmd0aDogMTAKK0NvbnRlbnQtbGVuZ3RoOiAxMAorCitQUk9QUy1FTkQKKworCitOb2RlLXBhdGg6IG5hbWUvYS50eHQKK05vZGUta2luZDogZmlsZQorTm9kZS1hY3Rpb246IGFkZAorUHJvcC1jb250ZW50LWxlbmd0aDogNzEKK1RleHQtY29udGVudC1sZW5ndGg6IDYKK1RleHQtY29udGVudC1tZDU6IGIxOTQ2YWM5MjQ5MmQyMzQ3YzYyMzViNGQyNjExMTg0CitDb250ZW50LWxlbmd0aDogNzcKKworSyAxMworc3ZuOm1pbWUtdHlwZQorViAxMAordGV4dC9wbGFpbgorSyAxMworc3ZuOmVvbC1zdHlsZQorViAyCitMRgorUFJPUFMtRU5ECitoZWxsbworCisKK1JldmlzaW9uLW51bWJlcjogMgorUHJvcC1jb250ZW50LWxlbmd0aDogMTA5CitDb250ZW50LWxlbmd0aDogMTA5CisKK0sgNworc3ZuOmxvZworViA3CityZW5hbWVkCitLIDEwCitzdm46YXV0aG9yCitWIDgKK3NhbnRob3NoCitLIDgKK3N2bjpkYXRlCitWIDI3CisyMDA4LTA0LTAyVDA5OjE0OjIyLjk1MjE4NloKK1BST1BTLUVORAorCitOb2RlLXBhdGg6IG5ld25hbWUKK05vZGUta2luZDogZGlyCitOb2RlLWFjdGlvbjogYWRkCitOb2RlLWNvcHlmcm9tLXJldjogMQorTm9kZS1jb3B5ZnJvbS1wYXRoOiBuYW1lCisKKworTm9kZS1wYXRoOiBuYW1lCitOb2RlLWFjdGlvbjogZGVsZXRlCisKKwpkaWZmIC0tZ2l0IGEvdC90OTIwMC1naXQtY3ZzZXhwb3J0Y29tbWl0LnNoIGIvdC90OTIwMC1naXQtY3ZzZXhwb3J0Y29tbWl0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQyYjE0NGIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q5MjAwLWdpdC1jdnNleHBvcnRjb21taXQuc2gKQEAgLTAsMCArMSwzMDAgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIFJvYmluIFJvc2VuYmVyZworIwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdCBleHBvcnQgb2YgY29tbWl0cyB0byBDVlMnCisKKy4gLi90ZXN0LWxpYi5zaAorCitjdnMgPi9kZXYvbnVsbCAyPiYxCitpZiB0ZXN0ICQ/IC1uZSAxCit0aGVuCisgICAgdGVzdF9leHBlY3Rfc3VjY2VzcyAnc2tpcHBpbmcgZ2l0LWN2c2V4cG9ydGNvbW1pdCB0ZXN0cywgY3ZzIG5vdCBmb3VuZCcgOgorICAgIHRlc3RfZG9uZQorICAgIGV4aXQKK2ZpCisKK0NWU1JPT1Q9JChwd2QpL2N2c3Jvb3QKK0NWU1dPUks9JChwd2QpL2N2c3dvcmsKK0dJVF9ESVI9JChwd2QpLy5naXQKK2V4cG9ydCBDVlNST09UIENWU1dPUksgR0lUX0RJUgorCitybSAtcmYgIiRDVlNST09UIiAiJENWU1dPUksiCitta2RpciAiJENWU1JPT1QiICYmCitjdnMgaW5pdCAmJgorY3ZzIC1RIGNvIC1kICIkQ1ZTV09SSyIgLiAmJgorZWNobyA+ZW1wdHkgJiYKK2dpdCBhZGQgZW1wdHkgJiYKK2dpdCBjb21taXQgLXEgLWEgLW0gIkluaXRpYWwiIDI+L2Rldi9udWxsIHx8CitleGl0IDEKKworY2hlY2tfZW50cmllcyAoKSB7CisJIyAkMSA9PSBkaXJlY3RvcnksICQyID09IGV4cGVjdGVkCisJZ3JlcCAnXi8nICIkMS9DVlMvRW50cmllcyIgfCBzb3J0IHwgY3V0IC1kLyAtZjIsMyw1ID5hY3R1YWwKKwlpZiB0ZXN0IC16ICIkMiIKKwl0aGVuCisJCT5leHBlY3RlZAorCWVsc2UKKwkJcHJpbnRmICclc1xuJyAiJDIiIHwgdHIgJ3wnICdcMDEyJyA+ZXhwZWN0ZWQKKwlmaQorCXRlc3RfY21wIGV4cGVjdGVkIGFjdHVhbAorfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnTmV3IGZpbGUnIFwKKyAgICAnbWtkaXIgQSBCIEMgRCBFIEYgJiYKKyAgICAgZWNobyBoZWxsbzEgPkEvbmV3ZmlsZTEudHh0ICYmCisgICAgIGVjaG8gaGVsbG8yID5CL25ld2ZpbGUyLnR4dCAmJgorICAgICBjcCAuLi90ZXN0OTIwMGEucG5nIEMvbmV3ZmlsZTMucG5nICYmCisgICAgIGNwIC4uL3Rlc3Q5MjAwYS5wbmcgRC9uZXdmaWxlNC5wbmcgJiYKKyAgICAgZ2l0IGFkZCBBL25ld2ZpbGUxLnR4dCAmJgorICAgICBnaXQgYWRkIEIvbmV3ZmlsZTIudHh0ICYmCisgICAgIGdpdCBhZGQgQy9uZXdmaWxlMy5wbmcgJiYKKyAgICAgZ2l0IGFkZCBEL25ld2ZpbGU0LnBuZyAmJgorICAgICBnaXQgY29tbWl0IC1hIC1tICJUZXN0OiBOZXcgZmlsZSIgJiYKKyAgICAgaWQ9JChnaXQgcmV2LWxpc3QgLS1tYXgtY291bnQ9MSBIRUFEKSAmJgorICAgICAoY2QgIiRDVlNXT1JLIiAmJgorICAgICBnaXQgY3ZzZXhwb3J0Y29tbWl0IC1jICRpZCAmJgorICAgICBjaGVja19lbnRyaWVzIEEgIm5ld2ZpbGUxLnR4dC8xLjEvIiAmJgorICAgICBjaGVja19lbnRyaWVzIEIgIm5ld2ZpbGUyLnR4dC8xLjEvIiAmJgorICAgICBjaGVja19lbnRyaWVzIEMgIm5ld2ZpbGUzLnBuZy8xLjEvLWtiIiAmJgorICAgICBjaGVja19lbnRyaWVzIEQgIm5ld2ZpbGU0LnBuZy8xLjEvLWtiIiAmJgorICAgICBkaWZmIEEvbmV3ZmlsZTEudHh0IC4uL0EvbmV3ZmlsZTEudHh0ICYmCisgICAgIGRpZmYgQi9uZXdmaWxlMi50eHQgLi4vQi9uZXdmaWxlMi50eHQgJiYKKyAgICAgZGlmZiBDL25ld2ZpbGUzLnBuZyAuLi9DL25ld2ZpbGUzLnBuZyAmJgorICAgICBkaWZmIEQvbmV3ZmlsZTQucG5nIC4uL0QvbmV3ZmlsZTQucG5nCisgICAgICknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdSZW1vdmUgdHdvIGZpbGVzLCBhZGQgdHdvIGFuZCB1cGRhdGUgdHdvJyBcCisgICAgJ2VjaG8gSGVsbG8xID4+QS9uZXdmaWxlMS50eHQgJiYKKyAgICAgcm0gLWYgQi9uZXdmaWxlMi50eHQgJiYKKyAgICAgcm0gLWYgQy9uZXdmaWxlMy5wbmcgJiYKKyAgICAgZWNobyBIZWxsbzUgID5FL25ld2ZpbGU1LnR4dCAmJgorICAgICBjcCAuLi90ZXN0OTIwMGIucG5nIEQvbmV3ZmlsZTQucG5nICYmCisgICAgIGNwIC4uL3Rlc3Q5MjAwYS5wbmcgRi9uZXdmaWxlNi5wbmcgJiYKKyAgICAgZ2l0IGFkZCBFL25ld2ZpbGU1LnR4dCAmJgorICAgICBnaXQgYWRkIEYvbmV3ZmlsZTYucG5nICYmCisgICAgIGdpdCBjb21taXQgLWEgLW0gIlRlc3Q6IFJlbW92ZSwgYWRkIGFuZCB1cGRhdGUiICYmCisgICAgIGlkPSQoZ2l0IHJldi1saXN0IC0tbWF4LWNvdW50PTEgSEVBRCkgJiYKKyAgICAgKGNkICIkQ1ZTV09SSyIgJiYKKyAgICAgZ2l0IGN2c2V4cG9ydGNvbW1pdCAtYyAkaWQgJiYKKyAgICAgY2hlY2tfZW50cmllcyBBICJuZXdmaWxlMS50eHQvMS4yLyIgJiYKKyAgICAgY2hlY2tfZW50cmllcyBCICIiICYmCisgICAgIGNoZWNrX2VudHJpZXMgQyAiIiAmJgorICAgICBjaGVja19lbnRyaWVzIEQgIm5ld2ZpbGU0LnBuZy8xLjIvLWtiIiAmJgorICAgICBjaGVja19lbnRyaWVzIEUgIm5ld2ZpbGU1LnR4dC8xLjEvIiAmJgorICAgICBjaGVja19lbnRyaWVzIEYgIm5ld2ZpbGU2LnBuZy8xLjEvLWtiIiAmJgorICAgICBkaWZmIEEvbmV3ZmlsZTEudHh0IC4uL0EvbmV3ZmlsZTEudHh0ICYmCisgICAgIGRpZmYgRC9uZXdmaWxlNC5wbmcgLi4vRC9uZXdmaWxlNC5wbmcgJiYKKyAgICAgZGlmZiBFL25ld2ZpbGU1LnR4dCAuLi9FL25ld2ZpbGU1LnR4dCAmJgorICAgICBkaWZmIEYvbmV3ZmlsZTYucG5nIC4uL0YvbmV3ZmlsZTYucG5nCisgICAgICknCisKKyMgU2hvdWxkIGZhaWwgKGJ1dCBvbmx5IG9uIHRoZSBnaXQtY3ZzZXhwb3J0Y29tbWl0IHN0YWdlKQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0ZhaWwgdG8gY2hhbmdlIGJpbmFyeSBtb3JlIHRoYW4gb25lIGdlbmVyYXRpb24gb2xkJyBcCisgICAgJ2NhdCBGL25ld2ZpbGU2LnBuZyA+PkQvbmV3ZmlsZTQucG5nICYmCisgICAgIGdpdCBjb21taXQgLWEgLW0gImdlbmVyYXRpaW9uIDEiICYmCisgICAgIGNhdCBGL25ld2ZpbGU2LnBuZyA+PkQvbmV3ZmlsZTQucG5nICYmCisgICAgIGdpdCBjb21taXQgLWEgLW0gImdlbmVyYXRpb24gMiIgJiYKKyAgICAgaWQ9JChnaXQgcmV2LWxpc3QgLS1tYXgtY291bnQ9MSBIRUFEKSAmJgorICAgICAoY2QgIiRDVlNXT1JLIiAmJgorICAgICAhIGdpdCBjdnNleHBvcnRjb21taXQgLWMgJGlkCisgICAgICknCisKKyN0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyMgICAgJ0ZhaWwgdG8gcmVtb3ZlIGJpbmFyeSBmaWxlIG1vcmUgdGhhbiBvbmUgZ2VuZXJhdGlvbiBvbGQnIFwKKyMgICAgJ2dpdCByZXNldCAtLWhhcmQgSEVBRF4gJiYKKyMgICAgIGNhdCBGL25ld2ZpbGU2LnBuZyA+PkQvbmV3ZmlsZTQucG5nICYmCisjICAgICBnaXQgY29tbWl0IC1hIC1tICJnZW5lcmF0aW9uIDIgKGFnYWluKSIgJiYKKyMgICAgIHJtIC1mIEQvbmV3ZmlsZTQucG5nICYmCisjICAgICBnaXQgY29tbWl0IC1hIC1tICJnZW5lcmF0aW9uIDMiICYmCisjICAgICBpZD0kKGdpdCByZXYtbGlzdCAtLW1heC1jb3VudD0xIEhFQUQpICYmCisjICAgICAoY2QgIiRDVlNXT1JLIiAmJgorIyAgICAgISBnaXQgY3ZzZXhwb3J0Y29tbWl0IC1jICRpZAorIyAgICAgKScKKworIyBXZSByZXVzZSB0aGUgc3RhdGUgZnJvbSB0d28gdGVzdHMgYmFjayBoZXJlCisKKyMgVGhpcyB0ZXN0IGlzIGhlcmUgYmVjYXVzZSBhIHBhdGNoIGZvciBvbmx5IGJpbmFyeSBmaWxlcyB3aWxsCisjIGZhaWwgd2l0aCBnbnUgcGF0Y2gsIHNvIGN2c2V4cG9ydGNvbW1pdCBtdXN0IGhhbmRsZSB0aGF0LgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1JlbW92ZSBvbmx5IGJpbmFyeSBmaWxlcycgXAorICAgICdnaXQgcmVzZXQgLS1oYXJkIEhFQUReXiAmJgorICAgICBybSAtZiBEL25ld2ZpbGU0LnBuZyAmJgorICAgICBnaXQgY29tbWl0IC1hIC1tICJ0ZXN0OiByZW1vdmUgb25seSBhIGJpbmFyeSBmaWxlIiAmJgorICAgICBpZD0kKGdpdCByZXYtbGlzdCAtLW1heC1jb3VudD0xIEhFQUQpICYmCisgICAgIChjZCAiJENWU1dPUksiICYmCisgICAgIGdpdCBjdnNleHBvcnRjb21taXQgLWMgJGlkICYmCisgICAgIGNoZWNrX2VudHJpZXMgQSAibmV3ZmlsZTEudHh0LzEuMi8iICYmCisgICAgIGNoZWNrX2VudHJpZXMgQiAiIiAmJgorICAgICBjaGVja19lbnRyaWVzIEMgIiIgJiYKKyAgICAgY2hlY2tfZW50cmllcyBEICIiICYmCisgICAgIGNoZWNrX2VudHJpZXMgRSAibmV3ZmlsZTUudHh0LzEuMS8iICYmCisgICAgIGNoZWNrX2VudHJpZXMgRiAibmV3ZmlsZTYucG5nLzEuMS8ta2IiICYmCisgICAgIGRpZmYgQS9uZXdmaWxlMS50eHQgLi4vQS9uZXdmaWxlMS50eHQgJiYKKyAgICAgZGlmZiBFL25ld2ZpbGU1LnR4dCAuLi9FL25ld2ZpbGU1LnR4dCAmJgorICAgICBkaWZmIEYvbmV3ZmlsZTYucG5nIC4uL0YvbmV3ZmlsZTYucG5nCisgICAgICknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdSZW1vdmUgb25seSBhIHRleHQgZmlsZScgXAorICAgICdybSAtZiBBL25ld2ZpbGUxLnR4dCAmJgorICAgICBnaXQgY29tbWl0IC1hIC1tICJ0ZXN0OiByZW1vdmUgb25seSBhIGJpbmFyeSBmaWxlIiAmJgorICAgICBpZD0kKGdpdCByZXYtbGlzdCAtLW1heC1jb3VudD0xIEhFQUQpICYmCisgICAgIChjZCAiJENWU1dPUksiICYmCisgICAgIGdpdCBjdnNleHBvcnRjb21taXQgLWMgJGlkICYmCisgICAgIGNoZWNrX2VudHJpZXMgQSAiIiAmJgorICAgICBjaGVja19lbnRyaWVzIEIgIiIgJiYKKyAgICAgY2hlY2tfZW50cmllcyBDICIiICYmCisgICAgIGNoZWNrX2VudHJpZXMgRCAiIiAmJgorICAgICBjaGVja19lbnRyaWVzIEUgIm5ld2ZpbGU1LnR4dC8xLjEvIiAmJgorICAgICBjaGVja19lbnRyaWVzIEYgIm5ld2ZpbGU2LnBuZy8xLjEvLWtiIiAmJgorICAgICBkaWZmIEUvbmV3ZmlsZTUudHh0IC4uL0UvbmV3ZmlsZTUudHh0ICYmCisgICAgIGRpZmYgRi9uZXdmaWxlNi5wbmcgLi4vRi9uZXdmaWxlNi5wbmcKKyAgICAgKScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgICdOZXcgZmlsZSB3aXRoIHNwYWNlcyBpbiBmaWxlIG5hbWUnIFwKKyAgICAgJ21rZGlyICJHIGciICYmCisgICAgICBlY2hvIG9rIHRoZW4gPiJHIGcvd2l0aCBzcGFjZXMudHh0IiAmJgorICAgICAgZ2l0IGFkZCAiRyBnL3dpdGggc3BhY2VzLnR4dCIgJiYgXAorICAgICAgY3AgLi4vdGVzdDkyMDBhLnBuZyAiRyBnL3dpdGggc3BhY2VzLnBuZyIgJiYgXAorICAgICAgZ2l0IGFkZCAiRyBnL3dpdGggc3BhY2VzLnBuZyIgJiYKKyAgICAgIGdpdCBjb21taXQgLWEgLW0gIldpdGggc3BhY2VzIiAmJgorICAgICAgaWQ9JChnaXQgcmV2LWxpc3QgLS1tYXgtY291bnQ9MSBIRUFEKSAmJgorICAgICAgKGNkICIkQ1ZTV09SSyIgJiYKKyAgICAgIGdpdC1jdnNleHBvcnRjb21taXQgLWMgJGlkICYmCisgICAgICBjaGVja19lbnRyaWVzICJHIGciICJ3aXRoIHNwYWNlcy5wbmcvMS4xLy1rYnx3aXRoIHNwYWNlcy50eHQvMS4xLyIKKyAgICAgICknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICAnVXBkYXRlIGZpbGUgd2l0aCBzcGFjZXMgaW4gZmlsZSBuYW1lJyBcCisgICAgICdlY2hvIE9rIHRoZW4gPj4iRyBnL3dpdGggc3BhY2VzLnR4dCIgJiYKKyAgICAgIGNhdCAuLi90ZXN0OTIwMGEucG5nID4+IkcgZy93aXRoIHNwYWNlcy5wbmciICYmIFwKKyAgICAgIGdpdCBhZGQgIkcgZy93aXRoIHNwYWNlcy5wbmciICYmCisgICAgICBnaXQgY29tbWl0IC1hIC1tICJVcGRhdGUgd2l0aCBzcGFjZXMiICYmCisgICAgICBpZD0kKGdpdCByZXYtbGlzdCAtLW1heC1jb3VudD0xIEhFQUQpICYmCisgICAgICAoY2QgIiRDVlNXT1JLIiAmJgorICAgICAgZ2l0LWN2c2V4cG9ydGNvbW1pdCAtYyAkaWQKKyAgICAgIGNoZWNrX2VudHJpZXMgIkcgZyIgIndpdGggc3BhY2VzLnBuZy8xLjIvLWtifHdpdGggc3BhY2VzLnR4dC8xLjIvIgorICAgICAgKScKKworIyBTb21lIGZpbGVzeXN0ZW1zIG1hbmdsZSBwYXRobmFtZXMgd2l0aCBVVEYtOCBjaGFyYWN0ZXJzIC0tCisjIGNoZWNrIGFuZCBza2lwCitpZiBwPSLDhS9nb28vYS9iL2MvZC9lL2YvZy9oL2kvai9rL2wvbS9uL28vcC9xL3Ivcy90L3Uvdi93L3gveS96L8OlL8OkL8O2IiAmJgorCW1rZGlyIC1wICJ0c3QvJHAiICYmCisJZGF0ZSA+InRzdC8kcC9kYXkiICYmCisJZm91bmQ9JChmaW5kIHRzdCAtdHlwZSBmIC1wcmludCkgJiYKKwl0ZXN0ICJ6JGZvdW5kIiA9ICJ6dHN0LyRwL2RheSIgJiYKKwlybSAtZnIgdHN0Cit0aGVuCisKKyMgVGhpcyB0ZXN0IGNvbnRhaW5zIFVURi04IGNoYXJhY3RlcnMKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICAnRmlsZSB3aXRoIG5vbi1hc2NpaSBmaWxlIG5hbWUnIFwKKyAgICAgJ21rZGlyIC1wIMOFL2dvby9hL2IvYy9kL2UvZi9nL2gvaS9qL2svbC9tL24vby9wL3Evci9zL3QvdS92L3cveC95L3ovw6Uvw6Qvw7YgJiYKKyAgICAgIGVjaG8gRm9vID7DhS9nb28vYS9iL2MvZC9lL2YvZy9oL2kvai9rL2wvbS9uL28vcC9xL3Ivcy90L3Uvdi93L3gveS96L8OlL8OkL8O2L2fDpXJkZXRzw6Vnw6VyZGV0LnR4dCAmJgorICAgICAgZ2l0IGFkZCDDhS9nb28vYS9iL2MvZC9lL2YvZy9oL2kvai9rL2wvbS9uL28vcC9xL3Ivcy90L3Uvdi93L3gveS96L8OlL8OkL8O2L2fDpXJkZXRzw6Vnw6VyZGV0LnR4dCAmJgorICAgICAgY3AgLi4vdGVzdDkyMDBhLnBuZyDDhS9nb28vYS9iL2MvZC9lL2YvZy9oL2kvai9rL2wvbS9uL28vcC9xL3Ivcy90L3Uvdi93L3gveS96L8OlL8OkL8O2L2fDpXJkZXRzw6Vnw6VyZGV0LnBuZyAmJgorICAgICAgZ2l0IGFkZCDDhS9nb28vYS9iL2MvZC9lL2YvZy9oL2kvai9rL2wvbS9uL28vcC9xL3Ivcy90L3Uvdi93L3gveS96L8OlL8OkL8O2L2fDpXJkZXRzw6Vnw6VyZGV0LnBuZyAmJgorICAgICAgZ2l0IGNvbW1pdCAtYSAtbSAiR8OlciBkZXQgc8OlIGfDpXIgZGV0IiAmJiBcCisgICAgICBpZD0kKGdpdCByZXYtbGlzdCAtLW1heC1jb3VudD0xIEhFQUQpICYmCisgICAgICAoY2QgIiRDVlNXT1JLIiAmJgorICAgICAgZ2l0LWN2c2V4cG9ydGNvbW1pdCAtdiAtYyAkaWQgJiYKKyAgICAgIGNoZWNrX2VudHJpZXMgXAorICAgICAgIsOFL2dvby9hL2IvYy9kL2UvZi9nL2gvaS9qL2svbC9tL24vby9wL3Evci9zL3QvdS92L3cveC95L3ovw6Uvw6Qvw7YiIFwKKyAgICAgICJnw6VyZGV0c8OlZ8OlcmRldC5wbmcvMS4xLy1rYnxnw6VyZGV0c8OlZ8OlcmRldC50eHQvMS4xLyIKKyAgICAgICknCisKK2ZpCisKK3JtIC1mciB0c3QKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgICdNaXNtYXRjaGluZyBwYXRjaCBzaG91bGQgZmFpbCcgXAorICAgICAnZGF0ZSA+PiJFL25ld2ZpbGU1LnR4dCIgJiYKKyAgICAgIGdpdCBhZGQgIkUvbmV3ZmlsZTUudHh0IiAmJgorICAgICAgZ2l0IGNvbW1pdCAtYSAtbSAiVXBkYXRlIG9uZSIgJiYKKyAgICAgIGRhdGUgPj4iRS9uZXdmaWxlNS50eHQiICYmCisgICAgICBnaXQgYWRkICJFL25ld2ZpbGU1LnR4dCIgJiYKKyAgICAgIGdpdCBjb21taXQgLWEgLW0gIlVwZGF0ZSB0d28iICYmCisgICAgICBpZD0kKGdpdCByZXYtbGlzdCAtLW1heC1jb3VudD0xIEhFQUQpICYmCisgICAgICAoY2QgIiRDVlNXT1JLIiAmJgorICAgICAgISBnaXQtY3ZzZXhwb3J0Y29tbWl0IC1jICRpZAorICAgICAgKScKKworY2FzZSAiJChnaXQgY29uZmlnIC0tYm9vbCBjb3JlLmZpbGVtb2RlKSIgaW4KK2ZhbHNlKQorCTs7CisqKQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgICdSZXRhaW4gZXhlY3V0ZSBiaXQnIFwKKyAgICAgJ21rZGlyIEcgJiYKKyAgICAgIGVjaG8gZXhlY3V0ZW9uID5HL29uICYmCisgICAgICBjaG1vZCAreCBHL29uICYmCisgICAgICBlY2hvIGV4ZWN1dGVvZmYgPkcvb2ZmICYmCisgICAgICBnaXQgYWRkIEcvb24gJiYKKyAgICAgIGdpdCBhZGQgRy9vZmYgJiYKKyAgICAgIGdpdCBjb21taXQgLWEgLW0gIkV4ZWN1dGUgdGVzdCIgJiYKKyAgICAgIChjZCAiJENWU1dPUksiICYmCisgICAgICBnaXQtY3ZzZXhwb3J0Y29tbWl0IC1jIEhFQUQKKyAgICAgIHRlc3QgLXggRy9vbiAmJgorICAgICAgISB0ZXN0IC14IEcvb2ZmCisgICAgICApJworCTs7Citlc2FjCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJy13IG9wdGlvbiBzaG91bGQgd29yayB3aXRoIHJlbGF0aXZlIEdJVF9ESVInICcKKyAgICAgIG1rZGlyIFcgJiYKKyAgICAgIGVjaG8gZm9vYmFyID5XL2ZpbGUxLnR4dCAmJgorICAgICAgZWNobyBiYXp6bGUgPlcvZmlsZTIudHh0ICYmCisgICAgICBnaXQgYWRkIFcvZmlsZTEudHh0ICYmCisgICAgICBnaXQgYWRkIFcvZmlsZTIudHh0ICYmCisgICAgICBnaXQgY29tbWl0IC1tICJNb3JlIHVwZGF0ZXMiICYmCisgICAgICBpZD0kKGdpdCByZXYtbGlzdCAtLW1heC1jb3VudD0xIEhFQUQpICYmCisgICAgICAoY2QgIiRHSVRfRElSIiAmJgorICAgICAgR0lUX0RJUj0uIGdpdCBjdnNleHBvcnRjb21taXQgLXcgIiRDVlNXT1JLIiAtYyAkaWQgJiYKKyAgICAgIGNoZWNrX2VudHJpZXMgIiRDVlNXT1JLL1ciICJmaWxlMS50eHQvMS4xL3xmaWxlMi50eHQvMS4xLyIgJiYKKyAgICAgIHRlc3RfY21wICIkQ1ZTV09SSy9XL2ZpbGUxLnR4dCIgLi4vVy9maWxlMS50eHQgJiYKKyAgICAgIHRlc3RfY21wICIkQ1ZTV09SSy9XL2ZpbGUyLnR4dCIgLi4vVy9maWxlMi50eHQKKyAgICAgICkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgZmlsZXMgYmVmb3JlIGRpcmVjdG9yaWVzJyAnCisKKwllY2hvIE5vdGVzID4gcmVsZWFzZS1ub3RlcyAmJgorCWdpdCBhZGQgcmVsZWFzZS1ub3RlcyAmJgorCWdpdCBjb21taXQgLW0gIkFkZCByZWxlYXNlIG5vdGVzIiByZWxlYXNlLW5vdGVzICYmCisJaWQ9JChnaXQgcmV2LXBhcnNlIEhFQUQpICYmCisJZ2l0IGN2c2V4cG9ydGNvbW1pdCAtdyAiJENWU1dPUksiIC1jICRpZCAmJgorCisJZWNobyBuZXcgPiBEUyAmJgorCWVjaG8gbmV3ID4gRS9EUyAmJgorCWVjaG8gbW9kaWZpZWQgPiByZWxlYXNlLW5vdGVzICYmCisJZ2l0IGFkZCBEUyBFL0RTIHJlbGVhc2Utbm90ZXMgJiYKKwlnaXQgY29tbWl0IC1tICJBZGQgdHdvIGZpbGVzIHdpdGggdGhlIHNhbWUgYmFzZW5hbWUiICYmCisJaWQ9JChnaXQgcmV2LXBhcnNlIEhFQUQpICYmCisJZ2l0IGN2c2V4cG9ydGNvbW1pdCAtdyAiJENWU1dPUksiIC1jICRpZCAmJgorCWNoZWNrX2VudHJpZXMgIiRDVlNXT1JLL0UiICJEUy8xLjEvfG5ld2ZpbGU1LnR4dC8xLjEvIiAmJgorCWNoZWNrX2VudHJpZXMgIiRDVlNXT1JLIiAiRFMvMS4xL3xyZWxlYXNlLW5vdGVzLzEuMi8iICYmCisJdGVzdF9jbXAgIiRDVlNXT1JLL0RTIiBEUyAmJgorCXRlc3RfY21wICIkQ1ZTV09SSy9FL0RTIiBFL0RTICYmCisJdGVzdF9jbXAgIiRDVlNXT1JLL3JlbGVhc2Utbm90ZXMiIHJlbGVhc2Utbm90ZXMKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb21taXQgYSBmaWxlIHdpdGggbGVhZGluZyBzcGFjZXMgaW4gdGhlIG5hbWUnICcKKworCWVjaG8gc3BhY2UgPiAiIHNwYWNlIiAmJgorCWdpdCBhZGQgIiBzcGFjZSIgJiYKKwlnaXQgY29tbWl0IC1tICJBZGQgYSBmaWxlIHdpdGggYSBsZWFkaW5nIHNwYWNlIiAmJgorCWlkPSQoZ2l0IHJldi1wYXJzZSBIRUFEKSAmJgorCWdpdCBjdnNleHBvcnRjb21taXQgLXcgIiRDVlNXT1JLIiAtYyAkaWQgJiYKKwljaGVja19lbnRyaWVzICIkQ1ZTV09SSyIgIiBzcGFjZS8xLjEvfERTLzEuMS98cmVsZWFzZS1ub3Rlcy8xLjIvIiAmJgorCXRlc3RfY21wICIkQ1ZTV09SSy8gc3BhY2UiICIgc3BhY2UiCisKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q5MzAwLWZhc3QtaW1wb3J0LnNoIGIvdC90OTMwMC1mYXN0LWltcG9ydC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNGY0NDY1Ci0tLSAvZGV2L251bGwKKysrIGIvdC90OTMwMC1mYXN0LWltcG9ydC5zaApAQCAtMCwwICsxLDkyMSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBTaGF3biBQZWFyY2UKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0ndGVzdCBnaXQtZmFzdC1pbXBvcnQgdXRpbGl0eScKKy4gLi90ZXN0LWxpYi5zaAorLiAuLi9kaWZmLWxpYi5zaCA7IyB0ZXN0LWxpYiBjaGRpcidzIGludG8gdHJhc2gKKworZmlsZTJfZGF0YT0nZmlsZTIKK3NlY29uZCBsaW5lIG9mIEVPRicKKworZmlsZTNfZGF0YT0nRU9GCitpbiAzcmQgZmlsZQorIEVORCcKKworZmlsZTRfZGF0YT1hYmNkCitmaWxlNF9sZW49NAorCitmaWxlNV9kYXRhPSdhbiBpbmxpbmUgZmlsZS4KKyAgd2Ugc2hvdWxkIHNlZSBpdCBsYXRlci4nCisKK2ZpbGU2X2RhdGE9JyMhL2Jpbi9zaAorZWNobyAiJEAiJworCisjIyMKKyMjIyBzZXJpZXMgQQorIyMjCisKK3Rlc3RfdGljaworY2F0ID5pbnB1dCA8PElOUFVUX0VORAorYmxvYgorbWFyayA6MgorZGF0YSA8PEVPRgorJGZpbGUyX2RhdGEKK0VPRgorCitibG9iCittYXJrIDozCitkYXRhIDw8RU5ECiskZmlsZTNfZGF0YQorRU5ECisKK2Jsb2IKK21hcmsgOjQKK2RhdGEgJGZpbGU0X2xlbgorJGZpbGU0X2RhdGEKK2NvbW1pdCByZWZzL2hlYWRzL21hc3RlcgorbWFyayA6NQorY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCitkYXRhIDw8Q09NTUlUCitpbml0aWFsCitDT01NSVQKKworTSA2NDQgOjIgZmlsZTIKK00gNjQ0IDozIGZpbGUzCitNIDc1NSA6NCBmaWxlNAorCitJTlBVVF9FTkQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdBOiBjcmVhdGUgcGFjayBmcm9tIHN0ZGluJyBcCisgICAgJ2dpdC1mYXN0LWltcG9ydCAtLWV4cG9ydC1tYXJrcz1tYXJrcy5vdXQgPGlucHV0ICYmCisJIGdpdCB3aGF0Y2hhbmdlZCBtYXN0ZXInCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknQTogdmVyaWZ5IHBhY2snIFwKKwknZm9yIHAgaW4gLmdpdC9vYmplY3RzL3BhY2svKi5wYWNrO2RvIGdpdCB2ZXJpZnktcGFjayAkcHx8ZXhpdDtkb25lJworCitjYXQgPmV4cGVjdCA8PEVPRgorYXV0aG9yICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCitjb21taXR0ZXIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+ICRHSVRfQ09NTUlUVEVSX0RBVEUKKworaW5pdGlhbAorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknQTogdmVyaWZ5IGNvbW1pdCcgXAorCSdnaXQgY2F0LWZpbGUgY29tbWl0IG1hc3RlciB8IHNlZCAxZCA+YWN0dWFsICYmCisJZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCcKKworY2F0ID5leHBlY3QgPDxFT0YKKzEwMDY0NCBibG9iIGZpbGUyCisxMDA2NDQgYmxvYiBmaWxlMworMTAwNzU1IGJsb2IgZmlsZTQKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ0E6IHZlcmlmeSB0cmVlJyBcCisJJ2dpdCBjYXQtZmlsZSAtcCBtYXN0ZXJee3RyZWV9IHwgc2VkICJzLyBbMC05YS1mXSoJLyAvIiA+YWN0dWFsICYmCisJIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwnCisKK2VjaG8gIiRmaWxlMl9kYXRhIiA+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknQTogdmVyaWZ5IGZpbGUyJyBcCisJJ2dpdCBjYXQtZmlsZSBibG9iIG1hc3RlcjpmaWxlMiA+YWN0dWFsICYmIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwnCisKK2VjaG8gIiRmaWxlM19kYXRhIiA+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknQTogdmVyaWZ5IGZpbGUzJyBcCisJJ2dpdCBjYXQtZmlsZSBibG9iIG1hc3RlcjpmaWxlMyA+YWN0dWFsICYmIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwnCisKK3ByaW50ZiAiJGZpbGU0X2RhdGEiID5leHBlY3QKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdBOiB2ZXJpZnkgZmlsZTQnIFwKKwknZ2l0IGNhdC1maWxlIGJsb2IgbWFzdGVyOmZpbGU0ID5hY3R1YWwgJiYgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCcKKworY2F0ID5leHBlY3QgPDxFT0YKKzoyIGBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IG1hc3RlcjpmaWxlMmAKKzozIGBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IG1hc3RlcjpmaWxlM2AKKzo0IGBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IG1hc3RlcjpmaWxlNGAKKzo1IGBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IG1hc3Rlcl4wYAorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknQTogdmVyaWZ5IG1hcmtzIG91dHB1dCcgXAorCSdnaXQgZGlmZiBleHBlY3QgbWFya3Mub3V0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknQTogdmVyaWZ5IG1hcmtzIGltcG9ydCcgXAorCSdnaXQtZmFzdC1pbXBvcnQgXAorCQktLWltcG9ydC1tYXJrcz1tYXJrcy5vdXQgXAorCQktLWV4cG9ydC1tYXJrcz1tYXJrcy5uZXcgXAorCQk8L2Rldi9udWxsICYmCisJZ2l0IGRpZmYgLXUgZXhwZWN0IG1hcmtzLm5ldycKKwordGVzdF90aWNrCitjYXQgPmlucHV0IDw8SU5QVVRfRU5ECitjb21taXQgcmVmcy9oZWFkcy92ZXJpZnktLWltcG9ydC1tYXJrcworY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCitkYXRhIDw8Q09NTUlUCityZWNyZWF0ZSBmcm9tIDo1CitDT01NSVQKKworZnJvbSA6NQorTSA3NTUgOjIgY29weS1vZi1maWxlMgorCitJTlBVVF9FTkQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdBOiB2ZXJpZnkgbWFya3MgaW1wb3J0IGRvZXMgbm90IGNyYXNoJyBcCisJJ2dpdC1mYXN0LWltcG9ydCAtLWltcG9ydC1tYXJrcz1tYXJrcy5vdXQgPGlucHV0ICYmCisJIGdpdCB3aGF0Y2hhbmdlZCB2ZXJpZnktLWltcG9ydC1tYXJrcycKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdBOiB2ZXJpZnkgcGFjaycgXAorCSdmb3IgcCBpbiAuZ2l0L29iamVjdHMvcGFjay8qLnBhY2s7ZG8gZ2l0IHZlcmlmeS1wYWNrICRwfHxleGl0O2RvbmUnCitjYXQgPmV4cGVjdCA8PEVPRgorOjAwMDAwMCAxMDA3NTUgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA3MTIzZjdmNDRlMzliZTEyN2M1ZWI3MDFlNTk2ODE3NmVlOWQ3OGIxIEEJY29weS1vZi1maWxlMgorRU9GCitnaXQgZGlmZi10cmVlIC1NIC1yIG1hc3RlciB2ZXJpZnktLWltcG9ydC1tYXJrcyA+YWN0dWFsCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknQTogdmVyaWZ5IGRpZmYnIFwKKwknY29tcGFyZV9kaWZmX3JhdyBleHBlY3QgYWN0dWFsICYmCisJIHRlc3QgYGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgbWFzdGVyOmZpbGUyYCBcCisJICAgID0gYGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgdmVyaWZ5LS1pbXBvcnQtbWFya3M6Y29weS1vZi1maWxlMmAnCisKKyMjIworIyMjIHNlcmllcyBCCisjIyMKKwordGVzdF90aWNrCitjYXQgPmlucHV0IDw8SU5QVVRfRU5ECitjb21taXQgcmVmcy9oZWFkcy9icmFuY2gKK21hcmsgOjEKK2NvbW1pdHRlciAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gJEdJVF9DT01NSVRURVJfREFURQorZGF0YSA8PENPTU1JVAorY29ycnVwdAorQ09NTUlUCisKK2Zyb20gcmVmcy9oZWFkcy9tYXN0ZXIKK00gNzU1IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgemVybzEKKworSU5QVVRfRU5ECit0ZXN0X2V4cGVjdF9zdWNjZXNzICdCOiBmYWlsIG9uIGludmFsaWQgYmxvYiBzaGExJyAnCisgICAgISBnaXQtZmFzdC1pbXBvcnQgPGlucHV0CisnCitybSAtZiAuZ2l0L29iamVjdHMvcGFja18qIC5naXQvb2JqZWN0cy9pbmRleF8qCisKK2NhdCA+aW5wdXQgPDxJTlBVVF9FTkQKK2NvbW1pdCAuYmFkYnJhbmNobmFtZQorY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCitkYXRhIDw8Q09NTUlUCitjb3JydXB0CitDT01NSVQKKworZnJvbSByZWZzL2hlYWRzL21hc3RlcgorCitJTlBVVF9FTkQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ0I6IGZhaWwgb24gaW52YWxpZCBicmFuY2ggbmFtZSAiLmJhZGJyYW5jaG5hbWUiJyAnCisgICAgISBnaXQtZmFzdC1pbXBvcnQgPGlucHV0CisnCitybSAtZiAuZ2l0L29iamVjdHMvcGFja18qIC5naXQvb2JqZWN0cy9pbmRleF8qCisKK2NhdCA+aW5wdXQgPDxJTlBVVF9FTkQKK2NvbW1pdCBiYWRbYnJhbmNoXW5hbWUKK2NvbW1pdHRlciAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gJEdJVF9DT01NSVRURVJfREFURQorZGF0YSA8PENPTU1JVAorY29ycnVwdAorQ09NTUlUCisKK2Zyb20gcmVmcy9oZWFkcy9tYXN0ZXIKKworSU5QVVRfRU5ECit0ZXN0X2V4cGVjdF9zdWNjZXNzICdCOiBmYWlsIG9uIGludmFsaWQgYnJhbmNoIG5hbWUgImJhZFticmFuY2hdbmFtZSInICcKKyAgICAhIGdpdC1mYXN0LWltcG9ydCA8aW5wdXQKKycKK3JtIC1mIC5naXQvb2JqZWN0cy9wYWNrXyogLmdpdC9vYmplY3RzL2luZGV4XyoKKworY2F0ID5pbnB1dCA8PElOUFVUX0VORAorY29tbWl0IFRFTVBfVEFHCitjb21taXR0ZXIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+ICRHSVRfQ09NTUlUVEVSX0RBVEUKK2RhdGEgPDxDT01NSVQKK3RhZyBiYXNlCitDT01NSVQKKworZnJvbSByZWZzL2hlYWRzL21hc3RlcgorCitJTlBVVF9FTkQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdCOiBhY2NlcHQgYnJhbmNoIG5hbWUgIlRFTVBfVEFHIicgXAorICAgICdnaXQtZmFzdC1pbXBvcnQgPGlucHV0ICYmCisJIHRlc3QgLWYgLmdpdC9URU1QX1RBRyAmJgorCSB0ZXN0IGBnaXQgcmV2LXBhcnNlIG1hc3RlcmAgPSBgZ2l0IHJldi1wYXJzZSBURU1QX1RBR15gJworcm0gLWYgLmdpdC9URU1QX1RBRworCisjIyMKKyMjIyBzZXJpZXMgQworIyMjCisKK25ld2Y9YGVjaG8gaGkgbmV3ZiB8IGdpdC1oYXNoLW9iamVjdCAtdyAtLXN0ZGluYAorb2xkZj1gZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBtYXN0ZXI6ZmlsZTJgCit0ZXN0X3RpY2sKK2NhdCA+aW5wdXQgPDxJTlBVVF9FTkQKK2NvbW1pdCByZWZzL2hlYWRzL2JyYW5jaAorY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCitkYXRhIDw8Q09NTUlUCitzZWNvbmQKK0NPTU1JVAorCitmcm9tIHJlZnMvaGVhZHMvbWFzdGVyCitNIDY0NCAkb2xkZiBmaWxlMi9vbGRmCitNIDc1NSAkbmV3ZiBmaWxlMi9uZXdmCitEIGZpbGUzCisKK0lOUFVUX0VORAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0M6IGluY3JlbWVudGFsIGltcG9ydCBjcmVhdGUgcGFjayBmcm9tIHN0ZGluJyBcCisgICAgJ2dpdC1mYXN0LWltcG9ydCA8aW5wdXQgJiYKKwkgZ2l0IHdoYXRjaGFuZ2VkIGJyYW5jaCcKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdDOiB2ZXJpZnkgcGFjaycgXAorCSdmb3IgcCBpbiAuZ2l0L29iamVjdHMvcGFjay8qLnBhY2s7ZG8gZ2l0IHZlcmlmeS1wYWNrICRwfHxleGl0O2RvbmUnCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknQzogdmFsaWRhdGUgcmV1c2UgZXhpc3RpbmcgYmxvYicgXAorCSd0ZXN0ICRuZXdmID0gYGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgYnJhbmNoOmZpbGUyL25ld2ZgCisJIHRlc3QgJG9sZGYgPSBgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBicmFuY2g6ZmlsZTIvb2xkZmAnCisKK2NhdCA+ZXhwZWN0IDw8RU9GCitwYXJlbnQgYGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgbWFzdGVyXjBgCithdXRob3IgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+ICRHSVRfQ09NTUlUVEVSX0RBVEUKK2NvbW1pdHRlciAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gJEdJVF9DT01NSVRURVJfREFURQorCitzZWNvbmQKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ0M6IHZlcmlmeSBjb21taXQnIFwKKwknZ2l0IGNhdC1maWxlIGNvbW1pdCBicmFuY2ggfCBzZWQgMWQgPmFjdHVhbCAmJgorCSBnaXQgZGlmZiBleHBlY3QgYWN0dWFsJworCitjYXQgPmV4cGVjdCA8PEVPRgorOjAwMDAwMCAxMDA3NTUgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBmMWZiNWRhNzE4MzkyNjk0ZDAwNzZkNjc3ZDZkMGUzNjRjNzliMGJjIEEJZmlsZTIvbmV3ZgorOjEwMDY0NCAxMDA2NDQgNzEyM2Y3ZjQ0ZTM5YmUxMjdjNWViNzAxZTU5NjgxNzZlZTlkNzhiMSA3MTIzZjdmNDRlMzliZTEyN2M1ZWI3MDFlNTk2ODE3NmVlOWQ3OGIxIFIxMDAJZmlsZTIJZmlsZTIvb2xkZgorOjEwMDY0NCAwMDAwMDAgMGQ5MmU5ZjMzNzRhZTI5NDdjMjNhYTQ3N2NiYzY4Y2U1OTgxMzVmMSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJZmlsZTMKK0VPRgorZ2l0IGRpZmYtdHJlZSAtTSAtciBtYXN0ZXIgYnJhbmNoID5hY3R1YWwKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdDOiB2YWxpZGF0ZSByZW5hbWUgcmVzdWx0JyBcCisJJ2NvbXBhcmVfZGlmZl9yYXcgZXhwZWN0IGFjdHVhbCcKKworIyMjCisjIyMgc2VyaWVzIEQKKyMjIworCit0ZXN0X3RpY2sKK2NhdCA+aW5wdXQgPDxJTlBVVF9FTkQKK2NvbW1pdCByZWZzL2hlYWRzL2JyYW5jaAorY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCitkYXRhIDw8Q09NTUlUCit0aGlyZAorQ09NTUlUCisKK2Zyb20gcmVmcy9oZWFkcy9icmFuY2heMAorTSA2NDQgaW5saW5lIG5ld2Rpci9pbnRlcmVzdGluZworZGF0YSA8PEVPRgorJGZpbGU1X2RhdGEKK0VPRgorCitNIDc1NSBpbmxpbmUgbmV3ZGlyL2V4ZWMuc2gKK2RhdGEgPDxFT0YKKyRmaWxlNl9kYXRhCitFT0YKKworSU5QVVRfRU5ECit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnRDogaW5saW5lIGRhdGEgaW4gY29tbWl0JyBcCisgICAgJ2dpdC1mYXN0LWltcG9ydCA8aW5wdXQgJiYKKwkgZ2l0IHdoYXRjaGFuZ2VkIGJyYW5jaCcKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdEOiB2ZXJpZnkgcGFjaycgXAorCSdmb3IgcCBpbiAuZ2l0L29iamVjdHMvcGFjay8qLnBhY2s7ZG8gZ2l0IHZlcmlmeS1wYWNrICRwfHxleGl0O2RvbmUnCisKK2NhdCA+ZXhwZWN0IDw8RU9GCis6MDAwMDAwIDEwMDc1NSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDM1YTU5MDI2YTMzYmVhYzE1NjliMWM3ZjY2ZjMwOTBjZTljMDlhZmMgQQluZXdkaXIvZXhlYy5zaAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwNDZkMDM3MWU5MjIwMTA3OTE3ZGIwZDBlMDMwNjI4ZGU4YTFkZTliIEEJbmV3ZGlyL2ludGVyZXN0aW5nCitFT0YKK2dpdCBkaWZmLXRyZWUgLU0gLXIgYnJhbmNoXiBicmFuY2ggPmFjdHVhbAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ0Q6IHZhbGlkYXRlIG5ldyBmaWxlcyBhZGRlZCcgXAorCSdjb21wYXJlX2RpZmZfcmF3IGV4cGVjdCBhY3R1YWwnCisKK2VjaG8gIiRmaWxlNV9kYXRhIiA+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknRDogdmVyaWZ5IGZpbGU1JyBcCisJJ2dpdCBjYXQtZmlsZSBibG9iIGJyYW5jaDpuZXdkaXIvaW50ZXJlc3RpbmcgPmFjdHVhbCAmJgorCSBnaXQgZGlmZiBleHBlY3QgYWN0dWFsJworCitlY2hvICIkZmlsZTZfZGF0YSIgPmV4cGVjdAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ0Q6IHZlcmlmeSBmaWxlNicgXAorCSdnaXQgY2F0LWZpbGUgYmxvYiBicmFuY2g6bmV3ZGlyL2V4ZWMuc2ggPmFjdHVhbCAmJgorCSBnaXQgZGlmZiBleHBlY3QgYWN0dWFsJworCisjIyMKKyMjIyBzZXJpZXMgRQorIyMjCisKK2NhdCA+aW5wdXQgPDxJTlBVVF9FTkQKK2NvbW1pdCByZWZzL2hlYWRzL2JyYW5jaAorYXV0aG9yICRHSVRfQVVUSE9SX05BTUUgPCRHSVRfQVVUSE9SX0VNQUlMPiBUdWUgRmViIDYgMTE6MjI6MTggMjAwNyAtMDUwMAorY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiBUdWUgRmViIDYgMTI6MzU6MDIgMjAwNyAtMDUwMAorZGF0YSA8PENPTU1JVAorUkZDIDI4MjIgdHlwZSBkYXRlCitDT01NSVQKKworZnJvbSByZWZzL2hlYWRzL2JyYW5jaF4wCisKK0lOUFVUX0VORAordGVzdF9leHBlY3Rfc3VjY2VzcyAnRTogcmZjMjgyMiBkYXRlLCAtLWRhdGUtZm9ybWF0PXJhdycgJworICAgICEgZ2l0LWZhc3QtaW1wb3J0IC0tZGF0ZS1mb3JtYXQ9cmF3IDxpbnB1dAorJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0U6IHJmYzI4MjIgZGF0ZSwgLS1kYXRlLWZvcm1hdD1yZmMyODIyJyBcCisgICAgJ2dpdC1mYXN0LWltcG9ydCAtLWRhdGUtZm9ybWF0PXJmYzI4MjIgPGlucHV0JwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ0U6IHZlcmlmeSBwYWNrJyBcCisJJ2ZvciBwIGluIC5naXQvb2JqZWN0cy9wYWNrLyoucGFjaztkbyBnaXQgdmVyaWZ5LXBhY2sgJHB8fGV4aXQ7ZG9uZScKKworY2F0ID5leHBlY3QgPDxFT0YKK2F1dGhvciAkR0lUX0FVVEhPUl9OQU1FIDwkR0lUX0FVVEhPUl9FTUFJTD4gMTE3MDc3ODkzOCAtMDUwMAorY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTcwNzgzMzAyIC0wNTAwCisKK1JGQyAyODIyIHR5cGUgZGF0ZQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknRTogdmVyaWZ5IGNvbW1pdCcgXAorCSdnaXQgY2F0LWZpbGUgY29tbWl0IGJyYW5jaCB8IHNlZCAxLDJkID5hY3R1YWwgJiYKKwlnaXQgZGlmZiBleHBlY3QgYWN0dWFsJworCisjIyMKKyMjIyBzZXJpZXMgRgorIyMjCisKK29sZF9icmFuY2g9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgYnJhbmNoXjBgCit0ZXN0X3RpY2sKK2NhdCA+aW5wdXQgPDxJTlBVVF9FTkQKK2NvbW1pdCByZWZzL2hlYWRzL2JyYW5jaAorY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCitkYXRhIDw8Q09NTUlUCitsb3NpbmcgdGhpbmdzIGFscmVhZHk/CitDT01NSVQKKworZnJvbSByZWZzL2hlYWRzL2JyYW5jaH4xCisKK3Jlc2V0IHJlZnMvaGVhZHMvb3RoZXIKK2Zyb20gcmVmcy9oZWFkcy9icmFuY2gKKworSU5QVVRfRU5ECit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnRjogbm9uLWZhc3QtZm9yd2FyZCB1cGRhdGUgc2tpcHMnIFwKKyAgICAnaWYgZ2l0LWZhc3QtaW1wb3J0IDxpbnB1dAorCSB0aGVuCisJCWVjaG8gQkFEIGdmaSBkaWQgbm90IGZhaWwKKwkJcmV0dXJuIDEKKwkgZWxzZQorCQlpZiB0ZXN0ICRvbGRfYnJhbmNoID0gYGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgYnJhbmNoXjBgCisJCXRoZW4KKwkJCTogYnJhbmNoIHVuYWZmZWN0ZWQgYW5kIGZhaWx1cmUgcmV0dXJuZWQKKwkJCXJldHVybiAwCisJCWVsc2UKKwkJCWVjaG8gQkFEIGdmaSBjaGFuZ2VkIGJyYW5jaCAkb2xkX2JyYW5jaAorCQkJcmV0dXJuIDEKKwkJZmkKKwkgZmkKKwknCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknRjogdmVyaWZ5IHBhY2snIFwKKwknZm9yIHAgaW4gLmdpdC9vYmplY3RzL3BhY2svKi5wYWNrO2RvIGdpdCB2ZXJpZnktcGFjayAkcHx8ZXhpdDtkb25lJworCitjYXQgPmV4cGVjdCA8PEVPRgordHJlZSBgZ2l0IHJldi1wYXJzZSBicmFuY2h+MV57dHJlZX1gCitwYXJlbnQgYGdpdCByZXYtcGFyc2UgYnJhbmNofjFgCithdXRob3IgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+ICRHSVRfQ09NTUlUVEVSX0RBVEUKK2NvbW1pdHRlciAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gJEdJVF9DT01NSVRURVJfREFURQorCitsb3NpbmcgdGhpbmdzIGFscmVhZHk/CitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdGOiB2ZXJpZnkgb3RoZXIgY29tbWl0JyBcCisJJ2dpdCBjYXQtZmlsZSBjb21taXQgb3RoZXIgPmFjdHVhbCAmJgorCWdpdCBkaWZmIGV4cGVjdCBhY3R1YWwnCisKKyMjIworIyMjIHNlcmllcyBHCisjIyMKKworb2xkX2JyYW5jaD1gZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBicmFuY2heMGAKK3Rlc3RfdGljaworY2F0ID5pbnB1dCA8PElOUFVUX0VORAorY29tbWl0IHJlZnMvaGVhZHMvYnJhbmNoCitjb21taXR0ZXIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+ICRHSVRfQ09NTUlUVEVSX0RBVEUKK2RhdGEgPDxDT01NSVQKK2xvc2luZyB0aGluZ3MgYWxyZWFkeT8KK0NPTU1JVAorCitmcm9tIHJlZnMvaGVhZHMvYnJhbmNofjEKKworSU5QVVRfRU5ECit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnRzogbm9uLWZhc3QtZm9yd2FyZCB1cGRhdGUgZm9yY2VkJyBcCisgICAgJ2dpdC1mYXN0LWltcG9ydCAtLWZvcmNlIDxpbnB1dCcKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdHOiB2ZXJpZnkgcGFjaycgXAorCSdmb3IgcCBpbiAuZ2l0L29iamVjdHMvcGFjay8qLnBhY2s7ZG8gZ2l0IHZlcmlmeS1wYWNrICRwfHxleGl0O2RvbmUnCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknRzogYnJhbmNoIGNoYW5nZWQsIGJ1dCBsb2dnZWQnIFwKKwkndGVzdCAkb2xkX2JyYW5jaCAhPSBgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBicmFuY2heMGAgJiYKKwkgdGVzdCAkb2xkX2JyYW5jaCA9IGBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IGJyYW5jaEB7MX1gJworCisjIyMKKyMjIyBzZXJpZXMgSAorIyMjCisKK3Rlc3RfdGljaworY2F0ID5pbnB1dCA8PElOUFVUX0VORAorY29tbWl0IHJlZnMvaGVhZHMvSAorY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCitkYXRhIDw8Q09NTUlUCit0aGlyZAorQ09NTUlUCisKK2Zyb20gcmVmcy9oZWFkcy9icmFuY2heMAorTSA2NDQgaW5saW5lIGktd2lsbC1kaWUKK2RhdGEgPDxFT0YKK3RoaXMgZmlsZSB3aWxsIG5ldmVyIGV4aXN0LgorRU9GCisKK2RlbGV0ZWFsbAorTSA2NDQgaW5saW5lIGgvZS9sL2xvCitkYXRhIDw8RU9GCiskZmlsZTVfZGF0YQorRU9GCisKK0lOUFVUX0VORAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0g6IGRlbGV0YWxsLCBhZGQgMScgXAorICAgICdnaXQtZmFzdC1pbXBvcnQgPGlucHV0ICYmCisJIGdpdCB3aGF0Y2hhbmdlZCBIJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ0g6IHZlcmlmeSBwYWNrJyBcCisJJ2ZvciBwIGluIC5naXQvb2JqZWN0cy9wYWNrLyoucGFjaztkbyBnaXQgdmVyaWZ5LXBhY2sgJHB8fGV4aXQ7ZG9uZScKKworY2F0ID5leHBlY3QgPDxFT0YKKzoxMDA3NTUgMDAwMDAwIGYxZmI1ZGE3MTgzOTI2OTRkMDA3NmQ2NzdkNmQwZTM2NGM3OWIwYmMgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECWZpbGUyL25ld2YKKzoxMDA2NDQgMDAwMDAwIDcxMjNmN2Y0NGUzOWJlMTI3YzVlYjcwMWU1OTY4MTc2ZWU5ZDc4YjEgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECWZpbGUyL29sZGYKKzoxMDA3NTUgMDAwMDAwIDg1ZGY1MDc4NWQ2MmQzYjA1YWIwM2Q5Y2JmN2U0YTBiNDk0NDk3MzAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECWZpbGU0Cis6MTAwNjQ0IDEwMDY0NCBmY2Y3NzhjZGExODFlYWExY2JjOWU5Y2UzYTJlMTVlZTlmOWZlNzkxIGZjZjc3OGNkYTE4MWVhYTFjYmM5ZTljZTNhMmUxNWVlOWY5ZmU3OTEgUjEwMAluZXdkaXIvaW50ZXJlc3RpbmcJaC9lL2wvbG8KKzoxMDA3NTUgMDAwMDAwIGU3NGI3ZDQ2NWU1Mjc0NmJlMmI0YmFlOTgzNjcwNzExZTZlNjY2NTcgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECW5ld2Rpci9leGVjLnNoCitFT0YKK2dpdCBkaWZmLXRyZWUgLU0gLXIgSF4gSCA+YWN0dWFsCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknSDogdmFsaWRhdGUgb2xkIGZpbGVzIHJlbW92ZWQsIG5ldyBmaWxlcyBhZGRlZCcgXAorCSdjb21wYXJlX2RpZmZfcmF3IGV4cGVjdCBhY3R1YWwnCisKK2VjaG8gIiRmaWxlNV9kYXRhIiA+ZXhwZWN0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknSDogdmVyaWZ5IGZpbGUnIFwKKwknZ2l0IGNhdC1maWxlIGJsb2IgSDpoL2UvbC9sbyA+YWN0dWFsICYmCisJIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwnCisKKyMjIworIyMjIHNlcmllcyBJCisjIyMKKworY2F0ID5pbnB1dCA8PElOUFVUX0VORAorY29tbWl0IHJlZnMvaGVhZHMvZXhwb3J0LWJvdW5kYXJ5Citjb21taXR0ZXIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+ICRHSVRfQ09NTUlUVEVSX0RBVEUKK2RhdGEgPDxDT01NSVQKK3dlIGhhdmUgYSBib3JkZXIuICBpdHMgb25seSA0MCBjaGFyYWN0ZXJzIHdpZGUuCitDT01NSVQKKworZnJvbSByZWZzL2hlYWRzL2JyYW5jaAorCitJTlBVVF9FTkQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdJOiBleHBvcnQtcGFjay1lZGdlcycgXAorICAgICdnaXQtZmFzdC1pbXBvcnQgLS1leHBvcnQtcGFjay1lZGdlcz1lZGdlcy5saXN0IDxpbnB1dCcKKworY2F0ID5leHBlY3QgPDxFT0YKKy5naXQvb2JqZWN0cy9wYWNrL3BhY2stLnBhY2s6IGBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IGV4cG9ydC1ib3VuZGFyeWAKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ0k6IHZlcmlmeSBlZGdlIGxpc3QnIFwKKwknc2VkIC1lIHMvcGFjay0uKnBhY2svcGFjay0ucGFjay8gZWRnZXMubGlzdCA+YWN0dWFsICYmCisJIGdpdCBkaWZmIGV4cGVjdCBhY3R1YWwnCisKKyMjIworIyMjIHNlcmllcyBKCisjIyMKKworY2F0ID5pbnB1dCA8PElOUFVUX0VORAorY29tbWl0IHJlZnMvaGVhZHMvSgorY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCitkYXRhIDw8Q09NTUlUCitjcmVhdGUgSgorQ09NTUlUCisKK2Zyb20gcmVmcy9oZWFkcy9icmFuY2gKKworcmVzZXQgcmVmcy9oZWFkcy9KCisKK2NvbW1pdCByZWZzL2hlYWRzL0oKK2NvbW1pdHRlciAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gJEdJVF9DT01NSVRURVJfREFURQorZGF0YSA8PENPTU1JVAoraW5pdGlhbGl6ZSBKCitDT01NSVQKKworSU5QVVRfRU5ECit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnSjogcmVzZXQgZXhpc3RpbmcgYnJhbmNoIGNyZWF0ZXMgZW1wdHkgY29tbWl0JyBcCisgICAgJ2dpdC1mYXN0LWltcG9ydCA8aW5wdXQnCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknSjogYnJhbmNoIGhhcyAxIGNvbW1pdCwgZW1wdHkgdHJlZScgXAorCSd0ZXN0IDEgPSBgZ2l0IHJldi1saXN0IEogfCB3YyAtbGAgJiYKKwkgdGVzdCAwID0gYGdpdCBscy10cmVlIEogfCB3YyAtbGAnCisKKyMjIworIyMjIHNlcmllcyBLCisjIyMKKworY2F0ID5pbnB1dCA8PElOUFVUX0VORAorY29tbWl0IHJlZnMvaGVhZHMvSworY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCitkYXRhIDw8Q09NTUlUCitjcmVhdGUgSworQ09NTUlUCisKK2Zyb20gcmVmcy9oZWFkcy9icmFuY2gKKworY29tbWl0IHJlZnMvaGVhZHMvSworY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCitkYXRhIDw8Q09NTUlUCityZWRvIEsKK0NPTU1JVAorCitmcm9tIHJlZnMvaGVhZHMvYnJhbmNoXjEKKworSU5QVVRfRU5ECit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnSzogcmVpbml0IGJyYW5jaCB3aXRoIGZyb20nIFwKKyAgICAnZ2l0LWZhc3QtaW1wb3J0IDxpbnB1dCcKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdLOiB2ZXJpZnkgS14xID0gYnJhbmNoXjEnIFwKKyAgICAndGVzdCBgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBicmFuY2heMWAgXAorCQk9IGBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEteMWAnCisKKyMjIworIyMjIHNlcmllcyBMCisjIyMKKworY2F0ID5pbnB1dCA8PElOUFVUX0VORAorYmxvYgorbWFyayA6MQorZGF0YSA8PEVPRgorc29tZSBkYXRhCitFT0YKKworYmxvYgorbWFyayA6MgorZGF0YSA8PEVPRgorb3RoZXIgZGF0YQorRU9GCisKK2NvbW1pdCByZWZzL2hlYWRzL0wKK2NvbW1pdHRlciAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gJEdJVF9DT01NSVRURVJfREFURQorZGF0YSA8PENPTU1JVAorY3JlYXRlIEwKK0NPTU1JVAorCitNIDY0NCA6MSBiLgorTSA2NDQgOjEgYi9vdGhlcgorTSA2NDQgOjEgYmEKKworY29tbWl0IHJlZnMvaGVhZHMvTAorY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCitkYXRhIDw8Q09NTUlUCit1cGRhdGUgTAorQ09NTUlUCisKK00gNjQ0IDoyIGIuCitNIDY0NCA6MiBiL290aGVyCitNIDY0NCA6MiBiYQorSU5QVVRfRU5ECisKK2NhdCA+ZXhwZWN0IDw8RVhQRUNUX0VORAorOjEwMDY0NCAxMDA2NDQgNDI2ODYzMi4uLiA1NWQzYTUyLi4uIE0JYi4KKzowNDAwMDAgMDQwMDAwIDBhZTVjYWMuLi4gNDQzYzc2OC4uLiBNCWIKKzoxMDA2NDQgMTAwNjQ0IDQyNjg2MzIuLi4gNTVkM2E1Mi4uLiBNCWJhCitFWFBFQ1RfRU5ECisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdMOiB2ZXJpZnkgaW50ZXJuYWwgdHJlZSBzb3J0aW5nJyBcCisJJ2dpdC1mYXN0LWltcG9ydCA8aW5wdXQgJiYKKwkgZ2l0IGRpZmYtdHJlZSAtLWFiYnJldiAtLXJhdyBMXiBMID5vdXRwdXQgJiYKKwkgZ2l0IGRpZmYgZXhwZWN0IG91dHB1dCcKKworIyMjCisjIyMgc2VyaWVzIE0KKyMjIworCit0ZXN0X3RpY2sKK2NhdCA+aW5wdXQgPDxJTlBVVF9FTkQKK2NvbW1pdCByZWZzL2hlYWRzL00xCitjb21taXR0ZXIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+ICRHSVRfQ09NTUlUVEVSX0RBVEUKK2RhdGEgPDxDT01NSVQKK2ZpbGUgcmVuYW1lCitDT01NSVQKKworZnJvbSByZWZzL2hlYWRzL2JyYW5jaF4wCitSIGZpbGUyL25ld2YgZmlsZTIvbi5lLncuZgorCitJTlBVVF9FTkQKKworY2F0ID5leHBlY3QgPDxFT0YKKzoxMDA3NTUgMTAwNzU1IGYxZmI1ZGE3MTgzOTI2OTRkMDA3NmQ2NzdkNmQwZTM2NGM3OWIwYmMgZjFmYjVkYTcxODM5MjY5NGQwMDc2ZDY3N2Q2ZDBlMzY0Yzc5YjBiYyBSMTAwCWZpbGUyL25ld2YJZmlsZTIvbi5lLncuZgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknTTogcmVuYW1lIGZpbGUgaW4gc2FtZSBzdWJkaXJlY3RvcnknIFwKKwknZ2l0LWZhc3QtaW1wb3J0IDxpbnB1dCAmJgorCSBnaXQgZGlmZi10cmVlIC1NIC1yIE0xXiBNMSA+YWN0dWFsICYmCisJIGNvbXBhcmVfZGlmZl9yYXcgZXhwZWN0IGFjdHVhbCcKKworY2F0ID5pbnB1dCA8PElOUFVUX0VORAorY29tbWl0IHJlZnMvaGVhZHMvTTIKK2NvbW1pdHRlciAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gJEdJVF9DT01NSVRURVJfREFURQorZGF0YSA8PENPTU1JVAorZmlsZSByZW5hbWUKK0NPTU1JVAorCitmcm9tIHJlZnMvaGVhZHMvYnJhbmNoXjAKK1IgZmlsZTIvbmV3ZiBpL2FtL25ldy90by95b3UKKworSU5QVVRfRU5ECisKK2NhdCA+ZXhwZWN0IDw8RU9GCis6MTAwNzU1IDEwMDc1NSBmMWZiNWRhNzE4MzkyNjk0ZDAwNzZkNjc3ZDZkMGUzNjRjNzliMGJjIGYxZmI1ZGE3MTgzOTI2OTRkMDA3NmQ2NzdkNmQwZTM2NGM3OWIwYmMgUjEwMAlmaWxlMi9uZXdmCWkvYW0vbmV3L3RvL3lvdQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknTTogcmVuYW1lIGZpbGUgdG8gbmV3IHN1YmRpcmVjdG9yeScgXAorCSdnaXQtZmFzdC1pbXBvcnQgPGlucHV0ICYmCisJIGdpdCBkaWZmLXRyZWUgLU0gLXIgTTJeIE0yID5hY3R1YWwgJiYKKwkgY29tcGFyZV9kaWZmX3JhdyBleHBlY3QgYWN0dWFsJworCitjYXQgPmlucHV0IDw8SU5QVVRfRU5ECitjb21taXQgcmVmcy9oZWFkcy9NMworY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCitkYXRhIDw8Q09NTUlUCitmaWxlIHJlbmFtZQorQ09NTUlUCisKK2Zyb20gcmVmcy9oZWFkcy9NMl4wCitSIGkgb3RoZXIvc3ViCisKK0lOUFVUX0VORAorCitjYXQgPmV4cGVjdCA8PEVPRgorOjEwMDc1NSAxMDA3NTUgZjFmYjVkYTcxODM5MjY5NGQwMDc2ZDY3N2Q2ZDBlMzY0Yzc5YjBiYyBmMWZiNWRhNzE4MzkyNjk0ZDAwNzZkNjc3ZDZkMGUzNjRjNzliMGJjIFIxMDAJaS9hbS9uZXcvdG8veW91CW90aGVyL3N1Yi9hbS9uZXcvdG8veW91CitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdNOiByZW5hbWUgc3ViZGlyZWN0b3J5IHRvIG5ldyBzdWJkaXJlY3RvcnknIFwKKwknZ2l0LWZhc3QtaW1wb3J0IDxpbnB1dCAmJgorCSBnaXQgZGlmZi10cmVlIC1NIC1yIE0zXiBNMyA+YWN0dWFsICYmCisJIGNvbXBhcmVfZGlmZl9yYXcgZXhwZWN0IGFjdHVhbCcKKworIyMjCisjIyMgc2VyaWVzIE4KKyMjIworCit0ZXN0X3RpY2sKK2NhdCA+aW5wdXQgPDxJTlBVVF9FTkQKK2NvbW1pdCByZWZzL2hlYWRzL04xCitjb21taXR0ZXIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+ICRHSVRfQ09NTUlUVEVSX0RBVEUKK2RhdGEgPDxDT01NSVQKK2ZpbGUgY29weQorQ09NTUlUCisKK2Zyb20gcmVmcy9oZWFkcy9icmFuY2heMAorQyBmaWxlMi9uZXdmIGZpbGUyL24uZS53LmYKKworSU5QVVRfRU5ECisKK2NhdCA+ZXhwZWN0IDw8RU9GCis6MTAwNzU1IDEwMDc1NSBmMWZiNWRhNzE4MzkyNjk0ZDAwNzZkNjc3ZDZkMGUzNjRjNzliMGJjIGYxZmI1ZGE3MTgzOTI2OTRkMDA3NmQ2NzdkNmQwZTM2NGM3OWIwYmMgQzEwMAlmaWxlMi9uZXdmCWZpbGUyL24uZS53LmYKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ046IGNvcHkgZmlsZSBpbiBzYW1lIHN1YmRpcmVjdG9yeScgXAorCSdnaXQtZmFzdC1pbXBvcnQgPGlucHV0ICYmCisJIGdpdCBkaWZmLXRyZWUgLUMgLS1maW5kLWNvcGllcy1oYXJkZXIgLXIgTjFeIE4xID5hY3R1YWwgJiYKKwkgY29tcGFyZV9kaWZmX3JhdyBleHBlY3QgYWN0dWFsJworCitjYXQgPmlucHV0IDw8SU5QVVRfRU5ECitjb21taXQgcmVmcy9oZWFkcy9OMgorY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCitkYXRhIDw8Q09NTUlUCitjbGVhbiBkaXJlY3RvcnkgY29weQorQ09NTUlUCisKK2Zyb20gcmVmcy9oZWFkcy9icmFuY2heMAorQyBmaWxlMiBmaWxlMworCitjb21taXQgcmVmcy9oZWFkcy9OMgorY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCitkYXRhIDw8Q09NTUlUCittb2RpZnkgZGlyZWN0b3J5IGNvcHkKK0NPTU1JVAorCitNIDY0NCBpbmxpbmUgZmlsZTMvZmlsZTUKK2RhdGEgPDxFT0YKKyRmaWxlNV9kYXRhCitFT0YKKworSU5QVVRfRU5ECisKK2NhdCA+ZXhwZWN0IDw8RU9GCis6MTAwNjQ0IDEwMDY0NCBmY2Y3NzhjZGExODFlYWExY2JjOWU5Y2UzYTJlMTVlZTlmOWZlNzkxIGZjZjc3OGNkYTE4MWVhYTFjYmM5ZTljZTNhMmUxNWVlOWY5ZmU3OTEgQzEwMAluZXdkaXIvaW50ZXJlc3RpbmcJZmlsZTMvZmlsZTUKKzoxMDA3NTUgMTAwNzU1IGYxZmI1ZGE3MTgzOTI2OTRkMDA3NmQ2NzdkNmQwZTM2NGM3OWIwYmMgZjFmYjVkYTcxODM5MjY5NGQwMDc2ZDY3N2Q2ZDBlMzY0Yzc5YjBiYyBDMTAwCWZpbGUyL25ld2YJZmlsZTMvbmV3ZgorOjEwMDY0NCAxMDA2NDQgNzEyM2Y3ZjQ0ZTM5YmUxMjdjNWViNzAxZTU5NjgxNzZlZTlkNzhiMSA3MTIzZjdmNDRlMzliZTEyN2M1ZWI3MDFlNTk2ODE3NmVlOWQ3OGIxIEMxMDAJZmlsZTIvb2xkZglmaWxlMy9vbGRmCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdOOiBjb3B5IHRoZW4gbW9kaWZ5IHN1YmRpcmVjdG9yeScgXAorCSdnaXQtZmFzdC1pbXBvcnQgPGlucHV0ICYmCisJIGdpdCBkaWZmLXRyZWUgLUMgLS1maW5kLWNvcGllcy1oYXJkZXIgLXIgTjJeXiBOMiA+YWN0dWFsICYmCisJIGNvbXBhcmVfZGlmZl9yYXcgZXhwZWN0IGFjdHVhbCcKKworY2F0ID5pbnB1dCA8PElOUFVUX0VORAorY29tbWl0IHJlZnMvaGVhZHMvTjMKK2NvbW1pdHRlciAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gJEdJVF9DT01NSVRURVJfREFURQorZGF0YSA8PENPTU1JVAorZGlydHkgZGlyZWN0b3J5IGNvcHkKK0NPTU1JVAorCitmcm9tIHJlZnMvaGVhZHMvYnJhbmNoXjAKK00gNjQ0IGlubGluZSBmaWxlMi9maWxlNQorZGF0YSA8PEVPRgorJGZpbGU1X2RhdGEKK0VPRgorCitDIGZpbGUyIGZpbGUzCitEIGZpbGUyL2ZpbGU1CisKK0lOUFVUX0VORAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknTjogY29weSBkaXJ0eSBzdWJkaXJlY3RvcnknIFwKKwknZ2l0LWZhc3QtaW1wb3J0IDxpbnB1dCAmJgorCSB0ZXN0IGBnaXQtcmV2LXBhcnNlIE4yXnt0cmVlfWAgPSBgZ2l0LXJldi1wYXJzZSBOM157dHJlZX1gJworCisjIyMKKyMjIyBzZXJpZXMgTworIyMjCisKK2NhdCA+aW5wdXQgPDxJTlBVVF9FTkQKKyN3ZSB3aWxsCitjb21taXQgcmVmcy9oZWFkcy9PMQorIyAtLSBpZ25vcmUgYWxsIG9mIHRoaXMgdGV4dAorY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCisjICRHSVRfQ09NTUlUVEVSX05BTUUgaGFzIGluc2VydGVkIGhlcmUgZm9yIGhpcyBiZW5lZml0LgorZGF0YSA8PENPTU1JVAorZGlydHkgZGlyZWN0b3J5IGNvcHkKK0NPTU1JVAorCisjIGRvbid0IGZvcmdldCB0aGUgaW1wb3J0IGJsYW5rIGxpbmUhCisjCisjIHllcywgd2Ugc3RhcnRlZCBmcm9tIG91ciB1c3VhbCBiYXNlIG9mIGJyYW5jaF4wLgorIyBpIGxpa2UgYnJhbmNoXjAuCitmcm9tIHJlZnMvaGVhZHMvYnJhbmNoXjAKKyMgYW5kIHdlIG5lZWQgdG8gcmV1c2UgZmlsZTIvZmlsZTUgZnJvbSBOMyBhYm92ZS4KK00gNjQ0IGlubGluZSBmaWxlMi9maWxlNQorIyBvdGhlcndpc2UgdGhlIHRyZWUgd2lsbCBiZSBkaWZmZXJlbnQKK2RhdGEgPDxFT0YKKyRmaWxlNV9kYXRhCitFT0YKKworIyBkb24ndCBmb3JnZXQgdG8gY29weSBmaWxlMiB0byBmaWxlMworQyBmaWxlMiBmaWxlMworIworIyBvciB0byBkZWxldGUgZmlsZTUgZnJvbSBmaWxlMi4KK0QgZmlsZTIvZmlsZTUKKyMgYXJlIHdlIGRvbmUgeWV0PworCitJTlBVVF9FTkQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ086IGNvbW1lbnRzIGFyZSBhbGwgc2tpcHBlZCcgXAorCSdnaXQtZmFzdC1pbXBvcnQgPGlucHV0ICYmCisJIHRlc3QgYGdpdC1yZXYtcGFyc2UgTjNgID0gYGdpdC1yZXYtcGFyc2UgTzFgJworCitjYXQgPmlucHV0IDw8SU5QVVRfRU5ECitjb21taXQgcmVmcy9oZWFkcy9PMgorY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCitkYXRhIDw8Q09NTUlUCitkaXJ0eSBkaXJlY3RvcnkgY29weQorQ09NTUlUCitmcm9tIHJlZnMvaGVhZHMvYnJhbmNoXjAKK00gNjQ0IGlubGluZSBmaWxlMi9maWxlNQorZGF0YSA8PEVPRgorJGZpbGU1X2RhdGEKK0VPRgorQyBmaWxlMiBmaWxlMworRCBmaWxlMi9maWxlNQorCitJTlBVVF9FTkQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ086IGJsYW5rIGxpbmVzIG5vdCBuZWNlc3NhcnkgYWZ0ZXIgZGF0YSBjb21tYW5kcycgXAorCSdnaXQtZmFzdC1pbXBvcnQgPGlucHV0ICYmCisJIHRlc3QgYGdpdC1yZXYtcGFyc2UgTjNgID0gYGdpdC1yZXYtcGFyc2UgTzJgJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknTzogcmVwYWNrIGJlZm9yZSBuZXh0IHRlc3QnIFwKKwknZ2l0IHJlcGFjayAtYSAtZCcKKworY2F0ID5pbnB1dCA8PElOUFVUX0VORAorY29tbWl0IHJlZnMvaGVhZHMvTzMKK2NvbW1pdHRlciAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gJEdJVF9DT01NSVRURVJfREFURQorZGF0YSA8PENPTU1JVAorenN0cmluZworQ09NTUlUCitjb21taXQgcmVmcy9oZWFkcy9PMworY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCitkYXRhIDw8Q09NTUlUCit6b2YKK0NPTU1JVAorY2hlY2twb2ludAorY29tbWl0IHJlZnMvaGVhZHMvTzMKK21hcmsgOjUKK2NvbW1pdHRlciAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gJEdJVF9DT01NSVRURVJfREFURQorZGF0YSA8PENPTU1JVAoremVtcHR5CitDT01NSVQKK2NoZWNrcG9pbnQKK2NvbW1pdCByZWZzL2hlYWRzL08zCitjb21taXR0ZXIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+ICRHSVRfQ09NTUlUVEVSX0RBVEUKK2RhdGEgPDxDT01NSVQKK3pjb21taXRzCitDT01NSVQKK3Jlc2V0IHJlZnMvdGFncy9PMy0ybmQKK2Zyb20gOjUKK3Jlc2V0IHJlZnMvdGFncy9PMy0zcmQKK2Zyb20gOjUKK0lOUFVUX0VORAorCitjYXQgPmV4cGVjdCA8PElOUFVUX0VORAorc3RyaW5nCitvZgorZW1wdHkKK2NvbW1pdHMKK0lOUFVUX0VORAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ086IGJsYW5rIGxpbmVzIG5vdCBuZWNlc3NhcnkgYWZ0ZXIgb3RoZXIgY29tbWFuZHMnIFwKKwknZ2l0LWZhc3QtaW1wb3J0IDxpbnB1dCAmJgorCSB0ZXN0IDggPSBgZmluZCAuZ2l0L29iamVjdHMvcGFjayAtdHlwZSBmIHwgd2MgLWxgICYmCisJIHRlc3QgYGdpdCByZXYtcGFyc2UgcmVmcy90YWdzL08zLTJuZGAgPSBgZ2l0IHJldi1wYXJzZSBPM15gICYmCisJIGdpdCBsb2cgLS1yZXZlcnNlIC0tcHJldHR5PW9uZWxpbmUgTzMgfCBzZWQgcy9eLip6Ly8gPmFjdHVhbCAmJgorCSBnaXQgZGlmZiBleHBlY3QgYWN0dWFsJworCitjYXQgPmlucHV0IDw8SU5QVVRfRU5ECitjb21taXQgcmVmcy9oZWFkcy9PNAorY29tbWl0dGVyICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAkR0lUX0NPTU1JVFRFUl9EQVRFCitkYXRhIDw8Q09NTUlUCit6c3RyaW5nCitDT01NSVQKK2NvbW1pdCByZWZzL2hlYWRzL080Citjb21taXR0ZXIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+ICRHSVRfQ09NTUlUVEVSX0RBVEUKK2RhdGEgPDxDT01NSVQKK3pvZgorQ09NTUlUCitwcm9ncmVzcyBUd28gY29tbWl0cyBkb3duLCAyIHRvIGdvIQorY29tbWl0IHJlZnMvaGVhZHMvTzQKK2NvbW1pdHRlciAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gJEdJVF9DT01NSVRURVJfREFURQorZGF0YSA8PENPTU1JVAoremVtcHR5CitDT01NSVQKK3Byb2dyZXNzIFRocmVlIGNvbW1pdHMgZG93biwgMSB0byBnbyEKK2NvbW1pdCByZWZzL2hlYWRzL080Citjb21taXR0ZXIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+ICRHSVRfQ09NTUlUVEVSX0RBVEUKK2RhdGEgPDxDT01NSVQKK3pjb21taXRzCitDT01NSVQKK3Byb2dyZXNzIEknbSBkb25lIQorSU5QVVRfRU5ECit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknTzogcHJvZ3Jlc3Mgb3V0cHV0cyBhcyByZXF1ZXN0ZWQgYnkgaW5wdXQnIFwKKwknZ2l0LWZhc3QtaW1wb3J0IDxpbnB1dCA+YWN0dWFsICYmCisJIGdyZXAgInByb2dyZXNzICIgPGlucHV0ID5leHBlY3QgJiYKKwkgZ2l0IGRpZmYgZXhwZWN0IGFjdHVhbCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q5MzAxLWZhc3QtZXhwb3J0LnNoIGIvdC90OTMwMS1mYXN0LWV4cG9ydC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMDliZmIxCi0tLSAvZGV2L251bGwKKysrIGIvdC90OTMwMS1mYXN0LWV4cG9ydC5zaApAQCAtMCwwICsxLDEyMyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBKb2hhbm5lcyBFLiBTY2hpbmRlbGluCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1mYXN0LWV4cG9ydCcKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCcgJworCisJZWNobyBXb2hsYXVmID4gZmlsZSAmJgorCWdpdCBhZGQgZmlsZSAmJgorCXRlc3RfdGljayAmJgorCWdpdCBjb21taXQgLW0gaW5pdGlhbCAmJgorCWVjaG8gZGllIEx1ZnQgPiBmaWxlICYmCisJZWNobyBnZWh0IGZyaXNjaCA+IGZpbGUyICYmCisJZ2l0IGFkZCBmaWxlIGZpbGUyICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSBzZWNvbmQgJiYKKwllY2hvIHVuZCA+IGZpbGUyICYmCisJdGVzdF90aWNrICYmCisJZ2l0IGNvbW1pdCAtbSB0aGlyZCBmaWxlMiAmJgorCXRlc3RfdGljayAmJgorCWdpdCB0YWcgcmVpbiAmJgorCWdpdCBjaGVja291dCAtYiB3ZXIgSEVBRF4gJiYKKwllY2hvIGxhbmdlID4gZmlsZTIKKwl0ZXN0X3RpY2sgJiYKKwlnaXQgY29tbWl0IC1tIHNpdHp0IGZpbGUyICYmCisJdGVzdF90aWNrICYmCisJZ2l0IHRhZyAtYSAtbSB2YWxlbnRpbiBtdXNzICYmCisJZ2l0IG1lcmdlIC1zIG91cnMgbWFzdGVyCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmFzdC1leHBvcnQgfCBmYXN0LWltcG9ydCcgJworCisJTUFTVEVSPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBtYXN0ZXIpICYmCisJUkVJTj0kKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgcmVpbikgJiYKKwlXRVI9JChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IHdlcikgJiYKKwlNVVNTPSQoZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBtdXNzKSAmJgorCW1rZGlyIG5ldyAmJgorCWdpdCAtLWdpdC1kaXI9bmV3Ly5naXQgaW5pdCAmJgorCWdpdCBmYXN0LWV4cG9ydCAtLWFsbCB8CisJKGNkIG5ldyAmJgorCSBnaXQgZmFzdC1pbXBvcnQgJiYKKwkgdGVzdCAkTUFTVEVSID0gJChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IHJlZnMvaGVhZHMvbWFzdGVyKSAmJgorCSB0ZXN0ICRSRUlOID0gJChnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IHJlZnMvdGFncy9yZWluKSAmJgorCSB0ZXN0ICRXRVIgPSAkKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgcmVmcy9oZWFkcy93ZXIpICYmCisJIHRlc3QgJE1VU1MgPSAkKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgcmVmcy90YWdzL211c3MpKQorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Zhc3QtZXhwb3J0IG1hc3Rlcn4yLi5tYXN0ZXInICcKKworCWdpdCBmYXN0LWV4cG9ydCBtYXN0ZXJ+Mi4ubWFzdGVyIHwKKwkJc2VkICJzL21hc3Rlci9wYXJ0aWFsLyIgfAorCQkoY2QgbmV3ICYmCisJCSBnaXQgZmFzdC1pbXBvcnQgJiYKKwkJIHRlc3QgJE1BU1RFUiAhPSAkKGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgcmVmcy9oZWFkcy9wYXJ0aWFsKSAmJgorCQkgZ2l0IGRpZmYgbWFzdGVyLi5wYXJ0aWFsICYmCisJCSBnaXQgZGlmZiBtYXN0ZXJeLi5wYXJ0aWFsXiAmJgorCQkgISBnaXQgcmV2LXBhcnNlIHBhcnRpYWx+MikKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpc28tODg1OS0xJyAnCisKKwlnaXQgY29uZmlnIGkxOG4uY29tbWl0ZW5jb2RpbmcgSVNPLTg4NTktMSAmJgorCSMgdXNlIGF1dGhvciBhbmQgY29tbWl0dGVyIG5hbWUgaW4gSVNPLTg4NTktMSB0byBtYXRjaCBpdC4KKwkuIC4uL3QzOTAxLTg4NTktMS50eHQgJiYKKwl0ZXN0X3RpY2sgJiYKKwllY2hvIHJvc3RlbiA+ZmlsZSAmJgorCWdpdCBjb21taXQgLXMgLW0gZGVuIGZpbGUgJiYKKwlnaXQgZmFzdC1leHBvcnQgd2VyXi4ud2VyIHwKKwkJc2VkICJzL3dlci9pMThuLyIgfAorCQkoY2QgbmV3ICYmCisJCSBnaXQgZmFzdC1pbXBvcnQgJiYKKwkJIGdpdCBjYXQtZmlsZSBjb21taXQgaTE4biB8IGdyZXAgIsOBw6nDrSDDs8O6IikKKworJworCitjYXQgPiBzaWduZWQtdGFnLWltcG9ydCA8PCBFT0YKK3RhZyBzaWduLXlvdXItbmFtZQorZnJvbSAkKGdpdCByZXYtcGFyc2UgSEVBRCkKK3RhZ2dlciBDIE8gTWl0dGVyIDxjb21taXR0ZXJAZXhhbXBsZS5jb20+IDExMTI5MTE5OTMgLTA3MDAKK2RhdGEgMjEwCitBIG1lc3NhZ2UgZm9yIGEgc2lnbgorLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0KK1ZlcnNpb246IEdudVBHIHYxLjQuNSAoR05VL0xpbnV4KQorCitmYWtlZHNpZ25hdHVyZWZha2Vkc2lnbmF0dXJlZmFrZWRzaWduYXR1cmVmYWtlZHNpZ25hdHVyZmFrZWRzaWduCithdHVyZWZha2Vkc2lnbmF0dXJlZmFrZT0KKz0vNTl2CistLS0tLUVORCBQR1AgU0lHTkFUVVJFLS0tLS0KK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXQgdXAgZmFrZWQgc2lnbmVkIHRhZycgJworCisJY2F0IHNpZ25lZC10YWctaW1wb3J0IHwgZ2l0IGZhc3QtaW1wb3J0CisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2lnbmVkLXRhZ3M9YWJvcnQnICcKKworCSEgZ2l0IGZhc3QtZXhwb3J0IC0tc2lnbmVkLXRhZ3M9YWJvcnQgc2lnbi15b3VyLW5hbWUKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzaWduZWQtdGFncz12ZXJiYXRpbScgJworCisJZ2l0IGZhc3QtZXhwb3J0IC0tc2lnbmVkLXRhZ3M9dmVyYmF0aW0gc2lnbi15b3VyLW5hbWUgPiBvdXRwdXQgJiYKKwlncmVwIFBHUCBvdXRwdXQKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzaWduZWQtdGFncz1zdHJpcCcgJworCisJZ2l0IGZhc3QtZXhwb3J0IC0tc2lnbmVkLXRhZ3M9c3RyaXAgc2lnbi15b3VyLW5hbWUgPiBvdXRwdXQgJiYKKwkhIGdyZXAgUEdQIG91dHB1dAorCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90OTQwMC1naXQtY3Zzc2VydmVyLXNlcnZlci5zaCBiL3QvdDk0MDAtZ2l0LWN2c3NlcnZlci1zZXJ2ZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTY2YjQzZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDk0MDAtZ2l0LWN2c3NlcnZlci1zZXJ2ZXIuc2gKQEAgLTAsMCArMSw0NzMgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDcgRnJhbmsgTGljaHRlbmhlbGQKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWN2c3NlcnZlciBhY2Nlc3MKKwordGVzdHMgcmVhZCBhY2Nlc3MgdG8gYSBnaXQgcmVwb3NpdG9yeSB3aXRoIHRoZQorY3ZzIENMSSBjbGllbnQgdmlhIGdpdC1jdnNzZXJ2ZXIgc2VydmVyJworCisuIC4vdGVzdC1saWIuc2gKKworY3ZzID4vZGV2L251bGwgMj4mMQoraWYgdGVzdCAkPyAtbmUgMQordGhlbgorICAgIHRlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NraXBwaW5nIGdpdC1jdnNzZXJ2ZXIgdGVzdHMsIGN2cyBub3QgZm91bmQnIDoKKyAgICB0ZXN0X2RvbmUKKyAgICBleGl0CitmaQorcGVybCAtZSAndXNlIERCSTsgdXNlIERCRDo6U1FMaXRlJyA+L2Rldi9udWxsIDI+JjEgfHwgeworICAgIHRlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NraXBwaW5nIGdpdC1jdnNzZXJ2ZXIgdGVzdHMsIFBlcmwgU1FMaXRlIGludGVyZmFjZSB1bmF2YWlsYWJsZScgOgorICAgIHRlc3RfZG9uZQorICAgIGV4aXQKK30KKwordW5zZXQgR0lUX0RJUiBHSVRfQ09ORklHCitXT1JLRElSPSQocHdkKQorU0VSVkVSRElSPSQocHdkKS9naXRjdnMuZ2l0CitnaXRfY29uZmlnPSIkU0VSVkVSRElSL2NvbmZpZyIKK0NWU1JPT1Q9Ijpmb3JrOiRTRVJWRVJESVIiCitDVlNXT1JLPSIkKHB3ZCkvY3Zzd29yayIKK0NWU19TRVJWRVI9Z2l0LWN2c3NlcnZlcgorZXhwb3J0IENWU1JPT1QgQ1ZTX1NFUlZFUgorCitybSAtcmYgIiRDVlNXT1JLIiAiJFNFUlZFUkRJUiIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NldHVwJyAnCisgIGVjaG8gPmVtcHR5ICYmCisgIGdpdCBhZGQgZW1wdHkgJiYKKyAgZ2l0IGNvbW1pdCAtcSAtbSAiRmlyc3QgQ29tbWl0IiAmJgorICBta2RpciBzZWNvbmRyb290ICYmCisgICggY2Qgc2Vjb25kcm9vdCAmJgorICBnaXQgaW5pdCAmJgorICB0b3VjaCBzZWNvbmRyb290ZmlsZSAmJgorICBnaXQgYWRkIHNlY29uZHJvb3RmaWxlICYmCisgIGdpdCBjb21taXQgLW0gInNlY29uZCByb290IikgJiYKKyAgZ2l0IHB1bGwgc2Vjb25kcm9vdCBtYXN0ZXIgJiYKKyAgZ2l0IGNsb25lIC1xIC0tbG9jYWwgLS1iYXJlICIkV09SS0RJUi8uZ2l0IiAiJFNFUlZFUkRJUiIgPi9kZXYvbnVsbCAyPiYxICYmCisgIEdJVF9ESVI9IiRTRVJWRVJESVIiIGdpdCBjb25maWcgLS1ib29sIGdpdGN2cy5lbmFibGVkIHRydWUgJiYKKyAgR0lUX0RJUj0iJFNFUlZFUkRJUiIgZ2l0IGNvbmZpZyBnaXRjdnMubG9nZmlsZSAiJFNFUlZFUkRJUi9naXRjdnMubG9nIgorJworCisjIG5vdGUgdGhhdCBjdnMgZG9lc24ndCBhY2NlcHQgYWJzb2x1dGUgcGF0aG5hbWVzCisjIGFzIGFyZ3VtZW50IHRvIGNvIC1kCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdiYXNpYyBjaGVja291dCcgXAorICAnR0lUX0NPTkZJRz0iJGdpdF9jb25maWciIGN2cyAtUSBjbyAtZCBjdnN3b3JrIG1hc3RlciAmJgorICAgdGVzdCAiJChlY2hvICQoZ3JlcCAtdiBeRCBjdnN3b3JrL0NWUy9FbnRyaWVzfGN1dCAtZC8gLWYyLDMsNSB8IGhlYWQgLW4gMSkpIiA9ICJlbXB0eS8xLjEvIgorICAgdGVzdCAiJChlY2hvICQoZ3JlcCAtdiBeRCBjdnN3b3JrL0NWUy9FbnRyaWVzfGN1dCAtZC8gLWYyLDMsNSB8IHNlZCAtbmUgXCRwKSkiID0gInNlY29uZHJvb3RmaWxlLzEuMS8iJworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBTRVJWRVIgQVVUSEVOVElDQVRJT04KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2F0ID5yZXF1ZXN0LWFub255bW91cyAgPDxFT0YKK0JFR0lOIEFVVEggUkVRVUVTVAorJFNFUlZFUkRJUgorYW5vbnltb3VzCisKK0VORCBBVVRIIFJFUVVFU1QKK0VPRgorCitjYXQgPnJlcXVlc3QtZ2l0ICA8PEVPRgorQkVHSU4gQVVUSCBSRVFVRVNUCiskU0VSVkVSRElSCitnaXQKKworRU5EIEFVVEggUkVRVUVTVAorRU9GCisKK2NhdCA+bG9naW4tYW5vbnltb3VzIDw8RU9GCitCRUdJTiBWRVJJRklDQVRJT04gUkVRVUVTVAorJFNFUlZFUkRJUgorYW5vbnltb3VzCisKK0VORCBWRVJJRklDQVRJT04gUkVRVUVTVAorRU9GCisKK2NhdCA+bG9naW4tZ2l0IDw8RU9GCitCRUdJTiBWRVJJRklDQVRJT04gUkVRVUVTVAorJFNFUlZFUkRJUgorZ2l0CisKK0VORCBWRVJJRklDQVRJT04gUkVRVUVTVAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3BzZXJ2ZXIgYXV0aGVudGljYXRpb24nIFwKKyAgJ2NhdCByZXF1ZXN0LWFub255bW91cyB8IGdpdC1jdnNzZXJ2ZXIgcHNlcnZlciA+bG9nIDI+JjEgJiYKKyAgIHNlZCAtbmUgXCRwIGxvZyB8IGdyZXAgIl5JIExPVkUgWU9VJCInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3BzZXJ2ZXIgYXV0aGVudGljYXRpb24gZmFpbHVyZSAobm9uLWFub255bW91cyB1c2VyKScgXAorICAnaWYgY2F0IHJlcXVlc3QtZ2l0IHwgZ2l0LWN2c3NlcnZlciBwc2VydmVyID5sb2cgMj4mMQorICAgdGhlbgorICAgICAgIGZhbHNlCisgICBlbHNlCisgICAgICAgdHJ1ZQorICAgZmkgJiYKKyAgIHNlZCAtbmUgXCRwIGxvZyB8IGdyZXAgIl5JIEhBVEUgWU9VJCInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3BzZXJ2ZXIgYXV0aGVudGljYXRpb24gKGxvZ2luKScgXAorICAnY2F0IGxvZ2luLWFub255bW91cyB8IGdpdC1jdnNzZXJ2ZXIgcHNlcnZlciA+bG9nIDI+JjEgJiYKKyAgIHNlZCAtbmUgXCRwIGxvZyB8IGdyZXAgIl5JIExPVkUgWU9VJCInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3BzZXJ2ZXIgYXV0aGVudGljYXRpb24gZmFpbHVyZSAobG9naW4vbm9uLWFub255bW91cyB1c2VyKScgXAorICAnaWYgY2F0IGxvZ2luLWdpdCB8IGdpdC1jdnNzZXJ2ZXIgcHNlcnZlciA+bG9nIDI+JjEKKyAgIHRoZW4KKyAgICAgICBmYWxzZQorICAgZWxzZQorICAgICAgIHRydWUKKyAgIGZpICYmCisgICBzZWQgLW5lIFwkcCBsb2cgfCBncmVwICJeSSBIQVRFIFlPVSQiJworCisKKyMgbWlzdXNlIHBzZXJ2ZXIgYXV0aGVudGljYXRpb24gZm9yIHRlc3Rpbmcgb2YgcmVxX1Jvb3QKKworY2F0ID5yZXF1ZXN0LXJlbGF0aXZlICA8PEVPRgorQkVHSU4gQVVUSCBSRVFVRVNUCitnaXRjdnMuZ2l0Cithbm9ueW1vdXMKKworRU5EIEFVVEggUkVRVUVTVAorRU9GCisKK2NhdCA+cmVxdWVzdC1jb25mbGljdCAgPDxFT0YKK0JFR0lOIEFVVEggUkVRVUVTVAorJFNFUlZFUkRJUgorYW5vbnltb3VzCisKK0VORCBBVVRIIFJFUVVFU1QKK1Jvb3QgJFdPUktESVIKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZXFfUm9vdCBmYWlsdXJlIChyZWxhdGl2ZSBwYXRobmFtZSknIFwKKyAgJ2lmIGNhdCByZXF1ZXN0LXJlbGF0aXZlIHwgZ2l0LWN2c3NlcnZlciBwc2VydmVyID5sb2cgMj4mMQorICAgdGhlbgorICAgICAgIGVjaG8gdW5leHBlY3RlZCBzdWNjZXNzCisgICAgICAgZmFsc2UKKyAgIGVsc2UKKyAgICAgICB0cnVlCisgICBmaSAmJgorICAgdGFpbCBsb2cgfCBncmVwICJeZXJyb3IgMSBSb290IG11c3QgYmUgYW4gYWJzb2x1dGUgcGF0aG5hbWUkIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVxX1Jvb3QgZmFpbHVyZSAoY29uZmxpY3Rpbmcgcm9vdHMpJyBcCisgICdjYXQgcmVxdWVzdC1jb25mbGljdCB8IGdpdC1jdnNzZXJ2ZXIgcHNlcnZlciA+bG9nIDI+JjEgJiYKKyAgIHRhaWwgbG9nIHwgZ3JlcCAiXmVycm9yIDEgQ29uZmxpY3Rpbmcgcm9vdHMgc3BlY2lmaWVkJCInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlcV9Sb290IChzdHJpY3QgcGF0aHMpJyBcCisgICdjYXQgcmVxdWVzdC1hbm9ueW1vdXMgfCBnaXQtY3Zzc2VydmVyIC0tc3RyaWN0LXBhdGhzIHBzZXJ2ZXIgJFNFUlZFUkRJUiA+bG9nIDI+JjEgJiYKKyAgIHNlZCAtbmUgXCRwIGxvZyB8IGdyZXAgIl5JIExPVkUgWU9VJCInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlcV9Sb290IGZhaWx1cmUgKHN0cmljdC1wYXRocyknICcKKyAgICAhIGNhdCByZXF1ZXN0LWFub255bW91cyB8CisgICAgZ2l0LWN2c3NlcnZlciAtLXN0cmljdC1wYXRocyBwc2VydmVyICRXT1JLRElSID5sb2cgMj4mMQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZXFfUm9vdCAody9vIHN0cmljdC1wYXRocyknIFwKKyAgJ2NhdCByZXF1ZXN0LWFub255bW91cyB8IGdpdC1jdnNzZXJ2ZXIgcHNlcnZlciAkV09SS0RJUi8gPmxvZyAyPiYxICYmCisgICBzZWQgLW5lIFwkcCBsb2cgfCBncmVwICJeSSBMT1ZFIFlPVSQiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZXFfUm9vdCBmYWlsdXJlICh3L28gc3RyaWN0LXBhdGhzKScgJworICAgICEgY2F0IHJlcXVlc3QtYW5vbnltb3VzIHwKKyAgICBnaXQtY3Zzc2VydmVyIHBzZXJ2ZXIgJFdPUktESVIvZ2l0Y3ZzID5sb2cgMj4mMQorJworCitjYXQgPnJlcXVlc3QtYmFzZSAgPDxFT0YKK0JFR0lOIEFVVEggUkVRVUVTVAorL2dpdGN2cy5naXQKK2Fub255bW91cworCitFTkQgQVVUSCBSRVFVRVNUCitSb290IC9naXRjdnMuZ2l0CitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVxX1Jvb3QgKGJhc2UtcGF0aCknIFwKKyAgJ2NhdCByZXF1ZXN0LWJhc2UgfCBnaXQtY3Zzc2VydmVyIC0tc3RyaWN0LXBhdGhzIC0tYmFzZS1wYXRoICRXT1JLRElSLyBwc2VydmVyICRTRVJWRVJESVIgPmxvZyAyPiYxICYmCisgICBzZWQgLW5lIFwkcCBsb2cgfCBncmVwICJeSSBMT1ZFIFlPVSQiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZXFfUm9vdCBmYWlsdXJlIChiYXNlLXBhdGgpJyAnCisgICAgISBjYXQgcmVxdWVzdC1hbm9ueW1vdXMgfAorICAgIGdpdC1jdnNzZXJ2ZXIgLS1zdHJpY3QtcGF0aHMgLS1iYXNlLXBhdGggJFdPUktESVIgcHNlcnZlciAkU0VSVkVSRElSID5sb2cgMj4mMQorJworCitHSVRfRElSPSIkU0VSVkVSRElSIiBnaXQgY29uZmlnIC0tYm9vbCBnaXRjdnMuZW5hYmxlZCBmYWxzZSB8fCBleGl0IDEKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVxX1Jvb3QgKGV4cG9ydC1hbGwpJyBcCisgICdjYXQgcmVxdWVzdC1hbm9ueW1vdXMgfCBnaXQtY3Zzc2VydmVyIC0tZXhwb3J0LWFsbCBwc2VydmVyICRXT1JLRElSID5sb2cgMj4mMSAmJgorICAgc2VkIC1uZSBcJHAgbG9nIHwgZ3JlcCAiXkkgTE9WRSBZT1UkIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVxX1Jvb3QgZmFpbHVyZSAoZXhwb3J0LWFsbCB3L28gd2hpdGVsaXN0KScgXAorICAnISAoY2F0IHJlcXVlc3QtYW5vbnltb3VzIHwgZ2l0LWN2c3NlcnZlciAtLWV4cG9ydC1hbGwgcHNlcnZlciA+bG9nIDI+JjEgfHwgZmFsc2UpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZXFfUm9vdCAoZXZlcnl0aGluZyB0b2dldGhlciknIFwKKyAgJ2NhdCByZXF1ZXN0LWJhc2UgfCBnaXQtY3Zzc2VydmVyIC0tZXhwb3J0LWFsbCAtLXN0cmljdC1wYXRocyAtLWJhc2UtcGF0aCAkV09SS0RJUi8gcHNlcnZlciAkU0VSVkVSRElSID5sb2cgMj4mMSAmJgorICAgc2VkIC1uZSBcJHAgbG9nIHwgZ3JlcCAiXkkgTE9WRSBZT1UkIicKKworR0lUX0RJUj0iJFNFUlZFUkRJUiIgZ2l0IGNvbmZpZyAtLWJvb2wgZ2l0Y3ZzLmVuYWJsZWQgdHJ1ZSB8fCBleGl0IDEKKworIy0tLS0tLS0tLS0tLS0tCisjIENPTkZJRyBURVNUUworIy0tLS0tLS0tLS0tLS0tCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdGN2cy5lbmFibGVkID0gZmFsc2UnIFwKKyAgJ0dJVF9ESVI9IiRTRVJWRVJESVIiIGdpdCBjb25maWcgLS1ib29sIGdpdGN2cy5lbmFibGVkIGZhbHNlICYmCisgICBpZiBHSVRfQ09ORklHPSIkZ2l0X2NvbmZpZyIgY3ZzIC1RIGNvIC1kIGN2c3dvcmsyIG1hc3RlciA+Y3ZzLmxvZyAyPiYxCisgICB0aGVuCisgICAgIGVjaG8gdW5leHBlY3RlZCBjdnMgc3VjY2VzcworICAgICBmYWxzZQorICAgZWxzZQorICAgICB0cnVlCisgICBmaSAmJgorICAgZ3JlcCAiR0lUQ1ZTIGVtdWxhdGlvbiBkaXNhYmxlZCIgY3ZzLmxvZyAmJgorICAgdGVzdCAhIC1kIGN2c3dvcmsyJworCitybSAtZnIgY3Zzd29yazIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdGN2cy5leHQuZW5hYmxlZCA9IHRydWUnIFwKKyAgJ0dJVF9ESVI9IiRTRVJWRVJESVIiIGdpdCBjb25maWcgLS1ib29sIGdpdGN2cy5leHQuZW5hYmxlZCB0cnVlICYmCisgICBHSVRfRElSPSIkU0VSVkVSRElSIiBnaXQgY29uZmlnIC0tYm9vbCBnaXRjdnMuZW5hYmxlZCBmYWxzZSAmJgorICAgR0lUX0NPTkZJRz0iJGdpdF9jb25maWciIGN2cyAtUSBjbyAtZCBjdnN3b3JrMiBtYXN0ZXIgPmN2cy5sb2cgMj4mMSAmJgorICAgZGlmZiAtcSBjdnN3b3JrIGN2c3dvcmsyJworCitybSAtZnIgY3Zzd29yazIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdGN2cy5leHQuZW5hYmxlZCA9IGZhbHNlJyBcCisgICdHSVRfRElSPSIkU0VSVkVSRElSIiBnaXQgY29uZmlnIC0tYm9vbCBnaXRjdnMuZXh0LmVuYWJsZWQgZmFsc2UgJiYKKyAgIEdJVF9ESVI9IiRTRVJWRVJESVIiIGdpdCBjb25maWcgLS1ib29sIGdpdGN2cy5lbmFibGVkIHRydWUgJiYKKyAgIGlmIEdJVF9DT05GSUc9IiRnaXRfY29uZmlnIiBjdnMgLVEgY28gLWQgY3Zzd29yazIgbWFzdGVyID5jdnMubG9nIDI+JjEKKyAgIHRoZW4KKyAgICAgZWNobyB1bmV4cGVjdGVkIGN2cyBzdWNjZXNzCisgICAgIGZhbHNlCisgICBlbHNlCisgICAgIHRydWUKKyAgIGZpICYmCisgICBncmVwICJHSVRDVlMgZW11bGF0aW9uIGRpc2FibGVkIiBjdnMubG9nICYmCisgICB0ZXN0ICEgLWQgY3Zzd29yazInCisKK3JtIC1mciBjdnN3b3JrMgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0Y3ZzLmRibmFtZScgXAorICAnR0lUX0RJUj0iJFNFUlZFUkRJUiIgZ2l0IGNvbmZpZyAtLWJvb2wgZ2l0Y3ZzLmV4dC5lbmFibGVkIHRydWUgJiYKKyAgIEdJVF9ESVI9IiRTRVJWRVJESVIiIGdpdCBjb25maWcgZ2l0Y3ZzLmRibmFtZSAlR2dpdGN2cy4lYS4lbS5zcWxpdGUgJiYKKyAgIEdJVF9DT05GSUc9IiRnaXRfY29uZmlnIiBjdnMgLVEgY28gLWQgY3Zzd29yazIgbWFzdGVyID5jdnMubG9nIDI+JjEgJiYKKyAgIGRpZmYgLXEgY3Zzd29yayBjdnN3b3JrMiAmJgorICAgdGVzdCAtZiAiJFNFUlZFUkRJUi9naXRjdnMuZXh0Lm1hc3Rlci5zcWxpdGUiICYmCisgICBjbXAgIiRTRVJWRVJESVIvZ2l0Y3ZzLm1hc3Rlci5zcWxpdGUiICIkU0VSVkVSRElSL2dpdGN2cy5leHQubWFzdGVyLnNxbGl0ZSInCisKK3JtIC1mciBjdnN3b3JrMgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0Y3ZzLmV4dC5kYm5hbWUnIFwKKyAgJ0dJVF9ESVI9IiRTRVJWRVJESVIiIGdpdCBjb25maWcgLS1ib29sIGdpdGN2cy5leHQuZW5hYmxlZCB0cnVlICYmCisgICBHSVRfRElSPSIkU0VSVkVSRElSIiBnaXQgY29uZmlnIGdpdGN2cy5leHQuZGJuYW1lICVHZ2l0Y3ZzMS4lYS4lbS5zcWxpdGUgJiYKKyAgIEdJVF9ESVI9IiRTRVJWRVJESVIiIGdpdCBjb25maWcgZ2l0Y3ZzLmRibmFtZSAlR2dpdGN2czIuJWEuJW0uc3FsaXRlICYmCisgICBHSVRfQ09ORklHPSIkZ2l0X2NvbmZpZyIgY3ZzIC1RIGNvIC1kIGN2c3dvcmsyIG1hc3RlciA+Y3ZzLmxvZyAyPiYxICYmCisgICBkaWZmIC1xIGN2c3dvcmsgY3Zzd29yazIgJiYKKyAgIHRlc3QgLWYgIiRTRVJWRVJESVIvZ2l0Y3ZzMS5leHQubWFzdGVyLnNxbGl0ZSIgJiYKKyAgIHRlc3QgISAtZiAiJFNFUlZFUkRJUi9naXRjdnMyLmV4dC5tYXN0ZXIuc3FsaXRlIiAmJgorICAgY21wICIkU0VSVkVSRElSL2dpdGN2cy5tYXN0ZXIuc3FsaXRlIiAiJFNFUlZFUkRJUi9naXRjdnMxLmV4dC5tYXN0ZXIuc3FsaXRlIicKKworCisjLS0tLS0tLS0tLS0tCisjIENWUyBVUERBVEUKKyMtLS0tLS0tLS0tLS0KKworcm0gLWZyICIkU0VSVkVSRElSIgorY2QgIiRXT1JLRElSIiAmJgorZ2l0IGNsb25lIC1xIC0tbG9jYWwgLS1iYXJlICIkV09SS0RJUi8uZ2l0IiAiJFNFUlZFUkRJUiIgPi9kZXYvbnVsbCAyPiYxICYmCitHSVRfRElSPSIkU0VSVkVSRElSIiBnaXQgY29uZmlnIC0tYm9vbCBnaXRjdnMuZW5hYmxlZCB0cnVlICYmCitHSVRfRElSPSIkU0VSVkVSRElSIiBnaXQgY29uZmlnIGdpdGN2cy5sb2dmaWxlICIkU0VSVkVSRElSL2dpdGN2cy5sb2ciIHx8CitleGl0IDEKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY3ZzIHVwZGF0ZSAoY3JlYXRlIG5ldyBmaWxlKScgXAorICAnZWNobyB0ZXN0ZmlsZTEgPnRlc3RmaWxlMSAmJgorICAgZ2l0IGFkZCB0ZXN0ZmlsZTEgJiYKKyAgIGdpdCBjb21taXQgLXEgLW0gIkFkZCB0ZXN0ZmlsZTEiICYmCisgICBnaXQgcHVzaCBnaXRjdnMuZ2l0ID4vZGV2L251bGwgJiYKKyAgIGNkIGN2c3dvcmsgJiYKKyAgIEdJVF9DT05GSUc9IiRnaXRfY29uZmlnIiBjdnMgLVEgdXBkYXRlICYmCisgICB0ZXN0ICIkKGVjaG8gJChncmVwIHRlc3RmaWxlMSBDVlMvRW50cmllc3xjdXQgLWQvIC1mMiwzLDUpKSIgPSAidGVzdGZpbGUxLzEuMS8iICYmCisgICBkaWZmIC1xIHRlc3RmaWxlMSAuLi90ZXN0ZmlsZTEnCisKK2NkICIkV09SS0RJUiIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2N2cyB1cGRhdGUgKHVwZGF0ZSBleGlzdGluZyBmaWxlKScgXAorICAnZWNobyBsaW5lIDIgPj50ZXN0ZmlsZTEgJiYKKyAgIGdpdCBhZGQgdGVzdGZpbGUxICYmCisgICBnaXQgY29tbWl0IC1xIC1tICJBcHBlbmQgdG8gdGVzdGZpbGUxIiAmJgorICAgZ2l0IHB1c2ggZ2l0Y3ZzLmdpdCA+L2Rldi9udWxsICYmCisgICBjZCBjdnN3b3JrICYmCisgICBHSVRfQ09ORklHPSIkZ2l0X2NvbmZpZyIgY3ZzIC1RIHVwZGF0ZSAmJgorICAgdGVzdCAiJChlY2hvICQoZ3JlcCB0ZXN0ZmlsZTEgQ1ZTL0VudHJpZXN8Y3V0IC1kLyAtZjIsMyw1KSkiID0gInRlc3RmaWxlMS8xLjIvIiAmJgorICAgZGlmZiAtcSB0ZXN0ZmlsZTEgLi4vdGVzdGZpbGUxJworCitjZCAiJFdPUktESVIiCisjVE9ETzogY3Zzc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCB1cGRhdGUgdy9vIC1kCit0ZXN0X2V4cGVjdF9mYWlsdXJlICJjdnMgdXBkYXRlIHcvbyAtZCBkb2Vzbid0IGNyZWF0ZSBzdWJkaXIgKFRPRE8pIiAnCisgICBta2RpciB0ZXN0ICYmCisgICBlY2hvID50ZXN0L2VtcHR5ICYmCisgICBnaXQgYWRkIHRlc3QgJiYKKyAgIGdpdCBjb21taXQgLXEgLW0gIlNpbmdsZSBTdWJkaXJlY3RvcnkiICYmCisgICBnaXQgcHVzaCBnaXRjdnMuZ2l0ID4vZGV2L251bGwgJiYKKyAgIGNkIGN2c3dvcmsgJiYKKyAgIEdJVF9DT05GSUc9IiRnaXRfY29uZmlnIiBjdnMgLVEgdXBkYXRlICYmCisgICB0ZXN0ICEgLWQgdGVzdAorJworCitjZCAiJFdPUktESVIiCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjdnMgdXBkYXRlIChzdWJkaXJlY3RvcmllcyknIFwKKyAgJyhmb3IgZGlyIGluIEEgQS9CIEEvQi9DIEEvRCBFOyBkbworICAgICAgbWtkaXIgJGRpciAmJgorICAgICAgZWNobyAidGVzdCBmaWxlIGluICRkaXIiID4iJGRpci9maWxlX2luXyQoZWNobyAkZGlyfHNlZCAtZSAicyMvIyAjZyIpIiAgJiYKKyAgICAgIGdpdCBhZGQgJGRpcjsKKyAgIGRvbmUpICYmCisgICBnaXQgY29tbWl0IC1xIC1tICJkZWVwIHN1YiBkaXJlY3Rvcnkgc3RydWN0dXJlIiAmJgorICAgZ2l0IHB1c2ggZ2l0Y3ZzLmdpdCA+L2Rldi9udWxsICYmCisgICBjZCBjdnN3b3JrICYmCisgICBHSVRfQ09ORklHPSIkZ2l0X2NvbmZpZyIgY3ZzIC1RIHVwZGF0ZSAtZCAmJgorICAgKGZvciBkaXIgaW4gQSBBL0IgQS9CL0MgQS9EIEU7IGRvCisgICAgICBmaWxlbmFtZT0iZmlsZV9pbl8kKGVjaG8gJGRpcnxzZWQgLWUgInMjLyMgI2ciKSIgJiYKKyAgICAgIGlmIHRlc3QgIiQoZWNobyAkKGdyZXAgLXYgXkQgJGRpci9DVlMvRW50cmllc3xjdXQgLWQvIC1mMiwzLDUpKSIgPSAiJGZpbGVuYW1lLzEuMS8iICYmCisgICAgICAgICAgIGRpZmYgLXEgIiRkaXIvJGZpbGVuYW1lIiAiLi4vJGRpci8kZmlsZW5hbWUiOyB0aGVuCisgICAgICAgIDoKKyAgICAgIGVsc2UKKyAgICAgICAgZWNobyA+ZmFpbHVyZQorICAgICAgZmkKKyAgICBkb25lKSAmJgorICAgdGVzdCAhIC1mIGZhaWx1cmUnCisKK2NkICIkV09SS0RJUiIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2N2cyB1cGRhdGUgKGRlbGV0ZSBmaWxlKScgXAorICAnZ2l0IHJtIHRlc3RmaWxlMSAmJgorICAgZ2l0IGNvbW1pdCAtcSAtbSAiUmVtb3ZlIHRlc3RmaWxlMSIgJiYKKyAgIGdpdCBwdXNoIGdpdGN2cy5naXQgPi9kZXYvbnVsbCAmJgorICAgY2QgY3Zzd29yayAmJgorICAgR0lUX0NPTkZJRz0iJGdpdF9jb25maWciIGN2cyAtUSB1cGRhdGUgJiYKKyAgIHRlc3QgLXogIiQoZ3JlcCB0ZXN0ZmlsZTEgQ1ZTL0VudHJpZXMpIiAmJgorICAgdGVzdCAhIC1mIHRlc3RmaWxlMScKKworY2QgIiRXT1JLRElSIgordGVzdF9leHBlY3Rfc3VjY2VzcyAnY3ZzIHVwZGF0ZSAocmUtYWRkIGRlbGV0ZWQgZmlsZSknIFwKKyAgJ2VjaG8gcmVhZGRlZCB0ZXN0ZmlsZSA+dGVzdGZpbGUxICYmCisgICBnaXQgYWRkIHRlc3RmaWxlMSAmJgorICAgZ2l0IGNvbW1pdCAtcSAtbSAiUmUtQWRkIHRlc3RmaWxlMSIgJiYKKyAgIGdpdCBwdXNoIGdpdGN2cy5naXQgPi9kZXYvbnVsbCAmJgorICAgY2QgY3Zzd29yayAmJgorICAgR0lUX0NPTkZJRz0iJGdpdF9jb25maWciIGN2cyAtUSB1cGRhdGUgJiYKKyAgIHRlc3QgIiQoZWNobyAkKGdyZXAgdGVzdGZpbGUxIENWUy9FbnRyaWVzfGN1dCAtZC8gLWYyLDMsNSkpIiA9ICJ0ZXN0ZmlsZTEvMS40LyIgJiYKKyAgIGRpZmYgLXEgdGVzdGZpbGUxIC4uL3Rlc3RmaWxlMScKKworY2QgIiRXT1JLRElSIgordGVzdF9leHBlY3Rfc3VjY2VzcyAnY3ZzIHVwZGF0ZSAobWVyZ2UpJyBcCisgICdlY2hvIExpbmUgMCA+ZXhwZWN0ZWQgJiYKKyAgIGZvciBpIGluIDEgMiAzIDQgNSA2IDcKKyAgIGRvCisgICAgIGVjaG8gTGluZSAkaSA+Pm1lcmdlCisgICAgIGVjaG8gTGluZSAkaSA+PmV4cGVjdGVkCisgICBkb25lICYmCisgICBlY2hvIExpbmUgOCA+PmV4cGVjdGVkICYmCisgICBnaXQgYWRkIG1lcmdlICYmCisgICBnaXQgY29tbWl0IC1xIC1tICJNZXJnZSB0ZXN0IChwcmUtbWVyZ2UpIiAmJgorICAgZ2l0IHB1c2ggZ2l0Y3ZzLmdpdCA+L2Rldi9udWxsICYmCisgICBjZCBjdnN3b3JrICYmCisgICBHSVRfQ09ORklHPSIkZ2l0X2NvbmZpZyIgY3ZzIC1RIHVwZGF0ZSAmJgorICAgdGVzdCAiJChlY2hvICQoZ3JlcCBtZXJnZSBDVlMvRW50cmllc3xjdXQgLWQvIC1mMiwzLDUpKSIgPSAibWVyZ2UvMS4xLyIgJiYKKyAgIGRpZmYgLXEgbWVyZ2UgLi4vbWVyZ2UgJiYKKyAgICggZWNobyBMaW5lIDA7IGNhdCBtZXJnZSApID5tZXJnZS50bXAgJiYKKyAgIG12IG1lcmdlLnRtcCBtZXJnZSAmJgorICAgY2QgIiRXT1JLRElSIiAmJgorICAgZWNobyBMaW5lIDggPj5tZXJnZSAmJgorICAgZ2l0IGFkZCBtZXJnZSAmJgorICAgZ2l0IGNvbW1pdCAtcSAtbSAiTWVyZ2UgdGVzdCAobWVyZ2UpIiAmJgorICAgZ2l0IHB1c2ggZ2l0Y3ZzLmdpdCA+L2Rldi9udWxsICYmCisgICBjZCBjdnN3b3JrICYmCisgICBzbGVlcCAxICYmIHRvdWNoIG1lcmdlICYmCisgICBHSVRfQ09ORklHPSIkZ2l0X2NvbmZpZyIgY3ZzIC1RIHVwZGF0ZSAmJgorICAgZGlmZiAtcSBtZXJnZSAuLi9leHBlY3RlZCcKKworY2QgIiRXT1JLRElSIgorCitjYXQgPmV4cGVjdGVkLkMgPDxFT0YKKzw8PDw8PDwgbWVyZ2UubWluZQorTGluZSAwCis9PT09PT09CitMSU5FIDAKKz4+Pj4+Pj4gbWVyZ2UuMworRU9GCisKK2ZvciBpIGluIDEgMiAzIDQgNSA2IDcgOAorZG8KKyAgZWNobyBMaW5lICRpID4+ZXhwZWN0ZWQuQworZG9uZQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjdnMgdXBkYXRlIChjb25mbGljdCBtZXJnZSknIFwKKyAgJyggZWNobyBMSU5FIDA7IGNhdCBtZXJnZSApID5tZXJnZS50bXAgJiYKKyAgIG12IG1lcmdlLnRtcCBtZXJnZSAmJgorICAgZ2l0IGFkZCBtZXJnZSAmJgorICAgZ2l0IGNvbW1pdCAtcSAtbSAiTWVyZ2UgdGVzdCAoY29uZmxpY3QpIiAmJgorICAgZ2l0IHB1c2ggZ2l0Y3ZzLmdpdCA+L2Rldi9udWxsICYmCisgICBjZCBjdnN3b3JrICYmCisgICBHSVRfQ09ORklHPSIkZ2l0X2NvbmZpZyIgY3ZzIC1RIHVwZGF0ZSAmJgorICAgZGlmZiAtcSBtZXJnZSAuLi9leHBlY3RlZC5DJworCitjZCAiJFdPUktESVIiCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjdnMgdXBkYXRlICgtQyknIFwKKyAgJ2NkIGN2c3dvcmsgJiYKKyAgIEdJVF9DT05GSUc9IiRnaXRfY29uZmlnIiBjdnMgLVEgdXBkYXRlIC1DICYmCisgICBkaWZmIC1xIG1lcmdlIC4uL21lcmdlJworCitjZCAiJFdPUktESVIiCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjdnMgdXBkYXRlIChtZXJnZSBuby1vcCknIFwKKyAgICdlY2hvIExpbmUgOSA+Pm1lcmdlICYmCisgICAgY3AgbWVyZ2UgY3Zzd29yay9tZXJnZSAmJgorICAgIGdpdCBhZGQgbWVyZ2UgJiYKKyAgICBnaXQgY29tbWl0IC1xIC1tICJNZXJnZSB0ZXN0IChuby1vcCkiICYmCisgICAgZ2l0IHB1c2ggZ2l0Y3ZzLmdpdCA+L2Rldi9udWxsICYmCisgICAgY2QgY3Zzd29yayAmJgorICAgIHNsZWVwIDEgJiYgdG91Y2ggbWVyZ2UgJiYKKyAgICBHSVRfQ09ORklHPSIkZ2l0X2NvbmZpZyIgY3ZzIC1RIHVwZGF0ZSAmJgorICAgIGRpZmYgLXEgbWVyZ2UgLi4vbWVyZ2UnCisKK2NkICIkV09SS0RJUiIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2N2cyB1cGRhdGUgKC1wKScgJworICAgIHRvdWNoIHJlYWxseS1lbXB0eSAmJgorICAgIGVjaG8gTGluZSAxID4gbm8tbGYgJiYKKyAgICBlY2hvIC1uIExpbmUgMiA+PiBuby1sZiAmJgorICAgIGdpdCBhZGQgcmVhbGx5LWVtcHR5IG5vLWxmICYmCisgICAgZ2l0IGNvbW1pdCAtcSAtbSAiVXBkYXRlIC1wIHRlc3QiICYmCisgICAgZ2l0IHB1c2ggZ2l0Y3ZzLmdpdCA+L2Rldi9udWxsICYmCisgICAgY2QgY3Zzd29yayAmJgorICAgIEdJVF9DT05GSUc9IiRnaXRfY29uZmlnIiBjdnMgdXBkYXRlICYmCisgICAgcm0gLWYgZmFpbHVyZXMgJiYKKyAgICBmb3IgaSBpbiBtZXJnZSBuby1sZiBlbXB0eSByZWFsbHktZW1wdHk7IGRvCisgICAgICAgIEdJVF9DT05GSUc9IiRnaXRfY29uZmlnIiBjdnMgdXBkYXRlIC1wICIkaSIgPiRpLm91dAorICAgICAgICBkaWZmICRpLm91dCAuLi8kaSA+PmZhaWx1cmVzIDI+JjEKKyAgICBkb25lICYmCisgICAgdGVzdCAteiAiJChjYXQgZmFpbHVyZXMpIgorJworCisjLS0tLS0tLS0tLS0tCisjIENWUyBTVEFUVVMKKyMtLS0tLS0tLS0tLS0KKworY2QgIiRXT1JLRElSIgordGVzdF9leHBlY3Rfc3VjY2VzcyAnY3ZzIHN0YXR1cycgJworICAgIG1rZGlyIHN0YXR1cy5kaXIgJiYKKyAgICBlY2hvIExpbmUgPiBzdGF0dXMuZGlyL3N0YXR1cy5maWxlICYmCisgICAgZWNobyBMaW5lID4gc3RhdHVzLmZpbGUgJiYKKyAgICBnaXQgYWRkIHN0YXR1cy5kaXIgc3RhdHVzLmZpbGUgJiYKKyAgICBnaXQgY29tbWl0IC1xIC1tICJTdGF0dXMgdGVzdCIgJiYKKyAgICBnaXQgcHVzaCBnaXRjdnMuZ2l0ID4vZGV2L251bGwgJiYKKyAgICBjZCBjdnN3b3JrICYmCisgICAgR0lUX0NPTkZJRz0iJGdpdF9jb25maWciIGN2cyB1cGRhdGUgJiYKKyAgICBHSVRfQ09ORklHPSIkZ2l0X2NvbmZpZyIgY3ZzIHN0YXR1cyB8IGdyZXAgIl5GaWxlOiBzdGF0dXMuZmlsZSIgPi4uL291dCAmJgorICAgIHRlc3QgJCh3YyAtbCA8Li4vb3V0KSA9IDIKKycKKworY2QgIiRXT1JLRElSIgordGVzdF9leHBlY3Rfc3VjY2VzcyAnY3ZzIHN0YXR1cyAobm9ucmVjdXJzaXZlKScgJworICAgIGNkIGN2c3dvcmsgJiYKKyAgICBHSVRfQ09ORklHPSIkZ2l0X2NvbmZpZyIgY3ZzIHN0YXR1cyAtbCB8IGdyZXAgIl5GaWxlOiBzdGF0dXMuZmlsZSIgPi4uL291dCAmJgorICAgIHRlc3QgJCh3YyAtbCA8Li4vb3V0KSA9IDEKKycKKworY2QgIiRXT1JLRElSIgordGVzdF9leHBlY3Rfc3VjY2VzcyAnY3ZzIHN0YXR1cyAobm8gc3ViZGlycyBpbiBoZWFkZXIpJyAnCisgICAgY2QgY3Zzd29yayAmJgorICAgIEdJVF9DT05GSUc9IiRnaXRfY29uZmlnIiBjdnMgc3RhdHVzIHwgZ3JlcCBeRmlsZTogPi4uL291dCAmJgorICAgICEgZ3JlcCAvIDwuLi9vdXQKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q5NTAwLWdpdHdlYi1zdGFuZGFsb25lLW5vLWVycm9ycy5zaCBiL3QvdDk1MDAtZ2l0d2ViLXN0YW5kYWxvbmUtbm8tZXJyb3JzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc5NmNkN2QKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q5NTAwLWdpdHdlYi1zdGFuZGFsb25lLW5vLWVycm9ycy5zaApAQCAtMCwwICsxLDYwOCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNyBKYWt1YiBOYXJlYnNraQorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXR3ZWIgYXMgc3RhbmRhbG9uZSBzY3JpcHQgKGJhc2ljIHRlc3RzKS4KKworVGhpcyB0ZXN0IHJ1bnMgZ2l0d2ViIChnaXQgd2ViIGludGVyZmFjZSkgYXMgQ0dJIHNjcmlwdCBmcm9tCitjb21tYW5kbGluZSwgYW5kIGNoZWNrcyB0aGF0IGl0IHdvdWxkIG5vdCB3cml0ZSBhbnkgZXJyb3JzCitvciB3YXJuaW5ncyB0byBsb2cuJworCitnaXR3ZWJfaW5pdCAoKSB7CisJY2F0ID5naXR3ZWJfY29uZmlnLnBlcmwgPDxFT0YKKyMhL3Vzci9iaW4vcGVybAorCisjIGdpdHdlYiBjb25maWd1cmF0aW9uIGZvciB0ZXN0cworCitvdXIgXCR2ZXJzaW9uID0gImN1cnJlbnQiOworb3VyIFwkR0lUID0gImdpdCI7CitvdXIgXCRwcm9qZWN0cm9vdCA9ICIkKHB3ZCkiOworb3VyIFwkcHJvamVjdF9tYXhkZXB0aCA9IDg7CitvdXIgXCRob21lX2xpbmtfc3RyID0gInByb2plY3RzIjsKK291ciBcJHNpdGVfbmFtZSA9ICJbbG9jYWxob3N0XSI7CitvdXIgXCRzaXRlX2hlYWRlciA9ICIiOworb3VyIFwkc2l0ZV9mb290ZXIgPSAiIjsKK291ciBcJGhvbWVfdGV4dCA9ICJpbmRleHRleHQuaHRtbCI7CitvdXIgQHN0eWxlc2hlZXRzID0gKCJmaWxlOi8vLyQocHdkKS8uLi8uLi9naXR3ZWIvZ2l0d2ViLmNzcyIpOworb3VyIFwkbG9nbyA9ICJmaWxlOi8vLyQocHdkKS8uLi8uLi9naXR3ZWIvZ2l0LWxvZ28ucG5nIjsKK291ciBcJGZhdmljb24gPSAiZmlsZTovLy8kKHB3ZCkvLi4vLi4vZ2l0d2ViL2dpdC1mYXZpY29uLnBuZyI7CitvdXIgXCRwcm9qZWN0c19saXN0ID0gIiI7CitvdXIgXCRleHBvcnRfb2sgPSAiIjsKK291ciBcJHN0cmljdF9leHBvcnQgPSAiIjsKKworRU9GCisKKwljYXQgPi5naXQvZGVzY3JpcHRpb24gPDxFT0YKKyQwIHRlc3QgcmVwb3NpdG9yeQorRU9GCit9CisKK2dpdHdlYl9ydW4gKCkgeworCWV4cG9ydCBHQVRFV0FZX0lOVEVSRkFDRT0iQ0dJLzEuMSIKKwlleHBvcnQgSFRUUF9BQ0NFUFQ9IiovKiIKKwlleHBvcnQgUkVRVUVTVF9NRVRIT0Q9IkdFVCIKKwlleHBvcnQgUVVFUllfU1RSSU5HPSIiJDEiIgorCWV4cG9ydCBQQVRIX0lORk89IiIkMiIiCisKKwlleHBvcnQgR0lUV0VCX0NPTkZJRz0kKHB3ZCkvZ2l0d2ViX2NvbmZpZy5wZXJsCisKKwkjIHNvbWUgb2YgZ2l0IGNvbW1hbmRzIHdyaXRlIHRvIFNUREVSUiBvbiBlcnJvciwgYnV0IHRoaXMgaXMgbm90CisJIyB3cml0dGVuIHRvIHdlYiBzZXJ2ZXIgbG9ncywgc28gd2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHRoYXQ6CisJIyB3ZSBhcmUgaW50ZXJlc3RlZCBvbmx5IGluIHByb3Blcmx5IGZvcm1hdHRlZCBlcnJvcnMvd2FybmluZ3MKKwlybSAtZiBnaXR3ZWIubG9nICYmCisJcGVybCAtLSAkKHB3ZCkvLi4vLi4vZ2l0d2ViL2dpdHdlYi5wZXJsIFwKKwkJPi9kZXYvbnVsbCAyPmdpdHdlYi5sb2cgJiYKKwlpZiBncmVwIC1xIC1zICJeW1tdIiBnaXR3ZWIubG9nID4vZGV2L251bGw7IHRoZW4gZmFsc2U7IGVsc2UgdHJ1ZTsgZmkKKworCSMgZ2l0d2ViLmxvZyBpcyBsZWZ0IGZvciBkZWJ1Z2dpbmcKK30KKworc2FmZV9jaG1vZCAoKSB7CisJY2htb2QgIiQxIiAiJDIiICYmCisJaWYgWyAiJChnaXQgY29uZmlnIC0tZ2V0IGNvcmUuZmlsZW1vZGUpIiA9IGZhbHNlIF0KKwl0aGVuCisJCWdpdCB1cGRhdGUtaW5kZXggLS1jaG1vZD0iJDEiICIkMiIKKwlmaQorfQorCisuIC4vdGVzdC1saWIuc2gKKworcGVybCAtTUVuY29kZSAtZSAnZGVjb2RlX3V0ZjgoIiIsIEVuY29kZTo6RkJfQ1JPQUspJyA+L2Rldi9udWxsIDI+JjEgfHwgeworICAgIHRlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NraXBwaW5nIGdpdHdlYiB0ZXN0cywgcGVybCB2ZXJzaW9uIGlzIHRvbyBvbGQnIDoKKyAgICB0ZXN0X2RvbmUKKyAgICBleGl0Cit9CisKK2dpdHdlYl9pbml0CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBubyBjb21taXRzIChlbXB0eSwganVzdCBpbml0aWFsaXplZCByZXBvc2l0b3J5KQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknbm8gY29tbWl0czogcHJvamVjdHNfbGlzdCAoaW1wbGljaXQpJyBcCisJJ2dpdHdlYl9ydW4nCit0ZXN0X2RlYnVnICdjYXQgZ2l0d2ViLmxvZycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ25vIGNvbW1pdHM6IHByb2plY3RzX2luZGV4JyBcCisJJ2dpdHdlYl9ydW4gImE9cHJvamVjdF9pbmRleCInCit0ZXN0X2RlYnVnICdjYXQgZ2l0d2ViLmxvZycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ25vIGNvbW1pdHM6IC5naXQgc3VtbWFyeSAoaW1wbGljaXQpJyBcCisJJ2dpdHdlYl9ydW4gInA9LmdpdCInCit0ZXN0X2RlYnVnICdjYXQgZ2l0d2ViLmxvZycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ25vIGNvbW1pdHM6IC5naXQgY29tbWl0IChpbXBsaWNpdCBIRUFEKScgXAorCSdnaXR3ZWJfcnVuICJwPS5naXQ7YT1jb21taXQiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdubyBjb21taXRzOiAuZ2l0IGNvbW1pdGRpZmYgKGltcGxpY2l0IEhFQUQpJyBcCisJJ2dpdHdlYl9ydW4gInA9LmdpdDthPWNvbW1pdGRpZmYiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdubyBjb21taXRzOiAuZ2l0IHRyZWUgKGltcGxpY2l0IEhFQUQpJyBcCisJJ2dpdHdlYl9ydW4gInA9LmdpdDthPXRyZWUiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdubyBjb21taXRzOiAuZ2l0IGhlYWRzJyBcCisJJ2dpdHdlYl9ydW4gInA9LmdpdDthPWhlYWRzIicKK3Rlc3RfZGVidWcgJ2NhdCBnaXR3ZWIubG9nJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknbm8gY29tbWl0czogLmdpdCB0YWdzJyBcCisJJ2dpdHdlYl9ydW4gInA9LmdpdDthPXRhZ3MiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGluaXRpYWwgY29tbWl0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdNYWtlIGluaXRpYWwgY29tbWl0JyBcCisJJ2VjaG8gIk5vdCBhbiBlbXB0eSBmaWxlLiIgPiBmaWxlICYmCisJIGdpdCBhZGQgZmlsZSAmJgorCSBnaXQgY29tbWl0IC1hIC1tICJJbml0aWFsIGNvbW1pdC4iICYmCisJIGdpdCBicmFuY2ggYicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ3Byb2plY3RzX2xpc3QgKGltcGxpY2l0KScgXAorCSdnaXR3ZWJfcnVuJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdwcm9qZWN0c19pbmRleCcgXAorCSdnaXR3ZWJfcnVuICJhPXByb2plY3RfaW5kZXgiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCScuZ2l0IHN1bW1hcnkgKGltcGxpY2l0KScgXAorCSdnaXR3ZWJfcnVuICJwPS5naXQiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCScuZ2l0IGNvbW1pdCAoaW1wbGljaXQgSEVBRCknIFwKKwknZ2l0d2ViX3J1biAicD0uZ2l0O2E9Y29tbWl0IicKK3Rlc3RfZGVidWcgJ2NhdCBnaXR3ZWIubG9nJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknLmdpdCBjb21taXRkaWZmIChpbXBsaWNpdCBIRUFELCByb290IGNvbW1pdCknIFwKKwknZ2l0d2ViX3J1biAicD0uZ2l0O2E9Y29tbWl0ZGlmZiInCit0ZXN0X2RlYnVnICdjYXQgZ2l0d2ViLmxvZycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJy5naXQgY29tbWl0ZGlmZl9wbGFpbiAoaW1wbGljaXQgSEVBRCwgcm9vdCBjb21taXQpJyBcCisJJ2dpdHdlYl9ydW4gInA9LmdpdDthPWNvbW1pdGRpZmZfcGxhaW4iJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCScuZ2l0IGNvbW1pdCAoSEVBRCknIFwKKwknZ2l0d2ViX3J1biAicD0uZ2l0O2E9Y29tbWl0O2g9SEVBRCInCit0ZXN0X2RlYnVnICdjYXQgZ2l0d2ViLmxvZycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJy5naXQgdHJlZSAoaW1wbGljaXQgSEVBRCknIFwKKwknZ2l0d2ViX3J1biAicD0uZ2l0O2E9dHJlZSInCit0ZXN0X2RlYnVnICdjYXQgZ2l0d2ViLmxvZycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJy5naXQgYmxvYiAoZmlsZSknIFwKKwknZ2l0d2ViX3J1biAicD0uZ2l0O2E9YmxvYjtmPWZpbGUiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCScuZ2l0IGJsb2JfcGxhaW4gKGZpbGUpJyBcCisJJ2dpdHdlYl9ydW4gInA9LmdpdDthPWJsb2JfcGxhaW47Zj1maWxlIicKK3Rlc3RfZGVidWcgJ2NhdCBnaXR3ZWIubG9nJworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgbm9uZXhpc3RlbnQgb2JqZWN0cworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknLmdpdCBjb21taXQgKG5vbi1leGlzdGVudCknIFwKKwknZ2l0d2ViX3J1biAicD0uZ2l0O2E9Y29tbWl0O2g9bm9uLWV4aXN0ZW50IicKK3Rlc3RfZGVidWcgJ2NhdCBnaXR3ZWIubG9nJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknLmdpdCBjb21taXRkaWZmIChub24tZXhpc3RlbnQpJyBcCisJJ2dpdHdlYl9ydW4gInA9LmdpdDthPWNvbW1pdGRpZmY7aD1ub24tZXhpc3RlbnQiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCScuZ2l0IGNvbW1pdGRpZmYgKG5vbi1leGlzdGVudCB2cyBIRUFEKScgXAorCSdnaXR3ZWJfcnVuICJwPS5naXQ7YT1jb21taXRkaWZmO2hwPW5vbi1leGlzdGVudDtoPUhFQUQiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCScuZ2l0IHRyZWUgKDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDApJyBcCisJJ2dpdHdlYl9ydW4gInA9LmdpdDthPXRyZWU7aD0wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIicKK3Rlc3RfZGVidWcgJ2NhdCBnaXR3ZWIubG9nJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknLmdpdCB0YWcgKDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDApJyBcCisJJ2dpdHdlYl9ydW4gInA9LmdpdDthPXRhZztoPTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCScuZ2l0IGJsb2IgKG5vbi1leGlzdGVudCknIFwKKwknZ2l0d2ViX3J1biAicD0uZ2l0O2E9YmxvYjtmPW5vbi1leGlzdGVudCInCit0ZXN0X2RlYnVnICdjYXQgZ2l0d2ViLmxvZycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJy5naXQgYmxvYl9wbGFpbiAobm9uLWV4aXN0ZW50KScgXAorCSdnaXR3ZWJfcnVuICJwPS5naXQ7YT1ibG9iX3BsYWluO2Y9bm9uLWV4aXN0ZW50IicKK3Rlc3RfZGVidWcgJ2NhdCBnaXR3ZWIubG9nJworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb21taXRkaWZmIHRlc3RpbmcgKGltcGxpY2l0LCBvbmUgaW1wbGljaXQgdHJlZS1pc2gpCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdjb21taXRkaWZmKDApOiByb290JyBcCisJJ2dpdHdlYl9ydW4gInA9LmdpdDthPWNvbW1pdGRpZmYiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdjb21taXRkaWZmKDApOiBmaWxlIGFkZGVkJyBcCisJJ2VjaG8gIk5ldyBmaWxlIiA+IG5ld19maWxlICYmCisJIGdpdCBhZGQgbmV3X2ZpbGUgJiYKKwkgZ2l0IGNvbW1pdCAtYSAtbSAiRmlsZSBhZGRlZC4iICYmCisJIGdpdHdlYl9ydW4gInA9LmdpdDthPWNvbW1pdGRpZmYiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdjb21taXRkaWZmKDApOiBtb2RlIGNoYW5nZScgXAorCSdzYWZlX2NobW9kICt4IG5ld19maWxlICYmCisJIGdpdCBjb21taXQgLWEgLW0gIk1vZGUgY2hhbmdlZC4iICYmCisJIGdpdHdlYl9ydW4gInA9LmdpdDthPWNvbW1pdGRpZmYiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdjb21taXRkaWZmKDApOiBmaWxlIHJlbmFtZWQnIFwKKwknZ2l0IG12IG5ld19maWxlIHJlbmFtZWRfZmlsZSAmJgorCSBnaXQgY29tbWl0IC1hIC1tICJGaWxlIHJlbmFtZWQuIiAmJgorCSBnaXR3ZWJfcnVuICJwPS5naXQ7YT1jb21taXRkaWZmIicKK3Rlc3RfZGVidWcgJ2NhdCBnaXR3ZWIubG9nJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY29tbWl0ZGlmZigwKTogZmlsZSB0byBzeW1saW5rJyBcCisJJ3JtIHJlbmFtZWRfZmlsZSAmJgorCSBsbiAtcyBmaWxlIHJlbmFtZWRfZmlsZSAmJgorCSBnaXQgY29tbWl0IC1hIC1tICJGaWxlIHRvIHN5bWxpbmsuIiAmJgorCSBnaXR3ZWJfcnVuICJwPS5naXQ7YT1jb21taXRkaWZmIicKK3Rlc3RfZGVidWcgJ2NhdCBnaXR3ZWIubG9nJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY29tbWl0ZGlmZigwKTogZmlsZSBkZWxldGVkJyBcCisJJ2dpdCBybSByZW5hbWVkX2ZpbGUgJiYKKwkgcm0gLWYgcmVuYW1lZF9maWxlICYmCisJIGdpdCBjb21taXQgLWEgLW0gIkZpbGUgcmVtb3ZlZC4iICYmCisJIGdpdHdlYl9ydW4gInA9LmdpdDthPWNvbW1pdGRpZmYiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdjb21taXRkaWZmKDApOiBmaWxlIGNvcGllZCAvIG5ldyBmaWxlJyBcCisJJ2NwIGZpbGUgZmlsZTIgJiYKKwkgZ2l0IGFkZCBmaWxlMiAmJgorCSBnaXQgY29tbWl0IC1hIC1tICJGaWxlIGNvcGllZC4iICYmCisJIGdpdHdlYl9ydW4gInA9LmdpdDthPWNvbW1pdGRpZmYiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdjb21taXRkaWZmKDApOiBtb2RlIGNoYW5nZSBhbmQgbW9kaWZpZWQnIFwKKwknZWNobyAiTmV3IGxpbmUiID4+IGZpbGUyICYmCisJIHNhZmVfY2htb2QgK3ggZmlsZTIgJiYKKwkgZ2l0IGNvbW1pdCAtYSAtbSAiTW9kZSBjaGFuZ2UgYW5kIG1vZGlmaWNhdGlvbi4iICYmCisJIGdpdHdlYl9ydW4gInA9LmdpdDthPWNvbW1pdGRpZmYiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdjb21taXRkaWZmKDApOiByZW5hbWVkIGFuZCBtb2RpZmllZCcgXAorCSdjYXQgPmZpbGUyPDxFT0YgJiYKK0RvbWludXMgcmVnaXQgbWUsCitldCBuaWhpbCBtaWhpIGRlZXJpdC4KK0luIGxvY28gcGFzY3VhZSBpYmkgbWUgY29sbG9jYXZpdCwKK3N1cGVyIGFxdWFtIHJlZmVjdGlvbmlzIGVkdWNhdml0IG1lOworYW5pbWFtIG1lYW0gY29udmVydGl0LAorZGVkdXhpdCBtZSBzdXBlciBzZW1pdGFzIGp1c2l0aWFlLAorcHJvcHRlciBub21lbiBzdXVtLgorRU9GCisJIGdpdCBjb21taXQgLWEgLW0gIkZpbGUgYWRkZWQuIiAmJgorCSBnaXQgbXYgZmlsZTIgZmlsZTMgJiYKKwkgZWNobyAiUHJvcHRlciBub21lbiBzdXVtLiIgPj4gZmlsZTMgJiYKKwkgZ2l0IGNvbW1pdCAtYSAtbSAiRmlsZSByZW5hbWUgYW5kIG1vZGlmaWNhdGlvbi4iICYmCisJIGdpdHdlYl9ydW4gInA9LmdpdDthPWNvbW1pdGRpZmYiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdjb21taXRkaWZmKDApOiByZW5hbWVkLCBtb2RlIGNoYW5nZSBhbmQgbW9kaWZpZWQnIFwKKwknZ2l0IG12IGZpbGUzIGZpbGUyICYmCisJIGVjaG8gIlByb3B0ZXIgbm9tZW4gc3V1bS4iID4+IGZpbGUyICYmCisJIHNhZmVfY2htb2QgK3ggZmlsZTIgJiYKKwkgZ2l0IGNvbW1pdCAtYSAtbSAiRmlsZSByZW5hbWUsIG1vZGUgY2hhbmdlIGFuZCBtb2RpZmljYXRpb24uIiAmJgorCSBnaXR3ZWJfcnVuICJwPS5naXQ7YT1jb21taXRkaWZmIicKK3Rlc3RfZGVidWcgJ2NhdCBnaXR3ZWIubG9nJworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29tbWl0ZGlmZiB0ZXN0aW5nICh0YWtlbiBmcm9tIHQ0MTE0LWFwcGx5LXR5cGVjaGFuZ2Uuc2gpCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NldHVwIHR5cGVjaGFuZ2UgY29tbWl0cycgJworCWVjaG8gImhlbGxvIHdvcmxkIiA+IGZvbyAmJgorCWVjaG8gImhpIHBsYW5ldCIgPiBiYXIgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGZvbyBiYXIgJiYKKwlnaXQgY29tbWl0IC1tIGluaXRpYWwgJiYKKwlnaXQgYnJhbmNoIGluaXRpYWwgJiYKKwlybSAtZiBmb28gJiYKKwlsbiAtcyBiYXIgZm9vICYmCisJZ2l0IHVwZGF0ZS1pbmRleCBmb28gJiYKKwlnaXQgY29tbWl0IC1tICJmb28gc3ltbGlua2VkIHRvIGJhciIgJiYKKwlnaXQgYnJhbmNoIGZvby1zeW1saW5rZWQtdG8tYmFyICYmCisJcm0gLWYgZm9vICYmCisJZWNobyAiaG93IGZhciBpcyB0aGUgc3VuPyIgPiBmb28gJiYKKwlnaXQgdXBkYXRlLWluZGV4IGZvbyAmJgorCWdpdCBjb21taXQgLW0gImZvbyBiYWNrIHRvIGZpbGUiICYmCisJZ2l0IGJyYW5jaCBmb28tYmFjay10by1maWxlICYmCisJcm0gLWYgZm9vICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLXJlbW92ZSBmb28gJiYKKwlta2RpciBmb28gJiYKKwllY2hvICJpZiBvbmx5IEkga25ldyIgPiBmb28vYmF6ICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBmb28vYmF6ICYmCisJZ2l0IGNvbW1pdCAtbSAiZm9vIGJlY29tZXMgYSBkaXJlY3RvcnkiICYmCisJZ2l0IGJyYW5jaCAiZm9vLWJlY29tZXMtYS1kaXJlY3RvcnkiICYmCisJZWNobyAiaGVsbG8gd29ybGQiID4gZm9vL2JheiAmJgorCWdpdCB1cGRhdGUtaW5kZXggZm9vL2JheiAmJgorCWdpdCBjb21taXQgLW0gImZvby9iYXogaXMgdGhlIG9yaWdpbmFsIGZvbyIgJiYKKwlnaXQgYnJhbmNoIGZvby1iYXotcmVuYW1lZC1mcm9tLWZvbworCScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NvbW1pdGRpZmYoMik6IGZpbGUgcmVuYW1lZCBmcm9tIGZvbyB0byBmb28vYmF6JyBcCisJJ2dpdHdlYl9ydW4gInA9LmdpdDthPWNvbW1pdGRpZmY7aHA9aW5pdGlhbDtoPWZvby1iYXotcmVuYW1lZC1mcm9tLWZvbyInCit0ZXN0X2RlYnVnICdjYXQgZ2l0d2ViLmxvZycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NvbW1pdGRpZmYoMik6IGZpbGUgcmVuYW1lZCBmcm9tIGZvby9iYXogdG8gZm9vJyBcCisJJ2dpdHdlYl9ydW4gInA9LmdpdDthPWNvbW1pdGRpZmY7aHA9Zm9vLWJhei1yZW5hbWVkLWZyb20tZm9vO2g9aW5pdGlhbCInCit0ZXN0X2RlYnVnICdjYXQgZ2l0d2ViLmxvZycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NvbW1pdGRpZmYoMik6IGRpcmVjdG9yeSBiZWNvbWVzIGZpbGUnIFwKKwknZ2l0d2ViX3J1biAicD0uZ2l0O2E9Y29tbWl0ZGlmZjtocD1mb28tYmVjb21lcy1hLWRpcmVjdG9yeTtoPWluaXRpYWwiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdjb21taXRkaWZmKDIpOiBmaWxlIGJlY29tZXMgZGlyZWN0b3J5JyBcCisJJ2dpdHdlYl9ydW4gInA9LmdpdDthPWNvbW1pdGRpZmY7aHA9aW5pdGlhbDtoPWZvby1iZWNvbWVzLWEtZGlyZWN0b3J5IicKK3Rlc3RfZGVidWcgJ2NhdCBnaXR3ZWIubG9nJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY29tbWl0ZGlmZigyKTogZmlsZSBiZWNvbWVzIHN5bWxpbmsnIFwKKwknZ2l0d2ViX3J1biAicD0uZ2l0O2E9Y29tbWl0ZGlmZjtocD1pbml0aWFsO2g9Zm9vLXN5bWxpbmtlZC10by1iYXIiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdjb21taXRkaWZmKDIpOiBzeW1saW5rIGJlY29tZXMgZmlsZScgXAorCSdnaXR3ZWJfcnVuICJwPS5naXQ7YT1jb21taXRkaWZmO2hwPWZvby1zeW1saW5rZWQtdG8tYmFyO2g9Zm9vLWJhY2stdG8tZmlsZSInCit0ZXN0X2RlYnVnICdjYXQgZ2l0d2ViLmxvZycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NvbW1pdGRpZmYoMik6IHN5bWxpbmsgYmVjb21lcyBkaXJlY3RvcnknIFwKKwknZ2l0d2ViX3J1biAicD0uZ2l0O2E9Y29tbWl0ZGlmZjtocD1mb28tc3ltbGlua2VkLXRvLWJhcjtoPWZvby1iZWNvbWVzLWEtZGlyZWN0b3J5IicKK3Rlc3RfZGVidWcgJ2NhdCBnaXR3ZWIubG9nJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY29tbWl0ZGlmZigyKTogZGlyZWN0b3J5IGJlY29tZXMgc3ltbGluaycgXAorCSdnaXR3ZWJfcnVuICJwPS5naXQ7YT1jb21taXRkaWZmO2hwPWZvby1iZWNvbWVzLWEtZGlyZWN0b3J5O2g9Zm9vLXN5bWxpbmtlZC10by1iYXIiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb21taXQsIGNvbW1pdGRpZmY6IG1lcmdlLCBsYXJnZQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ0NyZWF0ZSBhIG1lcmdlJyBcCisJJ2dpdCBjaGVja291dCBiICYmCisJIGVjaG8gIkJyYW5jaCIgPj4gYiAmJgorCSBnaXQgYWRkIGIgJiYKKwkgZ2l0IGNvbW1pdCAtYSAtbSAiT24gYnJhbmNoIiAmJgorCSBnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisJIGdpdCBwdWxsIC4gYicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NvbW1pdCgwKTogbWVyZ2UgY29tbWl0JyBcCisJJ2dpdHdlYl9ydW4gInA9LmdpdDthPWNvbW1pdCInCit0ZXN0X2RlYnVnICdjYXQgZ2l0d2ViLmxvZycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NvbW1pdGRpZmYoMCk6IG1lcmdlIGNvbW1pdCcgXAorCSdnaXR3ZWJfcnVuICJwPS5naXQ7YT1jb21taXRkaWZmIicKK3Rlc3RfZGVidWcgJ2NhdCBnaXR3ZWIubG9nJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknUHJlcGFyZSBsYXJnZSBjb21taXQnIFwKKwknZ2l0IGNoZWNrb3V0IGIgJiYKKwkgZWNobyAiVG8gYmUgY2hhbmdlZCIgPiAwMS1jaGFuZ2UgJiYKKwkgZWNobyAiVG8gYmUgcmVuYW1lZCIgPiAwMi1wdXJlLXJlbmFtZS1mcm9tICYmCisJIGVjaG8gIlRvIGJlIGRlbGV0ZWQiID4gMDMtZGVsZXRlICYmCisJIGVjaG8gIlRvIGJlIHJlbmFtZWQgYW5kIGNoYW5nZWQiID4gMDQtcmVuYW1lLWZyb20gJiYKKwkgZWNobyAiVG8gaGF2ZSBtb2RlIGNoYW5nZWQiID4gMDUtbW9kZS1jaGFuZ2UgJiYKKwkgZWNobyAiRmlsZSB0byBzeW1saW5rIiA+IDA2LWZpbGUtb3Itc3ltbGluayAmJgorCSBlY2hvICJUbyBiZSBjaGFuZ2VkIGFuZCBoYXZlIG1vZGUgY2hhbmdlZCIgPiAwNy1jaGFuZ2UtbW9kZS1jaGFuZ2UJJiYKKwkgZ2l0IGFkZCAwKiAmJgorCSBnaXQgY29tbWl0IC1hIC1tICJQcmVwYXJlIGxhcmdlIGNvbW1pdCIgJiYKKwkgZWNobyAiQ2hhbmdlZCIgPiAwMS1jaGFuZ2UgJiYKKwkgZ2l0IG12IDAyLXB1cmUtcmVuYW1lLWZyb20gMDItcHVyZS1yZW5hbWUtdG8gJiYKKwkgZ2l0IHJtIDAzLWRlbGV0ZSAmJiBybSAtZiAwMy1kZWxldGUgJiYKKwkgZWNobyAiQSBuZXcgZmlsZSIgPiAwMy1uZXcgJiYKKwkgZ2l0IGFkZCAwMy1uZXcgJiYKKwkgZ2l0IG12IDA0LXJlbmFtZS1mcm9tIDA0LXJlbmFtZS10byAmJgorCSBlY2hvICJDaGFuZ2VkIiA+PiAwNC1yZW5hbWUtdG8gJiYKKwkgc2FmZV9jaG1vZCAreCAwNS1tb2RlLWNoYW5nZSAmJgorCSBybSAtZiAwNi1maWxlLW9yLXN5bWxpbmsgJiYgbG4gLXMgMDEtY2hhbmdlIDA2LWZpbGUtb3Itc3ltbGluayAmJgorCSBlY2hvICJDaGFuZ2VkIGFuZCBoYXZlIG1vZGUgY2hhbmdlZCIgPiAwNy1jaGFuZ2UtbW9kZS1jaGFuZ2UJJiYKKwkgc2FmZV9jaG1vZCAreCAwNy1jaGFuZ2UtbW9kZS1jaGFuZ2UgJiYKKwkgZ2l0IGNvbW1pdCAtYSAtbSAiTGFyZ2UgY29tbWl0IiAmJgorCSBnaXQgY2hlY2tvdXQgbWFzdGVyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY29tbWl0KDEpOiBsYXJnZSBjb21taXQnIFwKKwknZ2l0d2ViX3J1biAicD0uZ2l0O2E9Y29tbWl0O2g9YiInCit0ZXN0X2RlYnVnICdjYXQgZ2l0d2ViLmxvZycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NvbW1pdGRpZmYoMSk6IGxhcmdlIGNvbW1pdCcgXAorCSdnaXR3ZWJfcnVuICJwPS5naXQ7YT1jb21taXRkaWZmO2g9YiInCit0ZXN0X2RlYnVnICdjYXQgZ2l0d2ViLmxvZycKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHRhZ3MgdGVzdGluZworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkndGFnczogbGlzdCBvZiBkaWZmZXJlbnQgdHlwZXMgb2YgdGFncycgXAorCSdnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisJIGdpdCB0YWcgLWEgLW0gIlRhZyBjb21taXQgb2JqZWN0IiB0YWctY29tbWl0IEhFQUQgJiYKKwkgZ2l0IHRhZyAtYSAtbSAiIiB0YWctY29tbWl0LW5vbWVzc2FnZSBIRUFEICYmCisJIGdpdCB0YWcgLWEgLW0gIlRhZyB0YWcgb2JqZWN0IiB0YWctdGFnIHRhZy1jb21taXQgJiYKKwkgZ2l0IHRhZyAtYSAtbSAiVGFnIHRyZWUgb2JqZWN0IiB0YWctdHJlZSBIRUFEXnt0cmVlfSAmJgorCSBnaXQgdGFnIC1hIC1tICJUYWcgYmxvYiBvYmplY3QiIHRhZy1ibG9iIEhFQUQ6ZmlsZSAmJgorCSBnaXQgdGFnIGxpZ2h0d2VpZ2h0L3RhZy1jb21taXQgSEVBRCAmJgorCSBnaXQgdGFnIGxpZ2h0d2VpZ2h0L3RhZy10YWcgdGFnLWNvbW1pdCAmJgorCSBnaXQgdGFnIGxpZ2h0d2VpZ2h0L3RhZy10cmVlIEhFQURee3RyZWV9ICYmCisJIGdpdCB0YWcgbGlnaHR3ZWlnaHQvdGFnLWJsb2IgSEVBRDpmaWxlICYmCisJIGdpdHdlYl9ydW4gInA9LmdpdDthPXRhZ3MiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSd0YWc6IFRhZyB0byBjb21taXQgb2JqZWN0JyBcCisJJ2dpdHdlYl9ydW4gInA9LmdpdDthPXRhZztoPXRhZy1jb21taXQiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSd0YWc6IG9uIGxpZ2h0d2VpZ2h0IHRhZyAoaW52YWxpZCknIFwKKwknZ2l0d2ViX3J1biAicD0uZ2l0O2E9dGFnO2g9bGlnaHR3ZWlnaHQvdGFnLWNvbW1pdCInCit0ZXN0X2RlYnVnICdjYXQgZ2l0d2ViLmxvZycKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGxvZ3MKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2xvZ3M6IGxvZyAoaW1wbGljaXQgSEVBRCknIFwKKwknZ2l0d2ViX3J1biAicD0uZ2l0O2E9bG9nIicKK3Rlc3RfZGVidWcgJ2NhdCBnaXR3ZWIubG9nJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknbG9nczogc2hvcnRsb2cgKGltcGxpY2l0IEhFQUQpJyBcCisJJ2dpdHdlYl9ydW4gInA9LmdpdDthPXNob3J0bG9nIicKK3Rlc3RfZGVidWcgJ2NhdCBnaXR3ZWIubG9nJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknbG9nczogaGlzdG9yeSAoaW1wbGljaXQgSEVBRCwgZmlsZSknIFwKKwknZ2l0d2ViX3J1biAicD0uZ2l0O2E9aGlzdG9yeTtmPWZpbGUiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBmZWVkIGdlbmVyYXRpb24KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2ZlZWRzOiBPUE1MJyBcCisJJ2dpdHdlYl9ydW4gImE9b3BtbCInCit0ZXN0X2RlYnVnICdjYXQgZ2l0d2ViLmxvZycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2ZlZWQ6IFJTUycgXAorCSdnaXR3ZWJfcnVuICJwPS5naXQ7YT1yc3MiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdmZWVkOiBBdG9tJyBcCisJJ2dpdHdlYl9ydW4gInA9LmdpdDthPWF0b20iJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBlbmNvZGluZy9kZWNvZGluZworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknZW5jb2RlKGNvbW1pdCk6IHV0ZjgnIFwKKwknLiAuLi90MzkwMS11dGY4LnR4dCAmJgorCSBlY2hvICJVVEYtOCIgPj4gZmlsZSAmJgorCSBnaXQgYWRkIGZpbGUgJiYKKwkgZ2l0IGNvbW1pdCAtRiAuLi90MzkwMC8xLVVURi04LnR4dCAmJgorCSBnaXR3ZWJfcnVuICJwPS5naXQ7YT1jb21taXQiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdlbmNvZGUoY29tbWl0KTogaXNvLTg4NTktMScgXAorCScuIC4uL3QzOTAxLTg4NTktMS50eHQgJiYKKwkgZWNobyAiSVNPLTg4NTktMSIgPj4gZmlsZSAmJgorCSBnaXQgYWRkIGZpbGUgJiYKKwkgZ2l0IGNvbmZpZyBpMThuLmNvbW1pdGVuY29kaW5nIElTTy04ODU5LTEgJiYKKwkgZ2l0IGNvbW1pdCAtRiAuLi90MzkwMC9JU08tODg1OS0xLnR4dCAmJgorCSBnaXQgY29uZmlnIC0tdW5zZXQgaTE4bi5jb21taXRlbmNvZGluZyAmJgorCSBnaXR3ZWJfcnVuICJwPS5naXQ7YT1jb21taXQiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdlbmNvZGUobG9nKTogdXRmLTggYW5kIGlzby04ODU5LTEnIFwKKwknZ2l0d2ViX3J1biAicD0uZ2l0O2E9bG9nIicKK3Rlc3RfZGVidWcgJ2NhdCBnaXR3ZWIubG9nJworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZXh0cmEgb3B0aW9ucworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknb3B0OiBsb2cgLS1uby1tZXJnZXMnIFwKKwknZ2l0d2ViX3J1biAicD0uZ2l0O2E9bG9nO29wdD0tLW5vLW1lcmdlcyInCit0ZXN0X2RlYnVnICdjYXQgZ2l0d2ViLmxvZycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ29wdDogYXRvbSAtLW5vLW1lcmdlcycgXAorCSdnaXR3ZWJfcnVuICJwPS5naXQ7YT1sb2c7b3B0PS0tbm8tbWVyZ2VzIicKK3Rlc3RfZGVidWcgJ2NhdCBnaXR3ZWIubG9nJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknb3B0OiAiZmlsZSIgaGlzdG9yeSAtLW5vLW1lcmdlcycgXAorCSdnaXR3ZWJfcnVuICJwPS5naXQ7YT1oaXN0b3J5O2Y9ZmlsZTtvcHQ9LS1uby1tZXJnZXMiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdvcHQ6IGxvZyAtLW5vLXN1Y2gtb3B0aW9uIChpbnZhbGlkIG9wdGlvbiknIFwKKwknZ2l0d2ViX3J1biAicD0uZ2l0O2E9bG9nO29wdD0tLW5vLXN1Y2gtb3B0aW9uIicKK3Rlc3RfZGVidWcgJ2NhdCBnaXR3ZWIubG9nJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknb3B0OiB0cmVlIC0tbm8tbWVyZ2VzIChpbnZhbGlkIG9wdGlvbiBmb3IgYWN0aW9uKScgXAorCSdnaXR3ZWJfcnVuICJwPS5naXQ7YT10cmVlO29wdD0tLW5vLW1lcmdlcyInCit0ZXN0X2RlYnVnICdjYXQgZ2l0d2ViLmxvZycKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHRlc3RpbmcgY29uZmlnX3RvX211bHRpIC8gY2xvbmV1cmwKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgICAgJ1VSTDogbm8gcHJvamVjdCBVUkxzLCBubyBiYXNlIFVSTCcgXAorICAgICAgICdnaXR3ZWJfcnVuICJwPS5naXQ7YT1zdW1tYXJ5IicKK3Rlc3RfZGVidWcgJ2NhdCBnaXR3ZWIubG9nJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAgICAnVVJMOiBwcm9qZWN0IFVSTHMgdmlhIGdpdHdlYi51cmwnIFwKKyAgICAgICAnZ2l0IGNvbmZpZyAtLWFkZCBnaXR3ZWIudXJsIGdpdDovL2V4YW1wbGUuY29tL2dpdC90cmFzaC5naXQgJiYKKyAgICAgICAgZ2l0IGNvbmZpZyAtLWFkZCBnaXR3ZWIudXJsIGh0dHA6Ly9leGFtcGxlLmNvbS9naXQvdHJhc2guZ2l0ICYmCisgICAgICAgIGdpdHdlYl9ydW4gInA9LmdpdDthPXN1bW1hcnkiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK2NhdCA+LmdpdC9jbG9uZXVybCA8PFxFT0YKK2dpdDovL2V4YW1wbGUuY29tL2dpdC90cmFzaC5naXQKK2h0dHA6Ly9leGFtcGxlLmNvbS9naXQvdHJhc2guZ2l0CitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgICAgJ1VSTDogcHJvamVjdCBVUkxzIHZpYSBjbG9uZXVybCBmaWxlJyBcCisgICAgICAgJ2dpdHdlYl9ydW4gInA9LmdpdDthPXN1bW1hcnkiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBnaXR3ZWIgY29uZmlnIGFuZCByZXBvIGNvbmZpZworCitjYXQgPj5naXR3ZWJfY29uZmlnLnBlcmwgPDxFT0YKKworXCRmZWF0dXJleydibGFtZSd9eydvdmVycmlkZSd9ID0gMTsKK1wkZmVhdHVyZXsnc25hcHNob3QnfXsnb3ZlcnJpZGUnfSA9IDE7CitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NvbmZpZyBvdmVycmlkZTogdHJlZSB2aWV3LCBmZWF0dXJlcyBkaXNhYmxlZCBpbiByZXBvIGNvbmZpZycgXAorCSdnaXQgY29uZmlnIGdpdHdlYi5ibGFtZSBubyAmJgorCSBnaXQgY29uZmlnIGdpdHdlYi5zbmFwc2hvdCBub25lICYmCisJIGdpdHdlYl9ydW4gInA9LmdpdDthPXRyZWUiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdjb25maWcgb3ZlcnJpZGU6IHRyZWUgdmlldywgZmVhdHVyZXMgZW5hYmxlZCBpbiByZXBvIGNvbmZpZycgXAorCSdnaXQgY29uZmlnIGdpdHdlYi5ibGFtZSB5ZXMgJiYKKwkgZ2l0IGNvbmZpZyBnaXR3ZWIuc25hcHNob3QgInppcCx0Z3osIHRiejIiICYmCisJIGdpdHdlYl9ydW4gInA9LmdpdDthPXRyZWUiJwordGVzdF9kZWJ1ZyAnY2F0IGdpdHdlYi5sb2cnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90OTYwMC1jdnNpbXBvcnQuc2ggYi90L3Q5NjAwLWN2c2ltcG9ydC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMGE3NGVlCi0tLSAvZGV2L251bGwKKysrIGIvdC90OTYwMC1jdnNpbXBvcnQuc2gKQEAgLTAsMCArMSwxNTAgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtY3ZzaW1wb3J0IGJhc2ljIHRlc3RzJworLiAuL3Rlc3QtbGliLnNoCisKK0NWU1JPT1Q9JChwd2QpL2N2c3Jvb3QKK2V4cG9ydCBDVlNST09UCisjIGZvciBjbGVhbiBjdnNwcyBjYWNoZQorSE9NRT0kKHB3ZCkKK2V4cG9ydCBIT01FCisKK2lmICEgdHlwZSBjdnMgPi9kZXYvbnVsbCAyPiYxCit0aGVuCisJc2F5ICdza2lwcGluZyBjdnNpbXBvcnQgdGVzdHMsIGN2cyBub3QgZm91bmQnCisJdGVzdF9kb25lCisJZXhpdAorZmkKKworY3ZzcHNfdmVyc2lvbj1gY3ZzcHMgLWggMj4mMSB8IHNlZCAtbmUgJ3MvY3ZzcHMgdmVyc2lvbiAvL3AnYAorY2FzZSAiJGN2c3BzX3ZlcnNpb24iIGluCisyLjEpCisJOzsKKycnKQorCXNheSAnc2tpcHBpbmcgY3ZzaW1wb3J0IHRlc3RzLCBjdnNwcyBub3QgZm91bmQnCisJdGVzdF9kb25lCisJZXhpdAorCTs7CisqKQorCXNheSAnc2tpcHBpbmcgY3ZzaW1wb3J0IHRlc3RzLCBjdnNwcyB0b28gb2xkJworCXRlc3RfZG9uZQorCWV4aXQKKwk7OworZXNhYworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZXR1cCBjdnNyb290JyAnY3ZzIGluaXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NldHVwIGEgY3ZzIG1vZHVsZScgJworCisJbWtkaXIgJENWU1JPT1QvbW9kdWxlICYmCisJY3ZzIGNvIC1kIG1vZHVsZS1jdnMgbW9kdWxlICYmCisJY2QgbW9kdWxlLWN2cyAmJgorCWNhdCA8PEVPRiA+b19mb3J0dW5hICYmCitPIEZvcnR1bmEKK3ZlbHV0IGx1bmEKK3N0YXR1IHZhcmlhYmlsaXMsCisKK3NlbXBlciBjcmVzY2lzCithdXQgZGVjcmVzY2lzOwordml0YSBkZXRlc3RhYmlsaXMKKworbnVuYyBvYmR1cmF0CitldCB0dW5jIGN1cmF0CitsdWRvIG1lbnRpcyBhY2llbSwKKworZWdlc3RhdGVtLAorcG90ZXN0YXRlbQorZGlzc29sdml0IHV0IGdsYWNpZW0uCitFT0YKKwljdnMgYWRkIG9fZm9ydHVuYSAmJgorCWNhdCA8PEVPRiA+bWVzc2FnZSAmJgorYWRkICJPIEZvcnR1bmEiIGx5cmljcworCitUaGVzZSBwdWJsaWMgZG9tYWluIGx5cmljcyBtYWtlIGFuIGV4Y2VsbGVudCBzYW1wbGUgdGV4dC4KK0VPRgorCWN2cyBjb21taXQgLUYgbWVzc2FnZSAmJgorCWNkIC4uCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ltcG9ydCBhIHRyaXZpYWwgbW9kdWxlJyAnCisKKwlnaXQgY3ZzaW1wb3J0IC1hIC16IDAgLUMgbW9kdWxlLWdpdCBtb2R1bGUgJiYKKwlnaXQgZGlmZiBtb2R1bGUtY3ZzL29fZm9ydHVuYSBtb2R1bGUtZ2l0L29fZm9ydHVuYQorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3BhY2sgcmVmcycgJ2NkIG1vZHVsZS1naXQgJiYgZ2l0IGdjICYmIGNkIC4uJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1cGRhdGUgY3ZzIG1vZHVsZScgJworCisJY2QgbW9kdWxlLWN2cyAmJgorCWNhdCA8PEVPRiA+b19mb3J0dW5hICYmCitPIEZvcnR1bmUsCitsaWtlIHRoZSBtb29uCit5b3UgYXJlIGNoYW5nZWFibGUsCisKK2V2ZXIgd2F4aW5nCithbmQgd2FuaW5nOworaGF0ZWZ1bCBsaWZlCisKK2ZpcnN0IG9wcHJlc3NlcworYW5kIHRoZW4gc29vdGhlcworYXMgZmFuY3kgdGFrZXMgaXQ7CisKK3BvdmVydHkKK2FuZCBwb3dlcgoraXQgbWVsdHMgdGhlbSBsaWtlIGljZS4KK0VPRgorCWNhdCA8PEVPRiA+bWVzc2FnZSAmJgordHJhbnNsYXRlIHRvIEVuZ2xpc2gKKworTXkgTGF0aW4gaXMgdGVycmlibGUuCitFT0YKKwljdnMgY29tbWl0IC1GIG1lc3NhZ2UgJiYKKwljZCAuLgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1cGRhdGUgZ2l0IG1vZHVsZScgJworCisJY2QgbW9kdWxlLWdpdCAmJgorCWdpdCBjdnNpbXBvcnQgLWEgLXogMCBtb2R1bGUgJiYKKwlnaXQgbWVyZ2Ugb3JpZ2luICYmCisJY2QgLi4gJiYKKwlnaXQgZGlmZiBtb2R1bGUtY3ZzL29fZm9ydHVuYSBtb2R1bGUtZ2l0L29fZm9ydHVuYQorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VwZGF0ZSBjdnMgbW9kdWxlJyAnCisKKwljZCBtb2R1bGUtY3ZzICYmCisJCWVjaG8gMSA+dGljayAmJgorCQljdnMgYWRkIHRpY2sgJiYKKwkJY3ZzIGNvbW1pdCAtbSAxCisJY2QgLi4KKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjdnNpbXBvcnQubW9kdWxlIGNvbmZpZyB3b3JrcycgJworCisJY2QgbW9kdWxlLWdpdCAmJgorCQlnaXQgY29uZmlnIGN2c2ltcG9ydC5tb2R1bGUgbW9kdWxlICYmCisJCWdpdCBjdnNpbXBvcnQgLWEgLXowICYmCisJCWdpdCBtZXJnZSBvcmlnaW4gJiYKKwljZCAuLiAmJgorCWdpdCBkaWZmIG1vZHVsZS1jdnMvdGljayBtb2R1bGUtZ2l0L3RpY2sKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbXBvcnQgZnJvbSBhIENWUyB3b3JraW5nIHRyZWUnICcKKworCWN2cyBjbyAtZCBpbXBvcnQtZnJvbS13dCBtb2R1bGUgJiYKKwljZCBpbXBvcnQtZnJvbS13dCAmJgorCQlnaXQgY3ZzaW1wb3J0IC1hIC16MCAmJgorCQllY2hvIDEgPmV4cGVjdCAmJgorCQlnaXQgbG9nIC0xIC0tcHJldHR5PWZvcm1hdDolcyVuID5hY3R1YWwgJiYKKwkJZ2l0IGRpZmYgYWN0dWFsIGV4cGVjdCAmJgorCWNkIC4uCisKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Rlc3QtbGliLnNoIGIvdC90ZXN0LWxpYi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzJhOGJhCi0tLSAvZGV2L251bGwKKysrIGIvdC90ZXN0LWxpYi5zaApAQCAtMCwwICsxLDQyNSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCisjIEtlZXAgdGhlIG9yaWdpbmFsIFRFUk0gZm9yIHNheV9jb2xvcgorT1JJR0lOQUxfVEVSTT0kVEVSTQorCisjIEZvciByZXBlYXRhYmlsaXR5LCByZXNldCB0aGUgZW52aXJvbm1lbnQgdG8ga25vd24gdmFsdWUuCitMQU5HPUMKK0xDX0FMTD1DCitQQUdFUj1jYXQKK1RaPVVUQworVEVSTT1kdW1iCitleHBvcnQgTEFORyBMQ19BTEwgUEFHRVIgVEVSTSBUWgorRURJVE9SPToKK1ZJU1VBTD06Cit1bnNldCBHSVRfRURJVE9SCit1bnNldCBBVVRIT1JfREFURQordW5zZXQgQVVUSE9SX0VNQUlMCit1bnNldCBBVVRIT1JfTkFNRQordW5zZXQgQ09NTUlUX0FVVEhPUl9FTUFJTAordW5zZXQgQ09NTUlUX0FVVEhPUl9OQU1FCit1bnNldCBFTUFJTAordW5zZXQgR0lUX0FMVEVSTkFURV9PQkpFQ1RfRElSRUNUT1JJRVMKK3Vuc2V0IEdJVF9BVVRIT1JfREFURQorR0lUX0FVVEhPUl9FTUFJTD1hdXRob3JAZXhhbXBsZS5jb20KK0dJVF9BVVRIT1JfTkFNRT0nQSBVIFRob3InCit1bnNldCBHSVRfQ09NTUlUVEVSX0RBVEUKK0dJVF9DT01NSVRURVJfRU1BSUw9Y29tbWl0dGVyQGV4YW1wbGUuY29tCitHSVRfQ09NTUlUVEVSX05BTUU9J0MgTyBNaXR0ZXInCit1bnNldCBHSVRfRElGRl9PUFRTCit1bnNldCBHSVRfRElSCit1bnNldCBHSVRfV09SS19UUkVFCit1bnNldCBHSVRfRVhURVJOQUxfRElGRgordW5zZXQgR0lUX0lOREVYX0ZJTEUKK3Vuc2V0IEdJVF9PQkpFQ1RfRElSRUNUT1JZCit1bnNldCBTSEExX0ZJTEVfRElSRUNUT1JJRVMKK3Vuc2V0IFNIQTFfRklMRV9ESVJFQ1RPUlkKK0dJVF9NRVJHRV9WRVJCT1NJVFk9NQorZXhwb3J0IEdJVF9NRVJHRV9WRVJCT1NJVFkKK2V4cG9ydCBHSVRfQVVUSE9SX0VNQUlMIEdJVF9BVVRIT1JfTkFNRQorZXhwb3J0IEdJVF9DT01NSVRURVJfRU1BSUwgR0lUX0NPTU1JVFRFUl9OQU1FCitleHBvcnQgRURJVE9SIFZJU1VBTAorR0lUX1RFU1RfQ01QPSR7R0lUX1RFU1RfQ01QOi1kaWZmIC11fQorCisjIFByb3RlY3Qgb3Vyc2VsdmVzIGZyb20gY29tbW9uIG1pc2NvbmZpZ3VyYXRpb24gdG8gZXhwb3J0CisjIENEUEFUSCBpbnRvIHRoZSBlbnZpcm9ubWVudAordW5zZXQgQ0RQQVRICisKK2Nhc2UgJChlY2hvICRHSVRfVFJBQ0UgfHRyICJbQS1aXSIgIlthLXpdIikgaW4KKwkxfDJ8dHJ1ZSkKKwkJZWNobyAiKiB3YXJuaW5nOiBTb21lIHRlc3RzIHdpbGwgbm90IHdvcmsgaWYgR0lUX1RSQUNFIiBcCisJCQkiaXMgc2V0IGFzIHRvIHRyYWNlIG9uIFNUREVSUiAhICoiCisJCWVjaG8gIiogd2FybmluZzogUGxlYXNlIHNldCBHSVRfVFJBQ0UgdG8gc29tZXRoaW5nIiBcCisJCQkib3RoZXIgdGhhbiAxLCAyIG9yIHRydWUgISAqIgorCQk7OworZXNhYworCisjIEVhY2ggdGVzdCBzaG91bGQgc3RhcnQgd2l0aCBzb21ldGhpbmcgbGlrZSB0aGlzLCBhZnRlciBjb3B5cmlnaHQgbm90aWNlczoKKyMKKyMgdGVzdF9kZXNjcmlwdGlvbj0nRGVzY3JpcHRpb24gb2YgdGhpcyB0ZXN0Li4uCisjIFRoaXMgdGVzdCBjaGVja3MgaWYgY29tbWFuZCB4eXp6eSBkb2VzIHRoZSByaWdodCB0aGluZy4uLgorIyAnCisjIC4gLi90ZXN0LWxpYi5zaAorWyAieCRPUklHSU5BTF9URVJNIiAhPSAieGR1bWIiIF0gJiYgKAorCQlURVJNPSRPUklHSU5BTF9URVJNICYmCisJCWV4cG9ydCBURVJNICYmCisJCVsgLXQgMSBdICYmCisJCXRwdXQgYm9sZCA+L2Rldi9udWxsIDI+JjEgJiYKKwkJdHB1dCBzZXRhZiAxID4vZGV2L251bGwgMj4mMSAmJgorCQl0cHV0IHNncjAgPi9kZXYvbnVsbCAyPiYxCisJKSAmJgorCWNvbG9yPXQKKword2hpbGUgdGVzdCAiJCMiIC1uZSAwCitkbworCWNhc2UgIiQxIiBpbgorCS1kfC0tZHwtLWRlfC0tZGVifC0tZGVidXwtLWRlYnVnKQorCQlkZWJ1Zz10OyBzaGlmdCA7OworCS1pfC0taXwtLWltfC0taW1tfC0taW1tZXwtLWltbWVkfC0taW1tZWRpfC0taW1tZWRpYXwtLWltbWVkaWF0fC0taW1tZWRpYXRlKQorCQlpbW1lZGlhdGU9dDsgc2hpZnQgOzsKKwktaHwtLWh8LS1oZXwtLWhlbHwtLWhlbHApCisJCWhlbHA9dDsgc2hpZnQgOzsKKwktdnwtLXZ8LS12ZXwtLXZlcnwtLXZlcmJ8LS12ZXJib3wtLXZlcmJvc3wtLXZlcmJvc2UpCisJCXZlcmJvc2U9dDsgc2hpZnQgOzsKKwktcXwtLXF8LS1xdXwtLXF1aXwtLXF1aWV8LS1xdWlldCkKKwkJcXVpZXQ9dDsgc2hpZnQgOzsKKwktLW5vLWNvbG9yKQorCQljb2xvcj07IHNoaWZ0IDs7CisJLS1uby1weXRob24pCisJCSMgbm9vcCBub3cuLi4KKwkJc2hpZnQgOzsKKwkqKQorCQlicmVhayA7OworCWVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGNvbG9yIjsgdGhlbgorCXNheV9jb2xvciAoKSB7CisJCSgKKwkJVEVSTT0kT1JJR0lOQUxfVEVSTQorCQlleHBvcnQgVEVSTQorCQljYXNlICIkMSIgaW4KKwkJCWVycm9yKSB0cHV0IGJvbGQ7IHRwdXQgc2V0YWYgMTs7ICMgYm9sZCByZWQKKwkJCXNraXApICB0cHV0IGJvbGQ7IHRwdXQgc2V0YWYgMjs7ICMgYm9sZCBncmVlbgorCQkJcGFzcykgIHRwdXQgc2V0YWYgMjs7ICAgICAgICAgICAgIyBncmVlbgorCQkJaW5mbykgIHRwdXQgc2V0YWYgMzs7ICAgICAgICAgICAgIyBicm93bgorCQkJKikgdGVzdCAtbiAiJHF1aWV0IiAmJiByZXR1cm47OworCQllc2FjCisJCXNoaWZ0CisJCWVjaG8gIiogJCoiCisJCXRwdXQgc2dyMAorCQkpCisJfQorZWxzZQorCXNheV9jb2xvcigpIHsKKwkJdGVzdCAteiAiJDEiICYmIHRlc3QgLW4gIiRxdWlldCIgJiYgcmV0dXJuCisJCXNoaWZ0CisJCWVjaG8gIiogJCoiCisJfQorZmkKKworZXJyb3IgKCkgeworCXNheV9jb2xvciBlcnJvciAiZXJyb3I6ICQqIgorCXRyYXAgLSBleGl0CisJZXhpdCAxCit9CisKK3NheSAoKSB7CisJc2F5X2NvbG9yIGluZm8gIiQqIgorfQorCit0ZXN0ICIke3Rlc3RfZGVzY3JpcHRpb259IiAhPSAiIiB8fAorZXJyb3IgIlRlc3Qgc2NyaXB0IGRpZCBub3Qgc2V0IHRlc3RfZGVzY3JpcHRpb24uIgorCitpZiB0ZXN0ICIkaGVscCIgPSAidCIKK3RoZW4KKwllY2hvICIkdGVzdF9kZXNjcmlwdGlvbiIKKwlleGl0IDAKK2ZpCisKK2V4ZWMgNT4mMQoraWYgdGVzdCAiJHZlcmJvc2UiID0gInQiCit0aGVuCisJZXhlYyA0PiYyIDM+JjEKK2Vsc2UKKwlleGVjIDQ+L2Rldi9udWxsIDM+L2Rldi9udWxsCitmaQorCit0ZXN0X2ZhaWx1cmU9MAordGVzdF9jb3VudD0wCit0ZXN0X2ZpeGVkPTAKK3Rlc3RfYnJva2VuPTAKKworZGllICgpIHsKKwllY2hvID4mNSAiRkFUQUw6IFVuZXhwZWN0ZWQgZXhpdCB3aXRoIGNvZGUgJD8iCisJZXhpdCAxCit9CisKK3RyYXAgJ2RpZScgZXhpdAorCit0ZXN0X3RpY2sgKCkgeworCWlmIHRlc3QgLXogIiR7dGVzdF90aWNrK3NldH0iCisJdGhlbgorCQl0ZXN0X3RpY2s9MTExMjkxMTk5MworCWVsc2UKKwkJdGVzdF90aWNrPSQoKCR0ZXN0X3RpY2sgKyA2MCkpCisJZmkKKwlHSVRfQ09NTUlUVEVSX0RBVEU9IiR0ZXN0X3RpY2sgLTA3MDAiCisJR0lUX0FVVEhPUl9EQVRFPSIkdGVzdF90aWNrIC0wNzAwIgorCWV4cG9ydCBHSVRfQ09NTUlUVEVSX0RBVEUgR0lUX0FVVEhPUl9EQVRFCit9CisKKyMgWW91IGFyZSBub3QgZXhwZWN0ZWQgdG8gY2FsbCB0ZXN0X29rXyBhbmQgdGVzdF9mYWlsdXJlXyBkaXJlY3RseSwgdXNlCisjIHRoZSB0ZXh0X2V4cGVjdF8qIGZ1bmN0aW9ucyBpbnN0ZWFkLgorCit0ZXN0X29rXyAoKSB7CisJdGVzdF9jb3VudD0kKGV4cHIgIiR0ZXN0X2NvdW50IiArIDEpCisJc2F5X2NvbG9yICIiICIgIG9rICR0ZXN0X2NvdW50OiAkQCIKK30KKwordGVzdF9mYWlsdXJlXyAoKSB7CisJdGVzdF9jb3VudD0kKGV4cHIgIiR0ZXN0X2NvdW50IiArIDEpCisJdGVzdF9mYWlsdXJlPSQoZXhwciAiJHRlc3RfZmFpbHVyZSIgKyAxKTsKKwlzYXlfY29sb3IgZXJyb3IgIkZBSUwgJHRlc3RfY291bnQ6ICQxIgorCXNoaWZ0CisJZWNobyAiJEAiIHwgc2VkIC1lICdzL14vCS8nCisJdGVzdCAiJGltbWVkaWF0ZSIgPSAiIiB8fCB7IHRyYXAgLSBleGl0OyBleGl0IDE7IH0KK30KKwordGVzdF9rbm93bl9icm9rZW5fb2tfICgpIHsKKwl0ZXN0X2NvdW50PSQoZXhwciAiJHRlc3RfY291bnQiICsgMSkKKwl0ZXN0X2ZpeGVkPSQoKCR0ZXN0X2ZpeGVkKzEpKQorCXNheV9jb2xvciAiIiAiICBGSVhFRCAkdGVzdF9jb3VudDogJEAiCit9CisKK3Rlc3Rfa25vd25fYnJva2VuX2ZhaWx1cmVfICgpIHsKKwl0ZXN0X2NvdW50PSQoZXhwciAiJHRlc3RfY291bnQiICsgMSkKKwl0ZXN0X2Jyb2tlbj0kKCgkdGVzdF9icm9rZW4rMSkpCisJc2F5X2NvbG9yIHNraXAgIiAgc3RpbGwgYnJva2VuICR0ZXN0X2NvdW50OiAkQCIKK30KKwordGVzdF9kZWJ1ZyAoKSB7CisJdGVzdCAiJGRlYnVnIiA9ICIiIHx8IGV2YWwgIiQxIgorfQorCit0ZXN0X3J1bl8gKCkgeworCWV2YWwgPiYzIDI+JjQgIiQxIgorCWV2YWxfcmV0PSIkPyIKKwlyZXR1cm4gMAorfQorCit0ZXN0X3NraXAgKCkgeworCXRoaXNfdGVzdD0kKGV4cHIgIi4vJDAiIDogJy4qL1wodFswLTldKlwpLVteL10qJCcpCisJdGhpc190ZXN0PSIkdGhpc190ZXN0LiQoZXhwciAiJHRlc3RfY291bnQiICsgMSkiCisJdG9fc2tpcD0KKwlmb3Igc2twIGluICRHSVRfU0tJUF9URVNUUworCWRvCisJCWNhc2UgIiR0aGlzX3Rlc3QiIGluCisJCSRza3ApCisJCQl0b19za2lwPXQKKwkJZXNhYworCWRvbmUKKwljYXNlICIkdG9fc2tpcCIgaW4KKwl0KQorCQlzYXlfY29sb3Igc2tpcCA+JjMgInNraXBwaW5nIHRlc3Q6ICRAIgorCQl0ZXN0X2NvdW50PSQoZXhwciAiJHRlc3RfY291bnQiICsgMSkKKwkJc2F5X2NvbG9yIHNraXAgInNraXAgJHRlc3RfY291bnQ6ICQxIgorCQk6IHRydWUKKwkJOzsKKwkqKQorCQlmYWxzZQorCQk7OworCWVzYWMKK30KKwordGVzdF9leHBlY3RfZmFpbHVyZSAoKSB7CisJdGVzdCAiJCMiID0gMiB8fAorCWVycm9yICJidWcgaW4gdGhlIHRlc3Qgc2NyaXB0OiBub3QgMiBwYXJhbWV0ZXJzIHRvIHRlc3QtZXhwZWN0LWZhaWx1cmUiCisJaWYgISB0ZXN0X3NraXAgIiRAIgorCXRoZW4KKwkJc2F5ID4mMyAiY2hlY2tpbmcga25vd24gYnJlYWthZ2U6ICQyIgorCQl0ZXN0X3J1bl8gIiQyIgorCQlpZiBbICIkPyIgPSAwIC1hICIkZXZhbF9yZXQiID0gMCBdCisJCXRoZW4KKwkJCXRlc3Rfa25vd25fYnJva2VuX29rXyAiJDEiCisJCWVsc2UKKwkJICAgIHRlc3Rfa25vd25fYnJva2VuX2ZhaWx1cmVfICIkMSIKKwkJZmkKKwlmaQorCWVjaG8gPiYzICIiCit9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgKCkgeworCXRlc3QgIiQjIiA9IDIgfHwKKwllcnJvciAiYnVnIGluIHRoZSB0ZXN0IHNjcmlwdDogbm90IDIgcGFyYW1ldGVycyB0byB0ZXN0LWV4cGVjdC1zdWNjZXNzIgorCWlmICEgdGVzdF9za2lwICIkQCIKKwl0aGVuCisJCXNheSA+JjMgImV4cGVjdGluZyBzdWNjZXNzOiAkMiIKKwkJdGVzdF9ydW5fICIkMiIKKwkJaWYgWyAiJD8iID0gMCAtYSAiJGV2YWxfcmV0IiA9IDAgXQorCQl0aGVuCisJCQl0ZXN0X29rXyAiJDEiCisJCWVsc2UKKwkJCXRlc3RfZmFpbHVyZV8gIiRAIgorCQlmaQorCWZpCisJZWNobyA+JjMgIiIKK30KKwordGVzdF9leHBlY3RfY29kZSAoKSB7CisJdGVzdCAiJCMiID0gMyB8fAorCWVycm9yICJidWcgaW4gdGhlIHRlc3Qgc2NyaXB0OiBub3QgMyBwYXJhbWV0ZXJzIHRvIHRlc3QtZXhwZWN0LWNvZGUiCisJaWYgISB0ZXN0X3NraXAgIiRAIgorCXRoZW4KKwkJc2F5ID4mMyAiZXhwZWN0aW5nIGV4aXQgY29kZSAkMTogJDMiCisJCXRlc3RfcnVuXyAiJDMiCisJCWlmIFsgIiQ/IiA9IDAgLWEgIiRldmFsX3JldCIgPSAiJDEiIF0KKwkJdGhlbgorCQkJdGVzdF9va18gIiQyIgorCQllbHNlCisJCQl0ZXN0X2ZhaWx1cmVfICIkQCIKKwkJZmkKKwlmaQorCWVjaG8gPiYzICIiCit9CisKKyMgVGhpcyBpcyBub3QgYW1vbmcgdG9wLWxldmVsICh0ZXN0X2V4cGVjdF9zdWNjZXNzIHwgdGVzdF9leHBlY3RfZmFpbHVyZSkKKyMgYnV0IGlzIGEgcHJlZml4IHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIHRlc3Qgc2NyaXB0LCBsaWtlOgorIworIwl0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb21wbGFpbiBhbmQgZGllJyAnCisjICAgICAgICAgICBkbyBzb21ldGhpbmcgJiYKKyMgICAgICAgICAgIGRvIHNvbWV0aGluZyBlbHNlICYmCisjCSAgICB0ZXN0X211c3RfZmFpbCBnaXQgY2hlY2tvdXQgLi4vb3V0ZXJzcGFjZQorIwknCisjCisjIFdyaXRpbmcgdGhpcyBhcyAiISBnaXQgY2hlY2tvdXQgLi4vb3V0ZXJzcGFjZSIgaXMgd3JvbmcsIGJlY2F1c2UKKyMgdGhlIGZhaWx1cmUgY291bGQgYmUgZHVlIHRvIGEgc2Vndi4gIFdlIHdhbnQgYSBjb250cm9sbGVkIGZhaWx1cmUuCisKK3Rlc3RfbXVzdF9mYWlsICgpIHsKKwkiJEAiCisJdGVzdCAkPyAtZ3QgMCAtYSAkPyAtbGUgMTI5Cit9CisKKyMgdGVzdF9jbXAgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdG8gY29tcGFyZSBhY3R1YWwgYW5kIGV4cGVjdGVkIG91dHB1dC4KKyMgWW91IGNhbiB1c2UgaXQgbGlrZToKKyMKKyMJdGVzdF9leHBlY3Rfc3VjY2VzcyAnZm9vIHdvcmtzJyAnCisjCQllY2hvIGV4cGVjdGVkID5leHBlY3RlZCAmJgorIwkJZm9vID5hY3R1YWwgJiYKKyMJCXRlc3RfY21wIGV4cGVjdGVkIGFjdHVhbAorIwknCisjCisjIFRoaXMgY291bGQgYmUgd3JpdHRlbiBhcyBlaXRoZXIgImNtcCIgb3IgImRpZmYgLXUiLCBidXQ6CisjIC0gY21wJ3Mgb3V0cHV0IGlzIG5vdCBuZWFybHkgYXMgZWFzeSB0byByZWFkIGFzIGRpZmYgLXUKKyMgLSBub3QgYWxsIGRpZmYgdmVyc2lvbnMgdW5kZXJzdGFuZCAiLXUiCisKK3Rlc3RfY21wKCkgeworCSRHSVRfVEVTVF9DTVAgIiRAIgorfQorCisjIE1vc3QgdGVzdHMgY2FuIHVzZSB0aGUgY3JlYXRlZCByZXBvc2l0b3J5LCBidXQgc29tZSBtYXkgbmVlZCB0byBjcmVhdGUgbW9yZS4KKyMgVXNhZ2U6IHRlc3RfY3JlYXRlX3JlcG8gPGRpcmVjdG9yeT4KK3Rlc3RfY3JlYXRlX3JlcG8gKCkgeworCXRlc3QgIiQjIiA9IDEgfHwKKwllcnJvciAiYnVnIGluIHRoZSB0ZXN0IHNjcmlwdDogbm90IDEgcGFyYW1ldGVyIHRvIHRlc3QtY3JlYXRlLXJlcG8iCisJb3dkPWBwd2RgCisJcmVwbz0iJDEiCisJbWtkaXIgIiRyZXBvIgorCWNkICIkcmVwbyIgfHwgZXJyb3IgIkNhbm5vdCBzZXR1cCB0ZXN0IGVudmlyb25tZW50IgorCSIkR0lUX0VYRUNfUEFUSC9naXQiIGluaXQgLS10ZW1wbGF0ZT0kR0lUX0VYRUNfUEFUSC90ZW1wbGF0ZXMvYmx0LyA+L2Rldi9udWxsIDI+JjEgfHwKKwllcnJvciAiY2Fubm90IHJ1biBnaXQgaW5pdCAtLSBoYXZlIHlvdSBidWlsdCB0aGluZ3MgeWV0PyIKKwltdiAuZ2l0L2hvb2tzIC5naXQvaG9va3MtZGlzYWJsZWQKKwljZCAiJG93ZCIKK30KKwordGVzdF9kb25lICgpIHsKKwl0cmFwIC0gZXhpdAorCisJaWYgdGVzdCAiJHRlc3RfZml4ZWQiICE9IDAKKwl0aGVuCisJCXNheV9jb2xvciBwYXNzICJmaXhlZCAkdGVzdF9maXhlZCBrbm93biBicmVha2FnZShzKSIKKwlmaQorCWlmIHRlc3QgIiR0ZXN0X2Jyb2tlbiIgIT0gMAorCXRoZW4KKwkJc2F5X2NvbG9yIGVycm9yICJzdGlsbCBoYXZlICR0ZXN0X2Jyb2tlbiBrbm93biBicmVha2FnZShzKSIKKwkJbXNnPSJyZW1haW5pbmcgJCgoJHRlc3RfY291bnQtJHRlc3RfYnJva2VuKSkgdGVzdChzKSIKKwllbHNlCisJCW1zZz0iJHRlc3RfY291bnQgdGVzdChzKSIKKwlmaQorCWNhc2UgIiR0ZXN0X2ZhaWx1cmUiIGluCisJMCkKKwkJIyBXZSBjb3VsZDoKKwkJIyBjZCAuLiAmJiBybSAtZnIgdHJhc2gKKwkJIyBidXQgdGhhdCBtZWFucyB3ZSBmb3JiaWQgYW55IHRlc3RzIHRoYXQgdXNlIHRoZWlyIG93bgorCQkjIHN1YmRpcmVjdG9yeSBmcm9tIGNhbGxpbmcgdGVzdF9kb25lIHdpdGhvdXQgY29taW5nIGJhY2sKKwkJIyB0byB3aGVyZSB0aGV5IHN0YXJ0ZWQgZnJvbS4KKwkJIyBUaGUgTWFrZWZpbGUgcHJvdmlkZWQgd2lsbCBjbGVhbiB0aGlzIHRlc3QgYXJlYSBzbworCQkjIHdlIHdpbGwgbGVhdmUgdGhpbmdzIGFzIHRoZXkgYXJlLgorCisJCXNheV9jb2xvciBwYXNzICJwYXNzZWQgYWxsICRtc2ciCisJCWV4aXQgMCA7OworCisJKikKKwkJc2F5X2NvbG9yIGVycm9yICJmYWlsZWQgJHRlc3RfZmFpbHVyZSBhbW9uZyAkbXNnIgorCQlleGl0IDEgOzsKKworCWVzYWMKK30KKworIyBUZXN0IHRoZSBiaW5hcmllcyB3ZSBoYXZlIGp1c3QgYnVpbHQuICBUaGUgdGVzdHMgYXJlIGtlcHQgaW4KKyMgdC8gc3ViZGlyZWN0b3J5IGFuZCBhcmUgcnVuIGluIHRyYXNoIHN1YmRpcmVjdG9yeS4KK1BBVEg9JChwd2QpLy4uOiRQQVRICitHSVRfRVhFQ19QQVRIPSQocHdkKS8uLgorR0lUX1RFTVBMQVRFX0RJUj0kKHB3ZCkvLi4vdGVtcGxhdGVzL2JsdAordW5zZXQgR0lUX0NPTkZJRwordW5zZXQgR0lUX0NPTkZJR19MT0NBTAorR0lUX0NPTkZJR19OT1NZU1RFTT0xCitHSVRfQ09ORklHX05PR0xPQkFMPTEKK2V4cG9ydCBQQVRIIEdJVF9FWEVDX1BBVEggR0lUX1RFTVBMQVRFX0RJUiBHSVRfQ09ORklHX05PU1lTVEVNIEdJVF9DT05GSUdfTk9HTE9CQUwKKworR0lUUEVSTExJQj0kKHB3ZCkvLi4vcGVybC9ibGliL2xpYjokKHB3ZCkvLi4vcGVybC9ibGliL2FyY2gvYXV0by9HaXQKK2V4cG9ydCBHSVRQRVJMTElCCit0ZXN0IC1kIC4uL3RlbXBsYXRlcy9ibHQgfHwgeworCWVycm9yICJZb3UgaGF2ZW4ndCBidWlsdCB0aGluZ3MgeWV0LCBoYXZlIHlvdT8iCit9CisKK2lmICEgdGVzdCAteCAuLi90ZXN0LWNobXRpbWU7IHRoZW4KKwllY2hvID4mMiAnWW91IG5lZWQgdG8gYnVpbGQgdGVzdC1jaG10aW1lOicKKwllY2hvID4mMiAnUnVuICJtYWtlIHRlc3QtY2htdGltZSIgaW4gdGhlIHNvdXJjZSAodG9wbGV2ZWwpIGRpcmVjdG9yeScKKwlleGl0IDEKK2ZpCisKKy4gLi4vR0lULUJVSUxELU9QVElPTlMKKworIyBUZXN0IHJlcG9zaXRvcnkKK3Rlc3Q9dHJhc2gKK3JtIC1mciAiJHRlc3QiIHx8IHsKKwl0cmFwIC0gZXhpdAorCWVjaG8gPiY1ICJGQVRBTDogQ2Fubm90IHByZXBhcmUgdGVzdCBhcmVhIgorCWV4aXQgMQorfQorCit0ZXN0X2NyZWF0ZV9yZXBvICR0ZXN0CitjZCAiJHRlc3QiCisKK3RoaXNfdGVzdD0kKGV4cHIgIi4vJDAiIDogJy4qL1wodFswLTldKlwpLVteL10qJCcpCitmb3Igc2twIGluICRHSVRfU0tJUF9URVNUUworZG8KKwl0b19za2lwPQorCWZvciBza3AgaW4gJEdJVF9TS0lQX1RFU1RTCisJZG8KKwkJY2FzZSAiJHRoaXNfdGVzdCIgaW4KKwkJJHNrcCkKKwkJCXRvX3NraXA9dAorCQllc2FjCisJZG9uZQorCWNhc2UgIiR0b19za2lwIiBpbgorCXQpCisJCXNheV9jb2xvciBza2lwID4mMyAic2tpcHBpbmcgdGVzdCAkdGhpc190ZXN0IGFsdG9nZXRoZXIiCisJCXNheV9jb2xvciBza2lwICJza2lwIGFsbCB0ZXN0cyBpbiAkdGhpc190ZXN0IgorCQl0ZXN0X2RvbmUKKwllc2FjCitkb25lCmRpZmYgLS1naXQgYS90L3Rlc3Q0MDEyLnBuZyBiL3QvdGVzdDQwMTIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMTgxZDEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Rlc3Q0MDEyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90L3Rlc3Q5MjAwYS5wbmcgYi90L3Rlc3Q5MjAwYS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IxODFkMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdGVzdDkyMDBhLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90L3Rlc3Q5MjAwYi5wbmcgYi90L3Rlc3Q5MjAwYi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMyMmNjYgotLS0gL2Rldi9udWxsCisrKyBiL3QvdGVzdDkyMDBiLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90YWcuYyBiL3RhZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NzBkMmIKLS0tIC9kZXYvbnVsbAorKysgYi90YWcuYwpAQCAtMCwwICsxLDExNCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgImJsb2IuaCIKKworY29uc3QgY2hhciAqdGFnX3R5cGUgPSAidGFnIjsKKworc3RydWN0IG9iamVjdCAqZGVyZWZfdGFnKHN0cnVjdCBvYmplY3QgKm8sIGNvbnN0IGNoYXIgKndhcm4sIGludCB3YXJubGVuKQoreworCXdoaWxlIChvICYmIG8tPnR5cGUgPT0gT0JKX1RBRykKKwkJaWYgKCgoc3RydWN0IHRhZyAqKW8pLT50YWdnZWQpCisJCQlvID0gcGFyc2Vfb2JqZWN0KCgoc3RydWN0IHRhZyAqKW8pLT50YWdnZWQtPnNoYTEpOworCQllbHNlCisJCQlvID0gTlVMTDsKKwlpZiAoIW8gJiYgd2FybikgeworCQlpZiAoIXdhcm5sZW4pCisJCQl3YXJubGVuID0gc3RybGVuKHdhcm4pOworCQllcnJvcigibWlzc2luZyBvYmplY3QgcmVmZXJlbmNlZCBieSAnJS4qcyciLCB3YXJubGVuLCB3YXJuKTsKKwl9CisJcmV0dXJuIG87Cit9CisKK3N0cnVjdCB0YWcgKmxvb2t1cF90YWcoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBsb29rdXBfb2JqZWN0KHNoYTEpOworCWlmICghb2JqKQorCQlyZXR1cm4gY3JlYXRlX29iamVjdChzaGExLCBPQkpfVEFHLCBhbGxvY190YWdfbm9kZSgpKTsKKwlpZiAoIW9iai0+dHlwZSkKKwkJb2JqLT50eXBlID0gT0JKX1RBRzsKKyAgICAgICAgaWYgKG9iai0+dHlwZSAhPSBPQkpfVEFHKSB7CisgICAgICAgICAgICAgICAgZXJyb3IoIk9iamVjdCAlcyBpcyBhICVzLCBub3QgYSB0YWciLAorICAgICAgICAgICAgICAgICAgICAgIHNoYTFfdG9faGV4KHNoYTEpLCB0eXBlbmFtZShvYmotPnR5cGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHN0cnVjdCB0YWcgKikgb2JqOworfQorCitpbnQgcGFyc2VfdGFnX2J1ZmZlcihzdHJ1Y3QgdGFnICppdGVtLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaW50IHR5cGVsZW4sIHRhZ2xlbjsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWNvbnN0IGNoYXIgKnR5cGVfbGluZSwgKnRhZ19saW5lLCAqc2lnX2xpbmU7CisJY2hhciB0eXBlWzIwXTsKKwljb25zdCBjaGFyICpzdGFydCA9IGRhdGE7CisKKyAgICAgICAgaWYgKGl0ZW0tPm9iamVjdC5wYXJzZWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGl0ZW0tPm9iamVjdC5wYXJzZWQgPSAxOworCisJaWYgKHNpemUgPCA2NCkKKwkJcmV0dXJuIC0xOworCWlmIChtZW1jbXAoIm9iamVjdCAiLCBkYXRhLCA3KSB8fCBnZXRfc2hhMV9oZXgoKGNoYXIgKikgZGF0YSArIDcsIHNoYTEpKQorCQlyZXR1cm4gLTE7CisKKwl0eXBlX2xpbmUgPSAoY2hhciAqKSBkYXRhICsgNDg7CisJaWYgKG1lbWNtcCgiXG50eXBlICIsIHR5cGVfbGluZS0xLCA2KSkKKwkJcmV0dXJuIC0xOworCisJdGFnX2xpbmUgPSBtZW1jaHIodHlwZV9saW5lLCAnXG4nLCBzaXplIC0gKHR5cGVfbGluZSAtIHN0YXJ0KSk7CisJaWYgKCF0YWdfbGluZSB8fCBtZW1jbXAoInRhZyAiLCArK3RhZ19saW5lLCA0KSkKKwkJcmV0dXJuIC0xOworCisJc2lnX2xpbmUgPSBtZW1jaHIodGFnX2xpbmUsICdcbicsIHNpemUgLSAodGFnX2xpbmUgLSBzdGFydCkpOworCWlmICghc2lnX2xpbmUpCisJCXJldHVybiAtMTsKKwlzaWdfbGluZSsrOworCisJdHlwZWxlbiA9IHRhZ19saW5lIC0gdHlwZV9saW5lIC0gc3RybGVuKCJ0eXBlIFxuIik7CisJaWYgKHR5cGVsZW4gPj0gMjApCisJCXJldHVybiAtMTsKKwltZW1jcHkodHlwZSwgdHlwZV9saW5lICsgNSwgdHlwZWxlbik7CisJdHlwZVt0eXBlbGVuXSA9ICdcMCc7CisJdGFnbGVuID0gc2lnX2xpbmUgLSB0YWdfbGluZSAtIHN0cmxlbigidGFnIFxuIik7CisJaXRlbS0+dGFnID0geG1lbWR1cHoodGFnX2xpbmUgKyA0LCB0YWdsZW4pOworCisJaWYgKCFzdHJjbXAodHlwZSwgYmxvYl90eXBlKSkgeworCQlpdGVtLT50YWdnZWQgPSAmbG9va3VwX2Jsb2Ioc2hhMSktPm9iamVjdDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAodHlwZSwgdHJlZV90eXBlKSkgeworCQlpdGVtLT50YWdnZWQgPSAmbG9va3VwX3RyZWUoc2hhMSktPm9iamVjdDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAodHlwZSwgY29tbWl0X3R5cGUpKSB7CisJCWl0ZW0tPnRhZ2dlZCA9ICZsb29rdXBfY29tbWl0KHNoYTEpLT5vYmplY3Q7CisJfSBlbHNlIGlmICghc3RyY21wKHR5cGUsIHRhZ190eXBlKSkgeworCQlpdGVtLT50YWdnZWQgPSAmbG9va3VwX3RhZyhzaGExKS0+b2JqZWN0OworCX0gZWxzZSB7CisJCWVycm9yKCJVbmtub3duIHR5cGUgJXMiLCB0eXBlKTsKKwkJaXRlbS0+dGFnZ2VkID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHBhcnNlX3RhZyhzdHJ1Y3QgdGFnICppdGVtKQoreworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwl2b2lkICpkYXRhOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgcmV0OworCisJaWYgKGl0ZW0tPm9iamVjdC5wYXJzZWQpCisJCXJldHVybiAwOworCWRhdGEgPSByZWFkX3NoYTFfZmlsZShpdGVtLT5vYmplY3Quc2hhMSwgJnR5cGUsICZzaXplKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiBlcnJvcigiQ291bGQgbm90IHJlYWQgJXMiLAorCQkJICAgICBzaGExX3RvX2hleChpdGVtLT5vYmplY3Quc2hhMSkpOworCWlmICh0eXBlICE9IE9CSl9UQUcpIHsKKwkJZnJlZShkYXRhKTsKKwkJcmV0dXJuIGVycm9yKCJPYmplY3QgJXMgbm90IGEgdGFnIiwKKwkJCSAgICAgc2hhMV90b19oZXgoaXRlbS0+b2JqZWN0LnNoYTEpKTsKKwl9CisJcmV0ID0gcGFyc2VfdGFnX2J1ZmZlcihpdGVtLCBkYXRhLCBzaXplKTsKKwlmcmVlKGRhdGEpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90YWcuaCBiL3RhZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMGNiMDAKLS0tIC9kZXYvbnVsbAorKysgYi90YWcuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIFRBR19ICisjZGVmaW5lIFRBR19ICisKKyNpbmNsdWRlICJvYmplY3QuaCIKKworZXh0ZXJuIGNvbnN0IGNoYXIgKnRhZ190eXBlOworCitzdHJ1Y3QgdGFnIHsKKwlzdHJ1Y3Qgb2JqZWN0IG9iamVjdDsKKwlzdHJ1Y3Qgb2JqZWN0ICp0YWdnZWQ7CisJY2hhciAqdGFnOworCWNoYXIgKnNpZ25hdHVyZTsgLyogbm90IGFjdHVhbGx5IGltcGxlbWVudGVkICovCit9OworCitleHRlcm4gc3RydWN0IHRhZyAqbG9va3VwX3RhZyhjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK2V4dGVybiBpbnQgcGFyc2VfdGFnX2J1ZmZlcihzdHJ1Y3QgdGFnICppdGVtLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUpOworZXh0ZXJuIGludCBwYXJzZV90YWcoc3RydWN0IHRhZyAqaXRlbSk7CitleHRlcm4gc3RydWN0IG9iamVjdCAqZGVyZWZfdGFnKHN0cnVjdCBvYmplY3QgKiwgY29uc3QgY2hhciAqLCBpbnQpOworCisjZW5kaWYgLyogVEFHX0ggKi8KZGlmZiAtLWdpdCBhL3Rhci5oIGIvdGFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ2NzcwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rhci5oCkBAIC0wLDAgKzEsMjUgQEAKKyNkZWZpbmUgVFlQRUZMQUdfQVVUTwkJJ1wwJworI2RlZmluZSBUWVBFRkxBR19SRUcJCScwJworI2RlZmluZSBUWVBFRkxBR19MTksJCScyJworI2RlZmluZSBUWVBFRkxBR19ESVIJCSc1JworI2RlZmluZSBUWVBFRkxBR19HTE9CQUxfSEVBREVSCSdnJworI2RlZmluZSBUWVBFRkxBR19FWFRfSEVBREVSCSd4JworCitzdHJ1Y3QgdXN0YXJfaGVhZGVyIHsKKwljaGFyIG5hbWVbMTAwXTsJCS8qICAgMCAqLworCWNoYXIgbW9kZVs4XTsJCS8qIDEwMCAqLworCWNoYXIgdWlkWzhdOwkJLyogMTA4ICovCisJY2hhciBnaWRbOF07CQkvKiAxMTYgKi8KKwljaGFyIHNpemVbMTJdOwkJLyogMTI0ICovCisJY2hhciBtdGltZVsxMl07CQkvKiAxMzYgKi8KKwljaGFyIGNoa3N1bVs4XTsJCS8qIDE0OCAqLworCWNoYXIgdHlwZWZsYWdbMV07CS8qIDE1NiAqLworCWNoYXIgbGlua25hbWVbMTAwXTsJLyogMTU3ICovCisJY2hhciBtYWdpY1s2XTsJCS8qIDI1NyAqLworCWNoYXIgdmVyc2lvblsyXTsJLyogMjYzICovCisJY2hhciB1bmFtZVszMl07CQkvKiAyNjUgKi8KKwljaGFyIGduYW1lWzMyXTsJCS8qIDI5NyAqLworCWNoYXIgZGV2bWFqb3JbOF07CS8qIDMyOSAqLworCWNoYXIgZGV2bWlub3JbOF07CS8qIDMzNyAqLworCWNoYXIgcHJlZml4WzE1NV07CS8qIDM0NSAqLworfTsKZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy8uZ2l0aWdub3JlIGIvdGVtcGxhdGVzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1OWVjYgotLS0gL2Rldi9udWxsCisrKyBiL3RlbXBsYXRlcy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMiBAQAorYmx0Citib2lsZXJwbGF0ZXMubWFkZQpkaWZmIC0tZ2l0IGEvdGVtcGxhdGVzL01ha2VmaWxlIGIvdGVtcGxhdGVzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYTlkMTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvTWFrZWZpbGUKQEAgLTAsMCArMSw1MSBAQAorIyBtYWtlIGFuZCBpbnN0YWxsIHNhbXBsZSB0ZW1wbGF0ZXMKKworaWZuZGVmIFYKKwlRVUlFVCA9IEAKK2VuZGlmCisKK0lOU1RBTEwgPz0gaW5zdGFsbAorVEFSID89IHRhcgorUk0gPz0gcm0gLWYKK3ByZWZpeCA/PSAkKEhPTUUpCit0ZW1wbGF0ZV9kaXIgPz0gJChwcmVmaXgpL3NoYXJlL2dpdC1jb3JlL3RlbXBsYXRlcworIyBERVNURElSPQorCisjIFNoZWxsIHF1b3RlIChkbyBub3QgdXNlICQoY2FsbCkgdG8gYWNjb21tb2RhdGUgYW5jaWVudCBzZXR1cHMpOworREVTVERJUl9TUSA9ICQoc3Vic3QgJywnXCcnLCQoREVTVERJUikpCit0ZW1wbGF0ZV9kaXJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKHRlbXBsYXRlX2RpcikpCisKK2FsbDogYm9pbGVycGxhdGVzLm1hZGUgY3VzdG9tCisKKyMgUHV0IHRlbXBsYXRlcyB0aGF0IGNhbiBiZSBjb3BpZWQgc3RyYWlnaHQgZnJvbSB0aGUgc291cmNlCisjIGluIGEgZmlsZSBkaXJlYy0tdG9yeS0tZmlsZSBpbiB0aGUgc291cmNlLiAgVGhleSB3aWxsIGJlCisjIGp1c3QgY29waWVkIHRvIHRoZSBkZXN0aW5hdGlvbi4KKworYnBzcmMgPSAkKGZpbHRlci1vdXQgJX4sJCh3aWxkY2FyZCAqLS0qKSkKK2JvaWxlcnBsYXRlcy5tYWRlIDogJChicHNyYykKKwkkKFFVSUVUKWxzICotLSogMj4vZGV2L251bGwgfCBcCisJd2hpbGUgcmVhZCBib2lsZXJwbGF0ZTsgXAorCWRvIFwKKwkJY2FzZSAiJCRib2lsZXJwbGF0ZSIgaW4gKn4pIGNvbnRpbnVlIDs7IGVzYWMgJiYgXAorCQlkc3Q9YGVjaG8gIiQkYm9pbGVycGxhdGUiIHwgc2VkIC1lICdzfF50aGlzfC58O3N8LS18L3xnJ2AgJiYgXAorCQlkaXI9YGV4cHIgIiQkZHN0IiA6ICdcKC4qXCkvJ2AgJiYgXAorCQkkKElOU1RBTEwpIC1kIC1tIDc1NSBibHQvJCRkaXIgJiYgXAorCQljYXNlICIkJGJvaWxlcnBsYXRlIiBpbiBcCisJCSotLSkgOzsgXAorCQkqKSBjcCAtcCAkJGJvaWxlcnBsYXRlIGJsdC8kJGRzdCA7OyBcCisJCWVzYWMgfHwgZXhpdDsgXAorCWRvbmUgJiYgXAorCWRhdGUgPiRACisKKyMgSWYgeW91IG5lZWQgYnVpbGQtdGFpbG9yZWQgdGVtcGxhdGVzLCBidWlsZCB0aGVtIGludG8gYmx0LworIyBkaXJlY3RvcnkgeW91cnNlbGYgaGVyZS4KK2N1c3RvbToKKwkkKFFVSUVUKTogbm8gY3VzdG9tIHRlbXBsYXRlcyB5ZXQKKworY2xlYW46CisJJChSTSkgLXIgYmx0IGJvaWxlcnBsYXRlcy5tYWRlCisKK2luc3RhbGw6IGFsbAorCSQoSU5TVEFMTCkgLWQgLW0gNzU1ICckKERFU1RESVJfU1EpJCh0ZW1wbGF0ZV9kaXJfU1EpJworCShjZCBibHQgJiYgJChUQVIpIGNmIC0gLikgfCBcCisJKGNkICckKERFU1RESVJfU1EpJCh0ZW1wbGF0ZV9kaXJfU1EpJyAmJiB1bWFzayAwMjIgJiYgJChUQVIpIHhmIC0pCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvYnJhbmNoZXMtLSBiL3RlbXBsYXRlcy9icmFuY2hlcy0tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZTg4NzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvYnJhbmNoZXMtLQpAQCAtMCwwICsxIEBACis6IHRoaXMgaXMganVzdCB0byBlbnN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvaG9va3MtLWFwcGx5cGF0Y2gtbXNnIGIvdGVtcGxhdGVzL2hvb2tzLS1hcHBseXBhdGNoLW1zZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmRlMWVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVtcGxhdGVzL2hvb2tzLS1hcHBseXBhdGNoLW1zZwpAQCAtMCwwICsxLDE1IEBACisjIS9iaW4vc2gKKyMKKyMgQW4gZXhhbXBsZSBob29rIHNjcmlwdCB0byBjaGVjayB0aGUgY29tbWl0IGxvZyBtZXNzYWdlIHRha2VuIGJ5CisjIGFwcGx5cGF0Y2ggZnJvbSBhbiBlLW1haWwgbWVzc2FnZS4KKyMKKyMgVGhlIGhvb2sgc2hvdWxkIGV4aXQgd2l0aCBub24temVybyBzdGF0dXMgYWZ0ZXIgaXNzdWluZyBhbgorIyBhcHByb3ByaWF0ZSBtZXNzYWdlIGlmIGl0IHdhbnRzIHRvIHN0b3AgdGhlIGNvbW1pdC4gIFRoZSBob29rIGlzCisjIGFsbG93ZWQgdG8gZWRpdCB0aGUgY29tbWl0IG1lc3NhZ2UgZmlsZS4KKyMKKyMgVG8gZW5hYmxlIHRoaXMgaG9vaywgbWFrZSB0aGlzIGZpbGUgZXhlY3V0YWJsZS4KKworLiBnaXQtc2gtc2V0dXAKK3Rlc3QgLXggIiRHSVRfRElSL2hvb2tzL2NvbW1pdC1tc2ciICYmCisJZXhlYyAiJEdJVF9ESVIvaG9va3MvY29tbWl0LW1zZyIgJHsxKyIkQCJ9Cis6CmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvaG9va3MtLWNvbW1pdC1tc2cgYi90ZW1wbGF0ZXMvaG9va3MtLWNvbW1pdC1tc2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVmODZlYgotLS0gL2Rldi9udWxsCisrKyBiL3RlbXBsYXRlcy9ob29rcy0tY29tbWl0LW1zZwpAQCAtMCwwICsxLDI0IEBACisjIS9iaW4vc2gKKyMKKyMgQW4gZXhhbXBsZSBob29rIHNjcmlwdCB0byBjaGVjayB0aGUgY29tbWl0IGxvZyBtZXNzYWdlLgorIyBDYWxsZWQgYnkgZ2l0LWNvbW1pdCB3aXRoIG9uZSBhcmd1bWVudCwgdGhlIG5hbWUgb2YgdGhlIGZpbGUKKyMgdGhhdCBoYXMgdGhlIGNvbW1pdCBtZXNzYWdlLiAgVGhlIGhvb2sgc2hvdWxkIGV4aXQgd2l0aCBub24temVybworIyBzdGF0dXMgYWZ0ZXIgaXNzdWluZyBhbiBhcHByb3ByaWF0ZSBtZXNzYWdlIGlmIGl0IHdhbnRzIHRvIHN0b3AgdGhlCisjIGNvbW1pdC4gIFRoZSBob29rIGlzIGFsbG93ZWQgdG8gZWRpdCB0aGUgY29tbWl0IG1lc3NhZ2UgZmlsZS4KKyMKKyMgVG8gZW5hYmxlIHRoaXMgaG9vaywgbWFrZSB0aGlzIGZpbGUgZXhlY3V0YWJsZS4KKworIyBVbmNvbW1lbnQgdGhlIGJlbG93IHRvIGFkZCBhIFNpZ25lZC1vZmYtYnkgbGluZSB0byB0aGUgbWVzc2FnZS4KKyMgRG9pbmcgdGhpcyBpbiBhIGhvb2sgaXMgYSBiYWQgaWRlYSBpbiBnZW5lcmFsLCBidXQgdGhlIHByZXBhcmUtY29tbWl0LW1zZworIyBob29rIGlzIG1vcmUgc3VpdGVkIHRvIGl0LgorIworIyBTT0I9JChnaXQgdmFyIEdJVF9BVVRIT1JfSURFTlQgfCBzZWQgLW4gJ3MvXlwoLio+XCkuKiQvU2lnbmVkLW9mZi1ieTogXDEvcCcpCisjIGdyZXAgLXFzICJeJFNPQiIgIiQxIiB8fCBlY2hvICIkU09CIiA+PiAiJDEiCisKKyMgVGhpcyBleGFtcGxlIGNhdGNoZXMgZHVwbGljYXRlIFNpZ25lZC1vZmYtYnkgbGluZXMuCisKK3Rlc3QgIiIgPSAiJChncmVwICdeU2lnbmVkLW9mZi1ieTogJyAiJDEiIHwKKwkgc29ydCB8IHVuaXEgLWMgfCBzZWQgLWUgJy9eWyAJXSoxWyAJXS9kJykiIHx8IHsKKwllY2hvID4mMiBEdXBsaWNhdGUgU2lnbmVkLW9mZi1ieSBsaW5lcy4KKwlleGl0IDEKK30KZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy9ob29rcy0tcG9zdC1jb21taXQgYi90ZW1wbGF0ZXMvaG9va3MtLXBvc3QtY29tbWl0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZTZmMzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvaG9va3MtLXBvc3QtY29tbWl0CkBAIC0wLDAgKzEsOCBAQAorIyEvYmluL3NoCisjCisjIEFuIGV4YW1wbGUgaG9vayBzY3JpcHQgdGhhdCBpcyBjYWxsZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsCisjIGNvbW1pdCBpcyBtYWRlLgorIworIyBUbyBlbmFibGUgdGhpcyBob29rLCBtYWtlIHRoaXMgZmlsZSBleGVjdXRhYmxlLgorCis6IE5vdGhpbmcKZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy9ob29rcy0tcG9zdC1yZWNlaXZlIGIvdGVtcGxhdGVzL2hvb2tzLS1wb3N0LXJlY2VpdmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcwYzhmZAotLS0gL2Rldi9udWxsCisrKyBiL3RlbXBsYXRlcy9ob29rcy0tcG9zdC1yZWNlaXZlCkBAIC0wLDAgKzEsMTYgQEAKKyMhL2Jpbi9zaAorIworIyBBbiBleGFtcGxlIGhvb2sgc2NyaXB0IGZvciB0aGUgcG9zdC1yZWNlaXZlIGV2ZW50CisjCisjIFRoaXMgc2NyaXB0IGlzIHJ1biBhZnRlciByZWNlaXZlLXBhY2sgaGFzIGFjY2VwdGVkIGEgcGFjayBhbmQgdGhlCisjIHJlcG9zaXRvcnkgaGFzIGJlZW4gdXBkYXRlZC4gIEl0IGlzIHBhc3NlZCBhcmd1bWVudHMgaW4gdGhyb3VnaCBzdGRpbgorIyBpbiB0aGUgZm9ybQorIyAgPG9sZHJldj4gPG5ld3Jldj4gPHJlZm5hbWU+CisjIEZvciBleGFtcGxlOgorIyAgYWE0NTMyMTZkMWIzZTQ5ZTdmNmY5ODQ0MWZhNTY5NDZkZGNkNmEyMCA2OGY3YWJmNGU2ZjkyMjgwNzg4OWY1MmJjMDQzZWNkMzFiNzlmODE0IHJlZnMvaGVhZHMvbWFzdGVyCisjCisjIHNlZSBjb250cmliL2hvb2tzLyBmb3IgYW4gc2FtcGxlLCBvciB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSAob24gZGViaWFuKQorIworCisKKyMuIC91c3Ivc2hhcmUvZG9jL2dpdC1jb3JlL2NvbnRyaWIvaG9va3MvcG9zdC1yZWNlaXZlLWVtYWlsCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvaG9va3MtLXBvc3QtdXBkYXRlIGIvdGVtcGxhdGVzL2hvb2tzLS1wb3N0LXVwZGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2JhODkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVtcGxhdGVzL2hvb2tzLS1wb3N0LXVwZGF0ZQpAQCAtMCwwICsxLDggQEAKKyMhL2Jpbi9zaAorIworIyBBbiBleGFtcGxlIGhvb2sgc2NyaXB0IHRvIHByZXBhcmUgYSBwYWNrZWQgcmVwb3NpdG9yeSBmb3IgdXNlIG92ZXIKKyMgZHVtYiB0cmFuc3BvcnRzLgorIworIyBUbyBlbmFibGUgdGhpcyBob29rLCBtYWtlIHRoaXMgZmlsZSBleGVjdXRhYmxlIGJ5ICJjaG1vZCAreCBwb3N0LXVwZGF0ZSIuCisKK2V4ZWMgZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mbwpkaWZmIC0tZ2l0IGEvdGVtcGxhdGVzL2hvb2tzLS1wcmUtYXBwbHlwYXRjaCBiL3RlbXBsYXRlcy9ob29rcy0tcHJlLWFwcGx5cGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVjY2M5MwotLS0gL2Rldi9udWxsCisrKyBiL3RlbXBsYXRlcy9ob29rcy0tcHJlLWFwcGx5cGF0Y2gKQEAgLTAsMCArMSwxNCBAQAorIyEvYmluL3NoCisjCisjIEFuIGV4YW1wbGUgaG9vayBzY3JpcHQgdG8gdmVyaWZ5IHdoYXQgaXMgYWJvdXQgdG8gYmUgY29tbWl0dGVkCisjIGJ5IGFwcGx5cGF0Y2ggZnJvbSBhbiBlLW1haWwgbWVzc2FnZS4KKyMKKyMgVGhlIGhvb2sgc2hvdWxkIGV4aXQgd2l0aCBub24temVybyBzdGF0dXMgYWZ0ZXIgaXNzdWluZyBhbgorIyBhcHByb3ByaWF0ZSBtZXNzYWdlIGlmIGl0IHdhbnRzIHRvIHN0b3AgdGhlIGNvbW1pdC4KKyMKKyMgVG8gZW5hYmxlIHRoaXMgaG9vaywgbWFrZSB0aGlzIGZpbGUgZXhlY3V0YWJsZS4KKworLiBnaXQtc2gtc2V0dXAKK3Rlc3QgLXggIiRHSVRfRElSL2hvb2tzL3ByZS1jb21taXQiICYmCisJZXhlYyAiJEdJVF9ESVIvaG9va3MvcHJlLWNvbW1pdCIgJHsxKyIkQCJ9Cis6CmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvaG9va3MtLXByZS1jb21taXQgYi90ZW1wbGF0ZXMvaG9va3MtLXByZS1jb21taXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI1ZGNlNgotLS0gL2Rldi9udWxsCisrKyBiL3RlbXBsYXRlcy9ob29rcy0tcHJlLWNvbW1pdApAQCAtMCwwICsxLDcwIEBACisjIS9iaW4vc2gKKyMKKyMgQW4gZXhhbXBsZSBob29rIHNjcmlwdCB0byB2ZXJpZnkgd2hhdCBpcyBhYm91dCB0byBiZSBjb21taXR0ZWQuCisjIENhbGxlZCBieSBnaXQtY29tbWl0IHdpdGggbm8gYXJndW1lbnRzLiAgVGhlIGhvb2sgc2hvdWxkCisjIGV4aXQgd2l0aCBub24temVybyBzdGF0dXMgYWZ0ZXIgaXNzdWluZyBhbiBhcHByb3ByaWF0ZSBtZXNzYWdlIGlmCisjIGl0IHdhbnRzIHRvIHN0b3AgdGhlIGNvbW1pdC4KKyMKKyMgVG8gZW5hYmxlIHRoaXMgaG9vaywgbWFrZSB0aGlzIGZpbGUgZXhlY3V0YWJsZS4KKworIyBUaGlzIGlzIHNsaWdodGx5IG1vZGlmaWVkIGZyb20gQW5kcmV3IE1vcnRvbidzIFBlcmZlY3QgUGF0Y2guCisjIExpbmVzIHlvdSBpbnRyb2R1Y2Ugc2hvdWxkIG5vdCBoYXZlIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisjIEFsc28gY2hlY2sgZm9yIGFuIGluZGVudGF0aW9uIHRoYXQgaGFzIFNQIGJlZm9yZSBhIFRBQi4KKworaWYgZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBIRUFEIDI+L2Rldi9udWxsCit0aGVuCisJZ2l0LWRpZmYtaW5kZXggLXAgLU0gLS1jYWNoZWQgSEVBRCAtLQorZWxzZQorCSMgTkVFRFNXT1JLOiB3ZSBzaG91bGQgcHJvZHVjZSBhIGRpZmYgd2l0aCBhbiBlbXB0eSB0cmVlIGhlcmUKKwkjIGlmIHdlIHdhbnQgdG8gZG8gdGhlIHNhbWUgdmVyaWZpY2F0aW9uIGZvciB0aGUgaW5pdGlhbCBpbXBvcnQuCisJOgorZmkgfAorcGVybCAtZSAnCisgICAgbXkgJGZvdW5kX2JhZCA9IDA7CisgICAgbXkgJGZpbGVuYW1lOworICAgIG15ICRyZXBvcnRlZF9maWxlbmFtZSA9ICIiOworICAgIG15ICRsaW5lbm87CisgICAgc3ViIGJhZF9saW5lIHsKKwlteSAoJHdoeSwgJGxpbmUpID0gQF87CisJaWYgKCEkZm91bmRfYmFkKSB7CisJICAgIHByaW50IFNUREVSUiAiKlxuIjsKKwkgICAgcHJpbnQgU1RERVJSICIqIFlvdSBoYXZlIHNvbWUgc3VzcGljaW91cyBwYXRjaCBsaW5lczpcbiI7CisJICAgIHByaW50IFNUREVSUiAiKlxuIjsKKwkgICAgJGZvdW5kX2JhZCA9IDE7CisJfQorCWlmICgkcmVwb3J0ZWRfZmlsZW5hbWUgbmUgJGZpbGVuYW1lKSB7CisJICAgIHByaW50IFNUREVSUiAiKiBJbiAkZmlsZW5hbWVcbiI7CisJICAgICRyZXBvcnRlZF9maWxlbmFtZSA9ICRmaWxlbmFtZTsKKwl9CisJcHJpbnQgU1RERVJSICIqICR3aHkgKGxpbmUgJGxpbmVubylcbiI7CisJcHJpbnQgU1RERVJSICIkZmlsZW5hbWU6JGxpbmVubzokbGluZVxuIjsKKyAgICB9CisgICAgd2hpbGUgKDw+KSB7CisJaWYgKG18XmRpZmYgLS1naXQgYS8oLiopIGIvXDEkfCkgeworCSAgICAkZmlsZW5hbWUgPSAkMTsKKwkgICAgbmV4dDsKKwl9CisJaWYgKC9eQEAgLVxTKyBcKyhcZCspLykgeworCSAgICAkbGluZW5vID0gJDEgLSAxOworCSAgICBuZXh0OworCX0KKwlpZiAoL14gLykgeworCSAgICAkbGluZW5vKys7CisJICAgIG5leHQ7CisJfQorCWlmIChzL15cKy8vKSB7CisJICAgICRsaW5lbm8rKzsKKwkgICAgY2hvbXA7CisJICAgIGlmICgvXHMkLykgeworCQliYWRfbGluZSgidHJhaWxpbmcgd2hpdGVzcGFjZSIsICRfKTsKKwkgICAgfQorCSAgICBpZiAoL15ccyogXHQvKSB7CisJCWJhZF9saW5lKCJpbmRlbnQgU1AgZm9sbG93ZWQgYnkgYSBUQUIiLCAkXyk7CisJICAgIH0KKwkgICAgaWYgKC9eKFs8Pl0pXDF7Nn0gfF49ezd9JC8pIHsKKwkJYmFkX2xpbmUoInVucmVzb2x2ZWQgbWVyZ2UgY29uZmxpY3QiLCAkXyk7CisJICAgIH0KKwl9CisgICAgfQorICAgIGV4aXQoJGZvdW5kX2JhZCk7CisnCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvaG9va3MtLXByZS1yZWJhc2UgYi90ZW1wbGF0ZXMvaG9va3MtLXByZS1yZWJhc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxYzQ1NAotLS0gL2Rldi9udWxsCisrKyBiL3RlbXBsYXRlcy9ob29rcy0tcHJlLXJlYmFzZQpAQCAtMCwwICsxLDE1MCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBKdW5pbyBDIEhhbWFubworIworCitwdWJsaXNoPW5leHQKK2Jhc2VicmFuY2g9IiQxIgoraWYgdGVzdCAiJCMiID0gMgordGhlbgorCXRvcGljPSJyZWZzL2hlYWRzLyQyIgorZWxzZQorCXRvcGljPWBnaXQgc3ltYm9saWMtcmVmIEhFQURgCitmaQorCitjYXNlICIkYmFzZWJyYW5jaCwkdG9waWMiIGluCittYXN0ZXIscmVmcy9oZWFkcy8/Py8qKQorCTs7CisqKQorCWV4aXQgMCA7IyB3ZSBkbyBub3QgaW50ZXJydXB0IG90aGVycy4KKwk7OworZXNhYworCisjIE5vdyB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgdG9waWMgYnJhbmNoIGJlaW5nIHJlYmFzZWQKKyMgb24gdG9wIG9mIG1hc3Rlci4gIElzIGl0IE9LIHRvIHJlYmFzZSBpdD8KKworIyBJcyB0b3BpYyBmdWxseSBtZXJnZWQgdG8gbWFzdGVyPworbm90X2luX21hc3Rlcj1gZ2l0LXJldi1saXN0IC0tcHJldHR5PW9uZWxpbmUgXm1hc3RlciAiJHRvcGljImAKK2lmIHRlc3QgLXogIiRub3RfaW5fbWFzdGVyIgordGhlbgorCWVjaG8gPiYyICIkdG9waWMgaXMgZnVsbHkgbWVyZ2VkIHRvIG1hc3RlcjsgYmV0dGVyIHJlbW92ZSBpdC4iCisJZXhpdCAxIDsjIHdlIGNvdWxkIGFsbG93IGl0LCBidXQgdGhlcmUgaXMgbm8gcG9pbnQuCitmaQorCisjIElzIHRvcGljIGV2ZXIgbWVyZ2VkIHRvIG5leHQ/ICBJZiBzbyB5b3Ugc2hvdWxkIG5vdCBiZSByZWJhc2luZyBpdC4KK29ubHlfbmV4dF8xPWBnaXQtcmV2LWxpc3QgXm1hc3RlciAiXiR0b3BpYyIgJHtwdWJsaXNofSB8IHNvcnRgCitvbmx5X25leHRfMj1gZ2l0LXJldi1saXN0IF5tYXN0ZXIgICAgICAgICAgICR7cHVibGlzaH0gfCBzb3J0YAoraWYgdGVzdCAiJG9ubHlfbmV4dF8xIiA9ICIkb25seV9uZXh0XzIiCit0aGVuCisJbm90X2luX3RvcGljPWBnaXQtcmV2LWxpc3QgIl4kdG9waWMiIG1hc3RlcmAKKwlpZiB0ZXN0IC16ICIkbm90X2luX3RvcGljIgorCXRoZW4KKwkJZWNobyA+JjIgIiR0b3BpYyBpcyBhbHJlYWR5IHVwLXRvLWRhdGUgd2l0aCBtYXN0ZXIiCisJCWV4aXQgMSA7IyB3ZSBjb3VsZCBhbGxvdyBpdCwgYnV0IHRoZXJlIGlzIG5vIHBvaW50LgorCWVsc2UKKwkJZXhpdCAwCisJZmkKK2Vsc2UKKwlub3RfaW5fbmV4dD1gZ2l0LXJldi1saXN0IC0tcHJldHR5PW9uZWxpbmUgXiR7cHVibGlzaH0gIiR0b3BpYyJgCisJcGVybCAtZSAnCisJCW15ICR0b3BpYyA9ICRBUkdWWzBdOworCQlteSAkbXNnID0gIiogJHRvcGljIGhhcyBjb21taXRzIGFscmVhZHkgbWVyZ2VkIHRvIHB1YmxpYyBicmFuY2g6XG4iOworCQlteSAoJW5vdF9pbl9uZXh0KSA9IG1hcCB7CisJCQkvXihbMC05YS1mXSspIC87CisJCQkoJDEgPT4gMSk7CisJCX0gc3BsaXQoL1xuLywgJEFSR1ZbMV0pOworCQlmb3IgbXkgJGVsZW0gKG1hcCB7CisJCQkJL14oWzAtOWEtZl0rKSAoLiopJC87CisJCQkJWyQxID0+ICQyXTsKKwkJCX0gc3BsaXQoL1xuLywgJEFSR1ZbMl0pKSB7CisJCQlpZiAoIWV4aXN0cyAkbm90X2luX25leHR7JGVsZW0tPlswXX0pIHsKKwkJCQlpZiAoJG1zZykgeworCQkJCQlwcmludCBTVERFUlIgJG1zZzsKKwkJCQkJdW5kZWYgJG1zZzsKKwkJCQl9CisJCQkJcHJpbnQgU1RERVJSICIgJGVsZW0tPlsxXVxuIjsKKwkJCX0KKwkJfQorCScgIiR0b3BpYyIgIiRub3RfaW5fbmV4dCIgIiRub3RfaW5fbWFzdGVyIgorCWV4aXQgMQorZmkKKworZXhpdCAwCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworVGhpcyBzYW1wbGUgaG9vayBzYWZlZ3VhcmRzIHRvcGljIGJyYW5jaGVzIHRoYXQgaGF2ZSBiZWVuCitwdWJsaXNoZWQgZnJvbSBiZWluZyByZXdvdW5kLgorCitUaGUgd29ya2Zsb3cgYXNzdW1lZCBoZXJlIGlzOgorCisgKiBPbmNlIGEgdG9waWMgYnJhbmNoIGZvcmtzIGZyb20gIm1hc3RlciIsICJtYXN0ZXIiIGlzIG5ldmVyCisgICBtZXJnZWQgaW50byBpdCBhZ2FpbiAoZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpLgorCisgKiBPbmNlIGEgdG9waWMgYnJhbmNoIGlzIGZ1bGx5IGNvb2tlZCBhbmQgbWVyZ2VkIGludG8gIm1hc3RlciIsCisgICBpdCBpcyBkZWxldGVkLiAgSWYgeW91IG5lZWQgdG8gYnVpbGQgb24gdG9wIG9mIGl0IHRvIGNvcnJlY3QKKyAgIGVhcmxpZXIgbWlzdGFrZXMsIGEgbmV3IHRvcGljIGJyYW5jaCBpcyBjcmVhdGVkIGJ5IGZvcmtpbmcgYXQKKyAgIHRoZSB0aXAgb2YgdGhlICJtYXN0ZXIiLiAgVGhpcyBpcyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBidXQKKyAgIGl0IG1ha2VzIGl0IGVhc2llciB0byBrZWVwIHlvdXIgaGlzdG9yeSBzaW1wbGUuCisKKyAqIFdoZW5ldmVyIHlvdSBuZWVkIHRvIHRlc3Qgb3IgcHVibGlzaCB5b3VyIGNoYW5nZXMgdG8gdG9waWMKKyAgIGJyYW5jaGVzLCBtZXJnZSB0aGVtIGludG8gIm5leHQiIGJyYW5jaC4KKworVGhlIHNjcmlwdCwgYmVpbmcgYW4gZXhhbXBsZSwgaGFyZGNvZGVzIHRoZSBwdWJsaXNoIGJyYW5jaCBuYW1lCit0byBiZSAibmV4dCIsIGJ1dCBpdCBpcyB0cml2aWFsIHRvIG1ha2UgaXQgY29uZmlndXJhYmxlIHZpYQorJEdJVF9ESVIvY29uZmlnIG1lY2hhbmlzbS4KKworV2l0aCB0aGlzIHdvcmtmbG93LCB5b3Ugd291bGQgd2FudCB0byBrbm93OgorCisoMSkgLi4uIGlmIGEgdG9waWMgYnJhbmNoIGhhcyBldmVyIGJlZW4gbWVyZ2VkIHRvICJuZXh0Ii4gIFlvdW5nCisgICAgdG9waWMgYnJhbmNoZXMgY2FuIGhhdmUgc3R1cGlkIG1pc3Rha2VzIHlvdSB3b3VsZCByYXRoZXIKKyAgICBjbGVhbiB1cCBiZWZvcmUgcHVibGlzaGluZywgYW5kIHRoaW5ncyB0aGF0IGhhdmUgbm90IGJlZW4KKyAgICBtZXJnZWQgaW50byBvdGhlciBicmFuY2hlcyBjYW4gYmUgZWFzaWx5IHJlYmFzZWQgd2l0aG91dAorICAgIGFmZmVjdGluZyBvdGhlciBwZW9wbGUuICBCdXQgb25jZSBpdCBpcyBwdWJsaXNoZWQsIHlvdSB3b3VsZAorICAgIG5vdCB3YW50IHRvIHJld2luZCBpdC4KKworKDIpIC4uLiBpZiBhIHRvcGljIGJyYW5jaCBoYXMgYmVlbiBmdWxseSBtZXJnZWQgdG8gIm1hc3RlciIuCisgICAgVGhlbiB5b3UgY2FuIGRlbGV0ZSBpdC4gIE1vcmUgaW1wb3J0YW50bHksIHlvdSBzaG91bGQgbm90CisgICAgYnVpbGQgb24gdG9wIG9mIGl0IC0tIG90aGVyIHBlb3BsZSBtYXkgYWxyZWFkeSB3YW50IHRvCisgICAgY2hhbmdlIHRoaW5ncyByZWxhdGVkIHRvIHRoZSB0b3BpYyBhcyBwYXRjaGVzIGFnYWluc3QgeW91cgorICAgICJtYXN0ZXIiLCBzbyBpZiB5b3UgbmVlZCBmdXJ0aGVyIGNoYW5nZXMsIGl0IGlzIGJldHRlciB0bworICAgIGZvcmsgdGhlIHRvcGljIChwZXJoYXBzIHdpdGggdGhlIHNhbWUgbmFtZSkgYWZyZXNoIGZyb20gdGhlCisgICAgdGlwIG9mICJtYXN0ZXIiLgorCitMZXQncyBsb29rIGF0IHRoaXMgZXhhbXBsZToKKworCQkgICBvLS0tby0tLW8tLS1vLS0tby0tLW8tLS1vLS0tby0tLW8tLS1vICJuZXh0IgorCQkgIC8gICAgICAgLyAgICAgICAgICAgLyAgICAgICAgICAgLworCQkgLyAgIGEtLS1hLS0tYiBBICAgICAvICAgICAgICAgICAvCisJCS8gICAvICAgICAgICAgICAgICAgLyAgICAgICAgICAgLworCSAgICAgICAvICAgLyAgIGMtLS1jLS0tYy0tLWMgQiAgICAgICAgIC8KKwkgICAgICAvICAgLyAgIC8gICAgICAgICAgICAgXCAgICAgICAgIC8KKwkgICAgIC8gICAvICAgLyAgIGItLS1iIEMgICAgIFwgICAgICAgLworCSAgICAvICAgLyAgIC8gICAvICAgICAgICAgICAgIFwgICAgIC8KKyAgICAtLS1vLS0tby0tLW8tLS1vLS0tby0tLW8tLS1vLS0tby0tLW8tLS1vLS0tbyAibWFzdGVyIgorCisKK0EsIEIgYW5kIEMgYXJlIHRvcGljIGJyYW5jaGVzLgorCisgKiBBIGhhcyBvbmUgZml4IHNpbmNlIGl0IHdhcyBtZXJnZWQgdXAgdG8gIm5leHQiLgorCisgKiBCIGhhcyBmaW5pc2hlZC4gIEl0IGhhcyBiZWVuIGZ1bGx5IG1lcmdlZCB1cCB0byAibWFzdGVyIiBhbmQgIm5leHQiLAorICAgYW5kIGlzIHJlYWR5IHRvIGJlIGRlbGV0ZWQuCisKKyAqIEMgaGFzIG5vdCBtZXJnZWQgdG8gIm5leHQiIGF0IGFsbC4KKworV2Ugd291bGQgd2FudCB0byBhbGxvdyBDIHRvIGJlIHJlYmFzZWQsIHJlZnVzZSBBLCBhbmQgZW5jb3VyYWdlCitCIHRvIGJlIGRlbGV0ZWQuCisKK1RvIGNvbXB1dGUgKDEpOgorCisJZ2l0LXJldi1saXN0IF5tYXN0ZXIgXnRvcGljIG5leHQKKwlnaXQtcmV2LWxpc3QgXm1hc3RlciAgICAgICAgbmV4dAorCisJaWYgdGhlc2UgbWF0Y2gsIHRvcGljIGhhcyBub3QgbWVyZ2VkIGluIG5leHQgYXQgYWxsLgorCitUbyBjb21wdXRlICgyKToKKworCWdpdC1yZXYtbGlzdCBtYXN0ZXIuLnRvcGljCisKKwlpZiB0aGlzIGlzIGVtcHR5LCBpdCBpcyBmdWxseSBtZXJnZWQgdG8gIm1hc3RlciIuCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvaG9va3MtLXByZXBhcmUtY29tbWl0LW1zZyBiL3RlbXBsYXRlcy9ob29rcy0tcHJlcGFyZS1jb21taXQtbXNnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMGY0MmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvaG9va3MtLXByZXBhcmUtY29tbWl0LW1zZwpAQCAtMCwwICsxLDM2IEBACisjIS9iaW4vc2gKKyMKKyMgQW4gZXhhbXBsZSBob29rIHNjcmlwdCB0byBwcmVwYXJlIHRoZSBjb21taXQgbG9nIG1lc3NhZ2UuCisjIENhbGxlZCBieSBnaXQtY29tbWl0IHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCBoYXMgdGhlCisjIGNvbW1pdCBtZXNzYWdlLCBmb2xsb3dlZCBieSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGNvbW1pdAorIyBtZXNzYWdlJ3Mgc291cmNlLiAgVGhlIGhvb2sncyBwdXJwb3NlIGlzIHRvIGVkaXQgdGhlIGNvbW1pdAorIyBtZXNzYWdlIGZpbGUuICBJZiB0aGUgaG9vayBmYWlscyB3aXRoIGEgbm9uLXplcm8gc3RhdHVzLAorIyB0aGUgY29tbWl0IGlzIGFib3J0ZWQuCisjCisjIFRvIGVuYWJsZSB0aGlzIGhvb2ssIG1ha2UgdGhpcyBmaWxlIGV4ZWN1dGFibGUuCisKKyMgVGhpcyBob29rIGluY2x1ZGVzIHRocmVlIGV4YW1wbGVzLiAgVGhlIGZpcnN0IGNvbW1lbnRzIG91dCB0aGUKKyMgIkNvbmZsaWN0czoiIHBhcnQgb2YgYSBtZXJnZSBjb21taXQuCisjCisjIFRoZSBzZWNvbmQgaW5jbHVkZXMgdGhlIG91dHB1dCBvZiAiZ2l0IGRpZmYgLS1uYW1lLXN0YXR1cyAtciIKKyMgaW50byB0aGUgbWVzc2FnZSwganVzdCBiZWZvcmUgdGhlICJnaXQgc3RhdHVzIiBvdXRwdXQuICBJdCBpcworIyBjb21tZW50ZWQgYmVjYXVzZSBpdCBkb2Vzbid0IGNvcGUgd2l0aCAtLWFtZW5kIG9yIHdpdGggc3F1YXNoZWQKKyMgY29tbWl0cy4KKyMKKyMgVGhlIHRoaXJkIGV4YW1wbGUgYWRkcyBhIFNpZ25lZC1vZmYtYnkgbGluZSB0byB0aGUgbWVzc2FnZSwgdGhhdCBjYW4KKyMgc3RpbGwgYmUgZWRpdGVkLiAgVGhpcyBpcyByYXJlbHkgYSBnb29kIGlkZWEuCisKK2Nhc2UgIiQyICQzIiBpbgorICBtZXJnZSkKKyAgICBzZWQgLWkgJy9eQ29uZmxpY3RzOi8sLyMvIWI7cy9eLyMgJi87cy9eIyAjLyMvJyAiJDEiIDs7CisKKyMgIiJ8dGVtcGxhdGUpCisjICAgcGVybCAtaSAtcGUgJworIyAgICAgIHByaW50ICJcbiIgLiBgZ2l0IGRpZmYgLS1jYWNoZWQgLS1uYW1lLXN0YXR1cyAtcmAKKyMJIGlmIC9eIy8gJiYgJGZpcnN0KysgPT0gMCcgIiQxIiA7OworCisgICopIDs7Citlc2FjCisKKyMgU09CPSQoZ2l0IHZhciBHSVRfQVVUSE9SX0lERU5UIHwgc2VkIC1uICdzL15cKC4qPlwpLiokL1NpZ25lZC1vZmYtYnk6IFwxL3AnKQorIyBncmVwIC1xcyAiXiRTT0IiICIkMSIgfHwgZWNobyAiJFNPQiIgPj4gIiQxIgpkaWZmIC0tZ2l0IGEvdGVtcGxhdGVzL2hvb2tzLS11cGRhdGUgYi90ZW1wbGF0ZXMvaG9va3MtLXVwZGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjY5MjY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVtcGxhdGVzL2hvb2tzLS11cGRhdGUKQEAgLTAsMCArMSwxMDcgQEAKKyMhL2Jpbi9zaAorIworIyBBbiBleGFtcGxlIGhvb2sgc2NyaXB0IHRvIGJsb2NrcyB1bmFubm90YXRlZCB0YWdzIGZyb20gZW50ZXJpbmcuCisjIENhbGxlZCBieSBnaXQtcmVjZWl2ZS1wYWNrIHdpdGggYXJndW1lbnRzOiByZWZuYW1lIHNoYTEtb2xkIHNoYTEtbmV3CisjCisjIFRvIGVuYWJsZSB0aGlzIGhvb2ssIG1ha2UgdGhpcyBmaWxlIGV4ZWN1dGFibGUgYnkgImNobW9kICt4IHVwZGF0ZSIuCisjCisjIENvbmZpZworIyAtLS0tLS0KKyMgaG9va3MuYWxsb3d1bmFubm90YXRlZAorIyAgIFRoaXMgYm9vbGVhbiBzZXRzIHdoZXRoZXIgdW5hbm5vdGF0ZWQgdGFncyB3aWxsIGJlIGFsbG93ZWQgaW50byB0aGUKKyMgICByZXBvc2l0b3J5LiAgQnkgZGVmYXVsdCB0aGV5IHdvbid0IGJlLgorIyBob29rcy5hbGxvd2RlbGV0ZXRhZworIyAgIFRoaXMgYm9vbGVhbiBzZXRzIHdoZXRoZXIgZGVsZXRpbmcgdGFncyB3aWxsIGJlIGFsbG93ZWQgaW4gdGhlCisjICAgcmVwb3NpdG9yeS4gIEJ5IGRlZmF1bHQgdGhleSB3b24ndCBiZS4KKyMgaG9va3MuYWxsb3dkZWxldGVicmFuY2gKKyMgICBUaGlzIGJvb2xlYW4gc2V0cyB3aGV0aGVyIGRlbGV0aW5nIGJyYW5jaGVzIHdpbGwgYmUgYWxsb3dlZCBpbiB0aGUKKyMgICByZXBvc2l0b3J5LiAgQnkgZGVmYXVsdCB0aGV5IHdvbid0IGJlLgorIworCisjIC0tLSBDb21tYW5kIGxpbmUKK3JlZm5hbWU9IiQxIgorb2xkcmV2PSIkMiIKK25ld3Jldj0iJDMiCisKKyMgLS0tIFNhZmV0eSBjaGVjaworaWYgWyAteiAiJEdJVF9ESVIiIF07IHRoZW4KKwllY2hvICJEb24ndCBydW4gdGhpcyBzY3JpcHQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiIgPiYyCisJZWNobyAiIChpZiB5b3Ugd2FudCwgeW91IGNvdWxkIHN1cHBseSBHSVRfRElSIHRoZW4gcnVuIiA+JjIKKwllY2hvICIgICQwIDxyZWY+IDxvbGRyZXY+IDxuZXdyZXY+KSIgPiYyCisJZXhpdCAxCitmaQorCitpZiBbIC16ICIkcmVmbmFtZSIgLW8gLXogIiRvbGRyZXYiIC1vIC16ICIkbmV3cmV2IiBdOyB0aGVuCisJZWNobyAiVXNhZ2U6ICQwIDxyZWY+IDxvbGRyZXY+IDxuZXdyZXY+IiA+JjIKKwlleGl0IDEKK2ZpCisKKyMgLS0tIENvbmZpZworYWxsb3d1bmFubm90YXRlZD0kKGdpdCBjb25maWcgLS1ib29sIGhvb2tzLmFsbG93dW5hbm5vdGF0ZWQpCithbGxvd2RlbGV0ZWJyYW5jaD0kKGdpdCBjb25maWcgLS1ib29sIGhvb2tzLmFsbG93ZGVsZXRlYnJhbmNoKQorYWxsb3dkZWxldGV0YWc9JChnaXQgY29uZmlnIC0tYm9vbCBob29rcy5hbGxvd2RlbGV0ZXRhZykKKworIyBjaGVjayBmb3Igbm8gZGVzY3JpcHRpb24KK3Byb2plY3RkZXNjPSQoc2VkIC1lICcxcScgIiRHSVRfRElSL2Rlc2NyaXB0aW9uIikKK2lmIFsgLXogIiRwcm9qZWN0ZGVzYyIgLW8gIiRwcm9qZWN0ZGVzYyIgPSAiVW5uYW1lZCByZXBvc2l0b3J5OyBlZGl0IHRoaXMgZmlsZSB0byBuYW1lIGl0IGZvciBnaXR3ZWIuIiBdOyB0aGVuCisJZWNobyAiKioqIFByb2plY3QgZGVzY3JpcHRpb24gZmlsZSBoYXNuJ3QgYmVlbiBzZXQiID4mMgorCWV4aXQgMQorZmkKKworIyAtLS0gQ2hlY2sgdHlwZXMKKyMgaWYgJG5ld3JldiBpcyAwMDAwLi4uMDAwMCwgaXQncyBhIGNvbW1pdCB0byBkZWxldGUgYSByZWYuCitpZiBbICIkbmV3cmV2IiA9ICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiBdOyB0aGVuCisJbmV3cmV2X3R5cGU9ZGVsZXRlCitlbHNlCisJbmV3cmV2X3R5cGU9JChnaXQtY2F0LWZpbGUgLXQgJG5ld3JldikKK2ZpCisKK2Nhc2UgIiRyZWZuYW1lIiwiJG5ld3Jldl90eXBlIiBpbgorCXJlZnMvdGFncy8qLGNvbW1pdCkKKwkJIyB1bi1hbm5vdGF0ZWQgdGFnCisJCXNob3J0X3JlZm5hbWU9JHtyZWZuYW1lIyNyZWZzL3RhZ3MvfQorCQlpZiBbICIkYWxsb3d1bmFubm90YXRlZCIgIT0gInRydWUiIF07IHRoZW4KKwkJCWVjaG8gIioqKiBUaGUgdW4tYW5ub3RhdGVkIHRhZywgJHNob3J0X3JlZm5hbWUsIGlzIG5vdCBhbGxvd2VkIGluIHRoaXMgcmVwb3NpdG9yeSIgPiYyCisJCQllY2hvICIqKiogVXNlICdnaXQgdGFnIFsgLWEgfCAtcyBdJyBmb3IgdGFncyB5b3Ugd2FudCB0byBwcm9wYWdhdGUuIiA+JjIKKwkJCWV4aXQgMQorCQlmaQorCQk7OworCXJlZnMvdGFncy8qLGRlbGV0ZSkKKwkJIyBkZWxldGUgdGFnCisJCWlmIFsgIiRhbGxvd2RlbGV0ZXRhZyIgIT0gInRydWUiIF07IHRoZW4KKwkJCWVjaG8gIioqKiBEZWxldGluZyBhIHRhZyBpcyBub3QgYWxsb3dlZCBpbiB0aGlzIHJlcG9zaXRvcnkiID4mMgorCQkJZXhpdCAxCisJCWZpCisJCTs7CisJcmVmcy90YWdzLyosdGFnKQorCQkjIGFubm90YXRlZCB0YWcKKwkJOzsKKwlyZWZzL2hlYWRzLyosY29tbWl0KQorCQkjIGJyYW5jaAorCQk7OworCXJlZnMvaGVhZHMvKixkZWxldGUpCisJCSMgZGVsZXRlIGJyYW5jaAorCQlpZiBbICIkYWxsb3dkZWxldGVicmFuY2giICE9ICJ0cnVlIiBdOyB0aGVuCisJCQllY2hvICIqKiogRGVsZXRpbmcgYSBicmFuY2ggaXMgbm90IGFsbG93ZWQgaW4gdGhpcyByZXBvc2l0b3J5IiA+JjIKKwkJCWV4aXQgMQorCQlmaQorCQk7OworCXJlZnMvcmVtb3Rlcy8qLGNvbW1pdCkKKwkJIyB0cmFja2luZyBicmFuY2gKKwkJOzsKKwlyZWZzL3JlbW90ZXMvKixkZWxldGUpCisJCSMgZGVsZXRlIHRyYWNraW5nIGJyYW5jaAorCQlpZiBbICIkYWxsb3dkZWxldGVicmFuY2giICE9ICJ0cnVlIiBdOyB0aGVuCisJCQllY2hvICIqKiogRGVsZXRpbmcgYSB0cmFja2luZyBicmFuY2ggaXMgbm90IGFsbG93ZWQgaW4gdGhpcyByZXBvc2l0b3J5IiA+JjIKKwkJCWV4aXQgMQorCQlmaQorCQk7OworCSopCisJCSMgQW55dGhpbmcgZWxzZSAoaXMgdGhlcmUgYW55dGhpbmcgZWxzZT8pCisJCWVjaG8gIioqKiBVcGRhdGUgaG9vazogdW5rbm93biB0eXBlIG9mIHVwZGF0ZSB0byByZWYgJHJlZm5hbWUgb2YgdHlwZSAkbmV3cmV2X3R5cGUiID4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKKworIyAtLS0gRmluaXNoZWQKK2V4aXQgMApkaWZmIC0tZ2l0IGEvdGVtcGxhdGVzL2luZm8tLWV4Y2x1ZGUgYi90ZW1wbGF0ZXMvaW5mby0tZXhjbHVkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzg3YjcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVtcGxhdGVzL2luZm8tLWV4Y2x1ZGUKQEAgLTAsMCArMSw2IEBACisjIGdpdC1scy1maWxlcyAtLW90aGVycyAtLWV4Y2x1ZGUtZnJvbT0uZ2l0L2luZm8vZXhjbHVkZQorIyBMaW5lcyB0aGF0IHN0YXJ0IHdpdGggJyMnIGFyZSBjb21tZW50cy4KKyMgRm9yIGEgcHJvamVjdCBtb3N0bHkgaW4gQywgdGhlIGZvbGxvd2luZyB3b3VsZCBiZSBhIGdvb2Qgc2V0IG9mCisjIGV4Y2x1ZGUgcGF0dGVybnMgKHVuY29tbWVudCB0aGVtIGlmIHlvdSB3YW50IHRvIHVzZSB0aGVtKToKKyMgKi5bb2FdCisjICp+CmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvdGhpcy0tZGVzY3JpcHRpb24gYi90ZW1wbGF0ZXMvdGhpcy0tZGVzY3JpcHRpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZmMjVlOAotLS0gL2Rldi9udWxsCisrKyBiL3RlbXBsYXRlcy90aGlzLS1kZXNjcmlwdGlvbgpAQCAtMCwwICsxIEBACitVbm5hbWVkIHJlcG9zaXRvcnk7IGVkaXQgdGhpcyBmaWxlIHRvIG5hbWUgaXQgZm9yIGdpdHdlYi4KZGlmZiAtLWdpdCBhL3Rlc3QtYWJzb2x1dGUtcGF0aC5jIGIvdGVzdC1hYnNvbHV0ZS1wYXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1OWVhMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtYWJzb2x1dGUtcGF0aC5jCkBAIC0wLDAgKzEsMTEgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJd2hpbGUgKGFyZ2MgPiAxKSB7CisJCXB1dHMobWFrZV9hYnNvbHV0ZV9wYXRoKGFyZ3ZbMV0pKTsKKwkJYXJnYy0tOworCQlhcmd2Kys7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC1jaG10aW1lLmMgYi90ZXN0LWNobXRpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGRhNDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1jaG10aW1lLmMKQEAgLTAsMCArMSw2MSBAQAorI2luY2x1ZGUgImdpdC1jb21wYXQtdXRpbC5oIgorI2luY2x1ZGUgPHV0aW1lLmg+CisKK3N0YXRpYyBjb25zdCBjaGFyIHVzYWdlX3N0cltdID0gIigrfD18PSt8PS18LSk8c2Vjb25kcz4gPGZpbGU+Li4uIjsKKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgaTsKKwlpbnQgc2V0X2VxOworCWxvbmcgaW50IHNldF90aW1lOworCWNoYXIgKnRlc3Q7CisJY29uc3QgY2hhciAqdGltZXNwZWM7CisKKwlpZiAoYXJnYyA8IDMpCisJCWdvdG8gdXNhZ2U7CisKKwl0aW1lc3BlYyA9IGFyZ3ZbMV07CisJc2V0X2VxID0gKCp0aW1lc3BlYyA9PSAnPScpID8gMSA6IDA7CisJaWYgKHNldF9lcSkgeworCQl0aW1lc3BlYysrOworCQlpZiAoKnRpbWVzcGVjID09ICcrJykgeworCQkJc2V0X2VxID0gMjsgLyogcmVsYXRpdmUgImluIHRoZSBmdXR1cmUiICovCisJCQl0aW1lc3BlYysrOworCQl9CisJfQorCXNldF90aW1lID0gc3RydG9sKHRpbWVzcGVjLCAmdGVzdCwgMTApOworCWlmICgqdGVzdCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vdCBhIGJhc2UtMTAgaW50ZWdlcjogJXNcbiIsIGFyZ3ZbMV0gKyAxKTsKKwkJZ290byB1c2FnZTsKKwl9CisJaWYgKChzZXRfZXEgJiYgc2V0X3RpbWUgPCAwKSB8fCBzZXRfZXEgPT0gMikgeworCQl0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKwkJc2V0X3RpbWUgKz0gbm93OworCX0KKworCWZvciAoaSA9IDI7IGkgPCBhcmdjOyBpKyspIHsKKwkJc3RydWN0IHN0YXQgc2I7CisJCXN0cnVjdCB1dGltYnVmIHV0YjsKKworCQlpZiAoc3RhdChhcmd2W2ldLCAmc2IpIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gc3RhdCAlczogJXNcbiIsCisJCQkgICAgICAgIGFyZ3ZbaV0sIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQl1dGIuYWN0aW1lID0gc2Iuc3RfYXRpbWU7CisJCXV0Yi5tb2R0aW1lID0gc2V0X2VxID8gc2V0X3RpbWUgOiBzYi5zdF9tdGltZSArIHNldF90aW1lOworCisJCWlmICh1dGltZShhcmd2W2ldLCAmdXRiKSA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIG1vZGlmeSB0aW1lIG9uICVzOiAlc1xuIiwKKwkJCSAgICAgICAgYXJndltpXSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJldHVybiAwOworCit1c2FnZToKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyAlc1xuIiwgYXJndlswXSwgdXNhZ2Vfc3RyKTsKKwlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS90ZXN0LWRhdGUuYyBiL3Rlc3QtZGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZThmMjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWRhdGUuYwpAQCAtMCwwICsxLDIwIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljaGFyIHJlc3VsdFsxMDBdOworCQl0aW1lX3QgdDsKKworCQltZW1jcHkocmVzdWx0LCAiYmFkIiwgNCk7CisJCXBhcnNlX2RhdGUoYXJndltpXSwgcmVzdWx0LCBzaXplb2YocmVzdWx0KSk7CisJCXQgPSBzdHJ0b3VsKHJlc3VsdCwgTlVMTCwgMCk7CisJCXByaW50ZigiJXMgLT4gJXMgLT4gJXMiLCBhcmd2W2ldLCByZXN1bHQsIGN0aW1lKCZ0KSk7CisKKwkJdCA9IGFwcHJveGlkYXRlKGFyZ3ZbaV0pOworCQlwcmludGYoIiVzIC0+ICVzXG4iLCBhcmd2W2ldLCBjdGltZSgmdCkpOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QtZGVsdGEuYyBiL3Rlc3QtZGVsdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDg4NWZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1kZWx0YS5jCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiB0ZXN0LWRlbHRhLmM6IHRlc3QgY29kZSB0byBleGVyY2lzZSBkaWZmLWRlbHRhLmMgYW5kIHBhdGNoLWRlbHRhLmMKKyAqCisgKiAoQykgMjAwNSBOaWNvbGFzIFBpdHJlIDxuaWNvQGNhbS5vcmc+CisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSAiZ2l0LWNvbXBhdC11dGlsLmgiCisjaW5jbHVkZSAiZGVsdGEuaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorCitzdGF0aWMgY29uc3QgY2hhciB1c2FnZV9zdHJbXSA9CisJInRlc3QtZGVsdGEgKC1kfC1wKSA8ZnJvbV9maWxlPiA8ZGF0YV9maWxlPiA8b3V0X2ZpbGU+IjsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgZmQ7CisJc3RydWN0IHN0YXQgc3Q7CisJdm9pZCAqZnJvbV9idWYsICpkYXRhX2J1ZiwgKm91dF9idWY7CisJdW5zaWduZWQgbG9uZyBmcm9tX3NpemUsIGRhdGFfc2l6ZSwgb3V0X3NpemU7CisKKwlpZiAoYXJnYyAhPSA1IHx8IChzdHJjbXAoYXJndlsxXSwgIi1kIikgJiYgc3RyY21wKGFyZ3ZbMV0sICItcCIpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlc1xuIiwgdXNhZ2Vfc3RyKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZmQgPSBvcGVuKGFyZ3ZbMl0sIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwIHx8IGZzdGF0KGZkLCAmc3QpKSB7CisJCXBlcnJvcihhcmd2WzJdKTsKKwkJcmV0dXJuIDE7CisJfQorCWZyb21fc2l6ZSA9IHN0LnN0X3NpemU7CisJZnJvbV9idWYgPSBtbWFwKE5VTEwsIGZyb21fc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOworCWlmIChmcm9tX2J1ZiA9PSBNQVBfRkFJTEVEKSB7CisJCXBlcnJvcihhcmd2WzJdKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gMTsKKwl9CisJY2xvc2UoZmQpOworCisJZmQgPSBvcGVuKGFyZ3ZbM10sIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwIHx8IGZzdGF0KGZkLCAmc3QpKSB7CisJCXBlcnJvcihhcmd2WzNdKTsKKwkJcmV0dXJuIDE7CisJfQorCWRhdGFfc2l6ZSA9IHN0LnN0X3NpemU7CisJZGF0YV9idWYgPSBtbWFwKE5VTEwsIGRhdGFfc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOworCWlmIChkYXRhX2J1ZiA9PSBNQVBfRkFJTEVEKSB7CisJCXBlcnJvcihhcmd2WzNdKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gMTsKKwl9CisJY2xvc2UoZmQpOworCisJaWYgKGFyZ3ZbMV1bMV0gPT0gJ2QnKQorCQlvdXRfYnVmID0gZGlmZl9kZWx0YShmcm9tX2J1ZiwgZnJvbV9zaXplLAorCQkJCSAgICAgZGF0YV9idWYsIGRhdGFfc2l6ZSwKKwkJCQkgICAgICZvdXRfc2l6ZSwgMCk7CisJZWxzZQorCQlvdXRfYnVmID0gcGF0Y2hfZGVsdGEoZnJvbV9idWYsIGZyb21fc2l6ZSwKKwkJCQkgICAgICBkYXRhX2J1ZiwgZGF0YV9zaXplLAorCQkJCSAgICAgICZvdXRfc2l6ZSk7CisJaWYgKCFvdXRfYnVmKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZGVsdGEgb3BlcmF0aW9uIGZhaWxlZCAocmV0dXJuZWQgTlVMTClcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlmZCA9IG9wZW4gKGFyZ3ZbNF0sIE9fV1JPTkxZfE9fQ1JFQVR8T19UUlVOQywgMDY2Nik7CisJaWYgKGZkIDwgMCB8fCB3cml0ZV9pbl9mdWxsKGZkLCBvdXRfYnVmLCBvdXRfc2l6ZSkgIT0gb3V0X3NpemUpIHsKKwkJcGVycm9yKGFyZ3ZbNF0pOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QtZ2VucmFuZG9tLmMgYi90ZXN0LWdlbnJhbmRvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZWZlNmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWdlbnJhbmRvbS5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBTaW1wbGUgcmFuZG9tIGRhdGEgZ2VuZXJhdG9yIHVzZWQgdG8gY3JlYXRlIHJlcHJvZHVjaWJsZSB0ZXN0IGZpbGVzLgorICogVGhpcyBpcyBpbnNwaXJlZCBmcm9tIFBPU0lYLjEtMjAwMSBpbXBsZW1lbnRhdGlvbiBleGFtcGxlIGZvciByYW5kKCkuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgYnkgTmljb2xhcyBQaXRyZSwgbGljZW5zZWQgdW5kZXIgdGhlIEdQTCB2ZXJzaW9uIDIuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJdW5zaWduZWQgbG9uZyBjb3VudCwgbmV4dCA9IDA7CisJdW5zaWduZWQgY2hhciAqYzsKKworCWlmIChhcmdjIDwgMiB8fCBhcmdjID4gMykgeworCQlmcHJpbnRmKCBzdGRlcnIsICJVc2FnZTogJXMgPHNlZWRfc3RyaW5nPiBbPHNpemU+XSIsIGFyZ3ZbMF0pOworCQlyZXR1cm4gMTsKKwl9CisKKwljID0gKHVuc2lnbmVkIGNoYXIgKikgYXJndlsxXTsKKwlkbyB7CisJCW5leHQgPSBuZXh0ICogMTEgKyAqYzsKKwl9IHdoaWxlICgqYysrKTsKKworCWNvdW50ID0gKGFyZ2MgPT0gMykgPyBzdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDApIDogLTFMOworCisJd2hpbGUgKGNvdW50LS0pIHsKKwkJbmV4dCA9IG5leHQgKiAxMTAzNTE1MjQ1ICsgMTIzNDU7CisJCWlmIChwdXRjaGFyKChuZXh0ID4+IDE2KSAmIDB4ZmYpID09IEVPRikKKwkJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QtbWF0Y2gtdHJlZXMuYyBiL3Rlc3QtbWF0Y2gtdHJlZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2M0Njg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1tYXRjaC10cmVlcy5jCkBAIC0wLDAgKzEsMjQgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInRyZWUuaCIKKworaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCit7CisJdW5zaWduZWQgY2hhciBoYXNoMVsyMF0sIGhhc2gyWzIwXSwgc2hpZnRlZFsyMF07CisJc3RydWN0IHRyZWUgKm9uZSwgKnR3bzsKKworCWlmIChnZXRfc2hhMShhdlsxXSwgaGFzaDEpKQorCQlkaWUoImNhbm5vdCBwYXJzZSAlcyBhcyBhbiBvYmplY3QgbmFtZSIsIGF2WzFdKTsKKwlpZiAoZ2V0X3NoYTEoYXZbMl0sIGhhc2gyKSkKKwkJZGllKCJjYW5ub3QgcGFyc2UgJXMgYXMgYW4gb2JqZWN0IG5hbWUiLCBhdlsyXSk7CisJb25lID0gcGFyc2VfdHJlZV9pbmRpcmVjdChoYXNoMSk7CisJaWYgKCFvbmUpCisJCWRpZSgibm90IGEgdHJlZWlzaCAlcyIsIGF2WzFdKTsKKwl0d28gPSBwYXJzZV90cmVlX2luZGlyZWN0KGhhc2gyKTsKKwlpZiAoIXR3bykKKwkJZGllKCJub3QgYSB0cmVlaXNoICVzIiwgYXZbMl0pOworCisJc2hpZnRfdHJlZShvbmUtPm9iamVjdC5zaGExLCB0d28tPm9iamVjdC5zaGExLCBzaGlmdGVkLCAtMSk7CisJcHJpbnRmKCJzaGlmdGVkOiAlc1xuIiwgc2hhMV90b19oZXgoc2hpZnRlZCkpOworCisJZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QtcGFyc2Utb3B0aW9ucy5jIGIvdGVzdC1wYXJzZS1vcHRpb25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzNjBkNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtcGFyc2Utb3B0aW9ucy5jCkBAIC0wLDAgKzEsMzkgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInBhcnNlLW9wdGlvbnMuaCIKKworc3RhdGljIGludCBib29sZWFuID0gMDsKK3N0YXRpYyBpbnQgaW50ZWdlciA9IDA7CitzdGF0aWMgY2hhciAqc3RyaW5nID0gTlVMTDsKKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKnVzYWdlW10gPSB7CisJCSJ0ZXN0LXBhcnNlLW9wdGlvbnMgPG9wdGlvbnM+IiwKKwkJTlVMTAorCX07CisJc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisJCU9QVF9CT09MRUFOKCdiJywgImJvb2xlYW4iLCAmYm9vbGVhbiwgImdldCBhIGJvb2xlYW4iKSwKKwkJT1BUX0lOVEVHRVIoJ2knLCAiaW50ZWdlciIsICZpbnRlZ2VyLCAiZ2V0IGEgaW50ZWdlciIpLAorCQlPUFRfSU5URUdFUignaicsIE5VTEwsICZpbnRlZ2VyLCAiZ2V0IGEgaW50ZWdlciwgdG9vIiksCisJCU9QVF9HUk9VUCgic3RyaW5nIG9wdGlvbnMiKSwKKwkJT1BUX1NUUklORygncycsICJzdHJpbmciLCAmc3RyaW5nLCAic3RyaW5nIiwgImdldCBhIHN0cmluZyIpLAorCQlPUFRfU1RSSU5HKDAsICJzdHJpbmcyIiwgJnN0cmluZywgInN0ciIsICJnZXQgYW5vdGhlciBzdHJpbmciKSwKKwkJT1BUX1NUUklORygwLCAic3QiLCAmc3RyaW5nLCAic3QiLCAiZ2V0IGFub3RoZXIgc3RyaW5nIChwZXJ2ZXJ0IG9yZGVyaW5nKSIpLAorCQlPUFRfU1RSSU5HKCdvJywgTlVMTCwgJnN0cmluZywgInN0ciIsICJnZXQgYW5vdGhlciBzdHJpbmciKSwKKwkJT1BUX0dST1VQKCJtYWdpYyBhcmd1bWVudHMiKSwKKwkJT1BUX0FSR1VNRU5UKCJxdXV4IiwgIm1lYW5zIC0tcXV1eCIpLAorCQlPUFRfRU5EKCksCisJfTsKKwlpbnQgaTsKKworCWFyZ2MgPSBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIG9wdGlvbnMsIHVzYWdlLCAwKTsKKworCXByaW50ZigiYm9vbGVhbjogJWRcbiIsIGJvb2xlYW4pOworCXByaW50ZigiaW50ZWdlcjogJWRcbiIsIGludGVnZXIpOworCXByaW50Zigic3RyaW5nOiAlc1xuIiwgc3RyaW5nID8gc3RyaW5nIDogIihub3Qgc2V0KSIpOworCisJZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykKKwkJcHJpbnRmKCJhcmcgJTAyZDogJXNcbiIsIGksIGFyZ3ZbaV0pOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0LXNoYTEuYyBiL3Rlc3Qtc2hhMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZDdlOTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LXNoYTEuYwpAQCAtMCwwICsxLDQ3IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKworaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCit7CisJU0hBX0NUWCBjdHg7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwl1bnNpZ25lZCBidWZzeiA9IDgxOTI7CisJY2hhciAqYnVmZmVyOworCisJaWYgKGFjID09IDIpCisJCWJ1ZnN6ID0gc3RydG91bChhdlsxXSwgTlVMTCwgMTApICogMTAyNCAqIDEwMjQ7CisKKwlpZiAoIWJ1ZnN6KQorCQlidWZzeiA9IDgxOTI7CisKKwl3aGlsZSAoKGJ1ZmZlciA9IG1hbGxvYyhidWZzeikpID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJidWZzeiAldSBpcyB0b28gYmlnLCBoYWx2aW5nLi4uXG4iLCBidWZzeik7CisJCWJ1ZnN6IC89IDI7CisJCWlmIChidWZzeiA8IDEwMjQpCisJCQlkaWUoIk9PUFMiKTsKKwl9CisKKwlTSEExX0luaXQoJmN0eCk7CisKKwl3aGlsZSAoMSkgeworCQlzc2l6ZV90IHN6LCB0aGlzX3N6OworCQljaGFyICpjcCA9IGJ1ZmZlcjsKKwkJdW5zaWduZWQgcm9vbSA9IGJ1ZnN6OworCQl0aGlzX3N6ID0gMDsKKwkJd2hpbGUgKHJvb20pIHsKKwkJCXN6ID0geHJlYWQoMCwgY3AsIHJvb20pOworCQkJaWYgKHN6ID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAoc3ogPCAwKQorCQkJCWRpZSgidGVzdC1zaGExOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQl0aGlzX3N6ICs9IHN6OworCQkJY3AgKz0gc3o7CisJCQlyb29tIC09IHN6OworCQl9CisJCWlmICh0aGlzX3N6ID09IDApCisJCQlicmVhazsKKwkJU0hBMV9VcGRhdGUoJmN0eCwgYnVmZmVyLCB0aGlzX3N6KTsKKwl9CisJU0hBMV9GaW5hbChzaGExLCAmY3R4KTsKKwlwdXRzKHNoYTFfdG9faGV4KHNoYTEpKTsKKwlleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdC1zaGExLnNoIGIvdGVzdC1zaGExLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBmMGJjNWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LXNoYTEuc2gKQEAgLTAsMCArMSw4MyBAQAorIyEvYmluL3NoCisKK2RkIGlmPS9kZXYvemVybyBicz0xMDQ4NTc2IGNvdW50PTEwMCAyPi9kZXYvbnVsbCB8CisvdXNyL2Jpbi90aW1lIC4vdGVzdC1zaGExID4vZGV2L251bGwKKword2hpbGUgcmVhZCBleHBlY3QgY250IHBmeAorZG8KKwljYXNlICIkZXhwZWN0IiBpbiAnIycqKSBjb250aW51ZSA7OyBlc2FjCisJYWN0dWFsPWAKKwkJeworCQkJdGVzdCAteiAiJHBmeCIgfHwgZWNobyAiJHBmeCIKKwkJCWRkIGlmPS9kZXYvemVybyBicz0xMDQ4NTc2IGNvdW50PSRjbnQgMj4vZGV2L251bGwgfAorCQkJcGVybCAtcGUgJ3kvXDAwMC9nLycKKwkJfSB8IC4vdGVzdC1zaGExICRjbnQKKwlgCisJaWYgdGVzdCAiJGV4cGVjdCIgPSAiJGFjdHVhbCIKKwl0aGVuCisJCWVjaG8gIk9LOiAkZXhwZWN0ICRjbnQgJHBmeCIKKwllbHNlCisJCWVjaG8gPiYyICJPT1BTOiAkY250IgorCQllY2hvID4mMiAiZXhwZWN0OiAkZXhwZWN0IgorCQllY2hvID4mMiAiYWN0dWFsOiAkYWN0dWFsIgorCQlleGl0IDEKKwlmaQorZG9uZSA8PEVPRgorZGEzOWEzZWU1ZTZiNGIwZDMyNTViZmVmOTU2MDE4OTBhZmQ4MDcwOSAwCiszZjc4Njg1MGUzODc1NTBmZGFiODM2ZWQ3ZTZkYzg4MWRlMjMwMDFiIDAgYQorNTI3N2NiYjQ1YTE1OTAyMTM3ZDMzMmQ5N2U4OWNmODEzNjU0NTQ4NSAwIGFiCiswM2NmZDc0MzY2MWYwNzk3NWZhMmYxMjIwYzUxOTRjYmFmZjQ4NDUxIDAgYWJjCiszMzMwYjQzNzM2NDBmOWU0NjA0OTkxZTczYzdlODZiZmQ4ZGEyZGMzIDAgYWJjZAorZWMxMTMxMjM4NmFkNTYxNjc0ZjcyNGI4Y2NhN2NmMTc5NmUyNmQxZCAwIGFiY2RlCitiZGMzN2MwNzRlYzRlZTYwNTBkNjhiYzEzM2M2YjkxMmYzNjQ3NGRmIDAgYWJjZGVmCis2OWJjYTk5YjkyMzg1OWYyZGM0ODZiNTViODdmNDk2ODliNzM1OGM3IDAgYWJjZGVmZworZTQxNGFmNzE2MWM5NTU0MDg5ZjQxMDZkNmYxNzk3ZWYxNGE3MzY2NiAwIGFiY2RlZmdoCiswNzA3ZjI5NzAwNDNmOWY3YzIyMDI5NDgyZGIyNzczM2RlYWVjMDI5IDAgYWJjZGVmZ2hpCithNGRkOGFhNzRhNTYzNjcyOGZlNTI0NTE2MzZlMmUxNzcyNjAzM2FhIDEKKzk5ODZiNDVlMmY0ZDcwODYzNzI1MzNiYjY5NTNhODY1MmZhMzY0NGEgMSBmcm90egorMjNkOGQ0Zjc4OGU4NTI2YjQ4Nzc1NDhhMzI1Nzc1NDNjYmFhZjUxZiAxMAorOGNkMjNmODIyYWI0NGM3ZjQ4MWI4YzkyZDU5MWY2ZDFmY2FkNDMxYyAxMCBmcm90egorZjNiNTYwNGE0ZTYwNDg5OWMxMjMzZWRiM2JmMWNjMGVkZTRkOGMzMiA1MTIKK2IwOTViZDgzN2EzNzE1OTMwNDgxMzZlNDI5ZTlhYzRiNDc2ZTFiYjMgNTEyIGZyb3R6CiswOGZhODFkNjE5MDk0OGRlNWNjY2EzOTY2MzQwY2M0OGMxMGNjZWFjIDEyMDAgeHl6enkKK2UzM2EyOTFmNDJjMzBhMTU5NzMzZGQ5OGI4YjNlNGZmMzQxNThjYTAgNDA5MCA0RworI2EzYmY3ODNiYzIwY2FhOTU4ZjZjYjI0ZGQxNDBhN2IyMTk4NDgzOGQgOTk5OSBuaXRmb2wKK0VPRgorCitleGl0CisKKyMgZ2VuZXJhdGluZyB0ZXN0IHZlY3RvcnMKKyMgaW5wdXRzIGFyZSBudW1iZXIgb2YgbWVnYWJ5dGVzIGZvbGxvd2VkIGJ5IHNvbWUgcmFuZG9tIHN0cmluZyB0byBwcmVmaXguCisKK3doaWxlIHJlYWQgY250IHBmeAorZG8KKwlhY3R1YWw9YAorCQl7CisJCQl0ZXN0IC16ICIkcGZ4IiB8fCBlY2hvICIkcGZ4IgorCQkJZGQgaWY9L2Rldi96ZXJvIGJzPTEwNDg1NzYgY291bnQ9JGNudCAyPi9kZXYvbnVsbCB8CisJCQlwZXJsIC1wZSAneS9cMDAwL2cvJworCQl9IHwgc2hhMXN1bSB8CisJCXNlZCAtZSAncy8gLiovLycKKwlgCisJZWNobyAiJGFjdHVhbCAkY250ICRwZngiCitkb25lIDw8RU9GCiswCiswIGEKKzAgYWIKKzAgYWJjCiswIGFiY2QKKzAgYWJjZGUKKzAgYWJjZGVmCiswIGFiY2RlZmcKKzAgYWJjZGVmZ2gKKzAgYWJjZGVmZ2hpCisxCisxIGZyb3R6CisxMAorMTAgZnJvdHoKKzUxMgorNTEyIGZyb3R6CisxMjAwIHh5enp5Cis0MDkwIDRHCis5OTk5IG5pdGZvbAorRU9GCmRpZmYgLS1naXQgYS90aHJlYWQtdXRpbHMuYyBiL3RocmVhZC11dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZTdlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90aHJlYWQtdXRpbHMuYwpAQCAtMCwwICsxLDQ4IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKworI2lmZGVmIF9XSU4zMgorIyAgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbGlmIGRlZmluZWQoaHB1eCkgfHwgZGVmaW5lZChfX2hwdXgpIHx8IGRlZmluZWQoX2hwdXgpCisjICBpbmNsdWRlIDxzeXMvcHN0YXQuaD4KKyNlbmRpZgorCisvKgorICogQnkgZG9pbmcgdGhpcyBpbiB0d28gc3RlcHMgd2UgY2FuIGF0IGxlYXN0IGdldAorICogdGhlIGZ1bmN0aW9uIHRvIGJlIHNvbWV3aGF0IGNvaGVyZW50LCBldmVuCisgKiB3aXRoIHRoaXMgZGlzZ3VzdGluZyBuZXN0IG9mICNpZmRlZnMuCisgKi8KKyNpZm5kZWYgX1NDX05QUk9DRVNTT1JTX09OTE4KKyMgIGlmZGVmIF9TQ19OUFJPQ19PTkxOCisjICAgIGRlZmluZSBfU0NfTlBST0NFU1NPUlNfT05MTiBfU0NfTlBST0NfT05MTgorIyAgZWxpZiBkZWZpbmVkIF9TQ19DUkFZX05DUFUKKyMgICAgZGVmaW5lIF9TQ19OUFJPQ0VTU09SU19PTkxOIF9TQ19DUkFZX05DUFUKKyMgIGVuZGlmCisjZW5kaWYKKworaW50IG9ubGluZV9jcHVzKHZvaWQpCit7CisjaWZkZWYgX1NDX05QUk9DRVNTT1JTX09OTE4KKwlsb25nIG5jcHVzOworI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKwlTWVNURU1fSU5GTyBpbmZvOworCUdldFN5c3RlbUluZm8oJmluZm8pOworCisJaWYgKChpbnQpaW5mby5kd051bWJlck9mUHJvY2Vzc29ycyA+IDApCisJCXJldHVybiAoaW50KWluZm8uZHdOdW1iZXJPZlByb2Nlc3NvcnM7CisjZWxpZiBkZWZpbmVkKGhwdXgpIHx8IGRlZmluZWQoX19ocHV4KSB8fCBkZWZpbmVkKF9ocHV4KQorCXN0cnVjdCBwc3RfZHluYW1pYyBwc2Q7CisKKwlpZiAoIXBzdGF0X2dldGR5bmFtaWMoJnBzZCwgc2l6ZW9mKHBzZCksIChzaXplX3QpMSwgMCkpCisJCXJldHVybiAoaW50KXBzZC5wc2RfcHJvY19jbnQ7CisjZW5kaWYKKworI2lmZGVmIF9TQ19OUFJPQ0VTU09SU19PTkxOCisJaWYgKChuY3B1cyA9IChsb25nKXN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pKSA+IDApCisJCXJldHVybiAoaW50KW5jcHVzOworI2VuZGlmCisKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3RocmVhZC11dGlscy5oIGIvdGhyZWFkLXV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NlNGI3NwotLS0gL2Rldi9udWxsCisrKyBiL3RocmVhZC11dGlscy5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBUSFJFQURfQ09NUEFUX0gKKyNkZWZpbmUgVEhSRUFEX0NPTVBBVF9ICisKK2V4dGVybiBpbnQgb25saW5lX2NwdXModm9pZCk7CisKKyNlbmRpZiAvKiBUSFJFQURfQ09NUEFUX0ggKi8KZGlmZiAtLWdpdCBhL3RyYWNlLmMgYi90cmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MTNmOTEKLS0tIC9kZXYvbnVsbAorKysgYi90cmFjZS5jCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogR0lUIC0gVGhlIGluZm9ybWF0aW9uIG1hbmFnZXIgZnJvbSBoZWxsCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgTWljaGFlbCBSLiBFbGtpbnMgPG1lQG11dHQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgT3N3YWxkIEJ1ZGRlbmhhZ2VuIDxvc3NpQHVzZXJzLnNmLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBUaGVvZG9yZSBZLiBUcydvIDx0eXRzb0BtaXQuZWR1PgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pa2UgTWNDb3JtYWNrCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQ2hyaXN0aWFuIENvdWRlcgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisKKy8qIEdldCBhIHRyYWNlIGZpbGUgZGVzY3JpcHRvciBmcm9tIEdJVF9UUkFDRSBlbnYgdmFyaWFibGUuICovCitzdGF0aWMgaW50IGdldF90cmFjZV9mZChpbnQgKm5lZWRfY2xvc2UpCit7CisJY2hhciAqdHJhY2UgPSBnZXRlbnYoIkdJVF9UUkFDRSIpOworCisJaWYgKCF0cmFjZSB8fCAhc3RyY21wKHRyYWNlLCAiIikgfHwKKwkgICAgIXN0cmNtcCh0cmFjZSwgIjAiKSB8fCAhc3RyY2FzZWNtcCh0cmFjZSwgImZhbHNlIikpCisJCXJldHVybiAwOworCWlmICghc3RyY21wKHRyYWNlLCAiMSIpIHx8ICFzdHJjYXNlY21wKHRyYWNlLCAidHJ1ZSIpKQorCQlyZXR1cm4gU1RERVJSX0ZJTEVOTzsKKwlpZiAoc3RybGVuKHRyYWNlKSA9PSAxICYmIGlzZGlnaXQoKnRyYWNlKSkKKwkJcmV0dXJuIGF0b2kodHJhY2UpOworCWlmIChpc19hYnNvbHV0ZV9wYXRoKHRyYWNlKSkgeworCQlpbnQgZmQgPSBvcGVuKHRyYWNlLCBPX1dST05MWSB8IE9fQVBQRU5EIHwgT19DUkVBVCwgMDY2Nik7CisJCWlmIChmZCA9PSAtMSkgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIkNvdWxkIG5vdCBvcGVuICclcycgZm9yIHRyYWNpbmc6ICVzXG4iCisJCQkJIkRlZmF1bHRpbmcgdG8gdHJhY2luZyBvbiBzdGRlcnIuLi5cbiIsCisJCQkJdHJhY2UsIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gU1RERVJSX0ZJTEVOTzsKKwkJfQorCQkqbmVlZF9jbG9zZSA9IDE7CisJCXJldHVybiBmZDsKKwl9CisKKwlmcHJpbnRmKHN0ZGVyciwgIldoYXQgZG9lcyAnJXMnIGZvciBHSVRfVFJBQ0UgbWVhbnMgP1xuIiwgdHJhY2UpOworCWZwcmludGYoc3RkZXJyLCAiSWYgeW91IHdhbnQgdG8gdHJhY2UgaW50byBhIGZpbGUsICIKKwkJInRoZW4gcGxlYXNlIHNldCBHSVRfVFJBQ0UgdG8gYW4gYWJzb2x1dGUgcGF0aG5hbWUgIgorCQkiKHN0YXJ0aW5nIHdpdGggLykuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkRlZmF1bHRpbmcgdG8gdHJhY2luZyBvbiBzdGRlcnIuLi5cbiIpOworCisJcmV0dXJuIFNUREVSUl9GSUxFTk87Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGVycl9tc2dbXSA9ICJDb3VsZCBub3QgdHJhY2UgaW50byBmZCBnaXZlbiBieSAiCisJIkdJVF9UUkFDRSBlbnZpcm9ubWVudCB2YXJpYWJsZSI7CisKK3ZvaWQgdHJhY2VfcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXN0cnVjdCBzdHJidWYgYnVmOworCXZhX2xpc3QgYXA7CisJaW50IGZkLCBsZW4sIG5lZWRfY2xvc2UgPSAwOworCisJZmQgPSBnZXRfdHJhY2VfZmQoJm5lZWRfY2xvc2UpOworCWlmICghZmQpCisJCXJldHVybjsKKworCXN0cmJ1Zl9pbml0KCZidWYsIDY0KTsKKwl2YV9zdGFydChhcCwgZm10KTsKKwlsZW4gPSB2c25wcmludGYoYnVmLmJ1Ziwgc3RyYnVmX2F2YWlsKCZidWYpLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCWlmIChsZW4gPj0gc3RyYnVmX2F2YWlsKCZidWYpKSB7CisJCXN0cmJ1Zl9ncm93KCZidWYsIGxlbiAtIHN0cmJ1Zl9hdmFpbCgmYnVmKSArIDEyOCk7CisJCXZhX3N0YXJ0KGFwLCBmbXQpOworCQlsZW4gPSB2c25wcmludGYoYnVmLmJ1Ziwgc3RyYnVmX2F2YWlsKCZidWYpLCBmbXQsIGFwKTsKKwkJdmFfZW5kKGFwKTsKKwkJaWYgKGxlbiA+PSBzdHJidWZfYXZhaWwoJmJ1ZikpCisJCQlkaWUoImJyb2tlbiB2c25wcmludGYiKTsKKwl9CisJc3RyYnVmX3NldGxlbigmYnVmLCBsZW4pOworCisJd3JpdGVfb3Jfd2hpbmVfcGlwZShmZCwgYnVmLmJ1ZiwgYnVmLmxlbiwgZXJyX21zZyk7CisJc3RyYnVmX3JlbGVhc2UoJmJ1Zik7CisKKwlpZiAobmVlZF9jbG9zZSkKKwkJY2xvc2UoZmQpOworfQorCit2b2lkIHRyYWNlX2FyZ3ZfcHJpbnRmKGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlzdHJ1Y3Qgc3RyYnVmIGJ1ZjsKKwl2YV9saXN0IGFwOworCWludCBmZCwgbGVuLCBuZWVkX2Nsb3NlID0gMDsKKworCWZkID0gZ2V0X3RyYWNlX2ZkKCZuZWVkX2Nsb3NlKTsKKwlpZiAoIWZkKQorCQlyZXR1cm47CisKKwlzdHJidWZfaW5pdCgmYnVmLCA2NCk7CisJdmFfc3RhcnQoYXAsIGZtdCk7CisJbGVuID0gdnNucHJpbnRmKGJ1Zi5idWYsIHN0cmJ1Zl9hdmFpbCgmYnVmKSwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlpZiAobGVuID49IHN0cmJ1Zl9hdmFpbCgmYnVmKSkgeworCQlzdHJidWZfZ3JvdygmYnVmLCBsZW4gLSBzdHJidWZfYXZhaWwoJmJ1ZikgKyAxMjgpOworCQl2YV9zdGFydChhcCwgZm10KTsKKwkJbGVuID0gdnNucHJpbnRmKGJ1Zi5idWYsIHN0cmJ1Zl9hdmFpbCgmYnVmKSwgZm10LCBhcCk7CisJCXZhX2VuZChhcCk7CisJCWlmIChsZW4gPj0gc3RyYnVmX2F2YWlsKCZidWYpKQorCQkJZGllKCJicm9rZW4gdnNucHJpbnRmIik7CisJfQorCXN0cmJ1Zl9zZXRsZW4oJmJ1ZiwgbGVuKTsKKworCXNxX3F1b3RlX2FyZ3YoJmJ1ZiwgYXJndiwgMCk7CisJc3RyYnVmX2FkZGNoKCZidWYsICdcbicpOworCXdyaXRlX29yX3doaW5lX3BpcGUoZmQsIGJ1Zi5idWYsIGJ1Zi5sZW4sIGVycl9tc2cpOworCXN0cmJ1Zl9yZWxlYXNlKCZidWYpOworCisJaWYgKG5lZWRfY2xvc2UpCisJCWNsb3NlKGZkKTsKK30KZGlmZiAtLWdpdCBhL3RyYW5zcG9ydC5jIGIvdHJhbnNwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkzZTBlOAotLS0gL2Rldi9udWxsCisrKyBiL3RyYW5zcG9ydC5jCkBAIC0wLDAgKzEsODIzIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKKyNpbmNsdWRlICJydW4tY29tbWFuZC5oIgorI2lmbmRlZiBOT19DVVJMCisjaW5jbHVkZSAiaHR0cC5oIgorI2VuZGlmCisjaW5jbHVkZSAicGt0LWxpbmUuaCIKKyNpbmNsdWRlICJmZXRjaC1wYWNrLmgiCisjaW5jbHVkZSAic2VuZC1wYWNrLmgiCisjaW5jbHVkZSAid2Fsa2VyLmgiCisjaW5jbHVkZSAiYnVuZGxlLmgiCisjaW5jbHVkZSAiZGlyLmgiCisjaW5jbHVkZSAicmVmcy5oIgorCisvKiByc3luYyBzdXBwb3J0ICovCisKKy8qCisgKiBXZSBjb3B5IHBhY2tlZC1yZWZzIGFuZCByZWZzLyBpbnRvIGEgdGVtcG9yYXJ5IGZpbGUsIHRoZW4gcmVhZCB0aGUKKyAqIGxvb3NlIHJlZnMgcmVjdXJzaXZlbHkgKHNvcnRpbmcgd2hlbmV2ZXIgcG9zc2libGUpLCBhbmQgdGhlbiBpbnNlcnRpbmcKKyAqIHRob3NlIHBhY2tlZCByZWZzIHRoYXQgYXJlIG5vdCB5ZXQgaW4gdGhlIGxpc3QgKG5vdCB2YWxpZGF0aW5nLCBidXQKKyAqIGFzc3VtaW5nIHRoYXQgdGhlIGZpbGUgaXMgc29ydGVkKS4KKyAqCisgKiBBcHBlYXJzIHJlZmFjdG9yaW5nIHRoaXMgZnJvbSByZWZzLmMgaXMgdG9vIGN1bWJlcnNvbWUuCisgKi8KKworc3RhdGljIGludCBzdHJfY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJY29uc3QgY2hhciAqczEgPSBhOworCWNvbnN0IGNoYXIgKnMyID0gYjsKKworCXJldHVybiBzdHJjbXAoczEsIHMyKTsKK30KKworLyogcGF0aC0+YnVmICsgbmFtZV9vZmZzZXQgaXMgZXhwZWN0ZWQgdG8gcG9pbnQgdG8gInJlZnMvIiAqLworCitzdGF0aWMgaW50IHJlYWRfbG9vc2VfcmVmcyhzdHJ1Y3Qgc3RyYnVmICpwYXRoLCBpbnQgbmFtZV9vZmZzZXQsCisJCXN0cnVjdCByZWYgKip0YWlsKQoreworCURJUiAqZGlyID0gb3BlbmRpcihwYXRoLT5idWYpOworCXN0cnVjdCBkaXJlbnQgKmRlOworCXN0cnVjdCB7CisJCWNoYXIgKiplbnRyaWVzOworCQlpbnQgbnIsIGFsbG9jOworCX0gbGlzdDsKKwlpbnQgaSwgcGF0aGxlbjsKKworCWlmICghZGlyKQorCQlyZXR1cm4gLTE7CisKKwltZW1zZXQgKCZsaXN0LCAwLCBzaXplb2YobGlzdCkpOworCisJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkpIHsKKwkJaWYgKGRlLT5kX25hbWVbMF0gPT0gJy4nICYmIChkZS0+ZF9uYW1lWzFdID09ICdcMCcgfHwKKwkJCQkoZGUtPmRfbmFtZVsxXSA9PSAnLicgJiYKKwkJCQkgZGUtPmRfbmFtZVsyXSA9PSAnXDAnKSkpCisJCQljb250aW51ZTsKKwkJQUxMT0NfR1JPVyhsaXN0LmVudHJpZXMsIGxpc3QubnIgKyAxLCBsaXN0LmFsbG9jKTsKKwkJbGlzdC5lbnRyaWVzW2xpc3QubnIrK10gPSB4c3RyZHVwKGRlLT5kX25hbWUpOworCX0KKwljbG9zZWRpcihkaXIpOworCisJLyogc29ydCB0aGUgbGlzdCAqLworCisJcXNvcnQobGlzdC5lbnRyaWVzLCBsaXN0Lm5yLCBzaXplb2YoY2hhciAqKSwgc3RyX2NtcCk7CisKKwlwYXRobGVuID0gcGF0aC0+bGVuOworCXN0cmJ1Zl9hZGRjaChwYXRoLCAnLycpOworCisJZm9yIChpID0gMDsgaSA8IGxpc3QubnI7IGkrKywgc3RyYnVmX3NldGxlbihwYXRoLCBwYXRobGVuICsgMSkpIHsKKwkJc3RyYnVmX2FkZHN0cihwYXRoLCBsaXN0LmVudHJpZXNbaV0pOworCQlpZiAocmVhZF9sb29zZV9yZWZzKHBhdGgsIG5hbWVfb2Zmc2V0LCB0YWlsKSkgeworCQkJaW50IGZkID0gb3BlbihwYXRoLT5idWYsIE9fUkRPTkxZKTsKKwkJCWNoYXIgYnVmZmVyWzQwXTsKKwkJCXN0cnVjdCByZWYgKm5leHQ7CisKKwkJCWlmIChmZCA8IDApCisJCQkJY29udGludWU7CisJCQluZXh0ID0gYWxsb2NfcmVmKHBhdGgtPmxlbiAtIG5hbWVfb2Zmc2V0ICsgMSk7CisJCQlpZiAocmVhZF9pbl9mdWxsKGZkLCBidWZmZXIsIDQwKSAhPSA0MCB8fAorCQkJCQlnZXRfc2hhMV9oZXgoYnVmZmVyLCBuZXh0LT5vbGRfc2hhMSkpIHsKKwkJCQljbG9zZShmZCk7CisJCQkJZnJlZShuZXh0KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNsb3NlKGZkKTsKKwkJCXN0cmNweShuZXh0LT5uYW1lLCBwYXRoLT5idWYgKyBuYW1lX29mZnNldCk7CisJCQkoKnRhaWwpLT5uZXh0ID0gbmV4dDsKKwkJCSp0YWlsID0gbmV4dDsKKwkJfQorCX0KKwlzdHJidWZfc2V0bGVuKHBhdGgsIHBhdGhsZW4pOworCisJZm9yIChpID0gMDsgaSA8IGxpc3QubnI7IGkrKykKKwkJZnJlZShsaXN0LmVudHJpZXNbaV0pOworCWZyZWUobGlzdC5lbnRyaWVzKTsKKworCXJldHVybiAwOworfQorCisvKiBpbnNlcnQgdGhlIHBhY2tlZCByZWZzIGZvciB3aGljaCBubyBsb29zZSByZWZzIHdlcmUgZm91bmQgKi8KKworc3RhdGljIHZvaWQgaW5zZXJ0X3BhY2tlZF9yZWZzKGNvbnN0IGNoYXIgKnBhY2tlZF9yZWZzLCBzdHJ1Y3QgcmVmICoqbGlzdCkKK3sKKwlGSUxFICpmID0gZm9wZW4ocGFja2VkX3JlZnMsICJyIik7CisJc3RhdGljIGNoYXIgYnVmZmVyW1BBVEhfTUFYXTsKKworCWlmICghZikKKwkJcmV0dXJuOworCisJZm9yICg7OykgeworCQlpbnQgY21wID0gY21wLCBsZW47CisKKwkJaWYgKCFmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBmKSkgeworCQkJZmNsb3NlKGYpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKGhleHZhbChidWZmZXJbMF0pID4gMHhmKQorCQkJY29udGludWU7CisJCWxlbiA9IHN0cmxlbihidWZmZXIpOworCQlpZiAobGVuICYmIGJ1ZmZlcltsZW4gLSAxXSA9PSAnXG4nKQorCQkJYnVmZmVyWy0tbGVuXSA9ICdcMCc7CisJCWlmIChsZW4gPCA0MSkKKwkJCWNvbnRpbnVlOworCQl3aGlsZSAoKCpsaXN0KS0+bmV4dCAmJgorCQkJCShjbXAgPSBzdHJjbXAoYnVmZmVyICsgNDEsCisJCQkJICAgICAgKCpsaXN0KS0+bmV4dC0+bmFtZSkpID4gMCkKKwkJCWxpc3QgPSAmKCpsaXN0KS0+bmV4dDsKKwkJaWYgKCEoKmxpc3QpLT5uZXh0IHx8IGNtcCA8IDApIHsKKwkJCXN0cnVjdCByZWYgKm5leHQgPSBhbGxvY19yZWYobGVuIC0gNDApOworCQkJYnVmZmVyWzQwXSA9ICdcMCc7CisJCQlpZiAoZ2V0X3NoYTFfaGV4KGJ1ZmZlciwgbmV4dC0+b2xkX3NoYTEpKSB7CisJCQkJd2FybmluZyAoImludmFsaWQgU0hBLTE6ICVzIiwgYnVmZmVyKTsKKwkJCQlmcmVlKG5leHQpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc3RyY3B5KG5leHQtPm5hbWUsIGJ1ZmZlciArIDQxKTsKKwkJCW5leHQtPm5leHQgPSAoKmxpc3QpLT5uZXh0OworCQkJKCpsaXN0KS0+bmV4dCA9IG5leHQ7CisJCQlsaXN0ID0gJigqbGlzdCktPm5leHQ7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVmICpnZXRfcmVmc192aWFfcnN5bmMoc3RydWN0IHRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworCXN0cnVjdCBzdHJidWYgYnVmID0gU1RSQlVGX0lOSVQsIHRlbXBfZGlyID0gU1RSQlVGX0lOSVQ7CisJc3RydWN0IHJlZiBkdW1teSwgKnRhaWwgPSAmZHVtbXk7CisJc3RydWN0IGNoaWxkX3Byb2Nlc3MgcnN5bmM7CisJY29uc3QgY2hhciAqYXJnc1s1XTsKKwlpbnQgdGVtcF9kaXJfbGVuOworCisJLyogY29weSB0aGUgcmVmcyB0byB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSAqLworCisJc3RyYnVmX2FkZHN0cigmdGVtcF9kaXIsIGdpdF9wYXRoKCJyc3luYy1yZWZzLVhYWFhYWCIpKTsKKwlpZiAoIW1rZHRlbXAodGVtcF9kaXIuYnVmKSkKKwkJZGllICgiQ291bGQgbm90IG1ha2UgdGVtcG9yYXJ5IGRpcmVjdG9yeSIpOworCXRlbXBfZGlyX2xlbiA9IHRlbXBfZGlyLmxlbjsKKworCXN0cmJ1Zl9hZGRzdHIoJmJ1ZiwgdHJhbnNwb3J0LT51cmwpOworCXN0cmJ1Zl9hZGRzdHIoJmJ1ZiwgIi9yZWZzIik7CisKKwltZW1zZXQoJnJzeW5jLCAwLCBzaXplb2YocnN5bmMpKTsKKwlyc3luYy5hcmd2ID0gYXJnczsKKwlyc3luYy5zdGRvdXRfdG9fc3RkZXJyID0gMTsKKwlhcmdzWzBdID0gInJzeW5jIjsKKwlhcmdzWzFdID0gKHRyYW5zcG9ydC0+dmVyYm9zZSA+IDApID8gIi1ydiIgOiAiLXIiOworCWFyZ3NbMl0gPSBidWYuYnVmOworCWFyZ3NbM10gPSB0ZW1wX2Rpci5idWY7CisJYXJnc1s0XSA9IE5VTEw7CisKKwlpZiAocnVuX2NvbW1hbmQoJnJzeW5jKSkKKwkJZGllICgiQ291bGQgbm90IHJ1biByc3luYyB0byBnZXQgcmVmcyIpOworCisJc3RyYnVmX3Jlc2V0KCZidWYpOworCXN0cmJ1Zl9hZGRzdHIoJmJ1ZiwgdHJhbnNwb3J0LT51cmwpOworCXN0cmJ1Zl9hZGRzdHIoJmJ1ZiwgIi9wYWNrZWQtcmVmcyIpOworCisJYXJnc1syXSA9IGJ1Zi5idWY7CisKKwlpZiAocnVuX2NvbW1hbmQoJnJzeW5jKSkKKwkJZGllICgiQ291bGQgbm90IHJ1biByc3luYyB0byBnZXQgcmVmcyIpOworCisJLyogcmVhZCB0aGUgY29waWVkIHJlZnMgKi8KKworCXN0cmJ1Zl9hZGRzdHIoJnRlbXBfZGlyLCAiL3JlZnMiKTsKKwlyZWFkX2xvb3NlX3JlZnMoJnRlbXBfZGlyLCB0ZW1wX2Rpcl9sZW4gKyAxLCAmdGFpbCk7CisJc3RyYnVmX3NldGxlbigmdGVtcF9kaXIsIHRlbXBfZGlyX2xlbik7CisKKwl0YWlsID0gJmR1bW15OworCXN0cmJ1Zl9hZGRzdHIoJnRlbXBfZGlyLCAiL3BhY2tlZC1yZWZzIik7CisJaW5zZXJ0X3BhY2tlZF9yZWZzKHRlbXBfZGlyLmJ1ZiwgJnRhaWwpOworCXN0cmJ1Zl9zZXRsZW4oJnRlbXBfZGlyLCB0ZW1wX2Rpcl9sZW4pOworCisJaWYgKHJlbW92ZV9kaXJfcmVjdXJzaXZlbHkoJnRlbXBfZGlyLCAwKSkKKwkJd2FybmluZyAoIkVycm9yIHJlbW92aW5nIHRlbXBvcmFyeSBkaXJlY3RvcnkgJXMuIiwKKwkJCQl0ZW1wX2Rpci5idWYpOworCisJc3RyYnVmX3JlbGVhc2UoJmJ1Zik7CisJc3RyYnVmX3JlbGVhc2UoJnRlbXBfZGlyKTsKKworCXJldHVybiBkdW1teS5uZXh0OworfQorCitzdGF0aWMgaW50IGZldGNoX29ianNfdmlhX3JzeW5jKHN0cnVjdCB0cmFuc3BvcnQgKnRyYW5zcG9ydCwKKwkJCQkgaW50IG5yX29ianMsIHN0cnVjdCByZWYgKip0b19mZXRjaCkKK3sKKwlzdHJ1Y3Qgc3RyYnVmIGJ1ZiA9IFNUUkJVRl9JTklUOworCXN0cnVjdCBjaGlsZF9wcm9jZXNzIHJzeW5jOworCWNvbnN0IGNoYXIgKmFyZ3NbOF07CisJaW50IHJlc3VsdDsKKworCXN0cmJ1Zl9hZGRzdHIoJmJ1ZiwgdHJhbnNwb3J0LT51cmwpOworCXN0cmJ1Zl9hZGRzdHIoJmJ1ZiwgIi9vYmplY3RzLyIpOworCisJbWVtc2V0KCZyc3luYywgMCwgc2l6ZW9mKHJzeW5jKSk7CisJcnN5bmMuYXJndiA9IGFyZ3M7CisJcnN5bmMuc3Rkb3V0X3RvX3N0ZGVyciA9IDE7CisJYXJnc1swXSA9ICJyc3luYyI7CisJYXJnc1sxXSA9ICh0cmFuc3BvcnQtPnZlcmJvc2UgPiAwKSA/ICItcnYiIDogIi1yIjsKKwlhcmdzWzJdID0gIi0taWdub3JlLWV4aXN0aW5nIjsKKwlhcmdzWzNdID0gIi0tZXhjbHVkZSI7CisJYXJnc1s0XSA9ICJpbmZvIjsKKwlhcmdzWzVdID0gYnVmLmJ1ZjsKKwlhcmdzWzZdID0gZ2V0X29iamVjdF9kaXJlY3RvcnkoKTsKKwlhcmdzWzddID0gTlVMTDsKKworCS8qIE5FRURTV09SSzogaGFuZGxlIG9uZSBsZXZlbCBvZiBhbHRlcm5hdGVzICovCisJcmVzdWx0ID0gcnVuX2NvbW1hbmQoJnJzeW5jKTsKKworCXN0cmJ1Zl9yZWxlYXNlKCZidWYpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCB3cml0ZV9vbmVfcmVmKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCWludCBmbGFncywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3RyYnVmICpidWYgPSBkYXRhOworCWludCBsZW4gPSBidWYtPmxlbjsKKwlGSUxFICpmOworCisJLyogd2hlbiBjYWxsZWQgdmlhIGZvcl9lYWNoX3JlZigpLCBmbGFncyBpcyBub24temVybyAqLworCWlmIChmbGFncyAmJiBwcmVmaXhjbXAobmFtZSwgInJlZnMvaGVhZHMvIikgJiYKKwkJCXByZWZpeGNtcChuYW1lLCAicmVmcy90YWdzLyIpKQorCQlyZXR1cm4gMDsKKworCXN0cmJ1Zl9hZGRzdHIoYnVmLCBuYW1lKTsKKwlpZiAoc2FmZV9jcmVhdGVfbGVhZGluZ19kaXJlY3RvcmllcyhidWYtPmJ1ZikgfHwKKwkJCSEoZiA9IGZvcGVuKGJ1Zi0+YnVmLCAidyIpKSB8fAorCQkJZnByaW50ZihmLCAiJXNcbiIsIHNoYTFfdG9faGV4KHNoYTEpKSA8IDAgfHwKKwkJCWZjbG9zZShmKSkKKwkJcmV0dXJuIGVycm9yKCJwcm9ibGVtcyB3cml0aW5nIHRlbXBvcmFyeSBmaWxlICVzIiwgYnVmLT5idWYpOworCXN0cmJ1Zl9zZXRsZW4oYnVmLCBsZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX3JlZnNfdG9fdGVtcF9kaXIoc3RydWN0IHN0cmJ1ZiAqdGVtcF9kaXIsCisJCWludCByZWZzcGVjX25yLCBjb25zdCBjaGFyICoqcmVmc3BlYykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCByZWZzcGVjX25yOyBpKyspIHsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJY2hhciAqcmVmOworCisJCWlmIChkd2ltX3JlZihyZWZzcGVjW2ldLCBzdHJsZW4ocmVmc3BlY1tpXSksIHNoYTEsICZyZWYpICE9IDEpCisJCQlyZXR1cm4gZXJyb3IoIkNvdWxkIG5vdCBnZXQgcmVmICVzIiwgcmVmc3BlY1tpXSk7CisKKwkJaWYgKHdyaXRlX29uZV9yZWYocmVmLCBzaGExLCAwLCB0ZW1wX2RpcikpIHsKKwkJCWZyZWUocmVmKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlmcmVlKHJlZik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJzeW5jX3RyYW5zcG9ydF9wdXNoKHN0cnVjdCB0cmFuc3BvcnQgKnRyYW5zcG9ydCwKKwkJaW50IHJlZnNwZWNfbnIsIGNvbnN0IGNoYXIgKipyZWZzcGVjLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHN0cmJ1ZiBidWYgPSBTVFJCVUZfSU5JVCwgdGVtcF9kaXIgPSBTVFJCVUZfSU5JVDsKKwlpbnQgcmVzdWx0ID0gMCwgaTsKKwlzdHJ1Y3QgY2hpbGRfcHJvY2VzcyByc3luYzsKKwljb25zdCBjaGFyICphcmdzWzEwXTsKKworCWlmIChmbGFncyAmIFRSQU5TUE9SVF9QVVNIX01JUlJPUikKKwkJcmV0dXJuIGVycm9yKCJyc3luYyB0cmFuc3BvcnQgZG9lcyBub3Qgc3VwcG9ydCBtaXJyb3IgbW9kZSIpOworCisJLyogZmlyc3QgcHVzaCB0aGUgb2JqZWN0cyAqLworCisJc3RyYnVmX2FkZHN0cigmYnVmLCB0cmFuc3BvcnQtPnVybCk7CisJc3RyYnVmX2FkZGNoKCZidWYsICcvJyk7CisKKwltZW1zZXQoJnJzeW5jLCAwLCBzaXplb2YocnN5bmMpKTsKKwlyc3luYy5hcmd2ID0gYXJnczsKKwlyc3luYy5zdGRvdXRfdG9fc3RkZXJyID0gMTsKKwlpID0gMDsKKwlhcmdzW2krK10gPSAicnN5bmMiOworCWFyZ3NbaSsrXSA9ICItYSI7CisJaWYgKGZsYWdzICYgVFJBTlNQT1JUX1BVU0hfRFJZX1JVTikKKwkJYXJnc1tpKytdID0gIi0tZHJ5LXJ1biI7CisJaWYgKHRyYW5zcG9ydC0+dmVyYm9zZSA+IDApCisJCWFyZ3NbaSsrXSA9ICItdiI7CisJYXJnc1tpKytdID0gIi0taWdub3JlLWV4aXN0aW5nIjsKKwlhcmdzW2krK10gPSAiLS1leGNsdWRlIjsKKwlhcmdzW2krK10gPSAiaW5mbyI7CisJYXJnc1tpKytdID0gZ2V0X29iamVjdF9kaXJlY3RvcnkoKTsKKwlhcmdzW2krK10gPSBidWYuYnVmOworCWFyZ3NbaSsrXSA9IE5VTEw7CisKKwlpZiAocnVuX2NvbW1hbmQoJnJzeW5jKSkKKwkJcmV0dXJuIGVycm9yKCJDb3VsZCBub3QgcHVzaCBvYmplY3RzIHRvICVzIiwgdHJhbnNwb3J0LT51cmwpOworCisJLyogY29weSB0aGUgcmVmcyB0byB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeTsgdGhleSBjb3VsZCBiZSBwYWNrZWQuICovCisKKwlzdHJidWZfYWRkc3RyKCZ0ZW1wX2RpciwgZ2l0X3BhdGgoInJzeW5jLXJlZnMtWFhYWFhYIikpOworCWlmICghbWtkdGVtcCh0ZW1wX2Rpci5idWYpKQorCQlkaWUgKCJDb3VsZCBub3QgbWFrZSB0ZW1wb3JhcnkgZGlyZWN0b3J5Iik7CisJc3RyYnVmX2FkZGNoKCZ0ZW1wX2RpciwgJy8nKTsKKworCWlmIChmbGFncyAmIFRSQU5TUE9SVF9QVVNIX0FMTCkgeworCQlpZiAoZm9yX2VhY2hfcmVmKHdyaXRlX29uZV9yZWYsICZ0ZW1wX2RpcikpCisJCQlyZXR1cm4gLTE7CisJfSBlbHNlIGlmICh3cml0ZV9yZWZzX3RvX3RlbXBfZGlyKCZ0ZW1wX2RpciwgcmVmc3BlY19uciwgcmVmc3BlYykpCisJCXJldHVybiAtMTsKKworCWkgPSAyOworCWlmIChmbGFncyAmIFRSQU5TUE9SVF9QVVNIX0RSWV9SVU4pCisJCWFyZ3NbaSsrXSA9ICItLWRyeS1ydW4iOworCWlmICghKGZsYWdzICYgVFJBTlNQT1JUX1BVU0hfRk9SQ0UpKQorCQlhcmdzW2krK10gPSAiLS1pZ25vcmUtZXhpc3RpbmciOworCWFyZ3NbaSsrXSA9IHRlbXBfZGlyLmJ1ZjsKKwlhcmdzW2krK10gPSB0cmFuc3BvcnQtPnVybDsKKwlhcmdzW2krK10gPSBOVUxMOworCWlmIChydW5fY29tbWFuZCgmcnN5bmMpKQorCQlyZXN1bHQgPSBlcnJvcigiQ291bGQgbm90IHB1c2ggdG8gJXMiLCB0cmFuc3BvcnQtPnVybCk7CisKKwlpZiAocmVtb3ZlX2Rpcl9yZWN1cnNpdmVseSgmdGVtcF9kaXIsIDApKQorCQl3YXJuaW5nICgiQ291bGQgbm90IHJlbW92ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5ICVzLiIsCisJCQkJdGVtcF9kaXIuYnVmKTsKKworCXN0cmJ1Zl9yZWxlYXNlKCZidWYpOworCXN0cmJ1Zl9yZWxlYXNlKCZ0ZW1wX2Rpcik7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBHZW5lcmljIGZ1bmN0aW9ucyBmb3IgdXNpbmcgY29tbWl0IHdhbGtlcnMgKi8KKworI2lmbmRlZiBOT19DVVJMIC8qIGh0dHAgZmV0Y2ggaXMgdGhlIG9ubHkgdXNlciAqLworc3RhdGljIGludCBmZXRjaF9vYmpzX3ZpYV93YWxrZXIoc3RydWN0IHRyYW5zcG9ydCAqdHJhbnNwb3J0LAorCQkJCSBpbnQgbnJfb2Jqcywgc3RydWN0IHJlZiAqKnRvX2ZldGNoKQoreworCWNoYXIgKmRlc3QgPSB4c3RyZHVwKHRyYW5zcG9ydC0+dXJsKTsKKwlzdHJ1Y3Qgd2Fsa2VyICp3YWxrZXIgPSB0cmFuc3BvcnQtPmRhdGE7CisJY2hhciAqKm9ianMgPSB4bWFsbG9jKG5yX29ianMgKiBzaXplb2YoKm9ianMpKTsKKwlpbnQgaTsKKworCXdhbGtlci0+Z2V0X2FsbCA9IDE7CisJd2Fsa2VyLT5nZXRfdHJlZSA9IDE7CisJd2Fsa2VyLT5nZXRfaGlzdG9yeSA9IDE7CisJd2Fsa2VyLT5nZXRfdmVyYm9zZWx5ID0gdHJhbnNwb3J0LT52ZXJib3NlID49IDA7CisJd2Fsa2VyLT5nZXRfcmVjb3ZlciA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfb2JqczsgaSsrKQorCQlvYmpzW2ldID0geHN0cmR1cChzaGExX3RvX2hleCh0b19mZXRjaFtpXS0+b2xkX3NoYTEpKTsKKworCWlmICh3YWxrZXJfZmV0Y2god2Fsa2VyLCBucl9vYmpzLCBvYmpzLCBOVUxMLCBOVUxMKSkKKwkJZGllKCJGZXRjaCBmYWlsZWQuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfb2JqczsgaSsrKQorCQlmcmVlKG9ianNbaV0pOworCWZyZWUob2Jqcyk7CisJZnJlZShkZXN0KTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBOT19DVVJMICovCisKK3N0YXRpYyBpbnQgZGlzY29ubmVjdF93YWxrZXIoc3RydWN0IHRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworCXN0cnVjdCB3YWxrZXIgKndhbGtlciA9IHRyYW5zcG9ydC0+ZGF0YTsKKwlpZiAod2Fsa2VyKQorCQl3YWxrZXJfZnJlZSh3YWxrZXIpOworCXJldHVybiAwOworfQorCisjaWZuZGVmIE5PX0NVUkwKK3N0YXRpYyBpbnQgY3VybF90cmFuc3BvcnRfcHVzaChzdHJ1Y3QgdHJhbnNwb3J0ICp0cmFuc3BvcnQsIGludCByZWZzcGVjX25yLCBjb25zdCBjaGFyICoqcmVmc3BlYywgaW50IGZsYWdzKQoreworCWNvbnN0IGNoYXIgKiphcmd2OworCWludCBhcmdjOworCWludCBlcnI7CisKKwlpZiAoZmxhZ3MgJiBUUkFOU1BPUlRfUFVTSF9NSVJST1IpCisJCXJldHVybiBlcnJvcigiaHR0cCB0cmFuc3BvcnQgZG9lcyBub3Qgc3VwcG9ydCBtaXJyb3IgbW9kZSIpOworCisJYXJndiA9IHhtYWxsb2MoKHJlZnNwZWNfbnIgKyAxMikgKiBzaXplb2YoY2hhciAqKSk7CisJYXJndlswXSA9ICJodHRwLXB1c2giOworCWFyZ2MgPSAxOworCWlmIChmbGFncyAmIFRSQU5TUE9SVF9QVVNIX0FMTCkKKwkJYXJndlthcmdjKytdID0gIi0tYWxsIjsKKwlpZiAoZmxhZ3MgJiBUUkFOU1BPUlRfUFVTSF9GT1JDRSkKKwkJYXJndlthcmdjKytdID0gIi0tZm9yY2UiOworCWlmIChmbGFncyAmIFRSQU5TUE9SVF9QVVNIX0RSWV9SVU4pCisJCWFyZ3ZbYXJnYysrXSA9ICItLWRyeS1ydW4iOworCWlmIChmbGFncyAmIFRSQU5TUE9SVF9QVVNIX1ZFUkJPU0UpCisJCWFyZ3ZbYXJnYysrXSA9ICItLXZlcmJvc2UiOworCWFyZ3ZbYXJnYysrXSA9IHRyYW5zcG9ydC0+dXJsOworCXdoaWxlIChyZWZzcGVjX25yLS0pCisJCWFyZ3ZbYXJnYysrXSA9ICpyZWZzcGVjKys7CisJYXJndlthcmdjXSA9IE5VTEw7CisJZXJyID0gcnVuX2NvbW1hbmRfdl9vcHQoYXJndiwgUlVOX0dJVF9DTUQpOworCXN3aXRjaCAoZXJyKSB7CisJY2FzZSAtRVJSX1JVTl9DT01NQU5EX0ZPUks6CisJCWVycm9yKCJ1bmFibGUgdG8gZm9yayBmb3IgJXMiLCBhcmd2WzBdKTsKKwljYXNlIC1FUlJfUlVOX0NPTU1BTkRfRVhFQzoKKwkJZXJyb3IoInVuYWJsZSB0byBleGVjICVzIiwgYXJndlswXSk7CisJCWJyZWFrOworCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEOgorCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1dST05HX1BJRDoKKwljYXNlIC1FUlJfUlVOX0NPTU1BTkRfV0FJVFBJRF9TSUdOQUw6CisJY2FzZSAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfTk9FWElUOgorCQllcnJvcigiJXMgZGllZCB3aXRoIHN0cmFuZ2UgZXJyb3IiLCBhcmd2WzBdKTsKKwl9CisJcmV0dXJuICEhZXJyOworfQorCitzdGF0aWMgc3RydWN0IHJlZiAqZ2V0X3JlZnNfdmlhX2N1cmwoc3RydWN0IHRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworCXN0cnVjdCBzdHJidWYgYnVmZmVyID0gU1RSQlVGX0lOSVQ7CisJY2hhciAqZGF0YSwgKnN0YXJ0LCAqbWlkOworCWNoYXIgKnJlZl9uYW1lOworCWNoYXIgKnJlZnNfdXJsOworCWludCBpID0gMDsKKworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBzbG90X3Jlc3VsdHMgcmVzdWx0czsKKworCXN0cnVjdCByZWYgKnJlZnMgPSBOVUxMOworCXN0cnVjdCByZWYgKnJlZiA9IE5VTEw7CisJc3RydWN0IHJlZiAqbGFzdF9yZWYgPSBOVUxMOworCisJaWYgKCF0cmFuc3BvcnQtPmRhdGEpCisJCXRyYW5zcG9ydC0+ZGF0YSA9IGdldF9odHRwX3dhbGtlcih0cmFuc3BvcnQtPnVybCwKKwkJCQkJCXRyYW5zcG9ydC0+cmVtb3RlKTsKKworCXJlZnNfdXJsID0geG1hbGxvYyhzdHJsZW4odHJhbnNwb3J0LT51cmwpICsgMTEpOworCXNwcmludGYocmVmc191cmwsICIlcy9pbmZvL3JlZnMiLCB0cmFuc3BvcnQtPnVybCk7CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCAmYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgcmVmc191cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBOVUxMKTsKKworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ICE9IENVUkxFX09LKSB7CisJCQlzdHJidWZfcmVsZWFzZSgmYnVmZmVyKTsKKwkJCWlmIChtaXNzaW5nX3RhcmdldCgmcmVzdWx0cykpIHsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0gZWxzZSB7CisJCQkJZXJyb3IoIiVzIiwgY3VybF9lcnJvcnN0cik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlzdHJidWZfcmVsZWFzZSgmYnVmZmVyKTsKKwkJZXJyb3IoIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0Iik7CisJCXJldHVybiBOVUxMOworCX0KKworCWRhdGEgPSBidWZmZXIuYnVmOworCXN0YXJ0ID0gTlVMTDsKKwltaWQgPSBkYXRhOworCXdoaWxlIChpIDwgYnVmZmVyLmxlbikgeworCQlpZiAoIXN0YXJ0KQorCQkJc3RhcnQgPSAmZGF0YVtpXTsKKwkJaWYgKGRhdGFbaV0gPT0gJ1x0JykKKwkJCW1pZCA9ICZkYXRhW2ldOworCQlpZiAoZGF0YVtpXSA9PSAnXG4nKSB7CisJCQlkYXRhW2ldID0gMDsKKwkJCXJlZl9uYW1lID0gbWlkICsgMTsKKwkJCXJlZiA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWYpICsKKwkJCQkgICAgICBzdHJsZW4ocmVmX25hbWUpICsgMSk7CisJCQltZW1zZXQocmVmLCAwLCBzaXplb2Yoc3RydWN0IHJlZikpOworCQkJc3RyY3B5KHJlZi0+bmFtZSwgcmVmX25hbWUpOworCQkJZ2V0X3NoYTFfaGV4KHN0YXJ0LCByZWYtPm9sZF9zaGExKTsKKwkJCWlmICghcmVmcykKKwkJCQlyZWZzID0gcmVmOworCQkJaWYgKGxhc3RfcmVmKQorCQkJCWxhc3RfcmVmLT5uZXh0ID0gcmVmOworCQkJbGFzdF9yZWYgPSByZWY7CisJCQlzdGFydCA9IE5VTEw7CisJCX0KKwkJaSsrOworCX0KKworCXN0cmJ1Zl9yZWxlYXNlKCZidWZmZXIpOworCisJcmV0dXJuIHJlZnM7Cit9CisKK3N0YXRpYyBpbnQgZmV0Y2hfb2Jqc192aWFfY3VybChzdHJ1Y3QgdHJhbnNwb3J0ICp0cmFuc3BvcnQsCisJCQkJIGludCBucl9vYmpzLCBzdHJ1Y3QgcmVmICoqdG9fZmV0Y2gpCit7CisJaWYgKCF0cmFuc3BvcnQtPmRhdGEpCisJCXRyYW5zcG9ydC0+ZGF0YSA9IGdldF9odHRwX3dhbGtlcih0cmFuc3BvcnQtPnVybCwKKwkJCQkJCXRyYW5zcG9ydC0+cmVtb3RlKTsKKwlyZXR1cm4gZmV0Y2hfb2Jqc192aWFfd2Fsa2VyKHRyYW5zcG9ydCwgbnJfb2JqcywgdG9fZmV0Y2gpOworfQorCisjZW5kaWYKKworc3RydWN0IGJ1bmRsZV90cmFuc3BvcnRfZGF0YSB7CisJaW50IGZkOworCXN0cnVjdCBidW5kbGVfaGVhZGVyIGhlYWRlcjsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVmICpnZXRfcmVmc19mcm9tX2J1bmRsZShzdHJ1Y3QgdHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisJc3RydWN0IGJ1bmRsZV90cmFuc3BvcnRfZGF0YSAqZGF0YSA9IHRyYW5zcG9ydC0+ZGF0YTsKKwlzdHJ1Y3QgcmVmICpyZXN1bHQgPSBOVUxMOworCWludCBpOworCisJaWYgKGRhdGEtPmZkID4gMCkKKwkJY2xvc2UoZGF0YS0+ZmQpOworCWRhdGEtPmZkID0gcmVhZF9idW5kbGVfaGVhZGVyKHRyYW5zcG9ydC0+dXJsLCAmZGF0YS0+aGVhZGVyKTsKKwlpZiAoZGF0YS0+ZmQgPCAwKQorCQlkaWUgKCJDb3VsZCBub3QgcmVhZCBidW5kbGUgJyVzJy4iLCB0cmFuc3BvcnQtPnVybCk7CisJZm9yIChpID0gMDsgaSA8IGRhdGEtPmhlYWRlci5yZWZlcmVuY2VzLm5yOyBpKyspIHsKKwkJc3RydWN0IHJlZl9saXN0X2VudHJ5ICplID0gZGF0YS0+aGVhZGVyLnJlZmVyZW5jZXMubGlzdCArIGk7CisJCXN0cnVjdCByZWYgKnJlZiA9IGFsbG9jX3JlZihzdHJsZW4oZS0+bmFtZSkgKyAxKTsKKwkJaGFzaGNweShyZWYtPm9sZF9zaGExLCBlLT5zaGExKTsKKwkJc3RyY3B5KHJlZi0+bmFtZSwgZS0+bmFtZSk7CisJCXJlZi0+bmV4dCA9IHJlc3VsdDsKKwkJcmVzdWx0ID0gcmVmOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGZldGNoX3JlZnNfZnJvbV9idW5kbGUoc3RydWN0IHRyYW5zcG9ydCAqdHJhbnNwb3J0LAorCQkJICAgICAgIGludCBucl9oZWFkcywgc3RydWN0IHJlZiAqKnRvX2ZldGNoKQoreworCXN0cnVjdCBidW5kbGVfdHJhbnNwb3J0X2RhdGEgKmRhdGEgPSB0cmFuc3BvcnQtPmRhdGE7CisJcmV0dXJuIHVuYnVuZGxlKCZkYXRhLT5oZWFkZXIsIGRhdGEtPmZkKTsKK30KKworc3RhdGljIGludCBjbG9zZV9idW5kbGUoc3RydWN0IHRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworCXN0cnVjdCBidW5kbGVfdHJhbnNwb3J0X2RhdGEgKmRhdGEgPSB0cmFuc3BvcnQtPmRhdGE7CisJaWYgKGRhdGEtPmZkID4gMCkKKwkJY2xvc2UoZGF0YS0+ZmQpOworCWZyZWUoZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBnaXRfdHJhbnNwb3J0X2RhdGEgeworCXVuc2lnbmVkIHRoaW4gOiAxOworCXVuc2lnbmVkIGtlZXAgOiAxOworCXVuc2lnbmVkIGZvbGxvd3RhZ3MgOiAxOworCWludCBkZXB0aDsKKwlzdHJ1Y3QgY2hpbGRfcHJvY2VzcyAqY29ubjsKKwlpbnQgZmRbMl07CisJY29uc3QgY2hhciAqdXBsb2FkcGFjazsKKwljb25zdCBjaGFyICpyZWNlaXZlcGFjazsKK307CisKK3N0YXRpYyBpbnQgc2V0X2dpdF9vcHRpb24oc3RydWN0IHRyYW5zcG9ydCAqY29ubmVjdGlvbiwKKwkJCSAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJc3RydWN0IGdpdF90cmFuc3BvcnRfZGF0YSAqZGF0YSA9IGNvbm5lY3Rpb24tPmRhdGE7CisJaWYgKCFzdHJjbXAobmFtZSwgVFJBTlNfT1BUX1VQTE9BRFBBQ0spKSB7CisJCWRhdGEtPnVwbG9hZHBhY2sgPSB2YWx1ZTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmICghc3RyY21wKG5hbWUsIFRSQU5TX09QVF9SRUNFSVZFUEFDSykpIHsKKwkJZGF0YS0+cmVjZWl2ZXBhY2sgPSB2YWx1ZTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmICghc3RyY21wKG5hbWUsIFRSQU5TX09QVF9USElOKSkgeworCQlkYXRhLT50aGluID0gISF2YWx1ZTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmICghc3RyY21wKG5hbWUsIFRSQU5TX09QVF9GT0xMT1dUQUdTKSkgeworCQlkYXRhLT5mb2xsb3d0YWdzID0gISF2YWx1ZTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmICghc3RyY21wKG5hbWUsIFRSQU5TX09QVF9LRUVQKSkgeworCQlkYXRhLT5rZWVwID0gISF2YWx1ZTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmICghc3RyY21wKG5hbWUsIFRSQU5TX09QVF9ERVBUSCkpIHsKKwkJaWYgKCF2YWx1ZSkKKwkJCWRhdGEtPmRlcHRoID0gMDsKKwkJZWxzZQorCQkJZGF0YS0+ZGVwdGggPSBhdG9pKHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNvbm5lY3Rfc2V0dXAoc3RydWN0IHRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworCXN0cnVjdCBnaXRfdHJhbnNwb3J0X2RhdGEgKmRhdGEgPSB0cmFuc3BvcnQtPmRhdGE7CisJZGF0YS0+Y29ubiA9IGdpdF9jb25uZWN0KGRhdGEtPmZkLCB0cmFuc3BvcnQtPnVybCwgZGF0YS0+dXBsb2FkcGFjaywgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVmICpnZXRfcmVmc192aWFfY29ubmVjdChzdHJ1Y3QgdHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisJc3RydWN0IGdpdF90cmFuc3BvcnRfZGF0YSAqZGF0YSA9IHRyYW5zcG9ydC0+ZGF0YTsKKwlzdHJ1Y3QgcmVmICpyZWZzOworCisJY29ubmVjdF9zZXR1cCh0cmFuc3BvcnQpOworCWdldF9yZW1vdGVfaGVhZHMoZGF0YS0+ZmRbMF0sICZyZWZzLCAwLCBOVUxMLCAwKTsKKworCXJldHVybiByZWZzOworfQorCitzdGF0aWMgaW50IGZldGNoX3JlZnNfdmlhX3BhY2soc3RydWN0IHRyYW5zcG9ydCAqdHJhbnNwb3J0LAorCQkJICAgICAgIGludCBucl9oZWFkcywgc3RydWN0IHJlZiAqKnRvX2ZldGNoKQoreworCXN0cnVjdCBnaXRfdHJhbnNwb3J0X2RhdGEgKmRhdGEgPSB0cmFuc3BvcnQtPmRhdGE7CisJY2hhciAqKmhlYWRzID0geG1hbGxvYyhucl9oZWFkcyAqIHNpemVvZigqaGVhZHMpKTsKKwljaGFyICoqb3JpZ2ggPSB4bWFsbG9jKG5yX2hlYWRzICogc2l6ZW9mKCpvcmlnaCkpOworCWNvbnN0IHN0cnVjdCByZWYgKnJlZnM7CisJY2hhciAqZGVzdCA9IHhzdHJkdXAodHJhbnNwb3J0LT51cmwpOworCXN0cnVjdCBmZXRjaF9wYWNrX2FyZ3MgYXJnczsKKwlpbnQgaTsKKwlzdHJ1Y3QgcmVmICpyZWZzX3RtcCA9IE5VTEw7CisKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisJYXJncy51cGxvYWRwYWNrID0gZGF0YS0+dXBsb2FkcGFjazsKKwlhcmdzLmtlZXBfcGFjayA9IGRhdGEtPmtlZXA7CisJYXJncy5sb2NrX3BhY2sgPSAxOworCWFyZ3MudXNlX3RoaW5fcGFjayA9IGRhdGEtPnRoaW47CisJYXJncy5pbmNsdWRlX3RhZyA9IGRhdGEtPmZvbGxvd3RhZ3M7CisJYXJncy52ZXJib3NlID0gdHJhbnNwb3J0LT52ZXJib3NlID4gMDsKKwlhcmdzLmRlcHRoID0gZGF0YS0+ZGVwdGg7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfaGVhZHM7IGkrKykKKwkJb3JpZ2hbaV0gPSBoZWFkc1tpXSA9IHhzdHJkdXAodG9fZmV0Y2hbaV0tPm5hbWUpOworCisJaWYgKCFkYXRhLT5jb25uKSB7CisJCWNvbm5lY3Rfc2V0dXAodHJhbnNwb3J0KTsKKwkJZ2V0X3JlbW90ZV9oZWFkcyhkYXRhLT5mZFswXSwgJnJlZnNfdG1wLCAwLCBOVUxMLCAwKTsKKwl9CisKKwlyZWZzID0gZmV0Y2hfcGFjaygmYXJncywgZGF0YS0+ZmQsIGRhdGEtPmNvbm4sCisJCQkgIHJlZnNfdG1wID8gcmVmc190bXAgOiB0cmFuc3BvcnQtPnJlbW90ZV9yZWZzLAorCQkJICBkZXN0LCBucl9oZWFkcywgaGVhZHMsICZ0cmFuc3BvcnQtPnBhY2tfbG9ja2ZpbGUpOworCWNsb3NlKGRhdGEtPmZkWzBdKTsKKwljbG9zZShkYXRhLT5mZFsxXSk7CisJaWYgKGZpbmlzaF9jb25uZWN0KGRhdGEtPmNvbm4pKQorCQlyZWZzID0gTlVMTDsKKwlkYXRhLT5jb25uID0gTlVMTDsKKworCWZyZWVfcmVmcyhyZWZzX3RtcCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfaGVhZHM7IGkrKykKKwkJZnJlZShvcmlnaFtpXSk7CisJZnJlZShvcmlnaCk7CisJZnJlZShoZWFkcyk7CisJZnJlZShkZXN0KTsKKwlyZXR1cm4gKHJlZnMgPyAwIDogLTEpOworfQorCitzdGF0aWMgaW50IGdpdF90cmFuc3BvcnRfcHVzaChzdHJ1Y3QgdHJhbnNwb3J0ICp0cmFuc3BvcnQsIGludCByZWZzcGVjX25yLCBjb25zdCBjaGFyICoqcmVmc3BlYywgaW50IGZsYWdzKQoreworCXN0cnVjdCBnaXRfdHJhbnNwb3J0X2RhdGEgKmRhdGEgPSB0cmFuc3BvcnQtPmRhdGE7CisJc3RydWN0IHNlbmRfcGFja19hcmdzIGFyZ3M7CisKKwlhcmdzLnJlY2VpdmVwYWNrID0gZGF0YS0+cmVjZWl2ZXBhY2s7CisJYXJncy5zZW5kX2FsbCA9ICEhKGZsYWdzICYgVFJBTlNQT1JUX1BVU0hfQUxMKTsKKwlhcmdzLnNlbmRfbWlycm9yID0gISEoZmxhZ3MgJiBUUkFOU1BPUlRfUFVTSF9NSVJST1IpOworCWFyZ3MuZm9yY2VfdXBkYXRlID0gISEoZmxhZ3MgJiBUUkFOU1BPUlRfUFVTSF9GT1JDRSk7CisJYXJncy51c2VfdGhpbl9wYWNrID0gZGF0YS0+dGhpbjsKKwlhcmdzLnZlcmJvc2UgPSAhIShmbGFncyAmIFRSQU5TUE9SVF9QVVNIX1ZFUkJPU0UpOworCWFyZ3MuZHJ5X3J1biA9ICEhKGZsYWdzICYgVFJBTlNQT1JUX1BVU0hfRFJZX1JVTik7CisKKwlyZXR1cm4gc2VuZF9wYWNrKCZhcmdzLCB0cmFuc3BvcnQtPnVybCwgdHJhbnNwb3J0LT5yZW1vdGUsIHJlZnNwZWNfbnIsIHJlZnNwZWMpOworfQorCitzdGF0aWMgaW50IGRpc2Nvbm5lY3RfZ2l0KHN0cnVjdCB0cmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKwlzdHJ1Y3QgZ2l0X3RyYW5zcG9ydF9kYXRhICpkYXRhID0gdHJhbnNwb3J0LT5kYXRhOworCWlmIChkYXRhLT5jb25uKSB7CisJCXBhY2tldF9mbHVzaChkYXRhLT5mZFsxXSk7CisJCWNsb3NlKGRhdGEtPmZkWzBdKTsKKwkJY2xvc2UoZGF0YS0+ZmRbMV0pOworCQlmaW5pc2hfY29ubmVjdChkYXRhLT5jb25uKTsKKwl9CisKKwlmcmVlKGRhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlzX2xvY2FsKGNvbnN0IGNoYXIgKnVybCkKK3sKKwljb25zdCBjaGFyICpjb2xvbiA9IHN0cmNocih1cmwsICc6Jyk7CisJY29uc3QgY2hhciAqc2xhc2ggPSBzdHJjaHIodXJsLCAnLycpOworCXJldHVybiAhY29sb24gfHwgKHNsYXNoICYmIHNsYXNoIDwgY29sb24pOworfQorCitzdGF0aWMgaW50IGlzX2ZpbGUoY29uc3QgY2hhciAqdXJsKQoreworCXN0cnVjdCBzdGF0IGJ1ZjsKKwlpZiAoc3RhdCh1cmwsICZidWYpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gU19JU1JFRyhidWYuc3RfbW9kZSk7Cit9CisKK3N0cnVjdCB0cmFuc3BvcnQgKnRyYW5zcG9ydF9nZXQoc3RydWN0IHJlbW90ZSAqcmVtb3RlLCBjb25zdCBjaGFyICp1cmwpCit7CisJc3RydWN0IHRyYW5zcG9ydCAqcmV0ID0geGNhbGxvYygxLCBzaXplb2YoKnJldCkpOworCisJcmV0LT5yZW1vdGUgPSByZW1vdGU7CisJcmV0LT51cmwgPSB1cmw7CisKKwlpZiAoIXByZWZpeGNtcCh1cmwsICJyc3luYzovLyIpKSB7CisJCXJldC0+Z2V0X3JlZnNfbGlzdCA9IGdldF9yZWZzX3ZpYV9yc3luYzsKKwkJcmV0LT5mZXRjaCA9IGZldGNoX29ianNfdmlhX3JzeW5jOworCQlyZXQtPnB1c2ggPSByc3luY190cmFuc3BvcnRfcHVzaDsKKworCX0gZWxzZSBpZiAoIXByZWZpeGNtcCh1cmwsICJodHRwOi8vIikKKwkgICAgICAgIHx8ICFwcmVmaXhjbXAodXJsLCAiaHR0cHM6Ly8iKQorCSAgICAgICAgfHwgIXByZWZpeGNtcCh1cmwsICJmdHA6Ly8iKSkgeworI2lmZGVmIE5PX0NVUkwKKwkJZXJyb3IoImdpdCB3YXMgY29tcGlsZWQgd2l0aG91dCBsaWJjdXJsIHN1cHBvcnQuIik7CisjZWxzZQorCQlyZXQtPmdldF9yZWZzX2xpc3QgPSBnZXRfcmVmc192aWFfY3VybDsKKwkJcmV0LT5mZXRjaCA9IGZldGNoX29ianNfdmlhX2N1cmw7CisJCXJldC0+cHVzaCA9IGN1cmxfdHJhbnNwb3J0X3B1c2g7CisjZW5kaWYKKwkJcmV0LT5kaXNjb25uZWN0ID0gZGlzY29ubmVjdF93YWxrZXI7CisKKwl9IGVsc2UgaWYgKGlzX2xvY2FsKHVybCkgJiYgaXNfZmlsZSh1cmwpKSB7CisJCXN0cnVjdCBidW5kbGVfdHJhbnNwb3J0X2RhdGEgKmRhdGEgPSB4Y2FsbG9jKDEsIHNpemVvZigqZGF0YSkpOworCQlyZXQtPmRhdGEgPSBkYXRhOworCQlyZXQtPmdldF9yZWZzX2xpc3QgPSBnZXRfcmVmc19mcm9tX2J1bmRsZTsKKwkJcmV0LT5mZXRjaCA9IGZldGNoX3JlZnNfZnJvbV9idW5kbGU7CisJCXJldC0+ZGlzY29ubmVjdCA9IGNsb3NlX2J1bmRsZTsKKworCX0gZWxzZSB7CisJCXN0cnVjdCBnaXRfdHJhbnNwb3J0X2RhdGEgKmRhdGEgPSB4Y2FsbG9jKDEsIHNpemVvZigqZGF0YSkpOworCQlyZXQtPmRhdGEgPSBkYXRhOworCQlyZXQtPnNldF9vcHRpb24gPSBzZXRfZ2l0X29wdGlvbjsKKwkJcmV0LT5nZXRfcmVmc19saXN0ID0gZ2V0X3JlZnNfdmlhX2Nvbm5lY3Q7CisJCXJldC0+ZmV0Y2ggPSBmZXRjaF9yZWZzX3ZpYV9wYWNrOworCQlyZXQtPnB1c2ggPSBnaXRfdHJhbnNwb3J0X3B1c2g7CisJCXJldC0+ZGlzY29ubmVjdCA9IGRpc2Nvbm5lY3RfZ2l0OworCisJCWRhdGEtPnRoaW4gPSAxOworCQlkYXRhLT5jb25uID0gTlVMTDsKKwkJZGF0YS0+dXBsb2FkcGFjayA9ICJnaXQtdXBsb2FkLXBhY2siOworCQlpZiAocmVtb3RlICYmIHJlbW90ZS0+dXBsb2FkcGFjaykKKwkJCWRhdGEtPnVwbG9hZHBhY2sgPSByZW1vdGUtPnVwbG9hZHBhY2s7CisJCWRhdGEtPnJlY2VpdmVwYWNrID0gImdpdC1yZWNlaXZlLXBhY2siOworCQlpZiAocmVtb3RlICYmIHJlbW90ZS0+cmVjZWl2ZXBhY2spCisJCQlkYXRhLT5yZWNlaXZlcGFjayA9IHJlbW90ZS0+cmVjZWl2ZXBhY2s7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworaW50IHRyYW5zcG9ydF9zZXRfb3B0aW9uKHN0cnVjdCB0cmFuc3BvcnQgKnRyYW5zcG9ydCwKKwkJCSBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAodHJhbnNwb3J0LT5zZXRfb3B0aW9uKQorCQlyZXR1cm4gdHJhbnNwb3J0LT5zZXRfb3B0aW9uKHRyYW5zcG9ydCwgbmFtZSwgdmFsdWUpOworCXJldHVybiAxOworfQorCitpbnQgdHJhbnNwb3J0X3B1c2goc3RydWN0IHRyYW5zcG9ydCAqdHJhbnNwb3J0LAorCQkgICBpbnQgcmVmc3BlY19uciwgY29uc3QgY2hhciAqKnJlZnNwZWMsIGludCBmbGFncykKK3sKKwlpZiAoIXRyYW5zcG9ydC0+cHVzaCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIHRyYW5zcG9ydC0+cHVzaCh0cmFuc3BvcnQsIHJlZnNwZWNfbnIsIHJlZnNwZWMsIGZsYWdzKTsKK30KKworY29uc3Qgc3RydWN0IHJlZiAqdHJhbnNwb3J0X2dldF9yZW1vdGVfcmVmcyhzdHJ1Y3QgdHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisJaWYgKCF0cmFuc3BvcnQtPnJlbW90ZV9yZWZzKQorCQl0cmFuc3BvcnQtPnJlbW90ZV9yZWZzID0gdHJhbnNwb3J0LT5nZXRfcmVmc19saXN0KHRyYW5zcG9ydCk7CisJcmV0dXJuIHRyYW5zcG9ydC0+cmVtb3RlX3JlZnM7Cit9CisKK2ludCB0cmFuc3BvcnRfZmV0Y2hfcmVmcyhzdHJ1Y3QgdHJhbnNwb3J0ICp0cmFuc3BvcnQsIHN0cnVjdCByZWYgKnJlZnMpCit7CisJaW50IHJjOworCWludCBucl9oZWFkcyA9IDAsIG5yX2FsbG9jID0gMDsKKwlzdHJ1Y3QgcmVmICoqaGVhZHMgPSBOVUxMOworCXN0cnVjdCByZWYgKnJtOworCisJZm9yIChybSA9IHJlZnM7IHJtOyBybSA9IHJtLT5uZXh0KSB7CisJCWlmIChybS0+cGVlcl9yZWYgJiYKKwkJICAgICFoYXNoY21wKHJtLT5wZWVyX3JlZi0+b2xkX3NoYTEsIHJtLT5vbGRfc2hhMSkpCisJCQljb250aW51ZTsKKwkJQUxMT0NfR1JPVyhoZWFkcywgbnJfaGVhZHMgKyAxLCBucl9hbGxvYyk7CisJCWhlYWRzW25yX2hlYWRzKytdID0gcm07CisJfQorCisJcmMgPSB0cmFuc3BvcnQtPmZldGNoKHRyYW5zcG9ydCwgbnJfaGVhZHMsIGhlYWRzKTsKKwlmcmVlKGhlYWRzKTsKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgdHJhbnNwb3J0X3VubG9ja19wYWNrKHN0cnVjdCB0cmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKwlpZiAodHJhbnNwb3J0LT5wYWNrX2xvY2tmaWxlKSB7CisJCXVubGluayh0cmFuc3BvcnQtPnBhY2tfbG9ja2ZpbGUpOworCQlmcmVlKHRyYW5zcG9ydC0+cGFja19sb2NrZmlsZSk7CisJCXRyYW5zcG9ydC0+cGFja19sb2NrZmlsZSA9IE5VTEw7CisJfQorfQorCitpbnQgdHJhbnNwb3J0X2Rpc2Nvbm5lY3Qoc3RydWN0IHRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworCWludCByZXQgPSAwOworCWlmICh0cmFuc3BvcnQtPmRpc2Nvbm5lY3QpCisJCXJldCA9IHRyYW5zcG9ydC0+ZGlzY29ubmVjdCh0cmFuc3BvcnQpOworCWZyZWUodHJhbnNwb3J0KTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdHJhbnNwb3J0LmggYi90cmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWJmYzBhCi0tLSAvZGV2L251bGwKKysrIGIvdHJhbnNwb3J0LmgKQEAgLTAsMCArMSw3NSBAQAorI2lmbmRlZiBUUkFOU1BPUlRfSAorI2RlZmluZSBUUkFOU1BPUlRfSAorCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJyZW1vdGUuaCIKKworc3RydWN0IHRyYW5zcG9ydCB7CisJc3RydWN0IHJlbW90ZSAqcmVtb3RlOworCWNvbnN0IGNoYXIgKnVybDsKKwl2b2lkICpkYXRhOworCWNvbnN0IHN0cnVjdCByZWYgKnJlbW90ZV9yZWZzOworCisJLyoqCisJICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIHBvc2l0aXZlIGlmIHRoZSBvcHRpb24gaXMgbm90CisJICogcmVjb2duaXplZCBvciBpcyBpbmFwcGxpY2FibGUsIGFuZCBuZWdhdGl2ZSBpZiB0aGUgb3B0aW9uCisJICogaXMgYXBwbGljYWJsZSBidXQgdGhlIHZhbHVlIGlzIGludmFsaWQuCisJICoqLworCWludCAoKnNldF9vcHRpb24pKHN0cnVjdCB0cmFuc3BvcnQgKmNvbm5lY3Rpb24sIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgIGNvbnN0IGNoYXIgKnZhbHVlKTsKKworCXN0cnVjdCByZWYgKigqZ2V0X3JlZnNfbGlzdCkoc3RydWN0IHRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKwlpbnQgKCpmZXRjaCkoc3RydWN0IHRyYW5zcG9ydCAqdHJhbnNwb3J0LCBpbnQgcmVmc19uciwgc3RydWN0IHJlZiAqKnJlZnMpOworCWludCAoKnB1c2gpKHN0cnVjdCB0cmFuc3BvcnQgKmNvbm5lY3Rpb24sIGludCByZWZzcGVjX25yLCBjb25zdCBjaGFyICoqcmVmc3BlYywgaW50IGZsYWdzKTsKKworCWludCAoKmRpc2Nvbm5lY3QpKHN0cnVjdCB0cmFuc3BvcnQgKmNvbm5lY3Rpb24pOworCWNoYXIgKnBhY2tfbG9ja2ZpbGU7CisJc2lnbmVkIHZlcmJvc2UgOiAyOworfTsKKworI2RlZmluZSBUUkFOU1BPUlRfUFVTSF9BTEwgMQorI2RlZmluZSBUUkFOU1BPUlRfUFVTSF9GT1JDRSAyCisjZGVmaW5lIFRSQU5TUE9SVF9QVVNIX0RSWV9SVU4gNAorI2RlZmluZSBUUkFOU1BPUlRfUFVTSF9NSVJST1IgOAorI2RlZmluZSBUUkFOU1BPUlRfUFVTSF9WRVJCT1NFIDE2CisKKy8qIFJldHVybnMgYSB0cmFuc3BvcnQgc3VpdGFibGUgZm9yIHRoZSB1cmwgKi8KK3N0cnVjdCB0cmFuc3BvcnQgKnRyYW5zcG9ydF9nZXQoc3RydWN0IHJlbW90ZSAqLCBjb25zdCBjaGFyICopOworCisvKiBUcmFuc3BvcnQgb3B0aW9ucyB3aGljaCBhcHBseSB0byBnaXQ6Ly8gYW5kIHNjcC1zdHlsZSBVUkxzICovCisKKy8qIFRoZSBwcm9ncmFtIHRvIHVzZSBvbiB0aGUgcmVtb3RlIHNpZGUgdG8gc2VuZCBhIHBhY2sgKi8KKyNkZWZpbmUgVFJBTlNfT1BUX1VQTE9BRFBBQ0sgInVwbG9hZHBhY2siCisKKy8qIFRoZSBwcm9ncmFtIHRvIHVzZSBvbiB0aGUgcmVtb3RlIHNpZGUgdG8gcmVjZWl2ZSBhIHBhY2sgKi8KKyNkZWZpbmUgVFJBTlNfT1BUX1JFQ0VJVkVQQUNLICJyZWNlaXZlcGFjayIKKworLyogVHJhbnNmZXIgdGhlIGRhdGEgYXMgYSB0aGluIHBhY2sgaWYgbm90IG51bGwgKi8KKyNkZWZpbmUgVFJBTlNfT1BUX1RISU4gInRoaW4iCisKKy8qIEtlZXAgdGhlIHBhY2sgdGhhdCB3YXMgdHJhbnNmZXJyZWQgaWYgbm90IG51bGwgKi8KKyNkZWZpbmUgVFJBTlNfT1BUX0tFRVAgImtlZXAiCisKKy8qIExpbWl0IHRoZSBkZXB0aCBvZiB0aGUgZmV0Y2ggaWYgbm90IG51bGwgKi8KKyNkZWZpbmUgVFJBTlNfT1BUX0RFUFRIICJkZXB0aCIKKworLyogQWdncmVzc2l2ZWx5IGZldGNoIGFubm90YXRlZCB0YWdzIGlmIHBvc3NpYmxlICovCisjZGVmaW5lIFRSQU5TX09QVF9GT0xMT1dUQUdTICJmb2xsb3d0YWdzIgorCisvKioKKyAqIFJldHVybnMgMCBpZiB0aGUgb3B0aW9uIHdhcyB1c2VkLCBub24temVybyBvdGhlcndpc2UuIFByaW50cyBhCisgKiBtZXNzYWdlIHRvIHN0ZGVyciBpZiB0aGUgb3B0aW9uIGlzIG5vdCB1c2VkLgorICoqLworaW50IHRyYW5zcG9ydF9zZXRfb3B0aW9uKHN0cnVjdCB0cmFuc3BvcnQgKnRyYW5zcG9ydCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSBjb25zdCBjaGFyICp2YWx1ZSk7CisKK2ludCB0cmFuc3BvcnRfcHVzaChzdHJ1Y3QgdHJhbnNwb3J0ICpjb25uZWN0aW9uLAorCQkgICBpbnQgcmVmc3BlY19uciwgY29uc3QgY2hhciAqKnJlZnNwZWMsIGludCBmbGFncyk7CisKK2NvbnN0IHN0cnVjdCByZWYgKnRyYW5zcG9ydF9nZXRfcmVtb3RlX3JlZnMoc3RydWN0IHRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKworaW50IHRyYW5zcG9ydF9mZXRjaF9yZWZzKHN0cnVjdCB0cmFuc3BvcnQgKnRyYW5zcG9ydCwgc3RydWN0IHJlZiAqcmVmcyk7Cit2b2lkIHRyYW5zcG9ydF91bmxvY2tfcGFjayhzdHJ1Y3QgdHJhbnNwb3J0ICp0cmFuc3BvcnQpOworaW50IHRyYW5zcG9ydF9kaXNjb25uZWN0KHN0cnVjdCB0cmFuc3BvcnQgKnRyYW5zcG9ydCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdHJlZS1kaWZmLmMgYi90cmVlLWRpZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWUyZTZjCi0tLSAvZGV2L251bGwKKysrIGIvdHJlZS1kaWZmLmMKQEAgLTAsMCArMSw0NDUgQEAKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb25zIGZvciB0cmVlIGRpZmYgZ2VuZXJhdGlvbgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiZGlmZmNvcmUuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisKK3N0YXRpYyBjaGFyICptYWxsb2NfYmFzZShjb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbiwgY29uc3QgY2hhciAqcGF0aCwgaW50IHBhdGhsZW4pCit7CisJY2hhciAqbmV3YmFzZSA9IHhtYWxsb2MoYmFzZWxlbiArIHBhdGhsZW4gKyAyKTsKKwltZW1jcHkobmV3YmFzZSwgYmFzZSwgYmFzZWxlbik7CisJbWVtY3B5KG5ld2Jhc2UgKyBiYXNlbGVuLCBwYXRoLCBwYXRobGVuKTsKKwltZW1jcHkobmV3YmFzZSArIGJhc2VsZW4gKyBwYXRobGVuLCAiLyIsIDIpOworCXJldHVybiBuZXdiYXNlOworfQorCitzdGF0aWMgdm9pZCBzaG93X2VudHJ5KHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCwgY29uc3QgY2hhciAqcHJlZml4LCBzdHJ1Y3QgdHJlZV9kZXNjICpkZXNjLAorCQkgICAgICAgY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4pOworCitzdGF0aWMgaW50IGNvbXBhcmVfdHJlZV9lbnRyeShzdHJ1Y3QgdHJlZV9kZXNjICp0MSwgc3RydWN0IHRyZWVfZGVzYyAqdDIsIGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLCBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQpCit7CisJdW5zaWduZWQgbW9kZTEsIG1vZGUyOworCWNvbnN0IGNoYXIgKnBhdGgxLCAqcGF0aDI7CisJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgKnNoYTI7CisJaW50IGNtcCwgcGF0aGxlbjEsIHBhdGhsZW4yOworCisJc2hhMSA9IHRyZWVfZW50cnlfZXh0cmFjdCh0MSwgJnBhdGgxLCAmbW9kZTEpOworCXNoYTIgPSB0cmVlX2VudHJ5X2V4dHJhY3QodDIsICZwYXRoMiwgJm1vZGUyKTsKKworCXBhdGhsZW4xID0gdHJlZV9lbnRyeV9sZW4ocGF0aDEsIHNoYTEpOworCXBhdGhsZW4yID0gdHJlZV9lbnRyeV9sZW4ocGF0aDIsIHNoYTIpOworCWNtcCA9IGJhc2VfbmFtZV9jb21wYXJlKHBhdGgxLCBwYXRobGVuMSwgbW9kZTEsIHBhdGgyLCBwYXRobGVuMiwgbW9kZTIpOworCWlmIChjbXAgPCAwKSB7CisJCXNob3dfZW50cnkob3B0LCAiLSIsIHQxLCBiYXNlLCBiYXNlbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoY21wID4gMCkgeworCQlzaG93X2VudHJ5KG9wdCwgIisiLCB0MiwgYmFzZSwgYmFzZWxlbik7CisJCXJldHVybiAxOworCX0KKwlpZiAoIURJRkZfT1BUX1RTVChvcHQsIEZJTkRfQ09QSUVTX0hBUkRFUikgJiYgIWhhc2hjbXAoc2hhMSwgc2hhMikgJiYgbW9kZTEgPT0gbW9kZTIpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiB0aGUgZmlsZW1vZGUgaGFzIGNoYW5nZWQgdG8vZnJvbSBhIGRpcmVjdG9yeSBmcm9tL3RvIGEgcmVndWxhcgorCSAqIGZpbGUsIHdlIG5lZWQgdG8gY29uc2lkZXIgaXQgYSByZW1vdmUgYW5kIGFuIGFkZC4KKwkgKi8KKwlpZiAoU19JU0RJUihtb2RlMSkgIT0gU19JU0RJUihtb2RlMikpIHsKKwkJc2hvd19lbnRyeShvcHQsICItIiwgdDEsIGJhc2UsIGJhc2VsZW4pOworCQlzaG93X2VudHJ5KG9wdCwgIisiLCB0MiwgYmFzZSwgYmFzZWxlbik7CisJCXJldHVybiAwOworCX0KKworCWlmIChESUZGX09QVF9UU1Qob3B0LCBSRUNVUlNJVkUpICYmIFNfSVNESVIobW9kZTEpKSB7CisJCWludCByZXR2YWw7CisJCWNoYXIgKm5ld2Jhc2UgPSBtYWxsb2NfYmFzZShiYXNlLCBiYXNlbGVuLCBwYXRoMSwgcGF0aGxlbjEpOworCQlpZiAoRElGRl9PUFRfVFNUKG9wdCwgVFJFRV9JTl9SRUNVUlNJVkUpKQorCQkJb3B0LT5jaGFuZ2Uob3B0LCBtb2RlMSwgbW9kZTIsCisJCQkJICAgIHNoYTEsIHNoYTIsIGJhc2UsIHBhdGgxKTsKKwkJcmV0dmFsID0gZGlmZl90cmVlX3NoYTEoc2hhMSwgc2hhMiwgbmV3YmFzZSwgb3B0KTsKKwkJZnJlZShuZXdiYXNlKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlvcHQtPmNoYW5nZShvcHQsIG1vZGUxLCBtb2RlMiwgc2hhMSwgc2hhMiwgYmFzZSwgcGF0aDEpOworCXJldHVybiAwOworfQorCisvKgorICogSXMgYSB0cmVlIGVudHJ5IGludGVyZXN0aW5nIGdpdmVuIHRoZSBwYXRoc3BlYyB3ZSBoYXZlPworICoKKyAqIFJldHVybjoKKyAqICAtIDIgZm9yICJ5ZXMsIGFuZCBhbGwgc3Vic2VxdWVudCBlbnRyaWVzIHdpbGwgYmUiCisgKiAgLSAxIGZvciB5ZXMKKyAqICAtIHplcm8gZm9yIG5vCisgKiAgLSBuZWdhdGl2ZSBmb3IgIm5vLCBhbmQgbm8gc3Vic2VxdWVudCBlbnRyaWVzIHdpbGwgYmUgZWl0aGVyIgorICovCitzdGF0aWMgaW50IHRyZWVfZW50cnlfaW50ZXJlc3Rpbmcoc3RydWN0IHRyZWVfZGVzYyAqZGVzYywgY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4sIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCkKK3sKKwljb25zdCBjaGFyICpwYXRoOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTE7CisJdW5zaWduZWQgbW9kZTsKKwlpbnQgaTsKKwlpbnQgcGF0aGxlbjsKKwlpbnQgbmV2ZXJfaW50ZXJlc3RpbmcgPSAtMTsKKworCWlmICghb3B0LT5ucl9wYXRocykKKwkJcmV0dXJuIDE7CisKKwlzaGExID0gdHJlZV9lbnRyeV9leHRyYWN0KGRlc2MsICZwYXRoLCAmbW9kZSk7CisKKwlwYXRobGVuID0gdHJlZV9lbnRyeV9sZW4ocGF0aCwgc2hhMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgb3B0LT5ucl9wYXRoczsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKm1hdGNoID0gb3B0LT5wYXRoc1tpXTsKKwkJaW50IG1hdGNobGVuID0gb3B0LT5wYXRobGVuc1tpXTsKKwkJaW50IG0gPSAtMTsgLyogc2lnbmFscyB0aGF0IHdlIGhhdmVuJ3QgY2FsbGVkIHN0cm5jbXAoKSAqLworCisJCWlmIChiYXNlbGVuID49IG1hdGNobGVuKSB7CisJCQkvKiBJZiBpdCBkb2Vzbid0IG1hdGNoLCBtb3ZlIGFsb25nLi4uICovCisJCQlpZiAoc3RybmNtcChiYXNlLCBtYXRjaCwgbWF0Y2hsZW4pKQorCQkJCWNvbnRpbnVlOworCisJCQkvKgorCQkJICogVGhlIGJhc2UgaXMgYSBzdWJkaXJlY3Rvcnkgb2YgYSBwYXRoIHdoaWNoCisJCQkgKiB3YXMgc3BlY2lmaWVkLCBzbyBhbGwgb2YgdGhlbSBhcmUgaW50ZXJlc3RpbmcuCisJCQkgKi8KKwkJCXJldHVybiAyOworCQl9CisKKwkJLyogRG9lcyB0aGUgYmFzZSBtYXRjaD8gKi8KKwkJaWYgKHN0cm5jbXAoYmFzZSwgbWF0Y2gsIGJhc2VsZW4pKQorCQkJY29udGludWU7CisKKwkJbWF0Y2ggKz0gYmFzZWxlbjsKKwkJbWF0Y2hsZW4gLT0gYmFzZWxlbjsKKworCQlpZiAobmV2ZXJfaW50ZXJlc3RpbmcpIHsKKwkJCS8qCisJCQkgKiBXZSBoYXZlIG5vdCBzZWVuIGFueSBtYXRjaCB0aGF0IHNvcnRzIGxhdGVyCisJCQkgKiB0aGFuIHRoZSBjdXJyZW50IHBhdGguCisJCQkgKi8KKworCQkJLyoKKwkJCSAqIERvZXMgbWF0Y2ggc29ydCBzdHJpY3RseSBlYXJsaWVyIHRoYW4gcGF0aAorCQkJICogd2l0aCB0aGVpciBjb21tb24gcGFydHM/CisJCQkgKi8KKwkJCW0gPSBzdHJuY21wKG1hdGNoLCBwYXRoLAorCQkJCSAgICAobWF0Y2hsZW4gPCBwYXRobGVuKSA/IG1hdGNobGVuIDogcGF0aGxlbik7CisJCQlpZiAobSA8IDApCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBJZiB3ZSBjb21lIGhlcmUgZXZlbiBvbmNlLCB0aGF0IG1lYW5zIHRoZXJlIGlzIGF0CisJCQkgKiBsZWFzdCBvbmUgcGF0aHNwZWMgdGhhdCB3b3VsZCBzb3J0IGVxdWFsIHRvIG9yCisJCQkgKiBsYXRlciB0aGFuIHRoZSBwYXRoIHdlIGFyZSBjdXJyZW50bHkgbG9va2luZyBhdC4KKwkJCSAqIEluIG90aGVyIHdvcmRzLCBpZiB3ZSBoYXZlIG5ldmVyIHJlYWNoZWQgdGhpcyBwb2ludAorCQkJICogYWZ0ZXIgaXRlcmF0aW5nIGFsbCBwYXRoc3BlY3MsIGl0IG1lYW5zIGFsbAorCQkJICogcGF0aHNwZWNzIGFyZSBlaXRoZXIgb3V0c2lkZSBvZiBiYXNlLCBvciBpbnNpZGUgdGhlCisJCQkgKiBiYXNlIGJ1dCBzb3J0cyBzdHJpY3RseSBlYXJsaWVyIHRoYW4gdGhlIGN1cnJlbnQKKwkJCSAqIG9uZS4gIEluIGVpdGhlciBjYXNlLCB0aGV5IHdpbGwgbmV2ZXIgbWF0Y2ggdGhlCisJCQkgKiBzdWJzZXF1ZW50IGVudHJpZXMuICBJbiBzdWNoIGEgY2FzZSwgd2UgaW5pdGlhbGl6ZWQKKwkJCSAqIHRoZSB2YXJpYWJsZSB0byAtMSBhbmQgdGhhdCBpcyB3aGF0IHdpbGwgYmUKKwkJCSAqIHJldHVybmVkLCBhbGxvd2luZyB0aGUgY2FsbGVyIHRvIHRlcm1pbmF0ZSBlYXJseS4KKwkJCSAqLworCQkJbmV2ZXJfaW50ZXJlc3RpbmcgPSAwOworCQl9CisKKwkJaWYgKHBhdGhsZW4gPiBtYXRjaGxlbikKKwkJCWNvbnRpbnVlOworCisJCWlmIChtYXRjaGxlbiA+IHBhdGhsZW4pIHsKKwkJCWlmIChtYXRjaFtwYXRobGVuXSAhPSAnLycpCisJCQkJY29udGludWU7CisJCQlpZiAoIVNfSVNESVIobW9kZSkpCisJCQkJY29udGludWU7CisJCX0KKworCQlpZiAobSA9PSAtMSkKKwkJCS8qCisJCQkgKiB3ZSBjaGVhdGVkIGFuZCBkaWQgbm90IGRvIHN0cm5jbXAoKSwgc28gd2UgZG8KKwkJCSAqIHRoYXQgaGVyZS4KKwkJCSAqLworCQkJbSA9IHN0cm5jbXAobWF0Y2gsIHBhdGgsIHBhdGhsZW4pOworCisJCS8qCisJCSAqIElmIGNvbW1vbiBwYXJ0IG1hdGNoZWQgZWFybGllciB0aGVuIGl0IGlzIGEgaGl0LAorCQkgKiBiZWNhdXNlIHdlIHJlamVjdGVkIHRoZSBjYXNlIHdoZXJlIHBhdGggaXMgbm90IGEKKwkJICogbGVhZGluZyBkaXJlY3RvcnkgYW5kIGlzIHNob3J0ZXIgdGhhbiBtYXRjaC4KKwkJICovCisJCWlmICghbSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gbmV2ZXJfaW50ZXJlc3Rpbmc7IC8qIE5vIG1hdGNoZXMgKi8KK30KKworLyogQSB3aG9sZSBzdWItdHJlZSB3ZW50IGF3YXkgb3IgYXBwZWFyZWQgKi8KK3N0YXRpYyB2b2lkIHNob3dfdHJlZShzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQsIGNvbnN0IGNoYXIgKnByZWZpeCwgc3RydWN0IHRyZWVfZGVzYyAqZGVzYywgY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4pCit7CisJaW50IGFsbF9pbnRlcmVzdGluZyA9IDA7CisJd2hpbGUgKGRlc2MtPnNpemUpIHsKKwkJaW50IHNob3c7CisKKwkJaWYgKGFsbF9pbnRlcmVzdGluZykKKwkJCXNob3cgPSAxOworCQllbHNlIHsKKwkJCXNob3cgPSB0cmVlX2VudHJ5X2ludGVyZXN0aW5nKGRlc2MsIGJhc2UsIGJhc2VsZW4sCisJCQkJCQkgICAgICBvcHQpOworCQkJaWYgKHNob3cgPT0gMikKKwkJCQlhbGxfaW50ZXJlc3RpbmcgPSAxOworCQl9CisJCWlmIChzaG93IDwgMCkKKwkJCWJyZWFrOworCQlpZiAoc2hvdykKKwkJCXNob3dfZW50cnkob3B0LCBwcmVmaXgsIGRlc2MsIGJhc2UsIGJhc2VsZW4pOworCQl1cGRhdGVfdHJlZV9lbnRyeShkZXNjKTsKKwl9Cit9CisKKy8qIEEgZmlsZSBlbnRyeSB3ZW50IGF3YXkgb3IgYXBwZWFyZWQgKi8KK3N0YXRpYyB2b2lkIHNob3dfZW50cnkoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0LCBjb25zdCBjaGFyICpwcmVmaXgsIHN0cnVjdCB0cmVlX2Rlc2MgKmRlc2MsCisJCSAgICAgICBjb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbikKK3sKKwl1bnNpZ25lZCBtb2RlOworCWNvbnN0IGNoYXIgKnBhdGg7CisJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSA9IHRyZWVfZW50cnlfZXh0cmFjdChkZXNjLCAmcGF0aCwgJm1vZGUpOworCisJaWYgKERJRkZfT1BUX1RTVChvcHQsIFJFQ1VSU0lWRSkgJiYgU19JU0RJUihtb2RlKSkgeworCQllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJCWludCBwYXRobGVuID0gdHJlZV9lbnRyeV9sZW4ocGF0aCwgc2hhMSk7CisJCWNoYXIgKm5ld2Jhc2UgPSBtYWxsb2NfYmFzZShiYXNlLCBiYXNlbGVuLCBwYXRoLCBwYXRobGVuKTsKKwkJc3RydWN0IHRyZWVfZGVzYyBpbm5lcjsKKwkJdm9pZCAqdHJlZTsKKwkJdW5zaWduZWQgbG9uZyBzaXplOworCisJCXRyZWUgPSByZWFkX3NoYTFfZmlsZShzaGExLCAmdHlwZSwgJnNpemUpOworCQlpZiAoIXRyZWUgfHwgdHlwZSAhPSBPQkpfVFJFRSkKKwkJCWRpZSgiY29ycnVwdCB0cmVlIHNoYSAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKworCQlpbml0X3RyZWVfZGVzYygmaW5uZXIsIHRyZWUsIHNpemUpOworCQlzaG93X3RyZWUob3B0LCBwcmVmaXgsICZpbm5lciwgbmV3YmFzZSwgYmFzZWxlbiArIDEgKyBwYXRobGVuKTsKKworCQlmcmVlKHRyZWUpOworCQlmcmVlKG5ld2Jhc2UpOworCX0gZWxzZSB7CisJCW9wdC0+YWRkX3JlbW92ZShvcHQsIHByZWZpeFswXSwgbW9kZSwgc2hhMSwgYmFzZSwgcGF0aCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBza2lwX3VuaW50ZXJlc3Rpbmcoc3RydWN0IHRyZWVfZGVzYyAqdCwgY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4sIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCkKK3sKKwlpbnQgYWxsX2ludGVyZXN0aW5nID0gMDsKKwl3aGlsZSAodC0+c2l6ZSkgeworCQlpbnQgc2hvdzsKKworCQlpZiAoYWxsX2ludGVyZXN0aW5nKQorCQkJc2hvdyA9IDE7CisJCWVsc2UgeworCQkJc2hvdyA9IHRyZWVfZW50cnlfaW50ZXJlc3RpbmcodCwgYmFzZSwgYmFzZWxlbiwgb3B0KTsKKwkJCWlmIChzaG93ID09IDIpCisJCQkJYWxsX2ludGVyZXN0aW5nID0gMTsKKwkJfQorCQlpZiAoIXNob3cpIHsKKwkJCXVwZGF0ZV90cmVlX2VudHJ5KHQpOworCQkJY29udGludWU7CisJCX0KKwkJLyogU2tpcCBpdCBhbGw/ICovCisJCWlmIChzaG93IDwgMCkKKwkJCXQtPnNpemUgPSAwOworCQlyZXR1cm47CisJfQorfQorCitpbnQgZGlmZl90cmVlKHN0cnVjdCB0cmVlX2Rlc2MgKnQxLCBzdHJ1Y3QgdHJlZV9kZXNjICp0MiwgY29uc3QgY2hhciAqYmFzZSwgc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0KQoreworCWludCBiYXNlbGVuID0gc3RybGVuKGJhc2UpOworCisJZm9yICg7OykgeworCQlpZiAoRElGRl9PUFRfVFNUKG9wdCwgUVVJRVQpICYmIERJRkZfT1BUX1RTVChvcHQsIEhBU19DSEFOR0VTKSkKKwkJCWJyZWFrOworCQlpZiAob3B0LT5ucl9wYXRocykgeworCQkJc2tpcF91bmludGVyZXN0aW5nKHQxLCBiYXNlLCBiYXNlbGVuLCBvcHQpOworCQkJc2tpcF91bmludGVyZXN0aW5nKHQyLCBiYXNlLCBiYXNlbGVuLCBvcHQpOworCQl9CisJCWlmICghdDEtPnNpemUpIHsKKwkJCWlmICghdDItPnNpemUpCisJCQkJYnJlYWs7CisJCQlzaG93X2VudHJ5KG9wdCwgIisiLCB0MiwgYmFzZSwgYmFzZWxlbik7CisJCQl1cGRhdGVfdHJlZV9lbnRyeSh0Mik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXQyLT5zaXplKSB7CisJCQlzaG93X2VudHJ5KG9wdCwgIi0iLCB0MSwgYmFzZSwgYmFzZWxlbik7CisJCQl1cGRhdGVfdHJlZV9lbnRyeSh0MSk7CisJCQljb250aW51ZTsKKwkJfQorCQlzd2l0Y2ggKGNvbXBhcmVfdHJlZV9lbnRyeSh0MSwgdDIsIGJhc2UsIGJhc2VsZW4sIG9wdCkpIHsKKwkJY2FzZSAtMToKKwkJCXVwZGF0ZV90cmVlX2VudHJ5KHQxKTsKKwkJCWNvbnRpbnVlOworCQljYXNlIDA6CisJCQl1cGRhdGVfdHJlZV9lbnRyeSh0MSk7CisJCQkvKiBGYWxsdGhyb3VnaCAqLworCQljYXNlIDE6CisJCQl1cGRhdGVfdHJlZV9lbnRyeSh0Mik7CisJCQljb250aW51ZTsKKwkJfQorCQlkaWUoImdpdC1kaWZmLXRyZWU6IGludGVybmFsIGVycm9yIik7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogRG9lcyBpdCBsb29rIGxpa2UgdGhlIHJlc3VsdGluZyBkaWZmIG1pZ2h0IGJlIGR1ZSB0byBhIHJlbmFtZT8KKyAqICAtIHNpbmdsZSBlbnRyeQorICogIC0gbm90IGEgdmFsaWQgcHJldmlvdXMgZmlsZQorICovCitzdGF0aWMgaW5saW5lIGludCBkaWZmX21pZ2h0X2JlX3JlbmFtZSh2b2lkKQoreworCXJldHVybiBkaWZmX3F1ZXVlZF9kaWZmLm5yID09IDEgJiYKKwkJIURJRkZfRklMRV9WQUxJRChkaWZmX3F1ZXVlZF9kaWZmLnF1ZXVlWzBdLT5vbmUpOworfQorCitzdGF0aWMgdm9pZCB0cnlfdG9fZm9sbG93X3JlbmFtZXMoc3RydWN0IHRyZWVfZGVzYyAqdDEsIHN0cnVjdCB0cmVlX2Rlc2MgKnQyLCBjb25zdCBjaGFyICpiYXNlLCBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQpCit7CisJc3RydWN0IGRpZmZfb3B0aW9ucyBkaWZmX29wdHM7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxID0gJmRpZmZfcXVldWVkX2RpZmY7CisJc3RydWN0IGRpZmZfZmlsZXBhaXIgKmNob2ljZTsKKwljb25zdCBjaGFyICpwYXRoc1sxXTsKKwlpbnQgaTsKKworCS8qIFJlbW92ZSB0aGUgZmlsZSBjcmVhdGlvbiBlbnRyeSBmcm9tIHRoZSBkaWZmIHF1ZXVlLCBhbmQgcmVtZW1iZXIgaXQgKi8KKwljaG9pY2UgPSBxLT5xdWV1ZVswXTsKKwlxLT5uciA9IDA7CisKKwlkaWZmX3NldHVwKCZkaWZmX29wdHMpOworCURJRkZfT1BUX1NFVCgmZGlmZl9vcHRzLCBSRUNVUlNJVkUpOworCWRpZmZfb3B0cy5kZXRlY3RfcmVuYW1lID0gRElGRl9ERVRFQ1RfUkVOQU1FOworCWRpZmZfb3B0cy5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfTk9fT1VUUFVUOworCWRpZmZfb3B0cy5zaW5nbGVfZm9sbG93ID0gb3B0LT5wYXRoc1swXTsKKwlkaWZmX29wdHMuYnJlYWtfb3B0ID0gb3B0LT5icmVha19vcHQ7CisJcGF0aHNbMF0gPSBOVUxMOworCWRpZmZfdHJlZV9zZXR1cF9wYXRocyhwYXRocywgJmRpZmZfb3B0cyk7CisJaWYgKGRpZmZfc2V0dXBfZG9uZSgmZGlmZl9vcHRzKSA8IDApCisJCWRpZSgidW5hYmxlIHRvIHNldCB1cCBkaWZmIG9wdGlvbnMgdG8gZm9sbG93IHJlbmFtZXMiKTsKKwlkaWZmX3RyZWUodDEsIHQyLCBiYXNlLCAmZGlmZl9vcHRzKTsKKwlkaWZmY29yZV9zdGQoJmRpZmZfb3B0cyk7CisJZGlmZl90cmVlX3JlbGVhc2VfcGF0aHMoJmRpZmZfb3B0cyk7CisKKwkvKiBHbyB0aHJvdWdoIHRoZSBuZXcgc2V0IG9mIGZpbGVwYWlyaW5nLCBhbmQgc2VlIGlmIHdlIGZpbmQgYSBtb3JlIGludGVyZXN0aW5nIG9uZSAqLworCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKSB7CisJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gcS0+cXVldWVbaV07CisKKwkJLyoKKwkJICogRm91bmQgYSBzb3VyY2U/IE5vdCBvbmx5IGRvIHdlIHVzZSB0aGF0IGZvciB0aGUgbmV3CisJCSAqIGRpZmZfcXVldWVkX2RpZmYsIHdlIHdpbGwgYWxzbyB1c2UgdGhhdCBhcyB0aGUgcGF0aCBpbgorCQkgKiB0aGUgZnV0dXJlIQorCQkgKi8KKwkJaWYgKChwLT5zdGF0dXMgPT0gJ1InIHx8IHAtPnN0YXR1cyA9PSAnQycpICYmICFzdHJjbXAocC0+dHdvLT5wYXRoLCBvcHQtPnBhdGhzWzBdKSkgeworCQkJLyogU3dpdGNoIHRoZSBmaWxlLXBhaXJzIGFyb3VuZCAqLworCQkJcS0+cXVldWVbaV0gPSBjaG9pY2U7CisJCQljaG9pY2UgPSBwOworCisJCQkvKiBVcGRhdGUgdGhlIHBhdGggd2UgdXNlIGZyb20gbm93IG9uLi4gKi8KKwkJCWRpZmZfdHJlZV9yZWxlYXNlX3BhdGhzKG9wdCk7CisJCQlvcHQtPnBhdGhzWzBdID0geHN0cmR1cChwLT5vbmUtPnBhdGgpOworCQkJZGlmZl90cmVlX3NldHVwX3BhdGhzKG9wdC0+cGF0aHMsIG9wdCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogVGhlbiwgZGlzY2FyZCBhbGwgdGhlIG5vbi1yZWxldmFuZSBmaWxlIHBhaXJzLi4uCisJICovCisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJZGlmZl9mcmVlX2ZpbGVwYWlyKHApOworCX0KKworCS8qCisJICogLi4gYW5kIHJlLWluc3RhdGUgdGhlIG9uZSB3ZSB3YW50ICh3aGljaCBtaWdodCBiZSBlaXRoZXIgdGhlCisJICogb3JpZ2luYWwgb25lLCBvciB0aGUgcmVuYW1lL2NvcHkgd2UgZm91bmQpCisJICovCisJcS0+cXVldWVbMF0gPSBjaG9pY2U7CisJcS0+bnIgPSAxOworfQorCitpbnQgZGlmZl90cmVlX3NoYTEoY29uc3QgdW5zaWduZWQgY2hhciAqb2xkLCBjb25zdCB1bnNpZ25lZCBjaGFyICpuZXcsIGNvbnN0IGNoYXIgKmJhc2UsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCkKK3sKKwl2b2lkICp0cmVlMSwgKnRyZWUyOworCXN0cnVjdCB0cmVlX2Rlc2MgdDEsIHQyOworCXVuc2lnbmVkIGxvbmcgc2l6ZTEsIHNpemUyOworCWludCByZXR2YWw7CisKKwl0cmVlMSA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKG9sZCwgdHJlZV90eXBlLCAmc2l6ZTEsIE5VTEwpOworCWlmICghdHJlZTEpCisJCWRpZSgidW5hYmxlIHRvIHJlYWQgc291cmNlIHRyZWUgKCVzKSIsIHNoYTFfdG9faGV4KG9sZCkpOworCXRyZWUyID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2UobmV3LCB0cmVlX3R5cGUsICZzaXplMiwgTlVMTCk7CisJaWYgKCF0cmVlMikKKwkJZGllKCJ1bmFibGUgdG8gcmVhZCBkZXN0aW5hdGlvbiB0cmVlICglcykiLCBzaGExX3RvX2hleChuZXcpKTsKKwlpbml0X3RyZWVfZGVzYygmdDEsIHRyZWUxLCBzaXplMSk7CisJaW5pdF90cmVlX2Rlc2MoJnQyLCB0cmVlMiwgc2l6ZTIpOworCXJldHZhbCA9IGRpZmZfdHJlZSgmdDEsICZ0MiwgYmFzZSwgb3B0KTsKKwlpZiAoRElGRl9PUFRfVFNUKG9wdCwgRk9MTE9XX1JFTkFNRVMpICYmIGRpZmZfbWlnaHRfYmVfcmVuYW1lKCkpIHsKKwkJaW5pdF90cmVlX2Rlc2MoJnQxLCB0cmVlMSwgc2l6ZTEpOworCQlpbml0X3RyZWVfZGVzYygmdDIsIHRyZWUyLCBzaXplMik7CisJCXRyeV90b19mb2xsb3dfcmVuYW1lcygmdDEsICZ0MiwgYmFzZSwgb3B0KTsKKwl9CisJZnJlZSh0cmVlMSk7CisJZnJlZSh0cmVlMik7CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IGRpZmZfcm9vdF90cmVlX3NoYTEoY29uc3QgdW5zaWduZWQgY2hhciAqbmV3LCBjb25zdCBjaGFyICpiYXNlLCBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQpCit7CisJaW50IHJldHZhbDsKKwl2b2lkICp0cmVlOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlzdHJ1Y3QgdHJlZV9kZXNjIGVtcHR5LCByZWFsOworCisJdHJlZSA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKG5ldywgdHJlZV90eXBlLCAmc2l6ZSwgTlVMTCk7CisJaWYgKCF0cmVlKQorCQlkaWUoInVuYWJsZSB0byByZWFkIHJvb3QgdHJlZSAoJXMpIiwgc2hhMV90b19oZXgobmV3KSk7CisJaW5pdF90cmVlX2Rlc2MoJnJlYWwsIHRyZWUsIHNpemUpOworCisJaW5pdF90cmVlX2Rlc2MoJmVtcHR5LCAiIiwgMCk7CisJcmV0dmFsID0gZGlmZl90cmVlKCZlbXB0eSwgJnJlYWwsIGJhc2UsIG9wdCk7CisJZnJlZSh0cmVlKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGNvdW50X3BhdGhzKGNvbnN0IGNoYXIgKipwYXRocykKK3sKKwlpbnQgaSA9IDA7CisJd2hpbGUgKCpwYXRocysrKQorCQlpKys7CisJcmV0dXJuIGk7Cit9CisKK3ZvaWQgZGlmZl90cmVlX3JlbGVhc2VfcGF0aHMoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0KQoreworCWZyZWUob3B0LT5wYXRobGVucyk7Cit9CisKK3ZvaWQgZGlmZl90cmVlX3NldHVwX3BhdGhzKGNvbnN0IGNoYXIgKipwLCBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQpCit7CisJb3B0LT5ucl9wYXRocyA9IDA7CisJb3B0LT5wYXRobGVucyA9IE5VTEw7CisJb3B0LT5wYXRocyA9IE5VTEw7CisKKwlpZiAocCkgeworCQlpbnQgaTsKKworCQlvcHQtPnBhdGhzID0gcDsKKwkJb3B0LT5ucl9wYXRocyA9IGNvdW50X3BhdGhzKHApOworCQlpZiAob3B0LT5ucl9wYXRocyA9PSAwKSB7CisJCQlvcHQtPnBhdGhsZW5zID0gTlVMTDsKKwkJCXJldHVybjsKKwkJfQorCQlvcHQtPnBhdGhsZW5zID0geG1hbGxvYyhvcHQtPm5yX3BhdGhzICogc2l6ZW9mKGludCkpOworCQlmb3IgKGk9MDsgaSA8IG9wdC0+bnJfcGF0aHM7IGkrKykKKwkJCW9wdC0+cGF0aGxlbnNbaV0gPSBzdHJsZW4ocFtpXSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdHJlZS13YWxrLmMgYi90cmVlLXdhbGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmUyYWVkCi0tLSAvZGV2L251bGwKKysrIGIvdHJlZS13YWxrLmMKQEAgLTAsMCArMSwyNjAgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorI2luY2x1ZGUgInRyZWUuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKmdldF9tb2RlKGNvbnN0IGNoYXIgKnN0ciwgdW5zaWduZWQgaW50ICptb2RlcCkKK3sKKwl1bnNpZ25lZCBjaGFyIGM7CisJdW5zaWduZWQgaW50IG1vZGUgPSAwOworCisJaWYgKCpzdHIgPT0gJyAnKQorCQlyZXR1cm4gTlVMTDsKKworCXdoaWxlICgoYyA9ICpzdHIrKykgIT0gJyAnKSB7CisJCWlmIChjIDwgJzAnIHx8IGMgPiAnNycpCisJCQlyZXR1cm4gTlVMTDsKKwkJbW9kZSA9IChtb2RlIDw8IDMpICsgKGMgLSAnMCcpOworCX0KKwkqbW9kZXAgPSBtb2RlOworCXJldHVybiBzdHI7Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV90cmVlX2VudHJ5KHN0cnVjdCB0cmVlX2Rlc2MgKmRlc2MsIGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWNvbnN0IGNoYXIgKnBhdGg7CisJdW5zaWduZWQgaW50IG1vZGUsIGxlbjsKKworCWlmIChzaXplIDwgMjQgfHwgYnVmW3NpemUgLSAyMV0pCisJCWRpZSgiY29ycnVwdCB0cmVlIGZpbGUiKTsKKworCXBhdGggPSBnZXRfbW9kZShidWYsICZtb2RlKTsKKwlpZiAoIXBhdGggfHwgISpwYXRoKQorCQlkaWUoImNvcnJ1cHQgdHJlZSBmaWxlIik7CisJbGVuID0gc3RybGVuKHBhdGgpICsgMTsKKworCS8qIEluaXRpYWxpemUgdGhlIGRlc2NyaXB0b3IgZW50cnkgKi8KKwlkZXNjLT5lbnRyeS5wYXRoID0gcGF0aDsKKwlkZXNjLT5lbnRyeS5tb2RlID0gbW9kZTsKKwlkZXNjLT5lbnRyeS5zaGExID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikocGF0aCArIGxlbik7Cit9CisKK3ZvaWQgaW5pdF90cmVlX2Rlc2Moc3RydWN0IHRyZWVfZGVzYyAqZGVzYywgY29uc3Qgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJZGVzYy0+YnVmZmVyID0gYnVmZmVyOworCWRlc2MtPnNpemUgPSBzaXplOworCWlmIChzaXplKQorCQlkZWNvZGVfdHJlZV9lbnRyeShkZXNjLCBidWZmZXIsIHNpemUpOworfQorCit2b2lkICpmaWxsX3RyZWVfZGVzY3JpcHRvcihzdHJ1Y3QgdHJlZV9kZXNjICpkZXNjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IDA7CisJdm9pZCAqYnVmID0gTlVMTDsKKworCWlmIChzaGExKSB7CisJCWJ1ZiA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKHNoYTEsIHRyZWVfdHlwZSwgJnNpemUsIE5VTEwpOworCQlpZiAoIWJ1ZikKKwkJCWRpZSgidW5hYmxlIHRvIHJlYWQgdHJlZSAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwl9CisJaW5pdF90cmVlX2Rlc2MoZGVzYywgYnVmLCBzaXplKTsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgaW50IGVudHJ5X2NvbXBhcmUoc3RydWN0IG5hbWVfZW50cnkgKmEsIHN0cnVjdCBuYW1lX2VudHJ5ICpiKQoreworCXJldHVybiBkZl9uYW1lX2NvbXBhcmUoCisJCQlhLT5wYXRoLCB0cmVlX2VudHJ5X2xlbihhLT5wYXRoLCBhLT5zaGExKSwgYS0+bW9kZSwKKwkJCWItPnBhdGgsIHRyZWVfZW50cnlfbGVuKGItPnBhdGgsIGItPnNoYTEpLCBiLT5tb2RlKTsKK30KKworc3RhdGljIHZvaWQgZW50cnlfY2xlYXIoc3RydWN0IG5hbWVfZW50cnkgKmEpCit7CisJbWVtc2V0KGEsIDAsIHNpemVvZigqYSkpOworfQorCitzdGF0aWMgdm9pZCBlbnRyeV9leHRyYWN0KHN0cnVjdCB0cmVlX2Rlc2MgKnQsIHN0cnVjdCBuYW1lX2VudHJ5ICphKQoreworCSphID0gdC0+ZW50cnk7Cit9CisKK3ZvaWQgdXBkYXRlX3RyZWVfZW50cnkoc3RydWN0IHRyZWVfZGVzYyAqZGVzYykKK3sKKwljb25zdCB2b2lkICpidWYgPSBkZXNjLT5idWZmZXI7CisJY29uc3QgdW5zaWduZWQgY2hhciAqZW5kID0gZGVzYy0+ZW50cnkuc2hhMSArIDIwOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IGRlc2MtPnNpemU7CisJdW5zaWduZWQgbG9uZyBsZW4gPSBlbmQgLSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWJ1ZjsKKworCWlmIChzaXplIDwgbGVuKQorCQlkaWUoImNvcnJ1cHQgdHJlZSBmaWxlIik7CisJYnVmID0gZW5kOworCXNpemUgLT0gbGVuOworCWRlc2MtPmJ1ZmZlciA9IGJ1ZjsKKwlkZXNjLT5zaXplID0gc2l6ZTsKKwlpZiAoc2l6ZSkKKwkJZGVjb2RlX3RyZWVfZW50cnkoZGVzYywgYnVmLCBzaXplKTsKK30KKworaW50IHRyZWVfZW50cnkoc3RydWN0IHRyZWVfZGVzYyAqZGVzYywgc3RydWN0IG5hbWVfZW50cnkgKmVudHJ5KQoreworCWlmICghZGVzYy0+c2l6ZSkKKwkJcmV0dXJuIDA7CisKKwkqZW50cnkgPSBkZXNjLT5lbnRyeTsKKwl1cGRhdGVfdHJlZV9lbnRyeShkZXNjKTsKKwlyZXR1cm4gMTsKK30KKwordm9pZCBzZXR1cF90cmF2ZXJzZV9pbmZvKHN0cnVjdCB0cmF2ZXJzZV9pbmZvICppbmZvLCBjb25zdCBjaGFyICpiYXNlKQoreworCWludCBwYXRobGVuID0gc3RybGVuKGJhc2UpOworCXN0YXRpYyBzdHJ1Y3QgdHJhdmVyc2VfaW5mbyBkdW1teTsKKworCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKwlpZiAocGF0aGxlbiAmJiBiYXNlW3BhdGhsZW4tMV0gPT0gJy8nKQorCQlwYXRobGVuLS07CisJaW5mby0+cGF0aGxlbiA9IHBhdGhsZW4gPyBwYXRobGVuICsgMSA6IDA7CisJaW5mby0+bmFtZS5wYXRoID0gYmFzZTsKKwlpbmZvLT5uYW1lLnNoYTEgPSAodm9pZCAqKShiYXNlICsgcGF0aGxlbiArIDEpOworCWlmIChwYXRobGVuKQorCQlpbmZvLT5wcmV2ID0gJmR1bW15OworfQorCitjaGFyICptYWtlX3RyYXZlcnNlX3BhdGgoY2hhciAqcGF0aCwgY29uc3Qgc3RydWN0IHRyYXZlcnNlX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBuYW1lX2VudHJ5ICpuKQoreworCWludCBsZW4gPSB0cmVlX2VudHJ5X2xlbihuLT5wYXRoLCBuLT5zaGExKTsKKwlpbnQgcGF0aGxlbiA9IGluZm8tPnBhdGhsZW47CisKKwlwYXRoW3BhdGhsZW4gKyBsZW5dID0gMDsKKwlmb3IgKDs7KSB7CisJCW1lbWNweShwYXRoICsgcGF0aGxlbiwgbi0+cGF0aCwgbGVuKTsKKwkJaWYgKCFwYXRobGVuKQorCQkJYnJlYWs7CisJCXBhdGhbLS1wYXRobGVuXSA9ICcvJzsKKwkJbiA9ICZpbmZvLT5uYW1lOworCQlsZW4gPSB0cmVlX2VudHJ5X2xlbihuLT5wYXRoLCBuLT5zaGExKTsKKwkJaW5mbyA9IGluZm8tPnByZXY7CisJCXBhdGhsZW4gLT0gbGVuOworCX0KKwlyZXR1cm4gcGF0aDsKK30KKworaW50IHRyYXZlcnNlX3RyZWVzKGludCBuLCBzdHJ1Y3QgdHJlZV9kZXNjICp0LCBzdHJ1Y3QgdHJhdmVyc2VfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgbmFtZV9lbnRyeSAqZW50cnkgPSB4bWFsbG9jKG4qc2l6ZW9mKCplbnRyeSkpOworCisJZm9yICg7OykgeworCQl1bnNpZ25lZCBsb25nIG1hc2sgPSAwOworCQl1bnNpZ25lZCBsb25nIGRpcm1hc2sgPSAwOworCQlpbnQgaSwgbGFzdDsKKworCQlsYXN0ID0gLTE7CisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCWlmICghdFtpXS5zaXplKQorCQkJCWNvbnRpbnVlOworCQkJZW50cnlfZXh0cmFjdCh0K2ksIGVudHJ5K2kpOworCQkJaWYgKGxhc3QgPj0gMCkgeworCQkJCWludCBjbXAgPSBlbnRyeV9jb21wYXJlKGVudHJ5K2ksIGVudHJ5K2xhc3QpOworCisJCQkJLyoKKwkJCQkgKiBJcyB0aGUgbmV3IG5hbWUgYmlnZ2VyIHRoYW4gdGhlIG9sZCBvbmU/CisJCQkJICogSWdub3JlIGl0CisJCQkJICovCisJCQkJaWYgKGNtcCA+IDApCisJCQkJCWNvbnRpbnVlOworCQkJCS8qCisJCQkJICogSXMgdGhlIG5ldyBuYW1lIHNtYWxsZXIgdGhhbiB0aGUgb2xkIG9uZT8KKwkJCQkgKiBJZ25vcmUgYWxsIG9sZCBvbmVzCisJCQkJICovCisJCQkJaWYgKGNtcCA8IDApCisJCQkJCW1hc2sgPSAwOworCQkJfQorCQkJbWFzayB8PSAxdWwgPDwgaTsKKwkJCWlmIChTX0lTRElSKGVudHJ5W2ldLm1vZGUpKQorCQkJCWRpcm1hc2sgfD0gMXVsIDw8IGk7CisJCQlsYXN0ID0gaTsKKwkJfQorCQlpZiAoIW1hc2spCisJCQlicmVhazsKKwkJZGlybWFzayAmPSBtYXNrOworCisJCS8qCisJCSAqIENsZWFyIGFsbCB0aGUgdW51c2VkIG5hbWUtZW50cmllcy4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCWlmIChtYXNrICYgKDF1bCA8PCBpKSkKKwkJCQljb250aW51ZTsKKwkJCWVudHJ5X2NsZWFyKGVudHJ5ICsgaSk7CisJCX0KKwkJcmV0ID0gaW5mby0+Zm4obiwgbWFzaywgZGlybWFzaywgZW50cnksIGluZm8pOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCQlpZiAocmV0KQorCQkJbWFzayAmPSByZXQ7CisJCXJldCA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCWlmIChtYXNrICYgKDF1bCA8PCBpKSkKKwkJCQl1cGRhdGVfdHJlZV9lbnRyeSh0ICsgaSk7CisJCX0KKwl9CisJZnJlZShlbnRyeSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmaW5kX3RyZWVfZW50cnkoc3RydWN0IHRyZWVfZGVzYyAqdCwgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgY2hhciAqcmVzdWx0LCB1bnNpZ25lZCAqbW9kZSkKK3sKKwlpbnQgbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKwl3aGlsZSAodC0+c2l6ZSkgeworCQljb25zdCBjaGFyICplbnRyeTsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMTsKKwkJaW50IGVudHJ5bGVuLCBjbXA7CisKKwkJc2hhMSA9IHRyZWVfZW50cnlfZXh0cmFjdCh0LCAmZW50cnksIG1vZGUpOworCQl1cGRhdGVfdHJlZV9lbnRyeSh0KTsKKwkJZW50cnlsZW4gPSB0cmVlX2VudHJ5X2xlbihlbnRyeSwgc2hhMSk7CisJCWlmIChlbnRyeWxlbiA+IG5hbWVsZW4pCisJCQljb250aW51ZTsKKwkJY21wID0gbWVtY21wKG5hbWUsIGVudHJ5LCBlbnRyeWxlbik7CisJCWlmIChjbXAgPiAwKQorCQkJY29udGludWU7CisJCWlmIChjbXAgPCAwKQorCQkJYnJlYWs7CisJCWlmIChlbnRyeWxlbiA9PSBuYW1lbGVuKSB7CisJCQloYXNoY3B5KHJlc3VsdCwgc2hhMSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAobmFtZVtlbnRyeWxlbl0gIT0gJy8nKQorCQkJY29udGludWU7CisJCWlmICghU19JU0RJUigqbW9kZSkpCisJCQlicmVhazsKKwkJaWYgKCsrZW50cnlsZW4gPT0gbmFtZWxlbikgeworCQkJaGFzaGNweShyZXN1bHQsIHNoYTEpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIGdldF90cmVlX2VudHJ5KHNoYTEsIG5hbWUgKyBlbnRyeWxlbiwgcmVzdWx0LCBtb2RlKTsKKwl9CisJcmV0dXJuIC0xOworfQorCitpbnQgZ2V0X3RyZWVfZW50cnkoY29uc3QgdW5zaWduZWQgY2hhciAqdHJlZV9zaGExLCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBjaGFyICpzaGExLCB1bnNpZ25lZCAqbW9kZSkKK3sKKwlpbnQgcmV0dmFsOworCXZvaWQgKnRyZWU7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXN0cnVjdCB0cmVlX2Rlc2MgdDsKKwl1bnNpZ25lZCBjaGFyIHJvb3RbMjBdOworCisJdHJlZSA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKHRyZWVfc2hhMSwgdHJlZV90eXBlLCAmc2l6ZSwgcm9vdCk7CisJaWYgKCF0cmVlKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobmFtZVswXSA9PSAnXDAnKSB7CisJCWhhc2hjcHkoc2hhMSwgcm9vdCk7CisJCXJldHVybiAwOworCX0KKworCWluaXRfdHJlZV9kZXNjKCZ0LCB0cmVlLCBzaXplKTsKKwlyZXR2YWwgPSBmaW5kX3RyZWVfZW50cnkoJnQsIG5hbWUsIHNoYTEsIG1vZGUpOworCWZyZWUodHJlZSk7CisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL3RyZWUtd2Fsay5oIGIvdHJlZS13YWxrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxMTBhNAotLS0gL2Rldi9udWxsCisrKyBiL3RyZWUtd2Fsay5oCkBAIC0wLDAgKzEsNTkgQEAKKyNpZm5kZWYgVFJFRV9XQUxLX0gKKyNkZWZpbmUgVFJFRV9XQUxLX0gKKworc3RydWN0IG5hbWVfZW50cnkgeworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTE7CisJY29uc3QgY2hhciAqcGF0aDsKKwl1bnNpZ25lZCBpbnQgbW9kZTsKK307CisKK3N0cnVjdCB0cmVlX2Rlc2MgeworCWNvbnN0IHZvaWQgKmJ1ZmZlcjsKKwlzdHJ1Y3QgbmFtZV9lbnRyeSBlbnRyeTsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKK307CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgdW5zaWduZWQgY2hhciAqdHJlZV9lbnRyeV9leHRyYWN0KHN0cnVjdCB0cmVlX2Rlc2MgKmRlc2MsIGNvbnN0IGNoYXIgKipwYXRocCwgdW5zaWduZWQgaW50ICptb2RlcCkKK3sKKwkqcGF0aHAgPSBkZXNjLT5lbnRyeS5wYXRoOworCSptb2RlcCA9IGNhbm9uX21vZGUoZGVzYy0+ZW50cnkubW9kZSk7CisJcmV0dXJuIGRlc2MtPmVudHJ5LnNoYTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRyZWVfZW50cnlfbGVuKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJcmV0dXJuIChjb25zdCBjaGFyICopc2hhMSAtIG5hbWUgLSAxOworfQorCit2b2lkIHVwZGF0ZV90cmVlX2VudHJ5KHN0cnVjdCB0cmVlX2Rlc2MgKik7Cit2b2lkIGluaXRfdHJlZV9kZXNjKHN0cnVjdCB0cmVlX2Rlc2MgKmRlc2MsIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKTsKKworLyogSGVscGVyIGZ1bmN0aW9uIHRoYXQgZG9lcyBib3RoIG9mIHRoZSBhYm92ZSBhbmQgcmV0dXJucyB0cnVlIGZvciBzdWNjZXNzICovCitpbnQgdHJlZV9lbnRyeShzdHJ1Y3QgdHJlZV9kZXNjICosIHN0cnVjdCBuYW1lX2VudHJ5ICopOworCit2b2lkICpmaWxsX3RyZWVfZGVzY3JpcHRvcihzdHJ1Y3QgdHJlZV9kZXNjICpkZXNjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKKworc3RydWN0IHRyYXZlcnNlX2luZm87Cit0eXBlZGVmIGludCAoKnRyYXZlcnNlX2NhbGxiYWNrX3QpKGludCBuLCB1bnNpZ25lZCBsb25nIG1hc2ssIHVuc2lnbmVkIGxvbmcgZGlybWFzaywgc3RydWN0IG5hbWVfZW50cnkgKmVudHJ5LCBzdHJ1Y3QgdHJhdmVyc2VfaW5mbyAqKTsKK2ludCB0cmF2ZXJzZV90cmVlcyhpbnQgbiwgc3RydWN0IHRyZWVfZGVzYyAqdCwgc3RydWN0IHRyYXZlcnNlX2luZm8gKmluZm8pOworCitzdHJ1Y3QgdHJhdmVyc2VfaW5mbyB7CisJc3RydWN0IHRyYXZlcnNlX2luZm8gKnByZXY7CisJc3RydWN0IG5hbWVfZW50cnkgbmFtZTsKKwlpbnQgcGF0aGxlbjsKKworCXVuc2lnbmVkIGxvbmcgY29uZmxpY3RzOworCXRyYXZlcnNlX2NhbGxiYWNrX3QgZm47CisJdm9pZCAqZGF0YTsKK307CisKK2ludCBnZXRfdHJlZV9lbnRyeShjb25zdCB1bnNpZ25lZCBjaGFyICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCAqKTsKK2V4dGVybiBjaGFyICptYWtlX3RyYXZlcnNlX3BhdGgoY2hhciAqcGF0aCwgY29uc3Qgc3RydWN0IHRyYXZlcnNlX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBuYW1lX2VudHJ5ICpuKTsKK2V4dGVybiB2b2lkIHNldHVwX3RyYXZlcnNlX2luZm8oc3RydWN0IHRyYXZlcnNlX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgKmJhc2UpOworCitzdGF0aWMgaW5saW5lIGludCB0cmF2ZXJzZV9wYXRoX2xlbihjb25zdCBzdHJ1Y3QgdHJhdmVyc2VfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IG5hbWVfZW50cnkgKm4pCit7CisJcmV0dXJuIGluZm8tPnBhdGhsZW4gKyB0cmVlX2VudHJ5X2xlbihuLT5wYXRoLCBuLT5zaGExKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS90cmVlLmMgYi90cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxODI1YwotLS0gL2Rldi9udWxsCisrKyBiL3RyZWUuYwpAQCAtMCwwICsxLDI1MyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY2FjaGUtdHJlZS5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisKK2NvbnN0IGNoYXIgKnRyZWVfdHlwZSA9ICJ0cmVlIjsKKworc3RhdGljIGludCByZWFkX29uZV9lbnRyeV9vcHQoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4sIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCB1bnNpZ25lZCBtb2RlLCBpbnQgc3RhZ2UsIGludCBvcHQpCit7CisJaW50IGxlbjsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlOworCisJaWYgKFNfSVNESVIobW9kZSkpCisJCXJldHVybiBSRUFEX1RSRUVfUkVDVVJTSVZFOworCisJbGVuID0gc3RybGVuKHBhdGhuYW1lKTsKKwlzaXplID0gY2FjaGVfZW50cnlfc2l6ZShiYXNlbGVuICsgbGVuKTsKKwljZSA9IHhjYWxsb2MoMSwgc2l6ZSk7CisKKwljZS0+Y2VfbW9kZSA9IGNyZWF0ZV9jZV9tb2RlKG1vZGUpOworCWNlLT5jZV9mbGFncyA9IGNyZWF0ZV9jZV9mbGFncyhiYXNlbGVuICsgbGVuLCBzdGFnZSk7CisJbWVtY3B5KGNlLT5uYW1lLCBiYXNlLCBiYXNlbGVuKTsKKwltZW1jcHkoY2UtPm5hbWUgKyBiYXNlbGVuLCBwYXRobmFtZSwgbGVuKzEpOworCWhhc2hjcHkoY2UtPnNoYTEsIHNoYTEpOworCXJldHVybiBhZGRfY2FjaGVfZW50cnkoY2UsIG9wdCk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9vbmVfZW50cnkoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4sIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCB1bnNpZ25lZCBtb2RlLCBpbnQgc3RhZ2UpCit7CisJcmV0dXJuIHJlYWRfb25lX2VudHJ5X29wdChzaGExLCBiYXNlLCBiYXNlbGVuLCBwYXRobmFtZSwgbW9kZSwgc3RhZ2UsCisJCQkJICBBRERfQ0FDSEVfT0tfVE9fQUREfEFERF9DQUNIRV9TS0lQX0RGQ0hFQ0spOworfQorCisvKgorICogVGhpcyBpcyB1c2VkIHdoZW4gdGhlIGNhbGxlciBrbm93cyB0aGVyZSBpcyBubyBleGlzdGluZyBlbnRyaWVzIGF0CisgKiB0aGUgc3RhZ2UgdGhhdCB3aWxsIGNvbmZsaWN0IHdpdGggdGhlIGVudHJ5IGJlaW5nIGFkZGVkLgorICovCitzdGF0aWMgaW50IHJlYWRfb25lX2VudHJ5X3F1aWNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLCBjb25zdCBjaGFyICpwYXRobmFtZSwgdW5zaWduZWQgbW9kZSwgaW50IHN0YWdlKQoreworCXJldHVybiByZWFkX29uZV9lbnRyeV9vcHQoc2hhMSwgYmFzZSwgYmFzZWxlbiwgcGF0aG5hbWUsIG1vZGUsIHN0YWdlLAorCQkJCSAgQUREX0NBQ0hFX0pVU1RfQVBQRU5EKTsKK30KKworc3RhdGljIGludCBtYXRjaF90cmVlX2VudHJ5KGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLCBjb25zdCBjaGFyICpwYXRoLCB1bnNpZ25lZCBpbnQgbW9kZSwgY29uc3QgY2hhciAqKnBhdGhzKQoreworCWNvbnN0IGNoYXIgKm1hdGNoOworCWludCBwYXRobGVuOworCisJaWYgKCFwYXRocykKKwkJcmV0dXJuIDE7CisJcGF0aGxlbiA9IHN0cmxlbihwYXRoKTsKKwl3aGlsZSAoKG1hdGNoID0gKnBhdGhzKyspICE9IE5VTEwpIHsKKwkJaW50IG1hdGNobGVuID0gc3RybGVuKG1hdGNoKTsKKworCQlpZiAoYmFzZWxlbiA+PSBtYXRjaGxlbikgeworCQkJLyogSWYgaXQgZG9lc24ndCBtYXRjaCwgbW92ZSBhbG9uZy4uLiAqLworCQkJaWYgKHN0cm5jbXAoYmFzZSwgbWF0Y2gsIG1hdGNobGVuKSkKKwkJCQljb250aW51ZTsKKwkJCS8qIFRoZSBiYXNlIGlzIGEgc3ViZGlyZWN0b3J5IG9mIGEgcGF0aCB3aGljaCB3YXMgc3BlY2lmaWVkLiAqLworCQkJcmV0dXJuIDE7CisJCX0KKworCQkvKiBEb2VzIHRoZSBiYXNlIG1hdGNoPyAqLworCQlpZiAoc3RybmNtcChiYXNlLCBtYXRjaCwgYmFzZWxlbikpCisJCQljb250aW51ZTsKKworCQltYXRjaCArPSBiYXNlbGVuOworCQltYXRjaGxlbiAtPSBiYXNlbGVuOworCisJCWlmIChwYXRobGVuID4gbWF0Y2hsZW4pCisJCQljb250aW51ZTsKKworCQlpZiAobWF0Y2hsZW4gPiBwYXRobGVuKSB7CisJCQlpZiAobWF0Y2hbcGF0aGxlbl0gIT0gJy8nKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFTX0lTRElSKG1vZGUpKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHN0cm5jbXAocGF0aCwgbWF0Y2gsIHBhdGhsZW4pKQorCQkJY29udGludWU7CisKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitpbnQgcmVhZF90cmVlX3JlY3Vyc2l2ZShzdHJ1Y3QgdHJlZSAqdHJlZSwKKwkJCWNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLAorCQkJaW50IHN0YWdlLCBjb25zdCBjaGFyICoqbWF0Y2gsCisJCQlyZWFkX3RyZWVfZm5fdCBmbikKK3sKKwlzdHJ1Y3QgdHJlZV9kZXNjIGRlc2M7CisJc3RydWN0IG5hbWVfZW50cnkgZW50cnk7CisKKwlpZiAocGFyc2VfdHJlZSh0cmVlKSkKKwkJcmV0dXJuIC0xOworCisJaW5pdF90cmVlX2Rlc2MoJmRlc2MsIHRyZWUtPmJ1ZmZlciwgdHJlZS0+c2l6ZSk7CisKKwl3aGlsZSAodHJlZV9lbnRyeSgmZGVzYywgJmVudHJ5KSkgeworCQlpZiAoIW1hdGNoX3RyZWVfZW50cnkoYmFzZSwgYmFzZWxlbiwgZW50cnkucGF0aCwgZW50cnkubW9kZSwgbWF0Y2gpKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChmbihlbnRyeS5zaGExLCBiYXNlLCBiYXNlbGVuLCBlbnRyeS5wYXRoLCBlbnRyeS5tb2RlLCBzdGFnZSkpIHsKKwkJY2FzZSAwOgorCQkJY29udGludWU7CisJCWNhc2UgUkVBRF9UUkVFX1JFQ1VSU0lWRToKKwkJCWJyZWFrOzsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoU19JU0RJUihlbnRyeS5tb2RlKSkgeworCQkJaW50IHJldHZhbDsKKwkJCWNoYXIgKm5ld2Jhc2U7CisJCQl1bnNpZ25lZCBpbnQgcGF0aGxlbiA9IHRyZWVfZW50cnlfbGVuKGVudHJ5LnBhdGgsIGVudHJ5LnNoYTEpOworCisJCQluZXdiYXNlID0geG1hbGxvYyhiYXNlbGVuICsgMSArIHBhdGhsZW4pOworCQkJbWVtY3B5KG5ld2Jhc2UsIGJhc2UsIGJhc2VsZW4pOworCQkJbWVtY3B5KG5ld2Jhc2UgKyBiYXNlbGVuLCBlbnRyeS5wYXRoLCBwYXRobGVuKTsKKwkJCW5ld2Jhc2VbYmFzZWxlbiArIHBhdGhsZW5dID0gJy8nOworCQkJcmV0dmFsID0gcmVhZF90cmVlX3JlY3Vyc2l2ZShsb29rdXBfdHJlZShlbnRyeS5zaGExKSwKKwkJCQkJCSAgICAgbmV3YmFzZSwKKwkJCQkJCSAgICAgYmFzZWxlbiArIHBhdGhsZW4gKyAxLAorCQkJCQkJICAgICBzdGFnZSwgbWF0Y2gsIGZuKTsKKwkJCWZyZWUobmV3YmFzZSk7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiAtMTsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNtcF9jYWNoZV9uYW1lX2NvbXBhcmUoY29uc3Qgdm9pZCAqYV8sIGNvbnN0IHZvaWQgKmJfKQoreworCWNvbnN0IHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UxLCAqY2UyOworCisJY2UxID0gKigoY29uc3Qgc3RydWN0IGNhY2hlX2VudHJ5ICoqKWFfKTsKKwljZTIgPSAqKChjb25zdCBzdHJ1Y3QgY2FjaGVfZW50cnkgKiopYl8pOworCXJldHVybiBjYWNoZV9uYW1lX2NvbXBhcmUoY2UxLT5uYW1lLCBjZTEtPmNlX2ZsYWdzLAorCQkJCSAgY2UyLT5uYW1lLCBjZTItPmNlX2ZsYWdzKTsKK30KKworaW50IHJlYWRfdHJlZShzdHJ1Y3QgdHJlZSAqdHJlZSwgaW50IHN0YWdlLCBjb25zdCBjaGFyICoqbWF0Y2gpCit7CisJcmVhZF90cmVlX2ZuX3QgZm4gPSBOVUxMOworCWludCBpLCBlcnI7CisKKwkvKgorCSAqIEN1cnJlbnRseSB0aGUgb25seSBleGlzdGluZyBjYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24gYWxsCisJICogY2FsbCBpdCB3aXRoIHN0YWdlPTEgYW5kIGFmdGVyIG1ha2luZyBzdXJlIHRoZXJlIGlzIG5vdGhpbmcKKwkgKiBhdCB0aGF0IHN0YWdlOyB3ZSBjb3VsZCBhbHdheXMgdXNlIHJlYWRfb25lX2VudHJ5X3F1aWNrKCkuCisJICoKKwkgKiBCdXQgd2hlbiB3ZSBkZWNpZGUgdG8gc3RyYWlnaHRlbiBvdXQgZ2l0LXJlYWQtdHJlZSBub3QgdG8KKwkgKiB1c2UgdW5wYWNrX3RyZWVzKCkgaW4gc29tZSBjYXNlcywgdGhpcyB3aWxsIHByb2JhYmx5IHN0YXJ0CisJICogdG8gbWF0dGVyLgorCSAqLworCisJLyoKKwkgKiBTZWUgaWYgd2UgaGF2ZSBjYWNoZSBlbnRyeSBhdCB0aGUgc3RhZ2UuICBJZiBzbywKKwkgKiBkbyBpdCB0aGUgb3JpZ2luYWwgc2xvdyB3YXksIG90aGVyd2lzZSwgYXBwZW5kIGFuZCB0aGVuCisJICogc29ydCBhdCB0aGUgZW5kLgorCSAqLworCWZvciAoaSA9IDA7ICFmbiAmJiBpIDwgYWN0aXZlX25yOyBpKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtpXTsKKwkJaWYgKGNlX3N0YWdlKGNlKSA9PSBzdGFnZSkKKwkJCWZuID0gcmVhZF9vbmVfZW50cnk7CisJfQorCisJaWYgKCFmbikKKwkJZm4gPSByZWFkX29uZV9lbnRyeV9xdWljazsKKwllcnIgPSByZWFkX3RyZWVfcmVjdXJzaXZlKHRyZWUsICIiLCAwLCBzdGFnZSwgbWF0Y2gsIGZuKTsKKwlpZiAoZm4gPT0gcmVhZF9vbmVfZW50cnkgfHwgZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyoKKwkgKiBTb3J0IHRoZSBjYWNoZSBlbnRyeSAtLSB3ZSBuZWVkIHRvIG51a2UgdGhlIGNhY2hlIHRyZWUsIHRob3VnaC4KKwkgKi8KKwljYWNoZV90cmVlX2ZyZWUoJmFjdGl2ZV9jYWNoZV90cmVlKTsKKwlxc29ydChhY3RpdmVfY2FjaGUsIGFjdGl2ZV9uciwgc2l6ZW9mKGFjdGl2ZV9jYWNoZVswXSksCisJICAgICAgY21wX2NhY2hlX25hbWVfY29tcGFyZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB0cmVlICpsb29rdXBfdHJlZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBvYmplY3QgKm9iaiA9IGxvb2t1cF9vYmplY3Qoc2hhMSk7CisJaWYgKCFvYmopCisJCXJldHVybiBjcmVhdGVfb2JqZWN0KHNoYTEsIE9CSl9UUkVFLCBhbGxvY190cmVlX25vZGUoKSk7CisJaWYgKCFvYmotPnR5cGUpCisJCW9iai0+dHlwZSA9IE9CSl9UUkVFOworCWlmIChvYmotPnR5cGUgIT0gT0JKX1RSRUUpIHsKKwkJZXJyb3IoIk9iamVjdCAlcyBpcyBhICVzLCBub3QgYSB0cmVlIiwKKwkJICAgICAgc2hhMV90b19oZXgoc2hhMSksIHR5cGVuYW1lKG9iai0+dHlwZSkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIChzdHJ1Y3QgdHJlZSAqKSBvYmo7Cit9CisKK2ludCBwYXJzZV90cmVlX2J1ZmZlcihzdHJ1Y3QgdHJlZSAqaXRlbSwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaWYgKGl0ZW0tPm9iamVjdC5wYXJzZWQpCisJCXJldHVybiAwOworCWl0ZW0tPm9iamVjdC5wYXJzZWQgPSAxOworCWl0ZW0tPmJ1ZmZlciA9IGJ1ZmZlcjsKKwlpdGVtLT5zaXplID0gc2l6ZTsKKworCXJldHVybiAwOworfQorCitpbnQgcGFyc2VfdHJlZShzdHJ1Y3QgdHJlZSAqaXRlbSkKK3sKKwkgZW51bSBvYmplY3RfdHlwZSB0eXBlOworCSB2b2lkICpidWZmZXI7CisJIHVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCWlmIChpdGVtLT5vYmplY3QucGFyc2VkKQorCQlyZXR1cm4gMDsKKwlidWZmZXIgPSByZWFkX3NoYTFfZmlsZShpdGVtLT5vYmplY3Quc2hhMSwgJnR5cGUsICZzaXplKTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIGVycm9yKCJDb3VsZCBub3QgcmVhZCAlcyIsCisJCQkgICAgIHNoYTFfdG9faGV4KGl0ZW0tPm9iamVjdC5zaGExKSk7CisJaWYgKHR5cGUgIT0gT0JKX1RSRUUpIHsKKwkJZnJlZShidWZmZXIpOworCQlyZXR1cm4gZXJyb3IoIk9iamVjdCAlcyBub3QgYSB0cmVlIiwKKwkJCSAgICAgc2hhMV90b19oZXgoaXRlbS0+b2JqZWN0LnNoYTEpKTsKKwl9CisJcmV0dXJuIHBhcnNlX3RyZWVfYnVmZmVyKGl0ZW0sIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0cnVjdCB0cmVlICpwYXJzZV90cmVlX2luZGlyZWN0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IG9iamVjdCAqb2JqID0gcGFyc2Vfb2JqZWN0KHNoYTEpOworCWRvIHsKKwkJaWYgKCFvYmopCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKG9iai0+dHlwZSA9PSBPQkpfVFJFRSkKKwkJCXJldHVybiAoc3RydWN0IHRyZWUgKikgb2JqOworCQllbHNlIGlmIChvYmotPnR5cGUgPT0gT0JKX0NPTU1JVCkKKwkJCW9iaiA9ICYoKChzdHJ1Y3QgY29tbWl0ICopIG9iaiktPnRyZWUtPm9iamVjdCk7CisJCWVsc2UgaWYgKG9iai0+dHlwZSA9PSBPQkpfVEFHKQorCQkJb2JqID0gKChzdHJ1Y3QgdGFnICopIG9iaiktPnRhZ2dlZDsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJCWlmICghb2JqLT5wYXJzZWQpCisJCQlwYXJzZV9vYmplY3Qob2JqLT5zaGExKTsKKwl9IHdoaWxlICgxKTsKK30KZGlmZiAtLWdpdCBhL3RyZWUuaCBiL3RyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDI1YzUzCi0tLSAvZGV2L251bGwKKysrIGIvdHJlZS5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgVFJFRV9ICisjZGVmaW5lIFRSRUVfSAorCisjaW5jbHVkZSAib2JqZWN0LmgiCisKK2V4dGVybiBjb25zdCBjaGFyICp0cmVlX3R5cGU7CisKK3N0cnVjdCB0cmVlIHsKKwlzdHJ1Y3Qgb2JqZWN0IG9iamVjdDsKKwl2b2lkICpidWZmZXI7CisJdW5zaWduZWQgbG9uZyBzaXplOworfTsKKworc3RydWN0IHRyZWUgKmxvb2t1cF90cmVlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCitpbnQgcGFyc2VfdHJlZV9idWZmZXIoc3RydWN0IHRyZWUgKml0ZW0sIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKTsKKworaW50IHBhcnNlX3RyZWUoc3RydWN0IHRyZWUgKnRyZWUpOworCisvKiBQYXJzZXMgYW5kIHJldHVybnMgdGhlIHRyZWUgaW4gdGhlIGdpdmVuIGVudCwgY2hhc2luZyB0YWdzIGFuZCBjb21taXRzLiAqLworc3RydWN0IHRyZWUgKnBhcnNlX3RyZWVfaW5kaXJlY3QoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSk7CisKKyNkZWZpbmUgUkVBRF9UUkVFX1JFQ1VSU0lWRSAxCit0eXBlZGVmIGludCAoKnJlYWRfdHJlZV9mbl90KShjb25zdCB1bnNpZ25lZCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgaW50KTsKKworZXh0ZXJuIGludCByZWFkX3RyZWVfcmVjdXJzaXZlKHN0cnVjdCB0cmVlICp0cmVlLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLAorCQkJICAgICAgIGludCBzdGFnZSwgY29uc3QgY2hhciAqKm1hdGNoLAorCQkJICAgICAgIHJlYWRfdHJlZV9mbl90IGZuKTsKKworZXh0ZXJuIGludCByZWFkX3RyZWUoc3RydWN0IHRyZWUgKnRyZWUsIGludCBzdGFnZSwgY29uc3QgY2hhciAqKnBhdGhzKTsKKworI2VuZGlmIC8qIFRSRUVfSCAqLwpkaWZmIC0tZ2l0IGEvdW5wYWNrLWZpbGUuYyBiL3VucGFjay1maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVjNjZlYgotLS0gL2Rldi9udWxsCisrKyBiL3VucGFjay1maWxlLmMKQEAgLTAsMCArMSwzOCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorCitzdGF0aWMgY2hhciAqY3JlYXRlX3RlbXBfZmlsZSh1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0YXRpYyBjaGFyIHBhdGhbNTBdOworCXZvaWQgKmJ1ZjsKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCBmZDsKKworCWJ1ZiA9IHJlYWRfc2hhMV9maWxlKHNoYTEsICZ0eXBlLCAmc2l6ZSk7CisJaWYgKCFidWYgfHwgdHlwZSAhPSBPQkpfQkxPQikKKwkJZGllKCJ1bmFibGUgdG8gcmVhZCBibG9iIG9iamVjdCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKworCXN0cmNweShwYXRoLCAiLm1lcmdlX2ZpbGVfWFhYWFhYIik7CisJZmQgPSB4bWtzdGVtcChwYXRoKTsKKwlpZiAod3JpdGVfaW5fZnVsbChmZCwgYnVmLCBzaXplKSAhPSBzaXplKQorCQlkaWUoInVuYWJsZSB0byB3cml0ZSB0ZW1wLWZpbGUiKTsKKwljbG9zZShmZCk7CisJcmV0dXJuIHBhdGg7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCisJaWYgKGFyZ2MgIT0gMikKKwkJdXNhZ2UoImdpdC11bnBhY2stZmlsZSA8c2hhMT4iKTsKKwlpZiAoZ2V0X3NoYTEoYXJndlsxXSwgc2hhMSkpCisJCWRpZSgiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWUgJXMiLCBhcmd2WzFdKTsKKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwlwdXRzKGNyZWF0ZV90ZW1wX2ZpbGUoc2hhMSkpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdW5wYWNrLXRyZWVzLmMgYi91bnBhY2stdHJlZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTlmNDc1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5wYWNrLXRyZWVzLmMKQEAgLTAsMCArMSw5NDIgQEAKKyNkZWZpbmUgTk9fVEhFX0lOREVYX0NPTVBBVElCSUxJVFlfTUFDUk9TCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaXIuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisjaW5jbHVkZSAiY2FjaGUtdHJlZS5oIgorI2luY2x1ZGUgInVucGFjay10cmVlcy5oIgorI2luY2x1ZGUgInByb2dyZXNzLmgiCisjaW5jbHVkZSAicmVmcy5oIgorCitzdGF0aWMgdm9pZCBhZGRfZW50cnkoc3RydWN0IHVucGFja190cmVlc19vcHRpb25zICpvLCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLAorCXVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IGNlX3NpemUoY2UpOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqbmV3ID0geG1hbGxvYyhzaXplKTsKKworCWNsZWFyIHw9IENFX0hBU0hFRCB8IENFX1VOSEFTSEVEOworCisJbWVtY3B5KG5ldywgY2UsIHNpemUpOworCW5ldy0+bmV4dCA9IE5VTEw7CisJbmV3LT5jZV9mbGFncyA9IChuZXctPmNlX2ZsYWdzICYgfmNsZWFyKSB8IHNldDsKKwlhZGRfaW5kZXhfZW50cnkoJm8tPnJlc3VsdCwgbmV3LCBBRERfQ0FDSEVfT0tfVE9fQUREfEFERF9DQUNIRV9PS19UT19SRVBMQUNFfEFERF9DQUNIRV9TS0lQX0RGQ0hFQ0spOworfQorCisvKiBVbmxpbmsgdGhlIGxhc3QgY29tcG9uZW50IGFuZCBhdHRlbXB0IHRvIHJlbW92ZSBsZWFkaW5nCisgKiBkaXJlY3RvcmllcywgaW4gY2FzZSB0aGlzIHVubGluayBpcyB0aGUgcmVtb3ZhbCBvZiB0aGUKKyAqIGxhc3QgZW50cnkgaW4gdGhlIGRpcmVjdG9yeSAtLSBlbXB0eSBkaXJlY3RvcmllcyBhcmUgcmVtb3ZlZC4KKyAqLworc3RhdGljIHZvaWQgdW5saW5rX2VudHJ5KGNoYXIgKm5hbWUsIGNoYXIgKmxhc3Rfc3ltbGluaykKK3sKKwljaGFyICpjcCwgKnByZXY7CisKKwlpZiAoaGFzX3N5bWxpbmtfbGVhZGluZ19wYXRoKG5hbWUsIGxhc3Rfc3ltbGluaykpCisJCXJldHVybjsKKwlpZiAodW5saW5rKG5hbWUpKQorCQlyZXR1cm47CisJcHJldiA9IE5VTEw7CisJd2hpbGUgKDEpIHsKKwkJaW50IHN0YXR1czsKKwkJY3AgPSBzdHJyY2hyKG5hbWUsICcvJyk7CisJCWlmIChwcmV2KQorCQkJKnByZXYgPSAnLyc7CisJCWlmICghY3ApCisJCQlicmVhazsKKworCQkqY3AgPSAwOworCQlzdGF0dXMgPSBybWRpcihuYW1lKTsKKwkJaWYgKHN0YXR1cykgeworCQkJKmNwID0gJy8nOworCQkJYnJlYWs7CisJCX0KKwkJcHJldiA9IGNwOworCX0KK30KKworc3RhdGljIHN0cnVjdCBjaGVja291dCBzdGF0ZTsKK3N0YXRpYyBpbnQgY2hlY2tfdXBkYXRlcyhzdHJ1Y3QgdW5wYWNrX3RyZWVzX29wdGlvbnMgKm8pCit7CisJdW5zaWduZWQgY250ID0gMCwgdG90YWwgPSAwOworCXN0cnVjdCBwcm9ncmVzcyAqcHJvZ3Jlc3MgPSBOVUxMOworCWNoYXIgbGFzdF9zeW1saW5rW1BBVEhfTUFYXTsKKwlzdHJ1Y3QgaW5kZXhfc3RhdGUgKmluZGV4ID0gJm8tPnJlc3VsdDsKKwlpbnQgaTsKKwlpbnQgZXJycyA9IDA7CisKKwlpZiAoby0+dXBkYXRlICYmIG8tPnZlcmJvc2VfdXBkYXRlKSB7CisJCWZvciAodG90YWwgPSBjbnQgPSAwOyBjbnQgPCBpbmRleC0+Y2FjaGVfbnI7IGNudCsrKSB7CisJCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gaW5kZXgtPmNhY2hlW2NudF07CisJCQlpZiAoY2UtPmNlX2ZsYWdzICYgKENFX1VQREFURSB8IENFX1JFTU9WRSkpCisJCQkJdG90YWwrKzsKKwkJfQorCisJCXByb2dyZXNzID0gc3RhcnRfcHJvZ3Jlc3NfZGVsYXkoIkNoZWNraW5nIG91dCBmaWxlcyIsCisJCQkJCQl0b3RhbCwgNTAsIDEpOworCQljbnQgPSAwOworCX0KKworCSpsYXN0X3N5bWxpbmsgPSAnXDAnOworCWZvciAoaSA9IDA7IGkgPCBpbmRleC0+Y2FjaGVfbnI7IGkrKykgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gaW5kZXgtPmNhY2hlW2ldOworCisJCWlmIChjZS0+Y2VfZmxhZ3MgJiAoQ0VfVVBEQVRFIHwgQ0VfUkVNT1ZFKSkKKwkJCWRpc3BsYXlfcHJvZ3Jlc3MocHJvZ3Jlc3MsICsrY250KTsKKwkJaWYgKGNlLT5jZV9mbGFncyAmIENFX1JFTU9WRSkgeworCQkJaWYgKG8tPnVwZGF0ZSkKKwkJCQl1bmxpbmtfZW50cnkoY2UtPm5hbWUsIGxhc3Rfc3ltbGluayk7CisJCQlyZW1vdmVfaW5kZXhfZW50cnlfYXQoJm8tPnJlc3VsdCwgaSk7CisJCQlpLS07CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY2UtPmNlX2ZsYWdzICYgQ0VfVVBEQVRFKSB7CisJCQljZS0+Y2VfZmxhZ3MgJj0gfkNFX1VQREFURTsKKwkJCWlmIChvLT51cGRhdGUpIHsKKwkJCQllcnJzIHw9IGNoZWNrb3V0X2VudHJ5KGNlLCAmc3RhdGUsIE5VTEwpOworCQkJCSpsYXN0X3N5bWxpbmsgPSAnXDAnOworCQkJfQorCQl9CisJfQorCXN0b3BfcHJvZ3Jlc3MoJnByb2dyZXNzKTsKKwlyZXR1cm4gZXJycyAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjYWxsX3VucGFja19mbihzdHJ1Y3QgY2FjaGVfZW50cnkgKipzcmMsIHN0cnVjdCB1bnBhY2tfdHJlZXNfb3B0aW9ucyAqbykKK3sKKwlpbnQgcmV0ID0gby0+Zm4oc3JjLCBvKTsKKwlpZiAocmV0ID4gMCkKKwkJcmV0ID0gMDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHVucGFja19pbmRleF9lbnRyeShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBzdHJ1Y3QgdW5wYWNrX3RyZWVzX29wdGlvbnMgKm8pCit7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpzcmNbNV0gPSB7IGNlLCB9OworCisJby0+cG9zKys7CisJaWYgKGNlX3N0YWdlKGNlKSkgeworCQlpZiAoby0+c2tpcF91bm1lcmdlZCkgeworCQkJYWRkX2VudHJ5KG8sIGNlLCAwLCAwKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiBjYWxsX3VucGFja19mbihzcmMsIG8pOworfQorCitpbnQgdHJhdmVyc2VfdHJlZXNfcmVjdXJzaXZlKGludCBuLCB1bnNpZ25lZCBsb25nIGRpcm1hc2ssIHVuc2lnbmVkIGxvbmcgZGZfY29uZmxpY3RzLCBzdHJ1Y3QgbmFtZV9lbnRyeSAqbmFtZXMsIHN0cnVjdCB0cmF2ZXJzZV9pbmZvICppbmZvKQoreworCWludCBpOworCXN0cnVjdCB0cmVlX2Rlc2MgdFtNQVhfVU5QQUNLX1RSRUVTXTsKKwlzdHJ1Y3QgdHJhdmVyc2VfaW5mbyBuZXdpbmZvOworCXN0cnVjdCBuYW1lX2VudHJ5ICpwOworCisJcCA9IG5hbWVzOworCXdoaWxlICghcC0+bW9kZSkKKwkJcCsrOworCisJbmV3aW5mbyA9ICppbmZvOworCW5ld2luZm8ucHJldiA9IGluZm87CisJbmV3aW5mby5uYW1lID0gKnA7CisJbmV3aW5mby5wYXRobGVuICs9IHRyZWVfZW50cnlfbGVuKHAtPnBhdGgsIHAtPnNoYTEpICsgMTsKKwluZXdpbmZvLmNvbmZsaWN0cyB8PSBkZl9jb25mbGljdHM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrLCBkaXJtYXNrID4+PSAxKSB7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEgPSBOVUxMOworCQlpZiAoZGlybWFzayAmIDEpCisJCQlzaGExID0gbmFtZXNbaV0uc2hhMTsKKwkJZmlsbF90cmVlX2Rlc2NyaXB0b3IodCtpLCBzaGExKTsKKwl9CisJcmV0dXJuIHRyYXZlcnNlX3RyZWVzKG4sIHQsICZuZXdpbmZvKTsKK30KKworLyoKKyAqIENvbXBhcmUgdGhlIHRyYXZlcnNlLXBhdGggdG8gdGhlIGNhY2hlIGVudHJ5IHdpdGhvdXQgYWN0dWFsbHkKKyAqIGhhdmluZyB0byBnZW5lcmF0ZSB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHJhdmVyc2UKKyAqIHBhdGguCisgKgorICogTk9URSEgVGhpcyAqb25seSogY29tcGFyZXMgdXAgdG8gdGhlIHNpemUgb2YgdGhlIHRyYXZlcnNlIHBhdGgKKyAqIGl0c2VsZiAtIHRoZSBjYWxsZXIgbmVlZHMgdG8gZG8gdGhlIGZpbmFsIGNoZWNrIGZvciB0aGUgY2FjaGUKKyAqIGVudHJ5IGhhdmluZyBtb3JlIGRhdGEgYXQgdGhlIGVuZCEKKyAqLworc3RhdGljIGludCBkb19jb21wYXJlX2VudHJ5KGNvbnN0IHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIGNvbnN0IHN0cnVjdCB0cmF2ZXJzZV9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgbmFtZV9lbnRyeSAqbikKK3sKKwlpbnQgbGVuLCBwYXRobGVuLCBjZV9sZW47CisJY29uc3QgY2hhciAqY2VfbmFtZTsKKworCWlmIChpbmZvLT5wcmV2KSB7CisJCWludCBjbXAgPSBkb19jb21wYXJlX2VudHJ5KGNlLCBpbmZvLT5wcmV2LCAmaW5mby0+bmFtZSk7CisJCWlmIChjbXApCisJCQlyZXR1cm4gY21wOworCX0KKwlwYXRobGVuID0gaW5mby0+cGF0aGxlbjsKKwljZV9sZW4gPSBjZV9uYW1lbGVuKGNlKTsKKworCS8qIElmIGNlX2xlbiA8IHBhdGhsZW4gdGhlbiB3ZSBtdXN0IGhhdmUgcHJldmlvdXNseSBoaXQgIm5hbWUgPT0gZGlyZWN0b3J5IiBlbnRyeSAqLworCWlmIChjZV9sZW4gPCBwYXRobGVuKQorCQlyZXR1cm4gLTE7CisKKwljZV9sZW4gLT0gcGF0aGxlbjsKKwljZV9uYW1lID0gY2UtPm5hbWUgKyBwYXRobGVuOworCisJbGVuID0gdHJlZV9lbnRyeV9sZW4obi0+cGF0aCwgbi0+c2hhMSk7CisJcmV0dXJuIGRmX25hbWVfY29tcGFyZShjZV9uYW1lLCBjZV9sZW4sIFNfSUZSRUcsIG4tPnBhdGgsIGxlbiwgbi0+bW9kZSk7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZV9lbnRyeShjb25zdCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBjb25zdCBzdHJ1Y3QgdHJhdmVyc2VfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IG5hbWVfZW50cnkgKm4pCit7CisJaW50IGNtcCA9IGRvX2NvbXBhcmVfZW50cnkoY2UsIGluZm8sIG4pOworCWlmIChjbXApCisJCXJldHVybiBjbXA7CisKKwkvKgorCSAqIEV2ZW4gaWYgdGhlIGJlZ2lubmluZyBjb21wYXJlZCBpZGVudGljYWxseSwgdGhlIGNlIHNob3VsZAorCSAqIGNvbXBhcmUgYXMgYmlnZ2VyIHRoYW4gYSBkaXJlY3RvcnkgbGVhZGluZyB1cCB0byBpdCEKKwkgKi8KKwlyZXR1cm4gY2VfbmFtZWxlbihjZSkgPiB0cmF2ZXJzZV9wYXRoX2xlbihpbmZvLCBuKTsKK30KKworc3RhdGljIHN0cnVjdCBjYWNoZV9lbnRyeSAqY3JlYXRlX2NlX2VudHJ5KGNvbnN0IHN0cnVjdCB0cmF2ZXJzZV9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgbmFtZV9lbnRyeSAqbiwgaW50IHN0YWdlKQoreworCWludCBsZW4gPSB0cmF2ZXJzZV9wYXRoX2xlbihpbmZvLCBuKTsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0geGNhbGxvYygxLCBjYWNoZV9lbnRyeV9zaXplKGxlbikpOworCisJY2UtPmNlX21vZGUgPSBjcmVhdGVfY2VfbW9kZShuLT5tb2RlKTsKKwljZS0+Y2VfZmxhZ3MgPSBjcmVhdGVfY2VfZmxhZ3MobGVuLCBzdGFnZSk7CisJaGFzaGNweShjZS0+c2hhMSwgbi0+c2hhMSk7CisJbWFrZV90cmF2ZXJzZV9wYXRoKGNlLT5uYW1lLCBpbmZvLCBuKTsKKworCXJldHVybiBjZTsKK30KKworc3RhdGljIGludCB1bnBhY2tfbm9uZGlyZWN0b3JpZXMoaW50IG4sIHVuc2lnbmVkIGxvbmcgbWFzaywgdW5zaWduZWQgbG9uZyBkaXJtYXNrLCBzdHJ1Y3QgY2FjaGVfZW50cnkgKnNyY1s1XSwKKwljb25zdCBzdHJ1Y3QgbmFtZV9lbnRyeSAqbmFtZXMsIGNvbnN0IHN0cnVjdCB0cmF2ZXJzZV9pbmZvICppbmZvKQoreworCWludCBpOworCXN0cnVjdCB1bnBhY2tfdHJlZXNfb3B0aW9ucyAqbyA9IGluZm8tPmRhdGE7CisJdW5zaWduZWQgbG9uZyBjb25mbGljdHM7CisKKwkvKiBEbyB3ZSBoYXZlICpvbmx5KiBkaXJlY3Rvcmllcz8gTm90aGluZyB0byBkbyAqLworCWlmIChtYXNrID09IGRpcm1hc2sgJiYgIXNyY1swXSkKKwkJcmV0dXJuIDA7CisKKwljb25mbGljdHMgPSBpbmZvLT5jb25mbGljdHM7CisJaWYgKG8tPm1lcmdlKQorCQljb25mbGljdHMgPj49IDE7CisJY29uZmxpY3RzIHw9IGRpcm1hc2s7CisKKwkvKgorCSAqIE9rLCB3ZSd2ZSBmaWxsZWQgaW4gdXAgdG8gYW55IHBvdGVudGlhbCBpbmRleCBlbnRyeSBpbiBzcmNbMF0sCisJICogbm93IGRvIHRoZSByZXN0LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJaW50IHN0YWdlOworCQl1bnNpZ25lZCBpbnQgYml0ID0gMXVsIDw8IGk7CisJCWlmIChjb25mbGljdHMgJiBiaXQpIHsKKwkJCXNyY1tpICsgby0+bWVyZ2VdID0gby0+ZGZfY29uZmxpY3RfZW50cnk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIShtYXNrICYgYml0KSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIW8tPm1lcmdlKQorCQkJc3RhZ2UgPSAwOworCQllbHNlIGlmIChpICsgMSA8IG8tPmhlYWRfaWR4KQorCQkJc3RhZ2UgPSAxOworCQllbHNlIGlmIChpICsgMSA+IG8tPmhlYWRfaWR4KQorCQkJc3RhZ2UgPSAzOworCQllbHNlCisJCQlzdGFnZSA9IDI7CisJCXNyY1tpICsgby0+bWVyZ2VdID0gY3JlYXRlX2NlX2VudHJ5KGluZm8sIG5hbWVzICsgaSwgc3RhZ2UpOworCX0KKworCWlmIChvLT5tZXJnZSkKKwkJcmV0dXJuIGNhbGxfdW5wYWNrX2ZuKHNyYywgbyk7CisKKwluICs9IG8tPm1lcmdlOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCWFkZF9lbnRyeShvLCBzcmNbaV0sIDAsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVucGFja19jYWxsYmFjayhpbnQgbiwgdW5zaWduZWQgbG9uZyBtYXNrLCB1bnNpZ25lZCBsb25nIGRpcm1hc2ssIHN0cnVjdCBuYW1lX2VudHJ5ICpuYW1lcywgc3RydWN0IHRyYXZlcnNlX2luZm8gKmluZm8pCit7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpzcmNbNV0gPSB7IE5VTEwsIH07CisJc3RydWN0IHVucGFja190cmVlc19vcHRpb25zICpvID0gaW5mby0+ZGF0YTsKKwljb25zdCBzdHJ1Y3QgbmFtZV9lbnRyeSAqcCA9IG5hbWVzOworCisJLyogRmluZCBmaXJzdCBlbnRyeSB3aXRoIGEgcmVhbCBuYW1lICh3ZSBjb3VsZCB1c2UgIm1hc2siIHRvbykgKi8KKwl3aGlsZSAoIXAtPm1vZGUpCisJCXArKzsKKworCS8qIEFyZSB3ZSBzdXBwb3NlZCB0byBsb29rIGF0IHRoZSBpbmRleCB0b28/ICovCisJaWYgKG8tPm1lcmdlKSB7CisJCXdoaWxlIChvLT5wb3MgPCBvLT5zcmNfaW5kZXgtPmNhY2hlX25yKSB7CisJCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gby0+c3JjX2luZGV4LT5jYWNoZVtvLT5wb3NdOworCQkJaW50IGNtcCA9IGNvbXBhcmVfZW50cnkoY2UsIGluZm8sIHApOworCQkJaWYgKGNtcCA8IDApIHsKKwkJCQlpZiAodW5wYWNrX2luZGV4X2VudHJ5KGNlLCBvKSA8IDApCisJCQkJCXJldHVybiAtMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghY21wKSB7CisJCQkJby0+cG9zKys7CisJCQkJaWYgKGNlX3N0YWdlKGNlKSkgeworCQkJCQkvKgorCQkJCQkgKiBJZiB3ZSBza2lwIHVubWVyZ2VkIGluZGV4IGVudHJpZXMsIHdlJ2xsIHNraXAgdGhpcworCQkJCQkgKiBlbnRyeSAqYW5kKiB0aGUgdHJlZSBlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aCBpdCEKKwkJCQkJICovCisJCQkJCWlmIChvLT5za2lwX3VubWVyZ2VkKSB7CisJCQkJCQlhZGRfZW50cnkobywgY2UsIDAsIDApOworCQkJCQkJcmV0dXJuIG1hc2s7CisJCQkJCX0KKwkJCQl9CisJCQkJc3JjWzBdID0gY2U7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICh1bnBhY2tfbm9uZGlyZWN0b3JpZXMobiwgbWFzaywgZGlybWFzaywgc3JjLCBuYW1lcywgaW5mbykgPCAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBOb3cgaGFuZGxlIGFueSBkaXJlY3Rvcmllcy4uICovCisJaWYgKGRpcm1hc2spIHsKKwkJdW5zaWduZWQgbG9uZyBjb25mbGljdHMgPSBtYXNrICYgfmRpcm1hc2s7CisJCWlmIChvLT5tZXJnZSkgeworCQkJY29uZmxpY3RzIDw8PSAxOworCQkJaWYgKHNyY1swXSkKKwkJCQljb25mbGljdHMgfD0gMTsKKwkJfQorCQlpZiAodHJhdmVyc2VfdHJlZXNfcmVjdXJzaXZlKG4sIGRpcm1hc2ssIGNvbmZsaWN0cywKKwkJCQkJICAgICBuYW1lcywgaW5mbykgPCAwKQorCQkJcmV0dXJuIC0xOworCQlyZXR1cm4gbWFzazsKKwl9CisKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludCB1bnBhY2tfZmFpbGVkKHN0cnVjdCB1bnBhY2tfdHJlZXNfb3B0aW9ucyAqbywgY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKwlkaXNjYXJkX2luZGV4KCZvLT5yZXN1bHQpOworCWlmICghby0+Z2VudGx5KSB7CisJCWlmIChtZXNzYWdlKQorCQkJcmV0dXJuIGVycm9yKG1lc3NhZ2UpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAtMTsKK30KKworaW50IHVucGFja190cmVlcyh1bnNpZ25lZCBsZW4sIHN0cnVjdCB0cmVlX2Rlc2MgKnQsIHN0cnVjdCB1bnBhY2tfdHJlZXNfb3B0aW9ucyAqbykKK3sKKwlzdGF0aWMgc3RydWN0IGNhY2hlX2VudHJ5ICpkZmM7CisKKwlpZiAobGVuID4gTUFYX1VOUEFDS19UUkVFUykKKwkJZGllKCJ1bnBhY2tfdHJlZXMgdGFrZXMgYXQgbW9zdCAlZCB0cmVlcyIsIE1BWF9VTlBBQ0tfVFJFRVMpOworCW1lbXNldCgmc3RhdGUsIDAsIHNpemVvZihzdGF0ZSkpOworCXN0YXRlLmJhc2VfZGlyID0gIiI7CisJc3RhdGUuZm9yY2UgPSAxOworCXN0YXRlLnF1aWV0ID0gMTsKKwlzdGF0ZS5yZWZyZXNoX2NhY2hlID0gMTsKKworCW1lbXNldCgmby0+cmVzdWx0LCAwLCBzaXplb2Yoby0+cmVzdWx0KSk7CisJaWYgKG8tPnNyY19pbmRleCkKKwkJby0+cmVzdWx0LnRpbWVzdGFtcCA9IG8tPnNyY19pbmRleC0+dGltZXN0YW1wOworCW8tPm1lcmdlX3NpemUgPSBsZW47CisKKwlpZiAoIWRmYykKKwkJZGZjID0geGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGNhY2hlX2VudHJ5KSArIDEpOworCW8tPmRmX2NvbmZsaWN0X2VudHJ5ID0gZGZjOworCisJaWYgKGxlbikgeworCQljb25zdCBjaGFyICpwcmVmaXggPSBvLT5wcmVmaXggPyBvLT5wcmVmaXggOiAiIjsKKwkJc3RydWN0IHRyYXZlcnNlX2luZm8gaW5mbzsKKworCQlzZXR1cF90cmF2ZXJzZV9pbmZvKCZpbmZvLCBwcmVmaXgpOworCQlpbmZvLmZuID0gdW5wYWNrX2NhbGxiYWNrOworCQlpbmZvLmRhdGEgPSBvOworCisJCWlmICh0cmF2ZXJzZV90cmVlcyhsZW4sIHQsICZpbmZvKSA8IDApCisJCQlyZXR1cm4gdW5wYWNrX2ZhaWxlZChvLCBOVUxMKTsKKwl9CisKKwkvKiBBbnkgbGVmdC1vdmVyIGVudHJpZXMgaW4gdGhlIGluZGV4PyAqLworCWlmIChvLT5tZXJnZSkgeworCQl3aGlsZSAoby0+cG9zIDwgby0+c3JjX2luZGV4LT5jYWNoZV9ucikgeworCQkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IG8tPnNyY19pbmRleC0+Y2FjaGVbby0+cG9zXTsKKwkJCWlmICh1bnBhY2tfaW5kZXhfZW50cnkoY2UsIG8pIDwgMCkKKwkJCQlyZXR1cm4gdW5wYWNrX2ZhaWxlZChvLCBOVUxMKTsKKwkJfQorCX0KKworCWlmIChvLT50cml2aWFsX21lcmdlc19vbmx5ICYmIG8tPm5vbnRyaXZpYWxfbWVyZ2UpCisJCXJldHVybiB1bnBhY2tfZmFpbGVkKG8sICJNZXJnZSByZXF1aXJlcyBmaWxlLWxldmVsIG1lcmdpbmciKTsKKworCW8tPnNyY19pbmRleCA9IE5VTEw7CisJaWYgKGNoZWNrX3VwZGF0ZXMobykpCisJCXJldHVybiAtMTsKKwlpZiAoby0+ZHN0X2luZGV4KQorCQkqby0+ZHN0X2luZGV4ID0gby0+cmVzdWx0OworCXJldHVybiAwOworfQorCisvKiBIZXJlIGNvbWUgdGhlIG1lcmdlIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IHJlamVjdF9tZXJnZShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlKQoreworCXJldHVybiBlcnJvcigiRW50cnkgJyVzJyB3b3VsZCBiZSBvdmVyd3JpdHRlbiBieSBtZXJnZS4gQ2Fubm90IG1lcmdlLiIsCisJCSAgICAgY2UtPm5hbWUpOworfQorCitzdGF0aWMgaW50IHNhbWUoc3RydWN0IGNhY2hlX2VudHJ5ICphLCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmIpCit7CisJaWYgKCEhYSAhPSAhIWIpCisJCXJldHVybiAwOworCWlmICghYSAmJiAhYikKKwkJcmV0dXJuIDE7CisJcmV0dXJuIGEtPmNlX21vZGUgPT0gYi0+Y2VfbW9kZSAmJgorCSAgICAgICAhaGFzaGNtcChhLT5zaGExLCBiLT5zaGExKTsKK30KKworCisvKgorICogV2hlbiBhIENFIGdldHMgdHVybmVkIGludG8gYW4gdW5tZXJnZWQgZW50cnksIHdlCisgKiB3YW50IGl0IHRvIGJlIHVwLXRvLWRhdGUKKyAqLworc3RhdGljIGludCB2ZXJpZnlfdXB0b2RhdGUoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwKKwkJc3RydWN0IHVucGFja190cmVlc19vcHRpb25zICpvKQoreworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKG8tPmluZGV4X29ubHkgfHwgby0+cmVzZXQpCisJCXJldHVybiAwOworCisJaWYgKCFsc3RhdChjZS0+bmFtZSwgJnN0KSkgeworCQl1bnNpZ25lZCBjaGFuZ2VkID0gaWVfbWF0Y2hfc3RhdChvLT5zcmNfaW5kZXgsIGNlLCAmc3QsIENFX01BVENIX0lHTk9SRV9WQUxJRCk7CisJCWlmICghY2hhbmdlZCkKKwkJCXJldHVybiAwOworCQkvKgorCQkgKiBORUVEU1dPUks6IHRoZSBjdXJyZW50IGRlZmF1bHQgcG9saWN5IGlzIHRvIGFsbG93CisJCSAqIHN1Ym1vZHVsZSB0byBiZSBvdXQgb2Ygc3luYyB3cnQgdGhlIHN1cGVybW9kdWxlCisJCSAqIGluZGV4LiAgVGhpcyBuZWVkcyB0byBiZSB0aWdodGVuZWQgbGF0ZXIgZm9yCisJCSAqIHN1Ym1vZHVsZXMgdGhhdCBhcmUgbWFya2VkIHRvIGJlIGF1dG9tYXRpY2FsbHkKKwkJICogY2hlY2tlZCBvdXQuCisJCSAqLworCQlpZiAoU19JU0dJVExJTksoY2UtPmNlX21vZGUpKQorCQkJcmV0dXJuIDA7CisJCWVycm5vID0gMDsKKwl9CisJaWYgKGVycm5vID09IEVOT0VOVCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIG8tPmdlbnRseSA/IC0xIDoKKwkJZXJyb3IoIkVudHJ5ICclcycgbm90IHVwdG9kYXRlLiBDYW5ub3QgbWVyZ2UuIiwgY2UtPm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBpbnZhbGlkYXRlX2NlX3BhdGgoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgc3RydWN0IHVucGFja190cmVlc19vcHRpb25zICpvKQoreworCWlmIChjZSkKKwkJY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoby0+c3JjX2luZGV4LT5jYWNoZV90cmVlLCBjZS0+bmFtZSk7Cit9CisKKy8qCisgKiBDaGVjayB0aGF0IGNoZWNraW5nIG91dCBjZS0+c2hhMSBpbiBzdWJkaXIgY2UtPm5hbWUgaXMgbm90CisgKiBnb2luZyB0byBvdmVyd3JpdGUgYW55IHdvcmtpbmcgZmlsZXMuCisgKgorICogQ3VycmVudGx5LCBnaXQgZG9lcyBub3QgY2hlY2tvdXQgc3VicHJvamVjdHMgZHVyaW5nIGEgc3VwZXJwcm9qZWN0CisgKiBjaGVja291dCwgc28gaXQgaXMgbm90IGdvaW5nIHRvIG92ZXJ3cml0ZSBhbnl0aGluZy4KKyAqLworc3RhdGljIGludCB2ZXJpZnlfY2xlYW5fc3VibW9kdWxlKHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIGNvbnN0IGNoYXIgKmFjdGlvbiwKKwkJCQkgICAgICBzdHJ1Y3QgdW5wYWNrX3RyZWVzX29wdGlvbnMgKm8pCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X2NsZWFuX3N1YmRpcmVjdG9yeShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBjb25zdCBjaGFyICphY3Rpb24sCisJCQkJICAgICAgc3RydWN0IHVucGFja190cmVlc19vcHRpb25zICpvKQoreworCS8qCisJICogd2UgYXJlIGFib3V0IHRvIGV4dHJhY3QgImNlLT5uYW1lIjsgd2Ugd291bGQgbm90IHdhbnQgdG8gbG9zZQorCSAqIGFueXRoaW5nIGluIHRoZSBleGlzdGluZyBkaXJlY3RvcnkgdGhlcmUuCisJICovCisJaW50IG5hbWVsZW47CisJaW50IHBvcywgaTsKKwlzdHJ1Y3QgZGlyX3N0cnVjdCBkOworCWNoYXIgKnBhdGhidWY7CisJaW50IGNudCA9IDA7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKworCWlmIChTX0lTR0lUTElOSyhjZS0+Y2VfbW9kZSkgJiYKKwkgICAgcmVzb2x2ZV9naXRsaW5rX3JlZihjZS0+bmFtZSwgIkhFQUQiLCBzaGExKSA9PSAwKSB7CisJCS8qIElmIHdlIGFyZSBub3QgZ29pbmcgdG8gdXBkYXRlIHRoZSBzdWJtb2R1bGUsIHRoZW4KKwkJICogd2UgZG9uJ3QgY2FyZS4KKwkJICovCisJCWlmICghaGFzaGNtcChzaGExLCBjZS0+c2hhMSkpCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIHZlcmlmeV9jbGVhbl9zdWJtb2R1bGUoY2UsIGFjdGlvbiwgbyk7CisJfQorCisJLyoKKwkgKiBGaXJzdCBsZXQncyBtYWtlIHN1cmUgd2UgZG8gbm90IGhhdmUgYSBsb2NhbCBtb2RpZmljYXRpb24KKwkgKiBpbiB0aGF0IGRpcmVjdG9yeS4KKwkgKi8KKwluYW1lbGVuID0gc3RybGVuKGNlLT5uYW1lKTsKKwlwb3MgPSBpbmRleF9uYW1lX3BvcyhvLT5zcmNfaW5kZXgsIGNlLT5uYW1lLCBuYW1lbGVuKTsKKwlpZiAoMCA8PSBwb3MpCisJCXJldHVybiBjbnQ7IC8qIHdlIGhhdmUgaXQgYXMgbm9uZGlyZWN0b3J5ICovCisJcG9zID0gLXBvcyAtIDE7CisJZm9yIChpID0gcG9zOyBpIDwgby0+c3JjX2luZGV4LT5jYWNoZV9ucjsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBvLT5zcmNfaW5kZXgtPmNhY2hlW2ldOworCQlpbnQgbGVuID0gY2VfbmFtZWxlbihjZSk7CisJCWlmIChsZW4gPCBuYW1lbGVuIHx8CisJCSAgICBzdHJuY21wKGNlLT5uYW1lLCBjZS0+bmFtZSwgbmFtZWxlbikgfHwKKwkJICAgIGNlLT5uYW1lW25hbWVsZW5dICE9ICcvJykKKwkJCWJyZWFrOworCQkvKgorCQkgKiBjZS0+bmFtZSBpcyBhbiBlbnRyeSBpbiB0aGUgc3ViZGlyZWN0b3J5LgorCQkgKi8KKwkJaWYgKCFjZV9zdGFnZShjZSkpIHsKKwkJCWlmICh2ZXJpZnlfdXB0b2RhdGUoY2UsIG8pKQorCQkJCXJldHVybiAtMTsKKwkJCWFkZF9lbnRyeShvLCBjZSwgQ0VfUkVNT1ZFLCAwKTsKKwkJfQorCQljbnQrKzsKKwl9CisKKwkvKgorCSAqIFRoZW4gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3QgbG9zZSBhIGxvY2FsbHkKKwkgKiBwcmVzZW50IGZpbGUgdGhhdCBpcyBub3QgaWdub3JlZC4KKwkgKi8KKwlwYXRoYnVmID0geG1hbGxvYyhuYW1lbGVuICsgMik7CisJbWVtY3B5KHBhdGhidWYsIGNlLT5uYW1lLCBuYW1lbGVuKTsKKwlzdHJjcHkocGF0aGJ1ZituYW1lbGVuLCAiLyIpOworCisJbWVtc2V0KCZkLCAwLCBzaXplb2YoZCkpOworCWlmIChvLT5kaXIpCisJCWQuZXhjbHVkZV9wZXJfZGlyID0gby0+ZGlyLT5leGNsdWRlX3Blcl9kaXI7CisJaSA9IHJlYWRfZGlyZWN0b3J5KCZkLCBjZS0+bmFtZSwgcGF0aGJ1ZiwgbmFtZWxlbisxLCBOVUxMKTsKKwlpZiAoaSkKKwkJcmV0dXJuIG8tPmdlbnRseSA/IC0xIDoKKwkJCWVycm9yKCJVcGRhdGluZyAnJXMnIHdvdWxkIGxvc2UgdW50cmFja2VkIGZpbGVzIGluIGl0IiwKKwkJCSAgICAgIGNlLT5uYW1lKTsKKwlmcmVlKHBhdGhidWYpOworCXJldHVybiBjbnQ7Cit9CisKKy8qCisgKiBXZSBkbyBub3Qgd2FudCB0byByZW1vdmUgb3Igb3ZlcndyaXRlIGEgd29ya2luZyB0cmVlIGZpbGUgdGhhdAorICogaXMgbm90IHRyYWNrZWQsIHVubGVzcyBpdCBpcyBpZ25vcmVkLgorICovCitzdGF0aWMgaW50IHZlcmlmeV9hYnNlbnQoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgY29uc3QgY2hhciAqYWN0aW9uLAorCQkJIHN0cnVjdCB1bnBhY2tfdHJlZXNfb3B0aW9ucyAqbykKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChvLT5pbmRleF9vbmx5IHx8IG8tPnJlc2V0IHx8ICFvLT51cGRhdGUpCisJCXJldHVybiAwOworCisJaWYgKGhhc19zeW1saW5rX2xlYWRpbmdfcGF0aChjZS0+bmFtZSwgTlVMTCkpCisJCXJldHVybiAwOworCisJaWYgKCFsc3RhdChjZS0+bmFtZSwgJnN0KSkgeworCQlpbnQgY250OworCQlpbnQgZHR5cGUgPSBjZV90b19kdHlwZShjZSk7CisKKwkJaWYgKG8tPmRpciAmJiBleGNsdWRlZChvLT5kaXIsIGNlLT5uYW1lLCAmZHR5cGUpKQorCQkJLyoKKwkJCSAqIGNlLT5uYW1lIGlzIGV4cGxpY2l0bHkgZXhjbHVkZWQsIHNvIGl0IGlzIE9rIHRvCisJCQkgKiBvdmVyd3JpdGUgaXQuCisJCQkgKi8KKwkJCXJldHVybiAwOworCQlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJLyoKKwkJCSAqIFdlIGFyZSBjaGVja2luZyBvdXQgcGF0aCAiZm9vIiBhbmQKKwkJCSAqIGZvdW5kICJmb28vLiIgaW4gdGhlIHdvcmtpbmcgdHJlZS4KKwkJCSAqIFRoaXMgaXMgdHJpY2t5IC0tIGlmIHdlIGhhdmUgbW9kaWZpZWQKKwkJCSAqIGZpbGVzIHRoYXQgYXJlIGluICJmb28vIiB3ZSB3b3VsZCBsb3NlCisJCQkgKiBpdC4KKwkJCSAqLworCQkJY250ID0gdmVyaWZ5X2NsZWFuX3N1YmRpcmVjdG9yeShjZSwgYWN0aW9uLCBvKTsKKworCQkJLyoKKwkJCSAqIElmIHRoaXMgcmVtb3ZlZCBlbnRyaWVzIGZyb20gdGhlIGluZGV4LAorCQkJICogd2hhdCB0aGF0IG1lYW5zIGlzOgorCQkJICoKKwkJCSAqICgxKSB0aGUgY2FsbGVyIHVucGFja190cmVlc19yZWMoKSBzYXcgcGF0aC9mb28KKwkJCSAqIGluIHRoZSBpbmRleCwgYW5kIGl0IGhhcyBub3QgcmVtb3ZlZCBpdCBiZWNhdXNlCisJCQkgKiBpdCB0aGlua3MgaXQgaXMgaGFuZGxpbmcgJ3BhdGgnIGFzIGJsb2Igd2l0aAorCQkJICogRC9GIGNvbmZsaWN0OworCQkJICogKDIpIHdlIHdpbGwgcmV0dXJuICJvaywgd2UgcGxhY2VkIGEgbWVyZ2VkIGVudHJ5CisJCQkgKiBpbiB0aGUgaW5kZXgiIHdoaWNoIHdvdWxkIGNhdXNlIG8tPnBvcyB0byBiZQorCQkJICogaW5jcmVtZW50ZWQgYnkgb25lOworCQkJICogKDMpIGhvd2V2ZXIsIG9yaWdpbmFsIG8tPnBvcyBub3cgaGFzICdwYXRoL2ZvbycKKwkJCSAqIG1hcmtlZCB3aXRoICJ0byBiZSByZW1vdmVkIi4KKwkJCSAqCisJCQkgKiBXZSBuZWVkIHRvIGluY3JlbWVudCBpdCBieSB0aGUgbnVtYmVyIG9mCisJCQkgKiBkZWxldGVkIGVudHJpZXMgaGVyZS4KKwkJCSAqLworCQkJby0+cG9zICs9IGNudDsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyoKKwkJICogVGhlIHByZXZpb3VzIHJvdW5kIG1heSBhbHJlYWR5IGhhdmUgZGVjaWRlZCB0bworCQkgKiBkZWxldGUgdGhpcyBwYXRoLCB3aGljaCBpcyBpbiBhIHN1YmRpcmVjdG9yeSB0aGF0CisJCSAqIGlzIGJlaW5nIHJlcGxhY2VkIHdpdGggYSBibG9iLgorCQkgKi8KKwkJY250ID0gaW5kZXhfbmFtZV9wb3MoJm8tPnJlc3VsdCwgY2UtPm5hbWUsIHN0cmxlbihjZS0+bmFtZSkpOworCQlpZiAoMCA8PSBjbnQpIHsKKwkJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBvLT5yZXN1bHQuY2FjaGVbY250XTsKKwkJCWlmIChjZS0+Y2VfZmxhZ3MgJiBDRV9SRU1PVkUpCisJCQkJcmV0dXJuIDA7CisJCX0KKworCQlyZXR1cm4gby0+Z2VudGx5ID8gLTEgOgorCQkJZXJyb3IoIlVudHJhY2tlZCB3b3JraW5nIHRyZWUgZmlsZSAnJXMnICIKKwkJCSAgICAgICJ3b3VsZCBiZSAlcyBieSBtZXJnZS4iLCBjZS0+bmFtZSwgYWN0aW9uKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVyZ2VkX2VudHJ5KHN0cnVjdCBjYWNoZV9lbnRyeSAqbWVyZ2UsIHN0cnVjdCBjYWNoZV9lbnRyeSAqb2xkLAorCQlzdHJ1Y3QgdW5wYWNrX3RyZWVzX29wdGlvbnMgKm8pCit7CisJaW50IHVwZGF0ZSA9IENFX1VQREFURTsKKworCWlmIChvbGQpIHsKKwkJLyoKKwkJICogU2VlIGlmIHdlIGNhbiByZS11c2UgdGhlIG9sZCBDRSBkaXJlY3RseT8KKwkJICogVGhhdCB3YXkgd2UgZ2V0IHRoZSB1cHRvZGF0ZSBzdGF0IGluZm8uCisJCSAqCisJCSAqIFRoaXMgYWxzbyByZW1vdmVzIHRoZSBVUERBVEUgZmxhZyBvbiBhIG1hdGNoOyBvdGhlcndpc2UKKwkJICogd2Ugd2lsbCBlbmQgdXAgb3ZlcndyaXRpbmcgbG9jYWwgY2hhbmdlcyBpbiB0aGUgd29yayB0cmVlLgorCQkgKi8KKwkJaWYgKHNhbWUob2xkLCBtZXJnZSkpIHsKKwkJCWNvcHlfY2FjaGVfZW50cnkobWVyZ2UsIG9sZCk7CisJCQl1cGRhdGUgPSAwOworCQl9IGVsc2UgeworCQkJaWYgKHZlcmlmeV91cHRvZGF0ZShvbGQsIG8pKQorCQkJCXJldHVybiAtMTsKKwkJCWludmFsaWRhdGVfY2VfcGF0aChvbGQsIG8pOworCQl9CisJfQorCWVsc2UgeworCQlpZiAodmVyaWZ5X2Fic2VudChtZXJnZSwgIm92ZXJ3cml0dGVuIiwgbykpCisJCQlyZXR1cm4gLTE7CisJCWludmFsaWRhdGVfY2VfcGF0aChtZXJnZSwgbyk7CisJfQorCisJYWRkX2VudHJ5KG8sIG1lcmdlLCB1cGRhdGUsIENFX1NUQUdFTUFTSyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZGVsZXRlZF9lbnRyeShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBzdHJ1Y3QgY2FjaGVfZW50cnkgKm9sZCwKKwkJc3RydWN0IHVucGFja190cmVlc19vcHRpb25zICpvKQoreworCS8qIERpZCBpdCBleGlzdCBpbiB0aGUgaW5kZXg/ICovCisJaWYgKCFvbGQpIHsKKwkJaWYgKHZlcmlmeV9hYnNlbnQoY2UsICJyZW1vdmVkIiwgbykpCisJCQlyZXR1cm4gLTE7CisJCXJldHVybiAwOworCX0KKwlpZiAodmVyaWZ5X3VwdG9kYXRlKG9sZCwgbykpCisJCXJldHVybiAtMTsKKwlhZGRfZW50cnkobywgY2UsIENFX1JFTU9WRSwgMCk7CisJaW52YWxpZGF0ZV9jZV9wYXRoKGNlLCBvKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBrZWVwX2VudHJ5KHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIHN0cnVjdCB1bnBhY2tfdHJlZXNfb3B0aW9ucyAqbykKK3sKKwlhZGRfZW50cnkobywgY2UsIDAsIDApOworCXJldHVybiAxOworfQorCisjaWYgREJSVF9ERUJVRworc3RhdGljIHZvaWQgc2hvd19zdGFnZV9lbnRyeShGSUxFICpvLAorCQkJICAgICBjb25zdCBjaGFyICpsYWJlbCwgY29uc3Qgc3RydWN0IGNhY2hlX2VudHJ5ICpjZSkKK3sKKwlpZiAoIWNlKQorCQlmcHJpbnRmKG8sICIlcyAobWlzc2luZylcbiIsIGxhYmVsKTsKKwllbHNlCisJCWZwcmludGYobywgIiVzJTA2byAlcyAlZFx0JXNcbiIsCisJCQlsYWJlbCwKKwkJCWNlLT5jZV9tb2RlLAorCQkJc2hhMV90b19oZXgoY2UtPnNoYTEpLAorCQkJY2Vfc3RhZ2UoY2UpLAorCQkJY2UtPm5hbWUpOworfQorI2VuZGlmCisKK2ludCB0aHJlZXdheV9tZXJnZShzdHJ1Y3QgY2FjaGVfZW50cnkgKipzdGFnZXMsIHN0cnVjdCB1bnBhY2tfdHJlZXNfb3B0aW9ucyAqbykKK3sKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmluZGV4OworCXN0cnVjdCBjYWNoZV9lbnRyeSAqaGVhZDsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKnJlbW90ZSA9IHN0YWdlc1tvLT5oZWFkX2lkeCArIDFdOworCWludCBjb3VudDsKKwlpbnQgaGVhZF9tYXRjaCA9IDA7CisJaW50IHJlbW90ZV9tYXRjaCA9IDA7CisKKwlpbnQgZGZfY29uZmxpY3RfaGVhZCA9IDA7CisJaW50IGRmX2NvbmZsaWN0X3JlbW90ZSA9IDA7CisKKwlpbnQgYW55X2FuY19taXNzaW5nID0gMDsKKwlpbnQgbm9fYW5jX2V4aXN0cyA9IDE7CisJaW50IGk7CisKKwlmb3IgKGkgPSAxOyBpIDwgby0+aGVhZF9pZHg7IGkrKykgeworCQlpZiAoIXN0YWdlc1tpXSB8fCBzdGFnZXNbaV0gPT0gby0+ZGZfY29uZmxpY3RfZW50cnkpCisJCQlhbnlfYW5jX21pc3NpbmcgPSAxOworCQllbHNlCisJCQlub19hbmNfZXhpc3RzID0gMDsKKwl9CisKKwlpbmRleCA9IHN0YWdlc1swXTsKKwloZWFkID0gc3RhZ2VzW28tPmhlYWRfaWR4XTsKKworCWlmIChoZWFkID09IG8tPmRmX2NvbmZsaWN0X2VudHJ5KSB7CisJCWRmX2NvbmZsaWN0X2hlYWQgPSAxOworCQloZWFkID0gTlVMTDsKKwl9CisKKwlpZiAocmVtb3RlID09IG8tPmRmX2NvbmZsaWN0X2VudHJ5KSB7CisJCWRmX2NvbmZsaWN0X3JlbW90ZSA9IDE7CisJCXJlbW90ZSA9IE5VTEw7CisJfQorCisJLyogRmlyc3QsIGlmIHRoZXJlJ3MgYSAjMTYgc2l0dWF0aW9uLCBub3RlIHRoYXQgdG8gcHJldmVudCAjMTMKKwkgKiBhbmQgIzE0LgorCSAqLworCWlmICghc2FtZShyZW1vdGUsIGhlYWQpKSB7CisJCWZvciAoaSA9IDE7IGkgPCBvLT5oZWFkX2lkeDsgaSsrKSB7CisJCQlpZiAoc2FtZShzdGFnZXNbaV0sIGhlYWQpKSB7CisJCQkJaGVhZF9tYXRjaCA9IGk7CisJCQl9CisJCQlpZiAoc2FtZShzdGFnZXNbaV0sIHJlbW90ZSkpIHsKKwkJCQlyZW1vdGVfbWF0Y2ggPSBpOworCQkJfQorCQl9CisJfQorCisJLyogV2Ugc3RhcnQgd2l0aCBjYXNlcyB3aGVyZSB0aGUgaW5kZXggaXMgYWxsb3dlZCB0byBtYXRjaAorCSAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBoZWFkOiAjMTQoQUxUKSBhbmQgIzJBTFQsIHdoZXJlIGl0CisJICogaXMgcGVybWl0dGVkIHRvIG1hdGNoIHRoZSByZXN1bHQgaW5zdGVhZC4KKwkgKi8KKwkvKiAjMTQsICMxNEFMVCwgIzJBTFQgKi8KKwlpZiAocmVtb3RlICYmICFkZl9jb25mbGljdF9oZWFkICYmIGhlYWRfbWF0Y2ggJiYgIXJlbW90ZV9tYXRjaCkgeworCQlpZiAoaW5kZXggJiYgIXNhbWUoaW5kZXgsIHJlbW90ZSkgJiYgIXNhbWUoaW5kZXgsIGhlYWQpKQorCQkJcmV0dXJuIG8tPmdlbnRseSA/IC0xIDogcmVqZWN0X21lcmdlKGluZGV4KTsKKwkJcmV0dXJuIG1lcmdlZF9lbnRyeShyZW1vdGUsIGluZGV4LCBvKTsKKwl9CisJLyoKKwkgKiBJZiB3ZSBoYXZlIGFuIGVudHJ5IGluIHRoZSBpbmRleCBjYWNoZSwgdGhlbiB3ZSB3YW50IHRvCisJICogbWFrZSBzdXJlIHRoYXQgaXQgbWF0Y2hlcyBoZWFkLgorCSAqLworCWlmIChpbmRleCAmJiAhc2FtZShpbmRleCwgaGVhZCkpCisJCXJldHVybiBvLT5nZW50bHkgPyAtMSA6IHJlamVjdF9tZXJnZShpbmRleCk7CisKKwlpZiAoaGVhZCkgeworCQkvKiAjNUFMVCwgIzE1ICovCisJCWlmIChzYW1lKGhlYWQsIHJlbW90ZSkpCisJCQlyZXR1cm4gbWVyZ2VkX2VudHJ5KGhlYWQsIGluZGV4LCBvKTsKKwkJLyogIzEzLCAjM0FMVCAqLworCQlpZiAoIWRmX2NvbmZsaWN0X3JlbW90ZSAmJiByZW1vdGVfbWF0Y2ggJiYgIWhlYWRfbWF0Y2gpCisJCQlyZXR1cm4gbWVyZ2VkX2VudHJ5KGhlYWQsIGluZGV4LCBvKTsKKwl9CisKKwkvKiAjMSAqLworCWlmICghaGVhZCAmJiAhcmVtb3RlICYmIGFueV9hbmNfbWlzc2luZykKKwkJcmV0dXJuIDA7CisKKwkvKiBVbmRlciB0aGUgbmV3ICJhZ2dyZXNzaXZlIiBydWxlLCB3ZSByZXNvbHZlIG1vc3RseSB0cml2aWFsCisJICogY2FzZXMgdGhhdCB3ZSBoaXN0b3JpY2FsbHkgaGFkIGdpdC1tZXJnZS1vbmUtZmlsZSByZXNvbHZlLgorCSAqLworCWlmIChvLT5hZ2dyZXNzaXZlKSB7CisJCWludCBoZWFkX2RlbGV0ZWQgPSAhaGVhZCAmJiAhZGZfY29uZmxpY3RfaGVhZDsKKwkJaW50IHJlbW90ZV9kZWxldGVkID0gIXJlbW90ZSAmJiAhZGZfY29uZmxpY3RfcmVtb3RlOworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gTlVMTDsKKworCQlpZiAoaW5kZXgpCisJCQljZSA9IGluZGV4OworCQllbHNlIGlmIChoZWFkKQorCQkJY2UgPSBoZWFkOworCQllbHNlIGlmIChyZW1vdGUpCisJCQljZSA9IHJlbW90ZTsKKwkJZWxzZSB7CisJCQlmb3IgKGkgPSAxOyBpIDwgby0+aGVhZF9pZHg7IGkrKykgeworCQkJCWlmIChzdGFnZXNbaV0gJiYgc3RhZ2VzW2ldICE9IG8tPmRmX2NvbmZsaWN0X2VudHJ5KSB7CisJCQkJCWNlID0gc3RhZ2VzW2ldOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBEZWxldGVkIGluIGJvdGguCisJCSAqIERlbGV0ZWQgaW4gb25lIGFuZCB1bmNoYW5nZWQgaW4gdGhlIG90aGVyLgorCQkgKi8KKwkJaWYgKChoZWFkX2RlbGV0ZWQgJiYgcmVtb3RlX2RlbGV0ZWQpIHx8CisJCSAgICAoaGVhZF9kZWxldGVkICYmIHJlbW90ZSAmJiByZW1vdGVfbWF0Y2gpIHx8CisJCSAgICAocmVtb3RlX2RlbGV0ZWQgJiYgaGVhZCAmJiBoZWFkX21hdGNoKSkgeworCQkJaWYgKGluZGV4KQorCQkJCXJldHVybiBkZWxldGVkX2VudHJ5KGluZGV4LCBpbmRleCwgbyk7CisJCQlpZiAoY2UgJiYgIWhlYWRfZGVsZXRlZCkgeworCQkJCWlmICh2ZXJpZnlfYWJzZW50KGNlLCAicmVtb3ZlZCIsIG8pKQorCQkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKgorCQkgKiBBZGRlZCBpbiBib3RoLCBpZGVudGljYWxseS4KKwkJICovCisJCWlmIChub19hbmNfZXhpc3RzICYmIGhlYWQgJiYgcmVtb3RlICYmIHNhbWUoaGVhZCwgcmVtb3RlKSkKKwkJCXJldHVybiBtZXJnZWRfZW50cnkoaGVhZCwgaW5kZXgsIG8pOworCisJfQorCisJLyogQmVsb3cgYXJlICJubyBtZXJnZSIgY2FzZXMsIHdoaWNoIHJlcXVpcmUgdGhhdCB0aGUgaW5kZXggYmUKKwkgKiB1cC10by1kYXRlIHRvIGF2b2lkIHRoZSBmaWxlcyBnZXR0aW5nIG92ZXJ3cml0dGVuIHdpdGgKKwkgKiBjb25mbGljdCByZXNvbHV0aW9uIGZpbGVzLgorCSAqLworCWlmIChpbmRleCkgeworCQlpZiAodmVyaWZ5X3VwdG9kYXRlKGluZGV4LCBvKSkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlvLT5ub250cml2aWFsX21lcmdlID0gMTsKKworCS8qICMyLCAjMywgIzQsICM2LCAjNywgIzksICMxMCwgIzExLiAqLworCWNvdW50ID0gMDsKKwlpZiAoIWhlYWRfbWF0Y2ggfHwgIXJlbW90ZV9tYXRjaCkgeworCQlmb3IgKGkgPSAxOyBpIDwgby0+aGVhZF9pZHg7IGkrKykgeworCQkJaWYgKHN0YWdlc1tpXSAmJiBzdGFnZXNbaV0gIT0gby0+ZGZfY29uZmxpY3RfZW50cnkpIHsKKwkJCQlrZWVwX2VudHJ5KHN0YWdlc1tpXSwgbyk7CisJCQkJY291bnQrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKyNpZiBEQlJUX0RFQlVHCisJZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAicmVhZC10cmVlOiB3YXJuaW5nICMxNiBkZXRlY3RlZFxuIik7CisJCXNob3dfc3RhZ2VfZW50cnkoc3RkZXJyLCAiaGVhZCAgICIsIHN0YWdlc1toZWFkX21hdGNoXSk7CisJCXNob3dfc3RhZ2VfZW50cnkoc3RkZXJyLCAicmVtb3RlICIsIHN0YWdlc1tyZW1vdGVfbWF0Y2hdKTsKKwl9CisjZW5kaWYKKwlpZiAoaGVhZCkgeyBjb3VudCArPSBrZWVwX2VudHJ5KGhlYWQsIG8pOyB9CisJaWYgKHJlbW90ZSkgeyBjb3VudCArPSBrZWVwX2VudHJ5KHJlbW90ZSwgbyk7IH0KKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qCisgKiBUd28td2F5IG1lcmdlLgorICoKKyAqIFRoZSBydWxlIGlzIHRvICJjYXJyeSBmb3J3YXJkIiB3aGF0IGlzIGluIHRoZSBpbmRleCB3aXRob3V0IGxvc2luZworICogaW5mb3JtYXRpb24gYWNyb3NzIGEgImZhc3QgZm9yd2FyZCIsIGZhdm9yaW5nIGEgc3VjY2Vzc2Z1bCBtZXJnZQorICogb3ZlciBhIG1lcmdlIGZhaWx1cmUgd2hlbiBpdCBtYWtlcyBzZW5zZS4gIEZvciBkZXRhaWxzIG9mIHRoZQorICogImNhcnJ5IGZvcndhcmQiIHJ1bGUsIHBsZWFzZSBzZWUgPERvY3VtZW50YXRpb24vZ2l0LXJlYWQtdHJlZS50eHQ+LgorICoKKyAqLworaW50IHR3b3dheV9tZXJnZShzdHJ1Y3QgY2FjaGVfZW50cnkgKipzcmMsIHN0cnVjdCB1bnBhY2tfdHJlZXNfb3B0aW9ucyAqbykKK3sKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmN1cnJlbnQgPSBzcmNbMF07CisJc3RydWN0IGNhY2hlX2VudHJ5ICpvbGR0cmVlID0gc3JjWzFdOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqbmV3dHJlZSA9IHNyY1syXTsKKworCWlmIChvLT5tZXJnZV9zaXplICE9IDIpCisJCXJldHVybiBlcnJvcigiQ2Fubm90IGRvIGEgdHdvd2F5IG1lcmdlIG9mICVkIHRyZWVzIiwKKwkJCSAgICAgby0+bWVyZ2Vfc2l6ZSk7CisKKwlpZiAob2xkdHJlZSA9PSBvLT5kZl9jb25mbGljdF9lbnRyeSkKKwkJb2xkdHJlZSA9IE5VTEw7CisJaWYgKG5ld3RyZWUgPT0gby0+ZGZfY29uZmxpY3RfZW50cnkpCisJCW5ld3RyZWUgPSBOVUxMOworCisJaWYgKGN1cnJlbnQpIHsKKwkJaWYgKCghb2xkdHJlZSAmJiAhbmV3dHJlZSkgfHwgLyogNCBhbmQgNSAqLworCQkgICAgKCFvbGR0cmVlICYmIG5ld3RyZWUgJiYKKwkJICAgICBzYW1lKGN1cnJlbnQsIG5ld3RyZWUpKSB8fCAvKiA2IGFuZCA3ICovCisJCSAgICAob2xkdHJlZSAmJiBuZXd0cmVlICYmCisJCSAgICAgc2FtZShvbGR0cmVlLCBuZXd0cmVlKSkgfHwgLyogMTQgYW5kIDE1ICovCisJCSAgICAob2xkdHJlZSAmJiBuZXd0cmVlICYmCisJCSAgICAgIXNhbWUob2xkdHJlZSwgbmV3dHJlZSkgJiYgLyogMTggYW5kIDE5ICovCisJCSAgICAgc2FtZShjdXJyZW50LCBuZXd0cmVlKSkpIHsKKwkJCXJldHVybiBrZWVwX2VudHJ5KGN1cnJlbnQsIG8pOworCQl9CisJCWVsc2UgaWYgKG9sZHRyZWUgJiYgIW5ld3RyZWUgJiYgc2FtZShjdXJyZW50LCBvbGR0cmVlKSkgeworCQkJLyogMTAgb3IgMTEgKi8KKwkJCXJldHVybiBkZWxldGVkX2VudHJ5KG9sZHRyZWUsIGN1cnJlbnQsIG8pOworCQl9CisJCWVsc2UgaWYgKG9sZHRyZWUgJiYgbmV3dHJlZSAmJgorCQkJIHNhbWUoY3VycmVudCwgb2xkdHJlZSkgJiYgIXNhbWUoY3VycmVudCwgbmV3dHJlZSkpIHsKKwkJCS8qIDIwIG9yIDIxICovCisJCQlyZXR1cm4gbWVyZ2VkX2VudHJ5KG5ld3RyZWUsIGN1cnJlbnQsIG8pOworCQl9CisJCWVsc2UgeworCQkJLyogYWxsIG90aGVyIGZhaWx1cmVzICovCisJCQlpZiAob2xkdHJlZSkKKwkJCQlyZXR1cm4gby0+Z2VudGx5ID8gLTEgOiByZWplY3RfbWVyZ2Uob2xkdHJlZSk7CisJCQlpZiAoY3VycmVudCkKKwkJCQlyZXR1cm4gby0+Z2VudGx5ID8gLTEgOiByZWplY3RfbWVyZ2UoY3VycmVudCk7CisJCQlpZiAobmV3dHJlZSkKKwkJCQlyZXR1cm4gby0+Z2VudGx5ID8gLTEgOiByZWplY3RfbWVyZ2UobmV3dHJlZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJZWxzZSBpZiAobmV3dHJlZSkKKwkJcmV0dXJuIG1lcmdlZF9lbnRyeShuZXd0cmVlLCBjdXJyZW50LCBvKTsKKwlyZXR1cm4gZGVsZXRlZF9lbnRyeShvbGR0cmVlLCBjdXJyZW50LCBvKTsKK30KKworLyoKKyAqIEJpbmQgbWVyZ2UuCisgKgorICogS2VlcCB0aGUgaW5kZXggZW50cmllcyBhdCBzdGFnZTAsIGNvbGxhcHNlIHN0YWdlMSBidXQgbWFrZSBzdXJlCisgKiBzdGFnZTAgZG9lcyBub3QgaGF2ZSBhbnl0aGluZyB0aGVyZS4KKyAqLworaW50IGJpbmRfbWVyZ2Uoc3RydWN0IGNhY2hlX2VudHJ5ICoqc3JjLAorCQlzdHJ1Y3QgdW5wYWNrX3RyZWVzX29wdGlvbnMgKm8pCit7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpvbGQgPSBzcmNbMF07CisJc3RydWN0IGNhY2hlX2VudHJ5ICphID0gc3JjWzFdOworCisJaWYgKG8tPm1lcmdlX3NpemUgIT0gMSkKKwkJcmV0dXJuIGVycm9yKCJDYW5ub3QgZG8gYSBiaW5kIG1lcmdlIG9mICVkIHRyZWVzXG4iLAorCQkJICAgICBvLT5tZXJnZV9zaXplKTsKKwlpZiAoYSAmJiBvbGQpCisJCXJldHVybiBvLT5nZW50bHkgPyAtMSA6CisJCQllcnJvcigiRW50cnkgJyVzJyBvdmVybGFwcyB3aXRoICclcycuICBDYW5ub3QgYmluZC4iLCBhLT5uYW1lLCBvbGQtPm5hbWUpOworCWlmICghYSkKKwkJcmV0dXJuIGtlZXBfZW50cnkob2xkLCBvKTsKKwllbHNlCisJCXJldHVybiBtZXJnZWRfZW50cnkoYSwgTlVMTCwgbyk7Cit9CisKKy8qCisgKiBPbmUtd2F5IG1lcmdlLgorICoKKyAqIFRoZSBydWxlIGlzOgorICogLSB0YWtlIHRoZSBzdGF0IGluZm9ybWF0aW9uIGZyb20gc3RhZ2UwLCB0YWtlIHRoZSBkYXRhIGZyb20gc3RhZ2UxCisgKi8KK2ludCBvbmV3YXlfbWVyZ2Uoc3RydWN0IGNhY2hlX2VudHJ5ICoqc3JjLCBzdHJ1Y3QgdW5wYWNrX3RyZWVzX29wdGlvbnMgKm8pCit7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpvbGQgPSBzcmNbMF07CisJc3RydWN0IGNhY2hlX2VudHJ5ICphID0gc3JjWzFdOworCisJaWYgKG8tPm1lcmdlX3NpemUgIT0gMSkKKwkJcmV0dXJuIGVycm9yKCJDYW5ub3QgZG8gYSBvbmV3YXkgbWVyZ2Ugb2YgJWQgdHJlZXMiLAorCQkJICAgICBvLT5tZXJnZV9zaXplKTsKKworCWlmICghYSkKKwkJcmV0dXJuIGRlbGV0ZWRfZW50cnkob2xkLCBvbGQsIG8pOworCisJaWYgKG9sZCAmJiBzYW1lKG9sZCwgYSkpIHsKKwkJaW50IHVwZGF0ZSA9IDA7CisJCWlmIChvLT5yZXNldCkgeworCQkJc3RydWN0IHN0YXQgc3Q7CisJCQlpZiAobHN0YXQob2xkLT5uYW1lLCAmc3QpIHx8CisJCQkgICAgaWVfbWF0Y2hfc3RhdChvLT5zcmNfaW5kZXgsIG9sZCwgJnN0LCBDRV9NQVRDSF9JR05PUkVfVkFMSUQpKQorCQkJCXVwZGF0ZSB8PSBDRV9VUERBVEU7CisJCX0KKwkJYWRkX2VudHJ5KG8sIG9sZCwgdXBkYXRlLCAwKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBtZXJnZWRfZW50cnkoYSwgb2xkLCBvKTsKK30KZGlmZiAtLWdpdCBhL3VucGFjay10cmVlcy5oIGIvdW5wYWNrLXRyZWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA0NTNlZAotLS0gL2Rldi9udWxsCisrKyBiL3VucGFjay10cmVlcy5oCkBAIC0wLDAgKzEsNDYgQEAKKyNpZm5kZWYgVU5QQUNLX1RSRUVTX0gKKyNkZWZpbmUgVU5QQUNLX1RSRUVTX0gKKworI2RlZmluZSBNQVhfVU5QQUNLX1RSRUVTIDgKKworc3RydWN0IHVucGFja190cmVlc19vcHRpb25zOworCit0eXBlZGVmIGludCAoKm1lcmdlX2ZuX3QpKHN0cnVjdCBjYWNoZV9lbnRyeSAqKnNyYywKKwkJc3RydWN0IHVucGFja190cmVlc19vcHRpb25zICpvcHRpb25zKTsKKworc3RydWN0IHVucGFja190cmVlc19vcHRpb25zIHsKKwlpbnQgcmVzZXQ7CisJaW50IG1lcmdlOworCWludCB1cGRhdGU7CisJaW50IGluZGV4X29ubHk7CisJaW50IG5vbnRyaXZpYWxfbWVyZ2U7CisJaW50IHRyaXZpYWxfbWVyZ2VzX29ubHk7CisJaW50IHZlcmJvc2VfdXBkYXRlOworCWludCBhZ2dyZXNzaXZlOworCWludCBza2lwX3VubWVyZ2VkOworCWludCBnZW50bHk7CisJY29uc3QgY2hhciAqcHJlZml4OworCWludCBwb3M7CisJc3RydWN0IGRpcl9zdHJ1Y3QgKmRpcjsKKwltZXJnZV9mbl90IGZuOworCisJaW50IGhlYWRfaWR4OworCWludCBtZXJnZV9zaXplOworCisJc3RydWN0IGNhY2hlX2VudHJ5ICpkZl9jb25mbGljdF9lbnRyeTsKKwl2b2lkICp1bnBhY2tfZGF0YTsKKworCXN0cnVjdCBpbmRleF9zdGF0ZSAqZHN0X2luZGV4OworCWNvbnN0IHN0cnVjdCBpbmRleF9zdGF0ZSAqc3JjX2luZGV4OworCXN0cnVjdCBpbmRleF9zdGF0ZSByZXN1bHQ7Cit9OworCitleHRlcm4gaW50IHVucGFja190cmVlcyh1bnNpZ25lZCBuLCBzdHJ1Y3QgdHJlZV9kZXNjICp0LAorCQlzdHJ1Y3QgdW5wYWNrX3RyZWVzX29wdGlvbnMgKm9wdGlvbnMpOworCitpbnQgdGhyZWV3YXlfbWVyZ2Uoc3RydWN0IGNhY2hlX2VudHJ5ICoqc3RhZ2VzLCBzdHJ1Y3QgdW5wYWNrX3RyZWVzX29wdGlvbnMgKm8pOworaW50IHR3b3dheV9tZXJnZShzdHJ1Y3QgY2FjaGVfZW50cnkgKipzcmMsIHN0cnVjdCB1bnBhY2tfdHJlZXNfb3B0aW9ucyAqbyk7CitpbnQgYmluZF9tZXJnZShzdHJ1Y3QgY2FjaGVfZW50cnkgKipzcmMsIHN0cnVjdCB1bnBhY2tfdHJlZXNfb3B0aW9ucyAqbyk7CitpbnQgb25ld2F5X21lcmdlKHN0cnVjdCBjYWNoZV9lbnRyeSAqKnNyYywgc3RydWN0IHVucGFja190cmVlc19vcHRpb25zICpvKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91cGRhdGUtc2VydmVyLWluZm8uYyBiL3VwZGF0ZS1zZXJ2ZXItaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNmMzODMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUtc2VydmVyLWluZm8uYwpAQCAtMCwwICsxLDI1IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgdXBkYXRlX3NlcnZlcl9pbmZvX3VzYWdlW10gPQorImdpdC11cGRhdGUtc2VydmVyLWluZm8gWy0tZm9yY2VdIjsKKworaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCit7CisJaW50IGk7CisJaW50IGZvcmNlID0gMDsKKwlmb3IgKGkgPSAxOyBpIDwgYWM7IGkrKykgeworCQlpZiAoYXZbaV1bMF0gPT0gJy0nKSB7CisJCQlpZiAoIXN0cmNtcCgiLS1mb3JjZSIsIGF2W2ldKSB8fAorCQkJICAgICFzdHJjbXAoIi1mIiwgYXZbaV0pKQorCQkJCWZvcmNlID0gMTsKKwkJCWVsc2UKKwkJCQl1c2FnZSh1cGRhdGVfc2VydmVyX2luZm9fdXNhZ2UpOworCQl9CisJfQorCWlmIChpICE9IGFjKQorCQl1c2FnZSh1cGRhdGVfc2VydmVyX2luZm9fdXNhZ2UpOworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCisJcmV0dXJuICEhdXBkYXRlX3NlcnZlcl9pbmZvKGZvcmNlKTsKK30KZGlmZiAtLWdpdCBhL3VwbG9hZC1wYWNrLmMgYi91cGxvYWQtcGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NmRkMzYKLS0tIC9kZXYvbnVsbAorKysgYi91cGxvYWQtcGFjay5jCkBAIC0wLDAgKzEsNjUxIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAicGt0LWxpbmUuaCIKKyNpbmNsdWRlICJzaWRlYmFuZC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgInJldmlzaW9uLmgiCisjaW5jbHVkZSAibGlzdC1vYmplY3RzLmgiCisjaW5jbHVkZSAicnVuLWNvbW1hbmQuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgdXBsb2FkX3BhY2tfdXNhZ2VbXSA9ICJnaXQtdXBsb2FkLXBhY2sgWy0tc3RyaWN0XSBbLS10aW1lb3V0PW5uXSA8ZGlyPiI7CisKKy8qIGJpdHMgIzAuLjcgaW4gcmV2aXNpb24uaCwgIzguLjEwIGluIGNvbW1pdC5jICovCisjZGVmaW5lIFRIRVlfSEFWRQkoMXUgPDwgMTEpCisjZGVmaW5lIE9VUl9SRUYJCSgxdSA8PCAxMikKKyNkZWZpbmUgV0FOVEVECQkoMXUgPDwgMTMpCisjZGVmaW5lIENPTU1PTl9LTk9XTgkoMXUgPDwgMTQpCisjZGVmaW5lIFJFQUNIQUJMRQkoMXUgPDwgMTUpCisKKyNkZWZpbmUgU0hBTExPVwkJKDF1IDw8IDE2KQorI2RlZmluZSBOT1RfU0hBTExPVwkoMXUgPDwgMTcpCisjZGVmaW5lIENMSUVOVF9TSEFMTE9XCSgxdSA8PCAxOCkKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgb2xkZXN0X2hhdmU7CisKK3N0YXRpYyBpbnQgbXVsdGlfYWNrLCBucl9vdXJfcmVmczsKK3N0YXRpYyBpbnQgdXNlX3RoaW5fcGFjaywgdXNlX29mc19kZWx0YSwgdXNlX2luY2x1ZGVfdGFnOworc3RhdGljIGludCBub19wcm9ncmVzczsKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X2FycmF5IGhhdmVfb2JqOworc3RhdGljIHN0cnVjdCBvYmplY3RfYXJyYXkgd2FudF9vYmo7CitzdGF0aWMgdW5zaWduZWQgaW50IHRpbWVvdXQ7CisvKiAwIGZvciBubyBzaWRlYmFuZCwKKyAqIG90aGVyd2lzZSBtYXhpbXVtIHBhY2tldCBzaXplICh1cCB0byA2NTUyMCBieXRlcykuCisgKi8KK3N0YXRpYyBpbnQgdXNlX3NpZGViYW5kOworc3RhdGljIGludCBkZWJ1Z19mZDsKKworc3RhdGljIHZvaWQgcmVzZXRfdGltZW91dCh2b2lkKQoreworCWFsYXJtKHRpbWVvdXQpOworfQorCitzdGF0aWMgaW50IHN0cmlwKGNoYXIgKmxpbmUsIGludCBsZW4pCit7CisJaWYgKGxlbiAmJiBsaW5lW2xlbi0xXSA9PSAnXG4nKQorCQlsaW5lWy0tbGVuXSA9IDA7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3Qgc2VuZF9jbGllbnRfZGF0YShpbnQgZmQsIGNvbnN0IGNoYXIgKmRhdGEsIHNzaXplX3Qgc3opCit7CisJaWYgKHVzZV9zaWRlYmFuZCkKKwkJcmV0dXJuIHNlbmRfc2lkZWJhbmQoMSwgZmQsIGRhdGEsIHN6LCB1c2Vfc2lkZWJhbmQpOworCWlmIChmZCA9PSAzKQorCQkvKiBlbWVyZ2VuY3kgcXVpdCAqLworCQlmZCA9IDI7CisJaWYgKGZkID09IDIpIHsKKwkJLyogWFhYOiBhcmUgd2UgaGFwcHkgdG8gbG9zZSBzdHVmZiBoZXJlPyAqLworCQl4d3JpdGUoZmQsIGRhdGEsIHN6KTsKKwkJcmV0dXJuIHN6OworCX0KKwlyZXR1cm4gc2FmZV93cml0ZShmZCwgZGF0YSwgc3opOworfQorCitzdGF0aWMgRklMRSAqcGFja19waXBlID0gTlVMTDsKK3N0YXRpYyB2b2lkIHNob3dfY29tbWl0KHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBCT1VOREFSWSkKKwkJZnB1dGMoJy0nLCBwYWNrX3BpcGUpOworCWlmIChmcHV0cyhzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSwgcGFja19waXBlKSA8IDApCisJCWRpZSgiYnJva2VuIG91dHB1dCBwaXBlIik7CisJZnB1dGMoJ1xuJywgcGFja19waXBlKTsKKwlmZmx1c2gocGFja19waXBlKTsKKwlmcmVlKGNvbW1pdC0+YnVmZmVyKTsKKwljb21taXQtPmJ1ZmZlciA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfb2JqZWN0KHN0cnVjdCBvYmplY3RfYXJyYXlfZW50cnkgKnApCit7CisJLyogQW4gb2JqZWN0IHdpdGggbmFtZSAiZm9vXG4wMDAwMDAwLi4uIiBjYW4gYmUgdXNlZCB0bworCSAqIGNvbmZ1c2UgZG93bnN0cmVhbSBnaXQtcGFjay1vYmplY3RzIHZlcnkgYmFkbHkuCisJICovCisJY29uc3QgY2hhciAqZXAgPSBzdHJjaHIocC0+bmFtZSwgJ1xuJyk7CisJaWYgKGVwKSB7CisJCWZwcmludGYocGFja19waXBlLCAiJXMgJS4qc1xuIiwgc2hhMV90b19oZXgocC0+aXRlbS0+c2hhMSksCisJCSAgICAgICAoaW50KSAoZXAgLSBwLT5uYW1lKSwKKwkJICAgICAgIHAtPm5hbWUpOworCX0KKwllbHNlCisJCWZwcmludGYocGFja19waXBlLCAiJXMgJXNcbiIsCisJCQkJc2hhMV90b19oZXgocC0+aXRlbS0+c2hhMSksIHAtPm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBzaG93X2VkZ2Uoc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCWZwcmludGYocGFja19waXBlLCAiLSVzXG4iLCBzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7Cit9CisKK3N0YXRpYyBpbnQgZG9fcmV2X2xpc3QoaW50IGZkLCB2b2lkICpjcmVhdGVfZnVsbF9wYWNrKQoreworCWludCBpOworCXN0cnVjdCByZXZfaW5mbyByZXZzOworCisJcGFja19waXBlID0gZmRvcGVuKGZkLCAidyIpOworCWlmIChjcmVhdGVfZnVsbF9wYWNrKQorCQl1c2VfdGhpbl9wYWNrID0gMDsgLyogbm8gcG9pbnQgZG9pbmcgaXQgKi8KKwlpbml0X3JldmlzaW9ucygmcmV2cywgTlVMTCk7CisJcmV2cy50YWdfb2JqZWN0cyA9IDE7CisJcmV2cy50cmVlX29iamVjdHMgPSAxOworCXJldnMuYmxvYl9vYmplY3RzID0gMTsKKwlpZiAodXNlX3RoaW5fcGFjaykKKwkJcmV2cy5lZGdlX2hpbnQgPSAxOworCisJaWYgKGNyZWF0ZV9mdWxsX3BhY2spIHsKKwkJY29uc3QgY2hhciAqYXJnc1tdID0geyJyZXYtbGlzdCIsICItLWFsbCIsIE5VTEx9OworCQlzZXR1cF9yZXZpc2lvbnMoMiwgYXJncywgJnJldnMsIE5VTEwpOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCB3YW50X29iai5ucjsgaSsrKSB7CisJCQlzdHJ1Y3Qgb2JqZWN0ICpvID0gd2FudF9vYmoub2JqZWN0c1tpXS5pdGVtOworCQkJLyogd2h5Pz8/ICovCisJCQlvLT5mbGFncyAmPSB+VU5JTlRFUkVTVElORzsKKwkJCWFkZF9wZW5kaW5nX29iamVjdCgmcmV2cywgbywgTlVMTCk7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IGhhdmVfb2JqLm5yOyBpKyspIHsKKwkJCXN0cnVjdCBvYmplY3QgKm8gPSBoYXZlX29iai5vYmplY3RzW2ldLml0ZW07CisJCQlvLT5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworCQkJYWRkX3BlbmRpbmdfb2JqZWN0KCZyZXZzLCBvLCBOVUxMKTsKKwkJfQorCQlzZXR1cF9yZXZpc2lvbnMoMCwgTlVMTCwgJnJldnMsIE5VTEwpOworCX0KKwlpZiAocHJlcGFyZV9yZXZpc2lvbl93YWxrKCZyZXZzKSkKKwkJZGllKCJyZXZpc2lvbiB3YWxrIHNldHVwIGZhaWxlZCIpOworCW1hcmtfZWRnZXNfdW5pbnRlcmVzdGluZyhyZXZzLmNvbW1pdHMsICZyZXZzLCBzaG93X2VkZ2UpOworCXRyYXZlcnNlX2NvbW1pdF9saXN0KCZyZXZzLCBzaG93X2NvbW1pdCwgc2hvd19vYmplY3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjcmVhdGVfcGFja19maWxlKHZvaWQpCit7CisJc3RydWN0IGFzeW5jIHJldl9saXN0OworCXN0cnVjdCBjaGlsZF9wcm9jZXNzIHBhY2tfb2JqZWN0czsKKwlpbnQgY3JlYXRlX2Z1bGxfcGFjayA9IChucl9vdXJfcmVmcyA9PSB3YW50X29iai5uciAmJiAhaGF2ZV9vYmoubnIpOworCWNoYXIgZGF0YVs4MTkzXSwgcHJvZ3Jlc3NbMTI4XTsKKwljaGFyIGFib3J0X21zZ1tdID0gImFib3J0aW5nIGR1ZSB0byBwb3NzaWJsZSByZXBvc2l0b3J5ICIKKwkJImNvcnJ1cHRpb24gb24gdGhlIHJlbW90ZSBzaWRlLiI7CisJaW50IGJ1ZmZlcmVkID0gLTE7CisJc3NpemVfdCBzejsKKwljb25zdCBjaGFyICphcmd2WzEwXTsKKwlpbnQgYXJnID0gMDsKKworCXJldl9saXN0LnByb2MgPSBkb19yZXZfbGlzdDsKKwkvKiAuZGF0YSBpcyBqdXN0IGEgYm9vbGVhbjogYW55IG5vbi1OVUxMIHZhbHVlIHdpbGwgZG8gKi8KKwlyZXZfbGlzdC5kYXRhID0gY3JlYXRlX2Z1bGxfcGFjayA/ICZyZXZfbGlzdCA6IE5VTEw7CisJaWYgKHN0YXJ0X2FzeW5jKCZyZXZfbGlzdCkpCisJCWRpZSgiZ2l0LXVwbG9hZC1wYWNrOiB1bmFibGUgdG8gZm9yayBnaXQtcmV2LWxpc3QiKTsKKworCWFyZ3ZbYXJnKytdID0gInBhY2stb2JqZWN0cyI7CisJYXJndlthcmcrK10gPSAiLS1zdGRvdXQiOworCWlmICghbm9fcHJvZ3Jlc3MpCisJCWFyZ3ZbYXJnKytdID0gIi0tcHJvZ3Jlc3MiOworCWlmICh1c2Vfb2ZzX2RlbHRhKQorCQlhcmd2W2FyZysrXSA9ICItLWRlbHRhLWJhc2Utb2Zmc2V0IjsKKwlpZiAodXNlX2luY2x1ZGVfdGFnKQorCQlhcmd2W2FyZysrXSA9ICItLWluY2x1ZGUtdGFnIjsKKwlhcmd2W2FyZysrXSA9IE5VTEw7CisKKwltZW1zZXQoJnBhY2tfb2JqZWN0cywgMCwgc2l6ZW9mKHBhY2tfb2JqZWN0cykpOworCXBhY2tfb2JqZWN0cy5pbiA9IHJldl9saXN0Lm91dDsJLyogc3RhcnRfY29tbWFuZCBjbG9zZXMgaXQgKi8KKwlwYWNrX29iamVjdHMub3V0ID0gLTE7CisJcGFja19vYmplY3RzLmVyciA9IC0xOworCXBhY2tfb2JqZWN0cy5naXRfY21kID0gMTsKKwlwYWNrX29iamVjdHMuYXJndiA9IGFyZ3Y7CisKKwlpZiAoc3RhcnRfY29tbWFuZCgmcGFja19vYmplY3RzKSkKKwkJZGllKCJnaXQtdXBsb2FkLXBhY2s6IHVuYWJsZSB0byBmb3JrIGdpdC1wYWNrLW9iamVjdHMiKTsKKworCS8qIFdlIHJlYWQgZnJvbSBwYWNrX29iamVjdHMuZXJyIHRvIGNhcHR1cmUgc3RkZXJyIG91dHB1dCBmb3IKKwkgKiBwcm9ncmVzcyBiYXIsIGFuZCBwYWNrX29iamVjdHMub3V0IHRvIGNhcHR1cmUgdGhlIHBhY2sgZGF0YS4KKwkgKi8KKworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBwb2xsZmQgcGZkWzJdOworCQlpbnQgcGUsIHB1LCBwb2xsc2l6ZTsKKworCQlyZXNldF90aW1lb3V0KCk7CisKKwkJcG9sbHNpemUgPSAwOworCQlwZSA9IHB1ID0gLTE7CisKKwkJaWYgKDAgPD0gcGFja19vYmplY3RzLm91dCkgeworCQkJcGZkW3BvbGxzaXplXS5mZCA9IHBhY2tfb2JqZWN0cy5vdXQ7CisJCQlwZmRbcG9sbHNpemVdLmV2ZW50cyA9IFBPTExJTjsKKwkJCXB1ID0gcG9sbHNpemU7CisJCQlwb2xsc2l6ZSsrOworCQl9CisJCWlmICgwIDw9IHBhY2tfb2JqZWN0cy5lcnIpIHsKKwkJCXBmZFtwb2xsc2l6ZV0uZmQgPSBwYWNrX29iamVjdHMuZXJyOworCQkJcGZkW3BvbGxzaXplXS5ldmVudHMgPSBQT0xMSU47CisJCQlwZSA9IHBvbGxzaXplOworCQkJcG9sbHNpemUrKzsKKwkJfQorCisJCWlmICghcG9sbHNpemUpCisJCQlicmVhazsKKworCQlpZiAocG9sbChwZmQsIHBvbGxzaXplLCAtMSkgPCAwKSB7CisJCQlpZiAoZXJybm8gIT0gRUlOVFIpIHsKKwkJCQllcnJvcigicG9sbCBmYWlsZWQsIHJlc3VtaW5nOiAlcyIsCisJCQkJICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlzbGVlcCgxKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgwIDw9IHB1ICYmIChwZmRbcHVdLnJldmVudHMgJiAoUE9MTElOfFBPTExIVVApKSkgeworCQkJLyogRGF0YSByZWFkeTsgd2Uga2VlcCB0aGUgbGFzdCBieXRlIHRvIG91cnNlbHZlcworCQkJICogaW4gY2FzZSB3ZSBkZXRlY3QgYnJva2VuIHJldi1saXN0LCBzbyB0aGF0IHdlCisJCQkgKiBjYW4gbGVhdmUgdGhlIHN0cmVhbSBjb3JydXB0ZWQuICBUaGlzIGlzCisJCQkgKiB1bmZvcnR1bmF0ZSAtLSB1bnBhY2stb2JqZWN0cyB3b3VsZCBoYXBwaWx5CisJCQkgKiBhY2NlcHQgYSB2YWxpZCBwYWNrZGF0YSB3aXRoIHRyYWlsaW5nIGdhcmJhZ2UsCisJCQkgKiBzbyBhcHBlbmRpbmcgZ2FyYmFnZSBhZnRlciB3ZSBwYXNzIGFsbCB0aGUKKwkJCSAqIHBhY2sgZGF0YSBpcyBub3QgZ29vZCBlbm91Z2ggdG8gc2lnbmFsCisJCQkgKiBicmVha2FnZSB0byBkb3duc3RyZWFtLgorCQkJICovCisJCQljaGFyICpjcCA9IGRhdGE7CisJCQlzc2l6ZV90IG91dHN6ID0gMDsKKwkJCWlmICgwIDw9IGJ1ZmZlcmVkKSB7CisJCQkJKmNwKysgPSBidWZmZXJlZDsKKwkJCQlvdXRzeisrOworCQkJfQorCQkJc3ogPSB4cmVhZChwYWNrX29iamVjdHMub3V0LCBjcCwKKwkJCQkgIHNpemVvZihkYXRhKSAtIG91dHN6KTsKKwkJCWlmICgwIDwgc3opCisJCQkJCTsKKwkJCWVsc2UgaWYgKHN6ID09IDApIHsKKwkJCQljbG9zZShwYWNrX29iamVjdHMub3V0KTsKKwkJCQlwYWNrX29iamVjdHMub3V0ID0gLTE7CisJCQl9CisJCQllbHNlCisJCQkJZ290byBmYWlsOworCQkJc3ogKz0gb3V0c3o7CisJCQlpZiAoMSA8IHN6KSB7CisJCQkJYnVmZmVyZWQgPSBkYXRhW3N6LTFdICYgMHhGRjsKKwkJCQlzei0tOworCQkJfQorCQkJZWxzZQorCQkJCWJ1ZmZlcmVkID0gLTE7CisJCQlzeiA9IHNlbmRfY2xpZW50X2RhdGEoMSwgZGF0YSwgc3opOworCQkJaWYgKHN6IDwgMCkKKwkJCQlnb3RvIGZhaWw7CisJCX0KKwkJaWYgKDAgPD0gcGUgJiYgKHBmZFtwZV0ucmV2ZW50cyAmIChQT0xMSU58UE9MTEhVUCkpKSB7CisJCQkvKiBTdGF0dXMgcmVhZHk7IHdlIHNoaXAgdGhhdCBpbiB0aGUgc2lkZS1iYW5kCisJCQkgKiBvciBkdW1wIHRvIHRoZSBzdGFuZGFyZCBlcnJvci4KKwkJCSAqLworCQkJc3ogPSB4cmVhZChwYWNrX29iamVjdHMuZXJyLCBwcm9ncmVzcywKKwkJCQkgIHNpemVvZihwcm9ncmVzcykpOworCQkJaWYgKDAgPCBzeikKKwkJCQlzZW5kX2NsaWVudF9kYXRhKDIsIHByb2dyZXNzLCBzeik7CisJCQllbHNlIGlmIChzeiA9PSAwKSB7CisJCQkJY2xvc2UocGFja19vYmplY3RzLmVycik7CisJCQkJcGFja19vYmplY3RzLmVyciA9IC0xOworCQkJfQorCQkJZWxzZQorCQkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCWlmIChmaW5pc2hfY29tbWFuZCgmcGFja19vYmplY3RzKSkgeworCQllcnJvcigiZ2l0LXVwbG9hZC1wYWNrOiBnaXQtcGFjay1vYmplY3RzIGRpZWQgd2l0aCBlcnJvci4iKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAoZmluaXNoX2FzeW5jKCZyZXZfbGlzdCkpCisJCWdvdG8gZmFpbDsJLyogZXJyb3Igd2FzIGFscmVhZHkgcmVwb3J0ZWQgKi8KKworCS8qIGZsdXNoIHRoZSBkYXRhICovCisJaWYgKDAgPD0gYnVmZmVyZWQpIHsKKwkJZGF0YVswXSA9IGJ1ZmZlcmVkOworCQlzeiA9IHNlbmRfY2xpZW50X2RhdGEoMSwgZGF0YSwgMSk7CisJCWlmIChzeiA8IDApCisJCQlnb3RvIGZhaWw7CisJCWZwcmludGYoc3RkZXJyLCAiZmx1c2hlZC5cbiIpOworCX0KKwlpZiAodXNlX3NpZGViYW5kKQorCQlwYWNrZXRfZmx1c2goMSk7CisJcmV0dXJuOworCisgZmFpbDoKKwlzZW5kX2NsaWVudF9kYXRhKDMsIGFib3J0X21zZywgc2l6ZW9mKGFib3J0X21zZykpOworCWRpZSgiZ2l0LXVwbG9hZC1wYWNrOiAlcyIsIGFib3J0X21zZyk7Cit9CisKK3N0YXRpYyBpbnQgZ290X3NoYTEoY2hhciAqaGV4LCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBvYmplY3QgKm87CisJaW50IHdlX2tuZXdfdGhleV9oYXZlID0gMDsKKworCWlmIChnZXRfc2hhMV9oZXgoaGV4LCBzaGExKSkKKwkJZGllKCJnaXQtdXBsb2FkLXBhY2s6IGV4cGVjdGVkIFNIQTEgb2JqZWN0LCBnb3QgJyVzJyIsIGhleCk7CisJaWYgKCFoYXNfc2hhMV9maWxlKHNoYTEpKQorCQlyZXR1cm4gLTE7CisKKwlvID0gbG9va3VwX29iamVjdChzaGExKTsKKwlpZiAoIShvICYmIG8tPnBhcnNlZCkpCisJCW8gPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJaWYgKCFvKQorCQlkaWUoIm9vcHMgKCVzKSIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwlpZiAoby0+dHlwZSA9PSBPQkpfQ09NTUlUKSB7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50czsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gKHN0cnVjdCBjb21taXQgKilvOworCQlpZiAoby0+ZmxhZ3MgJiBUSEVZX0hBVkUpCisJCQl3ZV9rbmV3X3RoZXlfaGF2ZSA9IDE7CisJCWVsc2UKKwkJCW8tPmZsYWdzIHw9IFRIRVlfSEFWRTsKKwkJaWYgKCFvbGRlc3RfaGF2ZSB8fCAoY29tbWl0LT5kYXRlIDwgb2xkZXN0X2hhdmUpKQorCQkJb2xkZXN0X2hhdmUgPSBjb21taXQtPmRhdGU7CisJCWZvciAocGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsKKwkJICAgICBwYXJlbnRzOworCQkgICAgIHBhcmVudHMgPSBwYXJlbnRzLT5uZXh0KQorCQkJcGFyZW50cy0+aXRlbS0+b2JqZWN0LmZsYWdzIHw9IFRIRVlfSEFWRTsKKwl9CisJaWYgKCF3ZV9rbmV3X3RoZXlfaGF2ZSkgeworCQlhZGRfb2JqZWN0X2FycmF5KG8sIE5VTEwsICZoYXZlX29iaik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFjaGFibGUoc3RydWN0IGNvbW1pdCAqd2FudCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKndvcmsgPSBOVUxMOworCisJaW5zZXJ0X2J5X2RhdGUod2FudCwgJndvcmspOworCXdoaWxlICh3b3JrKSB7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCA9IHdvcmstPm5leHQ7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IHdvcmstPml0ZW07CisJCWZyZWUod29yayk7CisJCXdvcmsgPSBsaXN0OworCisJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIFRIRVlfSEFWRSkgeworCQkJd2FudC0+b2JqZWN0LmZsYWdzIHw9IENPTU1PTl9LTk9XTjsKKwkJCWJyZWFrOworCQl9CisJCWlmICghY29tbWl0LT5vYmplY3QucGFyc2VkKQorCQkJcGFyc2Vfb2JqZWN0KGNvbW1pdC0+b2JqZWN0LnNoYTEpOworCQlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBSRUFDSEFCTEUpCisJCQljb250aW51ZTsKKwkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gUkVBQ0hBQkxFOworCQlpZiAoY29tbWl0LT5kYXRlIDwgb2xkZXN0X2hhdmUpCisJCQljb250aW51ZTsKKwkJZm9yIChsaXN0ID0gY29tbWl0LT5wYXJlbnRzOyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQkJc3RydWN0IGNvbW1pdCAqcGFyZW50ID0gbGlzdC0+aXRlbTsKKwkJCWlmICghKHBhcmVudC0+b2JqZWN0LmZsYWdzICYgUkVBQ0hBQkxFKSkKKwkJCQlpbnNlcnRfYnlfZGF0ZShwYXJlbnQsICZ3b3JrKTsKKwkJfQorCX0KKwl3YW50LT5vYmplY3QuZmxhZ3MgfD0gUkVBQ0hBQkxFOworCWNsZWFyX2NvbW1pdF9tYXJrcyh3YW50LCBSRUFDSEFCTEUpOworCWZyZWVfY29tbWl0X2xpc3Qod29yayk7CisJcmV0dXJuICh3YW50LT5vYmplY3QuZmxhZ3MgJiBDT01NT05fS05PV04pOworfQorCitzdGF0aWMgaW50IG9rX3RvX2dpdmVfdXAodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmICghaGF2ZV9vYmoubnIpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IHdhbnRfb2JqLm5yOyBpKyspIHsKKwkJc3RydWN0IG9iamVjdCAqd2FudCA9IHdhbnRfb2JqLm9iamVjdHNbaV0uaXRlbTsKKworCQlpZiAod2FudC0+ZmxhZ3MgJiBDT01NT05fS05PV04pCisJCQljb250aW51ZTsKKwkJd2FudCA9IGRlcmVmX3RhZyh3YW50LCAiYSB3YW50IGxpbmUiLCAwKTsKKwkJaWYgKCF3YW50IHx8IHdhbnQtPnR5cGUgIT0gT0JKX0NPTU1JVCkgeworCQkJLyogbm8gd2F5IHRvIHRlbGwgaWYgdGhpcyBpcyByZWFjaGFibGUgYnkKKwkJCSAqIGxvb2tpbmcgYXQgdGhlIGFuY2VzdHJ5IGNoYWluIGFsb25lLCBzbworCQkJICogbGVhdmUgYSBub3RlIHRvIG91cnNlbHZlcyBub3QgdG8gd29ycnkgYWJvdXQKKwkJCSAqIHRoaXMgb2JqZWN0IGFueW1vcmUuCisJCQkgKi8KKwkJCXdhbnRfb2JqLm9iamVjdHNbaV0uaXRlbS0+ZmxhZ3MgfD0gQ09NTU9OX0tOT1dOOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFyZWFjaGFibGUoKHN0cnVjdCBjb21taXQgKil3YW50KSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBnZXRfY29tbW9uX2NvbW1pdHModm9pZCkKK3sKKwlzdGF0aWMgY2hhciBsaW5lWzEwMDBdOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY2hhciBoZXhbNDFdLCBsYXN0X2hleFs0MV07CisJaW50IGxlbjsKKworCXNhdmVfY29tbWl0X2J1ZmZlciA9IDA7CisKKwlmb3IoOzspIHsKKwkJbGVuID0gcGFja2V0X3JlYWRfbGluZSgwLCBsaW5lLCBzaXplb2YobGluZSkpOworCQlyZXNldF90aW1lb3V0KCk7CisKKwkJaWYgKCFsZW4pIHsKKwkJCWlmIChoYXZlX29iai5uciA9PSAwIHx8IG11bHRpX2FjaykKKwkJCQlwYWNrZXRfd3JpdGUoMSwgIk5BS1xuIik7CisJCQljb250aW51ZTsKKwkJfQorCQlsZW4gPSBzdHJpcChsaW5lLCBsZW4pOworCQlpZiAoIXByZWZpeGNtcChsaW5lLCAiaGF2ZSAiKSkgeworCQkJc3dpdGNoIChnb3Rfc2hhMShsaW5lKzUsIHNoYTEpKSB7CisJCQljYXNlIC0xOiAvKiB0aGV5IGhhdmUgd2hhdCB3ZSBkbyBub3QgKi8KKwkJCQlpZiAobXVsdGlfYWNrICYmIG9rX3RvX2dpdmVfdXAoKSkKKwkJCQkJcGFja2V0X3dyaXRlKDEsICJBQ0sgJXMgY29udGludWVcbiIsCisJCQkJCQkgICAgIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJbWVtY3B5KGhleCwgc2hhMV90b19oZXgoc2hhMSksIDQxKTsKKwkJCQlpZiAobXVsdGlfYWNrKSB7CisJCQkJCWNvbnN0IGNoYXIgKm1zZyA9ICJBQ0sgJXMgY29udGludWVcbiI7CisJCQkJCXBhY2tldF93cml0ZSgxLCBtc2csIGhleCk7CisJCQkJCW1lbWNweShsYXN0X2hleCwgaGV4LCA0MSk7CisJCQkJfQorCQkJCWVsc2UgaWYgKGhhdmVfb2JqLm5yID09IDEpCisJCQkJCXBhY2tldF93cml0ZSgxLCAiQUNLICVzXG4iLCBoZXgpOworCQkJCWJyZWFrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAobGluZSwgImRvbmUiKSkgeworCQkJaWYgKGhhdmVfb2JqLm5yID4gMCkgeworCQkJCWlmIChtdWx0aV9hY2spCisJCQkJCXBhY2tldF93cml0ZSgxLCAiQUNLICVzXG4iLCBsYXN0X2hleCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlwYWNrZXRfd3JpdGUoMSwgIk5BS1xuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZGllKCJnaXQtdXBsb2FkLXBhY2s6IGV4cGVjdGVkIFNIQTEgbGlzdCwgZ290ICclcyciLCBsaW5lKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlY2VpdmVfbmVlZHModm9pZCkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2FycmF5IHNoYWxsb3dzID0gezAsIDAsIE5VTEx9OworCXN0YXRpYyBjaGFyIGxpbmVbMTAwMF07CisJaW50IGxlbiwgZGVwdGggPSAwOworCisJaWYgKGRlYnVnX2ZkKQorCQl3cml0ZV9pbl9mdWxsKGRlYnVnX2ZkLCAiI1NcbiIsIDMpOworCWZvciAoOzspIHsKKwkJc3RydWN0IG9iamVjdCAqbzsKKwkJdW5zaWduZWQgY2hhciBzaGExX2J1ZlsyMF07CisJCWxlbiA9IHBhY2tldF9yZWFkX2xpbmUoMCwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKwkJcmVzZXRfdGltZW91dCgpOworCQlpZiAoIWxlbikKKwkJCWJyZWFrOworCQlpZiAoZGVidWdfZmQpCisJCQl3cml0ZV9pbl9mdWxsKGRlYnVnX2ZkLCBsaW5lLCBsZW4pOworCisJCWlmICghcHJlZml4Y21wKGxpbmUsICJzaGFsbG93ICIpKSB7CisJCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQkJc3RydWN0IG9iamVjdCAqb2JqZWN0OworCQkJdXNlX3RoaW5fcGFjayA9IDA7CisJCQlpZiAoZ2V0X3NoYTEobGluZSArIDgsIHNoYTEpKQorCQkJCWRpZSgiaW52YWxpZCBzaGFsbG93IGxpbmU6ICVzIiwgbGluZSk7CisJCQlvYmplY3QgPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJCQlpZiAoIW9iamVjdCkKKwkJCQlkaWUoImRpZCBub3QgZmluZCBvYmplY3QgZm9yICVzIiwgbGluZSk7CisJCQlvYmplY3QtPmZsYWdzIHw9IENMSUVOVF9TSEFMTE9XOworCQkJYWRkX29iamVjdF9hcnJheShvYmplY3QsIE5VTEwsICZzaGFsbG93cyk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXByZWZpeGNtcChsaW5lLCAiZGVlcGVuICIpKSB7CisJCQljaGFyICplbmQ7CisJCQl1c2VfdGhpbl9wYWNrID0gMDsKKwkJCWRlcHRoID0gc3RydG9sKGxpbmUgKyA3LCAmZW5kLCAwKTsKKwkJCWlmIChlbmQgPT0gbGluZSArIDcgfHwgZGVwdGggPD0gMCkKKwkJCQlkaWUoIkludmFsaWQgZGVlcGVuOiAlcyIsIGxpbmUpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHByZWZpeGNtcChsaW5lLCAid2FudCAiKSB8fAorCQkgICAgZ2V0X3NoYTFfaGV4KGxpbmUrNSwgc2hhMV9idWYpKQorCQkJZGllKCJnaXQtdXBsb2FkLXBhY2s6IHByb3RvY29sIGVycm9yLCAiCisJCQkgICAgImV4cGVjdGVkIHRvIGdldCBzaGEsIG5vdCAnJXMnIiwgbGluZSk7CisJCWlmIChzdHJzdHIobGluZSs0NSwgIm11bHRpX2FjayIpKQorCQkJbXVsdGlfYWNrID0gMTsKKwkJaWYgKHN0cnN0cihsaW5lKzQ1LCAidGhpbi1wYWNrIikpCisJCQl1c2VfdGhpbl9wYWNrID0gMTsKKwkJaWYgKHN0cnN0cihsaW5lKzQ1LCAib2ZzLWRlbHRhIikpCisJCQl1c2Vfb2ZzX2RlbHRhID0gMTsKKwkJaWYgKHN0cnN0cihsaW5lKzQ1LCAic2lkZS1iYW5kLTY0ayIpKQorCQkJdXNlX3NpZGViYW5kID0gTEFSR0VfUEFDS0VUX01BWDsKKwkJZWxzZSBpZiAoc3Ryc3RyKGxpbmUrNDUsICJzaWRlLWJhbmQiKSkKKwkJCXVzZV9zaWRlYmFuZCA9IERFRkFVTFRfUEFDS0VUX01BWDsKKwkJaWYgKHN0cnN0cihsaW5lKzQ1LCAibm8tcHJvZ3Jlc3MiKSkKKwkJCW5vX3Byb2dyZXNzID0gMTsKKwkJaWYgKHN0cnN0cihsaW5lKzQ1LCAiaW5jbHVkZS10YWciKSkKKwkJCXVzZV9pbmNsdWRlX3RhZyA9IDE7CisKKwkJLyogV2UgaGF2ZSBzZW50IGFsbCBvdXIgcmVmcyBhbHJlYWR5LCBhbmQgdGhlIG90aGVyIGVuZAorCQkgKiBzaG91bGQgaGF2ZSBjaG9zZW4gb3V0IG9mIHRoZW07IG90aGVyd2lzZSB0aGV5IGFyZQorCQkgKiBhc2tpbmcgZm9yIG5vbnNlbnNlLgorCQkgKgorCQkgKiBIbXBoLiAgV2UgbWF5IGxhdGVyIHdhbnQgdG8gYWxsb3cgIndhbnQiIGxpbmUgdGhhdAorCQkgKiBhc2tzIGZvciBzb21ldGhpbmcgbGlrZSAibWFzdGVyfjEwIiAoc3ltYm9saWMpLi4uCisJCSAqIHdvdWxkIGl0IG1ha2Ugc2Vuc2U/ICBJIGRvbid0IGtub3cuCisJCSAqLworCQlvID0gbG9va3VwX29iamVjdChzaGExX2J1Zik7CisJCWlmICghbyB8fCAhKG8tPmZsYWdzICYgT1VSX1JFRikpCisJCQlkaWUoImdpdC11cGxvYWQtcGFjazogbm90IG91ciByZWYgJXMiLCBsaW5lKzUpOworCQlpZiAoIShvLT5mbGFncyAmIFdBTlRFRCkpIHsKKwkJCW8tPmZsYWdzIHw9IFdBTlRFRDsKKwkJCWFkZF9vYmplY3RfYXJyYXkobywgTlVMTCwgJndhbnRfb2JqKTsKKwkJfQorCX0KKwlpZiAoZGVidWdfZmQpCisJCXdyaXRlX2luX2Z1bGwoZGVidWdfZmQsICIjRVxuIiwgMyk7CisJaWYgKGRlcHRoID09IDAgJiYgc2hhbGxvd3MubnIgPT0gMCkKKwkJcmV0dXJuOworCWlmIChkZXB0aCA+IDApIHsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICpyZXN1bHQsICpiYWNrdXA7CisJCWludCBpOworCQliYWNrdXAgPSByZXN1bHQgPSBnZXRfc2hhbGxvd19jb21taXRzKCZ3YW50X29iaiwgZGVwdGgsCisJCQlTSEFMTE9XLCBOT1RfU0hBTExPVyk7CisJCXdoaWxlIChyZXN1bHQpIHsKKwkJCXN0cnVjdCBvYmplY3QgKm9iamVjdCA9ICZyZXN1bHQtPml0ZW0tPm9iamVjdDsKKwkJCWlmICghKG9iamVjdC0+ZmxhZ3MgJiAoQ0xJRU5UX1NIQUxMT1d8Tk9UX1NIQUxMT1cpKSkgeworCQkJCXBhY2tldF93cml0ZSgxLCAic2hhbGxvdyAlcyIsCisJCQkJCQlzaGExX3RvX2hleChvYmplY3QtPnNoYTEpKTsKKwkJCQlyZWdpc3Rlcl9zaGFsbG93KG9iamVjdC0+c2hhMSk7CisJCQl9CisJCQlyZXN1bHQgPSByZXN1bHQtPm5leHQ7CisJCX0KKwkJZnJlZV9jb21taXRfbGlzdChiYWNrdXApOworCQlmb3IgKGkgPSAwOyBpIDwgc2hhbGxvd3MubnI7IGkrKykgeworCQkJc3RydWN0IG9iamVjdCAqb2JqZWN0ID0gc2hhbGxvd3Mub2JqZWN0c1tpXS5pdGVtOworCQkJaWYgKG9iamVjdC0+ZmxhZ3MgJiBOT1RfU0hBTExPVykgeworCQkJCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50czsKKwkJCQlwYWNrZXRfd3JpdGUoMSwgInVuc2hhbGxvdyAlcyIsCisJCQkJCXNoYTFfdG9faGV4KG9iamVjdC0+c2hhMSkpOworCQkJCW9iamVjdC0+ZmxhZ3MgJj0gfkNMSUVOVF9TSEFMTE9XOworCQkJCS8qIG1ha2Ugc3VyZSB0aGUgcmVhbCBwYXJlbnRzIGFyZSBwYXJzZWQgKi8KKwkJCQl1bnJlZ2lzdGVyX3NoYWxsb3cob2JqZWN0LT5zaGExKTsKKwkJCQlvYmplY3QtPnBhcnNlZCA9IDA7CisJCQkJaWYgKHBhcnNlX2NvbW1pdCgoc3RydWN0IGNvbW1pdCAqKW9iamVjdCkpCisJCQkJCWRpZSgiaW52YWxpZCBjb21taXQiKTsKKwkJCQlwYXJlbnRzID0gKChzdHJ1Y3QgY29tbWl0ICopb2JqZWN0KS0+cGFyZW50czsKKwkJCQl3aGlsZSAocGFyZW50cykgeworCQkJCQlhZGRfb2JqZWN0X2FycmF5KCZwYXJlbnRzLT5pdGVtLT5vYmplY3QsCisJCQkJCQkJTlVMTCwgJndhbnRfb2JqKTsKKwkJCQkJcGFyZW50cyA9IHBhcmVudHMtPm5leHQ7CisJCQkJfQorCQkJfQorCQkJLyogbWFrZSBzdXJlIGNvbW1pdCB0cmF2ZXJzYWwgY29uZm9ybXMgdG8gY2xpZW50ICovCisJCQlyZWdpc3Rlcl9zaGFsbG93KG9iamVjdC0+c2hhMSk7CisJCX0KKwkJcGFja2V0X2ZsdXNoKDEpOworCX0gZWxzZQorCQlpZiAoc2hhbGxvd3MubnIgPiAwKSB7CisJCQlpbnQgaTsKKwkJCWZvciAoaSA9IDA7IGkgPCBzaGFsbG93cy5ucjsgaSsrKQorCQkJCXJlZ2lzdGVyX3NoYWxsb3coc2hhbGxvd3Mub2JqZWN0c1tpXS5pdGVtLT5zaGExKTsKKwkJfQorCWZyZWUoc2hhbGxvd3Mub2JqZWN0cyk7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9yZWYoY29uc3QgY2hhciAqcmVmbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZsYWcsIHZvaWQgKmNiX2RhdGEpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNhcGFiaWxpdGllcyA9ICJtdWx0aV9hY2sgdGhpbi1wYWNrIHNpZGUtYmFuZCIKKwkJIiBzaWRlLWJhbmQtNjRrIG9mcy1kZWx0YSBzaGFsbG93IG5vLXByb2dyZXNzIgorCQkiIGluY2x1ZGUtdGFnIjsKKwlzdHJ1Y3Qgb2JqZWN0ICpvID0gcGFyc2Vfb2JqZWN0KHNoYTEpOworCisJaWYgKCFvKQorCQlkaWUoImdpdC11cGxvYWQtcGFjazogY2Fubm90IGZpbmQgb2JqZWN0ICVzOiIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKworCWlmIChjYXBhYmlsaXRpZXMpCisJCXBhY2tldF93cml0ZSgxLCAiJXMgJXMlYyVzXG4iLCBzaGExX3RvX2hleChzaGExKSwgcmVmbmFtZSwKKwkJCTAsIGNhcGFiaWxpdGllcyk7CisJZWxzZQorCQlwYWNrZXRfd3JpdGUoMSwgIiVzICVzXG4iLCBzaGExX3RvX2hleChzaGExKSwgcmVmbmFtZSk7CisJY2FwYWJpbGl0aWVzID0gTlVMTDsKKwlpZiAoIShvLT5mbGFncyAmIE9VUl9SRUYpKSB7CisJCW8tPmZsYWdzIHw9IE9VUl9SRUY7CisJCW5yX291cl9yZWZzKys7CisJfQorCWlmIChvLT50eXBlID09IE9CSl9UQUcpIHsKKwkJbyA9IGRlcmVmX3RhZyhvLCByZWZuYW1lLCAwKTsKKwkJaWYgKG8pCisJCQlwYWNrZXRfd3JpdGUoMSwgIiVzICVzXnt9XG4iLCBzaGExX3RvX2hleChvLT5zaGExKSwgcmVmbmFtZSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1cGxvYWRfcGFjayh2b2lkKQoreworCXJlc2V0X3RpbWVvdXQoKTsKKwloZWFkX3JlZihzZW5kX3JlZiwgTlVMTCk7CisJZm9yX2VhY2hfcmVmKHNlbmRfcmVmLCBOVUxMKTsKKwlwYWNrZXRfZmx1c2goMSk7CisJcmVjZWl2ZV9uZWVkcygpOworCWlmICh3YW50X29iai5ucikgeworCQlnZXRfY29tbW9uX2NvbW1pdHMoKTsKKwkJY3JlYXRlX3BhY2tfZmlsZSgpOworCX0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKmRpcjsKKwlpbnQgaTsKKwlpbnQgc3RyaWN0ID0gMDsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoYXJnWzBdICE9ICctJykKKwkJCWJyZWFrOworCQlpZiAoIXN0cmNtcChhcmcsICItLXN0cmljdCIpKSB7CisJCQlzdHJpY3QgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwcmVmaXhjbXAoYXJnLCAiLS10aW1lb3V0PSIpKSB7CisJCQl0aW1lb3V0ID0gYXRvaShhcmcrMTApOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkgeworCQkJaSsrOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaSAhPSBhcmdjLTEpCisJCXVzYWdlKHVwbG9hZF9wYWNrX3VzYWdlKTsKKworCXNldHVwX3BhdGgoTlVMTCk7CisKKwlkaXIgPSBhcmd2W2ldOworCisJaWYgKCFlbnRlcl9yZXBvKGRpciwgc3RyaWN0KSkKKwkJZGllKCInJXMnOiB1bmFibGUgdG8gY2hkaXIgb3Igbm90IGEgZ2l0IGFyY2hpdmUiLCBkaXIpOworCWlmIChpc19yZXBvc2l0b3J5X3NoYWxsb3coKSkKKwkJZGllKCJhdHRlbXB0IHRvIGZldGNoL2Nsb25lIGZyb20gYSBzaGFsbG93IHJlcG9zaXRvcnkiKTsKKwlpZiAoZ2V0ZW52KCJHSVRfREVCVUdfU0VORF9QQUNLIikpCisJCWRlYnVnX2ZkID0gYXRvaShnZXRlbnYoIkdJVF9ERUJVR19TRU5EX1BBQ0siKSk7CisJdXBsb2FkX3BhY2soKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3VzYWdlLmMgYi91c2FnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZmM0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi91c2FnZS5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKi8KKyNpbmNsdWRlICJnaXQtY29tcGF0LXV0aWwuaCIKKworc3RhdGljIHZvaWQgcmVwb3J0KGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqZXJyLCB2YV9saXN0IHBhcmFtcykKK3sKKwljaGFyIG1zZ1syNTZdOworCXZzbnByaW50Zihtc2csIHNpemVvZihtc2cpLCBlcnIsIHBhcmFtcyk7CisJZnByaW50ZihzdGRlcnIsICIlcyVzXG4iLCBwcmVmaXgsIG1zZyk7Cit9CisKK3N0YXRpYyBOT1JFVFVSTiB2b2lkIHVzYWdlX2J1aWx0aW4oY29uc3QgY2hhciAqZXJyKQoreworCWZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzXG4iLCBlcnIpOworCWV4aXQoMTI5KTsKK30KKworc3RhdGljIE5PUkVUVVJOIHZvaWQgZGllX2J1aWx0aW4oY29uc3QgY2hhciAqZXJyLCB2YV9saXN0IHBhcmFtcykKK3sKKwlyZXBvcnQoImZhdGFsOiAiLCBlcnIsIHBhcmFtcyk7CisJZXhpdCgxMjgpOworfQorCitzdGF0aWMgdm9pZCBlcnJvcl9idWlsdGluKGNvbnN0IGNoYXIgKmVyciwgdmFfbGlzdCBwYXJhbXMpCit7CisJcmVwb3J0KCJlcnJvcjogIiwgZXJyLCBwYXJhbXMpOworfQorCitzdGF0aWMgdm9pZCB3YXJuX2J1aWx0aW4oY29uc3QgY2hhciAqd2FybiwgdmFfbGlzdCBwYXJhbXMpCit7CisJcmVwb3J0KCJ3YXJuaW5nOiAiLCB3YXJuLCBwYXJhbXMpOworfQorCisvKiBJZiB3ZSBhcmUgaW4gYSBkbG9wZW4oKWVkIC5zbyB3cml0ZSB0byBhIGdsb2JhbCB2YXJpYWJsZSB3b3VsZCBzZWdmYXVsdAorICogKHVnaCksIHNvIGtlZXAgdGhpbmdzIHN0YXRpYy4gKi8KK3N0YXRpYyB2b2lkICgqdXNhZ2Vfcm91dGluZSkoY29uc3QgY2hhciAqZXJyKSBOT1JFVFVSTiA9IHVzYWdlX2J1aWx0aW47CitzdGF0aWMgdm9pZCAoKmRpZV9yb3V0aW5lKShjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKSBOT1JFVFVSTiA9IGRpZV9idWlsdGluOworc3RhdGljIHZvaWQgKCplcnJvcl9yb3V0aW5lKShjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKSA9IGVycm9yX2J1aWx0aW47CitzdGF0aWMgdm9pZCAoKndhcm5fcm91dGluZSkoY29uc3QgY2hhciAqZXJyLCB2YV9saXN0IHBhcmFtcykgPSB3YXJuX2J1aWx0aW47CisKK3ZvaWQgc2V0X3VzYWdlX3JvdXRpbmUodm9pZCAoKnJvdXRpbmUpKGNvbnN0IGNoYXIgKmVycikgTk9SRVRVUk4pCit7CisJdXNhZ2Vfcm91dGluZSA9IHJvdXRpbmU7Cit9CisKK3ZvaWQgc2V0X2RpZV9yb3V0aW5lKHZvaWQgKCpyb3V0aW5lKShjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKSBOT1JFVFVSTikKK3sKKwlkaWVfcm91dGluZSA9IHJvdXRpbmU7Cit9CisKK3ZvaWQgc2V0X2Vycm9yX3JvdXRpbmUodm9pZCAoKnJvdXRpbmUpKGNvbnN0IGNoYXIgKmVyciwgdmFfbGlzdCBwYXJhbXMpKQoreworCWVycm9yX3JvdXRpbmUgPSByb3V0aW5lOworfQorCit2b2lkIHNldF93YXJuX3JvdXRpbmUodm9pZCAoKnJvdXRpbmUpKGNvbnN0IGNoYXIgKndhcm4sIHZhX2xpc3QgcGFyYW1zKSkKK3sKKwl3YXJuX3JvdXRpbmUgPSByb3V0aW5lOworfQorCisKK3ZvaWQgdXNhZ2UoY29uc3QgY2hhciAqZXJyKQoreworCXVzYWdlX3JvdXRpbmUoZXJyKTsKK30KKwordm9pZCBkaWUoY29uc3QgY2hhciAqZXJyLCAuLi4pCit7CisJdmFfbGlzdCBwYXJhbXM7CisKKwl2YV9zdGFydChwYXJhbXMsIGVycik7CisJZGllX3JvdXRpbmUoZXJyLCBwYXJhbXMpOworCXZhX2VuZChwYXJhbXMpOworfQorCitpbnQgZXJyb3IoY29uc3QgY2hhciAqZXJyLCAuLi4pCit7CisJdmFfbGlzdCBwYXJhbXM7CisKKwl2YV9zdGFydChwYXJhbXMsIGVycik7CisJZXJyb3Jfcm91dGluZShlcnIsIHBhcmFtcyk7CisJdmFfZW5kKHBhcmFtcyk7CisJcmV0dXJuIC0xOworfQorCit2b2lkIHdhcm5pbmcoY29uc3QgY2hhciAqd2FybiwgLi4uKQoreworCXZhX2xpc3QgcGFyYW1zOworCisJdmFfc3RhcnQocGFyYW1zLCB3YXJuKTsKKwl3YXJuX3JvdXRpbmUod2FybiwgcGFyYW1zKTsKKwl2YV9lbmQocGFyYW1zKTsKK30KZGlmZiAtLWdpdCBhL3V0ZjguYyBiL3V0ZjguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzM3MzUzCi0tLSAvZGV2L251bGwKKysrIGIvdXRmOC5jCkBAIC0wLDAgKzEsMzkxIEBACisjaW5jbHVkZSAiZ2l0LWNvbXBhdC11dGlsLmgiCisjaW5jbHVkZSAidXRmOC5oIgorCisvKiBUaGlzIGNvZGUgaXMgb3JpZ2luYWxseSBmcm9tIGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tZ2syNS91Y3MvICovCisKK3N0cnVjdCBpbnRlcnZhbCB7CisgIGludCBmaXJzdDsKKyAgaW50IGxhc3Q7Cit9OworCisvKiBhdXhpbGlhcnkgZnVuY3Rpb24gZm9yIGJpbmFyeSBzZWFyY2ggaW4gaW50ZXJ2YWwgdGFibGUgKi8KK3N0YXRpYyBpbnQgYmlzZWFyY2godWNzX2NoYXJfdCB1Y3MsIGNvbnN0IHN0cnVjdCBpbnRlcnZhbCAqdGFibGUsIGludCBtYXgpCit7CisJaW50IG1pbiA9IDA7CisJaW50IG1pZDsKKworCWlmICh1Y3MgPCB0YWJsZVswXS5maXJzdCB8fCB1Y3MgPiB0YWJsZVttYXhdLmxhc3QpCisJCXJldHVybiAwOworCXdoaWxlIChtYXggPj0gbWluKSB7CisJCW1pZCA9IChtaW4gKyBtYXgpIC8gMjsKKwkJaWYgKHVjcyA+IHRhYmxlW21pZF0ubGFzdCkKKwkJCW1pbiA9IG1pZCArIDE7CisJCWVsc2UgaWYgKHVjcyA8IHRhYmxlW21pZF0uZmlyc3QpCisJCQltYXggPSBtaWQgLSAxOworCQllbHNlCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGRlZmluZSB0aGUgY29sdW1uIHdpZHRoIG9mIGFuIElTTyAxMDY0NgorICogY2hhcmFjdGVyIGFzIGZvbGxvd3M6CisgKgorICogICAgLSBUaGUgbnVsbCBjaGFyYWN0ZXIgKFUrMDAwMCkgaGFzIGEgY29sdW1uIHdpZHRoIG9mIDAuCisgKgorICogICAgLSBPdGhlciBDMC9DMSBjb250cm9sIGNoYXJhY3RlcnMgYW5kIERFTCB3aWxsIGxlYWQgdG8gYSByZXR1cm4KKyAqICAgICAgdmFsdWUgb2YgLTEuCisgKgorICogICAgLSBOb24tc3BhY2luZyBhbmQgZW5jbG9zaW5nIGNvbWJpbmluZyBjaGFyYWN0ZXJzIChnZW5lcmFsCisgKiAgICAgIGNhdGVnb3J5IGNvZGUgTW4gb3IgTWUgaW4gdGhlIFVuaWNvZGUgZGF0YWJhc2UpIGhhdmUgYQorICogICAgICBjb2x1bW4gd2lkdGggb2YgMC4KKyAqCisgKiAgICAtIFNPRlQgSFlQSEVOIChVKzAwQUQpIGhhcyBhIGNvbHVtbiB3aWR0aCBvZiAxLgorICoKKyAqICAgIC0gT3RoZXIgZm9ybWF0IGNoYXJhY3RlcnMgKGdlbmVyYWwgY2F0ZWdvcnkgY29kZSBDZiBpbiB0aGUgVW5pY29kZQorICogICAgICBkYXRhYmFzZSkgYW5kIFpFUk8gV0lEVEggU1BBQ0UgKFUrMjAwQikgaGF2ZSBhIGNvbHVtbiB3aWR0aCBvZiAwLgorICoKKyAqICAgIC0gSGFuZ3VsIEphbW8gbWVkaWFsIHZvd2VscyBhbmQgZmluYWwgY29uc29uYW50cyAoVSsxMTYwLVUrMTFGRikKKyAqICAgICAgaGF2ZSBhIGNvbHVtbiB3aWR0aCBvZiAwLgorICoKKyAqICAgIC0gU3BhY2luZyBjaGFyYWN0ZXJzIGluIHRoZSBFYXN0IEFzaWFuIFdpZGUgKFcpIG9yIEVhc3QgQXNpYW4KKyAqICAgICAgRnVsbC13aWR0aCAoRikgY2F0ZWdvcnkgYXMgZGVmaW5lZCBpbiBVbmljb2RlIFRlY2huaWNhbAorICogICAgICBSZXBvcnQgIzExIGhhdmUgYSBjb2x1bW4gd2lkdGggb2YgMi4KKyAqCisgKiAgICAtIEFsbCByZW1haW5pbmcgY2hhcmFjdGVycyAoaW5jbHVkaW5nIGFsbCBwcmludGFibGUKKyAqICAgICAgSVNPIDg4NTktMSBhbmQgV0dMNCBjaGFyYWN0ZXJzLCBVbmljb2RlIGNvbnRyb2wgY2hhcmFjdGVycywKKyAqICAgICAgZXRjLikgaGF2ZSBhIGNvbHVtbiB3aWR0aCBvZiAxLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGF0IHVjc19jaGFyX3QgY2hhcmFjdGVycyBhcmUgZW5jb2RlZAorICogaW4gSVNPIDEwNjQ2LgorICovCisKK3N0YXRpYyBpbnQgZ2l0X3djd2lkdGgodWNzX2NoYXJfdCBjaCkKK3sKKwkvKgorCSAqIFNvcnRlZCBsaXN0IG9mIG5vbi1vdmVybGFwcGluZyBpbnRlcnZhbHMgb2Ygbm9uLXNwYWNpbmcgY2hhcmFjdGVycywKKwkgKiBnZW5lcmF0ZWQgYnkKKwkgKiAgICJ1bmlzZXQgK2NhdD1NZSArY2F0PU1uICtjYXQ9Q2YgLTAwQUQgKzExNjAtMTFGRiArMjAwQiBjIi4KKwkgKi8KKwlzdGF0aWMgY29uc3Qgc3RydWN0IGludGVydmFsIGNvbWJpbmluZ1tdID0geworCQl7IDB4MDMwMCwgMHgwMzU3IH0sIHsgMHgwMzVELCAweDAzNkYgfSwgeyAweDA0ODMsIDB4MDQ4NiB9LAorCQl7IDB4MDQ4OCwgMHgwNDg5IH0sIHsgMHgwNTkxLCAweDA1QTEgfSwgeyAweDA1QTMsIDB4MDVCOSB9LAorCQl7IDB4MDVCQiwgMHgwNUJEIH0sIHsgMHgwNUJGLCAweDA1QkYgfSwgeyAweDA1QzEsIDB4MDVDMiB9LAorCQl7IDB4MDVDNCwgMHgwNUM0IH0sIHsgMHgwNjAwLCAweDA2MDMgfSwgeyAweDA2MTAsIDB4MDYxNSB9LAorCQl7IDB4MDY0QiwgMHgwNjU4IH0sIHsgMHgwNjcwLCAweDA2NzAgfSwgeyAweDA2RDYsIDB4MDZFNCB9LAorCQl7IDB4MDZFNywgMHgwNkU4IH0sIHsgMHgwNkVBLCAweDA2RUQgfSwgeyAweDA3MEYsIDB4MDcwRiB9LAorCQl7IDB4MDcxMSwgMHgwNzExIH0sIHsgMHgwNzMwLCAweDA3NEEgfSwgeyAweDA3QTYsIDB4MDdCMCB9LAorCQl7IDB4MDkwMSwgMHgwOTAyIH0sIHsgMHgwOTNDLCAweDA5M0MgfSwgeyAweDA5NDEsIDB4MDk0OCB9LAorCQl7IDB4MDk0RCwgMHgwOTREIH0sIHsgMHgwOTUxLCAweDA5NTQgfSwgeyAweDA5NjIsIDB4MDk2MyB9LAorCQl7IDB4MDk4MSwgMHgwOTgxIH0sIHsgMHgwOUJDLCAweDA5QkMgfSwgeyAweDA5QzEsIDB4MDlDNCB9LAorCQl7IDB4MDlDRCwgMHgwOUNEIH0sIHsgMHgwOUUyLCAweDA5RTMgfSwgeyAweDBBMDEsIDB4MEEwMiB9LAorCQl7IDB4MEEzQywgMHgwQTNDIH0sIHsgMHgwQTQxLCAweDBBNDIgfSwgeyAweDBBNDcsIDB4MEE0OCB9LAorCQl7IDB4MEE0QiwgMHgwQTREIH0sIHsgMHgwQTcwLCAweDBBNzEgfSwgeyAweDBBODEsIDB4MEE4MiB9LAorCQl7IDB4MEFCQywgMHgwQUJDIH0sIHsgMHgwQUMxLCAweDBBQzUgfSwgeyAweDBBQzcsIDB4MEFDOCB9LAorCQl7IDB4MEFDRCwgMHgwQUNEIH0sIHsgMHgwQUUyLCAweDBBRTMgfSwgeyAweDBCMDEsIDB4MEIwMSB9LAorCQl7IDB4MEIzQywgMHgwQjNDIH0sIHsgMHgwQjNGLCAweDBCM0YgfSwgeyAweDBCNDEsIDB4MEI0MyB9LAorCQl7IDB4MEI0RCwgMHgwQjREIH0sIHsgMHgwQjU2LCAweDBCNTYgfSwgeyAweDBCODIsIDB4MEI4MiB9LAorCQl7IDB4MEJDMCwgMHgwQkMwIH0sIHsgMHgwQkNELCAweDBCQ0QgfSwgeyAweDBDM0UsIDB4MEM0MCB9LAorCQl7IDB4MEM0NiwgMHgwQzQ4IH0sIHsgMHgwQzRBLCAweDBDNEQgfSwgeyAweDBDNTUsIDB4MEM1NiB9LAorCQl7IDB4MENCQywgMHgwQ0JDIH0sIHsgMHgwQ0JGLCAweDBDQkYgfSwgeyAweDBDQzYsIDB4MENDNiB9LAorCQl7IDB4MENDQywgMHgwQ0NEIH0sIHsgMHgwRDQxLCAweDBENDMgfSwgeyAweDBENEQsIDB4MEQ0RCB9LAorCQl7IDB4MERDQSwgMHgwRENBIH0sIHsgMHgwREQyLCAweDBERDQgfSwgeyAweDBERDYsIDB4MERENiB9LAorCQl7IDB4MEUzMSwgMHgwRTMxIH0sIHsgMHgwRTM0LCAweDBFM0EgfSwgeyAweDBFNDcsIDB4MEU0RSB9LAorCQl7IDB4MEVCMSwgMHgwRUIxIH0sIHsgMHgwRUI0LCAweDBFQjkgfSwgeyAweDBFQkIsIDB4MEVCQyB9LAorCQl7IDB4MEVDOCwgMHgwRUNEIH0sIHsgMHgwRjE4LCAweDBGMTkgfSwgeyAweDBGMzUsIDB4MEYzNSB9LAorCQl7IDB4MEYzNywgMHgwRjM3IH0sIHsgMHgwRjM5LCAweDBGMzkgfSwgeyAweDBGNzEsIDB4MEY3RSB9LAorCQl7IDB4MEY4MCwgMHgwRjg0IH0sIHsgMHgwRjg2LCAweDBGODcgfSwgeyAweDBGOTAsIDB4MEY5NyB9LAorCQl7IDB4MEY5OSwgMHgwRkJDIH0sIHsgMHgwRkM2LCAweDBGQzYgfSwgeyAweDEwMkQsIDB4MTAzMCB9LAorCQl7IDB4MTAzMiwgMHgxMDMyIH0sIHsgMHgxMDM2LCAweDEwMzcgfSwgeyAweDEwMzksIDB4MTAzOSB9LAorCQl7IDB4MTA1OCwgMHgxMDU5IH0sIHsgMHgxMTYwLCAweDExRkYgfSwgeyAweDE3MTIsIDB4MTcxNCB9LAorCQl7IDB4MTczMiwgMHgxNzM0IH0sIHsgMHgxNzUyLCAweDE3NTMgfSwgeyAweDE3NzIsIDB4MTc3MyB9LAorCQl7IDB4MTdCNCwgMHgxN0I1IH0sIHsgMHgxN0I3LCAweDE3QkQgfSwgeyAweDE3QzYsIDB4MTdDNiB9LAorCQl7IDB4MTdDOSwgMHgxN0QzIH0sIHsgMHgxN0RELCAweDE3REQgfSwgeyAweDE4MEIsIDB4MTgwRCB9LAorCQl7IDB4MThBOSwgMHgxOEE5IH0sIHsgMHgxOTIwLCAweDE5MjIgfSwgeyAweDE5MjcsIDB4MTkyOCB9LAorCQl7IDB4MTkzMiwgMHgxOTMyIH0sIHsgMHgxOTM5LCAweDE5M0IgfSwgeyAweDIwMEIsIDB4MjAwRiB9LAorCQl7IDB4MjAyQSwgMHgyMDJFIH0sIHsgMHgyMDYwLCAweDIwNjMgfSwgeyAweDIwNkEsIDB4MjA2RiB9LAorCQl7IDB4MjBEMCwgMHgyMEVBIH0sIHsgMHgzMDJBLCAweDMwMkYgfSwgeyAweDMwOTksIDB4MzA5QSB9LAorCQl7IDB4RkIxRSwgMHhGQjFFIH0sIHsgMHhGRTAwLCAweEZFMEYgfSwgeyAweEZFMjAsIDB4RkUyMyB9LAorCQl7IDB4RkVGRiwgMHhGRUZGIH0sIHsgMHhGRkY5LCAweEZGRkIgfSwgeyAweDFEMTY3LCAweDFEMTY5IH0sCisJCXsgMHgxRDE3MywgMHgxRDE4MiB9LCB7IDB4MUQxODUsIDB4MUQxOEIgfSwKKwkJeyAweDFEMUFBLCAweDFEMUFEIH0sIHsgMHhFMDAwMSwgMHhFMDAwMSB9LAorCQl7IDB4RTAwMjAsIDB4RTAwN0YgfSwgeyAweEUwMTAwLCAweEUwMUVGIH0KKwl9OworCisJLyogdGVzdCBmb3IgOC1iaXQgY29udHJvbCBjaGFyYWN0ZXJzICovCisJaWYgKGNoID09IDApCisJCXJldHVybiAwOworCWlmIChjaCA8IDMyIHx8IChjaCA+PSAweDdmICYmIGNoIDwgMHhhMCkpCisJCXJldHVybiAtMTsKKworCS8qIGJpbmFyeSBzZWFyY2ggaW4gdGFibGUgb2Ygbm9uLXNwYWNpbmcgY2hhcmFjdGVycyAqLworCWlmIChiaXNlYXJjaChjaCwgY29tYmluaW5nLCBzaXplb2YoY29tYmluaW5nKQorCQkJCS8gc2l6ZW9mKHN0cnVjdCBpbnRlcnZhbCkgLSAxKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIElmIHdlIGFycml2ZSBoZXJlLCBjaCBpcyBuZWl0aGVyIGEgY29tYmluaW5nIG5vciBhIEMwL0MxCisJICogY29udHJvbCBjaGFyYWN0ZXIuCisJICovCisKKwlyZXR1cm4gMSArCisJCShjaCA+PSAweDExMDAgJiYKKyAgICAgICAgICAgICAgICAgICAgLyogSGFuZ3VsIEphbW8gaW5pdC4gY29uc29uYW50cyAqLworCQkgKGNoIDw9IDB4MTE1ZiB8fAorCQkgIGNoID09IDB4MjMyOSB8fCBjaCA9PSAweDIzMmEgfHwKKyAgICAgICAgICAgICAgICAgIC8qIENKSyAuLi4gWWkgKi8KKwkJICAoY2ggPj0gMHgyZTgwICYmIGNoIDw9IDB4YTRjZiAmJgorCQkgICBjaCAhPSAweDMwM2YpIHx8CisJCSAgLyogSGFuZ3VsIFN5bGxhYmxlcyAqLworCQkgIChjaCA+PSAweGFjMDAgJiYgY2ggPD0gMHhkN2EzKSB8fAorCQkgIC8qIENKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMgKi8KKwkJICAoY2ggPj0gMHhmOTAwICYmIGNoIDw9IDB4ZmFmZikgfHwKKwkJICAvKiBDSksgQ29tcGF0aWJpbGl0eSBGb3JtcyAqLworCQkgIChjaCA+PSAweGZlMzAgJiYgY2ggPD0gMHhmZTZmKSB8fAorCQkgIC8qIEZ1bGx3aWR0aCBGb3JtcyAqLworCQkgIChjaCA+PSAweGZmMDAgJiYgY2ggPD0gMHhmZjYwKSB8fAorCQkgIChjaCA+PSAweGZmZTAgJiYgY2ggPD0gMHhmZmU2KSB8fAorCQkgIChjaCA+PSAweDIwMDAwICYmIGNoIDw9IDB4MmZmZmQpIHx8CisJCSAgKGNoID49IDB4MzAwMDAgJiYgY2ggPD0gMHgzZmZmZCkpKTsKK30KKworLyoKKyAqIFBpY2sgb25lIHVjcyBjaGFyYWN0ZXIgc3RhcnRpbmcgZnJvbSB0aGUgbG9jYXRpb24gKnN0YXJ0IHBvaW50cyBhdCwKKyAqIGFuZCByZXR1cm4gaXQsIHdoaWxlIHVwZGF0aW5nIHRoZSAqc3RhcnQgcG9pbnRlciB0byBwb2ludCBhdCB0aGUKKyAqIGVuZCBvZiB0aGF0IGNoYXJhY3Rlci4gIFdoZW4gcmVtYWluZGVyX3AgaXMgbm90IE5VTEwsIHRoZSBsb2NhdGlvbgorICogaG9sZHMgdGhlIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgaW4gdGhlIHN0cmluZyB0aGF0IHdlIGFyZSBhbGxvd2VkCisgKiB0byBwaWNrIGZyb20uICBPdGhlcndpc2Ugd2UgYXJlIGFsbG93ZWQgdG8gcGljayB1cCB0byB0aGUgTlVMIHRoYXQKKyAqIHdvdWxkIGV2ZW50dWFsbHkgYXBwZWFyIGluIHRoZSBzdHJpbmcuICAqcmVtYWluZGVyX3AgaXMgYWxzbyByZWR1Y2VkCisgKiBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIGhhdmUgY29uc3VtZWQuCisgKgorICogSWYgdGhlIHN0cmluZyB3YXMgbm90IGEgdmFsaWQgVVRGLTgsICpzdGFydCBwb2ludGVyIGlzIHNldCB0byBOVUxMCisgKiBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyB1bmRlZmluZWQuCisgKi8KK3Vjc19jaGFyX3QgcGlja19vbmVfdXRmOF9jaGFyKGNvbnN0IGNoYXIgKipzdGFydCwgc2l6ZV90ICpyZW1haW5kZXJfcCkKK3sKKwl1bnNpZ25lZCBjaGFyICpzID0gKHVuc2lnbmVkIGNoYXIgKikqc3RhcnQ7CisJdWNzX2NoYXJfdCBjaDsKKwlzaXplX3QgcmVtYWluZGVyLCBpbmNyOworCisJLyoKKwkgKiBBIGNhbGxlciB0aGF0IGFzc3VtZXMgTlVMIHRlcm1pbmF0ZWQgdGV4dCBjYW4gY2hvb3NlCisJICogbm90IHRvIGJvdGhlciB3aXRoIHRoZSByZW1haW5kZXIgbGVuZ3RoLiAgV2Ugd2lsbAorCSAqIHN0b3AgYXQgdGhlIGZpcnN0IE5VTC4KKwkgKi8KKwlyZW1haW5kZXIgPSAocmVtYWluZGVyX3AgPyAqcmVtYWluZGVyX3AgOiA5OTkpOworCisJaWYgKHJlbWFpbmRlciA8IDEpIHsKKwkJZ290byBpbnZhbGlkOworCX0gZWxzZSBpZiAoKnMgPCAweDgwKSB7CisJCS8qIDB4eHh4eHh4ICovCisJCWNoID0gKnM7CisJCWluY3IgPSAxOworCX0gZWxzZSBpZiAoKHNbMF0gJiAweGUwKSA9PSAweGMwKSB7CisJCS8qIDExMFhYWFh4IDEweHh4eHh4ICovCisJCWlmIChyZW1haW5kZXIgPCAyIHx8CisJCSAgICAoc1sxXSAmIDB4YzApICE9IDB4ODAgfHwKKwkJICAgIChzWzBdICYgMHhmZSkgPT0gMHhjMCkKKwkJCWdvdG8gaW52YWxpZDsKKwkJY2ggPSAoKHNbMF0gJiAweDFmKSA8PCA2KSB8IChzWzFdICYgMHgzZik7CisJCWluY3IgPSAyOworCX0gZWxzZSBpZiAoKHNbMF0gJiAweGYwKSA9PSAweGUwKSB7CisJCS8qIDExMTBYWFhYIDEwWHh4eHh4IDEweHh4eHh4ICovCisJCWlmIChyZW1haW5kZXIgPCAzIHx8CisJCSAgICAoc1sxXSAmIDB4YzApICE9IDB4ODAgfHwKKwkJICAgIChzWzJdICYgMHhjMCkgIT0gMHg4MCB8fAorCQkgICAgLyogb3Zlcmxvbmc/ICovCisJCSAgICAoc1swXSA9PSAweGUwICYmIChzWzFdICYgMHhlMCkgPT0gMHg4MCkgfHwKKwkJICAgIC8qIHN1cnJvZ2F0ZT8gKi8KKwkJICAgIChzWzBdID09IDB4ZWQgJiYgKHNbMV0gJiAweGUwKSA9PSAweGEwKSB8fAorCQkgICAgLyogVStGRkZFIG9yIFUrRkZGRj8gKi8KKwkJICAgIChzWzBdID09IDB4ZWYgJiYgc1sxXSA9PSAweGJmICYmCisJCSAgICAgKHNbMl0gJiAweGZlKSA9PSAweGJlKSkKKwkJCWdvdG8gaW52YWxpZDsKKwkJY2ggPSAoKHNbMF0gJiAweDBmKSA8PCAxMikgfAorCQkJKChzWzFdICYgMHgzZikgPDwgNikgfCAoc1syXSAmIDB4M2YpOworCQlpbmNyID0gMzsKKwl9IGVsc2UgaWYgKChzWzBdICYgMHhmOCkgPT0gMHhmMCkgeworCQkvKiAxMTExMFhYWCAxMFhYeHh4eCAxMHh4eHh4eCAxMHh4eHh4eCAqLworCQlpZiAocmVtYWluZGVyIDwgNCB8fAorCQkgICAgKHNbMV0gJiAweGMwKSAhPSAweDgwIHx8CisJCSAgICAoc1syXSAmIDB4YzApICE9IDB4ODAgfHwKKwkJICAgIChzWzNdICYgMHhjMCkgIT0gMHg4MCB8fAorCQkgICAgLyogb3Zlcmxvbmc/ICovCisJCSAgICAoc1swXSA9PSAweGYwICYmIChzWzFdICYgMHhmMCkgPT0gMHg4MCkgfHwKKwkJICAgIC8qID4gVSsxMEZGRkY/ICovCisJCSAgICAoc1swXSA9PSAweGY0ICYmIHNbMV0gPiAweDhmKSB8fCBzWzBdID4gMHhmNCkKKwkJCWdvdG8gaW52YWxpZDsKKwkJY2ggPSAoKHNbMF0gJiAweDA3KSA8PCAxOCkgfCAoKHNbMV0gJiAweDNmKSA8PCAxMikgfAorCQkJKChzWzJdICYgMHgzZikgPDwgNikgfCAoc1szXSAmIDB4M2YpOworCQlpbmNyID0gNDsKKwl9IGVsc2UgeworaW52YWxpZDoKKwkJKnN0YXJ0ID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJKnN0YXJ0ICs9IGluY3I7CisJaWYgKHJlbWFpbmRlcl9wKQorCQkqcmVtYWluZGVyX3AgPSByZW1haW5kZXIgLSBpbmNyOworCXJldHVybiBjaDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgb2NjdXBpZWQgYnkgdGhlIGNoYXJhY3RlcgorICogcG9pbnRlZCB0byBieSB0aGUgdmFyaWFibGUgc3RhcnQuIFRoZSBwb2ludGVyIGlzIHVwZGF0ZWQgdG8gcG9pbnQgYXQKKyAqIHRoZSBuZXh0IGNoYXJhY3Rlci4gV2hlbiByZW1haW5kZXJfcCBpcyBub3QgTlVMTCwgaXQgcG9pbnRzIGF0IHRoZQorICogbG9jYXRpb24gdGhhdCBzdG9yZXMgdGhlIG51bWJlciBvZiByZW1haW5pbmcgYnl0ZXMgd2UgY2FuIHVzZSB0byBwaWNrCisgKiBhIGNoYXJhY3RlciAoc2VlIHBpY2tfb25lX3V0ZjhfY2hhcigpIGFib3ZlKS4KKyAqLworaW50IHV0Zjhfd2lkdGgoY29uc3QgY2hhciAqKnN0YXJ0LCBzaXplX3QgKnJlbWFpbmRlcl9wKQoreworCXVjc19jaGFyX3QgY2ggPSBwaWNrX29uZV91dGY4X2NoYXIoc3RhcnQsIHJlbWFpbmRlcl9wKTsKKwlpZiAoISpzdGFydCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGdpdF93Y3dpZHRoKGNoKTsKK30KKworaW50IGlzX3V0ZjgoY29uc3QgY2hhciAqdGV4dCkKK3sKKwl3aGlsZSAoKnRleHQpIHsKKwkJaWYgKCp0ZXh0ID09ICdcbicgfHwgKnRleHQgPT0gJ1x0JyB8fCAqdGV4dCA9PSAnXHInKSB7CisJCQl0ZXh0Kys7CisJCQljb250aW51ZTsKKwkJfQorCQl1dGY4X3dpZHRoKCZ0ZXh0LCBOVUxMKTsKKwkJaWYgKCF0ZXh0KQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zcGFjZXMoaW50IGNvdW50KQoreworCXN0YXRpYyBjb25zdCBjaGFyIHNbXSA9ICIgICAgICAgICAgICAgICAgICAgICI7CisJd2hpbGUgKGNvdW50ID49IHNpemVvZihzKSkgeworCQlmd3JpdGUocywgc2l6ZW9mKHMpIC0gMSwgMSwgc3Rkb3V0KTsKKwkJY291bnQgLT0gc2l6ZW9mKHMpIC0gMTsKKwl9CisJZndyaXRlKHMsIGNvdW50LCAxLCBzdGRvdXQpOworfQorCisvKgorICogV3JhcCB0aGUgdGV4dCwgaWYgbmVjZXNzYXJ5LiBUaGUgdmFyaWFibGUgaW5kZW50IGlzIHRoZSBpbmRlbnQgZm9yIHRoZQorICogZmlyc3QgbGluZSwgaW5kZW50MiBpcyB0aGUgaW5kZW50IGZvciBhbGwgb3RoZXIgbGluZXMuCisgKiBJZiBpbmRlbnQgaXMgbmVnYXRpdmUsIGFzc3VtZSB0aGF0IGFscmVhZHkgLWluZGVudCBjb2x1bW5zIGhhdmUgYmVlbgorICogY29uc3VtZWQgKGFuZCBubyBleHRyYSBpbmRlbnQgaXMgbmVjZXNzYXJ5IGZvciB0aGUgZmlyc3QgbGluZSkuCisgKi8KK2ludCBwcmludF93cmFwcGVkX3RleHQoY29uc3QgY2hhciAqdGV4dCwgaW50IGluZGVudCwgaW50IGluZGVudDIsIGludCB3aWR0aCkKK3sKKwlpbnQgdyA9IGluZGVudCwgYXNzdW1lX3V0ZjggPSBpc191dGY4KHRleHQpOworCWNvbnN0IGNoYXIgKmJvbCA9IHRleHQsICpzcGFjZSA9IE5VTEw7CisKKwlpZiAoaW5kZW50IDwgMCkgeworCQl3ID0gLWluZGVudDsKKwkJc3BhY2UgPSB0ZXh0OworCX0KKworCWZvciAoOzspIHsKKwkJY2hhciBjID0gKnRleHQ7CisJCWlmICghYyB8fCBpc3NwYWNlKGMpKSB7CisJCQlpZiAodyA8IHdpZHRoIHx8ICFzcGFjZSkgeworCQkJCWNvbnN0IGNoYXIgKnN0YXJ0ID0gYm9sOworCQkJCWlmIChzcGFjZSkKKwkJCQkJc3RhcnQgPSBzcGFjZTsKKwkJCQllbHNlCisJCQkJCXByaW50X3NwYWNlcyhpbmRlbnQpOworCQkJCWZ3cml0ZShzdGFydCwgdGV4dCAtIHN0YXJ0LCAxLCBzdGRvdXQpOworCQkJCWlmICghYykKKwkJCQkJcmV0dXJuIHc7CisJCQkJZWxzZSBpZiAoYyA9PSAnXHQnKQorCQkJCQl3IHw9IDB4MDc7CisJCQkJc3BhY2UgPSB0ZXh0OworCQkJCXcrKzsKKwkJCQl0ZXh0Kys7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwdXRjaGFyKCdcbicpOworCQkJCXRleHQgPSBib2wgPSBzcGFjZSArIGlzc3BhY2UoKnNwYWNlKTsKKwkJCQlzcGFjZSA9IE5VTEw7CisJCQkJdyA9IGluZGVudCA9IGluZGVudDI7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYXNzdW1lX3V0ZjgpCisJCQl3ICs9IHV0Zjhfd2lkdGgoJnRleHQsIE5VTEwpOworCQllbHNlIHsKKwkJCXcrKzsKKwkJCXRleHQrKzsKKwkJfQorCX0KK30KKworaW50IGlzX2VuY29kaW5nX3V0ZjgoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoIW5hbWUpCisJCXJldHVybiAxOworCWlmICghc3RyY2FzZWNtcChuYW1lLCAidXRmLTgiKSB8fCAhc3RyY2FzZWNtcChuYW1lLCAidXRmOCIpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEdpdmVuIGEgYnVmZmVyIGFuZCBpdHMgZW5jb2RpbmcsIHJldHVybiBpdCByZS1lbmNvZGVkCisgKiB3aXRoIGljb252LiAgSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMsIHJldHVybnMgTlVMTC4KKyAqLworI2lmbmRlZiBOT19JQ09OVgorI2lmZGVmIE9MRF9JQ09OVgorCXR5cGVkZWYgY29uc3QgY2hhciAqIGljb252X2licDsKKyNlbHNlCisJdHlwZWRlZiBjaGFyICogaWNvbnZfaWJwOworI2VuZGlmCitjaGFyICpyZWVuY29kZV9zdHJpbmcoY29uc3QgY2hhciAqaW4sIGNvbnN0IGNoYXIgKm91dF9lbmNvZGluZywgY29uc3QgY2hhciAqaW5fZW5jb2RpbmcpCit7CisJaWNvbnZfdCBjb252OworCXNpemVfdCBpbnN6LCBvdXRzeiwgb3V0YWxsb2M7CisJY2hhciAqb3V0LCAqb3V0cG9zOworCWljb252X2licCBjcDsKKworCWlmICghaW5fZW5jb2RpbmcpCisJCXJldHVybiBOVUxMOworCWNvbnYgPSBpY29udl9vcGVuKG91dF9lbmNvZGluZywgaW5fZW5jb2RpbmcpOworCWlmIChjb252ID09IChpY29udl90KSAtMSkKKwkJcmV0dXJuIE5VTEw7CisJaW5zeiA9IHN0cmxlbihpbik7CisJb3V0c3ogPSBpbnN6OworCW91dGFsbG9jID0gb3V0c3ogKyAxOyAvKiBmb3IgdGVybWluYXRpbmcgTlVMICovCisJb3V0ID0geG1hbGxvYyhvdXRhbGxvYyk7CisJb3V0cG9zID0gb3V0OworCWNwID0gKGljb252X2licClpbjsKKworCXdoaWxlICgxKSB7CisJCXNpemVfdCBjbnQgPSBpY29udihjb252LCAmY3AsICZpbnN6LCAmb3V0cG9zLCAmb3V0c3opOworCisJCWlmIChjbnQgPT0gLTEpIHsKKwkJCXNpemVfdCBzb2ZhcjsKKwkJCWlmIChlcnJubyAhPSBFMkJJRykgeworCQkJCWZyZWUob3V0KTsKKwkJCQlpY29udl9jbG9zZShjb252KTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCS8qIGluc3ogaGFzIHJlbWFpbmluZyBudW1iZXIgb2YgYnl0ZXMuCisJCQkgKiBzaW5jZSB3ZSBzdGFydGVkIG91dHN6IHRoZSBzYW1lIGFzIGluc3osCisJCQkgKiBpdCBpcyBsaWtlbHkgdGhhdCBpbnN6IGlzIG5vdCBlbm91Z2ggZm9yCisJCQkgKiBjb252ZXJ0aW5nIHRoZSByZXN0LgorCQkJICovCisJCQlzb2ZhciA9IG91dHBvcyAtIG91dDsKKwkJCW91dGFsbG9jID0gc29mYXIgKyBpbnN6ICogMiArIDMyOworCQkJb3V0ID0geHJlYWxsb2Mob3V0LCBvdXRhbGxvYyk7CisJCQlvdXRwb3MgPSBvdXQgKyBzb2ZhcjsKKwkJCW91dHN6ID0gb3V0YWxsb2MgLSBzb2ZhciAtIDE7CisJCX0KKwkJZWxzZSB7CisJCQkqb3V0cG9zID0gJ1wwJzsKKwkJCWJyZWFrOworCQl9CisJfQorCWljb252X2Nsb3NlKGNvbnYpOworCXJldHVybiBvdXQ7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3V0ZjguaCBiL3V0ZjguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGNjZTFiCi0tLSAvZGV2L251bGwKKysrIGIvdXRmOC5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgR0lUX1VURjhfSAorI2RlZmluZSBHSVRfVVRGOF9ICisKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVjc19jaGFyX3Q7ICAvKiBhc3N1bWluZyAzMmJpdCBpbnQgKi8KKwordWNzX2NoYXJfdCBwaWNrX29uZV91dGY4X2NoYXIoY29uc3QgY2hhciAqKnN0YXJ0LCBzaXplX3QgKnJlbWFpbmRlcl9wKTsKK2ludCB1dGY4X3dpZHRoKGNvbnN0IGNoYXIgKipzdGFydCwgc2l6ZV90ICpyZW1haW5kZXJfcCk7CitpbnQgaXNfdXRmOChjb25zdCBjaGFyICp0ZXh0KTsKK2ludCBpc19lbmNvZGluZ191dGY4KGNvbnN0IGNoYXIgKm5hbWUpOworCitpbnQgcHJpbnRfd3JhcHBlZF90ZXh0KGNvbnN0IGNoYXIgKnRleHQsIGludCBpbmRlbnQsIGludCBpbmRlbnQyLCBpbnQgbGVuKTsKKworI2lmbmRlZiBOT19JQ09OVgorY2hhciAqcmVlbmNvZGVfc3RyaW5nKGNvbnN0IGNoYXIgKmluLCBjb25zdCBjaGFyICpvdXRfZW5jb2RpbmcsIGNvbnN0IGNoYXIgKmluX2VuY29kaW5nKTsKKyNlbHNlCisjZGVmaW5lIHJlZW5jb2RlX3N0cmluZyhhLGIsYykgTlVMTAorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdmFyLmMgYi92YXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGUwZWZhCi0tLSAvZGV2L251bGwKKysrIGIvdmFyLmMKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgRXJpYyBCaWVkZXJtYW4sIDIwMDUKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIHZhcl91c2FnZVtdID0gImdpdC12YXIgWy1sIHwgPHZhcmlhYmxlPl0iOworCitzdHJ1Y3QgZ2l0X3ZhciB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICooKnJlYWQpKGludCk7Cit9Oworc3RhdGljIHN0cnVjdCBnaXRfdmFyIGdpdF92YXJzW10gPSB7CisJeyAiR0lUX0NPTU1JVFRFUl9JREVOVCIsIGdpdF9jb21taXR0ZXJfaW5mbyB9LAorCXsgIkdJVF9BVVRIT1JfSURFTlQiLCAgIGdpdF9hdXRob3JfaW5mbyB9LAorCXsgIiIsIE5VTEwgfSwKK307CisKK3N0YXRpYyB2b2lkIGxpc3RfdmFycyh2b2lkKQoreworCXN0cnVjdCBnaXRfdmFyICpwdHI7CisJZm9yKHB0ciA9IGdpdF92YXJzOyBwdHItPnJlYWQ7IHB0cisrKSB7CisJCXByaW50ZigiJXM9JXNcbiIsIHB0ci0+bmFtZSwgcHRyLT5yZWFkKElERU5UX1dBUk5fT05fTk9fTkFNRSkpOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnJlYWRfdmFyKGNvbnN0IGNoYXIgKnZhcikKK3sKKwlzdHJ1Y3QgZ2l0X3ZhciAqcHRyOworCWNvbnN0IGNoYXIgKnZhbDsKKwl2YWwgPSBOVUxMOworCWZvcihwdHIgPSBnaXRfdmFyczsgcHRyLT5yZWFkOyBwdHIrKykgeworCQlpZiAoc3RyY21wKHZhciwgcHRyLT5uYW1lKSA9PSAwKSB7CisJCQl2YWwgPSBwdHItPnJlYWQoSURFTlRfRVJST1JfT05fTk9fTkFNRSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IHNob3dfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKHZhbHVlKQorCQlwcmludGYoIiVzPSVzXG4iLCB2YXIsIHZhbHVlKTsKKwllbHNlCisJCXByaW50ZigiJXNcbiIsIHZhcik7CisJcmV0dXJuIGdpdF9kZWZhdWx0X2NvbmZpZyh2YXIsIHZhbHVlKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKnZhbDsKKwlpZiAoYXJnYyAhPSAyKSB7CisJCXVzYWdlKHZhcl91c2FnZSk7CisJfQorCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCXZhbCA9IE5VTEw7CisKKwlpZiAoc3RyY21wKGFyZ3ZbMV0sICItbCIpID09IDApIHsKKwkJZ2l0X2NvbmZpZyhzaG93X2NvbmZpZyk7CisJCWxpc3RfdmFycygpOworCQlyZXR1cm4gMDsKKwl9CisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCXZhbCA9IHJlYWRfdmFyKGFyZ3ZbMV0pOworCWlmICghdmFsKQorCQl1c2FnZSh2YXJfdXNhZ2UpOworCisJcHJpbnRmKCIlc1xuIiwgdmFsKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvd2Fsa2VyLmMgYi93YWxrZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTBlY2E4Ci0tLSAvZGV2L251bGwKKysrIGIvd2Fsa2VyLmMKQEAgLTAsMCArMSwzMTYgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgIndhbGtlci5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJ0cmVlLXdhbGsuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAicmVmcy5oIgorCitzdGF0aWMgdW5zaWduZWQgY2hhciBjdXJyZW50X2NvbW1pdF9zaGExWzIwXTsKKwordm9pZCB3YWxrZXJfc2F5KHN0cnVjdCB3YWxrZXIgKndhbGtlciwgY29uc3QgY2hhciAqZm10LCBjb25zdCBjaGFyICpoZXgpCit7CisJaWYgKHdhbGtlci0+Z2V0X3ZlcmJvc2VseSkKKwkJZnByaW50ZihzdGRlcnIsIGZtdCwgaGV4KTsKK30KKworc3RhdGljIHZvaWQgcmVwb3J0X21pc3NpbmcoY29uc3Qgc3RydWN0IG9iamVjdCAqb2JqKQoreworCWNoYXIgbWlzc2luZ19oZXhbNDFdOworCXN0cmNweShtaXNzaW5nX2hleCwgc2hhMV90b19oZXgob2JqLT5zaGExKSk7OworCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9idGFpbiBuZWVkZWQgJXMgJXNcbiIsCisJCW9iai0+dHlwZSA/IHR5cGVuYW1lKG9iai0+dHlwZSk6ICJvYmplY3QiLCBtaXNzaW5nX2hleCk7CisJaWYgKCFpc19udWxsX3NoYTEoY3VycmVudF9jb21taXRfc2hhMSkpCisJCWZwcmludGYoc3RkZXJyLCAid2hpbGUgcHJvY2Vzc2luZyBjb21taXQgJXMuXG4iLAorCQkJc2hhMV90b19oZXgoY3VycmVudF9jb21taXRfc2hhMSkpOworfQorCitzdGF0aWMgaW50IHByb2Nlc3Moc3RydWN0IHdhbGtlciAqd2Fsa2VyLCBzdHJ1Y3Qgb2JqZWN0ICpvYmopOworCitzdGF0aWMgaW50IHByb2Nlc3NfdHJlZShzdHJ1Y3Qgd2Fsa2VyICp3YWxrZXIsIHN0cnVjdCB0cmVlICp0cmVlKQoreworCXN0cnVjdCB0cmVlX2Rlc2MgZGVzYzsKKwlzdHJ1Y3QgbmFtZV9lbnRyeSBlbnRyeTsKKworCWlmIChwYXJzZV90cmVlKHRyZWUpKQorCQlyZXR1cm4gLTE7CisKKwlpbml0X3RyZWVfZGVzYygmZGVzYywgdHJlZS0+YnVmZmVyLCB0cmVlLT5zaXplKTsKKwl3aGlsZSAodHJlZV9lbnRyeSgmZGVzYywgJmVudHJ5KSkgeworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBOVUxMOworCisJCS8qIHN1Ym1vZHVsZSBjb21taXRzIGFyZSBub3Qgc3RvcmVkIGluIHRoZSBzdXBlcnByb2plY3QgKi8KKwkJaWYgKFNfSVNHSVRMSU5LKGVudHJ5Lm1vZGUpKQorCQkJY29udGludWU7CisJCWlmIChTX0lTRElSKGVudHJ5Lm1vZGUpKSB7CisJCQlzdHJ1Y3QgdHJlZSAqdHJlZSA9IGxvb2t1cF90cmVlKGVudHJ5LnNoYTEpOworCQkJaWYgKHRyZWUpCisJCQkJb2JqID0gJnRyZWUtPm9iamVjdDsKKwkJfQorCQllbHNlIHsKKwkJCXN0cnVjdCBibG9iICpibG9iID0gbG9va3VwX2Jsb2IoZW50cnkuc2hhMSk7CisJCQlpZiAoYmxvYikKKwkJCQlvYmogPSAmYmxvYi0+b2JqZWN0OworCQl9CisJCWlmICghb2JqIHx8IHByb2Nlc3Mod2Fsa2VyLCBvYmopKQorCQkJcmV0dXJuIC0xOworCX0KKwlmcmVlKHRyZWUtPmJ1ZmZlcik7CisJdHJlZS0+YnVmZmVyID0gTlVMTDsKKwl0cmVlLT5zaXplID0gMDsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBDT01QTEVURQkoMVUgPDwgMCkKKyNkZWZpbmUgU0VFTgkJKDFVIDw8IDEpCisjZGVmaW5lIFRPX1NDQU4JCSgxVSA8PCAyKQorCitzdGF0aWMgc3RydWN0IGNvbW1pdF9saXN0ICpjb21wbGV0ZSA9IE5VTEw7CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19jb21taXQoc3RydWN0IHdhbGtlciAqd2Fsa2VyLCBzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJaWYgKHBhcnNlX2NvbW1pdChjb21taXQpKQorCQlyZXR1cm4gLTE7CisKKwl3aGlsZSAoY29tcGxldGUgJiYgY29tcGxldGUtPml0ZW0tPmRhdGUgPj0gY29tbWl0LT5kYXRlKSB7CisJCXBvcF9tb3N0X3JlY2VudF9jb21taXQoJmNvbXBsZXRlLCBDT01QTEVURSk7CisJfQorCisJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgQ09NUExFVEUpCisJCXJldHVybiAwOworCisJaGFzaGNweShjdXJyZW50X2NvbW1pdF9zaGExLCBjb21taXQtPm9iamVjdC5zaGExKTsKKworCXdhbGtlcl9zYXkod2Fsa2VyLCAid2FsayAlc1xuIiwgc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCisJaWYgKHdhbGtlci0+Z2V0X3RyZWUpIHsKKwkJaWYgKHByb2Nlc3Mod2Fsa2VyLCAmY29tbWl0LT50cmVlLT5vYmplY3QpKQorCQkJcmV0dXJuIC0xOworCQlpZiAoIXdhbGtlci0+Z2V0X2FsbCkKKwkJCXdhbGtlci0+Z2V0X3RyZWUgPSAwOworCX0KKwlpZiAod2Fsa2VyLT5nZXRfaGlzdG9yeSkgeworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7CisJCWZvciAoOyBwYXJlbnRzOyBwYXJlbnRzID0gcGFyZW50cy0+bmV4dCkgeworCQkJaWYgKHByb2Nlc3Mod2Fsa2VyLCAmcGFyZW50cy0+aXRlbS0+b2JqZWN0KSkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc190YWcoc3RydWN0IHdhbGtlciAqd2Fsa2VyLCBzdHJ1Y3QgdGFnICp0YWcpCit7CisJaWYgKHBhcnNlX3RhZyh0YWcpKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIHByb2Nlc3Mod2Fsa2VyLCB0YWctPnRhZ2dlZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X2xpc3QgKnByb2Nlc3NfcXVldWUgPSBOVUxMOworc3RhdGljIHN0cnVjdCBvYmplY3RfbGlzdCAqKnByb2Nlc3NfcXVldWVfZW5kID0gJnByb2Nlc3NfcXVldWU7CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19vYmplY3Qoc3RydWN0IHdhbGtlciAqd2Fsa2VyLCBzdHJ1Y3Qgb2JqZWN0ICpvYmopCit7CisJaWYgKG9iai0+dHlwZSA9PSBPQkpfQ09NTUlUKSB7CisJCWlmIChwcm9jZXNzX2NvbW1pdCh3YWxrZXIsIChzdHJ1Y3QgY29tbWl0ICopb2JqKSkKKwkJCXJldHVybiAtMTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChvYmotPnR5cGUgPT0gT0JKX1RSRUUpIHsKKwkJaWYgKHByb2Nlc3NfdHJlZSh3YWxrZXIsIChzdHJ1Y3QgdHJlZSAqKW9iaikpCisJCQlyZXR1cm4gLTE7CisJCXJldHVybiAwOworCX0KKwlpZiAob2JqLT50eXBlID09IE9CSl9CTE9CKSB7CisJCXJldHVybiAwOworCX0KKwlpZiAob2JqLT50eXBlID09IE9CSl9UQUcpIHsKKwkJaWYgKHByb2Nlc3NfdGFnKHdhbGtlciwgKHN0cnVjdCB0YWcgKilvYmopKQorCQkJcmV0dXJuIC0xOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gZGV0ZXJtaW5lIHJlcXVpcmVtZW50cyAiCisJCSAgICAgIm9mIHR5cGUgJXMgZm9yICVzIiwKKwkJICAgICB0eXBlbmFtZShvYmotPnR5cGUpLCBzaGExX3RvX2hleChvYmotPnNoYTEpKTsKK30KKworc3RhdGljIGludCBwcm9jZXNzKHN0cnVjdCB3YWxrZXIgKndhbGtlciwgc3RydWN0IG9iamVjdCAqb2JqKQoreworCWlmIChvYmotPmZsYWdzICYgU0VFTikKKwkJcmV0dXJuIDA7CisJb2JqLT5mbGFncyB8PSBTRUVOOworCisJaWYgKGhhc19zaGExX2ZpbGUob2JqLT5zaGExKSkgeworCQkvKiBXZSBhbHJlYWR5IGhhdmUgaXQsIHNvIHdlIHNob3VsZCBzY2FuIGl0IG5vdy4gKi8KKwkJb2JqLT5mbGFncyB8PSBUT19TQ0FOOworCX0KKwllbHNlIHsKKwkJaWYgKG9iai0+ZmxhZ3MgJiBDT01QTEVURSkKKwkJCXJldHVybiAwOworCQl3YWxrZXItPnByZWZldGNoKHdhbGtlciwgb2JqLT5zaGExKTsKKwl9CisKKwlvYmplY3RfbGlzdF9pbnNlcnQob2JqLCBwcm9jZXNzX3F1ZXVlX2VuZCk7CisJcHJvY2Vzc19xdWV1ZV9lbmQgPSAmKCpwcm9jZXNzX3F1ZXVlX2VuZCktPm5leHQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbG9vcChzdHJ1Y3Qgd2Fsa2VyICp3YWxrZXIpCit7CisJc3RydWN0IG9iamVjdF9saXN0ICplbGVtOworCisJd2hpbGUgKHByb2Nlc3NfcXVldWUpIHsKKwkJc3RydWN0IG9iamVjdCAqb2JqID0gcHJvY2Vzc19xdWV1ZS0+aXRlbTsKKwkJZWxlbSA9IHByb2Nlc3NfcXVldWU7CisJCXByb2Nlc3NfcXVldWUgPSBlbGVtLT5uZXh0OworCQlmcmVlKGVsZW0pOworCQlpZiAoIXByb2Nlc3NfcXVldWUpCisJCQlwcm9jZXNzX3F1ZXVlX2VuZCA9ICZwcm9jZXNzX3F1ZXVlOworCisJCS8qIElmIHdlIGFyZSBub3Qgc2Nhbm5pbmcgdGhpcyBvYmplY3QsIHdlIHBsYWNlZCBpdCBpbgorCQkgKiB0aGUgcXVldWUgYmVjYXVzZSB3ZSBuZWVkZWQgdG8gZmV0Y2ggaXQgZmlyc3QuCisJCSAqLworCQlpZiAoISAob2JqLT5mbGFncyAmIFRPX1NDQU4pKSB7CisJCQlpZiAod2Fsa2VyLT5mZXRjaCh3YWxrZXIsIG9iai0+c2hhMSkpIHsKKwkJCQlyZXBvcnRfbWlzc2luZyhvYmopOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoIW9iai0+dHlwZSkKKwkJCXBhcnNlX29iamVjdChvYmotPnNoYTEpOworCQlpZiAocHJvY2Vzc19vYmplY3Qod2Fsa2VyLCBvYmopKQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlcnByZXRfdGFyZ2V0KHN0cnVjdCB3YWxrZXIgKndhbGtlciwgY2hhciAqdGFyZ2V0LCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWlmICghZ2V0X3NoYTFfaGV4KHRhcmdldCwgc2hhMSkpCisJCXJldHVybiAwOworCWlmICghY2hlY2tfcmVmX2Zvcm1hdCh0YXJnZXQpKSB7CisJCWlmICghd2Fsa2VyLT5mZXRjaF9yZWYod2Fsa2VyLCB0YXJnZXQsIHNoYTEpKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgbWFya19jb21wbGV0ZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmxhZywgdm9pZCAqY2JfZGF0YSkKK3sKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZV9nZW50bHkoc2hhMSwgMSk7CisJaWYgKGNvbW1pdCkgeworCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBDT01QTEVURTsKKwkJaW5zZXJ0X2J5X2RhdGUoY29tbWl0LCAmY29tcGxldGUpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHdhbGtlcl90YXJnZXRzX3N0ZGluKGNoYXIgKioqdGFyZ2V0LCBjb25zdCBjaGFyICoqKndyaXRlX3JlZikKK3sKKwlpbnQgdGFyZ2V0cyA9IDAsIHRhcmdldHNfYWxsb2MgPSAwOworCXN0cnVjdCBzdHJidWYgYnVmOworCSp0YXJnZXQgPSBOVUxMOyAqd3JpdGVfcmVmID0gTlVMTDsKKwlzdHJidWZfaW5pdCgmYnVmLCAwKTsKKwl3aGlsZSAoMSkgeworCQljaGFyICpyZl9vbmUgPSBOVUxMOworCQljaGFyICp0Z19vbmU7CisKKwkJaWYgKHN0cmJ1Zl9nZXRsaW5lKCZidWYsIHN0ZGluLCAnXG4nKSA9PSBFT0YpCisJCQlicmVhazsKKwkJdGdfb25lID0gYnVmLmJ1ZjsKKwkJcmZfb25lID0gc3RyY2hyKHRnX29uZSwgJ1x0Jyk7CisJCWlmIChyZl9vbmUpCisJCQkqcmZfb25lKysgPSAwOworCisJCWlmICh0YXJnZXRzID49IHRhcmdldHNfYWxsb2MpIHsKKwkJCXRhcmdldHNfYWxsb2MgPSB0YXJnZXRzX2FsbG9jID8gdGFyZ2V0c19hbGxvYyAqIDIgOiA2NDsKKwkJCSp0YXJnZXQgPSB4cmVhbGxvYygqdGFyZ2V0LCB0YXJnZXRzX2FsbG9jICogc2l6ZW9mKCoqdGFyZ2V0KSk7CisJCQkqd3JpdGVfcmVmID0geHJlYWxsb2MoKndyaXRlX3JlZiwgdGFyZ2V0c19hbGxvYyAqIHNpemVvZigqKndyaXRlX3JlZikpOworCQl9CisJCSgqdGFyZ2V0KVt0YXJnZXRzXSA9IHhzdHJkdXAodGdfb25lKTsKKwkJKCp3cml0ZV9yZWYpW3RhcmdldHNdID0gcmZfb25lID8geHN0cmR1cChyZl9vbmUpIDogTlVMTDsKKwkJdGFyZ2V0cysrOworCX0KKwlzdHJidWZfcmVsZWFzZSgmYnVmKTsKKwlyZXR1cm4gdGFyZ2V0czsKK30KKwordm9pZCB3YWxrZXJfdGFyZ2V0c19mcmVlKGludCB0YXJnZXRzLCBjaGFyICoqdGFyZ2V0LCBjb25zdCBjaGFyICoqd3JpdGVfcmVmKQoreworCXdoaWxlICh0YXJnZXRzLS0pIHsKKwkJZnJlZSh0YXJnZXRbdGFyZ2V0c10pOworCQlpZiAod3JpdGVfcmVmICYmIHdyaXRlX3JlZlt0YXJnZXRzXSkKKwkJCWZyZWUoKGNoYXIgKikgd3JpdGVfcmVmW3RhcmdldHNdKTsKKwl9Cit9CisKK2ludCB3YWxrZXJfZmV0Y2goc3RydWN0IHdhbGtlciAqd2Fsa2VyLCBpbnQgdGFyZ2V0cywgY2hhciAqKnRhcmdldCwKKwkJIGNvbnN0IGNoYXIgKip3cml0ZV9yZWYsIGNvbnN0IGNoYXIgKndyaXRlX3JlZl9sb2dfZGV0YWlscykKK3sKKwlzdHJ1Y3QgcmVmX2xvY2sgKipsb2NrID0geGNhbGxvYyh0YXJnZXRzLCBzaXplb2Yoc3RydWN0IHJlZl9sb2NrICopKTsKKwl1bnNpZ25lZCBjaGFyICpzaGExID0geG1hbGxvYyh0YXJnZXRzICogMjApOworCWNoYXIgKm1zZzsKKwlpbnQgcmV0OworCWludCBpOworCisJc2F2ZV9jb21taXRfYnVmZmVyID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCB0YXJnZXRzOyBpKyspIHsKKwkJaWYgKCF3cml0ZV9yZWYgfHwgIXdyaXRlX3JlZltpXSkKKwkJCWNvbnRpbnVlOworCisJCWxvY2tbaV0gPSBsb2NrX3JlZl9zaGExKHdyaXRlX3JlZltpXSwgTlVMTCk7CisJCWlmICghbG9ja1tpXSkgeworCQkJZXJyb3IoIkNhbid0IGxvY2sgcmVmICVzIiwgd3JpdGVfcmVmW2ldKTsKKwkJCWdvdG8gdW5sb2NrX2FuZF9mYWlsOworCQl9CisJfQorCisJaWYgKCF3YWxrZXItPmdldF9yZWNvdmVyKQorCQlmb3JfZWFjaF9yZWYobWFya19jb21wbGV0ZSwgTlVMTCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0czsgaSsrKSB7CisJCWlmIChpbnRlcnByZXRfdGFyZ2V0KHdhbGtlciwgdGFyZ2V0W2ldLCAmc2hhMVsyMCAqIGldKSkgeworCQkJZXJyb3IoIkNvdWxkIG5vdCBpbnRlcnByZXQgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIgJyVzJyBhcyBzb21ldGhpbmcgdG8gcHVsbCIsIHRhcmdldFtpXSk7CisJCQlnb3RvIHVubG9ja19hbmRfZmFpbDsKKwkJfQorCQlpZiAocHJvY2Vzcyh3YWxrZXIsIGxvb2t1cF91bmtub3duX29iamVjdCgmc2hhMVsyMCAqIGldKSkpCisJCQlnb3RvIHVubG9ja19hbmRfZmFpbDsKKwl9CisKKwlpZiAobG9vcCh3YWxrZXIpKQorCQlnb3RvIHVubG9ja19hbmRfZmFpbDsKKworCWlmICh3cml0ZV9yZWZfbG9nX2RldGFpbHMpIHsKKwkJbXNnID0geG1hbGxvYyhzdHJsZW4od3JpdGVfcmVmX2xvZ19kZXRhaWxzKSArIDEyKTsKKwkJc3ByaW50Zihtc2csICJmZXRjaCBmcm9tICVzIiwgd3JpdGVfcmVmX2xvZ19kZXRhaWxzKTsKKwl9IGVsc2UgeworCQltc2cgPSBOVUxMOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0czsgaSsrKSB7CisJCWlmICghd3JpdGVfcmVmIHx8ICF3cml0ZV9yZWZbaV0pCisJCQljb250aW51ZTsKKwkJcmV0ID0gd3JpdGVfcmVmX3NoYTEobG9ja1tpXSwgJnNoYTFbMjAgKiBpXSwgbXNnID8gbXNnIDogImZldGNoICh1bmtub3duKSIpOworCQlsb2NrW2ldID0gTlVMTDsKKwkJaWYgKHJldCkKKwkJCWdvdG8gdW5sb2NrX2FuZF9mYWlsOworCX0KKwlmcmVlKG1zZyk7CisKKwlyZXR1cm4gMDsKKwordW5sb2NrX2FuZF9mYWlsOgorCWZvciAoaSA9IDA7IGkgPCB0YXJnZXRzOyBpKyspCisJCWlmIChsb2NrW2ldKQorCQkJdW5sb2NrX3JlZihsb2NrW2ldKTsKKworCXJldHVybiAtMTsKK30KKwordm9pZCB3YWxrZXJfZnJlZShzdHJ1Y3Qgd2Fsa2VyICp3YWxrZXIpCit7CisJd2Fsa2VyLT5jbGVhbnVwKHdhbGtlcik7CisJZnJlZSh3YWxrZXIpOworfQpkaWZmIC0tZ2l0IGEvd2Fsa2VyLmggYi93YWxrZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWQ0MGRlCi0tLSAvZGV2L251bGwKKysrIGIvd2Fsa2VyLmgKQEAgLTAsMCArMSwzOSBAQAorI2lmbmRlZiBXQUxLRVJfSAorI2RlZmluZSBXQUxLRVJfSAorCisjaW5jbHVkZSAicmVtb3RlLmgiCisKK3N0cnVjdCB3YWxrZXIgeworCXZvaWQgKmRhdGE7CisJaW50ICgqZmV0Y2hfcmVmKShzdHJ1Y3Qgd2Fsa2VyICosIGNoYXIgKnJlZiwgdW5zaWduZWQgY2hhciAqc2hhMSk7CisJdm9pZCAoKnByZWZldGNoKShzdHJ1Y3Qgd2Fsa2VyICosIHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCWludCAoKmZldGNoKShzdHJ1Y3Qgd2Fsa2VyICosIHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCXZvaWQgKCpjbGVhbnVwKShzdHJ1Y3Qgd2Fsa2VyICopOworCWludCBnZXRfdHJlZTsKKwlpbnQgZ2V0X2hpc3Rvcnk7CisJaW50IGdldF9hbGw7CisJaW50IGdldF92ZXJib3NlbHk7CisJaW50IGdldF9yZWNvdmVyOworCisJaW50IGNvcnJ1cHRfb2JqZWN0X2ZvdW5kOworfTsKKworLyogUmVwb3J0IHdoYXQgd2UgZ290IHVuZGVyIGdldF92ZXJib3NlbHkgKi8KK3ZvaWQgd2Fsa2VyX3NheShzdHJ1Y3Qgd2Fsa2VyICp3YWxrZXIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKworLyogTG9hZCBwdWxsIHRhcmdldHMgZnJvbSBzdGRpbiAqLworaW50IHdhbGtlcl90YXJnZXRzX3N0ZGluKGNoYXIgKioqdGFyZ2V0LCBjb25zdCBjaGFyICoqKndyaXRlX3JlZik7CisKKy8qIEZyZWUgdXAgbG9hZGVkIHRhcmdldHMgKi8KK3ZvaWQgd2Fsa2VyX3RhcmdldHNfZnJlZShpbnQgdGFyZ2V0cywgY2hhciAqKnRhcmdldCwgY29uc3QgY2hhciAqKndyaXRlX3JlZik7CisKKy8qIElmIHdyaXRlX3JlZiBpcyBzZXQsIHRoZSByZWYgZmlsZW5hbWUgdG8gd3JpdGUgdGhlIHRhcmdldCB2YWx1ZSB0by4gKi8KKy8qIElmIHdyaXRlX3JlZl9sb2dfZGV0YWlscyBpcyBzZXQsIGFkZGl0aW9uYWwgdGV4dCB3aWxsIGFwcGVhciBpbiB0aGUgcmVmIGxvZy4gKi8KK2ludCB3YWxrZXJfZmV0Y2goc3RydWN0IHdhbGtlciAqaW1wbCwgaW50IHRhcmdldHMsIGNoYXIgKip0YXJnZXQsCisJCSBjb25zdCBjaGFyICoqd3JpdGVfcmVmLCBjb25zdCBjaGFyICp3cml0ZV9yZWZfbG9nX2RldGFpbHMpOworCit2b2lkIHdhbGtlcl9mcmVlKHN0cnVjdCB3YWxrZXIgKndhbGtlcik7CisKK3N0cnVjdCB3YWxrZXIgKmdldF9odHRwX3dhbGtlcihjb25zdCBjaGFyICp1cmwsIHN0cnVjdCByZW1vdGUgKnJlbW90ZSk7CisKKyNlbmRpZiAvKiBXQUxLRVJfSCAqLwpkaWZmIC0tZ2l0IGEvd3JpdGVfb3JfZGllLmMgYi93cml0ZV9vcl9kaWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTI1ZTExCi0tLSAvZGV2L251bGwKKysrIGIvd3JpdGVfb3JfZGllLmMKQEAgLTAsMCArMSwxMTIgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorCisvKgorICogU29tZSBjYXNlcyB1c2Ugc3RkaW8sIGJ1dCB3YW50IHRvIGZsdXNoIGFmdGVyIHRoZSB3cml0ZQorICogdG8gZ2V0IGVycm9yIGhhbmRsaW5nIChhbmQgdG8gZ2V0IGJldHRlciBpbnRlcmFjdGl2ZQorICogYmVoYXZpb3VyIC0gbm90IGJ1ZmZlcmluZyBleGNlc3NpdmVseSkuCisgKgorICogT2YgY291cnNlLCBpZiB0aGUgZmx1c2ggaGFwcGVuZWQgd2l0aGluIHRoZSB3cml0ZSBpdHNlbGYsCisgKiB3ZSd2ZSBhbHJlYWR5IGxvc3QgdGhlIGVycm9yIGNvZGUsIGFuZCBjYW5ub3QgcmVwb3J0IGl0IGFueQorICogbW9yZS4gU28gd2UganVzdCBpZ25vcmUgdGhhdCBjYXNlIGluc3RlYWQgKGFuZCBob3BlIHdlIGdldAorICogdGhlIHJpZ2h0IGVycm9yIGNvZGUgb24gdGhlIGZsdXNoKS4KKyAqCisgKiBJZiB0aGUgZmlsZSBoYW5kbGUgaXMgc3Rkb3V0LCBhbmQgc3Rkb3V0IGlzIGEgZmlsZSwgdGhlbiBza2lwIHRoZQorICogZmx1c2ggZW50aXJlbHkgc2luY2UgaXQncyBub3QgbmVlZGVkLgorICovCit2b2lkIG1heWJlX2ZsdXNoX29yX2RpZShGSUxFICpmLCBjb25zdCBjaGFyICpkZXNjKQoreworCXN0YXRpYyBpbnQgc2tpcF9zdGRvdXRfZmx1c2ggPSAtMTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwljaGFyICpjcDsKKworCWlmIChmID09IHN0ZG91dCkgeworCQlpZiAoc2tpcF9zdGRvdXRfZmx1c2ggPCAwKSB7CisJCQljcCA9IGdldGVudigiR0lUX0ZMVVNIIik7CisJCQlpZiAoY3ApCisJCQkJc2tpcF9zdGRvdXRfZmx1c2ggPSAoYXRvaShjcCkgPT0gMCk7CisJCQllbHNlIGlmICgoZnN0YXQoZmlsZW5vKHN0ZG91dCksICZzdCkgPT0gMCkgJiYKKwkJCQkgU19JU1JFRyhzdC5zdF9tb2RlKSkKKwkJCQlza2lwX3N0ZG91dF9mbHVzaCA9IDE7CisJCQllbHNlCisJCQkJc2tpcF9zdGRvdXRfZmx1c2ggPSAwOworCQl9CisJCWlmIChza2lwX3N0ZG91dF9mbHVzaCAmJiAhZmVycm9yKGYpKQorCQkJcmV0dXJuOworCX0KKwlpZiAoZmZsdXNoKGYpKSB7CisJCWlmIChlcnJubyA9PSBFUElQRSkKKwkJCWV4aXQoMCk7CisJCWRpZSgid3JpdGUgZmFpbHVyZSBvbiAlczogJXMiLCBkZXNjLCBzdHJlcnJvcihlcnJubykpOworCX0KK30KKworaW50IHJlYWRfaW5fZnVsbChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWNoYXIgKnAgPSBidWY7CisJc3NpemVfdCB0b3RhbCA9IDA7CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNzaXplX3QgbG9hZGVkID0geHJlYWQoZmQsIHAsIGNvdW50KTsKKwkJaWYgKGxvYWRlZCA8PSAwKQorCQkJcmV0dXJuIHRvdGFsID8gdG90YWwgOiBsb2FkZWQ7CisJCWNvdW50IC09IGxvYWRlZDsKKwkJcCArPSBsb2FkZWQ7CisJCXRvdGFsICs9IGxvYWRlZDsKKwl9CisKKwlyZXR1cm4gdG90YWw7Cit9CisKK2ludCB3cml0ZV9pbl9mdWxsKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisJY29uc3QgY2hhciAqcCA9IGJ1ZjsKKwlzc2l6ZV90IHRvdGFsID0gMDsKKworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc3NpemVfdCB3cml0dGVuID0geHdyaXRlKGZkLCBwLCBjb3VudCk7CisJCWlmICh3cml0dGVuIDwgMCkKKwkJCXJldHVybiAtMTsKKwkJaWYgKCF3cml0dGVuKSB7CisJCQllcnJubyA9IEVOT1NQQzsKKwkJCXJldHVybiAtMTsKKwkJfQorCQljb3VudCAtPSB3cml0dGVuOworCQlwICs9IHdyaXR0ZW47CisJCXRvdGFsICs9IHdyaXR0ZW47CisJfQorCisJcmV0dXJuIHRvdGFsOworfQorCit2b2lkIHdyaXRlX29yX2RpZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWlmICh3cml0ZV9pbl9mdWxsKGZkLCBidWYsIGNvdW50KSA8IDApIHsKKwkJaWYgKGVycm5vID09IEVQSVBFKQorCQkJZXhpdCgwKTsKKwkJZGllKCJ3cml0ZSBlcnJvciAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKKwl9Cit9CisKK2ludCB3cml0ZV9vcl93aGluZV9waXBlKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIGNvbnN0IGNoYXIgKm1zZykKK3sKKwlpZiAod3JpdGVfaW5fZnVsbChmZCwgYnVmLCBjb3VudCkgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFUElQRSkKKwkJCWV4aXQoMCk7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IHdyaXRlIGVycm9yICglcylcbiIsCisJCQltc2csIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgd3JpdGVfb3Jfd2hpbmUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgY29uc3QgY2hhciAqbXNnKQoreworCWlmICh3cml0ZV9pbl9mdWxsKGZkLCBidWYsIGNvdW50KSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogd3JpdGUgZXJyb3IgKCVzKVxuIiwKKwkJCW1zZywgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS93cy5jIGIvd3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTdlODM0Ci0tLSAvZGV2L251bGwKKysrIGIvd3MuYwpAQCAtMCwwICsxLDMxOCBAQAorLyoKKyAqIFdoaXRlc3BhY2UgcnVsZXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSnVuaW8gQyBIYW1hbm8KKyAqLworCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJhdHRyLmgiCisKK3N0YXRpYyBzdHJ1Y3Qgd2hpdGVzcGFjZV9ydWxlIHsKKwljb25zdCBjaGFyICpydWxlX25hbWU7CisJdW5zaWduZWQgcnVsZV9iaXRzOworfSB3aGl0ZXNwYWNlX3J1bGVfbmFtZXNbXSA9IHsKKwl7ICJ0cmFpbGluZy1zcGFjZSIsIFdTX1RSQUlMSU5HX1NQQUNFIH0sCisJeyAic3BhY2UtYmVmb3JlLXRhYiIsIFdTX1NQQUNFX0JFRk9SRV9UQUIgfSwKKwl7ICJpbmRlbnQtd2l0aC1ub24tdGFiIiwgV1NfSU5ERU5UX1dJVEhfTk9OX1RBQiB9LAorCXsgImNyLWF0LWVvbCIsIFdTX0NSX0FUX0VPTCB9LAorfTsKKwordW5zaWduZWQgcGFyc2Vfd2hpdGVzcGFjZV9ydWxlKGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKwl1bnNpZ25lZCBydWxlID0gV1NfREVGQVVMVF9SVUxFOworCisJd2hpbGUgKHN0cmluZykgeworCQlpbnQgaTsKKwkJc2l6ZV90IGxlbjsKKwkJY29uc3QgY2hhciAqZXA7CisJCWludCBuZWdhdGVkID0gMDsKKworCQlzdHJpbmcgPSBzdHJpbmcgKyBzdHJzcG4oc3RyaW5nLCAiLCBcdFxuXHIiKTsKKwkJZXAgPSBzdHJjaHIoc3RyaW5nLCAnLCcpOworCQlpZiAoIWVwKQorCQkJbGVuID0gc3RybGVuKHN0cmluZyk7CisJCWVsc2UKKwkJCWxlbiA9IGVwIC0gc3RyaW5nOworCisJCWlmICgqc3RyaW5nID09ICctJykgeworCQkJbmVnYXRlZCA9IDE7CisJCQlzdHJpbmcrKzsKKwkJCWxlbi0tOworCQl9CisJCWlmICghbGVuKQorCQkJYnJlYWs7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdoaXRlc3BhY2VfcnVsZV9uYW1lcyk7IGkrKykgeworCQkJaWYgKHN0cm5jbXAod2hpdGVzcGFjZV9ydWxlX25hbWVzW2ldLnJ1bGVfbmFtZSwKKwkJCQkgICAgc3RyaW5nLCBsZW4pKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKG5lZ2F0ZWQpCisJCQkJcnVsZSAmPSB+d2hpdGVzcGFjZV9ydWxlX25hbWVzW2ldLnJ1bGVfYml0czsKKwkJCWVsc2UKKwkJCQlydWxlIHw9IHdoaXRlc3BhY2VfcnVsZV9uYW1lc1tpXS5ydWxlX2JpdHM7CisJCQlicmVhazsKKwkJfQorCQlzdHJpbmcgPSBlcDsKKwl9CisJcmV0dXJuIHJ1bGU7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX3doaXRlc3BhY2VfYXR0cl9jaGVjayhzdHJ1Y3QgZ2l0X2F0dHJfY2hlY2sgKmNoZWNrKQoreworCXN0YXRpYyBzdHJ1Y3QgZ2l0X2F0dHIgKmF0dHJfd2hpdGVzcGFjZTsKKworCWlmICghYXR0cl93aGl0ZXNwYWNlKQorCQlhdHRyX3doaXRlc3BhY2UgPSBnaXRfYXR0cigid2hpdGVzcGFjZSIsIDEwKTsKKwljaGVja1swXS5hdHRyID0gYXR0cl93aGl0ZXNwYWNlOworfQorCit1bnNpZ25lZCB3aGl0ZXNwYWNlX3J1bGUoY29uc3QgY2hhciAqcGF0aG5hbWUpCit7CisJc3RydWN0IGdpdF9hdHRyX2NoZWNrIGF0dHJfd2hpdGVzcGFjZV9ydWxlOworCisJc2V0dXBfd2hpdGVzcGFjZV9hdHRyX2NoZWNrKCZhdHRyX3doaXRlc3BhY2VfcnVsZSk7CisJaWYgKCFnaXRfY2hlY2thdHRyKHBhdGhuYW1lLCAxLCAmYXR0cl93aGl0ZXNwYWNlX3J1bGUpKSB7CisJCWNvbnN0IGNoYXIgKnZhbHVlOworCisJCXZhbHVlID0gYXR0cl93aGl0ZXNwYWNlX3J1bGUudmFsdWU7CisJCWlmIChBVFRSX1RSVUUodmFsdWUpKSB7CisJCQkvKiB0cnVlICh3aGl0ZXNwYWNlKSAqLworCQkJdW5zaWduZWQgYWxsX3J1bGUgPSAwOworCQkJaW50IGk7CisJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3aGl0ZXNwYWNlX3J1bGVfbmFtZXMpOyBpKyspCisJCQkJYWxsX3J1bGUgfD0gd2hpdGVzcGFjZV9ydWxlX25hbWVzW2ldLnJ1bGVfYml0czsKKwkJCXJldHVybiBhbGxfcnVsZTsKKwkJfSBlbHNlIGlmIChBVFRSX0ZBTFNFKHZhbHVlKSkgeworCQkJLyogZmFsc2UgKC13aGl0ZXNwYWNlKSAqLworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoQVRUUl9VTlNFVCh2YWx1ZSkpIHsKKwkJCS8qIHJlc2V0IHRvIGRlZmF1bHQgKCF3aGl0ZXNwYWNlKSAqLworCQkJcmV0dXJuIHdoaXRlc3BhY2VfcnVsZV9jZmc7CisJCX0gZWxzZSB7CisJCQkvKiBzdHJpbmcgKi8KKwkJCXJldHVybiBwYXJzZV93aGl0ZXNwYWNlX3J1bGUodmFsdWUpOworCQl9CisJfSBlbHNlIHsKKwkJcmV0dXJuIHdoaXRlc3BhY2VfcnVsZV9jZmc7CisJfQorfQorCisvKiBUaGUgcmV0dXJuZWQgc3RyaW5nIHNob3VsZCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLiAqLworY2hhciAqd2hpdGVzcGFjZV9lcnJvcl9zdHJpbmcodW5zaWduZWQgd3MpCit7CisJc3RydWN0IHN0cmJ1ZiBlcnI7CisJc3RyYnVmX2luaXQoJmVyciwgMCk7CisJaWYgKHdzICYgV1NfVFJBSUxJTkdfU1BBQ0UpCisJCXN0cmJ1Zl9hZGRzdHIoJmVyciwgInRyYWlsaW5nIHdoaXRlc3BhY2UiKTsKKwlpZiAod3MgJiBXU19TUEFDRV9CRUZPUkVfVEFCKSB7CisJCWlmIChlcnIubGVuKQorCQkJc3RyYnVmX2FkZHN0cigmZXJyLCAiLCAiKTsKKwkJc3RyYnVmX2FkZHN0cigmZXJyLCAic3BhY2UgYmVmb3JlIHRhYiBpbiBpbmRlbnQiKTsKKwl9CisJaWYgKHdzICYgV1NfSU5ERU5UX1dJVEhfTk9OX1RBQikgeworCQlpZiAoZXJyLmxlbikKKwkJCXN0cmJ1Zl9hZGRzdHIoJmVyciwgIiwgIik7CisJCXN0cmJ1Zl9hZGRzdHIoJmVyciwgImluZGVudCB3aXRoIHNwYWNlcyIpOworCX0KKwlyZXR1cm4gc3RyYnVmX2RldGFjaCgmZXJyLCBOVUxMKTsKK30KKworLyogSWYgc3RyZWFtIGlzIG5vbi1OVUxMLCBlbWl0cyB0aGUgbGluZSBhZnRlciBjaGVja2luZy4gKi8KK3Vuc2lnbmVkIGNoZWNrX2FuZF9lbWl0X2xpbmUoY29uc3QgY2hhciAqbGluZSwgaW50IGxlbiwgdW5zaWduZWQgd3NfcnVsZSwKKwkJCSAgICAgRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpzZXQsCisJCQkgICAgIGNvbnN0IGNoYXIgKnJlc2V0LCBjb25zdCBjaGFyICp3cykKK3sKKwl1bnNpZ25lZCByZXN1bHQgPSAwOworCWludCB3cml0dGVuID0gMDsKKwlpbnQgdHJhaWxpbmdfd2hpdGVzcGFjZSA9IC0xOworCWludCB0cmFpbGluZ19uZXdsaW5lID0gMDsKKwlpbnQgdHJhaWxpbmdfY2FycmlhZ2VfcmV0dXJuID0gMDsKKwlpbnQgaTsKKworCS8qIExvZ2ljIGlzIHNpbXBsZXIgaWYgd2UgdGVtcG9yYXJpbHkgaWdub3JlIHRoZSB0cmFpbGluZyBuZXdsaW5lLiAqLworCWlmIChsZW4gPiAwICYmIGxpbmVbbGVuIC0gMV0gPT0gJ1xuJykgeworCQl0cmFpbGluZ19uZXdsaW5lID0gMTsKKwkJbGVuLS07CisJfQorCWlmICgod3NfcnVsZSAmIFdTX0NSX0FUX0VPTCkgJiYKKwkgICAgbGVuID4gMCAmJiBsaW5lW2xlbiAtIDFdID09ICdccicpIHsKKwkJdHJhaWxpbmdfY2FycmlhZ2VfcmV0dXJuID0gMTsKKwkJbGVuLS07CisJfQorCisJLyogQ2hlY2sgZm9yIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovCisJaWYgKHdzX3J1bGUgJiBXU19UUkFJTElOR19TUEFDRSkgeworCQlmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkgeworCQkJaWYgKGlzc3BhY2UobGluZVtpXSkpIHsKKwkJCQl0cmFpbGluZ193aGl0ZXNwYWNlID0gaTsKKwkJCQlyZXN1bHQgfD0gV1NfVFJBSUxJTkdfU1BBQ0U7CisJCQl9CisJCQllbHNlCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBDaGVjayBmb3Igc3BhY2UgYmVmb3JlIHRhYiBpbiBpbml0aWFsIGluZGVudC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKGxpbmVbaV0gPT0gJyAnKQorCQkJY29udGludWU7CisJCWlmIChsaW5lW2ldICE9ICdcdCcpCisJCQlicmVhazsKKwkJaWYgKCh3c19ydWxlICYgV1NfU1BBQ0VfQkVGT1JFX1RBQikgJiYgd3JpdHRlbiA8IGkpIHsKKwkJCXJlc3VsdCB8PSBXU19TUEFDRV9CRUZPUkVfVEFCOworCQkJaWYgKHN0cmVhbSkgeworCQkJCWZwdXRzKHdzLCBzdHJlYW0pOworCQkJCWZ3cml0ZShsaW5lICsgd3JpdHRlbiwgaSAtIHdyaXR0ZW4sIDEsIHN0cmVhbSk7CisJCQkJZnB1dHMocmVzZXQsIHN0cmVhbSk7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyZWFtKQorCQkJZndyaXRlKGxpbmUgKyB3cml0dGVuLCBpIC0gd3JpdHRlbiwgMSwgc3RyZWFtKTsKKwkJaWYgKHN0cmVhbSkKKwkJCWZ3cml0ZShsaW5lICsgaSwgMSwgMSwgc3RyZWFtKTsKKwkJd3JpdHRlbiA9IGkgKyAxOworCX0KKworCS8qIENoZWNrIGZvciBpbmRlbnQgdXNpbmcgbm9uLXRhYi4gKi8KKwlpZiAoKHdzX3J1bGUgJiBXU19JTkRFTlRfV0lUSF9OT05fVEFCKSAmJiBpIC0gd3JpdHRlbiA+PSA4KSB7CisJCXJlc3VsdCB8PSBXU19JTkRFTlRfV0lUSF9OT05fVEFCOworCQlpZiAoc3RyZWFtKSB7CisJCQlmcHV0cyh3cywgc3RyZWFtKTsKKwkJCWZ3cml0ZShsaW5lICsgd3JpdHRlbiwgaSAtIHdyaXR0ZW4sIDEsIHN0cmVhbSk7CisJCQlmcHV0cyhyZXNldCwgc3RyZWFtKTsKKwkJfQorCQl3cml0dGVuID0gaTsKKwl9CisKKwlpZiAoc3RyZWFtKSB7CisJCS8qCisJCSAqIE5vdyB0aGUgcmVzdCBvZiB0aGUgbGluZSBzdGFydHMgYXQgIndyaXR0ZW4iLgorCQkgKiBUaGUgbm9uLWhpZ2hsaWdodGVkIHBhcnQgZW5kcyBhdCAidHJhaWxpbmdfd2hpdGVzcGFjZSIuCisJCSAqLworCQlpZiAodHJhaWxpbmdfd2hpdGVzcGFjZSA9PSAtMSkKKwkJCXRyYWlsaW5nX3doaXRlc3BhY2UgPSBsZW47CisKKwkJLyogRW1pdCBub24taGlnaGxpZ2h0ZWQgKG1pZGRsZSkgc2VnbWVudC4gKi8KKwkJaWYgKHRyYWlsaW5nX3doaXRlc3BhY2UgLSB3cml0dGVuID4gMCkgeworCQkJZnB1dHMoc2V0LCBzdHJlYW0pOworCQkJZndyaXRlKGxpbmUgKyB3cml0dGVuLAorCQkJICAgIHRyYWlsaW5nX3doaXRlc3BhY2UgLSB3cml0dGVuLCAxLCBzdHJlYW0pOworCQkJZnB1dHMocmVzZXQsIHN0cmVhbSk7CisJCX0KKworCQkvKiBIaWdobGlnaHQgZXJyb3JzIGluIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovCisJCWlmICh0cmFpbGluZ193aGl0ZXNwYWNlICE9IGxlbikgeworCQkJZnB1dHMod3MsIHN0cmVhbSk7CisJCQlmd3JpdGUobGluZSArIHRyYWlsaW5nX3doaXRlc3BhY2UsCisJCQkgICAgbGVuIC0gdHJhaWxpbmdfd2hpdGVzcGFjZSwgMSwgc3RyZWFtKTsKKwkJCWZwdXRzKHJlc2V0LCBzdHJlYW0pOworCQl9CisJCWlmICh0cmFpbGluZ19jYXJyaWFnZV9yZXR1cm4pCisJCQlmcHV0YygnXHInLCBzdHJlYW0pOworCQlpZiAodHJhaWxpbmdfbmV3bGluZSkKKwkJCWZwdXRjKCdcbicsIHN0cmVhbSk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIENvcHkgdGhlIGxpbmUgdG8gdGhlIGJ1ZmZlciB3aGlsZSBmaXhpbmcgd2hpdGVzcGFjZXMgKi8KK2ludCB3c19maXhfY29weShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgaW50IGxlbiwgdW5zaWduZWQgd3NfcnVsZSwgaW50ICplcnJvcl9jb3VudCkKK3sKKwkvKgorCSAqIGxlbiBpcyBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgY29waWVkIGZyb20gc3JjLCBzdGFydGluZworCSAqIGF0IHNyYy4gIFR5cGljYWxseSBzcmNbbGVuLTFdIGlzICdcbicsIHVubGVzcyB0aGlzIGlzCisJICogdGhlIGluY29tcGxldGUgbGFzdCBsaW5lLgorCSAqLworCWludCBpOworCWludCBhZGRfbmxfdG9fdGFpbCA9IDA7CisJaW50IGFkZF9jcl90b190YWlsID0gMDsKKwlpbnQgZml4ZWQgPSAwOworCWludCBsYXN0X3RhYl9pbl9pbmRlbnQgPSAtMTsKKwlpbnQgbGFzdF9zcGFjZV9pbl9pbmRlbnQgPSAtMTsKKwlpbnQgbmVlZF9maXhfbGVhZGluZ19zcGFjZSA9IDA7CisJY2hhciAqYnVmOworCisJLyoKKwkgKiBTdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlCisJICovCisJaWYgKCh3c19ydWxlICYgV1NfVFJBSUxJTkdfU1BBQ0UpICYmCisJICAgICgyIDw9IGxlbiAmJiBpc3NwYWNlKHNyY1tsZW4tMl0pKSkgeworCQlpZiAoc3JjW2xlbiAtIDFdID09ICdcbicpIHsKKwkJCWFkZF9ubF90b190YWlsID0gMTsKKwkJCWxlbi0tOworCQkJaWYgKDEgPCBsZW4gJiYgc3JjW2xlbiAtIDFdID09ICdccicpIHsKKwkJCQlhZGRfY3JfdG9fdGFpbCA9ICEhKHdzX3J1bGUgJiBXU19DUl9BVF9FT0wpOworCQkJCWxlbi0tOworCQkJfQorCQl9CisJCWlmICgwIDwgbGVuICYmIGlzc3BhY2Uoc3JjW2xlbiAtIDFdKSkgeworCQkJd2hpbGUgKDAgPCBsZW4gJiYgaXNzcGFjZShzcmNbbGVuLTFdKSkKKwkJCQlsZW4tLTsKKwkJCWZpeGVkID0gMTsKKwkJfQorCX0KKworCS8qCisJICogQ2hlY2sgbGVhZGluZyB3aGl0ZXNwYWNlcyAoaW5kZW50KQorCSAqLworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQljaGFyIGNoID0gc3JjW2ldOworCQlpZiAoY2ggPT0gJ1x0JykgeworCQkJbGFzdF90YWJfaW5faW5kZW50ID0gaTsKKwkJCWlmICgod3NfcnVsZSAmIFdTX1NQQUNFX0JFRk9SRV9UQUIpICYmCisJCQkgICAgMCA8PSBsYXN0X3NwYWNlX2luX2luZGVudCkKKwkJCSAgICBuZWVkX2ZpeF9sZWFkaW5nX3NwYWNlID0gMTsKKwkJfSBlbHNlIGlmIChjaCA9PSAnICcpIHsKKwkJCWxhc3Rfc3BhY2VfaW5faW5kZW50ID0gaTsKKwkJCWlmICgod3NfcnVsZSAmIFdTX0lOREVOVF9XSVRIX05PTl9UQUIpICYmCisJCQkgICAgOCA8PSBpIC0gbGFzdF90YWJfaW5faW5kZW50KQorCQkJCW5lZWRfZml4X2xlYWRpbmdfc3BhY2UgPSAxOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0KKworCWJ1ZiA9IGRzdDsKKwlpZiAobmVlZF9maXhfbGVhZGluZ19zcGFjZSkgeworCQkvKiBQcm9jZXNzIGluZGVudCBvdXJzZWx2ZXMgKi8KKwkJaW50IGNvbnNlY3V0aXZlX3NwYWNlcyA9IDA7CisJCWludCBsYXN0ID0gbGFzdF90YWJfaW5faW5kZW50ICsgMTsKKworCQlpZiAod3NfcnVsZSAmIFdTX0lOREVOVF9XSVRIX05PTl9UQUIpIHsKKwkJCS8qIGhhdmUgImxhc3QiIHBvaW50IGF0IG9uZSBwYXN0IHRoZSBpbmRlbnQgKi8KKwkJCWlmIChsYXN0X3RhYl9pbl9pbmRlbnQgPCBsYXN0X3NwYWNlX2luX2luZGVudCkKKwkJCQlsYXN0ID0gbGFzdF9zcGFjZV9pbl9pbmRlbnQgKyAxOworCQkJZWxzZQorCQkJCWxhc3QgPSBsYXN0X3RhYl9pbl9pbmRlbnQgKyAxOworCQl9CisKKwkJLyoKKwkJICogYmV0d2VlbiBzcmNbMC4ubGFzdC0xXSwgc3RyaXAgdGhlIGZ1bm55IHNwYWNlcywKKwkJICogdXBkYXRpbmcgdGhlbSB0byB0YWIgYXMgbmVlZGVkLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IGxhc3Q7IGkrKykgeworCQkJY2hhciBjaCA9IHNyY1tpXTsKKwkJCWlmIChjaCAhPSAnICcpIHsKKwkJCQljb25zZWN1dGl2ZV9zcGFjZXMgPSAwOworCQkJCSpkc3QrKyA9IGNoOworCQkJfSBlbHNlIHsKKwkJCQljb25zZWN1dGl2ZV9zcGFjZXMrKzsKKwkJCQlpZiAoY29uc2VjdXRpdmVfc3BhY2VzID09IDgpIHsKKwkJCQkJKmRzdCsrID0gJ1x0JzsKKwkJCQkJY29uc2VjdXRpdmVfc3BhY2VzID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKwkJd2hpbGUgKDAgPCBjb25zZWN1dGl2ZV9zcGFjZXMtLSkKKwkJCSpkc3QrKyA9ICcgJzsKKwkJbGVuIC09IGxhc3Q7CisJCXNyYyArPSBsYXN0OworCQlmaXhlZCA9IDE7CisJfQorCisJbWVtY3B5KGRzdCwgc3JjLCBsZW4pOworCWlmIChhZGRfY3JfdG9fdGFpbCkKKwkJZHN0W2xlbisrXSA9ICdccic7CisJaWYgKGFkZF9ubF90b190YWlsKQorCQlkc3RbbGVuKytdID0gJ1xuJzsKKwlpZiAoZml4ZWQgJiYgZXJyb3JfY291bnQpCisJCSgqZXJyb3JfY291bnQpKys7CisJcmV0dXJuIGRzdCArIGxlbiAtIGJ1ZjsKK30KZGlmZiAtLWdpdCBhL3d0LXN0YXR1cy5jIGIvd3Qtc3RhdHVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNmZDU3YgotLS0gL2Rldi9udWxsCisrKyBiL3d0LXN0YXR1cy5jCkBAIC0wLDAgKzEsMzQ5IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ3dC1zdGF0dXMuaCIKKyNpbmNsdWRlICJjb2xvci5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgImRpci5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorI2luY2x1ZGUgImRpZmZjb3JlLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKworaW50IHd0X3N0YXR1c19yZWxhdGl2ZV9wYXRocyA9IDE7CitpbnQgd3Rfc3RhdHVzX3VzZV9jb2xvciA9IC0xOworc3RhdGljIGNoYXIgd3Rfc3RhdHVzX2NvbG9yc1tdW0NPTE9SX01BWExFTl0gPSB7CisJIiIsICAgICAgICAgLyogV1RfU1RBVFVTX0hFQURFUjogbm9ybWFsICovCisJIlwwMzNbMzJtIiwgLyogV1RfU1RBVFVTX1VQREFURUQ6IGdyZWVuICovCisJIlwwMzNbMzFtIiwgLyogV1RfU1RBVFVTX0NIQU5HRUQ6IHJlZCAqLworCSJcMDMzWzMxbSIsIC8qIFdUX1NUQVRVU19VTlRSQUNLRUQ6IHJlZCAqLworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgdXNlX2FkZF9tc2dbXSA9CisidXNlIFwiZ2l0IGFkZCA8ZmlsZT4uLi5cIiB0byB1cGRhdGUgd2hhdCB3aWxsIGJlIGNvbW1pdHRlZCI7CitzdGF0aWMgY29uc3QgY2hhciB1c2VfYWRkX3JtX21zZ1tdID0KKyJ1c2UgXCJnaXQgYWRkL3JtIDxmaWxlPi4uLlwiIHRvIHVwZGF0ZSB3aGF0IHdpbGwgYmUgY29tbWl0dGVkIjsKK3N0YXRpYyBjb25zdCBjaGFyIHVzZV9hZGRfdG9faW5jbHVkZV9tc2dbXSA9CisidXNlIFwiZ2l0IGFkZCA8ZmlsZT4uLi5cIiB0byBpbmNsdWRlIGluIHdoYXQgd2lsbCBiZSBjb21taXR0ZWQiOworCitzdGF0aWMgaW50IHBhcnNlX3N0YXR1c19zbG90KGNvbnN0IGNoYXIgKnZhciwgaW50IG9mZnNldCkKK3sKKwlpZiAoIXN0cmNhc2VjbXAodmFyK29mZnNldCwgImhlYWRlciIpKQorCQlyZXR1cm4gV1RfU1RBVFVTX0hFQURFUjsKKwlpZiAoIXN0cmNhc2VjbXAodmFyK29mZnNldCwgInVwZGF0ZWQiKQorCQl8fCAhc3RyY2FzZWNtcCh2YXIrb2Zmc2V0LCAiYWRkZWQiKSkKKwkJcmV0dXJuIFdUX1NUQVRVU19VUERBVEVEOworCWlmICghc3RyY2FzZWNtcCh2YXIrb2Zmc2V0LCAiY2hhbmdlZCIpKQorCQlyZXR1cm4gV1RfU1RBVFVTX0NIQU5HRUQ7CisJaWYgKCFzdHJjYXNlY21wKHZhcitvZmZzZXQsICJ1bnRyYWNrZWQiKSkKKwkJcmV0dXJuIFdUX1NUQVRVU19VTlRSQUNLRUQ7CisJZGllKCJiYWQgY29uZmlnIHZhcmlhYmxlICclcyciLCB2YXIpOworfQorCitzdGF0aWMgY29uc3QgY2hhciogY29sb3IoaW50IHNsb3QpCit7CisJcmV0dXJuIHd0X3N0YXR1c191c2VfY29sb3IgPiAwID8gd3Rfc3RhdHVzX2NvbG9yc1tzbG90XSA6ICIiOworfQorCit2b2lkIHd0X3N0YXR1c19wcmVwYXJlKHN0cnVjdCB3dF9zdGF0dXMgKnMpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljb25zdCBjaGFyICpoZWFkOworCisJbWVtc2V0KHMsIDAsIHNpemVvZigqcykpOworCWhlYWQgPSByZXNvbHZlX3JlZigiSEVBRCIsIHNoYTEsIDAsIE5VTEwpOworCXMtPmJyYW5jaCA9IGhlYWQgPyB4c3RyZHVwKGhlYWQpIDogTlVMTDsKKwlzLT5yZWZlcmVuY2UgPSAiSEVBRCI7CisJcy0+ZnAgPSBzdGRvdXQ7CisJcy0+aW5kZXhfZmlsZSA9IGdldF9pbmRleF9maWxlKCk7Cit9CisKK3N0YXRpYyB2b2lkIHd0X3N0YXR1c19wcmludF9jYWNoZWRfaGVhZGVyKHN0cnVjdCB3dF9zdGF0dXMgKnMpCit7CisJY29uc3QgY2hhciAqYyA9IGNvbG9yKFdUX1NUQVRVU19IRUFERVIpOworCWNvbG9yX2ZwcmludGZfbG4ocy0+ZnAsIGMsICIjIENoYW5nZXMgdG8gYmUgY29tbWl0dGVkOiIpOworCWlmICghcy0+aXNfaW5pdGlhbCkgeworCQljb2xvcl9mcHJpbnRmX2xuKHMtPmZwLCBjLCAiIyAgICh1c2UgXCJnaXQgcmVzZXQgJXMgPGZpbGU+Li4uXCIgdG8gdW5zdGFnZSkiLCBzLT5yZWZlcmVuY2UpOworCX0gZWxzZSB7CisJCWNvbG9yX2ZwcmludGZfbG4ocy0+ZnAsIGMsICIjICAgKHVzZSBcImdpdCBybSAtLWNhY2hlZCA8ZmlsZT4uLi5cIiB0byB1bnN0YWdlKSIpOworCX0KKwljb2xvcl9mcHJpbnRmX2xuKHMtPmZwLCBjLCAiIyIpOworfQorCitzdGF0aWMgdm9pZCB3dF9zdGF0dXNfcHJpbnRfaGVhZGVyKHN0cnVjdCB3dF9zdGF0dXMgKnMsCisJCQkJICAgY29uc3QgY2hhciAqbWFpbiwgY29uc3QgY2hhciAqc3ViKQoreworCWNvbnN0IGNoYXIgKmMgPSBjb2xvcihXVF9TVEFUVVNfSEVBREVSKTsKKwljb2xvcl9mcHJpbnRmX2xuKHMtPmZwLCBjLCAiIyAlczoiLCBtYWluKTsKKwljb2xvcl9mcHJpbnRmX2xuKHMtPmZwLCBjLCAiIyAgICglcykiLCBzdWIpOworCWNvbG9yX2ZwcmludGZfbG4ocy0+ZnAsIGMsICIjIik7Cit9CisKK3N0YXRpYyB2b2lkIHd0X3N0YXR1c19wcmludF90cmFpbGVyKHN0cnVjdCB3dF9zdGF0dXMgKnMpCit7CisJY29sb3JfZnByaW50Zl9sbihzLT5mcCwgY29sb3IoV1RfU1RBVFVTX0hFQURFUiksICIjIik7Cit9CisKKyNkZWZpbmUgcXVvdGVfcGF0aCBxdW90ZV9wYXRoX3JlbGF0aXZlCisKK3N0YXRpYyB2b2lkIHd0X3N0YXR1c19wcmludF9maWxlcGFpcihzdHJ1Y3Qgd3Rfc3RhdHVzICpzLAorCQkJCSAgICAgaW50IHQsIHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwKQoreworCWNvbnN0IGNoYXIgKmMgPSBjb2xvcih0KTsKKwljb25zdCBjaGFyICpvbmUsICp0d287CisJc3RydWN0IHN0cmJ1ZiBvbmVidWYsIHR3b2J1ZjsKKworCXN0cmJ1Zl9pbml0KCZvbmVidWYsIDApOworCXN0cmJ1Zl9pbml0KCZ0d29idWYsIDApOworCW9uZSA9IHF1b3RlX3BhdGgocC0+b25lLT5wYXRoLCAtMSwgJm9uZWJ1Ziwgcy0+cHJlZml4KTsKKwl0d28gPSBxdW90ZV9wYXRoKHAtPnR3by0+cGF0aCwgLTEsICZ0d29idWYsIHMtPnByZWZpeCk7CisKKwljb2xvcl9mcHJpbnRmKHMtPmZwLCBjb2xvcihXVF9TVEFUVVNfSEVBREVSKSwgIiNcdCIpOworCXN3aXRjaCAocC0+c3RhdHVzKSB7CisJY2FzZSBESUZGX1NUQVRVU19BRERFRDoKKwkJY29sb3JfZnByaW50ZihzLT5mcCwgYywgIm5ldyBmaWxlOiAgICVzIiwgb25lKTsKKwkJYnJlYWs7CisJY2FzZSBESUZGX1NUQVRVU19DT1BJRUQ6CisJCWNvbG9yX2ZwcmludGYocy0+ZnAsIGMsICJjb3BpZWQ6ICAgICAlcyAtPiAlcyIsIG9uZSwgdHdvKTsKKwkJYnJlYWs7CisJY2FzZSBESUZGX1NUQVRVU19ERUxFVEVEOgorCQljb2xvcl9mcHJpbnRmKHMtPmZwLCBjLCAiZGVsZXRlZDogICAgJXMiLCBvbmUpOworCQlicmVhazsKKwljYXNlIERJRkZfU1RBVFVTX01PRElGSUVEOgorCQljb2xvcl9mcHJpbnRmKHMtPmZwLCBjLCAibW9kaWZpZWQ6ICAgJXMiLCBvbmUpOworCQlicmVhazsKKwljYXNlIERJRkZfU1RBVFVTX1JFTkFNRUQ6CisJCWNvbG9yX2ZwcmludGYocy0+ZnAsIGMsICJyZW5hbWVkOiAgICAlcyAtPiAlcyIsIG9uZSwgdHdvKTsKKwkJYnJlYWs7CisJY2FzZSBESUZGX1NUQVRVU19UWVBFX0NIQU5HRUQ6CisJCWNvbG9yX2ZwcmludGYocy0+ZnAsIGMsICJ0eXBlY2hhbmdlOiAlcyIsIG9uZSk7CisJCWJyZWFrOworCWNhc2UgRElGRl9TVEFUVVNfVU5LTk9XTjoKKwkJY29sb3JfZnByaW50ZihzLT5mcCwgYywgInVua25vd246ICAgICVzIiwgb25lKTsKKwkJYnJlYWs7CisJY2FzZSBESUZGX1NUQVRVU19VTk1FUkdFRDoKKwkJY29sb3JfZnByaW50ZihzLT5mcCwgYywgInVubWVyZ2VkOiAgICVzIiwgb25lKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGllKCJidWc6IHVuaGFuZGxlZCBkaWZmIHN0YXR1cyAlYyIsIHAtPnN0YXR1cyk7CisJfQorCWZwcmludGYocy0+ZnAsICJcbiIpOworCXN0cmJ1Zl9yZWxlYXNlKCZvbmVidWYpOworCXN0cmJ1Zl9yZWxlYXNlKCZ0d29idWYpOworfQorCitzdGF0aWMgdm9pZCB3dF9zdGF0dXNfcHJpbnRfdXBkYXRlZF9jYihzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKnEsCisJCXN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMsCisJCXZvaWQgKmRhdGEpCit7CisJc3RydWN0IHd0X3N0YXR1cyAqcyA9IGRhdGE7CisJaW50IHNob3duX2hlYWRlciA9IDA7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJaWYgKHEtPnF1ZXVlW2ldLT5zdGF0dXMgPT0gJ1UnKQorCQkJY29udGludWU7CisJCWlmICghc2hvd25faGVhZGVyKSB7CisJCQl3dF9zdGF0dXNfcHJpbnRfY2FjaGVkX2hlYWRlcihzKTsKKwkJCXMtPmNvbW1pdGFibGUgPSAxOworCQkJc2hvd25faGVhZGVyID0gMTsKKwkJfQorCQl3dF9zdGF0dXNfcHJpbnRfZmlsZXBhaXIocywgV1RfU1RBVFVTX1VQREFURUQsIHEtPnF1ZXVlW2ldKTsKKwl9CisJaWYgKHNob3duX2hlYWRlcikKKwkJd3Rfc3RhdHVzX3ByaW50X3RyYWlsZXIocyk7Cit9CisKK3N0YXRpYyB2b2lkIHd0X3N0YXR1c19wcmludF9jaGFuZ2VkX2NiKHN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKQoreworCXN0cnVjdCB3dF9zdGF0dXMgKnMgPSBkYXRhOworCWludCBpOworCWlmIChxLT5ucikgeworCQljb25zdCBjaGFyICptc2cgPSB1c2VfYWRkX21zZzsKKwkJcy0+d29ya2Rpcl9kaXJ0eSA9IDE7CisJCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKQorCQkJaWYgKHEtPnF1ZXVlW2ldLT5zdGF0dXMgPT0gRElGRl9TVEFUVVNfREVMRVRFRCkgeworCQkJCW1zZyA9IHVzZV9hZGRfcm1fbXNnOworCQkJCWJyZWFrOworCQkJfQorCQl3dF9zdGF0dXNfcHJpbnRfaGVhZGVyKHMsICJDaGFuZ2VkIGJ1dCBub3QgdXBkYXRlZCIsIG1zZyk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKQorCQl3dF9zdGF0dXNfcHJpbnRfZmlsZXBhaXIocywgV1RfU1RBVFVTX0NIQU5HRUQsIHEtPnF1ZXVlW2ldKTsKKwlpZiAocS0+bnIpCisJCXd0X3N0YXR1c19wcmludF90cmFpbGVyKHMpOworfQorCitzdGF0aWMgdm9pZCB3dF9zdGF0dXNfcHJpbnRfaW5pdGlhbChzdHJ1Y3Qgd3Rfc3RhdHVzICpzKQoreworCWludCBpOworCXN0cnVjdCBzdHJidWYgYnVmOworCisJc3RyYnVmX2luaXQoJmJ1ZiwgMCk7CisJaWYgKGFjdGl2ZV9ucikgeworCQlzLT5jb21taXRhYmxlID0gMTsKKwkJd3Rfc3RhdHVzX3ByaW50X2NhY2hlZF9oZWFkZXIocyk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBhY3RpdmVfbnI7IGkrKykgeworCQljb2xvcl9mcHJpbnRmKHMtPmZwLCBjb2xvcihXVF9TVEFUVVNfSEVBREVSKSwgIiNcdCIpOworCQljb2xvcl9mcHJpbnRmX2xuKHMtPmZwLCBjb2xvcihXVF9TVEFUVVNfVVBEQVRFRCksICJuZXcgZmlsZTogJXMiLAorCQkJCXF1b3RlX3BhdGgoYWN0aXZlX2NhY2hlW2ldLT5uYW1lLCAtMSwKKwkJCQkJICAgJmJ1Ziwgcy0+cHJlZml4KSk7CisJfQorCWlmIChhY3RpdmVfbnIpCisJCXd0X3N0YXR1c19wcmludF90cmFpbGVyKHMpOworCXN0cmJ1Zl9yZWxlYXNlKCZidWYpOworfQorCitzdGF0aWMgdm9pZCB3dF9zdGF0dXNfcHJpbnRfdXBkYXRlZChzdHJ1Y3Qgd3Rfc3RhdHVzICpzKQoreworCXN0cnVjdCByZXZfaW5mbyByZXY7CisJaW5pdF9yZXZpc2lvbnMoJnJldiwgTlVMTCk7CisJc2V0dXBfcmV2aXNpb25zKDAsIE5VTEwsICZyZXYsIHMtPnJlZmVyZW5jZSk7CisJcmV2LmRpZmZvcHQub3V0cHV0X2Zvcm1hdCB8PSBESUZGX0ZPUk1BVF9DQUxMQkFDSzsKKwlyZXYuZGlmZm9wdC5mb3JtYXRfY2FsbGJhY2sgPSB3dF9zdGF0dXNfcHJpbnRfdXBkYXRlZF9jYjsKKwlyZXYuZGlmZm9wdC5mb3JtYXRfY2FsbGJhY2tfZGF0YSA9IHM7CisJcmV2LmRpZmZvcHQuZGV0ZWN0X3JlbmFtZSA9IDE7CisJcmV2LmRpZmZvcHQucmVuYW1lX2xpbWl0ID0gMTAwOworCXJldi5kaWZmb3B0LmJyZWFrX29wdCA9IDA7CisJcnVuX2RpZmZfaW5kZXgoJnJldiwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHd0X3N0YXR1c19wcmludF9jaGFuZ2VkKHN0cnVjdCB3dF9zdGF0dXMgKnMpCit7CisJc3RydWN0IHJldl9pbmZvIHJldjsKKwlpbml0X3JldmlzaW9ucygmcmV2LCAiIik7CisJc2V0dXBfcmV2aXNpb25zKDAsIE5VTEwsICZyZXYsIE5VTEwpOworCXJldi5kaWZmb3B0Lm91dHB1dF9mb3JtYXQgfD0gRElGRl9GT1JNQVRfQ0FMTEJBQ0s7CisJcmV2LmRpZmZvcHQuZm9ybWF0X2NhbGxiYWNrID0gd3Rfc3RhdHVzX3ByaW50X2NoYW5nZWRfY2I7CisJcmV2LmRpZmZvcHQuZm9ybWF0X2NhbGxiYWNrX2RhdGEgPSBzOworCXJ1bl9kaWZmX2ZpbGVzKCZyZXYsIDApOworfQorCitzdGF0aWMgdm9pZCB3dF9zdGF0dXNfcHJpbnRfdW50cmFja2VkKHN0cnVjdCB3dF9zdGF0dXMgKnMpCit7CisJc3RydWN0IGRpcl9zdHJ1Y3QgZGlyOworCWludCBpOworCWludCBzaG93bl9oZWFkZXIgPSAwOworCXN0cnVjdCBzdHJidWYgYnVmOworCisJc3RyYnVmX2luaXQoJmJ1ZiwgMCk7CisJbWVtc2V0KCZkaXIsIDAsIHNpemVvZihkaXIpKTsKKworCWlmICghcy0+dW50cmFja2VkKSB7CisJCWRpci5zaG93X290aGVyX2RpcmVjdG9yaWVzID0gMTsKKwkJZGlyLmhpZGVfZW1wdHlfZGlyZWN0b3JpZXMgPSAxOworCX0KKwlzZXR1cF9zdGFuZGFyZF9leGNsdWRlcygmZGlyKTsKKworCXJlYWRfZGlyZWN0b3J5KCZkaXIsICIuIiwgIiIsIDAsIE5VTEwpOworCWZvcihpID0gMDsgaSA8IGRpci5ucjsgaSsrKSB7CisJCS8qIGNoZWNrIGZvciBtYXRjaGluZyBlbnRyeSwgd2hpY2ggaXMgdW5tZXJnZWQ7IGxpZnRlZCBmcm9tCisJCSAqIGJ1aWx0aW4tbHMtZmlsZXM6c2hvd19vdGhlcl9maWxlcyAqLworCQlzdHJ1Y3QgZGlyX2VudHJ5ICplbnQgPSBkaXIuZW50cmllc1tpXTsKKwkJaW50IHBvcyA9IGNhY2hlX25hbWVfcG9zKGVudC0+bmFtZSwgZW50LT5sZW4pOworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlOworCQlpZiAoMCA8PSBwb3MpCisJCQlkaWUoImJ1ZyBpbiB3dF9zdGF0dXNfcHJpbnRfdW50cmFja2VkIik7CisJCXBvcyA9IC1wb3MgLSAxOworCQlpZiAocG9zIDwgYWN0aXZlX25yKSB7CisJCQljZSA9IGFjdGl2ZV9jYWNoZVtwb3NdOworCQkJaWYgKGNlX25hbWVsZW4oY2UpID09IGVudC0+bGVuICYmCisJCQkgICAgIW1lbWNtcChjZS0+bmFtZSwgZW50LT5uYW1lLCBlbnQtPmxlbikpCisJCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzaG93bl9oZWFkZXIpIHsKKwkJCXMtPndvcmtkaXJfdW50cmFja2VkID0gMTsKKwkJCXd0X3N0YXR1c19wcmludF9oZWFkZXIocywgIlVudHJhY2tlZCBmaWxlcyIsCisJCQkJCSAgICAgICB1c2VfYWRkX3RvX2luY2x1ZGVfbXNnKTsKKwkJCXNob3duX2hlYWRlciA9IDE7CisJCX0KKwkJY29sb3JfZnByaW50ZihzLT5mcCwgY29sb3IoV1RfU1RBVFVTX0hFQURFUiksICIjXHQiKTsKKwkJY29sb3JfZnByaW50Zl9sbihzLT5mcCwgY29sb3IoV1RfU1RBVFVTX1VOVFJBQ0tFRCksICIlcyIsCisJCQkJcXVvdGVfcGF0aChlbnQtPm5hbWUsIGVudC0+bGVuLAorCQkJCQkmYnVmLCBzLT5wcmVmaXgpKTsKKwl9CisJc3RyYnVmX3JlbGVhc2UoJmJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIHd0X3N0YXR1c19wcmludF92ZXJib3NlKHN0cnVjdCB3dF9zdGF0dXMgKnMpCit7CisJc3RydWN0IHJldl9pbmZvIHJldjsKKworCWluaXRfcmV2aXNpb25zKCZyZXYsIE5VTEwpOworCXNldHVwX3JldmlzaW9ucygwLCBOVUxMLCAmcmV2LCBzLT5yZWZlcmVuY2UpOworCXJldi5kaWZmb3B0Lm91dHB1dF9mb3JtYXQgfD0gRElGRl9GT1JNQVRfUEFUQ0g7CisJcmV2LmRpZmZvcHQuZGV0ZWN0X3JlbmFtZSA9IDE7CisJcmV2LmRpZmZvcHQuZmlsZSA9IHMtPmZwOworCXJldi5kaWZmb3B0LmNsb3NlX2ZpbGUgPSAwOworCXJ1bl9kaWZmX2luZGV4KCZyZXYsIDEpOworfQorCit2b2lkIHd0X3N0YXR1c19wcmludChzdHJ1Y3Qgd3Rfc3RhdHVzICpzKQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJcy0+aXNfaW5pdGlhbCA9IGdldF9zaGExKHMtPnJlZmVyZW5jZSwgc2hhMSkgPyAxIDogMDsKKworCWlmIChzLT5icmFuY2gpIHsKKwkJY29uc3QgY2hhciAqb25fd2hhdCA9ICJPbiBicmFuY2ggIjsKKwkJY29uc3QgY2hhciAqYnJhbmNoX25hbWUgPSBzLT5icmFuY2g7CisJCWlmICghcHJlZml4Y21wKGJyYW5jaF9uYW1lLCAicmVmcy9oZWFkcy8iKSkKKwkJCWJyYW5jaF9uYW1lICs9IDExOworCQllbHNlIGlmICghc3RyY21wKGJyYW5jaF9uYW1lLCAiSEVBRCIpKSB7CisJCQlicmFuY2hfbmFtZSA9ICIiOworCQkJb25fd2hhdCA9ICJOb3QgY3VycmVudGx5IG9uIGFueSBicmFuY2guIjsKKwkJfQorCQljb2xvcl9mcHJpbnRmX2xuKHMtPmZwLCBjb2xvcihXVF9TVEFUVVNfSEVBREVSKSwKKwkJCSIjICVzJXMiLCBvbl93aGF0LCBicmFuY2hfbmFtZSk7CisJfQorCisJaWYgKHMtPmlzX2luaXRpYWwpIHsKKwkJY29sb3JfZnByaW50Zl9sbihzLT5mcCwgY29sb3IoV1RfU1RBVFVTX0hFQURFUiksICIjIik7CisJCWNvbG9yX2ZwcmludGZfbG4ocy0+ZnAsIGNvbG9yKFdUX1NUQVRVU19IRUFERVIpLCAiIyBJbml0aWFsIGNvbW1pdCIpOworCQljb2xvcl9mcHJpbnRmX2xuKHMtPmZwLCBjb2xvcihXVF9TVEFUVVNfSEVBREVSKSwgIiMiKTsKKwkJd3Rfc3RhdHVzX3ByaW50X2luaXRpYWwocyk7CisJfQorCWVsc2UgeworCQl3dF9zdGF0dXNfcHJpbnRfdXBkYXRlZChzKTsKKwl9CisKKwl3dF9zdGF0dXNfcHJpbnRfY2hhbmdlZChzKTsKKwl3dF9zdGF0dXNfcHJpbnRfdW50cmFja2VkKHMpOworCisJaWYgKHMtPnZlcmJvc2UgJiYgIXMtPmlzX2luaXRpYWwpCisJCXd0X3N0YXR1c19wcmludF92ZXJib3NlKHMpOworCWlmICghcy0+Y29tbWl0YWJsZSkgeworCQlpZiAocy0+YW1lbmQpCisJCQlmcHJpbnRmKHMtPmZwLCAiIyBObyBjaGFuZ2VzXG4iKTsKKwkJZWxzZSBpZiAocy0+bm93YXJuKQorCQkJOyAvKiBub3RoaW5nICovCisJCWVsc2UgaWYgKHMtPndvcmtkaXJfZGlydHkpCisJCQlwcmludGYoIm5vIGNoYW5nZXMgYWRkZWQgdG8gY29tbWl0ICh1c2UgXCJnaXQgYWRkXCIgYW5kL29yIFwiZ2l0IGNvbW1pdCAtYVwiKVxuIik7CisJCWVsc2UgaWYgKHMtPndvcmtkaXJfdW50cmFja2VkKQorCQkJcHJpbnRmKCJub3RoaW5nIGFkZGVkIHRvIGNvbW1pdCBidXQgdW50cmFja2VkIGZpbGVzIHByZXNlbnQgKHVzZSBcImdpdCBhZGRcIiB0byB0cmFjaylcbiIpOworCQllbHNlIGlmIChzLT5pc19pbml0aWFsKQorCQkJcHJpbnRmKCJub3RoaW5nIHRvIGNvbW1pdCAoY3JlYXRlL2NvcHkgZmlsZXMgYW5kIHVzZSBcImdpdCBhZGRcIiB0byB0cmFjaylcbiIpOworCQllbHNlCisJCQlwcmludGYoIm5vdGhpbmcgdG8gY29tbWl0ICh3b3JraW5nIGRpcmVjdG9yeSBjbGVhbilcbiIpOworCX0KK30KKworaW50IGdpdF9zdGF0dXNfY29uZmlnKGNvbnN0IGNoYXIgKmssIGNvbnN0IGNoYXIgKnYpCit7CisJaWYgKCFzdHJjbXAoaywgInN0YXR1cy5jb2xvciIpIHx8ICFzdHJjbXAoaywgImNvbG9yLnN0YXR1cyIpKSB7CisJCXd0X3N0YXR1c191c2VfY29sb3IgPSBnaXRfY29uZmlnX2NvbG9yYm9vbChrLCB2LCAtMSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXByZWZpeGNtcChrLCAic3RhdHVzLmNvbG9yLiIpIHx8ICFwcmVmaXhjbXAoaywgImNvbG9yLnN0YXR1cy4iKSkgeworCQlpbnQgc2xvdCA9IHBhcnNlX3N0YXR1c19zbG90KGssIDEzKTsKKwkJaWYgKCF2KQorCQkJcmV0dXJuIGNvbmZpZ19lcnJvcl9ub25ib29sKGspOworCQljb2xvcl9wYXJzZSh2LCBrLCB3dF9zdGF0dXNfY29sb3JzW3Nsb3RdKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKGssICJzdGF0dXMucmVsYXRpdmVwYXRocyIpKSB7CisJCXd0X3N0YXR1c19yZWxhdGl2ZV9wYXRocyA9IGdpdF9jb25maWdfYm9vbChrLCB2KTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBnaXRfY29sb3JfZGVmYXVsdF9jb25maWcoaywgdik7Cit9CmRpZmYgLS1naXQgYS93dC1zdGF0dXMuaCBiL3d0LXN0YXR1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYWZhYTYKLS0tIC9kZXYvbnVsbAorKysgYi93dC1zdGF0dXMuaApAQCAtMCwwICsxLDM2IEBACisjaWZuZGVmIFNUQVRVU19ICisjZGVmaW5lIFNUQVRVU19ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitlbnVtIGNvbG9yX3d0X3N0YXR1cyB7CisJV1RfU1RBVFVTX0hFQURFUiwKKwlXVF9TVEFUVVNfVVBEQVRFRCwKKwlXVF9TVEFUVVNfQ0hBTkdFRCwKKwlXVF9TVEFUVVNfVU5UUkFDS0VELAorfTsKKworc3RydWN0IHd0X3N0YXR1cyB7CisJaW50IGlzX2luaXRpYWw7CisJY2hhciAqYnJhbmNoOworCWNvbnN0IGNoYXIgKnJlZmVyZW5jZTsKKwlpbnQgdmVyYm9zZTsKKwlpbnQgYW1lbmQ7CisJaW50IHVudHJhY2tlZDsKKwlpbnQgbm93YXJuOworCS8qIFRoZXNlIGFyZSBjb21wdXRlZCBkdXJpbmcgcHJvY2Vzc2luZyBvZiB0aGUgaW5kaXZpZHVhbCBzZWN0aW9ucyAqLworCWludCBjb21taXRhYmxlOworCWludCB3b3JrZGlyX2RpcnR5OworCWludCB3b3JrZGlyX3VudHJhY2tlZDsKKwljb25zdCBjaGFyICppbmRleF9maWxlOworCUZJTEUgKmZwOworCWNvbnN0IGNoYXIgKnByZWZpeDsKK307CisKK2ludCBnaXRfc3RhdHVzX2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK2ludCB3dF9zdGF0dXNfdXNlX2NvbG9yOworaW50IHd0X3N0YXR1c19yZWxhdGl2ZV9wYXRoczsKK3ZvaWQgd3Rfc3RhdHVzX3ByZXBhcmUoc3RydWN0IHd0X3N0YXR1cyAqcyk7Cit2b2lkIHd0X3N0YXR1c19wcmludChzdHJ1Y3Qgd3Rfc3RhdHVzICpzKTsKKworI2VuZGlmIC8qIFNUQVRVU19IICovCmRpZmYgLS1naXQgYS94ZGlmZi1pbnRlcmZhY2UuYyBiL3hkaWZmLWludGVyZmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZGM1YzUKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi1pbnRlcmZhY2UuYwpAQCAtMCwwICsxLDIzOSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAieGRpZmYtaW50ZXJmYWNlLmgiCisKK3N0YXRpYyBpbnQgcGFyc2VfbnVtKGNoYXIgKipjcF9wLCBpbnQgKm51bV9wKQoreworCWNoYXIgKmNwID0gKmNwX3A7CisJaW50IG51bSA9IDA7CisJaW50IHJlYWRfc29tZTsKKworCXdoaWxlICgnMCcgPD0gKmNwICYmICpjcCA8PSAnOScpCisJCW51bSA9IG51bSAqIDEwICsgKmNwKysgLSAnMCc7CisJaWYgKCEocmVhZF9zb21lID0gY3AgLSAqY3BfcCkpCisJCXJldHVybiAtMTsKKwkqY3BfcCA9IGNwOworCSpudW1fcCA9IG51bTsKKwlyZXR1cm4gMDsKK30KKworaW50IHBhcnNlX2h1bmtfaGVhZGVyKGNoYXIgKmxpbmUsIGludCBsZW4sCisJCSAgICAgIGludCAqb2IsIGludCAqb24sCisJCSAgICAgIGludCAqbmIsIGludCAqbm4pCit7CisJY2hhciAqY3A7CisJY3AgPSBsaW5lICsgNDsKKwlpZiAocGFyc2VfbnVtKCZjcCwgb2IpKSB7CisJYmFkX2xpbmU6CisJCXJldHVybiBlcnJvcigibWFsZm9ybWVkIGRpZmYgb3V0cHV0OiAlcyIsIGxpbmUpOworCX0KKwlpZiAoKmNwID09ICcsJykgeworCQljcCsrOworCQlpZiAocGFyc2VfbnVtKCZjcCwgb24pKQorCQkJZ290byBiYWRfbGluZTsKKwl9CisJZWxzZQorCQkqb24gPSAxOworCWlmICgqY3ArKyAhPSAnICcgfHwgKmNwKysgIT0gJysnKQorCQlnb3RvIGJhZF9saW5lOworCWlmIChwYXJzZV9udW0oJmNwLCBuYikpCisJCWdvdG8gYmFkX2xpbmU7CisJaWYgKCpjcCA9PSAnLCcpIHsKKwkJY3ArKzsKKwkJaWYgKHBhcnNlX251bSgmY3AsIG5uKSkKKwkJCWdvdG8gYmFkX2xpbmU7CisJfQorCWVsc2UKKwkJKm5uID0gMTsKKwlyZXR1cm4gLSEhbWVtY21wKGNwLCAiIEBAIiwgMyk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnN1bWVfb25lKHZvaWQgKnByaXZfLCBjaGFyICpzLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IHhkaWZmX2VtaXRfc3RhdGUgKnByaXYgPSBwcml2XzsKKwljaGFyICplcDsKKwl3aGlsZSAoc2l6ZSkgeworCQl1bnNpZ25lZCBsb25nIHRoaXNfc2l6ZTsKKwkJZXAgPSBtZW1jaHIocywgJ1xuJywgc2l6ZSk7CisJCXRoaXNfc2l6ZSA9IChlcCA9PSBOVUxMKSA/IHNpemUgOiAoZXAgLSBzICsgMSk7CisJCXByaXYtPmNvbnN1bWUocHJpdiwgcywgdGhpc19zaXplKTsKKwkJc2l6ZSAtPSB0aGlzX3NpemU7CisJCXMgKz0gdGhpc19zaXplOworCX0KK30KKworaW50IHhkaWZmX291dGYodm9pZCAqcHJpdl8sIG1tYnVmZmVyX3QgKm1iLCBpbnQgbmJ1ZikKK3sKKwlzdHJ1Y3QgeGRpZmZfZW1pdF9zdGF0ZSAqcHJpdiA9IHByaXZfOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5idWY7IGkrKykgeworCQlpZiAobWJbaV0ucHRyW21iW2ldLnNpemUtMV0gIT0gJ1xuJykgeworCQkJLyogSW5jb21wbGV0ZSBsaW5lICovCisJCQlwcml2LT5yZW1haW5kZXIgPSB4cmVhbGxvYyhwcml2LT5yZW1haW5kZXIsCisJCQkJCQkgICBwcml2LT5yZW1haW5kZXJfc2l6ZSArCisJCQkJCQkgICBtYltpXS5zaXplKTsKKwkJCW1lbWNweShwcml2LT5yZW1haW5kZXIgKyBwcml2LT5yZW1haW5kZXJfc2l6ZSwKKwkJCSAgICAgICBtYltpXS5wdHIsIG1iW2ldLnNpemUpOworCQkJcHJpdi0+cmVtYWluZGVyX3NpemUgKz0gbWJbaV0uc2l6ZTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogd2UgaGF2ZSBhIGNvbXBsZXRlIGxpbmUgKi8KKwkJaWYgKCFwcml2LT5yZW1haW5kZXIpIHsKKwkJCWNvbnN1bWVfb25lKHByaXYsIG1iW2ldLnB0ciwgbWJbaV0uc2l6ZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlwcml2LT5yZW1haW5kZXIgPSB4cmVhbGxvYyhwcml2LT5yZW1haW5kZXIsCisJCQkJCSAgIHByaXYtPnJlbWFpbmRlcl9zaXplICsKKwkJCQkJICAgbWJbaV0uc2l6ZSk7CisJCW1lbWNweShwcml2LT5yZW1haW5kZXIgKyBwcml2LT5yZW1haW5kZXJfc2l6ZSwKKwkJICAgICAgIG1iW2ldLnB0ciwgbWJbaV0uc2l6ZSk7CisJCWNvbnN1bWVfb25lKHByaXYsIHByaXYtPnJlbWFpbmRlciwKKwkJCSAgICBwcml2LT5yZW1haW5kZXJfc2l6ZSArIG1iW2ldLnNpemUpOworCQlmcmVlKHByaXYtPnJlbWFpbmRlcik7CisJCXByaXYtPnJlbWFpbmRlciA9IE5VTEw7CisJCXByaXYtPnJlbWFpbmRlcl9zaXplID0gMDsKKwl9CisJaWYgKHByaXYtPnJlbWFpbmRlcikgeworCQljb25zdW1lX29uZShwcml2LCBwcml2LT5yZW1haW5kZXIsIHByaXYtPnJlbWFpbmRlcl9zaXplKTsKKwkJZnJlZShwcml2LT5yZW1haW5kZXIpOworCQlwcml2LT5yZW1haW5kZXIgPSBOVUxMOworCQlwcml2LT5yZW1haW5kZXJfc2l6ZSA9IDA7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogVHJpbSBkb3duIGNvbW1vbiBzdWJzdHJpbmcgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVycywKKyAqIGJ1dCBsZWF2ZSBhdCBsZWFzdCBjdHggbGluZXMgYXQgdGhlIGVuZC4KKyAqLworc3RhdGljIHZvaWQgdHJpbV9jb21tb25fdGFpbChtbWZpbGVfdCAqYSwgbW1maWxlX3QgKmIsIGxvbmcgY3R4KQoreworCWNvbnN0IGludCBibGsgPSAxMDI0OworCWxvbmcgdHJpbW1lZCA9IDAsIHJlY292ZXJlZCA9IDA7CisJY2hhciAqYXAgPSBhLT5wdHIgKyBhLT5zaXplOworCWNoYXIgKmJwID0gYi0+cHRyICsgYi0+c2l6ZTsKKwlsb25nIHNtYWxsZXIgPSAoYS0+c2l6ZSA8IGItPnNpemUpID8gYS0+c2l6ZSA6IGItPnNpemU7CisKKwlpZiAoY3R4KQorCQlyZXR1cm47CisKKwl3aGlsZSAoYmxrICsgdHJpbW1lZCA8PSBzbWFsbGVyICYmICFtZW1jbXAoYXAgLSBibGssIGJwIC0gYmxrLCBibGspKSB7CisJCXRyaW1tZWQgKz0gYmxrOworCQlhcCAtPSBibGs7CisJCWJwIC09IGJsazsKKwl9CisKKwl3aGlsZSAocmVjb3ZlcmVkIDwgdHJpbW1lZCkKKwkJaWYgKGFwW3JlY292ZXJlZCsrXSA9PSAnXG4nKQorCQkJYnJlYWs7CisJYS0+c2l6ZSAtPSB0cmltbWVkIC0gcmVjb3ZlcmVkOworCWItPnNpemUgLT0gdHJpbW1lZCAtIHJlY292ZXJlZDsKK30KKworaW50IHhkaV9kaWZmKG1tZmlsZV90ICptZjEsIG1tZmlsZV90ICptZjIsIHhwcGFyYW1fdCBjb25zdCAqeHBwLCB4ZGVtaXRjb25mX3QgY29uc3QgKnhlY2ZnLCB4ZGVtaXRjYl90ICp4ZWNiKQoreworCW1tZmlsZV90IGEgPSAqbWYxOworCW1tZmlsZV90IGIgPSAqbWYyOworCisJdHJpbV9jb21tb25fdGFpbCgmYSwgJmIsIHhlY2ZnLT5jdHhsZW4pOworCisJcmV0dXJuIHhkbF9kaWZmKCZhLCAmYiwgeHBwLCB4ZWNmZywgeGVjYik7Cit9CisKK2ludCByZWFkX21tZmlsZShtbWZpbGVfdCAqcHRyLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlGSUxFICpmOworCXNpemVfdCBzejsKKworCWlmIChzdGF0KGZpbGVuYW1lLCAmc3QpKQorCQlyZXR1cm4gZXJyb3IoIkNvdWxkIG5vdCBzdGF0ICVzIiwgZmlsZW5hbWUpOworCWlmICgoZiA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKSkgPT0gTlVMTCkKKwkJcmV0dXJuIGVycm9yKCJDb3VsZCBub3Qgb3BlbiAlcyIsIGZpbGVuYW1lKTsKKwlzeiA9IHhzaXplX3Qoc3Quc3Rfc2l6ZSk7CisJcHRyLT5wdHIgPSB4bWFsbG9jKHN6ID8gc3ogOiAxKTsKKwlpZiAoc3ogJiYgZnJlYWQocHRyLT5wdHIsIHN6LCAxLCBmKSAhPSAxKQorCQlyZXR1cm4gZXJyb3IoIkNvdWxkIG5vdCByZWFkICVzIiwgZmlsZW5hbWUpOworCWZjbG9zZShmKTsKKwlwdHItPnNpemUgPSBzejsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBGSVJTVF9GRVdfQllURVMgODAwMAoraW50IGJ1ZmZlcl9pc19iaW5hcnkoY29uc3QgY2hhciAqcHRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaWYgKEZJUlNUX0ZFV19CWVRFUyA8IHNpemUpCisJCXNpemUgPSBGSVJTVF9GRVdfQllURVM7CisJcmV0dXJuICEhbWVtY2hyKHB0ciwgMCwgc2l6ZSk7Cit9CisKK3N0cnVjdCBmZl9yZWdzIHsKKwlpbnQgbnI7CisJc3RydWN0IGZmX3JlZyB7CisJCXJlZ2V4X3QgcmU7CisJCWludCBuZWdhdGU7CisJfSAqYXJyYXk7Cit9OworCitzdGF0aWMgbG9uZyBmZl9yZWdleHAoY29uc3QgY2hhciAqbGluZSwgbG9uZyBsZW4sCisJCWNoYXIgKmJ1ZmZlciwgbG9uZyBidWZmZXJfc2l6ZSwgdm9pZCAqcHJpdikKK3sKKwljaGFyICpsaW5lX2J1ZmZlciA9IHhzdHJuZHVwKGxpbmUsIGxlbik7IC8qIG1ha2UgTlVMIHRlcm1pbmF0ZWQgKi8KKwlzdHJ1Y3QgZmZfcmVncyAqcmVncyA9IHByaXY7CisJcmVnbWF0Y2hfdCBwbWF0Y2hbMl07CisJaW50IHJlc3VsdCA9IDAsIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVncy0+bnI7IGkrKykgeworCQlzdHJ1Y3QgZmZfcmVnICpyZWcgPSByZWdzLT5hcnJheSArIGk7CisJCWlmIChyZWctPm5lZ2F0ZSBeICEhcmVnZXhlYygmcmVnLT5yZSwKKwkJCQkJbGluZV9idWZmZXIsIDIsIHBtYXRjaCwgMCkpIHsKKwkJCWZyZWUobGluZV9idWZmZXIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCWkgPSBwbWF0Y2hbMV0ucm1fc28gPj0gMCA/IDEgOiAwOworCWxpbmUgKz0gcG1hdGNoW2ldLnJtX3NvOworCXJlc3VsdCA9IHBtYXRjaFtpXS5ybV9lbyAtIHBtYXRjaFtpXS5ybV9zbzsKKwlpZiAocmVzdWx0ID4gYnVmZmVyX3NpemUpCisJCXJlc3VsdCA9IGJ1ZmZlcl9zaXplOworCWVsc2UKKwkJd2hpbGUgKHJlc3VsdCA+IDAgJiYgKGlzc3BhY2UobGluZVtyZXN1bHQgLSAxXSkgfHwKKwkJCQkJbGluZVtyZXN1bHQgLSAxXSA9PSAnXG4nKSkKKwkJCXJlc3VsdC0tOworCW1lbWNweShidWZmZXIsIGxpbmUsIHJlc3VsdCk7CisJZnJlZShsaW5lX2J1ZmZlcik7CisJcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCB4ZGlmZl9zZXRfZmluZF9mdW5jKHhkZW1pdGNvbmZfdCAqeGVjZmcsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWludCBpOworCXN0cnVjdCBmZl9yZWdzICpyZWdzOworCisJeGVjZmctPmZpbmRfZnVuYyA9IGZmX3JlZ2V4cDsKKwlyZWdzID0geGVjZmctPmZpbmRfZnVuY19wcml2ID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGZmX3JlZ3MpKTsKKwlmb3IgKGkgPSAwLCByZWdzLT5uciA9IDE7IHZhbHVlW2ldOyBpKyspCisJCWlmICh2YWx1ZVtpXSA9PSAnXG4nKQorCQkJcmVncy0+bnIrKzsKKwlyZWdzLT5hcnJheSA9IHhtYWxsb2MocmVncy0+bnIgKiBzaXplb2Yoc3RydWN0IGZmX3JlZykpOworCWZvciAoaSA9IDA7IGkgPCByZWdzLT5ucjsgaSsrKSB7CisJCXN0cnVjdCBmZl9yZWcgKnJlZyA9IHJlZ3MtPmFycmF5ICsgaTsKKwkJY29uc3QgY2hhciAqZXAgPSBzdHJjaHIodmFsdWUsICdcbicpLCAqZXhwcmVzc2lvbjsKKwkJY2hhciAqYnVmZmVyID0gTlVMTDsKKworCQlyZWctPm5lZ2F0ZSA9ICgqdmFsdWUgPT0gJyEnKTsKKwkJaWYgKHJlZy0+bmVnYXRlICYmIGkgPT0gcmVncy0+bnIgLSAxKQorCQkJZGllKCJMYXN0IGV4cHJlc3Npb24gbXVzdCBub3QgYmUgbmVnYXRlZDogJXMiLCB2YWx1ZSk7CisJCWlmICgqdmFsdWUgPT0gJyEnKQorCQkJdmFsdWUrKzsKKwkJaWYgKGVwKQorCQkJZXhwcmVzc2lvbiA9IGJ1ZmZlciA9IHhzdHJuZHVwKHZhbHVlLCBlcCAtIHZhbHVlKTsKKwkJZWxzZQorCQkJZXhwcmVzc2lvbiA9IHZhbHVlOworCQlpZiAocmVnY29tcCgmcmVnLT5yZSwgZXhwcmVzc2lvbiwgMCkpCisJCQlkaWUoIkludmFsaWQgcmVnZXhwIHRvIGxvb2sgZm9yIGh1bmsgaGVhZGVyOiAlcyIsIGV4cHJlc3Npb24pOworCQlmcmVlKGJ1ZmZlcik7CisJCXZhbHVlID0gZXAgKyAxOworCX0KK30KZGlmZiAtLWdpdCBhL3hkaWZmLWludGVyZmFjZS5oIGIveGRpZmYtaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdmNzkxZAotLS0gL2Rldi9udWxsCisrKyBiL3hkaWZmLWludGVyZmFjZS5oCkBAIC0wLDAgKzEsMjYgQEAKKyNpZm5kZWYgWERJRkZfSU5URVJGQUNFX0gKKyNkZWZpbmUgWERJRkZfSU5URVJGQUNFX0gKKworI2luY2x1ZGUgInhkaWZmL3hkaWZmLmgiCisKK3N0cnVjdCB4ZGlmZl9lbWl0X3N0YXRlOworCit0eXBlZGVmIHZvaWQgKCp4ZGlmZl9lbWl0X2NvbnN1bWVfZm4pKHZvaWQgKiwgY2hhciAqLCB1bnNpZ25lZCBsb25nKTsKKworc3RydWN0IHhkaWZmX2VtaXRfc3RhdGUgeworCXhkaWZmX2VtaXRfY29uc3VtZV9mbiBjb25zdW1lOworCWNoYXIgKnJlbWFpbmRlcjsKKwl1bnNpZ25lZCBsb25nIHJlbWFpbmRlcl9zaXplOworfTsKKworaW50IHhkaV9kaWZmKG1tZmlsZV90ICptZjEsIG1tZmlsZV90ICptZjIsIHhwcGFyYW1fdCBjb25zdCAqeHBwLCB4ZGVtaXRjb25mX3QgY29uc3QgKnhlY2ZnLCB4ZGVtaXRjYl90ICplY2IpOworaW50IHhkaWZmX291dGYodm9pZCAqcHJpdl8sIG1tYnVmZmVyX3QgKm1iLCBpbnQgbmJ1Zik7CitpbnQgcGFyc2VfaHVua19oZWFkZXIoY2hhciAqbGluZSwgaW50IGxlbiwKKwkJICAgICAgaW50ICpvYiwgaW50ICpvbiwKKwkJICAgICAgaW50ICpuYiwgaW50ICpubik7CitpbnQgcmVhZF9tbWZpbGUobW1maWxlX3QgKnB0ciwgY29uc3QgY2hhciAqZmlsZW5hbWUpOworaW50IGJ1ZmZlcl9pc19iaW5hcnkoY29uc3QgY2hhciAqcHRyLCB1bnNpZ25lZCBsb25nIHNpemUpOworCitleHRlcm4gdm9pZCB4ZGlmZl9zZXRfZmluZF9mdW5jKHhkZW1pdGNvbmZfdCAqeGVjZmcsIGNvbnN0IGNoYXIgKmxpbmUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3hkaWZmL3hkaWZmLmggYi94ZGlmZi94ZGlmZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMzA4MmUKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94ZGlmZi5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogIExpYlhEaWZmIGJ5IERhdmlkZSBMaWJlbnppICggRmlsZSBEaWZmZXJlbnRpYWwgTGlicmFyeSApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzICBEYXZpZGUgTGliZW56aQorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogIERhdmlkZSBMaWJlbnppIDxkYXZpZGVsQHhtYWlsc2VydmVyLm9yZz4KKyAqCisgKi8KKworI2lmICFkZWZpbmVkKFhESUZGX0gpCisjZGVmaW5lIFhESUZGX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiAjaWZkZWYgX19jcGx1c3BsdXMgKi8KKworCisjZGVmaW5lIFhERl9ORUVEX01JTklNQUwgKDEgPDwgMSkKKyNkZWZpbmUgWERGX0lHTk9SRV9XSElURVNQQUNFICgxIDw8IDIpCisjZGVmaW5lIFhERl9JR05PUkVfV0hJVEVTUEFDRV9DSEFOR0UgKDEgPDwgMykKKyNkZWZpbmUgWERGX0lHTk9SRV9XSElURVNQQUNFX0FUX0VPTCAoMSA8PCA0KQorI2RlZmluZSBYREZfV0hJVEVTUEFDRV9GTEFHUyAoWERGX0lHTk9SRV9XSElURVNQQUNFIHwgWERGX0lHTk9SRV9XSElURVNQQUNFX0NIQU5HRSB8IFhERl9JR05PUkVfV0hJVEVTUEFDRV9BVF9FT0wpCisKKyNkZWZpbmUgWERMX1BBVENIX05PUk1BTCAnLScKKyNkZWZpbmUgWERMX1BBVENIX1JFVkVSU0UgJysnCisjZGVmaW5lIFhETF9QQVRDSF9NT0RFTUFTSyAoKDEgPDwgOCkgLSAxKQorI2RlZmluZSBYRExfUEFUQ0hfSUdOT1JFQlNQQUNFICgxIDw8IDgpCisKKyNkZWZpbmUgWERMX0VNSVRfRlVOQ05BTUVTICgxIDw8IDApCisjZGVmaW5lIFhETF9FTUlUX0NPTU1PTiAoMSA8PCAxKQorCisjZGVmaW5lIFhETF9NTUJfUkVBRE9OTFkgKDEgPDwgMCkKKworI2RlZmluZSBYRExfTU1GX0FUT01JQyAoMSA8PCAwKQorCisjZGVmaW5lIFhETF9CRE9QX0lOUyAxCisjZGVmaW5lIFhETF9CRE9QX0NQWSAyCisjZGVmaW5lIFhETF9CRE9QX0lOU0IgMworCisjZGVmaW5lIFhETF9NRVJHRV9NSU5JTUFMIDAKKyNkZWZpbmUgWERMX01FUkdFX0VBR0VSIDEKKyNkZWZpbmUgWERMX01FUkdFX1pFQUxPVVMgMgorI2RlZmluZSBYRExfTUVSR0VfWkVBTE9VU19BTE5VTSAzCisKK3R5cGVkZWYgc3RydWN0IHNfbW1maWxlIHsKKwljaGFyICpwdHI7CisJbG9uZyBzaXplOworfSBtbWZpbGVfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19tbWJ1ZmZlciB7CisJY2hhciAqcHRyOworCWxvbmcgc2l6ZTsKK30gbW1idWZmZXJfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc194cHBhcmFtIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworfSB4cHBhcmFtX3Q7CisKK3R5cGVkZWYgc3RydWN0IHNfeGRlbWl0Y2IgeworCXZvaWQgKnByaXY7CisJaW50ICgqb3V0Zikodm9pZCAqLCBtbWJ1ZmZlcl90ICosIGludCk7Cit9IHhkZW1pdGNiX3Q7CisKK3R5cGVkZWYgbG9uZyAoKmZpbmRfZnVuY190KShjb25zdCBjaGFyICpsaW5lLCBsb25nIGxpbmVfbGVuLCBjaGFyICpidWZmZXIsIGxvbmcgYnVmZmVyX3NpemUsIHZvaWQgKnByaXYpOworCit0eXBlZGVmIHN0cnVjdCBzX3hkZW1pdGNvbmYgeworCWxvbmcgY3R4bGVuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZmluZF9mdW5jX3QgZmluZF9mdW5jOworCXZvaWQgKmZpbmRfZnVuY19wcml2OworfSB4ZGVtaXRjb25mX3Q7CisKK3R5cGVkZWYgc3RydWN0IHNfYmRpZmZwYXJhbSB7CisJbG9uZyBic2l6ZTsKK30gYmRpZmZwYXJhbV90OworCisKKyNkZWZpbmUgeGRsX21hbGxvYyh4KSBtYWxsb2MoeCkKKyNkZWZpbmUgeGRsX2ZyZWUocHRyKSBmcmVlKHB0cikKKyNkZWZpbmUgeGRsX3JlYWxsb2MocHRyLHgpIHJlYWxsb2MocHRyLHgpCisKK3ZvaWQgKnhkbF9tbWZpbGVfZmlyc3QobW1maWxlX3QgKm1tZiwgbG9uZyAqc2l6ZSk7Cit2b2lkICp4ZGxfbW1maWxlX25leHQobW1maWxlX3QgKm1tZiwgbG9uZyAqc2l6ZSk7Citsb25nIHhkbF9tbWZpbGVfc2l6ZShtbWZpbGVfdCAqbW1mKTsKKworaW50IHhkbF9kaWZmKG1tZmlsZV90ICptZjEsIG1tZmlsZV90ICptZjIsIHhwcGFyYW1fdCBjb25zdCAqeHBwLAorCSAgICAgeGRlbWl0Y29uZl90IGNvbnN0ICp4ZWNmZywgeGRlbWl0Y2JfdCAqZWNiKTsKKworaW50IHhkbF9tZXJnZShtbWZpbGVfdCAqb3JpZywgbW1maWxlX3QgKm1mMSwgY29uc3QgY2hhciAqbmFtZTEsCisJCW1tZmlsZV90ICptZjIsIGNvbnN0IGNoYXIgKm5hbWUyLAorCQl4cHBhcmFtX3QgY29uc3QgKnhwcCwgaW50IGxldmVsLCBtbWJ1ZmZlcl90ICpyZXN1bHQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiAjaWZkZWYgX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qICNpZiAhZGVmaW5lZChYRElGRl9IKSAqLwpkaWZmIC0tZ2l0IGEveGRpZmYveGRpZmZpLmMgYi94ZGlmZi94ZGlmZmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmFkODQ2Ci0tLSAvZGV2L251bGwKKysrIGIveGRpZmYveGRpZmZpLmMKQEAgLTAsMCArMSw1NjUgQEAKKy8qCisgKiAgTGliWERpZmYgYnkgRGF2aWRlIExpYmVuemkgKCBGaWxlIERpZmZlcmVudGlhbCBMaWJyYXJ5ICkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMJRGF2aWRlIExpYmVuemkKKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqICBEYXZpZGUgTGliZW56aSA8ZGF2aWRlbEB4bWFpbHNlcnZlci5vcmc+CisgKgorICovCisKKyNpbmNsdWRlICJ4aW5jbHVkZS5oIgorCisKKworI2RlZmluZSBYRExfTUFYX0NPU1RfTUlOIDI1NgorI2RlZmluZSBYRExfSEVVUl9NSU5fQ09TVCAyNTYKKyNkZWZpbmUgWERMX0xJTkVfTUFYIChsb25nKSgoMVVMIDw8ICg4ICogc2l6ZW9mKGxvbmcpIC0gMSkpIC0gMSkKKyNkZWZpbmUgWERMX1NOQUtFX0NOVCAyMAorI2RlZmluZSBYRExfS19IRVVSIDQKKworCisKK3R5cGVkZWYgc3RydWN0IHNfeGRwc3BsaXQgeworCWxvbmcgaTEsIGkyOworCWludCBtaW5fbG8sIG1pbl9oaTsKK30geGRwc3BsaXRfdDsKKworCisKKworc3RhdGljIGxvbmcgeGRsX3NwbGl0KHVuc2lnbmVkIGxvbmcgY29uc3QgKmhhMSwgbG9uZyBvZmYxLCBsb25nIGxpbTEsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgY29uc3QgKmhhMiwgbG9uZyBvZmYyLCBsb25nIGxpbTIsCisJCSAgICAgIGxvbmcgKmt2ZGYsIGxvbmcgKmt2ZGIsIGludCBuZWVkX21pbiwgeGRwc3BsaXRfdCAqc3BsLAorCQkgICAgICB4ZGFsZ29lbnZfdCAqeGVudik7CitzdGF0aWMgeGRjaGFuZ2VfdCAqeGRsX2FkZF9jaGFuZ2UoeGRjaGFuZ2VfdCAqeHNjciwgbG9uZyBpMSwgbG9uZyBpMiwgbG9uZyBjaGcxLCBsb25nIGNoZzIpOworCisKKworCisKKy8qCisgKiBTZWUgIkFuIE8oTkQpIERpZmZlcmVuY2UgQWxnb3JpdGhtIGFuZCBpdHMgVmFyaWF0aW9ucyIsIGJ5IEV1Z2VuZSBNeWVycy4KKyAqIEJhc2ljYWxseSBjb25zaWRlcnMgYSAiYm94IiAob2ZmMSwgb2ZmMiwgbGltMSwgbGltMikgYW5kIHNjYW4gZnJvbSBib3RoCisgKiB0aGUgZm9yd2FyZCBkaWFnb25hbCBzdGFydGluZyBmcm9tIChvZmYxLCBvZmYyKSBhbmQgdGhlIGJhY2t3YXJkIGRpYWdvbmFsCisgKiBzdGFydGluZyBmcm9tIChsaW0xLCBsaW0yKS4gSWYgdGhlIEsgdmFsdWVzIG9uIHRoZSBzYW1lIGRpYWdvbmFsIGNyb3NzZXMKKyAqIHJldHVybnMgdGhlIGZ1cnRoZXN0IHBvaW50IG9mIHJlYWNoLiBXZSBtaWdodCBlbmQgdXAgaGF2aW5nIHRvIGV4cGVuc2l2ZQorICogY2FzZXMgdXNpbmcgdGhpcyBhbGdvcml0aG0gaXMgZnVsbCwgc28gYSBsaXR0bGUgYml0IG9mIGhldXJpc3RpYyBpcyBuZWVkZWQKKyAqIHRvIGN1dCB0aGUgc2VhcmNoIGFuZCB0byByZXR1cm4gYSBzdWJvcHRpbWFsIHBvaW50LgorICovCitzdGF0aWMgbG9uZyB4ZGxfc3BsaXQodW5zaWduZWQgbG9uZyBjb25zdCAqaGExLCBsb25nIG9mZjEsIGxvbmcgbGltMSwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBjb25zdCAqaGEyLCBsb25nIG9mZjIsIGxvbmcgbGltMiwKKwkJICAgICAgbG9uZyAqa3ZkZiwgbG9uZyAqa3ZkYiwgaW50IG5lZWRfbWluLCB4ZHBzcGxpdF90ICpzcGwsCisJCSAgICAgIHhkYWxnb2Vudl90ICp4ZW52KSB7CisJbG9uZyBkbWluID0gb2ZmMSAtIGxpbTIsIGRtYXggPSBsaW0xIC0gb2ZmMjsKKwlsb25nIGZtaWQgPSBvZmYxIC0gb2ZmMiwgYm1pZCA9IGxpbTEgLSBsaW0yOworCWxvbmcgb2RkID0gKGZtaWQgLSBibWlkKSAmIDE7CisJbG9uZyBmbWluID0gZm1pZCwgZm1heCA9IGZtaWQ7CisJbG9uZyBibWluID0gYm1pZCwgYm1heCA9IGJtaWQ7CisJbG9uZyBlYywgZCwgaTEsIGkyLCBwcmV2MSwgYmVzdCwgZGQsIHYsIGs7CisKKwkvKgorCSAqIFNldCBpbml0aWFsIGRpYWdvbmFsIHZhbHVlcyBmb3IgYm90aCBmb3J3YXJkIGFuZCBiYWNrd2FyZCBwYXRoLgorCSAqLworCWt2ZGZbZm1pZF0gPSBvZmYxOworCWt2ZGJbYm1pZF0gPSBsaW0xOworCisJZm9yIChlYyA9IDE7OyBlYysrKSB7CisJCWludCBnb3Rfc25ha2UgPSAwOworCisJCS8qCisJCSAqIFdlIG5lZWQgdG8gZXh0ZW50IHRoZSBkaWFnb25hbCAiZG9tYWluIiBieSBvbmUuIElmIHRoZSBuZXh0CisJCSAqIHZhbHVlcyBleGl0cyB0aGUgYm94IGJvdW5kYXJpZXMgd2UgbmVlZCB0byBjaGFuZ2UgaXQgaW4gdGhlCisJCSAqIG9wcG9zaXRlIGRpcmVjdGlvbiBiZWNhdXNlIChtYXggLSBtaW4pIG11c3QgYmUgYSBwb3dlciBvZiB0d28uCisJCSAqIEFsc28gd2UgaW5pdGlhbGl6ZSB0aGUgZXh0ZXJuYWwgSyB2YWx1ZSB0byAtMSBzbyB0aGF0IHdlIGNhbgorCQkgKiBhdm9pZCBleHRyYSBjb25kaXRpb25zIGNoZWNrIGluc2lkZSB0aGUgY29yZSBsb29wLgorCQkgKi8KKwkJaWYgKGZtaW4gPiBkbWluKQorCQkJa3ZkZlstLWZtaW4gLSAxXSA9IC0xOworCQllbHNlCisJCQkrK2ZtaW47CisJCWlmIChmbWF4IDwgZG1heCkKKwkJCWt2ZGZbKytmbWF4ICsgMV0gPSAtMTsKKwkJZWxzZQorCQkJLS1mbWF4OworCisJCWZvciAoZCA9IGZtYXg7IGQgPj0gZm1pbjsgZCAtPSAyKSB7CisJCQlpZiAoa3ZkZltkIC0gMV0gPj0ga3ZkZltkICsgMV0pCisJCQkJaTEgPSBrdmRmW2QgLSAxXSArIDE7CisJCQllbHNlCisJCQkJaTEgPSBrdmRmW2QgKyAxXTsKKwkJCXByZXYxID0gaTE7CisJCQlpMiA9IGkxIC0gZDsKKwkJCWZvciAoOyBpMSA8IGxpbTEgJiYgaTIgPCBsaW0yICYmIGhhMVtpMV0gPT0gaGEyW2kyXTsgaTErKywgaTIrKyk7CisJCQlpZiAoaTEgLSBwcmV2MSA+IHhlbnYtPnNuYWtlX2NudCkKKwkJCQlnb3Rfc25ha2UgPSAxOworCQkJa3ZkZltkXSA9IGkxOworCQkJaWYgKG9kZCAmJiBibWluIDw9IGQgJiYgZCA8PSBibWF4ICYmIGt2ZGJbZF0gPD0gaTEpIHsKKwkJCQlzcGwtPmkxID0gaTE7CisJCQkJc3BsLT5pMiA9IGkyOworCQkJCXNwbC0+bWluX2xvID0gc3BsLT5taW5faGkgPSAxOworCQkJCXJldHVybiBlYzsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIFdlIG5lZWQgdG8gZXh0ZW50IHRoZSBkaWFnb25hbCAiZG9tYWluIiBieSBvbmUuIElmIHRoZSBuZXh0CisJCSAqIHZhbHVlcyBleGl0cyB0aGUgYm94IGJvdW5kYXJpZXMgd2UgbmVlZCB0byBjaGFuZ2UgaXQgaW4gdGhlCisJCSAqIG9wcG9zaXRlIGRpcmVjdGlvbiBiZWNhdXNlIChtYXggLSBtaW4pIG11c3QgYmUgYSBwb3dlciBvZiB0d28uCisJCSAqIEFsc28gd2UgaW5pdGlhbGl6ZSB0aGUgZXh0ZXJuYWwgSyB2YWx1ZSB0byAtMSBzbyB0aGF0IHdlIGNhbgorCQkgKiBhdm9pZCBleHRyYSBjb25kaXRpb25zIGNoZWNrIGluc2lkZSB0aGUgY29yZSBsb29wLgorCQkgKi8KKwkJaWYgKGJtaW4gPiBkbWluKQorCQkJa3ZkYlstLWJtaW4gLSAxXSA9IFhETF9MSU5FX01BWDsKKwkJZWxzZQorCQkJKytibWluOworCQlpZiAoYm1heCA8IGRtYXgpCisJCQlrdmRiWysrYm1heCArIDFdID0gWERMX0xJTkVfTUFYOworCQllbHNlCisJCQktLWJtYXg7CisKKwkJZm9yIChkID0gYm1heDsgZCA+PSBibWluOyBkIC09IDIpIHsKKwkJCWlmIChrdmRiW2QgLSAxXSA8IGt2ZGJbZCArIDFdKQorCQkJCWkxID0ga3ZkYltkIC0gMV07CisJCQllbHNlCisJCQkJaTEgPSBrdmRiW2QgKyAxXSAtIDE7CisJCQlwcmV2MSA9IGkxOworCQkJaTIgPSBpMSAtIGQ7CisJCQlmb3IgKDsgaTEgPiBvZmYxICYmIGkyID4gb2ZmMiAmJiBoYTFbaTEgLSAxXSA9PSBoYTJbaTIgLSAxXTsgaTEtLSwgaTItLSk7CisJCQlpZiAocHJldjEgLSBpMSA+IHhlbnYtPnNuYWtlX2NudCkKKwkJCQlnb3Rfc25ha2UgPSAxOworCQkJa3ZkYltkXSA9IGkxOworCQkJaWYgKCFvZGQgJiYgZm1pbiA8PSBkICYmIGQgPD0gZm1heCAmJiBpMSA8PSBrdmRmW2RdKSB7CisJCQkJc3BsLT5pMSA9IGkxOworCQkJCXNwbC0+aTIgPSBpMjsKKwkJCQlzcGwtPm1pbl9sbyA9IHNwbC0+bWluX2hpID0gMTsKKwkJCQlyZXR1cm4gZWM7CisJCQl9CisJCX0KKworCQlpZiAobmVlZF9taW4pCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBJZiB0aGUgZWRpdCBjb3N0IGlzIGFib3ZlIHRoZSBoZXVyaXN0aWMgdHJpZ2dlciBhbmQgaWYKKwkJICogd2UgZ290IGEgZ29vZCBzbmFrZSwgd2Ugc2FtcGxlIGN1cnJlbnQgZGlhZ29uYWxzIHRvIHNlZQorCQkgKiBpZiBzb21lIG9mIHRoZSwgaGF2ZSByZWFjaGVkIGFuICJpbnRlcmVzdGluZyIgcGF0aC4gT3VyCisJCSAqIG1lYXN1cmUgaXMgYSBmdW5jdGlvbiBvZiB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgZGlhZ29uYWwKKwkJICogY29ybmVyIChpMSArIGkyKSBwZW5hbGl6ZWQgd2l0aCB0aGUgZGlzdGFuY2UgZnJvbSB0aGUKKwkJICogbWlkIGRpYWdvbmFsIGl0c2VsZi4gSWYgdGhpcyB2YWx1ZSBpcyBhYm92ZSB0aGUgY3VycmVudAorCQkgKiBlZGl0IGNvc3QgdGltZXMgYSBtYWdpYyBmYWN0b3IgKFhETF9LX0hFVVIpIHdlIGNvbnNpZGVyCisJCSAqIGl0IGludGVyZXN0aW5nLgorCQkgKi8KKwkJaWYgKGdvdF9zbmFrZSAmJiBlYyA+IHhlbnYtPmhldXJfbWluKSB7CisJCQlmb3IgKGJlc3QgPSAwLCBkID0gZm1heDsgZCA+PSBmbWluOyBkIC09IDIpIHsKKwkJCQlkZCA9IGQgPiBmbWlkID8gZCAtIGZtaWQ6IGZtaWQgLSBkOworCQkJCWkxID0ga3ZkZltkXTsKKwkJCQlpMiA9IGkxIC0gZDsKKwkJCQl2ID0gKGkxIC0gb2ZmMSkgKyAoaTIgLSBvZmYyKSAtIGRkOworCisJCQkJaWYgKHYgPiBYRExfS19IRVVSICogZWMgJiYgdiA+IGJlc3QgJiYKKwkJCQkgICAgb2ZmMSArIHhlbnYtPnNuYWtlX2NudCA8PSBpMSAmJiBpMSA8IGxpbTEgJiYKKwkJCQkgICAgb2ZmMiArIHhlbnYtPnNuYWtlX2NudCA8PSBpMiAmJiBpMiA8IGxpbTIpIHsKKwkJCQkJZm9yIChrID0gMTsgaGExW2kxIC0ga10gPT0gaGEyW2kyIC0ga107IGsrKykKKwkJCQkJCWlmIChrID09IHhlbnYtPnNuYWtlX2NudCkgeworCQkJCQkJCWJlc3QgPSB2OworCQkJCQkJCXNwbC0+aTEgPSBpMTsKKwkJCQkJCQlzcGwtPmkyID0gaTI7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKGJlc3QgPiAwKSB7CisJCQkJc3BsLT5taW5fbG8gPSAxOworCQkJCXNwbC0+bWluX2hpID0gMDsKKwkJCQlyZXR1cm4gZWM7CisJCQl9CisKKwkJCWZvciAoYmVzdCA9IDAsIGQgPSBibWF4OyBkID49IGJtaW47IGQgLT0gMikgeworCQkJCWRkID0gZCA+IGJtaWQgPyBkIC0gYm1pZDogYm1pZCAtIGQ7CisJCQkJaTEgPSBrdmRiW2RdOworCQkJCWkyID0gaTEgLSBkOworCQkJCXYgPSAobGltMSAtIGkxKSArIChsaW0yIC0gaTIpIC0gZGQ7CisKKwkJCQlpZiAodiA+IFhETF9LX0hFVVIgKiBlYyAmJiB2ID4gYmVzdCAmJgorCQkJCSAgICBvZmYxIDwgaTEgJiYgaTEgPD0gbGltMSAtIHhlbnYtPnNuYWtlX2NudCAmJgorCQkJCSAgICBvZmYyIDwgaTIgJiYgaTIgPD0gbGltMiAtIHhlbnYtPnNuYWtlX2NudCkgeworCQkJCQlmb3IgKGsgPSAwOyBoYTFbaTEgKyBrXSA9PSBoYTJbaTIgKyBrXTsgaysrKQorCQkJCQkJaWYgKGsgPT0geGVudi0+c25ha2VfY250IC0gMSkgeworCQkJCQkJCWJlc3QgPSB2OworCQkJCQkJCXNwbC0+aTEgPSBpMTsKKwkJCQkJCQlzcGwtPmkyID0gaTI7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKGJlc3QgPiAwKSB7CisJCQkJc3BsLT5taW5fbG8gPSAwOworCQkJCXNwbC0+bWluX2hpID0gMTsKKwkJCQlyZXR1cm4gZWM7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBFbm91Z2ggaXMgZW5vdWdoLiBXZSBzcGVudCB0b28gbXVjaCB0aW1lIGhlcmUgYW5kIG5vdyB3ZSBjb2xsZWN0CisJCSAqIHRoZSBmdXJ0aGVzdCByZWFjaGluZyBwYXRoIHVzaW5nIHRoZSAoaTEgKyBpMikgbWVhc3VyZS4KKwkJICovCisJCWlmIChlYyA+PSB4ZW52LT5teGNvc3QpIHsKKwkJCWxvbmcgZmJlc3QsIGZiZXN0MSwgYmJlc3QsIGJiZXN0MTsKKworCQkJZmJlc3QgPSBmYmVzdDEgPSAtMTsKKwkJCWZvciAoZCA9IGZtYXg7IGQgPj0gZm1pbjsgZCAtPSAyKSB7CisJCQkJaTEgPSBYRExfTUlOKGt2ZGZbZF0sIGxpbTEpOworCQkJCWkyID0gaTEgLSBkOworCQkJCWlmIChsaW0yIDwgaTIpCisJCQkJCWkxID0gbGltMiArIGQsIGkyID0gbGltMjsKKwkJCQlpZiAoZmJlc3QgPCBpMSArIGkyKSB7CisJCQkJCWZiZXN0ID0gaTEgKyBpMjsKKwkJCQkJZmJlc3QxID0gaTE7CisJCQkJfQorCQkJfQorCisJCQliYmVzdCA9IGJiZXN0MSA9IFhETF9MSU5FX01BWDsKKwkJCWZvciAoZCA9IGJtYXg7IGQgPj0gYm1pbjsgZCAtPSAyKSB7CisJCQkJaTEgPSBYRExfTUFYKG9mZjEsIGt2ZGJbZF0pOworCQkJCWkyID0gaTEgLSBkOworCQkJCWlmIChpMiA8IG9mZjIpCisJCQkJCWkxID0gb2ZmMiArIGQsIGkyID0gb2ZmMjsKKwkJCQlpZiAoaTEgKyBpMiA8IGJiZXN0KSB7CisJCQkJCWJiZXN0ID0gaTEgKyBpMjsKKwkJCQkJYmJlc3QxID0gaTE7CisJCQkJfQorCQkJfQorCisJCQlpZiAoKGxpbTEgKyBsaW0yKSAtIGJiZXN0IDwgZmJlc3QgLSAob2ZmMSArIG9mZjIpKSB7CisJCQkJc3BsLT5pMSA9IGZiZXN0MTsKKwkJCQlzcGwtPmkyID0gZmJlc3QgLSBmYmVzdDE7CisJCQkJc3BsLT5taW5fbG8gPSAxOworCQkJCXNwbC0+bWluX2hpID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJc3BsLT5pMSA9IGJiZXN0MTsKKwkJCQlzcGwtPmkyID0gYmJlc3QgLSBiYmVzdDE7CisJCQkJc3BsLT5taW5fbG8gPSAwOworCQkJCXNwbC0+bWluX2hpID0gMTsKKwkJCX0KKwkJCXJldHVybiBlYzsKKwkJfQorCX0KK30KKworCisvKgorICogUnVsZTogIkRpdmlkZSBldCBJbXBlcmEiLiBSZWN1cnNpdmVseSBzcGxpdCB0aGUgYm94IGluIHN1Yi1ib3hlcyBieSBjYWxsaW5nCisgKiB0aGUgYm94IHNwbGl0dGluZyBmdW5jdGlvbi4gTm90ZSB0aGF0IHRoZSByZWFsIGpvYiAobWFya2luZyBjaGFuZ2VkIGxpbmVzKQorICogaXMgZG9uZSBpbiB0aGUgdHdvIGJvdW5kYXJ5IHJlYWNoaW5nIGNoZWNrcy4KKyAqLworaW50IHhkbF9yZWNzX2NtcChkaWZmZGF0YV90ICpkZDEsIGxvbmcgb2ZmMSwgbG9uZyBsaW0xLAorCQkgZGlmZmRhdGFfdCAqZGQyLCBsb25nIG9mZjIsIGxvbmcgbGltMiwKKwkJIGxvbmcgKmt2ZGYsIGxvbmcgKmt2ZGIsIGludCBuZWVkX21pbiwgeGRhbGdvZW52X3QgKnhlbnYpIHsKKwl1bnNpZ25lZCBsb25nIGNvbnN0ICpoYTEgPSBkZDEtPmhhLCAqaGEyID0gZGQyLT5oYTsKKworCS8qCisJICogU2hyaW5rIHRoZSBib3ggYnkgd2Fsa2luZyB0aHJvdWdoIGVhY2ggZGlhZ29uYWwgc25ha2UgKFNXIGFuZCBORSkuCisJICovCisJZm9yICg7IG9mZjEgPCBsaW0xICYmIG9mZjIgPCBsaW0yICYmIGhhMVtvZmYxXSA9PSBoYTJbb2ZmMl07IG9mZjErKywgb2ZmMisrKTsKKwlmb3IgKDsgb2ZmMSA8IGxpbTEgJiYgb2ZmMiA8IGxpbTIgJiYgaGExW2xpbTEgLSAxXSA9PSBoYTJbbGltMiAtIDFdOyBsaW0xLS0sIGxpbTItLSk7CisKKwkvKgorCSAqIElmIG9uZSBkaW1lbnNpb24gaXMgZW1wdHksIHRoZW4gYWxsIHJlY29yZHMgb24gdGhlIG90aGVyIG9uZSBtdXN0CisJICogYmUgb2J2aW91c2x5IGNoYW5nZWQuCisJICovCisJaWYgKG9mZjEgPT0gbGltMSkgeworCQljaGFyICpyY2hnMiA9IGRkMi0+cmNoZzsKKwkJbG9uZyAqcmluZGV4MiA9IGRkMi0+cmluZGV4OworCisJCWZvciAoOyBvZmYyIDwgbGltMjsgb2ZmMisrKQorCQkJcmNoZzJbcmluZGV4MltvZmYyXV0gPSAxOworCX0gZWxzZSBpZiAob2ZmMiA9PSBsaW0yKSB7CisJCWNoYXIgKnJjaGcxID0gZGQxLT5yY2hnOworCQlsb25nICpyaW5kZXgxID0gZGQxLT5yaW5kZXg7CisKKwkJZm9yICg7IG9mZjEgPCBsaW0xOyBvZmYxKyspCisJCQlyY2hnMVtyaW5kZXgxW29mZjFdXSA9IDE7CisJfSBlbHNlIHsKKwkJbG9uZyBlYzsKKwkJeGRwc3BsaXRfdCBzcGw7CisJCXNwbC5pMSA9IHNwbC5pMiA9IDA7CisKKwkJLyoKKwkJICogRGl2aWRlIC4uLgorCQkgKi8KKwkJaWYgKChlYyA9IHhkbF9zcGxpdChoYTEsIG9mZjEsIGxpbTEsIGhhMiwgb2ZmMiwgbGltMiwga3ZkZiwga3ZkYiwKKwkJCQkgICAgbmVlZF9taW4sICZzcGwsIHhlbnYpKSA8IDApIHsKKworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyoKKwkJICogLi4uIGV0IEltcGVyYS4KKwkJICovCisJCWlmICh4ZGxfcmVjc19jbXAoZGQxLCBvZmYxLCBzcGwuaTEsIGRkMiwgb2ZmMiwgc3BsLmkyLAorCQkJCSBrdmRmLCBrdmRiLCBzcGwubWluX2xvLCB4ZW52KSA8IDAgfHwKKwkJICAgIHhkbF9yZWNzX2NtcChkZDEsIHNwbC5pMSwgbGltMSwgZGQyLCBzcGwuaTIsIGxpbTIsCisJCQkJIGt2ZGYsIGt2ZGIsIHNwbC5taW5faGksIHhlbnYpIDwgMCkgeworCisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgeGRsX2RvX2RpZmYobW1maWxlX3QgKm1mMSwgbW1maWxlX3QgKm1mMiwgeHBwYXJhbV90IGNvbnN0ICp4cHAsCisJCXhkZmVudl90ICp4ZSkgeworCWxvbmcgbmRpYWdzOworCWxvbmcgKmt2ZCwgKmt2ZGYsICprdmRiOworCXhkYWxnb2Vudl90IHhlbnY7CisJZGlmZmRhdGFfdCBkZDEsIGRkMjsKKworCWlmICh4ZGxfcHJlcGFyZV9lbnYobWYxLCBtZjIsIHhwcCwgeGUpIDwgMCkgeworCisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIGFuZCBzZXR1cCBLIHZlY3RvcnMgdG8gYmUgdXNlZCBieSB0aGUgZGlmZmVyZW50aWFsIGFsZ29yaXRobS4KKwkgKiBPbmUgaXMgdG8gc3RvcmUgdGhlIGZvcndhcmQgcGF0aCBhbmQgb25lIHRvIHN0b3JlIHRoZSBiYWNrd2FyZCBwYXRoLgorCSAqLworCW5kaWFncyA9IHhlLT54ZGYxLm5yZWZmICsgeGUtPnhkZjIubnJlZmYgKyAzOworCWlmICghKGt2ZCA9IChsb25nICopIHhkbF9tYWxsb2MoKDIgKiBuZGlhZ3MgKyAyKSAqIHNpemVvZihsb25nKSkpKSB7CisKKwkJeGRsX2ZyZWVfZW52KHhlKTsKKwkJcmV0dXJuIC0xOworCX0KKwlrdmRmID0ga3ZkOworCWt2ZGIgPSBrdmRmICsgbmRpYWdzOworCWt2ZGYgKz0geGUtPnhkZjIubnJlZmYgKyAxOworCWt2ZGIgKz0geGUtPnhkZjIubnJlZmYgKyAxOworCisJeGVudi5teGNvc3QgPSB4ZGxfYm9nb3NxcnQobmRpYWdzKTsKKwlpZiAoeGVudi5teGNvc3QgPCBYRExfTUFYX0NPU1RfTUlOKQorCQl4ZW52Lm14Y29zdCA9IFhETF9NQVhfQ09TVF9NSU47CisJeGVudi5zbmFrZV9jbnQgPSBYRExfU05BS0VfQ05UOworCXhlbnYuaGV1cl9taW4gPSBYRExfSEVVUl9NSU5fQ09TVDsKKworCWRkMS5ucmVjID0geGUtPnhkZjEubnJlZmY7CisJZGQxLmhhID0geGUtPnhkZjEuaGE7CisJZGQxLnJjaGcgPSB4ZS0+eGRmMS5yY2hnOworCWRkMS5yaW5kZXggPSB4ZS0+eGRmMS5yaW5kZXg7CisJZGQyLm5yZWMgPSB4ZS0+eGRmMi5ucmVmZjsKKwlkZDIuaGEgPSB4ZS0+eGRmMi5oYTsKKwlkZDIucmNoZyA9IHhlLT54ZGYyLnJjaGc7CisJZGQyLnJpbmRleCA9IHhlLT54ZGYyLnJpbmRleDsKKworCWlmICh4ZGxfcmVjc19jbXAoJmRkMSwgMCwgZGQxLm5yZWMsICZkZDIsIDAsIGRkMi5ucmVjLAorCQkJIGt2ZGYsIGt2ZGIsICh4cHAtPmZsYWdzICYgWERGX05FRURfTUlOSU1BTCkgIT0gMCwgJnhlbnYpIDwgMCkgeworCisJCXhkbF9mcmVlKGt2ZCk7CisJCXhkbF9mcmVlX2Vudih4ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwl4ZGxfZnJlZShrdmQpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHhkY2hhbmdlX3QgKnhkbF9hZGRfY2hhbmdlKHhkY2hhbmdlX3QgKnhzY3IsIGxvbmcgaTEsIGxvbmcgaTIsIGxvbmcgY2hnMSwgbG9uZyBjaGcyKSB7CisJeGRjaGFuZ2VfdCAqeGNoOworCisJaWYgKCEoeGNoID0gKHhkY2hhbmdlX3QgKikgeGRsX21hbGxvYyhzaXplb2YoeGRjaGFuZ2VfdCkpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwl4Y2gtPm5leHQgPSB4c2NyOworCXhjaC0+aTEgPSBpMTsKKwl4Y2gtPmkyID0gaTI7CisJeGNoLT5jaGcxID0gY2hnMTsKKwl4Y2gtPmNoZzIgPSBjaGcyOworCisJcmV0dXJuIHhjaDsKK30KKworCitpbnQgeGRsX2NoYW5nZV9jb21wYWN0KHhkZmlsZV90ICp4ZGYsIHhkZmlsZV90ICp4ZGZvLCBsb25nIGZsYWdzKSB7CisJbG9uZyBpeCwgaXhvLCBpeHMsIGl4cmVmLCBncnBzaXosIG5yZWMgPSB4ZGYtPm5yZWM7CisJY2hhciAqcmNoZyA9IHhkZi0+cmNoZywgKnJjaGdvID0geGRmby0+cmNoZzsKKwl4cmVjb3JkX3QgKipyZWNzID0geGRmLT5yZWNzOworCisJLyoKKwkgKiBUaGlzIGlzIHRoZSBzYW1lIG9mIHdoYXQgR05VIGRpZmYgZG9lcy4gTW92ZSBiYWNrIGFuZCBmb3J3YXJkCisJICogY2hhbmdlIGdyb3VwcyBmb3IgYSBjb25zaXN0ZW50IGFuZCBwcmV0dHkgZGlmZiBvdXRwdXQuIFRoaXMgYWxzbworCSAqIGhlbHBzIGluIGZpbmRpbmcgam9pbmFibGUgY2hhbmdlIGdyb3VwcyBhbmQgcmVkdWNlIHRoZSBkaWZmIHNpemUuCisJICovCisJZm9yIChpeCA9IGl4byA9IDA7OykgeworCQkvKgorCQkgKiBGaW5kIHRoZSBmaXJzdCBjaGFuZ2VkIGxpbmUgaW4gdGhlIHRvLWJlLWNvbXBhY3RlZCBmaWxlLgorCQkgKiBXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgYm90aCBpbmRleGVzLCBzbyBpZiB3ZSBmaW5kIGEKKwkJICogY2hhbmdlZCBsaW5lcyBncm91cCBvbiB0aGUgb3RoZXIgZmlsZSwgd2hpbGUgc2Nhbm5pbmcgdGhlCisJCSAqIHRvLWJlLWNvbXBhY3RlZCBmaWxlLCB3ZSBuZWVkIHRvIHNraXAgaXQgcHJvcGVybHkuIE5vdGUKKwkJICogdGhhdCBsb29wcyB0aGF0IGFyZSB0ZXN0aW5nIGZvciBjaGFuZ2VkIGxpbmVzIG9uIHJjaGcqIGRvCisJCSAqIG5vdCBuZWVkIGluZGV4IGJvdW5kaW5nIHNpbmNlIHRoZSBhcnJheSBpcyBwcmVwYXJlZCB3aXRoCisJCSAqIGEgemVybyBhdCBwb3NpdGlvbiAtMSBhbmQgTi4KKwkJICovCisJCWZvciAoOyBpeCA8IG5yZWMgJiYgIXJjaGdbaXhdOyBpeCsrKQorCQkJd2hpbGUgKHJjaGdvW2l4bysrXSk7CisJCWlmIChpeCA9PSBucmVjKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogUmVjb3JkIHRoZSBzdGFydCBvZiBhIGNoYW5nZWQtZ3JvdXAgaW4gdGhlIHRvLWJlLWNvbXBhY3RlZCBmaWxlCisJCSAqIGFuZCBmaW5kIHRoZSBlbmQgb2YgaXQsIG9uIGJvdGggdG8tYmUtY29tcGFjdGVkIGFuZCBvdGhlciBmaWxlCisJCSAqIGluZGV4ZXMgKGl4IGFuZCBpeG8pLgorCQkgKi8KKwkJaXhzID0gaXg7CisJCWZvciAoaXgrKzsgcmNoZ1tpeF07IGl4KyspOworCQlmb3IgKDsgcmNoZ29baXhvXTsgaXhvKyspOworCisJCWRvIHsKKwkJCWdycHNpeiA9IGl4IC0gaXhzOworCisJCQkvKgorCQkJICogSWYgdGhlIGxpbmUgYmVmb3JlIHRoZSBjdXJyZW50IGNoYW5nZSBncm91cCwgaXMgZXF1YWwgdG8KKwkJCSAqIHRoZSBsYXN0IGxpbmUgb2YgdGhlIGN1cnJlbnQgY2hhbmdlIGdyb3VwLCBzaGlmdCBiYWNrd2FyZAorCQkJICogdGhlIGdyb3VwLgorCQkJICovCisJCQl3aGlsZSAoaXhzID4gMCAmJiByZWNzW2l4cyAtIDFdLT5oYSA9PSByZWNzW2l4IC0gMV0tPmhhICYmCisJCQkgICAgICAgeGRsX3JlY21hdGNoKHJlY3NbaXhzIC0gMV0tPnB0ciwgcmVjc1tpeHMgLSAxXS0+c2l6ZSwgcmVjc1tpeCAtIDFdLT5wdHIsIHJlY3NbaXggLSAxXS0+c2l6ZSwgZmxhZ3MpKSB7CisJCQkJcmNoZ1stLWl4c10gPSAxOworCQkJCXJjaGdbLS1peF0gPSAwOworCisJCQkJLyoKKwkJCQkgKiBUaGlzIGNoYW5nZSBtaWdodCBoYXZlIGpvaW5lZCB0d28gY2hhbmdlIGdyb3VwcywKKwkJCQkgKiBzbyB3ZSB0cnkgdG8gdGFrZSB0aGlzIHNjZW5hcmlvIGluIGFjY291bnQgYnkgbW92aW5nCisJCQkJICogdGhlIHN0YXJ0IGluZGV4IGFjY29yZGluZ2x5IChhbmQgc28gdGhlIG90aGVyLWZpbGUKKwkJCQkgKiBlbmQtb2YtZ3JvdXAgaW5kZXgpLgorCQkJCSAqLworCQkJCWZvciAoOyByY2hnW2l4cyAtIDFdOyBpeHMtLSk7CisJCQkJd2hpbGUgKHJjaGdvWy0taXhvXSk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBSZWNvcmQgdGhlIGVuZC1vZi1ncm91cCBwb3NpdGlvbiBpbiBjYXNlIHdlIGFyZSBtYXRjaGVkCisJCQkgKiB3aXRoIGEgZ3JvdXAgb2YgY2hhbmdlcyBpbiB0aGUgb3RoZXIgZmlsZSAodGhhdCBpcywgdGhlCisJCQkgKiBjaGFuZ2UgcmVjb3JkIGJlZm9yZSB0aGUgZW5mLW9mLWdyb3VwIGluZGV4IGluIHRoZSBvdGhlcgorCQkJICogZmlsZSBpcyBzZXQpLgorCQkJICovCisJCQlpeHJlZiA9IHJjaGdvW2l4byAtIDFdID8gaXg6IG5yZWM7CisKKwkJCS8qCisJCQkgKiBJZiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgY3VycmVudCBjaGFuZ2UgZ3JvdXAsIGlzIGVxdWFsIHRvCisJCQkgKiB0aGUgbGluZSBuZXh0IG9mIHRoZSBjdXJyZW50IGNoYW5nZSBncm91cCwgc2hpZnQgZm9yd2FyZAorCQkJICogdGhlIGdyb3VwLgorCQkJICovCisJCQl3aGlsZSAoaXggPCBucmVjICYmIHJlY3NbaXhzXS0+aGEgPT0gcmVjc1tpeF0tPmhhICYmCisJCQkgICAgICAgeGRsX3JlY21hdGNoKHJlY3NbaXhzXS0+cHRyLCByZWNzW2l4c10tPnNpemUsIHJlY3NbaXhdLT5wdHIsIHJlY3NbaXhdLT5zaXplLCBmbGFncykpIHsKKwkJCQlyY2hnW2l4cysrXSA9IDA7CisJCQkJcmNoZ1tpeCsrXSA9IDE7CisKKwkJCQkvKgorCQkJCSAqIFRoaXMgY2hhbmdlIG1pZ2h0IGhhdmUgam9pbmVkIHR3byBjaGFuZ2UgZ3JvdXBzLAorCQkJCSAqIHNvIHdlIHRyeSB0byB0YWtlIHRoaXMgc2NlbmFyaW8gaW4gYWNjb3VudCBieSBtb3ZpbmcKKwkJCQkgKiB0aGUgc3RhcnQgaW5kZXggYWNjb3JkaW5nbHkgKGFuZCBzbyB0aGUgb3RoZXItZmlsZQorCQkJCSAqIGVuZC1vZi1ncm91cCBpbmRleCkuIEtlZXAgdHJhY2tpbmcgdGhlIHJlZmVyZW5jZQorCQkJCSAqIGluZGV4IGluIGNhc2Ugd2UgYXJlIHNoaWZ0aW5nIHRvZ2V0aGVyIHdpdGggYQorCQkJCSAqIGNvcnJlc3BvbmRpbmcgZ3JvdXAgb2YgY2hhbmdlcyBpbiB0aGUgb3RoZXIgZmlsZS4KKwkJCQkgKi8KKwkJCQlmb3IgKDsgcmNoZ1tpeF07IGl4KyspOworCQkJCXdoaWxlIChyY2hnb1srK2l4b10pCisJCQkJCWl4cmVmID0gaXg7CisJCQl9CisJCX0gd2hpbGUgKGdycHNpeiAhPSBpeCAtIGl4cyk7CisKKwkJLyoKKwkJICogVHJ5IHRvIG1vdmUgYmFjayB0aGUgcG9zc2libHkgbWVyZ2VkIGdyb3VwIG9mIGNoYW5nZXMsIHRvIG1hdGNoCisJCSAqIHRoZSByZWNvcmRlZCBwb3N0aW9uIGluIHRoZSBvdGhlciBmaWxlLgorCQkgKi8KKwkJd2hpbGUgKGl4cmVmIDwgaXgpIHsKKwkJCXJjaGdbLS1peHNdID0gMTsKKwkJCXJjaGdbLS1peF0gPSAwOworCQkJd2hpbGUgKHJjaGdvWy0taXhvXSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgeGRsX2J1aWxkX3NjcmlwdCh4ZGZlbnZfdCAqeGUsIHhkY2hhbmdlX3QgKip4c2NyKSB7CisJeGRjaGFuZ2VfdCAqY3NjciA9IE5VTEwsICp4Y2g7CisJY2hhciAqcmNoZzEgPSB4ZS0+eGRmMS5yY2hnLCAqcmNoZzIgPSB4ZS0+eGRmMi5yY2hnOworCWxvbmcgaTEsIGkyLCBsMSwgbDI7CisKKwkvKgorCSAqIFRyaXZpYWwuIENvbGxlY3RzICJncm91cHMiIG9mIGNoYW5nZXMgYW5kIGNyZWF0ZXMgYW4gZWRpdCBzY3JpcHQuCisJICovCisJZm9yIChpMSA9IHhlLT54ZGYxLm5yZWMsIGkyID0geGUtPnhkZjIubnJlYzsgaTEgPj0gMCB8fCBpMiA+PSAwOyBpMS0tLCBpMi0tKQorCQlpZiAocmNoZzFbaTEgLSAxXSB8fCByY2hnMltpMiAtIDFdKSB7CisJCQlmb3IgKGwxID0gaTE7IHJjaGcxW2kxIC0gMV07IGkxLS0pOworCQkJZm9yIChsMiA9IGkyOyByY2hnMltpMiAtIDFdOyBpMi0tKTsKKworCQkJaWYgKCEoeGNoID0geGRsX2FkZF9jaGFuZ2UoY3NjciwgaTEsIGkyLCBsMSAtIGkxLCBsMiAtIGkyKSkpIHsKKwkJCQl4ZGxfZnJlZV9zY3JpcHQoY3Njcik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJY3NjciA9IHhjaDsKKwkJfQorCisJKnhzY3IgPSBjc2NyOworCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCB4ZGxfZnJlZV9zY3JpcHQoeGRjaGFuZ2VfdCAqeHNjcikgeworCXhkY2hhbmdlX3QgKnhjaDsKKworCXdoaWxlICgoeGNoID0geHNjcikgIT0gTlVMTCkgeworCQl4c2NyID0geHNjci0+bmV4dDsKKwkJeGRsX2ZyZWUoeGNoKTsKKwl9Cit9CisKKworaW50IHhkbF9kaWZmKG1tZmlsZV90ICptZjEsIG1tZmlsZV90ICptZjIsIHhwcGFyYW1fdCBjb25zdCAqeHBwLAorCSAgICAgeGRlbWl0Y29uZl90IGNvbnN0ICp4ZWNmZywgeGRlbWl0Y2JfdCAqZWNiKSB7CisJeGRjaGFuZ2VfdCAqeHNjcjsKKwl4ZGZlbnZfdCB4ZTsKKworCWlmICh4ZGxfZG9fZGlmZihtZjEsIG1mMiwgeHBwLCAmeGUpIDwgMCkgeworCisJCXJldHVybiAtMTsKKwl9CisJaWYgKHhkbF9jaGFuZ2VfY29tcGFjdCgmeGUueGRmMSwgJnhlLnhkZjIsIHhwcC0+ZmxhZ3MpIDwgMCB8fAorCSAgICB4ZGxfY2hhbmdlX2NvbXBhY3QoJnhlLnhkZjIsICZ4ZS54ZGYxLCB4cHAtPmZsYWdzKSA8IDAgfHwKKwkgICAgeGRsX2J1aWxkX3NjcmlwdCgmeGUsICZ4c2NyKSA8IDApIHsKKworCQl4ZGxfZnJlZV9lbnYoJnhlKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoeHNjcikgeworCQlpZiAoeGRsX2VtaXRfZGlmZigmeGUsIHhzY3IsIGVjYiwgeGVjZmcpIDwgMCkgeworCisJCQl4ZGxfZnJlZV9zY3JpcHQoeHNjcik7CisJCQl4ZGxfZnJlZV9lbnYoJnhlKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQl4ZGxfZnJlZV9zY3JpcHQoeHNjcik7CisJfQorCXhkbF9mcmVlX2VudigmeGUpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS94ZGlmZi94ZGlmZmkuaCBiL3hkaWZmL3hkaWZmaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMDk5ZGMKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94ZGlmZmkuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogIExpYlhEaWZmIGJ5IERhdmlkZSBMaWJlbnppICggRmlsZSBEaWZmZXJlbnRpYWwgTGlicmFyeSApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzICBEYXZpZGUgTGliZW56aQorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogIERhdmlkZSBMaWJlbnppIDxkYXZpZGVsQHhtYWlsc2VydmVyLm9yZz4KKyAqCisgKi8KKworI2lmICFkZWZpbmVkKFhESUZGSV9IKQorI2RlZmluZSBYRElGRklfSAorCisKK3R5cGVkZWYgc3RydWN0IHNfZGlmZmRhdGEgeworCWxvbmcgbnJlYzsKKwl1bnNpZ25lZCBsb25nIGNvbnN0ICpoYTsKKwlsb25nICpyaW5kZXg7CisJY2hhciAqcmNoZzsKK30gZGlmZmRhdGFfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc194ZGFsZ29lbnYgeworCWxvbmcgbXhjb3N0OworCWxvbmcgc25ha2VfY250OworCWxvbmcgaGV1cl9taW47Cit9IHhkYWxnb2Vudl90OworCit0eXBlZGVmIHN0cnVjdCBzX3hkY2hhbmdlIHsKKwlzdHJ1Y3Qgc194ZGNoYW5nZSAqbmV4dDsKKwlsb25nIGkxLCBpMjsKKwlsb25nIGNoZzEsIGNoZzI7Cit9IHhkY2hhbmdlX3Q7CisKKworCitpbnQgeGRsX3JlY3NfY21wKGRpZmZkYXRhX3QgKmRkMSwgbG9uZyBvZmYxLCBsb25nIGxpbTEsCisJCSBkaWZmZGF0YV90ICpkZDIsIGxvbmcgb2ZmMiwgbG9uZyBsaW0yLAorCQkgbG9uZyAqa3ZkZiwgbG9uZyAqa3ZkYiwgaW50IG5lZWRfbWluLCB4ZGFsZ29lbnZfdCAqeGVudik7CitpbnQgeGRsX2RvX2RpZmYobW1maWxlX3QgKm1mMSwgbW1maWxlX3QgKm1mMiwgeHBwYXJhbV90IGNvbnN0ICp4cHAsCisJCXhkZmVudl90ICp4ZSk7CitpbnQgeGRsX2NoYW5nZV9jb21wYWN0KHhkZmlsZV90ICp4ZGYsIHhkZmlsZV90ICp4ZGZvLCBsb25nIGZsYWdzKTsKK2ludCB4ZGxfYnVpbGRfc2NyaXB0KHhkZmVudl90ICp4ZSwgeGRjaGFuZ2VfdCAqKnhzY3IpOwordm9pZCB4ZGxfZnJlZV9zY3JpcHQoeGRjaGFuZ2VfdCAqeHNjcik7CitpbnQgeGRsX2VtaXRfZGlmZih4ZGZlbnZfdCAqeGUsIHhkY2hhbmdlX3QgKnhzY3IsIHhkZW1pdGNiX3QgKmVjYiwKKwkJICB4ZGVtaXRjb25mX3QgY29uc3QgKnhlY2ZnKTsKKworI2VuZGlmIC8qICNpZiAhZGVmaW5lZChYRElGRklfSCkgKi8KZGlmZiAtLWdpdCBhL3hkaWZmL3hlbWl0LmMgYi94ZGlmZi94ZW1pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZDljODQKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94ZW1pdC5jCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogIExpYlhEaWZmIGJ5IERhdmlkZSBMaWJlbnppICggRmlsZSBEaWZmZXJlbnRpYWwgTGlicmFyeSApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzCURhdmlkZSBMaWJlbnppCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaW5jbHVkZSAieGluY2x1ZGUuaCIKKworCisKKworc3RhdGljIGxvbmcgeGRsX2dldF9yZWMoeGRmaWxlX3QgKnhkZiwgbG9uZyByaSwgY2hhciBjb25zdCAqKnJlYyk7CitzdGF0aWMgaW50IHhkbF9lbWl0X3JlY29yZCh4ZGZpbGVfdCAqeGRmLCBsb25nIHJpLCBjaGFyIGNvbnN0ICpwcmUsIHhkZW1pdGNiX3QgKmVjYik7CitzdGF0aWMgeGRjaGFuZ2VfdCAqeGRsX2dldF9odW5rKHhkY2hhbmdlX3QgKnhzY3IsIHhkZW1pdGNvbmZfdCBjb25zdCAqeGVjZmcpOworCisKKworCitzdGF0aWMgbG9uZyB4ZGxfZ2V0X3JlYyh4ZGZpbGVfdCAqeGRmLCBsb25nIHJpLCBjaGFyIGNvbnN0ICoqcmVjKSB7CisKKwkqcmVjID0geGRmLT5yZWNzW3JpXS0+cHRyOworCisJcmV0dXJuIHhkZi0+cmVjc1tyaV0tPnNpemU7Cit9CisKKworc3RhdGljIGludCB4ZGxfZW1pdF9yZWNvcmQoeGRmaWxlX3QgKnhkZiwgbG9uZyByaSwgY2hhciBjb25zdCAqcHJlLCB4ZGVtaXRjYl90ICplY2IpIHsKKwlsb25nIHNpemUsIHBzaXplID0gc3RybGVuKHByZSk7CisJY2hhciBjb25zdCAqcmVjOworCisJc2l6ZSA9IHhkbF9nZXRfcmVjKHhkZiwgcmksICZyZWMpOworCWlmICh4ZGxfZW1pdF9kaWZmcmVjKHJlYywgc2l6ZSwgcHJlLCBwc2l6ZSwgZWNiKSA8IDApIHsKKworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFN0YXJ0aW5nIGF0IHRoZSBwYXNzZWQgY2hhbmdlIGF0b20sIGZpbmQgdGhlIGxhdGVzdCBjaGFuZ2UgYXRvbSB0byBiZSBpbmNsdWRlZAorICogaW5zaWRlIHRoZSBkaWZmZXJlbnRpYWwgaHVuayBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uLgorICovCitzdGF0aWMgeGRjaGFuZ2VfdCAqeGRsX2dldF9odW5rKHhkY2hhbmdlX3QgKnhzY3IsIHhkZW1pdGNvbmZfdCBjb25zdCAqeGVjZmcpIHsKKwl4ZGNoYW5nZV90ICp4Y2gsICp4Y2hwOworCisJZm9yICh4Y2hwID0geHNjciwgeGNoID0geHNjci0+bmV4dDsgeGNoOyB4Y2hwID0geGNoLCB4Y2ggPSB4Y2gtPm5leHQpCisJCWlmICh4Y2gtPmkxIC0gKHhjaHAtPmkxICsgeGNocC0+Y2hnMSkgPiAyICogeGVjZmctPmN0eGxlbikKKwkJCWJyZWFrOworCisJcmV0dXJuIHhjaHA7Cit9CisKKworc3RhdGljIGxvbmcgZGVmX2ZmKGNvbnN0IGNoYXIgKnJlYywgbG9uZyBsZW4sIGNoYXIgKmJ1ZiwgbG9uZyBzeiwgdm9pZCAqcHJpdikKK3sKKwlpZiAobGVuID4gMCAmJgorCQkJKGlzYWxwaGEoKHVuc2lnbmVkIGNoYXIpKnJlYykgfHwgLyogaWRlbnRpZmllcj8gKi8KKwkJCSAqcmVjID09ICdfJyB8fAkvKiBhbHNvIGlkZW50aWZpZXI/ICovCisJCQkgKnJlYyA9PSAnJCcpKSB7IC8qIGlkZW50aWZpZXJzIGZyb20gVk1TIGFuZCBvdGhlciBlc290ZXJpY28gKi8KKwkJaWYgKGxlbiA+IHN6KQorCQkJbGVuID0gc3o7CisJCXdoaWxlICgwIDwgbGVuICYmIGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpcmVjW2xlbiAtIDFdKSkKKwkJCWxlbi0tOworCQltZW1jcHkoYnVmLCByZWMsIGxlbik7CisJCXJldHVybiBsZW47CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgeGRsX2ZpbmRfZnVuYyh4ZGZpbGVfdCAqeGYsIGxvbmcgaSwgY2hhciAqYnVmLCBsb25nIHN6LCBsb25nICpsbCwKKwkJZmluZF9mdW5jX3QgZmYsIHZvaWQgKmZmX3ByaXYpIHsKKworCS8qCisJICogQmUgcXVpdGUgc3R1cGlkIGFib3V0IHRoaXMgZm9yIG5vdy4gIEZpbmQgYSBsaW5lIGluIHRoZSBvbGQgZmlsZQorCSAqIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIGh1bmsgKGFuZCBjb250ZXh0KSB3aGljaCBzdGFydHMgd2l0aCBhCisJICogcGxhdXNpYmxlIGNoYXJhY3Rlci4KKwkgKi8KKworCWNvbnN0IGNoYXIgKnJlYzsKKwlsb25nIGxlbjsKKworCXdoaWxlIChpLS0gPiAwKSB7CisJCWxlbiA9IHhkbF9nZXRfcmVjKHhmLCBpLCAmcmVjKTsKKwkJaWYgKCgqbGwgPSBmZihyZWMsIGxlbiwgYnVmLCBzeiwgZmZfcHJpdikpID49IDApCisJCQlyZXR1cm47CisJfQorCSpsbCA9IDA7Cit9CisKKworc3RhdGljIGludCB4ZGxfZW1pdF9jb21tb24oeGRmZW52X3QgKnhlLCB4ZGNoYW5nZV90ICp4c2NyLCB4ZGVtaXRjYl90ICplY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZGVtaXRjb25mX3QgY29uc3QgKnhlY2ZnKSB7CisJeGRmaWxlX3QgKnhkZiA9ICZ4ZS0+eGRmMTsKKwljb25zdCBjaGFyICpyY2hnID0geGRmLT5yY2hnOworCWxvbmcgaXg7CisKKwlmb3IgKGl4ID0gMDsgaXggPCB4ZGYtPm5yZWM7IGl4KyspIHsKKwkJaWYgKHJjaGdbaXhdKQorCQkJY29udGludWU7CisJCWlmICh4ZGxfZW1pdF9yZWNvcmQoeGRmLCBpeCwgIiIsIGVjYikpCisJCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitpbnQgeGRsX2VtaXRfZGlmZih4ZGZlbnZfdCAqeGUsIHhkY2hhbmdlX3QgKnhzY3IsIHhkZW1pdGNiX3QgKmVjYiwKKwkJICB4ZGVtaXRjb25mX3QgY29uc3QgKnhlY2ZnKSB7CisJbG9uZyBzMSwgczIsIGUxLCBlMiwgbGN0eDsKKwl4ZGNoYW5nZV90ICp4Y2gsICp4Y2hlOworCWNoYXIgZnVuY2J1Zls4MF07CisJbG9uZyBmdW5jbGVuID0gMDsKKwlmaW5kX2Z1bmNfdCBmZiA9IHhlY2ZnLT5maW5kX2Z1bmMgPyAgeGVjZmctPmZpbmRfZnVuYyA6IGRlZl9mZjsKKworCWlmICh4ZWNmZy0+ZmxhZ3MgJiBYRExfRU1JVF9DT01NT04pCisJCXJldHVybiB4ZGxfZW1pdF9jb21tb24oeGUsIHhzY3IsIGVjYiwgeGVjZmcpOworCisJZm9yICh4Y2ggPSB4Y2hlID0geHNjcjsgeGNoOyB4Y2ggPSB4Y2hlLT5uZXh0KSB7CisJCXhjaGUgPSB4ZGxfZ2V0X2h1bmsoeGNoLCB4ZWNmZyk7CisKKwkJczEgPSBYRExfTUFYKHhjaC0+aTEgLSB4ZWNmZy0+Y3R4bGVuLCAwKTsKKwkJczIgPSBYRExfTUFYKHhjaC0+aTIgLSB4ZWNmZy0+Y3R4bGVuLCAwKTsKKworCQlsY3R4ID0geGVjZmctPmN0eGxlbjsKKwkJbGN0eCA9IFhETF9NSU4obGN0eCwgeGUtPnhkZjEubnJlYyAtICh4Y2hlLT5pMSArIHhjaGUtPmNoZzEpKTsKKwkJbGN0eCA9IFhETF9NSU4obGN0eCwgeGUtPnhkZjIubnJlYyAtICh4Y2hlLT5pMiArIHhjaGUtPmNoZzIpKTsKKworCQllMSA9IHhjaGUtPmkxICsgeGNoZS0+Y2hnMSArIGxjdHg7CisJCWUyID0geGNoZS0+aTIgKyB4Y2hlLT5jaGcyICsgbGN0eDsKKworCQkvKgorCQkgKiBFbWl0IGN1cnJlbnQgaHVuayBoZWFkZXIuCisJCSAqLworCisJCWlmICh4ZWNmZy0+ZmxhZ3MgJiBYRExfRU1JVF9GVU5DTkFNRVMpIHsKKwkJCXhkbF9maW5kX2Z1bmMoJnhlLT54ZGYxLCBzMSwgZnVuY2J1ZiwKKwkJCQkgICAgICBzaXplb2YoZnVuY2J1ZiksICZmdW5jbGVuLAorCQkJCSAgICAgIGZmLCB4ZWNmZy0+ZmluZF9mdW5jX3ByaXYpOworCQl9CisJCWlmICh4ZGxfZW1pdF9odW5rX2hkcihzMSArIDEsIGUxIC0gczEsIHMyICsgMSwgZTIgLSBzMiwKKwkJCQkgICAgICBmdW5jYnVmLCBmdW5jbGVuLCBlY2IpIDwgMCkKKwkJCXJldHVybiAtMTsKKworCQkvKgorCQkgKiBFbWl0IHByZS1jb250ZXh0LgorCQkgKi8KKwkJZm9yICg7IHMxIDwgeGNoLT5pMTsgczErKykKKwkJCWlmICh4ZGxfZW1pdF9yZWNvcmQoJnhlLT54ZGYxLCBzMSwgIiAiLCBlY2IpIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisKKwkJZm9yIChzMSA9IHhjaC0+aTEsIHMyID0geGNoLT5pMjs7IHhjaCA9IHhjaC0+bmV4dCkgeworCQkJLyoKKwkJCSAqIE1lcmdlIHByZXZpb3VzIHdpdGggY3VycmVudCBjaGFuZ2UgYXRvbS4KKwkJCSAqLworCQkJZm9yICg7IHMxIDwgeGNoLT5pMSAmJiBzMiA8IHhjaC0+aTI7IHMxKyssIHMyKyspCisJCQkJaWYgKHhkbF9lbWl0X3JlY29yZCgmeGUtPnhkZjEsIHMxLCAiICIsIGVjYikgPCAwKQorCQkJCQlyZXR1cm4gLTE7CisKKwkJCS8qCisJCQkgKiBSZW1vdmVzIGxpbmVzIGZyb20gdGhlIGZpcnN0IGZpbGUuCisJCQkgKi8KKwkJCWZvciAoczEgPSB4Y2gtPmkxOyBzMSA8IHhjaC0+aTEgKyB4Y2gtPmNoZzE7IHMxKyspCisJCQkJaWYgKHhkbF9lbWl0X3JlY29yZCgmeGUtPnhkZjEsIHMxLCAiLSIsIGVjYikgPCAwKQorCQkJCQlyZXR1cm4gLTE7CisKKwkJCS8qCisJCQkgKiBBZGRzIGxpbmVzIGZyb20gdGhlIHNlY29uZCBmaWxlLgorCQkJICovCisJCQlmb3IgKHMyID0geGNoLT5pMjsgczIgPCB4Y2gtPmkyICsgeGNoLT5jaGcyOyBzMisrKQorCQkJCWlmICh4ZGxfZW1pdF9yZWNvcmQoJnhlLT54ZGYyLCBzMiwgIisiLCBlY2IpIDwgMCkKKwkJCQkJcmV0dXJuIC0xOworCisJCQlpZiAoeGNoID09IHhjaGUpCisJCQkJYnJlYWs7CisJCQlzMSA9IHhjaC0+aTEgKyB4Y2gtPmNoZzE7CisJCQlzMiA9IHhjaC0+aTIgKyB4Y2gtPmNoZzI7CisJCX0KKworCQkvKgorCQkgKiBFbWl0IHBvc3QtY29udGV4dC4KKwkJICovCisJCWZvciAoczEgPSB4Y2hlLT5pMSArIHhjaGUtPmNoZzE7IHMxIDwgZTE7IHMxKyspCisJCQlpZiAoeGRsX2VtaXRfcmVjb3JkKCZ4ZS0+eGRmMSwgczEsICIgIiwgZWNiKSA8IDApCisJCQkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEveGRpZmYveGVtaXQuaCBiL3hkaWZmL3hlbWl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQwYTczOQotLS0gL2Rldi9udWxsCisrKyBiL3hkaWZmL3hlbWl0LmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqICBMaWJYRGlmZiBieSBEYXZpZGUgTGliZW56aSAoIEZpbGUgRGlmZmVyZW50aWFsIExpYnJhcnkgKQorICogIENvcHlyaWdodCAoQykgMjAwMyAgRGF2aWRlIExpYmVuemkKKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqICBEYXZpZGUgTGliZW56aSA8ZGF2aWRlbEB4bWFpbHNlcnZlci5vcmc+CisgKgorICovCisKKyNpZiAhZGVmaW5lZChYRU1JVF9IKQorI2RlZmluZSBYRU1JVF9ICisKKworCitpbnQgeGRsX2VtaXRfZGlmZih4ZGZlbnZfdCAqeGUsIHhkY2hhbmdlX3QgKnhzY3IsIHhkZW1pdGNiX3QgKmVjYiwKKwkJICB4ZGVtaXRjb25mX3QgY29uc3QgKnhlY2ZnKTsKKworCisKKyNlbmRpZiAvKiAjaWYgIWRlZmluZWQoWEVNSVRfSCkgKi8KZGlmZiAtLWdpdCBhL3hkaWZmL3hpbmNsdWRlLmggYi94ZGlmZi94aW5jbHVkZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNmNjYjMKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94aW5jbHVkZS5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiAgTGliWERpZmYgYnkgRGF2aWRlIExpYmVuemkgKCBGaWxlIERpZmZlcmVudGlhbCBMaWJyYXJ5ICkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgIERhdmlkZSBMaWJlbnppCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaWYgIWRlZmluZWQoWElOQ0xVREVfSCkKKyNkZWZpbmUgWElOQ0xVREVfSAorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSAieG1hY3Jvcy5oIgorI2luY2x1ZGUgInhkaWZmLmgiCisjaW5jbHVkZSAieHR5cGVzLmgiCisjaW5jbHVkZSAieHV0aWxzLmgiCisjaW5jbHVkZSAieHByZXBhcmUuaCIKKyNpbmNsdWRlICJ4ZGlmZmkuaCIKKyNpbmNsdWRlICJ4ZW1pdC5oIgorCisKKyNlbmRpZiAvKiAjaWYgIWRlZmluZWQoWElOQ0xVREVfSCkgKi8KZGlmZiAtLWdpdCBhL3hkaWZmL3htYWNyb3MuaCBiL3hkaWZmL3htYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWYyMzJjCi0tLSAvZGV2L251bGwKKysrIGIveGRpZmYveG1hY3Jvcy5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiAgTGliWERpZmYgYnkgRGF2aWRlIExpYmVuemkgKCBGaWxlIERpZmZlcmVudGlhbCBMaWJyYXJ5ICkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgIERhdmlkZSBMaWJlbnppCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaWYgIWRlZmluZWQoWE1BQ1JPU19IKQorI2RlZmluZSBYTUFDUk9TX0gKKworCisKKworI2RlZmluZSBYRExfTUlOKGEsIGIpICgoYSkgPCAoYikgPyAoYSk6IChiKSkKKyNkZWZpbmUgWERMX01BWChhLCBiKSAoKGEpID4gKGIpID8gKGEpOiAoYikpCisjZGVmaW5lIFhETF9BQlModikgKCh2KSA+PSAwID8gKHYpOiAtKHYpKQorI2RlZmluZSBYRExfSVNESUdJVChjKSAoKGMpID49ICcwJyAmJiAoYykgPD0gJzknKQorI2RlZmluZSBYRExfQUREQklUUyh2LGIpCSgodikgKyAoKHYpID4+IChiKSkpCisjZGVmaW5lIFhETF9NQVNLQklUUyhiKQkJKCgxVUwgPDwgKGIpKSAtIDEpCisjZGVmaW5lIFhETF9IQVNITE9ORyh2LGIpCShYRExfQUREQklUUygodW5zaWduZWQgbG9uZykodiksIGIpICYgWERMX01BU0tCSVRTKGIpKQorI2RlZmluZSBYRExfUFRSRlJFRShwKSBkbyB7IGlmIChwKSB7IHhkbF9mcmVlKHApOyAocCkgPSBOVUxMOyB9IH0gd2hpbGUgKDApCisjZGVmaW5lIFhETF9MRTMyX1BVVChwLCB2KSBcCitkbyB7IFwKKwl1bnNpZ25lZCBjaGFyICpfX3AgPSAodW5zaWduZWQgY2hhciAqKSAocCk7IFwKKwkqX19wKysgPSAodW5zaWduZWQgY2hhcikgKHYpOyBcCisJKl9fcCsrID0gKHVuc2lnbmVkIGNoYXIpICgodikgPj4gOCk7IFwKKwkqX19wKysgPSAodW5zaWduZWQgY2hhcikgKCh2KSA+PiAxNik7IFwKKwkqX19wID0gKHVuc2lnbmVkIGNoYXIpICgodikgPj4gMjQpOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBYRExfTEUzMl9HRVQocCwgdikgXAorZG8geyBcCisJdW5zaWduZWQgY2hhciBjb25zdCAqX19wID0gKHVuc2lnbmVkIGNoYXIgY29uc3QgKikgKHApOyBcCisJKHYpID0gKHVuc2lnbmVkIGxvbmcpIF9fcFswXSB8ICgodW5zaWduZWQgbG9uZykgX19wWzFdKSA8PCA4IHwgXAorCQkoKHVuc2lnbmVkIGxvbmcpIF9fcFsyXSkgPDwgMTYgfCAoKHVuc2lnbmVkIGxvbmcpIF9fcFszXSkgPDwgMjQ7IFwKK30gd2hpbGUgKDApCisKKworI2VuZGlmIC8qICNpZiAhZGVmaW5lZChYTUFDUk9TX0gpICovCmRpZmYgLS1naXQgYS94ZGlmZi94bWVyZ2UuYyBiL3hkaWZmL3htZXJnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYjM1NzMKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94bWVyZ2UuYwpAQCAtMCwwICsxLDQ5NCBAQAorLyoKKyAqICBMaWJYRGlmZiBieSBEYXZpZGUgTGliZW56aSAoIEZpbGUgRGlmZmVyZW50aWFsIExpYnJhcnkgKQorICogIENvcHlyaWdodCAoQykgMjAwMy0yMDA2IERhdmlkZSBMaWJlbnppLCBKb2hhbm5lcyBFLiBTY2hpbmRlbGluCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaW5jbHVkZSAieGluY2x1ZGUuaCIKKwordHlwZWRlZiBzdHJ1Y3Qgc194ZG1lcmdlIHsKKwlzdHJ1Y3Qgc194ZG1lcmdlICpuZXh0OworCS8qCisJICogMCA9IGNvbmZsaWN0LAorCSAqIDEgPSBubyBjb25mbGljdCwgdGFrZSBmaXJzdCwKKwkgKiAyID0gbm8gY29uZmxpY3QsIHRha2Ugc2Vjb25kLgorCSAqLworCWludCBtb2RlOworCWxvbmcgaTEsIGkyOworCWxvbmcgY2hnMSwgY2hnMjsKK30geGRtZXJnZV90OworCitzdGF0aWMgaW50IHhkbF9hcHBlbmRfbWVyZ2UoeGRtZXJnZV90ICoqbWVyZ2UsIGludCBtb2RlLAorCQlsb25nIGkxLCBsb25nIGNoZzEsIGxvbmcgaTIsIGxvbmcgY2hnMikKK3sKKwl4ZG1lcmdlX3QgKm0gPSAqbWVyZ2U7CisJaWYgKG0gJiYgKGkxIDw9IG0tPmkxICsgbS0+Y2hnMSB8fCBpMiA8PSBtLT5pMiArIG0tPmNoZzIpKSB7CisJCWlmIChtb2RlICE9IG0tPm1vZGUpCisJCQltLT5tb2RlID0gMDsKKwkJbS0+Y2hnMSA9IGkxICsgY2hnMSAtIG0tPmkxOworCQltLT5jaGcyID0gaTIgKyBjaGcyIC0gbS0+aTI7CisJfSBlbHNlIHsKKwkJbSA9IHhkbF9tYWxsb2Moc2l6ZW9mKHhkbWVyZ2VfdCkpOworCQlpZiAoIW0pCisJCQlyZXR1cm4gLTE7CisJCW0tPm5leHQgPSBOVUxMOworCQltLT5tb2RlID0gbW9kZTsKKwkJbS0+aTEgPSBpMTsKKwkJbS0+Y2hnMSA9IGNoZzE7CisJCW0tPmkyID0gaTI7CisJCW0tPmNoZzIgPSBjaGcyOworCQlpZiAoKm1lcmdlKQorCQkJKCptZXJnZSktPm5leHQgPSBtOworCQkqbWVyZ2UgPSBtOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4ZGxfY2xlYW51cF9tZXJnZSh4ZG1lcmdlX3QgKmMpCit7CisJaW50IGNvdW50ID0gMDsKKwl4ZG1lcmdlX3QgKm5leHRfYzsKKworCS8qIHdlcmUgdGhlcmUgY29uZmxpY3RzPyAqLworCWZvciAoOyBjOyBjID0gbmV4dF9jKSB7CisJCWlmIChjLT5tb2RlID09IDApCisJCQljb3VudCsrOworCQluZXh0X2MgPSBjLT5uZXh0OworCQlmcmVlKGMpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgeGRsX21lcmdlX2NtcF9saW5lcyh4ZGZlbnZfdCAqeGUxLCBpbnQgaTEsIHhkZmVudl90ICp4ZTIsIGludCBpMiwKKwkJaW50IGxpbmVfY291bnQsIGxvbmcgZmxhZ3MpCit7CisJaW50IGk7CisJeHJlY29yZF90ICoqcmVjMSA9IHhlMS0+eGRmMi5yZWNzICsgaTE7CisJeHJlY29yZF90ICoqcmVjMiA9IHhlMi0+eGRmMi5yZWNzICsgaTI7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGluZV9jb3VudDsgaSsrKSB7CisJCWludCByZXN1bHQgPSB4ZGxfcmVjbWF0Y2gocmVjMVtpXS0+cHRyLCByZWMxW2ldLT5zaXplLAorCQkJcmVjMltpXS0+cHRyLCByZWMyW2ldLT5zaXplLCBmbGFncyk7CisJCWlmICghcmVzdWx0KQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4ZGxfcmVjc19jb3B5KHhkZmVudl90ICp4ZSwgaW50IGksIGludCBjb3VudCwgaW50IGFkZF9ubCwgY2hhciAqZGVzdCkKK3sKKwl4cmVjb3JkX3QgKipyZWNzID0geGUtPnhkZjIucmVjcyArIGk7CisJaW50IHNpemUgPSAwOworCisJaWYgKGNvdW50IDwgMSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IHNpemUgKz0gcmVjc1tpKytdLT5zaXplKQorCQlpZiAoZGVzdCkKKwkJCW1lbWNweShkZXN0ICsgc2l6ZSwgcmVjc1tpXS0+cHRyLCByZWNzW2ldLT5zaXplKTsKKwlpZiAoYWRkX25sKSB7CisJCWkgPSByZWNzW2NvdW50IC0gMV0tPnNpemU7CisJCWlmIChpID09IDAgfHwgcmVjc1tjb3VudCAtIDFdLT5wdHJbaSAtIDFdICE9ICdcbicpIHsKKwkJCWlmIChkZXN0KQorCQkJCWRlc3Rbc2l6ZV0gPSAnXG4nOworCQkJc2l6ZSsrOworCQl9CisJfQorCXJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IHhkbF9maWxsX21lcmdlX2J1ZmZlcih4ZGZlbnZfdCAqeGUxLCBjb25zdCBjaGFyICpuYW1lMSwKKwkJeGRmZW52X3QgKnhlMiwgY29uc3QgY2hhciAqbmFtZTIsIHhkbWVyZ2VfdCAqbSwgY2hhciAqZGVzdCkKK3sKKwljb25zdCBpbnQgbWFya2VyX3NpemUgPSA3OworCWludCBtYXJrZXIxX3NpemUgPSAobmFtZTEgPyBzdHJsZW4obmFtZTEpICsgMSA6IDApOworCWludCBtYXJrZXIyX3NpemUgPSAobmFtZTIgPyBzdHJsZW4obmFtZTIpICsgMSA6IDApOworCWludCBjb25mbGljdF9tYXJrZXJfc2l6ZSA9IDMgKiAobWFya2VyX3NpemUgKyAxKQorCQkrIG1hcmtlcjFfc2l6ZSArIG1hcmtlcjJfc2l6ZTsKKwlpbnQgc2l6ZSwgaTEsIGo7CisKKwlmb3IgKHNpemUgPSBpMSA9IDA7IG07IG0gPSBtLT5uZXh0KSB7CisJCWlmIChtLT5tb2RlID09IDApIHsKKwkJCXNpemUgKz0geGRsX3JlY3NfY29weSh4ZTEsIGkxLCBtLT5pMSAtIGkxLCAwLAorCQkJCQlkZXN0ID8gZGVzdCArIHNpemUgOiBOVUxMKTsKKwkJCWlmIChkZXN0KSB7CisJCQkJZm9yIChqID0gMDsgaiA8IG1hcmtlcl9zaXplOyBqKyspCisJCQkJCWRlc3Rbc2l6ZSsrXSA9ICc8JzsKKwkJCQlpZiAobWFya2VyMV9zaXplKSB7CisJCQkJCWRlc3Rbc2l6ZV0gPSAnICc7CisJCQkJCW1lbWNweShkZXN0ICsgc2l6ZSArIDEsIG5hbWUxLAorCQkJCQkJCW1hcmtlcjFfc2l6ZSAtIDEpOworCQkJCQlzaXplICs9IG1hcmtlcjFfc2l6ZTsKKwkJCQl9CisJCQkJZGVzdFtzaXplKytdID0gJ1xuJzsKKwkJCX0gZWxzZQorCQkJCXNpemUgKz0gY29uZmxpY3RfbWFya2VyX3NpemU7CisJCQlzaXplICs9IHhkbF9yZWNzX2NvcHkoeGUxLCBtLT5pMSwgbS0+Y2hnMSwgMSwKKwkJCQkJZGVzdCA/IGRlc3QgKyBzaXplIDogTlVMTCk7CisJCQlpZiAoZGVzdCkgeworCQkJCWZvciAoaiA9IDA7IGogPCBtYXJrZXJfc2l6ZTsgaisrKQorCQkJCQlkZXN0W3NpemUrK10gPSAnPSc7CisJCQkJZGVzdFtzaXplKytdID0gJ1xuJzsKKwkJCX0KKwkJCXNpemUgKz0geGRsX3JlY3NfY29weSh4ZTIsIG0tPmkyLCBtLT5jaGcyLCAxLAorCQkJCQlkZXN0ID8gZGVzdCArIHNpemUgOiBOVUxMKTsKKwkJCWlmIChkZXN0KSB7CisJCQkJZm9yIChqID0gMDsgaiA8IG1hcmtlcl9zaXplOyBqKyspCisJCQkJCWRlc3Rbc2l6ZSsrXSA9ICc+JzsKKwkJCQlpZiAobWFya2VyMl9zaXplKSB7CisJCQkJCWRlc3Rbc2l6ZV0gPSAnICc7CisJCQkJCW1lbWNweShkZXN0ICsgc2l6ZSArIDEsIG5hbWUyLAorCQkJCQkJCW1hcmtlcjJfc2l6ZSAtIDEpOworCQkJCQlzaXplICs9IG1hcmtlcjJfc2l6ZTsKKwkJCQl9CisJCQkJZGVzdFtzaXplKytdID0gJ1xuJzsKKwkJCX0KKwkJfSBlbHNlIGlmIChtLT5tb2RlID09IDEpCisJCQlzaXplICs9IHhkbF9yZWNzX2NvcHkoeGUxLCBpMSwgbS0+aTEgKyBtLT5jaGcxIC0gaTEsIDAsCisJCQkJCWRlc3QgPyBkZXN0ICsgc2l6ZSA6IE5VTEwpOworCQllbHNlIGlmIChtLT5tb2RlID09IDIpCisJCQlzaXplICs9IHhkbF9yZWNzX2NvcHkoeGUyLCBtLT5pMiAtIG0tPmkxICsgaTEsCisJCQkJCW0tPmkxICsgbS0+Y2hnMiAtIGkxLCAwLAorCQkJCQlkZXN0ID8gZGVzdCArIHNpemUgOiBOVUxMKTsKKwkJZWxzZQorCQkJY29udGludWU7CisJCWkxID0gbS0+aTEgKyBtLT5jaGcxOworCX0KKwlzaXplICs9IHhkbF9yZWNzX2NvcHkoeGUxLCBpMSwgeGUxLT54ZGYyLm5yZWMgLSBpMSwgMCwKKwkJCWRlc3QgPyBkZXN0ICsgc2l6ZSA6IE5VTEwpOworCXJldHVybiBzaXplOworfQorCisvKgorICogU29tZXRpbWVzLCBjaGFuZ2VzIGFyZSBub3QgcXVpdGUgaWRlbnRpY2FsLCBidXQgZGlmZmVyIGluIG9ubHkgYSBmZXcKKyAqIGxpbmVzLiBUcnkgaGFyZCB0byBzaG93IG9ubHkgdGhlc2UgZmV3IGxpbmVzIGFzIGNvbmZsaWN0aW5nLgorICovCitzdGF0aWMgaW50IHhkbF9yZWZpbmVfY29uZmxpY3RzKHhkZmVudl90ICp4ZTEsIHhkZmVudl90ICp4ZTIsIHhkbWVyZ2VfdCAqbSwKKwkJeHBwYXJhbV90IGNvbnN0ICp4cHApCit7CisJZm9yICg7IG07IG0gPSBtLT5uZXh0KSB7CisJCW1tZmlsZV90IHQxLCB0MjsKKwkJeGRmZW52X3QgeGU7CisJCXhkY2hhbmdlX3QgKnhzY3IsICp4OworCQlpbnQgaTEgPSBtLT5pMSwgaTIgPSBtLT5pMjsKKworCQkvKiBsZXQncyBoYW5kbGUganVzdCB0aGUgY29uZmxpY3RzICovCisJCWlmIChtLT5tb2RlKQorCQkJY29udGludWU7CisKKwkJLyogbm8gc2Vuc2UgcmVmaW5pbmcgYSBjb25mbGljdCB3aGVuIG9uZSBzaWRlIGlzIGVtcHR5ICovCisJCWlmIChtLT5jaGcxID09IDAgfHwgbS0+Y2hnMiA9PSAwKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogVGhpcyBwcm9iYWJseSBkb2VzIG5vdCB3b3JrIG91dHNpZGUgZ2l0LCBzaW5jZQorCQkgKiB3ZSBoYXZlIGEgdmVyeSBzaW1wbGUgbW1maWxlIHN0cnVjdHVyZS4KKwkJICovCisJCXQxLnB0ciA9IChjaGFyICopeGUxLT54ZGYyLnJlY3NbbS0+aTFdLT5wdHI7CisJCXQxLnNpemUgPSB4ZTEtPnhkZjIucmVjc1ttLT5pMSArIG0tPmNoZzEgLSAxXS0+cHRyCisJCQkrIHhlMS0+eGRmMi5yZWNzW20tPmkxICsgbS0+Y2hnMSAtIDFdLT5zaXplIC0gdDEucHRyOworCQl0Mi5wdHIgPSAoY2hhciAqKXhlMi0+eGRmMi5yZWNzW20tPmkyXS0+cHRyOworCQl0Mi5zaXplID0geGUyLT54ZGYyLnJlY3NbbS0+aTIgKyBtLT5jaGcyIC0gMV0tPnB0cgorCQkJKyB4ZTItPnhkZjIucmVjc1ttLT5pMiArIG0tPmNoZzIgLSAxXS0+c2l6ZSAtIHQyLnB0cjsKKwkJaWYgKHhkbF9kb19kaWZmKCZ0MSwgJnQyLCB4cHAsICZ4ZSkgPCAwKQorCQkJcmV0dXJuIC0xOworCQlpZiAoeGRsX2NoYW5nZV9jb21wYWN0KCZ4ZS54ZGYxLCAmeGUueGRmMiwgeHBwLT5mbGFncykgPCAwIHx8CisJCSAgICB4ZGxfY2hhbmdlX2NvbXBhY3QoJnhlLnhkZjIsICZ4ZS54ZGYxLCB4cHAtPmZsYWdzKSA8IDAgfHwKKwkJICAgIHhkbF9idWlsZF9zY3JpcHQoJnhlLCAmeHNjcikgPCAwKSB7CisJCQl4ZGxfZnJlZV9lbnYoJnhlKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoIXhzY3IpIHsKKwkJCS8qIElmIHRoaXMgaGFwcGVucywgdGhlIGNoYW5nZXMgYXJlIGlkZW50aWNhbC4gKi8KKwkJCXhkbF9mcmVlX2VudigmeGUpOworCQkJbS0+bW9kZSA9IDQ7CisJCQljb250aW51ZTsKKwkJfQorCQl4ID0geHNjcjsKKwkJbS0+aTEgPSB4c2NyLT5pMSArIGkxOworCQltLT5jaGcxID0geHNjci0+Y2hnMTsKKwkJbS0+aTIgPSB4c2NyLT5pMiArIGkyOworCQltLT5jaGcyID0geHNjci0+Y2hnMjsKKwkJd2hpbGUgKHhzY3ItPm5leHQpIHsKKwkJCXhkbWVyZ2VfdCAqbTIgPSB4ZGxfbWFsbG9jKHNpemVvZih4ZG1lcmdlX3QpKTsKKwkJCWlmICghbTIpIHsKKwkJCQl4ZGxfZnJlZV9lbnYoJnhlKTsKKwkJCQl4ZGxfZnJlZV9zY3JpcHQoeCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJeHNjciA9IHhzY3ItPm5leHQ7CisJCQltMi0+bmV4dCA9IG0tPm5leHQ7CisJCQltLT5uZXh0ID0gbTI7CisJCQltID0gbTI7CisJCQltLT5tb2RlID0gMDsKKwkJCW0tPmkxID0geHNjci0+aTEgKyBpMTsKKwkJCW0tPmNoZzEgPSB4c2NyLT5jaGcxOworCQkJbS0+aTIgPSB4c2NyLT5pMiArIGkyOworCQkJbS0+Y2hnMiA9IHhzY3ItPmNoZzI7CisJCX0KKwkJeGRsX2ZyZWVfZW52KCZ4ZSk7CisJCXhkbF9mcmVlX3NjcmlwdCh4KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGluZV9jb250YWluc19hbG51bShjb25zdCBjaGFyICpwdHIsIGxvbmcgc2l6ZSkKK3sKKwl3aGlsZSAoc2l6ZS0tKQorCQlpZiAoaXNhbG51bSgqKHB0cisrKSkpCisJCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsaW5lc19jb250YWluX2FsbnVtKHhkZmVudl90ICp4ZSwgaW50IGksIGludCBjaGcpCit7CisJZm9yICg7IGNoZzsgY2hnLS0sIGkrKykKKwkJaWYgKGxpbmVfY29udGFpbnNfYWxudW0oeGUtPnhkZjIucmVjc1tpXS0+cHRyLAorCQkJCXhlLT54ZGYyLnJlY3NbaV0tPnNpemUpKQorCQkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIG1lcmdlcyBtIGFuZCBtLT5uZXh0LCBtYXJraW5nIGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aG9zZSBodW5rcworICogYXMgY29uZmxpY3RpbmcsIHRvby4KKyAqLworc3RhdGljIHZvaWQgeGRsX21lcmdlX3R3b19jb25mbGljdHMoeGRtZXJnZV90ICptKQoreworCXhkbWVyZ2VfdCAqbmV4dF9tID0gbS0+bmV4dDsKKwltLT5jaGcxID0gbmV4dF9tLT5pMSArIG5leHRfbS0+Y2hnMSAtIG0tPmkxOworCW0tPmNoZzIgPSBuZXh0X20tPmkyICsgbmV4dF9tLT5jaGcyIC0gbS0+aTI7CisJbS0+bmV4dCA9IG5leHRfbS0+bmV4dDsKKwlmcmVlKG5leHRfbSk7Cit9CisKKy8qCisgKiBJZiB0aGVyZSBhcmUgbGVzcyB0aGFuIDMgbm9uLWNvbmZsaWN0aW5nIGxpbmVzIGJldHdlZW4gY29uZmxpY3RzLAorICogaXQgYXBwZWFycyBzaW1wbGVyIC0tIGJlY2F1c2UgaXQgdGFrZXMgdXAgbGVzcyAob3IgYXMgbWFueSkgbGluZXMgLS0KKyAqIGlmIHRoZSBsaW5lcyBhcmUgbW92ZWQgaW50byB0aGUgY29uZmxpY3RzLgorICovCitzdGF0aWMgaW50IHhkbF9zaW1wbGlmeV9ub25fY29uZmxpY3RzKHhkZmVudl90ICp4ZTEsIHhkbWVyZ2VfdCAqbSwKKwkJCQkgICAgICBpbnQgc2ltcGxpZnlfaWZfbm9fYWxudW0pCit7CisJaW50IHJlc3VsdCA9IDA7CisKKwlpZiAoIW0pCisJCXJldHVybiByZXN1bHQ7CisJZm9yICg7OykgeworCQl4ZG1lcmdlX3QgKm5leHRfbSA9IG0tPm5leHQ7CisJCWludCBiZWdpbiwgZW5kOworCisJCWlmICghbmV4dF9tKQorCQkJcmV0dXJuIHJlc3VsdDsKKworCQliZWdpbiA9IG0tPmkxICsgbS0+Y2hnMTsKKwkJZW5kID0gbmV4dF9tLT5pMTsKKworCQlpZiAobS0+bW9kZSAhPSAwIHx8IG5leHRfbS0+bW9kZSAhPSAwIHx8CisJCSAgICAoZW5kIC0gYmVnaW4gPiAzICYmCisJCSAgICAgKCFzaW1wbGlmeV9pZl9ub19hbG51bSB8fAorCQkgICAgICBsaW5lc19jb250YWluX2FsbnVtKHhlMSwgYmVnaW4sIGVuZCAtIGJlZ2luKSkpKSB7CisJCQltID0gbmV4dF9tOworCQl9IGVsc2UgeworCQkJcmVzdWx0Kys7CisJCQl4ZGxfbWVyZ2VfdHdvX2NvbmZsaWN0cyhtKTsKKwkJfQorCX0KK30KKworLyoKKyAqIGxldmVsID09IDA6IG1hcmsgYWxsIG92ZXJsYXBwaW5nIGNoYW5nZXMgYXMgY29uZmxpY3QKKyAqIGxldmVsID09IDE6IG1hcmsgb3ZlcmxhcHBpbmcgY2hhbmdlcyBhcyBjb25mbGljdCBvbmx5IGlmIG5vdCBpZGVudGljYWwKKyAqIGxldmVsID09IDI6IGFuYWx5emUgbm9uLWlkZW50aWNhbCBjaGFuZ2VzIGZvciBtaW5pbWFsIGNvbmZsaWN0IHNldAorICogbGV2ZWwgPT0gMzogYW5hbHl6ZSBub24taWRlbnRpY2FsIGNoYW5nZXMgZm9yIG1pbmltYWwgY29uZmxpY3Qgc2V0LCBidXQKKyAqICAgICAgICAgICAgIHRyZWF0IGh1bmtzIG5vdCBjb250YWluaW5nIGFueSBsZXR0ZXIgb3IgbnVtYmVyIGFzIGNvbmZsaWN0aW5nCisgKgorICogcmV0dXJucyA8IDAgb24gZXJyb3IsID09IDAgZm9yIG5vIGNvbmZsaWN0cywgZWxzZSBudW1iZXIgb2YgY29uZmxpY3RzCisgKi8KK3N0YXRpYyBpbnQgeGRsX2RvX21lcmdlKHhkZmVudl90ICp4ZTEsIHhkY2hhbmdlX3QgKnhzY3IxLCBjb25zdCBjaGFyICpuYW1lMSwKKwkJeGRmZW52X3QgKnhlMiwgeGRjaGFuZ2VfdCAqeHNjcjIsIGNvbnN0IGNoYXIgKm5hbWUyLAorCQlpbnQgbGV2ZWwsIHhwcGFyYW1fdCBjb25zdCAqeHBwLCBtbWJ1ZmZlcl90ICpyZXN1bHQpIHsKKwl4ZG1lcmdlX3QgKmNoYW5nZXMsICpjOworCWludCBpMSwgaTIsIGNoZzEsIGNoZzI7CisKKwljID0gY2hhbmdlcyA9IE5VTEw7CisKKwl3aGlsZSAoeHNjcjEgJiYgeHNjcjIpIHsKKwkJaWYgKCFjaGFuZ2VzKQorCQkJY2hhbmdlcyA9IGM7CisJCWlmICh4c2NyMS0+aTEgKyB4c2NyMS0+Y2hnMSA8IHhzY3IyLT5pMSkgeworCQkJaTEgPSB4c2NyMS0+aTI7CisJCQlpMiA9IHhzY3IyLT5pMiAtIHhzY3IyLT5pMSArIHhzY3IxLT5pMTsKKwkJCWNoZzEgPSB4c2NyMS0+Y2hnMjsKKwkJCWNoZzIgPSB4c2NyMS0+Y2hnMTsKKwkJCWlmICh4ZGxfYXBwZW5kX21lcmdlKCZjLCAxLCBpMSwgY2hnMSwgaTIsIGNoZzIpKSB7CisJCQkJeGRsX2NsZWFudXBfbWVyZ2UoY2hhbmdlcyk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJeHNjcjEgPSB4c2NyMS0+bmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICh4c2NyMi0+aTEgKyB4c2NyMi0+Y2hnMSA8IHhzY3IxLT5pMSkgeworCQkJaTEgPSB4c2NyMS0+aTIgLSB4c2NyMS0+aTEgKyB4c2NyMi0+aTE7CisJCQlpMiA9IHhzY3IyLT5pMjsKKwkJCWNoZzEgPSB4c2NyMi0+Y2hnMTsKKwkJCWNoZzIgPSB4c2NyMi0+Y2hnMjsKKwkJCWlmICh4ZGxfYXBwZW5kX21lcmdlKCZjLCAyLCBpMSwgY2hnMSwgaTIsIGNoZzIpKSB7CisJCQkJeGRsX2NsZWFudXBfbWVyZ2UoY2hhbmdlcyk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJeHNjcjIgPSB4c2NyMi0+bmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChsZXZlbCA8IDEgfHwgeHNjcjEtPmkxICE9IHhzY3IyLT5pMSB8fAorCQkJCXhzY3IxLT5jaGcxICE9IHhzY3IyLT5jaGcxIHx8CisJCQkJeHNjcjEtPmNoZzIgIT0geHNjcjItPmNoZzIgfHwKKwkJCQl4ZGxfbWVyZ2VfY21wX2xpbmVzKHhlMSwgeHNjcjEtPmkyLAorCQkJCQl4ZTIsIHhzY3IyLT5pMiwKKwkJCQkJeHNjcjEtPmNoZzIsIHhwcC0+ZmxhZ3MpKSB7CisJCQkvKiBjb25mbGljdCAqLworCQkJaW50IG9mZiA9IHhzY3IxLT5pMSAtIHhzY3IyLT5pMTsKKwkJCWludCBmZm8gPSBvZmYgKyB4c2NyMS0+Y2hnMSAtIHhzY3IyLT5jaGcxOworCisJCQlpMSA9IHhzY3IxLT5pMjsKKwkJCWkyID0geHNjcjItPmkyOworCQkJaWYgKG9mZiA+IDApCisJCQkJaTEgLT0gb2ZmOworCQkJZWxzZQorCQkJCWkyICs9IG9mZjsKKwkJCWNoZzEgPSB4c2NyMS0+aTIgKyB4c2NyMS0+Y2hnMiAtIGkxOworCQkJY2hnMiA9IHhzY3IyLT5pMiArIHhzY3IyLT5jaGcyIC0gaTI7CisJCQlpZiAoZmZvID4gMCkKKwkJCQljaGcyICs9IGZmbzsKKwkJCWVsc2UKKwkJCQljaGcxIC09IGZmbzsKKwkJCWlmICh4ZGxfYXBwZW5kX21lcmdlKCZjLCAwLCBpMSwgY2hnMSwgaTIsIGNoZzIpKSB7CisJCQkJeGRsX2NsZWFudXBfbWVyZ2UoY2hhbmdlcyk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisKKwkJaTEgPSB4c2NyMS0+aTEgKyB4c2NyMS0+Y2hnMTsKKwkJaTIgPSB4c2NyMi0+aTEgKyB4c2NyMi0+Y2hnMTsKKworCQlpZiAoaTEgPj0gaTIpCisJCQl4c2NyMiA9IHhzY3IyLT5uZXh0OworCQlpZiAoaTIgPj0gaTEpCisJCQl4c2NyMSA9IHhzY3IxLT5uZXh0OworCX0KKwl3aGlsZSAoeHNjcjEpIHsKKwkJaWYgKCFjaGFuZ2VzKQorCQkJY2hhbmdlcyA9IGM7CisJCWkxID0geHNjcjEtPmkyOworCQlpMiA9IHhzY3IxLT5pMSArIHhlMi0+eGRmMi5ucmVjIC0geGUyLT54ZGYxLm5yZWM7CisJCWNoZzEgPSB4c2NyMS0+Y2hnMjsKKwkJY2hnMiA9IHhzY3IxLT5jaGcxOworCQlpZiAoeGRsX2FwcGVuZF9tZXJnZSgmYywgMSwgaTEsIGNoZzEsIGkyLCBjaGcyKSkgeworCQkJeGRsX2NsZWFudXBfbWVyZ2UoY2hhbmdlcyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJeHNjcjEgPSB4c2NyMS0+bmV4dDsKKwl9CisJd2hpbGUgKHhzY3IyKSB7CisJCWlmICghY2hhbmdlcykKKwkJCWNoYW5nZXMgPSBjOworCQlpMSA9IHhzY3IyLT5pMSArIHhlMS0+eGRmMi5ucmVjIC0geGUxLT54ZGYxLm5yZWM7CisJCWkyID0geHNjcjItPmkyOworCQljaGcxID0geHNjcjItPmNoZzE7CisJCWNoZzIgPSB4c2NyMi0+Y2hnMjsKKwkJaWYgKHhkbF9hcHBlbmRfbWVyZ2UoJmMsIDIsIGkxLCBjaGcxLCBpMiwgY2hnMikpIHsKKwkJCXhkbF9jbGVhbnVwX21lcmdlKGNoYW5nZXMpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXhzY3IyID0geHNjcjItPm5leHQ7CisJfQorCWlmICghY2hhbmdlcykKKwkJY2hhbmdlcyA9IGM7CisJLyogcmVmaW5lIGNvbmZsaWN0cyAqLworCWlmIChsZXZlbCA+IDEgJiYKKwkgICAgKHhkbF9yZWZpbmVfY29uZmxpY3RzKHhlMSwgeGUyLCBjaGFuZ2VzLCB4cHApIDwgMCB8fAorCSAgICAgeGRsX3NpbXBsaWZ5X25vbl9jb25mbGljdHMoeGUxLCBjaGFuZ2VzLCBsZXZlbCA+IDIpIDwgMCkpIHsKKwkJeGRsX2NsZWFudXBfbWVyZ2UoY2hhbmdlcyk7CisJCXJldHVybiAtMTsKKwl9CisJLyogb3V0cHV0ICovCisJaWYgKHJlc3VsdCkgeworCQlpbnQgc2l6ZSA9IHhkbF9maWxsX21lcmdlX2J1ZmZlcih4ZTEsIG5hbWUxLCB4ZTIsIG5hbWUyLAorCQkJY2hhbmdlcywgTlVMTCk7CisJCXJlc3VsdC0+cHRyID0geGRsX21hbGxvYyhzaXplKTsKKwkJaWYgKCFyZXN1bHQtPnB0cikgeworCQkJeGRsX2NsZWFudXBfbWVyZ2UoY2hhbmdlcyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcmVzdWx0LT5zaXplID0gc2l6ZTsKKwkJeGRsX2ZpbGxfbWVyZ2VfYnVmZmVyKHhlMSwgbmFtZTEsIHhlMiwgbmFtZTIsIGNoYW5nZXMsCisJCQkJcmVzdWx0LT5wdHIpOworCX0KKwlyZXR1cm4geGRsX2NsZWFudXBfbWVyZ2UoY2hhbmdlcyk7Cit9CisKK2ludCB4ZGxfbWVyZ2UobW1maWxlX3QgKm9yaWcsIG1tZmlsZV90ICptZjEsIGNvbnN0IGNoYXIgKm5hbWUxLAorCQltbWZpbGVfdCAqbWYyLCBjb25zdCBjaGFyICpuYW1lMiwKKwkJeHBwYXJhbV90IGNvbnN0ICp4cHAsIGludCBsZXZlbCwgbW1idWZmZXJfdCAqcmVzdWx0KSB7CisJeGRjaGFuZ2VfdCAqeHNjcjEsICp4c2NyMjsKKwl4ZGZlbnZfdCB4ZTEsIHhlMjsKKwlpbnQgc3RhdHVzOworCisJcmVzdWx0LT5wdHIgPSBOVUxMOworCXJlc3VsdC0+c2l6ZSA9IDA7CisKKwlpZiAoeGRsX2RvX2RpZmYob3JpZywgbWYxLCB4cHAsICZ4ZTEpIDwgMCB8fAorCQkJeGRsX2RvX2RpZmYob3JpZywgbWYyLCB4cHAsICZ4ZTIpIDwgMCkgeworCQlyZXR1cm4gLTE7CisJfQorCWlmICh4ZGxfY2hhbmdlX2NvbXBhY3QoJnhlMS54ZGYxLCAmeGUxLnhkZjIsIHhwcC0+ZmxhZ3MpIDwgMCB8fAorCSAgICB4ZGxfY2hhbmdlX2NvbXBhY3QoJnhlMS54ZGYyLCAmeGUxLnhkZjEsIHhwcC0+ZmxhZ3MpIDwgMCB8fAorCSAgICB4ZGxfYnVpbGRfc2NyaXB0KCZ4ZTEsICZ4c2NyMSkgPCAwKSB7CisJCXhkbF9mcmVlX2VudigmeGUxKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoeGRsX2NoYW5nZV9jb21wYWN0KCZ4ZTIueGRmMSwgJnhlMi54ZGYyLCB4cHAtPmZsYWdzKSA8IDAgfHwKKwkgICAgeGRsX2NoYW5nZV9jb21wYWN0KCZ4ZTIueGRmMiwgJnhlMi54ZGYxLCB4cHAtPmZsYWdzKSA8IDAgfHwKKwkgICAgeGRsX2J1aWxkX3NjcmlwdCgmeGUyLCAmeHNjcjIpIDwgMCkgeworCQl4ZGxfZnJlZV9lbnYoJnhlMik7CisJCXJldHVybiAtMTsKKwl9CisJc3RhdHVzID0gMDsKKwlpZiAoeHNjcjEgfHwgeHNjcjIpIHsKKwkJaWYgKCF4c2NyMSkgeworCQkJcmVzdWx0LT5wdHIgPSB4ZGxfbWFsbG9jKG1mMi0+c2l6ZSk7CisJCQltZW1jcHkocmVzdWx0LT5wdHIsIG1mMi0+cHRyLCBtZjItPnNpemUpOworCQkJcmVzdWx0LT5zaXplID0gbWYyLT5zaXplOworCQl9IGVsc2UgaWYgKCF4c2NyMikgeworCQkJcmVzdWx0LT5wdHIgPSB4ZGxfbWFsbG9jKG1mMS0+c2l6ZSk7CisJCQltZW1jcHkocmVzdWx0LT5wdHIsIG1mMS0+cHRyLCBtZjEtPnNpemUpOworCQkJcmVzdWx0LT5zaXplID0gbWYxLT5zaXplOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0geGRsX2RvX21lcmdlKCZ4ZTEsIHhzY3IxLCBuYW1lMSwKKwkJCQkJICAgICAgJnhlMiwgeHNjcjIsIG5hbWUyLAorCQkJCQkgICAgICBsZXZlbCwgeHBwLCByZXN1bHQpOworCQl9CisJCXhkbF9mcmVlX3NjcmlwdCh4c2NyMSk7CisJCXhkbF9mcmVlX3NjcmlwdCh4c2NyMik7CisJfQorCXhkbF9mcmVlX2VudigmeGUxKTsKKwl4ZGxfZnJlZV9lbnYoJnhlMik7CisKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEveGRpZmYveHByZXBhcmUuYyBiL3hkaWZmL3hwcmVwYXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg3YWI1NwotLS0gL2Rldi9udWxsCisrKyBiL3hkaWZmL3hwcmVwYXJlLmMKQEAgLTAsMCArMSw0NjggQEAKKy8qCisgKiAgTGliWERpZmYgYnkgRGF2aWRlIExpYmVuemkgKCBGaWxlIERpZmZlcmVudGlhbCBMaWJyYXJ5ICkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgIERhdmlkZSBMaWJlbnppCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaW5jbHVkZSAieGluY2x1ZGUuaCIKKworCisKKyNkZWZpbmUgWERMX0tQRElTX1JVTiA0CisjZGVmaW5lIFhETF9NQVhfRVFMSU1JVCAxMDI0CisKKworCit0eXBlZGVmIHN0cnVjdCBzX3hkbGNsYXNzIHsKKwlzdHJ1Y3Qgc194ZGxjbGFzcyAqbmV4dDsKKwl1bnNpZ25lZCBsb25nIGhhOworCWNoYXIgY29uc3QgKmxpbmU7CisJbG9uZyBzaXplOworCWxvbmcgaWR4OworfSB4ZGxjbGFzc190OworCit0eXBlZGVmIHN0cnVjdCBzX3hkbGNsYXNzaWZpZXIgeworCXVuc2lnbmVkIGludCBoYml0czsKKwlsb25nIGhzaXplOworCXhkbGNsYXNzX3QgKipyY2hhc2g7CisJY2hhc3RvcmVfdCBuY2hhOworCWxvbmcgY291bnQ7CisJbG9uZyBmbGFnczsKK30geGRsY2xhc3NpZmllcl90OworCisKKworCitzdGF0aWMgaW50IHhkbF9pbml0X2NsYXNzaWZpZXIoeGRsY2xhc3NpZmllcl90ICpjZiwgbG9uZyBzaXplLCBsb25nIGZsYWdzKTsKK3N0YXRpYyB2b2lkIHhkbF9mcmVlX2NsYXNzaWZpZXIoeGRsY2xhc3NpZmllcl90ICpjZik7CitzdGF0aWMgaW50IHhkbF9jbGFzc2lmeV9yZWNvcmQoeGRsY2xhc3NpZmllcl90ICpjZiwgeHJlY29yZF90ICoqcmhhc2gsIHVuc2lnbmVkIGludCBoYml0cywKKwkJCSAgICAgICB4cmVjb3JkX3QgKnJlYyk7CitzdGF0aWMgaW50IHhkbF9wcmVwYXJlX2N0eChtbWZpbGVfdCAqbWYsIGxvbmcgbmFyZWMsIHhwcGFyYW1fdCBjb25zdCAqeHBwLAorCQkJICAgeGRsY2xhc3NpZmllcl90ICpjZiwgeGRmaWxlX3QgKnhkZik7CitzdGF0aWMgdm9pZCB4ZGxfZnJlZV9jdHgoeGRmaWxlX3QgKnhkZik7CitzdGF0aWMgaW50IHhkbF9jbGVhbl9tbWF0Y2goY2hhciBjb25zdCAqZGlzLCBsb25nIGksIGxvbmcgcywgbG9uZyBlKTsKK3N0YXRpYyBpbnQgeGRsX2NsZWFudXBfcmVjb3Jkcyh4ZGZpbGVfdCAqeGRmMSwgeGRmaWxlX3QgKnhkZjIpOworc3RhdGljIGludCB4ZGxfdHJpbV9lbmRzKHhkZmlsZV90ICp4ZGYxLCB4ZGZpbGVfdCAqeGRmMik7CitzdGF0aWMgaW50IHhkbF9vcHRpbWl6ZV9jdHhzKHhkZmlsZV90ICp4ZGYxLCB4ZGZpbGVfdCAqeGRmMik7CisKKworCisKK3N0YXRpYyBpbnQgeGRsX2luaXRfY2xhc3NpZmllcih4ZGxjbGFzc2lmaWVyX3QgKmNmLCBsb25nIHNpemUsIGxvbmcgZmxhZ3MpIHsKKwlsb25nIGk7CisKKwljZi0+ZmxhZ3MgPSBmbGFnczsKKworCWNmLT5oYml0cyA9IHhkbF9oYXNoYml0cygodW5zaWduZWQgaW50KSBzaXplKTsKKwljZi0+aHNpemUgPSAxIDw8IGNmLT5oYml0czsKKworCWlmICh4ZGxfY2hhX2luaXQoJmNmLT5uY2hhLCBzaXplb2YoeGRsY2xhc3NfdCksIHNpemUgLyA0ICsgMSkgPCAwKSB7CisKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIShjZi0+cmNoYXNoID0gKHhkbGNsYXNzX3QgKiopIHhkbF9tYWxsb2MoY2YtPmhzaXplICogc2l6ZW9mKHhkbGNsYXNzX3QgKikpKSkgeworCisJCXhkbF9jaGFfZnJlZSgmY2YtPm5jaGEpOworCQlyZXR1cm4gLTE7CisJfQorCWZvciAoaSA9IDA7IGkgPCBjZi0+aHNpemU7IGkrKykKKwkJY2YtPnJjaGFzaFtpXSA9IE5VTEw7CisKKwljZi0+Y291bnQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgeGRsX2ZyZWVfY2xhc3NpZmllcih4ZGxjbGFzc2lmaWVyX3QgKmNmKSB7CisKKwl4ZGxfZnJlZShjZi0+cmNoYXNoKTsKKwl4ZGxfY2hhX2ZyZWUoJmNmLT5uY2hhKTsKK30KKworCitzdGF0aWMgaW50IHhkbF9jbGFzc2lmeV9yZWNvcmQoeGRsY2xhc3NpZmllcl90ICpjZiwgeHJlY29yZF90ICoqcmhhc2gsIHVuc2lnbmVkIGludCBoYml0cywKKwkJCSAgICAgICB4cmVjb3JkX3QgKnJlYykgeworCWxvbmcgaGk7CisJY2hhciBjb25zdCAqbGluZTsKKwl4ZGxjbGFzc190ICpyY3JlYzsKKworCWxpbmUgPSByZWMtPnB0cjsKKwloaSA9IChsb25nKSBYRExfSEFTSExPTkcocmVjLT5oYSwgY2YtPmhiaXRzKTsKKwlmb3IgKHJjcmVjID0gY2YtPnJjaGFzaFtoaV07IHJjcmVjOyByY3JlYyA9IHJjcmVjLT5uZXh0KQorCQlpZiAocmNyZWMtPmhhID09IHJlYy0+aGEgJiYKKwkJCQl4ZGxfcmVjbWF0Y2gocmNyZWMtPmxpbmUsIHJjcmVjLT5zaXplLAorCQkJCQlyZWMtPnB0ciwgcmVjLT5zaXplLCBjZi0+ZmxhZ3MpKQorCQkJYnJlYWs7CisKKwlpZiAoIXJjcmVjKSB7CisJCWlmICghKHJjcmVjID0geGRsX2NoYV9hbGxvYygmY2YtPm5jaGEpKSkgeworCisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcmNyZWMtPmlkeCA9IGNmLT5jb3VudCsrOworCQlyY3JlYy0+bGluZSA9IGxpbmU7CisJCXJjcmVjLT5zaXplID0gcmVjLT5zaXplOworCQlyY3JlYy0+aGEgPSByZWMtPmhhOworCQlyY3JlYy0+bmV4dCA9IGNmLT5yY2hhc2hbaGldOworCQljZi0+cmNoYXNoW2hpXSA9IHJjcmVjOworCX0KKworCXJlYy0+aGEgPSAodW5zaWduZWQgbG9uZykgcmNyZWMtPmlkeDsKKworCWhpID0gKGxvbmcpIFhETF9IQVNITE9ORyhyZWMtPmhhLCBoYml0cyk7CisJcmVjLT5uZXh0ID0gcmhhc2hbaGldOworCXJoYXNoW2hpXSA9IHJlYzsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgeGRsX3ByZXBhcmVfY3R4KG1tZmlsZV90ICptZiwgbG9uZyBuYXJlYywgeHBwYXJhbV90IGNvbnN0ICp4cHAsCisJCQkgICB4ZGxjbGFzc2lmaWVyX3QgKmNmLCB4ZGZpbGVfdCAqeGRmKSB7CisJdW5zaWduZWQgaW50IGhiaXRzOworCWxvbmcgaSwgbnJlYywgaHNpemUsIGJzaXplOworCXVuc2lnbmVkIGxvbmcgaGF2OworCWNoYXIgY29uc3QgKmJsaywgKmN1ciwgKnRvcCwgKnByZXY7CisJeHJlY29yZF90ICpjcmVjOworCXhyZWNvcmRfdCAqKnJlY3MsICoqcnJlY3M7CisJeHJlY29yZF90ICoqcmhhc2g7CisJdW5zaWduZWQgbG9uZyAqaGE7CisJY2hhciAqcmNoZzsKKwlsb25nICpyaW5kZXg7CisKKwlpZiAoeGRsX2NoYV9pbml0KCZ4ZGYtPnJjaGEsIHNpemVvZih4cmVjb3JkX3QpLCBuYXJlYyAvIDQgKyAxKSA8IDApIHsKKworCQlyZXR1cm4gLTE7CisJfQorCWlmICghKHJlY3MgPSAoeHJlY29yZF90ICoqKSB4ZGxfbWFsbG9jKG5hcmVjICogc2l6ZW9mKHhyZWNvcmRfdCAqKSkpKSB7CisKKwkJeGRsX2NoYV9mcmVlKCZ4ZGYtPnJjaGEpOworCQlyZXR1cm4gLTE7CisJfQorCisJaGJpdHMgPSB4ZGxfaGFzaGJpdHMoKHVuc2lnbmVkIGludCkgbmFyZWMpOworCWhzaXplID0gMSA8PCBoYml0czsKKwlpZiAoIShyaGFzaCA9ICh4cmVjb3JkX3QgKiopIHhkbF9tYWxsb2MoaHNpemUgKiBzaXplb2YoeHJlY29yZF90ICopKSkpIHsKKworCQl4ZGxfZnJlZShyZWNzKTsKKwkJeGRsX2NoYV9mcmVlKCZ4ZGYtPnJjaGEpOworCQlyZXR1cm4gLTE7CisJfQorCWZvciAoaSA9IDA7IGkgPCBoc2l6ZTsgaSsrKQorCQlyaGFzaFtpXSA9IE5VTEw7CisKKwlucmVjID0gMDsKKwlpZiAoKGN1ciA9IGJsayA9IHhkbF9tbWZpbGVfZmlyc3QobWYsICZic2l6ZSkpICE9IE5VTEwpIHsKKwkJZm9yICh0b3AgPSBibGsgKyBic2l6ZTs7KSB7CisJCQlpZiAoY3VyID49IHRvcCkgeworCQkJCWlmICghKGN1ciA9IGJsayA9IHhkbF9tbWZpbGVfbmV4dChtZiwgJmJzaXplKSkpCisJCQkJCWJyZWFrOworCQkJCXRvcCA9IGJsayArIGJzaXplOworCQkJfQorCQkJcHJldiA9IGN1cjsKKwkJCWhhdiA9IHhkbF9oYXNoX3JlY29yZCgmY3VyLCB0b3AsIHhwcC0+ZmxhZ3MpOworCQkJaWYgKG5yZWMgPj0gbmFyZWMpIHsKKwkJCQluYXJlYyAqPSAyOworCQkJCWlmICghKHJyZWNzID0gKHhyZWNvcmRfdCAqKikgeGRsX3JlYWxsb2MocmVjcywgbmFyZWMgKiBzaXplb2YoeHJlY29yZF90ICopKSkpIHsKKworCQkJCQl4ZGxfZnJlZShyaGFzaCk7CisJCQkJCXhkbF9mcmVlKHJlY3MpOworCQkJCQl4ZGxfY2hhX2ZyZWUoJnhkZi0+cmNoYSk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJcmVjcyA9IHJyZWNzOworCQkJfQorCQkJaWYgKCEoY3JlYyA9IHhkbF9jaGFfYWxsb2MoJnhkZi0+cmNoYSkpKSB7CisKKwkJCQl4ZGxfZnJlZShyaGFzaCk7CisJCQkJeGRsX2ZyZWUocmVjcyk7CisJCQkJeGRsX2NoYV9mcmVlKCZ4ZGYtPnJjaGEpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWNyZWMtPnB0ciA9IHByZXY7CisJCQljcmVjLT5zaXplID0gKGxvbmcpIChjdXIgLSBwcmV2KTsKKwkJCWNyZWMtPmhhID0gaGF2OworCQkJcmVjc1tucmVjKytdID0gY3JlYzsKKworCQkJaWYgKHhkbF9jbGFzc2lmeV9yZWNvcmQoY2YsIHJoYXNoLCBoYml0cywgY3JlYykgPCAwKSB7CisKKwkJCQl4ZGxfZnJlZShyaGFzaCk7CisJCQkJeGRsX2ZyZWUocmVjcyk7CisJCQkJeGRsX2NoYV9mcmVlKCZ4ZGYtPnJjaGEpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCX0KKworCWlmICghKHJjaGcgPSAoY2hhciAqKSB4ZGxfbWFsbG9jKChucmVjICsgMikgKiBzaXplb2YoY2hhcikpKSkgeworCisJCXhkbF9mcmVlKHJoYXNoKTsKKwkJeGRsX2ZyZWUocmVjcyk7CisJCXhkbF9jaGFfZnJlZSgmeGRmLT5yY2hhKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1zZXQocmNoZywgMCwgKG5yZWMgKyAyKSAqIHNpemVvZihjaGFyKSk7CisKKwlpZiAoIShyaW5kZXggPSAobG9uZyAqKSB4ZGxfbWFsbG9jKChucmVjICsgMSkgKiBzaXplb2YobG9uZykpKSkgeworCisJCXhkbF9mcmVlKHJjaGcpOworCQl4ZGxfZnJlZShyaGFzaCk7CisJCXhkbF9mcmVlKHJlY3MpOworCQl4ZGxfY2hhX2ZyZWUoJnhkZi0+cmNoYSk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKCEoaGEgPSAodW5zaWduZWQgbG9uZyAqKSB4ZGxfbWFsbG9jKChucmVjICsgMSkgKiBzaXplb2YodW5zaWduZWQgbG9uZykpKSkgeworCisJCXhkbF9mcmVlKHJpbmRleCk7CisJCXhkbF9mcmVlKHJjaGcpOworCQl4ZGxfZnJlZShyaGFzaCk7CisJCXhkbF9mcmVlKHJlY3MpOworCQl4ZGxfY2hhX2ZyZWUoJnhkZi0+cmNoYSk7CisJCXJldHVybiAtMTsKKwl9CisKKwl4ZGYtPm5yZWMgPSBucmVjOworCXhkZi0+cmVjcyA9IHJlY3M7CisJeGRmLT5oYml0cyA9IGhiaXRzOworCXhkZi0+cmhhc2ggPSByaGFzaDsKKwl4ZGYtPnJjaGcgPSByY2hnICsgMTsKKwl4ZGYtPnJpbmRleCA9IHJpbmRleDsKKwl4ZGYtPm5yZWZmID0gMDsKKwl4ZGYtPmhhID0gaGE7CisJeGRmLT5kc3RhcnQgPSAwOworCXhkZi0+ZGVuZCA9IG5yZWMgLSAxOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgeGRsX2ZyZWVfY3R4KHhkZmlsZV90ICp4ZGYpIHsKKworCXhkbF9mcmVlKHhkZi0+cmhhc2gpOworCXhkbF9mcmVlKHhkZi0+cmluZGV4KTsKKwl4ZGxfZnJlZSh4ZGYtPnJjaGcgLSAxKTsKKwl4ZGxfZnJlZSh4ZGYtPmhhKTsKKwl4ZGxfZnJlZSh4ZGYtPnJlY3MpOworCXhkbF9jaGFfZnJlZSgmeGRmLT5yY2hhKTsKK30KKworCitpbnQgeGRsX3ByZXBhcmVfZW52KG1tZmlsZV90ICptZjEsIG1tZmlsZV90ICptZjIsIHhwcGFyYW1fdCBjb25zdCAqeHBwLAorCQkgICAgeGRmZW52X3QgKnhlKSB7CisJbG9uZyBlbmwxLCBlbmwyOworCXhkbGNsYXNzaWZpZXJfdCBjZjsKKworCWVubDEgPSB4ZGxfZ3Vlc3NfbGluZXMobWYxKSArIDE7CisJZW5sMiA9IHhkbF9ndWVzc19saW5lcyhtZjIpICsgMTsKKworCWlmICh4ZGxfaW5pdF9jbGFzc2lmaWVyKCZjZiwgZW5sMSArIGVubDIgKyAxLCB4cHAtPmZsYWdzKSA8IDApIHsKKworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHhkbF9wcmVwYXJlX2N0eChtZjEsIGVubDEsIHhwcCwgJmNmLCAmeGUtPnhkZjEpIDwgMCkgeworCisJCXhkbF9mcmVlX2NsYXNzaWZpZXIoJmNmKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoeGRsX3ByZXBhcmVfY3R4KG1mMiwgZW5sMiwgeHBwLCAmY2YsICZ4ZS0+eGRmMikgPCAwKSB7CisKKwkJeGRsX2ZyZWVfY3R4KCZ4ZS0+eGRmMSk7CisJCXhkbF9mcmVlX2NsYXNzaWZpZXIoJmNmKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXhkbF9mcmVlX2NsYXNzaWZpZXIoJmNmKTsKKworCWlmICh4ZGxfb3B0aW1pemVfY3R4cygmeGUtPnhkZjEsICZ4ZS0+eGRmMikgPCAwKSB7CisKKwkJeGRsX2ZyZWVfY3R4KCZ4ZS0+eGRmMik7CisJCXhkbF9mcmVlX2N0eCgmeGUtPnhkZjEpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCB4ZGxfZnJlZV9lbnYoeGRmZW52X3QgKnhlKSB7CisKKwl4ZGxfZnJlZV9jdHgoJnhlLT54ZGYyKTsKKwl4ZGxfZnJlZV9jdHgoJnhlLT54ZGYxKTsKK30KKworCitzdGF0aWMgaW50IHhkbF9jbGVhbl9tbWF0Y2goY2hhciBjb25zdCAqZGlzLCBsb25nIGksIGxvbmcgcywgbG9uZyBlKSB7CisJbG9uZyByLCByZGlzMCwgcnBkaXMwLCByZGlzMSwgcnBkaXMxOworCisJLyoKKwkgKiBTY2FucyB0aGUgbGluZXMgYmVmb3JlICdpJyB0byBmaW5kIGEgcnVuIG9mIGxpbmVzIHRoYXQgZWl0aGVyCisJICogaGF2ZSBubyBtYXRjaCAoZGlzW2pdID09IDApIG9yIGhhdmUgbXVsdGlwbGUgbWF0Y2hlcyAoZGlzW2pdID4gMSkuCisJICogTm90ZSB0aGF0IHdlIGFsd2F5cyBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBkaXNbaV0gPiAxLCBzbyB0aGUKKwkgKiBjdXJyZW50IGxpbmUgKGkpIGlzIGFscmVhZHkgYSBtdWx0aW1hdGNoIGxpbmUuCisJICovCisJZm9yIChyID0gMSwgcmRpczAgPSAwLCBycGRpczAgPSAxOyAoaSAtIHIpID49IHM7IHIrKykgeworCQlpZiAoIWRpc1tpIC0gcl0pCisJCQlyZGlzMCsrOworCQllbHNlIGlmIChkaXNbaSAtIHJdID09IDIpCisJCQlycGRpczArKzsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCS8qCisJICogSWYgdGhlIHJ1biBiZWZvcmUgdGhlIGxpbmUgJ2knIGZvdW5kIG9ubHkgbXVsdGltYXRjaCBsaW5lcywgd2UKKwkgKiByZXR1cm4gMCBhbmQgaGVuY2Ugd2UgZG9uJ3QgbWFrZSB0aGUgY3VycmVudCBsaW5lIChpKSBkaXNjYXJkZWQuCisJICogV2Ugd2FudCB0byBkaXNjYXJkIG11bHRpbWF0Y2ggbGluZXMgb25seSB3aGVuIHRoZXkgYXBwZWFyIGluIHRoZQorCSAqIG1pZGRsZSBvZiBydW5zIHdpdGggbm9tYXRjaCBsaW5lcyAoZGlzW2pdID09IDApLgorCSAqLworCWlmIChyZGlzMCA9PSAwKQorCQlyZXR1cm4gMDsKKwlmb3IgKHIgPSAxLCByZGlzMSA9IDAsIHJwZGlzMSA9IDE7IChpICsgcikgPD0gZTsgcisrKSB7CisJCWlmICghZGlzW2kgKyByXSkKKwkJCXJkaXMxKys7CisJCWVsc2UgaWYgKGRpc1tpICsgcl0gPT0gMikKKwkJCXJwZGlzMSsrOworCQllbHNlCisJCQlicmVhazsKKwl9CisJLyoKKwkgKiBJZiB0aGUgcnVuIGFmdGVyIHRoZSBsaW5lICdpJyBmb3VuZCBvbmx5IG11bHRpbWF0Y2ggbGluZXMsIHdlCisJICogcmV0dXJuIDAgYW5kIGhlbmNlIHdlIGRvbid0IG1ha2UgdGhlIGN1cnJlbnQgbGluZSAoaSkgZGlzY2FyZGVkLgorCSAqLworCWlmIChyZGlzMSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZGlzMSArPSByZGlzMDsKKwlycGRpczEgKz0gcnBkaXMwOworCisJcmV0dXJuIHJwZGlzMSAqIFhETF9LUERJU19SVU4gPCAocnBkaXMxICsgcmRpczEpOworfQorCisKKy8qCisgKiBUcnkgdG8gcmVkdWNlIHRoZSBwcm9ibGVtIGNvbXBsZXhpdHksIGRpc2NhcmQgcmVjb3JkcyB0aGF0IGhhdmUgbm8KKyAqIG1hdGNoZXMgb24gdGhlIG90aGVyIGZpbGUuIEFsc28sIGxpbmVzIHRoYXQgaGF2ZSBtdWx0aXBsZSBtYXRjaGVzCisgKiBtaWdodCBiZSBwb3RlbnRpYWxseSBkaXNjYXJkZWQgaWYgdGhleSBoYXBwZWFyIGluIGEgcnVuIG9mIGRpc2NhcmRhYmxlLgorICovCitzdGF0aWMgaW50IHhkbF9jbGVhbnVwX3JlY29yZHMoeGRmaWxlX3QgKnhkZjEsIHhkZmlsZV90ICp4ZGYyKSB7CisJbG9uZyBpLCBubSwgcmhpLCBucmVmZiwgbWxpbTsKKwl1bnNpZ25lZCBsb25nIGhhdjsKKwl4cmVjb3JkX3QgKipyZWNzOworCXhyZWNvcmRfdCAqcmVjOworCWNoYXIgKmRpcywgKmRpczEsICpkaXMyOworCisJaWYgKCEoZGlzID0gKGNoYXIgKikgeGRsX21hbGxvYyh4ZGYxLT5ucmVjICsgeGRmMi0+bnJlYyArIDIpKSkgeworCisJCXJldHVybiAtMTsKKwl9CisJbWVtc2V0KGRpcywgMCwgeGRmMS0+bnJlYyArIHhkZjItPm5yZWMgKyAyKTsKKwlkaXMxID0gZGlzOworCWRpczIgPSBkaXMxICsgeGRmMS0+bnJlYyArIDE7CisKKwlpZiAoKG1saW0gPSB4ZGxfYm9nb3NxcnQoeGRmMS0+bnJlYykpID4gWERMX01BWF9FUUxJTUlUKQorCQltbGltID0gWERMX01BWF9FUUxJTUlUOworCWZvciAoaSA9IHhkZjEtPmRzdGFydCwgcmVjcyA9ICZ4ZGYxLT5yZWNzW3hkZjEtPmRzdGFydF07IGkgPD0geGRmMS0+ZGVuZDsgaSsrLCByZWNzKyspIHsKKwkJaGF2ID0gKCpyZWNzKS0+aGE7CisJCXJoaSA9IChsb25nKSBYRExfSEFTSExPTkcoaGF2LCB4ZGYyLT5oYml0cyk7CisJCWZvciAobm0gPSAwLCByZWMgPSB4ZGYyLT5yaGFzaFtyaGldOyByZWM7IHJlYyA9IHJlYy0+bmV4dCkKKwkJCWlmIChyZWMtPmhhID09IGhhdiAmJiArK25tID09IG1saW0pCisJCQkJYnJlYWs7CisJCWRpczFbaV0gPSAobm0gPT0gMCkgPyAwOiAobm0gPj0gbWxpbSkgPyAyOiAxOworCX0KKworCWlmICgobWxpbSA9IHhkbF9ib2dvc3FydCh4ZGYyLT5ucmVjKSkgPiBYRExfTUFYX0VRTElNSVQpCisJCW1saW0gPSBYRExfTUFYX0VRTElNSVQ7CisJZm9yIChpID0geGRmMi0+ZHN0YXJ0LCByZWNzID0gJnhkZjItPnJlY3NbeGRmMi0+ZHN0YXJ0XTsgaSA8PSB4ZGYyLT5kZW5kOyBpKyssIHJlY3MrKykgeworCQloYXYgPSAoKnJlY3MpLT5oYTsKKwkJcmhpID0gKGxvbmcpIFhETF9IQVNITE9ORyhoYXYsIHhkZjEtPmhiaXRzKTsKKwkJZm9yIChubSA9IDAsIHJlYyA9IHhkZjEtPnJoYXNoW3JoaV07IHJlYzsgcmVjID0gcmVjLT5uZXh0KQorCQkJaWYgKHJlYy0+aGEgPT0gaGF2ICYmICsrbm0gPT0gbWxpbSkKKwkJCQlicmVhazsKKwkJZGlzMltpXSA9IChubSA9PSAwKSA/IDA6IChubSA+PSBtbGltKSA/IDI6IDE7CisJfQorCisJZm9yIChucmVmZiA9IDAsIGkgPSB4ZGYxLT5kc3RhcnQsIHJlY3MgPSAmeGRmMS0+cmVjc1t4ZGYxLT5kc3RhcnRdOworCSAgICAgaSA8PSB4ZGYxLT5kZW5kOyBpKyssIHJlY3MrKykgeworCQlpZiAoZGlzMVtpXSA9PSAxIHx8CisJCSAgICAoZGlzMVtpXSA9PSAyICYmICF4ZGxfY2xlYW5fbW1hdGNoKGRpczEsIGksIHhkZjEtPmRzdGFydCwgeGRmMS0+ZGVuZCkpKSB7CisJCQl4ZGYxLT5yaW5kZXhbbnJlZmZdID0gaTsKKwkJCXhkZjEtPmhhW25yZWZmXSA9ICgqcmVjcyktPmhhOworCQkJbnJlZmYrKzsKKwkJfSBlbHNlCisJCQl4ZGYxLT5yY2hnW2ldID0gMTsKKwl9CisJeGRmMS0+bnJlZmYgPSBucmVmZjsKKworCWZvciAobnJlZmYgPSAwLCBpID0geGRmMi0+ZHN0YXJ0LCByZWNzID0gJnhkZjItPnJlY3NbeGRmMi0+ZHN0YXJ0XTsKKwkgICAgIGkgPD0geGRmMi0+ZGVuZDsgaSsrLCByZWNzKyspIHsKKwkJaWYgKGRpczJbaV0gPT0gMSB8fAorCQkgICAgKGRpczJbaV0gPT0gMiAmJiAheGRsX2NsZWFuX21tYXRjaChkaXMyLCBpLCB4ZGYyLT5kc3RhcnQsIHhkZjItPmRlbmQpKSkgeworCQkJeGRmMi0+cmluZGV4W25yZWZmXSA9IGk7CisJCQl4ZGYyLT5oYVtucmVmZl0gPSAoKnJlY3MpLT5oYTsKKwkJCW5yZWZmKys7CisJCX0gZWxzZQorCQkJeGRmMi0+cmNoZ1tpXSA9IDE7CisJfQorCXhkZjItPm5yZWZmID0gbnJlZmY7CisKKwl4ZGxfZnJlZShkaXMpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEVhcmx5IHRyaW0gaW5pdGlhbCBhbmQgdGVybWluYWwgbWF0Y2hpbmcgcmVjb3Jkcy4KKyAqLworc3RhdGljIGludCB4ZGxfdHJpbV9lbmRzKHhkZmlsZV90ICp4ZGYxLCB4ZGZpbGVfdCAqeGRmMikgeworCWxvbmcgaSwgbGltOworCXhyZWNvcmRfdCAqKnJlY3MxLCAqKnJlY3MyOworCisJcmVjczEgPSB4ZGYxLT5yZWNzOworCXJlY3MyID0geGRmMi0+cmVjczsKKwlmb3IgKGkgPSAwLCBsaW0gPSBYRExfTUlOKHhkZjEtPm5yZWMsIHhkZjItPm5yZWMpOyBpIDwgbGltOworCSAgICAgaSsrLCByZWNzMSsrLCByZWNzMisrKQorCQlpZiAoKCpyZWNzMSktPmhhICE9ICgqcmVjczIpLT5oYSkKKwkJCWJyZWFrOworCisJeGRmMS0+ZHN0YXJ0ID0geGRmMi0+ZHN0YXJ0ID0gaTsKKworCXJlY3MxID0geGRmMS0+cmVjcyArIHhkZjEtPm5yZWMgLSAxOworCXJlY3MyID0geGRmMi0+cmVjcyArIHhkZjItPm5yZWMgLSAxOworCWZvciAobGltIC09IGksIGkgPSAwOyBpIDwgbGltOyBpKyssIHJlY3MxLS0sIHJlY3MyLS0pCisJCWlmICgoKnJlY3MxKS0+aGEgIT0gKCpyZWNzMiktPmhhKQorCQkJYnJlYWs7CisKKwl4ZGYxLT5kZW5kID0geGRmMS0+bnJlYyAtIGkgLSAxOworCXhkZjItPmRlbmQgPSB4ZGYyLT5ucmVjIC0gaSAtIDE7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHhkbF9vcHRpbWl6ZV9jdHhzKHhkZmlsZV90ICp4ZGYxLCB4ZGZpbGVfdCAqeGRmMikgeworCisJaWYgKHhkbF90cmltX2VuZHMoeGRmMSwgeGRmMikgPCAwIHx8CisJICAgIHhkbF9jbGVhbnVwX3JlY29yZHMoeGRmMSwgeGRmMikgPCAwKSB7CisKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEveGRpZmYveHByZXBhcmUuaCBiL3hkaWZmL3hwcmVwYXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZiMDZhNQotLS0gL2Rldi9udWxsCisrKyBiL3hkaWZmL3hwcmVwYXJlLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqICBMaWJYRGlmZiBieSBEYXZpZGUgTGliZW56aSAoIEZpbGUgRGlmZmVyZW50aWFsIExpYnJhcnkgKQorICogIENvcHlyaWdodCAoQykgMjAwMyAgRGF2aWRlIExpYmVuemkKKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqICBEYXZpZGUgTGliZW56aSA8ZGF2aWRlbEB4bWFpbHNlcnZlci5vcmc+CisgKgorICovCisKKyNpZiAhZGVmaW5lZChYUFJFUEFSRV9IKQorI2RlZmluZSBYUFJFUEFSRV9ICisKKworCitpbnQgeGRsX3ByZXBhcmVfZW52KG1tZmlsZV90ICptZjEsIG1tZmlsZV90ICptZjIsIHhwcGFyYW1fdCBjb25zdCAqeHBwLAorCQkgICAgeGRmZW52X3QgKnhlKTsKK3ZvaWQgeGRsX2ZyZWVfZW52KHhkZmVudl90ICp4ZSk7CisKKworCisjZW5kaWYgLyogI2lmICFkZWZpbmVkKFhQUkVQQVJFX0gpICovCmRpZmYgLS1naXQgYS94ZGlmZi94dHlwZXMuaCBiL3hkaWZmL3h0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MTFhZWYKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94dHlwZXMuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogIExpYlhEaWZmIGJ5IERhdmlkZSBMaWJlbnppICggRmlsZSBEaWZmZXJlbnRpYWwgTGlicmFyeSApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzICBEYXZpZGUgTGliZW56aQorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogIERhdmlkZSBMaWJlbnppIDxkYXZpZGVsQHhtYWlsc2VydmVyLm9yZz4KKyAqCisgKi8KKworI2lmICFkZWZpbmVkKFhUWVBFU19IKQorI2RlZmluZSBYVFlQRVNfSAorCisKKwordHlwZWRlZiBzdHJ1Y3Qgc19jaGFub2RlIHsKKwlzdHJ1Y3Qgc19jaGFub2RlICpuZXh0OworCWxvbmcgaWN1cnI7Cit9IGNoYW5vZGVfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19jaGFzdG9yZSB7CisJY2hhbm9kZV90ICpoZWFkLCAqdGFpbDsKKwlsb25nIGlzaXplLCBuc2l6ZTsKKwljaGFub2RlX3QgKmFuY3VyOworCWNoYW5vZGVfdCAqc25jdXI7CisJbG9uZyBzY3VycjsKK30gY2hhc3RvcmVfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc194cmVjb3JkIHsKKwlzdHJ1Y3Qgc194cmVjb3JkICpuZXh0OworCWNoYXIgY29uc3QgKnB0cjsKKwlsb25nIHNpemU7CisJdW5zaWduZWQgbG9uZyBoYTsKK30geHJlY29yZF90OworCit0eXBlZGVmIHN0cnVjdCBzX3hkZmlsZSB7CisJY2hhc3RvcmVfdCByY2hhOworCWxvbmcgbnJlYzsKKwl1bnNpZ25lZCBpbnQgaGJpdHM7CisJeHJlY29yZF90ICoqcmhhc2g7CisJbG9uZyBkc3RhcnQsIGRlbmQ7CisJeHJlY29yZF90ICoqcmVjczsKKwljaGFyICpyY2hnOworCWxvbmcgKnJpbmRleDsKKwlsb25nIG5yZWZmOworCXVuc2lnbmVkIGxvbmcgKmhhOworfSB4ZGZpbGVfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc194ZGZlbnYgeworCXhkZmlsZV90IHhkZjEsIHhkZjI7Cit9IHhkZmVudl90OworCisKKworI2VuZGlmIC8qICNpZiAhZGVmaW5lZChYVFlQRVNfSCkgKi8KZGlmZiAtLWdpdCBhL3hkaWZmL3h1dGlscy5jIGIveGRpZmYveHV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc5NzRkMQotLS0gL2Rldi9udWxsCisrKyBiL3hkaWZmL3h1dGlscy5jCkBAIC0wLDAgKzEsMzgwIEBACisvKgorICogIExpYlhEaWZmIGJ5IERhdmlkZSBMaWJlbnppICggRmlsZSBEaWZmZXJlbnRpYWwgTGlicmFyeSApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzCURhdmlkZSBMaWJlbnppCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaW5jbHVkZSAieGluY2x1ZGUuaCIKKworCisKKyNkZWZpbmUgWERMX0dVRVNTX05MSU5FUyAyNTYKKworCisKKworbG9uZyB4ZGxfYm9nb3NxcnQobG9uZyBuKSB7CisJbG9uZyBpOworCisJLyoKKwkgKiBDbGFzc2ljYWwgaW50ZWdlciBzcXVhcmUgcm9vdCBhcHByb3hpbWF0aW9uIHVzaW5nIHNoaWZ0cy4KKwkgKi8KKwlmb3IgKGkgPSAxOyBuID4gMDsgbiA+Pj0gMikKKwkJaSA8PD0gMTsKKworCXJldHVybiBpOworfQorCisKK2ludCB4ZGxfZW1pdF9kaWZmcmVjKGNoYXIgY29uc3QgKnJlYywgbG9uZyBzaXplLCBjaGFyIGNvbnN0ICpwcmUsIGxvbmcgcHNpemUsCisJCSAgICAgeGRlbWl0Y2JfdCAqZWNiKSB7CisJaW50IGkgPSAyOworCW1tYnVmZmVyX3QgbWJbM107CisKKwltYlswXS5wdHIgPSAoY2hhciAqKSBwcmU7CisJbWJbMF0uc2l6ZSA9IHBzaXplOworCW1iWzFdLnB0ciA9IChjaGFyICopIHJlYzsKKwltYlsxXS5zaXplID0gc2l6ZTsKKwlpZiAoc2l6ZSA+IDAgJiYgcmVjW3NpemUgLSAxXSAhPSAnXG4nKSB7CisJCW1iWzJdLnB0ciA9IChjaGFyICopICJcblxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGVcbiI7CisJCW1iWzJdLnNpemUgPSBzdHJsZW4obWJbMl0ucHRyKTsKKwkJaSsrOworCX0KKwlpZiAoZWNiLT5vdXRmKGVjYi0+cHJpdiwgbWIsIGkpIDwgMCkgeworCisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCAqeGRsX21tZmlsZV9maXJzdChtbWZpbGVfdCAqbW1mLCBsb25nICpzaXplKQoreworCSpzaXplID0gbW1mLT5zaXplOworCXJldHVybiBtbWYtPnB0cjsKK30KKworCit2b2lkICp4ZGxfbW1maWxlX25leHQobW1maWxlX3QgKm1tZiwgbG9uZyAqc2l6ZSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworCitsb25nIHhkbF9tbWZpbGVfc2l6ZShtbWZpbGVfdCAqbW1mKQoreworCXJldHVybiBtbWYtPnNpemU7Cit9CisKKworaW50IHhkbF9jaGFfaW5pdChjaGFzdG9yZV90ICpjaGEsIGxvbmcgaXNpemUsIGxvbmcgaWNvdW50KSB7CisKKwljaGEtPmhlYWQgPSBjaGEtPnRhaWwgPSBOVUxMOworCWNoYS0+aXNpemUgPSBpc2l6ZTsKKwljaGEtPm5zaXplID0gaWNvdW50ICogaXNpemU7CisJY2hhLT5hbmN1ciA9IGNoYS0+c25jdXIgPSBOVUxMOworCWNoYS0+c2N1cnIgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCB4ZGxfY2hhX2ZyZWUoY2hhc3RvcmVfdCAqY2hhKSB7CisJY2hhbm9kZV90ICpjdXIsICp0bXA7CisKKwlmb3IgKGN1ciA9IGNoYS0+aGVhZDsgKHRtcCA9IGN1cikgIT0gTlVMTDspIHsKKwkJY3VyID0gY3VyLT5uZXh0OworCQl4ZGxfZnJlZSh0bXApOworCX0KK30KKworCit2b2lkICp4ZGxfY2hhX2FsbG9jKGNoYXN0b3JlX3QgKmNoYSkgeworCWNoYW5vZGVfdCAqYW5jdXI7CisJdm9pZCAqZGF0YTsKKworCWlmICghKGFuY3VyID0gY2hhLT5hbmN1cikgfHwgYW5jdXItPmljdXJyID09IGNoYS0+bnNpemUpIHsKKwkJaWYgKCEoYW5jdXIgPSAoY2hhbm9kZV90ICopIHhkbF9tYWxsb2Moc2l6ZW9mKGNoYW5vZGVfdCkgKyBjaGEtPm5zaXplKSkpIHsKKworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJYW5jdXItPmljdXJyID0gMDsKKwkJYW5jdXItPm5leHQgPSBOVUxMOworCQlpZiAoY2hhLT50YWlsKQorCQkJY2hhLT50YWlsLT5uZXh0ID0gYW5jdXI7CisJCWlmICghY2hhLT5oZWFkKQorCQkJY2hhLT5oZWFkID0gYW5jdXI7CisJCWNoYS0+dGFpbCA9IGFuY3VyOworCQljaGEtPmFuY3VyID0gYW5jdXI7CisJfQorCisJZGF0YSA9IChjaGFyICopIGFuY3VyICsgc2l6ZW9mKGNoYW5vZGVfdCkgKyBhbmN1ci0+aWN1cnI7CisJYW5jdXItPmljdXJyICs9IGNoYS0+aXNpemU7CisKKwlyZXR1cm4gZGF0YTsKK30KKworCit2b2lkICp4ZGxfY2hhX2ZpcnN0KGNoYXN0b3JlX3QgKmNoYSkgeworCWNoYW5vZGVfdCAqc25jdXI7CisKKwlpZiAoIShjaGEtPnNuY3VyID0gc25jdXIgPSBjaGEtPmhlYWQpKQorCQlyZXR1cm4gTlVMTDsKKworCWNoYS0+c2N1cnIgPSAwOworCisJcmV0dXJuIChjaGFyICopIHNuY3VyICsgc2l6ZW9mKGNoYW5vZGVfdCkgKyBjaGEtPnNjdXJyOworfQorCisKK3ZvaWQgKnhkbF9jaGFfbmV4dChjaGFzdG9yZV90ICpjaGEpIHsKKwljaGFub2RlX3QgKnNuY3VyOworCisJaWYgKCEoc25jdXIgPSBjaGEtPnNuY3VyKSkKKwkJcmV0dXJuIE5VTEw7CisJY2hhLT5zY3VyciArPSBjaGEtPmlzaXplOworCWlmIChjaGEtPnNjdXJyID09IHNuY3VyLT5pY3VycikgeworCQlpZiAoIShzbmN1ciA9IGNoYS0+c25jdXIgPSBzbmN1ci0+bmV4dCkpCisJCQlyZXR1cm4gTlVMTDsKKwkJY2hhLT5zY3VyciA9IDA7CisJfQorCisJcmV0dXJuIChjaGFyICopIHNuY3VyICsgc2l6ZW9mKGNoYW5vZGVfdCkgKyBjaGEtPnNjdXJyOworfQorCisKK2xvbmcgeGRsX2d1ZXNzX2xpbmVzKG1tZmlsZV90ICptZikgeworCWxvbmcgbmwgPSAwLCBzaXplLCB0c2l6ZSA9IDA7CisJY2hhciBjb25zdCAqZGF0YSwgKmN1ciwgKnRvcDsKKworCWlmICgoY3VyID0gZGF0YSA9IHhkbF9tbWZpbGVfZmlyc3QobWYsICZzaXplKSkgIT0gTlVMTCkgeworCQlmb3IgKHRvcCA9IGRhdGEgKyBzaXplOyBubCA8IFhETF9HVUVTU19OTElORVM7KSB7CisJCQlpZiAoY3VyID49IHRvcCkgeworCQkJCXRzaXplICs9IChsb25nKSAoY3VyIC0gZGF0YSk7CisJCQkJaWYgKCEoY3VyID0gZGF0YSA9IHhkbF9tbWZpbGVfbmV4dChtZiwgJnNpemUpKSkKKwkJCQkJYnJlYWs7CisJCQkJdG9wID0gZGF0YSArIHNpemU7CisJCQl9CisJCQlubCsrOworCQkJaWYgKCEoY3VyID0gbWVtY2hyKGN1ciwgJ1xuJywgdG9wIC0gY3VyKSkpCisJCQkJY3VyID0gdG9wOworCQkJZWxzZQorCQkJCWN1cisrOworCQl9CisJCXRzaXplICs9IChsb25nKSAoY3VyIC0gZGF0YSk7CisJfQorCisJaWYgKG5sICYmIHRzaXplKQorCQlubCA9IHhkbF9tbWZpbGVfc2l6ZShtZikgLyAodHNpemUgLyBubCk7CisKKwlyZXR1cm4gbmwgKyAxOworfQorCitpbnQgeGRsX3JlY21hdGNoKGNvbnN0IGNoYXIgKmwxLCBsb25nIHMxLCBjb25zdCBjaGFyICpsMiwgbG9uZyBzMiwgbG9uZyBmbGFncykKK3sKKwlpbnQgaTEsIGkyOworCisJaWYgKGZsYWdzICYgWERGX0lHTk9SRV9XSElURVNQQUNFKSB7CisJCWZvciAoaTEgPSBpMiA9IDA7IGkxIDwgczEgJiYgaTIgPCBzMjsgKSB7CisJCQlpZiAoaXNzcGFjZShsMVtpMV0pKQorCQkJCXdoaWxlIChpc3NwYWNlKGwxW2kxXSkgJiYgaTEgPCBzMSkKKwkJCQkJaTErKzsKKwkJCWlmIChpc3NwYWNlKGwyW2kyXSkpCisJCQkJd2hpbGUgKGlzc3BhY2UobDJbaTJdKSAmJiBpMiA8IHMyKQorCQkJCQlpMisrOworCQkJaWYgKGkxIDwgczEgJiYgaTIgPCBzMiAmJiBsMVtpMSsrXSAhPSBsMltpMisrXSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gKGkxID49IHMxICYmIGkyID49IHMyKTsKKwl9IGVsc2UgaWYgKGZsYWdzICYgWERGX0lHTk9SRV9XSElURVNQQUNFX0NIQU5HRSkgeworCQlmb3IgKGkxID0gaTIgPSAwOyBpMSA8IHMxICYmIGkyIDwgczI7ICkgeworCQkJaWYgKGlzc3BhY2UobDFbaTFdKSkgeworCQkJCWlmICghaXNzcGFjZShsMltpMl0pKQorCQkJCQlyZXR1cm4gMDsKKwkJCQl3aGlsZSAoaXNzcGFjZShsMVtpMV0pICYmIGkxIDwgczEpCisJCQkJCWkxKys7CisJCQkJd2hpbGUgKGlzc3BhY2UobDJbaTJdKSAmJiBpMiA8IHMyKQorCQkJCQlpMisrOworCQkJfSBlbHNlIGlmIChsMVtpMSsrXSAhPSBsMltpMisrXSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gKGkxID49IHMxICYmIGkyID49IHMyKTsKKwl9IGVsc2UgaWYgKGZsYWdzICYgWERGX0lHTk9SRV9XSElURVNQQUNFX0FUX0VPTCkgeworCQlmb3IgKGkxID0gaTIgPSAwOyBpMSA8IHMxICYmIGkyIDwgczI7ICkgeworCQkJaWYgKGwxW2kxXSAhPSBsMltpMl0pIHsKKwkJCQl3aGlsZSAoaTEgPCBzMSAmJiBpc3NwYWNlKGwxW2kxXSkpCisJCQkJCWkxKys7CisJCQkJd2hpbGUgKGkyIDwgczIgJiYgaXNzcGFjZShsMltpMl0pKQorCQkJCQlpMisrOworCQkJCWlmIChpMSA8IHMxIHx8IGkyIDwgczIpCisJCQkJCXJldHVybiAwOworCQkJCXJldHVybiAxOworCQkJfQorCQkJaTErKzsKKwkJCWkyKys7CisJCX0KKwkJcmV0dXJuIGkxID49IHMxICYmIGkyID49IHMyOworCX0gZWxzZQorCQlyZXR1cm4gczEgPT0gczIgJiYgIW1lbWNtcChsMSwgbDIsIHMxKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgeGRsX2hhc2hfcmVjb3JkX3dpdGhfd2hpdGVzcGFjZShjaGFyIGNvbnN0ICoqZGF0YSwKKwkJY2hhciBjb25zdCAqdG9wLCBsb25nIGZsYWdzKSB7CisJdW5zaWduZWQgbG9uZyBoYSA9IDUzODE7CisJY2hhciBjb25zdCAqcHRyID0gKmRhdGE7CisKKwlmb3IgKDsgcHRyIDwgdG9wICYmICpwdHIgIT0gJ1xuJzsgcHRyKyspIHsKKwkJaWYgKGlzc3BhY2UoKnB0cikpIHsKKwkJCWNvbnN0IGNoYXIgKnB0cjIgPSBwdHI7CisJCQl3aGlsZSAocHRyICsgMSA8IHRvcCAmJiBpc3NwYWNlKHB0clsxXSkKKwkJCQkJJiYgcHRyWzFdICE9ICdcbicpCisJCQkJcHRyKys7CisJCQlpZiAoZmxhZ3MgJiBYREZfSUdOT1JFX1dISVRFU1BBQ0VfQ0hBTkdFCisJCQkJCSYmIHB0clsxXSAhPSAnXG4nKSB7CisJCQkJaGEgKz0gKGhhIDw8IDUpOworCQkJCWhhIF49ICh1bnNpZ25lZCBsb25nKSAnICc7CisJCQl9CisJCQlpZiAoZmxhZ3MgJiBYREZfSUdOT1JFX1dISVRFU1BBQ0VfQVRfRU9MCisJCQkJCSYmIHB0clsxXSAhPSAnXG4nKSB7CisJCQkJd2hpbGUgKHB0cjIgIT0gcHRyICsgMSkgeworCQkJCQloYSArPSAoaGEgPDwgNSk7CisJCQkJCWhhIF49ICh1bnNpZ25lZCBsb25nKSAqcHRyMjsKKwkJCQkJcHRyMisrOworCQkJCX0KKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWhhICs9IChoYSA8PCA1KTsKKwkJaGEgXj0gKHVuc2lnbmVkIGxvbmcpICpwdHI7CisJfQorCSpkYXRhID0gcHRyIDwgdG9wID8gcHRyICsgMTogcHRyOworCisJcmV0dXJuIGhhOworfQorCisKK3Vuc2lnbmVkIGxvbmcgeGRsX2hhc2hfcmVjb3JkKGNoYXIgY29uc3QgKipkYXRhLCBjaGFyIGNvbnN0ICp0b3AsIGxvbmcgZmxhZ3MpIHsKKwl1bnNpZ25lZCBsb25nIGhhID0gNTM4MTsKKwljaGFyIGNvbnN0ICpwdHIgPSAqZGF0YTsKKworCWlmIChmbGFncyAmIFhERl9XSElURVNQQUNFX0ZMQUdTKQorCQlyZXR1cm4geGRsX2hhc2hfcmVjb3JkX3dpdGhfd2hpdGVzcGFjZShkYXRhLCB0b3AsIGZsYWdzKTsKKworCWZvciAoOyBwdHIgPCB0b3AgJiYgKnB0ciAhPSAnXG4nOyBwdHIrKykgeworCQloYSArPSAoaGEgPDwgNSk7CisJCWhhIF49ICh1bnNpZ25lZCBsb25nKSAqcHRyOworCX0KKwkqZGF0YSA9IHB0ciA8IHRvcCA/IHB0ciArIDE6IHB0cjsKKworCXJldHVybiBoYTsKK30KKworCit1bnNpZ25lZCBpbnQgeGRsX2hhc2hiaXRzKHVuc2lnbmVkIGludCBzaXplKSB7CisJdW5zaWduZWQgaW50IHZhbCA9IDEsIGJpdHMgPSAwOworCisJZm9yICg7IHZhbCA8IHNpemUgJiYgYml0cyA8IENIQVJfQklUICogc2l6ZW9mKHVuc2lnbmVkIGludCk7IHZhbCA8PD0gMSwgYml0cysrKTsKKwlyZXR1cm4gYml0cyA/IGJpdHM6IDE7Cit9CisKKworaW50IHhkbF9udW1fb3V0KGNoYXIgKm91dCwgbG9uZyB2YWwpIHsKKwljaGFyICpwdHIsICpzdHIgPSBvdXQ7CisJY2hhciBidWZbMzJdOworCisJcHRyID0gYnVmICsgc2l6ZW9mKGJ1ZikgLSAxOworCSpwdHIgPSAnXDAnOworCWlmICh2YWwgPCAwKSB7CisJCSotLXB0ciA9ICctJzsKKwkJdmFsID0gLXZhbDsKKwl9CisJZm9yICg7IHZhbCAmJiBwdHIgPiBidWY7IHZhbCAvPSAxMCkKKwkJKi0tcHRyID0gIjAxMjM0NTY3ODkiW3ZhbCAlIDEwXTsKKwlpZiAoKnB0cikKKwkJZm9yICg7ICpwdHI7IHB0cisrLCBzdHIrKykKKwkJCSpzdHIgPSAqcHRyOworCWVsc2UKKwkJKnN0cisrID0gJzAnOworCSpzdHIgPSAnXDAnOworCisJcmV0dXJuIHN0ciAtIG91dDsKK30KKworCitsb25nIHhkbF9hdG9sKGNoYXIgY29uc3QgKnN0ciwgY2hhciBjb25zdCAqKm5leHQpIHsKKwlsb25nIHZhbCwgYmFzZTsKKwljaGFyIGNvbnN0ICp0b3A7CisKKwlmb3IgKHRvcCA9IHN0cjsgWERMX0lTRElHSVQoKnRvcCk7IHRvcCsrKTsKKwlpZiAobmV4dCkKKwkJKm5leHQgPSB0b3A7CisJZm9yICh2YWwgPSAwLCBiYXNlID0gMSwgdG9wLS07IHRvcCA+PSBzdHI7IHRvcC0tLCBiYXNlICo9IDEwKQorCQl2YWwgKz0gYmFzZSAqIChsb25nKSgqdG9wIC0gJzAnKTsKKwlyZXR1cm4gdmFsOworfQorCisKK2ludCB4ZGxfZW1pdF9odW5rX2hkcihsb25nIHMxLCBsb25nIGMxLCBsb25nIHMyLCBsb25nIGMyLAorCQkgICAgICBjb25zdCBjaGFyICpmdW5jLCBsb25nIGZ1bmNsZW4sIHhkZW1pdGNiX3QgKmVjYikgeworCWludCBuYiA9IDA7CisJbW1idWZmZXJfdCBtYjsKKwljaGFyIGJ1ZlsxMjhdOworCisJbWVtY3B5KGJ1ZiwgIkBAIC0iLCA0KTsKKwluYiArPSA0OworCisJbmIgKz0geGRsX251bV9vdXQoYnVmICsgbmIsIGMxID8gczE6IHMxIC0gMSk7CisKKwlpZiAoYzEgIT0gMSkgeworCQltZW1jcHkoYnVmICsgbmIsICIsIiwgMSk7CisJCW5iICs9IDE7CisKKwkJbmIgKz0geGRsX251bV9vdXQoYnVmICsgbmIsIGMxKTsKKwl9CisKKwltZW1jcHkoYnVmICsgbmIsICIgKyIsIDIpOworCW5iICs9IDI7CisKKwluYiArPSB4ZGxfbnVtX291dChidWYgKyBuYiwgYzIgPyBzMjogczIgLSAxKTsKKworCWlmIChjMiAhPSAxKSB7CisJCW1lbWNweShidWYgKyBuYiwgIiwiLCAxKTsKKwkJbmIgKz0gMTsKKworCQluYiArPSB4ZGxfbnVtX291dChidWYgKyBuYiwgYzIpOworCX0KKworCW1lbWNweShidWYgKyBuYiwgIiBAQCIsIDMpOworCW5iICs9IDM7CisJaWYgKGZ1bmMgJiYgZnVuY2xlbikgeworCQlidWZbbmIrK10gPSAnICc7CisJCWlmIChmdW5jbGVuID4gc2l6ZW9mKGJ1ZikgLSBuYiAtIDEpCisJCQlmdW5jbGVuID0gc2l6ZW9mKGJ1ZikgLSBuYiAtIDE7CisJCW1lbWNweShidWYgKyBuYiwgZnVuYywgZnVuY2xlbik7CisJCW5iICs9IGZ1bmNsZW47CisJfQorCWJ1ZltuYisrXSA9ICdcbic7CisKKwltYi5wdHIgPSBidWY7CisJbWIuc2l6ZSA9IG5iOworCWlmIChlY2ItPm91dGYoZWNiLT5wcml2LCAmbWIsIDEpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS94ZGlmZi94dXRpbHMuaCBiL3hkaWZmL3h1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZGU4MjkKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94dXRpbHMuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogIExpYlhEaWZmIGJ5IERhdmlkZSBMaWJlbnppICggRmlsZSBEaWZmZXJlbnRpYWwgTGlicmFyeSApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzICBEYXZpZGUgTGliZW56aQorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogIERhdmlkZSBMaWJlbnppIDxkYXZpZGVsQHhtYWlsc2VydmVyLm9yZz4KKyAqCisgKi8KKworI2lmICFkZWZpbmVkKFhVVElMU19IKQorI2RlZmluZSBYVVRJTFNfSAorCisKKworbG9uZyB4ZGxfYm9nb3NxcnQobG9uZyBuKTsKK2ludCB4ZGxfZW1pdF9kaWZmcmVjKGNoYXIgY29uc3QgKnJlYywgbG9uZyBzaXplLCBjaGFyIGNvbnN0ICpwcmUsIGxvbmcgcHNpemUsCisJCSAgICAgeGRlbWl0Y2JfdCAqZWNiKTsKK2ludCB4ZGxfY2hhX2luaXQoY2hhc3RvcmVfdCAqY2hhLCBsb25nIGlzaXplLCBsb25nIGljb3VudCk7Cit2b2lkIHhkbF9jaGFfZnJlZShjaGFzdG9yZV90ICpjaGEpOwordm9pZCAqeGRsX2NoYV9hbGxvYyhjaGFzdG9yZV90ICpjaGEpOwordm9pZCAqeGRsX2NoYV9maXJzdChjaGFzdG9yZV90ICpjaGEpOwordm9pZCAqeGRsX2NoYV9uZXh0KGNoYXN0b3JlX3QgKmNoYSk7Citsb25nIHhkbF9ndWVzc19saW5lcyhtbWZpbGVfdCAqbWYpOworaW50IHhkbF9yZWNtYXRjaChjb25zdCBjaGFyICpsMSwgbG9uZyBzMSwgY29uc3QgY2hhciAqbDIsIGxvbmcgczIsIGxvbmcgZmxhZ3MpOwordW5zaWduZWQgbG9uZyB4ZGxfaGFzaF9yZWNvcmQoY2hhciBjb25zdCAqKmRhdGEsIGNoYXIgY29uc3QgKnRvcCwgbG9uZyBmbGFncyk7Cit1bnNpZ25lZCBpbnQgeGRsX2hhc2hiaXRzKHVuc2lnbmVkIGludCBzaXplKTsKK2ludCB4ZGxfbnVtX291dChjaGFyICpvdXQsIGxvbmcgdmFsKTsKK2xvbmcgeGRsX2F0b2woY2hhciBjb25zdCAqc3RyLCBjaGFyIGNvbnN0ICoqbmV4dCk7CitpbnQgeGRsX2VtaXRfaHVua19oZHIobG9uZyBzMSwgbG9uZyBjMSwgbG9uZyBzMiwgbG9uZyBjMiwKKwkJICAgICAgY29uc3QgY2hhciAqZnVuYywgbG9uZyBmdW5jbGVuLCB4ZGVtaXRjYl90ICplY2IpOworCisKKworI2VuZGlmIC8qICNpZiAhZGVmaW5lZChYVVRJTFNfSCkgKi8K